swig-3.0.12/0000775000175000017500000000000013042756671012441 5ustar williamwilliamswig-3.0.12/INSTALL0000664000175000017500000002200513042756442013465 0ustar williamwilliamBasic 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 variables by setting them in the environment. You can do that on the command line like this: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Environment 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 host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it cannot guess the host 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 host 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'. In this case, you should also specify the build platform with `--build=TYPE', because, in this case, it may not be possible to guess the build platform (it sometimes involves compiling and running simple test programs, and this can't be done if the compiler is a cross compiler). 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. Environment 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. swig-3.0.12/Source/0000775000175000017500000000000013042756667013706 5ustar williamwilliamswig-3.0.12/Source/Preprocessor/0000775000175000017500000000000013042756442016363 5ustar williamwilliamswig-3.0.12/Source/Preprocessor/expr.c0000664000175000017500000003032713042756442017512 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * expr.c * * Integer arithmetic expression evaluator used to handle expressions * encountered during preprocessing. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "preprocessor.h" static Scanner *scan = 0; typedef struct { int op; long value; String *svalue; } exprval; #define EXPR_TOP 1 #define EXPR_VALUE 2 #define EXPR_OP 3 #define EXPR_GROUP 4 #define EXPR_UMINUS 100 static exprval stack[256]; /* Parsing stack */ static int sp = 0; /* Stack pointer */ static int prec[256]; /* Precedence rules */ static int expr_init = 0; /* Initialization flag */ static const char *errmsg = 0; /* Parsing error */ /* Initialize the precedence table for various operators. Low values have higher precedence */ static void init_precedence() { prec[SWIG_TOKEN_NOT] = 10; prec[EXPR_UMINUS] = 10; prec[SWIG_TOKEN_STAR] = 20; prec[SWIG_TOKEN_SLASH] = 20; prec[SWIG_TOKEN_PERCENT] = 20; prec[SWIG_TOKEN_PLUS] = 30; prec[SWIG_TOKEN_MINUS] = 30; prec[SWIG_TOKEN_LSHIFT] = 40; prec[SWIG_TOKEN_RSHIFT] = 40; prec[SWIG_TOKEN_AND] = 50; prec[SWIG_TOKEN_XOR] = 60; prec[SWIG_TOKEN_OR] = 70; prec[SWIG_TOKEN_EQUALTO] = 80; prec[SWIG_TOKEN_NOTEQUAL] = 80; prec[SWIG_TOKEN_LESSTHAN] = 80; prec[SWIG_TOKEN_GREATERTHAN] = 80; prec[SWIG_TOKEN_LTEQUAL] = 80; prec[SWIG_TOKEN_GTEQUAL] = 80; prec[SWIG_TOKEN_LNOT] = 90; prec[SWIG_TOKEN_LAND] = 100; prec[SWIG_TOKEN_LOR] = 110; expr_init = 1; } #define UNARY_OP(token) (((token) == SWIG_TOKEN_NOT) || \ ((token) == SWIG_TOKEN_LNOT) || \ ((token) == EXPR_UMINUS)) /* Reduce a single operator on the stack */ /* return 0 on failure, 1 on success */ static int reduce_op() { long op_token = stack[sp - 1].value; assert(sp > 0); assert(stack[sp - 1].op == EXPR_OP); /* do some basic checking first: */ if (stack[sp].op != EXPR_VALUE) { errmsg = "Right-hand side is not value"; return 0; } if (UNARY_OP(op_token)) { if (stack[sp].svalue) { errmsg = "Syntax error: attempt to apply unary operator to string"; return 0; } } else { /* binary operator: */ if (sp == 1) { /* top of stack: don't attempt to use sp-2! */ errmsg = "Missing left-hand side for binary operator"; return 0; } if (stack[sp].op != EXPR_VALUE) { errmsg = "Left-hand side of binary operator is not a value"; return 0; } if ((!stack[sp - 2].svalue) != (!stack[sp].svalue)) { errmsg = "Can't mix strings and integers in expression"; return 0; } } if (stack[sp].svalue) { /* A binary string expression */ switch (stack[sp - 1].value) { case SWIG_TOKEN_EQUALTO: stack[sp - 2].value = (Strcmp(stack[sp - 2].svalue, stack[sp].svalue) == 0); Delete(stack[sp - 2].svalue); Delete(stack[sp].svalue); sp -= 2; break; case SWIG_TOKEN_NOTEQUAL: stack[sp - 2].value = (Strcmp(stack[sp - 2].svalue, stack[sp].svalue) != 0); Delete(stack[sp - 2].svalue); Delete(stack[sp].svalue); sp -= 2; break; default: errmsg = "Syntax error: bad binary operator for strings"; return 0; break; } } else { switch (op_token) { case SWIG_TOKEN_STAR: stack[sp - 2].value = stack[sp - 2].value * stack[sp].value; sp -= 2; break; case SWIG_TOKEN_EQUALTO: stack[sp - 2].value = stack[sp - 2].value == stack[sp].value; sp -= 2; break; case SWIG_TOKEN_NOTEQUAL: stack[sp - 2].value = stack[sp - 2].value != stack[sp].value; sp -= 2; break; case SWIG_TOKEN_PLUS: stack[sp - 2].value = stack[sp - 2].value + stack[sp].value; sp -= 2; break; case SWIG_TOKEN_MINUS: stack[sp - 2].value = stack[sp - 2].value - stack[sp].value; sp -= 2; break; case SWIG_TOKEN_AND: stack[sp - 2].value = stack[sp - 2].value & stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LAND: stack[sp - 2].value = stack[sp - 2].value && stack[sp].value; sp -= 2; break; case SWIG_TOKEN_OR: stack[sp - 2].value = stack[sp - 2].value | stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LOR: stack[sp - 2].value = stack[sp - 2].value || stack[sp].value; sp -= 2; break; case SWIG_TOKEN_XOR: stack[sp - 2].value = stack[sp - 2].value ^ stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LESSTHAN: stack[sp - 2].value = stack[sp - 2].value < stack[sp].value; sp -= 2; break; case SWIG_TOKEN_GREATERTHAN: stack[sp - 2].value = stack[sp - 2].value > stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LTEQUAL: stack[sp - 2].value = stack[sp - 2].value <= stack[sp].value; sp -= 2; break; case SWIG_TOKEN_GTEQUAL: stack[sp - 2].value = stack[sp - 2].value >= stack[sp].value; sp -= 2; break; case SWIG_TOKEN_NOT: stack[sp - 1].value = ~stack[sp].value; sp--; break; case SWIG_TOKEN_LNOT: stack[sp - 1].value = !stack[sp].value; sp--; break; case EXPR_UMINUS: stack[sp - 1].value = -stack[sp].value; sp--; break; case SWIG_TOKEN_SLASH: stack[sp - 2].value = stack[sp - 2].value / stack[sp].value; sp -= 2; break; case SWIG_TOKEN_PERCENT: stack[sp - 2].value = stack[sp - 2].value % stack[sp].value; sp -= 2; break; case SWIG_TOKEN_LSHIFT: stack[sp - 2].value = stack[sp - 2].value << stack[sp].value; sp -= 2; break; case SWIG_TOKEN_RSHIFT: stack[sp - 2].value = stack[sp - 2].value >> stack[sp].value; sp -= 2; break; default: errmsg = "Syntax error: bad operator"; return 0; break; } } stack[sp].op = EXPR_VALUE; stack[sp].svalue = 0; /* ensure it's not a string! */ return 1; } /* ----------------------------------------------------------------------------- * Preprocessor_expr_init() * * Initialize the expression evaluator * ----------------------------------------------------------------------------- */ void Preprocessor_expr_init(void) { if (!expr_init) init_precedence(); if (!scan) scan = NewScanner(); } void Preprocessor_expr_delete(void) { DelScanner(scan); } /* ----------------------------------------------------------------------------- * Tokenizer * ----------------------------------------------------------------------------- */ static int expr_token(Scanner * s) { int t; while (1) { t = Scanner_token(s); if (!((t == SWIG_TOKEN_BACKSLASH) || (t == SWIG_TOKEN_ENDLINE) || (t == SWIG_TOKEN_COMMENT))) break; } return t; } /* ----------------------------------------------------------------------------- * Preprocessor_expr() * * Evaluates an arithmetic expression. Returns the result and sets an error code. * ----------------------------------------------------------------------------- */ int Preprocessor_expr(DOH *s, int *error) { int token = 0; int op = 0; sp = 0; assert(s); assert(scan); Seek(s, 0, SEEK_SET); /* Printf(stdout,"evaluating : '%s'\n", s); */ *error = 0; Scanner_clear(scan); Scanner_push(scan, s); /* Put initial state onto the stack */ stack[sp].op = EXPR_TOP; stack[sp].value = 0; while (1) { /* Look at the top of the stack */ switch (stack[sp].op) { case EXPR_TOP: /* An expression. Can be a number or another expression enclosed in parens */ token = expr_token(scan); if (!token) { errmsg = "Expected an expression"; *error = 1; return 0; } if ((token == SWIG_TOKEN_INT) || (token == SWIG_TOKEN_UINT) || (token == SWIG_TOKEN_LONG) || (token == SWIG_TOKEN_ULONG)) { /* A number. Reduce EXPR_TOP to an EXPR_VALUE */ char *c = Char(Scanner_text(scan)); stack[sp].value = (long) strtol(c, 0, 0); stack[sp].svalue = 0; /* stack[sp].value = (long) atol(Char(Scanner_text(scan))); */ stack[sp].op = EXPR_VALUE; } else if (token == SWIG_TOKEN_PLUS) { } else if ((token == SWIG_TOKEN_MINUS) || (token == SWIG_TOKEN_LNOT) || (token == SWIG_TOKEN_NOT)) { if (token == SWIG_TOKEN_MINUS) token = EXPR_UMINUS; stack[sp].value = token; stack[sp++].op = EXPR_OP; stack[sp].op = EXPR_TOP; stack[sp].svalue = 0; } else if (token == SWIG_TOKEN_LPAREN) { stack[sp++].op = EXPR_GROUP; stack[sp].op = EXPR_TOP; stack[sp].value = 0; stack[sp].svalue = 0; } else if (token == SWIG_TOKEN_ENDLINE) { } else if (token == SWIG_TOKEN_STRING) { stack[sp].svalue = NewString(Scanner_text(scan)); stack[sp].op = EXPR_VALUE; } else if (token == SWIG_TOKEN_ID) { stack[sp].value = 0; stack[sp].svalue = 0; stack[sp].op = EXPR_VALUE; } else goto syntax_error; break; case EXPR_VALUE: /* A value is on the stack. We may reduce or evaluate depending on what the next token is */ token = expr_token(scan); if (!token) { /* End of input. Might have to reduce if an operator is on stack */ while (sp > 0) { if (stack[sp - 1].op == EXPR_OP) { if (!reduce_op()) goto reduce_error; } else if (stack[sp - 1].op == EXPR_GROUP) { errmsg = "Missing \')\'"; *error = 1; return 0; } else goto syntax_error; } return stack[sp].value; } /* Token must be an operator */ switch (token) { case SWIG_TOKEN_STAR: case SWIG_TOKEN_EQUALTO: case SWIG_TOKEN_NOTEQUAL: case SWIG_TOKEN_PLUS: case SWIG_TOKEN_MINUS: case SWIG_TOKEN_AND: case SWIG_TOKEN_LAND: case SWIG_TOKEN_OR: case SWIG_TOKEN_LOR: case SWIG_TOKEN_XOR: case SWIG_TOKEN_LESSTHAN: case SWIG_TOKEN_GREATERTHAN: case SWIG_TOKEN_LTEQUAL: case SWIG_TOKEN_GTEQUAL: case SWIG_TOKEN_SLASH: case SWIG_TOKEN_PERCENT: case SWIG_TOKEN_LSHIFT: case SWIG_TOKEN_RSHIFT: if ((sp == 0) || (stack[sp - 1].op == EXPR_GROUP)) { /* No possibility of reduce. Push operator and expression */ sp++; stack[sp].op = EXPR_OP; stack[sp].value = token; sp++; stack[sp].op = EXPR_TOP; stack[sp].value = 0; } else { if (stack[sp - 1].op != EXPR_OP) goto syntax_error_expected_operator; op = stack[sp - 1].value; /* Previous operator */ /* Now, depending on the precedence relationship between the last operator and the current we will reduce or push */ if (prec[op] <= prec[token]) { /* Reduce the previous operator */ if (!reduce_op()) goto reduce_error; } sp++; stack[sp].op = EXPR_OP; stack[sp].value = token; sp++; stack[sp].op = EXPR_TOP; stack[sp].value = 0; } break; case SWIG_TOKEN_RPAREN: if (sp == 0) goto extra_rparen; /* Might have to reduce operators first */ while ((sp > 0) && (stack[sp - 1].op == EXPR_OP)) { if (!reduce_op()) goto reduce_error; } if ((sp == 0) || (stack[sp - 1].op != EXPR_GROUP)) goto extra_rparen; stack[sp - 1].op = EXPR_VALUE; stack[sp - 1].value = stack[sp].value; sp--; break; default: goto syntax_error_expected_operator; break; } break; default: fprintf(stderr, "Internal error in expression evaluator.\n"); abort(); } } syntax_error: errmsg = "Syntax error"; *error = 1; return 0; syntax_error_expected_operator: errmsg = "Syntax error: expected operator"; *error = 1; return 0; reduce_error: /* errmsg has been set by reduce_op */ *error = 1; return 0; extra_rparen: errmsg = "Extra \')\'"; *error = 1; return 0; } /* ----------------------------------------------------------------------------- * Preprocessor_expr_error() * * Return error message set by the evaluator (if any) * ----------------------------------------------------------------------------- */ const char *Preprocessor_expr_error() { return errmsg; } swig-3.0.12/Source/Preprocessor/preprocessor.h0000664000175000017500000000273313042756442021267 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * preprocessor.h * * SWIG preprocessor module. * ----------------------------------------------------------------------------- */ #ifndef SWIG_PREPROCESSOR_H_ #define SWIG_PREPROCESSOR_H_ #include "swigwarn.h" #ifdef __cplusplus extern "C" { #endif extern int Preprocessor_expr(String *s, int *error); extern const char *Preprocessor_expr_error(void); extern Hash *Preprocessor_define(const_String_or_char_ptr str, int swigmacro); extern void Preprocessor_undef(const_String_or_char_ptr name); extern void Preprocessor_init(void); extern void Preprocessor_delete(void); extern String *Preprocessor_parse(String *s); extern void Preprocessor_include_all(int); extern void Preprocessor_import_all(int); extern void Preprocessor_ignore_missing(int); extern void Preprocessor_error_as_warning(int); extern List *Preprocessor_depend(void); extern void Preprocessor_expr_init(void); extern void Preprocessor_expr_delete(void); #ifdef __cplusplus } #endif #endif swig-3.0.12/Source/Preprocessor/cpp.c0000664000175000017500000014564013042756442017323 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cpp.c * * An implementation of a C preprocessor plus some support for additional * SWIG directives. * * - SWIG directives such as %include, %extern, and %import are handled * - A new macro %define ... %enddef can be used for multiline macros * - No preprocessing is performed in %{ ... %} blocks * - Lines beginning with %# are stripped down to #... and passed through. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "preprocessor.h" #include static Hash *cpp = 0; /* C preprocessor data */ static int include_all = 0; /* Follow all includes */ static int ignore_missing = 0; static int import_all = 0; /* Follow all includes, but as %import statements */ static int imported_depth = 0; /* Depth of %imported files */ static int single_include = 1; /* Only include each file once */ static Hash *included_files = 0; static List *dependencies = 0; static Scanner *id_scan = 0; static int error_as_warning = 0; /* Understand the cpp #error directive as a special #warning */ static int expand_defined_operator = 0; static int macro_level = 0; static int macro_start_line = 0; static const String * macro_start_file = 0; /* Test a character to see if it starts an identifier */ #define isidentifier(c) ((isalpha(c)) || (c == '_') || (c == '$')) /* Test a character to see if it valid in an identifier (after the first letter) */ #define isidchar(c) ((isalnum(c)) || (c == '_') || (c == '$')) static DOH *Preprocessor_replace(DOH *); /* Skip whitespace */ static void skip_whitespace(String *s, String *out) { int c; while ((c = Getc(s)) != EOF) { if (!isspace(c)) { Ungetc(c, s); break; } else if (out) Putc(c, out); } } /* Skip to a specified character taking line breaks into account */ static int skip_tochar(String *s, int ch, String *out) { int c; while ((c = Getc(s)) != EOF) { if (out) Putc(c, out); if (c == ch) break; if (c == '\\') { c = Getc(s); if ((c != EOF) && (out)) Putc(c, out); } } if (c == EOF) return -1; return 0; } static void copy_location(const DOH *s1, DOH *s2) { Setfile(s2, Getfile((DOH *) s1)); Setline(s2, Getline((DOH *) s1)); } static String *cpp_include(const_String_or_char_ptr fn, int sysfile) { String *s = sysfile ? Swig_include_sys(fn) : Swig_include(fn); if (s && single_include) { String *file = Getfile(s); if (Getattr(included_files, file)) { Delete(s); return 0; } Setattr(included_files, file, file); } if (!s) { if (ignore_missing) { Swig_warning(WARN_PP_MISSING_FILE, Getfile(fn), Getline(fn), "Unable to find '%s'\n", fn); } else { Swig_error(Getfile(fn), Getline(fn), "Unable to find '%s'\n", fn); } } else { String *lf; Seek(s, 0, SEEK_SET); if (!dependencies) { dependencies = NewList(); } lf = Copy(Swig_last_file()); Append(dependencies, lf); Delete(lf); } return s; } List *Preprocessor_depend(void) { return dependencies; } /* ----------------------------------------------------------------------------- * void Preprocessor_cpp_init() - Initialize the preprocessor * ----------------------------------------------------------------------------- */ static String *kpp_args = 0; static String *kpp_define = 0; static String *kpp_defined = 0; static String *kpp_elif = 0; static String *kpp_else = 0; static String *kpp_endif = 0; static String *kpp_expanded = 0; static String *kpp_if = 0; static String *kpp_ifdef = 0; static String *kpp_ifndef = 0; static String *kpp_name = 0; static String *kpp_swigmacro = 0; static String *kpp_symbols = 0; static String *kpp_undef = 0; static String *kpp_value = 0; static String *kpp_varargs = 0; static String *kpp_error = 0; static String *kpp_warning = 0; static String *kpp_line = 0; static String *kpp_include = 0; static String *kpp_pragma = 0; static String *kpp_level = 0; static String *kpp_dline = 0; static String *kpp_ddefine = 0; static String *kpp_dinclude = 0; static String *kpp_dimport = 0; static String *kpp_dbeginfile = 0; static String *kpp_dextern = 0; static String *kpp_LINE = 0; static String *kpp_FILE = 0; static String *kpp_hash_if = 0; static String *kpp_hash_elif = 0; void Preprocessor_init(void) { Hash *s; kpp_args = NewString("args"); kpp_define = NewString("define"); kpp_defined = NewString("defined"); kpp_else = NewString("else"); kpp_elif = NewString("elif"); kpp_endif = NewString("endif"); kpp_expanded = NewString("*expanded*"); kpp_if = NewString("if"); kpp_ifdef = NewString("ifdef"); kpp_ifndef = NewString("ifndef"); kpp_name = NewString("name"); kpp_swigmacro = NewString("swigmacro"); kpp_symbols = NewString("symbols"); kpp_undef = NewString("undef"); kpp_value = NewString("value"); kpp_error = NewString("error"); kpp_warning = NewString("warning"); kpp_pragma = NewString("pragma"); kpp_level = NewString("level"); kpp_line = NewString("line"); kpp_include = NewString("include"); kpp_varargs = NewString("varargs"); kpp_dinclude = NewString("%include"); kpp_dimport = NewString("%import"); kpp_dbeginfile = NewString("%beginfile"); kpp_dextern = NewString("%extern"); kpp_ddefine = NewString("%define"); kpp_dline = NewString("%line"); kpp_LINE = NewString("__LINE__"); kpp_FILE = NewString("__FILE__"); kpp_hash_if = NewString("#if"); kpp_hash_elif = NewString("#elif"); cpp = NewHash(); s = NewHash(); Setattr(cpp, kpp_symbols, s); Delete(s); Preprocessor_expr_init(); /* Initialize the expression evaluator */ included_files = NewHash(); id_scan = NewScanner(); } void Preprocessor_delete(void) { Delete(kpp_args); Delete(kpp_define); Delete(kpp_defined); Delete(kpp_else); Delete(kpp_elif); Delete(kpp_endif); Delete(kpp_expanded); Delete(kpp_if); Delete(kpp_ifdef); Delete(kpp_ifndef); Delete(kpp_name); Delete(kpp_swigmacro); Delete(kpp_symbols); Delete(kpp_undef); Delete(kpp_value); Delete(kpp_error); Delete(kpp_warning); Delete(kpp_pragma); Delete(kpp_level); Delete(kpp_line); Delete(kpp_include); Delete(kpp_varargs); Delete(kpp_dinclude); Delete(kpp_dimport); Delete(kpp_dbeginfile); Delete(kpp_dextern); Delete(kpp_ddefine); Delete(kpp_dline); Delete(kpp_LINE); Delete(kpp_FILE); Delete(kpp_hash_if); Delete(kpp_hash_elif); Delete(cpp); Delete(included_files); Preprocessor_expr_delete(); DelScanner(id_scan); Delete(dependencies); Delete(Swig_add_directory(0)); } /* ----------------------------------------------------------------------------- * void Preprocessor_include_all() - Instruct preprocessor to include all files * ----------------------------------------------------------------------------- */ void Preprocessor_include_all(int a) { include_all = a; } void Preprocessor_import_all(int a) { import_all = a; } void Preprocessor_ignore_missing(int a) { ignore_missing = a; } void Preprocessor_error_as_warning(int a) { error_as_warning = a; } /* ----------------------------------------------------------------------------- * Preprocessor_define() * * Defines a new C preprocessor symbol. swigmacro specifies whether or not the macro has * SWIG macro semantics. * ----------------------------------------------------------------------------- */ String *Macro_vararg_name(const_String_or_char_ptr str, const_String_or_char_ptr line) { String *argname; String *varargname; char *s, *dots; argname = Copy(str); s = Char(argname); dots = strchr(s, '.'); if (!dots) { Delete(argname); return NULL; } if (strcmp(dots, "...") != 0) { Swig_error(Getfile(line), Getline(line), "Illegal macro argument name '%s'\n", str); Delete(argname); return NULL; } if (dots == s) { varargname = NewString("__VA_ARGS__"); } else { *dots = '\0'; varargname = NewString(s); } Delete(argname); return varargname; } Hash *Preprocessor_define(const_String_or_char_ptr _str, int swigmacro) { String *macroname = 0, *argstr = 0, *macrovalue = 0, *file = 0, *s = 0; Hash *macro = 0, *symbols = 0, *m1; List *arglist = 0; int c, line; int varargs = 0; String *str; assert(cpp); assert(_str); /* First make sure that string is actually a string */ if (DohCheck(_str)) { s = Copy(_str); copy_location(_str, s); str = s; } else { str = NewString((char *) _str); } Seek(str, 0, SEEK_SET); line = Getline(str); file = Getfile(str); /* Skip over any leading whitespace */ skip_whitespace(str, 0); /* Now look for a macro name */ macroname = NewStringEmpty(); copy_location(str, macroname); while ((c = Getc(str)) != EOF) { if (c == '(') { argstr = NewStringEmpty(); copy_location(str, argstr); /* It is a macro. Go extract its argument string */ while ((c = Getc(str)) != EOF) { if (c == ')') break; else Putc(c, argstr); } if (c != ')') { Swig_error(Getfile(argstr), Getline(argstr), "Missing \')\' in macro parameters\n"); goto macro_error; } break; } else if (isidchar(c) || (c == '%')) { Putc(c, macroname); } else if (isspace(c)) { break; } else if (c == '\\') { c = Getc(str); if (c != '\n') { Ungetc(c, str); Ungetc('\\', str); break; } } else { Ungetc(c, str); break; } } if (!swigmacro) skip_whitespace(str, 0); macrovalue = NewStringEmpty(); copy_location(str, macrovalue); while ((c = Getc(str)) != EOF) { Putc(c, macrovalue); } /* If there are any macro arguments, convert into a list */ if (argstr) { String *argname, *varargname; arglist = NewList(); Seek(argstr, 0, SEEK_SET); argname = NewStringEmpty(); while ((c = Getc(argstr)) != EOF) { if (c == ',') { varargname = Macro_vararg_name(argname, argstr); if (varargname) { Delete(varargname); Swig_error(Getfile(argstr), Getline(argstr), "Variable length macro argument must be last parameter\n"); } else { Append(arglist, argname); } Delete(argname); argname = NewStringEmpty(); } else if (isidchar(c) || (c == '.')) { Putc(c, argname); } else if (!(isspace(c) || (c == '\\'))) { Delete(argname); Swig_error(Getfile(argstr), Getline(argstr), "Illegal character in macro argument name\n"); goto macro_error; } } if (Len(argname)) { /* Check for varargs */ varargname = Macro_vararg_name(argname, argstr); if (varargname) { Append(arglist, varargname); Delete(varargname); varargs = 1; } else { Append(arglist, argname); } } Delete(argname); } if (!swigmacro) { Replace(macrovalue, "\\\n", " ", DOH_REPLACE_NOQUOTE); } /* Look for special # substitutions. We only consider # that appears outside of quotes and comments */ { int state = 0; char *cc = Char(macrovalue); while (*cc) { switch (state) { case 0: if (*cc == '#') *cc = '\001'; else if (*cc == '/') state = 10; else if (*cc == '\'') state = 20; else if (*cc == '\"') state = 30; break; case 10: if (*cc == '*') state = 11; else if (*cc == '/') state = 15; else { state = 0; cc--; } break; case 11: if (*cc == '*') state = 12; break; case 12: if (*cc == '/') state = 0; else if (*cc != '*') state = 11; break; case 15: if (*cc == '\n') state = 0; break; case 20: if (*cc == '\'') state = 0; if (*cc == '\\') state = 21; break; case 21: state = 20; break; case 30: if (*cc == '\"') state = 0; if (*cc == '\\') state = 31; break; case 31: state = 30; break; default: break; } cc++; } } /* Get rid of whitespace surrounding # */ /* Replace(macrovalue,"#","\001",DOH_REPLACE_NOQUOTE); */ while (strstr(Char(macrovalue), "\001 ")) { Replace(macrovalue, "\001 ", "\001", DOH_REPLACE_ANY); } while (strstr(Char(macrovalue), " \001")) { Replace(macrovalue, " \001", "\001", DOH_REPLACE_ANY); } /* Replace '##' with a special token */ Replace(macrovalue, "\001\001", "\002", DOH_REPLACE_ANY); /* Replace '#@' with a special token */ Replace(macrovalue, "\001@", "\004", DOH_REPLACE_ANY); /* Replace '##@' with a special token */ Replace(macrovalue, "\002@", "\005", DOH_REPLACE_ANY); /* Go create the macro */ macro = NewHash(); Setattr(macro, kpp_name, macroname); if (arglist) { Setattr(macro, kpp_args, arglist); Delete(arglist); if (varargs) { Setattr(macro, kpp_varargs, "1"); } } Setattr(macro, kpp_value, macrovalue); Setline(macro, line); Setfile(macro, file); if (swigmacro) { Setattr(macro, kpp_swigmacro, "1"); } symbols = Getattr(cpp, kpp_symbols); if ((m1 = Getattr(symbols, macroname))) { if (!Checkattr(m1, kpp_value, macrovalue)) { Swig_error(Getfile(macroname), Getline(macroname), "Macro '%s' redefined,\n", macroname); Swig_error(Getfile(m1), Getline(m1), "previous definition of '%s'.\n", macroname); goto macro_error; } } else { Setattr(symbols, macroname, macro); Delete(macro); } Delete(macroname); Delete(macrovalue); Delete(str); Delete(argstr); return macro; macro_error: Delete(str); Delete(argstr); Delete(arglist); Delete(macroname); Delete(macrovalue); return 0; } /* ----------------------------------------------------------------------------- * Preprocessor_undef() * * Undefines a macro. * ----------------------------------------------------------------------------- */ void Preprocessor_undef(const_String_or_char_ptr str) { Hash *symbols; assert(cpp); symbols = Getattr(cpp, kpp_symbols); Delattr(symbols, str); } /* ----------------------------------------------------------------------------- * find_args() * * Isolates macro arguments and returns them in a list. For each argument, * leading and trailing whitespace is stripped (ala K&R, pg. 230). * ----------------------------------------------------------------------------- */ static List *find_args(String *s, int ismacro, String *macro_name) { List *args; String *str; int c, level; long pos; /* Create a new list */ args = NewList(); copy_location(s, args); /* First look for a '(' */ pos = Tell(s); skip_whitespace(s, 0); /* Now see if the next character is a '(' */ c = Getc(s); if (c != '(') { /* Not a macro, bail out now! */ assert(pos != -1); (void)Seek(s, pos, SEEK_SET); Delete(args); return 0; } c = Getc(s); /* Okay. This appears to be a macro so we will start isolating arguments */ while (c != EOF) { if (isspace(c)) { skip_whitespace(s, 0); /* Skip leading whitespace */ c = Getc(s); } str = NewStringEmpty(); copy_location(s, str); level = 0; while (c != EOF) { if (c == '\"') { Putc(c, str); skip_tochar(s, '\"', str); c = Getc(s); continue; } else if (c == '\'') { Putc(c, str); skip_tochar(s, '\'', str); c = Getc(s); continue; } if ((c == ',') && (level == 0)) break; if ((c == ')') && (level == 0)) break; Putc(c, str); if (c == '(') level++; if (c == ')') level--; c = Getc(s); } if (level > 0) { goto unterm; } Chop(str); if (Len(args) || Len(str)) Append(args, str); Delete(str); /* if (Len(str) && (c != ')')) Append(args,str); */ if (c == ')') return args; c = Getc(s); } unterm: if (ismacro) Swig_error(Getfile(args), Getline(args), "Unterminated call invoking macro '%s'\n", macro_name); else Swig_error(Getfile(args), Getline(args), "Unterminated call to '%s'\n", macro_name); return args; } /* ----------------------------------------------------------------------------- * DOH *get_filename() * * Read a filename from str. A filename can be enclosed in quotes, angle brackets, * or bare. * ----------------------------------------------------------------------------- */ static String *get_filename(String *str, int *sysfile) { String *fn; int c; fn = NewStringEmpty(); copy_location(str, fn); c = Getc(str); *sysfile = 0; if (c == '\"') { while (((c = Getc(str)) != EOF) && (c != '\"')) Putc(c, fn); } else if (c == '<') { *sysfile = 1; while (((c = Getc(str)) != EOF) && (c != '>')) Putc(c, fn); } else { String *preprocessed_str; Putc(c, fn); while (((c = Getc(str)) != EOF) && (!isspace(c))) Putc(c, fn); if (isspace(c)) Ungetc(c, str); preprocessed_str = Preprocessor_replace(fn); Seek(preprocessed_str, 0, SEEK_SET); Delete(fn); fn = NewStringEmpty(); copy_location(preprocessed_str, fn); c = Getc(preprocessed_str); if (c == '\"') { while (((c = Getc(preprocessed_str)) != EOF) && (c != '\"')) Putc(c, fn); } else if (c == '<') { *sysfile = 1; while (((c = Getc(preprocessed_str)) != EOF) && (c != '>')) Putc(c, fn); } else { fn = Copy(preprocessed_str); } Delete(preprocessed_str); } Swig_filename_unescape(fn); Swig_filename_correct(fn); Seek(fn, 0, SEEK_SET); return fn; } static String *get_options(String *str) { int c; c = Getc(str); if (c == '(') { String *opt; int level = 1; opt = NewString("("); while (((c = Getc(str)) != EOF)) { Putc(c, opt); if (c == ')') { level--; if (!level) return opt; } if (c == '(') level++; } Delete(opt); return 0; } else { Ungetc(c, str); return 0; } } /* ----------------------------------------------------------------------------- * expand_macro() * * Perform macro expansion and return a new string. Returns NULL if some sort * of error occurred. * name - name of the macro * args - arguments passed to the macro * line_file - only used for line/file name when reporting errors * ----------------------------------------------------------------------------- */ static String *expand_macro(String *name, List *args, String *line_file) { String *ns; DOH *symbols, *macro, *margs, *mvalue, *temp, *tempa, *e; int i, l; int isvarargs = 0; symbols = Getattr(cpp, kpp_symbols); if (!symbols) return 0; /* See if the name is actually defined */ macro = Getattr(symbols, name); if (!macro) return 0; if (macro_level == 0) { /* Store the start of the macro should the macro contain __LINE__ and __FILE__ for expansion */ macro_start_line = Getline(args ? args : line_file); macro_start_file = Getfile(args ? args : line_file); } macro_level++; if (Getattr(macro, kpp_expanded)) { ns = NewStringEmpty(); Append(ns, name); if (args) { int lenargs = Len(args); if (lenargs) Putc('(', ns); for (i = 0; i < lenargs; i++) { Append(ns, Getitem(args, i)); if (i < (lenargs - 1)) Putc(',', ns); } if (i) Putc(')', ns); } macro_level--; return ns; } /* Get macro arguments and value */ mvalue = Getattr(macro, kpp_value); assert(mvalue); margs = Getattr(macro, kpp_args); if (args && Getattr(macro, kpp_varargs)) { isvarargs = 1; /* Variable length argument macro. We need to collect all of the extra arguments into a single argument */ if (Len(args) >= (Len(margs) - 1)) { int i; int vi, na; String *vararg = NewStringEmpty(); vi = Len(margs) - 1; na = Len(args); for (i = vi; i < na; i++) { Append(vararg, Getitem(args, i)); if ((i + 1) < na) { Append(vararg, ","); } } /* Remove arguments */ for (i = vi; i < na; i++) { Delitem(args, vi); } Append(args, vararg); Delete(vararg); } } /* If there are arguments, see if they match what we were given */ if (args && (margs) && (Len(margs) != Len(args))) { if (Len(margs) > (1 + isvarargs)) Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects %d arguments\n", name, Len(margs) - isvarargs); else if (Len(margs) == (1 + isvarargs)) Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects 1 argument\n", name); else Swig_error(macro_start_file, macro_start_line, "Macro '%s' expects no arguments\n", name); macro_level--; return 0; } /* If the macro expects arguments, but none were supplied, we leave it in place */ if (!args && (margs) && Len(margs) > 0) { macro_level--; return NewString(name); } /* Copy the macro value */ ns = Copy(mvalue); copy_location(mvalue, ns); /* Tag the macro as being expanded. This is to avoid recursion in macro expansion */ temp = NewStringEmpty(); tempa = NewStringEmpty(); if (args && margs) { l = Len(margs); for (i = 0; i < l; i++) { DOH *arg, *aname; String *reparg; arg = Getitem(args, i); /* Get an argument value */ reparg = Preprocessor_replace(arg); aname = Getitem(margs, i); /* Get macro argument name */ if (strstr(Char(ns), "\001")) { /* Try to replace a quoted version of the argument */ Clear(temp); Clear(tempa); Printf(temp, "\001%s", aname); Printf(tempa, "\"%s\"", arg); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); } if (strstr(Char(ns), "\002")) { /* Look for concatenation tokens */ Clear(temp); Clear(tempa); Printf(temp, "\002%s", aname); Append(tempa, "\002\003"); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); Clear(temp); Clear(tempa); Printf(temp, "%s\002", aname); Append(tempa, "\003\002"); Replace(ns, temp, tempa, DOH_REPLACE_ID_BEGIN); } /* Non-standard macro expansion. The value `x` is replaced by a quoted version of the argument except that if the argument is already quoted nothing happens */ if (strchr(Char(ns), '`')) { String *rep; char *c; Clear(temp); Printf(temp, "`%s`", aname); c = Char(arg); if (*c == '\"') { rep = arg; } else { Clear(tempa); Printf(tempa, "\"%s\"", arg); rep = tempa; } Replace(ns, temp, rep, DOH_REPLACE_ANY); } /* Non-standard mangle expansions. The #@Name is replaced by mangle_arg(Name). */ if (strstr(Char(ns), "\004")) { String *marg = Swig_string_mangle(arg); Clear(temp); Printf(temp, "\004%s", aname); Replace(ns, temp, marg, DOH_REPLACE_ID_END); Delete(marg); } if (strstr(Char(ns), "\005")) { String *marg = Swig_string_mangle(arg); Clear(temp); Clear(tempa); Printf(temp, "\005%s", aname); Printf(tempa, "\"%s\"", marg); Replace(ns, temp, tempa, DOH_REPLACE_ID_END); Delete(marg); } if (isvarargs && i == l - 1 && Len(arg) == 0) { /* Zero length varargs macro argument. We search for commas that might appear before and nuke them */ char *a, *s, *t, *name; int namelen; s = Char(ns); name = Char(aname); namelen = Len(aname); a = strstr(s, name); while (a) { char ca = a[namelen + 1]; if (!isidchar((int) ca)) { /* Matched the entire vararg name, not just a prefix */ t = a - 1; if (*t == '\002') { t--; while (t >= s) { if (isspace((int) *t)) t--; else if (*t == ',') { *t = ' '; } else break; } } } a = strstr(a + namelen, name); } } /* Replace(ns, aname, arg, DOH_REPLACE_ID); */ Replace(ns, aname, reparg, DOH_REPLACE_ID); /* Replace expanded args */ Replace(ns, "\003", arg, DOH_REPLACE_ANY); /* Replace unexpanded arg */ Delete(reparg); } } Replace(ns, "\002", "", DOH_REPLACE_ANY); /* Get rid of concatenation tokens */ Replace(ns, "\001", "#", DOH_REPLACE_ANY); /* Put # back (non-standard C) */ Replace(ns, "\004", "#@", DOH_REPLACE_ANY); /* Put # back (non-standard C) */ /* Expand this macro even further */ Setattr(macro, kpp_expanded, "1"); e = Preprocessor_replace(ns); Delattr(macro, kpp_expanded); Delete(ns); if (Getattr(macro, kpp_swigmacro)) { String *g; String *f = NewStringEmpty(); Seek(e, 0, SEEK_SET); copy_location(macro, e); g = Preprocessor_parse(e); #if 0 /* Drop the macro in place, but with a marker around it */ Printf(f, "/*@%s,%d,%s@*/%s/*@@*/", Getfile(macro), Getline(macro), name, g); #else /* Use simplified around markers to properly count lines in cscanner.c */ if (strchr(Char(g), '\n')) { Printf(f, "/*@SWIG:%s,%d,%s@*/%s/*@SWIG@*/", Getfile(macro), Getline(macro), name, g); #if 0 Printf(f, "/*@SWIG:%s@*/%s/*@SWIG@*/", name, g); #endif } else { Append(f, g); } #endif Delete(g); Delete(e); e = f; } macro_level--; Delete(temp); Delete(tempa); return e; } /* ----------------------------------------------------------------------------- * DOH *Preprocessor_replace(DOH *s) * * Performs a macro substitution on a string s. Returns a new string with * substitutions applied. This function works by walking down s and looking * for identifiers. When found, a check is made to see if they are macros * which are then expanded. * ----------------------------------------------------------------------------- */ /* #define SWIG_PUT_BUFF */ static DOH *Preprocessor_replace(DOH *s) { DOH *ns, *symbols, *m; int c, i, state = 0; String *id = NewStringEmpty(); assert(cpp); symbols = Getattr(cpp, kpp_symbols); ns = NewStringEmpty(); copy_location(s, ns); Seek(s, 0, SEEK_SET); /* Try to locate identifiers in s and replace them with macro replacements */ while ((c = Getc(s)) != EOF) { switch (state) { case 0: if (isidentifier(c)) { Clear(id); Putc(c, id); state = 4; } else if (c == '%') { Clear(id); Putc(c, id); state = 2; } else if (c == '#') { Clear(id); Putc(c, id); state = 4; } else if (c == '\"') { Putc(c, ns); skip_tochar(s, '\"', ns); } else if (c == '\'') { Putc(c, ns); skip_tochar(s, '\'', ns); } else if (c == '/') { Putc(c, ns); state = 10; } else if (c == '\\') { Putc(c, ns); c = Getc(s); if (c == '\n') { Putc(c, ns); } else { Ungetc(c, s); } } else if (c == '\n') { Putc(c, ns); expand_defined_operator = 0; } else { Putc(c, ns); } break; case 2: /* Found '%#' */ if (c == '#') { Putc(c, id); state = 4; } else { Ungetc(c, s); state = 4; } break; case 4: /* An identifier */ if (isidchar(c)) { Putc(c, id); state = 4; } else { /* We found the end of a valid identifier */ Ungetc(c, s); /* See if this is the special "defined" operator */ if (Equal(kpp_defined, id)) { if (expand_defined_operator) { int lenargs = 0; DOH *args = 0; /* See whether or not a parenthesis has been used */ skip_whitespace(s, 0); c = Getc(s); if (c == '(') { Ungetc(c, s); args = find_args(s, 0, kpp_defined); } else if (isidchar(c)) { DOH *arg = NewStringEmpty(); args = NewList(); Putc(c, arg); while (((c = Getc(s)) != EOF)) { if (!isidchar(c)) { Ungetc(c, s); break; } Putc(c, arg); } if (Len(arg)) Append(args, arg); Delete(arg); } else { Seek(s, -1, SEEK_CUR); } lenargs = Len(args); if ((!args) || (!lenargs)) { /* This is not a defined() operator. */ Append(ns, id); state = 0; break; } for (i = 0; i < lenargs; i++) { DOH *o = Getitem(args, i); if (!Getattr(symbols, o)) { break; } } if (i < lenargs) Putc('0', ns); else Putc('1', ns); Delete(args); } else { Append(ns, id); } state = 0; break; } else if (Equal(kpp_LINE, id)) { Printf(ns, "%d", macro_level > 0 ? macro_start_line : Getline(s)); state = 0; break; } else if (Equal(kpp_FILE, id)) { String *fn = Copy(macro_level > 0 ? macro_start_file : Getfile(s)); Replaceall(fn, "\\", "\\\\"); Printf(ns, "\"%s\"", fn); Delete(fn); state = 0; break; } else if (Equal(kpp_hash_if, id) || Equal(kpp_hash_elif, id)) { expand_defined_operator = 1; Append(ns, id); /* } else if (Equal("%#if", id) || Equal("%#ifdef", id)) { Swig_warning(998, Getfile(s), Getline(s), "Found: %s preprocessor directive.\n", id); Append(ns, id); } else if (Equal("#ifdef", id) || Equal("#ifndef", id)) { Swig_warning(998, Getfile(s), Getline(s), "The %s preprocessor directive does not work in macros, try #if instead.\n", id); Append(ns, id); */ } else if ((m = Getattr(symbols, id))) { /* See if the macro is defined in the preprocessor symbol table */ DOH *args = 0; DOH *e; int macro_additional_lines = 0; /* See if the macro expects arguments */ if (Getattr(m, kpp_args)) { /* Yep. We need to go find the arguments and do a substitution */ int line = Getline(s); args = find_args(s, 1, id); macro_additional_lines = Getline(s) - line; assert(macro_additional_lines >= 0); if (!Len(args)) { Delete(args); args = 0; } } else { args = 0; } e = expand_macro(id, args, s); if (e) { Append(ns, e); } while (macro_additional_lines--) { Putc('\n', ns); } Delete(e); Delete(args); } else { Append(ns, id); } state = 0; } break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else { Ungetc(c, s); state = 0; break; } Putc(c, ns); break; case 11: /* in C++ comment */ Putc(c, ns); if (c == '\n') { expand_defined_operator = 0; state = 0; } break; case 12: /* in C comment */ Putc(c, ns); if (c == '*') state = 13; break; case 13: Putc(c, ns); if (c == '/') state = 0; else if (c != '*') state = 12; break; default: state = 0; break; } } /* Identifier at the end */ if (state == 2 || state == 4) { /* See if this is the special "defined" operator */ if (Equal(kpp_defined, id)) { Swig_error(Getfile(s), Getline(s), "No arguments given to defined()\n"); } else if (Equal(kpp_LINE, id)) { Printf(ns, "%d", macro_level > 0 ? macro_start_line : Getline(s)); } else if (Equal(kpp_FILE, id)) { String *fn = Copy(macro_level > 0 ? macro_start_file : Getfile(s)); Replaceall(fn, "\\", "\\\\"); Printf(ns, "\"%s\"", fn); Delete(fn); } else if (Getattr(symbols, id)) { DOH *e; /* Yes. There is a macro here */ /* See if the macro expects arguments */ e = expand_macro(id, 0, s); if (e) Append(ns, e); Delete(e); } else { Append(ns, id); } } Delete(id); return ns; } /* ----------------------------------------------------------------------------- * int checkpp_id(DOH *s) * * Checks the string s to see if it contains any unresolved identifiers. This * function contains the heuristic that determines whether or not a macro * definition passes through the preprocessor as a constant declaration. * ----------------------------------------------------------------------------- */ static int checkpp_id(DOH *s) { int c; int hastok = 0; Scanner *scan = id_scan; Seek(s, 0, SEEK_SET); Scanner_clear(scan); s = Copy(s); Seek(s, SEEK_SET, 0); Scanner_push(scan, s); while ((c = Scanner_token(scan))) { hastok = 1; if ((c == SWIG_TOKEN_ID) || (c == SWIG_TOKEN_LBRACE) || (c == SWIG_TOKEN_RBRACE)) return 1; } if (!hastok) return 1; return 0; } /* addline(). Utility function for adding lines to a chunk */ static void addline(DOH *s1, DOH *s2, int allow) { if (allow) { Append(s1, s2); } else { char *c = Char(s2); while (*c) { if (*c == '\n') Putc('\n', s1); c++; } } } static void add_chunk(DOH *ns, DOH *chunk, int allow) { DOH *echunk; Seek(chunk, 0, SEEK_SET); if (allow) { echunk = Preprocessor_replace(chunk); addline(ns, echunk, allow); Delete(echunk); } else { addline(ns, chunk, 0); } Clear(chunk); } /* push/pop_imported(): helper functions for defining and undefining SWIGIMPORTED (when %importing a file). */ static void push_imported() { if (imported_depth == 0) { Preprocessor_define("SWIGIMPORTED 1", 0); } ++imported_depth; } static void pop_imported() { --imported_depth; if (imported_depth == 0) { Preprocessor_undef("SWIGIMPORTED"); } } /* ----------------------------------------------------------------------------- * Preprocessor_parse() * * Parses the string s. Returns a new string containing the preprocessed version. * * Parsing rules : * 1. Lines starting with # are C preprocessor directives * 2. Macro expansion inside strings is not allowed * 3. All code inside false conditionals is changed to blank lines * 4. Code in %{, %} is not parsed because it may need to be * included inline (with all preprocessor directives included). * ----------------------------------------------------------------------------- */ String *Preprocessor_parse(String *s) { String *ns; /* New string containing the preprocessed text */ String *chunk, *decl; Hash *symbols; String *id = 0, *value = 0, *comment = 0; int i, state, e, c; int start_line = 0; int allow = 1; int level = 0; int dlevel = 0; int filelevel = 0; int mask = 0; int start_level = 0; int cpp_lines = 0; int cond_lines[256]; /* Blow away all carriage returns */ Replace(s, "\015", "", DOH_REPLACE_ANY); ns = NewStringEmpty(); /* Return result */ decl = NewStringEmpty(); id = NewStringEmpty(); value = NewStringEmpty(); comment = NewStringEmpty(); chunk = NewStringEmpty(); copy_location(s, chunk); copy_location(s, ns); symbols = Getattr(cpp, kpp_symbols); state = 0; while ((c = Getc(s)) != EOF) { switch (state) { case 0: /* Initial state - in first column */ /* Look for C preprocessor directives. Otherwise, go directly to state 1 */ if (c == '#') { copy_location(s, chunk); add_chunk(ns, chunk, allow); cpp_lines = 1; state = 40; } else if (isspace(c)) { Putc(c, chunk); skip_whitespace(s, chunk); } else { state = 1; Ungetc(c, s); } break; case 1: /* Non-preprocessor directive */ /* Look for SWIG directives */ if (c == '%') { state = 100; break; } Putc(c, chunk); if (c == '\n') state = 0; else if (c == '\"') { start_line = Getline(s); if (skip_tochar(s, '\"', chunk) < 0) { Swig_error(Getfile(s), start_line, "Unterminated string constant\n"); } } else if (c == '\'') { start_line = Getline(s); if (skip_tochar(s, '\'', chunk) < 0) { Swig_error(Getfile(s), start_line, "Unterminated character constant\n"); } } else if (c == '/') state = 30; /* Comment */ break; case 30: /* Possibly a comment string of some sort */ start_line = Getline(s); Putc(c, chunk); if (c == '/') state = 31; else if (c == '*') state = 32; else state = 1; break; case 31: Putc(c, chunk); if (c == '\n') state = 0; break; case 32: Putc(c, chunk); if (c == '*') state = 33; break; case 33: Putc(c, chunk); if (c == '/') state = 1; else if (c != '*') state = 32; break; case 40: /* Start of a C preprocessor directive */ if (c == '\n') { Putc('\n', chunk); state = 0; } else if (isspace(c)) { state = 40; } else { /* Got the start of a preprocessor directive */ Ungetc(c, s); Clear(id); copy_location(s, id); state = 41; } break; case 41: /* Build up the name of the preprocessor directive */ if ((isspace(c) || (!isalpha(c)))) { Clear(value); Clear(comment); if (c == '\n') { Ungetc(c, s); state = 50; } else { state = 42; if (!isspace(c)) { Ungetc(c, s); } } copy_location(s, value); break; } Putc(c, id); break; case 42: /* Strip any leading space before preprocessor value */ if (isspace(c)) { if (c == '\n') { Ungetc(c, s); state = 50; } break; } state = 43; /* FALL THRU */ case 43: /* Get preprocessor value */ if (c == '\n') { Ungetc(c, s); state = 50; } else if (c == '/') { state = 45; } else if (c == '\"') { Putc(c, value); skip_tochar(s, '\"', value); } else if (c == '\'') { Putc(c, value); skip_tochar(s, '\'', value); } else { Putc(c, value); if (c == '\\') state = 44; } break; case 44: if (c == '\n') { Putc(c, value); cpp_lines++; } else { Ungetc(c, s); } state = 43; break; /* States 45-48 are used to remove, but retain comments from macro values. The comments will be placed in the output in an alternative form */ case 45: if (c == '/') state = 46; else if (c == '*') state = 47; else if (c == '\n') { Putc('/', value); Ungetc(c, s); state = 50; } else { Putc('/', value); Putc(c, value); state = 43; } break; case 46: /* in C++ comment */ if (c == '\n') { Ungetc(c, s); state = 50; } else Putc(c, comment); break; case 47: /* in C comment */ if (c == '*') state = 48; else Putc(c, comment); break; case 48: if (c == '/') state = 43; else if (c == '*') Putc(c, comment); else { Putc('*', comment); Putc(c, comment); state = 47; } break; case 50: /* Check for various preprocessor directives */ Chop(value); if (Equal(id, kpp_define)) { if (allow) { DOH *m, *v, *v1; Seek(value, 0, SEEK_SET); m = Preprocessor_define(value, 0); if ((m) && !(Getattr(m, kpp_args))) { v = Copy(Getattr(m, kpp_value)); copy_location(m, v); if (Len(v)) { Swig_error_silent(1); v1 = Preprocessor_replace(v); Swig_error_silent(0); /* Printf(stdout,"checking '%s'\n", v1); */ if (!checkpp_id(v1)) { if (Len(comment) == 0) Printf(ns, "%%constant %s = %s;\n", Getattr(m, kpp_name), v1); else Printf(ns, "%%constant %s = %s; /*%s*/\n", Getattr(m, kpp_name), v1, comment); cpp_lines--; } Delete(v1); } Delete(v); } } } else if (Equal(id, kpp_undef)) { if (allow) Preprocessor_undef(value); } else if (Equal(id, kpp_ifdef)) { cond_lines[level] = Getline(id); level++; if (allow) { start_level = level; if (Len(value) > 0) { /* See if the identifier is in the hash table */ if (!Getattr(symbols, value)) allow = 0; } else { Swig_error(Getfile(s), Getline(id), "Missing identifier for #ifdef.\n"); allow = 0; } mask = 1; } } else if (Equal(id, kpp_ifndef)) { cond_lines[level] = Getline(id); level++; if (allow) { start_level = level; if (Len(value) > 0) { /* See if the identifier is in the hash table */ if (Getattr(symbols, value)) allow = 0; } else { Swig_error(Getfile(s), Getline(id), "Missing identifier for #ifndef.\n"); allow = 0; } mask = 1; } } else if (Equal(id, kpp_else)) { if (level <= 0) { Swig_error(Getfile(s), Getline(id), "Misplaced #else.\n"); } else { cond_lines[level - 1] = Getline(id); if (Len(value) != 0) Swig_warning(WARN_PP_UNEXPECTED_TOKENS, Getfile(s), Getline(id), "Unexpected tokens after #else directive.\n"); if (allow) { allow = 0; mask = 0; } else if (level == start_level) { allow = 1 * mask; } } } else if (Equal(id, kpp_endif)) { level--; if (level < 0) { Swig_error(Getfile(id), Getline(id), "Extraneous #endif.\n"); level = 0; } else { if (level < start_level) { if (Len(value) != 0) Swig_warning(WARN_PP_UNEXPECTED_TOKENS, Getfile(s), Getline(id), "Unexpected tokens after #endif directive.\n"); allow = 1; start_level--; } } } else if (Equal(id, kpp_if)) { cond_lines[level] = Getline(id); level++; if (allow) { int val; String *sval; expand_defined_operator = 1; sval = Preprocessor_replace(value); start_level = level; Seek(sval, 0, SEEK_SET); /* Printf(stdout,"Evaluating '%s'\n", sval); */ if (Len(sval) > 0) { val = Preprocessor_expr(sval, &e); if (e) { const char *msg = Preprocessor_expr_error(); Seek(value, 0, SEEK_SET); Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Could not evaluate expression '%s'\n", value); if (msg) Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Error: '%s'\n", msg); allow = 0; } else { if (val == 0) allow = 0; } } else { Swig_error(Getfile(s), Getline(id), "Missing expression for #if.\n"); allow = 0; } expand_defined_operator = 0; mask = 1; } } else if (Equal(id, kpp_elif)) { if (level == 0) { Swig_error(Getfile(s), Getline(id), "Misplaced #elif.\n"); } else { cond_lines[level - 1] = Getline(id); if (allow) { allow = 0; mask = 0; } else if (level == start_level) { int val; String *sval; expand_defined_operator = 1; sval = Preprocessor_replace(value); Seek(sval, 0, SEEK_SET); if (Len(sval) > 0) { val = Preprocessor_expr(sval, &e); if (e) { const char *msg = Preprocessor_expr_error(); Seek(value, 0, SEEK_SET); Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Could not evaluate expression '%s'\n", value); if (msg) Swig_warning(WARN_PP_EVALUATION, Getfile(value), Getline(value), "Error: '%s'\n", msg); allow = 0; } else { if (val) allow = 1 * mask; else allow = 0; } } else { Swig_error(Getfile(s), Getline(id), "Missing expression for #elif.\n"); allow = 0; } expand_defined_operator = 0; } } } else if (Equal(id, kpp_warning)) { if (allow) { Swig_warning(WARN_PP_CPP_WARNING, Getfile(s), Getline(id), "CPP #warning, \"%s\".\n", value); } } else if (Equal(id, kpp_error)) { if (allow) { if (error_as_warning) { Swig_warning(WARN_PP_CPP_ERROR, Getfile(s), Getline(id), "CPP #error \"%s\".\n", value); } else { Swig_error(Getfile(s), Getline(id), "CPP #error \"%s\". Use the -cpperraswarn option to continue swig processing.\n", value); } } } else if (Equal(id, kpp_line)) { } else if (Equal(id, kpp_include)) { if (((include_all) || (import_all)) && (allow)) { String *s1, *s2, *fn; String *dirname; int sysfile = 0; if (include_all && import_all) { Swig_warning(WARN_PP_INCLUDEALL_IMPORTALL, Getfile(s), Getline(id), "Both includeall and importall are defined: using includeall.\n"); import_all = 0; } Seek(value, 0, SEEK_SET); fn = get_filename(value, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { if (include_all) Printf(ns, "%%includefile \"%s\" %%beginfile\n", Swig_filename_escape(Swig_last_file())); else if (import_all) { Printf(ns, "%%importfile \"%s\" %%beginfile\n", Swig_filename_escape(Swig_last_file())); push_imported(); } /* See if the filename has a directory component */ dirname = Swig_file_dirname(Swig_last_file()); if (sysfile || !Len(dirname)) { Delete(dirname); dirname = 0; } if (dirname) { int len = Len(dirname); Delslice(dirname, len - 1, len); /* Kill trailing directory delimiter */ Swig_push_directory(dirname); } s2 = Preprocessor_parse(s1); addline(ns, s2, allow); Append(ns, "%endoffile"); if (dirname) { Swig_pop_directory(); } if (import_all) { pop_imported(); } Delete(s2); Delete(dirname); Delete(s1); } Delete(fn); } } else if (Equal(id, kpp_pragma)) { if (Strncmp(value, "SWIG ", 5) == 0) { char *c = Char(value) + 5; while (*c && (isspace((int) *c))) c++; if (*c) { if (strncmp(c, "nowarn=", 7) == 0) { String *val = NewString(c + 7); String *nowarn = Preprocessor_replace(val); Swig_warnfilter(nowarn, 1); Delete(nowarn); Delete(val); } else if (strncmp(c, "cpperraswarn=", 13) == 0) { error_as_warning = atoi(c + 13); } else { Swig_error(Getfile(s), Getline(id), "Unknown SWIG pragma: %s\n", c); } } } } else if (Equal(id, kpp_level)) { Swig_error(Getfile(s), Getline(id), "cpp debug: level = %d, startlevel = %d\n", level, start_level); } else if (Equal(id, "")) { /* Null directive */ } else { /* Ignore unknown preprocessor directives which are inside an inactive * conditional (github issue #394). */ if (allow) Swig_error(Getfile(s), Getline(id), "Unknown SWIG preprocessor directive: %s (if this is a block of target language code, delimit it with %%{ and %%})\n", id); } for (i = 0; i < cpp_lines; i++) Putc('\n', ns); state = 0; break; /* SWIG directives */ case 100: /* %{,%} block */ if (c == '{') { start_line = Getline(s); copy_location(s, chunk); add_chunk(ns, chunk, allow); Putc('%', chunk); Putc(c, chunk); state = 105; } /* %#cpp - an embedded C preprocessor directive (we strip off the %) */ else if (c == '#') { add_chunk(ns, chunk, allow); Putc(c, chunk); state = 107; } else if (isidentifier(c)) { Clear(decl); Putc('%', decl); Putc(c, decl); state = 110; } else { Putc('%', chunk); Putc(c, chunk); state = 1; } break; case 105: Putc(c, chunk); if (c == '%') state = 106; break; case 106: Putc(c, chunk); if (c == '}') { state = 1; addline(ns, chunk, allow); Clear(chunk); copy_location(s, chunk); } else { state = 105; } break; case 107: Putc(c, chunk); if (c == '\n') { addline(ns, chunk, allow); Clear(chunk); state = 0; } else if (c == '\\') { state = 108; } break; case 108: Putc(c, chunk); state = 107; break; case 110: if (!isidchar(c)) { Ungetc(c, s); /* Look for common SWIG directives */ if (Equal(decl, kpp_dinclude) || Equal(decl, kpp_dimport) || Equal(decl, kpp_dextern)) { /* Got some kind of file inclusion directive, eg: %import(option1="value1") "filename" */ if (allow) { DOH *s1, *s2, *fn, *opt; String *options_whitespace = NewStringEmpty(); String *filename_whitespace = NewStringEmpty(); int sysfile = 0; if (Equal(decl, kpp_dextern)) { Swig_warning(WARN_DEPRECATED_EXTERN, Getfile(s), Getline(s), "%%extern is deprecated. Use %%import instead.\n"); Clear(decl); Append(decl, "%%import"); } skip_whitespace(s, options_whitespace); opt = get_options(s); skip_whitespace(s, filename_whitespace); fn = get_filename(s, &sysfile); s1 = cpp_include(fn, sysfile); if (s1) { String *dirname; copy_location(s, chunk); add_chunk(ns, chunk, allow); Printf(ns, "%sfile%s%s%s\"%s\" %%beginfile\n", decl, options_whitespace, opt, filename_whitespace, Swig_filename_escape(Swig_last_file())); if (Equal(decl, kpp_dimport)) { push_imported(); } dirname = Swig_file_dirname(Swig_last_file()); if (sysfile || !Len(dirname)) { Delete(dirname); dirname = 0; } if (dirname) { int len = Len(dirname); Delslice(dirname, len - 1, len); /* Kill trailing directory delimiter */ Swig_push_directory(dirname); } s2 = Preprocessor_parse(s1); if (dirname) { Swig_pop_directory(); } if (Equal(decl, kpp_dimport)) { pop_imported(); } addline(ns, s2, allow); Append(ns, "%endoffile"); Delete(s2); Delete(dirname); Delete(s1); } Delete(fn); Delete(filename_whitespace); Delete(options_whitespace); } state = 1; } else if (Equal(decl, kpp_dbeginfile)) { /* Got an internal directive marking the beginning of an included file: %beginfile ... %endoffile */ filelevel++; start_line = Getline(s); copy_location(s, chunk); add_chunk(ns, chunk, allow); Append(chunk, decl); state = 120; } else if (Equal(decl, kpp_dline)) { /* Got a line directive */ state = 1; } else if (Equal(decl, kpp_ddefine)) { /* Got a define directive */ dlevel++; copy_location(s, chunk); add_chunk(ns, chunk, allow); Clear(value); copy_location(s, value); state = 150; } else { Append(chunk, decl); state = 1; } } else { Putc(c, decl); } break; /* Searching for the end of a %beginfile block */ case 120: Putc(c, chunk); if (c == '%') { const char *bf = "beginfile"; const char *ef = "endoffile"; char statement[10]; int i = 0; for (i = 0; i < 9;) { c = Getc(s); Putc(c, chunk); statement[i++] = (char)c; if (strncmp(statement, bf, i) && strncmp(statement, ef, i)) break; } c = Getc(s); Ungetc(c, s); if ((i == 9) && (isspace(c))) { if (strncmp(statement, bf, i) == 0) { ++filelevel; } else if (strncmp(statement, ef, i) == 0) { --filelevel; if (!filelevel) { /* Reached end of included file */ addline(ns, chunk, allow); Clear(chunk); copy_location(s, chunk); state = 1; } } } } break; /* Searching for the end of a %define statement */ case 150: Putc(c, value); if (c == '%') { const char *ed = "enddef"; const char *df = "define"; char statement[7]; int i = 0; for (i = 0; i < 6;) { c = Getc(s); Putc(c, value); statement[i++] = (char)c; if (strncmp(statement, ed, i) && strncmp(statement, df, i)) break; } c = Getc(s); Ungetc(c, s); if ((i == 6) && (isspace(c))) { if (strncmp(statement, df, i) == 0) { ++dlevel; } else { if (strncmp(statement, ed, i) == 0) { --dlevel; if (!dlevel) { /* Got the macro */ for (i = 0; i < 7; i++) { Delitem(value, DOH_END); } if (allow) { Seek(value, 0, SEEK_SET); Preprocessor_define(value, 1); } addline(ns, value, 0); state = 0; } } } } } break; default: Printf(stderr, "cpp: Invalid parser state %d\n", state); abort(); break; } } while (level > 0) { Swig_error(Getfile(s), cond_lines[level - 1], "Missing #endif for conditional starting here\n"); level--; } if (state == 120) { Swig_error(Getfile(s), start_line, "Missing %%endoffile for file inclusion block starting here\n"); } if (state == 150) { Seek(value, 0, SEEK_SET); Swig_error(Getfile(s), Getline(value), "Missing %%enddef for macro starting here\n", Getline(value)); } if ((state >= 105) && (state < 107)) { Swig_error(Getfile(s), start_line, "Unterminated %%{ ... %%} block\n"); } if ((state >= 30) && (state < 40)) { Swig_error(Getfile(s), start_line, "Unterminated comment\n"); } copy_location(s, chunk); add_chunk(ns, chunk, allow); /* DelScope(scp); */ Delete(decl); Delete(id); Delete(value); Delete(comment); Delete(chunk); return ns; } swig-3.0.12/Source/Makefile.in0000664000175000017500000012730213042756667015760 0ustar williamwilliam# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 Free Software Foundation, Inc. # This Makefile.in 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. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = eswig$(EXEEXT) subdir = Source ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/Tools/config/ac_compile_warnings.m4 \ $(top_srcdir)/Tools/config/ac_define_dir.m4 \ $(top_srcdir)/Tools/config/ax_boost_base.m4 \ $(top_srcdir)/Tools/config/ax_compare_version.m4 \ $(top_srcdir)/Tools/config/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/Tools/config/ax_path_generic.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/Source/Include/swigconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__dirstamp = $(am__leading_dot)dirstamp am_eswig_OBJECTS = CParse/cscanner.$(OBJEXT) CParse/parser.$(OBJEXT) \ CParse/templ.$(OBJEXT) CParse/util.$(OBJEXT) \ DOH/base.$(OBJEXT) DOH/file.$(OBJEXT) DOH/fio.$(OBJEXT) \ DOH/hash.$(OBJEXT) DOH/list.$(OBJEXT) DOH/memory.$(OBJEXT) \ DOH/string.$(OBJEXT) DOH/void.$(OBJEXT) \ Modules/allegrocl.$(OBJEXT) Modules/allocate.$(OBJEXT) \ Modules/browser.$(OBJEXT) Modules/cffi.$(OBJEXT) \ Modules/chicken.$(OBJEXT) Modules/clisp.$(OBJEXT) \ Modules/contract.$(OBJEXT) Modules/csharp.$(OBJEXT) \ Modules/d.$(OBJEXT) Modules/directors.$(OBJEXT) \ Modules/emit.$(OBJEXT) Modules/go.$(OBJEXT) \ Modules/guile.$(OBJEXT) Modules/interface.$(OBJEXT) \ Modules/java.$(OBJEXT) Modules/javascript.$(OBJEXT) \ Modules/lang.$(OBJEXT) Modules/lua.$(OBJEXT) \ Modules/main.$(OBJEXT) Modules/modula3.$(OBJEXT) \ Modules/module.$(OBJEXT) Modules/mzscheme.$(OBJEXT) \ Modules/nested.$(OBJEXT) Modules/ocaml.$(OBJEXT) \ Modules/octave.$(OBJEXT) Modules/overload.$(OBJEXT) \ Modules/perl5.$(OBJEXT) Modules/php.$(OBJEXT) \ Modules/php5.$(OBJEXT) Modules/pike.$(OBJEXT) \ Modules/python.$(OBJEXT) Modules/r.$(OBJEXT) \ Modules/ruby.$(OBJEXT) Modules/s-exp.$(OBJEXT) \ Modules/scilab.$(OBJEXT) Modules/swigmain.$(OBJEXT) \ Modules/tcl8.$(OBJEXT) Modules/typepass.$(OBJEXT) \ Modules/uffi.$(OBJEXT) Modules/utils.$(OBJEXT) \ Modules/xml.$(OBJEXT) Preprocessor/cpp.$(OBJEXT) \ Preprocessor/expr.$(OBJEXT) Swig/cwrap.$(OBJEXT) \ Swig/deprecate.$(OBJEXT) Swig/error.$(OBJEXT) \ Swig/extend.$(OBJEXT) Swig/fragment.$(OBJEXT) \ Swig/getopt.$(OBJEXT) Swig/include.$(OBJEXT) \ Swig/misc.$(OBJEXT) Swig/naming.$(OBJEXT) Swig/parms.$(OBJEXT) \ Swig/scanner.$(OBJEXT) Swig/stype.$(OBJEXT) \ Swig/symbol.$(OBJEXT) Swig/tree.$(OBJEXT) \ Swig/typeobj.$(OBJEXT) Swig/typemap.$(OBJEXT) \ Swig/typesys.$(OBJEXT) Swig/wrapfunc.$(OBJEXT) eswig_OBJECTS = $(am_eswig_OBJECTS) eswig_DEPENDENCIES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = depcomp = $(SHELL) $(top_srcdir)/Tools/config/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; am__v_YACC_1 = YLWRAP = $(top_srcdir)/Tools/config/ylwrap SOURCES = $(eswig_SOURCES) DIST_SOURCES = $(eswig_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/Tools/config/depcomp \ $(top_srcdir)/Tools/config/ylwrap CParse/parser.c \ CParse/parser.h README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ADB = @ADB@ ALLEGROCLBIN = @ALLEGROCLBIN@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANDROID = @ANDROID@ ANT = @ANT@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ BOOST_LDFLAGS = @BOOST_LDFLAGS@ CAMLP4 = @CAMLP4@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CCSHARED = @CCSHARED@ CFLAGS = @CFLAGS@ CHICKEN = @CHICKEN@ CHICKENLIB = @CHICKENLIB@ CHICKENOPTS = @CHICKENOPTS@ CHICKENSHAREDLIB = @CHICKENSHAREDLIB@ CHICKEN_CSC = @CHICKEN_CSC@ CHICKEN_CSI = @CHICKEN_CSI@ CLISPBIN = @CLISPBIN@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSHARPCFLAGS = @CSHARPCFLAGS@ CSHARPCILINTERPRETER = @CSHARPCILINTERPRETER@ CSHARPCILINTERPRETER_FLAGS = @CSHARPCILINTERPRETER_FLAGS@ CSHARPCOMPILER = @CSHARPCOMPILER@ CSHARPCONVERTPATH = @CSHARPCONVERTPATH@ CSHARPDYNAMICLINKING = @CSHARPDYNAMICLINKING@ CSHARPLIBRARYPREFIX = @CSHARPLIBRARYPREFIX@ CSHARPSO = @CSHARPSO@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CXXSHARED = @CXXSHARED@ CYGPATH_W = @CYGPATH_W@ D1COMPILER = @D1COMPILER@ D2COMPILER = @D2COMPILER@ DDEFAULTVERSION = @DDEFAULTVERSION@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLIBPREFIX = @DLIBPREFIX@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CCACHE = @ENABLE_CCACHE@ EXEEXT = @EXEEXT@ EXTRA_CLEAN = @EXTRA_CLEAN@ GCCGO = @GCCGO@ GCCGOOPT = @GCCGOOPT@ GCJ = @GCJ@ GCJH = @GCJH@ GO = @GO@ GO1 = @GO1@ GO12 = @GO12@ GO13 = @GO13@ GO15 = @GO15@ GOC = @GOC@ GOGCC = @GOGCC@ GOOPT = @GOOPT@ GOVERSIONOPTION = @GOVERSIONOPTION@ GREP = @GREP@ GUILE = @GUILE@ GUILE_CFLAGS = @GUILE_CFLAGS@ GUILE_CONFIG = @GUILE_CONFIG@ GUILE_LIBS = @GUILE_LIBS@ GUILE_SO = @GUILE_SO@ HAVE_CXX11_COMPILER = @HAVE_CXX11_COMPILER@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVACFLAGS = @JAVACFLAGS@ JAVACXXSHARED = @JAVACXXSHARED@ JAVADYNAMICLINKING = @JAVADYNAMICLINKING@ JAVAFLAGS = @JAVAFLAGS@ JAVAINC = @JAVAINC@ JAVALDSHARED = @JAVALDSHARED@ JAVALIBRARYPREFIX = @JAVALIBRARYPREFIX@ JAVASO = @JAVASO@ JSCENABLED = @JSCENABLED@ JSCOREDYNAMICLINKING = @JSCOREDYNAMICLINKING@ JSCOREINC = @JSCOREINC@ JSCOREVERSION = @JSCOREVERSION@ JSINTERPRETERCXX = @JSINTERPRETERCXX@ JSINTERPRETERLINKFLAGS = @JSINTERPRETERLINKFLAGS@ JSV8DYNAMICLINKING = @JSV8DYNAMICLINKING@ JSV8ENABLED = @JSV8ENABLED@ JSV8INC = @JSV8INC@ LDFLAGS = @LDFLAGS@ LDSHARED = @LDSHARED@ LIBC = @LIBC@ LIBCRYPT = @LIBCRYPT@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LINKFORSHARED = @LINKFORSHARED@ LTLIBOBJS = @LTLIBOBJS@ LUABIN = @LUABIN@ LUADYNAMICLINKING = @LUADYNAMICLINKING@ LUAFLAGS = @LUAFLAGS@ LUALINK = @LUALINK@ LUA_SO = @LUA_SO@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MZC = @MZC@ MZDYNOBJ = @MZDYNOBJ@ MZSCHEME = @MZSCHEME@ MZSCHEME_SO = @MZSCHEME_SO@ NDKBUILD = @NDKBUILD@ NODEGYP = @NODEGYP@ NODEJS = @NODEJS@ OBJEXT = @OBJEXT@ OCAMLC = @OCAMLC@ OCAMLDLGEN = @OCAMLDLGEN@ OCAMLFIND = @OCAMLFIND@ OCAMLMKTOP = @OCAMLMKTOP@ OCTAVE = @OCTAVE@ OCTAVE_CPPFLAGS = @OCTAVE_CPPFLAGS@ OCTAVE_CXXFLAGS = @OCTAVE_CXXFLAGS@ OCTAVE_LDFLAGS = @OCTAVE_LDFLAGS@ OCTAVE_SO = @OCTAVE_SO@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCRE_CFLAGS = @PCRE_CFLAGS@ PCRE_CONFIG = @PCRE_CONFIG@ PCRE_LIBS = @PCRE_LIBS@ PEP8 = @PEP8@ PERL = @PERL@ PERL5CCCDLFLAGS = @PERL5CCCDLFLAGS@ PERL5CCDLFLAGS = @PERL5CCDLFLAGS@ PERL5CCFLAGS = @PERL5CCFLAGS@ PERL5DYNAMICLINKING = @PERL5DYNAMICLINKING@ PERL5EXT = @PERL5EXT@ PERL5LDFLAGS = @PERL5LDFLAGS@ PERL5LIB = @PERL5LIB@ PHP = @PHP@ PHP5 = @PHP5@ PHP5INC = @PHP5INC@ PHP5_SO = @PHP5_SO@ PHPINC = @PHPINC@ PHP_SO = @PHP_SO@ PIKE = @PIKE@ PIKECCDLFLAGS = @PIKECCDLFLAGS@ PIKECONFIG = @PIKECONFIG@ PIKEDYNAMICLINKING = @PIKEDYNAMICLINKING@ PIKEINCLUDE = @PIKEINCLUDE@ PKGCONFIG = @PKGCONFIG@ PLATCFLAGS = @PLATCFLAGS@ PLATCXXFLAGS = @PLATCXXFLAGS@ PY3CONFIG = @PY3CONFIG@ PY3INCLUDE = @PY3INCLUDE@ PY3LIB = @PY3LIB@ PY3LINK = @PY3LINK@ PYINCLUDE = @PYINCLUDE@ PYLIB = @PYLIB@ PYLINK = @PYLINK@ PYTHON = @PYTHON@ PYTHON3 = @PYTHON3@ PYTHON3DYNAMICLINKING = @PYTHON3DYNAMICLINKING@ PYTHONDYNAMICLINKING = @PYTHONDYNAMICLINKING@ PYTHON_SO = @PYTHON_SO@ RBIN = @RBIN@ ROOT_DIR = @ROOT_DIR@ RPATH = @RPATH@ RUBY = @RUBY@ RUBYCCDLFLAGS = @RUBYCCDLFLAGS@ RUBYDYNAMICLINKING = @RUBYDYNAMICLINKING@ RUBYINCLUDE = @RUBYINCLUDE@ RUBYLIB = @RUBYLIB@ RUBYLINK = @RUBYLINK@ RUBYSO = @RUBYSO@ SCILAB = @SCILAB@ SCILABINCLUDE = @SCILABINCLUDE@ SCILABOPT = @SCILABOPT@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SKIP_ALLEGROCL = @SKIP_ALLEGROCL@ SKIP_ANDROID = @SKIP_ANDROID@ SKIP_CFFI = @SKIP_CFFI@ SKIP_CHICKEN = @SKIP_CHICKEN@ SKIP_CLISP = @SKIP_CLISP@ SKIP_CSHARP = @SKIP_CSHARP@ SKIP_D = @SKIP_D@ SKIP_GCJ = @SKIP_GCJ@ SKIP_GO = @SKIP_GO@ SKIP_GUILE = @SKIP_GUILE@ SKIP_JAVA = @SKIP_JAVA@ SKIP_JAVASCRIPT = @SKIP_JAVASCRIPT@ SKIP_LUA = @SKIP_LUA@ SKIP_MODULA3 = @SKIP_MODULA3@ SKIP_MZSCHEME = @SKIP_MZSCHEME@ SKIP_OCAML = @SKIP_OCAML@ SKIP_OCTAVE = @SKIP_OCTAVE@ SKIP_PERL5 = @SKIP_PERL5@ SKIP_PHP = @SKIP_PHP@ SKIP_PHP5 = @SKIP_PHP5@ SKIP_PIKE = @SKIP_PIKE@ SKIP_PYTHON = @SKIP_PYTHON@ SKIP_PYTHON3 = @SKIP_PYTHON3@ SKIP_R = @SKIP_R@ SKIP_RUBY = @SKIP_RUBY@ SKIP_SCILAB = @SKIP_SCILAB@ SKIP_TCL = @SKIP_TCL@ SKIP_UFFI = @SKIP_UFFI@ SO = @SO@ STRIP = @STRIP@ SWIGLIBS = @SWIGLIBS@ SWIG_LIB = @SWIG_LIB@ SWIG_LIB_INSTALL = @SWIG_LIB_INSTALL@ SWIG_LIB_PREINST = @SWIG_LIB_PREINST@ SWIG_LIB_SET = @SWIG_LIB_SET@ SWILL = @SWILL@ TCLCXXSHARED = @TCLCXXSHARED@ TCLDYNAMICLINKING = @TCLDYNAMICLINKING@ TCLINCLUDE = @TCLINCLUDE@ TCLLDSHARED = @TCLLDSHARED@ TCLLIB = @TCLLIB@ TCL_SO = @TCL_SO@ TRYLINKINGWITHCXX = @TRYLINKINGWITHCXX@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # subdir-objects generates object files using the directory structure of the source files. AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects 1.7.2 SOURCE_DIR = $(top_srcdir)/Source BUILD_SOURCE_DIR = $(top_builddir)/Source SWIG_CXX_DEFS = @SWILL@ AM_CPPFLAGS = -I$(BUILD_SOURCE_DIR)/Include \ -I$(BUILD_SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Include \ -I$(SOURCE_DIR)/DOH \ -I$(SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Preprocessor \ -I$(SOURCE_DIR)/Swig \ -I$(SOURCE_DIR)/Modules AM_CXXFLAGS = $(SWIG_CXX_DEFS) AM_YFLAGS = -d BUILT_SOURCES = CParse/parser.h eswig_SOURCES = CParse/cscanner.c \ CParse/parser.y \ CParse/templ.c \ CParse/util.c \ DOH/base.c \ DOH/file.c \ DOH/fio.c \ DOH/hash.c \ DOH/list.c \ DOH/memory.c \ DOH/string.c \ DOH/void.c \ Modules/allegrocl.cxx \ Modules/allocate.cxx \ Modules/browser.cxx \ Modules/cffi.cxx \ Modules/chicken.cxx \ Modules/clisp.cxx \ Modules/contract.cxx \ Modules/csharp.cxx \ Modules/d.cxx \ Modules/directors.cxx \ Modules/emit.cxx \ Modules/go.cxx \ Modules/guile.cxx \ Modules/interface.cxx \ Modules/java.cxx \ Modules/javascript.cxx \ Modules/lang.cxx \ Modules/lua.cxx \ Modules/main.cxx \ Modules/modula3.cxx \ Modules/module.cxx \ Modules/mzscheme.cxx \ Modules/nested.cxx \ Modules/ocaml.cxx \ Modules/octave.cxx \ Modules/overload.cxx \ Modules/perl5.cxx \ Modules/php.cxx \ Modules/php5.cxx \ Modules/pike.cxx \ Modules/python.cxx \ Modules/r.cxx \ Modules/ruby.cxx \ Modules/s-exp.cxx \ Modules/scilab.cxx \ Modules/swigmain.cxx \ Modules/tcl8.cxx \ Modules/typepass.cxx \ Modules/uffi.cxx \ Modules/utils.cxx \ Modules/xml.cxx \ Preprocessor/cpp.c \ Preprocessor/expr.c \ Swig/cwrap.c \ Swig/deprecate.c \ Swig/error.c \ Swig/extend.c \ Swig/fragment.c \ Swig/getopt.c \ Swig/include.c \ Swig/misc.c \ Swig/naming.c \ Swig/parms.c \ Swig/scanner.c \ Swig/stype.c \ Swig/symbol.c \ Swig/tree.c \ Swig/typeobj.c \ Swig/typemap.c \ Swig/typesys.c \ Swig/wrapfunc.c eswig_LDADD = @SWIGLIBS@ # Override the link stage to avoid using Libtool CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ # Beautify the code. # Note that this works well on C code, but does some odd joining of lines for C++ code. # Compiling with -DNDEBUG and no optimisations will allow one to do a binary diff of the # swig executable as a way of checking before and after the 'beautifying'. # Single files can be beautified with the beautify-file target, eg: 'make beautify-file INDENTFILE=chosenfile.c' SWIGTYPEDEFS = -T bool -T File -T DohObjInfo -T Parm -T Language -T List -T Typetab -T ModuleFactory -T ErrorMessageFormat -T Symtab -T Hash -T Scanner -T String -T DohBase -T Node -T String_or_char -T SwigType -T Dispatcher -T Wrapper -T DohStringMethods -T DohFileMethods -T DohListMethods -T DohHashMethods -T DOH -T DohIterator -T ParmList -T FILE -T HashNode -T DOHObj_or_char -T DOHFile -T DOHString -T DOHString_or_char -T UpcallData INDENTBAKSDIR = ../IndentBaks all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cxx .o .obj .y $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Source/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Source/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) CParse/$(am__dirstamp): @$(MKDIR_P) CParse @: > CParse/$(am__dirstamp) CParse/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) CParse/$(DEPDIR) @: > CParse/$(DEPDIR)/$(am__dirstamp) CParse/cscanner.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/parser.h: CParse/parser.c @if test ! -f $@; then rm -f CParse/parser.c; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) CParse/parser.c; else :; fi CParse/parser.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/templ.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) CParse/util.$(OBJEXT): CParse/$(am__dirstamp) \ CParse/$(DEPDIR)/$(am__dirstamp) DOH/$(am__dirstamp): @$(MKDIR_P) DOH @: > DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) DOH/$(DEPDIR) @: > DOH/$(DEPDIR)/$(am__dirstamp) DOH/base.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/file.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/fio.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/hash.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/list.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) DOH/memory.$(OBJEXT): DOH/$(am__dirstamp) \ DOH/$(DEPDIR)/$(am__dirstamp) DOH/string.$(OBJEXT): DOH/$(am__dirstamp) \ DOH/$(DEPDIR)/$(am__dirstamp) DOH/void.$(OBJEXT): DOH/$(am__dirstamp) DOH/$(DEPDIR)/$(am__dirstamp) Modules/$(am__dirstamp): @$(MKDIR_P) Modules @: > Modules/$(am__dirstamp) Modules/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Modules/$(DEPDIR) @: > Modules/$(DEPDIR)/$(am__dirstamp) Modules/allegrocl.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/allocate.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/browser.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/cffi.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/chicken.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/clisp.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/contract.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/csharp.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/d.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/directors.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/emit.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/go.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/guile.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/interface.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/java.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/javascript.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/lang.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/lua.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/main.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/modula3.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/module.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/mzscheme.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/nested.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/ocaml.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/octave.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/overload.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/perl5.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/php.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/php5.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/pike.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/python.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/r.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/ruby.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/s-exp.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/scilab.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/swigmain.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/tcl8.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/typepass.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/uffi.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/utils.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Modules/xml.$(OBJEXT): Modules/$(am__dirstamp) \ Modules/$(DEPDIR)/$(am__dirstamp) Preprocessor/$(am__dirstamp): @$(MKDIR_P) Preprocessor @: > Preprocessor/$(am__dirstamp) Preprocessor/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Preprocessor/$(DEPDIR) @: > Preprocessor/$(DEPDIR)/$(am__dirstamp) Preprocessor/cpp.$(OBJEXT): Preprocessor/$(am__dirstamp) \ Preprocessor/$(DEPDIR)/$(am__dirstamp) Preprocessor/expr.$(OBJEXT): Preprocessor/$(am__dirstamp) \ Preprocessor/$(DEPDIR)/$(am__dirstamp) Swig/$(am__dirstamp): @$(MKDIR_P) Swig @: > Swig/$(am__dirstamp) Swig/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) Swig/$(DEPDIR) @: > Swig/$(DEPDIR)/$(am__dirstamp) Swig/cwrap.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/deprecate.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/error.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/extend.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/fragment.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/getopt.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/include.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/misc.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/naming.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/parms.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/scanner.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/stype.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/symbol.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/tree.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typeobj.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typemap.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/typesys.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) Swig/wrapfunc.$(OBJEXT): Swig/$(am__dirstamp) \ Swig/$(DEPDIR)/$(am__dirstamp) eswig$(EXEEXT): $(eswig_OBJECTS) $(eswig_DEPENDENCIES) $(EXTRA_eswig_DEPENDENCIES) @rm -f eswig$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(eswig_OBJECTS) $(eswig_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f CParse/*.$(OBJEXT) -rm -f DOH/*.$(OBJEXT) -rm -f Modules/*.$(OBJEXT) -rm -f Preprocessor/*.$(OBJEXT) -rm -f Swig/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/cscanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/templ.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@CParse/$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/fio.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/hash.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/list.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/memory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/string.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@DOH/$(DEPDIR)/void.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/allegrocl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/allocate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/cffi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/chicken.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/clisp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/contract.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/csharp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/d.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/directors.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/emit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/go.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/guile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/java.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/javascript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/lang.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/lua.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/modula3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/module.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/mzscheme.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/nested.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/ocaml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/octave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/overload.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/perl5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/php.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/php5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/pike.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/python.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/r.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/ruby.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/s-exp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/scilab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/swigmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/tcl8.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/typepass.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/uffi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Modules/$(DEPDIR)/xml.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Preprocessor/$(DEPDIR)/cpp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Preprocessor/$(DEPDIR)/expr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/cwrap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/deprecate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/extend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/fragment.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/include.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/naming.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/parms.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/scanner.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/stype.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/symbol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/tree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typemap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typeobj.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/typesys.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@Swig/$(DEPDIR)/wrapfunc.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cxx.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(PROGRAMS) all-local installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -rm -f CParse/$(DEPDIR)/$(am__dirstamp) -rm -f CParse/$(am__dirstamp) -rm -f DOH/$(DEPDIR)/$(am__dirstamp) -rm -f DOH/$(am__dirstamp) -rm -f Modules/$(DEPDIR)/$(am__dirstamp) -rm -f Modules/$(am__dirstamp) -rm -f Preprocessor/$(DEPDIR)/$(am__dirstamp) -rm -f Preprocessor/$(am__dirstamp) -rm -f Swig/$(DEPDIR)/$(am__dirstamp) -rm -f Swig/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f CParse/parser.c -rm -f CParse/parser.h -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -rf CParse/$(DEPDIR) DOH/$(DEPDIR) Modules/$(DEPDIR) Preprocessor/$(DEPDIR) Swig/$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-local distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf CParse/$(DEPDIR) DOH/$(DEPDIR) Modules/$(DEPDIR) Preprocessor/$(DEPDIR) Swig/$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: all check install install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ clean-binPROGRAMS clean-generic clean-local cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-local distclean-tags distdir dvi dvi-am html html-am \ info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile # The executable is copied to the root directory for installation and running the test-suite. # This occurs on each invocation of make and is a step towards providing support for multiple # build directories. all-local: eswig@EXEEXT@ cp -f $(top_builddir)/Source/eswig@EXEEXT@ $(top_builddir)/swig@EXEEXT@ clean-local: rm -f $(top_builddir)/swig@EXEEXT@ rm -f core @EXTRA_CLEAN@ distclean-local: rm -f $(top_builddir)/Source/Include/swigconfig.h rm -f $(top_builddir)/Source/Include/stamp-h1 beautify: rm -rf $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR)/CParse mkdir $(INDENTBAKSDIR)/DOH mkdir $(INDENTBAKSDIR)/Modules mkdir $(INDENTBAKSDIR)/Preprocessor mkdir $(INDENTBAKSDIR)/Swig mkdir $(INDENTBAKSDIR)/Include (csources=`find . -name "*.c"` && \ hsources=`find . -name "*.h"` && \ cxxsources=`find . -name "*.cxx"` && \ for file in $$csources $$hsources $$cxxsources; do \ $(MAKE) beautify-file INDENTFILE=$$file; \ done; ) beautify-file: test -e $(INDENTBAKSDIR) || (echo $(INDENTBAKSDIR) directory does not exist && exit 1;) test -n "$(INDENTFILE)" || (echo INDENTFILE not defined && exit 1;) test -e $(INDENTFILE) || (echo File does not exist: $(INDENTFILE) && exit 1;) cp $(INDENTFILE) $(INDENTBAKSDIR)/$(INDENTFILE); indent -kr --honour-newlines --line-length160 --indent-level2 --braces-on-func-def-line --leave-optional-blank-lines $(SWIGTYPEDEFS) $(INDENTFILE) -o $(INDENTFILE).tmp; cat $(INDENTFILE).tmp | sed -e 's/const const /const /' > $(INDENTFILE); rm $(INDENTFILE).tmp; # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: swig-3.0.12/Source/Swig/0000775000175000017500000000000013042756442014606 5ustar williamwilliamswig-3.0.12/Source/Swig/typeobj.c0000664000175000017500000007707013042756442016441 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typeobj.c * * This file provides functions for constructing, manipulating, and testing * type objects. Type objects are merely the raw low-level representation * of C++ types. They do not incorporate high-level type system features * like typedef, namespaces, etc. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Synopsis * * This file provides a collection of low-level functions for constructing and * manipulating C++ data types. In SWIG, C++ datatypes are encoded as simple * text strings. This representation is compact, easy to debug, and easy to read. * * General idea: * * Types are represented by a base type (e.g., "int") and a collection of * type operators applied to the base (e.g., pointers, arrays, etc...). * * Encoding: * * Types are encoded as strings of type constructors such as follows: * * String Encoding C Example * --------------- --------- * p.p.int int ** * a(300).a(400).int int [300][400] * p.q(const).char char const * * * All type constructors are denoted by a trailing '.': * * 'p.' = Pointer (*) * 'r.' = Reference (&) * 'z.' = Rvalue reference (&&) * 'a(n).' = Array of size n [n] * 'f(..,..).' = Function with arguments (args) * 'q(str).' = Qualifier (such as const or volatile) (const, volatile) * 'm(qual).' = Pointer to member (qual::*) * * The complete type representation for varargs is: * 'v(...)' * * The encoding follows the order that you might describe a type in words. * For example "p.a(200).int" is "A pointer to array of int's" and * "p.q(const).char" is "a pointer to a const char". * * This representation of types is fairly convenient because ordinary string * operations can be used for type manipulation. For example, a type could be * formed by combining two strings such as the following: * * "p.p." + "a(400).int" = "p.p.a(400).int" * * For C++, typenames may be parameterized using <(...)>. Here are some * examples: * * String Encoding C++ Example * --------------- ------------ * p.vector<(int)> vector * * r.foo<(int,p.double)> foo & * * Contents of this file: * * Most of this functions in this file pertain to the low-level manipulation * of type objects. There are constructor functions like this: * * SwigType_add_pointer() * SwigType_add_reference() * SwigType_add_rvalue_reference() * SwigType_add_array() * * These are used to build new types. There are also functions to undo these * operations. For example: * * SwigType_del_pointer() * SwigType_del_reference() * SwigType_del_rvalue_reference() * SwigType_del_array() * * In addition, there are query functions * * SwigType_ispointer() * SwigType_isreference() * SwigType_isrvalue_reference() * SwigType_isarray() * * Finally, there are some data extraction functions that can be used to * extract array dimensions, template arguments, and so forth. * * It is very important for developers to realize that the functions in this * module do *NOT* incorporate higher-level type system features like typedef. * For example, you could have C code like this: * * typedef int *intptr; * * In this case, a SwigType of type 'intptr' will be treated as a simple type and * functions like SwigType_ispointer() will evaluate as false. It is strongly * advised that developers use the TypeSys_* interface to check types in a more * reliable manner. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * NewSwigType() * * Constructs a new type object. Eventually, it would be nice for this function * to accept an initial value in the form a C/C++ abstract type (currently unimplemented). * ----------------------------------------------------------------------------- */ #ifdef NEW SwigType *NewSwigType(const_String_or_char_ptr initial) { return NewString(initial); } #endif /* The next few functions are utility functions used in the construction and management of types */ /* ----------------------------------------------------------------------------- * static element_size() * * This utility function finds the size of a single type element in a type string. * Type elements are always delimited by periods, but may be nested with * parentheses. A nested element is always handled as a single item. * * Returns the integer size of the element (which can be used to extract a * substring, to chop the element off, or for other purposes). * ----------------------------------------------------------------------------- */ static int element_size(char *c) { int nparen; char *s = c; while (*c) { if (*c == '.') { c++; return (int) (c - s); } else if (*c == '(') { nparen = 1; c++; while (*c) { if (*c == '(') nparen++; if (*c == ')') { nparen--; if (nparen == 0) break; } c++; } } if (*c) c++; } return (int) (c - s); } /* ----------------------------------------------------------------------------- * SwigType_del_element() * * Deletes one type element from the type. * ----------------------------------------------------------------------------- */ SwigType *SwigType_del_element(SwigType *t) { int sz = element_size(Char(t)); Delslice(t, 0, sz); return t; } /* ----------------------------------------------------------------------------- * SwigType_pop() * * Pop one type element off the type. * Example: t in: q(const).p.Integer * t out: p.Integer * result: q(const). * ----------------------------------------------------------------------------- */ SwigType *SwigType_pop(SwigType *t) { SwigType *result; char *c; int sz; c = Char(t); if (!*c) return 0; sz = element_size(c); result = NewStringWithSize(c, sz); Delslice(t, 0, sz); c = Char(t); if (*c == '.') { Delitem(t, 0); } return result; } /* ----------------------------------------------------------------------------- * SwigType_parm() * * Returns the parameter of an operator as a string * ----------------------------------------------------------------------------- */ String *SwigType_parm(const SwigType *t) { char *start, *c; int nparens = 0; c = Char(t); while (*c && (*c != '(') && (*c != '.')) c++; if (!*c || (*c == '.')) return 0; c++; start = c; while (*c) { if (*c == ')') { if (nparens == 0) break; nparens--; } else if (*c == '(') { nparens++; } c++; } return NewStringWithSize(start, (int) (c - start)); } /* ----------------------------------------------------------------------------- * SwigType_split() * * Splits a type into its component parts and returns a list of string. * ----------------------------------------------------------------------------- */ List *SwigType_split(const SwigType *t) { String *item; List *list; char *c; int len; c = Char(t); list = NewList(); while (*c) { len = element_size(c); item = NewStringWithSize(c, len); Append(list, item); Delete(item); c = c + len; if (*c == '.') c++; } return list; } /* ----------------------------------------------------------------------------- * SwigType_parmlist() * * Splits a comma separated list of parameters into its component parts * The input is expected to contain the parameter list within () brackets * Returns 0 if no argument list in the input, ie there are no round brackets () * Returns an empty List if there are no parameters in the () brackets * For example: * * Foo(std::string,p.f().Bar<(int,double)>) * * returns 2 elements in the list: * std::string * p.f().Bar<(int,double)> * ----------------------------------------------------------------------------- */ List *SwigType_parmlist(const String *p) { String *item = 0; List *list; char *c; char *itemstart; int size; assert(p); c = Char(p); while (*c && (*c != '(') && (*c != '.')) c++; if (!*c) return 0; assert(*c != '.'); /* p is expected to contain sub elements of a type */ c++; list = NewList(); itemstart = c; while (*c) { if (*c == ',') { size = (int) (c - itemstart); item = NewStringWithSize(itemstart, size); Append(list, item); Delete(item); itemstart = c + 1; } else if (*c == '(') { int nparens = 1; c++; while (*c) { if (*c == '(') nparens++; if (*c == ')') { nparens--; if (nparens == 0) break; } c++; } } else if (*c == ')') { break; } if (*c) c++; } size = (int) (c - itemstart); if (size > 0) { item = NewStringWithSize(itemstart, size); Append(list, item); } Delete(item); return list; } /* ----------------------------------------------------------------------------- * Pointers * * SwigType_add_pointer() * SwigType_del_pointer() * SwigType_ispointer() * * Add, remove, and test if a type is a pointer. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_pointer(SwigType *t) { Insert(t, 0, "p."); return t; } SwigType *SwigType_del_pointer(SwigType *t) { char *c, *s; c = Char(t); s = c; /* Skip qualifiers, if any */ if (strncmp(c, "q(", 2) == 0) { c = strchr(c, '.'); assert(c); c++; } if (strncmp(c, "p.", 2)) { printf("Fatal error. SwigType_del_pointer applied to non-pointer.\n"); abort(); } Delslice(t, 0, (int)((c - s) + 2)); return t; } int SwigType_ispointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); /* Skip qualifiers, if any */ if (strncmp(c, "q(", 2) == 0) { c = strchr(c, '.'); if (!c) return 0; c++; } if (strncmp(c, "p.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * References * * SwigType_add_reference() * SwigType_del_reference() * SwigType_isreference() * * Add, remove, and test if a type is a reference. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_reference(SwigType *t) { Insert(t, 0, "r."); return t; } SwigType *SwigType_del_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "r.", 2); assert(check == 0); Delslice(t, 0, 2); return t; } int SwigType_isreference(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "r.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Rvalue References * * SwigType_add_rvalue_reference() * SwigType_del_rvalue_reference() * SwigType_isrvalue_reference() * * Add, remove, and test if a type is a rvalue reference. The deletion and query * functions take into account qualifiers (if any). * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_rvalue_reference(SwigType *t) { Insert(t, 0, "z."); return t; } SwigType *SwigType_del_rvalue_reference(SwigType *t) { char *c = Char(t); int check = strncmp(c, "z.", 2); assert(check == 0); Delslice(t, 0, 2); return t; } int SwigType_isrvalue_reference(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "z.", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Qualifiers * * SwigType_add_qualifier() * SwigType_del_qualifier() * SwigType_is_qualifier() * * Adds type qualifiers like "const" and "volatile". When multiple qualifiers * are added to a type, they are combined together into a single qualifier. * Repeated qualifications have no effect. Moreover, the order of qualifications * is alphabetical---meaning that "const volatile" and "volatile const" are * stored in exactly the same way as "q(const volatile)". * 'qual' can be a list of multiple qualifiers in any order, separated by spaces. * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_qualifier(SwigType *t, const_String_or_char_ptr qual) { List *qlist; String *allq, *newq; int i, sz; const char *cqprev = 0; const char *c = Char(t); const char *cqual = Char(qual); /* if 't' has no qualifiers and 'qual' is a single qualifier, simply add it */ if ((strncmp(c, "q(", 2) != 0) && (strstr(cqual, " ") == 0)) { String *temp = NewStringf("q(%s).", cqual); Insert(t, 0, temp); Delete(temp); return t; } /* create string of all qualifiers */ if (strncmp(c, "q(", 2) == 0) { allq = SwigType_parm(t); Append(allq, " "); SwigType_del_element(t); /* delete old qualifier list from 't' */ } else { allq = NewStringEmpty(); } Append(allq, qual); /* create list of all qualifiers from string */ qlist = Split(allq, ' ', INT_MAX); Delete(allq); /* sort in alphabetical order */ SortList(qlist, Strcmp); /* create new qualifier string from unique elements of list */ sz = Len(qlist); newq = NewString("q("); for (i = 0; i < sz; ++i) { String *q = Getitem(qlist, i); const char *cq = Char(q); if (cqprev == 0 || strcmp(cqprev, cq) != 0) { if (i > 0) { Append(newq, " "); } Append(newq, q); cqprev = cq; } } Append(newq, ")."); Delete(qlist); /* replace qualifier string with new one */ Insert(t, 0, newq); Delete(newq); return t; } SwigType *SwigType_del_qualifier(SwigType *t) { char *c = Char(t); int check = strncmp(c, "q(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_isqualifier(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "q(", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Function Pointers * ----------------------------------------------------------------------------- */ int SwigType_isfunctionpointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "p.f(", 4) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * SwigType_functionpointer_decompose * * Decompose the function pointer into the parameter list and the return type * t - input and on completion contains the return type * returns the function's parameters * ----------------------------------------------------------------------------- */ SwigType *SwigType_functionpointer_decompose(SwigType *t) { String *p; assert(SwigType_isfunctionpointer(t)); p = SwigType_pop(t); Delete(p); p = SwigType_pop(t); return p; } /* ----------------------------------------------------------------------------- * Member Pointers * * SwigType_add_memberpointer() * SwigType_del_memberpointer() * SwigType_ismemberpointer() * * Add, remove, and test for C++ pointer to members. * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_memberpointer(SwigType *t, const_String_or_char_ptr name) { String *temp = NewStringf("m(%s).", name); Insert(t, 0, temp); Delete(temp); return t; } SwigType *SwigType_del_memberpointer(SwigType *t) { char *c = Char(t); int check = strncmp(c, "m(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_ismemberpointer(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "m(", 2) == 0) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Arrays * * SwigType_add_array() * SwigType_del_array() * SwigType_isarray() * * Utility functions: * * SwigType_array_ndim() - Calculate number of array dimensions. * SwigType_array_getdim() - Get array dimension * SwigType_array_setdim() - Set array dimension * SwigType_array_type() - Return array type * SwigType_pop_arrays() - Remove all arrays * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_array(SwigType *t, const_String_or_char_ptr size) { String *temp = NewString("a("); Append(temp, size); Append(temp, ")."); Insert(t, 0, temp); Delete(temp); return t; } SwigType *SwigType_del_array(SwigType *t) { char *c = Char(t); int check = strncmp(c, "a(", 2); assert(check == 0); Delslice(t, 0, element_size(c)); return t; } int SwigType_isarray(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "a(", 2) == 0) { return 1; } return 0; } /* * SwigType_prefix_is_simple_1D_array * * Determine if the type is a 1D array type that is treated as a pointer within SWIG * eg Foo[], Foo[3] return true, but Foo[3][3], Foo*[], Foo*[3], Foo**[] return false */ int SwigType_prefix_is_simple_1D_array(const SwigType *t) { char *c = Char(t); if (c && (strncmp(c, "a(", 2) == 0)) { c = strchr(c, '.'); if (c) return (*(++c) == 0); } return 0; } /* Remove all arrays */ SwigType *SwigType_pop_arrays(SwigType *t) { String *ta; assert(SwigType_isarray(t)); ta = NewStringEmpty(); while (SwigType_isarray(t)) { SwigType *td = SwigType_pop(t); Append(ta, td); Delete(td); } return ta; } /* Return number of array dimensions */ int SwigType_array_ndim(const SwigType *t) { int ndim = 0; char *c = Char(t); while (c && (strncmp(c, "a(", 2) == 0)) { c = strchr(c, '.'); if (c) { c++; ndim++; } } return ndim; } /* Get nth array dimension */ String *SwigType_array_getdim(const SwigType *t, int n) { char *c = Char(t); while (c && (strncmp(c, "a(", 2) == 0) && (n > 0)) { c = strchr(c, '.'); if (c) { c++; n--; } } if (n == 0) { String *dim = SwigType_parm(c); if (SwigType_istemplate(dim)) { String *ndim = SwigType_namestr(dim); Delete(dim); dim = ndim; } return dim; } return 0; } /* Replace nth array dimension */ void SwigType_array_setdim(SwigType *t, int n, const_String_or_char_ptr rep) { String *result = 0; char temp; char *start; char *c = Char(t); start = c; if (strncmp(c, "a(", 2)) abort(); while (c && (strncmp(c, "a(", 2) == 0) && (n > 0)) { c = strchr(c, '.'); if (c) { c++; n--; } } if (n == 0) { temp = *c; *c = 0; result = NewString(start); Printf(result, "a(%s)", rep); *c = temp; c = strchr(c, '.'); Append(result, c); } Clear(t); Append(t, result); Delete(result); } /* Return base type of an array */ SwigType *SwigType_array_type(const SwigType *ty) { SwigType *t; t = Copy(ty); while (SwigType_isarray(t)) { Delete(SwigType_pop(t)); } return t; } /* ----------------------------------------------------------------------------- * Functions * * SwigType_add_function() * SwigType_del_function() * SwigType_isfunction() * SwigType_pop_function() * * Add, remove, and test for function types. * ----------------------------------------------------------------------------- */ /* Returns the function type, t, constructed from the parameters, parms */ SwigType *SwigType_add_function(SwigType *t, ParmList *parms) { String *pstr; Parm *p; Insert(t, 0, ")."); pstr = NewString("f("); for (p = parms; p; p = nextSibling(p)) { if (p != parms) Putc(',', pstr); Append(pstr, Getattr(p, "type")); } Insert(t, 0, pstr); Delete(pstr); return t; } SwigType *SwigType_pop_function(SwigType *t) { SwigType *f = 0; SwigType *g = 0; char *c = Char(t); if (strncmp(c, "q(", 2) == 0) { f = SwigType_pop(t); c = Char(t); } if (strncmp(c, "f(", 2)) { printf("Fatal error. SwigType_pop_function applied to non-function.\n"); abort(); } g = SwigType_pop(t); if (f) SwigType_push(g, f); Delete(f); return g; } int SwigType_isfunction(const SwigType *t) { char *c; if (!t) { return 0; } c = Char(t); if (strncmp(c, "q(", 2) == 0) { /* Might be a 'const' function. Try to skip over the 'const' */ c = strchr(c, '.'); if (c) c++; else return 0; } if (strncmp(c, "f(", 2) == 0) { return 1; } return 0; } /* Create a list of parameters from the type t, using the file_line_node Node for * file and line numbering for the parameters */ ParmList *SwigType_function_parms(const SwigType *t, Node *file_line_node) { List *l = SwigType_parmlist(t); Hash *p, *pp = 0, *firstp = 0; Iterator o; for (o = First(l); o.item; o = Next(o)) { p = file_line_node ? NewParm(o.item, 0, file_line_node) : NewParmWithoutFileLineInfo(o.item, 0); if (!firstp) firstp = p; if (pp) { set_nextSibling(pp, p); Delete(p); } pp = p; } Delete(l); return firstp; } int SwigType_isvarargs(const SwigType *t) { if (Strcmp(t, "v(...)") == 0) return 1; return 0; } /* ----------------------------------------------------------------------------- * Templates * * SwigType_add_template() * * Template handling. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * SwigType_add_template() * * Adds a template to a type. This template is encoded in the SWIG type * mechanism and produces a string like this: * * vector ----> "vector<(p.int)>" * ----------------------------------------------------------------------------- */ SwigType *SwigType_add_template(SwigType *t, ParmList *parms) { Parm *p; Append(t, "<("); for (p = parms; p; p = nextSibling(p)) { String *v; if (Getattr(p, "default")) continue; if (p != parms) Append(t, ","); v = Getattr(p, "value"); if (v) { Append(t, v); } else { Append(t, Getattr(p, "type")); } } Append(t, ")>"); return t; } /* ----------------------------------------------------------------------------- * SwigType_templateprefix() * * Returns the prefix before the first template definition. * Returns the type unmodified if not a template. * For example: * * Foo<(p.int)>::bar => Foo * r.q(const).Foo<(p.int)>::bar => r.q(const).Foo * Foo => Foo * ----------------------------------------------------------------------------- */ String *SwigType_templateprefix(const SwigType *t) { const char *s = Char(t); const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : NewString(s); } /* ----------------------------------------------------------------------------- * SwigType_templatesuffix() * * Returns text after a template substitution. Used to handle scope names * for example: * * Foo<(p.int)>::bar * * returns "::bar" * ----------------------------------------------------------------------------- */ String *SwigType_templatesuffix(const SwigType *t) { const char *c; c = Char(t); while (*c) { if ((*c == '<') && (*(c + 1) == '(')) { int nest = 1; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } return NewString(c); } c++; } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_istemplate_templateprefix() * * Combines SwigType_istemplate and SwigType_templateprefix efficiently into one function. * Returns the prefix before the first template definition. * Returns NULL if not a template. * For example: * * Foo<(p.int)>::bar => Foo * r.q(const).Foo<(p.int)>::bar => r.q(const).Foo * Foo => NULL * ----------------------------------------------------------------------------- */ String *SwigType_istemplate_templateprefix(const SwigType *t) { const char *s = Char(t); const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : 0; } /* ----------------------------------------------------------------------------- * SwigType_istemplate_only_templateprefix() * * Similar to SwigType_istemplate_templateprefix() but only returns the template * prefix if the type is just the template and not a subtype/symbol within the template. * Returns NULL if not a template or is a template with a symbol within the template. * For example: * * Foo<(p.int)> => Foo * Foo<(p.int)>::bar => NULL * r.q(const).Foo<(p.int)> => r.q(const).Foo * r.q(const).Foo<(p.int)>::bar => NULL * Foo => NULL * ----------------------------------------------------------------------------- */ String *SwigType_istemplate_only_templateprefix(const SwigType *t) { int len = Len(t); const char *s = Char(t); if (len >= 4 && strcmp(s + len - 2, ")>") == 0) { const char *c = strstr(s, "<("); return c ? NewStringWithSize(s, (int)(c - s)) : 0; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_templateargs() * * Returns the template arguments * For example: * * Foo<(p.int)>::bar * * returns "<(p.int)>" * ----------------------------------------------------------------------------- */ String *SwigType_templateargs(const SwigType *t) { const char *c; const char *start; c = Char(t); while (*c) { if ((*c == '<') && (*(c + 1) == '(')) { int nest = 1; start = c; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } return NewStringWithSize(start, (int)(c - start)); } c++; } return 0; } /* ----------------------------------------------------------------------------- * SwigType_istemplate() * * Tests a type to see if it includes template parameters * ----------------------------------------------------------------------------- */ int SwigType_istemplate(const SwigType *t) { char *ct = Char(t); ct = strstr(ct, "<("); if (ct && (strstr(ct + 2, ")>"))) return 1; return 0; } /* ----------------------------------------------------------------------------- * SwigType_base() * * This function returns the base of a type. For example, if you have a * type "p.p.int", the function would return "int". * ----------------------------------------------------------------------------- */ SwigType *SwigType_base(const SwigType *t) { char *c; char *lastop = 0; c = Char(t); lastop = c; /* Search for the last type constructor separator '.' */ while (*c) { if (*c == '.') { if (*(c + 1)) { lastop = c + 1; } c++; continue; } if (*c == '<') { /* Skip over template---it's part of the base name */ int ntemp = 1; c++; while ((*c) && (ntemp > 0)) { if (*c == '>') ntemp--; else if (*c == '<') ntemp++; c++; } if (ntemp) break; continue; } if (*c == '(') { /* Skip over params */ int nparen = 1; c++; while ((*c) && (nparen > 0)) { if (*c == '(') nparen++; else if (*c == ')') nparen--; c++; } if (nparen) break; continue; } c++; } return NewString(lastop); } /* ----------------------------------------------------------------------------- * SwigType_prefix() * * Returns the prefix of a datatype. For example, the prefix of the * type "p.p.int" is "p.p.". * ----------------------------------------------------------------------------- */ String *SwigType_prefix(const SwigType *t) { char *c, *d; String *r = 0; c = Char(t); d = c + strlen(c); /* Check for a type constructor */ if ((d > c) && (*(d - 1) == '.')) d--; while (d > c) { d--; if (*d == '>') { int nest = 1; d--; while ((d > c) && (nest)) { if (*d == '>') nest++; if (*d == '<') nest--; d--; } } if (*d == ')') { /* Skip over params */ int nparen = 1; d--; while ((d > c) && (nparen)) { if (*d == ')') nparen++; if (*d == '(') nparen--; d--; } } if (*d == '.') { char t = *(d + 1); *(d + 1) = 0; r = NewString(c); *(d + 1) = t; return r; } } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_strip_qualifiers() * * Strip all qualifiers from a type and return a new type * ----------------------------------------------------------------------------- */ SwigType *SwigType_strip_qualifiers(const SwigType *t) { static Hash *memoize_stripped = 0; SwigType *r; List *l; Iterator ei; if (!memoize_stripped) memoize_stripped = NewHash(); r = Getattr(memoize_stripped, t); if (r) return Copy(r); l = SwigType_split(t); r = NewStringEmpty(); for (ei = First(l); ei.item; ei = Next(ei)) { if (SwigType_isqualifier(ei.item)) continue; Append(r, ei.item); } Delete(l); { String *key, *value; key = Copy(t); value = Copy(r); Setattr(memoize_stripped, key, value); Delete(key); Delete(value); } return r; } /* ----------------------------------------------------------------------------- * SwigType_strip_single_qualifier() * * If the type contains a qualifier, strip one qualifier and return a new type. * The left most qualifier is stripped first (when viewed as C source code) but * this is the equivalent to the right most qualifier using SwigType notation. * Example: * r.q(const).p.q(const).int => r.q(const).p.int * r.q(const).p.int => r.p.int * r.p.int => r.p.int * ----------------------------------------------------------------------------- */ SwigType *SwigType_strip_single_qualifier(const SwigType *t) { static Hash *memoize_stripped = 0; SwigType *r = 0; List *l; int numitems; if (!memoize_stripped) memoize_stripped = NewHash(); r = Getattr(memoize_stripped, t); if (r) return Copy(r); l = SwigType_split(t); numitems = Len(l); if (numitems >= 2) { int item; /* iterate backwards from last but one item */ for (item = numitems - 2; item >= 0; --item) { String *subtype = Getitem(l, item); if (SwigType_isqualifier(subtype)) { Iterator it; Delitem(l, item); r = NewStringEmpty(); for (it = First(l); it.item; it = Next(it)) { Append(r, it.item); } break; } } } if (!r) r = Copy(t); Delete(l); { String *key, *value; key = Copy(t); value = Copy(r); Setattr(memoize_stripped, key, value); Delete(key); Delete(value); } return r; } swig-3.0.12/Source/Swig/typesys.c0000664000175000017500000017004413042756442016500 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typesys.c * * SWIG type system management. These functions are used to manage * the C++ type system including typenames, typedef, type scopes, * inheritance, and namespaces. Generation of support code for the * run-time type checker is also handled here. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" /* ----------------------------------------------------------------------------- * Synopsis * * The purpose of this module is to manage type names and scoping issues related * to the C++ type system. The primary use is tracking typenames through typedef * and inheritance. * * New typenames are introduced by typedef, class, and enum declarations. * Each type is declared in a scope. This is either the global scope, a * class, or a namespace. For example: * * typedef int A; // Typename A, in global scope * namespace Foo { * typedef int A; // Typename A, in scope Foo:: * } * class Bar { // Typename Bar, in global scope * typedef int A; // Typename A, in scope Bar:: * } * * To manage scopes, the type system is constructed as a tree of hash tables. Each * hash table contains the following attributes: * * "name" - Scope name * "qname" - Fully qualified typename * "typetab" - Type table containing typenames and typedef information * "symtab" - Hash table of symbols defined in a scope * "inherit" - List of inherited scopes * "parent" - Parent scope * * Typedef information is stored in the "typetab" hash table. For example, * if you have these declarations: * * typedef int A; * typedef A B; * typedef B *C; * * typetab is built as follows: * * "A" : "int" * "B" : "A" * "C" : "p.B" * * To resolve a type back to its root type, one repeatedly expands on the type base. * For example: * * C *[40] ---> a(40).p.C (string type representation, see stype.c) * ---> a(40).p.p.B (C --> p.B) * ---> a(40).p.p.A (B --> A) * ---> a(40).p.p.int (A --> int) * * For inheritance, SWIG tries to resolve types back to the base class. For instance, if * you have this: * * class Foo { * public: * typedef int Integer; * }; * * class Bar : public Foo { * void blah(Integer x); * }; * * The argument type of Bar::blah will be set to Foo::Integer. * * The scope-inheritance mechanism is used to manage C++ namespace aliases. * For example, if you have this: * * namespace Foo { * typedef int Integer; * } * * namespace F = Foo; * * In this case, "F::" is defined as a scope that "inherits" from Foo. Internally, * "F::" will merely be an empty scope that refers to Foo. SWIG will never * place new type information into a namespace alias---attempts to do so * will generate a warning message (in the parser) and will place information into * Foo instead. * *----------------------------------------------------------------------------- */ static Typetab *current_scope = 0; /* Current type scope */ static Hash *current_typetab = 0; /* Current type table */ static Hash *current_symtab = 0; /* Current symbol table */ static Typetab *global_scope = 0; /* The global scope */ static Hash *scopes = 0; /* Hash table containing fully qualified scopes */ /* Performance optimization */ #define SWIG_TYPEDEF_RESOLVE_CACHE static Hash *typedef_resolve_cache = 0; static Hash *typedef_all_cache = 0; static Hash *typedef_qualified_cache = 0; static Typetab *SwigType_find_scope(Typetab *s, const SwigType *nameprefix); /* common attribute keys, to avoid calling find_key all the times */ /* Enable this one if your language fully support SwigValueWrapper. Leaving at '0' keeps the old swig behavior, which is not always safe, but is well known. Setting at '1' activates the new scheme, which is always safe but it requires all the typemaps to be ready for that. */ static int value_wrapper_mode = 0; int Swig_value_wrapper_mode(int mode) { value_wrapper_mode = mode; return mode; } static void flush_cache() { typedef_resolve_cache = 0; typedef_all_cache = 0; typedef_qualified_cache = 0; } /* Initialize the scoping system */ void SwigType_typesystem_init() { if (global_scope) Delete(global_scope); if (scopes) Delete(scopes); current_scope = NewHash(); global_scope = current_scope; Setattr(current_scope, "name", ""); /* No name for global scope */ current_typetab = NewHash(); Setattr(current_scope, "typetab", current_typetab); current_symtab = 0; scopes = NewHash(); Setattr(scopes, "", current_scope); } /* ----------------------------------------------------------------------------- * SwigType_typedef() * * Defines a new typedef in the current scope. Returns -1 if the type name is * already defined. * ----------------------------------------------------------------------------- */ int SwigType_typedef(const SwigType *type, const_String_or_char_ptr name) { if (Getattr(current_typetab, name)) return -1; /* Already defined */ if (Strcmp(type, name) == 0) { /* Can't typedef a name to itself */ return 0; } /* Check if 'type' is already a scope. If so, we create an alias in the type system for it. This is needed to make strange nested scoping problems work correctly. */ { Typetab *t = SwigType_find_scope(current_scope, type); if (t) { SwigType_new_scope(name); SwigType_inherit_scope(t); SwigType_pop_scope(); } } Setattr(current_typetab, name, type); flush_cache(); return 0; } /* ----------------------------------------------------------------------------- * SwigType_typedef_class() * * Defines a class in the current scope. * ----------------------------------------------------------------------------- */ int SwigType_typedef_class(const_String_or_char_ptr name) { String *cname; /* Printf(stdout,"class : '%s'\n", name); */ if (Getattr(current_typetab, name)) return -1; /* Already defined */ cname = NewString(name); Setmeta(cname, "class", "1"); Setattr(current_typetab, cname, cname); Delete(cname); flush_cache(); return 0; } /* ----------------------------------------------------------------------------- * SwigType_scope_name() * * Returns the qualified scope name of a type table * ----------------------------------------------------------------------------- */ String *SwigType_scope_name(Typetab *ttab) { String *qname = NewString(Getattr(ttab, "name")); ttab = Getattr(ttab, "parent"); while (ttab) { String *pname = Getattr(ttab, "name"); if (Len(pname)) { Insert(qname, 0, "::"); Insert(qname, 0, pname); } ttab = Getattr(ttab, "parent"); } return qname; } /* ----------------------------------------------------------------------------- * SwigType_new_scope() * * Creates a new scope * ----------------------------------------------------------------------------- */ void SwigType_new_scope(const_String_or_char_ptr name) { Typetab *s; Hash *ttab; String *qname; if (!name) { name = ""; } s = NewHash(); Setattr(s, "name", name); Setattr(s, "parent", current_scope); ttab = NewHash(); Setattr(s, "typetab", ttab); /* Build fully qualified name and */ qname = SwigType_scope_name(s); Setattr(scopes, qname, s); Setattr(s, "qname", qname); Delete(qname); current_scope = s; current_typetab = ttab; current_symtab = 0; flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_inherit_scope() * * Makes the current scope inherit from another scope. This is used for both * C++ class inheritance, namespaces, and namespace aliases. * ----------------------------------------------------------------------------- */ void SwigType_inherit_scope(Typetab *scope) { List *inherits; int i, len; inherits = Getattr(current_scope, "inherit"); if (!inherits) { inherits = NewList(); Setattr(current_scope, "inherit", inherits); Delete(inherits); } assert(scope != current_scope); len = Len(inherits); for (i = 0; i < len; i++) { Node *n = Getitem(inherits, i); if (n == scope) return; } Append(inherits, scope); } /* ----------------------------------------------------------------------------- * SwigType_scope_alias() * * Creates a scope-alias. * ----------------------------------------------------------------------------- */ void SwigType_scope_alias(String *aliasname, Typetab *ttab) { String *q; /* Printf(stdout,"alias: '%s' '%p'\n", aliasname, ttab); */ q = SwigType_scope_name(current_scope); if (Len(q)) { Append(q, "::"); } Append(q, aliasname); Setattr(scopes, q, ttab); flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_using_scope() * * Import another scope into this scope. * ----------------------------------------------------------------------------- */ void SwigType_using_scope(Typetab *scope) { SwigType_inherit_scope(scope); { List *ulist; int i, len; ulist = Getattr(current_scope, "using"); if (!ulist) { ulist = NewList(); Setattr(current_scope, "using", ulist); Delete(ulist); } assert(scope != current_scope); len = Len(ulist); for (i = 0; i < len; i++) { Typetab *n = Getitem(ulist, i); if (n == scope) return; } Append(ulist, scope); } flush_cache(); } /* ----------------------------------------------------------------------------- * SwigType_pop_scope() * * Pop off the last scope and perform a merge operation. Returns the hash * table for the scope that was popped off. * ----------------------------------------------------------------------------- */ Typetab *SwigType_pop_scope() { Typetab *t, *old = current_scope; t = Getattr(current_scope, "parent"); if (!t) t = global_scope; current_scope = t; current_typetab = Getattr(t, "typetab"); current_symtab = Getattr(t, "symtab"); flush_cache(); return old; } /* ----------------------------------------------------------------------------- * SwigType_set_scope() * * Set the scope. Returns the old scope. * ----------------------------------------------------------------------------- */ Typetab *SwigType_set_scope(Typetab *t) { Typetab *old = current_scope; if (!t) t = global_scope; current_scope = t; current_typetab = Getattr(t, "typetab"); current_symtab = Getattr(t, "symtab"); flush_cache(); return old; } /* ----------------------------------------------------------------------------- * SwigType_attach_symtab() * * Attaches a symbol table to a type scope * ----------------------------------------------------------------------------- */ void SwigType_attach_symtab(Symtab *sym) { Setattr(current_scope, "symtab", sym); current_symtab = sym; } /* ----------------------------------------------------------------------------- * SwigType_print_scope() * * Debugging function for printing out current scope * ----------------------------------------------------------------------------- */ void SwigType_print_scope(void) { Hash *ttab; Iterator i, j; Printf(stdout, "SCOPES start =======================================\n"); for (i = First(scopes); i.key; i = Next(i)) { Printf(stdout, "-------------------------------------------------------------\n"); ttab = Getattr(i.item, "typetab"); Printf(stdout, "Type scope '%s' (%p)\n", i.key, i.item); { List *inherit = Getattr(i.item, "inherit"); if (inherit) { Iterator j; for (j = First(inherit); j.item; j = Next(j)) { Printf(stdout, " Inherits from '%s' (%p)\n", Getattr(j.item, "qname"), j.item); } } } for (j = First(ttab); j.key; j = Next(j)) { Printf(stdout, "%40s -> %s\n", j.key, j.item); } } Printf(stdout, "SCOPES finish =======================================\n"); } static Typetab *SwigType_find_scope(Typetab *s, const SwigType *nameprefix) { Typetab *ss; Typetab *s_orig = s; String *nnameprefix = 0; static int check_parent = 1; if (Getmark(s)) return 0; Setmark(s, 1); if (SwigType_istemplate(nameprefix)) { nnameprefix = SwigType_typedef_resolve_all(nameprefix); nameprefix = nnameprefix; } ss = s; while (ss) { String *full; String *qname = Getattr(ss, "qname"); if (qname) { full = NewStringf("%s::%s", qname, nameprefix); } else { full = NewString(nameprefix); } if (Getattr(scopes, full)) { s = Getattr(scopes, full); } else { s = 0; } Delete(full); if (s) { if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return s; } if (!s) { /* Check inheritance */ List *inherit; inherit = Getattr(ss, "using"); if (inherit) { Typetab *ttab; int i, len; len = Len(inherit); for (i = 0; i < len; i++) { int oldcp = check_parent; ttab = Getitem(inherit, i); check_parent = 0; s = SwigType_find_scope(ttab, nameprefix); check_parent = oldcp; if (s) { if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return s; } } } } if (!check_parent) break; ss = Getattr(ss, "parent"); } if (nnameprefix) Delete(nnameprefix); Setmark(s_orig, 0); return 0; } /* ----------------------------------------------------------------------------- * typedef_resolve() * * Resolves a typedef and returns a new type string. Returns 0 if there is no * typedef mapping. base is a name without qualification. * Internal function. * ----------------------------------------------------------------------------- */ static Typetab *resolved_scope = 0; /* Internal function */ static SwigType *_typedef_resolve(Typetab *s, String *base, int look_parent) { Hash *ttab; SwigType *type = 0; List *inherit; Typetab *parent; /* if (!s) return 0; *//* now is checked bellow */ /* Printf(stdout,"Typetab %s : %s\n", Getattr(s,"name"), base); */ if (!Getmark(s)) { Setmark(s, 1); ttab = Getattr(s, "typetab"); type = Getattr(ttab, base); if (type) { resolved_scope = s; Setmark(s, 0); } else { /* Hmmm. Not found in my scope. It could be in an inherited scope */ inherit = Getattr(s, "inherit"); if (inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { type = _typedef_resolve(Getitem(inherit, i), base, 0); if (type) { Setmark(s, 0); break; } } } if (!type) { /* Hmmm. Not found in my scope. check parent */ if (look_parent) { parent = Getattr(s, "parent"); type = parent ? _typedef_resolve(parent, base, 1) : 0; } } Setmark(s, 0); } } return type; } /* ----------------------------------------------------------------------------- * template_parameters_resolve() * * For use with templates only. The template parameters are resolved. If none * of the parameters can be resolved, zero is returned. * ----------------------------------------------------------------------------- */ static String *template_parameters_resolve(const String *base) { List *tparms; String *suffix; String *type; int i, sz; int rep = 0; type = SwigType_templateprefix(base); suffix = SwigType_templatesuffix(base); Append(type, "<("); tparms = SwigType_parmlist(base); sz = Len(tparms); for (i = 0; i < sz; i++) { SwigType *tpr; SwigType *tp = Getitem(tparms, i); if (!rep) { tpr = SwigType_typedef_resolve(tp); } else { tpr = 0; } if (tpr) { Append(type, tpr); Delete(tpr); rep = 1; } else { Append(type, tp); } if ((i + 1) < sz) Append(type, ","); } Append(type, ")>"); Append(type, suffix); Delete(suffix); Delete(tparms); if (!rep) { Delete(type); type = 0; } return type; } static SwigType *typedef_resolve(Typetab *s, String *base) { return _typedef_resolve(s, base, 1); } /* ----------------------------------------------------------------------------- * SwigType_typedef_resolve() * ----------------------------------------------------------------------------- */ /* #define SWIG_DEBUG */ SwigType *SwigType_typedef_resolve(const SwigType *t) { String *base; String *type = 0; String *r = 0; Typetab *s; Hash *ttab; String *namebase = 0; String *nameprefix = 0, *rnameprefix = 0; int newtype = 0; resolved_scope = 0; #ifdef SWIG_TYPEDEF_RESOLVE_CACHE if (!typedef_resolve_cache) { typedef_resolve_cache = NewHash(); } r = Getattr(typedef_resolve_cache, t); if (r) { resolved_scope = Getmeta(r, "scope"); return Copy(r); } #endif base = SwigType_base(t); #ifdef SWIG_DEBUG Printf(stdout, "base = '%s' t='%s'\n", base, t); #endif if (SwigType_issimple(base)) { s = current_scope; ttab = current_typetab; if (strncmp(Char(base), "::", 2) == 0) { s = global_scope; ttab = Getattr(s, "typetab"); Delitem(base, 0); Delitem(base, 0); } /* Do a quick check in the local scope */ type = Getattr(ttab, base); if (type) { resolved_scope = s; } if (!type) { /* Didn't find in this scope. We need to do a little more searching */ if (Swig_scopename_check(base)) { /* A qualified name. */ Swig_scopename_split(base, &nameprefix, &namebase); #ifdef SWIG_DEBUG Printf(stdout, "nameprefix = '%s'\n", nameprefix); #endif if (nameprefix) { rnameprefix = SwigType_typedef_resolve(nameprefix); if(rnameprefix != NULL) { #ifdef SWIG_DEBUG Printf(stdout, "nameprefix '%s' is a typedef to '%s'\n", nameprefix, rnameprefix); #endif type = Copy(namebase); Insert(type, 0, "::"); Insert(type, 0, rnameprefix); if (strncmp(Char(type), "::", 2) == 0) { Delitem(type, 0); Delitem(type, 0); } newtype = 1; } else { /* Name had a prefix on it. See if we can locate the proper scope for it */ String *rnameprefix = template_parameters_resolve(nameprefix); nameprefix = rnameprefix ? Copy(rnameprefix) : nameprefix; Delete(rnameprefix); s = SwigType_find_scope(s, nameprefix); /* Couldn't locate a scope for the type. */ if (!s) { Delete(base); Delete(namebase); Delete(nameprefix); r = 0; goto return_result; } /* Try to locate the name starting in the scope */ #ifdef SWIG_DEBUG Printf(stdout, "namebase = '%s'\n", namebase); #endif type = typedef_resolve(s, namebase); if (type && resolved_scope) { /* we need to look for the resolved type, this will also fix the resolved_scope if 'type' and 'namebase' are declared in different scopes */ String *rtype = 0; rtype = typedef_resolve(resolved_scope, type); if (rtype) type = rtype; } #ifdef SWIG_DEBUG Printf(stdout, "%s type = '%s'\n", Getattr(s, "name"), type); #endif if ((type) && (!Swig_scopename_check(type)) && resolved_scope) { Typetab *rtab = resolved_scope; String *qname = Getattr(resolved_scope, "qname"); /* If qualified *and* the typename is defined from the resolved scope, we qualify */ if ((qname) && typedef_resolve(resolved_scope, type)) { type = Copy(type); Insert(type, 0, "::"); Insert(type, 0, qname); #ifdef SWIG_DEBUG Printf(stdout, "qual %s \n", type); #endif newtype = 1; } resolved_scope = rtab; } } } else { /* Name is unqualified. */ type = typedef_resolve(s, base); } } else { /* Name is unqualified. */ type = typedef_resolve(s, base); } } if (type && (Equal(base, type))) { if (newtype) Delete(type); Delete(base); Delete(namebase); Delete(nameprefix); r = 0; goto return_result; } /* If the type is a template, and no typedef was found, we need to check the template arguments one by one to see if they can be resolved. */ if (!type && SwigType_istemplate(base)) { newtype = 1; type = template_parameters_resolve(base); } if (namebase) Delete(namebase); if (nameprefix) Delete(nameprefix); } else { if (SwigType_isfunction(base)) { List *parms; int i, sz; int rep = 0; type = NewString("f("); newtype = 1; parms = SwigType_parmlist(base); sz = Len(parms); for (i = 0; i < sz; i++) { SwigType *tpr; SwigType *tp = Getitem(parms, i); if (!rep) { tpr = SwigType_typedef_resolve(tp); } else { tpr = 0; } if (tpr) { Append(type, tpr); Delete(tpr); rep = 1; } else { Append(type, tp); } if ((i + 1) < sz) Append(type, ","); } Append(type, ")."); Delete(parms); if (!rep) { Delete(type); type = 0; } } else if (SwigType_ismemberpointer(base)) { String *rt; String *mtype = SwigType_parm(base); rt = SwigType_typedef_resolve(mtype); if (rt) { type = NewStringf("m(%s).", rt); newtype = 1; Delete(rt); } Delete(mtype); } else { type = 0; } } r = SwigType_prefix(t); if (!type) { if (r && Len(r)) { char *cr = Char(r); if ((strstr(cr, "f(") || (strstr(cr, "m(")))) { SwigType *rt = SwigType_typedef_resolve(r); if (rt) { Delete(r); Append(rt, base); Delete(base); r = rt; goto return_result; } } } Delete(r); Delete(base); r = 0; goto return_result; } Delete(base); /* If 'type' is an array, then the right-most qualifier in 'r' should be added to 'type' after the array qualifier, so that given a(7).q(volatile).double myarray // typedef volatile double[7] myarray; the type q(const).myarray // const myarray becomes a(7).q(const volatile).double // const volatile double[7] and NOT q(const).a(7).q(volatile).double // non-sensical type */ if (r && Len(r) && SwigType_isarray(type)) { List *r_elem; String *r_qual; int r_sz; r_elem = SwigType_split(r); r_sz = Len(r_elem); r_qual = Getitem(r_elem, r_sz-1); if (SwigType_isqualifier(r_qual)) { String *new_r; String *new_type; List *type_elem; String *type_qual; String *r_qual_arg; int i, type_sz; type_elem = SwigType_split(type); type_sz = Len(type_elem); for (i = 0; i < type_sz; ++i) { String *e = Getitem(type_elem, i); if (!SwigType_isarray(e)) break; } type_qual = Copy(Getitem(type_elem, i)); r_qual_arg = SwigType_parm(r_qual); SwigType_add_qualifier(type_qual, r_qual_arg); Delete(r_qual_arg); Setitem(type_elem, i, type_qual); new_r = NewStringEmpty(); for (i = 0; i < r_sz-1; ++i) { Append(new_r, Getitem(r_elem, i)); } new_type = NewStringEmpty(); for (i = 0; i < type_sz; ++i) { Append(new_type, Getitem(type_elem, i)); } #ifdef SWIG_DEBUG Printf(stdout, "r+type='%s%s' new_r+new_type='%s%s'\n", r, type, new_r, new_type); #endif Delete(r); r = new_r; newtype = 1; type = new_type; Delete(type_elem); } Delete(r_elem); } Append(r, type); if (newtype) { Delete(type); } return_result: #ifdef SWIG_TYPEDEF_RESOLVE_CACHE { String *key = NewString(t); if (r) { SwigType *r1; Setattr(typedef_resolve_cache, key, r); Setmeta(r, "scope", resolved_scope); r1 = Copy(r); Delete(r); r = r1; } Delete(key); } #endif return r; } /* ----------------------------------------------------------------------------- * SwigType_typedef_resolve_all() * * Fully resolve a type down to its most basic datatype * ----------------------------------------------------------------------------- */ SwigType *SwigType_typedef_resolve_all(const SwigType *t) { SwigType *n; SwigType *r; int count = 0; /* Check to see if the typedef resolve has been done before by checking the cache */ if (!typedef_all_cache) { typedef_all_cache = NewHash(); } r = Getattr(typedef_all_cache, t); if (r) { return Copy(r); } /* Recursively resolve the typedef */ r = NewString(t); while ((n = SwigType_typedef_resolve(r))) { Delete(r); r = n; if (++count >= 512) { Swig_error(Getfile(t), Getline(t), "Recursive typedef detected resolving '%s' to '%s' to '%s' and so on...\n", SwigType_str(t, 0), SwigType_str(SwigType_typedef_resolve(t), 0), SwigType_str(SwigType_typedef_resolve(SwigType_typedef_resolve(t)), 0)); break; } } /* Add the typedef to the cache for next time it is looked up */ { String *key; SwigType *rr = Copy(r); key = NewString(t); Setattr(typedef_all_cache, key, rr); Delete(key); Delete(rr); } return r; } /* ----------------------------------------------------------------------------- * SwigType_typedef_qualified() * * Given a type declaration, this function tries to fully qualify it according to * typedef scope rules. * If the unary scope operator (::) is used as a prefix to the type to denote global * scope, it is left in place. * ----------------------------------------------------------------------------- */ SwigType *SwigType_typedef_qualified(const SwigType *t) { List *elements; String *result; int i, len; if (!typedef_qualified_cache) typedef_qualified_cache = NewHash(); result = Getattr(typedef_qualified_cache, t); if (result) { String *rc = Copy(result); return rc; } result = NewStringEmpty(); elements = SwigType_split(t); len = Len(elements); for (i = 0; i < len; i++) { String *ty = 0; String *e = Getitem(elements, i); if (SwigType_issimple(e)) { if (!SwigType_istemplate(e)) { String *isenum = 0; if (SwigType_isenum(e)) { isenum = NewString("enum "); ty = NewString(Char(e) + 5); e = ty; } resolved_scope = 0; if (typedef_resolve(current_scope, e) && resolved_scope) { /* resolved_scope contains the scope that actually resolved the symbol */ String *qname = Getattr(resolved_scope, "qname"); if (qname) { Insert(e, 0, "::"); Insert(e, 0, qname); } } else { if (Swig_scopename_check(e)) { String *qlast; String *qname; Swig_scopename_split(e, &qname, &qlast); if (qname) { String *tqname = SwigType_typedef_qualified(qname); Clear(e); Printf(e, "%s::%s", tqname, qlast); Delete(qname); Delete(tqname); } Delete(qlast); /* Automatic template instantiation might go here??? */ } else { /* It's a bare name. It's entirely possible, that the name is part of a namespace. We'll check this by unrolling out of the current scope */ Typetab *cs = current_scope; while (cs) { String *qs = SwigType_scope_name(cs); if (Len(qs)) { Append(qs, "::"); } Append(qs, e); if (Getattr(scopes, qs)) { Clear(e); Append(e, qs); Delete(qs); break; } Delete(qs); cs = Getattr(cs, "parent"); } } } if (isenum) { Insert(e, 0, isenum); Delete(isenum); } } else { /* Template. We need to qualify template parameters as well as the template itself */ String *tprefix, *qprefix; String *tsuffix; Iterator pi; Parm *p; List *parms; ty = Swig_symbol_template_deftype(e, current_symtab); /* String *dt = Swig_symbol_template_deftype(e, current_symtab); ty = Swig_symbol_type_qualify(dt, 0); */ e = ty; parms = SwigType_parmlist(e); tprefix = SwigType_templateprefix(e); tsuffix = SwigType_templatesuffix(e); qprefix = SwigType_typedef_qualified(tprefix); Append(qprefix, "<("); pi = First(parms); while ((p = pi.item)) { String *qt = SwigType_typedef_qualified(p); if (Equal(qt, p)) { /* && (!Swig_scopename_check(qt))) */ /* No change in value. It is entirely possible that the parameter is an integer value. If there is a symbol table associated with this scope, we're going to check for this */ if (current_symtab) { Node *lastnode = 0; String *value = Copy(p); while (1) { Node *n = Swig_symbol_clookup(value, current_symtab); if (n == lastnode) break; lastnode = n; if (n) { char *ntype = Char(nodeType(n)); if (strcmp(ntype, "enumitem") == 0) { /* An enum item. Generate a fully qualified name */ String *qn = Swig_symbol_qualified(n); if (Len(qn)) { Append(qn, "::"); Append(qn, Getattr(n, "name")); Delete(value); value = qn; continue; } else { Delete(qn); break; } } else if ((strcmp(ntype, "cdecl") == 0) && (Getattr(n, "value"))) { Delete(value); value = Copy(Getattr(n, "value")); continue; } } break; } Append(qprefix, value); Delete(value); } else { Append(qprefix, p); } } else { Append(qprefix, qt); } Delete(qt); pi = Next(pi); if (pi.item) { Append(qprefix, ","); } } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(tsuffix); Clear(e); Append(e, qprefix); Delete(tprefix); Delete(qprefix); Delete(parms); /* Delete(dt); */ } Append(result, e); Delete(ty); } else if (SwigType_isfunction(e)) { List *parms = SwigType_parmlist(e); String *s = NewString("f("); Iterator pi; pi = First(parms); while (pi.item) { String *pq = SwigType_typedef_qualified(pi.item); Append(s, pq); Delete(pq); pi = Next(pi); if (pi.item) { Append(s, ","); } } Append(s, ")."); Append(result, s); Delete(s); Delete(parms); } else if (SwigType_isarray(e)) { String *ndim; String *dim = SwigType_parm(e); ndim = Swig_symbol_string_qualify(dim, 0); Printf(result, "a(%s).", ndim); Delete(dim); Delete(ndim); } else { Append(result, e); } } Delete(elements); { String *key, *cresult; key = NewString(t); cresult = NewString(result); Setattr(typedef_qualified_cache, key, cresult); Delete(key); Delete(cresult); } return result; } /* ----------------------------------------------------------------------------- * SwigType_istypedef() * * Checks a typename to see if it is a typedef. * ----------------------------------------------------------------------------- */ int SwigType_istypedef(const SwigType *t) { String *type; type = SwigType_typedef_resolve(t); if (type) { Delete(type); return 1; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_typedef_using() * * Processes a 'using' declaration to import types from one scope into another. * Name is a qualified name like A::B. * ----------------------------------------------------------------------------- */ int SwigType_typedef_using(const_String_or_char_ptr name) { String *base; String *td; String *prefix; Typetab *s; Typetab *tt = 0; String *defined_name = 0; /* Printf(stdout,"using %s\n", name); */ if (!Swig_scopename_check(name)) return -1; /* Not properly qualified */ base = Swig_scopename_last(name); /* See if the base is already defined in this scope */ if (Getattr(current_typetab, base)) { Delete(base); return -1; } /* See if the using name is a scope */ /* tt = SwigType_find_scope(current_scope,name); Printf(stdout,"tt = %p, name = '%s'\n", tt, name); */ /* We set up a typedef B --> A::B */ Setattr(current_typetab, base, name); /* Find the scope name where the symbol is defined */ td = SwigType_typedef_resolve(name); /* Printf(stdout,"td = '%s' %p\n", td, resolved_scope); */ if (resolved_scope) { defined_name = Getattr(resolved_scope, "qname"); if (defined_name) { defined_name = Copy(defined_name); Append(defined_name, "::"); Append(defined_name, base); /* Printf(stdout,"defined_name = '%s'\n", defined_name); */ tt = SwigType_find_scope(current_scope, defined_name); } } if (td) Delete(td); /* Figure out the scope the using directive refers to */ { prefix = Swig_scopename_prefix(name); if (prefix) { s = SwigType_find_scope(current_scope, prefix); if (s) { Hash *ttab = Getattr(s, "typetab"); if (!Getattr(ttab, base) && defined_name) { Setattr(ttab, base, defined_name); } } } } if (tt) { /* Using directive had its own scope. We need to create a new scope for it */ SwigType_new_scope(base); SwigType_inherit_scope(tt); SwigType_pop_scope(); } if (defined_name) Delete(defined_name); Delete(prefix); Delete(base); return 0; } /* ----------------------------------------------------------------------------- * SwigType_isclass() * * Determines if a type defines a class or not. A class is defined by * its type-table entry maps to itself. Note: a pointer to a class is not * a class. * ----------------------------------------------------------------------------- */ int SwigType_isclass(const SwigType *t) { SwigType *qty, *qtys; int isclass = 0; qty = SwigType_typedef_resolve_all(t); qtys = SwigType_strip_qualifiers(qty); if (SwigType_issimple(qtys)) { String *td = SwigType_typedef_resolve(qtys); if (td) { Delete(td); } if (resolved_scope) { isclass = 1; } /* Hmmm. Not a class. If a template, it might be uninstantiated */ if (!isclass) { String *tp = SwigType_istemplate_templateprefix(qtys); if (tp && Strcmp(tp, t) != 0) { isclass = SwigType_isclass(tp); } Delete(tp); } } Delete(qty); Delete(qtys); return isclass; } /* ----------------------------------------------------------------------------- * SwigType_type() * * Returns an integer code describing the datatype. This is only used for * compatibility with SWIG1.1 language modules and is likely to go away once * everything is based on typemaps. * ----------------------------------------------------------------------------- */ int SwigType_type(const SwigType *t) { char *c; /* Check for the obvious stuff */ c = Char(t); if (strncmp(c, "p.", 2) == 0) { if (SwigType_type(c + 2) == T_CHAR) return T_STRING; else if (SwigType_type(c + 2) == T_WCHAR) return T_WSTRING; else return T_POINTER; } if (strncmp(c, "a(", 2) == 0) return T_ARRAY; if (strncmp(c, "r.", 2) == 0) return T_REFERENCE; if (strncmp(c, "z.", 2) == 0) return T_RVALUE_REFERENCE; if (strncmp(c, "m(", 2) == 0) return T_MPOINTER; if (strncmp(c, "q(", 2) == 0) { while (*c && (*c != '.')) c++; if (*c) return SwigType_type(c + 1); return T_ERROR; } if (strncmp(c, "f(", 2) == 0) return T_FUNCTION; /* Look for basic types */ if (strcmp(c, "int") == 0) return T_INT; if (strcmp(c, "long") == 0) return T_LONG; if (strcmp(c, "short") == 0) return T_SHORT; if (strcmp(c, "unsigned") == 0) return T_UINT; if (strcmp(c, "unsigned short") == 0) return T_USHORT; if (strcmp(c, "unsigned long") == 0) return T_ULONG; if (strcmp(c, "unsigned int") == 0) return T_UINT; if (strcmp(c, "char") == 0) return T_CHAR; if (strcmp(c, "signed char") == 0) return T_SCHAR; if (strcmp(c, "unsigned char") == 0) return T_UCHAR; if (strcmp(c, "wchar_t") == 0) return T_WCHAR; if (strcmp(c, "float") == 0) return T_FLOAT; if (strcmp(c, "double") == 0) return T_DOUBLE; if (strcmp(c, "long double") == 0) return T_LONGDOUBLE; if (!cparse_cplusplus && (strcmp(c, "float complex") == 0)) return T_FLTCPLX; if (!cparse_cplusplus && (strcmp(c, "double complex") == 0)) return T_DBLCPLX; if (!cparse_cplusplus && (strcmp(c, "complex") == 0)) return T_COMPLEX; if (strcmp(c, "void") == 0) return T_VOID; if (strcmp(c, "bool") == 0) return T_BOOL; if (strcmp(c, "long long") == 0) return T_LONGLONG; if (strcmp(c, "unsigned long long") == 0) return T_ULONGLONG; if (strncmp(c, "enum ", 5) == 0) return T_INT; if (strcmp(c, "auto") == 0) return T_AUTO; if (strcmp(c, "v(...)") == 0) return T_VARARGS; /* Hmmm. Unknown type */ if (SwigType_istypedef(t)) { int r; SwigType *nt = SwigType_typedef_resolve(t); r = SwigType_type(nt); Delete(nt); return r; } return T_USER; } /* ----------------------------------------------------------------------------- * SwigType_alttype() * * Returns the alternative value type needed in C++ for class value * types. When swig is not sure about using a plain $ltype value, * since the class doesn't have a default constructor, or it can't be * assigned, you will get back 'SwigValueWrapper'. * * This is the default behavior unless: * * 1.- swig detects a default_constructor and 'setallocate:default_constructor' * attribute. * * 2.- swig doesn't mark 'type' as non-assignable. * * 3.- the user specifies that the value wrapper is not needed by using * %feature("novaluewrapper") like so: * * %feature("novaluewrapper") MyOpaqueClass; * class MyOpaqueClass; * * The user can also force the use of the value wrapper with * %feature("valuewrapper"). * ----------------------------------------------------------------------------- */ SwigType *SwigType_alttype(const SwigType *t, int local_tmap) { Node *n; SwigType *w = 0; int use_wrapper = 0; SwigType *td = 0; if (!cparse_cplusplus) return 0; if (value_wrapper_mode == 0) { /* old partial use of SwigValueTypes, it can fail for opaque types */ if (local_tmap) return 0; if (SwigType_isclass(t)) { SwigType *ftd = SwigType_typedef_resolve_all(t); td = SwigType_strip_qualifiers(ftd); Delete(ftd); n = Swig_symbol_clookup(td, 0); if (n) { if (GetFlag(n, "feature:valuewrapper")) { use_wrapper = 1; } else { if (Checkattr(n, "nodeType", "class") && (!Getattr(n, "allocate:default_constructor") || (Getattr(n, "allocate:noassign")))) { use_wrapper = !GetFlag(n, "feature:novaluewrapper") || GetFlag(n, "feature:nodefault"); } } } else { if (SwigType_issimple(td) && SwigType_istemplate(td)) { use_wrapper = !n || !GetFlag(n, "feature:novaluewrapper"); } } } } else { /* safe use of SwigValueTypes, it can fail with some typemaps */ SwigType *ftd = SwigType_typedef_resolve_all(t); td = SwigType_strip_qualifiers(ftd); Delete(ftd); if (SwigType_type(td) == T_USER) { use_wrapper = 1; n = Swig_symbol_clookup(td, 0); if (n) { if ((Checkattr(n, "nodeType", "class") && !Getattr(n, "allocate:noassign") && (Getattr(n, "allocate:default_constructor"))) || (GetFlag(n, "feature:novaluewrapper"))) { use_wrapper = GetFlag(n, "feature:valuewrapper"); } } } } if (use_wrapper) { /* Need a space before the type in case it starts "::" (since the <: * token is a digraph for [ in C++. Also need a space after the * type in case it ends with ">" since then we form the token ">>". */ w = NewStringf("SwigValueWrapper< %s >", td); } Delete(td); return w; } /* ---------------------------------------------------------------------------- * * * * WARNING * * * *** * *** * Don't even think about modifying anything below this line unless you *** * are completely on top of *EVERY* subtle aspect of the C++ type system *** * and you are prepared to suffer endless hours of agony trying to *** * debug the SWIG run-time type checker after you break it. *** * ------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * SwigType_remember() * * This function "remembers" a datatype that was used during wrapper code generation * so that a type-checking table can be generated later on. It is up to the language * modules to actually call this function--it is not done automatically. * * Type tracking is managed through two separate hash tables. The hash 'r_mangled' * is mapping between mangled type names (used in the target language) and * fully-resolved C datatypes used in the source input. The second hash 'r_resolved' * is the inverse mapping that maps fully-resolved C datatypes to all of the mangled * names in the scripting languages. For example, consider the following set of * typedef declarations: * * typedef double Real; * typedef double Float; * typedef double Point[3]; * * Now, suppose that the types 'double *', 'Real *', 'Float *', 'double[3]', and * 'Point' were used in an interface file and "remembered" using this function. * The hash tables would look like this: * * r_mangled { * _p_double : [ p.double, a(3).double ] * _p_Real : [ p.double ] * _p_Float : [ p.double ] * _Point : [ a(3).double ] * * r_resolved { * p.double : [ _p_double, _p_Real, _p_Float ] * a(3).double : [ _p_double, _Point ] * } * * Together these two hash tables can be used to determine type-equivalency between * mangled typenames. To do this, we view the two hash tables as a large graph and * compute the transitive closure. * ----------------------------------------------------------------------------- */ static Hash *r_mangled = 0; /* Hash mapping mangled types to fully resolved types */ static Hash *r_resolved = 0; /* Hash mapping resolved types to mangled types */ static Hash *r_ltype = 0; /* Hash mapping mangled names to their local c type */ static Hash *r_clientdata = 0; /* Hash mapping resolved types to client data */ static Hash *r_mangleddata = 0; /* Hash mapping mangled types to client data */ static Hash *r_remembered = 0; /* Hash of types we remembered already */ static void (*r_tracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; void SwigType_remember_mangleddata(String *mangled, const_String_or_char_ptr clientdata) { if (!r_mangleddata) { r_mangleddata = NewHash(); } Setattr(r_mangleddata, mangled, clientdata); } void SwigType_remember_clientdata(const SwigType *t, const_String_or_char_ptr clientdata) { String *mt; SwigType *lt; Hash *h; SwigType *fr; SwigType *qr; String *tkey; String *cd; Hash *lthash; if (!r_mangled) { r_mangled = NewHash(); r_resolved = NewHash(); r_ltype = NewHash(); r_clientdata = NewHash(); r_remembered = NewHash(); } { String *last; last = Getattr(r_remembered, t); if (last && (Cmp(last, clientdata) == 0)) return; } tkey = Copy(t); cd = clientdata ? NewString(clientdata) : NewStringEmpty(); Setattr(r_remembered, tkey, cd); Delete(tkey); Delete(cd); mt = SwigType_manglestr(t); /* Create mangled string */ if (r_tracefunc) { (*r_tracefunc) (t, mt, (String *) clientdata); } if (SwigType_istypedef(t)) { lt = Copy(t); } else { lt = SwigType_ltype(t); } lthash = Getattr(r_ltype, mt); if (!lthash) { lthash = NewHash(); Setattr(r_ltype, mt, lthash); } Setattr(lthash, lt, "1"); Delete(lt); fr = SwigType_typedef_resolve_all(t); /* Create fully resolved type */ qr = SwigType_typedef_qualified(fr); Delete(fr); /* Added to deal with possible table bug */ fr = SwigType_strip_qualifiers(qr); Delete(qr); /*Printf(stdout,"t = '%s'\n", t); Printf(stdout,"fr= '%s'\n\n", fr); */ if (t) { char *ct = Char(t); if (strchr(ct, '<') && !(strstr(ct, "<("))) { Printf(stdout, "Bad template type passed to SwigType_remember: %s\n", t); assert(0); } } h = Getattr(r_mangled, mt); if (!h) { h = NewHash(); Setattr(r_mangled, mt, h); Delete(h); } Setattr(h, fr, mt); h = Getattr(r_resolved, fr); if (!h) { h = NewHash(); Setattr(r_resolved, fr, h); Delete(h); } Setattr(h, mt, fr); if (clientdata) { String *cd = Getattr(r_clientdata, fr); if (cd) { if (Strcmp(clientdata, cd) != 0) { Printf(stderr, "*** Internal error. Inconsistent clientdata for type '%s'\n", SwigType_str(fr, 0)); Printf(stderr, "*** '%s' != '%s'\n", clientdata, cd); assert(0); } } else { String *cstr = NewString(clientdata); Setattr(r_clientdata, fr, cstr); Delete(cstr); } } /* If the remembered type is a reference, we also remember the pointer version. This is to prevent odd problems with mixing pointers and references--especially when different functions are using different typenames (via typedef). */ if (SwigType_isreference(t)) { SwigType *tt = Copy(t); SwigType_del_reference(tt); SwigType_add_pointer(tt); SwigType_remember_clientdata(tt, clientdata); } else if (SwigType_isrvalue_reference(t)) { SwigType *tt = Copy(t); SwigType_del_rvalue_reference(tt); SwigType_add_pointer(tt); SwigType_remember_clientdata(tt, clientdata); } } void SwigType_remember(const SwigType *ty) { SwigType_remember_clientdata(ty, 0); } void (*SwigType_remember_trace(void (*tf) (const SwigType *, String *, String *))) (const SwigType *, String *, String *) { void (*o) (const SwigType *, String *, String *) = r_tracefunc; r_tracefunc = tf; return o; } /* ----------------------------------------------------------------------------- * SwigType_equivalent_mangle() * * Return a list of all of the mangled typenames that are equivalent to another * mangled name. This works as follows: For each fully qualified C datatype * in the r_mangled hash entry, we collect all of the mangled names from the * r_resolved hash and combine them together in a list (removing duplicate entries). * ----------------------------------------------------------------------------- */ List *SwigType_equivalent_mangle(String *ms, Hash *checked, Hash *found) { List *l; Hash *h; Hash *ch; Hash *mh; if (found) { h = found; } else { h = NewHash(); } if (checked) { ch = checked; } else { ch = NewHash(); } if (Getattr(ch, ms)) goto check_exit; /* Already checked this type */ Setattr(h, ms, "1"); Setattr(ch, ms, "1"); mh = Getattr(r_mangled, ms); if (mh) { Iterator ki; ki = First(mh); while (ki.key) { Hash *rh; if (Getattr(ch, ki.key)) { ki = Next(ki); continue; } Setattr(ch, ki.key, "1"); rh = Getattr(r_resolved, ki.key); if (rh) { Iterator rk; rk = First(rh); while (rk.key) { Setattr(h, rk.key, "1"); SwigType_equivalent_mangle(rk.key, ch, h); rk = Next(rk); } } ki = Next(ki); } } check_exit: if (!found) { l = Keys(h); Delete(h); Delete(ch); return l; } else { return 0; } } /* ----------------------------------------------------------------------------- * SwigType_clientdata_collect() * * Returns the clientdata field for a mangled type-string. * ----------------------------------------------------------------------------- */ static String *SwigType_clientdata_collect(String *ms) { Hash *mh; String *clientdata = 0; if (r_mangleddata) { clientdata = Getattr(r_mangleddata, ms); if (clientdata) return clientdata; } mh = Getattr(r_mangled, ms); if (mh) { Iterator ki; ki = First(mh); while (ki.key) { clientdata = Getattr(r_clientdata, ki.key); if (clientdata) break; ki = Next(ki); } } return clientdata; } /* ----------------------------------------------------------------------------- * SwigType_inherit() * * Record information about inheritance. We keep a hash table that keeps * a mapping between base classes and all of the classes that are derived * from them. * * subclass is a hash that maps base-classes to all of the classes derived from them. * * derived - name of derived class * base - name of base class * cast - additional casting code when casting from derived to base * conversioncode - if set, overrides the default code in the function when casting * from derived to base * ----------------------------------------------------------------------------- */ static Hash *subclass = 0; static Hash *conversions = 0; void SwigType_inherit(String *derived, String *base, String *cast, String *conversioncode) { Hash *h; String *dd = 0; String *bb = 0; if (!subclass) subclass = NewHash(); /* Printf(stdout,"'%s' --> '%s' '%s'\n", derived, base, cast); */ if (SwigType_istemplate(derived)) { String *ty = SwigType_typedef_resolve_all(derived); dd = SwigType_typedef_qualified(ty); derived = dd; Delete(ty); } if (SwigType_istemplate(base)) { String *ty = SwigType_typedef_resolve_all(base); bb = SwigType_typedef_qualified(ty); base = bb; Delete(ty); } /* Printf(stdout,"'%s' --> '%s' '%s'\n", derived, base, cast); */ h = Getattr(subclass, base); if (!h) { h = NewHash(); Setattr(subclass, base, h); Delete(h); } if (!Getattr(h, derived)) { Hash *c = NewHash(); if (cast) Setattr(c, "cast", cast); if (conversioncode) Setattr(c, "convcode", conversioncode); Setattr(h, derived, c); Delete(c); } Delete(dd); Delete(bb); } /* ----------------------------------------------------------------------------- * SwigType_issubtype() * * Determines if a t1 is a subtype of t2, ie, is t1 derived from t2 * ----------------------------------------------------------------------------- */ int SwigType_issubtype(const SwigType *t1, const SwigType *t2) { SwigType *ft1, *ft2; String *b1, *b2; Hash *h; int r = 0; if (!subclass) return 0; ft1 = SwigType_typedef_resolve_all(t1); ft2 = SwigType_typedef_resolve_all(t2); b1 = SwigType_base(ft1); b2 = SwigType_base(ft2); h = Getattr(subclass, b2); if (h) { if (Getattr(h, b1)) { r = 1; } } Delete(ft1); Delete(ft2); Delete(b1); Delete(b2); /* Printf(stdout, "issubtype(%s,%s) --> %d\n", t1, t2, r); */ return r; } /* ----------------------------------------------------------------------------- * SwigType_inherit_equiv() * * Modify the type table to handle C++ inheritance * ----------------------------------------------------------------------------- */ void SwigType_inherit_equiv(File *out) { String *ckey; String *prefix, *base; String *mprefix, *mkey; Hash *sub; Hash *rh; List *rlist; Iterator rk, bk, ck; if (!conversions) conversions = NewHash(); if (!subclass) subclass = NewHash(); rk = First(r_resolved); while (rk.key) { /* rkey is a fully qualified type. We strip all of the type constructors off of it just to get the base */ base = SwigType_base(rk.key); /* Check to see whether the base is recorded in the subclass table */ sub = Getattr(subclass, base); Delete(base); if (!sub) { rk = Next(rk); continue; } /* This type has subclasses. We now need to walk through these subtypes and generate pointer conversion functions */ rh = Getattr(r_resolved, rk.key); rlist = NewList(); for (ck = First(rh); ck.key; ck = Next(ck)) { Append(rlist, ck.key); } /* Printf(stdout,"rk.key = '%s'\n", rk.key); Printf(stdout,"rh = %p '%s'\n", rh,rh); */ bk = First(sub); while (bk.key) { prefix = SwigType_prefix(rk.key); Append(prefix, bk.key); /* Printf(stdout,"set %p = '%s' : '%s'\n", rh, SwigType_manglestr(prefix),prefix); */ mprefix = SwigType_manglestr(prefix); Setattr(rh, mprefix, prefix); mkey = SwigType_manglestr(rk.key); ckey = NewStringf("%s+%s", mprefix, mkey); if (!Getattr(conversions, ckey)) { String *convname = NewStringf("%sTo%s", mprefix, mkey); String *lkey = SwigType_lstr(rk.key, 0); String *lprefix = SwigType_lstr(prefix, 0); Hash *subhash = Getattr(sub, bk.key); String *convcode = Getattr(subhash, "convcode"); if (convcode) { char *newmemoryused = Strstr(convcode, "newmemory"); /* see if newmemory parameter is used in order to avoid unused parameter warnings */ String *fn = Copy(convcode); Replaceall(fn, "$from", "x"); Printf(out, "static void *%s(void *x, int *%s) {", convname, newmemoryused ? "newmemory" : "SWIGUNUSEDPARM(newmemory)"); Printf(out, "%s", fn); } else { String *cast = Getattr(subhash, "cast"); Printf(out, "static void *%s(void *x, int *SWIGUNUSEDPARM(newmemory)) {", convname); Printf(out, "\n return (void *)((%s) ", lkey); if (cast) Printf(out, "%s", cast); Printf(out, " ((%s) x));\n", lprefix); } Printf(out, "}\n"); Setattr(conversions, ckey, convname); Delete(ckey); Delete(lkey); Delete(lprefix); /* This inserts conversions for typedefs */ { Hash *r = Getattr(r_resolved, prefix); if (r) { Iterator rrk; rrk = First(r); while (rrk.key) { Iterator rlk; String *rkeymangle; /* Make sure this name equivalence is not due to inheritance */ if (Cmp(prefix, Getattr(r, rrk.key)) == 0) { rkeymangle = Copy(mkey); ckey = NewStringf("%s+%s", rrk.key, rkeymangle); if (!Getattr(conversions, ckey)) { Setattr(conversions, ckey, convname); } Delete(ckey); for (rlk = First(rlist); rlk.item; rlk = Next(rlk)) { ckey = NewStringf("%s+%s", rrk.key, rlk.item); Setattr(conversions, ckey, convname); Delete(ckey); } Delete(rkeymangle); /* This is needed to pick up other alternative names for the same type. Needed to make templates work */ Setattr(rh, rrk.key, rrk.item); } rrk = Next(rrk); } } } Delete(convname); } Delete(prefix); Delete(mprefix); Delete(mkey); bk = Next(bk); } rk = Next(rk); Delete(rlist); } } /* Helper function to sort the mangled list */ static int SwigType_compare_mangled(const DOH *a, const DOH *b) { return strcmp((char *) Data(a), (char *) Data(b)); } /* ----------------------------------------------------------------------------- * SwigType_get_sorted_mangled_list() * * Returns the sorted list of mangled type names that should be exported into the * wrapper file. * ----------------------------------------------------------------------------- */ List *SwigType_get_sorted_mangled_list() { List *l = Keys(r_mangled); SortList(l, SwigType_compare_mangled); return l; } /* ----------------------------------------------------------------------------- * SwigType_type_table() * * Generate the type-table for the type-checker. * ----------------------------------------------------------------------------- */ void SwigType_emit_type_table(File *f_forward, File *f_table) { Iterator ki; String *types, *table, *cast, *cast_init, *cast_temp; Hash *imported_types; List *mangled_list; List *table_list = NewList(); int i = 0; if (!r_mangled) { r_mangled = NewHash(); r_resolved = NewHash(); } Printf(f_table, "\n/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */\n\n"); SwigType_inherit_equiv(f_table); /*#define DEBUG 1*/ #ifdef DEBUG Printf(stdout, "---r_mangled---\n"); Printf(stdout, "%s\n", r_mangled); Printf(stdout, "---r_resolved---\n"); Printf(stdout, "%s\n", r_resolved); Printf(stdout, "---r_ltype---\n"); Printf(stdout, "%s\n", r_ltype); Printf(stdout, "---subclass---\n"); Printf(stdout, "%s\n", subclass); Printf(stdout, "---conversions---\n"); Printf(stdout, "%s\n", conversions); Printf(stdout, "---r_clientdata---\n"); Printf(stdout, "%s\n", r_clientdata); #endif table = NewStringEmpty(); types = NewStringEmpty(); cast = NewStringEmpty(); cast_init = NewStringEmpty(); imported_types = NewHash(); Printf(table, "static swig_type_info *swig_type_initial[] = {\n"); Printf(cast_init, "static swig_cast_info *swig_cast_initial[] = {\n"); Printf(f_forward, "\n/* -------- TYPES TABLE (BEGIN) -------- */\n\n"); mangled_list = SwigType_get_sorted_mangled_list(); for (ki = First(mangled_list); ki.item; ki = Next(ki)) { List *el; Iterator ei; SwigType *lt; SwigType *rt = 0; String *nt; String *ln; String *rn; const String *cd; Hash *lthash; Iterator ltiter; Hash *nthash; cast_temp = NewStringEmpty(); Printv(types, "static swig_type_info _swigt_", ki.item, " = {", NIL); Append(table_list, ki.item); Printf(cast_temp, "static swig_cast_info _swigc_%s[] = {", ki.item); i++; cd = SwigType_clientdata_collect(ki.item); if (!cd) cd = "0"; lthash = Getattr(r_ltype, ki.item); nt = 0; nthash = NewHash(); ltiter = First(lthash); while (ltiter.key) { lt = ltiter.key; rt = SwigType_typedef_resolve_all(lt); /* we save the original type and the fully resolved version */ ln = SwigType_lstr(lt, 0); rn = SwigType_lstr(rt, 0); if (Equal(ln, rn)) { Setattr(nthash, ln, "1"); } else { Setattr(nthash, rn, "1"); Setattr(nthash, ln, "1"); } if (SwigType_istemplate(rt)) { String *dt = Swig_symbol_template_deftype(rt, 0); String *dn = SwigType_lstr(dt, 0); if (!Equal(dn, rn) && !Equal(dn, ln)) { Setattr(nthash, dn, "1"); } Delete(dt); Delete(dn); } ltiter = Next(ltiter); } /* now build nt */ ltiter = First(nthash); nt = 0; while (ltiter.key) { if (nt) { Printf(nt, "|%s", ltiter.key); } else { nt = NewString(ltiter.key); } ltiter = Next(ltiter); } Delete(nthash); Printf(types, "\"%s\", \"%s\", 0, 0, (void*)%s, 0};\n", ki.item, nt, cd); el = SwigType_equivalent_mangle(ki.item, 0, 0); for (ei = First(el); ei.item; ei = Next(ei)) { String *ckey; String *conv; ckey = NewStringf("%s+%s", ei.item, ki.item); conv = Getattr(conversions, ckey); if (conv) { Printf(cast_temp, " {&_swigt_%s, %s, 0, 0},", ei.item, conv); } else { Printf(cast_temp, " {&_swigt_%s, 0, 0, 0},", ei.item); } Delete(ckey); if (!Getattr(r_mangled, ei.item) && !Getattr(imported_types, ei.item)) { Printf(types, "static swig_type_info _swigt_%s = {\"%s\", 0, 0, 0, 0, 0};\n", ei.item, ei.item); Append(table_list, ei.item); Printf(cast, "static swig_cast_info _swigc_%s[] = {{&_swigt_%s, 0, 0, 0},{0, 0, 0, 0}};\n", ei.item, ei.item); i++; Setattr(imported_types, ei.item, "1"); } } Delete(el); Printf(cast, "%s{0, 0, 0, 0}};\n", cast_temp); Delete(cast_temp); Delete(nt); Delete(rt); } /* print the tables in the proper order */ SortList(table_list, SwigType_compare_mangled); i = 0; for (ki = First(table_list); ki.item; ki = Next(ki)) { Printf(f_forward, "#define SWIGTYPE%s swig_types[%d]\n", ki.item, i++); Printf(table, " &_swigt_%s,\n", ki.item); Printf(cast_init, " _swigc_%s,\n", ki.item); } if (i == 0) { /* empty arrays are not allowed by ISO C */ Printf(table, " NULL\n"); Printf(cast_init, " NULL\n"); } Delete(table_list); Delete(mangled_list); Printf(table, "};\n"); Printf(cast_init, "};\n"); Printf(f_table, "%s\n", types); Printf(f_table, "%s\n", table); Printf(f_table, "%s\n", cast); Printf(f_table, "%s\n", cast_init); Printf(f_table, "\n/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */\n\n"); Printf(f_forward, "static swig_type_info *swig_types[%d];\n", i + 1); Printf(f_forward, "static swig_module_info swig_module = {swig_types, %d, 0, 0, 0, 0};\n", i); Printf(f_forward, "#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)\n"); Printf(f_forward, "#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)\n"); Printf(f_forward, "\n/* -------- TYPES TABLE (END) -------- */\n\n"); Delete(types); Delete(table); Delete(cast); Delete(cast_init); Delete(imported_types); } swig-3.0.12/Source/Swig/symbol.c0000664000175000017500000017351013042756442016266 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * symbol.c * * This file implements the SWIG symbol table. See details below. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "swigwarn.h" #include /* #define SWIG_DEBUG*/ /* ----------------------------------------------------------------------------- * Synopsis * * This module provides symbol table management for all of SWIG. In previous * releases, the management of symbols was rather haphazard. This module tries * to correct that. * * All symbols are associated with simple identifiers. For example, here are some * declarations that generate symbol table entries: * * decl symbol * -------------- ------------ * void foo(int); foo * int x; x * typedef int *blah; blah * * Associated with each symbol is a Hash table that can contain any set of * attributes that make sense for that object. For example: * * typedef int *blah; ----> "name" : 'blah' * "type" : 'int' * "decl" : 'p.' * "storage" : 'typedef' * * In some cases, the symbol table needs to manage overloaded entries. For instance, * overloaded functions. In this case, a linked list is built. The "sym:nextSibling" * attribute is reserved to hold a link to the next entry. For example: * * int foo(int); --> "name" : "foo" "name" : "foo" * int foo(int,double); "type" : "int" "type" : "int" * "decl" : "f(int)." "decl" : "f(int,double)." * ... ... * "sym:nextSibling" : --------> "sym:nextSibling": --------> ... * * When more than one symbol has the same name, the symbol declarator is * used to detect duplicates. For example, in the above case, foo(int) and * foo(int,double) are different because their "decl" attribute is different. * However, if a third declaration "foo(int)" was made, it would generate a * conflict (due to having a declarator that matches a previous entry). * * Structures and classes: * * C/C++ symbol tables are normally managed in a few different spaces. The * most visible namespace is reserved for functions, variables, typedef, enum values * and such. In C, a separate tag-space is reserved for 'struct name', 'class name', * and 'union name' declarations. In SWIG, a single namespace is used for everything * this means that certain incompatibilities will arise with some C programs. For instance: * * struct Foo { * ... * } * * int Foo(); // Error. Name clash. Works in C though * * Due to the unified namespace for structures, special handling is performed for * the following: * * typedef struct Foo { * * } Foo; * * In this case, the symbol table contains an entry for the structure itself. The * typedef is left out of the symbol table. * * Target language vs C: * * The symbol tables are normally managed *in the namespace of the target language*. * This means that name-collisions can be resolved using %rename and related * directives. A quirk of this is that sometimes the symbol tables need to * be used for C type resolution as well. To handle this, each symbol table * also has a C-symbol table lurking behind the scenes. This is used to locate * symbols in the C namespace. However, this symbol table is not used for error * reporting nor is it used for anything else during code generation. * * Symbol table structure: * * Symbol tables themselves are a special kind of node that is organized just like * a normal parse tree node. Symbol tables are organized in a tree that can be * traversed using the SWIG-DOM API. The following attributes names are reserved. * * name -- Name of the scope defined by the symbol table (if any) * This name is the C-scope name and is not affected by * %renaming operations * symtab -- Hash table mapping identifiers to nodes. * csymtab -- Hash table mapping C identifiers to nodes. * * Reserved attributes on symbol objects: * * When a symbol is placed in the symbol table, the following attributes * are set: * * sym:name -- Symbol name * sym:nextSibling -- Next symbol (if overloaded) * sym:previousSibling -- Previous symbol (if overloaded) * sym:symtab -- Symbol table object holding the symbol * sym:overloaded -- Set to the first symbol if overloaded * * These names are modeled after XML namespaces. In particular, every attribute * pertaining to symbol table management is prefaced by the "sym:" prefix. * * An example dump of the parse tree showing symbol table entries for the * following code should clarify this: * * namespace OuterNamespace { * namespace InnerNamespace { * class Class { * }; * struct Struct { * int Var; * }; * } * } * * +++ namespace ---------------------------------------- * | sym:name - "OuterNamespace" * | symtab - 0xa064bf0 * | sym:symtab - 0xa041690 * | sym:overname - "__SWIG_0" * * +++ namespace ---------------------------------------- * | sym:name - "InnerNamespace" * | symtab - 0xa064cc0 * | sym:symtab - 0xa064bf0 * | sym:overname - "__SWIG_0" * * +++ class ---------------------------------------- * | sym:name - "Class" * | symtab - 0xa064d80 * | sym:symtab - 0xa064cc0 * | sym:overname - "__SWIG_0" * | * +++ class ---------------------------------------- * | sym:name - "Struct" * | symtab - 0xa064f00 * | sym:symtab - 0xa064cc0 * | sym:overname - "__SWIG_0" * * +++ cdecl ---------------------------------------- * | sym:name - "Var" * | sym:symtab - 0xa064f00 * | sym:overname - "__SWIG_0" * | * * * Each class and namespace has its own scope and thus a new symbol table (sym) * is created. The sym attribute is only set for the first entry in the symbol * table. The sym:symtab entry points to the symbol table in which the symbol * exists, so for example, Struct is in the scope OuterNamespace::InnerNamespace * so sym:symtab points to this symbol table (0xa064cc0). * * ----------------------------------------------------------------------------- */ static Hash *current = 0; /* The current symbol table hash */ static Hash *ccurrent = 0; /* The current c symbol table hash */ static Hash *current_symtab = 0; /* Current symbol table node */ static Hash *symtabs = 0; /* Hash of all symbol tables by fully-qualified name */ static Hash *global_scope = 0; /* Global scope */ static int use_inherit = 1; /* common attribute keys, to avoid calling find_key all the times */ /* ----------------------------------------------------------------------------- * Swig_symbol_print_tables() * * Debug display of symbol tables * ----------------------------------------------------------------------------- */ void Swig_symbol_print_tables(Symtab *symtab) { if (!symtab) symtab = current_symtab; Printf(stdout, "SYMBOL TABLES start =======================================\n"); Swig_print_tree(symtab); Printf(stdout, "SYMBOL TABLES finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_print_tables_summary() * * Debug summary display of all symbol tables by fully-qualified name * ----------------------------------------------------------------------------- */ void Swig_symbol_print_tables_summary(void) { Printf(stdout, "SYMBOL TABLES SUMMARY start =======================================\n"); Swig_print_node(symtabs); Printf(stdout, "SYMBOL TABLES SUMMARY finish =======================================\n"); } /* ----------------------------------------------------------------------------- * symbol_print_symbols() * ----------------------------------------------------------------------------- */ static void symbol_print_symbols(const char *symboltabletype) { Node *table = symtabs; Iterator ki = First(table); while (ki.key) { String *k = ki.key; Printf(stdout, "===================================================\n"); Printf(stdout, "%s -\n", k); { Symtab *symtab = Getattr(Getattr(table, k), symboltabletype); Iterator it = First(symtab); while (it.key) { String *symname = it.key; Printf(stdout, " %s (%s)\n", symname, nodeType(it.item)); /* Printf(stdout, " %s - %p (%s)\n", symname, it.item, Getattr(it.item, "name")); */ it = Next(it); } } ki = Next(ki); } } /* ----------------------------------------------------------------------------- * Swig_symbol_print_symbols() * * Debug display of all the target language symbols * ----------------------------------------------------------------------------- */ void Swig_symbol_print_symbols(void) { Printf(stdout, "SYMBOLS start =======================================\n"); symbol_print_symbols("symtab"); Printf(stdout, "SYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_print_csymbols() * * Debug display of all the C symbols * ----------------------------------------------------------------------------- */ void Swig_symbol_print_csymbols(void) { Printf(stdout, "CSYMBOLS start =======================================\n"); symbol_print_symbols("csymtab"); Printf(stdout, "CSYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Swig_symbol_init() * * Create a new symbol table object * ----------------------------------------------------------------------------- */ void Swig_symbol_init(void) { current = NewHash(); current_symtab = NewHash(); ccurrent = NewHash(); set_nodeType(current_symtab, "symboltable"); Setattr(current_symtab, "symtab", current); Delete(current); Setattr(current_symtab, "csymtab", ccurrent); Delete(ccurrent); /* Set the global scope */ symtabs = NewHash(); Setattr(symtabs, "", current_symtab); Delete(current_symtab); global_scope = current_symtab; } /* ----------------------------------------------------------------------------- * Swig_symbol_setscopename() * * Set the C scopename of the current symbol table. * ----------------------------------------------------------------------------- */ void Swig_symbol_setscopename(const_String_or_char_ptr name) { String *qname; /* assert(!Getattr(current_symtab,"name")); */ Setattr(current_symtab, "name", name); /* Set nested scope in parent */ qname = Swig_symbol_qualifiedscopename(current_symtab); /* Save a reference to this scope */ Setattr(symtabs, qname, current_symtab); Delete(qname); } /* ----------------------------------------------------------------------------- * Swig_symbol_getscopename() * * Get the C scopename of the current symbol table * ----------------------------------------------------------------------------- */ String *Swig_symbol_getscopename(void) { return Getattr(current_symtab, "name"); } /* ----------------------------------------------------------------------------- * Swig_symbol_getscope() * * Given a fully qualified C scopename, this function returns a symbol table * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_getscope(const_String_or_char_ptr name) { if (!symtabs) return 0; if (Equal("::", (const_String_or_char_ptr ) name)) name = ""; return Getattr(symtabs, name); } /* ----------------------------------------------------------------------------- * Swig_symbol_qualifiedscopename() * * Get the fully qualified C scopename of a symbol table. Note, this only pertains * to the C/C++ scope name. It is not affected by renaming. * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualifiedscopename(Symtab *symtab) { String *result = 0; Hash *parent; String *name; if (!symtab) symtab = current_symtab; parent = Getattr(symtab, "parentNode"); if (parent) { result = Swig_symbol_qualifiedscopename(parent); } name = Getattr(symtab, "name"); if (name) { if (!result) { result = NewStringEmpty(); } if (Len(result)) { Printv(result, "::", name, NIL); } else { Append(result, name); } } return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_qualified_language_scopename() * * Get the fully qualified C scopename of a symbol table but using a language * specific separator for the scopenames. Basically the same as * Swig_symbol_qualifiedscopename() but using the different separator. * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualified_language_scopename(Symtab *n) { /* TODO: fix for %rename to work */ String *result = Swig_symbol_qualifiedscopename(n); Replaceall(result, "::", NSPACE_SEPARATOR); return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_newscope() * * Create a new scope. Returns the newly created scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_newscope(void) { Hash *n; Hash *hsyms, *h; hsyms = NewHash(); h = NewHash(); set_nodeType(h, "symboltable"); Setattr(h, "symtab", hsyms); Delete(hsyms); set_parentNode(h, current_symtab); n = lastChild(current_symtab); if (!n) { set_firstChild(current_symtab, h); } else { set_nextSibling(n, h); Delete(h); } set_lastChild(current_symtab, h); current = hsyms; ccurrent = NewHash(); Setattr(h, "csymtab", ccurrent); Delete(ccurrent); current_symtab = h; return h; } /* ----------------------------------------------------------------------------- * Swig_symbol_setscope() * * Set the current scope. Returns the previous current scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_setscope(Symtab *sym) { Symtab *ret = current_symtab; current_symtab = sym; current = Getattr(sym, "symtab"); assert(current); ccurrent = Getattr(sym, "csymtab"); assert(ccurrent); return ret; } /* ----------------------------------------------------------------------------- * Swig_symbol_popscope() * * Pop out of the current scope. Returns the popped scope and sets the * scope to the parent scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_popscope(void) { Hash *h = current_symtab; current_symtab = Getattr(current_symtab, "parentNode"); assert(current_symtab); current = Getattr(current_symtab, "symtab"); assert(current); ccurrent = Getattr(current_symtab, "csymtab"); assert(ccurrent); return h; } /* ----------------------------------------------------------------------------- * Swig_symbol_global_scope() * * Return the symbol table for the global scope. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_global_scope(void) { return global_scope; } /* ----------------------------------------------------------------------------- * Swig_symbol_current() * * Return the current symbol table. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_current(void) { return current_symtab; } /* ----------------------------------------------------------------------------- * Swig_symbol_alias() * * Makes an alias for a symbol in the global symbol table. * Primarily for namespace aliases such as 'namespace X = Y;'. * ----------------------------------------------------------------------------- */ void Swig_symbol_alias(const_String_or_char_ptr aliasname, Symtab *s) { String *qname = Swig_symbol_qualifiedscopename(current_symtab); if (qname) { Printf(qname, "::%s", aliasname); } else { qname = NewString(aliasname); } if (!Getattr(symtabs, qname)) { Setattr(symtabs, qname, s); } Delete(qname); } /* ----------------------------------------------------------------------------- * Swig_symbol_inherit() * * Inherit symbols from another scope. Primarily for C++ inheritance and * for using directives, such as 'using namespace X;' * but not for using declarations, such as 'using A;'. * ----------------------------------------------------------------------------- */ void Swig_symbol_inherit(Symtab *s) { int i, ilen; List *inherit = Getattr(current_symtab, "inherit"); if (!inherit) { inherit = NewList(); Setattr(current_symtab, "inherit", inherit); Delete(inherit); } if (s == current_symtab) { Swig_warning(WARN_PARSE_REC_INHERITANCE, Getfile(s), Getline(s), "Recursive scope inheritance of '%s'.\n", Getattr(s, "name")); return; } assert(s != current_symtab); ilen = Len(inherit); for (i = 0; i < ilen; i++) { Node *n = Getitem(inherit, i); if (n == s) return; /* Already inherited */ } Append(inherit, s); } /* ----------------------------------------------------------------------------- * Swig_symbol_cadd() * * Adds a node to the C symbol table only. * ----------------------------------------------------------------------------- */ void Swig_symbol_cadd(const_String_or_char_ptr name, Node *n) { Node *append = 0; Node *cn; /* There are a few options for weak symbols. A "weak" symbol is any symbol that can be replaced by another symbol in the C symbol table. An example would be a forward class declaration. A forward class sits in the symbol table until a real class declaration comes along. Certain symbols are marked as "sym:typename". These are important symbols related to the C++ type-system and take precedence in the C symbol table. An example might be code like this: template T foo(T x); int foo(int); In this case, the template is marked with "sym:typename" so that it stays in the C symbol table (so that it can be expanded using %template). */ if (!name) return; if (SwigType_istemplate(name)) { String *cname = NewString(name); String *dname = Swig_symbol_template_deftype(cname, 0); if (!Equal(dname, name)) { Swig_symbol_cadd(dname, n); } Delete(dname); Delete(cname); } #ifdef SWIG_DEBUG Printf(stderr, "symbol_cadd %s %p\n", name, n); #endif cn = Getattr(ccurrent, name); if (cn && (Getattr(cn, "sym:typename"))) { /* The node in the C symbol table is a typename. Do nothing */ /* We might append the symbol at the end */ append = n; } else if (cn && (Getattr(cn, "sym:weak"))) { /* The node in the symbol table is weak. Replace it */ if (checkAttribute(cn, "nodeType", "template") && checkAttribute(cn, "templatetype", "classforward")) { /* The node is a template classforward declaration, and the default template parameters here take precedence. */ ParmList *pc = Getattr(cn, "templateparms"); ParmList *pn = Getattr(n, "templateparms"); #ifdef SWIG_DEBUG Printf(stderr, "found template classforward %s\n", Getattr(cn, "name")); #endif while (pc && pn) { String *value = Getattr(pc, "value"); if (value) { #ifdef SWIG_DEBUG Printf(stderr, "add default template value %s %s\n", Getattr(pc, "name"), value); #endif Setattr(pn, "value", value); } pc = nextSibling(pc); pn = nextSibling(pn); } Setattr(n, "templateparms", Getattr(cn, "templateparms")); } Setattr(ccurrent, name, n); } else if (cn && (Getattr(n, "sym:weak"))) { /* The node being added is weak. Don't worry about it */ } else if (cn && (Getattr(n, "sym:typename"))) { /* The node being added is a typename. We definitely add it */ Setattr(ccurrent, name, n); append = cn; } else if (cn && (Checkattr(cn, "nodeType", "templateparm"))) { Swig_error(Getfile(n), Getline(n), "Declaration of '%s' shadows template parameter,\n", name); Swig_error(Getfile(cn), Getline(cn), "previous template parameter declaration '%s'.\n", name); return; } else if (cn) { append = n; } else if (!cn) { /* No conflict. Add the symbol */ Setattr(ccurrent, name, n); } /* Multiple entries in the C symbol table. We append to to the symbol table */ if (append) { Node *fn, *pn = 0; cn = Getattr(ccurrent, name); fn = cn; while (fn) { pn = fn; if (fn == append) { /* already added. Bail */ return; } fn = Getattr(fn, "csym:nextSibling"); } if (pn) { Setattr(pn, "csym:nextSibling", append); } } /* Special typedef handling. When a typedef node is added to the symbol table, we might have to add a type alias. This would occur if the typedef mapped to another scope in the system. For example: class Foo { }; typedef Foo OtherFoo; In this case, OtherFoo becomes an alias for Foo. */ { Node *td = n; while (td && Checkattr(td, "nodeType", "cdecl") && Checkattr(td, "storage", "typedef")) { SwigType *type; Node *td1; type = Copy(Getattr(td, "type")); SwigType_push(type, Getattr(td, "decl")); td1 = Swig_symbol_clookup(type, 0); /* Fix pathetic case #1214313: class Foo { }; typedef Foo FooBar; class CBaz { public: typedef FooBar Foo; }; ie, when Foo -> FooBar -> Foo, jump one scope up when possible. */ if (td1 && Checkattr(td1, "storage", "typedef")) { String *st = Getattr(td1, "type"); String *sn = Getattr(td, "name"); if (st && sn && Equal(st, sn)) { Symtab *sc = Getattr(current_symtab, "parentNode"); if (sc) td1 = Swig_symbol_clookup(type, sc); } } Delete(type); if (td1 == td) break; td = td1; if (td) { Symtab *st = Getattr(td, "symtab"); if (st) { Swig_symbol_alias(Getattr(n, "name"), st); break; } } } } } /* ----------------------------------------------------------------------------- * Swig_symbol_add() * * Adds a node to the symbol table. Returns the node itself if successfully * added. Otherwise, it returns the symbol table entry of the conflicting node. * * Also places the symbol in a behind-the-scenes C symbol table. This is needed * for namespace support, type resolution, and other issues. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *n) { Hash *c, *cn, *cl = 0; SwigType *decl, *ndecl; String *cstorage, *nstorage; int nt = 0, ct = 0; int pn = 0; int u1 = 0, u2 = 0; String *name, *overname; /* See if the node has a name. If so, we place in the C symbol table for this scope. We don't worry about overloading here---the primary purpose of this is to record information for type/name resolution for later. Conflicts in C namespaces are errors, but these will be caught by the C++ compiler when compiling the wrapper code */ /* There are a few options for weak symbols. A "weak" symbol is any symbol that can be replaced by another symbol in the C symbol table. An example would be a forward class declaration. A forward class sits in the symbol table until a real class declaration comes along. Certain symbols are marked as "sym:typename". These are important symbols related to the C++ type-system and take precedence in the C symbol table. An example might be code like this: template T foo(T x); int foo(int); In this case, the template is marked with "sym:typename" so that it stays in the C symbol table (so that it can be expanded using %template). */ name = Getattr(n, "name"); if (name && Len(name)) { Swig_symbol_cadd(name, n); } /* No symbol name defined. We return. */ if (!symname) { Setattr(n, "sym:symtab", current_symtab); return n; } /* If node is ignored. We don't proceed any further */ if (GetFlag(n, "feature:ignore")) return n; /* See if the symbol already exists in the table */ c = Getattr(current, symname); /* Check for a weak symbol. A weak symbol is allowed to be in the symbol table, but is silently overwritten by other symbols. An example would be a forward class declaration. For instance: class Foo; In this case, "Foo" sits in the symbol table. However, the definition of Foo would replace the entry if it appeared later. */ if (c && Getattr(c, "sym:weak")) { c = 0; } if (c) { /* There is a symbol table conflict. There are a few cases to consider here: (1) A conflict between a class/enum and a typedef declaration is okay. In this case, the symbol table entry is set to the class/enum declaration itself, not the typedef. (2) A conflict between namespaces is okay--namespaces are open (3) Otherwise, overloading is only allowed for functions */ /* Check for namespaces */ String *ntype = Getattr(n, "nodeType"); if ((Equal(ntype, Getattr(c, "nodeType"))) && ((Equal(ntype, "namespace")))) { Node *cl, *pcl = 0; cl = c; while (cl) { pcl = cl; cl = Getattr(cl, "sym:nextSibling"); } Setattr(pcl, "sym:nextSibling", n); Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); Setattr(n, "sym:previousSibling", pcl); return n; } if (Getattr(n, "allows_typedef")) nt = 1; if (Getattr(c, "allows_typedef")) ct = 1; if (nt || ct) { Node *td, *other; String *s; /* At least one of the nodes allows typedef overloading. Make sure that both don't--this would be a conflict */ if (nt && ct) return c; /* Figure out which node allows the typedef */ if (nt) { td = n; other = c; } else { td = c; other = n; } /* Make sure the other node is a typedef */ s = Getattr(other, "storage"); if (!s || (!Equal(s, "typedef"))) return c; /* No. This is a conflict */ /* Hmmm. This appears to be okay. Make sure the symbol table refers to the allow_type node */ if (td != c) { Setattr(current, symname, td); Setattr(td, "sym:symtab", current_symtab); Setattr(td, "sym:name", symname); } return n; } decl = Getattr(c, "decl"); ndecl = Getattr(n, "decl"); { String *nt1, *nt2; nt1 = Getattr(n, "nodeType"); if (Equal(nt1, "template")) nt1 = Getattr(n, "templatetype"); nt2 = Getattr(c, "nodeType"); if (Equal(nt2, "template")) nt2 = Getattr(c, "templatetype"); if (Equal(nt1, "using")) u1 = 1; if (Equal(nt2, "using")) u2 = 1; if ((!Equal(nt1, nt2)) && !(u1 || u2)) return c; } if (!(u1 || u2)) { if ((!SwigType_isfunction(decl)) || (!SwigType_isfunction(ndecl))) { /* Symbol table conflict */ return c; } } /* Hmmm. Declarator seems to indicate that this is a function */ /* Look at storage class to see if compatible */ cstorage = Getattr(c, "storage"); nstorage = Getattr(n, "storage"); /* If either one is declared as typedef, forget it. We're hosed */ if (Cmp(cstorage, "typedef") == 0) { return c; } if (Cmp(nstorage, "typedef") == 0) { return c; } /* Okay. Walk down the list of symbols and see if we get a declarator match */ { String *nt = Getattr(n, "nodeType"); int n_template = Equal(nt, "template") && Checkattr(n, "templatetype", "cdecl"); int n_plain_cdecl = Equal(nt, "cdecl"); cn = c; pn = 0; while (cn) { decl = Getattr(cn, "decl"); if (!(u1 || u2)) { if (Cmp(ndecl, decl) == 0) { /* Declarator conflict */ /* Now check we don't have a non-templated function overloaded by a templated function with same params, * eg void foo(); template void foo(); */ String *cnt = Getattr(cn, "nodeType"); int cn_template = Equal(cnt, "template") && Checkattr(cn, "templatetype", "cdecl"); int cn_plain_cdecl = Equal(cnt, "cdecl"); if (!((n_template && cn_plain_cdecl) || (cn_template && n_plain_cdecl))) { /* found a conflict */ return cn; } } } cl = cn; cn = Getattr(cn, "sym:nextSibling"); pn++; } } /* Well, we made it this far. Guess we can drop the symbol in place */ Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); /* Printf(stdout,"%s %p\n", Getattr(n,"sym:overname"), current_symtab); */ assert(!Getattr(n, "sym:overname")); overname = NewStringf("__SWIG_%d", pn); Setattr(n, "sym:overname", overname); /*Printf(stdout,"%s %s %s\n", symname, Getattr(n,"decl"), Getattr(n,"sym:overname")); */ Setattr(cl, "sym:nextSibling", n); Setattr(n, "sym:previousSibling", cl); Setattr(cl, "sym:overloaded", c); Setattr(n, "sym:overloaded", c); Delete(overname); return n; } /* No conflict. Just add it */ Setattr(n, "sym:symtab", current_symtab); Setattr(n, "sym:name", symname); /* Printf(stdout,"%s\n", Getattr(n,"sym:overname")); */ overname = NewStringf("__SWIG_%d", pn); Setattr(n, "sym:overname", overname); Delete(overname); /* Printf(stdout,"%s %s %s\n", symname, Getattr(n,"decl"), Getattr(n,"sym:overname")); */ Setattr(current, symname, n); return n; } /* ----------------------------------------------------------------------------- * symbol_lookup() * * Internal function to handle fully qualified symbol table lookups. This * works from the symbol table supplied in symtab and unwinds its way out * towards the global scope. * * This function operates in the C namespace, not the target namespace. * * The check function is an optional callback that can be used to verify a particular * symbol match. This is only used in some of the more exotic parts of SWIG. For instance, * verifying that a class hierarchy implements all pure virtual methods. * ----------------------------------------------------------------------------- */ static Node *_symbol_lookup(const String *name, Symtab *symtab, int (*check) (Node *n)) { Node *n; List *inherit; Hash *sym = Getattr(symtab, "csymtab"); if (Getmark(symtab)) return 0; Setmark(symtab, 1); n = Getattr(sym, name); #ifdef SWIG_DEBUG Printf(stderr, "symbol_look %s %p %p %s\n", name, n, symtab, Getattr(symtab, "name")); #endif if (n) { /* if a check-function is defined. Call it to determine a match */ if (check) { int c = check(n); if (c == 1) { Setmark(symtab, 0); return n; } if (c < 0) { /* Terminate the search right away */ Setmark(symtab, 0); return 0; } } else { Setmark(symtab, 0); return n; } } if (!n && SwigType_istemplate(name)) { String *dname = 0; Setmark(symtab, 0); dname = Swig_symbol_template_deftype(name, symtab); if (!Equal(dname, name)) { n = _symbol_lookup(dname, symtab, check); } Delete(dname); if (n) return n; Setmark(symtab, 1); } inherit = Getattr(symtab, "inherit"); if (inherit && use_inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { n = _symbol_lookup(name, Getitem(inherit, i), check); if (n) { Setmark(symtab, 0); return n; } } } Setmark(symtab, 0); return 0; } static Node *symbol_lookup(const_String_or_char_ptr name, Symtab *symtab, int (*check) (Node *n)) { Node *n = 0; if (DohCheck(name)) { n = _symbol_lookup(name, symtab, check); } else { String *sname = NewString(name); n = _symbol_lookup(sname, symtab, check); Delete(sname); } return n; } /* ----------------------------------------------------------------------------- * symbol_lookup_qualified() * ----------------------------------------------------------------------------- */ static Node *symbol_lookup_qualified(const_String_or_char_ptr name, Symtab *symtab, const String *prefix, int local, int (*checkfunc) (Node *n)) { /* This is a little funky, we search by fully qualified names */ if (!symtab) return 0; if (!prefix) { Node *n; String *bname; String *prefix; Swig_scopename_split(name, &prefix, &bname); n = symbol_lookup_qualified(bname, symtab, prefix, local, checkfunc); Delete(bname); Delete(prefix); return n; } else { Symtab *st; Node *n = 0; /* Make qualified name of current scope */ String *qalloc = 0; String *qname = Swig_symbol_qualifiedscopename(symtab); const String *cqname; if (qname) { if (Len(qname)) { if (prefix && Len(prefix)) { Printv(qname, "::", prefix, NIL); } } else { Append(qname, prefix); } qalloc = qname; cqname = qname; } else { cqname = prefix; } st = Getattr(symtabs, cqname); /* Found a scope match */ if (st) { if (!name) { if (qalloc) Delete(qalloc); return st; } n = symbol_lookup(name, st, checkfunc); } if (qalloc) Delete(qalloc); if (!n) { if (!local) { Node *pn = Getattr(symtab, "parentNode"); if (pn) n = symbol_lookup_qualified(name, pn, prefix, local, checkfunc); /* Check inherited scopes */ if (!n) { List *inherit = Getattr(symtab, "inherit"); if (inherit && use_inherit) { int i, len; len = Len(inherit); for (i = 0; i < len; i++) { Node *prefix_node = symbol_lookup(prefix, Getitem(inherit, i), checkfunc); if (prefix_node) { Node *prefix_symtab = Getattr(prefix_node, "symtab"); if (prefix_symtab) { n = symbol_lookup(name, prefix_symtab, checkfunc); break; } } } } } } else { n = 0; } } return n; } } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup() * * Look up a symbol in the symbol table. This uses the C name, not scripting * names. Note: If we come across a using declaration, we follow it to * to get the real node. Any using directives are also followed (but this is * implemented in symbol_lookup()). * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup(const_String_or_char_ptr name, Symtab *n) { Hash *hsym = 0; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); if (n) { hsym = n; } } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, 0); } else { s = symbol_lookup(nname, global_scope, 0); } Delete(nname); } else { String *prefix = Swig_scopename_prefix(name); if (prefix) { s = symbol_lookup_qualified(name, hsym, 0, 0, 0); Delete(prefix); if (!s) { return 0; } } } } if (!s) { while (hsym) { s = symbol_lookup(name, hsym, 0); if (s) break; hsym = Getattr(hsym, "parentNode"); if (!hsym) break; } } if (!s) { return 0; } /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { String *uname = Getattr(s, "uname"); Symtab *un = Getattr(s, "sym:symtab"); Node *ss = (!Equal(name, uname) || (un != n)) ? Swig_symbol_clookup(uname, un) : 0; /* avoid infinity loop */ if (!ss) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_check() * * This function is identical to Swig_symbol_clookup() except that it * accepts a callback function that is invoked to determine a symbol match. * The purpose of this function is to support complicated algorithms that need * to examine multiple definitions of the same symbol that might appear in an * inheritance hierarchy. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_check(const_String_or_char_ptr name, Symtab *n, int (*checkfunc) (Node *n)) { Hash *hsym = 0; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); if (n) { hsym = n; } } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, checkfunc); } else { s = symbol_lookup(nname, global_scope, checkfunc); } Delete(nname); } else { String *prefix = Swig_scopename_prefix(name); if (prefix) { s = symbol_lookup_qualified(name, hsym, 0, 0, checkfunc); Delete(prefix); if (!s) { return 0; } } } } if (!s) { while (hsym) { s = symbol_lookup(name, hsym, checkfunc); if (s) break; hsym = Getattr(hsym, "parentNode"); if (!hsym) break; } } if (!s) { return 0; } /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss; ss = Swig_symbol_clookup(Getattr(s, "uname"), Getattr(s, "sym:symtab")); if (!ss && !checkfunc) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_local() * * Same as Swig_symbol_clookup but parent nodes are not searched, that is, just * this symbol table is searched. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_local(const_String_or_char_ptr name, Symtab *n) { Hash *hsym; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); hsym = n; } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, 0); } else { s = symbol_lookup(nname, global_scope, 0); } Delete(nname); } else { s = symbol_lookup_qualified(name, hsym, 0, 0, 0); } } if (!s) { s = symbol_lookup(name, hsym, 0); } if (!s) return 0; /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss = Swig_symbol_clookup_local(Getattr(s, "uname"), Getattr(s, "sym:symtab")); if (!ss) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_local_check() * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_local_check(const_String_or_char_ptr name, Symtab *n, int (*checkfunc) (Node *)) { Hash *hsym; Node *s = 0; if (!n) { hsym = current_symtab; } else { if (!Checkattr(n, "nodeType", "symboltable")) { n = Getattr(n, "sym:symtab"); } assert(n); hsym = n; } if (Swig_scopename_check(name)) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) { String *nname = NewString(cname + 2); if (Swig_scopename_check(nname)) { s = symbol_lookup_qualified(nname, global_scope, 0, 0, checkfunc); } else { s = symbol_lookup(nname, global_scope, checkfunc); } Delete(nname); } else { s = symbol_lookup_qualified(name, hsym, 0, 0, checkfunc); } } if (!s) { s = symbol_lookup(name, hsym, checkfunc); } if (!s) return 0; /* Check if s is a 'using' node */ while (s && Checkattr(s, "nodeType", "using")) { Node *ss = Swig_symbol_clookup_local_check(Getattr(s, "uname"), Getattr(s, "sym:symtab"), checkfunc); if (!ss && !checkfunc) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(s), Getline(s), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(s, "uname"))); } s = ss; } return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_clookup_no_inherit() * * Symbol lookup like Swig_symbol_clookup but does not follow using declarations. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_clookup_no_inherit(const_String_or_char_ptr name, Symtab *n) { Node *s = 0; assert(use_inherit==1); use_inherit = 0; s = Swig_symbol_clookup(name, n); use_inherit = 1; return s; } /* ----------------------------------------------------------------------------- * Swig_symbol_cscope() * * Look up a scope name. * ----------------------------------------------------------------------------- */ Symtab *Swig_symbol_cscope(const_String_or_char_ptr name, Symtab *symtab) { char *cname = Char(name); if (strncmp(cname, "::", 2) == 0) return symbol_lookup_qualified(0, global_scope, name, 0, 0); return symbol_lookup_qualified(0, symtab, name, 0, 0); } /* ----------------------------------------------------------------------------- * Swig_symbol_remove() * * Remove a symbol. If the symbol is an overloaded function and the symbol removed * is not the last in the list of overloaded functions, then the overloaded * names (sym:overname attribute) are changed to start from zero, eg __SWIG_0. * ----------------------------------------------------------------------------- */ void Swig_symbol_remove(Node *n) { Symtab *symtab; String *symname; String *overname; Node *symprev; Node *symnext; Node *fixovername = 0; symtab = Getattr(n, "sym:symtab"); /* Get symbol table object */ symtab = Getattr(symtab, "symtab"); /* Get actual hash table of symbols */ symname = Getattr(n, "sym:name"); symprev = Getattr(n, "sym:previousSibling"); symnext = Getattr(n, "sym:nextSibling"); /* If previous symbol, just fix the links */ if (symprev) { if (symnext) { Setattr(symprev, "sym:nextSibling", symnext); fixovername = symprev; /* fix as symbol to remove is somewhere in the middle of the linked list */ } else { Delattr(symprev, "sym:nextSibling"); } } else { /* If no previous symbol, see if there is a next symbol */ if (symnext) { Setattr(symtab, symname, symnext); fixovername = symnext; /* fix as symbol to remove is at head of linked list */ } else { if (symname) Delattr(symtab, symname); } } if (symnext) { if (symprev) { Setattr(symnext, "sym:previousSibling", symprev); } else { Delattr(symnext, "sym:previousSibling"); } } Delattr(n, "sym:symtab"); Delattr(n, "sym:previousSibling"); Delattr(n, "sym:nextSibling"); Delattr(n, "csym:nextSibling"); Delattr(n, "sym:overname"); Delattr(n, "csym:previousSibling"); Delattr(n, "sym:overloaded"); n = 0; if (fixovername) { Node *nn = fixovername; Node *head = fixovername; int pn = 0; /* find head of linked list */ while (nn) { head = nn; nn = Getattr(nn, "sym:previousSibling"); } /* adjust all the sym:overname strings to start from 0 and increment by one */ nn = head; while (nn) { assert(Getattr(nn, "sym:overname")); Delattr(nn, "sym:overname"); overname = NewStringf("__SWIG_%d", pn); Setattr(nn, "sym:overname", overname); Delete(overname); pn++; nn = Getattr(nn, "sym:nextSibling"); } } } /* ----------------------------------------------------------------------------- * Swig_symbol_qualified() * * Return the qualified name of a symbol * ----------------------------------------------------------------------------- */ String *Swig_symbol_qualified(Node *n) { Hash *symtab; if (Checkattr(n, "nodeType", "symboltable")) { symtab = n; } else { symtab = Getattr(n, "sym:symtab"); } if (!symtab) return NewStringEmpty(); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qscope %s %p %s\n", Getattr(n, "name"), symtab, Getattr(symtab, "name")); #endif return Swig_symbol_qualifiedscopename(symtab); } /* ----------------------------------------------------------------------------- * Swig_symbol_isoverloaded() * * Check if a symbol is overloaded. Returns the first symbol if so. * ----------------------------------------------------------------------------- */ Node *Swig_symbol_isoverloaded(Node *n) { return Getattr(n, "sym:overloaded"); } /* ----------------------------------------------------------------------------- * symbol_template_qualify() * * Internal function to create a fully qualified type name for templates * ----------------------------------------------------------------------------- */ /* This cache produces problems with OSS, don't active it */ /* #define SWIG_TEMPLATE_QUALIFY_CACHE */ static SwigType *symbol_template_qualify(const SwigType *e, Symtab *st) { String *tprefix, *tsuffix; SwigType *qprefix; List *targs; Node *tempn; Symtab *tscope; Iterator ti; #ifdef SWIG_TEMPLATE_QUALIFY_CACHE static Hash *qualify_cache = 0; String *scopetype = st ? NewStringf("%s::%s", Getattr(st, "name"), e) : NewStringf("%s::%s", Swig_symbol_getscopename(), e); if (!qualify_cache) { qualify_cache = NewHash(); } if (scopetype) { String *cres = Getattr(qualify_cache, scopetype); if (cres) { Delete(scopetype); return Copy(cres); } } #endif tprefix = SwigType_templateprefix(e); tsuffix = SwigType_templatesuffix(e); qprefix = Swig_symbol_type_qualify(tprefix, st); targs = SwigType_parmlist(e); tempn = Swig_symbol_clookup_local(tprefix, st); tscope = tempn ? Getattr(tempn, "sym:symtab") : 0; Append(qprefix, "<("); for (ti = First(targs); ti.item;) { String *vparm; String *qparm = Swig_symbol_type_qualify(ti.item, st); if (tscope && (tscope != st)) { String *ty = Swig_symbol_type_qualify(qparm, tscope); Delete(qparm); qparm = ty; } vparm = Swig_symbol_template_param_eval(qparm, st); Append(qprefix, vparm); ti = Next(ti); if (ti.item) { Putc(',', qprefix); } Delete(qparm); Delete(vparm); } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(tprefix); Delete(tsuffix); Delete(targs); #ifdef SWIG_DEBUG Printf(stderr, "symbol_temp_qual %s %s\n", e, qprefix); #endif #ifdef SWIG_TEMPLATE_QUALIFY_CACHE Setattr(qualify_cache, scopetype, qprefix); Delete(scopetype); #endif return qprefix; } static int symbol_no_constructor(Node *n) { return !Checkattr(n, "nodeType", "constructor"); } /* ----------------------------------------------------------------------------- * Swig_symbol_type_qualify() * * Create a fully qualified type name * Note: Does not resolve a constructor if passed in as the 'type'. * ----------------------------------------------------------------------------- */ SwigType *Swig_symbol_type_qualify(const SwigType *t, Symtab *st) { List *elements; String *result = NewStringEmpty(); int i, len; char *c = Char(t); if (strncmp(c, "::", 2) == 0) { Append(result, t); return result; } elements = SwigType_split(t); len = Len(elements); for (i = 0; i < len; i++) { String *e = Getitem(elements, i); if (SwigType_issimple(e)) { /* Note: the unary scope operator (::) is being removed from the template parameters here. */ Node *n = Swig_symbol_clookup_check(e, st, symbol_no_constructor); if (n) { String *name = Getattr(n, "name"); Clear(e); Append(e, name); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qual_ei %d %s %s %p\n", i, name, e, st); #endif if (!Swig_scopename_check(name)) { String *qname = Swig_symbol_qualified(n); if (qname && Len(qname)) { Insert(e, 0, "::"); Insert(e, 0, qname); } #ifdef SWIG_DEBUG Printf(stderr, "symbol_qual_sc %d %s %s %p\n", i, qname, e, st); #endif Delete(qname); } } else if (SwigType_istemplate(e)) { SwigType *ty = symbol_template_qualify(e, st); Clear(e); Append(e, ty); Delete(ty); } if (strncmp(Char(e), "::", 2) == 0) { Delitem(e, 0); Delitem(e, 0); } Append(result, e); } else if (SwigType_isfunction(e)) { List *parms = SwigType_parmlist(e); String *s = NewString("f("); Iterator pi = First(parms); while (pi.item) { String *pf = Swig_symbol_type_qualify(pi.item, st); Append(s, pf); pi = Next(pi); if (pi.item) { Append(s, ","); } Delete(pf); } Append(s, ")."); Append(result, s); Delete(parms); Delete(s); } else { Append(result, e); } } Delete(elements); #ifdef SWIG_DEBUG Printf(stderr, "symbol_qualify %s %s %p %s\n", t, result, st, st ? Getattr(st, "name") : 0); #endif return result; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_reduce() * Resolves template parameter types * For example: * typedef int Int; * typedef Int Integer; * with input: * Foo<(Int,Integer)> * returns: * Foo<(int,int)> * ----------------------------------------------------------------------------- */ static SwigType *Swig_symbol_template_reduce(SwigType *qt, Symtab *ntab) { Parm *p; String *templateargs = SwigType_templateargs(qt); List *parms = SwigType_parmlist(templateargs); Iterator pi = First(parms); String *tprefix = SwigType_templateprefix(qt); String *tsuffix = SwigType_templatesuffix(qt); String *qprefix = SwigType_typedef_qualified(tprefix); Append(qprefix, "<("); while ((p = pi.item)) { String *np; String *tp = Swig_symbol_typedef_reduce(p, ntab); String *qp = Swig_symbol_type_qualify(tp, ntab); Node *n = Swig_symbol_clookup(qp, ntab); if (n) { String *qual = Swig_symbol_qualified(n); np = Copy(Getattr(n, "name")); Delete(tp); tp = np; if (qual && Len(qual)) { Insert(np, 0, "::"); Insert(np, 0, qual); } Delete(qual); } else { np = qp; } Append(qprefix, np); pi = Next(pi); if (pi.item) { Append(qprefix, ","); } Delete(qp); Delete(tp); } Append(qprefix, ")>"); Append(qprefix, tsuffix); Delete(parms); Delete(tprefix); Delete(tsuffix); Delete(templateargs); return qprefix; } /* ----------------------------------------------------------------------------- * Swig_symbol_typedef_reduce() * * Chase a typedef through symbol tables looking for a match. * ----------------------------------------------------------------------------- */ SwigType *Swig_symbol_typedef_reduce(const SwigType *ty, Symtab *tab) { SwigType *prefix, *base; Node *n; String *nt; base = SwigType_base(ty); prefix = SwigType_prefix(ty); n = Swig_symbol_clookup(base, tab); if (!n) { if (SwigType_istemplate(ty)) { SwigType *qt = Swig_symbol_template_reduce(base, tab); Append(prefix, qt); Delete(qt); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (a) %s %s\n", ty, prefix); #endif Delete(base); return prefix; } else { Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (b) %s %s\n", ty, ty); #endif return Copy(ty); } } nt = Getattr(n, "nodeType"); if (Equal(nt, "using")) { String *uname = Getattr(n, "uname"); if (uname) { n = Swig_symbol_clookup(base, Getattr(n, "sym:symtab")); if (!n) { Delete(base); Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (c) %s %s\n", ty, ty); #endif return Copy(ty); } } } if (Equal(nt, "cdecl")) { String *storage = Getattr(n, "storage"); if (storage && (Equal(storage, "typedef"))) { SwigType *decl; SwigType *rt; SwigType *qt; Symtab *ntab; SwigType *nt = Copy(Getattr(n, "type")); /* Fix for case 'typedef struct Hello hello;' */ { const char *dclass[3] = { "struct ", "union ", "class " }; int i; char *c = Char(nt); for (i = 0; i < 3; i++) { if (strstr(c, dclass[i]) == c) { Replace(nt, dclass[i], "", DOH_REPLACE_FIRST); } } } decl = Getattr(n, "decl"); if (decl) { SwigType_push(nt, decl); } SwigType_push(nt, prefix); Delete(base); Delete(prefix); ntab = Getattr(n, "sym:symtab"); rt = Swig_symbol_typedef_reduce(nt, ntab); qt = Swig_symbol_type_qualify(rt, ntab); if (SwigType_istemplate(qt)) { SwigType *qtr = Swig_symbol_template_reduce(qt, ntab); Delete(qt); qt = qtr; } Delete(nt); Delete(rt); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (d) %s %s\n", qt, ty); #endif return qt; } } Delete(base); Delete(prefix); #ifdef SWIG_DEBUG Printf(stderr, "symbol_reduce (e) %s %s\n", ty, ty); #endif return Copy(ty); } /* ----------------------------------------------------------------------------- * Swig_symbol_string_qualify() * * This function takes a string and looks for identifiers. Identifiers are * then qualified according to scope rules. This function is used in a number * of settings including expression evaluation, scoping of conversion operators, * and so forth. * ----------------------------------------------------------------------------- */ String *Swig_symbol_string_qualify(String *s, Symtab *st) { int have_id = 0; String *id = NewStringEmpty(); String *r = NewStringEmpty(); char *c = Char(s); int first_char = 1; while (*c) { if (isalpha((int) *c) || (*c == '_') || (*c == ':') || (*c == '~' && first_char) || (isdigit((int) *c) && !first_char)) { Putc(*c, id); have_id = 1; } else { if (have_id) { String *qid = Swig_symbol_type_qualify(id, st); Append(r, qid); Clear(id); Delete(qid); have_id = 0; } Putc(*c, r); } first_char = (*c == ':'); c++; } if (have_id) { String *qid = Swig_symbol_type_qualify(id, st); Append(r, qid); Delete(qid); } Delete(id); return r; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_defargs() * * Apply default arg from generic template default args * Returns a parameter list which contains missing default arguments (if any) * Note side effects: parms will also contain the extra parameters in its list * (but only if non-zero). * ----------------------------------------------------------------------------- */ ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl) { ParmList *expandedparms = parms; if (Len(parms) < Len(targs)) { Parm *lp = parms; Parm *p = lp; Parm *tp = targs; while (p && tp) { p = nextSibling(p); tp = nextSibling(tp); if (p) lp = p; } while (tp) { String *value = Getattr(tp, "value"); if (value) { Parm *cp; Parm *ta = targs; Parm *p = parms; SwigType *nt = Swig_symbol_string_qualify(value, tsdecl); SwigType *ntq = 0; #ifdef SWIG_DEBUG Printf(stderr, "value %s %s %s\n", value, nt, tsdecl ? Getattr(tsdecl, "name") : tsdecl); #endif while (p && ta) { String *name = Getattr(ta, "name"); String *pvalue = Getattr(p, "value"); String *value = pvalue ? pvalue : Getattr(p, "type"); String *ttq = Swig_symbol_type_qualify(value, tscope); /* value = SwigType_typedef_resolve_all(value); */ Replaceid(nt, name, ttq); p = nextSibling(p); ta = nextSibling(ta); Delete(ttq); } ntq = Swig_symbol_type_qualify(nt, tsdecl); if (SwigType_istemplate(ntq)) { String *ty = Swig_symbol_template_deftype(ntq, tscope); Delete(ntq); ntq = ty; } cp = NewParmWithoutFileLineInfo(ntq, 0); if (lp) { set_nextSibling(lp, cp); Delete(cp); } else { expandedparms = cp; } lp = cp; tp = nextSibling(tp); Delete(nt); Delete(ntq); } else { tp = 0; } } } return expandedparms; } /* ----------------------------------------------------------------------------- * Swig_symbol_template_deftype() * * Apply default args to generic template type * ----------------------------------------------------------------------------- */ #define SWIG_TEMPLATE_DEFTYPE_CACHE SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope) { String *result = NewStringEmpty(); List *elements = SwigType_split(type); int len = Len(elements); int i; #ifdef SWIG_TEMPLATE_DEFTYPE_CACHE static Hash *s_cache = 0; Hash *scope_cache; /* The lookup depends on the current scope and potential namespace qualification. Looking up x in namespace y is not the same as looking up x::y in outer scope. -> we use a 2-level hash: first scope and then symbol. */ String *scope_name = tscope ? Swig_symbol_qualifiedscopename(tscope) : Swig_symbol_qualifiedscopename(current_symtab); String *type_name = tscope ? NewStringf("%s::%s", Getattr(tscope, "name"), type) : NewStringf("%s::%s", Swig_symbol_getscopename(), type); if (!scope_name) scope_name = NewString("::"); if (!s_cache) { s_cache = NewHash(); } scope_cache = Getattr(s_cache, scope_name); if (scope_cache) { String *cres = Getattr(scope_cache, type_name); if (cres) { Append(result, cres); #ifdef SWIG_DEBUG Printf(stderr, "cached deftype %s(%s) -> %s\n", type, scope_name, result); #endif Delete(type_name); Delete(scope_name); return result; } } else { scope_cache = NewHash(); Setattr(s_cache, scope_name, scope_cache); Delete(scope_name); } #endif #ifdef SWIG_DEBUG Printf(stderr, "finding deftype %s\n", type); #endif for (i = 0; i < len; i++) { String *e = Getitem(elements, i); if (SwigType_isfunction(e)) { String *s = NewString("f("); List *parms = SwigType_parmlist(e); Iterator pi = First(parms); while (pi.item) { String *pf = SwigType_istemplate(e) ? Swig_symbol_template_deftype(pi.item, tscope) : Swig_symbol_type_qualify(pi.item, tscope); Append(s, pf); pi = Next(pi); if (pi.item) { Append(s, ","); } Delete(pf); } Append(s, ")."); Append(result, s); Delete(s); Delete(parms); } else if (SwigType_istemplate(e)) { String *prefix = SwigType_prefix(e); String *base = SwigType_base(e); String *tprefix = SwigType_templateprefix(base); String *targs = SwigType_templateargs(base); String *tsuffix = SwigType_templatesuffix(base); ParmList *tparms = SwigType_function_parms(targs, 0); Node *tempn = Swig_symbol_clookup_local(tprefix, tscope); if (!tempn && tsuffix && Len(tsuffix)) { tempn = Swig_symbol_clookup(tprefix, 0); } #ifdef SWIG_DEBUG Printf(stderr, "deftype type %s %s %d\n", e, tprefix, (long) tempn); #endif if (tempn) { ParmList *tnargs = Getattr(tempn, "templateparms"); ParmList *expandedparms; Parm *p; Symtab *tsdecl = Getattr(tempn, "sym:symtab"); #ifdef SWIG_DEBUG Printf(stderr, "deftype type %s %s %s\n", tprefix, targs, tsuffix); #endif Append(tprefix, "<("); expandedparms = Swig_symbol_template_defargs(tparms, tnargs, tscope, tsdecl); p = expandedparms; tscope = tsdecl; while (p) { SwigType *ptype = Getattr(p, "type"); SwigType *ttr = ptype ? ptype : Getattr(p, "value"); SwigType *ttf = Swig_symbol_type_qualify(ttr, tscope); SwigType *ttq = Swig_symbol_template_param_eval(ttf, tscope); #ifdef SWIG_DEBUG Printf(stderr, "arg type %s\n", ttq); #endif if (SwigType_istemplate(ttq)) { SwigType *ttd = Swig_symbol_template_deftype(ttq, tscope); Delete(ttq); ttq = ttd; #ifdef SWIG_DEBUG Printf(stderr, "arg deftype %s\n", ttq); #endif } Append(tprefix, ttq); p = nextSibling(p); if (p) Putc(',', tprefix); Delete(ttf); Delete(ttq); } Append(tprefix, ")>"); Append(tprefix, tsuffix); Append(prefix, tprefix); #ifdef SWIG_DEBUG Printf(stderr, "deftype %s %s \n", type, tprefix); #endif Append(result, prefix); } else { Append(result, e); } Delete(prefix); Delete(base); Delete(tprefix); Delete(tsuffix); Delete(targs); Delete(tparms); } else { Append(result, e); } } Delete(elements); #ifdef SWIG_TEMPLATE_DEFTYPE_CACHE Setattr(scope_cache, type_name, result); Delete(type_name); #endif return result; } SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab) { String *value = Copy(p); Node *lastnode = 0; while (1) { Node *n = Swig_symbol_clookup(value, symtab); if (n == lastnode) break; lastnode = n; if (n) { String *nt = Getattr(n, "nodeType"); if (Equal(nt, "enumitem")) { /* An enum item. Generate a fully qualified name */ String *qn = Swig_symbol_qualified(n); if (qn && Len(qn)) { Append(qn, "::"); Append(qn, Getattr(n, "name")); Delete(value); value = qn; continue; } else { Delete(qn); break; } } else if ((Equal(nt, "cdecl"))) { String *nv = Getattr(n, "value"); if (nv) { Delete(value); value = Copy(nv); continue; } } } break; } return value; } swig-3.0.12/Source/Swig/naming.c0000664000175000017500000014276413042756442016241 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * naming.c * * Functions for generating various kinds of names during code generation. * * Swig_name_register is used to register a format string for generating names. * The format string makes use of the following format specifiers: * * %c - class name is substituted * %f - function name is substituted * %m - member name is substituted * %n - namespace is substituted * %v - variable name is substituted * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include /* Hash table containing naming data */ static Hash *naming_hash = 0; #if 0 #define SWIG_DEBUG #endif /* ----------------------------------------------------------------------------- * Swig_name_register() * * Register a new naming format. * ----------------------------------------------------------------------------- */ void Swig_name_register(const_String_or_char_ptr method, const_String_or_char_ptr format) { if (!naming_hash) naming_hash = NewHash(); Setattr(naming_hash, method, format); } void Swig_name_unregister(const_String_or_char_ptr method) { if (naming_hash) { Delattr(naming_hash, method); } } /* Return naming format for the specified method or the default format if none was explicitly registered */ static String* get_naming_format_for(const char *method, const char *def_format) { String* f = naming_hash ? Getattr(naming_hash, method) : NULL; return f ? Copy(f) : NewString(def_format); } static int name_mangle(String *r) { char *c; int special; special = 0; Replaceall(r, "::", "_"); c = Char(r); while (*c) { if (!isalnum((int) *c) && (*c != '_')) { special = 1; switch (*c) { case '+': *c = 'a'; break; case '-': *c = 's'; break; case '*': *c = 'm'; break; case '/': *c = 'd'; break; case '<': *c = 'l'; break; case '>': *c = 'g'; break; case '=': *c = 'e'; break; case ',': *c = 'c'; break; case '(': *c = 'p'; break; case ')': *c = 'P'; break; case '[': *c = 'b'; break; case ']': *c = 'B'; break; case '^': *c = 'x'; break; case '&': *c = 'A'; break; case '|': *c = 'o'; break; case '~': *c = 'n'; break; case '!': *c = 'N'; break; case '%': *c = 'M'; break; case '.': *c = 'f'; break; case '?': *c = 'q'; break; default: *c = '_'; break; } } c++; } if (special) Append(r, "___"); return special; } /* ----------------------------------------------------------------------------- * replace_nspace() * * Mangles in the namespace from nspace by replacing %n in name if nspace feature required. * ----------------------------------------------------------------------------- */ static void replace_nspace(String *name, const_String_or_char_ptr nspace) { if (nspace) { String *namspace = NewStringf("%s_", nspace); Replaceall(namspace, NSPACE_SEPARATOR, "_"); Replace(name, "%n", namspace, DOH_REPLACE_ANY); Delete(namspace); } else { Replace(name, "%n", "", DOH_REPLACE_ANY); } } /* ----------------------------------------------------------------------------- * Swig_name_mangle() * * Converts all of the non-identifier characters of a string to underscores. * ----------------------------------------------------------------------------- */ String *Swig_name_mangle(const_String_or_char_ptr s) { #if 0 String *r = NewString(s); name_mangle(r); return r; #else return Swig_string_mangle(s); #endif } /* ----------------------------------------------------------------------------- * Swig_name_wrapper() * * Returns the name of a wrapper function. * ----------------------------------------------------------------------------- */ String *Swig_name_wrapper(const_String_or_char_ptr fname) { String *r = get_naming_format_for("wrapper", "_wrap_%f"); Replace(r, "%f", fname, DOH_REPLACE_ANY); name_mangle(r); return r; } /* ----------------------------------------------------------------------------- * Swig_name_member() * * Returns the name of a class method. * ----------------------------------------------------------------------------- */ String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_ptr classname, const_String_or_char_ptr membername) { String *r; String *rclassname; char *cname; rclassname = SwigType_namestr(classname); r = get_naming_format_for("member", "%n%c_%m"); cname = Char(rclassname); if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) { cname = strchr(cname, ' ') + 1; } replace_nspace(r, nspace); Replace(r, "%c", cname, DOH_REPLACE_ANY); Replace(r, "%m", membername, DOH_REPLACE_ANY); /* name_mangle(r); */ Delete(rclassname); return r; } /* ----------------------------------------------------------------------------- * Swig_name_get() * * Returns the name of the accessor function used to get a variable. * ----------------------------------------------------------------------------- */ String *Swig_name_get(const_String_or_char_ptr nspace, const_String_or_char_ptr vname) { String *r = get_naming_format_for("get", "%n%v_get"); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_get: '%s'\n", vname); #endif replace_nspace(r, nspace); Replace(r, "%v", vname, DOH_REPLACE_ANY); /* name_mangle(r); */ return r; } /* ----------------------------------------------------------------------------- * Swig_name_set() * * Returns the name of the accessor function used to set a variable. * ----------------------------------------------------------------------------- */ String *Swig_name_set(const_String_or_char_ptr nspace, const_String_or_char_ptr vname) { String *r = get_naming_format_for("set", "%n%v_set"); replace_nspace(r, nspace); Replace(r, "%v", vname, DOH_REPLACE_ANY); /* name_mangle(r); */ return r; } /* Common implementation of all Swig_name_() functions below. */ static String *make_full_name_for(const char *method, const char *def_format, const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { String *r; String *rclassname; char *cname; rclassname = SwigType_namestr(classname); r = get_naming_format_for(method, def_format); cname = Char(rclassname); if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) { cname = strchr(cname, ' ') + 1; } replace_nspace(r, nspace); Replace(r, "%c", cname, DOH_REPLACE_ANY); Delete(rclassname); return r; } /* ----------------------------------------------------------------------------- * Swig_name_construct() * * Returns the name of the accessor function used to create an object. * ----------------------------------------------------------------------------- */ String *Swig_name_construct(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("construct", "new_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_copyconstructor() * * Returns the name of the accessor function used to copy an object. * ----------------------------------------------------------------------------- */ String *Swig_name_copyconstructor(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("copy", "copy_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_destroy() * * Returns the name of the accessor function used to destroy an object. * ----------------------------------------------------------------------------- */ String *Swig_name_destroy(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("destroy", "delete_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_disown() * * Returns the name of the accessor function used to disown an object. * ----------------------------------------------------------------------------- */ String *Swig_name_disown(const_String_or_char_ptr nspace, const_String_or_char_ptr classname) { return make_full_name_for("disown", "disown_%n%c", nspace, classname); } /* ----------------------------------------------------------------------------- * Swig_name_object_set() * * Sets an object associated with a name and optional declarators. * ----------------------------------------------------------------------------- */ void Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object) { DOH *n; #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_set: '%s', '%s'\n", name, decl); #endif n = Getattr(namehash, name); if (!n) { n = NewHash(); Setattr(namehash, name, n); Delete(n); } /* Add an object based on the declarator value */ if (!decl) { Setattr(n, "start", object); } else { SwigType *cd = Copy(decl); Setattr(n, cd, object); Delete(cd); } } /* ----------------------------------------------------------------------------- * Swig_name_object_get() * * Return an object associated with an optional class prefix, name, and * declarator. This function operates according to name matching rules * described for the %rename directive in the SWIG manual. * ----------------------------------------------------------------------------- */ static DOH *get_object(Hash *n, String *decl) { DOH *rn = 0; if (!n) return 0; if (decl) { rn = Getattr(n, decl); } else { rn = Getattr(n, "start"); } return rn; } static DOH *name_object_get(Hash *namehash, String *tname, SwigType *decl, SwigType *ncdecl) { DOH *rn = 0; Hash *n = Getattr(namehash, tname); if (n) { rn = get_object(n, decl); if ((!rn) && ncdecl) rn = get_object(n, ncdecl); if (!rn) rn = get_object(n, 0); } return rn; } DOH *Swig_name_object_get(Hash *namehash, String *prefix, String *name, SwigType *decl) { String *tname = NewStringEmpty(); DOH *rn = 0; char *ncdecl = 0; if (!namehash) return 0; /* DB: This removed to more tightly control feature/name matching */ /* if ((decl) && (SwigType_isqualifier(decl))) { ncdecl = strchr(Char(decl),'.'); ncdecl++; } */ #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_get: '%s' '%s', '%s'\n", prefix, name, decl); #endif /* Perform a class-based lookup (if class prefix supplied) */ if (prefix) { if (Len(prefix)) { Printf(tname, "%s::%s", prefix, name); rn = name_object_get(namehash, tname, decl, ncdecl); if (!rn) { String *cls = Swig_scopename_last(prefix); if (!Equal(cls, prefix)) { Clear(tname); Printf(tname, "*::%s::%s", cls, name); rn = name_object_get(namehash, tname, decl, ncdecl); } Delete(cls); } /* Lookup a name within a templated-based class */ if (!rn) { String *t_name = SwigType_istemplate_templateprefix(prefix); if (t_name) { Clear(tname); Printf(tname, "%s::%s", t_name, name); rn = name_object_get(namehash, tname, decl, ncdecl); Delete(t_name); } } /* Lookup a template-based name within a class */ if (!rn) { String *t_name = SwigType_istemplate_templateprefix(name); if (t_name) rn = Swig_name_object_get(namehash, prefix, t_name, decl); Delete(t_name); } } /* A wildcard-based class lookup */ if (!rn) { Clear(tname); Printf(tname, "*::%s", name); rn = name_object_get(namehash, tname, decl, ncdecl); } } else { /* Lookup in the global namespace only */ Clear(tname); Printf(tname, "::%s", name); rn = name_object_get(namehash, tname, decl, ncdecl); } /* Catch-all */ if (!rn) { rn = name_object_get(namehash, name, decl, ncdecl); } if (!rn && Swig_scopename_check(name)) { String *nprefix = NewStringEmpty(); String *nlast = NewStringEmpty(); Swig_scopename_split(name, &nprefix, &nlast); rn = name_object_get(namehash, nlast, decl, ncdecl); Delete(nlast); Delete(nprefix); } Delete(tname); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_object_get: found %d\n", rn ? 1 : 0); #endif return rn; } /* ----------------------------------------------------------------------------- * Swig_name_object_inherit() * * Implements name-based inheritance scheme. * ----------------------------------------------------------------------------- */ void Swig_name_object_inherit(Hash *namehash, String *base, String *derived) { Iterator ki; Hash *derh; String *bprefix; String *dprefix; char *cbprefix; int plen; if (!namehash) return; /* Temporary hash holding all the entries we add while we iterate over namehash itself as we can't modify the latter while iterating over it. */ derh = NULL; bprefix = NewStringf("%s::", base); dprefix = NewStringf("%s::", derived); cbprefix = Char(bprefix); plen = (int)strlen(cbprefix); for (ki = First(namehash); ki.key; ki = Next(ki)) { char *k = Char(ki.key); if (strncmp(k, cbprefix, plen) == 0) { /* Copy, adjusting name, this element to the derived hash. */ Iterator oi; String *nkey = NewStringf("%s%s", dprefix, k + plen); Hash *n = ki.item; Hash *newh; /* Don't overwrite an existing value for the derived class, if any. */ newh = Getattr(namehash, nkey); if (!newh) { if (!derh) derh = NewHash(); newh = NewHash(); Setattr(derh, nkey, newh); Delete(newh); } for (oi = First(n); oi.key; oi = Next(oi)) { if (!Getattr(newh, oi.key)) { String *ci = Copy(oi.item); Setattr(newh, oi.key, ci); Delete(ci); } } Delete(nkey); } } /* Merge the contents of derived hash into the main hash. */ if (derh) { for (ki = First(derh); ki.key; ki = Next(ki)) { Setattr(namehash, ki.key, ki.item); } } Delete(bprefix); Delete(dprefix); Delete(derh); } /* ----------------------------------------------------------------------------- * merge_features() * * Given a hash, this function merges the features in the hash into the node. * ----------------------------------------------------------------------------- */ static void merge_features(Hash *features, Node *n) { Iterator ki; if (!features) return; for (ki = First(features); ki.key; ki = Next(ki)) { String *ci = Copy(ki.item); Setattr(n, ki.key, ci); Delete(ci); } } /* ----------------------------------------------------------------------------- * Swig_features_get() * * Attaches any features in the features hash to the node that matches * the declaration, decl. * ----------------------------------------------------------------------------- */ static void features_get(Hash *features, const String *tname, SwigType *decl, SwigType *ncdecl, Node *node) { Node *n = Getattr(features, tname); #ifdef SWIG_DEBUG Printf(stdout, " features_get: %s\n", tname); #endif if (n) { merge_features(get_object(n, 0), node); if (ncdecl) merge_features(get_object(n, ncdecl), node); merge_features(get_object(n, decl), node); } } void Swig_features_get(Hash *features, String *prefix, String *name, SwigType *decl, Node *node) { char *ncdecl = 0; String *rdecl = 0; String *rname = 0; if (!features) return; /* MM: This removed to more tightly control feature/name matching */ /* if ((decl) && (SwigType_isqualifier(decl))) { ncdecl = strchr(Char(decl),'.'); ncdecl++; } */ /* very specific hack for template constructors/destructors */ if (name && SwigType_istemplate(name)) { String *nodetype = nodeType(node); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = NewStringEmpty(); String *nlast = NewStringEmpty(); String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); if (Len(nprefix)) { Append(nprefix, "::"); Append(nprefix, tprefix); Delete(tprefix); rname = nprefix; } else { rname = tprefix; Delete(nprefix); } rdecl = Copy(decl); Replaceall(rdecl, name, rname); decl = rdecl; name = rname; } } #ifdef SWIG_DEBUG Printf(stdout, "Swig_features_get: '%s' '%s' '%s'\n", prefix, name, decl); #endif /* Global features */ features_get(features, "", 0, 0, node); if (name) { String *tname = NewStringEmpty(); /* add features for 'root' template */ String *dname = SwigType_istemplate_templateprefix(name); if (dname) { features_get(features, dname, decl, ncdecl, node); } /* Catch-all */ features_get(features, name, decl, ncdecl, node); /* Perform a class-based lookup (if class prefix supplied) */ if (prefix) { /* A class-generic feature */ if (Len(prefix)) { Printf(tname, "%s::", prefix); features_get(features, tname, decl, ncdecl, node); } /* A wildcard-based class lookup */ Clear(tname); Printf(tname, "*::%s", name); features_get(features, tname, decl, ncdecl, node); /* A specific class lookup */ if (Len(prefix)) { /* A template-based class lookup */ String *tprefix = SwigType_istemplate_templateprefix(prefix); if (tprefix) { Clear(tname); Printf(tname, "%s::%s", tprefix, name); features_get(features, tname, decl, ncdecl, node); } Clear(tname); Printf(tname, "%s::%s", prefix, name); features_get(features, tname, decl, ncdecl, node); Delete(tprefix); } } else { /* Lookup in the global namespace only */ Clear(tname); Printf(tname, "::%s", name); features_get(features, tname, decl, ncdecl, node); } Delete(tname); Delete(dname); } if (name && SwigType_istemplate(name)) { /* add features for complete template type */ String *dname = Swig_symbol_template_deftype(name, 0); if (!Equal(dname, name)) { Swig_features_get(features, prefix, dname, decl, node); } Delete(dname); } if (rname) Delete(rname); if (rdecl) Delete(rdecl); } /* ----------------------------------------------------------------------------- * Swig_feature_set() * * Sets a feature name and value. Also sets optional feature attributes as * passed in by featureattribs. Optional feature attributes are given a full name * concatenating the feature name plus ':' plus the attribute name. * ----------------------------------------------------------------------------- */ void Swig_feature_set(Hash *features, const_String_or_char_ptr name, SwigType *decl, const_String_or_char_ptr featurename, const_String_or_char_ptr value, Hash *featureattribs) { Hash *n; Hash *fhash; #ifdef SWIG_DEBUG Printf(stdout, "Swig_feature_set: '%s' '%s' '%s' '%s'\n", name, decl, featurename, value); #endif n = Getattr(features, name); if (!n) { n = NewHash(); Setattr(features, name, n); Delete(n); } if (!decl) { fhash = Getattr(n, "start"); if (!fhash) { fhash = NewHash(); Setattr(n, "start", fhash); Delete(fhash); } } else { fhash = Getattr(n, decl); if (!fhash) { String *cdecl_ = Copy(decl); fhash = NewHash(); Setattr(n, cdecl_, fhash); Delete(cdecl_); Delete(fhash); } } if (value) { Setattr(fhash, featurename, value); } else { Delattr(fhash, featurename); } { /* Add in the optional feature attributes */ Hash *attribs = featureattribs; while (attribs) { String *attribname = Getattr(attribs, "name"); String *featureattribname = NewStringf("%s:%s", featurename, attribname); if (value) { String *attribvalue = Getattr(attribs, "value"); Setattr(fhash, featureattribname, attribvalue); } else { Delattr(fhash, featureattribname); } attribs = nextSibling(attribs); Delete(featureattribname); } } if (name && SwigType_istemplate(name)) { String *dname = Swig_symbol_template_deftype(name, 0); if (Strcmp(dname, name)) { Swig_feature_set(features, dname, decl, featurename, value, featureattribs); } Delete(dname); } } /* ----------------------------------------------------------------------------- * The rename/namewarn engine * * Code below was in parser.y for a while * ----------------------------------------------------------------------------- */ static Hash *namewarn_hash = 0; static Hash *name_namewarn_hash() { if (!namewarn_hash) namewarn_hash = NewHash(); return namewarn_hash; } static Hash *rename_hash = 0; static Hash *name_rename_hash() { if (!rename_hash) rename_hash = NewHash(); return rename_hash; } static List *namewarn_list = 0; static List *name_namewarn_list() { if (!namewarn_list) namewarn_list = NewList(); return namewarn_list; } static List *rename_list = 0; static List *name_rename_list() { if (!rename_list) rename_list = NewList(); return rename_list; } /* ----------------------------------------------------------------------------- * int need_name_warning(Node *n) * * Detects if a node needs name warnings * * ----------------------------------------------------------------------------- */ static int need_name_warning(Node *n) { int need = 1; /* We don't use name warnings for: - class forwards, no symbol is generated at the target language. - template declarations, only for real instances using %template(name). - typedefs, have no effect at the target language. - using declarations and using directives, have no effect at the target language. */ if (checkAttribute(n, "nodeType", "classforward")) { need = 0; } else if (checkAttribute(n, "nodeType", "using")) { need = 0; } else if (checkAttribute(n, "storage", "typedef")) { need = 0; } else if (Getattr(n, "hidden")) { need = 0; } else if (Getattr(n, "ignore")) { need = 0; } else if (Getattr(n, "templatetype")) { need = 0; } else if (GetFlag(n, "parsing_template_declaration")) { need = 0; } return need; } /* ----------------------------------------------------------------------------- * int Swig_need_redefined_warn() * * Detects when a redefined object needs a warning * * ----------------------------------------------------------------------------- */ static int nodes_are_equivalent(Node *a, Node *b, int a_inclass) { /* they must have the same type */ String *ta = nodeType(a); String *tb = nodeType(b); if (!Equal(ta, tb)) { if (!(Equal(ta, "using") && Equal(tb, "cdecl"))) { return 0; } } if (Cmp(ta, "cdecl") == 0) { /* both cdecl case */ /* typedef */ String *a_storage = Getattr(a, "storage"); String *b_storage = Getattr(b, "storage"); if ((Cmp(a_storage, "typedef") == 0) || (Cmp(b_storage, "typedef") == 0)) { if (Cmp(a_storage, b_storage) == 0) { String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if (Cmp(a_type, b_type) == 0) return 1; } return 0; } /* static functions */ if (Swig_storage_isstatic(a) || Swig_storage_isstatic(b)) { if (Cmp(a_storage, b_storage) != 0) return 0; } /* friend methods */ if (!a_inclass || (Cmp(a_storage, "friend") == 0)) { /* check declaration */ String *a_decl = (Getattr(a, "decl")); String *b_decl = (Getattr(b, "decl")); if (Cmp(a_decl, b_decl) == 0) { /* check return type */ String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if (Cmp(a_type, b_type) == 0) { /* check parameters */ Parm *ap = (Getattr(a, "parms")); Parm *bp = (Getattr(b, "parms")); while (ap && bp) { SwigType *at = Getattr(ap, "type"); SwigType *bt = Getattr(bp, "type"); if (Cmp(at, bt) != 0) return 0; ap = nextSibling(ap); bp = nextSibling(bp); } if (ap || bp) { return 0; } else { Node *a_template = Getattr(a, "template"); Node *b_template = Getattr(b, "template"); /* Not equivalent if one is a template instantiation (via %template) and the other is a non-templated function */ if ((a_template && !b_template) || (!a_template && b_template)) return 0; } return 1; } } } } else if (Equal(ta, "using")) { /* using and cdecl case */ String *b_storage = Getattr(b, "storage"); if (Equal(b_storage, "typedef")) { String *a_name = Getattr(a, "name"); String *b_name = Getattr(b, "name"); if (Equal(a_name, b_name)) return 1; } } else { /* both %constant case */ String *a_storage = Getattr(a, "storage"); String *b_storage = Getattr(b, "storage"); if ((Cmp(a_storage, "%constant") == 0) || (Cmp(b_storage, "%constant") == 0)) { if (Cmp(a_storage, b_storage) == 0) { String *a_type = (Getattr(a, "type")); String *b_type = (Getattr(b, "type")); if ((Cmp(a_type, b_type) == 0) && (Cmp(Getattr(a, "value"), Getattr(b, "value")) == 0)) return 1; } return 0; } if (Equal(ta, "template") && Equal(tb, "template")) { if (Cmp(a_storage, "friend") == 0 || Cmp(b_storage, "friend") == 0) return 1; } } return 0; } int Swig_need_redefined_warn(Node *a, Node *b, int InClass) { String *a_name = Getattr(a, "name"); String *b_name = Getattr(b, "name"); String *a_symname = Getattr(a, "sym:name"); String *b_symname = Getattr(b, "sym:name"); /* always send a warning if a 'rename' is involved */ if ((a_symname && !Equal(a_symname, a_name)) || (b_symname && !Equal(b_symname, b_name))) { if (!Equal(a_name, b_name)) { return 1; } } return !nodes_are_equivalent(a, b, InClass); } /* ----------------------------------------------------------------------------- * int Swig_need_protected(Node* n) * * Detects when we need to fully register the protected member. * This is basically any protected members when the allprotected mode is set. * Otherwise we take just the protected virtual methods and non-static methods * (potentially virtual methods) as well as constructors/destructors. * Also any "using" statements in a class may potentially be virtual. * ----------------------------------------------------------------------------- */ int Swig_need_protected(Node *n) { String *nodetype = nodeType(n); if (checkAttribute(n, "access", "protected")) { if ((Equal(nodetype, "cdecl"))) { if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode()) { return 1; } if (SwigType_isfunction(Getattr(n, "decl"))) { String *storage = Getattr(n, "storage"); /* The function is declared virtual, or it has no storage. This eliminates typedef, static etc. */ return !storage || Equal(storage, "virtual"); } } else if (Equal(nodetype, "constructor") || Equal(nodetype, "destructor")) { return 1; } else if (Equal(nodetype, "using") && !Getattr(n, "namespace")) { return 1; } } return 0; } /* ----------------------------------------------------------------------------- * void name_nameobj_add() * * Add nameobj (rename/namewarn) * * ----------------------------------------------------------------------------- */ static List *make_attrlist(const char *ckey) { List *list = NewList(); const char *cattr = strchr(ckey, '$'); if (cattr) { String *nattr; const char *rattr = strchr(++cattr, '$'); while (rattr) { nattr = NewStringWithSize(cattr, (int)(rattr - cattr)); Append(list, nattr); Delete(nattr); cattr = rattr + 1; rattr = strchr(cattr, '$'); } nattr = NewString(cattr); Append(list, nattr); Delete(nattr); } else { Append(list, "nodeType"); } return list; } static void name_object_attach_keys(const char *keys[], Hash *nameobj) { Node *kw = nextSibling(nameobj); List *matchlist = 0; while (kw) { Node *next = nextSibling(kw); String *kname = Getattr(kw, "name"); char *ckey = kname ? Char(kname) : 0; if (ckey) { const char **rkey; int isnotmatch = 0; int isregexmatch = 0; if ((strncmp(ckey, "match", 5) == 0) || (isnotmatch = (strncmp(ckey, "notmatch", 8) == 0)) || (isregexmatch = (strncmp(ckey, "regexmatch", 10) == 0)) || (isnotmatch = isregexmatch = (strncmp(ckey, "notregexmatch", 13) == 0))) { Hash *mi = NewHash(); List *attrlist = make_attrlist(ckey); if (!matchlist) matchlist = NewList(); Setattr(mi, "value", Getattr(kw, "value")); Setattr(mi, "attrlist", attrlist); if (isnotmatch) SetFlag(mi, "notmatch"); if (isregexmatch) SetFlag(mi, "regexmatch"); Delete(attrlist); Append(matchlist, mi); Delete(mi); removeNode(kw); } else { for (rkey = keys; *rkey != 0; ++rkey) { if (strcmp(ckey, *rkey) == 0) { Setattr(nameobj, *rkey, Getattr(kw, "value")); removeNode(kw); } } } } kw = next; } if (matchlist) { Setattr(nameobj, "matchlist", matchlist); Delete(matchlist); } } static void name_nameobj_add(Hash *name_hash, List *name_list, String *prefix, String *name, SwigType *decl, Hash *nameobj) { String *nname = 0; if (name && Len(name)) { String *target_fmt = Getattr(nameobj, "targetfmt"); nname = prefix ? NewStringf("%s::%s", prefix, name) : NewString(name); if (target_fmt) { String *tmp = NewStringf(target_fmt, nname); Delete(nname); nname = tmp; } } if (!nname || !Len(nname) || Getattr(nameobj, "fullname") || /* any of these options trigger a 'list' nameobj */ Getattr(nameobj, "sourcefmt") || Getattr(nameobj, "matchlist") || Getattr(nameobj, "regextarget")) { if (decl) Setattr(nameobj, "decl", decl); if (nname && Len(nname)) Setattr(nameobj, "targetname", nname); /* put the new nameobj at the beginnig of the list, such that the last inserted rule take precedence */ Insert(name_list, 0, nameobj); } else { /* here we add an old 'hash' nameobj, simple and fast */ Swig_name_object_set(name_hash, nname, decl, nameobj); } Delete(nname); } /* ----------------------------------------------------------------------------- * int name_match_nameobj() * * Apply and check the nameobj's math list to the node * * ----------------------------------------------------------------------------- */ static DOH *get_lattr(Node *n, List *lattr) { DOH *res = 0; int ilen = Len(lattr); int i; for (i = 0; n && (i < ilen); ++i) { String *nattr = Getitem(lattr, i); res = Getattr(n, nattr); #ifdef SWIG_DEBUG if (!res) { Printf(stdout, "missing %s %s %s\n", nattr, Getattr(n, "name"), Getattr(n, "member")); } else { Printf(stdout, "lattr %d %s %s\n", i, nattr, DohIsString(res) ? res : Getattr(res, "name")); } #endif n = res; } return res; } #ifdef HAVE_PCRE #include static int name_regexmatch_value(Node *n, String *pattern, String *s) { pcre *compiled_pat; const char *err; int errpos; int rc; compiled_pat = pcre_compile(Char(pattern), 0, &err, &errpos, NULL); if (!compiled_pat) { Swig_error("SWIG", Getline(n), "Invalid regex \"%s\": compilation failed at %d: %s\n", Char(pattern), errpos, err); exit(1); } rc = pcre_exec(compiled_pat, NULL, Char(s), Len(s), 0, 0, NULL, 0); pcre_free(compiled_pat); if (rc == PCRE_ERROR_NOMATCH) return 0; if (rc < 0 ) { Swig_error("SWIG", Getline(n), "Matching \"%s\" against regex \"%s\" failed: %d\n", Char(s), Char(pattern), rc); exit(1); } return 1; } #else /* !HAVE_PCRE */ static int name_regexmatch_value(Node *n, String *pattern, String *s) { (void)pattern; (void)s; Swig_error("SWIG", Getline(n), "PCRE regex matching is not available in this SWIG build.\n"); exit(1); } #endif /* HAVE_PCRE/!HAVE_PCRE */ static int name_match_value(String *mvalue, String *value) { #if defined(SWIG_USE_SIMPLE_MATCHOR) int match = 0; char *cvalue = Char(value); char *cmvalue = Char(mvalue); char *sep = strchr(cmvalue, '|'); while (sep && !match) { match = strncmp(cvalue, cmvalue, sep - cmvalue) == 0; #ifdef SWIG_DEBUG Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match); #endif cmvalue = sep + 1; sep = strchr(cmvalue, '|'); } if (!match) { match = strcmp(cvalue, cmvalue) == 0; #ifdef SWIG_DEBUG Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match); #endif } return match; #else return Equal(mvalue, value); #endif } static int name_match_nameobj(Hash *rn, Node *n) { int match = 1; List *matchlist = Getattr(rn, "matchlist"); #ifdef SWIG_DEBUG Printf(stdout, "name_match_nameobj: %s\n", Getattr(n, "name")); #endif if (matchlist) { int ilen = Len(matchlist); int i; for (i = 0; match && (i < ilen); ++i) { Node *mi = Getitem(matchlist, i); List *lattr = Getattr(mi, "attrlist"); String *nval = get_lattr(n, lattr); int notmatch = GetFlag(mi, "notmatch"); int regexmatch = GetFlag(mi, "regexmatch"); match = 0; if (nval) { String *kwval = Getattr(mi, "value"); match = regexmatch ? name_regexmatch_value(n, kwval, nval) : name_match_value(kwval, nval); #ifdef SWIG_DEBUG Printf(stdout, "val %s %s %d %d \n", nval, kwval, match, ilen); #endif } if (notmatch) match = !match; } } #ifdef SWIG_DEBUG Printf(stdout, "name_match_nameobj: %d\n", match); #endif return match; } /* ----------------------------------------------------------------------------- * Hash *name_nameobj_lget() * * Get a nameobj (rename/namewarn) from the list of filters * * ----------------------------------------------------------------------------- */ static Hash *name_nameobj_lget(List *namelist, Node *n, String *prefix, String *name, String *decl) { Hash *res = 0; if (namelist) { int len = Len(namelist); int i; int match = 0; for (i = 0; !match && (i < len); i++) { Hash *rn = Getitem(namelist, i); String *rdecl = Getattr(rn, "decl"); if (rdecl && (!decl || !Equal(rdecl, decl))) { continue; } else if (name_match_nameobj(rn, n)) { String *tname = Getattr(rn, "targetname"); if (tname) { String *sfmt = Getattr(rn, "sourcefmt"); String *sname = 0; int fullname = GetFlag(rn, "fullname"); int regextarget = GetFlag(rn, "regextarget"); if (sfmt) { if (fullname && prefix) { String *pname = NewStringf("%s::%s", prefix, name); sname = NewStringf(sfmt, pname); Delete(pname); } else { sname = NewStringf(sfmt, name); } } else { if (fullname && prefix) { sname = NewStringf("%s::%s", prefix, name); } else { sname = name; DohIncref(name); } } match = regextarget ? name_regexmatch_value(n, tname, sname) : name_match_value(tname, sname); Delete(sname); } else { /* Applying the renaming rule may fail if it contains a %(regex)s expression that doesn't match the given name. */ String *sname = NewStringf(Getattr(rn, "name"), name); if (sname) { if (Len(sname)) match = 1; Delete(sname); } } } if (match) { res = rn; break; } } } return res; } /* ----------------------------------------------------------------------------- * Swig_name_namewarn_add * * Add a namewarn objects * * ----------------------------------------------------------------------------- */ void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn) { const char *namewrn_keys[] = { "rename", "error", "fullname", "sourcefmt", "targetfmt", 0 }; name_object_attach_keys(namewrn_keys, namewrn); name_nameobj_add(name_namewarn_hash(), name_namewarn_list(), prefix, name, decl, namewrn); } /* ----------------------------------------------------------------------------- * Hash *name_namewarn_get() * * Return the namewarn object, if there is one. * * ----------------------------------------------------------------------------- */ static Hash *name_namewarn_get(Node *n, String *prefix, String *name, SwigType *decl) { if (!namewarn_hash && !namewarn_list) return 0; if (n) { /* Return in the obvious cases */ if (!name || !need_name_warning(n)) { return 0; } else { String *access = Getattr(n, "access"); int is_public = !access || Equal(access, "public"); if (!is_public && !Swig_need_protected(n)) { return 0; } } } if (name) { /* Check to see if the name is in the hash */ Hash *wrn = Swig_name_object_get(name_namewarn_hash(), prefix, name, decl); if (wrn && !name_match_nameobj(wrn, n)) wrn = 0; if (!wrn) { wrn = name_nameobj_lget(name_namewarn_list(), n, prefix, name, decl); } if (wrn && Getattr(wrn, "error")) { if (n) { Swig_error(Getfile(n), Getline(n), "%s\n", Getattr(wrn, "name")); } else { Swig_error(cparse_file, cparse_line, "%s\n", Getattr(wrn, "name")); } } return wrn; } else { return 0; } } /* ----------------------------------------------------------------------------- * String *Swig_name_warning() * * Return the name warning, if there is one. * * ----------------------------------------------------------------------------- */ String *Swig_name_warning(Node *n, String *prefix, String *name, SwigType *decl) { Hash *wrn = name_namewarn_get(n, prefix, name, decl); return (name && wrn) ? Getattr(wrn, "name") : 0; } /* ----------------------------------------------------------------------------- * Swig_name_rename_add() * * Manage the rename objects * * ----------------------------------------------------------------------------- */ static void single_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname) { name_nameobj_add(name_rename_hash(), name_rename_list(), prefix, name, decl, newname); } /* Add a new rename. Works much like new_feature including default argument handling. */ void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname, ParmList *declaratorparms) { ParmList *declparms = declaratorparms; const char *rename_keys[] = { "fullname", "sourcefmt", "targetfmt", "continue", "regextarget", 0 }; name_object_attach_keys(rename_keys, newname); /* Add the name */ single_rename_add(prefix, name, decl, newname); /* Add extra names if there are default parameters in the parameter list */ if (decl) { int constqualifier = SwigType_isconst(decl); while (declparms) { if (ParmList_has_defaultargs(declparms)) { /* Create a parameter list for the new rename by copying all but the last (defaulted) parameter */ ParmList *newparms = CopyParmListMax(declparms,ParmList_len(declparms)-1); /* Create new declaration - with the last parameter removed */ SwigType *newdecl = Copy(decl); Delete(SwigType_pop_function(newdecl)); /* remove the old parameter list from newdecl */ SwigType_add_function(newdecl, newparms); if (constqualifier) SwigType_add_qualifier(newdecl, "const"); single_rename_add(prefix, name, newdecl, newname); declparms = newparms; Delete(newdecl); } else { declparms = 0; } } } } /* Create a name applying rename/namewarn if needed */ static String *apply_rename(String *newname, int fullname, String *prefix, String *name) { String *result = 0; if (newname && Len(newname)) { if (Strcmp(newname, "$ignore") == 0) { result = Copy(newname); } else { char *cnewname = Char(newname); if (cnewname) { int destructor = name && (*(Char(name)) == '~'); String *fmt = newname; /* use name as a fmt, but avoid C++ "%" and "%=" operators */ if (Len(newname) > 1 && strchr(cnewname, '%') && !(strcmp(cnewname, "%=") == 0)) { if (fullname && prefix) { result = NewStringf(fmt, prefix, name); } else { result = NewStringf(fmt, name); } } else { result = Copy(newname); } if (destructor && result && (*(Char(result)) != '~')) { Insert(result, 0, "~"); } } } } return result; } /* ----------------------------------------------------------------------------- * String *Swig_name_make() * * Make a name after applying all the rename/namewarn objects * * ----------------------------------------------------------------------------- */ String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname) { String *nname = 0; String *result = 0; String *name = NewString(cname); Hash *wrn = 0; String *rdecl = 0; String *rname = 0; /* very specific hack for template constructors/destructors */ #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: looking for %s %s %s %s\n", prefix, name, decl, oldname); #endif if (name && n && SwigType_istemplate(name)) { String *nodetype = nodeType(n); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = NewStringEmpty(); String *nlast = NewStringEmpty(); String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); if (Len(nprefix)) { Append(nprefix, "::"); Append(nprefix, tprefix); Delete(tprefix); rname = nprefix; } else { rname = tprefix; Delete(nprefix); } rdecl = Copy(decl); Replaceall(rdecl, name, rname); #ifdef SWIG_DEBUG Printf(stdout, "SWIG_name_make: use new name %s %s : %s %s\n", name, decl, rname, rdecl); #endif decl = rdecl; Delete(name); name = rname; } } if (rename_hash || rename_list || namewarn_hash || namewarn_list) { Hash *rn = Swig_name_object_get(name_rename_hash(), prefix, name, decl); if (!rn || !name_match_nameobj(rn, n)) { rn = name_nameobj_lget(name_rename_list(), n, prefix, name, decl); if (rn) { String *sfmt = Getattr(rn, "sourcefmt"); int fullname = GetFlag(rn, "fullname"); if (fullname && prefix) { String *sname = NewStringf("%s::%s", prefix, name); Delete(name); name = sname; prefix = 0; } if (sfmt) { String *sname = NewStringf(sfmt, name); Delete(name); name = sname; } } } if (rn) { String *newname = Getattr(rn, "name"); int fullname = GetFlag(rn, "fullname"); result = apply_rename(newname, fullname, prefix, name); } if (result && !Equal(result, name)) { /* operators in C++ allow aliases, we look for them */ char *cresult = Char(result); if (cresult && (strncmp(cresult, "operator ", 9) == 0)) { String *nresult = Swig_name_make(n, prefix, result, decl, oldname); if (!Equal(nresult, result)) { Delete(result); result = nresult; } else { Delete(nresult); } } } nname = result ? result : name; wrn = name_namewarn_get(n, prefix, nname, decl); if (wrn) { String *rename = Getattr(wrn, "rename"); if (rename) { String *msg = Getattr(wrn, "name"); int fullname = GetFlag(wrn, "fullname"); if (result) Delete(result); result = apply_rename(rename, fullname, prefix, name); if ((msg) && (Len(msg))) { if (!Getmeta(nname, "already_warned")) { if (n) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", msg); SWIG_WARN_NODE_END(n); } else { Swig_warning(0, Getfile(name), Getline(name), "%s\n", msg); } Setmeta(nname, "already_warned", "1"); } } } } } if (!result || !Len(result)) { if (result) Delete(result); if (oldname) { result = NewString(oldname); } else { result = NewString(cname); } } Delete(name); #ifdef SWIG_DEBUG Printf(stdout, "Swig_name_make: result '%s' '%s'\n", cname, result); #endif return result; } /* ----------------------------------------------------------------------------- * void Swig_name_inherit() * * Inherit namewarn, rename, and feature objects * * ----------------------------------------------------------------------------- */ void Swig_name_inherit(String *base, String *derived) { /* Printf(stdout,"base = '%s', derived = '%s'\n", base, derived); */ Swig_name_object_inherit(name_rename_hash(), base, derived); Swig_name_object_inherit(name_namewarn_hash(), base, derived); Swig_name_object_inherit(Swig_cparse_features(), base, derived); } /* ----------------------------------------------------------------------------- * Swig_inherit_base_symbols() * ----------------------------------------------------------------------------- */ void Swig_inherit_base_symbols(List *bases) { if (bases) { Iterator s; for (s = First(bases); s.item; s = Next(s)) { Symtab *st = Getattr(s.item, "symtab"); if (st) { Setfile(st, Getfile(s.item)); Setline(st, Getline(s.item)); Swig_symbol_inherit(st); } } Delete(bases); } } /* ----------------------------------------------------------------------------- * Swig_make_inherit_list() * ----------------------------------------------------------------------------- */ List *Swig_make_inherit_list(String *clsname, List *names, String *Namespaceprefix) { int i, ilen; String *derived; List *bases = NewList(); if (Namespaceprefix) derived = NewStringf("%s::%s", Namespaceprefix, clsname); else derived = NewString(clsname); ilen = Len(names); for (i = 0; i < ilen; i++) { String *base; String *n = Getitem(names, i); /* Try to figure out where this symbol is */ Node *s = Swig_symbol_clookup(n, 0); if (s) { while (s && (Strcmp(nodeType(s), "class") != 0)) { /* Not a class. Could be a typedef though. */ String *storage = Getattr(s, "storage"); if (storage && (Strcmp(storage, "typedef") == 0)) { String *nn = Getattr(s, "type"); s = Swig_symbol_clookup(nn, Getattr(s, "sym:symtab")); } else { break; } } if (s && ((Strcmp(nodeType(s), "class") == 0) || (Strcmp(nodeType(s), "template") == 0))) { String *q = Swig_symbol_qualified(s); Append(bases, s); if (q) { base = NewStringf("%s::%s", q, Getattr(s, "name")); Delete(q); } else { base = NewString(Getattr(s, "name")); } } else { base = NewString(n); } } else { base = NewString(n); } if (base) { Swig_name_inherit(base, derived); Delete(base); } } return bases; } /* ----------------------------------------------------------------------------- * void Swig_name_str() * * Return a stringified version of a C/C++ symbol from a node. * The node passed in is expected to be a function, constructor, destructor or * variable. Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate" * "MyNameSpace::ABC::ABC" * "MyNameSpace::ABC::constmethod" * "MyNameSpace::ABC::variablename" * * ----------------------------------------------------------------------------- */ String *Swig_name_str(Node *n) { String *qname; String *qualifier = Swig_symbol_qualified(n); String *name = Swig_scopename_last(Getattr(n, "name")); if (qualifier) qualifier = SwigType_namestr(qualifier); /* Very specific hack for template constructors/destructors */ if (SwigType_istemplate(name)) { String *nodetype = nodeType(n); if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { String *nprefix = NewStringEmpty(); String *nlast = NewStringEmpty(); String *tprefix; Swig_scopename_split(name, &nprefix, &nlast); tprefix = SwigType_templateprefix(nlast); Delete(nlast); Delete(name); name = tprefix; } } qname = NewString(""); if (qualifier && Len(qualifier) > 0) Printf(qname, "%s::", qualifier); Printf(qname, "%s", SwigType_str(name, 0)); Delete(name); Delete(qualifier); return qname; } /* ----------------------------------------------------------------------------- * void Swig_name_decl() * * Return a stringified version of a C/C++ declaration without the return type. * The node passed in is expected to be a function, constructor, destructor or * variable. Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate()" * "MyNameSpace::ABC::ABC(int,double)" * "MyNameSpace::ABC::constmethod(int) const" * "MyNameSpace::ABC::variablename" * * ----------------------------------------------------------------------------- */ String *Swig_name_decl(Node *n) { String *qname; String *decl; qname = Swig_name_str(n); if (checkAttribute(n, "kind", "variable")) decl = NewStringf("%s", qname); else decl = NewStringf("%s(%s)%s", qname, ParmList_errorstr(Getattr(n, "parms")), SwigType_isconst(Getattr(n, "decl")) ? " const" : ""); Delete(qname); return decl; } /* ----------------------------------------------------------------------------- * void Swig_name_fulldecl() * * Return a stringified version of a C/C++ declaration including the return type. * The node passed in is expected to be a function, constructor or destructor. * Some example return values: * "MyNameSpace::MyTemplate::~MyTemplate()" * "MyNameSpace::ABC::ABC(int,double)" * "int * MyNameSpace::ABC::constmethod(int) const" * * ----------------------------------------------------------------------------- */ String *Swig_name_fulldecl(Node *n) { String *decl = Swig_name_decl(n); String *type = Getattr(n, "type"); String *nodetype = nodeType(n); String *fulldecl; /* add on the return type */ if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) { fulldecl = decl; } else { String *t = SwigType_str(type, 0); fulldecl = NewStringf("%s %s", t, decl); Delete(decl); Delete(t); } return fulldecl; } swig-3.0.12/Source/Swig/getopt.c0000664000175000017500000000701013042756442016252 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * getopt.c * * Handles the parsing of command line options. This is particularly nasty * compared to other utilities given that command line options can potentially * be read by many different modules within SWIG. Thus, in order to make sure * there are no unrecognized options, each module is required to "mark" * the options that it uses. Afterwards, we can make a quick scan to make * sure there are no unmarked options. * * TODO: * - This module needs to be modified so that it doesn't call exit(). * Should have cleaner error handling in general. * ----------------------------------------------------------------------------- */ #include "swig.h" static char **args; static int numargs; static int *marked; /* ----------------------------------------------------------------------------- * Swig_init_args() * * Initialize the argument list handler. * ----------------------------------------------------------------------------- */ void Swig_init_args(int argc, char **argv) { int i; assert(argc > 0); assert(argv); numargs = argc; args = argv; marked = (int *) malloc(numargs * sizeof(int)); for (i = 0; i < argc; i++) { marked[i] = 0; } marked[0] = 1; } /* ----------------------------------------------------------------------------- * Swig_mark_arg() * * Marks an argument as being parsed. * ----------------------------------------------------------------------------- */ void Swig_mark_arg(int n) { assert(marked); assert((n >= 0) && (n < numargs)); marked[n] = 1; } /* ----------------------------------------------------------------------------- * Swig_check_marked() * * Checks to see if argument has been picked up. * ----------------------------------------------------------------------------- */ int Swig_check_marked(int n) { assert((n >= 0) && (n < numargs)); return marked[n]; } /* ----------------------------------------------------------------------------- * Swig_check_options() * * Checkers for unprocessed command line options and errors. * ----------------------------------------------------------------------------- */ void Swig_check_options(int check_input) { int error = 0; int i; int max = check_input ? numargs - 1 : numargs; assert(marked); for (i = 1; i < max; i++) { if (!marked[i]) { Printf(stderr, "swig error : Unrecognized option %s\n", args[i]); error = 1; } } if (error) { Printf(stderr, "Use 'swig -help' for available options.\n"); exit(1); } if (check_input && marked[numargs - 1]) { Printf(stderr, "Must specify an input file. Use -help for available options.\n"); exit(1); } } /* ----------------------------------------------------------------------------- * Swig_arg_error() * * Generates a generic error message and exits. * ----------------------------------------------------------------------------- */ void Swig_arg_error(void) { Printf(stderr, "SWIG : Unable to parse command line options.\n"); Printf(stderr, "Use 'swig -help' for available options.\n"); exit(1); } swig-3.0.12/Source/Swig/misc.c0000664000175000017500000011504213042756442015710 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * misc.c * * Miscellaneous functions that don't really fit anywhere else. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include #include #include #include #ifdef _WIN32 #include #ifndef S_ISDIR #define S_ISDIR(mode) (((mode) & S_IFDIR) == S_IFDIR) #endif #endif static char *fake_version = 0; /* ----------------------------------------------------------------------------- * Swig_copy_string() * * Duplicate a NULL-terminate string given as a char *. * ----------------------------------------------------------------------------- */ char *Swig_copy_string(const char *s) { char *c = 0; if (s) { c = (char *) malloc(strlen(s) + 1); strcpy(c, s); } return c; } /* ----------------------------------------------------------------------------- * Swig_set_fakeversion() * * Version string override * ----------------------------------------------------------------------------- */ void Swig_set_fakeversion(const char *version) { fake_version = Swig_copy_string(version); } /* ----------------------------------------------------------------------------- * Swig_package_version() * * Return the package string containing the version number * ----------------------------------------------------------------------------- */ const char *Swig_package_version(void) { return fake_version ? fake_version : PACKAGE_VERSION; } /* ----------------------------------------------------------------------------- * Swig_banner() * * Emits the SWIG identifying banner for the C/C++ wrapper file. * ----------------------------------------------------------------------------- */ void Swig_banner(File *f) { Printf(f, "/* ----------------------------------------------------------------------------\n\ * This file was automatically generated by SWIG (http://www.swig.org).\n\ * Version %s\n\ *\n\ * This file is not intended to be easily readable and contains a number of\n\ * coding conventions designed to improve portability and efficiency. Do not make\n\ * changes to this file unless you know what you are doing--modify the SWIG\n\ * interface file instead.\n", Swig_package_version()); /* String too long for ISO compliance */ Printf(f, " * ----------------------------------------------------------------------------- */\n"); } /* ----------------------------------------------------------------------------- * Swig_banner_target_lang() * * Emits a SWIG identifying banner in the target language * ----------------------------------------------------------------------------- */ void Swig_banner_target_lang(File *f, const_String_or_char_ptr commentchar) { Printf(f, "%s This file was automatically generated by SWIG (http://www.swig.org).\n", commentchar); Printf(f, "%s Version %s\n", commentchar, Swig_package_version()); Printf(f, "%s\n", commentchar); Printf(f, "%s Do not make changes to this file unless you know what you are doing--modify\n", commentchar); Printf(f, "%s the SWIG interface file instead.\n", commentchar); } /* ----------------------------------------------------------------------------- * Swig_strip_c_comments() * * Return a new string with C comments stripped from the input string. NULL is * returned if there aren't any comments. * ----------------------------------------------------------------------------- */ String *Swig_strip_c_comments(const String *s) { const char *c = Char(s); const char *comment_begin = 0; const char *comment_end = 0; String *stripped = 0; while (*c) { if (!comment_begin && *c == '/') { ++c; if (!*c) break; if (*c == '*') comment_begin = c-1; } else if (comment_begin && !comment_end && *c == '*') { ++c; if (*c == '/') { comment_end = c; break; } } ++c; } if (comment_begin && comment_end) { int size = (int)(comment_begin - Char(s)); String *stripmore = 0; stripped = NewStringWithSize(s, size); Printv(stripped, comment_end + 1, NIL); do { stripmore = Swig_strip_c_comments(stripped); if (stripmore) { Delete(stripped); stripped = stripmore; } } while (stripmore); } return stripped; } /* ----------------------------------------------------------------------------- * is_directory() * ----------------------------------------------------------------------------- */ static int is_directory(String *directory) { int last = Len(directory) - 1; int statres; struct stat st; char *dir = Char(directory); if (dir[last] == SWIG_FILE_DELIMITER[0]) { /* remove trailing slash - can cause S_ISDIR to fail on Windows, at least */ dir[last] = 0; statres = stat(dir, &st); dir[last] = SWIG_FILE_DELIMITER[0]; } else { statres = stat(dir, &st); } return (statres == 0 && S_ISDIR(st.st_mode)); } /* ----------------------------------------------------------------------------- * Swig_new_subdirectory() * * Create the subdirectory only if the basedirectory already exists as a directory. * basedirectory can be empty to indicate current directory but not NULL. * ----------------------------------------------------------------------------- */ String *Swig_new_subdirectory(String *basedirectory, String *subdirectory) { String *error = 0; int current_directory = Len(basedirectory) == 0; if (current_directory || is_directory(basedirectory)) { Iterator it; String *dir = NewString(basedirectory); List *subdirs = Split(subdirectory, SWIG_FILE_DELIMITER[0], INT_MAX); for (it = First(subdirs); it.item; it = Next(it)) { int result; String *subdirectory = it.item; Printf(dir, "%s", subdirectory); #ifdef _WIN32 result = _mkdir(Char(dir)); #else result = mkdir(Char(dir), 0777); #endif if (result != 0 && errno != EEXIST) { error = NewStringf("Cannot create directory %s: %s", dir, strerror(errno)); break; } if (!is_directory(dir)) { error = NewStringf("Cannot create directory %s: it may already exist but not be a directory", dir); break; } Printf(dir, SWIG_FILE_DELIMITER); } } else { error = NewStringf("Cannot create subdirectory %s under the base directory %s. Either the base does not exist as a directory or it is not readable.", subdirectory, basedirectory); } return error; } /* ----------------------------------------------------------------------------- * Swig_filename_correct() * * Corrects filename paths by removing duplicate delimiters and on non-unix * systems use the correct delimiter across the whole name. * ----------------------------------------------------------------------------- */ void Swig_filename_correct(String *filename) { int network_path = 0; if (Len(filename) >= 2) { const char *fname = Char(filename); if (fname[0] == '\\' && fname[1] == '\\') network_path = 1; if (fname[0] == '/' && fname[1] == '/') network_path = 1; } #if defined(_WIN32) || defined(MACSWIG) /* accept Unix path separator on non-Unix systems */ Replaceall(filename, "/", SWIG_FILE_DELIMITER); #endif #if defined(__CYGWIN__) /* accept Windows path separator in addition to Unix path separator */ Replaceall(filename, "\\", SWIG_FILE_DELIMITER); #endif /* remove all duplicate file name delimiters */ while (Replaceall(filename, SWIG_FILE_DELIMITER SWIG_FILE_DELIMITER, SWIG_FILE_DELIMITER)) { } /* Network paths can start with a double slash on Windows - unremove the duplicate slash we just removed */ if (network_path) Insert(filename, 0, SWIG_FILE_DELIMITER); } /* ----------------------------------------------------------------------------- * Swig_filename_escape() * * Escapes backslashes in filename - for Windows * ----------------------------------------------------------------------------- */ String *Swig_filename_escape(String *filename) { String *adjusted_filename = Copy(filename); Swig_filename_correct(adjusted_filename); #if defined(_WIN32) /* Note not on Cygwin else filename is displayed with double '/' */ Replaceall(adjusted_filename, "\\", "\\\\"); #endif return adjusted_filename; } /* ----------------------------------------------------------------------------- * Swig_filename_unescape() * * Remove double backslash escaping in filename - for Windows * ----------------------------------------------------------------------------- */ void Swig_filename_unescape(String *filename) { (void)filename; #if defined(_WIN32) Replaceall(filename, "\\\\", "\\"); #endif } /* ----------------------------------------------------------------------------- * Swig_storage_isextern() * * Determine if the storage class specifier is extern (but not externc) * ----------------------------------------------------------------------------- */ int Swig_storage_isextern(Node *n) { const String *storage = Getattr(n, "storage"); return storage ? Strcmp(storage, "extern") == 0 || Strncmp(storage, "extern ", 7) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isexternc() * * Determine if the storage class specifier is externc (but not plain extern) * ----------------------------------------------------------------------------- */ int Swig_storage_isexternc(Node *n) { const String *storage = Getattr(n, "storage"); return storage ? Strcmp(storage, "externc") == 0 || Strncmp(storage, "externc ", 8) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isstatic_custom() * * Determine if the storage class specifier is static * ----------------------------------------------------------------------------- */ int Swig_storage_isstatic_custom(Node *n, const_String_or_char_ptr storage_name) { const String *storage = Getattr(n, storage_name); return storage ? Strncmp(storage, "static", 6) == 0 : 0; } /* ----------------------------------------------------------------------------- * Swig_storage_isstatic() * * Determine if the storage class specifier is static * ----------------------------------------------------------------------------- */ int Swig_storage_isstatic(Node *n) { return Swig_storage_isstatic_custom(n, "storage"); } /* ----------------------------------------------------------------------------- * Swig_string_escape() * * Takes a string object and produces a string with escape codes added to it. * Octal escaping is used. * ----------------------------------------------------------------------------- */ String *Swig_string_escape(String *s) { String *ns; int c; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '\n') { Printf(ns, "\\n"); } else if (c == '\r') { Printf(ns, "\\r"); } else if (c == '\t') { Printf(ns, "\\t"); } else if (c == '\\') { Printf(ns, "\\\\"); } else if (c == '\'') { Printf(ns, "\\'"); } else if (c == '\"') { Printf(ns, "\\\""); } else if (c == ' ') { Putc(c, ns); } else if (!isgraph(c)) { if (c < 0) c += UCHAR_MAX + 1; Printf(ns, "\\%o", c); } else { Putc(c, ns); } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_hexescape() * * Takes a string object and produces a string with escape codes added to it. * Hex escaping is used. * ----------------------------------------------------------------------------- */ String *Swig_string_hexescape(String *s) { String *ns; int c; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '\n') { Printf(ns, "\\n"); } else if (c == '\r') { Printf(ns, "\\r"); } else if (c == '\t') { Printf(ns, "\\t"); } else if (c == '\\') { Printf(ns, "\\\\"); } else if (c == '\'') { Printf(ns, "\\'"); } else if (c == '\"') { Printf(ns, "\\\""); } else if (c == ' ') { Putc(c, ns); } else if (!isgraph(c)) { if (c < 0) c += UCHAR_MAX + 1; Printf(ns, "\\x%X", c); } else { Putc(c, ns); } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_upper() * * Takes a string object and returns a copy that is uppercase * ----------------------------------------------------------------------------- */ String *Swig_string_upper(String *s) { String *ns; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(toupper(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_lower() * * Takes a string object and returns a copy that is lowercase * ----------------------------------------------------------------------------- */ String *Swig_string_lower(String *s) { String *ns; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(tolower(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_title() * * Takes a string object and returns a copy that is lowercase with first letter * capitalized * ----------------------------------------------------------------------------- */ String *Swig_string_title(String *s) { String *ns; int first = 1; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { Putc(first ? toupper(c) : tolower(c), ns); first = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_ccase() * * Takes a string object and returns a copy that is lowercase with the first * letter capitalized and the one following '_', which are removed. * * camel_case -> CamelCase * camelCase -> CamelCase * ----------------------------------------------------------------------------- */ String *Swig_string_ccase(String *s) { String *ns; int first = 1; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { if (c == '_') { first = 1; continue; } Putc(first ? toupper(c) : c, ns); first = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_lccase() * * Takes a string object and returns a copy with the character after * each '_' capitalised, and the '_' removed. The first character is * also forced to lowercase. * * camel_case -> camelCase * CamelCase -> camelCase * ----------------------------------------------------------------------------- */ String *Swig_string_lccase(String *s) { String *ns; int first = 1; int after_underscore = 0; int c; ns = NewStringEmpty(); Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { if (c == '_') { after_underscore = 1; continue; } if (first) { Putc(tolower(c), ns); first = 0; } else { Putc(after_underscore ? toupper(c) : c, ns); } after_underscore = 0; } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_ucase() * * This is the reverse case of ccase, ie * * CamelCase -> camel_case * get2D -> get_2d * asFloat2 -> as_float2 * ----------------------------------------------------------------------------- */ String *Swig_string_ucase(String *s) { String *ns; int c; int lastC = 0; int nextC = 0; int underscore = 0; ns = NewStringEmpty(); /* We insert a underscore when: 1. Lower case char followed by upper case char getFoo > get_foo; getFOo > get_foo; GETFOO > getfoo 2. Number proceded by char and not end of string get2D > get_2d; get22D > get_22d; GET2D > get_2d but: asFloat2 > as_float2 */ Seek(s, 0, SEEK_SET); while ((c = Getc(s)) != EOF) { nextC = Getc(s); Ungetc(nextC, s); if (isdigit(c) && isalpha(lastC) && nextC != EOF) underscore = 1; else if (isupper(c) && isalpha(lastC) && !isupper(lastC)) underscore = 1; lastC = c; if (underscore) { Putc('_', ns); underscore = 0; } Putc(tolower(c), ns); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_first_upper() * * Make the first character in the string uppercase, leave all the * rest the same. This is used by the Ruby module to provide backwards * compatibility with the old way of naming classes and constants. For * more info see the Ruby documentation. * * firstUpper -> FirstUpper * ----------------------------------------------------------------------------- */ String *Swig_string_first_upper(String *s) { String *ns = NewStringEmpty(); char *cs = Char(s); if (cs && cs[0] != 0) { Putc(toupper((int)cs[0]), ns); Append(ns, cs + 1); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_first_lower() * * Make the first character in the string lowercase, leave all the * rest the same. This is used by the Ruby module to provide backwards * compatibility with the old way of naming classes and constants. For * more info see the Ruby documentation. * * firstLower -> FirstLower * ----------------------------------------------------------------------------- */ String *Swig_string_first_lower(String *s) { String *ns = NewStringEmpty(); char *cs = Char(s); if (cs && cs[0] != 0) { Putc(tolower((int)cs[0]), ns); Append(ns, cs + 1); } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_schemify() * * Replace underscores with dashes, to make identifiers look nice to Schemers. * * under_scores -> under-scores * ----------------------------------------------------------------------------- */ String *Swig_string_schemify(String *s) { String *ns = NewString(s); Replaceall(ns, "_", "-"); return ns; } /* ----------------------------------------------------------------------------- * Swig_string_typecode() * * Takes a string with possible type-escapes in it and replaces them with * real C datatypes. * ----------------------------------------------------------------------------- */ String *Swig_string_typecode(String *s) { String *ns; int c; String *tc; ns = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '`') { String *str = 0; tc = NewStringEmpty(); while ((c = Getc(s)) != EOF) { if (c == '`') break; Putc(c, tc); } str = SwigType_str(tc, 0); Append(ns, str); Delete(str); } else { Putc(c, ns); if (c == '\'') { while ((c = Getc(s)) != EOF) { Putc(c, ns); if (c == '\'') break; if (c == '\\') { c = Getc(s); Putc(c, ns); } } } else if (c == '\"') { while ((c = Getc(s)) != EOF) { Putc(c, ns); if (c == '\"') break; if (c == '\\') { c = Getc(s); Putc(c, ns); } } } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_mangle() * * Take a string and mangle it by stripping all non-valid C identifier * characters. * * This routine skips unnecessary blank spaces, therefore mangling * 'char *' and 'char*', 'std::pair' and * 'std::pair', produce the same result. * * However, note that 'long long' and 'long_long' produce different * mangled strings. * * The mangling method still is not 'perfect', for example std::pair and * std_pair return the same mangling. This is just a little better * than before, but it seems to be enough for most of the purposes. * * Having a perfect mangling will break some examples and code which * assume, for example, that A::get_value will be mangled as * A_get_value. * ----------------------------------------------------------------------------- */ String *Swig_string_mangle(const String *s) { #if 0 /* old mangling, not suitable for using in macros */ String *t = Copy(s); char *c = Char(t); while (*c) { if (!isalnum(*c)) *c = '_'; c++; } return t; #else String *result = NewStringEmpty(); int space = 0; int state = 0; char *pc, *cb; String *b = Copy(s); if (SwigType_istemplate(b)) { String *st = Swig_symbol_template_deftype(b, 0); String *sq = Swig_symbol_type_qualify(st, 0); String *t = SwigType_namestr(sq); Delete(st); Delete(sq); Delete(b); b = t; } pc = cb = Char(b); while (*pc) { char c = *pc; if (isalnum((int) c) || (c == '_')) { state = 1; if (space && (space == state)) { Append(result, "_SS_"); } space = 0; Printf(result, "%c", (int) c); } else { if (isspace((int) c)) { space = state; ++pc; continue; } else { state = 3; space = 0; } switch (c) { case '.': if ((cb != pc) && (*(pc - 1) == 'p')) { Append(result, "_"); ++pc; continue; } else { c = 'f'; } break; case ':': if (*(pc + 1) == ':') { Append(result, "_"); ++pc; ++pc; continue; } break; case '*': c = 'm'; break; case '&': c = 'A'; break; case '<': c = 'l'; break; case '>': c = 'g'; break; case '=': c = 'e'; break; case ',': c = 'c'; break; case '(': c = 'p'; break; case ')': c = 'P'; break; case '[': c = 'b'; break; case ']': c = 'B'; break; case '^': c = 'x'; break; case '|': c = 'o'; break; case '~': c = 'n'; break; case '!': c = 'N'; break; case '%': c = 'M'; break; case '?': c = 'q'; break; case '+': c = 'a'; break; case '-': c = 's'; break; case '/': c = 'd'; break; default: break; } if (isalpha((int) c)) { Printf(result, "_S%c_", (int) c); } else { Printf(result, "_S%02X_", (int) c); } } ++pc; } Delete(b); return result; #endif } String *Swig_string_emangle(String *s) { return Swig_string_mangle(s); } /* ----------------------------------------------------------------------------- * Swig_scopename_prefix() * * Take a qualified name like "A::B::C" and return the scope name. * In this case, "A::B". Returns NULL if there is no base. * ----------------------------------------------------------------------------- */ void Swig_scopename_split(const String *s, String **rprefix, String **rlast) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) { *rprefix = 0; *rlast = Copy(s); } co = strstr(cc, "operator "); if (co) { if (co == cc) { *rprefix = 0; *rlast = Copy(s); return; } else { *rprefix = NewStringWithSize(cc, (int)(co - cc - 2)); *rlast = NewString(co); return; } } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { cc = c; c += 2; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (cc != tmp) { *rprefix = NewStringWithSize(tmp, (int)(cc - tmp)); *rlast = NewString(cc + 2); return; } else { *rprefix = 0; *rlast = Copy(s); } } String *Swig_scopename_prefix(const String *s) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(cc, "operator "); if (co) { if (co == cc) { return 0; } else { String *prefix = NewStringWithSize(cc, (int)(co - cc - 2)); return prefix; } } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { cc = c; c += 2; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (cc != tmp) { return NewStringWithSize(tmp, (int)(cc - tmp)); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_last() * * Take a qualified name like "A::B::C" and returns the last. In this * case, "C". * ----------------------------------------------------------------------------- */ String *Swig_scopename_last(const String *s) { char *tmp = Char(s); char *c = tmp; char *cc = c; char *co = 0; if (!strstr(c, "::")) return NewString(s); co = strstr(cc, "operator "); if (co) { return NewString(co); } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { c += 2; cc = c; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } return NewString(cc); } /* ----------------------------------------------------------------------------- * Swig_scopename_first() * * Take a qualified name like "A::B::C" and returns the first scope name. * In this case, "A". Returns NULL if there is no base. * ----------------------------------------------------------------------------- */ String *Swig_scopename_first(const String *s) { char *tmp = Char(s); char *c = tmp; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(c, "operator "); if (co) { if (co == c) { return 0; } } else { co = c + Len(s); } while (*c && (c != co)) { if ((*c == ':') && (*(c + 1) == ':')) { break; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (*c && (c != tmp)) { return NewStringWithSize(tmp, (int)(c - tmp)); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_suffix() * * Take a qualified name like "A::B::C" and returns the suffix. * In this case, "B::C". Returns NULL if there is no suffix. * ----------------------------------------------------------------------------- */ String *Swig_scopename_suffix(const String *s) { char *tmp = Char(s); char *c = tmp; char *co = 0; if (!strstr(c, "::")) return 0; co = strstr(c, "operator "); if (co) { if (co == c) return 0; } while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { break; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } if (*c && (c != tmp)) { return NewString(c + 2); } else { return 0; } } /* ----------------------------------------------------------------------------- * Swig_scopename_check() * * Checks to see if a name is qualified with a scope name, examples: * foo -> 0 * ::foo -> 1 * foo::bar -> 1 * foo< ::bar > -> 0 * ----------------------------------------------------------------------------- */ int Swig_scopename_check(const String *s) { char *c = Char(s); char *co = strstr(c, "operator "); if (co) { if (co == c) return 0; } if (!strstr(c, "::")) return 0; while (*c) { if ((*c == ':') && (*(c + 1) == ':')) { return 1; } else { if (*c == '<') { int level = 1; c++; while (*c && level) { if (*c == '<') level++; if (*c == '>') level--; c++; } } else { c++; } } } return 0; } /* ----------------------------------------------------------------------------- * Swig_string_command() * * Executes a external command via popen with the string as a command * line parameter. For example: * * Printf(stderr,"%(command:sed 's/[a-z]/\U\\1/' <<<)s","hello") -> Hello * ----------------------------------------------------------------------------- */ #if defined(HAVE_POPEN) # if defined(_MSC_VER) # define popen _popen # define pclose _pclose # else extern FILE *popen(const char *command, const char *type); extern int pclose(FILE *stream); # endif #else # if defined(_MSC_VER) # define HAVE_POPEN 1 # define popen _popen # define pclose _pclose # endif #endif String *Swig_string_command(String *s) { String *res = NewStringEmpty(); #if defined(HAVE_POPEN) if (Len(s)) { char *command = Char(s); FILE *fp = popen(command, "r"); if (fp) { char buffer[1025]; while (fscanf(fp, "%1024s", buffer) != EOF) { Append(res, buffer); } pclose(fp); } else { Swig_error("SWIG", Getline(s), "Command encoder fails attempting '%s'.\n", s); exit(1); } } #endif return res; } /* ----------------------------------------------------------------------------- * Swig_string_strip() * * Strip given prefix from identifiers * * Printf(stderr,"%(strip:[wx])s","wxHello") -> Hello * ----------------------------------------------------------------------------- */ String *Swig_string_strip(String *s) { String *ns; if (!Len(s)) { ns = NewString(s); } else { const char *cs = Char(s); const char *ce = Strchr(cs, ']'); if (*cs != '[' || !ce) { ns = NewString(s); } else { String *fmt = NewStringf("%%.%ds", ce-cs-1); String *prefix = NewStringf(fmt, cs+1); if (0 == Strncmp(ce+1, prefix, Len(prefix))) { ns = NewString(ce+1+Len(prefix)); } else { ns = NewString(ce+1); } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_string_rstrip() * * Strip given suffix from identifiers * * Printf(stderr,"%(rstrip:[Cls])s","HelloCls") -> Hello * ----------------------------------------------------------------------------- */ String *Swig_string_rstrip(String *s) { String *ns; int len = Len(s); if (!len) { ns = NewString(s); } else { const char *cs = Char(s); const char *ce = Strchr(cs, ']'); if (*cs != '[' || !ce) { ns = NewString(s); } else { String *fmt = NewStringf("%%.%ds", ce-cs-1); String *suffix = NewStringf(fmt, cs+1); int suffix_len = Len(suffix); if (0 == Strncmp(cs+len-suffix_len, suffix, suffix_len)) { int copy_len = len-suffix_len-(ce+1-cs); ns = NewStringWithSize(ce+1, copy_len); } else { ns = NewString(ce+1); } } } return ns; } /* ----------------------------------------------------------------------------- * Swig_offset_string() * * Insert number tabs before each new line in s * ----------------------------------------------------------------------------- */ void Swig_offset_string(String *s, int number) { char *res, *p, *end, *start; /* count a number of lines in s */ int lines = 1; int len = Len(s); if (len == 0) return; start = strchr(Char(s), '\n'); while (start) { ++lines; start = strchr(start + 1, '\n'); } /* do not count pending new line */ if ((Char(s))[len-1] == '\n') --lines; /* allocate a temporary storage for a padded string */ res = (char*)malloc(len + lines * number * 2 + 1); res[len + lines * number * 2] = 0; /* copy lines to res, prepending tabs to each line */ p = res; /* output pointer */ start = Char(s); /* start of a current line */ end = strchr(start, '\n'); /* end of a current line */ while (end) { memset(p, ' ', number*2); p += number*2; memcpy(p, start, end - start + 1); p += end - start + 1; start = end + 1; end = strchr(start, '\n'); } /* process the last line */ if (*start) { memset(p, ' ', number*2); p += number*2; strcpy(p, start); } /* replace 's' contents with 'res' */ Clear(s); Append(s, res); free(res); } #ifdef HAVE_PCRE #include static int split_regex_pattern_subst(String *s, String **pattern, String **subst, const char **input) { const char *pats, *pate; const char *subs, *sube; /* Locate the search pattern */ const char *p = Char(s); if (*p++ != '/') goto err_out; pats = p; p = strchr(p, '/'); if (!p) goto err_out; pate = p; /* Locate the substitution string */ subs = ++p; p = strchr(p, '/'); if (!p) goto err_out; sube = p; *pattern = NewStringWithSize(pats, (int)(pate - pats)); *subst = NewStringWithSize(subs, (int)(sube - subs)); *input = p + 1; return 1; err_out: Swig_error("SWIG", Getline(s), "Invalid regex substitution: '%s'.\n", s); exit(1); } /* This function copies len characters from src to dst, possibly applying case conversions to them: if convertCase is 1, to upper case and if it is -1, to lower * case. If convertNextOnly is 1, only a single character is converted (and convertCase is reset), otherwise all of them are. */ static void copy_with_maybe_case_conversion(String *dst, const char *src, int len, int *convertCase, int convertNextOnly) { /* Deal with the trivial cases first. */ if (!len) return; if (!*convertCase) { Write(dst, src, len); return; } /* If we must convert only the first character, do it and write the rest at once. */ if (convertNextOnly) { int src_char = *src; Putc(*convertCase == 1 ? toupper(src_char) : tolower(src_char), dst); *convertCase = 0; if (len > 1) { Write(dst, src + 1, len - 1); } } else { /* We need to convert all characters. */ int i; for (i = 0; i < len; i++, src++) { int src_char = *src; Putc(*convertCase == 1 ? toupper(src_char) : tolower(src_char), dst); } } } String *replace_captures(int num_captures, const char *input, String *subst, int captures[], String *pattern, String *s) { int convertCase = 0, convertNextOnly = 0; String *result = NewStringEmpty(); const char *p = Char(subst); while (*p) { /* Copy part without substitutions */ const char *q = strchr(p, '\\'); if (!q) { copy_with_maybe_case_conversion(result, p, (int)strlen(p), &convertCase, convertNextOnly); break; } copy_with_maybe_case_conversion(result, p, (int)(q - p), &convertCase, convertNextOnly); p = q + 1; /* Handle substitution */ if (*p == '\0') { Putc('\\', result); } else if (isdigit((unsigned char)*p)) { int group = *p++ - '0'; if (group < num_captures) { int l = captures[group*2], r = captures[group*2 + 1]; if (l != -1) { copy_with_maybe_case_conversion(result, input + l, r - l, &convertCase, convertNextOnly); } } else { Swig_error("SWIG", Getline(s), "PCRE capture replacement failed while matching \"%s\" using \"%s\" - request for group %d is greater than the number of captures %d.\n", Char(pattern), input, group, num_captures-1); } } else { /* Handle Perl-like case conversion escapes. */ switch (*p) { case 'u': convertCase = 1; convertNextOnly = 1; break; case 'U': convertCase = 1; convertNextOnly = 0; break; case 'l': convertCase = -1; convertNextOnly = 1; break; case 'L': convertCase = -1; convertNextOnly = 0; break; case 'E': convertCase = 0; break; default: Swig_error("SWIG", Getline(s), "Unrecognized escape character '%c' in the replacement string \"%s\".\n", *p, Char(subst)); } p++; } } return result; } /* ----------------------------------------------------------------------------- * Swig_string_regex() * * Executes a regular expression substitution. For example: * * Printf(stderr,"gsl%(regex:/GSL_(.*)_/\\1/)s", "GSL_Hello_") -> gslHello * ----------------------------------------------------------------------------- */ String *Swig_string_regex(String *s) { const int pcre_options = 0; String *res = 0; pcre *compiled_pat = 0; const char *pcre_error, *input; int pcre_errorpos; String *pattern = 0, *subst = 0; int captures[30]; if (split_regex_pattern_subst(s, &pattern, &subst, &input)) { int rc; compiled_pat = pcre_compile( Char(pattern), pcre_options, &pcre_error, &pcre_errorpos, NULL); if (!compiled_pat) { Swig_error("SWIG", Getline(s), "PCRE compilation failed: '%s' in '%s':%i.\n", pcre_error, Char(pattern), pcre_errorpos); exit(1); } rc = pcre_exec(compiled_pat, NULL, input, (int)strlen(input), 0, 0, captures, 30); if (rc >= 0) { res = replace_captures(rc, input, subst, captures, pattern, s); } else if (rc != PCRE_ERROR_NOMATCH) { Swig_error("SWIG", Getline(s), "PCRE execution failed: error %d while matching \"%s\" using \"%s\".\n", rc, Char(pattern), input); exit(1); } } DohDelete(pattern); DohDelete(subst); pcre_free(compiled_pat); return res ? res : NewStringEmpty(); } String *Swig_pcre_version(void) { return NewStringf("PCRE Version: %s", pcre_version()); } #else String *Swig_string_regex(String *s) { Swig_error("SWIG", Getline(s), "PCRE regex support not enabled in this SWIG build.\n"); exit(1); } String *Swig_pcre_version(void) { return NewStringf("PCRE not used"); } #endif /* ----------------------------------------------------------------------------- * Swig_init() * * Initialize the SWIG core * ----------------------------------------------------------------------------- */ void Swig_init() { /* Set some useful string encoding methods */ DohEncoding("escape", Swig_string_escape); DohEncoding("hexescape", Swig_string_hexescape); DohEncoding("upper", Swig_string_upper); DohEncoding("lower", Swig_string_lower); DohEncoding("title", Swig_string_title); DohEncoding("ctitle", Swig_string_ccase); DohEncoding("lctitle", Swig_string_lccase); DohEncoding("utitle", Swig_string_ucase); DohEncoding("typecode", Swig_string_typecode); DohEncoding("mangle", Swig_string_emangle); DohEncoding("command", Swig_string_command); DohEncoding("schemify", Swig_string_schemify); DohEncoding("strip", Swig_string_strip); DohEncoding("rstrip", Swig_string_rstrip); DohEncoding("regex", Swig_string_regex); /* aliases for the case encoders */ DohEncoding("uppercase", Swig_string_upper); DohEncoding("lowercase", Swig_string_lower); DohEncoding("camelcase", Swig_string_ccase); DohEncoding("lowercamelcase", Swig_string_lccase); DohEncoding("undercase", Swig_string_ucase); DohEncoding("firstuppercase", Swig_string_first_upper); DohEncoding("firstlowercase", Swig_string_first_lower); /* Initialize typemaps */ Swig_typemap_init(); /* Initialize symbol table */ Swig_symbol_init(); /* Initialize type system */ SwigType_typesystem_init(); /* Initialize template system */ SwigType_template_init(); } swig-3.0.12/Source/Swig/swig.h0000664000175000017500000005170213042756442015735 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swig.h * * Header file for the SWIG core. * ----------------------------------------------------------------------------- */ #ifndef SWIGCORE_H_ #define SWIGCORE_H_ #ifndef MACSWIG #include "swigconfig.h" #endif #include #include #include #include #ifdef __cplusplus extern "C" { #endif #include "doh.h" /* Status codes */ #define SWIG_OK 1 #define SWIG_ERROR 0 #define SWIG_NOWRAP 0 /* Global macros */ #define NSPACE_SEPARATOR "." /* Namespace separator for the nspace feature - this should be changed to a target language configurable variable */ #define NSPACE_TODO 0 /* Languages that still need to implement and test the nspace feature use this */ /* Short names for common data types */ typedef DOH String; typedef DOH Hash; typedef DOH List; typedef DOH String_or_char; typedef DOH File; typedef DOH Parm; typedef DOH ParmList; typedef DOH Node; typedef DOH Symtab; typedef DOH Typetab; typedef DOH SwigType; /* --- Legacy DataType interface. These type codes are provided solely for backwards compatibility with older modules --- */ /* --- The ordering of type values is used to determine type-promotion in the parser. Do not change */ /* Numeric types */ #define T_BOOL 1 #define T_SCHAR 2 #define T_UCHAR 3 #define T_SHORT 4 #define T_USHORT 5 #define T_ENUM 6 #define T_INT 7 #define T_UINT 8 #define T_LONG 9 #define T_ULONG 10 #define T_LONGLONG 11 #define T_ULONGLONG 12 #define T_FLOAT 20 #define T_DOUBLE 21 #define T_LONGDOUBLE 22 #define T_FLTCPLX 23 #define T_DBLCPLX 24 #define T_NUMERIC 25 #define T_AUTO 26 #define T_COMPLEX T_DBLCPLX /* non-numeric */ #define T_CHAR 29 #define T_WCHAR 30 #define T_USER 31 #define T_VOID 32 #define T_STRING 33 #define T_POINTER 34 #define T_REFERENCE 35 #define T_ARRAY 36 #define T_FUNCTION 37 #define T_MPOINTER 38 #define T_VARARGS 39 #define T_RVALUE_REFERENCE 40 #define T_WSTRING 41 #define T_SYMBOL 98 #define T_ERROR 99 /* --- File interface --- */ #include "swigfile.h" /* --- Command line parsing --- */ #include "swigopt.h" /* --- Scanner Interface --- */ #include "swigscan.h" /* --- Functions for manipulating the string-based type encoding --- */ extern SwigType *NewSwigType(int typecode); extern SwigType *SwigType_del_element(SwigType *t); extern SwigType *SwigType_add_pointer(SwigType *t); extern SwigType *SwigType_add_memberpointer(SwigType *t, const_String_or_char_ptr qual); extern SwigType *SwigType_del_memberpointer(SwigType *t); extern SwigType *SwigType_del_pointer(SwigType *t); extern SwigType *SwigType_add_array(SwigType *t, const_String_or_char_ptr size); extern SwigType *SwigType_del_array(SwigType *t); extern SwigType *SwigType_pop_arrays(SwigType *t); extern SwigType *SwigType_add_reference(SwigType *t); extern SwigType *SwigType_del_reference(SwigType *t); extern SwigType *SwigType_add_rvalue_reference(SwigType *t); extern SwigType *SwigType_del_rvalue_reference(SwigType *t); extern SwigType *SwigType_add_qualifier(SwigType *t, const_String_or_char_ptr qual); extern SwigType *SwigType_del_qualifier(SwigType *t); extern SwigType *SwigType_add_function(SwigType *t, ParmList *parms); extern SwigType *SwigType_add_template(SwigType *t, ParmList *parms); extern SwigType *SwigType_pop_function(SwigType *t); extern ParmList *SwigType_function_parms(const SwigType *t, Node *file_line_node); extern List *SwigType_split(const SwigType *t); extern String *SwigType_pop(SwigType *t); extern void SwigType_push(SwigType *t, String *s); extern List *SwigType_parmlist(const SwigType *p); extern String *SwigType_parm(const SwigType *p); extern String *SwigType_str(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_lstr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_rcaststr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_lcaststr(const SwigType *s, const_String_or_char_ptr id); extern String *SwigType_manglestr(const SwigType *t); extern SwigType *SwigType_ltype(const SwigType *t); extern int SwigType_ispointer(const SwigType *t); extern int SwigType_ispointer_return(const SwigType *t); extern int SwigType_isfunctionpointer(const SwigType *t); extern int SwigType_ismemberpointer(const SwigType *t); extern int SwigType_isreference(const SwigType *t); extern int SwigType_isreference_return(const SwigType *t); extern int SwigType_isrvalue_reference(const SwigType *t); extern int SwigType_isarray(const SwigType *t); extern int SwigType_prefix_is_simple_1D_array(const SwigType *t); extern int SwigType_isfunction(const SwigType *t); extern int SwigType_isqualifier(const SwigType *t); extern int SwigType_isconst(const SwigType *t); extern int SwigType_issimple(const SwigType *t); extern int SwigType_ismutable(const SwigType *t); extern int SwigType_isvarargs(const SwigType *t); extern int SwigType_istemplate(const SwigType *t); extern int SwigType_isenum(const SwigType *t); extern int SwigType_check_decl(const SwigType *t, const_String_or_char_ptr decl); extern SwigType *SwigType_strip_qualifiers(const SwigType *t); extern SwigType *SwigType_strip_single_qualifier(const SwigType *t); extern SwigType *SwigType_functionpointer_decompose(SwigType *t); extern String *SwigType_base(const SwigType *t); extern String *SwigType_namestr(const SwigType *t); extern String *SwigType_templateprefix(const SwigType *t); extern String *SwigType_templatesuffix(const SwigType *t); extern String *SwigType_istemplate_templateprefix(const SwigType *t); extern String *SwigType_istemplate_only_templateprefix(const SwigType *t); extern String *SwigType_templateargs(const SwigType *t); extern String *SwigType_prefix(const SwigType *t); extern int SwigType_array_ndim(const SwigType *t); extern String *SwigType_array_getdim(const SwigType *t, int n); extern void SwigType_array_setdim(SwigType *t, int n, const_String_or_char_ptr rep); extern SwigType *SwigType_array_type(const SwigType *t); extern SwigType *SwigType_default_create(const SwigType *ty); extern SwigType *SwigType_default_deduce(const SwigType *t); extern void SwigType_typename_replace(SwigType *t, String *pat, String *rep); extern SwigType *SwigType_remove_global_scope_prefix(const SwigType *t); extern SwigType *SwigType_alttype(const SwigType *t, int ltmap); /* --- Type-system managment --- */ extern void SwigType_typesystem_init(void); extern int SwigType_typedef(const SwigType *type, const_String_or_char_ptr name); extern int SwigType_typedef_class(const_String_or_char_ptr name); extern int SwigType_typedef_using(const_String_or_char_ptr qname); extern void SwigType_inherit(String *subclass, String *baseclass, String *cast, String *conversioncode); extern int SwigType_issubtype(const SwigType *subtype, const SwigType *basetype); extern void SwigType_scope_alias(String *aliasname, Typetab *t); extern void SwigType_using_scope(Typetab *t); extern void SwigType_new_scope(const_String_or_char_ptr name); extern void SwigType_inherit_scope(Typetab *scope); extern Typetab *SwigType_pop_scope(void); extern Typetab *SwigType_set_scope(Typetab *h); extern void SwigType_print_scope(void); extern SwigType *SwigType_typedef_resolve(const SwigType *t); extern SwigType *SwigType_typedef_resolve_all(const SwigType *t); extern SwigType *SwigType_typedef_qualified(const SwigType *t); extern int SwigType_istypedef(const SwigType *t); extern int SwigType_isclass(const SwigType *t); extern void SwigType_attach_symtab(Symtab *syms); extern void SwigType_remember(const SwigType *t); extern void SwigType_remember_clientdata(const SwigType *t, const_String_or_char_ptr clientdata); extern void SwigType_remember_mangleddata(String *mangled, const_String_or_char_ptr clientdata); extern void (*SwigType_remember_trace(void (*tf) (const SwigType *, String *, String *))) (const SwigType *, String *, String *); extern void SwigType_emit_type_table(File *f_headers, File *f_table); extern int SwigType_type(const SwigType *t); /* --- Symbol table module --- */ extern void Swig_symbol_print_tables(Symtab *symtab); extern void Swig_symbol_print_tables_summary(void); extern void Swig_symbol_print_symbols(void); extern void Swig_symbol_print_csymbols(void); extern void Swig_symbol_init(void); extern void Swig_symbol_setscopename(const_String_or_char_ptr name); extern String *Swig_symbol_getscopename(void); extern String *Swig_symbol_qualifiedscopename(Symtab *symtab); extern String *Swig_symbol_qualified_language_scopename(Symtab *symtab); extern Symtab *Swig_symbol_newscope(void); extern Symtab *Swig_symbol_setscope(Symtab *); extern Symtab *Swig_symbol_getscope(const_String_or_char_ptr symname); extern Symtab *Swig_symbol_global_scope(void); extern Symtab *Swig_symbol_current(void); extern Symtab *Swig_symbol_popscope(void); extern Node *Swig_symbol_add(const_String_or_char_ptr symname, Node *node); extern void Swig_symbol_cadd(const_String_or_char_ptr symname, Node *node); extern Node *Swig_symbol_clookup(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_check(const_String_or_char_ptr symname, Symtab *tab, int (*check) (Node *)); extern Node *Swig_symbol_clookup_no_inherit(const_String_or_char_ptr name, Symtab *n); extern Symtab *Swig_symbol_cscope(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_local(const_String_or_char_ptr symname, Symtab *tab); extern Node *Swig_symbol_clookup_local_check(const_String_or_char_ptr symname, Symtab *tab, int (*check) (Node *)); extern String *Swig_symbol_qualified(Node *node); extern Node *Swig_symbol_isoverloaded(Node *node); extern void Swig_symbol_remove(Node *node); extern void Swig_symbol_alias(const_String_or_char_ptr aliasname, Symtab *tab); extern void Swig_symbol_inherit(Symtab *tab); extern SwigType *Swig_symbol_type_qualify(const SwigType *ty, Symtab *tab); extern String *Swig_symbol_string_qualify(String *s, Symtab *tab); extern SwigType *Swig_symbol_typedef_reduce(const SwigType *ty, Symtab *tab); extern ParmList *Swig_symbol_template_defargs(Parm *parms, Parm *targs, Symtab *tscope, Symtab *tsdecl); extern SwigType *Swig_symbol_template_deftype(const SwigType *type, Symtab *tscope); extern SwigType *Swig_symbol_template_param_eval(const SwigType *p, Symtab *symtab); /* --- Parameters and Parameter Lists --- */ #include "swigparm.h" extern String *ParmList_errorstr(ParmList *); extern int ParmList_is_compactdefargs(ParmList *p); /* --- Parse tree support --- */ #include "swigtree.h" /* -- Wrapper function Object */ #include "swigwrap.h" /* --- Naming functions --- */ extern void Swig_name_register(const_String_or_char_ptr method, const_String_or_char_ptr format); extern void Swig_name_unregister(const_String_or_char_ptr method); extern String *Swig_name_mangle(const_String_or_char_ptr s); extern String *Swig_name_wrapper(const_String_or_char_ptr fname); extern String *Swig_name_member(const_String_or_char_ptr nspace, const_String_or_char_ptr classname, const_String_or_char_ptr membername); extern String *Swig_name_get(const_String_or_char_ptr nspace, const_String_or_char_ptr vname); extern String *Swig_name_set(const_String_or_char_ptr nspace, const_String_or_char_ptr vname); extern String *Swig_name_construct(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_copyconstructor(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_destroy(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern String *Swig_name_disown(const_String_or_char_ptr nspace, const_String_or_char_ptr classname); extern void Swig_naming_init(void); extern void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn); extern void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *namewrn, ParmList *declaratorparms); extern void Swig_name_inherit(String *base, String *derived); extern List *Swig_make_inherit_list(String *clsname, List *names, String *Namespaceprefix); extern void Swig_inherit_base_symbols(List *bases); extern int Swig_need_protected(Node *n); extern int Swig_need_redefined_warn(Node *a, Node *b, int InClass); extern String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname); extern String *Swig_name_warning(Node *n, String *prefix, String *name, SwigType *decl); extern String *Swig_name_str(Node *n); extern String *Swig_name_decl(Node *n); extern String *Swig_name_fulldecl(Node *n); /* --- parameterized rename functions --- */ extern void Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object); extern DOH *Swig_name_object_get(Hash *namehash, String *prefix, String *name, SwigType *decl); extern void Swig_name_object_inherit(Hash *namehash, String *base, String *derived); extern void Swig_features_get(Hash *features, String *prefix, String *name, SwigType *decl, Node *n); extern void Swig_feature_set(Hash *features, const_String_or_char_ptr name, SwigType *decl, const_String_or_char_ptr featurename, const_String_or_char_ptr value, Hash *featureattribs); /* --- Misc --- */ extern char *Swig_copy_string(const char *c); extern void Swig_set_fakeversion(const char *version); extern const char *Swig_package_version(void); extern void Swig_banner(File *f); extern void Swig_banner_target_lang(File *f, const_String_or_char_ptr commentchar); extern String *Swig_strip_c_comments(const String *s); extern String *Swig_new_subdirectory(String *basedirectory, String *subdirectory); extern void Swig_filename_correct(String *filename); extern String *Swig_filename_escape(String *filename); extern void Swig_filename_unescape(String *filename); extern int Swig_storage_isextern(Node *n); extern int Swig_storage_isexternc(Node *n); extern int Swig_storage_isstatic_custom(Node *n, const_String_or_char_ptr storage); extern int Swig_storage_isstatic(Node *n); extern String *Swig_string_escape(String *s); extern String *Swig_string_mangle(const String *s); extern void Swig_scopename_split(const String *s, String **prefix, String **last); extern String *Swig_scopename_prefix(const String *s); extern String *Swig_scopename_last(const String *s); extern String *Swig_scopename_first(const String *s); extern String *Swig_scopename_suffix(const String *s); extern int Swig_scopename_check(const String *s); extern String *Swig_string_lower(String *s); extern String *Swig_string_upper(String *s); extern String *Swig_string_title(String *s); extern void Swig_offset_string(String *s, int number); extern String *Swig_pcre_version(void); extern void Swig_init(void); extern int Swig_value_wrapper_mode(int mode); typedef enum { EMF_STANDARD, EMF_MICROSOFT } ErrorMessageFormat; extern void Swig_warning(int num, const_String_or_char_ptr filename, int line, const char *fmt, ...); extern void Swig_error(const_String_or_char_ptr filename, int line, const char *fmt, ...); extern int Swig_error_count(void); extern void Swig_error_silent(int s); extern void Swig_warnfilter(const_String_or_char_ptr wlist, int val); extern void Swig_warnall(void); extern int Swig_warn_count(void); extern void Swig_error_msg_format(ErrorMessageFormat format); extern void Swig_diagnostic(const_String_or_char_ptr filename, int line, const char *fmt, ...); extern String *Swig_stringify_with_location(DOH *object); /* --- C Wrappers --- */ extern void Swig_cresult_name_set(const char *new_name); extern const char *Swig_cresult_name(void); extern String *Swig_cparm_name(Parm *p, int i); extern String *Swig_wrapped_var_type(SwigType *t, int varcref); extern int Swig_cargs(Wrapper *w, ParmList *l); extern String *Swig_cresult(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms); extern String *Swig_cconstructor_call(const_String_or_char_ptr name); extern String *Swig_cppconstructor_call(const_String_or_char_ptr name, ParmList *parms); extern String *Swig_unref_call(Node *n); extern String *Swig_ref_call(Node *n, const String *lname); extern String *Swig_cdestructor_call(Node *n); extern String *Swig_cppdestructor_call(Node *n); extern String *Swig_cmemberset_call(const_String_or_char_ptr name, SwigType *type, String *self, int varcref); extern String *Swig_cmemberget_call(const_String_or_char_ptr name, SwigType *t, String *self, int varcref); extern int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self); extern void Swig_replace_special_variables(Node *n, Node *parentnode, String *code); /* --- Transformations --- */ extern int Swig_MethodToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int flags, SwigType *director_type, int is_director); extern int Swig_ConstructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, String *none_comparison, String *director_ctor, int cplus, int flags, String *directorname); extern int Swig_DestructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int cplus, int flags); extern int Swig_MembersetToFunction(Node *n, String *classname, int flags); extern int Swig_MembergetToFunction(Node *n, String *classname, int flags); extern int Swig_VargetToFunction(Node *n, int flags); extern int Swig_VarsetToFunction(Node *n, int flags); #define CWRAP_EXTEND 0x01 #define CWRAP_SMART_POINTER 0x02 #define CWRAP_NATURAL_VAR 0x04 #define CWRAP_DIRECTOR_ONE_CALL 0x08 #define CWRAP_DIRECTOR_TWO_CALLS 0x10 #define CWRAP_ALL_PROTECTED_ACCESS 0x20 #define CWRAP_SMART_POINTER_OVERLOAD 0x40 /* --- Director Helpers --- */ extern Node *Swig_methodclass(Node *n); extern int Swig_directorclass(Node *n); extern Node *Swig_directormap(Node *n, String *type); /* --- Legacy Typemap API (somewhat simplified, ha!) --- */ extern void Swig_typemap_init(void); extern void Swig_typemap_register(const_String_or_char_ptr tmap_method, ParmList *pattern, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs); extern int Swig_typemap_copy(const_String_or_char_ptr tmap_method, ParmList *srcpattern, ParmList *pattern); extern void Swig_typemap_clear(const_String_or_char_ptr tmap_method, ParmList *pattern); extern int Swig_typemap_apply(ParmList *srcpat, ParmList *destpat); extern void Swig_typemap_clear_apply(ParmList *pattern); extern void Swig_typemap_replace_embedded_typemap(String *s, Node *file_line_node); extern void Swig_typemap_debug(void); extern void Swig_typemap_search_debug_set(void); extern void Swig_typemap_used_debug_set(void); extern void Swig_typemap_register_debug_set(void); extern String *Swig_typemap_lookup(const_String_or_char_ptr tmap_method, Node *n, const_String_or_char_ptr lname, Wrapper *f); extern String *Swig_typemap_lookup_out(const_String_or_char_ptr tmap_method, Node *n, const_String_or_char_ptr lname, Wrapper *f, String *actioncode); extern void Swig_typemap_attach_parms(const_String_or_char_ptr tmap_method, ParmList *parms, Wrapper *f); /* --- Code fragment support --- */ extern void Swig_fragment_register(Node *fragment); extern void Swig_fragment_emit(String *name); extern void Swig_fragment_clear(String *section); /* --- Extension support --- */ extern Hash *Swig_extend_hash(void); extern void Swig_extend_merge(Node *cls, Node *am); extern void Swig_extend_append_previous(Node *cls, Node *am); extern void Swig_extend_unused_check(void); /* hacks defined in C++ ! */ extern int Swig_director_mode(void); extern int Swig_director_protected_mode(void); extern int Swig_all_protected_mode(void); extern void Wrapper_director_mode_set(int); extern void Wrapper_director_protected_mode_set(int); extern void Wrapper_all_protected_mode_set(int); extern void Language_replace_special_variables(String *method, String *tm, Parm *parm); extern void Swig_print(DOH *object, int count); extern void Swig_print_with_location(DOH *object, int count); /* -- template init -- */ extern void SwigType_template_init(void); #ifdef __cplusplus } #endif #endif swig-3.0.12/Source/Swig/swigscan.h0000664000175000017500000001321613042756442016600 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigscan.h * * C/C++ scanner. * ----------------------------------------------------------------------------- */ typedef struct Scanner Scanner; extern Scanner *NewScanner(void); extern void DelScanner(Scanner *); extern void Scanner_clear(Scanner *); extern void Scanner_push(Scanner *, String *); extern void Scanner_pushtoken(Scanner *, int, const_String_or_char_ptr value); extern int Scanner_token(Scanner *); extern String *Scanner_text(Scanner *); extern void Scanner_skip_line(Scanner *); extern int Scanner_skip_balanced(Scanner *, int startchar, int endchar); extern String *Scanner_get_raw_text_balanced(Scanner *, int startchar, int endchar); extern void Scanner_set_location(Scanner *, String *file, int line); extern String *Scanner_file(Scanner *); extern int Scanner_line(Scanner *); extern int Scanner_start_line(Scanner *); extern void Scanner_idstart(Scanner *, const char *idchar); extern String *Scanner_errmsg(Scanner *); extern int Scanner_errline(Scanner *); extern int Scanner_isoperator(int tokval); extern void Scanner_locator(Scanner *, String *loc); /* Note: Tokens in range 100+ are for C/C++ operators */ #define SWIG_MAXTOKENS 200 #define SWIG_TOKEN_LPAREN 1 /* ( */ #define SWIG_TOKEN_RPAREN 2 /* ) */ #define SWIG_TOKEN_SEMI 3 /* ; */ #define SWIG_TOKEN_LBRACE 4 /* { */ #define SWIG_TOKEN_RBRACE 5 /* } */ #define SWIG_TOKEN_LBRACKET 6 /* [ */ #define SWIG_TOKEN_RBRACKET 7 /* ] */ #define SWIG_TOKEN_BACKSLASH 8 /* \ */ #define SWIG_TOKEN_ENDLINE 9 /* \n */ #define SWIG_TOKEN_STRING 10 /* "str" */ #define SWIG_TOKEN_POUND 11 /* # */ #define SWIG_TOKEN_COLON 12 /* : */ #define SWIG_TOKEN_DCOLON 13 /* :: */ #define SWIG_TOKEN_DCOLONSTAR 14 /* ::* */ #define SWIG_TOKEN_ID 15 /* identifer */ #define SWIG_TOKEN_FLOAT 16 /* 3.1415F */ #define SWIG_TOKEN_DOUBLE 17 /* 3.1415 */ #define SWIG_TOKEN_INT 18 /* 314 */ #define SWIG_TOKEN_UINT 19 /* 314U */ #define SWIG_TOKEN_LONG 20 /* 314L */ #define SWIG_TOKEN_ULONG 21 /* 314UL */ #define SWIG_TOKEN_CHAR 22 /* 'charconst' */ #define SWIG_TOKEN_PERIOD 23 /* . */ #define SWIG_TOKEN_AT 24 /* @ */ #define SWIG_TOKEN_DOLLAR 25 /* $ */ #define SWIG_TOKEN_CODEBLOCK 26 /* %{ ... %} ... */ #define SWIG_TOKEN_RSTRING 27 /* `charconst` */ #define SWIG_TOKEN_LONGLONG 28 /* 314LL */ #define SWIG_TOKEN_ULONGLONG 29 /* 314ULL */ #define SWIG_TOKEN_QUESTION 30 /* ? */ #define SWIG_TOKEN_COMMENT 31 /* C or C++ comment */ #define SWIG_TOKEN_BOOL 32 /* true or false */ #define SWIG_TOKEN_WSTRING 33 /* L"str" */ #define SWIG_TOKEN_WCHAR 34 /* L'c' */ #define SWIG_TOKEN_ILLEGAL 99 #define SWIG_TOKEN_ERROR -1 #define SWIG_TOKEN_COMMA 101 /* , */ #define SWIG_TOKEN_STAR 102 /* * */ #define SWIG_TOKEN_TIMES 102 /* * */ #define SWIG_TOKEN_EQUAL 103 /* = */ #define SWIG_TOKEN_EQUALTO 104 /* == */ #define SWIG_TOKEN_NOTEQUAL 105 /* != */ #define SWIG_TOKEN_PLUS 106 /* + */ #define SWIG_TOKEN_MINUS 107 /* - */ #define SWIG_TOKEN_AND 108 /* & */ #define SWIG_TOKEN_LAND 109 /* && */ #define SWIG_TOKEN_OR 110 /* | */ #define SWIG_TOKEN_LOR 111 /* || */ #define SWIG_TOKEN_XOR 112 /* ^ */ #define SWIG_TOKEN_LESSTHAN 113 /* < */ #define SWIG_TOKEN_GREATERTHAN 114 /* > */ #define SWIG_TOKEN_LTEQUAL 115 /* <= */ #define SWIG_TOKEN_GTEQUAL 116 /* >= */ #define SWIG_TOKEN_NOT 117 /* ~ */ #define SWIG_TOKEN_LNOT 118 /* ! */ #define SWIG_TOKEN_SLASH 119 /* / */ #define SWIG_TOKEN_DIVIDE 119 /* / */ #define SWIG_TOKEN_PERCENT 120 /* % */ #define SWIG_TOKEN_MODULO 120 /* % */ #define SWIG_TOKEN_LSHIFT 121 /* << */ #define SWIG_TOKEN_RSHIFT 122 /* >> */ #define SWIG_TOKEN_PLUSPLUS 123 /* ++ */ #define SWIG_TOKEN_MINUSMINUS 124 /* -- */ #define SWIG_TOKEN_PLUSEQUAL 125 /* += */ #define SWIG_TOKEN_MINUSEQUAL 126 /* -= */ #define SWIG_TOKEN_TIMESEQUAL 127 /* *= */ #define SWIG_TOKEN_DIVEQUAL 128 /* /= */ #define SWIG_TOKEN_ANDEQUAL 129 /* &= */ #define SWIG_TOKEN_OREQUAL 130 /* |= */ #define SWIG_TOKEN_XOREQUAL 131 /* ^= */ #define SWIG_TOKEN_LSEQUAL 132 /* <<= */ #define SWIG_TOKEN_RSEQUAL 133 /* >>= */ #define SWIG_TOKEN_MODEQUAL 134 /* %= */ #define SWIG_TOKEN_ARROW 135 /* -> */ #define SWIG_TOKEN_ARROWSTAR 136 /* ->* */ swig-3.0.12/Source/Swig/swigwrap.h0000664000175000017500000000277413042756442016634 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigwrap.h * * Functions related to wrapper objects. * ----------------------------------------------------------------------------- */ typedef struct Wrapper { Hash *localh; String *def; String *locals; String *code; } Wrapper; extern Wrapper *NewWrapper(void); extern void DelWrapper(Wrapper *w); extern void Wrapper_compact_print_mode_set(int flag); extern void Wrapper_pretty_print(String *str, File *f); extern void Wrapper_compact_print(String *str, File *f); extern void Wrapper_print(Wrapper *w, File *f); extern int Wrapper_add_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern int Wrapper_add_localv(Wrapper *w, const_String_or_char_ptr name, ...); extern int Wrapper_check_local(Wrapper *w, const_String_or_char_ptr name); extern char *Wrapper_new_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl); extern char *Wrapper_new_localv(Wrapper *w, const_String_or_char_ptr name, ...); swig-3.0.12/Source/Swig/parms.c0000664000175000017500000001612113042756442016075 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * parms.c * * Parameter list class. * ----------------------------------------------------------------------------- */ #include "swig.h" /* ------------------------------------------------------------------------ * NewParm() * * Create a new parameter from datatype 'type' and name 'name' copying * the file and line number from the Node from_node. * ------------------------------------------------------------------------ */ Parm *NewParm(SwigType *type, const_String_or_char_ptr name, Node *from_node) { Parm *p = NewParmWithoutFileLineInfo(type, name); Setfile(p, Getfile(from_node)); Setline(p, Getline(from_node)); return p; } /* ------------------------------------------------------------------------ * NewParmWithoutFileLineInfo() * * Create a new parameter from datatype 'type' and name 'name' without any * file / line numbering information. * ------------------------------------------------------------------------ */ Parm *NewParmWithoutFileLineInfo(SwigType *type, const_String_or_char_ptr name) { Parm *p = NewHash(); set_nodeType(p, "parm"); if (type) { SwigType *ntype = Copy(type); Setattr(p, "type", ntype); Delete(ntype); } Setattr(p, "name", name); return p; } /* ------------------------------------------------------------------------ * NewParmNode() * * Create a new parameter from datatype 'type' and name and symbol table as * well as file and line number from the 'from_node'. * The resulting Parm will be similar to a Node used for typemap lookups. * ------------------------------------------------------------------------ */ Parm *NewParmNode(SwigType *type, Node *from_node) { Parm *p = NewParm(type, Getattr(from_node, "name"), from_node); Setattr(p, "sym:symtab", Getattr(from_node, "sym:symtab")); return p; } /* ------------------------------------------------------------------------ * CopyParm() * ------------------------------------------------------------------------ */ Parm *CopyParm(Parm *p) { Parm *np = NewHash(); Iterator ki; for (ki = First(p); ki.key; ki = Next(ki)) { if (DohIsString(ki.item)) { DOH *c = Copy(ki.item); Setattr(np,ki.key,c); Delete(c); } } Setfile(np, Getfile(p)); Setline(np, Getline(p)); return np; } /* ------------------------------------------------------------------ * CopyParmListMax() * CopyParmList() * ------------------------------------------------------------------ */ ParmList *CopyParmListMax(ParmList *p, int count) { Parm *np; Parm *pp = 0; Parm *fp = 0; if (!p) return 0; while (p) { if (count == 0) break; np = CopyParm(p); if (pp) { set_nextSibling(pp, np); Delete(np); } else { fp = np; } pp = np; p = nextSibling(p); count--; } return fp; } ParmList *CopyParmList(ParmList *p) { return CopyParmListMax(p,-1); } /* ----------------------------------------------------------------------------- * int ParmList_numrequired(). Return number of required arguments * ----------------------------------------------------------------------------- */ int ParmList_numrequired(ParmList *p) { int i = 0; while (p) { SwigType *t = Getattr(p, "type"); String *value = Getattr(p, "value"); if (value) return i; if (!(SwigType_type(t) == T_VOID)) i++; else break; p = nextSibling(p); } return i; } /* ----------------------------------------------------------------------------- * int ParmList_len() * ----------------------------------------------------------------------------- */ int ParmList_len(ParmList *p) { int i = 0; while (p) { i++; p = nextSibling(p); } return i; } /* --------------------------------------------------------------------- * get_empty_type() * ---------------------------------------------------------------------- */ static SwigType *get_empty_type() { return NewStringEmpty(); } /* --------------------------------------------------------------------- * ParmList_str() * * Generates a string of parameters * ---------------------------------------------------------------------- */ String *ParmList_str(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), Getattr(p, "name")); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* --------------------------------------------------------------------- * ParmList_str_defaultargs() * * Generates a string of parameters including default arguments * ---------------------------------------------------------------------- */ String *ParmList_str_defaultargs(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *value = Getattr(p, "value"); String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), Getattr(p, "name")); Append(out, pstr); if (value) { Printf(out, "=%s", value); } p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* ----------------------------------------------------------------------------- * ParmList_str_multibrackets() * * Generates a string of parameters including default arguments adding brackets * if more than one parameter * ----------------------------------------------------------------------------- */ String *ParmList_str_multibrackets(ParmList *p) { String *out; String *parm_str = ParmList_str_defaultargs(p); if (ParmList_len(p) > 1) out = NewStringf("(%s)", parm_str); else out = NewStringf("%s", parm_str); Delete(parm_str); return out; } /* --------------------------------------------------------------------- * ParmList_protostr() * * Generate a prototype string. * ---------------------------------------------------------------------- */ String *ParmList_protostr(ParmList *p) { String *out = NewStringEmpty(); while (p) { String *type = Getattr(p, "type"); String *pstr = SwigType_str(type ? type : get_empty_type(), 0); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } return out; } /* --------------------------------------------------------------------- * ParmList_has_defaultargs() * * Returns 1 if the parameter list passed in is has one or more default * arguments. Otherwise returns 0. * ---------------------------------------------------------------------- */ int ParmList_has_defaultargs(ParmList *p) { while (p) { if (Getattr(p, "value")) { return 1; } p = nextSibling(p); } return 0; } swig-3.0.12/Source/Swig/typemap.c0000664000175000017500000017743013042756442016445 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typemap.c * * A somewhat generalized implementation of SWIG1.1 typemaps. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include #if 0 #define SWIG_DEBUG #endif static int typemap_search_debug = 0; static int typemaps_used_debug = 0; static int typemap_register_debug = 0; static int in_typemap_search_multi = 0; static void replace_embedded_typemap(String *s, ParmList *parm_sublist, Wrapper *f, Node *file_line_node); /* ----------------------------------------------------------------------------- * Typemaps are stored in a collection of nested hash tables. Something like * this: * * [ type ] * +-------- [ name ] * +-------- [ name ] * * Each hash table [ type ] or [ name ] then contains references to the * different typemap methods. These are referenced by names such as * "tmap:in", "tmap:out", "tmap:argout", and so forth. * * The object corresponding to a specific typemap method has the following attributes: * * "type" - Typemap type * "pname" - Parameter name * "code" - Typemap code * "source" - Source directive (%apply or %typemap) for the typemap * "locals" - Local variables (if any) * "kwargs" - Typemap attributes * * Example for a typemap method named "in": * %typemap(in, warning="987:my warning", noblock=1) int &my_int (int tmp) "$1 = $input;" * * "type" - r.int * "pname" - my_int * "code" - $1 = $input; * "source" - typemap(in) int &my_int * "locals" - int tmp * "kwargs" - warning="987:my typemap warning", foo=123 * * ----------------------------------------------------------------------------- */ static Hash *typemaps; static Hash *get_typemap(const SwigType *type) { Hash *tm = 0; SwigType *dtype = 0; SwigType *hashtype; if (SwigType_istemplate(type)) { String *ty = Swig_symbol_template_deftype(type, 0); dtype = Swig_symbol_type_qualify(ty, 0); type = dtype; Delete(ty); } /* remove unary scope operator (::) prefix indicating global scope for looking up in the hashmap */ hashtype = SwigType_remove_global_scope_prefix(type); tm = Getattr(typemaps, hashtype); Delete(dtype); Delete(hashtype); return tm; } static void set_typemap(const SwigType *type, Hash **tmhash) { SwigType *hashtype = 0; Hash *new_tm = 0; assert(*tmhash == 0); if (SwigType_istemplate(type)) { SwigType *rty = SwigType_typedef_resolve_all(type); String *ty = Swig_symbol_template_deftype(rty, 0); String *tyq = Swig_symbol_type_qualify(ty, 0); hashtype = SwigType_remove_global_scope_prefix(tyq); *tmhash = Getattr(typemaps, hashtype); Delete(rty); Delete(tyq); Delete(ty); } else { hashtype = SwigType_remove_global_scope_prefix(type); } if (!*tmhash) { /* this type has not been seen before even after resolving template parameter types */ new_tm = NewHash(); *tmhash = new_tm; } /* note that the unary scope operator (::) prefix indicating global scope has been removed from the type */ Setattr(typemaps, hashtype, *tmhash); Delete(hashtype); Delete(new_tm); } /* ----------------------------------------------------------------------------- * Swig_typemap_init() * * Initialize the typemap system * ----------------------------------------------------------------------------- */ void Swig_typemap_init() { typemaps = NewHash(); } static String *typemap_method_name(const_String_or_char_ptr tmap_method) { static Hash *names = 0; String *s; /* Due to "interesting" object-identity semantics of DOH, we have to make sure that we only intern strings without object identity into the hash table. (typemap_attach_kwargs calls typemap_method_name several times with the "same" String *tmap_method (i.e., same object identity) but differing string values.) Most other callers work around this by using char* rather than String *. -- mkoeppe, Jun 17, 2003 */ const char *method_without_object_identity = Char(tmap_method); if (!names) names = NewHash(); s = Getattr(names, method_without_object_identity); if (s) return s; s = NewStringf("tmap:%s", tmap_method); Setattr(names, method_without_object_identity, s); Delete(s); return s; } /* ----------------------------------------------------------------------------- * typemap_register() * * Internal implementation for Swig_typemap_register() * ----------------------------------------------------------------------------- */ static void typemap_register(const_String_or_char_ptr tmap_method, ParmList *parms, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs, String *source_directive) { Hash *tm; Hash *tm1; Hash *tm2; Parm *np; String *tm_method; SwigType *type; String *pname; if (!parms) return; if (typemap_register_debug) { Printf(stdout, "Registering - %s\n", tmap_method); Swig_print_node(parms); } tm_method = typemap_method_name(tmap_method); /* Register the first type in the parameter list */ type = Getattr(parms, "type"); pname = Getattr(parms, "name"); /* See if this type has been seen before */ tm = get_typemap(type); if (!tm) { set_typemap(type, &tm); } if (pname) { /* See if parameter has been seen before */ tm1 = Getattr(tm, pname); if (!tm1) { tm1 = NewHash(); Setattr(tm, pname, tm1); Delete(tm1); } tm = tm1; } /* Now see if this typemap method has been seen before */ tm2 = Getattr(tm, tm_method); if (!tm2) { tm2 = NewHash(); Setattr(tm, tm_method, tm2); Delete(tm2); } /* For a multi-argument typemap, the typemap code and information is really only stored in the last argument. However, to make this work, we perform a really neat trick using the typemap method name. For example, consider this typemap %typemap(in) (int foo, int *bar, char *blah[]) { ... } To store it, we look at typemaps for the following: typemap method type-name ---------------------------------------------- "in" int foo "in-int+foo:" int *bar "in-int+foo:-p.int+bar: char *blah[] Notice how the typemap method name expands to encode information about previous arguments. */ np = nextSibling(parms); if (np) { /* Make an entirely new typemap method key */ String *multi_tmap_method = NewStringf("%s-%s+%s:", tmap_method, type, pname); /* Now reregister on the remaining arguments */ typemap_register(multi_tmap_method, np, code, locals, kwargs, source_directive); Delete(multi_tmap_method); } else { ParmList *clocals = CopyParmList(locals); ParmList *ckwargs = CopyParmList(kwargs); Setfile(tm2, Getfile(code)); Setline(tm2, Getline(code)); Setattr(tm2, "code", code); Setattr(tm2, "type", type); Setattr(tm2, "source", source_directive); if (pname) { Setattr(tm2, "pname", pname); } Setattr(tm2, "locals", clocals); Setattr(tm2, "kwargs", ckwargs); Delete(clocals); Delete(ckwargs); } } /* ----------------------------------------------------------------------------- * Swig_typemap_register() * * Add a new, possibly multi-argument, typemap * ----------------------------------------------------------------------------- */ void Swig_typemap_register(const_String_or_char_ptr tmap_method, ParmList *parms, const_String_or_char_ptr code, ParmList *locals, ParmList *kwargs) { String *parms_str = ParmList_str_multibrackets(parms); String *source_directive = NewStringf("typemap(%s) %s", tmap_method, parms_str); typemap_register(tmap_method, parms, code, locals, kwargs, source_directive); Delete(source_directive); Delete(parms_str); } /* ----------------------------------------------------------------------------- * typemap_get() * * Retrieve typemap information. * ----------------------------------------------------------------------------- */ static Hash *typemap_get(SwigType *type, const_String_or_char_ptr name) { Hash *tm, *tm1; tm = get_typemap(type); if (!tm) { return 0; } if ((name) && Len(name)) { tm1 = Getattr(tm, name); return tm1; } return tm; } /* ----------------------------------------------------------------------------- * Swig_typemap_copy() * * Copy a typemap * ----------------------------------------------------------------------------- */ int Swig_typemap_copy(const_String_or_char_ptr tmap_method, ParmList *srcparms, ParmList *parms) { Hash *tm = 0; String *tm_method; Parm *p; String *pname; SwigType *ptype; String *tm_methods, *multi_tmap_method; if (ParmList_len(parms) != ParmList_len(srcparms)) return -1; tm_method = typemap_method_name(tmap_method); p = srcparms; tm_methods = NewString(tm_method); while (p) { ptype = Getattr(p, "type"); pname = Getattr(p, "name"); /* Lookup the type */ tm = typemap_get(ptype, pname); if (!tm) break; tm = Getattr(tm, tm_methods); if (!tm) break; /* Got a match. Look for next typemap */ multi_tmap_method = NewStringf("%s-%s+%s:", tm_methods, ptype, pname); Delete(tm_methods); tm_methods = multi_tmap_method; p = nextSibling(p); } Delete(tm_methods); if (!p && tm) { /* Got some kind of match */ String *parms_str = ParmList_str_multibrackets(parms); String *srcparms_str = ParmList_str_multibrackets(srcparms); String *source_directive = NewStringf("typemap(%s) %s = %s", tmap_method, parms_str, srcparms_str); typemap_register(tmap_method, parms, Getattr(tm, "code"), Getattr(tm, "locals"), Getattr(tm, "kwargs"), source_directive); Delete(source_directive); Delete(srcparms_str); Delete(parms_str); return 0; } /* Not found */ return -1; } /* ----------------------------------------------------------------------------- * Swig_typemap_clear() * * Delete a multi-argument typemap * ----------------------------------------------------------------------------- */ void Swig_typemap_clear(const_String_or_char_ptr tmap_method, ParmList *parms) { SwigType *type; String *name; Parm *p; String *multi_tmap_method; Hash *tm = 0; /* This might not work */ multi_tmap_method = NewString(tmap_method); p = parms; while (p) { type = Getattr(p, "type"); name = Getattr(p, "name"); tm = typemap_get(type, name); if (!tm) return; p = nextSibling(p); if (p) Printf(multi_tmap_method, "-%s+%s:", type, name); } if (tm) { tm = Getattr(tm, typemap_method_name(multi_tmap_method)); if (tm) { Delattr(tm, "code"); Delattr(tm, "locals"); Delattr(tm, "kwargs"); } } Delete(multi_tmap_method); } /* ----------------------------------------------------------------------------- * Swig_typemap_apply() * * Multi-argument %apply directive. This is pretty horrible so I sure hope * it works. * ----------------------------------------------------------------------------- */ static int count_args(String *s) { /* Count up number of arguments */ int na = 0; char *c = Char(s); while (*c) { if (*c == '+') na++; c++; } return na; } int Swig_typemap_apply(ParmList *src, ParmList *dest) { String *ssig, *dsig; Parm *p, *np, *lastp, *dp, *lastdp = 0; int narg = 0; SwigType *type = 0, *name; Hash *tm, *sm; int match = 0; /* Printf(stdout,"apply : %s --> %s\n", ParmList_str(src), ParmList_str(dest)); */ /* Create type signature of source */ ssig = NewStringEmpty(); dsig = NewStringEmpty(); p = src; dp = dest; lastp = 0; while (p) { lastp = p; lastdp = dp; np = nextSibling(p); if (np) { Printf(ssig, "-%s+%s:", Getattr(p, "type"), Getattr(p, "name")); Printf(dsig, "-%s+%s:", Getattr(dp, "type"), Getattr(dp, "name")); narg++; } p = np; dp = nextSibling(dp); } /* make sure a typemap node exists for the last destination node */ type = Getattr(lastdp, "type"); tm = get_typemap(type); if (!tm) { set_typemap(type, &tm); } name = Getattr(lastdp, "name"); if (name) { Hash *tm1 = Getattr(tm, name); if (!tm1) { tm1 = NewHash(); Setattr(tm, NewString(name), tm1); Delete(tm1); } tm = tm1; } /* This is a little nasty. We need to go searching for all possible typemaps in the source and apply them to the target */ type = Getattr(lastp, "type"); name = Getattr(lastp, "name"); /* See if there is a matching typemap in this scope */ sm = typemap_get(type, name); /* if there is not matching, look for a typemap in the original typedef, if any, like in: typedef unsigned long size_t; ... %apply(size_t) {my_size}; ==> %apply(unsigned long) {my_size}; */ if (!sm) { SwigType *ntype = SwigType_typedef_resolve(type); if (ntype && (Cmp(ntype, type) != 0)) { sm = typemap_get(ntype, name); } Delete(ntype); } if (sm) { /* Got a typemap. Need to only merge attributes for methods that match our signature */ Iterator ki; match = 1; for (ki = First(sm); ki.key; ki = Next(ki)) { /* Check for a signature match with the source signature */ if ((count_args(ki.key) == narg) && (Strstr(ki.key, ssig))) { String *oldm; /* A typemap we have to copy */ String *nkey = Copy(ki.key); Replace(nkey, ssig, dsig, DOH_REPLACE_ANY); /* Make sure the typemap doesn't already exist in the target map */ oldm = Getattr(tm, nkey); if (!oldm || (!Getattr(tm, "code"))) { String *code; ParmList *locals; ParmList *kwargs; Hash *sm1 = ki.item; code = Getattr(sm1, "code"); locals = Getattr(sm1, "locals"); kwargs = Getattr(sm1, "kwargs"); if (code) { String *src_str = ParmList_str_multibrackets(src); String *dest_str = ParmList_str_multibrackets(dest); String *source_directive = NewStringf("apply %s { %s }", src_str, dest_str); Replace(nkey, dsig, "", DOH_REPLACE_ANY); Replace(nkey, "tmap:", "", DOH_REPLACE_ANY); typemap_register(nkey, dest, code, locals, kwargs, source_directive); Delete(source_directive); Delete(dest_str); Delete(src_str); } } Delete(nkey); } } } Delete(ssig); Delete(dsig); return match; } /* ----------------------------------------------------------------------------- * Swig_typemap_clear_apply() * * %clear directive. Clears all typemaps for a type (in the current scope only). * ----------------------------------------------------------------------------- */ /* Multi-argument %clear directive */ void Swig_typemap_clear_apply(Parm *parms) { String *tsig; Parm *p, *np, *lastp; int narg = 0; Hash *tm; String *name; /* Create a type signature of the parameters */ tsig = NewStringEmpty(); p = parms; lastp = 0; while (p) { lastp = p; np = nextSibling(p); if (np) { Printf(tsig, "-%s+%s:", Getattr(p, "type"), Getattr(p, "name")); narg++; } p = np; } tm = get_typemap(Getattr(lastp, "type")); if (!tm) { Delete(tsig); return; } name = Getattr(lastp, "name"); if (name) { tm = Getattr(tm, name); } if (tm) { /* Clear typemaps that match our signature */ Iterator ki, ki2; char *ctsig = Char(tsig); for (ki = First(tm); ki.key; ki = Next(ki)) { char *ckey = Char(ki.key); if (strncmp(ckey, "tmap:", 5) == 0) { int na = count_args(ki.key); if ((na == narg) && strstr(ckey, ctsig)) { Hash *h = ki.item; for (ki2 = First(h); ki2.key; ki2 = Next(ki2)) { Delattr(h, ki2.key); } } } } } Delete(tsig); } /* Internal function to strip array dimensions. */ static SwigType *strip_arrays(SwigType *type) { SwigType *t; int ndim; int i; t = Copy(type); ndim = SwigType_array_ndim(t); for (i = 0; i < ndim; i++) { SwigType_array_setdim(t, i, "ANY"); } return t; } static void debug_search_result_display(Node *tm) { if (tm) Printf(stdout, " Using: %%%s\n", Getattr(tm, "source")); else Printf(stdout, " None found\n"); } /* ----------------------------------------------------------------------------- * typemap_search_helper() * * Helper function for typemap_search to see if there is a type match in the typemap * tm. A match is sought in this order: * %typemap(tm_method) ctype cqualifiedname * %typemap(tm_method) ctype cname * %typemap(tm_method) ctype * ----------------------------------------------------------------------------- */ static Hash *typemap_search_helper(int debug_display, Hash *tm, const String *tm_method, SwigType *ctype, const String *cqualifiedname, const String *cname, Hash **backup) { Hash *result = 0; Hash *tm1; if (debug_display && cqualifiedname) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, cqualifiedname)); if (tm && cqualifiedname) { tm1 = Getattr(tm, cqualifiedname); if (tm1) { result = Getattr(tm1, tm_method); /* See if there is a type - qualified name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } } if (debug_display && cname) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, cname)); if (tm && cname) { tm1 = Getattr(tm, cname); if (tm1) { result = Getattr(tm1, tm_method); /* See if there is a type - name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } } if (debug_display) Printf(stdout, " Looking for: %s\n", SwigType_str(ctype, 0)); if (tm) { result = Getattr(tm, tm_method); /* See if there is simply a type without name match */ if (result && Getattr(result, "code")) goto ret_result; if (result) *backup = result; } ret_result: return result; } /* ----------------------------------------------------------------------------- * typemap_search() * * Search for a typemap match. This is where the typemap pattern matching rules * are implemented... tries to find the most specific typemap that includes a * 'code' attribute. * ----------------------------------------------------------------------------- */ static Hash *typemap_search(const_String_or_char_ptr tmap_method, SwigType *type, const_String_or_char_ptr name, const_String_or_char_ptr qualifiedname, SwigType **matchtype, Node *node) { Hash *result = 0; Hash *tm; Hash *backup = 0; SwigType *primitive = 0; SwigType *ctype = 0; SwigType *ctype_unstripped = 0; int isarray; const String *cname = 0; const String *cqualifiedname = 0; String *tm_method = typemap_method_name(tmap_method); int debug_display = (in_typemap_search_multi == 0) && typemap_search_debug; if ((name) && Len(name)) cname = name; if ((qualifiedname) && Len(qualifiedname)) cqualifiedname = qualifiedname; if (debug_display) { String *typestr = SwigType_str(type, cqualifiedname ? cqualifiedname : cname); Swig_diagnostic(Getfile(node), Getline(node), "Searching for a suitable '%s' typemap for: %s\n", tmap_method, typestr); Delete(typestr); } ctype = Copy(type); ctype_unstripped = Copy(ctype); while (ctype) { /* Try to get an exact type-match */ tm = get_typemap(ctype); result = typemap_search_helper(debug_display, tm, tm_method, ctype, cqualifiedname, cname, &backup); if (result && Getattr(result, "code")) goto ret_result; { /* Look for the type reduced to just the template prefix - for templated types without the template parameter list being specified */ SwigType *template_prefix = SwigType_istemplate_only_templateprefix(ctype); if (template_prefix) { tm = get_typemap(template_prefix); result = typemap_search_helper(debug_display, tm, tm_method, template_prefix, cqualifiedname, cname, &backup); Delete(template_prefix); if (result && Getattr(result, "code")) goto ret_result; } } /* look for [ANY] arrays */ isarray = SwigType_isarray(ctype); if (isarray) { /* If working with arrays, strip away all of the dimensions and replace with "ANY". See if that generates a match */ SwigType *noarrays = strip_arrays(ctype); tm = get_typemap(noarrays); result = typemap_search_helper(debug_display, tm, tm_method, noarrays, cqualifiedname, cname, &backup); Delete(noarrays); if (result && Getattr(result, "code")) goto ret_result; } /* No match so far - try with a qualifier stripped (strip one qualifier at a time until none remain) * The order of stripping in SwigType_strip_single_qualifier is used to provide some sort of consistency * with the default (SWIGTYPE) typemap matching rules for the first qualifier to be stripped. */ { SwigType *oldctype = ctype; ctype = SwigType_strip_single_qualifier(oldctype); if (!Equal(ctype, oldctype)) { Delete(oldctype); continue; } Delete(oldctype); } /* Once all qualifiers are stripped try resolve a typedef */ { SwigType *oldctype = ctype; ctype = SwigType_typedef_resolve(ctype_unstripped); Delete(oldctype); ctype_unstripped = Copy(ctype); } } /* Hmmm. Well, no match seems to be found at all. See if there is some kind of default (SWIGTYPE) mapping */ primitive = SwigType_default_create(type); while (primitive) { tm = get_typemap(primitive); result = typemap_search_helper(debug_display, tm, tm_method, primitive, cqualifiedname, cname, &backup); if (result && Getattr(result, "code")) goto ret_result; { SwigType *nprim = SwigType_default_deduce(primitive); Delete(primitive); primitive = nprim; } } if (ctype != type) { Delete(ctype); ctype = 0; } result = backup; ret_result: Delete(primitive); if (matchtype) *matchtype = Copy(ctype); Delete(ctype); Delete(ctype_unstripped); return result; } /* ----------------------------------------------------------------------------- * typemap_search_multi() * * Search for a multi-argument typemap. * ----------------------------------------------------------------------------- */ static Hash *typemap_search_multi(const_String_or_char_ptr tmap_method, ParmList *parms, int *nmatch) { SwigType *type; SwigType *mtype = 0; String *name; String *multi_tmap_method; Hash *tm; Hash *tm1 = 0; if (!parms) { *nmatch = 0; return 0; } type = Getattr(parms, "type"); name = Getattr(parms, "name"); /* Try to find a match on the first type */ tm = typemap_search(tmap_method, type, name, 0, &mtype, parms); if (tm) { if (mtype && SwigType_isarray(mtype)) { Setattr(parms, "tmap:match", mtype); } Delete(mtype); multi_tmap_method = NewStringf("%s-%s+%s:", tmap_method, type, name); in_typemap_search_multi++; tm1 = typemap_search_multi(multi_tmap_method, nextSibling(parms), nmatch); in_typemap_search_multi--; if (tm1) tm = tm1; if (Getattr(tm, "code")) { *(nmatch) = *nmatch + 1; if (typemap_search_debug && tm1 && (in_typemap_search_multi == 0)) { Printf(stdout, " Multi-argument typemap found...\n"); } } else { tm = 0; } Delete(multi_tmap_method); } if (typemap_search_debug && (in_typemap_search_multi == 0)) debug_search_result_display(tm); if (typemaps_used_debug && (in_typemap_search_multi == 0) && tm) { String *typestr = SwigType_str(type, name); Swig_diagnostic(Getfile(parms), Getline(parms), "Typemap for %s (%s) : %%%s\n", typestr, tmap_method, Getattr(tm, "source")); assert(Getfile(parms) && Len(Getfile(parms)) > 0); /* Missing file and line numbering information */ Delete(typestr); } return tm; } /* ----------------------------------------------------------------------------- * typemap_replace_vars() * * Replaces typemap variables on a string. index is the $n variable. * type and pname are the type and parameter name. * ----------------------------------------------------------------------------- */ static void replace_local_types(ParmList *p, const String *name, const String *rep) { SwigType *t; while (p) { t = Getattr(p, "type"); Replace(t, name, rep, DOH_REPLACE_ANY); p = nextSibling(p); } } static int check_locals(ParmList *p, const char *s) { while (p) { char *c = GetChar(p, "type"); if (strstr(c, s)) return 1; p = nextSibling(p); } return 0; } static int typemap_replace_vars(String *s, ParmList *locals, SwigType *type, SwigType *rtype, String *pname, String *lname, int index) { char var[512]; char *varname; SwigType *ftype; int bare_substitution_count = 0; Replaceall(s, "$typemap", "$TYPEMAP"); /* workaround for $type substitution below */ ftype = SwigType_typedef_resolve_all(type); if (!pname) pname = lname; { Parm *p; int rep = 0; p = locals; while (p) { if (Strchr(Getattr(p, "type"), '$')) rep = 1; p = nextSibling(p); } if (!rep) locals = 0; } sprintf(var, "$%d_", index); varname = &var[strlen(var)]; /* If the original datatype was an array. We're going to go through and substitute its array dimensions */ if (SwigType_isarray(type) || SwigType_isarray(ftype)) { String *size; int ndim; int i; if (SwigType_array_ndim(type) != SwigType_array_ndim(ftype)) type = ftype; ndim = SwigType_array_ndim(type); size = NewStringEmpty(); for (i = 0; i < ndim; i++) { String *dim = SwigType_array_getdim(type, i); if (index == 1) { char t[32]; sprintf(t, "$dim%d", i); Replace(s, t, dim, DOH_REPLACE_ANY); replace_local_types(locals, t, dim); } sprintf(varname, "dim%d", i); Replace(s, var, dim, DOH_REPLACE_ANY); replace_local_types(locals, var, dim); if (Len(size)) Putc('*', size); Append(size, dim); Delete(dim); } sprintf(varname, "size"); Replace(s, var, size, DOH_REPLACE_ANY); replace_local_types(locals, var, size); Delete(size); } /* Parameter name substitution */ if (index == 1) { Replace(s, "$parmname", pname, DOH_REPLACE_ANY); } strcpy(varname, "name"); Replace(s, var, pname, DOH_REPLACE_ANY); /* Type-related stuff */ { SwigType *star_type, *amp_type, *base_type, *lex_type; SwigType *ltype, *star_ltype, *amp_ltype; String *mangle, *star_mangle, *amp_mangle, *base_mangle, *base_name, *base_type_str; String *descriptor, *star_descriptor, *amp_descriptor; String *ts; char *sc; sc = Char(s); if (strstr(sc, "type") || check_locals(locals, "type")) { /* Given type : $type */ ts = SwigType_str(type, 0); if (index == 1) { Replace(s, "$type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$type", type); } strcpy(varname, "type"); Replace(s, var, ts, DOH_REPLACE_ANY); replace_local_types(locals, var, type); Delete(ts); sc = Char(s); } if (strstr(sc, "ltype") || check_locals(locals, "ltype")) { /* Local type: $ltype */ ltype = SwigType_ltype(type); ts = SwigType_str(ltype, 0); if (index == 1) { Replace(s, "$ltype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$ltype", ltype); } strcpy(varname, "ltype"); Replace(s, var, ts, DOH_REPLACE_ANY); replace_local_types(locals, var, ltype); Delete(ts); Delete(ltype); sc = Char(s); } if (strstr(sc, "mangle") || strstr(sc, "descriptor")) { /* Mangled type */ mangle = SwigType_manglestr(type); if (index == 1) Replace(s, "$mangle", mangle, DOH_REPLACE_ANY); strcpy(varname, "mangle"); Replace(s, var, mangle, DOH_REPLACE_ANY); descriptor = NewStringf("SWIGTYPE%s", mangle); if (index == 1) if (Replace(s, "$descriptor", descriptor, DOH_REPLACE_ANY)) SwigType_remember(type); strcpy(varname, "descriptor"); if (Replace(s, var, descriptor, DOH_REPLACE_ANY)) SwigType_remember(type); Delete(descriptor); Delete(mangle); } /* One pointer level removed */ /* This creates variables of the form $*n_type $*n_ltype */ if (SwigType_ispointer(ftype) || (SwigType_isarray(ftype)) || (SwigType_isreference(ftype)) || (SwigType_isrvalue_reference(ftype))) { if (!(SwigType_isarray(type) || SwigType_ispointer(type) || SwigType_isreference(type) || SwigType_isrvalue_reference(type))) { star_type = Copy(ftype); } else { star_type = Copy(type); } if (!(SwigType_isreference(star_type) || SwigType_isrvalue_reference(star_type))) { if (SwigType_isarray(star_type)) { SwigType_del_element(star_type); } else { SwigType_del_pointer(star_type); } ts = SwigType_str(star_type, 0); if (index == 1) { Replace(s, "$*type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$*type", star_type); } sprintf(varname, "$*%d_type", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, star_type); Delete(ts); } else { SwigType_del_element(star_type); } star_ltype = SwigType_ltype(star_type); ts = SwigType_str(star_ltype, 0); if (index == 1) { Replace(s, "$*ltype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$*ltype", star_ltype); } sprintf(varname, "$*%d_ltype", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, star_ltype); Delete(ts); Delete(star_ltype); star_mangle = SwigType_manglestr(star_type); if (index == 1) Replace(s, "$*mangle", star_mangle, DOH_REPLACE_ANY); sprintf(varname, "$*%d_mangle", index); Replace(s, varname, star_mangle, DOH_REPLACE_ANY); star_descriptor = NewStringf("SWIGTYPE%s", star_mangle); if (index == 1) if (Replace(s, "$*descriptor", star_descriptor, DOH_REPLACE_ANY)) SwigType_remember(star_type); sprintf(varname, "$*%d_descriptor", index); if (Replace(s, varname, star_descriptor, DOH_REPLACE_ANY)) SwigType_remember(star_type); Delete(star_descriptor); Delete(star_mangle); Delete(star_type); } else { /* TODO: Signal error if one of the $* substitutions is requested */ } /* One pointer level added */ amp_type = Copy(type); SwigType_add_pointer(amp_type); ts = SwigType_str(amp_type, 0); if (index == 1) { Replace(s, "$&type", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$&type", amp_type); } sprintf(varname, "$&%d_type", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, amp_type); Delete(ts); amp_ltype = SwigType_ltype(type); SwigType_add_pointer(amp_ltype); ts = SwigType_str(amp_ltype, 0); if (index == 1) { Replace(s, "$<ype", ts, DOH_REPLACE_ANY); replace_local_types(locals, "$<ype", amp_ltype); } sprintf(varname, "$&%d_ltype", index); Replace(s, varname, ts, DOH_REPLACE_ANY); replace_local_types(locals, varname, amp_ltype); Delete(ts); Delete(amp_ltype); amp_mangle = SwigType_manglestr(amp_type); if (index == 1) Replace(s, "$&mangle", amp_mangle, DOH_REPLACE_ANY); sprintf(varname, "$&%d_mangle", index); Replace(s, varname, amp_mangle, DOH_REPLACE_ANY); amp_descriptor = NewStringf("SWIGTYPE%s", amp_mangle); if (index == 1) if (Replace(s, "$&descriptor", amp_descriptor, DOH_REPLACE_ANY)) SwigType_remember(amp_type); sprintf(varname, "$&%d_descriptor", index); if (Replace(s, varname, amp_descriptor, DOH_REPLACE_ANY)) SwigType_remember(amp_type); Delete(amp_descriptor); Delete(amp_mangle); Delete(amp_type); /* Base type */ if (SwigType_isarray(type)) { base_type = Copy(type); Delete(SwigType_pop_arrays(base_type)); } else { base_type = SwigType_base(type); } base_type_str = SwigType_str(base_type, 0); base_name = SwigType_namestr(base_type_str); if (index == 1) { Replace(s, "$basetype", base_name, DOH_REPLACE_ANY); replace_local_types(locals, "$basetype", base_name); } strcpy(varname, "basetype"); Replace(s, var, base_type_str, DOH_REPLACE_ANY); replace_local_types(locals, var, base_name); base_mangle = SwigType_manglestr(base_type); if (index == 1) Replace(s, "$basemangle", base_mangle, DOH_REPLACE_ANY); strcpy(varname, "basemangle"); Replace(s, var, base_mangle, DOH_REPLACE_ANY); Delete(base_mangle); Delete(base_name); Delete(base_type_str); Delete(base_type); lex_type = SwigType_base(rtype); if (index == 1) Replace(s, "$lextype", lex_type, DOH_REPLACE_ANY); strcpy(varname, "lextype"); Replace(s, var, lex_type, DOH_REPLACE_ANY); Delete(lex_type); } /* Replace any $n. with (&n)-> */ { char temp[64]; sprintf(var, "$%d.", index); sprintf(temp, "(&$%d)->", index); Replace(s, var, temp, DOH_REPLACE_ANY); } /* Replace the bare $n variable */ sprintf(var, "$%d", index); bare_substitution_count = Replace(s, var, lname, DOH_REPLACE_NUMBER_END); Delete(ftype); return bare_substitution_count; } /* ------------------------------------------------------------------------ * static typemap_locals() * * Takes a string, a parameter list and a wrapper function argument and * creates the local variables. * ------------------------------------------------------------------------ */ static void typemap_locals(String *s, ParmList *l, Wrapper *f, int argnum) { Parm *p; char *new_name; p = l; while (p) { SwigType *pt = Getattr(p, "type"); SwigType *at = SwigType_alttype(pt, 1); String *pn = Getattr(p, "name"); String *value = Getattr(p, "value"); if (at) pt = at; if (pn) { if (Len(pn) > 0) { String *str; int isglobal = 0; str = NewStringEmpty(); if (strncmp(Char(pn), "_global_", 8) == 0) { isglobal = 1; } /* If the user gave us $type as the name of the local variable, we'll use the passed datatype instead */ if ((argnum >= 0) && (!isglobal)) { Printf(str, "%s%d", pn, argnum); } else { Append(str, pn); } if (isglobal && Wrapper_check_local(f, str)) { p = nextSibling(p); Delete(str); if (at) Delete(at); continue; } if (value) { String *pstr = SwigType_str(pt, str); new_name = Wrapper_new_localv(f, str, pstr, "=", value, NIL); Delete(pstr); } else { String *pstr = SwigType_str(pt, str); new_name = Wrapper_new_localv(f, str, pstr, NIL); Delete(pstr); } if (!isglobal) { /* Substitute */ Replace(s, pn, new_name, DOH_REPLACE_ID | DOH_REPLACE_NOQUOTE); } Delete(str); } } p = nextSibling(p); if (at) Delete(at); } } /* ----------------------------------------------------------------------------- * typemap_warn() * * If any warning message is attached to this parameter's "tmap::warning" * attribute, return the warning message (special variables will need expanding * before displaying the warning). * ----------------------------------------------------------------------------- */ static String *typemap_warn(const_String_or_char_ptr tmap_method, Parm *p) { String *temp = NewStringf("%s:warning", tmap_method); String *w = Getattr(p, typemap_method_name(temp)); Delete(temp); return w ? Copy(w) : 0; } /* ----------------------------------------------------------------------------- * Swig_typemap_lookup() * * Attach one or more typemaps to a node and optionally generate the typemap contents * into the wrapper. * * Looks for a typemap matching the given type and name and attaches the typemap code * and any typemap attributes to the provided node. * * The node should contain the "type" and "name" attributes for the typemap match on. * input. The typemap code and typemap attribute values are attached onto the node * prefixed with "tmap:". For example with tmap_method="in", the typemap code can be retrieved * with a call to Getattr(node, "tmap:in") (this is also the string returned) and the * "noblock" attribute can be retrieved with a call to Getattr(node, "tmap:in:noblock"). * * tmap_method - typemap method, eg "in", "out", "newfree" * node - the node to attach the typemap and typemap attributes to * lname - name of variable to substitute $1, $2 etc for * f - wrapper code to generate into if non null * actioncode - code to generate into f before the out typemap code, unless * the optimal attribute is set in the out typemap in which case * $1 in the out typemap will be replaced by the code in actioncode. * ----------------------------------------------------------------------------- */ static String *Swig_typemap_lookup_impl(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f, String *actioncode) { SwigType *type; SwigType *mtype = 0; String *pname; String *qpname = 0; String *noscope_pname = 0; Hash *tm = 0; String *s = 0; String *sdef = 0; String *warning = 0; ParmList *locals; ParmList *kw; char temp[256]; String *symname; String *cname = 0; String *clname = 0; char *cmethod = Char(tmap_method); int optimal_attribute = 0; int optimal_substitution = 0; int delete_optimal_attribute = 0; int num_substitutions = 0; SwigType *matchtype = 0; type = Getattr(node, "type"); if (!type) return sdef; /* Special hook (hack!). Check for the 'ref' feature and add code it contains to any 'newfree' typemap code. * We could choose to put this hook into a number of different typemaps, not necessarily 'newfree'... * Rather confusingly 'newfree' is used to release memory and the 'ref' feature is used to add in memory references - yuck! */ if (Cmp(tmap_method, "newfree") == 0) { String *base = SwigType_base(type); Node *typenode = Swig_symbol_clookup(base, 0); if (typenode) sdef = Swig_ref_call(typenode, lname); Delete(base); } pname = Getattr(node, "name"); noscope_pname = Copy(pname); if (pname && Getattr(node, "sym:symtab")) { /* Add on a qualified name search for any symbol in the symbol table, for example: * struct Foo { * int *foo(int bar) -> Foo::foo * }; * Note that if node is a parameter (Parm *) then there will be no symbol table attached to the Parm *. */ String *qsn; if (Swig_scopename_check(pname)) { /* sometimes pname is qualified, so we remove all the scope for the lookup */ Delete(noscope_pname); noscope_pname = Swig_scopename_last(pname); /* Printf(stdout, "Removed scope: %s => %s\n", pname, noscope_pname); */ } qsn = Swig_symbol_qualified(node); if (qsn && Len(qsn)) { qpname = NewStringf("%s::%s", qsn, noscope_pname); Delete(qsn); } } tm = typemap_search(tmap_method, type, noscope_pname, qpname, &mtype, node); if (typemap_search_debug) debug_search_result_display(tm); if (typemaps_used_debug && tm) { String *typestr = SwigType_str(type, qpname ? qpname : pname); Swig_diagnostic(Getfile(node), Getline(node), "Typemap for %s (%s) : %%%s\n", typestr, tmap_method, Getattr(tm, "source")); assert(Getfile(node) && Len(Getfile(node)) > 0); /* Missing file and line numbering information */ Delete(typestr); } Delete(qpname); qpname = 0; Delete(noscope_pname); noscope_pname = 0; if (!tm) return sdef; s = Getattr(tm, "code"); if (!s) return sdef; /* Empty typemap. No match */ if (Cmp(s, "pass") == 0) return sdef; s = Copy(s); /* Make a local copy of the typemap code */ /* Look in the "out" typemap for the "optimal" attribute */ if (Cmp(cmethod, "out") == 0) { kw = Getattr(tm, "kwargs"); while (kw) { if (Cmp(Getattr(kw, "name"), "optimal") == 0) { optimal_attribute = GetFlag(kw, "value"); break; } kw = nextSibling(kw); } } if (optimal_attribute) { /* Note: "out" typemap is the only typemap that will have the "optimal" attribute set. * If f and actioncode are NULL, then the caller is just looking to attach the "out" attributes * ie, not use the typemap code, otherwise both f and actioncode must be non null. */ if (actioncode) { const String *result_equals = NewStringf("%s = ", Swig_cresult_name()); clname = Copy(actioncode); /* check that the code in the typemap can be used in this optimal way. * The code should be in the form "result = ...;\n". We need to extract * the "..." part. This may not be possible for various reasons, eg * code added by %exception. This optimal code generation is bit of a * hack and circumvents the normal requirement for a temporary variable * to hold the result returned from a wrapped function call. */ if (Strncmp(clname, result_equals, 9) == 0) { int numreplacements = Replace(clname, result_equals, "", DOH_REPLACE_ID_BEGIN); if (numreplacements == 1) { numreplacements = Replace(clname, ";\n", "", DOH_REPLACE_ID_END); if (numreplacements == 1) { if (Strchr(clname, ';') == 0) { lname = clname; actioncode = 0; optimal_substitution = 1; } } } } if (!optimal_substitution) { Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_IGNORED, Getfile(node), Getline(node), "Method %s usage of the optimal attribute ignored\n", Swig_name_decl(node)); Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_IGNORED, Getfile(s), Getline(s), "in the out typemap as the following cannot be used to generate optimal code: %s\n", clname); delete_optimal_attribute = 1; } } else { assert(!f); } } if (actioncode) { assert(f); Append(f->code, actioncode); } /* emit local variables declared in typemap, eg emit declarations for aa and bb in: * %typemap(in) foo (int aa, int bb) "..." */ locals = Getattr(tm, "locals"); if (locals) locals = CopyParmList(locals); if (pname) { if (SwigType_istemplate(pname)) { cname = SwigType_namestr(pname); pname = cname; } } if (SwigType_istemplate((char *) lname)) { clname = SwigType_namestr((char *) lname); lname = clname; } matchtype = mtype && SwigType_isarray(mtype) ? mtype : type; num_substitutions = typemap_replace_vars(s, locals, matchtype, type, pname, (char *) lname, 1); if (optimal_substitution && num_substitutions > 1) { Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE, Getfile(node), Getline(node), "Multiple calls to %s might be generated due to\n", Swig_name_decl(node)); Swig_warning(WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE, Getfile(s), Getline(s), "optimal attribute usage in the out typemap.\n"); } if (locals && f) { typemap_locals(s, locals, f, -1); } { ParmList *parm_sublist = NewParmWithoutFileLineInfo(type, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(s, parm_sublist, f, tm); Delete(parm_sublist); } /* Attach kwargs - ie the typemap attributes */ kw = Getattr(tm, "kwargs"); while (kw) { String *value = Copy(Getattr(kw, "value")); String *kwtype = Getattr(kw, "type"); char *ckwname = Char(Getattr(kw, "name")); { /* Expand special variables in typemap attributes. */ SwigType *ptype = Getattr(node, "type"); String *pname = Getattr(node, "name"); SwigType *mtype = Getattr(node, "tmap:match"); SwigType *matchtype = mtype ? mtype : ptype; ParmList *parm_sublist; typemap_replace_vars(value, NULL, matchtype, ptype, pname, (char *)lname, 1); /* Expand special variable macros (embedded typemaps) in typemap attributes. */ parm_sublist = NewParmWithoutFileLineInfo(ptype, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(value, parm_sublist, NULL, tm); Delete(parm_sublist); } if (kwtype) { String *mangle = Swig_string_mangle(kwtype); Append(value, mangle); Delete(mangle); } sprintf(temp, "%s:%s", cmethod, ckwname); Setattr(node, typemap_method_name(temp), value); Delete(value); kw = nextSibling(kw); } if (delete_optimal_attribute) Delattr(node, "tmap:out:optimal"); Replace(s, "$name", pname, DOH_REPLACE_ANY); symname = Getattr(node, "sym:name"); if (symname) Replace(s, "$symname", symname, DOH_REPLACE_ANY); Setattr(node, typemap_method_name(tmap_method), s); if (locals) { sprintf(temp, "%s:locals", cmethod); Setattr(node, typemap_method_name(temp), locals); Delete(locals); } if (Checkattr(tm, "type", "SWIGTYPE")) { sprintf(temp, "%s:SWIGTYPE", cmethod); Setattr(node, typemap_method_name(temp), "1"); } /* Print warnings, if any */ warning = typemap_warn(cmethod, node); if (warning) { typemap_replace_vars(warning, 0, matchtype, type, pname, (char *) lname, 1); Replace(warning, "$name", pname, DOH_REPLACE_ANY); if (symname) Replace(warning, "$symname", symname, DOH_REPLACE_ANY); Swig_warning(0, Getfile(node), Getline(node), "%s\n", warning); Delete(warning); } /* Look for code fragments */ { String *fragment; sprintf(temp, "%s:fragment", cmethod); fragment = Getattr(node, typemap_method_name(temp)); if (fragment) { String *fname = Copy(fragment); Setfile(fname, Getfile(node)); Setline(fname, Getline(node)); Swig_fragment_emit(fname); Delete(fname); } } Delete(cname); Delete(clname); Delete(mtype); if (sdef) { /* put 'ref' and 'newfree' codes together */ String *p = NewStringf("%s\n%s", sdef, s); Delete(s); Delete(sdef); s = p; } Delete(actioncode); return s; } String *Swig_typemap_lookup_out(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f, String *actioncode) { assert(actioncode); assert(Cmp(tmap_method, "out") == 0); return Swig_typemap_lookup_impl(tmap_method, node, lname, f, actioncode); } String *Swig_typemap_lookup(const_String_or_char_ptr tmap_method, Node *node, const_String_or_char_ptr lname, Wrapper *f) { return Swig_typemap_lookup_impl(tmap_method, node, lname, f, 0); } /* ----------------------------------------------------------------------------- * typemap_attach_kwargs() * * If this hash (tm) contains a linked list of parameters under its "kwargs" * attribute, add keys for each of those named keyword arguments to this * parameter for later use. * For example, attach the typemap attributes to firstp (first parameter in parameter list): * %typemap(in, foo="xyz") ... * A new attribute called "tmap:in:foo" with value "xyz" is attached to firstp. * Also expands special variables and special variable macros in the typemap attributes. * ----------------------------------------------------------------------------- */ static void typemap_attach_kwargs(Hash *tm, const_String_or_char_ptr tmap_method, Parm *firstp, int nmatch) { String *temp = NewStringEmpty(); Parm *kw = Getattr(tm, "kwargs"); while (kw) { String *value = Copy(Getattr(kw, "value")); String *type = Getattr(kw, "type"); int i; Parm *p = firstp; /* Expand special variables */ for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); SwigType *mtype = Getattr(p, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(value, NULL, matchtype, type, pname, lname, i + 1); p = nextSibling(p); } /* Expand special variable macros (embedded typemaps). * Special variable are expanded first above as they might be used in the special variable macros. * For example: $typemap(imtype, $2_type). */ p = firstp; for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); ParmList *parm_sublist = NewParmWithoutFileLineInfo(type, pname); Setattr(parm_sublist, "lname", lname); replace_embedded_typemap(value, parm_sublist, NULL, tm); p = nextSibling(p); } if (type) { Hash *v = NewHash(); Setattr(v, "type", type); Setattr(v, "value", value); Delete(value); value = v; } Clear(temp); Printf(temp, "%s:%s", tmap_method, Getattr(kw, "name")); Setattr(firstp, typemap_method_name(temp), value); Delete(value); kw = nextSibling(kw); } Clear(temp); Printf(temp, "%s:match_type", tmap_method); Setattr(firstp, typemap_method_name(temp), Getattr(tm, "type")); Delete(temp); } static void typemap_emit_code_fragments(const_String_or_char_ptr tmap_method, Parm *p) { String *temp = NewStringf("%s:fragment", tmap_method); String *f = Getattr(p, typemap_method_name(temp)); if (f) { String *fname = Copy(f); Setfile(fname, Getfile(p)); Setline(fname, Getline(p)); Swig_fragment_emit(fname); Delete(fname); } Delete(temp); } static String *typemap_get_option(Hash *tm, const_String_or_char_ptr name) { Parm *kw = Getattr(tm, "kwargs"); while (kw) { String *kname = Getattr(kw, "name"); if (Equal(kname, name)) { return Getattr(kw, "value"); } kw = nextSibling(kw); } return 0; } /* ----------------------------------------------------------------------------- * Swig_typemap_attach_parms() * * Given a parameter list, this function attaches all of the typemaps and typemap * attributes to the parameter for each type in the parameter list. * * This function basically provides the typemap code and typemap attribute values as * attributes on each parameter prefixed with "tmap:". For example with tmap_method="in", the typemap * code can be retrieved for the first parameter with a call to Getattr(parm, "tmap:in") * and the "numinputs" attribute can be retrieved with a call to Getattr(parm, "tmap:in:numinputs"). * * tmap_method - typemap method, eg "in", "out", "newfree" * parms - parameter list to attach each typemap and all typemap attributes * f - wrapper code to generate into if non null * ----------------------------------------------------------------------------- */ void Swig_typemap_attach_parms(const_String_or_char_ptr tmap_method, ParmList *parms, Wrapper *f) { Parm *p, *firstp; Hash *tm; int nmatch = 0; int i; String *s; String *warning = 0; ParmList *locals; int argnum = 0; char temp[256]; char *cmethod = Char(tmap_method); String *kwmatch = 0; p = parms; #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: %s\n", tmap_method); #endif while (p) { argnum++; nmatch = 0; #ifdef SWIG_DEBUG Printf(stdout, "parms: %s %s %s\n", tmap_method, Getattr(p, "name"), Getattr(p, "type")); #endif tm = typemap_search_multi(tmap_method, p, &nmatch); #ifdef SWIG_DEBUG if (tm) Printf(stdout, "found: %s\n", tm); #endif if (!tm) { p = nextSibling(p); continue; } /* Check if the typemap requires to match the type of another typemap, for example: %typemap(in) SWIGTYPE * (int var) {...} %typemap(freearg,match="in") SWIGTYPE * {if (var$argnum) ...} here, the freearg typemap requires the "in" typemap to match, or the 'var$argnum' variable will not exist. */ kwmatch = typemap_get_option(tm, "match"); if (kwmatch) { String *tmname = NewStringf("tmap:%s", kwmatch); String *tmin = Getattr(p, tmname); Delete(tmname); #ifdef SWIG_DEBUG if (tm) Printf(stdout, "matching: %s\n", kwmatch); #endif if (tmin) { String *tmninp = NewStringf("tmap:%s:numinputs", kwmatch); String *ninp = Getattr(p, tmninp); Delete(tmninp); if (ninp && Equal(ninp, "0")) { p = nextSibling(p); continue; } else { SwigType *typetm = Getattr(tm, "type"); String *temp = NewStringf("tmap:%s:match_type", kwmatch); SwigType *typein = Getattr(p, temp); Delete(temp); if (!Equal(typein, typetm)) { p = nextSibling(p); continue; } else { int nnmatch; Hash *tmapin = typemap_search_multi(kwmatch, p, &nnmatch); String *tmname = Getattr(tm, "pname"); String *tnname = Getattr(tmapin, "pname"); if (!(tmname && tnname && Equal(tmname, tnname)) && !(!tmname && !tnname)) { p = nextSibling(p); continue; } } } } else { p = nextSibling(p); continue; } } s = Getattr(tm, "code"); if (!s) { p = nextSibling(p); continue; } #ifdef SWIG_DEBUG if (s) Printf(stdout, "code: %s\n", s); #endif /* Empty typemap. No match */ if (Cmp(s, "pass") == 0) { p = nextSibling(p); continue; } s = Copy(s); locals = Getattr(tm, "locals"); if (locals) locals = CopyParmList(locals); firstp = p; #ifdef SWIG_DEBUG Printf(stdout, "nmatch: %d\n", nmatch); #endif for (i = 0; i < nmatch; i++) { SwigType *type = Getattr(p, "type"); String *pname = Getattr(p, "name"); String *lname = Getattr(p, "lname"); SwigType *mtype = Getattr(p, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(s, locals, matchtype, type, pname, lname, i + 1); if (mtype) Delattr(p, "tmap:match"); if (Checkattr(tm, "type", "SWIGTYPE")) { sprintf(temp, "%s:SWIGTYPE", cmethod); Setattr(p, typemap_method_name(temp), "1"); } p = nextSibling(p); } if (locals && f) { typemap_locals(s, locals, f, argnum); } replace_embedded_typemap(s, firstp, f, tm); /* Attach attributes to object */ #ifdef SWIG_DEBUG Printf(stdout, "attach: %s %s %s\n", Getattr(firstp, "name"), typemap_method_name(tmap_method), s); #endif Setattr(firstp, typemap_method_name(tmap_method), s); /* Code object */ if (locals) { sprintf(temp, "%s:locals", cmethod); Setattr(firstp, typemap_method_name(temp), locals); Delete(locals); } /* Attach a link to the next parameter. Needed for multimaps */ sprintf(temp, "%s:next", cmethod); Setattr(firstp, typemap_method_name(temp), p); /* Attach kwargs */ typemap_attach_kwargs(tm, tmap_method, firstp, nmatch); /* Replace the argument number */ sprintf(temp, "%d", argnum); Replace(s, "$argnum", temp, DOH_REPLACE_ANY); /* Print warnings, if any */ warning = typemap_warn(tmap_method, firstp); if (warning) { SwigType *type = Getattr(firstp, "type"); String *pname = Getattr(firstp, "name"); String *lname = Getattr(firstp, "lname"); SwigType *mtype = Getattr(firstp, "tmap:match"); SwigType *matchtype = mtype ? mtype : type; typemap_replace_vars(warning, 0, matchtype, type, pname, lname, 1); Replace(warning, "$argnum", temp, DOH_REPLACE_ANY); Swig_warning(0, Getfile(firstp), Getline(firstp), "%s\n", warning); Delete(warning); } /* Look for code fragments */ typemap_emit_code_fragments(tmap_method, firstp); /* increase argnum to consider numinputs */ argnum += nmatch - 1; Delete(s); #ifdef SWIG_DEBUG Printf(stdout, "res: %s %s %s\n", Getattr(firstp, "name"), typemap_method_name(tmap_method), Getattr(firstp, typemap_method_name(tmap_method))); #endif } #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: end\n"); #endif } /* Splits the arguments of an embedded typemap */ static List *split_embedded_typemap(String *s) { List *args = 0; char *c, *start; int level = 0; int angle_level = 0; int leading = 1; args = NewList(); c = strchr(Char(s), '('); assert(c); c++; start = c; while (*c) { if (*c == '\"') { c++; while (*c) { if (*c == '\\') { c++; } else { if (*c == '\"') break; } c++; } } if ((level == 0) && angle_level == 0 && ((*c == ',') || (*c == ')'))) { String *tmp = NewStringWithSize(start, (int)(c - start)); Append(args, tmp); Delete(tmp); start = c + 1; leading = 1; if (*c == ')') break; c++; continue; } if (*c == '(') level++; if (*c == ')') level--; if (*c == '<') angle_level++; if (*c == '>') angle_level--; if (isspace((int) *c) && leading) start++; if (!isspace((int) *c)) leading = 0; c++; } return args; } /* ----------------------------------------------------------------------------- * Swig_typemap_replace_embedded_typemap() * * For special variable macro $typemap(...) expansion outside of typemaps. * Only limited usage works as most typemap special variables ($1, $input etc) * are not expanded correctly outside of typemaps. * ----------------------------------------------------------------------------- */ void Swig_typemap_replace_embedded_typemap(String *s, Node *file_line_node) { Setfile(s, Getfile(file_line_node)); Setline(s, Getline(file_line_node)); Replaceall(s, "$typemap", "$TYPEMAP"); replace_embedded_typemap(s, 0, 0, file_line_node); } /* ----------------------------------------------------------------------------- * replace_embedded_typemap() * * This function replaces the special variable macro $typemap(...) with typemap * code. The general form of $typemap is as follows: * * $typemap(method, typelist, var1=value, var2=value, ...) * * where varx parameters are optional and undocumented; they were used in an earlier version of $typemap. * A search is made using the typemap matching rules of form: * * %typemap(method) typelist {...} * * and if found will substitute in the typemap contents, making appropriate variable replacements. * * For example: * $typemap(in, int) # simple usage matching %typemap(in) int { ... } * $typemap(in, int b) # simple usage matching %typemap(in) int b { ... } or above %typemap * $typemap(in, (Foo a, int b)) # multi-argument typemap matching %typemap(in) (Foo a, int b) {...} * ----------------------------------------------------------------------------- */ static void replace_embedded_typemap(String *s, ParmList *parm_sublist, Wrapper *f, Node *file_line_node) { char *start = 0; while ((start = strstr(Char(s), "$TYPEMAP("))) { /* note $typemap capitalisation to $TYPEMAP hack */ /* Gather the parameters */ char *end = 0, *c; int level = 0; String *dollar_typemap; int syntax_error = 1; c = start; while (*c) { if (*c == '(') level++; if (*c == ')') { level--; if (level == 0) { end = c + 1; break; } } c++; } if (end) { dollar_typemap = NewStringWithSize(start, (int)((end - start))); syntax_error = 0; } else { dollar_typemap = NewStringWithSize(start, (int)((c - start))); } if (!syntax_error) { List *l; String *tmap_method; Hash *vars; syntax_error = 1; /* Split apart each parameter in $typemap(...) */ l = split_embedded_typemap(dollar_typemap); if (Len(l) >= 2) { ParmList *to_match_parms; tmap_method = Getitem(l, 0); /* the second parameter might contain multiple sub-parameters for multi-argument * typemap matching, so split these parameters apart */ to_match_parms = Swig_cparse_parms(Getitem(l, 1), file_line_node); if (to_match_parms) { Parm *p = to_match_parms; Parm *sub_p = parm_sublist; String *empty_string = NewStringEmpty(); String *lname = empty_string; while (p) { if (sub_p) { lname = Getattr(sub_p, "lname"); sub_p = nextSibling(sub_p); } Setattr(p, "lname", lname); p = nextSibling(p); } Delete(empty_string); } /* process optional extra parameters - the variable replacements (undocumented) */ vars = NewHash(); { int i, ilen; ilen = Len(l); for (i = 2; i < ilen; i++) { String *parm = Getitem(l, i); char *eq = strchr(Char(parm), '='); char *c = Char(parm); if (eq && (eq - c > 0)) { String *name = NewStringWithSize(c, (int)(eq - c)); String *value = NewString(eq + 1); Insert(name, 0, "$"); Setattr(vars, name, value); } else { to_match_parms = 0; /* error - variable replacement parameters must be of form varname=value */ } } } /* Perform a typemap search */ if (to_match_parms) { static int already_substituting = 0; String *tm; String *attr; int match = 0; #ifdef SWIG_DEBUG Printf(stdout, "Swig_typemap_attach_parms: embedded\n"); #endif if (already_substituting < 10) { already_substituting++; if ((in_typemap_search_multi == 0) && typemap_search_debug) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Printf(stdout, " Containing: %s\n", dtypemap); Delete(dtypemap); } Swig_typemap_attach_parms(tmap_method, to_match_parms, f); already_substituting--; /* Look for the typemap code */ attr = NewStringf("tmap:%s", tmap_method); tm = Getattr(to_match_parms, attr); if (tm) { Printf(attr, "%s", ":next"); /* fail if multi-argument lookup requested in $typemap(...) and the lookup failed */ if (!Getattr(to_match_parms, attr)) { /* Replace parameter variables */ Iterator ki; for (ki = First(vars); ki.key; ki = Next(ki)) { Replace(tm, ki.key, ki.item, DOH_REPLACE_ANY); } /* offer the target language module the chance to make special variable substitutions */ Language_replace_special_variables(tmap_method, tm, to_match_parms); /* finish up - do the substitution */ Replace(s, dollar_typemap, tm, DOH_REPLACE_ANY); Delete(tm); match = 1; } } if (!match) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "No typemap found for %s\n", dtypemap); Delete(dtypemap); } Delete(attr); } else { /* Simple recursive call check to prevent infinite recursion - this strategy only allows a limited * number of calls by a embedded typemaps to other embedded typemaps though */ String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "Likely recursive $typemap calls containing %s. Use -debug-tmsearch to debug.\n", dtypemap); Delete(dtypemap); } syntax_error = 0; } Delete(vars); } Delete(l); } if (syntax_error) { String *dtypemap = NewString(dollar_typemap); Replaceall(dtypemap, "$TYPEMAP", "$typemap"); Swig_error(Getfile(s), Getline(s), "Syntax error in: %s\n", dtypemap); Delete(dtypemap); } Replace(s, dollar_typemap, "", DOH_REPLACE_ANY); Delete(dollar_typemap); } } /* ----------------------------------------------------------------------------- * Swig_typemap_debug() * * Display all typemaps * ----------------------------------------------------------------------------- */ void Swig_typemap_debug() { int nesting_level = 2; Printf(stdout, "---[ typemaps ]--------------------------------------------------------------\n"); Swig_print(typemaps, nesting_level); Printf(stdout, "-----------------------------------------------------------------------------\n"); } /* ----------------------------------------------------------------------------- * Swig_typemap_search_debug_set() * * Turn on typemap searching debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_search_debug_set(void) { typemap_search_debug = 1; } /* ----------------------------------------------------------------------------- * Swig_typemap_used_debug_set() * * Turn on typemaps used debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_used_debug_set(void) { typemaps_used_debug = 1; } /* ----------------------------------------------------------------------------- * Swig_typemap_register_debug_set() * * Turn on typemaps used debug display * ----------------------------------------------------------------------------- */ void Swig_typemap_register_debug_set(void) { typemap_register_debug = 1; } swig-3.0.12/Source/Swig/include.c0000664000175000017500000002616613042756442016410 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * include.c * * The functions in this file are used to manage files in the SWIG library. * General purpose functions for opening, including, and retrieving pathnames * are provided. * ----------------------------------------------------------------------------- */ #include "swig.h" static List *directories = 0; /* List of include directories */ static String *lastpath = 0; /* Last file that was included */ static List *pdirectories = 0; /* List of pushed directories */ static int dopush = 1; /* Whether to push directories */ static int file_debug = 0; /* This functions determine whether to push/pop dirs in the preprocessor */ void Swig_set_push_dir(int push) { dopush = push; } int Swig_get_push_dir(void) { return dopush; } /* ----------------------------------------------------------------------------- * Swig_add_directory() * * Adds a directory to the SWIG search path. * ----------------------------------------------------------------------------- */ List *Swig_add_directory(const_String_or_char_ptr dirname) { String *adirname; if (!directories) directories = NewList(); assert(directories); if (dirname) { adirname = NewString(dirname); Append(directories,adirname); Delete(adirname); } return directories; } /* ----------------------------------------------------------------------------- * Swig_push_directory() * * Inserts a directory at the front of the SWIG search path. This is used by * the preprocessor to grab files in the same directory as other included files. * ----------------------------------------------------------------------------- */ void Swig_push_directory(const_String_or_char_ptr dirname) { String *pdirname; if (!Swig_get_push_dir()) return; if (!pdirectories) pdirectories = NewList(); assert(pdirectories); pdirname = NewString(dirname); assert(pdirname); Insert(pdirectories,0,pdirname); Delete(pdirname); } /* ----------------------------------------------------------------------------- * Swig_pop_directory() * * Pops a directory off the front of the SWIG search path. This is used by * the preprocessor. * ----------------------------------------------------------------------------- */ void Swig_pop_directory(void) { if (!Swig_get_push_dir()) return; if (!pdirectories) return; Delitem(pdirectories, 0); } /* ----------------------------------------------------------------------------- * Swig_last_file() * * Returns the full pathname of the last file opened. * ----------------------------------------------------------------------------- */ String *Swig_last_file(void) { assert(lastpath); return lastpath; } /* ----------------------------------------------------------------------------- * Swig_search_path_any() * * Returns a list of the current search paths. * ----------------------------------------------------------------------------- */ static List *Swig_search_path_any(int syspath) { String *filename; List *slist; int i, ilen; slist = NewList(); assert(slist); filename = NewStringEmpty(); assert(filename); #ifdef MACSWIG Printf(filename, "%s", SWIG_FILE_DELIMITER); #else Printf(filename, ".%s", SWIG_FILE_DELIMITER); #endif Append(slist, filename); Delete(filename); /* If there are any pushed directories. Add them first */ if (pdirectories) { ilen = Len(pdirectories); for (i = 0; i < ilen; i++) { filename = NewString(Getitem(pdirectories,i)); Append(filename,SWIG_FILE_DELIMITER); Append(slist,filename); Delete(filename); } } /* Add system directories next */ ilen = Len(directories); for (i = 0; i < ilen; i++) { filename = NewString(Getitem(directories,i)); Append(filename,SWIG_FILE_DELIMITER); if (syspath) { /* If doing a system include, put the system directories first */ Insert(slist,i,filename); } else { /* Otherwise, just put the system directories after the pushed directories (if any) */ Append(slist,filename); } Delete(filename); } return slist; } List *Swig_search_path() { return Swig_search_path_any(0); } /* ----------------------------------------------------------------------------- * Swig_open() * * open a file, optionally looking for it in the include path. Returns an open * FILE * on success. * ----------------------------------------------------------------------------- */ static FILE *Swig_open_file(const_String_or_char_ptr name, int sysfile, int use_include_path) { FILE *f; String *filename; List *spath = 0; char *cname; int i, ilen, nbytes; char bom[3]; if (!directories) directories = NewList(); assert(directories); cname = Char(name); filename = NewString(cname); assert(filename); if (file_debug) { Printf(stdout, " Open: %s\n", filename); } f = fopen(Char(filename), "r"); if (!f && use_include_path) { spath = Swig_search_path_any(sysfile); ilen = Len(spath); for (i = 0; i < ilen; i++) { Clear(filename); Printf(filename, "%s%s", Getitem(spath, i), cname); f = fopen(Char(filename), "r"); if (f) break; } Delete(spath); } if (f) { Delete(lastpath); lastpath = filename; /* Skip the UTF-8 BOM if it's present */ nbytes = (int)fread(bom, 1, 3, f); if (nbytes == 3 && bom[0] == (char)0xEF && bom[1] == (char)0xBB && bom[2] == (char)0xBF) { /* skip */ } else { fseek(f, 0, SEEK_SET); } } return f; } /* Open a file - searching the include paths to find it */ FILE *Swig_include_open(const_String_or_char_ptr name) { return Swig_open_file(name, 0, 1); } /* Open a file - does not use include paths to find it */ FILE *Swig_open(const_String_or_char_ptr name) { return Swig_open_file(name, 0, 0); } /* ----------------------------------------------------------------------------- * Swig_read_file() * * Reads data from an open FILE * and returns it as a string. * ----------------------------------------------------------------------------- */ String *Swig_read_file(FILE *f) { int len; char buffer[4096]; String *str = NewStringEmpty(); assert(str); while (fgets(buffer, 4095, f)) { Append(str, buffer); } len = Len(str); /* Add a newline if not present on last line -- the preprocessor seems to * rely on \n and not EOF terminating lines */ if (len) { char *cstr = Char(str); if (cstr[len - 1] != '\n') { Append(str, "\n"); } } return str; } /* ----------------------------------------------------------------------------- * Swig_include() * * Opens a file and returns it as a string. * ----------------------------------------------------------------------------- */ static String *Swig_include_any(const_String_or_char_ptr name, int sysfile) { FILE *f; String *str; String *file; f = Swig_open_file(name, sysfile, 1); if (!f) return 0; str = Swig_read_file(f); fclose(f); Seek(str, 0, SEEK_SET); file = Copy(Swig_last_file()); Setfile(str, file); Delete(file); Setline(str, 1); return str; } String *Swig_include(const_String_or_char_ptr name) { return Swig_include_any(name, 0); } String *Swig_include_sys(const_String_or_char_ptr name) { return Swig_include_any(name, 1); } /* ----------------------------------------------------------------------------- * Swig_insert_file() * * Copies the contents of a file into another file * ----------------------------------------------------------------------------- */ int Swig_insert_file(const_String_or_char_ptr filename, File *outfile) { char buffer[4096]; int nbytes; FILE *f = Swig_include_open(filename); if (!f) return -1; while ((nbytes = Read(f, buffer, 4096)) > 0) { Write(outfile, buffer, nbytes); } fclose(f); return 0; } /* ----------------------------------------------------------------------------- * Swig_register_filebyname() * * Register a "named" file with the core. Named files can become targets * for %insert directives and other SWIG operations. This function takes * the place of the f_header, f_wrapper, f_init, and other global variables * in SWIG1.1 * ----------------------------------------------------------------------------- */ static Hash *named_files = 0; void Swig_register_filebyname(const_String_or_char_ptr filename, File *outfile) { if (!named_files) named_files = NewHash(); Setattr(named_files, filename, outfile); } /* ----------------------------------------------------------------------------- * Swig_filebyname() * * Get a named file * ----------------------------------------------------------------------------- */ File *Swig_filebyname(const_String_or_char_ptr filename) { if (!named_files) return 0; return Getattr(named_files, filename); } /* ----------------------------------------------------------------------------- * Swig_file_extension() * * Returns the extension of a file * ----------------------------------------------------------------------------- */ String *Swig_file_extension(const_String_or_char_ptr filename) { String *name = Swig_file_filename(filename); const char *c = strrchr(Char(name), '.'); String *extension = c ? NewString(c) : NewString(""); Delete(name); return extension; } /* ----------------------------------------------------------------------------- * Swig_file_basename() * * Returns the filename with the extension removed. * ----------------------------------------------------------------------------- */ String *Swig_file_basename(const_String_or_char_ptr filename) { String *extension = Swig_file_extension(filename); String *basename = NewStringWithSize(filename, Len(filename) - Len(extension)); Delete(extension); return basename; } /* ----------------------------------------------------------------------------- * Swig_file_filename() * * Return the file name with any leading path stripped off * ----------------------------------------------------------------------------- */ String *Swig_file_filename(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; const char *c = strrchr(Char(filename), *delim); return c ? NewString(c + 1) : NewString(filename); } /* ----------------------------------------------------------------------------- * Swig_file_dirname() * * Return the name of the directory associated with a file * ----------------------------------------------------------------------------- */ String *Swig_file_dirname(const_String_or_char_ptr filename) { const char *delim = SWIG_FILE_DELIMITER; const char *c = strrchr(Char(filename), *delim); return c ? NewStringWithSize(filename, (int)(c - Char(filename) + 1)) : NewString(""); } /* * Swig_file_debug() */ void Swig_file_debug_set() { file_debug = 1; } swig-3.0.12/Source/Swig/swigtree.h0000664000175000017500000000450213042756442016611 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigtree.h * * These functions are used to access and manipulate the SWIG parse tree. * The structure of this tree is modeled directly after XML-DOM. The attribute * and function names are meant to be similar. * ----------------------------------------------------------------------------- */ /* Macros to traverse the DOM tree */ #define nodeType(x) Getattr(x,"nodeType") #define parentNode(x) Getattr(x,"parentNode") #define previousSibling(x) Getattr(x,"previousSibling") #define nextSibling(x) Getattr(x,"nextSibling") #define firstChild(x) Getattr(x,"firstChild") #define lastChild(x) Getattr(x,"lastChild") /* Macros to set up the DOM tree (mostly used by the parser) */ #define set_nodeType(x,v) Setattr(x,"nodeType",v) #define set_parentNode(x,v) Setattr(x,"parentNode",v) #define set_previousSibling(x,v) Setattr(x,"previousSibling",v) #define set_nextSibling(x,v) Setattr(x,"nextSibling",v) #define set_firstChild(x,v) Setattr(x,"firstChild",v) #define set_lastChild(x,v) Setattr(x,"lastChild",v) /* Utility functions */ extern int checkAttribute(Node *obj, const_String_or_char_ptr name, const_String_or_char_ptr value); extern void appendChild(Node *node, Node *child); extern void prependChild(Node *node, Node *child); extern void removeNode(Node *node); extern Node *copyNode(Node *node); extern void appendSibling(Node *node, Node *child); /* Node restoration/restore functions */ extern void Swig_require(const char *ns, Node *node, ...); extern void Swig_save(const char *ns, Node *node, ...); extern void Swig_restore(Node *node); /* Debugging of parse trees */ extern void Swig_print_tags(File *obj, Node *root); extern void Swig_print_tree(Node *obj); extern void Swig_print_node(Node *obj); swig-3.0.12/Source/Swig/error.c0000664000175000017500000002346713042756442016117 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * error.c * * Error handling functions. These are used to issue warnings and * error messages. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Commentary on the warning filter. * * The warning filter is a string of numbers prefaced by (-) or (+) to * indicate whether or not a warning message is displayed. For example: * * "-304-201-140+210+201" * * The filter string is scanned left to right and the first occurrence * of a warning number is used to determine printing behavior. * * The same number may appear more than once in the string. For example, in the * above string, "201" appears twice. This simply means that warning 201 * was disabled after it was previously enabled. This may only be temporary * setting--the first number may be removed later in which case the warning * is reenabled. * ----------------------------------------------------------------------------- */ #if defined(_WIN32) # define DEFAULT_ERROR_MSG_FORMAT EMF_MICROSOFT #else # define DEFAULT_ERROR_MSG_FORMAT EMF_STANDARD #endif static ErrorMessageFormat msg_format = DEFAULT_ERROR_MSG_FORMAT; static int silence = 0; /* Silent operation */ static String *filter = 0; /* Warning filter */ static int warnall = 0; static int nwarning = 0; static int nerrors = 0; static int init_fmt = 0; static char wrn_wnum_fmt[64]; static char wrn_nnum_fmt[64]; static char err_line_fmt[64]; static char err_eof_fmt[64]; static char diag_line_fmt[64]; static char diag_eof_fmt[64]; static String *format_filename(const_String_or_char_ptr filename); /* ----------------------------------------------------------------------------- * Swig_warning() * * Issue a warning message on stderr. * ----------------------------------------------------------------------------- */ void Swig_warning(int wnum, const_String_or_char_ptr filename, int line, const char *fmt, ...) { String *out; char *msg; int wrn = 1; va_list ap; if (silence) return; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); out = NewStringEmpty(); vPrintf(out, fmt, ap); msg = Char(out); if (isdigit((unsigned char) *msg)) { unsigned long result = strtoul(msg, &msg, 10); if (msg != Char(out)) { msg++; wnum = result; } } /* Check in the warning filter */ if (filter) { char temp[32]; char *c; char *f = Char(filter); sprintf(temp, "%d", wnum); while (*f != '\0' && (c = strstr(f, temp))) { if (*(c - 1) == '-') { wrn = 0; /* Warning disabled */ break; } if (*(c - 1) == '+') { wrn = 1; /* Warning enabled */ break; } f += strlen(temp); } } if (warnall || wrn) { String *formatted_filename = format_filename(filename); if (wnum) { Printf(stderr, wrn_wnum_fmt, formatted_filename, line, wnum); } else { Printf(stderr, wrn_nnum_fmt, formatted_filename, line); } Printf(stderr, "%s", msg); nwarning++; Delete(formatted_filename); } Delete(out); va_end(ap); } /* ----------------------------------------------------------------------------- * Swig_error() * * Issue an error message on stderr. * ----------------------------------------------------------------------------- */ void Swig_error(const_String_or_char_ptr filename, int line, const char *fmt, ...) { va_list ap; String *formatted_filename = NULL; if (silence) return; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); formatted_filename = format_filename(filename); if (line > 0) { Printf(stderr, err_line_fmt, formatted_filename, line); } else { Printf(stderr, err_eof_fmt, formatted_filename); } vPrintf(stderr, fmt, ap); va_end(ap); nerrors++; Delete(formatted_filename); } /* ----------------------------------------------------------------------------- * Swig_error_count() * * Returns number of errors received. * ----------------------------------------------------------------------------- */ int Swig_error_count(void) { return nerrors; } /* ----------------------------------------------------------------------------- * Swig_error_silent() * * Set silent flag * ----------------------------------------------------------------------------- */ void Swig_error_silent(int s) { silence = s; } /* ----------------------------------------------------------------------------- * Swig_warnfilter() * * Takes a comma separate list of warning numbers and puts in the filter. * ----------------------------------------------------------------------------- */ void Swig_warnfilter(const_String_or_char_ptr wlist, int add) { char *c; char *cw; String *s; if (!filter) filter = NewStringEmpty(); s = NewString(""); Clear(s); cw = Char(wlist); while (*cw != '\0') { if (*cw != ' ') { Putc(*cw, s); } ++cw; } c = Char(s); c = strtok(c, ", "); while (c) { if (isdigit((int) *c) || (*c == '+') || (*c == '-')) { /* Even if c is a digit, the rest of the string might not be, eg in the case of typemap * warnings (a bit odd really), eg: %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) */ if (add) { Insert(filter, 0, c); if (isdigit((int) *c)) { Insert(filter, 0, "-"); } } else { char *temp = (char *)malloc(sizeof(char)*strlen(c) + 2); if (isdigit((int) *c)) { sprintf(temp, "-%s", c); } else { strcpy(temp, c); } Replace(filter, temp, "", DOH_REPLACE_FIRST); free(temp); } } c = strtok(NULL, ", "); } Delete(s); } void Swig_warnall(void) { warnall = 1; } /* ----------------------------------------------------------------------------- * Swig_warn_count() * * Return the number of warnings * ----------------------------------------------------------------------------- */ int Swig_warn_count(void) { return nwarning; } /* ----------------------------------------------------------------------------- * Swig_error_msg_format() * * Set the type of error/warning message display * ----------------------------------------------------------------------------- */ void Swig_error_msg_format(ErrorMessageFormat format) { const char *error = "Error"; const char *warning = "Warning"; const char *fmt_eof = 0; const char *fmt_line = 0; /* here 'format' could be directly a string instead of an enum, but by now a switch is used to translated into one. */ switch (format) { case EMF_MICROSOFT: fmt_line = "%s(%d) "; fmt_eof = "%s(999999) "; /* Is there a special character for EOF? Just use a large number. */ break; case EMF_STANDARD: default: fmt_line = "%s:%d"; fmt_eof = "%s:EOF"; } sprintf(wrn_wnum_fmt, "%s: %s %%d: ", fmt_line, warning); sprintf(wrn_nnum_fmt, "%s: %s: ", fmt_line, warning); sprintf(err_line_fmt, "%s: %s: ", fmt_line, error); sprintf(err_eof_fmt, "%s: %s: ", fmt_eof, error); sprintf(diag_line_fmt, "%s: ", fmt_line); sprintf(diag_eof_fmt, "%s: ", fmt_eof); msg_format = format; init_fmt = 1; } /* ----------------------------------------------------------------------------- * format_filename() * * Remove double backslashes in Windows filename paths for display * ----------------------------------------------------------------------------- */ static String *format_filename(const_String_or_char_ptr filename) { String *formatted_filename = NewString(filename); #if defined(_WIN32) Replaceall(formatted_filename, "\\\\", "\\"); #endif return formatted_filename; } /* ----------------------------------------------------------------------------- * Swig_stringify_with_location() * * Return a string representation of any DOH object with line and file location * information in the appropriate error message format. The string representation * is enclosed within [] brackets after the line and file information. * ----------------------------------------------------------------------------- */ String *Swig_stringify_with_location(DOH *object) { String *str = NewStringEmpty(); if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); if (object) { int line = Getline(object); String *formatted_filename = format_filename(Getfile(object)); if (line > 0) { Printf(str, diag_line_fmt, formatted_filename, line); } else { Printf(str, diag_eof_fmt, formatted_filename); } if (Len(object) == 0) { Printf(str, "[EMPTY]"); } else { Printf(str, "[%s]", object); } Delete(formatted_filename); } else { Printf(str, "[NULL]"); } return str; } /* ----------------------------------------------------------------------------- * Swig_diagnostic() * * Issue a diagnostic message on stdout. * ----------------------------------------------------------------------------- */ void Swig_diagnostic(const_String_or_char_ptr filename, int line, const char *fmt, ...) { va_list ap; String *formatted_filename = NULL; if (!init_fmt) Swig_error_msg_format(DEFAULT_ERROR_MSG_FORMAT); va_start(ap, fmt); formatted_filename = format_filename(filename); if (line > 0) { Printf(stdout, diag_line_fmt, formatted_filename, line); } else { Printf(stdout, diag_eof_fmt, formatted_filename); } vPrintf(stdout, fmt, ap); va_end(ap); Delete(formatted_filename); } swig-3.0.12/Source/Swig/swigopt.h0000664000175000017500000000156713042756442016464 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigopt.h * * Header file for the SWIG command line processing functions * ----------------------------------------------------------------------------- */ extern void Swig_init_args(int argc, char **argv); extern void Swig_mark_arg(int n); extern int Swig_check_marked(int n); extern void Swig_check_options(int check_input); extern void Swig_arg_error(void); swig-3.0.12/Source/Swig/fragment.c0000664000175000017500000001273013042756442016560 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * fragment.c * * This file manages named code fragments. Code fragments are typically * used to hold helper-code that may or may not be included in the wrapper * file (depending on what features are actually used in the interface). * * By using fragments, it's possible to greatly reduce the amount of * wrapper code and to generate cleaner wrapper files. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "swigwarn.h" #include "cparse.h" static Hash *fragments = 0; static Hash *looking_fragments = 0; static int debug = 0; /* ----------------------------------------------------------------------------- * Swig_fragment_register() * * Add a fragment. Use the original Node*, so, if something needs to be * changed, lang.cxx doesn't nedd to be touched again. * ----------------------------------------------------------------------------- */ void Swig_fragment_register(Node *fragment) { if (Getattr(fragment, "emitonly")) { Swig_fragment_emit(fragment); return; } else { String *name = Copy(Getattr(fragment, "value")); String *type = Getattr(fragment, "type"); if (type) { SwigType *rtype = SwigType_typedef_resolve_all(type); String *mangle = Swig_string_mangle(type); Append(name, mangle); Delete(mangle); Delete(rtype); if (debug) Printf(stdout, "register fragment %s %s\n", name, type); } if (!fragments) { fragments = NewHash(); } if (!Getattr(fragments, name)) { String *section = Copy(Getattr(fragment, "section")); String *ccode = Copy(Getattr(fragment, "code")); Hash *kwargs = Getattr(fragment, "kwargs"); Setmeta(ccode, "section", section); if (kwargs) { Setmeta(ccode, "kwargs", kwargs); } Setfile(ccode, Getfile(fragment)); Setline(ccode, Getline(fragment)); /* Replace $descriptor() macros */ Swig_cparse_replace_descriptor(ccode); Setattr(fragments, name, ccode); if (debug) Printf(stdout, "registering fragment %s %s\n", name, section); Delete(section); Delete(ccode); } Delete(name); } } /* ----------------------------------------------------------------------------- * Swig_fragment_emit() * * Emit a fragment * ----------------------------------------------------------------------------- */ static char *char_index(char *str, char c) { while (*str && (c != *str)) ++str; return (c == *str) ? str : 0; } void Swig_fragment_emit(Node *n) { String *code; char *pc, *tok; String *t; String *mangle = 0; String *name = 0; String *type = 0; name = Getattr(n, "value"); if (!name) { name = n; } if (!fragments) { Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); return; } type = Getattr(n, "type"); if (type) { mangle = Swig_string_mangle(type); } if (debug) Printf(stdout, "looking fragment %s %s\n", name, type); t = Copy(name); tok = Char(t); pc = char_index(tok, ','); if (pc) *pc = 0; while (tok) { String *name = NewString(tok); if (mangle) Append(name, mangle); if (looking_fragments && Getattr(looking_fragments, name)) { return; } code = Getattr(fragments, name); if (debug) Printf(stdout, "looking subfragment %s\n", name); if (code && (Strcmp(code, "ignore") != 0)) { String *section = Getmeta(code, "section"); Hash *nn = Getmeta(code, "kwargs"); if (!looking_fragments) looking_fragments = NewHash(); Setattr(looking_fragments, name, "1"); while (nn) { if (Equal(Getattr(nn, "name"), "fragment")) { if (debug) Printf(stdout, "emitting fragment %s %s\n", nn, type); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Swig_fragment_emit(nn); } nn = nextSibling(nn); } if (section) { File *f = Swig_filebyname(section); if (!f) { Swig_error(Getfile(code), Getline(code), "Bad section '%s' in %%fragment declaration for code fragment '%s'\n", section, name); } else { if (debug) Printf(stdout, "emitting subfragment %s %s\n", name, section); if (debug) Printf(f, "/* begin fragment %s */\n", name); Printf(f, "%s\n", code); if (debug) Printf(f, "/* end fragment %s */\n\n", name); Setattr(fragments, name, "ignore"); Delattr(looking_fragments, name); } } } else if (!code && type) { SwigType *rtype = SwigType_typedef_resolve_all(type); if (!Equal(type, rtype)) { String *name = Copy(Getattr(n, "value")); String *mangle = Swig_string_mangle(type); Append(name, mangle); Setfile(name, Getfile(n)); Setline(name, Getline(n)); Swig_fragment_emit(name); Delete(mangle); Delete(name); } Delete(rtype); } if (!code) { Swig_warning(WARN_FRAGMENT_NOT_FOUND, Getfile(n), Getline(n), "Fragment '%s' not found.\n", name); } tok = pc ? pc + 1 : 0; if (tok) { pc = char_index(tok, ','); if (pc) *pc = 0; } Delete(name); } Delete(t); } swig-3.0.12/Source/Swig/scanner.c0000664000175000017500000012517113042756442016412 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * scanner.c * * This file implements a general purpose C/C++ compatible lexical scanner. * This scanner isn't intended to be plugged directly into a parser built * with yacc. Rather, it contains a lot of generic code that could be used * to easily construct yacc-compatible scanners. * ----------------------------------------------------------------------------- */ #include "swig.h" #include extern String *cparse_file; extern int cparse_line; extern int cparse_cplusplus; extern int cparse_start_line; struct Scanner { String *text; /* Current token value */ List *scanobjs; /* Objects being scanned */ String *str; /* Current object being scanned */ char *idstart; /* Optional identifier start characters */ int nexttoken; /* Next token to be returned */ int start_line; /* Starting line of certain declarations */ int line; int yylen; /* Length of text pushed into text */ String *file; String *error; /* Last error message (if any) */ int error_line; /* Error line number */ int freeze_line; /* Suspend line number updates */ List *brackets; /* Current level of < > brackets on each level */ }; typedef struct Locator { String *filename; int line_number; struct Locator *next; } Locator; static int follow_locators = 0; static void brackets_push(Scanner *); static void brackets_clear(Scanner *); /* ----------------------------------------------------------------------------- * NewScanner() * * Create a new scanner object * ----------------------------------------------------------------------------- */ Scanner *NewScanner(void) { Scanner *s; s = (Scanner *) malloc(sizeof(Scanner)); s->line = 1; s->file = 0; s->nexttoken = -1; s->start_line = 1; s->yylen = 0; s->idstart = NULL; s->scanobjs = NewList(); s->text = NewStringEmpty(); s->str = 0; s->error = 0; s->error_line = 0; s->freeze_line = 0; s->brackets = NewList(); brackets_push(s); return s; } /* ----------------------------------------------------------------------------- * DelScanner() * * Delete a scanner object. * ----------------------------------------------------------------------------- */ void DelScanner(Scanner *s) { assert(s); Delete(s->scanobjs); Delete(s->brackets); Delete(s->text); Delete(s->file); Delete(s->error); Delete(s->str); free(s->idstart); free(s); } /* ----------------------------------------------------------------------------- * Scanner_clear() * * Clear the contents of a scanner object. * ----------------------------------------------------------------------------- */ void Scanner_clear(Scanner *s) { assert(s); Delete(s->str); Clear(s->text); Clear(s->scanobjs); brackets_clear(s); Delete(s->error); s->str = 0; s->error = 0; s->line = 1; s->nexttoken = -1; s->start_line = 0; s->yylen = 0; /* Should these be cleared too? s->idstart; s->file; s->error_line; s->freeze_line; */ } /* ----------------------------------------------------------------------------- * Scanner_push() * * Push some new text into the scanner. The scanner will start parsing this text * immediately before returning to the old text. * ----------------------------------------------------------------------------- */ void Scanner_push(Scanner *s, String *txt) { assert(s && txt); Push(s->scanobjs, txt); if (s->str) { Setline(s->str,s->line); Delete(s->str); } s->str = txt; DohIncref(s->str); s->line = Getline(txt); } /* ----------------------------------------------------------------------------- * Scanner_pushtoken() * * Push a token into the scanner. This token will be returned on the next * call to Scanner_token(). * ----------------------------------------------------------------------------- */ void Scanner_pushtoken(Scanner *s, int nt, const_String_or_char_ptr val) { assert(s); assert((nt >= 0) && (nt < SWIG_MAXTOKENS)); s->nexttoken = nt; if ( Char(val) != Char(s->text) ) { Clear(s->text); Append(s->text,val); } } /* ----------------------------------------------------------------------------- * Scanner_set_location() * * Set the file and line number location of the scanner. * ----------------------------------------------------------------------------- */ void Scanner_set_location(Scanner *s, String *file, int line) { Setline(s->str, line); Setfile(s->str, file); s->line = line; } /* ----------------------------------------------------------------------------- * Scanner_file() * * Get the current file. * ----------------------------------------------------------------------------- */ String *Scanner_file(Scanner *s) { return Getfile(s->str); } /* ----------------------------------------------------------------------------- * Scanner_line() * * Get the current line number * ----------------------------------------------------------------------------- */ int Scanner_line(Scanner *s) { return s->line; } /* ----------------------------------------------------------------------------- * Scanner_start_line() * * Get the line number on which the current token starts * ----------------------------------------------------------------------------- */ int Scanner_start_line(Scanner *s) { return s->start_line; } /* ----------------------------------------------------------------------------- * Scanner_idstart() * * Change the set of additional characters that can be used to start an identifier. * ----------------------------------------------------------------------------- */ void Scanner_idstart(Scanner *s, const char *id) { free(s->idstart); s->idstart = Swig_copy_string(id); } /* ----------------------------------------------------------------------------- * nextchar() * * Returns the next character from the scanner or 0 if end of the string. * ----------------------------------------------------------------------------- */ static char nextchar(Scanner *s) { int nc; if (!s->str) return 0; while ((nc = Getc(s->str)) == EOF) { Delete(s->str); s->str = 0; Delitem(s->scanobjs, 0); if (Len(s->scanobjs) == 0) return 0; s->str = Getitem(s->scanobjs, 0); s->line = Getline(s->str); DohIncref(s->str); } if ((nc == '\n') && (!s->freeze_line)) s->line++; Putc(nc,s->text); return (char)nc; } /* ----------------------------------------------------------------------------- * set_error() * * Sets error information on the scanner. * ----------------------------------------------------------------------------- */ static void set_error(Scanner *s, int line, const_String_or_char_ptr msg) { s->error_line = line; s->error = NewString(msg); } /* ----------------------------------------------------------------------------- * Scanner_errmsg() * Scanner_errline() * * Returns error information (if any) * ----------------------------------------------------------------------------- */ String *Scanner_errmsg(Scanner *s) { return s->error; } int Scanner_errline(Scanner *s) { return s->error_line; } /* ----------------------------------------------------------------------------- * freeze_line() * * Freezes the current line number. * ----------------------------------------------------------------------------- */ static void freeze_line(Scanner *s, int val) { s->freeze_line = val; } /* ----------------------------------------------------------------------------- * brackets_count() * * Returns the number of brackets at the current depth. * A syntax error with unbalanced ) brackets will result in a NULL pointer return. * ----------------------------------------------------------------------------- */ static int *brackets_count(Scanner *s) { int *count; if (Len(s->brackets) > 0) count = (int *)Data(Getitem(s->brackets, 0)); else count = 0; return count; } /* ----------------------------------------------------------------------------- * brackets_clear() * * Resets the current depth and clears all brackets. * Usually called at the end of statements; * ----------------------------------------------------------------------------- */ static void brackets_clear(Scanner *s) { Clear(s->brackets); brackets_push(s); /* base bracket count should always be created */ } /* ----------------------------------------------------------------------------- * brackets_increment() * * Increases the number of brackets at the current depth. * Usually called when a single '<' is found. * ----------------------------------------------------------------------------- */ static void brackets_increment(Scanner *s) { int *count = brackets_count(s); if (count) (*count)++; } /* ----------------------------------------------------------------------------- * brackets_decrement() * * Decreases the number of brackets at the current depth. * Usually called when a single '>' is found. * ----------------------------------------------------------------------------- */ static void brackets_decrement(Scanner *s) { int *count = brackets_count(s); if (count) (*count)--; } /* ----------------------------------------------------------------------------- * brackets_reset() * * Sets the number of '<' brackets back to zero. Called at the point where * it is no longer possible to have a matching closing >> pair for a template. * ----------------------------------------------------------------------------- */ static void brackets_reset(Scanner *s) { int *count = brackets_count(s); if (count) *count = 0; } /* ----------------------------------------------------------------------------- * brackets_push() * * Increases the depth of brackets. * Usually called when '(' is found. * ----------------------------------------------------------------------------- */ static void brackets_push(Scanner *s) { int *newInt = (int *)malloc(sizeof(int)); *newInt = 0; Push(s->brackets, NewVoid(newInt, free)); } /* ----------------------------------------------------------------------------- * brackets_pop() * * Decreases the depth of brackets. * Usually called when ')' is found. * ----------------------------------------------------------------------------- */ static void brackets_pop(Scanner *s) { if (Len(s->brackets) > 0) /* protect against unbalanced ')' brackets */ Delitem(s->brackets, 0); } /* ----------------------------------------------------------------------------- * brackets_allow_shift() * * Return 1 to allow shift (>>), or 0 if (>>) should be split into (> >). * This is for C++11 template syntax for closing templates. * ----------------------------------------------------------------------------- */ static int brackets_allow_shift(Scanner *s) { int *count = brackets_count(s); return !count || (*count <= 0); } /* ----------------------------------------------------------------------------- * retract() * * Retract n characters * ----------------------------------------------------------------------------- */ static void retract(Scanner *s, int n) { int i, l; char *str; str = Char(s->text); l = Len(s->text); assert(n <= l); for (i = 0; i < n; i++) { if (str[l - 1] == '\n') { if (!s->freeze_line) s->line--; } (void)Seek(s->str, -1, SEEK_CUR); Delitem(s->text, DOH_END); } } /* ----------------------------------------------------------------------------- * get_escape() * * Get escape sequence. Called when a backslash is found in a string * ----------------------------------------------------------------------------- */ static void get_escape(Scanner *s) { int result = 0; int state = 0; int c; while (1) { c = nextchar(s); if (c == 0) break; switch (state) { case 0: if (c == 'n') { Delitem(s->text, DOH_END); Append(s->text,"\n"); return; } if (c == 'r') { Delitem(s->text, DOH_END); Append(s->text,"\r"); return; } if (c == 't') { Delitem(s->text, DOH_END); Append(s->text,"\t"); return; } if (c == 'a') { Delitem(s->text, DOH_END); Append(s->text,"\a"); return; } if (c == 'b') { Delitem(s->text, DOH_END); Append(s->text,"\b"); return; } if (c == 'f') { Delitem(s->text, DOH_END); Append(s->text,"\f"); return; } if (c == '\\') { Delitem(s->text, DOH_END); Append(s->text,"\\"); return; } if (c == 'v') { Delitem(s->text, DOH_END); Append(s->text,"\v"); return; } if (c == 'e') { Delitem(s->text, DOH_END); Append(s->text,"\033"); return; } if (c == '\'') { Delitem(s->text, DOH_END); Append(s->text,"\'"); return; } if (c == '\"') { Delitem(s->text, DOH_END); Append(s->text,"\""); return; } if (c == '\n') { Delitem(s->text, DOH_END); return; } if (isdigit(c)) { state = 10; result = (c - '0'); Delitem(s->text, DOH_END); } else if (c == 'x') { state = 20; Delitem(s->text, DOH_END); } else { char tmp[3]; tmp[0] = '\\'; tmp[1] = (char)c; tmp[2] = 0; Delitem(s->text, DOH_END); Append(s->text, tmp); return; } break; case 10: if (!isdigit(c)) { retract(s,1); Putc((char)result,s->text); return; } result = (result << 3) + (c - '0'); Delitem(s->text, DOH_END); break; case 20: if (!isxdigit(c)) { retract(s,1); Putc((char)result, s->text); return; } if (isdigit(c)) result = (result << 4) + (c - '0'); else result = (result << 4) + (10 + tolower(c) - 'a'); Delitem(s->text, DOH_END); break; } } return; } /* ----------------------------------------------------------------------------- * look() * * Return the raw value of the next token. * ----------------------------------------------------------------------------- */ static int look(Scanner *s) { int state = 0; int c = 0; String *str_delimiter = 0; Clear(s->text); s->start_line = s->line; Setfile(s->text, Getfile(s->str)); while (1) { switch (state) { case 0: if ((c = nextchar(s)) == 0) return (0); /* Process delimiters */ if (c == '\n') { return SWIG_TOKEN_ENDLINE; } else if (!isspace(c)) { retract(s, 1); state = 1000; Clear(s->text); Setline(s->text, s->line); Setfile(s->text, Getfile(s->str)); } break; case 1000: if ((c = nextchar(s)) == 0) return (0); if (c == '%') state = 4; /* Possibly a SWIG directive */ /* Look for possible identifiers or unicode/delimiter strings */ else if ((isalpha(c)) || (c == '_') || (s->idstart && strchr(s->idstart, c))) { state = 7; } /* Look for single character symbols */ else if (c == '(') { brackets_push(s); return SWIG_TOKEN_LPAREN; } else if (c == ')') { brackets_pop(s); return SWIG_TOKEN_RPAREN; } else if (c == ';') { brackets_clear(s); return SWIG_TOKEN_SEMI; } else if (c == ',') return SWIG_TOKEN_COMMA; else if (c == '*') state = 220; else if (c == '}') return SWIG_TOKEN_RBRACE; else if (c == '{') { brackets_reset(s); return SWIG_TOKEN_LBRACE; } else if (c == '=') state = 33; else if (c == '+') state = 200; else if (c == '-') state = 210; else if (c == '&') state = 31; else if (c == '|') state = 32; else if (c == '^') state = 230; else if (c == '<') state = 60; else if (c == '>') state = 61; else if (c == '~') return SWIG_TOKEN_NOT; else if (c == '!') state = 3; else if (c == '\\') return SWIG_TOKEN_BACKSLASH; else if (c == '[') return SWIG_TOKEN_LBRACKET; else if (c == ']') return SWIG_TOKEN_RBRACKET; else if (c == '@') return SWIG_TOKEN_AT; else if (c == '$') state = 75; else if (c == '#') return SWIG_TOKEN_POUND; else if (c == '?') return SWIG_TOKEN_QUESTION; /* Look for multi-character sequences */ else if (c == '/') { state = 1; /* Comment (maybe) */ s->start_line = s->line; } else if (c == ':') state = 5; /* maybe double colon */ else if (c == '0') state = 83; /* An octal or hex value */ else if (c == '\"') { state = 2; /* A string constant */ s->start_line = s->line; Clear(s->text); } else if (c == '\'') { s->start_line = s->line; Clear(s->text); state = 9; /* A character constant */ } else if (c == '`') { s->start_line = s->line; Clear(s->text); state = 900; } else if (c == '.') state = 100; /* Maybe a number, maybe just a period */ else if (isdigit(c)) state = 8; /* A numerical value */ else state = 99; /* An error */ break; case 1: /* Comment block */ if ((c = nextchar(s)) == 0) return (0); if (c == '/') { state = 10; /* C++ style comment */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); Append(s->text, "//"); } else if (c == '*') { state = 11; /* C style comment */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); Append(s->text, "/*"); } else if (c == '=') { return SWIG_TOKEN_DIVEQUAL; } else { retract(s, 1); return SWIG_TOKEN_SLASH; } break; case 10: /* C++ style comment */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '\n') { retract(s,1); return SWIG_TOKEN_COMMENT; } else { state = 10; } break; case 11: /* C style comment block */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '*') { state = 12; } else { state = 11; } break; case 12: /* Still in C style comment */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated comment\n"); return SWIG_TOKEN_ERROR; } if (c == '*') { state = 12; } else if (c == '/') { return SWIG_TOKEN_COMMENT; } else { state = 11; } break; case 2: /* Processing a string */ if (!str_delimiter) { state=20; break; } if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated string\n"); return SWIG_TOKEN_ERROR; } else if (c == '(') { state = 20; } else { char temp[2] = { 0, 0 }; temp[0] = c; Append( str_delimiter, temp ); } break; case 20: /* Inside the string */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated string\n"); return SWIG_TOKEN_ERROR; } if (!str_delimiter) { /* Ordinary string: "value" */ if (c == '\"') { Delitem(s->text, DOH_END); return SWIG_TOKEN_STRING; } else if (c == '\\') { Delitem(s->text, DOH_END); get_escape(s); } } else { /* Custom delimiter string: R"XXXX(value)XXXX" */ if (c==')') { int i=0; String *end_delimiter = NewStringEmpty(); while ((c = nextchar(s)) != 0 && c!='\"') { char temp[2] = { 0, 0 }; temp[0] = c; Append( end_delimiter, temp ); i++; } if (Strcmp( str_delimiter, end_delimiter )==0) { Delete( end_delimiter ); /* Correct end delimiter )XXXX" occured */ Delete( str_delimiter ); str_delimiter = 0; return SWIG_TOKEN_STRING; } else { /* Incorrect end delimiter occured */ retract( s, i ); Delete( end_delimiter ); } } } break; case 3: /* Maybe a not equals */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LNOT; else if (c == '=') return SWIG_TOKEN_NOTEQUAL; else { retract(s, 1); return SWIG_TOKEN_LNOT; } break; case 31: /* AND or Logical AND or ANDEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_AND; else if (c == '&') return SWIG_TOKEN_LAND; else if (c == '=') return SWIG_TOKEN_ANDEQUAL; else { retract(s, 1); return SWIG_TOKEN_AND; } break; case 32: /* OR or Logical OR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_OR; else if (c == '|') return SWIG_TOKEN_LOR; else if (c == '=') return SWIG_TOKEN_OREQUAL; else { retract(s, 1); return SWIG_TOKEN_OR; } break; case 33: /* EQUAL or EQUALTO */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_EQUAL; else if (c == '=') return SWIG_TOKEN_EQUALTO; else { retract(s, 1); return SWIG_TOKEN_EQUAL; } break; case 4: /* A wrapper generator directive (maybe) */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_PERCENT; if (c == '{') { state = 40; /* Include block */ Clear(s->text); Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); s->start_line = s->line; } else if (s->idstart && strchr(s->idstart, '%') && ((isalpha(c)) || (c == '_'))) { state = 7; } else if (c == '=') { return SWIG_TOKEN_MODEQUAL; } else if (c == '}') { Swig_error(cparse_file, cparse_line, "Syntax error. Extraneous '%%}'\n"); exit(1); } else { retract(s, 1); return SWIG_TOKEN_PERCENT; } break; case 40: /* Process an include block */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated block\n"); return SWIG_TOKEN_ERROR; } if (c == '%') state = 41; break; case 41: /* Still processing include block */ if ((c = nextchar(s)) == 0) { set_error(s,s->start_line,"Unterminated code block"); return 0; } if (c == '}') { Delitem(s->text, DOH_END); Delitem(s->text, DOH_END); Seek(s->text,0,SEEK_SET); return SWIG_TOKEN_CODEBLOCK; } else { state = 40; } break; case 5: /* Maybe a double colon */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_COLON; if (c == ':') state = 50; else { retract(s, 1); return SWIG_TOKEN_COLON; } break; case 50: /* DCOLON, DCOLONSTAR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DCOLON; else if (c == '*') return SWIG_TOKEN_DCOLONSTAR; else { retract(s, 1); return SWIG_TOKEN_DCOLON; } break; case 60: /* shift operators */ if ((c = nextchar(s)) == 0) { brackets_increment(s); return SWIG_TOKEN_LESSTHAN; } if (c == '<') state = 240; else if (c == '=') return SWIG_TOKEN_LTEQUAL; else { retract(s, 1); brackets_increment(s); return SWIG_TOKEN_LESSTHAN; } break; case 61: if ((c = nextchar(s)) == 0) { brackets_decrement(s); return SWIG_TOKEN_GREATERTHAN; } if (c == '>' && brackets_allow_shift(s)) state = 250; else if (c == '=') return SWIG_TOKEN_GTEQUAL; else { retract(s, 1); brackets_decrement(s); return SWIG_TOKEN_GREATERTHAN; } break; case 7: /* Identifier or true/false or unicode/custom delimiter string */ if (c == 'R') { /* Possibly CUSTOM DELIMITER string */ state = 72; break; } else if (c == 'L') { /* Probably identifier but may be a wide string literal */ state = 77; break; } else if (c != 'u' && c != 'U') { /* Definitely an identifier */ state = 70; break; } if ((c = nextchar(s)) == 0) { state = 76; } else if (c == '\"') { /* Definitely u, U or L string */ retract(s, 1); state = 1000; } else if (c == 'R') { /* Possibly CUSTOM DELIMITER u, U, L string */ state = 73; } else if (c == '8') { /* Possibly u8 string */ state = 71; } else { retract(s, 1); /* Definitely an identifier */ state = 70; } break; case 70: /* Identifier */ if ((c = nextchar(s)) == 0) state = 76; else if (isalnum(c) || (c == '_') || (c == '$')) { state = 70; } else { retract(s, 1); state = 76; } break; case 71: /* Possibly u8 string */ if ((c = nextchar(s)) == 0) { state = 76; } else if (c=='\"') { retract(s, 1); /* Definitely u8 string */ state = 1000; } else if (c=='R') { state = 74; /* Possibly CUSTOM DELIMITER u8 string */ } else { retract(s, 2); /* Definitely an identifier. Retract 8" */ state = 70; } break; case 72: /* Possibly CUSTOM DELIMITER string */ case 73: case 74: if ((c = nextchar(s)) == 0) { state = 76; } else if (c=='\"') { retract(s, 1); /* Definitely custom delimiter u, U or L string */ str_delimiter = NewStringEmpty(); state = 1000; } else { if (state==72) { retract(s, 1); /* Definitely an identifier. Retract ? */ } else if (state==73) { retract(s, 2); /* Definitely an identifier. Retract R? */ } else if (state==74) { retract(s, 3); /* Definitely an identifier. Retract 8R? */ } state = 70; } break; case 75: /* Special identifier $ */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOLLAR; if (isalnum(c) || (c == '_') || (c == '*') || (c == '&')) { state = 70; } else { retract(s,1); if (Len(s->text) == 1) return SWIG_TOKEN_DOLLAR; state = 76; } break; case 76: /* Identifier or true/false */ if (cparse_cplusplus) { if (Strcmp(s->text, "true") == 0) return SWIG_TOKEN_BOOL; else if (Strcmp(s->text, "false") == 0) return SWIG_TOKEN_BOOL; } return SWIG_TOKEN_ID; break; case 77: /*identifier or wide string literal*/ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ID; else if (c == '\"') { s->start_line = s->line; Clear(s->text); state = 78; } else if (c == '\'') { s->start_line = s->line; Clear(s->text); state = 79; } else if (isalnum(c) || (c == '_') || (c == '$')) state = 7; else { retract(s, 1); return SWIG_TOKEN_ID; } break; case 78: /* Processing a wide string literal*/ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide string\n"); return SWIG_TOKEN_ERROR; } if (c == '\"') { Delitem(s->text, DOH_END); return SWIG_TOKEN_WSTRING; } else if (c == '\\') { if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide string\n"); return SWIG_TOKEN_ERROR; } } break; case 79: /* Processing a wide char literal */ if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '\'') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_WCHAR); } else if (c == '\\') { if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated wide character literal\n"); return SWIG_TOKEN_ERROR; } } break; case 8: /* A numerical digit */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (c == '.') { state = 81; } else if ((c == 'e') || (c == 'E')) { state = 82; } else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if (isdigit(c)) { state = 8; } else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 81: /* A floating pointer number of some sort */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOUBLE; if (isdigit(c)) state = 81; else if ((c == 'e') || (c == 'E')) state = 820; else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if ((c == 'l') || (c == 'L')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_DOUBLE; } else { retract(s, 1); return (SWIG_TOKEN_DOUBLE); } break; case 82: if ((c = nextchar(s)) == 0) { retract(s, 1); return SWIG_TOKEN_INT; } if ((isdigit(c)) || (c == '-') || (c == '+')) state = 86; else { retract(s, 2); return (SWIG_TOKEN_INT); } break; case 820: /* Like case 82, but we've seen a decimal point. */ if ((c = nextchar(s)) == 0) { retract(s, 1); return SWIG_TOKEN_DOUBLE; } if ((isdigit(c)) || (c == '-') || (c == '+')) state = 86; else { retract(s, 2); return (SWIG_TOKEN_DOUBLE); } break; case 83: /* Might be a hexadecimal or octal number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isdigit(c)) state = 84; else if ((c == 'x') || (c == 'X')) state = 85; else if (c == '.') state = 81; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 84: /* This is an octal number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isdigit(c)) state = 84; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 85: /* This is an hex number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_INT; if (isxdigit(c)) state = 85; else if ((c == 'l') || (c == 'L')) { state = 87; } else if ((c == 'u') || (c == 'U')) { state = 88; } else { retract(s, 1); return SWIG_TOKEN_INT; } break; case 86: /* Rest of floating point number */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_DOUBLE; if (isdigit(c)) state = 86; else if ((c == 'f') || (c == 'F')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_FLOAT; } else if ((c == 'l') || (c == 'L')) { Delitem(s->text, DOH_END); return SWIG_TOKEN_DOUBLE; } else { retract(s, 1); return SWIG_TOKEN_DOUBLE; } break; case 87: /* A long integer of some sort */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LONG; if ((c == 'u') || (c == 'U')) { return SWIG_TOKEN_ULONG; } else if ((c == 'l') || (c == 'L')) { state = 870; } else { retract(s, 1); return SWIG_TOKEN_LONG; } break; /* A long long integer */ case 870: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LONGLONG; if ((c == 'u') || (c == 'U')) { return SWIG_TOKEN_ULONGLONG; } else { retract(s, 1); return SWIG_TOKEN_LONGLONG; } /* An unsigned number */ case 88: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_UINT; if ((c == 'l') || (c == 'L')) { state = 880; } else { retract(s, 1); return SWIG_TOKEN_UINT; } break; /* Possibly an unsigned long long or unsigned long */ case 880: if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ULONG; if ((c == 'l') || (c == 'L')) return SWIG_TOKEN_ULONGLONG; else { retract(s, 1); return SWIG_TOKEN_ULONG; } /* A character constant */ case 9: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '\'') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_CHAR); } else if (c == '\\') { Delitem(s->text, DOH_END); get_escape(s); } break; /* A period or maybe a floating point number */ case 100: if ((c = nextchar(s)) == 0) return (0); if (isdigit(c)) state = 81; else { retract(s, 1); return SWIG_TOKEN_PERIOD; } break; case 200: /* PLUS, PLUSPLUS, PLUSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_PLUS; else if (c == '+') return SWIG_TOKEN_PLUSPLUS; else if (c == '=') return SWIG_TOKEN_PLUSEQUAL; else { retract(s, 1); return SWIG_TOKEN_PLUS; } break; case 210: /* MINUS, MINUSMINUS, MINUSEQUAL, ARROW */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_MINUS; else if (c == '-') return SWIG_TOKEN_MINUSMINUS; else if (c == '=') return SWIG_TOKEN_MINUSEQUAL; else if (c == '>') state = 211; else { retract(s, 1); return SWIG_TOKEN_MINUS; } break; case 211: /* ARROW, ARROWSTAR */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_ARROW; else if (c == '*') return SWIG_TOKEN_ARROWSTAR; else { retract(s, 1); return SWIG_TOKEN_ARROW; } break; case 220: /* STAR, TIMESEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_STAR; else if (c == '=') return SWIG_TOKEN_TIMESEQUAL; else { retract(s, 1); return SWIG_TOKEN_STAR; } break; case 230: /* XOR, XOREQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_XOR; else if (c == '=') return SWIG_TOKEN_XOREQUAL; else { retract(s, 1); return SWIG_TOKEN_XOR; } break; case 240: /* LSHIFT, LSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_LSHIFT; else if (c == '=') return SWIG_TOKEN_LSEQUAL; else { retract(s, 1); return SWIG_TOKEN_LSHIFT; } break; case 250: /* RSHIFT, RSEQUAL */ if ((c = nextchar(s)) == 0) return SWIG_TOKEN_RSHIFT; else if (c == '=') return SWIG_TOKEN_RSEQUAL; else { retract(s, 1); return SWIG_TOKEN_RSHIFT; } break; /* An illegal character */ /* Reverse string */ case 900: if ((c = nextchar(s)) == 0) { Swig_error(cparse_file, cparse_start_line, "Unterminated character constant\n"); return SWIG_TOKEN_ERROR; } if (c == '`') { Delitem(s->text, DOH_END); return (SWIG_TOKEN_RSTRING); } break; default: return SWIG_TOKEN_ILLEGAL; } } } /* ----------------------------------------------------------------------------- * Scanner_token() * * Real entry point to return the next token. Returns 0 if at end of input. * ----------------------------------------------------------------------------- */ int Scanner_token(Scanner *s) { int t; Delete(s->error); if (s->nexttoken >= 0) { t = s->nexttoken; s->nexttoken = -1; return t; } s->start_line = 0; t = look(s); if (!s->start_line) { Setline(s->text,s->line); } else { Setline(s->text,s->start_line); } return t; } /* ----------------------------------------------------------------------------- * Scanner_text() * * Return the lexene associated with the last returned token. * ----------------------------------------------------------------------------- */ String *Scanner_text(Scanner *s) { return s->text; } /* ----------------------------------------------------------------------------- * Scanner_skip_line() * * Skips to the end of a line * ----------------------------------------------------------------------------- */ void Scanner_skip_line(Scanner *s) { char c; int done = 0; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); while (!done) { if ((c = nextchar(s)) == 0) return; if (c == '\\') { nextchar(s); } else if (c == '\n') { done = 1; } } return; } /* ----------------------------------------------------------------------------- * Scanner_skip_balanced() * * Skips a piece of code enclosed in begin/end symbols such as '{...}' or * (...). Ignores symbols inside comments or strings. * ----------------------------------------------------------------------------- */ int Scanner_skip_balanced(Scanner *s, int startchar, int endchar) { char c; int num_levels = 1; int state = 0; char temp[2] = { 0, 0 }; String *locator = 0; temp[0] = (char) startchar; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); Append(s->text, temp); while (num_levels > 0) { if ((c = nextchar(s)) == 0) { Delete(locator); return -1; } switch (state) { case 0: if (c == startchar) num_levels++; else if (c == endchar) num_levels--; else if (c == '/') state = 10; else if (c == '\"') state = 20; else if (c == '\'') state = 30; break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else if (c == startchar) { state = 0; num_levels++; } else state = 0; break; case 11: if (c == '\n') state = 0; else state = 11; break; case 12: /* first character inside C comment */ if (c == '*') state = 14; else if (c == '@') state = 40; else state = 13; break; case 13: if (c == '*') state = 14; break; case 14: /* possible end of C comment */ if (c == '*') state = 14; else if (c == '/') state = 0; else state = 13; break; case 20: if (c == '\"') state = 0; else if (c == '\\') state = 21; break; case 21: state = 20; break; case 30: if (c == '\'') state = 0; else if (c == '\\') state = 31; break; case 31: state = 30; break; /* 40-45 SWIG locator checks - a C comment with contents starting: @SWIG */ case 40: state = (c == 'S') ? 41 : (c == '*') ? 14 : 13; break; case 41: state = (c == 'W') ? 42 : (c == '*') ? 14 : 13; break; case 42: state = (c == 'I') ? 43 : (c == '*') ? 14 : 13; break; case 43: state = (c == 'G') ? 44 : (c == '*') ? 14 : 13; if (c == 'G') { Delete(locator); locator = NewString("/*@SWIG"); } break; case 44: if (c == '*') state = 45; Putc(c, locator); break; case 45: /* end of SWIG locator in C comment */ if (c == '/') { state = 0; Putc(c, locator); Scanner_locator(s, locator); } else { /* malformed locator */ state = (c == '*') ? 14 : 13; } break; default: break; } } Delete(locator); return 0; } /* ----------------------------------------------------------------------------- * Scanner_get_raw_text_balanced() * * Returns raw text between 2 braces, does not change scanner state in any way * ----------------------------------------------------------------------------- */ String *Scanner_get_raw_text_balanced(Scanner *s, int startchar, int endchar) { String *result = 0; char c; int old_line = s->line; String *old_text = Copy(s->text); long position = Tell(s->str); int num_levels = 1; int state = 0; char temp[2] = { 0, 0 }; temp[0] = (char) startchar; Clear(s->text); Setfile(s->text, Getfile(s->str)); Setline(s->text, s->line); Append(s->text, temp); while (num_levels > 0) { if ((c = nextchar(s)) == 0) { Clear(s->text); Append(s->text, old_text); Delete(old_text); s->line = old_line; return 0; } switch (state) { case 0: if (c == startchar) num_levels++; else if (c == endchar) num_levels--; else if (c == '/') state = 10; else if (c == '\"') state = 20; else if (c == '\'') state = 30; break; case 10: if (c == '/') state = 11; else if (c == '*') state = 12; else if (c == startchar) { state = 0; num_levels++; } else state = 0; break; case 11: if (c == '\n') state = 0; else state = 11; break; case 12: /* first character inside C comment */ if (c == '*') state = 14; else state = 13; break; case 13: if (c == '*') state = 14; break; case 14: /* possible end of C comment */ if (c == '*') state = 14; else if (c == '/') state = 0; else state = 13; break; case 20: if (c == '\"') state = 0; else if (c == '\\') state = 21; break; case 21: state = 20; break; case 30: if (c == '\'') state = 0; else if (c == '\\') state = 31; break; case 31: state = 30; break; default: break; } } Seek(s->str, position, SEEK_SET); result = Copy(s->text); Clear(s->text); Append(s->text, old_text); Delete(old_text); s->line = old_line; return result; } /* ----------------------------------------------------------------------------- * Scanner_isoperator() * * Returns 0 or 1 depending on whether or not a token corresponds to a C/C++ * operator. * ----------------------------------------------------------------------------- */ int Scanner_isoperator(int tokval) { if (tokval >= 100) return 1; return 0; } /* ---------------------------------------------------------------------- * locator() * * Support for locator strings. These are strings of the form * @SWIG:filename,line,id@ emitted by the SWIG preprocessor. They * are primarily used for macro line number reporting. * We just use the locator to mark when to activate/deactivate linecounting. * ---------------------------------------------------------------------- */ void Scanner_locator(Scanner *s, String *loc) { static Locator *locs = 0; static int expanding_macro = 0; if (!follow_locators) { if (Equal(loc, "/*@SWIG@*/")) { /* End locator. */ if (expanding_macro) --expanding_macro; } else { /* Begin locator. */ ++expanding_macro; } /* Freeze line number processing in Scanner */ freeze_line(s,expanding_macro); } else { int c; Locator *l; (void)Seek(loc, 7, SEEK_SET); c = Getc(loc); if (c == '@') { /* Empty locator. We pop the last location off */ if (locs) { Scanner_set_location(s, locs->filename, locs->line_number); cparse_file = locs->filename; cparse_line = locs->line_number; l = locs->next; free(locs); locs = l; } return; } /* We're going to push a new location */ l = (Locator *) malloc(sizeof(Locator)); l->filename = cparse_file; l->line_number = cparse_line; l->next = locs; locs = l; /* Now, parse the new location out of the locator string */ { String *fn = NewStringEmpty(); /* Putc(c, fn); */ while ((c = Getc(loc)) != EOF) { if ((c == '@') || (c == ',')) break; Putc(c, fn); } cparse_file = Swig_copy_string(Char(fn)); Clear(fn); cparse_line = 1; /* Get the line number */ while ((c = Getc(loc)) != EOF) { if ((c == '@') || (c == ',')) break; Putc(c, fn); } cparse_line = atoi(Char(fn)); Clear(fn); /* Get the rest of it */ while ((c = Getc(loc)) != EOF) { if (c == '@') break; Putc(c, fn); } /* Swig_diagnostic(cparse_file, cparse_line, "Scanner_set_location\n"); */ Scanner_set_location(s, cparse_file, cparse_line); Delete(fn); } } } void Swig_cparse_follow_locators(int v) { follow_locators = v; } swig-3.0.12/Source/Swig/tree.c0000664000175000017500000002435313042756442015720 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * tree.c * * This file provides some general purpose functions for manipulating * parse trees. * ----------------------------------------------------------------------------- */ #include "swig.h" #include #include /* ----------------------------------------------------------------------------- * Swig_print_tags() * * Dump the tag structure of a parse tree to standard output * ----------------------------------------------------------------------------- */ void Swig_print_tags(DOH *obj, DOH *root) { DOH *croot, *newroot; DOH *cobj; if (!root) croot = NewStringEmpty(); else croot = root; while (obj) { Swig_diagnostic(Getfile(obj), Getline(obj), "%s . %s\n", croot, nodeType(obj)); cobj = firstChild(obj); if (cobj) { newroot = NewStringf("%s . %s", croot, nodeType(obj)); Swig_print_tags(cobj, newroot); Delete(newroot); } obj = nextSibling(obj); } if (!root) Delete(croot); } static int indent_level = 0; static void print_indent(int l) { int i; for (i = 0; i < indent_level; i++) { fputc(' ', stdout); } if (l) { fputc('|', stdout); fputc(' ', stdout); } } /* ----------------------------------------------------------------------------- * Swig_print_node(Node *n) * ----------------------------------------------------------------------------- */ void Swig_print_node(Node *obj) { Iterator ki; Node *cobj; print_indent(0); Printf(stdout, "+++ %s - %p ----------------------------------------\n", nodeType(obj), obj); ki = First(obj); while (ki.key) { String *k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "parms") == 0 || Cmp(k, "wrap:parms") == 0) { print_indent(2); Printf(stdout, "%-12s - %s\n", k, ParmList_str_defaultargs(Getattr(obj, k))); } else { DOH *o; const char *trunc = ""; print_indent(2); if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 80) { trunc = "..."; } Printf(stdout, "%-12s - \"%(escape)-0.80s%s\"\n", k, o, trunc); Delete(o); } else { Printf(stdout, "%-12s - %p\n", k, Getattr(obj, k)); } } ki = Next(ki); } cobj = firstChild(obj); if (cobj) { indent_level += 6; Printf(stdout, "\n"); Swig_print_tree(cobj); indent_level -= 6; } else { print_indent(1); Printf(stdout, "\n"); } } /* ----------------------------------------------------------------------------- * Swig_print_tree() * * Dump the tree structure of a parse tree to standard output * ----------------------------------------------------------------------------- */ void Swig_print_tree(DOH *obj) { while (obj) { Swig_print_node(obj); obj = nextSibling(obj); } } /* ----------------------------------------------------------------------------- * appendChild() * * Appends a new child to a node * ----------------------------------------------------------------------------- */ void appendChild(Node *node, Node *chd) { Node *lc; if (!chd) return; lc = lastChild(node); if (!lc) { set_firstChild(node, chd); } else { set_nextSibling(lc, chd); set_previousSibling(chd, lc); } while (chd) { lc = chd; set_parentNode(chd, node); chd = nextSibling(chd); } set_lastChild(node, lc); } /* ----------------------------------------------------------------------------- * prependChild() * * Prepends a new child to a node * ----------------------------------------------------------------------------- */ void prependChild(Node *node, Node *chd) { Node *fc; if (!chd) return; fc = firstChild(node); if (fc) { set_nextSibling(chd, fc); set_previousSibling(fc, chd); } set_firstChild(node, chd); while (chd) { set_parentNode(chd, node); chd = nextSibling(chd); } } void appendSibling(Node *node, Node *chd) { Node *parent; Node *lc = node; while (nextSibling(lc)) lc = nextSibling(lc); set_nextSibling(lc, chd); set_previousSibling(chd, lc); parent = parentNode(node); if (parent) { while (chd) { lc = chd; set_parentNode(chd, parent); chd = nextSibling(chd); } set_lastChild(parent, lc); } } /* ----------------------------------------------------------------------------- * removeNode() * * Removes a node from the parse tree. Detaches it from its parent's child list. * ----------------------------------------------------------------------------- */ void removeNode(Node *n) { Node *parent; Node *prev; Node *next; parent = parentNode(n); if (!parent) return; prev = previousSibling(n); next = nextSibling(n); if (prev) { set_nextSibling(prev, next); } else { if (parent) { set_firstChild(parent, next); } } if (next) { set_previousSibling(next, prev); } else { if (parent) { set_lastChild(parent, prev); } } /* Delete attributes */ Delattr(n,"parentNode"); Delattr(n,"nextSibling"); Delattr(n,"prevSibling"); } /* ----------------------------------------------------------------------------- * copyNode() * * Copies a node, but only copies simple attributes (no lists, hashes). * ----------------------------------------------------------------------------- */ Node *copyNode(Node *n) { Iterator ki; Node *c = NewHash(); for (ki = First(n); ki.key; ki = Next(ki)) { if (DohIsString(ki.item)) { Setattr(c, ki.key, Copy(ki.item)); } } Setfile(c, Getfile(n)); Setline(c, Getline(n)); return c; } /* ----------------------------------------------------------------------------- * checkAttribute() * ----------------------------------------------------------------------------- */ int checkAttribute(Node *n, const_String_or_char_ptr name, const_String_or_char_ptr value) { String *v = Getattr(n, name); return v ? Equal(v, value) : 0; } /* ----------------------------------------------------------------------------- * Swig_require() * ns - namespace for the view name for saving any attributes under * n - node * ... - list of attribute names of type char* * This method checks that the attribute names exist in the node n and asserts if * not. Assert will only occur unless the attribute is optional. An attribute is * optional if it is prefixed by ?, eg "?value". If the attribute name is prefixed * by * or ?, eg "*value" then a copy of the attribute is saved. The saved * attributes will be restored on a subsequent call to Swig_restore(). All the * saved attributes are saved in the view namespace (prefixed by ns). * This function can be called more than once with different namespaces. * ----------------------------------------------------------------------------- */ void Swig_require(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; va_start(ap, n); name = va_arg(ap, char *); while (name) { int newref = 0; int opt = 0; if (*name == '*') { newref = 1; name++; } else if (*name == '?') { newref = 1; opt = 1; name++; } obj = Getattr(n, name); if (!opt && !obj) { Swig_error(Getfile(n), Getline(n), "Fatal error (Swig_require). Missing attribute '%s' in node '%s'.\n", name, nodeType(n)); assert(obj); } if (!obj) obj = DohNone; if (newref) { /* Save a copy of the attribute */ Setattr(n, NewStringf("%s:%s", ns, name), obj); } name = va_arg(ap, char *); } va_end(ap); /* Save the view */ { String *view = Getattr(n, "view"); if (view) { if (Strcmp(view, ns) != 0) { Setattr(n, NewStringf("%s:view", ns), view); Setattr(n, "view", NewString(ns)); } } else { Setattr(n, "view", NewString(ns)); } } } /* ----------------------------------------------------------------------------- * Swig_save() * Same as Swig_require(), but all attribute names are optional and all attributes * are saved, ie behaves as if all the attribute names were prefixed by ?. * ----------------------------------------------------------------------------- */ void Swig_save(const char *ns, Node *n, ...) { va_list ap; char *name; DOH *obj; va_start(ap, n); name = va_arg(ap, char *); while (name) { if (*name == '*') { name++; } else if (*name == '?') { name++; } obj = Getattr(n, name); if (!obj) obj = DohNone; /* Save a copy of the attribute */ if (Setattr(n, NewStringf("%s:%s", ns, name), obj)) { Printf(stderr, "Swig_save('%s','%s'): Warning, attribute '%s' was already saved.\n", ns, nodeType(n), name); } name = va_arg(ap, char *); } va_end(ap); /* Save the view */ { String *view = Getattr(n, "view"); if (view) { if (Strcmp(view, ns) != 0) { Setattr(n, NewStringf("%s:view", ns), view); Setattr(n, "view", NewString(ns)); } } else { Setattr(n, "view", NewString(ns)); } } } /* ----------------------------------------------------------------------------- * Swig_restore() * Restores attributes saved by a previous call to Swig_require() or Swig_save(). * ----------------------------------------------------------------------------- */ void Swig_restore(Node *n) { String *temp; int len; List *l; String *ns; Iterator ki; ns = Getattr(n, "view"); assert(ns); l = NewList(); temp = NewStringf("%s:", ns); len = Len(temp); for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(temp, ki.key, len) == 0) { Append(l, ki.key); } } for (ki = First(l); ki.item; ki = Next(ki)) { DOH *obj = Getattr(n, ki.item); Setattr(n, Char(ki.item) + len, obj); Delattr(n, ki.item); } Delete(l); Delete(temp); } swig-3.0.12/Source/Swig/cwrap.c0000664000175000017500000014271013042756442016073 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cwrap.c * * This file defines a variety of wrapping rules for C/C++ handling including * the naming of local variables, calling conventions, and so forth. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" static const char *cresult_variable_name = "result"; static Parm *nonvoid_parms(Parm *p) { if (p) { SwigType *t = Getattr(p, "type"); if (SwigType_type(t) == T_VOID) return 0; } return p; } /* ----------------------------------------------------------------------------- * Swig_cresult_name_set() * * Change the name of the variable used to hold the return value from C/C++ wrapper functions * from the default "result". * ----------------------------------------------------------------------------- */ void Swig_cresult_name_set(const char *new_name) { cresult_variable_name = new_name; } /* ----------------------------------------------------------------------------- * Swig_cresult_name() * * Get the name of the variable used to hold the return value from C/C++ wrapper functions * ----------------------------------------------------------------------------- */ const char *Swig_cresult_name(void) { return cresult_variable_name; } /* ----------------------------------------------------------------------------- * Swig_cparm_name() * * Generates a name for the ith argument in an argument list * ----------------------------------------------------------------------------- */ String *Swig_cparm_name(Parm *p, int i) { String *name = NewStringf("arg%d", i + 1); if (p) { Setattr(p, "lname", name); } return name; } /* ----------------------------------------------------------------------------- * Swig_clocal() * * Creates a string that declares a C local variable type. Converts references * and user defined types to pointers. * ----------------------------------------------------------------------------- */ static String *Swig_clocal(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr value) { String *decl; decl = NewStringEmpty(); switch (SwigType_type(t)) { case T_REFERENCE: if (value) { String *lstrname = SwigType_lstr(t, name); String *lstr = SwigType_lstr(t, 0); Printf(decl, "%s = (%s) &%s_defvalue", lstrname, lstr, name); Delete(lstrname); Delete(lstr); } else { String *lstrname = SwigType_lstr(t, name); Printf(decl, "%s = 0", lstrname); Delete(lstrname); } break; case T_RVALUE_REFERENCE: if (value) { String *lstrname = SwigType_lstr(t, name); String *lstr = SwigType_lstr(t, 0); Printf(decl, "%s = (%s) &%s_defrvalue", lstrname, lstr, name); Delete(lstrname); Delete(lstr); } else { String *lstrname = SwigType_lstr(t, name); Printf(decl, "%s = 0", lstrname); Delete(lstrname); } break; case T_VOID: break; case T_VARARGS: Printf(decl, "void *%s = 0", name); break; default: if (value) { String *lcaststr = SwigType_lcaststr(t, value); String *lstr = SwigType_lstr(t, 0); String *lstrn = SwigType_lstr(t, name); Printf(decl, "%s = (%s) %s", lstrn, lstr, lcaststr); Delete(lcaststr); Delete(lstr); Delete(lstrn); } else { String *lstrname = SwigType_lstr(t, name); Append(decl, lstrname); Delete(lstrname); } } return decl; } /* ----------------------------------------------------------------------------- * Swig_wrapped_var_convert() * * Converts a member variable for use in the get and set wrapper methods. * This function only converts user defined types to pointers. * ----------------------------------------------------------------------------- */ String *Swig_wrapped_var_type(SwigType *t, int varcref) { SwigType *ty; if (!Strstr(t, "enum $unnamed")) { ty = Copy(t); } else { /* Change the type for unnamed enum instance variables */ ty = NewString("int"); } if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { if (!SwigType_isconst(ty)) SwigType_add_qualifier(ty, "const"); SwigType_add_reference(ty); } else { return Copy(ty); } } else { SwigType_add_pointer(ty); } } return ty; } String *Swig_wrapped_member_var_type(SwigType *t, int varcref) { SwigType *ty; if (!Strstr(t, "enum $unnamed")) { ty = Copy(t); } else { /* Change the type for unnamed enum instance variables */ ty = NewString("int"); } if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { if (!SwigType_isconst(ty)) SwigType_add_qualifier(ty, "const"); SwigType_add_reference(ty); } else { return Copy(ty); } } else { SwigType_add_pointer(ty); } } return ty; } static String *Swig_wrapped_var_deref(SwigType *t, const_String_or_char_ptr name, int varcref) { if (SwigType_isclass(t)) { if (varcref) { if (cparse_cplusplus) { return NewStringf("*%s", name); } else { return NewStringf("%s", name); } } else { return NewStringf("*%s", name); } } else { return SwigType_rcaststr(t, name); } } static String *Swig_wrapped_var_assign(SwigType *t, const_String_or_char_ptr name, int varcref) { if (SwigType_isclass(t)) { if (varcref) { return NewStringf("%s", name); } else { return NewStringf("&%s", name); } } else { return SwigType_lcaststr(t, name); } } /* ----------------------------------------------------------------------------- * Swig_cargs() * * Emit all of the local variables for a list of parameters. Returns the * number of parameters. * Default values for the local variables are only emitted if the compact default * argument behaviour is required. * ----------------------------------------------------------------------------- */ int Swig_cargs(Wrapper *w, ParmList *p) { int i = 0; int compactdefargs = ParmList_is_compactdefargs(p); while (p != 0) { String *lname = Swig_cparm_name(p, i); SwigType *pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *local = 0; String *type = Getattr(p, "type"); /* default values only emitted if in compact default args mode */ String *pvalue = (compactdefargs) ? Getattr(p, "value") : 0; /* When using compactdefaultargs, the code generated initialises a variable via a constructor call that accepts the * default value as a parameter. The default constructor is not called and therefore SwigValueWrapper is not needed. */ SwigType *altty = pvalue ? 0 : SwigType_alttype(type, 0); int tycode = SwigType_type(type); if (tycode == T_REFERENCE) { if (pvalue) { SwigType *tvalue; String *defname, *defvalue, *rvalue, *qvalue; rvalue = SwigType_typedef_resolve_all(pvalue); qvalue = SwigType_typedef_qualified(rvalue); defname = NewStringf("%s_defvalue", lname); tvalue = Copy(type); SwigType_del_reference(tvalue); tycode = SwigType_type(tvalue); if (tycode != T_USER) { /* plain primitive type, we copy the def value */ String *lstr = SwigType_lstr(tvalue, defname); defvalue = NewStringf("%s = %s", lstr, qvalue); Delete(lstr); } else { /* user type, we copy the reference value */ String *str = SwigType_str(type, defname); defvalue = NewStringf("%s = %s", str, qvalue); Delete(str); } Wrapper_add_localv(w, defname, defvalue, NIL); Delete(tvalue); Delete(rvalue); Delete(qvalue); Delete(defname); Delete(defvalue); } } else if (tycode == T_RVALUE_REFERENCE) { if (pvalue) { SwigType *tvalue; String *defname, *defvalue, *rvalue, *qvalue; rvalue = SwigType_typedef_resolve_all(pvalue); qvalue = SwigType_typedef_qualified(rvalue); defname = NewStringf("%s_defrvalue", lname); tvalue = Copy(type); SwigType_del_rvalue_reference(tvalue); tycode = SwigType_type(tvalue); if (tycode != T_USER) { /* plain primitive type, we copy the the def value */ String *lstr = SwigType_lstr(tvalue, defname); defvalue = NewStringf("%s = %s", lstr, qvalue); Delete(lstr); } else { /* user type, we copy the reference value */ String *str = SwigType_str(type, defname); defvalue = NewStringf("%s = %s", str, qvalue); Delete(str); } Wrapper_add_localv(w, defname, defvalue, NIL); Delete(tvalue); Delete(rvalue); Delete(qvalue); Delete(defname); Delete(defvalue); } } else if (!pvalue && ((tycode == T_POINTER) || (tycode == T_STRING) || (tycode == T_WSTRING))) { pvalue = (String *) "0"; } if (!altty) { local = Swig_clocal(pt, lname, pvalue); } else { local = Swig_clocal(altty, lname, pvalue); Delete(altty); } Wrapper_add_localv(w, lname, local, NIL); Delete(local); i++; } Delete(lname); p = nextSibling(p); } return (i); } /* ----------------------------------------------------------------------------- * Swig_cresult() * * This function generates the C code needed to set the result of a C * function call. * ----------------------------------------------------------------------------- */ String *Swig_cresult(SwigType *t, const_String_or_char_ptr name, const_String_or_char_ptr decl) { String *fcall; fcall = NewStringEmpty(); switch (SwigType_type(t)) { case T_VOID: break; case T_REFERENCE: { String *lstr = SwigType_lstr(t, 0); Printf(fcall, "%s = (%s) &", name, lstr); Delete(lstr); } break; case T_RVALUE_REFERENCE: { String *const_lvalue_str; String *lstr = SwigType_lstr(t, 0); SwigType *tt = Copy(t); SwigType_del_rvalue_reference(tt); SwigType_add_qualifier(tt, "const"); SwigType_add_reference(tt); const_lvalue_str = SwigType_rcaststr(tt, 0); Printf(fcall, "%s = (%s) &%s", name, lstr, const_lvalue_str); Delete(const_lvalue_str); Delete(tt); Delete(lstr); } break; case T_USER: Printf(fcall, "%s = ", name); break; default: /* Normal return value */ { String *lstr = SwigType_lstr(t, 0); Printf(fcall, "%s = (%s)", name, lstr); Delete(lstr); } break; } /* Now print out function call */ Append(fcall, decl); /* A sick hack */ { char *c = Char(decl) + Len(decl) - 1; if (!((*c == ';') || (*c == '}'))) Append(fcall, ";"); } return fcall; } /* ----------------------------------------------------------------------------- * Swig_cfunction_call() * * Creates a string that calls a C function using the local variable rules * defined above. * * name(arg0, arg1, arg2, ... argn) * * ----------------------------------------------------------------------------- */ String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms) { String *func; int i = 0; int comma = 0; Parm *p = parms; String *nname; func = NewStringEmpty(); nname = SwigType_namestr(name); /* SWIGTEMPLATEDISAMBIGUATOR is compiler dependent (swiglabels.swg), - SUN Studio 9 requires 'template', - gcc-3.4 forbids the use of 'template'. the rest seems not caring very much, */ if (SwigType_istemplate(name)) { String *prefix = Swig_scopename_prefix(nname); if (!prefix || Len(prefix) == 0) { Printf(func, "%s(", nname); } else { String *last = Swig_scopename_last(nname); Printf(func, "%s::SWIGTEMPLATEDISAMBIGUATOR %s(", prefix, last); Delete(last); } Delete(prefix); } else { Printf(func, "%s(", nname); } Delete(nname); while (p) { SwigType *pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { SwigType *rpt = SwigType_typedef_resolve_all(pt); String *pname = Swig_cparm_name(p, i); String *rcaststr = SwigType_rcaststr(rpt, pname); if (comma) { Printv(func, ",", rcaststr, NIL); } else { Append(func, rcaststr); } Delete(rpt); Delete(pname); Delete(rcaststr); comma = 1; i++; } p = nextSibling(p); } Append(func, ")"); return func; } /* ----------------------------------------------------------------------------- * Swig_cmethod_call() * * Generates a string that calls a C++ method from a list of parameters. * * arg0->name(arg1, arg2, arg3, ..., argn) * * self is an argument that defines how to handle the first argument. Normally, * it should be set to "this->". With C++ proxy classes enabled, it could be * set to "(*this)->" or some similar sequence. * ----------------------------------------------------------------------------- */ static String *Swig_cmethod_call(const_String_or_char_ptr name, ParmList *parms, const_String_or_char_ptr self, String *explicit_qualifier, SwigType *director_type) { String *func, *nname; int i = 0; Parm *p = parms; SwigType *pt; int comma = 0; func = NewStringEmpty(); if (!p) return func; if (!self) self = "(this)->"; Append(func, self); if (SwigType_istemplate(name) && (strncmp(Char(name), "operator ", 9) == 0)) { /* fix for template + operators and compilers like gcc 3.3.5 */ String *tprefix = SwigType_templateprefix(name); nname = tprefix; } else { nname = SwigType_namestr(name); } if (director_type) { const char *pname = "darg"; String *rcaststr = SwigType_rcaststr(director_type, pname); Replaceall(func, "this", rcaststr); Delete(rcaststr); } else { pt = Getattr(p, "type"); /* If the method is invoked through a dereferenced pointer, we don't add any casts (needed for smart pointers). Otherwise, we cast to the appropriate type */ if (Strstr(func, "*this")) { String *pname = Swig_cparm_name(p, 0); Replaceall(func, "this", pname); Delete(pname); } else { String *pname = Swig_cparm_name(p, 0); String *rcaststr = SwigType_rcaststr(pt, pname); Replaceall(func, "this", rcaststr); Delete(rcaststr); Delete(pname); } /* SWIGTEMPLATEDESIMBUAGATOR is compiler dependent (swiglabels.swg), - SUN Studio 9 requires 'template', - gcc-3.4 forbids the use of 'template' (correctly implementing the ISO C++ standard) the others don't seem to care, */ if (SwigType_istemplate(name)) Printf(func, "SWIGTEMPLATEDISAMBIGUATOR "); if (explicit_qualifier) { Printv(func, explicit_qualifier, "::", NIL); } } Printf(func, "%s(", nname); i++; p = nextSibling(p); while (p) { pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *pname = Swig_cparm_name(p, i); String *rcaststr = SwigType_rcaststr(pt, pname); if (comma) Append(func, ","); Append(func, rcaststr); Delete(rcaststr); Delete(pname); comma = 1; i++; } p = nextSibling(p); } Append(func, ")"); Delete(nname); return func; } /* ----------------------------------------------------------------------------- * Swig_cconstructor_call() * * Creates a string that calls a C constructor function. * * calloc(1,sizeof(name)); * ----------------------------------------------------------------------------- */ String *Swig_cconstructor_call(const_String_or_char_ptr name) { DOH *func; func = NewStringEmpty(); Printf(func, "calloc(1, sizeof(%s))", name); return func; } /* ----------------------------------------------------------------------------- * Swig_cppconstructor_call() * * Creates a string that calls a C function using the local variable rules * defined above. * * name(arg0, arg1, arg2, ... argn) * * ----------------------------------------------------------------------------- */ String *Swig_cppconstructor_base_call(const_String_or_char_ptr name, ParmList *parms, int skip_self) { String *func; String *nname; int i = 0; int comma = 0; Parm *p = parms; SwigType *pt; if (skip_self) { if (p) p = nextSibling(p); i++; } nname = SwigType_namestr(name); func = NewStringEmpty(); Printf(func, "new %s(", nname); while (p) { pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { String *rcaststr = 0; String *pname = 0; if (comma) Append(func, ","); if (!Getattr(p, "arg:byname")) { pname = Swig_cparm_name(p, i); i++; } else { pname = Getattr(p, "value"); if (pname) pname = Copy(pname); else pname = Copy(Getattr(p, "name")); } rcaststr = SwigType_rcaststr(pt, pname); Append(func, rcaststr); Delete(rcaststr); comma = 1; Delete(pname); } p = nextSibling(p); } Append(func, ")"); Delete(nname); return func; } String *Swig_cppconstructor_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 0); } String *Swig_cppconstructor_nodirector_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 1); } String *Swig_cppconstructor_director_call(const_String_or_char_ptr name, ParmList *parms) { return Swig_cppconstructor_base_call(name, parms, 0); } /* ----------------------------------------------------------------------------- * recursive_flag_search() * * This function searches for the class attribute 'attr' in the class * 'n' or recursively in its bases. * * If you define SWIG_FAST_REC_SEARCH, the method will set the found * 'attr' in the target class 'n'. If not, the method will set the * 'noattr' one. This prevents of having to navigate the entire * hierarchy tree everytime, so, it is an O(1) method... or something * like that. However, it populates all the parsed classes with the * 'attr' and/or 'noattr' attributes. * * If you undefine the SWIG_FAST_REC_SEARCH no attribute will be set * while searching. This could be slower for large projects with very * large hierarchy trees... or maybe not. But it will be cleaner. * * Maybe later a swig option can be added to switch at runtime. * * ----------------------------------------------------------------------------- */ /* #define SWIG_FAST_REC_SEARCH 1 */ static String *recursive_flag_search(Node *n, const String *attr, const String *noattr) { String *f = 0; n = Swig_methodclass(n); if (GetFlag(n, noattr)) { return 0; } f = GetFlagAttr(n, attr); if (f) { return f; } else { List *bl = Getattr(n, "bases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { f = recursive_flag_search(bi.item, attr, noattr); if (f) { #ifdef SWIG_FAST_REC_SEARCH SetFlagAttr(n, attr, f); #endif return f; } } } } #ifdef SWIG_FAST_REC_SEARCH SetFlag(n, noattr); #endif return 0; } /* ----------------------------------------------------------------------------- * Swig_unref_call() * * Find the "feature:unref" call, if any. * ----------------------------------------------------------------------------- */ String *Swig_unref_call(Node *n) { String *unref = recursive_flag_search(n, "feature:unref", "feature:nounref"); if (unref) { String *pname = Swig_cparm_name(0, 0); unref = NewString(unref); Replaceall(unref, "$this", pname); Replaceall(unref, "$self", pname); Delete(pname); } return unref; } /* ----------------------------------------------------------------------------- * Swig_ref_call() * * Find the "feature:ref" call, if any. * ----------------------------------------------------------------------------- */ String *Swig_ref_call(Node *n, const String *lname) { String *ref = recursive_flag_search(n, "feature:ref", "feature:noref"); if (ref) { ref = NewString(ref); Replaceall(ref, "$this", lname); Replaceall(ref, "$self", lname); } return ref; } /* ----------------------------------------------------------------------------- * Swig_cdestructor_call() * * Creates a string that calls a C destructor function. * * free((char *) arg0); * ----------------------------------------------------------------------------- */ String *Swig_cdestructor_call(Node *n) { Node *cn = Swig_methodclass(n); String *unref = Swig_unref_call(cn); if (unref) { return unref; } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("free((char *) %s);", pname); Delete(pname); return call; } } /* ----------------------------------------------------------------------------- * Swig_cppdestructor_call() * * Creates a string that calls a C destructor function. * * delete arg1; * ----------------------------------------------------------------------------- */ String *Swig_cppdestructor_call(Node *n) { Node *cn = Swig_methodclass(n); String *unref = Swig_unref_call(cn); if (unref) { return unref; } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("delete %s;", pname); Delete(pname); return call; } } /* ----------------------------------------------------------------------------- * Swig_cmemberset_call() * * Generates a string that sets the name of a member in a C++ class or C struct. * * arg0->name = arg1 * * ----------------------------------------------------------------------------- */ String *Swig_cmemberset_call(const_String_or_char_ptr name, SwigType *type, String *self, int varcref) { String *func; String *pname0 = Swig_cparm_name(0, 0); String *pname1 = Swig_cparm_name(0, 1); func = NewStringEmpty(); if (!self) self = NewString("(this)->"); else self = NewString(self); Replaceall(self, "this", pname0); if (SwigType_type(type) != T_ARRAY) { if (!Strstr(type, "enum $unnamed")) { String *dref = Swig_wrapped_var_deref(type, pname1, varcref); int extra_cast = 0; if (cparse_cplusplusout) { /* Required for C nested structs compiled as C++ as a duplicate of the nested struct is put into the global namespace. * We could improve this by adding the extra casts just for nested structs rather than all structs. */ String *base = SwigType_base(type); extra_cast = SwigType_isclass(base); Delete(base); } if (extra_cast) { String *lstr; SwigType *ptype = Copy(type); SwigType_add_pointer(ptype); lstr = SwigType_lstr(ptype, 0); Printf(func, "if (%s) *(%s)&%s%s = %s", pname0, lstr, self, name, dref); Delete(lstr); Delete(ptype); } else { Printf(func, "if (%s) %s%s = %s", pname0, self, name, dref); } Delete(dref); } else { Printf(func, "if (%s && sizeof(int) == sizeof(%s%s)) *(int*)(void*)&(%s%s) = %s", pname0, self, name, self, name, pname1); } } Delete(self); Delete(pname0); Delete(pname1); return (func); } /* ----------------------------------------------------------------------------- * Swig_cmemberget_call() * * Generates a string that sets the name of a member in a C++ class or C struct. * * arg0->name * * ----------------------------------------------------------------------------- */ String *Swig_cmemberget_call(const_String_or_char_ptr name, SwigType *t, String *self, int varcref) { String *func; String *call; String *pname0 = Swig_cparm_name(0, 0); if (!self) self = NewString("(this)->"); else self = NewString(self); Replaceall(self, "this", pname0); func = NewStringEmpty(); call = Swig_wrapped_var_assign(t, "", varcref); Printf(func, "%s (%s%s)", call, self, name); Delete(self); Delete(call); Delete(pname0); return func; } /* ----------------------------------------------------------------------------- * Swig_replace_special_variables() * * Replaces special variables with a value from the supplied node * ----------------------------------------------------------------------------- */ void Swig_replace_special_variables(Node *n, Node *parentnode, String *code) { Node *parentclass = parentnode; String *overloaded = Getattr(n, "sym:overloaded"); Replaceall(code, "$name", Getattr(n, "name")); Replaceall(code, "$symname", Getattr(n, "sym:name")); Replaceall(code, "$wrapname", Getattr(n, "wrap:name")); Replaceall(code, "$overname", overloaded ? Char(Getattr(n, "sym:overname")) : ""); if (Strstr(code, "$decl")) { String *decl = Swig_name_decl(n); Replaceall(code, "$decl", decl); Delete(decl); } if (Strstr(code, "$fulldecl")) { String *fulldecl = Swig_name_fulldecl(n); Replaceall(code, "$fulldecl", fulldecl); Delete(fulldecl); } if (parentclass && !Equal(nodeType(parentclass), "class")) parentclass = 0; if (Strstr(code, "$parentclasssymname")) { String *parentclasssymname = 0; if (parentclass) parentclasssymname = Getattr(parentclass, "sym:name"); Replaceall(code, "$parentclasssymname", parentclasssymname ? parentclasssymname : ""); } if (Strstr(code, "$parentclassname")) { String *parentclassname = 0; if (parentclass) parentclassname = Getattr(parentclass, "name"); Replaceall(code, "$parentclassname", parentclassname ? SwigType_str(parentclassname, "") : ""); } } /* ----------------------------------------------------------------------------- * extension_code() * * Generates an extension function (a function defined in %extend) * * return_type function_name(parms) code * * ----------------------------------------------------------------------------- */ static String *extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { String *parms_str = cplusplus ? ParmList_str_defaultargs(parms) : ParmList_str(parms); String *sig = NewStringf("%s(%s)", function_name, (cplusplus || Len(parms_str)) ? parms_str : "void"); String *rt_sig = SwigType_str(return_type, sig); String *body = NewStringf("SWIGINTERN %s", rt_sig); Printv(body, code, "\n", NIL); if (Strstr(body, "$")) { Swig_replace_special_variables(n, parentNode(parentNode(n)), body); if (self) Replaceall(body, "$self", self); } Delete(parms_str); Delete(sig); Delete(rt_sig); return body; } /* ----------------------------------------------------------------------------- * Swig_add_extension_code() * * Generates an extension function (a function defined in %extend) and * adds it to the "wrap:code" attribute of a node * * See also extension_code() * * ----------------------------------------------------------------------------- */ int Swig_add_extension_code(Node *n, const String *function_name, ParmList *parms, SwigType *return_type, const String *code, int cplusplus, const String *self) { String *body = extension_code(n, function_name, parms, return_type, code, cplusplus, self); Setattr(n, "wrap:code", body); Delete(body); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MethodToFunction(Node *n) * * Converts a C++ method node to a function accessor function. * ----------------------------------------------------------------------------- */ int Swig_MethodToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int flags, SwigType *director_type, int is_director) { String *name; ParmList *parms; SwigType *type; Parm *p; String *self = 0; int is_smart_pointer_overload = 0; String *qualifier = Getattr(n, "qualifier"); String *directorScope = NewString(nspace); Replace(directorScope, NSPACE_SEPARATOR, "_", DOH_REPLACE_ANY); /* If smart pointer without const overload or mutable method, change self dereferencing */ if (flags & CWRAP_SMART_POINTER) { if (flags & CWRAP_SMART_POINTER_OVERLOAD) { if (qualifier && strncmp(Char(qualifier), "q(const)", 8) == 0) { self = NewString("(*(this))->"); is_smart_pointer_overload = 1; } else if (Swig_storage_isstatic(n)) { String *cname = Getattr(n, "extendsmartclassname") ? Getattr(n, "extendsmartclassname") : classname; String *ctname = SwigType_namestr(cname); self = NewStringf("(*(%s const *)this)->", ctname); is_smart_pointer_overload = 1; Delete(ctname); } else { self = NewString("(*this)->"); } } else { self = NewString("(*this)->"); } } /* If node is a member template expansion, we don't allow added code */ if (Getattr(n, "templatetype")) flags &= ~(CWRAP_EXTEND); name = Getattr(n, "name"); parms = CopyParmList(nonvoid_parms(Getattr(n, "parms"))); type = NewString(classname); if (qualifier) { SwigType_push(type, qualifier); } SwigType_add_pointer(type); p = NewParm(type, "self", n); Setattr(p, "self", "1"); Setattr(p, "hidden","1"); /* Disable the 'this' ownership in 'self' to manage inplace operations like: A& A::operator+=(int i) { ...; return *this;} Here the 'self' parameter ownership needs to be disabled since there could be two objects sharing the same 'this' pointer: the input and the result one. And worse, the pointer could be deleted in one of the objects (input), leaving the other (output) with just a seg. fault to happen. To avoid the previous problem, use %feature("self:disown") *::operator+=; %feature("new") *::operator+=; These two lines just transfer the ownership of the 'this' pointer from the input to the output wrapping object. This happens in python, but may also happen in other target languages. */ if (GetFlag(n, "feature:self:disown")) { Setattr(p, "wrap:disown", "1"); } set_nextSibling(p, parms); Delete(type); /* Generate action code for the access */ if (!(flags & CWRAP_EXTEND)) { String *explicit_qualifier = 0; String *call = 0; String *cres = 0; String *explicitcall_name = 0; int pure_virtual = !(Cmp(Getattr(n, "storage"), "virtual")) && !(Cmp(Getattr(n, "value"), "0")); /* Call the explicit method rather than allow for a polymorphic call */ if ((flags & CWRAP_DIRECTOR_TWO_CALLS) || (flags & CWRAP_DIRECTOR_ONE_CALL)) { String *access = Getattr(n, "access"); if (access && (Cmp(access, "protected") == 0)) { /* If protected access (can only be if a director method) then call the extra public accessor method (language module must provide this) */ String *explicit_qualifier_tmp = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); explicitcall_name = NewStringf("%sSwigPublic", name); if (Len(directorScope) > 0) explicit_qualifier = NewStringf("SwigDirector_%s_%s", directorScope, explicit_qualifier_tmp); else explicit_qualifier = NewStringf("SwigDirector_%s", explicit_qualifier_tmp); Delete(explicit_qualifier_tmp); } else { explicit_qualifier = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); } } call = Swig_cmethod_call(explicitcall_name ? explicitcall_name : name, p, self, explicit_qualifier, director_type); cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call); if (pure_virtual && is_director && (flags & CWRAP_DIRECTOR_TWO_CALLS)) { String *qualifier = SwigType_namestr(Getattr(Getattr(parentNode(n), "typescope"), "qname")); Delete(cres); cres = NewStringf("Swig::DirectorPureVirtualException::raise(\"%s::%s\");", qualifier, name); Delete(qualifier); } if (flags & CWRAP_DIRECTOR_TWO_CALLS) { /* Create two method calls, one to call the explicit method, the other a normal polymorphic function call */ String *cres_both_calls = NewStringf(""); String *call_extra = Swig_cmethod_call(name, p, self, 0, director_type); String *cres_extra = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call_extra); Printv(cres_both_calls, "if (upcall) {\n", cres, "\n", "} else {", cres_extra, "\n}", NIL); Setattr(n, "wrap:action", cres_both_calls); Delete(cres_extra); Delete(call_extra); Delete(cres_both_calls); } else { Setattr(n, "wrap:action", cres); } Delete(explicitcall_name); Delete(call); Delete(cres); Delete(explicit_qualifier); } else { /* Methods with default arguments are wrapped with additional methods for each default argument, * however, only one extra %extend method is generated. */ String *defaultargs = Getattr(n, "defaultargs"); String *code = Getattr(n, "code"); String *cname = Getattr(n, "extendsmartclassname") ? Getattr(n, "extendsmartclassname") : classname; String *membername = Swig_name_member(nspace, cname, name); String *mangled = Swig_name_mangle(membername); int is_smart_pointer = flags & CWRAP_SMART_POINTER; type = Getattr(n, "type"); /* Check if the method is overloaded. If so, and it has code attached, we append an extra suffix to avoid a name-clash in the generated wrappers. This allows overloaded methods to be defined in C. */ if (Getattr(n, "sym:overloaded") && code) { Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } /* See if there is any code that we need to emit */ if (!defaultargs && code && !is_smart_pointer) { Swig_add_extension_code(n, mangled, p, type, code, cparse_cplusplus, "self"); } if (is_smart_pointer) { int i = 0; Parm *pp = p; String *func = NewStringf("%s(", mangled); String *cres; if (!Swig_storage_isstatic(n)) { String *pname = Swig_cparm_name(pp, i); String *ctname = SwigType_namestr(cname); String *fadd = 0; if (is_smart_pointer_overload) { String *nclassname = SwigType_namestr(classname); fadd = NewStringf("(%s const *)((%s const *)%s)->operator ->()", ctname, nclassname, pname); Delete(nclassname); } else { fadd = NewStringf("(%s*)(%s)->operator ->()", ctname, pname); } Append(func, fadd); Delete(ctname); Delete(fadd); Delete(pname); pp = nextSibling(pp); if (pp) Append(func, ","); } else { pp = nextSibling(pp); } ++i; while (pp) { SwigType *pt = Getattr(pp, "type"); if ((SwigType_type(pt) != T_VOID)) { String *pname = Swig_cparm_name(pp, i++); String *rcaststr = SwigType_rcaststr(pt, pname); Append(func, rcaststr); Delete(rcaststr); Delete(pname); pp = nextSibling(pp); if (pp) Append(func, ","); } } Append(func, ")"); cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), func); Setattr(n, "wrap:action", cres); Delete(cres); } else { String *call = Swig_cfunction_call(mangled, p); String *cres = Swig_cresult(Getattr(n, "type"), Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Delete(membername); Delete(mangled); } Setattr(n, "parms", p); Delete(p); Delete(self); Delete(parms); Delete(directorScope); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_methodclass() * * This function returns the class node for a given method or class. * ----------------------------------------------------------------------------- */ Node *Swig_methodclass(Node *n) { Node *nodetype = nodeType(n); if (Cmp(nodetype, "class") == 0) return n; return GetFlag(n, "feature:extend") ? parentNode(parentNode(n)) : parentNode(n); } int Swig_directorclass(Node *n) { Node *classNode = Swig_methodclass(n); assert(classNode != 0); return (Getattr(classNode, "vtable") != 0); } Node *Swig_directormap(Node *module, String *type) { int is_void = !Cmp(type, "void"); if (!is_void && module) { /* ?? follow the inheritance hierarchy? */ String *base = SwigType_base(type); Node *directormap = Getattr(module, "wrap:directormap"); if (directormap) return Getattr(directormap, base); } return 0; } /* ----------------------------------------------------------------------------- * Swig_ConstructorToFunction() * * This function creates a C wrapper for a C constructor function. * ----------------------------------------------------------------------------- */ int Swig_ConstructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, String *none_comparison, String *director_ctor, int cplus, int flags, String *directorname) { Parm *p; ParmList *directorparms; SwigType *type; int use_director = Swig_directorclass(n); ParmList *parms = CopyParmList(nonvoid_parms(Getattr(n, "parms"))); /* Prepend the list of prefix_args (if any) */ Parm *prefix_args = Getattr(n, "director:prefix_args"); if (prefix_args != NIL) { Parm *p2, *p3; directorparms = CopyParmList(prefix_args); for (p = directorparms; nextSibling(p); p = nextSibling(p)); for (p2 = parms; p2; p2 = nextSibling(p2)) { p3 = CopyParm(p2); set_nextSibling(p, p3); Delete(p3); p = p3; } } else directorparms = parms; type = NewString(classname); SwigType_add_pointer(type); if (flags & CWRAP_EXTEND) { /* Constructors with default arguments are wrapped with additional constructor methods for each default argument, * however, only one extra %extend method is generated. */ String *call; String *cres; String *defaultargs = Getattr(n, "defaultargs"); String *code = Getattr(n, "code"); String *membername = Swig_name_construct(nspace, classname); String *mangled = Swig_name_mangle(membername); /* Check if the constructor is overloaded. If so, and it has code attached, we append an extra suffix to avoid a name-clash in the generated wrappers. This allows overloaded constructors to be defined in C. */ if (Getattr(n, "sym:overloaded") && code) { Append(mangled, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } /* See if there is any code that we need to emit */ if (!defaultargs && code) { Swig_add_extension_code(n, mangled, parms, type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(membername); Delete(mangled); } else { if (cplus) { /* if a C++ director class exists, create it rather than the original class */ if (use_director) { Node *parent = Swig_methodclass(n); int abstract = Getattr(parent, "abstracts") != 0; String *action = NewStringEmpty(); String *tmp_none_comparison = Copy(none_comparison); String *director_call; String *nodirector_call; Replaceall(tmp_none_comparison, "$arg", "arg1"); director_call = Swig_cppconstructor_director_call(directorname, directorparms); nodirector_call = Swig_cppconstructor_nodirector_call(classname, parms); if (abstract) { /* whether or not the abstract class has been subclassed in python, * create a director instance (there's no way to create a normal * instance). if any of the pure virtual methods haven't been * implemented in the target language, calls to those methods will * generate Swig::DirectorPureVirtualException exceptions. */ String *cres = Swig_cresult(type, Swig_cresult_name(), director_call); Append(action, cres); Delete(cres); } else { /* (scottm): The code for creating a new director is now a string template that gets passed in via the director_ctor argument. $comparison : an 'if' comparison from none_comparison $director_new: Call new for director class $nondirector_new: Call new for non-director class */ String *cres; Append(action, director_ctor); Replaceall(action, "$comparison", tmp_none_comparison); cres = Swig_cresult(type, Swig_cresult_name(), director_call); Replaceall(action, "$director_new", cres); Delete(cres); cres = Swig_cresult(type, Swig_cresult_name(), nodirector_call); Replaceall(action, "$nondirector_new", cres); Delete(cres); } Setattr(n, "wrap:action", action); Delete(tmp_none_comparison); Delete(action); } else { String *call = Swig_cppconstructor_call(classname, parms); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); } } else { String *call = Swig_cconstructor_call(classname); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); } } Setattr(n, "type", type); Setattr(n, "parms", parms); Delete(type); if (directorparms != parms) Delete(directorparms); Delete(parms); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_DestructorToFunction() * * This function creates a C wrapper for a destructor function. * ----------------------------------------------------------------------------- */ int Swig_DestructorToFunction(Node *n, const_String_or_char_ptr nspace, String *classname, int cplus, int flags) { SwigType *type; Parm *p; type = NewString(classname); SwigType_add_pointer(type); p = NewParm(type, "self", n); Setattr(p, "self", "1"); Setattr(p, "hidden", "1"); Setattr(p, "wrap:disown", "1"); Delete(type); type = NewString("void"); if (flags & CWRAP_EXTEND) { String *cres; String *call; String *membername, *mangled, *code; membername = Swig_name_destroy(nspace, classname); mangled = Swig_name_mangle(membername); code = Getattr(n, "code"); if (code) { Swig_add_extension_code(n, mangled, p, type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, p); cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(membername); Delete(mangled); Delete(call); Delete(cres); } else { if (cplus) { String *call = Swig_cppdestructor_call(n); String *cres = NewStringf("%s", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } else { String *call = Swig_cdestructor_call(n); String *cres = NewStringf("%s", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } } Setattr(n, "type", type); Setattr(n, "parms", p); Delete(type); Delete(p); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MembersetToFunction() * * This function creates a C wrapper for setting a structure member. * ----------------------------------------------------------------------------- */ int Swig_MembersetToFunction(Node *n, String *classname, int flags) { String *name; ParmList *parms; Parm *p; SwigType *t; SwigType *ty; SwigType *type; SwigType *void_type = NewString("void"); String *self = 0; int varcref = flags & CWRAP_NATURAL_VAR; if (flags & CWRAP_SMART_POINTER) { self = NewString("(*this)->"); } if (flags & CWRAP_ALL_PROTECTED_ACCESS) { self = NewStringf("darg->"); } name = Getattr(n, "name"); type = Getattr(n, "type"); t = NewString(classname); SwigType_add_pointer(t); parms = NewParm(t, "self", n); Setattr(parms, "self", "1"); Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); p = NewParm(ty, name, n); Setattr(parms, "hidden", "1"); set_nextSibling(parms, p); /* If the type is a pointer or reference. We mark it with a special wrap:disown attribute */ if (SwigType_check_decl(type, "p.")) { Setattr(p, "wrap:disown", "1"); } Delete(p); if (flags & CWRAP_EXTEND) { String *call; String *cres; String *code = Getattr(n, "code"); String *sname = Swig_name_set(0, name); String *membername = Swig_name_member(0, classname, sname); String *mangled = Swig_name_mangle(membername); if (code) { /* I don't think this ever gets run - WSF */ Swig_add_extension_code(n, mangled, parms, void_type, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(membername); Delete(sname); } else { String *call = Swig_cmemberset_call(name, type, self, varcref); String *cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Setattr(n, "type", void_type); Setattr(n, "parms", parms); Delete(parms); Delete(ty); Delete(void_type); Delete(self); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_MembergetToFunction() * * This function creates a C wrapper for getting a structure member. * ----------------------------------------------------------------------------- */ int Swig_MembergetToFunction(Node *n, String *classname, int flags) { String *name; ParmList *parms; SwigType *t; SwigType *ty; SwigType *type; String *self = 0; int varcref = flags & CWRAP_NATURAL_VAR; if (flags & CWRAP_SMART_POINTER) { if (Swig_storage_isstatic(n)) { Node *sn = Getattr(n, "cplus:staticbase"); String *base = Getattr(sn, "name"); self = NewStringf("%s::", base); } else if (flags & CWRAP_SMART_POINTER_OVERLOAD) { String *nclassname = SwigType_namestr(classname); self = NewStringf("(*(%s const *)this)->", nclassname); Delete(nclassname); } else { self = NewString("(*this)->"); } } if (flags & CWRAP_ALL_PROTECTED_ACCESS) { self = NewStringf("darg->"); } name = Getattr(n, "name"); type = Getattr(n, "type"); t = NewString(classname); SwigType_add_pointer(t); parms = NewParm(t, "self", n); Setattr(parms, "self", "1"); Setattr(parms, "hidden","1"); Delete(t); ty = Swig_wrapped_member_var_type(type, varcref); if (flags & CWRAP_EXTEND) { String *call; String *cres; String *code = Getattr(n, "code"); String *gname = Swig_name_get(0, name); String *membername = Swig_name_member(0, classname, gname); String *mangled = Swig_name_mangle(membername); if (code) { /* I don't think this ever gets run - WSF */ Swig_add_extension_code(n, mangled, parms, ty, code, cparse_cplusplus, "self"); } call = Swig_cfunction_call(mangled, parms); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(membername); Delete(gname); } else { String *call = Swig_cmemberget_call(name, type, self, varcref); String *cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(call); Delete(cres); } Setattr(n, "type", ty); Setattr(n, "parms", parms); Delete(parms); Delete(ty); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_VarsetToFunction() * * This function creates a C wrapper for setting a global variable or static member * variable. * ----------------------------------------------------------------------------- */ int Swig_VarsetToFunction(Node *n, int flags) { String *name, *nname; ParmList *parms; SwigType *type, *ty; int varcref = flags & CWRAP_NATURAL_VAR; name = Getattr(n, "name"); type = Getattr(n, "type"); nname = SwigType_namestr(name); ty = Swig_wrapped_var_type(type, varcref); parms = NewParm(ty, name, n); if (flags & CWRAP_EXTEND) { String *sname = Swig_name_set(0, name); String *mangled = Swig_name_mangle(sname); String *call = Swig_cfunction_call(mangled, parms); String *cres = NewStringf("%s;", call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); Delete(mangled); Delete(sname); } else { if (!Strstr(type, "enum $unnamed")) { String *pname = Swig_cparm_name(0, 0); String *dref = Swig_wrapped_var_deref(type, pname, varcref); String *call = NewStringf("%s = %s;", nname, dref); Setattr(n, "wrap:action", call); Delete(call); Delete(dref); Delete(pname); } else { String *pname = Swig_cparm_name(0, 0); String *call = NewStringf("if (sizeof(int) == sizeof(%s)) *(int*)(void*)&(%s) = %s;", nname, nname, pname); Setattr(n, "wrap:action", call); Delete(pname); Delete(call); } } Setattr(n, "type", "void"); Setattr(n, "parms", parms); Delete(parms); Delete(ty); Delete(nname); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Swig_VargetToFunction() * * This function creates a C wrapper for getting a global variable or static member * variable. * ----------------------------------------------------------------------------- */ int Swig_VargetToFunction(Node *n, int flags) { String *cres, *call; String *name; SwigType *type; SwigType *ty = 0; int varcref = flags & CWRAP_NATURAL_VAR; name = Getattr(n, "name"); type = Getattr(n, "type"); ty = Swig_wrapped_var_type(type, varcref); if (flags & CWRAP_EXTEND) { String *sname = Swig_name_get(0, name); String *mangled = Swig_name_mangle(sname); call = Swig_cfunction_call(mangled, 0); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(mangled); Delete(sname); } else { String *nname = 0; if (Equal(nodeType(n), "constant")) { String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); nname = NewStringf("(%s)", value); } else { nname = SwigType_namestr(name); } call = Swig_wrapped_var_assign(type, nname, varcref); cres = Swig_cresult(ty, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(nname); } Setattr(n, "type", ty); Delattr(n, "parms"); Delete(cres); Delete(call); Delete(ty); return SWIG_OK; } swig-3.0.12/Source/Swig/deprecate.c0000664000175000017500000000753213042756442016715 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * deprecate.c * * The functions in this file are SWIG core functions that are deprecated * or which do not fit in nicely with everything else. Generally this means * that the function and/or API needs to be changed in some future release. * ----------------------------------------------------------------------------- */ #include "swig.h" /* --------------------------------------------------------------------- * ParmList_is_compactdefargs() * * Returns 1 if the parameter list passed in is marked for compact argument * handling (by the "compactdefargs" attribute). Otherwise returns 0. * ---------------------------------------------------------------------- */ /* Discussion: "compactdefargs" is a property set by the Parser to indicate special handling of default arguments. This property seems to be something that is associated with functions and methods rather than low-level ParmList objects. Therefore, I don't like the fact that this special purpose feature is bolted onto the side of ParmList objects. Proposed solution: 1. "compactdefargs" should be a feature set on function/method nodes instead of ParmList objects. For example, if you have a function, you would check the function node to see if the parameters are to be handled in this way. Difficulties: 1. This is used by functions in cwrap.c and emit.cxx, none of which are passed information about the function/method node. We might have to change the API of those functions to make this work correctly. For example: int emit_num_required(ParmList *parms) might become int emit_num_required(ParmList *parms, int compactargs) */ int ParmList_is_compactdefargs(ParmList *p) { int compactdefargs = 0; if (p) { compactdefargs = Getattr(p, "compactdefargs") ? 1 : 0; /* The "compactdefargs" attribute should only be set on the first parameter in the list. * However, sometimes an extra parameter is inserted at the beginning of the parameter list, * so we check the 2nd parameter too. */ if (!compactdefargs) { Parm *nextparm = nextSibling(p); compactdefargs = (nextparm && Getattr(nextparm, "compactdefargs")) ? 1 : 0; } } return compactdefargs; } /* --------------------------------------------------------------------- * ParmList_errorstr() * * Generate a prototype string suitable for use in error/warning messages. * Similar to ParmList_protostr() but is also aware of hidden parameters. * ---------------------------------------------------------------------- */ /* Discussion. This function is used to generate error messages, but take into account that there might be a hidden parameter. Although this involves parameter lists, it really isn't a core feature of swigparm.h or parms.c. This is because the "hidden" attribute of parameters is added elsewhere (cwrap.c). For now, this function is placed here because it doesn't really seem to fit in with the parms.c interface. */ String *ParmList_errorstr(ParmList *p) { String *out = NewStringEmpty(); while (p) { if (Getattr(p,"hidden")) { p = nextSibling(p); } else { String *pstr = SwigType_str(Getattr(p, "type"), 0); Append(out, pstr); p = nextSibling(p); if (p) { Append(out, ","); } Delete(pstr); } } return out; } swig-3.0.12/Source/Swig/wrapfunc.c0000664000175000017500000003100213042756442016573 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * wrapfunc.c * * This file defines a object for creating wrapper functions. Primarily * this is used for convenience since it allows pieces of a wrapper function * to be created in a piecemeal manner. * ----------------------------------------------------------------------------- */ #include "swig.h" #include static int Compact_mode = 0; /* set to 0 on default */ static int Max_line_size = 128; /* ----------------------------------------------------------------------------- * NewWrapper() * * Create a new wrapper function object. * ----------------------------------------------------------------------------- */ Wrapper *NewWrapper(void) { Wrapper *w; w = (Wrapper *) malloc(sizeof(Wrapper)); w->localh = NewHash(); w->locals = NewStringEmpty(); w->code = NewStringEmpty(); w->def = NewStringEmpty(); return w; } /* ----------------------------------------------------------------------------- * DelWrapper() * * Delete a wrapper function object. * ----------------------------------------------------------------------------- */ void DelWrapper(Wrapper *w) { Delete(w->localh); Delete(w->locals); Delete(w->code); Delete(w->def); free(w); } /* ----------------------------------------------------------------------------- * Wrapper_compact_print_mode_set() * * Set compact_mode. * ----------------------------------------------------------------------------- */ void Wrapper_compact_print_mode_set(int flag) { Compact_mode = flag; } /* ----------------------------------------------------------------------------- * Wrapper_pretty_print() * * Formats a wrapper function and fixes up the indentation. * ----------------------------------------------------------------------------- */ void Wrapper_pretty_print(String *str, File *f) { String *ts; int level = 0; int c, i; int empty = 1; int indent = 2; int plevel = 0; int label = 0; ts = NewStringEmpty(); Seek(str, 0, SEEK_SET); while ((c = Getc(str)) != EOF) { if (c == '\"') { Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\"') break; } empty = 0; } else if (c == '\'') { Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\'') break; } empty = 0; } else if (c == ':') { Putc(c, ts); if ((c = Getc(str)) == '\n') { if (!empty && !strchr(Char(ts), '?')) label = 1; } Ungetc(c, str); } else if (c == '(') { Putc(c, ts); plevel += indent; empty = 0; } else if (c == ')') { Putc(c, ts); plevel -= indent; empty = 0; } else if (c == '{') { Putc(c, ts); Putc('\n', ts); for (i = 0; i < level; i++) Putc(' ', f); Printf(f, "%s", ts); Clear(ts); level += indent; while ((c = Getc(str)) != EOF) { if (!isspace(c)) { Ungetc(c, str); break; } } empty = 0; } else if (c == '}') { if (!empty) { Putc('\n', ts); for (i = 0; i < level; i++) Putc(' ', f); Printf(f, "%s", ts); Clear(ts); } level -= indent; Putc(c, ts); empty = 0; } else if (c == '\n') { Putc(c, ts); empty = 0; if (!empty) { int slevel = level; if (label && (slevel >= indent)) slevel -= indent; if ((Char(ts))[0] != '#') { for (i = 0; i < slevel; i++) Putc(' ', f); } Printf(f, "%s", ts); for (i = 0; i < plevel; i++) Putc(' ', f); } Clear(ts); label = 0; empty = 1; } else if (c == '/') { empty = 0; Putc(c, ts); c = Getc(str); if (c != EOF) { Putc(c, ts); if (c == '/') { /* C++ comment */ while ((c = Getc(str)) != EOF) { if (c == '\n') { Ungetc(c, str); break; } Putc(c, ts); } } else if (c == '*') { /* C comment */ int endstar = 0; while ((c = Getc(str)) != EOF) { if (endstar && c == '/') { /* end of C comment */ Putc(c, ts); break; } endstar = (c == '*'); Putc(c, ts); if (c == '\n') { /* multi-line C comment. Could be improved slightly. */ for (i = 0; i < level; i++) Putc(' ', ts); } } } } } else { if (!empty || !isspace(c)) { Putc(c, ts); empty = 0; } } } if (!empty) Printf(f, "%s", ts); Delete(ts); Printf(f, "\n"); } /* ----------------------------------------------------------------------------- * Wrapper_compact_print() * * Formats a wrapper function and fixes up the indentation. * Print out in compact format, with Compact enabled. * ----------------------------------------------------------------------------- */ void Wrapper_compact_print(String *str, File *f) { String *ts, *tf; /*temp string & temp file */ int level = 0; int c, i; int empty = 1; int indent = 2; ts = NewStringEmpty(); tf = NewStringEmpty(); Seek(str, 0, SEEK_SET); while ((c = Getc(str)) != EOF) { if (c == '\"') { /* string 1 */ empty = 0; Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\"') break; } } else if (c == '\'') { /* string 2 */ empty = 0; Putc(c, ts); while ((c = Getc(str)) != EOF) { if (c == '\\') { Putc(c, ts); c = Getc(str); } Putc(c, ts); if (c == '\'') break; } } else if (c == '{') { /* start of {...} */ empty = 0; Putc(c, ts); if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Clear(ts); level += indent; while ((c = Getc(str)) != EOF) { if (!isspace(c)) { Ungetc(c, str); break; } } } else if (c == '}') { /* end of {...} */ empty = 0; if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Putc(c, tf); Clear(ts); level -= indent; } else if (c == '\n') { /* line end */ while ((c = Getc(str)) != EOF) { if (!isspace(c)) break; } if (c == '#') { Putc('\n', ts); } else if (c == '}') { Putc(' ', ts); } else if ((c != EOF) || (Len(ts) != 0)) { if (Len(tf) == 0) { for (i = 0; i < level; i++) Putc(' ', tf); } else if ((Len(tf) + Len(ts)) < Max_line_size) { Putc(' ', tf); } else { Putc('\n', tf); Printf(f, "%s", tf); Clear(tf); for (i = 0; i < level; i++) Putc(' ', tf); } Append(tf, ts); Clear(ts); } Ungetc(c, str); empty = 1; } else if (c == '/') { /* comment */ empty = 0; c = Getc(str); if (c != EOF) { if (c == '/') { /* C++ comment */ while ((c = Getc(str)) != EOF) { if (c == '\n') { Ungetc(c, str); break; } } } else if (c == '*') { /* C comment */ int endstar = 0; while ((c = Getc(str)) != EOF) { if (endstar && c == '/') { /* end of C comment */ break; } endstar = (c == '*'); } } else { Putc('/', ts); Putc(c, ts); } } } else if (c == '#') { /* Preprocessor line */ Putc('#', ts); while ((c = Getc(str)) != EOF) { Putc(c, ts); if (c == '\\') { /* Continued line of the same PP */ c = Getc(str); if (c == '\n') Putc(c, ts); else Ungetc(c, str); } else if (c == '\n') break; } if (!empty) { Append(tf, "\n"); } Append(tf, ts); Printf(f, "%s", tf); Clear(tf); Clear(ts); for (i = 0; i < level; i++) Putc(' ', tf); empty = 1; } else { if (!empty || !isspace(c)) { Putc(c, ts); empty = 0; } } } if (!empty) { Append(tf, ts); } if (Len(tf) != 0) Printf(f, "%s", tf); Delete(ts); Delete(tf); Printf(f, "\n"); } /* ----------------------------------------------------------------------------- * Wrapper_print() * * Print out a wrapper function. Does pretty or compact printing as well. * ----------------------------------------------------------------------------- */ void Wrapper_print(Wrapper *w, File *f) { String *str; str = NewStringEmpty(); Printf(str, "%s\n", w->def); Printf(str, "%s\n", w->locals); Printf(str, "%s\n", w->code); if (Compact_mode == 1) Wrapper_compact_print(str, f); else Wrapper_pretty_print(str, f); Delete(str); } /* ----------------------------------------------------------------------------- * Wrapper_add_local() * * Adds a new local variable declaration to a function. Returns -1 if already * present (which may or may not be okay to the caller). * ----------------------------------------------------------------------------- */ int Wrapper_add_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl) { /* See if the local has already been declared */ if (Getattr(w->localh, name)) { return -1; } Setattr(w->localh, name, decl); Printf(w->locals, "%s;\n", decl); return 0; } /* ----------------------------------------------------------------------------- * Wrapper_add_localv() * * Same as add_local(), but allows a NULL terminated list of strings to be * used as a replacement for decl. This saves the caller the trouble of having * to manually construct the 'decl' string before calling. * ----------------------------------------------------------------------------- */ int Wrapper_add_localv(Wrapper *w, const_String_or_char_ptr name, ...) { va_list ap; int ret; String *decl; DOH *obj; decl = NewStringEmpty(); va_start(ap, name); obj = va_arg(ap, void *); while (obj) { Append(decl, obj); Putc(' ', decl); obj = va_arg(ap, void *); } va_end(ap); ret = Wrapper_add_local(w, name, decl); Delete(decl); return ret; } /* ----------------------------------------------------------------------------- * Wrapper_check_local() * * Check to see if a local name has already been declared * ----------------------------------------------------------------------------- */ int Wrapper_check_local(Wrapper *w, const_String_or_char_ptr name) { if (Getattr(w->localh, name)) { return 1; } return 0; } /* ----------------------------------------------------------------------------- * Wrapper_new_local() * * Adds a new local variable with a guarantee that a unique local name will be * used. Returns the name that was actually selected. * ----------------------------------------------------------------------------- */ char *Wrapper_new_local(Wrapper *w, const_String_or_char_ptr name, const_String_or_char_ptr decl) { int i; String *nname = NewString(name); String *ndecl = NewString(decl); char *ret; i = 0; while (Wrapper_check_local(w, nname)) { Clear(nname); Printf(nname, "%s%d", name, i); i++; } Replace(ndecl, name, nname, DOH_REPLACE_ID); Setattr(w->localh, nname, ndecl); Printf(w->locals, "%s;\n", ndecl); ret = Char(nname); Delete(nname); Delete(ndecl); return ret; /* Note: nname should still exists in the w->localh hash */ } /* ----------------------------------------------------------------------------- * Wrapper_new_localv() * * Same as add_local(), but allows a NULL terminated list of strings to be * used as a replacement for decl. This saves the caller the trouble of having * to manually construct the 'decl' string before calling. * ----------------------------------------------------------------------------- */ char *Wrapper_new_localv(Wrapper *w, const_String_or_char_ptr name, ...) { va_list ap; char *ret; String *decl; DOH *obj; decl = NewStringEmpty(); va_start(ap, name); obj = va_arg(ap, void *); while (obj) { Append(decl, obj); Putc(' ', decl); obj = va_arg(ap, void *); } va_end(ap); ret = Wrapper_new_local(w, name, decl); Delete(decl); return ret; } swig-3.0.12/Source/Swig/swigfile.h0000664000175000017500000000400613042756442016570 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigfile.h * * File handling functions in the SWIG core * ----------------------------------------------------------------------------- */ extern List *Swig_add_directory(const_String_or_char_ptr dirname); extern void Swig_push_directory(const_String_or_char_ptr dirname); extern void Swig_pop_directory(void); extern String *Swig_last_file(void); extern List *Swig_search_path(void); extern FILE *Swig_include_open(const_String_or_char_ptr name); extern FILE *Swig_open(const_String_or_char_ptr name); extern String *Swig_read_file(FILE *f); extern String *Swig_include(const_String_or_char_ptr name); extern String *Swig_include_sys(const_String_or_char_ptr name); extern int Swig_insert_file(const_String_or_char_ptr name, File *outfile); extern void Swig_set_push_dir(int dopush); extern int Swig_get_push_dir(void); extern void Swig_register_filebyname(const_String_or_char_ptr filename, File *outfile); extern File *Swig_filebyname(const_String_or_char_ptr filename); extern String *Swig_file_extension(const_String_or_char_ptr filename); extern String *Swig_file_basename(const_String_or_char_ptr filename); extern String *Swig_file_filename(const_String_or_char_ptr filename); extern String *Swig_file_dirname(const_String_or_char_ptr filename); extern void Swig_file_debug_set(); /* Delimiter used in accessing files and directories */ #if defined(MACSWIG) # define SWIG_FILE_DELIMITER ":" #elif defined(_WIN32) # define SWIG_FILE_DELIMITER "\\" #else # define SWIG_FILE_DELIMITER "/" #endif swig-3.0.12/Source/Swig/extend.c0000664000175000017500000001124613042756442016245 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * extend.c * * Extensions support (%extend) * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" static Hash *extendhash = 0; /* Hash table of added methods */ /* ----------------------------------------------------------------------------- * Swig_extend_hash() * * Access the extend hash * ----------------------------------------------------------------------------- */ Hash *Swig_extend_hash(void) { if (!extendhash) extendhash = NewHash(); return extendhash; } /* ----------------------------------------------------------------------------- * Swig_extend_merge() * * Extension merge. This function is used to handle the %extend directive * when it appears before a class definition. To handle this, the %extend * actually needs to take precedence. Therefore, we will selectively nuke symbols * from the current symbol table, replacing them with the added methods. * ----------------------------------------------------------------------------- */ void Swig_extend_merge(Node *cls, Node *am) { Node *n; Node *csym; n = firstChild(am); while (n) { String *symname; if (Strcmp(nodeType(n),"constructor") == 0) { symname = Getattr(n,"sym:name"); if (symname) { if (Strcmp(symname,Getattr(n,"name")) == 0) { /* If the name and the sym:name of a constructor are the same, then it hasn't been renamed. However---the name of the class itself might have been renamed so we need to do a consistency check here */ if (Getattr(cls,"sym:name")) { Setattr(n,"sym:name", Getattr(cls,"sym:name")); } } } } symname = Getattr(n,"sym:name"); DohIncref(symname); if ((symname) && (!Getattr(n,"error"))) { /* Remove node from its symbol table */ Swig_symbol_remove(n); csym = Swig_symbol_add(symname,n); if (csym != n) { /* Conflict with previous definition. Nuke previous definition */ String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); Printf(ec,"Identifier '%s' redefined by %%extend (ignored),",symname); Printf(en,"%%extend definition of '%s'.",symname); SWIG_WARN_NODE_BEGIN(n); Swig_warning(WARN_PARSE_REDEFINED,Getfile(csym),Getline(csym),"%s\n",ec); Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en); SWIG_WARN_NODE_END(n); Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(csym),Getline(csym),ec, Getfile(n),Getline(n),en); Setattr(csym,"error",e); Delete(e); Delete(en); Delete(ec); Swig_symbol_remove(csym); /* Remove class definition */ Swig_symbol_add(symname,n); /* Insert extend definition */ } } n = nextSibling(n); } } /* ----------------------------------------------------------------------------- * Swig_extend_append_previous() * ----------------------------------------------------------------------------- */ void Swig_extend_append_previous(Node *cls, Node *am) { Node *n, *ne; Node *pe = 0; Node *ae = 0; if (!am) return; n = firstChild(am); while (n) { ne = nextSibling(n); set_nextSibling(n,0); /* typemaps and fragments need to be prepended */ if (((Cmp(nodeType(n),"typemap") == 0) || (Cmp(nodeType(n),"fragment") == 0))) { if (!pe) pe = new_node("extend"); appendChild(pe, n); } else { if (!ae) ae = new_node("extend"); appendChild(ae, n); } n = ne; } if (pe) prependChild(cls,pe); if (ae) appendChild(cls,ae); } /* ----------------------------------------------------------------------------- * Swig_extend_unused_check() * * Check for unused %extend. Special case, don't report unused * extensions for templates * ----------------------------------------------------------------------------- */ void Swig_extend_unused_check(void) { Iterator ki; if (!extendhash) return; for (ki = First(extendhash); ki.key; ki = Next(ki)) { if (!Strchr(ki.key,'<')) { SWIG_WARN_NODE_BEGIN(ki.item); Swig_warning(WARN_PARSE_EXTEND_UNDEF,Getfile(ki.item), Getline(ki.item), "%%extend defined for an undeclared class %s.\n", SwigType_namestr(ki.key)); SWIG_WARN_NODE_END(ki.item); } } } swig-3.0.12/Source/Swig/swigparm.h0000664000175000017500000000276713042756442016624 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigparm.h * * Functions related to the handling of function/method parameters and * parameter lists. * ----------------------------------------------------------------------------- */ /* Individual parameters */ extern Parm *NewParm(SwigType *type, const_String_or_char_ptr name, Node *from_node); extern Parm *NewParmWithoutFileLineInfo(SwigType *type, const_String_or_char_ptr name); extern Parm *NewParmNode(SwigType *type, Node *from_node); extern Parm *CopyParm(Parm *p); /* Parameter lists */ extern ParmList *CopyParmList(ParmList *); extern ParmList *CopyParmListMax(ParmList *, int count); extern int ParmList_len(ParmList *); extern int ParmList_numrequired(ParmList *); extern int ParmList_has_defaultargs(ParmList *p); /* Output functions */ extern String *ParmList_str(ParmList *); extern String *ParmList_str_defaultargs(ParmList *); extern String *ParmList_str_multibrackets(ParmList *); extern String *ParmList_protostr(ParmList *); swig-3.0.12/Source/Swig/stype.c0000664000175000017500000010507713042756442016130 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * stype.c * * This file provides general support for datatypes that are encoded in * the form of simple strings. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" #include /* ----------------------------------------------------------------------------- * Synopsis * * The purpose of this module is to provide a general purpose type representation * based on simple text strings. * * General idea: * * Types are represented by a base type (e.g., "int") and a collection of * type operators applied to the base (e.g., pointers, arrays, etc...). * * Encoding: * * Types are encoded as strings of type constructors such as follows: * * String Encoding C Example * --------------- --------- * p.p.int int ** * a(300).a(400).int int [300][400] * p.q(const).char char const * * * All type constructors are denoted by a trailing '.': * * 'p.' = Pointer (*) * 'r.' = Reference (&) * 'z.' = Rvalue reference (&&) * 'a(n).' = Array of size n [n] * 'f(..,..).' = Function with arguments (args) * 'q(str).' = Qualifier (such as const or volatile) (const, volatile) * 'm(qual).' = Pointer to member (qual::*) * * The encoding follows the order that you might describe a type in words. * For example "p.a(200).int" is "A pointer to array of int's" and * "p.q(const).char" is "a pointer to a const char". * * This representation of types is fairly convenient because ordinary string * operations can be used for type manipulation. For example, a type could be * formed by combining two strings such as the following: * * "p.p." + "a(400).int" = "p.p.a(400).int" * * Similarly, one could strip a 'const' declaration from a type doing something * like this: * * Replace(t,"q(const).","",DOH_REPLACE_ANY) * * For the most part, this module tries to minimize the use of special * characters (*, [, <, etc...) in its type encoding. One reason for this * is that SWIG might be extended to encode data in formats such as XML * where you might want to do this: * * * p.p.int * ... * * * Or alternatively, * * blah * * In either case, it's probably best to avoid characters such as '&', '*', or '<'. * * Why not use C syntax? Well, C syntax is fairly complicated to parse * and not particularly easy to manipulate---especially for adding, deleting and * composing type constructors. The string representation presented here makes * this pretty easy. * * Why not use a bunch of nested data structures? Are you kidding? How * would that be easier to use than a few simple string operations? * ----------------------------------------------------------------------------- */ SwigType *NewSwigType(int t) { switch (t) { case T_BOOL: return NewString("bool"); break; case T_INT: return NewString("int"); break; case T_UINT: return NewString("unsigned int"); break; case T_SHORT: return NewString("short"); break; case T_USHORT: return NewString("unsigned short"); break; case T_LONG: return NewString("long"); break; case T_ULONG: return NewString("unsigned long"); break; case T_FLOAT: return NewString("float"); break; case T_DOUBLE: return NewString("double"); break; case T_COMPLEX: return NewString("complex"); break; case T_CHAR: return NewString("char"); break; case T_SCHAR: return NewString("signed char"); break; case T_UCHAR: return NewString("unsigned char"); break; case T_STRING: { SwigType *t = NewString("char"); SwigType_add_qualifier(t, "const"); SwigType_add_pointer(t); return t; break; } case T_WCHAR: return NewString("wchar_t"); break; case T_WSTRING: { SwigType *t = NewString("wchar_t"); SwigType_add_pointer(t); return t; break; } case T_LONGLONG: return NewString("long long"); break; case T_ULONGLONG: return NewString("unsigned long long"); break; case T_VOID: return NewString("void"); break; case T_AUTO: return NewString("auto"); break; default: break; } return NewStringEmpty(); } /* ----------------------------------------------------------------------------- * SwigType_push() * * Push a type constructor onto the type * ----------------------------------------------------------------------------- */ void SwigType_push(SwigType *t, String *cons) { if (!cons) return; if (!Len(cons)) return; if (Len(t)) { char *c = Char(cons); if (c[strlen(c) - 1] != '.') Insert(t, 0, "."); } Insert(t, 0, cons); } /* ----------------------------------------------------------------------------- * SwigType_ispointer_return() * * Testing functions for querying a raw datatype * ----------------------------------------------------------------------------- */ int SwigType_ispointer_return(const SwigType *t) { char *c; int idx; if (!t) return 0; c = Char(t); idx = (int)strlen(c) - 4; if (idx >= 0) { return (strcmp(c + idx, ").p.") == 0); } return 0; } int SwigType_isreference_return(const SwigType *t) { char *c; int idx; if (!t) return 0; c = Char(t); idx = (int)strlen(c) - 4; if (idx >= 0) { return (strcmp(c + idx, ").r.") == 0); } return 0; } int SwigType_isconst(const SwigType *t) { char *c; if (!t) return 0; c = Char(t); if (strncmp(c, "q(", 2) == 0) { String *q = SwigType_parm(t); if (strstr(Char(q), "const")) { Delete(q); return 1; } Delete(q); } /* Hmmm. Might be const through a typedef */ if (SwigType_issimple(t)) { int ret; SwigType *td = SwigType_typedef_resolve(t); if (td) { ret = SwigType_isconst(td); Delete(td); return ret; } } return 0; } int SwigType_ismutable(const SwigType *t) { int r; SwigType *qt = SwigType_typedef_resolve_all(t); if (SwigType_isreference(qt) || SwigType_isrvalue_reference(qt) || SwigType_isarray(qt)) { Delete(SwigType_pop(qt)); } r = SwigType_isconst(qt); Delete(qt); return r ? 0 : 1; } int SwigType_isenum(const SwigType *t) { char *c = Char(t); if (!t) return 0; if (strncmp(c, "enum ", 5) == 0) { return 1; } return 0; } int SwigType_issimple(const SwigType *t) { char *c = Char(t); if (!t) return 0; while (*c) { if (*c == '<') { int nest = 1; c++; while (*c && nest) { if (*c == '<') nest++; if (*c == '>') nest--; c++; } c--; } if (*c == '.') return 0; c++; } return 1; } /* ----------------------------------------------------------------------------- * SwigType_default_create() * * Create the default type for this datatype. This takes a type and strips it * down to a generic form first by resolving all typedefs. * * Rules: * Pointers: p.SWIGTYPE * References: r.SWIGTYPE * Arrays no dimension: a().SWIGTYPE * Arrays with dimension: a(ANY).SWIGTYPE * Member pointer: m(CLASS).SWIGTYPE * Function pointer: f(ANY).SWIGTYPE * Enums: enum SWIGTYPE * Types: SWIGTYPE * * Examples (also see SwigType_default_deduce): * * int [2][4] * a(2).a(4).int * a(ANY).a(ANY).SWIGTYPE * * struct A {}; * typedef A *Aptr; * Aptr const & * r.q(const).Aptr * r.q(const).p.SWIGTYPE * * enum E {e1, e2}; * enum E const & * r.q(const).enum E * r.q(const).enum SWIGTYPE * ----------------------------------------------------------------------------- */ SwigType *SwigType_default_create(const SwigType *ty) { SwigType *r = 0; List *l; Iterator it; int numitems; if (!SwigType_isvarargs(ty)) { SwigType *t = SwigType_typedef_resolve_all(ty); r = NewStringEmpty(); l = SwigType_split(t); numitems = Len(l); if (numitems >= 1) { String *last_subtype = Getitem(l, numitems-1); if (SwigType_isenum(last_subtype)) Setitem(l, numitems-1, NewString("enum SWIGTYPE")); else Setitem(l, numitems-1, NewString("SWIGTYPE")); } for (it = First(l); it.item; it = Next(it)) { String *subtype = it.item; if (SwigType_isarray(subtype)) { if (Equal(subtype, "a().")) Append(r, NewString("a().")); else Append(r, NewString("a(ANY).")); } else if (SwigType_isfunction(subtype)) { Append(r, NewString("f(ANY).SWIGTYPE")); break; } else if (SwigType_ismemberpointer(subtype)) { Append(r, NewString("m(CLASS).SWIGTYPE")); break; } else { Append(r, subtype); } } Delete(l); Delete(t); } return r; } /* ----------------------------------------------------------------------------- * SwigType_default_deduce() * * This function implements type deduction used in the typemap matching rules * and is very close to the type deduction used in partial template class * specialization matching in that the most specialized type is always chosen. * SWIGTYPE is used as the generic type. The basic idea is to repeatedly call * this function to find a deduced type unless until nothing matches. * * The type t must have already been converted to the default type via a call to * SwigType_default_create() before calling this function. * * Example deductions (matching the examples described in SwigType_default_create), * where the most specialized matches are highest in the list: * * a(ANY).a(ANY).SWIGTYPE * a(ANY).a().SWIGTYPE * a(ANY).p.SWIGTYPE * a(ANY).SWIGTYPE * a().SWIGTYPE * p.SWIGTYPE * SWIGTYPE * * r.q(const).p.SWIGTYPE * r.q(const).SWIGTYPE * r.SWIGTYPE * SWIGTYPE * * r.q(const).enum SWIGTYPE * r.enum SWIGTYPE * r.SWIGTYPE * SWIGTYPE * ----------------------------------------------------------------------------- */ SwigType *SwigType_default_deduce(const SwigType *t) { SwigType *r = NewStringEmpty(); List *l; Iterator it; int numitems; l = SwigType_split(t); numitems = Len(l); if (numitems >= 1) { String *last_subtype = Getitem(l, numitems-1); int is_enum = SwigType_isenum(last_subtype); if (numitems >=2 ) { String *subtype = Getitem(l, numitems-2); /* last but one */ if (SwigType_isarray(subtype)) { if (is_enum) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* array deduction, a(ANY). => a(). => p. */ String *deduced_subtype = 0; if (Strcmp(subtype, "a().") == 0) { deduced_subtype = NewString("p."); } else if (Strcmp(subtype, "a(ANY).") == 0) { deduced_subtype = NewString("a()."); } else { assert(0); } Setitem(l, numitems-2, deduced_subtype); } } else if (SwigType_ismemberpointer(subtype)) { /* member pointer deduction, m(CLASS). => p. */ Setitem(l, numitems-2, NewString("p.")); } else if (is_enum && !SwigType_isqualifier(subtype)) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* simple type deduction, eg, r.p.p. => r.p. */ /* also function pointers eg, p.f(ANY). => p. */ Delitem(l, numitems-2); } } else { if (is_enum) { /* enum deduction, enum SWIGTYPE => SWIGTYPE */ Setitem(l, numitems-1, NewString("SWIGTYPE")); } else { /* delete the only item, we are done with deduction */ Delitem(l, 0); } } } else { assert(0); } for (it = First(l); it.item; it = Next(it)) { Append(r, it.item); } if (Len(r) == 0) { Delete(r); r = 0; } Delete(l); return r; } /* ----------------------------------------------------------------------------- * SwigType_namestr() * * Returns a string of the base type. Takes care of template expansions * ----------------------------------------------------------------------------- */ String *SwigType_namestr(const SwigType *t) { String *r; String *suffix; List *p; int i, sz; char *d = Char(t); char *c = strstr(d, "<("); if (!c || !strstr(c + 2, ")>")) return NewString(t); r = NewStringWithSize(d, (int)(c - d)); if (*(c - 1) == '<') Putc(' ', r); Putc('<', r); p = SwigType_parmlist(c + 1); sz = Len(p); for (i = 0; i < sz; i++) { String *str = SwigType_str(Getitem(p, i), 0); /* Avoid creating a <: token, which is the same as [ in C++ - put a space after '<'. */ if (i == 0 && Len(str)) Putc(' ', r); Append(r, str); if ((i + 1) < sz) Putc(',', r); Delete(str); } Putc(' ', r); Putc('>', r); suffix = SwigType_templatesuffix(t); if (Len(suffix) > 0) { String *suffix_namestr = SwigType_namestr(suffix); Append(r, suffix_namestr); Delete(suffix_namestr); } else { Append(r, suffix); } Delete(suffix); Delete(p); return r; } /* ----------------------------------------------------------------------------- * SwigType_str() * * Create a C string representation of a datatype. * ----------------------------------------------------------------------------- */ String *SwigType_str(const SwigType *s, const_String_or_char_ptr id) { String *result; String *element = 0; String *nextelement; String *forwardelement; List *elements; int nelements, i; if (id) { /* stringify the id expanding templates, for example when the id is a fully qualified templated class name */ String *id_str = NewString(id); /* unfortunate copy due to current const limitations */ result = SwigType_str(id_str, 0); Delete(id_str); } else { result = NewStringEmpty(); } elements = SwigType_split(s); nelements = Len(elements); if (nelements > 0) { element = Getitem(elements, 0); } /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { if (i < (nelements - 1)) { nextelement = Getitem(elements, i + 1); forwardelement = nextelement; if (SwigType_isqualifier(nextelement)) { if (i < (nelements - 2)) forwardelement = Getitem(elements, i + 2); } } else { nextelement = 0; forwardelement = 0; } if (SwigType_isqualifier(element)) { DOH *q = 0; q = SwigType_parm(element); Insert(result, 0, " "); Insert(result, 0, q); Delete(q); } else if (SwigType_ispointer(element)) { Insert(result, 0, "*"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_ismemberpointer(element)) { String *q; q = SwigType_parm(element); Insert(result, 0, "::*"); Insert(result, 0, q); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } Delete(q); } else if (SwigType_isreference(element)) { Insert(result, 0, "&"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isrvalue_reference(element)) { Insert(result, 0, "&&"); if ((nextelement) && ((SwigType_isfunction(nextelement) || (SwigType_isarray(nextelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_isarray(element)) { DOH *size; Append(result, "["); size = SwigType_parm(element); Append(result, size); Append(result, "]"); Delete(size); } else if (SwigType_isfunction(element)) { DOH *parms, *p; int j, plen; Append(result, "("); parms = SwigType_parmlist(element); plen = Len(parms); for (j = 0; j < plen; j++) { p = SwigType_str(Getitem(parms, j), 0); Append(result, p); if (j < (plen - 1)) Append(result, ","); } Append(result, ")"); Delete(parms); } else { if (strcmp(Char(element), "v(...)") == 0) { Insert(result, 0, "..."); } else { String *bs = SwigType_namestr(element); Insert(result, 0, " "); Insert(result, 0, bs); Delete(bs); } } element = nextelement; } Delete(elements); Chop(result); return result; } /* ----------------------------------------------------------------------------- * SwigType_ltype(const SwigType *ty) * * Create a locally assignable type * ----------------------------------------------------------------------------- */ SwigType *SwigType_ltype(const SwigType *s) { String *result; String *element; SwigType *td, *tc = 0; List *elements; int nelements, i; int firstarray = 1; int notypeconv = 0; result = NewStringEmpty(); tc = Copy(s); /* Nuke all leading qualifiers */ while (SwigType_isqualifier(tc)) { Delete(SwigType_pop(tc)); } if (SwigType_issimple(tc)) { /* Resolve any typedef definitions */ SwigType *tt = Copy(tc); td = 0; while ((td = SwigType_typedef_resolve(tt))) { if (td && (SwigType_isconst(td) || SwigType_isarray(td) || SwigType_isreference(td) || SwigType_isrvalue_reference(td))) { /* We need to use the typedef type */ Delete(tt); break; } else if (td) { Delete(tt); tt = td; } } if (td) { Delete(tc); tc = td; } } elements = SwigType_split(tc); nelements = Len(elements); /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { element = Getitem(elements, i); /* when we see a function, we need to preserve the following types */ if (SwigType_isfunction(element)) { notypeconv = 1; } if (SwigType_isqualifier(element)) { /* Do nothing. Ignore */ } else if (SwigType_ispointer(element)) { Append(result, element); firstarray = 0; } else if (SwigType_ismemberpointer(element)) { Append(result, element); firstarray = 0; } else if (SwigType_isreference(element)) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isrvalue_reference(element)) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isarray(element) && firstarray) { if (notypeconv) { Append(result, element); } else { Append(result, "p."); } firstarray = 0; } else if (SwigType_isenum(element)) { int anonymous_enum = (Cmp(element, "enum ") == 0); if (notypeconv || !anonymous_enum) { Append(result, element); } else { Append(result, "int"); } } else { Append(result, element); } } Delete(elements); Delete(tc); return result; } /* ----------------------------------------------------------------------------- * SwigType_lstr(DOH *s, DOH *id) * * Produces a type-string that is suitable as a lvalue in an expression. * That is, a type that can be freely assigned a value without violating * any C assignment rules. * * - Qualifiers such as 'const' and 'volatile' are stripped. * - Arrays are converted into a *single* pointer (i.e., * double [][] becomes double *). * - References are converted into a pointer. * - Typedef names that refer to read-only types will be replaced * with an equivalent assignable version. * -------------------------------------------------------------------- */ String *SwigType_lstr(const SwigType *s, const_String_or_char_ptr id) { String *result; SwigType *tc; tc = SwigType_ltype(s); result = SwigType_str(tc, id); Delete(tc); return result; } /* ----------------------------------------------------------------------------- * SwigType_rcaststr() * * Produces a casting string that maps the type returned by lstr() to the real * datatype printed by str(). * ----------------------------------------------------------------------------- */ String *SwigType_rcaststr(const SwigType *s, const_String_or_char_ptr name) { String *result, *cast; String *element = 0; String *nextelement; String *forwardelement; SwigType *td, *tc = 0; const SwigType *rs; List *elements; int nelements, i; int clear = 1; int firstarray = 1; int isreference = 0; int isfunction = 0; result = NewStringEmpty(); if (SwigType_isconst(s)) { tc = Copy(s); Delete(SwigType_pop(tc)); rs = tc; } else { rs = s; } if ((SwigType_isconst(rs) || SwigType_isarray(rs) || SwigType_isreference(rs) || SwigType_isrvalue_reference(rs))) { td = 0; } else { td = SwigType_typedef_resolve(rs); } if (td) { if ((SwigType_isconst(td) || SwigType_isarray(td) || SwigType_isreference(td) || SwigType_isrvalue_reference(td))) { elements = SwigType_split(td); } else { elements = SwigType_split(rs); } Delete(td); } else { elements = SwigType_split(rs); } nelements = Len(elements); if (nelements > 0) { element = Getitem(elements, 0); } /* Now, walk the type list and start emitting */ for (i = 0; i < nelements; i++) { if (i < (nelements - 1)) { nextelement = Getitem(elements, i + 1); forwardelement = nextelement; if (SwigType_isqualifier(nextelement)) { if (i < (nelements - 2)) forwardelement = Getitem(elements, i + 2); } } else { nextelement = 0; forwardelement = 0; } if (SwigType_isqualifier(element)) { DOH *q = 0; q = SwigType_parm(element); Insert(result, 0, " "); Insert(result, 0, q); Delete(q); clear = 0; } else if (SwigType_ispointer(element)) { Insert(result, 0, "*"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } firstarray = 0; } else if (SwigType_ismemberpointer(element)) { String *q; Insert(result, 0, "::*"); q = SwigType_parm(element); Insert(result, 0, q); Delete(q); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } firstarray = 0; } else if (SwigType_isreference(element)) { Insert(result, 0, "&"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } if (!isfunction) isreference = 1; } else if (SwigType_isrvalue_reference(element)) { Insert(result, 0, "&&"); if ((forwardelement) && ((SwigType_isfunction(forwardelement) || (SwigType_isarray(forwardelement))))) { Insert(result, 0, "("); Append(result, ")"); } if (!isfunction) isreference = 1; clear = 0; } else if (SwigType_isarray(element)) { DOH *size; if (firstarray && !isreference) { Append(result, "(*)"); firstarray = 0; } else { Append(result, "["); size = SwigType_parm(element); Append(result, size); Append(result, "]"); Delete(size); clear = 0; } } else if (SwigType_isfunction(element)) { DOH *parms, *p; int j, plen; Append(result, "("); parms = SwigType_parmlist(element); plen = Len(parms); for (j = 0; j < plen; j++) { p = SwigType_str(Getitem(parms, j), 0); Append(result, p); Delete(p); if (j < (plen - 1)) Append(result, ","); } Append(result, ")"); Delete(parms); isfunction = 1; } else { String *bs = SwigType_namestr(element); Insert(result, 0, " "); Insert(result, 0, bs); Delete(bs); } element = nextelement; } Delete(elements); if (clear) { cast = NewStringEmpty(); } else { cast = NewStringf("(%s)", result); } if (name) { if (isreference) { Append(cast, "*"); } Append(cast, name); } Delete(result); Delete(tc); return cast; } /* ----------------------------------------------------------------------------- * SwigType_lcaststr() * * Casts a variable from the real type to the local datatype. * ----------------------------------------------------------------------------- */ String *SwigType_lcaststr(const SwigType *s, const_String_or_char_ptr name) { String *result; result = NewStringEmpty(); if (SwigType_isarray(s)) { String *lstr = SwigType_lstr(s, 0); Printf(result, "(%s)%s", lstr, name); Delete(lstr); } else if (SwigType_isreference(s)) { String *str = SwigType_str(s, 0); Printf(result, "(%s)", str); Delete(str); if (name) Append(result, name); } else if (SwigType_isrvalue_reference(s)) { String *str = SwigType_str(s, 0); Printf(result, "(%s)", str); Delete(str); if (name) Append(result, name); } else if (SwigType_isqualifier(s)) { String *lstr = SwigType_lstr(s, 0); Printf(result, "(%s)%s", lstr, name); Delete(lstr); } else { if (name) Append(result, name); } return result; } #if 0 /* Alternative implementation for manglestr_default. Mangling is similar to the original except for a few subtle differences for example in templates: namespace foo { template class bar {}; typedef int Integer; void test2(bar *x); } Mangling is more consistent and changes from _p_foo__barT_int_p_t to _p_foo__barT_p_int_t. */ static void mangle_stringcopy(String *destination, const char *source, int count) { while (count-- > 0) { char newc = '_'; if (!(*source == '.' || *source == ':' || *source == ' ')) newc = *source; /* TODO: occasionally '*' or numerics need converting to '_', eg in array dimensions and template expressions */ Putc(newc, destination); source++; } } static void mangle_subtype(String *mangled, SwigType *s); /* ----------------------------------------------------------------------------- * mangle_namestr() * * Mangles a type taking care of template expansions. Similar to SwigType_namestr(). * The type may include a trailing '.', for example "p." * ----------------------------------------------------------------------------- */ static void mangle_namestr(String *mangled, SwigType *t) { int length = Len(t); if (SwigType_isqualifier(t)) { Append(mangled, "q_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_ismemberpointer(t)) { Append(mangled, "m_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_isarray(t)) { Append(mangled, "a_"); mangle_stringcopy(mangled, Char(t)+2, length-4); Append(mangled, "__"); } else if (SwigType_isfunction(t)) { List *p = SwigType_parmlist(t); int sz = Len(p); int i; Append(mangled, "f_"); for (i = 0; i < sz; i++) { mangle_subtype(mangled, Getitem(p, i)); Putc('_', mangled); } Append(mangled, (sz > 0) ? "_" : "__"); } else if (SwigType_isvarargs(t)) { Append(mangled, "___"); } else { char *d = Char(t); char *c = strstr(d, "<("); if (!c || !strstr(c + 2, ")>")) { /* not a template type */ mangle_stringcopy(mangled, Char(t), Len(t)); } else { /* a template type */ String *suffix; List *p; int i, sz; mangle_stringcopy(mangled, d, c-d); Putc('T', mangled); Putc('_', mangled); p = SwigType_parmlist(c + 1); sz = Len(p); for (i = 0; i < sz; i++) { mangle_subtype(mangled, Getitem(p, i)); Putc('_', mangled); } Putc('t', mangled); suffix = SwigType_templatesuffix(t); if (Len(suffix) > 0) { mangle_namestr(mangled, suffix); } else { Append(mangled, suffix); } Delete(suffix); Delete(p); } } } static void mangle_subtype(String *mangled, SwigType *s) { List *elements; int nelements, i; assert(s); elements = SwigType_split(s); nelements = Len(elements); for (i = 0; i < nelements; i++) { SwigType *element = Getitem(elements, i); mangle_namestr(mangled, element); } Delete(elements); } static String *manglestr_default(const SwigType *s) { String *mangled = NewString("_"); SwigType *sr = SwigType_typedef_resolve_all(s); SwigType *sq = SwigType_typedef_qualified(sr); SwigType *ss = SwigType_remove_global_scope_prefix(sq); SwigType *type = ss; SwigType *lt; if (SwigType_istemplate(ss)) { SwigType *ty = Swig_symbol_template_deftype(ss, 0); Delete(ss); ss = ty; type = ss; } lt = SwigType_ltype(type); Replace(lt, "struct ", "", DOH_REPLACE_ANY); Replace(lt, "class ", "", DOH_REPLACE_ANY); Replace(lt, "union ", "", DOH_REPLACE_ANY); Replace(lt, "enum ", "", DOH_REPLACE_ANY); mangle_subtype(mangled, lt); Delete(ss); Delete(sq); Delete(sr); return mangled; } #else static String *manglestr_default(const SwigType *s) { char *c; String *result = 0; String *base = 0; SwigType *lt; SwigType *sr = SwigType_typedef_resolve_all(s); SwigType *sq = SwigType_typedef_qualified(sr); SwigType *ss = SwigType_remove_global_scope_prefix(sq); SwigType *type = ss; if (SwigType_istemplate(ss)) { SwigType *ty = Swig_symbol_template_deftype(ss, 0); Delete(ss); ss = ty; type = ss; } lt = SwigType_ltype(type); result = SwigType_prefix(lt); base = SwigType_base(lt); c = Char(result); while (*c) { if (!isalnum((int) *c)) *c = '_'; c++; } if (SwigType_istemplate(base)) { String *b = SwigType_namestr(base); Delete(base); base = b; } Replace(base, "struct ", "", DOH_REPLACE_ANY); /* This might be problematic */ Replace(base, "class ", "", DOH_REPLACE_ANY); Replace(base, "union ", "", DOH_REPLACE_ANY); Replace(base, "enum ", "", DOH_REPLACE_ANY); c = Char(base); while (*c) { if (*c == '<') *c = 'T'; else if (*c == '>') *c = 't'; else if (*c == '*') *c = 'p'; else if (*c == '[') *c = 'a'; else if (*c == ']') *c = 'A'; else if (*c == '&') *c = 'R'; else if (*c == '(') *c = 'f'; else if (*c == ')') *c = 'F'; else if (!isalnum((int) *c)) *c = '_'; c++; } Append(result, base); Insert(result, 0, "_"); Delete(lt); Delete(base); Delete(ss); Delete(sq); Delete(sr); return result; } #endif String *SwigType_manglestr(const SwigType *s) { #if 0 /* Debugging checks to ensure a proper SwigType is passed in and not a stringified type */ String *angle = Strstr(s, "<"); if (angle && Strncmp(angle, "<(", 2) != 0) Printf(stderr, "SwigType_manglestr error: %s\n", s); else if (Strstr(s, "*") || Strstr(s, "&") || Strstr(s, "[")) Printf(stderr, "SwigType_manglestr error: %s\n", s); #endif return manglestr_default(s); } /* ----------------------------------------------------------------------------- * SwigType_typename_replace() * * Replaces a typename in a type with something else. Needed for templates. * ----------------------------------------------------------------------------- */ void SwigType_typename_replace(SwigType *t, String *pat, String *rep) { String *nt; int i, ilen; List *elem; if (!Strstr(t, pat)) return; if (Equal(t, pat)) { Replace(t, pat, rep, DOH_REPLACE_ANY); return; } nt = NewStringEmpty(); elem = SwigType_split(t); ilen = Len(elem); for (i = 0; i < ilen; i++) { String *e = Getitem(elem, i); if (SwigType_issimple(e)) { if (Equal(e, pat)) { /* Replaces a type of the form 'pat' with 'rep' */ Replace(e, pat, rep, DOH_REPLACE_ANY); } else if (SwigType_istemplate(e)) { /* Replaces a type of the form 'pat' with 'rep' */ if (Equal(e, pat)) { String *repbase = SwigType_templateprefix(rep); Replace(e, pat, repbase, DOH_REPLACE_ID | DOH_REPLACE_FIRST); Delete(repbase); } { String *tsuffix; List *tparms = SwigType_parmlist(e); int j, jlen; String *nt = SwigType_templateprefix(e); Append(nt, "<("); jlen = Len(tparms); for (j = 0; j < jlen; j++) { SwigType_typename_replace(Getitem(tparms, j), pat, rep); Append(nt, Getitem(tparms, j)); if (j < (jlen - 1)) Putc(',', nt); } tsuffix = SwigType_templatesuffix(e); Printf(nt, ")>%s", tsuffix); Delete(tsuffix); Clear(e); Append(e, nt); Delete(nt); Delete(tparms); } } else if (Swig_scopename_check(e)) { String *first, *rest; first = Swig_scopename_first(e); rest = Swig_scopename_suffix(e); SwigType_typename_replace(rest, pat, rep); SwigType_typename_replace(first, pat, rep); Clear(e); Printv(e, first, "::", rest, NIL); Delete(first); Delete(rest); } } else if (SwigType_isfunction(e)) { int j, jlen; List *fparms = SwigType_parmlist(e); Clear(e); Append(e, "f("); jlen = Len(fparms); for (j = 0; j < jlen; j++) { SwigType_typename_replace(Getitem(fparms, j), pat, rep); Append(e, Getitem(fparms, j)); if (j < (jlen - 1)) Putc(',', e); } Append(e, ")."); Delete(fparms); } else if (SwigType_isarray(e)) { Replace(e, pat, rep, DOH_REPLACE_ID); } Append(nt, e); } Clear(t); Append(t, nt); Delete(nt); Delete(elem); } /* ----------------------------------------------------------------------------- * SwigType_remove_global_scope_prefix() * * Removes the unary scope operator (::) prefix indicating global scope in all * components of the type * ----------------------------------------------------------------------------- */ SwigType *SwigType_remove_global_scope_prefix(const SwigType *t) { SwigType *result; const char *type = Char(t); if (strncmp(type, "::", 2) == 0) type += 2; result = NewString(type); Replaceall(result, ".::", "."); Replaceall(result, "(::", "("); Replaceall(result, "enum ::", "enum "); return result; } /* ----------------------------------------------------------------------------- * SwigType_check_decl() * * Checks type declarators for a match * ----------------------------------------------------------------------------- */ int SwigType_check_decl(const SwigType *ty, const SwigType *decl) { SwigType *t, *t1, *t2; int r; t = SwigType_typedef_resolve_all(ty); t1 = SwigType_strip_qualifiers(t); t2 = SwigType_prefix(t1); r = Equal(t2, decl); Delete(t); Delete(t1); Delete(t2); return r == 1; } swig-3.0.12/Source/Modules/0000775000175000017500000000000013042756442015305 5ustar williamwilliamswig-3.0.12/Source/Modules/octave.cxx0000664000175000017500000014264413042756442017325 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * octave.cxx * * Octave language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static String *global_name = 0; static String *op_prefix = 0; static const char *usage = "\ Octave Options (available with -octave)\n\ -cppcast - Enable C++ casting operators (default)\n\ -globals - Set used to access C global variables [default: 'cvar']\n\ Use '.' to load C global variables into module namespace\n\ -nocppcast - Disable C++ casting operators\n\ -opprefix - Prefix for global operator functions [default: 'op_']\n\ \n"; class OCTAVE:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_doc; File *f_wrappers; File *f_init; File *f_initbeforefunc; File *f_directors; File *f_directors_h; String *s_global_tab; String *s_members_tab; String *class_name; int have_constructor; int have_destructor; String *constructor_name; Hash *docs; void Octave_begin_function(Node *n, File *f, const_String_or_char_ptr cname, const_String_or_char_ptr wname, bool dld) { if (dld) { String *tname = texinfo_name(n, "std::string()"); Printf(f, "SWIG_DEFUN( %s, %s, %s ) {", cname, wname, tname); } else { Printf(f, "static octave_value_list %s (const octave_value_list& args, int nargout) {", wname); } } public: OCTAVE(): f_begin(0), f_runtime(0), f_header(0), f_doc(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), f_directors(0), f_directors_h(0), s_global_tab(0), s_members_tab(0), class_name(0), have_constructor(0), have_destructor(0), constructor_name(0), docs(0) { /* Add code to manage protected constructors and directors */ director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " error(\"accessing abstract class or protected constructor\"); \n", " SWIG_fail;\n", "}\n", NIL); enable_cplus_runtime_mode(); allow_overloading(); director_multiple_inheritance = 1; director_language = 1; docs = NewHash(); } virtual void main(int argc, char *argv[]) { int cppcast = 1; for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-globals") == 0) { if (argv[i + 1]) { global_name = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-opprefix") == 0) { if (argv[i + 1]) { op_prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-cppcast") == 0) { cppcast = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { cppcast = 0; Swig_mark_arg(i); } } } if (!global_name) global_name = NewString("cvar"); if (!op_prefix) op_prefix = NewString("op_"); if(cppcast) Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0); SWIG_library_directory("octave"); Preprocessor_define("SWIGOCTAVE 1", 0); SWIG_config_file("octave.swg"); SWIG_typemap_lang("octave"); allow_overloading(); // Octave API is C++, so output must be C++ compatibile even when wrapping C code if (!cparse_cplusplus) Swig_cparse_cplusplusout(1); } virtual int top(Node *n) { { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) { dirprot = 1; } if (Getattr(options, "nodirprot")) { dirprot = 0; } if (Getattr(options, "directors")) { allow_directors(); if (dirprot) allow_dirprot(); } } } } String *module = Getattr(n, "name"); String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_header = NewString(""); f_doc = NewString(""); f_wrappers = NewString(""); f_init = NewString(""); f_initbeforefunc = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); s_global_tab = NewString(""); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("header", f_header); Swig_register_filebyname("doc", f_doc); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("init", f_init); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGOCTAVE\n#define SWIGOCTAVE\n#endif\n\n"); Printf(f_runtime, "#define SWIG_name_d \"%s\"\n", module); Printf(f_runtime, "#define SWIG_name %s\n", module); Printf(f_runtime, "\n"); Printf(f_runtime, "#define SWIG_global_name \"%s\"\n", global_name); Printf(f_runtime, "#define SWIG_op_prefix \"%s\"\n", op_prefix); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); Swig_banner(f_directors_h); if (dirprot_mode()) { // Printf(f_directors_h, "#include \n"); // Printf(f_directors_h, "#include \n\n"); } } Printf(f_runtime, "\n"); Printf(s_global_tab, "\nstatic const struct swig_octave_member swig_globals[] = {\n"); Printf(f_init, "static bool SWIG_init_user(octave_swig_type* module_ns)\n{\n"); if (!CPlusPlus) Printf(f_header,"extern \"C\" {\n"); Language::top(n); if (!CPlusPlus) Printf(f_header,"}\n"); if (Len(docs)) emit_doc_texinfo(); if (directorsEnabled()) { Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } Printf(f_init, "return true;\n}\n"); Printf(s_global_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, s_global_tab, NIL); SwigType_emit_type_table(f_runtime, f_wrappers); Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_doc, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_begin); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(s_global_tab); Delete(f_initbeforefunc); Delete(f_init); Delete(f_wrappers); Delete(f_doc); Delete(f_header); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } String *texinfo_escape(String *_s) { const char* s=(const char*)Data(_s); while (*s&&(*s=='\t'||*s=='\r'||*s=='\n'||*s==' ')) ++s; String *r = NewString(""); for (int j=0;s[j];++j) { if (s[j] == '\n') { Append(r, "\\n\\\n"); } else if (s[j] == '\r') { Append(r, "\\r"); } else if (s[j] == '\t') { Append(r, "\\t"); } else if (s[j] == '\\') { Append(r, "\\\\"); } else if (s[j] == '\'') { Append(r, "\\\'"); } else if (s[j] == '\"') { Append(r, "\\\""); } else Putc(s[j], r); } return r; } void emit_doc_texinfo() { for (Iterator it = First(docs); it.key; it = Next(it)) { String *wrap_name = it.key; String *synopsis = Getattr(it.item, "synopsis"); String *decl_info = Getattr(it.item, "decl_info"); String *cdecl_info = Getattr(it.item, "cdecl_info"); String *args_info = Getattr(it.item, "args_info"); String *doc_str = NewString(""); Printv(doc_str, synopsis, decl_info, cdecl_info, args_info, NIL); String *escaped_doc_str = texinfo_escape(doc_str); if (Len(doc_str)>0) { Printf(f_doc,"static const char* %s_texinfo = ",wrap_name); Printf(f_doc,"\"-*- texinfo -*-\\n\\\n%s", escaped_doc_str); if (Len(decl_info)) Printf(f_doc,"\\n\\\n@end deftypefn"); Printf(f_doc,"\";\n"); } Delete(escaped_doc_str); Delete(doc_str); Delete(wrap_name); } Printf(f_doc,"\n"); } bool is_empty_doc_node(Node* n) { if (!n) return true; String *synopsis = Getattr(n, "synopsis"); String *decl_info = Getattr(n, "decl_info"); String *cdecl_info = Getattr(n, "cdecl_info"); String *args_info = Getattr(n, "args_info"); return !Len(synopsis) && !Len(decl_info) && !Len(cdecl_info) && !Len(args_info); } String *texinfo_name(Node* n, const char* defval = "0") { String *tname = NewString(""); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); Node* d = Getattr(docs, wname); if (is_empty_doc_node(d)) Printf(tname, defval); else Printf(tname, "%s_texinfo", wname); return tname; } void process_autodoc(Node *n) { String *iname = Getattr(n, "sym:name"); String *name = Getattr(n, "name"); String *wname = Swig_name_wrapper(iname); String *str = Getattr(n, "feature:docstring"); bool autodoc_enabled = !Cmp(Getattr(n, "feature:autodoc"), "1"); Node* d = Getattr(docs, wname); if (!d) { d = NewHash(); Setattr(d, "synopsis", NewString("")); Setattr(d, "decl_info", NewString("")); Setattr(d, "cdecl_info", NewString("")); Setattr(d, "args_info", NewString("")); Setattr(docs, wname, d); } String *synopsis = Getattr(d, "synopsis"); String *decl_info = Getattr(d, "decl_info"); // String *cdecl_info = Getattr(d, "cdecl_info"); String *args_info = Getattr(d, "args_info"); // * couldn't we just emit the docs here? if (autodoc_enabled) { String *decl_str = NewString(""); String *args_str = NewString(""); make_autodocParmList(n, decl_str, args_str); Append(decl_info, "@deftypefn {Loadable Function} "); SwigType *type = Getattr(n, "type"); if (type && Strcmp(type, "void")) { Node *nn = classLookup(Getattr(n, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); Append(decl_info, "@var{retval} = "); Printf(args_str, "%s@var{retval} is of type %s. ", args_str, type_str); Delete(type_str); } Append(decl_info, name); Append(decl_info, " ("); Append(decl_info, decl_str); Append(decl_info, ")\n"); Append(args_info, args_str); Delete(decl_str); Delete(args_str); } if (str && Len(str) > 0) { // strip off {} if necessary char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } // emit into synopsis section Append(synopsis, str); } } virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) Printf(f_init, "if (!SWIG_Octave_LoadModule(\"%s\")) return false;\n", modname); return Language::importDirective(n); } const char *get_implicitconv_flag(Node *n) { int conv = 0; if (n && GetFlag(n, "feature:implicitconv")) { conv = 1; } return conv ? "SWIG_POINTER_IMPLICIT_CONV" : "0"; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_offset - argument number for first parameter * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(ParmList *plist, int arg_offset) { Parm *p = plist; int i = arg_offset; while (p) { if (!Getattr(p, "lname")) { String *pname = Swig_cparm_name(p, i); Delete(pname); } i++; p = nextSibling(p); } } void make_autodocParmList(Node *n, String *decl_str, String *args_str) { String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; int start_arg_num = is_wrapping_class() ? 1 : 0; addMissingParameterNames(plist, start_arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); for (p = plist; p; p = pnext) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } name = name ? name : Getattr(p, "name"); name = name ? name : Getattr(p, "lname"); name = Swig_name_make(p, 0, name, 0, 0); // rename parameter if a keyword type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) break; String *tex_name = NewString(""); if (name) Printf(tex_name, "@var{%s}", name); else Printf(tex_name, "@var{?}"); if (Len(decl_str)) Append(decl_str, ", "); Append(decl_str, tex_name); if (value) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(decl_str, " = %s", value); } Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); Printf(args_str, "%s is of type %s. ", tex_name, type_str); Delete(type_str); Delete(tex_name); Delete(name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); } /* ------------------------------------------------------------ * convertValue() * Check if string v can be an Octave value literal, * (eg. number or string), or translate it to an Octave literal. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *t) { if (v && Len(v) > 0) { char fc = (Char(v))[0]; if (('0' <= fc && fc <= '9') || '\'' == fc || '"' == fc) { /* number or string (or maybe NULL pointer) */ if (SwigType_ispointer(t) && Strcmp(v, "0") == 0) return NewString("None"); else return v; } if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) return SwigType_ispointer(t) ? NewString("nil") : NewString("0"); if (Strcmp(v, "true") == 0 || Strcmp(v, "TRUE") == 0) return NewString("true"); if (Strcmp(v, "false") == 0 || Strcmp(v, "FALSE") == 0) return NewString("false"); } return 0; } virtual int functionWrapper(Node *n) { Parm *p; String *tm; int j; String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); int destructor = (!Cmp(nodeType, "destructor")); String *storage = Getattr(n, "storage"); bool overloaded = !!Getattr(n, "sym:overloaded"); bool last_overload = overloaded && !Getattr(n, "sym:nextSibling"); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); String *overname = Copy(wname); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); if (!overloaded && !addSymbol(iname, n)) return SWIG_ERROR; if (overloaded) Append(overname, Getattr(n, "sym:overname")); if (!overloaded || last_overload) process_autodoc(n); Wrapper *f = NewWrapper(); Octave_begin_function(n, f->def, iname, overname, !overloaded); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); int varargs = emit_isvarargs(l); char source[64]; Printf(f->code, "if (!SWIG_check_num_args(\"%s\",args.length(),%i,%i,%i)) " "{\n SWIG_fail;\n }\n", iname, num_arguments, num_required, varargs); if (constructor && num_arguments == 1 && num_required == 1) { if (Cmp(storage, "explicit") == 0) { Node *parent = Swig_methodclass(n); if (GetFlag(parent, "feature:implicitconv")) { String *desc = NewStringf("SWIGTYPE%s", SwigType_manglestr(Getattr(n, "type"))); Printf(f->code, "if (SWIG_CheckImplicit(%s)) SWIG_fail;\n", desc); Delete(desc); } } } for (j = 0, p = l; j < num_arguments; ++j) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *tm = Getattr(p, "tmap:in"); if (tm) { if (!tm || checkAttribute(p, "tmap:in:numinputs", "0")) { p = nextSibling(p); continue; } sprintf(source, "args(%d)", j); Setattr(p, "emit:input", source); Replaceall(tm, "$source", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Replaceall(tm, "$target", Getattr(p, "lname")); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } Replaceall(tm, "$implicitconv", convflag); Setattr(p, "implicitconv", convflag); } String *getargs = NewString(""); if (j >= num_required) Printf(getargs, "if (%dcode, getargs, "\n", NIL); Delete(getargs); p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } // Check for trailing varargs if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } // Insert constraint checking code for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Insert cleanup code String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } if (strcmp(convflag, "0") == 0) { tm = 0; } } if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } // Insert argument output code String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "_outp"); Replaceall(tm, "$result", "_outp"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } int director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = !!dynamic_cast(arg1);\n"); } Setattr(n, "wrap:name", overname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); Wrapper_add_local(f, "_out", "octave_value_list _out"); Wrapper_add_local(f, "_outp", "octave_value_list *_outp=&_out"); Wrapper_add_local(f, "_outv", "octave_value _outv"); // Return the function value if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "_outv"); Replaceall(tm, "$result", "_outv"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s\n", tm); Printf(f->code, "if (_outv.is_defined()) _outp = " "SWIG_Octave_AppendOutput(_outp, _outv);\n"); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), iname); } emit_return_variable(n, d, f); Printv(f->code, outarg, NIL); Printv(f->code, cleanup, NIL); if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$result", "_outv"); Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "return _out;\n"); Printf(f->code, "fail:\n"); // we should free locals etc if this happens Printv(f->code, cleanup, NIL); Printf(f->code, "return octave_value_list();\n"); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); DelWrapper(f); if (last_overload) dispatchFunction(n); if (!overloaded || last_overload) { String *tname = texinfo_name(n); Printf(s_global_tab, "{\"%s\",%s,0,0,2,%s},\n", iname, wname, tname); Delete(tname); } Delete(overname); Delete(wname); Delete(cleanup); Delete(outarg); return SWIG_OK; } void dispatchFunction(Node *n) { Wrapper *f = NewWrapper(); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(iname); int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(args, nargout);", &maxargs); String *tmp = NewString(""); Octave_begin_function(n, f->def, iname, wname, true); Wrapper_add_local(f, "argc", "int argc = args.length()"); Printf(tmp, "octave_value_ref argv[%d]={", maxargs); for (int j = 0; j < maxargs; ++j) Printf(tmp, "%soctave_value_ref(args,%d)", j ? "," : " ", j); Printf(tmp, "}"); Wrapper_add_local(f, "argv", tmp); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "error(\"No matching function for overload\");\n", iname); Printf(f->code, "return octave_value_list();\n"); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); Delete(tmp); DelWrapper(f); Delete(dispatch); Delete(wname); } virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); if (!addSymbol(iname, n)) return SWIG_ERROR; String *tm; Wrapper *getf = NewWrapper(); Wrapper *setf = NewWrapper(); String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *getwname = Swig_name_wrapper(getname); String *setwname = Swig_name_wrapper(setname); Octave_begin_function(n, setf->def, setname, setwname, true); Printf(setf->def, "if (!SWIG_check_num_args(\"%s_set\",args.length(),1,1,0)) return octave_value_list();", iname); if (is_assignable(n)) { Setattr(n, "wrap:name", setname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "args(0)"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args(0)"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } emit_action_code(n, setf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Append(setf->code, "fail:\n"); Printf(setf->code, "return octave_value_list();\n"); } else { Printf(setf->code, "return octave_set_immutable(args,nargout);"); } Append(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); Setattr(n, "wrap:name", getname); int addfail = 0; Octave_begin_function(n, getf->def, getname, getwname, true); Wrapper_add_local(getf, "obj", "octave_value obj"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "obj"); Replaceall(tm, "$result", "obj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Append(getf->code, " return obj;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return octave_value_list();\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); Printf(s_global_tab, "{\"%s\",0,%s,%s,2,0},\n", iname, getwname, setwname); Delete(getwname); Delete(setwname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *cppvalue = Getattr(n, "cppvalue"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); String *str = SwigType_str(type, wname); Printf(f_header, "static %s = %s;\n", str, value); Delete(str); value = wname; } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", cppvalue ? cppvalue : value); Replaceall(tm, "$nsname", iname); Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } return SWIG_OK; } virtual int nativeWrapper(Node *n) { return Language::nativeWrapper(n); } virtual int enumDeclaration(Node *n) { return Language::enumDeclaration(n); } virtual int enumvalueDeclaration(Node *n) { return Language::enumvalueDeclaration(n); } virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } virtual int classHandler(Node *n) { have_constructor = 0; have_destructor = 0; constructor_name = 0; class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; // This is a bug, due to the fact that swig_type -> octave_class mapping // is 1-to-n. static Hash *emitted = NewHash(); String *mangled_classname = Swig_name_mangle(Getattr(n, "name")); if (Getattr(emitted, mangled_classname)) { Delete(mangled_classname); return SWIG_NOWRAP; } Setattr(emitted, mangled_classname, "1"); Delete(mangled_classname); assert(!s_members_tab); s_members_tab = NewString(""); Printv(s_members_tab, "static swig_octave_member swig_", class_name, "_members[] = {\n", NIL); Language::classHandler(n); SwigType *t = Copy(Getattr(n, "name")); SwigType_add_pointer(t); // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers) SwigType *smart = Swig_cparse_smartptr(n); String *wrap_class = NewStringf("&_wrap_class_%s", class_name); if (smart) { SwigType_add_pointer(smart); SwigType_remember_clientdata(smart, wrap_class); } //String *wrap_class = NewStringf("&_wrap_class_%s", class_name); SwigType_remember_clientdata(t, wrap_class); int use_director = Swig_directorclass(n); if (use_director) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_disown(nspace, class_name); String *wcname = Swig_name_wrapper(cname); String *cnameshdw = NewStringf("%s_shadow", cname); String *wcnameshdw = Swig_name_wrapper(cnameshdw); Octave_begin_function(n, f_wrappers, cnameshdw, wcnameshdw, true); Printf(f_wrappers, " if (args.length()!=1) {\n"); Printf(f_wrappers, " error(\"disown takes no arguments\");\n"); Printf(f_wrappers, " return octave_value_list();\n"); Printf(f_wrappers, " }\n"); Printf(f_wrappers, " %s (args, nargout);\n", wcname); Printf(f_wrappers, " return args;\n"); Printf(f_wrappers, "}\n"); Printf(s_members_tab, "{\"__disown\",%s,0,0,0,0},\n", wcnameshdw); Delete(wcname); Delete(cname); Delete(wcnameshdw); Delete(cnameshdw); } Printf(s_members_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, s_members_tab, NIL); String *base_class_names = NewString(""); String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } String *bname_mangled = SwigType_manglestr(SwigType_add_pointer(Copy(bname))); Printf(base_class_names, "\"%s\",", bname_mangled); Printf(base_class, "0,"); b = Next(b); index++; Delete(bname_mangled); } } Printv(f_wrappers, "static const char *swig_", class_name, "_base_names[] = {", base_class_names, "0};\n", NIL); Printv(f_wrappers, "static const swig_type_info *swig_", class_name, "_base[] = {", base_class, "0};\n", NIL); Printv(f_wrappers, "static swig_octave_class _wrap_class_", class_name, " = {\"", class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); Printv(f_wrappers, Swig_directorclass(n) ? "1," : "0,", NIL); if (have_constructor) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_construct(nspace, constructor_name); String *wcname = Swig_name_wrapper(cname); String *tname = texinfo_name(n); Printf(f_wrappers, "%s,%s,", wcname, tname); Delete(tname); Delete(wcname); Delete(cname); } else Printv(f_wrappers, "0,0,", NIL); if (have_destructor) { String *nspace = Getattr(n, "sym:nspace"); String *cname = Swig_name_destroy(nspace, class_name); String *wcname = Swig_name_wrapper(cname); Printf(f_wrappers, "%s,", wcname); Delete(wcname); Delete(cname); } else Printv(f_wrappers, "0", ",", NIL); Printf(f_wrappers, "swig_%s_members,swig_%s_base_names,swig_%s_base };\n\n", class_name, class_name, class_name); Delete(base_class); Delete(base_class_names); Delete(smart); Delete(t); Delete(s_members_tab); s_members_tab = 0; class_name = 0; return SWIG_OK; } virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); assert(s_members_tab); assert(class_name); String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname = iname ? iname : name; String *wname = Getattr(n, "wrap:name"); assert(wname); if (!Getattr(n, "sym:nextSibling")) { String *tname = texinfo_name(n); String *rname = Copy(wname); bool overloaded = !!Getattr(n, "sym:overloaded"); if (overloaded) Delslice(rname, Len(rname) - Len(Getattr(n, "sym:overname")), DOH_END); Printf(s_members_tab, "{\"%s\",%s,0,0,0,%s},\n", realname, rname, tname); Delete(rname); Delete(tname); } return SWIG_OK; } virtual int membervariableHandler(Node *n) { Setattr(n, "feature:autodoc", "0"); Language::membervariableHandler(n); assert(s_members_tab); assert(class_name); String *symname = Getattr(n, "sym:name"); String *getname = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *setname = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *getwname = Swig_name_wrapper(getname); String *setwname = GetFlag(n, "feature:immutable") ? NewString("octave_set_immutable") : Swig_name_wrapper(setname); assert(s_members_tab); Printf(s_members_tab, "{\"%s\",0,%s,%s,0,0},\n", symname, getwname, setwname); Delete(getname); Delete(setname); Delete(getwname); Delete(setwname); return SWIG_OK; } virtual int constructorHandler(Node *n) { have_constructor = 1; if (!constructor_name) constructor_name = NewString(Getattr(n, "sym:name")); int use_director = Swig_directorclass(n); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("void"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "self_obj"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } return Language::constructorHandler(n); } virtual int destructorHandler(Node *n) { have_destructor = 1; return Language::destructorHandler(n); } virtual int staticmemberfunctionHandler(Node *n) { Language::staticmemberfunctionHandler(n); assert(s_members_tab); assert(class_name); String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname = iname ? iname : name; String *wname = Getattr(n, "wrap:name"); assert(wname); if (!Getattr(n, "sym:nextSibling")) { String *tname = texinfo_name(n); String *rname = Copy(wname); bool overloaded = !!Getattr(n, "sym:overloaded"); if (overloaded) Delslice(rname, Len(rname) - Len(Getattr(n, "sym:overname")), DOH_END); Printf(s_members_tab, "{\"%s\",%s,0,0,1,%s},\n", realname, rname, tname); Delete(rname); Delete(tname); } return SWIG_OK; } virtual int memberconstantHandler(Node *n) { return Language::memberconstantHandler(n); } virtual int staticmembervariableHandler(Node *n) { Setattr(n, "feature:autodoc", "0"); Language::staticmembervariableHandler(n); if (!GetFlag(n, "wrappedasconstant")) { assert(s_members_tab); assert(class_name); String *symname = Getattr(n, "sym:name"); String *getname = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *setname = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)); String *getwname = Swig_name_wrapper(getname); String *setwname = GetFlag(n, "feature:immutable") ? NewString("octave_set_immutable") : Swig_name_wrapper(setname); assert(s_members_tab); Printf(s_members_tab, "{\"%s\",0,%s,%s,1,0},\n", symname, getwname, setwname); Delete(getname); Delete(setname); Delete(getwname); Delete(setwname); } return SWIG_OK; } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); // insert self parameter Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("void"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { // constructor { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s," "\nSwig::Director(static_cast<%s*>(this)) { \n", classname, target, call, basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } // constructor header { String *target = Swig_method_decl(0, decl, classname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); { Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(void* self) :" "\nSwig::Director((octave_swig_type*)self,static_cast<%s*>(this)) { \n", classname, classname, classname); Append(w->def, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(octave_swig_type* self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } // determine if the method returns a pointer is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); // virtual method definition String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); // header declaration target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); // declare method return value // if the return value is a reference or const reference, a specialized typemap must // handle it, including declaration of c_result ($result). if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { // attach typemaps to arguments (C/C++ -> Octave) String *parse_args = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int outputs = 0; if (!is_void) outputs++; // build argument list and type conversion string p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Wrapper_add_local(w, "tmpv", "octave_value tmpv"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { Setattr(p, "emit:directorinput", "tmpv"); Replaceall(tm, "$input", "tmpv"); Replaceall(tm, "$owner", "0"); Printv(wrap_args, tm, "\n", NIL); Printf(wrap_args, "args.append(tmpv);\n"); Putc('O', parse_args); } else { Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } p = nextSibling(p); } String *method_name = Getattr(n, "sym:name"); Printv(w->code, wrap_args, NIL); // emit method invocation Wrapper_add_local(w, "args", "octave_value_list args"); Wrapper_add_local(w, "out", "octave_value_list out"); Wrapper_add_local(w, "idx", "std::list idx"); Printf(w->code, "idx.push_back(octave_value_list(\"%s\"));\n", method_name); Printf(w->code, "idx.push_back(args);\n"); Printf(w->code, "out=swig_get_self()->subsref(\".(\",idx,%d);\n", outputs); String *cleanup = NewString(""); String *outarg = NewString(""); idx = 0; // marshal return value if (!is_void) { Printf(w->code, "if (out.length()<%d) {\n", outputs); Printf(w->code, "Swig::DirectorTypeMismatchException::raise(\"Octave " "method %s.%s failed to return the required number " "of arguments.\");\n", classname, method_name); Printf(w->code, "}\n"); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { char temp[24]; sprintf(temp, "out(%d)", idx); Replaceall(tm, "$input", temp); // Replaceall(tm, "$argnum", temp); Replaceall(tm, "$disown", Getattr(n, "wrap:disown") ? "SWIG_POINTER_DISOWN" : "0"); if (Getattr(n, "tmap:directorout:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } idx++; // marshal outputs for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { char temp[24]; sprintf(temp, "out(%d)", idx); Replaceall(tm, "$result", temp); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } // emit the director method if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } // clean up Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } String *runtimeCode() { String *s = NewString(""); String *srun = Swig_include_sys("octrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'octrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigoctaverun.h"); } }; extern "C" Language *swig_octave(void) { return new OCTAVE(); } swig-3.0.12/Source/Modules/swigmod.h0000664000175000017500000003661613042756442017143 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigmod.h * * Main header file for SWIG modules. * ----------------------------------------------------------------------------- */ #ifndef SWIG_SWIGMOD_H_ #define SWIG_SWIGMOD_H_ #include "swig.h" #include "preprocessor.h" #include "swigwarn.h" #define NOT_VIRTUAL 0 #define PLAIN_VIRTUAL 1 #define PURE_VIRTUAL 2 extern String *input_file; extern int line_number; extern int start_line; extern int CPlusPlus; // C++ mode extern int Extend; // Extend mode extern int Verbose; extern int IsVirtual; extern int ImportMode; extern int NoExcept; // -no_except option extern int Abstract; // abstract base class extern int SmartPointer; // smart pointer methods being emitted extern int SwigRuntime; /* Overload "argc" and "argv" */ extern String *argv_template_string; extern String *argc_template_string; /* Miscellaneous stuff */ #define tab2 " " #define tab4 " " #define tab8 " " class Dispatcher { public: Dispatcher ():cplus_mode(PUBLIC) { } virtual ~ Dispatcher () { } virtual int emit_one(Node *n); virtual int emit_children(Node *n); virtual int defaultHandler(Node *n); /* Top of the parse tree */ virtual int top(Node *n) = 0; /* SWIG directives */ virtual int applyDirective(Node *n); virtual int clearDirective(Node *n); virtual int constantDirective(Node *n); virtual int extendDirective(Node *n); virtual int fragmentDirective(Node *n); virtual int importDirective(Node *n); virtual int includeDirective(Node *n); virtual int insertDirective(Node *n); virtual int moduleDirective(Node *n); virtual int nativeDirective(Node *n); virtual int pragmaDirective(Node *n); virtual int typemapDirective(Node *n); virtual int typemapitemDirective(Node *n); virtual int typemapcopyDirective(Node *n); virtual int typesDirective(Node *n); /* C/C++ parsing */ virtual int cDeclaration(Node *n); virtual int externDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int enumforwardDeclaration(Node *n); virtual int classDeclaration(Node *n); virtual int classforwardDeclaration(Node *n); virtual int constructorDeclaration(Node *n); virtual int destructorDeclaration(Node *n); virtual int accessDeclaration(Node *n); virtual int usingDeclaration(Node *n); virtual int namespaceDeclaration(Node *n); virtual int templateDeclaration(Node *n); virtual int lambdaDeclaration(Node *n); enum AccessMode { PUBLIC, PRIVATE, PROTECTED }; protected: AccessMode cplus_mode; }; /* ---------------------------------------------------------------------------- * class language: * * This class defines the functions that need to be supported by the * scripting language being used. The translator calls these virtual * functions to output different types of code for different languages. * ------------------------------------------------------------------------- */ class Language:public Dispatcher { public: Language(); virtual ~Language(); virtual int emit_one(Node *n); String *directorClassName(Node *n); /* Parse command line options */ virtual void main(int argc, char *argv[]); /* Top of the parse tree */ virtual int top(Node *n); /* SWIG directives */ virtual int applyDirective(Node *n); virtual int clearDirective(Node *n); virtual int constantDirective(Node *n); virtual int extendDirective(Node *n); virtual int fragmentDirective(Node *n); virtual int importDirective(Node *n); virtual int includeDirective(Node *n); virtual int insertDirective(Node *n); virtual int moduleDirective(Node *n); virtual int nativeDirective(Node *n); virtual int pragmaDirective(Node *n); virtual int typemapDirective(Node *n); virtual int typemapcopyDirective(Node *n); virtual int typesDirective(Node *n); /* C/C++ parsing */ virtual int cDeclaration(Node *n); virtual int externDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int enumforwardDeclaration(Node *n); virtual int classDeclaration(Node *n); virtual int classforwardDeclaration(Node *n); virtual int constructorDeclaration(Node *n); virtual int destructorDeclaration(Node *n); virtual int accessDeclaration(Node *n); virtual int namespaceDeclaration(Node *n); virtual int usingDeclaration(Node *n); /* Function handlers */ virtual int functionHandler(Node *n); virtual int globalfunctionHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int callbackfunctionHandler(Node *n); /* Variable handlers */ virtual int variableHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int staticmembervariableHandler(Node *n); /* C++ handlers */ virtual int memberconstantHandler(Node *n); virtual int constructorHandler(Node *n); virtual int copyconstructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int classHandler(Node *n); /* Miscellaneous */ virtual int typedefHandler(Node *n); /* Low-level code generation */ virtual int constantWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int functionWrapper(Node *n); virtual int nativeWrapper(Node *n); /* C++ director class generation */ virtual int classDirector(Node *n); virtual int classDirectorInit(Node *n); virtual int classDirectorEnd(Node *n); virtual int unrollVirtualMethods(Node *n, Node *parent, List *vm, int default_director, int &virtual_destructor, int protectedbase = 0); virtual int classDirectorConstructor(Node *n); virtual int classDirectorDefaultConstructor(Node *n); virtual int classDirectorMethod(Node *n, Node *parent, String *super); virtual int classDirectorConstructors(Node *n); virtual int classDirectorDestructor(Node *n); virtual int classDirectorMethods(Node *n); virtual int classDirectorDisown(Node *n); /* Miscellaneous */ virtual int validIdentifier(String *s); /* valid identifier? */ virtual int addSymbol(const String *s, const Node *n, const_String_or_char_ptr scope = ""); /* Add symbol */ virtual int addInterfaceSymbol(const String *interface_name, Node *n, const_String_or_char_ptr scope = ""); virtual void dumpSymbols(); virtual Node *symbolLookup(const String *s, const_String_or_char_ptr scope = ""); /* Symbol lookup */ virtual Hash* symbolAddScope(const_String_or_char_ptr scope); virtual Hash* symbolScopeLookup(const_String_or_char_ptr scope); virtual Hash* symbolScopePseudoSymbolLookup(const_String_or_char_ptr scope); virtual Node *classLookup(const SwigType *s) const; /* Class lookup */ virtual Node *enumLookup(SwigType *s); /* Enum lookup */ virtual int abstractClassTest(Node *n); /* Is class really abstract? */ virtual int is_assignable(Node *n); /* Is variable assignable? */ virtual String *runtimeCode(); /* returns the language specific runtime code */ virtual String *defaultExternalRuntimeFilename(); /* the default filename for the external runtime */ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm); /* Language specific special variable substitutions for $typemap() */ /* Runtime is C++ based, so extern "C" header section */ void enable_cplus_runtime_mode(); /* Returns the cplus_runtime mode */ int cplus_runtime_mode(); /* Allow director related code generation */ void allow_directors(int val = 1); /* Return true if directors are enabled */ int directorsEnabled() const; /* Allow director protected members related code generation */ void allow_dirprot(int val = 1); /* Allow all protected members code generation (for directors) */ void allow_allprotected(int val = 0); /* Returns the dirprot mode */ int dirprot_mode() const; /* Check if the non public constructor is needed (for directors) */ int need_nonpublic_ctor(Node *n); /* Check if the non public member is needed (for directors) */ int need_nonpublic_member(Node *n); /* Set none comparison string */ void setSubclassInstanceCheck(String *s); /* Set overload variable templates argc and argv */ void setOverloadResolutionTemplates(String *argc, String *argv); /* Language instance is a singleton - get instance */ static Language* instance(); protected: /* Allow multiple-input typemaps */ void allow_multiple_input(int val = 1); /* Allow overloaded functions */ void allow_overloading(int val = 1); /* Wrapping class query */ int is_wrapping_class() const; /* Return the node for the current class */ Node *getCurrentClass() const; /* Return C++ mode */ int getCPlusMode() const; /* Return the namespace for the class/enum - the nspace feature */ String *getNSpace() const; /* Return the real name of the current class */ String *getClassName() const; /* Return the classes hash */ Hash *getClassHash() const; /* Return the current class prefix */ String *getClassPrefix() const; /* Return the current enum class prefix */ String *getEnumClassPrefix() const; /* Fully qualified type name to use */ String *getClassType() const; /* Return true if the current method is part of a smart-pointer */ int is_smart_pointer() const; /* Return the name to use for the given parameter. */ virtual String *makeParameterName(Node *n, Parm *p, int arg_num, bool setter = false) const; /* Some language modules require additional wrappers for virtual methods not declared in sub-classes */ virtual bool extraDirectorProtectedCPPMethodsRequired() const; public: enum NestedClassSupport { NCS_None, // Target language does not have an equivalent to nested classes NCS_Full, // Target language does have an equivalent to nested classes and is fully implemented NCS_Unknown // Target language may or may not have an equivalent to nested classes. If it does, it has not been implemented yet. }; /* Does target language support nested classes? Default is NCS_Unknown. If NCS_Unknown is returned, then the nested classes will be ignored unless %feature "flatnested" is applied to them, in which case they will appear in global space. If the target language does not support the notion of class nesting, the language module should return NCS_None from this function, and the nested classes will be moved to the global scope (like implicit global %feature "flatnested"). */ virtual NestedClassSupport nestedClassesSupport() const; /* Returns true if the target language supports key word arguments (kwargs) */ virtual bool kwargsSupport() const; protected: /* Identifies if a protected members that are generated when the allprotected option is used. This does not include protected virtual methods as they are turned on with the dirprot option. */ bool isNonVirtualProtectedAccess(Node *n) const; /* Identify if a wrapped global or member variable n should use the naturalvar feature */ int use_naturalvar_mode(Node *n) const; /* Director subclass comparison test */ String *none_comparison; /* Director constructor "template" code */ String *director_ctor_code; /* Director 'protected' constructor "template" code */ String *director_prot_ctor_code; /* Director allows multiple inheritance */ int director_multiple_inheritance; /* Director language module */ int director_language; private: Hash *symtabs; /* symbol tables */ Hash *classtypes; Hash *enumtypes; int overloading; int multiinput; int cplus_runtime; int directors; static Language *this_; }; int SWIG_main(int, char **, Language *); void emit_parameter_variables(ParmList *l, Wrapper *f); void emit_return_variable(Node *n, SwigType *rt, Wrapper *f); void SWIG_exit(int); /* use EXIT_{SUCCESS,FAILURE} */ void SWIG_config_file(const_String_or_char_ptr ); const String *SWIG_output_directory(); void SWIG_config_cppext(const char *ext); void Swig_print_xml(Node *obj, String *filename); /* get the list of generated files */ List *SWIG_output_files(); void SWIG_library_directory(const char *); int emit_num_arguments(ParmList *); int emit_num_required(ParmList *); int emit_isvarargs(ParmList *); void emit_attach_parmmaps(ParmList *, Wrapper *f); void emit_mark_varargs(ParmList *l); String *emit_action(Node *n); int emit_action_code(Node *n, String *wrappercode, String *action); void Swig_overload_check(Node *n); String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *); String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *); String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *); List *Swig_overload_rank(Node *n, bool script_lang_wrapping); SwigType *cplus_value_type(SwigType *t); /* directors.cxx start */ String *Swig_csuperclass_call(String *base, String *method, ParmList *l); String *Swig_class_declaration(Node *n, String *name); String *Swig_class_name(Node *n); String *Swig_method_call(const_String_or_char_ptr name, ParmList *parms); String *Swig_method_decl(SwigType *rtype, SwigType *decl, const_String_or_char_ptr id, List *args, int strip, int values); String *Swig_director_declaration(Node *n); void Swig_director_emit_dynamic_cast(Node *n, Wrapper *f); void Swig_director_parms_fixup(ParmList *parms); /* directors.cxx end */ extern "C" { void SWIG_typemap_lang(const char *); typedef Language *(*ModuleFactory) (void); } void Swig_register_module(const char *name, ModuleFactory fac); ModuleFactory Swig_find_module(const char *name); /* Utilities */ int is_public(Node *n); int is_private(Node *n); int is_protected(Node *n); int is_member_director(Node *parentnode, Node *member); int is_member_director(Node *member); int is_non_virtual_protected_access(Node *n); /* Check if the non-virtual protected members are required (for directors) */ void Wrapper_virtual_elimination_mode_set(int); void Wrapper_fast_dispatch_mode_set(int); void Wrapper_cast_dispatch_mode_set(int); void Wrapper_naturalvar_mode_set(int); void clean_overloaded(Node *n); extern "C" { const char *Swig_to_string(DOH *object, int count = -1); const char *Swig_to_string_with_location(DOH *object, int count = -1); void Swig_print(DOH *object, int count = -1); void Swig_print_with_location(DOH *object, int count = -1); } /* Contracts */ void Swig_contracts(Node *n); void Swig_contract_mode_set(int flag); int Swig_contract_mode_get(); /* Browser */ void Swig_browser(Node *n, int); void Swig_default_allocators(Node *n); void Swig_process_types(Node *n); /* Nested classes */ void Swig_nested_process_classes(Node *n); void Swig_nested_name_unnamed_c_structs(Node *n); /* Interface feature */ void Swig_interface_feature_enable(); void Swig_interface_propagate_methods(Node *n); /* Miscellaneous */ template class save_value { T _value; T& _value_ptr; save_value(const save_value&); save_value& operator=(const save_value&); public: save_value(T& value) : _value(value), _value_ptr(value) {} save_value(T& value, T new_val) : _value(value), _value_ptr(value) { value = new_val; } ~save_value() { _value_ptr = _value; } }; #endif swig-3.0.12/Source/Modules/contract.cxx0000664000175000017500000002357313042756442017660 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * contract.cxx * * Support for Wrap by Contract in SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" /* Contract structure. This holds rules about the different kinds of contract sections and their combination rules */ struct contract { const char *section; const char *combiner; }; /* Contract rules. This table defines what contract sections are recognized as well as how contracts are to combined via inheritance */ static contract Rules[] = { {"require:", "&&"}, {"ensure:", "||"}, {NULL, NULL} }; /* ---------------------------------------------------------------------------- * class Contracts: * * This class defines the functions that need to be used in * "wrap by contract" module. * ------------------------------------------------------------------------- */ class Contracts:public Dispatcher { String *make_expression(String *s, Node *n); void substitute_parms(String *s, ParmList *p, int method); public: Hash *ContractSplit(Node *n); int emit_contract(Node *n, int method); int cDeclaration(Node *n); int constructorDeclaration(Node *n); int externDeclaration(Node *n); int extendDirective(Node *n); int importDirective(Node *n); int includeDirective(Node *n); int namespaceDeclaration(Node *n); int classDeclaration(Node *n); virtual int top(Node *n); }; static int Contract_Mode = 0; /* contract option */ static int InClass = 0; /* Parsing C++ or not */ static int InConstructor = 0; static Node *CurrentClass = 0; /* Set the contract mode, default is 0 (not open) */ /* Normally set in main.cxx, when get the "-contracts" option */ void Swig_contract_mode_set(int flag) { Contract_Mode = flag; } /* Get the contract mode */ int Swig_contract_mode_get() { return Contract_Mode; } /* Apply contracts */ void Swig_contracts(Node *n) { Contracts *a = new Contracts; a->top(n); delete a; } /* Split the whole contract into preassertion, postassertion and others */ Hash *Contracts::ContractSplit(Node *n) { String *contract = Getattr(n, "feature:contract"); Hash *result; if (!contract) return NULL; result = NewHash(); String *current_section = NewString(""); const char *current_section_name = Rules[0].section; List *l = SplitLines(contract); Iterator i; for (i = First(l); i.item; i = Next(i)) { int found = 0; if (Strchr(i.item, '{')) continue; if (Strchr(i.item, '}')) continue; for (int j = 0; Rules[j].section; j++) { if (Strstr(i.item, Rules[j].section)) { if (Len(current_section)) { Setattr(result, current_section_name, current_section); current_section = Getattr(result, Rules[j].section); if (!current_section) current_section = NewString(""); } current_section_name = Rules[j].section; found = 1; break; } } if (!found) Append(current_section, i.item); } if (Len(current_section)) Setattr(result, current_section_name, current_section); return result; } /* This function looks in base classes and collects contracts found */ void inherit_contracts(Node *c, Node *n, Hash *contracts, Hash *messages) { Node *b, *temp; String *name, *type, *local_decl, *base_decl; List *bases; int found = 0; bases = Getattr(c, "bases"); if (!bases) return; name = Getattr(n, "name"); type = Getattr(n, "type"); local_decl = Getattr(n, "decl"); if (local_decl) { local_decl = SwigType_typedef_resolve_all(local_decl); } else { return; } /* Width first search */ for (int i = 0; i < Len(bases); i++) { b = Getitem(bases, i); temp = firstChild(b); while (temp) { base_decl = Getattr(temp, "decl"); if (base_decl) { base_decl = SwigType_typedef_resolve_all(base_decl); if ((checkAttribute(temp, "storage", "virtual")) && (checkAttribute(temp, "name", name)) && (checkAttribute(temp, "type", type)) && (!Strcmp(local_decl, base_decl))) { /* Yes, match found. */ Hash *icontracts = Getattr(temp, "contract:rules"); Hash *imessages = Getattr(temp, "contract:messages"); found = 1; if (icontracts && imessages) { /* Add inherited contracts and messages to the contract rules above */ int j = 0; for (j = 0; Rules[j].section; j++) { String *t = Getattr(contracts, Rules[j].section); String *s = Getattr(icontracts, Rules[j].section); if (s) { if (t) { Insert(t, 0, "("); Printf(t, ") %s (%s)", Rules[j].combiner, s); String *m = Getattr(messages, Rules[j].section); Printf(m, " %s [%s from %s]", Rules[j].combiner, Getattr(imessages, Rules[j].section), Getattr(b, "name")); } else { Setattr(contracts, Rules[j].section, NewString(s)); Setattr(messages, Rules[j].section, NewStringf("[%s from %s]", Getattr(imessages, Rules[j].section), Getattr(b, "name"))); } } } } } Delete(base_decl); } temp = nextSibling(temp); } } Delete(local_decl); if (!found) { for (int j = 0; j < Len(bases); j++) { b = Getitem(bases, j); inherit_contracts(b, n, contracts, messages); } } } /* This function cleans up the assertion string by removing some extraneous characters. Splitting the assertion into pieces */ String *Contracts::make_expression(String *s, Node *n) { String *str_assert, *expr = 0; List *list_assert; str_assert = NewString(s); /* Omit all useless characters and split by ; */ Replaceall(str_assert, "\n", ""); Replaceall(str_assert, "{", ""); Replaceall(str_assert, "}", ""); Replace(str_assert, " ", "", DOH_REPLACE_ANY | DOH_REPLACE_NOQUOTE); Replace(str_assert, "\t", "", DOH_REPLACE_ANY | DOH_REPLACE_NOQUOTE); list_assert = Split(str_assert, ';', -1); Delete(str_assert); /* build up new assertion */ str_assert = NewString(""); Iterator ei; for (ei = First(list_assert); ei.item; ei = Next(ei)) { expr = ei.item; if (Len(expr)) { Replaceid(expr, Getattr(n, "name"), Swig_cresult_name()); if (Len(str_assert)) Append(str_assert, "&&"); Printf(str_assert, "(%s)", expr); } } Delete(list_assert); return str_assert; } /* This function substitutes parameter names for argument names in the contract specification. Note: it is assumed that the wrapper code uses arg1 for self and arg2..argn for arguments. */ void Contracts::substitute_parms(String *s, ParmList *p, int method) { int argnum = 1; char argname[32]; if (method) { Replaceid(s, "$self", "arg1"); argnum++; } while (p) { sprintf(argname, "arg%d", argnum); String *name = Getattr(p, "name"); if (name) { Replaceid(s, name, argname); } argnum++; p = nextSibling(p); } } int Contracts::emit_contract(Node *n, int method) { Hash *contracts; Hash *messages; String *c; ParmList *cparms; if (!Getattr(n, "feature:contract")) return SWIG_ERROR; /* Get contract parameters */ cparms = Getmeta(Getattr(n, "feature:contract"), "parms"); /* Split contract into preassert & postassert */ contracts = ContractSplit(n); if (!contracts) return SWIG_ERROR; /* This messages hash is used to hold the error messages that will be displayed on failed contract. */ messages = NewHash(); /* Take the different contract expressions and clean them up a bit */ Iterator i; for (i = First(contracts); i.item; i = Next(i)) { String *e = make_expression(i.item, n); substitute_parms(e, cparms, method); Setattr(contracts, i.key, e); /* Make a string containing error messages */ Setattr(messages, i.key, NewString(e)); } /* If we're in a class. We need to inherit other assertions. */ if (InClass) { inherit_contracts(CurrentClass, n, contracts, messages); } /* Save information */ Setattr(n, "contract:rules", contracts); Setattr(n, "contract:messages", messages); /* Okay. Generate the contract runtime code. */ if ((c = Getattr(contracts, "require:"))) { Setattr(n, "contract:preassert", NewStringf("SWIG_contract_assert(%s, \"Contract violation: require: %s\");\n", c, Getattr(messages, "require:"))); } if ((c = Getattr(contracts, "ensure:"))) { Setattr(n, "contract:postassert", NewStringf("SWIG_contract_assert(%s, \"Contract violation: ensure: %s\");\n", c, Getattr(messages, "ensure:"))); } return SWIG_OK; } int Contracts::cDeclaration(Node *n) { int ret = SWIG_OK; String *decl = Getattr(n, "decl"); /* Not a function. Don't even bother with it (for now) */ if (!SwigType_isfunction(decl)) return SWIG_OK; if (Getattr(n, "feature:contract")) ret = emit_contract(n, InClass && !Swig_storage_isstatic(n)); return ret; } int Contracts::constructorDeclaration(Node *n) { int ret = SWIG_OK; InConstructor = 1; if (Getattr(n, "feature:contract")) ret = emit_contract(n, 0); InConstructor = 0; return ret; } int Contracts::externDeclaration(Node *n) { return emit_children(n); } int Contracts::extendDirective(Node *n) { return emit_children(n); } int Contracts::importDirective(Node *n) { return emit_children(n); } int Contracts::includeDirective(Node *n) { return emit_children(n); } int Contracts::namespaceDeclaration(Node *n) { return emit_children(n); } int Contracts::classDeclaration(Node *n) { int ret = SWIG_OK; int oldInClass = InClass; Node *oldClass = CurrentClass; InClass = 1; CurrentClass = n; emit_children(n); InClass = oldInClass; CurrentClass = oldClass; return ret; } int Contracts::top(Node *n) { emit_children(n); return SWIG_OK; } swig-3.0.12/Source/Modules/pike.cxx0000664000175000017500000006470313042756442016773 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * pike.cxx * * Pike language module for SWIG. * ----------------------------------------------------------------------------- */ /* * Notes: * * - The current approach used for "out" typemaps is inconsistent with * how "out" typemaps are handled by other language modules. Instead * of converting the C/C++ type ($1) to a Pike object type (e.g. a * struct svalue), we're just calling the appropriate push_XXX * (e.g. push_int) to push the return value onto the stack. * * - Pike classes can't have static member functions or data, so we need * to find some other appropriate mapping for C++ static member functions * and data. * * - Pike doesn't seem to provide any default way to print the memory * address, etc. for extension objects. Should we do something here? * */ #include "swigmod.h" #include // for isalnum() static const char *usage = "\ Pike Options (available with -pike)\n\ [no additional options]\n\ \n"; class PIKE:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; File *f_classInit; String *PrefixPlusUnderscore; int current; // Wrap modes enum { NO_CPP, MEMBER_FUNC, CONSTRUCTOR, DESTRUCTOR, MEMBER_VAR, CLASS_CONST, STATIC_FUNC, STATIC_VAR }; public: /* --------------------------------------------------------------------- * PIKE() * * Initialize member data * --------------------------------------------------------------------- */ PIKE() { f_begin = 0; f_runtime = 0; f_header = 0; f_wrappers = 0; f_init = 0; f_classInit = 0; PrefixPlusUnderscore = 0; current = NO_CPP; } /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { /* Set location of SWIG library */ SWIG_library_directory("pike"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } } /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGPIKE 1", 0); /* Set language-specific configuration file */ SWIG_config_file("pike.swg"); /* Set typemap language */ SWIG_typemap_lang("pike"); /* Enable overloaded methods support */ allow_overloading(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Open the output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_classInit = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("classInit", f_classInit); /* Standard stuff for the SWIG runtime section */ Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPIKE\n#define SWIGPIKE\n#endif\n\n"); Printf(f_header, "#define SWIG_init pike_module_init\n"); Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); /* Change naming scheme for constructors and destructors */ Swig_name_register("construct", "%n%c_create"); Swig_name_register("destroy", "%n%c_destroy"); /* Current wrap type */ current = NO_CPP; /* Emit code for children */ Language::top(n); /* Close the initialization function */ Printf(f_init, "}\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_classInit); Delete(f_runtime); Delete(f_begin); /* Done */ return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); const char *c0 = c; const char *c1 = c0 + 1; while (*c) { if (*c == '`' && c == c0) { c++; continue; } if ((*c == '+' || *c == '-' || *c == '*' || *c == '/') && c == c1) { c++; continue; } if (!(isalnum(*c) || (*c == '_'))) return 0; c++; } return 1; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) { Printf(f_init, "pike_require(\"%s\");\n", modname); } return Language::importDirective(n); } /* ------------------------------------------------------------ * strip() * * For names that begin with the current class prefix plus an * underscore (e.g. "Foo_enum_test"), return the base function * name (i.e. "enum_test"). * ------------------------------------------------------------ */ String *strip(const DOHconst_String_or_char_ptr name) { String *s = Copy(name); if (Strncmp(name, PrefixPlusUnderscore, Len(PrefixPlusUnderscore)) != 0) { return s; } Replaceall(s, PrefixPlusUnderscore, ""); return s; } /* ------------------------------------------------------------ * add_method() * ------------------------------------------------------------ */ void add_method(const DOHconst_String_or_char_ptr name, const DOHconst_String_or_char_ptr function, const DOHconst_String_or_char_ptr description) { String *rename = NULL; switch (current) { case NO_CPP: rename = NewString(name); Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case STATIC_FUNC: case STATIC_VAR: rename = NewString(name); Printf(f_init, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case CONSTRUCTOR: case DESTRUCTOR: case MEMBER_FUNC: case MEMBER_VAR: rename = strip(name); Printf(f_classInit, "ADD_FUNCTION(\"%s\", %s, tFunc(%s), 0);\n", rename, function, description); break; case CLASS_CONST: // shouldn't have gotten here for CLASS_CONST nodes default: // what is this? assert(false); } Delete(rename); } /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; int i; String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } Wrapper *f = NewWrapper(); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ int num_arguments = emit_num_arguments(l); int varargs = emit_isvarargs(l); /* Which input argument to start with? */ int start = (current == MEMBER_FUNC || current == MEMBER_VAR || current == DESTRUCTOR) ? 1 : 0; /* Offset to skip over the attribute name */ // int offset = (current == MEMBER_VAR) ? 1 : 0; int offset = 0; String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "static void ", wname, "(INT32 args) {", NIL); /* Generate code for argument marshalling */ String *description = NewString(""); char source[64]; for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); if (i < start) { String *lstr = SwigType_lstr(pt, 0); Printf(f->code, "%s = (%s) THIS;\n", ln, lstr); Delete(lstr); } else { /* Look for an input typemap */ sprintf(source, "Pike_sp[%d-args]", i - start + offset); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); String *pikedesc = Getattr(p, "tmap:in:pikedesc"); if (pikedesc) { Printv(description, pikedesc, " ", NIL); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } p = nextSibling(p); } /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Emit the function call */ String *actioncode = emit_action(n); /* Clear the return stack */ Printf(actioncode, "pop_n_elems(args);\n"); /* Return the function value */ if (current == CONSTRUCTOR) { Printv(actioncode, "THIS = (void *) ", Swig_cresult_name(), ";\n", NIL); Printv(description, ", tVoid", NIL); } else if (current == DESTRUCTOR) { Printv(description, ", tVoid", NIL); } else { Printv(description, ", ", NIL); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { actioncode = 0; Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } String *pikedesc = Getattr(n, "tmap:out:pikedesc"); if (pikedesc) { Printv(description, pikedesc, NIL); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } } if (actioncode) { Append(f->code, actioncode); Delete(actioncode); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } /* Close the function */ Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); /* Dump the function out */ Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { add_method(iname, wname, description); } else { if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } } Delete(cleanup); Delete(outarg); Delete(description); Delete(wname); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * dispatchFunction() * * Emit overloading dispatch function * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "%s(args); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); Printf(f->def, "static void %s(INT32 args) {", wname); Wrapper_add_local(f, "argc", "INT32 argc"); Printf(tmp, "struct svalue argv[%d]", maxargs); Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "INT32 ii"); Printf(f->code, "argc = args;\n"); Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++) {\n", maxargs); Printf(f->code, "argv[ii] = Pike_sp[ii-args];\n"); Printf(f->code, "}\n"); Replaceall(dispatch, "$args", "self, args"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "Pike_error(\"No matching function for overloaded '%s'.\");\n", symname); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); String *description = NewString(""); Printf(description, "tAny,"); if (current == CONSTRUCTOR || current == DESTRUCTOR) { Printf(description, " tVoid"); } else { String *pd = Getattr(n, "tmap:out:pikedesc"); if (pd) Printf(description, " %s", pd); } add_method(symname, wname, description); Delete(description); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { return Language::variableWrapper(n); } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { Swig_require("constantWrapper", n, "*sym:name", "type", "value", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if (SwigType_type(type) == T_MPOINTER) { /* Special hook for member pointer */ String *wname = Swig_name_wrapper(symname); Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); value = wname; } else if (SwigType_type(type) == T_CHAR && is_enum_item) { type = NewSwigType(T_INT); Setattr(n, "type", type); } /* Perform constant typemap substitution */ String *tm = Swig_typemap_lookup("constant", n, value, 0); if (tm) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", symname); Replaceall(tm, "$symname", symname); Replaceall(tm, "$value", value); Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } Swig_restore(n); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { // return Language::nativeWrapper(n); String *name = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; add_method(name, wrapname, 0); return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { return Language::enumDeclaration(n); } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { return Language::enumvalueDeclaration(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (!addSymbol(symname, n)) return SWIG_ERROR; PrefixPlusUnderscore = NewStringf("%s_", getClassPrefix()); Printf(f_classInit, "start_new_program();\n"); /* Handle inheritance */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist) > 0) { Iterator base = First(baselist); while (base.item) { String *basename = Getattr(base.item, "name"); SwigType *basetype = NewString(basename); SwigType_add_pointer(basetype); SwigType_remember(basetype); String *basemangle = SwigType_manglestr(basetype); Printf(f_classInit, "low_inherit((struct program *) SWIGTYPE%s->clientdata, 0, 0, 0, 0, 0);\n", basemangle); Delete(basemangle); Delete(basetype); base = Next(base); } } else { Printf(f_classInit, "ADD_STORAGE(swig_object_wrapper);\n"); } Language::classHandler(n); /* Accessors for member variables */ /* List *membervariables = Getattr(n,"membervariables"); if (membervariables && Len(membervariables) > 0) { membervariableAccessors(membervariables); } */ /* Done, close the class and dump its definition to the init function */ Printf(f_classInit, "add_program_constant(\"%s\", pr = end_program(), 0);\n", symname); Dump(f_classInit, f_init); Clear(f_classInit); SwigType *tt = NewString(symname); SwigType_add_pointer(tt); SwigType_remember(tt); String *tm = SwigType_manglestr(tt); Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) pr);\n", tm); Delete(tm); Delete(tt); Delete(PrefixPlusUnderscore); PrefixPlusUnderscore = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * * Method for adding C++ member function * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { current = MEMBER_FUNC; Language::memberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * * Method for adding C++ member constructor * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { current = CONSTRUCTOR; Language::constructorHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { current = DESTRUCTOR; Language::destructorHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableAccessors() * ------------------------------------------------------------ */ void membervariableAccessors(List *membervariables) { String *name; Iterator i; bool need_setter; String *funcname; /* If at least one of them is mutable, we need a setter */ need_setter = false; i = First(membervariables); while (i.item) { if (!GetFlag(i.item, "feature:immutable")) { need_setter = true; break; } i = Next(i); } /* Create a function to set the values of the (mutable) variables */ if (need_setter) { Wrapper *wrapper = NewWrapper(); String *setter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->="); String *wname = Swig_name_wrapper(setter); Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); i = First(membervariables); while (i.item) { if (!GetFlag(i.item, "feature:immutable")) { name = Getattr(i.item, "name"); funcname = Swig_name_wrapper(Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); Printf(wrapper->code, "%s(args);\n", funcname); Printf(wrapper->code, "return;\n"); Printf(wrapper->code, "}\n"); Delete(funcname); } i = Next(i); } /* Close the function */ Printf(wrapper->code, "pop_n_elems(args);\n"); Printf(wrapper->code, "}\n"); /* Dump wrapper code to the output file */ Wrapper_print(wrapper, f_wrappers); /* Register it with Pike */ String *description = NewString("tStr tFloat, tVoid"); add_method("`->=", wname, description); Delete(description); /* Clean up */ Delete(wname); Delete(setter); DelWrapper(wrapper); } /* Create a function to get the values of the (mutable) variables */ Wrapper *wrapper = NewWrapper(); String *getter = Swig_name_member(NSPACE_TODO, getClassPrefix(), "`->"); String *wname = Swig_name_wrapper(getter); Printv(wrapper->def, "static void ", wname, "(INT32 args) {", NIL); Printf(wrapper->locals, "char *name = (char *) STR0(Pike_sp[0-args].u.string);\n"); i = First(membervariables); while (i.item) { name = Getattr(i.item, "name"); funcname = Swig_name_wrapper(Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, getClassPrefix(), name))); Printf(wrapper->code, "if (!strcmp(name, \"%s\")) {\n", name); Printf(wrapper->code, "%s(args);\n", funcname); Printf(wrapper->code, "return;\n"); Printf(wrapper->code, "}\n"); Delete(funcname); i = Next(i); } /* Close the function */ Printf(wrapper->code, "pop_n_elems(args);\n"); Printf(wrapper->code, "}\n"); /* Dump wrapper code to the output file */ Wrapper_print(wrapper, f_wrappers); /* Register it with Pike */ String *description = NewString("tStr, tMix"); add_method("`->", wname, description); Delete(description); /* Clean up */ Delete(wname); Delete(getter); DelWrapper(wrapper); } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { List *membervariables = Getattr(getCurrentClass(), "membervariables"); if (!membervariables) { membervariables = NewList(); Setattr(getCurrentClass(), "membervariables", membervariables); } Append(membervariables, n); current = MEMBER_VAR; Language::membervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { current = STATIC_FUNC; Language::staticmemberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * * Create a C++ constant * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { current = CLASS_CONST; constantWrapper(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { current = STATIC_VAR; Language::staticmembervariableHandler(n); current = NO_CPP; return SWIG_OK; } }; /* ----------------------------------------------------------------------------- * swig_pike() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_pike() { return new PIKE(); } extern "C" Language *swig_pike(void) { return new_swig_pike(); } swig-3.0.12/Source/Modules/overload.cxx0000664000175000017500000006635213042756442017660 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * overload.cxx * * This file is used to analyze overloaded functions and methods. * It looks at signatures and tries to gather information for * building a dispatch function. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #define MAX_OVERLOAD 4096 /* Overload "argc" and "argv" */ String *argv_template_string; String *argc_template_string; struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ bool implicitconv_function; /* For ordering implicitconv functions*/ }; static int fast_dispatch_mode = 0; static int cast_dispatch_mode = 0; /* Set fast_dispatch_mode */ void Wrapper_fast_dispatch_mode_set(int flag) { fast_dispatch_mode = flag; } void Wrapper_cast_dispatch_mode_set(int flag) { cast_dispatch_mode = flag; } /* ----------------------------------------------------------------------------- * mark_implicitconv_function() * * Mark function if it contains an implicitconv type in the parameter list * ----------------------------------------------------------------------------- */ static void mark_implicitconv_function(Overloaded& onode) { Parm *parms = onode.parms; if (parms) { bool is_implicitconv_function = false; Parm *p = parms; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (GetFlag(p, "implicitconv")) { is_implicitconv_function = true; break; } p = nextSibling(p); } if (is_implicitconv_function) onode.implicitconv_function = true; } } /* ----------------------------------------------------------------------------- * Swig_overload_rank() * * This function takes an overloaded declaration and creates a list that ranks * all overloaded methods in an order that can be used to generate a dispatch * function. * Slight difference in the way this function is used by scripting languages and * statically typed languages. The script languages call this method via * Swig_overload_dispatch() - where wrappers for all overloaded methods are generated, * however sometimes the code can never be executed. The non-scripting languages * call this method via Swig_overload_check() for each overloaded method in order * to determine whether or not the method should be wrapped. Note the slight * difference when overloading methods that differ by const only. The * scripting languages will ignore the const method, whereas the non-scripting * languages ignore the first method parsed. * ----------------------------------------------------------------------------- */ List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { Overloaded nodes[MAX_OVERLOAD]; int nnodes = 0; Node *o = Getattr(n, "sym:overloaded"); Node *c; if (!o) return 0; c = o; while (c) { if (Getattr(c, "error")) { c = Getattr(c, "sym:nextSibling"); continue; } /* if (SmartPointer && Getattr(c,"cplus:staticbase")) { c = Getattr(c,"sym:nextSibling"); continue; } */ /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ if (Getattr(c, "wrap:name")) { assert(nnodes < MAX_OVERLOAD); nodes[nnodes].n = c; nodes[nnodes].parms = Getattr(c, "wrap:parms"); nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); nodes[nnodes].error = 0; nodes[nnodes].implicitconv_function = false; mark_implicitconv_function(nodes[nnodes]); nnodes++; } c = Getattr(c, "sym:nextSibling"); } /* Sort the declarations by required argument count */ { int i, j; for (i = 0; i < nnodes; i++) { for (j = i + 1; j < nnodes; j++) { if (nodes[i].argc > nodes[j].argc) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } } } } /* Sort the declarations by argument types */ { int i, j; for (i = 0; i < nnodes - 1; i++) { if (nodes[i].argc == nodes[i + 1].argc) { for (j = i + 1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { Parm *p1 = nodes[i].parms; Parm *p2 = nodes[j].parms; int differ = 0; int num_checked = 0; while (p1 && p2 && (num_checked < nodes[i].argc)) { // Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); if (checkAttribute(p1, "tmap:in:numinputs", "0")) { p1 = Getattr(p1, "tmap:in:next"); continue; } if (checkAttribute(p2, "tmap:in:numinputs", "0")) { p2 = Getattr(p2, "tmap:in:next"); continue; } String *t1 = Getattr(p1, "tmap:typecheck:precedence"); String *t2 = Getattr(p2, "tmap:typecheck:precedence"); if ((!t1) && (!nodes[i].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[i].n), SwigType_str(Getattr(p1, "type"), 0)); nodes[i].error = 1; } else if ((!t2) && (!nodes[j].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[j].n), SwigType_str(Getattr(p2, "type"), 0)); nodes[j].error = 1; } if (t1 && t2) { int t1v, t2v; t1v = atoi(Char(t1)); t2v = atoi(Char(t2)); differ = t1v - t2v; } else if (!t1 && t2) differ = 1; else if (t1 && !t2) differ = -1; else if (!t1 && !t2) differ = -1; num_checked++; if (differ > 0) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; break; } else if ((differ == 0) && (Strcmp(t1, "0") == 0)) { t1 = Getattr(p1, "ltype"); if (!t1) { t1 = SwigType_ltype(Getattr(p1, "type")); if (Getattr(p1, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t1); } Setattr(p1, "ltype", t1); } t2 = Getattr(p2, "ltype"); if (!t2) { t2 = SwigType_ltype(Getattr(p2, "type")); if (Getattr(p2, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t2); } Setattr(p2, "ltype", t2); } /* Need subtype check here. If t2 is a subtype of t1, then we need to change the order */ if (SwigType_issubtype(t2, t1)) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } if (Strcmp(t1, t2) != 0) { differ = 1; break; } } else if (differ) { break; } if (Getattr(p1, "tmap:in:next")) { p1 = Getattr(p1, "tmap:in:next"); } else { p1 = nextSibling(p1); } if (Getattr(p2, "tmap:in:next")) { p2 = Getattr(p2, "tmap:in:next"); } else { p2 = nextSibling(p2); } } if (!differ) { /* See if declarations differ by const only */ String *d1 = Getattr(nodes[i].n, "decl"); String *d2 = Getattr(nodes[j].n, "decl"); if (d1 && d2) { String *dq1 = Copy(d1); String *dq2 = Copy(d2); if (SwigType_isconst(d1)) { Delete(SwigType_pop(dq1)); } if (SwigType_isconst(d2)) { Delete(SwigType_pop(dq2)); } if (Strcmp(dq1, dq2) == 0) { if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { if (script_lang_wrapping) { // Swap nodes so that the const method gets ignored (shadowed by the non-const method) Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } } Delete(dq1); Delete(dq2); } } if (!differ) { if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s effectively ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[i].n), Getline(nodes[i].n), "as it is shadowed by %s.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } nodes[j].error = 1; } } } } } } List *result = NewList(); { int i; int argc_changed_index = -1; for (i = 0; i < nnodes; i++) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); // Printf(stdout,"[ %d ] %d %s\n", i, nodes[i].implicitconv_function, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); if (i == nnodes-1 || nodes[i].argc != nodes[i+1].argc) { if (argc_changed_index+2 < nnodes && (nodes[argc_changed_index+1].argc == nodes[argc_changed_index+2].argc)) { // Add additional implicitconv functions in same order as already ranked. // Consider overloaded functions by argument count... only add additional implicitconv functions if // the number of functions with the same arg count > 1, ie, only if overloaded by same argument count. int j; for (j = argc_changed_index + 1; j <= i; j++) { if (nodes[j].implicitconv_function) { SetFlag(nodes[j].n, "implicitconvtypecheckoff"); Append(result, nodes[j].n); // Printf(stdout,"[ %d ] %d + %s\n", j, nodes[j].implicitconv_function, ParmList_errorstr(nodes[j].parms)); // Swig_print_node(nodes[j].n); } } } argc_changed_index = i; } } } return result; } // /* ----------------------------------------------------------------------------- // * print_typecheck() // * ----------------------------------------------------------------------------- */ static bool print_typecheck(String *f, int j, Parm *pj, bool implicitconvtypecheckoff) { char tmp[256]; sprintf(tmp, Char(argv_template_string), j); String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); Replaceid(tm, Getattr(pj, "lname"), "_v"); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, tm, "\n", NIL); Delete(tm); return true; } else return false; } /* ----------------------------------------------------------------------------- * ReplaceFormat() * ----------------------------------------------------------------------------- */ static String *ReplaceFormat(const_String_or_char_ptr fmt, int j) { String *lfmt = NewString(fmt); char buf[50]; sprintf(buf, "%d", j); Replaceall(lfmt, "$numargs", buf); int i; String *commaargs = NewString(""); for (i = 0; i < j; i++) { Printv(commaargs, ", ", NIL); Printf(commaargs, Char(argv_template_string), i); } Replaceall(lfmt, "$commaargs", commaargs); return lfmt; } /* ----------------------------------------------------------------------------- * Swig_overload_dispatch() * * Generate a dispatch function. argc is assumed to hold the argument count. * argv is the argument vector. * * Note that for C++ class member functions, Swig_overload_dispatch() assumes * that argc includes the "self" argument and that the first element of argv[] * is the "self" argument. So for a member function: * * Foo::bar(int x, int y, int z); * * the argc should be 4 (not 3!) and the first element of argv[] would be * the appropriate scripting language reference to "self". For regular * functions (and static class functions) the argc and argv only include * the regular function arguments. * ----------------------------------------------------------------------------- */ /* Cast dispatch mechanism. */ String *Swig_overload_dispatch_cast(Node *n, const_String_or_char_ptr fmt, int *maxargs) { int i, j; *maxargs = 1; String *f = NewString(""); String *sw = NewString(""); Printf(f, "{\n"); Printf(f, "unsigned long _index = 0;\n"); Printf(f, "SWIG_TypeRank _rank = 0; \n"); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ bool emitcheck = 1; for (i = 0; i < nfunc; i++) { int fn = 0; Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } Printf(f, "SWIG_TypeRank _ranki = 0;\n"); Printf(f, "SWIG_TypeRank _rankm = 0;\n"); if (num_arguments) Printf(f, "SWIG_TypeRank _pi = 1;\n"); /* create a list with the wrappers that collide with the current one based on argument number */ List *coll = NewList(); for (int k = i + 1; k < nfunc; k++) { Node *nk = Getitem(dispatch, k); Parm *pk = Getattr(nk, "wrap:parms"); int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments)) Append(coll, nk); } // printf("overload: %s coll=%d\n", Char(Getattr(n, "sym:name")), Len(coll)); int num_braces = 0; bool test = (num_arguments > 0); if (test) { int need_v = 1; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); /* normalise for comparison later */ Replaceid(tm, Getattr(pj, "lname"), "_v"); /* if all the wrappers have the same type check on this argument we can optimize it out */ for (int k = 0; k < Len(coll) && !emitcheck; k++) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; /* finds arg j on the collider wrapper */ while (pl && l <= j) { if (checkAttribute(pl, "tmap:in:numinputs", "0")) { pl = Getattr(pl, "tmap:in:next"); continue; } if (l == j) { /* we are at arg j, so we compare the tmaps now */ String *tml = Getattr(pl, "tmap:typecheck"); /* normalise it before comparing */ if (tml) Replaceid(tml, Getattr(pl, "lname"), "_v"); if (!tml || Cmp(tm, tml)) emitcheck = 1; //printf("tmap: %s[%d] (%d) => %s\n\n", // Char(Getattr(nk, "sym:name")), // l, emitcheck, tml?Char(tml):0); } Parm *pl1 = Getattr(pl, "tmap:in:next"); if (pl1) pl = pl1; else pl = nextSibling(pl); l++; } } if (emitcheck) { if (need_v) { Printf(f, "int _v = 0;\n"); need_v = 0; } if (j >= num_required) { Printf(f, "if (%s > %d) {\n", argc_template_string, j); num_braces++; } String *tmp = NewStringf(argv_template_string, j); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, "{\n", tm, "}\n", NIL); Delete(tm); fn = i + 1; Printf(f, "if (!_v) goto check_%d;\n", fn); Printf(f, "_ranki += _v*_pi;\n"); Printf(f, "_rankm += _pi;\n"); Printf(f, "_pi *= SWIG_MAXCASTRANK;\n"); } } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pj1 = Getattr(pj, "tmap:in:next"); if (pj1) pj = pj1; else pj = nextSibling(pj); j++; } } /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); Printf(f, "if (!_index || (_ranki < _rank)) {\n"); Printf(f, " _rank = _ranki; _index = %d;\n", i + 1); Printf(f, " if (_rank == _rankm) goto dispatch;\n"); Printf(f, "}\n"); String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(sw, "case %d:\n", i + 1); Printf(sw, Char(lfmt), Getattr(ni, "wrap:name")); Printf(sw, "\n"); Printf(f, "}\n"); /* braces closes "if" for this method */ if (fn) Printf(f, "check_%d:\n\n", fn); if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); Delete(lfmt); Delete(coll); } Delete(dispatch); Printf(f, "dispatch:\n"); Printf(f, "switch(_index) {\n"); Printf(f, "%s", sw); Printf(f, "}\n"); Printf(f, "}\n"); return f; } /* Fast dispatch mechanism, provided by Salvador Fandi~no Garc'ia (#930586). */ String *Swig_overload_dispatch_fast(Node *n, const_String_or_char_ptr fmt, int *maxargs) { int i, j; *maxargs = 1; String *f = NewString(""); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ for (i = 0; i < nfunc; i++) { int fn = 0; Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } /* create a list with the wrappers that collide with the current one based on argument number */ List *coll = NewList(); for (int k = i + 1; k < nfunc; k++) { Node *nk = Getitem(dispatch, k); Parm *pk = Getattr(nk, "wrap:parms"); int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments)) Append(coll, nk); } // printf("overload: %s coll=%d\n", Char(Getattr(n, "sym:name")), Len(coll)); int num_braces = 0; bool test = (Len(coll) > 0 && num_arguments); if (test) { int need_v = 1; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } String *tm = Getattr(pj, "tmap:typecheck"); if (tm) { tm = Copy(tm); /* normalise for comparison later */ Replaceid(tm, Getattr(pj, "lname"), "_v"); /* if all the wrappers have the same type check on this argument we can optimize it out */ bool emitcheck = 0; for (int k = 0; k < Len(coll) && !emitcheck; k++) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; /* finds arg j on the collider wrapper */ while (pl && l <= j) { if (checkAttribute(pl, "tmap:in:numinputs", "0")) { pl = Getattr(pl, "tmap:in:next"); continue; } if (l == j) { /* we are at arg j, so we compare the tmaps now */ String *tml = Getattr(pl, "tmap:typecheck"); /* normalise it before comparing */ if (tml) Replaceid(tml, Getattr(pl, "lname"), "_v"); if (!tml || Cmp(tm, tml)) emitcheck = 1; //printf("tmap: %s[%d] (%d) => %s\n\n", // Char(Getattr(nk, "sym:name")), // l, emitcheck, tml?Char(tml):0); } Parm *pl1 = Getattr(pl, "tmap:in:next"); if (pl1) pl = pl1; else pl = nextSibling(pl); l++; } } if (emitcheck) { if (need_v) { Printf(f, "int _v = 0;\n"); need_v = 0; } if (j >= num_required) { Printf(f, "if (%s > %d) {\n", argc_template_string, j); num_braces++; } String *tmp = NewStringf(argv_template_string, j); String *conv = Getattr(pj, "implicitconv"); if (conv && !implicitconvtypecheckoff) { Replaceall(tm, "$implicitconv", conv); } else { Replaceall(tm, "$implicitconv", "0"); } Replaceall(tm, "$input", tmp); Printv(f, "{\n", tm, "}\n", NIL); Delete(tm); fn = i + 1; Printf(f, "if (!_v) goto check_%d;\n", fn); } } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pj1 = Getattr(pj, "tmap:in:next"); if (pj1) pj = pj1; else pj = nextSibling(pj); j++; } } /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Printf(f, "}\n"); /* braces closes "if" for this method */ if (fn) Printf(f, "check_%d:\n\n", fn); if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); Delete(lfmt); Delete(coll); } Delete(dispatch); return f; } String *Swig_overload_dispatch(Node *n, const_String_or_char_ptr fmt, int *maxargs) { if (fast_dispatch_mode || GetFlag(n, "feature:fastdispatch")) { return Swig_overload_dispatch_fast(n, fmt, maxargs); } int i, j; *maxargs = 1; String *f = NewString(""); /* Get a list of methods ranked by precedence values and argument count */ List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); /* Loop over the functions */ for (i = 0; i < nfunc; i++) { Node *ni = Getitem(dispatch, i); Parm *pi = Getattr(ni, "wrap:parms"); bool implicitconvtypecheckoff = GetFlag(ni, "implicitconvtypecheckoff") != 0; int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); if (GetFlag(n, "wrap:this")) { num_required++; num_arguments++; } if (num_arguments > *maxargs) *maxargs = num_arguments; if (num_required == num_arguments) { Printf(f, "if (%s == %d) {\n", argc_template_string, num_required); } else { Printf(f, "if ((%s >= %d) && (%s <= %d)) {\n", argc_template_string, num_required, argc_template_string, num_arguments); } if (num_arguments) { Printf(f, "int _v;\n"); } int num_braces = 0; j = 0; Parm *pj = pi; while (pj) { if (checkAttribute(pj, "tmap:in:numinputs", "0")) { pj = Getattr(pj, "tmap:in:next"); continue; } if (j >= num_required) { String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(f, "if (%s <= %d) {\n", argc_template_string, j); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Printf(f, "}\n"); Delete(lfmt); } if (print_typecheck(f, (GetFlag(n, "wrap:this") ? j + 1 : j), pj, implicitconvtypecheckoff)) { Printf(f, "if (_v) {\n"); num_braces++; } if (!Getattr(pj, "tmap:in:SWIGTYPE") && Getattr(pj, "tmap:typecheck:SWIGTYPE")) { /* we emit a warning if the argument defines the 'in' typemap, but not the 'typecheck' one */ Swig_warning(WARN_TYPEMAP_TYPECHECK_UNDEF, Getfile(ni), Getline(ni), "Overloaded method %s with no explicit typecheck typemap for arg %d of type '%s'\n", Swig_name_decl(n), j, SwigType_str(Getattr(pj, "type"), 0)); } Parm *pk = Getattr(pj, "tmap:in:next"); if (pk) pj = pk; else pj = nextSibling(pj); j++; } String *lfmt = ReplaceFormat(fmt, num_arguments); Printf(f, Char(lfmt), Getattr(ni, "wrap:name")); Delete(lfmt); /* close braces */ for ( /* empty */ ; num_braces > 0; num_braces--) Printf(f, "}\n"); Printf(f, "}\n"); /* braces closes "if" for this method */ if (implicitconvtypecheckoff) Delattr(ni, "implicitconvtypecheckoff"); } Delete(dispatch); return f; } /* ----------------------------------------------------------------------------- * Swig_overload_check() * ----------------------------------------------------------------------------- */ void Swig_overload_check(Node *n) { Swig_overload_rank(n, false); } swig-3.0.12/Source/Modules/allegrocl.cxx0000664000175000017500000030665313042756442020012 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * allegrocl.cxx * * ALLEGROCL language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include // #define ALLEGROCL_DEBUG // #define ALLEGROCL_WRAP_DEBUG // #define ALLEGROCL_TYPE_DEBUG // #define ALLEGROCL_CLASS_DEBUG static const char *usage = "\ Allegro CL Options (available with -allegrocl)\n\ -identifier-converter - \n\ Specifies the type of conversion to do on C identifiers to convert\n\ them to symbols. There are two built-in converters: 'null' and\n\ 'lispify'. The default is 'null'. If you supply a name other\n\ than one of the built-ins, then a function by that name will be\n\ called to convert identifiers to symbols.\n\ -[no]cwrap - Turn on or turn off generation of an intermediate C file when\n\ creating a C interface. By default this is only done for C++ code.\n\ -isolate - Define all SWIG helper functions in a package unique to this\n\ module. Avoids redefinition warnings when loading multiple\n\ SWIGged modules into the same running Allegro CL image.\n\ "; static File *f_cl = 0; String *f_clhead = NewString(""); String *f_clwrap = NewString("(swig-in-package ())\n\n"); static File *f_begin; static File *f_runtime; static File *f_cxx_header = 0; static File *f_cxx_wrapper = 0; static String *module_name = 0; static String *swig_package = 0; static String *identifier_converter = NewString("identifier-convert-null"); static bool CWrap = true; // generate wrapper file for C code by default. most correct. static bool Generate_Wrapper = false; static bool unique_swig_package = false; static SwigType *fwdref_ffi_type = NewString("__SWIGACL_FwdReference"); static String *current_namespace = NewString(""); static String *current_package = NewString(""); static Hash *defined_namespace_packages = NewHash(); static Node *in_class = 0; static Node *first_linked_type = 0; static Hash *defined_foreign_types = NewHash(); static Hash *defined_foreign_ltypes = NewHash(); static String *anon_type_name = NewString("anontype"); static int anon_type_count = 0; // stub String *convert_literal(String *num_param, String *type, bool try_to_split = true); class ALLEGROCL:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int namespaceDeclaration(Node *n); virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int classHandler(Node *n); virtual int emit_one(Node *n); virtual int enumDeclaration(Node *n); virtual int enumvalueDeclaration(Node *n); virtual int typedefHandler(Node *n); virtual int classforwardDeclaration(Node *n); virtual int templateDeclaration(Node *n); virtual int validIdentifier(String *s); private: int emit_defun(Node *n, File *f_cl); int emit_dispatch_defun(Node *n); int emit_buffered_defuns(Node *n); int cClassHandler(Node *n); int cppClassHandler(Node *n); }; static ALLEGROCL *allegrocl = 0; static String *trim(String *str) { char *c = Char(str); while (*c != '\0' && isspace((int) *c)) ++c; String *result = NewString(c); Chop(result); return result; } int is_integer(String *s) { char *c = Char(s); if (c[0] == '#' && (c[1] == 'x' || c[1] == 'o')) c += 2; while (*c) { if (!isdigit(*c)) return 0; c++; } return 1; } String *class_from_class_or_class_ref(String *type) { SwigType *stripped = SwigType_strip_qualifiers(type); if (SwigType_isclass(stripped)) return stripped; if (SwigType_ispointer(stripped) || SwigType_isreference(stripped)) { // Printf(stderr,"It is a pointer/reference. Is it a class?\n"); SwigType_pop(stripped); if (SwigType_isclass(stripped)) { return stripped; } } return 0; } String *lookup_defined_foreign_type(String *k) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Looking up defined type '%s'.\n Found: '%s'\n", k, Getattr(defined_foreign_types, k)); #endif return Getattr(defined_foreign_types, k); } String *listify_namespace(String *namespaze) { if (Len(namespaze) == 0) return NewString("()"); String *result = NewStringf("(\"%s\")", namespaze); Replaceall(result, "::", "\" \""); return result; } String *namespaced_name(Node *n, String *ns = current_namespace) { return NewStringf("%s%s%s", ns, (Len(ns) != 0) ? "::" : "", Getattr(n, "sym:name")); } // "Namespace::Nested::Class2::Baz" -> "Baz" static String *strip_namespaces(String *str) { return Swig_scopename_last(str); } void add_linked_type(Node *n) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding linked node of type: %s(%s) %s(%p)\n\n", nodeType(n), Getattr(n, "storage"), Getattr(n, "name"), n); // Swig_print_node(n); #endif if (!first_linked_type) { first_linked_type = n; Setattr(n, "allegrocl:last_linked_type", n); } else { Node *t = Getattr(first_linked_type, "allegrocl:last_linked_type"); Setattr(t, "allegrocl:next_linked_type", n); Setattr(first_linked_type, "allegrocl:last_linked_type", n); } } void replace_linked_type(Node *old, Node *new_node) { Node *prev = Getattr(old, "allegrocl:prev_linked_type"); Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); if (prev) Setattr(prev, "allegrocl:next_linked_type", new_node); Delattr(old, "allegrocl:next_linked_type"); Delattr(old, "allegrocl:prev_linked_type"); // check if we're replacing the first link. if (first_linked_type == old) { first_linked_type = new_node; Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(old, "allegrocl:last_linked_type")); } // check if we're replacing the last link. if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); } void insert_linked_type_at(Node *old, Node *new_node, int before = 1) { Node *p = 0; if (!first_linked_type) { add_linked_type(new_node); return; } if (!before) { Setattr(new_node, "allegrocl:next_linked_type", Getattr(old, "allegrocl:next_linked_type")); Setattr(old, "allegrocl:next_linked_type", new_node); if (Getattr(first_linked_type, "allegrocl:last_linked_type") == old) Setattr(first_linked_type, "allegrocl:last_linked_type", new_node); } else { Node *c = first_linked_type; while (c) { if (c == old) { break; } else { p = c; c = Getattr(c, "allegrocl:next_linked_type"); } } if (c == old) { Setattr(new_node, "allegrocl:next_linked_type", c); if (first_linked_type == c) { first_linked_type = new_node; Setattr(first_linked_type, "allegrocl:last_linked_type", Getattr(c, "allegrocl:last_linked_type")); Delattr(c, "allegrocl:last_linked_type"); } if (p) Setattr(p, "allegrocl:next_linked_type", new_node); } } } Node *find_linked_type_by_name(String *name) { Node *p = 0; Node *c = first_linked_type; // Printf(stderr,"in find_linked_type_by_name '%s'...", name); while (c) { String *key = Getattr(c, "name"); if (!Strcmp(key, name)) { break; } else { p = c; c = Getattr(c, "allegrocl:next_linked_type"); } } // Printf(stderr,"exit find_linked_type_by_name.\n"); if (p && c) Setattr(c, "allegrocl:prev_linked_type", p); // Printf(stderr,"find_linked_type_by_name: DONE\n"); return c; } Node *get_primary_synonym_of(Node *n) { Node *p = Getattr(n, "allegrocl:synonym-of"); Node *prim = n; // Printf(stderr, "getting primary synonym of %p\n", n); while (p) { // Printf(stderr, " found one! %p\n", p); prim = p; p = Getattr(p, "allegrocl:synonym-of"); } // Printf(stderr,"get_primary_syn: DONE. returning %s(%p)\n", Getattr(prim,"name"),prim); return prim; } void add_forward_referenced_type(Node *n, int overwrite = 0) { String *k = Getattr(n, "name"); String *name = Getattr(n, "sym:name"); String *ns = listify_namespace(current_namespace); String *val = Getattr(defined_foreign_types, k); if (!val || overwrite) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Adding forward reference for %s (overwrite=%d)\n", k, overwrite); #endif Setattr(defined_foreign_types, Copy(k), NewString("forward-reference")); String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns); Setattr(defined_foreign_ltypes, Copy(k), mangled_lname_gen); // Printf(f_cl, ";; forward reference stub\n" // "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n" // , name); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Linking forward reference type = %s(%p)\n", k, n); #endif add_linked_type(n); } } void add_defined_foreign_type(Node *n, int overwrite = 0, String *k = 0, String *name = 0, String *ns = current_namespace) { String *val; String *ns_list = listify_namespace(ns); String *templated = n ? Getattr(n, "template") : 0; String *cDeclName = n ? Getattr(n, "name") : 0; #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "IN A-D-F-T. (n=%p, ow=%d, k=%s, name=%s, ns=%s\n", n, overwrite, k, name, ns); Printf(stderr, " templated = '%p', classDecl = '%p'\n", templated, cDeclName); #endif if (n) { if (!name) name = Getattr(n, "sym:name"); if (!name) name = strip_namespaces(Getattr(n, "name")); if (templated) { k = namespaced_name(n); } else { String *kind_of_type = Getattr(n, "kind"); /* For typedefs of the form: typedef struct __xxx { ... } xxx; behavior differs between C mode and C++ mode. C Mode: add_defined_foreign_type will be called once via classHandler to define the type for 'struct __xxx' and add the mapping from 'struct __xxx' -> 'xxx' It will also be called once via typedefHandler to add the mapping 'xxx' -> 'xxx' C++ Mode: add_defined_foreign_type will be called once via classHandler to define the type for 'xxx'. it also adds the mapping from 'xxx' -> 'xxx' and also for 'struct xxx' -> 'xxx' In typedefHandler, we again try to add the mapping from 'xxx' -> 'xxx', which already exists. This second mapping is ignored. Both modes: All references to this typedef'd struct will appear in generated lisp code as an objectd of type 'xxx'. For non-typedef'd structs, the classHand mapping will be struct __xxx -> (swig-insert-id "__xxx") */ // Swig_print_node(n); String *unnamed = Getattr(n, "unnamed"); if (kind_of_type && (!Strcmp(kind_of_type, "struct") || !Strcmp(kind_of_type, "union")) && cDeclName && !unnamed) { k = NewStringf("%s %s", kind_of_type, cDeclName); } else { if (!Strcmp(nodeType(n), "enum") && unnamed) { name = NewStringf("%s%d", anon_type_name, anon_type_count++); k = NewStringf("enum %s", name); Setattr(n, "allegrocl:name", name); } else { k = k ? k : Getattr(n, "name"); } } } // Swig_print_node(n); } String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } val = lookup_defined_foreign_type(k); int is_fwd_ref = 0; if (val) is_fwd_ref = !Strcmp(val, "forward-reference"); if (!val || overwrite || is_fwd_ref) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding defined type '%s' = '%s' '%s' (overwrite=%d, in-class=%d)\n", k, ns, name, overwrite, in_class); #endif String *mangled_name_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", name, ns_list); String *mangled_lname_gen = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", name, ns_list); Setattr(defined_foreign_types, Copy(k), Copy(mangled_name_gen)); Setattr(defined_foreign_ltypes, Copy(k), Copy(mangled_lname_gen)); if (CPlusPlus) { bool cpp_struct = Strstr(k, "struct ") ? true : false; bool cpp_union = Strstr(k, "union ") ? true : false; String *cpp_type = 0; if (cpp_struct) { cpp_type = Copy(k); Replaceall(cpp_type, "struct ", ""); } else if (cpp_union) { cpp_type = Copy(k); Replaceall(cpp_type, "union ", ""); } if (cpp_struct || cpp_union) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " Also adding defined type '%s' = '%s' '%s' (overwrite=%d)\n", cpp_type, ns, name, overwrite); #endif Setattr(defined_foreign_types, Copy(cpp_type), Copy(mangled_name_gen)); Setattr(defined_foreign_ltypes, Copy(cpp_type), Copy(mangled_lname_gen)); } } #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "looking to add %s/%s(%p) to linked_type_list...\n", k, name, n); #endif if (is_fwd_ref) { // Printf(stderr,"*** 1\n"); if (n) add_linked_type(n); } else { // Printf(stderr,"*** 1-a\n"); if (SwigType_istemplate(k)) { SwigType *resolved = SwigType_typedef_resolve_all(k); // Printf(stderr,"*** 1-b\n"); Node *match = find_linked_type_by_name(resolved); Node *new_node = 0; // Printf(stderr, "*** temp-1\n"); if (n) { new_node = n; } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Creating a new templateInst:\n"); Printf(stderr, " name = %s\n", resolved); Printf(stderr, " sym:name = %s\n", name); Printf(stderr, " real-name = %s\n", k); Printf(stderr, " type = %s\n", resolved); Printf(stderr, " ns = %s\n\n", ns); #endif new_node = NewHash(); Setattr(new_node, "nodeType", "templateInst"); Setattr(new_node, "name", Copy(resolved)); Setattr(new_node, "sym:name", Copy(name)); Setattr(new_node, "real-name", Copy(k)); Setattr(new_node, "type", Copy(resolved)); Setattr(new_node, "allegrocl:namespace", ns); Setattr(new_node, "allegrocl:package", ns); } if (!match) { if (!Strcmp(nodeType(new_node), "templateInst") && in_class) { /* this is an implicit template instantiation found while walking a class. need to insert this into the linked_type list before the current class definition */ #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "trying to insert a templateInst before a class\n"); #endif insert_linked_type_at(in_class, new_node); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "DID IT!\n"); #endif } else { // Printf(stderr,"*** 3\n"); add_linked_type(new_node); } Setattr(new_node, "allegrocl:synonym:is-primary", "1"); } else { // a synonym type was found (held in variable 'match') // Printf(stderr, "setting primary synonym of %p to %p\n", new_node, match); if (new_node == match) Printf(stderr, "Hey-4 * - '%s' is a synonym of iteself!\n", Getattr(new_node, "name")); Setattr(new_node, "allegrocl:synonym-of", match); // Printf(stderr,"*** 4\n"); add_linked_type(new_node); } } else { Node *match; if (!Strcmp(nodeType(n), "cdecl") && !Strcmp(Getattr(n, "storage"), "typedef")) { SwigType *type = SwigType_strip_qualifiers(Getattr(n, "type")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Examining typedef '%s' for class references. (%d)\n", type, SwigType_isclass(type)); #endif if (SwigType_isclass(type)) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Found typedef of a class '%s'\n", type); #endif /* For the following parsed expression: typedef struct __xxx { ... } xxx; if n is of kind "class" (defining the class 'struct __xxx' then we add n to the linked type list. if n is "cdecl" node of storage "typedef" (to note that xxx is equivalent to 'struct __xxx' then we don't want to add this node to the linked type list. */ String *defined_type = lookup_defined_foreign_type(type); String *defined_key_type = lookup_defined_foreign_type(k); if ((Strstr(type, "struct ") || Strstr(type, "union ")) && defined_type && !Strcmp(defined_type, defined_key_type)) { // mark as a synonym but don't add to linked_type list // Printf(stderr,"*** 4.8\n"); Setattr(n, "allegrocl:synonym", "1"); } else { SwigType *lookup_type = SwigType_istemplate(type) ? SwigType_typedef_resolve_all(type) : Copy(type); match = find_linked_type_by_name(lookup_type); if (match) { Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", match); Setattr(n, "real-name", Copy(lookup_type)); // Printf(stderr, "*** pre-5: found match of '%s'(%p)\n", Getattr(match,"name"),match); // if(n == match) Printf(stderr, "Hey-5 *** setting synonym of %p to %p\n", n, match); // Printf(stderr,"*** 5\n"); add_linked_type(n); } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Creating classfoward node for struct stub in typedef.\n"); #endif Node *new_node = NewHash(); String *symname = Copy(type); Replaceall(symname, "struct ", ""); Setattr(new_node, "nodeType", "classforward"); Setattr(new_node, "name", Copy(type)); Setattr(new_node, "sym:name", symname); Setattr(new_node, "allegrocl:namespace", ns); Setattr(new_node, "allegrocl:package", ns); String *mangled_new_name = NewStringf("#.(swig-insert-id \"%s\" %s)", symname, ns_list); String *mangled_new_lname = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", symname, ns_list); Setattr(defined_foreign_types, Copy(symname), Copy(mangled_new_name)); Setattr(defined_foreign_ltypes, Copy(symname), Copy(mangled_new_lname)); // Printf(stderr,"Weird! Can't find the type!\n"); add_forward_referenced_type(new_node); add_linked_type(new_node); Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", new_node); add_linked_type(n); } Delete(lookup_type); } } else { // check if it's a pointer or reference to a class. // Printf(stderr,"Checking if '%s' is a p. or r. to a class\n", type); String *class_ref = class_from_class_or_class_ref(type); if (class_ref) { match = find_linked_type_by_name(class_ref); Setattr(n, "allegrocl:synonym", "1"); Setattr(n, "allegrocl:synonym-of", match); add_linked_type(n); } } Delete(type); // synonym types have already been added. // Printf(stderr,"*** 10\n"); if (!Getattr(n, "allegrocl:synonym")) add_linked_type(n); } else if (Getattr(n, "template")) { // Printf(stderr, "this is a class template node(%s)\n", nodeType(n)); String *resolved = SwigType_typedef_resolve_all(Getattr(n, "name")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " looking up %s for linked type match with %s...\n", Getattr(n, "sym:name"), resolved); #endif match = find_linked_type_by_name(resolved); if (!match) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "found no implicit instantiation of %%template node %s(%p)\n", Getattr(n, "name"), n); #endif add_linked_type(n); } else { Node *primary = get_primary_synonym_of(match); Setattr(n, "allegrocl:synonym:is-primary", "1"); Delattr(primary, "allegrocl:synonym:is-primary"); if (n == match) Printf(stderr, "Hey-7 * setting synonym of %p to %p\n (match = %p)", primary, n, match); Setattr(primary, "allegrocl:synonym-of", n); // Printf(stderr,"*** 7\n"); add_linked_type(n); } } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "linking type '%s'(%p)\n", k, n); #endif // Printf(stderr,"*** 8\n"); add_linked_type(n); } } } Delete(mangled_name_gen); Delete(mangled_lname_gen); } else { if (!CPlusPlus || Strcmp(Getattr(n,"kind"),"typedef")) { Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), "Attempting to store a foreign type that exists: %s (%s)\n", k, val); } } Delete(ns_list); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "OUT A-D-F-T\n"); #endif } void note_implicit_template_instantiation(SwigType *t) { // the namespace of the implicit instantiation is not necessarily // current_namespace. Attempt to cull this from the type. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "culling namespace of '%s' from '%s'\n", t, SwigType_templateprefix(t)); #endif SwigType *type = Copy(t); SwigType *tok = SwigType_pop(type); String *implicit_ns = SwigType_istemplate(tok) ? Swig_scopename_prefix(SwigType_templateprefix(tok)) : 0; add_defined_foreign_type(0, 0, t, t, implicit_ns ? implicit_ns : current_namespace); Delete(type); } String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { /* lookup defined foreign type. if it exists, it will return a form suitable for placing into lisp code to generate the def-foreign-type name */ #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "inside g_f_t: looking up '%s' '%s'\n", ty, name); #endif String *found_type = lookup_defined_foreign_type(ty); if (found_type) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "found_type '%s'\n", found_type); #endif return (Strcmp(found_type, "forward-reference") ? Copy(found_type) : get_ffi_type(n, fwdref_ffi_type, "")); } else { Node *node = NewHash(); Setattr(node, "type", ty); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("ffitype", node, name, 0); Delete(node); if (tm) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "g-f-t: found ffitype typemap '%s'\n", tm); #endif return NewString(tm); } if (SwigType_istemplate(ty)) { note_implicit_template_instantiation(ty); return Copy(lookup_defined_foreign_type(ty)); } } return 0; } String *lookup_defined_foreign_ltype(String *l) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Looking up defined ltype '%s'.\n Found: '%s'\n", l, Getattr(defined_foreign_ltypes, l)); #endif return Getattr(defined_foreign_ltypes, l); } /* walk type and return string containing lisp version. recursive. */ String *internal_compose_foreign_type(Node *n, SwigType *ty) { SwigType *tok; String *ffiType = NewString(""); // for a function type, need to walk the parm list. while (Len(ty) != 0) { tok = SwigType_pop(ty); if (SwigType_isfunction(tok)) { // Generate Function wrapper Printf(ffiType, "(:function "); // walk parm list List *pl = SwigType_parmlist(tok); Printf(ffiType, "("); // start parm list for (Iterator i = First(pl); i.item; i = Next(i)) { SwigType *f_arg = SwigType_strip_qualifiers(i.item); Printf(ffiType, "%s ", internal_compose_foreign_type(n, f_arg)); Delete(f_arg); } Printf(ffiType, ")"); // end parm list. // do function return type. Printf(ffiType, " %s)", internal_compose_foreign_type(n, ty)); break; } else if (SwigType_ispointer(tok) || SwigType_isreference(tok)) { Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); } else if (SwigType_isarray(tok)) { Printf(ffiType, "(:array %s", internal_compose_foreign_type(n, ty)); String *atype = NewString("int"); String *dim = convert_literal(SwigType_array_getdim(tok, 0), atype); Delete(atype); if (is_integer(dim)) { Printf(ffiType, " %s)", dim); } else { Printf(ffiType, " #| %s |#)", SwigType_array_getdim(tok, 0)); } } else if (SwigType_ismemberpointer(tok)) { // temp Printf(ffiType, "(* %s)", internal_compose_foreign_type(n, ty)); } else { String *res = get_ffi_type(n, tok, ""); if (res) { Printf(ffiType, "%s", res); } else { SwigType *resolved_type = SwigType_typedef_resolve_all(tok); if (Cmp(resolved_type, tok) != 0) { res = get_ffi_type(n, resolved_type, ""); if (res) { } else { res = internal_compose_foreign_type(n, resolved_type); } if (res) Printf(ffiType, "%s", res); } if (!res) { String *is_struct = 0; String *tok_remove_text = 0; String *tok_name = Copy(tok); String *tok_key = SwigType_str(tok,0); if ((is_struct = Strstr(tok_key, "struct ")) || Strstr(tok_key, "union ")) { tok_remove_text = NewString(is_struct ? "struct " : "union "); } /* be more permissive of opaque types. This is the swig way. compiles will notice if these types are ultimately not present. */ if(tok_remove_text) { Replaceall(tok_name,tok_remove_text,""); } tok_name = strip_namespaces(tok_name); Delete(tok_remove_text); // Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(tok), Getline(tok), "Unable to find definition of '%s', assuming forward reference.\n", tok); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "i-c-f-t: adding forward reference for unknown type '%s'. mapping: %s -> %s\n", tok, tok_key, tok_name); #endif Node *nn = NewHash(); Setattr(nn,"nodeType","classforward"); Setattr(nn,"kind","class"); Setattr(nn,"sym:name",tok_name); Setattr(nn,"name",tok_key); Setattr(nn,"allegrocl:package",current_namespace); add_forward_referenced_type(nn, 0); // tok_name is dangling here, unused. ouch. why? Printf(ffiType, "%s", get_ffi_type(n, tok, ""), tok_name); } } } } return ffiType; } String *compose_foreign_type(Node *n, SwigType *ty, String * /*id*/ = 0) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: ENTER (%s)...\n ", ty); // Printf(stderr, "compose_foreign_type: ENTER (%s)(%s)...\n ", ty, (id ? id : 0)); /* String *id_ref = SwigType_str(ty, id); Printf(stderr, "looking up typemap for %s, found '%s'(%p)\n", id_ref, lookup_res ? Getattr(lookup_res, "code") : 0, lookup_res); if (lookup_res) Swig_print_node(lookup_res); */ #endif /* should we allow named lookups in the typemap here? YES! */ /* unnamed lookups should be found in get_ffi_type, called by internal_compose_foreign_type(), below. */ /* I'm reverting to 'no' for the question above. I can no longer remember why I needed it. If a user needed it, I'll find out as soon as they upgrade. Sigh. -mutandiz 9/16/2008. */ /* if(id && lookup_res) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: EXIT-1 (%s)\n ", Getattr(lookup_res, "code")); #endif return NewString(Getattr(lookup_res, "code")); } */ SwigType *temp = SwigType_strip_qualifiers(ty); String *res = internal_compose_foreign_type(n, temp); Delete(temp); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "compose_foreign_type: EXIT (%s)\n ", res); #endif return res; } void update_package_if_needed(Node *n, File *f = f_clwrap) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "update_package: ENTER... \n"); Printf(stderr, " current_package = '%s'\n", current_package); Printf(stderr, " node_package = '%s'\n", Getattr(n, "allegrocl:package")); Printf(stderr, " node(%p) = '%s'\n", n, Getattr(n, "name")); #endif String *node_package = Getattr(n, "allegrocl:package"); if (Strcmp(current_package, node_package)) { String *lispy_package = listify_namespace(node_package); Delete(current_package); current_package = Copy(node_package); Printf(f, "\n(swig-in-package %s)\n", lispy_package); Delete(lispy_package); } #ifdef ALLEGROCL_DEBUG Printf(stderr, "update_package: EXIT.\n"); #endif } static String *mangle_name(Node *n, char const *prefix = "ACL", String *ns = current_namespace) { String *suffix = Getattr(n, "sym:overname"); String *pre_mangled_name = NewStringf("%s_%s__%s%s", prefix, ns, Getattr(n, "sym:name"), suffix); String *mangled_name = Swig_name_mangle(pre_mangled_name); Delete(pre_mangled_name); return mangled_name; } /* utilities */ /* remove a pointer from ffitype. non-destructive. (* :char) ==> :char (* (:array :int 30)) ==> (:array :int 30) */ String *dereference_ffitype(String *ffitype) { char *start; char *temp = Char(ffitype); String *reduced_type = 0; if(temp && temp[0] == '(' && temp[1] == '*') { temp += 2; // walk past start of pointer references while(*temp == ' ') temp++; start = temp; // temp = Char(reduced_type); reduced_type = NewString(start); temp = Char(reduced_type); // walk to end of string. remove closing paren while(*temp != '\0') temp++; *(--temp) = '\0'; } return reduced_type ? reduced_type : Copy(ffitype); } /* returns new string w/ parens stripped */ String *strip_parens(String *string) { string = Copy(string); Replaceall(string, "(", ""); Replaceall(string, ")", ""); return string; } int ALLEGROCL::validIdentifier(String *s) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "validIdentifier %s\n", s); #endif char *c = Char(s); bool got_dot = false; bool only_dots = true; /* Check that s is a valid common lisp symbol. There's a lot of leeway here. A common lisp symbol is essentially any token that's not a number and does not consist of only dots. We are expressly not allowing spaces in identifiers here, but spaces could be added via the identifier converter. */ while (*c) { if (*c == '.') { got_dot = true; } else { only_dots = false; } if (!isgraph(*c)) return 0; c++; } return (got_dot && only_dots) ? 0 : 1; } String *infix_to_prefix(String *val, char split_op, const String *op, String *type) { List *ored = Split(val, split_op, -1); // some float hackery if (((split_op == '+') || (split_op == '-')) && Len(ored) == 2 && (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE)) { // check that we're not splitting a float String *possible_result = convert_literal(val, type, false); if (possible_result) return possible_result; } // try parsing the split results. if any part fails, kick out. bool part_failed = false; if (Len(ored) > 1) { String *result = NewStringf("(%s", op); for (Iterator i = First(ored); i.item; i = Next(i)) { String *converted = convert_literal(i.item, type); if (converted) { Printf(result, " %s", converted); Delete(converted); } else { part_failed = true; break; } } Printf(result, ")"); Delete(ored); return part_failed ? 0 : result; } Delete(ored); return 0; } /* To be called by code generating the lisp interface Will return a containing the literal based on type. Will return null if there are problems. try_to_split defaults to true (see stub above). */ String *convert_literal(String *literal, String *type, bool try_to_split) { String *num_param = Copy(literal); String *trimmed = trim(num_param); String *num = strip_parens(trimmed), *res = 0; char *s = Char(num); String *ns = listify_namespace(current_namespace); // very basic parsing of infix expressions. if (try_to_split && SwigType_type(type) != T_STRING) { if ((res = infix_to_prefix(num, '|', "logior", type))) return res; if ((res = infix_to_prefix(num, '&', "logand", type))) return res; if ((res = infix_to_prefix(num, '^', "logxor", type))) return res; if ((res = infix_to_prefix(num, '*', "*", type))) return res; if ((res = infix_to_prefix(num, '/', "/", type))) return res; if ((res = infix_to_prefix(num, '+', "+", type))) return res; if ((res = infix_to_prefix(num, '-', "-", type))) return res; // if ((res = infix_to_prefix(num, '~', "lognot", type))) return res; // if( (res = infix_to_prefix(num, '<<', "ash", type)) ) return res; } // unary complement... if (s[0] == '~' && Len(num) >= 2) { String *id = NewString(++s); String *id_conv = convert_literal(id, type, false); Delete(id); if (id_conv) return NewStringf("(lognot %s)", id_conv); s--; } if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) { // Use CL syntax for float literals String *oldnum = Copy(num); // careful. may be a float identifier or float constant. char *num_start = Char(num); char *num_end = num_start + strlen(num_start) - 1; bool is_literal = isdigit(*num_start) || (*num_start == '.'); String *lisp_exp = 0; if (is_literal) { if (*num_end == 'f' || *num_end == 'F') { lisp_exp = NewString("f"); } else { lisp_exp = NewString("d"); } if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { *num_end = '\0'; num_end--; } int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); if (!exponents) Printf(num, "%s0", lisp_exp); if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { // Printf(stderr, "Can't parse '%s' as type '%s'.\n", oldnum, type); Delete(num); num = 0; } Delete(lisp_exp); } else { String *id = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); Delete(num); num = id; } Delete(oldnum); Delete(trimmed); Delete(ns); return num; } else if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ Delete(num); Delete(trimmed); return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ Delete(num); Delete(trimmed); return NewStringf("\"%s\"", num_param); } else if (Len(num) >= 1 && (isdigit(s[0]) || s[0] == '+' || s[0] == '-')) { /* use CL syntax for numbers */ String *oldnum = Copy(num); int usuffixes = Replaceall(num, "u", "") + Replaceall(num, "U", ""); int lsuffixes = Replaceall(num, "l", "") + Replaceall(num, "L", ""); if (usuffixes > 1 || lsuffixes > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", oldnum); SWIG_exit(EXIT_FAILURE); } s = Char(num); if (s[0] == '0' && Len(num) >= 2) { /*octal or hex */ res = NewStringf("#%c%s", tolower(s[1]) == 'x' ? 'x' : 'o', s + 2); Delete(num); } else { res = num; } Delete(oldnum); Delete(trimmed); return res; } else if (allegrocl->validIdentifier(num)) { /* convert C/C++ identifiers to CL symbols */ res = NewStringf("#.(swig-insert-id \"%s\" %s :type :constant)", num, ns); Delete(num); Delete(trimmed); Delete(ns); return res; } else { Delete(trimmed); return num; } } void emit_stub_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_stub_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); Swig_print_node(n); #endif String *name = Getattr(n, "sym:name"); if (Getattr(n, "allegrocl:synonym:already-been-stubbed")) return; String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } else { name = strip_namespaces(name); } // Printf(f_clhead, ";; from emit-stub-class\n"); update_package_if_needed(n, f_clhead); Printf(f_clhead, ";; class template stub.\n"); Printf(f_clhead, "(swig-def-foreign-stub \"%s\")\n", name); Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_stub_class: EXIT\n"); #endif } void emit_synonym(Node *synonym) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_synonym: ENTER... \n"); #endif // Printf(stderr,"in emit_synonym for %s(%p)\n", Getattr(synonym,"name"),synonym); int is_tempInst = !Strcmp(nodeType(synonym), "templateInst"); String *synonym_type; Node *of = get_primary_synonym_of(synonym); if (is_tempInst) { // Printf(stderr, "*** using real-name '%s'\n", Getattr(synonym,"real-name")); synonym_type = Getattr(synonym, "real-name"); } else { // Printf(stderr, "*** using name '%s'\n", Getattr(synonym,"name")); synonym_type = Getattr(synonym, "name"); } String *synonym_ns = listify_namespace(Getattr(synonym, "allegrocl:namespace")); String *syn_ltype, *syn_type, *of_ltype; // String *of_cdeclname = Getattr(of,"allegrocl:classDeclarationName"); String *of_ns = Getattr(of, "allegrocl:namespace"); String *of_ns_list = listify_namespace(of_ns); // String *of_name = of_cdeclname ? NewStringf("struct %s", Getattr(of,"name")) : NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); // String *of_name = NewStringf("%s::%s", of_ns, Getattr(of,"sym:name")); String *of_name = namespaced_name(of, of_ns); if (CPlusPlus && !Strcmp(nodeType(synonym), "cdecl")) { String *real_name = Getattr(synonym, "real-name"); if (!real_name) real_name = NewString("Unknown"); // TODO: fix syn_ltype = NewStringf("#.(swig-insert-id \"%s\" %s :type :class)", strip_namespaces(real_name), synonym_ns); syn_type = NewStringf("#.(swig-insert-id \"%s\" %s :type :type)", strip_namespaces(real_name), synonym_ns); } else { syn_ltype = lookup_defined_foreign_ltype(synonym_type); syn_type = lookup_defined_foreign_type(synonym_type); } of_ltype = lookup_defined_foreign_ltype(of_name); // Printf(stderr,";; from emit-synonym syn='%s' of_ltype='%s'\n", syn_ltype, of_ltype); if( of_ltype ) Printf(f_clhead, "(swig-def-synonym-type %s\n %s\n %s)\n", syn_ltype, of_ltype, syn_type); Delete(synonym_ns); Delete(of_ns_list); Delete(of_name); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_synonym: EXIT\n"); #endif } void emit_full_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_full_class: ENTER... \n"); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); // Printf(stderr,"in emit_full_class: '%s'(%p).", Getattr(n,"name"),n); if (Getattr(n, "allegrocl:synonym-of")) { // Printf(stderr,"but it's a synonym of something.\n"); update_package_if_needed(n, f_clhead); emit_synonym(n); return; } // collect superclasses String *bases = Getattr(n, "bases"); String *supers = NewString("("); if (bases) { int first = 1; for (Iterator i = First(bases); i.item; i = Next(i)) { if (!first) Printf(supers, " "); String *s = lookup_defined_foreign_ltype(Getattr(i.item, "name")); // String *name = Getattr(i.item,"name"); if (s) { Printf(supers, "%s", s); } else { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "emit_templ_inst: did not find ltype for base class %s (%s)", Getattr(i.item, "name"), Getattr(n, "allegrocl:namespace")); #endif } } } else { Printf(supers, "ff:foreign-pointer"); } // check for "feature:aclmixins" and add those as well. Printf(supers, " %s)", Getattr(n,"feature:aclmixins")); // Walk children to generate type definition. String *slotdefs = NewString(" "); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, " walking children...\n"); #endif Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { String *storage_type = Getattr(c, "storage"); if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) { String *access = Getattr(c, "access"); // hack. why would decl have a value of "variableHandler" and now "0"? String *childDecl = Getattr(c, "decl"); // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); if (!childDecl || !Strcmp(childDecl, "0")) childDecl = NewString(""); SwigType *childType; String *cname; // don't include types for private slots (yet). spr33959. if(access && Strcmp(access,"public")) { childType = NewStringf("int"); cname = NewString("nil"); } else { childType = NewStringf("%s%s", childDecl, Getattr(c, "type")); cname = Copy(Getattr(c, "name")); } if (!SwigType_isfunction(childType)) { // Printf(slotdefs, ";;; member functions don't appear as slots.\n "); // Printf(slotdefs, ";; "); String *ns = listify_namespace(Getattr(n, "allegrocl:package")); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); #endif Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, compose_foreign_type(n, childType)); Delete(ns); if (access && Strcmp(access, "public")) Printf(slotdefs, " ;; %s member", access); Printf(slotdefs, "\n "); } Delete(childType); Delete(cname); } } String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); update_package_if_needed(n, f_clhead); Printf(f_clhead, "(swig-def-foreign-class \"%s\"\n %s\n (:%s\n%s))\n\n", name, supers, kind, slotdefs); Delete(supers); Delete(ns_list); Setattr(n, "allegrocl:synonym:already-been-stubbed", "1"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_full_class: EXIT\n"); #endif } void emit_class(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); #endif int is_tempInst = !Strcmp(nodeType(n), "templateInst"); String *ns_list = listify_namespace(Getattr(n, "allegrocl:namespace")); String *name = Getattr(n, is_tempInst ? "real-name" : "name"); String *tname = SwigType_istemplate_templateprefix(name); if (tname) { String *temp = strip_namespaces(tname); name = NewStringf("%s%s%s", temp, SwigType_templateargs(name), SwigType_templatesuffix(name)); Delete(temp); Delete(tname); } else { name = strip_namespaces(name); } if (Getattr(n, "allegrocl:synonym:is-primary")) { // Printf(stderr," is primary... "); if (is_tempInst) { emit_stub_class(n); } else { emit_full_class(n); } } else { // Node *primary = Getattr(n,"allegrocl:synonym-of"); Node *primary = get_primary_synonym_of(n); if (primary && (primary != n)) { // Printf(stderr," emitting synonym... "); emit_stub_class(primary); update_package_if_needed(n, f_clhead); emit_synonym(n); } else { emit_full_class(n); } } // Printf(stderr,"DONE\n"); Delete(name); Delete(ns_list); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_class: EXIT\n"); #endif } void emit_typedef(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_typedef: ENTER... \n"); #endif String *name; String *sym_name = Getattr(n, "sym:name"); String *type = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type")); String *lisp_type = compose_foreign_type(n, type); Delete(type); Node *in_class = Getattr(n, "allegrocl:typedef:in-class"); // Printf(stderr,"in emit_typedef: '%s'(%p).",Getattr(n,"name"),n); if (Getattr(n, "allegrocl:synonym-of")) { // Printf(stderr," but it's a synonym of something.\n"); emit_synonym(n); return; } if (in_class) { String *class_name = Getattr(in_class, "name"); String *tname = SwigType_istemplate_templateprefix(class_name); if (tname) { String *temp = strip_namespaces(tname); class_name = NewStringf("%s%s%s", temp, SwigType_templateargs(class_name), SwigType_templatesuffix(class_name)); Delete(temp); Delete(tname); } name = NewStringf("%s__%s", class_name, sym_name); Setattr(n, "allegrocl:in-class", in_class); } else { name = sym_name ? Copy(sym_name) : Copy(Getattr(n, "name")); } // leave these in for now. might want to change these to def-foreign-class at some point. // Printf(f_clhead, ";; %s\n", SwigType_typedef_resolve_all(lisp_type)); Printf(f_clhead, "(swig-def-foreign-type \"%s\"\n %s)\n", name, lisp_type); Delete(name); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_typedef: EXIT\n"); #endif } void emit_enum_type_no_wrap(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type_no_wrap: ENTER... \n"); #endif String *unnamed = Getattr(n, "unnamed"); String *name; // SwigType *enumtype; name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); Node *node = NewHash(); Setattr(node, "type", tmp); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); Delete(tmp); if (name) { String *ns = listify_namespace(current_namespace); Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); Delete(ns); // walk children. Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { if (!Getattr(c, "error")) { String *val = Getattr(c, "enumvalue"); if (!val) val = Getattr(c, "enumvalueex"); String *converted_val = convert_literal(val, Getattr(c, "type")); String *valname = Getattr(c, "sym:name"); if (converted_val) { Printf(f_clhead, "(swig-defconstant \"%s\" %s)\n", valname, converted_val); Delete(converted_val); } else { Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse enum value '%s'. Setting to NIL\n", val); Printf(f_clhead, "(swig-defconstant \"%s\" nil #| %s |#)\n", valname, val); } } } } Printf(f_clhead, "\n"); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type_no_wrap: EXIT\n"); #endif } void emit_enum_type(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type: ENTER... \n"); #endif if (!Generate_Wrapper) { emit_enum_type_no_wrap(n); return; } String *unnamed = Getattr(n, "unnamed"); String *name; // SwigType *enumtype; name = unnamed ? Getattr(n, "allegrocl:name") : Getattr(n, "sym:name"); SwigType *tmp = NewStringf("enum %s", unnamed ? unnamed : name); Node *node = NewHash(); Setattr(node, "type", tmp); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *enumtype = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); Delete(tmp); if (name) { String *ns = listify_namespace(current_namespace); Printf(f_clhead, "(swig-def-foreign-type \"%s\" %s)\n", name, enumtype); Delete(ns); // walk children. Node *c; for(c = firstChild(n); c; c=nextSibling(c)) { String *mangled_name = mangle_name(c, "ACL_ENUM", Getattr(c,"allegrocl:package")); Printf(f_clhead, "(swig-defvar \"%s\" \"%s\" :type :constant :ftype :signed-long)\n", Getattr(c, "sym:name"), mangled_name); Delete(mangled_name); } } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_enum_type: EXIT\n"); #endif } void emit_default_linked_type(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_default_linked_type: ENTER... \n"); #endif // catchall for non class types. if (!Strcmp(nodeType(n), "classforward")) { Printf(f_clhead, ";; forward referenced stub.\n"); Printf(f_clhead, "(swig-def-foreign-class \"%s\" (ff:foreign-pointer) (:class ))\n\n", Getattr(n, "sym:name")); } else if (!Strcmp(nodeType(n), "enum")) { emit_enum_type(n); } else { Printf(stderr, "Don't know how to emit node type '%s' named '%s'\n", nodeType(n), Getattr(n, "name")); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_default_linked_type: EXIT\n"); #endif } void dump_linked_types(File *f) { Node *n = first_linked_type; int i = 0; while (n) { Printf(f, "%d: (%p) node '%s' name '%s'\n", i++, n, nodeType(n), Getattr(n, "sym:name")); Node *t = Getattr(n, "allegrocl:synonym-of"); if (t) Printf(f, " synonym-of %s(%p)\n", Getattr(t, "name"), t); n = Getattr(n, "allegrocl:next_linked_type"); } } void emit_linked_types() { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_linked_types: ENTER... "); #endif Node *n = first_linked_type; while (n) { String *node_type = nodeType(n); // Printf(stderr,"emitting node %s(%p) of type %s.", Getattr(n,"name"),n, nodeType(n)); if (!Strcmp(node_type, "class") || !Strcmp(node_type, "templateInst")) { // may need to emit a stub, so it will update the package itself. // Printf(stderr," Passing to emit_class."); emit_class(n); } else if (!Strcmp(nodeType(n), "cdecl")) { // Printf(stderr," Passing to emit_typedef."); update_package_if_needed(n, f_clhead); emit_typedef(n); } else { // Printf(stderr," Passing to default_emitter."); update_package_if_needed(n, f_clhead); emit_default_linked_type(n); } n = Getattr(n, "allegrocl:next_linked_type"); // Printf(stderr,"returned.\n"); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_linked_types: EXIT\n"); #endif } extern "C" Language *swig_allegrocl(void) { return (allegrocl = new ALLEGROCL()); } void ALLEGROCL::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGALLEGROCL 1", 0); SWIG_library_directory("allegrocl"); SWIG_config_file("allegrocl.swg"); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-identifier-converter")) { char *conv = argv[i + 1]; if (!conv) Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; /* check for built-ins */ if (!strcmp(conv, "lispify")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-lispify"); } else if (!strcmp(conv, "null")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-null"); } else { /* Must be user defined */ Delete(identifier_converter); identifier_converter = NewString(conv); } } else if (!strcmp(argv[i], "-cwrap")) { CWrap = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocwrap")) { CWrap = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-isolate")) { unique_swig_package = true; Swig_mark_arg(i); } if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } } allow_overloading(); } int ALLEGROCL::top(Node *n) { module_name = Getattr(n, "name"); String *cxx_filename = Getattr(n, "outfile"); String *cl_filename = NewString(""); swig_package = unique_swig_package ? NewStringf("swig.%s", module_name) : NewString("swig"); Printf(cl_filename, "%s%s.cl", SWIG_output_directory(), module_name); f_cl = NewFile(cl_filename, "w", SWIG_output_files()); if (!f_cl) { Printf(stderr, "Unable to open %s for writing\n", cl_filename); SWIG_exit(EXIT_FAILURE); } Generate_Wrapper = CPlusPlus || CWrap; if (Generate_Wrapper) { f_begin = NewFile(cxx_filename, "w", SWIG_output_files()); if (!f_begin) { Delete(f_cl); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } } else f_begin = NewString(""); f_runtime = NewString(""); f_cxx_header = f_runtime; f_cxx_wrapper = NewString(""); Swig_register_filebyname("header", f_cxx_header); Swig_register_filebyname("wrapper", f_cxx_wrapper); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("lisp", f_clwrap); Swig_register_filebyname("lisphead", f_cl); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGALLEGROCL\n#define SWIGALLEGROCL\n#endif\n\n"); Swig_banner_target_lang(f_cl, ";;"); Printf(f_cl, "\n" "(defpackage :%s\n" " (:use :common-lisp :ff :excl)\n" " (:export #:*swig-identifier-converter* #:*swig-module-name*\n" " #:*void* #:*swig-export-list*))\n" "(in-package :%s)\n\n" "(eval-when (:compile-toplevel :load-toplevel :execute)\n" " (defparameter *swig-identifier-converter* '%s)\n" " (defparameter *swig-module-name* :%s))\n\n", swig_package, swig_package, identifier_converter, module_name); Printf(f_cl, "(defpackage :%s\n" " (:use :common-lisp :%s :ff :excl))\n\n", module_name, swig_package); Printf(f_clhead, "(in-package :%s)\n", module_name); Language::top(n); #ifdef ALLEGROCL_TYPE_DEBUG dump_linked_types(stderr); #endif emit_linked_types(); Printf(f_clwrap, "\n(cl::in-package :%s)\n", swig_package); Printf(f_clwrap, "\n(macrolet ((swig-do-export ()\n"); Printf(f_clwrap, " `(dolist (s ',*swig-export-list*)\n"); Printf(f_clwrap, " (apply #'export s))))\n"); Printf(f_clwrap, " (swig-do-export))\n"); Printf(f_clwrap, "\n(setq *swig-export-list* nil)\n"); Printf(f_cl, "%s\n", f_clhead); Printf(f_cl, "%s\n", f_clwrap); Delete(f_cl); Delete(f_clhead); Delete(f_clwrap); Dump(f_runtime, f_begin); Printf(f_begin, "%s\n", f_cxx_wrapper); Delete(f_runtime); Delete(f_begin); Delete(f_cxx_wrapper); // Swig_print_tree(n); return SWIG_OK; } /* very shamelessly 'borrowed' from overload.cxx, which keeps the below Swig_overload_rank() code to itself. We don't need a dispatch function in the C++ wrapper code; we want it over on the lisp side. */ #define Swig_overload_rank Allegrocl_swig_overload_rank #define MAX_OVERLOAD 256 /* Overload "argc" and "argv" */ // String *argv_template_string; // String *argc_template_string; struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ }; /* ----------------------------------------------------------------------------- * Swig_overload_rank() * * This function takes an overloaded declaration and creates a list that ranks * all overloaded methods in an order that can be used to generate a dispatch * function. * Slight difference in the way this function is used by scripting languages and * statically typed languages. The script languages call this method via * Swig_overload_dispatch() - where wrappers for all overloaded methods are generated, * however sometimes the code can never be executed. The non-scripting languages * call this method via Swig_overload_check() for each overloaded method in order * to determine whether or not the method should be wrapped. Note the slight * difference when overloading methods that differ by const only. The * scripting languages will ignore the const method, whereas the non-scripting * languages ignore the first method parsed. * ----------------------------------------------------------------------------- */ static List *Swig_overload_rank(Node *n, bool script_lang_wrapping) { Overloaded nodes[MAX_OVERLOAD]; int nnodes = 0; Node *o = Getattr(n, "sym:overloaded"); Node *c; if (!o) return 0; c = o; while (c) { if (Getattr(c, "error")) { c = Getattr(c, "sym:nextSibling"); continue; } /* if (SmartPointer && Getattr(c,"cplus:staticbase")) { c = Getattr(c,"sym:nextSibling"); continue; } */ /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ if (Getattr(c, "wrap:name")) { nodes[nnodes].n = c; nodes[nnodes].parms = Getattr(c, "wrap:parms"); nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); nodes[nnodes].error = 0; nnodes++; } c = Getattr(c, "sym:nextSibling"); } /* Sort the declarations by required argument count */ { int i, j; for (i = 0; i < nnodes; i++) { for (j = i + 1; j < nnodes; j++) { if (nodes[i].argc > nodes[j].argc) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } } } } /* Sort the declarations by argument types */ { int i, j; for (i = 0; i < nnodes - 1; i++) { if (nodes[i].argc == nodes[i + 1].argc) { for (j = i + 1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { Parm *p1 = nodes[i].parms; Parm *p2 = nodes[j].parms; int differ = 0; int num_checked = 0; while (p1 && p2 && (num_checked < nodes[i].argc)) { // Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); if (checkAttribute(p1, "tmap:in:numinputs", "0")) { p1 = Getattr(p1, "tmap:in:next"); continue; } if (checkAttribute(p2, "tmap:in:numinputs", "0")) { p2 = Getattr(p2, "tmap:in:next"); continue; } String *t1 = Getattr(p1, "tmap:typecheck:precedence"); String *t2 = Getattr(p2, "tmap:typecheck:precedence"); if ((!t1) && (!nodes[i].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[i].n), SwigType_str(Getattr(p1, "type"), 0)); nodes[i].error = 1; } else if ((!t2) && (!nodes[j].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[j].n), SwigType_str(Getattr(p2, "type"), 0)); nodes[j].error = 1; } if (t1 && t2) { int t1v, t2v; t1v = atoi(Char(t1)); t2v = atoi(Char(t2)); differ = t1v - t2v; } else if (!t1 && t2) differ = 1; else if (t1 && !t2) differ = -1; else if (!t1 && !t2) differ = -1; num_checked++; if (differ > 0) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; break; } else if ((differ == 0) && (Strcmp(t1, "0") == 0)) { t1 = Getattr(p1, "ltype"); if (!t1) { t1 = SwigType_ltype(Getattr(p1, "type")); if (Getattr(p1, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t1); } Setattr(p1, "ltype", t1); } t2 = Getattr(p2, "ltype"); if (!t2) { t2 = SwigType_ltype(Getattr(p2, "type")); if (Getattr(p2, "tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t2); } Setattr(p2, "ltype", t2); } /* Need subtype check here. If t2 is a subtype of t1, then we need to change the order */ if (SwigType_issubtype(t2, t1)) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } if (Strcmp(t1, t2) != 0) { differ = 1; break; } } else if (differ) { break; } if (Getattr(p1, "tmap:in:next")) { p1 = Getattr(p1, "tmap:in:next"); } else { p1 = nextSibling(p1); } if (Getattr(p2, "tmap:in:next")) { p2 = Getattr(p2, "tmap:in:next"); } else { p2 = nextSibling(p2); } } if (!differ) { /* See if declarations differ by const only */ String *d1 = Getattr(nodes[i].n, "decl"); String *d2 = Getattr(nodes[j].n, "decl"); if (d1 && d2) { String *dq1 = Copy(d1); String *dq2 = Copy(d2); if (SwigType_isconst(d1)) { Delete(SwigType_pop(dq1)); } if (SwigType_isconst(d2)) { Delete(SwigType_pop(dq2)); } if (Strcmp(dq1, dq2) == 0) { if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { if (script_lang_wrapping) { // Swap nodes so that the const method gets ignored (shadowed by the non-const method) Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } } Delete(dq1); Delete(dq2); } } if (!differ) { if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s effectively ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[i].n), Getline(nodes[i].n), "as it is shadowed by %s.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } nodes[j].error = 1; } } } } } } List *result = NewList(); { int i; for (i = 0; i < nnodes; i++) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result, nodes[i].n); // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } return result; } /* end shameless borrowing */ int any_varargs(ParmList *pl) { Parm *p; for (p = pl; p; p = nextSibling(p)) { if (SwigType_isvarargs(Getattr(p, "type"))) return 1; } return 0; } String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); Delete(node); return tm ? NewString(tm) : NewString(""); } Node *parent_node_skipping_extends(Node *n) { Node *result = n; do { result = parentNode(result); } while (Cmp("extend", nodeType(result)) == 0); return result; } /* ----------------------------------------------------------------------------- * emit_num_lin_arguments() * * Calculate the total number of arguments. This function is safe for use * with multi-argument typemaps which may change the number of arguments in * strange ways. * ----------------------------------------------------------------------------- */ int emit_num_lin_arguments(ParmList *parms) { Parm *p = parms; int nargs = 0; while (p) { // Printf(stderr,"enla: '%s' lin='%p' numinputs='%s'\n", Getattr(p,"name"), Getattr(p,"tmap:lin"), Getattr(p,"tmap:lin:numinputs")); if (Getattr(p, "tmap:lin")) { nargs += GetInt(p, "tmap:lin:numinputs"); p = Getattr(p, "tmap:lin:next"); } else { p = nextSibling(p); } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } String *id_converter_type(SwigType const *type) { SwigType *t = Copy(type); String *result = 0; if (SwigType_ispointer(t)) { SwigType_pop(t); String *pointee = id_converter_type(t); result = NewStringf("(:* %s)", pointee); Delete(pointee); } else if (SwigType_ismemberpointer(t)) { String *klass = SwigType_parm(t); SwigType_pop(t); String *member = id_converter_type(t); result = NewStringf("(:member \"%s\" %s)", klass, member); Delete(klass); Delete(member); } else if (SwigType_isreference(t)) { SwigType_pop(t); String *referencee = id_converter_type(t); result = NewStringf("(:& %s)", referencee); Delete(referencee); } else if (SwigType_isarray(t)) { String *size = SwigType_parm(t); SwigType_pop(t); String *element_type = id_converter_type(t); result = NewStringf("(:array %s \"%s\")", element_type, size); Delete(size); Delete(element_type); } else if (SwigType_isfunction(t)) { result = NewString("(:function ("); String *parmlist_str = SwigType_parm(t); List *parms = SwigType_parmlist(parmlist_str); for (Iterator i = First(parms); i.item;) { String *parm = id_converter_type((SwigType *) i.item); Printf(result, "%s", parm); i = Next(i); if (i.item) Printf(result, " "); Delete(parm); } SwigType_pop(t); String *ret = id_converter_type(t); Printf(result, ") %s)", ret); Delete(parmlist_str); Delete(parms); Delete(ret); } else if (SwigType_isqualifier(t)) { result = NewString("(:qualified ("); String *qualifiers_str = Copy(SwigType_parm(t)); // ?! // Replaceall below SEGVs if we don't put the Copy here... SwigType_pop(t); String *qualifiee = id_converter_type(t); Replaceall(qualifiers_str, " ", " :"); if (Len(qualifiers_str) > 0) Printf(result, ":"); Printf(result, "%s) %s)", qualifiers_str, qualifiee); Delete(qualifiers_str); Delete(qualifiee); } else if (SwigType_istemplate(t)) { result = NewStringf("(:template \"%s\")", t); } else { /* if (SwigType_issimple(t)) */ if (Strstr(Char(t), "::")) { result = listify_namespace(t); } else { result = NewStringf("\"%s\"", t); } } Delete(t); return result; } static ParmList *parmlist_with_names(ParmList *pl) { ParmList *pl2 = CopyParmList(pl); for (Parm *p = pl, *p2 = pl2; p2; p = nextSibling(p), p2 = nextSibling(p2)) { if (!Getattr(p2, "name")) Setattr(p2, "name", Getattr(p2, "lname")); Setattr(p2, "name", strip_namespaces(Getattr(p2, "name"))); Setattr(p2, "tmap:ctype", Getattr(p, "tmap:ctype")); String *temp = Getattr(p, "tmap:lin"); if (temp) { Setattr(p2, "tmap:lin", temp); Setattr(p2, "tmap:lin:next", Getattr(p, "tmap:lin:next")); } } return pl2; } static String *parmlist_str_id_converter(ParmList *pl) { String *result = NewString(""); for (Parm *p = pl; p;) { String *lispy_type = id_converter_type(Getattr(p, "type")); Printf(result, "(\"%s\" %s)", Getattr(p, "name"), lispy_type); Delete(lispy_type); if ((p = nextSibling(p))) Printf(result, " "); } return result; } String *collect_others_args(Node *overload) { String *overloaded_from = Getattr(overload, "sym:overloaded"); String *others_args = NewString(""); int first_overload = 1; for (Node *overload2 = overloaded_from; overload2; overload2 = Getattr(overload2, "sym:nextSibling")) { if (overload2 == overload || GetInt(overload2, "overload:ignore")) continue; ParmList *opl = parmlist_with_names(Getattr(overload2, "wrap:parms")); String *args = parmlist_str_id_converter(opl); if (!first_overload) Printf(others_args, "\n "); Printf(others_args, "(%s)", args); Delete(args); Delete(opl); first_overload = 0; } return others_args; } struct IDargs { String *name; String *type; String *klass; String *arity; IDargs():name(0), type(0), klass(0), arity(0) { } String *full_quoted_str() { String *result = no_others_quoted_str(); if (arity) Printf(result, " :arity %s", arity); return result; } String *no_others_quoted_str() { String *result = NewString(""); Printf(result, "\"%s\" :type :%s", name, type); if (klass) Printf(result, " :class \"%s\"", klass); return result; } String *noname_str(bool include_class = true) { String *result = NewString(""); Printf(result, " :type :%s", type); if (klass && include_class) Printf(result, " :class \"%s\"", klass); if (arity) Printf(result, " :arity %s", arity); return result; } String *noname_no_others_str(bool include_class = true) { String *result = NewString(""); Printf(result, " :type :%s", type); if (klass && include_class) Printf(result, " :class \"%s\"", klass); return result; } }; IDargs *id_converter_arguments(Node *n) { IDargs *result = (IDargs *) GetVoid(n, "allegrocl:id-converter-args"); if (!result) result = new IDargs; // Base name if (!result->name) { result->name = Getattr(n, "allegrocl:old-sym:name"); if (!result->name) result->name = Getattr(n, "sym:name"); result->name = Copy(result->name); } // :type if (result->type) Delete(result->type); if (!Getattr(n, "allegrocl:kind")) Setattr(n, "allegrocl:kind", "function"); if (Strstr(Getattr(n, "name"), "operator ")) Replaceall(Getattr(n, "allegrocl:kind"), "function", "operator"); if (Strstr(Getattr(n, "allegrocl:kind"), "variable")) { int name_end = Len(Getattr(n, "sym:name")) - 4; char *str = Char(Getattr(n, "sym:name")); String *get_set = NewString(str + name_end + 1); result->type = Copy(Getattr(n, "allegrocl:kind")); Replaceall(result->type, "variable", ""); Printf(result->type, "%ster", get_set); Delete(get_set); } else { result->type = Copy(Getattr(n, "allegrocl:kind")); } // :class if (Strstr(result->type, "member ")) { Replaceall(result->type, "member ", ""); if (!result->klass) { result->klass = Copy(Getattr(parent_node_skipping_extends(n), "sym:name")); } } // :arity if (Getattr(n, "sym:overloaded")) { if (result->arity) Delete(result->arity); result->arity = NewStringf("%d", // emit_num_arguments(Getattr(n, "wrap:parms"))); emit_num_lin_arguments(Getattr(n, "wrap:parms"))); // Printf(stderr, "got arity of '%s' node '%s' '%p'\n", result->arity, Getattr(n,"name"), Getattr(n,"wrap:parms")); } SetVoid(n, "allegrocl:id-converter-args", result); return result; } int ALLEGROCL::emit_buffered_defuns(Node *n) { Node *overloaded_from = Getattr(n, "sym:overloaded"); String *wrap; if (!overloaded_from) { wrap = Getattr(n, "allegrocl:lisp-wrap"); Printf(f_clwrap, "%s\n", wrap); Delattr(n, "allegrocl:lisp-wrap"); Delete(wrap); } else { for (Node *overload = overloaded_from; overload; overload = Getattr(overload, "sym:nextSibling")) { String *others_args = collect_others_args(overload); wrap = Getattr(overload, "allegrocl:lisp-wrap"); Replaceall(wrap, "@@OTHERS-ARGS-GO-HERE@@", others_args); // IDargs* id_args = id_converter_arguments(overload); // Replaceall(id_args->others_args, "@@OTHERS-ARGS-GO-HERE@@", others_args); if (!GetInt(overload, "overload:ignore")) Printf(f_clwrap, "%s", wrap); Delattr(overload, "allegrocl:lisp-wrap"); Delete(wrap); } } return SWIG_OK; } String *dispatching_type(Node *n, Parm *p) { String *result = 0; String *parsed = Getattr(p, "type"); //Swig_cparse_type(Getattr(p,"tmap:ctype")); String *cl_t = SwigType_typedef_resolve_all(parsed); Node *node = NewHash(); Setattr(node, "type", parsed); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lispclass", node, Getattr(p, "name"), 0); Delete(node); if (tm) { result = Copy(tm); } else { String *lookup_type = class_from_class_or_class_ref(parsed); if (lookup_type) result = lookup_defined_foreign_ltype(lookup_type); } // if (!result && SwigType_ispointer(cl_t)) { // SwigType_pop(cl_t); // result = lookup_defined_foreign_ltype(cl_t); // } if (!result) result = NewStringf("ff:foreign-pointer"); // Delete(parsed); Delete(cl_t); return result; } int ALLEGROCL::emit_dispatch_defun(Node *n) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_dispatch_defun: ENTER... "); #endif List *overloads = Swig_overload_rank(n, true); // Printf(stderr,"\ndispatch node=%p\n\n", n); // Swig_print_node(n); Node *overloaded_from = Getattr(n,"sym:overloaded"); bool include_class = Getattr(overloaded_from, "allegrocl:dispatcher:include-class") ? true : false; String *id_args = id_converter_arguments(n)->noname_no_others_str(include_class); Printf(f_clwrap, "(swig-dispatcher (\"%s\" %s :arities (", Getattr(overloaded_from, "allegrocl:dispatcher:name"), id_args); Delattr(overloaded_from, "allegrocl:dispatcher:include-class"); Delattr(overloaded_from, "allegrocl:dispatcher:name"); int last_arity = -1; for (Iterator i = First(overloads); i.item; i = Next(i)) { int arity = emit_num_lin_arguments(Getattr(i.item, "wrap:parms")); if (arity == last_arity) continue; Printf(f_clwrap, "%s%d", last_arity == -1 ? "" : " ", arity); last_arity = arity; } Printf(f_clwrap, ")))\n"); Delete(id_args); Delete(overloads); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_dispatch_defun: EXIT\n"); #endif return SWIG_OK; } int ALLEGROCL::emit_defun(Node *n, File *fcl) { #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_defun: ENTER... "); #endif // avoid name conflicts between smart pointer wrappers and the wrappers for the // actual class. bool smartmemberwrapper = (!Cmp(Getattr(n, "view"), "memberfunctionHandler") && Getattr(n,"allocate:smartpointeraccess")); #ifdef ALLEGROCL_DEBUG int auto_generated = Cmp(Getattr(n, "view"), "globalfunctionHandler"); Printf(stderr, "%s%sfunction %s%s%s\n", auto_generated ? "> " : "", Getattr(n, "sym:overloaded") ? "overloaded " : "", current_namespace, (current_namespace) > 0 ? "::" : "", Getattr(n, "sym:name")); Printf(stderr, " (view: %s)\n", Getattr(n, "view")); Swig_print_node(n); #endif String *funcname = Getattr(n, "allegrocl:old-sym:name"); if (smartmemberwrapper || !funcname) funcname = Getattr(n, "sym:name"); String *mangled_name = Getattr(n, "wrap:name"); ParmList *pl = parmlist_with_names(Getattr(n, "wrap:parms")); // attach typemap info. Wrapper *wrap = NewWrapper(); Swig_typemap_attach_parms("lin", pl, wrap); // Swig_typemap_attach_parms("ffitype", pl, wrap); Swig_typemap_lookup("lout", n, Swig_cresult_name(), 0); SwigType *result_type = Swig_cparse_type(Getattr(n, "tmap:ctype")); // prime the pump, with support for OUTPUT, INOUT typemaps. Printf(wrap->code, "(cl::let ((ACL_ffresult %s:*void*)\n ACL_result)\n $body\n (cl::if (cl::eq ACL_ffresult %s:*void*)\n (cl::values-list ACL_result)\n (cl::values-list (cl::cons ACL_ffresult ACL_result))))", swig_package, swig_package); Parm *p; int largnum = 0, argnum = 0, first = 1; // int varargs=0; if (Generate_Wrapper) { String *extra_parms = id_converter_arguments(n)->noname_str(smartmemberwrapper ? false : true); Node *overloaded_from = Getattr(n,"sym:overloaded"); if (overloaded_from) { if(!GetFlag(overloaded_from,"allegrocl:dispatcher:name")) { Setattr(overloaded_from,"allegrocl:dispatcher:name",funcname); Setattr(overloaded_from,"allegrocl:dispatcher:include-class", smartmemberwrapper ? 0 : "1"); // Printf(stderr, " set a:d:name='%s', a:d:i-c='%s'\n", Getattr(n,"allegrocl:dispatcher:name"), Getattr(n,"allegrocl:dispatcher:include-class")); } Printf(fcl, "(swig-defmethod (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); } else Printf(fcl, "(swig-defun (\"%s\" \"%s\"%s)\n", funcname, mangled_name, extra_parms); Delete(extra_parms); } // Just C else { Printf(fcl, "(swig-defun (\"%s\" \"%s\")\n", funcname, Generate_Wrapper ? mangled_name : funcname); } ////////////////////////////////////// // Lisp foreign call parameter list // ////////////////////////////////////// Printf(fcl, " ("); /* Special cases */ if (ParmList_len(pl) == 0) { Printf(fcl, ":void"); /* } else if (any_varargs(pl)) { Printf(fcl, "#| varargs |#"); varargs=1; */ } else { String *largs = NewString(""); for (p = pl; p; p = nextSibling(p), argnum++, largnum++) { // SwigType *argtype=Getattr(p, "type"); SwigType *argtype = Swig_cparse_type(Getattr(p, "tmap:ctype")); SwigType *parmtype = Getattr(p,"type"); if (!first) { Printf(fcl, "\n "); } /* by default, skip varargs */ if (!SwigType_isvarargs(parmtype)) { String *argname = NewStringf("PARM%d_%s", largnum, Getattr(p, "name")); // Printf(stderr,"%s\n", Getattr(p,"tmap:lin")); String *ffitype = compose_foreign_type(n, argtype, Getattr(p,"name")); String *deref_ffitype = dereference_ffitype(ffitype); String *lisptype = get_lisp_type(n, parmtype, Getattr(p, "name")); #ifdef ALLEGROCL_DEBUG Printf(stderr, "lisptype of '%s' '%s' = '%s'\n", parmtype, Getattr(p, "name"), lisptype); #endif // while we're walking the parameters, generating LIN // wrapper code... Setattr(p, "lname", NewStringf("SWIG_arg%d", largnum)); String *parm_code = Getattr(p, "tmap:lin"); if (parm_code) { String *lname = Getattr(p, "lname"); Printf(largs, " %s", lname); Replaceall(parm_code, "$in_fftype", ffitype); // must come before $in Replaceall(parm_code, "$in", argname); Replaceall(parm_code, "$out", lname); Replaceall(parm_code, "$*in_fftype", deref_ffitype); Replaceall(wrap->code, "$body", parm_code); } String *dispatchtype = Getattr(n, "sym:overloaded") ? dispatching_type(n, p) : NewString(""); // if this parameter has been removed from the C/++ wrapper // it shouldn't be in the lisp wrapper either. if (!checkAttribute(p, "tmap:in:numinputs", "0")) { Printf(fcl, "(%s %s %s %s %s)", // parms in the ff wrapper, but not in the lisp wrapper. (checkAttribute(p, "tmap:lin:numinputs", "0") ? ":p-" : ":p+"), argname, dispatchtype, ffitype, lisptype); first = 0; } Delete(argname); Delete(ffitype); Delete(deref_ffitype); Delete(lisptype); } } Printf(wrap->locals, "%s", largs); } String *lout = Getattr(n, "tmap:lout"); Replaceall(lout, "$owner", GetFlag(n, "feature:new") ? "t" : "nil"); Replaceall(wrap->code, "$body", lout); // $lclass handling. String *lclass = (String *) 0; SwigType *parsed = Swig_cparse_type(Getattr(n, "tmap:ctype")); // SwigType *cl_t = SwigType_typedef_resolve_all(parsed); SwigType *cl_t = class_from_class_or_class_ref(parsed); String *out_ffitype = compose_foreign_type(n, parsed); String *deref_out_ffitype; String *out_temp = Copy(parsed); if (SwigType_ispointer(out_temp)) { SwigType_pop(out_temp); deref_out_ffitype = compose_foreign_type(n, out_temp); } else { deref_out_ffitype = Copy(out_ffitype); } Delete(out_temp); Delete(parsed); if (cl_t) { lclass = lookup_defined_foreign_ltype(cl_t); } int ff_foreign_ptr = 0; if (!lclass) { ff_foreign_ptr = 1; lclass = NewStringf("ff:foreign-pointer"); } #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "for output wrapping %s: type=%s, ctype=%s\n", Getattr(n, "name"), Getattr(n, "type"), Swig_cparse_type(Getattr(n, "tmap:ctype"))); #endif if (lclass) Replaceall(wrap->code, "$lclass", lclass); if (out_ffitype) Replaceall(wrap->code, "$out_fftype", out_ffitype); if (deref_out_ffitype) Replaceall(wrap->code, "$*out_fftype", deref_out_ffitype); Replaceall(wrap->code, "$body", NewStringf("(swig-ff-call%s)", wrap->locals)); String *ldestructor = Copy(lclass); if (ff_foreign_ptr) Replaceall(ldestructor, ldestructor, "cl::identity"); else Replaceall(ldestructor, ":type :class", ":type :destructor"); Replaceall(wrap->code, "$ldestructor", ldestructor); Delete(ldestructor); Printf(fcl, ")\n"); /* finish arg list */ ///////////////////////////////////////////////////// // Lisp foreign call return type and optimizations // ///////////////////////////////////////////////////// Printf(fcl, " (:returning (%s %s)", compose_foreign_type(n, result_type), get_lisp_type(n, Getattr(n, "type"), Swig_cresult_name())); for (Iterator option = First(n); option.item; option = Next(option)) { if (Strncmp("feature:ffargs:", option.key, 15)) continue; String *option_val = option.item; String *option_name = NewString(Char(option.key) + 14); Replaceall(option_name, "_", "-"); // TODO: varargs vs call-direct ? Printf(fcl, "\n %s %s", option_name, option_val); Delete(option_name); } Printf(fcl, ")\n %s)\n\n", wrap->code); // Wrapper_print(wrap, stderr); Delete(result_type); Delete(mangled_name); Delete(pl); DelWrapper(wrap); #ifdef ALLEGROCL_WRAP_DEBUG Printf(stderr, "emit_defun: EXIT\n"); #endif return SWIG_OK; } int ALLEGROCL::functionWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "functionWrapper %s\n", Getattr(n,"name")); #endif ParmList *parms = CopyParmList(Getattr(n, "parms")); Wrapper *f = NewWrapper(); SwigType *t = Getattr(n, "type"); String *name = Getattr(n, "name"); String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0); SwigType *return_type = Swig_cparse_type(raw_return_type); SwigType *resolved = SwigType_typedef_resolve_all(return_type); int is_void_return = (Cmp(resolved, "void") == 0); Delete(resolved); if (!is_void_return) { String *lresult_init = NewStringf("= (%s)0", SwigType_str(SwigType_strip_qualifiers(return_type),0)); Wrapper_add_localv(f, "lresult", SwigType_lstr(SwigType_ltype(return_type), "lresult"), lresult_init, NIL); Delete(lresult_init); } // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); // Attach the standard typemaps Swig_typemap_attach_parms("ctype", parms, f); Swig_typemap_attach_parms("lin", parms, f); emit_attach_parmmaps(parms, f); String *mangled = mangle_name(n); Node *overloaded = Getattr(n, "sym:overloaded"); // Parameter overloading Setattr(n, "wrap:parms", parms); Setattr(n, "wrap:name", mangled); if (overloaded) { // emit warnings when overloading is impossible on the lisp side. // basically Swig_overload_check(n), but with script_lang_wrapping // set to true. Delete(Swig_overload_rank(n, true)); if (Getattr(n, "overload:ignore")) { // if we're the last overload, make sure to force the emit // of the rest of the overloads before we leave. // Printf(stderr, "ignored overload %s(%p)\n", name, Getattr(n, "sym:nextSibling")); if (!Getattr(n, "sym:nextSibling")) { update_package_if_needed(n); emit_buffered_defuns(n); emit_dispatch_defun(n); } DelWrapper(f); return SWIG_OK; } } // Get number of required and total arguments int num_arguments = emit_num_arguments(parms); int gencomma = 0; #ifdef ALLEGROCL_DEBUG Printf(stderr, "Walking parameters for %s '%s'\n", Getattr(n, "allegrocl:kind"), name); #endif // Now walk the function parameter list and generate code to get arguments String *name_and_parms = NewStringf("%s (", mangled); int i; Parm *p; for (i = 0, p = parms; i < num_arguments; i++) { #ifdef ALLEGROCL_DEBUG String *temp1 = Getattr(p,"tmap:in"); String *temp2 = Getattr(p,"tmap:in:numinputs"); Printf(stderr," parm %d: %s, tmap:in='%s', tmap:in:numinputs='%s'\n", i, Getattr(p,"name"), temp1 ? temp1 : "", temp2 ? temp2 : ""); #endif while (p && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } if (!p) break; SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); String *arg = NewStringf("l%s", Getattr(p, "lname")); // Emit parameter declaration if (gencomma) Printf(name_and_parms, ", "); String *parm_decl = SwigType_str(c_parm_type, arg); Printf(name_and_parms, "%s", parm_decl); #ifdef ALLEGROCL_DEBUG Printf(stderr, " param: %s\n", parm_decl); #endif Delete(parm_decl); gencomma = 1; // Emit parameter conversion code String *parm_code = Getattr(p, "tmap:in"); //if (!parm_code) { // Swig_warning(...); // p = nextSibling(p); /*} else */ { // canThrow(n, "in", p); Replaceall(parm_code, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", parm_code); p = Getattr(p, "tmap:in:next"); } Delete(arg); } Printf(name_and_parms, ")"); #ifdef ALLEGROCL_DEBUG Printf(stderr, " arity = %d(%d)\n", emit_num_lin_arguments(parms), emit_num_lin_arguments(Getattr(n,"wrap:parms"))); #endif // Emit the function definition String *signature = SwigType_str(return_type, name_and_parms); Printf(f->def, "EXPORT %s {", signature); if (CPlusPlus) Printf(f->code, " try {\n"); String *actioncode = emit_action(n); String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (!is_void_return) { if (tm) { Replaceall(tm, "$result", "lresult"); Printf(f->code, "%s\n", tm); Printf(f->code, " return lresult;\n"); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), name); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } emit_return_variable(n, t, f); if (CPlusPlus) { Printf(f->code, " } catch (...) {\n"); if (!is_void_return) Printf(f->code, " return (%s)0;\n", SwigType_str(SwigType_strip_qualifiers(return_type),0)); Printf(f->code, " }\n"); } Printf(f->code, "}\n"); /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) Wrapper_print(f, f_cxx_wrapper); String *f_buffer = NewString(""); emit_defun(n, f_buffer); Setattr(n, "allegrocl:lisp-wrap", f_buffer); if (!overloaded || !Getattr(n, "sym:nextSibling")) { update_package_if_needed(n); emit_buffered_defuns(n); // this is the last overload. if (overloaded) { emit_dispatch_defun(n); } } DelWrapper(f); return SWIG_OK; } int ALLEGROCL::namespaceDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "namespaceDecl: '%s'(%p) (fc=%p)\n", Getattr(n, "sym:name"), n, firstChild(n)); #endif /* don't wrap a namespace with no contents. package bloat. also, test-suite/namespace_class.i claims an unnamed namespace is 'private' and should not be wrapped. Complying... */ if (Getattr(n,"unnamed") || !firstChild(n)) return SWIG_OK; String *name = Getattr(n, "sym:name"); String *old_namespace = current_namespace; if (Cmp(current_namespace, "") == 0) current_namespace = NewStringf("%s", name); else current_namespace = NewStringf("%s::%s", current_namespace, name); if (!GetInt(defined_namespace_packages, current_namespace)) { SetInt(defined_namespace_packages, current_namespace, 1); String *lispy_namespace = listify_namespace(current_namespace); Printf(f_clhead, "(swig-defpackage %s)\n", lispy_namespace); Delete(lispy_namespace); } emit_children(n); Delete(current_namespace); current_namespace = old_namespace; return SWIG_OK; } int ALLEGROCL::constructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "constructorHandler %s\n", Getattr(n, "name")); #endif // Swig_print_node(n); Setattr(n, "allegrocl:kind", "constructor"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::constructorHandler(n); } int ALLEGROCL::destructorHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "destructorHandler %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "destructor"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::destructorHandler(n); } int ALLEGROCL::constantWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "constantWrapper %s\n", Getattr(n, "name")); #endif if (Generate_Wrapper) { // Setattr(n,"wrap:name",mangle_name(n, "ACLPP")); String *const_type = Getattr(n, "type"); String *const_val = 0; String *raw_const = Getattr(n, "value"); if (SwigType_type(const_type) == T_STRING) { const_val = NewStringf("\"%s\"", raw_const); } else if (SwigType_type(const_type) == T_CHAR) { const_val = NewStringf("'%s'", raw_const); } else { const_val = Copy(raw_const); } SwigType_add_qualifier(const_type, "const"); String *ppcname = NewStringf("ACLppc_%s", Getattr(n, "sym:name")); // Printf(f_runtime, "static const %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); Printf(f_runtime, "static %s = %s;\n", SwigType_lstr(const_type, ppcname), const_val); Setattr(n, "name", ppcname); SetFlag(n, "feature:immutable"); Delete(const_val); return variableWrapper(n); } String *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *converted_value = convert_literal(value, type); String *name = Getattr(n, "sym:name"); Setattr(n, "allegrocl:kind", "constant"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); #if 0 Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); #endif if (converted_value) { Printf(f_clwrap, "(swig-defconstant \"%s\" %s)\n", name, converted_value); } else { Swig_warning(WARN_LANG_DISCARD_CONST, Getfile(n), Getline(n), "Unable to parse constant value '%s'. Setting to NIL\n", value); Printf(f_clwrap, "(swig-defconstant \"%s\" nil #| %s |#)\n", name, value); } Delete(converted_value); return SWIG_OK; } int ALLEGROCL::globalvariableHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "globalvariableHandler %s\n", Getattr(n, "name")); #endif if (Generate_Wrapper) return Language::globalvariableHandler(n); // String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); SwigType *rtype = SwigType_typedef_resolve_all(type); if (SwigType_isclass(rtype)) { SwigType_add_pointer(type); SwigType_add_pointer(rtype); } Printf(f_clwrap, "(swig-defvar \"%s\" \"%s\" :type %s)\n", Getattr(n, "sym:name"), Getattr(n, "sym:name"), ((SwigType_isconst(type)) ? ":constant" : ":variable")); return SWIG_OK; } int ALLEGROCL::variableWrapper(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "variableWrapper %s\n", Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a get/set function pair. if (Generate_Wrapper) return Language::variableWrapper(n); String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); SwigType *ctype; SwigType *rtype = SwigType_typedef_resolve_all(type); String *mangled_name = mangle_name(n); int pointer_added = 0; if (SwigType_isclass(rtype)) { SwigType_add_pointer(type); SwigType_add_pointer(rtype); pointer_added = 1; } ctype = SwigType_str(type, 0); // EXPORT ; // = ; Printf(f_runtime, "EXPORT %s %s;\n%s %s = %s%s;\n", ctype, mangled_name, ctype, mangled_name, (pointer_added ? "&" : ""), name); Printf(f_cl, "(swig-defvar \"%s\" :type %s)\n", mangled_name, ((SwigType_isconst(type)) ? ":constant" : ":variable")); Printf(stderr,"***\n"); Delete(mangled_name); #ifdef ALLEGROCL_DEBUG Printf(stderr, "DONE variable %s\n", Getattr(n, "name")); #endif return SWIG_OK; } int ALLEGROCL::memberfunctionHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "memberfunctionHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); Swig_print_node(n); #endif Setattr(n, "allegrocl:kind", "member function"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a global forwarding function. return Language::memberfunctionHandler(n); } int ALLEGROCL::membervariableHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "membervariableHandler %s::%s\n", Getattr(parent_node_skipping_extends(n), "name"), Getattr(n, "name")); #endif Setattr(n, "allegrocl:kind", "member variable"); Setattr(n, "allegrocl:old-sym:name", Getattr(n, "sym:name")); // Let SWIG generate a get/set function pair. return Language::membervariableHandler(n); } int ALLEGROCL::typedefHandler(Node *n) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "In typedefHandler\n"); #endif SwigType *typedef_type = Getattr(n,"type"); // has the side-effect of noting any implicit // template instantiations in type. String *ff_type = compose_foreign_type(n, typedef_type); String *sym_name = Getattr(n, "sym:name"); String *name; String *type_ref; if (in_class) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, " typedef in class '%s'(%p)\n", Getattr(in_class, "sym:name"), in_class); #endif Setattr(n, "allegrocl:typedef:in-class", in_class); String *class_name = Getattr(in_class, "name"); name = NewStringf("%s__%s", class_name, sym_name); type_ref = NewStringf("%s::%s", class_name, sym_name); Setattr(n, "allegrocl:in-class", in_class); } else { name = Copy(sym_name); type_ref = Copy(Getattr(n, "name")); } Setattr(n, "allegrocl:namespace", current_namespace); String *lookup = lookup_defined_foreign_type(typedef_type); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "** lookup='%s'(%p), typedef_type='%s', strcmp = '%d' strstr = '%d'\n", lookup, lookup, typedef_type, Strcmp(typedef_type,"void"), Strstr(ff_type,"__SWIGACL_FwdReference")); #endif if(lookup || (!lookup && Strcmp(typedef_type,"void")) || (!lookup && Strstr(ff_type,"__SWIGACL_FwdReference"))) { add_defined_foreign_type(n, 0, type_ref, name); } else { add_forward_referenced_type(n); } #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Out typedefHandler\n"); #endif Delete(ff_type); return SWIG_OK; } // forward referenced classes are added specially to defined_foreign_types int ALLEGROCL::classforwardDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "classforwardDeclaration %s\n", Getattr(n, "name")); #endif add_forward_referenced_type(n); return SWIG_OK; } int ALLEGROCL::classHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "classHandler %s::%s\n", current_namespace, Getattr(n, "sym:name")); #endif int result; if (Generate_Wrapper) result = cppClassHandler(n); else result = cClassHandler(n); return result; } int ALLEGROCL::cClassHandler(Node *n) { #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "In cClassHandler\n"); #endif /* Add this structure to the known lisp types */ // Printf(stderr, "Adding %s foreign type\n", name); String *ns = listify_namespace(current_namespace); add_defined_foreign_type(n); Delete(ns); #ifdef ALLEGROCL_TYPE_DEBUG Printf(stderr, "Out cClassHandler\n"); #endif return SWIG_OK; } int ALLEGROCL::cppClassHandler(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "cppClassHandler %s\n", Getattr(n, "name")); #endif // String *name=Getattr(n, "sym:name"); // String *kind = Getattr(n,"kind"); /* Template instantiation. Careful. SWIG does not create instantiations of templated classes whenever it sees a templated class reference (say, as a return type, or in a parameter list). The %template directive results in a templated class instantiation that will actually be seen by :: classHandler(). In this case, we don't want to error if the type already exists; the point is to force the creation of wrappers for the templated class. */ String *templated = Getattr(n, "template"); String *t_name; // String *ns = listify_namespace(current_namespace); if (templated) { t_name = namespaced_name(n); } else { t_name = Getattr(n, "name"); } Setattr(n, "allegrocl:namespace", current_namespace); /* Add this structure to the known lisp types. Class may contain references to the type currently being defined */ if (!templated || !lookup_defined_foreign_type(t_name)) { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "Adding %s foreign type\n", Getattr(n, "sym:name")); #endif add_defined_foreign_type(n); } else { #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "cppClassHand: type %s already exists. Assuming %%template instantiation for wrapping purposes.\n", Getattr(n, "sym:name")); #endif add_defined_foreign_type(n, 1); } // Generate slot accessors, constructor, and destructor. Node *prev_class = in_class; in_class = n; Node *c; // walk all member variables. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " MANUALLY walking class members... \n"); #endif for (c = firstChild(n); c; c = nextSibling(c)) { // ping the types of all children--even protected and private // so their types can be added to the linked_type_list. SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), Getattr(c, "type")); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, "looking at child '%p' of type '%s' '%d'\n", c, childType, SwigType_isfunction(childType)); // Swig_print_node(c); #endif if (!SwigType_isfunction(childType)) Delete(compose_foreign_type(n, childType)); Delete(childType); } #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " MANUAL walk DONE.\n"); #endif // this will walk all necessary methods. #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " LANGUAGE walk of children...\n"); #endif Language::classHandler(n); #ifdef ALLEGROCL_CLASS_DEBUG Printf(stderr, " LANGUAGE walk DONE\n"); #endif in_class = prev_class; return SWIG_OK; } int ALLEGROCL::emit_one(Node *n) { // When the current package does not correspond with the current // namespace we need to generate an IN-PACKAGE form, unless the // current node is another namespace node. if (Cmp(nodeType(n), "namespace") != 0 && Cmp(current_package, current_namespace) != 0) { String *lispy_namespace = listify_namespace(current_namespace); Printf(f_clwrap, "(swig-in-package %s)\n", lispy_namespace); Delete(lispy_namespace); Delete(current_package); current_package = NewStringf("%s", current_namespace); } Setattr(n, "allegrocl:package", current_package); return Language::emit_one(n); } int ALLEGROCL::enumDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "enumDeclaration %s\n", Getattr(n, "name")); #endif if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; if (Getattr(n, "sym:name")) { add_defined_foreign_type(n); } Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { ALLEGROCL::enumvalueDeclaration(c); // since we walk our own children, we need to add // the current package ourselves. Setattr(c, "allegrocl:package", current_package); } return SWIG_OK; } int ALLEGROCL::enumvalueDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "enumvalueDeclaration %s\n", Getattr(n, "name")); #endif /* print this when in C mode? make this a command-line arg? */ if (Generate_Wrapper) { SwigType *enum_type = Copy(Getattr(n,"type")); String *mangled_name = mangle_name(n, "ACL_ENUM", in_class ? Getattr(in_class,"name") : current_namespace); SwigType_add_qualifier(enum_type,"const"); String *enum_decl = SwigType_str(enum_type, mangled_name); Printf(f_cxx_wrapper, "EXPORT %s;\n", enum_decl); Printf(f_cxx_wrapper, "%s = %s;\n", enum_decl, Getattr(n, "value")); Delete(mangled_name); Delete(enum_type); Delete(enum_decl); } return SWIG_OK; } int ALLEGROCL::templateDeclaration(Node *n) { #ifdef ALLEGROCL_DEBUG Printf(stderr, "templateDeclaration %s\n", Getattr(n, "name")); #endif String *type = Getattr(n, "templatetype"); // Printf(stderr, "tempDecl: %s %s\n", Getattr(n,"name"), // type); // Swig_print_node(n); if (!Strcmp(type, "cdecl")) { SwigType *ty = NewStringf("%s%s", Getattr(n, "decl"), Getattr(n, "type")); Delete(ty); } Delete(type); return SWIG_OK; } swig-3.0.12/Source/Modules/java.cxx0000664000175000017500000055042313042756442016763 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * java.cxx * * Java language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // for INT_MAX #include "cparse.h" #include /* Hash type used for upcalls from C/C++ */ typedef DOH UpcallData; class JAVA:public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; List *filenames_list; bool proxy_flag; // Flag for generating proxy classes bool nopgcpp_flag; // Flag for suppressing the premature garbage collection prevention parameter bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool member_func_flag; // flag set when wrapping a member function String *imclass_name; // intermediary class name String *module_class_name; // module class name String *constants_interface_name; // constants interface name String *imclass_class_code; // intermediary class code String *proxy_class_def; String *proxy_class_code; String *interface_class_code; // if %feature("interface") was declared for a class, here goes the interface declaration String *module_class_code; String *proxy_class_name; // proxy class name String *full_proxy_class_name;// fully qualified proxy class name when using nspace feature, otherwise same as proxy_class_name String *full_imclass_name; // fully qualified intermediary class name when using nspace feature, otherwise same as imclass_name String *variable_name; //Name of a variable being wrapped String *proxy_class_constants_code; String *module_class_constants_code; String *enum_code; String *package; // Optional package name String *jnipackage; // Package name used in the JNI code String *package_path; // Package name used internally by JNI (slashes) String *imclass_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *imclass_baseclass; //inheritance for intermediary class class from %pragma String *imclass_package; //package in which to generate the intermediary class String *module_baseclass; //inheritance for module class from %pragma String *imclass_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *imclass_class_modifiers; //class modifiers for intermediary class overriden by %pragma String *module_class_modifiers; //class modifiers for module class overriden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *imclass_directors; // Intermediate class director code String *destructor_call; //C++ destructor call if any String *destructor_throws_clause; //C++ destructor throws clause if any // Director method stuff: List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int n_directors; int first_class_dmethod; int curr_class_dmethod; int nesting_depth; enum EnumFeature { SimpleEnum, TypeunsafeEnum, TypesafeEnum, ProperEnum }; public: /* ----------------------------------------------------------------------------- * JAVA() * ----------------------------------------------------------------------------- */ JAVA():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), filenames_list(NULL), proxy_flag(true), nopgcpp_flag(false), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), member_func_flag(false), imclass_name(NULL), module_class_name(NULL), constants_interface_name(NULL), imclass_class_code(NULL), proxy_class_def(NULL), proxy_class_code(NULL), interface_class_code(NULL), module_class_code(NULL), proxy_class_name(NULL), full_proxy_class_name(NULL), full_imclass_name(NULL), variable_name(NULL), proxy_class_constants_code(NULL), module_class_constants_code(NULL), enum_code(NULL), package(NULL), jnipackage(NULL), package_path(NULL), imclass_imports(NULL), module_imports(NULL), imclass_baseclass(NULL), imclass_package(NULL), module_baseclass(NULL), imclass_interfaces(NULL), module_interfaces(NULL), imclass_class_modifiers(NULL), module_class_modifiers(NULL), upcasts_code(NULL), imclass_cppcasts_code(NULL), imclass_directors(NULL), destructor_call(NULL), destructor_throws_clause(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), n_directors(0), first_class_dmethod(0), curr_class_dmethod(0), nesting_depth(0){ /* for now, multiple inheritance in directors is disabled, this should be easy to implement though */ director_multiple_inheritance = 0; director_language = 1; } /* ----------------------------------------------------------------------------- * constructIntermediateClassName() * * Construct the fully qualified name of the intermidiate class and set * the full_imclass_name attribute accordingly. * ----------------------------------------------------------------------------- */ void constructIntermediateClassName(Node *n) { String *nspace = Getattr(n, "sym:nspace"); if (imclass_package && package) full_imclass_name = NewStringf("%s.%s.%s", package, imclass_package, imclass_name); else if (package && nspace) full_imclass_name = NewStringf("%s.%s", package, imclass_name); else if (imclass_package) full_imclass_name = NewStringf("%s.%s", imclass_package, imclass_name); else full_imclass_name = NewStringf("%s", imclass_name); if (nspace && !package) { String *name = Getattr(n, "name") ? Getattr(n, "name") : NewString(""); Swig_warning(WARN_JAVA_NSPACE_WITHOUT_PACKAGE, Getfile(n), Getline(n), "The nspace feature is used on '%s' without -package. " "The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.\n", name); } } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class. * Return NULL if not otherwise the proxy class name, fully qualified with * package name if the nspace feature is used, unless jnidescriptor is true as * the package name is handled differently (unfortunately for legacy reasons). * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t, bool jnidescriptor = false) { String *proxyname = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n) { proxyname = Getattr(n, "proxyname"); if (!proxyname || jnidescriptor) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Copy(Getattr(n, "sym:name")); if (symname && !GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { if (String* name = Getattr(outer_class, "sym:name")) { Push(symname, jnidescriptor ? "$" : "."); Push(symname, name); } else return NULL; } } if (nspace) { if (package && !jnidescriptor) proxyname = NewStringf("%s.%s.%s", package, nspace, symname); else proxyname = NewStringf("%s.%s", nspace, symname); } else { proxyname = Copy(symname); } if (!jnidescriptor) { Setattr(n, "proxyname", proxyname); // Cache it Delete(proxyname); } Delete(symname); } } } return proxyname; } /* ----------------------------------------------------------------------------- * makeValidJniName() * ----------------------------------------------------------------------------- */ String *makeValidJniName(const String *name) { String *valid_jni_name = NewString(name); Replaceall(valid_jni_name, "_", "_1"); return valid_jni_name; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("java"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(""); Printf(package, argv[i + 1]); if (Len(package) == 0) { Delete(package); package = 0; } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { Printf(stderr, "Deprecated command line option: %s. Proxy classes are now generated by default.\n", argv[i]); Swig_mark_arg(i); proxy_flag = true; } else if ((strcmp(argv[i], "-noproxy") == 0)) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-nopgcpp") == 0) { Swig_mark_arg(i); nopgcpp_flag = true; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-jnic") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -jnic. C JNI calling convention now used when -c++ not specified.\n"); } else if (strcmp(argv[i], "-nofinalize") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -nofinalize. Use the new javafinalize typemap instead.\n"); } else if (strcmp(argv[i], "-jnicpp") == 0) { Swig_mark_arg(i); Printf(stderr, "Deprecated command line option: -jnicpp. C++ JNI calling convention now used when -c++ specified.\n"); } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGJAVA 1", 0); // Add typemap definitions SWIG_typemap_lang("java"); SWIG_config_file("java.swg"); allow_overloading(); Swig_interface_feature_enable(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "jniclassname")) imclass_name = Copy(Getattr(optionsnode, "jniclassname")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); swig_types_hash = NewHash(); filenames_list = NewList(); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. if (!imclass_name) { imclass_name = NewStringf("%sJNI", Getattr(n, "name")); module_class_name = Copy(Getattr(n, "name")); } else { // Rename the module name if it is the same as intermediary class name - a backwards compatibility solution if (Cmp(imclass_name, Getattr(n, "name")) == 0) module_class_name = NewStringf("%sModule", Getattr(n, "name")); else module_class_name = Copy(Getattr(n, "name")); } constants_interface_name = NewStringf("%sConstants", module_class_name); // module class and intermediary classes are always created if (!addSymbol(imclass_name, n)) return SWIG_ERROR; if (!addSymbol(module_class_name, n)) return SWIG_ERROR; imclass_class_code = NewString(""); proxy_class_def = NewString(""); proxy_class_code = NewString(""); module_class_constants_code = NewString(""); imclass_baseclass = NewString(""); imclass_package = NULL; imclass_interfaces = NewString(""); imclass_class_modifiers = NewString(""); module_class_code = NewString(""); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); module_class_modifiers = NewString(""); imclass_imports = NewString(""); imclass_cppcasts_code = NewString(""); imclass_directors = NewString(""); upcasts_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; n_directors = 0; jnipackage = NewString(""); package_path = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGJAVA\n#define SWIGJAVA\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); String *wrapper_name = NewString(""); if (package) { String *jniname = makeValidJniName(package); Printv(jnipackage, jniname, NIL); Delete(jniname); Replaceall(jnipackage, ".", "_"); Append(jnipackage, "_"); Printv(package_path, package, NIL); Replaceall(package_path, ".", "/"); } String *jniname = makeValidJniName(imclass_name); Printf(wrapper_name, "Java_%s%s_%%f", jnipackage, jniname); Delete(jniname); Swig_name_register("wrapper", Char(wrapper_name)); if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Delete(wrapper_name); Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); /* Emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the intermediary class { String *filen = NewStringf("%s%s.java", outputDirectory(imclass_package), imclass_name); File *f_im = NewFile(filen, "w", SWIG_output_files()); if (!f_im) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the intermediary class file emitBanner(f_im); if (imclass_package && package) Printf(f_im, "package %s.%s;", package, imclass_package); else if (imclass_package) Printf(f_im, "package %s;", imclass_package); else if (package) Printf(f_im, "package %s;\n", package); if (imclass_imports) Printf(f_im, "%s\n", imclass_imports); if (Len(imclass_class_modifiers) > 0) Printf(f_im, "%s ", imclass_class_modifiers); Printf(f_im, "%s ", imclass_name); if (imclass_baseclass && *Char(imclass_baseclass)) Printf(f_im, "extends %s ", imclass_baseclass); if (Len(imclass_interfaces) > 0) Printv(f_im, "implements ", imclass_interfaces, " ", NIL); Printf(f_im, "{\n"); // Add the intermediary class methods Replaceall(imclass_class_code, "$module", module_class_name); Replaceall(imclass_class_code, "$imclassname", imclass_name); Printv(f_im, imclass_class_code, NIL); Printv(f_im, imclass_cppcasts_code, NIL); if (Len(imclass_directors) > 0) Printv(f_im, "\n", imclass_directors, NIL); if (n_dmethods > 0) { Putc('\n', f_im); Printf(f_im, " private final static native void swig_module_init();\n"); Printf(f_im, " static {\n"); Printf(f_im, " swig_module_init();\n"); Printf(f_im, " }\n"); } // Finish off the class Printf(f_im, "}\n"); Delete(f_im); } // Generate the Java module class { String *filen = NewStringf("%s%s.java", SWIG_output_directory(), module_class_name); File *f_module = NewFile(filen, "w", SWIG_output_files()); if (!f_module) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the module class file emitBanner(f_module); if (package) Printf(f_module, "package %s;\n", package); if (module_imports) Printf(f_module, "%s\n", module_imports); if (Len(module_class_modifiers) > 0) Printf(f_module, "%s ", module_class_modifiers); Printf(f_module, "%s ", module_class_name); if (module_baseclass && *Char(module_baseclass)) Printf(f_module, "extends %s ", module_baseclass); if (Len(module_interfaces) > 0) { if (Len(module_class_constants_code) != 0) Printv(f_module, "implements ", constants_interface_name, ", ", module_interfaces, " ", NIL); else Printv(f_module, "implements ", module_interfaces, " ", NIL); } else { if (Len(module_class_constants_code) != 0) Printv(f_module, "implements ", constants_interface_name, " ", NIL); } Printf(f_module, "{\n"); Replaceall(module_class_code, "$module", module_class_name); Replaceall(module_class_constants_code, "$module", module_class_name); Replaceall(module_class_code, "$imclassname", imclass_name); Replaceall(module_class_constants_code, "$imclassname", imclass_name); // Add the wrapper methods Printv(f_module, module_class_code, NIL); // Finish off the class Printf(f_module, "}\n"); Delete(f_module); } // Generate the Java constants interface if (Len(module_class_constants_code) != 0) { String *filen = NewStringf("%s%s.java", SWIG_output_directory(), constants_interface_name); File *f_module = NewFile(filen, "w", SWIG_output_files()); if (!f_module) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the Java constants interface file emitBanner(f_module); if (package) Printf(f_module, "package %s;\n", package); if (module_imports) Printf(f_module, "%s\n", module_imports); Printf(f_module, "public interface %s {\n", constants_interface_name); // Write out all the global constants Printv(f_module, module_class_constants_code, NIL); // Finish off the Java interface Printf(f_module, "}\n"); Delete(f_module); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); emitDirectorUpcalls(); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a Java type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(filenames_list); filenames_list = NULL; Delete(imclass_name); imclass_name = NULL; Delete(imclass_class_code); imclass_class_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(module_class_constants_code); module_class_constants_code = NULL; Delete(imclass_baseclass); imclass_baseclass = NULL; Delete(imclass_package); imclass_package = NULL; Delete(imclass_interfaces); imclass_interfaces = NULL; Delete(imclass_class_modifiers); imclass_class_modifiers = NULL; Delete(module_class_name); module_class_name = NULL; Delete(constants_interface_name); constants_interface_name = NULL; Delete(module_class_code); module_class_code = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(module_class_modifiers); module_class_modifiers = NULL; Delete(imclass_imports); imclass_imports = NULL; Delete(imclass_cppcasts_code); imclass_cppcasts_code = NULL; Delete(imclass_directors); imclass_directors = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(package); package = NULL; Delete(jnipackage); jnipackage = NULL; Delete(package_path); package_path = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; n_dmethods = 0; /* Close all of the files */ Dump(f_header, f_runtime); if (directorsEnabled()) { Dump(f_directors, f_runtime); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } Dump(f_wrappers, f_runtime); Wrapper_pretty_print(f_init, f_runtime); Delete(f_header); Delete(f_wrappers); Delete(f_init); Dump(f_runtime, f_begin); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "/* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); } /*----------------------------------------------------------------------- * Add new director upcall signature *----------------------------------------------------------------------*/ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *imclass_desc, String *class_desc, String *decl) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *imclass_methodidx = NewStringf("%d", n_dmethods); String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "fdesc", Copy(class_desc)); Setattr(new_udata, "imclass_method", Copy(imclass_method)); Setattr(new_udata, "imclass_fdesc", Copy(imclass_desc)); Setattr(new_udata, "imclass_methodidx", imclass_methodidx); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Delete(key); return new_udata; } /*----------------------------------------------------------------------- * Get director upcall signature *----------------------------------------------------------------------*/ UpcallData *getUpcallMethodData(String *director_class, String *decl) { String *key = NewStringf("%s|%s", director_class, decl); UpcallData *udata = Getattr(dmethods_table, key); Delete(key); return udata; } /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n, imclass_name)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); int num_arguments = 0; int gencomma = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); String *nondir_args = NewString(""); bool is_destructor = (Cmp(Getattr(n, "nodeType"), "destructor") == 0); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } /* The rest of this function deals with generating the intermediary class wrapper function (that wraps a c/c++ function) and generating the JNI c code. Each Java wrapper function has a matching JNI c function call. */ // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *jniname = makeValidJniName(overloaded_name); String *wname = Swig_name_wrapper(jniname); Delete(jniname); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("jni", l, f); Swig_typemap_attach_parms("jtype", l, f); Swig_typemap_attach_parms("jstype", l, f); /* Get return types */ if ((tm = Swig_typemap_lookup("jni", n, "", 0))) { Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = Swig_typemap_lookup("jtype", n, "", 0))) { Printf(im_return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult = 0", NIL); Printv(f->def, "SWIGEXPORT ", c_return_type, " JNICALL ", wname, "(JNIEnv *jenv, jclass jcls", NIL); // Usually these function parameters are unused - The code below ensures // that compilers do not issue such a warning if configured to do so. Printv(f->code, " (void)jenv;\n", NIL); Printv(f->code, " (void)jcls;\n", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in Java and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } Printf(imclass_class_code, " public final static native %s %s(", im_return_type, overloaded_name); num_arguments = emit_num_arguments(l); // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the JNI C types of the parameter */ if ((tm = Getattr(p, "tmap:jni"))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = Getattr(p, "tmap:jtype"))) { Printv(im_param_type, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(imclass_class_code, ", "); Printf(imclass_class_code, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, ", ", c_param_type, " ", arg, NIL); ++gencomma; // Premature garbage collection prevention parameter if (!is_destructor) { String *pgc_parameter = prematureGarbageCollectionPreventionParameter(pt, p); if (pgc_parameter) { Printf(imclass_class_code, ", %s %s_", pgc_parameter, arg); Printf(f->def, ", jobject %s_", arg); Printf(f->code, " (void)%s_;\n", arg); } } // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { addThrows(n, "tmap:in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(nondir_args, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } Printv(f->code, nondir_args, NIL); Delete(nondir_args); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { addThrows(n, "tmap:check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { addThrows(n, "tmap:freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { addThrows(n, "tmap:argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Get any Java exception classes in the throws typemap ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { addThrows(n, "tmap:throws", p); } } } // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); // Handle exception classes specified in the "except" feature's "throws" attribute addThrows(n, "feature:except", n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { addThrows(n, "tmap:out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { addThrows(n, "tmap:ret", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C function and intermediary class function definitions */ Printf(imclass_class_code, ")"); generateThrowsClause(n, imclass_class_code); Printf(imclass_class_code, ";\n"); Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, "); if (!is_void_return) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", ""); /* Dump the function out */ if (!native_function_flag) Wrapper_print(f, f_wrappers); if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { moduleClassFunctionHandler(n); } /* * Generate the proxy class getters/setters for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name bool getter_flag = Cmp(symname, Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) != 0; String *getter_setter_name = NewString(""); if (!getter_flag) Printf(getter_setter_name, "set"); else Printf(getter_setter_name, "get"); Putc(toupper((int) *Char(variable_name)), getter_setter_name); Printf(getter_setter_name, "%s", Char(variable_name) + 1); Setattr(n, "proxyfuncname", getter_setter_name); Setattr(n, "imfuncname", symname); proxyClassFunctionHandler(n); Delete(getter_setter_name); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { variable_wrapper_flag = true; Language::variableWrapper(n); /* Default to functions */ variable_wrapper_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ------------------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; return ret; } String *getCurrentScopeName(String *nspace) { String *scope = 0; if (nspace || getCurrentClass()) { scope = NewString(""); if (nspace) Printf(scope, "%s", nspace); if (Node* cls = getCurrentClass()) { if (Node *outer = Getattr(cls, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } Printv(scope, nspace ? "." : "", outerClassesPrefix, ".", proxy_class_name, NIL); Delete(outerClassesPrefix); } else Printv(scope, nspace ? "." : "", proxy_class_name, NIL); } } return scope; } /* ---------------------------------------------------------------------- * enumDeclaration() * * C/C++ enums can be mapped in one of 4 ways, depending on the java:enum feature specified: * 1) Simple enums - simple constant within the proxy class or module class * 2) Typeunsafe enums - simple constant in a Java class (class named after the c++ enum name) * 3) Typesafe enum - typesafe enum pattern (class named after the c++ enum name) * 4) Proper enums - proper Java enum * Anonymous enums always default to 1) * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call if (proxy_flag && !is_wrapping_class()) { // Global enums / enums in a namespace assert(!full_imclass_name); constructIntermediateClassName(n); } enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *constants_code = (proxy_flag && is_wrapping_class())? proxy_class_constants_code : module_class_constants_code; EnumFeature enum_feature = decodeEnumFeature(n); String *typemap_lookup_type = Getattr(n, "name"); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper Java enum String *scope = getCurrentScopeName(nspace); if (!addSymbol(symname, n, scope)) return SWIG_ERROR; // Pure Java baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "javabase", typemap_lookup_type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "javainterfaces", typemap_lookup_type, WARN_NONE); // Emit the enum Printv(enum_code, typemapLookup(n, "javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers (enum modifiers really) " ", symname, *Char(pure_baseclass) ? // Bases " extends " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " implements " : "", pure_interfaces, " {\n", NIL); if (proxy_flag && is_wrapping_class()) Replaceall(enum_code, "$static ", "static "); else Replaceall(enum_code, "$static ", ""); Delete(scope); } else { // Wrap C++ enum with integers - just indicate start of enum with a comment, no comment for anonymous enums of any sort if (symname && !Getattr(n, "unnamedinstance")) Printf(constants_code, " // %s \n", symname); } // Emit each enum item Language::enumDeclaration(n); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper Java enum // Finish the enum declaration // Typemaps are used to generate the enum definition in a similar manner to proxy classes. Printv(enum_code, (enum_feature == ProperEnum) ? ";\n" : "", typemapLookup(n, "javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "}", NIL); Replaceall(enum_code, "$javaclassname", symname); // Substitute $enumvalues - intended usage is for typesafe enums if (Getattr(n, "enumvalues")) Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues")); else Replaceall(enum_code, "$enumvalues", ""); if (proxy_flag && is_wrapping_class()) { // Enums defined within the C++ class are defined within the proxy class // Add extra indentation Replaceall(enum_code, "\n", "\n "); Replaceall(enum_code, " \n", "\n"); if (GetFlag(getCurrentClass(), "feature:interface")) Printv(interface_class_code, " ", enum_code, "\n\n", NIL); else Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL); } else { // Global enums are defined in their own file String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, symname); File *f_enum = NewFile(filen, "w", SWIG_output_files()); if (!f_enum) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the enum file emitBanner(f_enum); if (package || nspace) { Printf(f_enum, "package "); if (package) Printv(f_enum, package, nspace ? "." : "", NIL); if (nspace) Printv(f_enum, nspace, NIL); Printf(f_enum, ";\n"); } Printv(f_enum, typemapLookup(n, "javaimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", enum_code, "\n", NIL); Printf(f_enum, "\n"); Delete(f_enum); Delete(output_directory); } } else { // Wrap C++ enum with simple constant Printf(enum_code, "\n"); if (proxy_flag && is_wrapping_class()) Printv(proxy_class_constants_code, enum_code, NIL); else Printv(module_class_constants_code, enum_code, NIL); } Delete(enum_code); enum_code = NULL; if (proxy_flag && !is_wrapping_class()) { Delete(full_imclass_name); full_imclass_name = 0; } } return SWIG_OK; } /* ---------------------------------------------------------------------- * enumvalueDeclaration() * ---------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); int unnamedinstance = GetFlag(parent, "unnamedinstance"); String *parent_name = Getattr(parent, "name"); String *nspace = getNSpace(); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(escape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } { EnumFeature enum_feature = decodeEnumFeature(parent); if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } // Add to language symbol table String *scope = 0; if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", enumClassPrefix); } else { scope = Copy(constants_interface_name); } } else { scope = getCurrentScopeName(nspace); if (!scope) scope = Copy(Getattr(parent, "sym:name")); else Printf(scope, ".%s", Getattr(parent, "sym:name")); } if (!addSymbol(symname, n, scope)) return SWIG_ERROR; if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) C/C++ enum with a proper Java enum // Emit the enum item. if (!GetFlag(n, "firstenumitem")) Printf(enum_code, ",\n"); Printf(enum_code, " %s", symname); if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, "(%s)", value); Delete(value); } } else { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); Setattr(n, "type", typemap_lookup_type); const String *tm = typemapLookup(n, "jstype", typemap_lookup_type, WARN_JAVA_TYPEMAP_JSTYPE_UNDEF); String *return_type = Copy(tm); substituteClassname(typemap_lookup_type, return_type); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); if ((enum_feature == TypesafeEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, " %s final static %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { Printf(enum_code, " %s final static %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later String *value = enumValue(n); Printf(enum_code, " %s final static %s %s = %s;\n", methodmods, return_type, symname, value); Delete(value); } Delete(return_type); } // Add the enum value to the comma separated list being constructed in the enum declaration. String *enumvalues = Getattr(parent, "enumvalues"); if (!enumvalues) Setattr(parent, "enumvalues", Copy(symname)); else Printv(enumvalues, ", ", symname, NIL); Delete(scope); } Delete(newsymname); Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * Used for wrapping constants - #define or %constant. * Also for inline initialised const static primitive type member variables (short, int, double, enums etc). * Java static final variables are generated for these. * If the %javaconst(1) feature is used then the C constant value is used to initialise the Java final variable. * If not, a JNI method is generated to get the C constant value for initialisation of the Java final variable. * However, if the %javaconstvalue feature is used, it overrides all other ways to generate the initialisation. * Also note that this method might be called for wrapping enum items (when the enum is using %javaconst(0)). * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); String *tm; String *return_type = NewString(""); String *constants_code = NewString(""); Swig_save("constantWrapper", n, "value", NIL); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; if (!is_enum_item) { String *scope = 0; if (proxy_class_name) { String *nspace = getNSpace(); scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", proxy_class_name); } else { scope = Copy(constants_interface_name); } if (!addSymbol(itemname, n, scope)) return SWIG_ERROR; Delete(scope); } // The %javaconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:java:const"); /* Adjust the enum type for the Swig_typemap_lookup. * We want the same jstype typemap for all the enum items so we use the enum type (parent node). */ if (is_enum_item) { t = Getattr(parentNode(n), "enumtype"); Setattr(n, "type", t); } /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("jstype", l, NULL); /* Get Java return types */ bool classname_substituted_flag = false; if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { classname_substituted_flag = substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } // Add the stripped quotes back in String *new_value = NewString(""); if (SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { Printf(new_value, "\'%s\'", Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(constants_code, " %s final static %s %s = ", methodmods, return_type, itemname); // Check for the %javaconstvalue feature String *value = Getattr(n, "feature:java:constvalue"); if (value) { Printf(constants_code, "%s;\n", value); } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the Java variable from C through a JNI call. if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) Printf(constants_code, "%s.swigToEnum(%s.%s());\n", return_type, full_imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } } else { Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } // Each constant and enum value is wrapped with a separate JNI function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; variableWrapper(n); enum_constant_flag = false; } else { // Alternative constant handling will use the C syntax to make a true Java constant and hope that it compiles as Java code if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(escape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { Printf(constants_code, "%s;\n", Getattr(n, "value")); } } // Emit the generated code to appropriate place // Enums only emit the intermediate and JNI methods, so no proxy or module class wrapper methods needed if (!is_enum_item) { if (proxy_flag && wrapping_member_flag) Printv(proxy_class_constants_code, constants_code, NIL); else Printv(module_class_constants_code, constants_code, NIL); } // Cleanup Swig_restore(n); Delete(new_value); Delete(return_type); Delete(constants_code); return SWIG_OK; } /* ----------------------------------------------------------------------------- * insertDirective() * ----------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); Replaceall(code, "$module", module_class_name); Replaceall(code, "$imclassname", imclass_name); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_code) { Swig_typemap_replace_embedded_typemap(code, n); int offset = Len(code) > 0 && *Char(code) == '\n' ? 1 : 0; Printv(proxy_class_code, Char(code) + offset, "\n", NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * jniclassbase - base (extends) for the intermediary class * jniclasspackage - package in which to generate the intermediary class * jniclassclassmodifiers - class modifiers for the intermediary class * jniclasscode - text (java code) is copied verbatim to the intermediary class * jniclassimports - import statements for the intermediary class * jniclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (java code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "java") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "jniclassbase") == 0) { Delete(imclass_baseclass); imclass_baseclass = Copy(strvalue); } else if (Strcmp(code, "jniclasspackage") == 0) { Delete(imclass_package); imclass_package = Copy(strvalue); String *imclass_class_package_jniname = makeValidJniName(imclass_package); Printv(jnipackage, imclass_class_package_jniname, NIL); Delete(imclass_class_package_jniname); Replaceall(jnipackage, NSPACE_SEPARATOR, "_"); Append(jnipackage, "_"); String *wrapper_name = NewString(""); String *imclass_class_jniname = makeValidJniName(imclass_name); Printf(wrapper_name, "Java_%s%s_%%f", jnipackage, imclass_class_jniname); Delete(imclass_class_jniname); Swig_name_unregister("wrapper"); Swig_name_register("wrapper", Char(wrapper_name)); Delete(wrapper_name); } else if (Strcmp(code, "jniclassclassmodifiers") == 0) { Delete(imclass_class_modifiers); imclass_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "jniclasscode") == 0) { Printf(imclass_class_code, "%s\n", strvalue); } else if (Strcmp(code, "jniclassimports") == 0) { Delete(imclass_imports); imclass_imports = Copy(strvalue); } else if (Strcmp(code, "jniclassinterfaces") == 0) { Delete(imclass_interfaces); imclass_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(module_class_modifiers); module_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(module_class_code, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else if (Strcmp(code, "moduleimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use the moduleimports pragma.\n"); } else if (Strcmp(code, "moduleinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use the moduleinterfaces pragma.\n"); } else if (Strcmp(code, "modulemethodmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%javamethodmodifiers.\n"); } else if (Strcmp(code, "allshadowimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaimports).\n"); } else if (Strcmp(code, "allshadowcode") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javacode).\n"); } else if (Strcmp(code, "allshadowbase") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javabase).\n"); } else if (Strcmp(code, "allshadowinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javainterfaces).\n"); } else if (Strcmp(code, "allshadowclassmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaclassmodifiers).\n"); } else if (proxy_flag) { if (Strcmp(code, "shadowcode") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javacode).\n"); } else if (Strcmp(code, "shadowimport") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaimports).\n"); } else if (Strcmp(code, "shadowbase") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javabase).\n"); } else if (Strcmp(code, "shadowinterface") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javainterfaces).\n"); } else if (Strcmp(code, "shadowclassmodifiers") == 0) { Swig_error(input_file, line_number, "Deprecated pragma. Please use %%typemap(javaclassmodifiers).\n"); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* ----------------------------------------------------------------------------- * getQualifiedInterfaceName() * ----------------------------------------------------------------------------- */ String *getQualifiedInterfaceName(Node *n) { String *ret = Getattr(n, "interface:qname"); if (!ret) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Getattr(n, "interface:name"); if (nspace) { if (package) ret = NewStringf("%s.%s.%s", package, nspace, symname); else ret = NewStringf("%s.%s", nspace, symname); } else { ret = Copy(symname); } Setattr(n, "interface:qname", ret); } return ret; } /* ----------------------------------------------------------------------------- * getInterfaceName() * ----------------------------------------------------------------------------- */ String *getInterfaceName(SwigType *t, bool qualified) { String *interface_name = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n && Getattr(n, "interface:name")) interface_name = qualified ? getQualifiedInterfaceName(n) : Getattr(n, "interface:name"); } return interface_name; } /* ----------------------------------------------------------------------------- * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); String *c_baseclass = SwigType_namestr(Getattr(base, "name")); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); Append(interface_list, interface_name); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(base, "javainterfacecode", Getattr(base, "classtypeobj"), WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF, attributes)); String *cptr_method_name = 0; if (interface_code) { Replaceall(interface_code, "$interfacename", interface_name); Printv(interface_upcasts, interface_code, NIL); cptr_method_name = Copy(Getattr(attributes, "tmap:javainterfacecode:cptrmethod")); } if (!cptr_method_name) cptr_method_name = NewStringf("%s_GetInterfaceCPtr", interface_name); Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), proxy_class_name, cptr_method_name); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); Delete(c_baseclass); } Delete(keys); } /* ----------------------------------------------------------------------------- * upcastsCode() * * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { String *jniname = makeValidJniName(upcast_method_name); String *wname = Swig_name_wrapper(jniname); Printf(imclass_cppcasts_code, " public final static native long %s(long jarg1);\n", upcast_method_name); if (smart) { SwigType *bsmart = Copy(smart); SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); Replaceall(bsmart, rclassname, rbaseclass); Delete(rclassname); Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" " ", smartnamestr, " *argp1;\n" " (void)jenv;\n" " (void)jcls;\n" " argp1 = *(", smartnamestr, " **)&jarg1;\n" " *(", bsmartnamestr, " **)&baseptr = argp1 ? new ", bsmartnamestr, "(*argp1) : 0;\n" " return baseptr;\n" "}\n", "\n", NIL); Delete(bsmartnamestr); Delete(smartnamestr); Delete(bsmart); } else { Printv(upcasts_code, "SWIGEXPORT jlong JNICALL ", wname, "(JNIEnv *jenv, jclass jcls, jlong jarg1) {\n", " jlong baseptr = 0;\n" " (void)jenv;\n" " (void)jcls;\n" " *(", c_baseclass, " **)&baseptr = *(", c_classname, " **)&jarg1;\n" " return baseptr;\n" "}\n", "\n", NIL); } Delete(wname); Delete(jniname); } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; String *baseclass = NULL; String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure Java classes Node *attributes = NewHash(); const String *pure_baseclass = typemapLookup(n, "javabase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:javabase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:javabase:notderived") ? true : false; Delete(attributes); // C++ inheritance if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { c_baseclassname = baseclassname; baseclass = Copy(getProxyName(baseclassname)); if (baseclass) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Java.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } } Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass && getProxyName(c_baseclassname); if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The javabase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } else if (Len(pure_baseclass) > 0 && Len(baseclass) > 0) { Swig_warning(WARN_JAVA_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Java. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the javabase typemap?\n", typemap_lookup_type, pure_baseclass); } // Pure Java interfaces const String *pure_interfaces = typemapLookup(n, "javainterfaces", typemap_lookup_type, WARN_NONE); if (*Char(interface_list) && *Char(pure_interfaces)) Append(interface_list, ", "); Append(interface_list, pure_interfaces); // Start writing the proxy class if (!has_outerclass) // Import statements Printv(proxy_class_def, typemapLookup(n, "javaimports", typemap_lookup_type, WARN_NONE),"\n", NIL); else Printv(proxy_class_def, "static ", NIL); // C++ nested classes correspond to static java classes Printv(proxy_class_def, typemapLookup(n, "javaclassmodifiers", typemap_lookup_type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $javaclassname", // Class name and bases (*Char(wanted_base)) ? " extends " : "", wanted_base, *Char(interface_list) ? // Pure Java interfaces " implements " : "", interface_list, " {", derived ? typemapLookup(n, "javabody_derived", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF) : // main body of class typemapLookup(n, "javabody", typemap_lookup_type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class NIL); // C++ destructor is wrapped by the delete method // Note that the method name is specified in a typemap attribute called methodname String *destruct = NewString(""); const String *tm = NULL; attributes = NewHash(); String *destruct_methodname = NULL; String *destruct_methodmodifiers = NULL; if (derived) { tm = typemapLookup(n, "javadestruct_derived", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:javadestruct_derived:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:javadestruct_derived:methodmodifiers"); } else { tm = typemapLookup(n, "javadestruct", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:javadestruct:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:javadestruct:methodmodifiers"); } if (tm && *Char(tm)) { if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in javadestruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } if (!destruct_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in javadestruct%s typemap for %s.\n", (derived ? "_derived" : ""), proxy_class_name); } } // Emit the finalize and delete methods if (tm) { // Finalize method if (*Char(destructor_call)) { Printv(proxy_class_def, typemapLookup(n, "javafinalize", typemap_lookup_type, WARN_NONE), NIL); } // delete method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$jnicall", destructor_call); else Replaceall(destruct, "$jnicall", "throw new UnsupportedOperationException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) Printv(proxy_class_def, "\n ", destruct_methodmodifiers, " void ", destruct_methodname, "()", destructor_throws_clause, " ", destruct, "\n", NIL); } if (*Char(interface_upcasts)) Printv(proxy_class_def, interface_upcasts, NIL); /* Insert directordisconnect typemap, if this class has directors enabled */ /* Also insert the swigTakeOwnership and swigReleaseOwnership methods */ if (feature_director) { String *destruct_jnicall, *release_jnicall, *take_jnicall; String *changeown_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "change_ownership"); destruct_jnicall = NewStringf("%s()", destruct_methodname); release_jnicall = NewStringf("%s.%s(this, swigCPtr, false)", full_imclass_name, changeown_method_name); take_jnicall = NewStringf("%s.%s(this, swigCPtr, true)", full_imclass_name, changeown_method_name); emitCodeTypemap(n, false, typemap_lookup_type, "directordisconnect", "methodname", destruct_jnicall); emitCodeTypemap(n, false, typemap_lookup_type, "directorowner_release", "methodname", release_jnicall); emitCodeTypemap(n, false, typemap_lookup_type, "directorowner_take", "methodname", take_jnicall); Delete(destruct_jnicall); Delete(changeown_method_name); Delete(release_jnicall); Delete(take_jnicall); } Delete(interface_upcasts); Delete(interface_list); Delete(attributes); Delete(destruct); // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "javacode", typemap_lookup_type, WARN_NONE), // extra Java code "\n", NIL); if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); } Delete(smart); Delete(baseclass); } /* ---------------------------------------------------------------------- * emitInterfaceDeclaration() * ---------------------------------------------------------------------- */ void emitInterfaceDeclaration(Node *n, String *interface_name, File *f_interface, String *nspace) { if (package || nspace) { Printf(f_interface, "package "); if (package) Printv(f_interface, package, nspace ? "." : "", NIL); if (nspace) Printv(f_interface, nspace, NIL); Printf(f_interface, ";\n"); } Printv(f_interface, typemapLookup(n, "javaimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); Printf(f_interface, "public interface %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) continue; // TODO: warn about skipped non-interface bases String *base_iname = Getattr(base.item, "interface:name"); if (!bases) bases = Copy(base_iname); else { Append(bases, ", "); Append(bases, base_iname); } } if (bases) { Printv(f_interface, " extends ", bases, NIL); Delete(bases); } } Printf(f_interface, " {\n"); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(n, "javainterfacecode", Getattr(n, "classtypeobj"), WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF, attributes)); if (interface_code) { String *interface_declaration = Copy(Getattr(attributes, "tmap:javainterfacecode:declaration")); if (interface_declaration) { Replaceall(interface_declaration, "$interfacename", interface_name); Printv(f_interface, interface_declaration, NIL); Delete(interface_declaration); } Delete(interface_code); } } /* ---------------------------------------------------------------------- * classDeclaration() * ---------------------------------------------------------------------- */ int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { File *f_proxy = NULL; File *f_interface = NULL; String *old_proxy_class_name = proxy_class_name; String *old_full_proxy_class_name = full_proxy_class_name; String *old_full_imclass_name = full_imclass_name; String *old_destructor_call = destructor_call; String *old_destructor_throws_clause = destructor_throws_clause; String *old_proxy_class_constants_code = proxy_class_constants_code; String *old_proxy_class_def = proxy_class_def; String *old_proxy_class_code = proxy_class_code; bool has_outerclass = Getattr(n, "nested:outer") && !GetFlag(n, "feature:flatnested"); String *old_interface_class_code = interface_class_code; interface_class_code = 0; if (proxy_flag) { proxy_class_name = NewString(Getattr(n, "sym:name")); String *nspace = getNSpace(); constructIntermediateClassName(n); String *outerClassesPrefix = 0; if (Node *outer = Getattr(n, "nested:outer")) { outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } } if (!nspace) { full_proxy_class_name = outerClassesPrefix ? NewStringf("%s.%s", outerClassesPrefix, proxy_class_name) : NewStringf("%s", proxy_class_name); if (Cmp(proxy_class_name, imclass_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, module_class_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } } else { if (outerClassesPrefix) { if (package) full_proxy_class_name = NewStringf("%s.%s.%s.%s", package, nspace, outerClassesPrefix, proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s.%s", nspace, outerClassesPrefix, proxy_class_name); } else { if (package) full_proxy_class_name = NewStringf("%s.%s.%s", package, nspace, proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s", nspace, proxy_class_name); } } String *interface_name = Getattr(n, "feature:interface") ? Getattr(n, "interface:name") : 0; if (outerClassesPrefix) { String *fnspace = nspace ? NewStringf("%s.%s", nspace, outerClassesPrefix) : outerClassesPrefix; if (!addSymbol(proxy_class_name, n, fnspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, fnspace)) return SWIG_ERROR; if (nspace) Delete(fnspace); Delete(outerClassesPrefix); } else { if (!addSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, nspace)) return SWIG_ERROR; } // Each outer proxy class goes into a separate file if (!has_outerclass) { String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, proxy_class_name); f_proxy = NewFile(filen, "w", SWIG_output_files()); if (!f_proxy) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); Delete(output_directory); // Start writing out the proxy class file emitBanner(f_proxy); if (package || nspace) { Printf(f_proxy, "package "); if (package) Printv(f_proxy, package, nspace ? "." : "", NIL); if (nspace) Printv(f_proxy, nspace, NIL); Printf(f_proxy, ";\n"); } } else ++nesting_depth; proxy_class_def = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); destructor_throws_clause = NewString(""); proxy_class_constants_code = NewString(""); if (Getattr(n, "feature:interface")) { interface_class_code = NewString(""); String *output_directory = outputDirectory(nspace); String *filen = NewStringf("%s%s.java", output_directory, interface_name); f_interface = NewFile(filen, "w", SWIG_output_files()); if (!f_interface) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, filen); // file name ownership goes to the list emitBanner(f_interface); emitInterfaceDeclaration(n, interface_name, interface_class_code, nspace); Delete(filen); Delete(output_directory); } } Language::classHandler(n); if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); String *javaclazzname = Swig_name_member(getNSpace(), getClassPrefix(), ""); // mangled full proxy class name Replaceall(proxy_class_def, "$javaclassname", proxy_class_name); Replaceall(proxy_class_code, "$javaclassname", proxy_class_name); Replaceall(proxy_class_constants_code, "$javaclassname", proxy_class_name); Replaceall(interface_class_code, "$javaclassname", proxy_class_name); Replaceall(proxy_class_def, "$javaclazzname", javaclazzname); Replaceall(proxy_class_code, "$javaclazzname", javaclazzname); Replaceall(proxy_class_constants_code, "$javaclazzname", javaclazzname); Replaceall(interface_class_code, "$javaclazzname", javaclazzname); Replaceall(proxy_class_def, "$module", module_class_name); Replaceall(proxy_class_code, "$module", module_class_name); Replaceall(proxy_class_constants_code, "$module", module_class_name); Replaceall(interface_class_code, "$module", module_class_name); Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_constants_code, "$imclassname", full_imclass_name); Replaceall(interface_class_code, "$imclassname", full_imclass_name); if (!has_outerclass) Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); else { Swig_offset_string(proxy_class_def, nesting_depth); Append(old_proxy_class_code, proxy_class_def); Swig_offset_string(proxy_class_code, nesting_depth); Append(old_proxy_class_code, proxy_class_code); } // Write out all the constants if (Len(proxy_class_constants_code) != 0) { if (!has_outerclass) Printv(f_proxy, proxy_class_constants_code, NIL); else { Swig_offset_string(proxy_class_constants_code, nesting_depth); Append(old_proxy_class_code, proxy_class_constants_code); } } if (!has_outerclass) { Printf(f_proxy, "}\n"); Delete(f_proxy); f_proxy = NULL; } else { for (int i = 0; i < nesting_depth; ++i) Append(old_proxy_class_code, " "); Append(old_proxy_class_code, "}\n\n"); --nesting_depth; } /* Output the downcast method, if necessary. Note: There's no other really good place to put this code, since Abstract Base Classes (ABCs) can and should have downcasts, making the constructorHandler() a bad place (because ABCs don't get to have constructors emitted.) */ if (GetFlag(n, "feature:javadowncast")) { String *downcast_method = Swig_name_member(getNSpace(), getClassPrefix(), "SWIGDowncast"); String *jniname = makeValidJniName(downcast_method); String *wname = Swig_name_wrapper(jniname); String *norm_name = SwigType_namestr(Getattr(n, "name")); Printf(imclass_class_code, " public final static native %s %s(long cPtrBase, boolean cMemoryOwn);\n", proxy_class_name, downcast_method); Wrapper *dcast_wrap = NewWrapper(); Printf(dcast_wrap->def, "SWIGEXPORT jobject JNICALL %s(JNIEnv *jenv, jclass jcls, jlong jCPtrBase, jboolean cMemoryOwn) {", wname); Printf(dcast_wrap->code, " Swig::Director *director = (Swig::Director *) 0;\n"); Printf(dcast_wrap->code, " jobject jresult = (jobject) 0;\n"); Printf(dcast_wrap->code, " %s *obj = *((%s **)&jCPtrBase);\n", norm_name, norm_name); Printf(dcast_wrap->code, " if (obj) director = dynamic_cast(obj);\n"); Printf(dcast_wrap->code, " if (director) jresult = director->swig_get_self(jenv);\n"); Printf(dcast_wrap->code, " return jresult;\n"); Printf(dcast_wrap->code, "}\n"); Wrapper_print(dcast_wrap, f_wrappers); DelWrapper(dcast_wrap); Delete(norm_name); Delete(wname); Delete(jniname); Delete(downcast_method); } if (f_interface) { Printv(f_interface, interface_class_code, "}\n", NIL); Delete(f_interface); f_interface = 0; } emitDirectorExtraMethods(n); Delete(interface_class_code); interface_class_code = old_interface_class_code; Delete(javaclazzname); Delete(proxy_class_name); proxy_class_name = old_proxy_class_name; Delete(full_proxy_class_name); full_proxy_class_name = old_full_proxy_class_name; Delete(full_imclass_name); full_imclass_name = old_full_imclass_name; Delete(destructor_call); destructor_call = old_destructor_call; Delete(destructor_throws_clause); destructor_throws_clause = old_destructor_throws_clause; Delete(proxy_class_constants_code); proxy_class_constants_code = old_proxy_class_constants_code; Delete(proxy_class_def); proxy_class_def = old_proxy_class_def; Delete(proxy_class_code); proxy_class_code = old_proxy_class_code; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { member_func_flag = true; Language::memberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } member_func_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; member_func_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; member_func_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a Java wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to Java static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the Java class proxy function, which in turn will call "imfuncname" - * the intermediary (JNI) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); bool is_interface = Getattr(parentNode(n), "feature:interface") != 0 && !static_flag && Getattr(n, "interface:owner") == 0; if (!proxy_flag) return; // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in directors if (GetFlag(n, "explicitcall")) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("jtype", l, NULL); Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { // Note that in the case of polymorphic (covariant) return types, the method's return type is changed to be the base of the C++ return type SwigType *covariant = Getattr(n, "covariant"); substituteClassname(covariant ? covariant : t, tm); Printf(return_type, "%s", tm); if (covariant) Swig_warning(WARN_JAVA_COVARIANT_RET, input_file, line_number, "Covariant return types not supported in Java. Proxy method will return %s.\n", SwigType_str(covariant, 0)); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // For wrapping member variables (Javabean setter) setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) == 0); } /* Start generating the proxy function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s ", methodmods); if (static_flag) Printf(function_code, "static "); Printf(function_code, "%s %s(", return_type, proxy_function_name); if (is_interface) Printf(interface_class_code, " %s %s(", return_type, proxy_function_name); Printv(imcall, full_imclass_name, ".$imfuncname(", NIL); if (!static_flag) { Printf(imcall, "swigCPtr"); String *this_type = Copy(getClassType()); String *name = NewString("jself"); String *qualifier = Getattr(n, "qualifier"); if (qualifier) SwigType_push(this_type, qualifier); SwigType_add_pointer(this_type); Parm *this_parm = NewParm(this_type, name, n); Swig_typemap_attach_parms("jtype", this_parm, NULL); Swig_typemap_attach_parms("jstype", this_parm, NULL); if (prematureGarbageCollectionPreventionParameter(this_type, this_parm)) Printf(imcall, ", this"); Delete(this_parm); Delete(name); Delete(this_type); } emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0) || static_flag) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, setter_flag); // Use typemaps to transform type used in Java proxy wrapper (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma >= 2) { Printf(function_code, ", "); if (is_interface) Printf(interface_class_code, ", "); } gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (is_interface) Printf(interface_class_code, "%s %s", param_type, arg); if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); if (is_interface) Printf(interface_class_code, ");\n"); // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in proxy class) if ((tm = Swig_typemap_lookup("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); // For director methods: generate code to selectively make a normal polymorphic call or // an explicit method call - needed to prevent infinite recursion calls in director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); if (!Cmp(return_type, "void")) Printf(excode, "if (getClass() == %s.class) %s; else %s", proxy_class_name, imcall, ex_imcall); else Printf(excode, "(getClass() == %s.class) ? %s : %s", proxy_class_name, imcall, ex_imcall); Clear(imcall); Printv(imcall, excode, NIL); Delete(ex_overloaded_name); Delete(excode); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$jnicall", imcall); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, "No javaout typemap defined for %s\n", SwigType_str(t, 0)); } generateThrowsClause(n, function_code); Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(proxy_class_code, function_code, NIL); Delete(pre_code); Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *function_code = NewString(""); String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the javain typemap has code in the pre or post attributes String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloaded in Java if (Getattr(n, "overload:ignore")) return SWIG_OK; if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); tm = Getattr(n, "tmap:jtype"); // typemaps were attached earlier to the node Printf(im_return_type, "%s", tm); Printf(function_code, " %s %s(", methodmods, proxy_class_name); Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); Printv(imcall, full_imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("jtype", l, NULL); Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(function_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(function_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", arg); ++gencomma; if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); Printf(helper_code, ")"); generateThrowsClause(n, function_code); /* Insert the javaconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); String *construct_tm = Copy(typemapLookup(n, "javaconstruct", Getattr(n, "name"), WARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF, attributes)); if (construct_tm) { if (!feature_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:javaconstruct:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_JAVA_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"javaconstruct\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(function_code, " ", construct_tm, "\n", NIL); } bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { generateThrowsClause(n, helper_code); Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } Printf(helper_code, "\n }\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); Printv(proxy_class_code, helper_code, "\n", NIL); Replaceall(function_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(function_code, "$imcall", imcall); } Printv(proxy_class_code, function_code, "\n", NIL); Delete(helper_args); Delete(im_return_type); Delete(pre_code); Delete(post_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, full_imclass_name, ".", Swig_name_destroy(getNSpace(), symname), "(swigCPtr)", NIL); generateThrowsClause(n, destructor_throws_clause); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { /* Although JNI functions are designed to handle overloaded Java functions, * a Java long is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * moduleClassFunctionHandler() * ----------------------------------------------------------------------------- */ void moduleClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("jstype", l, NULL); Swig_typemap_attach_parms("javain", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("jstype", n, "", 0))) { substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (proxy_flag && global_variable_flag) { // Capitalize the first letter in the variable to create a JavaBean type getter/setter function name func_name = NewString(""); setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), variable_name)) == 0); if (setter_flag) Printf(func_name, "set"); else Printf(func_name, "get"); Putc(toupper((int) *Char(variable_name)), func_name); Printf(func_name, "%s", Char(variable_name) + 1); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *methodmods = Getattr(n, "feature:java:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name); Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); bool global_or_member_variable = global_variable_flag || (wrapping_member_flag && !enum_constant_flag); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Java parameter type */ if ((tm = Getattr(p, "tmap:jstype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { Swig_warning(WARN_JAVA_TYPEMAP_JSTYPE_UNDEF, input_file, line_number, "No jstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, global_or_member_variable); // Use typemaps to transform type used in Java wrapper function (in proxy class) to type used in JNI function (in intermediary class) if ((tm = Getattr(p, "tmap:javain"))) { addThrows(n, "tmap:javain", p); substituteClassname(pt, tm); Replaceall(tm, "$javainput", arg); String *pre = Getattr(p, "tmap:javain:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$javainput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:javain:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$javainput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAIN_UNDEF, input_file, line_number, "No javain typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (prematureGarbageCollectionPreventionParameter(pt, p)) { String *pgcppname = Getattr(p, "tmap:javain:pgcppname"); if (pgcppname) { String *argname = Copy(pgcppname); Replaceall(argname, "$javainput", arg); Printf(imcall, ", %s", argname); Delete(argname); } else { Printf(imcall, ", %s", arg); } } p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in JNI function (in intermediary class) to type used in Java wrapper function (in module class) if ((tm = Swig_typemap_lookup("javaout", n, "", 0))) { addThrows(n, "tmap:javaout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; if (is_pre_code || is_post_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$jnicall", imcall); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF, input_file, line_number, "No javaout typemap defined for %s\n", SwigType_str(t, 0)); } generateThrowsClause(n, function_code); Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(module_class_code, function_code, NIL); Delete(pre_code); Delete(post_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /*---------------------------------------------------------------------- * decodeEnumFeature() * Decode the possible enum features, which are one of: * %javaenum(simple) * %javaenum(typeunsafe) - default * %javaenum(typesafe) * %javaenum(proper) *--------------------------------------------------------------------*/ EnumFeature decodeEnumFeature(Node *n) { EnumFeature enum_feature = TypeunsafeEnum; String *feature = Getattr(n, "feature:java:enum"); if (feature) { if (Cmp(feature, "simple") == 0) enum_feature = SimpleEnum; else if (Cmp(feature, "typesafe") == 0) enum_feature = TypesafeEnum; else if (Cmp(feature, "proper") == 0) enum_feature = ProperEnum; } return enum_feature; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in Java generated * code. If the %javaconst feature is not used, the string will contain the intermediary * class call to obtain the enum value. The intermediary class and JNI methods to obtain * the enum value will be generated. Otherwise the C/C++ enum value will be used if there * is one and hopefully it will compile as Java code - e.g. 20 as in: enum E{e=20}; * The %javaconstvalue feature overrides all other ways to generate the constant value. * The caller must delete memory allocated for the returned string. * ------------------------------------------------------------------------ */ String *enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); // Check for the %javaconstvalue feature String *value = Getattr(n, "feature:java:constvalue"); if (!value) { // The %javaconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:java:const"); if (const_feature_flag) { // Use the C syntax to make a true Java constant and hope that it compiles as Java code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { String *newsymname = 0; if (!getCurrentClass() || !proxy_flag) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { // A global scoped enum newsymname = Swig_name_member(0, enumClassPrefix, symname); symname = newsymname; } } // Get the enumvalue from a JNI call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } Delete(newsymname); } } return value; } /* ----------------------------------------------------------------------------- * getEnumName() * * If jnidescriptor is set, inner class names are separated with '$' otherwise a '.' * and the package is also not added to the name. * ----------------------------------------------------------------------------- */ String *getEnumName(SwigType *t, bool jnidescriptor) { Node *enumname = NULL; Node *n = enumLookup(t); if (n) { enumname = Getattr(n, "enumname"); if (!enumname || jnidescriptor) { String *symname = Getattr(n, "sym:name"); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix, jnidescriptor); } if (proxyname) { const char *class_separator = jnidescriptor ? "$" : "."; enumname = NewStringf("%s%s%s", proxyname, class_separator, symname); } else { // global enum or enum in a namespace String *nspace = Getattr(n, "sym:nspace"); if (nspace) { if (package && !jnidescriptor) enumname = NewStringf("%s.%s.%s", package, nspace, symname); else enumname = NewStringf("%s.%s", nspace, symname); } else { enumname = Copy(symname); } } if (!jnidescriptor) { Setattr(n, "enumname", enumname); // Cache it Delete(enumname); } Delete(scopename_prefix); } } } return enumname; } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $javaclassname with the proxy class name for classes/structs/unions * that SWIG knows about. Also substitutes enums with enum name. * Otherwise use the $descriptor name for the Java class name. Note that the $&javaclassname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Note that the path separator is a '.' unless jnidescriptor is set. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * jnidescriptor - if set, inner class names are separated with '$' otherwise a '/' is used for the path separator * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm, bool jnidescriptor = false) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$javaclassname")) { SwigType *classnametype = Copy(strippedtype); substituteClassnameSpecialVariable(classnametype, tm, "$javaclassname", jnidescriptor); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*javaclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); if (Len(classnametype) > 0) { substituteClassnameSpecialVariable(classnametype, tm, "$*javaclassname", jnidescriptor); substitution_performed = true; } Delete(classnametype); } if (Strstr(tm, "$&javaclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); substituteClassnameSpecialVariable(classnametype, tm, "$&javaclassname", jnidescriptor); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$javainterfacename", jnidescriptor, true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*javainterfacename", jnidescriptor, true); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&javainterfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&javainterfacename", jnidescriptor, true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$interfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$interfacename", jnidescriptor, false); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*interfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*interfacename", jnidescriptor, false); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&interfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&interfacename", jnidescriptor, false); substitution_performed = true; Delete(interfacenametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* ----------------------------------------------------------------------------- * substituteClassnameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable, bool jnidescriptor) { String *replacementname; if (SwigType_isenum(classnametype)) { String *enumname = getEnumName(classnametype, jnidescriptor); if (enumname) { replacementname = Copy(enumname); } else { bool anonymous_enum = (Cmp(classnametype, "enum ") == 0); if (anonymous_enum) { replacementname = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Setattr(swig_types_hash, replacementname, classnametype); } } } else { String *classname = getProxyName(classnametype, jnidescriptor); // getProxyName() works for pointers to classes too if (classname) { replacementname = Copy(classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, replacementname, classnametype); } } if (jnidescriptor) Replaceall(replacementname,".","/"); Replaceall(tm, classnamespecialvariable, replacementname); Delete(replacementname); } /* ----------------------------------------------------------------------------- * substituteInterfacenameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteInterfacenameSpecialVariable(SwigType *interfacenametype, String *tm, const char *interfacenamespecialvariable, bool jnidescriptor, bool qualified) { String *interfacename = getInterfaceName(interfacenametype/*, jnidescriptor*/, qualified); if (interfacename) { String *replacementname = Copy(interfacename); if (jnidescriptor) Replaceall(replacementname,".","/"); Replaceall(tm, interfacenamespecialvariable, replacementname); Delete(replacementname); } } /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *swigtype = NewString(""); String *filen = NewStringf("%s%s.java", SWIG_output_directory(), classname); File *f_swigtype = NewFile(filen, "w", SWIG_output_files()); if (!f_swigtype) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the type wrapper class file emitBanner(f_swigtype); if (package) Printf(f_swigtype, "package %s;\n", package); // Pure Java baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "javabase", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "javainterfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "javaimports", type, WARN_NONE), // Import statements "\n", typemapLookup(n, "javaclassmodifiers", type, WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $javaclassname", // Class name and bases *Char(pure_baseclass) ? " extends " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " implements " : "", pure_interfaces, " {", typemapLookup(n, "javabody", type, WARN_JAVA_TYPEMAP_JAVABODY_UNDEF), // main body of class typemapLookup(n, "javacode", type, WARN_NONE), // extra Java code "}\n", "\n", NIL); Replaceall(swigtype, "$javaclassname", classname); Replaceall(swigtype, "$module", module_class_name); Replaceall(swigtype, "$imclassname", imclass_name); // For unknown enums Replaceall(swigtype, "$static ", ""); Replaceall(swigtype, "$enumvalues", ""); Printv(f_swigtype, swigtype, NIL); Delete(f_swigtype); Delete(swigtype); Delete(n); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * addThrows() * * Adds exception classes to a throws list. The throws list is the list of classes * that will form the Java throws clause. Mainly for checked exceptions. * ----------------------------------------------------------------------------- */ void addThrows(Node *n, const String *attribute, Node *parameter) { // Get the comma separated exception classes for the throws clause - held in typemap/feature's "throws" attribute String *throws_attribute = NewStringf("%s:throws", attribute); String *throws = Getattr(parameter, throws_attribute); if (throws && Len(throws) > 0) { String *throws_list = Getattr(n, "java:throwslist"); if (!throws_list) { throws_list = NewList(); Setattr(n, "java:throwslist", throws_list); } // Put the exception classes in the throws clause into a temporary List List *temp_classes_list = Split(throws, ',', INT_MAX); // Add the exception classes to the node throws list, but don't duplicate if already in list if (temp_classes_list && Len(temp_classes_list) > 0) { for (Iterator cls = First(temp_classes_list); cls.item; cls = Next(cls)) { String *exception_class = NewString(cls.item); Replaceall(exception_class, " ", ""); // remove spaces Replaceall(exception_class, "\t", ""); // remove tabs if (Len(exception_class) > 0) { // $javaclassname substitution SwigType *pt = Getattr(parameter, "type"); substituteClassname(pt, exception_class); // Don't duplicate the Java exception class in the throws clause bool found_flag = false; for (Iterator item = First(throws_list); item.item; item = Next(item)) { if (Strcmp(item.item, exception_class) == 0) found_flag = true; } if (!found_flag) Append(throws_list, exception_class); } Delete(exception_class); } } Delete(temp_classes_list); } Delete(throws_attribute); } /* ----------------------------------------------------------------------------- * generateThrowsClause() * * Generates throws clause for checked exception * ----------------------------------------------------------------------------- */ void generateThrowsClause(Node *n, String *code) { // Add the throws clause into code List *throws_list = Getattr(n, "java:throwslist"); if (throws_list) { Iterator cls = First(throws_list); Printf(code, " throws %s", cls.item); while ((cls = Next(cls)).item) Printf(code, ", %s", cls.item); } } /* ----------------------------------------------------------------------------- * prematureGarbageCollectionPreventionParameter() * * Get the proxy class name for use in an additional generated parameter. The * additional parameter is added to a native method call purely to prevent * premature garbage collection of proxy classes which pass their C++ class pointer * in a Java long to the JNI layer. * ----------------------------------------------------------------------------- */ String *prematureGarbageCollectionPreventionParameter(SwigType *t, Parm *p) { String *pgcpp_java_type = 0; String *jtype = NewString(Getattr(p, "tmap:jtype")); // Strip C comments String *stripped_jtype = Swig_strip_c_comments(jtype); if (stripped_jtype) { Delete(jtype); jtype = stripped_jtype; } // Remove whitespace Replaceall(jtype, " ", ""); Replaceall(jtype, "\t", ""); if (Cmp(jtype, "long") == 0) { if (proxy_flag) { if (!GetFlag(p, "tmap:jtype:nopgcpp") && !nopgcpp_flag) { String *interface_name = getInterfaceName(t, true); pgcpp_java_type = interface_name ? interface_name : getProxyName(t); if (!pgcpp_java_type) { // Look for proxy class parameters passed to C++ layer using non-default typemaps, ie not one of above types String *jstype = NewString(Getattr(p, "tmap:jstype")); if (jstype) { Hash *classes = getClassHash(); if (classes) { // Strip C comments String *stripped_jstype = Swig_strip_c_comments(jstype); if (stripped_jstype) { Delete(jstype); jstype = stripped_jstype; } // Remove whitespace Replaceall(jstype, " ", ""); Replaceall(jstype, "\t", ""); Iterator ki; for (ki = First(classes); ki.key; ki = Next(ki)) { Node *cls = ki.item; if (cls && !Getattr(cls, "feature:ignore")) { String *symname = Getattr(cls, "sym:name"); if (symname && Strcmp(symname, jstype) == 0) { pgcpp_java_type = symname; } } } } } Delete(jstype); } } } } Delete(jtype); return pgcpp_java_type; } /* ----------------------------------------------------------------------------- * outputDirectory() * * Return the directory to use for generating Java classes/enums and create the * subdirectory (does not create if language specific outdir does not exist). * ----------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(SWIG_output_directory()); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /*---------------------------------------------------------------------- * Start of director methods *--------------------------------------------------------------------*/ /*---------------------------------------------------------------------- * getUpcallJNIMethod() *--------------------------------------------------------------------*/ String *getUpcallJNIMethod(String *descrip) { static struct { char code; const char *method; } upcall_methods[] = { { 'B', "CallStaticByteMethod"}, { 'C', "CallStaticCharMethod"}, { 'D', "CallStaticDoubleMethod"}, { 'F', "CallStaticFloatMethod"}, { 'I', "CallStaticIntMethod"}, { 'J', "CallStaticLongMethod"}, { 'L', "CallStaticObjectMethod"}, { 'S', "CallStaticShortMethod"}, { 'V', "CallStaticVoidMethod"}, { 'Z', "CallStaticBooleanMethod"}, { '[', "CallStaticObjectMethod"} }; char code; int i; code = *Char(descrip); for (i = 0; i < (int) (sizeof(upcall_methods) / sizeof(upcall_methods[0])); ++i) if (code == upcall_methods[i].code) return NewString(upcall_methods[i].method); return NULL; } /*---------------------------------------------------------------------- * emitDirectorUpcalls() *--------------------------------------------------------------------*/ void emitDirectorUpcalls() { if (n_dmethods) { Wrapper *w = NewWrapper(); String *jni_imclass_name = makeValidJniName(imclass_name); String *swig_module_init = NewString("swig_module_init"); String *swig_module_init_jni = makeValidJniName(swig_module_init); String *dmethod_data = NewString(""); int n_methods = 0; Iterator udata_iter; udata_iter = First(dmethods_seq); while (udata_iter.item) { UpcallData *udata = udata_iter.item; Printf(dmethod_data, " { \"%s\", \"%s\" }", Getattr(udata, "imclass_method"), Getattr(udata, "imclass_fdesc")); ++n_methods; udata_iter = Next(udata_iter); if (udata_iter.item) Putc(',', dmethod_data); Putc('\n', dmethod_data); } Printf(f_runtime, "namespace Swig {\n"); Printf(f_runtime, " namespace {\n"); Printf(f_runtime, " jclass jclass_%s = NULL;\n", imclass_name); Printf(f_runtime, " jmethodID director_method_ids[%d];\n", n_methods); Printf(f_runtime, " }\n"); Printf(f_runtime, "}\n"); Printf(w->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls) {", jnipackage, jni_imclass_name, swig_module_init_jni); Printf(w->code, "static struct {\n"); Printf(w->code, " const char *method;\n"); Printf(w->code, " const char *signature;\n"); Printf(w->code, "} methods[%d] = {\n", n_methods); Printv(w->code, dmethod_data, NIL); Printf(w->code, "};\n"); Wrapper_add_local(w, "i", "int i"); Printf(w->code, "Swig::jclass_%s = (jclass) jenv->NewGlobalRef(jcls);\n", imclass_name); Printf(w->code, "if (!Swig::jclass_%s) return;\n", imclass_name); Printf(w->code, "for (i = 0; i < (int) (sizeof(methods)/sizeof(methods[0])); ++i) {\n"); Printf(w->code, " Swig::director_method_ids[i] = jenv->GetStaticMethodID(jcls, methods[i].method, methods[i].signature);\n"); Printf(w->code, " if (!Swig::director_method_ids[i]) return;\n"); Printf(w->code, "}\n"); Printf(w->code, "}\n"); Wrapper_print(w, f_wrappers); Delete(dmethod_data); Delete(swig_module_init_jni); Delete(swig_module_init); Delete(jni_imclass_name); DelWrapper(w); } } /*---------------------------------------------------------------------- * emitDirectorExtraMethods() * * This is where the director connect method is generated. *--------------------------------------------------------------------*/ void emitDirectorExtraMethods(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method: String *jni_imclass_name = makeValidJniName(imclass_name); String *norm_name = SwigType_namestr(Getattr(n, "name")); String *swig_director_connect = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); String *swig_director_connect_jni = makeValidJniName(swig_director_connect); String *smartptr = Getattr(n, "feature:smartptr"); String *dirClassName = directorClassName(n); Wrapper *code_wrap; Printf(imclass_class_code, " public final static native void %s(%s obj, long cptr, boolean mem_own, boolean weak_global);\n", swig_director_connect, full_proxy_class_name); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jswig_mem_own, " "jboolean jweak_global) {\n", jnipackage, jni_imclass_name, swig_director_connect_jni); if (smartptr) { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", smartptr, smartptr); Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", norm_name, norm_name); Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj);\n", dirClassName, dirClassName); } Printf(code_wrap->code, " if (director) {\n"); Printf(code_wrap->code, " director->swig_connect_director(jenv, jself, jenv->GetObjectClass(jself), " "(jswig_mem_own == JNI_TRUE), (jweak_global == JNI_TRUE));\n"); Printf(code_wrap->code, " }\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(swig_director_connect_jni); Delete(swig_director_connect); // Output the swigReleaseOwnership, swigTakeOwnership methods: String *changeown_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "change_ownership"); String *changeown_jnimethod_name = makeValidJniName(changeown_method_name); Printf(imclass_class_code, " public final static native void %s(%s obj, long cptr, boolean take_or_release);\n", changeown_method_name, full_proxy_class_name); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void JNICALL Java_%s%s_%s(JNIEnv *jenv, jclass jcls, jobject jself, jlong objarg, jboolean jtake_or_release) {\n", jnipackage, jni_imclass_name, changeown_jnimethod_name); Printf(code_wrap->code, " %s *obj = *((%s **)&objarg);\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj);\n", dirClassName, dirClassName); Printf(code_wrap->code, " (void)jcls;\n"); Printf(code_wrap->code, " if (director) {\n"); Printf(code_wrap->code, " director->swig_java_change_ownership(jenv, jself, jtake_or_release ? true : false);\n"); Printf(code_wrap->code, " }\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(changeown_method_name); Delete(changeown_jnimethod_name); Delete(norm_name); Delete(dirClassName); Delete(jni_imclass_name); } /*---------------------------------------------------------------------- * emitCodeTypemap() * * Output a code typemap that uses $methodname and $jnicall, as used * in the directordisconnect, director_release and director_take * typemaps. *--------------------------------------------------------------------*/ void emitCodeTypemap(Node *n, bool derived, SwigType *lookup_type, const String *typemap, const String *methodname, const String *jnicall) { const String *tm = NULL; Node *tmattrs = NewHash(); String *lookup_tmname = NewString(typemap); String *method_attr_name; String *method_attr; if (derived) { Append(lookup_tmname, "_derived"); } tm = typemapLookup(n, lookup_tmname, lookup_type, WARN_NONE, tmattrs); method_attr_name = NewStringf("tmap:%s:%s", lookup_tmname, methodname); method_attr = Getattr(tmattrs, method_attr_name); if (*Char(tm)) { if (method_attr) { String *codebody = Copy(tm); Replaceall(codebody, "$methodname", method_attr); Replaceall(codebody, "$jnicall", jnicall); Append(proxy_class_def, codebody); Delete(codebody); } else { Swig_error(input_file, line_number, "No %s method name attribute for %s\n", lookup_tmname, proxy_class_name); } } else { Swig_error(input_file, line_number, "No %s typemap for %s\n", lookup_tmname, proxy_class_name); } Delete(tmattrs); Delete(lookup_tmname); // Delete(method_attr); } /* ----------------------------------------------------------------------------- * substitutePackagePath() * * Replace $packagepath using the javapackage typemap associated with passed * parm or global package if p is 0. "$packagepath/" is replaced with "" if * no package is set. Note that the path separator is a '/'. * ----------------------------------------------------------------------------- */ void substitutePackagePath(String *text, Parm *p) { String *pkg_path= 0; if (p) pkg_path = Swig_typemap_lookup("javapackage", p, "", 0); if (!pkg_path || Len(pkg_path) == 0) pkg_path = Copy(package_path); if (Len(pkg_path) > 0) { Replaceall(pkg_path, ".", "/"); Replaceall(text, "$packagepath", pkg_path); } else { Replaceall(text, "$packagepath/", empty_string); Replaceall(text, "$packagepath", empty_string); } Delete(pkg_path); } /* --------------------------------------------------------------- * Canonicalize the JNI field descriptor * * Replace the $packagepath and $javaclassname family of special * variables with the desired package and Java proxy name as * required in the JNI field descriptors. * * !!SFM!! If $packagepath occurs in the field descriptor, but * package_path isn't set (length == 0), then strip it and the * optional trailing '/' from the resulting name. * * --------------------------------------------------------------- */ String *canonicalizeJNIDescriptor(String *descriptor_in, Parm *p) { SwigType *type = Getattr(p, "type"); String *descriptor_out = Copy(descriptor_in); substituteClassname(type, descriptor_out, true); substitutePackagePath(descriptor_out, p); return descriptor_out; } /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Java object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); String *jnidesc = NewString(""); String *classdesc = NewString(""); String *jniret_desc = NewString(""); String *classret_desc = NewString(""); SwigType *c_ret_type = NULL; String *jupcall_args = NewString("swigjobj"); String *imclass_dmethod; String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); int classmeth_off = curr_class_dmethod - first_class_dmethod; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; String *qualified_classname = getProxyName(getClassName()); // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("%s", Swig_name_member(getNSpace(), dirclassname, overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && (!ignored_method || pure_virtual)) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a Java exception occurs, then the pointer returns something other than a NULL-initialized reference. */ String *non_ref_type = Copy(returntype); /* Remove reference and const qualifiers */ Replaceall(non_ref_type, "r.", ""); Replaceall(non_ref_type, "q(const).", ""); Wrapper_add_localv(w, "result_default", "static", SwigType_str(non_ref_type, "result_default"), "=", SwigType_str(non_ref_type, "()"), NIL); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= &result_default", NIL); Delete(non_ref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = Swig_typemap_lookup("jtype", n, "", 0); if (tm) { Printf(callback_def, " public static %s %s(%s jself", tm, imclass_dmethod, qualified_classname); } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s\n", SwigType_str(returntype, 0)); } String *cdesc = NULL; SwigType *covariant = Getattr(n, "covariant"); SwigType *adjustedreturntype = covariant ? covariant : returntype; Parm *adjustedreturntypeparm = NewParmNode(adjustedreturntype, n); if (Swig_typemap_lookup("directorin", adjustedreturntypeparm, "", 0) && (cdesc = Getattr(adjustedreturntypeparm, "tmap:directorin:descriptor"))) { // Note that in the case of polymorphic (covariant) return types, the // method's return type is changed to be the base of the C++ return // type String *jnidesc_canon = canonicalizeJNIDescriptor(cdesc, adjustedreturntypeparm); Append(classret_desc, jnidesc_canon); Delete(jnidesc_canon); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } /* Get the JNI field descriptor for this return type, add the JNI field descriptor to jniret_desc */ if ((c_ret_type = Swig_typemap_lookup("jni", n, "", 0))) { Parm *tp = NewParmNode(c_ret_type, n); if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } String *jdesc = NULL; if (Swig_typemap_lookup("directorin", tp, "", 0) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { // Objects marshalled passing a Java class across JNI boundary use jobject - the nouse flag indicates this // We need the specific Java class name instead of the generic 'Ljava/lang/Object;' if (GetFlag(tp, "tmap:directorin:nouse")) jdesc = cdesc; String *jnidesc_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jniret_desc, jnidesc_canon); Delete(jnidesc_canon); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_ret_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(tp); } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(adjustedreturntypeparm); Swig_director_parms_fixup(l); /* Attach the standard typemaps */ Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("jni", l, 0); Swig_typemap_attach_parms("jtype", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("javadirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); if (!ignored_method) { /* Add Java environment pointer to wrapper */ String *jenvstr = NewString("jenv"); String *jobjstr = NewString("swigjobj"); Wrapper_add_localv(w, "swigjnienv", "JNIEnvWrapper", "swigjnienv(this)", NIL, NIL); Wrapper_add_localv(w, jenvstr, "JNIEnv *", jenvstr, "= swigjnienv.getJNIEnv()", NIL); Wrapper_add_localv(w, jobjstr, "jobject", jobjstr, "= (jobject) NULL", NIL); Delete(jenvstr); Delete(jobjstr); /* Preamble code */ Printf(w->code, "if (!swig_override[%d]) {\n", classmeth_off); } if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, "SWIG_JavaThrowException(JNIEnvWrapper(this).getJNIEnv(), SWIG_JavaDirectorPureVirtual, "); Printf(w->code, "\"Attempted to invoke pure virtual method %s::%s.\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); /* Make sure that we return something in the case of a pure * virtual method call for syntactical reasons. */ if (!is_void) Printf(w->code, "return %s;", qualified_return); else if (!ignored_method) Printf(w->code, "return;\n"); } if (!ignored_method) { Printf(w->code, "}\n"); Printf(w->code, "swigjobj = swig_get_self(jenv);\n"); Printf(w->code, "if (swigjobj && jenv->IsSameObject(swigjobj, NULL) == JNI_FALSE) {\n"); } /* Start the Java field descriptor for the intermediate class's upcall (insert jself object) */ Parm *tp = NewParmNode(c_classname, n); String *jdesc; if ((tm = Swig_typemap_lookup("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor"))) { String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap for type %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(tp); /* Go through argument list, convert from native to Java */ for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Add various typemap's 'throws' clauses */ addThrows(n, "tmap:directorin", p); addThrows(n, "tmap:out", p); /* And add to the upcall args */ Printf(jupcall_args, ", %s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = Getattr(p, "tmap:jni"))) { Parm *tp = NewParm(c_param_type, Getattr(p, "name"), n); String *desc_tm = NULL, *jdesc = NULL, *cdesc = NULL; /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code and update JNI field descriptor */ if ((desc_tm = Swig_typemap_lookup("directorin", tp, "", 0)) && (jdesc = Getattr(tp, "tmap:directorin:descriptor")) && (tm = Getattr(p, "tmap:directorin")) && (cdesc = Getattr(p, "tmap:directorin:descriptor"))) { // Objects marshalled by passing a Java class across the JNI boundary use jobject as the JNI type - // the nouse flag indicates this. We need the specific Java class name instead of the generic 'Ljava/lang/Object;' if (GetFlag(tp, "tmap:directorin:nouse")) jdesc = cdesc; String *jni_canon = canonicalizeJNIDescriptor(jdesc, tp); Append(jnidesc, jni_canon); Delete(jni_canon); Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = Getattr(p, "tmap:jtype"))) { String *din = Copy(Getattr(p, "tmap:javadirectorin")); addThrows(n, "tmap:javadirectorin", p); if (din) { Replaceall(din, "$module", module_class_name); Replaceall(din, "$imclassname", imclass_name); substituteClassname(pt, din); Replaceall(din, "$jniinput", ln); if (i > 0) Printf(imcall_args, ", "); Printf(callback_def, ", %s %s", tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else Printv(imcall_args, ln, NIL); jni_canon = canonicalizeJNIDescriptor(cdesc, p); Append(classdesc, jni_canon); Delete(jni_canon); } else { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No javadirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_JAVA_TYPEMAP_JTYPE_UNDEF, input_file, line_number, "No jtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); Delete(desc_tm); } else { if (!desc_tm) { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_param_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); } else if (!jdesc) { Swig_warning(WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC, input_file, line_number, "Missing JNI descriptor in directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(c_param_type, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = Getattr(p, "tmap:directorin:next"); } else if (!tm) { Swig_warning(WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); } else if (!cdesc) { Swig_warning(WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC, input_file, line_number, "Missing JNI descriptor in directorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = Getattr(p, "tmap:directorin:next"); } output_director = false; } } else { Swig_warning(WARN_JAVA_TYPEMAP_JNI_UNDEF, input_file, line_number, "No jni typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(arg); Delete(c_decl); Delete(ln); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class // Get any Java exception classes in the throws typemap ParmList *throw_parm_list = NULL; // May need to add Java throws clause to director methods if %catches defined // Get any Java exception classes in the throws typemap ParmList *catches_list = Getattr(n, "catchlist"); if (catches_list) { Swig_typemap_attach_parms("throws", catches_list, 0); Swig_typemap_attach_parms("directorthrows", catches_list, 0); for (p = catches_list; p; p = nextSibling(p)) { addThrows(n, "tmap:throws", p); } } if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) { Swig_typemap_attach_parms("throws", throw_parm_list, 0); Swig_typemap_attach_parms("directorthrows", throw_parm_list, 0); } for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { // %catches replaces the specified exception specification if (!catches_list) { addThrows(n, "tmap:throws", p); } if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("jself.%s(%s)", symname, imcall_args); // Handle exception classes specified in the "except" feature's "throws" attribute addThrows(n, "feature:except", n); if (!is_void) { if ((tm = Swig_typemap_lookup("javadirectorout", n, "", 0))) { addThrows(n, "tmap:javadirectorout", n); substituteClassname(returntype, tm); Replaceall(tm, "$javacall", upcall); Printf(callback_code, " return %s;\n", tm); } if ((tm = Swig_typemap_lookup("out", n, "", 0))) addThrows(n, "tmap:out", n); Delete(tm); } else Printf(callback_code, " %s;\n", upcall); Printf(callback_code, " }\n"); Delete(upcall); /* Finish off the inherited upcall's definition */ Putc(')', callback_def); generateThrowsClause(n, callback_def); Printf(callback_def, " {\n"); if (!ignored_method) { /* Emit the actual upcall through */ String *imclass_desc = NewStringf("(%s)%s", jnidesc, jniret_desc); String *class_desc = NewStringf("(%s)%s", classdesc, classret_desc); UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, imclass_desc, class_desc, decl); String *methid = Getattr(udata, "imclass_methodidx"); String *methop = getUpcallJNIMethod(jniret_desc); if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "jenv->%s(Swig::jclass_%s, Swig::director_method_ids[%s], %s);\n", methop, imclass_name, methid, jupcall_args); // Generate code to handle any Java exception thrown by director delegation directorExceptHandler(n, catches_list ? catches_list : throw_parm_list, w); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { addThrows(n, "tmap:directorout", n); Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { addThrows(n, "tmap:directorargout", p); Replaceall(tm, "$result", makeParameterName(n, p, i, false)); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(imclass_desc); Delete(class_desc); /* Terminate wrapper code */ Printf(w->code, "} else {\n"); Printf(w->code, "SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, \"null upcall object in %s::%s \");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); Printf(w->code, "}\n"); Printf(w->code, "if (swigjobj) jenv->DeleteLocalRef(swigjobj);\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!GetFlag(n, "feature:ignore")) Printv(imclass_directors, callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } Delete(inline_extra_method); Delete(qualified_return); Delete(jnidesc); Delete(c_ret_type); Delete(jniret_desc); Delete(declaration); Delete(callback_def); Delete(callback_code); DelWrapper(w); return status; } /* ------------------------------------------------------------ * directorExceptHandler() * * Emit code to map Java exceptions back to C++ exceptions when * feature("director:except") is applied to a method node. * This is generated after the Java method upcall. * ------------------------------------------------------------ */ void directorExceptHandler(Node *n, ParmList *throw_parm_list, Wrapper *w) { String *directorexcept = Getattr(n, "feature:director:except"); if (!directorexcept) { directorexcept = NewString(""); Printf(directorexcept, "jthrowable $error = jenv->ExceptionOccurred();\n"); Printf(directorexcept, "if ($error) {\n"); Printf(directorexcept, " jenv->ExceptionClear();$directorthrowshandlers\n"); Printf(directorexcept, " throw Swig::DirectorException(jenv, $error);\n"); Printf(directorexcept, "}\n"); } else { directorexcept = Copy(directorexcept); } // Can explicitly disable director:except by setting to "" or "0" if (Len(directorexcept) > 0 && Cmp(directorexcept, "0") != 0) { // Replace $packagepath substitutePackagePath(directorexcept, 0); // Replace $directorthrowshandlers with any defined typemap handlers (or nothing) if (Strstr(directorexcept, "$directorthrowshandlers")) { String *directorthrowshandlers_code = NewString(""); for (Parm *p = throw_parm_list; p; p = nextSibling(p)) { String *tm = Getattr(p, "tmap:directorthrows"); if (tm) { // replace $packagepath/$javaclassname String *directorthrows = canonicalizeJNIDescriptor(tm, p); Printv(directorthrowshandlers_code, directorthrows, NIL); Delete(directorthrows); } else { String *t = Getattr(p,"type"); Swig_warning(WARN_TYPEMAP_DIRECTORTHROWS_UNDEF, Getfile(n), Getline(n), "No directorthrows typemap defined for %s\n", SwigType_str(t, 0)); } } Replaceall(directorexcept, "$directorthrowshandlers", directorthrowshandlers_code); Delete(directorthrowshandlers_code); } Replaceall(directorexcept, "$error", "swigerror"); Printf(w->code, " %s\n", directorexcept); } Delete(directorexcept); } /* ------------------------------------------------------------ * directorPrefixArgs() * ------------------------------------------------------------ */ void directorPrefixArgs(Node *n) { Parm *p; /* Need to prepend 'jenv' to the director constructor's argument list */ String *jenv_type = NewString("JNIEnv"); SwigType_add_pointer(jenv_type); p = NewParm(jenv_type, NewString("jenv"), n); Setattr(p, "arg:byname", "1"); set_nextSibling(p, NULL); Setattr(n, "director:prefix_args", p); } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } /* insert jenv prefix argument */ parms = CopyParmList(superparms); String *jenv_type = NewString("JNIEnv"); SwigType_add_pointer(jenv_type); p = NewParm(jenv_type, NewString("jenv"), n); set_nextSibling(p, parms); parms = p; directorPrefixArgs(n); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); String *classtype = SwigType_namestr(Getattr(n, "name")); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, "}\n\n"); Delete(classtype); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(jenv_type); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); String *classtype = SwigType_namestr(Getattr(n, "name")); String *dirClassName = directorClassName(n); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s(JNIEnv *jenv) : %s {", dirClassName, dirClassName, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s(JNIEnv *jenv);\n", dirClassName); DelWrapper(w); Delete(classtype); Delete(classname); Delete(dirClassName); directorPrefixArgs(n); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { Delete(none_comparison); none_comparison = NewString(""); // not used Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); directorDeclaration(n); Printf(f_directors_h, "%s {\n", Getattr(n, "director:decl")); Printf(f_directors_h, "\npublic:\n"); Printf(f_directors_h, " void swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global);\n"); /* Keep track of the director methods for this class */ first_class_dmethod = curr_class_dmethod = n_dmethods; return Language::classDirectorInit(n); } /* ---------------------------------------------------------------------- * classDirectorDestructor() * ---------------------------------------------------------------------- */ int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *full_classname = Getattr(current_class, "name"); String *classname = Swig_class_name(current_class); String *dirClassName = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw ();\n", dirClassName); Printf(w->def, "%s::~%s() throw () {\n", dirClassName, dirClassName); } else { Printf(f_directors_h, " virtual ~%s();\n", dirClassName); Printf(w->def, "%s::~%s() {\n", dirClassName, dirClassName); } /* Ensure that correct directordisconnect typemap's method name is called * here: */ Node *disconn_attr = NewHash(); String *disconn_methodname = NULL; typemapLookup(n, "directordisconnect", full_classname, WARN_NONE, disconn_attr); disconn_methodname = Getattr(disconn_attr, "tmap:directordisconnect:methodname"); Printv(w->code, " swig_disconnect_director_self(\"", disconn_methodname, "\");\n", "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(disconn_attr); Delete(classname); Delete(dirClassName); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { String *full_classname = Getattr(n, "name"); String *classname = getProxyName(full_classname, true); String *director_classname = directorClassName(n); String *internal_classname; Wrapper *w = NewWrapper(); if (Len(package_path) > 0) internal_classname = NewStringf("%s/%s", package_path, classname); else internal_classname = NewStringf("%s", classname); // If the namespace is multiple levels, the result of getNSpace() will have inserted // .'s to delimit namespaces, so we need to replace those with /'s Replace(internal_classname, NSPACE_SEPARATOR, "/", DOH_REPLACE_ANY); Wrapper_add_localv(w, "baseclass", "static jclass baseclass", "= 0", NIL); Printf(w->def, "void %s::swig_connect_director(JNIEnv *jenv, jobject jself, jclass jcls, bool swig_mem_own, bool weak_global) {", director_classname); if (first_class_dmethod != curr_class_dmethod) { Printf(w->def, "static struct {\n"); Printf(w->def, "const char *mname;\n"); Printf(w->def, "const char *mdesc;\n"); Printf(w->def, "jmethodID base_methid;\n"); Printf(w->def, "} methods[] = {\n"); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); Printf(w->def, "{ \"%s\", \"%s\", NULL }", Getattr(udata, "method"), Getattr(udata, "fdesc")); if (i != curr_class_dmethod - 1) Putc(',', w->def); Putc('\n', w->def); } Printf(w->def, "};\n"); } Printf(w->code, "if (swig_set_self(jenv, jself, swig_mem_own, weak_global)) {\n"); Printf(w->code, "if (!baseclass) {\n"); Printf(w->code, "baseclass = jenv->FindClass(\"%s\");\n", internal_classname); Printf(w->code, "if (!baseclass) return;\n"); Printf(w->code, "baseclass = (jclass) jenv->NewGlobalRef(baseclass);\n"); Printf(w->code, "}\n"); int n_methods = curr_class_dmethod - first_class_dmethod; if (n_methods) { /* Emit the swig_overrides() method and the swig_override array */ Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_overrides(int n) {\n"); Printf(f_directors_h, " return (n < %d ? swig_override[n] : false);\n", n_methods); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "protected:\n"); Printf(f_directors_h, " Swig::BoolArray<%d> swig_override;\n", n_methods); /* Emit the code to look up the class's methods, initialize the override array */ Printf(w->code, "bool derived = (jenv->IsSameObject(baseclass, jcls) ? false : true);\n"); Printf(w->code, "for (int i = 0; i < %d; ++i) {\n", n_methods); Printf(w->code, " if (!methods[i].base_methid) {\n"); Printf(w->code, " methods[i].base_methid = jenv->GetMethodID(baseclass, methods[i].mname, methods[i].mdesc);\n"); Printf(w->code, " if (!methods[i].base_methid) return;\n"); Printf(w->code, " }\n"); // Generally, derived classes have a mix of overridden and // non-overridden methods and it is worth making a GetMethodID // check during initialization to determine if each method is // overridden, thus avoiding unnecessary calls into Java. // // On the other hand, when derived classes are // expected to override all director methods then the // GetMethodID calls are inefficient, and it is better to let // the director unconditionally call up into Java. The resulting code // will still behave correctly (though less efficiently) when Java // code doesn't override a given method. // // The assumeoverride feature on a director controls whether or not // overrides are assumed. if (GetFlag(n, "feature:director:assumeoverride")) { Printf(w->code, " swig_override[i] = derived;\n"); } else { Printf(w->code, " swig_override[i] = false;\n"); Printf(w->code, " if (derived) {\n"); Printf(w->code, " jmethodID methid = jenv->GetMethodID(jcls, methods[i].mname, methods[i].mdesc);\n"); Printf(w->code, " swig_override[i] = (methid != methods[i].base_methid);\n"); Printf(w->code, " jenv->ExceptionClear();\n"); Printf(w->code, " }\n"); } Printf(w->code, "}\n"); } else { Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_overrides(int n) {\n"); Printf(f_directors_h, " return false;\n"); Printf(f_directors_h, " }\n"); } Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n"); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); Delete(internal_classname); return Language::classDirectorEnd(n); } /* -------------------------------------------------------------------- * classDirectorDisown() * ------------------------------------------------------------------*/ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * directorDeclaration() * * Generate the director class's declaration * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" *--------------------------------------------------------------------*/ void directorDeclaration(Node *n) { String *base = Getattr(n, "classtype"); String *class_ctor = NewString("Swig::Director(jenv)"); String *directorname = directorClassName(n); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director", base); // Stash stuff for later. Setattr(n, "director:decl", declaration); Setattr(n, "director:ctor", class_ctor); } /*---------------------------------------------------------------------- * nestedClassesSupport() *--------------------------------------------------------------------*/ NestedClassSupport nestedClassesSupport() const { return NCS_Full; } }; /* class JAVA */ /* ----------------------------------------------------------------------------- * swig_java() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_java() { return new JAVA(); } extern "C" Language *swig_java(void) { return new_swig_java(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *JAVA::usage = "\ Java Options (available with -java)\n\ -nopgcpp - Suppress premature garbage collection prevention parameter\n\ -noproxy - Generate the low-level functional interface instead\n\ of proxy classes\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -package - Set name of the Java package to \n\ \n"; swig-3.0.12/Source/Modules/s-exp.cxx0000664000175000017500000002404313042756442017070 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * s-exp.cxx * * A parse tree represented as Lisp s-expressions. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "dohint.h" static const char *usage = "\ S-Exp Options (available with -sexp)\n\ -typemaplang - Typemap language\n\n"; //static Node *view_top = 0; static File *out = 0; class Sexp:public Language { int indent_level; DOHHash *print_circle_hash; int print_circle_count; int hanging_parens; bool need_whitespace; bool need_newline; public: Sexp(): indent_level(0), print_circle_hash(0), print_circle_count(0), hanging_parens(0), need_whitespace(0), need_newline(0) { } virtual ~ Sexp() { } virtual void main(int argc, char *argv[]) { // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGSEXP 1", 0); SWIG_typemap_lang("sexp"); for (int iX = 0; iX < argc; iX++) { if (strcmp(argv[iX], "-typemaplang") == 0) { Swig_mark_arg(iX); iX++; SWIG_typemap_lang(argv[iX]); Swig_mark_arg(iX); continue; } if (strcmp(argv[iX], "-help") == 0) { fputs(usage, stdout); } } } /* Top of the parse tree */ virtual int top(Node *n) { if (out == 0) { String *outfile = Getattr(n, "outfile"); Replaceall(outfile, "_wrap.cxx", ".lisp"); Replaceall(outfile, "_wrap.c", ".lisp"); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } } String *f_sink = NewString(""); Swig_register_filebyname("header", f_sink); Swig_register_filebyname("wrapper", f_sink); Swig_register_filebyname("begin", f_sink); Swig_register_filebyname("runtime", f_sink); Swig_register_filebyname("init", f_sink); Swig_banner_target_lang(out, ";;;"); Language::top(n); Printf(out, "\n"); Printf(out, ";;; Lisp parse tree produced by SWIG\n"); print_circle_hash = NewHash(); print_circle_count = 0; hanging_parens = 0; need_whitespace = 0; need_newline = 0; Sexp_print_node(n); flush_parens(); return SWIG_OK; } void print_indent() { int i; for (i = 0; i < indent_level; i++) { Printf(out, " "); } } void open_paren(const String *oper) { flush_parens(); Printf(out, "("); if (oper) Printf(out, "%s ", oper); indent_level += 2; } void close_paren(bool neednewline = false) { hanging_parens++; if (neednewline) print_lazy_whitespace(); indent_level -= 2; } void flush_parens() { int i; if (hanging_parens) { for (i = 0; i < hanging_parens; i++) Printf(out, ")"); hanging_parens = 0; need_newline = true; need_whitespace = true; } if (need_newline) { Printf(out, "\n"); print_indent(); need_newline = false; need_whitespace = false; } else if (need_whitespace) { Printf(out, " "); need_whitespace = false; } } void print_lazy_whitespace() { need_whitespace = 1; } void print_lazy_newline() { need_newline = 1; } bool internal_key_p(DOH *key) { return ((Cmp(key, "nodeType") == 0) || (Cmp(key, "firstChild") == 0) || (Cmp(key, "lastChild") == 0) || (Cmp(key, "parentNode") == 0) || (Cmp(key, "nextSibling") == 0) || (Cmp(key, "previousSibling") == 0) || (Cmp(key, "csym:nextSibling") == 0) || (Cmp(key, "csym:previousSibling") == 0) || (Cmp(key, "typepass:visit") == 0) || (Cmp(key, "allocate:visit") == 0) || (*(Char(key)) == '$')); } bool boolean_key_p(DOH *key) { return ((Cmp(key, "allocate:default_constructor") == 0) || (Cmp(key, "allocate:default_destructor") == 0) || (Cmp(key, "allows_typedef") == 0) || (Cmp(key, "feature:immutable") == 0)); } bool list_key_p(DOH *key) { return ((Cmp(key, "parms") == 0) || (Cmp(key, "baselist") == 0)); } bool plist_key_p(DOH *key) // true if KEY is the name of data that is a mapping from keys to // values, which should be printed as a plist. { return ((Cmp(key, "typescope") == 0)); } bool maybe_plist_key_p(DOH *key) { return (Strncmp(key, "tmap:", 5) == 0); } bool print_circle(DOH *obj, bool list_p) // We have a complex object, which might be referenced several // times, or even recursively. Use Lisp's reader notation for // circular structures (#n#, #n=). // // An object can be printed in list-mode or object-mode; LIST_P toggles. // return TRUE if OBJ still needs to be printed { flush_parens(); // Following is a silly hack. It works around the limitation of // DOH's hash tables that only work with string keys! char address[32]; sprintf(address, "%p%c", obj, list_p ? 'L' : 'O'); DOH *placeholder = Getattr(print_circle_hash, address); if (placeholder) { Printv(out, placeholder, NIL); return false; } else { String *placeholder = NewStringf("#%d#", ++print_circle_count); Setattr(print_circle_hash, address, placeholder); Printf(out, "#%d=", print_circle_count); return true; } } void Sexp_print_value_of_key(DOH *value, DOH *key) { if ((Cmp(key, "parms") == 0) || (Cmp(key, "wrap:parms") == 0) || (Cmp(key, "kwargs") == 0) || (Cmp(key, "pattern") == 0)) Sexp_print_parms(value); else if (plist_key_p(key)) Sexp_print_plist(value); else if (maybe_plist_key_p(key)) { if (DohIsMapping(value)) Sexp_print_plist(value); else Sexp_print_doh(value); } else if (list_key_p(key)) Sexp_print_list(value); else if (boolean_key_p(key)) Sexp_print_boolean(value); else Sexp_print_doh(value); } void Sexp_print_boolean(DOH *obj) { flush_parens(); /* See DOH/Doh/base.c, DohGetInt() */ if (DohIsString(obj)) { if (atoi(Char(obj)) != 0) Printf(out, "t"); else Printf(out, "nil"); } else Printf(out, "nil"); } void Sexp_print_list(DOH *obj) { if (print_circle(obj, true)) { open_paren(NIL); for (; obj; obj = nextSibling(obj)) { Sexp_print_doh(obj); print_lazy_whitespace(); } close_paren(true); } } void Sexp_print_parms(DOH *obj) { // print it as a list of plists if (print_circle(obj, true)) { open_paren(NIL); for (; obj; obj = nextSibling(obj)) { if (DohIsMapping(obj)) { Iterator k; open_paren(NIL); for (k = First(obj); k.key; k = Next(k)) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); Sexp_print_as_keyword(k.key); Sexp_print_value_of_key(value, k.key); print_lazy_whitespace(); } } close_paren(true); } else Sexp_print_doh(obj); print_lazy_whitespace(); } close_paren(true); } } void Sexp_print_doh(DOH *obj) { flush_parens(); if (DohIsString(obj)) { String *o = Str(obj); Replaceall(o, "\\", "\\\\"); Replaceall(o, "\"", "\\\""); Printf(out, "\"%s\"", o); Delete(o); } else { if (print_circle(obj, false)) { // Dispatch type if (nodeType(obj)) { Sexp_print_node(obj); } else if (DohIsMapping(obj)) { Iterator k; open_paren(NIL); for (k = First(obj); k.key; k = Next(k)) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); flush_parens(); open_paren(NIL); Sexp_print_doh(k.key); Printf(out, " . "); Sexp_print_value_of_key(value, k.key); close_paren(); } } close_paren(); } else if (strcmp(ObjType(obj)->objname, "List") == 0) { int i; open_paren(NIL); for (i = 0; i < Len(obj); i++) { DOH *item = Getitem(obj, i); Sexp_print_doh(item); } close_paren(); } else { // What is it? Printf(out, "#", ObjType(obj)->objname, obj); } } } } void Sexp_print_as_keyword(const DOH *k) { /* Print key, replacing ":" with "-" because : is CL's package prefix */ flush_parens(); String *key = NewString(k); Replaceall(key, ":", "-"); Replaceall(key, "_", "-"); Printf(out, ":%s ", key); Delete(key); } void Sexp_print_plist_noparens(DOH *obj) { /* attributes map names to objects */ Iterator k; bool first; for (k = First(obj), first = true; k.key; k = Next(k), first = false) { if (!internal_key_p(k.key)) { DOH *value = Getattr(obj, k.key); flush_parens(); if (!first) { Printf(out, " "); } Sexp_print_as_keyword(k.key); /* Print value */ Sexp_print_value_of_key(value, k.key); } } } void Sexp_print_plist(DOH *obj) { flush_parens(); if (print_circle(obj, true)) { open_paren(NIL); Sexp_print_plist_noparens(obj); close_paren(); } } void Sexp_print_attributes(Node *obj) { Sexp_print_plist_noparens(obj); } void Sexp_print_node(Node *obj) { Node *cobj; open_paren(nodeType(obj)); /* A node has an attribute list... */ Sexp_print_attributes(obj); /* ... and child nodes. */ cobj = firstChild(obj); if (cobj) { print_lazy_newline(); flush_parens(); Sexp_print_as_keyword("children"); open_paren(NIL); for (; cobj; cobj = nextSibling(cobj)) { Sexp_print_node(cobj); } close_paren(); } close_paren(); } virtual int functionWrapper(Node *n) { ParmList *l = Getattr(n, "parms"); Wrapper *f = NewWrapper(); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); DelWrapper(f); return SWIG_OK; } }; static Language *new_swig_sexp() { return new Sexp(); } extern "C" Language *swig_sexp(void) { return new_swig_sexp(); } swig-3.0.12/Source/Modules/uffi.cxx0000664000175000017500000002476013042756442016773 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * uffi.cxx * * Uffi language module for SWIG. * ----------------------------------------------------------------------------- */ // TODO: remove remnants of lisptype #include "swigmod.h" static const char *usage = "\ UFFI Options (available with -uffi)\n\ -identifier-converter - \n\ Specifies the type of conversion to do on C identifiers\n\ to convert them to symbols. There are two built-in\n\ converters: 'null' and 'lispify'. The default is\n\ 'null'. If you supply a name other than one of the\n\ built-ins, then a function by that name will be\n\ called to convert identifiers to symbols.\n\ "; class UFFI:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classHandler(Node *n); virtual int membervariableHandler(Node *n); }; static File *f_cl = 0; static struct { int count; String **entries; } defined_foreign_types; static String *identifier_converter = NewString("identifier-convert-null"); static int any_varargs(ParmList *pl) { Parm *p; for (p = pl; p; p = nextSibling(p)) { if (SwigType_isvarargs(Getattr(p, "type"))) return 1; } return 0; } /* utilities */ /* returns new string w/ parens stripped */ static String *strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } static String *convert_literal(String *num_param, String *type) { String *num = strip_parens(num_param), *res; char *s = Char(num); /* Make sure doubles use 'd' instead of 'e' */ if (!Strcmp(type, "double")) { String *updated = Copy(num); if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", num); SWIG_exit(EXIT_FAILURE); } Delete(num); return updated; } if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ return NewStringf("\"%s\"", num_param); } if (Len(num) < 2 || s[0] != '0') { return num; } /* octal or hex */ res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); Delete(num); return res; } static void add_defined_foreign_type(String *type) { if (!defined_foreign_types.count) { /* Make fresh */ defined_foreign_types.count = 1; defined_foreign_types.entries = (String **) malloc(sizeof(String *)); } else { /* make room */ defined_foreign_types.count++; defined_foreign_types.entries = (String **) realloc(defined_foreign_types.entries, defined_foreign_types.count * sizeof(String *)); } if (!defined_foreign_types.entries) { Printf(stderr, "Out of memory\n"); SWIG_exit(EXIT_FAILURE); } /* Fill in the new data */ defined_foreign_types.entries[defined_foreign_types.count - 1] = Copy(type); } static String *get_ffi_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("ffitype", node, "", 0); Delete(node); if (tm) { return NewString(tm); } else { SwigType *tr = SwigType_typedef_resolve_all(ty); char *type_reduced = Char(tr); int i; //Printf(stdout,"convert_type %s\n", ty); if (SwigType_isconst(tr)) { SwigType_pop(tr); type_reduced = Char(tr); } if (SwigType_ispointer(type_reduced) || SwigType_isarray(ty) || !strncmp(type_reduced, "p.f", 3)) { return NewString(":pointer-void"); } for (i = 0; i < defined_foreign_types.count; i++) { if (!Strcmp(ty, defined_foreign_types.entries[i])) { return NewStringf("#.(%s \"%s\" :type :type)", identifier_converter, ty); } } if (!Strncmp(type_reduced, "enum ", 5)) { return NewString(":int"); } Printf(stderr, "Unsupported data type: %s (was: %s)\n", type_reduced, ty); SWIG_exit(EXIT_FAILURE); } return 0; } static String *get_lisp_type(Node *n, SwigType *ty, const_String_or_char_ptr name) { Node *node = NewHash(); Setattr(node, "type", ty); Setattr(node, "name", name); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("lisptype", node, "", 0); Delete(node); return tm ? NewString(tm) : NewString(""); } void UFFI::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGUFFI 1", 0); SWIG_library_directory("uffi"); SWIG_config_file("uffi.swg"); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-identifier-converter")) { char *conv = argv[i + 1]; if (!conv) Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; /* check for built-ins */ if (!strcmp(conv, "lispify")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-lispify"); } else if (!strcmp(conv, "null")) { Delete(identifier_converter); identifier_converter = NewString("identifier-convert-null"); } else { /* Must be user defined */ Delete(identifier_converter); identifier_converter = NewString(conv); } } if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } } } int UFFI::top(Node *n) { String *module = Getattr(n, "name"); String *output_filename = NewString(""); File *f_null = NewString(""); Printf(output_filename, "%s%s.cl", SWIG_output_directory(), module); f_cl = NewFile(output_filename, "w", SWIG_output_files()); if (!f_cl) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Swig_register_filebyname("header", f_null); Swig_register_filebyname("begin", f_null); Swig_register_filebyname("runtime", f_null); Swig_register_filebyname("wrapper", f_cl); Swig_banner_target_lang(f_cl, ";;"); Printf(f_cl, "\n" ";; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; package: %s -*-\n\n(defpackage :%s\n (:use :common-lisp :uffi))\n\n(in-package :%s)\n", module, module, module); Printf(f_cl, "(eval-when (compile load eval)\n (defparameter *swig-identifier-converter* '%s))\n", identifier_converter); Language::top(n); Delete(f_cl); // Delete the handle, not the file Delete(f_null); return SWIG_OK; } int UFFI::functionWrapper(Node *n) { String *funcname = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); Parm *p; int argnum = 0, first = 1; // int varargs = 0; //Language::functionWrapper(n); Printf(f_cl, "(swig-defun \"%s\"\n", funcname); Printf(f_cl, " ("); /* Special cases */ if (ParmList_len(pl) == 0) { Printf(f_cl, ":void"); } else if (any_varargs(pl)) { Printf(f_cl, "#| varargs |#"); // varargs = 1; } else { for (p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); SwigType *argtype = Getattr(p, "type"); String *ffitype = get_ffi_type(n, argtype, argname); String *lisptype = get_lisp_type(n, argtype, argname); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(f_cl, "\n "); } Printf(f_cl, "(%s %s %s)", argname, ffitype, lisptype); first = 0; Delete(ffitype); Delete(lisptype); if (tempargname) Delete(argname); } } Printf(f_cl, ")\n"); /* finish arg list */ Printf(f_cl, " :returning %s\n" //" :strings-convert t\n" //" :call-direct %s\n" //" :optimize-for-space t" ")\n", get_ffi_type(n, Getattr(n, "type"), Swig_cresult_name()) //,varargs ? "nil" : "t" ); return SWIG_OK; } int UFFI::constantWrapper(Node *n) { String *type = Getattr(n, "type"); String *converted_value = convert_literal(Getattr(n, "value"), type); String *name = Getattr(n, "sym:name"); #if 0 Printf(stdout, "constant %s is of type %s. value: %s\n", name, type, converted_value); #endif Printf(f_cl, "(swig-defconstant \"%s\" %s)\n", name, converted_value); Delete(converted_value); return SWIG_OK; } // Includes structs int UFFI::classHandler(Node *n) { String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); Node *c; if (Strcmp(kind, "struct")) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } Printf(f_cl, "(swig-def-struct \"%s\"\n \n", name); for (c = firstChild(n); c; c = nextSibling(c)) { SwigType *type = Getattr(c, "type"); SwigType *decl = Getattr(c, "decl"); type = Copy(type); SwigType_push(type, decl); String *lisp_type; if (Strcmp(nodeType(c), "cdecl")) { Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); SWIG_exit(EXIT_FAILURE); } /* Printf(stdout, "Converting %s in %s\n", type, name); */ lisp_type = get_ffi_type(n, type, Getattr(c, "sym:name")); Printf(f_cl, " (#.(%s \"%s\" :type :slot) %s)\n", identifier_converter, Getattr(c, "sym:name"), lisp_type); Delete(lisp_type); } // Language::classHandler(n); Printf(f_cl, " )\n"); /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); add_defined_foreign_type(name); return SWIG_OK; } int UFFI::membervariableHandler(Node *n) { Language::membervariableHandler(n); return SWIG_OK; } extern "C" Language *swig_uffi(void) { return new UFFI(); } swig-3.0.12/Source/Modules/swigmain.cxx0000664000175000017500000001343613042756442017656 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigmain.cxx * * Simplified Wrapper and Interface Generator (SWIG) * * This file is the main entry point to SWIG. It collects the command * line options, registers built-in language modules, and instantiates * a module for code generation. If adding new language modules * to SWIG, you would modify this file. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include /* Module factories. These functions are used to instantiate the built-in language modules. If adding a new language module to SWIG, place a similar function here. Make sure the function has "C" linkage. This is required so that modules can be dynamically loaded in future versions. */ extern "C" { Language *swig_tcl(void); Language *swig_python(void); Language *swig_perl5(void); Language *swig_ruby(void); Language *swig_guile(void); Language *swig_modula3(void); Language *swig_mzscheme(void); Language *swig_java(void); Language *swig_php(void); Language *swig_php4(void); Language *swig_php5(void); Language *swig_ocaml(void); Language *swig_octave(void); Language *swig_pike(void); Language *swig_sexp(void); Language *swig_xml(void); Language *swig_chicken(void); Language *swig_csharp(void); Language *swig_allegrocl(void); Language *swig_lua(void); Language *swig_clisp(void); Language *swig_cffi(void); Language *swig_uffi(void); Language *swig_r(void); Language *swig_scilab(void); Language *swig_go(void); Language *swig_d(void); Language *swig_javascript(void); } struct swig_module { const char *name; ModuleFactory fac; const char *help; }; /* Association of command line options to language modules. Place an entry for new language modules here, keeping the list sorted alphabetically. */ static swig_module modules[] = { {"-allegrocl", swig_allegrocl, "ALLEGROCL"}, {"-chicken", swig_chicken, "CHICKEN"}, {"-clisp", swig_clisp, "CLISP"}, {"-cffi", swig_cffi, "CFFI"}, {"-csharp", swig_csharp, "C#"}, {"-d", swig_d, "D"}, {"-go", swig_go, "Go"}, {"-guile", swig_guile, "Guile"}, {"-java", swig_java, "Java"}, {"-javascript", swig_javascript, "Javascript"}, {"-lua", swig_lua, "Lua"}, {"-modula3", swig_modula3, "Modula 3"}, {"-mzscheme", swig_mzscheme, "Mzscheme"}, {"-ocaml", swig_ocaml, "Ocaml"}, {"-octave", swig_octave, "Octave"}, {"-perl", swig_perl5, "Perl"}, {"-perl5", swig_perl5, 0}, {"-php", swig_php5, 0}, {"-php4", swig_php4, 0}, {"-php5", swig_php5, "PHP5"}, {"-php7", swig_php, "PHP7"}, {"-pike", swig_pike, "Pike"}, {"-python", swig_python, "Python"}, {"-r", swig_r, "R (aka GNU S)"}, {"-ruby", swig_ruby, "Ruby"}, {"-scilab", swig_scilab, "Scilab"}, {"-sexp", swig_sexp, "Lisp S-Expressions"}, {"-tcl", swig_tcl, "Tcl"}, {"-tcl8", swig_tcl, 0}, {"-uffi", swig_uffi, "Common Lisp / UFFI"}, {"-xml", swig_xml, "XML"}, {NULL, NULL, NULL} }; #ifdef MACSWIG #include #include #endif #ifndef SWIG_LANG #define SWIG_LANG "-python" #endif //----------------------------------------------------------------- // main() // // Main program. Initializes the files and starts the parser. //----------------------------------------------------------------- void SWIG_merge_envopt(const char *env, int oargc, char *oargv[], int *nargc, char ***nargv) { if (!env) { *nargc = oargc; *nargv = oargv; return; } int argc = 1; int arge = oargc + 1024; char **argv = (char **) malloc(sizeof(char *) * (arge)); char *buffer = (char *) malloc(2048); char *b = buffer; char *be = b + 1023; const char *c = env; while ((b != be) && *c && (argc < arge)) { while (isspace(*c) && *c) ++c; if (*c) { argv[argc] = b; ++argc; } while ((b != be) && *c && !isspace(*c)) { *(b++) = *(c++); } *b++ = 0; } argv[0] = oargv[0]; for (int i = 1; (i < oargc) && (argc < arge); ++i, ++argc) { argv[argc] = oargv[i]; } *nargc = argc; *nargv = argv; } int main(int margc, char **margv) { int i; Language *dl = 0; ModuleFactory fac = 0; int argc; char **argv; SWIG_merge_envopt(getenv("SWIG_FEATURES"), margc, margv, &argc, &argv); #ifdef MACSWIG SIOUXSettings.asktosaveonclose = false; argc = ccommand(&argv); #endif /* Register built-in modules */ for (i = 0; modules[i].name; i++) { Swig_register_module(modules[i].name, modules[i].fac); } Swig_init_args(argc, argv); /* Get options */ for (i = 1; i < argc; i++) { if (argv[i]) { fac = Swig_find_module(argv[i]); if (fac) { dl = (fac) (); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nolang") == 0) { dl = new Language; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-help") == 0) || (strcmp(argv[i], "--help") == 0)) { if (strcmp(argv[i], "--help") == 0) strcpy(argv[i], "-help"); Printf(stdout, "Target Language Options\n"); for (int j = 0; modules[j].name; j++) { if (modules[j].help) { Printf(stdout, " %-15s - Generate %s wrappers\n", modules[j].name, modules[j].help); } } // Swig_mark_arg not called as the general -help options also need to be displayed later on } } } if (!dl) { fac = Swig_find_module(SWIG_LANG); if (fac) { dl = (fac) (); } } int res = SWIG_main(argc, argv, dl); return res; } swig-3.0.12/Source/Modules/interface.cxx0000664000175000017500000001604613042756442020000 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * interface.cxx * * This module contains support for the interface feature. * This feature is used in language modules where the target language does not * naturally support C++ style multiple inheritance, but does support inheritance * from multiple interfaces. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static bool interface_feature_enabled = false; /* ----------------------------------------------------------------------------- * collect_interface_methods() * * Create a list of all the methods from the base classes of class n that are * marked as an interface. The resulting list is thus the list of methods that * need to be implemented in order for n to be non-abstract. * ----------------------------------------------------------------------------- */ static List *collect_interface_methods(Node *n) { List *methods = NewList(); if (Hash *bases = Getattr(n, "interface:bases")) { List *keys = Keys(bases); for (Iterator base = First(keys); base.item; base = Next(base)) { Node *cls = Getattr(bases, base.item); if (cls == n) continue; for (Node *child = firstChild(cls); child; child = nextSibling(child)) { if (Cmp(nodeType(child), "cdecl") == 0) { if (GetFlag(child, "feature:ignore") || Getattr(child, "interface:owner")) continue; // skip methods propagated to bases Node *m = Copy(child); set_nextSibling(m, NIL); set_previousSibling(m, NIL); Setattr(m, "interface:owner", cls); Append(methods, m); } } } Delete(keys); } return methods; } /* ----------------------------------------------------------------------------- * collect_interface_bases * ----------------------------------------------------------------------------- */ static void collect_interface_bases(Hash *bases, Node *n) { if (Getattr(n, "feature:interface")) { String *name = Getattr(n, "interface:name"); if (!Getattr(bases, name)) Setattr(bases, name, n); } if (List *baselist = Getattr(n, "bases")) { for (Iterator base = First(baselist); base.item; base = Next(base)) { if (!GetFlag(base.item, "feature:ignore")) { if (Getattr(base.item, "feature:interface")) collect_interface_bases(bases, base.item); } } } } /* ----------------------------------------------------------------------------- * collect_interface_base_classes() * * Create a hash containing all the classes up the inheritance hierarchy * marked with feature:interface (including this class n). * Stops going up the inheritance chain as soon as a class is found without * feature:interface. * The idea is to find all the base interfaces that a class must implement. * ----------------------------------------------------------------------------- */ static void collect_interface_base_classes(Node *n) { if (Getattr(n, "feature:interface")) { // check all bases are also interfaces if (List *baselist = Getattr(n, "bases")) { for (Iterator base = First(baselist); base.item; base = Next(base)) { if (!GetFlag(base.item, "feature:ignore")) { if (!Getattr(base.item, "feature:interface")) { Swig_error(Getfile(n), Getline(n), "Base class '%s' of '%s' is not similarly marked as an interface.\n", SwigType_namestr(Getattr(base.item, "name")), SwigType_namestr(Getattr(n, "name"))); SWIG_exit(EXIT_FAILURE); } } } } } Hash *interface_bases = NewHash(); collect_interface_bases(interface_bases, n); if (Len(interface_bases) == 0) Delete(interface_bases); else Setattr(n, "interface:bases", interface_bases); } /* ----------------------------------------------------------------------------- * process_interface_name() * ----------------------------------------------------------------------------- */ static void process_interface_name(Node *n) { if (Getattr(n, "feature:interface")) { String *interface_name = Getattr(n, "feature:interface:name"); if (!Len(interface_name)) { Swig_error(Getfile(n), Getline(n), "The interface feature for '%s' is missing the name attribute.\n", SwigType_namestr(Getattr(n, "name"))); SWIG_exit(EXIT_FAILURE); } if (Strchr(interface_name, '%')) { String *name = NewStringf(interface_name, Getattr(n, "sym:name")); Setattr(n, "interface:name", name); } else { Setattr(n, "interface:name", interface_name); } } } /* ----------------------------------------------------------------------------- * Swig_interface_propagate_methods() * * Find all the base classes marked as an interface (with feature:interface) for * class node n. For each of these, add all of its methods as methods of n so that * n is not abstract. If class n is also marked as an interface, it will remain * abstract and not have any methods added. * ----------------------------------------------------------------------------- */ void Swig_interface_propagate_methods(Node *n) { if (interface_feature_enabled) { process_interface_name(n); collect_interface_base_classes(n); List *methods = collect_interface_methods(n); bool is_interface = Getattr(n, "feature:interface") != 0; for (Iterator mi = First(methods); mi.item; mi = Next(mi)) { if (!is_interface && GetFlag(mi.item, "abstract")) continue; String *this_decl = Getattr(mi.item, "decl"); String *this_decl_resolved = SwigType_typedef_resolve_all(this_decl); bool identically_overloaded_method = false; // true when a base class' method is implemented in n if (SwigType_isfunction(this_decl_resolved)) { String *name = Getattr(mi.item, "name"); for (Node *child = firstChild(n); child; child = nextSibling(child)) { if (Getattr(child, "interface:owner")) break; // at the end of the list are newly appended methods if (checkAttribute(child, "name", name)) { String *decl = SwigType_typedef_resolve_all(Getattr(child, "decl")); identically_overloaded_method = Strcmp(decl, this_decl_resolved) == 0; Delete(decl); if (identically_overloaded_method) break; } } } Delete(this_decl_resolved); if (!identically_overloaded_method) { // TODO: Fix if the method is overloaded with different arguments / has default args appendChild(n, mi.item); } else { Delete(mi.item); } } Delete(methods); } } /* ----------------------------------------------------------------------------- * Swig_interface_feature_enable() * * Turn on interface feature support * ----------------------------------------------------------------------------- */ void Swig_interface_feature_enable() { interface_feature_enabled = true; } swig-3.0.12/Source/Modules/mzscheme.cxx0000664000175000017500000006347113042756442017657 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * mzscheme.cxx * * Mzscheme language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ Mzscheme Options (available with -mzscheme)\n\ -declaremodule - Create extension that declares a module\n\ -dynamic-load ,[library,...] - Do not link with these libraries, dynamic load\n\ them\n\ -noinit - Do not emit scheme_initialize, scheme_reload,\n\ scheme_module_name functions\n\ -prefix - Set a prefix to be prepended to all names\n\ "; static String *fieldnames_tab = 0; static String *convert_tab = 0; static String *convert_proto_tab = 0; static String *struct_name = 0; static String *mangled_struct_name = 0; static String *prefix = 0; static bool declaremodule = false; static bool noinit = false; static String *load_libraries = NULL; static String *module = 0; static const char *mzscheme_path = "mzscheme"; static String *init_func_def = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; // Used for garbage collection static int exporting_destructor = 0; static String *swigtype_ptr = 0; static String *cls_swigtype = 0; class MZSCHEME:public Language { public: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; SWIG_library_directory(mzscheme_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-declaremodule") == 0) { declaremodule = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noinit") == 0) { noinit = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dynamic-load") == 0) { if (argv[i + 1]) { Delete(load_libraries); load_libraries = NewString(argv[i + 1]); Swig_mark_arg(i++); Swig_mark_arg(i); } else { Swig_arg_error(); } } } } // If a prefix has been specified make sure it ends in a '_' (not actually used!) if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } else prefix = NewString("swig_"); // Add a symbol for this module Preprocessor_define("SWIGMZSCHEME 1", 0); // Set name of typemaps SWIG_typemap_lang("mzscheme"); // Read in default typemaps */ SWIG_config_file("mzscheme.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); init_func_def = NewString(""); Swig_register_filebyname("init", init_func_def); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGMZSCHEME\n#define SWIGMZSCHEME\n#endif\n\n"); module = Getattr(n, "name"); Language::top(n); SwigType_emit_type_table(f_runtime, f_wrappers); if (!noinit) { if (declaremodule) { Printf(f_init, "#define SWIG_MZSCHEME_CREATE_MENV(env) scheme_primitive_module(scheme_intern_symbol(\"%s\"), env)\n", module); } else { Printf(f_init, "#define SWIG_MZSCHEME_CREATE_MENV(env) (env)\n"); } Printf(f_init, "%s\n", Char(init_func_def)); if (declaremodule) { Printf(f_init, "\tscheme_finish_primitive_module(menv);\n"); } Printf(f_init, "\treturn scheme_void;\n}\n"); Printf(f_init, "Scheme_Object *scheme_initialize(Scheme_Env *env) {\n"); if (load_libraries) { Printf(f_init, "mz_set_dlopen_libraries(\"%s\");\n", load_libraries); } Printf(f_init, "\treturn scheme_reload(env);\n"); Printf(f_init, "}\n"); Printf(f_init, "Scheme_Object *scheme_module_name(void) {\n"); if (declaremodule) { Printf(f_init, " return scheme_intern_symbol((char*)\"%s\");\n", module); } else { Printf(f_init, " return scheme_make_symbol((char*)\"%s\");\n", module); } Printf(f_init, "}\n"); } /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ void throw_unhandled_mzscheme_type_error(SwigType *d) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s.\n", SwigType_str(d, 0)); } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } virtual int functionWrapper(Node *n) { char *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; Wrapper *f = NewWrapper(); String *proc_name = NewString(""); String *source = NewString(""); String *target = NewString(""); String *arg = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *build = NewString(""); String *tm; int i = 0; int numargs; int numreq; String *overname = 0; if (load_libraries) { ParmList *parms = Getattr(n, "parms"); SwigType *type = Getattr(n, "type"); String *name = NewString("caller"); Setattr(n, "wrap:action", Swig_cresult(type, Swig_cresult_name(), Swig_cfunction_call(name, parms))); } // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Build the name for Scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); // writing the function wrapper function Printv(f->def, "static Scheme_Object *", wname, " (", NIL); Printv(f->def, "int argc, Scheme_Object **argv", NIL); Printv(f->def, ")\n{", NIL); /* Define the scheme name in C. This define is used by several macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); numargs = emit_num_arguments(l); numreq = emit_num_required(l); /* Add the holder for the pointer to the function to be opened */ if (load_libraries) { Wrapper_add_local(f, "_function_loaded", "static int _function_loaded=(1==0)"); Wrapper_add_local(f, "_the_function", "static void *_the_function=NULL"); { String *parms = ParmList_protostr(l); String *func = NewStringf("(*caller)(%s)", parms); Wrapper_add_local(f, "caller", SwigType_lstr(d, func)); /*"(*caller)()")); */ } } // adds local variables Wrapper_add_local(f, "lenv", "int lenv = 1"); Wrapper_add_local(f, "values", "Scheme_Object *values[MAXVALUES]"); if (load_libraries) { Printf(f->code, "if (!_function_loaded) { _the_function=mz_load_function(\"%s\");_function_loaded=(1==1); }\n", iname); Printf(f->code, "if (!_the_function) { scheme_signal_error(\"Cannot load C function '%s'\"); }\n", iname); Printf(f->code, "caller=_the_function;\n"); } // Now write code to extract the parameters (this is super ugly) for (i = 0, p = l; i < numargs; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); // Produce names of source and target Clear(source); Clear(target); Clear(arg); Printf(source, "argv[%d]", i); Printf(target, "%s", ln); Printv(arg, Getattr(p, "name"), NIL); if (i >= numreq) { Printf(f->code, "if (argc > %d) {\n", i); } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:in:next"); } else { // no typemap found // check if typedef and resolve throw_unhandled_mzscheme_type_error(pt); p = nextSibling(p); } if (i >= numreq) { Printf(f->code, "}\n"); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Pass output arguments back to the caller. for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Free up any memory allocated for the arguments. /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } // Now write code to make the function call String *actioncode = emit_action(n); // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "values[0]"); Replaceall(tm, "$result", "values[0]"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_mzscheme_type_error(d); } emit_return_variable(n, d, f); // Dump the argument output code Printv(f->code, Char(outarg), NIL); // Dump the argument cleanup code Printv(f->code, Char(cleanup), NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) Printv(f->code, tab4, "return SWIG_MzScheme_PackageValues(lenv, values);\n", NIL); Printf(f->code, "#undef FUNC_NAME\n"); Printv(f->code, "}\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { // Now register the function char temp[256]; sprintf(temp, "%d", numargs); if (exporting_destructor) { Printf(init_func_def, "SWIG_TypeClientData(SWIGTYPE%s, (void *) %s);\n", swigtype_ptr, wname); } else { Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", proc_name, wname, proc_name, numreq, numargs); } } else { if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(argc,argv);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "static Scheme_Object *\n", dname, "(int argc, Scheme_Object **argv) {", NIL); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "scheme_signal_error(\"No matching function for overloaded '%s'\");\n", iname); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(init_func_def, "scheme_add_global(\"%s\", scheme_make_prim_w_arity(%s,\"%s\",%d,%d),menv);\n", proc_name, dname, proc_name, 0, maxargs); DelWrapper(df); Delete(dispatch); Delete(dname); } } Delete(proc_name); Delete(source); Delete(target); Delete(arg); Delete(outarg); Delete(cleanup); Delete(build); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function _wrap_swig_var_varname(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. Either way, we return the variables * value. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *proc_name = NewString(""); String *tm; String *tm2 = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; if (!addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); Setattr(n, "wrap:name", proc_name); if ((SwigType_type(t) != T_USER) || (is_a_pointer(t))) { Printf(f->def, "static Scheme_Object *%s(int argc, Scheme_Object** argv) {\n", var_name); Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "swig_result", "Scheme_Object *swig_result"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (argc) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "argv[0]"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "argv[0]"); /* Printv(f->code, tm, "\n",NIL); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_mzscheme_type_error(t); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); /* Printf (f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_mzscheme_type_error(t); } Printf(f->code, "\nreturn swig_result;\n"); Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the MzScheme interpreter Printv(init_func_def, "scheme_add_global(\"", proc_name, "\", scheme_make_prim_w_arity(", var_name, ", \"", proc_name, "\", ", "0", ", ", "1", "), menv);\n", NIL); } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(var_name); Delete(proc_name); Delete(argnum); Delete(arg); Delete(tm2); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *var_name = NewString(""); String *proc_name = NewString(""); String *rvalue = NewString(""); String *temp = NewString(""); String *tm; // Make a static variable; Printf(var_name, "_wrap_const_%s", Swig_name_mangle(Getattr(n, "sym:name"))); // Build the name for scheme. Printv(proc_name, iname, NIL); Replaceall(proc_name, "_", "-"); if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } // See if there's a typemap Printv(rvalue, value, NIL); if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 1)) { temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "\"", temp, "\"", NIL); } if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 0)) { Delete(temp); temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "'", temp, "'", NIL); } if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { Replaceall(tm, "$source", rvalue); Replaceall(tm, "$value", rvalue); Replaceall(tm, "$target", name); Printf(f_init, "%s\n", tm); } else { // Create variable and assign it a value Printf(f_header, "static %s = ", SwigType_lstr(type, var_name)); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if ((SwigType_type(type) == T_STRING)) { Printf(f_header, "\"%s\";\n", value); } else if (SwigType_type(type) == T_CHAR && !is_enum_item) { Printf(f_header, "\'%s\';\n", value); } else { Printf(f_header, "%s;\n", value); } // Now create a variable declaration { /* Hack alert: will cleanup later -- Dave */ Node *nn = NewHash(); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Setattr(nn, "name", var_name); Setattr(nn, "sym:name", iname); Setattr(nn, "type", type); SetFlag(nn, "feature:immutable"); variableWrapper(nn); Delete(nn); } } Delete(proc_name); Delete(rvalue); Delete(temp); return SWIG_OK; } virtual int destructorHandler(Node *n) { exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { String *mangled_classname = 0; String *real_classname = 0; String *scm_structname = NewString(""); SwigType *ctype_ptr = NewStringf("p.%s", getClassType()); SwigType *t = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(t); Delete(t); cls_swigtype = SwigType_manglestr(Getattr(n, "name")); fieldnames_tab = NewString(""); convert_tab = NewString(""); convert_proto_tab = NewString(""); struct_name = Getattr(n, "sym:name"); mangled_struct_name = Swig_name_mangle(Getattr(n, "sym:name")); Printv(scm_structname, struct_name, NIL); Replaceall(scm_structname, "_", "-"); real_classname = Getattr(n, "name"); mangled_classname = Swig_name_mangle(real_classname); Printv(fieldnames_tab, "static const char *_swig_struct_", cls_swigtype, "_field_names[] = { \n", NIL); Printv(convert_proto_tab, "static Scheme_Object *_swig_convert_struct_", cls_swigtype, "(", SwigType_str(ctype_ptr, "ptr"), ");\n", NIL); Printv(convert_tab, "static Scheme_Object *_swig_convert_struct_", cls_swigtype, "(", SwigType_str(ctype_ptr, "ptr"), ")\n {\n", NIL); Printv(convert_tab, tab4, "Scheme_Object *obj;\n", tab4, "Scheme_Object *fields[_swig_struct_", cls_swigtype, "_field_names_cnt];\n", tab4, "int i = 0;\n\n", NIL); /* Generate normal wrappers */ Language::classHandler(n); Printv(convert_tab, tab4, "obj = scheme_make_struct_instance(", "_swig_struct_type_", cls_swigtype, ", i, fields);\n", NIL); Printv(convert_tab, tab4, "return obj;\n}\n\n", NIL); Printv(fieldnames_tab, "};\n", NIL); Printv(f_header, "static Scheme_Object *_swig_struct_type_", cls_swigtype, ";\n", NIL); Printv(f_header, fieldnames_tab, NIL); Printv(f_header, "#define _swig_struct_", cls_swigtype, "_field_names_cnt (sizeof(_swig_struct_", cls_swigtype, "_field_names)/sizeof(char*))\n", NIL); Printv(f_header, convert_proto_tab, NIL); Printv(f_wrappers, convert_tab, NIL); Printv(init_func_def, "_swig_struct_type_", cls_swigtype, " = SWIG_MzScheme_new_scheme_struct(menv, \"", scm_structname, "\", ", "_swig_struct_", cls_swigtype, "_field_names_cnt,", "(char**) _swig_struct_", cls_swigtype, "_field_names);\n", NIL); Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(fieldnames_tab); Delete(convert_tab); Delete(ctype_ptr); Delete(convert_proto_tab); struct_name = 0; mangled_struct_name = 0; Delete(cls_swigtype); cls_swigtype = 0; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { Language::membervariableHandler(n); if (!is_smart_pointer()) { String *symname = Getattr(n, "sym:name"); String *name = Getattr(n, "name"); SwigType *type = Getattr(n, "type"); String *swigtype = SwigType_manglestr(Getattr(n, "type")); String *tm = 0; String *access_mem = NewString(""); SwigType *ctype_ptr = NewStringf("p.%s", Getattr(n, "type")); Printv(fieldnames_tab, tab4, "\"", symname, "\",\n", NIL); Printv(access_mem, "(ptr)->", name, NIL); if ((SwigType_type(type) == T_USER) && (!is_a_pointer(type))) { Printv(convert_tab, tab4, "fields[i++] = ", NIL); Printv(convert_tab, "_swig_convert_struct_", swigtype, "((", SwigType_str(ctype_ptr, 0), ")&((ptr)->", name, "));\n", NIL); } else if ((tm = Swig_typemap_lookup("varout", n, access_mem, 0))) { Replaceall(tm, "$result", "fields[i++]"); Printv(convert_tab, tm, "\n", NIL); } else Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported member variable type %s (ignored).\n", SwigType_str(type, 0)); Delete(access_mem); } return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifer() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } String *runtimeCode() { String *s = Swig_include_sys("mzrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'mzrun.swg'\n"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigmzrun.h"); } }; /* ----------------------------------------------------------------------------- * swig_mzscheme() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_mzscheme() { return new MZSCHEME(); } extern "C" Language *swig_mzscheme(void) { return new_swig_mzscheme(); } swig-3.0.12/Source/Modules/module.cxx0000664000175000017500000000333513042756442017322 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * module.cxx * * This file is responsible for the module system. * ----------------------------------------------------------------------------- */ #include "swigmod.h" struct Module { ModuleFactory fac; char *name; Module *next; Module(const char *n, ModuleFactory f) { fac = f; name = new char[strlen(n) + 1]; strcpy(name, n); next = 0; } ~Module() { delete[]name; } }; static Module *modules = 0; /* ----------------------------------------------------------------------------- * void Swig_register_module() * * Register a module. * ----------------------------------------------------------------------------- */ void Swig_register_module(const char *n, ModuleFactory f) { Module *m = new Module(n, f); m->next = modules; modules = m; } /* ----------------------------------------------------------------------------- * Language *Swig_find_module() * * Given a command line option, locates the factory function. * ----------------------------------------------------------------------------- */ ModuleFactory Swig_find_module(const char *name) { Module *m = modules; while (m) { if (strcmp(m->name, name) == 0) { return m->fac; } m = m->next; } return 0; } swig-3.0.12/Source/Modules/javascript.cxx0000664000175000017500000022170713042756442020210 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * javascript.cxx * * Javascript language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" /** * Enables extra debugging information in typemaps. */ static bool js_template_enable_debug = false; #define ERR_MSG_ONLY_ONE_ENGINE_PLEASE "Only one engine can be specified at a time." // keywords used for state variables #define NAME "name" #define NAME_MANGLED "name_mangled" #define TYPE "type" #define TYPE_MANGLED "type_mangled" #define WRAPPER_NAME "wrapper" #define IS_IMMUTABLE "is_immutable" #define IS_STATIC "is_static" #define IS_ABSTRACT "is_abstract" #define GETTER "getter" #define SETTER "setter" #define PARENT "parent" #define CTOR "ctor" #define CTOR_WRAPPERS "ctor_wrappers" #define CTOR_DISPATCHERS "ctor_dispatchers" #define DTOR "dtor" #define ARGCOUNT "wrap:argc" #define HAS_TEMPLATES "has_templates" #define FORCE_CPP "force_cpp" #define RESET true // keys for global state variables #define CREATE_NAMESPACES "create_namespaces" #define REGISTER_NAMESPACES "register_namespaces" #define INITIALIZER "initializer" // keys for class scoped state variables #define MEMBER_VARIABLES "member_variables" #define MEMBER_FUNCTIONS "member_functions" #define STATIC_FUNCTIONS "static_functions" #define STATIC_VARIABLES "static_variables" /** * A convenience class to manage state variables for emitters. * The implementation delegates to SWIG Hash DOHs and provides * named sub-hashes for class, variable, and function states. */ class JSEmitterState { public: JSEmitterState(); ~JSEmitterState(); DOH *globals(); DOH *globals(const char *key, DOH *initial = 0); DOH *clazz(bool reset = false); DOH *clazz(const char *key, DOH *initial = 0); DOH *function(bool reset = false); DOH *function(const char *key, DOH *initial = 0); DOH *variable(bool reset = false); DOH *variable(const char *key, DOH *initial = 0); static int IsSet(DOH *val); private: DOH *getState(const char *key, bool reset = false); Hash *globalHash; }; /** * A convenience class that wraps a code snippet used as template * for code generation. */ class Template { public: Template(const String *code); Template(const String *code, const String *templateName); Template(const Template & other); ~Template(); String *str(); Template & replace(const String *pattern, const String *repl); Template & print(DOH *doh); Template & pretty_print(DOH *doh); void operator=(const Template & t); Template & trim(); private: String *code; String *templateName; }; /** * JSEmitter represents an abstraction of javascript code generators * for different javascript engines. **/ class JSEmitter { protected: typedef JSEmitterState State; enum MarshallingMode { Setter, Getter, Ctor, Function }; public: enum JSEngine { JavascriptCore, V8, NodeJS }; JSEmitter(JSEngine engine); virtual ~ JSEmitter(); /** * Opens output files and temporary output DOHs. */ virtual int initialize(Node *n); /** * Writes all collected code into the output file(s). */ virtual int dump(Node *n) = 0; /** * Cleans up all open output DOHs. */ virtual int close() = 0; /** * Switches the context for code generation. * * Classes, global variables and global functions may need to * be registered in certain static tables. * This method should be used to switch output DOHs correspondingly. */ virtual int switchNamespace(Node *); /** * Invoked at the beginning of the classHandler. */ virtual int enterClass(Node *); /** * Invoked at the end of the classHandler. */ virtual int exitClass(Node *) { return SWIG_OK; }; /** * Invoked at the beginning of the variableHandler. */ virtual int enterVariable(Node *); /** * Invoked at the end of the variableHandler. */ virtual int exitVariable(Node *) { return SWIG_OK; }; /** * Invoked at the beginning of the functionHandler. */ virtual int enterFunction(Node *); /** * Invoked at the end of the functionHandler. */ virtual int exitFunction(Node *) { return SWIG_OK; }; /** * Invoked by functionWrapper callback after call to Language::functionWrapper. */ virtual int emitWrapperFunction(Node *n); /** * Invoked from constantWrapper after call to Language::constantWrapper. **/ virtual int emitConstant(Node *n); /** * Registers a given code snippet for a given key name. * * This method is called by the fragmentDirective handler * of the JAVASCRIPT language module. **/ int registerTemplate(const String *name, const String *code); /** * Retrieve the code template registered for a given name. */ Template getTemplate(const String *name); State & getState(); protected: /** * Generates code for a constructor function. */ virtual int emitCtor(Node *n); /** * Generates code for a destructor function. */ virtual int emitDtor(Node *n); /** * Generates code for a function. */ virtual int emitFunction(Node *n, bool is_member, bool is_static); virtual int emitFunctionDispatcher(Node *n, bool /*is_member */ ); /** * Generates code for a getter function. */ virtual int emitGetter(Node *n, bool is_member, bool is_static); /** * Generates code for a setter function. */ virtual int emitSetter(Node *n, bool is_member, bool is_static); virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) = 0; virtual String *emitInputTypemap(Node *n, Parm *params, Wrapper *wrapper, String *arg); virtual void marshalOutput(Node *n, ParmList *params, Wrapper *wrapper, String *actioncode, const String *cresult = 0, bool emitReturnVariable = true); virtual void emitCleanupCode(Node *n, Wrapper *wrapper, ParmList *params); /** * Helper function to retrieve the first parent class node. */ Node *getBaseClass(Node *n); Parm *skipIgnoredArgs(Parm *p); virtual int createNamespace(String *scope); virtual Hash *createNamespaceEntry(const char *name, const char *parent); virtual int emitNamespaces() = 0; protected: JSEngine engine; Hash *templates; State state; // contains context specific data (DOHs) // to allow generation of namespace related code // which are switched on namespace change Hash *namespaces; Hash *current_namespace; String *defaultResultName; File *f_wrappers; }; /* factory methods for concrete JSEmitters: */ JSEmitter *swig_javascript_create_JSCEmitter(); JSEmitter *swig_javascript_create_V8Emitter(); JSEmitter *swig_javascript_create_NodeJSEmitter(); /********************************************************************** * JAVASCRIPT: SWIG module implementation **********************************************************************/ class JAVASCRIPT:public Language { public: JAVASCRIPT():emitter(NULL) { } ~JAVASCRIPT() { delete emitter; } virtual int functionHandler(Node *n); virtual int globalfunctionHandler(Node *n); virtual int variableHandler(Node *n); virtual int globalvariableHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int classHandler(Node *n); virtual int functionWrapper(Node *n); virtual int constantWrapper(Node *n); virtual void main(int argc, char *argv[]); virtual int top(Node *n); /** * Registers all %fragments assigned to section "templates". **/ virtual int fragmentDirective(Node *n); public: virtual String *getNSpace() const; private: JSEmitter *emitter; }; /* --------------------------------------------------------------------- * functionWrapper() * * Low level code generator for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::functionWrapper(Node *n) { // note: the default implementation only prints a message // Language::functionWrapper(n); emitter->emitWrapperFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * functionHandler() * * Function handler for generating wrappers for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::functionHandler(Node *n) { if (GetFlag(n, "isextension") == 1) { SetFlag(n, "ismember"); } emitter->enterFunction(n); Language::functionHandler(n); emitter->exitFunction(n); return SWIG_OK; } /* --------------------------------------------------------------------- * globalfunctionHandler() * * Function handler for generating wrappers for functions * --------------------------------------------------------------------- */ int JAVASCRIPT::globalfunctionHandler(Node *n) { emitter->switchNamespace(n); Language::globalfunctionHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * staticmemberfunctionHandler() * * Function handler for generating wrappers for static member functions * --------------------------------------------------------------------- */ int JAVASCRIPT::staticmemberfunctionHandler(Node *n) { /* * Note: storage=static is removed by Language::staticmemberfunctionHandler. * So, don't rely on that after here. Instead use the state variable which is * set by JSEmitter::enterFunction(). */ Language::staticmemberfunctionHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * variableHandler() * * Function handler for generating wrappers for variables * --------------------------------------------------------------------- */ int JAVASCRIPT::variableHandler(Node *n) { emitter->enterVariable(n); Language::variableHandler(n); emitter->exitVariable(n); return SWIG_OK; } /* --------------------------------------------------------------------- * globalvariableHandler() * * Function handler for generating wrappers for global variables * --------------------------------------------------------------------- */ int JAVASCRIPT::globalvariableHandler(Node *n) { emitter->switchNamespace(n); Language::globalvariableHandler(n); return SWIG_OK; } /* --------------------------------------------------------------------- * constantHandler() * * Function handler for generating wrappers for constants * --------------------------------------------------------------------- */ int JAVASCRIPT::constantWrapper(Node *n) { emitter->switchNamespace(n); // Note: callbacks trigger this wrapper handler // TODO: handle callback declarations if (Equal(Getattr(n, "kind"), "function")) { return SWIG_OK; } // TODO: the emitter for constants must be implemented in a cleaner way // currently we treat it like a read-only variable // however, there is a remaining bug with function pointer constants // which could be fixed with a cleaner approach emitter->emitConstant(n); return SWIG_OK; } /* --------------------------------------------------------------------- * classHandler() * * Function handler for generating wrappers for class * --------------------------------------------------------------------- */ int JAVASCRIPT::classHandler(Node *n) { emitter->switchNamespace(n); emitter->enterClass(n); Language::classHandler(n); emitter->exitClass(n); return SWIG_OK; } int JAVASCRIPT::fragmentDirective(Node *n) { // catch all fragment directives that have "templates" as location // and register them at the emitter. String *section = Getattr(n, "section"); if (Equal(section, "templates")) { emitter->registerTemplate(Getattr(n, "value"), Getattr(n, "code")); } else { Swig_fragment_register(n); } return SWIG_OK; } String *JAVASCRIPT::getNSpace() const { return Language::getNSpace(); } /* --------------------------------------------------------------------- * top() * * Function handler for processing top node of the parse tree * Wrapper code generation essentially starts from here * --------------------------------------------------------------------- */ int JAVASCRIPT::top(Node *n) { emitter->initialize(n); Language::top(n); emitter->dump(n); emitter->close(); return SWIG_OK; } static const char *usage = (char *) "\ Javascript Options (available with -javascript)\n\ -jsc - creates a JavascriptCore extension \n\ -v8 - creates a v8 extension \n\ -node - creates a node.js extension \n\ -debug-codetemplates - generates information about the origin of code templates\n"; /* --------------------------------------------------------------------- * main() * * Entry point for the JAVASCRIPT module * --------------------------------------------------------------------- */ void JAVASCRIPT::main(int argc, char *argv[]) { // Set javascript subdirectory in SWIG library SWIG_library_directory("javascript"); int engine = -1; for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-v8") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::V8; } else if (strcmp(argv[i], "-jsc") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::JavascriptCore; } else if (strcmp(argv[i], "-node") == 0) { if (engine != -1) { Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE); SWIG_exit(-1); } Swig_mark_arg(i); engine = JSEmitter::NodeJS; } else if (strcmp(argv[i], "-debug-codetemplates") == 0) { Swig_mark_arg(i); js_template_enable_debug = true; } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); return; } } } switch (engine) { case JSEmitter::V8: { emitter = swig_javascript_create_V8Emitter(); Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0); SWIG_library_directory("javascript/v8"); // V8 API is C++, so output must be C++ compatibile even when wrapping C code if (!cparse_cplusplus) { Swig_cparse_cplusplusout(1); } break; } case JSEmitter::JavascriptCore: { emitter = swig_javascript_create_JSCEmitter(); Preprocessor_define("SWIG_JAVASCRIPT_JSC 1", 0); SWIG_library_directory("javascript/jsc"); break; } case JSEmitter::NodeJS: { emitter = swig_javascript_create_V8Emitter(); Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0); Preprocessor_define("BUILDING_NODE_EXTENSION 1", 0); SWIG_library_directory("javascript/v8"); break; } default: { Printf(stderr, "SWIG Javascript: Unknown engine. Please specify one of '-jsc', '-v8' or '-node'.\n"); SWIG_exit(-1); break; } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGJAVASCRIPT 1", 0); // Add typemap definitions SWIG_typemap_lang("javascript"); // Set configuration file SWIG_config_file("javascript.swg"); allow_overloading(); } /* ----------------------------------------------------------------------------- * swig_javascript() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_javascript() { return new JAVASCRIPT(); } extern "C" Language *swig_javascript(void) { return new_swig_javascript(); } /********************************************************************** * Emitter implementations **********************************************************************/ /* ----------------------------------------------------------------------------- * JSEmitter() * ----------------------------------------------------------------------------- */ JSEmitter::JSEmitter(JSEmitter::JSEngine engine) : engine(engine), templates(NewHash()), namespaces(NULL), current_namespace(NULL), defaultResultName(NewString("result")), f_wrappers(NULL) { } /* ----------------------------------------------------------------------------- * ~JSEmitter() * ----------------------------------------------------------------------------- */ JSEmitter::~JSEmitter() { Delete(templates); } /* ----------------------------------------------------------------------------- * JSEmitter::RegisterTemplate() : Registers a code template * * Note: this is used only by JAVASCRIPT::fragmentDirective(). * ----------------------------------------------------------------------------- */ int JSEmitter::registerTemplate(const String *name, const String *code) { if (!State::IsSet(state.globals(HAS_TEMPLATES))) { SetFlag(state.globals(), HAS_TEMPLATES); } return Setattr(templates, name, code); } /* ----------------------------------------------------------------------------- * JSEmitter::getTemplate() : Provides a registered code template * ----------------------------------------------------------------------------- */ Template JSEmitter::getTemplate(const String *name) { String *templ = Getattr(templates, name); if (!templ) { Printf(stderr, "Could not find template %s\n.", name); SWIG_exit(EXIT_FAILURE); } Template t(templ, name); return t; } JSEmitterState & JSEmitter::getState() { return state; } int JSEmitter::initialize(Node * /*n */ ) { if (namespaces != NULL) { Delete(namespaces); } namespaces = NewHash(); Hash *global_namespace = createNamespaceEntry("exports", 0); Setattr(namespaces, "::", global_namespace); current_namespace = global_namespace; f_wrappers = NewString(""); return SWIG_OK; } /* --------------------------------------------------------------------- * skipIgnoredArgs() * --------------------------------------------------------------------- */ Parm *JSEmitter::skipIgnoredArgs(Parm *p) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* ----------------------------------------------------------------------------- * JSEmitter::getBaseClass() : the node of the base class or NULL * * Note: the first base class is provided. Multiple inheritance is not * supported. * ----------------------------------------------------------------------------- */ Node *JSEmitter::getBaseClass(Node *n) { // retrieve the first base class that is not %ignored List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } return base.item; } return NULL; } /* ----------------------------------------------------------------------------- * JSEmitter::emitWrapperFunction() : dispatches emitter functions. * * This allows to have small sized, dedicated emitting functions. * All state dependent branching is done here. * ----------------------------------------------------------------------------- */ int JSEmitter::emitWrapperFunction(Node *n) { int ret = SWIG_OK; String *kind = Getattr(n, "kind"); if (kind) { if (Equal(kind, "function") // HACK: sneaky.ctest revealed that typedef'd (global) functions must be // detected via the 'view' attribute. || (Equal(kind, "variable") && Equal(Getattr(n, "view"), "globalfunctionHandler")) ) { bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; bool is_static = GetFlag(state.function(), IS_STATIC) != 0; ret = emitFunction(n, is_member, is_static); } else if (Cmp(kind, "variable") == 0) { bool is_static = GetFlag(state.variable(), IS_STATIC) != 0; // HACK: smartpointeraccessed static variables are not treated as statics if (GetFlag(n, "allocate:smartpointeraccess")) { is_static = false; } bool is_member = GetFlag(n, "ismember") != 0; bool is_setter = GetFlag(n, "memberset") != 0 || GetFlag(n, "varset") != 0; bool is_getter = GetFlag(n, "memberget") != 0 || GetFlag(n, "varget") != 0; if (is_setter) { ret = emitSetter(n, is_member, is_static); } else if (is_getter) { ret = emitGetter(n, is_member, is_static); } else { Swig_print_node(n); } } else { Printf(stderr, "Warning: unsupported wrapper function type\n"); Swig_print_node(n); ret = SWIG_ERROR; } } else { String *view = Getattr(n, "view"); if (Cmp(view, "constructorHandler") == 0) { ret = emitCtor(n); } else if (Cmp(view, "destructorHandler") == 0) { ret = emitDtor(n); } else { Printf(stderr, "Warning: unsupported wrapper function type"); Swig_print_node(n); ret = SWIG_ERROR; } } return ret; } int JSEmitter::enterClass(Node *n) { state.clazz(RESET); state.clazz(NAME, Getattr(n, "sym:name")); state.clazz("nspace", current_namespace); // Creating a mangled name using the current namespace and the symbol name String *mangled_name = NewString(""); Printf(mangled_name, "%s_%s", Getattr(current_namespace, NAME_MANGLED), Getattr(n, "sym:name")); state.clazz(NAME_MANGLED, SwigType_manglestr(mangled_name)); Delete(mangled_name); state.clazz(TYPE, NewString(Getattr(n, "classtype"))); String *type = SwigType_manglestr(Getattr(n, "classtypeobj")); String *classtype_mangled = NewString(""); Printf(classtype_mangled, "p%s", type); state.clazz(TYPE_MANGLED, classtype_mangled); Delete(type); String *ctor_wrapper = NewString("_wrap_new_veto_"); Append(ctor_wrapper, state.clazz(NAME)); state.clazz(CTOR, ctor_wrapper); state.clazz(CTOR_DISPATCHERS, NewString("")); state.clazz(DTOR, NewString("0")); // HACK: assume that a class is abstract // this is resolved by emitCtor (which is only called for non abstract classes) SetFlag(state.clazz(), IS_ABSTRACT); return SWIG_OK; } int JSEmitter::enterFunction(Node *n) { state.function(RESET); state.function(NAME, Getattr(n, "sym:name")); if (Equal(Getattr(n, "storage"), "static")) { SetFlag(state.function(), IS_STATIC); } return SWIG_OK; } int JSEmitter::enterVariable(Node *n) { // reset the state information for variables. state.variable(RESET); // Retrieve a pure symbol name. Using 'sym:name' as a basis, as it considers %renamings. if (Equal(Getattr(n, "view"), "memberconstantHandler")) { // Note: this is kind of hacky/experimental // For constants/enums 'sym:name' contains e.g., 'Foo_Hello' instead of 'Hello' state.variable(NAME, Getattr(n, "memberconstantHandler:sym:name")); } else { state.variable(NAME, Swig_scopename_last(Getattr(n, "sym:name"))); } if (Equal(Getattr(n, "storage"), "static")) { SetFlag(state.variable(), IS_STATIC); } if (!Language::instance()->is_assignable(n)) { SetFlag(state.variable(), IS_IMMUTABLE); } // FIXME: test "arrays_global" does not compile with that as it is not allowed to assign to char[] if (Equal(Getattr(n, "type"), "a().char")) { SetFlag(state.variable(), IS_IMMUTABLE); } return SWIG_OK; } int JSEmitter::emitCtor(Node *n) { Wrapper *wrapper = NewWrapper(); bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; Template t_ctor(getTemplate("js_ctor")); String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); if (is_overloaded) { t_ctor = getTemplate("js_overloaded_ctor"); Append(wrap_name, Getattr(n, "sym:overname")); } Setattr(n, "wrap:name", wrap_name); // note: we can remove the is_abstract flag now, as this // is called for non-abstract classes only. Setattr(state.clazz(), IS_ABSTRACT, 0); ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // HACK: in test-case `ignore_parameter` emit_attach_parmmaps generated an extra line of applied typemaps. // Deleting wrapper->code here, to reset, and as it seemed to have no side effect elsewhere Delete(wrapper->code); wrapper->code = NewString(""); Printf(wrapper->locals, "%sresult;", SwigType_str(Getattr(n, "type"), 0)); marshalInputArgs(n, params, wrapper, Ctor, true, false); String *action = emit_action(n); Printv(wrapper->code, action, "\n", 0); emitCleanupCode(n, wrapper, params); t_ctor.replace("$jswrapper", wrap_name) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .replace("$jsargcount", Getattr(n, ARGCOUNT)) .pretty_print(f_wrappers); Template t_ctor_case(getTemplate("js_ctor_dispatch_case")); t_ctor_case.replace("$jswrapper", wrap_name) .replace("$jsargcount", Getattr(n, ARGCOUNT)); Append(state.clazz(CTOR_DISPATCHERS), t_ctor_case.str()); DelWrapper(wrapper); // create a dispatching ctor if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Template t_mainctor(getTemplate("js_ctor_dispatcher")); t_mainctor.replace("$jswrapper", wrap_name) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsdispatchcases", state.clazz(CTOR_DISPATCHERS)) .pretty_print(f_wrappers); state.clazz(CTOR, wrap_name); } } else { state.clazz(CTOR, wrap_name); } return SWIG_OK; } int JSEmitter::emitDtor(Node *n) { String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); SwigType *type = state.clazz(TYPE); String *p_classtype = SwigType_add_pointer(state.clazz(TYPE)); String *ctype = SwigType_lstr(p_classtype, ""); String *free = NewString(""); // (Taken from JSCore implementation.) /* The if (Extend) block was taken from the Ruby implementation. * The problem is that in the case of an %extend to create a destructor for a struct to coordinate automatic memory cleanup with the Javascript collector, * the SWIG function was not being generated. More specifically: struct MyData { %extend { ~MyData() { FreeData($self); } } }; %newobject CreateData; struct MyData* CreateData(void); %delobject FreeData; void FreeData(struct MyData* the_data); where the use case is something like: var my_data = example.CreateData(); my_data = null; This function was not being generated: SWIGINTERN void delete_MyData(struct MyData *self){ FreeData(self); } I don't understand fully why it wasn't being generated. It just seems to happen in the Lua generator. There is a comment about staticmemberfunctionHandler having an inconsistency and I tracked down dome of the SWIGINTERN void delete_* code to that function in the Language base class. The Ruby implementation seems to have an explicit check for if(Extend) and explicitly generates the code, so that's what I'm doing here. The Ruby implementation does other stuff which I omit. */ if (Extend) { String *wrap = Getattr(n, "wrap:code"); if (wrap) { Printv(f_wrappers, wrap, NIL); } } // HACK: this is only for the v8 emitter. maybe set an attribute wrap:action of node // TODO: generate dtors more similar to other wrappers // EW: I think this is wrong. delete should only be used when new was used to create. If malloc was used, free needs to be used. if (SwigType_isarray(type)) { Printf(free, "delete [] (%s)", ctype); } else { Printf(free, "delete (%s)", ctype); } String *destructor_action = Getattr(n, "wrap:action"); // Adapted from the JSCore implementation. /* The next challenge is to generate the correct finalize function for JavaScriptCore to call. Originally, it would use this fragment from javascriptcode.swg %fragment ("JS_destructordefn", "templates") %{ void _wrap_${classname_mangled}_finalize(JSObjectRef thisObject) { SWIG_PRV_DATA* t = (SWIG_PRV_DATA*)JSObjectGetPrivate(thisObject); if(t && t->swigCMemOwn) free ((${type}*)t->swigCObject); if(t) free(t); } %} But for the above example case of %extend to define a destructor on a struct, we need to override the system to not call free ((${type}*)t->swigCObject); and substitute it with what the user has provided. To solve this, I created a variation fragment called JS_destructoroverridedefn: SWIG_PRV_DATA* t = (SWIG_PRV_DATA*)JSObjectGetPrivate(thisObject); if(t && t->swigCMemOwn) { ${type}* arg1 = (${type}*)t->swigCObject; ${destructor_action} } if(t) free(t); Based on what I saw in the Lua and Ruby modules, I use Getattr(n, "wrap:action") to decide if the user has a preferred destructor action. Based on that, I decide which fragment to use. And in the case of the custom action, I substitute that action in. I noticed that destructor_action has the form delete_MyData(arg1); The explicit arg1 is a little funny, so I structured the fragment to create a temporary variable called arg1 to make the generation easier. This might suggest this solution misunderstands a more complex case. Also, there is a problem where destructor_action is always true for me, even when not requesting %extend as above. So this code doesn't actually quite work as I expect. The end result is that the code still works because destructor_action calls free like the original template. The one caveat is the string in destructor_action casts to char* which is wierd. I think there is a deeper underlying SWIG issue because I don't think it should be char*. However, it doesn't really matter for free. Maybe the fix for the destructor_action always true problem is that this is supposed to be embedded in the if(Extend) block above. But I don't fully understand the conditions of any of these things, and since it works for the moment, I don't want to break more stuff. */ if (destructor_action) { Template t_dtor = getTemplate("js_dtoroverride"); state.clazz(DTOR, wrap_name); t_dtor.replace("${classname_mangled}", state.clazz(NAME_MANGLED)) .replace("$jswrapper", wrap_name) .replace("$jsfree", free) .replace("$jstype", ctype); t_dtor.replace("${destructor_action}", destructor_action); Wrapper_pretty_print(t_dtor.str(), f_wrappers); } else { Template t_dtor = getTemplate("js_dtor"); state.clazz(DTOR, wrap_name); t_dtor.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jswrapper", wrap_name) .replace("$jsfree", free) .replace("$jstype", ctype) .pretty_print(f_wrappers); } Delete(p_classtype); Delete(ctype); Delete(free); return SWIG_OK; } int JSEmitter::emitGetter(Node *n, bool is_member, bool is_static) { Wrapper *wrapper = NewWrapper(); Template t_getter(getTemplate("js_getter")); // prepare wrapper name String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Setattr(n, "wrap:name", wrap_name); state.variable(GETTER, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // prepare code part String *action = emit_action(n); marshalInputArgs(n, params, wrapper, Getter, is_member, is_static); marshalOutput(n, params, wrapper, action); emitCleanupCode(n, wrapper, params); t_getter.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitSetter(Node *n, bool is_member, bool is_static) { // skip variables that are immutable if (State::IsSet(state.variable(IS_IMMUTABLE))) { return SWIG_OK; } Wrapper *wrapper = NewWrapper(); Template t_setter(getTemplate("js_setter")); // prepare wrapper name String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Setattr(n, "wrap:name", wrap_name); state.variable(SETTER, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // prepare code part String *action = emit_action(n); marshalInputArgs(n, params, wrapper, Setter, is_member, is_static); Append(wrapper->code, action); emitCleanupCode(n, wrapper, params); t_setter.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } /* ----------------------------------------------------------------------------- * JSEmitter::emitConstant() : triggers code generation for constants * ----------------------------------------------------------------------------- */ int JSEmitter::emitConstant(Node *n) { // HACK: somehow it happened under Mac OS X that before everything started // a lot of SWIG internal constants were emitted // This didn't happen on other platforms yet... // we ignore those premature definitions if (!State::IsSet(state.globals(HAS_TEMPLATES))) { return SWIG_ERROR; } Wrapper *wrapper = NewWrapper(); SwigType *type = Getattr(n, "type"); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(name); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); // HACK: forcing usage of cppvalue for v8 (which turned out to fix typdef_struct.i, et. al) if (State::IsSet(state.globals(FORCE_CPP)) && Getattr(n, "cppvalue") != NULL) { value = Getattr(n, "cppvalue"); } Template t_getter(getTemplate("js_getter")); // call the variable methods as a constants are // registred in same way enterVariable(n); state.variable(GETTER, wname); // TODO: why do we need this? Setattr(n, "wrap:name", wname); // special treatment of member pointers if (SwigType_type(type) == T_MPOINTER) { // TODO: this could go into a code-template String *mpointer_wname = NewString(""); Printf(mpointer_wname, "_wrapConstant_%s", iname); Setattr(n, "memberpointer:constant:wrap:name", mpointer_wname); String *str = SwigType_str(type, mpointer_wname); Printf(f_wrappers, "static %s = %s;\n", str, value); Delete(str); value = mpointer_wname; } marshalOutput(n, 0, wrapper, NewString(""), value, false); t_getter.replace("$jswrapper", wname) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .pretty_print(f_wrappers); exitVariable(n); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitFunction(Node *n, bool is_member, bool is_static) { Wrapper *wrapper = NewWrapper(); Template t_function(getTemplate("js_function")); bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; // prepare the function wrapper name String *iname = Getattr(n, "sym:name"); String *wrap_name = Swig_name_wrapper(iname); if (is_overloaded) { t_function = getTemplate("js_overloaded_function"); Append(wrap_name, Getattr(n, "sym:overname")); } Setattr(n, "wrap:name", wrap_name); state.function(WRAPPER_NAME, wrap_name); // prepare local variables ParmList *params = Getattr(n, "parms"); emit_parameter_variables(params, wrapper); emit_attach_parmmaps(params, wrapper); // HACK: in test-case `ignore_parameter` emit_attach_parmmaps generates an extra line of applied typemap. // Deleting wrapper->code here fixes the problem, and seems to have no side effect elsewhere Delete(wrapper->code); wrapper->code = NewString(""); marshalInputArgs(n, params, wrapper, Function, is_member, is_static); String *action = emit_action(n); marshalOutput(n, params, wrapper, action); emitCleanupCode(n, wrapper, params); Replaceall(wrapper->code, "$symname", iname); t_function.replace("$jswrapper", wrap_name) .replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code) .replace("$jsargcount", Getattr(n, ARGCOUNT)) .pretty_print(f_wrappers); DelWrapper(wrapper); return SWIG_OK; } int JSEmitter::emitFunctionDispatcher(Node *n, bool /*is_member */ ) { Wrapper *wrapper = NewWrapper(); // Generate call list, go to first node Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up do { String *siblname = Getattr(sibl, "wrap:name"); if (siblname) { // handle function overloading Template t_dispatch_case = getTemplate("js_function_dispatch_case"); t_dispatch_case.replace("$jswrapper", siblname) .replace("$jsargcount", Getattr(sibl, ARGCOUNT)); Append(wrapper->code, t_dispatch_case.str()); } } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Template t_function(getTemplate("js_function_dispatcher")); // Note: this dispatcher function gets called after the last overloaded function has been created. // At this time, n.wrap:name contains the name of the last wrapper function. // To get a valid function name for the dispatcher function we take the last wrapper name and // substract the extension "sym:overname", String *wrap_name = NewString(Getattr(n, "wrap:name")); String *overname = Getattr(n, "sym:overname"); Node *methodclass = Swig_methodclass(n); String *class_name = Getattr(methodclass, "sym:name"); int l1 = Len(wrap_name); int l2 = Len(overname); Delslice(wrap_name, l1 - l2, l1); String *new_string = NewStringf("%s_%s", class_name, wrap_name); String *final_wrap_name = Swig_name_wrapper(new_string); Setattr(n, "wrap:name", final_wrap_name); state.function(WRAPPER_NAME, final_wrap_name); t_function.replace("$jslocals", wrapper->locals) .replace("$jscode", wrapper->code); // call this here, to replace all variables t_function.replace("$jswrapper", final_wrap_name) .replace("$jsname", state.function(NAME)) .pretty_print(f_wrappers); // Delete the state variable DelWrapper(wrapper); return SWIG_OK; } String *JSEmitter::emitInputTypemap(Node *n, Parm *p, Wrapper *wrapper, String *arg) { // Get input typemap for current param String *tm = Getattr(p, "tmap:in"); SwigType *type = Getattr(p, "type"); if (tm != NULL) { Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); // do replacements for built-in variables if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$symname", Getattr(n, "sym:name")); Printf(wrapper->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(type, 0)); } return tm; } void JSEmitter::marshalOutput(Node *n, ParmList *params, Wrapper *wrapper, String *actioncode, const String *cresult, bool emitReturnVariable) { SwigType *type = Getattr(n, "type"); String *tm; Parm *p; // adds a declaration for the result variable if (emitReturnVariable) emit_return_variable(n, type, wrapper); // if not given, use default result identifier ('result') for output typemap if (cresult == 0) cresult = defaultResultName; tm = Swig_typemap_lookup_out("out", n, cresult, wrapper, actioncode); bool should_own = GetFlag(n, "feature:new") != 0; if (tm) { Replaceall(tm, "$objecttype", Swig_scopename_last(SwigType_str(SwigType_strip_qualifiers(type), 0))); if (should_own) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } Append(wrapper->code, tm); if (Len(tm) > 0) { Printf(wrapper->code, "\n"); } } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), Getattr(n, "name")); } if (params) { for (p = params; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(wrapper->code, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } Replaceall(wrapper->code, "$result", "jsresult"); } void JSEmitter::emitCleanupCode(Node *n, Wrapper *wrapper, ParmList *params) { Parm *p; String *tm; for (p = params; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { //addThrows(n, "tmap:freearg", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(wrapper->code, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } if (GetFlag(n, "feature:new")) { tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm != NIL) { //addThrows(throws_hash, "newfree", n); Printv(wrapper->code, tm, "\n", NIL); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Printf(wrapper->code, "%s\n", tm); Delete(tm); } } int JSEmitter::switchNamespace(Node *n) { // HACK: somehow this gets called for member functions. // We can safely ignore them, as members are not associated to a namespace (only their class) if (GetFlag(n, "ismember")) { return SWIG_OK; } // if nspace is deactivated, everything goes into the global scope if (!GetFlag(n, "feature:nspace")) { current_namespace = Getattr(namespaces, "::"); return SWIG_OK; } // EXPERIMENTAL: we want to use Language::getNSpace() here // However, it is not working yet. // For namespace functions Language::getNSpace() does not give a valid result #if 0 JAVASCRIPT *lang = static_cast(Language::instance()); String *_nspace = lang->getNSpace(); if (!Equal(nspace, _nspace)) { Printf(stdout, "##### Custom vs Language::getNSpace(): %s | %s\n", nspace, _nspace); Swig_print_node(n); } #endif String *nspace = Getattr(n, "sym:nspace"); if (nspace == NULL) { // It seems that only classes have 'sym:nspace' set. // We try to get the namespace from the qualified name (i.e., everything before the last '::') nspace = Swig_scopename_prefix(Getattr(n, "name")); } // If there is not even a scopename prefix then it must be global scope if (nspace == NULL) { current_namespace = Getattr(namespaces, "::"); return SWIG_OK; } String *scope = NewString(nspace); // replace "." with "::" that we can use Swig_scopename_last Replaceall(scope, ".", "::"); // if the scope is not yet registered // create (parent) namespaces recursively if (!Getattr(namespaces, scope)) { createNamespace(scope); } current_namespace = Getattr(namespaces, scope); return SWIG_OK; } int JSEmitter::createNamespace(String *scope) { String *parent_scope = Swig_scopename_prefix(scope); Hash *parent_namespace; if (parent_scope == 0) { parent_namespace = Getattr(namespaces, "::"); } else if (!Getattr(namespaces, parent_scope)) { createNamespace(parent_scope); parent_namespace = Getattr(namespaces, parent_scope); } else { parent_namespace = Getattr(namespaces, parent_scope); } assert(parent_namespace != 0); Hash *new_namespace = createNamespaceEntry(Char(scope), Char(Getattr(parent_namespace, "name"))); Setattr(namespaces, scope, new_namespace); Delete(parent_scope); return SWIG_OK; } Hash *JSEmitter::createNamespaceEntry(const char *_name, const char *parent) { Hash *entry = NewHash(); String *name = NewString(_name); Setattr(entry, NAME, Swig_scopename_last(name)); Setattr(entry, NAME_MANGLED, Swig_name_mangle(name)); Setattr(entry, PARENT, NewString(parent)); Delete(name); return entry; } /********************************************************************** * JavascriptCore: JSEmitter implementation for JavascriptCore engine **********************************************************************/ class JSCEmitter:public JSEmitter { public: JSCEmitter(); virtual ~ JSCEmitter(); virtual int initialize(Node *n); virtual int dump(Node *n); virtual int close(); protected: virtual int enterVariable(Node *n); virtual int exitVariable(Node *n); virtual int enterFunction(Node *n); virtual int exitFunction(Node *n); virtual int enterClass(Node *n); virtual int exitClass(Node *n); virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static); virtual Hash *createNamespaceEntry(const char *name, const char *parent); virtual int emitNamespaces(); private: String *NULL_STR; String *VETO_SET; // output file and major code parts File *f_wrap_cpp; File *f_runtime; File *f_header; File *f_init; }; JSCEmitter::JSCEmitter() : JSEmitter(JSEmitter::JavascriptCore), NULL_STR(NewString("NULL")), VETO_SET(NewString("JS_veto_set_variable")), f_wrap_cpp(NULL), f_runtime(NULL), f_header(NULL), f_init(NULL) { } JSCEmitter::~JSCEmitter() { Delete(NULL_STR); Delete(VETO_SET); } /* --------------------------------------------------------------------- * marshalInputArgs() * * Process all of the arguments passed into the argv array * and convert them into C/C++ function arguments using the * supplied typemaps. * --------------------------------------------------------------------- */ void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { Parm *p; String *tm; // determine an offset index, as members have an extra 'this' argument // except: static members and ctors. int startIdx = 0; if (is_member && !is_static && mode != Ctor) { startIdx = 1; } // store number of arguments for argument checks int num_args = emit_num_arguments(parms) - startIdx; String *argcount = NewString(""); Printf(argcount, "%d", num_args); Setattr(n, ARGCOUNT, argcount); // process arguments int i = 0; for (p = parms; p; i++) { String *arg = NewString(""); String *type = Getattr(p, "type"); // ignore varargs if (SwigType_isvarargs(type)) break; switch (mode) { case Getter: case Function: if (is_member && !is_static && i == 0) { Printv(arg, "thisObject", 0); } else { Printf(arg, "argv[%d]", i - startIdx); } break; case Setter: if (is_member && !is_static && i == 0) { Printv(arg, "thisObject", 0); } else { Printv(arg, "value", 0); } break; case Ctor: Printf(arg, "argv[%d]", i); break; default: throw "Illegal state."; } tm = emitInputTypemap(n, p, wrapper, arg); Delete(arg); if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } int JSCEmitter::initialize(Node *n) { JSEmitter::initialize(n); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Initialize I/O */ f_wrap_cpp = NewFile(outfile, "w", SWIG_output_files()); if (!f_wrap_cpp) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } /* Initialization of members */ f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); state.globals(CREATE_NAMESPACES, NewString("")); state.globals(REGISTER_NAMESPACES, NewString("")); state.globals(INITIALIZER, NewString("")); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_wrap_cpp); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_banner(f_wrap_cpp); return SWIG_OK; } int JSCEmitter::dump(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); Template initializer_define(getTemplate("js_initializer_define")); initializer_define.replace("$jsname", module).pretty_print(f_header); SwigType_emit_type_table(f_runtime, f_wrappers); Printv(f_wrap_cpp, f_runtime, "\n", 0); Printv(f_wrap_cpp, f_header, "\n", 0); Printv(f_wrap_cpp, f_wrappers, "\n", 0); emitNamespaces(); // compose the initializer function using a template Template initializer(getTemplate("js_initializer")); initializer.replace("$jsname", module) .replace("$jsregisterclasses", state.globals(INITIALIZER)) .replace("$jscreatenamespaces", state.globals(CREATE_NAMESPACES)) .replace("$jsregisternamespaces", state.globals(REGISTER_NAMESPACES)) .pretty_print(f_init); Printv(f_wrap_cpp, f_init, 0); return SWIG_OK; } int JSCEmitter::close() { Delete(f_runtime); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(namespaces); Delete(f_wrap_cpp); return SWIG_OK; } int JSCEmitter::enterFunction(Node *n) { JSEmitter::enterFunction(n); return SWIG_OK; } int JSCEmitter::exitFunction(Node *n) { Template t_function = getTemplate("jsc_function_declaration"); bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; // handle overloaded functions if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { //state.function(WRAPPER_NAME, Swig_name_wrapper(Getattr(n, "name"))); // create dispatcher emitFunctionDispatcher(n, is_member); } else { //don't register wrappers of overloaded functions in function tables return SWIG_OK; } } t_function.replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)); if (is_member) { if (GetFlag(state.function(), IS_STATIC)) { t_function.pretty_print(state.clazz(STATIC_FUNCTIONS)); } else { t_function.pretty_print(state.clazz(MEMBER_FUNCTIONS)); } } else { t_function.pretty_print(Getattr(current_namespace, "functions")); } return SWIG_OK; } int JSCEmitter::enterVariable(Node *n) { JSEmitter::enterVariable(n); state.variable(GETTER, NULL_STR); state.variable(SETTER, VETO_SET); return SWIG_OK; } int JSCEmitter::exitVariable(Node *n) { Template t_variable(getTemplate("jsc_variable_declaration")); t_variable.replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)); if (GetFlag(n, "ismember")) { if (GetFlag(state.variable(), IS_STATIC) || Equal(Getattr(n, "nodeType"), "enumitem")) { t_variable.pretty_print(state.clazz(STATIC_VARIABLES)); } else { t_variable.pretty_print(state.clazz(MEMBER_VARIABLES)); } } else { t_variable.pretty_print(Getattr(current_namespace, "values")); } return SWIG_OK; } int JSCEmitter::enterClass(Node *n) { JSEmitter::enterClass(n); state.clazz(MEMBER_VARIABLES, NewString("")); state.clazz(MEMBER_FUNCTIONS, NewString("")); state.clazz(STATIC_VARIABLES, NewString("")); state.clazz(STATIC_FUNCTIONS, NewString("")); Template t_class_decl = getTemplate("jsc_class_declaration"); t_class_decl.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .pretty_print(f_wrappers); return SWIG_OK; } int JSCEmitter::exitClass(Node *n) { Template t_class_tables(getTemplate("jsc_class_tables")); t_class_tables.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsclassvariables", state.clazz(MEMBER_VARIABLES)) .replace("$jsclassfunctions", state.clazz(MEMBER_FUNCTIONS)) .replace("$jsstaticclassfunctions", state.clazz(STATIC_FUNCTIONS)) .replace("$jsstaticclassvariables", state.clazz(STATIC_VARIABLES)) .pretty_print(f_wrappers); /* adds the ctor wrappers at this position */ // Note: this is necessary to avoid extra forward declarations. //Append(f_wrappers, state.clazz(CTOR_WRAPPERS)); // for abstract classes add a vetoing ctor if (GetFlag(state.clazz(), IS_ABSTRACT)) { Template t_veto_ctor(getTemplate("js_veto_ctor")); t_veto_ctor.replace("$jswrapper", state.clazz(CTOR)) .replace("$jsname", state.clazz(NAME)) .pretty_print(f_wrappers); } /* adds a class template statement to initializer function */ Template t_classtemplate(getTemplate("jsc_class_definition")); /* prepare registration of base class */ String *jsclass_inheritance = NewString(""); Node *base_class = getBaseClass(n); if (base_class != NULL) { Template t_inherit(getTemplate("jsc_class_inherit")); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsbaseclassmangled", SwigType_manglestr(Getattr(base_class, "name"))) .pretty_print(jsclass_inheritance); } else { Template t_inherit(getTemplate("jsc_class_noinherit")); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .pretty_print(jsclass_inheritance); } t_classtemplate.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jsclass_inheritance", jsclass_inheritance) .replace("$jsctor", state.clazz(CTOR)) .replace("$jsdtor", state.clazz(DTOR)) .pretty_print(state.globals(INITIALIZER)); Delete(jsclass_inheritance); /* Note: this makes sure that there is a swig_type added for this class */ SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0")); /* adds a class registration statement to initializer function */ Template t_registerclass(getTemplate("jsc_class_registration")); t_registerclass.replace("$jsname", state.clazz(NAME)) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsnspace", Getattr(state.clazz("nspace"), NAME_MANGLED)) .pretty_print(state.globals(INITIALIZER)); return SWIG_OK; } Hash *JSCEmitter::createNamespaceEntry(const char *name, const char *parent) { Hash *entry = JSEmitter::createNamespaceEntry(name, parent); Setattr(entry, "functions", NewString("")); Setattr(entry, "values", NewString("")); return entry; } int JSCEmitter::emitNamespaces() { Iterator it; for (it = First(namespaces); it.item; it = Next(it)) { Hash *entry = it.item; String *name = Getattr(entry, NAME); String *name_mangled = Getattr(entry, NAME_MANGLED); String *parent = Getattr(entry, PARENT); String *parent_mangled = Swig_name_mangle(parent); String *functions = Getattr(entry, "functions"); String *variables = Getattr(entry, "values"); // skip the global namespace which is given by the application Template namespace_definition(getTemplate("jsc_nspace_declaration")); namespace_definition.replace("$jsglobalvariables", variables) .replace("$jsglobalfunctions", functions) .replace("$jsnspace", name_mangled) .replace("$jsmangledname", name_mangled) .pretty_print(f_wrap_cpp); Template t_createNamespace(getTemplate("jsc_nspace_definition")); t_createNamespace.replace("$jsmangledname", name_mangled); Append(state.globals(CREATE_NAMESPACES), t_createNamespace.str()); // Don't register 'exports' as namespace. It is return to the application. if (!Equal("exports", name)) { Template t_registerNamespace(getTemplate("jsc_nspace_registration")); t_registerNamespace.replace("$jsmangledname", name_mangled) .replace("$jsname", name) .replace("$jsparent", parent_mangled); Append(state.globals(REGISTER_NAMESPACES), t_registerNamespace.str()); } } return SWIG_OK; } JSEmitter *swig_javascript_create_JSCEmitter() { return new JSCEmitter(); } /********************************************************************** * V8: JSEmitter implementation for V8 engine **********************************************************************/ class V8Emitter:public JSEmitter { public: V8Emitter(); virtual ~ V8Emitter(); virtual int initialize(Node *n); virtual int dump(Node *n); virtual int close(); virtual int enterClass(Node *n); virtual int exitClass(Node *n); virtual int enterVariable(Node *n); virtual int exitVariable(Node *n); virtual int exitFunction(Node *n); protected: virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static); virtual int emitNamespaces(); protected: /* built-in parts */ String *f_runtime; String *f_header; String *f_init; String *f_post_init; /* part for class templates */ String *f_class_templates; /* parts for initilizer */ String *f_init_namespaces; String *f_init_class_templates; String *f_init_wrappers; String *f_init_inheritance; String *f_init_class_instances; String *f_init_static_wrappers; String *f_init_register_classes; String *f_init_register_namespaces; // the output cpp file File *f_wrap_cpp; String *NULL_STR; String *VETO_SET; String *moduleName; }; V8Emitter::V8Emitter() : JSEmitter(JSEmitter::V8), NULL_STR(NewString("0")), VETO_SET(NewString("JS_veto_set_variable")) { } V8Emitter::~V8Emitter() { Delete(NULL_STR); Delete(VETO_SET); } int V8Emitter::initialize(Node *n) { JSEmitter::initialize(n); moduleName = Getattr(n, "name"); // Get the output file name String *outfile = Getattr(n, "outfile"); f_wrap_cpp = NewFile(outfile, "w", SWIG_output_files()); if (!f_wrap_cpp) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_header = NewString(""); f_class_templates = NewString(""); f_init = NewString(""); f_post_init = NewString(""); f_init_namespaces = NewString(""); f_init_class_templates = NewString(""); f_init_wrappers = NewString(""); f_init_inheritance = NewString(""); f_init_class_instances = NewString(""); f_init_static_wrappers = NewString(""); f_init_register_classes = NewString(""); f_init_register_namespaces = NewString(""); // note: this is necessary for built-in generation of SWIG runtime code Swig_register_filebyname("begin", f_wrap_cpp); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("init", f_init); Swig_register_filebyname("post-init", f_post_init); state.globals(FORCE_CPP, NewString("1")); Swig_banner(f_wrap_cpp); return SWIG_OK; } int V8Emitter::dump(Node *n) { /* Get the module name */ String *module = Getattr(n, "name"); Template initializer_define(getTemplate("js_initializer_define")); initializer_define.replace("$jsname", module).pretty_print(f_header); SwigType_emit_type_table(f_runtime, f_wrappers); Printv(f_wrap_cpp, f_runtime, "\n", 0); Printv(f_wrap_cpp, f_header, "\n", 0); Printv(f_wrap_cpp, f_class_templates, "\n", 0); Printv(f_wrap_cpp, f_wrappers, "\n", 0); emitNamespaces(); // compose the initializer function using a template // filled with sub-parts Template initializer(getTemplate("js_initializer")); initializer.replace("$jsname", moduleName) .replace("$jsv8nspaces", f_init_namespaces) .replace("$jsv8classtemplates", f_init_class_templates) .replace("$jsv8wrappers", f_init_wrappers) .replace("$jsv8inheritance", f_init_inheritance) .replace("$jsv8classinstances", f_init_class_instances) .replace("$jsv8staticwrappers", f_init_static_wrappers) .replace("$jsv8registerclasses", f_init_register_classes) .replace("$jsv8registernspaces", f_init_register_namespaces); Printv(f_init, initializer.str(), 0); Printv(f_wrap_cpp, f_init, 0); Printv(f_wrap_cpp, f_post_init, 0); return SWIG_OK; } int V8Emitter::close() { Delete(f_runtime); Delete(f_header); Delete(f_class_templates); Delete(f_init_namespaces); Delete(f_init_class_templates); Delete(f_init_wrappers); Delete(f_init_inheritance); Delete(f_init_class_instances); Delete(f_init_static_wrappers); Delete(f_init_register_classes); Delete(f_init_register_namespaces); Delete(f_init); Delete(f_post_init); Delete(f_wrap_cpp); return SWIG_OK; } int V8Emitter::enterClass(Node *n) { JSEmitter::enterClass(n); // emit declaration of a v8 class template Template t_decl_class(getTemplate("jsv8_declare_class_template")); t_decl_class.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .trim() .pretty_print(f_class_templates); return SWIG_OK; } int V8Emitter::exitClass(Node *n) { if (GetFlag(state.clazz(), IS_ABSTRACT)) { Template t_veto_ctor(getTemplate("js_veto_ctor")); t_veto_ctor.replace("$jswrapper", state.clazz(CTOR)) .replace("$jsname", state.clazz(NAME)) .pretty_print(f_wrappers); } /* Note: this makes sure that there is a swig_type added for this class */ String *clientData = NewString(""); Printf(clientData, "&%s_clientData", state.clazz(NAME_MANGLED)); /* Note: this makes sure that there is a swig_type added for this class */ SwigType_remember_clientdata(state.clazz(TYPE_MANGLED), NewString("0")); // emit definition of v8 class template Template t_def_class = getTemplate("jsv8_define_class_template"); t_def_class.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.clazz(NAME)) .replace("$jsmangledtype", state.clazz(TYPE_MANGLED)) .replace("$jsdtor", state.clazz(DTOR)) .trim() .pretty_print(f_init_class_templates); Template t_class_instance = getTemplate("jsv8_create_class_instance"); t_class_instance.replace("$jsname", state.clazz(NAME)) .replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsctor", state.clazz(CTOR)) .trim() .pretty_print(f_init_class_instances); // emit inheritance setup Node *baseClass = getBaseClass(n); if (baseClass) { String *base_name = Getattr(baseClass, "name"); Template t_inherit = getTemplate("jsv8_inherit"); String *base_name_mangled = SwigType_manglestr(base_name); t_inherit.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsbaseclass", base_name_mangled) .trim() .pretty_print(f_init_inheritance); Delete(base_name_mangled); } // emit registeration of class template Template t_register = getTemplate("jsv8_register_class"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.clazz(NAME)) .replace("$jsparent", Getattr(state.clazz("nspace"), NAME_MANGLED)) .trim() .pretty_print(f_init_register_classes); return SWIG_OK; } int V8Emitter::enterVariable(Node *n) { JSEmitter::enterVariable(n); state.variable(GETTER, NULL_STR); state.variable(SETTER, VETO_SET); return SWIG_OK; } int V8Emitter::exitVariable(Node *n) { if (GetFlag(n, "ismember")) { if (GetFlag(state.variable(), IS_STATIC) || Equal(Getattr(n, "nodeType"), "enumitem")) { Template t_register = getTemplate("jsv8_register_static_variable"); t_register.replace("$jsparent", state.clazz(NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_static_wrappers); } else { Template t_register = getTemplate("jsv8_register_member_variable"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_wrappers); } } else { // Note: a global variable is treated like a static variable // with the parent being a nspace object (instead of class object) Template t_register = getTemplate("jsv8_register_static_variable"); t_register.replace("$jsparent", Getattr(current_namespace, NAME_MANGLED)) .replace("$jsname", state.variable(NAME)) .replace("$jsgetter", state.variable(GETTER)) .replace("$jssetter", state.variable(SETTER)) .trim() .pretty_print(f_init_wrappers); } return SWIG_OK; } int V8Emitter::exitFunction(Node *n) { bool is_member = GetFlag(n, "ismember") != 0 || GetFlag(n, "feature:extend") != 0; // create a dispatcher for overloaded functions bool is_overloaded = GetFlag(n, "sym:overloaded") != 0; if (is_overloaded) { if (!Getattr(n, "sym:nextSibling")) { //state.function(WRAPPER_NAME, Swig_name_wrapper(Getattr(n, "name"))); emitFunctionDispatcher(n, is_member); } else { //don't register wrappers of overloaded functions in function tables return SWIG_OK; } } // register the function at the specific context if (is_member) { if (GetFlag(state.function(), IS_STATIC)) { Template t_register = getTemplate("jsv8_register_static_function"); t_register.replace("$jsparent", state.clazz(NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_static_wrappers); } else { Template t_register = getTemplate("jsv8_register_member_function"); t_register.replace("$jsmangledname", state.clazz(NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_wrappers); } } else { // Note: a global function is treated like a static function // with the parent being a nspace object instead of class object Template t_register = getTemplate("jsv8_register_static_function"); t_register.replace("$jsparent", Getattr(current_namespace, NAME_MANGLED)) .replace("$jsname", state.function(NAME)) .replace("$jswrapper", state.function(WRAPPER_NAME)) .trim() .pretty_print(f_init_static_wrappers); } return SWIG_OK; } void V8Emitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { Parm *p; String *tm; int startIdx = 0; if (is_member && !is_static && mode != Ctor) { startIdx = 1; } // store number of arguments for argument checks int num_args = emit_num_arguments(parms) - startIdx; String *argcount = NewString(""); Printf(argcount, "%d", num_args); Setattr(n, ARGCOUNT, argcount); int i = 0; for (p = parms; p; i++) { String *arg = NewString(""); String *type = Getattr(p, "type"); // ignore varargs if (SwigType_isvarargs(type)) break; switch (mode) { case Getter: if (is_member && !is_static && i == 0) { Printv(arg, "info.Holder()", 0); } else { Printf(arg, "args[%d]", i - startIdx); } break; case Function: if (is_member && !is_static && i == 0) { Printv(arg, "args.Holder()", 0); } else { Printf(arg, "args[%d]", i - startIdx); } break; case Setter: if (is_member && !is_static && i == 0) { Printv(arg, "info.Holder()", 0); } else { Printv(arg, "value", 0); } break; case Ctor: Printf(arg, "args[%d]", i); break; default: throw "Illegal state."; } tm = emitInputTypemap(n, p, wrapper, arg); Delete(arg); if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } int V8Emitter::emitNamespaces() { Iterator it; for (it = First(namespaces); it.item; it = Next(it)) { Hash *entry = it.item; String *name = Getattr(entry, NAME); String *name_mangled = Getattr(entry, NAME_MANGLED); String *parent = Getattr(entry, PARENT); String *parent_mangled = Swig_name_mangle(parent); bool do_create = true; bool do_register = true; if (Equal(parent, "")) { do_register = false; } // Note: 'exports' is by convention the name of the object where // globals are stored into if (Equal(name, "exports")) { do_create = false; } if (do_create) { // create namespace object and register it to the parent scope Template t_create_ns = getTemplate("jsv8_create_namespace"); t_create_ns.replace("$jsmangledname", name_mangled) .trim() .pretty_print(f_init_namespaces); } if (do_register) { Template t_register_ns = getTemplate("jsv8_register_namespace"); t_register_ns.replace("$jsmangledname", name_mangled) .replace("$jsname", name) .replace("$jsparent", parent_mangled) .trim(); // prepend in order to achieve reversed order of registration statements String *tmp_register_stmt = NewString(""); t_register_ns.pretty_print(tmp_register_stmt); Insert(f_init_register_namespaces, 0, tmp_register_stmt); Delete(tmp_register_stmt); } } return SWIG_OK; } JSEmitter *swig_javascript_create_V8Emitter() { return new V8Emitter(); } /********************************************************************** * Helper implementations **********************************************************************/ JSEmitterState::JSEmitterState() : globalHash(NewHash()) { // initialize sub-hashes Setattr(globalHash, "class", NewHash()); Setattr(globalHash, "function", NewHash()); Setattr(globalHash, "variable", NewHash()); } JSEmitterState::~JSEmitterState() { Delete(globalHash); } DOH *JSEmitterState::getState(const char *key, bool new_key) { if (new_key) { Hash *hash = NewHash(); Setattr(globalHash, key, hash); } return Getattr(globalHash, key); } DOH *JSEmitterState::globals() { return globalHash; } DOH *JSEmitterState::globals(const char *key, DOH *initial) { if (initial != 0) { Setattr(globalHash, key, initial); } return Getattr(globalHash, key); } DOH *JSEmitterState::clazz(bool new_key) { return getState("class", new_key); } DOH *JSEmitterState::clazz(const char *key, DOH *initial) { DOH *c = clazz(); if (initial != 0) { Setattr(c, key, initial); } return Getattr(c, key); } DOH *JSEmitterState::function(bool new_key) { return getState("function", new_key); } DOH *JSEmitterState::function(const char *key, DOH *initial) { DOH *f = function(); if (initial != 0) { Setattr(f, key, initial); } return Getattr(f, key); } DOH *JSEmitterState::variable(bool new_key) { return getState("variable", new_key); } DOH *JSEmitterState::variable(const char *key, DOH *initial) { DOH *v = variable(); if (initial != 0) { Setattr(v, key, initial); } return Getattr(v, key); } /*static*/ int JSEmitterState::IsSet(DOH *val) { if (!val) { return 0; } else { const char *cval = Char(val); if (!cval) return 0; return (strcmp(cval, "0") != 0) ? 1 : 0; } } /* ----------------------------------------------------------------------------- * Template::Template() : creates a Template class for given template code * ----------------------------------------------------------------------------- */ Template::Template(const String *code_) { if (!code_) { Printf(stdout, "Template code was null. Illegal input for template."); SWIG_exit(EXIT_FAILURE); } code = NewString(code_); templateName = NewString(""); } Template::Template(const String *code_, const String *templateName_) { if (!code_) { Printf(stdout, "Template code was null. Illegal input for template."); SWIG_exit(EXIT_FAILURE); } code = NewString(code_); templateName = NewString(templateName_); } /* ----------------------------------------------------------------------------- * Template::~Template() : cleans up of Template. * ----------------------------------------------------------------------------- */ Template::~Template() { Delete(code); Delete(templateName); } /* ----------------------------------------------------------------------------- * String* Template::str() : retrieves the current content of the template. * ----------------------------------------------------------------------------- */ String *Template::str() { if (js_template_enable_debug) { String *pre_code = NewString(""); String *post_code = NewString(""); String *debug_code = NewString(""); Printf(pre_code, "/* begin fragment(\"%s\") */", templateName); Printf(post_code, "/* end fragment(\"%s\") */", templateName); Printf(debug_code, "%s\n%s\n%s\n", pre_code, code, post_code); Delete(code); Delete(pre_code); Delete(post_code); code = debug_code; } return code; } Template & Template::trim() { const char *str = Char(code); if (str == 0) return *this; int length = Len(code); if (length == 0) return *this; int idx; for (idx = 0; idx < length; ++idx) { if (str[idx] != ' ' && str[idx] != '\t' && str[idx] != '\r' && str[idx] != '\n') break; } int start_pos = idx; for (idx = length - 1; idx >= start_pos; --idx) { if (str[idx] != ' ' && str[idx] != '\t' && str[idx] != '\r' && str[idx] != '\n') break; } int end_pos = idx; int new_length = end_pos - start_pos + 1; char *newstr = new char[new_length + 1]; memcpy(newstr, str + start_pos, new_length); newstr[new_length] = 0; Delete(code); code = NewString(newstr); delete[]newstr; return *this; } /* ----------------------------------------------------------------------------- * Template& Template::replace(const String* pattern, const String* repl) : * * replaces all occurences of a given pattern with a given replacement. * * - pattern: the pattern to be replaced * - repl: the replacement string * - returns a reference to the Template to allow chaining of methods. * ----------------------------------------------------------------------------- */ Template & Template::replace(const String *pattern, const String *repl) { Replaceall(code, pattern, repl); return *this; } Template & Template::print(DOH *doh) { Printv(doh, str(), 0); return *this; } Template & Template::pretty_print(DOH *doh) { Wrapper_pretty_print(str(), doh); return *this; } Template::Template(const Template & t) { code = NewString(t.code); templateName = NewString(t.templateName); } void Template::operator=(const Template & t) { Delete(code); Delete(templateName); code = NewString(t.code); templateName = NewString(t.templateName); } swig-3.0.12/Source/Modules/directors.cxx0000664000175000017500000002164313042756442020035 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * directors.cxx * * Director support functions. * Not all of these may be necessary, and some may duplicate existing functionality * in SWIG. --MR * ----------------------------------------------------------------------------- */ #include "swigmod.h" /* Swig_csuperclass_call() * * Generates a fully qualified method call, including the full parameter list. * e.g. "base::method(i, j)" * */ String *Swig_csuperclass_call(String *base, String *method, ParmList *l) { String *call = NewString(""); int arg_idx = 0; Parm *p; if (base) { Printf(call, "%s::", base); } Printf(call, "%s(", method); for (p = l; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname && Cmp(Getattr(p, "type"), "void")) { pname = NewString(""); Printf(pname, "arg%d", arg_idx++); } if (p != l) Printf(call, ", "); Printv(call, pname, NIL); } Printf(call, ")"); return call; } /* Swig_class_declaration() * * Generate the start of a class/struct declaration. * e.g. "class myclass" * */ String *Swig_class_declaration(Node *n, String *name) { if (!name) { name = Getattr(n, "sym:name"); } String *result = NewString(""); String *kind = Getattr(n, "kind"); Printf(result, "%s %s", kind, name); return result; } String *Swig_class_name(Node *n) { String *name; name = Copy(Getattr(n, "sym:name")); return name; } /* Swig_director_declaration() * * Generate the full director class declaration, complete with base classes. * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" * */ String *Swig_director_declaration(Node *n) { String *classname = Swig_class_name(n); String *directorname = Language::instance()->directorClassName(n); String *base = Getattr(n, "classtype"); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director {\n", base); Delete(classname); Delete(directorname); return declaration; } String *Swig_method_call(const_String_or_char_ptr name, ParmList *parms) { String *func; int i = 0; int comma = 0; Parm *p = parms; SwigType *pt; String *nname; func = NewString(""); nname = SwigType_namestr(name); Printf(func, "%s(", nname); while (p) { String *pname; pt = Getattr(p, "type"); if ((SwigType_type(pt) != T_VOID)) { if (comma) Printf(func, ","); pname = Getattr(p, "name"); Printf(func, "%s", pname); comma = 1; i++; } p = nextSibling(p); } Printf(func, ")"); return func; } /* Swig_method_decl * * Misnamed and misappropriated! Taken from SWIG's type string manipulation utilities * and modified to generate full (or partial) type qualifiers for method declarations, * local variable declarations, and return value casting. More importantly, it merges * parameter type information with actual parameter names to produce a complete method * declaration that fully mirrors the original method declaration. * * There is almost certainly a saner way to do this. * * This function needs to be cleaned up and possibly split into several smaller * functions. For instance, attaching default names to parameters should be done in a * separate function. * */ String *Swig_method_decl(SwigType *rettype, SwigType *decl, const_String_or_char_ptr id, List *args, int strip, int values) { String *result; List *elements; String *element = 0, *nextelement; int is_const = 0; int nelements, i; int is_func = 0; int arg_idx = 0; if (id) { result = NewString(Char(id)); } else { result = NewString(""); } elements = SwigType_split(decl); nelements = Len(elements); if (nelements > 0) { element = Getitem(elements, 0); } for (i = 0; i < nelements; i++) { if (i < (nelements - 1)) { nextelement = Getitem(elements, i + 1); } else { nextelement = 0; } if (SwigType_isqualifier(element)) { int skip = 0; DOH *q = 0; if (!strip) { q = SwigType_parm(element); if (!Cmp(q, "const")) { is_const = 1; is_func = SwigType_isfunction(nextelement); if (is_func) skip = 1; skip = 1; } if (!skip) { Insert(result, 0, " "); Insert(result, 0, q); } Delete(q); } } else if (SwigType_isfunction(element)) { Parm *parm; String *p; Append(result, "("); parm = args; while (parm != 0) { String *type = Getattr(parm, "type"); String *name = Getattr(parm, "name"); if (!name && Cmp(type, "void")) { name = NewString(""); Printf(name, "arg%d", arg_idx++); Setattr(parm, "name", name); } if (!name) { name = NewString(""); } p = SwigType_str(type, name); Append(result, p); String *value = Getattr(parm, "value"); if (values && (value != 0)) { Printf(result, " = %s", value); } parm = nextSibling(parm); if (parm != 0) Append(result, ", "); } Append(result, ")"); } else if (rettype) { // This check is intended for conversion operators to a pointer/reference which needs the pointer/reference ignoring in the declaration if (SwigType_ispointer(element)) { Insert(result, 0, "*"); if ((nextelement) && ((SwigType_isfunction(nextelement) || (SwigType_isarray(nextelement))))) { Insert(result, 0, "("); Append(result, ")"); } } else if (SwigType_ismemberpointer(element)) { String *q; q = SwigType_parm(element); Insert(result, 0, "::*"); Insert(result, 0, q); if ((nextelement) && ((SwigType_isfunction(nextelement) || (SwigType_isarray(nextelement))))) { Insert(result, 0, "("); Append(result, ")"); } Delete(q); } else if (SwigType_isreference(element)) { Insert(result, 0, "&"); } else if (SwigType_isarray(element)) { DOH *size; Append(result, "["); size = SwigType_parm(element); Append(result, size); Append(result, "]"); Delete(size); } else { if (Strcmp(element, "v(...)") == 0) { Insert(result, 0, "..."); } else { String *bs = SwigType_namestr(element); Insert(result, 0, " "); Insert(result, 0, bs); Delete(bs); } } } element = nextelement; } Delete(elements); if (is_const) { if (is_func) { Append(result, " "); Append(result, "const"); } else { Insert(result, 0, "const "); } } Chop(result); if (rettype) { Insert(result, 0, " "); String *rtype = SwigType_str(rettype, 0); Insert(result, 0, rtype); Delete(rtype); } return result; } /* ----------------------------------------------------------------------------- * Swig_director_emit_dynamic_cast() * * In order to call protected virtual director methods from the target language, we need * to add an extra dynamic_cast to call the public C++ wrapper in the director class. * Also for non-static protected members when the allprotected option is on. * ----------------------------------------------------------------------------- */ void Swig_director_emit_dynamic_cast(Node *n, Wrapper *f) { // TODO: why is the storage element removed in staticmemberfunctionHandler ?? if ((!is_public(n) && (is_member_director(n) || GetFlag(n, "explicitcall"))) || (is_non_virtual_protected_access(n) && !(Swig_storage_isstatic_custom(n, "staticmemberfunctionHandler:storage") || Swig_storage_isstatic(n)) && !Equal(nodeType(n), "constructor"))) { Node *parent = Getattr(n, "parentNode"); String *dirname; String *dirdecl; dirname = Language::instance()->directorClassName(parent); dirdecl = NewStringf("%s *darg = 0", dirname); Wrapper_add_local(f, "darg", dirdecl); Printf(f->code, "darg = dynamic_cast<%s *>(arg1);\n", dirname); Delete(dirname); Delete(dirdecl); } } /* ------------------------------------------------------------ * Swig_director_parms_fixup() * * For each parameter in the C++ member function, copy the parameter name * to its "lname"; this ensures that Swig_typemap_attach_parms() will do * the right thing when it sees strings like "$1" in "directorin" typemaps. * ------------------------------------------------------------ */ void Swig_director_parms_fixup(ParmList *parms) { Parm *p; int i; for (i = 0, p = parms; p; p = nextSibling(p), ++i) { String *arg = Getattr(p, "name"); String *lname = 0; if (!arg && !Equal(Getattr(p, "type"), "void")) { lname = NewStringf("arg%d", i); Setattr(p, "name", lname); } else lname = Copy(arg); Setattr(p, "lname", lname); Delete(lname); } } swig-3.0.12/Source/Modules/xml.cxx0000664000175000017500000002110313042756442016626 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * xml.cxx * * An Xml parse tree generator. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static const char *usage = "\ XML Options (available with -xml)\n\ -xmllang - Typedef language\n\ -xmllite - More lightweight version of XML\n\ ------\n\ deprecated (use -o): -xml - Use as output file (extension .xml mandatory)\n"; static File *out = 0; static int xmllite = 0; class XML:public Language { public: int indent_level; long id; XML() :indent_level(0) , id(0) { } virtual ~ XML() { } virtual void main(int argc, char *argv[]) { SWIG_typemap_lang("xml"); for (int iX = 0; iX < argc; iX++) { if (strcmp(argv[iX], "-xml") == 0) { char *extension = 0; if (iX + 1 >= argc) continue; extension = argv[iX + 1] + strlen(argv[iX + 1]) - 4; if (strcmp(extension, ".xml")) continue; iX++; Swig_mark_arg(iX); String *outfile = NewString(argv[iX]); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } continue; } if (strcmp(argv[iX], "-xmllang") == 0) { Swig_mark_arg(iX); iX++; SWIG_typemap_lang(argv[iX]); Swig_mark_arg(iX); continue; } if (strcmp(argv[iX], "-help") == 0) { fputs(usage, stdout); } if (strcmp(argv[iX], "-xmllite") == 0) { Swig_mark_arg(iX); xmllite = 1; } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGXML 1", 0); } /* Top of the parse tree */ virtual int top(Node *n) { if (out == 0) { String *outfile = Getattr(n, "outfile"); String *ext = Swig_file_extension(outfile); // If there's an extension, ext will include the ".". Delslice(outfile, Len(outfile) - Len(ext), DOH_END); Delete(ext); Append(outfile, ".xml"); out = NewFile(outfile, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } } Printf(out, " \n"); Xml_print_tree(n); return SWIG_OK; } void print_indent(int l) { int i; for (i = 0; i < indent_level; i++) { Printf(out, " "); } if (l) { Printf(out, " "); } } void Xml_print_tree(DOH *obj) { while (obj) { Xml_print_node(obj); obj = nextSibling(obj); } } void Xml_print_attributes(Node *obj) { String *k; indent_level += 4; print_indent(0); Printf(out, "\n", ++id, obj); indent_level += 4; Iterator ki; ki = First(obj); while (ki.key) { k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "module") == 0) { Xml_print_module(Getattr(obj, k)); } else if (Cmp(k, "baselist") == 0) { Xml_print_baselist(Getattr(obj, k)); } else if (!xmllite && Cmp(k, "typescope") == 0) { Xml_print_typescope(Getattr(obj, k)); } else if (!xmllite && Cmp(k, "typetab") == 0) { Xml_print_typetab(Getattr(obj, k)); } else if (Cmp(k, "kwargs") == 0) { Xml_print_kwargs(Getattr(obj, k)); } else if (Cmp(k, "parms") == 0 || Cmp(k, "pattern") == 0) { Xml_print_parmlist(Getattr(obj, k)); } else if (Cmp(k, "catchlist") == 0 || Cmp(k, "templateparms") == 0) { Xml_print_parmlist(Getattr(obj, k), Char(k)); } else { DOH *o; print_indent(0); if (DohIsString(Getattr(obj, k))) { String *ck = NewString(k); o = Str(Getattr(obj, k)); Replaceall(ck, ":", "_"); Replaceall(ck, "<", "<"); /* Do first to avoid aliasing errors. */ Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Replaceall(o, "\"", """); Replaceall(o, "\\", "\\\\"); Replaceall(o, "\n", " "); Printf(out, "\n", ck, o, ++id, o); Delete(o); Delete(ck); } else { o = Getattr(obj, k); String *ck = NewString(k); Replaceall(ck, ":", "_"); Printf(out, "\n", ck, o, ++id, o); Delete(ck); } } ki = Next(ki); } indent_level -= 4; print_indent(0); Printf(out, "\n"); indent_level -= 4; } void Xml_print_node(Node *obj) { Node *cobj; print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", nodeType(obj), ++id, obj); Xml_print_attributes(obj); cobj = firstChild(obj); if (cobj) { indent_level += 4; Printf(out, "\n"); Xml_print_tree(cobj); indent_level -= 4; } else { print_indent(1); Printf(out, "\n"); } print_indent(0); Printf(out, "\n", nodeType(obj)); } void Xml_print_parmlist(ParmList *p, const char* markup = "parmlist") { print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", markup, ++id, p); indent_level += 4; while (p) { print_indent(0); Printf(out, "\n", ++id); Xml_print_attributes(p); print_indent(0); Printf(out, "\n"); p = nextSibling(p); } indent_level -= 4; print_indent(0); Printf(out, "\n", markup); } void Xml_print_baselist(List *p) { print_indent(0); Printf(out, "\n", ++id, p); indent_level += 4; Iterator s; for (s = First(p); s.item; s = Next(s)) { print_indent(0); String *item_name = Xml_escape_string(s.item); Printf(out, "\n", item_name, ++id, s.item); Delete(item_name); } indent_level -= 4; print_indent(0); Printf(out, "\n"); } String *Xml_escape_string(String *str) { String *escaped_str = 0; if (str) { escaped_str = NewString(str); Replaceall(escaped_str, "&", "&"); Replaceall(escaped_str, "<", "<"); Replaceall(escaped_str, "\"", """); Replaceall(escaped_str, "\\", "\\\\"); Replaceall(escaped_str, "\n", " "); } return escaped_str; } void Xml_print_module(Node *p) { print_indent(0); Printf(out, "\n", Getattr(p, "name"), ++id, p); } void Xml_print_kwargs(Hash *p) { Xml_print_hash(p, "kwargs"); } void Xml_print_typescope(Hash *p) { Xml_print_hash(p, "typescope"); } void Xml_print_typetab(Hash *p) { Xml_print_hash(p, "typetab"); } void Xml_print_hash(Hash *p, const char *markup) { print_indent(0); Printf(out, "<%s id=\"%ld\" addr=\"%p\" >\n", markup, ++id, p); Xml_print_attributes(p); indent_level += 4; Iterator n = First(p); while (n.key) { print_indent(0); Printf(out, "<%ssitem id=\"%ld\" addr=\"%p\" >\n", markup, ++id, n.item); Xml_print_attributes(n.item); print_indent(0); Printf(out, "\n", markup); n = Next(n); } indent_level -= 4; print_indent(0); Printf(out, "\n", markup); } }; /* ----------------------------------------------------------------------------- * Swig_print_xml * * Dump an XML version of the parse tree. This is different from using the -xml * language module normally as it allows the real language module to process the * tree first, possibly stuffing in new attributes, so the XML that is output ends * up being a post-processing version of the tree. * ----------------------------------------------------------------------------- */ void Swig_print_xml(DOH *obj, String *filename) { XML xml; xmllite = 1; if (!filename) { out = stdout; } else { out = NewFile(filename, "w", SWIG_output_files()); if (!out) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } } Printf(out, " \n"); xml.Xml_print_tree(obj); } static Language *new_swig_xml() { return new XML(); } extern "C" Language *swig_xml(void) { return new_swig_xml(); } swig-3.0.12/Source/Modules/d.cxx0000664000175000017500000047353213042756442016272 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * d.cxx * * D language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include // Hash type used for storing information about director callbacks for a class. typedef DOH UpcallData; class D : public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; /* * Files and file sections containing C/C++ code. */ File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; List *filenames_list; /* * Command line-set modes of operation. */ // Whether a single proxy D module is generated or classes and enums are // written to their own files. bool split_proxy_dmodule; // The major D version targeted (currently 1 or 2). unsigned short d_version; /* * State variables which indicate what is being wrapped at the moment. * This is probably not the most elegant way of handling state, but it has * proven to work in the C# and Java modules. */ // Indicates if wrapping a native function. bool native_function_flag; // Indicates if wrapping a static functions or member variables bool static_flag; // Indicates if wrapping a nonstatic member variable bool variable_wrapper_flag; // Indicates if wrapping a member variable/enum/const. bool wrapping_member_flag; // Indicates if wrapping a global variable. bool global_variable_flag; // Name of a variable being wrapped. String *variable_name; /* * Variables temporarily holding the generated C++ code. */ // C++ code for the generated wrapper functions for casts up the C++ // for inheritance hierarchies. String *upcasts_code; // Function pointer typedefs for handling director callbacks on the C++ side. String *director_callback_typedefs; // Variables for storing the function pointers to the director callbacks on // the C++ side. String *director_callback_pointers; /* * Names of generated D entities. */ // The name of the D module containing the interface to the C wrapper. String *im_dmodule_name; // The fully qualified name of the wrap D module (package name included). String *im_dmodule_fq_name; // The name of the proxy module which exposes the (SWIG) module contents as a // D module. String *proxy_dmodule_name; // The fully qualified name of the proxy D module. String *proxy_dmodule_fq_name; // Optional: Package the D modules are placed in (set via the -package // command line option). String *package; // The directory the generated D module files are written to. Is constructed // from the package path if a target package is set, points to the general // output directory otherwise. String *dmodule_directory; // The name of the library which contains the C wrapper (used when generating // the dynamic library loader). Can be overridden via the -wrapperlibrary // command line flag. String *wrap_library_name; /* * Variables temporarily holding the generated D code. */ // Import statements written to the intermediary D module header set via // %pragma(d) imdmoduleimports. String *im_dmodule_imports; // The code for the intermediary D module body. String *im_dmodule_code; // Import statements for all proxy modules (the main proxy module and, if in // split proxy module mode, the proxy class modules) from // %pragma(d) globalproxyimports. String *global_proxy_imports; // The D code for the main proxy modules. nspace_proxy_dmodules is a hash from // the namespace name as key to an {"imports", "code"}. If the nspace feature // is not active, only proxy_dmodule_imports and proxy_dmodule_code are used, // which contain the code for the root proxy module. // // These variables should not be accessed directly but rather via the // proxy{Imports, Code}Buffer)() helper functions which return the right // buffer for a given namespace. If not in split proxy mode, they contain the // whole proxy code. String *proxy_dmodule_imports; String *proxy_dmodule_code; Hash *nspace_proxy_dmodules; // The D code generated for the currently processed enum. String *proxy_enum_code; /* * D data for the current proxy class. * * These strings are mainly used to temporarily accumulate code from the * various member handling functions while a single class is processed and are * no longer relevant once that class has been finished, i.e. after * classHandler() has returned. */ // The unqualified name of the current proxy class. String *proxy_class_name; // The name of the current proxy class, qualified with the name of the // namespace it is in, if any. String *proxy_class_qname; // The import directives for the current proxy class. They are written to the // same D module the proxy class is written to. String *proxy_class_imports; // Code for enumerations nested in the current proxy class. Is emitted earlier // than the rest of the body to work around forward referencing-issues. String *proxy_class_enums_code; // The generated D code making up the body of the current proxy class. String *proxy_class_body_code; // D code which is emitted right after the proxy class. String *proxy_class_epilogue_code; // The full code for the current proxy class, including the epilogue. String* proxy_class_code; // Contains a D call to the function wrapping C++ the destructor of the // current class (if there is a public C++ destructor). String *destructor_call; // D code for the director callbacks generated for the current class. String *director_dcallbacks_code; /* * Code for dynamically loading the wrapper library on the D side. */ // D code which is inserted into the im D module if dynamic linking is used. String *wrapper_loader_code; // The D code to bind a function pointer to a library symbol. String *wrapper_loader_bind_command; // The cumulated binding commands binding all the functions declared in the // intermediary D module to the C/C++ library symbols. String *wrapper_loader_bind_code; /* * Director data. */ List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int first_class_dmethod; int curr_class_dmethod; /* * SWIG types data. */ // Collects information about encountered types SWIG does not know about (e.g. // incomplete types). This is used later to generate type wrapper proxy // classes for the unknown types. Hash *unknown_types; public: /* --------------------------------------------------------------------------- * D::D() * --------------------------------------------------------------------------- */ D():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), filenames_list(NULL), split_proxy_dmodule(false), d_version(1), native_function_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), variable_name(NULL), upcasts_code(NULL), director_callback_typedefs(NULL), director_callback_pointers(NULL), im_dmodule_name(NULL), im_dmodule_fq_name(NULL), proxy_dmodule_name(NULL), proxy_dmodule_fq_name(NULL), package(NULL), dmodule_directory(NULL), wrap_library_name(NULL), im_dmodule_imports(NULL), im_dmodule_code(NULL), global_proxy_imports(NULL), proxy_dmodule_imports(NULL), proxy_dmodule_code(NULL), nspace_proxy_dmodules(NULL), proxy_enum_code(NULL), proxy_class_name(NULL), proxy_class_qname(NULL), proxy_class_imports(NULL), proxy_class_enums_code(NULL), proxy_class_body_code(NULL), proxy_class_epilogue_code(NULL), proxy_class_code(NULL), destructor_call(NULL), director_dcallbacks_code(NULL), wrapper_loader_code(NULL), wrapper_loader_bind_command(NULL), wrapper_loader_bind_code(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), first_class_dmethod(0), curr_class_dmethod(0), unknown_types(NULL) { // For now, multiple inheritance with directors is not possible. It should be // easy to implement though. director_multiple_inheritance = 0; director_language = 1; // Not used: Delete(none_comparison); none_comparison = NewString(""); } /* --------------------------------------------------------------------------- * D::main() * --------------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("d"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if ((strcmp(argv[i], "-d2") == 0)) { Swig_mark_arg(i); d_version = 2; } else if (strcmp(argv[i], "-wrapperlibrary") == 0) { if (argv[i + 1]) { wrap_library_name = NewString(""); Printf(wrap_library_name, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(""); Printf(package, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-splitproxy") == 0)) { Swig_mark_arg(i); split_proxy_dmodule = true; } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGD 1", 0); // Also make the target D version available as preprocessor symbol for // use in our library files. String *version_define = NewStringf("SWIG_D_VERSION %u", d_version); Preprocessor_define(version_define, 0); Delete(version_define); // Add typemap definitions SWIG_typemap_lang("d"); SWIG_config_file("d.swg"); allow_overloading(); } /* --------------------------------------------------------------------------- * D::top() * --------------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "imdmodulename")) { im_dmodule_name = Copy(Getattr(optionsnode, "imdmodulename")); } if (Getattr(optionsnode, "directors")) { // Check if directors are enabled for this module. Note: This is a // "master switch", if it is not set, not director code will be emitted // at all. %feature("director") statements are also required to enable // directors for individual classes or methods. // // Use the »directors« attributte of the %module directive to enable // director generation (e.g. »%module(directors="1") modulename«). allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); unknown_types = NewHash(); filenames_list = NewList(); // Make the package name and the resulting module output path. if (package) { // Append a dot so we can prepend the package variable directly to the // module names in the rest of the code. Printv(package, ".", NIL); } else { // Write the generated D modules to the »root« package by default. package = NewString(""); } dmodule_directory = Copy(SWIG_output_directory()); if (Len(package) > 0) { String *package_directory = Copy(package); Replaceall(package_directory, ".", SWIG_FILE_DELIMITER); Printv(dmodule_directory, package_directory, NIL); Delete(package_directory); } // Make the wrap and proxy D module names. // The wrap module name can be set in the module directive. if (!im_dmodule_name) { im_dmodule_name = NewStringf("%s_im", Getattr(n, "name")); } im_dmodule_fq_name = NewStringf("%s%s", package, im_dmodule_name); proxy_dmodule_name = Copy(Getattr(n, "name")); proxy_dmodule_fq_name = NewStringf("%s%s", package, proxy_dmodule_name); im_dmodule_code = NewString(""); proxy_class_imports = NewString(""); proxy_class_enums_code = NewString(""); proxy_class_body_code = NewString(""); proxy_class_epilogue_code = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); proxy_dmodule_code = NewString(""); proxy_dmodule_imports = NewString(""); nspace_proxy_dmodules = NewHash(); im_dmodule_imports = NewString(""); upcasts_code = NewString(""); global_proxy_imports = NewString(""); wrapper_loader_code = NewString(""); wrapper_loader_bind_command = NewString(""); wrapper_loader_bind_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; // By default, expect the dynamically loaded wrapper library to be named // [lib]_wrap[.so/.dll]. if (!wrap_library_name) wrap_library_name = NewStringf("%s_wrap", Getattr(n, "name")); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGD\n#define SWIGD\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", proxy_dmodule_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", proxy_dmodule_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); Swig_name_register("wrapper", "D_%f"); Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); // Emit all the wrapper code. Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (before %header section). Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the wrap D module. // TODO: Add support for »static« linking. { String *filen = NewStringf("%s%s.d", dmodule_directory, im_dmodule_name); File *im_d_file = NewFile(filen, "w", SWIG_output_files()); if (!im_d_file) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; // Start writing out the intermediary class file. emitBanner(im_d_file); Printf(im_d_file, "module %s;\n", im_dmodule_fq_name); Printv(im_d_file, im_dmodule_imports, "\n", NIL); Replaceall(wrapper_loader_code, "$wraplibrary", wrap_library_name); Replaceall(wrapper_loader_code, "$wrapperloaderbindcode", wrapper_loader_bind_code); Replaceall(wrapper_loader_code, "$module", proxy_dmodule_name); Printf(im_d_file, "%s\n", wrapper_loader_code); // Add the wrapper function declarations. replaceModuleVariables(im_dmodule_code); Printv(im_d_file, im_dmodule_code, NIL); Delete(im_d_file); } // Generate the main D proxy module. { String *filen = NewStringf("%s%s.d", dmodule_directory, proxy_dmodule_name); File *proxy_d_file = NewFile(filen, "w", SWIG_output_files()); if (!proxy_d_file) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(proxy_d_file); Printf(proxy_d_file, "module %s;\n", proxy_dmodule_fq_name); Printf(proxy_d_file, "\nstatic import %s;\n", im_dmodule_fq_name); Printv(proxy_d_file, global_proxy_imports, NIL); Printv(proxy_d_file, proxy_dmodule_imports, NIL); Printv(proxy_d_file, "\n", NIL); // Write a D type wrapper class for each SWIG type to the proxy module code. for (Iterator swig_type = First(unknown_types); swig_type.key; swig_type = Next(swig_type)) { writeTypeWrapperClass(swig_type.key, swig_type.item); } // Add the proxy functions (and classes, if they are not written to a separate file). replaceModuleVariables(proxy_dmodule_code); Printv(proxy_d_file, proxy_dmodule_code, NIL); Delete(proxy_d_file); } // Generate the additional proxy modules for nspace support. for (Iterator it = First(nspace_proxy_dmodules); it.key; it = Next(it)) { String *module_name = createLastNamespaceName(it.key); String *filename = NewStringf("%s%s.d", outputDirectory(it.key), module_name); File *file = NewFile(filename, "w", SWIG_output_files()); if (!file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Delete(filename); emitBanner(file); Printf(file, "module %s%s.%s;\n", package, it.key, module_name); Printf(file, "\nstatic import %s;\n", im_dmodule_fq_name); Printv(file, global_proxy_imports, NIL); Printv(file, Getattr(it.item, "imports"), NIL); Printv(file, "\n", NIL); String *code = Getattr(it.item, "code"); replaceModuleVariables(code); Printv(file, code, NIL); Delete(file); Delete(module_name); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(unknown_types); unknown_types = NULL; Delete(filenames_list); filenames_list = NULL; Delete(im_dmodule_name); im_dmodule_name = NULL; Delete(im_dmodule_fq_name); im_dmodule_fq_name = NULL; Delete(im_dmodule_code); im_dmodule_code = NULL; Delete(proxy_class_imports); proxy_class_imports = NULL; Delete(proxy_class_enums_code); proxy_class_enums_code = NULL; Delete(proxy_class_body_code); proxy_class_body_code = NULL; Delete(proxy_class_epilogue_code); proxy_class_epilogue_code = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(destructor_call); destructor_call = NULL; Delete(proxy_dmodule_name); proxy_dmodule_name = NULL; Delete(proxy_dmodule_fq_name); proxy_dmodule_fq_name = NULL; Delete(proxy_dmodule_code); proxy_dmodule_code = NULL; Delete(proxy_dmodule_imports); proxy_dmodule_imports = NULL; Delete(nspace_proxy_dmodules); nspace_proxy_dmodules = NULL; Delete(im_dmodule_imports); im_dmodule_imports = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(global_proxy_imports); global_proxy_imports = NULL; Delete(wrapper_loader_code); wrapper_loader_code = NULL; Delete(wrapper_loader_bind_code); wrapper_loader_bind_code = NULL; Delete(wrapper_loader_bind_command); wrapper_loader_bind_command = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; Delete(package); package = NULL; Delete(dmodule_directory); dmodule_directory = NULL; n_dmethods = 0; // Merge all the generated C/C++ code and close the output files. Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::insertDirective() * --------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); replaceModuleVariables(code); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_body_code) { Swig_typemap_replace_embedded_typemap(code, n); Printv(proxy_class_body_code, code, NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* --------------------------------------------------------------------------- * D::pragmaDirective() * * Valid Pragmas: * imdmodulecode - text (D code) is copied verbatim to the wrap module * imdmoduleimports - import statements for the im D module * * proxydmodulecode - text (D code) is copied verbatim to the proxy module * (the main proxy module if in split proxy mode). * globalproxyimports - import statements inserted into _all_ proxy modules. * * wrapperloadercode - D code for loading the wrapper library (is copied to * the im D module). * wrapperloaderbindcommand - D code for binding a symbol from the wrapper * library to the declaration in the im D module. * --------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "d") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "imdmodulecode") == 0) { Printf(im_dmodule_code, "%s\n", strvalue); } else if (Strcmp(code, "imdmoduleimports") == 0) { replaceImportTypeMacros(strvalue); Chop(strvalue); Printf(im_dmodule_imports, "%s\n", strvalue); } else if (Strcmp(code, "proxydmodulecode") == 0) { Printf(proxyCodeBuffer(0), "%s\n", strvalue); } else if (Strcmp(code, "globalproxyimports") == 0) { replaceImportTypeMacros(strvalue); Chop(strvalue); Printf(global_proxy_imports, "%s\n", strvalue); } else if (Strcmp(code, "wrapperloadercode") == 0) { Delete(wrapper_loader_code); wrapper_loader_code = Copy(strvalue); } else if (Strcmp(code, "wrapperloaderbindcommand") == 0) { Delete(wrapper_loader_bind_command); wrapper_loader_bind_command = Copy(strvalue); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* --------------------------------------------------------------------------- * D::enumDeclaration() * * Wraps C/C++ enums as D enums. * --------------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (ImportMode) return SWIG_OK; if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; proxy_enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *typemap_lookup_type = Getattr(n, "name"); // Emit the enum declaration. if (typemap_lookup_type) { const String *enummodifiers = lookupCodeTypemap(n, "dclassmodifiers", typemap_lookup_type, WARN_D_TYPEMAP_CLASSMOD_UNDEF); Printv(proxy_enum_code, "\n", enummodifiers, " ", symname, " {\n", NIL); } else { // Handle anonymous enums. Printv(proxy_enum_code, "\nenum {\n", NIL); } // Emit each enum item. Language::enumDeclaration(n); if (GetFlag(n, "nonempty")) { // Finish the enum. if (typemap_lookup_type) { Printv(proxy_enum_code, lookupCodeTypemap(n, "dcode", typemap_lookup_type, WARN_NONE), // Extra D code "\n}\n", NIL); } else { // Handle anonymous enums. Printv(proxy_enum_code, "\n}\n", NIL); } Replaceall(proxy_enum_code, "$dclassname", symname); } else { // D enum declarations must have at least one member to be legal, so emit // an alias to int instead (their ctype/imtype is always int). Delete(proxy_enum_code); proxy_enum_code = NewStringf("\nalias int %s;\n", symname); } const String* imports = lookupCodeTypemap(n, "dimports", typemap_lookup_type, WARN_NONE); String* imports_trimmed; if (Len(imports) > 0) { imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(imports_trimmed, "\n", NIL); } else { imports_trimmed = NewString(""); } if (is_wrapping_class()) { // Enums defined within the C++ class are written into the proxy // class. Printv(proxy_class_imports, imports_trimmed, NIL); Printv(proxy_class_enums_code, proxy_enum_code, NIL); } else { // Write non-anonymous enums to their own file if in split proxy module // mode. if (split_proxy_dmodule && typemap_lookup_type) { assertClassNameValidity(proxy_class_name); String *nspace = Getattr(n, "sym:nspace"); String *output_directory = outputDirectory(nspace); String *filename = NewStringf("%s%s.d", output_directory, symname); Delete(output_directory); File *class_file = NewFile(filename, "w", SWIG_output_files()); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); if (nspace) { Printf(class_file, "module %s%s.%s;\n", package, nspace, symname); } else { Printf(class_file, "module %s%s;\n", package, symname); } Printv(class_file, imports_trimmed, NIL); Printv(class_file, proxy_enum_code, NIL); Delete(class_file); } else { String *nspace = Getattr(n, "sym:nspace"); Printv(proxyImportsBuffer(nspace), imports, NIL); Printv(proxyCodeBuffer(nspace), proxy_enum_code, NIL); } } Delete(imports_trimmed); Delete(proxy_enum_code); proxy_enum_code = NULL; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::enumvalueDeclaration() * --------------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); String *tmpValue; // Strange hack from parent method. // RESEARCH: What is this doing? if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(escape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } // Emit the enum item. { if (!GetFlag(n, "firstenumitem")) Printf(proxy_enum_code, ",\n"); Printf(proxy_enum_code, " %s", Getattr(n, "sym:name")); // Check for the %dconstvalue feature String *value = Getattr(n, "feature:d:constvalue"); // Note that in D, enum values must be compile-time constants. Thus, // %dmanifestconst(0) (getting the enum values at runtime) is not supported. value = value ? value : Getattr(n, "enumvalue"); if (value) { Printf(proxy_enum_code, " = %s", value); } // Keep track that the currently processed enum has at least one value. SetFlag(parent, "nonempty"); } Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::memberfunctionHandler() * --------------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, overloaded_name); Setattr(n, "imfuncname", intermediary_function_name); String *proxy_func_name = Getattr(n, "sym:name"); Setattr(n, "proxyfuncname", proxy_func_name); if (split_proxy_dmodule && Len(Getattr(n, "parms")) == 0 && Strncmp(proxy_func_name, package, Len(proxy_func_name)) == 0) { // If we are in split proxy mode and the function is named like the // target package, the D compiler is unable to resolve the ambiguity // between the package name and an argument-less function call. // TODO: This might occur with nspace as well, augment the check. Swig_warning(WARN_D_NAME_COLLISION, input_file, line_number, "%s::%s might collide with the package name, consider using %%rename to resolve the ambiguity.\n", proxy_class_name, proxy_func_name); } writeProxyClassFunction(n); Delete(overloaded_name); // For each function, look if we have to alias in the parent class function // for the overload resolution process to work as expected from C++ // (http://www.digitalmars.com/d/2.0/function.html#function-inheritance). // For multiple overloads, only emit the alias directive once (for the // last method, »sym:nextSibling« is null then). // Smart pointer classes do not mirror the inheritance hierarchy of the // underlying types, so aliasing the base class methods in is not required // for them. // DMD BUG: We have to emit the alias after the last function becasue // taking a delegate in the overload checking code fails otherwise // (http://d.puremagic.com/issues/show_bug.cgi?id=4860). if (!Getattr(n, "sym:nextSibling") && !is_smart_pointer() && !areAllOverloadsOverridden(n)) { String *name = Getattr(n, "sym:name"); Printf(proxy_class_body_code, "\nalias $dbaseclass.%s %s;\n", name, name); } return SWIG_OK; } /* --------------------------------------------------------------------------- * D::staticmemberfunctionHandler() * --------------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); writeProxyClassFunction(n); Delete(overloaded_name); static_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::globalvariableHandler() * --------------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; return ret; } /* --------------------------------------------------------------------------- * D::membervariableHandler() * --------------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::staticmembervariableHandler() * --------------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { if (GetFlag(n, "feature:d:manifestconst") != 1) { Delattr(n, "value"); } variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::memberconstantHandler() * --------------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::constructorHandler() * --------------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloadedprocess in D. if (Getattr(n, "overload:ignore")) { return SWIG_OK; } ParmList *l = Getattr(n, "parms"); String *tm; String *proxy_constructor_code = NewString(""); int i; // Holds code for the constructor helper method generated only when the din // typemap has code in the pre or post attributes. String *helper_code = NewString(""); String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); NewString(""); String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); // Typemaps were attached earlier to the node, get the return type of the // call to the C++ constructor wrapper. const String *wrapper_return_type = lookupDTypemap(n, "imtype", true); String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type in // the typemap itself. wrapper_return_type = imtypeout; } Printf(proxy_constructor_code, "\n%s this(", methodmods); Printf(helper_code, "static private %s SwigConstruct%s(", wrapper_return_type, proxy_class_name); Printv(imcall, im_dmodule_fq_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ Parm *p = l; for (i = 0; p; i++) { if (checkAttribute(p, "varargs:ignore", "1")) { // Skip ignored varargs. p = nextSibling(p); continue; } if (checkAttribute(p, "tmap:in:numinputs", "0")) { // Skip ignored parameters. p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); // Get the D parameter type. if ((tm = lookupDTypemap(p, "dtype", true))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); String *parmtype = 0; // Get the D code to convert the parameter value to the type used in the // intermediary D module. if ((tm = lookupDTypemap(p, "din"))) { Replaceall(tm, "$dinput", arg); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } parmtype = Getattr(p, "tmap:din:parmtype"); if (parmtype) Replaceall(parmtype, "$dinput", arg); Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(proxy_constructor_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(proxy_constructor_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", parmtype ? parmtype : arg); ++gencomma; Delete(parmtype); Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(proxy_constructor_code, ")"); Printf(helper_code, ")"); // Insert the dconstructor typemap (replacing $directorconnect as needed). Hash *attributes = NewHash(); String *construct_tm = Copy(lookupCodeTypemap(n, "dconstructor", Getattr(n, "name"), WARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF, attributes)); if (construct_tm) { const bool use_director = (parentNode(n) && Swig_directorclass(n)); if (!use_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:dconstructor:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_D_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"dconstructor\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(proxy_constructor_code, " ", construct_tm, NIL); } replaceExcode(n, proxy_constructor_code, "dconstructor", attributes); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } if (is_terminator_code) { Printv(helper_code, "\n", terminator_code, NIL); } Printf(helper_code, "\n}\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); Replaceall(proxy_constructor_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(proxy_constructor_code, "$imcall", imcall); } Printv(proxy_class_body_code, proxy_constructor_code, "\n", NIL); Delete(helper_args); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::destructorHandler() * --------------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); Printv(destructor_call, im_dmodule_fq_name, ".", Swig_name_destroy(getNSpace(),symname), "(cast(void*)swigCPtr)", NIL); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classHandler() * --------------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String *nspace = getNSpace(); File *class_file = NULL; proxy_class_name = Copy(Getattr(n, "sym:name")); if (nspace) { proxy_class_qname = NewStringf("%s.%s", nspace, proxy_class_name); } else { proxy_class_qname = Copy(proxy_class_name); } if (!addSymbol(proxy_class_name, n, nspace)) { return SWIG_ERROR; } assertClassNameValidity(proxy_class_name); if (split_proxy_dmodule) { String *output_directory = outputDirectory(nspace); String *filename = NewStringf("%s%s.d", output_directory, proxy_class_name); class_file = NewFile(filename, "w", SWIG_output_files()); Delete(output_directory); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); if (nspace) { Printf(class_file, "module %s%s.%s;\n", package, nspace, proxy_class_name); } else { Printf(class_file, "module %s%s;\n", package, proxy_class_name); } Printf(class_file, "\nstatic import %s;\n", im_dmodule_fq_name); } Clear(proxy_class_imports); Clear(proxy_class_enums_code); Clear(proxy_class_body_code); Clear(proxy_class_epilogue_code); Clear(proxy_class_code); Clear(destructor_call); // Traverse the tree for this class, using the *Handler()s to generate code // to the proxy_class_* variables. Language::classHandler(n); writeProxyClassAndUpcasts(n); writeDirectorConnectWrapper(n); Replaceall(proxy_class_code, "$dclassname", proxy_class_name); String *dclazzname = Swig_name_member(getNSpace(), proxy_class_name, ""); Replaceall(proxy_class_code, "$dclazzname", dclazzname); Delete(dclazzname); if (split_proxy_dmodule) { Printv(class_file, global_proxy_imports, NIL); Printv(class_file, proxy_class_imports, NIL); replaceModuleVariables(proxy_class_code); Printv(class_file, proxy_class_code, NIL); Delete(class_file); } else { Printv(proxyImportsBuffer(getNSpace()), proxy_class_imports, NIL); Printv(proxyCodeBuffer(getNSpace()), proxy_class_code, NIL); } Delete(proxy_class_qname); proxy_class_qname = NULL; Delete(proxy_class_name); proxy_class_name = NULL; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::constantWrapper() * * Used for wrapping constants declared by #define or %constant and also for * (primitive) static member constants initialised inline. * * If the %dmanifestconst feature is used, the C/C++ constant value is used to * initialize a D »const«. If not, a »getter« method is generated which * retrieves the value via a call to the C wrapper. However, if there is a * %dconstvalue specified, it overrides all other settings. * --------------------------------------------------------------------------- */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); if (!addSymbol(symname, n)) return SWIG_ERROR; // The %dmanifestconst feature determines if a D manifest constant // (const/enum) or a getter function is created. if (GetFlag(n, "feature:d:manifestconst") != 1) { // Default constant handling will work with any type of C constant. It // generates a getter function (which is the same as a read only property // in D) which retrieves the value via by calling the C wrapper. // Note that this is only called for global constants, static member // constants are already handled in staticmemberfunctionHandler(). Swig_save("constantWrapper", n, "value", NIL); Swig_save("constantWrapper", n, "tmap:ctype:out", "tmap:imtype:out", "tmap:dtype:out", "tmap:out:null", "tmap:imtype:outattributes", "tmap:dtype:outattributes", NIL); // Add the stripped quotes back in. String *old_value = Getattr(n, "value"); SwigType *t = Getattr(n, "type"); if (SwigType_type(t) == T_STRING) { Setattr(n, "value", NewStringf("\"%s\"", old_value)); Delete(old_value); } else if (SwigType_type(t) == T_CHAR) { Setattr(n, "value", NewStringf("\'%s\'", old_value)); Delete(old_value); } SetFlag(n, "feature:immutable"); int result = globalvariableHandler(n); Swig_restore(n); return result; } String *constants_code = NewString(""); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); // Attach the non-standard typemaps to the parameter list. Swig_typemap_attach_parms("dtype", l, NULL); // Get D return type. String *return_type = NewString(""); String *tm; if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the out attribute of the typemap overrides the type // in the dtype typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } const String *itemname = wrapping_member_flag ? variable_name : symname; String *attributes = Getattr(n, "feature:d:methodmodifiers"); if (attributes) { attributes = Copy(attributes); } else { attributes = Copy(is_public(n) ? public_string : protected_string); } if (d_version == 1) { if (static_flag) { Printv(attributes, " static", NIL); } Printf(constants_code, "\n%s const %s %s = ", attributes, return_type, itemname); } else { Printf(constants_code, "\n%s enum %s %s = ", attributes, return_type, itemname); } Delete(attributes); // Retrive the override value set via %dconstvalue, if any. String *override_value = Getattr(n, "feature:d:constvalue"); if (override_value) { Printf(constants_code, "%s;\n", override_value); } else { // Just take the value from the C definition and hope it compiles in D. if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(escape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { // Add the stripped quotes back in. String* value = Getattr(n, "value"); if (SwigType_type(t) == T_STRING) { Printf(constants_code, "\"%s\";\n", value); } else if (SwigType_type(t) == T_CHAR) { Printf(constants_code, "\'%s\';\n", value); } else { Printf(constants_code, "%s;\n", value); } } } // Emit the generated code to appropriate place. if (wrapping_member_flag) { Printv(proxy_class_body_code, constants_code, NIL); } else { Printv(proxyCodeBuffer(getNSpace()), constants_code, NIL); } // Cleanup. Delete(return_type); Delete(constants_code); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::functionWrapper() * * Generates the C wrapper code for a function and the corresponding * declaration in the wrap D module. * --------------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); int num_arguments = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(Getattr(n, "sym:name"), n)) return SWIG_ERROR; } // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *wname = Swig_name_wrapper(overloaded_name); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); Swig_typemap_attach_parms("imtype", l, f); /* Get return types */ if ((tm = lookupDTypemap(n, "ctype"))) { String *ctypeout = Getattr(n, "tmap:ctype:out"); if (ctypeout) { // The type in the ctype typemap's out attribute overrides the type in // the typemap itself. tm = ctypeout; } Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = lookupDTypemap(n, "imtype"))) { String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type in // the typemap itself. tm = imtypeout; } Printf(im_return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL); Printv(f->def, " SWIGEXPORT ", c_return_type, " ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in D if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in D and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } // Collect the parameter list for the intermediary D module declaration of // the generated wrapper function. String *im_dmodule_parameters = NewString("("); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the ctype types of the parameter */ if ((tm = lookupDTypemap(p, "ctype", true))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = lookupDTypemap(p, "imtype", true))) { const String *inattributes = Getattr(p, "tmap:imtype:inattributes"); Printf(im_param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(im_dmodule_parameters, ", "); Printf(im_dmodule_parameters, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); gencomma = 1; // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { canThrow(n, "in", p); Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { canThrow(n, "check", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { canThrow(n, "freearg", p); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { canThrow(n, "argout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Look for usage of throws typemap and the canthrow flag ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { canThrow(n, "throws", p); } } } String *null_attribute = 0; // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { canThrow(n, "out", n); Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); null_attribute = Getattr(n, "tmap:out:null"); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { canThrow(n, "newfree", n); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { canThrow(n, "ret", n); Printf(f->code, "%s\n", tm); } } // Complete D im parameter list and emit the declaration/binding code. Printv(im_dmodule_parameters, ")", NIL); writeImDModuleFunction(overloaded_name, im_return_type, im_dmodule_parameters, wname); Delete(im_dmodule_parameters); // Finish C function header. Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ if (Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, ") > 0) { Setattr(n, "d:canthrow", "1"); } if (!null_attribute) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", null_attribute); /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); // Handle %exception which sets the canthrow attribute. if (Getattr(n, "feature:except:canthrow")) { Setattr(n, "d:canthrow", "1"); } // A very simple check (it is not foolproof) to assist typemap writers // with setting the correct features when the want to throw D exceptions // from C++ code. It checks for the common methods which set // a pending D exception and issues a warning if one of them has been found // in the typemap, but the »canthrow« attribute/feature is not set. if (!Getattr(n, "d:canthrow")) { if (Strstr(f->code, "SWIG_exception")) { Swig_warning(WARN_D_CANTHROW_MISSING, input_file, line_number, "C code contains a call to SWIG_exception and D code does not handle pending exceptions via the canthrow attribute.\n"); } else if (Strstr(f->code, "SWIG_DSetPendingException")) { Swig_warning(WARN_D_CANTHROW_MISSING, input_file, line_number, "C code contains a call to a SWIG_DSetPendingException method and D code does not handle pending exceptions via the canthrow attribute.\n"); } } } // If we are not processing an enum or constant, and we were not generating // a wrapper function which will be accessed via a proxy class, write a // function to the proxy D module. if (!is_wrapping_class()) { writeProxyDModuleFunction(n); } // If we are processing a public member variable, write the property-style // member function to the proxy class. if (wrapping_member_flag) { Setattr(n, "proxyfuncname", variable_name); Setattr(n, "imfuncname", symname); writeProxyClassFunction(n); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::nativeWrapper() * --------------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classDirector() * --------------------------------------------------------------------------- */ virtual int classDirector(Node *n) { String *nspace = Getattr(n, "sym:nspace"); proxy_class_name = NewString(Getattr(n, "sym:name")); if (nspace) { proxy_class_qname = NewStringf("%s.%s", nspace, proxy_class_name); } else { proxy_class_qname = Copy(proxy_class_name); } int success = Language::classDirector(n); Delete(proxy_class_qname); proxy_class_qname = NULL; Delete(proxy_class_name); proxy_class_name = NULL; return success; } /* --------------------------------------------------------------------------- * D::classDirectorInit() * --------------------------------------------------------------------------- */ virtual int classDirectorInit(Node *n) { Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); // Write C++ director class declaration, for example: // class SwigDirector_myclass : public myclass, public Swig::Director { String *classname = Swig_class_name(n); String *directorname = directorClassName(n); String *declaration = Swig_class_declaration(n, directorname); const String *base = Getattr(n, "classtype"); Printf(f_directors_h, "%s : public %s, public Swig::Director {\n", declaration, base); Printf(f_directors_h, "\npublic:\n"); Delete(declaration); Delete(directorname); Delete(classname); // Stash for later. Setattr(n, "director:ctor", NewString("Swig::Director()")); // Keep track of the director methods for this class. first_class_dmethod = curr_class_dmethod = n_dmethods; director_callback_typedefs = NewString(""); director_callback_pointers = NewString(""); director_dcallbacks_code = NewString(""); return Language::classDirectorInit(n); } /* --------------------------------------------------------------------------- * D::classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying D object. * --------------------------------------------------------------------------- */ virtual int classDirectorMethod(Node *n, Node *parent, String *super) { String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); SwigType *c_ret_type = NULL; String *dcallback_call_args = NewString(""); String *imclass_dmethod; String *callback_typedef_parms = NewString(""); String *delegate_parms = NewString(""); String *proxy_method_param_list = NewString(""); String *proxy_callback_return_type = NewString(""); String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(getNSpace(), classname, overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && !ignored_method) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a D exception occurs, then the pointer returns something other than a NULL-initialized reference. */ String *non_ref_type = Copy(returntype); /* Remove reference and const qualifiers */ Replaceall(non_ref_type, "r.", ""); Replaceall(non_ref_type, "q(const).", ""); Wrapper_add_localv(w, "result_default", "static", SwigType_str(non_ref_type, "result_default"), "=", SwigType_str(non_ref_type, "()"), NIL); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= &result_default", NIL); Delete(non_ref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = lookupDTypemap(n, "imtype"); if (tm) { String *imtypeout = Getattr(n, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the type // in the typemap. tm = imtypeout; } Printf(callback_def, "\nprivate extern(C) %s swigDirectorCallback_%s_%s(void* dObject", tm, classname, overloaded_name); Printv(proxy_callback_return_type, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Swig_director_parms_fixup(l); // Attach the standard typemaps. Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("ctype", l, 0); Swig_typemap_attach_parms("imtype", l, 0); Swig_typemap_attach_parms("dtype", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("ddirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); // Preamble code. if (!ignored_method) Printf(w->code, "if (!swig_callback_%s) {\n", overloaded_name); if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, " throw Swig::DirectorPureVirtualException(\"%s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } if (!ignored_method) Printf(w->code, "} else {\n"); // Go through argument list. for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); // Add each parameter to the D callback invocation arguments. Printf(dcallback_call_args, ", %s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = lookupDTypemap(p, "ctype", true))) { String *ctypeout = Getattr(p, "tmap:ctype:out"); if (ctypeout) { // The type in the ctype typemap's out attribute overrides the type // in the typemap itself. c_param_type = ctypeout; } /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code */ if ((tm = Getattr(p, "tmap:directorin"))) { Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); // Add parameter type to the C typedef for the D callback function. Printf(callback_typedef_parms, ", %s", c_param_type); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = lookupDTypemap(p, "imtype", true))) { String *imtypeout = Getattr(p, "tmap:imtype:out"); if (imtypeout) { // The type in the imtype typemap's out attribute overrides the // type in the typemap itself. tm = imtypeout; } const String *im_directorinattributes = Getattr(p, "tmap:imtype:directorinattributes"); // TODO: Is this copy really needed? String *din = Copy(lookupDTypemap(p, "ddirectorin", true)); if (din) { Replaceall(din, "$winput", ln); Printf(delegate_parms, ", "); if (i > 0) { Printf(proxy_method_param_list, ", "); Printf(imcall_args, ", "); } Printf(delegate_parms, "%s%s %s", im_directorinattributes ? im_directorinattributes : empty_string, tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else { Printv(imcall_args, ln, NIL); } Delete(din); // Get the parameter type in the proxy D class (used later when // generating the overload checking code for the directorConnect // function). if ((tm = lookupDTypemap(p, "dtype", true))) { Printf(proxy_method_param_list, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } } else { Swig_warning(WARN_D_TYPEMAP_DDIRECTORIN_UNDEF, input_file, line_number, "No ddirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_D_TYPEMAP_IMTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); } else { Swig_warning(WARN_D_TYPEMAP_DDIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); output_director = false; } } else { Swig_warning(WARN_D_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(arg); Delete(c_decl); Delete(c_param_type); Delete(ln); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); // Finish the callback function declaraction. Printf(callback_def, "%s)", delegate_parms); Printf(callback_def, " {\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("(cast(%s)dObject).%s(%s)", classname, symname, imcall_args); if (!is_void) { if ((tm = lookupDTypemap(n, "ddirectorout"))) { Replaceall(tm, "$dcall", upcall); Printf(callback_code, " return %s;\n", tm); } } else { Printf(callback_code, " %s;\n", upcall); } Printf(callback_code, "}\n"); Delete(upcall); if (!ignored_method) { if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "swig_callback_%s(d_object%s);\n", overloaded_name, dcallback_call_args); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { canThrow(n, "directorargout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* Terminate wrapper code */ Printf(w->code, "}\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!ignored_method) Printv(director_dcallbacks_code, callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } if (!ignored_method) { // Register the upcall method so that the callback registering code can // be written later. // We cannot directly use n here because its »type« attribute does not // the full return type any longer after Language::functionHandler has // returned. String *dp_return_type = lookupDTypemap(n, "dtype"); if (dp_return_type) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type // in the typemap itself. dp_return_type = dtypeout; replaceClassname(dp_return_type, returntype); } } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(returntype, 0)); dp_return_type = NewString(""); } UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, decl, overloaded_name, dp_return_type, proxy_method_param_list); Delete(dp_return_type); // Write the global callback function pointer on the C code. String *methid = Getattr(udata, "class_methodidx"); Printf(director_callback_typedefs, " typedef %s (* SWIG_Callback%s_t)", c_ret_type, methid); Printf(director_callback_typedefs, "(void *dobj%s);\n", callback_typedef_parms); Printf(director_callback_pointers, " SWIG_Callback%s_t swig_callback_%s;\n", methid, overloaded_name); // Write the type alias for the callback to the intermediary D module. String *proxy_callback_type = NewString(""); String *dirClassName = directorClassName(parent); Printf(proxy_callback_type, "%s_Callback%s", dirClassName, methid); Printf(im_dmodule_code, "alias extern(C) %s function(void*%s) %s;\n", proxy_callback_return_type, delegate_parms, proxy_callback_type); Delete(proxy_callback_type); Delete(dirClassName); } Delete(qualified_return); Delete(c_ret_type); Delete(declaration); Delete(callback_typedef_parms); Delete(delegate_parms); Delete(proxy_method_param_list); Delete(callback_def); Delete(callback_code); DelWrapper(w); return status; } /* --------------------------------------------------------------------------- * D::classDirectorConstructor() * --------------------------------------------------------------------------- */ virtual int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl");; String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } // TODO: Is this copy needed? parms = CopyParmList(superparms); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); String *classtype = SwigType_namestr(Getattr(n, "name")); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, " swig_init_callbacks();\n"); Printf(f_directors, "}\n\n"); Delete(classtype); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* --------------------------------------------------------------------------- * D::classDirectorDefaultConstructor() * --------------------------------------------------------------------------- */ virtual int classDirectorDefaultConstructor(Node *n) { String *dirclassname = directorClassName(n); String *classtype = SwigType_namestr(Getattr(n, "name")); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s() : %s {", dirclassname, dirclassname, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s();\n", dirclassname); DelWrapper(w); Delete(classtype); Delete(dirclassname); return Language::classDirectorDefaultConstructor(n); } /* --------------------------------------------------------------------------- * D::classDirectorDestructor() * --------------------------------------------------------------------------- */ virtual int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *dirclassname = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw ();\n", dirclassname); Printf(w->def, "%s::~%s() throw () {\n", dirclassname, dirclassname); } else { Printf(f_directors_h, " virtual ~%s();\n", dirclassname); Printf(w->def, "%s::~%s() {\n", dirclassname, dirclassname); } Printv(w->code, "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return SWIG_OK; } /* --------------------------------------------------------------------------- * D::classDirectorEnd() * --------------------------------------------------------------------------- */ virtual int classDirectorEnd(Node *n) { int i; String *director_classname = directorClassName(n); Wrapper *w = NewWrapper(); if (Len(director_callback_typedefs) > 0) { Printf(f_directors_h, "\n%s", director_callback_typedefs); } Printf(f_directors_h, " void swig_connect_director(void* dobj"); Printf(w->def, "void %s::swig_connect_director(void* dobj", director_classname); Printf(w->code, "d_object = dobj;"); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(f_directors_h, ", SWIG_Callback%s_t callback%s", methid, overname); Printf(w->def, ", SWIG_Callback%s_t callback_%s", methid, overname); Printf(w->code, "swig_callback_%s = callback_%s;\n", overname, overname); } Printf(f_directors_h, ");\n"); Printf(w->def, ") {"); Printf(f_directors_h, "\nprivate:\n"); Printf(f_directors_h, " void swig_init_callbacks();\n"); Printf(f_directors_h, " void *d_object;\n"); if (Len(director_callback_pointers) > 0) { Printf(f_directors_h, "%s", director_callback_pointers); } Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n\n"); Printf(w->code, "void %s::swig_init_callbacks() {\n", director_classname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *overname = Getattr(udata, "overname"); Printf(w->code, "swig_callback_%s = 0;\n", overname); } Printf(w->code, "}"); Wrapper_print(w, f_directors); DelWrapper(w); return Language::classDirectorEnd(n); } /* --------------------------------------------------------------------------- * D::classDirectorDisown() * --------------------------------------------------------------------------- */ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /* --------------------------------------------------------------------------- * D::replaceSpecialVariables() * --------------------------------------------------------------------------- */ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); // Just assume that this goes to the proxy class, we cannot know. replaceClassname(tm, type); } protected: /* --------------------------------------------------------------------------- * D::extraDirectorProtectedCPPMethodsRequired() * --------------------------------------------------------------------------- */ virtual bool extraDirectorProtectedCPPMethodsRequired() const { return false; } private: /* --------------------------------------------------------------------------- * D::writeImDModuleFunction() * * Writes a function declaration for the given (C) wrapper function to the * intermediary D module. * * d_name - The name the function in the intermediary D module will get. * return type - The return type of the function in the C wrapper. * parameters - The parameter list of the C wrapper function. * wrapper_function_name - The name of the exported function in the C wrapper * (usually d_name prefixed by »D_«). * --------------------------------------------------------------------------- */ void writeImDModuleFunction(const_String_or_char_ptr d_name, const_String_or_char_ptr return_type, const_String_or_char_ptr parameters, const_String_or_char_ptr wrapper_function_name) { // TODO: Add support for static linking here. Printf(im_dmodule_code, "SwigExternC!(%s function%s) %s;\n", return_type, parameters, d_name); Printv(wrapper_loader_bind_code, wrapper_loader_bind_command, NIL); Replaceall(wrapper_loader_bind_code, "$function", d_name); Replaceall(wrapper_loader_bind_code, "$symbol", wrapper_function_name); } /* --------------------------------------------------------------------------- * D::writeProxyClassFunction() * * Creates a D proxy function for a C++ function in the wrapped class. Used * for both static and non-static C++ class functions. * * The Node must contain two extra attributes. * - "proxyfuncname": The name of the D proxy function. * - "imfuncname": The corresponding function in the intermediary D module. * --------------------------------------------------------------------------- */ void writeProxyClassFunction(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); // Wrappers not wanted for some methods where the parameters cannot be // overloaded in D. if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in // directors. if (GetFlag(n, "explicitcall")) return; // RESEARCH: What is this good for? if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); // Get return types. if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type in // the typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag) { // Check if this is a setter method for a public member. const String *setter_name = Swig_name_set(getNSpace(), Swig_name_member(0, proxy_class_name, variable_name)); if (Cmp(Getattr(n, "sym:name"), setter_name) == 0) { setter_flag = true; } } // Write function modifiers. { String *modifiers; const String *mods_override = Getattr(n, "feature:d:methodmodifiers"); if (mods_override) { modifiers = Copy(mods_override); } else { modifiers = Copy(is_public(n) ? public_string : protected_string); if (Getattr(n, "override")) { Printf(modifiers, " override"); } } if (is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the // underlying pointer type, so no override required. Replaceall(modifiers, "override", ""); } Chop(modifiers); if (static_flag) { Printf(modifiers, " static"); } Printf(function_code, "%s ", modifiers); Delete(modifiers); } // Complete the function declaration up to the parameter list. Printf(function_code, "%s %s(", return_type, proxy_function_name); // Write the wrapper function call up to the parameter list. Printv(imcall, im_dmodule_fq_name, ".$imfuncname(", NIL); if (!static_flag) { Printf(imcall, "cast(void*)swigCPtr"); } String *proxy_param_types = NewString(""); // Write the parameter list for the proxy function declaration and the // wrapper function call. emit_mark_varargs(l); int gencomma = !static_flag; for (i = 0, p = l; p; i++) { // Ignored varargs. if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } // Ignored parameters. if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } // Ignore the 'this' argument for variable wrappers. if (!(variable_wrapper_flag && i == 0)) { String *param_name = makeParameterName(n, p, i, setter_flag); SwigType *pt = Getattr(p, "type"); // Write the wrapper function call argument. { if (gencomma) { Printf(imcall, ", "); } if ((tm = lookupDTypemap(p, "din", true))) { Replaceall(tm, "$dinput", param_name); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", param_name); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", param_name); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", param_name); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } } // Write the D proxy function parameter. { String *proxy_type = NewString(""); if ((tm = lookupDTypemap(p, "dtype"))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(proxy_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma >= 2) { Printf(function_code, ", "); Printf(proxy_param_types, ", "); } gencomma = 2; Printf(function_code, "%s %s", proxy_type, param_name); Append(proxy_param_types, proxy_type); Delete(proxy_type); } Delete(param_name); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ") "); if (d_version > 1 && wrapping_member_flag) { Printf(function_code, "@property "); } if (wrapMemberFunctionAsDConst(n)) { Printf(function_code, "const "); } // Lookup the code used to convert the wrapper return value to the proxy // function return type. if ((tm = lookupDTypemap(n, "dout"))) { replaceExcode(n, tm, "dout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printv(tm, "}", NIL); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); replaceClassname(tm, t); // For director methods: generate code to selectively make a normal // polymorphic call or an explicit method call. Needed to prevent infinite // recursion when calling director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n && Swig_directorclass(getCurrentClass())) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), proxy_class_name, ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); if (!Cmp(return_type, "void")) Printf(excode, "if (swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) %s; else %s", return_type, proxy_param_types, return_type, proxy_param_types, proxy_function_name, ex_imcall, imcall); else Printf(excode, "((swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) ? %s : %s)", return_type, proxy_param_types, return_type, proxy_param_types, proxy_function_name, ex_imcall, imcall); Clear(imcall); Printv(imcall, excode, NIL); Delete(ex_overloaded_name); Delete(excode); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_D_TYPEMAP_DOUT_UNDEF, input_file, line_number, "No dout typemap defined for %s\n", SwigType_str(t, 0)); } Delete(proxy_param_types); // The whole function body is now in stored tm (if there was a matching type // map, of course), so simply append it to the code buffer. The braces are // included in the typemap. Printv(function_code, tm, NIL); // Write function code buffer to the class code. Printv(proxy_class_body_code, "\n", function_code, "\n", NIL); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* --------------------------------------------------------------------------- * D::writeProxyDModuleFunction() * --------------------------------------------------------------------------- */ void writeProxyDModuleFunction(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); // RESEARCH: What is this good for? if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("dtype", l, NULL); Swig_typemap_attach_parms("din", l, NULL); /* Get return types */ if ((tm = lookupDTypemap(n, "dtype"))) { String *dtypeout = Getattr(n, "tmap:dtype:out"); if (dtypeout) { // The type in the dtype typemap's out attribute overrides the type in // the typemap. tm = dtypeout; replaceClassname(tm, t); } Printf(return_type, "%s", tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (global_variable_flag) { // RESEARCH: Is the Copy() needed here? func_name = Copy(variable_name); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *outattributes = Getattr(n, "tmap:dtype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *methodmods = Getattr(n, "feature:d:methodmodifiers"); // TODO: Check if is_public(n) could possibly make any sense here // (private global functions would be useless anyway?). methodmods = methodmods ? methodmods : empty_string; Printf(function_code, "\n%s%s %s(", methodmods, return_type, func_name); Printv(imcall, im_dmodule_fq_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); // Get the D parameter type. if ((tm = lookupDTypemap(p, "dtype", true))) { const String *inattributes = Getattr(p, "tmap:dtype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_D_TYPEMAP_DTYPE_UNDEF, input_file, line_number, "No dtype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); const bool generating_setter = global_variable_flag || wrapping_member_flag; String *arg = makeParameterName(n, p, i, generating_setter); // Get the D code to convert the parameter value to the type used in the // wrapper D module. if ((tm = lookupDTypemap(p, "din", true))) { Replaceall(tm, "$dinput", arg); String *pre = Getattr(p, "tmap:din:pre"); if (pre) { replaceClassname(pre, pt); Replaceall(pre, "$dinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:din:post"); if (post) { replaceClassname(post, pt); Replaceall(post, "$dinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:din:terminator"); if (terminator) { replaceClassname(terminator, pt); Replaceall(terminator, "$dinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_D_TYPEMAP_DIN_UNDEF, input_file, line_number, "No din typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ") "); if (global_variable_flag && (d_version > 1)) { Printf(function_code, "@property "); } // Lookup the code used to convert the wrapper return value to the proxy // function return type. if ((tm = lookupDTypemap(n, "dout"))) { replaceExcode(n, tm, "dout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, " {"); Printf(tm, "\n}"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); replaceClassname(tm, t); Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_D_TYPEMAP_DOUT_UNDEF, input_file, line_number, "No dout typemap defined for %s\n", SwigType_str(t, 0)); } // The whole function code is now stored in tm (if there was a matching // type map, of course), so simply append it to the code buffer. Printf(function_code, "%s\n", tm ? (const String *) tm : empty_string); Printv(proxyCodeBuffer(getNSpace()), function_code, NIL); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /* --------------------------------------------------------------------------- * D::writeProxyClassAndUpcasts() * * Collects all the code fragments generated by the handler function while * traversing the tree from the proxy_class_* variables and writes the * class definition (including any epilogue code) to proxy_class_code. * * Also writes the upcast function to the wrapper layer when processing a * derived class. * * Inputs: * n – The class node currently processed. * --------------------------------------------------------------------------- */ void writeProxyClassAndUpcasts(Node *n) { SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); /* * Handle inheriting from D and C++ classes. */ String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; Node *basenode = NULL; String *basename = NULL; String *c_baseclassname = NULL; // Inheritance from pure D classes. Node *attributes = NewHash(); const String *pure_baseclass = lookupCodeTypemap(n, "dbase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:dbase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:dbase:notderived") ? true : false; Delete(attributes); // C++ inheritance. if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { basenode = base.item; c_baseclassname = baseclassname; basename = createProxyName(c_baseclassname); if (basename) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Base %s of class %s ignored: multiple inheritance is not supported in D.\n", SwigType_namestr(baseclassname), SwigType_namestr(proxyclassname)); } } base = Next(base); } } } bool derived = (basename != NULL); if (derived && purebase_notderived) { pure_baseclass = empty_string; } const String *wanted_base = basename ? basename : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; basenode = NULL; Delete(basename); basename = NULL; if (purebase_notderived) { Swig_error(Getfile(n), Getline(n), "The dbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } } else if (basename && Len(pure_baseclass) > 0) { Swig_warning(WARN_D_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base class %s ignored. Multiple inheritance is not supported in D. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the dbase typemap?\n", typemap_lookup_type, pure_baseclass); } // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { writeClassUpcast(n, proxy_class_name, c_classname, c_baseclass); } /* * Write needed imports. */ // If this class is derived from a C++ class, we need to have the D class // generated for it in scope. if (derived) { requireDType(Getattr(basenode, "sym:nspace"), Getattr(basenode, "sym:name")); } // Write any custom import statements to the proxy module header. const String *imports = lookupCodeTypemap(n, "dimports", typemap_lookup_type, WARN_NONE); if (Len(imports) > 0) { String* imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(proxy_class_imports, imports_trimmed, "\n", NIL); Delete(imports_trimmed); } /* * Write the proxy class header. */ // Class modifiers. const String *modifiers = lookupCodeTypemap(n, "dclassmodifiers", typemap_lookup_type, WARN_D_TYPEMAP_CLASSMOD_UNDEF); // User-defined interfaces. const String *interfaces = lookupCodeTypemap(n, derived ? "dinterfaces_derived" : "dinterfaces", typemap_lookup_type, WARN_NONE); Printv(proxy_class_code, "\n", modifiers, " $dclassname", (*Char(wanted_base) || *Char(interfaces)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(interfaces)) ? ", " : "", interfaces, " {", NIL); /* * Write the proxy class body. */ String* body = NewString(""); // Default class body. const String *dbody; if (derived) { dbody = lookupCodeTypemap(n, "dbody_derived", typemap_lookup_type, WARN_D_TYPEMAP_DBODY_UNDEF); } else { dbody = lookupCodeTypemap(n, "dbody", typemap_lookup_type, WARN_D_TYPEMAP_DBODY_UNDEF); } Printv(body, dbody, NIL); // Destructor and dispose(). // If the C++ destructor is accessible (public), it is wrapped by the // dispose() method which is also called by the emitted D constructor. If it // is not accessible, no D destructor is written and the generated dispose() // method throws an exception. // This enables C++ classes with protected or private destructors to be used // in D as it would be used in C++ (GC finalization is a no-op then because // of the empty D destructor) while preventing usage in »scope« variables. // The method name for the dispose() method is specified in a typemap // attribute called »methodname«. const String *tm = NULL; String *dispose_methodname; String *dispose_methodmodifiers; attributes = NewHash(); if (derived) { tm = lookupCodeTypemap(n, "ddispose_derived", typemap_lookup_type, WARN_NONE, attributes); dispose_methodname = Getattr(attributes, "tmap:ddispose_derived:methodname"); dispose_methodmodifiers = Getattr(attributes, "tmap:ddispose_derived:methodmodifiers"); } else { tm = lookupCodeTypemap(n, "ddispose", typemap_lookup_type, WARN_NONE, attributes); dispose_methodname = Getattr(attributes, "tmap:ddispose:methodname"); dispose_methodmodifiers = Getattr(attributes, "tmap:ddispose:methodmodifiers"); } if (tm && *Char(tm)) { if (!dispose_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in the ddispose%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } if (!dispose_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in ddispose%s typemap for %s.\n", (derived ? "_derived" : ""), proxy_class_name); } } if (tm) { // Write the destructor if the C++ one is accessible. if (*Char(destructor_call)) { Printv(body, lookupCodeTypemap(n, "ddestructor", typemap_lookup_type, WARN_NONE), NIL); } // Write the dispose() method. String *dispose_code = NewString(""); Printv(dispose_code, tm, NIL); if (*Char(destructor_call)) { Replaceall(dispose_code, "$imcall", destructor_call); } else { Replaceall(dispose_code, "$imcall", "throw new object.Exception(\"C++ destructor does not have public access\")"); } if (*Char(dispose_code)) { Printv(body, "\n", dispose_methodmodifiers, (derived ? " override" : ""), " void ", dispose_methodname, "() ", dispose_code, "\n", NIL); } } if (Swig_directorclass(n)) { // If directors are enabled for the current class, generate the // director connect helper function which is called from the constructor // and write it to the class body. writeDirectorConnectProxy(n); } // Write all constants and enumerations first to prevent forward reference // errors. Printv(body, proxy_class_enums_code, NIL); // Write the code generated in other methods to the class body. Printv(body, proxy_class_body_code, NIL); // Append extra user D code to the class body. Printv(body, lookupCodeTypemap(n, "dcode", typemap_lookup_type, WARN_NONE), "\n", NIL); // Write the class body and the curly bracket closing the class definition // to the proxy module. indentCode(body); Replaceall(body, "$dbaseclass", basename); Delete(basename); Printv(proxy_class_code, body, "\n}\n", NIL); Delete(body); // Write the epilogue code if there is any. Printv(proxy_class_code, proxy_class_epilogue_code, NIL); } /* --------------------------------------------------------------------------- * D::writeClassUpcast() * --------------------------------------------------------------------------- */ void writeClassUpcast(Node *n, const String* d_class_name, String* c_class_name, String* c_base_name) { SwigType *smart = Swig_cparse_smartptr(n); String *upcast_name = Swig_name_member(getNSpace(), d_class_name, (smart != 0 ? "SmartPtrUpcast" : "Upcast")); String *upcast_wrapper_name = Swig_name_wrapper(upcast_name); writeImDModuleFunction(upcast_name, "void*", "(void* objectRef)", upcast_wrapper_name); if (smart) { SwigType *bsmart = Copy(smart); SwigType *rclassname = SwigType_typedef_resolve_all(c_class_name); SwigType *rbaseclass = SwigType_typedef_resolve_all(c_base_name); Replaceall(bsmart, rclassname, rbaseclass); Delete(rclassname); Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * ", upcast_wrapper_name, "(", smartnamestr, " *objectRef) {\n", " return objectRef ? new ", bsmartnamestr, "(*objectRef) : 0;\n" "}\n", "\n", NIL); Delete(bsmartnamestr); Delete(smartnamestr); Delete(bsmart); } else { Printv(upcasts_code, "SWIGEXPORT ", c_base_name, " * ", upcast_wrapper_name, "(", c_base_name, " *objectRef) {\n", " return (", c_base_name, " *)objectRef;\n" "}\n", "\n", NIL); } Replaceall(upcasts_code, "$cclass", c_class_name); Replaceall(upcasts_code, "$cbaseclass", c_base_name); Delete(upcast_name); Delete(upcast_wrapper_name); Delete(smart); } /* --------------------------------------------------------------------------- * D::writeTypeWrapperClass() * --------------------------------------------------------------------------- */ void writeTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); assertClassNameValidity(classname); String* imports_target; String* code_target; File *class_file = NULL; if (split_proxy_dmodule) { String *filename = NewStringf("%s%s.d", dmodule_directory, classname); class_file = NewFile(filename, "w", SWIG_output_files()); if (!class_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filename)); Delete(filename); emitBanner(class_file); Printf(class_file, "module %s%s;\n", package, classname); Printf(class_file, "\nstatic import %s;\n", im_dmodule_fq_name); imports_target = NewString(""); code_target = NewString(""); } else { imports_target = proxyImportsBuffer(0); code_target = proxyCodeBuffer(0); } // Import statements. const String *imports = lookupCodeTypemap(n, "dimports", type, WARN_NONE); if (Len(imports) > 0) { String *imports_trimmed = Copy(imports); Chop(imports_trimmed); replaceImportTypeMacros(imports_trimmed); Printv(imports_target, imports_trimmed, "\n", NIL); Delete(imports_trimmed); } // Pure D baseclass and interfaces (no C++ inheritance possible. const String *pure_baseclass = lookupCodeTypemap(n, "dbase", type, WARN_NONE); const String *pure_interfaces = lookupCodeTypemap(n, "dinterfaces", type, WARN_NONE); // Emit the class. Printv(code_target, "\n", lookupCodeTypemap(n, "dclassmodifiers", type, WARN_D_TYPEMAP_CLASSMOD_UNDEF), " $dclassname", (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? ", " : "", pure_interfaces, " {", NIL); String* body = NewString(""); Printv(body, lookupCodeTypemap(n, "dbody", type, WARN_D_TYPEMAP_DBODY_UNDEF), lookupCodeTypemap(n, "dcode", type, WARN_NONE), NIL); indentCode(body); Printv(code_target, body, "\n}\n", NIL); Delete(body); Replaceall(code_target, "$dclassname", classname); if (split_proxy_dmodule) { Printv(class_file, imports_target, NIL); Delete(imports_target); replaceModuleVariables(code_target); Printv(class_file, code_target, NIL); Delete(code_target); Delete(class_file); } Delete(n); } /* --------------------------------------------------------------------------- * D::writeDirectorConnectProxy(Node *classNode) * * Writes the helper method which registers the director callbacks by calling * the director connect function from the D side to the proxy class. * --------------------------------------------------------------------------- */ void writeDirectorConnectProxy(Node* classNode) { String *dirClassName = directorClassName(classNode); String *connect_name = Swig_name_member(getNSpace(), proxy_class_name, "director_connect"); Printf(proxy_class_body_code, "\nprivate void swigDirectorConnect() {\n"); int i; for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *method = Getattr(udata, "method"); String *overloaded_name = Getattr(udata, "overname"); String *return_type = Getattr(udata, "return_type"); String *param_list = Getattr(udata, "param_list"); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_body_code, " %s.%s_Callback%s callback%s;\n", im_dmodule_fq_name, dirClassName, methid, methid); Printf(proxy_class_body_code, " if (swigIsMethodOverridden!(%s delegate(%s), %s function(%s), %s)()) {\n", return_type, param_list, return_type, param_list, method); Printf(proxy_class_body_code, " callback%s = &swigDirectorCallback_%s_%s;\n", methid, proxy_class_name, overloaded_name); Printf(proxy_class_body_code, " }\n\n"); } Printf(proxy_class_body_code, " %s.%s(cast(void*)swigCPtr, cast(void*)this", im_dmodule_fq_name, connect_name); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_body_code, ", callback%s", methid); } Printf(proxy_class_body_code, ");\n"); Printf(proxy_class_body_code, "}\n"); // Helper function to determine if a method has been overridden in a // subclass of the wrapped class. If not, we just pass null to the // director_connect_function since the method from the C++ class should // be called as usual (see above). // Only emit it if the proxy class has at least one method. if (first_class_dmethod < curr_class_dmethod) { Printf(proxy_class_body_code, "\n"); Printf(proxy_class_body_code, "private bool swigIsMethodOverridden(DelegateType, FunctionType, alias fn)() %s{\n", (d_version > 1) ? "const " : ""); Printf(proxy_class_body_code, " DelegateType dg = &fn;\n"); Printf(proxy_class_body_code, " return dg.funcptr != SwigNonVirtualAddressOf!(FunctionType, fn);\n"); Printf(proxy_class_body_code, "}\n"); Printf(proxy_class_body_code, "\n"); Printf(proxy_class_body_code, "private static Function SwigNonVirtualAddressOf(Function, alias fn)() {\n"); Printf(proxy_class_body_code, " return cast(Function) &fn;\n"); Printf(proxy_class_body_code, "}\n"); } if (Len(director_dcallbacks_code) > 0) { Printv(proxy_class_epilogue_code, director_dcallbacks_code, NIL); } Delete(director_callback_typedefs); director_callback_typedefs = NULL; Delete(director_callback_pointers); director_callback_pointers = NULL; Delete(director_dcallbacks_code); director_dcallbacks_code = NULL; Delete(dirClassName); Delete(connect_name); } /* --------------------------------------------------------------------------- * D::writeDirectorConnectWrapper() * * Writes the director connect function and the corresponding declaration to * the C++ wrapper respectively the D wrapper. * --------------------------------------------------------------------------- */ void writeDirectorConnectWrapper(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method. String *norm_name = SwigType_namestr(Getattr(n, "name")); String *connect_name = Swig_name_member(getNSpace(), proxy_class_name, "director_connect"); String *dirClassName = directorClassName(n); Wrapper *code_wrap; Printv(wrapper_loader_bind_code, wrapper_loader_bind_command, NIL); Replaceall(wrapper_loader_bind_code, "$function", connect_name); Replaceall(wrapper_loader_bind_code, "$symbol", Swig_name_wrapper(connect_name)); Printf(im_dmodule_code, "extern(C) void function(void* cObject, void* dObject"); code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void D_%s(void *objarg, void *dobj", connect_name); Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj);\n", dirClassName, dirClassName); Printf(code_wrap->code, " if (director) {\n"); Printf(code_wrap->code, " director->swig_connect_director(dobj"); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(code_wrap->def, ", %s::SWIG_Callback%s_t callback%s", dirClassName, methid, methid); Printf(code_wrap->code, ", callback%s", methid); Printf(im_dmodule_code, ", %s_Callback%s callback%s", dirClassName, methid, methid); } Printf(code_wrap->def, ") {\n"); Printf(code_wrap->code, ");\n"); Printf(im_dmodule_code, ") %s;\n", connect_name); Printf(code_wrap->code, " }\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(connect_name); Delete(dirClassName); } /* --------------------------------------------------------------------------- * D::requireDType() * * If the given type is not already in scope in the current module, adds an * import statement for it. The name is considered relative to the global root * package if one is set. * * This is only used for dependencies created in generated code, user- * (i.e. typemap-) specified import statements are handled separately. * --------------------------------------------------------------------------- */ void requireDType(const String *nspace, const String *symname) { String *dmodule = createModuleName(nspace, symname); if (!inProxyModule(dmodule)) { String *import = createImportStatement(dmodule); Append(import, "\n"); if (is_wrapping_class()) { addImportStatement(proxy_class_imports, import); } else { addImportStatement(proxyImportsBuffer(getNSpace()), import); } Delete(import); } Delete(dmodule); } /* --------------------------------------------------------------------------- * D::addImportStatement() * * Adds the given import statement to the given list of import statements if * there is no statement importing that module present yet. * --------------------------------------------------------------------------- */ void addImportStatement(String *target, const String *import) const { char *position = Strstr(target, import); if (position) { // If the import statement has been found in the target string, we have to // check if the previous import was static, which would lead to problems // if this import is not. // Thus, we check if the seven characters in front of the occurrence are // »static «. If the import string passed is also static, the checks fail // even if the found statement is also static because the last seven // characters would be part of the previous import statement then. if (position - Char(target) < 7) { return; } if (strncmp(position - 7, "static ", 7)) { return; } } Printv(target, import, NIL); } /* --------------------------------------------------------------------------- * D::createImportStatement() * * Creates a string containing an import statement for the given module. * --------------------------------------------------------------------------- */ String *createImportStatement(const String *dmodule_name, bool static_import = true) const { if (static_import) { return NewStringf("static import %s%s;", package, dmodule_name); } else { return NewStringf("import %s%s;", package, dmodule_name); } } /* --------------------------------------------------------------------------- * D::inProxyModule() * * Determines if the specified proxy type is declared in the currently * processed proxy D module. * * This function is used to determine if fully qualified type names have to * be used (package, module and type name). If the split proxy mode is not * used, this solely depends on whether the type is in the current namespace. * --------------------------------------------------------------------------- */ bool inProxyModule(const String *type_name) const { if (!split_proxy_dmodule) { String *nspace = createOuterNamespaceNames(type_name); // Check if strings are either both null (no namespace) or are both // non-null and have the same contents. Cannot use Strcmp for this // directly because of its strange way of handling the case where only // one argument is 0 ("<"). bool result = !nspace && !getNSpace(); if (nspace && getNSpace()) result = (Strcmp(nspace, getNSpace()) == 0); Delete(nspace); return result; } if (!is_wrapping_class()) { return false; } return (Strcmp(proxy_class_qname, type_name) == 0); } /* --------------------------------------------------------------------------- * D::addUpcallMethod() * * Adds new director upcall signature. * --------------------------------------------------------------------------- */ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *decl, String *overloaded_name, String *return_type, String *param_list) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Setattr(new_udata, "overname", Copy(overloaded_name)); Setattr(new_udata, "return_type", Copy(return_type)); Setattr(new_udata, "param_list", Copy(param_list)); Delete(key); return new_udata; } /* --------------------------------------------------------------------------- * D::assertClassNameValidity() * --------------------------------------------------------------------------- */ void assertClassNameValidity(const String* class_name) const { // TODO: With nspace support, there could arise problems also when not in // split proxy mode, warnings for these should be added. if (split_proxy_dmodule) { if (Cmp(class_name, im_dmodule_name) == 0) { Swig_error(input_file, line_number, "Class name cannot be equal to intermediary D module name: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } String *nspace = getNSpace(); if (nspace) { // Check the root package/outermost namespace (a class A in module // A.B leads to problems if another module A.C is also imported) if (Len(package) > 0) { String *dotless_package = NewStringWithSize(package, Len(package) - 1); if (Cmp(class_name, dotless_package) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the root package it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(dotless_package); } else { String *outer = createFirstNamespaceName(nspace); if (Cmp(class_name, outer) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the outermost namespace it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(outer); } // … and the innermost one (because of the conflict with the main proxy // module named like the namespace). String *inner = createLastNamespaceName(nspace); if (Cmp(class_name, inner) == 0) { Swig_error(input_file, line_number, "Class name cannot be the same as the innermost namespace it is in: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } Delete(inner); } else { if (Cmp(class_name, proxy_dmodule_name) == 0) { Swig_error(input_file, line_number, "Class name cannot be equal to proxy D module name: %s\n", class_name); SWIG_exit(EXIT_FAILURE); } } } } /* --------------------------------------------------------------------------- * D::getPrimitiveDptype() * * Returns the D proxy type for the passed type if it is a primitive type in * both C and D. * --------------------------------------------------------------------------- */ String *getPrimitiveDptype(Node *node, SwigType *type) { SwigType *stripped_type = SwigType_typedef_resolve_all(type); // A reference can only be the »outermost element« of a type. bool mutable_ref = false; if (SwigType_isreference(stripped_type)) { SwigType_del_reference(stripped_type); if (SwigType_isconst(stripped_type)) { SwigType_del_qualifier(stripped_type); } else { mutable_ref = true; } } // Strip all the pointers from the type. int indirection_count = 0; while (SwigType_ispointer(stripped_type)) { ++indirection_count; SwigType_del_pointer(stripped_type); } // Now that we got rid of the pointers, see if we are dealing with a // primitive type. String *dtype = 0; if (SwigType_isfunction(stripped_type) && indirection_count > 0) { // type was a function pointer, split it up. SwigType_add_pointer(stripped_type); --indirection_count; SwigType *return_type = Copy(stripped_type); SwigType *params_type = SwigType_functionpointer_decompose(return_type); String *return_dtype = getPrimitiveDptype(node, return_type); Delete(return_type); if (!return_dtype) { return 0; } List *parms = SwigType_parmlist(params_type); List *param_dtypes = NewList(); for (Iterator it = First(parms); it.item; it = Next(it)) { String *current_dtype = getPrimitiveDptype(node, it.item); if (Cmp(current_dtype, "void") == 0) { // void somefunc(void) is legal syntax in C, but not in D, so simply // skip the void parameter. Delete(current_dtype); continue; } if (!current_dtype) { Delete(return_dtype); Delete(param_dtypes); return 0; } Append(param_dtypes, current_dtype); } String *param_list = NewString(""); { bool gen_comma = false; for (Iterator it = First(param_dtypes); it.item; it = Next(it)) { if (gen_comma) { Append(param_list, ", "); } Append(param_list, it.item); Delete(it.item); gen_comma = true; } } dtype = NewStringf("%s.SwigExternC!(%s function(%s))", im_dmodule_fq_name, return_dtype, param_list); Delete(param_list); Delete(param_dtypes); Delete(return_dtype); } else { Hash *attributes = NewHash(); const String *tm = lookupCodeTypemap(node, "dtype", stripped_type, WARN_NONE, attributes); if(!GetFlag(attributes, "tmap:dtype:cprimitive")) { dtype = 0; } else { dtype = Copy(tm); // We need to call replaceClassname here with the stripped type to avoid // $dclassname in the enum typemaps being replaced later with the full // type. replaceClassname(dtype, stripped_type); } Delete(attributes); } Delete(stripped_type); if (!dtype) { // The type passed is no primitive type. return 0; } // The type is ultimately a primitive type, now append the right number of // indirection levels (pointers). for (int i = 0; i < indirection_count; ++i) { Append(dtype, "*"); } // Add a level of indirection for a mutable reference since it is wrapped // as a pointer. if (mutable_ref) { Append(dtype, "*"); } return dtype; } /* --------------------------------------------------------------------------- * D::lookupCodeTypemap() * * Looks up a D code fragment for generating the wrapper class for the given * type. * * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * --------------------------------------------------------------------------- */ const String *lookupCodeTypemap(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) const { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) { Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } } if (!typemap_attributes) { Delete(node); } return tm; } /* --------------------------------------------------------------------------- * D::lookupDTypemap() * * Looks up a D typemap for the given node, replacing D-specific special * variables as needed. * * The method parameter specifies the typemap method to use. If attached is * true, the value is just fetched from the tmap: node attribute, * Swig_typemap_lookup is used otherwise. * --------------------------------------------------------------------------- */ String *lookupDTypemap(Node *n, const_String_or_char_ptr method, bool attached = false) { String *result = 0; if (attached) { String *attr_name = NewStringf("tmap:%s", method); result = Copy(Getattr(n, attr_name)); Delete(attr_name); } else { // FIXME: As a workaround for a bug so far only surfacing in the // smart_pointer_const_overload test case, remove the nativepointer // typemap attribute since it seems to be already there from a dout // typemap of a different type in that test. String *np_key = NewStringf("tmap:%s:nativepointer", method); Delattr(n, np_key); Delete(np_key); result = Swig_typemap_lookup(method, n, "", 0); } if (!result) { return 0; } // Check if the passed node actually has type information attached. This // is not the case e.g. in constructorWrapper. SwigType *type = Getattr(n, "type"); if (type) { String *np_key = NewStringf("tmap:%s:nativepointer", method); String *np_value = Getattr(n, np_key); Delete(np_key); String *dtype; if (np_value && (dtype = getPrimitiveDptype(n, type))) { // If the typemap in question has a »nativepointer« attribute and we // are dealing with a primitive type, use it instead. result = Copy(np_value); Replaceall(result, "$dtype", dtype); } replaceClassname(result, type); } return result; } /* --------------------------------------------------------------------------- * D::replaceClassname() * * Replaces the special variable $dclassname with the proxy class name for * classes/structs/unions SWIG knows about. Also substitutes the enumeration * name for non-anonymous enums. Otherwise, $classname is replaced with a * $descriptor(type)-like name. * * $*dclassname and $&classname work like with descriptors (see manual section * 10.4.3), they remove a prointer from respectively add a pointer to the type. * * Inputs: * tm - String to perform the substitution at (will usually come from a * typemap. * pt - The type to substitute for the variables. * Outputs: * tm - String with the variables substituted. * Return: * substitution_performed - flag indicating if a substitution was performed * --------------------------------------------------------------------------- */ bool replaceClassname(String *tm, SwigType *pt) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$dclassname")) { SwigType *classnametype = Copy(strippedtype); replaceClassnameVariable(tm, "$dclassname", classnametype); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*dclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); replaceClassnameVariable(tm, "$*dclassname", classnametype); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$&dclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); replaceClassnameVariable(tm, "$&dclassname", classnametype); substitution_performed = true; Delete(classnametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* --------------------------------------------------------------------------- * D::replaceClassnameVariable() * * See D::replaceClassname(). * --------------------------------------------------------------------------- */ void replaceClassnameVariable(String *target, const char *variable, SwigType *type) { // TODO: Fix const-correctness of methods called in here and make type const. // We make use of the fact that this function is called at least once for // every type encountered which is written to a separate file, which allows // us to handle imports here. // When working in split proxy module mode, each generated proxy class/enum // is written to a separate module. This requires us to add a corresponding // import when a type is used in another generated module. If we are not // working in split proxy module mode, this is not relevant and the // generated module name is discarded. String *type_name; if (SwigType_isenum(type)) { // RESEARCH: Make sure that we really cannot get here for anonymous enums. Node *n = enumLookup(type); if (n) { String *enum_name = Getattr(n, "sym:name"); Node *p = parentNode(n); if (p && !Strcmp(nodeType(p), "class")) { // This is a nested enum. String *parent_name = Getattr(p, "sym:name"); String *nspace = Getattr(p, "sym:nspace"); // An enum nested in a class is not written to a separate module (this // would not even be possible in D), so just import the parent. requireDType(nspace, parent_name); String *module = createModuleName(nspace, parent_name); if (inProxyModule(module)) { type_name = NewStringf("%s.%s", parent_name, enum_name); } else { type_name = NewStringf("%s%s.%s.%s", package, module, parent_name, enum_name); } } else { // A non-nested enum is written to a separate module, import it. String *nspace = Getattr(n, "sym:nspace"); requireDType(nspace, enum_name); String *module = createModuleName(nspace, enum_name); if (inProxyModule(module)) { type_name = Copy(enum_name); } else { type_name = NewStringf("%s%s.%s", package, module, enum_name); } } } else { type_name = NewStringf("int"); } } else { Node *n = classLookup(type); if (n) { String *class_name = Getattr(n, "sym:name"); String *nspace = Getattr(n, "sym:nspace"); requireDType(nspace, class_name); String *module = createModuleName(nspace, class_name); if (inProxyModule(module)) { type_name = Copy(class_name); } else { type_name = NewStringf("%s%s.%s", package, module, class_name); } Delete(module); } else { // SWIG does not know anything about the type (after resolving typedefs). // Just mangle the type name string like $descriptor(type) would do. String *descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); requireDType(NULL, descriptor); String *module = createModuleName(NULL, descriptor); if (inProxyModule(module)) { type_name = Copy(descriptor); } else { type_name = NewStringf("%s%s.%s", package, module, descriptor); } Delete(module); // Add to hash table so that a type wrapper class can be created later. Setattr(unknown_types, descriptor, type); Delete(descriptor); } } Replaceall(target, variable, type_name); Delete(type_name); } /* --------------------------------------------------------------------------- * D::createModuleName() * * Returns a string holding the name of the module to import to bring the * given type in scope. * --------------------------------------------------------------------------- */ String *createModuleName(const String *nspace, const String *type_name) const { String *module; if (nspace) { module = NewStringf("%s.", nspace); if (split_proxy_dmodule) { Printv(module, type_name, NIL); } else { String *inner = createLastNamespaceName(nspace); Printv(module, inner, NIL); Delete(inner); } } else { if (split_proxy_dmodule) { module = Copy(type_name); } else { module = Copy(proxy_dmodule_name); } } return module; } /* --------------------------------------------------------------------------- * D::replaceModuleVariables() * * Replaces the $imdmodule and $module variables with their values in the * target string. * --------------------------------------------------------------------------- */ void replaceModuleVariables(String *target) const { Replaceall(target, "$imdmodule", im_dmodule_fq_name); Replaceall(target, "$module", proxy_dmodule_name); } /* --------------------------------------------------------------------------- * D::replaceExcode() * * If a C++ method can throw a exception, additional code is added to the * proxy method to check if an exception is pending so that it can be * rethrown on the D side. * * This method replaces the $excode variable with the exception handling code * in the excode typemap attribute if it »canthrow« an exception. * --------------------------------------------------------------------------- */ void replaceExcode(Node *n, String *code, const String *typemap, Node *parameter) const { String *excode_attribute = NewStringf("tmap:%s:excode", typemap); String *excode = Getattr(parameter, excode_attribute); if (Getattr(n, "d:canthrow")) { int count = Replaceall(code, "$excode", excode); if (count < 1 || !excode) { Swig_warning(WARN_D_EXCODE_MISSING, input_file, line_number, "D exception may not be thrown – no $excode or excode attribute in '%s' typemap.\n", typemap); } } else { Replaceall(code, "$excode", ""); } Delete(excode_attribute); } /* --------------------------------------------------------------------------- * D::replaceImportTypeMacros() * * Replaces the $importtype(SomeDClass) macro with an import statement if it * is required to get SomeDClass in scope for the currently generated proxy * D module. * --------------------------------------------------------------------------- */ void replaceImportTypeMacros(String *target) const { // Code from replace_embedded_typemap. char *start = 0; while ((start = Strstr(target, "$importtype("))) { char *end = 0; char *param_start = 0; char *param_end = 0; int level = 0; char *c = start; while (*c) { if (*c == '(') { if (level == 0) { param_start = c + 1; } level++; } if (*c == ')') { level--; if (level == 0) { param_end = c; end = c + 1; break; } } c++; } if (end) { String *current_macro = NewStringWithSize(start, (int)(end - start)); String *current_param = NewStringWithSize(param_start, (int)(param_end - param_start)); if (inProxyModule(current_param)) { Replace(target, current_macro, "", DOH_REPLACE_ANY); } else { String *import = createImportStatement(current_param, false); Replace(target, current_macro, import, DOH_REPLACE_ANY); Delete(import); } Delete(current_param); Delete(current_macro); } else { String *current_macro = NewStringWithSize(start, (int)(c - start)); Swig_error(Getfile(target), Getline(target), "Syntax error in: %s\n", current_macro); Replace(target, current_macro, "", DOH_REPLACE_ANY); Delete(current_macro); } } } /* --------------------------------------------------------------------------- * D::getOverloadedName() * --------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) const { // A void* parameter is used for all wrapped classes in the wrapper code. // Thus, the wrapper function names for overloaded functions are postfixed // with a counter string to make them unique. String *overloaded_name = Copy(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Append(overloaded_name, Getattr(n, "sym:overname")); } return overloaded_name; } /* --------------------------------------------------------------------------- * D::createProxyName() * * Returns the D class name if a type corresponds to something wrapped with a * proxy class, NULL otherwise. * --------------------------------------------------------------------------- */ String *createProxyName(SwigType *t) { String *proxyname = NULL; Node *n = classLookup(t); if (n) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Getattr(n, "sym:name"); String *module = createModuleName(nspace, symname); if (inProxyModule(module)) { proxyname = Copy(symname); } else { proxyname = NewStringf("%s%s.%s", package, module, symname); } } return proxyname; } String *makeParameterName(Node *n, Parm *p, int arg_num, bool setter) const { String *arg = Language::makeParameterName(n, p, arg_num, setter); if (split_proxy_dmodule && Strncmp(arg, package, Len(arg)) == 0) { // If we are in split proxy mode and the argument is named like the target // package, we append an underscore to its name to avoid clashes. Append(arg, "_"); } return arg; } /* --------------------------------------------------------------------------- * D::canThrow() * * Determines whether the code in the typemap can throw a D exception. * If so, note it for later when excodeSubstitute() is called. * --------------------------------------------------------------------------- */ void canThrow(Node *n, const String *typemap, Node *parameter) const { String *canthrow_attribute = NewStringf("tmap:%s:canthrow", typemap); String *canthrow = Getattr(parameter, canthrow_attribute); if (canthrow) Setattr(n, "d:canthrow", "1"); Delete(canthrow_attribute); } /* --------------------------------------------------------------------------- * D::wrapMemberFunctionAsDConst() * * Determines whether the member function represented by the passed node is * wrapped as D »const« or not. * --------------------------------------------------------------------------- */ bool wrapMemberFunctionAsDConst(Node *n) const { if (d_version == 1) return false; if (static_flag) return false; // Never emit »const« for static member functions. return GetFlag(n, "memberget") || SwigType_isconst(Getattr(n, "decl")); } /* --------------------------------------------------------------------------- * D::areAllOverloadsOverridden() * * Determines whether the class the passed function node belongs to overrides * all the overlaods for the passed function node defined somewhere up the * inheritance hierachy. * --------------------------------------------------------------------------- */ bool areAllOverloadsOverridden(Node *n) const { List *base_list = Getattr(parentNode(n), "bases"); if (!base_list) { // If the class which contains n is not derived from any other class, // there cannot be any not-overridden overloads. return true; } // In case of multiple base classes, skip to the one which has not been // ignored. // RESEARCH: Also emit a warning in case of multiple inheritance here? Iterator it = First(base_list); while (it.item && GetFlag(it.item, "feature:ignore")) { it = Next(it); } Node *base_class = it.item; if (!base_class) { // If all base classes have been ignored, there cannot be one either. return true; } // We try to find at least a single overload which exists in the base class // so we can progress up the inheritance hierachy even if there have been // new overloads introduced after the topmost class. Node *base_function = NULL; String *symname = Getattr(n, "sym:name"); if (symname) { for (Node *tmp = firstChild(base_class); tmp; tmp = nextSibling(tmp)) { String *child_symname = Getattr(tmp, "sym:name"); if (child_symname && (Strcmp(child_symname, symname) == 0)) { base_function = tmp; break; } } } if (!base_function) { // If there is no overload which also exists in the super class, there // cannot be any base class overloads not overridden. return true; } size_t base_overload_count = 0; for (Node *tmp = firstSibling(base_function); tmp; tmp = Getattr(tmp, "sym:nextSibling")) { if (is_protected(base_function) && !(Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode())) { // If the base class function is »protected« and were are not in // director mode, it is not emitted to the base class and thus we do // not count it. Otherwise, we would run into issues if the visiblity // of some functions was changed from protected to public in a child // class with the using directive. continue; } ++base_overload_count; } return ((base_overload_count <= overridingOverloadCount(n)) && areAllOverloadsOverridden(base_function)); } /* --------------------------------------------------------------------------- * D::overridingOverloadCount() * * Given a member function node, this function counts how many of the * overloads of the function (including itself) override a function in the * base class. * --------------------------------------------------------------------------- */ size_t overridingOverloadCount(Node *n) const { size_t result = 0; Node *tmp = firstSibling(n); do { // KLUDGE: We also have to count the function if the access attribute is // not present, since this means that it has been promoted into another // protection level in the base class with the C++ »using« directive, and // is thus taken into account when counting the base class overloads, even // if it is not marked as »override« by the SWIG parser. if (Getattr(n, "override") || !Getattr(n, "access")) { ++result; } } while((tmp = Getattr(tmp, "sym:nextSibling"))); return result; } /* --------------------------------------------------------------------------- * D::firstSibling() * * Returns the first sibling of the passed node. * --------------------------------------------------------------------------- */ Node *firstSibling(Node *n) const { Node *result = n; while (Node *tmp = Getattr(result, "sym:previousSibling")) { result = tmp; } return result; } /* --------------------------------------------------------------------------- * D::indentCode() * * Helper function to indent a code (string) by one level. * --------------------------------------------------------------------------- */ void indentCode(String* code) const { Replaceall(code, "\n", "\n "); Replaceall(code, " \n", "\n"); Chop(code); } /* --------------------------------------------------------------------------- * D::emitBanner() * --------------------------------------------------------------------------- */ void emitBanner(File *f) const { Printf(f, "/* ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, " *"); Printf(f, " * ----------------------------------------------------------------------------- */\n\n"); } /* --------------------------------------------------------------------------- * D::outputDirectory() * * Returns the directory to write the D modules for the given namespace to and * and creates the subdirectory if it doesn't exist. * --------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(dmodule_directory); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /* --------------------------------------------------------------------------- * D::proxyCodeBuffer() * * Returns the buffer to write proxy code for the given namespace to. * --------------------------------------------------------------------------- */ String *proxyCodeBuffer(String *nspace) { if (!nspace) { return proxy_dmodule_code; } Hash *hash = Getattr(nspace_proxy_dmodules, nspace); if (!hash) { hash = NewHash(); Setattr(hash, "code", NewString("")); Setattr(hash, "imports", NewString("")); Setattr(nspace_proxy_dmodules, nspace, hash); } return Getattr(hash, "code"); } /* --------------------------------------------------------------------------- * D::proxyCodeBuffer() * * Returns the buffer to write imports for the proxy code for the given * namespace to. * --------------------------------------------------------------------------- */ String *proxyImportsBuffer(String *nspace) { if (!nspace) { return proxy_dmodule_imports; } Hash *hash = Getattr(nspace_proxy_dmodules, nspace); if (!hash) { hash = NewHash(); Setattr(hash, "code", NewString("")); Setattr(hash, "imports", NewString("")); Setattr(nspace_proxy_dmodules, nspace, hash); } return Getattr(hash, "imports"); } /* --------------------------------------------------------------------------- * D::createFirstNamespaceName() * * Returns a new string containing the name of the outermost namespace, e.g. * »A« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createFirstNamespaceName(const String *nspace) const { char *tmp = Char(nspace); char *c = tmp; char *co = 0; if (!strstr(c, ".")) return 0; co = c + Len(nspace); while (*c && (c != co)) { if (*c == '.') { break; } c++; } if (!*c || (c == tmp)) { return NULL; } return NewStringWithSize(tmp, (int)(c - tmp)); } /* --------------------------------------------------------------------------- * D::createLastNamespaceName() * * Returns a new string containing the name of the innermost namespace, e.g. * »C« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createLastNamespaceName(const String *nspace) const { if (!nspace) return NULL; char *c = Char(nspace); char *cc = c; if (!strstr(c, ".")) return NewString(nspace); while (*c) { if (*c == '.') { cc = c; } ++c; } return NewString(cc + 1); } /* --------------------------------------------------------------------------- * D::createOuterNamespaceNames() * * Returns a new string containing the name of the outer namespace, e.g. * »A.B« for the argument »A.B.C«. * --------------------------------------------------------------------------- */ String *createOuterNamespaceNames(const String *nspace) const { if (!nspace) return NULL; char *tmp = Char(nspace); char *c = tmp; char *cc = c; if (!strstr(c, ".")) return NULL; while (*c) { if (*c == '.') { cc = c; } ++c; } if (cc == tmp) { return NULL; } return NewStringWithSize(tmp, (int)(cc - tmp)); } }; static Language *new_swig_d() { return new D(); } /* ----------------------------------------------------------------------------- * swig_d() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_d(void) { return new_swig_d(); } /* ----------------------------------------------------------------------------- * Usage information displayed at the command line. * ----------------------------------------------------------------------------- */ const char *D::usage = "\ D Options (available with -d)\n\ -d2 - Generate code for D2/Phobos (default: D1/Tango)\n\ -package - Write generated D modules into package \n\ -splitproxy - Write each D type to a dedicated file instead of\n\ generating a single proxy D module.\n\ -wrapperlibrary - Set the name of the wrapper library to \n\ \n"; swig-3.0.12/Source/Modules/utils.cxx0000664000175000017500000001766313042756442017206 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * utils.cxx * * Various utility functions. * ----------------------------------------------------------------------------- */ #include int is_public(Node *n) { String *access = Getattr(n, "access"); return !access || !Cmp(access, "public"); } int is_private(Node *n) { String *access = Getattr(n, "access"); return access && !Cmp(access, "private"); } int is_protected(Node *n) { String *access = Getattr(n, "access"); return access && !Cmp(access, "protected"); } static int is_member_director_helper(Node *parentnode, Node *member) { int parent_nodirector = GetFlag(parentnode, "feature:nodirector"); if (parent_nodirector) return 0; int parent_director = Swig_director_mode() && GetFlag(parentnode, "feature:director"); int cdecl_director = parent_director || GetFlag(member, "feature:director"); int cdecl_nodirector = GetFlag(member, "feature:nodirector"); return cdecl_director && !cdecl_nodirector && !GetFlag(member, "feature:extend"); } int is_member_director(Node *parentnode, Node *member) { if (parentnode && checkAttribute(member, "storage", "virtual")) { return is_member_director_helper(parentnode, member); } else { return 0; } } int is_member_director(Node *member) { return is_member_director(Getattr(member, "parentNode"), member); } // Identifies the additional protected members that are generated when the allprotected option is used. // This does not include protected virtual methods as they are turned on with the dirprot option. int is_non_virtual_protected_access(Node *n) { int result = 0; if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode() && is_protected(n) && !checkAttribute(n, "storage", "virtual")) { Node *parentNode = Getattr(n, "parentNode"); // When vtable is empty, the director class does not get emitted, so a check for an empty vtable should be done. // However, vtable is set in Language and so is not yet set when methods in Typepass call clean_overloaded() // which calls is_non_virtual_protected_access. So commented out below. // Moving the director vtable creation into into Typepass should solve this problem. if (is_member_director_helper(parentNode, n) /* && Getattr(parentNode, "vtable")*/) result = 1; } return result; } /* Clean overloaded list. Removes templates, ignored, and errors */ void clean_overloaded(Node *n) { Node *nn = Getattr(n, "sym:overloaded"); Node *first = 0; while (nn) { String *ntype = nodeType(nn); if ((GetFlag(nn, "feature:ignore")) || (Getattr(nn, "error")) || (Strcmp(ntype, "template") == 0) || ((Strcmp(ntype, "cdecl") == 0) && is_protected(nn) && !is_member_director(nn) && !is_non_virtual_protected_access(n))) { /* Remove from overloaded list */ Node *ps = Getattr(nn, "sym:previousSibling"); Node *ns = Getattr(nn, "sym:nextSibling"); if (ps) { Setattr(ps, "sym:nextSibling", ns); } if (ns) { Setattr(ns, "sym:previousSibling", ps); } Delattr(nn, "sym:previousSibling"); Delattr(nn, "sym:nextSibling"); Delattr(nn, "sym:overloaded"); nn = ns; continue; } else { if (!first) first = nn; Setattr(nn, "sym:overloaded", first); } nn = Getattr(nn, "sym:nextSibling"); } if (!first || (first && !Getattr(first, "sym:nextSibling"))) { if (Getattr(n, "sym:overloaded")) Delattr(n, "sym:overloaded"); } } /* ----------------------------------------------------------------------------- * Swig_set_max_hash_expand() * * Controls how many Hash objects are displayed when displaying nested Hash objects. * Makes DohSetMaxHashExpand an externally callable function (for debugger). * ----------------------------------------------------------------------------- */ void Swig_set_max_hash_expand(int count) { SetMaxHashExpand(count); } extern "C" { /* ----------------------------------------------------------------------------- * Swig_get_max_hash_expand() * * Returns how many Hash objects are displayed when displaying nested Hash objects. * Makes DohGetMaxHashExpand an externally callable function (for debugger). * ----------------------------------------------------------------------------- */ int Swig_get_max_hash_expand() { return GetMaxHashExpand(); } /* ----------------------------------------------------------------------------- * Swig_to_doh_string() * * DOH version of Swig_to_string() * ----------------------------------------------------------------------------- */ static String *Swig_to_doh_string(DOH *object, int count) { int old_count = Swig_get_max_hash_expand(); if (count >= 0) Swig_set_max_hash_expand(count); String *debug_string = object ? NewStringf("%s", object) : NewString("NULL"); Swig_set_max_hash_expand(old_count); return debug_string; } /* ----------------------------------------------------------------------------- * Swig_to_doh_string_with_location() * * DOH version of Swig_to_string_with_location() * ----------------------------------------------------------------------------- */ static String *Swig_to_doh_string_with_location(DOH *object, int count) { int old_count = Swig_get_max_hash_expand(); if (count >= 0) Swig_set_max_hash_expand(count); String *debug_string = Swig_stringify_with_location(object); Swig_set_max_hash_expand(old_count); return debug_string; } /* ----------------------------------------------------------------------------- * Swig_to_string() * * Swig debug - return C string representation of any DOH type. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * Note: leaks memory. * ----------------------------------------------------------------------------- */ const char *Swig_to_string(DOH *object, int count) { return Char(Swig_to_doh_string(object, count)); } /* ----------------------------------------------------------------------------- * Swig_to_string_with_location() * * Swig debug - return C string representation of any DOH type, within [] brackets * for Hash and List types, prefixed by line and file information. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * Note: leaks memory. * ----------------------------------------------------------------------------- */ const char *Swig_to_string_with_location(DOH *object, int count) { return Char(Swig_to_doh_string_with_location(object, count)); } /* ----------------------------------------------------------------------------- * Swig_print() * * Swig debug - display string representation of any DOH type. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * ----------------------------------------------------------------------------- */ void Swig_print(DOH *object, int count) { String *output = Swig_to_doh_string(object, count); Printf(stdout, "%s\n", output); Delete(output); } /* ----------------------------------------------------------------------------- * Swig_to_string_with_location() * * Swig debug - display string representation of any DOH type, within [] brackets * for Hash and List types, prefixed by line and file information. * Nested Hash types expand count is value of Swig_get_max_hash_expand when count<0 * ----------------------------------------------------------------------------- */ void Swig_print_with_location(DOH *object, int count) { String *output = Swig_to_doh_string_with_location(object, count); Printf(stdout, "%s\n", output); Delete(output); } } // extern "C" swig-3.0.12/Source/Modules/lua.cxx0000664000175000017500000025355513042756442016631 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * lua.cxx * * Lua language module for SWIG. * ----------------------------------------------------------------------------- */ /* NEW LANGUAGE NOTE: * ver001 this is simply a copy of tcl8.cxx, which has been renamed * ver002 all non essential code commented out, program now does virtually nothing it prints to stderr the list of functions to wrap, but does not create the XXX_wrap.c file * ver003 added back top(), still prints the list of fns to stderr but now creates a rather empty XXX_wrap.c with some basic boilerplate code * ver004 very basic version of functionWrapper() also uncommented usage_string() to keep compiler happy this will start producing proper looking code soon (I hope) produced the wrapper code, but without any type conversion (in or out) generates a few warning because of no wrappering does not generate SWIG_init() reason for this is that lua.swg is empty we will need to add code into this to make it work * ver005/6 massive rework, basing work on the pike module instead of tcl (pike module it only 1/3 of the size)(though not as complete) * ver007 added simple type checking * ver008 INPUT, OUTPUT, INOUT typemaps handled (though not all types yet) * ver009 class support: ok for basic types, but methods still TDB (code is VERY messed up & needs to be cleaned) * ver010 Added support for embedded Lua. Try swig -lua -help for more information */ #include "swigmod.h" #include "cparse.h" /**** Diagnostics: With the #define REPORT(), you can change the amount of diagnostics given This helps me search the parse tree & figure out what is going on inside SWIG (because its not clear or documented) */ #define REPORT(T,D) // no info: //#define REPORT(T,D) {Printf(stdout,T"\n");} // only title //#define REPORT(T,D) {Printf(stdout,T" %p\n",n);} // title & pointer //#define REPORT(T,D) {Printf(stdout,T"\n");display_mapping(D);} // the works //#define REPORT(T,D) {Printf(stdout,T"\n");if(D)Swig_print_node(D);} // the works void display_mapping(DOH *d) { if (d == 0 || !DohIsMapping(d)) return; for (Iterator it = First(d); it.item; it = Next(it)) { if (DohIsString(it.item)) Printf(stdout, " %s = %s\n", it.key, it.item); else if (DohIsMapping(it.item)) Printf(stdout, " %s = \n", it.key); else if (DohIsSequence(it.item)) Printf(stdout, " %s = \n", it.key); else Printf(stdout, " %s = \n", it.key); } } extern "C" { static int compareByLen(const DOH *f, const DOH *s) { return Len(s) - Len(f); } } /* NEW LANGUAGE NOTE:*********************************************** most of the default options are handled by SWIG you can add new ones here (though for now I have not bothered) NEW LANGUAGE NOTE:END ************************************************/ static const char *usage = "\ Lua Options (available with -lua)\n\ -elua - Generates LTR compatible wrappers for smaller devices running elua\n\ -eluac - LTR compatible wrappers in \"crass compress\" mode for elua\n\ -elua-emulate - Emulates behaviour of eLua. Useful only for testing.\n\ Incompatible with -elua/-eluac options.\n\ -nomoduleglobal - Do not register the module name as a global variable \n\ but return the module table from calls to require.\n\ -no-old-metatable-bindings\n\ - Disable support for old-style bindings name generation, some\n\ old-style members scheme etc.\n\ -squash-bases - Squashes symbols from all inheritance tree of a given class\n\ into itself. Emulates pre-SWIG3.0 inheritance. Insignificantly\n\ speeds things up, but increases memory consumption.\n\ \n"; static int nomoduleglobal = 0; static int elua_ltr = 0; static int eluac_ltr = 0; static int elua_emulate = 0; static int squash_bases = 0; /* The new metatable bindings were introduced in SWIG 3.0.0. * old_metatable_bindings in v2: * 1. static methods will be put into the scope their respective class * belongs to as well as into the class scope itself. (only for classes without %nspace given) * 2. The layout in elua mode is somewhat different */ static int old_metatable_bindings = 1; static int old_compatible_names = 1; // This flag can temporarily disable backward compatible names generation if old_metatable_bindings is enabled /* NEW LANGUAGE NOTE:*********************************************** To add a new language, you need to derive your class from Language and the overload various virtual functions (more on this as I figure it out) NEW LANGUAGE NOTE:END ************************************************/ class LUA:public Language { private: File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; File *f_initbeforefunc; String *s_luacode; // luacode to be called during init String *module; //name of the module // Parameters for current class. NIL if not parsing class int have_constructor; int have_destructor; String *destructor_action; // This variable holds the name of the current class in Lua. Usually it is // the same as C++ class name, but rename directives can change it. String *proxy_class_name; // This is a so calld fully qualified symname - the above proxy class name // prepended with class namespace. If class Lua name is the same as class C++ name, // then it is basically C++ fully qualified name with colons replaced with dots. String *full_proxy_class_name; // All static methods and/or variables are treated as if they were in the // special C++ namespace $(classname).SwigStatic. This is internal mechanism only // and is not visible to user in any manner. This variable holds the name // of such pseudo-namespace a.k.a the result of above expression evaluation String *class_static_nspace; // This variable holds the name of generated C function that acts as a constructor // for the currently parsed class. String *constructor_name; // Many wrappers forward calls to each other, for example staticmembervariableHandler // forwards calls to variableHandler, which, in turn, makes to call to functionWrapper. // In order to access information about whether it is a static member of class or just // a plain old variable, the current array is kept and used as a 'log' of the call stack. enum TState { NO_CPP, VARIABLE, GLOBAL_FUNC, GLOBAL_VAR, MEMBER_FUNC, CONSTRUCTOR, DESTRUCTOR, MEMBER_VAR, STATIC_FUNC, STATIC_VAR, STATIC_CONST, // enums and things like static const int x = 5; ENUM_CONST, // This is only needed for backward compatibility in C mode STATES_COUNT }; bool current[STATES_COUNT]; public: /* --------------------------------------------------------------------- * LUA() * * Initialize member data * --------------------------------------------------------------------- */ LUA(): f_begin(0), f_runtime(0), f_header(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), s_luacode(0), module(0), have_constructor(0), have_destructor(0), destructor_action(0), proxy_class_name(0), full_proxy_class_name(0), class_static_nspace(0), constructor_name(0) { for (int i = 0; i < STATES_COUNT; i++) current[i] = false; } /* NEW LANGUAGE NOTE:*********************************************** This is called to initialise the system & read any command line args most of this is boilerplate code, except the command line args which depends upon what args your code supports NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { /* Set location of SWIG library */ SWIG_library_directory("lua"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { // usage flags fputs(usage, stdout); } else if (strcmp(argv[i], "-nomoduleglobal") == 0) { nomoduleglobal = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-elua") == 0) { elua_ltr = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-eluac") == 0) { eluac_ltr = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-no-old-metatable-bindings") == 0) { Swig_mark_arg(i); old_metatable_bindings = 0; } else if (strcmp(argv[i], "-squash-bases") == 0) { Swig_mark_arg(i); squash_bases = 1; } else if (strcmp(argv[i], "-elua-emulate") == 0) { Swig_mark_arg(i); elua_emulate = 1; } } } if (elua_emulate && (eluac_ltr || elua_ltr )) { Printf(stderr, "Cannot have -elua-emulate with either -eluac or -elua\n"); Swig_arg_error(); } // Set elua_ltr if elua_emulate is requested if(elua_emulate) elua_ltr = 1; /* NEW LANGUAGE NOTE:*********************************************** This is the boilerplate code, setting a few #defines and which lib directory to use the SWIG_library_directory() is also boilerplate code but it always seems to be the first line of code NEW LANGUAGE NOTE:END *********************************************** */ /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGLUA 1", 0); /* Set language-specific configuration file */ SWIG_config_file("lua.swg"); /* Set typemap language */ SWIG_typemap_lang("lua"); /* Enable overloaded methods support */ allow_overloading(); } /* NEW LANGUAGE NOTE:*********************************************** After calling main, SWIG parses the code to wrap (I believe) then calls top() in this is more boilerplate code to set everything up and a call to Language::top() which begins the code generations by calling the member fns after all that is more boilerplate code to close all down (overall there is virtually nothing here that needs to be edited just use as is) NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { /* Get the module name */ module = Getattr(n, "name"); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); /* Open the output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_initbeforefunc = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); s_luacode = NewString(""); Swig_register_filebyname("luacode", s_luacode); current[NO_CPP] = true; /* Standard stuff for the SWIG runtime section */ Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGLUA\n#define SWIGLUA\n#endif\n\n"); emitLuaFlavor(f_runtime); if (nomoduleglobal) { Printf(f_runtime, "#define SWIG_LUA_NO_MODULE_GLOBAL\n"); } else { Printf(f_runtime, "#define SWIG_LUA_MODULE_GLOBAL\n"); } if (squash_bases) Printf(f_runtime, "#define SWIG_LUA_SQUASH_BASES\n"); // if (NoInclude) { // Printf(f_runtime, "#define SWIG_NOINCLUDE\n"); // } Printf(f_runtime, "\n"); //String *init_name = NewStringf("%(title)s_Init", module); //Printf(f_header, "#define SWIG_init %s\n", init_name); //Printf(f_header, "#define SWIG_name \"%s\"\n", module); /* SWIG_import is a special function name for importing within Lua5.1 */ //Printf(f_header, "#define SWIG_import luaopen_%s\n\n", module); Printf(f_header, "#define SWIG_name \"%s\"\n", module); Printf(f_header, "#define SWIG_init luaopen_%s\n", module); Printf(f_header, "#define SWIG_init_user luaopen_%s_user\n\n", module); Printf(f_header, "#define SWIG_LUACODE luaopen_%s_luacode\n", module); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* %init code inclusion, effectively in the SWIG_init function */ Printf(f_init, "void SWIG_init_user(lua_State* L)\n{\n"); Language::top(n); Printf(f_init, "/* exec Lua code if applicable */\nSWIG_Lua_dostring(L,SWIG_LUACODE);\n"); Printf(f_init, "}\n"); // Done. Close up the module & write to the wrappers closeNamespaces(f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* NEW LANGUAGE NOTE:*********************************************** this basically combines several of the strings together and then writes it all to a file NEW LANGUAGE NOTE:END *********************************************** */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); /* for the Lua code it needs to be properly escaped to be added into the C/C++ code */ escapeCode(s_luacode); Printf(f_begin, "const char* SWIG_LUACODE=\n \"%s\";\n\n", s_luacode); Wrapper_pretty_print(f_init, f_begin); /* Close all of the files */ Delete(s_luacode); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_initbeforefunc); Delete(f_runtime); Delete(f_begin); /* Done */ return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { return Language::importDirective(n); } /* ------------------------------------------------------------ * cDeclaration() * It copies sym:name to lua:name to preserve its original value * ------------------------------------------------------------ */ virtual int cDeclaration(Node *n) { // class 'Language' is messing with symname in a really heavy way. // Although documentation states that sym:name is a name in // the target language space, it is not true. sym:name and // its derivatives are used in various places, including // behind-the-scene C code generation. The best way is not to // touch it at all. // But we need to know what was the name of function/variable // etc that user desired, that's why we store correct symname // as lua:name String *symname = Getattr(n, "sym:name"); if (symname) Setattr(n, "lua:name", symname); return Language::cDeclaration(n); } virtual int constructorDeclaration(Node *n) { Setattr(n, "lua:name", Getattr(n, "sym:name")); return Language::constructorDeclaration(n); } virtual int destructorDeclaration(Node *n) { Setattr(n, "lua:name", Getattr(n, "sym:name")); return Language::destructorDeclaration(n); } /* NEW LANGUAGE NOTE:*********************************************** This is it! you get this one right, and most of your work is done but its going to take some file to get it working right quite a bit of this is generally boilerplate code (or stuff I don't understand) that which matters will have extra added comments NEW LANGUAGE NOTE:END *********************************************** */ /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- * registerMethod() * * Determines wrap name of a method, its scope etc and calls * registerMethod overload with correct arguments * Overloaded variant adds method to the "methods" array of specified lua scope/class * ---------------------------------------------------------------------- */ void registerMethod(Node *n, bool overwrite = false, String *overwriteLuaScope = 0) { String *symname = Getattr(n, "sym:name"); assert(symname); if (Getattr(n, "sym:nextSibling")) return; // Lua scope. It is not symbol NSpace, it is the actual key to retrieve getCArraysHash. String *luaScope = luaCurrentSymbolNSpace(); if (overwrite) luaScope = overwriteLuaScope; String *wrapname = 0; String *mrename; if (current[NO_CPP] || !getCurrentClass()) { mrename = symname; } else { assert(!current[NO_CPP]); if (current[STATIC_FUNC] || current[MEMBER_FUNC]) { mrename = Swig_name_member(getNSpace(), getClassPrefix(), symname); } else { mrename = symname; } } wrapname = Swig_name_wrapper(mrename); registerMethod(n, wrapname, luaScope); } /* ----------------------------------------------------------------------- * registerMethod() * * Add method to the "methods" C array of given namespace/class * ---------------------------------------------------------------------- */ void registerMethod(Node *n, String* wname, String *luaScope) { assert(n); Hash *nspaceHash = getCArraysHash(luaScope); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); String *lua_name = Getattr(n, "lua:name"); if (elua_ltr || eluac_ltr) Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "\")", ", LFUNCVAL(", wname, ")", "},\n", NIL); else Printv(s_ns_methods_tab, tab4, "{ \"", lua_name, "\", ", wname, "},\n", NIL); // Add to the metatable if method starts with '__' const char * tn = Char(lua_name); if (tn[0]=='_' && tn[1] == '_' && !eluac_ltr) { String *metatable_tab = Getattr(nspaceHash, "metatable"); assert(metatable_tab); if (elua_ltr) Printv(metatable_tab, tab4, "{LSTRKEY(\"", lua_name, "\")", ", LFUNCVAL(", wname, ")", "},\n", NIL); else Printv(metatable_tab, tab4, "{ \"", lua_name, "\", ", wname, "},\n", NIL); } } virtual int functionWrapper(Node *n) { REPORT("functionWrapper", n); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; int i; //Printf(stdout,"functionWrapper %s %s %d\n",name,iname,current); String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!luaAddSymbol(lua_name, n)) { return SWIG_ERROR; } } /* NEW LANGUAGE NOTE:*********************************************** the wrapper object holds all the wrapper code we need to add a couple of local variables NEW LANGUAGE NOTE:END *********************************************** */ Wrapper *f = NewWrapper(); Wrapper_add_local(f, "SWIG_arg", "int SWIG_arg = 0"); String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } if (current[CONSTRUCTOR]) { if (constructor_name != 0) Delete(constructor_name); constructor_name = Copy(wname); } /* NEW LANGUAGE NOTE:*********************************************** the format of a lua fn is: static int wrap_XXX(lua_State* L){...} this line adds this into the wrapper code NEW LANGUAGE NOTE:END *********************************************** */ Printv(f->def, "static int ", wname, "(lua_State* L) {", NIL); /* NEW LANGUAGE NOTE:*********************************************** this prints the list of args, eg for a C fn int gcd(int x,int y); it will print int arg1; int arg2; NEW LANGUAGE NOTE:END *********************************************** */ /* Write code to extract function parameters. */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); int varargs = emit_isvarargs(l); // Check if we have to ignore arguments that are passed by LUA. // Needed for unary minus, where lua passes two arguments and // we have to ignore the second. int args_to_ignore = 0; if (Getattr(n, "lua:ignore_args")) { args_to_ignore = GetInt(n, "lua:ignore_args"); } /* NEW LANGUAGE NOTE:*********************************************** from here on in, it gets rather hairy this is the code to convert from the scripting language to C/C++ some of the stuff will refer to the typemaps code written in your swig file (lua.swg), and some is done in the code here I suppose you could do all the conversion in C, but it would be a nightmare to do NEW LANGUAGE NOTE:END *********************************************** */ /* Generate code for argument marshalling */ // String *description = NewString(""); /* NEW LANGUAGE NOTE:*********************************************** argument_check is a new feature I added to check types of arguments: eg for int gcd(int,int) I want to check that arg1 & arg2 really are integers NEW LANGUAGE NOTE:END *********************************************** */ String *argument_check = NewString(""); String *argument_parse = NewString(""); String *checkfn = NULL; char source[64]; Printf(argument_check, "SWIG_check_num_args(\"%s\",%d,%d)\n", Swig_name_str(n), num_required + args_to_ignore, num_arguments + args_to_ignore); for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); /* Look for an input typemap */ sprintf(source, "%d", i + 1); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } /* NEW LANGUAGE NOTE:*********************************************** look for a 'checkfn' typemap this an additional parameter added to the in typemap if found the type will be tested for this will result in code either in the argument_check or argument_parse string NEW LANGUAGE NOTE:END *********************************************** */ if ((checkfn = Getattr(p, "tmap:in:checkfn"))) { if (i < num_required) { Printf(argument_check, "if(!%s(L,%s))", checkfn, source); } else { Printf(argument_check, "if(lua_gettop(L)>=%s && !%s(L,%s))", source, checkfn, source); } Printf(argument_check, " SWIG_fail_arg(\"%s\",%s,\"%s\");\n", Swig_name_str(n), source, SwigType_str(pt, 0)); } /* NEW LANGUAGE NOTE:*********************************************** lua states the number of arguments passed to a function using the fn lua_gettop() we can use this to deal with default arguments NEW LANGUAGE NOTE:END *********************************************** */ if (i < num_required) { Printf(argument_parse, "%s\n", tm); } else { Printf(argument_parse, "if(lua_gettop(L)>=%s){%s}\n", source, tm); } p = Getattr(p, "tmap:in:next"); continue; } else { /* NEW LANGUAGE NOTE:*********************************************** // why is this code not called when I don't have a typemap? // instead of giving a warning, no code is generated NEW LANGUAGE NOTE:END *********************************************** */ Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } // add all argcheck code Printv(f->code, argument_check, argument_parse, NIL); /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ String *outarg = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { // // managing the number of returning variables // if (numoutputs=Getattr(p,"tmap:argout:numoutputs")){ // int i=GetInt(p,"tmap:argout:numoutputs"); // printf("got argout:numoutputs of %d\n",i); // returnval+=GetInt(p,"tmap:argout:numoutputs"); // } // else returnval++; Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", Swig_cresult_name()); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Remember C name of the wrapping function Setattr(n, "wrap:name", wname); /* Emit the function call */ String *actioncode = emit_action(n); /* NEW LANGUAGE NOTE:*********************************************** FIXME: returns 1 if there is a void return type this is because there is a typemap for void NEW LANGUAGE NOTE:END *********************************************** */ // Return value if necessary if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { // managing the number of returning variables // if (numoutputs=Getattr(tm,"numoutputs")){ // int i=GetInt(tm,"numoutputs"); // printf("return numoutputs %d\n",i); // returnval+=GetInt(tm,"numoutputs"); // } // else returnval++; Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); // returnval++; } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } /* Close the function */ Printv(f->code, "return SWIG_arg;\n", NIL); // add the failure cleanup code: Printv(f->code, "\nif(0) SWIG_fail;\n", NIL); Printv(f->code, "\nfail:\n", NIL); Printv(f->code, "$cleanup", "lua_error(L);\n", NIL); Printv(f->code, "return SWIG_arg;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", Swig_cresult_name()); /* Dump the function out */ /* in Lua we will not emit the destructor as a wrapper function, Lua will automatically call the destructor when the object is free'd However: you cannot just skip this function as it will not emit any custom destructor (using %extend), as you need to call emit_action() Therefore we go though the whole function, but do not write the code into the wrapper */ if (!current[DESTRUCTOR]) { Wrapper_print(f, f_wrappers); } /* NEW LANGUAGE NOTE:*********************************************** register the function in SWIG different language mappings seem to use different ideas NEW LANGUAGE NOTE:END *********************************************** */ /* Now register the function with the interpreter. */ int result = SWIG_OK; if (Getattr(n, "sym:overloaded")) { if (!Getattr(n, "sym:nextSibling")) { result = dispatchFunction(n); } } Delete(argument_check); Delete(argument_parse); Delete(cleanup); Delete(outarg); // Delete(description); DelWrapper(f); return result; } /* ------------------------------------------------------------ * dispatchFunction() * * Emit overloading dispatch function * ------------------------------------------------------------ */ /* NEW LANGUAGE NOTE:*********************************************** This is an extra function used for overloading of functions it checks the args & then calls the relevant fn most of the real work in again typemaps: look for %typecheck(SWIG_TYPECHECK_*) in the .swg file NEW LANGUAGE NOTE:END *********************************************** */ int dispatchFunction(Node *n) { //REPORT("dispatchFunction", n); /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "return %s(L);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); String *wname = Swig_name_wrapper(symname); //Printf(stdout,"Swig_overload_dispatch %s %s '%s' %d\n",symname,wname,dispatch,maxargs); if (!luaAddSymbol(lua_name, n)) { DelWrapper(f); Delete(dispatch); Delete(tmp); return SWIG_ERROR; } Printv(f->def, "static int ", wname, "(lua_State* L) {", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "int argv[%d]={1", maxargs + 1); for (int i = 1; i <= maxargs; i++) { Printf(tmp, ",%d", i + 1); } Printf(tmp, "}"); Wrapper_add_local(f, "argv", tmp); Printf(f->code, "argc = lua_gettop(L);\n"); Replaceall(dispatch, "$args", "self,args"); Printv(f->code, dispatch, "\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(f->code, "SWIG_Lua_pusherrstring(L,\"Wrong arguments for overloaded function '%s'\\n\"\n" "\" Possible C/C++ prototypes are:\\n\"%s);\n", symname, protoTypes); Delete(protoTypes); Printf(f->code, "lua_error(L);return 0;\n"); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); // Remember C name of the wrapping function Setattr(n, "wrap:name", wname); if (current[CONSTRUCTOR]) { if (constructor_name != 0) Delete(constructor_name); constructor_name = Copy(wname); } DelWrapper(f); Delete(dispatch); Delete(tmp); return SWIG_OK; } /* ------------------------------------------------------------ * Add variable to "attributes" C arrays of given namespace or class. * Input is node. Based on the state of "current" array it determines * the name of the getter function, setter function etc and calls * registerVariable overload with necessary params. * Lua scope could be overwritten. (Used only for backward compatibility) * ------------------------------------------------------------ */ void registerVariable(Node *n, bool overwrite = false, String *overwriteLuaScope = 0) { int assignable = is_assignable(n); String *symname = Getattr(n, "sym:name"); assert(symname); // Lua scope. It is not symbol NSpace, it is the actual key to retrieve getCArraysHash. String *luaScope = luaCurrentSymbolNSpace(); if (overwrite) luaScope = overwriteLuaScope; // Getter and setter String *getName = 0; String *setName = 0; String *mrename = 0; if (current[NO_CPP] || !getCurrentClass()) { // Global variable getName = Swig_name_get(getNSpace(), symname); if (assignable) setName = Swig_name_set(getNSpace(), symname); } else { assert(!current[NO_CPP]); if (current[STATIC_VAR] ) { mrename = Swig_name_member(getNSpace(), getClassPrefix(), symname); getName = Swig_name_get(0, mrename); if (assignable) setName = Swig_name_set(0, mrename); } else if (current[MEMBER_VAR]) { mrename = Swig_name_member(0, getClassPrefix(), symname); getName = Swig_name_get(getNSpace(), mrename); if (assignable) setName = Swig_name_set(getNSpace(), mrename); } else { assert(false); } } getName = Swig_name_wrapper(getName); if (setName) setName = Swig_name_wrapper(setName); registerVariable(luaScope, n, getName, setName); } /* ------------------------------------------------------------ * registerVariable() * * Add variable to the "attributes" (or "get"/"set" in * case of elua_ltr) C arrays of given namespace or class * ------------------------------------------------------------ */ void registerVariable(String *lua_nspace_or_class_name, Node *n, String *getName, String *setName) { String *unassignable = NewString("SWIG_Lua_set_immutable"); if (setName == 0 || GetFlag(n, "feature:immutable")) { setName = unassignable; } Hash *nspaceHash = getCArraysHash(lua_nspace_or_class_name); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); String *s_ns_var_tab = Getattr(nspaceHash, "attributes"); String *lua_name = Getattr(n, "lua:name"); if (elua_ltr) { String *s_ns_dot_get = Getattr(nspaceHash, "get"); String *s_ns_dot_set = Getattr(nspaceHash, "set"); Printf(s_ns_dot_get, "%s{LSTRKEY(\"%s\"), LFUNCVAL(%s)},\n", tab4, lua_name, getName); Printf(s_ns_dot_set, "%s{LSTRKEY(\"%s\"), LFUNCVAL(%s)},\n", tab4, lua_name, setName); } else if (eluac_ltr) { Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "_get", "\")", ", LFUNCVAL(", getName, ")", "},\n", NIL); Printv(s_ns_methods_tab, tab4, "{LSTRKEY(\"", lua_name, "_set", "\")", ", LFUNCVAL(", setName, ")", "},\n", NIL); } else { Printf(s_ns_var_tab, "%s{ \"%s\", %s, %s },\n", tab4, lua_name, getName, setName); } } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { /* NEW LANGUAGE NOTE:*********************************************** Language::variableWrapper(n) will generate two wrapper fns Foo_get & Foo_set by calling functionWrapper() so we will just add these into the variable lists ideally we should not have registered these as functions, only WRT this variable will look into this later. NEW LANGUAGE NOTE:END *********************************************** */ // REPORT("variableWrapper", n); String *lua_name = Getattr(n, "lua:name"); assert(lua_name); current[VARIABLE] = true; // let SWIG generate the wrappers int result = Language::variableWrapper(n); // It is impossible to use registerVariable, because sym:name of the Node is currently // in an undefined state - the callees of this function may have modified it. // registerVariable should be used from respective callees.* current[VARIABLE] = false; return result; } /* ------------------------------------------------------------ * Add constant to appropriate C array. constantRecord is an array record. * Actually, in current implementation it is resolved consttab typemap * ------------------------------------------------------------ */ void registerConstant(String *nspace, String *constantRecord) { Hash *nspaceHash = getCArraysHash(nspace); String *s_const_tab = 0; if (eluac_ltr || elua_ltr) // In elua everything goes to "methods" tab s_const_tab = Getattr(nspaceHash, "methods"); else s_const_tab = Getattr(nspaceHash, "constants"); assert(s_const_tab); Printf(s_const_tab, " %s,\n", constantRecord); if ((eluac_ltr || elua_ltr) && old_metatable_bindings) { s_const_tab = Getattr(nspaceHash, "constants"); assert(s_const_tab); Printf(s_const_tab, " %s,\n", constantRecord); } } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { REPORT("constantWrapper", n); String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *lua_name = Getattr(n, "lua:name"); if (lua_name == 0) lua_name = iname; String *nsname = Copy(iname); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; String *lua_name_v2 = 0; String *tm_v2 = 0; String *iname_v2 = 0; Node *n_v2 = 0; if (!luaAddSymbol(lua_name, n)) return SWIG_ERROR; Swig_save("lua_constantMember", n, "sym:name", NIL); Setattr(n, "sym:name", lua_name); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); registerConstant(luaCurrentSymbolNSpace(), tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", lua_name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); } else { Delete(nsname); nsname = 0; Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); Swig_restore(n); return SWIG_NOWRAP; } bool make_v2_compatible = old_metatable_bindings && getCurrentClass() && old_compatible_names; if (make_v2_compatible) { // Don't do anything for enums in C mode - they are already // wrapped correctly if (CPlusPlus || !current[ENUM_CONST]) { lua_name_v2 = Swig_name_member(0, proxy_class_name, lua_name); iname_v2 = Swig_name_member(0, proxy_class_name, iname); n_v2 = Copy(n); if (!luaAddSymbol(iname_v2, n, getNSpace())) { Swig_restore(n); return SWIG_ERROR; } Setattr(n_v2, "sym:name", lua_name_v2); tm_v2 = Swig_typemap_lookup("consttab", n_v2, name, 0); if (tm_v2) { Replaceall(tm_v2, "$source", value); Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); registerConstant(getNSpace(), tm_v2); } else { tm_v2 = Swig_typemap_lookup("constcode", n_v2, name, 0); if (!tm_v2) { // This can't be. assert(false); Swig_restore(n); return SWIG_ERROR; } Replaceall(tm_v2, "$source", value); Replaceall(tm_v2, "$target", lua_name_v2); Replaceall(tm_v2, "$value", value); Replaceall(tm_v2, "$nsname", nsname); Printf(f_init, "%s\n", tm_v2); } Delete(n_v2); } } Swig_restore(n); Delete(nsname); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { // REPORT("nativeWrapper", n); String *symname = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!luaAddSymbol(wrapname, n)) return SWIG_ERROR; Hash *nspaceHash = getCArraysHash(getNSpace()); String *s_ns_methods_tab = Getattr(nspaceHash, "methods"); Printv(s_ns_methods_tab, tab4, "{ \"", symname, "\",", wrapname, "},\n", NIL); // return Language::nativeWrapper(n); // this does nothing... return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; current[STATIC_CONST] = true; current[ENUM_CONST] = true; // There is some slightly specific behaviour with enums. Basically, // their NSpace may be tracked separately. The code below tries to work around // this issue to some degree. // The idea is the same as in classHandler - to drop old names generation if // enum is in class in namespace. const int old_compatible_names_saved = old_compatible_names; if (getNSpace() || ( Getattr(n, "sym:nspace") != 0 && Len(Getattr(n, "sym:nspace")) > 0 ) ) { old_compatible_names = 0; } int result = Language::enumDeclaration(n); current[STATIC_CONST] = false; current[ENUM_CONST] = false; old_compatible_names = old_compatible_names_saved; return result; } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", "*sym:name", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); String *tmpValue; Node *parent = parentNode(n); if (value) tmpValue = NewString(value); else tmpValue = NewString(name); Setattr(n, "value", tmpValue); Setattr(n, "name", tmpValue); /* for wrapping of enums in a namespace when emit_action is used */ if (GetFlag(parent, "scopedenum")) { symname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); Setattr(n, "sym:name", symname); Delete(symname); } int result = constantWrapper(n); Delete(tmpValue); Swig_restore(n); return result; } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { return Language::classDeclaration(n); } /* ------------------------------------------------------------ * Helper function that adds record to appropriate C arrays * ------------------------------------------------------------ */ void registerClass(String *scope, String *wrap_class) { assert(wrap_class); Hash *nspaceHash = getCArraysHash(scope); String *ns_classes = Getattr(nspaceHash, "classes"); Printv(ns_classes, "&", wrap_class, ",\n", NIL); if (elua_ltr || eluac_ltr) { String *ns_methods = Getattr(nspaceHash, "methods"); Hash *class_hash = getCArraysHash(class_static_nspace); assert(class_hash); String *cls_methods = Getattr(class_hash, "methods:name"); assert(cls_methods); Printv(ns_methods, tab4, "{LSTRKEY(\"", proxy_class_name, "\")", ", LROVAL(", cls_methods, ")", "},\n", NIL); } } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { //REPORT("classHandler", n); String *mangled_full_proxy_class_name = 0; String *destructor_name = 0; String *nspace = getNSpace(); constructor_name = 0; have_constructor = 0; have_destructor = 0; destructor_action = 0; assert(class_static_nspace == 0); assert(full_proxy_class_name == 0); assert(proxy_class_name == 0); current[NO_CPP] = false; proxy_class_name = Getattr(n, "sym:name"); // We have to enforce nspace here, because technically we are already // inside class parsing (getCurrentClass != 0), but we should register // class in its parent namespace if (!luaAddSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (nspace == 0) full_proxy_class_name = NewStringf("%s", proxy_class_name); else full_proxy_class_name = NewStringf("%s.%s", nspace, proxy_class_name); assert(full_proxy_class_name); mangled_full_proxy_class_name = Swig_name_mangle(full_proxy_class_name); SwigType *t = Copy(Getattr(n, "name")); SwigType *fr_t = SwigType_typedef_resolve_all(t); /* Create fully resolved type */ SwigType *t_tmp = 0; t_tmp = SwigType_typedef_qualified(fr_t); // Temporal variable Delete(fr_t); fr_t = SwigType_strip_qualifiers(t_tmp); String *mangled_fr_t = 0; mangled_fr_t = SwigType_manglestr(fr_t); // not sure exactly how this works, // but tcl has a static hashtable of all classes emitted and then only emits code for them once. // this fixes issues in test suites: template_default2 & template_specialization // * if i understand correctly, this is a bug. // * consider effect on template_specialization_defarg static Hash *emitted = NewHash(); if (GetFlag(emitted, mangled_fr_t)) { full_proxy_class_name = 0; proxy_class_name = 0; return SWIG_NOWRAP; } SetFlag(emitted, mangled_fr_t); // We treat class T as both 'class' and 'namespace'. All static members, attributes // and constants are considered part of namespace T, all members - part of the 'class' // Now, here is a trick. Static methods, attributes and non-static methods and attributes // are described with same structures - swig_lua_attribute/swig_lua_method. Instead of calling // getCArraysHash(class name) to initialize things for static methods/attributes and then // manually doing same initialization for non-static methods, we call getCArraysHash 2 times: // 1) With name "class name" + "." + "SwigStatic" to initialize static things // 2) With "class name" to initialize non-static things Hash *instance_cls = getCArraysHash(full_proxy_class_name, false); assert(instance_cls); String *s_attr_tab_name = Getattr(instance_cls, "attributes:name"); String *s_methods_tab_name = Getattr(instance_cls, "methods:name"); SetFlag(instance_cls, "lua:no_namespaces"); SetFlag(instance_cls, "lua:no_classes"); SetFlag(instance_cls, "lua:class_instance"); /* There is no use for "constants", "classes" and "namespaces" arrays. * All constants are considered part of static part of class. */ class_static_nspace = NewStringf("%s%sSwigStatic", full_proxy_class_name, NSPACE_SEPARATOR); Hash *static_cls = getCArraysHash(class_static_nspace, false); assert(static_cls); SetFlag(static_cls, "lua:no_namespaces"); SetFlag(static_cls, "lua:class_static"); // Notifying instance_cls and static_cls hashes about each other Setattr(instance_cls, "lua:class_instance:static_hash", static_cls); Setattr(static_cls, "lua:class_static:instance_hash", instance_cls); const int old_compatible_names_saved = old_compatible_names; // If class has %nspace enabled, then generation of backward compatible names // should be disabled if (getNSpace()) { old_compatible_names = 0; } /* There is no use for "classes" and "namespaces" arrays. Subclasses are not supported * by SWIG and namespaces couldn't be nested inside classes (C++ Standard) */ // Generate normal wrappers Language::classHandler(n); old_compatible_names = old_compatible_names_saved; SwigType_add_pointer(t); // Catch all: eg. a class with only static functions and/or variables will not have 'remembered' String *wrap_class_name = Swig_name_wrapper(NewStringf("class_%s", mangled_full_proxy_class_name)); String *wrap_class = NewStringf("&%s", wrap_class_name); SwigType_remember_clientdata(t, wrap_class); String *rt = Copy(getClassType()); SwigType_add_pointer(rt); // Adding class to apropriate namespace registerClass(nspace, wrap_class_name); Hash *nspaceHash = getCArraysHash(nspace); // Register the class structure with the type checker // Printf(f_init,"SWIG_TypeClientData(SWIGTYPE%s, (void *) &_wrap_class_%s);\n", SwigType_manglestr(t), mangled_full_proxy_class_name); // emit a function to be called to delete the object if (have_destructor) { destructor_name = NewStringf("swig_delete_%s", mangled_full_proxy_class_name); Printv(f_wrappers, "static void ", destructor_name, "(void *obj) {\n", NIL); if (destructor_action) { Printv(f_wrappers, SwigType_str(rt, "arg1"), " = (", SwigType_str(rt, 0), ") obj;\n", NIL); Printv(f_wrappers, destructor_action, "\n", NIL); } else { if (CPlusPlus) { Printv(f_wrappers, " delete (", SwigType_str(rt, 0), ") obj;\n", NIL); } else { Printv(f_wrappers, " free((char *) obj);\n", NIL); } } Printf(f_wrappers, "}\n"); } // Wrap constructor wrapper into one more proxy function. It will be used as class namespace __call method, thus // allowing both // Module.ClassName.StaticMethod to access static method/variable/constant // Module.ClassName() to create new object if (have_constructor) { assert(constructor_name); String *constructor_proxy_name = NewStringf("_proxy_%s", constructor_name); Printv(f_wrappers, "static int ", constructor_proxy_name, "(lua_State *L) {\n", NIL); Printv(f_wrappers, tab4, "assert(lua_istable(L,1));\n", tab4, "lua_pushcfunction(L,", constructor_name, ");\n", tab4, "assert(!lua_isnil(L,-1));\n", tab4, "lua_replace(L,1); /* replace our table with real constructor */\n", tab4, "lua_call(L,lua_gettop(L)-1,1);\n", tab4, "return 1;\n}\n", NIL); Delete(constructor_name); constructor_name = constructor_proxy_name; if (elua_ltr) { String *static_cls_metatable_tab = Getattr(static_cls, "metatable"); assert(static_cls_metatable_tab); Printf(static_cls_metatable_tab, " {LSTRKEY(\"__call\"), LFUNCVAL(%s)},\n", constructor_name); } else if (eluac_ltr) { String *ns_methods_tab = Getattr(nspaceHash, "methods"); assert(ns_methods_tab); Printv(ns_methods_tab, tab4, "{LSTRKEY(\"", "new_", proxy_class_name, "\")", ", LFUNCVAL(", constructor_name, ")", "},\n", NIL); } } if (have_destructor) { if (eluac_ltr) { String *ns_methods_tab = Getattr(nspaceHash, "methods"); assert(ns_methods_tab); Printv(ns_methods_tab, tab4, "{LSTRKEY(\"", "free_", mangled_full_proxy_class_name, "\")", ", LFUNCVAL(", destructor_name, ")", "},\n", NIL); } } closeCArraysHash(full_proxy_class_name, f_wrappers); closeCArraysHash(class_static_nspace, f_wrappers); // Handle inheritance // note: with the idea of class hierarchies spread over multiple modules // cf test-suite: imports.i // it is not possible to just add the pointers to the base classes to the code // (as sometimes these classes are not present) // therefore we instead hold the name of the base class and a null pointer // at runtime: we can query the swig type manager & see if the class exists // if so, we can get the pointer to the base class & replace the null pointer // if the type does not exist, then we cannot... String *base_class = NewString(""); String *base_class_names = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } // stores a null pointer & the name Printf(base_class, "0,"); Printf(base_class_names, "\"%s *\",", SwigType_namestr(bname)); b = Next(b); index++; } } // First, print class static part printCArraysDefinition(class_static_nspace, proxy_class_name, f_wrappers); assert(mangled_full_proxy_class_name); assert(base_class); assert(base_class_names); assert(proxy_class_name); assert(full_proxy_class_name); // Then print class isntance part Printv(f_wrappers, "static swig_lua_class *swig_", mangled_full_proxy_class_name, "_bases[] = {", base_class, "0};\n", NIL); Delete(base_class); Printv(f_wrappers, "static const char *swig_", mangled_full_proxy_class_name, "_base_names[] = {", base_class_names, "0};\n", NIL); Delete(base_class_names); Printv(f_wrappers, "static swig_lua_class _wrap_class_", mangled_full_proxy_class_name, " = { \"", proxy_class_name, "\", \"", full_proxy_class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); if (have_constructor) { Printv(f_wrappers, constructor_name, NIL); Delete(constructor_name); constructor_name = 0; } else { Printf(f_wrappers, "0"); } if (have_destructor) { Printv(f_wrappers, ", ", destructor_name, NIL); } else { Printf(f_wrappers, ",0"); } Printf(f_wrappers, ", %s, %s, &%s", s_methods_tab_name, s_attr_tab_name, Getattr(static_cls, "cname")); if (!eluac_ltr) { Printf(f_wrappers, ", %s", Getattr(instance_cls,"metatable:name")); } else Printf(f_wrappers, ", 0"); Printf(f_wrappers, ", swig_%s_bases, swig_%s_base_names };\n\n", mangled_full_proxy_class_name, mangled_full_proxy_class_name); current[NO_CPP] = true; Delete(class_static_nspace); class_static_nspace = 0; Delete(mangled_full_proxy_class_name); mangled_full_proxy_class_name = 0; Delete(destructor_name); destructor_name = 0; Delete(full_proxy_class_name); full_proxy_class_name = 0; proxy_class_name = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = GetChar(n, "sym:name"); //Printf(stdout,"memberfunctionHandler %s %s\n",name,iname); // Special case unary minus: LUA passes two parameters for the // wrapper function while we want only one. Tell our // functionWrapper to ignore a parameter. if (Cmp(symname, "__unm") == 0) { //Printf(stdout, "unary minus: ignore one argument\n"); SetInt(n, "lua:ignore_args", 1); } current[MEMBER_FUNC] = true; Language::memberfunctionHandler(n); registerMethod(n); current[MEMBER_FUNC] = false; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { // REPORT("membervariableHandler",n); current[MEMBER_VAR] = true; Language::membervariableHandler(n); registerVariable(n); current[MEMBER_VAR] = false; return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * * Method for adding C++ member constructor * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { // REPORT("constructorHandler", n); current[CONSTRUCTOR] = true; Language::constructorHandler(n); current[CONSTRUCTOR] = false; //constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { REPORT("destructorHandler", n); current[DESTRUCTOR] = true; Language::destructorHandler(n); current[DESTRUCTOR] = false; have_destructor = 1; destructor_action = Getattr(n, "wrap:action"); return SWIG_OK; } /* ---------------------------------------------------------------------- * globalfunctionHandler() * * It can be called: * 1. Usual C/C++ global function. * 2. During class parsing for functions declared/defined as friend * 3. During class parsing from staticmemberfunctionHandler * ---------------------------------------------------------------------- */ virtual int globalfunctionHandler(Node *n) { bool oldVal = current[NO_CPP]; if (!current[STATIC_FUNC]) // If static function, don't switch to NO_CPP current[NO_CPP] = true; const int result = Language::globalfunctionHandler(n); if (!current[STATIC_FUNC]) // Register only if not called from static function handler registerMethod(n); current[NO_CPP] = oldVal; return result; } /* ---------------------------------------------------------------------- * globalvariableHandler() * * Sets "current" array correctly * ---------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { bool oldVal = current[NO_CPP]; current[GLOBAL_VAR] = true; current[NO_CPP] = true; const int result = Language::globalvariableHandler(n); registerVariable(n); current[GLOBAL_VAR] = false; current[NO_CPP] = oldVal; return result; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { REPORT("staticmemberfunctionHandler", n); current[STATIC_FUNC] = true; const int result = Language::staticmemberfunctionHandler(n); registerMethod(n); if (old_metatable_bindings && result == SWIG_OK && old_compatible_names) { Swig_require("lua_staticmemberfunctionHandler", n, "*lua:name", NIL); String *lua_name = Getattr(n, "lua:name"); // Although this function uses Swig_name_member, it actually generates the Lua name, // not the C++ name. This is because an earlier version used such a scheme for static function // name generation and we have to maintain backward compatibility. String *compat_name = Swig_name_member(0, proxy_class_name, lua_name); Setattr(n, "lua:name", compat_name); registerMethod(n, true, getNSpace()); Delete(compat_name); Swig_restore(n); } current[STATIC_FUNC] = false;; return result; } /* ------------------------------------------------------------ * memberconstantHandler() * * Create a C++ constant * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { REPORT("memberconstantHandler", n); int result = Language::memberconstantHandler(n); return result; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { REPORT("staticmembervariableHandler", n); current[STATIC_VAR] = true; //String *symname = Getattr(n, "sym:name"); int result = Language::staticmembervariableHandler(n); if (!GetFlag(n, "wrappedasconstant")) { registerVariable(n); } if (result == SWIG_OK) { // This will add static member variable to the class namespace with name ClassName_VarName if (old_metatable_bindings && old_compatible_names) { Swig_save("lua_staticmembervariableHandler", n, "lua:name", NIL); String *lua_name = Getattr(n, "lua:name"); // Although this function uses Swig_name_member, it actually generates the Lua name, // not the C++ name. This is because an earlier version used such a scheme for static function // name generation and we have to maintain backward compatibility. String *v2_name = Swig_name_member(NIL, proxy_class_name, lua_name); if (!GetFlag(n, "wrappedasconstant")) { Setattr(n, "lua:name", v2_name); // Registering static var in the class parent nspace registerVariable(n, true, getNSpace()); } // If static member variable was wrapped as a constant, then // constant wrapper has already performed all actions necessary for old_metatable_bindings Delete(v2_name); Swig_restore(n); } } current[STATIC_VAR] = false; return result; } /* --------------------------------------------------------------------- * external runtime generation * --------------------------------------------------------------------- */ /* This is to support the usage SWIG -external-runtime The code consists of two functions: String *runtimeCode() // returns a large string with all the runtimes in String *defaultExternalRuntimeFilename() // returns the default filename I am writing a generic solution, even though SWIG-Lua only has one file right now... */ String *runtimeCode() { String *s = NewString(""); const char *filenames[] = { "luarun.swg", 0 }; // must be 0 terminated emitLuaFlavor(s); String *sfile = 0; for (int i = 0; filenames[i] != 0; i++) { sfile = Swig_include_sys(filenames[i]); if (!sfile) { Printf(stderr, "*** Unable to open '%s'\n", filenames[i]); } else { Append(s, sfile); Delete(sfile); } } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigluarun.h"); } /* --------------------------------------------------------------------- * helpers * --------------------------------------------------------------------- */ void emitLuaFlavor(String *s) { if (elua_emulate) { Printf(s, "/*This is only emulation!*/\n"); Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUA\n"); Printf(s, "#define SWIG_LUA_ELUA_EMULATE\n"); } else if (elua_ltr) Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUA\n"); else if (eluac_ltr) Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_ELUAC\n"); else Printf(s, "#define SWIG_LUA_TARGET SWIG_LUA_FLAVOR_LUA\n"); } /* ----------------------------------------------------------------------------- * escapeCode() * * This is to convert the string of Lua code into a proper string, which can then be * emitted into the C/C++ code. * Basically is is a lot of search & replacing of odd sequences * ---------------------------------------------------------------------------- */ void escapeCode(String *str) { //Printf(f_runtime,"/* original luacode:[[[\n%s\n]]]\n*/\n",str); Chop(str); // trim Replace(str, "\\", "\\\\", DOH_REPLACE_ANY); // \ to \\ (this must be done first) Replace(str, "\"", "\\\"", DOH_REPLACE_ANY); // " to \" Replace(str, "\n", "\\n\"\n \"", DOH_REPLACE_ANY); // \n to \n"\n" (ie quoting every line) //Printf(f_runtime,"/* hacked luacode:[[[\n%s\n]]]\n*/\n",str); } /* ----------------------------------------------------------------------------- * rawGetCArraysHash(String *name) * * A small helper to hide impelementation of how CArrays hashes are stored * ---------------------------------------------------------------------------- */ Hash *rawGetCArraysHash(const_String_or_char_ptr name) { Hash *scope = symbolScopeLookup( name ? name : "" ); if(!scope) return 0; Hash *carrays_hash = Getattr(scope, "lua:cdata"); return carrays_hash; } /* ----------------------------------------------------------------------------- * getCArraysHash() * * Each namespace can be described with a hash that stores C arrays * where members of the namespace should be added. All these hashes are stored * inside the symbols table, in pseudo-symbol for every namespace. * nspace could be NULL (NSPACE_TODO), that means functions and variables and classes * that are not in any namespace (this is default for SWIG unless %nspace feature is used). * You can later set some attributes that will affect behaviour of functions that use this hash: * "lua:no_namespaces" will disable "namespaces" array. * "lua:no_classes" will disable "classes" array. * For every component ("attributes", "methods", etc) there are subcomponents: * XXX:name - name of the C array that stores data for component * XXX:decl - statement with forward declaration of this array; * Namespace could be automatically registered to its parent if 'reg' == true. This can only be * done during the first call (a.k.a when nspace is created). * ---------------------------------------------------------------------------- */ Hash *getCArraysHash(String *nspace, bool reg = true) { Hash *scope = symbolScopeLookup(nspace ? nspace : ""); if(!scope) { symbolAddScope( nspace ? nspace : "" ); scope = symbolScopeLookup(nspace ? nspace : ""); assert(scope); } Hash *carrays_hash = Getattr(scope, "lua:cdata"); if (carrays_hash != 0) return carrays_hash; carrays_hash = NewHash(); String *mangled_name = 0; if (nspace == 0 || Len(nspace) == 0) mangled_name = NewString("SwigModule"); else mangled_name = Swig_name_mangle(nspace); String *cname = NewStringf("swig_%s", mangled_name); Setattr(carrays_hash, "cname", cname); String *attr_tab = NewString(""); String *attr_tab_name = NewStringf("swig_%s_attributes", mangled_name); String *attr_tab_decl = NewString(""); Printv(attr_tab, "static swig_lua_attribute ", NIL); Printv(attr_tab, attr_tab_name, "[]", NIL); Printv(attr_tab_decl, attr_tab, ";\n", NIL); Printv(attr_tab, " = {\n", NIL); Setattr(carrays_hash, "attributes", attr_tab); Setattr(carrays_hash, "attributes:name", attr_tab_name); Setattr(carrays_hash, "attributes:decl", attr_tab_decl); String *methods_tab = NewString(""); String *methods_tab_name = NewStringf("swig_%s_methods", mangled_name); String *methods_tab_decl = NewString(""); if (elua_ltr || eluac_ltr) // In this case methods array also acts as namespace rotable Printf(methods_tab, "const LUA_REG_TYPE "); else Printf(methods_tab, "static swig_lua_method "); Printv(methods_tab, methods_tab_name, "[]", NIL); Printv(methods_tab_decl, methods_tab, ";\n", NIL); Printv(methods_tab, "= {\n", NIL); Setattr(carrays_hash, "methods", methods_tab); Setattr(carrays_hash, "methods:name", methods_tab_name); Setattr(carrays_hash, "methods:decl", methods_tab_decl); String *const_tab = NewString(""); String *const_tab_name = NewStringf("swig_%s_constants", mangled_name); String *const_tab_decl = NewString(""); if (elua_ltr || eluac_ltr) // In this case const array holds rotable with namespace constants Printf(const_tab, "const LUA_REG_TYPE "); else Printf(const_tab, "static swig_lua_const_info "); Printv(const_tab, const_tab_name, "[]", NIL); Printv(const_tab_decl, const_tab, ";", NIL); Printv(const_tab, "= {\n", NIL); Setattr(carrays_hash, "constants", const_tab); Setattr(carrays_hash, "constants:name", const_tab_name); Setattr(carrays_hash, "constants:decl", const_tab_decl); String *classes_tab = NewString(""); String *classes_tab_name = NewStringf("swig_%s_classes", mangled_name); String *classes_tab_decl = NewString(""); Printf(classes_tab, "static swig_lua_class* "); Printv(classes_tab, classes_tab_name, "[]", NIL); Printv(classes_tab_decl, classes_tab, ";", NIL); Printv(classes_tab, "= {\n", NIL); Setattr(carrays_hash, "classes", classes_tab); Setattr(carrays_hash, "classes:name", classes_tab_name); Setattr(carrays_hash, "classes:decl", classes_tab_decl); String *namespaces_tab = NewString(""); String *namespaces_tab_name = NewStringf("swig_%s_namespaces", mangled_name); String *namespaces_tab_decl = NewString(""); Printf(namespaces_tab, "static swig_lua_namespace* "); Printv(namespaces_tab, namespaces_tab_name, "[]", NIL); Printv(namespaces_tab_decl, namespaces_tab, ";", NIL); Printv(namespaces_tab, " = {\n", NIL); Setattr(carrays_hash, "namespaces", namespaces_tab); Setattr(carrays_hash, "namespaces:name", namespaces_tab_name); Setattr(carrays_hash, "namespaces:decl", namespaces_tab_decl); if (elua_ltr) { String *get_tab = NewString(""); String *get_tab_name = NewStringf("swig_%s_get", mangled_name); String *get_tab_decl = NewString(""); Printv(get_tab, "const LUA_REG_TYPE ", get_tab_name, "[]", NIL); Printv(get_tab_decl, get_tab, ";", NIL); Printv(get_tab, " = {\n", NIL); Setattr(carrays_hash, "get", get_tab); Setattr(carrays_hash, "get:name", get_tab_name); Setattr(carrays_hash, "get:decl", get_tab_decl); String *set_tab = NewString(""); String *set_tab_name = NewStringf("swig_%s_set", mangled_name); String *set_tab_decl = NewString(""); Printv(set_tab, "const LUA_REG_TYPE ", set_tab_name, "[]", NIL); Printv(set_tab_decl, set_tab, ";", NIL); Printv(set_tab, " = {\n", NIL); Setattr(carrays_hash, "set", set_tab); Setattr(carrays_hash, "set:name", set_tab_name); Setattr(carrays_hash, "set:decl", set_tab_decl); } if (!eluac_ltr) { String *metatable_tab = NewString(""); String *metatable_tab_name = NewStringf("swig_%s_meta", mangled_name); String *metatable_tab_decl = NewString(""); if (elua_ltr) // In this case const array holds rotable with namespace constants Printf(metatable_tab, "const LUA_REG_TYPE "); else Printf(metatable_tab, "static swig_lua_method "); Printv(metatable_tab, metatable_tab_name, "[]", NIL); Printv(metatable_tab_decl, metatable_tab, ";", NIL); Printv(metatable_tab, " = {\n", NIL); Setattr(carrays_hash, "metatable", metatable_tab); Setattr(carrays_hash, "metatable:name", metatable_tab_name); Setattr(carrays_hash, "metatable:decl", metatable_tab_decl); } Setattr(scope, "lua:cdata", carrays_hash); assert(rawGetCArraysHash(nspace)); if (reg && nspace != 0 && Len(nspace) != 0 && GetFlag(carrays_hash, "lua:no_reg") == 0) { // Split names into components List *components = Split(nspace, '.', -1); String *parent_path = NewString(""); int len = Len(components); String *name = Copy(Getitem(components, len - 1)); for (int i = 0; i < len - 1; i++) { if (i > 0) Printv(parent_path, NSPACE_SEPARATOR, NIL); String *item = Getitem(components, i); Printv(parent_path, item, NIL); } Hash *parent = getCArraysHash(parent_path, true); String *namespaces_tab = Getattr(parent, "namespaces"); Printv(namespaces_tab, "&", cname, ",\n", NIL); if (elua_ltr || eluac_ltr) { String *methods_tab = Getattr(parent, "methods"); Printv(methods_tab, tab4, "{LSTRKEY(\"", name, "\")", ", LROVAL(", methods_tab_name, ")", "},\n", NIL); } Setattr(carrays_hash, "name", name); Delete(components); Delete(parent_path); } else if (!reg) // This namespace shouldn't be registered. Lets remember it. SetFlag(carrays_hash, "lua:no_reg"); Delete(mangled_name); mangled_name = 0; return carrays_hash; } /* ----------------------------------------------------------------------------- * closeCArraysHash() * * Functions add end markers {0,0,...,0} to all arrays, prints them to * output and marks hash as closed (lua:closed). Consequent attempts to * close the same hash will result in an error. * closeCArraysHash DOES NOT print structure that describes namespace, it only * prints array. You can use printCArraysDefinition to print structure. * if "lua:no_namespaces" is set, then array for "namespaces" won't be printed * if "lua:no_classes" is set, then array for "classes" won't be printed * ----------------------------------------------------------------------------- */ void closeCArraysHash(String *nspace, File *output) { Hash *carrays_hash = rawGetCArraysHash(nspace); assert(carrays_hash); assert(GetFlag(carrays_hash, "lua:closed") == 0); SetFlag(carrays_hash, "lua:closed"); // Do arrays describe class instance part or class static part const int is_instance = GetFlag(carrays_hash, "lua:class_instance"); String *attr_tab = Getattr(carrays_hash, "attributes"); Printf(attr_tab, " {0,0,0}\n};\n"); Printv(output, attr_tab, NIL); String *const_tab = Getattr(carrays_hash, "constants"); String *const_tab_name = Getattr(carrays_hash, "constants:name"); if (elua_ltr || eluac_ltr) Printv(const_tab, tab4, "{LNILKEY, LNILVAL}\n", "};\n", NIL); else Printf(const_tab, " {0,0,0,0,0,0}\n};\n"); // For the sake of compiling with -Wall -Werror we print constants // only when necessary int need_constants = 0; if ( (elua_ltr || eluac_ltr) && (old_metatable_bindings) ) need_constants = 1; else if (!is_instance) // static part need constants tab need_constants = 1; if (need_constants) Printv(output, const_tab, NIL); if (elua_ltr) { // Put forward declaration of metatable array Printv(output, "extern ", Getattr(carrays_hash, "metatable:decl"), "\n", NIL); } String *methods_tab = Getattr(carrays_hash, "methods"); String *metatable_tab_name = Getattr(carrays_hash, "metatable:name"); if (elua_ltr || eluac_ltr) { if (old_metatable_bindings) Printv(methods_tab, tab4, "{LSTRKEY(\"const\"), LROVAL(", const_tab_name, ")},\n", NIL); if (elua_ltr) { Printv(methods_tab, tab4, "{LSTRKEY(\"__metatable\"), LROVAL(", metatable_tab_name, ")},\n", NIL); } Printv(methods_tab, tab4, "{LSTRKEY(\"__disown\"), LFUNCVAL(SWIG_Lua_class_disown)},\n", NIL); Printv(methods_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); } else Printf(methods_tab, " {0,0}\n};\n"); Printv(output, methods_tab, NIL); if (!GetFlag(carrays_hash, "lua:no_classes")) { String *classes_tab = Getattr(carrays_hash, "classes"); Printf(classes_tab, " 0\n};\n"); Printv(output, classes_tab, NIL); } if (!GetFlag(carrays_hash, "lua:no_namespaces")) { String *namespaces_tab = Getattr(carrays_hash, "namespaces"); Printf(namespaces_tab, " 0\n};\n"); Printv(output, namespaces_tab, NIL); } if (elua_ltr) { String *get_tab = Getattr(carrays_hash, "get"); String *set_tab = Getattr(carrays_hash, "set"); Printv(get_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); Printv(set_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); Printv(output, get_tab, NIL); Printv(output, set_tab, NIL); } // Heuristic whether we need to print metatable or not. // For the sake of compiling with -Wall -Werror we don't print // metatable for static part. int need_metatable = 0; if (eluac_ltr) need_metatable = 0; else if(!is_instance) need_metatable = 0; else need_metatable = 1; if (need_metatable) { String *metatable_tab = Getattr(carrays_hash, "metatable"); assert(metatable_tab); if (elua_ltr) { String *get_tab_name = Getattr(carrays_hash, "get:name"); String *set_tab_name = Getattr(carrays_hash, "set:name"); if (GetFlag(carrays_hash, "lua:class_instance")) { Printv(metatable_tab, tab4, "{LSTRKEY(\"__index\"), LFUNCVAL(SWIG_Lua_class_get)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\"__newindex\"), LFUNCVAL(SWIG_Lua_class_set)},\n", NIL); } else { Printv(metatable_tab, tab4, "{LSTRKEY(\"__index\"), LFUNCVAL(SWIG_Lua_namespace_get)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\"__newindex\"), LFUNCVAL(SWIG_Lua_namespace_set)},\n", NIL); } Printv(metatable_tab, tab4, "{LSTRKEY(\"__gc\"), LFUNCVAL(SWIG_Lua_class_destruct)},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".get\"), LROVAL(", get_tab_name, ")},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".set\"), LROVAL(", set_tab_name, ")},\n", NIL); Printv(metatable_tab, tab4, "{LSTRKEY(\".fn\"), LROVAL(", Getattr(carrays_hash, "methods:name"), ")},\n", NIL); if (GetFlag(carrays_hash, "lua:class_instance")) { String *static_cls = Getattr(carrays_hash, "lua:class_instance:static_hash"); assert(static_cls); // static_cls is swig_lua_namespace. This structure can't be use with eLua(LTR) // Instead structure describing its methods isused String *static_cls_cname = Getattr(static_cls, "methods:name"); assert(static_cls_cname); Printv(metatable_tab, tab4, "{LSTRKEY(\".static\"), LROVAL(", static_cls_cname, ")},\n", NIL); // Put forward declaration of this array Printv(output, "extern ", Getattr(static_cls, "methods:decl"), "\n", NIL); } else if (GetFlag(carrays_hash, "lua:class_static")) { Hash *instance_cls = Getattr(carrays_hash, "lua:class_static:instance_hash"); assert(instance_cls); String *instance_cls_metatable_name = Getattr(instance_cls, "metatable:name"); assert(instance_cls_metatable_name); Printv(metatable_tab, tab4, "{LSTRKEY(\".instance\"), LROVAL(", instance_cls_metatable_name, ")},\n", NIL); } Printv(metatable_tab, tab4, "{LNILKEY, LNILVAL}\n};\n", NIL); } else { Printf(metatable_tab, " {0,0}\n};\n"); } Printv(output, metatable_tab, NIL); } Printv(output, "\n", NIL); } /* ----------------------------------------------------------------------------- * closeNamespaces() * * Recursively close all non-closed namespaces. Prints data to dataOutput. * ----------------------------------------------------------------------------- */ void closeNamespaces(File *dataOutput) { // Special handling for empty module. if (symbolScopeLookup("") == 0 || rawGetCArraysHash("") == 0) { // Module is empty. Create hash for global scope in order to have swig_SwigModule // variable in resulting file getCArraysHash(0); } // Because we cant access directly 'symtabs', instead we access // top-level scope and look on all scope pseudo-symbols in it. Hash *top_scope = symbolScopeLookup(""); assert(top_scope); Iterator ki = First(top_scope); List *to_close = NewList(); while (ki.key) { assert(ki.item); if (Getattr(ki.item, "sym:scope")) { // We have a pseudo symbol. Lets get actual scope for this pseudo symbol Hash *carrays_hash = rawGetCArraysHash(ki.key); assert(carrays_hash); if (GetFlag(carrays_hash, "lua:closed") == 0) Append(to_close, ki.key); } ki = Next(ki); } SortList(to_close, &compareByLen); int len = Len(to_close); for (int i = 0; i < len; i++) { String *key = Getitem(to_close, i); closeCArraysHash(key, dataOutput); Hash *carrays_hash = rawGetCArraysHash(key); String *name = 0; // name - name of the namespace as it should be visible in Lua if (DohLen(key) == 0) // This is global module name = module; else name = Getattr(carrays_hash, "name"); assert(name); printCArraysDefinition(key, name, dataOutput); } Delete(to_close); } /* ----------------------------------------------------------------------------- * printCArraysDefinition() * * This function prints to output a definition of namespace in form * swig_lua_namespace $cname = { attr_array, methods_array, ... , namespaces_array }; * You can call this function as many times as is necessary. * 'name' is a user-visible name that this namespace will have in Lua. It shouldn't * be a fully qualified name, just its own name. * ----------------------------------------------------------------------------- */ void printCArraysDefinition(String *nspace, String *name, File *output) { Hash *carrays_hash = getCArraysHash(nspace, false); String *cname = Getattr(carrays_hash, "cname"); // cname - name of the C structure that describes namespace assert(cname); Printv(output, "static swig_lua_namespace ", cname, " = ", NIL); String *null_string = NewString("0"); String *attr_tab_name = Getattr(carrays_hash, "attributes:name"); String *methods_tab_name = Getattr(carrays_hash, "methods:name"); String *const_tab_name = Getattr(carrays_hash, "constants:name"); String *classes_tab_name = Getattr(carrays_hash, "classes:name"); String *namespaces_tab_name = Getattr(carrays_hash, "namespaces:name"); bool has_classes = GetFlag(carrays_hash, "lua:no_classes") == 0; bool has_namespaces = GetFlag(carrays_hash, "lua:no_namespaces") == 0; Printv(output, "{\n", tab4, "\"", name, "\",\n", tab4, methods_tab_name, ",\n", tab4, attr_tab_name, ",\n", tab4, const_tab_name, ",\n", tab4, (has_classes) ? classes_tab_name : null_string, ",\n", tab4, (has_namespaces) ? namespaces_tab_name : null_string, "\n};\n", NIL); Delete(null_string); } /* ----------------------------------------------------------------------------- * luaCurrentSymbolNSpace() * * This function determines actual namespace/scope where any symbol at the * current moment should be placed. It looks at the 'current' array * and depending on where are we - static class member/function, * instance class member/function or just global functions decides * where symbol should be put. * The namespace/scope doesn't depend from symbol, only from 'current' * ----------------------------------------------------------------------------- */ String *luaCurrentSymbolNSpace() { String *scope = 0; // If ouside class, than NSpace is used. // If inside class, but current[NO_CPP], then this is friend function. It belongs to NSpace if (!getCurrentClass() || current[NO_CPP]) { scope = getNSpace(); } else if (current[ENUM_CONST] && !CPlusPlus ) { // Enums in C mode go to NSpace scope = getNSpace(); } else { // If inside class, then either class static namespace or class fully qualified name is used assert(!current[NO_CPP]); if (current[STATIC_FUNC] || current[STATIC_VAR] || current[STATIC_CONST]) { scope = class_static_nspace; } else if (current[MEMBER_VAR] || current[CONSTRUCTOR] || current[DESTRUCTOR] || current[MEMBER_FUNC]) { scope = full_proxy_class_name; } else { // Friend functions are handled this way scope = class_static_nspace; } assert(scope); } return scope; } /* ----------------------------------------------------------------------------- * luaAddSymbol() * * Our implementation of addSymbol. Determines scope correctly, then * forwards to Language::addSymbol * ----------------------------------------------------------------------------- */ int luaAddSymbol(const String *s, const Node *n) { String *scope = luaCurrentSymbolNSpace(); return luaAddSymbol(s, n, scope); } /* ----------------------------------------------------------------------------- * luaAddSymbol() * * Overload. Enforces given scope. Actually, it simply forwards call to Language::addSymbol * ----------------------------------------------------------------------------- */ int luaAddSymbol(const String *s, const Node *n, const_String_or_char_ptr scope) { int result = Language::addSymbol(s, n, scope); if (!result) Printf(stderr, "addSymbol(%s to scope %s) failed\n", s, scope); return result; } }; /* NEW LANGUAGE NOTE:*********************************************** in order to add you language into swig, you need to make the following changes: - write this file (obviously) - add into the makefile (not 100% clear on how to do this) - edit swigmain.cxx to add your module near the top of swigmain.cxx, look for this code & add you own codes ======= begin change ========== extern "C" { Language *swig_tcl(void); Language *swig_python(void); //etc,etc,etc... Language *swig_lua(void); // this is my code } //etc,etc,etc... swig_module modules[] = { {"-guile", swig_guile, "Guile"}, {"-java", swig_java, "Java"}, //etc,etc,etc... {"-lua", swig_lua, "Lua"}, // this is my code {NULL, NULL, NULL} // this must come at the end of the list }; ======= end change ========== This is all that is needed NEW LANGUAGE NOTE:END ************************************************/ /* ----------------------------------------------------------------------------- * swig_lua() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_lua(void) { return new LUA(); } swig-3.0.12/Source/Modules/ruby.cxx0000664000175000017500000032737013042756442017026 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * ruby.cxx * * Ruby language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include #include #include /* for INT_MAX */ #define SWIG_PROTECTED_TARGET_METHODS 1 class RClass { private: String *temp; public: String *name; /* class name (renamed) */ String *cname; /* original C class/struct name */ String *mname; /* Mangled name */ /** * The C variable name used in the SWIG-generated wrapper code to refer to * this class; usually it is of the form "SwigClassXXX.klass", where SwigClassXXX * is a swig_class struct instance and klass is a member of that struct. */ String *vname; /** * The C variable name used in the SWIG-generated wrapper code to refer to * the module that implements this class's methods (when we're trying to * support C++ multiple inheritance). Usually it is of the form * "SwigClassClassName.mImpl", where SwigClassXXX is a swig_class struct instance * and mImpl is a member of that struct. */ String *mImpl; String *type; String *prefix; String *init; int constructor_defined; int destructor_defined; RClass() { temp = NewString(""); name = NewString(""); cname = NewString(""); mname = NewString(""); vname = NewString(""); mImpl = NewString(""); type = NewString(""); prefix = NewString(""); init = NewString(""); constructor_defined = 0; destructor_defined = 0; } ~RClass() { Delete(name); Delete(cname); Delete(vname); Delete(mImpl); Delete(mname); Delete(type); Delete(prefix); Delete(init); Delete(temp); } void set_name(const_String_or_char_ptr cn, const_String_or_char_ptr rn, const_String_or_char_ptr valn) { /* Original C/C++ class (or struct) name */ Clear(cname); Append(cname, cn); /* Mangled name */ Delete(mname); mname = Swig_name_mangle(cname); /* Renamed class name */ Clear(name); Append(name, valn); /* Variable name for the VALUE that refers to the Ruby Class object */ Clear(vname); Printf(vname, "SwigClass%s.klass", name); /* Variable name for the VALUE that refers to the Ruby Class object */ Clear(mImpl); Printf(mImpl, "SwigClass%s.mImpl", name); /* Prefix */ Clear(prefix); Printv(prefix, (rn ? rn : cn), "_", NIL); } char *strip(const_String_or_char_ptr s) { Clear(temp); Append(temp, s); if (Strncmp(s, prefix, Len(prefix)) == 0) { Replaceall(temp, prefix, ""); } return Char(temp); } }; /* flags for the make_autodoc function */ enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, AUTODOC_DTOR, AUTODOC_STATICFUNC, AUTODOC_FUNC, AUTODOC_METHOD, AUTODOC_GETTER, AUTODOC_SETTER, AUTODOC_NONE }; static const char *usage = "\ Ruby Options (available with -ruby)\n\ -autorename - Enable renaming of classes and methods to follow Ruby coding standards\n\ -cppcast - Enable C++ casting operators (default)\n\ -globalmodule - Wrap everything into the global module\n\ -initname - Set entry function to Init_ (used by `require')\n\ -minherit - Attempt to support multiple inheritance\n\ -noautorename - Disable renaming of classes and methods (default)\n\ -nocppcast - Disable C++ casting operators, useful for generating bugs\n\ -prefix - Set a prefix to be prepended to all names\n\ "; #define RCLASS(hash, name) (RClass*)(Getattr(hash, name) ? Data(Getattr(hash, name)) : 0) #define SET_RCLASS(hash, name, klass) Setattr(hash, name, NewVoid(klass, 0)) class RUBY:public Language { private: String *module; String *modvar; String *feature; String *prefix; int current; Hash *classes; /* key=cname val=RClass */ RClass *klass; /* Currently processing class */ Hash *special_methods; /* Python style special method name table */ File *f_directors; File *f_directors_h; File *f_directors_helpers; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_initbeforefunc; bool useGlobalModule; bool multipleInheritance; // Wrap modes enum WrapperMode { NO_CPP, MEMBER_FUNC, CONSTRUCTOR_ALLOCATE, CONSTRUCTOR_INITIALIZE, DESTRUCTOR, MEMBER_VAR, CLASS_CONST, STATIC_FUNC, STATIC_VAR }; /* ------------------------------------------------------------ * autodoc level declarations * ------------------------------------------------------------ */ enum autodoc_l { NO_AUTODOC = -2, // no autodoc STRING_AUTODOC = -1, // use provided string NAMES_AUTODOC = 0, // only parameter names TYPES_AUTODOC = 1, // parameter names and types EXTEND_AUTODOC = 2, // extended documentation and parameter names EXTEND_TYPES_AUTODOC = 3 // extended documentation and parameter types + names }; autodoc_t last_mode; String* last_autodoc; autodoc_l autodoc_level(String *autodoc) { autodoc_l dlevel = NO_AUTODOC; char *c = Char(autodoc); if (c) { if (isdigit(c[0])) { dlevel = (autodoc_l) atoi(c); } else { if (strcmp(c, "extended") == 0) { dlevel = EXTEND_AUTODOC; } else { dlevel = STRING_AUTODOC; } } } return dlevel; } /* ------------------------------------------------------------ * have_docstring() * Check if there is a docstring directive and it has text, * or there is an autodoc flag set * ------------------------------------------------------------ */ bool have_docstring(Node *n) { String *str = Getattr(n, "feature:docstring"); return (str && Len(str) > 0) || (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); } /* ------------------------------------------------------------ * docstring() * Get the docstring text, stripping off {} if necessary, * and enclose in triple double quotes. If autodoc is also * set then it will build a combined docstring. * ------------------------------------------------------------ */ String *docstring(Node *n, autodoc_t ad_type) { String *str = Getattr(n, "feature:docstring"); bool have_ds = (str && Len(str) > 0); bool have_auto = (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); String *autodoc = NULL; String *doc = NULL; if (have_ds) { char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } } if (have_auto) { autodoc = make_autodoc(n, ad_type); have_auto = (autodoc && Len(autodoc) > 0); } // If there is more than one line then make docstrings like this: // // This is line1 // And here is line2 followed by the rest of them // // otherwise, put it all on a single line // if (have_auto && have_ds) { // Both autodoc and docstring are present doc = NewString(""); Printv(doc, "\n", autodoc, "\n", str, NIL); } else if (!have_auto && have_ds) { // only docstring if (Strchr(str, '\n') == 0) { doc = NewString(str); } else { doc = NewString(""); Printv(doc, str, NIL); } } else if (have_auto && !have_ds) { // only autodoc if (Strchr(autodoc, '\n') == 0) { doc = NewStringf("%s", autodoc); } else { doc = NewString(""); Printv(doc, "\n", autodoc, NIL); } } else doc = NewString(""); // Save the generated strings in the parse tree in case they are used later // by post processing tools Setattr(n, "ruby:docstring", doc); Setattr(n, "ruby:autodoc", autodoc); return doc; } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_offset - argument number for first parameter * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(ParmList *plist, int arg_offset) { Parm *p = plist; int i = arg_offset; while (p) { if (!Getattr(p, "lname")) { String *pname = Swig_cparm_name(p, i); Delete(pname); } i++; p = nextSibling(p); } } /* ------------------------------------------------------------ * make_autodocParmList() * Generate the documentation for the function parameters * ------------------------------------------------------------ */ String *make_autodocParmList(Node *n, bool showTypes) { String *doc = NewString(""); String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; int lines = 0; int start_arg_num = is_wrapping_class() ? 1 : 0; const int maxwidth = 80; addMissingParameterNames(plist, start_arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); if (Strcmp(ParmList_protostr(plist), "void") == 0) { //No parameters actually return doc; } for (p = plist; p; p = pnext) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } // Note: the generated name should be consistent with that in kwnames[] name = name ? name : Getattr(p, "name"); name = name ? name : Getattr(p, "lname"); name = Swig_name_make(p, 0, name, 0, 0); // rename parameter if a keyword type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) break; // Skip the 'self' parameter which in ruby is implicit if ( Cmp(name, "self") == 0 ) continue; // Make __p parameters just p (as used in STL) Replace( name, "__", "", DOH_REPLACE_FIRST ); if (Len(doc)) { // add a comma to the previous one if any Append(doc, ", "); // Do we need to wrap a long line? if ((Len(doc) - lines * maxwidth) > maxwidth) { Printf(doc, "\n%s", tab4); lines += 1; } } // Do the param type too? Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); if (showTypes) Printf(doc, "%s ", type_str); Append(doc, name); if (pdoc) { if (!pdocs) pdocs = NewString("Parameters:\n"); Printf(pdocs, " %s.\n", pdoc); } if (value) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) { value = new_value; } else { Node *lookup = Swig_symbol_clookup(value, 0); if (lookup) value = Getattr(lookup, "sym:name"); } Printf(doc, "=%s", value); } Delete(type_str); Delete(name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); return doc; } /* ------------------------------------------------------------ * make_autodoc() * Build a docstring for the node, using parameter and other * info in the parse tree. If the value of the autodoc * attribute is "0" then do not include parameter types, if * it is "1" (the default) then do. If it has some other * value then assume it is supplied by the extension writer * and use it directly. * ------------------------------------------------------------ */ String *make_autodoc(Node *n, autodoc_t ad_type) { int extended = 0; // If the function is overloaded then this funciton is called // for the last one. Rewind to the first so the docstrings are // in order. while (Getattr(n, "sym:previousSibling")) n = Getattr(n, "sym:previousSibling"); Node *pn = Swig_methodclass(n); String* super_names = NewString(""); String* class_name = Getattr(pn, "sym:name") ; if ( !class_name ) { class_name = NewString(""); } else { class_name = Copy(class_name); List *baselist = Getattr(pn, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } int count = 0; for ( ;base.item; ++count) { if ( count ) Append(super_names, ", "); String *basename = Getattr(base.item, "sym:name"); String* basenamestr = NewString(basename); Node* parent = parentNode(base.item); while (parent) { String *parent_name = Copy( Getattr(parent, "sym:name") ); if ( !parent_name ) { Node* mod = Getattr(parent, "module"); if ( mod ) parent_name = Copy( Getattr(mod, "name") ); if ( parent_name ) (Char(parent_name))[0] = (char)toupper((Char(parent_name))[0]); } if ( parent_name ) { Insert(basenamestr, 0, "::"); Insert(basenamestr, 0, parent_name); Delete(parent_name); } parent = parentNode(parent); } Append(super_names, basenamestr ); Delete(basenamestr); base = Next(base); } } } String* full_name; if ( module ) { full_name = NewString(module); if (Len(class_name) > 0) Append(full_name, "::"); } else full_name = NewString(""); Append(full_name, class_name); String* symname = Getattr(n, "sym:name"); if ( Getattr( special_methods, symname ) ) symname = Getattr( special_methods, symname ); String* methodName = NewString(full_name); Append(methodName, symname); // Each overloaded function will try to get documented, // so we keep the name of the last overloaded function and its type. // Documenting just from functionWrapper() is not possible as // sym:name has already been changed to include the class name if ( last_mode == ad_type && Cmp(methodName, last_autodoc) == 0 ) { Delete(full_name); Delete(class_name); Delete(super_names); Delete(methodName); return NewString(""); } last_mode = ad_type; last_autodoc = Copy(methodName); String *doc = NewString("/*\n"); int counter = 0; bool skipAuto = false; Node* on = n; for ( ; n; ++counter ) { String *type_str = NULL; skipAuto = false; bool showTypes = false; String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: break; case NAMES_AUTODOC: showTypes = false; break; case TYPES_AUTODOC: showTypes = true; break; case EXTEND_AUTODOC: extended = 1; showTypes = false; break; case EXTEND_TYPES_AUTODOC: extended = 1; showTypes = true; break; case STRING_AUTODOC: skipAuto = true; break; } SwigType *type = Getattr(n, "type"); if (type) { if (Strcmp(type, "void") == 0) { type_str = NULL; } else { SwigType *qt = SwigType_typedef_resolve_all(type); if (SwigType_isenum(qt)) { type_str = NewString("int"); } else { Node *nn = classLookup(type); type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); } } } if (counter == 0) { switch (ad_type) { case AUTODOC_CLASS: Printf(doc, " Document-class: %s", full_name); if ( Len(super_names) > 0 ) Printf( doc, " < %s", super_names); Append(doc, "\n\n"); break; case AUTODOC_CTOR: Printf(doc, " Document-method: %s.new\n\n", full_name); break; case AUTODOC_DTOR: break; case AUTODOC_STATICFUNC: Printf(doc, " Document-method: %s.%s\n\n", full_name, symname); break; case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: Printf(doc, " Document-method: %s.%s\n\n", full_name, symname); break; case AUTODOC_SETTER: Printf(doc, " Document-method: %s.%s=\n\n", full_name, symname); break; case AUTODOC_NONE: break; } } if (skipAuto) { if ( counter == 0 ) Printf(doc, " call-seq:\n"); switch( ad_type ) { case AUTODOC_STATICFUNC: case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: { String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s(%s)", symname, paramList); else Printf(doc, " %s", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_SETTER: { Printf(doc, " %s=(x)", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } default: break; } } else { switch (ad_type) { case AUTODOC_CLASS: { // Only do the autodoc if there isn't a docstring for the class String *str = Getattr(n, "feature:docstring"); if (counter == 0 && (str == 0 || Len(str) == 0)) { if (CPlusPlus) { Printf(doc, " Proxy of C++ %s class", full_name); } else { Printf(doc, " Proxy of C %s struct", full_name); } } } break; case AUTODOC_CTOR: if (counter == 0) Printf(doc, " call-seq:\n"); if (Strcmp(class_name, symname) == 0) { String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s.new(%s)", class_name, paramList); else Printf(doc, " %s.new", class_name); } else { Printf(doc, " %s.new(%s)", class_name, make_autodocParmList(n, showTypes)); } break; case AUTODOC_DTOR: break; case AUTODOC_STATICFUNC: case AUTODOC_FUNC: case AUTODOC_METHOD: case AUTODOC_GETTER: { if (counter == 0) Printf(doc, " call-seq:\n"); String *paramList = make_autodocParmList(n, showTypes); if (Len(paramList)) Printf(doc, " %s(%s)", symname, paramList); else Printf(doc, " %s", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_SETTER: { Printf(doc, " call-seq:\n"); Printf(doc, " %s=(x)", symname); if (type_str) Printf(doc, " -> %s", type_str); break; } case AUTODOC_NONE: break; } } // if it's overloaded then get the next decl and loop around again n = Getattr(n, "sym:nextSibling"); if (n) Append(doc, "\n"); Delete(type_str); } Printf(doc, "\n\n"); if (!skipAuto) { switch (ad_type) { case AUTODOC_CLASS: case AUTODOC_DTOR: break; case AUTODOC_CTOR: Printf(doc, "Class constructor.\n"); break; case AUTODOC_STATICFUNC: Printf(doc, "A class method.\n"); break; case AUTODOC_FUNC: Printf(doc, "A module function.\n"); break; case AUTODOC_METHOD: Printf(doc, "An instance method.\n"); break; case AUTODOC_GETTER: Printf(doc, "Get value of attribute.\n"); break; case AUTODOC_SETTER: Printf(doc, "Set new value for attribute.\n"); break; case AUTODOC_NONE: break; } } n = on; while ( n ) { String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: case NAMES_AUTODOC: case TYPES_AUTODOC: extended = 0; break; case STRING_AUTODOC: extended = 2; Replaceall( autodoc, "$class", class_name ); Printv(doc, autodoc, ".", NIL); break; case EXTEND_AUTODOC: case EXTEND_TYPES_AUTODOC: extended = 1; break; } if (extended) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { Printv(doc, "\n\n", pdocs, NULL); break; } if ( extended == 2 ) break; } n = Getattr(n, "sym:nextSibling"); } Append(doc, "\n*/\n"); Delete(full_name); Delete(class_name); Delete(super_names); Delete(methodName); return doc; } /* ------------------------------------------------------------ * convertValue() * Check if string v can be a Ruby value literal, * (eg. number or string), or translate it to a Ruby literal. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *t) { if (v && Len(v) > 0) { char fc = (Char(v))[0]; if (('0' <= fc && fc <= '9') || '\'' == fc || '"' == fc) { /* number or string (or maybe NULL pointer) */ if (SwigType_ispointer(t) && Strcmp(v, "0") == 0) return NewString("None"); else return v; } if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) return SwigType_ispointer(t) ? NewString("nil") : NewString("0"); if (Strcmp(v, "true") == 0 || Strcmp(v, "TRUE") == 0) return NewString("True"); if (Strcmp(v, "false") == 0 || Strcmp(v, "FALSE") == 0) return NewString("False"); } return 0; } public: /* --------------------------------------------------------------------- * RUBY() * * Initialize member data * --------------------------------------------------------------------- */ RUBY() : module(0), modvar(0), feature(0), prefix(0), current(0), classes(0), klass(0), special_methods(0), f_directors(0), f_directors_h(0), f_directors_helpers(0), f_begin(0), f_runtime(0), f_runtime_h(0), f_header(0), f_wrappers(0), f_init(0), f_initbeforefunc(0), useGlobalModule(false), multipleInheritance(false), last_mode(AUTODOC_NONE), last_autodoc(NewString("")) { current = NO_CPP; director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " rb_raise(rb_eRuntimeError,\"accessing abstract class or protected constructor\"); \n", " return Qnil;\n", "}\n", NIL); director_multiple_inheritance = 0; director_language = 1; } /* --------------------------------------------------------------------- * main() * * Parse command line options and initializes variables. * --------------------------------------------------------------------- */ virtual void main(int argc, char *argv[]) { int cppcast = 1; int autorename = 0; /* Set location of SWIG library */ SWIG_library_directory("ruby"); /* Look for certain command line options */ for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-initname") == 0) { if (argv[i + 1]) { char *name = argv[i + 1]; feature = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-feature") == 0) { fprintf( stderr, "Warning: Ruby -feature option is deprecated, " "please use -initname instead.\n"); if (argv[i + 1]) { char *name = argv[i + 1]; feature = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-globalmodule") == 0) { useGlobalModule = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-minherit") == 0) { multipleInheritance = true; director_multiple_inheritance = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppcast") == 0) { cppcast = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { cppcast = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-autorename") == 0) { autorename = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noautorename") == 0) { autorename = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { char *name = argv[i + 1]; prefix = NewString(name); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } if (cppcast) { /* Turn on cppcast mode */ Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0); } if (autorename) { /* Turn on the autorename mode */ Preprocessor_define((DOH *) "SWIG_RUBY_AUTORENAME", 0); } /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGRUBY 1", 0); /* Add typemap definitions */ SWIG_typemap_lang("ruby"); SWIG_config_file("ruby.swg"); allow_overloading(); } /** * Generate initialization code to define the Ruby module(s), * accounting for nested modules as necessary. */ void defineRubyModule() { List *modules = Split(module, ':', INT_MAX); if (modules != 0 && Len(modules) > 0) { String *mv = 0; Iterator m; m = First(modules); while (m.item) { if (Len(m.item) > 0) { if (mv != 0) { Printv(f_init, tab4, modvar, " = rb_define_module_under(", modvar, ", \"", m.item, "\");\n", NIL); } else { Printv(f_init, tab4, modvar, " = rb_define_module(\"", m.item, "\");\n", NIL); mv = NewString(modvar); } } m = Next(m); } Delete(mv); Delete(modules); } } void registerMagicMethods() { special_methods = NewHash(); /* Python->Ruby style special method name. */ /* Basic */ Setattr(special_methods, "__repr__", "inspect"); Setattr(special_methods, "__str__", "to_s"); Setattr(special_methods, "__cmp__", "<=>"); Setattr(special_methods, "__hash__", "hash"); Setattr(special_methods, "__nonzero__", "nonzero?"); /* Callable */ Setattr(special_methods, "__call__", "call"); /* Collection */ Setattr(special_methods, "__len__", "length"); Setattr(special_methods, "__getitem__", "[]"); Setattr(special_methods, "__setitem__", "[]="); /* Operators */ Setattr(special_methods, "__add__", "+"); Setattr(special_methods, "__pos__", "+@"); Setattr(special_methods, "__sub__", "-"); Setattr(special_methods, "__neg__", "-@"); Setattr(special_methods, "__mul__", "*"); Setattr(special_methods, "__div__", "/"); Setattr(special_methods, "__mod__", "%"); Setattr(special_methods, "__lshift__", "<<"); Setattr(special_methods, "__rshift__", ">>"); Setattr(special_methods, "__and__", "&"); Setattr(special_methods, "__or__", "|"); Setattr(special_methods, "__xor__", "^"); Setattr(special_methods, "__invert__", "~"); Setattr(special_methods, "__lt__", "<"); Setattr(special_methods, "__le__", "<="); Setattr(special_methods, "__gt__", ">"); Setattr(special_methods, "__ge__", ">="); Setattr(special_methods, "__eq__", "=="); /* Other numeric */ Setattr(special_methods, "__divmod__", "divmod"); Setattr(special_methods, "__pow__", "**"); Setattr(special_methods, "__abs__", "abs"); Setattr(special_methods, "__int__", "to_i"); Setattr(special_methods, "__float__", "to_f"); Setattr(special_methods, "__coerce__", "coerce"); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { String *mod_docstring = NULL; /** * See if any Ruby module options have been specified as options * to the %module directive. */ Node *swigModule = Getattr(n, "module"); if (swigModule) { Node *options = Getattr(swigModule, "options"); if (options) { if (Getattr(options, "directors")) { allow_directors(); } if (Getattr(options, "dirprot")) { allow_dirprot(); } if (Getattr(options, "ruby_globalmodule")) { useGlobalModule = true; } if (Getattr(options, "ruby_minherit")) { multipleInheritance = true; director_multiple_inheritance = 1; } mod_docstring = Getattr(options, "docstring"); } } /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewStringf("strcmp(rb_obj_classname(self), classname) != 0")); // setSubclassInstanceCheck(NewString("CLASS_OF(self) != cFoo.klass")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); f_directors_helpers = NewString(""); f_initbeforefunc = NewString(""); if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_register_filebyname("director_helpers", f_directors_helpers); Swig_register_filebyname("initbeforefunc", f_initbeforefunc); modvar = 0; current = NO_CPP; klass = 0; classes = NewHash(); registerMagicMethods(); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGRUBY\n#define SWIGRUBY\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "\n"); /* typedef void *VALUE */ SwigType *value = NewSwigType(T_VOID); SwigType_add_pointer(value); SwigType_typedef(value, "VALUE"); Delete(value); /* Set module name */ set_module(Char(Getattr(n, "name"))); if (directorsEnabled()) { /* Build a version of the module name for use in a C macro name. */ String *module_macro = Copy(module); Replaceall(module_macro, "::", "__"); Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_macro); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_macro); Printf(f_directors_h, "namespace Swig {\n"); Printf(f_directors_h, " class Director;\n"); Printf(f_directors_h, "}\n\n"); Printf(f_directors_helpers, "/* ---------------------------------------------------\n"); Printf(f_directors_helpers, " * C++ director class helpers\n"); Printf(f_directors_helpers, " * --------------------------------------------------- */\n\n"); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } Delete(module_macro); } Printf(f_header, "#define SWIG_init Init_%s\n", feature); Printf(f_header, "#define SWIG_name \"%s\"\n\n", module); if (mod_docstring) { if (Len(mod_docstring)) { Printf(f_header, "/*\n Document-module: %s\n\n%s\n*/\n", module, mod_docstring); } Delete(mod_docstring); mod_docstring = NULL; } Printf(f_header, "static VALUE %s;\n", modvar); /* Start generating the initialization function */ String* docs = docstring(n, AUTODOC_CLASS); Printf(f_init, "/*\n%s\n*/", docs ); Printv(f_init, "\n", "#ifdef __cplusplus\n", "extern \"C\"\n", "#endif\n", "SWIGEXPORT void Init_", feature, "(void) {\n", "size_t i;\n", "\n", NIL); Printv(f_init, tab4, "SWIG_InitRuntime();\n", NIL); if (!useGlobalModule) defineRubyModule(); Printv(f_init, "\n", "SWIG_InitializeModule(0);\n", "for (i = 0; i < swig_module.size; i++) {\n", "SWIG_define_class(swig_module.types[i]);\n", "}\n", NIL); Printf(f_init, "\n"); /* Initialize code to keep track of objects */ Printf(f_init, "SWIG_RubyInitializeTrackings();\n"); Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } /* Finish off our init function */ Printf(f_init, "}\n"); SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_helpers, f_begin); Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); } Dump(f_wrappers, f_begin); Dump(f_initbeforefunc, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_initbeforefunc); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * importDirective() * ----------------------------------------------------------------------------- */ virtual int importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname) { if (prefix) { Insert(modname, 0, prefix); } List *modules = Split(modname, ':', INT_MAX); if (modules && Len(modules) > 0) { modname = NewString(""); String *last = NULL; Iterator m = First(modules); while (m.item) { if (Len(m.item) > 0) { if (last) { Append(modname, "/"); } Append(modname, m.item); last = m.item; } m = Next(m); } Printf(f_init, "rb_require(\"%s\");\n", modname); Delete(modname); } Delete(modules); } return Language::importDirective(n); } /* --------------------------------------------------------------------- * set_module(const char *mod_name) * * Sets the module name. Does nothing if it's already set (so it can * be overridden as a command line option). *---------------------------------------------------------------------- */ void set_module(const char *s) { String *mod_name = NewString(s); if (module == 0) { /* Start with the empty string */ module = NewString(""); if (prefix) { Insert(mod_name, 0, prefix); } /* Account for nested modules */ List *modules = Split(mod_name, ':', INT_MAX); if (modules != 0 && Len(modules) > 0) { String *last = 0; Iterator m = First(modules); while (m.item) { if (Len(m.item) > 0) { String *cap = NewString(m.item); (Char(cap))[0] = (char)toupper((Char(cap))[0]); if (last != 0) { Append(module, "::"); } Append(module, cap); last = m.item; } m = Next(m); } if (last) { if (feature == 0) { feature = Copy(last); } (Char(last))[0] = (char)toupper((Char(last))[0]); modvar = NewStringf("m%s", last); } } Delete(modules); } Delete(mod_name); } /* -------------------------------------------------------------------------- * nativeWrapper() * -------------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *funcname = Getattr(n, "wrap:name"); Swig_warning(WARN_LANG_NATIVE_UNIMPL, input_file, line_number, "Adding native function %s not supported (ignored).\n", funcname); return SWIG_NOWRAP; } /** * Process the comma-separated list of aliases (if any). */ void defineAliases(Node *n, const_String_or_char_ptr iname) { String *aliasv = Getattr(n, "feature:alias"); if (aliasv) { List *aliases = Split(aliasv, ',', INT_MAX); if (aliases && Len(aliases) > 0) { Iterator alias = First(aliases); while (alias.item) { if (Len(alias.item) > 0) { if (multipleInheritance) { Printv(klass->init, tab4, "rb_define_alias(", klass->mImpl, ", \"", alias.item, "\", \"", iname, "\");\n", NIL); } else { Printv(klass->init, tab4, "rb_define_alias(", klass->vname, ", \"", alias.item, "\", \"", iname, "\");\n", NIL); } } alias = Next(alias); } } Delete(aliases); } } /* --------------------------------------------------------------------- * create_command(Node *n, char *iname) * * Creates a new command from a C function. * iname = Name of function in scripting language * * A note about what "protected" and "private" mean in Ruby: * * A private method is accessible only within the class or its subclasses, * and it is callable only in "function form", with 'self' (implicit or * explicit) as a receiver. * * A protected method is callable only from within its class, but unlike * a private method, it can be called with a receiver other than self, such * as another instance of the same class. * --------------------------------------------------------------------- */ void create_command(Node *n, const_String_or_char_ptr iname) { String *alloc_func = Swig_name_wrapper(iname); String *wname = Swig_name_wrapper(iname); if (CPlusPlus) { Insert(wname, 0, "VALUEFUNC("); Append(wname, ")"); } if (current != NO_CPP) iname = klass->strip(iname); if (Getattr(special_methods, iname)) { iname = GetChar(special_methods, iname); } String *s = NewString(""); String *temp = NewString(""); #ifdef SWIG_PROTECTED_TARGET_METHODS const char *rb_define_method = is_public(n) ? "rb_define_method" : "rb_define_protected_method"; #else const char *rb_define_method = "rb_define_method"; #endif switch (current) { case MEMBER_FUNC: { if (multipleInheritance) { Printv(klass->init, tab4, rb_define_method, "(", klass->mImpl, ", \"", iname, "\", ", wname, ", -1);\n", NIL); } else { Printv(klass->init, tab4, rb_define_method, "(", klass->vname, ", \"", iname, "\", ", wname, ", -1);\n", NIL); } } break; case CONSTRUCTOR_ALLOCATE: Printv(s, tab4, "rb_define_alloc_func(", klass->vname, ", ", alloc_func, ");\n", NIL); Replaceall(klass->init, "$allocator", s); break; case CONSTRUCTOR_INITIALIZE: Printv(s, tab4, rb_define_method, "(", klass->vname, ", \"initialize\", ", wname, ", -1);\n", NIL); Replaceall(klass->init, "$initializer", s); break; case MEMBER_VAR: Append(temp, iname); /* Check for _set or _get at the end of the name. */ if (Len(temp) > 4) { const char *p = Char(temp) + (Len(temp) - 4); if (strcmp(p, "_set") == 0) { Delslice(temp, Len(temp) - 4, DOH_END); Append(temp, "="); } else if (strcmp(p, "_get") == 0) { Delslice(temp, Len(temp) - 4, DOH_END); } } if (multipleInheritance) { Printv(klass->init, tab4, "rb_define_method(", klass->mImpl, ", \"", temp, "\", ", wname, ", -1);\n", NIL); } else { Printv(klass->init, tab4, "rb_define_method(", klass->vname, ", \"", temp, "\", ", wname, ", -1);\n", NIL); } break; case STATIC_FUNC: Printv(klass->init, tab4, "rb_define_singleton_method(", klass->vname, ", \"", iname, "\", ", wname, ", -1);\n", NIL); break; case NO_CPP: if (!useGlobalModule) { Printv(s, tab4, "rb_define_module_function(", modvar, ", \"", iname, "\", ", wname, ", -1);\n", NIL); Printv(f_init, s, NIL); } else { Printv(s, tab4, "rb_define_global_function(\"", iname, "\", ", wname, ", -1);\n", NIL); Printv(f_init, s, NIL); } break; case DESTRUCTOR: case CLASS_CONST: case STATIC_VAR: default: assert(false); // Should not have gotten here for these types } defineAliases(n, iname); Delete(temp); Delete(s); Delete(wname); Delete(alloc_func); } /* --------------------------------------------------------------------- * applyInputTypemap() * * Look up the appropriate "in" typemap for this parameter (p), * substitute the correct strings for the $target and $input typemap * parameters, and dump the resulting code to the wrapper file. * --------------------------------------------------------------------- */ Parm *applyInputTypemap(Parm *p, String *ln, String *source, Wrapper *f, String *symname) { String *tm; SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$target", ln); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Replaceall(tm, "$symname", symname); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Setattr(p, "emit:input", Copy(source)); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } return p; } Parm *skipIgnoredArgs(Parm *p) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* --------------------------------------------------------------------- * marshalInputArgs() * * Process all of the arguments passed into the scripting language * method and convert them into C/C++ function arguments using the * supplied typemaps. * --------------------------------------------------------------------- */ void marshalInputArgs(Node *n, ParmList *l, int numarg, int numreq, String *kwargs, bool allow_kwargs, Wrapper *f) { int i; Parm *p; String *tm; String *source; String *target; source = NewString(""); target = NewString(""); bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); /** * The 'start' value indicates which of the C/C++ function arguments * produced here corresponds to the first value in Ruby's argv[] array. * The value of start is either zero or one. If start is zero, then * the first argument (with name arg1) is based on the value of argv[0]. * If start is one, then arg1 is based on the value of argv[1]. */ int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0; int varargs = emit_isvarargs(l); Printf(kwargs, "{ "); for (i = 0, p = l; i < numarg; i++) { p = skipIgnoredArgs(p); String *pn = Getattr(p, "name"); String *ln = Getattr(p, "lname"); /* Produce string representation of source argument */ Clear(source); /* First argument is a special case */ if (i == 0) { Printv(source, (start == 0) ? "argv[0]" : "self", NIL); } else { Printf(source, "argv[%d]", i - start); } /* Produce string representation of target argument */ Clear(target); Printf(target, "%s", Char(ln)); if (i >= (numreq)) { /* Check if parsing an optional argument */ Printf(f->code, " if (argc > %d) {\n", i - start); } /* Record argument name for keyword argument handling */ if (Len(pn)) { Printf(kwargs, "\"%s\",", pn); } else { Printf(kwargs, "\"arg%d\",", i + 1); } /* Look for an input typemap */ p = applyInputTypemap(p, ln, source, f, Getattr(n, "name")); if (i >= numreq) { Printf(f->code, "}\n"); } } /* Finish argument marshalling */ Printf(kwargs, " NULL }"); if (allow_kwargs) { // kwarg support not implemented // Printv(f->locals, tab4, "const char *kwnames[] = ", kwargs, ";\n", NIL); } /* Trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Clear(source); Printf(source, "argv[%d]", i - start); Replaceall(tm, "$input", source); Setattr(p, "emit:input", Copy(source)); Printf(f->code, "if (argc > %d) {\n", i - start); Printv(f->code, tm, "\n", NIL); Printf(f->code, "}\n"); } } Delete(source); Delete(target); } /* --------------------------------------------------------------------- * insertConstraintCheckingCode(ParmList *l, Wrapper *f) * * Checks each of the parameters in the parameter list for a "check" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertConstraintCheckingCode(ParmList *l, Wrapper *f) { Parm *p; String *tm; for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * insertCleanupCode(ParmList *l, String *cleanup) * * Checks each of the parameters in the parameter list for a "freearg" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertCleanupCode(ParmList *l, String *cleanup) { String *tm; for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * insertArgOutputCode(ParmList *l, String *outarg, int& need_result) * * Checks each of the parameters in the parameter list for a "argout" * typemap and (if it finds one) inserts the typemapping code into * the function wrapper. * --------------------------------------------------------------------- */ void insertArgOutputCode(ParmList *l, String *outarg, int &need_result) { String *tm; for (Parm *p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "vresult"); Replaceall(tm, "$result", "vresult"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); need_result += 1; p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } /* --------------------------------------------------------------------- * validIdentifier() * * Is this a valid identifier in the scripting language? * Ruby method names can include any combination of letters, numbers * and underscores. A Ruby method name may optionally end with * a question mark ("?"), exclamation point ("!") or equals sign ("="). * * Methods whose names end with question marks are, by convention, * predicate methods that return true or false (e.g. Array#empty?). * * Methods whose names end with exclamation points are, by convention, * called bang methods that modify the instance in place (e.g. Array#sort!). * * Methods whose names end with an equals sign are attribute setters * (e.g. Thread#critical=). * --------------------------------------------------------------------- */ virtual int validIdentifier(String *s) { char *c = Char(s); while (*c) { if (!(isalnum(*c) || (*c == '_') || (*c == '?') || (*c == '!') || (*c == '='))) return 0; c++; } return 1; } /* --------------------------------------------------------------------- * functionWrapper() * * Create a function declaration and register it with the interpreter. * --------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *nodeType; bool destructor; String *symname = Copy(Getattr(n, "sym:name")); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); int director_method = 0; String *tm; int need_result = 0; /* Ruby needs no destructor wrapper */ if (current == DESTRUCTOR) return SWIG_NOWRAP; nodeType = Getattr(n, "nodeType"); destructor = (!Cmp(nodeType, "destructor")); /* If the C++ class constructor is overloaded, we only want to * write out the "new" singleton method once since it is always * the same. (It's the "initialize" method that will handle the * overloading). */ if (current == CONSTRUCTOR_ALLOCATE && Swig_symbol_isoverloaded(n) && Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(symname, n)) return SWIG_ERROR; } String *cleanup = NewString(""); String *outarg = NewString(""); String *kwargs = NewString(""); Wrapper *f = NewWrapper(); /* Rename predicate methods */ if (GetFlag(n, "feature:predicate")) { Append(symname, "?"); } /* Rename bang methods */ if (GetFlag(n, "feature:bang")) { Append(symname, "!"); } /* Determine the name of the SWIG wrapper function */ String *wname = Swig_name_wrapper(symname); if (overname && current != CONSTRUCTOR_ALLOCATE) { Append(wname, overname); } /* Emit arguments */ if (current != CONSTRUCTOR_ALLOCATE) { emit_parameter_variables(l, f); } /* Attach standard typemaps */ if (current != CONSTRUCTOR_ALLOCATE) { emit_attach_parmmaps(l, f); } Setattr(n, "wrap:parms", l); /* Get number of arguments */ int numarg = emit_num_arguments(l); int numreq = emit_num_required(l); int varargs = emit_isvarargs(l); bool allow_kwargs = GetFlag(n, "feature:kwargs") ? true : false; bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); int start = (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ? 1 : 0; /* Now write the wrapper function itself */ if (current == CONSTRUCTOR_ALLOCATE) { Printv(f->def, "SWIGINTERN VALUE\n", NIL); Printf(f->def, "#ifdef HAVE_RB_DEFINE_ALLOC_FUNC\n"); Printv(f->def, wname, "(VALUE self)\n", NIL); Printf(f->def, "#else\n"); Printv(f->def, wname, "(int argc, VALUE *argv, VALUE self)\n", NIL); Printf(f->def, "#endif\n"); Printv(f->def, "{\n", NIL); } else if (current == CONSTRUCTOR_INITIALIZE) { Printv(f->def, "SWIGINTERN VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); if (!varargs) { Printf(f->code, "if ((argc < %d) || (argc > %d)) ", numreq - start, numarg - start); } else { Printf(f->code, "if (argc < %d) ", numreq - start); } Printf(f->code, "{rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc); SWIG_fail;}\n", numreq - start); } else { if ( current == NO_CPP ) { String* docs = docstring(n, AUTODOC_FUNC); Printf(f_wrappers, "%s", docs); Delete(docs); } Printv(f->def, "SWIGINTERN VALUE\n", wname, "(int argc, VALUE *argv, VALUE self) {", NIL); if (!varargs) { Printf(f->code, "if ((argc < %d) || (argc > %d)) ", numreq - start, numarg - start); } else { Printf(f->code, "if (argc < %d) ", numreq - start); } Printf(f->code, "{rb_raise(rb_eArgError, \"wrong # of arguments(%%d for %d)\",argc); SWIG_fail;}\n", numreq - start); } /* Now walk the function parameter list and generate code */ /* to get arguments */ if (current != CONSTRUCTOR_ALLOCATE) { marshalInputArgs(n, l, numarg, numreq, kwargs, allow_kwargs, f); } // FIXME? if (ctor_director) { numarg--; numreq--; } /* Insert constraint checking code */ insertConstraintCheckingCode(l, f); /* Insert cleanup code */ insertCleanupCode(l, cleanup); /* Insert argument output code */ insertArgOutputCode(l, outarg, need_result); /* if the object is a director, and the method call originated from its * underlying Ruby object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in Ruby. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(arg1);\n"); Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = (director && (director->swig_get_self() == self));\n"); } /* Now write code to make the function call */ if (current != CONSTRUCTOR_ALLOCATE) { if (current == CONSTRUCTOR_INITIALIZE) { Node *pn = Swig_methodclass(n); String *symname = Getattr(pn, "sym:name"); String *action = Getattr(n, "wrap:action"); if (directorsEnabled()) { String *classname = NewStringf("const char *classname SWIGUNUSED = \"%s::%s\"", module, symname); Wrapper_add_local(f, "classname", classname); } if (action) { SwigType *smart = Swig_cparse_smartptr(pn); String *result_name = NewStringf("%s%s", smart ? "smart" : "", Swig_cresult_name()); if (smart) { String *result_var = NewStringf("%s *%s = 0", SwigType_namestr(smart), result_name); Wrapper_add_local(f, result_name, result_var); Printf(action, "\n%s = new %s(%s);", result_name, SwigType_namestr(smart), Swig_cresult_name()); } Printf(action, "\nDATA_PTR(self) = %s;", result_name); if (GetFlag(pn, "feature:trackobjects")) { Printf(action, "\nSWIG_RubyAddTracking(%s, self);", result_name); } Delete(result_name); Delete(smart); } } /* Emit the function call */ if (director_method) { Printf(f->code, "try {\n"); } Setattr(n, "wrap:name", wname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Printf(actioncode, "} catch (Swig::DirectorException& e) {\n"); Printf(actioncode, " rb_exc_raise(e.getError());\n"); Printf(actioncode, " SWIG_fail;\n"); Printf(actioncode, "}\n"); } /* Return value if necessary */ if (SwigType_type(t) != T_VOID && current != CONSTRUCTOR_INITIALIZE) { need_result = 1; if (GetFlag(n, "feature:predicate")) { Printv(actioncode, tab4, "vresult = (", Swig_cresult_name(), " ? Qtrue : Qfalse);\n", NIL); } else { tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); actioncode = 0; if (tm) { Replaceall(tm, "$result", "vresult"); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "vresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); else Replaceall(tm, "$owner", "0"); #if 1 // FIXME: this will not try to unwrap directors returned as non-director // base class pointers! /* New addition to unwrap director return values so that the original * Ruby object is returned instead. */ bool unwrap = false; String *decl = Getattr(n, "decl"); int is_pointer = SwigType_ispointer_return(decl); int is_reference = SwigType_isreference_return(decl); if (is_pointer || is_reference) { String *type = Getattr(n, "type"); Node *parent = Swig_methodclass(n); Node *modname = Getattr(parent, "module"); Node *target = Swig_directormap(modname, type); if (target) unwrap = true; } if (unwrap) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(%s);\n", Swig_cresult_name()); Printf(f->code, "if (director) {\n"); Printf(f->code, " vresult = director->swig_get_self();\n"); Printf(f->code, "} else {\n"); Printf(f->code, "%s\n", tm); Printf(f->code, "}\n"); director_method = 0; } else { Printf(f->code, "%s\n", tm); } #else Printf(f->code, "%s\n", tm); #endif Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s.\n", SwigType_str(t, 0)); } } } if (actioncode) { Append(f->code, actioncode); Delete(actioncode); } emit_return_variable(n, t, f); } /* Extra code needed for new and initialize methods */ if (current == CONSTRUCTOR_ALLOCATE) { Node *pn = Swig_methodclass(n); SwigType *smart = Swig_cparse_smartptr(pn); if (smart) SwigType_add_pointer(smart); String *classtype = smart ? smart : t; need_result = 1; Printf(f->code, "VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE%s);\n", Char(SwigType_manglestr(classtype))); Printf(f->code, "#ifndef HAVE_RB_DEFINE_ALLOC_FUNC\n"); Printf(f->code, "rb_obj_call_init(vresult, argc, argv);\n"); Printf(f->code, "#endif\n"); Delete(smart); } else if (current == CONSTRUCTOR_INITIALIZE) { need_result = 1; } else { if ( need_result > 1 ) { if ( SwigType_type(t) == T_VOID ) Printf(f->code, "vresult = rb_ary_new();\n"); else { Printf(f->code, "if (vresult == Qnil) vresult = rb_ary_new();\n"); Printf(f->code, "else vresult = SWIG_Ruby_AppendOutput( " "rb_ary_new(), vresult);\n"); } } } /* Dump argument output code; */ Printv(f->code, outarg, NIL); /* Dump the argument cleanup code */ int need_cleanup = (current != CONSTRUCTOR_ALLOCATE) && (Len(cleanup) != 0); if (need_cleanup) { Printv(f->code, cleanup, NIL); } /* Look for any remaining cleanup. This processes the %new directive */ if (current != CONSTRUCTOR_ALLOCATE && GetFlag(n, "feature:new")) { tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); Delete(tm); } } /* Special processing on return value. */ tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, NIL); Delete(tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "vresult"); Printf(f->code, "%s\n", tm); } } /* Wrap things up (in a manner of speaking) */ if (need_result) { if (current == CONSTRUCTOR_ALLOCATE) { Printv(f->code, tab4, "return vresult;\n", NIL); } else if (current == CONSTRUCTOR_INITIALIZE) { Printv(f->code, tab4, "return self;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } else { Wrapper_add_local(f, "vresult", "VALUE vresult = Qnil"); Printv(f->code, tab4, "return vresult;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } } else { Printv(f->code, tab4, "return Qnil;\n", NIL); Printv(f->code, "fail:\n", NIL); if (need_cleanup) { Printv(f->code, cleanup, NIL); } Printv(f->code, tab4, "return Qnil;\n", NIL); } Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Emit the function */ Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter */ if (!Swig_symbol_isoverloaded(n)) { create_command(n, symname); } else { if (current == CONSTRUCTOR_ALLOCATE) { create_command(n, symname); } else { if (!Getattr(n, "sym:nextSibling")) dispatchFunction(n); } } Delete(kwargs); Delete(cleanup); Delete(outarg); DelWrapper(f); Delete(symname); return SWIG_OK; } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "return %s(nargs, args, self);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); Printv(f->def, "SWIGINTERN VALUE ", wname, "(int nargs, VALUE *args, VALUE self) {", NIL); Wrapper_add_local(f, "argc", "int argc"); bool ctor_director = (current == CONSTRUCTOR_INITIALIZE && Swig_directorclass(n)); if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) { Printf(tmp, "VALUE argv[%d]", maxargs + 1); } else { Printf(tmp, "VALUE argv[%d]", maxargs); } Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "int ii"); if (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) { maxargs += 1; Printf(f->code, "argc = nargs + 1;\n"); Printf(f->code, "argv[0] = self;\n"); Printf(f->code, "if (argc > %d) SWIG_fail;\n", maxargs); Printf(f->code, "for (ii = 1; (ii < argc); ++ii) {\n"); Printf(f->code, "argv[ii] = args[ii-1];\n"); Printf(f->code, "}\n"); } else { Printf(f->code, "argc = nargs;\n"); Printf(f->code, "if (argc > %d) SWIG_fail;\n", maxargs); Printf(f->code, "for (ii = 0; (ii < argc); ++ii) {\n"); Printf(f->code, "argv[ii] = args[ii];\n"); Printf(f->code, "}\n"); } Replaceall(dispatch, "$args", "nargs, args, self"); Printv(f->code, dispatch, "\n", NIL); // Generate prototype list, go to first node Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up // Constructors will be treated specially const bool isCtor = (!Cmp(Getattr(sibl, "nodeType"), "constructor")); const bool isMethod = ( Cmp(Getattr(sibl, "ismember"), "1") == 0 && (!isCtor) ); // Construct real method name String* methodName = NewString(""); if ( isMethod ) { // Sometimes a method node has no parent (SF#3034054). // This value is used in an exception message, so just skip the class // name in this case so at least we don't segfault. This is probably // just working around a problem elsewhere though. Node *parent_node = parentNode(sibl); if (parent_node) Printv( methodName, Getattr(parent_node,"sym:name"), ".", NIL ); } Append( methodName, Getattr(sibl,"sym:name" ) ); if ( isCtor ) Append( methodName, ".new" ); // Generate prototype list String *protoTypes = NewString(""); do { Append( protoTypes, "\n\" "); if (!isCtor) { SwigType *type = SwigType_str(Getattr(sibl, "type"), NULL); Printv(protoTypes, type, " ", NIL); Delete(type); } Printv(protoTypes, methodName, NIL ); Parm* p = Getattr(sibl, "wrap:parms"); if (p && (current == MEMBER_FUNC || current == MEMBER_VAR || ctor_director) ) p = nextSibling(p); // skip self Append( protoTypes, "(" ); while(p) { Append( protoTypes, SwigType_str(Getattr(p,"type"), Getattr(p,"name")) ); if ( ( p = nextSibling(p)) ) Append(protoTypes, ", "); } Append( protoTypes, ")\\n\"" ); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Append(f->code, "fail:\n"); Printf(f->code, "Ruby_Format_OverloadedError( argc, %d, \"%s\", %s);\n", maxargs, methodName, protoTypes); Append(f->code, "\nreturn Qnil;\n"); Delete(methodName); Delete(protoTypes); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); create_command(n, Char(symname)); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* --------------------------------------------------------------------- * variableWrapper() * --------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *tm; String *getfname, *setfname; Wrapper *getf, *setf; getf = NewWrapper(); setf = NewWrapper(); /* create getter */ int addfail = 0; String *getname = Swig_name_get(NSPACE_TODO, iname); getfname = Swig_name_wrapper(getname); Setattr(n, "wrap:name", getfname); Printv(getf->def, "SWIGINTERN VALUE\n", getfname, "(", NIL); Printf(getf->def, "VALUE self"); Printf(getf->def, ") {"); Wrapper_add_local(getf, "_val", "VALUE _val"); tm = Swig_typemap_lookup("varout", n, name, 0); if (tm) { Replaceall(tm, "$result", "_val"); Replaceall(tm, "$target", "_val"); Replaceall(tm, "$source", name); /* Printv(getf->code,tm, NIL); */ addfail = emit_action_code(n, getf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(getf->code, tab4, "return _val;\n", NIL); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return Qnil;\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); if (!is_assignable(n)) { setfname = NewString("NULL"); } else { /* create setter */ String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); String *setname = Swig_name_set(NSPACE_TODO, iname); setfname = Swig_name_wrapper(setname); Setattr(n, "wrap:name", setfname); Printv(setf->def, "SWIGINTERN VALUE\n", setfname, "(VALUE self, ", NIL); Printf(setf->def, "VALUE _val) {"); tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { Replaceall(tm, "$input", "_val"); Replaceall(tm, "$source", "_val"); Replaceall(tm, "$target", name); /* Printv(setf->code,tm,"\n",NIL); */ emit_action_code(n, setf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s\n", SwigType_str(t, 0)); } Printv(setf->code, tab4, "return _val;\n", NIL); Printf(setf->code, "fail:\n"); Printv(setf->code, tab4, "return Qnil;\n", NIL); Printf(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); Delete(setname); } /* define accessor method */ if (CPlusPlus) { Insert(getfname, 0, "VALUEFUNC("); Append(getfname, ")"); Insert(setfname, 0, "VALUEFUNC("); Append(setfname, ")"); } String *s = NewString(""); switch (current) { case STATIC_VAR: /* C++ class variable */ Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "\", ", getfname, ", 0);\n", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(s, tab4, "rb_define_singleton_method(", klass->vname, ", \"", klass->strip(iname), "=\", ", setfname, ", 1);\n", NIL); } Printv(klass->init, s, NIL); break; default: /* C global variable */ /* wrapped in Ruby module attribute */ assert(current == NO_CPP); if (!useGlobalModule) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "\", ", getfname, ", 0);\n", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(s, tab4, "rb_define_singleton_method(", modvar, ", \"", iname, "=\", ", setfname, ", 1);\n", NIL); } } else { Printv(s, tab4, "rb_define_global_method(\"", iname, "\", ", getfname, ", 0);\n", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(s, tab4, "rb_define_global_method(\"", iname, "=\", ", setfname, ", 1);\n", NIL); } } Printv(f_init, s, NIL); Delete(s); break; } Delete(getname); Delete(getfname); Delete(setfname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } /* --------------------------------------------------------------------- * validate_const_name(char *name) * * Validate constant name. * --------------------------------------------------------------------- */ char *validate_const_name(char *name, const char *reason) { if (!name || name[0] == '\0') return name; if (isupper(name[0])) return name; if (islower(name[0])) { name[0] = (char)toupper(name[0]); Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, "Wrong %s name (corrected to `%s')\n", reason, name); return name; } Swig_warning(WARN_RUBY_WRONG_NAME, input_file, line_number, "Wrong %s name %s\n", reason, name); return name; } /* --------------------------------------------------------------------- * constantWrapper() * --------------------------------------------------------------------- */ virtual int constantWrapper(Node *n) { Swig_require("constantWrapper", n, "*sym:name", "type", "value", NIL); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); if (current == CLASS_CONST) { iname = klass->strip(iname); } validate_const_name(iname, "constant"); SetChar(n, "sym:name", iname); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_header, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } String *tm = Swig_typemap_lookup("constant", n, value, 0); if (!tm) tm = Swig_typemap_lookup("constcode", n, value, 0); if (tm) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", iname); Replaceall(tm, "$symname", iname); Replaceall(tm, "$value", value); if (current == CLASS_CONST) { if (multipleInheritance) { Replaceall(tm, "$module", klass->mImpl); Printv(klass->init, tm, "\n", NIL); } else { Replaceall(tm, "$module", klass->vname); Printv(klass->init, tm, "\n", NIL); } } else { if (!useGlobalModule) { Replaceall(tm, "$module", modvar); } else { Replaceall(tm, "$module", "rb_cObject"); } Printf(f_init, "%s\n", tm); } } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value %s = %s\n", SwigType_str(type, 0), value); } Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------------- * classDeclaration() * * Records information about classes---even classes that might be defined in * other modules referenced by %import. * ----------------------------------------------------------------------------- */ virtual int classDeclaration(Node *n) { if (!Getattr(n, "feature:onlychildren")) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *namestr = SwigType_namestr(name); klass = RCLASS(classes, Char(namestr)); if (!klass) { klass = new RClass(); String *valid_name = NewString(symname ? symname : namestr); validate_const_name(Char(valid_name), "class"); klass->set_name(namestr, symname, valid_name); SET_RCLASS(classes, Char(namestr), klass); Delete(valid_name); } Delete(namestr); } return Language::classDeclaration(n); } /** * Process the comma-separated list of mixed-in module names (if any). */ void includeRubyModules(Node *n) { String *mixin = Getattr(n, "feature:mixin"); if (mixin) { List *modules = Split(mixin, ',', INT_MAX); if (modules && Len(modules) > 0) { Iterator mod = First(modules); while (mod.item) { if (Len(mod.item) > 0) { Printf(klass->init, "rb_include_module(%s, rb_eval_string(\"%s\"));\n", klass->vname, mod.item); } mod = Next(mod); } } Delete(modules); } } void handleBaseClasses(Node *n) { List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } while (base.item) { String *basename = Getattr(base.item, "name"); String *basenamestr = SwigType_namestr(basename); RClass *super = RCLASS(classes, Char(basenamestr)); Delete(basenamestr); if (super) { SwigType *btype = NewString(basename); SwigType_add_pointer(btype); SwigType_remember(btype); SwigType *smart = Swig_cparse_smartptr(base.item); if (smart) { SwigType_add_pointer(smart); SwigType_remember(smart); } String *bmangle = SwigType_manglestr(smart ? smart : btype); if (multipleInheritance) { Insert(bmangle, 0, "((swig_class *) SWIGTYPE"); Append(bmangle, "->clientdata)->mImpl"); Printv(klass->init, "rb_include_module(", klass->mImpl, ", ", bmangle, ");\n", NIL); } else { Insert(bmangle, 0, "((swig_class *) SWIGTYPE"); Append(bmangle, "->clientdata)->klass"); Replaceall(klass->init, "$super", bmangle); } Delete(bmangle); Delete(smart); Delete(btype); } base = Next(base); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } if (!multipleInheritance) { /* Warn about multiple inheritance for additional base class(es) */ while (base.item) { if (GetFlag(base.item, "feature:ignore")) { base = Next(base); continue; } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_RUBY_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Ruby.\n", proxyclassname, baseclassname); base = Next(base); } } } } } /** * Check to see if a %markfunc was specified. */ void handleMarkFuncDirective(Node *n) { String *markfunc = Getattr(n, "feature:markfunc"); if (markfunc) { Printf(klass->init, "SwigClass%s.mark = (void (*)(void *)) %s;\n", klass->name, markfunc); } else { Printf(klass->init, "SwigClass%s.mark = 0;\n", klass->name); } } /** * Check to see if a %freefunc was specified. */ void handleFreeFuncDirective(Node *n) { String *freefunc = Getattr(n, "feature:freefunc"); if (freefunc) { Printf(klass->init, "SwigClass%s.destroy = (void (*)(void *)) %s;\n", klass->name, freefunc); } else { if (klass->destructor_defined) { Printf(klass->init, "SwigClass%s.destroy = (void (*)(void *)) free_%s;\n", klass->name, klass->mname); } } } /** * Check to see if tracking is enabled for this class. */ void handleTrackDirective(Node *n) { int trackObjects = GetFlag(n, "feature:trackobjects"); if (trackObjects) { Printf(klass->init, "SwigClass%s.trackObjects = 1;\n", klass->name); } else { Printf(klass->init, "SwigClass%s.trackObjects = 0;\n", klass->name); } } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String* docs = docstring(n, AUTODOC_CLASS); Printf(f_wrappers, "%s", docs); Delete(docs); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *namestr = SwigType_namestr(name); // does template expansion klass = RCLASS(classes, Char(namestr)); assert(klass != 0); Delete(namestr); String *valid_name = NewString(symname); validate_const_name(Char(valid_name), "class"); Clear(klass->type); Printv(klass->type, Getattr(n, "classtype"), NIL); Printv(f_wrappers, "static swig_class SwigClass", valid_name, ";\n\n", NIL); Printv(klass->init, "\n", tab4, NIL); if (!useGlobalModule) { Printv(klass->init, klass->vname, " = rb_define_class_under(", modvar, ", \"", klass->name, "\", $super);\n", NIL); } else { Printv(klass->init, klass->vname, " = rb_define_class(\"", klass->name, "\", $super);\n", NIL); } if (multipleInheritance) { Printv(klass->init, klass->mImpl, " = rb_define_module_under(", klass->vname, ", \"Impl\");\n", NIL); } SwigType *tt = NewString(name); SwigType_add_pointer(tt); SwigType_remember(tt); SwigType *smart = Swig_cparse_smartptr(n); if (smart) { SwigType_add_pointer(smart); SwigType_remember(smart); } String *tm = SwigType_manglestr(smart ? smart : tt); Printf(klass->init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) &SwigClass%s);\n", tm, valid_name); Delete(tm); Delete(smart); Delete(tt); Delete(valid_name); includeRubyModules(n); Printv(klass->init, "$allocator", NIL); Printv(klass->init, "$initializer", NIL); Language::classHandler(n); handleBaseClasses(n); handleMarkFuncDirective(n); handleFreeFuncDirective(n); handleTrackDirective(n); if (multipleInheritance) { Printv(klass->init, "rb_include_module(", klass->vname, ", ", klass->mImpl, ");\n", NIL); } String *s = NewString(""); Printv(s, tab4, "rb_undef_alloc_func(", klass->vname, ");\n", NIL); Replaceall(klass->init, "$allocator", s); Replaceall(klass->init, "$initializer", ""); if (GetFlag(n, "feature:exceptionclass")) { Replaceall(klass->init, "$super", "rb_eRuntimeError"); } else { Replaceall(klass->init, "$super", "rb_cObject"); } Delete(s); Printv(f_init, klass->init, NIL); klass = 0; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * * Method for adding C++ member function * * By default, we're going to create a function of the form : * * Foo_bar(this,args) * * Where Foo is the classname, bar is the member name and the this pointer * is explicitly attached to the beginning. * * The renaming only applies to the member function part, not the full * classname. * * --------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { current = MEMBER_FUNC; String* docs = docstring(n, AUTODOC_METHOD); Printf(f_wrappers, "%s", docs); Delete(docs); Language::memberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * constructorHandler() * * Method for adding C++ member constructor * -------------------------------------------------------------------- */ void set_director_ctor_code(Node *n) { /* director ctor code is specific for each class */ Delete(director_prot_ctor_code); director_prot_ctor_code = NewString(""); Node *pn = Swig_methodclass(n); String *symname = Getattr(pn, "sym:name"); String *name = Copy(symname); char *cname = Char(name); if (cname) cname[0] = (char)toupper(cname[0]); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " rb_raise(rb_eNameError,\"accessing abstract class or protected constructor\"); \n", " return Qnil;\n", "}\n", NIL); Delete(director_ctor_code); director_ctor_code = NewString(""); Printv(director_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " $nondirector_new \n", "}\n", NIL); Delete(name); } virtual int constructorHandler(Node *n) { int use_director = Swig_directorclass(n); if (use_director) { set_director_ctor_code(n); } /* First wrap the allocate method */ current = CONSTRUCTOR_ALLOCATE; Swig_name_register("construct", "%n%c_allocate"); Language::constructorHandler(n); String* docs = docstring(n, AUTODOC_CTOR); Printf(f_wrappers, "%s", docs); Delete(docs); /* * If we're wrapping the constructor of a C++ director class, prepend a new parameter * to receive the scripting language object (e.g. 'self') * */ Swig_save("ruby:constructorHandler", n, "parms", NIL); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("VALUE"); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "Qnil"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Delete(self); } /* Now do the instance initialize method */ current = CONSTRUCTOR_INITIALIZE; Swig_name_register("construct", "new_%n%c"); Language::constructorHandler(n); /* Restore original parameter list */ Delattr(n, "wrap:self"); Swig_restore(n); /* Done */ Swig_name_unregister("construct"); current = NO_CPP; klass->constructor_defined = 1; return SWIG_OK; } virtual int copyconstructorHandler(Node *n) { int use_director = Swig_directorclass(n); if (use_director) { set_director_ctor_code(n); } /* First wrap the allocate method */ current = CONSTRUCTOR_ALLOCATE; Swig_name_register("construct", "%n%c_allocate"); return Language::copyconstructorHandler(n); } /* --------------------------------------------------------------------- * destructorHandler() * -------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { /* Do no spit free function if user defined his own for this class */ Node *pn = Swig_methodclass(n); String *freefunc = Getattr(pn, "feature:freefunc"); if (freefunc) return SWIG_OK; current = DESTRUCTOR; Language::destructorHandler(n); freefunc = NewString(""); String *freebody = NewString(""); String *pname0 = Swig_cparm_name(0, 0); Printv(freefunc, "free_", klass->mname, NIL); Printv(freebody, "SWIGINTERN void\n", freefunc, "(void *self) {\n", NIL); Printv(freebody, tab4, klass->type, " *", pname0, " = (", klass->type, " *)self;\n", NIL); Printv(freebody, tab4, NIL); /* Check to see if object tracking is activated for the class that owns this destructor. */ if (GetFlag(pn, "feature:trackobjects")) { Printf(freebody, "SWIG_RubyRemoveTracking(%s);\n", pname0); Printv(freebody, tab4, NIL); } if (Extend) { String *wrap = Getattr(n, "wrap:code"); if (wrap) { Printv(f_wrappers, wrap, NIL); } /* Printv(freebody, Swig_name_destroy(name), "(", pname0, ")", NIL); */ Printv(freebody, Getattr(n, "wrap:action"), "\n", NIL); } else { String *action = Getattr(n, "wrap:action"); if (action) { Printv(freebody, action, "\n", NIL); } else { /* In the case swig emits no destroy function. */ if (CPlusPlus) Printf(freebody, "delete %s;\n", pname0); else Printf(freebody, "free((char*) %s);\n", pname0); } } Printv(freebody, "}\n\n", NIL); Printv(f_wrappers, freebody, NIL); klass->destructor_defined = 1; current = NO_CPP; Delete(freefunc); Delete(freebody); Delete(pname0); return SWIG_OK; } /* --------------------------------------------------------------------- * membervariableHandler() * * This creates a pair of functions to set/get the variable of a member. * -------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); if (is_assignable(n)) { String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); } current = MEMBER_VAR; Language::membervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* ----------------------------------------------------------------------- * staticmemberfunctionHandler() * * Wrap a static C++ function * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { String* docs = docstring(n, AUTODOC_STATICFUNC); Printf(f_wrappers, "%s", docs); Delete(docs); current = STATIC_FUNC; Language::staticmemberfunctionHandler(n); current = NO_CPP; return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * * Create a C++ constant * --------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { String* docs = docstring(n, AUTODOC_STATICFUNC); Printf(f_wrappers, "%s", docs); Delete(docs); current = CLASS_CONST; Language::memberconstantHandler(n); current = NO_CPP; return SWIG_OK; } /* --------------------------------------------------------------------- * staticmembervariableHandler() * --------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { String* docs = docstring(n, AUTODOC_GETTER); Printf(f_wrappers, "%s", docs); Delete(docs); if (is_assignable(n)) { String* docs = docstring(n, AUTODOC_SETTER); Printf(f_wrappers, "%s", docs); Delete(docs); } current = STATIC_VAR; Language::staticmembervariableHandler(n); current = NO_CPP; return SWIG_OK; } /* C++ director class generation */ virtual int classDirector(Node *n) { return Language::classDirector(n); } virtual int classDirectorInit(Node *n) { String *declaration; declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } virtual int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ virtual int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("VALUE"); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { }", classname, target, call); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ virtual int classDirectorDefaultConstructor(Node *n) { String *classname; Wrapper *w; classname = Swig_class_name(n); w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(VALUE self) : Swig::Director(self) { }", classname, classname); Wrapper_print(w, f_directors); DelWrapper(w); Printf(f_directors_h, " SwigDirector_%s(VALUE self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } /* --------------------------------------------------------------- * exceptionSafeMethodCall() * * Emit a virtual director method to pass a method call on to the * underlying Ruby instance. * * --------------------------------------------------------------- */ void exceptionSafeMethodCall(String *className, Node *n, Wrapper *w, int argc, String *args, bool initstack) { Wrapper *body = NewWrapper(); Wrapper *rescue = NewWrapper(); String *methodName = Getattr(n, "sym:name"); String *bodyName = NewStringf("%s_%s_body", className, methodName); String *rescueName = NewStringf("%s_%s_rescue", className, methodName); String *depthCountName = NewStringf("%s_%s_call_depth", className, methodName); // Check for an exception typemap of some kind String *tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); } if ((tm != 0) && (Len(tm) > 0) && (Strcmp(tm, "1") != 0)) { // Declare a global to hold the depth count if (!Getattr(n, "sym:nextSibling")) { Printf(body->def, "static int %s = 0;\n", depthCountName); // Function body Printf(body->def, "VALUE %s(VALUE data) {\n", bodyName); Wrapper_add_localv(body, "args", "Swig::body_args *", "args", "= reinterpret_cast(data)", NIL); Wrapper_add_localv(body, Swig_cresult_name(), "VALUE", Swig_cresult_name(), "= Qnil", NIL); Printf(body->code, "%s++;\n", depthCountName); Printv(body->code, Swig_cresult_name(), " = rb_funcall2(args->recv, args->id, args->argc, args->argv);\n", NIL); Printf(body->code, "%s--;\n", depthCountName); Printv(body->code, "return ", Swig_cresult_name(), ";\n", NIL); Printv(body->code, "}", NIL); // Exception handler Printf(rescue->def, "VALUE %s(VALUE args, VALUE error) {\n", rescueName); Replaceall(tm, "$error", "error"); Printf(rescue->code, "%s--;\n", depthCountName); Printf(rescue->code, "if (%s == 0) ", depthCountName); Printv(rescue->code, Str(tm), "\n", NIL); Printv(rescue->code, "rb_exc_raise(error);\n", NIL); Printv(rescue->code, "return Qnil;\n", NIL); Printv(rescue->code, "}", NIL); } // Main code Wrapper_add_localv(w, "args", "Swig::body_args", "args", NIL); Wrapper_add_localv(w, "status", "int", "status", NIL); Printv(w->code, "args.recv = swig_get_self();\n", NIL); Printf(w->code, "args.id = rb_intern(\"%s\");\n", methodName); Printf(w->code, "args.argc = %d;\n", argc); if (argc > 0) { Printf(w->code, "args.argv = new VALUE[%d];\n", argc); for (int i = 0; i < argc; i++) { Printf(w->code, "args.argv[%d] = obj%d;\n", i, i); } } else { Printv(w->code, "args.argv = 0;\n", NIL); } Printf(w->code, "%s = rb_protect(PROTECTFUNC(%s), reinterpret_cast(&args), &status);\n", Swig_cresult_name(), bodyName); if ( initstack ) Printf(w->code, "SWIG_RELEASE_STACK;\n"); Printf(w->code, "if (status) {\n"); Printf(w->code, "VALUE lastErr = rb_gv_get(\"$!\");\n"); Printf(w->code, "%s(reinterpret_cast(&args), lastErr);\n", rescueName); Printf(w->code, "}\n"); if (argc > 0) { Printv(w->code, "delete [] args.argv;\n", NIL); } // Dump wrapper code Wrapper_print(body, f_directors_helpers); Wrapper_print(rescue, f_directors_helpers); } else { if (argc > 0) { Printf(w->code, "%s = rb_funcall(swig_get_self(), rb_intern(\"%s\"), %d%s);\n", Swig_cresult_name(), methodName, argc, args); } else { Printf(w->code, "%s = rb_funcall(swig_get_self(), rb_intern(\"%s\"), 0, NULL);\n", Swig_cresult_name(), methodName); } if ( initstack ) Printf(w->code, "SWIG_RELEASE_STACK;\n"); } // Clean up Delete(bodyName); Delete(rescueName); Delete(depthCountName); DelWrapper(body); DelWrapper(rescue); } virtual int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); Parm *p; String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; bool asvoid = checkAttribute( n, "feature:numoutputs", "0") ? true : false; bool initstack = checkAttribute( n, "feature:initstack", "1") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } String *overnametmp = NewString(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printf(overnametmp, "::%s", Getattr(n, "sym:overname")); } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); if (initstack && !(ignored_method && !pure_virtual)) { Append(w->def, "\nSWIG_INIT_STACK;\n"); } /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Ruby) */ String *arglist = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); char source[256]; int outputs = 0; if (!is_void && !asvoid) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while ( p ) { if (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; if ( checkAttribute( p, "tmap:in:numinputs", "0") ) { p = Getattr(p, "tmap:in:next"); continue; } String *parameterName = Getattr(p, "name"); String *parameterType = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Replaceall(tm, "$owner", "0"); Delete(input); Printv(wrap_args, tm, "\n", NIL); Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printv(arglist, source, NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(parameterType, "void")) { /** * Special handling for pointers to other C++ director classes. * Ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. In other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. We avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. Perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(parameterType) || SwigType_isreference(parameterType)) { Node *modname = Getattr(parent, "module"); Node *target = Swig_directormap(modname, parameterType); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(parameterType) + 2); /* name as pointer */ String *ppname = Copy(parameterName); if (SwigType_isreference(parameterType)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Ruby doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", parameterName); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(parameterType, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(parameterType, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(parameterType, parameterName), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(parameterType); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printf(wrap_args, "%s = dynamic_cast(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "VALUE", source, "= Qnil", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(parameterType, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* declare Ruby return value */ String *value_result = NewStringf("VALUE SWIGUNUSED %s", Swig_cresult_name()); Wrapper_add_local(w, Swig_cresult_name(), value_result); Delete(value_result); /* wrap complex arguments to VALUEs */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Ruby object */ exceptionSafeMethodCall(classname, n, w, idx, arglist, initstack); /* * Ruby method may return a simple object, or an Array of objects. * For in/out arguments, we have to extract the appropriate VALUEs from the Array, * then marshal everything back to C/C++ (return value and output arguments). */ /* Marshal return value and other outputs (if any) from VALUE to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "VALUE output"); Printf(w->code, "if (TYPE(%s) != T_ARRAY) {\n", Swig_cresult_name()); Printf(w->code, "Ruby_DirectorTypeMismatchException(\"Ruby method failed to return an array.\");\n"); Printf(w->code, "}\n"); } idx = 0; /* Marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1 && !asvoid ) { Printf(w->code, "output = rb_ary_entry(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = rb_ary_entry(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(arglist); Delete(cleanup); Delete(outarg); } /* any existing helper functions to handle this? */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Printf(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } virtual int classDirectorConstructors(Node *n) { return Language::classDirectorConstructors(n); } virtual int classDirectorMethods(Node *n) { return Language::classDirectorMethods(n); } virtual int classDirectorDisown(Node *n) { return Language::classDirectorDisown(n); } String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("rubyhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'rubyhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("rubyerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'rubyerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *strack = Swig_include_sys("rubytracking.swg"); if (!strack) { Printf(stderr, "*** Unable to open 'rubytracking.swg'\n"); } else { Append(s, strack); Delete(strack); } String *sapi = Swig_include_sys("rubyapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'rubyapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("rubyrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'rubyrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigrubyrun.h"); } /*---------------------------------------------------------------------- * kwargsSupport() *--------------------------------------------------------------------*/ bool kwargsSupport() const { // kwargs support isn't actually implemented, but changing to return false may break something now as it turns on compactdefaultargs return true; } }; /* class RUBY */ /* ----------------------------------------------------------------------------- * swig_ruby() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_ruby() { return new RUBY(); } extern "C" Language *swig_ruby(void) { return new_swig_ruby(); } /* * Local Variables: * c-basic-offset: 2 * End: */ swig-3.0.12/Source/Modules/r.cxx0000664000175000017500000023132513042756442016300 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * r.cxx * * R language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static const double DEFAULT_NUMBER = .0000123456712312312323; static String* replaceInitialDash(const String *name) { String *retval; if (!Strncmp(name, "_", 1)) { retval = Copy(name); Insert(retval, 0, "s"); } else { retval = Copy(name); } return retval; } static String * getRTypeName(SwigType *t, int *outCount = NULL) { String *b = SwigType_base(t); List *els = SwigType_split(t); int count = 0; int i; if(Strncmp(b, "struct ", 7) == 0) Replace(b, "struct ", "", DOH_REPLACE_FIRST); /* Printf(stdout, " %s,base = %s\n", t, b); for(i = 0; i < Len(els); i++) Printf(stdout, "%d) %s, ", i, Getitem(els,i)); Printf(stdout, "\n"); */ for(i = 0; i < Len(els); i++) { String *el = Getitem(els, i); if(Strcmp(el, "p.") == 0 || Strncmp(el, "a(", 2) == 0) { count++; Append(b, "Ref"); } } if(outCount) *outCount = count; String *tmp = NewString(""); char *retName = Char(SwigType_manglestr(t)); Insert(tmp, 0, retName); return tmp; /* if(count) return(b); Delete(b); return(NewString("")); */ } /********************* Tries to get the name of the R class corresponding to the given type e.g. struct A * is ARef, struct A** is ARefRef. Now handles arrays, i.e. struct A[2] ****************/ static String *getRClassName(String *retType, int /*addRef*/ = 1, int upRef=0) { String *tmp = NewString(""); SwigType *resolved = SwigType_typedef_resolve_all(retType); char *retName = Char(SwigType_manglestr(resolved)); if (upRef) { Printf(tmp, "_p%s", retName); } else{ Insert(tmp, 0, retName); } return tmp; /* #if 1 List *l = SwigType_split(retType); int n = Len(l); if(!l || n == 0) { #ifdef R_SWIG_VERBOSE if (debugMode) Printf(stdout, "SwigType_split return an empty list for %s\n", retType); #endif return(tmp); } String *el = Getitem(l, n-1); char *ptr = Char(el); if(strncmp(ptr, "struct ", 7) == 0) ptr += 7; Printf(tmp, "%s", ptr); if(addRef) { for(int i = 0; i < n; i++) { if(Strcmp(Getitem(l, i), "p.") == 0 || Strncmp(Getitem(l, i), "a(", 2) == 0) Printf(tmp, "Ref"); } } #else char *retName = Char(SwigType_manglestr(retType)); if(!retName) return(tmp); if(addRef) { while(retName && strlen(retName) > 1 && strncmp(retName, "_p", 2) == 0) { retName += 2; Printf(tmp, "Ref"); } } if(retName[0] == '_') retName ++; Insert(tmp, 0, retName); #endif return tmp; */ } /********************* Tries to get the name of the R class corresponding to the given type e.g. struct A * is ARef, struct A** is ARefRef. Now handles arrays, i.e. struct A[2] ****************/ static String * getRClassNameCopyStruct(String *retType, int addRef) { String *tmp = NewString(""); #if 1 List *l = SwigType_split(retType); int n = Len(l); if(!l || n == 0) { #ifdef R_SWIG_VERBOSE Printf(stdout, "SwigType_split return an empty list for %s\n", retType); #endif return(tmp); } String *el = Getitem(l, n-1); char *ptr = Char(el); if(strncmp(ptr, "struct ", 7) == 0) ptr += 7; Printf(tmp, "%s", ptr); if(addRef) { for(int i = 0; i < n; i++) { if(Strcmp(Getitem(l, i), "p.") == 0 || Strncmp(Getitem(l, i), "a(", 2) == 0) Printf(tmp, "Ref"); } } #else char *retName = Char(SwigType_manglestr(retType)); if(!retName) return(tmp); if(addRef) { while(retName && strlen(retName) > 1 && strncmp(retName, "_p", 2) == 0) { retName += 2; Printf(tmp, "Ref"); } } if(retName[0] == '_') retName ++; Insert(tmp, 0, retName); #endif return tmp; } /********************************* Write the elements of a list to the File*, one element per line. If quote is true, surround the element with "element". This takes care of inserting a tab in front of each line and also a comma after each element, except the last one. **********************************/ static void writeListByLine(List *l, File *out, bool quote = 0) { int i, n = Len(l); for(i = 0; i < n; i++) Printf(out, "%s%s%s%s%s\n", tab8, quote ? "\"" :"", Getitem(l, i), quote ? "\"" :"", i < n-1 ? "," : ""); } static const char *usage = "\ R Options (available with -r)\n\ -copystruct - Emit R code to copy C structs (on by default)\n\ -cppcast - Enable C++ casting operators (default) \n\ -debug - Output debug\n\ -dll - Name of the DLL (without the .dll or .so suffix).\n\ Default is the module name.\n\ -gc - Aggressive garbage collection\n\ -memoryprof - Add memory profile\n\ -namespace - Output NAMESPACE file\n\ -no-init-code - Turn off the generation of the R_init_ code\n\ (registration information still generated)\n\ -package - Package name for the PACKAGE argument of the R .Call()\n\ invocations. Default is the module name.\n\ "; /************ Display the help for this module on the screen/console. *************/ static void showUsage() { fputs(usage, stdout); } static bool expandTypedef(SwigType *t) { if (SwigType_isenum(t)) return false; String *prefix = SwigType_prefix(t); if (Strncmp(prefix, "f", 1)) return false; if (Strncmp(prefix, "p.f", 3)) return false; return true; } /***** Determine whether we should add a .copy argument to the S function that wraps/interfaces to the routine that returns the given type. *****/ static int addCopyParameter(SwigType *type) { int ok = 0; ok = Strncmp(type, "struct ", 7) == 0 || Strncmp(type, "p.struct ", 9) == 0; if(!ok) { ok = Strncmp(type, "p.", 2); } return(ok); } static void replaceRClass(String *tm, SwigType *type) { String *tmp = getRClassName(type); String *tmp_base = getRClassName(type, 0); String *tmp_ref = getRClassName(type, 1, 1); Replaceall(tm, "$R_class", tmp); Replaceall(tm, "$*R_class", tmp_base); Replaceall(tm, "$&R_class", tmp_ref); Delete(tmp); Delete(tmp_base); Delete(tmp_ref); } static double getNumber(String *value) { double d = DEFAULT_NUMBER; if(Char(value)) { if(sscanf(Char(value), "%lf", &d) != 1) return(DEFAULT_NUMBER); } return(d); } class R : public Language { public: R(); void registerClass(Node *n); void main(int argc, char *argv[]); int top(Node *n); void dispatchFunction(Node *n); int functionWrapper(Node *n); int constantWrapper(Node *n); int variableWrapper(Node *n); int classDeclaration(Node *n); int enumDeclaration(Node *n); int membervariableHandler(Node *n); int typedefHandler(Node *n); static List *Swig_overload_rank(Node *n, bool script_lang_wrapping); int memberfunctionHandler(Node *n) { if (debugMode) Printf(stdout, " %s %s\n", Getattr(n, "name"), Getattr(n, "type")); member_name = Getattr(n, "sym:name"); processing_class_member_function = 1; int status = Language::memberfunctionHandler(n); processing_class_member_function = 0; return status; } /* Grab the name of the current class being processed so that we can deal with members of that class. */ int classHandler(Node *n){ if(!ClassMemberTable) ClassMemberTable = NewHash(); class_name = Getattr(n, "name"); int status = Language::classHandler(n); class_name = NULL; return status; } // Not used: String *runtimeCode(); protected: int addRegistrationRoutine(String *rname, int nargs); int outputRegistrationRoutines(File *out); int outputCommandLineArguments(File *out); int generateCopyRoutines(Node *n); int DumpCode(Node *n); int OutputMemberReferenceMethod(String *className, int isSet, List *el, File *out); int OutputArrayMethod(String *className, List *el, File *out); int OutputClassMemberTable(Hash *tb, File *out); int OutputClassMethodsTable(File *out); int OutputClassAccessInfo(Hash *tb, File *out); int defineArrayAccessors(SwigType *type); void addNamespaceFunction(String *name) { if(!namespaceFunctions) namespaceFunctions = NewList(); Append(namespaceFunctions, name); } void addNamespaceMethod(String *name) { if(!namespaceMethods) namespaceMethods = NewList(); Append(namespaceMethods, name); } String* processType(SwigType *t, Node *n, int *nargs = NULL); String *createFunctionPointerHandler(SwigType *t, Node *n, int *nargs); int addFunctionPointerProxy(String *name, Node *n, SwigType *t, String *s_paramTypes) { /*XXX Do we need to put the t in there to get the return type later. */ if(!functionPointerProxyTable) functionPointerProxyTable = NewHash(); Setattr(functionPointerProxyTable, name, n); Setattr(SClassDefs, name, name); Printv(s_classes, "setClass('", name, "',\n", tab8, "prototype = list(parameterTypes = c(", s_paramTypes, "),\n", tab8, tab8, tab8, "returnType = '", SwigType_manglestr(t), "'),\n", tab8, "contains = 'CRoutinePointer')\n\n##\n", NIL); return SWIG_OK; } void addSMethodInfo(String *name, String *argType, int nargs); // Simple initialization such as constant strings that can be reused. void init(); void addAccessor(String *memberName, Wrapper *f, String *name, int isSet = -1); static int getFunctionPointerNumArgs(Node *n, SwigType *tt); protected: bool copyStruct; bool memoryProfile; bool aggressiveGc; // Strings into which we cumulate the generated code that is to be written //vto the files. String *sfile; String *f_init; String *s_classes; String *f_begin; String *f_runtime; String *f_wrapper; String *s_header; String *f_wrappers; String *s_init; String *s_init_routine; String *s_namespace; // State variables that carry information across calls to functionWrapper() // from member accessors and class declarations. String *opaqueClassDeclaration; int processing_variable; int processing_member_access_function; String *member_name; String *class_name; int processing_class_member_function; List *class_member_functions; List *class_member_set_functions; /* */ Hash *ClassMemberTable; Hash *ClassMethodsTable; Hash *SClassDefs; Hash *SMethodInfo; // Information about routines that are generated and to be registered with // R for dynamic lookup. Hash *registrationTable; Hash *functionPointerProxyTable; List *namespaceFunctions; List *namespaceMethods; List *namespaceClasses; // Probably can do this from ClassMemberTable. // Store a copy of the command line. // Need only keep a string that has it formatted. char **Argv; int Argc; bool inCPlusMode; // State variables that we remember from the command line settings // potentially that govern the code we generate. String *DllName; String *Rpackage; bool noInitializationCode; bool outputNamespaceInfo; String *UnProtectWrapupCode; // Static members static bool debugMode; }; R::R() : copyStruct(false), memoryProfile(false), aggressiveGc(false), sfile(0), f_init(0), s_classes(0), f_begin(0), f_runtime(0), f_wrapper(0), s_header(0), f_wrappers(0), s_init(0), s_init_routine(0), s_namespace(0), opaqueClassDeclaration(0), processing_variable(0), processing_member_access_function(0), member_name(0), class_name(0), processing_class_member_function(0), class_member_functions(0), class_member_set_functions(0), ClassMemberTable(0), ClassMethodsTable(0), SClassDefs(0), SMethodInfo(0), registrationTable(0), functionPointerProxyTable(0), namespaceFunctions(0), namespaceMethods(0), namespaceClasses(0), Argv(0), Argc(0), inCPlusMode(false), DllName(0), Rpackage(0), noInitializationCode(false), outputNamespaceInfo(false), UnProtectWrapupCode(0) { } bool R::debugMode = false; int R::getFunctionPointerNumArgs(Node *n, SwigType *tt) { (void) tt; n = Getattr(n, "type"); if (debugMode) Printf(stdout, "type: %s\n", n); ParmList *parms = Getattr(n, "parms"); if (debugMode) Printf(stdout, "parms = %p\n", parms); return ParmList_len(parms); } void R::addSMethodInfo(String *name, String *argType, int nargs) { (void) argType; if(!SMethodInfo) SMethodInfo = NewHash(); if (debugMode) Printf(stdout, "[addMethodInfo] %s\n", name); Hash *tb = Getattr(SMethodInfo, name); if(!tb) { tb = NewHash(); Setattr(SMethodInfo, name, tb); } String *str = Getattr(tb, "max"); int max = -1; if(str) max = atoi(Char(str)); if(max < nargs) { if(str) Delete(str); str = NewStringf("%d", max); Setattr(tb, "max", str); } } /* Returns the name of the new routine. */ String * R::createFunctionPointerHandler(SwigType *t, Node *n, int *numArgs) { String *funName = SwigType_manglestr(t); /* See if we have already processed this one. */ if(functionPointerProxyTable && Getattr(functionPointerProxyTable, funName)) return funName; if (debugMode) Printf(stdout, " Defining %s\n", t); SwigType *rettype = Copy(Getattr(n, "type")); SwigType *funcparams = SwigType_functionpointer_decompose(rettype); String *rtype = SwigType_str(rettype, 0); // ParmList *parms = Getattr(n, "parms"); // memory leak ParmList *parms = SwigType_function_parms(SwigType_del_pointer(Copy(t)), n); if (debugMode) { Printf(stdout, "Type: %s\n", t); Printf(stdout, "Return type: %s\n", SwigType_base(t)); } bool isVoidType = Strcmp(rettype, "void") == 0; if (debugMode) Printf(stdout, "%s is void ? %s (%s)\n", funName, isVoidType ? "yes" : "no", rettype); Wrapper *f = NewWrapper(); /* Go through argument list, attach lnames for arguments */ int i = 0; Parm *p = parms; for (i = 0; p; p = nextSibling(p), ++i) { String *arg = Getattr(p, "name"); String *lname; if (!arg && Cmp(Getattr(p, "type"), "void")) { lname = NewStringf("s_arg%d", i+1); Setattr(p, "name", lname); } else lname = arg; Setattr(p, "lname", lname); } Swig_typemap_attach_parms("out", parms, f); Swig_typemap_attach_parms("scoerceout", parms, f); Swig_typemap_attach_parms("scheck", parms, f); Printf(f->def, "%s %s(", rtype, funName); emit_parameter_variables(parms, f); emit_return_variable(n, rettype, f); // emit_attach_parmmaps(parms,f); /* Using weird name and struct to avoid potential conflicts. */ Wrapper_add_local(f, "r_swig_cb_data", "RCallbackFunctionData *r_swig_cb_data = R_SWIG_getCallbackFunctionData()"); String *lvar = NewString("r_swig_cb_data"); Wrapper_add_local(f, "r_tmp", "SEXP r_tmp"); // for use in converting arguments to R objects for call. Wrapper_add_local(f, "r_nprotect", "int r_nprotect = 0"); // for use in converting arguments to R objects for call. Wrapper_add_local(f, "r_vmax", "char * r_vmax= 0"); // for use in converting arguments to R objects for call. // Add local for error code in return value. This is not in emit_return_variable because that assumes an out typemap // whereas the type makes are reverse Wrapper_add_local(f, "ecode", "int ecode = 0"); p = parms; int nargs = ParmList_len(parms); if(numArgs) { *numArgs = nargs; if (debugMode) Printf(stdout, "Setting number of parameters to %d\n", *numArgs); } String *setExprElements = NewString(""); String *s_paramTypes = NewString(""); for(i = 0; p; i++) { SwigType *tt = Getattr(p, "type"); SwigType *name = Getattr(p, "name"); String *tm = Getattr(p, "tmap:out"); Printf(f->def, "%s %s", SwigType_str(tt, 0), name); if(tm) { Replaceall(tm, "$1", name); if (SwigType_isreference(tt)) { String *tmp = NewString(""); Append(tmp, "*"); Append(tmp, name); Replaceall(tm, tmp, name); } Replaceall(tm, "$result", "r_tmp"); replaceRClass(tm, Getattr(p,"type")); Replaceall(tm,"$owner", "R_SWIG_EXTERNAL"); } Printf(setExprElements, "%s\n", tm); Printf(setExprElements, "SETCAR(r_swig_cb_data->el, %s);\n", "r_tmp"); Printf(setExprElements, "r_swig_cb_data->el = CDR(r_swig_cb_data->el);\n\n"); Printf(s_paramTypes, "'%s'", SwigType_manglestr(tt)); p = nextSibling(p); if(p) { Printf(f->def, ", "); Printf(s_paramTypes, ", "); } } Printf(f->def, ") {\n"); Printf(f->code, "Rf_protect(%s->expr = Rf_allocVector(LANGSXP, %d));\n", lvar, nargs + 1); Printf(f->code, "r_nprotect++;\n"); Printf(f->code, "r_swig_cb_data->el = r_swig_cb_data->expr;\n\n"); Printf(f->code, "SETCAR(r_swig_cb_data->el, r_swig_cb_data->fun);\n"); Printf(f->code, "r_swig_cb_data->el = CDR(r_swig_cb_data->el);\n\n"); Printf(f->code, "%s\n\n", setExprElements); Printv(f->code, "r_swig_cb_data->retValue = R_tryEval(", "r_swig_cb_data->expr,", " R_GlobalEnv,", " &r_swig_cb_data->errorOccurred", ");\n", NIL); Printv(f->code, "\n", "if(r_swig_cb_data->errorOccurred) {\n", "R_SWIG_popCallbackFunctionData(1);\n", "Rf_error(\"error in calling R function as a function pointer (", funName, ")\");\n", "}\n", NIL); if(!isVoidType) { /* Need to deal with the return type of the function pointer, not the function pointer itself. So build a new node that has the relevant pieces. XXX Have to be a little more clever so that we can deal with struct A * - the * is getting lost. Is this still true? If so, will a SwigType_push() solve things? */ Parm *bbase = NewParmNode(rettype, n); String *returnTM = Swig_typemap_lookup("in", bbase, Swig_cresult_name(), f); if(returnTM) { String *tm = returnTM; Replaceall(tm,"$input", "r_swig_cb_data->retValue"); Replaceall(tm,"$target", Swig_cresult_name()); replaceRClass(tm, rettype); Replaceall(tm,"$owner", "R_SWIG_EXTERNAL"); Replaceall(tm,"$disown","0"); Printf(f->code, "%s\n", tm); } Delete(bbase); } Printv(f->code, "R_SWIG_popCallbackFunctionData(1);\n", NIL); Printv(f->code, "\n", UnProtectWrapupCode, NIL); if (SwigType_isreference(rettype)) { Printv(f->code, "return *", Swig_cresult_name(), ";\n", NIL); } else if(!isVoidType) Printv(f->code, "return ", Swig_cresult_name(), ";\n", NIL); Printv(f->code, "\n}\n", NIL); Replaceall(f->code, "SWIG_exception_fail", "SWIG_exception_noreturn"); /* To coerce correctly in S, we really want to have an extra/intermediate function that handles the scoerceout. We need to check if any of the argument types have an entry in that map. If none do, the ignore and call the function straight. Otherwise, generate the a marshalling function. Need to be able to find it in S. Or use an entirely generic one that evaluates the expressions. Handle errors in the evaluation of the function by restoring the stack, if there is one in use for this function (i.e. no userData). */ Wrapper_print(f, f_wrapper); addFunctionPointerProxy(funName, n, t, s_paramTypes); Delete(s_paramTypes); Delete(rtype); Delete(rettype); Delete(funcparams); DelWrapper(f); return funName; } void R::init() { UnProtectWrapupCode = NewStringf("%s", "vmaxset(r_vmax);\nif(r_nprotect) Rf_unprotect(r_nprotect);\n\n"); SClassDefs = NewHash(); sfile = NewString(""); f_init = NewString(""); s_header = NewString(""); f_begin = NewString(""); f_runtime = NewString(""); f_wrapper = NewString(""); s_classes = NewString(""); s_init = NewString(""); s_init_routine = NewString(""); } #if 0 int R::cDeclaration(Node *n) { SwigType *t = Getattr(n, "type"); SwigType *name = Getattr(n, "name"); if (debugMode) Printf(stdout, "cDeclaration (%s): %s\n", name, SwigType_lstr(t, 0)); return Language::cDeclaration(n); } #endif /** Method from Language that is called to start the entire processing off, i.e. the generation of the code. It is called after the input has been read and parsed. Here we open the output streams and generate the code. ***/ int R::top(Node *n) { String *module = Getattr(n, "name"); if(!Rpackage) Rpackage = Copy(module); if(!DllName) DllName = Copy(module); if(outputNamespaceInfo) { s_namespace = NewString(""); Swig_register_filebyname("snamespace", s_namespace); Printf(s_namespace, "useDynLib(%s)\n", DllName); } /* Associate the different streams with names so that they can be used in %insert directives by the typemap code. */ Swig_register_filebyname("sinit", s_init); Swig_register_filebyname("sinitroutine", s_init_routine); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("header", s_header); Swig_register_filebyname("wrapper", f_wrapper); Swig_register_filebyname("s", sfile); Swig_register_filebyname("sclasses", s_classes); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGR\n#define SWIGR\n#endif\n\n"); Swig_banner_target_lang(s_init, "#"); outputCommandLineArguments(s_init); Printf(f_wrapper, "#ifdef __cplusplus\n"); Printf(f_wrapper, "extern \"C\" {\n"); Printf(f_wrapper, "#endif\n\n"); Language::top(n); Printf(f_wrapper, "#ifdef __cplusplus\n"); Printf(f_wrapper, "}\n"); Printf(f_wrapper, "#endif\n"); String *type_table = NewString(""); SwigType_emit_type_table(f_runtime,f_wrapper); Delete(type_table); if(ClassMemberTable) { //XXX OutputClassAccessInfo(ClassMemberTable, sfile); Delete(ClassMemberTable); ClassMemberTable = NULL; } Printf(f_init,"}\n"); if(registrationTable) outputRegistrationRoutines(f_init); /* Now arrange to write the 2 files - .S and .c. */ DumpCode(n); Delete(sfile); Delete(s_classes); Delete(s_init); Delete(f_wrapper); Delete(f_init); Delete(s_header); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /***************************************************** Write the generated code to the .S and the .c files. ****************************************************/ int R::DumpCode(Node *n) { String *output_filename = NewString(""); /* The name of the file in which we will generate the S code. */ Printf(output_filename, "%s%s.R", SWIG_output_directory(), Rpackage); #ifdef R_SWIG_VERBOSE Printf(stdout, "Writing S code to %s\n", output_filename); #endif File *scode = NewFile(output_filename, "w", SWIG_output_files()); if (!scode) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Delete(output_filename); Printf(scode, "%s\n\n", s_init); Printf(scode, "%s\n\n", s_classes); Printf(scode, "%s\n", sfile); Delete(scode); String *outfile = Getattr(n,"outfile"); File *runtime = NewFile(outfile,"w", SWIG_output_files()); if (!runtime) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", f_begin); Printf(runtime, "%s\n", f_runtime); Printf(runtime, "%s\n", s_header); Printf(runtime, "%s\n", f_wrapper); Printf(runtime, "%s\n", f_init); Delete(runtime); if(outputNamespaceInfo) { output_filename = NewString(""); Printf(output_filename, "%sNAMESPACE", SWIG_output_directory()); File *ns = NewFile(output_filename, "w", SWIG_output_files()); if (!ns) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Delete(output_filename); Printf(ns, "%s\n", s_namespace); Printf(ns, "\nexport(\n"); writeListByLine(namespaceFunctions, ns); Printf(ns, ")\n"); Printf(ns, "\nexportMethods(\n"); writeListByLine(namespaceFunctions, ns, 1); Printf(ns, ")\n"); Delete(ns); Delete(s_namespace); } return SWIG_OK; } /* We may need to do more.... so this is left as a stub for the moment. */ int R::OutputClassAccessInfo(Hash *tb, File *out) { int n = OutputClassMemberTable(tb, out); OutputClassMethodsTable(out); return n; } /************************************************************************ Currently this just writes the information collected about the different methods of the C++ classes that have been processed to the console. This will be used later to define S4 generics and methods. **************************************************************************/ int R::OutputClassMethodsTable(File *) { Hash *tb = ClassMethodsTable; if(!tb) return SWIG_OK; List *keys = Keys(tb); String *key; int i, n = Len(keys); if (debugMode) { for(i = 0; i < n ; i++ ) { key = Getitem(keys, i); Printf(stdout, "%d) %s\n", i, key); List *els = Getattr(tb, key); int nels = Len(els); Printf(stdout, "\t"); for(int j = 0; j < nels; j+=2) { Printf(stdout, "%s%s", Getitem(els, j), j < nels - 1 ? ", " : ""); Printf(stdout, "%s\n", Getitem(els, j+1)); } Printf(stdout, "\n"); } } return SWIG_OK; } /* Iterate over the _set and <>_get elements and generate the $ and $<- functions that provide constrained access to the member fields in these elements. tb - a hash table that is built up in functionWrapper as we process each membervalueHandler. The entries are indexed by _set and _get. Each entry is a List *. out - the stram where the code is to be written. This is the S code stream as we generate only S code here.. */ int R::OutputClassMemberTable(Hash *tb, File *out) { List *keys = Keys(tb), *el; String *key; int i, n = Len(keys); /* Loop over all the _set and _get entries in the table. */ /* This function checks for names ending in _set - perhaps it should */ /* use attributes of some other form, as it potentially clashes with */ /* methods ending in _set */ if(n && outputNamespaceInfo) { Printf(s_namespace, "exportClasses("); } for(i = 0; i < n; i++) { key = Getitem(keys, i); el = Getattr(tb, key); String *className = Getitem(el, 0); char *ptr = Char(key); int klen = Len(key); int isSet = 0; if (klen > 4) { ptr = &ptr[klen - 4]; isSet = strcmp(ptr, "_set") == 0; } // OutputArrayMethod(className, el, out); OutputMemberReferenceMethod(className, isSet, el, out); if(outputNamespaceInfo) Printf(s_namespace, "\"%s\"%s", className, i < n-1 ? "," : ""); } if(n && outputNamespaceInfo) { Printf(s_namespace, ")\n"); } return n; } /******************************************************************* Write the methods for $ or $<- for accessing a member field in an struct or union (or class). className - the name of the struct or union (e.g. Bar for struct Bar) isSet - a logical value indicating whether the method is for modifying ($<-) or accessing ($) the member field. el - a list of length 2 * # accessible member elements + 1. The first element is the name of the class. The other pairs are member name and the name of the R function to access it. out - the stream where we write the code. ********************************************************************/ int R::OutputMemberReferenceMethod(String *className, int isSet, List *el, File *out) { int numMems = Len(el), j; int varaccessor = 0; if (numMems == 0) return SWIG_OK; Wrapper *f = NewWrapper(), *attr = NewWrapper(); Printf(f->def, "function(x, name%s)", isSet ? ", value" : ""); Printf(attr->def, "function(x, i, j, ...%s)", isSet ? ", value" : ""); Printf(f->code, "{\n"); Printf(f->code, "%saccessorFuns = list(", tab8); Node *itemList = NewHash(); bool has_prev = false; for(j = 0; j < numMems; j+=3) { String *item = Getitem(el, j); if (Getattr(itemList, item)) continue; Setattr(itemList, item, "1"); String *dup = Getitem(el, j + 1); char *ptr = Char(dup); ptr = &ptr[Len(dup) - 3]; if (!strcmp(ptr, "get")) varaccessor++; String *pitem; if (!Strcmp(item, "operator ()")) { pitem = NewString("call"); } else if (!Strcmp(item, "operator ->")) { pitem = NewString("deref"); } else if (!Strcmp(item, "operator +")) { pitem = NewString("add"); } else if (!Strcmp(item, "operator -")) { pitem = NewString("sub"); } else { pitem = Copy(item); } if (has_prev) Printf(f->code, ", "); Printf(f->code, "'%s' = %s", pitem, dup); has_prev = true; Delete(pitem); } Delete(itemList); Printf(f->code, ");\n"); if (!isSet && varaccessor > 0) { Printf(f->code, "%svaccessors = c(", tab8); int first = 1; for(j = 0; j < numMems; j+=3) { String *item = Getitem(el, j); String *dup = Getitem(el, j + 1); char *ptr = Char(dup); ptr = &ptr[Len(dup) - 3]; if (!strcmp(ptr, "get")) { Printf(f->code, "%s'%s'", first ? "" : ", ", item); first = 0; } } Printf(f->code, ");\n"); } /* Printv(f->code, tab8, "idx = pmatch(name, names(accessorFuns))\n", tab8, "if(is.na(idx)) {\n", tab8, tab4, "stop(\"No ", (isSet ? "modifiable" : "accessible"), " field named \", name, \" in ", className, ": fields are \", paste(names(accessorFuns), sep = \", \")", ")", "\n}\n", NIL); */ Printv(f->code, ";", tab8, "idx = pmatch(name, names(accessorFuns));\n", tab8, "if(is.na(idx)) \n", tab8, tab4, NIL); Printf(f->code, "return(callNextMethod(x, name%s));\n", isSet ? ", value" : ""); Printv(f->code, tab8, "f = accessorFuns[[idx]];\n", NIL); if(isSet) { Printv(f->code, tab8, "f(x, value);\n", NIL); Printv(f->code, tab8, "x;\n", NIL); // make certain to return the S value. } else { if (varaccessor) { Printv(f->code, tab8, "if (is.na(match(name, vaccessors))) function(...){f(x, ...)} else f(x);\n", NIL); } else { Printv(f->code, tab8, "function(...){f(x, ...)};\n", NIL); } } Printf(f->code, "}\n"); Printf(out, "# Start of accessor method for %s\n", className); Printf(out, "setMethod('$%s', '_p%s', ", isSet ? "<-" : "", getRClassName(className)); Wrapper_print(f, out); Printf(out, ");\n"); if(isSet) { Printf(out, "setMethod('[[<-', c('_p%s', 'character'),", getRClassName(className)); Insert(f->code, 2, "name = i;\n"); Printf(attr->code, "%s", f->code); Wrapper_print(attr, out); Printf(out, ");\n"); } DelWrapper(attr); DelWrapper(f); Printf(out, "# end of accessor method for %s\n", className); return SWIG_OK; } /******************************************************************* Write the methods for [ or [<- for accessing a member field in an struct or union (or class). className - the name of the struct or union (e.g. Bar for struct Bar) el - a list of length 2 * # accessible member elements + 1. The first element is the name of the class. The other pairs are member name and the name of the R function to access it. out - the stream where we write the code. ********************************************************************/ int R::OutputArrayMethod(String *className, List *el, File *out) { int numMems = Len(el), j; if(!el || numMems == 0) return(0); Printf(out, "# start of array methods for %s\n", className); for(j = 0; j < numMems; j+=3) { String *item = Getitem(el, j); String *dup = Getitem(el, j + 1); if (!Strcmp(item, "__getitem__")) { Printf(out, "setMethod('[', '_p%s', function(x, i, j, ..., drop =TRUE) ", getRClassName(className)); Printf(out, " sapply(i, function (n) %s(x, as.integer(n-1))))\n\n", dup); } if (!Strcmp(item, "__setitem__")) { Printf(out, "setMethod('[<-', '_p%s', function(x, i, j, ..., value)", getRClassName(className)); Printf(out, " sapply(1:length(i), function(n) %s(x, as.integer(i[n]-1), value[n])))\n\n", dup); } } Printf(out, "# end of array methods for %s\n", className); return SWIG_OK; } /************************************************************ Called when a enumeration is to be processed. We want to call the R function defineEnumeration(). tdname is the typedef of the enumeration, i.e. giving its name. *************************************************************/ int R::enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); /* Using name if tdname is empty. */ if(Len(tdname) == 0) tdname = name; if(!tdname || Strcmp(tdname, "") == 0) { Language::enumDeclaration(n); return SWIG_OK; } String *mangled_tdname = SwigType_manglestr(tdname); String *scode = NewString(""); Printv(scode, "defineEnumeration('", mangled_tdname, "'", ",\n", tab8, tab8, tab4, ".values = c(\n", NIL); Node *c; int value = -1; // First number is zero for (c = firstChild(n); c; c = nextSibling(c)) { // const char *tag = Char(nodeType(c)); // if (Strcmp(tag,"cdecl") == 0) { name = Getattr(c, "name"); String *val = Getattr(c, "enumvalue"); if(val && Char(val)) { int inval = (int) getNumber(val); if(inval == DEFAULT_NUMBER) value++; else value = inval; } else value++; Printf(scode, "%s%s%s'%s' = %d%s\n", tab8, tab8, tab8, name, value, nextSibling(c) ? ", " : ""); // } } Printv(scode, "))", NIL); Printf(sfile, "%s\n", scode); Delete(scode); Delete(mangled_tdname); return SWIG_OK; } /************************************************************* **************************************************************/ int R::variableWrapper(Node *n) { String *name = Getattr(n, "sym:name"); processing_variable = 1; Language::variableWrapper(n); // Force the emission of the _set and _get function wrappers. processing_variable = 0; SwigType *ty = Getattr(n, "type"); int addCopyParam = addCopyParameter(ty); //XXX processType(ty, n); if(!SwigType_isconst(ty)) { Wrapper *f = NewWrapper(); Printf(f->def, "%s = \nfunction(value%s)\n{\n", name, addCopyParam ? ", .copy = FALSE" : ""); Printv(f->code, "if(missing(value)) {\n", name, "_get(", addCopyParam ? ".copy" : "", ")\n}", NIL); Printv(f->code, " else {\n", name, "_set(value)\n}\n}", NIL); Wrapper_print(f, sfile); DelWrapper(f); } else { Printf(sfile, "%s = %s_get\n", name, name); } return SWIG_OK; } void R::addAccessor(String *memberName, Wrapper *wrapper, String *name, int isSet) { if(isSet < 0) { int n = Len(name); char *ptr = Char(name); if (n>4) { isSet = Strcmp(NewString(&ptr[n-4]), "_set") == 0; } } List *l = isSet ? class_member_set_functions : class_member_functions; if(!l) { l = NewList(); if(isSet) class_member_set_functions = l; else class_member_functions = l; } Append(l, memberName); Append(l, name); String *tmp = NewString(""); Wrapper_print(wrapper, tmp); Append(l, tmp); // if we could put the wrapper in directly: Append(l, Copy(sfun)); if (debugMode) Printf(stdout, "Adding accessor: %s (%s) => %s\n", memberName, name, tmp); } #define MAX_OVERLOAD 256 struct Overloaded { Node *n; /* Node */ int argc; /* Argument count */ ParmList *parms; /* Parameters used for overload check */ int error; /* Ambiguity error */ }; List * R::Swig_overload_rank(Node *n, bool script_lang_wrapping) { Overloaded nodes[MAX_OVERLOAD]; int nnodes = 0; Node *o = Getattr(n,"sym:overloaded"); if (!o) return 0; Node *c = o; while (c) { if (Getattr(c,"error")) { c = Getattr(c,"sym:nextSibling"); continue; } /* if (SmartPointer && Getattr(c,"cplus:staticbase")) { c = Getattr(c,"sym:nextSibling"); continue; } */ /* Make a list of all the declarations (methods) that are overloaded with * this one particular method name */ if (Getattr(c,"wrap:name")) { nodes[nnodes].n = c; nodes[nnodes].parms = Getattr(c,"wrap:parms"); nodes[nnodes].argc = emit_num_required(nodes[nnodes].parms); nodes[nnodes].error = 0; nnodes++; } c = Getattr(c,"sym:nextSibling"); } /* Sort the declarations by required argument count */ { int i,j; for (i = 0; i < nnodes; i++) { for (j = i+1; j < nnodes; j++) { if (nodes[i].argc > nodes[j].argc) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } } } } /* Sort the declarations by argument types */ { int i,j; for (i = 0; i < nnodes-1; i++) { if (nodes[i].argc == nodes[i+1].argc) { for (j = i+1; (j < nnodes) && (nodes[j].argc == nodes[i].argc); j++) { Parm *p1 = nodes[i].parms; Parm *p2 = nodes[j].parms; int differ = 0; int num_checked = 0; while (p1 && p2 && (num_checked < nodes[i].argc)) { if (debugMode) { Printf(stdout,"p1 = '%s', p2 = '%s'\n", Getattr(p1,"type"), Getattr(p2,"type")); } if (checkAttribute(p1,"tmap:in:numinputs","0")) { p1 = Getattr(p1,"tmap:in:next"); continue; } if (checkAttribute(p2,"tmap:in:numinputs","0")) { p2 = Getattr(p2,"tmap:in:next"); continue; } String *t1 = Getattr(p1,"tmap:typecheck:precedence"); String *t2 = Getattr(p2,"tmap:typecheck:precedence"); if (debugMode) { Printf(stdout,"t1 = '%s', t2 = '%s'\n", t1, t2); } if ((!t1) && (!nodes[i].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[i].n), Getline(nodes[i].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[i].n), SwigType_str(Getattr(p1, "type"), 0)); nodes[i].error = 1; } else if ((!t2) && (!nodes[j].error)) { Swig_warning(WARN_TYPEMAP_TYPECHECK, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s not supported (incomplete type checking rule - no precedence level in typecheck typemap for '%s').\n", Swig_name_decl(nodes[j].n), SwigType_str(Getattr(p2, "type"), 0)); nodes[j].error = 1; } if (t1 && t2) { int t1v, t2v; t1v = atoi(Char(t1)); t2v = atoi(Char(t2)); differ = t1v-t2v; } else if (!t1 && t2) differ = 1; else if (t1 && !t2) differ = -1; else if (!t1 && !t2) differ = -1; num_checked++; if (differ > 0) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; break; } else if ((differ == 0) && (Strcmp(t1,"0") == 0)) { t1 = Getattr(p1,"ltype"); if (!t1) { t1 = SwigType_ltype(Getattr(p1,"type")); if (Getattr(p1,"tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t1); } Setattr(p1,"ltype",t1); } t2 = Getattr(p2,"ltype"); if (!t2) { t2 = SwigType_ltype(Getattr(p2,"type")); if (Getattr(p2,"tmap:typecheck:SWIGTYPE")) { SwigType_add_pointer(t2); } Setattr(p2,"ltype",t2); } /* Need subtype check here. If t2 is a subtype of t1, then we need to change the order */ if (SwigType_issubtype(t2,t1)) { Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } if (Strcmp(t1,t2) != 0) { differ = 1; break; } } else if (differ) { break; } if (Getattr(p1,"tmap:in:next")) { p1 = Getattr(p1,"tmap:in:next"); } else { p1 = nextSibling(p1); } if (Getattr(p2,"tmap:in:next")) { p2 = Getattr(p2,"tmap:in:next"); } else { p2 = nextSibling(p2); } } if (!differ) { /* See if declarations differ by const only */ String *d1 = Getattr(nodes[i].n, "decl"); String *d2 = Getattr(nodes[j].n, "decl"); if (d1 && d2) { String *dq1 = Copy(d1); String *dq2 = Copy(d2); if (SwigType_isconst(d1)) { Delete(SwigType_pop(dq1)); } if (SwigType_isconst(d2)) { Delete(SwigType_pop(dq2)); } if (Strcmp(dq1, dq2) == 0) { if (SwigType_isconst(d1) && !SwigType_isconst(d2)) { if (script_lang_wrapping) { // Swap nodes so that the const method gets ignored (shadowed by the non-const method) Overloaded t = nodes[i]; nodes[i] = nodes[j]; nodes[j] = t; } differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } else if (!SwigType_isconst(d1) && SwigType_isconst(d2)) { differ = 1; if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_CONST, Getfile(nodes[i].n), Getline(nodes[i].n), "using non-const method %s instead.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } } nodes[j].error = 1; } } Delete(dq1); Delete(dq2); } } if (!differ) { if (!nodes[j].error) { if (script_lang_wrapping) { Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s effectively ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_SHADOW, Getfile(nodes[i].n), Getline(nodes[i].n), "as it is shadowed by %s.\n", Swig_name_decl(nodes[i].n)); } else { if (!Getattr(nodes[j].n, "overload:ignore")) { Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[j].n), Getline(nodes[j].n), "Overloaded method %s ignored,\n", Swig_name_decl(nodes[j].n)); Swig_warning(WARN_LANG_OVERLOAD_IGNORED, Getfile(nodes[i].n), Getline(nodes[i].n), "using %s instead.\n", Swig_name_decl(nodes[i].n)); } } nodes[j].error = 1; } } } } } } List *result = NewList(); { int i; for (i = 0; i < nnodes; i++) { if (nodes[i].error) Setattr(nodes[i].n, "overload:ignore", "1"); Append(result,nodes[i].n); // Printf(stdout,"[ %d ] %s\n", i, ParmList_errorstr(nodes[i].parms)); // Swig_print_node(nodes[i].n); } } return result; } void R::dispatchFunction(Node *n) { Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *nodeType = Getattr(n, "nodeType"); bool constructor = (!Cmp(nodeType, "constructor")); String *sfname = NewString(symname); if (constructor) Replace(sfname, "new_", "", DOH_REPLACE_FIRST); Printf(f->def, "`%s` <- function(...) {", sfname); if (debugMode) { Swig_print_node(n); } List *dispatch = Swig_overload_rank(n, true); int nfunc = Len(dispatch); Printv(f->code, "argtypes <- mapply(class, list(...));\n", "argv <- list(...);\n", "argc <- length(argtypes);\n", NIL ); Printf(f->code, "# dispatch functions %d\n", nfunc); int cur_args = -1; bool first_compare = true; for (int i=0; i < nfunc; i++) { Node *ni = Getitem(dispatch,i); Parm *pi = Getattr(ni,"wrap:parms"); int num_arguments = emit_num_arguments(pi); String *overname = Getattr(ni,"sym:overname"); if (cur_args != num_arguments) { if (cur_args != -1) { Printv(f->code, "} else ", NIL); } Printf(f->code, "if (argc == %d) {", num_arguments); cur_args = num_arguments; first_compare = true; } Parm *p; int j; if (num_arguments > 0) { if (!first_compare) { Printv(f->code, " else ", NIL); } else { first_compare = false; } Printv(f->code, "if (", NIL); for (p =pi, j = 0 ; j < num_arguments ; j++) { if (debugMode) { Swig_print_node(p); } String *tm = Swig_typemap_lookup("rtype", p, "", 0); if(tm) { replaceRClass(tm, Getattr(p, "type")); } String *tmcheck = Swig_typemap_lookup("rtypecheck", p, "", 0); if (tmcheck) { String *tmp = NewString(""); Printf(tmp, "argv[[%d]]", j+1); Replaceall(tmcheck, "$arg", tmp); Printf(tmp, "argtype[%d]", j+1); Replaceall(tmcheck, "$argtype", tmp); if (tm) { Replaceall(tmcheck, "$rtype", tm); } if (debugMode) { Printf(stdout, "%s\n", tmcheck); } Printf(f->code, "%s(%s)", j == 0? "" : " && ", tmcheck); p = Getattr(p, "tmap:in:next"); continue; } if (tm) { if (Strcmp(tm,"numeric")==0) { Printf(f->code, "%sis.numeric(argv[[%d]])", j == 0 ? "" : " && ", j+1); } else if (Strcmp(tm,"integer")==0) { Printf(f->code, "%s(is.integer(argv[[%d]]) || is.numeric(argv[[%d]]))", j == 0 ? "" : " && ", j+1, j+1); } else if (Strcmp(tm,"character")==0) { Printf(f->code, "%sis.character(argv[[%d]])", j == 0 ? "" : " && ", j+1); } else { Printf(f->code, "%sextends(argtypes[%d], '%s')", j == 0 ? "" : " && ", j+1, tm); } } if (!SwigType_ispointer(Getattr(p, "type"))) { Printf(f->code, " && length(argv[[%d]]) == 1", j+1); } p = Getattr(p, "tmap:in:next"); } Printf(f->code, ") { f <- %s%s; }\n", sfname, overname); } else { Printf(f->code, "f <- %s%s; ", sfname, overname); } } if (cur_args != -1) { Printf(f->code, "} else {\n" "stop(\"cannot find overloaded function for %s with argtypes (\"," "toString(argtypes),\")\");\n" "}", sfname); } Printv(f->code, ";\nf(...)", NIL); Printv(f->code, ";\n}", NIL); Wrapper_print(f, sfile); Printv(sfile, "# Dispatch function\n", NIL); DelWrapper(f); } /****************************************************************** *******************************************************************/ int R::functionWrapper(Node *n) { String *fname = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *type = Getattr(n, "type"); if (debugMode) { Printf(stdout, " %s %s %s\n", fname, iname, type); } String *overname = 0; String *nodeType = Getattr(n, "nodeType"); bool constructor = (!Cmp(nodeType, "constructor")); bool destructor = (!Cmp(nodeType, "destructor")); String *sfname = NewString(iname); if (constructor) Replace(sfname, "new_", "", DOH_REPLACE_FIRST); if (Getattr(n,"sym:overloaded")) { overname = Getattr(n,"sym:overname"); Append(sfname, overname); } if (debugMode) Printf(stdout, " processing parameters\n"); ParmList *l = Getattr(n, "parms"); Parm *p; String *tm; p = l; while(p) { SwigType *resultType = Getattr(p, "type"); if (expandTypedef(resultType) && SwigType_istypedef(resultType)) { SwigType *resolved = SwigType_typedef_resolve_all(resultType); if (expandTypedef(resolved)) { Setattr(p, "type", Copy(resolved)); } } p = nextSibling(p); } String *unresolved_return_type = Copy(type); if (expandTypedef(type) && SwigType_istypedef(type)) { SwigType *resolved = SwigType_typedef_resolve_all(type); if (expandTypedef(resolved)) { type = Copy(resolved); Setattr(n, "type", type); } } if (debugMode) Printf(stdout, " unresolved_return_type %s\n", unresolved_return_type); if(processing_member_access_function) { if (debugMode) Printf(stdout, " '%s' '%s' '%s' '%s'\n", fname, iname, member_name, class_name); if(opaqueClassDeclaration) return SWIG_OK; /* Add the name of this member to a list for this class_name. We will dump all these at the end. */ int n = Len(iname); char *ptr = Char(iname); bool isSet(0); if (n > 4) isSet = Strcmp(NewString(&ptr[n-4]), "_set") == 0; String *tmp = NewString(""); Printf(tmp, "%s_%s", class_name, isSet ? "set" : "get"); List *memList = Getattr(ClassMemberTable, tmp); if(!memList) { memList = NewList(); Append(memList, class_name); Setattr(ClassMemberTable, tmp, memList); } Delete(tmp); Append(memList, member_name); Append(memList, iname); } int i; int nargs; String *wname = Swig_name_wrapper(iname); Replace(wname, "_wrap", "R_swig", DOH_REPLACE_FIRST); if(overname) Append(wname, overname); Setattr(n,"wrap:name", wname); Wrapper *f = NewWrapper(); Wrapper *sfun = NewWrapper(); int isVoidReturnType = (Strcmp(type, "void") == 0); // Need to use the unresolved return type since // typedef resolution removes the const which causes a // mismatch with the function action emit_return_variable(n, unresolved_return_type, f); SwigType *rtype = Getattr(n, "type"); int addCopyParam = 0; if(!isVoidReturnType) addCopyParam = addCopyParameter(rtype); // Can we get the nodeType() of the type node! and see if it is a struct. // int addCopyParam = SwigType_isclass(rtype); // if(addCopyParam) if (debugMode) Printf(stdout, "Adding a .copy argument to %s for %s = %s\n", iname, type, addCopyParam ? "yes" : "no"); Printv(f->def, "SWIGEXPORT SEXP\n", wname, " ( ", NIL); Printf(sfun->def, "# Start of %s\n", iname); Printv(sfun->def, "\n`", sfname, "` = function(", NIL); if(outputNamespaceInfo) //XXX Need to be a little more discriminating addNamespaceFunction(iname); Swig_typemap_attach_parms("scoercein", l, f); Swig_typemap_attach_parms("scoerceout", l, f); Swig_typemap_attach_parms("scheck", l, f); emit_parameter_variables(l, f); emit_attach_parmmaps(l,f); Setattr(n,"wrap:parms",l); nargs = emit_num_arguments(l); Wrapper_add_local(f, "r_nprotect", "unsigned int r_nprotect = 0"); Wrapper_add_localv(f, "r_ans", "SEXP", "r_ans = R_NilValue", NIL); Wrapper_add_localv(f, "r_vmax", "VMAXTYPE", "r_vmax = vmaxget()", NIL); String *sargs = NewString(""); String *s_inputTypes = NewString(""); String *s_inputMap = NewString(""); bool inFirstArg = true; bool inFirstType = true; Parm *curP; for (p =l, i = 0 ; i < nargs ; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *tt = Getattr(p, "type"); int nargs = -1; String *funcptr_name = processType(tt, p, &nargs); // SwigType *tp = Getattr(p, "type"); String *name = Getattr(p,"name"); String *lname = Getattr(p,"lname"); // R keyword renaming if (name) { if (Swig_name_warning(p, 0, name, 0)) { name = 0; } else { /* If we have a :: in the parameter name because we are accessing a static member of a class, say, then we need to remove that prefix. */ while (Strstr(name, "::")) { //XXX need to free. name = NewStringf("%s", Strchr(name, ':') + 2); if (debugMode) Printf(stdout, "+++ parameter name with :: in it %s\n", name); } } } if (!name || Len(name) == 0) name = NewStringf("s_arg%d", i+1); name = replaceInitialDash(name); if (!Strncmp(name, "arg", 3)) { name = Copy(name); Insert(name, 0, "s_"); } if(processing_variable) { name = Copy(name); Insert(name, 0, "s_"); } if(!Strcmp(name, fname)) { name = Copy(name); Insert(name, 0, "s_"); } Printf(sargs, "%s, ", name); String *tm; if((tm = Getattr(p, "tmap:scoercein"))) { Replaceall(tm, "$input", name); replaceRClass(tm, Getattr(p, "type")); if(funcptr_name) { //XXX need to get this to return non-zero if(nargs == -1) nargs = getFunctionPointerNumArgs(p, tt); String *snargs = NewStringf("%d", nargs); Printv(sfun->code, "if(is.function(", name, ")) {", "\n", "assert('...' %in% names(formals(", name, ")) || length(formals(", name, ")) >= ", snargs, ");\n} ", NIL); Delete(snargs); Printv(sfun->code, "else {\n", "if(is.character(", name, ")) {\n", name, " = getNativeSymbolInfo(", name, ");", "\n};\n", "if(is(", name, ", \"NativeSymbolInfo\")) {\n", name, " = ", name, "$address", ";\n}\n", "if(is(", name, ", \"ExternalReference\")) {\n", name, " = ", name, "@ref;\n}\n", "}; \n", NIL); } else { Printf(sfun->code, "%s\n", tm); } } Printv(sfun->def, inFirstArg ? "" : ", ", name, NIL); if ((tm = Getattr(p,"tmap:scheck"))) { Replaceall(tm,"$target", lname); Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); replaceRClass(tm, Getattr(p, "type")); Printf(sfun->code,"%s\n",tm); } curP = p; if ((tm = Getattr(p,"tmap:in"))) { Replaceall(tm,"$target", lname); Replaceall(tm,"$source", name); Replaceall(tm,"$input", name); if (Getattr(p,"wrap:disown") || (Getattr(p,"tmap:in:disown"))) { Replaceall(tm,"$disown","SWIG_POINTER_DISOWN"); } else { Replaceall(tm,"$disown","0"); } if(funcptr_name) { /* have us a function pointer */ Printf(f->code, "if(TYPEOF(%s) != CLOSXP) {\n", name); Replaceall(tm,"$R_class", ""); } else { replaceRClass(tm, Getattr(p, "type")); } Printf(f->code,"%s\n",tm); if(funcptr_name) Printf(f->code, "} else {\n%s = %s;\nR_SWIG_pushCallbackFunctionData(%s, NULL);\n}\n", lname, funcptr_name, name); Printv(f->def, inFirstArg ? "" : ", ", "SEXP ", name, NIL); if (Len(name) != 0) inFirstArg = false; p = Getattr(p,"tmap:in:next"); } else { p = nextSibling(p); } tm = Swig_typemap_lookup("rtype", curP, "", 0); if(tm) { replaceRClass(tm, Getattr(curP, "type")); } Printf(s_inputTypes, "%s'%s'", inFirstType ? "" : ", ", tm); Printf(s_inputMap, "%s%s='%s'", inFirstType ? "" : ", ", name, tm); inFirstType = false; if(funcptr_name) Delete(funcptr_name); } /* end of looping over parameters. */ if(addCopyParam) { Printf(sfun->def, "%s.copy = FALSE", nargs > 0 ? ", " : ""); Printf(f->def, "%sSEXP s_swig_copy", nargs > 0 ? ", " : ""); Printf(sargs, "as.logical(.copy), "); } Printv(f->def, ")\n{\n", NIL); Printv(sfun->def, ")\n{\n", NIL); /* Insert cleanup code */ String *cleanup = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } String *outargs = NewString(""); int numOutArgs = isVoidReturnType ? -1 : 0; for(p = l, i = 0; p; i++) { if((tm = Getattr(p, "tmap:argout"))) { // String *lname = Getattr(p, "lname"); numOutArgs++; String *pos = NewStringf("%d", numOutArgs); Replaceall(tm,"$source", Getattr(p, "lname")); Replaceall(tm,"$result", "r_ans"); Replaceall(tm,"$n", pos); // The position into which to store the answer. Replaceall(tm,"$arg", Getattr(p, "emit:input")); Replaceall(tm,"$input", Getattr(p, "emit:input")); Replaceall(tm,"$owner", "R_SWIG_EXTERNAL"); Printf(outargs, "%s\n", tm); p = Getattr(p,"tmap:argout:next"); } else p = nextSibling(p); } String *actioncode = emit_action(n); /* Deal with the explicit return value. */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { SwigType *retType = Getattr(n, "type"); //Printf(stdout, "Return Value for %s, array? %s\n", retType, SwigType_isarray(retType) ? "yes" : "no"); /* if(SwigType_isarray(retType)) { defineArrayAccessors(retType); } */ Replaceall(tm,"$1", Swig_cresult_name()); Replaceall(tm,"$result", "r_ans"); replaceRClass(tm, retType); if (GetFlag(n,"feature:new")) { Replaceall(tm, "$owner", "R_SWIG_OWNER"); } else { Replaceall(tm,"$owner", "R_SWIG_EXTERNAL"); } #if 0 if(addCopyParam) { Printf(f->code, "if(LOGICAL(s_swig_copy)[0]) {\n"); Printf(f->code, "/* Deal with returning a reference. */\nr_ans = R_NilValue;\n"); Printf(f->code, "}\n else {\n"); } #endif Printf(f->code, "%s\n", tm); #if 0 if(addCopyParam) Printf(f->code, "}\n"); /* end of if(s_swig_copy) ... else { ... } */ #endif } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), fname); } if(Len(outargs)) { Wrapper_add_local(f, "R_OutputValues", "SEXP R_OutputValues"); String *tmp = NewString(""); if(!isVoidReturnType) Printf(tmp, "Rf_protect(r_ans);\n"); Printf(tmp, "Rf_protect(R_OutputValues = Rf_allocVector(VECSXP,%d));\nr_nprotect += %d;\n", numOutArgs + !isVoidReturnType, isVoidReturnType ? 1 : 2); if(!isVoidReturnType) Printf(tmp, "SET_VECTOR_ELT(R_OutputValues, 0, r_ans);\n"); Printf(tmp, "r_ans = R_OutputValues;\n"); Insert(outargs, 0, tmp); Delete(tmp); Printv(f->code, outargs, NIL); Delete(outargs); } /* Output cleanup code */ Printv(f->code, cleanup, NIL); Delete(cleanup); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } Printv(f->code, UnProtectWrapupCode, NIL); /*If the user gave us something to convert the result in */ if ((tm = Swig_typemap_lookup("scoerceout", n, Swig_cresult_name(), sfun))) { Replaceall(tm,"$source","ans"); Replaceall(tm,"$result","ans"); replaceRClass(tm, Getattr(n, "type")); Chop(tm); } Printv(sfun->code, ";", (Len(tm) ? "ans = " : ""), ".Call('", wname, "', ", sargs, "PACKAGE='", Rpackage, "');\n", NIL); if(Len(tm)) { Printf(sfun->code, "%s\n\n", tm); if (constructor) { String *finalizer = NewString(iname); Replace(finalizer, "new_", "", DOH_REPLACE_FIRST); Printf(sfun->code, "reg.finalizer(ans@ref, delete_%s)\n", finalizer); } Printf(sfun->code, "ans\n"); } if (destructor) Printv(f->code, "R_ClearExternalPtr(self);\n", NIL); Printv(f->code, "return r_ans;\n}\n", NIL); Printv(sfun->code, "\n}", NIL); /* Substitute the function name */ Replaceall(f->code,"$symname",iname); Wrapper_print(f, f_wrapper); Wrapper_print(sfun, sfile); Printf(sfun->code, "\n# End of %s\n", iname); tm = Swig_typemap_lookup("rtype", n, "", 0); if(tm) { SwigType *retType = Getattr(n, "type"); replaceRClass(tm, retType); } Printv(sfile, "attr(`", sfname, "`, 'returnType') = '", isVoidReturnType ? "void" : (tm ? tm : ""), "'\n", NIL); if(nargs > 0) Printv(sfile, "attr(`", sfname, "`, \"inputTypes\") = c(", s_inputTypes, ")\n", NIL); Printv(sfile, "class(`", sfname, "`) = c(\"SWIGFunction\", class('", sfname, "'))\n\n", NIL); if (memoryProfile) { Printv(sfile, "memory.profile()\n", NIL); } if (aggressiveGc) { Printv(sfile, "gc()\n", NIL); } // Printv(sfile, "setMethod('", name, "', '", name, "', ", iname, ")\n\n\n"); /* If we are dealing with a method in an C++ class, then add the name of the R function and its definition. XXX need to figure out how to store the Wrapper if possible in the hash/list. Would like to be able to do this so that we can potentially insert */ if(processing_member_access_function || processing_class_member_function) { addAccessor(member_name, sfun, iname); } if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } addRegistrationRoutine(wname, addCopyParam ? nargs +1 : nargs); DelWrapper(f); DelWrapper(sfun); Delete(sargs); Delete(sfname); return SWIG_OK; } /* ---------------------------------------------------------------------- * R::constantWrapper() * ---------------------------------------------------------------------- */ int R::constantWrapper(Node *n) { (void) n; // TODO return SWIG_OK; } /***************************************************** Add the specified routine name to the collection of generated routines that are called from R functions. This is used to register the routines with R for resolving symbols. rname - the name of the routine nargs - the number of arguments it expects. ******************************************************/ int R::addRegistrationRoutine(String *rname, int nargs) { if(!registrationTable) registrationTable = NewHash(); String *el = NewStringf("{\"%s\", (DL_FUNC) &%s, %d}", rname, rname, nargs); Setattr(registrationTable, rname, el); return SWIG_OK; } /***************************************************** Write the registration information to an array and create the initialization routine for registering these. ******************************************************/ int R::outputRegistrationRoutines(File *out) { int i, n; if(!registrationTable) return(0); if(inCPlusMode) Printf(out, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n"); Printf(out, "#include \n\n"); if(inCPlusMode) Printf(out, "#ifdef __cplusplus\n}\n#endif\n\n"); Printf(out, "SWIGINTERN R_CallMethodDef CallEntries[] = {\n"); List *keys = Keys(registrationTable); n = Len(keys); for(i = 0; i < n; i++) Printf(out, " %s,\n", Getattr(registrationTable, Getitem(keys, i))); Printf(out, " {NULL, NULL, 0}\n};\n\n"); if(!noInitializationCode) { if (inCPlusMode) Printv(out, "extern \"C\" ", NIL); Printf(out, "SWIGEXPORT void R_init_%s(DllInfo *dll) {\n", Rpackage); Printf(out, "%sR_registerRoutines(dll, NULL, CallEntries, NULL, NULL);\n", tab4); if(Len(s_init_routine)) { Printf(out, "\n%s\n", s_init_routine); } Printf(out, "}\n"); } return n; } /**************************************************************************** Process a struct, union or class declaration in the source code, or an anonymous typedef struct *****************************************************************************/ //XXX What do we need to do here - // Define an S4 class to refer to this. void R::registerClass(Node *n) { String *name = Getattr(n, "name"); String *kind = Getattr(n, "kind"); if (debugMode) Swig_print_node(n); String *sname = NewStringf("_p%s", SwigType_manglestr(name)); if(!Getattr(SClassDefs, sname)) { Setattr(SClassDefs, sname, sname); String *base; if(Strcmp(kind, "class") == 0) { base = NewString(""); List *l = Getattr(n, "bases"); if(Len(l)) { Printf(base, "c("); for(int i = 0; i < Len(l); i++) { registerClass(Getitem(l, i)); Printf(base, "'_p%s'%s", SwigType_manglestr(Getattr(Getitem(l, i), "name")), i < Len(l)-1 ? ", " : ""); } Printf(base, ")"); } else { base = NewString("'C++Reference'"); } } else base = NewString("'ExternalReference'"); Printf(s_classes, "setClass('%s', contains = %s)\n", sname, base); Delete(base); } } int R::classDeclaration(Node *n) { String *name = Getattr(n, "name"); String *kind = Getattr(n, "kind"); if (debugMode) Swig_print_node(n); registerClass(n); /* If we have a typedef union { ... } U, then we never get to see the typedef via a regular call to typedefHandler. Instead, */ if(Getattr(n, "unnamed") && Getattr(n, "storage") && Strcmp(Getattr(n, "storage"), "typedef") == 0 && Getattr(n, "tdname") && Strcmp(Getattr(n, "tdname"), name) == 0) { if (debugMode) Printf(stdout, "Typedef in the class declaration for %s\n", name); // typedefHandler(n); } bool opaque = GetFlag(n, "feature:opaque") ? true : false; if(opaque) opaqueClassDeclaration = name; int status = Language::classDeclaration(n); opaqueClassDeclaration = NULL; // OutputArrayMethod(name, class_member_functions, sfile); if (class_member_functions) OutputMemberReferenceMethod(name, 0, class_member_functions, sfile); if (class_member_set_functions) OutputMemberReferenceMethod(name, 1, class_member_set_functions, sfile); if(class_member_functions) { Delete(class_member_functions); class_member_functions = NULL; } if(class_member_set_functions) { Delete(class_member_set_functions); class_member_set_functions = NULL; } if (Getattr(n, "has_destructor")) { Printf(sfile, "setMethod('delete', '_p%s', function(obj) {delete%s(obj)})\n", getRClassName(Getattr(n, "name")), getRClassName(Getattr(n, "name"))); } if(!opaque && !Strcmp(kind, "struct") && copyStruct) { String *def = NewStringf("setClass(\"%s\",\n%srepresentation(\n", name, tab4); bool firstItem = true; for(Node *c = firstChild(n); c; ) { String *elName; String *tp; elName = Getattr(c, "name"); String *elKind = Getattr(c, "kind"); if (!Equal(elKind, "variable")) { c = nextSibling(c); continue; } if (!Len(elName)) { c = nextSibling(c); continue; } #if 0 tp = getRType(c); #else tp = Swig_typemap_lookup("rtype", c, "", 0); if(!tp) { c = nextSibling(c); continue; } if (Strstr(tp, "R_class")) { c = nextSibling(c); continue; } if (Strcmp(tp, "character") && Strstr(Getattr(c, "decl"), "p.")) { c = nextSibling(c); continue; } if (!firstItem) { Printf(def, ",\n"); } // else //XXX How can we tell if this is already done. // SwigType_push(elType, elDecl); // returns "" tp = processType(elType, c, NULL); // Printf(stdout, " elType %p\n", elType); // tp = getRClassNameCopyStruct(Getattr(c, "type"), 1); #endif String *elNameT = replaceInitialDash(elName); Printf(def, "%s%s = \"%s\"", tab8, elNameT, tp); firstItem = false; Delete(tp); Delete(elNameT); c = nextSibling(c); } Printf(def, "),\n%scontains = \"RSWIGStruct\")\n", tab8); Printf(s_classes, "%s\n\n# End class %s\n\n", def, name); generateCopyRoutines(n); Delete(def); } return status; } /*************************************************************** Create the C routines that copy an S object of the class given by the given struct definition in Node *n to the C value and also the routine that goes from the C routine to an object of this S class. ****************************************************************/ /*XXX Clean up the toCRef - make certain the names are correct for the types, etc. in all cases. */ int R::generateCopyRoutines(Node *n) { Wrapper *copyToR = NewWrapper(); Wrapper *copyToC = NewWrapper(); String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *kind = Getattr(n, "kind"); String *type; if(Len(tdname)) { type = Copy(tdname); } else { type = NewStringf("%s %s", kind, name); } String *mangledName = SwigType_manglestr(name); if (debugMode) Printf(stdout, "generateCopyRoutines: name = %s, %s\n", name, type); Printf(copyToR->def, "CopyToR%s = function(value, obj = new(\"%s\"))\n{\n", mangledName, name); Printf(copyToC->def, "CopyToC%s = function(value, obj)\n{\n", mangledName); Node *c = firstChild(n); for(; c; c = nextSibling(c)) { String *elName = Getattr(c, "name"); if (!Len(elName)) { continue; } String *elKind = Getattr(c, "kind"); if (!Equal(elKind, "variable")) { continue; } String *tp = Swig_typemap_lookup("rtype", c, "", 0); if(!tp) { continue; } if (Strstr(tp, "R_class")) { continue; } if (Strcmp(tp, "character") && Strstr(Getattr(c, "decl"), "p.")) { continue; } /* The S functions to get and set the member value. */ String *elNameT = replaceInitialDash(elName); Printf(copyToR->code, "obj@%s = value$%s;\n", elNameT, elNameT); Printf(copyToC->code, "obj$%s = value@%s;\n", elNameT, elNameT); Delete(elNameT); } Printf(copyToR->code, "obj;\n}\n\n"); String *rclassName = getRClassNameCopyStruct(type, 0); // without the Ref. Printf(sfile, "# Start definition of copy functions & methods for %s\n", rclassName); Wrapper_print(copyToR, sfile); Printf(copyToC->code, "obj\n}\n\n"); Wrapper_print(copyToC, sfile); Printf(sfile, "# Start definition of copy methods for %s\n", rclassName); Printf(sfile, "setMethod('copyToR', '_p_%s', CopyToR%s);\n", rclassName, mangledName); Printf(sfile, "setMethod('copyToC', '%s', CopyToC%s);\n\n", rclassName, mangledName); Printf(sfile, "# End definition of copy methods for %s\n", rclassName); Printf(sfile, "# End definition of copy functions & methods for %s\n", rclassName); String *m = NewStringf("%sCopyToR", name); addNamespaceMethod(m); char *tt = Char(m); tt[Len(m)-1] = 'C'; addNamespaceMethod(m); Delete(m); Delete(rclassName); Delete(mangledName); DelWrapper(copyToR); DelWrapper(copyToC); return SWIG_OK; } /***** Called when there is a typedef to be invoked. XXX Needs to be enhanced or split to handle the case where we have a typedef within a classDeclaration emission because the struct/union/etc. is anonymous. ******/ int R::typedefHandler(Node *n) { SwigType *tp = Getattr(n, "type"); String *type = Getattr(n, "type"); if (debugMode) Printf(stdout, " %s\n", Getattr(n, "name")); processType(tp, n); if(Strncmp(type, "struct ", 7) == 0) { String *name = Getattr(n, "name"); char *trueName = Char(type); trueName += 7; if (debugMode) Printf(stdout, " Defining S class %s\n", trueName); Printf(s_classes, "setClass('_p%s', contains = 'ExternalReference')\n", SwigType_manglestr(name)); } return Language::typedefHandler(n); } /********************* Called when processing a field in a "class", i.e. struct, union or actual class. We set a state variable so that we can correctly interpret the resulting functionWrapper() call and understand that it is for a field element. **********************/ int R::membervariableHandler(Node *n) { SwigType *t = Getattr(n, "type"); processType(t, n, NULL); processing_member_access_function = 1; member_name = Getattr(n,"sym:name"); if (debugMode) Printf(stdout, " name = %s, sym:name = %s\n", Getattr(n, "name"), member_name); int status(Language::membervariableHandler(n)); if(!opaqueClassDeclaration && debugMode) Printf(stdout, " %s %s\n", Getattr(n, "name"), Getattr(n, "type")); processing_member_access_function = 0; member_name = NULL; return status; } /* This doesn't seem to get used so leave it out for the moment. */ String * R::runtimeCode() { String *s = Swig_include_sys("rrun.swg"); if (!s) { Printf(stdout, "*** Unable to open 'rrun.swg'\n"); s = NewString(""); } return s; } /** Called when SWIG wants to initialize this We initialize anythin we want here. Most importantly, tell SWIG where to find the files (e.g. r.swg) for this module. Use Swig_mark_arg() to tell SWIG that it is understood and not to throw an error. **/ void R::main(int argc, char *argv[]) { bool cppcast = true; init(); Preprocessor_define("SWIGR 1", 0); SWIG_library_directory("r"); SWIG_config_file("r.swg"); debugMode = false; copyStruct = true; memoryProfile = false; aggressiveGc = false; inCPlusMode = false; outputNamespaceInfo = false; noInitializationCode = false; this->Argc = argc; this->Argv = argv; allow_overloading();// can we support this? for(int i = 0; i < argc; i++) { if(strcmp(argv[i], "-package") == 0) { Swig_mark_arg(i); i++; Swig_mark_arg(i); Rpackage = argv[i]; } else if(strcmp(argv[i], "-dll") == 0) { Swig_mark_arg(i); i++; Swig_mark_arg(i); DllName = argv[i]; } else if(strcmp(argv[i], "-help") == 0) { showUsage(); } else if(strcmp(argv[i], "-namespace") == 0) { outputNamespaceInfo = true; Swig_mark_arg(i); } else if(!strcmp(argv[i], "-no-init-code")) { noInitializationCode = true; Swig_mark_arg(i); } else if(!strcmp(argv[i], "-c++")) { inCPlusMode = true; Swig_mark_arg(i); Printf(s_classes, "setClass('C++Reference', contains = 'ExternalReference')\n"); } else if(!strcmp(argv[i], "-debug")) { debugMode = true; Swig_mark_arg(i); } else if (!strcmp(argv[i],"-cppcast")) { cppcast = true; Swig_mark_arg(i); } else if (!strcmp(argv[i],"-nocppcast")) { cppcast = false; Swig_mark_arg(i); } else if (!strcmp(argv[i],"-copystruct")) { copyStruct = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocopystruct")) { copyStruct = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-memoryprof")) { memoryProfile = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nomemoryprof")) { memoryProfile = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-aggressivegc")) { aggressiveGc = true; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-noaggressivegc")) { aggressiveGc = false; Swig_mark_arg(i); } if (cppcast) { Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0); } if (debugMode) { Swig_typemap_search_debug_set(); Swig_typemap_used_debug_set(); Swig_typemap_register_debug_set(); Swig_file_debug_set(); } /// copyToR copyToC functions. } } /* Could make this work for String or File and then just store the resulting string rather than the collection of arguments and argc. */ int R::outputCommandLineArguments(File *out) { if(Argc < 1 || !Argv || !Argv[0]) return(-1); Printf(out, "\n## Generated via the command line invocation:\n##\t"); for(int i = 0; i < Argc ; i++) { Printf(out, " %s", Argv[i]); } Printf(out, "\n\n\n"); return Argc; } /* How SWIG instantiates an object from this module. See swigmain.cxx */ extern "C" Language *swig_r(void) { return new R(); } /*************************************************************************************/ /* Needs to be reworked. */ String * R::processType(SwigType *t, Node *n, int *nargs) { //XXX Need to handle typedefs, e.g. // a type which is a typedef to a function pointer. SwigType *tmp = Getattr(n, "tdname"); if (debugMode) Printf(stdout, "processType %s (tdname = %s)\n", Getattr(n, "name"), tmp); SwigType *td = t; if (expandTypedef(t) && SwigType_istypedef(t)) { SwigType *resolved = SwigType_typedef_resolve_all(t); if (expandTypedef(resolved)) { td = Copy(resolved); } } if(!td) { int count = 0; String *b = getRTypeName(t, &count); if(count && b && !Getattr(SClassDefs, b)) { if (debugMode) Printf(stdout, " Defining class %s\n", b); Printf(s_classes, "setClass('%s', contains = 'ExternalReference')\n", b); Setattr(SClassDefs, b, b); } } if(td) t = td; if(SwigType_isfunctionpointer(t)) { if (debugMode) Printf(stdout, " Defining pointer handler %s\n", t); String *tmp = createFunctionPointerHandler(t, n, nargs); return tmp; } #if 0 SwigType_isfunction(t) && SwigType_ispointer(t) #endif return NULL; } /*************************************************************************************/ swig-3.0.12/Source/Modules/csharp.cxx0000664000175000017500000052005113042756442017314 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * csharp.cxx * * C# language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // for INT_MAX #include "cparse.h" #include /* Hash type used for upcalls from C/C++ */ typedef DOH UpcallData; class CSHARP:public Language { static const char *usage; const String *empty_string; const String *public_string; const String *protected_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_runtime_h; File *f_header; File *f_wrappers; File *f_init; File *f_directors; File *f_directors_h; File *f_single_out; List *filenames_list; bool proxy_flag; // Flag for generating proxy classes bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool generate_property_declaration_flag; // Flag for generating properties String *imclass_name; // intermediary class name String *module_class_name; // module class name String *imclass_class_code; // intermediary class code String *proxy_class_def; String *proxy_class_code; String *interface_class_code; // if %feature("interface") was declared for a class, here goes the interface declaration String *module_class_code; String *proxy_class_name; // proxy class name String *full_imclass_name; // fully qualified intermediary class name when using nspace feature, otherwise same as imclass_name String *variable_name; //Name of a variable being wrapped String *proxy_class_constants_code; String *module_class_constants_code; String *enum_code; String *dllimport; // DllImport attribute name String *namespce; // Optional namespace name String *imclass_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *imclass_baseclass; //inheritance for intermediary class class from %pragma String *module_baseclass; //inheritance for module class from %pragma String *imclass_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *imclass_class_modifiers; //class modifiers for intermediary class overriden by %pragma String *module_class_modifiers; //class modifiers for module class overriden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *imclass_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *director_callback_typedefs; // Director function pointer typedefs for callbacks String *director_callbacks; // Director callback function pointer member variables String *director_delegate_callback; // Director callback method that delegates are set to call String *director_delegate_definitions; // Director delegates definitions in proxy class String *director_delegate_instances; // Director delegates member variables in proxy class String *director_method_types; // Director method types String *director_connect_parms; // Director delegates parameter list for director connect call String *destructor_call; //C++ destructor call if any String *output_file; // File name for single file mode. If set all generated code will be written to this file // Director method stuff: List *dmethods_seq; Hash *dmethods_table; int n_dmethods; int n_directors; int first_class_dmethod; int curr_class_dmethod; int nesting_depth; enum EnumFeature { SimpleEnum, TypeunsafeEnum, TypesafeEnum, ProperEnum }; public: /* ----------------------------------------------------------------------------- * CSHARP() * ----------------------------------------------------------------------------- */ CSHARP():empty_string(NewString("")), public_string(NewString("public")), protected_string(NewString("protected")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_runtime_h(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), f_directors(NULL), f_directors_h(NULL), f_single_out(NULL), filenames_list(NULL), proxy_flag(true), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), generate_property_declaration_flag(false), imclass_name(NULL), module_class_name(NULL), imclass_class_code(NULL), proxy_class_def(NULL), proxy_class_code(NULL), interface_class_code(NULL), module_class_code(NULL), proxy_class_name(NULL), full_imclass_name(NULL), variable_name(NULL), proxy_class_constants_code(NULL), module_class_constants_code(NULL), enum_code(NULL), dllimport(NULL), namespce(NULL), imclass_imports(NULL), module_imports(NULL), imclass_baseclass(NULL), module_baseclass(NULL), imclass_interfaces(NULL), module_interfaces(NULL), imclass_class_modifiers(NULL), module_class_modifiers(NULL), upcasts_code(NULL), imclass_cppcasts_code(NULL), director_callback_typedefs(NULL), director_callbacks(NULL), director_delegate_callback(NULL), director_delegate_definitions(NULL), director_delegate_instances(NULL), director_method_types(NULL), director_connect_parms(NULL), destructor_call(NULL), output_file(NULL), dmethods_seq(NULL), dmethods_table(NULL), n_dmethods(0), n_directors(0), first_class_dmethod(0), curr_class_dmethod(0), nesting_depth(0){ /* for now, multiple inheritance in directors is disabled, this should be easy to implement though */ director_multiple_inheritance = 0; director_language = 1; } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class. * Return NULL if not otherwise the proxy class name, fully qualified with * a namespace if the nspace feature is used. * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t) { String *proxyname = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n) { proxyname = Getattr(n, "proxyname"); if (!proxyname) { String *nspace = Getattr(n, "sym:nspace"); String *symname = Copy(Getattr(n, "sym:name")); if (symname && !GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { if (String* name = Getattr(outer_class, "sym:name")) { Push(symname, "."); Push(symname, name); } else return NULL; } } if (nspace) { if (namespce) proxyname = NewStringf("%s.%s.%s", namespce, nspace, symname); else proxyname = NewStringf("%s.%s", nspace, symname); } else { proxyname = Copy(symname); } Setattr(n, "proxyname", proxyname); Delete(proxyname); Delete(symname); } } } return proxyname; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("csharp"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-dllimport") == 0) { if (argv[i + 1]) { dllimport = NewString(""); Printf(dllimport, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-namespace") == 0) { if (argv[i + 1]) { namespce = NewString(""); Printf(namespce, argv[i + 1]); if (Len(namespce) == 0) { Delete(namespce); namespce = 0; } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-noproxy") == 0)) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-outfile") == 0) { if (argv[i + 1]) { output_file = NewString(""); Printf(output_file, argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGCSHARP 1", 0); // Add typemap definitions SWIG_typemap_lang("csharp"); SWIG_config_file("csharp.swg"); allow_overloading(); Swig_interface_feature_enable(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { // Get any options set in the module directive Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "imclassname")) imclass_name = Copy(Getattr(optionsnode, "imclassname")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!outfile_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); swig_types_hash = NewHash(); filenames_list = NewList(); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. if (!imclass_name) { imclass_name = NewStringf("%sPINVOKE", Getattr(n, "name")); module_class_name = Copy(Getattr(n, "name")); } else { // Rename the module name if it is the same as intermediary class name - a backwards compatibility solution if (Cmp(imclass_name, Getattr(n, "name")) == 0) module_class_name = NewStringf("%sModule", Getattr(n, "name")); else module_class_name = Copy(Getattr(n, "name")); } // module class and intermediary classes are always created if (!addSymbol(imclass_name, n)) return SWIG_ERROR; if (!addSymbol(module_class_name, n)) return SWIG_ERROR; imclass_class_code = NewString(""); proxy_class_def = NewString(""); proxy_class_code = NewString(""); module_class_constants_code = NewString(""); imclass_baseclass = NewString(""); imclass_interfaces = NewString(""); imclass_class_modifiers = NewString(""); module_class_code = NewString(""); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); module_class_modifiers = NewString(""); imclass_imports = NewString(""); imclass_cppcasts_code = NewString(""); director_connect_parms = NewString(""); upcasts_code = NewString(""); dmethods_seq = NewList(); dmethods_table = NewHash(); n_dmethods = 0; n_directors = 0; if (!dllimport) dllimport = Copy(module_class_name); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCSHARP\n#define SWIGCSHARP\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); /* Emit initial director header and director code: */ Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module_class_name); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module_class_name); Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } Printf(f_runtime, "\n"); if (namespce) { String *wrapper_name = NewStringf(""); Printf(wrapper_name, "CSharp_%s_%%f", namespce); Swig_name_register("wrapper", wrapper_name); Delete(wrapper_name); } else { Swig_name_register("wrapper", "CSharp_%f"); } if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); /* Emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } // Generate the intermediary class { File *f_im = getOutputFile(SWIG_output_directory(), imclass_name); addOpenNamespace(0, f_im); if (imclass_imports) Printf(f_im, "%s\n", imclass_imports); if (Len(imclass_class_modifiers) > 0) Printf(f_im, "%s ", imclass_class_modifiers); Printf(f_im, "%s ", imclass_name); if (imclass_baseclass && *Char(imclass_baseclass)) Printf(f_im, ": %s ", imclass_baseclass); if (Len(imclass_interfaces) > 0) Printv(f_im, "implements ", imclass_interfaces, " ", NIL); Printf(f_im, "{\n"); // Add the intermediary class methods Replaceall(imclass_class_code, "$module", module_class_name); Replaceall(imclass_class_code, "$imclassname", imclass_name); Replaceall(imclass_class_code, "$dllimport", dllimport); Printv(f_im, imclass_class_code, NIL); Printv(f_im, imclass_cppcasts_code, NIL); // Finish off the class Printf(f_im, "}\n"); addCloseNamespace(0, f_im); if (f_im != f_single_out) Delete(f_im); f_im = NULL; } // Generate the C# module class { File *f_module = getOutputFile(SWIG_output_directory(), module_class_name); addOpenNamespace(0, f_module); if (module_imports) Printf(f_module, "%s\n", module_imports); if (Len(module_class_modifiers) > 0) Printf(f_module, "%s ", module_class_modifiers); Printf(f_module, "%s ", module_class_name); if (module_baseclass && *Char(module_baseclass)) Printf(f_module, ": %s ", module_baseclass); if (Len(module_interfaces) > 0) Printv(f_module, "implements ", module_interfaces, " ", NIL); Printf(f_module, "{\n"); Replaceall(module_class_code, "$module", module_class_name); Replaceall(module_class_constants_code, "$module", module_class_name); Replaceall(module_class_code, "$imclassname", imclass_name); Replaceall(module_class_constants_code, "$imclassname", imclass_name); Replaceall(module_class_code, "$dllimport", dllimport); Replaceall(module_class_constants_code, "$dllimport", dllimport); // Add the wrapper methods Printv(f_module, module_class_code, NIL); // Write out all the global constants Printv(f_module, module_class_constants_code, NIL); // Finish off the class Printf(f_module, "}\n"); addCloseNamespace(0, f_module); if (f_module != f_single_out) Delete(f_module); f_module = NULL; } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a C# type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.key; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } // Check for overwriting file problems on filesystems that are case insensitive Iterator it1; Iterator it2; for (it1 = First(filenames_list); it1.item; it1 = Next(it1)) { String *item1_lower = Swig_string_lower(it1.item); for (it2 = Next(it1); it2.item; it2 = Next(it2)) { String *item2_lower = Swig_string_lower(it2.item); if (it1.item && it2.item) { if (Strcmp(item1_lower, item2_lower) == 0) { Swig_warning(WARN_LANG_PORTABILITY_FILENAME, input_file, line_number, "Portability warning: File %s will be overwritten by %s on case insensitive filesystems such as " "Windows' FAT32 and NTFS unless the class/module name is renamed\n", it1.item, it2.item); } } Delete(item2_lower); } Delete(item1_lower); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(filenames_list); filenames_list = NULL; Delete(imclass_name); imclass_name = NULL; Delete(imclass_class_code); imclass_class_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(module_class_constants_code); module_class_constants_code = NULL; Delete(imclass_baseclass); imclass_baseclass = NULL; Delete(imclass_interfaces); imclass_interfaces = NULL; Delete(imclass_class_modifiers); imclass_class_modifiers = NULL; Delete(module_class_name); module_class_name = NULL; Delete(module_class_code); module_class_code = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(module_class_modifiers); module_class_modifiers = NULL; Delete(imclass_imports); imclass_imports = NULL; Delete(imclass_cppcasts_code); imclass_cppcasts_code = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(dmethods_seq); dmethods_seq = NULL; Delete(dmethods_table); dmethods_table = NULL; Delete(namespce); namespce = NULL; n_dmethods = 0; /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors, f_begin); Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); f_runtime_h = NULL; Delete(f_directors); f_directors = NULL; Delete(f_directors_h); f_directors_h = NULL; } if (f_single_out) { Dump(f_single_out, f_begin); Delete(f_single_out); f_single_out = NULL; } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "//------------------------------------------------------------------------------\n"); Printf(f, "// \n"); Printf(f, "//\n"); Swig_banner_target_lang(f, "//"); Printf(f, "//------------------------------------------------------------------------------\n\n"); } /* ----------------------------------------------------------------------------- * getOutputFile() * * Prepares a File object by creating the file in the file system and * writing the banner for auto-generated files to it (emitBanner). * If '-outfile' is provided (single file mode) the supplied parameters will * be ignored and the returned file will always be: * / * Otherwise the file will be: * /.cs * ----------------------------------------------------------------------------- */ File *getOutputFile(const String *dir, const String *name) { if (output_file) { if (!f_single_out) { String *filen = NewStringf("%s%s", SWIG_output_directory(), output_file); f_single_out = NewFile(filen, "w", SWIG_output_files()); if (!f_single_out) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(f_single_out); } return f_single_out; } else { String *filen = NewStringf("%s%s.cs", dir, name); File *f = NewFile(filen, "w", SWIG_output_files()); if (!f) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Append(filenames_list, Copy(filen)); Delete(filen); filen = NULL; emitBanner(f); return f; } } /*----------------------------------------------------------------------- * Add new director upcall signature *----------------------------------------------------------------------*/ UpcallData *addUpcallMethod(String *imclass_method, String *class_method, String *decl, String *overloaded_name) { String *key = NewStringf("%s|%s", imclass_method, decl); ++curr_class_dmethod; String *class_methodidx = NewStringf("%d", n_dmethods - first_class_dmethod); n_dmethods++; Hash *new_udata = NewHash(); Append(dmethods_seq, new_udata); Setattr(dmethods_table, key, new_udata); Setattr(new_udata, "method", Copy(class_method)); Setattr(new_udata, "class_methodidx", class_methodidx); Setattr(new_udata, "decl", Copy(decl)); Setattr(new_udata, "overname", Copy(overloaded_name)); Delete(key); return new_udata; } /*----------------------------------------------------------------------- * Get director upcall signature *----------------------------------------------------------------------*/ /* UpcallData * getUpcallMethodData(String *director_class, String *decl) { String *key = NewStringf("%s|%s", director_class, decl); UpcallData *udata = Getattr(dmethods_table, key); Delete(key); return udata; } */ /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n, imclass_name)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *c_return_type = NewString(""); String *im_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); String *im_outattributes = 0; int num_arguments = 0; bool is_void_return; String *overloaded_name = getOverloadedName(n); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(symname, n, imclass_name)) return SWIG_ERROR; } /* The rest of this function deals with generating the intermediary class wrapper function (that wraps a c/c++ function) and generating the PInvoke c code. Each C# wrapper function has a matching PInvoke c function call. */ // A new wrapper function object Wrapper *f = NewWrapper(); // Make a wrapper name for this function String *wname = Swig_name_wrapper(overloaded_name); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); Swig_typemap_attach_parms("imtype", l, f); /* Get return types */ if ((tm = Swig_typemap_lookup("ctype", n, "", 0))) { String *ctypeout = Getattr(n, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap if (ctypeout) tm = ctypeout; Printf(c_return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); } if ((tm = Swig_typemap_lookup("imtype", n, "", 0))) { String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; Printf(im_return_type, "%s", tm); im_outattributes = Getattr(n, "tmap:imtype:outattributes"); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL); Printv(f->def, " SWIGEXPORT ", c_return_type, " SWIGSTDCALL ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); // Parameter overloading Setattr(n, "wrap:parms", l); Setattr(n, "wrap:name", wname); // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "sym:overloaded")) { // Emit warnings for the few cases that can't be overloaded in C# and give up on generating wrapper Swig_overload_check(n); if (Getattr(n, "overload:ignore")) { DelWrapper(f); return SWIG_OK; } } Printv(imclass_class_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); if (im_outattributes) Printf(imclass_class_code, " %s\n", im_outattributes); Printf(imclass_class_code, " public static extern %s %s(", im_return_type, overloaded_name); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); int gencomma = 0; // Now walk the function parameter list and generate code to get arguments for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *im_param_type = NewString(""); String *c_param_type = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* Get the ctype types of the parameter */ if ((tm = Getattr(p, "tmap:ctype"))) { Printv(c_param_type, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Get the intermediary class parameter types of the parameter */ if ((tm = Getattr(p, "tmap:imtype"))) { const String *inattributes = Getattr(p, "tmap:imtype:inattributes"); Printf(im_param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to intermediary class method */ if (gencomma) Printf(imclass_class_code, ", "); Printf(imclass_class_code, "%s %s", im_param_type, arg); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); gencomma = 1; // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { canThrow(n, "in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } Delete(im_param_type); Delete(c_param_type); Delete(arg); } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { canThrow(n, "check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { canThrow(n, "freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { canThrow(n, "argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Look for usage of throws typemap and the canthrow flag ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { canThrow(n, "throws", p); } } } String *null_attribute = 0; // Now write code to make the function call if (!native_function_flag) { Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { canThrow(n, "out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "jresult"); /* deprecated */ Replaceall(tm, "$result", "jresult"); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printf(f->code, "%s", tm); null_attribute = Getattr(n, "tmap:out:null"); if (Len(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), Getattr(n, "name")); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { canThrow(n, "newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { canThrow(n, "ret", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C function and intermediary class function definitions */ Printf(imclass_class_code, ")"); Printf(imclass_class_code, ";\n"); Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); /* Contract macro modification */ if (Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, ") > 0) { Setattr(n, "csharp:canthrow", "1"); } if (!null_attribute) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", null_attribute); /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); // Handle %csexception which sets the canthrow attribute if (Getattr(n, "feature:except:canthrow")) Setattr(n, "csharp:canthrow", "1"); // A very simple check (it is not foolproof) to help typemap/feature writers for // throwing C# exceptions from unmanaged code. It checks for the common methods which // set a pending C# exception... the 'canthrow' typemap/feature attribute must be set // so that code which checks for pending exceptions is added in the C# proxy method. if (!Getattr(n, "csharp:canthrow")) { if (Strstr(f->code, "SWIG_exception")) { Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number, "Unmanaged code contains a call to SWIG_exception and C# code does not handle pending exceptions via the canthrow attribute.\n"); } else if (Strstr(f->code, "SWIG_CSharpSetPendingException")) { Swig_warning(WARN_CSHARP_CANTHROW, input_file, line_number, "Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute.\n"); } } } if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { moduleClassFunctionHandler(n); } /* * Generate the proxy class properties for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the variable in the getter/setter function name bool getter_flag = Cmp(symname, Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) != 0; String *getter_setter_name = NewString(""); if (!getter_flag) Printf(getter_setter_name, "set"); else Printf(getter_setter_name, "get"); Putc(toupper((int) *Char(variable_name)), getter_setter_name); Printf(getter_setter_name, "%s", Char(variable_name) + 1); Setattr(n, "proxyfuncname", getter_setter_name); Setattr(n, "imfuncname", symname); proxyClassFunctionHandler(n); Delete(getter_setter_name); } Delete(c_return_type); Delete(im_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(overloaded_name); DelWrapper(f); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { Language::variableWrapper(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ------------------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; generate_property_declaration_flag = false; if (proxy_flag) { Printf(module_class_code, "\n }\n\n"); } return ret; } String *getCurrentScopeName(String *nspace) { String *scope = 0; if (nspace || getCurrentClass()) { scope = NewString(""); if (nspace) Printf(scope, "%s", nspace); if (Node *cls = getCurrentClass()) { if (Node *outer = Getattr(cls, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } Printv(scope, nspace ? "." : "", outerClassesPrefix, ".", proxy_class_name, NIL); Delete(outerClassesPrefix); } else Printv(scope, nspace ? "." : "", proxy_class_name, NIL); } } return scope; } /* ---------------------------------------------------------------------- * enumDeclaration() * * C/C++ enums can be mapped in one of 4 ways, depending on the cs:enum feature specified: * 1) Simple enums - simple constant within the proxy class or module class * 2) Typeunsafe enums - simple constant in a C# class (class named after the c++ enum name) * 3) Typesafe enum - typesafe enum pattern (class named after the c++ enum name) * 4) Proper enums - proper C# enum * Anonymous enums always default to 1) * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (!ImportMode) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *nspace = Getattr(n, "sym:nspace"); // NSpace/getNSpace() only works during Language::enumDeclaration call if (proxy_flag && !is_wrapping_class()) { // Global enums / enums in a namespace assert(!full_imclass_name); if (!nspace) { full_imclass_name = NewStringf("%s", imclass_name); } else { if (namespce) { full_imclass_name = NewStringf("%s.%s", namespce, imclass_name); } else { full_imclass_name = NewStringf("%s", imclass_name); } } } enum_code = NewString(""); String *symname = Getattr(n, "sym:name"); String *constants_code = (proxy_flag && is_wrapping_class())? proxy_class_constants_code : module_class_constants_code; EnumFeature enum_feature = decodeEnumFeature(n); String *typemap_lookup_type = Getattr(n, "name"); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum String *scope = getCurrentScopeName(nspace); if (!addSymbol(symname, n, scope)) return SWIG_ERROR; // Pure C# baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "csbase", typemap_lookup_type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "csinterfaces", typemap_lookup_type, WARN_NONE); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", typemap_lookup_type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(enum_code, "%s\n", csattributes); // Emit the enum Printv(enum_code, typemapLookup(n, "csclassmodifiers", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers (enum modifiers really) " ", symname, (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {\n", NIL); Delete(scope); } else { // Wrap C++ enum with integers - just indicate start of enum with a comment, no comment for anonymous enums of any sort if (symname && !Getattr(n, "unnamedinstance")) Printf(constants_code, " // %s \n", symname); } // Emit each enum item Language::enumDeclaration(n); if ((enum_feature != SimpleEnum) && symname && typemap_lookup_type) { // Wrap (non-anonymous) C/C++ enum within a typesafe, typeunsafe or proper C# enum // Finish the enum declaration // Typemaps are used to generate the enum definition in a similar manner to proxy classes. Printv(enum_code, (enum_feature == ProperEnum) ? "\n" : typemapLookup(n, "csbody", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "}", NIL); Replaceall(enum_code, "$csclassname", symname); // Substitute $enumvalues - intended usage is for typesafe enums if (Getattr(n, "enumvalues")) Replaceall(enum_code, "$enumvalues", Getattr(n, "enumvalues")); else Replaceall(enum_code, "$enumvalues", ""); if (proxy_flag && is_wrapping_class()) { // Enums defined within the C++ class are defined within the proxy class // Add extra indentation Replaceall(enum_code, "\n", "\n "); Replaceall(enum_code, " \n", "\n"); Printv(proxy_class_constants_code, " ", enum_code, "\n\n", NIL); } else { // Global enums are defined in their own file String *output_directory = outputDirectory(nspace); File *f_enum = getOutputFile(output_directory, symname); addOpenNamespace(nspace, f_enum); Printv(f_enum, typemapLookup(n, "csimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", enum_code, "\n", NIL); addCloseNamespace(nspace, f_enum); if (f_enum != f_single_out) Delete(f_enum); f_enum = NULL; Delete(output_directory); } } else { // Wrap C++ enum with simple constant Printf(enum_code, "\n"); if (proxy_flag && is_wrapping_class()) Printv(proxy_class_constants_code, enum_code, NIL); else Printv(module_class_constants_code, enum_code, NIL); } Delete(enum_code); enum_code = NULL; if (proxy_flag && !is_wrapping_class()) { Delete(full_imclass_name); full_imclass_name = 0; } } return SWIG_OK; } /* ---------------------------------------------------------------------- * enumvalueDeclaration() * ---------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "?value", NIL); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); Node *parent = parentNode(n); int unnamedinstance = GetFlag(parent, "unnamedinstance"); String *parent_name = Getattr(parent, "name"); String *nspace = getNSpace(); String *newsymname = 0; String *tmpValue; // Strange hack from parent method if (value) tmpValue = NewString(value); else tmpValue = NewString(name); // Note that this is used in enumValue() amongst other places Setattr(n, "value", tmpValue); // Deal with enum values that are not int int swigtype = SwigType_type(Getattr(n, "type")); if (swigtype == T_BOOL) { const char *val = Equal(Getattr(n, "enumvalue"), "true") ? "1" : "0"; Setattr(n, "enumvalue", val); } else if (swigtype == T_CHAR) { String *val = NewStringf("'%(hexescape)s'", Getattr(n, "enumvalue")); Setattr(n, "enumvalue", val); Delete(val); } { EnumFeature enum_feature = decodeEnumFeature(parent); if ((enum_feature == SimpleEnum) && GetFlag(parent, "scopedenum")) { newsymname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); symname = newsymname; } // Add to language symbol table String *scope = 0; if (unnamedinstance || !parent_name || enum_feature == SimpleEnum) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", enumClassPrefix); } else { scope = Copy(module_class_name); } } else { scope = getCurrentScopeName(nspace); if (!scope) scope = Copy(Getattr(parent, "sym:name")); else Printf(scope, ".%s", Getattr(parent, "sym:name")); } if (!addSymbol(symname, n, scope)) return SWIG_ERROR; const String *csattributes = Getattr(n, "feature:cs:attributes"); if ((enum_feature == ProperEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) C/C++ enum with a proper C# enum // Emit the enum item. if (!GetFlag(n, "firstenumitem")) Printf(enum_code, ",\n"); if (csattributes) Printf(enum_code, " %s\n", csattributes); Printf(enum_code, " %s", symname); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); // Note that the enum value must be a true constant and cannot be set from a PINVOKE call, thus no support for %csconst(0) value = value ? value : Getattr(n, "enumvalue"); if (value) { Printf(enum_code, " = %s", value); } } else { // Wrap C/C++ enums with constant integers or use the typesafe enum pattern SwigType *typemap_lookup_type = parent_name ? parent_name : NewString("enum "); Setattr(n, "type", typemap_lookup_type); const String *tm = typemapLookup(n, "cstype", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF); String *return_type = Copy(tm); substituteClassname(typemap_lookup_type, return_type); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); if (csattributes) Printf(enum_code, " %s\n", csattributes); if ((enum_feature == TypesafeEnum) && parent_name && !unnamedinstance) { // Wrap (non-anonymous) enum using the typesafe enum pattern if (Getattr(n, "enumvalue")) { String *value = enumValue(n); Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\", %s);\n", methodmods, return_type, symname, return_type, symname, value); Delete(value); } else { Printf(enum_code, " %s static readonly %s %s = new %s(\"%s\");\n", methodmods, return_type, symname, return_type, symname); } } else { // Simple integer constants // Note these are always generated for anonymous enums, no matter what enum_feature is specified // Code generated is the same for SimpleEnum and TypeunsafeEnum -> the class it is generated into is determined later // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); const char *const_readonly = const_feature_flag ? "const" : "static readonly"; String *value = enumValue(n); Printf(enum_code, " %s %s %s %s = %s;\n", methodmods, const_readonly, return_type, symname, value); Delete(value); } Delete(return_type); } // Add the enum value to the comma separated list being constructed in the enum declaration. String *enumvalues = Getattr(parent, "enumvalues"); if (!enumvalues) Setattr(parent, "enumvalues", Copy(symname)); else Printv(enumvalues, ", ", symname, NIL); Delete(scope); } Delete(newsymname); Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * Used for wrapping constants - #define or %constant. * Also for inline initialised const static primitive type member variables (short, int, double, enums etc). * C# static const variables are generated for these. * If the %csconst(1) feature is used then the C constant value is used to initialise the C# const variable. * If not, a PINVOKE method is generated to get the C constant value for initialisation of the C# const variable. * However, if the %csconstvalue feature is used, it overrides all other ways to generate the initialisation. * Also note that this method might be called for wrapping enum items (when the enum is using %csconst(0)). * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *symname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); SwigType *valuetype = Getattr(n, "valuetype"); ParmList *l = Getattr(n, "parms"); String *tm; String *return_type = NewString(""); String *constants_code = NewString(""); Swig_save("constantWrapper", n, "value", NIL); Swig_save("constantWrapper", n, "tmap:ctype:out", "tmap:imtype:out", "tmap:cstype:out", "tmap:out:null", "tmap:imtype:outattributes", "tmap:cstype:outattributes", NIL); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); const String *itemname = (proxy_flag && wrapping_member_flag) ? variable_name : symname; if (!is_enum_item) { String *scope = 0; if (proxy_class_name) { String *nspace = getNSpace(); scope = NewString(""); if (nspace) Printf(scope, "%s.", nspace); Printf(scope, "%s", proxy_class_name); } else { scope = Copy(module_class_name); } if (!addSymbol(itemname, n, scope)) return SWIG_ERROR; Delete(scope); } // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); /* Adjust the enum type for the Swig_typemap_lookup. * We want the same jstype typemap for all the enum items so we use the enum type (parent node). */ if (is_enum_item) { t = Getattr(parentNode(n), "enumtype"); Setattr(n, "type", t); } /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("cstype", l, NULL); /* Get C# return types */ bool classname_substituted_flag = false; if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; classname_substituted_flag = substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } // Default (octal) escaping is no good - change to hex escaped value String *hexescaped_value = Getattr(n, "rawvalue") ? NewStringf("%(hexescape)s", Getattr(n, "rawvalue")) : 0; // Add the stripped quotes back in String *new_value = NewString(""); if (SwigType_type(t) == T_STRING) { Printf(new_value, "\"%s\"", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } else if (SwigType_type(t) == T_CHAR) { Printf(new_value, "\'%s\'", hexescaped_value ? hexescaped_value : Copy(Getattr(n, "value"))); Setattr(n, "value", new_value); } const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(constants_code, " %s\n", outattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(constants_code, " %s %s %s %s = ", methodmods, (const_feature_flag ? "const" : "static readonly"), return_type, itemname); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); if (value) { Printf(constants_code, "%s;\n", value); } else if (!const_feature_flag) { // Default enum and constant handling will work with any type of C constant and initialises the C# variable from C through a PINVOKE call. if (classname_substituted_flag) { if (SwigType_isenum(t)) { // This handles wrapping of inline initialised const enum static member variables (not when wrapping enum items - ignored later on) Printf(constants_code, "(%s)%s.%s();\n", return_type, full_imclass_name, Swig_name_get(getNSpace(), symname)); } else { // This handles function pointers using the %constant directive Printf(constants_code, "new %s(%s.%s(), false);\n", return_type, full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } } else { Printf(constants_code, "%s.%s();\n", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } // Each constant and enum value is wrapped with a separate PInvoke function call SetFlag(n, "feature:immutable"); enum_constant_flag = true; variableWrapper(n); enum_constant_flag = false; } else { // Alternative constant handling will use the C syntax to make a true C# constant and hope that it compiles as C# code if (Getattr(n, "wrappedasconstant")) { if (SwigType_type(t) == T_CHAR) { if (SwigType_type(valuetype) == T_CHAR) Printf(constants_code, "\'%(hexescape)s\';\n", Getattr(n, "staticmembervariableHandler:value")); else Printf(constants_code, "(char)%s;\n", Getattr(n, "staticmembervariableHandler:value")); } else { Printf(constants_code, "%s;\n", Getattr(n, "staticmembervariableHandler:value")); } } else { Printf(constants_code, "%s;\n", Getattr(n, "value")); } } // Emit the generated code to appropriate place // Enums only emit the intermediate and PINVOKE methods, so no proxy or module class wrapper methods needed if (!is_enum_item) { if (proxy_flag && wrapping_member_flag) Printv(proxy_class_constants_code, constants_code, NIL); else Printv(module_class_constants_code, constants_code, NIL); } // Cleanup Swig_restore(n); Delete(new_value); Delete(return_type); Delete(constants_code); return SWIG_OK; } /* ----------------------------------------------------------------------------- * insertDirective() * ----------------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { int ret = SWIG_OK; String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); Replaceall(code, "$module", module_class_name); Replaceall(code, "$imclassname", imclass_name); Replaceall(code, "$dllimport", dllimport); if (!ImportMode && (Cmp(section, "proxycode") == 0)) { if (proxy_class_code) { Swig_typemap_replace_embedded_typemap(code, n); int offset = Len(code) > 0 && *Char(code) == '\n' ? 1 : 0; Printv(proxy_class_code, Char(code) + offset, "\n", NIL); } } else { ret = Language::insertDirective(n); } return ret; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * imclassbase - base (extends) for the intermediary class * imclassclassmodifiers - class modifiers for the intermediary class * imclasscode - text (C# code) is copied verbatim to the intermediary class * imclassimports - import statements for the intermediary class * imclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (C# code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "csharp") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); if (Strcmp(code, "imclassbase") == 0) { Delete(imclass_baseclass); imclass_baseclass = Copy(strvalue); } else if (Strcmp(code, "imclassclassmodifiers") == 0) { Delete(imclass_class_modifiers); imclass_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "imclasscode") == 0) { Printf(imclass_class_code, "%s\n", strvalue); } else if (Strcmp(code, "imclassimports") == 0) { Delete(imclass_imports); imclass_imports = Copy(strvalue); } else if (Strcmp(code, "imclassinterfaces") == 0) { Delete(imclass_interfaces); imclass_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(module_class_modifiers); module_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(module_class_code, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } Delete(strvalue); } } return Language::pragmaDirective(n); } /* ----------------------------------------------------------------------------- * getQualifiedInterfaceName() * ----------------------------------------------------------------------------- */ String *getQualifiedInterfaceName(Node *n) { String *ret = Getattr(n, "interface:qname"); if (!ret) { String *nspace = Getattr(n, "sym:nspace"); String *interface_name = Getattr(n, "interface:name"); if (nspace) { if (namespce) ret = NewStringf("%s.%s.%s", namespce, nspace, interface_name); else ret = NewStringf("%s.%s", nspace, interface_name); } else { ret = Copy(interface_name); } Setattr(n, "interface:qname", ret); } return ret; } /* ----------------------------------------------------------------------------- * getInterfaceName() * ----------------------------------------------------------------------------- */ String *getInterfaceName(SwigType *t, bool qualified) { String *interface_name = NULL; if (proxy_flag) { Node *n = classLookup(t); if (n && Getattr(n, "interface:name")) interface_name = qualified ? getQualifiedInterfaceName(n) : Getattr(n, "interface:name"); } return interface_name; } /* ----------------------------------------------------------------------------- * addInterfaceNameAndUpcasts() * ----------------------------------------------------------------------------- */ void addInterfaceNameAndUpcasts(SwigType *smart, String *interface_list, String *interface_upcasts, Hash *base_list, String *c_classname) { List *keys = Keys(base_list); for (Iterator it = First(keys); it.item; it = Next(it)) { Node *base = Getattr(base_list, it.item); String *c_baseclass = SwigType_namestr(Getattr(base, "name")); String *interface_name = Getattr(base, "interface:name"); if (Len(interface_list)) Append(interface_list, ", "); Append(interface_list, interface_name); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(base, "csinterfacecode", Getattr(base, "classtypeobj"), WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF, attributes)); String *cptr_method_name = 0; if (interface_code) { Replaceall(interface_code, "$interfacename", interface_name); Printv(interface_upcasts, interface_code, NIL); cptr_method_name = Copy(Getattr(attributes, "tmap:csinterfacecode:cptrmethod")); } if (!cptr_method_name) cptr_method_name = NewStringf("%s_GetInterfaceCPtr", interface_name); Replaceall(cptr_method_name, ".", "_"); Replaceall(cptr_method_name, "$interfacename", interface_name); String *upcast_method_name = Swig_name_member(getNSpace(), proxy_class_name, cptr_method_name); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); Delete(cptr_method_name); Delete(interface_code); Delete(c_baseclass); } Delete(keys); } /* ----------------------------------------------------------------------------- * upcastsCode() * * Add code for C++ casting to base class * ----------------------------------------------------------------------------- */ void upcastsCode(SwigType *smart, String *upcast_method_name, String *c_classname, String *c_baseclass) { String *wname = Swig_name_wrapper(upcast_method_name); Printv(imclass_cppcasts_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); Printf(imclass_cppcasts_code, " public static extern global::System.IntPtr %s(global::System.IntPtr jarg1);\n", upcast_method_name); Replaceall(imclass_cppcasts_code, "$csclassname", proxy_class_name); if (smart) { SwigType *bsmart = Copy(smart); SwigType *rclassname = SwigType_typedef_resolve_all(c_classname); SwigType *rbaseclass = SwigType_typedef_resolve_all(c_baseclass); Replaceall(bsmart, rclassname, rbaseclass); Delete(rclassname); Delete(rbaseclass); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); Printv(upcasts_code, "SWIGEXPORT ", bsmartnamestr, " * SWIGSTDCALL ", wname, "(", smartnamestr, " *jarg1) {\n", " return jarg1 ? new ", bsmartnamestr, "(*jarg1) : 0;\n" "}\n", "\n", NIL); Delete(bsmartnamestr); Delete(smartnamestr); Delete(bsmart); } else { Printv(upcasts_code, "SWIGEXPORT ", c_baseclass, " * SWIGSTDCALL ", wname, "(", c_classname, " *jarg1) {\n", " return (", c_baseclass, " *)jarg1;\n" "}\n", "\n", NIL); } Delete(wname); } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; String *baseclass = NULL; String *c_baseclassname = NULL; String *interface_list = NewStringEmpty(); String *interface_upcasts = NewStringEmpty(); SwigType *typemap_lookup_type = Getattr(n, "classtypeobj"); bool feature_director = Swig_directorclass(n) ? true : false; bool has_outerclass = Getattr(n, "nested:outer") != 0 && !GetFlag(n, "feature:flatnested"); SwigType *smart = Swig_cparse_smartptr(n); // Inheritance from pure C# classes Node *attributes = NewHash(); const String *pure_baseclass = typemapLookup(n, "csbase", typemap_lookup_type, WARN_NONE, attributes); bool purebase_replace = GetFlag(attributes, "tmap:csbase:replace") ? true : false; bool purebase_notderived = GetFlag(attributes, "tmap:csbase:notderived") ? true : false; Delete(attributes); // C++ inheritance if (!purebase_replace) { List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!(GetFlag(base.item, "feature:ignore") || Getattr(base.item, "feature:interface"))) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { c_baseclassname = baseclassname; baseclass = Copy(getProxyName(baseclassname)); if (baseclass) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in C#.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } } Hash *interface_bases = Getattr(n, "interface:bases"); if (interface_bases) addInterfaceNameAndUpcasts(smart, interface_list, interface_upcasts, interface_bases, c_classname); bool derived = baseclass && getProxyName(c_baseclassname); if (derived && purebase_notderived) pure_baseclass = empty_string; const String *wanted_base = baseclass ? baseclass : pure_baseclass; if (purebase_replace) { wanted_base = pure_baseclass; derived = false; Delete(baseclass); baseclass = NULL; if (purebase_notderived) Swig_error(Getfile(n), Getline(n), "The csbase typemap for proxy %s must contain just one of the 'replace' or 'notderived' attributes.\n", typemap_lookup_type); } else if (Len(pure_baseclass) > 0 && Len(baseclass) > 0) { Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in C#. " "Perhaps you need one of the 'replace' or 'notderived' attributes in the csbase typemap?\n", typemap_lookup_type, pure_baseclass); } // Pure C# interfaces const String *pure_interfaces = typemapLookup(n, derived ? "csinterfaces_derived" : "csinterfaces", typemap_lookup_type, WARN_NONE); if (*Char(interface_list) && *Char(pure_interfaces)) Append(interface_list, ", "); Append(interface_list, pure_interfaces); // Start writing the proxy class if (!has_outerclass) Printv(proxy_class_def, typemapLookup(n, "csimports", typemap_lookup_type, WARN_NONE), // Import statements "\n", NIL); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", typemap_lookup_type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(proxy_class_def, "%s\n", csattributes); Printv(proxy_class_def, typemapLookup(n, "csclassmodifiers", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $csclassname", // Class name and base class (*Char(wanted_base) || *Char(interface_list)) ? " : " : "", wanted_base, (*Char(wanted_base) && *Char(interface_list)) ? // Interfaces ", " : "", interface_list, " {", derived ? typemapLookup(n, "csbody_derived", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF) : // main body of class typemapLookup(n, "csbody", typemap_lookup_type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class NIL); // C++ destructor is wrapped by the Dispose method // Note that the method name is specified in a typemap attribute called methodname String *destruct = NewString(""); const String *tm = NULL; attributes = NewHash(); String *destruct_methodname = NULL; String *destruct_methodmodifiers = NULL; if (derived) { tm = typemapLookup(n, "csdestruct_derived", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:csdestruct_derived:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:csdestruct_derived:methodmodifiers"); } else { tm = typemapLookup(n, "csdestruct", typemap_lookup_type, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:csdestruct:methodname"); destruct_methodmodifiers = Getattr(attributes, "tmap:csdestruct:methodmodifiers"); } if (tm && *Char(tm)) { if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in csdestruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } if (!destruct_methodmodifiers) { Swig_error(Getfile(n), Getline(n), "No methodmodifiers attribute defined in csdestruct%s typemap for %s.\n", (derived ? "_derived" : ""), proxy_class_name); } } // Emit the Finalize and Dispose methods if (tm) { // Finalize method if (*Char(destructor_call)) { Printv(proxy_class_def, typemapLookup(n, "csfinalize", typemap_lookup_type, WARN_NONE), NIL); } // Dispose method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$imcall", destructor_call); else Replaceall(destruct, "$imcall", "throw new global::System.MethodAccessException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) Printv(proxy_class_def, "\n ", destruct_methodmodifiers, " ", derived ? "override" : "virtual", " void ", destruct_methodname, "() ", destruct, "\n", NIL); } if (*Char(interface_upcasts)) Printv(proxy_class_def, interface_upcasts, NIL); if (feature_director) { // Generate director connect method // put this in classDirectorEnd ??? Printf(proxy_class_code, " private void SwigDirectorConnect() {\n"); int i; for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *method = Getattr(udata, "method"); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(proxy_class_code, " if (SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s))\n", method, methid); Printf(proxy_class_code, " swigDelegate%s = new SwigDelegate%s_%s(SwigDirector%s);\n", methid, proxy_class_name, methid, overname); } String *director_connect_method_name = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); Printf(proxy_class_code, " %s.%s(swigCPtr", imclass_name, director_connect_method_name); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(proxy_class_code, ", swigDelegate%s", methid); } Printf(proxy_class_code, ");\n"); Printf(proxy_class_code, " }\n"); if (first_class_dmethod < curr_class_dmethod) { // Only emit if there is at least one director method Printf(proxy_class_code, "\n"); Printf(proxy_class_code, " private bool SwigDerivedClassHasMethod(string methodName, global::System.Type[] methodTypes) {\n"); Printf(proxy_class_code, " global::System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, global::System.Reflection.BindingFlags.Public | global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance, null, methodTypes, null);\n"); Printf(proxy_class_code, " bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(%s));\n", proxy_class_name); /* Could add this code to cover corner case where the GetMethod() returns a method which allows type * promotion, eg it will return foo(double), if looking for foo(int). if (hasDerivedMethod) { hasDerivedMethod = false; if (methodInfo != null) { hasDerivedMethod = true; ParameterInfo[] parameterArray1 = methodInfo.GetParameters(); for (int i=0; i 0) Printv(proxy_class_code, director_delegate_callback, NIL); if (Len(director_delegate_definitions) > 0) Printv(proxy_class_code, "\n", director_delegate_definitions, NIL); if (Len(director_delegate_instances) > 0) Printv(proxy_class_code, "\n", director_delegate_instances, NIL); if (Len(director_method_types) > 0) Printv(proxy_class_code, "\n", director_method_types, NIL); Delete(director_callback_typedefs); director_callback_typedefs = NULL; Delete(director_callbacks); director_callbacks = NULL; Delete(director_delegate_callback); director_delegate_callback = NULL; Delete(director_delegate_definitions); director_delegate_definitions = NULL; Delete(director_delegate_instances); director_delegate_instances = NULL; Delete(director_method_types); director_method_types = NULL; Delete(director_connect_parms); director_connect_parms = NULL; Delete(director_connect_method_name); } Delete(interface_upcasts); Delete(interface_list); Delete(attributes); Delete(destruct); // Emit extra user code Printv(proxy_class_def, typemapLookup(n, "cscode", typemap_lookup_type, WARN_NONE), // extra C# code "\n", NIL); if (derived) { String *upcast_method_name = Swig_name_member(getNSpace(), getClassPrefix(), smart != 0 ? "SWIGSmartPtrUpcast" : "SWIGUpcast"); upcastsCode(smart, upcast_method_name, c_classname, c_baseclass); Delete(upcast_method_name); } Delete(smart); Delete(baseclass); } /* ---------------------------------------------------------------------- * emitInterfaceDeclaration() * ---------------------------------------------------------------------- */ void emitInterfaceDeclaration(Node *n, String *interface_name, File *f_interface) { Printv(f_interface, typemapLookup(n, "csimports", Getattr(n, "classtypeobj"), WARN_NONE), "\n", NIL); Printf(f_interface, "public interface %s", interface_name); if (List *baselist = Getattr(n, "bases")) { String *bases = 0; for (Iterator base = First(baselist); base.item; base = Next(base)) { if (GetFlag(base.item, "feature:ignore") || !Getattr(base.item, "feature:interface")) continue; // TODO: warn about skipped non-interface bases String *base_iname = Getattr(base.item, "interface:name"); if (!bases) bases = NewStringf(" : %s", base_iname); else { Append(bases, ", "); Append(bases, base_iname); } } if (bases) { Printv(f_interface, bases, NIL); Delete(bases); } } Printf(f_interface, " {\n"); Node *attributes = NewHash(); String *interface_code = Copy(typemapLookup(n, "csinterfacecode", Getattr(n, "classtypeobj"), WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF, attributes)); if (interface_code) { String *interface_declaration = Copy(Getattr(attributes, "tmap:csinterfacecode:declaration")); if (interface_declaration) { Replaceall(interface_declaration, "$interfacename", interface_name); Printv(f_interface, interface_declaration, NIL); Delete(interface_declaration); } Delete(interface_code); } } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { String *nspace = getNSpace(); File *f_proxy = NULL; File *f_interface = NULL; // save class local variables String *old_proxy_class_name = proxy_class_name; String *old_full_imclass_name = full_imclass_name; String *old_destructor_call = destructor_call; String *old_proxy_class_constants_code = proxy_class_constants_code; String *old_proxy_class_def = proxy_class_def; String *old_proxy_class_code = proxy_class_code; bool has_outerclass = Getattr(n, "nested:outer") && !GetFlag(n, "feature:flatnested"); String *old_interface_class_code = interface_class_code; interface_class_code = 0; if (proxy_flag) { proxy_class_name = NewString(Getattr(n, "sym:name")); String *interface_name = Getattr(n, "feature:interface") ? Getattr(n, "interface:name") : 0; if (Node *outer = Getattr(n, "nested:outer")) { String *outerClassesPrefix = Copy(Getattr(outer, "sym:name")); for (outer = Getattr(outer, "nested:outer"); outer != 0; outer = Getattr(outer, "nested:outer")) { Push(outerClassesPrefix, "."); Push(outerClassesPrefix, Getattr(outer, "sym:name")); } String *fnspace = nspace ? NewStringf("%s.%s", nspace, outerClassesPrefix) : outerClassesPrefix; if (!addSymbol(proxy_class_name, n, fnspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, fnspace)) return SWIG_ERROR; if (nspace) Delete(fnspace); Delete(outerClassesPrefix); } else { if (!addSymbol(proxy_class_name, n, nspace)) return SWIG_ERROR; if (interface_name && !addInterfaceSymbol(interface_name, n, nspace)) return SWIG_ERROR; } if (!nspace) { full_imclass_name = NewStringf("%s", imclass_name); if (Cmp(proxy_class_name, imclass_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, module_class_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } } else { if (namespce) { full_imclass_name = NewStringf("%s.%s", namespce, imclass_name); } else { full_imclass_name = NewStringf("%s", imclass_name); } } if (!has_outerclass) { String *output_directory = outputDirectory(nspace); f_proxy = getOutputFile(output_directory, proxy_class_name); addOpenNamespace(nspace, f_proxy); Delete(output_directory); } else ++nesting_depth; proxy_class_def = NewString(""); proxy_class_code = NewString(""); destructor_call = NewString(""); proxy_class_constants_code = NewString(""); if (Getattr(n, "feature:interface")) { interface_class_code = NewString(""); String *output_directory = outputDirectory(nspace); f_interface = getOutputFile(output_directory, interface_name); addOpenNamespace(nspace, f_interface); emitInterfaceDeclaration(n, interface_name, interface_class_code); Delete(output_directory); } } Language::classHandler(n); if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); String *csclazzname = Swig_name_member(getNSpace(), getClassPrefix(), ""); // mangled full proxy class name Replaceall(proxy_class_def, "$csclassname", proxy_class_name); Replaceall(proxy_class_code, "$csclassname", proxy_class_name); Replaceall(proxy_class_constants_code, "$csclassname", proxy_class_name); Replaceall(interface_class_code, "$csclassname", proxy_class_name); Replaceall(proxy_class_def, "$csclazzname", csclazzname); Replaceall(proxy_class_code, "$csclazzname", csclazzname); Replaceall(proxy_class_constants_code, "$csclazzname", csclazzname); Replaceall(interface_class_code, "$csclazzname", csclazzname); Replaceall(proxy_class_def, "$module", module_class_name); Replaceall(proxy_class_code, "$module", module_class_name); Replaceall(proxy_class_constants_code, "$module", module_class_name); Replaceall(interface_class_code, "$module", module_class_name); Replaceall(proxy_class_def, "$imclassname", full_imclass_name); Replaceall(proxy_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_constants_code, "$imclassname", full_imclass_name); Replaceall(interface_class_code, "$imclassname", full_imclass_name); Replaceall(proxy_class_def, "$dllimport", dllimport); Replaceall(proxy_class_code, "$dllimport", dllimport); Replaceall(proxy_class_constants_code, "$dllimport", dllimport); Replaceall(interface_class_code, "$dllimport", dllimport); if (!has_outerclass) Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); else { Swig_offset_string(proxy_class_def, nesting_depth); Append(old_proxy_class_code, proxy_class_def); Swig_offset_string(proxy_class_code, nesting_depth); Append(old_proxy_class_code, proxy_class_code); } // Write out all the constants if (Len(proxy_class_constants_code) != 0) { if (!has_outerclass) Printv(f_proxy, proxy_class_constants_code, NIL); else { Swig_offset_string(proxy_class_constants_code, nesting_depth); Append(old_proxy_class_code, proxy_class_constants_code); } } if (!has_outerclass) { Printf(f_proxy, "}\n"); addCloseNamespace(nspace, f_proxy); if (f_proxy != f_single_out) Delete(f_proxy); f_proxy = NULL; } else { for (int i = 0; i < nesting_depth; ++i) Append(old_proxy_class_code, " "); Append(old_proxy_class_code, "}\n\n"); --nesting_depth; } /* Output the downcast method, if necessary. Note: There's no other really good place to put this code, since Abstract Base Classes (ABCs) can and should have downcasts, making the constructorHandler() a bad place (because ABCs don't get to have constructors emitted.) */ if (GetFlag(n, "feature:csdowncast")) { String *downcast_method = Swig_name_member(getNSpace(), proxy_class_name, "SWIGDowncast"); String *wname = Swig_name_wrapper(downcast_method); String *norm_name = SwigType_namestr(Getattr(n, "name")); Printf(imclass_class_code, " public final static native %s %s(long cPtrBase, boolean cMemoryOwn);\n", proxy_class_name, downcast_method); Wrapper *dcast_wrap = NewWrapper(); Printf(dcast_wrap->def, "SWIGEXPORT jobject SWIGSTDCALL %s(JNIEnv *jenv, jclass jcls, jlong jCPtrBase, jboolean cMemoryOwn) {", wname); Printf(dcast_wrap->code, " Swig::Director *director = (Swig::Director *) 0;\n"); Printf(dcast_wrap->code, " jobject jresult = (jobject) 0;\n"); Printf(dcast_wrap->code, " %s *obj = *((%s **)&jCPtrBase);\n", norm_name, norm_name); Printf(dcast_wrap->code, " if (obj) director = dynamic_cast(obj);\n"); Printf(dcast_wrap->code, " if (director) jresult = director->swig_get_self(jenv);\n"); Printf(dcast_wrap->code, " return jresult;\n"); Printf(dcast_wrap->code, "}\n"); Wrapper_print(dcast_wrap, f_wrappers); DelWrapper(dcast_wrap); Delete(norm_name); Delete(wname); Delete(downcast_method); } if (f_interface) { Printv(f_interface, interface_class_code, "}\n", NIL); addCloseNamespace(nspace, f_interface); if (f_interface != f_single_out) Delete(f_interface); f_interface = 0; } emitDirectorExtraMethods(n); Delete(interface_class_code); interface_class_code = old_interface_class_code; Delete(csclazzname); Delete(proxy_class_name); proxy_class_name = old_proxy_class_name; Delete(full_imclass_name); full_imclass_name = old_full_imclass_name; Delete(destructor_call); destructor_call = old_destructor_call; Delete(proxy_class_constants_code); proxy_class_constants_code = old_proxy_class_constants_code; Delete(proxy_class_def); proxy_class_def = old_proxy_class_def; Delete(proxy_class_code); proxy_class_code = old_proxy_class_code; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { Language::memberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a C# wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to C# static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the C# class proxy function, which in turn will call "imfuncname" - * the intermediary (PInvoke) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; Parm *last_parm = 0; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); bool is_interface = Getattr(parentNode(n), "feature:interface") != 0 && !static_flag && Getattr(n, "interface:owner") == 0; if (!proxy_flag) return; // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "overload:ignore")) return; // Don't generate proxy method for additional explicitcall method used in directors if (GetFlag(n, "explicitcall")) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { // Note that in the case of polymorphic (covariant) return types, the method's return type is changed to be the base of the C++ return type SwigType *covariant = Getattr(n, "covariant"); String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(covariant ? covariant : t, tm); Printf(return_type, "%s", tm); if (covariant) Swig_warning(WARN_CSHARP_COVARIANT_RET, input_file, line_number, "Covariant return types not supported in C#. Proxy method will return %s.\n", SwigType_str(covariant, 0)); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // Properties setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), Swig_name_member(0, getClassPrefix(), variable_name))) == 0); if (setter_flag) Swig_typemap_attach_parms("csvarin", l, NULL); } /* Start generating the proxy function */ const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(function_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (methodmods) { if (is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the underlying pointer type, so no virtual/override/new required. String *mmods = Copy(methodmods); Replaceall(mmods, "override", ""); Replaceall(mmods, "virtual", ""); Replaceall(mmods, "new", ""); Chop(mmods); // remove trailing whitespace Printf(function_code, " %s ", mmods); Delete(mmods); } else { Printf(function_code, " %s ", methodmods); } } else { methodmods = (is_public(n) ? public_string : protected_string); Printf(function_code, " %s ", methodmods); if (!is_smart_pointer()) { // Smart pointer classes do not mirror the inheritance hierarchy of the underlying pointer type, so no virtual/override/new required. if (Getattr(n, "override")) Printf(function_code, "override "); else if (checkAttribute(n, "storage", "virtual")) Printf(function_code, "virtual "); if (Getattr(n, "hides")) Printf(function_code, "new "); } } if (static_flag) Printf(function_code, "static "); Printf(function_code, "%s %s(", return_type, proxy_function_name); if (is_interface) Printf(interface_class_code, " %s %s(", return_type, proxy_function_name); Printv(imcall, full_imclass_name, ".$imfuncname(", NIL); if (!static_flag) Printf(imcall, "swigCPtr"); emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0)) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); if (setter_flag) last_parm = p; /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, setter_flag); // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma >= 2) { Printf(function_code, ", "); if (is_interface) Printf(interface_class_code, ", "); } gencomma = 2; Printf(function_code, "%s %s", param_type, arg); if (is_interface) Printf(interface_class_code, "%s %s", param_type, arg); Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); if (is_interface) Printf(interface_class_code, ");\n"); // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in proxy class) if ((tm = Swig_typemap_lookup("csout", n, "", 0))) { excodeSubstitute(n, tm, "csout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); // For director methods: generate code to selectively make a normal polymorphic call or // an explicit method call - needed to prevent infinite recursion calls in director methods. Node *explicit_n = Getattr(n, "explicitcallnode"); if (explicit_n) { String *ex_overloaded_name = getOverloadedName(explicit_n); String *ex_intermediary_function_name = Swig_name_member(getNSpace(), getClassPrefix(), ex_overloaded_name); String *ex_imcall = Copy(imcall); Replaceall(ex_imcall, "$imfuncname", ex_intermediary_function_name); Replaceall(imcall, "$imfuncname", intermediary_function_name); String *excode = NewString(""); Node *directorNode = Getattr(n, "directorNode"); if (directorNode) { UpcallData *udata = Getattr(directorNode, "upcalldata"); String *methid = Getattr(udata, "class_methodidx"); if (!Cmp(return_type, "void")) Printf(excode, "if (SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s)) %s; else %s", proxy_function_name, methid, ex_imcall, imcall); else Printf(excode, "(SwigDerivedClassHasMethod(\"%s\", swigMethodTypes%s) ? %s : %s)", proxy_function_name, methid, ex_imcall, imcall); Clear(imcall); Printv(imcall, excode, NIL); } else { // probably an ignored method or nodirector } Delete(excode); Delete(ex_overloaded_name); } else { Replaceall(imcall, "$imfuncname", intermediary_function_name); } Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { // Properties if (generate_property_declaration_flag) { // Ensure the declaration is generated just once should the property contain both a set and get // Get the C# variable type - obtained differently depending on whether a setter is required. String *variable_type = return_type; if (setter_flag) { assert(last_parm); // (last parameter is the only parameter for properties) /* Get variable type - ensure the variable name is fully resolved during typemap lookup via the symbol table set in NewParmNode */ SwigType *cvariable_type = Getattr(last_parm, "type"); Parm *variable_parm = NewParmNode(cvariable_type, n); if ((tm = Swig_typemap_lookup("cstype", variable_parm, "", 0))) { String *cstypeout = Getattr(variable_parm, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(cvariable_type, tm); variable_type = tm; } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(cvariable_type, 0)); } } const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(proxy_class_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (!methodmods) methodmods = (is_public(n) ? public_string : protected_string); Printf(proxy_class_code, " %s %s%s %s {", methodmods, static_flag ? "static " : "", variable_type, variable_name); } generate_property_declaration_flag = false; if (setter_flag) { // Setter method assert(last_parm); // (last parameter is the only parameter for properties) SwigType *cvariable_type = Getattr(last_parm, "type"); Parm *variable_parm = NewParmNode(cvariable_type, n); if ((tm = Swig_typemap_lookup("csvarin", variable_parm, "", 0))) { substituteClassname(cvariable_type, tm); Replaceall(tm, "$csinput", "value"); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarin", variable_parm); Printf(proxy_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(cvariable_type, 0)); } } else { // Getter method if ((tm = Swig_typemap_lookup("csvarout", n, "", 0))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarout", n); Printf(proxy_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarout typemap defined for %s\n", SwigType_str(t, 0)); } } } else { // Normal function call Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(proxy_class_code, function_code, NIL); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; int i; String *function_code = NewString(""); String *helper_code = NewString(""); // Holds code for the constructor helper method generated only when the csin typemap has code in the pre or post attributes String *helper_args = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); String *im_return_type = NewString(""); bool feature_director = (parentNode(n) && Swig_directorclass(n)); Language::constructorHandler(n); // Wrappers not wanted for some methods where the parameters cannot be overloaded in C# if (Getattr(n, "overload:ignore")) return SWIG_OK; if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *mangled_overname = Swig_name_construct(getNSpace(), overloaded_name); String *imcall = NewString(""); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) { Printf(function_code, " %s\n", csattributes); Printf(helper_code, " %s\n", csattributes); } const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); tm = Getattr(n, "tmap:imtype"); // typemaps were attached earlier to the node String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; Printf(im_return_type, "%s", tm); Printf(function_code, " %s %s(", methodmods, proxy_class_name); Printf(helper_code, " static private %s SwigConstruct%s(", im_return_type, proxy_class_name); Printv(imcall, full_imclass_name, ".", mangled_overname, "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); emit_mark_varargs(l); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, false); String *cshin = 0; // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } cshin = Getattr(p, "tmap:csin:cshin"); if (cshin) Replaceall(cshin, "$csinput", arg); Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to proxy function */ if (gencomma) { Printf(function_code, ", "); Printf(helper_code, ", "); Printf(helper_args, ", "); } Printf(function_code, "%s %s", param_type, arg); Printf(helper_code, "%s %s", param_type, arg); Printf(helper_args, "%s", cshin ? cshin : arg); ++gencomma; Delete(cshin); Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); Printf(helper_code, ")"); /* Insert the csconstruct typemap, doing the replacement for $directorconnect, as needed */ Hash *attributes = NewHash(); String *construct_tm = Copy(typemapLookup(n, "csconstruct", Getattr(n, "name"), WARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF, attributes)); if (construct_tm) { if (!feature_director) { Replaceall(construct_tm, "$directorconnect", ""); } else { String *connect_attr = Getattr(attributes, "tmap:csconstruct:directorconnect"); if (connect_attr) { Replaceall(construct_tm, "$directorconnect", connect_attr); } else { Swig_warning(WARN_CSHARP_NO_DIRECTORCONNECT_ATTR, input_file, line_number, "\"directorconnect\" attribute missing in %s \"csconstruct\" typemap.\n", Getattr(n, "name")); Replaceall(construct_tm, "$directorconnect", ""); } } Printv(function_code, " ", construct_tm, NIL); } excodeSubstitute(n, function_code, "csconstruct", attributes); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Printf(helper_code, " {\n"); if (is_pre_code) { Printv(helper_code, pre_code, "\n", NIL); } if (is_post_code) { Printf(helper_code, " try {\n"); Printv(helper_code, " return ", imcall, ";\n", NIL); Printv(helper_code, " } finally {\n", post_code, "\n }", NIL); } else { Printv(helper_code, " return ", imcall, ";", NIL); } if (is_terminator_code) { Printv(helper_code, "\n", terminator_code, NIL); } Printf(helper_code, "\n }\n"); String *helper_name = NewStringf("%s.SwigConstruct%s(%s)", proxy_class_name, proxy_class_name, helper_args); String *im_outattributes = Getattr(n, "tmap:imtype:outattributes"); if (im_outattributes) Printf(proxy_class_code, " %s\n", im_outattributes); Printv(proxy_class_code, helper_code, "\n", NIL); Replaceall(function_code, "$imcall", helper_name); Delete(helper_name); } else { Replaceall(function_code, "$imcall", imcall); } Printv(proxy_class_code, function_code, "\n", NIL); Delete(helper_args); Delete(im_return_type); Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(construct_tm); Delete(attributes); Delete(overloaded_name); Delete(imcall); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, full_imclass_name, ".", Swig_name_destroy(getNSpace(), symname), "(swigCPtr)", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; generate_property_declaration_flag = false; Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { bool static_const_member_flag = (Getattr(n, "value") == 0); generate_property_declaration_flag = true; variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; generate_property_declaration_flag = false; if (static_const_member_flag) Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { /* A C# HandleRef is used for all classes in the SWIG intermediary class. * The intermediary class methods are thus mangled when overloaded to give * a unique name. */ String *overloaded_name = NewStringf("%s", Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * moduleClassFunctionHandler() * ----------------------------------------------------------------------------- */ void moduleClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; Parm *p; Parm *last_parm = 0; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); int num_arguments = 0; String *overloaded_name = getOverloadedName(n); String *func_name = NULL; bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("cstype", l, NULL); Swig_typemap_attach_parms("csin", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("cstype", n, "", 0))) { String *cstypeout = Getattr(n, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap if (cstypeout) tm = cstypeout; substituteClassname(t, tm); Printf(return_type, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(t, 0)); } /* Change function name for global variables */ if (proxy_flag && global_variable_flag) { // Capitalize the first letter in the variable to create the getter/setter function name func_name = NewString(""); setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(getNSpace(), variable_name)) == 0); if (setter_flag) Printf(func_name, "set"); else Printf(func_name, "get"); Putc(toupper((int) *Char(variable_name)), func_name); Printf(func_name, "%s", Char(variable_name) + 1); if (setter_flag) Swig_typemap_attach_parms("csvarin", l, NULL); } else { func_name = Copy(Getattr(n, "sym:name")); } /* Start generating the function */ const String *outattributes = Getattr(n, "tmap:cstype:outattributes"); if (outattributes) Printf(function_code, " %s\n", outattributes); const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(function_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); methodmods = methodmods ? methodmods : (is_public(n) ? public_string : protected_string); Printf(function_code, " %s static %s %s(", methodmods, return_type, func_name); Printv(imcall, imclass_name, ".", overloaded_name, "(", NIL); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); bool global_or_member_variable = global_variable_flag || (wrapping_member_flag && !enum_constant_flag); int gencomma = 0; /* Output each parameter */ for (i = 0, p = l; i < num_arguments; i++) { /* Ignored parameters */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); last_parm = p; /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); const String *inattributes = Getattr(p, "tmap:cstype:inattributes"); Printf(param_type, "%s%s", inattributes ? inattributes : empty_string, tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i, global_or_member_variable); // Use typemaps to transform type used in C# wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = Getattr(p, "tmap:csin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", arg); String *pre = Getattr(p, "tmap:csin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$csinput", arg); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$csinput", arg); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$csinput", arg); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } Printv(imcall, tm, NIL); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSIN_UNDEF, input_file, line_number, "No csin typemap defined for %s\n", SwigType_str(pt, 0)); } /* Add parameter to module class function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); p = Getattr(p, "tmap:in:next"); Delete(arg); Delete(param_type); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in PInvoke function (in intermediary class) to type used in C# wrapper function (in module class) if ((tm = Swig_typemap_lookup("csout", n, "", 0))) { excodeSubstitute(n, tm, "csout", n); bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code || is_post_code || is_terminator_code) { Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap if (is_post_code) { Insert(tm, 0, "\n try "); Printv(tm, " finally {\n", post_code, "\n }", NIL); } else { Insert(tm, 0, "\n "); } if (is_pre_code) { Insert(tm, 0, pre_code); Insert(tm, 0, "\n"); } if (is_terminator_code) { Printv(tm, "\n", terminator_code, NIL); } Insert(tm, 0, "{"); Printf(tm, "\n }"); } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csout typemap defined for %s\n", SwigType_str(t, 0)); } if (proxy_flag && global_variable_flag) { // Properties if (generate_property_declaration_flag) { // Ensure the declaration is generated just once should the property contain both a set and get // Get the C# variable type - obtained differently depending on whether a setter is required. String *variable_type = return_type; if (setter_flag) { p = last_parm; // (last parameter is the only parameter for properties) SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); String *cstypeout = Getattr(p, "tmap:cstype:out"); // the type in the cstype typemap's out attribute overrides the type in the typemap variable_type = cstypeout ? cstypeout : tm; } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(pt, 0)); } } const String *csattributes = Getattr(n, "feature:cs:attributes"); if (csattributes) Printf(module_class_code, " %s\n", csattributes); const String *methodmods = Getattr(n, "feature:cs:methodmodifiers"); if (!methodmods) methodmods = (is_public(n) ? public_string : protected_string); Printf(module_class_code, " %s static %s %s {", methodmods, variable_type, variable_name); } generate_property_declaration_flag = false; if (setter_flag) { // Setter method p = last_parm; // (last parameter is the only parameter for properties) SwigType *pt = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:csvarin"))) { substituteClassname(pt, tm); Replaceall(tm, "$csinput", "value"); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarin", p); Printf(module_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarin typemap defined for %s\n", SwigType_str(pt, 0)); } } else { // Getter method if ((tm = Swig_typemap_lookup("csvarout", n, "", 0))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); excodeSubstitute(n, tm, "csvarout", n); Printf(module_class_code, "%s", tm); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSOUT_UNDEF, input_file, line_number, "No csvarout typemap defined for %s\n", SwigType_str(t, 0)); } } } else { // Normal function call Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); Printv(module_class_code, function_code, NIL); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(function_code); Delete(return_type); Delete(imcall); Delete(func_name); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /*---------------------------------------------------------------------- * decodeEnumFeature() * Decode the possible enum features, which are one of: * %csenum(simple) * %csenum(typeunsafe) - default * %csenum(typesafe) * %csenum(proper) *--------------------------------------------------------------------*/ EnumFeature decodeEnumFeature(Node *n) { EnumFeature enum_feature = TypeunsafeEnum; String *feature = Getattr(n, "feature:cs:enum"); if (feature) { if (Cmp(feature, "simple") == 0) enum_feature = SimpleEnum; else if (Cmp(feature, "typesafe") == 0) enum_feature = TypesafeEnum; else if (Cmp(feature, "proper") == 0) enum_feature = ProperEnum; } return enum_feature; } /* ----------------------------------------------------------------------- * enumValue() * This method will return a string with an enum value to use in C# generated * code. If the %csconst feature is not used, the string will contain the intermediary * class call to obtain the enum value. The intermediary class and PINVOKE methods to obtain * the enum value will be generated. Otherwise the C/C++ enum value will be used if there * is one and hopefully it will compile as C# code - e.g. 20 as in: enum E{e=20}; * The %csconstvalue feature overrides all other ways to generate the constant value. * The caller must delete memory allocated for the returned string. * ------------------------------------------------------------------------ */ String *enumValue(Node *n) { String *symname = Getattr(n, "sym:name"); // Check for the %csconstvalue feature String *value = Getattr(n, "feature:cs:constvalue"); if (!value) { // The %csconst feature determines how the constant value is obtained int const_feature_flag = GetFlag(n, "feature:cs:const"); if (const_feature_flag) { // Use the C syntax to make a true C# constant and hope that it compiles as C# code value = Getattr(n, "enumvalue") ? Copy(Getattr(n, "enumvalue")) : Copy(Getattr(n, "enumvalueex")); } else { String *newsymname = 0; if (!getCurrentClass() || !proxy_flag) { String *enumClassPrefix = getEnumClassPrefix(); if (enumClassPrefix) { // A global scoped enum newsymname = Swig_name_member(0, enumClassPrefix, symname); symname = newsymname; } } // Get the enumvalue from a PINVOKE call if (!getCurrentClass() || !cparse_cplusplus || !proxy_flag) { // Strange hack to change the name Setattr(n, "name", Getattr(n, "value")); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), symname)); } else { memberconstantHandler(n); value = NewStringf("%s.%s()", full_imclass_name ? full_imclass_name : imclass_name, Swig_name_get(getNSpace(), Swig_name_member(0, getEnumClassPrefix(), symname))); } } } return value; } /* ----------------------------------------------------------------------------- * getEnumName() * ----------------------------------------------------------------------------- */ String *getEnumName(SwigType *t) { Node *enumname = NULL; Node *n = enumLookup(t); if (n) { enumname = Getattr(n, "enumname"); if (!enumname) { String *symname = Getattr(n, "sym:name"); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix); } if (proxyname) { enumname = NewStringf("%s.%s", proxyname, symname); } else { // global enum or enum in a namespace String *nspace = Getattr(n, "sym:nspace"); if (nspace) { if (namespce) enumname = NewStringf("%s.%s.%s", namespce, nspace, symname); else enumname = NewStringf("%s.%s", nspace, symname); } else { enumname = Copy(symname); } } Setattr(n, "enumname", enumname); Delete(enumname); Delete(scopename_prefix); } } } return enumname; } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $csclassname with the proxy class name for classes/structs/unions * that SWIG knows about. Also substitutes enums with enum name. * Otherwise use the $descriptor name for the C# class name. Note that the $&csclassname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); SwigType *strippedtype = SwigType_strip_qualifiers(type); if (Strstr(tm, "$csclassname")) { SwigType *classnametype = Copy(strippedtype); substituteClassnameSpecialVariable(classnametype, tm, "$csclassname"); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$*csclassname")) { SwigType *classnametype = Copy(strippedtype); Delete(SwigType_pop(classnametype)); if (Len(classnametype) > 0) { substituteClassnameSpecialVariable(classnametype, tm, "$*csclassname"); substitution_performed = true; } Delete(classnametype); } if (Strstr(tm, "$&csclassname")) { SwigType *classnametype = Copy(strippedtype); SwigType_add_pointer(classnametype); substituteClassnameSpecialVariable(classnametype, tm, "$&csclassname"); substitution_performed = true; Delete(classnametype); } if (Strstr(tm, "$csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$csinterfacename", true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*csinterfacename", true); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&csinterfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&csinterfacename", true); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$interfacename")) { SwigType *interfacenametype = Copy(strippedtype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$interfacename", false); substitution_performed = true; Delete(interfacenametype); } if (Strstr(tm, "$*interfacename")) { SwigType *interfacenametype = Copy(strippedtype); Delete(SwigType_pop(interfacenametype)); if (Len(interfacenametype) > 0) { substituteInterfacenameSpecialVariable(interfacenametype, tm, "$*interfacename", false); substitution_performed = true; } Delete(interfacenametype); } if (Strstr(tm, "$&interfacename")) { SwigType *interfacenametype = Copy(strippedtype); SwigType_add_pointer(interfacenametype); substituteInterfacenameSpecialVariable(interfacenametype, tm, "$&interfacename", false); substitution_performed = true; Delete(interfacenametype); } Delete(strippedtype); Delete(type); return substitution_performed; } /* ----------------------------------------------------------------------------- * substituteClassnameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteClassnameSpecialVariable(SwigType *classnametype, String *tm, const char *classnamespecialvariable) { String *replacementname; if (SwigType_isenum(classnametype)) { String *enumname = getEnumName(classnametype); if (enumname) { replacementname = Copy(enumname); } else { bool anonymous_enum = (Cmp(classnametype, "enum ") == 0); if (anonymous_enum) { replacementname = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); Replace(replacementname, "enum ", "", DOH_REPLACE_ANY); Setattr(swig_types_hash, replacementname, classnametype); } } } else { String *classname = getProxyName(classnametype); // getProxyName() works for pointers to classes too if (classname) { replacementname = Copy(classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. replacementname = NewStringf("SWIGTYPE%s", SwigType_manglestr(classnametype)); // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, replacementname, classnametype); } } Replaceall(tm, classnamespecialvariable, replacementname); Delete(replacementname); } /* ----------------------------------------------------------------------------- * substituteInterfacenameSpecialVariable() * ----------------------------------------------------------------------------- */ void substituteInterfacenameSpecialVariable(SwigType *interfacenametype, String *tm, const char *interfacenamespecialvariable, bool qualified) { String *interfacename = getInterfaceName(interfacenametype, qualified); if (interfacename) { String *replacementname = Copy(interfacename); Replaceall(tm, interfacenamespecialvariable, replacementname); Delete(replacementname); } } /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *swigtype = NewString(""); File *f_swigtype = getOutputFile(SWIG_output_directory(), classname); addOpenNamespace(0, f_swigtype); // Pure C# baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "csbase", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "csinterfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "csimports", type, WARN_NONE), // Import statements "\n", NIL); // Class attributes const String *csattributes = typemapLookup(n, "csattributes", type, WARN_NONE); if (csattributes && *Char(csattributes)) Printf(swigtype, "%s\n", csattributes); Printv(swigtype, typemapLookup(n, "csclassmodifiers", type, WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " $csclassname", // Class name and base class (*Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", pure_baseclass, ((*Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {", typemapLookup(n, "csbody", type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), // main body of class typemapLookup(n, "cscode", type, WARN_NONE), // extra C# code "}\n", NIL); Replaceall(swigtype, "$csclassname", classname); Replaceall(swigtype, "$module", module_class_name); Replaceall(swigtype, "$imclassname", imclass_name); Replaceall(swigtype, "$dllimport", dllimport); // For unknown enums Replaceall(swigtype, "$enumvalues", ""); Printv(f_swigtype, swigtype, NIL); addCloseNamespace(0, f_swigtype); if (f_swigtype != f_single_out) Delete(f_swigtype); f_swigtype = NULL; Delete(swigtype); Delete(n); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * canThrow() * Determine whether the code in the typemap can throw a C# exception. * If so, note it for later when excodeSubstitute() is called. * ----------------------------------------------------------------------------- */ void canThrow(Node *n, const String *typemap, Node *parameter) { String *canthrow_attribute = NewStringf("tmap:%s:canthrow", typemap); String *canthrow = Getattr(parameter, canthrow_attribute); if (canthrow) Setattr(n, "csharp:canthrow", "1"); Delete(canthrow_attribute); } /* ----------------------------------------------------------------------------- * excodeSubstitute() * If a method can throw a C# exception, additional exception code is added to * check for the pending exception so that it can then throw the exception. The * $excode special variable is replaced by the exception code in the excode * typemap attribute. * ----------------------------------------------------------------------------- */ void excodeSubstitute(Node *n, String *code, const String *typemap, Node *parameter) { String *excode_attribute = NewStringf("tmap:%s:excode", typemap); String *excode = Getattr(parameter, excode_attribute); if (Getattr(n, "csharp:canthrow")) { int count = Replaceall(code, "$excode", excode); if (count < 1 || !excode) { Swig_warning(WARN_CSHARP_EXCODE, input_file, line_number, "C# exception may not be thrown - no $excode or excode attribute in '%s' typemap.\n", typemap); } } else { Replaceall(code, "$excode", empty_string); } Delete(excode_attribute); } /* ----------------------------------------------------------------------------- * addOpenNamespace() * ----------------------------------------------------------------------------- */ void addOpenNamespace(const String *nspace, File *file) { if (namespce || nspace) { Printf(file, "namespace "); if (namespce) Printv(file, namespce, nspace ? "." : "", NIL); if (nspace) Printv(file, nspace, NIL); Printf(file, " {\n"); } } /* ----------------------------------------------------------------------------- * addCloseNamespace() * ----------------------------------------------------------------------------- */ void addCloseNamespace(const String *nspace, File *file) { if (namespce || nspace) Printf(file, "\n}\n"); } /* ----------------------------------------------------------------------------- * outputDirectory() * * Return the directory to use for generating C# classes/enums and create the * subdirectory (does not create if language specific outdir does not exist). * ----------------------------------------------------------------------------- */ String *outputDirectory(String *nspace) { String *output_directory = Copy(SWIG_output_directory()); if (nspace) { String *nspace_subdirectory = Copy(nspace); Replaceall(nspace_subdirectory, ".", SWIG_FILE_DELIMITER); String *newdir_error = Swig_new_subdirectory(output_directory, nspace_subdirectory); if (newdir_error) { Printf(stderr, "%s\n", newdir_error); Delete(newdir_error); SWIG_exit(EXIT_FAILURE); } Printv(output_directory, nspace_subdirectory, SWIG_FILE_DELIMITER, 0); Delete(nspace_subdirectory); } return output_directory; } /*---------------------------------------------------------------------- * Start of director methods *--------------------------------------------------------------------*/ #if 0 /*---------------------------------------------------------------------- * emitDirectorUpcalls() *--------------------------------------------------------------------*/ void emitDirectorUpcalls() { if (n_dmethods) { Wrapper *w = NewWrapper(); String *dmethod_data = NewString(""); int n_methods = 0; Iterator udata_iter; udata_iter = First(dmethods_seq); while (udata_iter.item) { UpcallData *udata = udata_iter.item; Printf(dmethod_data, " { \"%s\", \"%s\" }", Getattr(udata, "imclass_method"), Getattr(udata, "imclass_fdesc")); ++n_methods; udata_iter = Next(udata_iter); if (udata_iter.item) Putc(',', dmethod_data); Putc('\n', dmethod_data); } Wrapper_print(w, f_wrappers); Delete(dmethod_data); Delete(swig_module_init); DelWrapper(w); } } #endif /*---------------------------------------------------------------------- * emitDirectorExtraMethods() * * This is where the director connect method is generated. *--------------------------------------------------------------------*/ void emitDirectorExtraMethods(Node *n) { if (!Swig_directorclass(n)) return; // Output the director connect method: String *norm_name = SwigType_namestr(Getattr(n, "name")); String *dirclassname = directorClassName(n); String *swig_director_connect = Swig_name_member(getNSpace(), getClassPrefix(), "director_connect"); String *wname = Swig_name_wrapper(swig_director_connect); String *sym_name = Getattr(n, "sym:name"); String *qualified_classname = Copy(sym_name); String *nspace = getNSpace(); String *dirClassName = directorClassName(n); String *smartptr = Getattr(n, "feature:smartptr"); if (!GetFlag(n, "feature:flatnested")) { for (Node *outer_class = Getattr(n, "nested:outer"); outer_class; outer_class = Getattr(outer_class, "nested:outer")) { Push(qualified_classname, "."); Push(qualified_classname, Getattr(outer_class, "sym:name")); } } if (nspace) Insert(qualified_classname, 0, NewStringf("%s.", nspace)); Printv(imclass_class_code, "\n [global::System.Runtime.InteropServices.DllImport(\"", dllimport, "\", EntryPoint=\"", wname, "\")]\n", NIL); Printf(imclass_class_code, " public static extern void %s(global::System.Runtime.InteropServices.HandleRef jarg1", swig_director_connect); Wrapper *code_wrap = NewWrapper(); Printf(code_wrap->def, "SWIGEXPORT void SWIGSTDCALL %s(void *objarg", wname); if (smartptr) { Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", smartptr, smartptr); Printf(code_wrap->code, " // Keep a local instance of the smart pointer around while we are using the raw pointer\n"); Printf(code_wrap->code, " // Avoids using smart pointer specific API.\n"); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj->operator->());\n", dirClassName, dirClassName); } else { Printf(code_wrap->code, " %s *obj = (%s *)objarg;\n", norm_name, norm_name); Printf(code_wrap->code, " %s *director = dynamic_cast<%s *>(obj);\n", dirClassName, dirClassName); } // TODO: if statement not needed?? - Java too Printf(code_wrap->code, " if (director) {\n"); Printf(code_wrap->code, " director->swig_connect_director("); for (int i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); Printf(code_wrap->def, ", "); if (i != first_class_dmethod) Printf(code_wrap->code, ", "); Printf(code_wrap->def, "%s::SWIG_Callback%s_t callback%s", dirclassname, methid, methid); Printf(code_wrap->code, "callback%s", methid); Printf(imclass_class_code, ", %s.SwigDelegate%s_%s delegate%s", qualified_classname, sym_name, methid, methid); } Printf(code_wrap->def, ") {\n"); Printf(code_wrap->code, ");\n"); Printf(imclass_class_code, ");\n"); Printf(code_wrap->code, " }\n"); Printf(code_wrap->code, "}\n"); Wrapper_print(code_wrap, f_wrappers); DelWrapper(code_wrap); Delete(wname); Delete(swig_director_connect); Delete(qualified_classname); Delete(dirclassname); } /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying C# object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *returntype = Getattr(n, "type"); String *overloaded_name = getOverloadedName(n); String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *declaration = NewString(""); String *pre_code = NewString(""); String *post_code = NewString(""); String *terminator_code = NewString(""); String *tm; Parm *p; int i; Wrapper *w = NewWrapper(); ParmList *l = Getattr(n, "parms"); bool is_void = !(Cmp(returntype, "void")); String *qualified_return = 0; bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); int status = SWIG_OK; bool output_director = true; String *dirclassname = directorClassName(parent); String *qualified_name = NewStringf("%s::%s", dirclassname, name); SwigType *c_ret_type = NULL; String *jupcall_args = NewString(""); String *imclass_dmethod; String *callback_typedef_parms = NewString(""); String *delegate_parms = NewString(""); String *proxy_method_types = NewString(""); String *callback_def = NewString(""); String *callback_code = NewString(""); String *imcall_args = NewString(""); bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; // Kludge Alert: functionWrapper sets sym:overload properly, but it // isn't at this point, so we have to manufacture it ourselves. At least // we're consistent with the sym:overload name in functionWrapper. (?? when // does the overloaded method name get set?) imclass_dmethod = NewStringf("SwigDirector_%s", Swig_name_member(getNSpace(), getClassPrefix(), overloaded_name)); qualified_return = SwigType_rcaststr(returntype, "c_result"); if (!is_void && !ignored_method) { if (!SwigType_isclass(returntype)) { if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); Delete(construct_result); } else { String *base_typename = SwigType_base(returntype); String *resolved_typename = SwigType_typedef_resolve_all(base_typename); Symtab *symtab = Getattr(n, "sym:symtab"); Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstracts"))) { /* initialize pointers to something sane. Same for abstract classes when a reference is returned. */ Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); } else { /* If returning a reference, initialize the pointer to a sane default - if a C# exception occurs, then the pointer returns something other than a NULL-initialized reference. */ String *non_ref_type = Copy(returntype); /* Remove reference and const qualifiers */ Replaceall(non_ref_type, "r.", ""); Replaceall(non_ref_type, "q(const).", ""); Wrapper_add_localv(w, "result_default", "static", SwigType_str(non_ref_type, "result_default"), "=", SwigType_str(non_ref_type, "()"), NIL); Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= &result_default", NIL); Delete(non_ref_type); } Delete(base_typename); Delete(resolved_typename); } } else { SwigType *vt; vt = cplus_value_type(returntype); if (!vt) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } else { Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); Delete(vt); } } } /* Create the intermediate class wrapper */ tm = Swig_typemap_lookup("imtype", n, "", 0); if (tm) { String *imtypeout = Getattr(n, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; const String *im_directoroutattributes = Getattr(n, "tmap:imtype:directoroutattributes"); if (im_directoroutattributes) { Printf(callback_def, " %s\n", im_directoroutattributes); if (!ignored_method) Printf(director_delegate_definitions, " %s\n", im_directoroutattributes); } Printf(callback_def, " private %s SwigDirector%s(", tm, overloaded_name); if (!ignored_method) { const String *csdirectordelegatemodifiers = Getattr(n, "feature:csdirectordelegatemodifiers"); String *modifiers = (csdirectordelegatemodifiers ? NewStringf("%s%s", csdirectordelegatemodifiers, Len(csdirectordelegatemodifiers) > 0 ? " " : "") : NewStringf("public ")); Printf(director_delegate_definitions, " %sdelegate %s", modifiers, tm); Delete(modifiers); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s\n", SwigType_str(returntype, 0)); } if ((c_ret_type = Swig_typemap_lookup("ctype", n, "", 0))) { if (!is_void && !ignored_method) { String *jretval_decl = NewStringf("%s jresult", c_ret_type); Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); Delete(jretval_decl); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Swig_director_parms_fixup(l); /* Attach the standard typemaps */ Swig_typemap_attach_parms("out", l, 0); Swig_typemap_attach_parms("ctype", l, 0); Swig_typemap_attach_parms("imtype", l, 0); Swig_typemap_attach_parms("cstype", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("csdirectorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); /* Preamble code */ if (!ignored_method) Printf(w->code, "if (!swig_callback%s) {\n", overloaded_name); if (!pure_virtual) { String *super_call = Swig_method_call(super, l); if (is_void) { Printf(w->code, "%s;\n", super_call); if (!ignored_method) Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", super_call); } Delete(super_call); } else { Printf(w->code, " throw Swig::DirectorPureVirtualException(\"%s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } if (!ignored_method) Printf(w->code, "} else {\n"); /* Go through argument list, convert from native to C# */ for (i = 0, p = l; p; ++i) { /* Is this superfluous? */ while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } SwigType *pt = Getattr(p, "type"); String *ln = makeParameterName(n, p, i, false); String *c_param_type = NULL; String *c_decl = NewString(""); String *arg = NewString(""); Printf(arg, "j%s", ln); /* And add to the upcall args */ if (i > 0) Printf(jupcall_args, ", "); Printf(jupcall_args, "%s", arg); /* Get parameter's intermediary C type */ if ((c_param_type = Getattr(p, "tmap:ctype"))) { String *ctypeout = Getattr(p, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap if (ctypeout) c_param_type = ctypeout; /* Add to local variables */ Printf(c_decl, "%s %s", c_param_type, arg); if (!ignored_method) Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); /* Add input marshalling code */ if ((tm = Getattr(p, "tmap:directorin"))) { Setattr(p, "emit:directorinput", arg); Replaceall(tm, "$input", arg); Replaceall(tm, "$owner", "0"); if (Len(tm)) if (!ignored_method) Printf(w->code, "%s\n", tm); /* Add C type to callback typedef */ if (i > 0) Printf(callback_typedef_parms, ", "); Printf(callback_typedef_parms, "%s", c_param_type); /* Add parameter to the intermediate class code if generating the * intermediate's upcall code */ if ((tm = Getattr(p, "tmap:imtype"))) { String *imtypeout = Getattr(p, "tmap:imtype:out"); // the type in the imtype typemap's out attribute overrides the type in the typemap if (imtypeout) tm = imtypeout; const String *im_directorinattributes = Getattr(p, "tmap:imtype:directorinattributes"); String *din = Copy(Getattr(p, "tmap:csdirectorin")); if (din) { Replaceall(din, "$module", module_class_name); Replaceall(din, "$imclassname", imclass_name); substituteClassname(pt, din); Replaceall(din, "$iminput", ln); // pre and post attribute support String *pre = Getattr(p, "tmap:csdirectorin:pre"); if (pre) { substituteClassname(pt, pre); Replaceall(pre, "$iminput", ln); if (Len(pre_code) > 0) Printf(pre_code, "\n"); Printv(pre_code, pre, NIL); } String *post = Getattr(p, "tmap:csdirectorin:post"); if (post) { substituteClassname(pt, post); Replaceall(post, "$iminput", ln); if (Len(post_code) > 0) Printf(post_code, "\n"); Printv(post_code, post, NIL); } String *terminator = Getattr(p, "tmap:csdirectorin:terminator"); if (terminator) { substituteClassname(pt, terminator); Replaceall(terminator, "$iminput", ln); if (Len(terminator_code) > 0) Insert(terminator_code, 0, "\n"); Insert(terminator_code, 0, terminator); } if (i > 0) { Printf(delegate_parms, ", "); Printf(proxy_method_types, ", "); Printf(imcall_args, ", "); } Printf(delegate_parms, "%s%s %s", im_directorinattributes ? im_directorinattributes : empty_string, tm, ln); if (Cmp(din, ln)) { Printv(imcall_args, din, NIL); } else Printv(imcall_args, ln, NIL); /* Get the C# parameter type */ if ((tm = Getattr(p, "tmap:cstype"))) { substituteClassname(pt, tm); if (Strncmp(tm, "ref ", 4) == 0) { Replace(tm, "ref ", "", DOH_REPLACE_FIRST); Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else if (Strncmp(tm, "out ", 4) == 0) { Replace(tm, "out ", "", DOH_REPLACE_FIRST); Printf(proxy_method_types, "typeof(%s).MakeByRefType()", tm); } else { Printf(proxy_method_types, "typeof(%s)", tm); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No cstype typemap defined for %s\n", SwigType_str(pt, 0)); } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF, input_file, line_number, "No csdirectorin typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No imtype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } p = Getattr(p, "tmap:directorin:next"); } else { Swig_warning(WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF, input_file, line_number, "No or improper directorin typemap defined for argument %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); p = nextSibling(p); output_director = false; } } else { Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s for use in %s::%s (skipping director method)\n", SwigType_str(pt, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; p = nextSibling(p); } Delete(ln); Delete(arg); Delete(c_decl); } /* header declaration, start wrapper definition */ String *target; SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Add any exception specifications to the methods in the director class ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0)); Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0)); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* Finish off the inherited upcall's definition */ Printf(callback_def, "%s)", delegate_parms); Printf(callback_def, " {\n"); /* Emit the intermediate class's upcall to the actual class */ String *upcall = NewStringf("%s(%s)", symname, imcall_args); if ((tm = Swig_typemap_lookup("csdirectorout", n, "", 0))) { substituteClassname(returntype, tm); Replaceall(tm, "$cscall", upcall); if (!is_void) Insert(tm, 0, "return "); Replaceall(tm, "\n ", "\n "); // add extra indentation to code in typemap // pre and post attribute support bool is_pre_code = Len(pre_code) > 0; bool is_post_code = Len(post_code) > 0; bool is_terminator_code = Len(terminator_code) > 0; if (is_pre_code && is_post_code) Printf(callback_code, "%s\n try {\n %s;\n } finally {\n%s\n }\n", pre_code, tm, post_code); else if (is_pre_code) Printf(callback_code, "%s\n %s;\n", pre_code, tm); else if (is_post_code) Printf(callback_code, " try {\n %s;\n } finally {\n%s\n }\n", tm, post_code); else Printf(callback_code, " %s;\n", tm); if (is_terminator_code) Printv(callback_code, "\n", terminator_code, NIL); } Printf(callback_code, " }\n"); Delete(upcall); if (!ignored_method) { if (!is_void) Printf(w->code, "jresult = (%s) ", c_ret_type); Printf(w->code, "swig_callback%s(%s);\n", overloaded_name, jupcall_args); if (!is_void) { String *jresult_str = NewString("jresult"); String *result_str = NewString("c_result"); /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", n, result_str, w))) { Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s used in %s::%s (skipping director method)\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); output_director = false; } Delete(jresult_str); Delete(result_str); } /* Marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout"))) { canThrow(n, "directorargout", p); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* Terminate wrapper code */ Printf(w->code, "}\n"); if (!is_void) Printf(w->code, "return %s;", qualified_return); } Printf(w->code, "}"); // We expose virtual protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK && output_director) { if (!is_void) { Replaceall(w->code, "$null", qualified_return); } else { Replaceall(w->code, "$null", ""); } if (!ignored_method) Printv(director_delegate_callback, "\n", callback_def, callback_code, NIL); if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } if (!ignored_method) { /* Emit the actual upcall through */ UpcallData *udata = addUpcallMethod(imclass_dmethod, symname, decl, overloaded_name); String *methid = Getattr(udata, "class_methodidx"); Setattr(n, "upcalldata", udata); /* Printf(stdout, "setting upcalldata, nodeType: %s %s::%s %p\n", nodeType(n), classname, Getattr(n, "name"), n); */ Printf(director_callback_typedefs, " typedef %s (SWIGSTDCALL* SWIG_Callback%s_t)(", c_ret_type, methid); Printf(director_callback_typedefs, "%s);\n", callback_typedef_parms); Printf(director_callbacks, " SWIG_Callback%s_t swig_callback%s;\n", methid, overloaded_name); Printf(director_delegate_definitions, " SwigDelegate%s_%s(%s);\n", classname, methid, delegate_parms); Printf(director_delegate_instances, " private SwigDelegate%s_%s swigDelegate%s;\n", classname, methid, methid); Printf(director_method_types, " private static global::System.Type[] swigMethodTypes%s = new global::System.Type[] { %s };\n", methid, proxy_method_types); Printf(director_connect_parms, "SwigDirector%s%s delegate%s", classname, methid, methid); } Delete(pre_code); Delete(post_code); Delete(terminator_code); Delete(qualified_return); Delete(declaration); Delete(callback_typedef_parms); Delete(delegate_parms); Delete(proxy_method_types); Delete(callback_def); Delete(callback_code); Delete(dirclassname); DelWrapper(w); return status; } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = parentNode(n); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *dirclassname = directorClassName(parent); String *sub = NewString(""); Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms; int argidx = 0; /* Assign arguments to superclass's parameters, if not already done */ for (p = superparms; p; p = nextSibling(p)) { String *pname = Getattr(p, "name"); if (!pname) { pname = NewStringf("arg%d", argidx++); Setattr(p, "name", pname); } } // TODO: Is this copy needed? parms = CopyParmList(superparms); if (!Getattr(n, "defaultargs")) { /* constructor */ { String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, dirclassname, parms, 0, 0); String *call = Swig_csuperclass_call(0, basetype, superparms); Printf(f_directors, "%s::%s : %s, %s {\n", dirclassname, target, call, Getattr(parent, "director:ctor")); Printf(f_directors, " swig_init_callbacks();\n"); Printf(f_directors, "}\n\n"); Delete(target); Delete(call); } /* constructor header */ { String *target = Swig_method_decl(0, decl, dirclassname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(supername); Delete(parms); Delete(dirclassname); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *dirclassname = directorClassName(n); String *classtype = SwigType_namestr(Getattr(n, "name")); Wrapper *w = NewWrapper(); Printf(w->def, "%s::%s() : %s {", dirclassname, dirclassname, Getattr(n, "director:ctor")); Printf(w->code, "}\n"); Wrapper_print(w, f_directors); Printf(f_directors_h, " %s();\n", dirclassname); DelWrapper(w); Delete(classtype); Delete(dirclassname); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { Delete(none_comparison); none_comparison = NewString(""); // not used Delete(director_ctor_code); director_ctor_code = NewString("$director_new"); directorDeclaration(n); Printf(f_directors_h, "%s {\n", Getattr(n, "director:decl")); Printf(f_directors_h, "\npublic:\n"); /* Keep track of the director methods for this class */ first_class_dmethod = curr_class_dmethod = n_dmethods; director_callback_typedefs = NewString(""); director_callbacks = NewString(""); director_delegate_callback = NewString(""); director_delegate_definitions = NewString(""); director_delegate_instances = NewString(""); director_method_types = NewString(""); director_connect_parms = NewString(""); return Language::classDirectorInit(n); } int classDeclaration(Node *n) { String *old_director_callback_typedefs = director_callback_typedefs; String *old_director_callbacks = director_callbacks; String *old_director_delegate_callback = director_delegate_callback; String *old_director_delegate_definitions = director_delegate_definitions; String *old_director_delegate_instances = director_delegate_instances; String *old_director_method_types = director_method_types; String *old_director_connect_parms = director_connect_parms; int ret = Language::classDeclaration(n); // these variables are deleted in emitProxyClassDefAndCPPCasts, hence no Delete here director_callback_typedefs = old_director_callback_typedefs; director_callbacks = old_director_callbacks; director_delegate_callback = old_director_delegate_callback; director_delegate_definitions = old_director_delegate_definitions; director_delegate_instances = old_director_delegate_instances; director_method_types = old_director_method_types; director_connect_parms = old_director_connect_parms; return ret; } /* ---------------------------------------------------------------------- * classDirectorDestructor() * ---------------------------------------------------------------------- */ int classDirectorDestructor(Node *n) { Node *current_class = getCurrentClass(); String *dirclassname = directorClassName(current_class); Wrapper *w = NewWrapper(); if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw ();\n", dirclassname); Printf(w->def, "%s::~%s() throw () {\n", dirclassname, dirclassname); } else { Printf(f_directors_h, " virtual ~%s();\n", dirclassname); Printf(w->def, "%s::~%s() {\n", dirclassname, dirclassname); } Printv(w->code, "}\n", NIL); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { int i; String *dirclassname = directorClassName(n); Wrapper *w = NewWrapper(); if (Len(director_callback_typedefs) > 0) { Printf(f_directors_h, "\n%s", director_callback_typedefs); } Printf(f_directors_h, " void swig_connect_director("); Printf(w->def, "void %s::swig_connect_director(", dirclassname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *methid = Getattr(udata, "class_methodidx"); String *overname = Getattr(udata, "overname"); Printf(f_directors_h, "SWIG_Callback%s_t callback%s", methid, overname); Printf(w->def, "SWIG_Callback%s_t callback%s", methid, overname); Printf(w->code, "swig_callback%s = callback%s;\n", overname, overname); if (i != curr_class_dmethod - 1) { Printf(f_directors_h, ", "); Printf(w->def, ", "); } } Printf(f_directors_h, ");\n"); Printf(w->def, ") {"); if (Len(director_callbacks) > 0) { Printf(f_directors_h, "\nprivate:\n%s", director_callbacks); } Printf(f_directors_h, " void swig_init_callbacks();\n"); Printf(f_directors_h, "};\n\n"); Printf(w->code, "}\n\n"); Printf(w->code, "void %s::swig_init_callbacks() {\n", dirclassname); for (i = first_class_dmethod; i < curr_class_dmethod; ++i) { UpcallData *udata = Getitem(dmethods_seq, i); String *overname = Getattr(udata, "overname"); Printf(w->code, "swig_callback%s = 0;\n", overname); } Printf(w->code, "}"); Wrapper_print(w, f_directors); DelWrapper(w); Delete(dirclassname); return Language::classDirectorEnd(n); } /* -------------------------------------------------------------------- * classDirectorDisown() * ------------------------------------------------------------------*/ virtual int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * directorDeclaration() * * Generate the director class's declaration * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" *--------------------------------------------------------------------*/ void directorDeclaration(Node *n) { String *base = Getattr(n, "classtype"); String *class_ctor = NewString("Swig::Director()"); String *dirclassname = directorClassName(n); String *declaration = Swig_class_declaration(n, dirclassname); Printf(declaration, " : public %s, public Swig::Director", base); // Stash stuff for later. Setattr(n, "director:decl", declaration); Setattr(n, "director:ctor", class_ctor); Delete(dirclassname); } /*---------------------------------------------------------------------- * nestedClassesSupport() *--------------------------------------------------------------------*/ NestedClassSupport nestedClassesSupport() const { return NCS_Full; } }; /* class CSHARP */ /* ----------------------------------------------------------------------------- * swig_csharp() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_csharp() { return new CSHARP(); } extern "C" Language *swig_csharp(void) { return new_swig_csharp(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *CSHARP::usage = "\ C# Options (available with -csharp)\n\ -dllimport
- Override DllImport attribute name to
\n\ -namespace - Generate wrappers into C# namespace \n\ -noproxy - Generate the low-level functional interface instead\n\ of proxy classes\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -outfile - Write all C# into a single located in the output directory\n\ \n"; swig-3.0.12/Source/Modules/clisp.cxx0000664000175000017500000003213613042756442017150 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * clisp.cxx * * clisp language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" static const char *usage = "\ CLISP Options (available with -clisp)\n\ -extern-all - Create clisp definitions for all the functions and\n\ global variables otherwise only definitions for\n\ externed functions and variables are created.\n\ -generate-typedef - Use def-c-type to generate shortcuts according to the\n\ typedefs in the input.\n\ "; class CLISP:public Language { public: File *f_cl; String *module; virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int typedefHandler(Node *n); List *entries; private: String *get_ffi_type(Node *n, SwigType *ty); String *convert_literal(String *num_param, String *type); String *strip_parens(String *string); int extern_all_flag; int generate_typedef_flag; int is_function; }; void CLISP::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGCLISP 1", 0); SWIG_library_directory("clisp"); SWIG_config_file("clisp.swg"); generate_typedef_flag = 0; extern_all_flag = 0; for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } else if ((Strcmp(argv[i], "-extern-all") == 0)) { extern_all_flag = 1; Swig_mark_arg(i); } else if ((Strcmp(argv[i], "-generate-typedef") == 0)) { generate_typedef_flag = 1; Swig_mark_arg(i); } } } int CLISP::top(Node *n) { File *f_null = NewString(""); module = Getattr(n, "name"); String *output_filename; entries = NewList(); /* Get the output file name */ String *outfile = Getattr(n, "outfile"); if (!outfile) { Printf(stderr, "Unable to determine outfile\n"); SWIG_exit(EXIT_FAILURE); } output_filename = NewStringf("%s%s.lisp", SWIG_output_directory(), module); f_cl = NewFile(output_filename, "w+", SWIG_output_files()); if (!f_cl) { FileErrorDisplay(output_filename); SWIG_exit(EXIT_FAILURE); } Swig_register_filebyname("header", f_null); Swig_register_filebyname("begin", f_null); Swig_register_filebyname("runtime", f_null); Swig_register_filebyname("wrapper", f_null); String *header = NewString(""); Swig_banner_target_lang(header, ";;"); Printf(header, "\n(defpackage :%s\n (:use :common-lisp :ffi)", module); Language::top(n); Iterator i; long len = Len(entries); if (len > 0) { Printf(header, "\n (:export"); } //else nothing to export for (i = First(entries); i.item; i = Next(i)) { Printf(header, "\n\t:%s", i.item); } if (len > 0) { Printf(header, ")"); } Printf(header, ")\n"); Printf(header, "\n(in-package :%s)\n", module); Printf(header, "\n(default-foreign-language :stdc)\n"); len = Tell(f_cl); Printf(f_cl, "%s", header); long end = Tell(f_cl); for (len--; len >= 0; len--) { end--; (void)Seek(f_cl, len, SEEK_SET); int ch = Getc(f_cl); (void)Seek(f_cl, end, SEEK_SET); Putc(ch, f_cl); } Seek(f_cl, 0, SEEK_SET); Write(f_cl, Char(header), Len(header)); Delete(f_cl); return SWIG_OK; } int CLISP::functionWrapper(Node *n) { is_function = 1; String *storage = Getattr(n, "storage"); if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) return SWIG_OK; String *func_name = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); int argnum = 0, first = 1; Printf(f_cl, "\n(ffi:def-call-out %s\n\t(:name \"%s\")\n", func_name, func_name); Append(entries, func_name); if (ParmList_len(pl) != 0) { Printf(f_cl, "\t(:arguments "); } for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); // SwigType *argtype; String *ffitype = get_ffi_type(n, Getattr(p, "type")); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(f_cl, "\n\t\t"); } Printf(f_cl, "(%s %s)", argname, ffitype); first = 0; Delete(ffitype); if (tempargname) Delete(argname); } if (ParmList_len(pl) != 0) { Printf(f_cl, ")\n"); /* finish arg list */ } String *ffitype = get_ffi_type(n, Getattr(n, "type")); if (Strcmp(ffitype, "NIL")) { //when return type is not nil Printf(f_cl, "\t(:return-type %s)\n", ffitype); } Printf(f_cl, "\t(:library +library-name+))\n"); return SWIG_OK; } int CLISP::constantWrapper(Node *n) { is_function = 0; String *type = Getattr(n, "type"); String *converted_value = convert_literal(Getattr(n, "value"), type); String *name = Getattr(n, "sym:name"); Printf(f_cl, "\n(defconstant %s %s)\n", name, converted_value); Append(entries, name); Delete(converted_value); return SWIG_OK; } int CLISP::variableWrapper(Node *n) { is_function = 0; String *storage = Getattr(n, "storage"); if (!extern_all_flag && (!storage || (!Swig_storage_isextern(n) && !Swig_storage_isexternc(n)))) return SWIG_OK; String *var_name = Getattr(n, "sym:name"); String *lisp_type = get_ffi_type(n, Getattr(n, "type")); Printf(f_cl, "\n(ffi:def-c-var %s\n (:name \"%s\")\n (:type %s)\n", var_name, var_name, lisp_type); Printf(f_cl, "\t(:library +library-name+))\n"); Append(entries, var_name); Delete(lisp_type); return SWIG_OK; } int CLISP::typedefHandler(Node *n) { if (generate_typedef_flag) { is_function = 0; Printf(f_cl, "\n(ffi:def-c-type %s %s)\n", Getattr(n, "name"), get_ffi_type(n, Getattr(n, "type"))); } return Language::typedefHandler(n); } int CLISP::enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; is_function = 0; String *name = Getattr(n, "sym:name"); Printf(f_cl, "\n(ffi:def-c-enum %s ", name); for (Node *c = firstChild(n); c; c = nextSibling(c)) { String *slot_name = Getattr(c, "name"); String *value = Getattr(c, "enumvalue"); Printf(f_cl, "(%s %s)", slot_name, value); Append(entries, slot_name); Delete(value); } Printf(f_cl, ")\n"); return SWIG_OK; } // Includes structs int CLISP::classDeclaration(Node *n) { is_function = 0; String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); if (Strcmp(kind, "struct")) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } Printf(f_cl, "\n(ffi:def-c-struct %s", name); Append(entries, NewStringf("make-%s", name)); for (Node *c = firstChild(n); c; c = nextSibling(c)) { if (Strcmp(nodeType(c), "cdecl")) { Printf(stderr, "Structure %s has a slot that we can't deal with.\n", name); Printf(stderr, "nodeType: %s, name: %s, type: %s\n", nodeType(c), Getattr(c, "name"), Getattr(c, "type")); SWIG_exit(EXIT_FAILURE); } String *temp = Copy(Getattr(c, "decl")); if (temp) { Append(temp, Getattr(c, "type")); //appending type to the end, otherwise wrong type String *lisp_type = get_ffi_type(n, temp); Delete(temp); String *slot_name = Getattr(c, "sym:name"); Printf(f_cl, "\n\t(%s %s)", slot_name, lisp_type); Append(entries, NewStringf("%s-%s", name, slot_name)); Delete(lisp_type); } } Printf(f_cl, ")\n"); /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); // add_defined_foreign_type(name); return SWIG_OK; } /* utilities */ /* returns new string w/ parens stripped */ String *CLISP::strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } String *CLISP::convert_literal(String *num_param, String *type) { String *num = strip_parens(num_param), *res; char *s = Char(num); /* Make sure doubles use 'd' instead of 'e' */ if (!Strcmp(type, "double")) { String *updated = Copy(num); if (Replace(updated, "e", "d", DOH_REPLACE_ANY) > 1) { Printf(stderr, "Weird!! number %s looks invalid.\n", num); SWIG_exit(EXIT_FAILURE); } Delete(num); return updated; } if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ return NewStringf("#\\%s", num_param); } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ return NewStringf("\"%s\"", num_param); } if (Len(num) < 2 || s[0] != '0') { return num; } /* octal or hex */ res = NewStringf("#%c%s", s[1] == 'x' ? 'x' : 'o', s + 2); Delete(num); return res; } String *CLISP::get_ffi_type(Node *n, SwigType *ty) { Node *node = NewHash(); Setattr(node, "type", ty); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("in", node, "", 0); Delete(node); if (tm) { return NewString(tm); } else if (SwigType_ispointer(ty)) { SwigType *cp = Copy(ty); SwigType_del_pointer(cp); String *inner_type = get_ffi_type(n, cp); if (SwigType_isfunction(cp)) { return inner_type; } SwigType *base = SwigType_base(ty); String *base_name = SwigType_str(base, 0); String *str; if (!Strcmp(base_name, "int") || !Strcmp(base_name, "float") || !Strcmp(base_name, "short") || !Strcmp(base_name, "double") || !Strcmp(base_name, "long") || !Strcmp(base_name, "char")) { str = NewStringf("(ffi:c-ptr %s)", inner_type); } else { str = NewStringf("(ffi:c-pointer %s)", inner_type); } Delete(base_name); Delete(base); Delete(cp); Delete(inner_type); return str; } else if (SwigType_isarray(ty)) { SwigType *cp = Copy(ty); String *array_dim = SwigType_array_getdim(ty, 0); if (!Strcmp(array_dim, "")) { //dimension less array convert to pointer Delete(array_dim); SwigType_del_array(cp); SwigType_add_pointer(cp); String *str = get_ffi_type(n, cp); Delete(cp); return str; } else { SwigType_pop_arrays(cp); String *inner_type = get_ffi_type(n, cp); Delete(cp); int ndim = SwigType_array_ndim(ty); String *dimension; if (ndim == 1) { dimension = array_dim; } else { dimension = array_dim; for (int i = 1; i < ndim; i++) { array_dim = SwigType_array_getdim(ty, i); Append(dimension, " "); Append(dimension, array_dim); Delete(array_dim); } String *temp = dimension; dimension = NewStringf("(%s)", dimension); Delete(temp); } String *str; if (is_function) str = NewStringf("(ffi:c-ptr (ffi:c-array %s %s))", inner_type, dimension); else str = NewStringf("(ffi:c-array %s %s)", inner_type, dimension); Delete(inner_type); Delete(dimension); return str; } } else if (SwigType_isfunction(ty)) { SwigType *cp = Copy(ty); SwigType *fn = SwigType_pop_function(cp); String *args = NewString(""); ParmList *pl = SwigType_function_parms(fn, n); if (ParmList_len(pl) != 0) { Printf(args, "(:arguments "); } int argnum = 0, first = 1; for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); SwigType *argtype = Getattr(p, "type"); String *ffitype = get_ffi_type(n, argtype); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } if (!first) { Printf(args, "\n\t\t"); } Printf(args, "(%s %s)", argname, ffitype); first = 0; Delete(ffitype); if (tempargname) Delete(argname); } if (ParmList_len(pl) != 0) { Printf(args, ")\n"); /* finish arg list */ } String *ffitype = get_ffi_type(n, cp); String *str = NewStringf("(ffi:c-function %s \t\t\t\t(:return-type %s))", args, ffitype); Delete(fn); Delete(args); Delete(cp); Delete(ffitype); return str; } String *str = SwigType_str(ty, 0); if (str) { char *st = Strstr(str, "struct"); if (st) { st += 7; return NewString(st); } char *cl = Strstr(str, "class"); if (cl) { cl += 6; return NewString(cl); } } return str; } extern "C" Language *swig_clisp(void) { return new CLISP(); } swig-3.0.12/Source/Modules/scilab.cxx0000664000175000017500000012261613042756442017276 0ustar williamwilliam/* ---------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * scilab.cxx * * Scilab language module for SWIG. * --------------------------------------------------------------------------*/ #include "swigmod.h" static const int SCILAB_IDENTIFIER_NAME_CHAR_MAX = 24; static const int SCILAB_VARIABLE_NAME_CHAR_MAX = SCILAB_IDENTIFIER_NAME_CHAR_MAX - 4; static const char *usage = (char *) " \ Scilab options (available with -scilab)\n \ -builder - Generate a Scilab builder script\n \ -buildercflags - Add to the builder compiler flags\n \ -builderflagscript - Set the Scilab script to use by builder to configure the build flags\n \ -builderldflags - Add to the builder linker flags\n \ -buildersources - Add the (comma separated) files to the builder sources\n \ -builderverbositylevel - Set the builder verbosity level to (default 0: off, 2: high)\n \ -gatewayxml - Generate gateway xml with the given \n \ \n"; class SCILAB:public Language { protected: /* General objects used for holding the strings */ File *beginSection; File *runtimeSection; File *headerSection; File *wrappersSection; File *initSection; String *variablesCode; bool generateBuilder; File *builderFile; String *builderCode; int builderFunctionCount; List *sourceFileList; List *cflags; List *ldflags; String *verboseBuildLevel; String *buildFlagsScript; String *gatewayHeader; String *gatewayHeaderV5; String *gatewayHeaderV6; bool createGatewayXML; File *gatewayXMLFile; String *gatewayXML; String *gatewayID; int primitiveID; bool createLoader; File *loaderFile; String *loaderScript; public: /* ------------------------------------------------------------------------ * main() * ----------------------------------------------------------------------*/ virtual void main(int argc, char *argv[]) { generateBuilder = false; sourceFileList = NewList(); cflags = NewList(); ldflags = NewList(); verboseBuildLevel = NULL; buildFlagsScript = NULL; gatewayHeader = NULL; gatewayHeaderV5 = NULL; gatewayHeaderV6 = NULL; createGatewayXML = false; gatewayXML = NULL; gatewayXMLFile = NULL; gatewayID = NULL; createLoader = true; loaderFile = NULL; loaderScript = NULL; /* Manage command line arguments */ for (int argIndex = 1; argIndex < argc; argIndex++) { if (argv[argIndex] != NULL) { if (strcmp(argv[argIndex], "-help") == 0) { Printf(stdout, "%s\n", usage); } else if (strcmp(argv[argIndex], "-builder") == 0) { Swig_mark_arg(argIndex); generateBuilder = true; createLoader = false; } else if (strcmp(argv[argIndex], "-buildersources") == 0) { if (argv[argIndex + 1] != NULL) { Swig_mark_arg(argIndex); char *sourceFile = strtok(argv[argIndex + 1], ","); while (sourceFile != NULL) { Insert(sourceFileList, Len(sourceFileList), sourceFile); sourceFile = strtok(NULL, ","); } Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-buildercflags") == 0) { Swig_mark_arg(argIndex); if (argv[argIndex + 1] != NULL) { Insert(cflags, Len(cflags), argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-builderldflags") == 0) { Swig_mark_arg(argIndex); if (argv[argIndex + 1] != NULL) { Insert(ldflags, Len(ldflags), argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } else if (strcmp(argv[argIndex], "-builderverbositylevel") == 0) { Swig_mark_arg(argIndex); verboseBuildLevel = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-builderflagscript") == 0) { Swig_mark_arg(argIndex); buildFlagsScript = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } else if (strcmp(argv[argIndex], "-gatewayxml") == 0) { Swig_mark_arg(argIndex); createGatewayXML = true; gatewayID = NewString(argv[argIndex + 1]); Swig_mark_arg(argIndex + 1); } } } if (verboseBuildLevel == NULL) { verboseBuildLevel = NewString("0"); } /* Set language-specific subdirectory in SWIG library */ SWIG_library_directory("scilab"); /* Add a symbol to the parser for conditional compilation */ Preprocessor_define("SWIGSCILAB 1", 0); /* Set scilab configuration file */ SWIG_config_file("scilab.swg"); /* Set typemap for scilab */ SWIG_typemap_lang("scilab"); allow_overloading(); } /* ------------------------------------------------------------------------ * top() * ----------------------------------------------------------------------*/ virtual int top(Node *node) { /* Get the module name */ String *gatewayName = Getattr(node, "name"); // Set library name String *gatewayLibraryName = NewStringf("lib%s", gatewayName); /* Get the output file name */ String *outputFilename = Getattr(node, "outfile"); /* Initialize I/O */ beginSection = NewFile(outputFilename, "w", SWIG_output_files()); if (!beginSection) { FileErrorDisplay(outputFilename); SWIG_exit(EXIT_FAILURE); } runtimeSection = NewString(""); initSection = NewString(""); headerSection = NewString(""); wrappersSection = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", beginSection); Swig_register_filebyname("header", headerSection); Swig_register_filebyname("wrapper", wrappersSection); Swig_register_filebyname("runtime", runtimeSection); Swig_register_filebyname("init", initSection); /* Output module initialization code */ Swig_banner(beginSection); Printf(runtimeSection, "\n\n#ifndef SWIGSCILAB\n#define SWIGSCILAB\n#endif\n\n"); // Gateway header source merged with wrapper source in nobuilder mode if (!generateBuilder) startGatewayHeader(gatewayLibraryName); // Create builder file if required if (generateBuilder) { createBuilderFile(outputFilename); } // Create gateway XML if required if (createGatewayXML) { createGatewayXMLFile(gatewayName); } // Create loader script if required if (createLoader) { createLoaderFile(gatewayLibraryName); } // Module initialization function String *gatewayInitFunctionName = NewStringf("%s_Init", gatewayName); /* Add initialization function to builder table */ addFunctionToScilab(gatewayInitFunctionName, gatewayInitFunctionName); // Add helper functions to builder table addHelperFunctions(); // Open Scilab wrapper variables creation function variablesCode = NewString(""); Printf(variablesCode, "int SWIG_CreateScilabVariables(void *_pvApiCtx) {"); /* Emit code for children */ if (CPlusPlus) { Printf(wrappersSection, "extern \"C\" {\n"); } Language::top(node); if (CPlusPlus) { Printf(wrappersSection, "}\n"); } // Close Scilab wrapper variables creation function Printf(variablesCode, " return SWIG_OK;\n}\n"); // Add Builder footer code and save if (generateBuilder) { saveBuilderFile(gatewayName); } /* Close the init function and rename with module name */ Printf(initSection, "return 0;\n}\n"); Replaceall(initSection, "", gatewayName); /* Write all to the wrapper file */ SwigType_emit_type_table(runtimeSection, wrappersSection); // Declare pointer types, ... (Ex: SWIGTYPE_p_p_double) // Gateway header source merged with wrapper source in nobuilder mode if (!generateBuilder) { terminateGatewayHeader(gatewayLibraryName); Printv(initSection, gatewayHeader, NIL); } Dump(runtimeSection, beginSection); Dump(headerSection, beginSection); Dump(wrappersSection, beginSection); Dump(variablesCode, beginSection); Wrapper_pretty_print(initSection, beginSection); if (createGatewayXML) { saveGatewayXMLFile(); } if (createLoader) { saveLoaderFile(gatewayLibraryName); } /* Cleanup files */ Delete(runtimeSection); Delete(headerSection); Delete(wrappersSection); Delete(initSection); Delete(beginSection); Delete(sourceFileList); Delete(cflags); Delete(ldflags); return SWIG_OK; } /* ------------------------------------------------------------------------ * emitBanner() * ----------------------------------------------------------------------*/ void emitBanner(File *f) { Printf(f, "// ----------------------------------------------------------------------------\n"); Swig_banner_target_lang(f, "// "); Printf(f, "// ----------------------------------------------------------------------------- */\n\n"); } /* ------------------------------------------------------------------------ * functionWrapper() * ----------------------------------------------------------------------*/ virtual int functionWrapper(Node *node) { /* Get some useful attributes of this function */ String *functionName = Getattr(node, "sym:name"); SwigType *functionReturnType = Getattr(node, "type"); ParmList *functionParamsList = Getattr(node, "parms"); int paramIndex = 0; // Used for loops over ParmsList Parm *param = NULL; // Used for loops over ParamsList /* Create the wrapper object */ Wrapper *wrapper = NewWrapper(); /* Create the function wrapper name */ String *wrapperName = Swig_name_wrapper(functionName); /* Deal with overloading */ String *overloadedName = Copy(wrapperName); /* Determine whether the function is overloaded or not */ bool isOverloaded = ! !Getattr(node, "sym:overloaded"); /* Determine whether the function is the last overloaded */ bool isLastOverloaded = isOverloaded && !Getattr(node, "sym:nextSibling"); if (!isOverloaded && !addSymbol(functionName, node)) { DelWrapper(wrapper); return SWIG_ERROR; } if (isOverloaded) { Append(overloadedName, Getattr(node, "sym:overname")); } /* Write the wrapper function definition (standard Scilab gateway function prototype) */ Printv(wrapper->def, "int ", overloadedName, "(SWIG_GatewayParameters) {", NIL); /* Emit all of the local variables for holding arguments */ // E.g.: double arg1; emit_parameter_variables(functionParamsList, wrapper); /* Attach typemaps to the parameter list */ // Add local variables used in typemaps (iRows, iCols, ...) emit_attach_parmmaps(functionParamsList, wrapper); Setattr(node, "wrap:parms", functionParamsList); /* Check input/output arguments count */ int maxInputArguments = emit_num_arguments(functionParamsList); int minInputArguments = emit_num_required(functionParamsList); int minOutputArguments = 0; int maxOutputArguments = 0; if (!emit_isvarargs(functionParamsList)) { Printf(wrapper->code, "SWIG_CheckInputArgument(pvApiCtx, $mininputarguments, $maxinputarguments);\n"); } else { Printf(wrapper->code, "SWIG_CheckInputArgumentAtLeast(pvApiCtx, $mininputarguments-1);\n"); } Printf(wrapper->code, "SWIG_CheckOutputArgument(pvApiCtx, $minoutputarguments, $maxoutputarguments);\n"); /* Set context */ Printf(wrapper->code, "SWIG_Scilab_SetFuncName(fname);\n"); Printf(wrapper->code, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); /* Write typemaps(in) */ for (paramIndex = 0, param = functionParamsList; paramIndex < maxInputArguments; ++paramIndex) { // Ignore parameter if the typemap specifies numinputs=0 while (checkAttribute(param, "tmap:in:numinputs", "0")) { param = Getattr(param, "tmap:in:next"); } SwigType *paramType = Getattr(param, "type"); String *paramTypemap = Getattr(param, "tmap:in"); if (paramTypemap) { // Replace $input by the position on Scilab stack String *source = NewString(""); Printf(source, "%d", paramIndex + 1); Setattr(param, "emit:input", source); Replaceall(paramTypemap, "$input", Getattr(param, "emit:input")); if (Getattr(param, "wrap:disown") || (Getattr(param, "tmap:in:disown"))) { Replaceall(paramTypemap, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(paramTypemap, "$disown", "0"); } if (paramIndex >= minInputArguments) { /* Optional input argument management */ Printf(wrapper->code, "if (SWIG_NbInputArgument(pvApiCtx) > %d) {\n%s\n}\n", paramIndex, paramTypemap); } else { Printf(wrapper->code, "%s\n", paramTypemap); } param = Getattr(param, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(paramType, 0)); break; } } /* TODO write constraints */ Setattr(node, "wrap:name", overloadedName); /* Emit the function call */ Swig_director_emit_dynamic_cast(node, wrapper); String *functionActionCode = emit_action(node); /* Insert the return variable */ emit_return_variable(node, functionReturnType, wrapper); /* Return the function value if necessary */ String *functionReturnTypemap = Swig_typemap_lookup_out("out", node, Swig_cresult_name(), wrapper, functionActionCode); if (functionReturnTypemap) { // Result is actually the position of output value on stack if (Len(functionReturnTypemap) > 0) { Printf(wrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); } Replaceall(functionReturnTypemap, "$result", "1"); if (GetFlag(node, "feature:new")) { Replaceall(functionReturnTypemap, "$owner", "1"); } else { Replaceall(functionReturnTypemap, "$owner", "0"); } Printf(wrapper->code, "%s\n", functionReturnTypemap); /* If the typemap is not empty, the function return one more argument than the typemaps gives */ if (Len(functionReturnTypemap) > 0) { minOutputArguments++; maxOutputArguments++; } Delete(functionReturnTypemap); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(functionReturnType, 0), functionName); } /* Write typemaps(out) */ for (param = functionParamsList; param;) { String *paramTypemap = Getattr(param, "tmap:argout"); if (paramTypemap) { minOutputArguments++; maxOutputArguments++; Printf(wrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", minOutputArguments); String *result = NewString(""); Printf(result, "%d", minOutputArguments); Replaceall(paramTypemap, "$result", result); Printf(wrapper->code, "%s\n", paramTypemap); Delete(paramTypemap); param = Getattr(param, "tmap:argout:next"); } else { param = nextSibling(param); } } /* Add cleanup code */ for (param = functionParamsList; param;) { String *tm; if ((tm = Getattr(param, "tmap:freearg"))) { if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(param, "lname")); Printf(wrapper->code, "%s\n", tm); } param = Getattr(param, "tmap:freearg:next"); } else { param = nextSibling(param); } } /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", node, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(wrapper->code, "%s\n", tm); Delete(tm); } /* Close the function(ok) */ Printv(wrapper->code, "return SWIG_OK;\n", NIL); Printv(wrapper->code, "}\n", NIL); /* Add the failure cleanup code */ /* TODO */ /* Final substititions if applicable */ Replaceall(wrapper->code, "$symname", functionName); /* Set CheckInputArgument and CheckOutputArgument input arguments */ /* In Scilab there is always one output even if not defined */ if (minOutputArguments == 0) { maxOutputArguments = 1; } String *argnumber = NewString(""); Printf(argnumber, "%d", minInputArguments); Replaceall(wrapper->code, "$mininputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", maxInputArguments); Replaceall(wrapper->code, "$maxinputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", minOutputArguments); Replaceall(wrapper->code, "$minoutputarguments", argnumber); argnumber = NewString(""); Printf(argnumber, "%d", maxOutputArguments); Replaceall(wrapper->code, "$maxoutputarguments", argnumber); /* Dump the function out */ Wrapper_print(wrapper, wrappersSection); String *scilabFunctionName = checkIdentifierName(functionName, SCILAB_IDENTIFIER_NAME_CHAR_MAX); /* Update builder.sce contents */ if (isLastOverloaded) { addFunctionToScilab(scilabFunctionName, wrapperName); dispatchFunction(node); } if (!isOverloaded) { addFunctionToScilab(scilabFunctionName, wrapperName); } /* tidy up */ Delete(overloadedName); Delete(wrapperName); DelWrapper(wrapper); return SWIG_OK; } /* ----------------------------------------------------------------------- * dispatchFunction() * ----------------------------------------------------------------------- */ void dispatchFunction(Node *node) { Wrapper *wrapper = NewWrapper(); String *functionName = Getattr(node, "sym:name"); String *wrapperName = Swig_name_wrapper(functionName); int maxargs = 0; /* Generate the dispatch function */ String *dispatch = Swig_overload_dispatch(node, "return %s(SWIG_GatewayArguments);", &maxargs); String *tmp = NewString(""); Printv(wrapper->def, "int ", wrapperName, "(SWIG_GatewayParameters) {\n", NIL); /* Get the number of the parameters */ Wrapper_add_local(wrapper, "argc", "int argc = SWIG_NbInputArgument(pvApiCtx)"); Printf(tmp, "int argv[%d] = {", maxargs); for (int j = 0; j < maxargs; ++j) { Printf(tmp, "%s%d", j ? "," : " ", j + 1); } Printf(tmp, "}"); Wrapper_add_local(wrapper, "argv", tmp); Printf(wrapper->code, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); /* Dump the dispatch function */ Printv(wrapper->code, dispatch, "\n", NIL); Printf(wrapper->code, "Scierror(999, _(\"No matching function for overload\"));\n"); Printf(wrapper->code, "return SWIG_ERROR;\n"); Printv(wrapper->code, "}\n", NIL); Wrapper_print(wrapper, wrappersSection); Delete(tmp); DelWrapper(wrapper); Delete(dispatch); Delete(wrapperName); } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *node) { /* Get information about variable */ String *origVariableName = Getattr(node, "name"); // Ex: Shape::nshapes String *variableName = Getattr(node, "sym:name"); // Ex; Shape_nshapes (can be used for function names, ...) // Variable names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" or "_set" added to function String *scilabVariableName = checkIdentifierName(variableName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Manage GET function */ Wrapper *getFunctionWrapper = NewWrapper(); String *getFunctionName = Swig_name_get(NSPACE_TODO, variableName); String *scilabGetFunctionName = Swig_name_get(NSPACE_TODO, scilabVariableName); Setattr(node, "wrap:name", getFunctionName); Printv(getFunctionWrapper->def, "int ", getFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(getFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 0, 0);\n"); Printf(getFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(getFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); String *varoutTypemap = Swig_typemap_lookup("varout", node, origVariableName, 0); if (varoutTypemap != NULL) { Printf(getFunctionWrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); Replaceall(varoutTypemap, "$value", origVariableName); Replaceall(varoutTypemap, "$result", "1"); emit_action_code(node, getFunctionWrapper->code, varoutTypemap); Delete(varoutTypemap); } Append(getFunctionWrapper->code, "return SWIG_OK;\n"); Append(getFunctionWrapper->code, "}\n"); Wrapper_print(getFunctionWrapper, wrappersSection); /* Add function to builder table */ addFunctionToScilab(scilabGetFunctionName, getFunctionName); /* Manage SET function */ if (is_assignable(node)) { Wrapper *setFunctionWrapper = NewWrapper(); String *setFunctionName = Swig_name_set(NSPACE_TODO, variableName); String *scilabSetFunctionName = Swig_name_set(NSPACE_TODO, scilabVariableName); Setattr(node, "wrap:name", setFunctionName); Printv(setFunctionWrapper->def, "int ", setFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(setFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 1, 1);\n"); Printf(setFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(setFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); String *varinTypemap = Swig_typemap_lookup("varin", node, origVariableName, 0); if (varinTypemap != NULL) { Replaceall(varinTypemap, "$input", "1"); emit_action_code(node, setFunctionWrapper->code, varinTypemap); Delete(varinTypemap); } Append(setFunctionWrapper->code, "return SWIG_OK;\n"); Append(setFunctionWrapper->code, "}\n"); Wrapper_print(setFunctionWrapper, wrappersSection); /* Add function to builder table */ addFunctionToScilab(scilabSetFunctionName, setFunctionName); DelWrapper(setFunctionWrapper); } DelWrapper(getFunctionWrapper); return SWIG_OK; } /* ----------------------------------------------------------------------- * constantWrapper() * ----------------------------------------------------------------------- */ virtual int constantWrapper(Node *node) { /* Get the useful information from the node */ String *nodeName = Getattr(node, "name"); SwigType *type = Getattr(node, "type"); String *constantName = Getattr(node, "sym:name"); String *rawValue = Getattr(node, "rawval"); String *constantValue = rawValue ? rawValue : Getattr(node, "value"); String *constantTypemap = NULL; // If feature scilab:const enabled, constants & enums are wrapped to Scilab variables if (GetFlag(node, "feature:scilab:const")) { bool isConstant = ((SwigType_issimple(type)) || (SwigType_type(type) == T_STRING)); bool isEnum = (Cmp(nodeType(node), "enumitem") == 0); if (isConstant || isEnum) { if (isEnum) { Setattr(node, "type", "double"); constantValue = Getattr(node, "value"); } constantTypemap = Swig_typemap_lookup("scilabconstcode", node, nodeName, 0); if (constantTypemap != NULL) { String *scilabConstantName = checkIdentifierName(constantName, SCILAB_IDENTIFIER_NAME_CHAR_MAX); Setattr(node, "wrap:name", constantName); Replaceall(constantTypemap, "$result", scilabConstantName); Replaceall(constantTypemap, "$value", constantValue); emit_action_code(node, variablesCode, constantTypemap); Delete(constantTypemap); return SWIG_OK; } } } /* Create variables for member pointer constants, not supported by typemaps (like Python wrapper does) */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(constantName); String *str = SwigType_str(type, wname); Printf(headerSection, "static %s = %s;\n", str, constantValue); Delete(str); constantValue = wname; } // Constant names can have SCILAB_VARIABLE_NAME_CHAR_MAX because of suffixes "_get" added to function String *scilabConstantName = checkIdentifierName(constantName, SCILAB_VARIABLE_NAME_CHAR_MAX); /* Create GET function to get the constant value */ Wrapper *getFunctionWrapper = NewWrapper(); String *getFunctionName = Swig_name_get(NSPACE_TODO, constantName); String *scilabGetFunctionName = Swig_name_get(NSPACE_TODO, scilabConstantName); Setattr(node, "wrap:name", getFunctionName); Printv(getFunctionWrapper->def, "int ", getFunctionName, "(SWIG_GatewayParameters) {\n", NIL); /* Check the number of input and output */ Printf(getFunctionWrapper->def, "SWIG_CheckInputArgument(pvApiCtx, 0, 0);\n"); Printf(getFunctionWrapper->def, "SWIG_CheckOutputArgument(pvApiCtx, 1, 1);\n"); Printf(getFunctionWrapper->def, "SWIG_Scilab_SetApiContext(pvApiCtx);\n"); constantTypemap = Swig_typemap_lookup("constcode", node, nodeName, 0); if (constantTypemap != NULL) { Printf(getFunctionWrapper->code, "SWIG_Scilab_SetOutputPosition(%d);\n", 1); Replaceall(constantTypemap, "$value", constantValue); Replaceall(constantTypemap, "$result", "1"); emit_action_code(node, getFunctionWrapper->code, constantTypemap); Delete(constantTypemap); } /* Dump the wrapper function */ Append(getFunctionWrapper->code, "return SWIG_OK;\n"); Append(getFunctionWrapper->code, "}\n"); Wrapper_print(getFunctionWrapper, wrappersSection); /* Add the function to Scilab */ addFunctionToScilab(scilabGetFunctionName, getFunctionName); DelWrapper(getFunctionWrapper); return SWIG_OK; } /* --------------------------------------------------------------------- * enumvalueDeclaration() * --------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *node) { static int iPreviousEnumValue = 0; if (GetFlag(node, "feature:scilab:const")) { // Compute the "absolute" value of enum if needed // (most of time enum values are a linked list of relative values) String *enumValue = Getattr(node, "enumvalue"); String *enumValueEx = Getattr(node, "enumvalueex"); // First enum value ? String *firstenumitem = Getattr(node, "firstenumitem"); if (firstenumitem) { if (enumValue) { // Value is in 'enumvalue' iPreviousEnumValue = atoi(Char(enumValue)); } else if (enumValueEx) { // Or value is in 'enumValueEx' iPreviousEnumValue = atoi(Char(enumValueEx)); enumValue = NewString(""); Printf(enumValue, "%d", iPreviousEnumValue); Setattr(node, "enumvalue", enumValue); } } else if (!enumValue && enumValueEx) { // Value is not specified, set it by incrementing last value enumValue = NewString(""); Printf(enumValue, "%d", ++iPreviousEnumValue); Setattr(node, "enumvalue", enumValue); } // Enums in Scilab are mapped to double Setattr(node, "type", "double"); } return Language::enumvalueDeclaration(node); } /* --------------------------------------------------------------------- * membervariableHandler() * --------------------------------------------------------------------- */ virtual int membervariableHandler(Node *node) { checkMemberIdentifierName(node, SCILAB_VARIABLE_NAME_CHAR_MAX); return Language::membervariableHandler(node); } /* ----------------------------------------------------------------------- * checkIdentifierName() * Truncates (and displays a warning) for too long identifier names * (applies on functions, variables, constants...) * (Scilab identifiers names are limited to 24 chars max) * ----------------------------------------------------------------------- */ String *checkIdentifierName(String *name, int char_size_max) { String *scilabIdentifierName; if (Len(name) > char_size_max) { scilabIdentifierName = DohNewStringWithSize(name, char_size_max); Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number, "Identifier name '%s' exceeds 24 characters and has been truncated to '%s'.\n", name, scilabIdentifierName); } else scilabIdentifierName = name; return scilabIdentifierName; } /* ----------------------------------------------------------------------- * checkMemberIdentifierName() * Truncates (and displays a warning) too long member identifier names * (applies on members of structs, classes...) * (Scilab identifiers names are limited to 24 chars max) * ----------------------------------------------------------------------- */ void checkMemberIdentifierName(Node *node, int char_size_max) { String *memberName = Getattr(node, "sym:name"); Node *containerNode = parentNode(node); String *containerName = Getattr(containerNode, "sym:name"); int lenContainerName = Len(containerName); int lenMemberName = Len(memberName); if (lenContainerName + lenMemberName + 1 > char_size_max) { int lenScilabMemberName = char_size_max - lenContainerName - 1; if (lenScilabMemberName > 0) { String *scilabMemberName = DohNewStringWithSize(memberName, lenScilabMemberName); Setattr(node, "sym:name", scilabMemberName); Swig_warning(WARN_SCILAB_TRUNCATED_NAME, input_file, line_number, "Wrapping functions names for member '%s.%s' will exceed 24 characters, " "so member name has been truncated to '%s'.\n", containerName, memberName, scilabMemberName); } else Swig_error(input_file, line_number, "Wrapping functions names for member '%s.%s' will exceed 24 characters, " "please rename the container of member '%s'.\n", containerName, memberName, containerName); } } /* ----------------------------------------------------------------------- * addHelperFunctions() * ----------------------------------------------------------------------- */ void addHelperFunctions() { addFunctionToScilab("SWIG_this", "SWIG_this"); addFunctionToScilab("SWIG_ptr", "SWIG_ptr"); } /* ----------------------------------------------------------------------- * addFunctionToScilab() * Declare a wrapped function in Scilab (builder, gateway, XML, ...) * ----------------------------------------------------------------------- */ void addFunctionToScilab(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName) { if (!generateBuilder) addFunctionInGatewayHeader(scilabFunctionName, wrapperFunctionName); if (generateBuilder) { addFunctionInScriptTable(scilabFunctionName, wrapperFunctionName, builderCode); } if (createLoader) { addFunctionInLoader(scilabFunctionName); } if (gatewayXMLFile) { Printf(gatewayXML, "\n", gatewayID, primitiveID++, scilabFunctionName); } } /* ----------------------------------------------------------------------- * createBuilderCode() * ----------------------------------------------------------------------- */ void createBuilderFile(String *outputFilename) { String *builderFilename = NewStringf("builder.sce"); builderFile = NewFile(builderFilename, "w", SWIG_output_files()); if (!builderFile) { FileErrorDisplay(builderFilename); SWIG_exit(EXIT_FAILURE); } emitBanner(builderFile); builderFunctionCount = 0; builderCode = NewString(""); Printf(builderCode, "mode(-1);\n"); Printf(builderCode, "lines(0);\n"); /* Useful for automatic tests */ // Scilab needs to be in the build directory Printf(builderCode, "originaldir = pwd();\n"); Printf(builderCode, "builddir = get_absolute_file_path('builder.sce');\n"); Printf(builderCode, "cd(builddir);\n"); Printf(builderCode, "ilib_verbose(%s);\n", verboseBuildLevel); Printf(builderCode, "libs = [];\n"); // Flags from command line arguments Printf(builderCode, "cflags = \"\";\n"); for (int i = 0; i < Len(cflags); i++) { String *cflag = Getitem(cflags, i); Printf(builderCode, "cflags = cflags + \" %s\";\n", cflag); } if (Len(ldflags) > 0) { for (int i = 0; i < Len(ldflags); i++) { String *ldflag = Getitem(ldflags, i); if (i == 0) { Printf(builderCode, "ldflags = \"%s\";\n", ldflag); } else { Printf(builderCode, "ldflags = ldflags + \" %s\";\n", ldflag); } } } else { Printf(builderCode, "ldflags = \"\";\n"); } // External script to set flags if (buildFlagsScript) { Printf(builderCode, "exec(\"%s\");\n", buildFlagsScript); Printf(builderCode, "cflags = cflags + getCompilationFlags();\n"); Printf(builderCode, "ldflags = ldflags + getLinkFlags();\n"); } // Additional sources Insert(sourceFileList, 0, outputFilename); for (int i = 0; i < Len(sourceFileList); i++) { String *sourceFile = Getitem(sourceFileList, i); if (i == 0) { Printf(builderCode, "files = \"%s\";\n", sourceFile); } else { Printf(builderCode, "files($ + 1) = \"%s\";\n", sourceFile); } } Printf(builderCode, "table = ["); } /* ----------------------------------------------------------------------- * addFunctionInBuilderCode() * Add a function wrapper in the function table of generated builder script * ----------------------------------------------------------------------- */ void addFunctionInScriptTable(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName, String *scriptCode) { if (++builderFunctionCount % 10 == 0) { Printf(scriptCode, "];\ntable = [table;"); } Printf(scriptCode, "\"%s\",\"%s\";", scilabFunctionName, wrapperFunctionName); } /* ----------------------------------------------------------------------- * saveBuilderFile() * ----------------------------------------------------------------------- */ void saveBuilderFile(String *gatewayName) { Printf(builderCode, "];\n"); Printf(builderCode, "ierr = 0;\n"); Printf(builderCode, "if ~isempty(table) then\n"); Printf(builderCode, " ierr = execstr(\"ilib_build(''%s'', table, files, libs, [], ldflags, cflags);\", 'errcatch');\n", gatewayName); Printf(builderCode, " if ierr <> 0 then\n"); Printf(builderCode, " err_msg = lasterror();\n"); Printf(builderCode, " end\n"); Printf(builderCode, "end\n"); Printf(builderCode, "cd(originaldir);\n"); Printf(builderCode, "if ierr <> 0 then\n"); Printf(builderCode, " error(ierr, err_msg);\n"); Printf(builderCode, "end\n"); Printv(builderFile, builderCode, NIL); Delete(builderFile); } /* ----------------------------------------------------------------------- * createGatewayXMLFile() * This XML file is used by Scilab in the context of internal modules * ----------------------------------------------------------------------- */ void createGatewayXMLFile(String *gatewayName) { String *gatewayXMLFilename = NewStringf("%s_gateway.xml", gatewayName); gatewayXMLFile = NewFile(gatewayXMLFilename, "w", SWIG_output_files()); if (!gatewayXMLFile) { FileErrorDisplay(gatewayXMLFilename); SWIG_exit(EXIT_FAILURE); } // Add a slightly modified SWIG banner to the gateway XML ("--modify" is illegal in XML) gatewayXML = NewString(""); Printf(gatewayXML, "\n"); Printf(gatewayXML, "\n"); Printf(gatewayXML, "\n", gatewayName); primitiveID = 1; } /* ----------------------------------------------------------------------- * saveGatewayXMLFile() * ----------------------------------------------------------------------- */ void saveGatewayXMLFile() { Printf(gatewayXML, "\n"); Printv(gatewayXMLFile, gatewayXML, NIL); Delete(gatewayXMLFile); } /* ----------------------------------------------------------------------- * startGatewayHeader() * Start the gateway header * ----------------------------------------------------------------------- */ void startGatewayHeader(String *gatewayLibraryName) { gatewayHeader = NewString(""); Printf(gatewayHeader, "\n"); gatewayHeaderV6 = NewString(""); Printf(gatewayHeaderV6, "#include \"c_gateway_prototype.h\"\n"); Printf(gatewayHeaderV6, "#include \"addfunction.h\"\n"); Printf(gatewayHeaderV6, "\n"); Printf(gatewayHeaderV6, "#define MODULE_NAME L\"%s\"\n", gatewayLibraryName); Printf(gatewayHeaderV6, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV6, "extern \"C\"\n"); Printf(gatewayHeaderV6, "#endif\n"); Printf(gatewayHeaderV6, "int %s(wchar_t *pwstFuncName) {\n", gatewayLibraryName); Printf(gatewayHeaderV6, "\n"); } /* ----------------------------------------------------------------------- * addFunctionInGatewayHeader() * Add a function in the gateway header * ----------------------------------------------------------------------- */ void addFunctionInGatewayHeader(const_String_or_char_ptr scilabFunctionName, const_String_or_char_ptr wrapperFunctionName) { if (gatewayHeaderV5 == NULL) { gatewayHeaderV5 = NewString(""); Printf(gatewayHeaderV5, "static GenericTable Tab[] = {\n"); } else Printf(gatewayHeaderV5, ",\n"); Printf(gatewayHeaderV5, " {(Myinterfun)sci_gateway, (GT)%s, (char *)\"%s\"}", wrapperFunctionName, scilabFunctionName); Printf(gatewayHeaderV6, "if (wcscmp(pwstFuncName, L\"%s\") == 0) { addCStackFunction((wchar_t *)L\"%s\", &%s, (wchar_t *)MODULE_NAME); }\n", scilabFunctionName, scilabFunctionName, wrapperFunctionName); } /* ----------------------------------------------------------------------- * terminateGatewayHeader() * Terminates the gateway header * ----------------------------------------------------------------------- */ void terminateGatewayHeader(String *gatewayLibraryName) { Printf(gatewayHeaderV5, "};\n"); Printf(gatewayHeaderV5, "\n"); Printf(gatewayHeaderV5, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV5, "extern \"C\" {\n"); Printf(gatewayHeaderV5, "#endif\n"); Printf(gatewayHeaderV5, "int C2F(%s)() {\n", gatewayLibraryName); Printf(gatewayHeaderV5, " Rhs = Max(0, Rhs);\n"); Printf(gatewayHeaderV5, " if (*(Tab[Fin-1].f) != NULL) {\n"); Printf(gatewayHeaderV5, " if(pvApiCtx == NULL) {\n"); Printf(gatewayHeaderV5, " pvApiCtx = (StrCtx *)MALLOC(sizeof(StrCtx));\n"); Printf(gatewayHeaderV5, " }\n"); Printf(gatewayHeaderV5, " pvApiCtx->pstName = (char *)Tab[Fin-1].name;\n"); Printf(gatewayHeaderV5, " (*(Tab[Fin-1].f))(Tab[Fin-1].name,(GatefuncH)Tab[Fin-1].F);\n"); Printf(gatewayHeaderV5, " }\n"); Printf(gatewayHeaderV5, " return 0;\n"); Printf(gatewayHeaderV5, "}\n"); Printf(gatewayHeaderV5, "\n"); Printf(gatewayHeaderV5, "#ifdef __cplusplus\n"); Printf(gatewayHeaderV5, "}\n"); Printf(gatewayHeaderV5, "#endif\n"); Printf(gatewayHeaderV6, "return 1;\n"); Printf(gatewayHeaderV6, "};\n"); Printf(gatewayHeader, "#if SWIG_SCILAB_VERSION >= 600\n"); Printv(gatewayHeader, gatewayHeaderV6, NIL); Printf(gatewayHeader, "#else\n"); Printv(gatewayHeader, gatewayHeaderV5, NIL); Printf(gatewayHeader, "#endif\n"); } /* ----------------------------------------------------------------------- * createLoaderScriptFile() * Creates the loader script file (loader.sce) * ----------------------------------------------------------------------- */ void createLoaderFile(String *gatewayLibraryName) { String *loaderFilename = NewString("loader.sce"); loaderFile = NewFile(loaderFilename, "w", SWIG_output_files()); if (!loaderFile) { FileErrorDisplay(loaderFilename); SWIG_exit(EXIT_FAILURE); } emitBanner(loaderFile); loaderScript = NewString(""); Printf(loaderScript, "%s_path = get_absolute_file_path('loader.sce');\n", gatewayLibraryName); Printf(loaderScript, "[bOK, ilib] = c_link('%s');\n", gatewayLibraryName); Printf(loaderScript, "if bOK then\n"); Printf(loaderScript, " ulink(ilib);\n"); Printf(loaderScript, "end\n"); Printf(loaderScript, "list_functions = [..\n"); } /* ----------------------------------------------------------------------- * addFunctionInLoaderScript() * Add a function in the loader script table * ----------------------------------------------------------------------- */ void addFunctionInLoader(const_String_or_char_ptr scilabFunctionName) { Printf(loaderScript, " '%s'; ..\n", scilabFunctionName); } /* ----------------------------------------------------------------------- * saveLoaderScriptFile() * Terminates and saves the loader script * ----------------------------------------------------------------------- */ void saveLoaderFile(String *gatewayLibraryName) { Printf(loaderScript, "];\n"); Printf(loaderScript, "addinter(fullfile(%s_path, '%s' + getdynlibext()), '%s', list_functions);\n", gatewayLibraryName, gatewayLibraryName, gatewayLibraryName); Printf(loaderScript, "clear %s_path;\n", gatewayLibraryName); Printf(loaderScript, "clear bOK;\n"); Printf(loaderScript, "clear ilib;\n"); Printf(loaderScript, "clear list_functions;\n"); Printv(loaderFile, loaderScript, NIL); Delete(loaderFile); } }; extern "C" Language *swig_scilab(void) { return new SCILAB(); } swig-3.0.12/Source/Modules/ocaml.cxx0000664000175000017500000017014713042756442017136 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * ocaml.cxx * * Ocaml language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ Ocaml Options (available with -ocaml)\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ -prefix - Set a prefix to be prepended to all names\n\ -suffix - Deprecated alias for general option -cppext\n\ -where - Emit library location\n\ \n"; static int classmode = 0; static int in_constructor = 0, in_destructor = 0, in_copyconst = 0; static int const_enum = 0; static int static_member_function = 0; static int generate_sizeof = 0; static String *prefix = 0; static const char *ocaml_path = "ocaml"; static bool old_variable_names = false; static String *classname = 0; static String *module = 0; static String *init_func_def = 0; static String *f_classtemplate = 0; static SwigType *name_qualifier_type = 0; static Hash *seen_enums = 0; static Hash *seen_enumvalues = 0; static Hash *seen_constructors = 0; static File *f_header = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_mlout = 0; static File *f_mliout = 0; static File *f_mlbody = 0; static File *f_mlibody = 0; static File *f_mltail = 0; static File *f_mlitail = 0; static File *f_enumtypes_type = 0; static File *f_enumtypes_value = 0; static File *f_class_ctors = 0; static File *f_class_ctors_end = 0; static File *f_enum_to_int = 0; static File *f_int_to_enum = 0; class OCAML:public Language { public: OCAML() { director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " failwith(\"accessing abstract class or protected constructor\"); \n", "}\n", NIL); director_multiple_inheritance = 1; director_language = 1; } String *Swig_class_name(Node *n) { String *name; name = Copy(Getattr(n, "sym:name")); return name; } void PrintIncludeArg() { Printv(stdout, SWIG_LIB, SWIG_FILE_DELIMITER, ocaml_path, "\n", NIL); } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; prefix = 0; SWIG_library_directory(ocaml_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-where") == 0) { PrintIncludeArg(); SWIG_exit(0); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-suffix") == 0) { if (argv[i + 1]) { Printf(stderr, "swig: warning: -suffix option deprecated. SWIG 3.0.4 and later provide a -cppext option which should be used instead.\n"); SWIG_config_cppext(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else Swig_arg_error(); } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } } } // If a prefix has been specified make sure it ends in a '_' (not actually used!) if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } else prefix = NewString("swig_"); // Add a symbol for this module Preprocessor_define("SWIGOCAML 1", 0); // Set name of typemaps SWIG_typemap_lang("ocaml"); // Read in default typemaps */ SWIG_config_file("ocaml.i"); allow_overloading(); } /* Swig_director_declaration() * * Generate the full director class declaration, complete with base classes. * e.g. "class SwigDirector_myclass : public myclass, public Swig::Director {" * */ String *Swig_director_declaration(Node *n) { String *classname = Swig_class_name(n); String *directorname = NewStringf("SwigDirector_%s", classname); String *base = Getattr(n, "classtype"); String *declaration = Swig_class_declaration(n, directorname); Printf(declaration, " : public %s, public Swig::Director {\n", base); Delete(classname); Delete(directorname); return declaration; } /* ------------------------------------------------------------ * top() * * Recognize the %module, and capture the module name. * Create the default enum cases. * Set up the named outputs: * * init * ml * mli * wrapper * header * runtime * directors * directors_h * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewString("caml_list_nth(args,0) != Val_unit")); /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ { Node *module = Getattr(n, "module"); if (module) { Node *options = Getattr(module, "options"); if (options) { if (Getattr(options, "directors")) { allow_directors(); } if (Getattr(options, "dirprot")) { allow_dirprot(); } if (Getattr(options, "sizeof")) { generate_sizeof = 1; } } } } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors = NewString(""); f_directors_h = NewString(""); f_enumtypes_type = NewString(""); f_enumtypes_value = NewString(""); init_func_def = NewString(""); f_mlbody = NewString(""); f_mlibody = NewString(""); f_mltail = NewString(""); f_mlitail = NewString(""); f_class_ctors = NewString(""); f_class_ctors_end = NewString(""); f_enum_to_int = NewString(""); f_int_to_enum = NewString(""); f_classtemplate = NewString(""); module = Getattr(n, "name"); seen_constructors = NewHash(); seen_enums = NewHash(); seen_enumvalues = NewHash(); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("init", init_func_def); Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("mli", f_mlibody); Swig_register_filebyname("ml", f_mlbody); Swig_register_filebyname("mlitail", f_mlitail); Swig_register_filebyname("mltail", f_mltail); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_register_filebyname("classtemplate", f_classtemplate); Swig_register_filebyname("class_ctors", f_class_ctors); if (old_variable_names) { Swig_name_register("set", "%n%v__set__"); Swig_name_register("get", "%n%v__get__"); } Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGOCAML\n#define SWIGOCAML\n#endif\n\n"); Printf(f_runtime, "#define SWIG_MODULE \"%s\"\n", module); /* Module name */ Printf(f_mlbody, "let module_name = \"%s\"\n", module); Printf(f_mlibody, "val module_name : string\n"); Printf(f_enum_to_int, "let enum_to_int x (v : c_obj) =\n" " match v with\n" " C_enum _y ->\n" " (let y = _y in match (x : c_enum_type) with\n" " `unknown -> " " (match y with\n" " `Int x -> (Swig.C_int x)\n" " | _ -> raise (LabelNotFromThisEnum v))\n"); Printf(f_int_to_enum, "let int_to_enum x y =\n" " match (x : c_enum_type) with\n" " `unknown -> C_enum (`Int y)\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "\n"); /* Produce the enum_to_int and int_to_enum functions */ Printf(f_enumtypes_type, "open Swig\n" "type c_enum_type = [ \n `unknown\n"); Printf(f_enumtypes_value, "type c_enum_value = [ \n `Int of int\n"); String *mlfile = NewString(""); String *mlifile = NewString(""); Printv(mlfile, module, ".ml", NIL); Printv(mlifile, module, ".mli", NIL); String *mlfilen = NewStringf("%s%s", SWIG_output_directory(), mlfile); if ((f_mlout = NewFile(mlfilen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(mlfilen); SWIG_exit(EXIT_FAILURE); } String *mlifilen = NewStringf("%s%s", SWIG_output_directory(), mlifile); if ((f_mliout = NewFile(mlifilen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(mlifilen); SWIG_exit(EXIT_FAILURE); } Language::top(n); Printf(f_enum_to_int, ") | _ -> (C_int (get_int v))\n" "let _ = Callback.register \"%s_enum_to_int\" enum_to_int\n", module); Printf(f_mlibody, "val enum_to_int : c_enum_type -> c_obj -> Swig.c_obj\n"); Printf(f_int_to_enum, "let _ = Callback.register \"%s_int_to_enum\" int_to_enum\n", module); Printf(f_mlibody, "val int_to_enum : c_enum_type -> int -> c_obj\n"); Printf(f_init, "#define SWIG_init f_%s_init\n" "%s" "}\n", module, init_func_def); Printf(f_mlbody, "external f_init : unit -> unit = \"f_%s_init\" ;;\n" "let _ = f_init ()\n", module); Printf(f_enumtypes_type, "]\n"); Printf(f_enumtypes_value, "]\n\n" "type c_obj = c_enum_value c_obj_t\n"); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } SwigType_emit_type_table(f_runtime, f_wrappers); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_directors_h, f_header); Dump(f_header, f_begin); Dump(f_directors, f_wrappers); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); Dump(f_enumtypes_type, f_mlout); Dump(f_enumtypes_value, f_mlout); Dump(f_mlbody, f_mlout); Dump(f_enum_to_int, f_mlout); Dump(f_int_to_enum, f_mlout); Delete(f_int_to_enum); Delete(f_enum_to_int); Dump(f_class_ctors, f_mlout); Dump(f_class_ctors_end, f_mlout); Dump(f_mltail, f_mlout); Delete(f_mlout); Dump(f_enumtypes_type, f_mliout); Dump(f_enumtypes_value, f_mliout); Dump(f_mlibody, f_mliout); Dump(f_mlitail, f_mliout); Delete(f_mliout); return SWIG_OK; } /* Produce an error for the given type */ void throw_unhandled_ocaml_type_error(SwigType *d, const char *types) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s (%s).\n", SwigType_str(d, 0), types); } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } /* * Delete one reference from a given type. */ void oc_SwigType_del_reference(SwigType *t) { char *c = Char(t); if (strncmp(c, "q(", 2) == 0) { Delete(SwigType_pop(t)); c = Char(t); } if (strncmp(c, "r.", 2)) { printf("Fatal error. SwigType_del_pointer applied to non-pointer.\n"); abort(); } Replace(t, "r.", "", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); } void oc_SwigType_del_array(SwigType *t) { char *c = Char(t); if (strncmp(c, "q(", 2) == 0) { Delete(SwigType_pop(t)); c = Char(t); } if (strncmp(c, "a(", 2) == 0) { Delete(SwigType_pop(t)); } } /* * Return true iff T is a reference type */ int is_a_reference(SwigType *t) { return SwigType_isreference(SwigType_typedef_resolve_all(t)); } int is_an_array(SwigType *t) { return SwigType_isarray(SwigType_typedef_resolve_all(t)); } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { char *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); String *return_type_normalized = normalizeTemplatedClassName(d); ParmList *l = Getattr(n, "parms"); int director_method = 0; Parm *p; Wrapper *f = NewWrapper(); String *proc_name = NewString(""); String *source = NewString(""); String *target = NewString(""); String *arg = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *build = NewString(""); String *tm; int i = 0; int numargs; int numreq; int newobj = GetFlag(n, "feature:new"); String *nodeType = Getattr(n, "nodeType"); int destructor = (!Cmp(nodeType, "destructor")); String *overname = 0; bool isOverloaded = Getattr(n, "sym:overloaded") ? true : false; // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (isOverloaded) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } /* Do this to disambiguate functions emitted from different modules */ Append(wname, module); Setattr(n, "wrap:name", wname); // Build the name for Scheme. Printv(proc_name, "_", iname, NIL); String *mangled_name = mangleNameForCaml(proc_name); if (classmode && in_constructor) { // Emit constructor for object String *mangled_name_nounder = NewString((char *) (Char(mangled_name)) + 1); Printf(f_class_ctors_end, "let %s clst = _%s clst\n", mangled_name_nounder, mangled_name_nounder); Printf(f_mlibody, "val %s : c_obj -> c_obj\n", mangled_name_nounder); Delete(mangled_name_nounder); } else if (classmode && in_destructor) { Printf(f_class_ctors, " \"~\", %s ;\n", mangled_name); } else if (classmode && !in_constructor && !in_destructor && !static_member_function) { String *opname = Copy(Getattr(n, "memberfunctionHandler:sym:name")); Replaceall(opname, "operator ", ""); if (strstr(Char(mangled_name), "__get__")) { String *set_name = Copy(mangled_name); if (!GetFlag(n, "feature:immutable")) { Replaceall(set_name, "__get__", "__set__"); Printf(f_class_ctors, " \"%s\", (fun args -> " "if args = (C_list [ raw_ptr ]) then %s args else %s args) ;\n", opname, mangled_name, set_name); Delete(set_name); } else { Printf(f_class_ctors, " \"%s\", (fun args -> " "if args = (C_list [ raw_ptr ]) then %s args else C_void) ;\n", opname, mangled_name); } } else if (strstr(Char(mangled_name), "__set__")) { ; /* Nothing ... handled by the case above */ } else { Printf(f_class_ctors, " \"%s\", %s ;\n", opname, mangled_name); } Delete(opname); } if (classmode && in_constructor) { Setattr(seen_constructors, mangled_name, "true"); } // writing the function wrapper function Printv(f->def, "SWIGEXT CAML_VALUE ", wname, " (", NIL); Printv(f->def, "CAML_VALUE args", NIL); Printv(f->def, ")\n{", NIL); /* Define the scheme name in C. This define is used by several macros. */ //Printv(f->def, "#define FUNC_NAME \"", mangled_name, "\"", NIL); // adds local variables Wrapper_add_local(f, "args", "CAMLparam1(args)"); Wrapper_add_local(f, "ret", "SWIG_CAMLlocal2(swig_result,rv)"); Wrapper_add_local(f, "_v", "int _v = 0"); if (isOverloaded) { Wrapper_add_local(f, "i", "int i"); Wrapper_add_local(f, "argc", "int argc = caml_list_length(args)"); Wrapper_add_local(f, "argv", "CAML_VALUE *argv"); Printv(f->code, "argv = (CAML_VALUE *)malloc( argc * sizeof( CAML_VALUE ) );\n" "for( i = 0; i < argc; i++ ) {\n" " argv[i] = caml_list_nth(args,i);\n" "}\n", NIL); } d = SwigType_typedef_qualified(d); emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); numargs = emit_num_arguments(l); numreq = emit_num_required(l); Printf(f->code, "swig_result = Val_unit;\n"); // Now write code to extract the parameters (this is super ugly) for (i = 0, p = l; i < numargs; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); pt = SwigType_typedef_qualified(pt); // Produce names of source and target Clear(source); Clear(target); Clear(arg); Printf(source, "caml_list_nth(args,%d)", i); Printf(target, "%s", ln); Printv(arg, Getattr(p, "name"), NIL); if (i >= numreq) { Printf(f->code, "if (caml_list_length(args) > %d) {\n", i); } // Handle parameter types. if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:in:next"); } else { // no typemap found // check if typedef and resolve throw_unhandled_ocaml_type_error(pt, "in"); p = nextSibling(p); } if (i >= numreq) { Printf(f->code, "}\n"); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } // Pass output arguments back to the caller. for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "emit:input")); /* Deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* Deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Replaceall(tm, "$ntype", normalizeTemplatedClassName(Getattr(p, "type"))); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } // Free up any memory allocated for the arguments. /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* if the object is a director, and the method call originated from its * underlying ocaml object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in ocaml. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = dynamic_cast(arg1);\n"); Wrapper_add_local(f, "upcall", "bool upcall = false"); Append(f->code, "upcall = (director);\n"); } // Now write code to make the function call Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", "swig_result"); Replaceall(tm, "$target", "rv"); Replaceall(tm, "$result", "rv"); Replaceall(tm, "$ntype", return_type_normalized); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_ocaml_type_error(d, "out"); } emit_return_variable(n, d, f); // Dump the argument output code Printv(f->code, Char(outarg), NIL); // Dump the argument cleanup code Printv(f->code, Char(cleanup), NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", "swig_result"); Printv(f->code, tm, "\n", NIL); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("swig_result", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) Printv(f->code, tab4, "swig_result = caml_list_append(swig_result,rv);\n", NIL); if (isOverloaded) Printv(f->code, "free(argv);\n", NIL); Printv(f->code, tab4, "CAMLreturn(swig_result);\n", NIL); Printv(f->code, "}\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Wrapper_print(f, f_wrappers); if (isOverloaded) { if (!Getattr(n, "sym:nextSibling")) { int maxargs; Wrapper *df = NewWrapper(); String *dispatch = Swig_overload_dispatch(n, "free(argv);\n" "CAMLreturn(%s(args));\n", &maxargs); Wrapper_add_local(df, "_v", "int _v = 0"); Wrapper_add_local(df, "argv", "CAML_VALUE *argv"); /* Undifferentiate name .. this is the dispatch function */ wname = Swig_name_wrapper(iname); /* Do this to disambiguate functions emitted from different * modules */ Append(wname, module); Printv(df->def, "SWIGEXT CAML_VALUE ", wname, "(CAML_VALUE args) {\n" " CAMLparam1(args);\n" " int i;\n" " int argc = caml_list_length(args);\n", NIL); Printv(df->code, "argv = (CAML_VALUE *)malloc( argc * sizeof( CAML_VALUE ) );\n" "for( i = 0; i < argc; i++ ) {\n" " argv[i] = caml_list_nth(args,i);\n" "}\n", NIL); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "failwith(\"No matching function for overloaded '%s'\");\n", iname); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); DelWrapper(df); Delete(dispatch); } } Printf(f_mlbody, "external %s_f : c_obj list -> c_obj list = \"%s\" ;;\n" "let %s arg = match %s_f (fnhelper arg) with\n" " [] -> C_void\n" "| [x] -> (if %s then Gc.finalise \n" " (fun x -> ignore ((invoke x) \"~\" C_void)) x) ; x\n" "| lst -> C_list lst ;;\n", mangled_name, wname, mangled_name, mangled_name, newobj ? "true" : "false"); if (!classmode || in_constructor || in_destructor || static_member_function) Printf(f_mlibody, "val %s : c_obj -> c_obj\n", mangled_name); Delete(proc_name); Delete(source); Delete(target); Delete(arg); Delete(outarg); Delete(cleanup); Delete(build); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function _wrap_swig_var_varname(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. In the set case we return C_void. * * symname is the name of the variable with respect to C. This * may need to differ from the original name in the case of enums. * enumvname is the name of the variable with respect to ocaml. This * will vary if the variable has been renamed. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "feature:symname"); String *iname = Getattr(n, "feature:enumvname"); String *mname = mangleNameForCaml(iname); SwigType *t = Getattr(n, "type"); String *proc_name = NewString(""); String *tm; String *tm2 = NewString(""); String *argnum = NewString("0"); String *arg = NewString("SWIG_Field(args,0)"); Wrapper *f; if (!name) { name = GetChar(n, "name"); } if (!iname) { iname = Getattr(n, "sym:name"); mname = mangleNameForCaml(NewString(iname)); } if (!iname || !addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for scheme. Printv(proc_name, iname, NIL); Setattr(n, "wrap:name", proc_name); Printf(f->def, "SWIGEXT CAML_VALUE %s(CAML_VALUE args) {\n", var_name); // Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "swig_result", "CAML_VALUE swig_result"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (args != Val_int(0)) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "args"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); /* Printv(f->code, tm, "\n",NIL); */ emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("in", n, name, 0))) { Replaceall(tm, "$source", "args"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "args"); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_ocaml_type_error(t, "varin/in"); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); emit_action_code(n, f->code, tm); } else if ((tm = Swig_typemap_lookup("out", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "swig_result"); Replaceall(tm, "$result", "swig_result"); Printf(f->code, "%s\n", tm); } else { throw_unhandled_ocaml_type_error(t, "varout/out"); } Printf(f->code, "\nreturn swig_result;\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the Ocaml interpreter if (GetFlag(n, "feature:immutable")) { Printf(f_mlbody, "external _%s : c_obj -> Swig.c_obj = \"%s\" \n", mname, var_name); Printf(f_mlibody, "val _%s : c_obj -> Swig.c_obj\n", iname); if (const_enum) { Printf(f_enum_to_int, " | `%s -> _%s C_void\n", mname, mname); Printf(f_int_to_enum, " if y = (get_int (_%s C_void)) then `%s else\n", mname, mname); } } else { Printf(f_mlbody, "external _%s : c_obj -> c_obj = \"%s\"\n", mname, var_name); Printf(f_mlibody, "external _%s : c_obj -> c_obj = \"%s\"\n", mname, var_name); } Delete(var_name); Delete(proc_name); Delete(argnum); Delete(arg); Delete(tm2); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler -- * Overridden to set static_member_function * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { static_member_function = 1; Language::staticmemberfunctionHandler(n); static_member_function = 0; return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * * The one trick here is that we have to make sure we rename the * constant to something useful that doesn't collide with the * original if any exists. * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "feature:symname"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); SwigType *qname = Getattr(n, "qualified:name"); String *rvalue = NewString(""); String *temp = 0; if (qname) value = qname; if (!name) { name = mangleNameForCaml(Getattr(n, "name")); Insert(name, 0, "_swig_wrap_"); Setattr(n, "feature:symname", name); } // See if there's a typemap Printv(rvalue, value, NIL); if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 1)) { temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "\"", temp, "\"", NIL); Delete(temp); } if ((SwigType_type(type) == T_CHAR) && (is_a_pointer(type) == 0)) { temp = Copy(rvalue); Clear(rvalue); Printv(rvalue, "'", temp, "'", NIL); Delete(temp); } // Create variable and assign it a value Printf(f_header, "static %s = ", SwigType_lstr(type, name)); bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if ((SwigType_type(type) == T_STRING)) { Printf(f_header, "\"%s\";\n", value); } else if (SwigType_type(type) == T_CHAR && !is_enum_item) { Printf(f_header, "\'%s\';\n", value); } else { Printf(f_header, "%s;\n", value); } SetFlag(n, "feature:immutable"); variableWrapper(n); return SWIG_OK; } int constructorHandler(Node *n) { int ret; in_constructor = 1; ret = Language::constructorHandler(n); in_constructor = 0; return ret; } /* destructorHandler: * Turn on destructor flag to inform decisions in functionWrapper */ int destructorHandler(Node *n) { int ret; in_destructor = 1; ret = Language::destructorHandler(n); in_destructor = 0; return ret; } /* copyconstructorHandler: * Turn on constructor and copyconstructor flags for functionWrapper */ int copyconstructorHandler(Node *n) { int ret; in_copyconst = 1; in_constructor = 1; ret = Language::copyconstructorHandler(n); in_constructor = 0; in_copyconst = 0; return ret; } /** * A simple, somewhat general purpose function for writing to multiple * streams from a source template. This allows the user to define the * class definition in ways different from the one I have here if they * want to. It will also make the class definition system easier to * fiddle with when I want to change methods, etc. */ void Multiwrite(String *s) { char *find_marker = strstr(Char(s), "(*Stream:"); while (find_marker) { char *next = strstr(find_marker, "*)"); find_marker += strlen("(*Stream:"); if (next) { int num_chars = (int)(next - find_marker); String *stream_name = NewString(find_marker); Delslice(stream_name, num_chars, Len(stream_name)); File *fout = Swig_filebyname(stream_name); if (fout) { next += strlen("*)"); char *following = strstr(next, "(*Stream:"); find_marker = following; if (!following) following = next + strlen(next); String *chunk = NewString(next); Delslice(chunk, (int)(following - next), Len(chunk)); Printv(fout, chunk, NIL); } } } } bool isSimpleType(String *name) { char *ch = Char(name); return !(strchr(ch, '(') || strchr(ch, '<') || strchr(ch, ')') || strchr(ch, '>')); } /* We accept all chars in identifiers because we use strings to index * them. */ int validIdentifier(String *name) { return Len(name) > 0 ? 1 : 0; } /* classHandler * * Create a "class" definition for ocaml. I thought quite a bit about * how I should do this part of it, and arrived here, using a function * invocation to select a method, and dispatch. This can obviously be * done better, but I can't see how, given that I want to support * overloaded methods, out parameters, and operators. * * I needed a system that would do this: * * a Be able to call these methods: * int foo( int x ); * float foo( int x, int &out ); * * b Be typeable, even in the presence of mutually dependent classes. * * c Support some form of operator invocation. * * (c) I chose strings for the method names so that "+=" would be a * valid method name, and the somewhat natural << (invoke x) "+=" y >> * would work. * * (a) (b) Since the c_obj type exists, it's easy to return C_int in one * case and C_list [ C_float ; C_int ] in the other. This makes tricky * problems with out parameters disappear; they're simply appended to the * return list. * * (b) Since every item that comes from C++ is the same type, there is no * problem with the following: * * class Foo; * class Bar { Foo *toFoo(); } * class Foo { Bar *toBar(); } * * Since the Objective caml types of Foo and Bar are the same. Now that * I correctly incorporate SWIG's typechecking, this isn't a big deal. * * The class is in the form of a function returning a c_obj. The c_obj * is a C_obj containing a function which invokes a method on the * underlying object given its type. * * The name emitted here is normalized before being sent to * Callback.register, because we need this string to look up properly * when the typemap passes the descriptor string. I've been considering * some, possibly more forgiving method that would do some transformations * on the $descriptor in order to find a potential match. This is for * later. * * Important things to note: * * We rely on exception handling (BadMethodName) in order to call an * ancestor. This can be improved. * * The method used to get :classof could be improved to look at the type * info that the base pointer contains. It's really an error to have a * SWIG-generated object that does not contain type info, since the * existence of the object means that SWIG knows the type. * * :parents could use :classof to tell what class it is and make a better * decision. This could be nice, (i.e. provide a run-time graph of C++ * classes represented);. * * I can't think of a more elegant way of converting a C_obj fun to a * pointer than "operator &"... * * Added a 'sizeof' that will allow you to do the expected thing. * This should help users to fill buffer structs and the like (as is * typical in windows-styled code). It's only enabled if you give * %feature(sizeof) and then, only for simple types. * * Overall, carrying the list of methods and base classes has worked well. * It allows me to give the Ocaml user introspection over their objects. */ int classHandler(Node *n) { String *name = Getattr(n, "name"); if (!name) return SWIG_OK; String *mangled_sym_name = mangleNameForCaml(name); String *this_class_def = NewString(f_classtemplate); String *name_normalized = normalizeTemplatedClassName(name); String *old_class_ctors = f_class_ctors; String *base_classes = NewString(""); f_class_ctors = NewString(""); bool sizeof_feature = generate_sizeof && isSimpleType(name); classname = mangled_sym_name; classmode = true; int rv = Language::classHandler(n); classmode = false; if (sizeof_feature) { Printf(f_wrappers, "SWIGEXT CAML_VALUE _wrap_%s_sizeof( CAML_VALUE args ) {\n" " CAMLparam1(args);\n" " CAMLreturn(Val_int(sizeof(%s)));\n" "}\n", mangled_sym_name, name_normalized); Printf(f_mlbody, "external __%s_sizeof : unit -> int = " "\"_wrap_%s_sizeof\"\n", classname, mangled_sym_name); } /* Insert sizeof operator for concrete classes */ if (sizeof_feature) { Printv(f_class_ctors, "\"sizeof\" , (fun args -> C_int (__", classname, "_sizeof ())) ;\n", NIL); } /* Handle up-casts in a nice way */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if (bname) { String *base_create = NewString(""); Printv(base_create, "(create_class \"", bname, "\")", NIL); Printv(f_class_ctors, " \"::", bname, "\", (fun args -> ", base_create, " args) ;\n", NIL); Printv(base_classes, base_create, " ;\n", NIL); } b = Next(b); } } Replaceall(this_class_def, "$classname", classname); Replaceall(this_class_def, "$normalized", name_normalized); Replaceall(this_class_def, "$realname", name); Replaceall(this_class_def, "$baselist", base_classes); Replaceall(this_class_def, "$classbody", f_class_ctors); Delete(f_class_ctors); f_class_ctors = old_class_ctors; // Actually write out the class definition Multiwrite(this_class_def); Setattr(n, "ocaml:ctor", classname); return rv; } String *normalizeTemplatedClassName(String *name) { String *name_normalized = SwigType_typedef_resolve_all(name); bool took_action; do { took_action = false; if (is_a_pointer(name_normalized)) { SwigType_del_pointer(name_normalized); took_action = true; } if (is_a_reference(name_normalized)) { oc_SwigType_del_reference(name_normalized); took_action = true; } if (is_an_array(name_normalized)) { oc_SwigType_del_array(name_normalized); took_action = true; } } while (took_action); return SwigType_str(name_normalized, 0); } /* * Produce the symbol name that ocaml will use when referring to the * target item. I wonder if there's a better way to do this: * * I shudder to think about doing it with a hash lookup, but that would * make a couple of things easier: */ String *mangleNameForCaml(String *s) { String *out = Copy(s); Replaceall(out, " ", "_xx"); Replaceall(out, "::", "_xx"); Replaceall(out, ",", "_x"); Replaceall(out, "+", "_xx_plus"); Replaceall(out, "-", "_xx_minus"); Replaceall(out, "<", "_xx_ldbrace"); Replaceall(out, ">", "_xx_rdbrace"); Replaceall(out, "!", "_xx_not"); Replaceall(out, "%", "_xx_mod"); Replaceall(out, "^", "_xx_xor"); Replaceall(out, "*", "_xx_star"); Replaceall(out, "&", "_xx_amp"); Replaceall(out, "|", "_xx_or"); Replaceall(out, "(", "_xx_lparen"); Replaceall(out, ")", "_xx_rparen"); Replaceall(out, "[", "_xx_lbrace"); Replaceall(out, "]", "_xx_rbrace"); Replaceall(out, "~", "_xx_bnot"); Replaceall(out, "=", "_xx_equals"); Replaceall(out, "/", "_xx_slash"); Replaceall(out, ".", "_xx_dot"); return out; } SwigType *fully_qualified_enum_type(Node *n) { Node *parent = 0; String *fully_qualified_name = NewString(""); String *parent_type = 0; parent = parentNode(n); while (parent) { parent_type = nodeType(parent); if (Getattr(parent, "name")) { String *parent_copy = NewStringf("%s::", Getattr(parent, "name")); if (Cmp(parent_type, "class") == 0 || Cmp(parent_type, "namespace") == 0) Insert(fully_qualified_name, 0, parent_copy); Delete(parent_copy); } if (!Cmp(parent_type, "class")) break; parent = parentNode(parent); } return fully_qualified_name; } /* Benedikt Grundmann inspired --> Enum wrap styles */ int enumvalueDeclaration(Node *n) { String *name = Getattr(n, "name"); SwigType *qtype = 0; if (name_qualifier_type) { qtype = Copy(name_qualifier_type); Printv(qtype, name, NIL); } if (const_enum && qtype && name && !Getattr(seen_enumvalues, name)) { Setattr(seen_enumvalues, name, "true"); SetFlag(n, "feature:immutable"); Setattr(n, "feature:enumvalue", "1"); // this does not appear to be used Setattr(n, "qualified:name", SwigType_namestr(qtype)); String *evname = SwigType_manglestr(qtype); Insert(evname, 0, "SWIG_ENUM_"); Setattr(n, "feature:enumvname", name); Setattr(n, "feature:symname", evname); Delete(evname); Printf(f_enumtypes_value, "| `%s\n", name); return Language::enumvalueDeclaration(n); } else return SWIG_OK; } /* ------------------------------------------------------------------- * This function is a bit uglier than it deserves. * * I used to direct lookup the name of the enum. Now that certain fixes * have been made in other places, the names of enums are now fully * qualified, which is a good thing, overall, but requires me to do * some legwork. * * The other thing that uglifies this function is the varying way that * typedef enum and enum are handled. I need to produce consistent names, * which means looking up and registering by typedef and enum name. */ int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = Getattr(n, "name"); if (name) { String *oname = NewString(name); /* name is now fully qualified */ String *fully_qualified_name = NewString(name); bool seen_enum = false; if (name_qualifier_type) Delete(name_qualifier_type); char *strip_position; name_qualifier_type = fully_qualified_enum_type(n); strip_position = strstr(Char(oname), "::"); while (strip_position) { strip_position += 2; oname = NewString(strip_position); strip_position = strstr(Char(oname), "::"); } seen_enum = (Getattr(seen_enums, fully_qualified_name) ? true : false); if (!seen_enum) { const_enum = true; Printf(f_enum_to_int, "| `%s -> (match y with\n", oname); Printf(f_int_to_enum, "| `%s -> C_enum (\n", oname); /* * * * A note about enum name resolution * * * * * This code should now work, but I think we can do a bit better. * The problem I'm having is that swig isn't very precise about * typedef name resolution. My opinion is that SwigType_typedef * resolve_all should *always* return the enum tag if one exists, * rather than the admittedly friendlier enclosing typedef. * * This would make one of the cases below unnecessary. * * * */ Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n", fully_qualified_name, oname); if (!strncmp(Char(fully_qualified_name), "enum ", 5)) { String *fq_noenum = NewString(Char(fully_qualified_name) + 5); Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n" "let _ = Callback.register \"%s_marker\" (`%s)\n", fq_noenum, oname, fq_noenum, name); } Printf(f_enumtypes_type, "| `%s\n", oname); Insert(fully_qualified_name, 0, "enum "); Setattr(seen_enums, fully_qualified_name, n); } } int ret = Language::enumDeclaration(n); if (const_enum) { Printf(f_int_to_enum, "`Int y)\n"); Printf(f_enum_to_int, "| `Int x -> Swig.C_int x\n" "| _ -> raise (LabelNotFromThisEnum v))\n"); } const_enum = false; return ret; } /* ---------------------------------------------------------------------------- * BEGIN C++ Director Class modifications * ------------------------------------------------------------------------- */ /* * Modified polymorphism code for Ocaml language module. * * TODO * * Move some boilerplate code generation to Swig_...() functions. * */ /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * * --------------------------------------------------------------- */ int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *storage = Getattr(n, "storage"); String *value = Getattr(n, "value"); String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); int status = SWIG_OK; int idx; bool pure_virtual = false; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } Wrapper_add_local(w, "swig_result", "CAMLparam0();\n" "SWIG_CAMLlocal2(swig_result,args)"); /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s {", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s;", target); Delete(target); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Ocaml) */ String *arglist = NewString(""); Swig_director_parms_fixup(l); Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int num_arguments = emit_num_arguments(l); int i; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ for (i = 0, idx = 0, p = l; i < num_arguments; i++) { while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); Printv(wrap_args, tm, "\n", NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Python doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "CAML_VALUE", source, "= Val_unit", NIL); Printf(wrap_args, "%s = dynamic_cast(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "CAML_VALUE", source, "= Val_unit", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } Printv(w->code, "swig_result = Val_unit;\n", 0); Printf(w->code, "args = Val_unit;\n"); /* wrap complex arguments to values */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Python object */ Printv(w->code, "swig_result = caml_swig_alloc(1,C_list);\n" "SWIG_Store_field(swig_result,0,args);\n" "args = swig_result;\n" "swig_result = Val_unit;\n", 0); Printf(w->code, "swig_result = " "callback3(*caml_named_value(\"swig_runmethod\")," "swig_get_self(),copy_string(\"%s\"),args);\n", Getattr(n, "name")); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); } if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Printf(w->code, "if (!%s) {\n", Swig_cresult_name()); Printf(w->code, " CAML_VALUE error = *caml_named_value(\"director_except\");\n"); Replaceall(tm, "$error", "error"); Printv(w->code, Str(tm), "\n", NIL); Printf(w->code, "}\n"); } /* * Python method may return a simple object, or a tuple. * for in/out aruments, we have to extract the appropriate values from the * argument list, then marshal everything back to C/C++ (return value and * output arguments). */ /* marshal return value and other outputs (if any) from value to C/C++ * type */ String *cleanup = NewString(""); String *outarg = NewString(""); tm = Swig_typemap_lookup("directorout", n, "c_result", w); if (tm != 0) { Replaceall(tm, "$input", "swig_result"); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { Replaceall(tm, "$result", "swig_result"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(arglist); Delete(cleanup); Delete(outarg); } /* any existing helper functions to handle this? */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { /* A little explanation: * The director_enum test case makes a method whose return type * is an enum type. returntype here is "int". gcc complains * about an implicit enum conversion, and although i don't strictly * agree with it, I'm working on fixing the error: * * Below is what I came up with. It's not great but it should * always essentially work. */ if (!SwigType_isreference(returntype)) { Printf(w->code, "CAMLreturn_type((%s)c_result);\n", SwigType_lstr(returntype, "")); } else { Printf(w->code, "CAMLreturn_type(*c_result);\n"); } } } Printf(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p, *q; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("CAML_VALUE"); p = NewParm(type, NewString("self"), n); q = Copy(p); set_nextSibling(q, superparms); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { }", classname, target, call); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Setattr(n, "parms", q); Language::classDirectorConstructor(n); Delete(sub); Delete(classname); Delete(supername); //Delete(parms); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname; classname = Swig_class_name(n); /* insert self parameter */ Parm *p, *q; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("CAML_VALUE"); p = NewParm(type, NewString("self"), n); q = Copy(p); set_nextSibling(p, parms); { Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(CAML_VALUE self) : Swig::Director(self) { }", classname, classname); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(CAML_VALUE self);\n", classname); Delete(classname); Setattr(n, "parms", q); return Language::classDirectorDefaultConstructor(n); } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n" "%s\n" "public:\n", declaration); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* --------------------------------------------------------------------- * typedefHandler * * This is here in order to maintain the correct association between * typedef names and enum names. * * Since I implement enums as polymorphic variant tags, I need to call * back into ocaml to evaluate them. This requires a string that can * be generated in the typemaps, and also at SWIG time to be the same * string. The problem that arises is that SWIG variously generates * enum e_name_tag * e_name_tag * e_typedef_name * for * typedef enum e_name_tag { ... } e_typedef_name; * * Since I need these strings to be consistent, I must maintain a correct * association list between typedef and enum names. * --------------------------------------------------------------------- */ int typedefHandler(Node *n) { String *type = Getattr(n, "type"); Node *enum_node = type ? Getattr(seen_enums, type) : 0; if (enum_node) { String *name = Getattr(enum_node, "name"); Printf(f_mlbody, "let _ = Callback.register \"%s_marker\" (`%s)\n", Getattr(n, "name"), name); } return SWIG_OK; } String *runtimeCode() { String *s = Swig_include_sys("ocaml.swg"); if (!s) { Printf(stderr, "*** Unable to open 'ocaml.swg'\n"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigocamlrun.h"); } }; /* ------------------------------------------------------------------------- * swig_ocaml() - Instantiate module * ------------------------------------------------------------------------- */ static Language *new_swig_ocaml() { return new OCAML(); } extern "C" Language *swig_ocaml(void) { return new_swig_ocaml(); } swig-3.0.12/Source/Modules/tcl8.cxx0000664000175000017500000012066213042756442016712 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * tcl8.cxx * * Tcl8 language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static const char *usage = "\ Tcl 8 Options (available with -tcl)\n\ -itcl - Enable ITcl support\n\ -nosafe - Leave out SafeInit module function.\n\ -prefix - Set a prefix to be prepended to all names\n\ -namespace - Build module into a Tcl 8 namespace\n\ -pkgversion - Set package version\n\n"; static String *cmd_tab = 0; /* Table of command names */ static String *var_tab = 0; /* Table of global variables */ static String *const_tab = 0; /* Constant table */ static String *methods_tab = 0; /* Methods table */ static String *attr_tab = 0; /* Attribute table */ static String *prefix = 0; static String *module = 0; static int namespace_option = 0; static String *init_name = 0; static String *ns_name = 0; static int have_constructor; static String *constructor_name; static int have_destructor; static int have_base_classes; static String *destructor_action = 0; static String *version = (String *) "0.0"; static String *class_name = 0; static int have_attributes; static int have_methods; static int nosafe = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static File *f_begin = 0; static File *f_runtime = 0; // Itcl support static int itcl = 0; static File *f_shadow = 0; static File *f_shadow_stubs = 0; static String *constructor = 0; static String *destructor = 0; static String *base_classes = 0; static String *base_class_init = 0; static String *methods = 0; static String *imethods = 0; static String *attributes = 0; static String *attribute_traces = 0; static String *iattribute_traces = 0; class TCL8:public Language { public: /* ------------------------------------------------------------ * TCL8::main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int cppcast = 1; SWIG_library_directory("tcl"); for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else Swig_arg_error(); } else if (strcmp(argv[i], "-pkgversion") == 0) { if (argv[i + 1]) { version = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } } else if (strcmp(argv[i], "-namespace") == 0) { namespace_option = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-itcl") == 0) { itcl = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nosafe") == 0) { nosafe = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppcast") == 0) { cppcast = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { cppcast = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } } if (cppcast) { Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0); } Preprocessor_define("SWIGTCL 1", 0); // SWIGTCL8 is deprecated, and no longer documented. Preprocessor_define("SWIGTCL8 1", 0); SWIG_typemap_lang("tcl8"); SWIG_config_file("tcl8.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); /* Initialize some variables for the object interface */ cmd_tab = NewString(""); var_tab = NewString(""); methods_tab = NewString(""); const_tab = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGTCL\n#define SWIGTCL\n#endif\n\n"); /* Set the module name, namespace, and prefix */ module = NewStringf("%(lower)s", Getattr(n, "name")); init_name = NewStringf("%(title)s_Init", module); ns_name = prefix ? Copy(prefix) : Copy(module); if (prefix) Append(prefix, "_"); /* If shadow classing is enabled, we're going to change the module name to "_module" */ if (itcl) { String *filen; filen = NewStringf("%s%s.itcl", SWIG_output_directory(), module); Insert(module, 0, "_"); if ((f_shadow = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } f_shadow_stubs = NewString(""); Swig_register_filebyname("shadow", f_shadow); Swig_register_filebyname("itcl", f_shadow); Swig_banner_target_lang(f_shadow, "#"); Printv(f_shadow, "\npackage require Itcl\n\n", NIL); Delete(filen); } /* Generate some macros used throughout code generation */ Printf(f_header, "#define SWIG_init %s\n", init_name); Printf(f_header, "#define SWIG_name \"%s\"\n", module); if (namespace_option) { Printf(f_header, "#define SWIG_prefix \"%s::\"\n", ns_name); Printf(f_header, "#define SWIG_namespace \"%s\"\n\n", ns_name); } else { Printf(f_header, "#define SWIG_prefix \"%s\"\n", prefix); } Printf(f_header, "#define SWIG_version \"%s\"\n", version); Printf(cmd_tab, "\nstatic swig_command_info swig_commands[] = {\n"); Printf(var_tab, "\nstatic swig_var_info swig_variables[] = {\n"); Printf(const_tab, "\nstatic swig_const_info swig_constants[] = {\n"); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* Start emitting code */ Language::top(n); /* Done. Close up the module */ Printv(cmd_tab, tab4, "{0, 0, 0}\n", "};\n", NIL); Printv(var_tab, tab4, "{0,0,0,0}\n", "};\n", NIL); Printv(const_tab, tab4, "{0,0,0,0,0,0}\n", "};\n", NIL); Printv(f_wrappers, cmd_tab, var_tab, const_tab, NIL); /* Dump the pointer equivalency table */ SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); /* Close the init function and quit */ Printf(f_init, "return TCL_OK;\n}\n"); if (!nosafe) { Printf(f_init, "SWIGEXPORT int %(title)s_SafeInit(Tcl_Interp *interp) {\n", module); Printf(f_init, " return SWIG_init(interp);\n"); Printf(f_init, "}\n"); } if (itcl) { Printv(f_shadow, f_shadow_stubs, "\n", NIL); Delete(f_shadow); } /* Close all of the files */ Dump(f_runtime, f_begin); Printv(f_begin, f_header, f_wrappers, NIL); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); /* Like to get rid of this */ String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); String *overname = 0; Parm *p; int i; String *tm; Wrapper *f; String *incode, *cleanup, *outarg, *argstr, *args; int num_arguments = 0; int num_required = 0; int varargs = 0; char source[64]; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } incode = NewString(""); cleanup = NewString(""); outarg = NewString(""); argstr = NewString("\""); args = NewString(""); f = NewWrapper(); #ifdef SWIG_USE_RESULTOBJ Wrapper_add_local(f, "resultobj", "Tcl_Obj *resultobj = NULL"); #endif String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "SWIGINTERN int\n ", wname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); /* Attach standard typemaps */ emit_attach_parmmaps(parms, f); Setattr(n, "wrap:parms", parms); /* Get number of require and total arguments */ num_arguments = emit_num_arguments(parms); num_required = emit_num_required(parms); varargs = emit_isvarargs(parms); /* Unmarshal parameters */ for (i = 0, p = parms; i < num_arguments; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); /* Produce string representations of the source and target arguments */ sprintf(source, "objv[%d]", i + 1); if (i == num_required) Putc('|', argstr); if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { Replaceall(tm, "$target", ln); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Putc('o', argstr); Printf(args, ",(void *)0"); if (i >= num_required) { Printf(incode, "if (objc > %d) {\n", i + 1); } Printf(incode, "%s\n", tm); if (i >= num_required) { Printf(incode, "}\n"); } } else { Printf(argstr, "%s", parse); Printf(args, ",&%s", ln); if (Strcmp(parse, "p") == 0) { SwigType *lt = SwigType_ltype(pt); SwigType_remember(pt); if (Cmp(lt, "p.void") == 0) { Printf(args, ",(void *)0"); } else { Printf(args, ",SWIGTYPE%s", SwigType_manglestr(pt)); } Delete(lt); } } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); } p = nextSibling(p); } if (!varargs) { Putc(':', argstr); } else { Putc(';', argstr); /* If variable length arguments we need to emit the in typemap here */ if (p && (tm = Getattr(p, "tmap:in"))) { sprintf(source, "objv[%d]", i + 1); Printf(incode, "if (objc > %d) {\n", i); Replaceall(tm, "$input", source); Printv(incode, tm, "\n", NIL); Printf(incode, "}\n"); } } Printf(argstr, "%s\"", usage_string(Char(iname), type, parms)); Printv(f->code, "if (SWIG_GetArgs(interp, objc, objv,", argstr, args, ") == TCL_ERROR) SWIG_fail;\n", NIL); Printv(f->code, incode, NIL); /* Insert constraint checking code */ for (p = parms; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = parms; p; i++) { if (!checkAttribute(p, "tmap:in:numinputs", "0") && !Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Len(tm) != 0) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (i = 0, p = parms; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); #ifdef SWIG_USE_RESULTOBJ Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Now write code to make the function call */ String *actioncode = emit_action(n); /* Need to redo all of this code (eventually) */ /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); #ifdef SWIG_USE_RESULTOBJ Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); #else Replaceall(tm, "$target", "(Tcl_GetObjResult(interp))"); Replaceall(tm, "$result", "(Tcl_GetObjResult(interp))"); #endif if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(type, 0), name); } emit_return_variable(n, type, f); /* Dump output argument code */ Printv(f->code, outarg, NIL); /* Dump the argument cleanup code */ Printv(f->code, cleanup, NIL); /* Look for any remaining cleanup */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } #ifdef SWIG_USE_RESULTOBJ Printv(f->code, "if (resultobj) Tcl_SetObjResult(interp, resultobj);\n", NIL); #endif Printv(f->code, "return TCL_OK;\n", NIL); Printv(f->code, "fail:\n", cleanup, "return TCL_ERROR;\n", NIL); Printv(f->code, "}\n", NIL); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); /* Dump out the function */ Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { /* Register the function with Tcl */ Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", Swig_name_wrapper(iname), ", NULL},\n", NIL); } else { if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(clientData, interp, objc, argv - 1);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "SWIGINTERN int\n", dname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) {", NIL); Printf(df->code, "Tcl_Obj *CONST *argv = objv+1;\n"); Printf(df->code, "int argc = objc-1;\n"); Printv(df->code, dispatch, "\n", NIL); Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Printf(df->code, "Tcl_SetResult(interp,(char *) " "\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s, TCL_STATIC);\n", iname, protoTypes); Delete(protoTypes); Printf(df->code, "return TCL_ERROR;\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printv(cmd_tab, tab4, "{ SWIG_prefix \"", iname, "\", (swig_wrapper_func) ", dname, ", NULL},\n", NIL); DelWrapper(df); Delete(dispatch); Delete(dname); } } Delete(incode); Delete(cleanup); Delete(outarg); Delete(argstr); Delete(args); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *setname = 0; String *setfname = 0; Wrapper *setf = 0, *getf = 0; int readonly = 0; String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Create a function for getting a variable */ int addfail = 0; getf = NewWrapper(); String *getname = Swig_name_get(NSPACE_TODO, iname); String *getfname = Swig_name_wrapper(getname); Setattr(n, "wrap:name", getfname); Printv(getf->def, "SWIGINTERN const char *", getfname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2, int flags) {", NIL); Wrapper_add_local(getf, "value", "Tcl_Obj *value = 0"); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "value"); Replaceall(tm, "$result", "value"); /* Printf(getf->code, "%s\n",tm); */ addfail = emit_action_code(n, getf->code, tm); Printf(getf->code, "if (value) {\n"); Printf(getf->code, "Tcl_SetVar2(interp,name1,name2,Tcl_GetStringFromObj(value,NULL), flags);\n"); Printf(getf->code, "Tcl_DecrRefCount(value);\n"); Printf(getf->code, "}\n"); Printf(getf->code, "return NULL;\n"); if (addfail) { Append(getf->code, "fail:\n"); Printf(getf->code, "return \"%s\";\n", iname); } Printf(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); DelWrapper(getf); return SWIG_NOWRAP; } DelWrapper(getf); /* Try to create a function setting a variable */ if (is_assignable(n)) { setf = NewWrapper(); setname = Swig_name_set(NSPACE_TODO, iname); setfname = Swig_name_wrapper(setname); Setattr(n, "wrap:name", setfname); if (setf) { Printv(setf->def, "SWIGINTERN const char *", setfname, "(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, char *name1, char *name2 SWIGUNUSED, int flags) {", NIL); Wrapper_add_local(setf, "value", "Tcl_Obj *value = 0"); Wrapper_add_local(setf, "name1o", "Tcl_Obj *name1o = 0"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "value"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "value"); Printf(setf->code, "name1o = Tcl_NewStringObj(name1,-1);\n"); Printf(setf->code, "value = Tcl_ObjGetVar2(interp, name1o, 0, flags);\n"); Printf(setf->code, "Tcl_DecrRefCount(name1o);\n"); Printf(setf->code, "if (!value) SWIG_fail;\n"); /* Printf(setf->code,"%s\n", tm); */ emit_action_code(n, setf->code, tm); Printf(setf->code, "return NULL;\n"); Printf(setf->code, "fail:\n"); Printf(setf->code, "return \"%s\";\n", iname); Printf(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); readonly = 1; } } DelWrapper(setf); } else { readonly = 1; } Printv(var_tab, tab4, "{ SWIG_prefix \"", iname, "\", 0, (swig_variable_func) ", getfname, ",", NIL); if (readonly) { static int readonlywrap = 0; if (!readonlywrap) { Wrapper *ro = NewWrapper(); Printf(ro->def, "SWIGINTERN const char *swig_readonly(ClientData clientData SWIGUNUSED, Tcl_Interp *interp SWIGUNUSED, char *name1 SWIGUNUSED, char *name2 SWIGUNUSED, int flags SWIGUNUSED) {"); Printv(ro->code, "return \"Variable is read-only\";\n", "}\n", NIL); Wrapper_print(ro, f_wrappers); readonlywrap = 1; DelWrapper(ro); } Printf(var_tab, "(swig_variable_func) swig_readonly},\n"); } else { Printv(var_tab, "(swig_variable_func) ", setfname, "},\n", NIL); } Delete(getfname); Delete(setfname); Delete(setname); Delete(getname); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); String *nsname = !namespace_option ? Copy(iname) : NewStringf("%s::%s", ns_name, iname); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; if (namespace_option) Setattr(n, "sym:name", nsname); /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(const_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Replaceall(tm, "$nsname", nsname); Printf(f_init, "%s\n", tm); } else { Delete(nsname); Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } Delete(nsname); return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *funcname = Getattr(n, "wrap:name"); if (!addSymbol(funcname, n)) return SWIG_ERROR; Printf(f_init, "\t Tcl_CreateObjCommand(interp, SWIG_prefix \"%s\", (swig_wrapper_func) %s, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);\n", name, funcname); return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { static Hash *emitted = NewHash(); String *mangled_classname = 0; String *real_classname = 0; have_constructor = 0; have_destructor = 0; destructor_action = 0; constructor_name = 0; if (itcl) { constructor = NewString(""); destructor = NewString(""); base_classes = NewString(""); base_class_init = NewString(""); methods = NewString(""); imethods = NewString(""); attributes = NewString(""); attribute_traces = NewString(""); iattribute_traces = NewString(""); have_base_classes = 0; have_methods = 0; have_attributes = 0; } class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; real_classname = Getattr(n, "name"); mangled_classname = Swig_name_mangle(real_classname); if (Getattr(emitted, mangled_classname)) return SWIG_NOWRAP; Setattr(emitted, mangled_classname, "1"); attr_tab = NewString(""); Printf(attr_tab, "static swig_attribute swig_"); Printv(attr_tab, mangled_classname, "_attributes[] = {\n", NIL); methods_tab = NewStringf(""); Printf(methods_tab, "static swig_method swig_"); Printv(methods_tab, mangled_classname, "_methods[] = {\n", NIL); /* Generate normal wrappers */ Language::classHandler(n); SwigType *t = Copy(Getattr(n, "name")); SwigType_add_pointer(t); // Catch all: eg. a class with only static functions and/or variables will not have 'remembered' // SwigType_remember(t); String *wrap_class = NewStringf("&_wrap_class_%s", mangled_classname); SwigType_remember_clientdata(t, wrap_class); String *rt = Copy(getClassType()); SwigType_add_pointer(rt); // Register the class structure with the type checker /* Printf(f_init,"SWIG_TypeClientData(SWIGTYPE%s, (void *) &_wrap_class_%s);\n", SwigType_manglestr(t), mangled_classname); */ if (have_destructor) { Printv(f_wrappers, "SWIGINTERN void swig_delete_", class_name, "(void *obj) {\n", NIL); if (destructor_action) { Printv(f_wrappers, SwigType_str(rt, "arg1"), " = (", SwigType_str(rt, 0), ") obj;\n", NIL); Printv(f_wrappers, destructor_action, "\n", NIL); } else { if (CPlusPlus) { Printv(f_wrappers, " delete (", SwigType_str(rt, 0), ") obj;\n", NIL); } else { Printv(f_wrappers, " free((char *) obj);\n", NIL); } } Printf(f_wrappers, "}\n"); } Printf(methods_tab, " {0,0}\n};\n"); Printv(f_wrappers, methods_tab, NIL); Printf(attr_tab, " {0,0,0}\n};\n"); Printv(f_wrappers, attr_tab, NIL); /* Handle inheritance */ String *base_class = NewString(""); String *base_class_names = NewString(""); if (itcl) { base_classes = NewString(""); } List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; int index = 0; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "name"); if ((!bname) || GetFlag(b.item, "feature:ignore") || (!Getattr(b.item, "module"))) { b = Next(b); continue; } if (itcl) { have_base_classes = 1; Printv(base_classes, bname, " ", NIL); Printv(base_class_init, " ", bname, "Ptr::constructor $ptr\n", NIL); } String *bmangle = Swig_name_mangle(bname); // Printv(f_wrappers,"extern swig_class _wrap_class_", bmangle, ";\n", NIL); // Printf(base_class,"&_wrap_class_%s",bmangle); Printf(base_class, "0"); Printf(base_class_names, "\"%s *\",", SwigType_namestr(bname)); /* Put code to register base classes in init function */ //Printf(f_init,"/* Register base : %s */\n", bmangle); //Printf(f_init,"swig_%s_bases[%d] = (swig_class *) SWIG_TypeQuery(\"%s *\")->clientdata;\n", mangled_classname, index, SwigType_namestr(bname)); b = Next(b); index++; Putc(',', base_class); Delete(bmangle); } } if (itcl) { String *ptrclass = NewString(""); // First, build the pointer base class Printv(ptrclass, "itcl::class ", class_name, "Ptr {\n", NIL); if (have_base_classes) Printv(ptrclass, " inherit ", base_classes, "\n", NIL); // Define protected variables for SWIG object pointer Printv(ptrclass, " protected variable swigobj\n", " protected variable thisown\n", NIL); // Define public variables if (have_attributes) { Printv(ptrclass, attributes, NIL); // base class swig_getset was being called for complex inheritance trees if (namespace_option) { Printv(ptrclass, " protected method ", class_name, "_swig_getset {var name1 name2 op} {\n", NIL); Printv(ptrclass, " switch -exact -- $op {\n", " r {set $var [", ns_name, "::", class_name, "_[set var]_get $swigobj]}\n", " w {", ns_name, "::", class_name, "_${var}_set $swigobj [set $var]}\n", " }\n", " }\n", NIL); } else { Printv(ptrclass, " protected method ", class_name, "_swig_getset {var name1 name2 op} {\n", " switch -exact -- $op {\n", " r {set $var [", class_name, "_[set var]_get $swigobj]}\n", " w {", class_name, "_${var}_set $swigobj [set $var]}\n", " }\n", " }\n", NIL); } } // Add the constructor, which may include // calls to base class class constructors Printv(ptrclass, " constructor { ptr } {\n", NIL); if (have_base_classes) { Printv(ptrclass, base_class_init, NIL); Printv(ptrclass, " } {\n", NIL); } Printv(ptrclass, " set swigobj $ptr\n", " set thisown 0\n", NIL); if (have_attributes) { Printv(ptrclass, attribute_traces, NIL); } Printv(ptrclass, " }\n", NIL); // Add destructor Printv(ptrclass, " destructor {\n", " set d_func delete_", class_name, "\n", " if { $thisown && ([info command $d_func] != \"\") } {\n" " $d_func $swigobj\n", " }\n", " }\n", NIL); // Add methods if (have_methods) { Printv(ptrclass, imethods, NIL); }; // Close out the pointer class Printv(ptrclass, "}\n\n", NIL); Printv(f_shadow, ptrclass, NIL); // pointer class end // Create the "real" class. Printv(f_shadow, "itcl::class ", class_name, " {\n", NIL); Printv(f_shadow, " inherit ", class_name, "Ptr\n", NIL); // If we have a constructor, then use it. // If not, then we must have an abstract class without // any constructor. So we create a class constructor // which will fail for this class (but not for inherited // classes). Note that the constructor must fail before // calling the ptrclass constructor. if (have_constructor) { Printv(f_shadow, constructor, NIL); } else { Printv(f_shadow, " constructor { } {\n", NIL); Printv(f_shadow, " # This constructor will fail if called directly\n", NIL); Printv(f_shadow, " if { [info class] == \"::", class_name, "\" } {\n", NIL); Printv(f_shadow, " error \"No constructor for class ", class_name, (Getattr(n, "abstracts") ? " - class is abstract" : ""), "\"\n", NIL); Printv(f_shadow, " }\n", NIL); Printv(f_shadow, " }\n", NIL); } Printv(f_shadow, "}\n\n", NIL); } Printv(f_wrappers, "static swig_class *swig_", mangled_classname, "_bases[] = {", base_class, "0};\n", NIL); Printv(f_wrappers, "static const char * swig_", mangled_classname, "_base_names[] = {", base_class_names, "0};\n", NIL); Delete(base_class); Delete(base_class_names); Printv(f_wrappers, "static swig_class _wrap_class_", mangled_classname, " = { \"", class_name, "\", &SWIGTYPE", SwigType_manglestr(t), ",", NIL); if (have_constructor) { Printf(f_wrappers, "%s", Swig_name_wrapper(Swig_name_construct(NSPACE_TODO, constructor_name))); Delete(constructor_name); constructor_name = 0; } else { Printf(f_wrappers, "0"); } if (have_destructor) { Printv(f_wrappers, ", swig_delete_", class_name, NIL); } else { Printf(f_wrappers, ",0"); } Printv(f_wrappers, ", swig_", mangled_classname, "_methods, swig_", mangled_classname, "_attributes, swig_", mangled_classname, "_bases,", "swig_", mangled_classname, "_base_names, &swig_module, SWIG_TCL_HASHTABLE_INIT };\n", NIL); if (!itcl) { Printv(cmd_tab, tab4, "{ SWIG_prefix \"", class_name, "\", (swig_wrapper_func) SWIG_ObjectConstructor, (ClientData)&_wrap_class_", mangled_classname, "},\n", NIL); }; Delete(t); Delete(mangled_classname); return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname, *rname; Language::memberfunctionHandler(n); realname = iname ? iname : name; rname = Swig_name_wrapper(Swig_name_member(NSPACE_TODO, class_name, realname)); if (!Getattr(n, "sym:nextSibling")) { Printv(methods_tab, tab4, "{\"", realname, "\", ", rname, "}, \n", NIL); } if (itcl) { ParmList *l = Getattr(n, "parms"); Parm *p = 0; String *pname = NewString(""); // Add this member to our class handler function Printv(imethods, tab2, "method ", realname, " [list ", NIL); int pnum = 0; for (p = l; p; p = nextSibling(p)) { String *pn = Getattr(p, "name"); String *dv = Getattr(p, "value"); SwigType *pt = Getattr(p, "type"); Printv(pname, ",(", pt, ")", NIL); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } if (Len(dv) > 0) { String *defval = NewString(dv); if (namespace_option) { Insert(defval, 0, "::"); Insert(defval, 0, ns_name); } if (Strncmp(dv, "(", 1) == 0) { Insert(defval, 0, "$"); Replaceall(defval, "(", ""); Replaceall(defval, ")", ""); } Printv(imethods, "[list ", pname, " ", defval, "] ", NIL); } else { Printv(imethods, pname, " ", NIL); } } ++pnum; } Printv(imethods, "] ", NIL); if (namespace_option) { Printv(imethods, "{ ", ns_name, "::", class_name, "_", realname, " $swigobj", NIL); } else { Printv(imethods, "{ ", class_name, "_", realname, " $swigobj", NIL); }; pnum = 0; for (p = l; p; p = nextSibling(p)) { String *pn = Getattr(p, "name"); SwigType *pt = Getattr(p, "type"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } Printv(imethods, " $", pname, NIL); } ++pnum; } Printv(imethods, " }\n", NIL); have_methods = 1; } Delete(rname); return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); String *rname; Language::membervariableHandler(n); Printv(attr_tab, tab4, "{ \"-", symname, "\",", NIL); rname = Swig_name_wrapper(Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname))); Printv(attr_tab, rname, ", ", NIL); Delete(rname); if (!GetFlag(n, "feature:immutable")) { rname = Swig_name_wrapper(Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname))); Printv(attr_tab, rname, "},\n", NIL); Delete(rname); } else { Printf(attr_tab, "0 },\n"); } if (itcl) { Printv(attributes, " public variable ", symname, "\n", NIL); Printv(attribute_traces, " trace variable ", symname, " rw [list ", class_name, "_swig_getset ", symname, "]\n", NIL); Printv(attribute_traces, " set ", symname, "\n", NIL); have_attributes = 1; } return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { Language::constructorHandler(n); if (itcl) { String *name = Getattr(n, "name"); String *iname = GetChar(n, "sym:name"); String *realname; ParmList *l = Getattr(n, "parms"); Parm *p = 0; String *pname = NewString(""); realname = iname ? iname : name; if (!have_constructor) { // Add this member to our class handler function Printf(constructor, " constructor { "); // Add parameter list int pnum = 0; for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); String *dv = Getattr(p, "value"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } if (Len(dv) > 0) { Printv(constructor, "{", pname, " {", dv, "} } ", NIL); } else { Printv(constructor, pname, " ", NIL); } } ++pnum; } Printf(constructor, "} { \n"); // [BRE] 08/17/00 Added test to see if we are instantiating this object // type, or, if this constructor is being called as part of the itcl // inheritance hierarchy. // In the former case, we need to call the C++ constructor, in the // latter we don't, or we end up with two C++ objects. // Check to see if we are instantiating a 'realname' or something // derived from it. // Printv(constructor, " if { [string equal -nocase \"", realname, "\" \"[namespace tail [info class]]\" ] } {\n", NIL); // Call to constructor wrapper and parent Ptr class // [BRE] add -namespace/-prefix support if (namespace_option) { Printv(constructor, " ", realname, "Ptr::constructor [", ns_name, "::new_", realname, NIL); } else { Printv(constructor, " ", realname, "Ptr::constructor [new_", realname, NIL); } pnum = 0; for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); Clear(pname); /* Only print an argument if not void */ if (Cmp(pt, "void") != 0) { if (Len(pn) > 0) { Printv(pname, pn, NIL); } else { Printf(pname, "p%d", pnum); } Printv(constructor, " $", pname, NIL); } ++pnum; } Printv(constructor, "]\n", " }\n", " } {\n", " set thisown 1\n", " }\n", NIL); } } if (!have_constructor) constructor_name = NewString(Getattr(n, "sym:name")); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); have_destructor = 1; destructor_action = Getattr(n, "wrap:action"); return SWIG_OK; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { if (Strchr(s, ' ')) return 0; return 1; } /* ------------------------------------------------------------ * usage_string() * ------------------------------------------------------------ */ char *usage_string(char *iname, SwigType *, ParmList *l) { static String *temp = 0; Parm *p; int i, numopt, pcount; if (!temp) temp = NewString(""); Clear(temp); if (namespace_option) { Printf(temp, "%s::%s ", ns_name, iname); } else { Printf(temp, "%s ", iname); } /* Now go through and print parameters */ i = 0; pcount = emit_num_arguments(l); numopt = pcount - emit_num_required(l); for (p = l; p; p = nextSibling(p)) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); /* Only print an argument if not ignored */ if (!checkAttribute(p, "tmap:in:numinputs", "0")) { if (i >= (pcount - numopt)) Putc('?', temp); if (Len(pn) > 0) { Printf(temp, "%s", pn); } else { Printf(temp, "%s", SwigType_str(pt, 0)); } if (i >= (pcount - numopt)) Putc('?', temp); Putc(' ', temp); i++; } } return Char(temp); } String *runtimeCode() { String *s = NewString(""); String *serrors = Swig_include_sys("tclerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'tclerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *sapi = Swig_include_sys("tclapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'tclapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("tclrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'tclrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigtclrun.h"); } }; /* ---------------------------------------------------------------------- * swig_tcl() - Instantiate module * ---------------------------------------------------------------------- */ static Language *new_swig_tcl() { return new TCL8(); } extern "C" Language *swig_tcl(void) { return new_swig_tcl(); } swig-3.0.12/Source/Modules/typepass.cxx0000664000175000017500000012240113042756442017701 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * typepass.cxx * * This module builds all of the internal type information by collecting * typedef declarations as well as registering classes, structures, and unions. * This information is needed to correctly handle shadow classes and other * advanced features. This phase of compilation is also used to perform * type-expansion. All types are fully qualified with namespace prefixes * and other information needed for compilation. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" struct normal_node { Symtab *symtab; Hash *typescope; List *normallist; normal_node *next; }; static normal_node *patch_list = 0; /* Singleton class - all non-static methods in this class are private */ class TypePass:private Dispatcher { Node *inclass; Node *module; int importmode; String *nsname; String *nssymname; Hash *classhash; List *normalize; TypePass() : inclass(0), module(0), importmode(0), nsname(0), nssymname(0), classhash(0), normalize(0) { } /* Normalize a type. Replaces type with fully qualified version */ void normalize_type(SwigType *ty) { SwigType *qty; if (CPlusPlus) { Replaceall(ty, "struct ", ""); Replaceall(ty, "union ", ""); Replaceall(ty, "class ", ""); } qty = SwigType_typedef_qualified(ty); /* Printf(stdout,"%s --> %s\n", ty, qty); */ Clear(ty); Append(ty, qty); Delete(qty); } /* Normalize a parameter list */ void normalize_parms(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); normalize_type(ty); /* This is a check for a function type */ { SwigType *qty = SwigType_typedef_resolve_all(ty); if (SwigType_isfunction(qty)) { SwigType_add_pointer(ty); } Delete(qty); } String *value = Getattr(p, "value"); if (value) { Node *n = Swig_symbol_clookup(value, 0); if (n) { String *q = Swig_symbol_qualified(n); if (q && Len(q)) { String *vb = Swig_scopename_last(value); Clear(value); Printf(value, "%s::%s", SwigType_namestr(q), vb); Delete(q); } } } if (value && SwigType_istemplate(value)) { String *nv = SwigType_namestr(value); Setattr(p, "value", nv); } p = nextSibling(p); } } void normalize_later(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); Append(normalize, ty); p = nextSibling(p); } } /* Walk through entries in normalize list and patch them up */ void normalize_list() { Hash *currentsym = Swig_symbol_current(); normal_node *nn = patch_list; normal_node *np; while (nn) { Swig_symbol_setscope(nn->symtab); SwigType_set_scope(nn->typescope); Iterator t; for (t = First(nn->normallist); t.item; t = Next(t)) { normalize_type(t.item); } Delete(nn->normallist); np = nn->next; delete(nn); nn = np; } Swig_symbol_setscope(currentsym); } /* generate C++ inheritance type-relationships */ void cplus_inherit_types_impl(Node *first, Node *cls, String *clsname, const char *bases, const char *baselist, int ispublic, String *cast = 0) { if (first == cls) return; /* The Marcelo check */ if (!cls) cls = first; List *alist = 0; List *ilist = Getattr(cls, bases); if (!ilist) { List *nlist = Getattr(cls, baselist); if (nlist) { int len = Len(nlist); int i; for (i = 0; i < len; i++) { Node *bcls = 0; int clsforward = 0; String *bname = Getitem(nlist, i); String *sname = bname; String *tname = 0; /* Try to locate the base class. We look in the symbol table and we chase typedef declarations to get to the base class if necessary */ Symtab *st = Getattr(cls, "sym:symtab"); if (SwigType_istemplate(bname)) { tname = SwigType_typedef_resolve_all(bname); sname = tname; } while (1) { String *qsname = SwigType_typedef_qualified(sname); bcls = Swig_symbol_clookup(qsname, st); Delete(qsname); if (bcls) { if (Strcmp(nodeType(bcls), "class") != 0) { /* Not a class. The symbol could be a typedef. */ if (checkAttribute(bcls, "storage", "typedef")) { SwigType *decl = Getattr(bcls, "decl"); if (!decl || !(Len(decl))) { sname = Getattr(bcls, "type"); st = Getattr(bcls, "sym:symtab"); if (SwigType_istemplate(sname)) { if (tname) Delete(tname); tname = SwigType_typedef_resolve_all(sname); sname = tname; } continue; } // A case when both outer and nested classes inherit from the same parent. Constructor may be found instead of the class itself. } else if (GetFlag(cls, "nested") && checkAttribute(bcls, "nodeType", "constructor")) { bcls = Getattr(bcls, "parentNode"); if (Getattr(bcls, "typepass:visit")) { if (!Getattr(bcls, "feature:onlychildren")) { if (!ilist) ilist = alist = NewList(); Append(ilist, bcls); } else { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' has no name as it is an empty template instantiated with '%%template()'. Ignored.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "The %%template directive must be written before '%s' is used as a base class and be declared with a name.\n", SwigType_namestr(bname)); } } break; } if (Strcmp(nodeType(bcls), "classforward") != 0) { Swig_error(Getfile(bname), Getline(bname), "'%s' is not a valid base class.\n", SwigType_namestr(bname)); Swig_error(Getfile(bcls), Getline(bcls), "See definition of '%s'.\n", SwigType_namestr(bname)); } else { Swig_warning(WARN_TYPE_INCOMPLETE, Getfile(bname), Getline(bname), "Base class '%s' is incomplete.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_INCOMPLETE, Getfile(bcls), Getline(bcls), "Only forward declaration '%s' was found.\n", SwigType_namestr(bname)); clsforward = 1; } bcls = 0; } else { if (Getattr(bcls, "typepass:visit")) { if (!Getattr(bcls, "feature:onlychildren")) { if (!ilist) ilist = alist = NewList(); Append(ilist, bcls); } else { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' has no name as it is an empty template instantiated with '%%template()'. Ignored.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "The %%template directive must be written before '%s' is used as a base class and be declared with a name.\n", SwigType_namestr(bname)); } } else { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Base class '%s' undefined.\n", SwigType_namestr(bname)); Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bcls), Getline(bcls), "'%s' must be defined before it is used as a base class.\n", SwigType_namestr(bname)); } } } break; } if (tname) Delete(tname); if (!bcls) { if (!clsforward && !GetFlag(cls, "feature:ignore")) { if (ispublic && !Getmeta(bname, "already_warned")) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Nothing known about base class '%s'. Ignored.\n", SwigType_namestr(bname)); if (Strchr(bname, '<')) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(bname), Getline(bname), "Maybe you forgot to instantiate '%s' using %%template.\n", SwigType_namestr(bname)); } Setmeta(bname, "already_warned", "1"); } } SwigType_inherit(clsname, bname, cast, 0); } } } if (ilist) { Setattr(cls, bases, ilist); } } if (alist) Delete(alist); if (!ilist) return; int len = Len(ilist); int i; for (i = 0; i < len; i++) { Node *n = Getitem(ilist, i); String *bname = Getattr(n, "name"); Node *bclass = n; /* Getattr(n,"class"); */ Hash *scopes = Getattr(bclass, "typescope"); SwigType_inherit(clsname, bname, cast, 0); if (ispublic && !GetFlag(bclass, "feature:ignore")) { String *smartptr = Getattr(first, "feature:smartptr"); if (smartptr) { SwigType *smart = Swig_cparse_smartptr(first); if (smart) { /* Record a (fake) inheritance relationship between smart pointer and smart pointer to base class, so that smart pointer upcasts are automatically generated. */ SwigType *bsmart = Copy(smart); SwigType *rclsname = SwigType_typedef_resolve_all(clsname); SwigType *rbname = SwigType_typedef_resolve_all(bname); int replace_count = Replaceall(bsmart, rclsname, rbname); if (replace_count == 0) { // If no replacement made, it will be because rclsname is fully resolved, but the // type in the smartptr feature used a typedef or not fully resolved name. String *firstname = Getattr(first, "name"); Replaceall(bsmart, firstname, rbname); } Delete(rclsname); Delete(rbname); String *smartnamestr = SwigType_namestr(smart); String *bsmartnamestr = SwigType_namestr(bsmart); /* construct casting code */ String *convcode = NewStringf("\n *newmemory = SWIG_CAST_NEW_MEMORY;\n return (void *) new %s(*(%s *)$from);\n", bsmartnamestr, smartnamestr); Delete(bsmartnamestr); Delete(smartnamestr); /* setup inheritance relationship between smart pointer templates */ SwigType_inherit(smart, bsmart, 0, convcode); if (!GetFlag(bclass, "feature:smartptr")) Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Base class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(bclass, "name")), SwigType_namestr(Getattr(first, "name"))); Delete(convcode); Delete(bsmart); } Delete(smart); } else { if (GetFlag(bclass, "feature:smartptr")) Swig_warning(WARN_LANG_SMARTPTR_MISSING, Getfile(first), Getline(first), "Derived class '%s' of '%s' is not similarly marked as a smart pointer.\n", SwigType_namestr(Getattr(first, "name")), SwigType_namestr(Getattr(bclass, "name"))); } } if (!importmode) { String *btype = Copy(bname); SwigType_add_pointer(btype); SwigType_remember(btype); Delete(btype); } if (scopes) { SwigType_inherit_scope(scopes); } /* Set up inheritance in the symbol table */ Symtab *st = Getattr(cls, "symtab"); Symtab *bst = Getattr(bclass, "symtab"); if (st == bst) { Swig_warning(WARN_PARSE_REC_INHERITANCE, Getfile(cls), Getline(cls), "Recursive scope inheritance of '%s'.\n", SwigType_namestr(Getattr(cls, "name"))); continue; } Symtab *s = Swig_symbol_current(); Swig_symbol_setscope(st); Swig_symbol_inherit(bst); Swig_symbol_setscope(s); /* Recursively hit base classes */ String *namestr = SwigType_namestr(Getattr(bclass, "name")); String *newcast = NewStringf("(%s *)%s", namestr, cast); Delete(namestr); cplus_inherit_types_impl(first, bclass, clsname, bases, baselist, ispublic, newcast); Delete(newcast); } } void append_list(List *lb, List *la) { if (la && lb) { for (Iterator bi = First(la); bi.item; bi = Next(bi)) { Append(lb, bi.item); } } } void cplus_inherit_types(Node *first, Node *cls, String *clsname, String *cast = 0) { cplus_inherit_types_impl(first, cls, clsname, "bases", "baselist", 1, cast); cplus_inherit_types_impl(first, cls, clsname, "protectedbases", "protectedbaselist", 0, cast); cplus_inherit_types_impl(first, cls, clsname, "privatebases", "privatebaselist", 0, cast); if (!cls) cls = first; List *allbases = NewList(); append_list(allbases, Getattr(cls, "bases")); append_list(allbases, Getattr(cls, "protectedbases")); append_list(allbases, Getattr(cls, "privatebases")); if (Len(allbases)) { Setattr(cls, "allbases", allbases); } Delete(allbases); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { importmode = 0; module = Getattr(n, "module"); inclass = 0; normalize = 0; nsname = 0; nssymname = 0; classhash = Getattr(n, "classes"); emit_children(n); normalize_list(); SwigType_set_scope(0); return SWIG_OK; } /* ------------------------------------------------------------ * moduleDirective() * ------------------------------------------------------------ */ virtual int moduleDirective(Node *n) { if (!module) { module = n; } return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *oldmodule = module; int oldimport = importmode; importmode = 1; module = 0; emit_children(n); importmode = oldimport; module = oldmodule; return SWIG_OK; } /* ------------------------------------------------------------ * includeDirective() * externDirective() * extendDirective() * ------------------------------------------------------------ */ virtual int includeDirective(Node *n) { return emit_children(n); } virtual int externDeclaration(Node *n) { return emit_children(n); } virtual int extendDirective(Node *n) { return emit_children(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *storage = Getattr(n, "storage"); String *kind = Getattr(n, "kind"); save_value oldinclass(inclass); List *olist = normalize; Symtab *symtab; String *nname = 0; String *fname = 0; String *scopename = 0; String *template_default_expanded = 0; normalize = NewList(); if (name) { if (SwigType_istemplate(name)) { // We need to fully resolve the name and expand default template parameters to make templates work correctly */ Node *cn; SwigType *resolved_name = SwigType_typedef_resolve_all(name); SwigType *deftype_name = Swig_symbol_template_deftype(resolved_name, 0); fname = Copy(resolved_name); if (!Equal(resolved_name, deftype_name)) template_default_expanded = Copy(deftype_name); if (!Equal(fname, name) && (cn = Swig_symbol_clookup_local(fname, 0))) { if ((n == cn) || (Strcmp(nodeType(cn), "template") == 0) || (Getattr(cn, "feature:onlychildren") != 0) || (Getattr(n, "feature:onlychildren") != 0)) { Swig_symbol_cadd(fname, n); if (template_default_expanded) Swig_symbol_cadd(template_default_expanded, n); SwigType_typedef_class(fname); scopename = Copy(fname); } else { Swig_warning(WARN_TYPE_REDEFINED, Getfile(n), Getline(n), "Template '%s' was already wrapped,\n", SwigType_namestr(name)); Swig_warning(WARN_TYPE_REDEFINED, Getfile(cn), Getline(cn), "previous wrap of '%s'.\n", SwigType_namestr(Getattr(cn, "name"))); scopename = 0; } } else { Swig_symbol_cadd(fname, n); SwigType_typedef_class(fname); scopename = Copy(fname); } Delete(deftype_name); Delete(resolved_name); } else { if ((CPlusPlus) || (unnamed)) { SwigType_typedef_class(name); } else { SwigType_typedef_class(NewStringf("%s %s", kind, name)); } scopename = Copy(name); } } else { scopename = 0; } Setattr(n, "typepass:visit", "1"); /* Need to set up a typedef if unnamed */ if (unnamed && tdname && (Cmp(storage, "typedef") == 0)) { SwigType_typedef(unnamed, tdname); } // name of the outer class should already be patched to contain its outer classes names, but not to contain namespaces // namespace name (if present) is added after processing child nodes if (Getattr(n, "nested:outer") && name) { String *outerName = Getattr(Getattr(n, "nested:outer"), "name"); name = NewStringf("%s::%s", outerName, name); Setattr(n, "name", name); if (tdname) { tdname = NewStringf("%s::%s", outerName, tdname); Setattr(n, "tdname", tdname); } } if (nsname && name) { nname = NewStringf("%s::%s", nsname, name); String *tdname = Getattr(n, "tdname"); if (tdname) { tdname = NewStringf("%s::%s", nsname, tdname); Setattr(n, "tdname", tdname); } } if (nssymname) { if (GetFlag(n, "feature:nspace")) Setattr(n, "sym:nspace", nssymname); } SwigType_new_scope(scopename); SwigType_attach_symtab(Getattr(n, "symtab")); /* Inherit type definitions into the class */ if (name && !(GetFlag(n, "nested") && !checkAttribute(n, "access", "public") && (GetFlag(n, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None))) { cplus_inherit_types(n, 0, nname ? nname : (fname ? fname : name)); } inclass = n; symtab = Swig_symbol_setscope(Getattr(n, "symtab")); emit_children(n); Swig_symbol_setscope(symtab); Hash *ts = SwigType_pop_scope(); Setattr(n, "typescope", ts); Delete(ts); Setattr(n, "module", module); // When a fully qualified templated type with default parameters is used in the parsed code, // the following additional symbols and scopes are needed for successful lookups if (template_default_expanded) { Swig_symbol_alias(template_default_expanded, Getattr(n, "symtab")); SwigType_scope_alias(template_default_expanded, Getattr(n, "typescope")); } /* Normalize deferred types */ { normal_node *nn = new normal_node(); nn->normallist = normalize; nn->symtab = Getattr(n, "symtab"); nn->next = patch_list; nn->typescope = Getattr(n, "typescope"); patch_list = nn; } normalize = olist; /* If in a namespace, patch the class name */ if (nname) { Setattr(n, "name", nname); Delete(nname); } Delete(fname); return SWIG_OK; } /* ------------------------------------------------------------ * templateDeclaration() * ------------------------------------------------------------ */ virtual int templateDeclaration(Node *n) { String *name = Getattr(n, "name"); String *ttype = Getattr(n, "templatetype"); if (Strcmp(ttype, "class") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); } else if (Strcmp(ttype, "classforward") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); /* SwigType_typedef_class(name); */ } else if (Strcmp(ttype, "cdecl") == 0) { String *rname = SwigType_typedef_resolve_all(name); SwigType_typedef_class(rname); Delete(rname); } return SWIG_OK; } /* ------------------------------------------------------------ * lambdaDeclaration() * ------------------------------------------------------------ */ virtual int lambdaDeclaration(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * classforwardDeclaration() * ------------------------------------------------------------ */ virtual int classforwardDeclaration(Node *n) { /* Can't do inside a C struct because it breaks C nested structure wrapping */ if ((!inclass) || (CPlusPlus)) { String *name = Getattr(n, "name"); SwigType_typedef_class(name); } return SWIG_OK; } /* ------------------------------------------------------------ * namespaceDeclaration() * ------------------------------------------------------------ */ virtual int namespaceDeclaration(Node *n) { Symtab *symtab; String *name = Getattr(n, "name"); String *alias = Getattr(n, "alias"); List *olist = normalize; normalize = NewList(); if (alias) { Typetab *ts = Getattr(n, "typescope"); if (!ts) { /* Create an empty scope for the alias */ Node *ns = Getattr(n, "namespace"); SwigType_scope_alias(name, Getattr(ns, "typescope")); ts = Getattr(ns, "typescope"); Setattr(n, "typescope", ts); } /* Namespace alias */ return SWIG_OK; } else { if (name) { Node *nn = Swig_symbol_clookup(name, n); Hash *ts = 0; if (nn) ts = Getattr(nn, "typescope"); if (!ts) { SwigType_new_scope(name); SwigType_attach_symtab(Getattr(n, "symtab")); } else { SwigType_set_scope(ts); } } String *oldnsname = nsname; String *oldnssymname = nssymname; nsname = Swig_symbol_qualified(Getattr(n, "symtab")); nssymname = Swig_symbol_qualified_language_scopename(Getattr(n, "symtab")); symtab = Swig_symbol_setscope(Getattr(n, "symtab")); emit_children(n); Swig_symbol_setscope(symtab); if (name) { Hash *ts = SwigType_pop_scope(); Setattr(n, "typescope", ts); Delete(ts); } /* Normalize deferred types */ { normal_node *nn = new normal_node(); nn->normallist = normalize; nn->symtab = Getattr(n, "symtab"); nn->next = patch_list; nn->typescope = Getattr(n, "typescope"); patch_list = nn; } normalize = olist; Delete(nssymname); nssymname = oldnssymname; Delete(nsname); nsname = oldnsname; return SWIG_OK; } } /* ------------------------------------------------------------ * cDeclaration() * ------------------------------------------------------------ */ virtual int cDeclaration(Node *n) { if (NoExcept) { Delattr(n, "throws"); } /* Normalize types. */ SwigType *ty = Getattr(n, "type"); if (!ty) { return SWIG_OK; } normalize_type(ty); SwigType *decl = Getattr(n, "decl"); if (decl) { normalize_type(decl); } normalize_parms(Getattr(n, "parms")); normalize_parms(Getattr(n, "throws")); if (GetFlag(n, "conversion_operator")) { /* The call to the operator in the generated wrapper must be fully qualified in order to compile */ SwigType *name = Getattr(n, "name"); SwigType *qualifiedname = Swig_symbol_string_qualify(name, 0); Clear(name); Append(name, qualifiedname); Delete(qualifiedname); } if (checkAttribute(n, "storage", "typedef")) { String *name = Getattr(n, "name"); ty = Getattr(n, "type"); decl = Getattr(n, "decl"); SwigType *t = Copy(ty); { /* If the typename is qualified, make sure the scopename is fully qualified when making a typedef */ if (Swig_scopename_check(t) && strncmp(Char(t), "::", 2)) { String *base, *prefix, *qprefix; base = Swig_scopename_last(t); prefix = Swig_scopename_prefix(t); qprefix = SwigType_typedef_qualified(prefix); Delete(t); t = NewStringf("%s::%s", qprefix, base); Delete(base); Delete(prefix); Delete(qprefix); } } SwigType_push(t, decl); if (CPlusPlus) { Replaceall(t, "struct ", ""); Replaceall(t, "union ", ""); Replaceall(t, "class ", ""); } SwigType_typedef(t, name); } /* If namespaces are active. We need to patch the name with a namespace prefix */ if (nsname && !inclass) { String *name = Getattr(n, "name"); if (name) { String *nname = NewStringf("%s::%s", nsname, name); Setattr(n, "name", nname); Delete(nname); } } clean_overloaded(n); return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * ------------------------------------------------------------ */ virtual int constructorDeclaration(Node *n) { if (NoExcept) { Delattr(n, "throws"); } normalize_parms(Getattr(n, "parms")); normalize_parms(Getattr(n, "throws")); clean_overloaded(n); return SWIG_OK; } /* ------------------------------------------------------------ * destructorDeclaration() * ------------------------------------------------------------ */ virtual int destructorDeclaration(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * constantDirective() * ------------------------------------------------------------ */ virtual int constantDirective(Node *n) { SwigType *ty = Getattr(n, "type"); if (ty) { Setattr(n, "type", SwigType_typedef_qualified(ty)); } return SWIG_OK; } /* ------------------------------------------------------------ * enumDeclaration() * ------------------------------------------------------------ */ virtual int enumDeclaration(Node *n) { String *name = Getattr(n, "name"); if (name) { String *scope = 0; // Add a typedef to the type table so that we can use 'enum Name' as well as just 'Name' if (nsname || inclass) { // But first correct the name and tdname to contain the fully qualified scopename if (nsname && inclass) { scope = NewStringf("%s::%s", nsname, Getattr(inclass, "name")); } else if (nsname) { scope = NewStringf("%s", nsname); } else if (inclass) { scope = NewStringf("%s", Getattr(inclass, "name")); } String *nname = NewStringf("%s::%s", scope, name); Setattr(n, "name", nname); String *tdname = Getattr(n, "tdname"); if (tdname) { tdname = NewStringf("%s::%s", scope, tdname); Setattr(n, "tdname", tdname); } SwigType *t = NewStringf("enum %s", nname); SwigType_typedef(t, name); } else { SwigType *t = NewStringf("enum %s", name); SwigType_typedef(t, name); } Delete(scope); } String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *storage = Getattr(n, "storage"); // Construct enumtype - for declaring an enum of this type with SwigType_ltype() etc String *enumtype = 0; if (unnamed && tdname && (Cmp(storage, "typedef") == 0)) { enumtype = Copy(Getattr(n, "tdname")); } else if (name) { enumtype = NewStringf("%s%s", CPlusPlus ? "" : "enum ", Getattr(n, "name")); } else { // anonymous enums enumtype = Copy(Getattr(n, "type")); } Setattr(n, "enumtype", enumtype); if (nssymname) { if (GetFlag(n, "feature:nspace")) Setattr(n, "sym:nspace", nssymname); } // This block of code is for dealing with %ignore on an enum item where the target language // attempts to use the C enum value in the target language itself and expects the previous enum value // to be one more than the previous value... the previous enum item might not exist if it is ignored! // - It sets the first non-ignored enum item with the "firstenumitem" attribute. // - It adds an enumvalue attribute if the previous enum item is ignored { Node *c; int count = 0; String *previous = 0; bool previous_ignored = false; bool firstenumitem = false; for (c = firstChild(n); c; c = nextSibling(c)) { assert(strcmp(Char(nodeType(c)), "enumitem") == 0); bool reset; String *enumvalue = Getattr(c, "enumvalue"); if (GetFlag(c, "feature:ignore") || !Getattr(c, "sym:name")) { reset = enumvalue ? true : false; previous_ignored = true; } else { if (!enumvalue && previous_ignored) { if (previous) Setattr(c, "enumvalue", NewStringf("(%s) + %d", previous, count+1)); else Setattr(c, "enumvalue", NewStringf("%d", count)); SetFlag(c, "virtenumvalue"); // identify enumvalue as virtual, ie not from the parsed source } if (!firstenumitem) { SetFlag(c, "firstenumitem"); firstenumitem = true; } reset = true; previous_ignored = false; } if (reset) { previous = enumvalue ? enumvalue : Getattr(c, "name"); count = 0; } else { count++; } } } emit_children(n); return SWIG_OK; } /* ------------------------------------------------------------ * enumvalueDeclaration() * ------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); String *scopedenum = Getattr(parentNode(n), "scopedenum"); if (!value) value = name; if (Strcmp(value, name) == 0) { String *new_value; if ((nsname || inclass || scopedenum) && cparse_cplusplus) { new_value = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); } else { new_value = NewString(value); } if ((nsname || inclass || scopedenum) && !cparse_cplusplus) { String *cppvalue = NewStringf("%s::%s", SwigType_namestr(Swig_symbol_qualified(n)), value); Setattr(n, "cppvalue", cppvalue); /* for target languages that always generate C++ code even when wrapping C code */ } Setattr(n, "value", new_value); Delete(new_value); } Node *next = nextSibling(n); // Make up an enumvalue if one was not specified in the parsed code (not designed to be used on enum items and %ignore - enumvalue will be set instead) if (!GetFlag(n, "feature:ignore")) { if (Getattr(n, "_last") && !Getattr(n, "enumvalue")) { // Only the first enum item has _last set (Note: first non-ignored enum item has firstenumitem set) Setattr(n, "enumvalueex", "0"); } if (next && !Getattr(next, "enumvalue")) { Setattr(next, "enumvalueex", NewStringf("%s + 1", Getattr(n, "sym:name"))); } } return SWIG_OK; } /* ------------------------------------------------------------ * enumforwardDeclaration() * ------------------------------------------------------------ */ virtual int enumforwardDeclaration(Node *n) { // Use enumDeclaration() to do all the hard work. // Note that no children can be emitted in a forward declaration as there aren't any. int result = enumDeclaration(n); if (result == SWIG_OK) { // Detect when the real enum matching the forward enum declaration has not been parsed/declared SwigType *ty = SwigType_typedef_resolve_all(Getattr(n, "type")); Replaceall(ty, "enum ", ""); Node *nn = Swig_symbol_clookup(ty, 0); String *nodetype = nn ? nodeType(nn) : 0; if (nodetype) { if (Equal(nodetype, "enumforward")) { SetFlag(nn, "enumMissing"); } // if a real enum was declared this would be an "enum" node type } Delete(ty); } return result; } #ifdef DEBUG_OVERLOADED static void show_overloaded(Node *n) { Node *c = Getattr(n, "sym:overloaded"); Node *checkoverloaded = c; Printf(stdout, "-------------------- overloaded start %s sym:overloaded():%p -------------------------------\n", Getattr(n, "name"), c); while (c) { if (Getattr(c, "error")) { c = Getattr(c, "sym:nextSibling"); continue; } if (Getattr(c, "sym:overloaded") != checkoverloaded) { Printf(stdout, "sym:overloaded error c:%p checkoverloaded:%p\n", c, checkoverloaded); Swig_print_node(c); exit (1); } String *decl = Strcmp(nodeType(c), "using") == 0 ? NewString("------") : Getattr(c, "decl"); Printf(stdout, " show_overloaded %s::%s(%s) [%s] nodeType:%s\n", parentNode(c) ? Getattr(parentNode(c), "name") : "NOPARENT", Getattr(c, "name"), decl, Getattr(c, "sym:overname"), nodeType(c)); if (!Getattr(c, "sym:overloaded")) { Printf(stdout, "sym:overloaded error.....%p\n", c); Swig_print_node(c); exit (1); } c = Getattr(c, "sym:nextSibling"); } Printf(stdout, "-------------------- overloaded end %s -------------------------------\n", Getattr(n, "name")); } #endif /* ------------------------------------------------------------ * usingDeclaration() * ------------------------------------------------------------ */ virtual int usingDeclaration(Node *n) { if (Getattr(n, "namespace")) { /* using namespace id */ /* For a namespace import. We set up inheritance in the type system */ Node *ns = Getattr(n, "node"); if (ns) { Typetab *ts = Getattr(ns, "typescope"); if (ts) { SwigType_using_scope(ts); } } return SWIG_OK; } else { Node *ns; /* using id */ Symtab *stab = Getattr(n, "sym:symtab"); if (stab) { String *uname = Getattr(n, "uname"); ns = Swig_symbol_clookup(uname, stab); if (!ns && SwigType_istemplate(uname)) { String *tmp = Swig_symbol_template_deftype(uname, 0); if (!Equal(tmp, uname)) { ns = Swig_symbol_clookup(tmp, stab); } Delete(tmp); } } else { ns = 0; } if (!ns) { if (is_public(n)) { Swig_warning(WARN_PARSE_USING_UNDEF, Getfile(n), Getline(n), "Nothing known about '%s'.\n", SwigType_namestr(Getattr(n, "uname"))); } } else { /* Only a single symbol is being used. There are only a few symbols that we actually care about. These are typedef, class declarations, and enum */ String *ntype = nodeType(ns); if (Strcmp(ntype, "cdecl") == 0) { if (checkAttribute(ns, "storage", "typedef")) { /* A typedef declaration */ String *uname = Getattr(n, "uname"); SwigType_typedef_using(uname); } else { /* A normal C declaration. */ if ((inclass) && (!GetFlag(n, "feature:ignore")) && (Getattr(n, "sym:name"))) { Node *c = ns; Node *unodes = 0, *last_unodes = 0; int ccount = 0; String *symname = Getattr(n, "sym:name"); while (c) { if (Strcmp(nodeType(c), "cdecl") == 0) { if (!(Swig_storage_isstatic(c) || checkAttribute(c, "storage", "typedef") || checkAttribute(c, "storage", "friend") || (Getattr(c, "feature:extend") && !Getattr(c, "code")) || GetFlag(c, "feature:ignore"))) { /* Don't generate a method if the method is overridden in this class, * for example don't generate another m(bool) should there be a Base::m(bool) : * struct Derived : Base { * void m(bool); * using Base::m; * }; */ String *csymname = Getattr(c, "sym:name"); if (!csymname || (Strcmp(csymname, symname) == 0)) { { String *decl = Getattr(c, "decl"); Node *over = Getattr(n, "sym:overloaded"); int match = 0; while (over) { String *odecl = Getattr(over, "decl"); if (Cmp(decl, odecl) == 0) { match = 1; break; } over = Getattr(over, "sym:nextSibling"); } if (match) { c = Getattr(c, "csym:nextSibling"); continue; } } Node *nn = copyNode(c); Delattr(nn, "access"); // access might be different from the method in the base class Setattr(nn, "access", Getattr(n, "access")); if (!Getattr(nn, "sym:name")) Setattr(nn, "sym:name", symname); if (!GetFlag(nn, "feature:ignore")) { ParmList *parms = CopyParmList(Getattr(c, "parms")); int is_pointer = SwigType_ispointer_return(Getattr(nn, "decl")); int is_void = checkAttribute(nn, "type", "void") && !is_pointer; Setattr(nn, "parms", parms); Delete(parms); if (Getattr(n, "feature:extend")) { String *ucode = is_void ? NewStringf("{ self->%s(", Getattr(n, "uname")) : NewStringf("{ return self->%s(", Getattr(n, "uname")); for (ParmList *p = parms; p;) { Append(ucode, Getattr(p, "name")); p = nextSibling(p); if (p) Append(ucode, ","); } Append(ucode, "); }"); Setattr(nn, "code", ucode); Delete(ucode); } ParmList *throw_parm_list = Getattr(c, "throws"); if (throw_parm_list) Setattr(nn, "throws", CopyParmList(throw_parm_list)); ccount++; if (!last_unodes) { last_unodes = nn; unodes = nn; } else { Setattr(nn, "previousSibling", last_unodes); Setattr(last_unodes, "nextSibling", nn); Setattr(nn, "sym:previousSibling", last_unodes); Setattr(last_unodes, "sym:nextSibling", nn); Setattr(nn, "sym:overloaded", unodes); Setattr(unodes, "sym:overloaded", unodes); last_unodes = nn; } } else { Delete(nn); } } } } c = Getattr(c, "csym:nextSibling"); } if (unodes) { set_firstChild(n, unodes); if (ccount > 1) { if (!Getattr(n, "sym:overloaded")) { Setattr(n, "sym:overloaded", n); Setattr(n, "sym:overname", "_SWIG_0"); } } } /* Hack the parse tree symbol table for overloaded methods. Replace the "using" node with the * list of overloaded methods we have just added in as child nodes to the "using" node. * The node will still exist, it is just the symbol table linked list of overloaded methods * which is hacked. */ if (Getattr(n, "sym:overloaded")) { int cnt = 0; #ifdef DEBUG_OVERLOADED Node *debugnode = n; show_overloaded(n); #endif if (!firstChild(n)) { // Remove from overloaded list ('using' node does not actually end up adding in any methods) Node *ps = Getattr(n, "sym:previousSibling"); Node *ns = Getattr(n, "sym:nextSibling"); if (ps) { Setattr(ps, "sym:nextSibling", ns); } if (ns) { Setattr(ns, "sym:previousSibling", ps); } } else { // The 'using' node results in methods being added in - slot in the these methods here Node *ps = Getattr(n, "sym:previousSibling"); Node *ns = Getattr(n, "sym:nextSibling"); Node *fc = firstChild(n); Node *pp = fc; Node *firstoverloaded = Getattr(n, "sym:overloaded"); if (firstoverloaded == n) { // This 'using' node we are cutting out was the first node in the overloaded list. // Change the first node in the list to its first sibling Delattr(firstoverloaded, "sym:overloaded"); Node *nnn = Getattr(firstoverloaded, "sym:nextSibling"); firstoverloaded = fc; while (nnn) { Setattr(nnn, "sym:overloaded", firstoverloaded); nnn = Getattr(nnn, "sym:nextSibling"); } } while (pp) { Node *ppn = Getattr(pp, "sym:nextSibling"); Setattr(pp, "sym:overloaded", firstoverloaded); Setattr(pp, "sym:overname", NewStringf("%s_%d", Getattr(n, "sym:overname"), cnt++)); if (ppn) pp = ppn; else break; } if (ps) { Setattr(ps, "sym:nextSibling", fc); Setattr(fc, "sym:previousSibling", ps); } if (ns) { Setattr(ns, "sym:previousSibling", pp); Setattr(pp, "sym:nextSibling", ns); } #ifdef DEBUG_OVERLOADED debugnode = firstoverloaded; #endif } Delattr(n, "sym:previousSibling"); Delattr(n, "sym:nextSibling"); Delattr(n, "sym:overloaded"); Delattr(n, "sym:overname"); #ifdef DEBUG_OVERLOADED show_overloaded(debugnode); #endif clean_overloaded(n); // Needed? } } } } else if ((Strcmp(ntype, "class") == 0) || ((Strcmp(ntype, "classforward") == 0))) { /* We install the using class name as kind of a typedef back to the original class */ String *uname = Getattr(n, "uname"); /* Import into current type scope */ SwigType_typedef_using(uname); } else if (Strcmp(ntype, "enum") == 0) { SwigType_typedef_using(Getattr(n, "uname")); } else if (Strcmp(ntype, "template") == 0) { /* Printf(stdout, "usingDeclaration template %s --- %s\n", Getattr(n, "name"), Getattr(n, "uname")); SwigType_typedef_using(Getattr(n, "uname")); */ } } } return SWIG_OK; } /* ------------------------------------------------------------ * typemapDirective() * ------------------------------------------------------------ */ virtual int typemapDirective(Node *n) { if (inclass || nsname) { Node *items = firstChild(n); while (items) { Parm *pattern = Getattr(items, "pattern"); Parm *parms = Getattr(items, "parms"); normalize_later(pattern); normalize_later(parms); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * typemapcopyDirective() * ------------------------------------------------------------ */ virtual int typemapcopyDirective(Node *n) { if (inclass || nsname) { Node *items = firstChild(n); ParmList *pattern = Getattr(n, "pattern"); normalize_later(pattern); while (items) { ParmList *npattern = Getattr(items, "pattern"); normalize_later(npattern); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * applyDirective() * ------------------------------------------------------------ */ virtual int applyDirective(Node *n) { if (inclass || nsname) { ParmList *pattern = Getattr(n, "pattern"); normalize_later(pattern); Node *items = firstChild(n); while (items) { Parm *apattern = Getattr(items, "pattern"); normalize_later(apattern); items = nextSibling(items); } } return SWIG_OK; } /* ------------------------------------------------------------ * clearDirective() * ------------------------------------------------------------ */ virtual int clearDirective(Node *n) { if (inclass || nsname) { Node *p; for (p = firstChild(n); p; p = nextSibling(p)) { ParmList *pattern = Getattr(p, "pattern"); normalize_later(pattern); } } return SWIG_OK; } public: static void pass(Node *n) { TypePass t; t.top(n); } }; void Swig_process_types(Node *n) { if (!n) return; TypePass::pass(n); } swig-3.0.12/Source/Modules/python.cxx0000664000175000017500000063566113042756442017373 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * python.cxx * * Python language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include #include "cparse.h" #include #include #include #define PYSHADOW_MEMBER 0x2 #define WARN_PYTHON_MULTIPLE_INH 405 static String *const_code = 0; static String *module = 0; static String *package = 0; static String *mainmodule = 0; static String *interface = 0; static String *global_name = 0; static int shadow = 1; static int use_kw = 0; static int director_method_index = 0; static int builtin = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_shadow_py = 0; static String *f_shadow = 0; static String *f_shadow_begin = 0; static Hash *f_shadow_imports = 0; static String *f_shadow_after_begin = 0; static String *f_shadow_stubs = 0; static Hash *builtin_getset = 0; static Hash *builtin_closures = 0; static Hash *class_members = 0; static File *f_builtins = 0; static String *builtin_tp_init = 0; static String *builtin_methods = 0; static String *builtin_default_unref = 0; static String *builtin_closures_code = 0; static String *methods; static String *class_name; static String *shadow_indent = 0; static int in_class = 0; static int classic = 0; static int modern = 0; static int new_repr = 1; static int no_header_file = 0; static int max_bases = 0; static int builtin_bases_needed = 0; static int py3 = 0; /* C++ Support + Shadow Classes */ static int have_constructor; static int have_repr; static String *real_classname; /* Thread Support */ static int threads = 0; static int nothreads = 0; static int classptr = 0; /* Other options */ static int shadowimport = 1; static int buildnone = 0; static int nobuildnone = 0; static int safecstrings = 0; static int dirvtable = 0; static int proxydel = 1; static int fastunpack = 0; static int fastproxy = 0; static int fastquery = 0; static int fastinit = 0; static int olddefs = 0; static int modernargs = 0; static int aliasobj0 = 0; static int castmode = 0; static int extranative = 0; static int outputtuple = 0; static int nortti = 0; static int relativeimport = 0; /* flags for the make_autodoc function */ enum autodoc_t { AUTODOC_CLASS, AUTODOC_CTOR, AUTODOC_DTOR, AUTODOC_STATICFUNC, AUTODOC_FUNC, AUTODOC_METHOD }; static const char *usage1 = "\ Python Options (available with -python)\n\ -aliasobj0 - Alias obj0 when using fastunpack, needed for some old typemaps \n\ -buildnone - Use Py_BuildValue(" ") to obtain Py_None (default in Windows)\n\ -builtin - Create new python built-in types, rather than proxy classes, for better performance\n\ -castmode - Enable the casting mode, which allows implicit cast between types in python\n\ -classic - Use classic classes only\n\ -classptr - Generate shadow 'ClassPtr' as in older swig versions\n\ -cppcast - Enable C++ casting operators (default) \n\ -dirvtable - Generate a pseudo virtual table for directors for faster dispatch \n\ -extranative - Return extra native C++ wraps for std containers when possible \n\ -fastinit - Use fast init mechanism for classes (default)\n\ -fastunpack - Use fast unpack mechanism to parse the argument functions \n\ -fastproxy - Use fast proxy mechanism for member methods \n\ -fastquery - Use fast query mechanism for types \n\ -globals - Set used to access C global variable [default: 'cvar']\n\ -interface - Set the lib name to \n\ -keyword - Use keyword arguments\n\ -modern - Use modern python features only, without compatibility code\n\ -modernargs - Use \"modern\" args mechanism to pack/unpack the function arguments\n"; static const char *usage2 = "\ -newrepr - Use more informative version of __repr__ in proxy classes (default) \n\ -newvwm - New value wrapper mode, use only when everything else fails \n\ -noaliasobj0 - Don't generate an obj0 alias when using fastunpack (default) \n\ -nobuildnone - Access Py_None directly (default in non-Windows systems)\n\ -nocastmode - Disable the casting mode (default)\n\ -nocppcast - Disable C++ casting operators, useful for generating bugs\n\ -nodirvtable - Don't use the virtual table feature, resolve the python method each time (default)\n\ -noexcept - No automatic exception handling\n\ -noextranative - Don't use extra native C++ wraps for std containers when possible (default) \n\ -nofastinit - Use traditional init mechanism for classes \n\ -nofastunpack - Use traditional UnpackTuple method to parse the argument functions (default) \n\ -nofastproxy - Use traditional proxy mechanism for member methods (default) \n\ -nofastquery - Use traditional query mechanism for types (default) \n\ -noh - Don't generate the output header file\n\ -nomodern - Don't use modern python features which are not backwards compatible \n\ -nomodernargs - Use classic ParseTuple/CallFunction methods to pack/unpack the function arguments (default) \n"; static const char *usage3 = "\ -noolddefs - Don't emit the old method definitions even when using fastproxy (default) \n\ -nooutputtuple - Use a PyList for appending output values (default) \n\ -noproxy - Don't generate proxy classes \n\ -noproxydel - Don't generate the redundant __del__ method \n\ -noproxyimport - Don't insert proxy import statements derived from the %import directive \n\ -nortti - Disable the use of the native C++ RTTI with directors\n\ -nosafecstrings - Avoid extra strings copies when possible (default)\n\ -nothreads - Disable thread support for the entire interface\n\ -olddefs - Keep the old method definitions even when using fastproxy\n\ -oldrepr - Use shorter and old version of __repr__ in proxy classes\n\ -outputtuple - Use a PyTuple for outputs instead of a PyList (use carefully with legacy interfaces) \n\ -proxydel - Generate a __del__ method even though it is now redundant (default) \n\ -relativeimport - Use relative python imports \n\ -safecstrings - Use safer (but slower) C string mapping, generating copies from Python -> C/C++\n\ -threads - Add thread support for all the interface\n\ -O - Enable the following optimization options: \n\ -modern -fastdispatch -nosafecstrings -fvirtual -noproxydel \n\ -fastproxy -fastinit -fastunpack -fastquery -modernargs -nobuildnone \n\ -py3 - Generate code with Python 3 specific features:\n\ Function annotation \n\ \n"; static String *getSlot(Node *n = NULL, const char *key = NULL, String *default_slot = NULL) { static String *zero = NewString("0"); String *val = n && key && *key ? Getattr(n, key) : NULL; return val ? val : default_slot ? default_slot : zero; } static void printSlot(File *f, String *slotval, const char *slotname, const char *functype = NULL) { String *slotval_override = 0; if (functype) slotval = slotval_override = NewStringf("(%s) %s", functype, slotval); int len = Len(slotval); int fieldwidth = len > 41 ? (len > 61 ? 0 : 61 - len) : 41 - len; Printf(f, " %s,%*s/* %s */\n", slotval, fieldwidth, "", slotname); Delete(slotval_override); } static String *getClosure(String *functype, String *wrapper, int funpack = 0) { static const char *functypes[] = { "unaryfunc", "SWIGPY_UNARYFUNC_CLOSURE", "destructor", "SWIGPY_DESTRUCTOR_CLOSURE", "inquiry", "SWIGPY_INQUIRY_CLOSURE", "getiterfunc", "SWIGPY_GETITERFUNC_CLOSURE", "binaryfunc", "SWIGPY_BINARYFUNC_CLOSURE", "ternaryfunc", "SWIGPY_TERNARYFUNC_CLOSURE", "ternarycallfunc", "SWIGPY_TERNARYCALLFUNC_CLOSURE", "lenfunc", "SWIGPY_LENFUNC_CLOSURE", "ssizeargfunc", "SWIGPY_SSIZEARGFUNC_CLOSURE", "ssizessizeargfunc", "SWIGPY_SSIZESSIZEARGFUNC_CLOSURE", "ssizeobjargproc", "SWIGPY_SSIZEOBJARGPROC_CLOSURE", "ssizessizeobjargproc", "SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE", "objobjargproc", "SWIGPY_OBJOBJARGPROC_CLOSURE", "reprfunc", "SWIGPY_REPRFUNC_CLOSURE", "hashfunc", "SWIGPY_HASHFUNC_CLOSURE", "iternextfunc", "SWIGPY_ITERNEXTFUNC_CLOSURE", NULL }; static const char *funpack_functypes[] = { "unaryfunc", "SWIGPY_UNARYFUNC_CLOSURE", "destructor", "SWIGPY_DESTRUCTOR_CLOSURE", "inquiry", "SWIGPY_INQUIRY_CLOSURE", "getiterfunc", "SWIGPY_GETITERFUNC_CLOSURE", "ternaryfunc", "SWIGPY_TERNARYFUNC_CLOSURE", "ternarycallfunc", "SWIGPY_TERNARYCALLFUNC_CLOSURE", "lenfunc", "SWIGPY_LENFUNC_CLOSURE", "ssizeargfunc", "SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE", "ssizessizeargfunc", "SWIGPY_SSIZESSIZEARGFUNC_CLOSURE", "ssizeobjargproc", "SWIGPY_SSIZEOBJARGPROC_CLOSURE", "ssizessizeobjargproc", "SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE", "objobjargproc", "SWIGPY_OBJOBJARGPROC_CLOSURE", "reprfunc", "SWIGPY_REPRFUNC_CLOSURE", "hashfunc", "SWIGPY_HASHFUNC_CLOSURE", "iternextfunc", "SWIGPY_ITERNEXTFUNC_CLOSURE", NULL }; if (!functype) return NULL; char *c = Char(functype); int i; if (funpack) { for (i = 0; funpack_functypes[i] != NULL; i += 2) { if (!strcmp(c, funpack_functypes[i])) return NewStringf("%s(%s)", funpack_functypes[i + 1], wrapper); } } else { for (i = 0; functypes[i] != NULL; i += 2) { if (!strcmp(c, functypes[i])) return NewStringf("%s(%s)", functypes[i + 1], wrapper); } } return NULL; } class PYTHON:public Language { public: PYTHON() { /* Add code to manage protected constructors and directors */ director_prot_ctor_code = NewString(""); Printv(director_prot_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing abstract class or protected constructor\"); \n", " SWIG_fail;\n", "}\n", NIL); director_multiple_inheritance = 1; director_language = 1; } /* ------------------------------------------------------------ * Thread Implementation * ------------------------------------------------------------ */ int threads_enable(Node *n) const { return threads && !GetFlagAttr(n, "feature:nothread"); } int initialize_threads(String *f_init) { if (!threads) { return SWIG_OK; } Printf(f_init, "\n"); Printf(f_init, "/* Initialize threading */\n"); Printf(f_init, "SWIG_PYTHON_INITIALIZE_THREADS;\n"); return SWIG_OK; } virtual void thread_begin_block(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadblock")) { String *bb = Getattr(n, "feature:threadbeginblock"); if (bb) { Append(f, bb); } else { Append(f, "SWIG_PYTHON_THREAD_BEGIN_BLOCK;\n"); } } } virtual void thread_end_block(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadblock")) { String *eb = Getattr(n, "feature:threadendblock"); if (eb) { Append(f, eb); } else { Append(f, "SWIG_PYTHON_THREAD_END_BLOCK;\n"); } } } virtual void thread_begin_allow(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadallow")) { String *bb = Getattr(n, "feature:threadbeginallow"); Append(f, "{\n"); if (bb) { Append(f, bb); } else { Append(f, "SWIG_PYTHON_THREAD_BEGIN_ALLOW;\n"); } } } virtual void thread_end_allow(Node *n, String *f) { if (!GetFlag(n, "feature:nothreadallow")) { String *eb = Getattr(n, "feature:threadendallow"); Append(f, "\n"); if (eb) { Append(f, eb); } else { Append(f, "SWIG_PYTHON_THREAD_END_ALLOW;"); } Append(f, "\n}"); } } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int cppcast = 1; SWIG_library_directory("python"); for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-interface") == 0) { if (argv[i + 1]) { interface = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } /* end added */ } else if (strcmp(argv[i], "-globals") == 0) { if (argv[i + 1]) { global_name = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { shadow = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-new_repr") == 0) || (strcmp(argv[i], "-newrepr") == 0)) { new_repr = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-old_repr") == 0) || (strcmp(argv[i], "-oldrepr") == 0)) { new_repr = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-classptr") == 0) { classptr = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-noproxy") == 0)) { shadow = 0; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-noproxyimport") == 0)) { shadowimport = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-keyword") == 0) { use_kw = 1; SWIG_cparse_set_compact_default_args(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-classic") == 0) { classic = 1; modernargs = 0; modern = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppcast") == 0) { cppcast = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { cppcast = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-outputtuple") == 0) { outputtuple = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nooutputtuple") == 0) { outputtuple = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nortti") == 0) { nortti = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-threads") == 0) { threads = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nothreads") == 0) { /* Turn off thread suppor mode */ nothreads = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-safecstrings") == 0) { safecstrings = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nosafecstrings") == 0) { safecstrings = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-buildnone") == 0) { buildnone = 1; nobuildnone = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nobuildnone") == 0) { buildnone = 0; nobuildnone = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dirvtable") == 0) { dirvtable = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nodirvtable") == 0) { dirvtable = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastunpack") == 0) { fastunpack = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastunpack") == 0) { fastunpack = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastproxy") == 0) { fastproxy = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastproxy") == 0) { fastproxy = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastquery") == 0) { fastquery = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastquery") == 0) { fastquery = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastinit") == 0) { fastinit = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastinit") == 0) { fastinit = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-olddefs") == 0) { olddefs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noolddefs") == 0) { olddefs = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-castmode") == 0) { castmode = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocastmode") == 0) { castmode = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-extranative") == 0) { extranative = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noextranative") == 0) { extranative = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-modernargs") == 0) { modernargs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nomodernargs") == 0) { modernargs = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-aliasobj0") == 0) { aliasobj0 = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noaliasobj0") == 0) { aliasobj0 = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-proxydel") == 0) { proxydel = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noproxydel") == 0) { proxydel = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-modern") == 0) { classic = 0; modern = 1; modernargs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nomodern") == 0) { modern = 0; modernargs = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noh") == 0) { no_header_file = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-new_vwm") == 0) || (strcmp(argv[i], "-newvwm") == 0)) { /* Turn on new value wrapper mpde */ Swig_value_wrapper_mode(1); no_header_file = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-O") == 0) { classic = 0; modern = 1; safecstrings = 0; buildnone = 0; nobuildnone = 1; classptr = 0; proxydel = 0; fastunpack = 1; fastproxy = 1; fastinit = 1; fastquery = 1; modernargs = 1; Wrapper_fast_dispatch_mode_set(1); Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage1, stdout); fputs(usage2, stdout); fputs(usage3, stdout); } else if (strcmp(argv[i], "-py3") == 0) { py3 = 1; Preprocessor_define("SWIGPYTHON_PY3", 0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-builtin") == 0) { builtin = 1; Preprocessor_define("SWIGPYTHON_BUILTIN", 0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-relativeimport") == 0) { relativeimport = 1; Swig_mark_arg(i); } } } if (py3) { /* force disable features that not compatible with Python 3.x */ classic = 0; } if (cppcast) { Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0); } if (!global_name) global_name = NewString("cvar"); Preprocessor_define("SWIGPYTHON 1", 0); SWIG_typemap_lang("python"); SWIG_config_file("python.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. */ String *mod_docstring = NULL; String *moduleimport = NULL; { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) { dirprot = 1; } if (Getattr(options, "nodirprot")) { dirprot = 0; } if (Getattr(options, "directors")) { allow_directors(); if (dirprot) allow_dirprot(); } if (Getattr(options, "threads")) { threads = 1; } if (Getattr(options, "castmode")) { castmode = 1; } if (Getattr(options, "nocastmode")) { castmode = 0; } if (Getattr(options, "extranative")) { extranative = 1; } if (Getattr(options, "noextranative")) { extranative = 0; } if (Getattr(options, "outputtuple")) { outputtuple = 1; } if (Getattr(options, "nooutputtuple")) { outputtuple = 0; } mod_docstring = Getattr(options, "docstring"); package = Getattr(options, "package"); moduleimport = Getattr(options, "moduleimport"); } } } /* Set comparison with none for ConstructorToFunction */ setSubclassInstanceCheck(NewString("$arg != Py_None")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = !no_header_file ? Getattr(n, "outfile_h") : 0; f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); builtin_getset = NewHash(); builtin_closures = NewHash(); builtin_closures_code = NewString(""); class_members = NewHash(); builtin_methods = NewString(""); builtin_default_unref = NewString("delete $self;"); if (builtin) { f_builtins = NewString(""); } if (directorsEnabled()) { if (!no_header_file) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } else { f_runtime_h = f_runtime; } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); const_code = NewString(""); methods = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPYTHON\n#define SWIGPYTHON\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } if (nothreads) { Printf(f_runtime, "#define SWIG_PYTHON_NO_THREADS\n"); } else if (threads) { Printf(f_runtime, "#define SWIG_PYTHON_THREADS\n"); } if (safecstrings) { Printf(f_runtime, "#define SWIG_PYTHON_SAFE_CSTRINGS\n"); } if (buildnone) { Printf(f_runtime, "#define SWIG_PYTHON_BUILD_NONE\n"); } if (nobuildnone) { Printf(f_runtime, "#define SWIG_PYTHON_NO_BUILD_NONE\n"); } if (!dirvtable) { Printf(f_runtime, "#define SWIG_PYTHON_DIRECTOR_NO_VTABLE\n"); } if (outputtuple) { Printf(f_runtime, "#define SWIG_PYTHON_OUTPUT_TUPLE\n"); } if (nortti) { Printf(f_runtime, "#ifndef SWIG_DIRECTOR_NORTTI\n"); Printf(f_runtime, "#define SWIG_DIRECTOR_NORTTI\n"); Printf(f_runtime, "#endif\n"); } if (castmode) { Printf(f_runtime, "#define SWIG_CASTRANK_MODE\n"); Printf(f_runtime, "#define SWIG_PYTHON_CAST_MODE\n"); } if (extranative) { Printf(f_runtime, "#define SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS\n"); } if (classic) { Printf(f_runtime, "#define SWIG_PYTHON_CLASSIC\n"); } if (builtin) { Printf(f_runtime, "#define SWIGPYTHON_BUILTIN\n"); } Printf(f_runtime, "\n"); Printf(f_header, "#if (PY_VERSION_HEX <= 0x02000000)\n"); Printf(f_header, "# if !defined(SWIG_PYTHON_CLASSIC)\n"); Printf(f_header, "# error \"This python version requires swig to be run with the '-classic' option\"\n"); Printf(f_header, "# endif\n"); Printf(f_header, "#endif\n"); if (modern) { Printf(f_header, "#if (PY_VERSION_HEX <= 0x02020000)\n"); Printf(f_header, "# error \"This python version requires swig to be run with the '-nomodern' option\"\n"); Printf(f_header, "#endif\n"); } if (modernargs) { Printf(f_header, "#if (PY_VERSION_HEX <= 0x02020000)\n"); Printf(f_header, "# error \"This python version requires swig to be run with the '-nomodernargs' option\"\n"); Printf(f_header, "#endif\n"); } if (fastunpack) { Printf(f_header, "#ifndef METH_O\n"); Printf(f_header, "# error \"This python version requires swig to be run with the '-nofastunpack' option\"\n"); Printf(f_header, "#endif\n"); } if (fastquery) { Printf(f_header, "#ifdef SWIG_TypeQuery\n"); Printf(f_header, "# undef SWIG_TypeQuery\n"); Printf(f_header, "#endif\n"); Printf(f_header, "#define SWIG_TypeQuery SWIG_Python_TypeQuery\n"); } /* Set module name */ module = Copy(Getattr(n, "name")); mainmodule = Getattr(n, "name"); if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module); if (dirprot_mode()) { Printf(f_directors_h, "#include \n"); Printf(f_directors_h, "#include \n\n"); } Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "#include \"%s\"\n\n", filename); Delete(filename); } } /* If shadow classing is enabled, we're going to change the module name to "_module" */ String *default_import_code = NewString(""); if (shadow) { String *filen = NewStringf("%s%s.py", SWIG_output_directory(), Char(module)); // If we don't have an interface then change the module name X to _X if (interface) module = interface; else Insert(module, 0, "_"); if ((f_shadow_py = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; f_shadow = NewString(""); f_shadow_begin = NewString(""); f_shadow_imports = NewHash(); f_shadow_after_begin = NewString(""); f_shadow_stubs = NewString(""); Swig_register_filebyname("shadow", f_shadow); Swig_register_filebyname("python", f_shadow); if (mod_docstring) { if (Len(mod_docstring)) { const char *triple_double = "\"\"\""; // follow PEP257 rules: https://www.python.org/dev/peps/pep-0257/ // reported by pep257: https://github.com/GreenSteam/pep257 bool multi_line_ds = Strchr(mod_docstring, '\n') != 0; Printv(f_shadow_after_begin, "\n", triple_double, multi_line_ds ? "\n":"", mod_docstring, multi_line_ds ? "\n":"", triple_double, "\n", NIL); } Delete(mod_docstring); mod_docstring = NULL; } Printv(default_import_code, "\nfrom sys import version_info as _swig_python_version_info\n", NULL); if (!builtin && fastproxy) { Printv(default_import_code, "if _swig_python_version_info >= (3, 0, 0):\n", NULL); Printf(default_import_code, tab4 "new_instancemethod = lambda func, inst, cls: %s.SWIG_PyInstanceMethod_New(func)\n", module); Printv(default_import_code, "else:\n", NULL); Printv(default_import_code, tab4, "from new import instancemethod as new_instancemethod\n", NULL); } /* Import the C-extension module. This should be a relative import, * since the shadow module may also have been imported by a relative * import, and there is thus no guarantee that the C-extension is on * sys.path. Relative imports must be explicitly specified from 2.6.0 * onwards (implicit relative imports will raise a DeprecationWarning * in 2.6, and fail in 2.7 onwards), but the relative import syntax * isn't available in python 2.4 or earlier, so we have to write some * code conditional on the python version. * * For python 2.7.0 and newer, first determine the shadow wrappers package * based on the __name__ it was given by the importer that loaded it. * Then construct a name for the module based on the package name and the * module name (we know the module name). Use importlib to try and load * it. If an attempt to load the module with importlib fails with an * ImportError then fallback and try and load just the module name from * the global namespace. */ Printv(default_import_code, "if _swig_python_version_info >= (2, 7, 0):\n", NULL); Printv(default_import_code, tab4, "def swig_import_helper():\n", NULL); Printv(default_import_code, tab8, "import importlib\n", NULL); Printv(default_import_code, tab8, "pkg = __name__.rpartition('.')[0]\n", NULL); Printf(default_import_code, tab8 "mname = '.'.join((pkg, '%s')).lstrip('.')\n", module); Printv(default_import_code, tab8, "try:\n", NULL); Printv(default_import_code, tab8, tab4, "return importlib.import_module(mname)\n", NULL); Printv(default_import_code, tab8, "except ImportError:\n", NULL); Printf(default_import_code, tab8 tab4 "return importlib.import_module('%s')\n", module); Printf(default_import_code, tab4 "%s = swig_import_helper()\n", module); Printv(default_import_code, tab4, "del swig_import_helper\n", NULL); Printv(default_import_code, "elif _swig_python_version_info >= (2, 6, 0):\n", NULL); Printv(default_import_code, tab4, "def swig_import_helper():\n", NULL); Printv(default_import_code, tab8, "from os.path import dirname\n", NULL); Printv(default_import_code, tab8, "import imp\n", NULL); Printv(default_import_code, tab8, "fp = None\n", NULL); Printv(default_import_code, tab8, "try:\n", NULL); Printf(default_import_code, tab4 tab8 "fp, pathname, description = imp.find_module('%s', [dirname(__file__)])\n", module); Printf(default_import_code, tab8 "except ImportError:\n"); /* At here, the module may already loaded, so simply import it. */ Printf(default_import_code, tab4 tab8 "import %s\n", module); Printf(default_import_code, tab4 tab8 "return %s\n", module); Printv(default_import_code, tab8 "try:\n", NULL); /* imp.load_module() handles fp being None. */ Printf(default_import_code, tab4 tab8 "_mod = imp.load_module('%s', fp, pathname, description)\n", module); Printv(default_import_code, tab8, "finally:\n", NULL); Printv(default_import_code, tab4 tab8 "if fp is not None:\n", NULL); Printv(default_import_code, tab8 tab8, "fp.close()\n", NULL); Printv(default_import_code, tab8, "return _mod\n", NULL); Printf(default_import_code, tab4 "%s = swig_import_helper()\n", module); Printv(default_import_code, tab4, "del swig_import_helper\n", NULL); Printv(default_import_code, "else:\n", NULL); Printf(default_import_code, tab4 "import %s\n", module); if (builtin) { /* * Pull in all the attributes from the C module. * * An alternative approach to doing this if/else chain was * proposed by Michael Thon. Someone braver than I may try it out. * I fear some current swig user may depend on some side effect * of from _foo import * * * for attr in _foo.__all__: * globals()[attr] = getattr(_foo, attr) * */ Printf(default_import_code, "# pull in all the attributes from %s\n", module); Printv(default_import_code, "if __name__.rpartition('.')[0] != '':\n", NULL); Printv(default_import_code, tab4, "if _swig_python_version_info >= (2, 7, 0):\n", NULL); Printv(default_import_code, tab8, "try:\n", NULL); Printf(default_import_code, tab8 tab4 "from .%s import *\n", module); Printv(default_import_code, tab8 "except ImportError:\n", NULL); Printf(default_import_code, tab8 tab4 "from %s import *\n", module); Printv(default_import_code, tab4, "else:\n", NULL); Printf(default_import_code, tab8 "from %s import *\n", module); Printv(default_import_code, "else:\n", NULL); Printf(default_import_code, tab4 "from %s import *\n", module); } /* Delete the _swig_python_version_info symbol since we don't use it elsewhere in the * module. */ Printv(default_import_code, "del _swig_python_version_info\n\n", NULL); if (modern || !classic) { Printv(f_shadow, "try:\n", tab4, "_swig_property = property\n", "except NameError:\n", tab4, "pass # Python < 2.2 doesn't have 'property'.\n\n", NULL); } /* Need builtins to qualify names like Exception that might also be defined in this module (try both Python 3 and Python 2 names) */ Printv(f_shadow, "try:\n", tab4, "import builtins as __builtin__\n", "except ImportError:\n", tab4, "import __builtin__\n", NULL); /* if (!modern) */ /* always needed, a class can be forced to be no-modern, such as an exception */ { // Python-2.2 object hack Printv(f_shadow, "\n", "def _swig_setattr_nondynamic(self, class_type, name, value, static=1):\n", tab4, "if (name == \"thisown\"):\n", tab8, "return self.this.own(value)\n", tab4, "if (name == \"this\"):\n", tab8, "if type(value).__name__ == 'SwigPyObject':\n", tab4, tab8, "self.__dict__[name] = value\n", #ifdef USE_THISOWN tab4, tab8, "if hasattr(value,\"thisown\"):\n", tab8, tab8, "self.__dict__[\"thisown\"] = value.thisown\n", tab4, tab8, "del value.thisown\n", #endif tab4, tab8, "return\n", tab4, "method = class_type.__swig_setmethods__.get(name, None)\n", tab4, "if method:\n", tab4, tab4, "return method(self, value)\n", #ifdef USE_THISOWN tab4, "if (not static) or (name == \"thisown\"):\n", #else tab4, "if (not static):\n", #endif NIL); if (!classic) { if (!modern) Printv(f_shadow, tab4, tab4, "if _newclass:\n", tab4, NIL); Printv(f_shadow, tab4, tab4, "object.__setattr__(self, name, value)\n", NIL); if (!modern) Printv(f_shadow, tab4, tab4, "else:\n", tab4, NIL); } if (classic || !modern) Printv(f_shadow, tab4, tab4, "self.__dict__[name] = value\n", NIL); Printv(f_shadow, tab4, "else:\n", tab4, tab4, "raise AttributeError(\"You cannot add attributes to %s\" % self)\n\n", "\n", "def _swig_setattr(self, class_type, name, value):\n", tab4, "return _swig_setattr_nondynamic(self, class_type, name, value, 0)\n\n", NIL); Printv(f_shadow, "\n", "def _swig_getattr(self, class_type, name):\n", tab4, "if (name == \"thisown\"):\n", tab8, "return self.this.own()\n", tab4, "method = class_type.__swig_getmethods__.get(name, None)\n", tab4, "if method:\n", tab8, "return method(self)\n", tab4, "raise AttributeError(\"'%s' object has no attribute '%s'\" % (class_type.__name__, name))\n\n", NIL); Printv(f_shadow, "\n", "def _swig_repr(self):\n", tab4, "try:\n", tab8, "strthis = \"proxy of \" + self.this.__repr__()\n", tab4, "except __builtin__.Exception:\n", tab8, "strthis = \"\"\n", tab4, "return \"<%s.%s; %s >\" % (self.__class__.__module__, self.__class__.__name__, strthis,)\n\n", NIL); if (!classic && !modern) { Printv(f_shadow, "try:\n", tab4, "_object = object\n", tab4, "_newclass = 1\n", "except __builtin__.Exception:\n", tab4, "class _object:\n", tab8, "pass\n", tab4, "_newclass = 0\n\n", NIL); } } if (modern) { Printv(f_shadow, "\n", "def _swig_setattr_nondynamic_method(set):\n", tab4, "def set_attr(self, name, value):\n", #ifdef USE_THISOWN tab4, tab4, "if hasattr(self, name) or (name in (\"this\", \"thisown\")):\n", #else tab4, tab4, "if (name == \"thisown\"):\n", tab8, tab4, "return self.this.own(value)\n", tab4, tab4, "if hasattr(self, name) or (name == \"this\"):\n", #endif tab4, tab4, tab4, "set(self, name, value)\n", tab4, tab4, "else:\n", tab4, tab4, tab4, "raise AttributeError(\"You cannot add attributes to %s\" % self)\n", tab4, "return set_attr\n\n\n", NIL); } if (directorsEnabled()) { // Try loading weakref.proxy, which is only available in Python 2.1 and higher Printv(f_shadow, "try:\n", tab4, "import weakref\n", tab4, "weakref_proxy = weakref.proxy\n", "except __builtin__.Exception:\n", tab4, "weakref_proxy = lambda x: x\n", "\n\n", NIL); } } // Include some information in the code Printf(f_header, "\n/*-----------------------------------------------\n @(target):= %s.so\n\ ------------------------------------------------*/\n", module); Printf(f_header, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_header, "# define SWIG_init PyInit_%s\n\n", module); Printf(f_header, "#else\n"); Printf(f_header, "# define SWIG_init init%s\n\n", module); Printf(f_header, "#endif\n"); Printf(f_header, "#define SWIG_name \"%s\"\n", module); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n"); Append(const_code, "static swig_const_info swig_const_table[] = {\n"); Append(methods, "static PyMethodDef SwigMethods[] = {\n"); /* the method exported for replacement of new.instancemethod in Python 3 */ add_pyinstancemethod_new(); if (builtin) { SwigType *s = NewString("SwigPyObject"); SwigType_add_pointer(s); SwigType_remember(s); Delete(s); } /* emit code */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } /* Close language module */ Append(methods, "\t { NULL, NULL, 0, NULL }\n"); Append(methods, "};\n"); Printf(f_wrappers, "%s\n", methods); if (builtin) { Dump(f_builtins, f_wrappers); } SwigType_emit_type_table(f_runtime, f_wrappers); Append(const_code, "{0, 0, 0, 0.0, 0, 0}};\n"); Printf(f_wrappers, "%s\n", const_code); initialize_threads(f_init); Printf(f_init, "#if PY_VERSION_HEX >= 0x03000000\n"); Printf(f_init, " return m;\n"); Printf(f_init, "#else\n"); Printf(f_init, " return;\n"); Printf(f_init, "#endif\n"); Printf(f_init, "}\n"); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); if (shadow) { Swig_banner_target_lang(f_shadow_py, "#"); if (!modern && !classic) { Printv(f_shadow, "# This file is compatible with both classic and new-style classes.\n", NIL); } if (Len(f_shadow_begin) > 0) Printv(f_shadow_py, "\n", f_shadow_begin, "\n", NIL); if (Len(f_shadow_after_begin) > 0) Printv(f_shadow_py, f_shadow_after_begin, "\n", NIL); if (moduleimport) { Replaceall(moduleimport, "$module", module); Printv(f_shadow_py, "\n", moduleimport, "\n", NIL); } else { Printv(f_shadow_py, default_import_code, NIL); } Printv(f_shadow_py, f_shadow, "\n", NIL); Printv(f_shadow_py, f_shadow_stubs, "\n", NIL); Delete(f_shadow_py); } /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); if (f_runtime_h != f_begin) Delete(f_runtime_h); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); if (builtin && builtin_bases_needed) Printf(f_begin, "static PyTypeObject *builtin_bases[%d];\n\n", max_bases + 2); Wrapper_pretty_print(f_init, f_begin); Delete(default_import_code); Delete(f_shadow_after_begin); Delete(f_shadow_imports); Delete(f_shadow_begin); Delete(f_shadow); Delete(f_header); Delete(f_wrappers); Delete(f_builtins); Delete(f_init); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * Emit the wrapper for PyInstanceMethod_New to MethodDef array. * This wrapper is used to implement -fastproxy, * as a replacement of new.instancemethod in Python 3. * ------------------------------------------------------------ */ int add_pyinstancemethod_new() { String *name = NewString("SWIG_PyInstanceMethod_New"); Printf(methods, "\t { (char *)\"%s\", (PyCFunction)%s, METH_O, NULL},\n", name, name); Delete(name); return 0; } /* ------------------------------------------------------------ * subpkg_tail() * * Return the name of 'other' package relative to 'base'. * * 1. If 'other' is a sub-package of 'base', returns the 'other' relative to * 'base'. * 2. If 'other' and 'base' are equal, returns empty string "". * 3. In any other case, NULL pointer is returned. * * The 'base' and 'other' are expected to be fully qualified names. * * NOTE: none of 'base' nor 'other' can be null. * * Examples: * * # base other tail * -- ---- ----- ---- * 1 "Foo" "Foo.Bar" -> "Bar" * 2 "Foo" "Foo." -> "" * 3 "Foo" "FooB.ar" -> NULL * 4 "Foo.Bar" "Foo.Bar" -> "" * 5 "Foo.Bar" "Foo" -> NULL * 6 "Foo.Bar" "Foo.Gez" -> NULL * * NOTE: the example #2 is actually a syntax error (at input). I believe * swig parser prevents us from this case happening here. * ------------------------------------------------------------ */ static String *subpkg_tail(const String *base, const String *other) { int baselen = Len(base); int otherlen = Len(other); if (Strncmp(other, base, baselen) == 0) { if ((baselen < otherlen) && (Char(other))[baselen] == '.') { return NewString((Char(other)) + baselen + 1); } else if (baselen == otherlen) { return NewString(""); } else { return 0; } } else { return 0; } } /* ------------------------------------------------------------ * abs_import_directive_string() * * Return a string containing python code to import module. * * pkg package name or the module being imported * mod module name of the module being imported * pfx optional prefix to module name * * NOTE: keep this function consistent with abs_import_name_string(). * ------------------------------------------------------------ */ static String *abs_import_directive_string(const String *pkg, const String *mod, const char *pfx = "") { String *out = NewString(""); if (pkg && *Char(pkg)) { Printf(out, "import %s.%s%s\n", pkg, pfx, mod); } else { Printf(out, "import %s%s\n", pfx, mod); } return out; } /* ------------------------------------------------------------ * rel_import_directive_string() * * Return a string containing python code to import module that * is potentially within a package. * * mainpkg package name of the module which imports the other module * pkg package name or the module being imported * mod module name of the module being imported * pfx optional prefix to module name * * NOTE: keep this function consistent with rel_import_name_string(). * ------------------------------------------------------------ */ static String *rel_import_directive_string(const String *mainpkg, const String *pkg, const String *mod, const char *pfx = "") { /* NOTE: things are not so trivial. This is what we do here (by examples): * * 0. To import module 'foo', which is not in any package, we do absolute * import: * * import foo * * 1. To import 'pkg1.pkg2.foo', when mainpkg != "pkg1" and * mainpkg != "pkg1.pkg2" or when mainpkg is not given we do absolute * import: * * import pkg1.pkg2.foo * * 2. To import module pkg1.foo, when mainpkg == "pkg1", we do: * * - for py3 = 0: * * import foo * * - for py3 = 1: * * from . import foo * * 3. To import "pkg1.pkg2.pkg3.foo", when mainpkg = "pkg1", we do: * * - for py3 == 0: * * import pkg2.pkg3.foo * * - for py3 == 1: * * from . import pkg2 # [1] * import pkg1.pkg2.pkg3.foo * * NOTE: [1] is necessary for pkg2.foo to be present in the importing module */ String *apkg = 0; // absolute (FQDN) package name of pkg String *rpkg = 0; // relative package name int py3_rlen1 = 0; // length of 1st level sub-package name, used by py3 String *out = NewString(""); if (pkg && *Char(pkg)) { if (mainpkg) { String *tail = subpkg_tail(mainpkg, pkg); if (tail) { if (*Char(tail)) { rpkg = NewString(tail); const char *py3_end1 = Strchr(rpkg, '.'); if (!py3_end1) py3_end1 = (Char(rpkg)) + Len(rpkg); py3_rlen1 = (int)(py3_end1 - Char(rpkg)); } else { rpkg = NewString(""); } Delete(tail); } else { apkg = NewString(pkg); } } else { apkg = NewString(pkg); } } else { apkg = NewString(""); } if (apkg) { Printf(out, "import %s%s%s%s\n", apkg, *Char(apkg) ? "." : "", pfx, mod); Delete(apkg); } else { Printf(out, "from sys import version_info as _swig_python_version_info\n"); Printf(out, "if _swig_python_version_info >= (2, 7, 0):\n"); if (py3_rlen1) Printf(out, tab4 "from . import %.*s\n", py3_rlen1, rpkg); Printf(out, tab4 "from .%s import %s%s\n", rpkg, pfx, mod); Printf(out, "else:\n"); Printf(out, tab4 "import %s%s%s%s\n", rpkg, *Char(rpkg) ? "." : "", pfx, mod); Printf(out, "del _swig_python_version_info\n"); Delete(rpkg); } return out; } /* ------------------------------------------------------------ * import_directive_string() * ------------------------------------------------------------ */ static String *import_directive_string(const String *mainpkg, const String *pkg, const String *mod, const char *pfx = "") { if (!relativeimport) { return abs_import_directive_string(pkg, mod, pfx); } else { return rel_import_directive_string(mainpkg, pkg, mod, pfx); } } /* ------------------------------------------------------------ * abs_import_name_string() * * Return a string with the name of a symbol (perhaps imported * from external module by absolute import directive). * * mainpkg package name of current module * mainmod module name of current module * pkg package name of (perhaps other) module * mod module name of (perhaps other) module * sym symbol name * * NOTE: mainmod, mod, and sym can't be NULL. * NOTE: keep this function consistent with abs_import_directive_string() * ------------------------------------------------------------ */ static String *abs_import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { String *out = NewString(""); if (pkg && *Char(pkg)) { if (mainpkg && *Char(mainpkg)) { if (Strcmp(mainpkg,pkg) != 0 || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.%s.", pkg, mod); } } else { Printf(out, "%s.%s.", pkg, mod); } } else if ((mainpkg && *Char(mainpkg)) || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Append(out, sym); return out; } /* ------------------------------------------------------------ * rel_import_name_string() * * Return a string with the name of a symbol (perhaps imported * from external module by relative import directive). * * mainpkg package name of current module * mainmod module name of current module * pkg package name of (perhaps other) module * mod module name of (perhaps other) module * sym symbol name * * NOTE: mainmod, mod, and sym can't be NULL. * NOTE: keep this function consistent with rel_import_directive_string() * ------------------------------------------------------------ */ static String *rel_import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { String *out = NewString(""); if (pkg && *Char(pkg)) { String *tail = 0; if (mainpkg) tail = subpkg_tail(mainpkg, pkg); if (!tail) tail = NewString(pkg); if (*Char(tail)) { Printf(out, "%s.%s.", tail, mod); } else if (Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Delete(tail); } else if ((mainpkg && *Char(mainpkg)) || Strcmp(mainmod, mod) != 0) { Printf(out, "%s.", mod); } Append(out, sym); return out; } /* ------------------------------------------------------------ * import_name_string() * ------------------------------------------------------------ */ static String *import_name_string(const String *mainpkg, const String *mainmod, const String *pkg, const String *mod, const String *sym) { if (!relativeimport) { return abs_import_name_string(mainpkg,mainmod,pkg,mod,sym); } else { return rel_import_name_string(mainpkg,mainmod,pkg,mod,sym); } } /* ------------------------------------------------------------ * importDirective() * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { if (shadow) { String *modname = Getattr(n, "module"); if (modname) { // Find the module node for this imported module. It should be the // first child but search just in case. Node *mod = firstChild(n); while (mod && Strcmp(nodeType(mod), "module") != 0) mod = nextSibling(mod); Node *options = Getattr(mod, "options"); String *pkg = options ? Getattr(options, "package") : 0; if (shadowimport) { if (!options || (!Getattr(options, "noshadow") && !Getattr(options, "noproxy"))) { String *_import = import_directive_string(package, pkg, modname, "_"); if (!GetFlagAttr(f_shadow_imports, _import)) { String *import = import_directive_string(package, pkg, modname); Printf(builtin ? f_shadow_after_begin : f_shadow, "%s", import); Delete(import); SetFlag(f_shadow_imports, _import); } Delete(_import); } } } } return Language::importDirective(n); } /* ------------------------------------------------------------ * funcCall() * * Emit shadow code to call a function in the extension * module. Using proper argument and calling style for * given node n. * ------------------------------------------------------------ */ String *funcCall(String *name, String *parms) { String *str = NewString(""); Printv(str, module, ".", name, "(", parms, ")", NIL); return str; } /* ------------------------------------------------------------ * indent_pythoncode() * * Format (indent) Python code. * Remove leading whitespace from 'code' and re-indent using * the indentation string in 'indent'. * ------------------------------------------------------------ */ String *indent_pythoncode(const String *code, const_String_or_char_ptr indent, String *file, int line, const char *directive_name) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); // Line number within the pythoncode. int py_line = 0; String *initial = 0; Iterator si; /* Get the initial indentation. Skip lines which only contain whitespace * and/or a comment, as the indentation of those doesn't matter: * * A logical line that contains only spaces, tabs, formfeeds and * possibly a comment, is ignored (i.e., no NEWLINE token is * generated). * * see: * https://docs.python.org/2/reference/lexical_analysis.html#blank-lines * https://docs.python.org/3/reference/lexical_analysis.html#blank-lines */ for (si = First(clist); si.item; si = Next(si), ++py_line) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (ch && ch != '#') { // Found a line with actual content. initial = NewStringWithSize(c, i); break; } if (ch) { Printv(out, indent, c, NIL); } Putc('\n', out); } // Process remaining lines. for ( ; si.item; si = Next(si), ++py_line) { const char *c = Char(si.item); // If no prefixed line was found, the above loop should have completed. assert(initial); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (!ch) { // Line is just whitespace - emit an empty line. Putc('\n', out); continue; } if (ch == '#') { // Comment - the indentation doesn't matter to python, but try to // adjust the whitespace for the benefit of human readers (though SWIG // currently seems to always remove any whitespace before a '#' before // we get here, in which case we'll just leave the comment at the start // of the line). if (i >= Len(initial)) { Printv(out, indent, NIL); } Printv(out, c + i, "\n", NIL); continue; } if (i < Len(initial)) { // There's non-whitespace in the initial prefix of this line. Swig_error(file, line, "Line indented less than expected (line %d of %s) as no line should be indented less than the indentation in line 1\n", py_line, directive_name); Printv(out, indent, c, "\n", NIL); } else { if (memcmp(c, Char(initial), Len(initial)) == 0) { // Prefix matches initial, so just remove it. Printv(out, indent, c + Len(initial), "\n", NIL); continue; } Swig_warning(WARN_PYTHON_INDENT_MISMATCH, file, line, "Whitespace indentation is inconsistent compared to earlier lines (line %d of %s)\n", py_line, directive_name); // To avoid gratuitously breaking interface files which worked with // SWIG <= 3.0.5, we remove a prefix of the same number of bytes for // lines which start with different whitespace to the line we got // 'initial' from. Printv(out, indent, c + Len(initial), "\n", NIL); } } Delete(clist); return out; } /* ------------------------------------------------------------ * indent_docstring() * * Format (indent) a Python docstring. * Remove leading whitespace from 'code' and re-indent using * the indentation string in 'indent'. * ------------------------------------------------------------ */ String *indent_docstring(const String *code, const_String_or_char_ptr indent) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); Iterator si; int truncate_characters_count = INT_MAX; for (si = First(clist); si.item; si = Next(si)) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (ch) { // Found a line which isn't just whitespace if (i < truncate_characters_count) truncate_characters_count = i; } } if (truncate_characters_count == INT_MAX) truncate_characters_count = 0; for (si = First(clist); si.item; si = Next(si)) { const char *c = Char(si.item); int i; for (i = 0; isspace((unsigned char)c[i]); i++) { // Scan forward until we find a non-space (which may be a null byte). } char ch = c[i]; if (!ch) { // Line is just whitespace - emit an empty line. Putc('\n', out); continue; } Printv(out, indent, c + truncate_characters_count, "\n", NIL); } Delete(clist); return out; } /* ------------------------------------------------------------ * autodoc level declarations * ------------------------------------------------------------ */ enum autodoc_l { NO_AUTODOC = -2, // no autodoc STRING_AUTODOC = -1, // use provided string NAMES_AUTODOC = 0, // only parameter names TYPES_AUTODOC = 1, // parameter names and types EXTEND_AUTODOC = 2, // extended documentation and parameter names EXTEND_TYPES_AUTODOC = 3 // extended documentation and parameter types + names }; autodoc_l autodoc_level(String *autodoc) { autodoc_l dlevel = NO_AUTODOC; char *c = Char(autodoc); if (c) { if (isdigit(c[0])) { dlevel = (autodoc_l) atoi(c); } else { if (strcmp(c, "extended") == 0) { dlevel = EXTEND_AUTODOC; } else { dlevel = STRING_AUTODOC; } } } return dlevel; } /* ------------------------------------------------------------ * have_docstring() * * Check if there is a docstring directive and it has text, * or there is an autodoc flag set * ------------------------------------------------------------ */ bool have_docstring(Node *n) { String *str = Getattr(n, "feature:docstring"); return (str && Len(str) > 0) || (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); } /* ------------------------------------------------------------ * docstring() * * Get the docstring text, stripping off {} if necessary, * and enclose in triple double quotes. If autodoc is also * set then it will build a combined docstring. * ------------------------------------------------------------ */ String *docstring(Node *n, autodoc_t ad_type, const String *indent, bool use_triple = true) { String *str = Getattr(n, "feature:docstring"); bool have_ds = (str && Len(str) > 0); bool have_auto = (Getattr(n, "feature:autodoc") && !GetFlag(n, "feature:noautodoc")); const char *triple_double = use_triple ? "\"\"\"" : ""; String *autodoc = NULL; String *doc = NULL; if (have_ds) { char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } } if (have_auto) { autodoc = make_autodoc(n, ad_type); have_auto = (autodoc && Len(autodoc) > 0); } // If there is more than one line then make docstrings like this: // // """ // This is line1 // And here is line2 followed by the rest of them // """ // // otherwise, put it all on a single line // if (have_auto && have_ds) { // Both autodoc and docstring are present doc = NewString(""); Printv(doc, triple_double, "\n", indent_docstring(autodoc, indent), "\n", indent_docstring(str, indent), indent, triple_double, NIL); } else if (!have_auto && have_ds) { // only docstring if (Strchr(str, '\n') == 0) { doc = NewStringf("%s%s%s", triple_double, str, triple_double); } else { doc = NewString(""); Printv(doc, triple_double, "\n", indent_docstring(str, indent), indent, triple_double, NIL); } } else if (have_auto && !have_ds) { // only autodoc if (Strchr(autodoc, '\n') == 0) { doc = NewStringf("%s%s%s", triple_double, autodoc, triple_double); } else { doc = NewString(""); Printv(doc, triple_double, "\n", indent_docstring(autodoc, indent), indent, triple_double, NIL); } } else doc = NewString(""); // Save the generated strings in the parse tree in case they are used later // by post processing tools Setattr(n, "python:docstring", doc); Setattr(n, "python:autodoc", autodoc); return doc; } /* ------------------------------------------------------------ * cdocstring() * * Get the docstring text as it would appear in C-language * source code. * ------------------------------------------------------------ */ String *cdocstring(Node *n, autodoc_t ad_type) { String *ds = docstring(n, ad_type, "", false); Replaceall(ds, "\\", "\\\\"); Replaceall(ds, "\"", "\\\""); Replaceall(ds, "\n", "\\n\"\n\t\t\""); return ds; } virtual String *makeParameterName(Node *n, Parm *p, int arg_num, bool = false) const { // For the keyword arguments, we want to preserve the names as much as possible, // so we only minimally rename them in Swig_name_make(), e.g. replacing "keyword" // with "_keyword" if they have any name at all. if (check_kwargs(n)) { String *name = Getattr(p, "name"); if (name) return Swig_name_make(p, 0, name, 0, 0); } // For the other cases use the general function which replaces arguments whose // names clash with keywords with (less useful) "argN". return Language::makeParameterName(n, p, arg_num); } /* ----------------------------------------------------------------------------- * addMissingParameterNames() * * For functions that have not had nameless parameters set in the Language class. * * Inputs: * plist - entire parameter list * arg_offset - argument number for first parameter * Side effects: * The "lname" attribute in each parameter in plist will be contain a parameter name * ----------------------------------------------------------------------------- */ void addMissingParameterNames(Node *n, ParmList *plist, int arg_offset) { Parm *p = plist; int i = arg_offset; while (p) { if (!Getattr(p, "lname")) { String *name = makeParameterName(n, p, i); Setattr(p, "lname", name); Delete(name); } i++; p = nextSibling(p); } } /* ------------------------------------------------------------ * make_autodocParmList() * * Generate the documentation for the function parameters * Parameters: * func_annotation: Function annotation support * ------------------------------------------------------------ */ String *make_autodocParmList(Node *n, bool showTypes, bool calling = false, bool func_annotation = false) { String *doc = NewString(""); String *pdocs = 0; ParmList *plist = CopyParmList(Getattr(n, "parms")); Parm *p; Parm *pnext; // Normally we start counting auto-generated argument names from 1, but we should do it from 2 // if the first argument is "self", i.e. if we're handling a non-static member function. int arg_num = 1; if (is_wrapping_class()) { if (Cmp(Getattr(n, "storage"), "static") != 0) arg_num++; } if (calling) func_annotation = false; addMissingParameterNames(n, plist, arg_num); // for $1_name substitutions done in Swig_typemap_attach_parms Swig_typemap_attach_parms("in", plist, 0); Swig_typemap_attach_parms("doc", plist, 0); if (Strcmp(ParmList_protostr(plist), "void") == 0) { //No parameters actually return doc; } for (p = plist; p; p = pnext, arg_num++) { String *tm = Getattr(p, "tmap:in"); if (tm) { pnext = Getattr(p, "tmap:in:next"); if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } else { pnext = nextSibling(p); } String *name = 0; String *type = 0; String *value = 0; String *pdoc = Getattr(p, "tmap:doc"); if (pdoc) { name = Getattr(p, "tmap:doc:name"); type = Getattr(p, "tmap:doc:type"); value = Getattr(p, "tmap:doc:value"); } // Note: the generated name should be consistent with that in kwnames[] String *made_name = 0; if (!name) { name = made_name = makeParameterName(n, p, arg_num); } type = type ? type : Getattr(p, "type"); value = value ? value : Getattr(p, "value"); if (SwigType_isvarargs(type)) { Delete(made_name); break; } if (Len(doc)) { // add a comma to the previous one if any Append(doc, ", "); } // Do the param type too? Node *nn = classLookup(Getattr(p, "type")); String *type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); if (showTypes) Printf(doc, "%s ", type_str); Append(doc, name); if (pdoc) { if (!pdocs) // numpydoc style: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt pdocs = NewString("\nParameters\n----------\n"); Printf(pdocs, "%s\n", pdoc); } // Write the function annotation if (func_annotation) Printf(doc, ": '%s'", type_str); // Write default value if (value && !calling) { String *new_value = convertValue(value, Getattr(p, "type")); if (new_value) Printf(doc, "=%s", new_value); } Delete(type_str); Delete(made_name); } if (pdocs) Setattr(n, "feature:pdocs", pdocs); Delete(plist); return doc; } /* ------------------------------------------------------------ * make_autodoc() * * Build a docstring for the node, using parameter and other * info in the parse tree. If the value of the autodoc * attribute is "0" then do not include parameter types, if * it is "1" (the default) then do. If it has some other * value then assume it is supplied by the extension writer * and use it directly. * ------------------------------------------------------------ */ String *make_autodoc(Node *n, autodoc_t ad_type) { int extended = 0; // If the function is overloaded then this function is called // for the last one. Rewind to the first so the docstrings are // in order. while (Getattr(n, "sym:previousSibling")) n = Getattr(n, "sym:previousSibling"); String *doc = NewString(""); while (n) { bool showTypes = false; bool skipAuto = false; String *autodoc = Getattr(n, "feature:autodoc"); autodoc_l dlevel = autodoc_level(autodoc); switch (dlevel) { case NO_AUTODOC: break; case NAMES_AUTODOC: showTypes = false; break; case TYPES_AUTODOC: showTypes = true; break; case EXTEND_AUTODOC: extended = 1; showTypes = false; break; case EXTEND_TYPES_AUTODOC: extended = 1; showTypes = true; break; case STRING_AUTODOC: Append(doc, autodoc); skipAuto = true; break; } if (!skipAuto) { String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *type_str = NULL; if (type) { if (Strcmp(type, "void") == 0) { type_str = NULL; } else { Node *nn = classLookup(type); type_str = nn ? Copy(Getattr(nn, "sym:name")) : SwigType_str(type, 0); } } switch (ad_type) { case AUTODOC_CLASS: { // Only do the autodoc if there isn't a docstring for the class String *str = Getattr(n, "feature:docstring"); if (!str || Len(str) == 0) { if (builtin) { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); Printf(doc, "%s", rname); Delete(rname); } else { if (CPlusPlus) { Printf(doc, "Proxy of C++ %s class.", real_classname); } else { Printf(doc, "Proxy of C %s struct.", real_classname); } } } } break; case AUTODOC_CTOR: if (Strcmp(class_name, symname) == 0) { String *paramList = make_autodocParmList(n, showTypes); Printf(doc, "__init__("); if (showTypes) Printf(doc, "%s ", getClassName()); if (Len(paramList)) Printf(doc, "self, %s) -> %s", paramList, class_name); else Printf(doc, "self) -> %s", class_name); } else Printf(doc, "%s(%s) -> %s", symname, make_autodocParmList(n, showTypes), class_name); break; case AUTODOC_DTOR: if (showTypes) Printf(doc, "__del__(%s self)", getClassName()); else Printf(doc, "__del__(self)"); break; case AUTODOC_STATICFUNC: Printf(doc, "%s(%s)", symname, make_autodocParmList(n, showTypes)); if (type_str) Printf(doc, " -> %s", type_str); break; case AUTODOC_FUNC: Printf(doc, "%s(%s)", symname, make_autodocParmList(n, showTypes)); if (type_str) Printf(doc, " -> %s", type_str); break; case AUTODOC_METHOD: String *paramList = make_autodocParmList(n, showTypes); Printf(doc, "%s(", symname); if (showTypes) Printf(doc, "%s ", class_name); if (Len(paramList)) Printf(doc, "self, %s)", paramList); else Printf(doc, "self)"); if (type_str) Printf(doc, " -> %s", type_str); break; } Delete(type_str); } if (extended) { String *pdocs = Getattr(n, "feature:pdocs"); if (pdocs) { Printv(doc, "\n", pdocs, NULL); } } // if it's overloaded then get the next decl and loop around again n = Getattr(n, "sym:nextSibling"); if (n) Append(doc, "\n"); } return doc; } /* ------------------------------------------------------------ * convertDoubleValue() * * Check if the given string looks like a decimal floating point constant * and return it if it does, otherwise return NIL. * ------------------------------------------------------------ */ String *convertDoubleValue(String *v) { const char *const s = Char(v); char *end; double value = strtod(s, &end); (void) value; if (errno != ERANGE && end != s) { // An added complication: at least some versions of strtod() recognize // hexadecimal floating point numbers which don't exist in Python, so // detect them ourselves and refuse to convert them (this can't be done // without loss of precision in general). // // Also don't accept neither "NAN" nor "INFINITY" (both of which // conveniently contain "n"). if (strpbrk(s, "xXnN")) return NIL; // Disregard optional "f" suffix, it can be just dropped in Python as it // uses doubles for everything anyhow. for (char * p = end; *p != '\0'; ++p) { switch (*p) { case 'f': case 'F': break; default: return NIL; } } // Avoid unnecessary string allocation in the common case when we don't // need to remove any suffix. return *end == '\0' ? v : NewStringWithSize(s, (int)(end - s)); } return NIL; } /* ------------------------------------------------------------ * convertValue() * * Check if string v can be a Python value literal or a * constant. Return NIL if it isn't. * ------------------------------------------------------------ */ String *convertValue(String *v, SwigType *type) { const char *const s = Char(v); char *end; String *result = NIL; bool fail = false; SwigType *resolved_type = 0; // Check if this is a number in any base. long value = strtol(s, &end, 0); (void) value; if (end != s) { if (errno == ERANGE) { // There was an overflow, we could try representing the value as Python // long integer literal, but for now don't bother with it. fail = true; } else { if (*end != '\0') { // If there is a suffix after the number, we can safely ignore any // combination of "l" and "u", but not anything else (again, stuff like // "LL" could be handled, but we don't bother to do it currently). bool seen_long = false; for (char * p = end; *p != '\0'; ++p) { switch (*p) { case 'l': case 'L': // Bail out on "LL". if (seen_long) { fail = true; break; } seen_long = true; break; case 'u': case 'U': break; default: // Except that our suffix could actually be the fractional part of // a floating point number, so we still have to check for this. result = convertDoubleValue(v); } } } if (!fail) { // Allow integers as the default value for a bool parameter. resolved_type = SwigType_typedef_resolve_all(type); if (Cmp(resolved_type, "bool") == 0) { result = NewString(value ? "True" : "False"); } else { // Deal with the values starting with 0 first as they can be octal or // hexadecimal numbers or even pointers. if (s[0] == '0') { if (Len(v) == 1) { // This is just a lone 0, but it needs to be represented differently // in Python depending on whether it's a zero or a null pointer. if (SwigType_ispointer(resolved_type)) result = NewString("None"); else result = v; } else if (s[1] == 'x' || s[1] == 'X') { // This must have been a hex number, we can use it directly in Python, // so nothing to do here. } else { // This must have been an octal number, we have to change its prefix // to be "0o" in Python 3 only (and as long as we still support Python // 2.5, this can't be done unconditionally). if (py3) { if (end - s > 1) { result = NewString("0o"); Append(result, NewStringWithSize(s + 1, (int)(end - s - 1))); } } } } // Avoid unnecessary string allocation in the common case when we don't // need to remove any suffix. if (!result) result = *end == '\0' ? v : NewStringWithSize(s, (int)(end - s)); } } } } // Check if this is a floating point number (notice that it wasn't // necessarily parsed as a long above, consider e.g. ".123"). if (!fail && !result) { result = convertDoubleValue(v); if (!result) { if (Strcmp(v, "true") == 0 || Strcmp(v, "TRUE") == 0) result = NewString("True"); else if (Strcmp(v, "false") == 0 || Strcmp(v, "FALSE") == 0) result = NewString("False"); else if (Strcmp(v, "NULL") == 0 || Strcmp(v, "nullptr") == 0) { if (!resolved_type) resolved_type = SwigType_typedef_resolve_all(type); result = SwigType_ispointer(resolved_type) ? NewString("None") : NewString("0"); } // This could also be an enum type, default value of which could be // representable in Python if it doesn't include any scope (which could, // but currently is not, translated). else if (!Strchr(s, ':')) { Node *lookup = Swig_symbol_clookup(v, 0); if (lookup) { if (Cmp(Getattr(lookup, "nodeType"), "enumitem") == 0) result = Getattr(lookup, "sym:name"); } } } } Delete(resolved_type); return result; } /* ------------------------------------------------------------ * is_representable_as_pyargs() * * Check if the function parameters default argument values * can be represented in Python. * * If this method returns false, the parameters will be translated * to a generic "*args" which allows us to deal with default values * at C++ code level where they can always be handled. * ------------------------------------------------------------ */ bool is_representable_as_pyargs(Node *n) { ParmList *plist = CopyParmList(Getattr(n, "parms")); Swig_typemap_attach_parms("default", plist, NULL); Parm *p; Parm *pnext; for (p = plist; p; p = pnext) { pnext = nextSibling(p); String *tm = Getattr(p, "tmap:in"); if (tm) { Parm *in_next = Getattr(p, "tmap:in:next"); if (in_next) pnext = in_next; if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } } // "default" typemap can contain arbitrary C++ code, so while it could, in // principle, be possible to examine it and check if it's just something // simple of the form "$1 = expression" and then use convertValue() to // check if expression can be used in Python, but for now we just // pessimistically give up and prefer to handle this at C++ level only. if (Getattr(p, "tmap:default")) return false; if (String *value = Getattr(p, "value")) { String *type = Getattr(p, "type"); if (!convertValue(value, type)) return false; } } return true; } /* ------------------------------------------------------------ * is_real_overloaded() * * Check if the function is overloaded, but not just have some * siblings generated due to the original function have * default arguments. * ------------------------------------------------------------ */ bool is_real_overloaded(Node *n) { Node *h = Getattr(n, "sym:overloaded"); Node *i; if (!h) return false; i = Getattr(h, "sym:nextSibling"); while (i) { Node *nn = Getattr(i, "defaultargs"); if (nn != h) { /* Check if overloaded function has defaultargs and * pointed to the first overloaded. */ return true; } i = Getattr(i, "sym:nextSibling"); } return false; } /* ------------------------------------------------------------ * make_pyParmList() * * Generate parameter list for Python functions or methods, * reuse make_autodocParmList() to do so. * ------------------------------------------------------------ */ String *make_pyParmList(Node *n, bool in_class, bool is_calling, int kw) { /* Get the original function for a defaultargs copy, * see default_arguments() in parser.y. */ Node *nn = Getattr(n, "defaultargs"); if (nn) n = nn; /* We prefer to explicitly list all parameters of the C function in the generated Python code as this makes the function more convenient to use, however in some cases we must replace the real parameters list with just the catch all "*args". This happens when: 1. The function is overloaded as Python doesn't support this. 2. We were explicitly asked to use the "compact" arguments form. 3. We were explicitly asked to use default args from C via the "python:cdefaultargs" feature. 4. One of the default argument values can't be represented in Python. */ if (is_real_overloaded(n) || GetFlag(n, "feature:compactdefaultargs") || GetFlag(n, "feature:python:cdefaultargs") || !is_representable_as_pyargs(n)) { String *parms = NewString(""); if (in_class) Printf(parms, "self, "); Printf(parms, "*args"); if (kw) Printf(parms, ", **kwargs"); return parms; } bool funcanno = py3 ? true : false; String *params = NewString(""); String *_params = make_autodocParmList(n, false, is_calling, funcanno); if (in_class) { Printf(params, "self"); if (Len(_params) > 0) Printf(params, ", "); } Printv(params, _params, NULL); return params; } /* ------------------------------------------------------------ * have_pythonprepend() * * Check if there is a %pythonprepend directive and it has text * ------------------------------------------------------------ */ bool have_pythonprepend(Node *n) { String *str = Getattr(n, "feature:pythonprepend"); return (str && Len(str) > 0); } /* ------------------------------------------------------------ * pythonprepend() * * Get the %pythonprepend code, stripping off {} if necessary * ------------------------------------------------------------ */ String *pythonprepend(Node *n) { String *str = Getattr(n, "feature:pythonprepend"); char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } return str; } /* ------------------------------------------------------------ * have_pythonappend() * * Check if there is a %pythonappend directive and it has text * ------------------------------------------------------------ */ bool have_pythonappend(Node *n) { String *str = Getattr(n, "feature:pythonappend"); if (!str) str = Getattr(n, "feature:addtofunc"); return (str && Len(str) > 0); } /* ------------------------------------------------------------ * pythonappend() * * Get the %pythonappend code, stripping off {} if necessary * ------------------------------------------------------------ */ String *pythonappend(Node *n) { String *str = Getattr(n, "feature:pythonappend"); if (!str) str = Getattr(n, "feature:addtofunc"); char *t = Char(str); if (*t == '{') { Delitem(str, 0); Delitem(str, DOH_END); } return str; } /* ------------------------------------------------------------ * have_addtofunc() * * Check if there is a %addtofunc directive and it has text * ------------------------------------------------------------ */ bool have_addtofunc(Node *n) { return have_pythonappend(n) || have_pythonprepend(n) || have_docstring(n); } /* ------------------------------------------------------------ * returnTypeAnnotation() * * Helper function for constructing the function annotation * of the returning type, return a empty string for Python 2.x * ------------------------------------------------------------ */ String *returnTypeAnnotation(Node *n) { String *ret = 0; Parm *p = Getattr(n, "parms"); String *tm; /* Try to guess the returning type by argout typemap, * however the result may not accurate. */ while (p) { if ((tm = Getattr(p, "tmap:argout:match_type"))) { tm = SwigType_str(tm, 0); if (ret) Printv(ret, ", ", tm, NULL); else ret = tm; p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* If no argout typemap, then get the returning type from * the function prototype. */ if (!ret) { ret = Getattr(n, "type"); if (ret) ret = SwigType_str(ret, 0); } return (ret && py3) ? NewStringf(" -> \"%s\"", ret) : NewString(""); } /* ------------------------------------------------------------ * emitFunctionShadowHelper() * * Refactoring some common code out of functionWrapper and * dispatchFunction that writes the proxy code for non-member * functions. * ------------------------------------------------------------ */ void emitFunctionShadowHelper(Node *n, File *f_dest, String *name, int kw) { String *parms = make_pyParmList(n, false, false, kw); String *callParms = make_pyParmList(n, false, true, kw); /* Make a wrapper function to insert the code into */ Printv(f_dest, "\ndef ", name, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_dest, tab4, docstring(n, AUTODOC_FUNC, tab4), "\n", NIL); if (have_pythonprepend(n)) Printv(f_dest, indent_pythoncode(pythonprepend(n), tab4, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); if (have_pythonappend(n)) { Printv(f_dest, tab4 "val = ", funcCall(name, callParms), "\n", NIL); Printv(f_dest, indent_pythoncode(pythonappend(n), tab4, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_dest, tab4 "return val\n", NIL); } else { Printv(f_dest, tab4 "return ", funcCall(name, callParms), "\n", NIL); } if (!have_addtofunc(n)) { /* If there is no addtofunc directive then just assign from the extension module (for speed up) */ Printv(f_dest, name, " = ", module, ".", name, "\n", NIL); } } /* ------------------------------------------------------------ * check_kwargs() * * check if using kwargs is allowed for this Node * ------------------------------------------------------------ */ int check_kwargs(Node *n) const { return (use_kw || GetFlag(n, "feature:kwargs")) && !GetFlag(n, "memberset") && !GetFlag(n, "memberget"); } /* ------------------------------------------------------------ * add_method() * ------------------------------------------------------------ */ void add_method(String *name, String *function, int kw, Node *n = 0, int funpack= 0, int num_required= -1, int num_arguments = -1) { if (!kw) { if (n && funpack) { if (num_required == 0 && num_arguments == 0) { Printf(methods, "\t { (char *)\"%s\", (PyCFunction)%s, METH_NOARGS, ", name, function); } else if (num_required == 1 && num_arguments == 1) { Printf(methods, "\t { (char *)\"%s\", (PyCFunction)%s, METH_O, ", name, function); } else { Printf(methods, "\t { (char *)\"%s\", %s, METH_VARARGS, ", name, function); } } else { Printf(methods, "\t { (char *)\"%s\", %s, METH_VARARGS, ", name, function); } } else { Printf(methods, "\t { (char *)\"%s\", (PyCFunction) %s, METH_VARARGS | METH_KEYWORDS, ", name, function); } if (!n) { Append(methods, "NULL"); } else if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_FUNC); Printf(methods, "(char *)\"%s\"", ds); Delete(ds); } else if (Getattr(n, "feature:callback")) { Printf(methods, "(char *)\"swig_ptr: %s\"", Getattr(n, "feature:callback:name")); } else { Append(methods, "NULL"); } Append(methods, "},\n"); } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n, String *linkage, int funpack = 0, bool builtin_self = false, bool builtin_ctor = false, bool director_class = false) { /* Last node in overloaded chain */ bool add_self = builtin_self && (!builtin_ctor || director_class); int maxargs; String *tmp = NewString(""); String *dispatch; const char *dispatch_code = funpack ? "return %s(self, argc, argv);" : "return %s(self, args);"; if (castmode) { dispatch = Swig_overload_dispatch_cast(n, dispatch_code, &maxargs); } else { dispatch = Swig_overload_dispatch(n, dispatch_code, &maxargs); } /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); Printv(f->def, linkage, builtin_ctor ? "int " : "PyObject *", wname, "(PyObject *self, PyObject *args) {", NIL); Wrapper_add_local(f, "argc", "Py_ssize_t argc"); Printf(tmp, "PyObject *argv[%d] = {0}", maxargs + 1); Wrapper_add_local(f, "argv", tmp); if (!fastunpack) { Wrapper_add_local(f, "ii", "Py_ssize_t ii"); if (maxargs - (add_self ? 1 : 0) > 0) Append(f->code, "if (!PyTuple_Check(args)) SWIG_fail;\n"); Append(f->code, "argc = args ? PyObject_Length(args) : 0;\n"); if (add_self) Append(f->code, "argv[0] = self;\n"); Printf(f->code, "for (ii = 0; (ii < %d) && (ii < argc); ii++) {\n", add_self ? maxargs - 1 : maxargs); Printf(f->code, "argv[ii%s] = PyTuple_GET_ITEM(args,ii);\n", add_self ? " + 1" : ""); Append(f->code, "}\n"); if (add_self) Append(f->code, "argc++;\n"); } else { String *iname = Getattr(n, "sym:name"); Printf(f->code, "if (!(argc = SWIG_Python_UnpackTuple(args,\"%s\",0,%d,argv%s))) SWIG_fail;\n", iname, maxargs, add_self ? "+1" : ""); if (add_self) Append(f->code, "argv[0] = self;\n"); else Append(f->code, "--argc;\n"); } Replaceall(dispatch, "$args", "self, args"); Printv(f->code, dispatch, "\n", NIL); if (GetFlag(n, "feature:python:maybecall")) { Append(f->code, "fail:\n"); Append(f->code, "Py_INCREF(Py_NotImplemented);\n"); Append(f->code, "return Py_NotImplemented;\n"); } else { Node *sibl = n; while (Getattr(sibl, "sym:previousSibling")) sibl = Getattr(sibl, "sym:previousSibling"); // go all the way up String *protoTypes = NewString(""); do { String *fulldecl = Swig_name_decl(sibl); Printf(protoTypes, "\n\" %s\\n\"", fulldecl); Delete(fulldecl); } while ((sibl = Getattr(sibl, "sym:nextSibling"))); Append(f->code, "fail:\n"); Printf(f->code, "SWIG_SetErrorMsg(PyExc_NotImplementedError," "\"Wrong number or type of arguments for overloaded function '%s'.\\n\"" "\n\" Possible C/C++ prototypes are:\\n\"%s);\n", symname, protoTypes); Printf(f->code, "return %s;\n", builtin_ctor ? "-1" : "0"); Delete(protoTypes); } Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); Node *p = Getattr(n, "sym:previousSibling"); if (!builtin_self) add_method(symname, wname, 0, p); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { emitFunctionShadowHelper(n, in_class ? f_shadow_stubs : f_shadow, symname, 0); } DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ /* A note about argument marshalling with built-in types. There are three distinct cases for member (non-static) methods: 1) An ordinary member function. In this case, the first param in the param list is 'this'. For builtin types, 'this' is taken from the first argument to the wrapper (usually called 'self); it's not extracted from the second argument (which is usually a tuple). 2) A constructor for a non-director class. In this case, the param list doesn't contain an entry for 'this', but the first ('self') argument to the wrapper *does* contain the newly-allocated, uninitialized object. 3) A constructor for a director class. In this case, the param list contains a 'self' param, which comes from the first argument to the wrapper function. */ const char *get_implicitconv_flag(Node *klass) { int conv = 0; if (klass && GetFlag(klass, "feature:implicitconv")) { conv = 1; } return conv ? "SWIG_POINTER_IMPLICIT_CONV" : "0"; } virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Node *parent = Swig_methodclass(n); int director_method = 0; Parm *p; int i; char source[64]; Wrapper *f; String *self_parse; String *parse_args; String *arglist; String *get_pointers; String *cleanup; String *outarg; String *kwargs; String *tm; String *overname = 0; int num_required; int num_arguments; int num_fixed_arguments; int tuple_required; int tuple_arguments; int varargs = 0; int allow_kwargs = check_kwargs(n); String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); int destructor = (!Cmp(nodeType, "destructor")); String *storage = Getattr(n, "storage"); /* Only the first constructor is handled as init method. Others constructor can be emitted via %rename */ int handled_as_init = 0; if (!have_constructor && (constructor || Getattr(n, "handled_as_constructor")) && ((shadow & PYSHADOW_MEMBER))) { String *nname = Getattr(n, "sym:name"); String *sname = Getattr(getCurrentClass(), "sym:name"); String *cname = Swig_name_construct(NSPACE_TODO, sname); handled_as_init = (Strcmp(nname, sname) == 0) || (Strcmp(nname, cname) == 0); Delete(cname); } bool builtin_self = builtin && in_class && (constructor || (l && Getattr(l, "self"))); bool builtin_ctor = false; if (builtin_self && constructor) { String *class_mname = Getattr(getCurrentClass(), "sym:name"); String *mrename = Swig_name_construct(getNSpace(), class_mname); if (Cmp(iname, mrename)) builtin_self = false; else builtin_ctor = true; } bool director_class = (getCurrentClass() && Swig_directorclass(getCurrentClass())); bool add_self = builtin_self && (!builtin_ctor || director_class); bool builtin_getter = (builtin && GetFlag(n, "memberget")); bool builtin_setter = (builtin && GetFlag(n, "memberset") && !builtin_getter); bool over_varargs = false; char const *self_param = builtin ? "self" : "SWIGUNUSEDPARM(self)"; char const *wrap_return = builtin_ctor ? "int " : "PyObject *"; String *linkage = NewString("SWIGINTERN "); String *wrapper_name = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); self_parse = NewString(""); parse_args = NewString(""); arglist = NewString(""); get_pointers = NewString(""); cleanup = NewString(""); outarg = NewString(""); kwargs = NewString(""); int allow_thread = threads_enable(n); Wrapper_add_local(f, "resultobj", "PyObject *resultobj = 0"); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ tuple_arguments = num_arguments = emit_num_arguments(l); tuple_required = num_required = emit_num_required(l); if (add_self) { --tuple_arguments; --tuple_required; } num_fixed_arguments = tuple_required; if (((num_arguments == 0) && (num_required == 0)) || ((num_arguments == 1) && (num_required == 1) && Getattr(l, "self"))) allow_kwargs = 0; varargs = emit_isvarargs(l); String *wname = Copy(wrapper_name); if (overname) { Append(wname, overname); } if (!allow_kwargs || overname) { if (!varargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "__varargs__", "(PyObject *", self_param, ", PyObject *args, PyObject *varargs) {", NIL); } if (allow_kwargs) { Swig_warning(WARN_LANG_OVERLOAD_KEYWORD, input_file, line_number, "Can't use keyword arguments with overloaded functions (%s).\n", Swig_name_decl(n)); allow_kwargs = 0; } } else { if (varargs) { Swig_warning(WARN_LANG_VARARGS_KEYWORD, input_file, line_number, "Can't wrap varargs with keyword arguments enabled\n"); varargs = 0; } Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args, PyObject *kwargs) {", NIL); } if (!builtin || !in_class || tuple_arguments > 0) { if (!allow_kwargs) { Append(parse_args, " if (!PyArg_ParseTuple(args,(char *)\""); } else { Append(parse_args, " if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)\""); Append(arglist, ",kwnames"); } } if (overname) { String *over_varargs_attr = Getattr(n, "python:overvarargs"); if (!over_varargs_attr) { for (Node *sibling = n; sibling; sibling = Getattr(sibling, "sym:nextSibling")) { if (emit_isvarargs(Getattr(sibling, "parms"))) { over_varargs = true; break; } } over_varargs_attr = NewString(over_varargs ? "1" : "0"); for (Node *sibling = n; sibling; sibling = Getattr(sibling, "sym:nextSibling")) Setattr(sibling, "python:overvarargs", over_varargs_attr); } if (Strcmp(over_varargs_attr, "0") != 0) over_varargs = true; } int funpack = modernargs && fastunpack && !varargs && !over_varargs && !allow_kwargs; int noargs = funpack && (tuple_required == 0 && tuple_arguments == 0); int onearg = funpack && (tuple_required == 1 && tuple_arguments == 1); if (builtin && funpack && !overname && !builtin_ctor && !(GetFlag(n, "feature:compactdefaultargs") && (tuple_arguments > tuple_required || varargs))) { String *argattr = NewStringf("%d", tuple_arguments); Setattr(n, "python:argcount", argattr); Delete(argattr); } /* Generate code for argument marshalling */ if (funpack) { if (overname) { if (aliasobj0) { Append(f->code, "#define obj0 (swig_obj[0])\n"); } } else if (num_arguments) { sprintf(source, "PyObject *swig_obj[%d]", num_arguments); Wrapper_add_localv(f, "swig_obj", source, NIL); if (aliasobj0) { Append(f->code, "#define obj0 (swig_obj[0])\n"); } } } if (constructor && num_arguments == 1 && num_required == 1) { if (Cmp(storage, "explicit") == 0) { if (GetFlag(parent, "feature:implicitconv")) { String *desc = NewStringf("SWIGTYPE%s", SwigType_manglestr(Getattr(n, "type"))); Printf(f->code, "if (SWIG_CheckImplicit(%s)) SWIG_fail;\n", desc); Delete(desc); } } } if (builtin_ctor && checkAttribute(n, "access", "protected")) { String *tmp_none_comparison = Copy(none_comparison); Replaceall(tmp_none_comparison, "$arg", "self"); Printf(self_parse, "if (!(%s)) {\n", tmp_none_comparison); Printv(self_parse, " SWIG_SetErrorMsg(PyExc_RuntimeError, \"accessing abstract class or protected constructor\");\n SWIG_fail;\n}\n", NIL); Delete(tmp_none_comparison); } int use_parse = 0; Append(kwargs, "{"); for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); bool parse_from_tuple = (i > 0 || !add_self); if (SwigType_type(pt) == T_VARARGS) { parse_from_tuple = false; num_fixed_arguments -= atoi(Char(Getattr(p, "tmap:in:numinputs"))); } if (!parse_from_tuple) sprintf(source, "self"); else if (funpack) sprintf(source, "swig_obj[%d]", add_self && !overname ? i - 1 : i); else sprintf(source, "obj%d", builtin_ctor ? i + 1 : i); if (parse_from_tuple) { Putc(',', arglist); if (i == num_required) Putc('|', parse_args); /* Optional argument separator */ } /* Keyword argument handling */ if (allow_kwargs && parse_from_tuple) { String *name = makeParameterName(n, p, i + 1); Printf(kwargs, "(char *) \"%s\",", name); Delete(name); } /* Look for an input typemap */ if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { if (builtin_self) { Replaceall(tm, "$self", "self"); } else if (funpack) { Replaceall(tm, "$self", "swig_obj[0]"); } else { Replaceall(tm, "$self", "obj0"); } Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save the location of the object */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(p, "tmap:in:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } Replaceall(tm, "$implicitconv", convflag); Setattr(p, "implicitconv", convflag); } if (parse_from_tuple) Putc('O', parse_args); if (!funpack && parse_from_tuple) { Wrapper_add_localv(f, source, "PyObject *", source, "= 0", NIL); Printf(arglist, "&%s", source); } if (i >= num_required) Printv(get_pointers, "if (", source, ") {\n", NIL); Printv(get_pointers, tm, "\n", NIL); if (i >= num_required) Printv(get_pointers, "}\n", NIL); } else { use_parse = 1; Append(parse_args, parse); if (parse_from_tuple) Printf(arglist, "&%s", ln); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } /* finish argument marshalling */ Append(kwargs, " NULL }"); if (allow_kwargs) { Printv(f->locals, " char * kwnames[] = ", kwargs, ";\n", NIL); } if (builtin && !funpack && in_class && tuple_arguments == 0) { Printf(parse_args, " if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_exception_fail(SWIG_TypeError, \"%s takes no arguments\");\n", iname); } else if (use_parse || allow_kwargs || !modernargs) { Printf(parse_args, ":%s\"", iname); Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); funpack = 0; } else { Clear(parse_args); if (funpack) { Clear(f->def); if (overname) { if (noargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", int nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", int nobjs, PyObject **swig_obj) {", NIL); } Printf(parse_args, "if ((nobjs < %d) || (nobjs > %d)) SWIG_fail;\n", num_required, num_arguments); } else { if (noargs) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); } if (onearg && !builtin_ctor) { Printf(parse_args, "if (!args) SWIG_fail;\n"); Append(parse_args, "swig_obj[0] = args;\n"); } else if (!noargs) { Printf(parse_args, "if (!SWIG_Python_UnpackTuple(args,\"%s\",%d,%d,swig_obj)) SWIG_fail;\n", iname, num_fixed_arguments, tuple_arguments); } else if (noargs) { Printf(parse_args, "if (!SWIG_Python_UnpackTuple(args,\"%s\",%d,%d,0)) SWIG_fail;\n", iname, num_fixed_arguments, tuple_arguments); } } } else { Printf(parse_args, "if(!PyArg_UnpackTuple(args,(char *)\"%s\",%d,%d", iname, num_fixed_arguments, tuple_arguments); Printv(parse_args, arglist, ")) SWIG_fail;\n", NIL); } } /* Now piece together the first part of the wrapper function */ Printv(f->code, self_parse, parse_args, get_pointers, NIL); /* Check for trailing varargs */ if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$input", "varargs"); Printv(f->code, tm, "\n", NIL); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if (!Getattr(p, "tmap:in:parse") && (tm = Getattr(p, "tmap:freearg"))) { if (Getattr(p, "tmap:freearg:implicitconv")) { const char *convflag = "0"; if (!Getattr(p, "hidden")) { SwigType *ptype = Getattr(p, "type"); convflag = get_implicitconv_flag(classLookup(ptype)); } if (strcmp(convflag, "0") == 0) { tm = 0; } } if (tm && (Len(tm) != 0)) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); } p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* if the object is a director, and the method call originated from its * underlying python object, resolve the call by going up the c++ * inheritance chain. otherwise try to resolve the method in python. * without this check an infinite loop is set up between the director and * shadow class method calls. */ // NOTE: this code should only be inserted if this class is the // base class of a director class. however, in general we haven't // yet analyzed all classes derived from this one to see if they are // directors. furthermore, this class may be used as the base of // a director class defined in a completely different module at a // later time, so this test must be included whether or not directorbase // is true. we do skip this code if directors have not been enabled // at the command line to preserve source-level compatibility with // non-polymorphic swig. also, if this wrapper is for a smart-pointer // method, there is no need to perform the test since the calling object // (the smart-pointer) and the director object (the "pointee") are // distinct. director_method = is_member_director(n) && !is_smart_pointer() && !destructor; if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Append(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n"); if (dirprot_mode() && !is_public(n)) { Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name); Printf(f->code, "SWIG_SetErrorMsg(PyExc_RuntimeError,\"accessing protected member %s\");\n", name); Append(f->code, "SWIG_fail;\n"); Append(f->code, "}\n"); } Wrapper_add_local(f, "upcall", "bool upcall = false"); if (funpack) { const char *self_parm = builtin_self ? "self" : "swig_obj[0]"; Printf(f->code, "upcall = (director && (director->swig_get_self()==%s));\n", self_parm); } else { const char *self_parm = builtin_self ? "self" : "obj0"; Printf(f->code, "upcall = (director && (director->swig_get_self()==%s));\n", self_parm); } } /* Emit the function call */ if (director_method) { Append(f->code, "try {\n"); } else { if (allow_thread) { String *preaction = NewString(""); thread_begin_allow(n, preaction); Setattr(n, "wrap:preaction", preaction); String *postaction = NewString(""); thread_end_allow(n, postaction); Setattr(n, "wrap:postaction", postaction); } } Setattr(n, "wrap:name", wname); Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Append(actioncode, "} catch (Swig::DirectorException&) {\n"); Append(actioncode, " SWIG_fail;\n"); Append(actioncode, "}\n"); } /* This part below still needs cleanup */ /* Return the function value */ tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (tm) { if (builtin_self) { Replaceall(tm, "$self", "self"); } else if (funpack) { Replaceall(tm, "$self", "swig_obj[0]"); } else { Replaceall(tm, "$self", "obj0"); } Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (builtin_ctor) { Replaceall(tm, "$owner", "SWIG_BUILTIN_INIT"); } else if (handled_as_init) { Replaceall(tm, "$owner", "SWIG_POINTER_NEW"); } else { if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_POINTER_OWN"); } else { Replaceall(tm, "$owner", "0"); } } // FIXME: this will not try to unwrap directors returned as non-director // base class pointers! /* New addition to unwrap director return values so that the original * python object is returned instead. */ #if 1 int unwrap = 0; String *decl = Getattr(n, "decl"); int is_pointer = SwigType_ispointer_return(decl); int is_reference = SwigType_isreference_return(decl); if (is_pointer || is_reference) { String *type = Getattr(n, "type"); //Node *classNode = Swig_methodclass(n); //Node *module = Getattr(classNode, "module"); Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, type); if (target) unwrap = 1; } if (unwrap) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Printf(f->code, "director = SWIG_DIRECTOR_CAST(%s);\n", Swig_cresult_name()); Append(f->code, "if (director) {\n"); Append(f->code, " resultobj = director->swig_get_self();\n"); Append(f->code, " Py_INCREF(resultobj);\n"); Append(f->code, "} else {\n"); Printf(f->code, "%s\n", tm); Append(f->code, "}\n"); } else { Printf(f->code, "%s\n", tm); } #else Printf(f->code, "%s\n", tm); #endif Delete(tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ int need_cleanup = Len(cleanup) != 0; if (need_cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } if (director_method) { if ((tm = Swig_typemap_lookup("directorfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "resultobj"); Printf(f->code, "%s\n", tm); Delete(tm); } } if (builtin_ctor) Append(f->code, " return resultobj == Py_None ? -1 : 0;\n"); else Append(f->code, " return resultobj;\n"); /* Error handling code */ Append(f->code, "fail:\n"); if (need_cleanup) { Printv(f->code, cleanup, NIL); } if (builtin_ctor) Printv(f->code, " return -1;\n", NIL); else Printv(f->code, " return NULL;\n", NIL); if (funpack) { if (aliasobj0) { Append(f->code, "#if defined(obj0)\n"); Append(f->code, "#undef obj0\n"); Append(f->code, "#endif\n"); } } Append(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); if (builtin_self) { Replaceall(f->code, "$self", "self"); } else if (funpack) { Replaceall(f->code, "$self", "swig_obj[0]"); } else { Replaceall(f->code, "$self", "obj0"); } /* Dump the function out */ Wrapper_print(f, f_wrappers); /* If varargs. Need to emit a varargs stub */ if (varargs) { DelWrapper(f); f = NewWrapper(); if (funpack) { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", int nobjs, PyObject **swig_obj) {", NIL); } else { Printv(f->def, linkage, wrap_return, wname, "(PyObject *", self_param, ", PyObject *args) {", NIL); } Wrapper_add_local(f, "resultobj", builtin_ctor ? "int resultobj" : "PyObject *resultobj"); Wrapper_add_local(f, "varargs", "PyObject *varargs"); Wrapper_add_local(f, "newargs", "PyObject *newargs"); if (funpack) { Wrapper_add_local(f, "i", "int i"); Printf(f->code, "newargs = PyTuple_New(%d);\n", num_fixed_arguments); Printf(f->code, "for (i = 0; i < %d; ++i) {\n", num_fixed_arguments); Printf(f->code, " PyTuple_SET_ITEM(newargs, i, swig_obj[i]);\n"); Printf(f->code, " Py_XINCREF(swig_obj[i]);\n"); Printf(f->code, "}\n"); Printf(f->code, "varargs = PyTuple_New(nobjs > %d ? nobjs - %d : 0);\n", num_fixed_arguments, num_fixed_arguments); Printf(f->code, "for (i = 0; i < nobjs - %d; ++i) {\n", num_fixed_arguments); Printf(f->code, " PyTuple_SET_ITEM(newargs, i, swig_obj[i + %d]);\n", num_fixed_arguments); Printf(f->code, " Py_XINCREF(swig_obj[i + %d]);\n", num_fixed_arguments); Printf(f->code, "}\n"); } else { Printf(f->code, "newargs = PyTuple_GetSlice(args,0,%d);\n", num_fixed_arguments); Printf(f->code, "varargs = PyTuple_GetSlice(args,%d,PyTuple_Size(args));\n", num_fixed_arguments); } Printf(f->code, "resultobj = %s__varargs__(%s,newargs,varargs);\n", wname, builtin ? "self" : "NULL"); Append(f->code, "Py_XDECREF(newargs);\n"); Append(f->code, "Py_XDECREF(varargs);\n"); Append(f->code, "return resultobj;\n"); Append(f->code, "}\n"); Wrapper_print(f, f_wrappers); } /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { if (!builtin_self) add_method(iname, wname, allow_kwargs, n, funpack, num_required, num_arguments); /* Create a shadow for this function (if enabled and not in a member function) */ if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { emitFunctionShadowHelper(n, in_class ? f_shadow_stubs : f_shadow, iname, allow_kwargs); } } else { if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n, linkage, funpack, builtin_self, builtin_ctor, director_class); } } // Put this in tp_init of the PyTypeObject if (builtin_ctor) { if ((director_method || !is_private(n)) && !Getattr(class_members, iname)) { Setattr(class_members, iname, n); if (!builtin_tp_init) builtin_tp_init = Swig_name_wrapper(iname); } } /* If this is a builtin type, create a PyGetSetDef entry for this member variable. */ if (builtin) { const char *memname = "__dict__"; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "getter", "SwigPyObject_get___dict__"); } if (builtin_getter) { String *memname = Getattr(n, "membervariableHandler:sym:name"); if (!memname) memname = iname; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "getter", wrapper_name); Delattr(n, "memberget"); } if (builtin_setter) { String *memname = Getattr(n, "membervariableHandler:sym:name"); if (!memname) memname = iname; Hash *h = Getattr(builtin_getset, memname); if (!h) { h = NewHash(); Setattr(builtin_getset, memname, h); Delete(h); } Setattr(h, "setter", wrapper_name); Delattr(n, "memberset"); } if (in_class && builtin) { /* Handle operator overloads for builtin types */ String *slot = Getattr(n, "feature:python:slot"); if (slot) { String *func_type = Getattr(n, "feature:python:slot:functype"); String *closure_decl = getClosure(func_type, wrapper_name, overname ? 0 : funpack); String *feature_name = NewStringf("feature:python:%s", slot); String *closure_name = 0; if (closure_decl) { closure_name = NewStringf("%s_%s_closure", wrapper_name, func_type); if (!GetFlag(builtin_closures, closure_name)) Printf(builtin_closures_code, "%s /* defines %s */\n\n", closure_decl, closure_name); SetFlag(builtin_closures, closure_name); Delete(closure_decl); } else { closure_name = Copy(wrapper_name); } if (func_type) { String *s = NewStringf("(%s) %s", func_type, closure_name); Delete(closure_name); closure_name = s; } Setattr(parent, feature_name, closure_name); Delete(feature_name); Delete(closure_name); } /* Handle comparison operators for builtin types */ String *compare = Getattr(n, "feature:python:compare"); if (compare) { Hash *richcompare = Getattr(parent, "python:richcompare"); assert(richcompare); Setattr(richcompare, compare, wrapper_name); } } Delete(self_parse); Delete(parse_args); Delete(linkage); Delete(arglist); Delete(get_pointers); Delete(cleanup); Delete(outarg); Delete(kwargs); Delete(wname); DelWrapper(f); Delete(wrapper_name); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); static int have_globals = 0; String *tm; Wrapper *getf, *setf; if (!addSymbol(iname, n)) return SWIG_ERROR; getf = NewWrapper(); setf = NewWrapper(); /* If this is our first call, add the globals variable to the Python dictionary. */ if (!have_globals) { Printf(f_init, "\t PyDict_SetItemString(md,(char *)\"%s\", SWIG_globals());\n", global_name); if (builtin) Printf(f_init, "\t SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", global_name); have_globals = 1; if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { Printf(f_shadow_stubs, "%s = %s.%s\n", global_name, module, global_name); } } int assignable = is_assignable(n); if (!builtin && shadow && !assignable && !in_class) Printf(f_shadow_stubs, "%s = %s.%s\n", iname, global_name, iname); String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *vargetname = NewStringf("Swig_var_%s", getname); String *varsetname = NewStringf("Swig_var_%s", setname); /* Create a function for setting the value of the variable */ if (assignable) { Setattr(n, "wrap:name", varsetname); if (builtin && in_class) { String *set_wrapper = Swig_name_wrapper(setname); Setattr(n, "pybuiltin:setter", set_wrapper); Delete(set_wrapper); } Printf(setf->def, "SWIGINTERN int %s(PyObject *_val) {", varsetname); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "_val"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "_val"); if (Getattr(n, "tmap:varin:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } emit_action_code(n, setf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Printv(setf->code, " return 0;\n", NULL); Append(setf->code, "fail:\n"); Printv(setf->code, " return 1;\n", NULL); } else { /* Is a readonly variable. Issue an error */ if (CPlusPlus) { Printf(setf->def, "SWIGINTERN int %s(PyObject *) {", varsetname); } else { Printf(setf->def, "SWIGINTERN int %s(PyObject *_val SWIGUNUSED) {", varsetname); } Printv(setf->code, " SWIG_Error(SWIG_AttributeError,\"Variable ", iname, " is read-only.\");\n", " return 1;\n", NIL); } Append(setf->code, "}\n"); Wrapper_print(setf, f_wrappers); /* Create a function for getting the value of a variable */ Setattr(n, "wrap:name", vargetname); if (builtin && in_class) { String *get_wrapper = Swig_name_wrapper(getname); Setattr(n, "pybuiltin:getter", get_wrapper); Delete(get_wrapper); } int addfail = 0; Printf(getf->def, "SWIGINTERN PyObject *%s(void) {", vargetname); Wrapper_add_local(getf, "pyobj", "PyObject *pyobj = 0"); if (builtin) { Wrapper_add_local(getf, "self", "PyObject *self = 0"); Append(getf->code, " (void)self;\n"); } if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "pyobj"); Replaceall(tm, "$result", "pyobj"); addfail = emit_action_code(n, getf->code, tm); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Append(getf->code, " return pyobj;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return NULL;\n"); } Append(getf->code, "}\n"); Wrapper_print(getf, f_wrappers); /* Now add this to the variable linking mechanism */ Printf(f_init, "\t SWIG_addvarlink(SWIG_globals(),(char *)\"%s\",%s, %s);\n", iname, vargetname, varsetname); if (builtin && shadow && !assignable && !in_class) { Printf(f_init, "\t PyDict_SetItemString(md, (char *)\"%s\", PyObject_GetAttrString(SWIG_globals(), \"%s\"));\n", iname, iname); Printf(f_init, "\t SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", iname); } Delete(vargetname); Delete(varsetname); Delete(getname); Delete(setname); DelWrapper(setf); DelWrapper(getf); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ /* Determine if the node requires the _swigconstant code to be generated */ bool needs_swigconstant(Node *n) { SwigType *type = Getattr(n, "type"); SwigType *qtype = SwigType_typedef_resolve_all(type); SwigType *uqtype = SwigType_strip_qualifiers(qtype); bool result = false; /* Note, that we need special handling for function pointers, as * SwigType_base(fptr) does not return the underlying pointer-to-function * type but the return-type of function. */ if(!SwigType_isfunction(uqtype) && !SwigType_isfunctionpointer(uqtype)) { SwigType *basetype = SwigType_base(uqtype); result = SwigType_isclass(basetype) != 0; Delete(basetype); } Delete(qtype); Delete(uqtype); return result; } virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; int have_tm = 0; int have_builtin_symname = 0; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); String *str = SwigType_str(type, wname); Printf(f_header, "static %s = %s;\n", str, value); Delete(str); value = wname; } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(const_code, "%s,\n", tm); Delete(tm); have_tm = 1; } if (builtin && in_class && Getattr(n, "pybuiltin:symname")) { have_builtin_symname = 1; Swig_require("builtin_constantWrapper", n, "*sym:name", "pybuiltin:symname", NIL); Setattr(n, "sym:name", Getattr(n, "pybuiltin:symname")); } if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (needs_swigconstant(n) && !builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER)) && (!in_class || !Getattr(n, "feature:python:callback"))) { // Generate `*_swigconstant()` method which registers the new constant. // // *_swigconstant methods are required for constants of class type. // Class types are registered in shadow file (see *_swigregister). The // instances of class must be created (registered) after the type is // registered, so we can't let SWIG_init() to register constants of // class type (the SWIG_init() is called before shadow classes are // defined and registered). Printf(f_wrappers, "SWIGINTERN PyObject *%s_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", iname); Printf(f_wrappers, tab2 "PyObject *module;\n", tm); Printf(f_wrappers, tab2 "PyObject *d;\n"); if (modernargs) { if (fastunpack) { Printf(f_wrappers, tab2 "if (!SWIG_Python_UnpackTuple(args,(char *)\"swigconstant\", 1, 1,&module)) return NULL;\n"); } else { Printf(f_wrappers, tab2 "if (!PyArg_UnpackTuple(args,(char *)\"swigconstant\", 1, 1,&module)) return NULL;\n"); } } else { Printf(f_wrappers, tab2 "if (!PyArg_ParseTuple(args,(char *)\"O:swigconstant\", &module)) return NULL;\n"); } Printf(f_wrappers, tab2 "d = PyModule_GetDict(module);\n"); Printf(f_wrappers, tab2 "if (!d) return NULL;\n"); Printf(f_wrappers, tab2 "%s\n", tm); Printf(f_wrappers, tab2 "return SWIG_Py_Void();\n"); Printf(f_wrappers, "}\n\n\n"); // Register the method in SwigMethods array String *cname = NewStringf("%s_swigconstant", iname); add_method(cname, cname, 0); Delete(cname); } else { Printf(f_init, "%s\n", tm); } Delete(tm); have_tm = 1; } if (have_builtin_symname) Swig_restore(n); if (!have_tm) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } if (!builtin && (shadow) && (!(shadow & PYSHADOW_MEMBER))) { if (!in_class) { if(needs_swigconstant(n)) { Printv(f_shadow, "\n",NIL); Printv(f_shadow, module, ".", iname, "_swigconstant(",module,")\n", NIL); } Printv(f_shadow, iname, " = ", module, ".", iname, "\n", NIL); } else { if (!(Getattr(n, "feature:python:callback"))) { if(needs_swigconstant(n)) { Printv(f_shadow_stubs, "\n",NIL); Printv(f_shadow_stubs, module, ".", iname, "_swigconstant(", module, ")\n", NIL); } Printv(f_shadow_stubs, iname, " = ", module, ".", iname, "\n", NIL); } } } return SWIG_OK; } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; add_method(name, wrapname, 0); if (!builtin && shadow) { Printv(f_shadow_stubs, name, " = ", module, ".", name, "\n", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------------- * BEGIN C++ Director Class modifications * ------------------------------------------------------------------------- */ /* C++/Python polymorphism demo code * * TODO * * Move some boilerplate code generation to Swig_...() functions. * */ /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * ** Moved down due to gcc-2.96 internal error ** * --------------------------------------------------------------- */ int classDirectorMethods(Node *n); int classDirectorMethod(Node *n, Node *parent, String *super); /* ------------------------------------------------------------ * classDirectorConstructor() * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("PyObject"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { \n", classname, target, call); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } /* ------------------------------------------------------------ * classDirectorDefaultConstructor() * ------------------------------------------------------------ */ int classDirectorDefaultConstructor(Node *n) { String *classname = Swig_class_name(n); { Node *parent = Swig_methodclass(n); String *basetype = Getattr(parent, "classtype"); Wrapper *w = NewWrapper(); Printf(w->def, "SwigDirector_%s::SwigDirector_%s(PyObject *self) : Swig::Director(self) { \n", classname, classname); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Wrapper_print(w, f_directors); DelWrapper(w); } Printf(f_directors_h, " SwigDirector_%s(PyObject *self);\n", classname); Delete(classname); return Language::classDirectorDefaultConstructor(n); } /* ------------------------------------------------------------ * classDirectorInit() * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } /* ------------------------------------------------------------ * classDirectorEnd() * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { String *classname = Swig_class_name(n); if (dirprot_mode()) { /* This implementation uses a std::map. It should be possible to rewrite it using a more elegant way, like copying the Java approach for the 'override' array. But for now, this seems to be the least intrusive way. */ Printf(f_directors_h, "\n"); Printf(f_directors_h, "/* Internal director utilities */\n"); Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_get_inner(const char *swig_protected_method_name) const {\n"); Printf(f_directors_h, " std::map::const_iterator iv = swig_inner.find(swig_protected_method_name);\n"); Printf(f_directors_h, " return (iv != swig_inner.end() ? iv->second : false);\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {\n"); Printf(f_directors_h, " swig_inner[swig_protected_method_name] = swig_val;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable std::map swig_inner;\n"); } if (director_method_index) { Printf(f_directors_h, "\n"); Printf(f_directors_h, "#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)\n"); Printf(f_directors_h, "/* VTable implementation */\n"); Printf(f_directors_h, " PyObject *swig_get_method(size_t method_index, const char *method_name) const {\n"); Printf(f_directors_h, " PyObject *method = vtable[method_index];\n"); Printf(f_directors_h, " if (!method) {\n"); Printf(f_directors_h, " swig::SwigVar_PyObject name = SWIG_Python_str_FromChar(method_name);\n"); Printf(f_directors_h, " method = PyObject_GetAttr(swig_get_self(), name);\n"); Printf(f_directors_h, " if (!method) {\n"); Printf(f_directors_h, " std::string msg = \"Method in class %s doesn't exist, undefined \";\n", classname); Printf(f_directors_h, " msg += method_name;\n"); Printf(f_directors_h, " Swig::DirectorMethodException::raise(msg.c_str());\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " vtable[method_index] = method;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " return method;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable swig::SwigVar_PyObject vtable[%d];\n", director_method_index); Printf(f_directors_h, "#endif\n\n"); } Printf(f_directors_h, "};\n\n"); return Language::classDirectorEnd(n); } /* ------------------------------------------------------------ * classDirectorDisown() * ------------------------------------------------------------ */ int classDirectorDisown(Node *n) { int result; int oldshadow = shadow; /* disable shadowing */ if (shadow) shadow = shadow | PYSHADOW_MEMBER; result = Language::classDirectorDisown(n); shadow = oldshadow; if (shadow) { if (builtin) { String *rname = SwigType_namestr(real_classname); Printf(builtin_methods, " { \"__disown__\", (PyCFunction) Swig::Director::swig_pyobj_disown< %s >, METH_NOARGS, \"\" },\n", rname); Delete(rname); } else { String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_disown(NSPACE_TODO, symname); //Getattr(n, "name")); Printv(f_shadow, tab4, "def __disown__(self):\n", NIL); #ifdef USE_THISOWN Printv(f_shadow, tab8, "self.thisown = 0\n", NIL); #else Printv(f_shadow, tab8, "self.this.disown()\n", NIL); #endif Printv(f_shadow, tab8, module, ".", mrename, "(self)\n", NIL); Printv(f_shadow, tab8, "return weakref_proxy(self)\n", NIL); Delete(mrename); } } return result; } /* ---------------------------------------------------------------------------- * END of C++ Director Class modifications * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { if (shadow && !Getattr(n, "feature:onlychildren")) { Node *mod = Getattr(n, "module"); if (mod) { String *modname = Getattr(mod, "name"); Node *options = Getattr(mod, "options"); String *pkg = options ? Getattr(options, "package") : 0; String *sym = Getattr(n, "sym:name"); String *importname = import_name_string(package, mainmodule, pkg, modname, sym); Setattr(n, "python:proxy", importname); Delete(importname); } } int result = Language::classDeclaration(n); return result; } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ String *add_explicit_scope(String *s) { if (!Strstr(s, "::")) { String *ss = NewStringf("::%s", s); Delete(s); s = ss; } return s; } void builtin_pre_decl(Node *n) { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); String *mname = SwigType_manglestr(rname); Printf(f_init, "\n/* type '%s' */\n", rname); Printf(f_init, " builtin_pytype = (PyTypeObject *)&SwigPyBuiltin_%s_type;\n", mname); Printf(f_init, " builtin_pytype->tp_dict = d = PyDict_New();\n"); Delete(rname); Delete(mname); } void builtin_post_decl(File *f, Node *n) { String *name = Getattr(n, "name"); String *pname = Copy(name); SwigType_add_pointer(pname); String *symname = Getattr(n, "sym:name"); String *rname = add_explicit_scope(SwigType_namestr(name)); String *mname = SwigType_manglestr(rname); String *pmname = SwigType_manglestr(pname); String *templ = NewStringf("SwigPyBuiltin_%s", mname); int funpack = modernargs && fastunpack; static String *tp_new = NewString("PyType_GenericNew"); Printv(f_init, " SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);\n", NIL); // We can’t statically initialize a structure member with a function defined in another C module // So this is done in the initialization function instead, see https://docs.python.org/2/extending/newtypes.html Printf(f_init, " builtin_pytype->tp_new = %s;\n", getSlot(n, "feature:python:tp_new", tp_new)); Printv(f_init, " builtin_base_count = 0;\n", NIL); List *baselist = Getattr(n, "bases"); if (baselist) { int base_count = 0; for (Iterator b = First(baselist); b.item; b = Next(b)) { String *bname = Getattr(b.item, "name"); if (!bname || GetFlag(b.item, "feature:ignore")) continue; base_count++; String *base_name = Copy(bname); SwigType_add_pointer(base_name); String *base_mname = SwigType_manglestr(base_name); Printf(f_init, " builtin_basetype = SWIG_MangledTypeQuery(\"%s\");\n", base_mname); Printv(f_init, " if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData *) builtin_basetype->clientdata)->pytype) {\n", NIL); Printv(f_init, " builtin_bases[builtin_base_count++] = ((SwigPyClientData *) builtin_basetype->clientdata)->pytype;\n", NIL); Printv(f_init, " } else {\n", NIL); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Could not create type '%s' as base '%s' has not been initialized.\\n\");\n", symname, bname); Printv(f_init, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f_init, " return NULL;\n", NIL); Printv(f_init, "#else\n", NIL); Printv(f_init, " return;\n", NIL); Printv(f_init, "#endif\n", NIL); Printv(f_init, " }\n", NIL); Delete(base_name); Delete(base_mname); } if (base_count > max_bases) max_bases = base_count; } Printv(f_init, " builtin_bases[builtin_base_count] = NULL;\n", NIL); Printv(f_init, " SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);\n", NIL); builtin_bases_needed = 1; // Check for non-public destructor, in which case tp_dealloc will issue // a warning and allow the memory to leak. Any class that doesn't explicitly // have a private/protected destructor has an implicit public destructor. static String *tp_dealloc_bad = NewString("SwigPyBuiltin_BadDealloc"); String *getset_name = NewStringf("%s_getset", templ); String *methods_name = NewStringf("%s_methods", templ); String *getset_def = NewString(""); Printf(getset_def, "SWIGINTERN PyGetSetDef %s[] = {\n", getset_name); // All objects have 'this' and 'thisown' attributes Printv(f_init, "PyDict_SetItemString(d, \"this\", this_descr);\n", NIL); Printv(f_init, "PyDict_SetItemString(d, \"thisown\", thisown_descr);\n", NIL); // Now, the rest of the attributes for (Iterator member_iter = First(builtin_getset); member_iter.item; member_iter = Next(member_iter)) { String *memname = member_iter.key; Hash *mgetset = member_iter.item; String *getter = Getattr(mgetset, "getter"); String *setter = Getattr(mgetset, "setter"); const char *getter_closure = getter ? funpack ? "SwigPyBuiltin_FunpackGetterClosure" : "SwigPyBuiltin_GetterClosure" : "0"; const char *setter_closure = setter ? funpack ? "SwigPyBuiltin_FunpackSetterClosure" : "SwigPyBuiltin_SetterClosure" : "0"; String *gspair = NewStringf("%s_%s_getset", symname, memname); Printf(f, "static SwigPyGetSet %s = { %s, %s };\n", gspair, getter ? getter : "0", setter ? setter : "0"); String *entry = NewStringf("{ (char *) \"%s\", (getter) %s, (setter) %s, (char *)\"%s.%s\", (void *) &%s }\n", memname, getter_closure, setter_closure, name, memname, gspair); if (GetFlag(mgetset, "static")) { Printf(f, "static PyGetSetDef %s_def = %s;\n", gspair, entry); Printf(f_init, "static_getset = SwigPyStaticVar_new_getset(metatype, &%s_def);\n", gspair); Printf(f_init, "PyDict_SetItemString(d, static_getset->d_getset->name, (PyObject *) static_getset);\n", memname); Printf(f_init, "Py_DECREF(static_getset);\n"); } else { Printf(getset_def, " %s,\n", entry); } Delete(gspair); Delete(entry); } Printv(f, getset_def, " {NULL, NULL, NULL, NULL, NULL} /* Sentinel */\n", "};\n\n", NIL); // Rich compare function Hash *richcompare = Getattr(n, "python:richcompare"); String *richcompare_func = NewStringf("%s_richcompare", templ); assert(richcompare); Printf(f, "SWIGINTERN PyObject *\n"); Printf(f, "%s(PyObject *self, PyObject *other, int op) {\n", richcompare_func); Printf(f, " PyObject *result = NULL;\n"); if (!funpack) { Printf(f, " PyObject *tuple = PyTuple_New(1);\n"); Printf(f, " assert(tuple);\n"); Printf(f, " PyTuple_SET_ITEM(tuple, 0, other);\n"); Printf(f, " Py_XINCREF(other);\n"); } Iterator rich_iter = First(richcompare); if (rich_iter.item) { Printf(f, " switch (op) {\n"); for (; rich_iter.item; rich_iter = Next(rich_iter)) Printf(f, " case %s : result = %s(self, %s); break;\n", rich_iter.key, rich_iter.item, funpack ? "other" : "tuple"); Printv(f, " default : break;\n", NIL); Printf(f, " }\n"); } Printv(f, " if (!result) {\n", NIL); Printv(f, " if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {\n", NIL); Printv(f, " result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);\n", NIL); Printv(f, " } else {\n", NIL); Printv(f, " result = Py_NotImplemented;\n", NIL); Printv(f, " Py_INCREF(result);\n", NIL); Printv(f, " }\n", NIL); Printv(f, " }\n", NIL); if (!funpack) Printf(f, " Py_DECREF(tuple);\n"); Printf(f, " return result;\n"); Printf(f, "}\n\n"); // Methods Printf(f, "SWIGINTERN PyMethodDef %s_methods[] = {\n", templ); Dump(builtin_methods, f); Printf(f, " { NULL, NULL, 0, NULL } /* Sentinel */\n};\n\n"); // No instance dict for nondynamic objects if (GetFlag(n, "feature:python:nondynamic")) Setattr(n, "feature:python:tp_setattro", "SWIG_Python_NonDynamicSetAttr"); Node *mod = Getattr(n, "module"); String *modname = mod ? Getattr(mod, "name") : 0; String *quoted_symname; if (package) { if (modname) quoted_symname = NewStringf("\"%s.%s.%s\"", package, modname, symname); else quoted_symname = NewStringf("\"%s.%s\"", package, symname); } else { if (modname) quoted_symname = NewStringf("\"%s.%s\"", modname, symname); else quoted_symname = NewStringf("\"%s\"", symname); } String *quoted_tp_doc_str = NewStringf("\"%s\"", getSlot(n, "feature:python:tp_doc")); String *tp_init = NewString(builtin_tp_init ? Char(builtin_tp_init) : Swig_directorclass(n) ? "0" : "SwigPyBuiltin_BadInit"); String *tp_flags = NewString("Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES"); String *tp_flags_py3 = NewString("Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE"); static String *tp_basicsize = NewStringf("sizeof(SwigPyObject)"); static String *tp_dictoffset_default = NewString("offsetof(SwigPyObject, dict)"); static String *tp_hash = NewString("SwigPyObject_hash"); String *tp_as_number = NewStringf("&%s_type.as_number", templ); String *tp_as_sequence = NewStringf("&%s_type.as_sequence", templ); String *tp_as_mapping = NewStringf("&%s_type.as_mapping", templ); String *tp_as_buffer = NewStringf("&%s_type.as_buffer", templ); Printf(f, "static PyHeapTypeObject %s_type = {\n", templ); // PyTypeObject ht_type Printf(f, " {\n"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f, " PyVarObject_HEAD_INIT(NULL, 0)\n", NIL); Printv(f, "#else\n", NIL); Printf(f, " PyObject_HEAD_INIT(NULL)\n"); printSlot(f, getSlot(), "ob_size"); Printv(f, "#endif\n", NIL); printSlot(f, quoted_symname, "tp_name"); printSlot(f, getSlot(n, "feature:python:tp_basicsize", tp_basicsize), "tp_basicsize"); printSlot(f, getSlot(n, "feature:python:tp_itemsize"), "tp_itemsize"); printSlot(f, getSlot(n, "feature:python:tp_dealloc", tp_dealloc_bad), "tp_dealloc", "destructor"); printSlot(f, getSlot(n, "feature:python:tp_print"), "tp_print", "printfunc"); printSlot(f, getSlot(n, "feature:python:tp_getattr"), "tp_getattr", "getattrfunc"); printSlot(f, getSlot(n, "feature:python:tp_setattr"), "tp_setattr", "setattrfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_compare"), "tp_compare"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_compare"), "tp_compare", "cmpfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_repr"), "tp_repr", "reprfunc"); printSlot(f, getSlot(n, "feature:python:tp_as_number", tp_as_number), "tp_as_number"); printSlot(f, getSlot(n, "feature:python:tp_as_sequence", tp_as_sequence), "tp_as_sequence"); printSlot(f, getSlot(n, "feature:python:tp_as_mapping", tp_as_mapping), "tp_as_mapping"); printSlot(f, getSlot(n, "feature:python:tp_hash", tp_hash), "tp_hash", "hashfunc"); printSlot(f, getSlot(n, "feature:python:tp_call"), "tp_call", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:tp_str"), "tp_str", "reprfunc"); printSlot(f, getSlot(n, "feature:python:tp_getattro"), "tp_getattro", "getattrofunc"); printSlot(f, getSlot(n, "feature:python:tp_setattro"), "tp_setattro", "setattrofunc"); printSlot(f, getSlot(n, "feature:python:tp_as_buffer", tp_as_buffer), "tp_as_buffer"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_flags", tp_flags_py3), "tp_flags"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_flags", tp_flags), "tp_flags"); Printv(f, "#endif\n", NIL); printSlot(f, quoted_tp_doc_str, "tp_doc"); printSlot(f, getSlot(n, "feature:python:tp_traverse"), "tp_traverse", "traverseproc"); printSlot(f, getSlot(n, "feature:python:tp_clear"), "tp_clear", "inquiry"); printSlot(f, getSlot(n, "feature:python:tp_richcompare", richcompare_func), "tp_richcompare", "richcmpfunc"); printSlot(f, getSlot(n, "feature:python:tp_weaklistoffset"), "tp_weaklistoffset"); printSlot(f, getSlot(n, "feature:python:tp_iter"), "tp_iter", "getiterfunc"); printSlot(f, getSlot(n, "feature:python:tp_iternext"), "tp_iternext", "iternextfunc"); printSlot(f, getSlot(n, "feature:python:tp_methods", methods_name), "tp_methods"); printSlot(f, getSlot(n, "feature:python:tp_members"), "tp_members"); printSlot(f, getSlot(n, "feature:python:tp_getset", getset_name), "tp_getset"); printSlot(f, getSlot(n, "feature:python:tp_base"), "tp_base"); printSlot(f, getSlot(n, "feature:python:tp_dict"), "tp_dict"); printSlot(f, getSlot(n, "feature:python:tp_descr_get"), "tp_descr_get", "descrgetfunc"); printSlot(f, getSlot(n, "feature:python:tp_descr_set"), "tp_descr_set", "descrsetfunc"); printSlot(f, getSlot(n, "feature:python:tp_dictoffset", tp_dictoffset_default), "tp_dictoffset", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_init", tp_init), "tp_init", "initproc"); printSlot(f, getSlot(n, "feature:python:tp_alloc"), "tp_alloc", "allocfunc"); printSlot(f, getSlot(), "tp_new", "newfunc"); printSlot(f, getSlot(n, "feature:python:tp_free"), "tp_free", "freefunc"); printSlot(f, getSlot(n, "feature:python:tp_is_gc"), "tp_is_gc", "inquiry"); printSlot(f, getSlot(n, "feature:python:tp_bases"), "tp_bases", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_mro"), "tp_mro", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_cache"), "tp_cache", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_subclasses"), "tp_subclasses", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_weaklist"), "tp_weaklist", "PyObject *"); printSlot(f, getSlot(n, "feature:python:tp_del"), "tp_del", "destructor"); Printv(f, "#if PY_VERSION_HEX >= 0x02060000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_version_tag"), "tp_version_tag", "int"); Printv(f, "#endif\n", NIL); Printv(f, "#if PY_VERSION_HEX >= 0x03040000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_finalize"), "tp_finalize", "destructor"); Printv(f, "#endif\n", NIL); Printv(f, "#ifdef COUNT_ALLOCS\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_allocs"), "tp_allocs", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_frees"), "tp_frees", "Py_ssize_t"); printSlot(f, getSlot(n, "feature:python:tp_maxalloc"), "tp_maxalloc", "Py_ssize_t"); Printv(f, "#if PY_VERSION_HEX >= 0x02050000\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_prev"), "tp_prev"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:tp_next"), "tp_next"); Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyAsyncMethods as_async Printv(f, "#if PY_VERSION_HEX >= 0x03050000\n", NIL); Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:am_await"), "am_await", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:am_aiter"), "am_aiter", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:am_anext"), "am_anext", "unaryfunc"); Printf(f, " },\n"); Printv(f, "#endif\n", NIL); // PyNumberMethods as_number Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:nb_add"), "nb_add", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_subtract"), "nb_subtract", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_multiply"), "nb_multiply", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_divide"), "nb_divide", "binaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_remainder"), "nb_remainder", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_divmod"), "nb_divmod", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_power"), "nb_power", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_negative"), "nb_negative", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_positive"), "nb_positive", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_absolute"), "nb_absolute", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_nonzero"), "nb_nonzero", "inquiry"); printSlot(f, getSlot(n, "feature:python:nb_invert"), "nb_invert", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_lshift"), "nb_lshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_rshift"), "nb_rshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_and"), "nb_and", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_xor"), "nb_xor", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_or"), "nb_or", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_coerce"), "nb_coerce", "coercion"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_int"), "nb_int", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_reserved"), "nb_reserved", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_long"), "nb_long", "unaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_float"), "nb_float", "unaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_oct"), "nb_oct", "unaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_hex"), "nb_hex", "unaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_add"), "nb_inplace_add", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_subtract"), "nb_inplace_subtract", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_multiply"), "nb_inplace_multiply", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_divide"), "nb_inplace_divide", "binaryfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_inplace_remainder"), "nb_inplace_remainder", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_power"), "nb_inplace_power", "ternaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_lshift"), "nb_inplace_lshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_rshift"), "nb_inplace_rshift", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_and"), "nb_inplace_and", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_xor"), "nb_inplace_xor", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_or"), "nb_inplace_or", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_floor_divide"), "nb_floor_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_divide"), "nb_true_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_floor_divide"), "nb_inplace_floor_divide", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_divide"), "nb_inplace_true_divide", "binaryfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x02050000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_index"), "nb_index", "unaryfunc"); Printv(f, "#endif\n", NIL); Printv(f, "#if PY_VERSION_HEX >= 0x03050000\n", NIL); printSlot(f, getSlot(n, "feature:python:nb_matrix_multiply"), "nb_matrix_multiply", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:nb_inplace_matrix_multiply"), "nb_inplace_matrix_multiply", "binaryfunc"); Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyMappingMethods as_mapping; Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:mp_length"), "mp_length", "lenfunc"); printSlot(f, getSlot(n, "feature:python:mp_subscript"), "mp_subscript", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:mp_ass_subscript"), "mp_ass_subscript", "objobjargproc"); Printf(f, " },\n"); // PySequenceMethods as_sequence; Printf(f, " {\n"); printSlot(f, getSlot(n, "feature:python:sq_length"), "sq_length", "lenfunc"); printSlot(f, getSlot(n, "feature:python:sq_concat"), "sq_concat", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:sq_repeat"), "sq_repeat", "ssizeargfunc"); printSlot(f, getSlot(n, "feature:python:sq_item"), "sq_item", "ssizeargfunc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:was_sq_slice"), "was_sq_slice", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_slice"), "sq_slice", "ssizessizeargfunc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_ass_item"), "sq_ass_item", "ssizeobjargproc"); Printv(f, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:was_sq_ass_slice"), "was_sq_ass_slice", "void *"); Printv(f, "#else\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_ass_slice"), "sq_ass_slice", "ssizessizeobjargproc"); Printv(f, "#endif\n", NIL); printSlot(f, getSlot(n, "feature:python:sq_contains"), "sq_contains", "objobjproc"); printSlot(f, getSlot(n, "feature:python:sq_inplace_concat"), "sq_inplace_concat", "binaryfunc"); printSlot(f, getSlot(n, "feature:python:sq_inplace_repeat"), "sq_inplace_repeat", "ssizeargfunc"); Printf(f, " },\n"); // PyBufferProcs as_buffer; Printf(f, " {\n"); Printv(f, "#if PY_VERSION_HEX < 0x03000000\n", NIL); printSlot(f, getSlot(n, "feature:python:bf_getreadbuffer"), "bf_getreadbuffer", "readbufferproc"); printSlot(f, getSlot(n, "feature:python:bf_getwritebuffer"), "bf_getwritebuffer", "writebufferproc"); printSlot(f, getSlot(n, "feature:python:bf_getsegcount"), "bf_getsegcount", "segcountproc"); printSlot(f, getSlot(n, "feature:python:bf_getcharbuffer"), "bf_getcharbuffer", "charbufferproc"); Printv(f, "#endif\n", NIL); Printv(f, "#if PY_VERSION_HEX >= 0x02060000\n", NIL); printSlot(f, getSlot(n, "feature:python:bf_getbuffer"), "bf_getbuffer", "getbufferproc"); printSlot(f, getSlot(n, "feature:python:bf_releasebuffer"), "bf_releasebuffer", "releasebufferproc"); Printv(f, "#endif\n", NIL); Printf(f, " },\n"); // PyObject *ht_name, *ht_slots, *ht_qualname; printSlot(f, getSlot(n, "feature:python:ht_name"), "ht_name", "PyObject *"); printSlot(f, getSlot(n, "feature:python:ht_slots"), "ht_slots", "PyObject *"); Printv(f, "#if PY_VERSION_HEX >= 0x03030000\n", NIL); printSlot(f, getSlot(n, "feature:python:ht_qualname"), "ht_qualname", "PyObject *"); // struct _dictkeysobject *ht_cached_keys; printSlot(f, getSlot(n, "feature:python:ht_cached_keys"), "ht_cached_keys"); Printv(f, "#endif\n", NIL); Printf(f, "};\n\n"); String *clientdata = NewString(""); Printf(clientdata, "&%s_clientdata", templ); SwigType_remember_mangleddata(pmname, clientdata); SwigType *smart = Swig_cparse_smartptr(n); if (smart) { SwigType_add_pointer(smart); String *smart_pmname = SwigType_manglestr(smart); SwigType_remember_mangleddata(smart_pmname, clientdata); Delete(smart_pmname); } String *clientdata_klass = NewString("0"); if (GetFlag(n, "feature:implicitconv")) { Clear(clientdata_klass); Printf(clientdata_klass, "(PyObject *) &%s_type", templ); } Printf(f, "SWIGINTERN SwigPyClientData %s_clientdata = {%s, 0, 0, 0, 0, 0, (PyTypeObject *)&%s_type};\n\n", templ, clientdata_klass, templ); Printv(f_init, " if (PyType_Ready(builtin_pytype) < 0) {\n", NIL); Printf(f_init, " PyErr_SetString(PyExc_TypeError, \"Could not create type '%s'.\");\n", symname); Printv(f_init, "#if PY_VERSION_HEX >= 0x03000000\n", NIL); Printv(f_init, " return NULL;\n", NIL); Printv(f_init, "#else\n", NIL); Printv(f_init, " return;\n", NIL); Printv(f_init, "#endif\n", NIL); Printv(f_init, " }\n", NIL); Printv(f_init, " Py_INCREF(builtin_pytype);\n", NIL); Printf(f_init, " PyModule_AddObject(m, \"%s\", (PyObject *)builtin_pytype);\n", symname); Printf(f_init, " SwigPyBuiltin_AddPublicSymbol(public_interface, \"%s\");\n", symname); Printv(f_init, " d = md;\n", NIL); Delete(clientdata); Delete(smart); Delete(rname); Delete(pname); Delete(mname); Delete(pmname); Delete(templ); Delete(tp_flags); Delete(tp_flags_py3); Delete(tp_as_buffer); Delete(tp_as_mapping); Delete(tp_as_sequence); Delete(tp_as_number); Delete(quoted_symname); Delete(quoted_tp_doc_str); Delete(tp_init); Delete(clientdata_klass); Delete(richcompare_func); Delete(getset_name); Delete(methods_name); } virtual int classHandler(Node *n) { int oldclassic = classic; int oldmodern = modern; File *f_shadow_file = f_shadow; Node *base_node = NULL; if (shadow) { /* Create new strings for building up a wrapper function */ have_constructor = 0; have_repr = 0; if (GetFlag(n, "feature:classic")) { classic = 1; modern = 0; } if (GetFlag(n, "feature:modern")) { classic = 0; modern = 1; } if (GetFlag(n, "feature:exceptionclass")) { classic = 1; modern = 0; } class_name = Getattr(n, "sym:name"); real_classname = Getattr(n, "name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; if (builtin) { List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist) > 0) { Iterator b = First(baselist); base_node = b.item; } } shadow_indent = (String *) tab4; /* Handle inheritance */ String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "python:proxy"); bool ignore = GetFlag(b.item, "feature:ignore") ? true : false; if (!bname || ignore) { if (!bname && !ignore) { Swig_warning(WARN_TYPE_UNDEFINED_CLASS, Getfile(n), Getline(n), "Base class '%s' ignored - unknown module name for base. Either import the appropriate module interface file or specify the name of the module in the %%import directive.\n", SwigType_namestr(Getattr(b.item, "name"))); } b = Next(b); continue; } Printv(base_class, bname, NIL); b = Next(b); if (b.item) { Printv(base_class, ", ", NIL); } } } if (builtin) { Hash *base_richcompare = NULL; Hash *richcompare = NULL; if (base_node) base_richcompare = Getattr(base_node, "python:richcompare"); if (base_richcompare) richcompare = Copy(base_richcompare); else richcompare = NewHash(); Setattr(n, "python:richcompare", richcompare); } /* dealing with abstract base class */ String *abcs = Getattr(n, "feature:python:abc"); if (py3 && abcs) { if (Len(base_class)) { Printv(base_class, ", ", NIL); } Printv(base_class, abcs, NIL); } if (builtin) { if (have_docstring(n)) { String *str = cdocstring(n, AUTODOC_CLASS); Setattr(n, "feature:python:tp_doc", str); Delete(str); } else { String *name = Getattr(n, "name"); String *rname = add_explicit_scope(SwigType_namestr(name)); Setattr(n, "feature:python:tp_doc", rname); Delete(rname); } } else { Printv(f_shadow, "class ", class_name, NIL); if (Len(base_class)) { Printf(f_shadow, "(%s)", base_class); } else { if (!classic) { Printf(f_shadow, modern ? "(object)" : "(_object)"); } if (GetFlag(n, "feature:exceptionclass")) { Printf(f_shadow, "(Exception)"); } } Printf(f_shadow, ":\n"); if (have_docstring(n)) { String *str = docstring(n, AUTODOC_CLASS, tab4); if (str && Len(str)) Printv(f_shadow, tab4, str, "\n\n", NIL); } if (!modern) { Printv(f_shadow, tab4, "__swig_setmethods__ = {}\n", NIL); if (Len(base_class)) { Printv(f_shadow, tab4, "for _s in [", base_class, "]:\n", tab8, "__swig_setmethods__.update(getattr(_s, '__swig_setmethods__', {}))\n", NIL); } if (!GetFlag(n, "feature:python:nondynamic")) { Printv(f_shadow, tab4, "__setattr__ = lambda self, name, value: _swig_setattr(self, ", class_name, ", name, value)\n", NIL); } else { Printv(f_shadow, tab4, "__setattr__ = lambda self, name, value: _swig_setattr_nondynamic(self, ", class_name, ", name, value)\n", NIL); } Printv(f_shadow, tab4, "__swig_getmethods__ = {}\n", NIL); if (Len(base_class)) { Printv(f_shadow, tab4, "for _s in [", base_class, "]:\n", tab8, "__swig_getmethods__.update(getattr(_s, '__swig_getmethods__', {}))\n", NIL); } Printv(f_shadow, tab4, "__getattr__ = lambda self, name: _swig_getattr(self, ", class_name, ", name)\n", NIL); } else { Printv(f_shadow, tab4, "thisown = _swig_property(lambda x: x.this.own(), ", "lambda x, v: x.this.own(v), doc='The membership flag')\n", NIL); /* Add static attribute */ if (GetFlag(n, "feature:python:nondynamic")) { Printv(f_shadow_file, tab4, "__setattr__ = _swig_setattr_nondynamic_method(object.__setattr__)\n", tab4, "class __metaclass__(type):\n", tab4, tab4, "__setattr__ = _swig_setattr_nondynamic_method(type.__setattr__)\n", NIL); } } } } /* Emit all of the members */ in_class = 1; if (builtin) builtin_pre_decl(n); /* Override the shadow file so we can capture its methods */ f_shadow = NewString(""); // Set up type check for director class constructor Clear(none_comparison); if (builtin && Swig_directorclass(n)) { String *p_real_classname = Copy(real_classname); SwigType_add_pointer(p_real_classname); String *mangle = SwigType_manglestr(p_real_classname); String *descriptor = NewStringf("SWIGTYPE%s", mangle); Printv(none_comparison, "self->ob_type != ((SwigPyClientData *)(", descriptor, ")->clientdata)->pytype", NIL); Delete(descriptor); Delete(mangle); Delete(p_real_classname); } else { Printv(none_comparison, "$arg != Py_None", NIL); } Language::classHandler(n); in_class = 0; /* Complete the class */ if (shadow) { /* Generate a class registration function */ // Replace storing a pointer to underlying class with a smart pointer (intended for use with non-intrusive smart pointers) SwigType *smart = Swig_cparse_smartptr(n); SwigType *ct = Copy(smart ? smart : real_classname); SwigType_add_pointer(ct); SwigType *realct = Copy(real_classname); SwigType_add_pointer(realct); SwigType_remember(realct); if (builtin) { Printv(f_wrappers, builtin_closures_code, NIL); Delete(builtin_closures_code); builtin_closures_code = NewString(""); Clear(builtin_closures); } else { Printv(f_wrappers, "SWIGINTERN PyObject *", class_name, "_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", NIL); Printv(f_wrappers, " PyObject *obj;\n", NIL); if (modernargs) { if (fastunpack) { Printv(f_wrappers, " if (!SWIG_Python_UnpackTuple(args,(char *)\"swigregister\", 1, 1,&obj)) return NULL;\n", NIL); } else { Printv(f_wrappers, " if (!PyArg_UnpackTuple(args,(char *)\"swigregister\", 1, 1,&obj)) return NULL;\n", NIL); } } else { Printv(f_wrappers, " if (!PyArg_ParseTuple(args,(char *)\"O:swigregister\", &obj)) return NULL;\n", NIL); } Printv(f_wrappers, " SWIG_TypeNewClientData(SWIGTYPE", SwigType_manglestr(ct), ", SWIG_NewClientData(obj));\n", " return SWIG_Py_Void();\n", "}\n\n", NIL); String *cname = NewStringf("%s_swigregister", class_name); add_method(cname, cname, 0); Delete(cname); } Delete(smart); Delete(ct); Delete(realct); if (!have_constructor) { if (!builtin) Printv(f_shadow_file, "\n", tab4, "def __init__(self, *args, **kwargs):\n", tab8, "raise AttributeError(\"", "No constructor defined", (Getattr(n, "abstracts") ? " - class is abstract" : ""), "\")\n", NIL); } else if (fastinit && !builtin) { Printv(f_wrappers, "SWIGINTERN PyObject *", class_name, "_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {\n", NIL); Printv(f_wrappers, " return SWIG_Python_InitShadowInstance(args);\n", "}\n\n", NIL); String *cname = NewStringf("%s_swiginit", class_name); add_method(cname, cname, 0); Delete(cname); } if (!have_repr && !builtin) { /* Supply a repr method for this class */ String *rname = SwigType_namestr(real_classname); if (new_repr) { Printv(f_shadow_file, tab4, "__repr__ = _swig_repr\n", NIL); } else { Printv(f_shadow_file, tab4, "def __repr__(self):\n", tab8, "return \"\" % (self.this,)\n", NIL); } Delete(rname); } if (builtin) builtin_post_decl(f_builtins, n); if (builtin_tp_init) { Delete(builtin_tp_init); builtin_tp_init = 0; } /* Now emit methods */ if (!builtin) Printv(f_shadow_file, f_shadow, NIL); /* Now the Ptr class */ if (classptr && !builtin) { Printv(f_shadow_file, "\nclass ", class_name, "Ptr(", class_name, "):\n", tab4, "def __init__(self, this):\n", NIL); if (!modern) { Printv(f_shadow_file, tab8, "try:\n", tab8, tab4, "self.this.append(this)\n", tab8, "except __builtin__.Exception:\n", tab8, tab4, "self.this = this\n", tab8, "self.this.own(0)\n", tab8, "self.__class__ = ", class_name, "\n\n", NIL); } else { Printv(f_shadow_file, tab8, "try:\n", tab8, tab4, "self.this.append(this)\n", tab8, "except __builtin__.Exception:\n", tab8, tab4, "self.this = this\n", tab8, "self.this.own(0)\n", tab8, "self.__class__ = ", class_name, "\n\n", NIL); } } if (!builtin) { if (fastproxy) { List *shadow_list = Getattr(n, "shadow_methods"); for (int i = 0; i < Len(shadow_list); ++i) { String *symname = Getitem(shadow_list, i); Printf(f_shadow_file, "%s.%s = new_instancemethod(%s.%s, None, %s)\n", class_name, symname, module, Swig_name_member(NSPACE_TODO, class_name, symname), class_name); } } Printf(f_shadow_file, "%s_swigregister = %s.%s_swigregister\n", class_name, module, class_name); Printf(f_shadow_file, "%s_swigregister(%s)\n", class_name, class_name); } shadow_indent = 0; Printf(f_shadow_file, "%s\n", f_shadow_stubs); Clear(f_shadow_stubs); } if (builtin) { Clear(class_members); Clear(builtin_getset); Clear(builtin_methods); } classic = oldclassic; modern = oldmodern; /* Restore shadow file back to original version */ Delete(f_shadow); f_shadow = f_shadow_file; return SWIG_OK; } /* ------------------------------------------------------------ * functionHandler() - Mainly overloaded for callback handling * ------------------------------------------------------------ */ virtual int functionHandler(Node *n) { String *pcb = GetFlagAttr(n, "feature:python:callback"); if (pcb) { if (Strcmp(pcb, "1") == 0) { SetFlagAttr(n, "feature:callback", "%s_cb_ptr"); } else { SetFlagAttr(n, "feature:callback", pcb); } autodoc_l dlevel = autodoc_level(Getattr(n, "feature:autodoc")); if (dlevel != NO_AUTODOC && dlevel > TYPES_AUTODOC) { Setattr(n, "feature:autodoc", "1"); } } return Language::functionHandler(n); } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow; if (builtin) Swig_save("builtin_memberfunc", n, "python:argcount", NIL); /* Create the default member function */ oldshadow = shadow; /* Disable shadowing when wrapping member functions */ if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::memberfunctionHandler(n); shadow = oldshadow; if (builtin && in_class) { // Can't use checkAttribute(n, "access", "public") because // "access" attr isn't set on %extend methods if (!checkAttribute(n, "access", "private") && strncmp(Char(symname), "operator ", 9) && !Getattr(class_members, symname)) { String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); String *wname = Swig_name_wrapper(fullname); Setattr(class_members, symname, n); int argcount = Getattr(n, "python:argcount") ? atoi(Char(Getattr(n, "python:argcount"))) : 2; String *ds = have_docstring(n) ? cdocstring(n, AUTODOC_FUNC) : NewString(""); if (check_kwargs(n)) { Printf(builtin_methods, " { \"%s\", (PyCFunction) %s, METH_VARARGS|METH_KEYWORDS, (char *) \"%s\" },\n", symname, wname, ds); } else if (argcount == 0) { Printf(builtin_methods, " { \"%s\", (PyCFunction) %s, METH_NOARGS, (char *) \"%s\" },\n", symname, wname, ds); } else if (argcount == 1) { Printf(builtin_methods, " { \"%s\", (PyCFunction) %s, METH_O, (char *) \"%s\" },\n", symname, wname, ds); } else { Printf(builtin_methods, " { \"%s\", (PyCFunction) %s, METH_VARARGS, (char *) \"%s\" },\n", symname, wname, ds); } Delete(fullname); Delete(wname); Delete(ds); } } if (builtin) Swig_restore(n); if (!Getattr(n, "sym:nextSibling")) { if (shadow && !builtin) { int fproxy = fastproxy; String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); if (Strcmp(symname, "__repr__") == 0) { have_repr = 1; } if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, fullname); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); fproxy = 0; } else { int allow_kwargs = (check_kwargs(n) && !Getattr(n, "sym:overloaded")) ? 1 : 0; String *parms = make_pyParmList(n, true, false, allow_kwargs); String *callParms = make_pyParmList(n, true, true, allow_kwargs); if (!have_addtofunc(n)) { if (!fastproxy || olddefs) { Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); Printv(f_shadow, tab8, "return ", funcCall(fullname, callParms), "\n", NIL); } } else { Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_METHOD, tab8), "\n", NIL); if (have_pythonprepend(n)) { fproxy = 0; Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); } if (have_pythonappend(n)) { fproxy = 0; Printv(f_shadow, tab8, "val = ", funcCall(fullname, callParms), "\n", NIL); Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "return val\n\n", NIL); } else { Printv(f_shadow, tab8, "return ", funcCall(fullname, callParms), "\n\n", NIL); } } } if (fproxy) { List *shadow_list = Getattr(getCurrentClass(), "shadow_methods"); if (!shadow_list) { shadow_list = NewList(); Setattr(getCurrentClass(), "shadow_methods", shadow_list); Delete(shadow_list); } Append(shadow_list, symname); } Delete(fullname); } } return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (builtin && in_class) { Swig_save("builtin_memberconstantHandler", n, "pybuiltin:symname", NIL); Setattr(n, "pybuiltin:symname", symname); } Language::staticmemberfunctionHandler(n); if (builtin && in_class) { Swig_restore(n); } if (builtin && in_class) { if ((GetFlagAttr(n, "feature:extend") || checkAttribute(n, "access", "public")) && !Getattr(class_members, symname)) { String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); String *wname = Swig_name_wrapper(fullname); Setattr(class_members, symname, n); int funpack = modernargs && fastunpack && !Getattr(n, "sym:overloaded"); String *pyflags = NewString("METH_STATIC|"); int argcount = Getattr(n, "python:argcount") ? atoi(Char(Getattr(n, "python:argcount"))) : 2; if (funpack && argcount == 0) Append(pyflags, "METH_NOARGS"); else if (funpack && argcount == 1) Append(pyflags, "METH_O"); else Append(pyflags, "METH_VARARGS"); if (have_docstring(n)) { String *ds = cdocstring(n, AUTODOC_STATICFUNC); Printf(builtin_methods, " { \"%s\", (PyCFunction) %s, %s, (char *) \"%s\" },\n", symname, wname, pyflags, ds); Delete(ds); } else { Printf(builtin_methods, " { \"%s\", (PyCFunction) %s, %s, \"\" },\n", symname, wname, pyflags); } Delete(fullname); Delete(wname); Delete(pyflags); } return SWIG_OK; } if (Getattr(n, "sym:nextSibling")) { return SWIG_OK; } if (shadow) { if (!Getattr(n, "feature:python:callback") && have_addtofunc(n)) { int kw = (check_kwargs(n) && !Getattr(n, "sym:overloaded")) ? 1 : 0; String *parms = make_pyParmList(n, false, false, kw); String *callParms = make_pyParmList(n, false, true, kw); Printv(f_shadow, "\n", tab4, "def ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_STATICFUNC, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); if (have_pythonappend(n)) { Printv(f_shadow, tab8, "val = ", funcCall(Swig_name_member(NSPACE_TODO, class_name, symname), callParms), "\n", NIL); Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "return val\n\n", NIL); } else { Printv(f_shadow, tab8, "return ", funcCall(Swig_name_member(NSPACE_TODO, class_name, symname), callParms), "\n\n", NIL); } Printv(f_shadow, tab4, symname, " = staticmethod(", symname, ")\n", NIL); } else { if (!classic) { if (!modern) Printv(f_shadow, tab4, "if _newclass:\n", tab4, NIL); Printv(f_shadow, tab4, symname, " = staticmethod(", module, ".", Swig_name_member(NSPACE_TODO, class_name, symname), ")\n", NIL); } if (classic || !modern) { if (!classic) Printv(f_shadow, tab4, "else:\n", tab4, NIL); Printv(f_shadow, tab4, symname, " = ", module, ".", Swig_name_member(NSPACE_TODO, class_name, symname), "\n", NIL); } } } return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; int use_director = Swig_directorclass(n); /* * If we're wrapping the constructor of a C++ director class, prepend a new parameter * to receive the scripting language object (e.g. 'self') * */ Swig_save("python:constructorHandler", n, "parms", NIL); if (use_director) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("PyObject"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "O"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::constructorHandler(n); shadow = oldshadow; Delattr(n, "wrap:self"); Swig_restore(n); if (!Getattr(n, "sym:nextSibling")) { if (shadow) { int allow_kwargs = (check_kwargs(n) && (!Getattr(n, "sym:overloaded"))) ? 1 : 0; int handled_as_init = 0; if (!have_constructor) { String *nname = Getattr(n, "sym:name"); String *sname = Getattr(getCurrentClass(), "sym:name"); String *cname = Swig_name_construct(NSPACE_TODO, sname); handled_as_init = (Strcmp(nname, sname) == 0) || (Strcmp(nname, cname) == 0); Delete(cname); } if (!have_constructor && handled_as_init) { if (!builtin) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, Swig_name_construct(NSPACE_TODO, symname)); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); } else { String *pass_self = NewString(""); Node *parent = Swig_methodclass(n); String *classname = Swig_class_name(parent); String *rclassname = Swig_class_name(getCurrentClass()); assert(rclassname); String *parms = make_pyParmList(n, true, false, allow_kwargs); /* Pass 'self' only if using director */ String *callParms = make_pyParmList(n, false, true, allow_kwargs); if (use_director) { Insert(callParms, 0, "_self, "); Printv(pass_self, tab8, NIL); Printf(pass_self, "if self.__class__ == %s:\n", classname); //Printv(pass_self, tab8, tab4, "args = (None,) + args\n", tab8, "else:\n", tab8, tab4, "args = (self,) + args\n", NIL); Printv(pass_self, tab8, tab4, "_self = None\n", tab8, "else:\n", tab8, tab4, "_self = self\n", NIL); } Printv(f_shadow, "\n", tab4, "def __init__(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_CTOR, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); Printv(f_shadow, pass_self, NIL); if (fastinit) { Printv(f_shadow, tab8, module, ".", class_name, "_swiginit(self, ", funcCall(Swig_name_construct(NSPACE_TODO, symname), callParms), ")\n", NIL); } else { Printv(f_shadow, tab8, "this = ", funcCall(Swig_name_construct(NSPACE_TODO, symname), callParms), "\n", tab8, "try:\n", tab8, tab4, "self.this.append(this)\n", tab8, "except __builtin__.Exception:\n", tab8, tab4, "self.this = this\n", NIL); } if (have_pythonappend(n)) Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n\n", NIL); Delete(pass_self); } have_constructor = 1; } } else { /* Hmmm. We seem to be creating a different constructor. We're just going to create a function for it. */ if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), "", Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, Swig_name_construct(NSPACE_TODO, symname)); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow_stubs, pycode, "\n", NIL); Delete(pycode); } else { String *parms = make_pyParmList(n, false, false, allow_kwargs); String *callParms = make_pyParmList(n, false, true, allow_kwargs); Printv(f_shadow_stubs, "\ndef ", symname, "(", parms, ")", returnTypeAnnotation(n), ":\n", NIL); if (have_docstring(n)) Printv(f_shadow_stubs, tab4, docstring(n, AUTODOC_CTOR, tab4), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow_stubs, indent_pythoncode(pythonprepend(n), tab4, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); String *subfunc = NULL; /* if (builtin) subfunc = Copy(Getattr(getCurrentClass(), "sym:name")); else */ subfunc = Swig_name_construct(NSPACE_TODO, symname); Printv(f_shadow_stubs, tab4, "val = ", funcCall(subfunc, callParms), "\n", NIL); #ifdef USE_THISOWN Printv(f_shadow_stubs, tab4, "val.thisown = 1\n", NIL); #endif if (have_pythonappend(n)) Printv(f_shadow_stubs, indent_pythoncode(pythonappend(n), tab4, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow_stubs, tab4, "return val\n", NIL); Delete(subfunc); } } } } return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; if (builtin && in_class) { Node *cls = Swig_methodclass(n); // Use the destructor for the tp_dealloc slot unless a user overrides it with another method if (!Getattr(cls, "feature:python:tp_dealloc")) { Setattr(n, "feature:python:slot", "tp_dealloc"); Setattr(n, "feature:python:slot:functype", "destructor"); } } if (shadow) shadow = shadow | PYSHADOW_MEMBER; //Setattr(n,"emit:dealloc","1"); Language::destructorHandler(n); shadow = oldshadow; if (shadow) { if (Getattr(n, "feature:shadow")) { String *pycode = indent_pythoncode(Getattr(n, "feature:shadow"), tab4, Getfile(n), Getline(n), "%feature(\"shadow\")"); String *pyaction = NewStringf("%s.%s", module, Swig_name_destroy(NSPACE_TODO, symname)); Replaceall(pycode, "$action", pyaction); Delete(pyaction); Printv(f_shadow, pycode, "\n", NIL); Delete(pycode); } else { Printv(f_shadow, tab4, "__swig_destroy__ = ", module, ".", Swig_name_destroy(NSPACE_TODO, symname), "\n", NIL); if (!have_pythonprepend(n) && !have_pythonappend(n)) { if (proxydel) { Printv(f_shadow, tab4, "__del__ = lambda self: None\n", NIL); } return SWIG_OK; } Printv(f_shadow, tab4, "def __del__(self):\n", NIL); if (have_docstring(n)) Printv(f_shadow, tab8, docstring(n, AUTODOC_DTOR, tab8), "\n", NIL); if (have_pythonprepend(n)) Printv(f_shadow, indent_pythoncode(pythonprepend(n), tab8, Getfile(n), Getline(n), "%pythonprepend or %feature(\"pythonprepend\")"), "\n", NIL); #ifdef USE_THISOWN Printv(f_shadow, tab8, "try:\n", NIL); Printv(f_shadow, tab8, tab4, "if self.thisown:", module, ".", Swig_name_destroy(NSPACE_TODO, symname), "(self)\n", NIL); Printv(f_shadow, tab8, "except __builtin__.Exception: pass\n", NIL); #else #endif if (have_pythonappend(n)) Printv(f_shadow, indent_pythoncode(pythonappend(n), tab8, Getfile(n), Getline(n), "%pythonappend or %feature(\"pythonappend\")"), "\n", NIL); Printv(f_shadow, tab8, "pass\n", NIL); Printv(f_shadow, "\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldshadow = shadow; if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::membervariableHandler(n); shadow = oldshadow; if (shadow && !builtin) { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); String *setname = Swig_name_set(NSPACE_TODO, mname); String *getname = Swig_name_get(NSPACE_TODO, mname); int assignable = is_assignable(n); if (!modern) { if (assignable) { Printv(f_shadow, tab4, "__swig_setmethods__[\"", symname, "\"] = ", module, ".", setname, "\n", NIL); } Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = ", module, ".", getname, "\n", NIL); } if (!classic) { if (!modern) Printv(f_shadow, tab4, "if _newclass:\n", tab4, NIL); Printv(f_shadow, tab4, symname, " = _swig_property(", module, ".", getname, NIL); if (assignable) Printv(f_shadow, ", ", module, ".", setname, NIL); Printv(f_shadow, ")\n", NIL); } Delete(mname); Delete(setname); Delete(getname); } return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { Swig_save("builtin_staticmembervariableHandler", n, "builtin_symname", NIL); Language::staticmembervariableHandler(n); Swig_restore(n); if (GetFlag(n, "wrappedasconstant")) return SWIG_OK; String *symname = Getattr(n, "sym:name"); if (shadow) { if (!builtin && GetFlag(n, "hasconsttype")) { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); Printf(f_shadow_stubs, "%s.%s = %s.%s.%s\n", class_name, symname, module, global_name, mname); Delete(mname); } else { String *mname = Swig_name_member(NSPACE_TODO, class_name, symname); String *getname = Swig_name_get(NSPACE_TODO, mname); String *wrapgetname = Swig_name_wrapper(getname); String *vargetname = NewStringf("Swig_var_%s", getname); String *setname = Swig_name_set(NSPACE_TODO, mname); String *wrapsetname = Swig_name_wrapper(setname); String *varsetname = NewStringf("Swig_var_%s", setname); Wrapper *f = NewWrapper(); Printv(f->def, "SWIGINTERN PyObject *", wrapgetname, "(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(args)) {", NIL); Printv(f->code, " return ", vargetname, "();\n", NIL); Append(f->code, "}\n"); add_method(getname, wrapgetname, 0); Wrapper_print(f, f_wrappers); DelWrapper(f); int assignable = is_assignable(n); if (assignable) { int funpack = modernargs && fastunpack; Wrapper *f = NewWrapper(); Printv(f->def, "SWIGINTERN PyObject *", wrapsetname, "(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {", NIL); Wrapper_add_local(f, "res", "int res"); if (!funpack) { Wrapper_add_local(f, "value", "PyObject *value"); Append(f->code, "if (!PyArg_ParseTuple(args,(char *)\"O:set\",&value)) return NULL;\n"); } Printf(f->code, "res = %s(%s);\n", varsetname, funpack ? "args" : "value"); Append(f->code, "return !res ? SWIG_Py_Void() : NULL;\n"); Append(f->code, "}\n"); Wrapper_print(f, f_wrappers); add_method(setname, wrapsetname, 0, 0, funpack, 1, 1); DelWrapper(f); } if (!modern && !builtin) { if (assignable) { Printv(f_shadow, tab4, "__swig_setmethods__[\"", symname, "\"] = ", module, ".", setname, "\n", NIL); } Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = ", module, ".", getname, "\n", NIL); } if (!classic && !builtin) { if (!modern) Printv(f_shadow, tab4, "if _newclass:\n", tab4, NIL); Printv(f_shadow, tab4, symname, " = _swig_property(", module, ".", getname, NIL); if (assignable) Printv(f_shadow, ", ", module, ".", setname, NIL); Printv(f_shadow, ")\n", NIL); } String *getter = Getattr(n, "pybuiltin:getter"); String *setter = Getattr(n, "pybuiltin:setter"); Hash *h = NULL; if (getter || setter) { h = Getattr(builtin_getset, symname); if (!h) { h = NewHash(); Setattr(h, "static", "1"); Setattr(builtin_getset, symname, h); } } if (getter) Setattr(h, "getter", getter); if (setter) Setattr(h, "setter", setter); if (h) Delete(h); Delete(mname); Delete(getname); Delete(wrapgetname); Delete(vargetname); Delete(setname); Delete(wrapsetname); Delete(varsetname); } } return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { String *symname = Getattr(n, "sym:name"); if (builtin && in_class) { Swig_save("builtin_memberconstantHandler", n, "pybuiltin:symname", NIL); Setattr(n, "pybuiltin:symname", symname); } int oldshadow = shadow; if (shadow) shadow = shadow | PYSHADOW_MEMBER; Language::memberconstantHandler(n); shadow = oldshadow; if (builtin && in_class) { Swig_restore(n); } else if (shadow) { Printv(f_shadow, tab4, symname, " = ", module, ".", Swig_name_member(NSPACE_TODO, class_name, symname), "\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * insertDirective() * * Hook for %insert directive. We're going to look for special %shadow inserts * as a special case so we can do indenting correctly * ------------------------------------------------------------ */ virtual int insertDirective(Node *n) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); if (!ImportMode && (Cmp(section, "python") == 0 || Cmp(section, "shadow") == 0)) { if (shadow) { String *pycode = indent_pythoncode(code, shadow_indent, Getfile(n), Getline(n), "%pythoncode or %insert(\"python\") block"); Printv(f_shadow, pycode, NIL); Delete(pycode); } } else if (!ImportMode && (Cmp(section, "pythonbegin") == 0)) { String *pycode = indent_pythoncode(code, "", Getfile(n), Getline(n), "%pythonbegin or %insert(\"pythonbegin\") block"); Printv(f_shadow_begin, pycode, NIL); Delete(pycode); } else { Language::insertDirective(n); } return SWIG_OK; } virtual String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("pyhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'pyhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("pyerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'pyerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *sthread = Swig_include_sys("pythreads.swg"); if (!sthread) { Printf(stderr, "*** Unable to open 'pythreads.swg'\n"); } else { Append(s, sthread); Delete(sthread); } String *sapi = Swig_include_sys("pyapi.swg"); if (!sapi) { Printf(stderr, "*** Unable to open 'pyapi.swg'\n"); } else { Append(s, sapi); Delete(sapi); } String *srun = Swig_include_sys("pyrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'pyrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } virtual String *defaultExternalRuntimeFilename() { return NewString("swigpyrun.h"); } /*---------------------------------------------------------------------- * kwargsSupport() *--------------------------------------------------------------------*/ bool kwargsSupport() const { return true; } }; /* --------------------------------------------------------------- * classDirectorMethod() * * Emit a virtual director method to pass a method call on to the * underlying Python object. * * ** Moved it here due to internal error on gcc-2.96 ** * --------------------------------------------------------------- */ int PYTHON::classDirectorMethods(Node *n) { director_method_index = 0; return Language::classDirectorMethods(n); } int PYTHON::classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (builtin) { // Rename any wrapped parameters called 'self' as the generated code contains a variable with same name Parm *p; for (p = l; p; p = nextSibling(p)) { String *arg = Getattr(p, "name"); if (arg && Cmp(arg, "self") == 0) Delattr(p, "name"); } } if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (builtin) { Printv(w->code, "PyObject *self = NULL;\n", NIL); Printv(w->code, "(void)self;\n", NIL); } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Python) */ String *arglist = NewString(""); String *parse_args = NewString(""); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; int use_parse = 0; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* old style? caused segfaults without the p!=0 check in the for() condition, and seems dangerous in the while loop as well. while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } */ if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); Putc(',', arglist); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); /* Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); */ Printv(wrap_args, "swig::SwigVar_PyObject ", source, ";\n", NIL); Printv(wrap_args, tm, "\n", NIL); Printv(arglist, "(PyObject *)", source, NIL); Putc('O', parse_args); } else { use_parse = 1; Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); Append(arglist, tm); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Python doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_DIRECTOR_CAST(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_InternalNewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Append(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "Py_INCREF((PyObject *)%s);\n", source); Append(wrap_args, "}\n"); Delete(director); Printv(arglist, source, NIL); } else { Wrapper_add_localv(w, source, "swig::SwigVar_PyObject", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_InternalNewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); //Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE_p_%s, 0);\n", // source, nonconst, base); Printv(arglist, source, NIL); } Putc('O', parse_args); Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* add the method name as a PyString */ String *pyname = Getattr(n, "sym:name"); int allow_thread = threads_enable(n); if (allow_thread) { thread_begin_block(n, w->code); Append(w->code, "{\n"); } /* wrap complex arguments to PyObjects */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Python object */ if (dirprot_mode() && !is_public(n)) { Printf(w->code, "swig_set_inner(\"%s\", true);\n", name); } Append(w->code, "if (!swig_get_self()) {\n"); Printf(w->code, " Swig::DirectorException::raise(\"'self' uninitialized, maybe you forgot to call %s.__init__.\");\n", classname); Append(w->code, "}\n"); Append(w->code, "#if defined(SWIG_PYTHON_DIRECTOR_VTABLE)\n"); Printf(w->code, "const size_t swig_method_index = %d;\n", director_method_index++); Printf(w->code, "const char *const swig_method_name = \"%s\";\n", pyname); Append(w->code, "PyObject *method = swig_get_method(swig_method_index, swig_method_name);\n"); if (Len(parse_args) > 0) { if (use_parse || !modernargs) { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallFunction(method, (char *)\"(%s)\" %s);\n", Swig_cresult_name(), parse_args, arglist); } else { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallFunctionObjArgs(method %s, NULL);\n", Swig_cresult_name(), arglist); } } else { if (modernargs) { Append(w->code, "swig::SwigVar_PyObject args = PyTuple_New(0);\n"); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_Call(method, (PyObject *) args, NULL);\n", Swig_cresult_name()); } else { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallFunction(method, NULL, NULL);\n", Swig_cresult_name()); } } Append(w->code, "#else\n"); if (Len(parse_args) > 0) { if (use_parse || !modernargs) { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethod(swig_get_self(), (char *)\"%s\", (char *)\"(%s)\" %s);\n", Swig_cresult_name(), pyname, parse_args, arglist); } else { Printf(w->code, "swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar((char *)\"%s\");\n", pyname); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name %s, NULL);\n", Swig_cresult_name(), arglist); } } else { if (!modernargs) { Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethod(swig_get_self(), (char *) \"%s\", NULL);\n", Swig_cresult_name(), pyname); } else { Printf(w->code, "swig::SwigVar_PyObject swig_method_name = SWIG_Python_str_FromChar((char *)\"%s\");\n", pyname); Printf(w->code, "swig::SwigVar_PyObject %s = PyObject_CallMethodObjArgs(swig_get_self(), (PyObject *) swig_method_name, NULL);\n", Swig_cresult_name()); } } Append(w->code, "#endif\n"); if (dirprot_mode() && !is_public(n)) Printf(w->code, "swig_set_inner(\"%s\", false);\n", name); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } Printf(w->code, "if (!%s) {\n", Swig_cresult_name()); Append(w->code, " PyObject *error = PyErr_Occurred();\n"); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Replaceall(tm, "$error", "error"); Printv(w->code, Str(tm), "\n", NIL); } else { Append(w->code, " if (error) {\n"); Printf(w->code, " Swig::DirectorMethodException::raise(\"Error detected when calling '%s.%s'\");\n", classname, pyname); Append(w->code, " }\n"); } Append(w->code, "}\n"); Delete(tm); /* * Python method may return a simple object, or a tuple. * for in/out aruments, we have to extract the appropriate PyObjects from the tuple, * then marshal everything back to C/C++ (return value and output arguments). * */ /* marshal return value and other outputs (if any) from PyObject to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "PyObject *output"); Printf(w->code, "if (!PyTuple_Check(%s)) {\n", Swig_cresult_name()); Printf(w->code, " Swig::DirectorTypeMismatchException::raise(\"Python method %s.%sfailed to return a tuple.\");\n", classname, pyname); Append(w->code, "}\n"); } idx = 0; /* marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1) { Printf(w->code, "output = PyTuple_GetItem(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (Getattr(n, "tmap:directorout:implicitconv")) { Replaceall(tm, "$implicitconv", get_implicitconv_flag(n)); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = PyTuple_GetItem(%s, %d);\n", Swig_cresult_name(), idx++); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } /* any existing helper functions to handle this? */ if (allow_thread) { Append(w->code, "}\n"); thread_end_block(n, w->code); } Delete(parse_args); Delete(arglist); Delete(cleanup); Delete(outarg); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } /* ----------------------------------------------------------------------------- * swig_python() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_python() { return new PYTHON(); } extern "C" Language *swig_python(void) { return new_swig_python(); } swig-3.0.12/Source/Modules/chicken.cxx0000664000175000017500000013351513042756442017445 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * chicken.cxx * * CHICKEN language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include static const char *usage = "\ \ CHICKEN Options (available with -chicken)\n\ -closprefix - Prepend to all clos identifiers\n\ -noclosuses - Do not (declare (uses ...)) in scheme file\n\ -nocollection - Do not register pointers with chicken garbage\n\ collector and export destructors\n\ -nounit - Do not (declare (unit ...)) in scheme file\n\ -proxy - Export TinyCLOS class definitions\n\ -unhideprimitive - Unhide the primitive: symbols\n\ -useclassprefix - Prepend the class name to all clos identifiers\n\ \n"; static char *module = 0; static const char *chicken_path = "chicken"; static int num_methods = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static String *chickentext = 0; static String *closprefix = 0; static String *swigtype_ptr = 0; static String *f_sym_size = 0; /* some options */ static int declare_unit = 1; static int no_collection = 0; static int clos_uses = 1; /* C++ Support + Clos Classes */ static int clos = 0; static String *c_class_name = 0; static String *class_name = 0; static String *short_class_name = 0; static int in_class = 0; static int have_constructor = 0; static bool exporting_destructor = false; static bool exporting_constructor = false; static String *constructor_name = 0; static String *member_name = 0; /* sections of the .scm code */ static String *scm_const_defs = 0; static String *clos_class_defines = 0; static String *clos_methods = 0; /* Some clos options */ static int useclassprefix = 0; static String *clossymnameprefix = 0; static int hide_primitive = 1; static Hash *primitive_names = 0; /* Used for overloading constructors */ static int has_constructor_args = 0; static List *constructor_arg_types = 0; static String *constructor_dispatch = 0; static Hash *overload_parameter_lists = 0; class CHICKEN:public Language { public: virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); virtual int classHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int validIdentifier(String *s); virtual int staticmembervariableHandler(Node *n); virtual int staticmemberfunctionHandler(Node *n); virtual int importDirective(Node *n); protected: void addMethod(String *scheme_name, String *function); /* Return true iff T is a pointer type */ int isPointer(SwigType *t); void dispatchFunction(Node *n); String *chickenNameMapping(String *, const_String_or_char_ptr ); String *chickenPrimitiveName(String *); String *runtimeCode(); String *defaultExternalRuntimeFilename(); String *buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname); }; /* ----------------------------------------------------------------------- * swig_chicken() - Instantiate module * ----------------------------------------------------------------------- */ static Language *new_swig_chicken() { return new CHICKEN(); } extern "C" { Language *swig_chicken(void) { return new_swig_chicken(); } } void CHICKEN::main(int argc, char *argv[]) { int i; SWIG_library_directory(chicken_path); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(0); } else if (strcmp(argv[i], "-proxy") == 0) { clos = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-closprefix") == 0) { if (argv[i + 1]) { clossymnameprefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-useclassprefix") == 0) { useclassprefix = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-unhideprimitive") == 0) { hide_primitive = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nounit") == 0) { declare_unit = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noclosuses") == 0) { clos_uses = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocollection") == 0) { no_collection = 1; Swig_mark_arg(i); } } } if (!clos) hide_primitive = 0; // Add a symbol for this module Preprocessor_define("SWIGCHICKEN 1", 0); // Set name of typemaps SWIG_typemap_lang("chicken"); // Read in default typemaps */ SWIG_config_file("chicken.swg"); allow_overloading(); } int CHICKEN::top(Node *n) { String *chicken_filename = NewString(""); File *f_scm; String *scmmodule; /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); chickentext = NewString(""); closprefix = NewString(""); f_sym_size = NewString(""); primitive_names = NewHash(); overload_parameter_lists = NewHash(); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("chicken", chickentext); Swig_register_filebyname("closprefix", closprefix); clos_class_defines = NewString(""); clos_methods = NewString(""); scm_const_defs = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCHICKEN\n#define SWIGCHICKEN\n#endif\n\n"); if (no_collection) Printf(f_runtime, "#define SWIG_CHICKEN_NO_COLLECTION 1\n"); Printf(f_runtime, "\n"); /* Set module name */ module = Swig_copy_string(Char(Getattr(n, "name"))); scmmodule = NewString(module); Replaceall(scmmodule, "_", "-"); Printf(f_header, "#define SWIG_init swig_%s_init\n", module); Printf(f_header, "#define SWIG_name \"%s\"\n", scmmodule); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); Language::top(n); SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); Printf(f_init, "C_kontinue (continuation, ret);\n"); Printf(f_init, "}\n\n"); Printf(f_init, "#ifdef __cplusplus\n"); Printf(f_init, "}\n"); Printf(f_init, "#endif\n"); Printf(chicken_filename, "%s%s.scm", SWIG_output_directory(), module); if ((f_scm = NewFile(chicken_filename, "w", SWIG_output_files())) == 0) { FileErrorDisplay(chicken_filename); SWIG_exit(EXIT_FAILURE); } Swig_banner_target_lang(f_scm, ";;"); Printf(f_scm, "\n"); if (declare_unit) Printv(f_scm, "(declare (unit ", scmmodule, "))\n\n", NIL); Printv(f_scm, "(declare \n", tab4, "(hide swig-init swig-init-return)\n", tab4, "(foreign-declare \"C_extern void swig_", module, "_init(C_word,C_word,C_word) C_noret;\"))\n", NIL); Printv(f_scm, "(define swig-init (##core#primitive \"swig_", module, "_init\"))\n", NIL); Printv(f_scm, "(define swig-init-return (swig-init))\n\n", NIL); if (clos) { //Printf (f_scm, "(declare (uses tinyclos))\n"); //New chicken versions have tinyclos as an egg Printf(f_scm, "(require-extension tinyclos)\n"); Replaceall(closprefix, "$module", scmmodule); Printf(f_scm, "%s\n", closprefix); Printf(f_scm, "%s\n", clos_class_defines); Printf(f_scm, "%s\n", clos_methods); } else { Printf(f_scm, "%s\n", scm_const_defs); } Printf(f_scm, "%s\n", chickentext); Delete(f_scm); char buftmp[20]; sprintf(buftmp, "%d", num_methods); Replaceall(f_init, "$nummethods", buftmp); Replaceall(f_init, "$symsize", f_sym_size); if (hide_primitive) Replaceall(f_init, "$veclength", buftmp); else Replaceall(f_init, "$veclength", "0"); Delete(chicken_filename); Delete(chickentext); Delete(closprefix); Delete(overload_parameter_lists); Delete(clos_class_defines); Delete(clos_methods); Delete(scm_const_defs); /* Close all of the files */ Delete(primitive_names); Delete(scmmodule); Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_sym_size); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } int CHICKEN::functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; int i; String *wname; Wrapper *f; String *mangle = NewString(""); String *get_pointers; String *cleanup; String *argout; String *tm; String *overname = 0; String *declfunc = 0; String *scmname; bool any_specialized_arg = false; List *function_arg_types = NewList(); int num_required; int num_arguments; int have_argout; Printf(mangle, "\"%s\"", SwigType_manglestr(d)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); wname = NewString(""); get_pointers = NewString(""); cleanup = NewString(""); argout = NewString(""); declfunc = NewString(""); scmname = NewString(iname); Replaceall(scmname, "_", "-"); /* Local vars */ Wrapper_add_local(f, "resultobj", "C_word resultobj"); /* Write code to extract function parameters. */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ num_arguments = emit_num_arguments(l); num_required = emit_num_required(l); Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); Printv(f->def, "static ", "void ", wname, " (C_word argc, C_word closure, C_word continuation", NIL); Printv(declfunc, "void ", wname, "(C_word,C_word,C_word", NIL); /* Generate code for argument marshalling */ for (i = 0, p = l; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); Printf(f->def, ", C_word scm%d", i + 1); Printf(declfunc, ",C_word"); /* Look for an input typemap */ if ((tm = Getattr(p, "tmap:in"))) { String *parse = Getattr(p, "tmap:in:parse"); if (!parse) { String *source = NewStringf("scm%d", i + 1); Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save the location of the object */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } if (i >= num_required) Printf(get_pointers, "if (argc-2>%i && (%s)) {\n", i, source); Printv(get_pointers, tm, "\n", NIL); if (i >= num_required) Printv(get_pointers, "}\n", NIL); if (clos) { if (i < num_required) { if (strcmp("void", Char(pt)) != 0) { Node *class_node = 0; String *clos_code = Getattr(p, "tmap:in:closcode"); class_node = classLookup(pt); if (clos_code && class_node) { String *class_name = NewStringf("<%s>", Getattr(class_node, "sym:name")); Replaceall(class_name, "_", "-"); Append(function_arg_types, class_name); Append(function_arg_types, Copy(clos_code)); any_specialized_arg = true; Delete(class_name); } else { Append(function_arg_types, ""); Append(function_arg_types, "$input"); } } } } Delete(source); } p = Getattr(p, "tmap:in:next"); continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); break; } } /* finish argument marshalling */ Printf(f->def, ") {"); Printf(declfunc, ")"); if (num_required != num_arguments) { Append(function_arg_types, "^^##optional$$"); } /* First check the number of arguments is correct */ if (num_arguments != num_required) Printf(f->code, "if (argc-2<%i || argc-2>%i) C_bad_argc(argc,%i);\n", num_required, num_arguments, num_required + 2); else Printf(f->code, "if (argc!=%i) C_bad_argc(argc,%i);\n", num_arguments + 2, num_arguments + 2); /* Now piece together the first part of the wrapper function */ Printv(f->code, get_pointers, NIL); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ have_argout = 0; for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { if (!have_argout) { have_argout = 1; // Print initial argument output code Printf(argout, "SWIG_Chicken_SetupArgout\n"); } Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printf(argout, "%s", tm); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } Setattr(n, "wrap:name", wname); /* Emit the function call */ String *actioncode = emit_action(n); /* Return the function value */ if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s", tm); if (have_argout) Printf(f->code, "\nSWIG_APPEND_VALUE(resultobj);\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* Insert the argumetn output code */ Printv(f->code, argout, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } if (have_argout) { Printf(f->code, "C_kontinue(continuation,C_SCHEME_END_OF_LIST);\n"); } else { if (exporting_constructor && clos && hide_primitive) { /* Don't return a proxy, the wrapped CLOS class is the proxy */ Printf(f->code, "C_kontinue(continuation,resultobj);\n"); } else { // make the continuation the proxy creation function, if one exists Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); } } /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Printf(f->code, "swig_panic (\"failure in " "'$symname' SWIG function wrapper\");\n"); #endif Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); Replaceall(f->code, "$result", "resultobj"); /* Dump the function out */ Printv(f_wrappers, "static ", declfunc, " C_noret;\n", NIL); Wrapper_print(f, f_wrappers); /* Now register the function with the interpreter. */ if (!Getattr(n, "sym:overloaded")) { if (exporting_destructor && !no_collection) { Printf(f_init, "((swig_chicken_clientdata *)(SWIGTYPE%s->clientdata))->destroy = (swig_chicken_destructor) %s;\n", swigtype_ptr, wname); } else { addMethod(scmname, wname); } /* Only export if we are not in a class, or if in a class memberfunction */ if (!in_class || member_name) { String *method_def; String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); if (!any_specialized_arg) { method_def = NewString(""); Printv(method_def, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")", NIL); } else { method_def = buildClosFunctionCall(function_arg_types, clos_name, chickenPrimitiveName(scmname)); } Printv(clos_methods, method_def, "\n", NIL); Delete(clos_name); Delete(method_def); } if (have_constructor && !has_constructor_args && any_specialized_arg) { has_constructor_args = 1; constructor_arg_types = Copy(function_arg_types); } } else { /* add function_arg_types to overload hash */ List *flist = Getattr(overload_parameter_lists, scmname); if (!flist) { flist = NewList(); Setattr(overload_parameter_lists, scmname, flist); } Append(flist, Copy(function_arg_types)); if (!Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } } Delete(wname); Delete(get_pointers); Delete(cleanup); Delete(declfunc); Delete(mangle); Delete(function_arg_types); DelWrapper(f); return SWIG_OK; } int CHICKEN::variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *wname = NewString(""); String *mangle = NewString(""); String *tm; String *tm2 = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; String *overname = 0; String *scmname; scmname = NewString(iname); Replaceall(scmname, "_", "-"); Printf(mangle, "\"%s\"", SwigType_manglestr(t)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // evaluation function names Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static " "void ", wname, "(C_word argc, C_word closure, " "C_word continuation, C_word value) {\n", NIL); Wrapper_add_local(f, "resultobj", "C_word resultobj"); Printf(f->code, "if (argc!=2 && argc!=3) C_bad_argc(argc,2);\n"); /* Check for a setting of the variable value */ if (!GetFlag(n, "feature:immutable")) { Printf(f->code, "if (argc > 2) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "value"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "value"); /* Printv(f->code, tm, "\n",NIL); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); } Printf(f->code, "}\n"); } String *varname; if (SwigType_istemplate((char *) name)) { varname = SwigType_namestr((char *) name); } else { varname = name; } // Now return the value of the variable - regardless // of evaluating or setting. if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", varname); Replaceall(tm, "$varname", varname); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); /* Printf(f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); #endif Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); /* Now register the variable with the interpreter. */ addMethod(scmname, wname); if (!in_class || member_name) { String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); Node *class_node = classLookup(t); String *clos_code = Getattr(n, "tmap:varin:closcode"); if (class_node && clos_code && !GetFlag(n, "feature:immutable")) { Replaceall(clos_code, "$input", "(car lst)"); Printv(clos_methods, "(define (", clos_name, " . lst) (if (null? lst) (", chickenPrimitiveName(scmname), ") (", chickenPrimitiveName(scmname), " ", clos_code, ")))\n", NIL); } else { /* Simply re-export the procedure */ if (GetFlag(n, "feature:immutable") && GetFlag(n, "feature:constasvar")) { Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); } else { Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); } } Delete(clos_name); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(wname); Delete(argnum); Delete(arg); Delete(tm2); Delete(mangle); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ int CHICKEN::constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *value = Getattr(n, "value"); String *proc_name = NewString(""); String *wname = NewString(""); String *mangle = NewString(""); String *tm; String *tm2 = NewString(""); String *source = NewString(""); String *argnum = NewString("0"); String *arg = NewString("argv[0]"); Wrapper *f; String *overname = 0; String *scmname; String *rvalue; SwigType *nctype; scmname = NewString(iname); Replaceall(scmname, "_", "-"); Printf(source, "swig_const_%s", iname); Replaceall(source, "::", "__"); Printf(mangle, "\"%s\"", SwigType_manglestr(t)); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } Append(wname, Swig_name_wrapper(iname)); if (overname) { Append(wname, overname); } nctype = NewString(t); if (SwigType_isconst(nctype)) { Delete(SwigType_pop(nctype)); } bool is_enum_item = (Cmp(nodeType(n), "enumitem") == 0); if (SwigType_type(nctype) == T_STRING) { rvalue = NewStringf("\"%s\"", value); } else if (SwigType_type(nctype) == T_CHAR && !is_enum_item) { rvalue = NewStringf("\'%s\'", value); } else { rvalue = NewString(value); } /* Special hook for member pointer */ if (SwigType_type(t) == T_MPOINTER) { Printf(f_header, "static %s = %s;\n", SwigType_str(t, source), rvalue); } else { if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", rvalue); Replaceall(tm, "$target", source); Replaceall(tm, "$result", source); Replaceall(tm, "$value", rvalue); Printf(f_header, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } } f = NewWrapper(); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // evaluation function names // Check for interrupts Printv(f->code, "C_trace(\"", scmname, "\");\n", NIL); if (1 || (SwigType_type(t) != T_USER) || (isPointer(t))) { Setattr(n, "wrap:name", wname); Printv(f->def, "static ", "void ", wname, "(C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static ", "void ", wname, "(C_word argc, C_word closure, " "C_word continuation) {\n", NIL); Wrapper_add_local(f, "resultobj", "C_word resultobj"); Printf(f->code, "if (argc!=2) C_bad_argc(argc,2);\n"); // Return the value of the variable if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", source); Replaceall(tm, "$varname", source); Replaceall(tm, "$target", "resultobj"); Replaceall(tm, "$result", "resultobj"); /* Printf(f->code, "%s\n", tm); */ emit_action_code(n, f->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); } Printv(f->code, "{\n", "C_word func;\n", "SWIG_Chicken_FindCreateProxy(func, resultobj)\n", "if (C_swig_is_closurep(func))\n", " ((C_proc4)(void *)C_block_item(func, 0))(4,func,continuation,resultobj,C_SCHEME_FALSE);\n", "else\n", " C_kontinue(continuation, resultobj);\n", "}\n", NIL); /* Error handling code */ #ifdef USE_FAIL Printf(f->code, "fail:\n"); Printf(f->code, "swig_panic (\"failure in " "'%s' SWIG wrapper\");\n", proc_name); #endif Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); /* Now register the variable with the interpreter. */ addMethod(scmname, wname); if (!in_class || member_name) { String *clos_name; if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); if (GetFlag(n, "feature:constasvar")) { Printv(clos_methods, "(define ", clos_name, " (", chickenPrimitiveName(scmname), "))\n", NIL); Printv(scm_const_defs, "(set! ", scmname, " (", scmname, "))\n", NIL); } else { Printv(clos_methods, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); } Delete(clos_name); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(wname); Delete(nctype); Delete(proc_name); Delete(argnum); Delete(arg); Delete(tm2); Delete(mangle); Delete(source); Delete(rvalue); DelWrapper(f); return SWIG_OK; } int CHICKEN::classHandler(Node *n) { /* Create new strings for building up a wrapper function */ have_constructor = 0; constructor_dispatch = 0; constructor_name = 0; c_class_name = NewString(Getattr(n, "sym:name")); class_name = NewString(""); short_class_name = NewString(""); Printv(class_name, "<", c_class_name, ">", NIL); Printv(short_class_name, c_class_name, NIL); Replaceall(class_name, "_", "-"); Replaceall(short_class_name, "_", "-"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Handle inheritance */ String *base_class = NewString(""); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator base = First(baselist); while (base.item) { if (!Getattr(base.item, "feature:ignore")) Printv(base_class, "<", Getattr(base.item, "sym:name"), "> ", NIL); base = Next(base); } } Replaceall(base_class, "_", "-"); String *scmmod = NewString(module); Replaceall(scmmod, "_", "-"); Printv(clos_class_defines, "(define ", class_name, "\n", " (make 'name \"", short_class_name, "\"\n", NIL); Delete(scmmod); if (Len(base_class)) { Printv(clos_class_defines, " 'direct-supers (list ", base_class, ")\n", NIL); } else { Printv(clos_class_defines, " 'direct-supers (list )\n", NIL); } Printf(clos_class_defines, " 'direct-slots (list 'swig-this\n"); String *mangled_classname = Swig_name_mangle(Getattr(n, "sym:name")); SwigType *ct = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(ct); Printf(f_runtime, "static swig_chicken_clientdata _swig_chicken_clientdata%s = { 0 };\n", mangled_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", swigtype_ptr, ", (void *) &_swig_chicken_clientdata", mangled_classname, ");\n", NIL); SwigType_remember(ct); /* Emit all of the members */ in_class = 1; Language::classHandler(n); in_class = 0; Printf(clos_class_defines, ")))\n\n"); if (have_constructor) { Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs ", NIL); if (constructor_arg_types) { String *initfunc_name = NewStringf("%s@@SWIG@initmethod", class_name); String *func_call = buildClosFunctionCall(constructor_arg_types, initfunc_name, chickenPrimitiveName(constructor_name)); Printf(clos_methods, "%s)\n)\n", initfunc_name); Printf(clos_methods, "(declare (hide %s))\n", initfunc_name); Printf(clos_methods, "%s\n", func_call); Delete(func_call); Delete(initfunc_name); Delete(constructor_arg_types); constructor_arg_types = 0; } else if (constructor_dispatch) { Printf(clos_methods, "%s)\n)\n", constructor_dispatch); Delete(constructor_dispatch); constructor_dispatch = 0; } else { Printf(clos_methods, "%s)\n)\n", chickenPrimitiveName(constructor_name)); } Delete(constructor_name); constructor_name = 0; } else { Printv(clos_methods, "(define-method (initialize (obj ", class_name, ") initargs)\n", " (swig-initialize obj initargs (lambda x #f)))\n", NIL); } /* export class initialization function */ if (clos) { String *funcname = NewString(mangled_classname); Printf(funcname, "_swig_chicken_setclosclass"); String *closfuncname = NewString(funcname); Replaceall(closfuncname, "_", "-"); Printv(f_wrappers, "static void ", funcname, "(C_word,C_word,C_word,C_word) C_noret;\n", "static void ", funcname, "(C_word argc, C_word closure, C_word continuation, C_word cl) {\n", " C_trace(\"", funcname, "\");\n", " if (argc!=3) C_bad_argc(argc,3);\n", " swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) SWIGTYPE", swigtype_ptr, "->clientdata;\n", " cdata->gc_proxy_create = CHICKEN_new_gc_root();\n", " CHICKEN_gc_root_set(cdata->gc_proxy_create, cl);\n", " C_kontinue(continuation, C_SCHEME_UNDEFINED);\n", "}\n", NIL); addMethod(closfuncname, funcname); Printv(clos_methods, "(", chickenPrimitiveName(closfuncname), " (lambda (x lst) (if lst ", "(cons (make ", class_name, " 'swig-this x) lst) ", "(make ", class_name, " 'swig-this x))))\n\n", NIL); Delete(closfuncname); Delete(funcname); } Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(class_name); Delete(short_class_name); Delete(c_class_name); class_name = 0; short_class_name = 0; c_class_name = 0; return SWIG_OK; } int CHICKEN::memberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = chickenNameMapping(proc, short_class_name); Language::memberfunctionHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::staticmemberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = NewStringf("%s-%s", short_class_name, proc); Language::staticmemberfunctionHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::membervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); //String *pb = SwigType_typedef_resolve_all(SwigType_base(Getattr(n, "type"))); Language::membervariableHandler(n); String *proc = NewString(iname); Replaceall(proc, "_", "-"); //Node *class_node = Swig_symbol_clookup(pb, Getattr(n, "sym:symtab")); Node *class_node = classLookup(Getattr(n, "type")); //String *getfunc = NewStringf("%s-%s-get", short_class_name, proc); //String *setfunc = NewStringf("%s-%s-set", short_class_name, proc); String *getfunc = Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); Replaceall(getfunc, "_", "-"); String *setfunc = Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, c_class_name, iname)); Replaceall(setfunc, "_", "-"); Printv(clos_class_defines, " (list '", proc, " ':swig-virtual ':swig-get ", chickenPrimitiveName(getfunc), NIL); if (!GetFlag(n, "feature:immutable")) { if (class_node) { Printv(clos_class_defines, " ':swig-set (lambda (x y) (", chickenPrimitiveName(setfunc), " x (slot-ref y 'swig-this))))\n", NIL); } else { Printv(clos_class_defines, " ':swig-set ", chickenPrimitiveName(setfunc), ")\n", NIL); } } else { Printf(clos_class_defines, ")\n"); } Delete(proc); Delete(setfunc); Delete(getfunc); return SWIG_OK; } int CHICKEN::staticmembervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); member_name = NewStringf("%s-%s", short_class_name, proc); Language::staticmembervariableHandler(n); Delete(member_name); member_name = NULL; Delete(proc); return SWIG_OK; } int CHICKEN::constructorHandler(Node *n) { have_constructor = 1; has_constructor_args = 0; exporting_constructor = true; Language::constructorHandler(n); exporting_constructor = false; has_constructor_args = 1; String *iname = Getattr(n, "sym:name"); constructor_name = Swig_name_construct(NSPACE_TODO, iname); Replaceall(constructor_name, "_", "-"); return SWIG_OK; } int CHICKEN::destructorHandler(Node *n) { if (no_collection) member_name = NewStringf("delete-%s", short_class_name); exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; if (no_collection) { Delete(member_name); member_name = NULL; } return SWIG_OK; } int CHICKEN::importDirective(Node *n) { String *modname = Getattr(n, "module"); if (modname && clos_uses) { // Find the module node for this imported module. It should be the // first child but search just in case. Node *mod = firstChild(n); while (mod && Strcmp(nodeType(mod), "module") != 0) mod = nextSibling(mod); if (mod) { String *name = Getattr(mod, "name"); if (name) { Printf(closprefix, "(declare (uses %s))\n", name); } } } return Language::importDirective(n); } String *CHICKEN::buildClosFunctionCall(List *types, const_String_or_char_ptr closname, const_String_or_char_ptr funcname) { String *method_signature = NewString(""); String *func_args = NewString(""); String *func_call = NewString(""); Iterator arg_type; int arg_count = 0; int optional_arguments = 0; for (arg_type = First(types); arg_type.item; arg_type = Next(arg_type)) { if (Strcmp(arg_type.item, "^^##optional$$") == 0) { optional_arguments = 1; } else { Printf(method_signature, " (arg%i %s)", arg_count, arg_type.item); arg_type = Next(arg_type); if (!arg_type.item) break; String *arg = NewStringf("arg%i", arg_count); String *access_arg = Copy(arg_type.item); Replaceall(access_arg, "$input", arg); Printf(func_args, " %s", access_arg); Delete(arg); Delete(access_arg); } arg_count++; } if (optional_arguments) { Printf(func_call, "(define-method (%s %s . args) (apply %s %s args))", closname, method_signature, funcname, func_args); } else { Printf(func_call, "(define-method (%s %s) (%s %s))", closname, method_signature, funcname, func_args); } Delete(method_signature); Delete(func_args); return func_call; } extern "C" { /* compares based on non-primitive names */ static int compareTypeListsHelper(const DOH *a, const DOH *b, int opt_equal) { List *la = (List *) a; List *lb = (List *) b; Iterator ia = First(la); Iterator ib = First(lb); while (ia.item && ib.item) { int ret = Strcmp(ia.item, ib.item); if (ret) return ret; ia = Next(Next(ia)); ib = Next(Next(ib)); } if (opt_equal && ia.item && Strcmp(ia.item, "^^##optional$$") == 0) return 0; if (ia.item) return -1; if (opt_equal && ib.item && Strcmp(ib.item, "^^##optional$$") == 0) return 0; if (ib.item) return 1; return 0; } static int compareTypeLists(const DOH *a, const DOH *b) { return compareTypeListsHelper(a, b, 0); } } void CHICKEN::dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewString(""); String *dispatch = Swig_overload_dispatch(n, "%s (2+$numargs,closure," "continuation$commaargs);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *iname = Getattr(n, "sym:name"); String *wname = NewString(""); String *scmname = NewString(iname); Replaceall(scmname, "_", "-"); Append(wname, Swig_name_wrapper(iname)); Printv(f->def, "static void real_", wname, "(C_word, C_word, C_word, C_word) C_noret;\n", NIL); Printv(f->def, "static void real_", wname, "(C_word oldargc, C_word closure, C_word continuation, C_word args) {", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "C_word argv[%d]", maxargs + 1); Wrapper_add_local(f, "argv", tmp); Wrapper_add_local(f, "ii", "int ii"); Wrapper_add_local(f, "t", "C_word t = args"); Printf(f->code, "if (!C_swig_is_list (args)) {\n"); Printf(f->code, " swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, " "\"Argument #1 must be a list of overloaded arguments\");\n"); Printf(f->code, "}\n"); Printf(f->code, "argc = C_unfix (C_i_length (args));\n"); Printf(f->code, "for (ii = 0; (ii < argc) && (ii < %d); ii++, t = C_block_item (t, 1)) {\n", maxargs); Printf(f->code, "argv[ii] = C_block_item (t, 0);\n"); Printf(f->code, "}\n"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE," "\"No matching function for overloaded '%s'\");\n", iname); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); addMethod(scmname, wname); DelWrapper(f); f = NewWrapper(); /* varargs */ Printv(f->def, "void ", wname, "(C_word, C_word, C_word, ...) C_noret;\n", NIL); Printv(f->def, "void ", wname, "(C_word c, C_word t0, C_word t1, ...) {", NIL); Printv(f->code, "C_word t2;\n", "va_list v;\n", "C_word *a, c2 = c;\n", "C_save_rest (t1, c2, 2);\n", "a = C_alloc((c-2)*3);\n", "t2 = C_restore_rest (a, C_rest_count (0));\n", "real_", wname, " (3, t0, t1, t2);\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, f_wrappers); /* Now deal with overloaded function when exporting clos */ if (clos) { List *flist = Getattr(overload_parameter_lists, scmname); if (flist) { Delattr(overload_parameter_lists, scmname); SortList(flist, compareTypeLists); String *clos_name; if (have_constructor && !has_constructor_args) { has_constructor_args = 1; constructor_dispatch = NewStringf("%s@SWIG@new@dispatch", short_class_name); clos_name = Copy(constructor_dispatch); Printf(clos_methods, "(declare (hide %s))\n", clos_name); } else if (in_class) clos_name = NewString(member_name); else clos_name = chickenNameMapping(scmname, ""); Iterator f; List *prev = 0; int all_primitive = 1; /* first check for duplicates and an empty call */ String *newlist = NewList(); for (f = First(flist); f.item; f = Next(f)) { /* check if cur is a duplicate of prev */ if (prev && compareTypeListsHelper(f.item, prev, 1) == 0) { Delete(f.item); } else { Append(newlist, f.item); prev = f.item; Iterator j; for (j = First(f.item); j.item; j = Next(j)) { if (Strcmp(j.item, "^^##optional$$") != 0 && Strcmp(j.item, "") != 0) all_primitive = 0; } } } Delete(flist); flist = newlist; if (all_primitive) { Printf(clos_methods, "(define %s %s)\n", clos_name, chickenPrimitiveName(scmname)); } else { for (f = First(flist); f.item; f = Next(f)) { /* now export clos code for argument */ String *func_call = buildClosFunctionCall(f.item, clos_name, chickenPrimitiveName(scmname)); Printf(clos_methods, "%s\n", func_call); Delete(f.item); Delete(func_call); } } Delete(clos_name); Delete(flist); } } DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } int CHICKEN::isPointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } void CHICKEN::addMethod(String *scheme_name, String *function) { String *sym = NewString(""); if (clos) { Append(sym, "primitive:"); } Append(sym, scheme_name); /* add symbol to Chicken internal symbol table */ if (hide_primitive) { Printv(f_init, "{\n", " C_word *p0 = a;\n", " *(a++)=C_CLOSURE_TYPE|1;\n", " *(a++)=(C_word)", function, ";\n", " C_mutate(return_vec++, (C_word)p0);\n", "}\n", NIL); } else { Printf(f_sym_size, "+C_SIZEOF_INTERNED_SYMBOL(%d)", Len(sym)); Printf(f_init, "sym = C_intern (&a, %d, \"%s\");\n", Len(sym), sym); Printv(f_init, "C_mutate ((C_word*)sym+1, (*a=C_CLOSURE_TYPE|1, a[1]=(C_word)", function, ", tmp=(C_word)a, a+=2, tmp));\n", NIL); } if (hide_primitive) { Setattr(primitive_names, scheme_name, NewStringf("(vector-ref swig-init-return %i)", num_methods)); } else { Setattr(primitive_names, scheme_name, Copy(sym)); } num_methods++; Delete(sym); } String *CHICKEN::chickenPrimitiveName(String *name) { String *value = Getattr(primitive_names, name); if (value) return value; else { Swig_error(input_file, line_number, "Internal Error: attempting to reference non-existant primitive name %s\n", name); return NewString("#f"); } } int CHICKEN::validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } /* ------------------------------------------------------------ * closNameMapping() * Maps the identifier from C++ to the CLOS based on command * line parameters and such. * If class_name = "" that means the mapping is for a function or * variable not attached to any class. * ------------------------------------------------------------ */ String *CHICKEN::chickenNameMapping(String *name, const_String_or_char_ptr class_name) { String *n = NewString(""); if (Strcmp(class_name, "") == 0) { // not part of a class, so no class name to prefix if (clossymnameprefix) { Printf(n, "%s%s", clossymnameprefix, name); } else { Printf(n, "%s", name); } } else { if (useclassprefix) { Printf(n, "%s-%s", class_name, name); } else { if (clossymnameprefix) { Printf(n, "%s%s", clossymnameprefix, name); } else { Printf(n, "%s", name); } } } return n; } String *CHICKEN::runtimeCode() { String *s = Swig_include_sys("chickenrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'chickenrun.swg'\n"); s = NewString(""); } return s; } String *CHICKEN::defaultExternalRuntimeFilename() { return NewString("swigchickenrun.h"); } swig-3.0.12/Source/Modules/perl5.cxx0000664000175000017500000024146513042756442017074 0ustar williamwilliam/* ---------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * perl5.cxx * * Perl5 language module for SWIG. * ------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include static const char *usage = "\ Perl5 Options (available with -perl5)\n\ -compat - Compatibility mode\n\ -const - Wrap constants as constants and not variables (implies -proxy)\n\ -cppcast - Enable C++ casting operators\n\ -nocppcast - Disable C++ casting operators, useful for generating bugs\n\ -nopm - Do not generate the .pm file\n\ -noproxy - Don't create proxy classes\n\ -proxy - Create proxy classes\n\ -static - Omit code related to dynamic loading\n\ \n"; static int compat = 0; static int no_pmfile = 0; static int export_all = 0; /* * pmfile * set by the -pm flag, overrides the name of the .pm file */ static String *pmfile = 0; /* * module * set by the %module directive, e.g. "Xerces". It will determine * the name of the .pm file, and the dynamic library, and the name * used by any module wanting to %import the module. */ static String *module = 0; /* * namespace_module * the fully namespace qualified name of the module. It will be used * to set the package namespace in the .pm file, as well as the name * of the initialization methods in the glue library. This will be * the same as module, above, unless the %module directive is given * the 'package' option, e.g. %module(package="Foo::Bar") "baz" */ static String *namespace_module = 0; /* * cmodule * the namespace of the internal glue code, set to the value of * module with a 'c' appended */ static String *cmodule = 0; /* * dest_package * an optional namespace to put all classes into. Specified by using * the %module(package="Foo::Bar") "baz" syntax */ static String *dest_package = 0; static String *command_tab = 0; static String *constant_tab = 0; static String *variable_tab = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_directors = 0; static File *f_directors_h = 0; static File *f_init = 0; static File *f_pm = 0; static String *pm; /* Package initialization code */ static String *magic; /* Magic variable wrappers */ static int staticoption = 0; // controlling verbose output static int verbose = 0; /* The following variables are used to manage Perl5 classes */ static int blessed = 1; /* Enable object oriented features */ static int do_constants = 0; /* Constant wrapping */ static List *classlist = 0; /* List of classes */ static int have_constructor = 0; static int have_destructor = 0; static int have_data_members = 0; static String *class_name = 0; /* Name of the class (what Perl thinks it is) */ static String *real_classname = 0; /* Real name of C/C++ class */ static String *fullclassname = 0; static String *pcode = 0; /* Perl code associated with each class */ /* static String *blessedmembers = 0; *//* Member data associated with each class */ static int member_func = 0; /* Set to 1 when wrapping a member function */ static String *func_stubs = 0; /* Function stubs */ static String *const_stubs = 0; /* Constant stubs */ static int num_consts = 0; /* Number of constants */ static String *var_stubs = 0; /* Variable stubs */ static String *exported = 0; /* Exported symbols */ static String *pragma_include = 0; static String *additional_perl_code = 0; /* Additional Perl code from %perlcode %{ ... %} */ static Hash *operators = 0; static int have_operators = 0; class PERL5:public Language { public: PERL5():Language () { Clear(argc_template_string); Printv(argc_template_string, "items", NIL); Clear(argv_template_string); Printv(argv_template_string, "ST(%d)", NIL); director_language = 1; } /* Test to see if a type corresponds to something wrapped with a shadow class */ Node *is_shadow(SwigType *t) { Node *n; n = classLookup(t); /* Printf(stdout,"'%s' --> '%p'\n", t, n); */ if (n) { if (!Getattr(n, "perl5:proxy")) { setclassname(n); } return Getattr(n, "perl5:proxy"); } return 0; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i = 1; int cppcast = 1; SWIG_library_directory("perl5"); for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { Printv(stderr, "*** -package is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n", NIL); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-interface") == 0) { Printv(stderr, "*** -interface is no longer supported\n*** use the directive '%module A::B::C' in your interface file instead\n*** see the Perl section in the manual for details.\n", NIL); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-exportall") == 0) { export_all = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-static") == 0) { staticoption = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { blessed = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-noproxy") == 0)) { blessed = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-const") == 0) { do_constants = 1; blessed = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nopm") == 0) { no_pmfile = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-pm") == 0) { Swig_mark_arg(i); i++; pmfile = NewString(argv[i]); Swig_mark_arg(i); } else if (strcmp(argv[i],"-v") == 0) { Swig_mark_arg(i); verbose++; } else if (strcmp(argv[i], "-cppcast") == 0) { cppcast = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocppcast") == 0) { cppcast = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-compat") == 0) { compat = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } } if (cppcast) { Preprocessor_define((DOH *) "SWIG_CPLUSPLUS_CAST", 0); } Preprocessor_define("SWIGPERL 1", 0); // SWIGPERL5 is deprecated, and no longer documented. Preprocessor_define("SWIGPERL5 1", 0); SWIG_typemap_lang("perl5"); SWIG_config_file("perl5.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* check if directors are enabled for this module. note: this * is a "master" switch, without which no director code will be * emitted. %feature("director") statements are also required * to enable directors for individual classes or methods. * * use %module(directors="1") modulename at the start of the * interface file to enable director generation. * * TODO: directors are disallowed in conjunction with many command * line options. Some of them are probably safe, but it will take * some effort to validate each one. */ { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { int dirprot = 0; if (Getattr(options, "dirprot")) dirprot = 1; if (Getattr(options, "nodirprot")) dirprot = 0; if (Getattr(options, "directors")) { int allow = 1; if (export_all) { Printv(stderr, "*** directors are not supported with -exportall\n", NIL); allow = 0; } if (staticoption) { Printv(stderr, "*** directors are not supported with -static\n", NIL); allow = 0; } if (!blessed) { Printv(stderr, "*** directors are not supported with -noproxy\n", NIL); allow = 0; } if (no_pmfile) { Printv(stderr, "*** directors are not supported with -nopm\n", NIL); allow = 0; } if (compat) { Printv(stderr, "*** directors are not supported with -compat\n", NIL); allow = 0; } if (allow) { allow_directors(); if (dirprot) allow_dirprot(); } } } } } /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); f_directors_h = NewString(""); f_directors = NewString(""); if (directorsEnabled()) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); classlist = NewList(); pm = NewString(""); func_stubs = NewString(""); var_stubs = NewString(""); const_stubs = NewString(""); exported = NewString(""); magic = NewString(""); pragma_include = NewString(""); additional_perl_code = NewString(""); command_tab = NewString("static swig_command_info swig_commands[] = {\n"); constant_tab = NewString("static swig_constant_info swig_constants[] = {\n"); variable_tab = NewString("static swig_variable_info swig_variables[] = {\n"); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPERL\n#define SWIGPERL\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } Printf(f_runtime, "#define SWIG_CASTRANK_MODE\n"); Printf(f_runtime, "\n"); // Is the imported module in another package? (IOW, does it use the // %module(package="name") option and it's different than the package // of this module.) Node *mod = Getattr(n, "module"); Node *options = Getattr(mod, "options"); module = Copy(Getattr(n,"name")); String *underscore_module = Copy(module); Replaceall(underscore_module,":","_"); if (verbose > 0) { fprintf(stdout, "top: using namespace_module: %s\n", Char(namespace_module)); } if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", underscore_module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", underscore_module); if (dirprot_mode()) { Printf(f_directors_h, "#include \n"); Printf(f_directors_h, "#include \n\n"); } Printf(f_directors, "\n\n"); Printf(f_directors, "/* ---------------------------------------------------\n"); Printf(f_directors, " * C++ director class methods\n"); Printf(f_directors, " * --------------------------------------------------- */\n\n"); if (outfile_h) { String *filename = Swig_file_filename(outfile_h); Printf(magic, "#include \"%s\"\n\n", filename); Delete(filename); } } if (verbose > 0) { fprintf(stdout, "top: using module: %s\n", Char(module)); } dest_package = options ? Getattr(options, "package") : 0; if (dest_package) { namespace_module = Copy(dest_package); if (verbose > 0) { fprintf(stdout, "top: Found package: %s\n",Char(dest_package)); } } else { namespace_module = Copy(module); if (verbose > 0) { fprintf(stdout, "top: No package found\n"); } } /* If we're in blessed mode, change the package name to "packagec" */ if (blessed) { cmodule = NewStringf("%sc",namespace_module); } else { cmodule = NewString(namespace_module); } /* Create a .pm file * Need to strip off any prefixes that might be found in * the module name */ if (no_pmfile) { f_pm = NewString(0); } else { if (!pmfile) { char *m = Char(module) + Len(module); while (m != Char(module)) { if (*m == ':') { m++; break; } m--; } pmfile = NewStringf("%s.pm", m); } String *filen = NewStringf("%s%s", SWIG_output_directory(), pmfile); if ((f_pm = NewFile(filen, "w", SWIG_output_files())) == 0) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; Swig_register_filebyname("pm", f_pm); Swig_register_filebyname("perl", f_pm); } { String *boot_name = NewStringf("boot_%s", underscore_module); Printf(f_header,"#define SWIG_init %s\n\n", boot_name); Printf(f_header,"#define SWIG_name \"%s::%s\"\n", cmodule, boot_name); Printf(f_header,"#define SWIG_prefix \"%s::\"\n", cmodule); Delete(boot_name); } Swig_banner_target_lang(f_pm, "#"); Printf(f_pm, "\n"); Printf(f_pm, "package %s;\n", module); /* * If the package option has been given we are placing our * symbols into some other packages namespace, so we do not * mess with @ISA or require for that package */ if (dest_package) { Printf(f_pm,"use base qw(DynaLoader);\n"); } else { Printf(f_pm,"use base qw(Exporter);\n"); if (!staticoption) { Printf(f_pm,"use base qw(DynaLoader);\n"); } } /* Start creating magic code */ Printv(magic, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n", "#ifdef PERL_OBJECT\n", "#define MAGIC_CLASS _wrap_", underscore_module, "_var::\n", "class _wrap_", underscore_module, "_var : public CPerlObj {\n", "public:\n", "#else\n", "#define MAGIC_CLASS\n", "#endif\n", "SWIGCLASS_STATIC int swig_magic_readonly(pTHX_ SV *SWIGUNUSEDPARM(sv), MAGIC *SWIGUNUSEDPARM(mg)) {\n", tab4, "MAGIC_PPERL\n", tab4, "croak(\"Value is read-only.\");\n", tab4, "return 0;\n", "}\n", NIL); Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); /* emit wrappers */ Language::top(n); if (directorsEnabled()) { // Insert director runtime into the f_runtime file (make it occur before %header section) Swig_insert_file("director_common.swg", f_runtime); Swig_insert_file("director.swg", f_runtime); } String *base = NewString(""); /* Dump out variable wrappers */ Printv(magic, "\n\n#ifdef PERL_OBJECT\n", "};\n", "#endif\n", NIL); Printv(magic, "\n#ifdef __cplusplus\n}\n#endif\n", NIL); Printf(f_header, "%s\n", magic); String *type_table = NewString(""); /* Patch the type table to reflect the names used by shadow classes */ if (blessed) { Iterator cls; for (cls = First(classlist); cls.item; cls = Next(cls)) { String *pname = Getattr(cls.item, "perl5:proxy"); if (pname) { SwigType *type = Getattr(cls.item, "classtypeobj"); if (!type) continue; /* If unnamed class, no type will be found */ type = Copy(type); SwigType_add_pointer(type); String *mangled = SwigType_manglestr(type); SwigType_remember_mangleddata(mangled, NewStringf("\"%s\"", pname)); Delete(type); Delete(mangled); } } } SwigType_emit_type_table(f_runtime, type_table); Printf(f_wrappers, "%s", type_table); Delete(type_table); Printf(constant_tab, "{0,0,0,0,0,0}\n};\n"); Printv(f_wrappers, constant_tab, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n}\n#endif\n"); Printf(f_init, "\t ST(0) = &PL_sv_yes;\n"); Printf(f_init, "\t XSRETURN(1);\n"); Printf(f_init, "}\n"); /* Finish off tables */ Printf(variable_tab, "{0,0,0,0}\n};\n"); Printv(f_wrappers, variable_tab, NIL); Printf(command_tab, "{0,0}\n};\n"); Printv(f_wrappers, command_tab, NIL); Printf(f_pm, "package %s;\n", cmodule); if (!staticoption) { Printf(f_pm,"bootstrap %s;\n", module); } else { Printf(f_pm,"package %s;\n", cmodule); Printf(f_pm,"boot_%s();\n", underscore_module); } Printf(f_pm, "package %s;\n", module); /* * If the package option has been given we are placing our * symbols into some other packages namespace, so we do not * mess with @EXPORT */ if (!dest_package) { Printf(f_pm,"@EXPORT = qw(%s);\n", exported); } Printf(f_pm, "%s", pragma_include); if (blessed) { /* * These methods will be duplicated if package * has been specified, so we do not output them */ if (!dest_package) { Printv(base, "\n# ---------- BASE METHODS -------------\n\n", "package ", namespace_module, ";\n\n", NIL); /* Write out the TIE method */ Printv(base, "sub TIEHASH {\n", tab4, "my ($classname,$obj) = @_;\n", tab4, "return bless $obj, $classname;\n", "}\n\n", NIL); /* Output a CLEAR method. This is just a place-holder, but by providing it we * can make declarations such as * %$u = ( x => 2, y=>3, z =>4 ); * * Where x,y,z are the members of some C/C++ object. */ Printf(base, "sub CLEAR { }\n\n"); /* Output default firstkey/nextkey methods */ Printf(base, "sub FIRSTKEY { }\n\n"); Printf(base, "sub NEXTKEY { }\n\n"); /* Output a FETCH method. This is actually common to all classes */ Printv(base, "sub FETCH {\n", tab4, "my ($self,$field) = @_;\n", tab4, "my $member_func = \"swig_${field}_get\";\n", tab4, "$self->$member_func();\n", "}\n\n", NIL); /* Output a STORE method. This is also common to all classes (might move to base class) */ Printv(base, "sub STORE {\n", tab4, "my ($self,$field,$newval) = @_;\n", tab4, "my $member_func = \"swig_${field}_set\";\n", tab4, "$self->$member_func($newval);\n", "}\n\n", NIL); /* Output a 'this' method */ Printv(base, "sub this {\n", tab4, "my $ptr = shift;\n", tab4, "return tied(%$ptr);\n", "}\n\n", NIL); Printf(f_pm, "%s", base); } /* Emit function stubs for stand-alone functions */ Printf(f_pm, "\n# ------- FUNCTION WRAPPERS --------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", func_stubs); /* Emit package code for different classes */ Printf(f_pm, "%s", pm); if (num_consts > 0) { /* Emit constant stubs */ Printf(f_pm, "\n# ------- CONSTANT STUBS -------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", const_stubs); } /* Emit variable stubs */ Printf(f_pm, "\n# ------- VARIABLE STUBS --------\n\n"); Printf(f_pm, "package %s;\n\n", namespace_module); Printf(f_pm, "%s", var_stubs); } /* Add additional Perl code at the end */ Printf(f_pm, "%s", additional_perl_code); Printf(f_pm, "1;\n"); Delete(f_pm); Delete(base); Delete(dest_package); Delete(underscore_module); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Dump(f_directors, f_begin); } Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_directors); Delete(f_directors_h); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ------------------------------------------------------------ * importDirective(Node *n) * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { if (blessed) { String *modname = Getattr(n, "module"); if (modname) { Printf(f_pm, "require %s;\n", modname); } } return Language::importDirective(n); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *overname = 0; int director_method = 0; Parm *p; int i; Wrapper *f; char source[256], temp[256]; String *tm; String *cleanup, *outarg; int num_saved = 0; int num_arguments, num_required; int varargs = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } f = NewWrapper(); cleanup = NewString(""); outarg = NewString(""); String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); Printv(f->def, "XS(", wname, ") {\n", "{\n", /* scope to destroy C++ objects before croaking */ NIL); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); num_arguments = emit_num_arguments(l); num_required = emit_num_required(l); varargs = emit_isvarargs(l); Wrapper_add_local(f, "argvi", "int argvi = 0"); /* Check the number of arguments */ if (!varargs) { Printf(f->code, " if ((items < %d) || (items > %d)) {\n", num_required, num_arguments); } else { Printf(f->code, " if (items < %d) {\n", num_required); } Printf(f->code, " SWIG_croak(\"Usage: %s\");\n", usage_func(Char(iname), d, l)); Printf(f->code, "}\n"); /* Write code to extract parameters. */ for (i = 0, p = l; i < num_arguments; i++) { /* Skip ignored arguments */ while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); /* Produce string representation of source and target arguments */ sprintf(source, "ST(%d)", i); String *target = Getattr(p, "lname"); if (i >= num_required) { Printf(f->code, " if (items > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$target", target); Replaceall(tm, "$source", source); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); /* Save input location */ if (Getattr(p, "wrap:disown") || (Getattr(p, "tmap:in:disown"))) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); p = nextSibling(p); } if (i >= num_required) { Printf(f->code, " }\n"); } } if (varargs) { if (p && (tm = Getattr(p, "tmap:in"))) { sprintf(source, "ST(%d)", i); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "if (items >= %d) {\n", i); Printv(f->code, tm, "\n", NIL); Printf(f->code, "}\n"); } } /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ num_saved = 0; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { SwigType *t = Getattr(p, "type"); Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } String *in = Getattr(p, "emit:input"); if (in) { sprintf(temp, "_saved[%d]", num_saved); Replaceall(tm, "$arg", temp); Replaceall(tm, "$input", temp); Printf(f->code, "_saved[%d] = %s;\n", num_saved, in); num_saved++; } Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* If there were any saved arguments, emit a local variable for them */ if (num_saved) { sprintf(temp, "_saved[%d]", num_saved); Wrapper_add_localv(f, "_saved", "SV *", temp, NIL); } director_method = is_member_director(n) && !is_smart_pointer() && 0 != Cmp(nodeType(n), "destructor"); if (director_method) { Wrapper_add_local(f, "director", "Swig::Director *director = 0"); Append(f->code, "director = SWIG_DIRECTOR_CAST(arg1);\n"); if (dirprot_mode() && !is_public(n)) { Printf(f->code, "if (!director || !(director->swig_get_inner(\"%s\"))) {\n", name); Printf(f->code, "SWIG_exception_fail(SWIG_RuntimeError, \"accessing protected member %s\");\n", name); Append(f->code, "}\n"); } Wrapper_add_local(f, "upcall", "bool upcall = false"); Printf(f->code, "upcall = director && SvSTASH(SvRV(ST(0))) == gv_stashpv(director->swig_get_class(), 0);\n"); } /* Emit the function call */ if (director_method) { Append(f->code, "try {\n"); } /* Now write code to make the function call */ Swig_director_emit_dynamic_cast(n, f); String *actioncode = emit_action(n); if (director_method) { Append(actioncode, "} catch (Swig::DirectorException& swig_err) {\n"); Append(actioncode, " sv_setsv(ERRSV, swig_err.getNative());\n"); Append(actioncode, " SWIG_fail;\n"); Append(actioncode, "}\n"); } if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { SwigType *t = Getattr(n, "type"); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "ST(argvi)"); Replaceall(tm, "$result", "ST(argvi)"); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "SWIG_OWNER"); } else { Replaceall(tm, "$owner", "0"); } Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); /* If there were any output args, take care of them. */ Printv(f->code, outarg, NIL); /* If there was any cleanup, do that. */ Printv(f->code, cleanup, NIL); if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } } if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); } Printv(f->code, "XSRETURN(argvi);\n", "fail:\n", cleanup, "SWIG_croak_null();\n" "}\n" "}\n", NIL); /* Add the dXSARGS last */ Wrapper_add_local(f, "dXSARGS", "dXSARGS"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); /* Dump the wrapper function */ Wrapper_print(f, f_wrappers); /* Now register the function */ if (!Getattr(n, "sym:overloaded")) { Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, iname, wname); } else if (!Getattr(n, "sym:nextSibling")) { /* Generate overloaded dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch_cast(n, "PUSHMARK(MARK); SWIG_CALLXS(%s); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "XS(", dname, ") {\n", NIL); Wrapper_add_local(df, "dXSARGS", "dXSARGS"); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "croak(\"No matching function for overloaded '%s'\");\n", iname); Printf(df->code, "XSRETURN(0);\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, iname, dname); DelWrapper(df); Delete(dispatch); Delete(dname); } if (!Getattr(n, "sym:nextSibling")) { if (export_all) { Printf(exported, "%s ", iname); } /* -------------------------------------------------------------------- * Create a stub for this function, provided it's not a member function * -------------------------------------------------------------------- */ if ((blessed) && (!member_func)) { Printv(func_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } Delete(cleanup); Delete(outarg); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *t = Getattr(n, "type"); Wrapper *getf, *setf; String *tm; String *getname = Swig_name_get(NSPACE_TODO, iname); String *setname = Swig_name_set(NSPACE_TODO, iname); String *get_name = Swig_name_wrapper(getname); String *set_name = Swig_name_wrapper(setname); if (!addSymbol(iname, n)) return SWIG_ERROR; getf = NewWrapper(); setf = NewWrapper(); /* Create a Perl function for setting the variable value */ if (!GetFlag(n, "feature:immutable")) { Setattr(n, "wrap:name", set_name); Printf(setf->def, "SWIGCLASS_STATIC int %s(pTHX_ SV* sv, MAGIC * SWIGUNUSEDPARM(mg)) {\n", set_name); Printv(setf->code, tab4, "MAGIC_PPERL\n", NIL); /* Check for a few typemaps */ tm = Swig_typemap_lookup("varin", n, name, 0); if (tm) { Replaceall(tm, "$source", "sv"); Replaceall(tm, "$target", name); Replaceall(tm, "$input", "sv"); /* Printf(setf->code,"%s\n", tm); */ emit_action_code(n, setf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(t, 0)); DelWrapper(setf); DelWrapper(getf); return SWIG_NOWRAP; } Printf(setf->code, "fail:\n"); Printf(setf->code, " return 1;\n}\n"); Replaceall(setf->code, "$symname", iname); Wrapper_print(setf, magic); } /* Now write a function to evaluate the variable */ Setattr(n, "wrap:name", get_name); int addfail = 0; Printf(getf->def, "SWIGCLASS_STATIC int %s(pTHX_ SV *sv, MAGIC *SWIGUNUSEDPARM(mg)) {\n", get_name); Printv(getf->code, tab4, "MAGIC_PPERL\n", NIL); if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$target", "sv"); Replaceall(tm, "$result", "sv"); Replaceall(tm, "$source", name); if (is_shadow(t)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } /* Printf(getf->code,"%s\n", tm); */ addfail = emit_action_code(n, getf->code, tm); } else { Swig_warning(WARN_TYPEMAP_VAROUT_UNDEF, input_file, line_number, "Unable to read variable of type %s\n", SwigType_str(t, 0)); DelWrapper(setf); DelWrapper(getf); return SWIG_NOWRAP; } Printf(getf->code, " return 1;\n"); if (addfail) { Append(getf->code, "fail:\n"); Append(getf->code, " return 0;\n"); } Append(getf->code, "}\n"); Replaceall(getf->code, "$symname", iname); Wrapper_print(getf, magic); String *tt = Getattr(n, "tmap:varout:type"); if (tt) { tt = NewStringf("&%s", tt); } else { tt = NewString("0"); } /* Now add symbol to the PERL interpreter */ if (GetFlag(n, "feature:immutable")) { Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS swig_magic_readonly, MAGIC_CLASS ", get_name, ",", tt, " },\n", NIL); } else { Printv(variable_tab, tab4, "{ \"", cmodule, "::", iname, "\", MAGIC_CLASS ", set_name, ", MAGIC_CLASS ", get_name, ",", tt, " },\n", NIL); } /* If we're blessed, try to figure out what to do with the variable 1. If it's a Perl object of some sort, create a tied-hash around it. 2. Otherwise, just hack Perl's symbol table */ if (blessed) { if (is_shadow(t)) { Printv(var_stubs, "\nmy %__", iname, "_hash;\n", "tie %__", iname, "_hash,\"", is_shadow(t), "\", $", cmodule, "::", iname, ";\n", "$", iname, "= \\%__", iname, "_hash;\n", "bless $", iname, ", ", is_shadow(t), ";\n", NIL); } else { Printv(var_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } if (export_all) Printf(exported, "$%s ", iname); Delete(tt); DelWrapper(setf); DelWrapper(getf); Delete(getname); Delete(setname); Delete(set_name); Delete(get_name); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = Getattr(n, "name"); String *iname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; /* Special hook for member pointer */ if (SwigType_type(type) == T_MPOINTER) { String *wname = Swig_name_wrapper(iname); Printf(f_wrappers, "static %s = %s;\n", SwigType_str(type, wname), value); value = Char(wname); } if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } Printf(constant_tab, "%s,\n", tm); } else if ((tm = Swig_typemap_lookup("constcode", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); if (is_shadow(type)) { Replaceall(tm, "$shadow", "SWIG_SHADOW"); } else { Replaceall(tm, "$shadow", "0"); } Printf(f_init, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); return SWIG_NOWRAP; } if (blessed) { if (is_shadow(type)) { Printv(var_stubs, "\nmy %__", iname, "_hash;\n", "tie %__", iname, "_hash,\"", is_shadow(type), "\", $", cmodule, "::", iname, ";\n", "$", iname, "= \\%__", iname, "_hash;\n", "bless $", iname, ", ", is_shadow(type), ";\n", NIL); } else if (do_constants) { Printv(const_stubs, "sub ", name, " () { $", cmodule, "::", name, " }\n", NIL); num_consts++; } else { Printv(var_stubs, "*", iname, " = *", cmodule, "::", iname, ";\n", NIL); } } if (export_all) { if (do_constants && !is_shadow(type)) { Printf(exported, "%s ", name); } else { Printf(exported, "$%s ", iname); } } return SWIG_OK; } /* ------------------------------------------------------------ * usage_func() * ------------------------------------------------------------ */ char *usage_func(char *iname, SwigType *, ParmList *l) { static String *temp = 0; Parm *p; int i; if (!temp) temp = NewString(""); Clear(temp); Printf(temp, "%s(", iname); /* Now go through and print parameters */ p = l; i = 0; while (p != 0) { SwigType *pt = Getattr(p, "type"); String *pn = Getattr(p, "name"); if (!checkAttribute(p,"tmap:in:numinputs","0")) { /* If parameter has been named, use that. Otherwise, just print a type */ if (SwigType_type(pt) != T_VOID) { if (Len(pn) > 0) { Printf(temp, "%s", pn); } else { Printf(temp, "%s", SwigType_str(pt, 0)); } } i++; p = nextSibling(p); if (p) if (!checkAttribute(p,"tmap:in:numinputs","0")) Putc(',', temp); } else { p = nextSibling(p); if (p) if ((i > 0) && (!checkAttribute(p,"tmap:in:numinputs","0"))) Putc(',', temp); } } Printf(temp, ");"); return Char(temp); } /* ------------------------------------------------------------ * nativeWrapper() * ------------------------------------------------------------ */ virtual int nativeWrapper(Node *n) { String *name = Getattr(n, "sym:name"); String *funcname = Getattr(n, "wrap:name"); if (!addSymbol(funcname, n)) return SWIG_ERROR; Printf(command_tab, "{\"%s::%s\", %s},\n", cmodule, name, funcname); if (export_all) Printf(exported, "%s ", name); if (blessed) { Printv(func_stubs, "*", name, " = *", cmodule, "::", name, ";\n", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------------- * OBJECT-ORIENTED FEATURES * * These extensions provide a more object-oriented interface to C++ * classes and structures. The code here is based on extensions * provided by David Fletcher and Gary Holt. * * I have generalized these extensions to make them more general purpose * and to resolve object-ownership problems. * * The approach here is very similar to the Python module : * 1. All of the original methods are placed into a single * package like before except that a 'c' is appended to the * package name. * * 2. All methods and function calls are wrapped with a new * perl function. While possibly inefficient this allows * us to catch complex function arguments (which are hard to * track otherwise). * * 3. Classes are represented as tied-hashes in a manner similar * to Gary Holt's extension. This allows us to access * member data. * * 4. Stand-alone (global) C functions are modified to take * tied hashes as arguments for complex datatypes (if * appropriate). * * 5. Global variables involving a class/struct is encapsulated * in a tied hash. * * ------------------------------------------------------------------------- */ void setclassname(Node *n) { String *symname = Getattr(n, "sym:name"); String *fullname; String *actualpackage; Node *clsmodule = Getattr(n, "module"); if (!clsmodule) { /* imported module does not define a module name. Oh well */ return; } /* Do some work on the class name */ if (verbose > 0) { String *modulename = Getattr(clsmodule, "name"); fprintf(stdout, "setclassname: Found sym:name: %s\n", Char(symname)); fprintf(stdout, "setclassname: Found module: %s\n", Char(modulename)); fprintf(stdout, "setclassname: No package found\n"); } if (dest_package) { fullname = NewStringf("%s::%s", namespace_module, symname); } else { actualpackage = Getattr(clsmodule,"name"); if (verbose > 0) { fprintf(stdout, "setclassname: Found actualpackage: %s\n", Char(actualpackage)); } if ((!compat) && (!Strchr(symname,':'))) { fullname = NewStringf("%s::%s",actualpackage,symname); } else { fullname = NewString(symname); } } if (verbose > 0) { fprintf(stdout, "setclassname: setting proxy: %s\n", Char(fullname)); } Setattr(n, "perl5:proxy", fullname); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { /* Do some work on the class name */ if (!Getattr(n, "feature:onlychildren")) { if (blessed) { setclassname(n); Append(classlist, n); } } return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { if (blessed) { have_constructor = 0; have_operators = 0; have_destructor = 0; have_data_members = 0; operators = NewHash(); class_name = Getattr(n, "sym:name"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Use the fully qualified name of the Perl class */ if (!compat) { fullclassname = NewStringf("%s::%s", namespace_module, class_name); } else { fullclassname = NewString(class_name); } real_classname = Getattr(n, "name"); pcode = NewString(""); // blessedmembers = NewString(""); } /* Emit all of the members */ Language::classHandler(n); /* Finish the rest of the class */ if (blessed) { /* Generate a client-data entry */ SwigType *ct = NewStringf("p.%s", real_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", SwigType_manglestr(ct), ", (void*) \"", fullclassname, "\");\n", NIL); SwigType_remember(ct); Delete(ct); Printv(pm, "\n############# Class : ", fullclassname, " ##############\n", "\npackage ", fullclassname, ";\n", NIL); if (have_operators) { Printf(pm, "use overload\n"); Iterator ki; for (ki = First(operators); ki.key; ki = Next(ki)) { char *name = Char(ki.key); // fprintf(stderr,"found name: <%s>\n", name); if (strstr(name, "__eq__")) { Printv(pm, tab4, "\"==\" => sub { $_[0]->__eq__($_[1])},\n",NIL); } else if (strstr(name, "__ne__")) { Printv(pm, tab4, "\"!=\" => sub { $_[0]->__ne__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__assign__")) { // Printv(pm, tab4, "\"=\" => sub { $_[0]->__assign__($_[1])},\n",NIL); } else if (strstr(name, "__str__")) { Printv(pm, tab4, "'\"\"' => sub { $_[0]->__str__()},\n",NIL); } else if (strstr(name, "__plusplus__")) { Printv(pm, tab4, "\"++\" => sub { $_[0]->__plusplus__()},\n",NIL); } else if (strstr(name, "__minmin__")) { Printv(pm, tab4, "\"--\" => sub { $_[0]->__minmin__()},\n",NIL); } else if (strstr(name, "__add__")) { Printv(pm, tab4, "\"+\" => sub { $_[0]->__add__($_[1])},\n",NIL); } else if (strstr(name, "__sub__")) { Printv(pm, tab4, "\"-\" => sub { if( not $_[2] ) { $_[0]->__sub__($_[1]) }\n",NIL); Printv(pm, tab8, "elsif( $_[0]->can('__rsub__') ) { $_[0]->__rsub__($_[1]) }\n",NIL); Printv(pm, tab8, "else { die(\"reverse subtraction not supported\") }\n",NIL); Printv(pm, tab8, "},\n",NIL); } else if (strstr(name, "__mul__")) { Printv(pm, tab4, "\"*\" => sub { $_[0]->__mul__($_[1])},\n",NIL); } else if (strstr(name, "__div__")) { Printv(pm, tab4, "\"/\" => sub { $_[0]->__div__($_[1])},\n",NIL); } else if (strstr(name, "__mod__")) { Printv(pm, tab4, "\"%\" => sub { $_[0]->__mod__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__and__")) { // Printv(pm, tab4, "\"&\" => sub { $_[0]->__and__($_[1])},\n",NIL); // there are no tests for this in operator_overload_runme.pl // it is likely to be broken // } else if (strstr(name, "__or__")) { // Printv(pm, tab4, "\"|\" => sub { $_[0]->__or__($_[1])},\n",NIL); } else if (strstr(name, "__gt__")) { Printv(pm, tab4, "\">\" => sub { $_[0]->__gt__($_[1])},\n",NIL); } else if (strstr(name, "__ge__")) { Printv(pm, tab4, "\">=\" => sub { $_[0]->__ge__($_[1])},\n",NIL); } else if (strstr(name, "__not__")) { Printv(pm, tab4, "\"!\" => sub { $_[0]->__not__()},\n",NIL); } else if (strstr(name, "__lt__")) { Printv(pm, tab4, "\"<\" => sub { $_[0]->__lt__($_[1])},\n",NIL); } else if (strstr(name, "__le__")) { Printv(pm, tab4, "\"<=\" => sub { $_[0]->__le__($_[1])},\n",NIL); } else if (strstr(name, "__pluseq__")) { Printv(pm, tab4, "\"+=\" => sub { $_[0]->__pluseq__($_[1])},\n",NIL); } else if (strstr(name, "__mineq__")) { Printv(pm, tab4, "\"-=\" => sub { $_[0]->__mineq__($_[1])},\n",NIL); } else if (strstr(name, "__neg__")) { Printv(pm, tab4, "\"neg\" => sub { $_[0]->__neg__()},\n",NIL); } else { fprintf(stderr,"Unknown operator: %s\n", name); } } Printv(pm, tab4, "\"=\" => sub { my $class = ref($_[0]); $class->new($_[0]) },\n", NIL); Printv(pm, tab4, "\"fallback\" => 1;\n", NIL); } // make use strict happy Printv(pm, "use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS);\n", NIL); /* If we are inheriting from a base class, set that up */ Printv(pm, "@ISA = qw(", NIL); /* Handle inheritance */ List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator b; b = First(baselist); while (b.item) { String *bname = Getattr(b.item, "perl5:proxy"); if (!bname) { b = Next(b); continue; } Printv(pm, " ", bname, NIL); b = Next(b); } } /* Module comes last */ if (!compat || Cmp(namespace_module, fullclassname)) { Printv(pm, " ", namespace_module, NIL); } Printf(pm, " );\n"); /* Dump out a hash table containing the pointers that we own */ Printf(pm, "%%OWNER = ();\n"); if (have_data_members || have_destructor) Printf(pm, "%%ITERATORS = ();\n"); /* Dump out the package methods */ Printv(pm, pcode, NIL); Delete(pcode); /* Output methods for managing ownership */ String *director_disown; if (Getattr(n, "perl5:directordisown")) { director_disown = NewStringf("%s%s($self);\n", tab4, Getattr(n, "perl5:directordisown")); } else { director_disown = NewString(""); } Printv(pm, "sub DISOWN {\n", tab4, "my $self = shift;\n", director_disown, tab4, "my $ptr = tied(%$self);\n", tab4, "delete $OWNER{$ptr};\n", "}\n\n", "sub ACQUIRE {\n", tab4, "my $self = shift;\n", tab4, "my $ptr = tied(%$self);\n", tab4, "$OWNER{$ptr} = 1;\n", "}\n\n", NIL); Delete(director_disown); /* Only output the following methods if a class has member data */ Delete(operators); operators = 0; if (Swig_directorclass(n)) { /* director classes need a way to recover subclass instance attributes */ Node *get_attr = NewHash(); String *mrename; String *symname = Getattr(n, "sym:name"); mrename = Swig_name_disown(NSPACE_TODO, symname); Replaceall(mrename, "disown", "swig_get_attr"); String *type = NewString(getClassType()); String *name = NewString("self"); SwigType_add_pointer(type); Parm *p = NewParm(type, name, n); Delete(name); Delete(type); type = NewString("SV"); SwigType_add_pointer(type); String *action = NewString(""); Printv(action, "{\n", " Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);\n", " result = sv_newmortal();\n" " if (director) sv_setsv(result, director->swig_get_self());\n", "}\n", NIL); Setfile(get_attr, Getfile(n)); Setline(get_attr, Getline(n)); Setattr(get_attr, "wrap:action", action); Setattr(get_attr, "name", mrename); Setattr(get_attr, "sym:name", mrename); Setattr(get_attr, "type", type); Setattr(get_attr, "parms", p); Delete(action); Delete(type); Delete(p); member_func = 1; functionWrapper(get_attr); member_func = 0; Delete(get_attr); Printv(pm, "sub FETCH {\n", tab4, "my ($self,$field) = @_;\n", tab4, "my $member_func = \"swig_${field}_get\";\n", tab4, "if (not $self->can($member_func)) {\n", tab8, "my $h = ", cmodule, "::", mrename, "($self);\n", tab8, "return $h->{$field} if $h;\n", tab4, "}\n", tab4, "return $self->$member_func;\n", "}\n", "\n", "sub STORE {\n", tab4, "my ($self,$field,$newval) = @_;\n", tab4, "my $member_func = \"swig_${field}_set\";\n", tab4, "if (not $self->can($member_func)) {\n", tab8, "my $h = ", cmodule, "::", mrename, "($self);\n", tab8, "return $h->{$field} = $newval if $h;\n", tab4, "}\n", tab4, "return $self->$member_func($newval);\n", "}\n", NIL); Delete(mrename); } } return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Language::memberfunctionHandler(n); member_func = 0; if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { if (Strstr(symname, "__eq__")) { DohSetInt(operators, "__eq__", 1); have_operators = 1; } else if (Strstr(symname, "__ne__")) { DohSetInt(operators, "__ne__", 1); have_operators = 1; } else if (Strstr(symname, "__assign__")) { DohSetInt(operators, "__assign__", 1); have_operators = 1; } else if (Strstr(symname, "__str__")) { DohSetInt(operators, "__str__", 1); have_operators = 1; } else if (Strstr(symname, "__add__")) { DohSetInt(operators, "__add__", 1); have_operators = 1; } else if (Strstr(symname, "__sub__")) { DohSetInt(operators, "__sub__", 1); have_operators = 1; } else if (Strstr(symname, "__mul__")) { DohSetInt(operators, "__mul__", 1); have_operators = 1; } else if (Strstr(symname, "__div__")) { DohSetInt(operators, "__div__", 1); have_operators = 1; } else if (Strstr(symname, "__mod__")) { DohSetInt(operators, "__mod__", 1); have_operators = 1; } else if (Strstr(symname, "__and__")) { DohSetInt(operators, "__and__", 1); have_operators = 1; } else if (Strstr(symname, "__or__")) { DohSetInt(operators, "__or__", 1); have_operators = 1; } else if (Strstr(symname, "__not__")) { DohSetInt(operators, "__not__", 1); have_operators = 1; } else if (Strstr(symname, "__gt__")) { DohSetInt(operators, "__gt__", 1); have_operators = 1; } else if (Strstr(symname, "__ge__")) { DohSetInt(operators, "__ge__", 1); have_operators = 1; } else if (Strstr(symname, "__lt__")) { DohSetInt(operators, "__lt__", 1); have_operators = 1; } else if (Strstr(symname, "__le__")) { DohSetInt(operators, "__le__", 1); have_operators = 1; } else if (Strstr(symname, "__neg__")) { DohSetInt(operators, "__neg__", 1); have_operators = 1; } else if (Strstr(symname, "__plusplus__")) { DohSetInt(operators, "__plusplus__", 1); have_operators = 1; } else if (Strstr(symname, "__minmin__")) { DohSetInt(operators, "__minmin__", 1); have_operators = 1; } else if (Strstr(symname, "__mineq__")) { DohSetInt(operators, "__mineq__", 1); have_operators = 1; } else if (Strstr(symname, "__pluseq__")) { DohSetInt(operators, "__pluseq__", 1); have_operators = 1; } if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", cmodule, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } } return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * * Adds an instance member. * ----------------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { String *symname = Getattr(n, "sym:name"); /* SwigType *t = Getattr(n,"type"); */ /* Emit a pair of get/set functions for the variable */ member_func = 1; Language::membervariableHandler(n); member_func = 0; if (blessed) { Printv(pcode, "*swig_", symname, "_get = *", cmodule, "::", Swig_name_get(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)), ";\n", NIL); Printv(pcode, "*swig_", symname, "_set = *", cmodule, "::", Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, class_name, symname)), ";\n", NIL); /* Now we need to generate a little Perl code for this */ /* if (is_shadow(t)) { *//* This is a Perl object that we have already seen. Add an entry to the members list *//* Printv(blessedmembers, tab4, symname, " => '", is_shadow(t), "',\n", NIL); } */ } have_data_members++; return SWIG_OK; } /* ------------------------------------------------------------ * constructorDeclaration() * * Emits a blessed constructor for our class. In addition to our construct * we manage a Perl hash table containing all of the pointers created by * the constructor. This prevents us from accidentally trying to free * something that wasn't necessarily allocated by malloc or new * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Swig_save("perl5:constructorHandler", n, "parms", NIL); if (Swig_directorclass(n)) { Parm *parms = Getattr(n, "parms"); Parm *self; String *name = NewString("self"); String *type = NewString("SV"); SwigType_add_pointer(type); self = NewParm(type, name, n); Delete(type); Delete(name); Setattr(self, "lname", "O"); if (parms) set_nextSibling(self, parms); Setattr(n, "parms", self); Setattr(n, "wrap:self", "1"); Setattr(n, "hidden", "1"); Delete(self); } String *saved_nc = none_comparison; none_comparison = NewStringf("strcmp(SvPV_nolen(ST(0)), \"%s::%s\") != 0", module, class_name); String *saved_director_prot_ctor_code = director_prot_ctor_code; director_prot_ctor_code = NewStringf("if ($comparison) { /* subclassed */\n" " $director_new\n" "} else {\n" "SWIG_exception_fail(SWIG_RuntimeError, \"accessing abstract class or protected constructor\");\n" "}\n"); Language::constructorHandler(n); Delete(none_comparison); none_comparison = saved_nc; Delete(director_prot_ctor_code); director_prot_ctor_code = saved_director_prot_ctor_code; Swig_restore(n); if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", module, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { if ((Cmp(symname, class_name) == 0)) { /* Emit a blessed constructor */ Printf(pcode, "sub new {\n"); } else { /* Constructor doesn't match classname so we'll just use the normal name */ Printv(pcode, "sub ", Swig_name_construct(NSPACE_TODO, symname), " {\n", NIL); } const char *pkg = getCurrentClass() && Swig_directorclass(getCurrentClass())? "$_[0]" : "shift"; Printv(pcode, tab4, "my $pkg = ", pkg, ";\n", tab4, "my $self = ", cmodule, "::", Swig_name_construct(NSPACE_TODO, symname), "(@_);\n", tab4, "bless $self, $pkg if defined($self);\n", "}\n\n", NIL); have_constructor = 1; } } member_func = 0; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { String *symname = Getattr(n, "sym:name"); member_func = 1; Language::destructorHandler(n); if (blessed) { if (Getattr(n, "feature:shadow")) { String *plcode = perlcode(Getattr(n, "feature:shadow"), 0); String *plaction = NewStringf("%s::%s", module, Swig_name_member(NSPACE_TODO, class_name, symname)); Replaceall(plcode, "$action", plaction); Delete(plaction); Printv(pcode, plcode, NIL); } else { Printv(pcode, "sub DESTROY {\n", tab4, "return unless $_[0]->isa('HASH');\n", tab4, "my $self = tied(%{$_[0]});\n", tab4, "return unless defined $self;\n", tab4, "delete $ITERATORS{$self};\n", tab4, "if (exists $OWNER{$self}) {\n", tab8, cmodule, "::", Swig_name_destroy(NSPACE_TODO, symname), "($self);\n", tab8, "delete $OWNER{$self};\n", tab4, "}\n}\n\n", NIL); have_destructor = 1; } } member_func = 0; return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { member_func = 1; Language::staticmemberfunctionHandler(n); member_func = 0; if ((blessed) && (!Getattr(n, "sym:nextSibling"))) { String *symname = Getattr(n, "sym:name"); Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { Language::staticmembervariableHandler(n); if (blessed) { String *symname = Getattr(n, "sym:name"); Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { String *symname = Getattr(n, "sym:name"); int oldblessed = blessed; /* Create a normal constant */ blessed = 0; Language::memberconstantHandler(n); blessed = oldblessed; if (blessed) { Printv(pcode, "*", symname, " = *", cmodule, "::", Swig_name_member(NSPACE_TODO, class_name, symname), ";\n", NIL); } return SWIG_OK; } /* ------------------------------------------------------------ * pragma() * * Pragma directive. * * %pragma(perl5) code="String" # Includes a string in the .pm file * %pragma(perl5) include="file.pl" # Includes a file in the .pm file * ------------------------------------------------------------ */ virtual int pragmaDirective(Node *n) { String *lang; String *code; String *value; if (!ImportMode) { lang = Getattr(n, "lang"); code = Getattr(n, "name"); value = Getattr(n, "value"); if (Strcmp(lang, "perl5") == 0) { if (Strcmp(code, "code") == 0) { /* Dump the value string into the .pm file */ if (value) { Printf(pragma_include, "%s\n", value); } } else if (Strcmp(code, "include") == 0) { /* Include a file into the .pm file */ if (value) { FILE *f = Swig_include_open(value); if (!f) { Swig_error(input_file, line_number, "Unable to locate file %s\n", value); } else { char buffer[4096]; while (fgets(buffer, 4095, f)) { Printf(pragma_include, "%s", buffer); } fclose(f); } } } else { Swig_error(input_file, line_number, "Unrecognized pragma.\n"); } } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * perlcode() - Output perlcode code into the shadow file * ------------------------------------------------------------ */ String *perlcode(String *code, const String *indent) { String *out = NewString(""); String *temp; char *t; if (!indent) indent = ""; temp = NewString(code); t = Char(temp); if (*t == '{') { Delitem(temp, 0); Delitem(temp, DOH_END); } /* Split the input text into lines */ List *clist = SplitLines(temp); Delete(temp); int initial = 0; String *s = 0; Iterator si; /* Get the initial indentation */ for (si = First(clist); si.item; si = Next(si)) { s = si.item; if (Len(s)) { char *c = Char(s); while (*c) { if (!isspace(*c)) break; initial++; c++; } if (*c && !isspace(*c)) break; else { initial = 0; } } } while (si.item) { s = si.item; if (Len(s) > initial) { char *c = Char(s); c += initial; Printv(out, indent, c, "\n", NIL); } else { Printv(out, "\n", NIL); } si = Next(si); } Delete(clist); return out; } /* ------------------------------------------------------------ * insertDirective() * * Hook for %insert directive. * ------------------------------------------------------------ */ virtual int insertDirective(Node *n) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); if ((!ImportMode) && (Cmp(section, "perl") == 0)) { Printv(additional_perl_code, code, NIL); } else { Language::insertDirective(n); } return SWIG_OK; } String *runtimeCode() { String *s = NewString(""); String *shead = Swig_include_sys("perlhead.swg"); if (!shead) { Printf(stderr, "*** Unable to open 'perlhead.swg'\n"); } else { Append(s, shead); Delete(shead); } String *serrors = Swig_include_sys("perlerrors.swg"); if (!serrors) { Printf(stderr, "*** Unable to open 'perlerrors.swg'\n"); } else { Append(s, serrors); Delete(serrors); } String *srun = Swig_include_sys("perlrun.swg"); if (!srun) { Printf(stderr, "*** Unable to open 'perlrun.swg'\n"); } else { Append(s, srun); Delete(srun); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigperlrun.h"); } virtual int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "\n"); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } virtual int classDirectorEnd(Node *n) { if (dirprot_mode()) { /* This implementation uses a std::map. It should be possible to rewrite it using a more elegant way, like copying the Java approach for the 'override' array. But for now, this seems to be the least intrusive way. */ Printf(f_directors_h, "\n"); Printf(f_directors_h, "/* Internal director utilities */\n"); Printf(f_directors_h, "public:\n"); Printf(f_directors_h, " bool swig_get_inner(const char *swig_protected_method_name) const {\n"); Printf(f_directors_h, " std::map::const_iterator iv = swig_inner.find(swig_protected_method_name);\n"); Printf(f_directors_h, " return (iv != swig_inner.end() ? iv->second : false);\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, " void swig_set_inner(const char *swig_protected_method_name, bool swig_val) const {\n"); Printf(f_directors_h, " swig_inner[swig_protected_method_name] = swig_val;\n"); Printf(f_directors_h, " }\n"); Printf(f_directors_h, "private:\n"); Printf(f_directors_h, " mutable std::map swig_inner;\n"); } Printf(f_directors_h, "};\n"); return Language::classDirectorEnd(n); } virtual int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *sub = NewString(""); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewString(""); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("SV"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) { \n", classname, target, call); Printf(w->def, " SWIG_DIRECTOR_RGTR((%s *)this, this); \n", basetype); Append(w->def, "}\n"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } Delete(sub); Delete(classname); Delete(supername); Delete(parms); return Language::classDirectorConstructor(n); } virtual int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewString(""); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewString(""); String *returntype = Getattr(n, "type"); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (!Cmp(returntype, "void") && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } if (!ignored_method) { String *pres = NewStringf("SV *%s", Swig_cresult_name()); Wrapper_add_local(w, Swig_cresult_name(), pres); Delete(pres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> Perl) */ String *parse_args = NewString(""); String *pstack = NewString(""); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); Wrapper_add_local(w, "SP", "dSP"); { String *ptype = Copy(getClassType()); SwigType_add_pointer(ptype); String *mangle = SwigType_manglestr(ptype); Wrapper_add_local(w, "swigself", "SV *swigself"); Printf(w->code, "swigself = SWIG_NewPointerObj(SWIG_as_voidptr(this), SWIGTYPE%s, SWIG_SHADOW);\n", mangle); Printf(w->code, "sv_bless(swigself, gv_stashpv(swig_get_class(), 0));\n"); Delete(mangle); Delete(ptype); Append(pstack, "XPUSHs(swigself);\n"); } Parm *p; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* old style? caused segfaults without the p!=0 check in the for() condition, and seems dangerous in the while loop as well. while (Getattr(p, "tmap:ignore")) { p = Getattr(p, "tmap:ignore:next"); } */ if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { sprintf(source, "obj%d", idx++); String *input = NewString(source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); Replaceall(tm, "$shadow", "0"); /* Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); */ Printv(wrap_args, "SV *", source, ";\n", NIL); Printv(wrap_args, tm, "\n", NIL); Putc('O', parse_args); Printv(pstack, "XPUSHs(", source, ");\n", NIL); p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { /* special handling for pointers to other C++ director classes. * ideally this would be left to a typemap, but there is currently no * way to selectively apply the dynamic_cast<> to classes that have * directors. in other words, the type "SwigDirector_$1_lname" only exists * for classes with directors. we avoid the problem here by checking * module.wrap::directormap, but it's not clear how to get a typemap to * do something similar. perhaps a new default typemap (in addition * to SWIGTYPE) called DIRECTORTYPE? */ if (SwigType_ispointer(ptype) || SwigType_isreference(ptype)) { Node *module = Getattr(parent, "module"); Node *target = Swig_directormap(module, ptype); sprintf(source, "obj%d", idx++); String *nonconst = 0; /* strip pointer/reference --- should move to Swig/stype.c */ String *nptype = NewString(Char(ptype) + 2); /* name as pointer */ String *ppname = Copy(pname); if (SwigType_isreference(ptype)) { Insert(ppname, 0, "&"); } /* if necessary, cast away const since Perl doesn't support it! */ if (SwigType_isconst(nptype)) { nonconst = NewStringf("nc_tmp_%s", pname); String *nonconst_i = NewStringf("= const_cast< %s >(%s)", SwigType_lstr(ptype, 0), ppname); Wrapper_add_localv(w, nonconst, SwigType_lstr(ptype, 0), nonconst, nonconst_i, NIL); Delete(nonconst_i); Swig_warning(WARN_LANG_DISCARD_CONST, input_file, line_number, "Target language argument '%s' discards const in director method %s::%s.\n", SwigType_str(ptype, pname), SwigType_namestr(c_classname), SwigType_namestr(name)); } else { nonconst = Copy(ppname); } Delete(nptype); Delete(ppname); String *mangle = SwigType_manglestr(ptype); if (target) { String *director = NewStringf("director_%s", mangle); Wrapper_add_localv(w, director, "Swig::Director *", director, "= 0", NIL); Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_DIRECTOR_CAST(%s);\n", director, nonconst); Printf(wrap_args, "if (!%s) {\n", director); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Append(wrap_args, "} else {\n"); Printf(wrap_args, "%s = %s->swig_get_self();\n", source, director); Printf(wrap_args, "SvREFCNT_inc((SV *)%s);\n", source); Append(wrap_args, "}\n"); Delete(director); } else { Wrapper_add_localv(w, source, "SV *", source, "= 0", NIL); Printf(wrap_args, "%s = SWIG_NewPointerObj(%s, SWIGTYPE%s, 0);\n", source, nonconst, mangle); Printf(pstack, "XPUSHs(sv_2mortal(%s));\n", source); } Putc('O', parse_args); Delete(mangle); Delete(nonconst); } else { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } } p = nextSibling(p); } /* add the method name as a PyString */ String *pyname = Getattr(n, "sym:name"); /* wrap complex arguments to PyObjects */ Printv(w->code, wrap_args, NIL); /* pass the method call on to the Python object */ if (dirprot_mode() && !is_public(n)) { Printf(w->code, "swig_set_inner(\"%s\", true);\n", name); } Append(w->code, "ENTER;\n"); Append(w->code, "SAVETMPS;\n"); Append(w->code, "PUSHMARK(SP);\n"); Append(w->code, pstack); Delete(pstack); Append(w->code, "PUTBACK;\n"); Printf(w->code, "call_method(\"%s\", G_EVAL | G_SCALAR);\n", pyname); if (dirprot_mode() && !is_public(n)) Printf(w->code, "swig_set_inner(\"%s\", false);\n", name); /* exception handling */ tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } Append(w->code, "if (SvTRUE(ERRSV)) {\n"); Append(w->code, " PUTBACK;\n FREETMPS;\n LEAVE;\n"); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { Replaceall(tm, "$error", "ERRSV"); Printv(w->code, Str(tm), "\n", NIL); } else { Printf(w->code, " Swig::DirectorMethodException::raise(ERRSV);\n", classname, pyname); } Append(w->code, "}\n"); Delete(tm); /* * Python method may return a simple object, or a tuple. * for in/out aruments, we have to extract the appropriate PyObjects from the tuple, * then marshal everything back to C/C++ (return value and output arguments). * */ /* marshal return value and other outputs (if any) from PyObject to C/C++ type */ String *cleanup = NewString(""); String *outarg = NewString(""); if (outputs > 1) { Wrapper_add_local(w, "output", "SV *output"); Printf(w->code, "if (count != %d) {\n", outputs); Printf(w->code, " Swig::DirectorTypeMismatchException::raise(\"Perl method %s.%sfailed to return a list.\");\n", classname, pyname); Append(w->code, "}\n"); } idx = 0; /* marshal return value */ if (!is_void) { Append(w->code, "SPAGAIN;\n"); Printf(w->code, "%s = POPs;\n", Swig_cresult_name()); tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { if (outputs > 1) { Printf(w->code, "output = POPs;\n"); Replaceall(tm, "$input", "output"); } else { Replaceall(tm, "$input", Swig_cresult_name()); } char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { if (outputs > 1) { Printf(w->code, "output = POPs;\n"); Replaceall(tm, "$result", "output"); } else { Replaceall(tm, "$result", Swig_cresult_name()); } Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } if (!ignored_method) { Append(w->code, "PUTBACK;\n"); Append(w->code, "FREETMPS;\n"); Append(w->code, "LEAVE;\n"); } if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewString(""); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } int classDirectorDisown(Node *n) { int rv; member_func = 1; rv = Language::classDirectorDisown(n); member_func = 0; if (rv == SWIG_OK && Swig_directorclass(n)) { String *symname = Getattr(n, "sym:name"); String *disown = Swig_name_disown(NSPACE_TODO, symname); Setattr(n, "perl5:directordisown", NewStringf("%s::%s", cmodule, disown)); } return rv; } int classDirectorDestructor(Node *n) { /* TODO: it would be nice if this didn't have to copy the body of Language::classDirectorDestructor() */ String *DirectorClassName = directorClassName(getCurrentClass()); String *body = NewString("\n"); String *ptype = Copy(getClassType()); SwigType_add_pointer(ptype); String *mangle = SwigType_manglestr(ptype); Printv(body, tab4, "dSP;\n", tab4, "SV *self = SWIG_NewPointerObj(SWIG_as_voidptr(this), SWIGTYPE", mangle, ", SWIG_SHADOW);\n", tab4, "\n", tab4, "sv_bless(self, gv_stashpv(swig_get_class(), 0));\n", tab4, "ENTER;\n", tab4, "SAVETMPS;\n", tab4, "PUSHMARK(SP);\n", tab4, "XPUSHs(self);\n", tab4, "XPUSHs(&PL_sv_yes);\n", tab4, "PUTBACK;\n", tab4, "call_method(\"DESTROY\", G_EVAL | G_VOID);\n", tab4, "FREETMPS;\n", tab4, "LEAVE;\n", NIL); Delete(mangle); Delete(ptype); if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw ();\n", DirectorClassName); Printf(f_directors, "%s::~%s() throw () {%s}\n\n", DirectorClassName, DirectorClassName, body); } else { Printf(f_directors_h, " virtual ~%s();\n", DirectorClassName); Printf(f_directors, "%s::~%s() {%s}\n\n", DirectorClassName, DirectorClassName, body); } return SWIG_OK; } }; /* ----------------------------------------------------------------------------- * swig_perl5() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_perl5() { return new PERL5(); } extern "C" Language *swig_perl5(void) { return new_swig_perl5(); } swig-3.0.12/Source/Modules/emit.cxx0000664000175000017500000003433513042756442016777 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * emit.cxx * * Useful functions for emitting various pieces of code. * ----------------------------------------------------------------------------- */ #include "swigmod.h" /* ----------------------------------------------------------------------------- * emit_return_variable() * * Emits a variable declaration for a function return value. * The variable name is always called result. * n => Node of the method being wrapped * rt => the return type * f => the wrapper to generate code into * ----------------------------------------------------------------------------- */ void emit_return_variable(Node *n, SwigType *rt, Wrapper *f) { if (!GetFlag(n, "tmap:out:optimal")) { if (rt && (SwigType_type(rt) != T_VOID)) { SwigType *vt = cplus_value_type(rt); SwigType *tt = vt ? vt : rt; SwigType *lt = SwigType_ltype(tt); String *lstr = SwigType_str(lt, Swig_cresult_name()); if (SwigType_ispointer(lt)) { Wrapper_add_localv(f, Swig_cresult_name(), lstr, "= 0", NULL); } else { Wrapper_add_local(f, Swig_cresult_name(), lstr); } if (vt) { Delete(vt); } Delete(lt); Delete(lstr); } } } /* ----------------------------------------------------------------------------- * emit_parameter_variables() * * Emits a list of variable declarations for function parameters. * The variable names are always called arg1, arg2, etc... * l => the parameter list * f => the wrapper to generate code into * ----------------------------------------------------------------------------- */ void emit_parameter_variables(ParmList *l, Wrapper *f) { Parm *p; String *tm; /* Emit function arguments */ Swig_cargs(f, l); /* Attach typemaps to parameters */ /* Swig_typemap_attach_parms("ignore",l,f); */ Swig_typemap_attach_parms("default", l, f); Swig_typemap_attach_parms("arginit", l, f); /* Apply the arginit and default */ p = l; while (p) { tm = Getattr(p, "tmap:arginit"); if (tm) { Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:arginit:next"); } else { p = nextSibling(p); } } /* Apply the default typemap */ p = l; while (p) { tm = Getattr(p, "tmap:default"); if (tm) { Replace(tm, "$target", Getattr(p, "lname"), DOH_REPLACE_ANY); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:default:next"); } else { p = nextSibling(p); } } } /* ----------------------------------------------------------------------------- * emit_attach_parmmaps() * * Attach the standard parameter related typemaps. * ----------------------------------------------------------------------------- */ void emit_attach_parmmaps(ParmList *l, Wrapper *f) { Swig_typemap_attach_parms("in", l, f); Swig_typemap_attach_parms("typecheck", l, 0); Swig_typemap_attach_parms("argout", l, f); Swig_typemap_attach_parms("check", l, f); Swig_typemap_attach_parms("freearg", l, f); { /* This is compatibility code to deal with the deprecated "ignore" typemap */ Parm *p = l; Parm *np; String *tm; while (p) { tm = Getattr(p, "tmap:in"); if (tm && checkAttribute(p, "tmap:in:numinputs", "0")) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); np = Getattr(p, "tmap:in:next"); while (p && (p != np)) { /* Setattr(p,"ignore","1"); Deprecate */ p = nextSibling(p); } } else if (tm) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Perform a sanity check on "in" and "freearg" typemaps. These must exactly match to avoid chaos. If a mismatch occurs, we nuke the freearg typemap */ { Parm *p = l; Parm *npin, *npfreearg; while (p) { npin = Getattr(p, "tmap:in:next"); /* if (Getattr(p,"tmap:ignore")) { npin = Getattr(p,"tmap:ignore:next"); } else if (Getattr(p,"tmap:in")) { npin = Getattr(p,"tmap:in:next"); } */ if (Getattr(p, "tmap:freearg")) { npfreearg = Getattr(p, "tmap:freearg:next"); if (npin != npfreearg) { while (p != npin) { Delattr(p, "tmap:freearg"); Delattr(p, "tmap:freearg:next"); p = nextSibling(p); } } } p = npin; } } /* Check for variable length arguments with no input typemap. If no input is defined, we set this to ignore and print a message. */ { Parm *p = l; Parm *lp = 0; while (p) { if (!checkAttribute(p, "tmap:in:numinputs", "0")) { lp = p; p = Getattr(p, "tmap:in:next"); continue; } if (SwigType_isvarargs(Getattr(p, "type"))) { Swig_warning(WARN_LANG_VARARGS, input_file, line_number, "Variable length arguments discarded.\n"); Setattr(p, "tmap:in", ""); } lp = 0; p = nextSibling(p); } /* Check if last input argument is variable length argument */ if (lp) { p = lp; while (p) { if (SwigType_isvarargs(Getattr(p, "type"))) { Setattr(l, "emit:varargs", lp); break; } p = nextSibling(p); } } } } /* ----------------------------------------------------------------------------- * emit_num_arguments() * * Calculate the total number of arguments. This function is safe for use * with multi-argument typemaps which may change the number of arguments in * strange ways. * ----------------------------------------------------------------------------- */ int emit_num_arguments(ParmList *parms) { Parm *p = parms; int nargs = 0; while (p) { if (Getattr(p, "tmap:in")) { nargs += GetInt(p, "tmap:in:numinputs"); p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } /* ----------------------------------------------------------------------------- * emit_num_required() * * Computes the number of required arguments. This function is safe for * use with multi-argument typemaps and knows how to skip over everything * properly. Note that parameters with default values are counted unless * the compact default args option is on. * ----------------------------------------------------------------------------- */ int emit_num_required(ParmList *parms) { Parm *p = parms; int nargs = 0; Parm *first_default_arg = 0; int compactdefargs = ParmList_is_compactdefargs(p); while (p) { if (Getattr(p, "tmap:in") && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } else { if (Getattr(p, "tmap:default")) break; if (Getattr(p, "value")) { if (!first_default_arg) first_default_arg = p; if (compactdefargs) break; } nargs += GetInt(p, "tmap:in:numinputs"); if (Getattr(p, "tmap:in")) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Print error message for non-default arguments following default arguments */ /* The error message is printed more than once with most language modules, this ought to be fixed */ if (first_default_arg) { p = first_default_arg; while (p) { if (Getattr(p, "tmap:in") && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } else { if (!Getattr(p, "value") && (!Getattr(p, "tmap:default"))) { Swig_error(Getfile(p), Getline(p), "Non-optional argument '%s' follows an optional argument.\n", Getattr(p, "name")); } if (Getattr(p, "tmap:in")) { p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } } /* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */ /* if (parms && (p = Getattr(parms,"emit:varargs"))) { if (!nextSibling(p)) { nargs--; } } */ return nargs; } /* ----------------------------------------------------------------------------- * emit_isvarargs() * * Checks if a function is a varargs function * ----------------------------------------------------------------------------- */ int emit_isvarargs(ParmList *p) { if (!p) return 0; if (Getattr(p, "emit:varargs")) return 1; return 0; } /* ----------------------------------------------------------------------------- * void emit_mark_vararg_parms() * * Marks the vararg parameters which are to be ignored. * Vararg parameters are marked as ignored if there is no 'in' varargs (...) * typemap. * ----------------------------------------------------------------------------- */ void emit_mark_varargs(ParmList *l) { Parm *p = l; while (p) { if (SwigType_isvarargs(Getattr(p, "type"))) if (!Getattr(p, "tmap:in")) Setattr(p, "varargs:ignore", "1"); p = nextSibling(p); } } #if 0 /* replace_contract_args. This function replaces argument names in contract specifications. Used in conjunction with the %contract directive. */ static void replace_contract_args(Parm *cp, Parm *rp, String *s) { while (cp && rp) { String *n = Getattr(cp, "name"); if (n) { Replace(s, n, Getattr(rp, "lname"), DOH_REPLACE_ID); } cp = nextSibling(cp); rp = nextSibling(rp); } } #endif /* ----------------------------------------------------------------------------- * int emit_action_code() * * Emits action code for a wrapper. Adds in exception handling code (%exception). * eaction -> the action code to emit * wrappercode -> the emitted code (output) * ----------------------------------------------------------------------------- */ int emit_action_code(Node *n, String *wrappercode, String *eaction) { assert(Getattr(n, "wrap:name")); /* Look for except feature (%exception) */ String *tm = GetFlagAttr(n, "feature:except"); if (tm) tm = Copy(tm); if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Strstr(tm, "$")) { Swig_replace_special_variables(n, parentNode(n), tm); Replaceall(tm, "$function", eaction); // deprecated Replaceall(tm, "$action", eaction); } Printv(wrappercode, tm, "\n", NIL); Delete(tm); return 1; } else { Printv(wrappercode, eaction, "\n", NIL); return 0; } } /* ----------------------------------------------------------------------------- * int emit_action() * * Emits the call to the wrapped function. * Adds in exception specification exception handling and %exception code. * ----------------------------------------------------------------------------- */ String *emit_action(Node *n) { String *actioncode = NewStringEmpty(); String *tm; String *action; String *wrap; ParmList *catchlist = Getattr(n, "catchlist"); /* Look for fragments */ { String *fragment = Getattr(n, "feature:fragment"); if (fragment) { char *c, *tok; String *t = Copy(fragment); c = Char(t); tok = strtok(c, ","); while (tok) { String *fname = NewString(tok); Setfile(fname, Getfile(n)); Setline(fname, Getline(n)); Swig_fragment_emit(fname); Delete(fname); tok = strtok(NULL, ","); } Delete(t); } } /* Emit wrapper code (if any) */ wrap = Getattr(n, "wrap:code"); if (wrap && Swig_filebyname("header") != Getattr(n, "wrap:code:done")) { File *f_code = Swig_filebyname("header"); if (f_code) { Printv(f_code, wrap, NIL); } Setattr(n, "wrap:code:done", f_code); } action = Getattr(n, "feature:action"); if (!action) action = Getattr(n, "wrap:action"); assert(action != 0); /* Emit contract code (if any) */ if (Swig_contract_mode_get()) { /* Preassertion */ tm = Getattr(n, "contract:preassert"); if (Len(tm)) { Printv(actioncode, tm, "\n", NIL); } } /* Exception handling code */ /* saves action -> eaction for postcatching exception */ String *eaction = NewString(""); /* If we are in C++ mode and there is an exception specification. We're going to enclose the block in a try block */ if (catchlist) { Printf(eaction, "try {\n"); } String *preaction = Getattr(n, "wrap:preaction"); if (preaction) Printv(eaction, preaction, NIL); Printv(eaction, action, NIL); String *postaction = Getattr(n, "wrap:postaction"); if (postaction) Printv(eaction, postaction, NIL); if (catchlist) { int unknown_catch = 0; int has_varargs = 0; Printf(eaction, "}\n"); for (Parm *ep = catchlist; ep; ep = nextSibling(ep)) { String *em = Swig_typemap_lookup("throws", ep, "_e", 0); if (em) { SwigType *et = Getattr(ep, "type"); SwigType *etr = SwigType_typedef_resolve_all(et); if (SwigType_isreference(etr) || SwigType_ispointer(etr) || SwigType_isarray(etr)) { Printf(eaction, "catch(%s) {", SwigType_str(et, "_e")); } else if (SwigType_isvarargs(etr)) { Printf(eaction, "catch(...) {"); has_varargs = 1; } else { Printf(eaction, "catch(%s) {", SwigType_str(et, "&_e")); } Printv(eaction, em, "\n", NIL); Printf(eaction, "}\n"); } else { Swig_warning(WARN_TYPEMAP_THROW, Getfile(n), Getline(n), "No 'throws' typemap defined for exception type '%s'\n", SwigType_str(Getattr(ep, "type"), 0)); unknown_catch = 1; } } if (unknown_catch && !has_varargs) { Printf(eaction, "catch(...) { throw; }\n"); } } /* Look for except typemap (Deprecated) */ tm = Swig_typemap_lookup("except", n, Swig_cresult_name(), 0); if (tm) { Setattr(n, "feature:except", tm); tm = 0; } /* emit the except feature code */ emit_action_code(n, actioncode, eaction); Delete(eaction); /* Emit contract code (if any) */ if (Swig_contract_mode_get()) { /* Postassertion */ tm = Getattr(n, "contract:postassert"); if (Len(tm)) { Printv(actioncode, tm, "\n", NIL); } } return actioncode; } swig-3.0.12/Source/Modules/cffi.cxx0000664000175000017500000010631313042756442016744 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cffi.cxx * * cffi language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include //#define CFFI_DEBUG //#define CFFI_WRAP_DEBUG static const char *usage = "\ CFFI Options (available with -cffi)\n\ -generate-typedef - Use defctype to generate shortcuts according to the\n\ typedefs in the input.\n\ -[no]cwrap - Turn on or turn off generation of an intermediate C\n\ file when creating a C interface. By default this is\n\ only done for C++ code.\n\ -[no]swig-lisp - Turn on or off generation of code for helper lisp\n\ macro, functions, etc. which SWIG uses while\n\ generating wrappers. These macros, functions may still\n\ be used by generated wrapper code.\n\ "; class CFFI:public Language { public: String *f_cl; String *f_clhead; String *f_clwrap; bool CWrap; // generate wrapper file for C code? File *f_begin; File *f_runtime; File *f_cxx_header; File *f_cxx_wrapper; File *f_clos; String *module; virtual void main(int argc, char *argv[]); virtual int top(Node *n); virtual int functionWrapper(Node *n); virtual int variableWrapper(Node *n); virtual int constantWrapper(Node *n); // virtual int classDeclaration(Node *n); virtual int enumDeclaration(Node *n); virtual int typedefHandler(Node *n); //c++ specific code virtual int constructorHandler(Node *n); virtual int destructorHandler(Node *n); virtual int memberfunctionHandler(Node *n); virtual int membervariableHandler(Node *n); virtual int classHandler(Node *n); private: static void checkConstraints(ParmList *parms, Wrapper *f); static void argout(ParmList *parms, Wrapper *f); static String *freearg(ParmList *parms); static void cleanupFunction(Node *n, Wrapper *f, ParmList *parms); void emit_defun(Node *n, String *name); void emit_defmethod(Node *n); void emit_initialize_instance(Node *n); void emit_getter(Node *n); void emit_setter(Node *n); void emit_class(Node *n); void emit_struct_union(Node *n, bool un); void emit_export(Node *n, String *name); void emit_inline(Node *n, String *name); String *lispy_name(char *name); String *lispify_name(Node *n, String *ty, const char *flag, bool kw = false); String *convert_literal(String *num_param, String *type, bool try_to_split = true); String *infix_to_prefix(String *val, char split_op, const String *op, String *type); String *strip_parens(String *string); String *trim(String *string); int generate_typedef_flag; bool no_swig_lisp; }; void CFFI::main(int argc, char *argv[]) { int i; Preprocessor_define("SWIGCFFI 1", 0); SWIG_library_directory("cffi"); SWIG_config_file("cffi.swg"); generate_typedef_flag = 0; no_swig_lisp = false; CWrap = false; for (i = 1; i < argc; i++) { if (!Strcmp(argv[i], "-help")) { Printf(stdout, "%s\n", usage); } else if (!strcmp(argv[i], "-cwrap")) { CWrap = true; Swig_mark_arg(i); } else if ((Strcmp(argv[i], "-generate-typedef") == 0)) { generate_typedef_flag = 1; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-nocwrap")) { CWrap = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-swig-lisp")) { no_swig_lisp = false; Swig_mark_arg(i); } else if (!strcmp(argv[i], "-noswig-lisp")) { no_swig_lisp = true; Swig_mark_arg(i); } } f_clhead = NewString(""); f_clwrap = NewString(""); f_cl = NewString(""); allow_overloading(); } int CFFI::top(Node *n) { File *f_null = NewString(""); module = Getattr(n, "name"); String *cxx_filename = Getattr(n, "outfile"); String *lisp_filename = NewString(""); Printf(lisp_filename, "%s%s.lisp", SWIG_output_directory(), module); File *f_lisp = NewFile(lisp_filename, "w", SWIG_output_files()); if (!f_lisp) { FileErrorDisplay(lisp_filename); SWIG_exit(EXIT_FAILURE); } if (CPlusPlus || CWrap) { f_begin = NewFile(cxx_filename, "w", SWIG_output_files()); if (!f_begin) { Delete(f_lisp); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } String *clos_filename = NewString(""); Printf(clos_filename, "%s%s-clos.lisp", SWIG_output_directory(), module); f_clos = NewFile(clos_filename, "w", SWIG_output_files()); if (!f_clos) { Delete(f_lisp); Printf(stderr, "Unable to open %s for writing\n", cxx_filename); SWIG_exit(EXIT_FAILURE); } } else { f_begin = NewString(""); f_clos = NewString(""); } f_runtime = NewString(""); f_cxx_header = f_runtime; f_cxx_wrapper = NewString(""); Swig_register_filebyname("header", f_cxx_header); Swig_register_filebyname("wrapper", f_cxx_wrapper); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("lisphead", f_clhead); if (!no_swig_lisp) Swig_register_filebyname("swiglisp", f_cl); else Swig_register_filebyname("swiglisp", f_null); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGCFFI\n#define SWIGCFFI\n#endif\n\n"); Swig_banner_target_lang(f_lisp, ";;;"); Language::top(n); Printf(f_lisp, "%s\n", f_clhead); Printf(f_lisp, "%s\n", f_cl); Printf(f_lisp, "%s\n", f_clwrap); Delete(f_lisp); Delete(f_cl); Delete(f_clhead); Delete(f_clwrap); Dump(f_runtime, f_begin); Delete(f_runtime); Delete(f_begin); Delete(f_cxx_wrapper); Delete(f_null); return SWIG_OK; } int CFFI::classHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "class %s::%s\n", "some namespace", //current_namespace, Getattr(n, "sym:name")); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); // maybe just remove this check and get rid of the else clause below. if (Strcmp(kind, "struct") == 0) { emit_struct_union(n, false); return SWIG_OK; } else if (Strcmp(kind, "union") == 0) { emit_struct_union(n, true); return SWIG_OK; } else if (Strcmp(kind, "class") == 0) { emit_class(n); Language::classHandler(n); } else { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); return SWIG_OK; } return SWIG_OK; } int CFFI::constructorHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "constructor %s\n", Getattr(n, "name")); Printf(stderr, "constructor %s\n and %s and %s", Getattr(n, "kind"), Getattr(n, "sym:name"), Getattr(n, "allegrocl:old-sym:name")); #endif Setattr(n, "cffi:constructorfunction", "1"); // Let SWIG generate a global forwarding function. return Language::constructorHandler(n); } int CFFI::destructorHandler(Node *n) { #ifdef CFFI_DEBUG Printf(stderr, "destructor %s\n", Getattr(n, "name")); #endif // Let SWIG generate a global forwarding function. return Language::destructorHandler(n); } void CFFI::emit_defmethod(Node *n) { String *args_placeholder = NewStringf(""); String *args_call = NewStringf(""); ParmList *pl = Getattr(n, "parms"); int argnum = 0; Node *parent = getCurrentClass(); bool first = 0; for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); String *ffitype = Swig_typemap_lookup("lispclass", p, "", 0); int tempargname = 0; if(!first) first = true; else Printf(args_placeholder, " "); if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t-arg%d", argnum); tempargname = 1; } if (Len(ffitype) > 0) Printf(args_placeholder, "(%s %s)", argname, ffitype); else Printf(args_placeholder, "%s", argname); if (ffitype && Strcmp(ffitype, lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'classname")) == 0) Printf(args_call, " (ff-pointer %s)", argname); else Printf(args_call, " %s", argname); Delete(ffitype); if (tempargname) Delete(argname); } String *method_name = Getattr(n, "name"); int x = Replace(method_name, "operator ", "", DOH_REPLACE_FIRST); // if (x == 1) Printf(f_clos, "(cl:shadow \"%s\")\n", method_name); Printf(f_clos, "(cl:defmethod %s (%s)\n (%s%s))\n\n", lispify_name(n, lispy_name(Char(method_name)), "'method"), args_placeholder, lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call); } void CFFI::emit_initialize_instance(Node *n) { String *args_placeholder = NewStringf(""); String *args_call = NewStringf(""); ParmList *pl = Getattr(n, "parms"); int argnum = 0; Node *parent = getCurrentClass(); for (Parm *p = pl; p; p = nextSibling(p), argnum++) { String *argname = Getattr(p, "name"); String *ffitype = Swig_typemap_lookup("lispclass", p, "", 0); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t-arg%d", argnum); tempargname = 1; } if (Len(ffitype) > 0) Printf(args_placeholder, " (%s %s)", argname, ffitype); else Printf(args_placeholder, " %s", argname); if (ffitype && Strcmp(ffitype, lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'classname")) == 0) Printf(args_call, " (ff-pointer %s)", argname); else Printf(args_call, " %s", argname); Delete(ffitype); if (tempargname) Delete(argname); } Printf(f_clos, "(cl:defmethod initialize-instance :after ((obj %s) &key%s)\n (setf (slot-value obj 'ff-pointer) (%s%s)))\n\n", lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), args_placeholder, lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call); } void CFFI::emit_setter(Node *n) { Node *parent = getCurrentClass(); Printf(f_clos, "(cl:defmethod (cl:setf %s) (arg0 (obj %s))\n (%s (ff-pointer obj) arg0))\n\n", lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); } void CFFI::emit_getter(Node *n) { Node *parent = getCurrentClass(); Printf(f_clos, "(cl:defmethod %s ((obj %s))\n (%s (ff-pointer obj)))\n\n", lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); } int CFFI::memberfunctionHandler(Node *n) { // Let SWIG generate a global forwarding function. Setattr(n, "cffi:memberfunction", "1"); return Language::memberfunctionHandler(n); } int CFFI::membervariableHandler(Node *n) { // Let SWIG generate a get/set function pair. Setattr(n, "cffi:membervariable", "1"); return Language::membervariableHandler(n); } void CFFI::checkConstraints(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:check"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n\n", NULL); Delete(tm); p = Getattr(p, "tmap:check:next"); } } } void CFFI::argout(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:argout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:argout:next"); } } } String *CFFI::freearg(ParmList *parms) { String *ret = NewString(""); Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:freearg"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(ret, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:freearg:next"); } } return ret; } void CFFI::cleanupFunction(Node *n, Wrapper *f, ParmList *parms) { String *cleanup = freearg(parms); Printv(f->code, cleanup, NULL); if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } } Replaceall(f->code, "$cleanup", cleanup); Delete(cleanup); Replaceall(f->code, "$symname", Getattr(n, "sym:name")); } int CFFI::functionWrapper(Node *n) { ParmList *parms = Getattr(n, "parms"); String *iname = Getattr(n, "sym:name"); Wrapper *f = NewWrapper(); String *raw_return_type = Swig_typemap_lookup("ctype", n, "", 0); SwigType *return_type = Swig_cparse_type(raw_return_type); SwigType *resolved = SwigType_typedef_resolve_all(return_type); int is_void_return = (Cmp(resolved, "void") == 0); Delete(resolved); if (!is_void_return) { String *lresult_init = NewStringf("lresult = (%s)0", raw_return_type); Wrapper_add_localv(f, "lresult", raw_return_type, lresult_init, NIL); Delete(lresult_init); } String *overname = 0; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } String *wname = Swig_name_wrapper(iname); if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Emit all of the local variables for holding arguments. emit_parameter_variables(parms, f); // Attach the standard typemaps Swig_typemap_attach_parms("ctype", parms, f); emit_attach_parmmaps(parms, f); int num_arguments = emit_num_arguments(parms); String *name_and_parms = NewStringf("%s (", wname); int i; Parm *p; int gencomma = 0; #ifdef CFFI_DEBUG Printf(stderr, "function - %s - %d\n", Getattr(n, "name"), num_arguments); #endif for (i = 0, p = parms; i < num_arguments; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); String *arg = NewStringf("l%s", Getattr(p, "lname")); // Emit parameter declaration if (gencomma) Printf(name_and_parms, ", "); String *parm_decl = SwigType_str(c_parm_type, arg); Printf(name_and_parms, "%s", parm_decl); #ifdef CFFI_DEBUG Printf(stderr, " param: %s\n", parm_decl); #endif Delete(parm_decl); gencomma = 1; // Emit parameter conversion code String *parm_code = Getattr(p, "tmap:in"); { Replaceall(parm_code, "$input", arg); Setattr(p, "emit:input", arg); Printf(f->code, "%s\n", parm_code); p = Getattr(p, "tmap:in:next"); } Delete(arg); } Printf(name_and_parms, ")"); // Emit the function definition String *signature = SwigType_str(return_type, name_and_parms); Printf(f->def, "EXPORT %s {", signature); checkConstraints(parms, f); Printf(f->code, " try {\n"); String *actioncode = emit_action(n); String *result_convert = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (result_convert) { Replaceall(result_convert, "$result", "lresult"); Printf(f->code, "%s\n", result_convert); } Delete(result_convert); argout(parms, f); cleanupFunction(n, f, parms); /* See if there is any return cleanup code */ String *tm = 0; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } if (!is_void_return) { Printf(f->code, " return lresult;\n"); } emit_return_variable(n, Getattr(n, "type"), f); Printf(f->code, " } catch (...) {\n"); if (!is_void_return) Printf(f->code, " return (%s)0;\n", raw_return_type); Printf(f->code, " }\n"); Printf(f->code, "}\n"); if (CPlusPlus) Wrapper_print(f, f_runtime); if (CPlusPlus) { emit_defun(n, wname); if (Getattr(n, "cffi:memberfunction")) emit_defmethod(n); else if (Getattr(n, "cffi:membervariable")) { if (Getattr(n, "memberget")) emit_getter(n); else if (Getattr(n, "memberset")) emit_setter(n); } else if (Getattr(n, "cffi:constructorfunction")) { emit_initialize_instance(n); } } else emit_defun(n, iname); // if (!overloaded || !Getattr(n, "sym:nextSibling")) { // update_package_if_needed(n); // emit_buffered_defuns(n); // // this is the last overload. // if (overloaded) { // emit_dispatch_defun(n); // } // } Delete(wname); DelWrapper(f); return SWIG_OK; } void CFFI::emit_defun(Node *n, String *name) { String *func_name = Getattr(n, "sym:name"); ParmList *pl = Getattr(n, "parms"); int argnum = 0; func_name = lispify_name(n, func_name, "'function"); emit_inline(n, func_name); Printf(f_cl, "\n(cffi:defcfun (\"%s\" %s)", name, func_name); String *ffitype = Swig_typemap_lookup("cout", n, ":pointer", 0); Printf(f_cl, " %s", ffitype); Delete(ffitype); for (Parm *p = pl; p; p = nextSibling(p), argnum++) { if (SwigType_isvarargs(Getattr(p, "type"))) { Printf(f_cl, "\n %s", NewString("&rest")); continue; } String *argname = Getattr(p, "name"); ffitype = Swig_typemap_lookup("cin", p, "", 0); int tempargname = 0; if (!argname) { argname = NewStringf("arg%d", argnum); tempargname = 1; } else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) { argname = NewStringf("t_arg%d", argnum); tempargname = 1; } Printf(f_cl, "\n (%s %s)", argname, ffitype); Delete(ffitype); if (tempargname) Delete(argname); } Printf(f_cl, ")\n"); /* finish arg list */ emit_export(n, func_name); } int CFFI::constantWrapper(Node *n) { String *type = Getattr(n, "type"); String *converted_value; if (SwigType_type(type) == T_STRING) { converted_value = NewString(Getattr(n, "rawval")); } else { converted_value = convert_literal(Getattr(n, "value"), type); } String *name = lispify_name(n, Getattr(n, "sym:name"), "'constant"); if (Strcmp(name, "t") == 0 || Strcmp(name, "T") == 0) name = NewStringf("t_var"); Printf(f_cl, "\n(cl:defconstant %s %s)\n", name, converted_value); Delete(converted_value); emit_export(n, name); return SWIG_OK; } int CFFI::variableWrapper(Node *n) { String *var_name = Getattr(n, "sym:name"); String *lisp_type = Swig_typemap_lookup("cin", n, "", 0); String *lisp_name = lispify_name(n, var_name, "'variable"); if (Strcmp(lisp_name, "t") == 0 || Strcmp(lisp_name, "T") == 0) lisp_name = NewStringf("t_var"); Printf(f_cl, "\n(cffi:defcvar (\"%s\" %s)\n %s)\n", var_name, lisp_name, lisp_type); Delete(lisp_type); emit_export(n, lisp_name); return SWIG_OK; } int CFFI::typedefHandler(Node *n) { if (generate_typedef_flag && strncmp(Char(Getattr(n, "type")), "enum", 4)) { String *lisp_name = lispify_name(n, Getattr(n, "name"), "'typename"); Printf(f_cl, "\n(cffi:defctype %s %s)\n", lisp_name, Swig_typemap_lookup("cin", n, "", 0)); emit_export(n, lisp_name); } return Language::typedefHandler(n); } int CFFI::enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = Getattr(n, "sym:name"); bool slot_name_keywords; String *lisp_name = 0; if (name && Len(name) != 0) { lisp_name = lispify_name(n, name, "'enumname"); if (GetFlag(n, "feature:bitfield")) { Printf(f_cl, "\n(cffi:defbitfield %s", lisp_name); } else { Printf(f_cl, "\n(cffi:defcenum %s", lisp_name); } slot_name_keywords = true; //Registering the enum name to the cin and cout typemaps Parm *pattern = NewParm(name, NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); //Registering with the kind, i.e., enum pattern = NewParm(NewStringf("enum %s", name), NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); } else { Printf(f_cl, "\n(defanonenum %s", name); slot_name_keywords = false; } for (Node *c = firstChild(n); c; c = nextSibling(c)) { String *slot_name = lispify_name(c, Getattr(c, "name"), "'enumvalue", slot_name_keywords); String *value = Getattr(c, "enumvalue"); if (!value || GetFlag(n, "feature:bitfield:ignore_values")) Printf(f_cl, "\n\t%s", slot_name); else { String *type = Getattr(c, "type"); String *converted_value = convert_literal(value, type); Printf(f_cl, "\n\t(%s #.%s)", slot_name, converted_value); Delete(converted_value); } Delete(value); } Printf(f_cl, ")\n"); // No need to export keywords if (lisp_name && Len(lisp_name) != 0) { emit_export(n, lisp_name); } else { for (Node *c = firstChild(n); c; c = nextSibling(c)) emit_export(c, lispify_name(c, Getattr(c, "name"), "'enumvalue")); } return SWIG_OK; } void CFFI::emit_class(Node *n) { #ifdef CFFI_WRAP_DEBUG Printf(stderr, "emit_class: ENTER... '%s'(%p)\n", Getattr(n, "sym:name"), n); #endif String *name = Getattr(n, "sym:name"); String *lisp_name = lispify_name(n, lispy_name(Char(name)), "'classname"); String *bases = Getattr(n, "bases"); String *supers = NewString("("); if (bases) { int first = 1; for (Iterator i = First(bases); i.item; i = Next(i)) { if (!first) Printf(supers, " "); String *s = Getattr(i.item, "name"); Printf(supers, "%s", lispify_name(i.item, lispy_name(Char(s)), "'classname")); } } else { // Printf(supers,"ff:foreign-pointer"); } Printf(supers, ")"); Printf(f_clos, "\n(cl:defclass %s%s", lisp_name, supers); Printf(f_clos, "\n ((ff-pointer :reader ff-pointer)))\n\n"); Parm *pattern = NewParm(Getattr(n, "name"), NULL, n); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_add_pointer(Getattr(pattern, "type")); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_add_qualifier(Getattr(pattern, "type"), "const"); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); SwigType_del_pointer(Getattr(pattern, "type")); SwigType_add_reference(Getattr(pattern, "type")); Swig_typemap_register("lispclass", pattern, lisp_name, NULL, NULL); #ifdef CFFI_WRAP_DEBUG Printf(stderr, " pattern %s name %s .. ... %s .\n", pattern, lisp_name); #endif Delete(pattern); // Walk children to generate type definition. String *slotdefs = NewString(" "); #ifdef CFFI_WRAP_DEBUG Printf(stderr, " walking children...\n"); #endif Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { String *storage_type = Getattr(c, "storage"); if ((!Strcmp(nodeType(c), "cdecl") && (!storage_type || Strcmp(storage_type, "typedef")))) { String *access = Getattr(c, "access"); // hack. why would decl have a value of "variableHandler" and now "0"? String *childDecl = Getattr(c, "decl"); // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); if (!Strcmp(childDecl, "0")) childDecl = NewString(""); SwigType *childType = NewStringf("%s%s", childDecl, Getattr(c, "type")); String *cname = (access && Strcmp(access, "public")) ? NewString("nil") : Copy(Getattr(c, "name")); if (!SwigType_isfunction(childType)) { // Printf(slotdefs, ";;; member functions don't appear as slots.\n "); // Printf(slotdefs, ";; "); // String *ns = listify_namespace(Getattr(n, "cffi:package")); String *ns = NewString(""); #ifdef CFFI_WRAP_DEBUG Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); #endif Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, childType); //compose_foreign_type(childType) Delete(ns); if (access && Strcmp(access, "public")) Printf(slotdefs, " ;; %s member", access); Printf(slotdefs, "\n "); } Delete(childType); Delete(cname); } } // String *ns_list = listify_namespace(Getattr(n,"cffi:namespace")); // update_package_if_needed(n,f_clhead); // Printf(f_clos, // "(swig-def-foreign-class \"%s\"\n %s\n (:%s\n%s))\n\n", // name, supers, kind, slotdefs); Delete(supers); // Delete(ns_list); // Parm *pattern = NewParm(name, NULL, n); // Swig_typemap_register("cin",pattern,lisp_name,NULL,NULL); //Swig_typemap_register("cout",pattern,lisp_name,NULL,NULL); //Delete(pattern); #ifdef CFFI_WRAP_DEBUG Printf(stderr, "emit_class: EXIT\n"); #endif } // Includes structs void CFFI::emit_struct_union(Node *n, bool un = false) { #ifdef CFFI_DEBUG Printf(stderr, "struct/union %s\n", Getattr(n, "name")); Printf(stderr, "struct/union %s\n and %s", Getattr(n, "kind"), Getattr(n, "sym:name")); #endif String *name = Getattr(n, "sym:name"); String *kind = Getattr(n, "kind"); if (Strcmp(kind, "struct") != 0 && Strcmp(kind, "union") != 0) { Printf(stderr, "Don't know how to deal with %s kind of class yet.\n", kind); Printf(stderr, " (name: %s)\n", name); SWIG_exit(EXIT_FAILURE); } String *lisp_name = lispify_name(n, name, "'classname"); //Register the struct/union name to the cin and cout typemaps Parm *pattern = NewParm(name, NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); //Registering with the kind, i.e., struct or union pattern = NewParm(NewStringf("%s %s", kind, name), NULL, n); Swig_typemap_register("cin", pattern, lisp_name, NULL, NULL); Swig_typemap_register("cout", pattern, lisp_name, NULL, NULL); Delete(pattern); if (un) { Printf(f_cl, "\n(cffi:defcunion %s", lisp_name); } else Printf(f_cl, "\n(cffi:defcstruct %s", lisp_name); for (Node *c = firstChild(n); c; c = nextSibling(c)) { #ifdef CFFI_DEBUG Printf(stderr, "struct/union %s\n", Getattr(c, "name")); Printf(stderr, "struct/union %s and %s \n", Getattr(c, "kind"), Getattr(c, "sym:name")); #endif if (Strcmp(nodeType(c), "cdecl")) { //C declaration ignore // Printf(stderr, "Structure %s has a slot that we can't deal with.\n", // name); // Printf(stderr, "nodeType: %s, name: %s, type: %s\n", // nodeType(c), // Getattr(c, "name"), // Getattr(c, "type")); // SWIG_exit(EXIT_FAILURE); } else { SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), Getattr(c, "type")); Node *node = NewHash(); Setattr(node, "type", childType); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup("cin", node, "", 0); String *typespec = tm ? NewString(tm) : NewString(""); String *slot_name = lispify_name(c, Getattr(c, "sym:name"), "'slotname"); if (slot_name && (Strcmp(slot_name, "t") == 0 || Strcmp(slot_name, "T") == 0)) slot_name = NewStringf("t_var"); if (SwigType_isarray(childType) && SwigType_array_ndim(childType) == 1) { String *dim = SwigType_array_getdim(childType, 0); Printf(f_cl, "\n\t(%s %s :count %s)", slot_name, typespec, dim); Delete(dim); } else Printf(f_cl, "\n\t(%s %s)", slot_name, typespec); Delete(node); Delete(childType); Delete(typespec); } } Printf(f_cl, ")\n"); emit_export(n, lisp_name); for (Node *child = firstChild(n); child; child = nextSibling(child)) { if (!Strcmp(nodeType(child), "cdecl")) { emit_export(child, lispify_name(child, Getattr(child, "sym:name"), "'slotname")); } } /* Add this structure to the known lisp types */ //Printf(stdout, "Adding %s foreign type\n", name); // add_defined_foreign_type(name); } void CFFI::emit_export(Node *n, String *name) { if (GetInt(n, "feature:export")) { String* package = Getattr(n, "feature:export:package"); Printf(f_cl, "\n(cl:export '%s%s%s)\n", name, package ? " " : "", package ? package : ""); } } void CFFI::emit_inline(Node *n, String *name) { if (GetInt(n, "feature:inline")) Printf(f_cl, "\n(cl:declaim (cl:inline %s))\n", name); } String *CFFI::lispify_name(Node *n, String *ty, const char *flag, bool kw) { String *intern_func = Getattr(n, "feature:intern_function"); if (intern_func) { if (Strcmp(intern_func, "1") == 0) intern_func = NewStringf("swig-lispify"); return NewStringf("#.(%s \"%s\" %s%s)", intern_func, ty, flag, kw ? " :keyword" : ""); } else if (kw) return NewStringf(":%s", ty); else return ty; } /* utilities */ /* returns new string w/ parens stripped */ String *CFFI::strip_parens(String *string) { char *s = Char(string), *p; int len = Len(string); String *res; if (len == 0 || s[0] != '(' || s[len - 1] != ')') { return NewString(string); } p = (char *) malloc(len - 2 + 1); if (!p) { Printf(stderr, "Malloc failed\n"); SWIG_exit(EXIT_FAILURE); } strncpy(p, s + 1, len - 1); p[len - 2] = 0; /* null terminate */ res = NewString(p); free(p); return res; } String *CFFI::trim(String *str) { char *c = Char(str); while (*c != '\0' && isspace((int) *c)) ++c; String *result = NewString(c); Chop(result); return result; } String *CFFI::infix_to_prefix(String *val, char split_op, const String *op, String *type) { List *ored = Split(val, split_op, -1); // some float hackery //i don't understand it, if you do then please explain // if ( ((split_op == '+') || (split_op == '-')) && Len(ored) == 2 && // (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || // SwigType_type(type) == T_LONGDOUBLE) ) { // // check that we're not splitting a float // String *possible_result = convert_literal(val, type, false); // if (possible_result) return possible_result; // } // try parsing the split results. if any part fails, kick out. bool part_failed = false; if (Len(ored) > 1) { String *result = NewStringf("(%s", op); for (Iterator i = First(ored); i.item; i = Next(i)) { String *converted = convert_literal(i.item, type); if (converted) { Printf(result, " %s", converted); Delete(converted); } else { part_failed = true; break; } } Printf(result, ")"); Delete(ored); return part_failed ? 0 : result; } else { Delete(ored); } return 0; } /* To be called by code generating the lisp interface Will return a String containing the literal based on type. Will return null if there are problems. try_to_split defaults to true (see stub above). */ String *CFFI::convert_literal(String *literal, String *type, bool try_to_split) { String *num_param = Copy(literal); String *trimmed = trim(num_param); String *num = strip_parens(trimmed), *res = 0; Delete(trimmed); char *s = Char(num); // very basic parsing of infix expressions. if (try_to_split) { if ((res = infix_to_prefix(num, '|', "cl:logior", type))) return res; if ((res = infix_to_prefix(num, '&', "cl:logand", type))) return res; if ((res = infix_to_prefix(num, '^', "cl:logxor", type))) return res; if ((res = infix_to_prefix(num, '*', "cl:*", type))) return res; if ((res = infix_to_prefix(num, '/', "cl:/", type))) return res; if ((res = infix_to_prefix(num, '+', "cl:+", type))) return res; if ((res = infix_to_prefix(num, '-', "cl:-", type))) return res; } if (SwigType_type(type) == T_FLOAT || SwigType_type(type) == T_DOUBLE || SwigType_type(type) == T_LONGDOUBLE) { // Use CL syntax for float literals // careful. may be a float identifier or float constant. char *num_start = Char(num); char *num_end = num_start + strlen(num_start) - 1; bool is_literal = isdigit(*num_start) || (*num_start == '.') || (*num_start == '+') || (*num_start == '-'); String *lisp_exp = 0; if (is_literal) { if (*num_end == 'f' || *num_end == 'F') { lisp_exp = NewString("f"); } else { lisp_exp = NewString("d"); } if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { *num_end = '\0'; num_end--; } int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); if (!exponents) Printf(num, "%s0", lisp_exp); if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { Delete(num); num = 0; } } return num; } else if (SwigType_type(type) == T_CHAR) { /* Use CL syntax for character literals */ String* result = NewStringf("#\\%s", s); Delete(num); return result; } else if (SwigType_type(type) == T_STRING) { /* Use CL syntax for string literals */ String* result = NewStringf("\"%s\"", num_param); Delete(num); return result; } else if (SwigType_type(type) == T_INT || SwigType_type(type) == T_UINT) { // Printf(stderr, "Is a T_INT or T_UINT %s, before replaceall\n", s); const char *num_start = Char(num); bool is_literal = isdigit(*num_start) || (*num_start == '.') || (*num_start == '+') || (*num_start == '-'); if (is_literal) { Replaceall(num, "u", ""); Replaceall(num, "U", ""); Replaceall(num, "l", ""); Replaceall(num, "L", ""); } int i, j; if (sscanf(s, "%d >> %d", &i, &j) == 2) { String* result = NewStringf("(cl:ash %d -%d)", i, j); Delete(num); return result; } else if (sscanf(s, "%d << %d", &i, &j) == 2) { String* result = NewStringf("(cl:ash %d %d)", i, j); Delete(num); return result; } } if (Len(num) >= 2 && s[0] == '0') { /* octal or hex */ if (s[1] == 'x'){ Replace(num,"0","#",DOH_REPLACE_FIRST); } else{ Replace(num,"0","#o",DOH_REPLACE_FIRST); } } return num; } //less flexible as it does the conversion in C, the lispify name does the conversion in lisp String *CFFI::lispy_name(char *name) { bool helper = false; String *new_name = NewString(""); for (unsigned int i = 0; i < strlen(name); i++) { if (name[i] == '_' || name[i] == '-') { Printf(new_name, "%c", '-'); helper = false; } else if (name[i] >= 'A' && name[i] <= 'Z') { if (helper) Printf(new_name, "%c", '-'); Printf(new_name, "%c", ('a' + (name[i] - 'A'))); helper = false; } else { helper = true; Printf(new_name, "%c", name[i]); } } return new_name; } extern "C" Language *swig_cffi(void) { return new CFFI(); } swig-3.0.12/Source/Modules/modula3.cxx0000664000175000017500000040426013042756442017403 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * modula3.cxx * * Modula3 language module for SWIG. * ----------------------------------------------------------------------------- */ /* Text formatted with indent -sob -br -ce -nut -npsl */ /* Report: - It's not a good concept to use member variables or global variables for passing parameters to functions. It's not a good concept to use functions of superclasses for specific services. E.g. For SWIG this means: Generating accessor functions for member variables is the most common but no general task to be processed in membervariableHandler. Better provide a service function which generates accessor function code and equip this service function with all parameters needed for input (parse node) and output (generated code). - How can I make globalvariableHandler not to generate interface functions to two accessor functions (that don't exist) ? - How can I generate a typemap that turns every C reference argument into its Modula 3 counterpart, that is void test(Complex &z); PROCEDURE test(VAR z:Complex); - neither $*n_mangle nor $*n_type nor $*n_ltype return the type without pointer converted to Modula3 equivalent, $*n_mangle is the variant closest to what I expect - using a typemap like typemap(m3wrapintype) int * %{VAR $1_name: INTEGER%} has the advantages: - one C parameter can be turned into multiple M3 parameters - the argument can be renamed - using typemaps like typemap(m3wrapinmode) int * "VAR" typemap(m3wrapintype) int * "INTEGER" has the advantages: - multiple parameters with same type and default value can be bundled - more conform to the other language modules - Where takes the reduction of multi-typemaps place? How can I preserve all parameters for functions of the intermediary class? The answer is Getattrs(n,"tmap:m3rawintype:next") - Char() can be used to transform a String to (char *) which can be used for output with printf - What is the while (checkAttribute()) loop in functionWrapper good for? Appearently for skipping (numinputs=0) typemaps. - SWIGTYPE const * - typemap is ignored, whereas SWIGTYPE * - typemap is invoked, why? Had it been (const SWIGTYPE *) instead? - enumeration items should definitely be equipped with its plain numerical value One could add tag 'numvalue' in CParse/parser.y, but it is still possible that someone declares an enumeration using a symbolic constant. I have quickly hacked that the successive number is assigned if "enumvalue" has suffix "+1". The ultimate solution would be to generate a C program which includes the header and outputs all constants. This program might be compiled and run by 'make' or by SWIG and the resulting output is fed back to SWIG. - It's a bad idea to interpret feature value "" 'disable feature' because the value "" might be sensible in case of feature:modula3:oldprefix. - What's the difference between "sym:name" and "name" ? "name" is the original name and "sym:name" is probably modified by the user using %rename - Is it possible for 'configure' to find out if m3pp is installed and to invoke it for generated Modula3 files? - It would be better to separate an arguments purpose and its name, because an output variable with name "OUTPUT" is not very descriptive. In case of PLPlot this could be solved by typedefs that assign special purposes to the array types. - Can one interpret $n_basetype as the identifier matched with SWIGTYPE ? SWIG's odds: - arguments of type (Node *) for SWIG functions should be most often better (const Node *): Swig_symbol_qualified, Getattr, nodeType, parentNode - unique identifier style instead of NewString, Getattr, firstChild - 'class'.name is qualified, 'enum'.name and 'enumitem'.name is not - Swig_symbol_qualified() returns NIL for enumeration nodes - Is there a function that creates a C representation of a SWIG type string? ToDo: - create WeakRefs only for resources returned by function marked with %newobject -> part of output conversion - clean typemap conception - should a multi-typemap for m3wrapouttype skip the corresponding input parameters? when yes - How to handle inout-arguments? In this case like in-argument. - C++ classes - C++ exceptions - allow for moving RECORD and OBJECT definitions to separate files, with the main type called T - call-back functions - special option: fast access to class members by pointer arithmetic, member offsets can be determined by a C++ program that print them. - emit enumeration definitions when its first item is declared, currently enumerations are emitted at the beginning of the file Done: - addThrow should convert the typemap by itself - not possible because routine for attaching mapped types to parameter nodes won't work for the function node - turning error codes into exceptions -> part of output value checking - create WeakRefs for resources allocated by the library -> part of output conversion - TRY..FINALLY..END; can be omitted - if there is no m3wrapfreearg - no exception can be raised in the body (empty RAISES) list */ #include "swigmod.h" #include // for INT_MAX #include #define USAGE_ARG_DIR "m3wrapargdir typemap expect values: in, out, inout\n" class MODULA3:public Language { public: enum block_type { no_block, constant, variable, blocktype, revelation }; private: struct M3File { String *f; Hash *import; block_type bt; /* VC++ 6 doesn't allow the access to 'no_block' if it is a private member of MODULA3 class */ M3File():f(NewString("")), import(NewHash()), bt(no_block) { } ~M3File() { Delete(f); Delete(import); } /* ----------------------------------------------------------------------------- * enterBlock() * * Make sure that a given declaration is written to the right declaration block, * that is constants are written after "CONST" and so on ... * ----------------------------------------------------------------------------- */ void enterBlock(block_type newbt) { static const char *ident[] = { "", "\nCONST\n", "\nVAR\n", "\nTYPE\n", "\nREVEAL\n" }; #ifdef DEBUG if ((bt < 0) || (4 < bt)) { printf("bt %d out of range\n", bt); } #endif if (newbt != bt) { Append(f, ident[newbt]); bt = newbt; } } }; static const char *usage; const String *empty_string; Hash *swig_types_hash; File *f_begin; File *f_runtime; File *f_header; File *f_wrappers; File *f_init; bool proxy_flag; // Flag for generating proxy classes bool have_default_constructor_flag; bool native_function_flag; // Flag for when wrapping a native function bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable bool wrapping_member_flag; // Flag for when wrapping a member variable/enum/const bool global_variable_flag; // Flag for when wrapping a global variable bool old_variable_names; // Flag for old style variable names in the intermediary class bool unsafe_module; String *m3raw_name; // raw interface name M3File m3raw_intf; // raw interface M3File m3raw_impl; // raw implementation (usually empty) String *m3wrap_name; // wrapper module M3File m3wrap_intf; M3File m3wrap_impl; String *m3makefile; String *targetlibrary; String *proxy_class_def; String *proxy_class_code; String *proxy_class_name; String *variable_name; //Name of a variable being wrapped String *variable_type; //Type of this variable Hash *enumeration_coll; //Collection of all enumerations. /* The items are nodes with members: "items" - hash of with key 'itemname' and content 'itemvalue' "max" - maximum value in item list */ String *constant_values; String *constantfilename; String *renamefilename; String *typemapfilename; String *m3raw_imports; //intermediary class imports from %pragma String *module_imports; //module imports from %pragma String *m3raw_baseclass; //inheritance for intermediary class class from %pragma String *module_baseclass; //inheritance for module class from %pragma String *m3raw_interfaces; //interfaces for intermediary class class from %pragma String *module_interfaces; //interfaces for module class from %pragma String *m3raw_class_modifiers; //class modifiers for intermediary class overriden by %pragma String *m3wrap_modifiers; //class modifiers for module class overriden by %pragma String *upcasts_code; //C++ casts for inheritance hierarchies C++ code String *m3raw_cppcasts_code; //C++ casts up inheritance hierarchies intermediary class code String *destructor_call; //C++ destructor call if any String *outfile; enum type_additions { none, pointer, reference }; public: /* ----------------------------------------------------------------------------- * MODULA3() * ----------------------------------------------------------------------------- */ MODULA3(): empty_string(NewString("")), swig_types_hash(NULL), f_begin(NULL), f_runtime(NULL), f_header(NULL), f_wrappers(NULL), f_init(NULL), proxy_flag(true), have_default_constructor_flag(false), native_function_flag(false), enum_constant_flag(false), static_flag(false), variable_wrapper_flag(false), wrapping_member_flag(false), global_variable_flag(false), old_variable_names(false), unsafe_module(false), m3raw_name(NULL), m3raw_intf(), m3raw_impl(), m3wrap_name(NULL), m3wrap_intf(), m3wrap_impl(), m3makefile(NULL), targetlibrary(NULL), proxy_class_def(NULL), proxy_class_code(NULL), proxy_class_name(NULL), variable_name(NULL), variable_type(NULL), enumeration_coll(NULL), constant_values(NULL), constantfilename(NULL), renamefilename(NULL), typemapfilename(NULL), m3raw_imports(NULL), module_imports(NULL), m3raw_baseclass(NULL), module_baseclass(NULL), m3raw_interfaces(NULL), module_interfaces(NULL), m3raw_class_modifiers(NULL), m3wrap_modifiers(NULL), upcasts_code(NULL), m3raw_cppcasts_code(NULL), destructor_call(NULL), outfile(NULL) { } /************** some utility functions ***************/ /* ----------------------------------------------------------------------------- * getMappedType() * * Return the type of 'p' mapped by 'map'. * Print a standard warning if 'p' can't be mapped. * ----------------------------------------------------------------------------- */ String *getMappedType(Node *p, const char *map) { String *mapattr = NewString("tmap:"); Append(mapattr, map); String *tm = Getattr(p, mapattr); if (tm == NIL) { Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(p, "type"), 0)); } Delete(mapattr); return tm; } /* ----------------------------------------------------------------------------- * getMappedTypeNew() * * Similar to getMappedType but uses Swig_type_lookup_new. * ----------------------------------------------------------------------------- */ String *getMappedTypeNew(Node *n, const char *map, const char *lname = "", bool warn = true) { String *tm = Swig_typemap_lookup(map, n, lname, 0); if ((tm == NIL) && warn) { Swig_warning(WARN_MODULA3_TYPEMAP_TYPE_UNDEF, input_file, line_number, "No '%s' typemap defined for type '%s'\n", map, SwigType_str(Getattr(n, "type"), 0)); } return tm; } /* ----------------------------------------------------------------------------- * attachMappedType() * * Obtain the type mapped by 'map' and attach it to the node * ----------------------------------------------------------------------------- */ void attachMappedType(Node *n, const char *map, const char *lname = "") { String *tm = Swig_typemap_lookup(map, n, lname, 0); if (tm != NIL) { String *attr = NewStringf("tmap:%s", map); Setattr(n, attr, tm); Delete(attr); } } /* ----------------------------------------------------------------------------- * skipIgnored() * * Skip all parameters that have 'numinputs=0' * with respect to a given typemap. * ----------------------------------------------------------------------------- */ Node *skipIgnored(Node *p, const char *map) { String *niattr = NewStringf("tmap:%s:numinputs", map); String *nextattr = NewStringf("tmap:%s:next", map); while ((p != NIL) && checkAttribute(p, niattr, "0")) { p = Getattr(p, nextattr); } Delete(nextattr); Delete(niattr); return p; } /* ----------------------------------------------------------------------------- * isInParam() * isOutParam() * * Check if the parameter is intended for input or for output. * ----------------------------------------------------------------------------- */ bool isInParam(Node *p) { String *dir = Getattr(p, "tmap:m3wrapargdir"); //printf("dir for %s: %s\n", Char(Getattr(p,"name")), Char(dir)); if ((dir == NIL) || (Strcmp(dir, "in") == 0) || (Strcmp(dir, "inout") == 0)) { return true; } else if (Strcmp(dir, "out") == 0) { return false; } else { printf("%s", USAGE_ARG_DIR); return false; } } bool isOutParam(Node *p) { String *dir = Getattr(p, "tmap:m3wrapargdir"); if ((dir == NIL) || (Strcmp(dir, "in") == 0)) { return false; } else if ((Strcmp(dir, "out") == 0) || (Strcmp(dir, "inout") == 0)) { return true; } else { printf("%s", USAGE_ARG_DIR); return false; } } /* ----------------------------------------------------------------------------- * printAttrs() * * For debugging: Show all attributes of a node and their values. * ----------------------------------------------------------------------------- */ void printAttrs(Node *n) { Iterator it; for (it = First(n); it.key != NIL; it = Next(it)) { printf("%s = %s\n", Char(it.key), Char(Getattr(n, it.key))); } } /* ----------------------------------------------------------------------------- * hasPrefix() * * Check if a string have a given prefix. * ----------------------------------------------------------------------------- */ bool hasPrefix(const String *str, const String *prefix) { int len_prefix = Len(prefix); return (Len(str) > len_prefix) && (Strncmp(str, prefix, len_prefix) == 0); } /* ----------------------------------------------------------------------------- * getQualifiedName() * * Return fully qualified identifier of n. * ----------------------------------------------------------------------------- */ #if 0 // Swig_symbol_qualified returns NIL for enumeration nodes String *getQualifiedName(Node *n) { String *qual = Swig_symbol_qualified(n); String *name = Getattr(n, "name"); if (hasContent(qual)) { return NewStringf("%s::%s", qual, name); } else { return name; } } #else String *getQualifiedName(Node *n) { String *name = Copy(Getattr(n, "name")); n = parentNode(n); while (n != NIL) { const String *type = nodeType(n); if ((Strcmp(type, "class") == 0) || (Strcmp(type, "struct") == 0) || (Strcmp(type, "namespace") == 0)) { String *newname = NewStringf("%s::%s", Getattr(n, "name"), name); Delete(name); //name = newname; // Hmpf, the class name is already qualified. return newname; } n = parentNode(n); } //printf("qualified name: %s\n", Char(name)); return name; } #endif /* ----------------------------------------------------------------------------- * nameToModula3() * * Turn usual C identifiers like "this_is_an_identifier" * into usual Modula 3 identifier like "thisIsAnIdentifier" * ----------------------------------------------------------------------------- */ String *nameToModula3(const String *sym, bool leadingCap) { int len_sym = Len(sym); char *csym = Char(sym); char *m3sym = new char[len_sym + 1]; int i, j; bool cap = leadingCap; for (i = 0, j = 0; j < len_sym; j++) { char c = csym[j]; if ((c == '_') || (c == ':')) { cap = true; } else { if (isdigit(c)) { m3sym[i] = c; cap = true; } else { if (cap) { m3sym[i] = (char)toupper(c); } else { m3sym[i] = (char)tolower(c); } cap = false; } i++; } } m3sym[i] = 0; String *result = NewString(m3sym); delete[]m3sym; return result; } /* ----------------------------------------------------------------------------- * capitalizeFirst() * * Make the first character upper case. * ----------------------------------------------------------------------------- */ String *capitalizeFirst(const String *str) { return NewStringf("%c%s", toupper(*Char(str)), Char(str) + 1); } /* ----------------------------------------------------------------------------- * prefixedNameToModula3() * * If feature modula3:oldprefix and modula3:newprefix is present * and the C identifier has leading 'oldprefix' * then it is replaced by the 'newprefix'. * The rest is converted to Modula style. * ----------------------------------------------------------------------------- */ String *prefixedNameToModula3(Node *n, const String *sym, bool leadingCap) { String *oldPrefix = Getattr(n, "feature:modula3:oldprefix"); String *newPrefix = Getattr(n, "feature:modula3:newprefix"); String *result = NewString(""); char *short_sym = Char(sym); // if at least one prefix feature is present // the replacement takes place if ((oldPrefix != NIL) || (newPrefix != NIL)) { if ((oldPrefix == NIL) || hasPrefix(sym, oldPrefix)) { short_sym += Len(oldPrefix); if (newPrefix != NIL) { Append(result, newPrefix); } } } String *suffix = nameToModula3(short_sym, leadingCap || hasContent(newPrefix)); Append(result, suffix); Delete(suffix); return result; } /* ----------------------------------------------------------------------------- * hasContent() * * Check if the string exists and contains something. * ----------------------------------------------------------------------------- */ bool hasContent(const String *str) { return (str != NIL) && (Strcmp(str, "") != 0); } /* ----------------------------------------------------------------------------- * openWriteFile() * * Caution: The file must be freshly allocated and will be destroyed * by this routine. * ----------------------------------------------------------------------------- */ File *openWriteFile(String *name) { File *file = NewFile(name, "w", SWIG_output_files()); if (!file) { FileErrorDisplay(name); SWIG_exit(EXIT_FAILURE); } Delete(name); return file; } /* ----------------------------------------------------------------------------- * aToL() * * like atol but with additional user warning * ----------------------------------------------------------------------------- */ long aToL(const String *value) { char *endptr; long numvalue = strtol(Char(value), &endptr, 0); if (*endptr != 0) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The string <%s> does not denote a numeric value.\n", value); } return numvalue; } /* ----------------------------------------------------------------------------- * strToL() * * like strtol but returns if the conversion was successful * ----------------------------------------------------------------------------- */ bool strToL(const String *value, long &numvalue) { char *endptr; numvalue = strtol(Char(value), &endptr, 0); return (*endptr == 0); } /* ----------------------------------------------------------------------------- * evalExpr() * * Evaluate simple expression as they may occur in "enumvalue" attributes. * ----------------------------------------------------------------------------- */ bool evalExpr(String *value, long &numvalue) { // Split changes file status of String and thus cannot receive 'const' strings //printf("evaluate <%s>\n", Char(value)); List *summands = Split(value, '+', INT_MAX); Iterator sm = First(summands); numvalue = 0; for (; sm.item != NIL; sm = Next(sm)) { String *smvalue = Getattr(constant_values, sm.item); long smnumvalue; if (smvalue != NIL) { if (!strToL(smvalue, smnumvalue)) { //printf("evaluation: abort 0 <%s>\n", Char(smvalue)); return false; } } else { if (!strToL(sm.item, smnumvalue)) { //printf("evaluation: abort 1 <%s>\n", Char(sm)); return false; } } numvalue += smnumvalue; } //printf("evaluation: return %ld\n", numvalue); return true; } /* ----------------------------------------------------------------------------- * log2() * * Determine the position of the single bit of a power of two. * Returns true if the given number is a power of two. * ----------------------------------------------------------------------------- */ bool log2(long n, long &exp) { exp = 0; while (n > 0) { if ((n & 1) != 0) { return n == 1; } exp++; n >>= 1; } return false; } /* ----------------------------------------------------------------------------- * writeArg * * Write a function argument or RECORD entry definition. * Bundles arguments of same type and default value. * 'name.next==NIL' denotes the end of the entry or argument list. * ----------------------------------------------------------------------------- */ bool equalNilStr(const String *str0, const String *str1) { if (str0 == NIL) { return (str1 == NIL); //return (str0==NIL) == (str1==NIL); } else { return (str1 != NIL) && (Cmp(str0, str1) == 0); //return Cmp(str0,str1)==0; } } struct writeArgState { String *mode, *name, *type, *value; bool hold; writeArgState():mode(NIL), name(NIL), type(NIL), value(NIL), hold(false) { } }; void writeArg(File *f, writeArgState & state, String *mode, String *name, String *type, String *value) { /* skip the first argument, only store the information for the next call in this case */ if (state.name != NIL) { if ((!state.hold) && (state.mode != NIL)) { Printf(f, "%s ", state.mode); } if ((name != NIL) && equalNilStr(state.mode, mode) && equalNilStr(state.type, type) && (state.value == NIL) && (value == NIL) /* the same expression may have different values due to side effects of the called function */ /*equalNilStr(state.value,value) */ ) { Printf(f, "%s, ", state.name); state.hold = true; } else { Append(f, state.name); if (state.type != NIL) { Printf(f, ": %s", state.type); } if (state.value != NIL) { Printf(f, ":= %s", state.value); } Append(f, ";\n"); state.hold = false; } } /* at the next call the current argument will be the previous one */ state.mode = mode; state.name = name; state.type = type; state.value = value; } /* ----------------------------------------------------------------------------- * getProxyName() * * Test to see if a type corresponds to something wrapped with a proxy class * Return NULL if not otherwise the proxy class name * ----------------------------------------------------------------------------- */ String *getProxyName(SwigType *t) { if (proxy_flag) { Node *n = classLookup(t); if (n) { return Getattr(n, "sym:name"); } } return NULL; } /*************** language processing ********************/ /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("modula3"); // Look for certain command line options for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-generateconst") == 0) { if (argv[i + 1]) { constantfilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-generaterename") == 0) { if (argv[i + 1]) { renamefilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-generatetypemap") == 0) { if (argv[i + 1]) { typemapfilename = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-noproxy") == 0) { Swig_mark_arg(i); proxy_flag = false; } else if (strcmp(argv[i], "-oldvarnames") == 0) { Swig_mark_arg(i); old_variable_names = true; } else if (strcmp(argv[i], "-help") == 0) { Printf(stdout, "%s\n", usage); } } } // Add a symbol to the parser for conditional compilation Preprocessor_define("SWIGMODULA3 1", 0); // Add typemap definitions SWIG_typemap_lang("modula3"); SWIG_config_file("modula3.swg"); allow_overloading(); } /* --------------------------------------------------------------------- * top() * --------------------------------------------------------------------- */ virtual int top(Node *n) { if (hasContent(constantfilename) || hasContent(renamefilename) || hasContent(typemapfilename)) { int result = SWIG_OK; if (hasContent(constantfilename)) { result = generateConstantTop(n) && result; } if (hasContent(renamefilename)) { result = generateRenameTop(n) && result; } if (hasContent(typemapfilename)) { result = generateTypemapTop(n) && result; } return result; } else { return generateM3Top(n); } } void scanConstant(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *constname = NIL; String *type = nodeType(child); if ((Strcmp(type, "enumitem") == 0) || (Strcmp(type, "constant") == 0)) { #if 1 constname = getQualifiedName(child); #else constname = Getattr(child, "value"); if ((!hasContent(constname)) || (('0' <= *Char(constname)) && (*Char(constname) <= '9'))) { constname = Getattr(child, "name"); } #endif } if (constname != NIL) { Printf(file, " printf(\"%%%%constnumeric(%%Lg) %s;\\n\", (long double)%s);\n", constname, constname); } scanConstant(file, child); child = nextSibling(child); } } int generateConstantTop(Node *n) { File *file = openWriteFile(NewStringf("%s.c", constantfilename)); if (CPlusPlus) { Printf(file, "#include \n"); } else { Printf(file, "#include \n"); } Printf(file, "#include \"%s\"\n", input_file); Printf(file, "\n"); Printf(file, "int main (int argc, char *argv[]) {\n"); Printf(file, "\ /*This progam must work for floating point numbers and integers.\n\ Thus all numbers are converted to double precision floating point format.*/\n"); scanConstant(file, n); Printf(file, " return 0;\n"); Printf(file, "}\n"); Delete(file); return SWIG_OK; } void scanRename(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *type = nodeType(child); if (Strcmp(type, "cdecl") == 0) { ParmList *p = Getattr(child, "parms"); if (p != NIL) { String *name = getQualifiedName(child); String *m3name = nameToModula3(name, true); /*don't know how to get the original C type identifiers */ //String *arguments = createCSignature (child); Printf(file, "%%rename(\"%s\") %s;\n", m3name, name); /*Printf(file, "%%rename(\"%s\") %s %s(%s);\n", m3name, Getattr(n,"type"), name, arguments); */ Delete(name); Delete(m3name); //Delete (arguments); } } scanRename(file, child); child = nextSibling(child); } } int generateRenameTop(Node *n) { File *file = openWriteFile(NewStringf("%s.i", renamefilename)); Printf(file, "\ /* This file was generated from %s\n\ by SWIG with option -generaterename. */\n\ \n", input_file); scanRename(file, n); Delete(file); return SWIG_OK; } void scanTypemap(File *file, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *type = nodeType(child); //printf("nodetype %s\n", Char(type)); String *storage = Getattr(child, "storage"); if ((Strcmp(type, "class") == 0) || ((Strcmp(type, "cdecl") == 0) && (storage != NIL) && (Strcmp(storage, "typedef") == 0))) { String *name = getQualifiedName(child); String *m3name = nameToModula3(name, true); Printf(file, "%%typemap(\"m3wrapintype\") %s %%{%s%%}\n", name, m3name); Printf(file, "%%typemap(\"m3rawintype\") %s %%{%s%%}\n", name, m3name); Printf(file, "\n"); } scanTypemap(file, child); child = nextSibling(child); } } int generateTypemapTop(Node *n) { File *file = openWriteFile(NewStringf("%s.i", typemapfilename)); Printf(file, "\ /* This file was generated from %s\n\ by SWIG with option -generatetypemap. */\n\ \n", input_file); scanTypemap(file, n); Delete(file); return SWIG_OK; } int generateM3Top(Node *n) { /* Initialize all of the output files */ outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); m3makefile = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); Swig_register_filebyname("m3rawintf", m3raw_intf.f); Swig_register_filebyname("m3rawimpl", m3raw_impl.f); Swig_register_filebyname("m3wrapintf", m3wrap_intf.f); Swig_register_filebyname("m3wrapimpl", m3wrap_impl.f); Swig_register_filebyname("m3makefile", m3makefile); swig_types_hash = NewHash(); String *name = Getattr(n, "name"); // Make the intermediary class and module class names. The intermediary class name can be set in the module directive. Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode != NIL) { String *m3raw_name_tmp = Getattr(optionsnode, "m3rawname"); if (m3raw_name_tmp != NIL) { m3raw_name = Copy(m3raw_name_tmp); } } if (m3raw_name == NIL) { m3raw_name = NewStringf("%sRaw", name); } Setattr(m3wrap_impl.import, m3raw_name, ""); m3wrap_name = Copy(name); proxy_class_def = NewString(""); proxy_class_code = NewString(""); m3raw_baseclass = NewString(""); m3raw_interfaces = NewString(""); m3raw_class_modifiers = NewString(""); // package access only to the intermediary class by default m3raw_imports = NewString(""); m3raw_cppcasts_code = NewString(""); m3wrap_modifiers = NewString("public"); module_baseclass = NewString(""); module_interfaces = NewString(""); module_imports = NewString(""); upcasts_code = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGMODULA3\n#define SWIGMODULA3\n#endif\n\n"); Swig_name_register("wrapper", "Modula3_%f"); if (old_variable_names) { Swig_name_register("set", "set_%n%v"); Swig_name_register("get", "get_%n%v"); } Printf(f_wrappers, "\n#ifdef __cplusplus\n"); Printf(f_wrappers, "extern \"C\" {\n"); Printf(f_wrappers, "#endif\n\n"); constant_values = NewHash(); scanForConstPragmas(n); enumeration_coll = NewHash(); collectEnumerations(enumeration_coll, n); /* Emit code */ Language::top(n); // Generate m3makefile // This will be unnecessary if SWIG is invoked from Quake. { File *file = openWriteFile(NewStringf("%sm3makefile", SWIG_output_directory())); Printf(file, "%% automatically generated quake file for %s\n\n", name); /* Write the fragments written by '%insert' collected while 'top' processed the parse tree */ Printv(file, m3makefile, NIL); Printf(file, "import(\"libm3\")\n"); //Printf(file, "import_lib(\"%s\",\"/usr/lib\")\n", name); Printf(file, "module(\"%s\")\n", m3raw_name); Printf(file, "module(\"%s\")\n\n", m3wrap_name); if (targetlibrary != NIL) { Printf(file, "library(\"%s\")\n", targetlibrary); } else { Printf(file, "library(\"m3%s\")\n", name); } Delete(file); } // Generate the raw interface { File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3raw_name)); emitBanner(file); Printf(file, "INTERFACE %s;\n\n", m3raw_name); emitImportStatements(m3raw_intf.import, file); Printf(file, "\n"); // Write the interface generated within 'top' Printv(file, m3raw_intf.f, NIL); Printf(file, "\nEND %s.\n", m3raw_name); Delete(file); } // Generate the raw module { File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3raw_name)); emitBanner(file); Printf(file, "MODULE %s;\n\n", m3raw_name); emitImportStatements(m3raw_impl.import, file); Printf(file, "\n"); // will be empty usually Printv(file, m3raw_impl.f, NIL); Printf(file, "BEGIN\nEND %s.\n", m3raw_name); Delete(file); } // Generate the interface for the comfort wrappers { File *file = openWriteFile(NewStringf("%s%s.i3", SWIG_output_directory(), m3wrap_name)); emitBanner(file); Printf(file, "INTERFACE %s;\n", m3wrap_name); emitImportStatements(m3wrap_intf.import, file); Printf(file, "\n"); { Iterator it = First(enumeration_coll); if (it.key != NIL) { Printf(file, "TYPE\n"); } for (; it.key != NIL; it = Next(it)) { Printf(file, "\n"); emitEnumeration(file, it.key, it.item); } } // Add the wrapper methods Printv(file, m3wrap_intf.f, NIL); // Finish off the class Printf(file, "\nEND %s.\n", m3wrap_name); Delete(file); } // Generate the wrapper routines implemented in Modula 3 { File *file = openWriteFile(NewStringf("%s%s.m3", SWIG_output_directory(), m3wrap_name)); emitBanner(file); if (unsafe_module) { Printf(file, "UNSAFE "); } Printf(file, "MODULE %s;\n\n", m3wrap_name); emitImportStatements(m3wrap_impl.import, file); Printf(file, "\n"); // Add the wrapper methods Printv(file, m3wrap_impl.f, NIL); Printf(file, "\nBEGIN\nEND %s.\n", m3wrap_name); Delete(file); } if (upcasts_code) Printv(f_wrappers, upcasts_code, NIL); Printf(f_wrappers, "#ifdef __cplusplus\n"); Printf(f_wrappers, "}\n"); Printf(f_wrappers, "#endif\n"); // Output a Modula 3 type wrapper class for each SWIG type for (Iterator swig_type = First(swig_types_hash); swig_type.item != NIL; swig_type = Next(swig_type)) { emitTypeWrapperClass(swig_type.key, swig_type.item); } Delete(swig_types_hash); swig_types_hash = NULL; Delete(constant_values); constant_values = NULL; Delete(enumeration_coll); enumeration_coll = NULL; Delete(m3raw_name); m3raw_name = NULL; Delete(m3raw_baseclass); m3raw_baseclass = NULL; Delete(m3raw_interfaces); m3raw_interfaces = NULL; Delete(m3raw_class_modifiers); m3raw_class_modifiers = NULL; Delete(m3raw_imports); m3raw_imports = NULL; Delete(m3raw_cppcasts_code); m3raw_cppcasts_code = NULL; Delete(proxy_class_def); proxy_class_def = NULL; Delete(proxy_class_code); proxy_class_code = NULL; Delete(m3wrap_name); m3wrap_name = NULL; Delete(m3wrap_modifiers); m3wrap_modifiers = NULL; Delete(targetlibrary); targetlibrary = NULL; Delete(module_baseclass); module_baseclass = NULL; Delete(module_interfaces); module_interfaces = NULL; Delete(module_imports); module_imports = NULL; Delete(upcasts_code); upcasts_code = NULL; Delete(constantfilename); constantfilename = NULL; Delete(renamefilename); renamefilename = NULL; Delete(typemapfilename); typemapfilename = NULL; /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } /* ----------------------------------------------------------------------------- * emitBanner() * ----------------------------------------------------------------------------- */ void emitBanner(File *f) { Printf(f, "(*******************************************************************************\n"); Swig_banner_target_lang(f, " *"); Printf(f, "*******************************************************************************)\n\n"); } /* ---------------------------------------------------------------------- * nativeWrapper() * ---------------------------------------------------------------------- */ virtual int nativeWrapper(Node *n) { String *wrapname = Getattr(n, "wrap:name"); if (!addSymbol(wrapname, n)) return SWIG_ERROR; if (Getattr(n, "type")) { Swig_save("nativeWrapper", n, "name", NIL); Setattr(n, "name", wrapname); native_function_flag = true; functionWrapper(n); Swig_restore(n); native_function_flag = false; } else { Swig_error(input_file, line_number, "No return type for %%native method %s.\n", Getattr(n, "wrap:name")); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { String *type = nodeType(n); String *funcType = Getattr(n, "modula3:functype"); String *rawname = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *capname = capitalizeFirst(symname); //String *wname = Swig_name_wrapper(symname); //printf("function: %s\n", Char(symname)); //printf(" purpose: %s\n", Char(funcType)); if (Strcmp(type, "cdecl") == 0) { if (funcType == NIL) { // no wrapper needed for plain functions emitM3RawPrototype(n, rawname, symname); emitM3Wrapper(n, symname); } else if (Strcmp(funcType, "method") == 0) { Setattr(n, "modula3:funcname", capname); emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); } else if (Strcmp(funcType, "accessor") == 0) { /* * Generate the proxy class properties for public member variables. * Not for enums and constants. */ if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Capitalize the first letter in the function name Setattr(n, "proxyfuncname", capname); Setattr(n, "imfuncname", symname); if (hasPrefix(capname, "Set")) { Setattr(n, "modula3:setname", capname); } else { Setattr(n, "modula3:getname", capname); } emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); //proxyClassFunctionHandler(n); } #ifdef DEBUG } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Function type <%s> unknown.\n", Char(funcType)); #endif } } else if ((Strcmp(type, "constructor") == 0) || (Strcmp(type, "destructor") == 0)) { emitCWrapper(n, capname); emitM3RawPrototype(n, capname, capname); emitM3Wrapper(n, capname); } // a Java relict #if 0 if (!(proxy_flag && is_wrapping_class()) && !enum_constant_flag) { emitM3Wrapper(n, capname); } #endif Delete(capname); return SWIG_OK; } /* ---------------------------------------------------------------------- * emitCWrapper() * * Generate the wrapper in C which calls C++ methods. * ---------------------------------------------------------------------- */ virtual int emitCWrapper(Node *n, const String *wname) { String *rawname = Getattr(n, "name"); String *c_return_type = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); String *body = NewString(""); Hash *throws_hash = NewHash(); ParmList *l = Getattr(n, "parms"); SwigType *t = Getattr(n, "type"); String *symname = Getattr(n, "sym:name"); if (!Getattr(n, "sym:overloaded")) { if (!addSymbol(wname, n)) { return SWIG_ERROR; } } // A new wrapper function object Wrapper *f = NewWrapper(); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("ctype", l, f); /* Get return types */ { String *tm = getMappedTypeNew(n, "ctype", ""); if (tm != NIL) { Printf(c_return_type, "%s", tm); } } bool is_void_return = (Cmp(c_return_type, "void") == 0); if (!is_void_return) { Wrapper_add_localv(f, "cresult", c_return_type, "cresult = 0", NIL); } Printv(f->def, " SWIGEXPORT ", c_return_type, " ", wname, "(", NIL); // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); // Generate signature and argument conversion for C wrapper { Parm *p; attachParameterNames(n, "tmap:name", "c:wrapname", "m3arg%d"); bool gencomma = false; for (p = skipIgnored(l, "in"); p; p = skipIgnored(p, "in")) { String *arg = Getattr(p, "c:wrapname"); { /* Get the ctype types of the parameter */ String *c_param_type = getMappedType(p, "ctype"); // Add parameter to C function Printv(f->def, gencomma ? ", " : "", c_param_type, " ", arg, NIL); Delete(c_param_type); gencomma = true; } // Get typemap for this argument String *tm = getMappedType(p, "in"); if (tm != NIL) { addThrows(throws_hash, "in", p); Replaceall(tm, "$input", arg); Setattr(p, "emit:input", arg); /*??? */ Printf(f->code, "%s\n", tm); p = Getattr(p, "tmap:in:next"); } else { p = nextSibling(p); } } } /* Insert constraint checking code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:check"); if (tm != NIL) { addThrows(throws_hash, "check", p); Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } } /* Insert cleanup code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:freearg"); if (tm != NIL) { addThrows(throws_hash, "freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } } /* Insert argument output code */ { Parm *p; for (p = l; p;) { String *tm = Getattr(p, "tmap:argout"); if (tm != NIL) { addThrows(throws_hash, "argout", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$result", "cresult"); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } } // Get any Modula 3 exception classes in the throws typemap ParmList *throw_parm_list = NULL; if ((throw_parm_list = Getattr(n, "catchlist"))) { Swig_typemap_attach_parms("throws", throw_parm_list, f); Parm *p; for (p = throw_parm_list; p; p = nextSibling(p)) { addThrows(throws_hash, "throws", p); } } Setattr(n, "wrap:name", wname); // Now write code to make the function call if (!native_function_flag) { String *actioncode = emit_action(n); /* Return value if necessary */ String *tm; if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { addThrows(throws_hash, "out", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Replaceall(tm, "$target", "cresult"); /* deprecated */ Replaceall(tm, "$result", "cresult"); Printf(f->code, "%s", tm); if (hasContent(tm)) Printf(f->code, "\n"); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(t, 0), rawname); } emit_return_variable(n, t, f); } /* Output argument output code */ Printv(f->code, outarg, NIL); /* Output cleanup code */ Printv(f->code, cleanup, NIL); /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm != NIL) { addThrows(throws_hash, "newfree", n); Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* See if there is any return cleanup code */ if (!native_function_flag) { String *tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0); if (tm != NIL) { Replaceall(tm, "$source", Swig_cresult_name()); /* deprecated */ Printf(f->code, "%s\n", tm); } } /* Finish C wrapper */ Printf(f->def, ") {"); if (!is_void_return) Printv(f->code, " return cresult;\n", NIL); Printf(f->code, "}\n"); /* Substitute the cleanup code */ Replaceall(f->code, "$cleanup", cleanup); /* Substitute the function name */ Replaceall(f->code, "$symname", symname); if (!is_void_return) { Replaceall(f->code, "$null", "0"); } else { Replaceall(f->code, "$null", ""); } /* Dump the function out */ if (!native_function_flag) { Wrapper_print(f, f_wrappers); } Delete(c_return_type); Delete(cleanup); Delete(outarg); Delete(body); Delete(throws_hash); DelWrapper(f); return SWIG_OK; } /* ---------------------------------------------------------------------- * emitM3RawPrototype() * * Generate an EXTERNAL procedure declaration in Modula 3 * which is the interface to an existing C routine or a C wrapper. * ---------------------------------------------------------------------- */ virtual int emitM3RawPrototype(Node *n, const String *cname, const String *m3name) { String *im_return_type = NewString(""); //String *symname = Getattr(n,"sym:name"); ParmList *l = Getattr(n, "parms"); /* Attach the non-standard typemaps to the parameter list. */ Swig_typemap_attach_parms("m3rawinmode", l, NULL); Swig_typemap_attach_parms("m3rawintype", l, NULL); /* Get return types */ bool has_return; { String *tm = getMappedTypeNew(n, "m3rawrettype", ""); if (tm != NIL) { Printf(im_return_type, "%s", tm); } has_return = hasContent(tm); } /* cname is the original name if 'n' denotes a C function and it is the relabeled name (sym:name) if 'n' denotes a C++ method or similar */ m3raw_intf.enterBlock(no_block); Printf(m3raw_intf.f, "\n<* EXTERNAL %s *>\nPROCEDURE %s (", cname, m3name); // Generate signature for raw interface { Parm *p; writeArgState state; attachParameterNames(n, "tmap:rawinname", "modula3:rawname", "arg%d"); for (p = skipIgnored(l, "m3rawintype"); p; p = skipIgnored(p, "m3rawintype")) { /* Get argument passing mode, should be one of VALUE, VAR, READONLY */ String *mode = Getattr(p, "tmap:m3rawinmode"); String *argname = Getattr(p, "modula3:rawname"); String *im_param_type = getMappedType(p, "m3rawintype"); addImports(m3raw_intf.import, "m3rawintype", p); writeArg(m3raw_intf.f, state, mode, argname, im_param_type, NIL); if (im_param_type != NIL) { p = Getattr(p, "tmap:m3rawintype:next"); } else { p = nextSibling(p); } } writeArg(m3raw_intf.f, state, NIL, NIL, NIL, NIL); } /* Finish M3 raw prototype */ Printf(m3raw_intf.f, ")"); // neither a C wrapper nor a plain C function may throw an exception //generateThrowsClause(throws_hash, m3raw_intf.f); if (has_return) { Printf(m3raw_intf.f, ": %s", im_return_type); } Printf(m3raw_intf.f, ";\n"); Delete(im_return_type); return SWIG_OK; } /* ----------------------------------------------------------------------- * variableWrapper() * ----------------------------------------------------------------------- */ virtual int variableWrapper(Node *n) { Language::variableWrapper(n); return SWIG_OK; } /* ----------------------------------------------------------------------- * globalvariableHandler() * ----------------------------------------------------------------------- */ virtual int globalvariableHandler(Node *n) { SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } variable_name = Getattr(n, "sym:name"); variable_type = Copy(tm); // Get the variable type expressed in terms of Modula 3 equivalents of C types if ((tm = getMappedTypeNew(n, "m3rawtype", ""))) { m3raw_intf.enterBlock(no_block); Printf(m3raw_intf.f, "\n<* EXTERNAL *> VAR %s: %s;\n", variable_name, tm); } // Output the property's accessor methods /* global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; */ Printf(m3wrap_impl.f, "\n\n"); //return ret; return 1; } long getConstNumeric(Node *n) { String *constnumeric = Getfeature(n, "constnumeric"); String *name = Getattr(n, "name"); long numvalue; if (constnumeric == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature 'constnumeric' is necessary to obtain value of %s.\n", name); return 0; } else if (!strToL(constnumeric, numvalue)) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The feature 'constnumeric' of %s specifies value <%s> which is not an integer constant.\n", name, constnumeric); return 0; } else { return numvalue; } } /* ------------------------------------------------------------------------ * generateIntConstant() * * Considers node as an integer constant definition * and generate a Modula 3 constant definition. * ------------------------------------------------------------------------ */ void generateIntConstant(Node *n, String *name) { String *value = Getattr(n, "value"); String *type = Getfeature(n, "modula3:constint:type"); String *conv = Getfeature(n, "modula3:constint:conv"); if (name == NIL) { name = Getattr(n, "sym:name"); } long numvalue; bool isSimpleNum = strToL(value, numvalue); if (!isSimpleNum) { numvalue = getConstNumeric(n); } String *m3value; if ((conv == NIL) || ((Strcmp(conv, "set:int") != 0) && (Strcmp(conv, "int:set") != 0))) { /* The original value of the constant has precedence over 'constnumeric' feature since we like to keep the style (that is the base) of simple numeric constants */ if (isSimpleNum) { if (hasPrefix(value, "0x")) { m3value = NewStringf("16_%s", Char(value) + 2); } else if ((Len(value) > 1) && (*Char(value) == '0')) { m3value = NewStringf("8_%s", Char(value) + 1); } else { m3value = Copy(value); } /* If we cannot easily obtain the value of a numeric constant, we use the results given by a C compiler. */ } else { m3value = Copy(Getfeature(n, "constnumeric")); } } else { // if the value can't be converted, it is ignored if (convertInt(numvalue, numvalue, conv)) { m3value = NewStringf("%d", numvalue); } else { m3value = NIL; } } if (m3value != NIL) { m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s", name); if (hasContent(type)) { Printf(m3wrap_intf.f, ": %s", type); } Printf(m3wrap_intf.f, " = %s;\n", m3value); Delete(m3value); } } /* ----------------------------------------------------------------------- * generateSetConstant() * * Considers node as a set constant definition * and generate a Modula 3 constant definition. * ------------------------------------------------------------------------ */ void generateSetConstant(Node *n, String *name) { String *value = Getattr(n, "value"); String *type = Getfeature(n, "modula3:constset:type"); String *setname = Getfeature(n, "modula3:constset:set"); String *basename = Getfeature(n, "modula3:constset:base"); String *conv = Getfeature(n, "modula3:constset:conv"); m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s", name); if (type != NIL) { Printf(m3wrap_intf.f, ":%s ", type); } Printf(m3wrap_intf.f, " = %s{", setname); long numvalue = 0; if (!strToL(value, numvalue)) { numvalue = getConstNumeric(n); } convertInt(numvalue, numvalue, conv); bool isIntType = Strcmp(basename, "CARDINAL") == 0; Hash *items = NIL; if (!isIntType) { Hash *enumeration = Getattr(enumeration_coll, basename); if (enumeration == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "There is no enumeration <%s> as needed for the set.\n", setname); isIntType = true; } else { items = Getattr(enumeration, "items"); } } bool gencomma = false; int bitpos = 0; while (numvalue > 0) { if ((numvalue & 1) != 0) { if (isIntType) { if (gencomma) { Printv(m3wrap_intf.f, ",", NIL); } gencomma = true; Printf(m3wrap_intf.f, "%d", bitpos); } else { char bitval[15]; sprintf(bitval, "%d", bitpos); String *bitname = Getattr(items, bitval); if (bitname == NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Enumeration <%s> has no value <%s>.\n", setname, bitval); } else { if (gencomma) { Printv(m3wrap_intf.f, ",", NIL); } gencomma = true; Printf(m3wrap_intf.f, "%s.%s", basename, bitname); } } } numvalue >>= 1; bitpos++; } Printf(m3wrap_intf.f, "};\n"); } void generateConstant(Node *n) { // any of the special interpretation disables the default behaviour String *enumitem = Getfeature(n, "modula3:enumitem:name"); String *constset = Getfeature(n, "modula3:constset:name"); String *constint = Getfeature(n, "modula3:constint:name"); if (hasContent(enumitem) || hasContent(constset) || hasContent(constint)) { if (hasContent(constset)) { generateSetConstant(n, constset); } if (hasContent(constint)) { generateIntConstant(n, constint); } } else { String *value = Getattr(n, "value"); String *name = Getattr(n, "sym:name"); if (name == NIL) { name = Getattr(n, "name"); } m3wrap_intf.enterBlock(constant); Printf(m3wrap_intf.f, "%s = %s;\n", name, value); } } void emitEnumeration(File *file, String *name, Node *n) { Printf(file, "%s = {", name); int i; bool gencomma = false; int max = aToL(Getattr(n, "max")); Hash *items = Getattr(n, "items"); for (i = 0; i <= max; i++) { if (gencomma) { Printf(file, ","); } Printf(file, "\n"); gencomma = true; char numstr[15]; sprintf(numstr, "%d", i); String *name = Getattr(items, numstr); if (name != NIL) { Printv(file, name, NIL); } else { Printf(file, "Dummy%d", i); } } Printf(file, "\n};\n"); } /* ----------------------------------------------------------------------- * constantWrapper() * * Handles constants and enumeration items. * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { generateConstant(n); return SWIG_OK; } #if 0 // enumerations are handled like constant definitions /* ----------------------------------------------------------------------------- * enumDeclaration() * ----------------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { String *symname = nameToModula3(Getattr(n, "sym:name"), true); enumerationStart(symname); int result = Language::enumDeclaration(n); enumerationStop(); Delete(symname); return result; } #endif /* ----------------------------------------------------------------------------- * enumvalueDeclaration() * ----------------------------------------------------------------------------- */ virtual int enumvalueDeclaration(Node *n) { generateConstant(n); /* This call would continue processing in the constantWrapper which cannot handle values like "RED+1". return Language::enumvalueDeclaration(n); */ return SWIG_OK; } /* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * imclassbase - base (extends) for the intermediary class * imclassclassmodifiers - class modifiers for the intermediary class * imclasscode - text (Modula 3 code) is copied verbatim to the intermediary class * imclassimports - import statements for the intermediary class * imclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (Modula 3 code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *code = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "modula3") == 0) { String *strvalue = NewString(value); Replaceall(strvalue, "\\\"", "\""); /* bool isEnumItem = Strcmp(code, "enumitem") == 0; bool isSetItem = Strcmp(code, "setitem") == 0; */ if (Strcmp(code, "imclassbase") == 0) { Delete(m3raw_baseclass); m3raw_baseclass = Copy(strvalue); } else if (Strcmp(code, "imclassclassmodifiers") == 0) { Delete(m3raw_class_modifiers); m3raw_class_modifiers = Copy(strvalue); } else if (Strcmp(code, "imclasscode") == 0) { Printf(m3raw_intf.f, "%s\n", strvalue); } else if (Strcmp(code, "imclassimports") == 0) { Delete(m3raw_imports); m3raw_imports = Copy(strvalue); } else if (Strcmp(code, "imclassinterfaces") == 0) { Delete(m3raw_interfaces); m3raw_interfaces = Copy(strvalue); } else if (Strcmp(code, "modulebase") == 0) { Delete(module_baseclass); module_baseclass = Copy(strvalue); } else if (Strcmp(code, "moduleclassmodifiers") == 0) { Delete(m3wrap_modifiers); m3wrap_modifiers = Copy(strvalue); } else if (Strcmp(code, "modulecode") == 0) { Printf(m3wrap_impl.f, "%s\n", strvalue); } else if (Strcmp(code, "moduleimports") == 0) { Delete(module_imports); module_imports = Copy(strvalue); } else if (Strcmp(code, "moduleinterfaces") == 0) { Delete(module_interfaces); module_interfaces = Copy(strvalue); } else if (Strcmp(code, "unsafe") == 0) { unsafe_module = true; } else if (Strcmp(code, "library") == 0) { if (targetlibrary) { Delete(targetlibrary); } targetlibrary = Copy(strvalue); } else if (Strcmp(code, "enumitem") == 0) { } else if (Strcmp(code, "constset") == 0) { } else if (Strcmp(code, "constint") == 0) { } else if (Strcmp(code, "makesetofenum") == 0) { m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%sSet = SET OF %s;\n", value, value); } else { Swig_warning(WARN_MODULA3_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", code); } Delete(strvalue); } } return Language::pragmaDirective(n); } void Setfeature(Node *n, const char *feature, const String *value, bool warn = false) { //printf("tag feature <%s> with value <%s>\n", feature, Char(value)); String *attr = NewStringf("feature:%s", feature); if ((Setattr(n, attr, value) != 0) && warn) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Feature <%s> of %s did already exist.\n", feature, Getattr(n, "name")); } Delete(attr); } String *Getfeature(Node *n, const char *feature) { //printf("retrieve feature <%s> with value <%s>\n", feature, Char(value)); String *attr = NewStringf("feature:%s", feature); String *result = Getattr(n, attr); Delete(attr); return result; } bool convertInt(long in, long &out, const String *mode) { if ((mode == NIL) || (Strcmp(mode, "int:int") == 0) || (Strcmp(mode, "set:set") == 0)) { out = in; return true; } else if (Strcmp(mode, "set:int") == 0) { return log2(in, out); } else if (Strcmp(mode, "int:set") == 0) { out = 1L << in; return unsigned (in) < (sizeof(out) * 8); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown integer conversion method <%s>.\n", mode); return false; } } void collectEnumerations(Hash *enums, Node *n) { Node *child = firstChild(n); while (child != NIL) { String *name = Getattr(child, "name"); const bool isConstant = Strcmp(nodeType(child), "constant") == 0; const bool isEnumItem = Strcmp(nodeType(child), "enumitem") == 0; if (isConstant || isEnumItem) { //printf("%s%s name %s\n", isConstant?"constant":"", isEnumItem?"enumitem":"", Char(name)); { String *m3name = Getfeature(child, "modula3:enumitem:name"); String *m3enum = Getfeature(child, "modula3:enumitem:enum"); String *conv = Getfeature(child, "modula3:enumitem:conv"); if (m3enum != NIL) { //printf("m3enum %s\n", Char(m3enum)); if (m3name == NIL) { m3name = name; } long max = -1; Hash *items; Hash *enumnode = Getattr(enums, m3enum); if (enumnode == NIL) { enumnode = NewHash(); items = NewHash(); Setattr(enumnode, "items", items); Setattr(enums, m3enum, enumnode); } else { String *maxstr = Getattr(enumnode, "max"); if (maxstr != NIL) { max = aToL(maxstr); } items = Getattr(enumnode, "items"); } long numvalue; String *value = Getattr(child, "value"); //printf("value: %s\n", Char(value)); if ((value == NIL) || (!strToL(value, numvalue))) { value = Getattr(child, "enumvalue"); if ((value == NIL) || (!evalExpr(value, numvalue))) { numvalue = getConstNumeric(child); } //printf("constnumeric: %s\n", Char(value)); } Setattr(constant_values, name, NewStringf("%d", numvalue)); if (convertInt(numvalue, numvalue, conv)) { String *newvalue = NewStringf("%d", numvalue); String *oldname = Getattr(items, newvalue); if (oldname != NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "The value <%s> is already assigned to <%s>.\n", value, oldname); } //printf("items %p, set %s = %s\n", items, Char(newvalue), Char(m3name)); Setattr(items, newvalue, m3name); if (max < numvalue) { max = numvalue; } Setattr(enumnode, "max", NewStringf("%d", max)); } } } } collectEnumerations(enums, child); child = nextSibling(child); } } enum const_pragma_type { cpt_none, cpt_constint, cpt_constset, cpt_enumitem }; struct const_id_pattern { String *prefix, *parentEnum; }; void tagConstants(Node *first, String *parentEnum, const const_id_pattern & pat, const String *pragma, List *convdesc) { Node *n = first; while (n != NIL) { String *name = getQualifiedName(n); bool isConstant = Strcmp(nodeType(n), "constant") == 0; bool isEnumItem = Strcmp(nodeType(n), "enumitem") == 0; if ((isConstant || isEnumItem) && ((pat.prefix == NIL) || (hasPrefix(name, pat.prefix))) && ((pat.parentEnum == NIL) || ((parentEnum != NIL) && (Strcmp (pat.parentEnum, parentEnum) == 0)))) { //printf("tag %s\n", Char(name)); String *srctype = Getitem(convdesc, 1); String *relationstr = Getitem(convdesc, 3); List *relationdesc = Split(relationstr, ',', 2); // transform name from C to Modula3 style String *srcstyle = NIL; String *newprefix = NIL; { //printf("name conversion <%s>\n", Char(Getitem(convdesc,2))); List *namedesc = Split(Getitem(convdesc, 2), ',', INT_MAX); Iterator nameit = First(namedesc); for (; nameit.item != NIL; nameit = Next(nameit)) { List *nameassign = Split(nameit.item, '=', 2); String *tag = Getitem(nameassign, 0); String *data = Getitem(nameassign, 1); //printf("name conv <%s> = <%s>\n", Char(tag), Char(data)); if (Strcmp(tag, "srcstyle") == 0) { srcstyle = Copy(data); } else if (Strcmp(tag, "prefix") == 0) { newprefix = Copy(data); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown name conversion tag <%s> with value <%s>.\n", tag, data); } Delete(nameassign); } Delete(namedesc); } const char *stem = Char(name); if (pat.prefix != NIL) { //printf("pat.prefix %s for %s\n", Char(pat.prefix), Char(name)); stem += Len(pat.prefix); } String *newname; if (srcstyle && Strcmp(srcstyle, "underscore") == 0) { if (newprefix != NIL) { String *newstem = nameToModula3(stem, true); newname = NewStringf("%s%s", newprefix, newstem); Delete(newstem); } else { newname = nameToModula3(stem, true); } } else { if (srcstyle != NIL) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown C identifier style <%s>.\n", srcstyle); } newname = Copy(name); } if (Strcmp(pragma, "enumitem") == 0) { if (Len(relationdesc) != 1) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } Setfeature(n, "modula3:enumitem:name", newname, true); Setfeature(n, "modula3:enumitem:enum", relationstr, true); Setfeature(n, "modula3:enumitem:conv", NewStringf("%s:int", srctype), true); } else if (Strcmp(pragma, "constint") == 0) { if (Len(relationdesc) != 1) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } Setfeature(n, "modula3:constint:name", newname, true); Setfeature(n, "modula3:constint:type", Getitem(relationdesc, 0), true); Setfeature(n, "modula3:constint:conv", NewStringf("%s:int", srctype), true); } else if (Strcmp(pragma, "constset") == 0) { if (Len(relationdesc) != 2) { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Expected , got <%s>.\n", relationstr); } String *settype = Getitem(relationdesc, 0); Setfeature(n, "modula3:constset:name", newname, true); //Setfeature(n,"modula3:constset:type",settype,true); Setfeature(n, "modula3:constset:set", settype, true); Setfeature(n, "modula3:constset:base", Getitem(relationdesc, 1), true); Setfeature(n, "modula3:constset:conv", NewStringf("%s:set", srctype), true); } Delete(newname); Delete(relationdesc); } if (Strcmp(nodeType(n), "enum") == 0) { //printf("explore enum %s, qualification %s\n", Char(name), Char(Swig_symbol_qualified(n))); tagConstants(firstChild(n), name, pat, pragma, convdesc); } else { tagConstants(firstChild(n), NIL, pat, pragma, convdesc); } n = nextSibling(n); } } void scanForConstPragmas(Node *n) { Node *child = firstChild(n); while (child != NIL) { const String *type = nodeType(child); if (Strcmp(type, "pragma") == 0) { const String *lang = Getattr(child, "lang"); const String *code = Getattr(child, "name"); String *value = Getattr(child, "value"); if (Strcmp(lang, "modula3") == 0) { const_pragma_type cpt = cpt_none; if (Strcmp(code, "constint") == 0) { cpt = cpt_constint; } else if (Strcmp(code, "constset") == 0) { cpt = cpt_constset; } else if (Strcmp(code, "enumitem") == 0) { cpt = cpt_enumitem; } if (cpt != cpt_none) { const_id_pattern pat = { NIL, NIL }; List *convdesc = Split(value, ';', 4); List *patterndesc = Split(Getitem(convdesc, 0), ',', INT_MAX); Iterator patternit; for (patternit = First(patterndesc); patternit.item != NIL; patternit = Next(patternit)) { List *patternassign = Split(patternit.item, '=', 2); String *tag = Getitem(patternassign, 0); String *data = Getitem(patternassign, 1); if (Strcmp(tag, "prefix") == 0) { pat.prefix = Copy(data); } else if (Strcmp(tag, "enum") == 0) { pat.parentEnum = Copy(data); } else { Swig_warning(WARN_MODULA3_BAD_ENUMERATION, input_file, line_number, "Unknown identification tag <%s> with value <%s>.\n", tag, data); } Delete(patternassign); } tagConstants(child, NIL, pat, code, convdesc); Delete(patterndesc); } } } scanForConstPragmas(child); child = nextSibling(child); } } /* ----------------------------------------------------------------------------- * emitProxyClassDefAndCPPCasts() * ----------------------------------------------------------------------------- */ void emitProxyClassDefAndCPPCasts(Node *n) { String *c_classname = SwigType_namestr(Getattr(n, "name")); String *c_baseclass = NULL; String *baseclass = NULL; String *c_baseclassname = NULL; String *name = Getattr(n, "name"); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item) { if (!GetFlag(base.item, "feature:ignore")) { String *baseclassname = Getattr(base.item, "name"); if (!c_baseclassname) { c_baseclassname = baseclassname; baseclass = Copy(getProxyName(baseclassname)); if (baseclass) c_baseclass = SwigType_namestr(baseclassname); } else { /* Warn about multiple inheritance for additional base class(es) */ String *proxyclassname = Getattr(n, "classtypeobj"); Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", SwigType_namestr(proxyclassname), SwigType_namestr(baseclassname)); } } base = Next(base); } } bool derived = baseclass && getProxyName(c_baseclassname); if (!baseclass) baseclass = NewString(""); // Inheritance from pure Modula 3 classes const String *pure_baseclass = typemapLookup(n, "m3base", name, WARN_NONE); if (hasContent(pure_baseclass) && hasContent(baseclass)) { Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", name, pure_baseclass); } // Pure Modula 3 interfaces const String *pure_interfaces = typemapLookup(n, derived ? "m3interfaces_derived" : "m3interfaces", name, WARN_NONE); // Start writing the proxy class Printv(proxy_class_def, typemapLookup(n, "m3imports", name, WARN_NONE), // Import statements "\n", typemapLookup(n, "m3classmodifiers", name, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " class $m3classname", // Class name and bases (derived || *Char(pure_baseclass) || *Char(pure_interfaces)) ? " : " : "", baseclass, pure_baseclass, ((derived || *Char(pure_baseclass)) && *Char(pure_interfaces)) ? // Interfaces ", " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", // Member variables for memory handling derived ? "" : " protected bool swigCMemOwn;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", name, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers " $m3classname(IntPtr cPtr, bool cMemoryOwn) ", // Constructor used for wrapping pointers derived ? ": base($imclassname.$m3classnameTo$baseclass(cPtr), cMemoryOwn) {\n" : "{\n swigCMemOwn = cMemoryOwn;\n", " swigCPtr = cPtr;\n", " }\n", NIL); if (!have_default_constructor_flag) { // All proxy classes need a constructor Printv(proxy_class_def, "\n", " protected $m3classname() : this(IntPtr.Zero, false) {\n", " }\n", NIL); } // C++ destructor is wrapped by the Dispose method // Note that the method name is specified in a typemap attribute called methodname String *destruct = NewString(""); const String *tm = NULL; Node *attributes = NewHash(); String *destruct_methodname = NULL; if (derived) { tm = typemapLookup(n, "m3destruct_derived", name, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:m3destruct_derived:methodname"); } else { tm = typemapLookup(n, "m3destruct", name, WARN_NONE, attributes); destruct_methodname = Getattr(attributes, "tmap:m3destruct:methodname"); } if (!destruct_methodname) { Swig_error(Getfile(n), Getline(n), "No methodname attribute defined in m3destruct%s typemap for %s\n", (derived ? "_derived" : ""), proxy_class_name); } // Emit the Finalize and Dispose methods if (tm) { // Finalize method if (*Char(destructor_call)) { Printv(proxy_class_def, typemapLookup(n, "m3finalize", name, WARN_NONE), NIL); } // Dispose method Printv(destruct, tm, NIL); if (*Char(destructor_call)) Replaceall(destruct, "$imcall", destructor_call); else Replaceall(destruct, "$imcall", "throw new MethodAccessException(\"C++ destructor does not have public access\")"); if (*Char(destruct)) Printv(proxy_class_def, "\n public ", derived ? "override" : "virtual", " void ", destruct_methodname, "() ", destruct, "\n", NIL); } Delete(attributes); Delete(destruct); // Emit various other methods Printv(proxy_class_def, typemapLookup(n, "m3getcptr", name, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method typemapLookup(n, "m3code", name, WARN_NONE), // extra Modula 3 code "\n", NIL); // Substitute various strings into the above template Replaceall(proxy_class_def, "$m3classname", proxy_class_name); Replaceall(proxy_class_code, "$m3classname", proxy_class_name); Replaceall(proxy_class_def, "$baseclass", baseclass); Replaceall(proxy_class_code, "$baseclass", baseclass); Replaceall(proxy_class_def, "$imclassname", m3raw_name); Replaceall(proxy_class_code, "$imclassname", m3raw_name); // Add code to do C++ casting to base class (only for classes in an inheritance hierarchy) if (derived) { Printv(m3raw_cppcasts_code, "\n [DllImport(\"", m3wrap_name, "\", EntryPoint=\"Modula3_", proxy_class_name, "To", baseclass, "\")]\n", NIL); Printv(m3raw_cppcasts_code, " public static extern IntPtr ", "$m3classnameTo$baseclass(IntPtr objectRef);\n", NIL); Replaceall(m3raw_cppcasts_code, "$m3classname", proxy_class_name); Replaceall(m3raw_cppcasts_code, "$baseclass", baseclass); Printv(upcasts_code, "SWIGEXPORT long Modula3_$imclazznameTo$imbaseclass", "(long objectRef) {\n", " long baseptr = 0;\n" " *($cbaseclass **)&baseptr = *($cclass **)&objectRef;\n" " return baseptr;\n" "}\n", "\n", NIL); Replaceall(upcasts_code, "$imbaseclass", baseclass); Replaceall(upcasts_code, "$cbaseclass", c_baseclass); Replaceall(upcasts_code, "$imclazzname", proxy_class_name); Replaceall(upcasts_code, "$cclass", c_classname); } Delete(baseclass); } /* ---------------------------------------------------------------------- * getAttrString() * * If necessary create and return the string * associated with a certain attribute of 'n'. * ---------------------------------------------------------------------- */ String *getAttrString(Node *n, const char *attr) { String *str = Getattr(n, attr); if (str == NIL) { str = NewString(""); Setattr(n, attr, str); } return str; } /* ---------------------------------------------------------------------- * getMethodDeclarations() * * If necessary create and return the handle * where the methods of the current access can be written to. * 'n' must be a member of a struct or a class. * ---------------------------------------------------------------------- */ String *getMethodDeclarations(Node *n) { String *acc_str = Getattr(n, "access"); String *methodattr; if (acc_str == NIL) { methodattr = NewString("modula3:method:public"); } else { methodattr = NewStringf("modula3:method:%s", acc_str); } String *methods = getAttrString(parentNode(n), Char(methodattr)); Delete(methodattr); return methods; } /* ---------------------------------------------------------------------- * classHandler() * ---------------------------------------------------------------------- */ virtual int classHandler(Node *n) { File *f_proxy = NULL; proxy_class_name = Copy(Getattr(n, "sym:name")); //String *rawname = Getattr(n,"name"); if (proxy_flag) { if (!addSymbol(proxy_class_name, n)) return SWIG_ERROR; if (Cmp(proxy_class_name, m3raw_name) == 0) { Printf(stderr, "Class name cannot be equal to intermediary class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } if (Cmp(proxy_class_name, m3wrap_name) == 0) { Printf(stderr, "Class name cannot be equal to module class name: %s\n", proxy_class_name); SWIG_exit(EXIT_FAILURE); } String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), proxy_class_name); f_proxy = NewFile(filen, "w", SWIG_output_files()); if (!f_proxy) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Delete(filen); filen = NULL; emitBanner(f_proxy); Clear(proxy_class_def); Clear(proxy_class_code); have_default_constructor_flag = false; destructor_call = NewString(""); } /* This will invoke memberfunctionHandler, membervariableHandler ... and finally it may invoke functionWrapper for wrappers and member variable accessors. It will invoke Language:constructorDeclaration which decides whether to call MODULA3::constructorHandler */ Language::classHandler(n); { String *kind = Getattr(n, "kind"); if (Cmp(kind, "struct") == 0) { String *entries = NewString(""); Node *child; writeArgState state; for (child = firstChild(n); child != NIL; child = nextSibling(child)) { String *childType = nodeType(child); if (Strcmp(childType, "cdecl") == 0) { String *member = Getattr(child, "sym:name"); ParmList *pl = Getattr(child, "parms"); if (pl == NIL) { // Get the variable type in Modula 3 type equivalents String *m3ct = getMappedTypeNew(child, "m3rawtype", ""); writeArg(entries, state, NIL, member, m3ct, NIL); } } } writeArg(entries, state, NIL, NIL, NIL, NIL); m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s =\nRECORD\n%sEND;\n", proxy_class_name, entries); Delete(entries); } else if (Cmp(kind, "class") == 0) { enum access_privilege { acc_public, acc_protected, acc_private }; int max_acc = acc_public; const char *acc_name[3] = { "public", "protected", "private" }; String *methods[3]; int acc; for (acc = acc_public; acc <= acc_private; acc++) { String *methodattr = NewStringf("modula3:method:%s", acc_name[acc]); methods[acc] = Getattr(n, methodattr); Delete(methodattr); max_acc = max_acc > acc ? max_acc : acc; } /* Determine the name of the base class */ String *baseclassname = NewString(""); { List *baselist = Getattr(n, "bases"); if (baselist) { /* Look for the first (principal?) base class - Modula 3 does not support multiple inheritance */ Iterator base = First(baselist); if (base.item) { Append(baseclassname, Getattr(base.item, "sym:name")); base = Next(base); if (base.item) { Swig_warning(WARN_MODULA3_MULTIPLE_INHERITANCE, Getfile(n), Getline(n), "Warning for %s, base %s ignored. Multiple inheritance is not supported in Modula 3.\n", proxy_class_name, Getattr(base.item, "name")); } } } } /* the private class of the base class and only this need a pointer to the C++ object */ bool need_private = !hasContent(baseclassname); max_acc = need_private ? acc_private : max_acc; /* Declare C++ object as abstract pointer in Modula 3 */ /* The revelation system does not allow us to imitate the whole class hierarchy of the C++ library, but at least we can distinguish between classes of different roots. */ if (hasContent(baseclassname)) { m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s = %s;\n", proxy_class_name, baseclassname); } else { m3raw_intf.enterBlock(blocktype); Printf(m3raw_intf.f, "%s <: ADDRESS;\n", proxy_class_name); m3raw_impl.enterBlock(revelation); Printf(m3raw_impl.f, "%s = UNTRACED BRANDED REF RECORD (*Dummy*) END;\n", proxy_class_name); } String *superclass; m3wrap_intf.enterBlock(blocktype); if (hasContent(methods[acc_public])) { superclass = NewStringf("%sPublic", proxy_class_name); } else if (hasContent(baseclassname)) { superclass = Copy(baseclassname); } else { superclass = NewString("ROOT"); } Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, superclass); Delete(superclass); { static const char *acc_m3suffix[] = { "Public", "Protected", "Private" }; int acc; for (acc = acc_public; acc <= acc_private; acc++) { bool process_private = (acc == acc_private) && need_private; if (hasContent(methods[acc]) || process_private) { String *subclass = NewStringf("%s%s", proxy_class_name, acc_m3suffix[acc]); /* m3wrap_intf.enterBlock(revelation); Printf(m3wrap_intf.f, "%s <: %s;\n", proxy_class_name, subclass); */ if (acc == max_acc) { m3wrap_intf.enterBlock(revelation); Printf(m3wrap_intf.f, "%s =\n", proxy_class_name); } else { m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%s =\n", subclass); } Printf(m3wrap_intf.f, "%s BRANDED OBJECT\n", baseclassname); if (process_private) { Setattr(m3wrap_intf.import, m3raw_name, ""); Printf(m3wrap_intf.f, "cxxObj:%s.%s;\n", m3raw_name, proxy_class_name); } if (hasContent(methods[acc])) { Printf(m3wrap_intf.f, "METHODS\n%s", methods[acc]); } if (acc == max_acc) { String *overrides = Getattr(n, "modula3:override"); Printf(m3wrap_intf.f, "OVERRIDES\n%s", overrides); } Printf(m3wrap_intf.f, "END;\n"); Delete(baseclassname); baseclassname = subclass; } } } Delete(methods[acc_public]); Delete(methods[acc_protected]); Delete(methods[acc_private]); } else { Swig_warning(WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN, input_file, line_number, "Unknown type constructor %s\n", kind); } } if (proxy_flag) { emitProxyClassDefAndCPPCasts(n); Printv(f_proxy, proxy_class_def, proxy_class_code, NIL); Printf(f_proxy, "}\n"); Delete(f_proxy); f_proxy = NULL; Delete(proxy_class_name); proxy_class_name = NULL; Delete(destructor_call); destructor_call = NULL; } return SWIG_OK; } /* ---------------------------------------------------------------------- * memberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int memberfunctionHandler(Node *n) { //printf("begin memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); Setattr(n, "modula3:functype", "method"); Language::memberfunctionHandler(n); { /* Language::memberfunctionHandler will remove the mapped types that emitM3Wrapper may attach */ ParmList *pl = Getattr(n, "parms"); Swig_typemap_attach_parms("m3wrapinmode", pl, NULL); Swig_typemap_attach_parms("m3wrapinname", pl, NULL); Swig_typemap_attach_parms("m3wrapintype", pl, NULL); Swig_typemap_attach_parms("m3wrapindefault", pl, NULL); attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); String *rettype = getMappedTypeNew(n, "m3wrapouttype", ""); String *methodname = Getattr(n, "sym:name"); /* if (methodname==NIL) { methodname = Getattr(n,"name"); } */ String *arguments = createM3Signature(n); String *storage = Getattr(n, "storage"); String *overridden = Getattr(n, "override"); bool isVirtual = (storage != NIL) && (Strcmp(storage, "virtual") == 0); bool isOverridden = (overridden != NIL) && (Strcmp(overridden, "1") == 0); if ((!isVirtual) || (!isOverridden)) { { String *methods = getMethodDeclarations(n); Printf(methods, "%s(%s)%s%s;%s\n", methodname, arguments, hasContent(rettype) ? ": " : "", hasContent(rettype) ? (const String *) rettype : "", isVirtual ? " (* base method *)" : ""); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:funcname"); String *overrides = getAttrString(parentNode(n), "modula3:override"); Printf(overrides, "%s := %s;\n", methodname, fname); } } } if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } //printf("end memberfunctionHandler(%s)\n", Char(Getattr(n,"name"))); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ virtual int staticmemberfunctionHandler(Node *n) { static_flag = true; Language::staticmemberfunctionHandler(n); if (proxy_flag) { String *overloaded_name = getOverloadedName(n); String *intermediary_function_name = Swig_name_member(NSPACE_TODO, proxy_class_name, overloaded_name); Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); Setattr(n, "imfuncname", intermediary_function_name); proxyClassFunctionHandler(n); Delete(overloaded_name); } static_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * proxyClassFunctionHandler() * * Function called for creating a Modula 3 wrapper function around a c++ function in the * proxy class. Used for both static and non-static C++ class functions. * C++ class static functions map to Modula 3 static functions. * Two extra attributes in the Node must be available. These are "proxyfuncname" - * the name of the Modula 3 class proxy function, which in turn will call "imfuncname" - * the intermediary (PInvoke) function name in the intermediary class. * ----------------------------------------------------------------------------- */ void proxyClassFunctionHandler(Node *n) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); String *intermediary_function_name = Getattr(n, "imfuncname"); String *proxy_function_name = Getattr(n, "proxyfuncname"); String *tm; Parm *p; int i; String *imcall = NewString(""); String *return_type = NewString(""); String *function_code = NewString(""); bool setter_flag = false; if (!proxy_flag) return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("m3wraptype", l, NULL); Swig_typemap_attach_parms("m3in", l, NULL); /* Get return types */ if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); Printf(return_type, "%s", tm); } if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Properties setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, Swig_name_member(NSPACE_TODO, proxy_class_name, variable_name))) == 0); } /* Start generating the proxy function */ Printf(function_code, " %s ", Getattr(n, "feature:modula3:methodmodifiers")); if (static_flag) Printf(function_code, "static "); if (Getattr(n, "override")) Printf(function_code, "override "); else if (checkAttribute(n, "storage", "virtual")) Printf(function_code, "virtual "); Printf(function_code, "%s %s(", return_type, proxy_function_name); Printv(imcall, m3raw_name, ".", intermediary_function_name, "(", NIL); if (!static_flag) Printv(imcall, "swigCPtr", NIL); emit_mark_varargs(l); int gencomma = !static_flag; /* Output each parameter */ for (i = 0, p = l; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } /* Ignore the 'this' argument for variable wrappers */ if (!(variable_wrapper_flag && i == 0)) { SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Modula 3 parameter type */ if ((tm = getMappedType(p, "m3wraptype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } if (gencomma) Printf(imcall, ", "); String *arg = variable_wrapper_flag ? NewString("value") : makeParameterName(n, p, i); // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = getMappedType(p, "in"))) { addThrows(throws_hash, "in", p); substituteClassname(pt, tm); Replaceall(tm, "$input", arg); Printv(imcall, tm, NIL); } /* Add parameter to proxy function */ if (gencomma >= 2) Printf(function_code, ", "); gencomma = 2; Printf(function_code, "%s %s", param_type, arg); Delete(arg); Delete(param_type); } p = Getattr(p, "tmap:in:next"); } Printf(imcall, ")"); Printf(function_code, ")"); // Transform return type used in PInvoke function (in intermediary class) to type used in Modula 3 wrapper function (in proxy class) if ((tm = getMappedTypeNew(n, "m3out", ""))) { addThrows(throws_hash, "m3out", n); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); } generateThrowsClause(throws_hash, function_code); Printf(function_code, " %s\n\n", tm ? (const String *) tm : empty_string); if (proxy_flag && wrapping_member_flag && !enum_constant_flag) { // Properties if (setter_flag) { // Setter method if ((tm = getMappedTypeNew(n, "m3varin", ""))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); Printf(proxy_class_code, "%s", tm); } } else { // Getter method if ((tm = getMappedTypeNew(n, "m3varout", ""))) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$imcall", imcall); Printf(proxy_class_code, "%s", tm); } } } else { // Normal function call Printv(proxy_class_code, function_code, NIL); } Delete(function_code); Delete(return_type); Delete(imcall); Delete(throws_hash); } /* ---------------------------------------------------------------------- * constructorHandler() * ---------------------------------------------------------------------- */ virtual int constructorHandler(Node *n) { // this invokes functionWrapper Language::constructorHandler(n); if (proxy_flag) { ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); String *overloaded_name = getOverloadedName(n); String *imcall = NewString(""); Printf(proxy_class_code, " %s %s(", Getattr(n, "feature:modula3:methodmodifiers"), proxy_class_name); Printv(imcall, " : this(", m3raw_name, ".", Swig_name_construct(NSPACE_TODO, overloaded_name), "(", NIL); /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("m3wraptype", l, NULL); Swig_typemap_attach_parms("m3in", l, NULL); emit_mark_varargs(l); int gencomma = 0; String *tm; Parm *p = l; int i; /* Output each parameter */ for (i = 0; p; i++) { /* Ignored varargs */ if (checkAttribute(p, "varargs:ignore", "1")) { p = nextSibling(p); continue; } /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } SwigType *pt = Getattr(p, "type"); String *param_type = NewString(""); /* Get the Modula 3 parameter type */ if ((tm = getMappedType(p, "m3wraptype"))) { substituteClassname(pt, tm); Printf(param_type, "%s", tm); } if (gencomma) Printf(imcall, ", "); String *arg = makeParameterName(n, p, i); // Use typemaps to transform type used in Modula 3 wrapper function (in proxy class) to type used in PInvoke function (in intermediary class) if ((tm = getMappedType(p, "in"))) { addThrows(throws_hash, "in", p); substituteClassname(pt, tm); Replaceall(tm, "$input", arg); Printv(imcall, tm, NIL); } /* Add parameter to proxy function */ if (gencomma) Printf(proxy_class_code, ", "); Printf(proxy_class_code, "%s %s", param_type, arg); gencomma = 1; Delete(arg); Delete(param_type); p = Getattr(p, "tmap:in:next"); } Printf(imcall, "), true)"); Printf(proxy_class_code, ")"); Printf(proxy_class_code, "%s", imcall); generateThrowsClause(throws_hash, proxy_class_code); Printf(proxy_class_code, " {\n"); Printf(proxy_class_code, " }\n\n"); if (!gencomma) // We must have a default constructor have_default_constructor_flag = true; Delete(overloaded_name); Delete(imcall); Delete(throws_hash); } return SWIG_OK; } /* ---------------------------------------------------------------------- * destructorHandler() * ---------------------------------------------------------------------- */ virtual int destructorHandler(Node *n) { Language::destructorHandler(n); String *symname = Getattr(n, "sym:name"); if (proxy_flag) { Printv(destructor_call, m3raw_name, ".", Swig_name_destroy(NSPACE_TODO, symname), "(swigCPtr)", NIL); } return SWIG_OK; } /* ---------------------------------------------------------------------- * membervariableHandler() * ---------------------------------------------------------------------- */ virtual int membervariableHandler(Node *n) { //printf("begin membervariableHandler(%s)\n", Char(Getattr(n,"name"))); SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } variable_name = Getattr(n, "sym:name"); //printf("member variable: %s\n", Char(variable_name)); // Output the property's field declaration and accessor methods Printf(proxy_class_code, " public %s %s {", tm, variable_name); Setattr(n, "modula3:functype", "accessor"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); wrapping_member_flag = false; variable_wrapper_flag = false; Printf(proxy_class_code, "\n }\n\n"); { String *methods = getMethodDeclarations(n); String *overrides = getAttrString(parentNode(n), "modula3:override"); SwigType *type = Getattr(n, "type"); String *m3name = capitalizeFirst(variable_name); //String *m3name = nameToModula3(variable_name,true); if (!SwigType_isconst(type)) { { String *inmode = getMappedTypeNew(n, "m3wrapinmode", "", false); String *intype = getMappedTypeNew(n, "m3wrapintype", ""); Printf(methods, "set%s(%s val:%s);\n", m3name, (inmode != NIL) ? (const String *) inmode : "", intype); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:setname"); Printf(overrides, "set%s := %s;\n", m3name, fname); } } { { String *outtype = getMappedTypeNew(n, "m3wrapouttype", ""); Printf(methods, "get%s():%s;\n", m3name, outtype); } { /* this was attached by functionWrapper invoked by Language::memberfunctionHandler */ String *fname = Getattr(n, "modula3:getname"); Printf(overrides, "get%s := %s;\n", m3name, fname); } } Delete(m3name); } //printf("end membervariableHandler(%s)\n", Char(Getattr(n,"name"))); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmembervariableHandler() * ---------------------------------------------------------------------- */ virtual int staticmembervariableHandler(Node *n) { bool static_const_member_flag = (Getattr(n, "value") == 0); if (static_const_member_flag) { SwigType *t = Getattr(n, "type"); String *tm; // Get the variable type if ((tm = getMappedTypeNew(n, "m3wraptype", ""))) { substituteClassname(t, tm); } // Output the property's field declaration and accessor methods Printf(proxy_class_code, " public static %s %s {", tm, Getattr(n, "sym:name")); } variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); wrapping_member_flag = false; static_flag = false; if (static_const_member_flag) Printf(proxy_class_code, "\n }\n\n"); return SWIG_OK; } /* ---------------------------------------------------------------------- * memberconstantHandler() * ---------------------------------------------------------------------- */ virtual int memberconstantHandler(Node *n) { variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; return SWIG_OK; } /* ----------------------------------------------------------------------------- * getOverloadedName() * ----------------------------------------------------------------------------- */ String *getOverloadedName(Node *n) { String *overloaded_name = Copy(Getattr(n, "sym:name")); if (Getattr(n, "sym:overloaded")) { Printv(overloaded_name, Getattr(n, "sym:overname"), NIL); } return overloaded_name; } /* ----------------------------------------------------------------------------- * emitM3Wrapper() * It is also used for set and get methods of global variables. * ----------------------------------------------------------------------------- */ void emitM3Wrapper(Node *n, const String *func_name) { SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Hash *throws_hash = NewHash(); int num_exceptions = 0; int num_returns = 0; String *rawcall = NewString(""); String *reccall = NewString(""); String *local_variables = NewString(""); String *local_constants = NewString(""); String *incheck = NewString(""); String *outcheck = NewString(""); String *setup = NewString(""); String *cleanup = NewString(""); String *outarg = NewString(""); /* don't mix up with 'autark' :-] */ String *storeout = NewString(""); String *result_name = NewString(""); String *return_variables = NewString(""); const char *result_return = "ret"; String *function_code = NewString(""); /*several names for the same function */ String *raw_name = Getattr(n, "name"); /*original C function name */ //String *func_name = Getattr(n,"sym:name"); /*final Modula3 name chosen by the user*/ bool setter_flag = false; int multiretval = GetFlag(n, "feature:modula3:multiretval"); if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { l = nextSibling(l); } } /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("m3wrapargvar", l, NULL); Swig_typemap_attach_parms("m3wrapargconst", l, NULL); Swig_typemap_attach_parms("m3wrapargraw", l, NULL); Swig_typemap_attach_parms("m3wrapargdir", l, NULL); Swig_typemap_attach_parms("m3wrapinmode", l, NULL); Swig_typemap_attach_parms("m3wrapinname", l, NULL); Swig_typemap_attach_parms("m3wrapintype", l, NULL); Swig_typemap_attach_parms("m3wrapindefault", l, NULL); Swig_typemap_attach_parms("m3wrapinconv", l, NULL); Swig_typemap_attach_parms("m3wrapincheck", l, NULL); Swig_typemap_attach_parms("m3wrapoutname", l, NULL); Swig_typemap_attach_parms("m3wrapouttype", l, NULL); Swig_typemap_attach_parms("m3wrapoutconv", l, NULL); Swig_typemap_attach_parms("m3wrapoutcheck", l, NULL); attachMappedType(n, "m3wrapretraw"); attachMappedType(n, "m3wrapretname"); attachMappedType(n, "m3wraprettype"); attachMappedType(n, "m3wrapretvar"); attachMappedType(n, "m3wrapretconv"); attachMappedType(n, "m3wrapretcheck"); Swig_typemap_attach_parms("m3wrapfreearg", l, NULL); /* Swig_typemap_attach_parms("m3wrapargvar:throws", l, NULL); Swig_typemap_attach_parms("m3wrapargraw:throws", l, NULL); Swig_typemap_attach_parms("m3wrapinconv:throws", l, NULL); Swig_typemap_attach_parms("m3wrapincheck:throws", l, NULL); Swig_typemap_attach_parms("m3wrapoutconv:throws", l, NULL); Swig_typemap_attach_parms("m3wrapoutcheck:throws", l, NULL); attachMappedType(n, "m3wrapretvar:throws"); attachMappedType(n, "m3wrapretconv:throws"); attachMappedType(n, "m3wrapretcheck:throws"); Swig_typemap_attach_parms("m3wrapfreearg:throws", l, NULL); */ /* Attach argument names to the parameter list */ /* should be a separate procedure making use of hashes */ attachParameterNames(n, "tmap:m3wrapinname", "autoname", "arg%d"); /* Get return types */ String *result_m3rawtype = Copy(getMappedTypeNew(n, "m3rawrettype", "")); String *result_m3wraptype = Copy(getMappedTypeNew(n, "m3wraprettype", "")); bool has_return_raw = hasContent(result_m3rawtype); bool has_return_m3 = hasContent(result_m3wraptype); if (has_return_m3) { num_returns++; //printf("%s: %s\n", Char(func_name),Char(result_m3wraptype)); } String *arguments = createM3Signature(n); /* Create local variables or RECORD fields for return values and determine return type that might result from a converted VAR argument. */ { writeArgState state; if (multiretval && has_return_m3) { writeArg(return_variables, state, NIL, NewString(result_return), result_m3wraptype, NIL); } Parm *p = skipIgnored(l, "m3wrapouttype"); while (p != NIL) { String *arg = Getattr(p, "tmap:m3wrapoutname"); if (arg == NIL) { arg = Getattr(p, "name"); } String *tm = Getattr(p, "tmap:m3wrapouttype"); if (tm != NIL) { if (isOutParam(p)) { if (!multiretval) { if (num_returns == 0) { Printv(result_name, arg, NIL); Clear(result_m3wraptype); Printv(result_m3wraptype, tm, NIL); } else { Swig_warning(WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN, input_file, line_number, "Typemap m3wrapargdir set to 'out' for %s implies a RETURN value, but the routine %s has already one.\nUse %%multiretval feature.\n", SwigType_str(Getattr(p, "type"), 0), raw_name); } } num_returns++; addImports(m3wrap_intf.import, "m3wrapouttype", p); writeArg(return_variables, state, NIL, arg, tm, NIL); } p = skipIgnored(Getattr(p, "tmap:m3wrapouttype:next"), "m3wrapouttype"); } else { p = nextSibling(p); } } writeArg(return_variables, state, NIL, NIL, NIL, NIL); if (multiretval) { Printv(result_name, Swig_cresult_name(), NIL); Printf(result_m3wraptype, "%sResult", func_name); m3wrap_intf.enterBlock(blocktype); Printf(m3wrap_intf.f, "%s =\nRECORD\n%sEND;\n", result_m3wraptype, return_variables); Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); } else { Append(local_variables, return_variables); } } /* Declare local constants e.g. for storing argument names. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapargconst"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapargconst", p); Replaceall(tm, "$input", arg); Printv(local_constants, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapargconst:next"); } else { p = nextSibling(p); } } } /* Declare local variables e.g. for converted input values. */ { String *tm = getMappedTypeNew(n, "m3wrapretvar", "", false); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapretvar", n); addThrows(throws_hash, "m3wrapretvar", n); Printv(local_variables, tm, "\n", NIL); } Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); tm = Getattr(p, "tmap:m3wrapargvar"); if (tm != NIL) { /* exceptions that may be raised but can't be catched, thus we won't count them in num_exceptions */ addImports(m3wrap_impl.import, "m3wrapargvar", p); addThrows(throws_hash, "m3wrapargvar", p); Replaceall(tm, "$input", arg); Printv(local_variables, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapargvar:next"); } else { p = nextSibling(p); } } } /* Convert input values from Modula 3 to C. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapinconv"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapinconv", p); num_exceptions += addThrows(throws_hash, "m3wrapinconv", p); Replaceall(tm, "$input", arg); Printv(setup, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapinconv:next"); } else { p = nextSibling(p); } } } /* Generate checks for input value integrity. */ { Parm *p = l; while (p != NIL) { String *arg = Getattr(p, "autoname"); String *tm = Getattr(p, "tmap:m3wrapincheck"); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapincheck", p); num_exceptions += addThrows(throws_hash, "m3wrapincheck", p); Replaceall(tm, "$input", arg); Printv(incheck, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapincheck:next"); } else { p = nextSibling(p); } } } Printv(rawcall, m3raw_name, ".", func_name, "(", NIL); /* Arguments to the raw C function */ { bool gencomma = false; Parm *p = l; while (p != NIL) { if (gencomma) { Printf(rawcall, ", "); } gencomma = true; addImports(m3wrap_impl.import, "m3wrapargraw", p); num_exceptions += addThrows(throws_hash, "m3wrapargraw", p); String *arg = Getattr(p, "autoname"); String *qualarg = NewString(""); if (!isInParam(p)) { String *tmparg = Getattr(p, "tmap:m3wrapoutname"); if (tmparg != NIL) { arg = tmparg; } if (multiretval /*&& isOutParam(p) - automatically fulfilled */ ) { Printf(qualarg, "%s.", result_name); } } Append(qualarg, arg); Setattr(p, "m3outarg", qualarg); String *tm = Getattr(p, "tmap:m3wrapargraw"); if (tm != NIL) { Replaceall(tm, "$input", arg); Replaceall(tm, "$output", qualarg); Printv(rawcall, tm, NIL); p = Getattr(p, "tmap:m3wrapargraw:next"); } else { //Printv(rawcall, Getattr(p,"lname"), NIL); Printv(rawcall, qualarg, NIL); p = nextSibling(p); } Delete(qualarg); } } Printf(rawcall, ")"); /* Check for error codes and integrity of results */ { String *tm = getMappedTypeNew(n, "m3wrapretcheck", "", false); if (tm != NIL) { addImports(m3wrap_impl.import, "m3wrapretcheck", n); num_exceptions += addThrows(throws_hash, "m3wrapretcheck", n); Printv(outcheck, tm, "\n", NIL); } Parm *p = l; while (p != NIL) { tm = Getattr(p, "tmap:m3wrapoutcheck"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapoutcheck", p); num_exceptions += addThrows(throws_hash, "m3wrapoutcheck", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printv(outcheck, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapoutcheck:next"); } else { p = nextSibling(p); } } } /* Convert the results to Modula 3 data structures and put them in the record prepared for returning */ { /* m3wrapretconv is processed when it is clear if there is some output conversion and checking code */ Parm *p = l; while (p != NIL) { String *tm = Getattr(p, "tmap:m3wrapoutconv"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapoutconv", n); num_exceptions += addThrows(throws_hash, "m3wrapoutconv", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printf(storeout, "%s := %s;\n", outarg, tm); p = Getattr(p, "tmap:m3wrapoutconv:next"); } else { p = nextSibling(p); } } } /* Generate cleanup code */ { Parm *p = l; while (p != NIL) { String *tm = Getattr(p, "tmap:m3wrapfreearg"); if (tm != NIL) { String *arg = Getattr(p, "autoname"); String *outarg = Getattr(p, "m3outarg"); addImports(m3wrap_impl.import, "m3wrapfreearg", p); num_exceptions += addThrows(throws_hash, "m3wrapfreearg", p); //substituteClassname(Getattr(p,"type"), tm); Replaceall(tm, "$input", arg); Replaceall(tm, "$output", outarg); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:m3wrapfreearg:next"); } else { p = nextSibling(p); } } } { /* Currently I don't know how a typemap similar to the original 'out' typemap could help returning the return value. */ /* Receive result from call to raw library function */ if (!has_return_raw) { /* rawcall(arg1); result.val := arg1; RETURN result; */ /* rawcall(arg1); RETURN arg1; */ Printf(reccall, "%s;\n", rawcall); if (hasContent(result_name)) { Printf(outarg, "RETURN %s;\n", result_name); } } else { /* arg0 := rawcall(arg1); result.ret := Convert(arg0); result.val := arg1; RETURN result; */ /* arg0 := rawcall(); RETURN Convert(arg0); */ /* RETURN rawcall(); */ String *return_raw = getMappedTypeNew(n, "m3wrapretraw", "", false); String *return_conv = getMappedTypeNew(n, "m3wrapretconv", "", false); /* immediate RETURN would skip result checking */ if ((hasContent(outcheck) || hasContent(storeout) || hasContent(cleanup)) && (!hasContent(result_name)) && (return_raw == NIL)) { Printv(result_name, Swig_cresult_name(), NIL); Printf(local_variables, "%s: %s;\n", result_name, result_m3wraptype); } String *result_lvalue = Copy(result_name); if (multiretval) { Printf(result_lvalue, ".%s", result_return); } if (return_raw != NIL) { Printf(reccall, "%s := %s;\n", return_raw, rawcall); } else if (hasContent(result_name)) { Printf(reccall, "%s := %s;\n", result_lvalue, rawcall); } else { Printf(outarg, "RETURN %s;\n", rawcall); } if (return_conv != NIL) { addImports(m3wrap_impl.import, "m3wrapretconv", n); num_exceptions += addThrows(throws_hash, "m3wrapretconv", n); if (hasContent(result_name)) { Printf(reccall, "%s := %s;\n", result_lvalue, return_conv); Printf(outarg, "RETURN %s;\n", result_name); } else { Printf(outarg, "RETURN %s;\n", return_conv); } } else { if (hasContent(result_name)) { Printf(outarg, "RETURN %s;\n", result_name); } } } } /* Create procedure header */ { String *header = NewStringf("PROCEDURE %s (%s)", func_name, arguments); if ((num_returns > 0) || multiretval) { Printf(header, ": %s", result_m3wraptype); } generateThrowsClause(throws_hash, header); Append(function_code, header); m3wrap_intf.enterBlock(no_block); Printf(m3wrap_intf.f, "%s;\n\n", header); } { String *body = NewStringf("%s%s%s%s%s", incheck, setup, reccall, outcheck, storeout); String *exc_handler; if (hasContent(cleanup) && (num_exceptions > 0)) { exc_handler = NewStringf("TRY\n%sFINALLY\n%sEND;\n", body, cleanup); } else { exc_handler = NewStringf("%s%s", body, cleanup); } Printf(function_code, " =\n%s%s%s%sBEGIN\n%s%sEND %s;\n\n", hasContent(local_constants) ? "CONST\n" : "", local_constants, hasContent(local_variables) ? "VAR\n" : "", local_variables, exc_handler, outarg, func_name); Delete(exc_handler); Delete(body); } m3wrap_impl.enterBlock(no_block); if (proxy_flag && global_variable_flag) { setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(NSPACE_TODO, variable_name)) == 0); // Properties if (setter_flag) { // Setter method String *tm = getMappedTypeNew(n, "m3varin", ""); if (tm != NIL) { if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "true"); } else { Replaceall(tm, "$owner", "false"); } substituteClassname(t, tm); Replaceall(tm, "$rawcall", rawcall); Replaceall(tm, "$vartype", variable_type); /* $type is already replaced by some super class */ Replaceall(tm, "$var", variable_name); Printf(m3wrap_impl.f, "%s", tm); } } else { // Getter method String *tm = getMappedTypeNew(n, "m3varout", ""); if (tm != NIL) { if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "true"); else Replaceall(tm, "$owner", "false"); substituteClassname(t, tm); Replaceall(tm, "$rawcall", rawcall); Replaceall(tm, "$vartype", variable_type); Replaceall(tm, "$var", variable_name); Printf(m3wrap_impl.f, "%s", tm); } } } else { // Normal function call Printv(m3wrap_impl.f, function_code, NIL); } Delete(arguments); Delete(return_variables); Delete(local_variables); Delete(local_constants); Delete(outarg); Delete(incheck); Delete(outcheck); Delete(setup); Delete(cleanup); Delete(storeout); Delete(function_code); Delete(result_name); Delete(result_m3wraptype); Delete(reccall); Delete(rawcall); Delete(throws_hash); } /*---------------------------------------------------------------------- * replaceSpecialVariables() *--------------------------------------------------------------------*/ virtual void replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; SwigType *type = Getattr(parm, "type"); substituteClassname(type, tm); } /* ----------------------------------------------------------------------------- * substituteClassname() * * Substitute the special variable $m3classname with the proxy class name for classes/structs/unions * that SWIG knows about. * Otherwise use the $descriptor name for the Modula 3 class name. Note that the $&m3classname substitution * is the same as a $&descriptor substitution, ie one pointer added to descriptor name. * Inputs: * pt - parameter type * tm - typemap contents that might contain the special variable to be replaced * Outputs: * tm - typemap contents complete with the special variable substitution * Return: * substitution_performed - flag indicating if a substitution was performed * ----------------------------------------------------------------------------- */ bool substituteClassname(SwigType *pt, String *tm) { bool substitution_performed = false; if (Strstr(tm, "$m3classname") || Strstr(tm, "$&m3classname")) { String *classname = getProxyName(pt); if (classname) { Replaceall(tm, "$&m3classname", classname); // getProxyName() works for pointers to classes too Replaceall(tm, "$m3classname", classname); } else { // use $descriptor if SWIG does not know anything about this type. Note that any typedefs are resolved. String *descriptor = NULL; SwigType *type = Copy(SwigType_typedef_resolve_all(pt)); if (Strstr(tm, "$&m3classname")) { SwigType_add_pointer(type); descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); Replaceall(tm, "$&m3classname", descriptor); } else { // $m3classname descriptor = NewStringf("SWIGTYPE%s", SwigType_manglestr(type)); Replaceall(tm, "$m3classname", descriptor); } // Add to hash table so that the type wrapper classes can be created later Setattr(swig_types_hash, descriptor, type); Delete(descriptor); Delete(type); } substitution_performed = true; } return substitution_performed; } /* ----------------------------------------------------------------------------- * attachParameterNames() * * Inputs: * n - Node of a function declaration * tmid - attribute name for overriding C argument names, * e.g. "tmap:m3wrapinname", * don't forget to attach the mapped types before * nameid - attribute for attaching the names, * e.g. "modula3:inname" * fmt - format for the argument name containing %d * e.g. "arg%d" * ----------------------------------------------------------------------------- */ void attachParameterNames(Node *n, const char *tmid, const char *nameid, const char *fmt) { /* Use C parameter name if present and unique, otherwise create an 'arg%d' name */ Hash *hash = NewHash(); Parm *p = Getattr(n, "parms"); int count = 0; while (p != NIL) { String *name = Getattr(p, tmid); if (name == NIL) { name = Getattr(p, "name"); } String *newname; if ((!hasContent(name)) || (Getattr(hash, name) != NIL)) { newname = NewStringf(fmt, count); } else { newname = Copy(name); } if (1 == Setattr(hash, newname, "1")) { Swig_warning(WARN_MODULA3_DOUBLE_ID, input_file, line_number, "Argument '%s' twice.\n", newname); } Setattr(p, nameid, newname); // Delete(newname); p = nextSibling(p); count++; } Delete(hash); } /* ----------------------------------------------------------------------------- * createM3Signature() * * Create signature of M3 wrapper procedure * Call attachParameterNames and attach mapped types before! * m3wrapintype, m3wrapinmode, m3wrapindefault * ----------------------------------------------------------------------------- */ String *createM3Signature(Node *n) { String *arguments = NewString(""); Parm *p = skipIgnored(Getattr(n, "parms"), "m3wrapintype"); writeArgState state; while (p != NIL) { /* Get the M3 parameter type */ String *tm = getMappedType(p, "m3wrapintype"); if (tm != NIL) { if (isInParam(p)) { addImports(m3wrap_intf.import, "m3wrapintype", p); addImports(m3wrap_impl.import, "m3wrapintype", p); String *mode = Getattr(p, "tmap:m3wrapinmode"); String *deflt = Getattr(p, "tmap:m3wrapindefault"); String *arg = Getattr(p, "autoname"); SwigType *pt = Getattr(p, "type"); substituteClassname(pt, tm); /* do we need this ? */ writeArg(arguments, state, mode, arg, tm, deflt); } p = skipIgnored(Getattr(p, "tmap:m3wrapintype:next"), "m3wrapintype"); } else { p = nextSibling(p); } } writeArg(arguments, state, NIL, NIL, NIL, NIL); return (arguments); } /* not used any longer - try SwigType_str if required again */ #if 0 /* ----------------------------------------------------------------------------- * createCSignature() * * Create signature of C function * ----------------------------------------------------------------------------- */ String *createCSignature(Node *n) { String *arguments = NewString(""); bool gencomma = false; Node *p; for (p = Getattr(n, "parms"); p != NIL; p = nextSibling(p)) { if (gencomma) { Append(arguments, ","); } gencomma = true; String *type = Getattr(p, "type"); String *ctype = getMappedTypeNew(type, "ctype"); Append(arguments, ctype); } return arguments; } #endif /* ----------------------------------------------------------------------------- * emitTypeWrapperClass() * ----------------------------------------------------------------------------- */ void emitTypeWrapperClass(String *classname, SwigType *type) { Node *n = NewHash(); Setfile(n, input_file); Setline(n, line_number); String *filen = NewStringf("%s%s.m3", SWIG_output_directory(), classname); File *f_swigtype = NewFile(filen, "w", SWIG_output_files()); if (!f_swigtype) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } String *swigtype = NewString(""); // Emit banner name emitBanner(f_swigtype); // Pure Modula 3 baseclass and interfaces const String *pure_baseclass = typemapLookup(n, "m3base", type, WARN_NONE); const String *pure_interfaces = typemapLookup(n, "m3interfaces", type, WARN_NONE); // Emit the class Printv(swigtype, typemapLookup(n, "m3imports", type, WARN_NONE), // Import statements "\n", typemapLookup(n, "m3classmodifiers", type, WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF), // Class modifiers " class $m3classname", // Class name and bases *Char(pure_baseclass) ? " : " : "", pure_baseclass, *Char(pure_interfaces) ? // Interfaces " : " : "", pure_interfaces, " {\n", " private IntPtr swigCPtr;\n", "\n", " ", typemapLookup(n, "m3ptrconstructormodifiers", type, WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF), // pointer constructor modifiers " $m3classname(IntPtr cPtr, bool bFutureUse) {\n", // Constructor used for wrapping pointers " swigCPtr = cPtr;\n", " }\n", "\n", " protected $m3classname() {\n", // Default constructor " swigCPtr = IntPtr.Zero;\n", " }\n", typemapLookup(n, "m3getcptr", type, WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF), // getCPtr method typemapLookup(n, "m3code", type, WARN_NONE), // extra Modula 3 code "}\n", "\n", NIL); Replaceall(swigtype, "$m3classname", classname); Printv(f_swigtype, swigtype, NIL); Delete(f_swigtype); Delete(filen); Delete(swigtype); } /* ----------------------------------------------------------------------------- * typemapLookup() * n - for input only and must contain info for Getfile(n) and Getline(n) to work * tmap_method - typemap method name * type - typemap type to lookup * warning - warning number to issue if no typemaps found * typemap_attributes - the typemap attributes are attached to this node and will * also be used for temporary storage if non null * return is never NULL, unlike Swig_typemap_lookup() * ----------------------------------------------------------------------------- */ const String *typemapLookup(Node *n, const_String_or_char_ptr tmap_method, SwigType *type, int warning, Node *typemap_attributes = 0) { Node *node = !typemap_attributes ? NewHash() : typemap_attributes; Setattr(node, "type", type); Setfile(node, Getfile(n)); Setline(node, Getline(n)); const String *tm = Swig_typemap_lookup(tmap_method, node, "", 0); if (!tm) { tm = empty_string; if (warning != WARN_NONE) Swig_warning(warning, Getfile(n), Getline(n), "No %s typemap defined for %s\n", tmap_method, SwigType_str(type, 0)); } if (!typemap_attributes) Delete(node); return tm; } /* ----------------------------------------------------------------------------- * addThrows() * * Add all exceptions to a hash that are associated with the 'typemap'. * Return number the number of these exceptions. * ----------------------------------------------------------------------------- */ int addThrows(Hash *throws_hash, const String *typemap, Node *parameter) { // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in int len = 0; String *throws_attribute = NewStringf("%s:throws", typemap); addImports(m3wrap_intf.import, throws_attribute, parameter); addImports(m3wrap_impl.import, throws_attribute, parameter); String *throws = getMappedTypeNew(parameter, Char(throws_attribute), "", false); //printf("got exceptions %s for %s\n", Char(throws), Char(throws_attribute)); if (throws) { // Put the exception classes in the throws clause into a temporary List List *temp_classes_list = Split(throws, ',', INT_MAX); len = Len(temp_classes_list); // Add the exception classes to the node throws list, but don't duplicate if already in list if (temp_classes_list /*&& hasContent(temp_classes_list) */ ) { for (Iterator cls = First(temp_classes_list); cls.item != NIL; cls = Next(cls)) { String *exception_class = NewString(cls.item); Replaceall(exception_class, " ", ""); // remove spaces Replaceall(exception_class, "\t", ""); // remove tabs if (hasContent(exception_class)) { // $m3classname substitution SwigType *pt = Getattr(parameter, "type"); substituteClassname(pt, exception_class); // Don't duplicate the exception class in the throws clause //printf("add exception %s\n", Char(exception_class)); Setattr(throws_hash, exception_class, "1"); } Delete(exception_class); } } Delete(temp_classes_list); } Delete(throws_attribute); return len; } /* ----------------------------------------------------------------------------- * generateThrowsClause() * ----------------------------------------------------------------------------- */ void generateThrowsClause(Hash *throws_hash, String *code) { // Add the throws clause into code if (Len(throws_hash) > 0) { Iterator cls = First(throws_hash); Printf(code, " RAISES {%s", cls.key); for (cls = Next(cls); cls.key != NIL; cls = Next(cls)) { Printf(code, ", %s", cls.key); } Printf(code, "}"); } } /* ----------------------------------------------------------------------------- * addImports() * * Add all imports that are needed for contents of 'typemap'. * ----------------------------------------------------------------------------- */ void addImports(Hash *imports_hash, const String *typemap, Node *node) { // Get the comma separated throws clause - held in "throws" attribute in the typemap passed in String *imports_attribute = NewStringf("%s:import", typemap); String *imports = getMappedTypeNew(node, Char(imports_attribute), "", false); //printf("got imports %s for %s\n", Char(imports), Char(imports_attribute)); if (imports != NIL) { List *import_list = Split(imports, ',', INT_MAX); // Add the exception classes to the node imports list, but don't duplicate if already in list if (import_list != NIL) { for (Iterator imp = First(import_list); imp.item != NIL; imp = Next(imp)) { List *import_pair = Split(imp.item, ' ', 3); if (Len(import_pair) == 1) { Setattr(imports_hash, Getitem(import_pair, 0), ""); } else if ((Len(import_pair) == 3) && Strcmp(Getitem(import_pair, 1), "AS") == 0) { Setattr(imports_hash, Getitem(import_pair, 0), Getitem(import_pair, 2)); } else { Swig_warning(WARN_MODULA3_BAD_IMPORT, input_file, line_number, "Malformed import '%s' for typemap '%s' defined for type '%s'\n", imp, typemap, SwigType_str(Getattr(node, "type"), 0)); } Delete(import_pair); } } Delete(import_list); } Delete(imports_attribute); } /* ----------------------------------------------------------------------------- * emitImportStatements() * ----------------------------------------------------------------------------- */ void emitImportStatements(Hash *imports_hash, String *code) { // Add the imports statements into code Iterator imp = First(imports_hash); while (imp.key != NIL) { Printf(code, "IMPORT %s", imp.key); String *imp_as = imp.item; if (hasContent(imp_as)) { Printf(code, " AS %s", imp_as); } Printf(code, ";\n"); imp = Next(imp); } } }; /* class MODULA3 */ /* ----------------------------------------------------------------------------- * swig_modula3() - Instantiate module * ----------------------------------------------------------------------------- */ extern "C" Language *swig_modula3(void) { return new MODULA3(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ const char *MODULA3::usage = "\ Modula 3 Options (available with -modula3)\n\ -generateconst - Generate code for computing numeric values of constants\n\ -generaterename - Generate suggestions for %rename\n\ -generatetypemap - Generate templates for some basic typemaps\n\ -oldvarnames - Old intermediary method names for variable wrappers\n\ \n"; /* -generateconst - stem of the .c source file for computing the numeric values of constants\n\ -generaterename - stem of the .i source file containing %rename suggestions\n\ -generatetypemap - stem of the .i source file containing typemap patterns\n\ */ swig-3.0.12/Source/Modules/nested.cxx0000664000175000017500000003013513042756442017315 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * nested.cxx * * Nested structs support * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" // Nested classes processing section static Hash *classhash = 0; static String *make_name(Node *n, String *name, SwigType *decl) { int destructor = name && (*(Char(name)) == '~'); if (String *yyrename = Getattr(n, "class_rename")) { String *s = NewString(yyrename); Delattr(n, "class_rename"); if (destructor && (*(Char(s)) != '~')) { Insert(s, 0, "~"); } return s; } if (!name) return 0; return Swig_name_make(n, 0, name, decl, 0); } // C version of add_symbols() static void add_symbols_c(Node *n) { String *decl; String *wrn = 0; String *symname = 0; int iscdecl = Cmp(nodeType(n), "cdecl") == 0; Setattr(n, "ismember", "1"); Setattr(n, "access", "public"); if (Getattr(n, "sym:name")) return; decl = Getattr(n, "decl"); if (!SwigType_isfunction(decl)) { String *name = Getattr(n, "name"); String *makename = Getattr(n, "parser:makename"); if (iscdecl) { String *storage = Getattr(n, "storage"); if (Cmp(storage, "typedef") == 0) { Setattr(n, "kind", "typedef"); } else { SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); Setattr(n, "kind", "variable"); if (value && Len(value)) { Setattr(n, "hasvalue", "1"); } if (type) { SwigType *ty; SwigType *tmp = 0; if (decl) { ty = tmp = Copy(type); SwigType_push(ty, decl); } else { ty = type; } if (!SwigType_ismutable(ty)) { SetFlag(n, "hasconsttype"); SetFlag(n, "feature:immutable"); } if (tmp) Delete(tmp); } if (!type) { Printf(stderr, "notype name %s\n", name); } } } Swig_features_get(Swig_cparse_features(), 0, name, 0, n); if (makename) { symname = make_name(n, makename, 0); Delattr(n, "parser:makename"); /* temporary information, don't leave it hanging around */ } else { makename = name; symname = make_name(n, makename, 0); } if (!symname) { symname = Copy(Getattr(n, "unnamed")); } if (symname) { wrn = Swig_name_warning(n, 0, symname, 0); } } else { String *name = Getattr(n, "name"); SwigType *fdecl = Copy(decl); SwigType *fun = SwigType_pop_function(fdecl); if (iscdecl) { Setattr(n, "kind", "function"); } Swig_features_get(Swig_cparse_features(), 0, name, fun, n); symname = make_name(n, name, fun); wrn = Swig_name_warning(n, 0, symname, fun); Delete(fdecl); Delete(fun); } if (!symname) return; if (GetFlag(n, "feature:ignore")) { /* Only add to C symbol table and continue */ Swig_symbol_add(0, n); } else if (strncmp(Char(symname), "$ignore", 7) == 0) { char *c = Char(symname) + 7; SetFlag(n, "feature:ignore"); if (strlen(c)) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", c + 1); SWIG_WARN_NODE_END(n); } Swig_symbol_add(0, n); } else { Node *c; if ((wrn) && (Len(wrn))) { String *metaname = symname; if (!Getmeta(metaname, "already_warned")) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0, Getfile(n), Getline(n), "%s\n", wrn); SWIG_WARN_NODE_END(n); Setmeta(metaname, "already_warned", "1"); } } c = Swig_symbol_add(symname, n); if (c != n) { /* symbol conflict attempting to add in the new symbol */ if (Getattr(n, "sym:weak")) { Setattr(n, "sym:name", symname); } else { String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); int redefined = Swig_need_redefined_warn(n, c, true); if (redefined) { Printf(en, "Identifier '%s' redefined (ignored)", symname); Printf(ec, "previous definition of '%s'", symname); } else { Printf(en, "Redundant redeclaration of '%s'", symname); Printf(ec, "previous declaration of '%s'", symname); } if (Cmp(symname, Getattr(n, "name"))) { Printf(en, " (Renamed from '%s')", SwigType_namestr(Getattr(n, "name"))); } Printf(en, ","); if (Cmp(symname, Getattr(c, "name"))) { Printf(ec, " (Renamed from '%s')", SwigType_namestr(Getattr(c, "name"))); } Printf(ec, "."); SWIG_WARN_NODE_BEGIN(n); if (redefined) { Swig_warning(WARN_PARSE_REDEFINED, Getfile(n), Getline(n), "%s\n", en); Swig_warning(WARN_PARSE_REDEFINED, Getfile(c), Getline(c), "%s\n", ec); } else { Swig_warning(WARN_PARSE_REDUNDANT, Getfile(n), Getline(n), "%s\n", en); Swig_warning(WARN_PARSE_REDUNDANT, Getfile(c), Getline(c), "%s\n", ec); } SWIG_WARN_NODE_END(n); Printf(e, "%s:%d:%s\n%s:%d:%s\n", Getfile(n), Getline(n), en, Getfile(c), Getline(c), ec); Setattr(n, "error", e); Delete(e); Delete(en); Delete(ec); } } } Delete(symname); } /* Strips C-style and C++-style comments from string in-place. */ static void strip_comments(char *string) { int state = 0; /* * 0 - not in comment * 1 - in c-style comment * 2 - in c++-style comment * 3 - in string * 4 - after reading / not in comments * 5 - after reading * in c-style comments * 6 - after reading \ in strings */ char *c = string; while (*c) { switch (state) { case 0: if (*c == '\"') state = 3; else if (*c == '/') state = 4; break; case 1: if (*c == '*') state = 5; *c = ' '; break; case 2: if (*c == '\n') state = 0; else *c = ' '; break; case 3: if (*c == '\"') state = 0; else if (*c == '\\') state = 6; break; case 4: if (*c == '/') { *(c - 1) = ' '; *c = ' '; state = 2; } else if (*c == '*') { *(c - 1) = ' '; *c = ' '; state = 1; } else state = 0; break; case 5: if (*c == '/') state = 0; else state = 1; *c = ' '; break; case 6: state = 3; break; } ++c; } } // Create a %insert with a typedef to make a new name visible to C static Node *create_insert(Node *n, bool noTypedef = false) { // format a typedef String *ccode = Getattr(n, "code"); Push(ccode, " "); if (noTypedef) { Push(ccode, Getattr(n, "name")); Push(ccode, " "); Push(ccode, Getattr(n, "kind")); } else { Push(ccode, Getattr(n, "kind")); Push(ccode, "typedef "); Append(ccode, " "); Append(ccode, Getattr(n, "tdname")); } Append(ccode, ";"); /* Strip comments - further code may break in presence of comments. */ strip_comments(Char(ccode)); /* Make all SWIG created typedef structs/unions/classes unnamed else redefinition errors occur - nasty hack alert. */ if (!noTypedef) { const char *types_array[3] = { "struct", "union", "class" }; for (int i = 0; i < 3; i++) { char *code_ptr = Char(ccode); while (code_ptr) { /* Replace struct name (as in 'struct name {...}' ) with whitespace name will be between struct and opening brace */ code_ptr = strstr(code_ptr, types_array[i]); if (code_ptr) { char *open_bracket_pos; code_ptr += strlen(types_array[i]); open_bracket_pos = strchr(code_ptr, '{'); if (open_bracket_pos) { /* Make sure we don't have something like struct A a; */ char *semi_colon_pos = strchr(code_ptr, ';'); if (!(semi_colon_pos && (semi_colon_pos < open_bracket_pos))) while (code_ptr < open_bracket_pos) *code_ptr++ = ' '; } } } } } { /* Remove SWIG directive %constant which may be left in the SWIG created typedefs */ char *code_ptr = Char(ccode); while (code_ptr) { code_ptr = strstr(code_ptr, "%constant"); if (code_ptr) { char *directive_end_pos = strchr(code_ptr, ';'); if (directive_end_pos) { while (code_ptr <= directive_end_pos) *code_ptr++ = ' '; } } } } Node *newnode = NewHash(); set_nodeType(newnode, "insert"); Setfile(newnode, Getfile(n)); Setline(newnode, Getline(n)); String *code = NewStringEmpty(); Wrapper_pretty_print(ccode, code); Setattr(newnode, "code", code); Delete(code); Delattr(n, "code"); return newnode; } static void insertNodeAfter(Node *n, Node *c) { Node *g = parentNode(n); set_parentNode(c, g); Node *ns = nextSibling(n); if (Node *outer = Getattr(c, "nested:outer")) { while (ns && outer == Getattr(ns, "nested:outer")) { n = ns; ns = nextSibling(n); } } if (!ns) { set_lastChild(g, c); } else { set_nextSibling(c, ns); set_previousSibling(ns, c); } set_nextSibling(n, c); set_previousSibling(c, n); } void Swig_nested_name_unnamed_c_structs(Node *n) { if (!n) return; if (!classhash) classhash = Getattr(n, "classes"); Node *c = firstChild(n); while (c) { Node *next = nextSibling(c); if (String *declName = Getattr(c, "nested:unnamed")) { if (Node *outer = Getattr(c, "nested:outer")) { // generate a name String *name = NewStringf("%s_%s", Getattr(outer, "name"), declName); Delattr(c, "nested:unnamed"); // set the name to the class and symbol table Setattr(c, "tdname", name); Setattr(c, "name", name); Swig_symbol_setscope(Getattr(c, "symtab")); Swig_symbol_setscopename(name); // now that we have a name - gather base symbols if (List *publicBases = Getattr(c, "baselist")) { List *bases = Swig_make_inherit_list(name, publicBases, 0); Swig_inherit_base_symbols(bases); Delete(bases); } Setattr(classhash, name, c); // Merge the extension into the symbol table if (Node *am = Getattr(Swig_extend_hash(), name)) { Swig_extend_merge(c, am); Swig_extend_append_previous(c, am); Delattr(Swig_extend_hash(), name); } Swig_symbol_popscope(); // process declarations following this type (assign correct new type) SwigType *ty = Copy(name); Node *decl = nextSibling(c); List *declList = NewList(); while (decl && Getattr(decl, "nested:unnamedtype") == c) { Setattr(decl, "type", ty); Append(declList, decl); Delattr(decl, "nested:unnamedtype"); SetFlag(decl, "feature:immutable"); add_symbols_c(decl); decl = nextSibling(decl); } Delete(ty); Swig_symbol_setscope(Swig_symbol_global_scope()); add_symbols_c(c); Node *ins = create_insert(c); insertNodeAfter(c, ins); removeNode(c); insertNodeAfter(n, c); Delete(ins); Delattr(c, "nested:outer"); } else { // global unnamed struct - ignore it and it's instances SetFlag(c, "feature:ignore"); while (next && Getattr(next, "nested:unnamedtype") == c) { SetFlag(next, "feature:ignore"); next = nextSibling(next); } c = next; continue; } } else if (cparse_cplusplusout) { if (Getattr(c, "nested:outer")) { Node *ins = create_insert(c, true); insertNodeAfter(c, ins); Delete(ins); Delattr(c, "nested:outer"); } } // process children Swig_nested_name_unnamed_c_structs(c); c = next; } } static void remove_outer_class_reference(Node *n) { for (Node *c = firstChild(n); c; c = nextSibling(c)) { if (GetFlag(c, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None) { Delattr(c, "nested:outer"); remove_outer_class_reference(c); } } } void Swig_nested_process_classes(Node *n) { if (!n) return; Node *c = firstChild(n); while (c) { Node *next = nextSibling(c); if (!Getattr(c, "templatetype")) { if (GetFlag(c, "nested") && (GetFlag(c, "feature:flatnested") || Language::instance()->nestedClassesSupport() == Language::NCS_None)) { removeNode(c); if (!checkAttribute(c, "access", "public")) SetFlag(c, "feature:ignore"); else if (Strcmp(nodeType(n),"extend") == 0 && Strcmp(nodeType(parentNode(n)),"class") == 0) insertNodeAfter(parentNode(n), c); else insertNodeAfter(n, c); } Swig_nested_process_classes(c); } c = next; } remove_outer_class_reference(n); } swig-3.0.12/Source/Modules/allocate.cxx0000664000175000017500000007426313042756442017631 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * allocate.cxx * * This module tries to figure out which classes and structures support * default constructors and destructors in C++. There are several rules that * define this behavior including pure abstract methods, private sections, * and non-default constructors in base classes. See the ARM or * Doc/Manual/SWIGPlus.html for details. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" static int virtual_elimination_mode = 0; /* set to 0 on default */ /* Set virtual_elimination_mode */ void Wrapper_virtual_elimination_mode_set(int flag) { virtual_elimination_mode = flag; } /* Helper function to assist with abstract class checking. This is a major hack. Sorry. */ extern "C" { static String *search_decl = 0; /* Declarator being searched */ static int check_implemented(Node *n) { String *decl; if (!n) return 0; while (n) { if (Strcmp(nodeType(n), "cdecl") == 0) { decl = Getattr(n, "decl"); if (SwigType_isfunction(decl)) { SwigType *decl1 = SwigType_typedef_resolve_all(decl); SwigType *decl2 = SwigType_pop_function(decl1); if (Strcmp(decl2, search_decl) == 0) { if (!GetFlag(n, "abstract")) { Delete(decl1); Delete(decl2); return 1; } } Delete(decl1); Delete(decl2); } } n = Getattr(n, "csym:nextSibling"); } return 0; } } class Allocate:public Dispatcher { Node *inclass; int extendmode; /* Checks if a function, n, is the same as any in the base class, ie if the method is polymorphic. * Also checks for methods which will be hidden (ie a base has an identical non-virtual method). * Both methods must have public access for a match to occur. */ int function_is_defined_in_bases(Node *n, Node *bases) { if (!bases) return 0; String *this_decl = Getattr(n, "decl"); if (!this_decl) return 0; String *name = Getattr(n, "name"); String *this_type = Getattr(n, "type"); String *resolved_decl = SwigType_typedef_resolve_all(this_decl); // Search all base classes for methods with same signature for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); Node *base = firstChild(b); while (base) { if (Strcmp(nodeType(base), "extend") == 0) { // Loop through all the %extend methods Node *extend = firstChild(base); while (extend) { if (function_is_defined_in_bases_seek(n, b, extend, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } extend = nextSibling(extend); } } else if (Strcmp(nodeType(base), "using") == 0) { // Loop through all the using declaration methods Node *usingdecl = firstChild(base); while (usingdecl) { if (function_is_defined_in_bases_seek(n, b, usingdecl, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } usingdecl = nextSibling(usingdecl); } } else { // normal methods if (function_is_defined_in_bases_seek(n, b, base, this_decl, name, this_type, resolved_decl)) { Delete(resolved_decl); return 1; } } base = nextSibling(base); } } Delete(resolved_decl); resolved_decl = 0; for (int j = 0; j < Len(bases); j++) { Node *b = Getitem(bases, j); if (function_is_defined_in_bases(n, Getattr(b, "allbases"))) return 1; } return 0; } /* Helper function for function_is_defined_in_bases */ int function_is_defined_in_bases_seek(Node *n, Node *b, Node *base, String *this_decl, String *name, String *this_type, String *resolved_decl) { String *base_decl = Getattr(base, "decl"); SwigType *base_type = Getattr(base, "type"); if (base_decl && base_type) { if (checkAttribute(base, "name", name) && !GetFlag(b, "feature:ignore") /* whole class is ignored */ ) { if (SwigType_isfunction(resolved_decl) && SwigType_isfunction(base_decl)) { // We have found a method that has the same name as one in a base class bool covariant_returntype = false; bool returntype_match = Strcmp(base_type, this_type) == 0 ? true : false; bool decl_match = Strcmp(base_decl, this_decl) == 0 ? true : false; if (returntype_match && decl_match) { // Exact match - we have found a method with identical signature // No typedef resolution was done, but skipping it speeds things up slightly } else { // Either we have: // 1) matching methods but are one of them uses a different typedef (return type or parameter) to the one in base class' method // 2) matching polymorphic methods with covariant return type // 3) a non-matching method (ie an overloaded method of some sort) // 4) a matching method which is not polymorphic, ie it hides the base class' method // Check if fully resolved return types match (including // covariant return types) if (!returntype_match) { String *this_returntype = function_return_type(n); String *base_returntype = function_return_type(base); returntype_match = Strcmp(this_returntype, base_returntype) == 0 ? true : false; if (!returntype_match) { covariant_returntype = SwigType_issubtype(this_returntype, base_returntype) ? true : false; returntype_match = covariant_returntype; } Delete(this_returntype); Delete(base_returntype); } // The return types must match at this point, for the whole method to match if (returntype_match && !decl_match) { // Now need to check the parameter list // First do an inexpensive parameter count ParmList *this_parms = Getattr(n, "parms"); ParmList *base_parms = Getattr(base, "parms"); if (ParmList_len(this_parms) == ParmList_len(base_parms)) { // Number of parameters are the same, now check that all the parameters match SwigType *base_fn = NewString(""); SwigType *this_fn = NewString(""); SwigType_add_function(base_fn, base_parms); SwigType_add_function(this_fn, this_parms); base_fn = SwigType_typedef_resolve_all(base_fn); this_fn = SwigType_typedef_resolve_all(this_fn); if (Strcmp(base_fn, this_fn) == 0) { // Finally check that the qualifiers match int base_qualifier = SwigType_isqualifier(resolved_decl); int this_qualifier = SwigType_isqualifier(base_decl); if (base_qualifier == this_qualifier) { decl_match = true; } } Delete(base_fn); Delete(this_fn); } } } //Printf(stderr,"look %s %s %d %d\n",base_decl, this_decl, returntype_match, decl_match); if (decl_match && returntype_match) { // Found an identical method in the base class bool this_wrapping_protected_members = is_member_director(n) ? true : false; // This should really check for dirprot rather than just being a director method bool base_wrapping_protected_members = is_member_director(base) ? true : false; // This should really check for dirprot rather than just being a director method bool both_have_public_access = is_public(n) && is_public(base); bool both_have_protected_access = (is_protected(n) && this_wrapping_protected_members) && (is_protected(base) && base_wrapping_protected_members); bool both_have_private_access = is_private(n) && is_private(base); if (checkAttribute(base, "storage", "virtual")) { // Found a polymorphic method. // Mark the polymorphic method, in case the virtual keyword was not used. Setattr(n, "storage", "virtual"); if (!Getattr(b, "feature:interface")) { // interface implementation neither hides nor overrides if (both_have_public_access || both_have_protected_access) { if (!is_non_public_base(inclass, b)) Setattr(n, "override", base); // Note C# definition of override, ie access must be the same } else if (!both_have_private_access) { // Different access if (this_wrapping_protected_members || base_wrapping_protected_members) if (!is_non_public_base(inclass, b)) Setattr(n, "hides", base); // Note C# definition of hiding, ie hidden if access is different } } // Try and find the most base's covariant return type SwigType *most_base_covariant_type = Getattr(base, "covariant"); if (!most_base_covariant_type && covariant_returntype) most_base_covariant_type = function_return_type(base, false); if (!most_base_covariant_type) { // Eliminate the derived virtual method. if (virtual_elimination_mode && !is_member_director(n)) if (both_have_public_access) if (!is_non_public_base(inclass, b)) if (!Swig_symbol_isoverloaded(n)) { // Don't eliminate if an overloaded method as this hides the method // in the scripting languages: the dispatch function will hide the base method if ignored. SetFlag(n, "feature:ignore"); } } else { // Some languages need to know about covariant return types Setattr(n, "covariant", most_base_covariant_type); } } else { // Found an identical method in the base class, but it is not polymorphic. if (both_have_public_access || both_have_protected_access) if (!is_non_public_base(inclass, b)) Setattr(n, "hides", base); } if (both_have_public_access || both_have_protected_access) return 1; } } } } return 0; } /* Determines whether the base class, b, is in the list of private * or protected base classes for class n. */ bool is_non_public_base(Node *n, Node *b) { bool non_public_base = false; Node *bases = Getattr(n, "privatebases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *base = Getitem(bases, i); if (base == b) non_public_base = true; } } bases = Getattr(n, "protectedbases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *base = Getitem(bases, i); if (base == b) non_public_base = true; } } return non_public_base; } /* Returns the return type for a function. The node n should be a function. If resolve is true the fully returned type is fully resolved. Caller is responsible for deleting returned string. */ String *function_return_type(Node *n, bool resolve = true) { String *decl = Getattr(n, "decl"); SwigType *type = Getattr(n, "type"); String *ty = NewString(type); SwigType_push(ty, decl); if (SwigType_isqualifier(ty)) Delete(SwigType_pop(ty)); Delete(SwigType_pop_function(ty)); if (resolve) { String *unresolved = ty; ty = SwigType_typedef_resolve_all(unresolved); Delete(unresolved); } return ty; } /* Checks if a class member is the same as inherited from the class bases */ int class_member_is_defined_in_bases(Node *member, Node *classnode) { Node *bases; /* bases is the closest ancestors of classnode */ int defined = 0; bases = Getattr(classnode, "allbases"); if (!bases) return 0; { int old_mode = virtual_elimination_mode; if (is_member_director(classnode, member)) virtual_elimination_mode = 0; if (function_is_defined_in_bases(member, bases)) { defined = 1; } virtual_elimination_mode = old_mode; } if (defined) return 1; else return 0; } /* Checks to see if a class is abstract through inheritance, and saves the first node that seems to be abstract. */ int is_abstract_inherit(Node *n, Node *base = 0, int first = 0) { if (!first && (base == n)) return 0; if (!base) { /* Root node */ Symtab *stab = Getattr(n, "symtab"); /* Get symbol table for node */ Symtab *oldtab = Swig_symbol_setscope(stab); int ret = is_abstract_inherit(n, n, 1); Swig_symbol_setscope(oldtab); return ret; } List *abstracts = Getattr(base, "abstracts"); if (abstracts) { int dabstract = 0; int len = Len(abstracts); for (int i = 0; i < len; i++) { Node *nn = Getitem(abstracts, i); String *name = Getattr(nn, "name"); if (!name) continue; if (Strchr(name, '~')) continue; /* Don't care about destructors */ String *base_decl = Getattr(nn, "decl"); if (base_decl) base_decl = SwigType_typedef_resolve_all(base_decl); if (SwigType_isfunction(base_decl)) search_decl = SwigType_pop_function(base_decl); Node *dn = Swig_symbol_clookup_local_check(name, 0, check_implemented); Delete(search_decl); Delete(base_decl); if (!dn) { List *nabstracts = Getattr(n, "abstracts"); if (!nabstracts) { nabstracts = NewList(); Setattr(n, "abstracts", nabstracts); Delete(nabstracts); } Append(nabstracts, nn); if (!Getattr(n, "abstracts:firstnode")) { Setattr(n, "abstracts:firstnode", nn); } dabstract = base != n; } } if (dabstract) return 1; } List *bases = Getattr(base, "allbases"); if (!bases) return 0; for (int i = 0; i < Len(bases); i++) { if (is_abstract_inherit(n, Getitem(bases, i))) { return 1; } } return 0; } /* Grab methods used by smart pointers */ List *smart_pointer_methods(Node *cls, List *methods, int isconst, String *classname = 0) { if (!methods) { methods = NewList(); } Node *c = firstChild(cls); while (c) { if (Getattr(c, "error") || GetFlag(c, "feature:ignore")) { c = nextSibling(c); continue; } if (!isconst && (Strcmp(nodeType(c), "extend") == 0)) { methods = smart_pointer_methods(c, methods, isconst, Getattr(cls, "name")); } else if (Strcmp(nodeType(c), "cdecl") == 0) { if (!GetFlag(c, "feature:ignore")) { String *storage = Getattr(c, "storage"); if (!((Cmp(storage, "typedef") == 0)) && !((Cmp(storage, "friend") == 0))) { String *name = Getattr(c, "name"); String *symname = Getattr(c, "sym:name"); Node *e = Swig_symbol_clookup_local(name, 0); if (e && is_public(e) && !GetFlag(e, "feature:ignore") && (Cmp(symname, Getattr(e, "sym:name")) == 0)) { Swig_warning(WARN_LANG_DEREF_SHADOW, Getfile(e), Getline(e), "Declaration of '%s' shadows declaration accessible via operator->(),\n", name); Swig_warning(WARN_LANG_DEREF_SHADOW, Getfile(c), Getline(c), "previous declaration of '%s'.\n", name); } else { /* Make sure node with same name doesn't already exist */ int k; int match = 0; for (k = 0; k < Len(methods); k++) { e = Getitem(methods, k); if (Cmp(symname, Getattr(e, "sym:name")) == 0) { match = 1; break; } if (!Getattr(e, "sym:name") && (Cmp(name, Getattr(e, "name")) == 0)) { match = 1; break; } } if (!match) { Node *cc = c; while (cc) { Node *cp = cc; if (classname) { Setattr(cp, "extendsmartclassname", classname); } Setattr(cp, "allocate:smartpointeraccess", "1"); /* If constant, we have to be careful */ if (isconst) { SwigType *decl = Getattr(cp, "decl"); if (decl) { if (SwigType_isfunction(decl)) { /* If method, we only add if it's a const method */ if (SwigType_isconst(decl)) { Append(methods, cp); } } else { Append(methods, cp); } } else { Append(methods, cp); } } else { Append(methods, cp); } cc = Getattr(cc, "sym:nextSibling"); } } } } } } c = nextSibling(c); } /* Look for methods in base classes */ { Node *bases = Getattr(cls, "bases"); int k; for (k = 0; k < Len(bases); k++) { smart_pointer_methods(Getitem(bases, k), methods, isconst); } } /* Remove protected/private members */ { for (int i = 0; i < Len(methods);) { Node *n = Getitem(methods, i); if (!is_public(n)) { Delitem(methods, i); continue; } i++; } } return methods; } void mark_exception_classes(ParmList *p) { while (p) { SwigType *ty = Getattr(p, "type"); SwigType *t = SwigType_typedef_resolve_all(ty); if (SwigType_isreference(t) || SwigType_ispointer(t) || SwigType_isarray(t)) { Delete(SwigType_pop(t)); } Node *c = Swig_symbol_clookup(t, 0); if (c) { if (!GetFlag(c, "feature:exceptionclass")) { SetFlag(c, "feature:exceptionclass"); } } p = nextSibling(p); Delete(t); } } void process_exceptions(Node *n) { ParmList *catchlist = 0; /* the "catchlist" attribute is used to emit the block try {$action;} catch ; in emit.cxx and is either constructued from the "feature:catches" feature or copied from the node "throws" list. */ String *scatchlist = Getattr(n, "feature:catches"); if (scatchlist) { catchlist = Swig_cparse_parms(scatchlist, n); if (catchlist) { Setattr(n, "catchlist", catchlist); mark_exception_classes(catchlist); Delete(catchlist); } } ParmList *throws = Getattr(n, "throws"); if (throws) { /* if there is no explicit catchlist, we catch everything in the throws list */ if (!catchlist) { Setattr(n, "catchlist", throws); } mark_exception_classes(throws); } } public: Allocate(): inclass(NULL), extendmode(0) { } virtual int top(Node *n) { cplus_mode = PUBLIC; inclass = 0; extendmode = 0; emit_children(n); return SWIG_OK; } virtual int importDirective(Node *n) { return emit_children(n); } virtual int includeDirective(Node *n) { return emit_children(n); } virtual int externDeclaration(Node *n) { return emit_children(n); } virtual int namespaceDeclaration(Node *n) { return emit_children(n); } virtual int extendDirective(Node *n) { extendmode = 1; emit_children(n); extendmode = 0; return SWIG_OK; } virtual int classDeclaration(Node *n) { Symtab *symtab = Swig_symbol_current(); Swig_symbol_setscope(Getattr(n, "symtab")); save_value oldInclass(inclass); save_value oldAcessMode(cplus_mode); save_value oldExtendMode(extendmode); if (Getattr(n, "template")) extendmode = 0; if (!CPlusPlus) { /* Always have default constructors/destructors in C */ Setattr(n, "allocate:default_constructor", "1"); Setattr(n, "allocate:default_destructor", "1"); } if (Getattr(n, "allocate:visit")) return SWIG_OK; Setattr(n, "allocate:visit", "1"); /* Always visit base classes first */ { List *bases = Getattr(n, "bases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); classDeclaration(b); } } } inclass = n; String *kind = Getattr(n, "kind"); if (Strcmp(kind, "class") == 0) { cplus_mode = PRIVATE; } else { cplus_mode = PUBLIC; } emit_children(n); /* Check if the class is abstract via inheritance. This might occur if a class didn't have any pure virtual methods of its own, but it didn't implement all of the pure methods in a base class */ if (!Getattr(n, "abstracts") && is_abstract_inherit(n)) { if (((Getattr(n, "allocate:public_constructor") || (!GetFlag(n, "feature:nodefault") && !Getattr(n, "allocate:has_constructor"))))) { if (!GetFlag(n, "feature:notabstract")) { Node *na = Getattr(n, "abstracts:firstnode"); if (na) { Swig_warning(WARN_TYPE_ABSTRACT, Getfile(n), Getline(n), "Class '%s' might be abstract, " "no constructors generated,\n", SwigType_namestr(Getattr(n, "name"))); Swig_warning(WARN_TYPE_ABSTRACT, Getfile(na), Getline(na), "Method %s might not be implemented.\n", Swig_name_decl(na)); if (!Getattr(n, "abstracts")) { List *abstracts = NewList(); Append(abstracts, na); Setattr(n, "abstracts", abstracts); Delete(abstracts); } } } } } if (!Getattr(n, "allocate:has_constructor")) { /* No constructor is defined. We need to check a few things */ /* If class is abstract. No default constructor. Sorry */ if (Getattr(n, "abstracts")) { Delattr(n, "allocate:default_constructor"); } if (!Getattr(n, "allocate:default_constructor")) { /* Check base classes */ List *bases = Getattr(n, "allbases"); int allows_default = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow default constructor, we don't allow it either */ if (!Getattr(n, "allocate:default_constructor") && (!Getattr(n, "allocate:default_base_constructor"))) { allows_default = 0; } } if (allows_default) { Setattr(n, "allocate:default_constructor", "1"); } } } if (!Getattr(n, "allocate:has_copy_constructor")) { if (Getattr(n, "abstracts")) { Delattr(n, "allocate:copy_constructor"); } if (!Getattr(n, "allocate:copy_constructor")) { /* Check base classes */ List *bases = Getattr(n, "allbases"); int allows_copy = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow copy constructor, we don't allow it either */ if (!Getattr(n, "allocate:copy_constructor") && (!Getattr(n, "allocate:copy_base_constructor"))) { allows_copy = 0; } } if (allows_copy) { Setattr(n, "allocate:copy_constructor", "1"); } } } if (!Getattr(n, "allocate:has_destructor")) { /* No destructor was defined */ List *bases = Getattr(n, "allbases"); int allows_destruct = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow default destructor, we don't allow it either */ if (!Getattr(n, "allocate:default_destructor") && (!Getattr(n, "allocate:default_base_destructor"))) { allows_destruct = 0; } } if (allows_destruct) { Setattr(n, "allocate:default_destructor", "1"); } } if (!Getattr(n, "allocate:has_assign")) { /* No assignment operator was defined */ List *bases = Getattr(n, "allbases"); int allows_assign = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow assignment, we don't allow it either */ if (Getattr(n, "allocate:has_assign")) { allows_assign = !Getattr(n, "allocate:noassign"); } } if (!allows_assign) { Setattr(n, "allocate:noassign", "1"); } } if (!Getattr(n, "allocate:has_new")) { /* No new operator was defined */ List *bases = Getattr(n, "allbases"); int allows_new = 1; for (int i = 0; i < Len(bases); i++) { Node *n = Getitem(bases, i); /* If base class does not allow new operator, we don't allow it either */ if (Getattr(n, "allocate:has_new")) { allows_new = !Getattr(n, "allocate:nonew"); } } if (!allows_new) { Setattr(n, "allocate:nonew", "1"); } } /* Check if base classes allow smart pointers, but might be hidden */ if (!Getattr(n, "allocate:smartpointer")) { Node *sp = Swig_symbol_clookup("operator ->", 0); if (sp) { /* Look for parent */ Node *p = parentNode(sp); if (Strcmp(nodeType(p), "extend") == 0) { p = parentNode(p); } if (Strcmp(nodeType(p), "class") == 0) { if (GetFlag(p, "feature:ignore")) { Setattr(n, "allocate:smartpointer", Getattr(p, "allocate:smartpointer")); } } } } Swig_interface_propagate_methods(n); /* Only care about default behavior. Remove temporary values */ Setattr(n, "allocate:visit", "1"); Swig_symbol_setscope(symtab); return SWIG_OK; } virtual int accessDeclaration(Node *n) { String *kind = Getattr(n, "kind"); if (Cmp(kind, "public") == 0) { cplus_mode = PUBLIC; } else if (Cmp(kind, "private") == 0) { cplus_mode = PRIVATE; } else if (Cmp(kind, "protected") == 0) { cplus_mode = PROTECTED; } return SWIG_OK; } virtual int usingDeclaration(Node *n) { Node *c = 0; for (c = firstChild(n); c; c = nextSibling(c)) { if (Strcmp(nodeType(c), "cdecl") == 0) { process_exceptions(c); if (inclass) class_member_is_defined_in_bases(c, inclass); } } return SWIG_OK; } virtual int cDeclaration(Node *n) { process_exceptions(n); if (inclass) { /* check whether the member node n is defined in class node in class's bases */ class_member_is_defined_in_bases(n, inclass); /* Check to see if this is a static member or not. If so, we add an attribute cplus:staticbase that saves the current class */ if (Swig_storage_isstatic(n)) { Setattr(n, "cplus:staticbase", inclass); } String *name = Getattr(n, "name"); if (cplus_mode != PUBLIC) { if (Strcmp(name, "operator =") == 0) { /* Look for a private assignment operator */ if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_assign", "1"); Setattr(inclass, "allocate:noassign", "1"); } else if (Strcmp(name, "operator new") == 0) { /* Look for a private new operator */ if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_new", "1"); Setattr(inclass, "allocate:nonew", "1"); } } else { if (Strcmp(name, "operator =") == 0) { if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_assign", "1"); else Setattr(inclass, "allocate:noassign", "1"); } else if (Strcmp(name, "operator new") == 0) { if (!GetFlag(n, "deleted")) Setattr(inclass, "allocate:has_new", "1"); else Setattr(inclass, "allocate:nonew", "1"); } /* Look for smart pointer operator */ if ((Strcmp(name, "operator ->") == 0) && (!GetFlag(n, "feature:ignore"))) { /* Look for version with no parameters */ Node *sn = n; while (sn) { if (!Getattr(sn, "parms")) { SwigType *type = SwigType_typedef_resolve_all(Getattr(sn, "type")); SwigType_push(type, Getattr(sn, "decl")); Delete(SwigType_pop_function(type)); SwigType *base = SwigType_base(type); Node *sc = Swig_symbol_clookup(base, 0); if ((sc) && (Strcmp(nodeType(sc), "class") == 0)) { if (SwigType_check_decl(type, "p.")) { /* Need to check if type is a const pointer */ int isconst = 0; Delete(SwigType_pop(type)); if (SwigType_isconst(type)) { isconst = !Getattr(inclass, "allocate:smartpointermutable"); Setattr(inclass, "allocate:smartpointerconst", "1"); } else { Setattr(inclass, "allocate:smartpointermutable", "1"); } List *methods = smart_pointer_methods(sc, 0, isconst); Setattr(inclass, "allocate:smartpointer", methods); Setattr(inclass, "allocate:smartpointerpointeeclassname", Getattr(sc, "name")); } else { /* Hmmm. The return value is not a pointer. If the type is a value or reference. We're going to chase it to see if another operator->() can be found */ if ((SwigType_check_decl(type, "")) || (SwigType_check_decl(type, "r."))) { Node *nn = Swig_symbol_clookup("operator ->", Getattr(sc, "symtab")); if (nn) { Delete(base); Delete(type); sn = nn; continue; } } } } Delete(base); Delete(type); break; } } } } } return SWIG_OK; } virtual int constructorDeclaration(Node *n) { if (!inclass) return SWIG_OK; Parm *parms = Getattr(n, "parms"); process_exceptions(n); if (!extendmode) { if (!ParmList_numrequired(parms)) { /* Class does define a default constructor */ /* However, we had better see where it is defined */ if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:default_constructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:default_base_constructor", "1"); } } /* Class defines some kind of constructor. May or may not be public */ Setattr(inclass, "allocate:has_constructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:public_constructor", "1"); } } else { Setattr(inclass, "allocate:has_constructor", "1"); Setattr(inclass, "allocate:public_constructor", "1"); } /* See if this is a copy constructor */ if (parms && (ParmList_numrequired(parms) == 1)) { /* Look for a few cases. X(const X &), X(X &), X(X *) */ int copy_constructor = 0; SwigType *type = Getattr(inclass, "name"); String *tn = NewStringf("r.q(const).%s", type); String *cc = SwigType_typedef_resolve_all(tn); SwigType *rt = SwigType_typedef_resolve_all(Getattr(parms, "type")); if (SwigType_istemplate(type)) { String *tmp = Swig_symbol_template_deftype(cc, 0); Delete(cc); cc = tmp; tmp = Swig_symbol_template_deftype(rt, 0); Delete(rt); rt = tmp; } if (Strcmp(cc, rt) == 0) { copy_constructor = 1; } else { Delete(cc); cc = NewStringf("r.%s", Getattr(inclass, "name")); if (Strcmp(cc, Getattr(parms, "type")) == 0) { copy_constructor = 1; } else { Delete(cc); cc = NewStringf("p.%s", Getattr(inclass, "name")); String *ty = SwigType_strip_qualifiers(Getattr(parms, "type")); if (Strcmp(cc, ty) == 0) { copy_constructor = 1; } Delete(ty); } } Delete(cc); Delete(rt); Delete(tn); if (copy_constructor) { Setattr(n, "copy_constructor", "1"); Setattr(inclass, "allocate:has_copy_constructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:copy_constructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:copy_base_constructor", "1"); } } } return SWIG_OK; } virtual int destructorDeclaration(Node *n) { (void) n; if (!inclass) return SWIG_OK; if (!extendmode) { Setattr(inclass, "allocate:has_destructor", "1"); if (cplus_mode == PUBLIC) { Setattr(inclass, "allocate:default_destructor", "1"); } else if (cplus_mode == PROTECTED) { Setattr(inclass, "allocate:default_base_destructor", "1"); } else if (cplus_mode == PRIVATE) { Setattr(inclass, "allocate:private_destructor", "1"); } } else { Setattr(inclass, "allocate:has_destructor", "1"); Setattr(inclass, "allocate:default_destructor", "1"); } return SWIG_OK; } }; void Swig_default_allocators(Node *n) { if (!n) return; Allocate *a = new Allocate; a->top(n); delete a; } swig-3.0.12/Source/Modules/browser.cxx0000664000175000017500000002626013042756442017522 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * browser.cxx * * A web-base parse tree browser using SWILL. This is an optional * feature that's normally disabled. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #ifdef SWIG_SWILL extern "C" { #include "swill.h" } static FILE *out = 0; static Node *view_top = 0; class Browser:public Dispatcher { void show_checkbox(Node *t, Node *n) { int v = 0; if (Getmeta(n, "visible")) { v = 1; } if (v) { Printf(out, "[-] ", n, t, n, n); } else { Printf(out, "[+] ", n, t, n, n); } } void show_attributes(Node *obj) { if (!Getmeta(obj, "visible")) return; String *os = NewString(""); String *k; Iterator ki; ki = First(obj); while (ki.key) { k = ki.key; if ((Cmp(k, "nodeType") == 0) || (Cmp(k, "firstChild") == 0) || (Cmp(k, "lastChild") == 0) || (Cmp(k, "parentNode") == 0) || (Cmp(k, "nextSibling") == 0) || (Cmp(k, "previousSibling") == 0) || (*(Char(k)) == '$')) { /* Do nothing */ } else if (Cmp(k, "parms") == 0) { String *o = NewString(""); Printf(o, "%s", ParmList_protostr(Getattr(obj, k))); Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Replaceall(o, ">", ">"); Printf(os, "? %-12s - %s\n", Getattr(obj, k), k, o); Delete(o); } else { DOH *o; char *trunc = ""; if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 70) { trunc = "..."; } Replaceall(o, "&", "&"); Replaceall(o, "<", "<"); Printf(os, "? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj, k), k, o, trunc); Delete(o); } else { Printf(os, "? %-12s - %p\n", Getattr(obj, k), k, Getattr(obj, k)); } } ki = Next(ki); } Printf(out, "
\n%s
\n", Char(os)); Delete(os); } public: virtual int emit_one(Node *n) { char *tag = Char(nodeType(n)); char *file = Char(Getfile(n)); int line = Getline(n); char *name = GetChar(n, "name"); show_checkbox(view_top, n); Printf(out, "%s", n, tag); if (name) { Printf(out, " (%s)", name); } Printf(out, ". %s:%d\n", file, line); Printf(out, "
"); Dispatcher::emit_one(n); return SWIG_OK; } virtual int emit_children(Node *n) { if (Getmeta(n, "visible")) { Printf(out, "
\n"); Dispatcher::emit_children(n); Printf(out, "
\n"); } return SWIG_OK; } virtual int defaultHandler(Node *n) { show_attributes(n); return SWIG_OK; } virtual int top(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int includeDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int importDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int extendDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int classDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int templateDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int lambdaDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int enumDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int typemapDirective(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int namespaceDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } virtual int usingDeclaration(Node *n) { show_attributes(n); emit_children(n); return SWIG_OK; } }; static int browser_exit = 0; static Node *tree_top = 0; static Browser *browse = 0; /* ---------------------------------------------------------------------- * exit_handler() - Force the browser to exit * ---------------------------------------------------------------------- */ void exit_handler(FILE *f) { browser_exit = 1; Printf(f, "Terminated.\n"); } /* ---------------------------------------------------------------------- * node_handler() - Generate information about a specific node * ---------------------------------------------------------------------- */ static void display(FILE *f, Node *n) { /* Print standard HTML header */ Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); if (n != tree_top) { Printf(f, " [ Up ]", parentNode(n)); } Printf(f, " [ Symbols ]"); Printf(f, "

\n"); out = f; browse->emit_one(n); /* Print standard footer */ Printf(f, "


\n"); } void node_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(node)", &n)) { n = tree_top; } view_top = n; display(f, n); } /* ---------------------------------------------------------------------- * hide_handler() - Hide a node * ---------------------------------------------------------------------- */ void hide_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(hn)", &n)) { n = 0; } if (n) { Delmeta(n, "visible"); } node_handler(f); } void show_handler(FILE *f) { Node *n = 0; if (!swill_getargs("p(hn)", &n)) { n = 0; } if (n) { Setmeta(n, "visible", "1"); } node_handler(f); } void raw_data(FILE *out, Node *obj) { if (!obj) return; if (DohIsMapping(obj)) { String *k; Iterator ki; String *os = NewString(""); Printf(os, "Hash {\n"); ki = First(obj); while (ki.key) { k = ki.key; DOH *o; const char *trunc = ""; if (DohIsString(Getattr(obj, k))) { o = Str(Getattr(obj, k)); if (Len(o) > 70) { trunc = "..."; } Replaceall(o, "<", "<"); Printf(os, " ? %-12s - \"%(escape)-0.70s%s\"\n", Getattr(obj, k), k, o, trunc); Delete(o); } else { Printf(os, " ? %-12s - %p\n", Getattr(obj, k), k, Getattr(obj, k)); } ki = Next(ki); } Printf(os, "}\n"); Printf(out, "
\n%s
\n", Char(os)); Delete(os); } else if (DohIsString(obj)) { String *o = Str(obj); Replaceall(o, "<", "<"); Printf(out, "
\n%s
\n", Char(o)); Delete(o); } else if (DohIsSequence(obj)) { int i; String *os = NewString(""); Printf(os, "List [\n"); for (i = 0; i < Len(obj); i++) { DOH *o = Getitem(obj, i); const char *trunc = ""; if (DohIsString(o)) { String *s = Str(o); if (Len(s) > 70) { trunc = "..."; } Replaceall(o, "<", "<"); Printf(os, " ? [%d] - \"%(escape)-0.70s%s\"\n", o, i, s, trunc); Delete(s); } else { Printf(os, " ? [%d] - %p\n", o, i, o); } } Printf(os, "\n]\n"); Printf(out, "
\n%s
\n", Char(os)); Delete(os); } } void data_handler(FILE *f) { DOH *n = 0; if (!swill_getargs("p(n)", &n)) { n = 0; } Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); Printf(f, "

\n"); if (n) { raw_data(f, n); } /* Print standard footer */ Printf(f, "


\n"); } void symbol_handler(FILE *f) { Symtab *sym; char *name = 0; Printf(f, "SWIG-%s\n", Swig_package_version()); Printf(f, "SWIG-%s
\n", Swig_package_version()); Printf(f, "[ Exit ]"); Printf(f, " [ Top ]", tree_top); Printf(f, " [ Symbols ]"); Printf(f, "

\n"); if (!swill_getargs("p(sym)|s(name)", &sym, &name)) { sym = Swig_symbol_getscope(""); name = 0; } if (!sym) { Printf(f, "No symbol table specified!\n"); return; } { String *q = Swig_symbol_qualifiedscopename(sym); if (!Len(q)) { Printf(f, "Symbol table: :: (global)
\n"); } else { Printf(f, "Symbol table: %s
\n", q); } Delete(q); } fprintf(f, "

\n"); fprintf(f, "Symbol lookup:
\n"); fprintf(f, "\n", sym); fprintf(f, "Submit : \n"); fprintf(f, "
"); if (name) { Node *n = Swig_symbol_clookup(name, sym); Printf(f, "Symbol '%s':\n", name); Printf(f, "
\n"); if (!n) { Printf(f, "Not defined!\n"); } else { raw_data(f, n); } Printf(f, "
\n"); } Printf(f, "

Nested scopes
\n"); Printf(f, "

\n");
  {
    Hash *h;
    h = firstChild(sym);
    while (h) {
      Printf(f, "%s\n", h, Getattr(h, "name"));
      h = nextSibling(h);
    }
  }
  Printf(f, "
\n"); Printf(f, "

Symbol table contents
\n"); raw_data(f, Getattr(sym, "symtab")); Printf(f, "


\n"); } #endif void Swig_browser(Node *top, int port) { #ifdef SWIG_SWILL int sport; browser_exit = 0; /* Initialize the server */ sport = swill_init(port); if (sport < 0) { Printf(stderr, "Couldn't open socket on port %d. Sorry.\n", port); return; } browse = new Browser(); Setmeta(top, "visible", "1"); tree_top = top; Printf(stderr, "SWIG: Tree browser listening on port %d\n", sport); swill_handle("exit.html", exit_handler, 0); swill_handle("index.html", node_handler, 0); swill_handle("hide.html", hide_handler, 0); swill_handle("show.html", show_handler, 0); swill_handle("data.html", data_handler, 0); swill_handle("symbol.html", symbol_handler, 0); swill_netscape("index.html"); while (!browser_exit) { swill_serve(); } Printf(stderr, "Browser terminated.\n"); swill_close(); delete browse; return; #else (void) top; (void) port; #endif } swig-3.0.12/Source/Modules/guile.cxx0000664000175000017500000015371113042756442017146 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * guile.cxx * * Guile language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include // Note string broken in half for compilers that can't handle long strings static const char *usage = "\ Guile Options (available with -guile)\n\ -emitsetters - Emit procedures-with-setters for variables\n\ and structure slots.\n\ -emitslotaccessors - Emit accessor methods for all GOOPS slots\n" "\ -exportprimitive - Add the (export ...) code from scmstub into the\n\ GOOPS file.\n\ -goopsprefix - Prepend to all goops identifiers\n\ -Linkage - Use linkage protocol (default `simple')\n\ Use `module' for native Guile module linking\n\ (requires Guile >= 1.5.0). Use `passive' for\n\ passive linking (no C-level module-handling code),\n\ `ltdlmod' for Guile's old dynamic module\n\ convention (Guile <= 1.4), or `hobbit' for hobbit\n\ modules.\n\ -onlysetters - Don't emit traditional getter and setter\n\ procedures for structure slots,\n\ only emit procedures-with-setters.\n\ -package - Set the path of the module to \n\ (default NULL)\n\ -prefix - Use as prefix [default \"gswig_\"]\n\ -procdoc - Output procedure documentation to \n\ -procdocformat - Output procedure documentation in ;\n\ one of `guile-1.4', `plain', `texinfo'\n\ -proxy - Export GOOPS class definitions\n\ -primsuffix - Name appended to primitive module when exporting\n\ GOOPS classes. (default = \"primitive\")\n\ -scmstub - Output Scheme file with module declaration and\n\ exports; only with `passive' and `simple' linkage\n\ -useclassprefix - Prepend the class name to all goops identifiers\n\ \n"; static File *f_begin = 0; static File *f_runtime = 0; static File *f_header = 0; static File *f_wrappers = 0; static File *f_init = 0; static String *prefix = NewString("gswig_"); static char *module = 0; static String *package = 0; static enum { GUILE_LSTYLE_SIMPLE, // call `SWIG_init()' GUILE_LSTYLE_PASSIVE, // passive linking (no module code) GUILE_LSTYLE_MODULE, // native guile module linking (Guile >= 1.4.1) GUILE_LSTYLE_LTDLMOD_1_4, // old (Guile <= 1.4) dynamic module convention GUILE_LSTYLE_HOBBIT // use (hobbit4d link) } linkage = GUILE_LSTYLE_SIMPLE; static File *procdoc = 0; static bool scmstub = false; static String *scmtext; static bool goops = false; static String *goopstext; static String *goopscode; static String *goopsexport; static enum { GUILE_1_4, PLAIN, TEXINFO } docformat = GUILE_1_4; static int emit_setters = 0; static int only_setters = 0; static int emit_slot_accessors = 0; static int struct_member = 0; static String *beforereturn = 0; static String *return_nothing_doc = 0; static String *return_one_doc = 0; static String *return_multi_doc = 0; static String *exported_symbols = 0; static int exporting_destructor = 0; static String *swigtype_ptr = 0; /* GOOPS stuff */ static String *primsuffix = 0; static String *class_name = 0; static String *short_class_name = 0; static String *goops_class_methods; static int in_class = 0; static int have_constructor = 0; static int useclassprefix = 0; // -useclassprefix argument static String *goopsprefix = 0; // -goopsprefix argument static int primRenamer = 0; // if (use-modules ((...) :renamer ...) is exported to GOOPS file static int exportprimitive = 0; // -exportprimitive argument static String *memberfunction_name = 0; extern "C" { static int has_classname(Node *class_node) { return Getattr(class_node, "guile:goopsclassname") ? 1 : 0; } } class GUILE:public Language { public: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { int i; SWIG_library_directory("guile"); SWIG_typemap_lang("guile"); // Look for certain command line options for (i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-Linkage") == 0 || strcmp(argv[i], "-linkage") == 0) { if (argv[i + 1]) { if (0 == strcmp(argv[i + 1], "ltdlmod")) linkage = GUILE_LSTYLE_LTDLMOD_1_4; else if (0 == strcmp(argv[i + 1], "hobbit")) linkage = GUILE_LSTYLE_HOBBIT; else if (0 == strcmp(argv[i + 1], "simple")) linkage = GUILE_LSTYLE_SIMPLE; else if (0 == strcmp(argv[i + 1], "passive")) linkage = GUILE_LSTYLE_PASSIVE; else if (0 == strcmp(argv[i + 1], "module")) linkage = GUILE_LSTYLE_MODULE; else Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-procdoc") == 0) { if (argv[i + 1]) { procdoc = NewFile(argv[i + 1], "w", SWIG_output_files()); if (!procdoc) { FileErrorDisplay(argv[i + 1]); SWIG_exit(EXIT_FAILURE); } Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-procdocformat") == 0) { if (strcmp(argv[i + 1], "guile-1.4") == 0) docformat = GUILE_1_4; else if (strcmp(argv[i + 1], "plain") == 0) docformat = PLAIN; else if (strcmp(argv[i + 1], "texinfo") == 0) docformat = TEXINFO; else Swig_arg_error(); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else if (strcmp(argv[i], "-emit-setters") == 0 || strcmp(argv[i], "-emitsetters") == 0) { emit_setters = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-only-setters") == 0 || strcmp(argv[i], "-onlysetters") == 0) { emit_setters = 1; only_setters = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-emit-slot-accessors") == 0 || strcmp(argv[i], "-emitslotaccessors") == 0) { emit_slot_accessors = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-scmstub") == 0) { scmstub = true; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-shadow") == 0) || ((strcmp(argv[i], "-proxy") == 0))) { goops = true; Swig_mark_arg(i); } else if (strcmp(argv[i], "-gh") == 0) { Printf(stderr, "Deprecated command line option: -gh. Wrappers are always generated for the SCM interface. See documentation for more information regarding the deprecated GH interface.\n"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-scm") == 0) { Printf(stderr, "Deprecated command line option: -scm. Wrappers are always generated for the SCM interface. See documentation for more information regarding the deprecated GH interface.\n"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-primsuffix") == 0) { if (argv[i + 1]) { primsuffix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-goopsprefix") == 0) { if (argv[i + 1]) { goopsprefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-useclassprefix") == 0) { useclassprefix = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-exportprimitive") == 0) { exportprimitive = 1; // should use Swig_warning() here? Swig_mark_arg(i); } } } // set default value for primsuffix if (!primsuffix) primsuffix = NewString("primitive"); //goops support can only be enabled if passive or module linkage is used if (goops) { if (linkage != GUILE_LSTYLE_PASSIVE && linkage != GUILE_LSTYLE_MODULE) { Printf(stderr, "guile: GOOPS support requires passive or module linkage\n"); exit(1); } } if (goops) { // -proxy implies -emit-setters emit_setters = 1; } if ((linkage == GUILE_LSTYLE_PASSIVE && scmstub) || linkage == GUILE_LSTYLE_MODULE) primRenamer = 1; if (exportprimitive && primRenamer) { // should use Swig_warning() ? Printf(stderr, "guile: Warning: -exportprimitive only makes sense with passive linkage without a scmstub.\n"); } // Make sure `prefix' ends in an underscore if (prefix) { const char *px = Char(prefix); if (px[Len(prefix) - 1] != '_') Printf(prefix, "_"); } /* Add a symbol for this module */ Preprocessor_define("SWIGGUILE 1", 0); /* Read in default typemaps */ SWIG_config_file("guile_scm.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewString(""); f_init = NewString(""); f_header = NewString(""); f_wrappers = NewString(""); /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", f_init); scmtext = NewString(""); Swig_register_filebyname("scheme", scmtext); exported_symbols = NewString(""); goopstext = NewString(""); Swig_register_filebyname("goops", goopstext); goopscode = NewString(""); goopsexport = NewString(""); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGGUILE\n#define SWIGGUILE\n#endif\n\n"); /* Write out directives and declarations */ module = Swig_copy_string(Char(Getattr(n, "name"))); switch (linkage) { case GUILE_LSTYLE_SIMPLE: /* Simple linkage; we have to export the SWIG_init function. The user can rename the function by a #define. */ Printf(f_runtime, "#define SWIG_GUILE_INIT_STATIC extern\n"); break; default: /* Other linkage; we make the SWIG_init function static */ Printf(f_runtime, "#define SWIG_GUILE_INIT_STATIC static\n"); break; } if (CPlusPlus) { Printf(f_runtime, "extern \"C\" {\n\n"); } Printf(f_runtime, "SWIG_GUILE_INIT_STATIC void\nSWIG_init (void);\n"); if (CPlusPlus) { Printf(f_runtime, "\n}\n"); } Printf(f_runtime, "\n"); Language::top(n); /* Close module */ Printf(f_wrappers, "#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); SwigType_emit_type_table(f_runtime, f_wrappers); Printf(f_init, "}\n\n"); Printf(f_init, "#ifdef __cplusplus\n}\n#endif\n"); String *module_name = NewString(""); if (!module) Printv(module_name, "swig", NIL); else { if (package) Printf(module_name, "%s/%s", package, module); else Printv(module_name, module, NIL); } emit_linkage(module_name); Delete(module_name); if (procdoc) { Delete(procdoc); procdoc = NULL; } Delete(goopscode); Delete(goopsexport); Delete(goopstext); /* Close all of the files */ Dump(f_runtime, f_begin); Dump(f_header, f_begin); Dump(f_wrappers, f_begin); Wrapper_pretty_print(f_init, f_begin); Delete(f_header); Delete(f_wrappers); Delete(f_init); Delete(f_runtime); Delete(f_begin); return SWIG_OK; } void emit_linkage(String *module_name) { String *module_func = NewString(""); if (CPlusPlus) { Printf(f_init, "extern \"C\" {\n\n"); } Printv(module_func, module_name, NIL); Replaceall(module_func, "-", "_"); switch (linkage) { case GUILE_LSTYLE_SIMPLE: Printf(f_init, "\n/* Linkage: simple */\n"); break; case GUILE_LSTYLE_PASSIVE: Printf(f_init, "\n/* Linkage: passive */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); Printf(f_init, " SWIG_init();\n"); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Printf(f_init, "}\n"); break; case GUILE_LSTYLE_LTDLMOD_1_4: Printf(f_init, "\n/* Linkage: ltdlmod */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); Replaceall(mod, "/", " "); Printf(f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", mod); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; case GUILE_LSTYLE_MODULE: Printf(f_init, "\n/* Linkage: module */\n"); Replaceall(module_func, "/", "_"); Insert(module_func, 0, "scm_init_"); Append(module_func, "_module"); Printf(f_init, "static void SWIG_init_helper(void *data)\n"); Printf(f_init, "{\n SWIG_init();\n"); if (Len(exported_symbols) > 0) Printf(f_init, " scm_c_export(%sNULL);", exported_symbols); Printf(f_init, "\n}\n\n"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); if (goops) Printv(mod, "-", primsuffix, NIL); Replaceall(mod, "/", " "); Printf(f_init, " scm_c_define_module(\"%s\",\n", mod); Printf(f_init, " SWIG_init_helper, NULL);\n"); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; case GUILE_LSTYLE_HOBBIT: Printf(f_init, "\n/* Linkage: hobbit */\n"); Replaceall(module_func, "/", "_slash_"); Insert(module_func, 0, "scm_init_"); Printf(f_init, "SCM\n%s (void)\n{\n", module_func); { String *mod = NewString(module_name); Replaceall(mod, "/", " "); Printf(f_init, " scm_register_module_xxx (\"%s\", (void *) SWIG_init);\n", mod); Printf(f_init, " return SCM_UNSPECIFIED;\n"); Delete(mod); } Printf(f_init, "}\n"); break; default: abort(); // for now } if (scmstub) { /* Emit Scheme stub if requested */ String *primitive_name = NewString(module_name); if (goops) Printv(primitive_name, "-", primsuffix, NIL); String *mod = NewString(primitive_name); Replaceall(mod, "/", " "); String *fname = NewStringf("%s%s.scm", SWIG_output_directory(), primitive_name); Delete(primitive_name); File *scmstubfile = NewFile(fname, "w", SWIG_output_files()); if (!scmstubfile) { FileErrorDisplay(fname); SWIG_exit(EXIT_FAILURE); } Delete(fname); Swig_banner_target_lang(scmstubfile, ";;;"); Printf(scmstubfile, "\n"); if (linkage == GUILE_LSTYLE_SIMPLE || linkage == GUILE_LSTYLE_PASSIVE) Printf(scmstubfile, "(define-module (%s))\n\n", mod); Delete(mod); Printf(scmstubfile, "%s", scmtext); if ((linkage == GUILE_LSTYLE_SIMPLE || linkage == GUILE_LSTYLE_PASSIVE) && Len(exported_symbols) > 0) { String *ex = NewString(exported_symbols); Replaceall(ex, ", ", "\n "); Replaceall(ex, "\"", ""); Chop(ex); Printf(scmstubfile, "\n(export %s)\n", ex); Delete(ex); } Delete(scmstubfile); } if (goops) { String *mod = NewString(module_name); Replaceall(mod, "/", " "); String *fname = NewStringf("%s%s.scm", SWIG_output_directory(), module_name); File *goopsfile = NewFile(fname, "w", SWIG_output_files()); if (!goopsfile) { FileErrorDisplay(fname); SWIG_exit(EXIT_FAILURE); } Delete(fname); Swig_banner_target_lang(goopsfile, ";;;"); Printf(goopsfile, "\n"); Printf(goopsfile, "(define-module (%s))\n", mod); Printf(goopsfile, "%s\n", goopstext); Printf(goopsfile, "(use-modules (oop goops) (Swig common))\n"); if (primRenamer) { Printf(goopsfile, "(use-modules ((%s-%s) :renamer (symbol-prefix-proc 'primitive:)))\n", mod, primsuffix); } Printf(goopsfile, "%s\n(export %s)", goopscode, goopsexport); if (exportprimitive) { String *ex = NewString(exported_symbols); Replaceall(ex, ", ", "\n "); Replaceall(ex, "\"", ""); Chop(ex); Printf(goopsfile, "\n(export %s)", ex); Delete(ex); } Delete(mod); Delete(goopsfile); } Delete(module_func); if (CPlusPlus) { Printf(f_init, "\n}\n"); } } /* Return true iff T is a pointer type */ int is_a_pointer(SwigType *t) { return SwigType_ispointer(SwigType_typedef_resolve_all(t)); } /* Report an error handling the given type. */ void throw_unhandled_guile_type_error(SwigType *d) { Swig_warning(WARN_TYPEMAP_UNDEF, input_file, line_number, "Unable to handle type %s.\n", SwigType_str(d, 0)); } /* Write out procedure documentation */ void write_doc(const String *proc_name, const String *signature, const String *doc, const String *signature2 = NULL) { switch (docformat) { case GUILE_1_4: Printv(procdoc, "\f\n", NIL); Printv(procdoc, "(", signature, ")\n", NIL); if (signature2) Printv(procdoc, "(", signature2, ")\n", NIL); Printv(procdoc, doc, "\n", NIL); break; case PLAIN: Printv(procdoc, "\f", proc_name, "\n\n", NIL); Printv(procdoc, "(", signature, ")\n", NIL); if (signature2) Printv(procdoc, "(", signature2, ")\n", NIL); Printv(procdoc, doc, "\n\n", NIL); break; case TEXINFO: Printv(procdoc, "\f", proc_name, "\n", NIL); Printv(procdoc, "@deffn primitive ", signature, "\n", NIL); if (signature2) Printv(procdoc, "@deffnx primitive ", signature2, "\n", NIL); Printv(procdoc, doc, "\n", NIL); Printv(procdoc, "@end deffn\n\n", NIL); break; } } /* returns false if the typemap is an empty string */ bool handle_documentation_typemap(String *output, const String *maybe_delimiter, Parm *p, const String *typemap, const String *default_doc, const String *name = NULL) { String *tmp = NewString(""); String *tm; if (!(tm = Getattr(p, typemap))) { Printf(tmp, "%s", default_doc); tm = tmp; } bool result = (Len(tm) > 0); if (maybe_delimiter && Len(output) > 0 && Len(tm) > 0) { Printv(output, maybe_delimiter, NIL); } const String *pn = !name ? (const String *) Getattr(p, "name") : name; String *pt = Getattr(p, "type"); Replaceall(tm, "$name", pn); // legacy for $parmname Replaceall(tm, "$type", SwigType_str(pt, 0)); /* $NAME is like $name, but marked-up as a variable. */ String *ARGNAME = NewString(""); if (docformat == TEXINFO) Printf(ARGNAME, "@var{%s}", pn); else Printf(ARGNAME, "%(upper)s", pn); Replaceall(tm, "$NAME", ARGNAME); Replaceall(tm, "$PARMNAME", ARGNAME); Printv(output, tm, NIL); Delete(tmp); return result; } /* ------------------------------------------------------------ * functionWrapper() * Create a function declaration and register it with the interpreter. * ------------------------------------------------------------ */ virtual int functionWrapper(Node *n) { String *iname = Getattr(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); Parm *p; String *proc_name = 0; char source[256]; Wrapper *f = NewWrapper(); String *cleanup = NewString(""); String *outarg = NewString(""); String *signature = NewString(""); String *doc_body = NewString(""); String *returns = NewString(""); String *method_signature = NewString(""); String *primitive_args = NewString(""); Hash *scheme_arg_names = NewHash(); int num_results = 1; String *tmp = NewString(""); String *tm; int i; int numargs = 0; int numreq = 0; String *overname = 0; int args_passed_as_array = 0; int scheme_argnum = 0; bool any_specialized_arg = false; // Make a wrapper name for this String *wname = Swig_name_wrapper(iname); if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); args_passed_as_array = 1; } else { if (!addSymbol(iname, n)) { DelWrapper(f); return SWIG_ERROR; } } if (overname) { Append(wname, overname); } Setattr(n, "wrap:name", wname); // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); /* Emit locals etc. into f->code; figure out which args to ignore */ emit_parameter_variables(l, f); /* Attach the standard typemaps */ emit_attach_parmmaps(l, f); Setattr(n, "wrap:parms", l); /* Get number of required and total arguments */ numargs = emit_num_arguments(l); numreq = emit_num_required(l); /* Declare return variable */ Wrapper_add_local(f, "gswig_result", "SCM gswig_result"); Wrapper_add_local(f, "gswig_list_p", "SWIGUNUSED int gswig_list_p = 0"); /* Open prototype and signature */ Printv(f->def, "static SCM\n", wname, " (", NIL); if (args_passed_as_array) { Printv(f->def, "int argc, SCM *argv", NIL); } Printv(signature, proc_name, NIL); /* Now write code to extract the parameters */ for (i = 0, p = l; i < numargs; i++) { while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); int opt_p = (i >= numreq); // Produce names of source and target if (args_passed_as_array) sprintf(source, "argv[%d]", i); else sprintf(source, "s_%d", i); String *target = Getattr(p, "lname"); if (!args_passed_as_array) { if (i != 0) Printf(f->def, ", "); Printf(f->def, "SCM s_%d", i); } if (opt_p) { Printf(f->code, " if (%s != SCM_UNDEFINED) {\n", source); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", target); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printv(f->code, tm, "\n", NIL); SwigType *pb = SwigType_typedef_resolve_all(SwigType_base(pt)); SwigType *pn = Getattr(p, "name"); String *argname; scheme_argnum++; if (pn && !Getattr(scheme_arg_names, pn)) argname = pn; else { /* Anonymous arg or re-used argument name -- choose a name that cannot clash */ argname = NewStringf("%%arg%d", scheme_argnum); } if (procdoc) { if (i == numreq) { /* First optional argument */ Printf(signature, " #:optional"); } /* Add to signature (arglist) */ handle_documentation_typemap(signature, " ", p, "tmap:in:arglist", "$name", argname); /* Document the type of the arg in the documentation body */ handle_documentation_typemap(doc_body, ", ", p, "tmap:in:doc", "$NAME is of type <$type>", argname); } if (goops) { if (i < numreq) { if (strcmp("void", Char(pt)) != 0) { Node *class_node = Swig_symbol_clookup_check(pb, Getattr(n, "sym:symtab"), has_classname); String *goopsclassname = !class_node ? NULL : Getattr(class_node, "guile:goopsclassname"); /* do input conversion */ if (goopsclassname) { Printv(method_signature, " (", argname, " ", goopsclassname, ")", NIL); any_specialized_arg = true; } else { Printv(method_signature, " ", argname, NIL); } Printv(primitive_args, " ", argname, NIL); Setattr(scheme_arg_names, argname, p); } } } if (!pn) { Delete(argname); } p = Getattr(p, "tmap:in:next"); } else { throw_unhandled_guile_type_error(pt); p = nextSibling(p); } if (opt_p) Printf(f->code, " }\n"); } if (Len(doc_body) > 0) Printf(doc_body, ".\n"); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Pass output arguments back to the caller. */ /* Insert argument output code */ String *returns_argout = NewString(""); for (p = l; p;) { if ((tm = Getattr(p, "tmap:argout"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); if (procdoc) { if (handle_documentation_typemap(returns_argout, ", ", p, "tmap:argout:doc", "$NAME (of type $type)")) { /* A documentation typemap that is not the empty string indicates that a value is returned to Scheme. */ num_results++; } } p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } if (exporting_destructor) { /* Mark the destructor's argument as destroyed. */ String *tm = NewString("SWIG_Guile_MarkPointerDestroyed($input);"); Replaceall(tm, "$input", Getattr(l, "emit:input")); Printv(cleanup, tm, "\n", NIL); Delete(tm); } /* Close prototype */ Printf(f->def, ")\n{\n"); /* Define the scheme name in C. This define is used by several Guile macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); // Now write code to make the function call String *actioncode = emit_action(n); // Now have return value, figure out what to do with it. if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$result", "gswig_result"); Replaceall(tm, "$target", "gswig_result"); Replaceall(tm, "$source", Swig_cresult_name()); if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); else Replaceall(tm, "$owner", "0"); Printv(f->code, tm, "\n", NIL); } else { throw_unhandled_guile_type_error(d); } emit_return_variable(n, d, f); // Documentation if ((tm = Getattr(n, "tmap:out:doc"))) { Printv(returns, tm, NIL); if (Len(tm) > 0) num_results = 1; else num_results = 0; } else { String *s = SwigType_str(d, 0); Chop(s); Printf(returns, "<%s>", s); Delete(s); num_results = 1; } Append(returns, returns_argout); // Dump the argument output code Printv(f->code, outarg, NIL); // Dump the argument cleanup code Printv(f->code, cleanup, NIL); // Look for any remaining cleanup if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } } // Free any memory allocated by the function being wrapped.. if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NIL); } // Wrap things up (in a manner of speaking) if (beforereturn) Printv(f->code, beforereturn, "\n", NIL); Printv(f->code, "return gswig_result;\n", NIL); /* Substitute the function name */ Replaceall(f->code, "$symname", iname); // Undefine the scheme name Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); if (!Getattr(n, "sym:overloaded")) { if (numargs > 10) { int i; /* gh_new_procedure would complain: too many args */ /* Build a wrapper wrapper */ Printv(f_wrappers, "static SCM\n", wname, "_rest (SCM rest)\n", NIL); Printv(f_wrappers, "{\n", NIL); Printf(f_wrappers, "SCM arg[%d];\n", numargs); Printf(f_wrappers, "SWIG_Guile_GetArgs (arg, rest, %d, %d, \"%s\");\n", numreq, numargs - numreq, proc_name); Printv(f_wrappers, "return ", wname, "(", NIL); Printv(f_wrappers, "arg[0]", NIL); for (i = 1; i < numargs; i++) Printf(f_wrappers, ", arg[%d]", i); Printv(f_wrappers, ");\n", NIL); Printv(f_wrappers, "}\n", NIL); /* Register it */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, 0, 1, (swig_guile_proc) %s_rest);\n", proc_name, wname); } else if (emit_setters && struct_member && strlen(Char(proc_name)) > 3) { int len = Len(proc_name); const char *pc = Char(proc_name); /* MEMBER-set and MEMBER-get functions. */ int is_setter = (pc[len - 3] == 's'); if (is_setter) { Printf(f_init, "SCM setter = "); struct_member = 2; /* have a setter */ } else Printf(f_init, "SCM getter = "); /* GOOPS support uses the MEMBER-set and MEMBER-get functions, so ignore only_setters in this case. */ if (only_setters && !goops) Printf(f_init, "scm_c_make_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); else Printf(f_init, "scm_c_define_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); if (!is_setter) { /* Strip off "-get" */ char *pws_name = (char *) malloc(sizeof(char) * (len - 3)); strncpy(pws_name, pc, len - 3); pws_name[len - 4] = 0; if (struct_member == 2) { /* There was a setter, so create a procedure with setter */ Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", " "scm_make_procedure_with_setter(getter, setter));\n", pws_name); } else { /* There was no setter, so make an alias to the getter */ Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", getter);\n", pws_name); } Printf(exported_symbols, "\"%s\", ", pws_name); free(pws_name); } } else { /* Register the function */ if (exporting_destructor) { Printf(f_init, "((swig_guile_clientdata *)(SWIGTYPE%s->clientdata))->destroy = (guile_destructor) %s;\n", swigtype_ptr, wname); //Printf(f_init, "SWIG_TypeClientData(SWIGTYPE%s, (void *) %s);\n", swigtype_ptr, wname); } Printf(f_init, "scm_c_define_gsubr(\"%s\", %d, %d, 0, (swig_guile_proc) %s);\n", proc_name, numreq, numargs - numreq, wname); } } else { /* overloaded function; don't export the single methods */ if (!Getattr(n, "sym:nextSibling")) { /* Emit overloading dispatch function */ int maxargs; String *dispatch = Swig_overload_dispatch(n, "return %s(argc,argv);", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *df = NewWrapper(); String *dname = Swig_name_wrapper(iname); Printv(df->def, "static SCM\n", dname, "(SCM rest)\n{\n", NIL); Printf(df->code, "#define FUNC_NAME \"%s\"\n", proc_name); Printf(df->code, "SCM argv[%d];\n", maxargs); Printf(df->code, "int argc = SWIG_Guile_GetArgs (argv, rest, %d, %d, \"%s\");\n", 0, maxargs, proc_name); Printv(df->code, dispatch, "\n", NIL); Printf(df->code, "scm_misc_error(\"%s\", \"No matching method for generic function `%s'\", SCM_EOL);\n", proc_name, iname); Printf(df->code, "#undef FUNC_NAME\n"); Printv(df->code, "}\n", NIL); Wrapper_print(df, f_wrappers); Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, 0, 1, (swig_guile_proc) %s);\n", proc_name, dname); DelWrapper(df); Delete(dispatch); Delete(dname); } } Printf(exported_symbols, "\"%s\", ", proc_name); if (!in_class || memberfunction_name) { // export wrapper into goops file String *method_def = NewString(""); String *goops_name; if (in_class) goops_name = NewString(memberfunction_name); else goops_name = goopsNameMapping(proc_name, ""); String *primitive_name = NewString(""); if (primRenamer) Printv(primitive_name, "primitive:", proc_name, NIL); else Printv(primitive_name, proc_name, NIL); Replaceall(method_signature, "_", "-"); Replaceall(primitive_args, "_", "-"); if (!any_specialized_arg) { /* If there would not be any specialized argument in the method declaration, we simply re-export the function. This is a performance optimization. */ Printv(method_def, "(define ", goops_name, " ", primitive_name, ")\n", NIL); } else if (numreq == numargs) { Printv(method_def, "(define-method (", goops_name, method_signature, ")\n", NIL); Printv(method_def, " (", primitive_name, primitive_args, "))\n", NIL); } else { /* Handle optional args. For the rest argument, use a name that cannot clash. */ Printv(method_def, "(define-method (", goops_name, method_signature, " . %args)\n", NIL); Printv(method_def, " (apply ", primitive_name, primitive_args, " %args))\n", NIL); } if (in_class) { /* Defer method definition till end of class definition. */ Printv(goops_class_methods, method_def, NIL); } else { Printv(goopscode, method_def, NIL); } Printf(goopsexport, "%s ", goops_name); Delete(primitive_name); Delete(goops_name); Delete(method_def); } if (procdoc) { String *returns_text = NewString(""); if (num_results == 0) Printv(returns_text, return_nothing_doc, NIL); else if (num_results == 1) Printv(returns_text, return_one_doc, NIL); else Printv(returns_text, return_multi_doc, NIL); /* Substitute documentation variables */ static const char *numbers[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" }; if (num_results <= 12) Replaceall(returns_text, "$num_values", numbers[num_results]); else { String *num_results_str = NewStringf("%d", num_results); Replaceall(returns_text, "$num_values", num_results_str); Delete(num_results_str); } Replaceall(returns_text, "$values", returns); Printf(doc_body, "\n%s", returns_text); write_doc(proc_name, signature, doc_body); Delete(returns_text); } Delete(proc_name); Delete(outarg); Delete(cleanup); Delete(signature); Delete(method_signature); Delete(primitive_args); Delete(doc_body); Delete(returns_argout); Delete(returns); Delete(tmp); Delete(scheme_arg_names); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * variableWrapper() * * Create a link to a C variable. * This creates a single function PREFIX_var_VARNAME(). * This function takes a single optional argument. If supplied, it means * we are setting this variable to some value. If omitted, it means we are * simply evaluating this variable. Either way, we return the variables * value. * ------------------------------------------------------------ */ virtual int variableWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *proc_name; Wrapper *f; String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; f = NewWrapper(); // evaluation function names String *var_name = Swig_name_wrapper(iname); // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); Setattr(n, "wrap:name", proc_name); if (1 || (SwigType_type(t) != T_USER) || (is_a_pointer(t))) { Printf(f->def, "static SCM\n%s(SCM s_0)\n{\n", var_name); /* Define the scheme name in C. This define is used by several Guile macros. */ Printv(f->def, "#define FUNC_NAME \"", proc_name, "\"", NIL); Wrapper_add_local(f, "gswig_result", "SCM gswig_result"); if (!GetFlag(n, "feature:immutable")) { /* Check for a setting of the variable value */ Printf(f->code, "if (s_0 != SCM_UNDEFINED) {\n"); if ((tm = Swig_typemap_lookup("varin", n, name, 0))) { Replaceall(tm, "$source", "s_0"); Replaceall(tm, "$input", "s_0"); Replaceall(tm, "$target", name); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_guile_type_error(t); } Printf(f->code, "}\n"); } // Now return the value of the variable (regardless // of evaluating or setting) if ((tm = Swig_typemap_lookup("varout", n, name, 0))) { Replaceall(tm, "$source", name); Replaceall(tm, "$target", "gswig_result"); Replaceall(tm, "$result", "gswig_result"); /* Printv(f->code,tm,"\n",NIL); */ emit_action_code(n, f->code, tm); } else { throw_unhandled_guile_type_error(t); } Printf(f->code, "\nreturn gswig_result;\n"); Printf(f->code, "#undef FUNC_NAME\n"); Printf(f->code, "}\n"); Wrapper_print(f, f_wrappers); // Now add symbol to the Guile interpreter if (!emit_setters || GetFlag(n, "feature:immutable")) { /* Read-only variables become a simple procedure returning the value; read-write variables become a simple procedure with an optional argument. */ if (!goops && GetFlag(n, "feature:constasvar")) { /* need to export this function as a variable instead of a procedure */ if (scmstub) { /* export the function in the wrapper, and (set!) it in scmstub */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, %d, 0, (swig_guile_proc) %s);\n", proc_name, !GetFlag(n, "feature:immutable"), var_name); Printf(scmtext, "(set! %s (%s))\n", proc_name, proc_name); } else { /* export the variable directly */ Printf(f_init, "scm_c_define(\"%s\", %s(SCM_UNDEFINED));\n", proc_name, var_name); } } else { /* Export the function as normal */ Printf(f_init, "scm_c_define_gsubr(\"%s\", 0, %d, 0, (swig_guile_proc) %s);\n", proc_name, !GetFlag(n, "feature:immutable"), var_name); } } else { /* Read/write variables become a procedure with setter. */ Printf(f_init, "{ SCM p = scm_c_define_gsubr(\"%s\", 0, 1, 0, (swig_guile_proc) %s);\n", proc_name, var_name); Printf(f_init, "scm_c_define"); Printf(f_init, "(\"%s\", " "scm_make_procedure_with_setter(p, p)); }\n", proc_name); } Printf(exported_symbols, "\"%s\", ", proc_name); // export wrapper into goops file if (!in_class) { // only if the variable is not part of a class String *class_name = SwigType_typedef_resolve_all(SwigType_base(t)); String *goops_name = goopsNameMapping(proc_name, ""); String *primitive_name = NewString(""); if (primRenamer) Printv(primitive_name, "primitive:", NIL); Printv(primitive_name, proc_name, NIL); /* Simply re-export the procedure */ if ((!emit_setters || GetFlag(n, "feature:immutable")) && GetFlag(n, "feature:constasvar")) { Printv(goopscode, "(define ", goops_name, " (", primitive_name, "))\n", NIL); } else { Printv(goopscode, "(define ", goops_name, " ", primitive_name, ")\n", NIL); } Printf(goopsexport, "%s ", goops_name); Delete(primitive_name); Delete(class_name); Delete(goops_name); } if (procdoc) { /* Compute documentation */ String *signature = NewString(""); String *signature2 = NULL; String *doc = NewString(""); if (GetFlag(n, "feature:immutable")) { Printv(signature, proc_name, NIL); if (GetFlag(n, "feature:constasvar")) { Printv(doc, "Is constant ", NIL); } else { Printv(doc, "Returns constant ", NIL); } if ((tm = Getattr(n, "tmap:varout:doc"))) { Printv(doc, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(doc, "<%s>", s); Delete(s); } } else if (emit_setters) { Printv(signature, proc_name, NIL); signature2 = NewString(""); Printv(signature2, "set! (", proc_name, ") ", NIL); handle_documentation_typemap(signature2, NIL, n, "tmap:varin:arglist", "new-value"); Printv(doc, "Get or set the value of the C variable, \n", NIL); Printv(doc, "which is of type ", NIL); handle_documentation_typemap(doc, NIL, n, "tmap:varout:doc", "$1_type"); Printv(doc, "."); } else { Printv(signature, proc_name, " #:optional ", NIL); if ((tm = Getattr(n, "tmap:varin:doc"))) { Printv(signature, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(signature, "new-value <%s>", s); Delete(s); } Printv(doc, "If NEW-VALUE is provided, " "set C variable to this value.\n", NIL); Printv(doc, "Returns variable value ", NIL); if ((tm = Getattr(n, "tmap:varout:doc"))) { Printv(doc, tm, NIL); } else { String *s = SwigType_str(t, 0); Chop(s); Printf(doc, "<%s>", s); Delete(s); } } write_doc(proc_name, signature, doc, signature2); Delete(signature); if (signature2) Delete(signature2); Delete(doc); } } else { Swig_warning(WARN_TYPEMAP_VAR_UNDEF, input_file, line_number, "Unsupported variable type %s (ignored).\n", SwigType_str(t, 0)); } Delete(var_name); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * * We create a read-only variable. * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); int constasvar = GetFlag(n, "feature:constasvar"); String *proc_name; String *var_name; Wrapper *f; SwigType *nctype; String *tm; f = NewWrapper(); // Make a static variable; var_name = NewStringf("%sconst_%s", prefix, iname); // Strip const qualifier from type if present nctype = NewString(type); if (SwigType_isconst(nctype)) { Delete(SwigType_pop(nctype)); } // Build the name for scheme. proc_name = NewString(iname); Replaceall(proc_name, "_", "-"); if ((SwigType_type(nctype) == T_USER) && (!is_a_pointer(nctype))) { Swig_warning(WARN_TYPEMAP_CONST_UNDEF, input_file, line_number, "Unsupported constant value.\n"); Delete(var_name); DelWrapper(f); return SWIG_NOWRAP; } // See if there's a typemap if ((tm = Swig_typemap_lookup("constant", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$value", value); Replaceall(tm, "$target", name); Printv(f_header, tm, "\n", NIL); } else { // Create variable and assign it a value Printf(f_header, "static %s = (%s)(%s);\n", SwigType_str(type, var_name), SwigType_str(type, 0), value); } { /* Hack alert: will cleanup later -- Dave */ Node *nn = NewHash(); Setfile(nn, Getfile(n)); Setline(nn, Getline(n)); Setattr(nn, "name", var_name); Setattr(nn, "sym:name", iname); Setattr(nn, "type", nctype); SetFlag(nn, "feature:immutable"); if (constasvar) { SetFlag(nn, "feature:constasvar"); } variableWrapper(nn); Delete(nn); } Delete(var_name); Delete(nctype); Delete(proc_name); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { String *class_name = NewStringf("<%s>", Getattr(n, "sym:name")); Setattr(n, "guile:goopsclassname", class_name); return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { /* Create new strings for building up a wrapper function */ have_constructor = 0; class_name = NewString(""); short_class_name = NewString(""); Printv(class_name, "<", Getattr(n, "sym:name"), ">", NIL); Printv(short_class_name, Getattr(n, "sym:name"), NIL); Replaceall(class_name, "_", "-"); Replaceall(short_class_name, "_", "-"); if (!addSymbol(class_name, n)) return SWIG_ERROR; /* Handle inheritance */ String *base_class = NewString("<"); List *baselist = Getattr(n, "bases"); if (baselist && Len(baselist)) { Iterator i = First(baselist); while (i.item) { Printv(base_class, Getattr(i.item, "sym:name"), NIL); i = Next(i); if (i.item) { Printf(base_class, "> <"); } } } Printf(base_class, ">"); Replaceall(base_class, "_", "-"); Printv(goopscode, "(define-class ", class_name, " ", NIL); Printf(goopsexport, "%s ", class_name); if (Len(base_class) > 2) { Printv(goopscode, "(", base_class, ")\n", NIL); } else { Printv(goopscode, "()\n", NIL); } SwigType *ct = NewStringf("p.%s", Getattr(n, "name")); swigtype_ptr = SwigType_manglestr(ct); String *mangled_classname = Swig_name_mangle(Getattr(n, "sym:name")); /* Export clientdata structure */ Printf(f_runtime, "static swig_guile_clientdata _swig_guile_clientdata%s = { NULL, SCM_EOL };\n", mangled_classname); Printv(f_init, "SWIG_TypeClientData(SWIGTYPE", swigtype_ptr, ", (void *) &_swig_guile_clientdata", mangled_classname, ");\n", NIL); SwigType_remember(ct); Delete(ct); /* Emit all of the members */ goops_class_methods = NewString(""); in_class = 1; Language::classHandler(n); in_class = 0; Printv(goopscode, " #:metaclass \n", NIL); if (have_constructor) Printv(goopscode, " #:new-function ", primRenamer ? "primitive:" : "", "new-", short_class_name, "\n", NIL); Printf(goopscode, ")\n%s\n", goops_class_methods); Delete(goops_class_methods); goops_class_methods = 0; /* export class initialization function */ if (goops) { /* export the wrapper function */ String *funcName = NewString(mangled_classname); Printf(funcName, "_swig_guile_setgoopsclass"); String *guileFuncName = NewString(funcName); Replaceall(guileFuncName, "_", "-"); Printv(f_wrappers, "static SCM ", funcName, "(SCM cl) \n", NIL); Printf(f_wrappers, "#define FUNC_NAME %s\n{\n", guileFuncName); Printv(f_wrappers, " ((swig_guile_clientdata *)(SWIGTYPE", swigtype_ptr, "->clientdata))->goops_class = cl;\n", NIL); Printf(f_wrappers, " return SCM_UNSPECIFIED;\n"); Printf(f_wrappers, "}\n#undef FUNC_NAME\n\n"); Printf(f_init, "scm_c_define_gsubr(\"%s\", 1, 0, 0, (swig_guile_proc) %s);\n", guileFuncName, funcName); Printf(exported_symbols, "\"%s\", ", guileFuncName); /* export the call to the wrapper function */ Printf(goopscode, "(%s%s %s)\n\n", primRenamer ? "primitive:" : "", guileFuncName, class_name); Delete(guileFuncName); Delete(funcName); } Delete(mangled_classname); Delete(swigtype_ptr); swigtype_ptr = 0; Delete(class_name); Delete(short_class_name); class_name = 0; short_class_name = 0; return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ int memberfunctionHandler(Node *n) { String *iname = Getattr(n, "sym:name"); String *proc = NewString(iname); Replaceall(proc, "_", "-"); memberfunction_name = goopsNameMapping(proc, short_class_name); Language::memberfunctionHandler(n); Delete(memberfunction_name); memberfunction_name = NULL; Delete(proc); return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ int membervariableHandler(Node *n) { String *iname = Getattr(n, "sym:name"); if (emit_setters) { struct_member = 1; Printf(f_init, "{\n"); } Language::membervariableHandler(n); if (emit_setters) { Printf(f_init, "}\n"); struct_member = 0; } String *proc = NewString(iname); Replaceall(proc, "_", "-"); String *goops_name = goopsNameMapping(proc, short_class_name); /* The slot name is never qualified with the class, even if useclassprefix is true. */ Printv(goopscode, " (", proc, " #:allocation #:virtual", NIL); /* GOOPS (at least in Guile 1.6.3) only accepts closures, not primitive procedures for slot-ref and slot-set. */ Printv(goopscode, "\n #:slot-ref (lambda (obj) (", primRenamer ? "primitive:" : "", short_class_name, "-", proc, "-get", " obj))", NIL); if (!GetFlag(n, "feature:immutable")) { Printv(goopscode, "\n #:slot-set! (lambda (obj value) (", primRenamer ? "primitive:" : "", short_class_name, "-", proc, "-set", " obj value))", NIL); } else { Printf(goopscode, "\n #:slot-set! (lambda (obj value) (error \"Immutable slot\"))"); } if (emit_slot_accessors) { if (GetFlag(n, "feature:immutable")) { Printv(goopscode, "\n #:getter ", goops_name, NIL); } else { Printv(goopscode, "\n #:accessor ", goops_name, NIL); } Printf(goopsexport, "%s ", goops_name); } Printv(goopscode, ")\n", NIL); Delete(proc); Delete(goops_name); return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ int constructorHandler(Node *n) { Language::constructorHandler(n); have_constructor = 1; return SWIG_OK; } /* ------------------------------------------------------------ * destructorHandler() * ------------------------------------------------------------ */ virtual int destructorHandler(Node *n) { exporting_destructor = true; Language::destructorHandler(n); exporting_destructor = false; return SWIG_OK; } /* ------------------------------------------------------------ * pragmaDirective() * ------------------------------------------------------------ */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *cmd = Getattr(n, "name"); String *value = Getattr(n, "value"); # define store_pragma(PRAGMANAME) \ if (Strcmp(cmd, #PRAGMANAME) == 0) { \ if (PRAGMANAME) Delete(PRAGMANAME); \ PRAGMANAME = value ? NewString(value) : NULL; \ } if (Strcmp(lang, "guile") == 0) { store_pragma(beforereturn) store_pragma(return_nothing_doc) store_pragma(return_one_doc) store_pragma(return_multi_doc); # undef store_pragma } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * goopsNameMapping() * Maps the identifier from C++ to the GOOPS based * on command * line parameters and such. * If class_name = "" that means the mapping is for a function or * variable not attached to any class. * ------------------------------------------------------------ */ String *goopsNameMapping(String *name, const_String_or_char_ptr class_name) { String *n = NewString(""); if (Strcmp(class_name, "") == 0) { // not part of a class, so no class name to prefix if (goopsprefix) { Printf(n, "%s%s", goopsprefix, name); } else { Printf(n, "%s", name); } } else { if (useclassprefix) { Printf(n, "%s-%s", class_name, name); } else { if (goopsprefix) { Printf(n, "%s%s", goopsprefix, name); } else { Printf(n, "%s", name); } } } return n; } /* ------------------------------------------------------------ * validIdentifier() * ------------------------------------------------------------ */ virtual int validIdentifier(String *s) { char *c = Char(s); /* Check whether we have an R5RS identifier. Guile supports a superset of R5RS identifiers, but it's probably a bad idea to use those. */ /* --> * | */ /* --> | */ if (!(isalpha(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~'))) { /* --> + | - | ... */ if ((strcmp(c, "+") == 0) || strcmp(c, "-") == 0 || strcmp(c, "...") == 0) return 1; else return 0; } /* --> | | */ while (*c) { if (!(isalnum(*c) || (*c == '!') || (*c == '$') || (*c == '%') || (*c == '&') || (*c == '*') || (*c == '/') || (*c == ':') || (*c == '<') || (*c == '=') || (*c == '>') || (*c == '?') || (*c == '^') || (*c == '_') || (*c == '~') || (*c == '+') || (*c == '-') || (*c == '.') || (*c == '@'))) return 0; c++; } return 1; } String *runtimeCode() { String *s; s = Swig_include_sys("guile_scm_run.swg"); if (!s) { Printf(stderr, "*** Unable to open 'guile_scm_run.swg"); s = NewString(""); } return s; } String *defaultExternalRuntimeFilename() { return NewString("swigguilerun.h"); } }; /* ----------------------------------------------------------------------------- * swig_guile() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_guile() { return new GUILE(); } extern "C" Language *swig_guile(void) { return new_swig_guile(); } swig-3.0.12/Source/Modules/go.cxx0000664000175000017500000061721613042756442016453 0ustar williamwilliam/* ----------------------------------------------------------------------------- * See the LICENSE file for information on copyright, usage and redistribution * of SWIG, and the README file for authors - http://www.swig.org/release.html. * * go.cxx * * Go language module for SWIG. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include /* ---------------------------------------------------------------------- * siphash() * * 64-bit SipHash-2-4 to generate unique id for each module * ---------------------------------------------------------------------- */ // An unsigned 64-bit integer that works on a 32-bit host. typedef struct { // Assume unsigned long is at least 32 bits. unsigned long hi; unsigned long lo; } swig_uint64; // Rotate v left by bits, which must be <= 32. static inline void _rotl(swig_uint64 *v, int bits) { assert(bits <= 32); unsigned long tmp = v->hi; if (bits == 32) { v->hi = v->lo; v->lo = tmp; } else { v->hi = (tmp << bits) | ((0xfffffffful & v->lo) >> (32 - bits)); v->lo = (v->lo << bits) | ((0xfffffffful & tmp) >> (32 - bits)); } } // dst ^= src static inline void _xor(swig_uint64 *dst, swig_uint64 *src) { dst->lo ^= src->lo; dst->hi ^= src->hi; } // dst += src static inline void _add(swig_uint64 *dst, swig_uint64 *src) { dst->lo += src->lo; dst->hi += src->hi + ((dst->lo & 0xfffffffful) < (src->lo&0xfffffffful) ? 1 : 0); } #define SIPROUND \ do { \ _add(&v0, &v1); _rotl(&v1, 13); _xor(&v1, &v0); _rotl(&v0, 32); \ _add(&v2, &v3); _rotl(&v3, 16); _xor(&v3, &v2); \ _add(&v0, &v3); _rotl(&v3, 21); _xor(&v3, &v0); \ _add(&v2, &v1); _rotl(&v1, 17); _xor(&v1, &v2); _rotl(&v2, 32); \ } while(0) // Set out to the hash of inc/inlen. static void siphash(swig_uint64 *out, const char *inc, unsigned long inlen) { /* "somepseudorandomlygeneratedbytes" */ swig_uint64 v0 = {0x736f6d65UL, 0x70736575UL}; swig_uint64 v1 = {0x646f7261UL, 0x6e646f6dUL}; swig_uint64 v2 = {0x6c796765UL, 0x6e657261UL}; swig_uint64 v3 = {0x74656462UL, 0x79746573UL}; swig_uint64 b; /* hard-coded k. */ swig_uint64 k0 = {0x07060504UL, 0x03020100UL}; swig_uint64 k1 = {0x0F0E0D0CUL, 0x0B0A0908UL}; int i; const int cROUNDS = 2, dROUNDS = 4; const unsigned char *in = (const unsigned char *)inc; const unsigned char *end = in + inlen - (inlen % 8); int left = inlen & 7; _xor(&v3, &k1); _xor(&v2, &k0); _xor(&v1, &k1); _xor(&v0, &k0); for (; in != end; in += 8) { b.hi = 0; b.lo = 0; for (i = 0; i < 4; i++) { b.lo |= ((unsigned long)in[i]) << (8*i); } for (i = 0; i < 4; i++) { b.hi |= ((unsigned long)in[i+4]) << (8*i); } _xor(&v3, &b); for (i = 0; i < cROUNDS; i++) { SIPROUND; } _xor(&v0, &b); } b.hi = (inlen & 0xff)<<24; b.lo = 0; for (; left; left--) { if (left > 4) { b.hi |= ((unsigned long)in[left-1]) << (8*left-8-32); } else { b.lo |= ((unsigned long)in[left-1]) << (8*left-8); } } _xor(&v3, &b); for(i=0; ilo = 0; out->hi = 0; _xor(out, &v0); _xor(out, &v1); _xor(out, &v2); _xor(out, &v3); } #undef SIPROUND class GO:public Language { static const char *const usage; // Go package name. String *package; // SWIG module name. String *module; // Flag for generating cgo input files. bool cgo_flag; // Flag for generating gccgo output. bool gccgo_flag; // Prefix to use with gccgo. String *go_prefix; // -fgo-prefix option. String *prefix_option; // -fgo-pkgpath option. String *pkgpath_option; // Whether to use a shared library. bool use_shlib; // Name of shared library to import. String *soname; // Size in bits of the Go type "int". 0 if not specified. int intgo_type_size; /* Output files */ File *f_c_begin; File *f_go_begin; File *f_gc_begin; /* Output fragments */ File *f_c_runtime; File *f_c_header; File *f_c_wrappers; File *f_c_init; File *f_c_directors; File *f_c_directors_h; File *f_go_imports; File *f_go_runtime; File *f_go_header; File *f_go_wrappers; File *f_go_directors; File *f_gc_runtime; File *f_gc_header; File *f_gc_wrappers; File *f_cgo_comment; File *f_cgo_comment_typedefs; // True if we imported a module. bool saw_import; // If not NULL, name of import package being processed. String *imported_package; // Build interface methods while handling a class. This is only // non-NULL when we are handling methods. String *interfaces; // The class node while handling a class. This is only non-NULL // when we are handling methods. Node *class_node; // The class name while handling a class. This is only non-NULL // when we are handling methods. This is the name of the class as // SWIG sees it. String *class_name; // The receiver name while handling a class. This is only non-NULL // when we are handling methods. This is the name of the class // as run through goCPointerType. String *class_receiver; // A hash table of method names that we have seen when processing a // class. This lets us detect base class methods that we don't want // to use. Hash *class_methods; // True when we are generating the wrapper functions for a variable. bool making_variable_wrappers; // True when working with a static member function. bool is_static_member_function; // A hash table of enum types that we have seen but which may not have // been defined. The index is a SwigType. Hash *undefined_enum_types; // A hash table of types that we have seen but which may not have // been defined. The index is a SwigType. Hash *undefined_types; // A hash table of classes which were defined. The index is a Go // type name. Hash *defined_types; // A hash table of all the go_imports already imported. The index is a full // import name e.g. '"runtime"' or '_ "runtime/cgo"' or 'sc "syscall"'. Hash *go_imports; // A unique ID used to make public symbols unique. String *unique_id; public: GO():package(NULL), module(NULL), cgo_flag(false), gccgo_flag(false), go_prefix(NULL), prefix_option(NULL), pkgpath_option(NULL), use_shlib(false), soname(NULL), intgo_type_size(0), f_c_begin(NULL), f_go_begin(NULL), f_gc_begin(NULL), f_c_runtime(NULL), f_c_header(NULL), f_c_wrappers(NULL), f_c_init(NULL), f_c_directors(NULL), f_c_directors_h(NULL), f_go_imports(NULL), f_go_runtime(NULL), f_go_header(NULL), f_go_wrappers(NULL), f_go_directors(NULL), f_gc_runtime(NULL), f_gc_header(NULL), f_gc_wrappers(NULL), f_cgo_comment(NULL), f_cgo_comment_typedefs(NULL), saw_import(false), imported_package(NULL), interfaces(NULL), class_node(NULL), class_name(NULL), class_receiver(NULL), class_methods(NULL), making_variable_wrappers(false), is_static_member_function(false), undefined_enum_types(NULL), undefined_types(NULL), defined_types(NULL), go_imports(NULL), unique_id(NULL) { director_multiple_inheritance = 1; director_language = 1; director_prot_ctor_code = NewString("_swig_gopanic(\"accessing abstract class or protected constructor\");"); } private: /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("go"); bool display_help = false; // Process command line options. for (int i = 1; i < argc; i++) { if (argv[i]) { if (strcmp(argv[i], "-package") == 0) { if (argv[i + 1]) { package = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-cgo") == 0) { Swig_mark_arg(i); cgo_flag = true; } else if (strcmp(argv[i], "-gccgo") == 0) { Swig_mark_arg(i); gccgo_flag = true; } else if (strcmp(argv[i], "-go-prefix") == 0) { if (argv[i + 1]) { prefix_option = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-go-pkgpath") == 0) { if (argv[i + 1]) { pkgpath_option = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-use-shlib") == 0) { Swig_mark_arg(i); use_shlib = true; } else if (strcmp(argv[i], "-soname") == 0) { if (argv[i + 1]) { soname = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-longsize") == 0) { // Ignore for backward compatibility. if (argv[i + 1]) { Swig_mark_arg(i); Swig_mark_arg(i + 1); ++i; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-intgosize") == 0) { if (argv[i + 1]) { intgo_type_size = atoi(argv[i + 1]); if (intgo_type_size != 32 && intgo_type_size != 64) { Printf(stderr, "-intgosize not 32 or 64\n"); Swig_arg_error(); } Swig_mark_arg(i); Swig_mark_arg(i + 1); ++i; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-help") == 0) { display_help = true; Printf(stdout, "%s\n", usage); } } } if (gccgo_flag && !pkgpath_option && !prefix_option) { prefix_option = NewString("go"); } // Add preprocessor symbol to parser. Preprocessor_define("SWIGGO 1", 0); if (cgo_flag) { Preprocessor_define("SWIGGO_CGO 1", 0); } if (gccgo_flag) { Preprocessor_define("SWIGGO_GCCGO 1", 0); } // This test may be removed in the future, when we can assume that // everybody has upgraded to Go 1.1. The code below is prepared // for this test to simply be taken out. if (intgo_type_size == 0 && !display_help) { Printf(stderr, "SWIG -go: -intgosize option required but not specified\n"); SWIG_exit(EXIT_FAILURE); } if (intgo_type_size == 32) { Preprocessor_define("SWIGGO_INTGO_SIZE 32", 0); } else if (intgo_type_size == 64) { Preprocessor_define("SWIGGO_INTGO_SIZE 64", 0); } else { Preprocessor_define("SWIGGO_INTGO_SIZE 0", 0); } // Add typemap definitions. SWIG_typemap_lang("go"); SWIG_config_file("go.swg"); allow_overloading(); } /* --------------------------------------------------------------------- * top() * * For 6g/8g, we are going to create the following files: * * 1) A .c or .cxx file compiled with gcc. This file will contain * function wrappers. Each wrapper will take a pointer to a * struct holding the arguments, unpack them, and call the real * function. * * 2) A .go file which defines the Go form of all types, and which * defines Go function wrappers. Each wrapper will call the C * function wrapper in the second file. * * 3) A .c file compiled with 6c/8c. This file will define * Go-callable C function wrappers. Each wrapper will use * cgocall to call the function wrappers in the first file. * * When generating code for gccgo, we don't need the third file, and * the function wrappers in the first file have a different form. * * --------------------------------------------------------------------- */ virtual int top(Node *n) { Node *optionsnode = Getattr(Getattr(n, "module"), "options"); if (optionsnode) { if (Getattr(optionsnode, "directors")) { allow_directors(); } if (Getattr(optionsnode, "dirprot")) { allow_dirprot(); } allow_allprotected(GetFlag(optionsnode, "allprotected")); } module = Getattr(n, "name"); if (!package) { package = Copy(module); } if (!soname && use_shlib) { soname = Copy(package); Append(soname, ".so"); } if (gccgo_flag) { String *pref; if (pkgpath_option) { pref = pkgpath_option; } else { pref = prefix_option; } go_prefix = NewString(""); for (char *p = Char(pref); *p != '\0'; p++) { if ((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z') || (*p >= '0' && *p <= '9') || *p == '.' || *p == '$') { Putc(*p, go_prefix); } else { Putc('_', go_prefix); } } if (!pkgpath_option) { Append(go_prefix, "."); Append(go_prefix, getModuleName(package)); } } // Get filenames. String *swig_filename = Getattr(n, "infile"); String *c_filename = Getattr(n, "outfile"); String *c_filename_h = Getattr(n, "outfile_h"); String *go_filename = NewString(""); Printf(go_filename, "%s%s.go", SWIG_output_directory(), module); String *gc_filename = NULL; if (!gccgo_flag) { gc_filename = NewString(""); Printf(gc_filename, "%s%s_gc.c", SWIG_output_directory(), module); } // Generate a unique ID based on a hash of the SWIG input. swig_uint64 hash = {0, 0}; FILE *swig_input = Swig_open(swig_filename); if (swig_input == NULL) { FileErrorDisplay(swig_filename); SWIG_exit(EXIT_FAILURE); } String *swig_input_content = Swig_read_file(swig_input); siphash(&hash, Char(swig_input_content), Len(swig_input_content)); Delete(swig_input_content); fclose(swig_input); unique_id = NewString(""); Printf(unique_id, "_%s_%08x%08x", getModuleName(package), hash.hi, hash.lo); // Open files. f_c_begin = NewFile(c_filename, "w", SWIG_output_files()); if (!f_c_begin) { FileErrorDisplay(c_filename); SWIG_exit(EXIT_FAILURE); } if (directorsEnabled()) { if (!c_filename_h) { Printf(stderr, "Unable to determine outfile_h\n"); SWIG_exit(EXIT_FAILURE); } f_c_directors_h = NewFile(c_filename_h, "w", SWIG_output_files()); if (!f_c_directors_h) { FileErrorDisplay(c_filename_h); SWIG_exit(EXIT_FAILURE); } } f_go_begin = NewFile(go_filename, "w", SWIG_output_files()); if (!f_go_begin) { FileErrorDisplay(go_filename); SWIG_exit(EXIT_FAILURE); } if (!gccgo_flag && !cgo_flag) { f_gc_begin = NewFile(gc_filename, "w", SWIG_output_files()); if (!f_gc_begin) { FileErrorDisplay(gc_filename); SWIG_exit(EXIT_FAILURE); } } f_c_runtime = NewString(""); f_c_header = NewString(""); f_c_wrappers = NewString(""); f_c_init = NewString(""); f_c_directors = NewString(""); f_go_imports = NewString(""); f_go_runtime = NewString(""); f_go_header = NewString(""); f_go_wrappers = NewString(""); f_go_directors = NewString(""); if (!gccgo_flag && !cgo_flag) { f_gc_runtime = NewString(""); f_gc_header = NewString(""); f_gc_wrappers = NewString(""); } if (cgo_flag) { f_cgo_comment = NewString(""); f_cgo_comment_typedefs = NewString(""); } Swig_register_filebyname("begin", f_c_begin); Swig_register_filebyname("runtime", f_c_runtime); Swig_register_filebyname("header", f_c_header); Swig_register_filebyname("wrapper", f_c_wrappers); Swig_register_filebyname("init", f_c_init); Swig_register_filebyname("director", f_c_directors); Swig_register_filebyname("director_h", f_c_directors_h); Swig_register_filebyname("go_begin", f_go_begin); Swig_register_filebyname("go_imports", f_go_imports); Swig_register_filebyname("go_runtime", f_go_runtime); Swig_register_filebyname("go_header", f_go_header); Swig_register_filebyname("go_wrapper", f_go_wrappers); Swig_register_filebyname("go_director", f_go_directors); if (!gccgo_flag && !cgo_flag) { Swig_register_filebyname("gc_begin", f_gc_begin); Swig_register_filebyname("gc_runtime", f_gc_runtime); Swig_register_filebyname("gc_header", f_gc_header); Swig_register_filebyname("gc_wrapper", f_gc_wrappers); } if (cgo_flag) { Swig_register_filebyname("cgo_comment", f_cgo_comment); Swig_register_filebyname("cgo_comment_typedefs", f_cgo_comment_typedefs); } Swig_banner(f_c_begin); if (CPlusPlus) { Printf(f_c_begin, "\n// source: %s\n\n", swig_filename); } else { Printf(f_c_begin, "\n/* source: %s */\n\n", swig_filename); } Printf(f_c_runtime, "#define SWIGMODULE %s\n", module); if (gccgo_flag) { Printf(f_c_runtime, "#define SWIGGO_PREFIX %s\n", go_prefix); } if (directorsEnabled()) { Printf(f_c_runtime, "#define SWIG_DIRECTORS\n"); Swig_banner(f_c_directors_h); Printf(f_c_directors_h, "\n// source: %s\n\n", swig_filename); Printf(f_c_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", module); Printf(f_c_directors_h, "#define SWIG_%s_WRAP_H_\n\n", module); Printf(f_c_directors_h, "class Swig_memory;\n\n"); Printf(f_c_directors, "\n// C++ director class methods.\n"); String *filename = Swig_file_filename(c_filename_h); Printf(f_c_directors, "#include \"%s\"\n\n", filename); Delete(filename); } Swig_banner(f_go_begin); Printf(f_go_begin, "\n// source: %s\n", swig_filename); if (!gccgo_flag && !cgo_flag && soname) { Swig_banner(f_gc_begin); Printf(f_gc_begin, "\n/* source: %s */\n\n", swig_filename); Printf(f_gc_begin, "\n/* This file should be compiled with 6c/8c. */\n"); Printf(f_gc_begin, "#pragma dynimport _ _ \"%s\"\n", soname); } if (cgo_flag) { Printv(f_cgo_comment_typedefs, "/*\n", NULL); // The cgo program defines the intgo type after our function // definitions, but we want those definitions to be able to use // intgo also. Printv(f_cgo_comment_typedefs, "#define intgo swig_intgo\n", NULL); Printv(f_cgo_comment_typedefs, "typedef void *swig_voidp;\n", NULL); } // Output module initialization code. Printf(f_go_begin, "\npackage %s\n\n", getModuleName(package)); if (gccgo_flag && !cgo_flag) { Printf(f_go_runtime, "func SwigCgocall()\n"); Printf(f_go_runtime, "func SwigCgocallDone()\n"); Printf(f_go_runtime, "func SwigCgocallBack()\n"); Printf(f_go_runtime, "func SwigCgocallBackDone()\n\n"); } // All the C++ wrappers should be extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "extern \"C\" {\n", "#endif\n\n", NULL); // Set up the hash table for types not defined by SWIG. undefined_enum_types = NewHash(); undefined_types = NewHash(); defined_types = NewHash(); go_imports = NewHash(); // Emit code. Language::top(n); Delete(go_imports); // Write out definitions for the types not defined by SWIG. if (Len(undefined_enum_types) > 0) Printv(f_go_wrappers, "\n", NULL); for (Iterator p = First(undefined_enum_types); p.key; p = Next(p)) { String *name = p.item; Printv(f_go_wrappers, "type ", name, " int\n", NULL); } Printv(f_go_wrappers, "\n", NULL); for (Iterator p = First(undefined_types); p.key; p = Next(p)) { String *ty = goType(NULL, p.key); if (!Getattr(defined_types, ty)) { String *cp = goCPointerType(p.key, false); if (!Getattr(defined_types, cp)) { Printv(f_go_wrappers, "type ", cp, " uintptr\n", NULL); Printv(f_go_wrappers, "type ", ty, " interface {\n", NULL); Printv(f_go_wrappers, "\tSwigcptr() uintptr;\n", NULL); Printv(f_go_wrappers, "}\n", NULL); Printv(f_go_wrappers, "func (p ", cp, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn uintptr(p)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); } Delete(cp); } Delete(ty); } Delete(undefined_enum_types); Delete(undefined_types); Delete(defined_types); /* Write and cleanup */ Dump(f_c_header, f_c_runtime); if (directorsEnabled()) { Printf(f_c_directors_h, "#endif\n"); Delete(f_c_directors_h); f_c_directors_h = NULL; Dump(f_c_directors, f_c_runtime); Delete(f_c_directors); f_c_directors = NULL; } // End the extern "C". Printv(f_c_wrappers, "#ifdef __cplusplus\n", "}\n", "#endif\n\n", NULL); if (cgo_flag) { // End the cgo comment. Printv(f_cgo_comment, "#undef intgo\n", NULL); Printv(f_cgo_comment, "*/\n", NULL); Printv(f_cgo_comment, "import \"C\"\n", NULL); Printv(f_cgo_comment, "\n", NULL); } Dump(f_c_runtime, f_c_begin); Dump(f_c_wrappers, f_c_begin); Dump(f_c_init, f_c_begin); if (cgo_flag) { Dump(f_cgo_comment_typedefs, f_go_begin); Dump(f_cgo_comment, f_go_begin); } Dump(f_go_imports, f_go_begin); Dump(f_go_header, f_go_begin); Dump(f_go_runtime, f_go_begin); Dump(f_go_wrappers, f_go_begin); if (directorsEnabled()) { Dump(f_go_directors, f_go_begin); } if (!gccgo_flag && !cgo_flag) { Dump(f_gc_header, f_gc_begin); Dump(f_gc_runtime, f_gc_begin); Dump(f_gc_wrappers, f_gc_begin); } Delete(f_c_runtime); Delete(f_c_header); Delete(f_c_wrappers); Delete(f_c_init); Delete(f_go_imports); Delete(f_go_runtime); Delete(f_go_header); Delete(f_go_wrappers); Delete(f_go_directors); if (!gccgo_flag && !cgo_flag) { Delete(f_gc_runtime); Delete(f_gc_header); Delete(f_gc_wrappers); } if (cgo_flag) { Delete(f_cgo_comment); Delete(f_cgo_comment_typedefs); } Delete(f_c_begin); Delete(f_go_begin); if (!gccgo_flag && !cgo_flag) { Delete(f_gc_begin); } return SWIG_OK; } /* ------------------------------------------------------------ * importDirective() * * Handle a SWIG import statement by generating a Go import * statement. * ------------------------------------------------------------ */ virtual int importDirective(Node *n) { String *hold_import = imported_package; String *modname = Getattr(n, "module"); if (modname) { if (!Getattr(go_imports, modname)) { Setattr(go_imports, modname, modname); Printv(f_go_imports, "import \"", modname, "\"\n", NULL); } imported_package = modname; saw_import = true; } int r = Language::importDirective(n); imported_package = hold_import; return r; } /* ---------------------------------------------------------------------- * Language::insertDirective() * * If the section is go_imports, store them for later. * ---------------------------------------------------------------------- */ virtual int insertDirective(Node *n) { char *section = Char(Getattr(n, "section")); if ((ImportMode && !Getattr(n, "generated")) || !section || (strcmp(section, "go_imports") != 0)) { return Language::insertDirective(n); } char *code = Char(Getattr(n, "code")); char *pch = strtok(code, ","); while (pch != NULL) { // Do not import same thing more than once. if (!Getattr(go_imports, pch)) { Setattr(go_imports, pch, pch); Printv(f_go_imports, "import ", pch, "\n", NULL); } pch = strtok(NULL, ","); } return SWIG_OK; } /* ---------------------------------------------------------------------- * functionWrapper() * * Implement a function. * ---------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { if (GetFlag(n, "feature:ignore")) { return SWIG_OK; } // We don't need explicit calls. if (GetFlag(n, "explicitcall")) { return SWIG_OK; } // Don't emit constructors for abstract director classes. They // will never succeed anyhow. if (Swig_methodclass(n) && Swig_directorclass(n) && Strcmp(Char(Getattr(n, "wrap:action")), director_prot_ctor_code) == 0) { return SWIG_OK; } String *name = Getattr(n, "sym:name"); String *nodetype = Getattr(n, "nodeType"); bool is_static = is_static_member_function || isStatic(n); bool is_friend = isFriend(n); bool is_ctor_dtor = false; SwigType *result = Getattr(n, "type"); // For some reason SWIG changs the "type" value during the call to // functionWrapper. We need to remember the type for possible // overload processing. Setattr(n, "go:type", Copy(result)); String *go_name; String *r1 = NULL; if (making_variable_wrappers) { // Change the name of the variable setter and getter functions // to be more Go like. bool is_set = Strcmp(Char(name) + Len(name) - 4, "_set") == 0; assert(is_set || Strcmp(Char(name) + Len(name) - 4, "_get") == 0); // Start with Set or Get. go_name = NewString(is_set ? "Set" : "Get"); // If this is a static variable, put in the class name, // capitalized. if (is_static && class_name) { String *ccn = exportedName(class_name); Append(go_name, ccn); Delete(ccn); } // Add the rest of the name, capitalized, dropping the _set or // _get. String *c1 = removeClassname(name); String *c2 = exportedName(c1); char *p = Char(c2); int len = Len(p); for (int i = 0; i < len - 4; ++i) { Putc(p[i], go_name); } Delete(c2); Delete(c1); if (!checkIgnoredParameters(n, go_name)) { Delete(go_name); return SWIG_NOWRAP; } } else if (Cmp(nodetype, "constructor") == 0) { is_ctor_dtor = true; // Change the name of a constructor to be more Go like. Change // new_ to New, and capitalize the class name. assert(Strncmp(name, "new_", 4) == 0); String *c1 = NewString(Char(name) + 4); String *c2 = exportedName(c1); go_name = NewString("New"); Append(go_name, c2); Delete(c2); Delete(c1); if (Swig_methodclass(n) && Swig_directorclass(n)) { // The core SWIG code skips the first parameter when // generating the $nondirector_new string. Recreate the // action in this case. But don't it if we are using the // special code for an abstract class. String *call = Swig_cppconstructor_call(getClassType(), Getattr(n, "parms")); SwigType *type = Copy(getClassType()); SwigType_add_pointer(type); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); } } else if (Cmp(nodetype, "destructor") == 0) { // No need to emit protected destructors. if (!is_public(n)) { return SWIG_OK; } is_ctor_dtor = true; // Change the name of a destructor to be more Go like. Change // delete_ to Delete and capitalize the class name. assert(Strncmp(name, "delete_", 7) == 0); String *c1 = NewString(Char(name) + 7); String *c2 = exportedName(c1); go_name = NewString("Delete"); Append(go_name, c2); Delete(c2); Delete(c1); result = NewString("void"); r1 = result; } else { if (!checkFunctionVisibility(n, NULL)) { return SWIG_OK; } go_name = buildGoName(name, is_static, is_friend); if (!checkIgnoredParameters(n, go_name)) { Delete(go_name); return SWIG_NOWRAP; } } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } else { String *scope; if (!class_name || is_static || is_ctor_dtor) { scope = NULL; } else { scope = NewString("swiggoscope."); Append(scope, class_name); } if (!checkNameConflict(go_name, n, scope)) { Delete(go_name); return SWIG_NOWRAP; } } String *wname = Swig_name_wrapper(name); if (overname) { Append(wname, overname); } Append(wname, unique_id); Setattr(n, "wrap:name", wname); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); int r = makeWrappers(n, name, go_name, overname, wname, NULL, parms, result, is_static); if (r != SWIG_OK) { return r; } if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { String *scope ; if (!class_name || is_static || is_ctor_dtor) { scope = NULL; } else { scope = NewString("swiggoscope."); Append(scope, class_name); } if (!checkNameConflict(go_name, n, scope)) { Delete(go_name); return SWIG_NOWRAP; } String *receiver = class_receiver; if (is_static || is_ctor_dtor) { receiver = NULL; } r = makeDispatchFunction(n, go_name, receiver, is_static, NULL, false); if (r != SWIG_OK) { return r; } } Delete(wname); Delete(go_name); Delete(r1); return SWIG_OK; } /* ---------------------------------------------------------------------- * staticmemberfunctionHandler() * * For some reason the language code removes the "storage" attribute * for a static function before calling functionWrapper, which means * that we have no way of knowing whether a function is static or * not. That makes no sense in the Go context. Here we note that a * function is static. * ---------------------------------------------------------------------- */ int staticmemberfunctionHandler(Node *n) { assert(!is_static_member_function); is_static_member_function = true; int r = Language::staticmemberfunctionHandler(n); is_static_member_function = false; return r; } /* ---------------------------------------------------------------------- * makeWrappers() * * Write out the various function wrappers. * n: The function we are emitting. * name: The function name. * go_name: The name of the function in Go. * overname: The overload string for overloaded function. * wname: The SWIG wrapped name--the name of the C function. * base: A list of the names of base classes, in the case where this * is is a vritual method not defined in the current class. * parms: The parameters. * result: The result type. * is_static: Whether this is a static method or member. * ---------------------------------------------------------------------- */ int makeWrappers(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { assert(result); int ret = SWIG_OK; if (cgo_flag) { int r = makeCgoWrappers(n, go_name, overname, wname, base, parms, result, is_static); if (r != SWIG_OK) { ret = r; } } else { int r = goFunctionWrapper(n, name, go_name, overname, wname, base, parms, result, is_static); if (r != SWIG_OK) { ret = r; } if (!gccgo_flag) { r = gcFunctionWrapper(wname); if (r != SWIG_OK) { ret = r; } r = gccFunctionWrapper(n, base, wname, parms, result); if (r != SWIG_OK) { ret = r; } } else { r = gccgoFunctionWrapper(n, base, wname, parms, result); if (r != SWIG_OK) { ret = r; } } } if (class_methods) { Setattr(class_methods, Getattr(n, "name"), NewString("")); } return ret; } /* ---------------------------------------------------------------------- * struct cgoWrapperInfo * * Information needed by the CGO wrapper functions. * ---------------------------------------------------------------------- */ struct cgoWrapperInfo { // The function we are generating code for. Node *n; // The name of the Go function. String *go_name; // The overload string for an overloaded function. String *overname; // The name of the C wrapper function. String *wname; // The base classes. List *base; // The parameters. ParmList *parms; // The result type. SwigType *result; // Whether this is a static function, not a class method. bool is_static; // The Go receiver type. String *receiver; // Whether this is a class constructor. bool is_constructor; // Whether this is a class destructor. bool is_destructor; }; /* ---------------------------------------------------------------------- * makeCgoWrappers() * * Write out the wrappers for a function when producing cgo input * files. * ---------------------------------------------------------------------- */ int makeCgoWrappers(Node *n, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { Swig_save("makeCgoWrappers", n, "emit:cgotype", "emit:cgotypestruct", NULL); cgoWrapperInfo info; info.n = n; info.go_name = go_name; info.overname = overname; info.wname = wname; info.base = base; info.parms = parms; info.result = result; info.is_static = is_static; info.receiver = class_receiver; if (is_static) { info.receiver = NULL; } String *nodetype = Getattr(n, "nodeType"); info.is_constructor = Cmp(nodetype, "constructor") == 0; info.is_destructor = Cmp(nodetype, "destructor") == 0; if (info.is_constructor || info.is_destructor) { assert(class_receiver); assert(!base); info.receiver = NULL; } int ret = SWIG_OK; int r = cgoGoWrapper(&info); if (r != SWIG_OK) { ret = r; } r = cgoCommentWrapper(&info); if (r != SWIG_OK) { ret = r; } r = cgoGccWrapper(&info); if (r != SWIG_OK) { ret = r; } Swig_restore(n); return ret; } /* ---------------------------------------------------------------------- * cgoGoWrapper() * * Write out Go code to call a cgo function. This code will go into * the generated Go output file. * ---------------------------------------------------------------------- */ int cgoGoWrapper(const cgoWrapperInfo *info) { Wrapper *dummy = initGoTypemaps(info->parms); bool add_to_interface = interfaces && !info->is_constructor && !info->is_destructor && !info->is_static && !info->overname && checkFunctionVisibility(info->n, NULL); Printv(f_go_wrappers, "func ", NULL); Parm *p = info->parms; int pi = 0; // Add the receiver first if this is a method. if (info->receiver) { Printv(f_go_wrappers, "(", NULL); if (info->base && info->receiver) { Printv(f_go_wrappers, "_swig_base", NULL); } else { Printv(f_go_wrappers, Getattr(p, "lname"), NULL); p = nextParm(p); ++pi; } Printv(f_go_wrappers, " ", info->receiver, ") ", NULL); } Printv(f_go_wrappers, info->go_name, NULL); if (info->overname) { Printv(f_go_wrappers, info->overname, NULL); } Printv(f_go_wrappers, "(", NULL); // If we are doing methods, add this method to the interface. if (add_to_interface) { Printv(interfaces, "\t", info->go_name, "(", NULL); } // Write out the parameters to both the function definition and // the interface. String *parm_print = NewString(""); int parm_count = emit_num_arguments(info->parms); int required_count = emit_num_required(info->parms); int args = 0; for (; pi < parm_count; ++pi) { p = getParm(p); if (pi == 0 && info->is_destructor) { String *cl = exportedName(class_name); Printv(parm_print, Getattr(p, "lname"), " ", cl, NULL); Delete(cl); ++args; } else { if (args > 0) { Printv(parm_print, ", ", NULL); } ++args; if (pi >= required_count) { Printv(parm_print, "_swig_args ...interface{}", NULL); break; } Printv(parm_print, Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(parm_print, tm, NULL); Delete(tm); } p = nextParm(p); } Printv(parm_print, ")", NULL); // Write out the result type. if (info->is_constructor) { String *cl = exportedName(class_name); Printv(parm_print, " (_swig_ret ", cl, ")", NULL); Delete(cl); } else { if (SwigType_type(info->result) != T_VOID) { String *tm = goType(info->n, info->result); Printv(parm_print, " (_swig_ret ", tm, ")", NULL); Delete(tm); } } Printv(f_go_wrappers, parm_print, NULL); if (add_to_interface) { Printv(interfaces, parm_print, "\n", NULL); } // Write out the function body. Printv(f_go_wrappers, " {\n", NULL); if (parm_count > required_count) { Parm *p = info->parms; int i; for (i = 0; i < required_count; ++i) { p = getParm(p); p = nextParm(p); } for (; i < parm_count; ++i) { p = getParm(p); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, "\tvar ", Getattr(p, "lname"), " ", tm, "\n", NULL); Printf(f_go_wrappers, "\tif len(_swig_args) > %d {\n", i - required_count); Printf(f_go_wrappers, "\t\t%s = _swig_args[%d].(%s)\n", Getattr(p, "lname"), i - required_count, tm); Printv(f_go_wrappers, "\t}\n", NULL); Delete(tm); p = nextParm(p); } } String *call = NewString("\t"); String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; if (SwigType_type(info->result) != T_VOID) { if (info->is_constructor) { ret_type = exportedName(class_name); } else { ret_type = goImType(info->n, info->result); } Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); bool c_struct_type; Delete(cgoTypeForGoValue(info->n, info->result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = (", ret_type, ")(", NULL); } if (info->is_constructor || goTypeIsInterface(info->n, info->result)) { if (info->is_constructor) { wt = Copy(class_receiver); } else { wt = goWrapperType(info->n, info->result, true); } Printv(call, wt, "(", NULL); } } Printv(call, "C.", info->wname, "(", NULL); args = 0; if (parm_count > required_count) { Printv(call, "C.swig_intgo(len(_swig_args))", NULL); ++args; } if (info->base && info->receiver) { if (args > 0) { Printv(call, ", ", NULL); } ++args; Printv(call, "C.uintptr_t(_swig_base)", NULL); } p = info->parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (args > 0) { Printv(call, ", ", NULL); } ++args; SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if ((i == 0 && info->is_destructor) || ((i > 0 || !info->receiver || info->base || info->is_constructor) && goTypeIsInterface(p, pt))) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); Setattr(p, "emit:goinput", ln); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); Setattr(p, "emit:goinput", ivar); } bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } Delete(ct); p = nextParm(p); } Printv(f_go_wrappers, call, ")", NULL); Delete(call); if (wt) { // Close the type conversion to the wrapper type. Printv(f_go_wrappers, ")", NULL); } if (SwigType_type(info->result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(f_go_wrappers, ")", NULL); } Printv(f_go_wrappers, "\n", NULL); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } if (ret_type) { Delete(ret_type); } goargout(info->parms); if (SwigType_type(info->result) != T_VOID) { Swig_save("cgoGoWrapper", info->n, "type", "tmap:goout", NULL); Setattr(info->n, "type", info->result); String *goout = goTypemapLookup("goout", info->n, "swig_r"); if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(info->n, info->result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); goout = Copy(goout); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } Swig_restore(info->n); } Printv(f_go_wrappers, "}\n\n", NULL); DelWrapper(dummy); return SWIG_OK; } /* ---------------------------------------------------------------------- * cgoCommentWrapper() * * Write out a cgo function to call a C/C++ function. This code * will go into the cgo comment in the generated Go output file. * ---------------------------------------------------------------------- */ int cgoCommentWrapper(const cgoWrapperInfo *info) { String *ret_type; if (SwigType_type(info->result) == T_VOID) { ret_type = NewString("void"); } else { bool c_struct_type; ret_type = cgoTypeForGoValue(info->n, info->result, &c_struct_type); } Printv(f_cgo_comment, "extern ", ret_type, " ", info->wname, "(", NULL); Delete(ret_type); int parm_count = emit_num_arguments(info->parms); int required_count = emit_num_required(info->parms); int args = 0; if (parm_count > required_count) { Printv(f_cgo_comment, "intgo _swig_args", NULL); ++args; } if (info->base && info->receiver) { if (args > 0) { Printv(f_cgo_comment, ", ", NULL); } ++args; Printv(f_cgo_comment, "uintptr_t _swig_base", NULL); } Parm *p = info->parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (args > 0) { Printv(f_cgo_comment, ", ", NULL); } ++args; SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); Printv(f_cgo_comment, ct, " ", ln, NULL); Delete(ct); p = nextParm(p); } if (args == 0) { Printv(f_cgo_comment, "void", NULL); } Printv(f_cgo_comment, ");\n", NULL); return SWIG_OK; } /* ---------------------------------------------------------------------- * cgoGccWrapper() * * Write out code to the C/C++ wrapper file. This code will be * called by the code generated by cgoCommentWrapper. * ---------------------------------------------------------------------- */ int cgoGccWrapper(const cgoWrapperInfo *info) { Wrapper *f = NewWrapper(); Swig_save("cgoGccWrapper", info->n, "parms", NULL); ParmList *parms = info->parms; Parm *base_parm = NULL; if (info->base && !isStatic(info->n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), info->n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); emit_return_variable(info->n, info->result, f); // Start the function definition. String *fnname = NewString(""); Printv(fnname, info->wname, "(", NULL); int args = 0; if (parm_count > required_count) { Printv(fnname, "intgo _swig_optargc", NULL); ++args; } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { if (args > 0) { Printv(fnname, ", ", NULL); } ++args; p = getParm(p); SwigType *pt = Copy(Getattr(p, "type")); if (SwigType_isarray(pt)) { SwigType_del_array(pt); SwigType_add_pointer(pt); } String *pn = NewStringf("_swig_go_%d", i); String *ct = gcCTypeForGoValue(p, pt, pn); Printv(fnname, ct, NULL); Delete(ct); Delete(pn); Delete(pt); p = nextParm(p); } Printv(fnname, ")", NULL); if (SwigType_type(info->result) == T_VOID) { Printv(f->def, "void ", fnname, NULL); } else { String *ct = gcCTypeForGoValue(info->n, info->result, fnname); Printv(f->def, ct, NULL); Delete(ct); String *ln = NewString("_swig_go_result"); ct = gcCTypeForGoValue(info->n, info->result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } Delete(fnname); Printv(f->def, " {\n", NULL); // Apply the in typemaps. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *pn = NewStringf("_swig_go_%d", i); Replaceall(tm, "$input", pn); if (i < required_count) { Printv(f->code, "\t", tm, "\n", NULL); } else { Printf(f->code, "\tif (_swig_optargc > %d) {\n", i - required_count); Printv(f->code, "\t\t", tm, "\n", NULL); Printv(f->code, "\t}\n", NULL); } Delete(tm); Setattr(p, "emit:input", pn); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(info->n, info->base, parms, info->result, f); argout(parms, f); cleanupFunction(info->n, f, parms); if (SwigType_type(info->result) != T_VOID) { Printv(f->code, "\treturn _swig_go_result;\n", NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(info->n); DelWrapper(f); if (base_parm) { Delete(base_parm); } return SWIG_OK; } /* ---------------------------------------------------------------------- * goFunctionWrapper() * * Write out a function wrapper in Go. When not implementing a * method, the actual code is all in C; here we just declare the C * function. When implementing a method, we have to call the C * function, because it will have a different name. If base is not * NULL, then we are being called to forward a virtual method to a * base class. * ---------------------------------------------------------------------- */ int goFunctionWrapper(Node *n, String *name, String *go_name, String *overname, String *wname, List *base, ParmList *parms, SwigType *result, bool is_static) { Wrapper *dummy = initGoTypemaps(parms); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); String *receiver = class_receiver; if (receiver && is_static) { receiver = NULL; } String *nodetype = Getattr(n, "nodeType"); bool is_constructor = Cmp(nodetype, "constructor") == 0; bool is_destructor = Cmp(nodetype, "destructor") == 0; if (is_constructor || is_destructor) { assert(class_receiver); assert(!base); receiver = NULL; } Swig_save("cgoGoWrapper", n, "type", "tmap:goout", NULL); Setattr(n, "type", result); String *goout = goTypemapLookup("goout", n, "swig_r"); Swig_restore(n); bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !overname && checkFunctionVisibility(n, NULL)); bool needs_wrapper = (gccgo_flag || receiver || is_constructor || is_destructor || parm_count > required_count); bool has_goout = false; if (goout) { has_goout = true; } // See whether any of the function parameters are represented by // interface values. When calling the C++ code, we need to convert // back to a uintptr. Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ty = Getattr(p, "type"); if (goGetattr(p, "tmap:goargout")) { has_goout = true; needs_wrapper = true; } else if (goTypeIsInterface(p, ty) || goGetattr(p, "tmap:goin")) { needs_wrapper = true; } if (paramNeedsEscape(p)) { needs_wrapper = true; } p = nextParm(p); } if (goTypeIsInterface(n, result) || goout != NULL) { needs_wrapper = true; } if (!gccgo_flag) { Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); } // If this is a method, first declare the C function we will call. // If we do not need a wrapper, then we will only be writing a // declaration. String *wrapper_name = NULL; if (needs_wrapper) { wrapper_name = buildGoWrapperName(name, overname); if (gccgo_flag) { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } bool arg = false; Printv(f_go_wrappers, "func ", wrapper_name, "(", NULL); if (parm_count > required_count) { Printv(f_go_wrappers, argName(&arg), " int", NULL); } Parm *p = getParm(parms); int i = 0; if (is_destructor) { if (parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, argName(&arg), " uintptr", NULL); ++i; p = nextParm(p); } else if (receiver && (base || !is_constructor)) { if (parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, argName(&arg), " ", receiver, NULL); if (!base) { ++i; p = nextParm(p); } } for (; i < parm_count; ++i) { p = getParm(p); if (i > 0 || (base && receiver) || parm_count > required_count) { Printv(f_go_wrappers, ", ", NULL); } String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, argName(&arg), " ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (is_constructor) { Printv(f_go_wrappers, " (", argName(&arg), " ", class_receiver, ")", NULL); } else { if (SwigType_type(result) != T_VOID) { String *tm = goWrapperType(n, result, true); Printv(f_go_wrappers, " (", argName(&arg), " ", tm, ")", NULL); Delete(tm); } } if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); if (arg) { Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&base))\n", NULL); } else { Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); } Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } // Start defining the Go function. if (!needs_wrapper && gccgo_flag) { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } Printv(f_go_wrappers, "func ", NULL); p = parms; int pi = 0; // Add the receiver if this is a method. String *first = NULL; if (receiver) { Printv(f_go_wrappers, "(", NULL); if (base && receiver) { Printv(f_go_wrappers, "_swig_base", NULL); if (first == NULL) { first = NewString("_swig_base"); } } else { Printv(f_go_wrappers, Getattr(p, "lname"), NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } p = nextParm(p); ++pi; } Printv(f_go_wrappers, " ", receiver, ") ", NULL); } Printv(f_go_wrappers, go_name, NULL); if (overname) { Printv(f_go_wrappers, overname, NULL); } Printv(f_go_wrappers, "(", NULL); // If we are doing methods, add this function to the interface. if (add_to_interface) { Printv(interfaces, "\t", go_name, "(", NULL); } // Write out the parameters to both the function definition and // the interface. String *parm_print = NewString(""); for (; pi < parm_count; ++pi) { p = getParm(p); if (pi == 0 && is_destructor) { String *cl = exportedName(class_name); Printv(parm_print, Getattr(p, "lname"), " ", cl, NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } Delete(cl); } else { if (pi > (receiver && !base ? 1 : 0)) { Printv(parm_print, ", ", NULL); } if (pi >= required_count) { Printv(parm_print, "_swig_args ...interface{}", NULL); if (first == NULL) { first = NewString("_swig_args"); } break; } Printv(parm_print, Getattr(p, "lname"), " ", NULL); if (first == NULL) { first = Copy(Getattr(p, "lname")); } String *tm = goType(p, Getattr(p, "type")); Printv(parm_print, tm, NULL); Delete(tm); } p = nextParm(p); } Printv(parm_print, ")", NULL); // Write out the result type. if (is_constructor) { String *cl = exportedName(class_name); Printv(parm_print, " (_swig_ret ", cl, ")", NULL); if (first == NULL) { first = NewString("_swig_ret"); } Delete(cl); } else { if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(parm_print, " (_swig_ret ", tm, ")", NULL); if (first == NULL) { first = NewString("_swig_ret"); } Delete(tm); } } Printv(f_go_wrappers, parm_print, NULL); if (add_to_interface) { Printv(interfaces, parm_print, "\n", NULL); } // If this is a wrapper, we need to actually call the C function. if (needs_wrapper) { Printv(f_go_wrappers, " {\n", NULL); if (parm_count > required_count) { Parm *p = parms; int i; for (i = 0; i < required_count; ++i) { p = getParm(p); p = nextParm(p); } for (; i < parm_count; ++i) { p = getParm(p); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, "\tvar ", Getattr(p, "lname"), " ", tm, "\n", NULL); Printf(f_go_wrappers, "\tif len(_swig_args) > %d {\n", i - required_count); Printf(f_go_wrappers, "\t\t%s = _swig_args[%d].(%s)\n", Getattr(p, "lname"), i - required_count, tm); Printv(f_go_wrappers, "\t}\n", NULL); Delete(tm); p = nextParm(p); } } String *call = NewString(""); bool need_return_var = SwigType_type(result) != T_VOID && ((gccgo_flag && is_constructor) || has_goout); if (need_return_var) { Printv(f_go_wrappers, "\tvar swig_r ", NULL); if (is_constructor) { String *cl = exportedName(class_name); Printv(f_go_wrappers, cl, NULL); Delete(cl); } else { Printv(f_go_wrappers, goImType(n, result), NULL); } Printv(f_go_wrappers, "\n", NULL); } if (gccgo_flag) { if (has_goout || is_constructor) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (need_return_var) { Printv(call, "swig_r = ", NULL); } else { Printv(call, "return ", NULL); } } Printv(call, wrapper_name, "(", NULL); if (parm_count > required_count) { Printv(call, "len(_swig_args)", NULL); } if (base && receiver) { if (parm_count > required_count) { Printv(call, ", ", NULL); } Printv(call, "_swig_base", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0 || (base && receiver) || parm_count > required_count) { Printv(call, ", ", NULL); } SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(call, ln, NULL); if ((i == 0 && is_destructor) || ((i > 0 || !receiver || base || is_constructor) && goTypeIsInterface(p, pt))) { Printv(call, ".Swigcptr()", NULL); } Setattr(p, "emit:goinput", ln); } else { String *ivar = NewString(""); Printf(ivar, "_swig_i_%d", i); String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); Printv(call, ivar, NULL); Setattr(p, "emit:goinput", ivar); } // If the parameter has an argout or freearg typemap, make // sure that it escapes. if (paramNeedsEscape(p)) { Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); Printv(f_go_wrappers, "\t}\n", NULL); } p = nextParm(p); } Printv(call, ")\n", NULL); if (gccgo_flag && (has_goout || is_constructor)) { Printv(call, "\t}()\n", NULL); } Printv(f_go_wrappers, call, NULL); Delete(call); goargout(parms); if (need_return_var) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } Printv(f_go_wrappers, "}\n", NULL); } else if (!gccgo_flag) { // We don't need a wrapper. If we're using gccgo, the function // declaration is all we need--it has a //extern comment to // GCC-compiled wrapper. If we're not using gccgo, we need to // call the GCC-compiled wrapper here. Printv(f_go_wrappers, " {\n", NULL); if (first == NULL) { Printv(f_go_wrappers, "\tvar _swig_p uintptr\n", NULL); } else { Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&", first, "))\n", NULL); } Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n", NULL); Delete(wrapper_name); DelWrapper(dummy); return SWIG_OK; } /* ---------------------------------------------------------------------- * initGoTypemaps() * * Initialize the typenames for a Go wrapper, returning a dummy * Wrapper*. Also set consistent names for the parameters. * ---------------------------------------------------------------------- */ Wrapper* initGoTypemaps(ParmList *parms) { Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); Parm *p = parms; int parm_count = emit_num_arguments(parms); for (int i = 0; i < parm_count; ++i) { p = getParm(p); Swig_cparm_name(p, i); p = nextParm(p); } Swig_typemap_attach_parms("default", parms, dummy); Swig_typemap_attach_parms("gotype", parms, dummy); Swig_typemap_attach_parms("goin", parms, dummy); Swig_typemap_attach_parms("goargout", parms, dummy); Swig_typemap_attach_parms("imtype", parms, dummy); return dummy; } /* ---------------------------------------------------------------------- * argName() * * A helper for goFunctionWrapper to output the first argument name * as "base" and all others as "_". * ---------------------------------------------------------------------- */ const char *argName(bool *arg) { if (*arg) { return "_"; } *arg = true; return "base"; } /* ---------------------------------------------------------------------- * paramNeedsEscape() * * A helper for goFunctionWrapper that returns whether a parameter * needs to explicitly escape. This is true if the parameter has a * non-empty argout or freearg typemap, because in those cases the * Go argument might be or contain a pointer. We need to ensure * that that pointer does not point into the stack, which means that * it needs to escape. * ---------------------------------------------------------------------- */ bool paramNeedsEscape(Parm *p) { String *argout = Getattr(p, "tmap:argout"); String *freearg = Getattr(p, "tmap:freearg"); if ((!argout || Len(argout) == 0) && (!freearg || Len(freearg) == 0)) { return false; } // If a C++ type is represented as an interface type in Go, then // we don't care whether it escapes, because we know that the // pointer is a C++ pointer. if (goTypeIsInterface(p, Getattr(p, "type"))) { return false; } return true; } /* ---------------------------------------------------------------------- * gcFunctionWrapper() * * This is used for 6g/8g, not for gccgo. Write out the function * redirector that will be compiled with 6c/8c. This used to write * out a real function wrapper, but that has moved into Go code. * ---------------------------------------------------------------------- */ int gcFunctionWrapper(String *wname) { Wrapper *f = NewWrapper(); Printv(f->def, "#pragma dynimport ", wname, " ", wname, " \"\"\n", NULL); Printv(f->def, "#pragma cgo_import_static ", wname, "\n", NULL); Printv(f->def, "extern void ", wname, "(void*);\n", NULL); // Declare this as a uintptr, since it is not a pointer into the // Go heap. // \xc2\xb7 is UTF-8 for U+00B7 which is Unicode 'Middle Dot' Printv(f->def, "uintptr \xc2\xb7", wname, " = (uintptr)", wname, ";\n", NULL); Wrapper_print(f, f_gc_wrappers); DelWrapper(f); return SWIG_OK; } /* ---------------------------------------------------------------------- * gccFunctionWrapper() * * This is used for 6g/8g, not for gccgo. Write out the function * wrapper which will be compiled with gcc. If the base parameter * is not NULL, this is calls the base class method rather than * executing the SWIG wrapper code. * ---------------------------------------------------------------------- */ int gccFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { Wrapper *f = NewWrapper(); Swig_save("gccFunctionWrapper", n, "parms", NULL); Parm *base_parm = NULL; if (base && !isStatic(n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); bool needs_swigargs = false; emit_return_variable(n, result, f); // Start the function definition. Printv(f->def, "void\n", wname, "(void *swig_v)\n", "{\n", NULL); // The single function parameter is a pointer to the real argument // values. Define the structure that it points to. String *swigargs = NewString("\tstruct swigargs {\n"); if (parm_count > required_count) { needs_swigargs = true; Printv(swigargs, "\t\tintgo _swig_optargc;\n", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ln = Getattr(p, "lname"); SwigType *pt = Getattr(p, "type"); String *ct = gcCTypeForGoValue(p, pt, ln); Printv(swigargs, "\t\t\t", ct, ";\n", NULL); needs_swigargs = true; Delete(ct); String *gn = NewStringf("_swig_go_%d", i); ct = gcCTypeForGoValue(p, pt, gn); Setattr(p, "emit:input", gn); Wrapper_add_local(f, gn, ct); Delete(ct); p = nextParm(p); } if (SwigType_type(result) != T_VOID) { Printv(swigargs, "\t\tlong : 0;\n", NULL); String *ln = NewString(Swig_cresult_name()); String *ct = gcCTypeForGoValue(n, result, ln); Delete(ln); Printv(swigargs, "\t\t", ct, ";\n", NULL); needs_swigargs = true; Delete(ct); ln = NewString("_swig_go_result"); ct = gcCTypeForGoValue(n, result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } Printv(swigargs, "\t} SWIGSTRUCTPACKED *swig_a = (struct swigargs *) swig_v;\n", NULL); // Copy the input arguments out of the structure into the Go local // variables. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *ln = Getattr(p, "lname"); String *gn = Getattr(p, "emit:input"); Printv(f->code, "\t", gn, " = swig_a->", ln, ";\n", NULL); p = nextParm(p); } // Apply the in typemaps. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *gn = Getattr(p, "emit:input"); Replaceall(tm, "$input", gn); if (i < required_count) { Printv(f->code, "\t", tm, "\n", NULL); } else { Printf(f->code, "\tif (swig_a->_swig_optargc > %d) {\n", i - required_count); Printv(f->code, "\t\t", tm, "\n", NULL); Printv(f->code, "\t}\n", NULL); } Delete(tm); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(n, base, parms, result, f); argout(parms, f); cleanupFunction(n, f, parms); if (needs_swigargs) { Printv(f->locals, swigargs, NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(n); Delete(swigargs); DelWrapper(f); Delete(base_parm); return SWIG_OK; } /* ---------------------------------------------------------------------- * gccgoFunctionWrapper() * * This is used for gccgo, not 6g/8g. Write out the function * wrapper which will be compiled with gcc. If the base parameter * is not NULL, this is calls the base class method rather than * executing the SWIG wrapper code. * ---------------------------------------------------------------------- */ int gccgoFunctionWrapper(Node *n, List *base, String *wname, ParmList *parms, SwigType *result) { Wrapper *f = NewWrapper(); Swig_save("gccgoFunctionWrapper", n, "parms", NULL); Parm *base_parm = NULL; if (base && !isStatic(n)) { SwigType *base_type = Copy(getClassType()); SwigType_add_pointer(base_type); base_parm = NewParm(base_type, NewString("arg1"), n); set_nextSibling(base_parm, parms); parms = base_parm; } emit_parameter_variables(parms, f); emit_attach_parmmaps(parms, f); int parm_count = emit_num_arguments(parms); int required_count = emit_num_required(parms); emit_return_variable(n, result, f); // Start the function definition. String *fnname = NewString(""); Printv(fnname, "go_", wname, "(", NULL); if (parm_count > required_count) { Printv(fnname, "intgo _swig_optargc", NULL); } Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); SwigType *pt = Copy(Getattr(p, "type")); if (SwigType_isarray(pt)) { SwigType_del_array(pt); SwigType_add_pointer(pt); } String *pn = NewString("g"); Append(pn, Getattr(p, "lname")); String *ct = gccgoCTypeForGoValue(p, pt, pn); if (i > 0 || parm_count > required_count) { Printv(fnname, ", ", NULL); } Printv(fnname, ct, NULL); Delete(ct); Delete(pn); Delete(pt); p = nextParm(p); } Printv(fnname, ")", NULL); String *fndef = NewString(""); if (SwigType_type(result) == T_VOID) { Printv(fndef, "void ", fnname, NULL); } else { String *ct = gccgoCTypeForGoValue(n, result, fnname); Printv(fndef, ct, NULL); Delete(ct); } Printv(f->def, fndef, " __asm__(\"", go_prefix, "_", wname, "\");\n", NULL); Printv(f->def, fndef, " {\n", NULL); Delete(fnname); Delete(fndef); if (SwigType_type(result) != T_VOID) { String *ln = NewString("_swig_go_result"); String *ct = gccgoCTypeForGoValue(n, result, ln); Wrapper_add_local(f, "_swig_go_result", ct); Delete(ct); Delete(ln); } // Copy the parameters into the variables which hold their values, // applying appropriate transformations. p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = Getattr(p, "tmap:in"); if (!tm) { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { String *ln = Getattr(p, "lname"); String *pn = NewString("g"); Append(pn, ln); tm = Copy(tm); Replaceall(tm, "$input", pn); Setattr(p, "emit:input", pn); if (i < required_count) { Printv(f->code, " ", tm, "\n", NULL); } else { Printf(f->code, " if (_swig_optargc > %d) {\n", i - required_count); Printv(f->code, " ", tm, "\n", NULL); Printv(f->code, " }\n", NULL); } Delete(tm); } p = nextParm(p); } Printv(f->code, "\n", NULL); // Do the real work of the function. checkConstraints(parms, f); emitGoAction(n, base, parms, result, f); argout(parms, f); cleanupFunction(n, f, parms); if (SwigType_type(result) != T_VOID) { Printv(f->code, " return _swig_go_result;\n", NULL); } Printv(f->code, "}\n", NULL); Wrapper_print(f, f_c_wrappers); Swig_restore(n); DelWrapper(f); Delete(base_parm); return SWIG_OK; } /* ----------------------------------------------------------------------- * checkConstraints() * * Check parameter constraints if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void checkConstraints(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:check"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n\n", NULL); Delete(tm); p = Getattr(p, "tmap:check:next"); } } } /* ----------------------------------------------------------------------- * emitGoAction() * * Emit the action of the function. This is used for the C/C++ function. * ----------------------------------------------------------------------- */ void emitGoAction(Node *n, List *base, ParmList *parms, SwigType *result, Wrapper *f) { if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { Wrapper_add_local(f, "swig_stktop", "char *swig_stktop"); Printv(f->code, "\tswig_stktop = _swig_topofstack();\n", NULL); } String *actioncode; if (!base || isStatic(n)) { Swig_director_emit_dynamic_cast(n, f); actioncode = emit_action(n); } else { // Call the base class method. actioncode = NewString(""); String *current = NewString(""); if (!gccgo_flag && !cgo_flag) { Printv(current, "swig_a->", NULL); } Printv(current, Getattr(parms, "lname"), NULL); int vc = 0; for (Iterator bi = First(base); bi.item; bi = Next(bi)) { Printf(actioncode, " %s *swig_b%d = (%s *)%s;\n", bi.item, vc, bi.item, current); Delete(current); current = NewString(""); Printf(current, "swig_b%d", vc); ++vc; } String *code = Copy(Getattr(n, "wrap:action")); Replace(code, Getattr(parms, "lname"), current, DOH_REPLACE_ANY | DOH_REPLACE_ID); Delete(current); Printv(actioncode, code, "\n", NULL); } Swig_save("emitGoAction", n, "type", "tmap:out", NULL); Setattr(n, "type", result); String *tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode); if (!tm) { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s\n", SwigType_str(result, 0)); } else { Replaceall(tm, "$result", "_swig_go_result"); if (GetFlag(n, "feature:new")) { Replaceall(tm, "$owner", "1"); } else { Replaceall(tm, "$owner", "0"); } Printv(f->code, tm, "\n", NULL); Delete(tm); } if (!gccgo_flag && !cgo_flag && SwigType_type(result) != T_VOID) { // If the function called back into the Go code, the stack might // have been copied. We need to adjust swig_a accordingly here. // This is what cgo does. Printv(f->code, "\tswig_a = (struct swigargs*)((char*)swig_a + (_swig_topofstack() - swig_stktop));\n", NULL); Printv(f->code, "\tswig_a->", Swig_cresult_name(), " = ", "_swig_go_result;\n", NULL); } Swig_restore(n); } /* ----------------------------------------------------------------------- * argout() * * Handle argument output code if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void argout(ParmList *parms, Wrapper *f) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:argout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(f->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:argout:next"); } } } /* ----------------------------------------------------------------------- * goargout() * * Handle Go argument output code if any. This is used for the Go * function. This assumes that each parameter has an "emit:goinput" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ void goargout(ParmList *parms) { Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:goargout"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$result", "swig_r"); Replaceall(tm, "$input", Getattr(p, "emit:goinput")); Printv(f_go_wrappers, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:goargout:next"); } } // When using cgo, if we need to memcpy a parameter to pass it to // the C code, the compiler may think that the parameter is not // live during the function call. If the garbage collector runs // while the C/C++ function is running, the parameter may be // freed. Force the compiler to see the parameter as live across // the C/C++ function. if (cgo_flag) { int parm_count = emit_num_arguments(parms); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; Delete(cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type)); if (c_struct_type) { Printv(f_go_wrappers, "\tif Swig_escape_always_false {\n", NULL); Printv(f_go_wrappers, "\t\tSwig_escape_val = ", Getattr(p, "emit:goinput"), "\n", NULL); Printv(f_go_wrappers, "\t}\n", NULL); } p = nextParm(p); } } } /* ----------------------------------------------------------------------- * freearg() * * Handle argument cleanup code if any. This is used for the C/C++ * function. This assumes that each parameter has an "emit:input" * property with the name to use to refer to that parameter. * ----------------------------------------------------------------------- */ String *freearg(ParmList *parms) { String *ret = NewString(""); Parm *p = parms; while (p) { String *tm = Getattr(p, "tmap:freearg"); if (!tm) { p = nextSibling(p); } else { tm = Copy(tm); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(ret, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:freearg:next"); } } return ret; } /* ----------------------------------------------------------------------- * cleanupFunction() * * Final function cleanup code. * ----------------------------------------------------------------------- */ void cleanupFunction(Node *n, Wrapper *f, ParmList *parms) { String *cleanup = freearg(parms); Printv(f->code, cleanup, NULL); if (GetFlag(n, "feature:new")) { String *tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0); if (tm) { Replaceall(tm, "$source", Swig_cresult_name()); Printv(f->code, tm, "\n", NULL); Delete(tm); } } Replaceall(f->code, "$cleanup", cleanup); Delete(cleanup); /* See if there is any return cleanup code */ String *tm; if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Replaceall(tm, "$source", Swig_cresult_name()); Printf(f->code, "%s\n", tm); Delete(tm); } Replaceall(f->code, "$symname", Getattr(n, "sym:name")); } /* ----------------------------------------------------------------------- * variableHandler() * * This exists just to set the making_variable_wrappers flag. * ----------------------------------------------------------------------- */ virtual int variableHandler(Node *n) { assert(!making_variable_wrappers); making_variable_wrappers = true; int r = Language::variableHandler(n); making_variable_wrappers = false; return r; } /* ----------------------------------------------------------------------- * constantWrapper() * * Product a const declaration. * ------------------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { SwigType *type = Getattr(n, "type"); if (!SwigType_issimple(type) && SwigType_type(type) != T_STRING) { return goComplexConstant(n, type); } if (Swig_storage_isstatic(n)) { return goComplexConstant(n, type); } String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *tm = goType(n, type); String *value = Getattr(n, "value"); String *copy = NULL; if (SwigType_type(type) == T_BOOL) { if (Cmp(value, "true") != 0 && Cmp(value, "false") != 0) { return goComplexConstant(n, type); } } else if (SwigType_type(type) == T_STRING || SwigType_type(type) == T_CHAR) { // Backslash sequences are somewhat different in Go and C/C++. if (Strchr(value, '\\') != 0) { return goComplexConstant(n, type); } } else { // Accept a 0x prefix, and strip combinations of u and l // suffixes. Otherwise accept digits, decimal point, and // exponentiation. Treat anything else as too complicated to // handle as a Go constant. char *p = Char(value); int len = (int)strlen(p); bool need_copy = false; while (len > 0) { char c = p[len - 1]; if (c != 'l' && c != 'L' && c != 'u' && c != 'U') { break; } --len; need_copy = true; } bool is_hex = false; int i = 0; if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { i = 2; is_hex = true; } for (; i < len; ++i) { switch (p[i]) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': break; case 'a': case 'b': case 'c': case 'd': case 'f': case 'A': case 'B': case 'C': case 'D': case 'F': if (!is_hex) { return goComplexConstant(n, type); } break; case '.': case 'e': case 'E': case '+': case '-': break; default: return goComplexConstant(n, type); } } if (need_copy) { copy = Copy(value); Replaceall(copy, p + len, ""); value = copy; } } if (!checkNameConflict(go_name, n, NULL)) { Delete(tm); Delete(go_name); Delete(copy); return SWIG_NOWRAP; } Printv(f_go_wrappers, "const ", go_name, " ", tm, " = ", NULL); if (SwigType_type(type) == T_STRING) { Printv(f_go_wrappers, "\"", value, "\"", NULL); } else if (SwigType_type(type) == T_CHAR) { Printv(f_go_wrappers, "'", value, "'", NULL); } else { Printv(f_go_wrappers, value, NULL); } Printv(f_go_wrappers, "\n", NULL); Delete(tm); Delete(go_name); Delete(copy); return SWIG_OK; } /* ---------------------------------------------------------------------- * enumDeclaration() * * A C++ enum type turns into a Named go int type. * ---------------------------------------------------------------------- */ virtual int enumDeclaration(Node *n) { if (getCurrentClass() && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *name = goEnumName(n); if (Strcmp(name, "int") != 0) { if (!ImportMode || !imported_package) { if (!checkNameConflict(name, n, NULL)) { Delete(name); return SWIG_NOWRAP; } Printv(f_go_wrappers, "type ", name, " int\n", NULL); } else { String *nw = NewString(""); Printv(nw, getModuleName(imported_package), ".", name, NULL); Setattr(n, "go:enumname", nw); } } Delete(name); return Language::enumDeclaration(n); } /* ----------------------------------------------------------------------- * enumvalueDeclaration() * * Declare a single value of an enum type. We fetch the value by * calling a C/C++ function. * ------------------------------------------------------------------------ */ virtual int enumvalueDeclaration(Node *n) { if (!is_public(n)) { return SWIG_OK; } Swig_require("enumvalueDeclaration", n, "*sym:name", NIL); Node *parent = parentNode(n); if (Getattr(parent, "unnamed")) { Setattr(n, "type", NewString("int")); } else { Setattr(n, "type", Getattr(parent, "enumtype")); } if (GetFlag(parent, "scopedenum")) { String *symname = Getattr(n, "sym:name"); symname = Swig_name_member(0, Getattr(parent, "sym:name"), symname); Setattr(n, "sym:name", symname); Delete(symname); } int ret = goComplexConstant(n, Getattr(n, "type")); Swig_restore(n); return ret; } /* ----------------------------------------------------------------------- * goComplexConstant() * * Handle a const declaration for something which is not a Go constant. * ------------------------------------------------------------------------ */ int goComplexConstant(Node *n, SwigType *type) { String *symname = Getattr(n, "sym:name"); if (!symname) { symname = Getattr(n, "name"); } String *varname = buildGoName(symname, true, false); if (!checkNameConflict(varname, n, NULL)) { Delete(varname); return SWIG_NOWRAP; } String *get = NewString(""); Printv(get, Swig_cresult_name(), " = ", NULL); String *rawval = Getattr(n, "rawval"); if (rawval && Len(rawval)) { if (SwigType_type(type) == T_STRING) { Printv(get, "(char *)", NULL); } Printv(get, rawval, NULL); } else { char quote; if (Getattr(n, "wrappedasconstant")) { quote = '\0'; } else if (SwigType_type(type) == T_CHAR) { quote = '\''; } else if (SwigType_type(type) == T_STRING) { Printv(get, "(char *)", NULL); quote = '"'; } else { quote = '\0'; } if (quote != '\0') { Printf(get, "%c", quote); } Printv(get, Getattr(n, "value"), NULL); if (quote != '\0') { Printf(get, "%c", quote); } } Printv(get, ";\n", NULL); Setattr(n, "wrap:action", get); String *sname = Copy(symname); if (class_name) { Append(sname, "_"); Append(sname, class_name); } String *go_name = NewString("_swig_get"); if (class_name) { Append(go_name, class_name); Append(go_name, "_"); } Append(go_name, sname); String *wname = Swig_name_wrapper(sname); Append(wname, unique_id); Setattr(n, "wrap:name", wname); int r = makeWrappers(n, sname, go_name, NULL, wname, NULL, NULL, type, true); if (r != SWIG_OK) { return r; } String *t = goType(n, type); Printv(f_go_wrappers, "var ", varname, " ", t, " = ", go_name, "()\n", NULL); Delete(varname); Delete(t); Delete(go_name); Delete(sname); return SWIG_OK; } /* ------------------------------------------------------------ * classHandler() * * For a C++ class, in Go we generate both a struct and an * interface. The interface will declare all the class public * methods. We will define all the methods on the struct, so that * the struct meets the interface. We then expect users of the * class to use the interface. * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { class_node = n; List *baselist = Getattr(n, "bases"); bool has_base_classes = baselist && Len(baselist) > 0; String *name = Getattr(n, "sym:name"); String *go_name = exportedName(name); if (!checkNameConflict(go_name, n, NULL)) { Delete(go_name); SetFlag(n, "go:conflict"); return SWIG_NOWRAP; } String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); class_name = name; class_receiver = go_type_name; class_methods = NewHash(); int isdir = GetFlag(n, "feature:director"); int isnodir = GetFlag(n, "feature:nodirector"); bool is_director = isdir && !isnodir; Printv(f_go_wrappers, "type ", go_type_name, " uintptr\n\n", NULL); // A method to return the pointer to the C++ class. This is used // by generated code to convert between the interface and the C++ // value. Printv(f_go_wrappers, "func (p ", go_type_name, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn (uintptr)(p)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); // A method used as a marker for the class, to avoid invalid // interface conversions when using multiple inheritance. Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigIs", go_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); if (is_director) { // Return the interface passed to the NewDirector function. Printv(f_go_wrappers, "func (p ", go_type_name, ") DirectorInterface() interface{} {\n", NULL); Printv(f_go_wrappers, "\treturn nil\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); } // We have seen a definition for this type. Setattr(defined_types, go_name, go_name); Setattr(defined_types, go_type_name, go_type_name); interfaces = NewString(""); int r = Language::classHandler(n); if (r != SWIG_OK) { return r; } if (has_base_classes) { // For each method defined in a base class but not defined in // this class, we need to define the method in this class. We // can't use anonymous field inheritance because it works // differently in Go and in C++. Hash *local = NewHash(); for (Node *ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { if (!is_public(ni)) { continue; } String *type = Getattr(ni, "nodeType"); if (Cmp(type, "constructor") == 0 || Cmp(type, "destructor") == 0) { continue; } String *cname = Getattr(ni, "sym:name"); if (!cname) { cname = Getattr(ni, "name"); } if (cname) { Setattr(local, cname, NewString("")); } } for (Iterator b = First(baselist); b.item; b = Next(b)) { List *bases = NewList(); Append(bases, Getattr(b.item, "classtype")); int r = addBase(n, b.item, bases, local); if (r != SWIG_OK) { return r; } Delete(bases); } Delete(local); Hash *parents = NewHash(); addFirstBaseInterface(n, parents, baselist); int r = addExtraBaseInterfaces(n, parents, baselist); Delete(parents); if (r != SWIG_OK) { return r; } } Printv(f_go_wrappers, "type ", go_name, " interface {\n", NULL); Printv(f_go_wrappers, "\tSwigcptr() uintptr\n", NULL); Printv(f_go_wrappers, "\tSwigIs", go_name, "()\n", NULL); if (is_director) { Printv(f_go_wrappers, "\tDirectorInterface() interface{}\n", NULL); } Append(f_go_wrappers, interfaces); Printv(f_go_wrappers, "}\n\n", NULL); Delete(interfaces); interfaces = NULL; class_name = NULL; class_receiver = NULL; class_node = NULL; Delete(class_methods); class_methods = NULL; Delete(go_type_name); return SWIG_OK; } /* ------------------------------------------------------------ * addBase() * * Implement methods and members defined in a parent class for a * child class. * ------------------------------------------------------------ */ int addBase(Node *n, Node *base, List *bases, Hash *local) { if (GetFlag(base, "feature:ignore")) { return SWIG_OK; } for (Node *ni = Getattr(base, "firstChild"); ni; ni = nextSibling(ni)) { if (GetFlag(ni, "feature:ignore")) { continue; } if (!is_public(ni)) { continue; } String *type = Getattr(ni, "nodeType"); if (Strcmp(type, "constructor") == 0 || Strcmp(type, "destructor") == 0 || Strcmp(type, "enum") == 0 || Strcmp(type, "using") == 0 || Strcmp(type, "classforward") == 0 || Strcmp(type, "template") == 0) { continue; } String *storage = Getattr(ni, "storage"); if (storage && (Strcmp(storage, "typedef") == 0 || Strcmp(storage, "friend") == 0)) { continue; } String *mname = Getattr(ni, "sym:name"); if (!mname) { continue; } String *lname = Getattr(ni, "name"); if (Getattr(class_methods, lname)) { continue; } if (Getattr(local, lname)) { continue; } Setattr(local, lname, NewString("")); String *ty = NewString(Getattr(ni, "type")); SwigType_push(ty, Getattr(ni, "decl")); String *fullty = SwigType_typedef_resolve_all(ty); bool is_function = SwigType_isfunction(fullty) ? true : false; Delete(ty); Delete(fullty); if (is_function) { int r = goBaseMethod(n, bases, ni); if (r != SWIG_OK) { return r; } if (Getattr(ni, "sym:overloaded")) { for (Node *on = Getattr(ni, "sym:nextSibling"); on; on = Getattr(on, "sym:nextSibling")) { r = goBaseMethod(n, bases, on); if (r != SWIG_OK) { return r; } } String *receiver = class_receiver; bool is_static = isStatic(ni); if (is_static) { receiver = NULL; } String *go_name = buildGoName(Getattr(ni, "sym:name"), is_static, false); r = makeDispatchFunction(ni, go_name, receiver, is_static, NULL, false); Delete(go_name); if (r != SWIG_OK) { return r; } } } else { int r = goBaseVariable(n, bases, ni); if (r != SWIG_OK) { return r; } } } List *baselist = Getattr(base, "bases"); if (baselist && Len(baselist) > 0) { for (Iterator b = First(baselist); b.item; b = Next(b)) { List *nb = Copy(bases); Append(nb, Getattr(b.item, "classtype")); int r = addBase(n, b.item, nb, local); Delete(nb); if (r != SWIG_OK) { return r; } } } return SWIG_OK; } /* ------------------------------------------------------------ * goBaseMethod() * * Implement a method defined in a parent class for a child class. * ------------------------------------------------------------ */ int goBaseMethod(Node *method_class, List *bases, Node *method) { String *symname = Getattr(method, "sym:name"); if (!validIdentifier(symname)) { return SWIG_OK; } String *name = NewString(""); Printv(name, Getattr(method_class, "sym:name"), "_", symname, NULL); bool is_static = isStatic(method); String *go_name = buildGoName(name, is_static, false); String *overname = NULL; if (Getattr(method, "sym:overloaded")) { overname = Getattr(method, "sym:overname"); } String *wname = Swig_name_wrapper(name); if (overname) { Append(wname, overname); } Append(wname, unique_id); String *result = NewString(Getattr(method, "type")); SwigType_push(result, Getattr(method, "decl")); if (SwigType_isqualifier(result)) { Delete(SwigType_pop(result)); } Delete(SwigType_pop_function(result)); // If the base method is imported, wrap:action may not be set. Swig_save("goBaseMethod", method, "wrap:name", "wrap:action", "parms", NULL); Setattr(method, "wrap:name", wname); if (!Getattr(method, "wrap:action")) { if (!is_static) { Swig_MethodToFunction(method, getNSpace(), getClassType(), (Getattr(method, "template") ? SmartPointer : Extend | SmartPointer), NULL, false); // Remove any self parameter that was just added. ParmList *parms = Getattr(method, "parms"); if (parms && Getattr(parms, "self")) { parms = CopyParmList(nextSibling(parms)); Setattr(method, "parms", parms); } } else { String *call = Swig_cfunction_call(Getattr(method, "name"), Getattr(method, "parms")); Setattr(method, "wrap:action", Swig_cresult(Getattr(method, "type"), Swig_cresult_name(), call)); } } int r = makeWrappers(method, name, go_name, overname, wname, bases, Getattr(method, "parms"), result, is_static); Swig_restore(method); Delete(result); Delete(go_name); Delete(name); return r; } /* ------------------------------------------------------------ * goBaseVariable() * * Add accessors for a member variable defined in a parent class for * a child class. * ------------------------------------------------------------ */ int goBaseVariable(Node *var_class, List *bases, Node *var) { if (isStatic(var)) { return SWIG_OK; } String *var_name = buildGoName(Getattr(var, "sym:name"), false, false); Swig_save("goBaseVariable", var, "type", "wrap:action", NULL); // For a pointer type we apparently have to wrap in the decl. SwigType *var_type = NewString(Getattr(var, "type")); SwigType_push(var_type, Getattr(var, "decl")); Setattr(var, "type", var_type); SwigType *vt = Copy(var_type); int flags = Extend | SmartPointer | use_naturalvar_mode(var); if (isNonVirtualProtectedAccess(var)) { flags |= CWRAP_ALL_PROTECTED_ACCESS; } // Copied from Swig_wrapped_member_var_type. if (SwigType_isclass(vt)) { if (flags & CWRAP_NATURAL_VAR) { if (CPlusPlus) { if (!SwigType_isconst(vt)) { SwigType_add_qualifier(vt, "const"); } SwigType_add_reference(vt); } } else { SwigType_add_pointer(vt); } } String *mname = Swig_name_member(getNSpace(), Getattr(var_class, "sym:name"), var_name); if (is_assignable(var)) { for (Iterator ki = First(var); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) { Delattr(var, ki.key); } } Swig_save("goBaseVariableSet", var, "name", "sym:name", "type", NULL); String *mname_set = NewString("Set"); Append(mname_set, mname); String *go_name = NewString("Set"); Append(go_name, var_name); Swig_MembersetToFunction(var, class_name, flags); String *wname = Swig_name_wrapper(mname_set); Append(wname, unique_id); ParmList *parms = NewParm(vt, var_name, var); String *result = NewString("void"); int r = makeWrappers(var, mname_set, go_name, NULL, wname, bases, parms, result, false); if (r != SWIG_OK) { return r; } Delete(wname); Delete(parms); Delete(result); Delete(go_name); Delete(mname_set); Swig_restore(var); for (Iterator ki = First(var); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) { Delattr(var, ki.key); } } } Swig_MembergetToFunction(var, class_name, flags); String *mname_get = NewString("Get"); Append(mname_get, mname); String *go_name = NewString("Get"); Append(go_name, var_name); String *wname = Swig_name_wrapper(mname_get); Append(wname, unique_id); int r = makeWrappers(var, mname_get, go_name, NULL, wname, bases, NULL, vt, false); if (r != SWIG_OK) { return r; } Delete(wname); Delete(mname_get); Delete(go_name); Delete(mname); Delete(var_name); Delete(var_type); Delete(vt); Swig_restore(var); return SWIG_OK; } /* ------------------------------------------------------------ * addFirstBaseInterface() * * When a C++ class uses multiple inheritance, we can use the C++ * pointer for the first base class but not for any subsequent base * classes. However, the Go interface will match the interface for * all the base classes. To avoid accidentally treating a class as * a pointer to a base class other than the first one, we use an * isClassname method. This function adds those methods as * required. * * For convenience when using multiple inheritance, we also add * functions to retrieve the base class pointers. * ------------------------------------------------------------ */ void addFirstBaseInterface(Node *n, Hash *parents, List *bases) { if (!bases || Len(bases) == 0) { return; } Iterator b = First(bases); if (!GetFlag(b.item, "feature:ignore")) { String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); String *go_base_name = exportedName(Getattr(b.item, "sym:name")); String *go_base_type = goType(n, Getattr(b.item, "classtypeobj")); String *go_base_type_name = goCPointerType(Getattr(b.item, "classtypeobj"), true); Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigIs", go_base_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigIs", go_base_name, "()\n", NULL); Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigGet", go_base_name, "() ", go_base_type, " {\n", NULL); Printv(f_go_wrappers, "\treturn ", go_base_type_name, "(p.Swigcptr())\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigGet", go_base_name, "() ", go_base_type, "\n", NULL); Setattr(parents, go_base_name, NewString("")); Delete(go_name); Delete(go_type_name); Delete(go_base_type); Delete(go_base_type_name); } addFirstBaseInterface(n, parents, Getattr(b.item, "bases")); } /* ------------------------------------------------------------ * addExtraBaseInterfaces() * * Add functions to retrieve the base class pointers for all base * classes other than the first. * ------------------------------------------------------------ */ int addExtraBaseInterfaces(Node *n, Hash *parents, List *bases) { Iterator b = First(bases); Node *fb = b.item; for (b = Next(b); b.item; b = Next(b)) { if (GetFlag(b.item, "feature:ignore")) { continue; } String *go_base_name = exportedName(Getattr(b.item, "sym:name")); Swig_save("addExtraBaseInterface", n, "wrap:action", "wrap:name", "wrap:parms", NULL); SwigType *type = Copy(Getattr(n, "classtypeobj")); SwigType_add_pointer(type); Parm *parm = NewParm(type, "self", n); Setattr(n, "wrap:parms", parm); String *pn = Swig_cparm_name(parm, 0); String *action = NewString(""); Printv(action, Swig_cresult_name(), " = (", Getattr(b.item, "classtype"), "*)", pn, ";", NULL); Delete(pn); Setattr(n, "wrap:action", action); String *name = Copy(class_name); Append(name, "_SwigGet"); Append(name, go_base_name); String *go_name = NewString("SwigGet"); String *c1 = exportedName(go_base_name); Append(go_name, c1); Delete(c1); String *wname = Swig_name_wrapper(name); Append(wname, unique_id); Setattr(n, "wrap:name", wname); SwigType *result = Copy(Getattr(b.item, "classtypeobj")); SwigType_add_pointer(result); int r = makeWrappers(n, name, go_name, NULL, wname, NULL, parm, result, false); if (r != SWIG_OK) { return r; } Swig_restore(n); Setattr(parents, go_base_name, NewString("")); Delete(go_name); Delete(type); Delete(parm); Delete(action); Delete(result); String *ns = NewString(""); addParentExtraBaseInterfaces(n, parents, b.item, false, ns); Delete(ns); } if (!GetFlag(fb, "feature:ignore")) { String *ns = NewString(""); addParentExtraBaseInterfaces(n, parents, fb, true, ns); Delete(ns); } return SWIG_OK; } /* ------------------------------------------------------------ * addParentExtraBaseInterfaces() * * Add functions to retrieve the base class pointers for all base * classes of parents other than the first base class at each level. * ------------------------------------------------------------ */ void addParentExtraBaseInterfaces(Node *n, Hash *parents, Node *base, bool is_base_first, String *sofar) { List *baselist = Getattr(base, "bases"); if (!baselist || Len(baselist) == 0) { return; } String *go_this_base_name = exportedName(Getattr(base, "sym:name")); String *sf = NewString(""); Printv(sf, sofar, ".SwigGet", go_this_base_name, "()", NULL); Iterator b = First(baselist); if (is_base_first) { if (!b.item) { return; } if (!GetFlag(b.item, "feature:ignore")) { addParentExtraBaseInterfaces(n, parents, b.item, true, sf); } b = Next(b); } String *go_name = buildGoName(Getattr(n, "sym:name"), false, false); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); for (; b.item; b = Next(b)) { if (GetFlag(b.item, "feature:ignore")) { continue; } String *go_base_name = exportedName(Getattr(b.item, "sym:name")); if (!Getattr(parents, go_base_name)) { Printv(f_go_wrappers, "func (p ", go_type_name, ") SwigGet", go_base_name, "() ", go_base_name, " {\n", NULL); Printv(f_go_wrappers, "\treturn p", sf, ".SwigGet", go_base_name, "()\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(interfaces, "\tSwigGet", go_base_name, "() ", go_base_name, "\n", NULL); addParentExtraBaseInterfaces(n, parents, b.item, false, sf); Setattr(parents, go_base_name, NewString("")); } } Delete(go_name); Delete(go_type_name); Delete(go_this_base_name); Delete(sf); } /* ------------------------------------------------------------ * classDirectorInit * * Add support for a director class. * * Virtual inheritance is different in Go and C++. We implement * director classes by defining a new function in Go, * NewDirectorClassname, which takes a empty interface value and * creates an instance of a new child class. The new child class * refers all methods back to Go. The Go code checks whether the * value passed to NewDirectorClassname implements that method; if * it does, it calls it, otherwise it calls back into C++. * ------------------------------------------------------------ */ int classDirectorInit(Node *n) { // Because we use a different function to handle inheritance in // Go, ordinary creations of the object should not create a // director object. Delete(director_ctor_code); director_ctor_code = NewString("$nondirector_new"); class_node = n; String *name = Getattr(n, "sym:name"); assert(!class_name); class_name = name; String *go_name = exportedName(name); String *go_type_name = goCPointerType(Getattr(n, "classtypeobj"), true); assert(!class_receiver); class_receiver = go_type_name; String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, go_name); String *cxx_director_name = NewString("SwigDirector_"); Append(cxx_director_name, name); // The Go type of the director class. Printv(f_go_wrappers, "type ", director_struct_name, " struct {\n", NULL); Printv(f_go_wrappers, "\t", go_type_name, "\n", NULL); Printv(f_go_wrappers, "\tv interface{}\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") Swigcptr() uintptr {\n", NULL); Printv(f_go_wrappers, "\treturn p.", go_type_name, ".Swigcptr()\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") SwigIs", go_name, "() {\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_go_wrappers, "func (p *", director_struct_name, ") DirectorInterface() interface{} {\n", NULL); Printv(f_go_wrappers, "\treturn p.v\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); // Start defining the director class. Printv(f_c_directors_h, "class ", cxx_director_name, " : public ", Getattr(n, "classtype"), "\n", NULL); Printv(f_c_directors_h, "{\n", NULL); Printv(f_c_directors_h, " public:\n", NULL); Delete(director_struct_name); Delete(cxx_director_name); class_methods = NewHash(); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorConstructor * * Emit a constructor for a director class. * ------------------------------------------------------------ */ int classDirectorConstructor(Node *n) { bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } String *go_name = exportedName(name); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); String *cn = exportedName(Getattr(parentNode(n), "sym:name")); String *go_type_name = goCPointerType(Getattr(parentNode(n), "classtypeobj"), true); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); String *fn_name = NewString("_swig_NewDirector"); Append(fn_name, cn); Append(fn_name, go_name); if (!overname && !is_ignored) { if (!checkNameConflict(fn_name, n, NULL)) { return SWIG_NOWRAP; } } String *fn_with_over_name = Copy(fn_name); if (overname) { Append(fn_with_over_name, overname); } String *wname = Swig_name_wrapper(fn_name); if (overname) { Append(wname, overname); } Append(wname, unique_id); Setattr(n, "wrap:name", wname); bool is_static = isStatic(n); Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); DelWrapper(dummy); Swig_typemap_attach_parms("gotype", parms, NULL); Swig_typemap_attach_parms("goin", parms, NULL); Swig_typemap_attach_parms("goargout", parms, NULL); Swig_typemap_attach_parms("imtype", parms, NULL); int parm_count = emit_num_arguments(parms); String *func_name = NewString("NewDirector"); Append(func_name, go_name); String *func_with_over_name = Copy(func_name); if (overname) { Append(func_with_over_name, overname); } SwigType *first_type = NewString("int"); Parm *first_parm = NewParm(first_type, "swig_p", n); set_nextSibling(first_parm, parms); Setattr(first_parm, "lname", "p"); Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Swig_cparm_name(p, i); p = nextParm(p); } if (!is_ignored) { if (cgo_flag) { Printv(f_cgo_comment, "extern uintptr_t ", wname, "(int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_cgo_comment, ");\n", NULL); } else { // Declare the C++ wrapper. if (!gccgo_flag) { Printv(f_go_wrappers, "var ", wname, " unsafe.Pointer\n\n", NULL); } else { Printv(f_go_wrappers, "//extern ", go_prefix, "_", wname, "\n", NULL); } Printv(f_go_wrappers, "func ", fn_with_over_name, "(_swig_director int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", _ ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") (_swig_ret ", go_type_name, ")", NULL); if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_director))\n", NULL); Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } // Write out the Go function that calls the wrapper. Printv(f_go_wrappers, "func ", func_with_over_name, "(v interface{}", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") ", cn, " {\n", NULL); Printv(f_go_wrappers, "\tp := &", director_struct_name, "{0, v}\n", NULL); if (gccgo_flag && !cgo_flag) { Printv(f_go_wrappers, "\tdefer SwigCgocallDone()\n", NULL); Printv(f_go_wrappers, "\tSwigCgocall()\n", NULL); } String *call = NewString(""); Printv(call, "\tp.", class_receiver, " = ", NULL); if (cgo_flag) { Printv(call, go_type_name, "(C.", wname, "(C.int(swigDirectorAdd(p))", NULL); } else { Printv(call, fn_with_over_name, "(swigDirectorAdd(p)", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); String *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, "\n", NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } Delete(ct); } else { Printv(call, ivar, NULL); } p = nextParm(p); } Printv(call, ")", NULL); if (cgo_flag) { Printv(call, ")", NULL); } Printv(f_go_wrappers, call, "\n", NULL); goargout(parms); Printv(f_go_wrappers, "\treturn p\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); SwigType *result = Copy(Getattr(parentNode(n), "classtypeobj")); SwigType_add_pointer(result); Swig_save("classDirectorConstructor", n, "wrap:name", "wrap:action", NULL); String *dwname = Swig_name_wrapper(name); Append(dwname, unique_id); Setattr(n, "wrap:name", dwname); String *action = NewString(""); Printv(action, Swig_cresult_name(), " = new SwigDirector_", class_name, "(", NULL); String *pname = Swig_cparm_name(NULL, 0); Printv(action, pname, NULL); Delete(pname); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *pname = Swig_cparm_name(NULL, i + 1); Printv(action, ", ", NULL); if (SwigType_isreference(Getattr(p, "type"))) { Printv(action, "*", NULL); } Printv(action, pname, NULL); Delete(pname); p = nextParm(p); } Printv(action, ");", NULL); Setattr(n, "wrap:action", action); if (cgo_flag) { cgoWrapperInfo info; info.n = n; info.go_name = func_name; info.overname = overname; info.wname = wname; info.base = NULL; info.parms = first_parm; info.result = result; info.is_static = false; info.receiver = NULL; info.is_constructor = true; info.is_destructor = false; int r = cgoGccWrapper(&info); if (r != SWIG_OK) { return r; } } else if (!gccgo_flag) { int r = gcFunctionWrapper(wname); if (r != SWIG_OK) { return r; } r = gccFunctionWrapper(n, NULL, wname, first_parm, result); if (r != SWIG_OK) { return r; } } else { int r = gccgoFunctionWrapper(n, NULL, wname, first_parm, result); if (r != SWIG_OK) { return r; } } Swig_restore(n); Delete(result); } String *cxx_director_name = NewString("SwigDirector_"); Append(cxx_director_name, class_name); String *decl = Swig_method_decl(NULL, Getattr(n, "decl"), cxx_director_name, first_parm, 0, 0); Printv(f_c_directors_h, " ", decl, ";\n", NULL); Delete(decl); decl = Swig_method_decl(NULL, Getattr(n, "decl"), cxx_director_name, first_parm, 0, 0); Printv(f_c_directors, cxx_director_name, "::", decl, "\n", NULL); Delete(decl); Printv(f_c_directors, " : ", Getattr(parentNode(n), "classtype"), "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_c_directors, ", ", NULL); } String *pn = Getattr(p, "name"); assert(pn); Printv(f_c_directors, pn, NULL); p = nextParm(p); } Printv(f_c_directors, "),\n", NULL); Printv(f_c_directors, " go_val(swig_p), swig_mem(0)\n", NULL); Printv(f_c_directors, "{ }\n\n", NULL); if (Getattr(n, "sym:overloaded") && !Getattr(n, "sym:nextSibling")) { int r = makeDispatchFunction(n, func_name, cn, is_static, Getattr(parentNode(n), "classtypeobj"), false); if (r != SWIG_OK) { return r; } } Delete(cxx_director_name); Delete(go_name); Delete(cn); Delete(go_type_name); Delete(director_struct_name); Delete(fn_name); Delete(fn_with_over_name); Delete(func_name); Delete(func_with_over_name); Delete(wname); Delete(first_type); Delete(first_parm); return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDestructor * * Emit a destructor for a director class. * ------------------------------------------------------------ */ int classDirectorDestructor(Node *n) { if (!is_public(n)) { return SWIG_OK; } bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; if (!is_ignored) { String *fnname = NewString("DeleteDirector"); String *c1 = exportedName(class_name); Append(fnname, c1); Delete(c1); String *wname = Swig_name_wrapper(fnname); Append(wname, unique_id); Setattr(n, "wrap:name", fnname); Swig_DestructorToFunction(n, getNSpace(), getClassType(), CPlusPlus, Extend); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); String *result = NewString("void"); int r = makeWrappers(n, fnname, fnname, NULL, wname, NULL, parms, result, isStatic(n)); if (r != SWIG_OK) { return r; } Delete(result); Delete(fnname); Delete(wname); } // Generate the destructor for the C++ director class. Since the // Go code is keeping a pointer to the C++ object, we need to call // back to the Go code to let it know that the C++ object is gone. String *go_name = NewString("Swiggo_DeleteDirector_"); Append(go_name, class_name); String *cn = exportedName(class_name); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); Printv(f_c_directors_h, " virtual ~SwigDirector_", class_name, "()", NULL); String *throws = buildThrow(n); if (throws) { Printv(f_c_directors_h, " ", throws, NULL); } Printv(f_c_directors_h, ";\n", NULL); String *director_sig = NewString(""); Printv(director_sig, "SwigDirector_", class_name, "::~SwigDirector_", class_name, "()", NULL); if (throws) { Printv(director_sig, " ", throws, NULL); Delete(throws); } Printv(director_sig, "\n", NULL); Printv(director_sig, "{\n", NULL); if (is_ignored) { Printv(f_c_directors, director_sig, NULL); } else { makeDirectorDestructorWrapper(go_name, director_struct_name, director_sig); } Printv(f_c_directors, " delete swig_mem;\n", NULL); Printv(f_c_directors, "}\n\n", NULL); Delete(director_sig); Delete(go_name); Delete(cn); Delete(director_struct_name); return SWIG_OK; } /* ------------------------------------------------------------ * makeDirectorDestructorWrapper * * Emit the function wrapper for the destructor of a director class. * This writes director_sig to f_c_directors and leaves the function * unfinished. * ------------------------------------------------------------ */ void makeDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { if (cgo_flag) { makeCgoDirectorDestructorWrapper(go_name, director_struct_name, director_sig); return; } Printv(f_go_wrappers, "func ", go_name, "(c int) {\n", NULL); if (gccgo_flag) { Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); } Printv(f_go_wrappers, "\tswigDirectorLookup(c).(*", director_struct_name, ").", class_receiver, " = 0\n", NULL); Printv(f_go_wrappers, "\tswigDirectorDelete(c)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); String *wname = NewString("_swiggo_wrap_DeleteDirector_"); Append(wname, class_name); if (!gccgo_flag) { Printv(f_c_directors, "extern \"C\" void ", wname, "(void*, int);\n", NULL); } else { Printv(f_c_directors, "extern \"C\" void ", wname, "(intgo) __asm__(\"", go_prefix, ".", go_name, "\");\n", NULL); } Printv(f_c_directors, director_sig, NULL); if (!gccgo_flag) { Printv(f_c_directors, " struct { intgo p; } SWIGSTRUCTPACKED a;\n", NULL); Printv(f_c_directors, " a.p = go_val;\n", NULL); Printv(f_c_directors, " crosscall2(", wname, ", &a, (int) sizeof a);\n", NULL); Printv(f_gc_wrappers, "#pragma dynexport ", wname, " ", wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma cgo_export_static ", wname, " ", wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); Printv(f_gc_wrappers, "extern void \xc2\xb7", go_name, "();\n", NULL); Printv(f_gc_wrappers, "void\n", NULL); Printv(f_gc_wrappers, wname, "(void *a, int32 n)\n", NULL); Printv(f_gc_wrappers, "{\n", NULL); Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", go_name, ", a, n);\n", NULL); Printv(f_gc_wrappers, "}\n\n", NULL); } else { Printv(f_c_directors, " ", wname, "(go_val);\n", NULL); } Delete(wname); } /* ------------------------------------------------------------ * makeCgoDirectorDestructorWrapper * * When using cgo, emit the function wrapper for the destructor of a * director class. * ------------------------------------------------------------ */ void makeCgoDirectorDestructorWrapper(String *go_name, String *director_struct_name, String *director_sig) { String *wname = Copy(go_name); Append(wname, unique_id); Printv(f_go_wrappers, "//export ", wname, "\n", NULL); Printv(f_go_wrappers, "func ", wname, "(c int) {\n", NULL); Printv(f_go_wrappers, "\tswigDirectorLookup(c).(*", director_struct_name, ").", class_receiver, " = 0\n", NULL); Printv(f_go_wrappers, "\tswigDirectorDelete(c)\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Printv(f_c_directors, "extern \"C\" void ", wname, "(intgo);\n", NULL); Printv(f_c_directors, director_sig, NULL); Printv(f_c_directors, " ", wname, "(go_val);\n", NULL); } /* ------------------------------------------------------------ * classDirectorMethod * * Emit a method for a director class, plus its overloads. * ------------------------------------------------------------ */ int classDirectorMethod(Node *n, Node *parent, String *super) { bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; // We don't need explicit calls. if (GetFlag(n, "explicitcall")) { return SWIG_OK; } String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } bool overloaded = Getattr(n, "sym:overloaded") && !Getattr(n, "explicitcallnode"); if (!overloaded) { int r = oneClassDirectorMethod(n, parent, super); if (r != SWIG_OK) { return r; } } else { // Handle overloaded methods here, because otherwise we will // reject them in the class_methods hash table. We need to use // class_methods so that we correctly handle cases where a // function in one class hides a function of the same name in a // parent class. if (!Getattr(class_methods, name)) { for (Node *on = Getattr(n, "sym:overloaded"); on; on = Getattr(on, "sym:nextSibling")) { // Swig_overload_rank expects wrap:name and wrap:parms to be // set. String *wn = Swig_name_wrapper(Getattr(on, "sym:name")); Append(wn, Getattr(on, "sym:overname")); Append(wn, unique_id); Setattr(on, "wrap:name", wn); Delete(wn); Setattr(on, "wrap:parms", Getattr(on, "parms")); } } int r = oneClassDirectorMethod(n, parent, super); if (r != SWIG_OK) { return r; } if (!Getattr(n, "sym:nextSibling")) { // Last overloaded function Node *on = Getattr(n, "sym:overloaded"); bool is_static = isStatic(on); String *cn = exportedName(Getattr(parent, "sym:name")); String *go_name = buildGoName(name, is_static, false); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); int r = makeDispatchFunction(on, go_name, director_struct_name, is_static, director_struct_name, false); if (r != SWIG_OK) { return r; } if (!GetFlag(n, "abstract")) { String *go_upcall = NewString("Director"); Append(go_upcall, cn); Append(go_upcall, go_name); r = makeDispatchFunction(on, go_upcall, director_struct_name, is_static, director_struct_name, true); if (r != SWIG_OK) { return r; } Delete(go_upcall); } Delete(director_struct_name); Delete(go_name); Delete(cn); } } Setattr(class_methods, name, NewString("")); return SWIG_OK; } /* ------------------------------------------------------------ * oneClassDirectorMethod * * Emit a method for a director class. * ------------------------------------------------------------ */ int oneClassDirectorMethod(Node *n, Node *parent, String *super) { String *symname = Getattr(n, "sym:name"); if (!checkFunctionVisibility(n, parent)) { return SWIG_OK; } bool is_ignored = GetFlag(n, "feature:ignore") ? true : false; bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0); String *name = Getattr(n, "sym:name"); if (!name) { assert(is_ignored); name = Getattr(n, "name"); } String *overname = NULL; if (Getattr(n, "sym:overloaded")) { overname = Getattr(n, "sym:overname"); } String *cn = exportedName(Getattr(parent, "sym:name")); String *go_type_name = goCPointerType(Getattr(parent, "classtypeobj"), true); String *director_struct_name = NewString("_swig_Director"); Append(director_struct_name, cn); bool is_static = isStatic(n); String *go_name = buildGoName(name, is_static, false); ParmList *parms = Getattr(n, "parms"); Setattr(n, "wrap:parms", parms); Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); Swig_typemap_attach_parms("gotype", parms, NULL); Swig_typemap_attach_parms("imtype", parms, NULL); int parm_count = emit_num_arguments(parms); SwigType *result = Getattr(n, "type"); // Save the type for overload processing. Setattr(n, "go:type", result); String *interface_name = NewString("_swig_DirectorInterface"); Append(interface_name, cn); Append(interface_name, go_name); if (overname) { Append(interface_name, overname); } String *callback_name = Copy(director_struct_name); Append(callback_name, "_callback_"); Append(callback_name, name); Replace(callback_name, "_swig", "Swig", DOH_REPLACE_FIRST); if (overname) { Append(callback_name, overname); } if (cgo_flag) { Append(callback_name, unique_id); } String *upcall_name = Copy(director_struct_name); Append(upcall_name, "_upcall_"); Append(upcall_name, go_name); String *upcall_wname = Swig_name_wrapper(upcall_name); if (overname) { Append(upcall_wname, overname); } Append(upcall_wname, unique_id); String *upcall_gc_name = buildGoWrapperName(upcall_name, overname); String *go_with_over_name = Copy(go_name); if (overname) { Append(go_with_over_name, overname); } Parm *p = 0; Wrapper *w = NewWrapper(); Swig_director_parms_fixup(parms); Swig_typemap_attach_parms("directorin", parms, w); Swig_typemap_attach_parms("directorargout", parms, w); Swig_typemap_attach_parms("godirectorin", parms, w); Swig_typemap_attach_parms("goin", parms, dummy); Swig_typemap_attach_parms("goargout", parms, dummy); DelWrapper(dummy); if (!is_ignored) { // We use an interface to see if this method is defined in Go. Printv(f_go_wrappers, "type ", interface_name, " interface {\n", NULL); Printv(f_go_wrappers, "\t", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, "\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); if (!GetFlag(n, "abstract")) { if (cgo_flag) { Printv(f_cgo_comment, "extern ", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_cgo_comment, "void", NULL); } else { bool c_struct_type; String *ret_type = cgoTypeForGoValue(n, result, &c_struct_type); Printv(f_cgo_comment, ret_type, NULL); Delete(ret_type); } Printv(f_cgo_comment, " ", upcall_wname, "(uintptr_t", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); bool c_struct_type; String *ct = cgoTypeForGoValue(p, Getattr(p, "type"), &c_struct_type); Printv(f_cgo_comment, ", ", ct, " ", Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_cgo_comment, ");\n", NULL); } else { // Declare the upcall function, which calls the method on // the parent class. if (!gccgo_flag) { Printv(f_go_wrappers, "var ", upcall_wname, " unsafe.Pointer\n\n", NULL); } else { Printv(f_go_wrappers, "//extern ", go_prefix, "_", upcall_wname, "\n", NULL); } Printv(f_go_wrappers, "func ", upcall_gc_name, "(_swig_ptr ", go_type_name, NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", _ ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goWrapperType(n, result, true); Printv(f_go_wrappers, " (_swig_ret ", tm, ")", NULL); Delete(tm); } if (!gccgo_flag) { Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\t_swig_p := uintptr(unsafe.Pointer(&_swig_ptr))\n", NULL); Printv(f_go_wrappers, "\t_cgo_runtime_cgocall(", upcall_wname, ", _swig_p)\n", NULL); Printv(f_go_wrappers, "\treturn\n", NULL); Printv(f_go_wrappers, "}", NULL); } Printv(f_go_wrappers, "\n\n", NULL); } } // Define the method on the director class in Go. Printv(f_go_wrappers, "func (swig_p *", director_struct_name, ") ", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, " {\n", NULL); Printv(f_go_wrappers, "\tif swig_g, swig_ok := swig_p.v.(", interface_name, "); swig_ok {\n", NULL); Printv(f_go_wrappers, "\t\t", NULL); if (SwigType_type(result) != T_VOID) { Printv(f_go_wrappers, "return ", NULL); } Printv(f_go_wrappers, "swig_g.", go_with_over_name, "(", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(f_go_wrappers, ", ", NULL); } Printv(f_go_wrappers, Getattr(p, "lname"), NULL); p = nextParm(p); } Printv(f_go_wrappers, ")\n", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_go_wrappers, "\t\treturn\n", NULL); } Printv(f_go_wrappers, "\t}\n", NULL); if (GetFlag(n, "abstract")) { Printv(f_go_wrappers, "\tpanic(\"call to pure virtual method\")\n", NULL); } else { String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; bool has_goout = false; String *goout = NULL; if (SwigType_type(result) != T_VOID) { ret_type = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); if (goout) { has_goout = true; } if (cgo_flag) { bool c_struct_type; Delete(cgoTypeForGoValue(n, result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } } } p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (goGetattr(p, "tmap:goargout")) { has_goout = true; } p = nextParm(p); } String *call = NewString(""); if (gccgo_flag && !cgo_flag) { if (has_goout) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = ", NULL); if (cgo_flag) { Printv(call, "(", ret_type, ")(", NULL); } } if (cgo_flag && goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } if (cgo_flag) { Printv(call, "C.", upcall_wname, NULL); } else { Printv(call, upcall_gc_name, NULL); } Printv(call, "(", NULL); if (cgo_flag) { Printv(call, "C.uintptr_t(", NULL); } Printv(call, "swig_p.", go_type_name, NULL); if (cgo_flag) { Printv(call, ")", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); SwigType *pt = Getattr(p, "type"); String *ln = Getattr(p, "lname"); String *ivar = NewStringf("_swig_i_%d", i); // This is an ordinary call from Go to C++, so adjust using // the goin typemap. String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } } else { Printv(call, ivar, NULL); } p = nextParm(p); } Printv(call, ")", NULL); if (gccgo_flag && !cgo_flag && has_goout) { Printv(call, "\n\t}()", NULL); } if (cgo_flag) { if (wt) { // Close the type conversion to the wrapper type. Printv(call, ")", NULL); } if (SwigType_type(result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(call, ")", NULL); } } Printv(call, "\n", NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } goargout(parms); if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } if (ret_type) { Delete(ret_type); } if (wt) { Delete(wt); } } Printv(f_go_wrappers, "}\n\n", NULL); // Define a method in the C++ director class that the C++ upcall // function can call. This permits an upcall to a protected // method. if (!GetFlag(n, "abstract")) { String *upcall_method_name = NewString("_swig_upcall_"); Append(upcall_method_name, name); if (overname) { Append(upcall_method_name, overname); } SwigType *rtype = Getattr(n, "classDirectorMethods:type"); String *upcall_decl = Swig_method_decl(rtype, Getattr(n, "decl"), upcall_method_name, parms, 0, 0); Printv(f_c_directors_h, " ", upcall_decl, " {\n", NULL); Delete(upcall_decl); Printv(f_c_directors_h, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(f_c_directors_h, "return ", NULL); } String *super_call = Swig_method_call(super, parms); Printv(f_c_directors_h, super_call, ";\n", NULL); Delete(super_call); Printv(f_c_directors_h, " }\n", NULL); // Define the C++ function that the Go function calls. SwigType *first_type = NULL; Parm *first_parm = parms; if (!is_static) { first_type = NewString("SwigDirector_"); Append(first_type, class_name); SwigType_add_pointer(first_type); first_parm = NewParm(first_type, "p", n); set_nextSibling(first_parm, parms); } Swig_save("classDirectorMethod", n, "wrap:name", "wrap:action", NULL); Setattr(n, "wrap:name", upcall_wname); String *action = NewString(""); if (SwigType_type(result) != T_VOID) { Printv(action, Swig_cresult_name(), " = (", SwigType_lstr(result, 0), ")", NULL); if (SwigType_isreference(result)) { Printv(action, "&", NULL); } } Printv(action, Swig_cparm_name(NULL, 0), "->", upcall_method_name, "(", NULL); p = parms; int i = 0; while (p != NULL) { if (SwigType_type(Getattr(p, "type")) != T_VOID) { String *pname = Swig_cparm_name(NULL, i + 1); if (i > 0) { Printv(action, ", ", NULL); } // A parameter whose type is a reference is converted into a // pointer type by gcCTypeForGoValue. We are calling a // function which expects a reference so we need to convert // back. if (SwigType_isreference(Getattr(p, "type"))) { Printv(action, "*", NULL); } Printv(action, pname, NULL); Delete(pname); i++; } p = nextSibling(p); } Printv(action, ");", NULL); Setattr(n, "wrap:action", action); if (cgo_flag) { cgoWrapperInfo info; info.n = n; info.go_name = go_name; info.overname = overname; info.wname = upcall_wname; info.base = NULL; info.parms = first_parm; info.result = result; info.is_static = is_static; info.receiver = NULL; info.is_constructor = false; info.is_destructor = false; int r = cgoGccWrapper(&info); if (r != SWIG_OK) { return r; } } else if (!gccgo_flag) { // Write the upcall wrapper function. This is compiled by gc // and calls the C++ function. int r = gcFunctionWrapper(upcall_wname); if (r != SWIG_OK) { return r; } r = gccFunctionWrapper(n, NULL, upcall_wname, first_parm, result); if (r != SWIG_OK) { return r; } } else { int r = gccgoFunctionWrapper(n, NULL, upcall_wname, first_parm, result); if (r != SWIG_OK) { return r; } } Delete(first_type); if (first_parm != parms) { Delete(first_parm); } Swig_restore(n); Delete(upcall_method_name); // Define a function that uses the Go director type that other // methods in the Go type can call to get parent methods. Printv(f_go_wrappers, "func Director", cn, go_with_over_name, "(p ", cn, NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", NULL); String *tm = goType(p, Getattr(p, "type")); Printv(f_go_wrappers, tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ")", NULL); if (SwigType_type(result) != T_VOID) { String *tm = goType(n, result); Printv(f_go_wrappers, " ", tm, NULL); Delete(tm); } Printv(f_go_wrappers, " {\n", NULL); String *ret_type = NULL; bool memcpy_ret = false; String *wt = NULL; String *goout = NULL; if (SwigType_type(result) != T_VOID) { ret_type = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r ", ret_type, "\n", NULL); goout = goTypemapLookup("goout", n, "swig_r"); if (cgo_flag) { bool c_struct_type; Delete(cgoTypeForGoValue(n, result, &c_struct_type)); if (c_struct_type) { memcpy_ret = true; } } } String *call = NewString(""); if (gccgo_flag && !cgo_flag) { if (goout != NULL) { Printv(call, "\tfunc() {\n", NULL); } Printv(call, "\tdefer SwigCgocallDone()\n", NULL); Printv(call, "\tSwigCgocall()\n", NULL); } Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { if (memcpy_ret) { Printv(call, "swig_r_p := ", NULL); } else { Printv(call, "swig_r = ", NULL); if (cgo_flag) { Printv(call, "(", ret_type, ")(", NULL); } } if (cgo_flag && goTypeIsInterface(n, result)) { wt = goWrapperType(n, result, true); Printv(call, "(", wt, ")(", NULL); } } if (cgo_flag) { Printv(call, "C.", upcall_wname, NULL); } else { Printv(call, upcall_gc_name, NULL); } Printv(call, "(", NULL); if (cgo_flag) { Printv(call, "C.uintptr_t(", NULL); } Printv(call, "p.(*", director_struct_name, ").", go_type_name, NULL); if (cgo_flag) { Printv(call, ")", NULL); } p = parms; for (int i = 0; i < parm_count; ++i) { Printv(call, ", ", NULL); p = getParm(p); SwigType *pt = Getattr(p, "type"); String *ivar = NewStringf("_swig_i_%d", i); String *ln = Copy(Getattr(p, "lname")); String *goin = goGetattr(p, "tmap:goin"); if (goin == NULL) { Printv(f_go_wrappers, "\t", ivar, " := ", ln, NULL); if (goTypeIsInterface(p, pt)) { Printv(f_go_wrappers, ".Swigcptr()", NULL); } Printv(f_go_wrappers, "\n", NULL); } else { String *itm = goImType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(f_go_wrappers, goin, NULL); Delete(goin); } Setattr(p, "emit:goinput", ivar); if (cgo_flag) { bool c_struct_type; String *ct = cgoTypeForGoValue(p, pt, &c_struct_type); if (c_struct_type) { Printv(call, "*(*C.", ct, ")(unsafe.Pointer(&", ivar, "))", NULL); } else { Printv(call, "C.", ct, "(", ivar, ")", NULL); } } else { Printv(call, ivar, NULL); } Delete(ln); p = nextParm(p); } Printv(call, ")", NULL); if (gccgo_flag && !cgo_flag && goout != NULL) { Printv(call, "\n\t}()", NULL); } if (cgo_flag) { if (wt) { // Close the type conversion to the wrapper type. Printv(call, ")", NULL); } if (SwigType_type(result) != T_VOID && !memcpy_ret) { // Close the type conversion of the return value. Printv(call, ")", NULL); } } Printv(call, "\n", NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (memcpy_ret) { Printv(f_go_wrappers, "\tswig_r = *(*", ret_type, ")(unsafe.Pointer(&swig_r_p))\n", NULL); } goargout(parms); if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } Printv(f_go_wrappers, "}\n\n", NULL); if (ret_type) { Delete(ret_type); } if (wt) { Delete(wt); } } // The Go function which invokes the method. This is called by // the C++ method on the director class. if (cgo_flag) { Printv(f_go_wrappers, "//export ", callback_name, "\n", NULL); } Printv(f_go_wrappers, "func ", callback_name, "(swig_c int", NULL); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); String *tm = goWrapperType(p, Getattr(p, "type"), false); Printv(f_go_wrappers, ", ", Getattr(p, "lname"), " ", tm, NULL); Delete(tm); p = nextParm(p); } Printv(f_go_wrappers, ") ", NULL); String *result_wrapper = NULL; if (SwigType_type(result) != T_VOID) { result_wrapper = goWrapperType(n, result, true); Printv(f_go_wrappers, "(swig_result ", result_wrapper, ") ", NULL); } Printv(f_go_wrappers, "{\n", NULL); if (is_ignored) { Printv(f_go_wrappers, "\treturn\n", NULL); } else { bool result_is_interface = false; String *goout = NULL; if (SwigType_type(result) != T_VOID) { result_is_interface = goTypeIsInterface(NULL, result); Printv(f_go_wrappers, "\tvar swig_r ", NULL); if (!result_is_interface) { Printv(f_go_wrappers, goType(n, result), NULL); } else { Printv(f_go_wrappers, result_wrapper, NULL); } Printv(f_go_wrappers, "\n", NULL); goout = goTypemapLookup("godirectorout", n, "swig_r"); } String *call = NewString(""); Printv(call, "\t", NULL); if (SwigType_type(result) != T_VOID) { Printv(call, "swig_r = ", NULL); if (result_is_interface) { Printv(call, result_wrapper, "(", NULL); } } Printv(call, "swig_p.", go_with_over_name, "(", NULL); String *goincode = NewString(""); p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (i > 0) { Printv(call, ", ", NULL); } SwigType *pt = Getattr(p, "type"); String *ln = NewString(""); // If the Go representation is an interface type class, then // we are receiving a uintptr, and must convert to the // interface. bool is_interface = goTypeIsInterface(p, pt); if (is_interface) { // Passing is_result as true to goWrapperType gives us the // name of the Go type we need to convert to an interface. String *wt = goWrapperType(p, pt, true); Printv(ln, wt, "(", NULL); Delete(wt); } Printv(ln, Getattr(p, "lname"), NULL); if (is_interface) { Printv(ln, ")", NULL); } String *goin = goGetattr(p, "tmap:godirectorin"); if (goin == NULL) { Printv(call, ln, NULL); } else { String *ivar = NewString(""); Printf(ivar, "_swig_i_%d", i); String *itm = goType(p, pt); Printv(f_go_wrappers, "\tvar ", ivar, " ", itm, "\n", NULL); goin = Copy(goin); Replaceall(goin, "$input", ln); Replaceall(goin, "$result", ivar); Printv(goincode, goin, "\n", NULL); Delete(goin); Printv(call, ivar, NULL); Delete(ivar); } Delete(ln); p = nextParm(p); } Printv(call, ")", NULL); if (result_is_interface) { Printv(call, ".Swigcptr())", NULL); } Printv(call, "\n", NULL); if (gccgo_flag && !cgo_flag) { if (goout != NULL) { Printv(f_go_wrappers, "\tfunc() {\n", NULL); } Printv(f_go_wrappers, "\tSwigCgocallBack()\n", NULL); Printv(f_go_wrappers, "\tdefer SwigCgocallBackDone()\n", NULL); } Printv(f_go_wrappers, "\tswig_p := swigDirectorLookup(swig_c).(*", director_struct_name, ")\n", NULL); Printv(f_go_wrappers, goincode, NULL); Printv(f_go_wrappers, call, NULL); Delete(call); if (gccgo_flag && !cgo_flag && goout != NULL) { Printv(f_go_wrappers, "\t}()\n", NULL); } if (SwigType_type(result) != T_VOID) { if (goout == NULL) { Printv(f_go_wrappers, "\treturn swig_r\n", NULL); } else { String *tm = goImType(n, result); Printv(f_go_wrappers, "\tvar swig_r_1 ", tm, "\n", NULL); Replaceall(goout, "$input", "swig_r"); Replaceall(goout, "$result", "swig_r_1"); Printv(f_go_wrappers, goout, "\n", NULL); Printv(f_go_wrappers, "\treturn swig_r_1\n", NULL); } } } Printv(f_go_wrappers, "}\n\n", NULL); Delete(result_wrapper); Delete(upcall_wname); Delete(upcall_gc_name); Delete(go_with_over_name); } if (!is_ignored || is_pure_virtual) { // Declare the method for the director class. SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); String *decl = Swig_method_decl(rtype, Getattr(n, "decl"), Getattr(n, "name"), parms, 0, 0); Printv(f_c_directors_h, " virtual ", decl, NULL); Delete(decl); String *qname = NewString(""); Printv(qname, "SwigDirector_", class_name, "::", Getattr(n, "name"), NULL); decl = Swig_method_decl(rtype, Getattr(n, "decl"), qname, parms, 0, 0); Printv(w->def, decl, NULL); Delete(decl); Delete(qname); String *throws = buildThrow(n); if (throws) { Printv(f_c_directors_h, " ", throws, NULL); Printv(w->def, " ", throws, NULL); Delete(throws); } Printv(f_c_directors_h, ";\n", NULL); Printv(w->def, " {\n", NULL); if (SwigType_type(result) != T_VOID) { Wrapper_add_local(w, "c_result", SwigType_lstr(result, "c_result")); } if (!is_ignored) { makeDirectorMethodWrapper(n, w, callback_name); } else { assert(is_pure_virtual); Printv(w->code, " _swig_gopanic(\"call to pure virtual function ", Getattr(parent, "sym:name"), name, "\");\n", NULL); if (SwigType_type(result) != T_VOID) { String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); } } Printv(w->code, "}", NULL); Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_c_directors); } Delete(cn); Delete(go_type_name); Delete(director_struct_name); Delete(interface_name); Delete(callback_name); Delete(upcall_name); Delete(go_name); DelWrapper(w); return SWIG_OK; } /* ------------------------------------------------------------ * makeDirectorMethodWrapper * * Emit the function wrapper for a director method. * ------------------------------------------------------------ */ void makeDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { if (cgo_flag) { makeCgoDirectorMethodWrapper(n, w, callback_name); return; } ParmList *parms = Getattr(n, "wrap:parms"); SwigType *result = Getattr(n, "type"); String *callback_wname = Swig_name_wrapper(callback_name); Append(callback_wname, unique_id); if (!gccgo_flag) { Printv(f_c_directors, "extern \"C\" void ", callback_wname, "(void*, int);\n", NULL); } else { Printv(f_c_directors, "extern \"C\" ", NULL); String *fnname = NewString(""); Printv(fnname, callback_wname, "(int", NULL); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *cg = gccgoCTypeForGoValue(p, Getattr(p, "type"), Getattr(p, "lname")); Printv(fnname, ", ", cg, NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } Printv(fnname, ")", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_c_directors, "void ", fnname, NULL); } else { String *tm = gccgoCTypeForGoValue(n, result, fnname); Printv(f_c_directors, tm, NULL); Delete(tm); } Delete(fnname); Printv(f_c_directors, " __asm__(\"", go_prefix, ".", callback_name, "\");\n", NULL); } if (!gccgo_flag) { Printv(w->code, " struct {\n", NULL); Printv(w->code, " intgo go_val;\n", NULL); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *ln = Getattr(p, "lname"); String *cg = gcCTypeForGoValue(p, Getattr(p, "type"), ln); Printv(w->code, " ", cg, ";\n", NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } if (SwigType_type(result) != T_VOID) { Printv(w->code, " long : 0;\n", NULL); String *rname = NewString(Swig_cresult_name()); String *cg = gcCTypeForGoValue(n, result, rname); Printv(w->code, " ", cg, ";\n", NULL); Delete(cg); Delete(rname); } Printv(w->code, " } SWIGSTRUCTPACKED swig_a;\n", NULL); Printv(w->code, " swig_a.go_val = go_val;\n", NULL); p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); String *ln = Getattr(p, "lname"); String *input = NewString(""); Printv(input, "swig_a.", ln, NULL); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Replaceall(tm, "$owner", "0"); Delete(input); Printv(w->code, "\t", tm, "\n", NULL); Delete(tm); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " crosscall2(", callback_wname, ", &swig_a, (int) sizeof swig_a);\n", NULL); /* Marshal outputs */ for (p = parms; p;) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { static const String *swig_a_result = NewStringf("swig_a.%s", Swig_cresult_name()); Replaceall(tm, "$input", swig_a_result); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } // The C wrapper code which calls the Go function. Printv(f_gc_wrappers, "#pragma dynexport ", callback_wname, " ", callback_wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma cgo_export_static ", callback_wname, " ", callback_wname, "\n", NULL); Printv(f_gc_wrappers, "#pragma textflag 7\n", NULL); Printv(f_gc_wrappers, "extern void \xc2\xb7", callback_name, "();\n", NULL); Printv(f_gc_wrappers, "void\n", NULL); Printv(f_gc_wrappers, callback_wname, "(void *a, int32 n)\n", NULL); Printv(f_gc_wrappers, "{\n", NULL); Printv(f_gc_wrappers, "\truntime\xc2\xb7" "cgocallback(\xc2\xb7", callback_name, ", a, n);\n", NULL); Printv(f_gc_wrappers, "}\n\n", NULL); } else { if (SwigType_type(result) != T_VOID) { String *r = NewString(Swig_cresult_name()); String *tm = gccgoCTypeForGoValue(n, result, r); Wrapper_add_local(w, r, tm); Delete(tm); Delete(r); } String *args = NewString(""); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *pn = NewString("g"); Append(pn, Getattr(p, "lname")); Setattr(p, "emit:directorinput", pn); String *tm = gccgoCTypeForGoValue(n, Getattr(p, "type"), pn); Wrapper_add_local(w, pn, tm); Delete(tm); tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", pn); Replaceall(tm, "$owner", 0); Printv(w->code, " ", tm, "\n", NULL); Delete(tm); Printv(args, ", ", pn, NULL); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(w->code, Swig_cresult_name(), " = ", NULL); } Printv(w->code, callback_wname, "(go_val", args, ");\n", NULL); /* Marshal outputs */ for (p = parms; p;) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } } Delete(callback_wname); } /* ------------------------------------------------------------ * makeDirectorMethodWrapper * * Emit the function wrapper for a director method for cgo. * ------------------------------------------------------------ */ void makeCgoDirectorMethodWrapper(Node *n, Wrapper *w, String *callback_name) { ParmList *parms = Getattr(n, "wrap:parms"); SwigType *result = Getattr(n, "type"); Printv(f_c_directors, "extern \"C\" ", NULL); String *fnname = Copy(callback_name); Append(fnname, "(int"); Parm *p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *cg = gcCTypeForGoValue(p, Getattr(p, "type"), Getattr(p, "lname")); Printv(fnname, ", ", cg, NULL); Delete(cg); p = Getattr(p, "tmap:directorin:next"); } Printv(fnname, ")", NULL); if (SwigType_type(result) == T_VOID) { Printv(f_c_directors, "void ", fnname, NULL); } else { String *tm = gcCTypeForGoValue(n, result, fnname); Printv(f_c_directors, tm, NULL); Delete(tm); } Delete(fnname); Printv(f_c_directors, ";\n", NULL); if (SwigType_type(result) != T_VOID) { String *r = NewString(Swig_cresult_name()); String *tm = gcCTypeForGoValue(n, result, r); Wrapper_add_local(w, r, tm); Delete(tm); Delete(r); } String *args = NewString(""); p = parms; while (p) { while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { p = Getattr(p, "tmap:directorin:next"); } String *pn = NewString("swig_"); Append(pn, Getattr(p, "lname")); Setattr(p, "emit:directorinput", pn); String *tm = gcCTypeForGoValue(p, Getattr(p, "type"), pn); Wrapper_add_local(w, pn, tm); Delete(tm); tm = Getattr(p, "tmap:directorin"); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as director method argument\n", SwigType_str(Getattr(p, "type"), 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", pn); Replaceall(tm, "$owner", 0); Printv(w->code, " ", tm, "\n", NULL); Delete(tm); Printv(args, ", ", pn, NULL); } p = Getattr(p, "tmap:directorin:next"); } Printv(w->code, " ", NULL); if (SwigType_type(result) != T_VOID) { Printv(w->code, Swig_cresult_name(), " = ", NULL); } Printv(w->code, callback_name, "(go_val", args, ");\n", NULL); /* Marshal outputs */ for (p = parms; p; ) { String *tm; if ((tm = Getattr(p, "tmap:directorargout"))) { tm = Copy(tm); Replaceall(tm, "$result", "jresult"); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NULL); Delete(tm); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } if (SwigType_type(result) != T_VOID) { String *result_str = NewString("c_result"); String *tm = Swig_typemap_lookup("directorout", n, result_str, NULL); if (!tm) { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use type %s as director method result\n", SwigType_str(result, 0)); } else { tm = Copy(tm); Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$result", "c_result"); Printv(w->code, " ", tm, "\n", NULL); String *retstr = SwigType_rcaststr(result, "c_result"); Printv(w->code, " return ", retstr, ";\n", NULL); Delete(retstr); Delete(tm); } Delete(result_str); } } /* ------------------------------------------------------------ * classDirectorEnd * * Complete support for a director class. * ------------------------------------------------------------ */ int classDirectorEnd(Node *n) { (void) n; Printv(f_c_directors_h, " private:\n", NULL); Printv(f_c_directors_h, " intgo go_val;\n", NULL); Printv(f_c_directors_h, " Swig_memory *swig_mem;\n", NULL); Printv(f_c_directors_h, "};\n\n", NULL); class_name = NULL; class_node = NULL; Delete(class_receiver); class_receiver = NULL; Delete(class_methods); class_methods = NULL; return SWIG_OK; } /* ------------------------------------------------------------ * classDirectorDisown * * I think Go does not require a disown method. * ------------------------------------------------------------ */ int classDirectorDisown(Node *n) { (void) n; return SWIG_OK; } /*---------------------------------------------------------------------- * buildThrow() * * Build and return a throw clause if needed. *--------------------------------------------------------------------*/ String *buildThrow(Node *n) { ParmList *throw_parm_list = Getattr(n, "throws"); if (!throw_parm_list && !Getattr(n, "throw")) return NULL; String *ret = NewString("throw("); if (throw_parm_list) { Swig_typemap_attach_parms("throws", throw_parm_list, NULL); } bool first = true; for (Parm *p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (first) { first = false; } else { Printv(ret, ", ", NULL); } String *s = SwigType_str(Getattr(p, "type"), 0); Printv(ret, s, NULL); Delete(s); } } Printv(ret, ")", NULL); return ret; } /*---------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() * * We don't need to check upcall when calling methods. *--------------------------------------------------------------------*/ bool extraDirectorProtectedCPPMethodsRequired() const { return false; } /*---------------------------------------------------------------------- * makeDispatchFunction * * Make a dispatch function for an overloaded C++ function. The * receiver parameter is the receiver for a method, unless is_upcall * is true. If is_upcall is true, then the receiver parameter is * the type of the first argument to the function. *--------------------------------------------------------------------*/ int makeDispatchFunction(Node *n, String *go_name, String *receiver, bool is_static, SwigType *director_struct, bool is_upcall) { bool is_director = director_struct ? true : false; String *nodetype = Getattr(n, "nodeType"); bool is_constructor = Cmp(nodetype, "constructor") == 0; bool is_destructor = Cmp(nodetype, "destructor") == 0; bool can_use_receiver = (!is_constructor && !is_destructor && !is_upcall); bool use_receiver = (!is_static && can_use_receiver); bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !is_upcall); List *dispatch = Swig_overload_rank(n, false); int nfunc = Len(dispatch); SwigType *all_result; bool mismatch; if (is_constructor) { assert(!is_upcall); if (!is_director) { all_result = Copy(Getattr(class_node, "classtypeobj")); } else { all_result = Copy(director_struct); } mismatch = false; } else { all_result = NULL; mismatch = false; bool any_void = false; for (int i = 0; i < nfunc; ++i) { Node *nn = Getitem(dispatch, i); Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; SwigType *result = Getattr(ni, "go:type"); assert(result); if (SwigType_type(result) == T_VOID) { if (all_result) { mismatch = true; } any_void = true; } else { if (any_void) { mismatch = true; } else if (!all_result) { all_result = Copy(result); } else if (Cmp(result, all_result) != 0) { mismatch = true; } } } if (mismatch) { Delete(all_result); all_result = NULL; } else if (all_result) { ; } else { all_result = NewString("void"); } } Printv(f_go_wrappers, "func ", NULL); if (receiver && use_receiver) { Printv(f_go_wrappers, "(p ", receiver, ") ", NULL); } Printv(f_go_wrappers, go_name, "(", NULL); if (is_director && is_constructor) { Printv(f_go_wrappers, "abi interface{}, ", NULL); assert(!add_to_interface); } if (is_upcall) { Printv(f_go_wrappers, "p *", receiver, ", ", NULL); assert(!add_to_interface); } Printv(f_go_wrappers, "a ...interface{})", NULL); if (add_to_interface) { Printv(interfaces, "\t", go_name, "(a ...interface{})", NULL); } if (mismatch) { Printv(f_go_wrappers, " interface{}", NULL); if (add_to_interface) { Printv(interfaces, " interface{}", NULL); } } else if (all_result && SwigType_type(all_result) != T_VOID) { if (is_director && is_constructor) { Printv(f_go_wrappers, " ", receiver, NULL); if (add_to_interface) { Printv(interfaces, " ", receiver, NULL); } } else { String *tm = goType(n, all_result); Printv(f_go_wrappers, " ", tm, NULL); if (add_to_interface) { Printv(interfaces, " ", tm, NULL); } Delete(tm); } } Printv(f_go_wrappers, " {\n", NULL); if (add_to_interface) { Printv(interfaces, "\n", NULL); } Printv(f_go_wrappers, "\targc := len(a)\n", NULL); for (int i = 0; i < nfunc; ++i) { int fn = 0; Node *nn = Getitem(dispatch, i); Node *ni = Getattr(nn, "directorNode") ? Getattr(nn, "directorNode") : nn; Parm *pi = Getattr(ni, "wrap:parms"); // If we are using a receiver, we want to ignore a leading self // parameter. Because of the way this is called, there may or // may not be a self parameter at this point. if (use_receiver && pi && Getattr(pi, "self")) { pi = getParm(pi); if (pi) { pi = nextParm(pi); } } int num_required = emit_num_required(pi); int num_arguments = emit_num_arguments(pi); bool varargs = emit_isvarargs(pi) ? true : false; if (varargs) { Printf(f_go_wrappers, "\tif argc >= %d {\n", num_required); } else { if (num_required == num_arguments) { Printf(f_go_wrappers, "\tif argc == %d {\n", num_required); } else { Printf(f_go_wrappers, "\tif argc >= %d && argc <= %d {\n", num_required, num_arguments); } } // Build list of collisions with the same number of arguments. List *coll = NewList(); for (int k = i + 1; k < nfunc; ++k) { Node *nnk = Getitem(dispatch, k); Node *nk = Getattr(nnk, "directorNode") ? Getattr(nnk, "directorNode") : nnk; Parm *pk = Getattr(nk, "wrap:parms"); if (use_receiver && pk && Getattr(pk, "self")) { pk = getParm(pk); if (pk) { pk = nextParm(pk); } } int nrk = emit_num_required(pk); int nak = emit_num_arguments(pk); if ((nrk >= num_required && nrk <= num_arguments) || (nak >= num_required && nak <= num_arguments) || (nrk <= num_required && nak >= num_arguments) || (varargs && nrk >= num_required)) { Append(coll, nk); } } int num_braces = 0; if (Len(coll) > 0 && num_arguments > 0) { int j = 0; Parm *pj = pi; while (pj) { pj = getParm(pj); if (!pj) { break; } // If all the overloads have the same type in this position, // we can omit the check. SwigType *tm = goOverloadType(pj, Getattr(pj, "type")); bool emitcheck = false; for (int k = 0; k < Len(coll) && !emitcheck; ++k) { Node *nk = Getitem(coll, k); Parm *pk = Getattr(nk, "wrap:parms"); if (use_receiver && pk && Getattr(pk, "self")) { pk = getParm(pk); if (pk) { pk = nextParm(pk); } } int nak = emit_num_arguments(pk); if (nak <= j) continue; int l = 0; Parm *pl = pk; while (pl && l <= j) { pl = getParm(pl); if (!pl) { break; } if (l == j) { SwigType *tml = goOverloadType(pl, Getattr(pl, "type")); if (Cmp(tm, tml) != 0) { emitcheck = true; } Delete(tml); } pl = nextParm(pl); ++l; } } if (emitcheck) { if (j >= num_required) { Printf(f_go_wrappers, "\t\tif argc > %d {\n", j); ++num_braces; } fn = i + 1; Printf(f_go_wrappers, "\t\tif _, ok := a[%d].(%s); !ok {\n", j, tm); Printf(f_go_wrappers, "\t\t\tgoto check_%d\n", fn); Printv(f_go_wrappers, "\t\t}\n", NULL); } Delete(tm); pj = nextParm(pj); ++j; } } for (; num_braces > 0; --num_braces) { Printv(f_go_wrappers, "\t\t}\n", NULL); } // We may need to generate multiple calls if there are variable // argument lists involved. Build the start of the call. String *start = NewString(""); SwigType *result = Getattr(ni, "go:type"); if (is_constructor) { result = all_result; } else if (is_destructor) { result = NULL; } if (result && SwigType_type(result) != T_VOID && (!all_result || SwigType_type(all_result) != T_VOID)) { Printv(start, "return ", NULL); } bool advance_parm = false; if (receiver && use_receiver) { Printv(start, "p.", go_name, NULL); } else if (can_use_receiver && !isStatic(ni) && pi && Getattr(pi, "self")) { // This is an overload of a static function and a non-static // function. assert(num_required > 0); SwigType *tm = goWrapperType(pi, Getattr(pi, "type"), true); String *nm = buildGoName(Getattr(ni, "sym:name"), false, isFriend(ni)); Printv(start, "a[0].(", tm, ").", nm, NULL); Delete(nm); Delete(tm); advance_parm = true; } else { Printv(start, go_name, NULL); } Printv(start, Getattr(ni, "sym:overname"), "(", NULL); bool need_comma = false; if (is_director && is_constructor) { Printv(start, "abi", NULL); need_comma = true; } if (is_upcall) { Printv(start, "p", NULL); need_comma = true; } Parm *p = pi; int pn = 0; if (advance_parm) { p = getParm(p); if (p) { p = nextParm(p); } ++pn; } while (pn < num_required) { p = getParm(p); if (need_comma) { Printv(start, ", ", NULL); } SwigType *tm = goType(p, Getattr(p, "type")); Printf(start, "a[%d].(%s)", pn, tm); Delete(tm); need_comma = true; ++pn; p = nextParm(p); } String *end = NULL; if (!result || SwigType_type(result) == T_VOID || (all_result && SwigType_type(all_result) == T_VOID)) { end = NewString(""); Printv(end, "return", NULL); if (!all_result || SwigType_type(all_result) != T_VOID) { Printv(end, " 0", NULL); } } if (num_required == num_arguments) { Printv(f_go_wrappers, "\t\t", start, ")\n", NULL); if (end) { Printv(f_go_wrappers, "\t\t", end, "\n", NULL); } } else { Printv(f_go_wrappers, "\t\tswitch argc {\n", NULL); for (int j = num_required; j <= num_arguments; ++j) { Printf(f_go_wrappers, "\t\tcase %d:\n", j); Printv(f_go_wrappers, "\t\t\t", start, NULL); bool nc = need_comma; for (int k = num_required; k < j; ++k) { if (nc) { Printv(f_go_wrappers, ", ", NULL); } Printf(f_go_wrappers, "a[%d]", k); nc = true; } Printv(f_go_wrappers, ")\n", NULL); if (end) { Printv(f_go_wrappers, "\t\t\t", end, "\n", NULL); } } Printv(f_go_wrappers, "\t\t}\n", NULL); } Printv(f_go_wrappers, "\t}\n", NULL); if (fn != 0) { Printf(f_go_wrappers, "check_%d:\n", fn); } Delete(coll); } Printv(f_go_wrappers, "\tpanic(\"No match for overloaded function call\")\n", NULL); Printv(f_go_wrappers, "}\n\n", NULL); Delete(all_result); Delete(dispatch); return SWIG_OK; } /* ---------------------------------------------------------------------- * checkFunctionVisibility() * * Return true if we should write out a function based on its * visibility, false otherwise. * ---------------------------------------------------------------------- */ bool checkFunctionVisibility(Node *n, Node *parent) { // Write out a public function. if (is_public(n)) return true; // Don't write out a private function. if (is_private(n)) return false; // Write a protected function for a director class in // dirprot_mode. if (parent == NULL) { return false; } if (dirprot_mode() && Swig_directorclass(parent)) return true; // Otherwise don't write out a protected function. return false; } /* ---------------------------------------------------------------------- * exportedName() * * Given a C/C++ name, return a name in Go which will be exported. * If the first character is an upper case letter, this returns a * copy of its argment. If the first character is a lower case * letter, this forces it to upper case. Otherwise, this prepends * 'X'. * ---------------------------------------------------------------------- */ String *exportedName(String *name) { String *copy = Copy(name); char c = *Char(copy); if (islower(c)) { char l[2]; char u[2]; l[0] = c; l[1] = '\0'; u[0] = toupper(c); u[1] = '\0'; Replace(copy, l, u, DOH_REPLACE_FIRST); } else if (!isalpha(c)) { char l[2]; char u[3]; l[0] = c; l[1] = '\0'; u[0] = 'X'; u[1] = c; u[2] = '\0'; Replace(copy, l, u, DOH_REPLACE_FIRST); } String *ret = Swig_name_mangle(copy); Delete(copy); return ret; } /* ---------------------------------------------------------------------- * removeClassname() * * If the name starts with the current class name, followed by an * underscore, remove it. If there is no current class name, this * simply returns a copy of the name. This undoes Swig's way of * recording the class name in a member name. * ---------------------------------------------------------------------- */ String *removeClassname(String *name) { String *copy = Copy(name); if (class_name) { char *p = Char(name); if (Strncmp(name, class_name, Len(class_name)) == 0 && p[Len(class_name)] == '_') { Replace(copy, class_name, "", DOH_REPLACE_FIRST); Replace(copy, "_", "", DOH_REPLACE_FIRST); } } return copy; } /* ---------------------------------------------------------------------- * buildGoName() * * Build the name to use for an ordinary function, variable, or * whatever in Go. The name argument is something like the sym:name * attribute of the node. If is_static is false, this could be a * method, and the returned name will be the name of the * method--i.e., it will not include the class name. * ---------------------------------------------------------------------- */ String *buildGoName(String *name, bool is_static, bool is_friend) { String *nw = NewString(""); if (is_static && !is_friend && class_name) { String *c1 = exportedName(class_name); Append(nw, c1); Delete(c1); } String *c2 = removeClassname(name); String *c3 = exportedName(c2); Append(nw, c3); Delete(c2); Delete(c3); String *ret = Swig_name_mangle(nw); Delete(nw); return ret; } /* ---------------------------------------------------------------------- * buildGoWrapperName() * * Build the name to use for a Go wrapper function. This is a * function called by the real Go function in order to convert C++ * classes from interfaces to pointers, and other such conversions * between the Go type and the C++ type. * ---------------------------------------------------------------------- */ String *buildGoWrapperName(String *name, String *overname) { String *s1 = NewString("_swig_wrap_"); Append(s1, name); String *s2 = Swig_name_mangle(s1); Delete(s1); if (overname) { Append(s2, overname); } return s2; } /* ---------------------------------------------------------------------- * checkNameConflict() * * Check for a name conflict on the name we are going to use in Go. * These conflicts are likely because of the enforced * capitalization. When we find one, issue a warning and return * false. If the name is OK, return true. * ---------------------------------------------------------------------- */ bool checkNameConflict(String* name, Node* n, const_String_or_char_ptr scope) { Node *lk = symbolLookup(name, scope); if (lk) { String *n1 = Getattr(n, "sym:name"); if (!n1) { n1 = Getattr(n, "name"); } String *n2 = Getattr(lk, "sym:name"); if (!n2) { n2 = Getattr(lk, "name"); } Swig_warning(WARN_GO_NAME_CONFLICT, input_file, line_number, "Ignoring '%s' due to Go name ('%s') conflict with '%s'\n", n1, name, n2); return false; } bool r = addSymbol(name, n, scope) ? true : false; assert(r); return true; } /* ---------------------------------------------------------------------- * checkIgnoredParameters() * * If any of the parameters of this function, or the return type, * are ignored due to a name conflict, give a warning and return * false. * ---------------------------------------------------------------------- */ bool checkIgnoredParameters(Node *n, String *go_name) { ParmList *parms = Getattr(n, "parms"); if (parms) { Wrapper *dummy = NewWrapper(); emit_attach_parmmaps(parms, dummy); int parm_count = emit_num_arguments(parms); Parm *p = parms; for (int i = 0; i < parm_count; ++i) { p = getParm(p); if (!checkIgnoredType(n, go_name, Getattr(p, "type"))) { DelWrapper(dummy); return false; } p = nextParm(p); } DelWrapper(dummy); } if (!checkIgnoredType(n, go_name, Getattr(n, "type"))) { return false; } return true; } /* ---------------------------------------------------------------------- * checkIgnoredType() * * If this type is being ignored due to a name conflict, give a * warning and return false. * ---------------------------------------------------------------------- */ bool checkIgnoredType(Node *n, String *go_name, SwigType *type) { if (hasGoTypemap(n, type)) { return true; } SwigType *t = SwigType_typedef_resolve_all(type); bool ret = true; bool is_conflict = false; Node *e = Language::enumLookup(t); if (e) { if (GetFlag(e, "go:conflict")) { is_conflict = true; } } else if (SwigType_issimple(t)) { Node *cn = classLookup(t); if (cn) { if (GetFlag(cn, "go:conflict")) { is_conflict = true; } } } else if (SwigType_ispointer(t) || SwigType_isarray(t) || SwigType_isqualifier(t) || SwigType_isreference(t)) { SwigType *r = Copy(t); if (SwigType_ispointer(r)) { SwigType_del_pointer(r); } else if (SwigType_isarray(r)) { SwigType_del_array(r); } else if (SwigType_isqualifier(r)) { SwigType_del_qualifier(r); } else { SwigType_del_reference(r); } if (!checkIgnoredType(n, go_name, r)) { ret = false; } Delete(r); } if (is_conflict) { String *s = SwigType_str(t, NULL); Swig_warning(WARN_GO_NAME_CONFLICT, input_file, line_number, "Ignoring '%s' (Go name '%s') due to Go name conflict for parameter or result type '%s'\n", Getattr(n, "name"), go_name, s); Delete(s); ret = false; } Delete(t); return ret; } /* ---------------------------------------------------------------------- * goType() * * Given a SWIG type, return a string for the type in Go. * ---------------------------------------------------------------------- */ String *goType(Node *n, SwigType *type) { return goTypeWithInfo(n, type, false, NULL); } /* ---------------------------------------------------------------------- * goImType() * * Given a SWIG type, return a string for the intermediate Go type * to pass to C/C++. This is like goType except that it looks for * an imtype typemap entry first. * ---------------------------------------------------------------------- */ String *goImType(Node *n, SwigType *type) { return goTypeWithInfo(n, type, true, NULL); } /* ---------------------------------------------------------------------- * goTypeWithInfo() * * Like goType, but return some more information. * * If use_imtype is true, this look for a imtype typemap entry. * * If the p_is_interface parameter is not NULL, this sets * *p_is_interface to indicate whether this type is going to be * represented by a Go interface type. These are cases where the Go * code needs to make some adjustments when passing values back and * forth with C/C++. * ---------------------------------------------------------------------- */ String *goTypeWithInfo(Node *n, SwigType *type, bool use_imtype, bool *p_is_interface) { if (p_is_interface) { *p_is_interface = false; } String *ret = NULL; if (use_imtype) { if (n && Cmp(type, Getattr(n, "type")) == 0) { if (Strcmp(Getattr(n, "nodeType"), "parm") == 0) { ret = Getattr(n, "tmap:imtype"); } if (!ret) { ret = Swig_typemap_lookup("imtype", n, "", NULL); } } else { Parm *p = NewParm(type, "goImType", n); ret = Swig_typemap_lookup("imtype", p, "", NULL); Delete(p); } } if (!ret) { if (n && Cmp(type, Getattr(n, "type")) == 0) { if (Strcmp(Getattr(n, "nodeType"), "parm") == 0) { ret = Getattr(n, "tmap:gotype"); } if (!ret) { ret = Swig_typemap_lookup("gotype", n, "", NULL); } } else { Parm *p = NewParm(type, "goType", n); ret = Swig_typemap_lookup("gotype", p, "", NULL); Delete(p); } } if (ret && Strstr(ret, "$gotypename") != 0) { ret = NULL; } if (ret) { return Copy(ret); } SwigType *t = SwigType_typedef_resolve_all(type); if (SwigType_isenum(t)) { Node *e = Language::enumLookup(t); if (e) { ret = goEnumName(e); } else if (Strcmp(t, "enum ") == 0) { ret = NewString("int"); } else { // An unknown enum - one that has not been parsed (neither a C enum forward reference nor a definition) or an ignored enum String *tt = Copy(t); Replace(tt, "enum ", "", DOH_REPLACE_ANY); ret = exportedName(tt); Setattr(undefined_enum_types, t, ret); Delete(tt); } } else if (SwigType_isfunctionpointer(type) || SwigType_isfunction(type)) { ret = NewString("_swig_fnptr"); } else if (SwigType_ismemberpointer(type)) { ret = NewString("_swig_memberptr"); } else if (SwigType_issimple(t)) { Node *cn = classLookup(t); if (cn) { ret = Getattr(cn, "sym:name"); if (!ret) { ret = Getattr(cn, "name"); } ret = exportedName(ret); Node *cnmod = Getattr(cn, "module"); if (!cnmod || Strcmp(Getattr(cnmod, "name"), module) == 0) { Setattr(undefined_types, t, t); } else { String *nw = NewString(""); Printv(nw, getModuleName(Getattr(cnmod, "name")), ".", ret, NULL); Delete(ret); ret = nw; } } else { // SWIG does not know about this type. ret = exportedName(t); Setattr(undefined_types, t, t); } if (p_is_interface) { *p_is_interface = true; } } else if (SwigType_ispointer(t) || SwigType_isarray(t)) { SwigType *r = Copy(t); if (SwigType_ispointer(r)) { SwigType_del_pointer(r); } else { SwigType_del_array(r); } if (SwigType_type(r) == T_VOID) { ret = NewString("uintptr"); } else { bool is_interface; String *base = goTypeWithInfo(n, r, false, &is_interface); // At the Go level, an unknown or class type is handled as an // interface wrapping a pointer. This means that if a // function returns the C type X, we will be wrapping the C // type X*. In Go we will call that type X. That means that // if a C function expects X*, we can pass the Go type X. And // that means that when we see the C type X*, we should use // the Go type X. // The is_interface variable tells us this. However, it will // be true both for the case of X and for the case of X*. If // r is a pointer here, then we are looking at X**. There is // really no good way for us to handle that. bool is_pointer_to_pointer = false; if (is_interface) { SwigType *c = Copy(r); if (SwigType_isqualifier(c)) { SwigType_del_qualifier(c); if (SwigType_ispointer(c) || SwigType_isarray(c)) { is_pointer_to_pointer = true; } } Delete(c); } if (is_interface) { if (!is_pointer_to_pointer) { ret = base; if (p_is_interface) { *p_is_interface = true; } } else { ret = NewString("uintptr"); } } else { ret = NewString("*"); Append(ret, base); Delete(base); } } Delete(r); } else if (SwigType_isreference(t)) { SwigType *r = Copy(t); SwigType_del_reference(r); // If this is a const reference, and we are looking at a pointer // to it, then we just use the pointer we already have. bool add_pointer = true; if (SwigType_isqualifier(r)) { String *q = SwigType_parm(r); if (Strcmp(q, "const") == 0) { SwigType *c = Copy(r); SwigType_del_qualifier(c); if (SwigType_ispointer(c)) { add_pointer = false; } Delete(c); } } if (add_pointer) { SwigType_add_pointer(r); } ret = goTypeWithInfo(n, r, false, p_is_interface); Delete(r); } else if (SwigType_isqualifier(t)) { SwigType *r = Copy(t); SwigType_del_qualifier(r); ret = goTypeWithInfo(n, r, false, p_is_interface); Delete(r); } else if (SwigType_isvarargs(t)) { ret = NewString("[]interface{}"); } Delete(t); if (!ret) { Swig_warning(WARN_LANG_NATIVE_UNIMPL, input_file, line_number, "No Go typemap defined for %s\n", SwigType_str(type, 0)); ret = NewString("uintptr"); } return ret; } /* ---------------------------------------------------------------------- * cgoTypeForGoValue() * * Given a SWIG type, return a string for the C type to use for the * cgo wrapper code. This always returns a simple identifier, since * it is used in Go code as C.name. * * This sets *c_struct_type if the C type uses a struct where the Go * type uses a simple type. This is true for strings and slices. * When this is true the Go code has to jump through unsafe hoops to * pass the type checker. * ---------------------------------------------------------------------- */ String *cgoTypeForGoValue(Node *n, SwigType *type, bool *c_struct_type) { *c_struct_type = false; bool is_interface; String *go_type = goTypeWithInfo(n, type, true, &is_interface); if (is_interface) { Delete(go_type); return NewString("uintptr_t"); } if (Strcmp(go_type, "uintptr") == 0) { Delete(go_type); return NewString("uintptr_t"); } if (((char*)Char(go_type))[0] == '*') { // Treat all pointers as void*. There is no meaningful type // checking going on here anyhow, and that lets us avoid // worrying about defining the base type of the pointer. Delete(go_type); return NewString("swig_voidp"); } // Check for some Go types that are really pointers under the covers. bool is_hidden_pointer = Strncmp(go_type, "func(", 5) == 0 || Strncmp(go_type, "map[", 4) == 0 || Strncmp(go_type, "chan ", 5) == 0; Delete(go_type); String *ct = Getattr(n, "emit:cgotype"); if (ct) { *c_struct_type = Getattr(n, "emit:cgotypestruct") ? true : false; return Copy(ct); } String *t = Copy(type); if (SwigType_isarray(t)) { SwigType_del_array(t); SwigType_add_pointer(t); } bool add_typedef = true; static int count; ++count; ct = NewStringf("swig_type_%d", count); String *gct = gcCTypeForGoValue(n, t, ct); Delete(t); if (Strncmp(gct, "_gostring_", 10) == 0 || Strncmp(gct, "_goslice_", 9) == 0) { *c_struct_type = true; Setattr(n, "emit:cgotypestruct", type); } else { char *p = Strstr(gct, ct); if (p != NULL && p > (char*)Char(gct) && p[-1] == '*' && p[Len(ct)] == '\0') { // Treat all pointers as void*. See above. Delete(ct); --count; ct = NewString("swig_voidp"); add_typedef = false; if (is_hidden_pointer) { // A Go type that is really a pointer, like func, map, chan, // is being represented in C by a pointer. This is fine, // but we have to memcpy the type rather than simply // converting it. *c_struct_type = true; Setattr(n, "emit:cgotypestruct", type); } } if (Strncmp(gct, "bool ", 5) == 0) { // Change the C++ type bool to the C type _Bool. Replace(gct, "bool", "_Bool", DOH_REPLACE_FIRST); } if (Strncmp(gct, "intgo ", 6) == 0) { // We #define intgo to swig_intgo for the cgo comment. Replace(gct, "intgo", "swig_intgo", DOH_REPLACE_FIRST); } p = Strstr(gct, ct); if (p != NULL && p > (char*)Char(gct) && p[-1] == ' ' && p[Len(ct)] == '\0') { String *q = NewStringWithSize(gct, Len(gct) - Len(ct) - 1); if (validIdentifier(q)) { // This is a simple type name, and we can use it directly. Delete(ct); --count; ct = q; add_typedef = false; } } } if (add_typedef) { Printv(f_cgo_comment_typedefs, "typedef ", gct, ";\n", NULL); } Setattr(n, "emit:cgotype", ct); Delete(gct); return Copy(ct); } /* ---------------------------------------------------------------------- * goWrapperType() * * Given a type, return a string for the type to use for the wrapped * Go function. This function exists because for a C++ class we * need to convert interface and reference types. * ---------------------------------------------------------------------- */ String *goWrapperType(Node *n, SwigType *type, bool is_result) { bool is_interface; String *ret = goTypeWithInfo(n, type, true, &is_interface); // If this is an interface, we want to pass the real type. if (is_interface) { Delete(ret); if (!is_result) { ret = NewString("uintptr"); } else { SwigType *ty = SwigType_typedef_resolve_all(type); while (true) { if (SwigType_ispointer(ty)) { SwigType_del_pointer(ty); } else if (SwigType_isarray(ty)) { SwigType_del_array(ty); } else if (SwigType_isreference(ty)) { SwigType_del_reference(ty); } else if (SwigType_isqualifier(ty)) { SwigType_del_qualifier(ty); } else { break; } } assert(SwigType_issimple(ty)); String *p = goCPointerType(ty, true); Delete(ty); ret = p; } } return ret; } /* ---------------------------------------------------------------------- * goOverloadType() * * Given a type, return the Go type to use when dispatching of * overloaded functions. This is normally just the usual Go type. * However, for a C++ class, the usual Go type is an interface type. * And if that interface type represents a C++ type that SWIG does * not know about, then the interface type generated for any C++ * class will match that interface. So for that case, we match on * the underlying integer type. * * It has to work this way so that we can handle a derived type of a * %ignore'd type. It's unlikely that anybody will have a value of * an undefined type, but we support it because it worked in the * past. * ---------------------------------------------------------------------- */ String *goOverloadType(Node *n, SwigType *type) { SwigType *ty = SwigType_typedef_resolve_all(type); while (true) { if (SwigType_ispointer(ty)) { SwigType_del_pointer(ty); } else if (SwigType_isarray(ty)) { SwigType_del_array(ty); } else if (SwigType_isreference(ty)) { SwigType_del_reference(ty); } else if (SwigType_isqualifier(ty)) { SwigType_del_qualifier(ty); } else { break; } } if (Getattr(undefined_types, ty) && !Getattr(defined_types, ty)) { return goWrapperType(n, type, true); } return goType(n, type); } /* ---------------------------------------------------------------------- * goCPointerType() * * Return the name of the Go type to use for the C pointer value. * The regular C type is the name of an interface type which wraps a * pointer whose name is returned by this function. * ---------------------------------------------------------------------- */ String *goCPointerType(SwigType *type, bool add_to_hash) { SwigType *ty = SwigType_typedef_resolve_all(type); Node *cn = classLookup(ty); String *ex; String *ret; if (!cn) { if (add_to_hash) { Setattr(undefined_types, ty, ty); } ret = NewString("Swigcptr"); ex = exportedName(ty); Append(ret, ex); } else { String *cname = Getattr(cn, "sym:name"); if (!cname) { cname = Getattr(cn, "name"); } ex = exportedName(cname); Node *cnmod = Getattr(cn, "module"); if (!cnmod || Strcmp(Getattr(cnmod, "name"), module) == 0) { if (add_to_hash) { Setattr(undefined_types, ty, ty); } ret = NewString("Swigcptr"); Append(ret, ex); } else { ret = NewString(""); Printv(ret, getModuleName(Getattr(cnmod, "name")), ".Swigcptr", ex, NULL); } } Delete(ty); Delete(ex); return ret; } /* ---------------------------------------------------------------------- * gcCTypeForGoValue() * * Given a type, return the C/C++ type which will be used to catch * the value in Go. This is the 6g/8g version. * ---------------------------------------------------------------------- */ String *gcCTypeForGoValue(Node *n, SwigType *type, String *name) { bool is_interface; String *gt = goTypeWithInfo(n, type, true, &is_interface); String *tail = NewString(""); SwigType *t = SwigType_typedef_resolve_all(type); if (!SwigType_isreference(t)) { while (Strncmp(gt, "*", 1) == 0) { Replace(gt, "*", "", DOH_REPLACE_FIRST); Printv(tail, "*", NULL); } } Delete(t); bool is_string = Strcmp(gt, "string") == 0; bool is_slice = Strncmp(gt, "[]", 2) == 0; bool is_function = Strcmp(gt, "_swig_fnptr") == 0; bool is_member = Strcmp(gt, "_swig_memberptr") == 0; bool is_complex64 = Strcmp(gt, "complex64") == 0; bool is_complex128 = Strcmp(gt, "complex128") == 0; bool is_bool = false; bool is_int8 = false; bool is_int16 = false; bool is_int = Strcmp(gt, "int") == 0 || Strcmp(gt, "uint") == 0; bool is_int32 = false; bool is_int64 = false; bool is_float32 = false; bool is_float64 = false; bool has_typemap = (n != NULL && Getattr(n, "tmap:gotype") != NULL) || hasGoTypemap(n, type); if (has_typemap) { is_bool = Strcmp(gt, "bool") == 0; is_int8 = Strcmp(gt, "int8") == 0 || Strcmp(gt, "uint8") == 0 || Strcmp(gt, "byte") == 0; is_int16 = Strcmp(gt, "int16") == 0 || Strcmp(gt, "uint16") == 0; is_int32 = Strcmp(gt, "int32") == 0 || Strcmp(gt, "uint32") == 0; is_int64 = Strcmp(gt, "int64") == 0 || Strcmp(gt, "uint64") == 0; is_float32 = Strcmp(gt, "float32") == 0; is_float64 = Strcmp(gt, "float64") == 0; } Delete(gt); String *ret; if (is_string) { // Note that we don't turn a reference to a string into a // pointer to a string. Strings are immutable anyhow. ret = NewString(""); Printv(ret, "_gostring_", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_slice) { // Slices are always passed as a _goslice_, whether or not references // are involved. ret = NewString(""); Printv(ret, "_goslice_", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_function || is_member) { ret = NewString(""); Printv(ret, "void*", tail, " ", name, NULL); Delete(tail); return ret; } else if (is_complex64) { ret = NewString("_Complex float "); } else if (is_complex128) { ret = NewString("_Complex double "); } else if (is_interface) { SwigType *t = SwigType_typedef_resolve_all(type); if (SwigType_ispointer(t)) { SwigType_del_pointer(t); } if (SwigType_isreference(t)) { SwigType_del_reference(t); } SwigType_add_pointer(t); ret = SwigType_lstr(t, name); Delete(t); Delete(tail); return ret; } else { SwigType *t = SwigType_typedef_resolve_all(type); if (!has_typemap && SwigType_isreference(t)) { // A const reference to a known type, or to a pointer, is not // mapped to a pointer. SwigType_del_reference(t); if (SwigType_isqualifier(t)) { String *q = SwigType_parm(t); if (Strcmp(q, "const") == 0) { SwigType_del_qualifier(t); if (hasGoTypemap(n, t) || SwigType_ispointer(t)) { if (is_int) { ret = NewString("intgo "); Append(ret, name); } else if (is_int64) { ret = NewString("long long "); Append(ret, name); } else { ret = SwigType_lstr(t, name); } Delete(q); Delete(t); Delete(tail); return ret; } } Delete(q); } } if (Language::enumLookup(t) != NULL) { is_int = true; } else { SwigType *tstripped = SwigType_strip_qualifiers(t); if (SwigType_isenum(tstripped)) is_int = true; Delete(tstripped); } Delete(t); if (is_bool) { ret = NewString("bool "); } else if (is_int8) { ret = NewString("char "); } else if (is_int16) { ret = NewString("short "); } else if (is_int) { ret = NewString("intgo "); } else if (is_int32) { ret = NewString("int "); } else if (is_int64) { ret = NewString("long long "); } else if (is_float32) { ret = NewString("float "); } else if (is_float64) { ret = NewString("double "); } else { Delete(tail); return SwigType_lstr(type, name); } } Append(ret, tail); if (!has_typemap && SwigType_isreference(type)) { Append(ret, "* "); } Append(ret, name); Delete(tail); return ret; } /* ---------------------------------------------------------------------- * gccgoCTypeForGoValue() * * Given a type, return the C/C++ type which will be used to catch * the value in Go. This is the gccgo version. * ---------------------------------------------------------------------- */ String *gccgoCTypeForGoValue(Node *n, SwigType *type, String *name) { return gcCTypeForGoValue(n, type, name); } /* ---------------------------------------------------------------------- * goTypeIsInterface * * Return whether this C++ type is represented as an interface type * in Go. These types require adjustments in the Go code when * passing them back and forth between Go and C++. * ---------------------------------------------------------------------- */ bool goTypeIsInterface(Node *n, SwigType *type) { bool is_interface; Delete(goTypeWithInfo(n, type, false, &is_interface)); return is_interface; } /* ---------------------------------------------------------------------- * hasGoTypemap * * Return whether a type has a "gotype" typemap entry. * ---------------------------------------------------------------------- */ bool hasGoTypemap(Node *n, SwigType *type) { Parm *p = NewParm(type, "test", n); SwigType *tm = Swig_typemap_lookup("gotype", p, "", NULL); Delete(p); if (tm && Strstr(tm, "$gotypename") == 0) { Delete(tm); return true; } Delete(tm); return false; } /* ---------------------------------------------------------------------- * goEnumName() * * Given an enum node, return a string to use for the enum type in Go. * ---------------------------------------------------------------------- */ String *goEnumName(Node *n) { String *ret = Getattr(n, "go:enumname"); if (ret) { return Copy(ret); } if (Equal(Getattr(n, "type"), "enum ")) { return NewString("int"); } String *type = Getattr(n, "enumtype"); assert(type); char *p = Char(type); int len = Len(type); String *s = NewString(""); bool capitalize = true; for (int i = 0; i < len; ++i, ++p) { if (*p == ':') { ++i; ++p; assert(*p == ':'); capitalize = true; } else if (capitalize) { Putc(toupper(*p), s); capitalize = false; } else { Putc(*p, s); } } ret = Swig_name_mangle(s); Delete(s); return ret; } /* ---------------------------------------------------------------------- * getParm() * * Get the real parameter to use. * ---------------------------------------------------------------------- */ Parm *getParm(Parm *p) { while (p && checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } return p; } /* ---------------------------------------------------------------------- * nextParm() * * Return the next parameter. * ---------------------------------------------------------------------- */ Parm *nextParm(Parm *p) { if (!p) { return NULL; } else if (Getattr(p, "tmap:in")) { return Getattr(p, "tmap:in:next"); } else { return nextSibling(p); } } /* ---------------------------------------------------------------------- * isStatic * * Return whether a node should be considered as static rather than * as a member. * ---------------------------------------------------------------------- */ bool isStatic(Node *n) { String *storage = Getattr(n, "storage"); return (storage && (Swig_storage_isstatic(n) || Strcmp(storage, "friend") == 0) && (!SmartPointer || !Getattr(n, "allocate:smartpointeraccess"))); } /* ---------------------------------------------------------------------- * isFriend * * Return whether a node is a friend. * ---------------------------------------------------------------------- */ bool isFriend(Node *n) { String *storage = Getattr(n, "storage"); return storage && Strcmp(storage, "friend") == 0; } /* ---------------------------------------------------------------------- * goGetattr * * Fetch an attribute from a node but return NULL if it is the empty string. * ---------------------------------------------------------------------- */ Node *goGetattr(Node *n, const char *name) { Node *ret = Getattr(n, name); if (ret != NULL && Len(ret) == 0) { ret = NULL; } return ret; } /* ---------------------------------------------------------------------- * goTypemapLookup * * Look up a typemap but return NULL if it is the empty string. * ---------------------------------------------------------------------- */ String *goTypemapLookup(const char *name, Node *node, const char *lname) { String *ret = Swig_typemap_lookup(name, node, lname, NULL); if (ret != NULL && Len(ret) == 0) { ret = NULL; } return ret; } /* ---------------------------------------------------------------------- * getModuleName * * Return the name of a module. This is different from module path: * "some/path/to/module" -> "module". * ---------------------------------------------------------------------- */ String *getModuleName(String *module_path) { char *suffix = strrchr(Char(module_path), '/'); if (suffix == NULL) { return module_path; } return Str(suffix + 1); } }; /* class GO */ /* ----------------------------------------------------------------------------- * swig_go() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_go() { return new GO(); } extern "C" Language *swig_go(void) { return new_swig_go(); } /* ----------------------------------------------------------------------------- * Static member variables * ----------------------------------------------------------------------------- */ // Usage message. const char * const GO::usage = "\ Go Options (available with -go)\n\ -cgo - Generate cgo input files\n\ -gccgo - Generate code for gccgo rather than 6g/8g\n\ -go-pkgpath

- Like gccgo -fgo-pkgpath option\n\ -go-prefix

- Like gccgo -fgo-prefix option\n\ -intgosize - Set size of Go int type--32 or 64 bits\n\ -package - Set name of the Go package to \n\ -use-shlib - Force use of a shared library\n\ -soname - Set shared library holding C/C++ code to \n\ \n"; swig-3.0.12/Source/Modules/README0000664000175000017500000000047213042756442016170 0ustar williamwilliam06/25/2002 This directory contains all of the SWIG language modules. Many of these modules contain code that dates back to SWIG1.0. The module API has changed a lot in the development releases so this is fairly messy. We're working on cleaning it up, but you'll have to bear with us until it's done. -- Dave swig-3.0.12/Source/Modules/lang.cxx0000664000175000017500000036366113042756442016771 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * lang.cxx * * Language base class functions. Default C++ handling is also implemented here. * ----------------------------------------------------------------------------- */ #include "swigmod.h" #include "cparse.h" #include /* default mode settings */ static int director_mode = 0; static int director_protected_mode = 1; static int all_protected_mode = 0; static int naturalvar_mode = 0; Language *Language::this_ = 0; /* Set director_protected_mode */ void Wrapper_director_mode_set(int flag) { director_mode = flag; } void Wrapper_director_protected_mode_set(int flag) { director_protected_mode = flag; } void Wrapper_all_protected_mode_set(int flag) { all_protected_mode = flag; } void Wrapper_naturalvar_mode_set(int flag) { naturalvar_mode = flag; } extern "C" { int Swig_director_mode() { return director_mode; } int Swig_director_protected_mode() { return director_protected_mode; } int Swig_all_protected_mode() { return all_protected_mode; } void Language_replace_special_variables(String *method, String *tm, Parm *parm) { Language::instance()->replaceSpecialVariables(method, tm, parm); } } /* Some status variables used during parsing */ static int InClass = 0; /* Parsing C++ or not */ static String *ClassName = 0; /* This is the real name of the current class */ static String *EnumClassName = 0; /* Enum class name */ static String *ClassPrefix = 0; /* Class prefix */ static String *EnumClassPrefix = 0; /* Prefix for strongly typed enums (including ClassPrefix) */ static String *NSpace = 0; /* Namespace for the nspace feature */ static String *ClassType = 0; /* Fully qualified type name to use */ static String *DirectorClassName = 0; /* Director name of the current class */ int Abstract = 0; int ImportMode = 0; int IsVirtual = 0; static String *AttributeFunctionGet = 0; static String *AttributeFunctionSet = 0; static Node *CurrentClass = 0; int line_number = 0; String *input_file = 0; int SmartPointer = 0; static Hash *classhash; extern int GenerateDefault; extern int ForceExtern; extern int AddExtern; /* import modes */ #define IMPORT_MODE 1 #define IMPORT_MODULE 2 /* ---------------------------------------------------------------------- * Dispatcher::emit_one() * * Dispatch a single node * ---------------------------------------------------------------------- */ int Dispatcher::emit_one(Node *n) { int ret = SWIG_OK; char *tag = Char(nodeType(n)); if (!tag) { /* Printf(stderr,"SWIG: Fatal internal error. Malformed parse tree node!\n"); */ return SWIG_OK; } /* Do not proceed if marked with an error */ if (Getattr(n, "error")) return SWIG_OK; /* Look for warnings */ String *wrn = Getattr(n, "feature:warnfilter"); if (wrn) Swig_warnfilter(wrn, 1); /* ============================================================ * C/C++ parsing * ============================================================ */ if (strcmp(tag, "extern") == 0) { ret = externDeclaration(n); } else if (strcmp(tag, "cdecl") == 0) { ret = cDeclaration(n); } else if (strcmp(tag, "enum") == 0) { ret = enumDeclaration(n); } else if (strcmp(tag, "enumitem") == 0) { ret = enumvalueDeclaration(n); } else if (strcmp(tag, "enumforward") == 0) { ret = enumforwardDeclaration(n); } else if (strcmp(tag, "class") == 0) { ret = classDeclaration(n); } else if (strcmp(tag, "classforward") == 0) { ret = classforwardDeclaration(n); } else if (strcmp(tag, "constructor") == 0) { ret = constructorDeclaration(n); } else if (strcmp(tag, "destructor") == 0) { ret = destructorDeclaration(n); } else if (strcmp(tag, "access") == 0) { ret = accessDeclaration(n); } else if (strcmp(tag, "using") == 0) { ret = usingDeclaration(n); } else if (strcmp(tag, "namespace") == 0) { ret = namespaceDeclaration(n); } else if (strcmp(tag, "template") == 0) { ret = templateDeclaration(n); } else if (strcmp(tag, "lambda") == 0) { ret = lambdaDeclaration(n); } /* =============================================================== * SWIG directives * =============================================================== */ else if (strcmp(tag, "top") == 0) { ret = top(n); } else if (strcmp(tag, "extend") == 0) { ret = extendDirective(n); } else if (strcmp(tag, "apply") == 0) { ret = applyDirective(n); } else if (strcmp(tag, "clear") == 0) { ret = clearDirective(n); } else if (strcmp(tag, "constant") == 0) { ret = constantDirective(n); } else if (strcmp(tag, "fragment") == 0) { ret = fragmentDirective(n); } else if (strcmp(tag, "import") == 0) { ret = importDirective(n); } else if (strcmp(tag, "include") == 0) { ret = includeDirective(n); } else if (strcmp(tag, "insert") == 0) { ret = insertDirective(n); } else if (strcmp(tag, "module") == 0) { ret = moduleDirective(n); } else if (strcmp(tag, "native") == 0) { ret = nativeDirective(n); } else if (strcmp(tag, "pragma") == 0) { ret = pragmaDirective(n); } else if (strcmp(tag, "typemap") == 0) { ret = typemapDirective(n); } else if (strcmp(tag, "typemapcopy") == 0) { ret = typemapcopyDirective(n); } else if (strcmp(tag, "typemapitem") == 0) { ret = typemapitemDirective(n); } else if (strcmp(tag, "types") == 0) { ret = typesDirective(n); } else { Swig_error(input_file, line_number, "Unrecognized parse tree node type '%s'\n", tag); ret = SWIG_ERROR; } if (wrn) Swig_warnfilter(wrn, 0); return ret; } /* ---------------------------------------------------------------------- * Dispatcher::emit_children() * * Emit all children that match the given type. type = 0 means all types. * ---------------------------------------------------------------------- */ int Dispatcher::emit_children(Node *n) { Node *c; char *eo = Char(Getattr(n, "feature:emitonlychildren")); for (c = firstChild(n); c; c = nextSibling(c)) { if (eo) { const char *tag = Char(nodeType(c)); if (strcmp(tag, "cdecl") == 0) { if (checkAttribute(c, "storage", "typedef")) tag = "typedef"; } if (strstr(eo, tag) == 0) { continue; } } emit_one(c); } return SWIG_OK; } /* Stubs for dispatcher class. We don't do anything by default---up to derived class to fill in traversal code */ int Dispatcher::defaultHandler(Node *) { return SWIG_OK; } int Dispatcher::extendDirective(Node *n) { return defaultHandler(n); } int Dispatcher::applyDirective(Node *n) { return defaultHandler(n); } int Dispatcher::clearDirective(Node *n) { return defaultHandler(n); } int Dispatcher::constantDirective(Node *n) { return defaultHandler(n); } int Dispatcher::fragmentDirective(Node *n) { return defaultHandler(n); } int Dispatcher::importDirective(Node *n) { return defaultHandler(n); } int Dispatcher::includeDirective(Node *n) { return defaultHandler(n); } int Dispatcher::insertDirective(Node *n) { return defaultHandler(n); } int Dispatcher::moduleDirective(Node *n) { return defaultHandler(n); } int Dispatcher::nativeDirective(Node *n) { return defaultHandler(n); } int Dispatcher::pragmaDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapitemDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typemapcopyDirective(Node *n) { return defaultHandler(n); } int Dispatcher::typesDirective(Node *n) { return defaultHandler(n); } int Dispatcher::cDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::externDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumvalueDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::enumforwardDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::classDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::templateDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::lambdaDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::classforwardDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::constructorDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::destructorDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::accessDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::usingDeclaration(Node *n) { return defaultHandler(n); } int Dispatcher::namespaceDeclaration(Node *n) { return defaultHandler(n); } /* Allocators */ Language::Language(): none_comparison(NewString("$arg != 0")), director_ctor_code(NewString("")), director_prot_ctor_code(0), symtabs(NewHash()), classtypes(NewHash()), enumtypes(NewHash()), overloading(0), multiinput(0), cplus_runtime(0), directors(0) { symbolAddScope(""); // create top level/global symbol table scope argc_template_string = NewString("argc"); argv_template_string = NewString("argv[%d]"); /* Default director constructor code, passed to Swig_ConstructorToFunction */ Printv(director_ctor_code, "if ( $comparison ) { /* subclassed */\n", " $director_new \n", "} else {\n", " $nondirector_new \n", "}\n", NIL); /* Default director 'protected' constructor code, disabled by default. Each language that needs it, has to define it. */ director_prot_ctor_code = 0; director_multiple_inheritance = 1; director_language = 0; assert(!this_); this_ = this; } Language::~Language() { Delete(symtabs); Delete(classtypes); Delete(enumtypes); Delete(director_ctor_code); Delete(none_comparison); this_ = 0; } /* ----------------------------------------------------------------------------- * directorClassName() * ----------------------------------------------------------------------------- */ String *Language::directorClassName(Node *n) { String *dirclassname; String *nspace = NewString(Getattr(n, "sym:nspace")); const char *attrib = "director:classname"; String *classname = getClassPrefix(); Replace(nspace, NSPACE_SEPARATOR, "_", DOH_REPLACE_ANY); if (Len(nspace) > 0) dirclassname = NewStringf("SwigDirector_%s_%s", nspace, classname); else dirclassname = NewStringf("SwigDirector_%s", classname); Setattr(n, attrib, dirclassname); Delete(nspace); return dirclassname; } /* ---------------------------------------------------------------------- emit_one() ---------------------------------------------------------------------- */ int Language::emit_one(Node *n) { int ret; int oldext; if (!n) return SWIG_OK; if (GetFlag(n, "feature:ignore") && !Getattr(n, "feature:onlychildren")) return SWIG_OK; oldext = Extend; if (Getattr(n, "feature:extend")) Extend = 1; line_number = Getline(n); input_file = Getfile(n); /* symtab = Getattr(n,"symtab"); if (symtab) { symtab = Swig_symbol_setscope(symtab); } */ ret = Dispatcher::emit_one(n); /* if (symtab) { Swig_symbol_setscope(symtab); } */ Extend = oldext; return ret; } static Parm *nonvoid_parms(Parm *p) { if (p) { SwigType *t = Getattr(p, "type"); if (SwigType_type(t) == T_VOID) return 0; } return p; } /* ----------------------------------------------------------------------------- * cplus_value_type() * * Returns the alternative value type needed in C++ for class value * types. When swig is not sure about using a plain $ltype value, * since the class doesn't have a default constructor, or it can't be * assigned, you will get back 'SwigValueWrapper'. * * ----------------------------------------------------------------------------- */ SwigType *cplus_value_type(SwigType *t) { return SwigType_alttype(t, 0); } static Node *first_nontemplate(Node *n) { while (n) { if (Strcmp(nodeType(n), "template") != 0) return n; n = Getattr(n, "sym:nextSibling"); } return n; } /* -------------------------------------------------------------------------- * swig_pragma() * * Handle swig pragma directives. * -------------------------------------------------------------------------- */ void swig_pragma(char *lang, char *name, char *value) { if (strcmp(lang, "swig") == 0) { if ((strcmp(name, "make_default") == 0) || ((strcmp(name, "makedefault") == 0))) { GenerateDefault = 1; } else if ((strcmp(name, "no_default") == 0) || ((strcmp(name, "nodefault") == 0))) { Swig_warning(WARN_DEPRECATED_NODEFAULT, "SWIG", 1, "dangerous, use %%nodefaultctor, %%nodefaultdtor instead.\n"); GenerateDefault = 0; } else if (strcmp(name, "attributefunction") == 0) { String *nvalue = NewString(value); char *s = strchr(Char(nvalue), ':'); if (!s) { Swig_error(input_file, line_number, "Bad value for attributefunction. Expected \"fmtget:fmtset\".\n"); } else { *s = 0; AttributeFunctionGet = NewString(Char(nvalue)); AttributeFunctionSet = NewString(s + 1); } Delete(nvalue); } else if (strcmp(name, "noattributefunction") == 0) { AttributeFunctionGet = 0; AttributeFunctionSet = 0; } } } /* -------------------------------------------------------------------------- * Language::use_naturalvar_mode() * * Determine whether to use const ref typemaps instead of pointer typemaps * for variable access. * -------------------------------------------------------------------------- */ int Language::use_naturalvar_mode(Node *n) const { if (Getattr(n, "unnamed")) return 0; // The naturalvar feature can be attached to either the variable name or the variable's type // naturalvar on the variable name is more specific and overrides naturalvar on the variable's type String *naturalvar = Getattr(n, "feature:naturalvar"); bool explicitly_off = naturalvar && Strcmp(naturalvar, "0") == 0; int nvar = GetFlag(n, "feature:naturalvar"); if (!explicitly_off && !nvar) { /* look for feature in the class */ SwigType *ty = Getattr(n, "type"); SwigType *fullty = SwigType_typedef_resolve_all(ty); if (SwigType_isclass(fullty)) { SwigType *tys = SwigType_strip_qualifiers(fullty); if (!CPlusPlus) { Replaceall(tys, "struct ", ""); Replaceall(tys, "union ", ""); Replaceall(tys, "class ", ""); } Node *typenode = Swig_symbol_clookup(tys, 0); if (typenode) { naturalvar = Getattr(typenode, "feature:naturalvar"); explicitly_off = naturalvar && Strcmp(naturalvar, "0") == 0; nvar = nvar || GetFlag(typenode, "feature:naturalvar"); } Delete(tys); } Delete(fullty); } nvar = nvar || naturalvar_mode; return explicitly_off ? 0 : nvar ? CWRAP_NATURAL_VAR : 0; } /* ---------------------------------------------------------------------- * Language::top() - Top of parsing tree * ---------------------------------------------------------------------- */ int Language::top(Node *n) { Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options) { if (Getattr(options, "naturalvar")) { naturalvar_mode = 1; } } } classhash = Getattr(n, "classes"); return emit_children(n); } /* ---------------------------------------------------------------------- * Language::extendDirective() * ---------------------------------------------------------------------- */ int Language::extendDirective(Node *n) { save_value oldam(Extend, CWRAP_EXTEND); save_value oldmode(cplus_mode, PUBLIC); emit_children(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::applyDirective() * ---------------------------------------------------------------------- */ int Language::applyDirective(Node *n) { Parm *pattern = Getattr(n, "pattern"); Node *c = firstChild(n); while (c) { Parm *apattern = Getattr(c, "pattern"); if (ParmList_len(pattern) != ParmList_len(apattern)) { Swig_error(input_file, line_number, "Can't apply (%s) to (%s). Number of arguments don't match.\n", ParmList_str(pattern), ParmList_str(apattern)); } else { if (!Swig_typemap_apply(pattern, apattern)) { Swig_warning(WARN_TYPEMAP_APPLY_UNDEF, input_file, line_number, "Can't apply (%s). No typemaps are defined.\n", ParmList_str(pattern)); } } c = nextSibling(c); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::clearDirective() * ---------------------------------------------------------------------- */ int Language::clearDirective(Node *n) { Node *p; for (p = firstChild(n); p; p = nextSibling(p)) { ParmList *pattern = Getattr(p, "pattern"); Swig_typemap_clear_apply(pattern); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::constantDirective() * ---------------------------------------------------------------------- */ int Language::constantDirective(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } if (!ImportMode) { Swig_require("constantDirective", n, "name", "?value", NIL); String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); if (!value) { value = Copy(name); } else { /* if (checkAttribute(n,"type","char")) { value = NewString(value); } else { value = NewStringf("%(escape)s", value); } */ Setattr(n, "rawvalue", value); value = NewStringf("%(escape)s", value); if (!Len(value)) Append(value, "\\0"); /* Printf(stdout,"'%s' = '%s'\n", name, value); */ } Setattr(n, "value", value); this->constantWrapper(n); Swig_restore(n); return SWIG_OK; } return SWIG_NOWRAP; } /* ---------------------------------------------------------------------- * Language::fragmentDirective() * ---------------------------------------------------------------------- */ int Language::fragmentDirective(Node *n) { Swig_fragment_register(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::importDirective() * ---------------------------------------------------------------------- */ int Language::importDirective(Node *n) { int oldim = ImportMode; ImportMode = IMPORT_MODE; emit_children(n); ImportMode = oldim; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::includeDirective() * ---------------------------------------------------------------------- */ int Language::includeDirective(Node *n) { emit_children(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::insertDirective() * ---------------------------------------------------------------------- */ int Language::insertDirective(Node *n) { /* %insert directive */ if ((!ImportMode) || Getattr(n, "generated")) { String *code = Getattr(n, "code"); String *section = Getattr(n, "section"); File *f = 0; if (!section) { /* %{ ... %} */ f = Swig_filebyname("header"); } else { f = Swig_filebyname(section); } if (f) { Printf(f, "%s\n", code); } else { Swig_error(input_file, line_number, "Unknown target '%s' for %%insert directive.\n", section); } return SWIG_OK; } else { return SWIG_NOWRAP; } } /* ---------------------------------------------------------------------- * Language::moduleDirective() * ---------------------------------------------------------------------- */ int Language::moduleDirective(Node *n) { (void) n; /* %module directive */ return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::nativeDirective() * ---------------------------------------------------------------------- */ int Language::nativeDirective(Node *n) { if (!ImportMode) { return nativeWrapper(n); } else { return SWIG_NOWRAP; } } /* ---------------------------------------------------------------------- * Language::pragmaDirective() * ---------------------------------------------------------------------- */ int Language::pragmaDirective(Node *n) { /* %pragma directive */ if (!ImportMode) { String *lan = Getattr(n, "lang"); String *name = Getattr(n, "name"); String *value = Getattr(n, "value"); swig_pragma(Char(lan), Char(name), Char(value)); /* pragma(Char(lan),Char(name),Char(value)); */ return SWIG_OK; } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typemapDirective() * ---------------------------------------------------------------------- */ int Language::typemapDirective(Node *n) { /* %typemap directive */ String *method = Getattr(n, "method"); String *code = Getattr(n, "code"); Parm *kwargs = Getattr(n, "kwargs"); Node *items = firstChild(n); static int namewarn = 0; if (code && (Strstr(code, "$source") || (Strstr(code, "$target")))) { Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "Deprecated typemap feature ($source/$target).\n"); if (!namewarn) { Swig_warning(WARN_TYPEMAP_SOURCETARGET, Getfile(n), Getline(n), "The use of $source and $target in a typemap declaration is deprecated.\n\ For typemaps related to argument input (in,ignore,default,arginit,check), replace\n\ $source by $input and $target by $1. For typemaps related to return values (out,\n\ argout,ret,except), replace $source by $1 and $target by $result. See the file\n\ Doc/Manual/Typemaps.html for complete details.\n"); namewarn = 1; } } if (Strcmp(method, "except") == 0) { Swig_warning(WARN_DEPRECATED_EXCEPT_TM, Getfile(n), Getline(n), "%%typemap(except) is deprecated. Use the %%exception directive.\n"); } if (Strcmp(method, "in") == 0) { Hash *k; k = kwargs; while (k) { if (checkAttribute(k, "name", "numinputs")) { if (!multiinput && (GetInt(k, "value") > 1)) { Swig_error(Getfile(n), Getline(n), "Multiple-input typemaps (numinputs > 1) not supported by this target language module.\n"); return SWIG_ERROR; } break; } k = nextSibling(k); } if (!k) { k = NewHash(); Setattr(k, "name", "numinputs"); Setattr(k, "value", "1"); set_nextSibling(k, kwargs); Setattr(n, "kwargs", k); kwargs = k; } } if (Strcmp(method, "ignore") == 0) { Swig_warning(WARN_DEPRECATED_IGNORE_TM, Getfile(n), Getline(n), "%%typemap(ignore) has been replaced by %%typemap(in,numinputs=0).\n"); Clear(method); Append(method, "in"); Hash *k = NewHash(); Setattr(k, "name", "numinputs"); Setattr(k, "value", "0"); set_nextSibling(k, kwargs); Setattr(n, "kwargs", k); kwargs = k; } /* Replace $descriptor() macros */ if (code) { Setfile(code, Getfile(n)); Setline(code, Getline(n)); Swig_cparse_replace_descriptor(code); } while (items) { Parm *pattern = Getattr(items, "pattern"); Parm *parms = Getattr(items, "parms"); if (code) { Swig_typemap_register(method, pattern, code, parms, kwargs); } else { Swig_typemap_clear(method, pattern); } items = nextSibling(items); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typemapcopyDirective() * ---------------------------------------------------------------------- */ int Language::typemapcopyDirective(Node *n) { String *method = Getattr(n, "method"); Parm *pattern = Getattr(n, "pattern"); Node *items = firstChild(n); int nsrc = 0; nsrc = ParmList_len(pattern); while (items) { ParmList *npattern = Getattr(items, "pattern"); if (nsrc != ParmList_len(npattern)) { Swig_error(input_file, line_number, "Can't copy typemap. Number of types differ.\n"); } else { if (Swig_typemap_copy(method, pattern, npattern) < 0) { Swig_error(input_file, line_number, "Can't copy typemap (%s) %s = %s\n", method, ParmList_str(pattern), ParmList_str(npattern)); } } items = nextSibling(items); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typesDirective() * ---------------------------------------------------------------------- */ int Language::typesDirective(Node *n) { Parm *parms = Getattr(n, "parms"); String *convcode = Getattr(n, "convcode"); /* optional user supplied conversion code for custom casting */ while (parms) { SwigType *t = Getattr(parms, "type"); String *v = Getattr(parms, "value"); if (!v) { SwigType_remember(t); } else { if (SwigType_issimple(t)) { SwigType_inherit(t, v, 0, convcode); } } parms = nextSibling(parms); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::cDeclaration() * ---------------------------------------------------------------------- */ int Language::cDeclaration(Node *n) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); SwigType *decl = Getattr(n, "decl"); String *storage = Getattr(n, "storage"); Node *over; File *f_header = 0; SwigType *ty, *fullty; if (Getattr(n, "feature:onlychildren")) { if (GetFlag(n, "feature:ignore")) { return SWIG_NOWRAP; } else { // Found an unignored templated method that has an empty template instantiation (%template()) // Ignore it unless it has been %rename'd if (Strncmp(symname, "__dummy_", 8) == 0 && Cmp(storage, "typedef") != 0) { SetFlag(n, "feature:ignore"); Swig_warning(WARN_LANG_TEMPLATE_METHOD_IGNORE, input_file, line_number, "%%template() contains no name. Template method ignored: %s\n", Swig_name_decl(n)); return SWIG_NOWRAP; } } } /* discards nodes following the access control rules */ if (cplus_mode != PUBLIC || !is_public(n)) { /* except for friends, they are not affected by access control */ int isfriend = Cmp(storage, "friend") == 0; if (!isfriend) { /* Check what the director needs. If the method is pure virtual, it is always needed. * Also wrap non-virtual protected members if asked for (allprotected mode). */ if (!(directorsEnabled() && ((is_member_director(CurrentClass, n) && need_nonpublic_member(n)) || isNonVirtualProtectedAccess(n)))) { return SWIG_NOWRAP; } // Prevent wrapping protected overloaded director methods more than once - // This bit of code is only needed due to the cDeclaration call in classHandler() String *wrapname = NewStringf("nonpublic_%s%s", symname, Getattr(n, "sym:overname")); if (Getattr(CurrentClass, wrapname)) { Delete(wrapname); return SWIG_NOWRAP; } SetFlag(CurrentClass, wrapname); Delete(wrapname); } } if (Cmp(storage, "typedef") == 0) { Swig_save("cDeclaration", n, "type", NIL); SwigType *t = Copy(type); if (t) { SwigType_push(t, decl); Setattr(n, "type", t); typedefHandler(n); } Swig_restore(n); return SWIG_OK; } /* If in import mode, we proceed no further */ if (ImportMode) return SWIG_NOWRAP; /* If we're in extend mode and there is code, replace the $descriptor macros */ if (Extend) { String *code = Getattr(n, "code"); if (code) { Setfile(code, Getfile(n)); Setline(code, Getline(n)); Swig_cparse_replace_descriptor(code); } } /* Overloaded symbol check */ over = Swig_symbol_isoverloaded(n); if (!overloading) { if (over) over = first_nontemplate(over); if (over && (over != n)) { Swig_warning(WARN_LANG_OVERLOAD_DECL, input_file, line_number, "Overloaded declaration ignored. %s\n", Swig_name_decl(n)); Swig_warning(WARN_LANG_OVERLOAD_DECL, Getfile(over), Getline(over), "Previous declaration is %s\n", Swig_name_decl(over)); return SWIG_NOWRAP; } } if (!validIdentifier(symname)) { Swig_warning(WARN_LANG_IDENTIFIER, input_file, line_number, "Can't wrap '%s' unless renamed to a valid identifier.\n", SwigType_namestr(symname)); return SWIG_NOWRAP; } ty = NewString(type); SwigType_push(ty, decl); fullty = SwigType_typedef_resolve_all(ty); if (SwigType_isfunction(fullty)) { if (!SwigType_isfunction(ty)) { Delete(ty); ty = fullty; fullty = 0; ParmList *parms = SwigType_function_parms(ty, n); Setattr(n, "parms", parms); } /* Transform the node into a 'function' node and emit */ if (!CurrentClass) { f_header = Swig_filebyname("header"); if (AddExtern) { if (f_header) { if (Swig_storage_isextern(n) || (ForceExtern && !storage)) { /* we don't need the 'extern' part in the C/C++ declaration, and it produces some problems when namespace and SUN Studio is used. Printf(f_header,"extern %s", SwigType_str(ty,name)); In fact generating extern declarations is quite error prone and is no longer the default. Getting it right seems impossible with namespaces and default arguments and when a method is declared with the various Windows calling conventions - SWIG doesn't understand Windows (non standard) calling conventions in the first place, so can't regenerate them. */ String *str = SwigType_str(ty, name); Printf(f_header, "%s", str); Delete(str); { DOH *t = Getattr(n, "throws"); if (t) { Printf(f_header, " throw("); while (t) { Printf(f_header, "%s", Getattr(t, "type")); t = nextSibling(t); if (t) Printf(f_header, ","); } Printf(f_header, ")"); } } Printf(f_header, ";\n"); } else if (Swig_storage_isexternc(n)) { /* here 'extern "C"' is needed */ String *str = SwigType_str(ty, name); Printf(f_header, "extern \"C\" %s;\n", str); Delete(str); } } } } /* This needs to check qualifiers */ if (SwigType_isqualifier(ty)) { SwigType *qual = SwigType_pop(ty); Setattr(n, "qualifier", qual); Delete(qual); } Delete(SwigType_pop_function(ty)); DohIncref(type); Setattr(n, "type", ty); functionHandler(n); Setattr(n, "type", type); Delete(ty); Delete(type); return SWIG_OK; } else { /* Some kind of variable declaration */ String *declaration = Copy(decl); Delattr(n, "decl"); if (!CurrentClass) { if (Swig_storage_isextern(n) || ForceExtern) { if (AddExtern) { f_header = Swig_filebyname("header"); if (f_header) { String *str = SwigType_str(ty, name); Printf(f_header, "%s %s;\n", Getattr(n, "storage"), str); Delete(str); } } } } if (!SwigType_ismutable(ty)) { SetFlag(n, "feature:immutable"); } /* If an array and elements are const, then read-only */ if (SwigType_isarray(ty)) { SwigType *tya = SwigType_array_type(ty); if (SwigType_isconst(tya)) { SetFlag(n, "feature:immutable"); } Delete(tya); } DohIncref(type); Setattr(n, "type", ty); variableHandler(n); Setattr(n, "type", type); Setattr(n, "decl", declaration); Delete(ty); Delete(type); Delete(fullty); return SWIG_OK; } } /* ---------------------------------------------------------------------- * Language::functionHandler() * ---------------------------------------------------------------------- */ int Language::functionHandler(Node *n) { String *storage = Getattr(n, "storage"); int isfriend = CurrentClass && Cmp(storage, "friend") == 0; int isstatic = CurrentClass && Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess")); Parm *p = Getattr(n, "parms"); if (GetFlag(n, "feature:del")) { /* the method acts like a delete operator, ie, we need to disown the parameter */ if (CurrentClass && !isstatic && !isfriend) { SetFlag(n, "feature:self:disown"); } else { if (p) SetFlag(p, "wrap:disown"); } } if (!CurrentClass) { globalfunctionHandler(n); } else { if (isstatic) { staticmemberfunctionHandler(n); } else if (isfriend) { int oldInClass = InClass; InClass = 0; globalfunctionHandler(n); InClass = oldInClass; } else { Node *explicit_n = 0; if (directorsEnabled() && is_member_director(CurrentClass, n) && !extraDirectorProtectedCPPMethodsRequired()) { bool virtual_but_not_pure_virtual = (!(Cmp(storage, "virtual")) && (Cmp(Getattr(n, "value"), "0") != 0)); if (virtual_but_not_pure_virtual) { // Add additional wrapper which makes an explicit call to the virtual method (ie not a virtual call) explicit_n = Copy(n); String *new_symname = Copy(Getattr(n, "sym:name")); String *suffix = Getattr(parentNode(n), "sym:name"); Printv(new_symname, "SwigExplicit", suffix, NIL); Setattr(explicit_n, "sym:name", new_symname); Delattr(explicit_n, "storage"); Delattr(explicit_n, "override"); Delattr(explicit_n, "hides"); SetFlag(explicit_n, "explicitcall"); Setattr(n, "explicitcallnode", explicit_n); } } memberfunctionHandler(n); if (explicit_n) { memberfunctionHandler(explicit_n); Delattr(explicit_n, "explicitcall"); Delete(explicit_n); } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::globalfunctionHandler() * ---------------------------------------------------------------------- */ int Language::globalfunctionHandler(Node *n) { Swig_require("globalfunctionHandler", n, "name", "sym:name", "type", "?parms", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); /* Check for callback mode */ String *cb = GetFlagAttr(n, "feature:callback"); if (cb) { String *cbname = Getattr(n, "feature:callback:name"); if (!cbname) { cbname = NewStringf(cb, symname); Setattr(n, "feature:callback:name", cbname); } callbackfunctionHandler(n); if (Cmp(cbname, symname) == 0) { Delete(cbname); Swig_restore(n); return SWIG_NOWRAP; } Delete(cbname); } Setattr(n, "parms", nonvoid_parms(parms)); String *extendname = Getattr(n, "extendname"); String *call = Swig_cfunction_call(extendname ? extendname : name, parms); String *cres = Swig_cresult(type, Swig_cresult_name(), call); Setattr(n, "wrap:action", cres); Delete(cres); Delete(call); functionWrapper(n); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::callbackfunctionHandler() * ---------------------------------------------------------------------- */ int Language::callbackfunctionHandler(Node *n) { Swig_require("callbackfunctionHandler", n, "name", "*sym:name", "*type", "?value", NIL); String *type = Getattr(n, "type"); String *name = Getattr(n, "name"); String *parms = Getattr(n, "parms"); String *cbname = Getattr(n, "feature:callback:name"); String *calltype = NewStringf("(%s (*)(%s))(%s)", SwigType_str(type, 0), ParmList_str(parms), SwigType_namestr(name)); SwigType *cbty = Copy(type); SwigType_add_function(cbty, parms); SwigType_add_pointer(cbty); Setattr(n, "sym:name", cbname); Setattr(n, "type", cbty); Setattr(n, "value", calltype); Node *ns = symbolLookup(cbname); if (!ns) constantWrapper(n); Delete(cbty); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::memberfunctionHandler() * ---------------------------------------------------------------------- */ int Language::memberfunctionHandler(Node *n) { Swig_require("memberfunctionHandler", n, "*name", "*sym:name", "*type", "?parms", "?value", NIL); String *storage = Getattr(n, "storage"); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); ParmList *parms = Getattr(n, "parms"); String *cb = GetFlagAttr(n, "feature:callback"); if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { IsVirtual = PURE_VIRTUAL; } else { IsVirtual = PLAIN_VIRTUAL; } } else { IsVirtual = 0; } if (cb) { Node *cbn = NewHash(); String *cbname = Getattr(n, "feature:callback:name"); if (!cbname) { cbname = NewStringf(cb, symname); } SwigType *cbty = Copy(type); SwigType_add_function(cbty, parms); SwigType_add_memberpointer(cbty, ClassName); String *cbvalue = NewStringf("&%s::%s", ClassName, name); Setattr(cbn, "sym:name", cbname); Setattr(cbn, "type", cbty); Setattr(cbn, "value", cbvalue); Setattr(cbn, "name", name); Setfile(cbn, Getfile(n)); Setline(cbn, Getline(n)); memberconstantHandler(cbn); Setattr(n, "feature:callback:name", Swig_name_member(NSpace, ClassPrefix, cbname)); Delete(cb); Delete(cbn); Delete(cbvalue); Delete(cbty); Delete(cbname); if (Cmp(cbname, symname) == 0) { Swig_restore(n); return SWIG_NOWRAP; } } String *fname = Swig_name_member(NSpace, ClassPrefix, symname); if (Extend && SmartPointer) { if (!Getattr(n, "extendsmartclassname")) { Setattr(n, "extendsmartclassname", Getattr(CurrentClass, "allocate:smartpointerpointeeclassname")); } } // Set up the type for the cast to this class for use when wrapping const director (virtual) methods. // Note: protected director methods or when allprotected mode turned on. String *director_type = 0; if (!is_public(n) && (is_member_director(CurrentClass, n) || GetFlag(n, "explicitcall") || isNonVirtualProtectedAccess(n))) { director_type = Copy(DirectorClassName); String *qualifier = Getattr(n, "qualifier"); if (qualifier) SwigType_push(director_type, qualifier); SwigType_add_pointer(director_type); } int DirectorExtraCall = 0; if (directorsEnabled() && is_member_director(CurrentClass, n) && !SmartPointer) if (extraDirectorProtectedCPPMethodsRequired()) DirectorExtraCall = CWRAP_DIRECTOR_TWO_CALLS; if (GetFlag(n, "explicitcall")) DirectorExtraCall = CWRAP_DIRECTOR_ONE_CALL; int extendmember = GetFlag(n, "isextendmember") ? Extend : 0; int flags = Getattr(n, "template") ? extendmember | SmartPointer : Extend | SmartPointer | DirectorExtraCall; Swig_MethodToFunction(n, NSpace, ClassType, flags, director_type, is_member_director(CurrentClass, n)); Setattr(n, "sym:name", fname); functionWrapper(n); Delete(director_type); Delete(fname); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::staticmemberfunctionHandler() * ---------------------------------------------------------------------- */ int Language::staticmemberfunctionHandler(Node *n) { Swig_require("staticmemberfunctionHandler", n, "*name", "*sym:name", "*type", NIL); Swig_save("staticmemberfunctionHandler", n, "storage", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); String *cb = GetFlagAttr(n, "feature:callback"); String *cname, *mrename; if (!Extend) { Node *sb = Getattr(n, "cplus:staticbase"); String *sname = Getattr(sb, "name"); if (isNonVirtualProtectedAccess(n)) cname = NewStringf("%s::%s", DirectorClassName, name); else cname = NewStringf("%s::%s", sname, name); } else { String *mname = Swig_name_mangle(ClassName); cname = Swig_name_member(NSpace, mname, name); Delete(mname); } mrename = Swig_name_member(NSpace, ClassPrefix, symname); if (Extend) { String *code = Getattr(n, "code"); String *defaultargs = Getattr(n, "defaultargs"); String *mangled = Swig_name_mangle(mrename); Delete(mrename); mrename = mangled; if (Getattr(n, "sym:overloaded") && code) { Append(cname, Getattr(defaultargs ? defaultargs : n, "sym:overname")); } if (!defaultargs && code) { /* Hmmm. An added static member. We have to create a little wrapper for this */ String *mangled_cname = Swig_name_mangle(cname); Swig_add_extension_code(n, mangled_cname, parms, type, code, CPlusPlus, 0); Setattr(n, "extendname", mangled_cname); Delete(mangled_cname); } } Setattr(n, "name", cname); Setattr(n, "sym:name", mrename); if (cb) { String *cbname = NewStringf(cb, symname); Setattr(n, "feature:callback:name", Swig_name_member(NSpace, ClassPrefix, cbname)); Setattr(n, "feature:callback:staticname", name); } Delattr(n, "storage"); globalfunctionHandler(n); Delete(cname); Delete(mrename); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::variableHandler() * ---------------------------------------------------------------------- */ int Language::variableHandler(Node *n) { /* If not a smart-pointer access or added method. We clear feature:except. There is no way C++ or C would throw an exception merely for accessing a member data. Caveat: Some compilers seem to route attribute access through methods which can generate exceptions. The feature:allowexcept allows this. Also, the feature:exceptvar can be used to match only variables. */ if (!(Extend | SmartPointer)) { if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } } if (!CurrentClass) { globalvariableHandler(n); } else { Swig_save("variableHandler", n, "feature:immutable", NIL); if (SmartPointer) { /* If a smart-pointer and it's a constant access, we have to set immutable */ if (!Getattr(CurrentClass, "allocate:smartpointermutable")) { SetFlag(n, "feature:immutable"); } } if (Swig_storage_isstatic(n) && !(SmartPointer && Getattr(n, "allocate:smartpointeraccess"))) { staticmembervariableHandler(n); } else { membervariableHandler(n); } Swig_restore(n); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::globalvariableHandler() * ---------------------------------------------------------------------- */ int Language::globalvariableHandler(Node *n) { variableWrapper(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::membervariableHandler() * ---------------------------------------------------------------------- */ int Language::membervariableHandler(Node *n) { Swig_require("membervariableHandler", n, "*name", "*sym:name", "*type", NIL); Swig_save("membervariableHandler", n, "parms", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); if (!AttributeFunctionGet) { String *mname = Swig_name_member(0, ClassPrefix, symname); String *mrename_get = Swig_name_get(NSpace, mname); String *mrename_set = Swig_name_set(NSpace, mname); Delete(mname); /* Create a function to set the value of the variable */ int assignable = is_assignable(n); if (SmartPointer) { if (!Getattr(CurrentClass, "allocate:smartpointermutable")) { assignable = 0; } } if (assignable) { int make_set_wrapper = 1; String *tm = 0; String *target = 0; if (!Extend) { if (SmartPointer) { if (Swig_storage_isstatic(n)) { Node *sn = Getattr(n, "cplus:staticbase"); String *base = Getattr(sn, "name"); target = NewStringf("%s::%s", base, name); } else { String *pname = Swig_cparm_name(0, 0); target = NewStringf("(*%s)->%s", pname, name); Delete(pname); } } else { String *pname = isNonVirtualProtectedAccess(n) ? NewString("darg") : Swig_cparm_name(0, 0); target = NewStringf("%s->%s", pname, name); Delete(pname); } // This is an input type typemap lookup and so it should not use Node n // otherwise qualification is done on the parameter name for the setter function Parm *nin = NewParm(type, name, n); tm = Swig_typemap_lookup("memberin", nin, target, 0); Delete(nin); } int flags = Extend | SmartPointer | use_naturalvar_mode(n); if (isNonVirtualProtectedAccess(n)) flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembersetToFunction(n, ClassType, flags); Setattr(n, "memberset", "1"); if (!Extend) { /* Check for a member in typemap here */ if (!tm) { if (SwigType_isarray(type)) { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(type, 0)); make_set_wrapper = 0; } } else { String *pname0 = Swig_cparm_name(0, 0); String *pname1 = Swig_cparm_name(0, 1); Replace(tm, "$source", pname1, DOH_REPLACE_ANY); Replace(tm, "$target", target, DOH_REPLACE_ANY); Replace(tm, "$input", pname1, DOH_REPLACE_ANY); Replace(tm, "$self", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); Delete(tm); Delete(pname0); Delete(pname1); } Delete(target); } if (make_set_wrapper) { Setattr(n, "sym:name", mrename_set); functionWrapper(n); } else { SetFlag(n, "feature:immutable"); } /* Restore parameters */ Setattr(n, "type", type); Setattr(n, "name", name); Setattr(n, "sym:name", symname); Delattr(n, "memberset"); /* Delete all attached typemaps and typemap attributes */ Iterator ki; for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) Delattr(n, ki.key); } } /* Emit get function */ { int flags = Extend | SmartPointer | use_naturalvar_mode(n); if (isNonVirtualProtectedAccess(n)) flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembergetToFunction(n, ClassType, flags); Setattr(n, "sym:name", mrename_get); Setattr(n, "memberget", "1"); functionWrapper(n); Delattr(n, "memberget"); } Delete(mrename_get); Delete(mrename_set); } else { /* This code is used to support the attributefunction directive where member variables are converted automagically to accessor functions */ #if 0 Parm *p; String *gname; SwigType *vty; p = NewParm(type, 0, n); gname = NewStringf(AttributeFunctionGet, symname); if (!Extend) { ActionFunc = Copy(Swig_cmemberget_call(name, type)); cpp_member_func(Char(gname), Char(gname), type, 0); Delete(ActionFunc); } else { String *cname = Swig_name_get(NSpace, name); cpp_member_func(Char(cname), Char(gname), type, 0); Delete(cname); } Delete(gname); if (!GetFlag(n, "feature:immutable")) { gname = NewStringf(AttributeFunctionSet, symname); vty = NewString("void"); if (!Extend) { ActionFunc = Copy(Swig_cmemberset_call(name, type)); cpp_member_func(Char(gname), Char(gname), vty, p); Delete(ActionFunc); } else { String *cname = Swig_name_set(NSpace, name); cpp_member_func(Char(cname), Char(gname), vty, p); Delete(cname); } Delete(gname); } ActionFunc = 0; #endif } Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::staticmembervariableHandler() * ---------------------------------------------------------------------- */ int Language::staticmembervariableHandler(Node *n) { Swig_require("staticmembervariableHandler", n, "*name", "*sym:name", "*type", "?value", NIL); String *value = Getattr(n, "value"); String *classname = !SmartPointer ? (isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName) : Getattr(CurrentClass, "allocate:smartpointerpointeeclassname"); if (!value || !Getattr(n, "hasconsttype")) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *cname, *mrename; /* Create the variable name */ mrename = Swig_name_member(0, ClassPrefix, symname); cname = NewStringf("%s::%s", classname, name); Setattr(n, "sym:name", mrename); Setattr(n, "name", cname); /* Wrap as an ordinary global variable */ variableWrapper(n); Delete(mrename); Delete(cname); } else { /* This is a C++ static member declaration with an initializer and it's const. Certain C++ compilers optimize this out so that there is no linkage to a memory address. Example: class Foo { public: static const int x = 3; }; Some discussion of this in section 9.4 of the C++ draft standard. Also, we have to manage the case: class Foo { public: %extend { static const int x = 3; } }; in which there's no actual Foo::x variable to refer to. In this case, the best we can do is to wrap the given value verbatim. */ String *name = Getattr(n, "name"); String *cname = NewStringf("%s::%s", classname, name); if (Extend) { /* the variable is a synthesized one. There's nothing we can do; we just keep the given value */ } else { /* we refer to the value as Foo::x */ String *value = SwigType_namestr(cname); Setattr(n, "value", value); } SwigType *t1 = SwigType_typedef_resolve_all(Getattr(n, "type")); SwigType *t2 = SwigType_strip_qualifiers(t1); Setattr(n, "type", t2); Delete(t1); Delete(t2); SetFlag(n, "wrappedasconstant"); memberconstantHandler(n); Delete(cname); } Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::externDeclaration() * ---------------------------------------------------------------------- */ int Language::externDeclaration(Node *n) { return emit_children(n); } /* ---------------------------------------------------------------------- * Language::enumDeclaration() * ---------------------------------------------------------------------- */ int Language::enumDeclaration(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; String *oldNSpace = NSpace; NSpace = Getattr(n, "sym:nspace"); String *oldEnumClassPrefix = EnumClassPrefix; if (GetFlag(n, "scopedenum")) { assert(Getattr(n, "sym:name")); assert(Getattr(n, "name")); EnumClassPrefix = ClassPrefix ? NewStringf("%s_", ClassPrefix) : NewString(""); Printv(EnumClassPrefix, Getattr(n, "sym:name"), NIL); EnumClassName = Copy(Getattr(n, "name")); } if (!ImportMode) { emit_children(n); } if (GetFlag(n, "scopedenum")) { Delete(EnumClassName); EnumClassName = 0; Delete(EnumClassPrefix); EnumClassPrefix = oldEnumClassPrefix; } NSpace = oldNSpace; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::enumvalueDeclaration() * ---------------------------------------------------------------------- */ int Language::enumvalueDeclaration(Node *n) { if (CurrentClass && (cplus_mode != PUBLIC)) return SWIG_NOWRAP; Swig_require("enumvalueDeclaration", n, "*name", "*sym:name", "?value", NIL); String *value = Getattr(n, "value"); String *name = Getattr(n, "name"); String *tmpValue; if (value) tmpValue = NewString(value); else tmpValue = NewString(name); Setattr(n, "value", tmpValue); Node *parent = parentNode(n); if (GetFlag(parent, "scopedenum")) { String *symname = Swig_name_member(0, Getattr(parent, "sym:name"), Getattr(n, "sym:name")); Setattr(n, "sym:name", symname); Delete(symname); } if (!CurrentClass || !cparse_cplusplus) { Setattr(n, "name", tmpValue); /* for wrapping of enums in a namespace when emit_action is used */ constantWrapper(n); } else { memberconstantHandler(n); } Delete(tmpValue); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::enumforwardDeclaration() * ---------------------------------------------------------------------- */ int Language::enumforwardDeclaration(Node *n) { (void) n; if (GetFlag(n, "enumMissing")) enumDeclaration(n); // Generate an empty enum in target language return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::memberconstantHandler() * ----------------------------------------------------------------------------- */ int Language::memberconstantHandler(Node *n) { Swig_require("memberconstantHandler", n, "*name", "*sym:name", "value", NIL); if (!GetFlag(n, "feature:allowexcept")) { UnsetFlag(n, "feature:except"); } if (Getattr(n, "feature:exceptvar")) { Setattr(n, "feature:except", Getattr(n, "feature:exceptvar")); } String *enumvalue_symname = Getattr(n, "enumvalueDeclaration:sym:name"); // Only set if a strongly typed enum String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); String *value = Getattr(n, "value"); String *mrename = Swig_name_member(0, EnumClassPrefix, enumvalue_symname ? enumvalue_symname : symname); Setattr(n, "sym:name", mrename); String *new_name = 0; if (Extend) new_name = Copy(value); else if (EnumClassName) new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : EnumClassName, name); else new_name = NewStringf("%s::%s", isNonVirtualProtectedAccess(n) ? DirectorClassName : ClassName, name); Setattr(n, "name", new_name); constantWrapper(n); Delete(mrename); Delete(new_name); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::typedefHandler() * ---------------------------------------------------------------------- */ int Language::typedefHandler(Node *n) { /* since this is a recurring issue, we are going to remember the typedef pointer, if already it is not a pointer or reference, as in typedef void NT; int func(NT *p); see director_basic.i for example. */ SwigType *name = Getattr(n, "name"); SwigType *decl = Getattr(n, "decl"); if (!SwigType_ispointer(decl) && !SwigType_isreference(decl)) { SwigType *pname = Copy(name); SwigType_add_pointer(pname); SwigType_remember(pname); Delete(pname); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorMethod() * ---------------------------------------------------------------------- */ int Language::classDirectorMethod(Node *n, Node *parent, String *super) { (void) n; (void) parent; (void) super; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorConstructor() * ---------------------------------------------------------------------- */ int Language::classDirectorConstructor(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDefaultConstructor() * ---------------------------------------------------------------------- */ int Language::classDirectorDefaultConstructor(Node *n) { (void) n; return SWIG_OK; } static String *vtable_method_id(Node *n) { String *nodeType = Getattr(n, "nodeType"); int is_destructor = (Cmp(nodeType, "destructor") == 0); if (is_destructor) return 0; String *name = Getattr(n, "name"); String *decl = Getattr(n, "decl"); String *local_decl = SwigType_typedef_resolve_all(decl); String *tmp = SwigType_pop_function(local_decl); Delete(local_decl); local_decl = tmp; Node *method_id = NewStringf("%s|%s", name, local_decl); Delete(local_decl); return method_id; } /* ---------------------------------------------------------------------- * Language::unrollVirtualMethods() * ---------------------------------------------------------------------- */ int Language::unrollVirtualMethods(Node *n, Node *parent, List *vm, int default_director, int &virtual_destructor, int protectedbase) { Node *ni; String *nodeType; String *classname; String *decl; bool first_base = false; // recurse through all base classes to build the vtable List *bl = Getattr(n, "bases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { if (first_base && !director_multiple_inheritance) break; unrollVirtualMethods(bi.item, parent, vm, default_director, virtual_destructor); first_base = true; } } // recurse through all protected base classes to build the vtable, as needed bl = Getattr(n, "protectedbases"); if (bl) { Iterator bi; for (bi = First(bl); bi.item; bi = Next(bi)) { if (first_base && !director_multiple_inheritance) break; unrollVirtualMethods(bi.item, parent, vm, default_director, virtual_destructor, 1); first_base = true; } } // find the methods that need directors classname = Getattr(n, "name"); for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { /* we only need to check the virtual members */ nodeType = Getattr(ni, "nodeType"); int is_using = (Cmp(nodeType, "using") == 0); Node *nn = is_using ? firstChild(ni) : ni; /* assume there is only one child node for "using" nodes */ if (is_using) { if (nn) nodeType = Getattr(nn, "nodeType"); else continue; // A private "using" node } if (!checkAttribute(nn, "storage", "virtual")) continue; /* we need to add methods(cdecl) and destructor (to check for throw decl) */ int is_destructor = (Cmp(nodeType, "destructor") == 0); if ((Cmp(nodeType, "cdecl") == 0) || is_destructor) { decl = Getattr(nn, "decl"); /* extra check for function type and proper access */ if (SwigType_isfunction(decl) && (((!protectedbase || dirprot_mode()) && is_public(nn)) || need_nonpublic_member(nn))) { String *name = Getattr(nn, "name"); Node *method_id = is_destructor ? NewStringf("~destructor") : vtable_method_id(nn); /* Make sure that the new method overwrites the existing: */ int len = Len(vm); const int DO_NOT_REPLACE = -1; int replace = DO_NOT_REPLACE; for (int i = 0; i < len; i++) { Node *item = Getitem(vm, i); String *check_vmid = Getattr(item, "vmid"); if (Strcmp(method_id, check_vmid) == 0) { replace = i; break; } } /* filling a new method item */ String *fqdname = NewStringf("%s::%s", classname, name); Hash *item = NewHash(); Setattr(item, "fqdname", fqdname); Node *m = Copy(nn); /* Store the complete return type - needed for non-simple return types (pointers, references etc.) */ SwigType *ty = NewString(Getattr(m, "type")); SwigType_push(ty, decl); if (SwigType_isqualifier(ty)) { Delete(SwigType_pop(ty)); } Delete(SwigType_pop_function(ty)); Setattr(m, "returntype", ty); String *mname = NewStringf("%s::%s", Getattr(parent, "name"), name); /* apply the features of the original method found in the base class */ Swig_features_get(Swig_cparse_features(), 0, mname, Getattr(m, "decl"), m); Setattr(item, "methodNode", m); Setattr(item, "vmid", method_id); if (replace == DO_NOT_REPLACE) Append(vm, item); else Setitem(vm, replace, item); Setattr(nn, "directorNode", m); Delete(mname); } if (is_destructor) { virtual_destructor = 1; } } } /* We delete all the nodirector methods. This prevents the generation of 'empty' director classes. But this has to be done outside the previous 'for' an the recursive loop!. */ if (n == parent) { int len = Len(vm); for (int i = 0; i < len; i++) { Node *item = Getitem(vm, i); Node *m = Getattr(item, "methodNode"); /* retrieve the director features */ int mdir = GetFlag(m, "feature:director"); int mndir = GetFlag(m, "feature:nodirector"); /* 'nodirector' has precedence over 'director' */ int dir = (mdir || mndir) ? (mdir && !mndir) : 1; /* check if the method was found only in a base class */ Node *p = Getattr(m, "parentNode"); if (p != n) { Node *c = Copy(m); Setattr(c, "parentNode", n); int cdir = GetFlag(c, "feature:director"); int cndir = GetFlag(c, "feature:nodirector"); dir = (cdir || cndir) ? (cdir && !cndir) : dir; Delete(c); } if (dir) { /* be sure the 'nodirector' feature is disabled */ if (mndir) Delattr(m, "feature:nodirector"); } else { /* or just delete from the vm, since is not a director method */ Delitem(vm, i); len--; i--; } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDisown() * ---------------------------------------------------------------------- */ int Language::classDirectorDisown(Node *n) { Node *disown = NewHash(); String *mrename; String *symname = Getattr(n, "sym:name"); mrename = Swig_name_disown(NSpace, symname); String *type = NewString(ClassType); String *name = NewString("self"); SwigType_add_pointer(type); Parm *p = NewParm(type, name, n); Delete(name); Delete(type); type = NewString("void"); String *action = NewString(""); Printv(action, "{\n", "Swig::Director *director = SWIG_DIRECTOR_CAST(arg1);\n", "if (director) director->swig_disown();\n", "}\n", NULL); Setfile(disown, Getfile(n)); Setline(disown, Getline(n)); Setattr(disown, "wrap:action", action); Setattr(disown, "name", mrename); Setattr(disown, "sym:name", mrename); Setattr(disown, "type", type); Setattr(disown, "parms", p); Delete(action); Delete(mrename); Delete(type); Delete(p); functionWrapper(disown); Delete(disown); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorConstructors() * ---------------------------------------------------------------------- */ int Language::classDirectorConstructors(Node *n) { Node *ni; String *nodeType; Node *parent = Swig_methodclass(n); int default_ctor = Getattr(parent, "allocate:default_constructor") ? 1 : 0; int protected_ctor = 0; int constructor = 0; /* emit constructors */ for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { nodeType = Getattr(ni, "nodeType"); if (Cmp(nodeType, "constructor") == 0) { if (GetFlag(ni, "feature:ignore")) continue; Parm *parms = Getattr(ni, "parms"); if (is_public(ni)) { /* emit public constructor */ classDirectorConstructor(ni); constructor = 1; if (default_ctor) default_ctor = !ParmList_numrequired(parms); } else { /* emit protected constructor if needed */ if (need_nonpublic_ctor(ni)) { classDirectorConstructor(ni); constructor = 1; protected_ctor = 1; if (default_ctor) default_ctor = !ParmList_numrequired(parms); } } } } /* emit default constructor if needed */ if (!constructor) { if (!default_ctor) { /* we get here because the class has no public, protected or default constructor, therefore, the director class can't be created, ie, is kind of abstract. */ Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' can't be constructed\n", SwigType_namestr(Getattr(n, "name"))); return SWIG_OK; } classDirectorDefaultConstructor(n); default_ctor = 1; } /* this is just to support old java behavior, ie, the default constructor is always emitted, even when protected, and not needed, since there is a public constructor already defined. (scottm) This code is needed here to make the director_abstract + test generate compilable code (Example2 in director_abastract.i). (mmatus) This is very strange, since swig compiled with gcc3.2.3 doesn't need it here.... */ if (!default_ctor && !protected_ctor) { if (Getattr(parent, "allocate:default_base_constructor")) { classDirectorDefaultConstructor(n); } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorMethods() * ---------------------------------------------------------------------- */ int Language::classDirectorMethods(Node *n) { Node *vtable = Getattr(n, "vtable"); int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); String *method = Getattr(item, "methodNode"); String *fqdname = Getattr(item, "fqdname"); if (GetFlag(method, "feature:nodirector")) continue; String *wrn = Getattr(method, "feature:warnfilter"); if (wrn) Swig_warnfilter(wrn, 1); String *type = Getattr(method, "nodeType"); if (!Cmp(type, "destructor")) { classDirectorDestructor(method); } else { Swig_require("classDirectorMethods", method, "*type", NIL); assert(Getattr(method, "returntype")); Setattr(method, "type", Getattr(method, "returntype")); if (classDirectorMethod(method, n, fqdname) == SWIG_OK) SetFlag(item, "director"); Swig_restore(method); } if (wrn) Swig_warnfilter(wrn, 0); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorInit() * ---------------------------------------------------------------------- */ int Language::classDirectorInit(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorDestructor() * ---------------------------------------------------------------------- */ int Language::classDirectorDestructor(Node *n) { /* Always emit the virtual destructor in the declaration and in the compilation unit. Been explicit here can't make any damage, and can solve some nasty C++ compiler problems. */ File *f_directors = Swig_filebyname("director"); File *f_directors_h = Swig_filebyname("director_h"); if (Getattr(n, "throw")) { Printf(f_directors_h, " virtual ~%s() throw ();\n", DirectorClassName); Printf(f_directors, "%s::~%s() throw () {\n}\n\n", DirectorClassName, DirectorClassName); } else { Printf(f_directors_h, " virtual ~%s();\n", DirectorClassName); Printf(f_directors, "%s::~%s() {\n}\n\n", DirectorClassName, DirectorClassName); } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirectorEnd() * ---------------------------------------------------------------------- */ int Language::classDirectorEnd(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDirector() * ---------------------------------------------------------------------- */ int Language::classDirector(Node *n) { Node *module = Getattr(n, "module"); String *classtype = Getattr(n, "classtype"); Hash *directormap = 0; if (module) { directormap = Getattr(module, "wrap:directormap"); if (directormap == 0) { directormap = NewHash(); Setattr(module, "wrap:directormap", directormap); } } List *vtable = NewList(); int virtual_destructor = 0; unrollVirtualMethods(n, n, vtable, 0, virtual_destructor); // Emit all the using base::member statements for non virtual members (allprotected mode) Node *ni; String *using_protected_members_code = NewString(""); for (ni = Getattr(n, "firstChild"); ni; ni = nextSibling(ni)) { Node *nodeType = Getattr(ni, "nodeType"); bool cdeclaration = (Cmp(nodeType, "cdecl") == 0); if (cdeclaration && !GetFlag(ni, "feature:ignore")) { if (isNonVirtualProtectedAccess(ni)) { Node *overloaded = Getattr(ni, "sym:overloaded"); // emit the using base::member statement (but only once if the method is overloaded) if (!overloaded || (overloaded && (overloaded == ni))) Printf(using_protected_members_code, " using %s::%s;\n", SwigType_namestr(ClassName), Getattr(ni, "name")); } } } if (virtual_destructor || Len(vtable) > 0) { if (!virtual_destructor) { String *classtype = Getattr(n, "classtype"); Swig_warning(WARN_LANG_DIRECTOR_VDESTRUCT, input_file, line_number, "Director base class %s has no virtual destructor.\n", classtype); } Setattr(n, "vtable", vtable); if (directormap != 0) { Setattr(directormap, classtype, n); } classDirectorInit(n); classDirectorConstructors(n); classDirectorMethods(n); File *f_directors_h = Swig_filebyname("director_h"); Printv(f_directors_h, using_protected_members_code, NIL); classDirectorEnd(n); } Delete(vtable); Delete(using_protected_members_code); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classDeclaration() * ---------------------------------------------------------------------- */ static void addCopyConstructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "constructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); SwigType *type = Copy(cname); String *name = Swig_scopename_last(cname); String *cc = NewStringf("r.q(const).%s", type); String *decl = NewStringf("f(%s).", cc); String *oldname = Getattr(n, "sym:name"); if (Getattr(n, "allocate:has_constructor")) { // to work properly with '%rename Class', we must look // for any other constructor in the class, which has not been // renamed, and use its name as oldname. Node *c; for (c = firstChild(n); c; c = nextSibling(c)) { const char *tag = Char(nodeType(c)); if (strcmp(tag, "constructor") == 0) { String *cname = Getattr(c, "name"); String *csname = Getattr(c, "sym:name"); String *clast = Swig_scopename_last(cname); if (Equal(csname, clast)) { oldname = csname; break; } } } } String *symname = Swig_name_make(cn, cname, name, decl, oldname); if (Strcmp(symname, "$ignore") != 0) { Parm *p = NewParm(cc, "other", n); Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); SetFlag(cn, "feature:new"); Setattr(cn, "decl", decl); Setattr(cn, "parentNode", n); Setattr(cn, "parms", p); Setattr(cn, "copy_constructor", "1"); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_copy_constructor", "1"); Setattr(n, "copy_constructor_decl", decl); Setattr(n, "allocate:copy_constructor", "1"); Delete(access); } } Delete(cn); Delete(name); Delete(decl); Delete(symname); } static void addDefaultConstructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "constructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); String *name = Swig_scopename_last(cname); String *decl = NewString("f()."); String *oldname = Getattr(n, "sym:name"); String *symname = Swig_name_make(cn, cname, name, decl, oldname); if (Strcmp(symname, "$ignore") != 0) { Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); SetFlag(cn, "feature:new"); Setattr(cn, "decl", decl); Setattr(cn, "parentNode", n); Setattr(cn, "default_constructor", "1"); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_default_constructor", "1"); Setattr(n, "allocate:default_constructor", "1"); Delete(access); } } Delete(cn); Delete(name); Delete(decl); Delete(symname); } static void addDestructor(Node *n) { Node *cn = NewHash(); set_nodeType(cn, "destructor"); Setattr(cn, "access", "public"); Setfile(cn, Getfile(n)); Setline(cn, Getline(n)); String *cname = Getattr(n, "name"); String *name = Swig_scopename_last(cname); Insert(name, 0, "~"); String *decl = NewString("f()."); String *symname = Swig_name_make(cn, cname, name, decl, 0); if (Strcmp(symname, "$ignore") != 0) { String *possible_nonstandard_symname = NewStringf("~%s", Getattr(n, "sym:name")); Setattr(cn, "name", name); Setattr(cn, "sym:name", symname); Setattr(cn, "decl", "f()."); Setattr(cn, "parentNode", n); Symtab *oldscope = Swig_symbol_setscope(Getattr(n, "symtab")); Node *nonstandard_destructor = Equal(possible_nonstandard_symname, symname) ? 0 : Swig_symbol_clookup(possible_nonstandard_symname, 0); Node *on = Swig_symbol_add(symname, cn); Swig_features_get(Swig_cparse_features(), Swig_symbol_qualifiedscopename(0), name, decl, cn); Swig_symbol_setscope(oldscope); if (on == cn) { // SWIG accepts a non-standard named destructor in %extend that uses a typedef for the destructor name // For example: typedef struct X {} XX; %extend X { ~XX() {...} } // Don't add another destructor if a nonstandard one has been declared if (!nonstandard_destructor) { Node *access = NewHash(); set_nodeType(access, "access"); Setattr(access, "kind", "public"); appendChild(n, access); appendChild(n, cn); Setattr(n, "has_destructor", "1"); Setattr(n, "allocate:destructor", "1"); Delete(access); } } Delete(possible_nonstandard_symname); } Delete(cn); Delete(name); Delete(decl); Delete(symname); } int Language::classDeclaration(Node *n) { String *ochildren = Getattr(n, "feature:onlychildren"); if (ochildren) { Setattr(n, "feature:emitonlychildren", ochildren); emit_children(n); Delattr(n, "feature:emitonlychildren"); SetFlag(n, "feature:ignore"); return SWIG_NOWRAP; } // save class local variables for nested classes support int oldInClass = InClass; String *oldClassType = ClassType; String *oldClassPrefix = ClassPrefix; String *oldEnumClassPrefix = EnumClassPrefix; String *oldClassName = ClassName; String *oldDirectorClassName = DirectorClassName; String *oldNSpace = NSpace; Node *oldCurrentClass = CurrentClass; int dir = 0; String *kind = Getattr(n, "kind"); String *name = Getattr(n, "name"); String *tdname = Getattr(n, "tdname"); String *unnamed = Getattr(n, "unnamed"); String *symname = Getattr(n, "sym:name"); int strip = CPlusPlus ? 1 : unnamed && tdname; if (cplus_mode != PUBLIC) return SWIG_NOWRAP; if (!name) { Swig_warning(WARN_LANG_CLASS_UNNAMED, input_file, line_number, "Can't generate wrappers for unnamed struct/class.\n"); return SWIG_NOWRAP; } /* Check symbol name for template. If not renamed. Issue a warning */ if (!validIdentifier(symname)) { Swig_warning(WARN_LANG_IDENTIFIER, input_file, line_number, "Can't wrap class %s unless renamed to a valid identifier.\n", SwigType_namestr(symname)); return SWIG_NOWRAP; } AccessMode oldAccessMode = cplus_mode; Node *outerClass = Getattr(n, "nested:outer"); if (outerClass && oldAccessMode != PUBLIC) return SWIG_NOWRAP; ClassName = Copy(name); ClassPrefix = Copy(symname); if (Cmp(kind, "class") == 0) { cplus_mode = PRIVATE; } else { cplus_mode = PUBLIC; } for (; outerClass; outerClass = Getattr(outerClass, "nested:outer")) { Push(ClassPrefix, "_"); Push(ClassPrefix, Getattr(outerClass, "sym:name")); } EnumClassPrefix = Copy(ClassPrefix); if (strip) { ClassType = Copy(name); } else { ClassType = NewStringf("%s %s", kind, name); } Setattr(n, "classtypeobj", Copy(ClassType)); Setattr(n, "classtype", SwigType_namestr(ClassType)); InClass = 1; CurrentClass = n; NSpace = Getattr(n, "sym:nspace"); int oldAbstract = Abstract; /* Call classHandler() here */ if (!ImportMode) { if (directorsEnabled()) { int ndir = GetFlag(n, "feature:director"); int nndir = GetFlag(n, "feature:nodirector"); /* 'nodirector' has precedence over 'director' */ dir = (ndir || nndir) ? (ndir && !nndir) : 0; } int abstract = !dir && abstractClassTest(n); int odefault = (GenerateDefault && !GetFlag(n, "feature:nodefault")); /* default constructor */ if (!abstract && !GetFlag(n, "feature:nodefaultctor") && odefault) { if (!Getattr(n, "has_constructor") && !Getattr(n, "allocate:has_constructor") && (Getattr(n, "allocate:default_constructor"))) { addDefaultConstructor(n); } } /* copy constructor */ if (CPlusPlus && !abstract && GetFlag(n, "feature:copyctor")) { if (!Getattr(n, "has_copy_constructor") && !Getattr(n, "allocate:has_copy_constructor") && (Getattr(n, "allocate:copy_constructor")) && (!GetFlag(n, "feature:ignore"))) { addCopyConstructor(n); } } /* default destructor */ if (!GetFlag(n, "feature:nodefaultdtor") && odefault) { if (!Getattr(n, "has_destructor") && (!Getattr(n, "allocate:has_destructor")) && (Getattr(n, "allocate:default_destructor")) && (!GetFlag(n, "feature:ignore"))) { addDestructor(n); } } if (dir) { DirectorClassName = directorClassName(n); classDirector(n); } /* check for abstract after resolving directors */ Abstract = abstractClassTest(n); classHandler(n); } else { Abstract = abstractClassTest(n); Language::classHandler(n); } Abstract = oldAbstract; cplus_mode = oldAccessMode; NSpace = oldNSpace; InClass = oldInClass; CurrentClass = oldCurrentClass; Delete(ClassType); ClassType = oldClassType; Delete(EnumClassPrefix); EnumClassPrefix = oldEnumClassPrefix; Delete(ClassPrefix); ClassPrefix = oldClassPrefix; Delete(ClassName); ClassName = oldClassName; if (dir) { Delete(DirectorClassName); } DirectorClassName = oldDirectorClassName; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classHandler() * ---------------------------------------------------------------------- */ int Language::classHandler(Node *n) { save_value oldExtend(Extend); if (Getattr(n, "template")) Extend = 0; bool hasDirector = Swig_directorclass(n) ? true : false; /* Emit all of the class members */ emit_children(n); /* Look for smart pointer handling */ if (Getattr(n, "allocate:smartpointer")) { List *methods = Getattr(n, "allocate:smartpointer"); cplus_mode = PUBLIC; SmartPointer = CWRAP_SMART_POINTER; if (Getattr(n, "allocate:smartpointerconst") && Getattr(n, "allocate:smartpointermutable")) { SmartPointer |= CWRAP_SMART_POINTER_OVERLOAD; } Iterator c; for (c = First(methods); c.item; c = Next(c)) { emit_one(c.item); } SmartPointer = 0; } cplus_mode = PUBLIC; /* emit director disown method */ if (hasDirector) { classDirectorDisown(n); /* Emit additional protected virtual methods - only needed if the language module * codes logic in the C++ layer instead of the director proxy class method - primarily * to catch public use of protected methods by the scripting languages. */ if (dirprot_mode() && extraDirectorProtectedCPPMethodsRequired()) { Node *vtable = Getattr(n, "vtable"); String *symname = Getattr(n, "sym:name"); save_value old_mode(cplus_mode); cplus_mode = PROTECTED; int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); Node *method = Getattr(item, "methodNode"); SwigType *type = Getattr(method, "nodeType"); if (Strcmp(type, "cdecl") != 0) continue; if (GetFlag(method, "feature:ignore")) continue; String *methodname = Getattr(method, "sym:name"); String *wrapname = NewStringf("%s_%s", symname, methodname); if (!symbolLookup(wrapname, "") && (!is_public(method))) { Node *m = Copy(method); Setattr(m, "director", "1"); Setattr(m, "parentNode", n); /* * There is a bug that needs fixing still... * This area of code is creating methods which have not been overridden in a derived class (director methods that are protected in the base) * If the method is overloaded, then Swig_overload_dispatch() incorrectly generates a call to the base wrapper, _wrap_xxx method * See director_protected_overloaded.i - Possibly sym:overname needs correcting here. Printf(stdout, "new method: %s::%s(%s)\n", Getattr(parentNode(m), "name"), Getattr(m, "name"), ParmList_str_defaultargs(Getattr(m, "parms"))); */ cDeclaration(m); Delete(m); } Delete(wrapname); } } } return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::classforwardDeclaration() * ---------------------------------------------------------------------- */ int Language::classforwardDeclaration(Node *n) { (void) n; return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::constructorDeclaration() * ---------------------------------------------------------------------- */ int Language::constructorDeclaration(Node *n) { String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); if (!symname) return SWIG_NOWRAP; if (!CurrentClass) return SWIG_NOWRAP; if (ImportMode) return SWIG_NOWRAP; if (Extend) { /* extend default constructor can be safely ignored if there is already one */ int num_required = ParmList_numrequired(Getattr(n, "parms")); if ((num_required == 0) && Getattr(CurrentClass, "has_default_constructor")) { return SWIG_NOWRAP; } if ((num_required == 1) && Getattr(CurrentClass, "has_copy_constructor")) { String *ccdecl = Getattr(CurrentClass, "copy_constructor_decl"); if (ccdecl && (Strcmp(ccdecl, Getattr(n, "decl")) == 0)) { return SWIG_NOWRAP; } } } /* clean protected overloaded constructors, in case they are not needed anymore */ Node *over = Swig_symbol_isoverloaded(n); if (over && !Getattr(CurrentClass, "sym:cleanconstructor")) { int dirclass = Swig_directorclass(CurrentClass); Node *nn = over; while (nn) { if (!is_public(nn)) { if (!dirclass || !need_nonpublic_ctor(nn)) { SetFlag(nn, "feature:ignore"); } } nn = Getattr(nn, "sym:nextSibling"); } clean_overloaded(over); Setattr(CurrentClass, "sym:cleanconstructor", "1"); } if ((cplus_mode != PUBLIC)) { /* check only for director classes */ if (!Swig_directorclass(CurrentClass) || !need_nonpublic_ctor(n)) return SWIG_NOWRAP; } /* Name adjustment for %name */ Swig_save("constructorDeclaration", n, "sym:name", NIL); { String *base = Swig_scopename_last(name); if ((Strcmp(base, symname) == 0) && (Strcmp(symname, ClassPrefix) != 0)) { Setattr(n, "sym:name", ClassPrefix); } Delete(base); } /* Only create a constructor if the class is not abstract */ if (!Abstract) { Node *over; over = Swig_symbol_isoverloaded(n); if (over) over = first_nontemplate(over); if ((over) && (!overloading)) { /* If the symbol is overloaded. We check to see if it is a copy constructor. If so, we invoke copyconstructorHandler() as a special case. */ if (Getattr(n, "copy_constructor") && (!Getattr(CurrentClass, "has_copy_constructor"))) { copyconstructorHandler(n); Setattr(CurrentClass, "has_copy_constructor", "1"); } else { if (Getattr(over, "copy_constructor")) over = Getattr(over, "sym:nextSibling"); if (over != n) { Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, input_file, line_number, "Overloaded constructor ignored. %s\n", Swig_name_decl(n)); Swig_warning(WARN_LANG_OVERLOAD_CONSTRUCT, Getfile(over), Getline(over), "Previous declaration is %s\n", Swig_name_decl(over)); } else { constructorHandler(n); } } } else { String *expected_name = ClassName; String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); Delete(scope); if (!Equal(actual_name, expected_name) && !SwigType_istemplate(expected_name) && !SwigType_istemplate(actual_name)) { // Checking templates is skipped but they ought to be checked... they are just somewhat more tricky to check correctly bool illegal_name = true; if (Extend) { // Check for typedef names used as a constructor name in %extend. This is deprecated except for anonymous // typedef structs which have had their symbol names adjusted to the typedef name in the parser. SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name); SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name); if (!CPlusPlus) { if (Strncmp(name_resolved, "struct ", 7) == 0) Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST); else if (Strncmp(name_resolved, "union ", 6) == 0) Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST); } illegal_name = !Equal(name_resolved, expected_name_resolved); if (!illegal_name) Swig_warning(WARN_LANG_EXTEND_CONSTRUCTOR, input_file, line_number, "Use of an illegal constructor name '%s' in %%extend is deprecated, the constructor name should be '%s'.\n", SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0)); Delete(name_resolved); Delete(expected_name_resolved); } if (illegal_name) { Swig_warning(WARN_LANG_RETURN_TYPE, input_file, line_number, "Function %s must have a return type. Ignored.\n", Swig_name_decl(n)); Swig_restore(n); return SWIG_NOWRAP; } } constructorHandler(n); } } Setattr(CurrentClass, "has_constructor", "1"); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * get_director_ctor_code() * ---------------------------------------------------------------------- */ static String *get_director_ctor_code(Node *n, String *director_ctor_code, String *director_prot_ctor_code, List *&abstracts) { String *director_ctor = director_ctor_code; int use_director = Swig_directorclass(n); if (use_director) { Node *pn = Swig_methodclass(n); abstracts = Getattr(pn, "abstracts"); if (director_prot_ctor_code) { int is_notabstract = GetFlag(pn, "feature:notabstract"); int is_abstract = abstracts && !is_notabstract; if (is_protected(n) || is_abstract) { director_ctor = director_prot_ctor_code; abstracts = Copy(abstracts); Delattr(pn, "abstracts"); } else { if (is_notabstract) { abstracts = Copy(abstracts); Delattr(pn, "abstracts"); } else { abstracts = 0; } } } } return director_ctor; } /* ---------------------------------------------------------------------- * Language::constructorHandler() * ---------------------------------------------------------------------- */ int Language::constructorHandler(Node *n) { Swig_require("constructorHandler", n, "?name", "*sym:name", "?type", "?parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_construct(NSpace, symname); String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); List *abstracts = 0; String *director_ctor = get_director_ctor_code(n, director_ctor_code, director_prot_ctor_code, abstracts); if (!constructor) { /* if not originally a constructor, still handle it as one */ Setattr(n, "handled_as_constructor", "1"); } int extendmember = GetFlag(n, "isextendmember") ? Extend : 0; int flags = Getattr(n, "template") ? extendmember : Extend; Swig_ConstructorToFunction(n, NSpace, ClassType, none_comparison, director_ctor, CPlusPlus, flags, DirectorClassName); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); if (abstracts) Setattr(Swig_methodclass(n), "abstracts", abstracts); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::copyconstructorHandler() * ---------------------------------------------------------------------- */ int Language::copyconstructorHandler(Node *n) { Swig_require("copyconstructorHandler", n, "?name", "*sym:name", "?type", "?parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename = Swig_name_copyconstructor(NSpace, symname); List *abstracts = 0; String *director_ctor = get_director_ctor_code(n, director_ctor_code, director_prot_ctor_code, abstracts); Swig_ConstructorToFunction(n, NSpace, ClassType, none_comparison, director_ctor, CPlusPlus, Getattr(n, "template") ? 0 : Extend, DirectorClassName); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); if (abstracts) Setattr(Swig_methodclass(n), "abstracts", abstracts); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::destructorDeclaration() * ---------------------------------------------------------------------- */ int Language::destructorDeclaration(Node *n) { if (!CurrentClass) return SWIG_NOWRAP; if (cplus_mode != PUBLIC && !Getattr(CurrentClass, "feature:unref")) return SWIG_NOWRAP; if (ImportMode) return SWIG_NOWRAP; Swig_save("destructorDeclaration", n, "name", "sym:name", NIL); char *c = GetChar(n, "sym:name"); if (c && (*c == '~')) { Setattr(n, "sym:name", c + 1); } String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); if ((Strcmp(name, symname) == 0) || (Strcmp(symname, ClassPrefix) != 0)) { Setattr(n, "sym:name", ClassPrefix); } String *expected_name = ClassName; String *scope = Swig_scopename_check(ClassName) ? Swig_scopename_prefix(ClassName) : 0; String *actual_name = scope ? NewStringf("%s::%s", scope, name) : NewString(name); Delete(scope); Replace(actual_name, "~", "", DOH_REPLACE_FIRST); if (!Equal(actual_name, expected_name) && !(Getattr(n, "template"))) { bool illegal_name = true; if (Extend) { // Check for typedef names used as a destructor name in %extend. This is deprecated except for anonymous // typedef structs which have had their symbol names adjusted to the typedef name in the parser. SwigType *name_resolved = SwigType_typedef_resolve_all(actual_name); SwigType *expected_name_resolved = SwigType_typedef_resolve_all(expected_name); if (!CPlusPlus) { if (Strncmp(name_resolved, "struct ", 7) == 0) Replace(name_resolved, "struct ", "", DOH_REPLACE_FIRST); else if (Strncmp(name_resolved, "union ", 6) == 0) Replace(name_resolved, "union ", "", DOH_REPLACE_FIRST); } illegal_name = !Equal(name_resolved, expected_name_resolved); if (!illegal_name) Swig_warning(WARN_LANG_EXTEND_DESTRUCTOR, input_file, line_number, "Use of an illegal destructor name '%s' in %%extend is deprecated, the destructor name should be '%s'.\n", SwigType_str(Swig_scopename_last(actual_name), 0), SwigType_str(Swig_scopename_last(expected_name), 0)); Delete(name_resolved); Delete(expected_name_resolved); } if (illegal_name) { Swig_warning(WARN_LANG_ILLEGAL_DESTRUCTOR, input_file, line_number, "Illegal destructor name %s. Ignored.\n", Swig_name_decl(n)); Swig_restore(n); return SWIG_NOWRAP; } } destructorHandler(n); Setattr(CurrentClass, "has_destructor", "1"); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::destructorHandler() * ---------------------------------------------------------------------- */ int Language::destructorHandler(Node *n) { Swig_require("destructorHandler", n, "?name", "*sym:name", NIL); Swig_save("destructorHandler", n, "type", "parms", NIL); String *symname = Getattr(n, "sym:name"); String *mrename; char *csymname = Char(symname); if (*csymname == '~') csymname += 1; mrename = Swig_name_destroy(NSpace, csymname); Swig_DestructorToFunction(n, NSpace, ClassType, CPlusPlus, Extend); Setattr(n, "sym:name", mrename); functionWrapper(n); Delete(mrename); Swig_restore(n); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::accessDeclaration() * ---------------------------------------------------------------------- */ int Language::accessDeclaration(Node *n) { String *kind = Getattr(n, "kind"); if (Cmp(kind, "public") == 0) { cplus_mode = PUBLIC; } else if (Cmp(kind, "private") == 0) { cplus_mode = PRIVATE; } else if (Cmp(kind, "protected") == 0) { cplus_mode = PROTECTED; } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::namespaceDeclaration() * ----------------------------------------------------------------------------- */ int Language::namespaceDeclaration(Node *n) { if (Getattr(n, "alias")) return SWIG_OK; if (Getattr(n, "unnamed")) return SWIG_OK; emit_children(n); return SWIG_OK; } int Language::validIdentifier(String *s) { char *c = Char(s); while (*c) { if (!(isalnum(*c) || (*c == '_'))) return 0; c++; } return 1; } /* ----------------------------------------------------------------------------- * Language::usingDeclaration() * ----------------------------------------------------------------------------- */ int Language::usingDeclaration(Node *n) { if ((cplus_mode == PUBLIC) || (!is_public(n) && dirprot_mode())) { Node *np = Copy(n); Node *c; for (c = firstChild(np); c; c = nextSibling(c)) { /* it seems for some cases this is needed, like A* A::boo() */ if (CurrentClass) Setattr(c, "parentNode", CurrentClass); emit_one(c); } Delete(np); } return SWIG_OK; } /* Stubs. Language modules need to implement these */ /* ---------------------------------------------------------------------- * Language::constantWrapper() * ---------------------------------------------------------------------- */ int Language::constantWrapper(Node *n) { String *name = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *value = Getattr(n, "value"); String *str = SwigType_str(type, name); Printf(stdout, "constantWrapper : %s = %s\n", str, value); Delete(str); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::variableWrapper() * ---------------------------------------------------------------------- */ int Language::variableWrapper(Node *n) { Swig_require("variableWrapper", n, "*name", "*sym:name", "*type", "?parms", "?varset", "?varget", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *name = Getattr(n, "name"); Delattr(n,"varset"); Delattr(n,"varget"); String *newsymname = 0; if (!CurrentClass && EnumClassPrefix) { newsymname = Swig_name_member(0, EnumClassPrefix, symname); symname = newsymname; } /* If no way to set variables. We simply create functions */ int assignable = is_assignable(n); int flags = use_naturalvar_mode(n); if (!GetFlag(n, "wrappedasconstant")) flags = flags | Extend; if (assignable) { int make_set_wrapper = 1; String *tm = Swig_typemap_lookup("globalin", n, name, 0); Swig_VarsetToFunction(n, flags); String *sname = Swig_name_set(NSpace, symname); Setattr(n, "sym:name", sname); Delete(sname); if (!tm) { if (SwigType_isarray(type)) { Swig_warning(WARN_TYPEMAP_VARIN_UNDEF, input_file, line_number, "Unable to set variable of type %s.\n", SwigType_str(type, 0)); make_set_wrapper = 0; } } else { String *pname0 = Swig_cparm_name(0, 0); Replace(tm, "$source", pname0, DOH_REPLACE_ANY); Replace(tm, "$target", name, DOH_REPLACE_ANY); Replace(tm, "$input", pname0, DOH_REPLACE_ANY); Setattr(n, "wrap:action", tm); Delete(tm); Delete(pname0); } if (make_set_wrapper) { Setattr(n, "varset", "1"); functionWrapper(n); } else { SetFlag(n, "feature:immutable"); } /* Restore parameters */ Setattr(n, "sym:name", symname); Setattr(n, "type", type); Setattr(n, "name", name); Delattr(n, "varset"); /* Delete all attached typemaps and typemap attributes */ Iterator ki; for (ki = First(n); ki.key; ki = Next(ki)) { if (Strncmp(ki.key, "tmap:", 5) == 0) Delattr(n, ki.key); } } Swig_VargetToFunction(n, flags); String *gname = Swig_name_get(NSpace, symname); Setattr(n, "sym:name", gname); Delete(gname); Setattr(n, "varget", "1"); functionWrapper(n); Delattr(n, "varget"); Swig_restore(n); Delete(newsymname); return SWIG_OK; } /* ---------------------------------------------------------------------- * Language::functionWrapper() * ---------------------------------------------------------------------- */ int Language::functionWrapper(Node *n) { String *name = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); ParmList *parms = Getattr(n, "parms"); Printf(stdout, "functionWrapper : %s\n", SwigType_str(type, NewStringf("%s(%s)", name, ParmList_str_defaultargs(parms)))); Printf(stdout, " action : %s\n", Getattr(n, "wrap:action")); return SWIG_OK; } /* ----------------------------------------------------------------------------- * Language::nativeWrapper() * ----------------------------------------------------------------------------- */ int Language::nativeWrapper(Node *n) { (void) n; return SWIG_OK; } void Language::main(int argc, char *argv[]) { (void) argc; (void) argv; } /* ----------------------------------------------------------------------------- * Language::addSymbol() * * Adds a symbol entry into the target language symbol tables. * Returns 1 if the symbol is added successfully. * Prints an error message and returns 0 if a conflict occurs. * The scope is optional for target languages and if supplied must be a fully * qualified scope and the symbol s must not contain any scope qualifiers. * ----------------------------------------------------------------------------- */ int Language::addSymbol(const String *s, const Node *n, const_String_or_char_ptr scope) { //Printf( stdout, "addSymbol: %s %s\n", s, scope ); Hash *symbols = Getattr(symtabs, scope ? scope : ""); if (!symbols) { symbols = symbolAddScope(scope); } else { Node *c = Getattr(symbols, s); if (c && (c != n)) { if (scope && Len(scope) > 0) Swig_error(input_file, line_number, "'%s' is multiply defined in the generated target language module in scope '%s'.\n", s, scope); else Swig_error(input_file, line_number, "'%s' is multiply defined in the generated target language module.\n", s); Swig_error(Getfile(c), Getline(c), "Previous declaration of '%s'\n", s); return 0; } } Setattr(symbols, s, n); return 1; } /* ----------------------------------------------------------------------------- * Language::addInterfaceSymbol() * * Adds a symbol entry into the target language symbol tables - for the interface * feature only. * Returns 1 if the symbol is added successfully. * The scope is as per addSymbol. * ----------------------------------------------------------------------------- */ int Language::addInterfaceSymbol(const String *interface_name, Node *n, const_String_or_char_ptr scope) { if (interface_name) { Node *existing_symbol = symbolLookup(interface_name, scope); if (existing_symbol) { String *proxy_class_name = Getattr(n, "sym:name"); Swig_error(input_file, line_number, "The interface feature name '%s' for proxy class '%s' is already defined in the generated target language module in scope '%s'.\n", interface_name, proxy_class_name, scope); Swig_error(Getfile(existing_symbol), Getline(existing_symbol), "Previous declaration of '%s'\n", interface_name); return 0; } if (!addSymbol(interface_name, n, scope)) return 0; } return 1; } /* ----------------------------------------------------------------------------- * Language::symbolAddScope() * * Creates a scope (symbols Hash) for given name. This method is auxiliary, * you don't have to call it - addSymbols will lazily create scopes automatically. * If scope with given name already exists, then do nothing. * Returns newly created (or already existing) scope. * ----------------------------------------------------------------------------- */ Hash* Language::symbolAddScope(const_String_or_char_ptr scope) { Hash *symbols = symbolScopeLookup(scope); if(!symbols) { // The order in which the following code is executed is important. In the Language // constructor addScope("") is called to create a top level scope. // Thus we must first add a symbols hash to symtab and only then add pseudo // symbols to the top-level scope. // New scope which has not been added by the target language - lazily created. symbols = NewHash(); Setattr(symtabs, scope, symbols); // Add the new scope as a symbol in the top level scope. // Alternatively the target language must add it in before attempting to add symbols into the scope. const_String_or_char_ptr top_scope = ""; Hash *topscope_symbols = Getattr(symtabs, top_scope); Hash *pseudo_symbol = NewHash(); Setattr(pseudo_symbol, "sym:scope", "1"); Setattr(topscope_symbols, scope, pseudo_symbol); } return symbols; } /* ----------------------------------------------------------------------------- * Language::symbolScopeLookup() * * Lookup and returns a symtable (hash) representing given scope. Hash contains * all symbols in this scope. * ----------------------------------------------------------------------------- */ Hash* Language::symbolScopeLookup( const_String_or_char_ptr scope ) { Hash *symbols = Getattr(symtabs, scope ? scope : ""); return symbols; } /* ----------------------------------------------------------------------------- * Language::symbolScopePseudoSymbolLookup() * * For every scope there is a special pseudo-symbol in the top scope (""). It * exists solely to detect name clashes. This pseudo symbol may contain a few properties, * but more could be added. This is also true for the top level scope (""). * It contains a pseudo symbol with name "" (empty). Pseudo symbol contains the * following properties: * sym:scope = "1" - a flag that this is a scope pseudo symbol * * Pseudo symbols are a Hash*, not a Node*. * There is no difference from symbolLookup() method except for signature * and return type. * ----------------------------------------------------------------------------- */ Hash* Language::symbolScopePseudoSymbolLookup( const_String_or_char_ptr scope ) { /* Getting top scope */ const_String_or_char_ptr top_scope = ""; Hash *symbols = Getattr(symtabs, top_scope); return Getattr(symbols, scope); } /* ----------------------------------------------------------------------------- * Language::dumpSymbols() * ----------------------------------------------------------------------------- */ void Language::dumpSymbols() { Printf(stdout, "LANGUAGE SYMBOLS start =======================================\n"); Node *table = symtabs; Iterator ki = First(table); while (ki.key) { String *k = ki.key; Printf(stdout, "===================================================\n"); Printf(stdout, "%s -\n", k); { Symtab *symtab = Getattr(table, k); Iterator it = First(symtab); while (it.key) { String *symname = it.key; Printf(stdout, " %s\n", symname); it = Next(it); } } ki = Next(ki); } Printf(stdout, "LANGUAGE SYMBOLS finish =======================================\n"); } /* ----------------------------------------------------------------------------- * Language::symbolLookup() * ----------------------------------------------------------------------------- */ Node *Language::symbolLookup(const String *s, const_String_or_char_ptr scope) { Hash *symbols = Getattr(symtabs, scope ? scope : ""); if (!symbols) { return NULL; } return Getattr(symbols, s); } /* ----------------------------------------------------------------------------- * Language::classLookup() * * Tries to locate a class from a type definition * ----------------------------------------------------------------------------- */ Node *Language::classLookup(const SwigType *s) const { Node *n = 0; /* Look in hash of cached values */ n = Getattr(classtypes, s); if (!n) { Symtab *stab = 0; SwigType *ty1 = SwigType_typedef_resolve_all(s); SwigType *ty2 = SwigType_strip_qualifiers(ty1); String *base = SwigType_base(ty2); Replaceall(base, "class ", ""); Replaceall(base, "struct ", ""); Replaceall(base, "union ", ""); if (strncmp(Char(base), "::", 2) == 0) { String *oldbase = base; base = NewString(Char(base) + 2); Delete(oldbase); } String *prefix = SwigType_prefix(ty2); /* Do a symbol table search on the base type */ while (!n) { Hash *nstab; n = Swig_symbol_clookup(base, stab); if (!n) break; if (Strcmp(nodeType(n), "class") == 0) break; n = parentNode(n); if (!n) break; nstab = Getattr(n, "sym:symtab"); n = 0; if ((!nstab) || (nstab == stab)) { break; } stab = nstab; } if (n) { /* Found a match. Look at the prefix. We only allow the cases where where we want a proxy class for the particular type */ bool acceptable_prefix = (Len(prefix) == 0) || // simple type (pass by value) (Strcmp(prefix, "p.") == 0) || // pointer (Strcmp(prefix, "r.") == 0) || // reference (Strcmp(prefix, "z.") == 0) || // rvalue reference SwigType_prefix_is_simple_1D_array(prefix); // Simple 1D array (not arrays of pointers/references) // Also accept pointer by const reference, not non-const pointer reference if (!acceptable_prefix && (Strcmp(prefix, "r.p.") == 0)) { Delete(prefix); prefix = SwigType_prefix(ty1); acceptable_prefix = (Strncmp(prefix, "r.q(const", 9) == 0); } if (acceptable_prefix) { SwigType *cs = Copy(s); Setattr(classtypes, cs, n); Delete(cs); } else { n = 0; } } Delete(prefix); Delete(base); Delete(ty2); Delete(ty1); } if (n && (GetFlag(n, "feature:ignore") || Getattr(n, "feature:onlychildren"))) { n = 0; } return n; } /* ----------------------------------------------------------------------------- * Language::enumLookup() * * Finds and returns the Node containing the enum declaration for the (enum) * type passed in. * ----------------------------------------------------------------------------- */ Node *Language::enumLookup(SwigType *s) { Node *n = 0; /* Look in hash of cached values */ n = Getattr(enumtypes, s); if (!n) { Symtab *stab = 0; SwigType *lt = SwigType_ltype(s); SwigType *ty1 = SwigType_typedef_resolve_all(lt); SwigType *ty2 = SwigType_strip_qualifiers(ty1); String *base = SwigType_base(ty2); Replaceall(base, "enum ", ""); String *prefix = SwigType_prefix(ty2); if (strncmp(Char(base), "::", 2) == 0) { String *oldbase = base; base = NewString(Char(base) + 2); Delete(oldbase); } /* Look for type in symbol table */ while (!n) { Hash *nstab; n = Swig_symbol_clookup(base, stab); if (!n) break; if (Equal(nodeType(n), "enum")) break; if (Equal(nodeType(n), "enumforward") && GetFlag(n, "enumMissing")) break; n = parentNode(n); if (!n) break; nstab = Getattr(n, "sym:symtab"); n = 0; if ((!nstab) || (nstab == stab)) { break; } stab = nstab; } if (n) { /* Found a match. Look at the prefix. We only allow simple types. */ if (Len(prefix) == 0) { /* Simple type */ Setattr(enumtypes, Copy(s), n); } else { n = 0; } } Delete(prefix); Delete(base); Delete(ty2); Delete(ty1); Delete(lt); } if (n && (GetFlag(n, "feature:ignore"))) { n = 0; } return n; } /* ----------------------------------------------------------------------------- * Language::allow_overloading() * ----------------------------------------------------------------------------- */ void Language::allow_overloading(int val) { overloading = val; } /* ----------------------------------------------------------------------------- * Language::allow_multiple_input() * ----------------------------------------------------------------------------- */ void Language::allow_multiple_input(int val) { multiinput = val; } /* ----------------------------------------------------------------------------- * Language::enable_cplus_runtime_mode() * ----------------------------------------------------------------------------- */ void Language::enable_cplus_runtime_mode() { cplus_runtime = 1; } /* ----------------------------------------------------------------------------- * Language::cplus_runtime_mode() * ----------------------------------------------------------------------------- */ int Language::cplus_runtime_mode() { return cplus_runtime; } /* ----------------------------------------------------------------------------- * Language::allow_directors() * ----------------------------------------------------------------------------- */ void Language::allow_directors(int val) { directors = val; } /* ----------------------------------------------------------------------------- * Language::directorsEnabled() * ----------------------------------------------------------------------------- */ int Language::directorsEnabled() const { return director_language && CPlusPlus && (directors || director_mode); } /* ----------------------------------------------------------------------------- * Language::allow_dirprot() * ----------------------------------------------------------------------------- */ void Language::allow_dirprot(int val) { director_protected_mode = val; } /* ----------------------------------------------------------------------------- * Language::allow_allprotected() * ----------------------------------------------------------------------------- */ void Language::allow_allprotected(int val) { all_protected_mode = val; } /* ----------------------------------------------------------------------------- * Language::dirprot_mode() * ----------------------------------------------------------------------------- */ int Language::dirprot_mode() const { return directorsEnabled() ? director_protected_mode : 0; } /* ----------------------------------------------------------------------------- * Language::need_nonpublic_ctor() * ----------------------------------------------------------------------------- */ int Language::need_nonpublic_ctor(Node *n) { /* detects when a protected constructor is needed, which is always the case if 'dirprot' mode is used. However, if that is not the case, we will try to strictly emit what is minimal to don't break the generated, while preserving compatibility with java, which always try to emit the default constructor. rules: - when dirprot mode is used, the protected constructors are always needed. - the protected default constructor is always needed. - if dirprot mode is not used, the protected constructors will be needed only if: - there is no any public constructor in the class, and - there is no protected default constructor In that case, all the declared protected constructors are needed since we don't know which one to pick up. Note: given all the complications here, I am always in favor to always enable 'dirprot', since is the C++ idea of protected members, and use %ignore for the method you don't whan to add in the director class. */ if (directorsEnabled()) { if (is_protected(n)) { if (dirprot_mode()) { /* when using dirprot mode, the protected constructors are always needed */ return 1; } else { int is_default_ctor = !ParmList_numrequired(Getattr(n, "parms")); if (is_default_ctor) { /* the default protected constructor is always needed, for java compatibility */ return 1; } else { /* check if there is a public constructor */ Node *parent = Swig_methodclass(n); int public_ctor = Getattr(parent, "allocate:default_constructor") || Getattr(parent, "allocate:public_constructor"); if (!public_ctor) { /* if not, the protected constructor will be needed only if there is no protected default constructor declared */ int no_prot_default_ctor = !Getattr(parent, "allocate:default_base_constructor"); return no_prot_default_ctor; } } } } } return 0; } /* ----------------------------------------------------------------------------- * Language::need_nonpublic_member() * ----------------------------------------------------------------------------- */ int Language::need_nonpublic_member(Node *n) { if (directorsEnabled() && DirectorClassName) { if (is_protected(n)) { if (dirprot_mode()) { /* when using dirprot mode, the protected members are always needed. */ return 1; } else { /* if the method is pure virtual, we need it. */ int pure_virtual = (Cmp(Getattr(n, "value"), "0") == 0); return pure_virtual; } } } return 0; } /* ----------------------------------------------------------------------------- * Language::is_smart_pointer() * ----------------------------------------------------------------------------- */ int Language::is_smart_pointer() const { return SmartPointer; } /* ----------------------------------------------------------------------------- * Language::makeParameterName() * * Inputs: * n - Node * p - parameter node * arg_num - parameter argument number * setter - set this flag when wrapping variables * Return: * arg - a unique parameter name * ----------------------------------------------------------------------------- */ String *Language::makeParameterName(Node *n, Parm *p, int arg_num, bool setter) const { String *arg = 0; String *pn = Getattr(p, "name"); // Use C parameter name unless it is a duplicate or an empty parameter name int count = 0; ParmList *plist = Getattr(n, "parms"); while (plist) { if ((Cmp(pn, Getattr(plist, "name")) == 0)) count++; plist = nextSibling(plist); } String *wrn = pn ? Swig_name_warning(p, 0, pn, 0) : 0; arg = (!pn || (count > 1) || wrn) ? NewStringf("arg%d", arg_num) : Copy(pn); if (setter && Cmp(arg, "self") != 0) { // Some languages (C#) insist on calling the input variable "value" while // others (D, Java) could, in principle, use something different but this // would require more work, and so we just use "value" for them too. // For setters the parameter name sometimes includes C++ scope resolution which needs removing. Delete(arg); arg = NewString("value"); } return arg; } /* ----------------------------------------------------------------------------- * Language::() * ----------------------------------------------------------------------------- */ bool Language::isNonVirtualProtectedAccess(Node *n) const { // Ideally is_non_virtual_protected_access() would contain all this logic, see // comments therein about vtable. return DirectorClassName && is_non_virtual_protected_access(n); } /* ----------------------------------------------------------------------------- * Language::extraDirectorProtectedCPPMethodsRequired() * ----------------------------------------------------------------------------- */ bool Language::extraDirectorProtectedCPPMethodsRequired() const { return true; } /* ----------------------------------------------------------------------------- * Language::nestedClassesSupport() * ----------------------------------------------------------------------------- */ Language::NestedClassSupport Language::nestedClassesSupport() const { return NCS_Unknown; } /* ----------------------------------------------------------------------------- * Language::kwargsSupport() * ----------------------------------------------------------------------------- */ bool Language::kwargsSupport() const { return false; } /* ----------------------------------------------------------------------------- * Language::is_wrapping_class() * ----------------------------------------------------------------------------- */ int Language::is_wrapping_class() const { return InClass; } /* ----------------------------------------------------------------------------- * Language::getCurrentClass() * ----------------------------------------------------------------------------- */ Node *Language::getCurrentClass() const { return CurrentClass; } /* ----------------------------------------------------------------------------- * Language::getNSpace() * ----------------------------------------------------------------------------- */ String *Language::getNSpace() const { return NSpace; } /* ----------------------------------------------------------------------------- * Language::getClassName() * ----------------------------------------------------------------------------- */ String *Language::getClassName() const { return ClassName; } /* ----------------------------------------------------------------------------- * Language::getClassPrefix() * ----------------------------------------------------------------------------- */ String *Language::getClassPrefix() const { return ClassPrefix; } /* ----------------------------------------------------------------------------- * Language::getEnumClassPrefix() * ----------------------------------------------------------------------------- */ String *Language::getEnumClassPrefix() const { return EnumClassPrefix; } /* ----------------------------------------------------------------------------- * Language::getClassType() * ----------------------------------------------------------------------------- */ String *Language::getClassType() const { return ClassType; } /* ----------------------------------------------------------------------------- * Language::abstractClassTest() * ----------------------------------------------------------------------------- */ //#define SWIG_DEBUG int Language::abstractClassTest(Node *n) { /* check for non public operator new */ if (GetFlag(n, "feature:notabstract")) return 0; if (Getattr(n, "allocate:nonew")) return 1; // A class cannot be instantiated if one of its bases has a private destructor // Note that if the above does not hold the class can be instantiated if its own destructor is private List *bases = Getattr(n, "bases"); if (bases) { for (int i = 0; i < Len(bases); i++) { Node *b = Getitem(bases, i); if (GetFlag(b, "allocate:private_destructor")) return 1; } } /* now check for the rest */ List *abstracts = Getattr(n, "abstracts"); if (!abstracts) return 0; int labs = Len(abstracts); #ifdef SWIG_DEBUG List *allbases = Getattr(n, "allbases"); Printf(stderr, "testing %s %d %d\n", Getattr(n, "name"), labs, Len(allbases)); #endif if (!labs) return 0; /*strange, but need to be fixed */ if (abstracts && !directorsEnabled()) return 1; if (!GetFlag(n, "feature:director")) return 1; Node *dirabstract = 0; Node *vtable = Getattr(n, "vtable"); if (vtable) { #ifdef SWIG_DEBUG Printf(stderr, "vtable %s %d %d\n", Getattr(n, "name"), Len(vtable), labs); #endif for (int i = 0; i < labs; i++) { Node *ni = Getitem(abstracts, i); Node *method_id = vtable_method_id(ni); if (!method_id) continue; bool exists_item = false; int len = Len(vtable); for (int i = 0; i < len; i++) { Node *item = Getitem(vtable, i); String *check_item = Getattr(item, "vmid"); if (Strcmp(method_id, check_item) == 0) { exists_item = true; break; } } #ifdef SWIG_DEBUG Printf(stderr, "method %s %d\n", method_id, exists_item ? 1 : 0); #endif Delete(method_id); if (!exists_item) { dirabstract = ni; break; } } if (dirabstract) { if (is_public(dirabstract)) { Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' is abstract, abstract method '%s' is not accesible, maybe due to multiple inheritance or 'nodirector' feature\n", SwigType_namestr(Getattr(n, "name")), Getattr(dirabstract, "name")); } else { Swig_warning(WARN_LANG_DIRECTOR_ABSTRACT, Getfile(n), Getline(n), "Director class '%s' is abstract, abstract method '%s' is private\n", SwigType_namestr(Getattr(n, "name")), Getattr(dirabstract, "name")); } return 1; } } else { return 1; } return 0; } void Language::setSubclassInstanceCheck(String *nc) { none_comparison = nc; } void Language::setOverloadResolutionTemplates(String *argc, String *argv) { Delete(argc_template_string); argc_template_string = Copy(argc); Delete(argv_template_string); argv_template_string = Copy(argv); } int Language::is_assignable(Node *n) { if (GetFlag(n, "feature:immutable")) return 0; SwigType *type = Getattr(n, "type"); Node *cn = 0; SwigType *ftd = SwigType_typedef_resolve_all(type); SwigType *td = SwigType_strip_qualifiers(ftd); if (SwigType_type(td) == T_USER) { cn = Swig_symbol_clookup(td, 0); if (cn) { if ((Strcmp(nodeType(cn), "class") == 0)) { if (Getattr(cn, "allocate:noassign")) { SetFlag(n, "feature:immutable"); Delete(ftd); Delete(td); return 0; } } } } Delete(ftd); Delete(td); return 1; } String *Language::runtimeCode() { return NewString(""); } String *Language::defaultExternalRuntimeFilename() { return 0; } /* ----------------------------------------------------------------------------- * Language::replaceSpecialVariables() * * Language modules should implement this if special variables are to be handled * correctly in the $typemap(...) special variable macro. * method - typemap method name * tm - string containing typemap contents * parm - a parameter describing the typemap type to be handled * ----------------------------------------------------------------------------- */ void Language::replaceSpecialVariables(String *method, String *tm, Parm *parm) { (void)method; (void)tm; (void)parm; } Language *Language::instance() { return this_; } Hash *Language::getClassHash() const { return classhash; } swig-3.0.12/Source/Modules/main.cxx0000664000175000017500000013016613042756442016764 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * main.cxx * * Main entry point to the SWIG core. * ----------------------------------------------------------------------------- */ #include "swigconfig.h" #if defined(_WIN32) #define WIN32_LEAN_AND_MEAN #include #endif #include "swigmod.h" #include "swigwarn.h" #include "cparse.h" #include #include // for INT_MAX // Global variables static Language *lang = 0; // Language method int CPlusPlus = 0; int Extend = 0; // Extend flag int ForceExtern = 0; // Force extern mode int GenerateDefault = 1; // Generate default constructors int Verbose = 0; int AddExtern = 0; int NoExcept = 0; int SwigRuntime = 0; // 0 = no option, 1 = -runtime, 2 = -noruntime /* Suppress warning messages for private inheritance, preprocessor evaluation etc... WARN_PP_EVALUATION 202 WARN_PARSE_PRIVATE_INHERIT 309 WARN_TYPE_ABSTRACT 403 WARN_LANG_OVERLOAD_CONST 512 WARN_PARSE_BUILTIN_NAME 321 WARN_PARSE_REDUNDANT 322 */ #define EXTRA_WARNINGS "202,309,403,512,321,322" extern "C" { extern String *ModuleName; extern int ignore_nested_classes; extern int kwargs_supported; } /* usage string split into multiple parts otherwise string is too big for some compilers */ /* naming conventions for commandline options - no underscores, no capital letters, join words together * except when using a common prefix, then use '-' to separate, eg the debug-xxx options */ static const char *usage1 = (const char *) "\ \nGeneral Options\n\ -addextern - Add extra extern declarations\n\ -c++ - Enable C++ processing\n\ -co - Check out of the SWIG library\n\ -copyctor - Automatically generate copy constructors wherever possible\n\ -cpperraswarn - Treat the preprocessor #error statement as #warning (default)\n\ -cppext - Change file extension of generated C++ files to \n\ (default is cxx, except for PHP5 which uses cpp)\n\ -copyright - Display copyright notices\n\ -debug-classes - Display information about the classes found in the interface\n\ -debug-module - Display module parse tree at stages 1-4, is a csv list of stages\n\ -debug-symtabs - Display symbol tables information\n\ -debug-symbols - Display target language symbols in the symbol tables\n\ -debug-csymbols - Display C symbols in the symbol tables\n\ -debug-lsymbols - Display target language layer symbols\n\ -debug-tags - Display information about the tags found in the interface\n\ -debug-template - Display information for debugging templates\n\ -debug-top - Display entire parse tree at stages 1-4, is a csv list of stages\n\ -debug-typedef - Display information about the types and typedefs in the interface\n\ -debug-typemap - Display typemap debugging information\n\ -debug-tmsearch - Display typemap search debugging information\n\ -debug-tmused - Display typemaps used debugging information\n\ -directors - Turn on director mode for all the classes, mainly for testing\n\ -dirprot - Turn on wrapping of protected members for director classes (default)\n\ -D - Define a symbol (for conditional compilation)\n\ "; static const char *usage2 = (const char *) "\ -E - Preprocess only, does not generate wrapper code\n\ -external-runtime [file] - Export the SWIG runtime stack\n\ -fakeversion - Make SWIG fake the program version number to \n\ -fcompact - Compile in compact mode\n\ -features - Set global features, where is a comma separated list of\n\ features, eg -features directors,autodoc=1\n\ If no explicit value is given to the feature, a default of 1 is used\n\ -fastdispatch - Enable fast dispatch mode to produce faster overload dispatcher code\n\ -Fmicrosoft - Display error/warning messages in Microsoft format\n\ -Fstandard - Display error/warning messages in commonly used format\n\ -fvirtual - Compile in virtual elimination mode\n\ -help - This output\n\ -I- - Don't search the current directory\n\ -I

- Look for SWIG files in directory \n\ -ignoremissing - Ignore missing include files\n\ -importall - Follow all #include statements as imports\n\ -includeall - Follow all #include statements\n\ -l - Include SWIG library file \n\ "; static const char *usage3 = (const char *) "\ -macroerrors - Report errors inside macros\n\ -makedefault - Create default constructors/destructors (the default)\n\ -M - List all dependencies\n\ -MD - Is equivalent to `-M -MF ', except `-E' is not implied\n\ -MF - Generate dependencies into and continue generating wrappers\n\ -MM - List dependencies, but omit files in SWIG library\n\ -MMD - Like `-MD', but omit files in SWIG library\n\ -module - Set module name to \n\ -MP - Generate phony targets for all dependencies\n\ -MT - Set the target of the rule emitted by dependency generation\n\ -nocontract - Turn off contract checking\n\ -nocpperraswarn - Do not treat the preprocessor #error statement as #warning\n\ -nodefault - Do not generate default constructors nor default destructors\n\ -nodefaultctor - Do not generate implicit default constructors\n\ -nodefaultdtor - Do not generate implicit default destructors\n\ -nodirprot - Do not wrap director protected members\n\ -noexcept - Do not wrap exception specifiers\n\ -nofastdispatch - Disable fast dispatch mode (default)\n\ -nopreprocess - Skip the preprocessor step\n\ -notemplatereduce - Disable reduction of the typedefs in templates\n\ "; static const char *usage4 = (const char *) "\ -O - Enable the optimization options: \n\ -fastdispatch -fvirtual \n\ -o - Set name of C/C++ output file to \n\ -oh - Set name of C++ output header file for directors to \n\ -outcurrentdir - Set default output dir to current dir instead of input file's path\n\ -outdir - Set language specific files output directory to \n\ -pcreversion - Display PCRE version information\n\ -small - Compile in virtual elimination & compact mode\n\ -swiglib - Report location of SWIG library and exit\n\ -templatereduce - Reduce all the typedefs in templates\n\ -v - Run in verbose mode\n\ -version - Display SWIG version number\n\ -Wall - Remove all warning suppression, also implies -Wextra\n\ -Wallkw - Enable keyword warnings for all the supported languages\n\ -Werror - Treat warnings as errors\n\ -Wextra - Adds the following additional warnings: " EXTRA_WARNINGS "\n\ -w - Suppress/add warning messages, eg -w401,+321 - see Warnings.html\n\ -xmlout - Write XML version of the parse tree to after normal processing\n\ \n\ Options can also be defined using the SWIG_FEATURES environment variable, for example:\n\ \n\ $ SWIG_FEATURES=\"-Wall\"\n\ $ export SWIG_FEATURES\n\ $ swig -python interface.i\n\ \n\ is equivalent to: \n\ \n\ $ swig -Wall -python interface.i \n\ \n\ \n"; // Local variables static String *LangSubDir = 0; // Target language library subdirectory static String *SwigLib = 0; // Library directory static String *SwigLibWinUnix = 0; // Extra library directory on Windows static int freeze = 0; static String *lang_config = 0; static const char *hpp_extension = "h"; static const char *cpp_extension = "cxx"; static const char *depends_extension = "d"; static String *outdir = 0; static String *xmlout = 0; static int outcurrentdir = 0; static int help = 0; static int checkout = 0; static int cpp_only = 0; static int no_cpp = 0; static String *outfile_name = 0; static String *outfile_name_h = 0; static int tm_debug = 0; static int dump_symtabs = 0; static int dump_symbols = 0; static int dump_csymbols = 0; static int dump_lang_symbols = 0; static int dump_tags = 0; static int dump_module = 0; static int dump_top = 0; static int dump_xml = 0; static int browse = 0; static int dump_typedef = 0; static int dump_classes = 0; static int werror = 0; static int depend = 0; static int depend_only = 0; static int depend_phony = 0; static int memory_debug = 0; static int allkw = 0; static DOH *cpps = 0; static String *dependencies_file = 0; static String *dependencies_target = 0; static int external_runtime = 0; static String *external_runtime_name = 0; enum { STAGE1=1, STAGE2=2, STAGE3=4, STAGE4=8, STAGEOVERFLOW=16 }; static List *libfiles = 0; static List *all_output_files = 0; /* ----------------------------------------------------------------------------- * check_extension() * * Checks the extension of a file to see if we should emit extern declarations. * ----------------------------------------------------------------------------- */ static bool check_extension(String *filename) { bool wanted = false; const char *name = Char(filename); if (!name) return 0; String *extension = Swig_file_extension(name); const char *c = Char(extension); if ((strcmp(c, ".c") == 0) || (strcmp(c, ".C") == 0) || (strcmp(c, ".cc") == 0) || (strcmp(c, ".cxx") == 0) || (strcmp(c, ".c++") == 0) || (strcmp(c, ".cpp") == 0)) { wanted = true; } Delete(extension); return wanted; } /* ----------------------------------------------------------------------------- * install_opts() * * Install all command line options as preprocessor symbols * ----------------------------------------------------------------------------- */ static void install_opts(int argc, char *argv[]) { int i; int noopt = 0; char *c; for (i = 1; i < (argc - 1); i++) { if (argv[i]) { if ((*argv[i] == '-') && (!isupper(*(argv[i] + 1)))) { String *opt = NewStringf("SWIGOPT%(upper)s", argv[i]); Replaceall(opt, "-", "_"); c = Char(opt); noopt = 0; while (*c) { if (!(isalnum(*c) || (*c == '_'))) { noopt = 1; break; } c++; } if (((i + 1) < (argc - 1)) && (argv[i + 1]) && (*argv[i + 1] != '-')) { Printf(opt, " %s", argv[i + 1]); i++; } else { Printf(opt, " 1"); } if (!noopt) { /* Printf(stdout,"%s\n", opt); */ Preprocessor_define(opt, 0); } Delete(opt); } } } } /* ----------------------------------------------------------------------------- * decode_numbers_list() * * Decode comma separated list into a binary number of the inputs or'd together * eg list="1,4" will return (2^0 || 2^3) = 0x1001 * ----------------------------------------------------------------------------- */ static unsigned int decode_numbers_list(String *numlist) { unsigned int decoded_number = 0; if (numlist) { List *numbers = Split(numlist, ',', INT_MAX); if (numbers && Len(numbers) > 0) { for (Iterator it = First(numbers); it.item; it = Next(it)) { String *numstring = it.item; // TODO: check that it is a number int number = atoi(Char(numstring)); if (number > 0 && number <= 16) { decoded_number |= (1 << (number-1)); } } } } return decoded_number; } /* ----------------------------------------------------------------------------- * Sets the output directory for language specific (proxy) files from the * C wrapper file if not set and corrects the directory name and adds a trailing * file separator if necessary. * ----------------------------------------------------------------------------- */ static void configure_outdir(const String *c_wrapper_outfile) { // Use the C wrapper file's directory if the output directory has not been set by user if (!outdir || Len(outdir) == 0) outdir = Swig_file_dirname(c_wrapper_outfile); Swig_filename_correct(outdir); // Add trailing file delimiter if not present in output directory name if (Len(outdir) > 0) { const char *outd = Char(outdir); if (strcmp(outd + strlen(outd) - strlen(SWIG_FILE_DELIMITER), SWIG_FILE_DELIMITER) != 0) Printv(outdir, SWIG_FILE_DELIMITER, NIL); } } /* This function sets the name of the configuration file */ void SWIG_config_file(const_String_or_char_ptr filename) { lang_config = NewString(filename); } /* Sets the target language subdirectory name */ void SWIG_library_directory(const char *subdirectory) { LangSubDir = NewString(subdirectory); } // Returns the directory for generating language specific files (non C/C++ files) const String *SWIG_output_directory() { assert(outdir); return outdir; } void SWIG_config_cppext(const char *ext) { cpp_extension = ext; } List *SWIG_output_files() { assert(all_output_files); return all_output_files; } void SWIG_setfeature(const char *cfeature, const char *cvalue) { Hash *features_hash = Swig_cparse_features(); String *name = NewString(""); String *fname = NewString(cfeature); String *fvalue = NewString(cvalue); Swig_feature_set(features_hash, name, 0, fname, fvalue, 0); Delete(name); Delete(fname); Delete(fvalue); } void SWIG_setfeatures(const char *c) { char feature[64]; char *fb = feature; char *fe = fb + 63; Hash *features_hash = Swig_cparse_features(); String *name = NewString(""); /* Printf(stderr,"all features %s\n", c); */ while (*c) { char *f = fb; String *fname = NewString("feature:"); String *fvalue = NewString(""); while ((f != fe) && *c != '=' && *c != ',' && *c) { *(f++) = *(c++); } *f = 0; Printf(fname, "%s", feature); if (*c && *(c++) == '=') { char value[64]; char *v = value; char *ve = v + 63; while ((v != ve) && *c != ',' && *c && !isspace(*c)) { *(v++) = *(c++); } *v = 0; Printf(fvalue, "%s", value); } else { Printf(fvalue, "1"); } /* Printf(stderr,"%s %s\n", fname, fvalue); */ Swig_feature_set(features_hash, name, 0, fname, fvalue, 0); Delete(fname); Delete(fvalue); } Delete(name); } /* This function handles the -external-runtime command option */ static void SWIG_dump_runtime() { String *outfile; File *runtime; String *s; outfile = external_runtime_name; if (!outfile) { outfile = lang->defaultExternalRuntimeFilename(); if (!outfile) { Printf(stderr, "*** Please provide a filename for the external runtime\n"); SWIG_exit(EXIT_FAILURE); } } runtime = NewFile(outfile, "w", SWIG_output_files()); if (!runtime) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } Swig_banner(runtime); Printf(runtime, "\n"); s = Swig_include_sys("swiglabels.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swiglabels.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("swigerrors.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swigerrors.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("swigrun.swg"); if (!s) { Printf(stderr, "*** Unable to open 'swigrun.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); s = lang->runtimeCode(); Printf(runtime, "%s", s); Delete(s); s = Swig_include_sys("runtime.swg"); if (!s) { Printf(stderr, "*** Unable to open 'runtime.swg'\n"); Delete(runtime); SWIG_exit(EXIT_FAILURE); } Printf(runtime, "%s", s); Delete(s); Delete(runtime); SWIG_exit(EXIT_SUCCESS); } void SWIG_getoptions(int argc, char *argv[]) { int i; // Get options for (i = 1; i < argc; i++) { if (argv[i] && !Swig_check_marked(i)) { if (strncmp(argv[i], "-I-", 3) == 0) { // Don't push/pop directories Swig_set_push_dir(0); Swig_mark_arg(i); } else if (strncmp(argv[i], "-I", 2) == 0) { // Add a new directory search path char *a = Swig_copy_string(argv[i] + 2); Swig_add_directory((DOH *) a); free(a); Swig_mark_arg(i); } else if (strncmp(argv[i], "-D", 2) == 0) { String *d = NewString(argv[i] + 2); Replace(d, "=", " ", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); Preprocessor_define((DOH *) d, 0); Delete(d); // Create a symbol Swig_mark_arg(i); } else if (strcmp(argv[i], "-E") == 0) { cpp_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-nopreprocess") == 0) { no_cpp = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-verbose") == 0) || (strcmp(argv[i], "-v") == 0)) { Verbose = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-c++") == 0) { CPlusPlus = 1; Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); Swig_cparse_cplusplus(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-c++out") == 0) { // Undocumented Swig_cparse_cplusplusout(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fcompact") == 0) { Wrapper_compact_print_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fvirtual") == 0) { Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-fastdispatch") == 0) { Wrapper_fast_dispatch_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nofastdispatch") == 0) { Wrapper_fast_dispatch_mode_set(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-naturalvar") == 0) { Wrapper_naturalvar_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-directors") == 0) { SWIG_setfeature("feature:director", "1"); Wrapper_director_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-dirprot") == 0) { Wrapper_director_protected_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nodirprot") == 0) { Wrapper_director_protected_mode_set(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-pcreversion") == 0) { String *version = Swig_pcre_version(); Printf(stdout, "%s\n", version); Delete(version); Swig_mark_arg(i); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-small") == 0) { Wrapper_compact_print_mode_set(1); Wrapper_virtual_elimination_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-runtime") == 0) { // Used to also accept -c. removed in swig-1.3.36 Swig_mark_arg(i); Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n"); SwigRuntime = 1; } else if (strcmp(argv[i], "-noruntime") == 0) { Swig_mark_arg(i); Swig_warning(WARN_DEPRECATED_OPTC, "SWIG", 1, "-runtime, -noruntime command line options are deprecated.\n"); SwigRuntime = 2; } else if (strcmp(argv[i], "-external-runtime") == 0) { external_runtime = 1; Swig_mark_arg(i); if (argv[i + 1]) { external_runtime_name = NewString(argv[i + 1]); Swig_mark_arg(i + 1); i++; } } else if ((strcmp(argv[i], "-make_default") == 0) || (strcmp(argv[i], "-makedefault") == 0)) { GenerateDefault = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-no_default") == 0) || (strcmp(argv[i], "-nodefault") == 0)) { GenerateDefault = 0; Swig_warning(WARN_DEPRECATED_NODEFAULT, "SWIG", 1, "dangerous, use -nodefaultctor, -nodefaultdtor instead.\n"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-nodefaultctor") == 0)) { SWIG_setfeature("feature:nodefaultctor", "1"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-nodefaultdtor") == 0)) { SWIG_setfeature("feature:nodefaultdtor", "1"); Swig_mark_arg(i); } else if ((strcmp(argv[i], "-copyctor") == 0)) { SWIG_setfeature("feature:copyctor", "1"); Swig_mark_arg(i); } else if (strcmp(argv[i], "-noexcept") == 0) { NoExcept = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-noextern") == 0) { Swig_warning(WARN_DEPRECATED_NOEXTERN, "SWIG", 1, "-noextern command line option is deprecated; extern is no longer generated by default.\n"); AddExtern = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-addextern") == 0) { AddExtern = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-template") == 0) || (strcmp(argv[i], "-debug_template") == 0) || (strcmp(argv[i], "-show_templates") == 0)) { Swig_cparse_debug_templates(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-templatereduce") == 0) { SWIG_cparse_template_reduce(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-notemplatereduce") == 0) { SWIG_cparse_template_reduce(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-macroerrors") == 0) { Swig_cparse_follow_locators(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-swiglib") == 0) { Printf(stdout, "%s\n", SwigLib); if (SwigLibWinUnix) Printf(stdout, "%s\n", SwigLibWinUnix); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-o") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outfile_name = NewString(argv[i + 1]); Swig_filename_correct(outfile_name); if (!outfile_name_h || !dependencies_file) { char *ext = strrchr(Char(outfile_name), '.'); String *basename = ext ? NewStringWithSize(Char(outfile_name), (int)(Char(ext) - Char(outfile_name))) : NewString(outfile_name); if (!dependencies_file) { dependencies_file = NewStringf("%s.%s", basename, depends_extension); } if (!outfile_name_h) { Printf(basename, ".%s", hpp_extension); outfile_name_h = NewString(basename); } Delete(basename); } Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-oh") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outfile_name_h = NewString(argv[i + 1]); Swig_filename_correct(outfile_name_h); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-fakeversion") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { Swig_set_fakeversion(argv[i + 1]); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-version") == 0) { fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version()); fprintf(stdout, "\nCompiled with %s [%s]\n", SWIG_CXX, SWIG_PLATFORM); fprintf(stdout, "\nConfigured options: %cpcre\n", #ifdef HAVE_PCRE '+' #else '-' #endif ); fprintf(stdout, "\nPlease see %s for reporting bugs and further information\n", PACKAGE_BUGREPORT); SWIG_exit(EXIT_SUCCESS); } else if (strcmp(argv[i], "-copyright") == 0) { fprintf(stdout, "\nSWIG Version %s\n", Swig_package_version()); fprintf(stdout, "Copyright (c) 1995-1998\n"); fprintf(stdout, "University of Utah and the Regents of the University of California\n"); fprintf(stdout, "Copyright (c) 1998-2005\n"); fprintf(stdout, "University of Chicago\n"); fprintf(stdout, "Copyright (c) 2005-2006\n"); fprintf(stdout, "Arizona Board of Regents (University of Arizona)\n"); SWIG_exit(EXIT_SUCCESS); } else if (strncmp(argv[i], "-l", 2) == 0) { // Add a new directory search path Append(libfiles, argv[i] + 2); Swig_mark_arg(i); } else if (strcmp(argv[i], "-co") == 0) { checkout = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-features") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { SWIG_setfeatures(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-freeze") == 0) { freeze = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-includeall") == 0) { Preprocessor_include_all(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-importall") == 0) { Preprocessor_import_all(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-ignoremissing") == 0) { Preprocessor_ignore_missing(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-cpperraswarn") == 0) { Preprocessor_error_as_warning(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-nocpperraswarn") == 0) { Preprocessor_error_as_warning(0); Swig_mark_arg(i); } else if (strcmp(argv[i], "-cppext") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { SWIG_config_cppext(argv[i + 1]); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-debug-typemap") == 0) || (strcmp(argv[i], "-debug_typemap") == 0) || (strcmp(argv[i], "-tm_debug") == 0)) { tm_debug = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-tmsearch") == 0) { Swig_typemap_search_debug_set(); Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-tmused") == 0) { Swig_typemap_used_debug_set(); Swig_mark_arg(i); } else if (strcmp(argv[i], "-module") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { ModuleName = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-M") == 0) { depend = 1; depend_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MM") == 0) { depend = 2; depend_only = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MF") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { dependencies_file = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-MD") == 0) { depend = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MMD") == 0) { depend = 2; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MP") == 0) { depend_phony = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-MT") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { if (!dependencies_target) dependencies_target = NewString(argv[i + 1]); else Printf(dependencies_target, " %s", argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-outdir") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { outdir = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-outcurrentdir") == 0) { Swig_mark_arg(i); outcurrentdir = 1; } else if (strcmp(argv[i], "-Wall") == 0) { Swig_mark_arg(i); Swig_warnall(); } else if (strcmp(argv[i], "-Wallkw") == 0) { allkw = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Werror") == 0) { werror = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Wextra") == 0) { Swig_mark_arg(i); Swig_warnfilter(EXTRA_WARNINGS, 0); } else if (strncmp(argv[i], "-w", 2) == 0) { Swig_mark_arg(i); Swig_warnfilter(argv[i] + 2, 1); } else if (strcmp(argv[i], "-debug-symtabs") == 0) { dump_symtabs = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-symbols") == 0) { dump_symbols = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-csymbols") == 0) { dump_csymbols = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-lsymbols") == 0) { dump_lang_symbols = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-tags") == 0) || (strcmp(argv[i], "-dump_tags") == 0)) { dump_tags = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-debug-top") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { String *dump_list = NewString(argv[i + 1]); dump_top = decode_numbers_list(dump_list); if (dump_top < STAGE1 || dump_top >= STAGEOVERFLOW) Swig_arg_error(); else Swig_mark_arg(i + 1); Delete(dump_list); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-debug-module") == 0) { Swig_mark_arg(i); if (argv[i + 1]) { String *dump_list = NewString(argv[i + 1]); dump_module = decode_numbers_list(dump_list); if (dump_module < STAGE1 || dump_module >= STAGEOVERFLOW) Swig_arg_error(); else Swig_mark_arg(i + 1); Delete(dump_list); } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-dump_tree") == 0) || (strcmp(argv[i], "-dump_top") == 0)) { dump_top |= STAGE4; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_module") == 0) { dump_module |= STAGE4; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_parse_module") == 0) { dump_module |= STAGE1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_parse_top") == 0) { dump_top |= STAGE1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-dump_xml") == 0) { dump_xml = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-xmlout") == 0) { dump_xml = 1; Swig_mark_arg(i); if (argv[i + 1]) { xmlout = NewString(argv[i + 1]); Swig_mark_arg(i + 1); } else { Swig_arg_error(); } } else if (strcmp(argv[i], "-nocontract") == 0) { Swig_mark_arg(i); Swig_contract_mode_set(0); } else if (strcmp(argv[i], "-browse") == 0) { browse = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-typedef") == 0) || (strcmp(argv[i], "-dump_typedef") == 0)) { dump_typedef = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-classes") == 0) || (strcmp(argv[i], "-dump_classes") == 0)) { dump_classes = 1; Swig_mark_arg(i); } else if ((strcmp(argv[i], "-debug-memory") == 0) || (strcmp(argv[i], "-dump_memory") == 0)) { memory_debug = 1; Swig_mark_arg(i); } else if (strcmp(argv[i], "-Fstandard") == 0) { Swig_error_msg_format(EMF_STANDARD); Swig_mark_arg(i); } else if (strcmp(argv[i], "-Fmicrosoft") == 0) { Swig_error_msg_format(EMF_MICROSOFT); Swig_mark_arg(i); } else if (strcmp(argv[i], "-O") == 0) { Wrapper_virtual_elimination_mode_set(1); Wrapper_fast_dispatch_mode_set(1); Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage1, stdout); fputs(usage2, stdout); fputs(usage3, stdout); fputs(usage4, stdout); Swig_mark_arg(i); help = 1; } } } } int SWIG_main(int argc, char *argv[], Language *l) { char *c; /* Initialize the SWIG core */ Swig_init(); // Default warning suppression Swig_warnfilter(EXTRA_WARNINGS, 1); // Initialize the preprocessor Preprocessor_init(); lang = l; // Set up some default symbols (available in both SWIG interface files // and C files) Preprocessor_define((DOH *) "SWIG 1", 0); Preprocessor_define((DOH *) "__STDC__", 0); // Set the SWIG version value in format 0xAABBCC from package version expected to be in format A.B.C String *package_version = NewString(PACKAGE_VERSION); /* Note that the fakeversion has not been set at this point */ char *token = strtok(Char(package_version), "."); String *vers = NewString("SWIG_VERSION 0x"); int count = 0; while (token) { int len = (int)strlen(token); assert(len == 1 || len == 2); Printf(vers, "%s%s", (len == 1) ? "0" : "", token); token = strtok(NULL, "."); count++; } Delete(package_version); assert(count == 3); // Check version format is correct /* Turn on contracts */ Swig_contract_mode_set(1); Preprocessor_define(vers, 0); /* Turn off directors mode */ Wrapper_director_mode_set(0); Wrapper_director_protected_mode_set(1); // Inform the parser if the nested classes should be ignored unless explicitly told otherwise via feature:flatnested ignore_nested_classes = l->nestedClassesSupport() == Language::NCS_Unknown ? 1 : 0; kwargs_supported = l->kwargsSupport() ? 1 : 0; // Create Library search directories // Check for SWIG_LIB environment variable if ((c = getenv("SWIG_LIB")) == (char *) 0) { #if defined(_WIN32) char buf[MAX_PATH]; char *p; if (!(GetModuleFileName(0, buf, MAX_PATH) == 0 || (p = strrchr(buf, '\\')) == 0)) { *(p + 1) = '\0'; SwigLib = NewStringf("%sLib", buf); // Native windows installation path } else { SwigLib = NewStringf(""); // Unexpected error } if (Len(SWIG_LIB_WIN_UNIX) > 0) SwigLibWinUnix = NewString(SWIG_LIB_WIN_UNIX); // Unix installation path using a drive letter (for msys/mingw) #else SwigLib = NewString(SWIG_LIB); #endif } else { SwigLib = NewString(c); } libfiles = NewList(); all_output_files = NewList(); /* Check for SWIG_FEATURES environment variable */ SWIG_getoptions(argc, argv); // Define the __cplusplus symbol if (CPlusPlus) Preprocessor_define((DOH *) "__cplusplus __cplusplus", 0); // Parse language dependent options lang->main(argc, argv); if (help) { Printf(stdout, "\nNote: 'swig - -help' displays options for a specific target language.\n\n"); SWIG_exit(EXIT_SUCCESS); // Exit if we're in help mode } // Check all of the options to make sure we're cool. // Don't check for an input file if -external-runtime is passed Swig_check_options(external_runtime ? 0 : 1); if (CPlusPlus && cparse_cplusplusout) { Printf(stderr, "The -c++out option is for C input but C++ input has been requested via -c++\n"); SWIG_exit(EXIT_FAILURE); } install_opts(argc, argv); // Add language dependent directory to the search path { String *rl = NewString(""); Printf(rl, ".%sswig_lib%s%s", SWIG_FILE_DELIMITER, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); if (SwigLibWinUnix) { rl = NewString(""); Printf(rl, "%s%s%s", SwigLibWinUnix, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); } rl = NewString(""); Printf(rl, "%s%s%s", SwigLib, SWIG_FILE_DELIMITER, LangSubDir); Swig_add_directory(rl); } Swig_add_directory((String *) "." SWIG_FILE_DELIMITER "swig_lib"); if (SwigLibWinUnix) Swig_add_directory((String *) SwigLibWinUnix); Swig_add_directory(SwigLib); if (Verbose) { Printf(stdout, "Language subdirectory: %s\n", LangSubDir); Printf(stdout, "Search paths:\n"); List *sp = Swig_search_path(); Iterator s; for (s = First(sp); s.item; s = Next(s)) { Printf(stdout, " %s\n", s.item); } } // handle the -external-runtime argument if (external_runtime) SWIG_dump_runtime(); // If we made it this far, looks good. go for it.... input_file = NewString(argv[argc - 1]); Swig_filename_correct(input_file); // If the user has requested to check out a file, handle that if (checkout) { DOH *s; String *outfile = input_file; if (outfile_name) outfile = outfile_name; if (Verbose) Printf(stdout, "Handling checkout...\n"); s = Swig_include(input_file); if (!s) { Printf(stderr, "Unable to locate '%s' in the SWIG library.\n", input_file); } else { FILE *f = Swig_open(outfile); if (f) { fclose(f); Printf(stderr, "File '%s' already exists. Checkout aborted.\n", outfile); } else { File *f_outfile = NewFile(outfile, "w", SWIG_output_files()); if (!f_outfile) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } else { if (Verbose) Printf(stdout, "'%s' checked out from the SWIG library.\n", outfile); Printv(f_outfile, s, NIL); Delete(f_outfile); } } } } else { // Run the preprocessor if (Verbose) Printf(stdout, "Preprocessing...\n"); { int i; String *fs = NewString(""); FILE *df = Swig_open(input_file); if (!df) { df = Swig_include_open(input_file); if (!df) { char *cfile = Char(input_file); if (cfile && cfile[0] == '-') { Printf(stderr, "Unable to find option or file '%s', ", input_file); Printf(stderr, "use 'swig -help' for more information.\n"); } else { Printf(stderr, "Unable to find file '%s'.\n", input_file); } SWIG_exit(EXIT_FAILURE); } else { Swig_warning(WARN_DEPRECATED_INPUT_FILE, "SWIG", 1, "Use of the include path to find the input file is deprecated and will not work with ccache. Please include the path when specifying the input file.\n"); // so that behaviour is like c/c++ compilers } } if (!no_cpp) { fclose(df); Printf(fs, "%%include \n"); if (allkw) { Printf(fs, "%%include \n"); } if (lang_config) { Printf(fs, "\n%%include <%s>\n", lang_config); } Printf(fs, "%%include(maininput=\"%s\") \"%s\"\n", Swig_filename_escape(input_file), Swig_filename_escape(Swig_last_file())); for (i = 0; i < Len(libfiles); i++) { Printf(fs, "\n%%include \"%s\"\n", Swig_filename_escape(Getitem(libfiles, i))); } Seek(fs, 0, SEEK_SET); cpps = Preprocessor_parse(fs); Delete(fs); } else { cpps = Swig_read_file(df); fclose(df); } if (Swig_error_count()) { SWIG_exit(EXIT_FAILURE); } if (cpp_only) { Printf(stdout, "%s", cpps); SWIG_exit(EXIT_SUCCESS); } if (depend) { if (!no_cpp) { String *outfile; File *f_dependencies_file = 0; String *inputfile_filename = outcurrentdir ? Swig_file_filename(input_file): Copy(input_file); String *basename = Swig_file_basename(inputfile_filename); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { outfile = NewStringf("%s_wrap.%s", basename, cpp_extension); } else { outfile = NewStringf("%s_wrap.c", basename); } } else { outfile = NewString(outfile_name); } if (dependencies_file && Len(dependencies_file) != 0) { f_dependencies_file = NewFile(dependencies_file, "w", SWIG_output_files()); if (!f_dependencies_file) { FileErrorDisplay(dependencies_file); SWIG_exit(EXIT_FAILURE); } } else if (!depend_only) { String *filename = NewStringf("%s_wrap.%s", basename, depends_extension); f_dependencies_file = NewFile(filename, "w", SWIG_output_files()); if (!f_dependencies_file) { FileErrorDisplay(filename); SWIG_exit(EXIT_FAILURE); } } else f_dependencies_file = stdout; if (dependencies_target) { Printf(f_dependencies_file, "%s: ", dependencies_target); } else { Printf(f_dependencies_file, "%s: ", outfile); } List *files = Preprocessor_depend(); List *phony_targets = NewList(); for (int i = 0; i < Len(files); i++) { int use_file = 1; if (depend == 2) { if ((Strncmp(Getitem(files, i), SwigLib, Len(SwigLib)) == 0) || (SwigLibWinUnix && (Strncmp(Getitem(files, i), SwigLibWinUnix, Len(SwigLibWinUnix)) == 0))) use_file = 0; } if (use_file) { Printf(f_dependencies_file, "\\\n %s ", Getitem(files, i)); if (depend_phony) Append(phony_targets, Getitem(files, i)); } } Printf(f_dependencies_file, "\n"); if (depend_phony) { for (int i = 0; i < Len(phony_targets); i++) { Printf(f_dependencies_file, "\n%s:\n", Getitem(phony_targets, i)); } } if (f_dependencies_file != stdout) Delete(f_dependencies_file); if (depend_only) SWIG_exit(EXIT_SUCCESS); Delete(inputfile_filename); Delete(basename); Delete(phony_targets); } else { Printf(stderr, "Cannot generate dependencies with -nopreprocess\n"); // Actually we could but it would be inefficient when just generating dependencies, as it would be done after Swig_cparse SWIG_exit(EXIT_FAILURE); } } Seek(cpps, 0, SEEK_SET); } /* Register a null file with the file handler */ Swig_register_filebyname("null", NewString("")); // Pass control over to the specific language interpreter if (Verbose) { fprintf(stdout, "Starting language-specific parse...\n"); fflush(stdout); } Node *top = Swig_cparse(cpps); if (dump_top & STAGE1) { Printf(stdout, "debug-top stage 1\n"); Swig_print_tree(top); } if (dump_module & STAGE1) { Printf(stdout, "debug-module stage 1\n"); Swig_print_tree(Getattr(top, "module")); } if (!CPlusPlus) { if (Verbose) Printf(stdout, "Processing unnamed structs...\n"); Swig_nested_name_unnamed_c_structs(top); } Swig_extend_unused_check(); if (Verbose) { Printf(stdout, "Processing types...\n"); } Swig_process_types(top); if (dump_top & STAGE2) { Printf(stdout, "debug-top stage 2\n"); Swig_print_tree(top); } if (dump_module & STAGE2) { Printf(stdout, "debug-module stage 2\n"); Swig_print_tree(Getattr(top, "module")); } if (Verbose) { Printf(stdout, "C++ analysis...\n"); } Swig_default_allocators(top); if (CPlusPlus) { if (Verbose) Printf(stdout, "Processing nested classes...\n"); Swig_nested_process_classes(top); } if (dump_top & STAGE3) { Printf(stdout, "debug-top stage 3\n"); Swig_print_tree(top); } if (top && (dump_module & STAGE3)) { Printf(stdout, "debug-module stage 3\n"); Swig_print_tree(Getattr(top, "module")); } if (Verbose) { Printf(stdout, "Generating wrappers...\n"); } if (top && dump_classes) { Hash *classes = Getattr(top, "classes"); if (classes) { Printf(stdout, "Classes\n"); Printf(stdout, "------------\n"); Iterator ki; for (ki = First(classes); ki.key; ki = Next(ki)) { Printf(stdout, "%s\n", ki.key); } } } if (dump_typedef) { SwigType_print_scope(); } if (dump_symtabs) { Swig_symbol_print_tables(Swig_symbol_global_scope()); Swig_symbol_print_tables_summary(); } if (dump_symbols) { Swig_symbol_print_symbols(); } if (dump_csymbols) { Swig_symbol_print_csymbols(); } if (dump_tags) { Swig_print_tags(top, 0); } if (top) { if (!Getattr(top, "name")) { Printf(stderr, "No module name specified using %%module or -module.\n"); SWIG_exit(EXIT_FAILURE); } else { /* Set some filename information on the object */ String *infile = scanner_get_main_input_file(); if (!infile) { Printf(stderr, "Missing input file in preprocessed output.\n"); SWIG_exit(EXIT_FAILURE); } Setattr(top, "infile", infile); // Note: if nopreprocess then infile is the original input file, otherwise input_file Setattr(top, "inputfile", input_file); String *infile_filename = outcurrentdir ? Swig_file_filename(infile): Copy(infile); String *basename = Swig_file_basename(infile_filename); if (!outfile_name) { if (CPlusPlus || lang->cplus_runtime_mode()) { Setattr(top, "outfile", NewStringf("%s_wrap.%s", basename, cpp_extension)); } else { Setattr(top, "outfile", NewStringf("%s_wrap.c", basename)); } } else { Setattr(top, "outfile", outfile_name); } if (!outfile_name_h) { Setattr(top, "outfile_h", NewStringf("%s_wrap.%s", basename, hpp_extension)); } else { Setattr(top, "outfile_h", outfile_name_h); } configure_outdir(Getattr(top, "outfile")); if (Swig_contract_mode_get()) { Swig_contracts(top); } // Check the extension for a c/c++ file. If so, we're going to declare everything we see as "extern" ForceExtern = check_extension(input_file); lang->top(top); if (browse) { Swig_browser(top, 0); } Delete(infile_filename); Delete(basename); } } if (dump_lang_symbols) { lang->dumpSymbols(); } if (dump_top & STAGE4) { Printf(stdout, "debug-top stage 4\n"); Swig_print_tree(top); } if (dump_module & STAGE4) { Printf(stdout, "debug-module stage 4\n"); Swig_print_tree(Getattr(top, "module")); } if (dump_xml && top) { delete lang; lang = 0; Swig_print_xml(top, xmlout); } Delete(top); } if (tm_debug) Swig_typemap_debug(); if (memory_debug) DohMemoryDebug(); char *outfiles = getenv("CCACHE_OUTFILES"); if (outfiles) { File *f_outfiles = NewFile(outfiles, "w", 0); if (!f_outfiles) { Printf(stderr, "Failed to write list of output files to the filename '%s' specified in CCACHE_OUTFILES environment variable - ", outfiles); FileErrorDisplay(outfiles); SWIG_exit(EXIT_FAILURE); } else { int i; for (i = 0; i < Len(all_output_files); i++) Printf(f_outfiles, "%s\n", Getitem(all_output_files, i)); Delete(f_outfiles); } } // Deletes Delete(libfiles); Preprocessor_delete(); while (freeze) { } if ((werror) && (Swig_warn_count())) { return Swig_warn_count(); } delete lang; return Swig_error_count(); } /* ----------------------------------------------------------------------------- * SWIG_exit() * * Cleanup and either freeze or exit * ----------------------------------------------------------------------------- */ void SWIG_exit(int exit_code) { while (freeze) { } exit(exit_code); } swig-3.0.12/Source/Modules/php5.cxx0000664000175000017500000026724113042756442016721 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * php5.cxx * * PHP5 language module for SWIG. * ----------------------------------------------------------------------------- */ /* FIXME: PHP5 OO wrapping TODO list: * * Medium term: * * Handle default parameters on overloaded methods in PHP where possible. * (Mostly done - just need to handle cases of overloaded methods with * default parameters...) * This is an optimisation - we could handle this case using a PHP * default value, but currently we treat it as we would for a default * value which is a compound C++ expression (i.e. as if we had a * method with two overloaded forms instead of a single method with * a default parameter value). * * Long term: * * Sort out locale-dependent behaviour of strtod() - it's harmless unless * SWIG ever sets the locale and DOH/base.c calls atof, so we're probably * OK currently at least. */ /* * TODO: Replace remaining stderr messages with Swig_error or Swig_warning * (may need to add more WARN_PHP_xxx codes...) */ #include "swigmod.h" #include #include static const char *usage = "\ PHP5 Options (available with -php5)\n\ -noproxy - Don't generate proxy classes.\n\ -prefix - Prepend to all class names in PHP wrappers\n\ \n"; /* The original class wrappers for PHP stored the pointer to the C++ class in * the object property _cPtr. If we use the same name for the member variable * which we put the pointer to the C++ class in, then the flat function * wrappers will automatically pull it out without any changes being required. * FIXME: Isn't using a leading underscore a bit suspect here? */ #define SWIG_PTR "_cPtr" /* This is the name of the hash where the variables existing only in PHP * classes are stored. */ #define SWIG_DATA "_pData" static int constructors = 0; static String *NOTCLASS = NewString("Not a class"); static Node *classnode = 0; static String *module = 0; static String *cap_module = 0; static String *prefix = 0; static String *shadow_classname = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_h = 0; static File *f_phpcode = 0; static File *f_directors = 0; static File *f_directors_h = 0; static String *phpfilename = 0; static String *s_header; static String *s_wrappers; static String *s_init; static String *r_init; // RINIT user code static String *s_shutdown; // MSHUTDOWN user code static String *r_shutdown; // RSHUTDOWN user code static String *s_vinit; // varinit initialization code. static String *s_vdecl; static String *s_cinit; // consttab initialization code. static String *s_oinit; static String *s_arginfo; static String *s_entry; static String *cs_entry; static String *all_cs_entry; static String *pragma_incl; static String *pragma_code; static String *pragma_phpinfo; static String *s_oowrappers; static String *s_fakeoowrappers; static String *s_phpclasses; /* To reduce code size (generated and compiled) we only want to emit each * different arginfo once, so we need to track which have been used. */ static Hash *arginfo_used; /* Variables for using PHP classes */ static Node *current_class = 0; static Hash *shadow_get_vars; static Hash *shadow_set_vars; static Hash *zend_types = 0; static int shadow = 1; static bool class_has_ctor = false; static String *wrapping_member_constant = NULL; // These static variables are used to pass some state from Handlers into functionWrapper static enum { standard = 0, memberfn, staticmemberfn, membervar, staticmembervar, constructor, directorconstructor } wrapperType = standard; extern "C" { static void (*r_prevtracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; } static void SwigPHP_emit_resource_registrations() { Iterator ki; bool emitted_default_dtor = false; if (!zend_types) return; ki = First(zend_types); if (ki.key) Printf(s_oinit, "\n/* Register resource destructors for pointer types */\n"); while (ki.key) { DOH *key = ki.key; Node *class_node = ki.item; String *human_name = key; String *rsrc_dtor_name = NULL; // write out body if (class_node != NOTCLASS) { String *destructor = Getattr(class_node, "destructor"); human_name = Getattr(class_node, "sym:name"); if (!human_name) human_name = Getattr(class_node, "name"); // Do we have a known destructor for this type? if (destructor) { rsrc_dtor_name = NewStringf("_wrap_destroy%s", key); // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " %s(rsrc, SWIGTYPE%s->name TSRMLS_CC);\n", destructor, key); Printf(s_wrappers, "}\n"); } } if (!rsrc_dtor_name) { rsrc_dtor_name = NewString("_swig_default_rsrc_destroy"); if (!emitted_default_dtor) { // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " efree(rsrc->ptr);\n"); Printf(s_wrappers, "}\n"); emitted_default_dtor = true; } } // declare le_swig_ to store php registration Printf(s_vdecl, "static int le_swig_%s=0; /* handle for %s */\n", key, human_name); // register with php Printf(s_oinit, "le_swig_%s=zend_register_list_destructors_ex" "(%s, NULL, (char *)SWIGTYPE%s->name, module_number);\n", key, rsrc_dtor_name, key); // store php type in class struct Printf(s_oinit, "SWIG_TypeClientData(SWIGTYPE%s,&le_swig_%s);\n", key, key); Delete(rsrc_dtor_name); ki = Next(ki); } } class PHP5 : public Language { String *emit_action(Node *n) { // Adjust wrap:action to add TSRMLS_CC. String * action = Getattr(n, "wrap:action"); if (action) { char * p = Strstr(action, "Swig::DirectorPureVirtualException::raise(\""); if (p) { p += strlen("Swig::DirectorPureVirtualException::raise(\""); p = strchr(p, '"'); if (p) { ++p; Insert(action, (int)(p - Char(action)), " TSRMLS_CC"); } } } return ::emit_action(n); } public: PHP5() { director_language = 1; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("php5"); SWIG_config_cppext("cpp"); for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-noshadow") == 0) || (strcmp(argv[i], "-noproxy") == 0)) { shadow = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } else if (strcmp(argv[i], "-make") == 0 || strcmp(argv[i], "-withc") == 0 || strcmp(argv[i], "-withcxx") == 0) { Printf(stderr, "*** %s is no longer supported.\n", argv[i]); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-phpfull") == 0 || strcmp(argv[i], "-withlibs") == 0 || strcmp(argv[i], "-withincs") == 0) { Printf(stderr, "*** %s is no longer supported.\n*** We recommend building as a dynamically loadable module.\n", argv[i]); SWIG_exit(EXIT_FAILURE); } else if (strcmp(argv[i], "-dlname") == 0) { Printf(stderr, "*** -dlname is no longer supported.\n*** If you want to change the module name, use -module instead.\n"); SWIG_exit(EXIT_FAILURE); } } Preprocessor_define("SWIGPHP 1", 0); // SWIGPHP5 is deprecated, and no longer documented. Preprocessor_define("SWIGPHP5 1", 0); SWIG_typemap_lang("php"); SWIG_config_file("php.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { String *filen; /* Check if directors are enabled for this module. */ Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options && Getattr(options, "directors")) { allow_directors(); } } /* Set comparison with null for ConstructorToFunction */ setSubclassInstanceCheck(NewString("$arg->type != IS_NULL")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); /* main output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewStringEmpty(); /* sections of the output file */ s_init = NewString("/* init section */\n"); r_init = NewString("/* rinit section */\n"); s_shutdown = NewString("/* shutdown section */\n"); r_shutdown = NewString("/* rshutdown section */\n"); s_header = NewString("/* header section */\n"); s_wrappers = NewString("/* wrapper section */\n"); /* subsections of the init section */ s_vinit = NewString("/* vinit subsection */\n"); s_vdecl = NewString("/* vdecl subsection */\n"); s_cinit = NewString("/* cinit subsection */\n"); s_oinit = NewString("/* oinit subsection */\n"); pragma_phpinfo = NewStringEmpty(); s_phpclasses = NewString("/* PHP Proxy Classes */\n"); f_directors_h = NewStringEmpty(); f_directors = NewStringEmpty(); if (directorsEnabled()) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", s_init); Swig_register_filebyname("rinit", r_init); Swig_register_filebyname("shutdown", s_shutdown); Swig_register_filebyname("rshutdown", r_shutdown); Swig_register_filebyname("header", s_header); Swig_register_filebyname("wrapper", s_wrappers); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPHP\n#define SWIGPHP\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } /* Set the module name */ module = Copy(Getattr(n, "name")); cap_module = NewStringf("%(upper)s", module); if (!prefix) prefix = NewStringEmpty(); Printf(f_runtime, "#define SWIG_PREFIX \"%s\"\n", prefix); Printf(f_runtime, "#define SWIG_PREFIX_LEN %lu\n", (unsigned long)Len(prefix)); if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", cap_module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", cap_module); String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "\n#include \"%s\"\n\n", filename); Delete(filename); } /* PHP module file */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), module, ".php", NIL); phpfilename = NewString(filen); f_phpcode = NewFile(filen, "w", SWIG_output_files()); if (!f_phpcode) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Printf(f_phpcode, "error_msg = default_error_msg;\n"); Printf(s_header, " globals->error_code = default_error_code;\n"); Printf(s_header, "}\n"); Printf(s_header, "static void SWIG_ResetError(TSRMLS_D) {\n"); Printf(s_header, " SWIG_ErrorMsg() = default_error_msg;\n"); Printf(s_header, " SWIG_ErrorCode() = default_error_code;\n"); Printf(s_header, "}\n"); Append(s_header, "\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_alter_newobject) {\n", module); Append(s_header, " zval **args[2];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, " int type;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError(TSRMLS_C);\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) zend_list_find((*args[0])->value.lval, &type);\n"); Append(s_header, " value->newobject = zval_is_true(*args[1]);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_get_newobject) {\n", module); Append(s_header, " zval **args[1];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, " int type;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError(TSRMLS_C);\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) zend_list_find((*args[0])->value.lval, &type);\n"); Append(s_header, " RETVAL_LONG(value->newobject);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "#define SWIG_name \"%s\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "extern \"C\" {\n"); Printf(s_header, "#endif\n"); Printf(s_header, "#include \"php.h\"\n"); Printf(s_header, "#include \"php_ini.h\"\n"); Printf(s_header, "#include \"ext/standard/info.h\"\n"); Printf(s_header, "#include \"php_%s.h\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "}\n"); Printf(s_header, "#endif\n\n"); if (directorsEnabled()) { // Insert director runtime Swig_insert_file("director_common.swg", s_header); Swig_insert_file("director.swg", s_header); } /* Create the .h file too */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), "php_", module, ".h", NIL); f_h = NewFile(filen, "w", SWIG_output_files()); if (!f_h) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Swig_banner(f_h); Printf(f_h, "\n"); Printf(f_h, "#ifndef PHP_%s_H\n", cap_module); Printf(f_h, "#define PHP_%s_H\n\n", cap_module); Printf(f_h, "extern zend_module_entry %s_module_entry;\n", module); Printf(f_h, "#define phpext_%s_ptr &%s_module_entry\n\n", module, module); Printf(f_h, "#ifdef PHP_WIN32\n"); Printf(f_h, "# define PHP_%s_API __declspec(dllexport)\n", cap_module); Printf(f_h, "#else\n"); Printf(f_h, "# define PHP_%s_API\n", cap_module); Printf(f_h, "#endif\n\n"); Printf(f_h, "#ifdef ZTS\n"); Printf(f_h, "#include \"TSRM.h\"\n"); Printf(f_h, "#endif\n\n"); Printf(f_h, "PHP_MINIT_FUNCTION(%s);\n", module); Printf(f_h, "PHP_MSHUTDOWN_FUNCTION(%s);\n", module); Printf(f_h, "PHP_RINIT_FUNCTION(%s);\n", module); Printf(f_h, "PHP_RSHUTDOWN_FUNCTION(%s);\n", module); Printf(f_h, "PHP_MINFO_FUNCTION(%s);\n\n", module); /* start the arginfo section */ s_arginfo = NewString("/* arginfo subsection */\n"); arginfo_used = NewHash(); /* start the function entry section */ s_entry = NewString("/* entry subsection */\n"); /* holds all the per-class function entry sections */ all_cs_entry = NewString("/* class entry subsection */\n"); cs_entry = NULL; Printf(s_entry, "/* Every non-class user visible function must have an entry here */\n"); Printf(s_entry, "static zend_function_entry %s_functions[] = {\n", module); /* start the init section */ Append(s_init, "#if ZEND_MODULE_API_NO <= 20090626\n"); Append(s_init, "#undef ZEND_MODULE_BUILD_ID\n"); Append(s_init, "#define ZEND_MODULE_BUILD_ID (char*)\"API\" ZEND_TOSTR(ZEND_MODULE_API_NO) ZEND_BUILD_TS ZEND_BUILD_DEBUG ZEND_BUILD_SYSTEM ZEND_BUILD_EXTRA\n"); Append(s_init, "#endif\n"); Printv(s_init, "zend_module_entry ", module, "_module_entry = {\n", NIL); Printf(s_init, " STANDARD_MODULE_HEADER,\n"); Printf(s_init, " (char*)\"%s\",\n", module); Printf(s_init, " %s_functions,\n", module); Printf(s_init, " PHP_MINIT(%s),\n", module); Printf(s_init, " PHP_MSHUTDOWN(%s),\n", module); Printf(s_init, " PHP_RINIT(%s),\n", module); Printf(s_init, " PHP_RSHUTDOWN(%s),\n", module); Printf(s_init, " PHP_MINFO(%s),\n", module); Printf(s_init, " NO_VERSION_YET,\n"); Printf(s_init, " STANDARD_MODULE_PROPERTIES\n"); Printf(s_init, "};\n"); Printf(s_init, "zend_module_entry* SWIG_module_entry = &%s_module_entry;\n\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "extern \"C\" {\n"); Printf(s_init, "#endif\n"); // We want to write "SWIGEXPORT ZEND_GET_MODULE(%s)" but ZEND_GET_MODULE // in PHP5 has "extern "C" { ... }" around it so we can't do that. Printf(s_init, "SWIGEXPORT zend_module_entry *get_module(void) { return &%s_module_entry; }\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "}\n"); Printf(s_init, "#endif\n\n"); /* We have to register the constants before they are (possibly) used * by the pointer typemaps. This all needs re-arranging really as * things are being called in the wrong order */ Printf(s_init, "#define SWIG_php_minit PHP_MINIT_FUNCTION(%s)\n", module); /* Emit all of the code */ Language::top(n); SwigPHP_emit_resource_registrations(); // Printv(s_init,s_resourcetypes,NIL); /* We need this after all classes written out by ::top */ Printf(s_oinit, "CG(active_class_entry) = NULL;\n"); Printf(s_oinit, "/* end oinit subsection */\n"); Printf(s_init, "%s\n", s_oinit); /* Constants generated during top call */ Printf(s_cinit, "/* end cinit subsection */\n"); Printf(s_init, "%s\n", s_cinit); Clear(s_cinit); Delete(s_cinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); // Now do REQUEST init which holds any user specified %rinit, and also vinit Printf(s_init, "PHP_RINIT_FUNCTION(%s)\n{\n", module); Printf(s_init, "%s\n", r_init); /* finish our init section which will have been used by class wrappers */ Printf(s_vinit, "/* end vinit subsection */\n"); Printf(s_init, "%s\n", s_vinit); Clear(s_vinit); Delete(s_vinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); Printv(s_init, "PHP_MSHUTDOWN_FUNCTION(", module, ")\n" "{\n", s_shutdown, "#ifdef ZTS\n" " ts_free_id(", module, "_globals_id);\n" "#endif\n" " return SUCCESS;\n" "}\n\n", NIL); Printf(s_init, "PHP_RSHUTDOWN_FUNCTION(%s)\n{\n", module); Printf(s_init, "%s\n", r_shutdown); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); Printf(s_init, "PHP_MINFO_FUNCTION(%s)\n{\n", module); Printf(s_init, "%s", pragma_phpinfo); Printf(s_init, "}\n"); Printf(s_init, "/* end init section */\n"); Printf(f_h, "#endif /* PHP_%s_H */\n", cap_module); Delete(f_h); String *type_table = NewStringEmpty(); SwigType_emit_type_table(f_runtime, type_table); Printf(s_header, "%s", type_table); Delete(type_table); /* Oh dear, more things being called in the wrong order. This whole * function really needs totally redoing. */ if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); } Printf(s_header, "/* end header section */\n"); Printf(s_wrappers, "/* end wrapper section */\n"); Printf(s_vdecl, "/* end vdecl subsection */\n"); Dump(f_runtime, f_begin); Printv(f_begin, s_header, NIL); if (directorsEnabled()) { Dump(f_directors, f_begin); } Printv(f_begin, s_vdecl, s_wrappers, NIL); Printv(f_begin, all_cs_entry, "\n\n", s_arginfo, "\n\n", s_entry, " SWIG_ZEND_NAMED_FE(swig_", module, "_alter_newobject,_wrap_swig_", module, "_alter_newobject,NULL)\n" " SWIG_ZEND_NAMED_FE(swig_", module, "_get_newobject,_wrap_swig_", module, "_get_newobject,NULL)\n" " ZEND_FE_END\n};\n\n", NIL); Printv(f_begin, s_init, NIL); Delete(s_header); Delete(s_wrappers); Delete(s_init); Delete(s_vdecl); Delete(all_cs_entry); Delete(s_entry); Delete(s_arginfo); Delete(f_runtime); Delete(f_begin); Delete(arginfo_used); Printf(f_phpcode, "%s\n%s\n", pragma_incl, pragma_code); if (s_fakeoowrappers) { Printf(f_phpcode, "abstract class %s {", Len(prefix) ? prefix : module); Printf(f_phpcode, "%s", s_fakeoowrappers); Printf(f_phpcode, "}\n\n"); Delete(s_fakeoowrappers); s_fakeoowrappers = NULL; } Printf(f_phpcode, "%s\n?>\n", s_phpclasses); Delete(f_phpcode); return SWIG_OK; } /* Just need to append function names to function table to register with PHP. */ void create_command(String *cname, String *iname, Node *n) { // This is for the single main zend_function_entry record Printf(f_h, "ZEND_NAMED_FUNCTION(%s);\n", iname); // We want to only emit each different arginfo once, as that reduces the // size of both the generated source code and the compiled extension // module. To do this, we name the arginfo to encode the number of // parameters and which (if any) are passed by reference by using a // sequence of 0s (for non-reference) and 1s (for by references). ParmList *l = Getattr(n, "parms"); String * arginfo_code = NewStringEmpty(); for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) { /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } Append(arginfo_code, GetFlag(p, "tmap:in:byref") ? "1" : "0"); } if (!GetFlag(arginfo_used, arginfo_code)) { // Not had this one before, so emit it. SetFlag(arginfo_used, arginfo_code); Printf(s_arginfo, "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_%s, 0, 0, 0)\n", arginfo_code); for (const char * p = Char(arginfo_code); *p; ++p) { Printf(s_arginfo, " ZEND_ARG_PASS_INFO(%c)\n", *p); } Printf(s_arginfo, "ZEND_END_ARG_INFO()\n"); } String * s = cs_entry; if (!s) s = s_entry; Printf(s, " SWIG_ZEND_NAMED_FE(%(lower)s,%s,swig_arginfo_%s)\n", cname, iname, arginfo_code); Delete(arginfo_code); } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewStringEmpty(); if (Swig_directorclass(n) && wrapperType == directorconstructor) { /* We have an extra 'this' parameter. */ SetFlag(n, "wrap:this"); } String *dispatch = Swig_overload_dispatch(n, "%s(INTERNAL_FUNCTION_PARAM_PASSTHRU); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); create_command(symname, wname, n); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "zval **argv[%d]", maxargs); Wrapper_add_local(f, "argv", tmp); Printf(f->code, "argc = ZEND_NUM_ARGS();\n"); Printf(f->code, "zend_get_parameters_array_ex(argc,argv);\n"); Replaceall(dispatch, "$args", "self,args"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "SWIG_ErrorCode() = E_ERROR;\n"); Printf(f->code, "SWIG_ErrorMsg() = \"No matching function for overloaded '%s'\";\n", symname); Printv(f->code, "SWIG_FAIL(TSRMLS_C);\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, s_wrappers); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ /* Helper method for PHP5::functionWrapper */ bool is_class(SwigType *t) { Node *n = classLookup(t); if (n) { String *r = Getattr(n, "php:proxy"); // Set by classDeclaration() if (!r) r = Getattr(n, "sym:name"); // Not seen by classDeclaration yet, but this is the name if (r) return true; } return false; } virtual int functionWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *nodeType = Getattr(n, "nodeType"); int newobject = GetFlag(n, "feature:new"); int constructor = (Cmp(nodeType, "constructor") == 0); Parm *p; int i; int numopt; String *tm; Wrapper *f; String *wname; int overloaded = 0; String *overname = 0; if (Cmp(nodeType, "destructor") == 0) { // We just generate the Zend List Destructor and let Zend manage the // reference counting. There's no explicit destructor, but the user can // just do `$obj = null;' to remove a reference to an object. return CreateZendListDestructor(n); } // Test for overloading; if (Getattr(n, "sym:overloaded")) { overloaded = 1; overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } wname = Swig_name_wrapper(iname); if (overname) { Printf(wname, "%s", overname); } f = NewWrapper(); String *outarg = NewStringEmpty(); String *cleanup = NewStringEmpty(); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); emit_parameter_variables(l, f); /* Attach standard typemaps */ emit_attach_parmmaps(l, f); // Not issued for overloaded functions. if (!overloaded) { create_command(iname, wname, n); } // wrap:parms is used by overload resolution. Setattr(n, "wrap:parms", l); int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); numopt = num_arguments - num_required; if (wrapperType == directorconstructor) num_arguments++; if (num_arguments > 0) { String *args = NewStringEmpty(); if (wrapperType == directorconstructor) Wrapper_add_local(f, "arg0", "zval *arg0"); Printf(args, "zval **args[%d]", num_arguments); Wrapper_add_local(f, "args", args); Delete(args); args = NULL; } // This generated code may be called: // 1) as an object method, or // 2) as a class-method/function (without a "this_ptr") // Option (1) has "this_ptr" for "this", option (2) needs it as // first parameter // NOTE: possible we ignore this_ptr as a param for native constructor Printf(f->code, "SWIG_ResetError(TSRMLS_C);\n"); if (numopt > 0) { // membervariable wrappers do not have optional args Wrapper_add_local(f, "arg_count", "int arg_count"); Printf(f->code, "arg_count = ZEND_NUM_ARGS();\n"); Printf(f->code, "if(arg_count<%d || arg_count>%d ||\n", num_required, num_arguments); Printf(f->code, " zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)\n"); Printf(f->code, "\tWRONG_PARAM_COUNT;\n\n"); } else { if (num_arguments == 0) { Printf(f->code, "if(ZEND_NUM_ARGS() != 0) {\n"); } else { Printf(f->code, "if(ZEND_NUM_ARGS() != %d || zend_get_parameters_array_ex(%d, args) != SUCCESS) {\n", num_arguments, num_arguments); } Printf(f->code, "WRONG_PARAM_COUNT;\n}\n\n"); } if (wrapperType == directorconstructor) Printf(f->code, "arg0 = *args[0];\n \n"); /* Now convert from PHP to C variables */ // At this point, argcount if used is the number of deliberately passed args // not including this_ptr even if it is used. // It means error messages may be out by argbase with error // reports. We can either take argbase into account when raising // errors, or find a better way of dealing with _thisptr. // I would like, if objects are wrapped, to assume _thisptr is always // _this and not the first argument. // This may mean looking at Language::memberfunctionHandler int limit = num_arguments; if (wrapperType == directorconstructor) limit--; for (i = 0, p = l; i < limit; i++) { String *source; /* Skip ignored arguments */ //while (Getattr(p,"tmap:ignore")) { p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); if (wrapperType == directorconstructor) { source = NewStringf("args[%d]", i+1); } else { source = NewStringf("args[%d]", i); } String *ln = Getattr(p, "lname"); /* Check if optional */ if (i >= num_required) { Printf(f->code, "\tif(arg_count > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); if (i == 0 && Getattr(p, "self")) { Printf(f->code, "\tif(!arg1) SWIG_PHP_Error(E_ERROR, \"this pointer is NULL\");\n"); } p = Getattr(p, "tmap:in:next"); if (i >= num_required) { Printf(f->code, "}\n"); } continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); } if (i >= num_required) { Printf(f->code, "\t}\n"); } Delete(source); } if (is_member_director(n)) { Wrapper_add_local(f, "upcall", "bool upcall = false"); Printf(f->code, "upcall = !Swig::Director::swig_is_overridden_method((char *)\"%s%s\", (char *)\"%s\" TSRMLS_CC);\n", prefix, Swig_class_name(Swig_methodclass(n)), name); } Swig_director_emit_dynamic_cast(n, f); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ bool hasargout = false; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { hasargout = true; Replaceall(tm, "$source", Getattr(p, "lname")); // Replaceall(tm,"$input",Getattr(p,"lname")); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } Setattr(n, "wrap:name", wname); /* emit function call */ String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$owner", newobject ? "1" : "0"); Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); if (outarg) { Printv(f->code, outarg, NIL); } if (cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "thrown:\n"); Printf(f->code, "return;\n"); /* Error handling code */ Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Append(f->code, "SWIG_FAIL(TSRMLS_C);\n"); Printf(f->code, "}\n"); Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); Wrapper_print(f, s_wrappers); DelWrapper(f); f = NULL; if (overloaded && !Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } Delete(wname); wname = NULL; if (!shadow) { return SWIG_OK; } // Handle getters and setters. if (wrapperType == membervar) { const char *p = Char(iname); if (strlen(p) > 4) { p += strlen(p) - 4; String *varname = Getattr(n, "membervariableHandler:sym:name"); if (strcmp(p, "_get") == 0) { Setattr(shadow_get_vars, varname, Getattr(n, "type")); } else if (strcmp(p, "_set") == 0) { Setattr(shadow_set_vars, varname, iname); } } return SWIG_OK; } // Only look at non-overloaded methods and the last entry in each overload // chain (we check the last so that wrap:parms and wrap:name have been set // for them all). if (overloaded && Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; if (!s_oowrappers) s_oowrappers = NewStringEmpty(); if (newobject || wrapperType == memberfn || wrapperType == staticmemberfn || wrapperType == standard || wrapperType == staticmembervar) { bool handle_as_overload = false; String **arg_names; String **arg_values; // Method or static method or plain function. const char *methodname = 0; String *output = s_oowrappers; if (constructor) { class_has_ctor = true; // Skip the Foo:: prefix. char *ptr = strrchr(GetChar(Swig_methodclass(n), "sym:name"), ':'); if (ptr) { ptr++; } else { ptr = GetChar(Swig_methodclass(n), "sym:name"); } if (strcmp(ptr, GetChar(n, "constructorHandler:sym:name")) == 0) { methodname = "__construct"; } else { // The class has multiple constructors and this one is // renamed, so this will be a static factory function methodname = GetChar(n, "constructorHandler:sym:name"); } } else if (wrapperType == memberfn) { methodname = Char(Getattr(n, "memberfunctionHandler:sym:name")); } else if (wrapperType == staticmemberfn) { methodname = Char(Getattr(n, "staticmemberfunctionHandler:sym:name")); } else if (wrapperType == staticmembervar) { // Static member variable, wrapped as a function due to PHP limitations. methodname = Char(Getattr(n, "staticmembervariableHandler:sym:name")); } else { // wrapperType == standard methodname = Char(iname); if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); output = s_fakeoowrappers; } bool really_overloaded = overloaded ? true : false; int min_num_of_arguments = emit_num_required(l); int max_num_of_arguments = emit_num_arguments(l); Hash *ret_types = NewHash(); Setattr(ret_types, d, d); bool non_void_return = (Cmp(d, "void") != 0); if (overloaded) { // Look at all the overloaded versions of this method in turn to // decide if it's really an overloaded method, or just one where some // parameters have default values. Node *o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } SwigType *d2 = Getattr(o, "type"); if (!d2) { assert(constructor); } else if (!Getattr(ret_types, d2)) { Setattr(ret_types, d2, d2); non_void_return = non_void_return || (Cmp(d2, "void") != 0); } ParmList *l2 = Getattr(o, "wrap:parms"); int num_arguments = emit_num_arguments(l2); int num_required = emit_num_required(l2); if (num_required < min_num_of_arguments) min_num_of_arguments = num_required; if (num_arguments > max_num_of_arguments) { max_num_of_arguments = num_arguments; } o = Getattr(o, "sym:nextSibling"); } o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } ParmList *l2 = Getattr(o, "wrap:parms"); Parm *p = l, *p2 = l2; if (wrapperType == memberfn) { p = nextSibling(p); p2 = nextSibling(p2); } while (p && p2) { if (Cmp(Getattr(p, "type"), Getattr(p2, "type")) != 0) break; if (Cmp(Getattr(p, "name"), Getattr(p2, "name")) != 0) break; String *value = Getattr(p, "value"); String *value2 = Getattr(p2, "value"); if (value && !value2) break; if (!value && value2) break; if (value) { if (Cmp(value, value2) != 0) break; } p = nextSibling(p); p2 = nextSibling(p2); } if (p && p2) break; // One parameter list is a prefix of the other, so check that all // remaining parameters of the longer list are optional. if (p2) p = p2; while (p && Getattr(p, "value")) p = nextSibling(p); if (p) break; o = Getattr(o, "sym:nextSibling"); } if (!o) { // This "overloaded method" is really just one with default args. really_overloaded = false; } } if (wrapperType == memberfn) { // Allow for the "this" pointer. --min_num_of_arguments; --max_num_of_arguments; } arg_names = (String **) malloc(max_num_of_arguments * sizeof(String *)); if (!arg_names) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); exit(1); } for (i = 0; i < max_num_of_arguments; ++i) { arg_names[i] = NULL; } arg_values = (String **) malloc(max_num_of_arguments * sizeof(String *)); if (!arg_values) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); exit(1); } for (i = 0; i < max_num_of_arguments; ++i) { arg_values[i] = NULL; } Node *o; if (overloaded) { o = Getattr(n, "sym:overloaded"); } else { o = n; } while (o) { int argno = 0; Parm *p = Getattr(o, "wrap:parms"); if (wrapperType == memberfn) p = nextSibling(p); while (p) { if (GetInt(p, "tmap:in:numinputs") == 0) { p = nextSibling(p); continue; } assert(0 <= argno && argno < max_num_of_arguments); String *&pname = arg_names[argno]; const char *pname_cstr = GetChar(p, "name"); // Just get rid of the C++ namespace part for now. const char *ptr = NULL; if (pname_cstr && (ptr = strrchr(pname_cstr, ':'))) { pname_cstr = ptr + 1; } if (!pname_cstr) { // Unnamed parameter, e.g. int foo(int); } else if (!pname) { pname = NewString(pname_cstr); } else { size_t len = strlen(pname_cstr); size_t spc = 0; size_t len_pname = strlen(Char(pname)); while (spc + len <= len_pname) { if (strncmp(pname_cstr, Char(pname) + spc, len) == 0) { char ch = ((char *) Char(pname))[spc + len]; if (ch == '\0' || ch == ' ') { // Already have this pname_cstr. pname_cstr = NULL; break; } } char *p = strchr(Char(pname) + spc, ' '); if (!p) break; spc = (p + 4) - Char(pname); } if (pname_cstr) { Printf(pname, " or_%s", pname_cstr); } } String *value = NewString(Getattr(p, "value")); if (Len(value)) { /* Check that value is a valid constant in PHP (and adjust it if * necessary, or replace it with "?" if it's just not valid). */ SwigType *type = Getattr(p, "type"); switch (SwigType_type(type)) { case T_BOOL: { if (Strcmp(value, "true") == 0 || Strcmp(value, "false") == 0) break; char *p; errno = 0; long n = strtol(Char(value), &p, 0); Clear(value); if (errno || *p) { Append(value, "?"); } else if (n) { Append(value, "true"); } else { Append(value, "false"); } break; } case T_CHAR: case T_SCHAR: case T_SHORT: case T_INT: case T_LONG: case T_LONGLONG: { char *p; errno = 0; long n = strtol(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_UCHAR: case T_USHORT: case T_UINT: case T_ULONG: case T_ULONGLONG: { char *p; errno = 0; unsigned int n = strtoul(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_FLOAT: case T_DOUBLE: case T_LONGDOUBLE: { char *p; errno = 0; /* FIXME: strtod is locale dependent... */ double val = strtod(Char(value), &p); if (errno || *p) { Clear(value); Append(value, "?"); } else if (strchr(Char(value), '.') == 0) { // Ensure value is a double constant, not an integer one. Append(value, ".0"); double val2 = strtod(Char(value), &p); if (errno || *p || val != val2) { Clear(value); Append(value, "?"); } } break; } case T_STRING: if (Len(value) < 2) { // How can a string (including "" be less than 2 characters?) Clear(value); Append(value, "?"); } else { const char *v = Char(value); if (v[0] != '"' || v[Len(value) - 1] != '"') { Clear(value); Append(value, "?"); } // Strings containing "$" require special handling, but we do // that later. } break; case T_VOID: assert(false); break; case T_POINTER: { const char *v = Char(value); if (v[0] == '(') { // Handle "(void*)0", "(TYPE*)0", "(char*)NULL", etc. v += strcspn(v + 1, "*()") + 1; if (*v == '*') { do { v++; v += strspn(v, " \t"); } while (*v == '*'); if (*v++ == ')') { v += strspn(v, " \t"); String * old = value; value = NewString(v); Delete(old); } } } if (Strcmp(value, "NULL") == 0 || Strcmp(value, "nullptr") == 0 || Strcmp(value, "0") == 0 || Strcmp(value, "0L") == 0) { Clear(value); Append(value, "null"); } else { Clear(value); Append(value, "?"); } break; } default: /* Safe default */ Clear(value); Append(value, "?"); break; } if (!arg_values[argno]) { arg_values[argno] = value; value = NULL; } else if (Cmp(arg_values[argno], value) != 0) { // If a parameter has two different default values in // different overloaded forms of the function, we can't // set its default in PHP. Flag this by setting its // default to `?'. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } } else if (arg_values[argno]) { // This argument already has a default value in another overloaded // form, but doesn't in this form. So don't try to do anything // clever, just let the C wrappers resolve the overload and set the // default values. // // This handling is safe, but I'm wondering if it may be overly // conservative (FIXME) in some cases. It seems it's only bad when // there's an overloaded form with the appropriate number of // parameters which doesn't want the default value, but I need to // think about this more. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } Delete(value); p = nextSibling(p); ++argno; } if (!really_overloaded) break; o = Getattr(o, "sym:nextSibling"); } /* Clean up any parameters which haven't yet got names, or whose * names clash. */ Hash *seen = NewHash(); /* We need $this to refer to the current class, so can't allow it * to be used as a parameter. */ Setattr(seen, "this", seen); /* We use $r to store the return value, so disallow that as a parameter * name in case the user uses the "call-time pass-by-reference" feature * (it's deprecated and off by default in PHP5, but we want to be * maximally portable). Similarly we use $c for the classname or new * stdClass object. */ Setattr(seen, "r", seen); Setattr(seen, "c", seen); for (int argno = 0; argno < max_num_of_arguments; ++argno) { String *&pname = arg_names[argno]; if (pname) { Replaceall(pname, " ", "_"); } else { /* We get here if the SWIG .i file has "int foo(int);" */ pname = NewStringEmpty(); Printf(pname, "arg%d", argno + 1); } // Check if we've already used this parameter name. while (Getattr(seen, pname)) { // Append "_" to clashing names until they stop clashing... Printf(pname, "_"); } Setattr(seen, Char(pname), seen); if (arg_values[argno] && Cmp(arg_values[argno], "?") == 0) { handle_as_overload = true; } } Delete(seen); seen = NULL; String *invoke = NewStringEmpty(); String *prepare = NewStringEmpty(); String *args = NewStringEmpty(); if (!handle_as_overload && !(really_overloaded && max_num_of_arguments > min_num_of_arguments)) { Printf(invoke, "%s(", iname); if (wrapperType == memberfn) { Printf(invoke, "$this->%s", SWIG_PTR); } for (int i = 0; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); if (i || wrapperType == memberfn) Printf(invoke, ","); String *value = arg_values[i]; if (value) { const char *v = Char(value); if (v[0] == '"') { /* In a PHP double quoted string, $ needs to be escaped as \$. */ Replaceall(value, "$", "\\$"); } Printf(args, "$%s=%s", arg_names[i], value); } else { Printf(args, "$%s", arg_names[i]); } Printf(invoke, "$%s", arg_names[i]); } Printf(invoke, ")"); } else { int i; for (i = 0; i < min_num_of_arguments; ++i) { if (i) Printf(args, ","); Printf(args, "$%s", arg_names[i]); } String *invoke_args = NewStringEmpty(); if (wrapperType == memberfn) { Printf(invoke_args, "$this->%s", SWIG_PTR); if (min_num_of_arguments > 0) Printf(invoke_args, ","); } Printf(invoke_args, "%s", args); bool had_a_case = false; int last_handled_i = i - 1; for (; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); const char *value = Char(arg_values[i]); // FIXME: (really_overloaded && handle_as_overload) is perhaps a // little conservative, but it doesn't hit any cases that it // shouldn't for Xapian at least (and we need it to handle // "Enquire::get_mset()" correctly). bool non_php_default = ((really_overloaded && handle_as_overload) || !value || strcmp(value, "?") == 0); if (non_php_default) value = "null"; Printf(args, "$%s=%s", arg_names[i], value); if (non_php_default) { if (!had_a_case) { Printf(prepare, "\t\tswitch (func_num_args()) {\n"); had_a_case = true; } Printf(prepare, "\t\t"); while (last_handled_i < i) { Printf(prepare, "case %d: ", ++last_handled_i); } if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !newobject) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !newobject) { Printf(prepare, "%s(%s); break;\n", iname, invoke_args); } else if (!i) { Printf(prepare, "%s($_this%s); break;\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s); break;\n", iname, invoke_args); } } if (i || wrapperType == memberfn) Printf(invoke_args, ","); Printf(invoke_args, "$%s", arg_names[i]); } Printf(prepare, "\t\t"); if (had_a_case) Printf(prepare, "default: "); if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !newobject) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !newobject) { Printf(prepare, "%s(%s);\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s);\n", iname, invoke_args); } if (had_a_case) Printf(prepare, "\t\t}\n"); Delete(invoke_args); Printf(invoke, "$r"); } Printf(output, "\n"); // If it's a member function or a class constructor... if (wrapperType == memberfn || (constructor && current_class)) { String *acc = NewString(Getattr(n, "access")); // If a base has the same method with public access, then PHP // requires to have it here as public as well Node *bases = Getattr(Swig_methodclass(n), "bases"); if (bases && Strcmp(acc, "public") != 0) { String *warnmsg = 0; int haspublicbase = 0; Iterator i = First(bases); while (i.item) { Node *j = firstChild(i.item); while (j) { String *jname = Getattr(j, "name"); if (!jname || Strcmp(jname, Getattr(n, "name")) != 0) { j = nextSibling(j); continue; } if (Strcmp(nodeType(j), "cdecl") == 0) { if (!Getattr(j, "access") || checkAttribute(j, "access", "public")) { haspublicbase = 1; } } else if (Strcmp(nodeType(j), "using") == 0 && firstChild(j) && Strcmp(nodeType(firstChild(j)), "cdecl") == 0) { if (!Getattr(firstChild(j), "access") || checkAttribute(firstChild(j), "access", "public")) { haspublicbase = 1; } } if (haspublicbase) { warnmsg = NewStringf("Modifying the access of '%s::%s' to public, as the base '%s' has it as public as well.\n", Getattr(current_class, "classtype"), Getattr(n, "name"), Getattr(i.item, "classtype")); break; } j = nextSibling(j); } i = Next(i); if (haspublicbase) { break; } } if (Getattr(n, "access") && haspublicbase) { Delete(acc); acc = NewStringEmpty(); // implicitly public Swig_warning(WARN_PHP_PUBLIC_BASE, input_file, line_number, Char(warnmsg)); Delete(warnmsg); } } if (Cmp(acc, "public") == 0) { // The default visibility for methods is public, so don't specify // that explicitly to keep the wrapper size down. Delete(acc); acc = NewStringEmpty(); } else if (Cmp(acc, "") != 0) { Append(acc, " "); } if (constructor) { const char * arg0; if (max_num_of_arguments > 0) { arg0 = Char(arg_names[0]); } else { arg0 = "res"; Delete(args); args = NewString("$res=null"); } String *mangled_type = SwigType_manglestr(Getattr(n, "type")); Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); Printf(output, "\t\tif (is_resource($%s) && get_resource_type($%s) === '%s') {\n", arg0, arg0, mangled_type); Printf(output, "\t\t\t$this->%s=$%s;\n", SWIG_PTR, arg0); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); } else { Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); } Delete(acc); } else if (wrapperType == staticmembervar) { // We're called twice for a writable static member variable - first // with "foo_set" and then with "foo_get" - so generate half the // wrapper function each time. // // For a const static member, we only get called once. static bool started = false; if (!started) { Printf(output, "\tstatic function %s() {\n", methodname); if (max_num_of_arguments) { // Setter. Printf(output, "\t\tif (func_num_args()) {\n"); Printf(output, "\t\t\t%s(func_get_arg(0));\n", iname); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); started = true; goto done; } } started = false; } else { Printf(output, "\tstatic function %s(%s) {\n", methodname, args); } if (!newobject) Printf(output, "%s", prepare); if (constructor) { if (!directorsEnabled() || !Swig_directorclass(n)) { if (!Len(prepare)) { if (strcmp(methodname, "__construct") == 0) { Printf(output, "\t\t$this->%s=%s;\n", SWIG_PTR, invoke); } else { String *classname = Swig_class_name(current_class); Printf(output, "\t\treturn new %s%s(%s);\n", prefix, classname, invoke); } } } else { Node *parent = Swig_methodclass(n); String *classname = Swig_class_name(parent); Printf(output, "\t\tif (get_class($this) === '%s%s') {\n", prefix, classname); Printf(output, "\t\t\t$_this = null;\n"); Printf(output, "\t\t} else {\n"); Printf(output, "\t\t\t$_this = $this;\n"); Printf(output, "\t\t}\n"); if (!Len(prepare)) { if (num_arguments > 1) { Printf(output, "\t\t$this->%s=%s($_this, %s);\n", SWIG_PTR, iname, args); } else { Printf(output, "\t\t$this->%s=%s($_this);\n", SWIG_PTR, iname); } } } Printf(output, "%s", prepare); } else if (!non_void_return && !hasargout) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t%s;\n", invoke); } else if (is_class(d)) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t$r=%s;\n", invoke); if (Len(ret_types) == 1) { /* If d is abstract we can't create a new wrapper type d. */ Node *d_class = classLookup(d); int is_abstract = 0; if (Getattr(d_class, "abstracts")) { is_abstract = 1; } if (newobject || !is_abstract) { Printf(output, "\t\tif (is_resource($r)) {\n"); if (Getattr(classLookup(Getattr(n, "type")), "module")) { /* * _p_Foo -> Foo, _p_ns__Bar -> Bar * TODO: do this in a more elegant way */ if (Len(prefix) == 0) { Printf(output, "\t\t\t$c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n"); } else { Printf(output, "\t\t\t$c='%s'.substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n", prefix); } Printf(output, "\t\t\tif (class_exists($c)) return new $c($r);\n"); Printf(output, "\t\t\treturn new %s%s($r);\n", prefix, Getattr(classLookup(d), "sym:name")); } else { Printf(output, "\t\t\t$c = new stdClass();\n"); Printf(output, "\t\t\t$c->" SWIG_PTR " = $r;\n"); Printf(output, "\t\t\treturn $c;\n"); } Printf(output, "\t\t}\n\t\treturn $r;\n"); } else { Printf(output, "\t\t$this->%s = $r;\n", SWIG_PTR); Printf(output, "\t\treturn $this;\n"); } } else { Printf(output, "\t\tif (!is_resource($r)) return $r;\n"); String *wrapobj = NULL; String *common = NULL; Iterator i = First(ret_types); while (i.item) { SwigType *ret_type = i.item; i = Next(i); String *mangled = NewString("_p"); Printf(mangled, "%s", SwigType_manglestr(ret_type)); Node *class_node = Getattr(zend_types, mangled); if (!class_node) { /* This is needed when we're returning a pointer to a type * rather than returning the type by value or reference. */ Delete(mangled); mangled = NewString(SwigType_manglestr(ret_type)); class_node = Getattr(zend_types, mangled); if (!class_node) { // Return type isn't an object, so will be handled by the // !is_resource() check before the switch. continue; } } const char *classname = GetChar(class_node, "sym:name"); if (!classname) classname = GetChar(class_node, "name"); String * action = NewStringEmpty(); if (classname) Printf(action, "return new %s%s($r);\n", prefix, classname); else Printf(action, "return $r;\n"); if (!wrapobj) { wrapobj = NewString("\t\tswitch (get_resource_type($r)) {\n"); common = action; } else { if (common && Cmp(common, action) != 0) { Delete(common); common = NULL; } } Printf(wrapobj, "\t\t"); if (i.item) { Printf(wrapobj, "case '%s': ", mangled); } else { Printf(wrapobj, "default: "); } Printv(wrapobj, action, NIL); if (action != common) Delete(action); Delete(mangled); } Printf(wrapobj, "\t\t}\n"); if (common) { // All cases have the same action, so eliminate the switch // wrapper. Printf(output, "\t\t%s", common); Delete(common); } else { Printv(output, wrapobj, NIL); } Delete(wrapobj); } } else { if (non_void_return) { Printf(output, "\t\treturn %s;\n", invoke); } else if (Cmp(invoke, "$r") != 0) { Printf(output, "\t\t%s;\n", invoke); } } Printf(output, "\t}\n"); done: Delete(prepare); Delete(invoke); free(arg_values); Delete(args); args = NULL; for (int i = 0; i < max_num_of_arguments; ++i) { Delete(arg_names[i]); } free(arg_names); arg_names = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * globalvariableHandler() * ------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *tm; /* First do the wrappers such as name_set(), name_get() * as provided by the baseclass's implementation of variableWrapper */ if (Language::globalvariableHandler(n) == SWIG_NOWRAP) { return SWIG_NOWRAP; } if (!addSymbol(iname, n)) return SWIG_ERROR; /* First link C variables to PHP */ tm = Swig_typemap_lookup("varinit", n, name, 0); if (tm) { Replaceall(tm, "$target", name); Printf(s_vinit, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } /* Now generate PHP -> C sync blocks */ /* tm = Swig_typemap_lookup("varin", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_c->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } */ /* Now generate C -> PHP sync blocks */ /* if(!GetFlag(n,"feature:immutable")) { tm = Swig_typemap_lookup("varout", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_php->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } } */ return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; SwigType_remember(type); if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(s_cinit, "%s\n", tm); } if (shadow) { String *enumvalue = GetChar(n, "enumvalue"); String *set_to = iname; if (!enumvalue) { enumvalue = GetChar(n, "enumvalueex"); } if (enumvalue && *Char(enumvalue)) { // Check for a simple constant expression which is valid in PHP. // If we find one, initialise the const member with it; otherwise // we initialise it using the C/C++ wrapped constant. const char *p; for (p = Char(enumvalue); *p; ++p) { if (!isdigit((unsigned char)*p) && !strchr(" +-", *p)) { // FIXME: enhance to handle ` + 1' which is what // we get for enums that don't have an explicit value set. break; } } if (!*p) set_to = enumvalue; } if (wrapping_member_constant) { if (!s_oowrappers) s_oowrappers = NewStringEmpty(); Printf(s_oowrappers, "\n\tconst %s = %s;\n", wrapping_member_constant, set_to); } else { if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); Printf(s_fakeoowrappers, "\n\tconst %s = %s;\n", iname, set_to); } } return SWIG_OK; } /* * PHP5::pragma() * * Pragma directive. * * %pragma(php) code="String" # Includes a string in the .php file * %pragma(php) include="file.php" # Includes a file in the .php file */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *type = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "php") == 0 || Strcmp(lang, "php4") == 0) { if (Strcmp(type, "code") == 0) { if (value) { Printf(pragma_code, "%s\n", value); } } else if (Strcmp(type, "include") == 0) { if (value) { Printf(pragma_incl, "include '%s';\n", value); } } else if (Strcmp(type, "phpinfo") == 0) { if (value) { Printf(pragma_phpinfo, "%s\n", value); } } else { Swig_warning(WARN_PHP_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", type); } } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { if (!Getattr(n, "feature:onlychildren")) { String *symname = Getattr(n, "sym:name"); Setattr(n, "php:proxy", symname); } return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { constructors = 0; current_class = n; if (shadow) { char *rename = GetChar(n, "sym:name"); if (!addSymbol(rename, n)) return SWIG_ERROR; shadow_classname = NewString(rename); shadow_get_vars = NewHash(); shadow_set_vars = NewHash(); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } base = Next(base); if (base.item) { /* Warn about multiple inheritance for additional base class(es) */ while (base.item) { if (GetFlag(base.item, "feature:ignore")) { base = Next(base); continue; } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_PHP_MULTIPLE_INHERITANCE, input_file, line_number, "Warning for %s, base %s ignored. Multiple inheritance is not supported in PHP.\n", proxyclassname, baseclassname); base = Next(base); } } } } classnode = n; Language::classHandler(n); classnode = 0; if (shadow) { List *baselist = Getattr(n, "bases"); Iterator ki, base; if (baselist) { base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } } else { base.item = NULL; } if (Getattr(n, "abstracts") && !GetFlag(n, "feature:notabstract")) { Printf(s_phpclasses, "abstract "); } Printf(s_phpclasses, "class %s%s ", prefix, shadow_classname); String *baseclass = NULL; if (base.item && Getattr(base.item, "module")) { baseclass = Getattr(base.item, "sym:name"); if (!baseclass) baseclass = Getattr(base.item, "name"); Printf(s_phpclasses, "extends %s%s ", prefix, baseclass); } else if (GetFlag(n, "feature:exceptionclass")) { Append(s_phpclasses, "extends Exception "); } { Node *node = NewHash(); Setattr(node, "type", Getattr(n, "name")); Setfile(node, Getfile(n)); Setline(node, Getline(n)); String * interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0); if (interfaces) { Printf(s_phpclasses, "implements %s ", interfaces); } Delete(node); } Printf(s_phpclasses, "{\n\tpublic $%s=null;\n", SWIG_PTR); if (!baseclass) { // Only store this in the base class (NB !baseclass means we *are* // a base class...) Printf(s_phpclasses, "\tprotected $%s=array();\n", SWIG_DATA); } // Write property SET handlers ki = First(shadow_set_vars); if (ki.key) { // This class has setters. Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); // FIXME: tune this threshold... if (Len(shadow_set_vars) <= 2) { // Not many setters, so avoid call_user_func. for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; String *iname = ki.item; Printf(s_phpclasses, "\t\tif ($var === '%s') return %s($this->%s,$value);\n", key, iname, SWIG_PTR); } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_set';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s,$value);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } // Write property GET handlers ki = First(shadow_get_vars); if (ki.key) { // This class has getters. Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); int non_class_getters = 0; for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (!is_class(d)) { ++non_class_getters; continue; } Printv(s_phpclasses, "\t\tif ($var === '", key, "') return new ", prefix, Getattr(classLookup(d), "sym:name"), "(", shadow_classname, "_", key, "_get($this->", SWIG_PTR, "));\n", NIL); } // FIXME: tune this threshold... if (non_class_getters <= 2) { // Not many non-class getters, so avoid call_user_func. for (ki = First(shadow_get_vars); non_class_getters && ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (is_class(d)) continue; Printv(s_phpclasses, "\t\tif ($var === '", key, "') return ", shadow_classname, "_", key, "_get($this->", SWIG_PTR, ");\n", NIL); --non_class_getters; } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_get';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { // Reading an unknown property name gives null in PHP. Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); /* Create __isset for PHP 5.1 and later; PHP 5.0 will just ignore it. */ /* __isset() should return true for read-only properties, so check for * *_get() not *_set(). */ Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif (function_exists('%s_'.$var.'_get')) return true;\n", shadow_classname); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } if (!class_has_ctor) { Printf(s_phpclasses, "\tfunction __construct($h) {\n"); Printf(s_phpclasses, "\t\t$this->%s=$h;\n", SWIG_PTR); Printf(s_phpclasses, "\t}\n"); } if (s_oowrappers) { Printf(s_phpclasses, "%s", s_oowrappers); Delete(s_oowrappers); s_oowrappers = NULL; } class_has_ctor = false; Printf(s_phpclasses, "}\n\n"); Delete(shadow_classname); shadow_classname = NULL; Delete(shadow_set_vars); shadow_set_vars = NULL; Delete(shadow_get_vars); shadow_get_vars = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { wrapperType = memberfn; Language::memberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { wrapperType = membervar; Language::membervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { wrapperType = staticmembervar; Language::staticmembervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { wrapperType = staticmemberfn; Language::staticmemberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } int abstractConstructorHandler(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { constructors++; if (Swig_directorclass(n)) { String *name = GetChar(Swig_methodclass(n), "name"); String *ctype = GetChar(Swig_methodclass(n), "classtype"); String *sname = GetChar(Swig_methodclass(n), "sym:name"); String *args = NewStringEmpty(); ParmList *p = Getattr(n, "parms"); int i; for (i = 0; p; p = nextSibling(p), i++) { if (i) { Printf(args, ", "); } if (Strcmp(GetChar(p, "type"), SwigType_str(GetChar(p, "type"), 0))) { SwigType *t = Getattr(p, "type"); Printf(args, "%s", SwigType_rcaststr(t, 0)); if (SwigType_isreference(t)) { Append(args, "*"); } } Printf(args, "arg%d", i+1); } /* director ctor code is specific for each class */ Delete(director_ctor_code); director_ctor_code = NewStringEmpty(); director_prot_ctor_code = NewStringEmpty(); Printf(director_ctor_code, "if ( arg0->type == IS_NULL ) { /* not subclassed */\n"); Printf(director_prot_ctor_code, "if ( arg0->type == IS_NULL ) { /* not subclassed */\n"); Printf(director_ctor_code, " %s = (%s *)new %s(%s);\n", Swig_cresult_name(), ctype, ctype, args); Printf(director_prot_ctor_code, " SWIG_PHP_Error(E_ERROR, \"accessing abstract class or protected constructor\");\n", name, name, args); if (i) { Insert(args, 0, ", "); } Printf(director_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0 TSRMLS_CC%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Printf(director_prot_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0 TSRMLS_CC%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Delete(args); wrapperType = directorconstructor; } else { wrapperType = constructor; } Language::constructorHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * CreateZendListDestructor() * ------------------------------------------------------------ */ //virtual int destructorHandler(Node *n) { //} int CreateZendListDestructor(Node *n) { String *name = GetChar(Swig_methodclass(n), "name"); String *iname = GetChar(n, "sym:name"); ParmList *l = Getattr(n, "parms"); String *destructorname = NewStringEmpty(); Printf(destructorname, "_%s", Swig_name_wrapper(iname)); Setattr(classnode, "destructor", destructorname); Wrapper *f = NewWrapper(); Printf(f->def, "/* This function is designed to be called by the zend list destructors */\n"); Printf(f->def, "/* to typecast and do the actual destruction */\n"); Printf(f->def, "static void %s(zend_rsrc_list_entry *rsrc, const char *type_name TSRMLS_DC) {\n", destructorname); Wrapper_add_localv(f, "value", "swig_object_wrapper *value=(swig_object_wrapper *) rsrc->ptr", NIL); Wrapper_add_localv(f, "ptr", "void *ptr=value->ptr", NIL); Wrapper_add_localv(f, "newobject", "int newobject=value->newobject", NIL); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); // Get type of first arg, thing to be destructed // Skip ignored arguments Parm *p = l; //while (Getattr(p,"tmap:ignore")) {p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); Printf(f->code, " efree(value);\n"); Printf(f->code, " if (! newobject) return; /* can't delete it! */\n"); Printf(f->code, " arg1 = (%s)SWIG_ZTS_ConvertResourceData(ptr,type_name,SWIGTYPE%s TSRMLS_CC);\n", SwigType_lstr(pt, 0), SwigType_manglestr(pt)); Printf(f->code, " if (! arg1) zend_error(E_ERROR, \"%s resource already free'd\");\n", Char(name)); Setattr(n, "wrap:name", destructorname); String *actioncode = emit_action(n); Append(f->code, actioncode); Delete(actioncode); Printf(f->code, "thrown:\n"); Append(f->code, "return;\n"); Append(f->code, "fail:\n"); Append(f->code, "SWIG_FAIL(TSRMLS_C);\n"); Printf(f->code, "}\n"); Wrapper_print(f, s_wrappers); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { wrapping_member_constant = Getattr(n, "sym:name"); Language::memberconstantHandler(n); wrapping_member_constant = NULL; return SWIG_OK; } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n"); return Language::classDirectorEnd(n); } int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewStringEmpty(); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("zval"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { // There should always be a "self" parameter first. assert(ParmList_len(parms) > 0); /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); // We put TSRMLS_DC after the self parameter in order to cope with // any default parameters. String *target = Swig_method_decl(0, decl, classname, parms, 0, 0); const char * p = Char(target); const char * comma = strchr(p, ','); int ins = comma ? (int)(comma - p) : Len(target) - 1; Insert(target, ins, " TSRMLS_DC"); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self TSRMLS_CC) {", classname, target, call); Append(w->def, "}"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { // We put TSRMLS_DC after the self parameter in order to cope with // any default parameters. String *target = Swig_method_decl(0, decl, classname, parms, 0, 1); const char * p = Char(target); const char * comma = strchr(p, ','); int ins = comma ? (int)(comma - p) : Len(target) - 1; Insert(target, ins, " TSRMLS_DC"); Printf(f_directors_h, " %s;\n", target); Delete(target); } } return Language::classDirectorConstructor(n); } int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewStringEmpty(); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewStringEmpty(); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (Cmp(returntype, "void") == 0 && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); Printf(w->code, "TSRMLS_FETCH_FROM_CTX(swig_zts_ctx);\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\" TSRMLS_CC);\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> PHP) */ String *parse_args = NewStringEmpty(); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; char source[256]; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { sprintf(source, "obj%d", idx++); String *input = NewStringf("&%s", source); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); Printv(wrap_args, "zval ", source, ";\n", NIL); Printf(wrap_args, "args[%d] = &%s;\n", idx - 1, source); Printv(wrap_args, "INIT_ZVAL(", source, ");\n", NIL); Printv(wrap_args, tm, "\n", NIL); Putc('O', parse_args); } else { Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } p = nextSibling(p); } /* exception handling */ bool error_used_in_typemap = false; tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Replaceall(tm, "$error", "error")) { /* Only declare error if it is used by the typemap. */ error_used_in_typemap = true; Append(w->code, "int error;\n"); } } else { Delete(tm); tm = NULL; } if (!idx) { Printf(w->code, "zval **args = NULL;\n"); } else { Printf(w->code, "zval *args[%d];\n", idx); } Printf(w->code, "zval *%s, funcname;\n", Swig_cresult_name()); Append(w->code, "if (!swig_self) {\n"); Append(w->code, " SWIG_PHP_Error(E_ERROR, \"this pointer is NULL\");"); Append(w->code, "}\n\n"); Printf(w->code, "MAKE_STD_ZVAL(%s);\n", Swig_cresult_name()); const char * funcname = GetChar(n, "sym:name"); Printf(w->code, "ZVAL_STRINGL(&funcname, (char *)\"%s\", %d, 0);\n", funcname, strlen(funcname)); /* wrap complex arguments to zvals */ Printv(w->code, wrap_args, NIL); if (error_used_in_typemap) { Append(w->code, "error = "); } Append(w->code, "call_user_function(EG(function_table), (zval**)&swig_self, &funcname,"); Printf(w->code, " %s, %d, args TSRMLS_CC);\n", Swig_cresult_name(), idx); if (tm) { Printv(w->code, Str(tm), "\n", NIL); Delete(tm); } /* marshal return value from PHP to C/C++ type */ String *cleanup = NewStringEmpty(); String *outarg = NewStringEmpty(); idx = 0; /* marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { Replaceall(tm, "$input", Swig_cresult_name()); char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Printf(w->code, "FREE_ZVAL(%s);\n", Swig_cresult_name()); Delete(parse_args); Delete(cleanup); Delete(outarg); } Append(w->code, "thrown:\n"); if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } else { Append(w->code, "return;\n"); } Append(w->code, "fail:\n"); Append(w->code, "SWIG_FAIL(TSRMLS_C);\n"); Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewStringEmpty(); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } int classDirectorDisown(Node *) { return SWIG_OK; } }; /* class PHP */ static PHP5 *maininstance = 0; // We use this function to be able to write out zend_register_list_destructor_ex // lines for most things in the type table // NOTE: it's a function NOT A PHP5::METHOD extern "C" { static void typetrace(const SwigType *ty, String *mangled, String *clientdata) { Node *class_node; if (!zend_types) { zend_types = NewHash(); } // we want to know if the type which reduced to this has a constructor if ((class_node = maininstance->classLookup(ty))) { if (!Getattr(zend_types, mangled)) { // OK it may have been set before by a different SwigType but it would // have had the same underlying class node I think // - it is certainly required not to have different originating class // nodes for the same SwigType Setattr(zend_types, mangled, class_node); } } else { // a non-class pointer Setattr(zend_types, mangled, NOTCLASS); } if (r_prevtracefunc) (*r_prevtracefunc) (ty, mangled, (String *) clientdata); } } /* ----------------------------------------------------------------------------- * new_swig_php5() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_php5() { maininstance = new PHP5; if (!r_prevtracefunc) { r_prevtracefunc = SwigType_remember_trace(typetrace); } else { Printf(stderr, "php Typetrace vector already saved!\n"); assert(0); } return maininstance; } extern "C" Language *swig_php4(void) { Printf(stderr, "*** -php4 is no longer supported.\n" "*** Either upgrade to PHP5 or use SWIG 1.3.36 or earlier.\n"); SWIG_exit(EXIT_FAILURE); return NULL; // To avoid compiler warnings. } extern "C" Language *swig_php5(void) { return new_swig_php5(); } swig-3.0.12/Source/Modules/php.cxx0000664000175000017500000026363213042756442016634 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * php.cxx * * PHP language module for SWIG. * ----------------------------------------------------------------------------- */ /* FIXME: PHP5 OO wrapping TODO list: * * Medium term: * * Handle default parameters on overloaded methods in PHP where possible. * (Mostly done - just need to handle cases of overloaded methods with * default parameters...) * This is an optimisation - we could handle this case using a PHP * default value, but currently we treat it as we would for a default * value which is a compound C++ expression (i.e. as if we had a * method with two overloaded forms instead of a single method with * a default parameter value). * * Long term: * * Sort out locale-dependent behaviour of strtod() - it's harmless unless * SWIG ever sets the locale and DOH/base.c calls atof, so we're probably * OK currently at least. */ /* * TODO: Replace remaining stderr messages with Swig_error or Swig_warning * (may need to add more WARN_PHP_xxx codes...) */ #include "swigmod.h" #include #include static const char *usage = "\ PHP Options (available with -php7)\n\ -noproxy - Don't generate proxy classes.\n\ -prefix - Prepend to all class names in PHP wrappers\n\ \n"; /* The original class wrappers for PHP stored the pointer to the C++ class in * the object property _cPtr. If we use the same name for the member variable * which we put the pointer to the C++ class in, then the flat function * wrappers will automatically pull it out without any changes being required. * FIXME: Isn't using a leading underscore a bit suspect here? */ #define SWIG_PTR "_cPtr" /* This is the name of the hash where the variables existing only in PHP * classes are stored. */ #define SWIG_DATA "_pData" static int constructors = 0; static String *NOTCLASS = NewString("Not a class"); static Node *classnode = 0; static String *module = 0; static String *cap_module = 0; static String *prefix = 0; static String *shadow_classname = 0; static File *f_begin = 0; static File *f_runtime = 0; static File *f_runtime_h = 0; static File *f_h = 0; static File *f_phpcode = 0; static File *f_directors = 0; static File *f_directors_h = 0; static String *phpfilename = 0; static String *s_header; static String *s_wrappers; static String *s_init; static String *r_init; // RINIT user code static String *s_shutdown; // MSHUTDOWN user code static String *r_shutdown; // RSHUTDOWN user code static String *s_vinit; // varinit initialization code. static String *s_vdecl; static String *s_cinit; // consttab initialization code. static String *s_oinit; static String *s_arginfo; static String *s_entry; static String *cs_entry; static String *all_cs_entry; static String *pragma_incl; static String *pragma_code; static String *pragma_phpinfo; static String *s_oowrappers; static String *s_fakeoowrappers; static String *s_phpclasses; /* To reduce code size (generated and compiled) we only want to emit each * different arginfo once, so we need to track which have been used. */ static Hash *arginfo_used; /* Variables for using PHP classes */ static Node *current_class = 0; static Hash *shadow_get_vars; static Hash *shadow_set_vars; static Hash *zend_types = 0; static int shadow = 1; static bool class_has_ctor = false; static String *wrapping_member_constant = NULL; // These static variables are used to pass some state from Handlers into functionWrapper static enum { standard = 0, memberfn, staticmemberfn, membervar, staticmembervar, constructor, directorconstructor } wrapperType = standard; extern "C" { static void (*r_prevtracefunc) (const SwigType *t, String *mangled, String *clientdata) = 0; } static void SwigPHP_emit_resource_registrations() { Iterator ki; bool emitted_default_dtor = false; if (!zend_types) return; ki = First(zend_types); if (ki.key) Printf(s_oinit, "\n/* Register resource destructors for pointer types */\n"); while (ki.key) { DOH *key = ki.key; Node *class_node = ki.item; String *human_name = key; String *rsrc_dtor_name = NULL; // write out body if (class_node != NOTCLASS) { String *destructor = Getattr(class_node, "destructor"); human_name = Getattr(class_node, "sym:name"); if (!human_name) human_name = Getattr(class_node, "name"); // Do we have a known destructor for this type? if (destructor) { rsrc_dtor_name = NewStringf("_wrap_destroy%s", key); // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " %s(res, SWIGTYPE%s->name);\n", destructor, key); Printf(s_wrappers, "}\n"); } } if (!rsrc_dtor_name) { rsrc_dtor_name = NewString("_swig_default_rsrc_destroy"); if (!emitted_default_dtor) { // Write out custom destructor function Printf(s_wrappers, "static ZEND_RSRC_DTOR_FUNC(%s) {\n", rsrc_dtor_name); Printf(s_wrappers, " efree(res->ptr);\n"); Printf(s_wrappers, "}\n"); emitted_default_dtor = true; } } // declare le_swig_ to store php registration Printf(s_vdecl, "static int le_swig_%s=0; /* handle for %s */\n", key, human_name); // register with php Printf(s_oinit, "le_swig_%s=zend_register_list_destructors_ex" "(%s, NULL, SWIGTYPE%s->name, module_number);\n", key, rsrc_dtor_name, key); // store php type in class struct Printf(s_oinit, "SWIG_TypeClientData(SWIGTYPE%s,&le_swig_%s);\n", key, key); Delete(rsrc_dtor_name); ki = Next(ki); } } class PHP : public Language { public: PHP() { director_language = 1; } /* ------------------------------------------------------------ * main() * ------------------------------------------------------------ */ virtual void main(int argc, char *argv[]) { SWIG_library_directory("php"); for (int i = 1; i < argc; i++) { if (strcmp(argv[i], "-prefix") == 0) { if (argv[i + 1]) { prefix = NewString(argv[i + 1]); Swig_mark_arg(i); Swig_mark_arg(i + 1); i++; } else { Swig_arg_error(); } } else if ((strcmp(argv[i], "-noshadow") == 0) || (strcmp(argv[i], "-noproxy") == 0)) { shadow = 0; Swig_mark_arg(i); } else if (strcmp(argv[i], "-help") == 0) { fputs(usage, stdout); } } Preprocessor_define("SWIGPHP 1", 0); Preprocessor_define("SWIGPHP7 1", 0); SWIG_typemap_lang("php"); SWIG_config_file("php.swg"); allow_overloading(); } /* ------------------------------------------------------------ * top() * ------------------------------------------------------------ */ virtual int top(Node *n) { String *filen; /* Check if directors are enabled for this module. */ Node *mod = Getattr(n, "module"); if (mod) { Node *options = Getattr(mod, "options"); if (options && Getattr(options, "directors")) { allow_directors(); } } /* Set comparison with null for ConstructorToFunction */ setSubclassInstanceCheck(NewString("Z_TYPE_P($arg) != IS_NULL")); /* Initialize all of the output files */ String *outfile = Getattr(n, "outfile"); String *outfile_h = Getattr(n, "outfile_h"); /* main output file */ f_begin = NewFile(outfile, "w", SWIG_output_files()); if (!f_begin) { FileErrorDisplay(outfile); SWIG_exit(EXIT_FAILURE); } f_runtime = NewStringEmpty(); /* sections of the output file */ s_init = NewStringEmpty(); r_init = NewStringEmpty(); s_shutdown = NewStringEmpty(); r_shutdown = NewStringEmpty(); s_header = NewString("/* header section */\n"); s_wrappers = NewString("/* wrapper section */\n"); /* subsections of the init section */ s_vinit = NewStringEmpty(); s_vdecl = NewString("/* vdecl subsection */\n"); s_cinit = NewString("/* cinit subsection */\n"); s_oinit = NewString("/* oinit subsection */\n"); pragma_phpinfo = NewStringEmpty(); s_phpclasses = NewString("/* PHP Proxy Classes */\n"); f_directors_h = NewStringEmpty(); f_directors = NewStringEmpty(); if (directorsEnabled()) { f_runtime_h = NewFile(outfile_h, "w", SWIG_output_files()); if (!f_runtime_h) { FileErrorDisplay(outfile_h); SWIG_exit(EXIT_FAILURE); } } /* Register file targets with the SWIG file handler */ Swig_register_filebyname("begin", f_begin); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("init", s_init); Swig_register_filebyname("rinit", r_init); Swig_register_filebyname("shutdown", s_shutdown); Swig_register_filebyname("rshutdown", r_shutdown); Swig_register_filebyname("header", s_header); Swig_register_filebyname("wrapper", s_wrappers); Swig_register_filebyname("director", f_directors); Swig_register_filebyname("director_h", f_directors_h); Swig_banner(f_begin); Printf(f_runtime, "\n\n#ifndef SWIGPHP\n#define SWIGPHP\n#endif\n\n"); if (directorsEnabled()) { Printf(f_runtime, "#define SWIG_DIRECTORS\n"); } /* Set the module name */ module = Copy(Getattr(n, "name")); cap_module = NewStringf("%(upper)s", module); if (!prefix) prefix = NewStringEmpty(); Printf(f_runtime, "#define SWIG_PREFIX \"%s\"\n", prefix); Printf(f_runtime, "#define SWIG_PREFIX_LEN %lu\n", (unsigned long)Len(prefix)); if (directorsEnabled()) { Swig_banner(f_directors_h); Printf(f_directors_h, "\n"); Printf(f_directors_h, "#ifndef SWIG_%s_WRAP_H_\n", cap_module); Printf(f_directors_h, "#define SWIG_%s_WRAP_H_\n\n", cap_module); String *filename = Swig_file_filename(outfile_h); Printf(f_directors, "\n#include \"%s\"\n\n", filename); Delete(filename); } /* PHP module file */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), module, ".php", NIL); phpfilename = NewString(filen); f_phpcode = NewFile(filen, "w", SWIG_output_files()); if (!f_phpcode) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Printf(f_phpcode, "error_msg = default_error_msg;\n"); Printf(s_header, " globals->error_code = default_error_code;\n"); Printf(s_header, "}\n"); Printf(s_header, "static void SWIG_ResetError(void) {\n"); Printf(s_header, " SWIG_ErrorMsg() = default_error_msg;\n"); Printf(s_header, " SWIG_ErrorCode() = default_error_code;\n"); Printf(s_header, "}\n"); Append(s_header, "\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_alter_newobject) {\n", module); Append(s_header, " zval args[2];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError();\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); Append(s_header, " value->newobject = zval_is_true(&args[1]);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "ZEND_NAMED_FUNCTION(_wrap_swig_%s_get_newobject) {\n", module); Append(s_header, " zval args[1];\n"); Append(s_header, " swig_object_wrapper *value;\n"); Append(s_header, "\n"); Append(s_header, " SWIG_ResetError();\n"); Append(s_header, " if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {\n"); Append(s_header, " WRONG_PARAM_COUNT;\n"); Append(s_header, " }\n"); Append(s_header, "\n"); Append(s_header, " value = (swig_object_wrapper *) Z_RES_VAL(args[0]);\n"); Append(s_header, " RETVAL_LONG(value->newobject);\n"); Append(s_header, "\n"); Append(s_header, " return;\n"); Append(s_header, "}\n"); Printf(s_header, "#define SWIG_name \"%s\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "extern \"C\" {\n"); Printf(s_header, "#endif\n"); Printf(s_header, "#include \"php.h\"\n"); Printf(s_header, "#include \"php_ini.h\"\n"); Printf(s_header, "#include \"ext/standard/info.h\"\n"); Printf(s_header, "#include \"php_%s.h\"\n", module); Printf(s_header, "#ifdef __cplusplus\n"); Printf(s_header, "}\n"); Printf(s_header, "#endif\n\n"); if (directorsEnabled()) { // Insert director runtime Swig_insert_file("director_common.swg", s_header); Swig_insert_file("director.swg", s_header); } /* Create the .h file too */ filen = NewStringEmpty(); Printv(filen, SWIG_output_directory(), "php_", module, ".h", NIL); f_h = NewFile(filen, "w", SWIG_output_files()); if (!f_h) { FileErrorDisplay(filen); SWIG_exit(EXIT_FAILURE); } Swig_banner(f_h); Printf(f_h, "\n"); Printf(f_h, "#ifndef PHP_%s_H\n", cap_module); Printf(f_h, "#define PHP_%s_H\n\n", cap_module); Printf(f_h, "extern zend_module_entry %s_module_entry;\n", module); Printf(f_h, "#define phpext_%s_ptr &%s_module_entry\n\n", module, module); Printf(f_h, "#ifdef PHP_WIN32\n"); Printf(f_h, "# define PHP_%s_API __declspec(dllexport)\n", cap_module); Printf(f_h, "#else\n"); Printf(f_h, "# define PHP_%s_API\n", cap_module); Printf(f_h, "#endif\n\n"); /* start the arginfo section */ s_arginfo = NewString("/* arginfo subsection */\n"); arginfo_used = NewHash(); /* start the function entry section */ s_entry = NewString("/* entry subsection */\n"); /* holds all the per-class function entry sections */ all_cs_entry = NewString("/* class entry subsection */\n"); cs_entry = NULL; Printf(s_entry, "/* Every non-class user visible function must have an entry here */\n"); Printf(s_entry, "static zend_function_entry %s_functions[] = {\n", module); /* Emit all of the code */ Language::top(n); SwigPHP_emit_resource_registrations(); /* start the init section */ { String * s_init_old = s_init; s_init = NewString("/* init section */\n"); Printv(s_init, "zend_module_entry ", module, "_module_entry = {\n", NIL); Printf(s_init, " STANDARD_MODULE_HEADER,\n"); Printf(s_init, " \"%s\",\n", module); Printf(s_init, " %s_functions,\n", module); Printf(s_init, " PHP_MINIT(%s),\n", module); if (Len(s_shutdown) > 0) { Printf(s_init, " PHP_MSHUTDOWN(%s),\n", module); } else { Printf(s_init, " NULL, /* No MSHUTDOWN code */\n"); } if (Len(r_init) > 0 || Len(s_vinit) > 0) { Printf(s_init, " PHP_RINIT(%s),\n", module); } else { Printf(s_init, " NULL, /* No RINIT code */\n"); } if (Len(r_shutdown) > 0) { Printf(s_init, " PHP_RSHUTDOWN(%s),\n", module); } else { Printf(s_init, " NULL, /* No RSHUTDOWN code */\n"); } if (Len(pragma_phpinfo) > 0) { Printf(s_init, " PHP_MINFO(%s),\n", module); } else { Printf(s_init, " NULL, /* No MINFO code */\n"); } Printf(s_init, " NO_VERSION_YET,\n"); Printf(s_init, " STANDARD_MODULE_PROPERTIES\n"); Printf(s_init, "};\n"); Printf(s_init, "zend_module_entry* SWIG_module_entry = &%s_module_entry;\n\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "extern \"C\" {\n"); Printf(s_init, "#endif\n"); // We want to write "SWIGEXPORT ZEND_GET_MODULE(%s)" but ZEND_GET_MODULE // in PHP5 has "extern "C" { ... }" around it so we can't do that. Printf(s_init, "SWIGEXPORT zend_module_entry *get_module(void) { return &%s_module_entry; }\n", module); Printf(s_init, "#ifdef __cplusplus\n"); Printf(s_init, "}\n"); Printf(s_init, "#endif\n\n"); Printf(s_init, "#define SWIG_php_minit PHP_MINIT_FUNCTION(%s)\n\n", module); Printv(s_init, s_init_old, NIL); Delete(s_init_old); } /* We have to register the constants before they are (possibly) used * by the pointer typemaps. This all needs re-arranging really as * things are being called in the wrong order */ // Printv(s_init,s_resourcetypes,NIL); /* We need this after all classes written out by ::top */ Printf(s_oinit, "CG(active_class_entry) = NULL;\n"); Printf(s_oinit, "/* end oinit subsection */\n"); Printf(s_init, "%s\n", s_oinit); /* Constants generated during top call */ Printf(s_cinit, "/* end cinit subsection */\n"); Printf(s_init, "%s\n", s_cinit); Clear(s_cinit); Delete(s_cinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); // Now do REQUEST init which holds any user specified %rinit, and also vinit if (Len(r_init) > 0 || Len(s_vinit) > 0) { Printf(f_h, "PHP_RINIT_FUNCTION(%s);\n", module); Printf(s_init, "PHP_RINIT_FUNCTION(%s)\n{\n", module); if (Len(r_init) > 0) { Printv(s_init, "/* rinit section */\n", r_init, "\n", NIL); } if (Len(s_vinit) > 0) { /* finish our init section which will have been used by class wrappers */ Printv(s_init, "/* vinit subsection */\n", s_vinit, "\n" "/* end vinit subsection */\n", NIL); Clear(s_vinit); } Delete(s_vinit); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); } Printf(f_h, "PHP_MINIT_FUNCTION(%s);\n", module); if (Len(s_shutdown) > 0) { Printf(f_h, "PHP_MSHUTDOWN_FUNCTION(%s);\n", module); Printv(s_init, "PHP_MSHUTDOWN_FUNCTION(", module, ")\n" "/* shutdown section */\n" "{\n", s_shutdown, " return SUCCESS;\n" "}\n\n", NIL); } if (Len(r_shutdown) > 0) { Printf(f_h, "PHP_RSHUTDOWN_FUNCTION(%s);\n", module); Printf(s_init, "PHP_RSHUTDOWN_FUNCTION(%s)\n{\n", module); Printf(s_init, "/* rshutdown section */\n"); Printf(s_init, "%s\n", r_shutdown); Printf(s_init, " return SUCCESS;\n"); Printf(s_init, "}\n\n"); } if (Len(pragma_phpinfo) > 0) { Printf(f_h, "PHP_MINFO_FUNCTION(%s);\n", module); Printf(s_init, "PHP_MINFO_FUNCTION(%s)\n{\n", module); Printf(s_init, "%s", pragma_phpinfo); Printf(s_init, "}\n"); } Printf(s_init, "/* end init section */\n"); Printf(f_h, "\n#endif /* PHP_%s_H */\n", cap_module); Delete(f_h); String *type_table = NewStringEmpty(); SwigType_emit_type_table(f_runtime, type_table); Printf(s_header, "%s", type_table); Delete(type_table); /* Oh dear, more things being called in the wrong order. This whole * function really needs totally redoing. */ if (directorsEnabled()) { Dump(f_directors_h, f_runtime_h); Printf(f_runtime_h, "\n"); Printf(f_runtime_h, "#endif\n"); Delete(f_runtime_h); } Printf(s_header, "/* end header section */\n"); Printf(s_wrappers, "/* end wrapper section */\n"); Printf(s_vdecl, "/* end vdecl subsection */\n"); Dump(f_runtime, f_begin); Printv(f_begin, s_header, NIL); if (directorsEnabled()) { Dump(f_directors, f_begin); } Printv(f_begin, s_vdecl, s_wrappers, NIL); Printv(f_begin, all_cs_entry, "\n\n", s_arginfo, "\n\n", s_entry, " SWIG_ZEND_NAMED_FE(swig_", module, "_alter_newobject,_wrap_swig_", module, "_alter_newobject,NULL)\n" " SWIG_ZEND_NAMED_FE(swig_", module, "_get_newobject,_wrap_swig_", module, "_get_newobject,NULL)\n" " ZEND_FE_END\n};\n\n", NIL); Printv(f_begin, s_init, NIL); Delete(s_header); Delete(s_wrappers); Delete(s_init); Delete(s_vdecl); Delete(all_cs_entry); Delete(s_entry); Delete(s_arginfo); Delete(f_runtime); Delete(f_begin); Delete(arginfo_used); Printf(f_phpcode, "%s\n%s\n", pragma_incl, pragma_code); if (s_fakeoowrappers) { Printf(f_phpcode, "abstract class %s {", Len(prefix) ? prefix : module); Printf(f_phpcode, "%s", s_fakeoowrappers); Printf(f_phpcode, "}\n\n"); Delete(s_fakeoowrappers); s_fakeoowrappers = NULL; } Printf(f_phpcode, "%s\n?>\n", s_phpclasses); Delete(f_phpcode); return SWIG_OK; } /* Just need to append function names to function table to register with PHP. */ void create_command(String *cname, String *iname, Node *n) { // This is for the single main zend_function_entry record Printf(f_h, "ZEND_NAMED_FUNCTION(%s);\n", iname); // We want to only emit each different arginfo once, as that reduces the // size of both the generated source code and the compiled extension // module. To do this, we name the arginfo to encode the number of // parameters and which (if any) are passed by reference by using a // sequence of 0s (for non-reference) and 1s (for by references). ParmList *l = Getattr(n, "parms"); String * arginfo_code = NewStringEmpty(); for (Parm *p = l; p; p = Getattr(p, "tmap:in:next")) { /* Ignored parameters */ if (checkAttribute(p, "tmap:in:numinputs", "0")) { continue; } Append(arginfo_code, GetFlag(p, "tmap:in:byref") ? "1" : "0"); } if (!GetFlag(arginfo_used, arginfo_code)) { // Not had this one before, so emit it. SetFlag(arginfo_used, arginfo_code); Printf(s_arginfo, "ZEND_BEGIN_ARG_INFO_EX(swig_arginfo_%s, 0, 0, 0)\n", arginfo_code); for (const char * p = Char(arginfo_code); *p; ++p) { Printf(s_arginfo, " ZEND_ARG_PASS_INFO(%c)\n", *p); } Printf(s_arginfo, "ZEND_END_ARG_INFO()\n"); } String * s = cs_entry; if (!s) s = s_entry; Printf(s, " SWIG_ZEND_NAMED_FE(%(lower)s,%s,swig_arginfo_%s)\n", cname, iname, arginfo_code); Delete(arginfo_code); } /* ------------------------------------------------------------ * dispatchFunction() * ------------------------------------------------------------ */ void dispatchFunction(Node *n) { /* Last node in overloaded chain */ int maxargs; String *tmp = NewStringEmpty(); if (Swig_directorclass(n) && wrapperType == directorconstructor) { /* We have an extra 'this' parameter. */ SetFlag(n, "wrap:this"); } String *dispatch = Swig_overload_dispatch(n, "%s(INTERNAL_FUNCTION_PARAM_PASSTHRU); return;", &maxargs); /* Generate a dispatch wrapper for all overloaded functions */ Wrapper *f = NewWrapper(); String *symname = Getattr(n, "sym:name"); String *wname = Swig_name_wrapper(symname); create_command(symname, wname, n); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); Wrapper_add_local(f, "argc", "int argc"); Printf(tmp, "zval argv[%d]", maxargs); Wrapper_add_local(f, "argv", tmp); Printf(f->code, "argc = ZEND_NUM_ARGS();\n"); Printf(f->code, "zend_get_parameters_array_ex(argc, argv);\n"); Replaceall(dispatch, "$args", "self,args"); Printv(f->code, dispatch, "\n", NIL); Printf(f->code, "SWIG_ErrorCode() = E_ERROR;\n"); Printf(f->code, "SWIG_ErrorMsg() = \"No matching function for overloaded '%s'\";\n", symname); Printv(f->code, "SWIG_FAIL();\n", NIL); Printv(f->code, "}\n", NIL); Wrapper_print(f, s_wrappers); DelWrapper(f); Delete(dispatch); Delete(tmp); Delete(wname); } /* ------------------------------------------------------------ * functionWrapper() * ------------------------------------------------------------ */ /* Helper method for PHP::functionWrapper */ bool is_class(SwigType *t) { Node *n = classLookup(t); if (n) { String *r = Getattr(n, "php:proxy"); // Set by classDeclaration() if (!r) r = Getattr(n, "sym:name"); // Not seen by classDeclaration yet, but this is the name if (r) return true; } return false; } virtual int functionWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *d = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *nodeType = Getattr(n, "nodeType"); int newobject = GetFlag(n, "feature:new"); int constructor = (Cmp(nodeType, "constructor") == 0); Parm *p; int i; int numopt; String *tm; Wrapper *f; String *wname; int overloaded = 0; String *overname = 0; if (Cmp(nodeType, "destructor") == 0) { // We just generate the Zend List Destructor and let Zend manage the // reference counting. There's no explicit destructor, but the user can // just do `$obj = null;' to remove a reference to an object. return CreateZendListDestructor(n); } // Test for overloading; if (Getattr(n, "sym:overloaded")) { overloaded = 1; overname = Getattr(n, "sym:overname"); } else { if (!addSymbol(iname, n)) return SWIG_ERROR; } wname = Swig_name_wrapper(iname); if (overname) { Printf(wname, "%s", overname); } f = NewWrapper(); String *outarg = NewStringEmpty(); String *cleanup = NewStringEmpty(); Printv(f->def, "ZEND_NAMED_FUNCTION(", wname, ") {\n", NIL); emit_parameter_variables(l, f); /* Attach standard typemaps */ emit_attach_parmmaps(l, f); // Not issued for overloaded functions. if (!overloaded) { create_command(iname, wname, n); } // wrap:parms is used by overload resolution. Setattr(n, "wrap:parms", l); int num_arguments = emit_num_arguments(l); int num_required = emit_num_required(l); numopt = num_arguments - num_required; if (wrapperType == directorconstructor) num_arguments++; if (num_arguments > 0) { String *args = NewStringEmpty(); if (wrapperType == directorconstructor) Wrapper_add_local(f, "arg0", "zval * arg0"); Printf(args, "zval args[%d]", num_arguments); Wrapper_add_local(f, "args", args); Delete(args); args = NULL; } // This generated code may be called: // 1) as an object method, or // 2) as a class-method/function (without a "this_ptr") // Option (1) has "this_ptr" for "this", option (2) needs it as // first parameter // NOTE: possible we ignore this_ptr as a param for native constructor Printf(f->code, "SWIG_ResetError();\n"); if (numopt > 0) { // membervariable wrappers do not have optional args Wrapper_add_local(f, "arg_count", "int arg_count"); Printf(f->code, "arg_count = ZEND_NUM_ARGS();\n"); Printf(f->code, "if(arg_count<%d || arg_count>%d ||\n", num_required, num_arguments); Printf(f->code, " zend_get_parameters_array_ex(arg_count,args)!=SUCCESS)\n"); Printf(f->code, "\tWRONG_PARAM_COUNT;\n\n"); } else { if (num_arguments == 0) { Printf(f->code, "if(ZEND_NUM_ARGS() != 0) {\n"); } else { Printf(f->code, "if(ZEND_NUM_ARGS() != %d || zend_get_parameters_array_ex(%d, args) != SUCCESS) {\n", num_arguments, num_arguments); } Printf(f->code, "WRONG_PARAM_COUNT;\n}\n\n"); } if (wrapperType == directorconstructor) Printf(f->code, "arg0 = &args[0];\n \n"); /* Now convert from PHP to C variables */ // At this point, argcount if used is the number of deliberately passed args // not including this_ptr even if it is used. // It means error messages may be out by argbase with error // reports. We can either take argbase into account when raising // errors, or find a better way of dealing with _thisptr. // I would like, if objects are wrapped, to assume _thisptr is always // _this and not the first argument. // This may mean looking at Language::memberfunctionHandler int limit = num_arguments; if (wrapperType == directorconstructor) limit--; for (i = 0, p = l; i < limit; i++) { String *source; /* Skip ignored arguments */ //while (Getattr(p,"tmap:ignore")) { p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); if (wrapperType == directorconstructor) { source = NewStringf("args[%d]", i+1); } else { source = NewStringf("args[%d]", i); } String *ln = Getattr(p, "lname"); /* Check if optional */ if (i >= num_required) { Printf(f->code, "\tif(arg_count > %d) {\n", i); } if ((tm = Getattr(p, "tmap:in"))) { Replaceall(tm, "$source", &source); Replaceall(tm, "$target", ln); Replaceall(tm, "$input", source); Setattr(p, "emit:input", source); Printf(f->code, "%s\n", tm); if (i == 0 && Getattr(p, "self")) { Printf(f->code, "\tif(!arg1) SWIG_PHP_Error(E_ERROR, \"this pointer is NULL\");\n"); } p = Getattr(p, "tmap:in:next"); if (i >= num_required) { Printf(f->code, "}\n"); } continue; } else { Swig_warning(WARN_TYPEMAP_IN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument.\n", SwigType_str(pt, 0)); } if (i >= num_required) { Printf(f->code, "\t}\n"); } Delete(source); } if (is_member_director(n)) { Wrapper_add_local(f, "upcall", "bool upcall = false"); Printf(f->code, "upcall = !Swig::Director::swig_is_overridden_method(\"%s%s\", \"%s\");\n", prefix, Swig_class_name(Swig_methodclass(n)), name); } Swig_director_emit_dynamic_cast(n, f); /* Insert constraint checking code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:check"))) { Replaceall(tm, "$target", Getattr(p, "lname")); Printv(f->code, tm, "\n", NIL); p = Getattr(p, "tmap:check:next"); } else { p = nextSibling(p); } } /* Insert cleanup code */ for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:freearg"))) { Replaceall(tm, "$source", Getattr(p, "lname")); Printv(cleanup, tm, "\n", NIL); p = Getattr(p, "tmap:freearg:next"); } else { p = nextSibling(p); } } /* Insert argument output code */ bool hasargout = false; for (i = 0, p = l; p; i++) { if ((tm = Getattr(p, "tmap:argout"))) { hasargout = true; Replaceall(tm, "$source", Getattr(p, "lname")); // Replaceall(tm,"$input",Getattr(p,"lname")); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$arg", Getattr(p, "emit:input")); Replaceall(tm, "$input", Getattr(p, "emit:input")); Printv(outarg, tm, "\n", NIL); p = Getattr(p, "tmap:argout:next"); } else { p = nextSibling(p); } } Setattr(n, "wrap:name", wname); /* emit function call */ String *actioncode = emit_action(n); if ((tm = Swig_typemap_lookup_out("out", n, Swig_cresult_name(), f, actioncode))) { Replaceall(tm, "$input", Swig_cresult_name()); Replaceall(tm, "$source", Swig_cresult_name()); Replaceall(tm, "$target", "return_value"); Replaceall(tm, "$result", "return_value"); Replaceall(tm, "$owner", newobject ? "1" : "0"); Printf(f->code, "%s\n", tm); } else { Swig_warning(WARN_TYPEMAP_OUT_UNDEF, input_file, line_number, "Unable to use return type %s in function %s.\n", SwigType_str(d, 0), name); } emit_return_variable(n, d, f); if (outarg) { Printv(f->code, outarg, NIL); } if (cleanup) { Printv(f->code, cleanup, NIL); } /* Look to see if there is any newfree cleanup code */ if (GetFlag(n, "feature:new")) { if ((tm = Swig_typemap_lookup("newfree", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } } /* See if there is any return cleanup code */ if ((tm = Swig_typemap_lookup("ret", n, Swig_cresult_name(), 0))) { Printf(f->code, "%s\n", tm); Delete(tm); } Printf(f->code, "thrown:\n"); Printf(f->code, "return;\n"); /* Error handling code */ Printf(f->code, "fail:\n"); Printv(f->code, cleanup, NIL); Append(f->code, "SWIG_FAIL();\n"); Printf(f->code, "}\n"); Replaceall(f->code, "$cleanup", cleanup); Replaceall(f->code, "$symname", iname); Wrapper_print(f, s_wrappers); DelWrapper(f); f = NULL; if (overloaded && !Getattr(n, "sym:nextSibling")) { dispatchFunction(n); } Delete(wname); wname = NULL; if (!shadow) { return SWIG_OK; } // Handle getters and setters. if (wrapperType == membervar) { const char *p = Char(iname); if (strlen(p) > 4) { p += strlen(p) - 4; String *varname = Getattr(n, "membervariableHandler:sym:name"); if (strcmp(p, "_get") == 0) { Setattr(shadow_get_vars, varname, Getattr(n, "type")); } else if (strcmp(p, "_set") == 0) { Setattr(shadow_set_vars, varname, iname); } } return SWIG_OK; } // Only look at non-overloaded methods and the last entry in each overload // chain (we check the last so that wrap:parms and wrap:name have been set // for them all). if (overloaded && Getattr(n, "sym:nextSibling") != 0) return SWIG_OK; if (!s_oowrappers) s_oowrappers = NewStringEmpty(); if (newobject || wrapperType == memberfn || wrapperType == staticmemberfn || wrapperType == standard || wrapperType == staticmembervar) { bool handle_as_overload = false; String **arg_names; String **arg_values; unsigned char * byref; // Method or static method or plain function. const char *methodname = 0; String *output = s_oowrappers; if (constructor) { class_has_ctor = true; // Skip the Foo:: prefix. char *ptr = strrchr(GetChar(Swig_methodclass(n), "sym:name"), ':'); if (ptr) { ptr++; } else { ptr = GetChar(Swig_methodclass(n), "sym:name"); } if (strcmp(ptr, GetChar(n, "constructorHandler:sym:name")) == 0) { methodname = "__construct"; } else { // The class has multiple constructors and this one is // renamed, so this will be a static factory function methodname = GetChar(n, "constructorHandler:sym:name"); } } else if (wrapperType == memberfn) { methodname = Char(Getattr(n, "memberfunctionHandler:sym:name")); } else if (wrapperType == staticmemberfn) { methodname = Char(Getattr(n, "staticmemberfunctionHandler:sym:name")); } else if (wrapperType == staticmembervar) { // Static member variable, wrapped as a function due to PHP limitations. methodname = Char(Getattr(n, "staticmembervariableHandler:sym:name")); } else { // wrapperType == standard methodname = Char(iname); if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); output = s_fakeoowrappers; } bool really_overloaded = overloaded ? true : false; int min_num_of_arguments = emit_num_required(l); int max_num_of_arguments = emit_num_arguments(l); Hash *ret_types = NewHash(); Setattr(ret_types, d, d); bool non_void_return = (Cmp(d, "void") != 0); if (overloaded) { // Look at all the overloaded versions of this method in turn to // decide if it's really an overloaded method, or just one where some // parameters have default values. Node *o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } SwigType *d2 = Getattr(o, "type"); if (!d2) { assert(constructor); } else if (!Getattr(ret_types, d2)) { Setattr(ret_types, d2, d2); non_void_return = non_void_return || (Cmp(d2, "void") != 0); } ParmList *l2 = Getattr(o, "wrap:parms"); int num_arguments = emit_num_arguments(l2); int num_required = emit_num_required(l2); if (num_required < min_num_of_arguments) min_num_of_arguments = num_required; if (num_arguments > max_num_of_arguments) { max_num_of_arguments = num_arguments; } o = Getattr(o, "sym:nextSibling"); } o = Getattr(n, "sym:overloaded"); while (o) { if (o == n) { o = Getattr(o, "sym:nextSibling"); continue; } ParmList *l2 = Getattr(o, "wrap:parms"); Parm *p = l, *p2 = l2; if (wrapperType == memberfn) { p = nextSibling(p); p2 = nextSibling(p2); } while (p && p2) { if (Cmp(Getattr(p, "type"), Getattr(p2, "type")) != 0) break; if (Cmp(Getattr(p, "name"), Getattr(p2, "name")) != 0) break; String *value = Getattr(p, "value"); String *value2 = Getattr(p2, "value"); if (value && !value2) break; if (!value && value2) break; if (value) { if (Cmp(value, value2) != 0) break; } p = nextSibling(p); p2 = nextSibling(p2); } if (p && p2) break; // One parameter list is a prefix of the other, so check that all // remaining parameters of the longer list are optional. if (p2) p = p2; while (p && Getattr(p, "value")) p = nextSibling(p); if (p) break; o = Getattr(o, "sym:nextSibling"); } if (!o) { // This "overloaded method" is really just one with default args. really_overloaded = false; } } if (wrapperType == memberfn) { // Allow for the "this" pointer. --min_num_of_arguments; --max_num_of_arguments; } arg_names = (String **) malloc(max_num_of_arguments * sizeof(String *)); if (!arg_names) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); exit(1); } for (i = 0; i < max_num_of_arguments; ++i) { arg_names[i] = NULL; } arg_values = (String **) malloc(max_num_of_arguments * sizeof(String *)); byref = (unsigned char *) malloc(max_num_of_arguments); if (!arg_values || !byref) { /* FIXME: How should this be handled? The rest of SWIG just seems * to not bother checking for malloc failing! */ fprintf(stderr, "Malloc failed!\n"); exit(1); } for (i = 0; i < max_num_of_arguments; ++i) { arg_values[i] = NULL; byref[i] = false; } Node *o; if (overloaded) { o = Getattr(n, "sym:overloaded"); } else { o = n; } while (o) { int argno = 0; Parm *p = Getattr(o, "wrap:parms"); if (wrapperType == memberfn) p = nextSibling(p); while (p) { if (GetInt(p, "tmap:in:numinputs") == 0) { p = nextSibling(p); continue; } assert(0 <= argno && argno < max_num_of_arguments); byref[argno] = GetFlag(p, "tmap:in:byref"); String *&pname = arg_names[argno]; const char *pname_cstr = GetChar(p, "name"); // Just get rid of the C++ namespace part for now. const char *ptr = NULL; if (pname_cstr && (ptr = strrchr(pname_cstr, ':'))) { pname_cstr = ptr + 1; } if (!pname_cstr) { // Unnamed parameter, e.g. int foo(int); } else if (!pname) { pname = NewString(pname_cstr); } else { size_t len = strlen(pname_cstr); size_t spc = 0; size_t len_pname = strlen(Char(pname)); while (spc + len <= len_pname) { if (strncmp(pname_cstr, Char(pname) + spc, len) == 0) { char ch = ((char *) Char(pname))[spc + len]; if (ch == '\0' || ch == ' ') { // Already have this pname_cstr. pname_cstr = NULL; break; } } char *p = strchr(Char(pname) + spc, ' '); if (!p) break; spc = (p + 4) - Char(pname); } if (pname_cstr) { Printf(pname, " or_%s", pname_cstr); } } String *value = NewString(Getattr(p, "value")); if (Len(value)) { /* Check that value is a valid constant in PHP (and adjust it if * necessary, or replace it with "?" if it's just not valid). */ SwigType *type = Getattr(p, "type"); switch (SwigType_type(type)) { case T_BOOL: { if (Strcmp(value, "true") == 0 || Strcmp(value, "false") == 0) break; char *p; errno = 0; long n = strtol(Char(value), &p, 0); Clear(value); if (errno || *p) { Append(value, "?"); } else if (n) { Append(value, "true"); } else { Append(value, "false"); } break; } case T_CHAR: case T_SCHAR: case T_SHORT: case T_INT: case T_LONG: case T_LONGLONG: { char *p; errno = 0; long n = strtol(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_UCHAR: case T_USHORT: case T_UINT: case T_ULONG: case T_ULONGLONG: { char *p; errno = 0; unsigned int n = strtoul(Char(value), &p, 0); (void) n; if (errno || *p) { Clear(value); Append(value, "?"); } break; } case T_FLOAT: case T_DOUBLE: case T_LONGDOUBLE: { char *p; errno = 0; /* FIXME: strtod is locale dependent... */ double val = strtod(Char(value), &p); if (errno || *p) { Clear(value); Append(value, "?"); } else if (strchr(Char(value), '.') == 0) { // Ensure value is a double constant, not an integer one. Append(value, ".0"); double val2 = strtod(Char(value), &p); if (errno || *p || val != val2) { Clear(value); Append(value, "?"); } } break; } case T_STRING: if (Len(value) < 2) { // How can a string (including "" be less than 2 characters?) Clear(value); Append(value, "?"); } else { const char *v = Char(value); if (v[0] != '"' || v[Len(value) - 1] != '"') { Clear(value); Append(value, "?"); } // Strings containing "$" require special handling, but we do // that later. } break; case T_VOID: assert(false); break; case T_POINTER: { const char *v = Char(value); if (v[0] == '(') { // Handle "(void*)0", "(TYPE*)0", "(char*)NULL", etc. v += strcspn(v + 1, "*()") + 1; if (*v == '*') { do { v++; v += strspn(v, " \t"); } while (*v == '*'); if (*v++ == ')') { v += strspn(v, " \t"); String * old = value; value = NewString(v); Delete(old); } } } if (Strcmp(value, "NULL") == 0 || Strcmp(value, "nullptr") == 0 || Strcmp(value, "0") == 0 || Strcmp(value, "0L") == 0) { Clear(value); Append(value, "null"); } else { Clear(value); Append(value, "?"); } break; } default: /* Safe default */ Clear(value); Append(value, "?"); break; } if (!arg_values[argno]) { arg_values[argno] = value; value = NULL; } else if (Cmp(arg_values[argno], value) != 0) { // If a parameter has two different default values in // different overloaded forms of the function, we can't // set its default in PHP. Flag this by setting its // default to `?'. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } } else if (arg_values[argno]) { // This argument already has a default value in another overloaded // form, but doesn't in this form. So don't try to do anything // clever, just let the C wrappers resolve the overload and set the // default values. // // This handling is safe, but I'm wondering if it may be overly // conservative (FIXME) in some cases. It seems it's only bad when // there's an overloaded form with the appropriate number of // parameters which doesn't want the default value, but I need to // think about this more. Delete(arg_values[argno]); arg_values[argno] = NewString("?"); } Delete(value); p = nextSibling(p); ++argno; } if (!really_overloaded) break; o = Getattr(o, "sym:nextSibling"); } /* Clean up any parameters which haven't yet got names, or whose * names clash. */ Hash *seen = NewHash(); /* We need $this to refer to the current class, so can't allow it * to be used as a parameter. */ Setattr(seen, "this", seen); /* We use $r to store the return value, so disallow that as a parameter * name in case the user uses the "call-time pass-by-reference" feature * (it's deprecated and off by default in PHP5, but we want to be * maximally portable). Similarly we use $c for the classname or new * stdClass object. */ Setattr(seen, "r", seen); Setattr(seen, "c", seen); for (int argno = 0; argno < max_num_of_arguments; ++argno) { String *&pname = arg_names[argno]; if (pname) { Replaceall(pname, " ", "_"); } else { /* We get here if the SWIG .i file has "int foo(int);" */ pname = NewStringEmpty(); Printf(pname, "arg%d", argno + 1); } // Check if we've already used this parameter name. while (Getattr(seen, pname)) { // Append "_" to clashing names until they stop clashing... Printf(pname, "_"); } Setattr(seen, Char(pname), seen); if (arg_values[argno] && Cmp(arg_values[argno], "?") == 0) { handle_as_overload = true; } } Delete(seen); seen = NULL; String *invoke = NewStringEmpty(); String *prepare = NewStringEmpty(); String *args = NewStringEmpty(); if (!handle_as_overload && !(really_overloaded && max_num_of_arguments > min_num_of_arguments)) { Printf(invoke, "%s(", iname); if (wrapperType == memberfn) { Printf(invoke, "$this->%s", SWIG_PTR); } for (int i = 0; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); if (i || wrapperType == memberfn) Printf(invoke, ","); if (byref[i]) Printf(args, "&"); String *value = arg_values[i]; if (value) { const char *v = Char(value); if (v[0] == '"') { /* In a PHP double quoted string, $ needs to be escaped as \$. */ Replaceall(value, "$", "\\$"); } Printf(args, "$%s=%s", arg_names[i], value); } else if (constructor && i >= 1 && i < min_num_of_arguments) { // We need to be able to call __construct($resource). Printf(args, "$%s=null", arg_names[i]); } else { Printf(args, "$%s", arg_names[i]); } Printf(invoke, "$%s", arg_names[i]); } Printf(invoke, ")"); } else { int i; for (i = 0; i < min_num_of_arguments; ++i) { if (i) Printf(args, ","); Printf(args, "$%s", arg_names[i]); } String *invoke_args = NewStringEmpty(); if (wrapperType == memberfn) { Printf(invoke_args, "$this->%s", SWIG_PTR); if (min_num_of_arguments > 0) Printf(invoke_args, ","); } Printf(invoke_args, "%s", args); if (constructor && min_num_of_arguments > 1) { // We need to be able to call __construct($resource). Clear(args); Printf(args, "$%s", arg_names[0]); for (i = 1; i < min_num_of_arguments; ++i) { Printf(args, ","); Printf(args, "$%s=null", arg_names[i]); } } bool had_a_case = false; int last_handled_i = i - 1; for (; i < max_num_of_arguments; ++i) { if (i) Printf(args, ","); const char *value = Char(arg_values[i]); // FIXME: (really_overloaded && handle_as_overload) is perhaps a // little conservative, but it doesn't hit any cases that it // shouldn't for Xapian at least (and we need it to handle // "Enquire::get_mset()" correctly). bool non_php_default = ((really_overloaded && handle_as_overload) || !value || strcmp(value, "?") == 0); if (non_php_default) value = "null"; Printf(args, "$%s=%s", arg_names[i], value); if (non_php_default) { if (!had_a_case) { Printf(prepare, "\t\tswitch (func_num_args()) {\n"); had_a_case = true; } Printf(prepare, "\t\t"); while (last_handled_i < i) { Printf(prepare, "case %d: ", ++last_handled_i); } if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !newobject) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !newobject) { Printf(prepare, "%s(%s); break;\n", iname, invoke_args); } else if (!i) { Printf(prepare, "%s($_this%s); break;\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s); break;\n", iname, invoke_args); } } if (i || wrapperType == memberfn) Printf(invoke_args, ","); Printf(invoke_args, "$%s", arg_names[i]); } Printf(prepare, "\t\t"); if (had_a_case) Printf(prepare, "default: "); if (non_void_return) { if ((!directorsEnabled() || !Swig_directorclass(n)) && !newobject) { Append(prepare, "$r="); } else { Printf(prepare, "$this->%s=", SWIG_PTR); } } if (!directorsEnabled() || !Swig_directorclass(n) || !newobject) { Printf(prepare, "%s(%s);\n", iname, invoke_args); } else { Printf(prepare, "%s($_this, %s);\n", iname, invoke_args); } if (had_a_case) Printf(prepare, "\t\t}\n"); Delete(invoke_args); Printf(invoke, "$r"); } Printf(output, "\n"); // If it's a member function or a class constructor... if (wrapperType == memberfn || (constructor && current_class)) { String *acc = NewString(Getattr(n, "access")); // If a base has the same method with public access, then PHP // requires to have it here as public as well Node *bases = Getattr(Swig_methodclass(n), "bases"); if (bases && Strcmp(acc, "public") != 0) { String *warnmsg = 0; int haspublicbase = 0; Iterator i = First(bases); while (i.item) { Node *j = firstChild(i.item); while (j) { String *jname = Getattr(j, "name"); if (!jname || Strcmp(jname, Getattr(n, "name")) != 0) { j = nextSibling(j); continue; } if (Strcmp(nodeType(j), "cdecl") == 0) { if (!Getattr(j, "access") || checkAttribute(j, "access", "public")) { haspublicbase = 1; } } else if (Strcmp(nodeType(j), "using") == 0 && firstChild(j) && Strcmp(nodeType(firstChild(j)), "cdecl") == 0) { if (!Getattr(firstChild(j), "access") || checkAttribute(firstChild(j), "access", "public")) { haspublicbase = 1; } } if (haspublicbase) { warnmsg = NewStringf("Modifying the access of '%s::%s' to public, as the base '%s' has it as public as well.\n", Getattr(current_class, "classtype"), Getattr(n, "name"), Getattr(i.item, "classtype")); break; } j = nextSibling(j); } i = Next(i); if (haspublicbase) { break; } } if (Getattr(n, "access") && haspublicbase) { Delete(acc); acc = NewStringEmpty(); // implicitly public Swig_warning(WARN_PHP_PUBLIC_BASE, input_file, line_number, Char(warnmsg)); Delete(warnmsg); } } if (Cmp(acc, "public") == 0) { // The default visibility for methods is public, so don't specify // that explicitly to keep the wrapper size down. Delete(acc); acc = NewStringEmpty(); } else if (Cmp(acc, "") != 0) { Append(acc, " "); } if (constructor) { const char * arg0; if (max_num_of_arguments > 0) { arg0 = Char(arg_names[0]); } else { arg0 = "res"; Delete(args); args = NewString("$res=null"); } String *mangled_type = SwigType_manglestr(Getattr(n, "type")); Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); Printf(output, "\t\tif (is_resource($%s) && get_resource_type($%s) === '%s') {\n", arg0, arg0, mangled_type); Printf(output, "\t\t\t$this->%s=$%s;\n", SWIG_PTR, arg0); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); } else { Printf(output, "\t%sfunction %s(%s) {\n", acc, methodname, args); } Delete(acc); } else if (wrapperType == staticmembervar) { // We're called twice for a writable static member variable - first // with "foo_set" and then with "foo_get" - so generate half the // wrapper function each time. // // For a const static member, we only get called once. static bool started = false; if (!started) { Printf(output, "\tstatic function %s() {\n", methodname); if (max_num_of_arguments) { // Setter. Printf(output, "\t\tif (func_num_args()) {\n"); Printf(output, "\t\t\t%s(func_get_arg(0));\n", iname); Printf(output, "\t\t\treturn;\n"); Printf(output, "\t\t}\n"); started = true; goto done; } } started = false; } else { Printf(output, "\tstatic function %s(%s) {\n", methodname, args); } if (!newobject) Printf(output, "%s", prepare); if (constructor) { if (!directorsEnabled() || !Swig_directorclass(n)) { if (!Len(prepare)) { if (strcmp(methodname, "__construct") == 0) { Printf(output, "\t\t$this->%s=%s;\n", SWIG_PTR, invoke); } else { String *classname = Swig_class_name(current_class); Printf(output, "\t\treturn new %s%s(%s);\n", prefix, classname, invoke); } } } else { Node *parent = Swig_methodclass(n); String *classname = Swig_class_name(parent); Printf(output, "\t\tif (get_class($this) === '%s%s') {\n", prefix, classname); Printf(output, "\t\t\t$_this = null;\n"); Printf(output, "\t\t} else {\n"); Printf(output, "\t\t\t$_this = $this;\n"); Printf(output, "\t\t}\n"); if (!Len(prepare)) { if (num_arguments > 1) { Printf(output, "\t\t$this->%s=%s($_this, %s);\n", SWIG_PTR, iname, args); } else { Printf(output, "\t\t$this->%s=%s($_this);\n", SWIG_PTR, iname); } } } Printf(output, "%s", prepare); } else if (!non_void_return && !hasargout) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t%s;\n", invoke); } else if (is_class(d)) { if (Cmp(invoke, "$r") != 0) Printf(output, "\t\t$r=%s;\n", invoke); if (Len(ret_types) == 1) { /* If d is abstract we can't create a new wrapper type d. */ Node *d_class = classLookup(d); int is_abstract = 0; if (Getattr(d_class, "abstracts")) { is_abstract = 1; } if (newobject || !is_abstract) { Printf(output, "\t\tif (is_resource($r)) {\n"); if (Getattr(classLookup(Getattr(n, "type")), "module")) { /* * _p_Foo -> Foo, _p_ns__Bar -> Bar * TODO: do this in a more elegant way */ if (Len(prefix) == 0) { Printf(output, "\t\t\t$c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n"); } else { Printf(output, "\t\t\t$c='%s'.substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3));\n", prefix); } Printf(output, "\t\t\tif (class_exists($c)) return new $c($r);\n"); Printf(output, "\t\t\treturn new %s%s($r);\n", prefix, Getattr(classLookup(d), "sym:name")); } else { Printf(output, "\t\t\t$c = new stdClass();\n"); Printf(output, "\t\t\t$c->" SWIG_PTR " = $r;\n"); Printf(output, "\t\t\treturn $c;\n"); } Printf(output, "\t\t}\n\t\treturn $r;\n"); } else { Printf(output, "\t\t$this->%s = $r;\n", SWIG_PTR); Printf(output, "\t\treturn $this;\n"); } } else { Printf(output, "\t\tif (!is_resource($r)) return $r;\n"); String *wrapobj = NULL; String *common = NULL; Iterator i = First(ret_types); while (i.item) { SwigType *ret_type = i.item; i = Next(i); String *mangled = NewString("_p"); Printf(mangled, "%s", SwigType_manglestr(ret_type)); Node *class_node = Getattr(zend_types, mangled); if (!class_node) { /* This is needed when we're returning a pointer to a type * rather than returning the type by value or reference. */ Delete(mangled); mangled = NewString(SwigType_manglestr(ret_type)); class_node = Getattr(zend_types, mangled); if (!class_node) { // Return type isn't an object, so will be handled by the // !is_resource() check before the switch. continue; } } const char *classname = GetChar(class_node, "sym:name"); if (!classname) classname = GetChar(class_node, "name"); String * action = NewStringEmpty(); if (classname) Printf(action, "return new %s%s($r);\n", prefix, classname); else Printf(action, "return $r;\n"); if (!wrapobj) { wrapobj = NewString("\t\tswitch (get_resource_type($r)) {\n"); common = action; } else { if (common && Cmp(common, action) != 0) { Delete(common); common = NULL; } } Printf(wrapobj, "\t\t"); if (i.item) { Printf(wrapobj, "case '%s': ", mangled); } else { Printf(wrapobj, "default: "); } Printv(wrapobj, action, NIL); if (action != common) Delete(action); Delete(mangled); } Printf(wrapobj, "\t\t}\n"); if (common) { // All cases have the same action, so eliminate the switch // wrapper. Printf(output, "\t\t%s", common); Delete(common); } else { Printv(output, wrapobj, NIL); } Delete(wrapobj); } } else { if (non_void_return) { Printf(output, "\t\treturn %s;\n", invoke); } else if (Cmp(invoke, "$r") != 0) { Printf(output, "\t\t%s;\n", invoke); } } Printf(output, "\t}\n"); done: Delete(prepare); Delete(invoke); free(arg_values); Delete(args); args = NULL; for (int i = 0; i < max_num_of_arguments; ++i) { Delete(arg_names[i]); } free(arg_names); arg_names = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * globalvariableHandler() * ------------------------------------------------------------ */ virtual int globalvariableHandler(Node *n) { char *name = GetChar(n, "name"); char *iname = GetChar(n, "sym:name"); SwigType *t = Getattr(n, "type"); String *tm; /* First do the wrappers such as name_set(), name_get() * as provided by the baseclass's implementation of variableWrapper */ if (Language::globalvariableHandler(n) == SWIG_NOWRAP) { return SWIG_NOWRAP; } if (!addSymbol(iname, n)) return SWIG_ERROR; /* First link C variables to PHP */ tm = Swig_typemap_lookup("varinit", n, name, 0); if (tm) { Replaceall(tm, "$target", name); Printf(s_vinit, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } /* Now generate PHP -> C sync blocks */ /* tm = Swig_typemap_lookup("varin", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_c->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } */ /* Now generate C -> PHP sync blocks */ /* if(!GetFlag(n,"feature:immutable")) { tm = Swig_typemap_lookup("varout", n, name, 0); if(tm) { Replaceall(tm, "$symname", iname); Printf(f_php->code, "%s\n", tm); } else { Swig_error(input_file, line_number, "Unable to link with type %s\n", SwigType_str(t, 0)); } } */ return SWIG_OK; } /* ------------------------------------------------------------ * constantWrapper() * ------------------------------------------------------------ */ virtual int constantWrapper(Node *n) { String *name = GetChar(n, "name"); String *iname = GetChar(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *rawval = Getattr(n, "rawval"); String *value = rawval ? rawval : Getattr(n, "value"); String *tm; if (!addSymbol(iname, n)) return SWIG_ERROR; SwigType_remember(type); if ((tm = Swig_typemap_lookup("consttab", n, name, 0))) { Replaceall(tm, "$source", value); Replaceall(tm, "$target", name); Replaceall(tm, "$value", value); Printf(s_cinit, "%s\n", tm); } if (shadow) { String *enumvalue = GetChar(n, "enumvalue"); String *set_to = iname; if (!enumvalue) { enumvalue = GetChar(n, "enumvalueex"); } if (enumvalue && *Char(enumvalue)) { // Check for a simple constant expression which is valid in PHP. // If we find one, initialise the const member with it; otherwise // we initialise it using the C/C++ wrapped constant. const char *p; for (p = Char(enumvalue); *p; ++p) { if (!isdigit((unsigned char)*p) && !strchr(" +-", *p)) { // FIXME: enhance to handle ` + 1' which is what // we get for enums that don't have an explicit value set. break; } } if (!*p) set_to = enumvalue; } if (wrapping_member_constant) { if (!s_oowrappers) s_oowrappers = NewStringEmpty(); Printf(s_oowrappers, "\n\tconst %s = %s;\n", wrapping_member_constant, set_to); } else { if (!s_fakeoowrappers) s_fakeoowrappers = NewStringEmpty(); Printf(s_fakeoowrappers, "\n\tconst %s = %s;\n", iname, set_to); } } return SWIG_OK; } /* * PHP::pragma() * * Pragma directive. * * %pragma(php) code="String" # Includes a string in the .php file * %pragma(php) include="file.php" # Includes a file in the .php file */ virtual int pragmaDirective(Node *n) { if (!ImportMode) { String *lang = Getattr(n, "lang"); String *type = Getattr(n, "name"); String *value = Getattr(n, "value"); if (Strcmp(lang, "php") == 0 || Strcmp(lang, "php4") == 0) { if (Strcmp(type, "code") == 0) { if (value) { Printf(pragma_code, "%s\n", value); } } else if (Strcmp(type, "include") == 0) { if (value) { Printf(pragma_incl, "include '%s';\n", value); } } else if (Strcmp(type, "phpinfo") == 0) { if (value) { Printf(pragma_phpinfo, "%s\n", value); } } else { Swig_warning(WARN_PHP_UNKNOWN_PRAGMA, input_file, line_number, "Unrecognized pragma <%s>.\n", type); } } } return Language::pragmaDirective(n); } /* ------------------------------------------------------------ * classDeclaration() * ------------------------------------------------------------ */ virtual int classDeclaration(Node *n) { if (!Getattr(n, "feature:onlychildren")) { String *symname = Getattr(n, "sym:name"); Setattr(n, "php:proxy", symname); } return Language::classDeclaration(n); } /* ------------------------------------------------------------ * classHandler() * ------------------------------------------------------------ */ virtual int classHandler(Node *n) { constructors = 0; current_class = n; if (shadow) { char *rename = GetChar(n, "sym:name"); if (!addSymbol(rename, n)) return SWIG_ERROR; shadow_classname = NewString(rename); shadow_get_vars = NewHash(); shadow_set_vars = NewHash(); /* Deal with inheritance */ List *baselist = Getattr(n, "bases"); if (baselist) { Iterator base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } base = Next(base); if (base.item) { /* Warn about multiple inheritance for additional base class(es) */ while (base.item) { if (GetFlag(base.item, "feature:ignore")) { base = Next(base); continue; } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_PHP_MULTIPLE_INHERITANCE, input_file, line_number, "Warning for %s, base %s ignored. Multiple inheritance is not supported in PHP.\n", proxyclassname, baseclassname); base = Next(base); } } } } classnode = n; Language::classHandler(n); classnode = 0; if (shadow) { List *baselist = Getattr(n, "bases"); Iterator ki, base; if (baselist) { base = First(baselist); while (base.item && GetFlag(base.item, "feature:ignore")) { base = Next(base); } } else { base.item = NULL; } if (Getattr(n, "abstracts") && !GetFlag(n, "feature:notabstract")) { Printf(s_phpclasses, "abstract "); } Printf(s_phpclasses, "class %s%s ", prefix, shadow_classname); String *baseclass = NULL; if (base.item && Getattr(base.item, "module")) { baseclass = Getattr(base.item, "sym:name"); if (!baseclass) baseclass = Getattr(base.item, "name"); Printf(s_phpclasses, "extends %s%s ", prefix, baseclass); } else if (GetFlag(n, "feature:exceptionclass")) { Append(s_phpclasses, "extends Exception "); } { Node *node = NewHash(); Setattr(node, "type", Getattr(n, "name")); Setfile(node, Getfile(n)); Setline(node, Getline(n)); String * interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0); if (interfaces) { Printf(s_phpclasses, "implements %s ", interfaces); } Delete(node); } Printf(s_phpclasses, "{\n\tpublic $%s=null;\n", SWIG_PTR); if (!baseclass) { // Only store this in the base class (NB !baseclass means we *are* // a base class...) Printf(s_phpclasses, "\tprotected $%s=array();\n", SWIG_DATA); } // Write property SET handlers ki = First(shadow_set_vars); if (ki.key) { // This class has setters. Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); // FIXME: tune this threshold... if (Len(shadow_set_vars) <= 2) { // Not many setters, so avoid call_user_func. for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; String *iname = ki.item; Printf(s_phpclasses, "\t\tif ($var === '%s') return %s($this->%s,$value);\n", key, iname, SWIG_PTR); } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_set';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s,$value);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __set($var,$value) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_alter_newobject($this->%s,$value);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\t%s%s::__set($var,$value);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\t$this->%s[$var] = $value;\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } // Write property GET handlers ki = First(shadow_get_vars); if (ki.key) { // This class has getters. Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); int non_class_getters = 0; for (; ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (!is_class(d)) { ++non_class_getters; continue; } Printv(s_phpclasses, "\t\tif ($var === '", key, "') return new ", prefix, Getattr(classLookup(d), "sym:name"), "(", shadow_classname, "_", key, "_get($this->", SWIG_PTR, "));\n", NIL); } // FIXME: tune this threshold... if (non_class_getters <= 2) { // Not many non-class getters, so avoid call_user_func. for (ki = First(shadow_get_vars); non_class_getters && ki.key; ki = Next(ki)) { DOH *key = ki.key; SwigType *d = ki.item; if (is_class(d)) continue; Printv(s_phpclasses, "\t\tif ($var === '", key, "') return ", shadow_classname, "_", key, "_get($this->", SWIG_PTR, ");\n", NIL); --non_class_getters; } } else { Printf(s_phpclasses, "\t\t$func = '%s_'.$var.'_get';\n", shadow_classname); Printf(s_phpclasses, "\t\tif (function_exists($func)) return call_user_func($func,$this->%s);\n", SWIG_PTR); } Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { // Reading an unknown property name gives null in PHP. Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); /* Create __isset for PHP 5.1 and later; PHP 5.0 will just ignore it. */ /* __isset() should return true for read-only properties, so check for * *_get() not *_set(). */ Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif (function_exists('%s_'.$var.'_get')) return true;\n", shadow_classname); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } else { Printf(s_phpclasses, "\n\tfunction __get($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return swig_%s_get_newobject($this->%s);\n", module, SWIG_PTR); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__get($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn $this->%s[$var];\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); Printf(s_phpclasses, "\n\tfunction __isset($var) {\n"); Printf(s_phpclasses, "\t\tif ($var === 'thisown') return true;\n"); if (baseclass) { Printf(s_phpclasses, "\t\treturn %s%s::__isset($var);\n", prefix, baseclass); } else { Printf(s_phpclasses, "\t\treturn array_key_exists($var, $this->%s);\n", SWIG_DATA); } Printf(s_phpclasses, "\t}\n"); } if (!class_has_ctor) { Printf(s_phpclasses, "\tfunction __construct($h) {\n"); Printf(s_phpclasses, "\t\t$this->%s=$h;\n", SWIG_PTR); Printf(s_phpclasses, "\t}\n"); } if (s_oowrappers) { Printf(s_phpclasses, "%s", s_oowrappers); Delete(s_oowrappers); s_oowrappers = NULL; } class_has_ctor = false; Printf(s_phpclasses, "}\n\n"); Delete(shadow_classname); shadow_classname = NULL; Delete(shadow_set_vars); shadow_set_vars = NULL; Delete(shadow_get_vars); shadow_get_vars = NULL; } return SWIG_OK; } /* ------------------------------------------------------------ * memberfunctionHandler() * ------------------------------------------------------------ */ virtual int memberfunctionHandler(Node *n) { wrapperType = memberfn; Language::memberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * membervariableHandler() * ------------------------------------------------------------ */ virtual int membervariableHandler(Node *n) { wrapperType = membervar; Language::membervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmembervariableHandler() * ------------------------------------------------------------ */ virtual int staticmembervariableHandler(Node *n) { wrapperType = staticmembervar; Language::staticmembervariableHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * staticmemberfunctionHandler() * ------------------------------------------------------------ */ virtual int staticmemberfunctionHandler(Node *n) { wrapperType = staticmemberfn; Language::staticmemberfunctionHandler(n); wrapperType = standard; return SWIG_OK; } int abstractConstructorHandler(Node *) { return SWIG_OK; } /* ------------------------------------------------------------ * constructorHandler() * ------------------------------------------------------------ */ virtual int constructorHandler(Node *n) { constructors++; if (Swig_directorclass(n)) { String *name = GetChar(Swig_methodclass(n), "name"); String *ctype = GetChar(Swig_methodclass(n), "classtype"); String *sname = GetChar(Swig_methodclass(n), "sym:name"); String *args = NewStringEmpty(); ParmList *p = Getattr(n, "parms"); int i; for (i = 0; p; p = nextSibling(p), i++) { if (i) { Printf(args, ", "); } if (Strcmp(GetChar(p, "type"), SwigType_str(GetChar(p, "type"), 0))) { SwigType *t = Getattr(p, "type"); Printf(args, "%s", SwigType_rcaststr(t, 0)); if (SwigType_isreference(t)) { Append(args, "*"); } } Printf(args, "arg%d", i+1); } /* director ctor code is specific for each class */ Delete(director_ctor_code); director_ctor_code = NewStringEmpty(); director_prot_ctor_code = NewStringEmpty(); Printf(director_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); Printf(director_prot_ctor_code, "if (Z_TYPE_P(arg0) == IS_NULL) { /* not subclassed */\n"); Printf(director_ctor_code, " %s = (%s *)new %s(%s);\n", Swig_cresult_name(), ctype, ctype, args); Printf(director_prot_ctor_code, " SWIG_PHP_Error(E_ERROR, \"accessing abstract class or protected constructor\");\n", name, name, args); if (i) { Insert(args, 0, ", "); } Printf(director_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Printf(director_prot_ctor_code, "} else {\n %s = (%s *)new SwigDirector_%s(arg0%s);\n}\n", Swig_cresult_name(), ctype, sname, args); Delete(args); wrapperType = directorconstructor; } else { wrapperType = constructor; } Language::constructorHandler(n); wrapperType = standard; return SWIG_OK; } /* ------------------------------------------------------------ * CreateZendListDestructor() * ------------------------------------------------------------ */ //virtual int destructorHandler(Node *n) { //} int CreateZendListDestructor(Node *n) { String *name = GetChar(Swig_methodclass(n), "name"); String *iname = GetChar(n, "sym:name"); ParmList *l = Getattr(n, "parms"); String *destructorname = NewStringEmpty(); Printf(destructorname, "_%s", Swig_name_wrapper(iname)); Setattr(classnode, "destructor", destructorname); Wrapper *f = NewWrapper(); Printf(f->def, "/* This function is designed to be called by the zend list destructors */\n"); Printf(f->def, "/* to typecast and do the actual destruction */\n"); Printf(f->def, "static void %s(zend_resource *res, const char *type_name) {\n", destructorname); Wrapper_add_localv(f, "value", "swig_object_wrapper *value=(swig_object_wrapper *) res->ptr", NIL); Wrapper_add_localv(f, "ptr", "void *ptr=value->ptr", NIL); Wrapper_add_localv(f, "newobject", "int newobject=value->newobject", NIL); emit_parameter_variables(l, f); emit_attach_parmmaps(l, f); // Get type of first arg, thing to be destructed // Skip ignored arguments Parm *p = l; //while (Getattr(p,"tmap:ignore")) {p = Getattr(p,"tmap:ignore:next");} while (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); } SwigType *pt = Getattr(p, "type"); Printf(f->code, " efree(value);\n"); Printf(f->code, " if (! newobject) return; /* can't delete it! */\n"); Printf(f->code, " arg1 = (%s)SWIG_ConvertResourceData(ptr, type_name, SWIGTYPE%s);\n", SwigType_lstr(pt, 0), SwigType_manglestr(pt)); Printf(f->code, " if (! arg1) zend_error(E_ERROR, \"%s resource already free'd\");\n", Char(name)); Setattr(n, "wrap:name", destructorname); String *actioncode = emit_action(n); Append(f->code, actioncode); Delete(actioncode); Printf(f->code, "thrown:\n"); Append(f->code, "return;\n"); Append(f->code, "fail:\n"); Append(f->code, "SWIG_FAIL();\n"); Printf(f->code, "}\n"); Wrapper_print(f, s_wrappers); DelWrapper(f); return SWIG_OK; } /* ------------------------------------------------------------ * memberconstantHandler() * ------------------------------------------------------------ */ virtual int memberconstantHandler(Node *n) { wrapping_member_constant = Getattr(n, "sym:name"); Language::memberconstantHandler(n); wrapping_member_constant = NULL; return SWIG_OK; } int classDirectorInit(Node *n) { String *declaration = Swig_director_declaration(n); Printf(f_directors_h, "%s\n", declaration); Printf(f_directors_h, "public:\n"); Delete(declaration); return Language::classDirectorInit(n); } int classDirectorEnd(Node *n) { Printf(f_directors_h, "};\n"); return Language::classDirectorEnd(n); } int classDirectorConstructor(Node *n) { Node *parent = Getattr(n, "parentNode"); String *decl = Getattr(n, "decl"); String *supername = Swig_class_name(parent); String *classname = NewStringEmpty(); Printf(classname, "SwigDirector_%s", supername); /* insert self parameter */ Parm *p; ParmList *superparms = Getattr(n, "parms"); ParmList *parms = CopyParmList(superparms); String *type = NewString("zval"); SwigType_add_pointer(type); p = NewParm(type, NewString("self"), n); set_nextSibling(p, parms); parms = p; if (!Getattr(n, "defaultargs")) { // There should always be a "self" parameter first. assert(ParmList_len(parms) > 0); /* constructor */ { Wrapper *w = NewWrapper(); String *call; String *basetype = Getattr(parent, "classtype"); String *target = Swig_method_decl(0, decl, classname, parms, 0, 0); call = Swig_csuperclass_call(0, basetype, superparms); Printf(w->def, "%s::%s: %s, Swig::Director(self) {", classname, target, call); Append(w->def, "}"); Delete(target); Wrapper_print(w, f_directors); Delete(call); DelWrapper(w); } /* constructor header */ { String *target = Swig_method_decl(0, decl, classname, parms, 0, 1); Printf(f_directors_h, " %s;\n", target); Delete(target); } } return Language::classDirectorConstructor(n); } int classDirectorMethod(Node *n, Node *parent, String *super) { int is_void = 0; int is_pointer = 0; String *decl = Getattr(n, "decl"); String *returntype = Getattr(n, "type"); String *name = Getattr(n, "name"); String *classname = Getattr(parent, "sym:name"); String *c_classname = Getattr(parent, "name"); String *symname = Getattr(n, "sym:name"); String *declaration = NewStringEmpty(); ParmList *l = Getattr(n, "parms"); Wrapper *w = NewWrapper(); String *tm; String *wrap_args = NewStringEmpty(); String *value = Getattr(n, "value"); String *storage = Getattr(n, "storage"); bool pure_virtual = false; int status = SWIG_OK; int idx; bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; if (Cmp(storage, "virtual") == 0) { if (Cmp(value, "0") == 0) { pure_virtual = true; } } /* determine if the method returns a pointer */ is_pointer = SwigType_ispointer_return(decl); is_void = (Cmp(returntype, "void") == 0 && !is_pointer); /* virtual method definition */ String *target; String *pclassname = NewStringf("SwigDirector_%s", classname); String *qualified_name = NewStringf("%s::%s", pclassname, name); SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : Getattr(n, "classDirectorMethods:type"); target = Swig_method_decl(rtype, decl, qualified_name, l, 0, 0); Printf(w->def, "%s", target); Delete(qualified_name); Delete(target); /* header declaration */ target = Swig_method_decl(rtype, decl, name, l, 0, 1); Printf(declaration, " virtual %s", target); Delete(target); // Get any exception classes in the throws typemap ParmList *throw_parm_list = 0; if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) { Parm *p; int gencomma = 0; Append(w->def, " throw("); Append(declaration, " throw("); if (throw_parm_list) Swig_typemap_attach_parms("throws", throw_parm_list, 0); for (p = throw_parm_list; p; p = nextSibling(p)) { if (Getattr(p, "tmap:throws")) { if (gencomma++) { Append(w->def, ", "); Append(declaration, ", "); } String *str = SwigType_str(Getattr(p, "type"), 0); Append(w->def, str); Append(declaration, str); Delete(str); } } Append(w->def, ")"); Append(declaration, ")"); } Append(w->def, " {"); Append(declaration, ";\n"); /* declare method return value * if the return value is a reference or const reference, a specialized typemap must * handle it, including declaration of c_result ($result). */ if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *cres = SwigType_lstr(returntype, "c_result"); Printf(w->code, "%s;\n", cres); Delete(cres); } } if (ignored_method) { if (!pure_virtual) { if (!is_void) Printf(w->code, "return "); String *super_call = Swig_method_call(super, l); Printf(w->code, "%s;\n", super_call); Delete(super_call); } else { Printf(w->code, "Swig::DirectorPureVirtualException::raise(\"Attempted to invoke pure virtual method %s::%s\");\n", SwigType_namestr(c_classname), SwigType_namestr(name)); } } else { /* attach typemaps to arguments (C/C++ -> PHP) */ String *parse_args = NewStringEmpty(); Swig_director_parms_fixup(l); /* remove the wrapper 'w' since it was producing spurious temps */ Swig_typemap_attach_parms("in", l, 0); Swig_typemap_attach_parms("directorin", l, 0); Swig_typemap_attach_parms("directorargout", l, w); Parm *p; int outputs = 0; if (!is_void) outputs++; /* build argument list and type conversion string */ idx = 0; p = l; while (p) { if (checkAttribute(p, "tmap:in:numinputs", "0")) { p = Getattr(p, "tmap:in:next"); continue; } if (Getattr(p, "tmap:directorargout") != 0) outputs++; String *pname = Getattr(p, "name"); String *ptype = Getattr(p, "type"); if ((tm = Getattr(p, "tmap:directorin")) != 0) { String *parse = Getattr(p, "tmap:directorin:parse"); if (!parse) { String *input = NewStringf("&args[%d]", idx++); Setattr(p, "emit:directorinput", input); Replaceall(tm, "$input", input); Delete(input); Replaceall(tm, "$owner", "0"); Printv(wrap_args, tm, "\n", NIL); Putc('O', parse_args); } else { Append(parse_args, parse); Setattr(p, "emit:directorinput", pname); Replaceall(tm, "$input", pname); Replaceall(tm, "$owner", "0"); if (Len(tm) == 0) Append(tm, pname); } p = Getattr(p, "tmap:directorin:next"); continue; } else if (Cmp(ptype, "void")) { Swig_warning(WARN_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, "Unable to use type %s as a function argument in director method %s::%s (skipping method).\n", SwigType_str(ptype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_NOWRAP; break; } p = nextSibling(p); } /* exception handling */ bool error_used_in_typemap = false; tm = Swig_typemap_lookup("director:except", n, Swig_cresult_name(), 0); if (!tm) { tm = Getattr(n, "feature:director:except"); if (tm) tm = Copy(tm); } if ((tm) && Len(tm) && (Strcmp(tm, "1") != 0)) { if (Replaceall(tm, "$error", "error")) { /* Only declare error if it is used by the typemap. */ error_used_in_typemap = true; Append(w->code, "int error;\n"); } } else { Delete(tm); tm = NULL; } if (!idx) { Printf(w->code, "zval *args = NULL;\n"); } else { Printf(w->code, "zval args[%d];\n", idx); } // typemap_directorout testcase requires that 0 can be assigned to the // variable named after the result of Swig_cresult_name(), so that can't // be a zval - make it a pointer to one instead. Printf(w->code, "zval swig_zval_result, swig_funcname;\n", Swig_cresult_name()); Printf(w->code, "zval * SWIGUNUSED %s = &swig_zval_result;\n", Swig_cresult_name()); const char * funcname = GetChar(n, "sym:name"); Printf(w->code, "ZVAL_STRINGL(&swig_funcname, \"%s\", %d);\n", funcname, strlen(funcname)); /* wrap complex arguments to zvals */ Printv(w->code, wrap_args, NIL); if (error_used_in_typemap) { Append(w->code, "error = "); } Append(w->code, "call_user_function(EG(function_table), &swig_self, &swig_funcname,"); Printf(w->code, " &swig_zval_result, %d, args);\n", idx); if (tm) { Printv(w->code, Str(tm), "\n", NIL); Delete(tm); } /* marshal return value from PHP to C/C++ type */ String *cleanup = NewStringEmpty(); String *outarg = NewStringEmpty(); idx = 0; /* marshal return value */ if (!is_void) { tm = Swig_typemap_lookup("directorout", n, Swig_cresult_name(), w); if (tm != 0) { Replaceall(tm, "$input", Swig_cresult_name()); char temp[24]; sprintf(temp, "%d", idx); Replaceall(tm, "$argnum", temp); /* TODO check this */ if (Getattr(n, "wrap:disown")) { Replaceall(tm, "$disown", "SWIG_POINTER_DISOWN"); } else { Replaceall(tm, "$disown", "0"); } Replaceall(tm, "$result", "c_result"); Printv(w->code, tm, "\n", NIL); Delete(tm); } else { Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), SwigType_namestr(c_classname), SwigType_namestr(name)); status = SWIG_ERROR; } } /* marshal outputs */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:directorargout")) != 0) { Replaceall(tm, "$result", Swig_cresult_name()); Replaceall(tm, "$input", Getattr(p, "emit:directorinput")); Printv(w->code, tm, "\n", NIL); p = Getattr(p, "tmap:directorargout:next"); } else { p = nextSibling(p); } } Delete(parse_args); Delete(cleanup); Delete(outarg); } Append(w->code, "thrown:\n"); if (!is_void) { if (!(ignored_method && !pure_virtual)) { String *rettype = SwigType_str(returntype, 0); if (!SwigType_isreference(returntype)) { Printf(w->code, "return (%s) c_result;\n", rettype); } else { Printf(w->code, "return (%s) *c_result;\n", rettype); } Delete(rettype); } } else { Append(w->code, "return;\n"); } Append(w->code, "fail:\n"); Append(w->code, "SWIG_FAIL();\n"); Append(w->code, "}\n"); // We expose protected methods via an extra public inline method which makes a straight call to the wrapped class' method String *inline_extra_method = NewStringEmpty(); if (dirprot_mode() && !is_public(n) && !pure_virtual) { Printv(inline_extra_method, declaration, NIL); String *extra_method_name = NewStringf("%sSwigPublic", name); Replaceall(inline_extra_method, name, extra_method_name); Replaceall(inline_extra_method, ";\n", " {\n "); if (!is_void) Printf(inline_extra_method, "return "); String *methodcall = Swig_method_call(super, l); Printv(inline_extra_method, methodcall, ";\n }\n", NIL); Delete(methodcall); Delete(extra_method_name); } /* emit the director method */ if (status == SWIG_OK) { if (!Getattr(n, "defaultargs")) { Replaceall(w->code, "$symname", symname); Wrapper_print(w, f_directors); Printv(f_directors_h, declaration, NIL); Printv(f_directors_h, inline_extra_method, NIL); } } /* clean up */ Delete(wrap_args); Delete(pclassname); DelWrapper(w); return status; } int classDirectorDisown(Node *) { return SWIG_OK; } }; /* class PHP */ static PHP *maininstance = 0; // We use this function to be able to write out zend_register_list_destructor_ex // lines for most things in the type table // NOTE: it's a function NOT A PHP::METHOD extern "C" { static void typetrace(const SwigType *ty, String *mangled, String *clientdata) { Node *class_node; if (!zend_types) { zend_types = NewHash(); } // we want to know if the type which reduced to this has a constructor if ((class_node = maininstance->classLookup(ty))) { if (!Getattr(zend_types, mangled)) { // OK it may have been set before by a different SwigType but it would // have had the same underlying class node I think // - it is certainly required not to have different originating class // nodes for the same SwigType Setattr(zend_types, mangled, class_node); } } else { // a non-class pointer Setattr(zend_types, mangled, NOTCLASS); } if (r_prevtracefunc) (*r_prevtracefunc) (ty, mangled, (String *) clientdata); } } /* ----------------------------------------------------------------------------- * new_swig_php() - Instantiate module * ----------------------------------------------------------------------------- */ static Language *new_swig_php() { maininstance = new PHP; if (!r_prevtracefunc) { r_prevtracefunc = SwigType_remember_trace(typetrace); } else { Printf(stderr, "php Typetrace vector already saved!\n"); assert(0); } return maininstance; } extern "C" Language *swig_php(void) { return new_swig_php(); } swig-3.0.12/Source/Makefile.am0000664000175000017500000001132513042756442015733 0ustar williamwilliam## Process this file with automake to produce Makefile.in # subdir-objects generates object files using the directory structure of the source files. AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects 1.7.2 SOURCE_DIR=$(top_srcdir)/Source BUILD_SOURCE_DIR=$(top_builddir)/Source SWIG_CXX_DEFS = @SWILL@ AM_CPPFLAGS = -I$(BUILD_SOURCE_DIR)/Include \ -I$(BUILD_SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Include \ -I$(SOURCE_DIR)/DOH \ -I$(SOURCE_DIR)/CParse \ -I$(SOURCE_DIR)/Preprocessor \ -I$(SOURCE_DIR)/Swig \ -I$(SOURCE_DIR)/Modules AM_CXXFLAGS = $(SWIG_CXX_DEFS) AM_YFLAGS = -d BUILT_SOURCES = CParse/parser.h eswig_SOURCES = CParse/cscanner.c \ CParse/parser.y \ CParse/templ.c \ CParse/util.c \ DOH/base.c \ DOH/file.c \ DOH/fio.c \ DOH/hash.c \ DOH/list.c \ DOH/memory.c \ DOH/string.c \ DOH/void.c \ Modules/allegrocl.cxx \ Modules/allocate.cxx \ Modules/browser.cxx \ Modules/cffi.cxx \ Modules/chicken.cxx \ Modules/clisp.cxx \ Modules/contract.cxx \ Modules/csharp.cxx \ Modules/d.cxx \ Modules/directors.cxx \ Modules/emit.cxx \ Modules/go.cxx \ Modules/guile.cxx \ Modules/interface.cxx \ Modules/java.cxx \ Modules/javascript.cxx \ Modules/lang.cxx \ Modules/lua.cxx \ Modules/main.cxx \ Modules/modula3.cxx \ Modules/module.cxx \ Modules/mzscheme.cxx \ Modules/nested.cxx \ Modules/ocaml.cxx \ Modules/octave.cxx \ Modules/overload.cxx \ Modules/perl5.cxx \ Modules/php.cxx \ Modules/php5.cxx \ Modules/pike.cxx \ Modules/python.cxx \ Modules/r.cxx \ Modules/ruby.cxx \ Modules/s-exp.cxx \ Modules/scilab.cxx \ Modules/swigmain.cxx \ Modules/tcl8.cxx \ Modules/typepass.cxx \ Modules/uffi.cxx \ Modules/utils.cxx \ Modules/xml.cxx \ Preprocessor/cpp.c \ Preprocessor/expr.c \ Swig/cwrap.c \ Swig/deprecate.c \ Swig/error.c \ Swig/extend.c \ Swig/fragment.c \ Swig/getopt.c \ Swig/include.c \ Swig/misc.c \ Swig/naming.c \ Swig/parms.c \ Swig/scanner.c \ Swig/stype.c \ Swig/symbol.c \ Swig/tree.c \ Swig/typeobj.c \ Swig/typemap.c \ Swig/typesys.c \ Swig/wrapfunc.c bin_PROGRAMS = eswig eswig_LDADD = @SWIGLIBS@ # Override the link stage to avoid using Libtool CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ # The executable is copied to the root directory for installation and running the test-suite. # This occurs on each invocation of make and is a step towards providing support for multiple # build directories. all-local: eswig@EXEEXT@ cp -f $(top_builddir)/Source/eswig@EXEEXT@ $(top_builddir)/swig@EXEEXT@ clean-local: rm -f $(top_builddir)/swig@EXEEXT@ rm -f core @EXTRA_CLEAN@ distclean-local: rm -f $(top_builddir)/Source/Include/swigconfig.h rm -f $(top_builddir)/Source/Include/stamp-h1 # Beautify the code. # Note that this works well on C code, but does some odd joining of lines for C++ code. # Compiling with -DNDEBUG and no optimisations will allow one to do a binary diff of the # swig executable as a way of checking before and after the 'beautifying'. # Single files can be beautified with the beautify-file target, eg: 'make beautify-file INDENTFILE=chosenfile.c' SWIGTYPEDEFS=-T bool -T File -T DohObjInfo -T Parm -T Language -T List -T Typetab -T ModuleFactory -T ErrorMessageFormat -T Symtab -T Hash -T Scanner -T String -T DohBase -T Node -T String_or_char -T SwigType -T Dispatcher -T Wrapper -T DohStringMethods -T DohFileMethods -T DohListMethods -T DohHashMethods -T DOH -T DohIterator -T ParmList -T FILE -T HashNode -T DOHObj_or_char -T DOHFile -T DOHString -T DOHString_or_char -T UpcallData INDENTBAKSDIR=../IndentBaks beautify: rm -rf $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR) mkdir $(INDENTBAKSDIR)/CParse mkdir $(INDENTBAKSDIR)/DOH mkdir $(INDENTBAKSDIR)/Modules mkdir $(INDENTBAKSDIR)/Preprocessor mkdir $(INDENTBAKSDIR)/Swig mkdir $(INDENTBAKSDIR)/Include (csources=`find . -name "*.c"` && \ hsources=`find . -name "*.h"` && \ cxxsources=`find . -name "*.cxx"` && \ for file in $$csources $$hsources $$cxxsources; do \ $(MAKE) beautify-file INDENTFILE=$$file; \ done; ) beautify-file: test -e $(INDENTBAKSDIR) || (echo $(INDENTBAKSDIR) directory does not exist && exit 1;) test -n "$(INDENTFILE)" || (echo INDENTFILE not defined && exit 1;) test -e $(INDENTFILE) || (echo File does not exist: $(INDENTFILE) && exit 1;) cp $(INDENTFILE) $(INDENTBAKSDIR)/$(INDENTFILE); indent -kr --honour-newlines --line-length160 --indent-level2 --braces-on-func-def-line --leave-optional-blank-lines $(SWIGTYPEDEFS) $(INDENTFILE) -o $(INDENTFILE).tmp; cat $(INDENTFILE).tmp | sed -e 's/const const /const /' > $(INDENTFILE); rm $(INDENTFILE).tmp; swig-3.0.12/Source/Include/0000775000175000017500000000000013042756666015270 5ustar williamwilliamswig-3.0.12/Source/Include/swigwarn.h0000664000175000017500000003104313042756442017273 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * swigwarn.h * * SWIG warning message numbers * This file serves as the main registry of warning message numbers. Some of these * numbers are used internally in the C/C++ source code of SWIG. However, some * of the numbers are used in SWIG configuration files (swig.swg and others). * * The numbers are roughly organized into a few different classes by functionality. * * Even though symbolic constants are used in the SWIG source, this is * not always the case in SWIG interface files. Do not change the * numbers in this file. * ----------------------------------------------------------------------------- */ #ifndef SWIGWARN_H_ #define SWIGWARN_H_ #define WARN_NONE 0 /* -- Deprecated features -- */ #define WARN_DEPRECATED_EXTERN 101 #define WARN_DEPRECATED_VAL 102 #define WARN_DEPRECATED_OUT 103 #define WARN_DEPRECATED_DISABLEDOC 104 #define WARN_DEPRECATED_ENABLEDOC 105 #define WARN_DEPRECATED_DOCONLY 106 #define WARN_DEPRECATED_STYLE 107 #define WARN_DEPRECATED_LOCALSTYLE 108 #define WARN_DEPRECATED_TITLE 109 #define WARN_DEPRECATED_SECTION 110 #define WARN_DEPRECATED_SUBSECTION 111 #define WARN_DEPRECATED_SUBSUBSECTION 112 #define WARN_DEPRECATED_ADDMETHODS 113 #define WARN_DEPRECATED_READONLY 114 #define WARN_DEPRECATED_READWRITE 115 #define WARN_DEPRECATED_EXCEPT 116 #define WARN_DEPRECATED_NEW 117 #define WARN_DEPRECATED_EXCEPT_TM 118 #define WARN_DEPRECATED_IGNORE_TM 119 #define WARN_DEPRECATED_OPTC 120 #define WARN_DEPRECATED_NAME 121 #define WARN_DEPRECATED_NOEXTERN 122 #define WARN_DEPRECATED_NODEFAULT 123 #define WARN_DEPRECATED_TYPEMAP_LANG 124 #define WARN_DEPRECATED_INPUT_FILE 125 #define WARN_DEPRECATED_NESTED_WORKAROUND 126 /* -- Preprocessor -- */ #define WARN_PP_MISSING_FILE 201 #define WARN_PP_EVALUATION 202 #define WARN_PP_INCLUDEALL_IMPORTALL 203 #define WARN_PP_CPP_WARNING 204 #define WARN_PP_CPP_ERROR 205 #define WARN_PP_UNEXPECTED_TOKENS 206 /* -- C/C++ Parser -- */ #define WARN_PARSE_CLASS_KEYWORD 301 #define WARN_PARSE_REDEFINED 302 #define WARN_PARSE_EXTEND_UNDEF 303 #define WARN_PARSE_UNSUPPORTED_VALUE 304 #define WARN_PARSE_BAD_VALUE 305 #define WARN_PARSE_PRIVATE 306 #define WARN_PARSE_BAD_DEFAULT 307 #define WARN_PARSE_NAMESPACE_ALIAS 308 #define WARN_PARSE_PRIVATE_INHERIT 309 #define WARN_PARSE_TEMPLATE_REPEAT 310 #define WARN_PARSE_TEMPLATE_PARTIAL 311 #define WARN_PARSE_UNNAMED_NESTED_CLASS 312 #define WARN_PARSE_UNDEFINED_EXTERN 313 #define WARN_PARSE_KEYWORD 314 #define WARN_PARSE_USING_UNDEF 315 #define WARN_PARSE_MODULE_REPEAT 316 #define WARN_PARSE_TEMPLATE_SP_UNDEF 317 #define WARN_PARSE_TEMPLATE_AMBIG 318 #define WARN_PARSE_NO_ACCESS 319 #define WARN_PARSE_EXPLICIT_TEMPLATE 320 #define WARN_PARSE_BUILTIN_NAME 321 #define WARN_PARSE_REDUNDANT 322 #define WARN_PARSE_REC_INHERITANCE 323 #define WARN_PARSE_NESTED_TEMPLATE 324 #define WARN_PARSE_NAMED_NESTED_CLASS 325 #define WARN_PARSE_EXTEND_NAME 326 #define WARN_CPP11_LAMBDA 340 #define WARN_CPP11_ALIAS_DECLARATION 341 /* redundant now */ #define WARN_CPP11_ALIAS_TEMPLATE 342 /* redundant now */ #define WARN_CPP11_VARIADIC_TEMPLATE 343 #define WARN_IGNORE_OPERATOR_NEW 350 /* new */ #define WARN_IGNORE_OPERATOR_DELETE 351 /* delete */ #define WARN_IGNORE_OPERATOR_PLUS 352 /* + */ #define WARN_IGNORE_OPERATOR_MINUS 353 /* - */ #define WARN_IGNORE_OPERATOR_MUL 354 /* * */ #define WARN_IGNORE_OPERATOR_DIV 355 /* / */ #define WARN_IGNORE_OPERATOR_MOD 356 /* % */ #define WARN_IGNORE_OPERATOR_XOR 357 /* ^ */ #define WARN_IGNORE_OPERATOR_AND 358 /* & */ #define WARN_IGNORE_OPERATOR_OR 359 /* | */ #define WARN_IGNORE_OPERATOR_NOT 360 /* ~ */ #define WARN_IGNORE_OPERATOR_LNOT 361 /* ! */ #define WARN_IGNORE_OPERATOR_EQ 362 /* = */ #define WARN_IGNORE_OPERATOR_LT 363 /* < */ #define WARN_IGNORE_OPERATOR_GT 364 /* > */ #define WARN_IGNORE_OPERATOR_PLUSEQ 365 /* += */ #define WARN_IGNORE_OPERATOR_MINUSEQ 366 /* -= */ #define WARN_IGNORE_OPERATOR_MULEQ 367 /* *= */ #define WARN_IGNORE_OPERATOR_DIVEQ 368 /* /= */ #define WARN_IGNORE_OPERATOR_MODEQ 369 /* %= */ #define WARN_IGNORE_OPERATOR_XOREQ 370 /* ^= */ #define WARN_IGNORE_OPERATOR_ANDEQ 371 /* &= */ #define WARN_IGNORE_OPERATOR_OREQ 372 /* |= */ #define WARN_IGNORE_OPERATOR_LSHIFT 373 /* << */ #define WARN_IGNORE_OPERATOR_RSHIFT 374 /* >> */ #define WARN_IGNORE_OPERATOR_LSHIFTEQ 375 /* <<= */ #define WARN_IGNORE_OPERATOR_RSHIFTEQ 376 /* >>= */ #define WARN_IGNORE_OPERATOR_EQUALTO 377 /* == */ #define WARN_IGNORE_OPERATOR_NOTEQUAL 378 /* != */ #define WARN_IGNORE_OPERATOR_LTEQUAL 379 /* <= */ #define WARN_IGNORE_OPERATOR_GTEQUAL 380 /* >= */ #define WARN_IGNORE_OPERATOR_LAND 381 /* && */ #define WARN_IGNORE_OPERATOR_LOR 382 /* || */ #define WARN_IGNORE_OPERATOR_PLUSPLUS 383 /* ++ */ #define WARN_IGNORE_OPERATOR_MINUSMINUS 384 /* -- */ #define WARN_IGNORE_OPERATOR_COMMA 385 /* , */ #define WARN_IGNORE_OPERATOR_ARROWSTAR 386 /* ->* */ #define WARN_IGNORE_OPERATOR_ARROW 387 /* -> */ #define WARN_IGNORE_OPERATOR_CALL 388 /* () */ #define WARN_IGNORE_OPERATOR_INDEX 389 /* [] */ #define WARN_IGNORE_OPERATOR_UPLUS 390 /* + */ #define WARN_IGNORE_OPERATOR_UMINUS 391 /* - */ #define WARN_IGNORE_OPERATOR_UMUL 392 /* * */ #define WARN_IGNORE_OPERATOR_UAND 393 /* & */ #define WARN_IGNORE_OPERATOR_NEWARR 394 /* new [] */ #define WARN_IGNORE_OPERATOR_DELARR 395 /* delete [] */ #define WARN_IGNORE_OPERATOR_REF 396 /* operator *() */ /* 394-399 are reserved */ /* -- Type system and typemaps -- */ #define WARN_TYPE_UNDEFINED_CLASS 401 #define WARN_TYPE_INCOMPLETE 402 #define WARN_TYPE_ABSTRACT 403 #define WARN_TYPE_REDEFINED 404 #define WARN_TYPEMAP_SOURCETARGET 450 #define WARN_TYPEMAP_CHARLEAK 451 #define WARN_TYPEMAP_SWIGTYPE 452 #define WARN_TYPEMAP_APPLY_UNDEF 453 #define WARN_TYPEMAP_SWIGTYPELEAK 454 #define WARN_TYPEMAP_IN_UNDEF 460 #define WARN_TYPEMAP_OUT_UNDEF 461 #define WARN_TYPEMAP_VARIN_UNDEF 462 #define WARN_TYPEMAP_VAROUT_UNDEF 463 #define WARN_TYPEMAP_CONST_UNDEF 464 #define WARN_TYPEMAP_UNDEF 465 #define WARN_TYPEMAP_VAR_UNDEF 466 #define WARN_TYPEMAP_TYPECHECK 467 #define WARN_TYPEMAP_THROW 468 #define WARN_TYPEMAP_DIRECTORIN_UNDEF 469 #define WARN_TYPEMAP_THREAD_UNSAFE 470 /* mostly used in directorout typemaps */ #define WARN_TYPEMAP_DIRECTOROUT_UNDEF 471 #define WARN_TYPEMAP_TYPECHECK_UNDEF 472 #define WARN_TYPEMAP_DIRECTOROUT_PTR 473 #define WARN_TYPEMAP_OUT_OPTIMAL_IGNORED 474 #define WARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE 475 #define WARN_TYPEMAP_INITIALIZER_LIST 476 #define WARN_TYPEMAP_DIRECTORTHROWS_UNDEF 477 /* -- Fragments -- */ #define WARN_FRAGMENT_NOT_FOUND 490 /* -- General code generation -- */ #define WARN_LANG_OVERLOAD_DECL 501 #define WARN_LANG_OVERLOAD_CONSTRUCT 502 #define WARN_LANG_IDENTIFIER 503 #define WARN_LANG_RETURN_TYPE 504 #define WARN_LANG_VARARGS 505 #define WARN_LANG_VARARGS_KEYWORD 506 #define WARN_LANG_NATIVE_UNIMPL 507 #define WARN_LANG_DEREF_SHADOW 508 #define WARN_LANG_OVERLOAD_SHADOW 509 #define WARN_LANG_FRIEND_IGNORE 510 #define WARN_LANG_OVERLOAD_KEYWORD 511 #define WARN_LANG_OVERLOAD_CONST 512 #define WARN_LANG_CLASS_UNNAMED 513 #define WARN_LANG_DIRECTOR_VDESTRUCT 514 #define WARN_LANG_DISCARD_CONST 515 #define WARN_LANG_OVERLOAD_IGNORED 516 #define WARN_LANG_DIRECTOR_ABSTRACT 517 #define WARN_LANG_PORTABILITY_FILENAME 518 #define WARN_LANG_TEMPLATE_METHOD_IGNORE 519 #define WARN_LANG_SMARTPTR_MISSING 520 #define WARN_LANG_ILLEGAL_DESTRUCTOR 521 #define WARN_LANG_EXTEND_CONSTRUCTOR 522 #define WARN_LANG_EXTEND_DESTRUCTOR 523 /* -- Reserved (600-799) -- */ /* -- Language module specific warnings (700 - 899) -- */ /* Feel free to claim any number in this space that's not currently being used. Just make sure you add an entry here */ #define WARN_D_TYPEMAP_CTYPE_UNDEF 700 #define WARN_D_TYPEMAP_IMTYPE_UNDEF 701 #define WARN_D_TYPEMAP_DTYPE_UNDEF 702 #define WARN_D_MULTIPLE_INHERITANCE 703 #define WARN_D_TYPEMAP_CLASSMOD_UNDEF 704 #define WARN_D_TYPEMAP_DBODY_UNDEF 705 #define WARN_D_TYPEMAP_DOUT_UNDEF 706 #define WARN_D_TYPEMAP_DIN_UNDEF 707 #define WARN_D_TYPEMAP_DDIRECTORIN_UNDEF 708 #define WARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF 709 #define WARN_D_EXCODE_MISSING 710 #define WARN_D_CANTHROW_MISSING 711 #define WARN_D_NO_DIRECTORCONNECT_ATTR 712 #define WARN_D_NAME_COLLISION 713 /* please leave 700-719 free for D */ #define WARN_SCILAB_TRUNCATED_NAME 720 /* please leave 720-739 free for Scilab */ #define WARN_PYTHON_INDENT_MISMATCH 740 /* please leave 740-759 free for Python */ #define WARN_RUBY_WRONG_NAME 801 #define WARN_RUBY_MULTIPLE_INHERITANCE 802 /* please leave 800-809 free for Ruby */ #define WARN_JAVA_TYPEMAP_JNI_UNDEF 810 #define WARN_JAVA_TYPEMAP_JTYPE_UNDEF 811 #define WARN_JAVA_TYPEMAP_JSTYPE_UNDEF 812 #define WARN_JAVA_MULTIPLE_INHERITANCE 813 #define WARN_JAVA_TYPEMAP_GETCPTR_UNDEF 814 #define WARN_JAVA_TYPEMAP_CLASSMOD_UNDEF 815 #define WARN_JAVA_TYPEMAP_JAVABODY_UNDEF 816 #define WARN_JAVA_TYPEMAP_JAVAOUT_UNDEF 817 #define WARN_JAVA_TYPEMAP_JAVAIN_UNDEF 818 #define WARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF 819 #define WARN_JAVA_TYPEMAP_JAVADIRECTOROUT_UNDEF 820 #define WARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF 821 #define WARN_JAVA_COVARIANT_RET 822 #define WARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF 823 #define WARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 #define WARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 #define WARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 /* please leave 810-829 free for Java */ #define WARN_CSHARP_TYPEMAP_CTYPE_UNDEF 830 #define WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF 831 #define WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF 832 #define WARN_CSHARP_MULTIPLE_INHERITANCE 833 #define WARN_CSHARP_TYPEMAP_GETCPTR_UNDEF 834 #define WARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF 835 #define WARN_CSHARP_TYPEMAP_CSBODY_UNDEF 836 #define WARN_CSHARP_TYPEMAP_CSOUT_UNDEF 837 #define WARN_CSHARP_TYPEMAP_CSIN_UNDEF 838 #define WARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF 839 #define WARN_CSHARP_TYPEMAP_CSDIRECTOROUT_UNDEF 840 #define WARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF 841 #define WARN_CSHARP_COVARIANT_RET 842 #define WARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF 843 #define WARN_CSHARP_EXCODE 844 #define WARN_CSHARP_CANTHROW 845 #define WARN_CSHARP_NO_DIRECTORCONNECT_ATTR 846 /* please leave 830-849 free for C# */ #define WARN_MODULA3_TYPEMAP_TYPE_UNDEF 850 #define WARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851 #define WARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852 #define WARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853 #define WARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854 #define WARN_MODULA3_MULTIPLE_INHERITANCE 855 #define WARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856 #define WARN_MODULA3_UNKNOWN_PRAGMA 857 #define WARN_MODULA3_BAD_ENUMERATION 858 #define WARN_MODULA3_DOUBLE_ID 859 #define WARN_MODULA3_BAD_IMPORT 860 /* please leave 850-869 free for Modula 3 */ #define WARN_PHP_MULTIPLE_INHERITANCE 870 #define WARN_PHP_UNKNOWN_PRAGMA 871 #define WARN_PHP_PUBLIC_BASE 872 /* please leave 870-889 free for PHP */ #define WARN_GO_NAME_CONFLICT 890 /* please leave 890-899 free for Go */ /* -- User defined warnings (900 - 999) -- */ #endif swig-3.0.12/Source/Include/swigconfig.h.in0000664000175000017500000000446713042756666020220 0ustar williamwilliam/* Source/Include/swigconfig.h.in. Generated from configure.ac by autoheader. */ /* define if the Boost library is available */ #undef HAVE_BOOST /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the `dld' library (-ldld). */ #undef HAVE_LIBDLD /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define if you have PCRE library */ #undef HAVE_PCRE /* Define if popen is available */ #undef HAVE_POPEN /* 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 header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_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 the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* 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 home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `void *', as computed by sizeof. */ #undef SIZEOF_VOID_P /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Compiler that built SWIG */ #undef SWIG_CXX /* Directory for SWIG system-independent libraries */ #undef SWIG_LIB /* Directory for SWIG system-independent libraries (Unix install on native Windows) */ #undef SWIG_LIB_WIN_UNIX /* Platform that SWIG is built for */ #undef SWIG_PLATFORM /* Version number of package */ #undef VERSION /* Default language */ #define SWIG_LANG "-tcl" /* Deal with attempt by Microsoft to deprecate C standard runtime functions */ #if defined(_MSC_VER) # define _CRT_SECURE_NO_DEPRECATE #endif swig-3.0.12/Source/CParse/0000775000175000017500000000000013042756671015056 5ustar williamwilliamswig-3.0.12/Source/CParse/cscanner.c0000664000175000017500000006204713042756442017023 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * scanner.c * * SWIG tokenizer. This file is a wrapper around the generic C scanner * found in Swig/scanner.c. Extra logic is added both to accommodate the * bison-based grammar and certain peculiarities of C++ parsing (e.g., * operator overloading, typedef resolution, etc.). This code also splits * C identifiers up into keywords and SWIG directives. * ----------------------------------------------------------------------------- */ #include "cparse.h" #include "parser.h" #include #include /* Scanner object */ static Scanner *scan = 0; /* Global string containing C code. Used by the parser to grab code blocks */ String *scanner_ccode = 0; /* The main file being parsed */ static String *main_input_file = 0; /* Error reporting/location information */ int cparse_line = 1; String *cparse_file = 0; int cparse_start_line = 0; /* C++ mode */ int cparse_cplusplus = 0; /* Generate C++ compatible code when wrapping C code */ int cparse_cplusplusout = 0; /* To allow better error reporting */ String *cparse_unknown_directive = 0; /* Private vars */ static int scan_init = 0; static int num_brace = 0; static int last_brace = 0; static int last_id = 0; static int rename_active = 0; /* ----------------------------------------------------------------------------- * Swig_cparse_cplusplus() * ----------------------------------------------------------------------------- */ void Swig_cparse_cplusplus(int v) { cparse_cplusplus = v; } /* ----------------------------------------------------------------------------- * Swig_cparse_cplusplusout() * ----------------------------------------------------------------------------- */ void Swig_cparse_cplusplusout(int v) { cparse_cplusplusout = v; } /* ---------------------------------------------------------------------------- * scanner_init() * * Initialize buffers * ------------------------------------------------------------------------- */ void scanner_init() { scan = NewScanner(); Scanner_idstart(scan,"%"); scan_init = 1; scanner_ccode = NewStringEmpty(); } /* ---------------------------------------------------------------------------- * scanner_file(DOHFile *f) * * Start reading from new file * ------------------------------------------------------------------------- */ void scanner_file(DOHFile * f) { if (!scan_init) scanner_init(); Scanner_clear(scan); Scanner_push(scan,f); } /* ---------------------------------------------------------------------------- * start_inline(char *text, int line) * * Take a chunk of text and recursively feed it back into the scanner. Used * by the %inline directive. * ------------------------------------------------------------------------- */ void start_inline(char *text, int line) { String *stext = NewString(text); Seek(stext,0,SEEK_SET); Setfile(stext,cparse_file); Setline(stext,line); Scanner_push(scan,stext); Delete(stext); } /* ----------------------------------------------------------------------------- * skip_balanced() * * Skips a piece of code enclosed in begin/end symbols such as '{...}' or * (...). Ignores symbols inside comments or strings. * ----------------------------------------------------------------------------- */ void skip_balanced(int startchar, int endchar) { int start_line = Scanner_line(scan); Clear(scanner_ccode); if (Scanner_skip_balanced(scan,startchar,endchar) < 0) { Swig_error(cparse_file, start_line, "Missing '%c'. Reached end of input.\n", endchar); return; } cparse_line = Scanner_line(scan); cparse_file = Scanner_file(scan); Append(scanner_ccode, Scanner_text(scan)); if (endchar == '}') num_brace--; return; } /* ----------------------------------------------------------------------------- * get_raw_text_balanced() * * Returns raw text between 2 braces * ----------------------------------------------------------------------------- */ String *get_raw_text_balanced(int startchar, int endchar) { return Scanner_get_raw_text_balanced(scan, startchar, endchar); } /* ---------------------------------------------------------------------------- * void skip_decl(void) * * This tries to skip over an entire declaration. For example * * friend ostream& operator<<(ostream&, const char *s); * * or * friend ostream& operator<<(ostream&, const char *s) { } * * ------------------------------------------------------------------------- */ void skip_decl(void) { int tok; int done = 0; int start_line = Scanner_line(scan); while (!done) { tok = Scanner_token(scan); if (tok == 0) { if (!Swig_error_count()) { Swig_error(cparse_file, start_line, "Missing semicolon. Reached end of input.\n"); } return; } if (tok == SWIG_TOKEN_LBRACE) { if (Scanner_skip_balanced(scan,'{','}') < 0) { Swig_error(cparse_file, start_line, "Missing '}'. Reached end of input.\n"); } break; } if (tok == SWIG_TOKEN_SEMI) { done = 1; } } cparse_file = Scanner_file(scan); cparse_line = Scanner_line(scan); } /* ---------------------------------------------------------------------------- * int yylook() * * Lexical scanner. * ------------------------------------------------------------------------- */ static int yylook(void) { int tok = 0; while (1) { if ((tok = Scanner_token(scan)) == 0) return 0; if (tok == SWIG_TOKEN_ERROR) return 0; cparse_start_line = Scanner_start_line(scan); cparse_line = Scanner_line(scan); cparse_file = Scanner_file(scan); switch(tok) { case SWIG_TOKEN_ID: return ID; case SWIG_TOKEN_LPAREN: return LPAREN; case SWIG_TOKEN_RPAREN: return RPAREN; case SWIG_TOKEN_SEMI: return SEMI; case SWIG_TOKEN_COMMA: return COMMA; case SWIG_TOKEN_STAR: return STAR; case SWIG_TOKEN_RBRACE: num_brace--; if (num_brace < 0) { Swig_error(cparse_file, cparse_line, "Syntax error. Extraneous '}'\n"); num_brace = 0; } else { return RBRACE; } break; case SWIG_TOKEN_LBRACE: last_brace = num_brace; num_brace++; return LBRACE; case SWIG_TOKEN_EQUAL: return EQUAL; case SWIG_TOKEN_EQUALTO: return EQUALTO; case SWIG_TOKEN_PLUS: return PLUS; case SWIG_TOKEN_MINUS: return MINUS; case SWIG_TOKEN_SLASH: return SLASH; case SWIG_TOKEN_AND: return AND; case SWIG_TOKEN_LAND: return LAND; case SWIG_TOKEN_OR: return OR; case SWIG_TOKEN_LOR: return LOR; case SWIG_TOKEN_XOR: return XOR; case SWIG_TOKEN_NOT: return NOT; case SWIG_TOKEN_LNOT: return LNOT; case SWIG_TOKEN_NOTEQUAL: return NOTEQUALTO; case SWIG_TOKEN_LBRACKET: return LBRACKET; case SWIG_TOKEN_RBRACKET: return RBRACKET; case SWIG_TOKEN_QUESTION: return QUESTIONMARK; case SWIG_TOKEN_LESSTHAN: return LESSTHAN; case SWIG_TOKEN_LTEQUAL: return LESSTHANOREQUALTO; case SWIG_TOKEN_LSHIFT: return LSHIFT; case SWIG_TOKEN_GREATERTHAN: return GREATERTHAN; case SWIG_TOKEN_GTEQUAL: return GREATERTHANOREQUALTO; case SWIG_TOKEN_RSHIFT: return RSHIFT; case SWIG_TOKEN_ARROW: return ARROW; case SWIG_TOKEN_PERIOD: return PERIOD; case SWIG_TOKEN_MODULO: return MODULO; case SWIG_TOKEN_COLON: return COLON; case SWIG_TOKEN_DCOLONSTAR: return DSTAR; case SWIG_TOKEN_DCOLON: { int nexttok = Scanner_token(scan); if (nexttok == SWIG_TOKEN_STAR) { return DSTAR; } else if (nexttok == SWIG_TOKEN_NOT) { return DCNOT; } else { Scanner_pushtoken(scan,nexttok,Scanner_text(scan)); if (!last_id) { scanner_next_token(DCOLON); return NONID; } else { return DCOLON; } } } break; /* Look for multi-character sequences */ case SWIG_TOKEN_RSTRING: yylval.type = NewString(Scanner_text(scan)); return TYPE_RAW; case SWIG_TOKEN_STRING: yylval.id = Swig_copy_string(Char(Scanner_text(scan))); return STRING; case SWIG_TOKEN_WSTRING: yylval.id = Swig_copy_string(Char(Scanner_text(scan))); return WSTRING; case SWIG_TOKEN_CHAR: yylval.str = NewString(Scanner_text(scan)); if (Len(yylval.str) == 0) { Swig_error(cparse_file, cparse_line, "Empty character constant\n"); } return CHARCONST; case SWIG_TOKEN_WCHAR: yylval.str = NewString(Scanner_text(scan)); if (Len(yylval.str) == 0) { Swig_error(cparse_file, cparse_line, "Empty character constant\n"); } return WCHARCONST; /* Numbers */ case SWIG_TOKEN_INT: return NUM_INT; case SWIG_TOKEN_UINT: return NUM_UNSIGNED; case SWIG_TOKEN_LONG: return NUM_LONG; case SWIG_TOKEN_ULONG: return NUM_ULONG; case SWIG_TOKEN_LONGLONG: return NUM_LONGLONG; case SWIG_TOKEN_ULONGLONG: return NUM_ULONGLONG; case SWIG_TOKEN_DOUBLE: case SWIG_TOKEN_FLOAT: return NUM_FLOAT; case SWIG_TOKEN_BOOL: return NUM_BOOL; case SWIG_TOKEN_POUND: Scanner_skip_line(scan); yylval.id = Swig_copy_string(Char(Scanner_text(scan))); return POUND; break; case SWIG_TOKEN_CODEBLOCK: yylval.str = NewString(Scanner_text(scan)); return HBLOCK; case SWIG_TOKEN_COMMENT: { String *cmt = Scanner_text(scan); char *loc = Char(cmt); if ((strncmp(loc,"/*@SWIG",7) == 0) && (loc[Len(cmt)-3] == '@')) { Scanner_locator(scan, cmt); } } break; case SWIG_TOKEN_ENDLINE: break; case SWIG_TOKEN_BACKSLASH: break; default: Swig_error(cparse_file, cparse_line, "Illegal token '%s'.\n", Scanner_text(scan)); return (ILLEGAL); } } } static int check_typedef = 0; void scanner_set_location(String *file, int line) { Scanner_set_location(scan,file,line-1); } void scanner_check_typedef() { check_typedef = 1; } void scanner_ignore_typedef() { check_typedef = 0; } void scanner_last_id(int x) { last_id = x; } void scanner_clear_rename() { rename_active = 0; } /* Used to push a fictitious token into the scanner */ static int next_token = 0; void scanner_next_token(int tok) { next_token = tok; } void scanner_set_main_input_file(String *file) { main_input_file = file; } String *scanner_get_main_input_file() { return main_input_file; } /* ---------------------------------------------------------------------------- * int yylex() * * Gets the lexene and returns tokens. * ------------------------------------------------------------------------- */ int yylex(void) { int l; char *yytext; if (!scan_init) { scanner_init(); } if (next_token) { l = next_token; next_token = 0; return l; } l = yylook(); /* Swig_diagnostic(cparse_file, cparse_line, ":::%d: '%s'\n", l, Scanner_text(scan)); */ if (l == NONID) { last_id = 1; } else { last_id = 0; } /* We got some sort of non-white space object. We set the start_line variable unless it has already been set */ if (!cparse_start_line) { cparse_start_line = cparse_line; } /* Copy the lexene */ switch (l) { case NUM_INT: case NUM_FLOAT: case NUM_ULONG: case NUM_LONG: case NUM_UNSIGNED: case NUM_LONGLONG: case NUM_ULONGLONG: case NUM_BOOL: if (l == NUM_INT) yylval.dtype.type = T_INT; if (l == NUM_FLOAT) yylval.dtype.type = T_DOUBLE; if (l == NUM_ULONG) yylval.dtype.type = T_ULONG; if (l == NUM_LONG) yylval.dtype.type = T_LONG; if (l == NUM_UNSIGNED) yylval.dtype.type = T_UINT; if (l == NUM_LONGLONG) yylval.dtype.type = T_LONGLONG; if (l == NUM_ULONGLONG) yylval.dtype.type = T_ULONGLONG; if (l == NUM_BOOL) yylval.dtype.type = T_BOOL; yylval.dtype.val = NewString(Scanner_text(scan)); yylval.dtype.bitfield = 0; yylval.dtype.throws = 0; return (l); case ID: yytext = Char(Scanner_text(scan)); if (yytext[0] != '%') { /* Look for keywords now */ if (strcmp(yytext, "int") == 0) { yylval.type = NewSwigType(T_INT); return (TYPE_INT); } if (strcmp(yytext, "double") == 0) { yylval.type = NewSwigType(T_DOUBLE); return (TYPE_DOUBLE); } if (strcmp(yytext, "void") == 0) { yylval.type = NewSwigType(T_VOID); return (TYPE_VOID); } if (strcmp(yytext, "char") == 0) { yylval.type = NewSwigType(T_CHAR); return (TYPE_CHAR); } if (strcmp(yytext, "wchar_t") == 0) { yylval.type = NewSwigType(T_WCHAR); return (TYPE_WCHAR); } if (strcmp(yytext, "short") == 0) { yylval.type = NewSwigType(T_SHORT); return (TYPE_SHORT); } if (strcmp(yytext, "long") == 0) { yylval.type = NewSwigType(T_LONG); return (TYPE_LONG); } if (strcmp(yytext, "float") == 0) { yylval.type = NewSwigType(T_FLOAT); return (TYPE_FLOAT); } if (strcmp(yytext, "signed") == 0) { yylval.type = NewSwigType(T_INT); return (TYPE_SIGNED); } if (strcmp(yytext, "unsigned") == 0) { yylval.type = NewSwigType(T_UINT); return (TYPE_UNSIGNED); } if (strcmp(yytext, "bool") == 0) { yylval.type = NewSwigType(T_BOOL); return (TYPE_BOOL); } /* Non ISO (Windows) C extensions */ if (strcmp(yytext, "__int8") == 0) { yylval.type = NewString(yytext); return (TYPE_NON_ISO_INT8); } if (strcmp(yytext, "__int16") == 0) { yylval.type = NewString(yytext); return (TYPE_NON_ISO_INT16); } if (strcmp(yytext, "__int32") == 0) { yylval.type = NewString(yytext); return (TYPE_NON_ISO_INT32); } if (strcmp(yytext, "__int64") == 0) { yylval.type = NewString(yytext); return (TYPE_NON_ISO_INT64); } /* C++ keywords */ if (cparse_cplusplus) { if (strcmp(yytext, "and") == 0) return (LAND); if (strcmp(yytext, "or") == 0) return (LOR); if (strcmp(yytext, "not") == 0) return (LNOT); if (strcmp(yytext, "class") == 0) return (CLASS); if (strcmp(yytext, "private") == 0) return (PRIVATE); if (strcmp(yytext, "public") == 0) return (PUBLIC); if (strcmp(yytext, "protected") == 0) return (PROTECTED); if (strcmp(yytext, "friend") == 0) return (FRIEND); if (strcmp(yytext, "constexpr") == 0) return (CONSTEXPR); if (strcmp(yytext, "thread_local") == 0) return (THREAD_LOCAL); if (strcmp(yytext, "decltype") == 0) return (DECLTYPE); if (strcmp(yytext, "virtual") == 0) return (VIRTUAL); if (strcmp(yytext, "static_assert") == 0) return (STATIC_ASSERT); if (strcmp(yytext, "operator") == 0) { int nexttok; String *s = NewString("operator "); /* If we have an operator, we have to collect the operator symbol and attach it to the operator identifier. To do this, we need to scan ahead by several tokens. Cases include: (1) If the next token is an operator as determined by Scanner_isoperator(), it means that the operator applies to one of the standard C++ mathematical, assignment, or logical operator symbols (e.g., '+','<=','==','&', etc.) In this case, we merely append the symbol text to the operator string above. (2) If the next token is (, we look for ). This is operator (). (3) If the next token is [, we look for ]. This is operator []. (4) If the next token is an identifier. The operator is possibly a conversion operator. (a) Must check for special case new[] and delete[] Error handling is somewhat tricky here. We'll try to back out gracefully if we can. */ do { nexttok = Scanner_token(scan); } while (nexttok == SWIG_TOKEN_ENDLINE || nexttok == SWIG_TOKEN_COMMENT); if (Scanner_isoperator(nexttok)) { /* One of the standard C/C++ symbolic operators */ Append(s,Scanner_text(scan)); yylval.str = s; return OPERATOR; } else if (nexttok == SWIG_TOKEN_LPAREN) { /* Function call operator. The next token MUST be a RPAREN */ nexttok = Scanner_token(scan); if (nexttok != SWIG_TOKEN_RPAREN) { Swig_error(Scanner_file(scan),Scanner_line(scan),"Syntax error. Bad operator name.\n"); } else { Append(s,"()"); yylval.str = s; return OPERATOR; } } else if (nexttok == SWIG_TOKEN_LBRACKET) { /* Array access operator. The next token MUST be a RBRACKET */ nexttok = Scanner_token(scan); if (nexttok != SWIG_TOKEN_RBRACKET) { Swig_error(Scanner_file(scan),Scanner_line(scan),"Syntax error. Bad operator name.\n"); } else { Append(s,"[]"); yylval.str = s; return OPERATOR; } } else if (nexttok == SWIG_TOKEN_STRING) { /* Operator "" or user-defined string literal ""_suffix */ Append(s,"\"\""); yylval.str = s; return OPERATOR; } else if (nexttok == SWIG_TOKEN_ID) { /* We have an identifier. This could be any number of things. It could be a named version of an operator (e.g., 'and_eq') or it could be a conversion operator. To deal with this, we're going to read tokens until we encounter a ( or ;. Some care is needed for formatting. */ int needspace = 1; int termtoken = 0; const char *termvalue = 0; Append(s,Scanner_text(scan)); while (1) { nexttok = Scanner_token(scan); if (nexttok <= 0) { Swig_error(Scanner_file(scan),Scanner_line(scan),"Syntax error. Bad operator name.\n"); } if (nexttok == SWIG_TOKEN_LPAREN) { termtoken = SWIG_TOKEN_LPAREN; termvalue = "("; break; } else if (nexttok == SWIG_TOKEN_CODEBLOCK) { termtoken = SWIG_TOKEN_CODEBLOCK; termvalue = Char(Scanner_text(scan)); break; } else if (nexttok == SWIG_TOKEN_LBRACE) { termtoken = SWIG_TOKEN_LBRACE; termvalue = "{"; break; } else if (nexttok == SWIG_TOKEN_SEMI) { termtoken = SWIG_TOKEN_SEMI; termvalue = ";"; break; } else if (nexttok == SWIG_TOKEN_STRING) { termtoken = SWIG_TOKEN_STRING; termvalue = Swig_copy_string(Char(Scanner_text(scan))); break; } else if (nexttok == SWIG_TOKEN_ID) { if (needspace) { Append(s," "); } Append(s,Scanner_text(scan)); } else if (nexttok == SWIG_TOKEN_ENDLINE) { } else if (nexttok == SWIG_TOKEN_COMMENT) { } else { Append(s,Scanner_text(scan)); needspace = 0; } } yylval.str = s; if (!rename_active) { String *cs; char *t = Char(s) + 9; if (!((strcmp(t, "new") == 0) || (strcmp(t, "delete") == 0) || (strcmp(t, "new[]") == 0) || (strcmp(t, "delete[]") == 0) || (strcmp(t, "and") == 0) || (strcmp(t, "and_eq") == 0) || (strcmp(t, "bitand") == 0) || (strcmp(t, "bitor") == 0) || (strcmp(t, "compl") == 0) || (strcmp(t, "not") == 0) || (strcmp(t, "not_eq") == 0) || (strcmp(t, "or") == 0) || (strcmp(t, "or_eq") == 0) || (strcmp(t, "xor") == 0) || (strcmp(t, "xor_eq") == 0) )) { /* retract(strlen(t)); */ /* The operator is a conversion operator. In order to deal with this, we need to feed the type information back into the parser. For now this is a hack. Needs to be cleaned up later. */ cs = NewString(t); if (termtoken) Append(cs,termvalue); Seek(cs,0,SEEK_SET); Setline(cs,cparse_line); Setfile(cs,cparse_file); Scanner_push(scan,cs); Delete(cs); return CONVERSIONOPERATOR; } } if (termtoken) Scanner_pushtoken(scan, termtoken, termvalue); return (OPERATOR); } } if (strcmp(yytext, "throw") == 0) return (THROW); if (strcmp(yytext, "noexcept") == 0) return (NOEXCEPT); if (strcmp(yytext, "try") == 0) return (yylex()); if (strcmp(yytext, "catch") == 0) return (CATCH); if (strcmp(yytext, "inline") == 0) return (yylex()); if (strcmp(yytext, "mutable") == 0) return (yylex()); if (strcmp(yytext, "explicit") == 0) return (EXPLICIT); if (strcmp(yytext, "auto") == 0) return (AUTO); if (strcmp(yytext, "export") == 0) return (yylex()); if (strcmp(yytext, "typename") == 0) return (TYPENAME); if (strcmp(yytext, "template") == 0) { yylval.intvalue = cparse_line; return (TEMPLATE); } if (strcmp(yytext, "delete") == 0) return (DELETE_KW); if (strcmp(yytext, "default") == 0) return (DEFAULT); if (strcmp(yytext, "using") == 0) return (USING); if (strcmp(yytext, "namespace") == 0) return (NAMESPACE); if (strcmp(yytext, "override") == 0) return (OVERRIDE); if (strcmp(yytext, "final") == 0) return (FINAL); } else { if (strcmp(yytext, "class") == 0) { Swig_warning(WARN_PARSE_CLASS_KEYWORD, cparse_file, cparse_line, "class keyword used, but not in C++ mode.\n"); } if (strcmp(yytext, "complex") == 0) { yylval.type = NewSwigType(T_COMPLEX); return (TYPE_COMPLEX); } if (strcmp(yytext, "restrict") == 0) return (yylex()); } /* Misc keywords */ if (strcmp(yytext, "extern") == 0) return (EXTERN); if (strcmp(yytext, "const") == 0) return (CONST_QUAL); if (strcmp(yytext, "static") == 0) return (STATIC); if (strcmp(yytext, "struct") == 0) return (STRUCT); if (strcmp(yytext, "union") == 0) return (UNION); if (strcmp(yytext, "enum") == 0) return (ENUM); if (strcmp(yytext, "sizeof") == 0) return (SIZEOF); if (strcmp(yytext, "typedef") == 0) { yylval.intvalue = 0; return (TYPEDEF); } /* Ignored keywords */ if (strcmp(yytext, "volatile") == 0) return (VOLATILE); if (strcmp(yytext, "register") == 0) return (REGISTER); if (strcmp(yytext, "inline") == 0) return (yylex()); } else { Delete(cparse_unknown_directive); cparse_unknown_directive = NULL; /* SWIG directives */ if (strcmp(yytext, "%module") == 0) return (MODULE); if (strcmp(yytext, "%insert") == 0) return (INSERT); if (strcmp(yytext, "%name") == 0) return (NAME); if (strcmp(yytext, "%rename") == 0) { rename_active = 1; return (RENAME); } if (strcmp(yytext, "%namewarn") == 0) { rename_active = 1; return (NAMEWARN); } if (strcmp(yytext, "%includefile") == 0) return (INCLUDE); if (strcmp(yytext, "%beginfile") == 0) return (BEGINFILE); if (strcmp(yytext, "%endoffile") == 0) return (ENDOFFILE); if (strcmp(yytext, "%val") == 0) { Swig_warning(WARN_DEPRECATED_VAL, cparse_file, cparse_line, "%%val directive deprecated (ignored).\n"); return (yylex()); } if (strcmp(yytext, "%out") == 0) { Swig_warning(WARN_DEPRECATED_OUT, cparse_file, cparse_line, "%%out directive deprecated (ignored).\n"); return (yylex()); } if (strcmp(yytext, "%constant") == 0) return (CONSTANT); if (strcmp(yytext, "%typedef") == 0) { yylval.intvalue = 1; return (TYPEDEF); } if (strcmp(yytext, "%native") == 0) return (NATIVE); if (strcmp(yytext, "%pragma") == 0) return (PRAGMA); if (strcmp(yytext, "%extend") == 0) return (EXTEND); if (strcmp(yytext, "%fragment") == 0) return (FRAGMENT); if (strcmp(yytext, "%inline") == 0) return (INLINE); if (strcmp(yytext, "%typemap") == 0) return (TYPEMAP); if (strcmp(yytext, "%feature") == 0) { /* The rename_active indicates we don't need the information of the * following function's return type. This applied for %rename, so do * %feature. */ rename_active = 1; return (FEATURE); } if (strcmp(yytext, "%except") == 0) return (EXCEPT); if (strcmp(yytext, "%importfile") == 0) return (IMPORT); if (strcmp(yytext, "%echo") == 0) return (ECHO); if (strcmp(yytext, "%apply") == 0) return (APPLY); if (strcmp(yytext, "%clear") == 0) return (CLEAR); if (strcmp(yytext, "%types") == 0) return (TYPES); if (strcmp(yytext, "%parms") == 0) return (PARMS); if (strcmp(yytext, "%varargs") == 0) return (VARARGS); if (strcmp(yytext, "%template") == 0) { return (SWIGTEMPLATE); } if (strcmp(yytext, "%warn") == 0) return (WARN); /* Note down the apparently unknown directive for error reporting. */ cparse_unknown_directive = NewString(yytext); } /* Have an unknown identifier, as a last step, we'll do a typedef lookup on it. */ /* Need to fix this */ if (check_typedef) { if (SwigType_istypedef(yytext)) { yylval.type = NewString(yytext); return (TYPE_TYPEDEF); } } yylval.id = Swig_copy_string(yytext); last_id = 1; return (ID); case POUND: return yylex(); default: return (l); } } swig-3.0.12/Source/CParse/parser.y0000664000175000017500000064410213042756442016547 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * parser.y * * YACC parser for SWIG. The grammar is a somewhat broken subset of C/C++. * This file is a bit of a mess and probably needs to be rewritten at * some point. Beware. * ----------------------------------------------------------------------------- */ /* There are 6 known shift-reduce conflicts in this file, fail compilation if any more are introduced. Please don't increase the number of the conflicts if at all possible. And if you really have no choice but to do it, make sure you clearly document each new conflict in this file. */ %expect 6 %{ #define yylex yylex #include "swig.h" #include "cparse.h" #include "preprocessor.h" #include /* We do this for portability */ #undef alloca #define alloca malloc /* ----------------------------------------------------------------------------- * Externals * ----------------------------------------------------------------------------- */ int yyparse(); /* NEW Variables */ static Node *top = 0; /* Top of the generated parse tree */ static int unnamed = 0; /* Unnamed datatype counter */ static Hash *classes = 0; /* Hash table of classes */ static Hash *classes_typedefs = 0; /* Hash table of typedef classes: typedef struct X {...} Y; */ static Symtab *prev_symtab = 0; static Node *current_class = 0; String *ModuleName = 0; static Node *module_node = 0; static String *Classprefix = 0; static String *Namespaceprefix = 0; static int inclass = 0; static Node *currentOuterClass = 0; /* for nested classes */ static const char *last_cpptype = 0; static int inherit_list = 0; static Parm *template_parameters = 0; static int parsing_template_declaration = 0; static int extendmode = 0; static int compact_default_args = 0; static int template_reduce = 0; static int cparse_externc = 0; int ignore_nested_classes = 0; int kwargs_supported = 0; /* ----------------------------------------------------------------------------- * Assist Functions * ----------------------------------------------------------------------------- */ /* Called by the parser (yyparse) when an error is found.*/ static void yyerror (const char *e) { (void)e; } /* Copies a node. Does not copy tree links or symbol table data (except for sym:name) */ static Node *copy_node(Node *n) { Node *nn; Iterator k; nn = NewHash(); Setfile(nn,Getfile(n)); Setline(nn,Getline(n)); for (k = First(n); k.key; k = Next(k)) { String *ci; String *key = k.key; char *ckey = Char(key); if ((strcmp(ckey,"nextSibling") == 0) || (strcmp(ckey,"previousSibling") == 0) || (strcmp(ckey,"parentNode") == 0) || (strcmp(ckey,"lastChild") == 0)) { continue; } if (Strncmp(key,"csym:",5) == 0) continue; /* We do copy sym:name. For templates */ if ((strcmp(ckey,"sym:name") == 0) || (strcmp(ckey,"sym:weak") == 0) || (strcmp(ckey,"sym:typename") == 0)) { String *ci = Copy(k.item); Setattr(nn,key, ci); Delete(ci); continue; } if (strcmp(ckey,"sym:symtab") == 0) { Setattr(nn,"sym:needs_symtab", "1"); } /* We don't copy any other symbol table attributes */ if (strncmp(ckey,"sym:",4) == 0) { continue; } /* If children. We copy them recursively using this function */ if (strcmp(ckey,"firstChild") == 0) { /* Copy children */ Node *cn = k.item; while (cn) { Node *copy = copy_node(cn); appendChild(nn,copy); Delete(copy); cn = nextSibling(cn); } continue; } /* We don't copy the symbol table. But we drop an attribute requires_symtab so that functions know it needs to be built */ if (strcmp(ckey,"symtab") == 0) { /* Node defined a symbol table. */ Setattr(nn,"requires_symtab","1"); continue; } /* Can't copy nodes */ if (strcmp(ckey,"node") == 0) { continue; } if ((strcmp(ckey,"parms") == 0) || (strcmp(ckey,"pattern") == 0) || (strcmp(ckey,"throws") == 0) || (strcmp(ckey,"kwargs") == 0)) { ParmList *pl = CopyParmList(k.item); Setattr(nn,key,pl); Delete(pl); continue; } if (strcmp(ckey,"nested:outer") == 0) { /* don't copy outer classes links, they will be updated later */ Setattr(nn, key, k.item); continue; } /* defaultargs will be patched back in later in update_defaultargs() */ if (strcmp(ckey,"defaultargs") == 0) { Setattr(nn, "needs_defaultargs", "1"); continue; } /* Looks okay. Just copy the data using Copy */ ci = Copy(k.item); Setattr(nn, key, ci); Delete(ci); } return nn; } /* ----------------------------------------------------------------------------- * Variables * ----------------------------------------------------------------------------- */ static char *typemap_lang = 0; /* Current language setting */ static int cplus_mode = 0; /* C++ modes */ #define CPLUS_PUBLIC 1 #define CPLUS_PRIVATE 2 #define CPLUS_PROTECTED 3 /* include types */ static int import_mode = 0; void SWIG_typemap_lang(const char *tm_lang) { typemap_lang = Swig_copy_string(tm_lang); } void SWIG_cparse_set_compact_default_args(int defargs) { compact_default_args = defargs; } int SWIG_cparse_template_reduce(int treduce) { template_reduce = treduce; return treduce; } /* ----------------------------------------------------------------------------- * Assist functions * ----------------------------------------------------------------------------- */ static int promote_type(int t) { if (t <= T_UCHAR || t == T_CHAR) return T_INT; return t; } /* Perform type-promotion for binary operators */ static int promote(int t1, int t2) { t1 = promote_type(t1); t2 = promote_type(t2); return t1 > t2 ? t1 : t2; } static String *yyrename = 0; /* Forward renaming operator */ static String *resolve_create_node_scope(String *cname); Hash *Swig_cparse_features(void) { static Hash *features_hash = 0; if (!features_hash) features_hash = NewHash(); return features_hash; } /* Fully qualify any template parameters */ static String *feature_identifier_fix(String *s) { String *tp = SwigType_istemplate_templateprefix(s); if (tp) { String *ts, *ta, *tq; ts = SwigType_templatesuffix(s); ta = SwigType_templateargs(s); tq = Swig_symbol_type_qualify(ta,0); Append(tp,tq); Append(tp,ts); Delete(ts); Delete(ta); Delete(tq); return tp; } else { return NewString(s); } } static void set_access_mode(Node *n) { if (cplus_mode == CPLUS_PUBLIC) Setattr(n, "access", "public"); else if (cplus_mode == CPLUS_PROTECTED) Setattr(n, "access", "protected"); else Setattr(n, "access", "private"); } static void restore_access_mode(Node *n) { String *mode = Getattr(n, "access"); if (Strcmp(mode, "private") == 0) cplus_mode = CPLUS_PRIVATE; else if (Strcmp(mode, "protected") == 0) cplus_mode = CPLUS_PROTECTED; else cplus_mode = CPLUS_PUBLIC; } /* Generate the symbol table name for an object */ /* This is a bit of a mess. Need to clean up */ static String *add_oldname = 0; static String *make_name(Node *n, String *name,SwigType *decl) { String *made_name = 0; int destructor = name && (*(Char(name)) == '~'); if (yyrename) { String *s = NewString(yyrename); Delete(yyrename); yyrename = 0; if (destructor && (*(Char(s)) != '~')) { Insert(s,0,"~"); } return s; } if (!name) return 0; if (parsing_template_declaration) SetFlag(n, "parsing_template_declaration"); made_name = Swig_name_make(n, Namespaceprefix, name, decl, add_oldname); Delattr(n, "parsing_template_declaration"); return made_name; } /* Generate an unnamed identifier */ static String *make_unnamed() { unnamed++; return NewStringf("$unnamed%d$",unnamed); } /* Return if the node is a friend declaration */ static int is_friend(Node *n) { return Cmp(Getattr(n,"storage"),"friend") == 0; } static int is_operator(String *name) { return Strncmp(name,"operator ", 9) == 0; } /* Add declaration list to symbol table */ static int add_only_one = 0; static void add_symbols(Node *n) { String *decl; String *wrn = 0; if (inclass && n) { cparse_normalize_void(n); } while (n) { String *symname = 0; /* for friends, we need to pop the scope once */ String *old_prefix = 0; Symtab *old_scope = 0; int isfriend = inclass && is_friend(n); int iscdecl = Cmp(nodeType(n),"cdecl") == 0; int only_csymbol = 0; if (inclass) { String *name = Getattr(n, "name"); if (isfriend) { /* for friends, we need to add the scopename if needed */ String *prefix = name ? Swig_scopename_prefix(name) : 0; old_prefix = Namespaceprefix; old_scope = Swig_symbol_popscope(); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (!prefix) { if (name && !is_operator(name) && Namespaceprefix) { String *nname = NewStringf("%s::%s", Namespaceprefix, name); Setattr(n,"name",nname); Delete(nname); } } else { Symtab *st = Swig_symbol_getscope(prefix); String *ns = st ? Getattr(st,"name") : prefix; String *base = Swig_scopename_last(name); String *nname = NewStringf("%s::%s", ns, base); Setattr(n,"name",nname); Delete(nname); Delete(base); Delete(prefix); } Namespaceprefix = 0; } else { /* for member functions, we need to remove the redundant class scope if provided, as in struct Foo { int Foo::method(int a); }; */ String *prefix = name ? Swig_scopename_prefix(name) : 0; if (prefix) { if (Classprefix && (Equal(prefix,Classprefix))) { String *base = Swig_scopename_last(name); Setattr(n,"name",base); Delete(base); } Delete(prefix); } } } if (!isfriend && (inclass || extendmode)) { Setattr(n,"ismember","1"); } if (extendmode) { if (!Getattr(n, "template")) SetFlag(n,"isextendmember"); } if (!isfriend && inclass) { if ((cplus_mode != CPLUS_PUBLIC)) { only_csymbol = 1; if (cplus_mode == CPLUS_PROTECTED) { Setattr(n,"access", "protected"); only_csymbol = !Swig_need_protected(n); } else { Setattr(n,"access", "private"); /* private are needed only when they are pure virtuals - why? */ if ((Cmp(Getattr(n,"storage"),"virtual") == 0) && (Cmp(Getattr(n,"value"),"0") == 0)) { only_csymbol = 0; } if (Cmp(nodeType(n),"destructor") == 0) { /* Needed for "unref" feature */ only_csymbol = 0; } } } else { Setattr(n,"access", "public"); } } if (Getattr(n,"sym:name")) { n = nextSibling(n); continue; } decl = Getattr(n,"decl"); if (!SwigType_isfunction(decl)) { String *name = Getattr(n,"name"); String *makename = Getattr(n,"parser:makename"); if (iscdecl) { String *storage = Getattr(n, "storage"); if (Cmp(storage,"typedef") == 0) { Setattr(n,"kind","typedef"); } else { SwigType *type = Getattr(n,"type"); String *value = Getattr(n,"value"); Setattr(n,"kind","variable"); if (value && Len(value)) { Setattr(n,"hasvalue","1"); } if (type) { SwigType *ty; SwigType *tmp = 0; if (decl) { ty = tmp = Copy(type); SwigType_push(ty,decl); } else { ty = type; } if (!SwigType_ismutable(ty) || (storage && Strstr(storage, "constexpr"))) { SetFlag(n,"hasconsttype"); SetFlag(n,"feature:immutable"); } if (tmp) Delete(tmp); } if (!type) { Printf(stderr,"notype name %s\n", name); } } } Swig_features_get(Swig_cparse_features(), Namespaceprefix, name, 0, n); if (makename) { symname = make_name(n, makename,0); Delattr(n,"parser:makename"); /* temporary information, don't leave it hanging around */ } else { makename = name; symname = make_name(n, makename,0); } if (!symname) { symname = Copy(Getattr(n,"unnamed")); } if (symname) { if (parsing_template_declaration) SetFlag(n, "parsing_template_declaration"); wrn = Swig_name_warning(n, Namespaceprefix, symname,0); Delattr(n, "parsing_template_declaration"); } } else { String *name = Getattr(n,"name"); SwigType *fdecl = Copy(decl); SwigType *fun = SwigType_pop_function(fdecl); if (iscdecl) { Setattr(n,"kind","function"); } Swig_features_get(Swig_cparse_features(),Namespaceprefix,name,fun,n); symname = make_name(n, name,fun); if (parsing_template_declaration) SetFlag(n, "parsing_template_declaration"); wrn = Swig_name_warning(n, Namespaceprefix,symname,fun); Delattr(n, "parsing_template_declaration"); Delete(fdecl); Delete(fun); } if (!symname) { n = nextSibling(n); continue; } if (cparse_cplusplus) { String *value = Getattr(n, "value"); if (value && Strcmp(value, "delete") == 0) { /* C++11 deleted definition / deleted function */ SetFlag(n,"deleted"); SetFlag(n,"feature:ignore"); } } if (only_csymbol || GetFlag(n,"feature:ignore") || strncmp(Char(symname),"$ignore",7) == 0) { /* Only add to C symbol table and continue */ Swig_symbol_add(0, n); if (!only_csymbol && !GetFlag(n, "feature:ignore")) { /* Print the warning attached to $ignore name, if any */ char *c = Char(symname) + 7; if (strlen(c)) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0,Getfile(n), Getline(n), "%s\n",c+1); SWIG_WARN_NODE_END(n); } /* If the symbol was ignored via "rename" and is visible, set also feature:ignore*/ SetFlag(n, "feature:ignore"); } if (!GetFlag(n, "feature:ignore") && Strcmp(symname,"$ignore") == 0) { /* Add feature:ignore if the symbol was explicitely ignored, regardless of visibility */ SetFlag(n, "feature:ignore"); } } else { Node *c; if ((wrn) && (Len(wrn))) { String *metaname = symname; if (!Getmeta(metaname,"already_warned")) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0,Getfile(n),Getline(n), "%s\n", wrn); SWIG_WARN_NODE_END(n); Setmeta(metaname,"already_warned","1"); } } c = Swig_symbol_add(symname,n); if (c != n) { /* symbol conflict attempting to add in the new symbol */ if (Getattr(n,"sym:weak")) { Setattr(n,"sym:name",symname); } else { String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); int redefined = Swig_need_redefined_warn(n,c,inclass); if (redefined) { Printf(en,"Identifier '%s' redefined (ignored)",symname); Printf(ec,"previous definition of '%s'",symname); } else { Printf(en,"Redundant redeclaration of '%s'",symname); Printf(ec,"previous declaration of '%s'",symname); } if (Cmp(symname,Getattr(n,"name"))) { Printf(en," (Renamed from '%s')", SwigType_namestr(Getattr(n,"name"))); } Printf(en,","); if (Cmp(symname,Getattr(c,"name"))) { Printf(ec," (Renamed from '%s')", SwigType_namestr(Getattr(c,"name"))); } Printf(ec,"."); SWIG_WARN_NODE_BEGIN(n); if (redefined) { Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en); Swig_warning(WARN_PARSE_REDEFINED,Getfile(c),Getline(c),"%s\n",ec); } else if (!is_friend(n) && !is_friend(c)) { Swig_warning(WARN_PARSE_REDUNDANT,Getfile(n),Getline(n),"%s\n",en); Swig_warning(WARN_PARSE_REDUNDANT,Getfile(c),Getline(c),"%s\n",ec); } SWIG_WARN_NODE_END(n); Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(n),Getline(n),en, Getfile(c),Getline(c),ec); Setattr(n,"error",e); Delete(e); Delete(en); Delete(ec); } } } /* restore the class scope if needed */ if (isfriend) { Swig_symbol_setscope(old_scope); if (old_prefix) { Delete(Namespaceprefix); Namespaceprefix = old_prefix; } } Delete(symname); if (add_only_one) return; n = nextSibling(n); } } /* add symbols a parse tree node copy */ static void add_symbols_copy(Node *n) { String *name; int emode = 0; while (n) { char *cnodeType = Char(nodeType(n)); if (strcmp(cnodeType,"access") == 0) { String *kind = Getattr(n,"kind"); if (Strcmp(kind,"public") == 0) { cplus_mode = CPLUS_PUBLIC; } else if (Strcmp(kind,"private") == 0) { cplus_mode = CPLUS_PRIVATE; } else if (Strcmp(kind,"protected") == 0) { cplus_mode = CPLUS_PROTECTED; } n = nextSibling(n); continue; } add_oldname = Getattr(n,"sym:name"); if ((add_oldname) || (Getattr(n,"sym:needs_symtab"))) { int old_inclass = -1; Node *old_current_class = 0; if (add_oldname) { DohIncref(add_oldname); /* Disable this, it prevents %rename to work with templates */ /* If already renamed, we used that name */ /* if (Strcmp(add_oldname, Getattr(n,"name")) != 0) { Delete(yyrename); yyrename = Copy(add_oldname); } */ } Delattr(n,"sym:needs_symtab"); Delattr(n,"sym:name"); add_only_one = 1; add_symbols(n); if (Getattr(n,"partialargs")) { Swig_symbol_cadd(Getattr(n,"partialargs"),n); } add_only_one = 0; name = Getattr(n,"name"); if (Getattr(n,"requires_symtab")) { Swig_symbol_newscope(); Swig_symbol_setscopename(name); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } if (strcmp(cnodeType,"class") == 0) { old_inclass = inclass; inclass = 1; old_current_class = current_class; current_class = n; if (Strcmp(Getattr(n,"kind"),"class") == 0) { cplus_mode = CPLUS_PRIVATE; } else { cplus_mode = CPLUS_PUBLIC; } } if (strcmp(cnodeType,"extend") == 0) { emode = cplus_mode; cplus_mode = CPLUS_PUBLIC; } add_symbols_copy(firstChild(n)); if (strcmp(cnodeType,"extend") == 0) { cplus_mode = emode; } if (Getattr(n,"requires_symtab")) { Setattr(n,"symtab", Swig_symbol_popscope()); Delattr(n,"requires_symtab"); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } if (add_oldname) { Delete(add_oldname); add_oldname = 0; } if (strcmp(cnodeType,"class") == 0) { inclass = old_inclass; current_class = old_current_class; } } else { if (strcmp(cnodeType,"extend") == 0) { emode = cplus_mode; cplus_mode = CPLUS_PUBLIC; } add_symbols_copy(firstChild(n)); if (strcmp(cnodeType,"extend") == 0) { cplus_mode = emode; } } n = nextSibling(n); } } /* Add in the "defaultargs" attribute for functions in instantiated templates. * n should be any instantiated template (class or start of linked list of functions). */ static void update_defaultargs(Node *n) { if (n) { Node *firstdefaultargs = n; update_defaultargs(firstChild(n)); n = nextSibling(n); /* recursively loop through nodes of all types, but all we really need are the overloaded functions */ while (n) { update_defaultargs(firstChild(n)); if (!Getattr(n, "defaultargs")) { if (Getattr(n, "needs_defaultargs")) { Setattr(n, "defaultargs", firstdefaultargs); Delattr(n, "needs_defaultargs"); } else { firstdefaultargs = n; } } else { /* Functions added in with %extend (for specialized template classes) will already have default args patched up */ assert(Getattr(n, "defaultargs") == firstdefaultargs); } n = nextSibling(n); } } } /* Check a set of declarations to see if any are pure-abstract */ static List *pure_abstracts(Node *n) { List *abstracts = 0; while (n) { if (Cmp(nodeType(n),"cdecl") == 0) { String *decl = Getattr(n,"decl"); if (SwigType_isfunction(decl)) { String *init = Getattr(n,"value"); if (Cmp(init,"0") == 0) { if (!abstracts) { abstracts = NewList(); } Append(abstracts,n); SetFlag(n,"abstract"); } } } else if (Cmp(nodeType(n),"destructor") == 0) { if (Cmp(Getattr(n,"value"),"0") == 0) { if (!abstracts) { abstracts = NewList(); } Append(abstracts,n); SetFlag(n,"abstract"); } } n = nextSibling(n); } return abstracts; } /* Make a classname */ static String *make_class_name(String *name) { String *nname = 0; String *prefix; if (Namespaceprefix) { nname= NewStringf("%s::%s", Namespaceprefix, name); } else { nname = NewString(name); } prefix = SwigType_istemplate_templateprefix(nname); if (prefix) { String *args, *qargs; args = SwigType_templateargs(nname); qargs = Swig_symbol_type_qualify(args,0); Append(prefix,qargs); Delete(nname); Delete(args); Delete(qargs); nname = prefix; } return nname; } /* Use typedef name as class name */ static void add_typedef_name(Node *n, Node *declnode, String *oldName, Symtab *cscope, String *scpname) { String *class_rename = 0; SwigType *decl = Getattr(declnode, "decl"); if (!decl || !Len(decl)) { String *cname; String *tdscopename; String *class_scope = Swig_symbol_qualifiedscopename(cscope); String *name = Getattr(declnode, "name"); cname = Copy(name); Setattr(n, "tdname", cname); tdscopename = class_scope ? NewStringf("%s::%s", class_scope, name) : Copy(name); class_rename = Getattr(n, "class_rename"); if (class_rename && (Strcmp(class_rename, oldName) == 0)) Setattr(n, "class_rename", NewString(name)); if (!classes_typedefs) classes_typedefs = NewHash(); if (!Equal(scpname, tdscopename) && !Getattr(classes_typedefs, tdscopename)) { Setattr(classes_typedefs, tdscopename, n); } Setattr(n, "decl", decl); Delete(class_scope); Delete(cname); Delete(tdscopename); } } /* If the class name is qualified. We need to create or lookup namespace entries */ static Symtab *set_scope_to_global() { Symtab *symtab = Swig_symbol_global_scope(); Swig_symbol_setscope(symtab); return symtab; } /* Remove the block braces, { and }, if the 'noblock' attribute is set. * Node *kw can be either a Hash or Parmlist. */ static String *remove_block(Node *kw, const String *inputcode) { String *modified_code = 0; while (kw) { String *name = Getattr(kw,"name"); if (name && (Cmp(name,"noblock") == 0)) { char *cstr = Char(inputcode); int len = Len(inputcode); if (len && cstr[0] == '{') { --len; ++cstr; if (len && cstr[len - 1] == '}') { --len; } /* we now remove the extra spaces */ while (len && isspace((int)cstr[0])) { --len; ++cstr; } while (len && isspace((int)cstr[len - 1])) { --len; } modified_code = NewStringWithSize(cstr, len); break; } } kw = nextSibling(kw); } return modified_code; } static Node *nscope = 0; static Node *nscope_inner = 0; /* Remove the scope prefix from cname and return the base name without the prefix. * The scopes required for the symbol name are resolved and/or created, if required. * For example AA::BB::CC as input returns CC and creates the namespace AA then inner * namespace BB in the current scope. If cname is found to already exist as a weak symbol * (forward reference) then the scope might be changed to match, such as when a symbol match * is made via a using reference. */ static String *resolve_create_node_scope(String *cname) { Symtab *gscope = 0; Node *cname_node = 0; int skip_lookup = 0; nscope = 0; nscope_inner = 0; if (Strncmp(cname,"::",2) == 0) skip_lookup = 1; cname_node = skip_lookup ? 0 : Swig_symbol_clookup_no_inherit(cname, 0); if (cname_node) { /* The symbol has been defined already or is in another scope. If it is a weak symbol, it needs replacing and if it was brought into the current scope via a using declaration, the scope needs adjusting appropriately for the new symbol. Similarly for defined templates. */ Symtab *symtab = Getattr(cname_node, "sym:symtab"); Node *sym_weak = Getattr(cname_node, "sym:weak"); if ((symtab && sym_weak) || Equal(nodeType(cname_node), "template")) { /* Check if the scope is the current scope */ String *current_scopename = Swig_symbol_qualifiedscopename(0); String *found_scopename = Swig_symbol_qualifiedscopename(symtab); int len; if (!current_scopename) current_scopename = NewString(""); if (!found_scopename) found_scopename = NewString(""); len = Len(current_scopename); if ((len > 0) && (Strncmp(current_scopename, found_scopename, len) == 0)) { if (Len(found_scopename) > len + 2) { /* A matching weak symbol was found in non-global scope, some scope adjustment may be required */ String *new_cname = NewString(Char(found_scopename) + len + 2); /* skip over "::" prefix */ String *base = Swig_scopename_last(cname); Printf(new_cname, "::%s", base); cname = new_cname; Delete(base); } else { /* A matching weak symbol was found in the same non-global local scope, no scope adjustment required */ assert(len == Len(found_scopename)); } } else { String *base = Swig_scopename_last(cname); if (Len(found_scopename) > 0) { /* A matching weak symbol was found in a different scope to the local scope - probably via a using declaration */ cname = NewStringf("%s::%s", found_scopename, base); } else { /* Either: 1) A matching weak symbol was found in a different scope to the local scope - this is actually a symbol with the same name in a different scope which we don't want, so no adjustment required. 2) A matching weak symbol was found in the global scope - no adjustment required. */ cname = Copy(base); } Delete(base); } Delete(current_scopename); Delete(found_scopename); } } if (Swig_scopename_check(cname)) { Node *ns; String *prefix = Swig_scopename_prefix(cname); String *base = Swig_scopename_last(cname); if (prefix && (Strncmp(prefix,"::",2) == 0)) { /* I don't think we can use :: global scope to declare classes and hence neither %template. - consider reporting error instead - wsfulton. */ /* Use the global scope */ String *nprefix = NewString(Char(prefix)+2); Delete(prefix); prefix= nprefix; gscope = set_scope_to_global(); } if (Len(prefix) == 0) { /* Use the global scope, but we need to add a 'global' namespace. */ if (!gscope) gscope = set_scope_to_global(); /* note that this namespace is not the "unnamed" one, and we don't use Setattr(nscope,"name", ""), because the unnamed namespace is private */ nscope = new_node("namespace"); Setattr(nscope,"symtab", gscope);; nscope_inner = nscope; return base; } /* Try to locate the scope */ ns = Swig_symbol_clookup(prefix,0); if (!ns) { Swig_error(cparse_file,cparse_line,"Undefined scope '%s'\n", prefix); } else { Symtab *nstab = Getattr(ns,"symtab"); if (!nstab) { Swig_error(cparse_file,cparse_line, "'%s' is not defined as a valid scope.\n", prefix); ns = 0; } else { /* Check if the node scope is the current scope */ String *tname = Swig_symbol_qualifiedscopename(0); String *nname = Swig_symbol_qualifiedscopename(nstab); if (tname && (Strcmp(tname,nname) == 0)) { ns = 0; cname = base; } Delete(tname); Delete(nname); } if (ns) { /* we will try to create a new node using the namespaces we can find in the scope name */ List *scopes; String *sname; Iterator si; String *name = NewString(prefix); scopes = NewList(); while (name) { String *base = Swig_scopename_last(name); String *tprefix = Swig_scopename_prefix(name); Insert(scopes,0,base); Delete(base); Delete(name); name = tprefix; } for (si = First(scopes); si.item; si = Next(si)) { Node *ns1,*ns2; sname = si.item; ns1 = Swig_symbol_clookup(sname,0); assert(ns1); if (Strcmp(nodeType(ns1),"namespace") == 0) { if (Getattr(ns1,"alias")) { ns1 = Getattr(ns1,"namespace"); } } else { /* now this last part is a class */ si = Next(si); /* or a nested class tree, which is unrolled here */ for (; si.item; si = Next(si)) { if (si.item) { Printf(sname,"::%s",si.item); } } /* we get the 'inner' class */ nscope_inner = Swig_symbol_clookup(sname,0); /* set the scope to the inner class */ Swig_symbol_setscope(Getattr(nscope_inner,"symtab")); /* save the last namespace prefix */ Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); /* and return the node name, including the inner class prefix */ break; } /* here we just populate the namespace tree as usual */ ns2 = new_node("namespace"); Setattr(ns2,"name",sname); Setattr(ns2,"symtab", Getattr(ns1,"symtab")); add_symbols(ns2); Swig_symbol_setscope(Getattr(ns1,"symtab")); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (nscope_inner) { if (Getattr(nscope_inner,"symtab") != Getattr(ns2,"symtab")) { appendChild(nscope_inner,ns2); Delete(ns2); } } nscope_inner = ns2; if (!nscope) nscope = ns2; } cname = base; Delete(scopes); } } Delete(prefix); } return cname; } /* look for simple typedef name in typedef list */ static String *try_to_find_a_name_for_unnamed_structure(const char *storage, Node *decls) { String *name = 0; Node *n = decls; if (storage && (strcmp(storage, "typedef") == 0)) { for (; n; n = nextSibling(n)) { if (!Len(Getattr(n, "decl"))) { name = Copy(Getattr(n, "name")); break; } } } return name; } /* traverse copied tree segment, and update outer class links*/ static void update_nested_classes(Node *n) { Node *c = firstChild(n); while (c) { if (Getattr(c, "nested:outer")) Setattr(c, "nested:outer", n); update_nested_classes(c); c = nextSibling(c); } } /* ----------------------------------------------------------------------------- * nested_forward_declaration() * * Nested struct handling for C++ code if the nested classes are disabled. * Create the nested class/struct/union as a forward declaration. * ----------------------------------------------------------------------------- */ static Node *nested_forward_declaration(const char *storage, const char *kind, String *sname, String *name, Node *cpp_opt_declarators) { Node *nn = 0; if (sname) { /* Add forward declaration of the nested type */ Node *n = new_node("classforward"); Setattr(n, "kind", kind); Setattr(n, "name", sname); Setattr(n, "storage", storage); Setattr(n, "sym:weak", "1"); add_symbols(n); nn = n; } /* Add any variable instances. Also add in any further typedefs of the nested type. Note that anonymous typedefs (eg typedef struct {...} a, b;) are treated as class forward declarations */ if (cpp_opt_declarators) { int storage_typedef = (storage && (strcmp(storage, "typedef") == 0)); int variable_of_anonymous_type = !sname && !storage_typedef; if (!variable_of_anonymous_type) { int anonymous_typedef = !sname && (storage && (strcmp(storage, "typedef") == 0)); Node *n = cpp_opt_declarators; SwigType *type = name; while (n) { Setattr(n, "type", type); Setattr(n, "storage", storage); if (anonymous_typedef) { Setattr(n, "nodeType", "classforward"); Setattr(n, "sym:weak", "1"); } n = nextSibling(n); } add_symbols(cpp_opt_declarators); if (nn) { set_nextSibling(nn, cpp_opt_declarators); } else { nn = cpp_opt_declarators; } } } if (!currentOuterClass || !GetFlag(currentOuterClass, "nested")) { if (nn && Equal(nodeType(nn), "classforward")) { Node *n = nn; if (!GetFlag(n, "feature:ignore")) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(WARN_PARSE_NAMED_NESTED_CLASS, cparse_file, cparse_line,"Nested %s not currently supported (%s ignored)\n", kind, sname ? sname : name); SWIG_WARN_NODE_END(n); } } else { Swig_warning(WARN_PARSE_UNNAMED_NESTED_CLASS, cparse_file, cparse_line, "Nested %s not currently supported (ignored).\n", kind); } } return nn; } Node *Swig_cparse(File *f) { scanner_file(f); top = 0; yyparse(); return top; } static void single_new_feature(const char *featurename, String *val, Hash *featureattribs, char *declaratorid, SwigType *type, ParmList *declaratorparms, String *qualifier) { String *fname; String *name; String *fixname; SwigType *t = Copy(type); /* Printf(stdout, "single_new_feature: [%s] [%s] [%s] [%s] [%s] [%s]\n", featurename, val, declaratorid, t, ParmList_str_defaultargs(declaratorparms), qualifier); */ /* Warn about deprecated features */ if (strcmp(featurename, "nestedworkaround") == 0) Swig_warning(WARN_DEPRECATED_NESTED_WORKAROUND, cparse_file, cparse_line, "The 'nestedworkaround' feature is deprecated.\n"); fname = NewStringf("feature:%s",featurename); if (declaratorid) { fixname = feature_identifier_fix(declaratorid); } else { fixname = NewStringEmpty(); } if (Namespaceprefix) { name = NewStringf("%s::%s",Namespaceprefix, fixname); } else { name = fixname; } if (declaratorparms) Setmeta(val,"parms",declaratorparms); if (!Len(t)) t = 0; if (t) { if (qualifier) SwigType_push(t,qualifier); if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(), nname, decl, fname, val, featureattribs); Delete(nname); } else { Swig_feature_set(Swig_cparse_features(), name, decl, fname, val, featureattribs); } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(),nname,0,fname,val, featureattribs); Delete(nname); } } else { /* Global feature, that is, feature not associated with any particular symbol */ Swig_feature_set(Swig_cparse_features(),name,0,fname,val, featureattribs); } Delete(fname); Delete(name); } /* Add a new feature to the Hash. Additional features are added if the feature has a parameter list (declaratorparms) * and one or more of the parameters have a default argument. An extra feature is added for each defaulted parameter, * simulating the equivalent overloaded method. */ static void new_feature(const char *featurename, String *val, Hash *featureattribs, char *declaratorid, SwigType *type, ParmList *declaratorparms, String *qualifier) { ParmList *declparms = declaratorparms; /* remove the { and } braces if the noblock attribute is set */ String *newval = remove_block(featureattribs, val); val = newval ? newval : val; /* Add the feature */ single_new_feature(featurename, val, featureattribs, declaratorid, type, declaratorparms, qualifier); /* Add extra features if there are default parameters in the parameter list */ if (type) { while (declparms) { if (ParmList_has_defaultargs(declparms)) { /* Create a parameter list for the new feature by copying all but the last (defaulted) parameter */ ParmList* newparms = CopyParmListMax(declparms, ParmList_len(declparms)-1); /* Create new declaration - with the last parameter removed */ SwigType *newtype = Copy(type); Delete(SwigType_pop_function(newtype)); /* remove the old parameter list from newtype */ SwigType_add_function(newtype,newparms); single_new_feature(featurename, Copy(val), featureattribs, declaratorid, newtype, newparms, qualifier); declparms = newparms; } else { declparms = 0; } } } } /* check if a function declaration is a plain C object */ static int is_cfunction(Node *n) { if (!cparse_cplusplus || cparse_externc) return 1; if (Swig_storage_isexternc(n)) { return 1; } return 0; } /* If the Node is a function with parameters, check to see if any of the parameters * have default arguments. If so create a new function for each defaulted argument. * The additional functions form a linked list of nodes with the head being the original Node n. */ static void default_arguments(Node *n) { Node *function = n; if (function) { ParmList *varargs = Getattr(function,"feature:varargs"); if (varargs) { /* Handles the %varargs directive by looking for "feature:varargs" and * substituting ... with an alternative set of arguments. */ Parm *p = Getattr(function,"parms"); Parm *pp = 0; while (p) { SwigType *t = Getattr(p,"type"); if (Strcmp(t,"v(...)") == 0) { if (pp) { ParmList *cv = Copy(varargs); set_nextSibling(pp,cv); Delete(cv); } else { ParmList *cv = Copy(varargs); Setattr(function,"parms", cv); Delete(cv); } break; } pp = p; p = nextSibling(p); } } /* Do not add in functions if kwargs is being used or if user wants old default argument wrapping (one wrapped method per function irrespective of number of default arguments) */ if (compact_default_args || is_cfunction(function) || GetFlag(function,"feature:compactdefaultargs") || (GetFlag(function,"feature:kwargs") && kwargs_supported)) { ParmList *p = Getattr(function,"parms"); if (p) Setattr(p,"compactdefargs", "1"); /* mark parameters for special handling */ function = 0; /* don't add in extra methods */ } } while (function) { ParmList *parms = Getattr(function,"parms"); if (ParmList_has_defaultargs(parms)) { /* Create a parameter list for the new function by copying all but the last (defaulted) parameter */ ParmList* newparms = CopyParmListMax(parms,ParmList_len(parms)-1); /* Create new function and add to symbol table */ { SwigType *ntype = Copy(nodeType(function)); char *cntype = Char(ntype); Node *new_function = new_node(ntype); SwigType *decl = Copy(Getattr(function,"decl")); int constqualifier = SwigType_isconst(decl); String *ccode = Copy(Getattr(function,"code")); String *cstorage = Copy(Getattr(function,"storage")); String *cvalue = Copy(Getattr(function,"value")); SwigType *ctype = Copy(Getattr(function,"type")); String *cthrow = Copy(Getattr(function,"throw")); Delete(SwigType_pop_function(decl)); /* remove the old parameter list from decl */ SwigType_add_function(decl,newparms); if (constqualifier) SwigType_add_qualifier(decl,"const"); Setattr(new_function,"name", Getattr(function,"name")); Setattr(new_function,"code", ccode); Setattr(new_function,"decl", decl); Setattr(new_function,"parms", newparms); Setattr(new_function,"storage", cstorage); Setattr(new_function,"value", cvalue); Setattr(new_function,"type", ctype); Setattr(new_function,"throw", cthrow); Delete(ccode); Delete(cstorage); Delete(cvalue); Delete(ctype); Delete(cthrow); Delete(decl); { Node *throws = Getattr(function,"throws"); ParmList *pl = CopyParmList(throws); if (throws) Setattr(new_function,"throws",pl); Delete(pl); } /* copy specific attributes for global (or in a namespace) template functions - these are not templated class methods */ if (strcmp(cntype,"template") == 0) { Node *templatetype = Getattr(function,"templatetype"); Node *symtypename = Getattr(function,"sym:typename"); Parm *templateparms = Getattr(function,"templateparms"); if (templatetype) { Node *tmp = Copy(templatetype); Setattr(new_function,"templatetype",tmp); Delete(tmp); } if (symtypename) { Node *tmp = Copy(symtypename); Setattr(new_function,"sym:typename",tmp); Delete(tmp); } if (templateparms) { Parm *tmp = CopyParmList(templateparms); Setattr(new_function,"templateparms",tmp); Delete(tmp); } } else if (strcmp(cntype,"constructor") == 0) { /* only copied for constructors as this is not a user defined feature - it is hard coded in the parser */ if (GetFlag(function,"feature:new")) SetFlag(new_function,"feature:new"); } add_symbols(new_function); /* mark added functions as ones with overloaded parameters and point to the parsed method */ Setattr(new_function,"defaultargs", n); /* Point to the new function, extending the linked list */ set_nextSibling(function, new_function); Delete(new_function); function = new_function; Delete(ntype); } } else { function = 0; } } } /* ----------------------------------------------------------------------------- * mark_nodes_as_extend() * * Used by the %extend to mark subtypes with "feature:extend". * template instances declared within %extend are skipped * ----------------------------------------------------------------------------- */ static void mark_nodes_as_extend(Node *n) { for (; n; n = nextSibling(n)) { if (Getattr(n, "template") && Strcmp(nodeType(n), "class") == 0) continue; /* Fix me: extend is not a feature. Replace with isextendmember? */ Setattr(n, "feature:extend", "1"); mark_nodes_as_extend(firstChild(n)); } } %} %union { const char *id; List *bases; struct Define { String *val; String *rawval; int type; String *qualifier; String *bitfield; Parm *throws; String *throwf; String *nexcept; } dtype; struct { const char *type; String *filename; int line; } loc; struct { char *id; SwigType *type; String *defarg; ParmList *parms; short have_parms; ParmList *throws; String *throwf; String *nexcept; } decl; Parm *tparms; struct { String *method; Hash *kwargs; } tmap; struct { String *type; String *us; } ptype; SwigType *type; String *str; Parm *p; ParmList *pl; int intvalue; Node *node; }; %token ID %token HBLOCK %token POUND %token STRING WSTRING %token INCLUDE IMPORT INSERT %token CHARCONST WCHARCONST %token NUM_INT NUM_FLOAT NUM_UNSIGNED NUM_LONG NUM_ULONG NUM_LONGLONG NUM_ULONGLONG NUM_BOOL %token TYPEDEF %token TYPE_INT TYPE_UNSIGNED TYPE_SHORT TYPE_LONG TYPE_FLOAT TYPE_DOUBLE TYPE_CHAR TYPE_WCHAR TYPE_VOID TYPE_SIGNED TYPE_BOOL TYPE_COMPLEX TYPE_TYPEDEF TYPE_RAW TYPE_NON_ISO_INT8 TYPE_NON_ISO_INT16 TYPE_NON_ISO_INT32 TYPE_NON_ISO_INT64 %token LPAREN RPAREN COMMA SEMI EXTERN INIT LBRACE RBRACE PERIOD %token CONST_QUAL VOLATILE REGISTER STRUCT UNION EQUAL SIZEOF MODULE LBRACKET RBRACKET %token BEGINFILE ENDOFFILE %token ILLEGAL CONSTANT %token NAME RENAME NAMEWARN EXTEND PRAGMA FEATURE VARARGS %token ENUM %token CLASS TYPENAME PRIVATE PUBLIC PROTECTED COLON STATIC VIRTUAL FRIEND THROW CATCH EXPLICIT %token STATIC_ASSERT CONSTEXPR THREAD_LOCAL DECLTYPE AUTO NOEXCEPT /* C++11 keywords */ %token OVERRIDE FINAL /* C++11 identifiers with special meaning */ %token USING %token NAMESPACE %token NATIVE INLINE %token TYPEMAP EXCEPT ECHO APPLY CLEAR SWIGTEMPLATE FRAGMENT %token WARN %token LESSTHAN GREATERTHAN DELETE_KW DEFAULT %token LESSTHANOREQUALTO GREATERTHANOREQUALTO EQUALTO NOTEQUALTO %token ARROW %token QUESTIONMARK %token TYPES PARMS %token NONID DSTAR DCNOT %token TEMPLATE %token OPERATOR %token CONVERSIONOPERATOR %token PARSETYPE PARSEPARM PARSEPARMS %left CAST %left QUESTIONMARK %left LOR %left LAND %left OR %left XOR %left AND %left EQUALTO NOTEQUALTO %left GREATERTHAN LESSTHAN GREATERTHANOREQUALTO LESSTHANOREQUALTO %left LSHIFT RSHIFT %left PLUS MINUS %left STAR SLASH MODULO %left UMINUS NOT LNOT %left DCOLON %type program interface declaration swig_directive ; /* SWIG directives */ %type extend_directive apply_directive clear_directive constant_directive ; %type echo_directive except_directive fragment_directive include_directive inline_directive ; %type insert_directive module_directive name_directive native_directive ; %type pragma_directive rename_directive feature_directive varargs_directive typemap_directive ; %type types_directive template_directive warn_directive ; /* C declarations */ %type c_declaration c_decl c_decl_tail c_enum_key c_enum_inherit c_enum_decl c_enum_forward_decl c_constructor_decl; %type enumlist edecl; /* C++ declarations */ %type cpp_declaration cpp_class_decl cpp_forward_class_decl cpp_template_decl cpp_alternate_rettype; %type cpp_members cpp_member; %type cpp_constructor_decl cpp_destructor_decl cpp_protection_decl cpp_conversion_operator cpp_static_assert; %type cpp_swig_directive cpp_temp_possible cpp_opt_declarators ; %type cpp_using_decl cpp_namespace_decl cpp_catch_decl cpp_lambda_decl; %type kwargs options; /* Misc */ %type identifier; %type initializer cpp_const exception_specification; %type storage_class extern_string; %type parms ptail rawparms varargs_parms ; %type templateparameters templateparameterstail; %type

parm valparm rawvalparms valparms valptail ; %type

typemap_parm tm_list tm_tail ; %type

templateparameter ; %type templcpptype cpptype classkey classkeyopt access_specifier; %type base_specifier; %type ellipsis variadic; %type type rawtype type_right anon_bitfield_type decltype ; %type base_list inherit raw_inherit; %type definetype def_args etype default_delete deleted_definition explicit_default; %type expr exprnum exprcompound valexpr; %type ename ; %type less_valparms_greater; %type type_qualifier ; %type type_qualifier_raw; %type idstring idstringopt; %type pragma_lang; %type pragma_arg; %type includetype; %type pointer primitive_type; %type declarator direct_declarator notso_direct_declarator parameter_declarator plain_declarator; %type abstract_declarator direct_abstract_declarator ctor_end; %type typemap_type; %type idcolon idcolontail idcolonnt idcolontailnt idtemplate idtemplatetemplate stringbrace stringbracesemi; %type string stringnum wstring; %type template_parms; %type cpp_end cpp_vend; %type rename_namewarn; %type type_specifier primitive_type_list ; %type fname stringtype; %type featattr; %type lambda_introducer lambda_body; %type lambda_tail; %type optional_constant_directive; %type virt_specifier_seq; %% /* ====================================================================== * High-level Interface file * * An interface is just a sequence of declarations which may be SWIG directives * or normal C declarations. * ====================================================================== */ program : interface { if (!classes) classes = NewHash(); Setattr($1,"classes",classes); Setattr($1,"name",ModuleName); if ((!module_node) && ModuleName) { module_node = new_node("module"); Setattr(module_node,"name",ModuleName); } Setattr($1,"module",module_node); top = $1; } | PARSETYPE parm SEMI { top = Copy(Getattr($2,"type")); Delete($2); } | PARSETYPE error { top = 0; } | PARSEPARM parm SEMI { top = $2; } | PARSEPARM error { top = 0; } | PARSEPARMS LPAREN parms RPAREN SEMI { top = $3; } | PARSEPARMS error SEMI { top = 0; } ; interface : interface declaration { /* add declaration to end of linked list (the declaration isn't always a single declaration, sometimes it is a linked list itself) */ appendChild($1,$2); $$ = $1; } | empty { $$ = new_node("top"); } ; declaration : swig_directive { $$ = $1; } | c_declaration { $$ = $1; } | cpp_declaration { $$ = $1; } | SEMI { $$ = 0; } | error { $$ = 0; if (cparse_unknown_directive) { Swig_error(cparse_file, cparse_line, "Unknown directive '%s'.\n", cparse_unknown_directive); } else { Swig_error(cparse_file, cparse_line, "Syntax error in input(1).\n"); } exit(1); } /* Out of class constructor/destructor declarations */ | c_constructor_decl { if ($$) { add_symbols($$); } $$ = $1; } /* Out of class conversion operator. For example: inline A::operator char *() const { ... }. This is nearly impossible to parse normally. We just let the first part generate a syntax error and then resynchronize on the CONVERSIONOPERATOR token---discarding the rest of the definition. Ugh. */ | error CONVERSIONOPERATOR { $$ = 0; skip_decl(); } ; /* ====================================================================== * SWIG DIRECTIVES * ====================================================================== */ swig_directive : extend_directive { $$ = $1; } | apply_directive { $$ = $1; } | clear_directive { $$ = $1; } | constant_directive { $$ = $1; } | echo_directive { $$ = $1; } | except_directive { $$ = $1; } | fragment_directive { $$ = $1; } | include_directive { $$ = $1; } | inline_directive { $$ = $1; } | insert_directive { $$ = $1; } | module_directive { $$ = $1; } | name_directive { $$ = $1; } | native_directive { $$ = $1; } | pragma_directive { $$ = $1; } | rename_directive { $$ = $1; } | feature_directive { $$ = $1; } | varargs_directive { $$ = $1; } | typemap_directive { $$ = $1; } | types_directive { $$ = $1; } | template_directive { $$ = $1; } | warn_directive { $$ = $1; } ; /* ------------------------------------------------------------ %extend classname { ... } ------------------------------------------------------------ */ extend_directive : EXTEND options classkeyopt idcolon LBRACE { Node *cls; String *clsname; extendmode = 1; cplus_mode = CPLUS_PUBLIC; if (!classes) classes = NewHash(); if (!classes_typedefs) classes_typedefs = NewHash(); clsname = make_class_name($4); cls = Getattr(classes,clsname); if (!cls) { cls = Getattr(classes_typedefs, clsname); if (!cls) { /* No previous definition. Create a new scope */ Node *am = Getattr(Swig_extend_hash(),clsname); if (!am) { Swig_symbol_newscope(); Swig_symbol_setscopename($4); prev_symtab = 0; } else { prev_symtab = Swig_symbol_setscope(Getattr(am,"symtab")); } current_class = 0; } else { /* Previous typedef class definition. Use its symbol table. Deprecated, just the real name should be used. Note that %extend before the class typedef never worked, only %extend after the class typdef. */ prev_symtab = Swig_symbol_setscope(Getattr(cls, "symtab")); current_class = cls; SWIG_WARN_NODE_BEGIN(cls); Swig_warning(WARN_PARSE_EXTEND_NAME, cparse_file, cparse_line, "Deprecated %%extend name used - the %s name '%s' should be used instead of the typedef name '%s'.\n", Getattr(cls, "kind"), SwigType_namestr(Getattr(cls, "name")), $4); SWIG_WARN_NODE_END(cls); } } else { /* Previous class definition. Use its symbol table */ prev_symtab = Swig_symbol_setscope(Getattr(cls,"symtab")); current_class = cls; } Classprefix = NewString($4); Namespaceprefix= Swig_symbol_qualifiedscopename(0); Delete(clsname); } cpp_members RBRACE { String *clsname; extendmode = 0; $$ = new_node("extend"); Setattr($$,"symtab",Swig_symbol_popscope()); if (prev_symtab) { Swig_symbol_setscope(prev_symtab); } Namespaceprefix = Swig_symbol_qualifiedscopename(0); clsname = make_class_name($4); Setattr($$,"name",clsname); mark_nodes_as_extend($7); if (current_class) { /* We add the extension to the previously defined class */ appendChild($$, $7); appendChild(current_class,$$); } else { /* We store the extensions in the extensions hash */ Node *am = Getattr(Swig_extend_hash(),clsname); if (am) { /* Append the members to the previous extend methods */ appendChild(am, $7); } else { appendChild($$, $7); Setattr(Swig_extend_hash(),clsname,$$); } } current_class = 0; Delete(Classprefix); Delete(clsname); Classprefix = 0; prev_symtab = 0; $$ = 0; } ; /* ------------------------------------------------------------ %apply ------------------------------------------------------------ */ apply_directive : APPLY typemap_parm LBRACE tm_list RBRACE { $$ = new_node("apply"); Setattr($$,"pattern",Getattr($2,"pattern")); appendChild($$,$4); }; /* ------------------------------------------------------------ %clear ------------------------------------------------------------ */ clear_directive : CLEAR tm_list SEMI { $$ = new_node("clear"); appendChild($$,$2); } ; /* ------------------------------------------------------------ %constant name = value; %constant type name = value; ------------------------------------------------------------ */ constant_directive : CONSTANT identifier EQUAL definetype SEMI { if (($4.type != T_ERROR) && ($4.type != T_SYMBOL)) { SwigType *type = NewSwigType($4.type); $$ = new_node("constant"); Setattr($$,"name",$2); Setattr($$,"type",type); Setattr($$,"value",$4.val); if ($4.rawval) Setattr($$,"rawval", $4.rawval); Setattr($$,"storage","%constant"); SetFlag($$,"feature:immutable"); add_symbols($$); Delete(type); } else { if ($4.type == T_ERROR) { Swig_warning(WARN_PARSE_UNSUPPORTED_VALUE,cparse_file,cparse_line,"Unsupported constant value (ignored)\n"); } $$ = 0; } } | CONSTANT type declarator def_args SEMI { if (($4.type != T_ERROR) && ($4.type != T_SYMBOL)) { SwigType_push($2,$3.type); /* Sneaky callback function trick */ if (SwigType_isfunction($2)) { SwigType_add_pointer($2); } $$ = new_node("constant"); Setattr($$,"name",$3.id); Setattr($$,"type",$2); Setattr($$,"value",$4.val); if ($4.rawval) Setattr($$,"rawval", $4.rawval); Setattr($$,"storage","%constant"); SetFlag($$,"feature:immutable"); add_symbols($$); } else { if ($4.type == T_ERROR) { Swig_warning(WARN_PARSE_UNSUPPORTED_VALUE,cparse_file,cparse_line,"Unsupported constant value\n"); } $$ = 0; } } | CONSTANT error SEMI { Swig_warning(WARN_PARSE_BAD_VALUE,cparse_file,cparse_line,"Bad constant value (ignored).\n"); $$ = 0; } ; /* ------------------------------------------------------------ %echo "text" %echo %{ ... %} ------------------------------------------------------------ */ echo_directive : ECHO HBLOCK { char temp[64]; Replace($2,"$file",cparse_file, DOH_REPLACE_ANY); sprintf(temp,"%d", cparse_line); Replace($2,"$line",temp,DOH_REPLACE_ANY); Printf(stderr,"%s\n", $2); Delete($2); $$ = 0; } | ECHO string { char temp[64]; String *s = $2; Replace(s,"$file",cparse_file, DOH_REPLACE_ANY); sprintf(temp,"%d", cparse_line); Replace(s,"$line",temp,DOH_REPLACE_ANY); Printf(stderr,"%s\n", s); Delete(s); $$ = 0; } ; /* ------------------------------------------------------------ %except(lang) { ... } %except { ... } %except(lang); %except; ------------------------------------------------------------ */ except_directive : EXCEPT LPAREN identifier RPAREN LBRACE { skip_balanced('{','}'); $$ = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } | EXCEPT LBRACE { skip_balanced('{','}'); $$ = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } | EXCEPT LPAREN identifier RPAREN SEMI { $$ = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } | EXCEPT SEMI { $$ = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } ; /* fragment keyword arguments */ stringtype : string LBRACE parm RBRACE { $$ = NewHash(); Setattr($$,"value",$1); Setattr($$,"type",Getattr($3,"type")); } ; fname : string { $$ = NewHash(); Setattr($$,"value",$1); } | stringtype { $$ = $1; } ; /* ------------------------------------------------------------ %fragment(name, section) %{ ... %} %fragment("name" {type}, "section") %{ ... %} %fragment("name", "section", fragment="fragment1", fragment="fragment2") %{ ... %} Also as above but using { ... } %fragment("name"); ------------------------------------------------------------ */ fragment_directive: FRAGMENT LPAREN fname COMMA kwargs RPAREN HBLOCK { Hash *p = $5; $$ = new_node("fragment"); Setattr($$,"value",Getattr($3,"value")); Setattr($$,"type",Getattr($3,"type")); Setattr($$,"section",Getattr(p,"name")); Setattr($$,"kwargs",nextSibling(p)); Setattr($$,"code",$7); } | FRAGMENT LPAREN fname COMMA kwargs RPAREN LBRACE { Hash *p = $5; String *code; skip_balanced('{','}'); $$ = new_node("fragment"); Setattr($$,"value",Getattr($3,"value")); Setattr($$,"type",Getattr($3,"type")); Setattr($$,"section",Getattr(p,"name")); Setattr($$,"kwargs",nextSibling(p)); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } | FRAGMENT LPAREN fname RPAREN SEMI { $$ = new_node("fragment"); Setattr($$,"value",Getattr($3,"value")); Setattr($$,"type",Getattr($3,"type")); Setattr($$,"emitonly","1"); } ; /* ------------------------------------------------------------ %includefile(option1="xyz", ...) "filename" [ declarations ] %importfile(option1="xyz", ...) "filename" [ declarations ] ------------------------------------------------------------ */ include_directive: includetype options string BEGINFILE { $1.filename = Copy(cparse_file); $1.line = cparse_line; scanner_set_location($3,1); if ($2) { String *maininput = Getattr($2, "maininput"); if (maininput) scanner_set_main_input_file(NewString(maininput)); } } interface ENDOFFILE { String *mname = 0; $$ = $6; scanner_set_location($1.filename,$1.line+1); if (strcmp($1.type,"include") == 0) set_nodeType($$,"include"); if (strcmp($1.type,"import") == 0) { mname = $2 ? Getattr($2,"module") : 0; set_nodeType($$,"import"); if (import_mode) --import_mode; } Setattr($$,"name",$3); /* Search for the module (if any) */ { Node *n = firstChild($$); while (n) { if (Strcmp(nodeType(n),"module") == 0) { if (mname) { Setattr(n,"name", mname); mname = 0; } Setattr($$,"module",Getattr(n,"name")); break; } n = nextSibling(n); } if (mname) { /* There is no module node in the import node, ie, you imported a .h file directly. We are forced then to create a new import node with a module node. */ Node *nint = new_node("import"); Node *mnode = new_node("module"); Setattr(mnode,"name", mname); Setattr(mnode,"options",$2); appendChild(nint,mnode); Delete(mnode); appendChild(nint,firstChild($$)); $$ = nint; Setattr($$,"module",mname); } } Setattr($$,"options",$2); } ; includetype : INCLUDE { $$.type = "include"; } | IMPORT { $$.type = "import"; ++import_mode;} ; /* ------------------------------------------------------------ %inline %{ ... %} ------------------------------------------------------------ */ inline_directive : INLINE HBLOCK { String *cpps; if (Namespaceprefix) { Swig_error(cparse_file, cparse_start_line, "%%inline directive inside a namespace is disallowed.\n"); $$ = 0; } else { $$ = new_node("insert"); Setattr($$,"code",$2); /* Need to run through the preprocessor */ Seek($2,0,SEEK_SET); Setline($2,cparse_start_line); Setfile($2,cparse_file); cpps = Preprocessor_parse($2); start_inline(Char(cpps), cparse_start_line); Delete($2); Delete(cpps); } } | INLINE LBRACE { String *cpps; int start_line = cparse_line; skip_balanced('{','}'); if (Namespaceprefix) { Swig_error(cparse_file, cparse_start_line, "%%inline directive inside a namespace is disallowed.\n"); $$ = 0; } else { String *code; $$ = new_node("insert"); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); code = Copy(scanner_ccode); Setattr($$,"code", code); Delete(code); cpps=Copy(scanner_ccode); start_inline(Char(cpps), start_line); Delete(cpps); } } ; /* ------------------------------------------------------------ %{ ... %} %insert(section) "filename" %insert("section") "filename" %insert(section) %{ ... %} %insert("section") %{ ... %} ------------------------------------------------------------ */ insert_directive : HBLOCK { $$ = new_node("insert"); Setattr($$,"code",$1); } | INSERT LPAREN idstring RPAREN string { String *code = NewStringEmpty(); $$ = new_node("insert"); Setattr($$,"section",$3); Setattr($$,"code",code); if (Swig_insert_file($5,code) < 0) { Swig_error(cparse_file, cparse_line, "Couldn't find '%s'.\n", $5); $$ = 0; } } | INSERT LPAREN idstring RPAREN HBLOCK { $$ = new_node("insert"); Setattr($$,"section",$3); Setattr($$,"code",$5); } | INSERT LPAREN idstring RPAREN LBRACE { String *code; skip_balanced('{','}'); $$ = new_node("insert"); Setattr($$,"section",$3); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); code = Copy(scanner_ccode); Setattr($$,"code", code); Delete(code); } ; /* ------------------------------------------------------------ %module modname %module "modname" ------------------------------------------------------------ */ module_directive: MODULE options idstring { $$ = new_node("module"); if ($2) { Setattr($$,"options",$2); if (Getattr($2,"directors")) { Wrapper_director_mode_set(1); if (!cparse_cplusplus) { Swig_error(cparse_file, cparse_line, "Directors are not supported for C code and require the -c++ option\n"); } } if (Getattr($2,"dirprot")) { Wrapper_director_protected_mode_set(1); } if (Getattr($2,"allprotected")) { Wrapper_all_protected_mode_set(1); } if (Getattr($2,"templatereduce")) { template_reduce = 1; } if (Getattr($2,"notemplatereduce")) { template_reduce = 0; } } if (!ModuleName) ModuleName = NewString($3); if (!import_mode) { /* first module included, we apply global ModuleName, which can be modify by -module */ String *mname = Copy(ModuleName); Setattr($$,"name",mname); Delete(mname); } else { /* import mode, we just pass the idstring */ Setattr($$,"name",$3); } if (!module_node) module_node = $$; } ; /* ------------------------------------------------------------ %name(newname) declaration %name("newname") declaration ------------------------------------------------------------ */ name_directive : NAME LPAREN idstring RPAREN { Swig_warning(WARN_DEPRECATED_NAME,cparse_file,cparse_line, "%%name is deprecated. Use %%rename instead.\n"); Delete(yyrename); yyrename = NewString($3); $$ = 0; } | NAME LPAREN RPAREN { Swig_warning(WARN_DEPRECATED_NAME,cparse_file,cparse_line, "%%name is deprecated. Use %%rename instead.\n"); $$ = 0; Swig_error(cparse_file,cparse_line,"Missing argument to %%name directive.\n"); } ; /* ------------------------------------------------------------ %native(scriptname) name; %native(scriptname) type name (parms); ------------------------------------------------------------ */ native_directive : NATIVE LPAREN identifier RPAREN storage_class identifier SEMI { $$ = new_node("native"); Setattr($$,"name",$3); Setattr($$,"wrap:name",$6); add_symbols($$); } | NATIVE LPAREN identifier RPAREN storage_class type declarator SEMI { if (!SwigType_isfunction($7.type)) { Swig_error(cparse_file,cparse_line,"%%native declaration '%s' is not a function.\n", $7.id); $$ = 0; } else { Delete(SwigType_pop_function($7.type)); /* Need check for function here */ SwigType_push($6,$7.type); $$ = new_node("native"); Setattr($$,"name",$3); Setattr($$,"wrap:name",$7.id); Setattr($$,"type",$6); Setattr($$,"parms",$7.parms); Setattr($$,"decl",$7.type); } add_symbols($$); } ; /* ------------------------------------------------------------ %pragma(lang) name=value %pragma(lang) name %pragma name = value %pragma name ------------------------------------------------------------ */ pragma_directive : PRAGMA pragma_lang identifier EQUAL pragma_arg { $$ = new_node("pragma"); Setattr($$,"lang",$2); Setattr($$,"name",$3); Setattr($$,"value",$5); } | PRAGMA pragma_lang identifier { $$ = new_node("pragma"); Setattr($$,"lang",$2); Setattr($$,"name",$3); } ; pragma_arg : string { $$ = $1; } | HBLOCK { $$ = $1; } ; pragma_lang : LPAREN identifier RPAREN { $$ = $2; } | empty { $$ = (char *) "swig"; } ; /* ------------------------------------------------------------ %rename(newname) identifier; ------------------------------------------------------------ */ rename_directive : rename_namewarn declarator idstring SEMI { SwigType *t = $2.type; Hash *kws = NewHash(); String *fixname; fixname = feature_identifier_fix($2.id); Setattr(kws,"name",$3); if (!Len(t)) t = 0; /* Special declarator check */ if (t) { if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ($1) { Swig_name_rename_add(Namespaceprefix, nname,decl,kws,$2.parms); } else { Swig_name_namewarn_add(Namespaceprefix,nname,decl,kws); } Delete(nname); } else { if ($1) { Swig_name_rename_add(Namespaceprefix,(fixname),decl,kws,$2.parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),decl,kws); } } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ($1) { Swig_name_rename_add(Namespaceprefix,(nname),0,kws,$2.parms); } else { Swig_name_namewarn_add(Namespaceprefix,(nname),0,kws); } Delete(nname); } } else { if ($1) { Swig_name_rename_add(Namespaceprefix,(fixname),0,kws,$2.parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),0,kws); } } $$ = 0; scanner_clear_rename(); } | rename_namewarn LPAREN kwargs RPAREN declarator cpp_const SEMI { String *fixname; Hash *kws = $3; SwigType *t = $5.type; fixname = feature_identifier_fix($5.id); if (!Len(t)) t = 0; /* Special declarator check */ if (t) { if ($6.qualifier) SwigType_push(t,$6.qualifier); if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ($1) { Swig_name_rename_add(Namespaceprefix, nname,decl,kws,$5.parms); } else { Swig_name_namewarn_add(Namespaceprefix,nname,decl,kws); } Delete(nname); } else { if ($1) { Swig_name_rename_add(Namespaceprefix,(fixname),decl,kws,$5.parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),decl,kws); } } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ($1) { Swig_name_rename_add(Namespaceprefix,(nname),0,kws,$5.parms); } else { Swig_name_namewarn_add(Namespaceprefix,(nname),0,kws); } Delete(nname); } } else { if ($1) { Swig_name_rename_add(Namespaceprefix,(fixname),0,kws,$5.parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),0,kws); } } $$ = 0; scanner_clear_rename(); } | rename_namewarn LPAREN kwargs RPAREN string SEMI { if ($1) { Swig_name_rename_add(Namespaceprefix,$5,0,$3,0); } else { Swig_name_namewarn_add(Namespaceprefix,$5,0,$3); } $$ = 0; scanner_clear_rename(); } ; rename_namewarn : RENAME { $$ = 1; } | NAMEWARN { $$ = 0; }; /* ------------------------------------------------------------ Feature targeting a symbol name (non-global feature): %feature(featurename) name "val"; %feature(featurename, val) name; where "val" could instead be the other bracket types, that is, { val } or %{ val %} or indeed omitted whereupon it defaults to "1". Or, the global feature which does not target a symbol name: %feature(featurename) "val"; %feature(featurename, val); An empty val (empty string) clears the feature. Any number of feature attributes can optionally be added, for example a non-global feature with 2 attributes: %feature(featurename, attrib1="attribval1", attrib2="attribval2") name "val"; %feature(featurename, val, attrib1="attribval1", attrib2="attribval2") name; ------------------------------------------------------------ */ /* Non-global feature */ feature_directive : FEATURE LPAREN idstring RPAREN declarator cpp_const stringbracesemi { String *val = $7 ? NewString($7) : NewString("1"); new_feature($3, val, 0, $5.id, $5.type, $5.parms, $6.qualifier); $$ = 0; scanner_clear_rename(); } | FEATURE LPAREN idstring COMMA stringnum RPAREN declarator cpp_const SEMI { String *val = Len($5) ? $5 : 0; new_feature($3, val, 0, $7.id, $7.type, $7.parms, $8.qualifier); $$ = 0; scanner_clear_rename(); } | FEATURE LPAREN idstring featattr RPAREN declarator cpp_const stringbracesemi { String *val = $8 ? NewString($8) : NewString("1"); new_feature($3, val, $4, $6.id, $6.type, $6.parms, $7.qualifier); $$ = 0; scanner_clear_rename(); } | FEATURE LPAREN idstring COMMA stringnum featattr RPAREN declarator cpp_const SEMI { String *val = Len($5) ? $5 : 0; new_feature($3, val, $6, $8.id, $8.type, $8.parms, $9.qualifier); $$ = 0; scanner_clear_rename(); } /* Global feature */ | FEATURE LPAREN idstring RPAREN stringbracesemi { String *val = $5 ? NewString($5) : NewString("1"); new_feature($3, val, 0, 0, 0, 0, 0); $$ = 0; scanner_clear_rename(); } | FEATURE LPAREN idstring COMMA stringnum RPAREN SEMI { String *val = Len($5) ? $5 : 0; new_feature($3, val, 0, 0, 0, 0, 0); $$ = 0; scanner_clear_rename(); } | FEATURE LPAREN idstring featattr RPAREN stringbracesemi { String *val = $6 ? NewString($6) : NewString("1"); new_feature($3, val, $4, 0, 0, 0, 0); $$ = 0; scanner_clear_rename(); } | FEATURE LPAREN idstring COMMA stringnum featattr RPAREN SEMI { String *val = Len($5) ? $5 : 0; new_feature($3, val, $6, 0, 0, 0, 0); $$ = 0; scanner_clear_rename(); } ; stringbracesemi : stringbrace { $$ = $1; } | SEMI { $$ = 0; } | PARMS LPAREN parms RPAREN SEMI { $$ = $3; } ; featattr : COMMA idstring EQUAL stringnum { $$ = NewHash(); Setattr($$,"name",$2); Setattr($$,"value",$4); } | COMMA idstring EQUAL stringnum featattr { $$ = NewHash(); Setattr($$,"name",$2); Setattr($$,"value",$4); set_nextSibling($$,$5); } ; /* %varargs() directive. */ varargs_directive : VARARGS LPAREN varargs_parms RPAREN declarator cpp_const SEMI { Parm *val; String *name; SwigType *t; if (Namespaceprefix) name = NewStringf("%s::%s", Namespaceprefix, $5.id); else name = NewString($5.id); val = $3; if ($5.parms) { Setmeta(val,"parms",$5.parms); } t = $5.type; if (!Len(t)) t = 0; if (t) { if ($6.qualifier) SwigType_push(t,$6.qualifier); if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(), nname, decl, "feature:varargs", val, 0); Delete(nname); } else { Swig_feature_set(Swig_cparse_features(), name, decl, "feature:varargs", val, 0); } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(),nname,0,"feature:varargs",val, 0); Delete(nname); } } else { Swig_feature_set(Swig_cparse_features(),name,0,"feature:varargs",val, 0); } Delete(name); $$ = 0; }; varargs_parms : parms { $$ = $1; } | NUM_INT COMMA parm { int i; int n; Parm *p; n = atoi(Char($1.val)); if (n <= 0) { Swig_error(cparse_file, cparse_line,"Argument count in %%varargs must be positive.\n"); $$ = 0; } else { String *name = Getattr($3, "name"); $$ = Copy($3); if (name) Setattr($$, "name", NewStringf("%s%d", name, n)); for (i = 1; i < n; i++) { p = Copy($3); name = Getattr(p, "name"); if (name) Setattr(p, "name", NewStringf("%s%d", name, n-i)); set_nextSibling(p,$$); Delete($$); $$ = p; } } } ; /* ------------------------------------------------------------ %typemap(method) type { ... } %typemap(method) type "..." %typemap(method) type; - typemap deletion %typemap(method) type1,type2,... = type; - typemap copy %typemap type1,type2,... = type; - typemap copy ------------------------------------------------------------ */ typemap_directive : TYPEMAP LPAREN typemap_type RPAREN tm_list stringbrace { $$ = 0; if ($3.method) { String *code = 0; $$ = new_node("typemap"); Setattr($$,"method",$3.method); if ($3.kwargs) { ParmList *kw = $3.kwargs; code = remove_block(kw, $6); Setattr($$,"kwargs", $3.kwargs); } code = code ? code : NewString($6); Setattr($$,"code", code); Delete(code); appendChild($$,$5); } } | TYPEMAP LPAREN typemap_type RPAREN tm_list SEMI { $$ = 0; if ($3.method) { $$ = new_node("typemap"); Setattr($$,"method",$3.method); appendChild($$,$5); } } | TYPEMAP LPAREN typemap_type RPAREN tm_list EQUAL typemap_parm SEMI { $$ = 0; if ($3.method) { $$ = new_node("typemapcopy"); Setattr($$,"method",$3.method); Setattr($$,"pattern", Getattr($7,"pattern")); appendChild($$,$5); } } ; /* typemap method type (lang,method) or (method) */ typemap_type : kwargs { Hash *p; String *name; p = nextSibling($1); if (p && (!Getattr(p,"value"))) { /* this is the deprecated two argument typemap form */ Swig_warning(WARN_DEPRECATED_TYPEMAP_LANG,cparse_file, cparse_line, "Specifying the language name in %%typemap is deprecated - use #ifdef SWIG instead.\n"); /* two argument typemap form */ name = Getattr($1,"name"); if (!name || (Strcmp(name,typemap_lang))) { $$.method = 0; $$.kwargs = 0; } else { $$.method = Getattr(p,"name"); $$.kwargs = nextSibling(p); } } else { /* one-argument typemap-form */ $$.method = Getattr($1,"name"); $$.kwargs = p; } } ; tm_list : typemap_parm tm_tail { $$ = $1; set_nextSibling($$,$2); } ; tm_tail : COMMA typemap_parm tm_tail { $$ = $2; set_nextSibling($$,$3); } | empty { $$ = 0;} ; typemap_parm : type plain_declarator { Parm *parm; SwigType_push($1,$2.type); $$ = new_node("typemapitem"); parm = NewParmWithoutFileLineInfo($1,$2.id); Setattr($$,"pattern",parm); Setattr($$,"parms", $2.parms); Delete(parm); /* $$ = NewParmWithoutFileLineInfo($1,$2.id); Setattr($$,"parms",$2.parms); */ } | LPAREN parms RPAREN { $$ = new_node("typemapitem"); Setattr($$,"pattern",$2); /* Setattr($$,"multitype",$2); */ } | LPAREN parms RPAREN LPAREN parms RPAREN { $$ = new_node("typemapitem"); Setattr($$,"pattern", $2); /* Setattr($$,"multitype",$2); */ Setattr($$,"parms",$5); } ; /* ------------------------------------------------------------ %types(parmlist); %types(parmlist) %{ ... %} ------------------------------------------------------------ */ types_directive : TYPES LPAREN parms RPAREN stringbracesemi { $$ = new_node("types"); Setattr($$,"parms",$3); if ($5) Setattr($$,"convcode",NewString($5)); } ; /* ------------------------------------------------------------ %template(name) tname; ------------------------------------------------------------ */ template_directive: SWIGTEMPLATE LPAREN idstringopt RPAREN idcolonnt LESSTHAN valparms GREATERTHAN SEMI { Parm *p, *tp; Node *n; Node *outer_class = currentOuterClass; Symtab *tscope = 0; int specialized = 0; int variadic = 0; $$ = 0; tscope = Swig_symbol_current(); /* Get the current scope */ /* If the class name is qualified, we need to create or lookup namespace entries */ if (!inclass) { $5 = resolve_create_node_scope($5); } if (nscope_inner && Strcmp(nodeType(nscope_inner), "class") == 0) { outer_class = nscope_inner; } /* We use the new namespace entry 'nscope' only to emit the template node. The template parameters are resolved in the current 'tscope'. This is closer to the C++ (typedef) behavior. */ n = Swig_cparse_template_locate($5,$7,tscope); /* Patch the argument types to respect namespaces */ p = $7; while (p) { SwigType *value = Getattr(p,"value"); if (!value) { SwigType *ty = Getattr(p,"type"); if (ty) { SwigType *rty = 0; int reduce = template_reduce; if (reduce || !SwigType_ispointer(ty)) { rty = Swig_symbol_typedef_reduce(ty,tscope); if (!reduce) reduce = SwigType_ispointer(rty); } ty = reduce ? Swig_symbol_type_qualify(rty,tscope) : Swig_symbol_type_qualify(ty,tscope); Setattr(p,"type",ty); Delete(ty); Delete(rty); } } else { value = Swig_symbol_type_qualify(value,tscope); Setattr(p,"value",value); Delete(value); } p = nextSibling(p); } /* Look for the template */ { Node *nn = n; Node *linklistend = 0; Node *linkliststart = 0; while (nn) { Node *templnode = 0; if (Strcmp(nodeType(nn),"template") == 0) { int nnisclass = (Strcmp(Getattr(nn,"templatetype"),"class") == 0); /* if not a templated class it is a templated function */ Parm *tparms = Getattr(nn,"templateparms"); if (!tparms) { specialized = 1; } else if (Getattr(tparms,"variadic") && strncmp(Char(Getattr(tparms,"variadic")), "1", 1)==0) { variadic = 1; } if (nnisclass && !variadic && !specialized && (ParmList_len($7) > ParmList_len(tparms))) { Swig_error(cparse_file, cparse_line, "Too many template parameters. Maximum of %d.\n", ParmList_len(tparms)); } else if (nnisclass && !specialized && ((ParmList_len($7) < (ParmList_numrequired(tparms) - (variadic?1:0))))) { /* Variadic parameter is optional */ Swig_error(cparse_file, cparse_line, "Not enough template parameters specified. %d required.\n", (ParmList_numrequired(tparms)-(variadic?1:0)) ); } else if (!nnisclass && ((ParmList_len($7) != ParmList_len(tparms)))) { /* must be an overloaded templated method - ignore it as it is overloaded with a different number of template parameters */ nn = Getattr(nn,"sym:nextSibling"); /* repeat for overloaded templated functions */ continue; } else { String *tname = Copy($5); int def_supplied = 0; /* Expand the template */ Node *templ = Swig_symbol_clookup($5,0); Parm *targs = templ ? Getattr(templ,"templateparms") : 0; ParmList *temparms; if (specialized) temparms = CopyParmList($7); else temparms = CopyParmList(tparms); /* Create typedef's and arguments */ p = $7; tp = temparms; if (!p && ParmList_len(p) != ParmList_len(temparms)) { /* we have no template parameters supplied in %template for a template that has default args*/ p = tp; def_supplied = 1; } while (p) { String *value = Getattr(p,"value"); if (def_supplied) { Setattr(p,"default","1"); } if (value) { Setattr(tp,"value",value); } else { SwigType *ty = Getattr(p,"type"); if (ty) { Setattr(tp,"type",ty); } Delattr(tp,"value"); } /* fix default arg values */ if (targs) { Parm *pi = temparms; Parm *ti = targs; String *tv = Getattr(tp,"value"); if (!tv) tv = Getattr(tp,"type"); while(pi != tp && ti && pi) { String *name = Getattr(ti,"name"); String *value = Getattr(pi,"value"); if (!value) value = Getattr(pi,"type"); Replaceid(tv, name, value); pi = nextSibling(pi); ti = nextSibling(ti); } } p = nextSibling(p); tp = nextSibling(tp); if (!p && tp) { p = tp; def_supplied = 1; } else if (p && !tp) { /* Variadic template - tp < p */ SWIG_WARN_NODE_BEGIN(nn); Swig_warning(WARN_CPP11_VARIADIC_TEMPLATE,cparse_file, cparse_line,"Only the first variadic template argument is currently supported.\n"); SWIG_WARN_NODE_END(nn); break; } } templnode = copy_node(nn); update_nested_classes(templnode); /* update classes nested within template */ /* We need to set the node name based on name used to instantiate */ Setattr(templnode,"name",tname); Delete(tname); if (!specialized) { Delattr(templnode,"sym:typename"); } else { Setattr(templnode,"sym:typename","1"); } /* for now, nested %template is allowed only in the same scope as the template declaration */ if ($3 && !(nnisclass && ((outer_class && (outer_class != Getattr(nn, "nested:outer"))) ||(extendmode && current_class && (current_class != Getattr(nn, "nested:outer")))))) { /* Comment this out for 1.3.28. We need to re-enable it later but first we need to move %ignore from using %rename to use %feature(ignore). String *symname = Swig_name_make(templnode,0,$3,0,0); */ String *symname = NewString($3); Swig_cparse_template_expand(templnode,symname,temparms,tscope); Setattr(templnode,"sym:name",symname); } else { static int cnt = 0; String *nname = NewStringf("__dummy_%d__", cnt++); Swig_cparse_template_expand(templnode,nname,temparms,tscope); Setattr(templnode,"sym:name",nname); Delete(nname); Setattr(templnode,"feature:onlychildren", "typemap,typemapitem,typemapcopy,typedef,types,fragment"); if ($3) { Swig_warning(WARN_PARSE_NESTED_TEMPLATE, cparse_file, cparse_line, "Named nested template instantiations not supported. Processing as if no name was given to %%template().\n"); } } Delattr(templnode,"templatetype"); Setattr(templnode,"template",nn); Setfile(templnode,cparse_file); Setline(templnode,cparse_line); Delete(temparms); if (outer_class && nnisclass) { SetFlag(templnode, "nested"); Setattr(templnode, "nested:outer", outer_class); } add_symbols_copy(templnode); if (Strcmp(nodeType(templnode),"class") == 0) { /* Identify pure abstract methods */ Setattr(templnode,"abstracts", pure_abstracts(firstChild(templnode))); /* Set up inheritance in symbol table */ { Symtab *csyms; List *baselist = Getattr(templnode,"baselist"); csyms = Swig_symbol_current(); Swig_symbol_setscope(Getattr(templnode,"symtab")); if (baselist) { List *bases = Swig_make_inherit_list(Getattr(templnode,"name"),baselist, Namespaceprefix); if (bases) { Iterator s; for (s = First(bases); s.item; s = Next(s)) { Symtab *st = Getattr(s.item,"symtab"); if (st) { Setfile(st,Getfile(s.item)); Setline(st,Getline(s.item)); Swig_symbol_inherit(st); } } Delete(bases); } } Swig_symbol_setscope(csyms); } /* Merge in %extend methods for this class. This only merges methods within %extend for a template specialized class such as template class K {}; %extend K { ... } The copy_node() call above has already added in the generic %extend methods such as template class K {}; %extend K { ... } */ /* !!! This may be broken. We may have to add the %extend methods at the beginning of the class */ { String *stmp = 0; String *clsname; Node *am; if (Namespaceprefix) { clsname = stmp = NewStringf("%s::%s", Namespaceprefix, Getattr(templnode,"name")); } else { clsname = Getattr(templnode,"name"); } am = Getattr(Swig_extend_hash(),clsname); if (am) { Symtab *st = Swig_symbol_current(); Swig_symbol_setscope(Getattr(templnode,"symtab")); /* Printf(stdout,"%s: %s %p %p\n", Getattr(templnode,"name"), clsname, Swig_symbol_current(), Getattr(templnode,"symtab")); */ Swig_extend_merge(templnode,am); Swig_symbol_setscope(st); Swig_extend_append_previous(templnode,am); Delattr(Swig_extend_hash(),clsname); } if (stmp) Delete(stmp); } /* Add to classes hash */ if (!classes) classes = NewHash(); if (Namespaceprefix) { String *temp = NewStringf("%s::%s", Namespaceprefix, Getattr(templnode,"name")); Setattr(classes,temp,templnode); Delete(temp); } else { String *qs = Swig_symbol_qualifiedscopename(templnode); Setattr(classes, qs,templnode); Delete(qs); } } } /* all the overloaded templated functions are added into a linked list */ if (!linkliststart) linkliststart = templnode; if (nscope_inner) { /* non-global namespace */ if (templnode) { appendChild(nscope_inner,templnode); Delete(templnode); if (nscope) $$ = nscope; } } else { /* global namespace */ if (!linklistend) { $$ = templnode; } else { set_nextSibling(linklistend,templnode); Delete(templnode); } linklistend = templnode; } } nn = Getattr(nn,"sym:nextSibling"); /* repeat for overloaded templated functions. If a templated class there will never be a sibling. */ } update_defaultargs(linkliststart); } Swig_symbol_setscope(tscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } ; /* ------------------------------------------------------------ %warn "text" %warn(no) ------------------------------------------------------------ */ warn_directive : WARN string { Swig_warning(0,cparse_file, cparse_line,"%s\n", $2); $$ = 0; } ; /* ====================================================================== * C Parsing * ====================================================================== */ c_declaration : c_decl { $$ = $1; if ($$) { add_symbols($$); default_arguments($$); } } | c_enum_decl { $$ = $1; } | c_enum_forward_decl { $$ = $1; } /* An extern C type declaration, disable cparse_cplusplus if needed. */ | EXTERN string LBRACE { if (Strcmp($2,"C") == 0) { cparse_externc = 1; } } interface RBRACE { cparse_externc = 0; if (Strcmp($2,"C") == 0) { Node *n = firstChild($5); $$ = new_node("extern"); Setattr($$,"name",$2); appendChild($$,n); while (n) { SwigType *decl = Getattr(n,"decl"); if (SwigType_isfunction(decl) && !Equal(Getattr(n, "storage"), "typedef")) { Setattr(n,"storage","externc"); } n = nextSibling(n); } } else { Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\".\n", $2); $$ = new_node("extern"); Setattr($$,"name",$2); appendChild($$,firstChild($5)); } } | cpp_lambda_decl { $$ = $1; SWIG_WARN_NODE_BEGIN($$); Swig_warning(WARN_CPP11_LAMBDA, cparse_file, cparse_line, "Lambda expressions and closures are not fully supported yet.\n"); SWIG_WARN_NODE_END($$); } | USING idcolon EQUAL type plain_declarator SEMI { /* Convert using statement to a typedef statement */ $$ = new_node("cdecl"); Setattr($$,"type",$4); Setattr($$,"storage","typedef"); Setattr($$,"name",$2); Setattr($$,"decl",$5.type); SetFlag($$,"typealias"); add_symbols($$); } | TEMPLATE LESSTHAN template_parms GREATERTHAN USING idcolon EQUAL type plain_declarator SEMI { /* Convert alias template to a "template" typedef statement */ $$ = new_node("template"); Setattr($$,"type",$8); Setattr($$,"storage","typedef"); Setattr($$,"name",$6); Setattr($$,"decl",$9.type); Setattr($$,"templateparms",$3); Setattr($$,"templatetype","cdecl"); SetFlag($$,"aliastemplate"); add_symbols($$); } ; /* ------------------------------------------------------------ A C global declaration of some kind (may be variable, function, typedef, etc.) ------------------------------------------------------------ */ c_decl : storage_class type declarator initializer c_decl_tail { $$ = new_node("cdecl"); if ($4.qualifier) SwigType_push($3.type,$4.qualifier); Setattr($$,"type",$2); Setattr($$,"storage",$1); Setattr($$,"name",$3.id); Setattr($$,"decl",$3.type); Setattr($$,"parms",$3.parms); Setattr($$,"value",$4.val); Setattr($$,"throws",$4.throws); Setattr($$,"throw",$4.throwf); Setattr($$,"noexcept",$4.nexcept); if ($4.val && $4.type) { /* store initializer type as it might be different to the declared type */ SwigType *valuetype = NewSwigType($4.type); if (Len(valuetype) > 0) Setattr($$,"valuetype",valuetype); else Delete(valuetype); } if (!$5) { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } } else { Node *n = $5; /* Inherit attributes */ while (n) { String *type = Copy($2); Setattr(n,"type",type); Setattr(n,"storage",$1); n = nextSibling(n); Delete(type); } } if ($4.bitfield) { Setattr($$,"bitfield", $4.bitfield); } /* Look for "::" declarations (ignored) */ if (Strstr($3.id,"::")) { /* This is a special case. If the scope name of the declaration exactly matches that of the declaration, then we will allow it. Otherwise, delete. */ String *p = Swig_scopename_prefix($3.id); if (p) { if ((Namespaceprefix && Strcmp(p, Namespaceprefix) == 0) || (Classprefix && Strcmp(p, Classprefix) == 0)) { String *lstr = Swig_scopename_last($3.id); Setattr($$,"name",lstr); Delete(lstr); set_nextSibling($$,$5); } else { Delete($$); $$ = $5; } Delete(p); } else { Delete($$); $$ = $5; } } else { set_nextSibling($$,$5); } } /* Alternate function syntax introduced in C++11: auto funcName(int x, int y) -> int; */ | storage_class AUTO declarator ARROW cpp_alternate_rettype initializer c_decl_tail { $$ = new_node("cdecl"); if ($6.qualifier) SwigType_push($3.type,$6.qualifier); Setattr($$,"type",$5); Setattr($$,"storage",$1); Setattr($$,"name",$3.id); Setattr($$,"decl",$3.type); Setattr($$,"parms",$3.parms); Setattr($$,"value",$6.val); Setattr($$,"throws",$6.throws); Setattr($$,"throw",$6.throwf); Setattr($$,"noexcept",$6.nexcept); if (!$7) { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } } else { Node *n = $7; while (n) { String *type = Copy($5); Setattr(n,"type",type); Setattr(n,"storage",$1); n = nextSibling(n); Delete(type); } } if ($6.bitfield) { Setattr($$,"bitfield", $6.bitfield); } if (Strstr($3.id,"::")) { String *p = Swig_scopename_prefix($3.id); if (p) { if ((Namespaceprefix && Strcmp(p, Namespaceprefix) == 0) || (Classprefix && Strcmp(p, Classprefix) == 0)) { String *lstr = Swig_scopename_last($3.id); Setattr($$,"name",lstr); Delete(lstr); set_nextSibling($$,$7); } else { Delete($$); $$ = $7; } Delete(p); } else { Delete($$); $$ = $7; } } else { set_nextSibling($$,$7); } } ; /* Allow lists of variables and functions to be built up */ c_decl_tail : SEMI { $$ = 0; Clear(scanner_ccode); } | COMMA declarator initializer c_decl_tail { $$ = new_node("cdecl"); if ($3.qualifier) SwigType_push($2.type,$3.qualifier); Setattr($$,"name",$2.id); Setattr($$,"decl",$2.type); Setattr($$,"parms",$2.parms); Setattr($$,"value",$3.val); Setattr($$,"throws",$3.throws); Setattr($$,"throw",$3.throwf); Setattr($$,"noexcept",$3.nexcept); if ($3.bitfield) { Setattr($$,"bitfield", $3.bitfield); } if (!$4) { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } } else { set_nextSibling($$,$4); } } | LBRACE { skip_balanced('{','}'); $$ = 0; } | error { $$ = 0; if (yychar == RPAREN) { Swig_error(cparse_file, cparse_line, "Unexpected ')'.\n"); } else { Swig_error(cparse_file, cparse_line, "Syntax error - possibly a missing semicolon.\n"); } exit(1); } ; initializer : def_args { $$ = $1; $$.qualifier = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | type_qualifier def_args { $$ = $2; $$.qualifier = $1; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | exception_specification def_args { $$ = $2; $$.qualifier = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } | type_qualifier exception_specification def_args { $$ = $3; $$.qualifier = $1; $$.throws = $2.throws; $$.throwf = $2.throwf; $$.nexcept = $2.nexcept; } ; cpp_alternate_rettype : primitive_type { $$ = $1; } | TYPE_BOOL { $$ = $1; } | TYPE_VOID { $$ = $1; } /* | TYPE_TYPEDEF template_decl { $$ = NewStringf("%s%s",$1,$2); } */ | TYPE_RAW { $$ = $1; } | idcolon { $$ = $1; } | decltype { $$ = $1; } ; /* ------------------------------------------------------------ Lambda functions and expressions, such as: auto myFunc = [] { return something; }; auto myFunc = [](int x, int y) { return x+y; }; auto myFunc = [](int x, int y) -> int { return x+y; }; auto myFunc = [](int x, int y) throw() -> int { return x+y; }; auto six = [](int x, int y) { return x+y; }(4, 2); ------------------------------------------------------------ */ cpp_lambda_decl : storage_class AUTO idcolon EQUAL lambda_introducer LPAREN parms RPAREN cpp_const lambda_body lambda_tail { $$ = new_node("lambda"); Setattr($$,"name",$3); add_symbols($$); } | storage_class AUTO idcolon EQUAL lambda_introducer LPAREN parms RPAREN cpp_const ARROW type lambda_body lambda_tail { $$ = new_node("lambda"); Setattr($$,"name",$3); add_symbols($$); } | storage_class AUTO idcolon EQUAL lambda_introducer lambda_body lambda_tail { $$ = new_node("lambda"); Setattr($$,"name",$3); add_symbols($$); } ; lambda_introducer : LBRACKET { skip_balanced('[',']'); $$ = 0; } ; lambda_body : LBRACE { skip_balanced('{','}'); $$ = 0; } lambda_tail : SEMI { $$ = 0; } | LPAREN { skip_balanced('(',')'); } SEMI { $$ = 0; } ; /* ------------------------------------------------------------ enum or enum class ------------------------------------------------------------ */ c_enum_key : ENUM { $$ = (char *)"enum"; } | ENUM CLASS { $$ = (char *)"enum class"; } | ENUM STRUCT { $$ = (char *)"enum struct"; } ; /* ------------------------------------------------------------ base enum type (eg. unsigned short) ------------------------------------------------------------ */ c_enum_inherit : COLON type_right { $$ = $2; } | empty { $$ = 0; } ; /* ------------------------------------------------------------ enum [class] Name; enum [class] Name [: base_type]; ------------------------------------------------------------ */ c_enum_forward_decl : storage_class c_enum_key ename c_enum_inherit SEMI { SwigType *ty = 0; int scopedenum = $3 && !Equal($2, "enum"); $$ = new_node("enumforward"); ty = NewStringf("enum %s", $3); Setattr($$,"enumkey",$2); if (scopedenum) SetFlag($$, "scopedenum"); Setattr($$,"name",$3); Setattr($$,"inherit",$4); Setattr($$,"type",ty); Setattr($$,"sym:weak", "1"); add_symbols($$); } ; /* ------------------------------------------------------------ enum [class] Name [: base_type] { ... }; or enum [class] Name [: base_type] { ... } MyEnum [= ...]; * ------------------------------------------------------------ */ c_enum_decl : storage_class c_enum_key ename c_enum_inherit LBRACE enumlist RBRACE SEMI { SwigType *ty = 0; int scopedenum = $3 && !Equal($2, "enum"); $$ = new_node("enum"); ty = NewStringf("enum %s", $3); Setattr($$,"enumkey",$2); if (scopedenum) SetFlag($$, "scopedenum"); Setattr($$,"name",$3); Setattr($$,"inherit",$4); Setattr($$,"type",ty); appendChild($$,$6); add_symbols($$); /* Add to tag space */ if (scopedenum) { Swig_symbol_newscope(); Swig_symbol_setscopename($3); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } add_symbols($6); /* Add enum values to appropriate enum or enum class scope */ if (scopedenum) { Setattr($$,"symtab", Swig_symbol_popscope()); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } } | storage_class c_enum_key ename c_enum_inherit LBRACE enumlist RBRACE declarator initializer c_decl_tail { Node *n; SwigType *ty = 0; String *unnamed = 0; int unnamedinstance = 0; int scopedenum = $3 && !Equal($2, "enum"); $$ = new_node("enum"); Setattr($$,"enumkey",$2); if (scopedenum) SetFlag($$, "scopedenum"); Setattr($$,"inherit",$4); if ($3) { Setattr($$,"name",$3); ty = NewStringf("enum %s", $3); } else if ($8.id) { unnamed = make_unnamed(); ty = NewStringf("enum %s", unnamed); Setattr($$,"unnamed",unnamed); /* name is not set for unnamed enum instances, e.g. enum { foo } Instance; */ if ($1 && Cmp($1,"typedef") == 0) { Setattr($$,"name",$8.id); } else { unnamedinstance = 1; } Setattr($$,"storage",$1); } if ($8.id && Cmp($1,"typedef") == 0) { Setattr($$,"tdname",$8.id); Setattr($$,"allows_typedef","1"); } appendChild($$,$6); n = new_node("cdecl"); Setattr(n,"type",ty); Setattr(n,"name",$8.id); Setattr(n,"storage",$1); Setattr(n,"decl",$8.type); Setattr(n,"parms",$8.parms); Setattr(n,"unnamed",unnamed); if (unnamedinstance) { SwigType *cty = NewString("enum "); Setattr($$,"type",cty); SetFlag($$,"unnamedinstance"); SetFlag(n,"unnamedinstance"); Delete(cty); } if ($10) { Node *p = $10; set_nextSibling(n,p); while (p) { SwigType *cty = Copy(ty); Setattr(p,"type",cty); Setattr(p,"unnamed",unnamed); Setattr(p,"storage",$1); Delete(cty); p = nextSibling(p); } } else { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr(n,"code",code); Delete(code); } } /* Ensure that typedef enum ABC {foo} XYZ; uses XYZ for sym:name, like structs. * Note that class_rename/yyrename are bit of a mess so used this simple approach to change the name. */ if ($8.id && $3 && Cmp($1,"typedef") == 0) { String *name = NewString($8.id); Setattr($$, "parser:makename", name); Delete(name); } add_symbols($$); /* Add enum to tag space */ set_nextSibling($$,n); Delete(n); if (scopedenum) { Swig_symbol_newscope(); Swig_symbol_setscopename($3); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } add_symbols($6); /* Add enum values to appropriate enum or enum class scope */ if (scopedenum) { Setattr($$,"symtab", Swig_symbol_popscope()); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } add_symbols(n); Delete(unnamed); } ; c_constructor_decl : storage_class type LPAREN parms RPAREN ctor_end { /* This is a sick hack. If the ctor_end has parameters, and the parms parameter only has 1 parameter, this could be a declaration of the form: type (id)(parms) Otherwise it's an error. */ int err = 0; $$ = 0; if ((ParmList_len($4) == 1) && (!Swig_scopename_check($2))) { SwigType *ty = Getattr($4,"type"); String *name = Getattr($4,"name"); err = 1; if (!name) { $$ = new_node("cdecl"); Setattr($$,"type",$2); Setattr($$,"storage",$1); Setattr($$,"name",ty); if ($6.have_parms) { SwigType *decl = NewStringEmpty(); SwigType_add_function(decl,$6.parms); Setattr($$,"decl",decl); Setattr($$,"parms",$6.parms); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } } if ($6.defarg) { Setattr($$,"value",$6.defarg); } Setattr($$,"throws",$6.throws); Setattr($$,"throw",$6.throwf); Setattr($$,"noexcept",$6.nexcept); err = 0; } } if (err) { Swig_error(cparse_file,cparse_line,"Syntax error in input(2).\n"); exit(1); } } ; /* ====================================================================== * C++ Support * ====================================================================== */ cpp_declaration : cpp_class_decl { $$ = $1; } | cpp_forward_class_decl { $$ = $1; } | cpp_template_decl { $$ = $1; } | cpp_using_decl { $$ = $1; } | cpp_namespace_decl { $$ = $1; } | cpp_catch_decl { $$ = 0; } ; /* A simple class/struct/union definition */ cpp_class_decl : storage_class cpptype idcolon inherit LBRACE { String *prefix; List *bases = 0; Node *scope = 0; String *code; $$ = new_node("class"); Setline($$,cparse_start_line); Setattr($$,"kind",$2); if ($4) { Setattr($$,"baselist", Getattr($4,"public")); Setattr($$,"protectedbaselist", Getattr($4,"protected")); Setattr($$,"privatebaselist", Getattr($4,"private")); } Setattr($$,"allows_typedef","1"); /* preserve the current scope */ Setattr($$,"prev_symtab",Swig_symbol_current()); /* If the class name is qualified. We need to create or lookup namespace/scope entries */ scope = resolve_create_node_scope($3); /* save nscope_inner to the class - it may be overwritten in nested classes*/ Setattr($$, "nested:innerscope", nscope_inner); Setattr($$, "nested:nscope", nscope); Setfile(scope,cparse_file); Setline(scope,cparse_line); $3 = scope; Setattr($$,"name",$3); if (currentOuterClass) { SetFlag($$, "nested"); Setattr($$, "nested:outer", currentOuterClass); set_access_mode($$); } Swig_features_get(Swig_cparse_features(), Namespaceprefix, Getattr($$, "name"), 0, $$); /* save yyrename to the class attribute, to be used later in add_symbols()*/ Setattr($$, "class_rename", make_name($$, $3, 0)); Setattr($$, "Classprefix", $3); Classprefix = NewString($3); /* Deal with inheritance */ if ($4) bases = Swig_make_inherit_list($3,Getattr($4,"public"),Namespaceprefix); prefix = SwigType_istemplate_templateprefix($3); if (prefix) { String *fbase, *tbase; if (Namespaceprefix) { fbase = NewStringf("%s::%s", Namespaceprefix,$3); tbase = NewStringf("%s::%s", Namespaceprefix, prefix); } else { fbase = Copy($3); tbase = Copy(prefix); } Swig_name_inherit(tbase,fbase); Delete(fbase); Delete(tbase); } if (strcmp($2,"class") == 0) { cplus_mode = CPLUS_PRIVATE; } else { cplus_mode = CPLUS_PUBLIC; } if (!cparse_cplusplus) { set_scope_to_global(); } Swig_symbol_newscope(); Swig_symbol_setscopename($3); Swig_inherit_base_symbols(bases); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); cparse_start_line = cparse_line; /* If there are active template parameters, we need to make sure they are placed in the class symbol table so we can catch shadows */ if (template_parameters) { Parm *tp = template_parameters; while(tp) { String *tpname = Copy(Getattr(tp,"name")); Node *tn = new_node("templateparm"); Setattr(tn,"name",tpname); Swig_symbol_cadd(tpname,tn); tp = nextSibling(tp); Delete(tpname); } } Delete(prefix); inclass = 1; currentOuterClass = $$; if (cparse_cplusplusout) { /* save the structure declaration to declare it in global scope for C++ to see */ code = get_raw_text_balanced('{', '}'); Setattr($$, "code", code); Delete(code); } } cpp_members RBRACE cpp_opt_declarators { Node *p; SwigType *ty; Symtab *cscope; Node *am = 0; String *scpname = 0; (void) $6; $$ = currentOuterClass; currentOuterClass = Getattr($$, "nested:outer"); nscope_inner = Getattr($$, "nested:innerscope"); nscope = Getattr($$, "nested:nscope"); Delattr($$, "nested:innerscope"); Delattr($$, "nested:nscope"); if (nscope_inner && Strcmp(nodeType(nscope_inner), "class") == 0) { /* actual parent class for this class */ Node* forward_declaration = Swig_symbol_clookup_no_inherit(Getattr($$,"name"), Getattr(nscope_inner, "symtab")); if (forward_declaration) { Setattr($$, "access", Getattr(forward_declaration, "access")); } Setattr($$, "nested:outer", nscope_inner); SetFlag($$, "nested"); } if (!currentOuterClass) inclass = 0; cscope = Getattr($$, "prev_symtab"); Delattr($$, "prev_symtab"); /* Check for pure-abstract class */ Setattr($$,"abstracts", pure_abstracts($7)); /* This bit of code merges in a previously defined %extend directive (if any) */ { String *clsname = Swig_symbol_qualifiedscopename(0); am = Getattr(Swig_extend_hash(), clsname); if (am) { Swig_extend_merge($$, am); Delattr(Swig_extend_hash(), clsname); } Delete(clsname); } if (!classes) classes = NewHash(); scpname = Swig_symbol_qualifiedscopename(0); Setattr(classes, scpname, $$); appendChild($$, $7); if (am) Swig_extend_append_previous($$, am); p = $9; if (p && !nscope_inner) { if (!cparse_cplusplus && currentOuterClass) appendChild(currentOuterClass, p); else appendSibling($$, p); } if (nscope_inner) { ty = NewString(scpname); /* if the class is declared out of scope, let the declarator use fully qualified type*/ } else if (cparse_cplusplus && !cparse_externc) { ty = NewString($3); } else { ty = NewStringf("%s %s", $2, $3); } while (p) { Setattr(p, "storage", $1); Setattr(p, "type" ,ty); if (!cparse_cplusplus && currentOuterClass && (!Getattr(currentOuterClass, "name"))) { SetFlag(p, "hasconsttype"); SetFlag(p, "feature:immutable"); } p = nextSibling(p); } if ($9 && Cmp($1,"typedef") == 0) add_typedef_name($$, $9, $3, cscope, scpname); Delete(scpname); if (cplus_mode != CPLUS_PUBLIC) { /* we 'open' the class at the end, to allow %template to add new members */ Node *pa = new_node("access"); Setattr(pa, "kind", "public"); cplus_mode = CPLUS_PUBLIC; appendChild($$, pa); Delete(pa); } if (currentOuterClass) restore_access_mode($$); Setattr($$, "symtab", Swig_symbol_popscope()); Classprefix = Getattr($$, "Classprefix"); Delattr($$, "Classprefix"); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (cplus_mode == CPLUS_PRIVATE) { $$ = 0; /* skip private nested classes */ } else if (cparse_cplusplus && currentOuterClass && ignore_nested_classes && !GetFlag($$, "feature:flatnested")) { $$ = nested_forward_declaration($1, $2, $3, Copy($3), $9); } else if (nscope_inner) { /* this is tricky */ /* we add the declaration in the original namespace */ if (Strcmp(nodeType(nscope_inner), "class") == 0 && cparse_cplusplus && ignore_nested_classes && !GetFlag($$, "feature:flatnested")) $$ = nested_forward_declaration($1, $2, $3, Copy($3), $9); appendChild(nscope_inner, $$); Swig_symbol_setscope(Getattr(nscope_inner, "symtab")); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); yyrename = Copy(Getattr($$, "class_rename")); add_symbols($$); Delattr($$, "class_rename"); /* but the variable definition in the current scope */ Swig_symbol_setscope(cscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($9); if (nscope) { $$ = nscope; /* here we return recreated namespace tower instead of the class itself */ if ($9) { appendSibling($$, $9); } } else if (!SwigType_istemplate(ty) && template_parameters == 0) { /* for tempalte we need the class itself */ $$ = $9; } } else { Delete(yyrename); yyrename = 0; if (!cparse_cplusplus && currentOuterClass) { /* nested C structs go into global scope*/ Node *outer = currentOuterClass; while (Getattr(outer, "nested:outer")) outer = Getattr(outer, "nested:outer"); appendSibling(outer, $$); add_symbols($9); set_scope_to_global(); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); yyrename = Copy(Getattr($$, "class_rename")); add_symbols($$); if (!cparse_cplusplusout) Delattr($$, "nested:outer"); Delattr($$, "class_rename"); $$ = 0; } else { yyrename = Copy(Getattr($$, "class_rename")); add_symbols($$); add_symbols($9); Delattr($$, "class_rename"); } } Delete(ty); Swig_symbol_setscope(cscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); Classprefix = currentOuterClass ? Getattr(currentOuterClass, "Classprefix") : 0; } /* An unnamed struct, possibly with a typedef */ | storage_class cpptype inherit LBRACE { String *unnamed; String *code; unnamed = make_unnamed(); $$ = new_node("class"); Setline($$,cparse_start_line); Setattr($$,"kind",$2); if ($3) { Setattr($$,"baselist", Getattr($3,"public")); Setattr($$,"protectedbaselist", Getattr($3,"protected")); Setattr($$,"privatebaselist", Getattr($3,"private")); } Setattr($$,"storage",$1); Setattr($$,"unnamed",unnamed); Setattr($$,"allows_typedef","1"); if (currentOuterClass) { SetFlag($$, "nested"); Setattr($$, "nested:outer", currentOuterClass); set_access_mode($$); } Swig_features_get(Swig_cparse_features(), Namespaceprefix, 0, 0, $$); /* save yyrename to the class attribute, to be used later in add_symbols()*/ Setattr($$, "class_rename", make_name($$,0,0)); if (strcmp($2,"class") == 0) { cplus_mode = CPLUS_PRIVATE; } else { cplus_mode = CPLUS_PUBLIC; } Swig_symbol_newscope(); cparse_start_line = cparse_line; currentOuterClass = $$; inclass = 1; Classprefix = 0; Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); /* save the structure declaration to make a typedef for it later*/ code = get_raw_text_balanced('{', '}'); Setattr($$, "code", code); Delete(code); } cpp_members RBRACE cpp_opt_declarators { String *unnamed; List *bases = 0; String *name = 0; Node *n; Classprefix = 0; (void)$5; $$ = currentOuterClass; currentOuterClass = Getattr($$, "nested:outer"); if (!currentOuterClass) inclass = 0; else restore_access_mode($$); unnamed = Getattr($$,"unnamed"); /* Check for pure-abstract class */ Setattr($$,"abstracts", pure_abstracts($6)); n = $8; if (cparse_cplusplus && currentOuterClass && ignore_nested_classes && !GetFlag($$, "feature:flatnested")) { String *name = n ? Copy(Getattr(n, "name")) : 0; $$ = nested_forward_declaration($1, $2, 0, name, n); Swig_symbol_popscope(); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } else if (n) { appendSibling($$,n); /* If a proper typedef name was given, we'll use it to set the scope name */ name = try_to_find_a_name_for_unnamed_structure($1, n); if (name) { String *scpname = 0; SwigType *ty; Setattr($$,"tdname",name); Setattr($$,"name",name); Swig_symbol_setscopename(name); if ($3) bases = Swig_make_inherit_list(name,Getattr($3,"public"),Namespaceprefix); Swig_inherit_base_symbols(bases); /* If a proper name was given, we use that as the typedef, not unnamed */ Clear(unnamed); Append(unnamed, name); if (cparse_cplusplus && !cparse_externc) { ty = NewString(name); } else { ty = NewStringf("%s %s", $2,name); } while (n) { Setattr(n,"storage",$1); Setattr(n, "type", ty); if (!cparse_cplusplus && currentOuterClass && (!Getattr(currentOuterClass, "name"))) { SetFlag(n,"hasconsttype"); SetFlag(n,"feature:immutable"); } n = nextSibling(n); } n = $8; /* Check for previous extensions */ { String *clsname = Swig_symbol_qualifiedscopename(0); Node *am = Getattr(Swig_extend_hash(),clsname); if (am) { /* Merge the extension into the symbol table */ Swig_extend_merge($$,am); Swig_extend_append_previous($$,am); Delattr(Swig_extend_hash(),clsname); } Delete(clsname); } if (!classes) classes = NewHash(); scpname = Swig_symbol_qualifiedscopename(0); Setattr(classes,scpname,$$); Delete(scpname); } else { /* no suitable name was found for a struct */ Setattr($$, "nested:unnamed", Getattr(n, "name")); /* save the name of the first declarator for later use in name generation*/ while (n) { /* attach unnamed struct to the declarators, so that they would receive proper type later*/ Setattr(n, "nested:unnamedtype", $$); Setattr(n, "storage", $1); n = nextSibling(n); } n = $8; Swig_symbol_setscopename(""); } appendChild($$,$6); /* Pop the scope */ Setattr($$,"symtab",Swig_symbol_popscope()); if (name) { Delete(yyrename); yyrename = Copy(Getattr($$, "class_rename")); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); add_symbols(n); Delattr($$, "class_rename"); }else if (cparse_cplusplus) $$ = 0; /* ignore unnamed structs for C++ */ Delete(unnamed); } else { /* unnamed struct w/o declarator*/ Swig_symbol_popscope(); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($6); Delete($$); $$ = $6; /* pass member list to outer class/namespace (instead of self)*/ } Classprefix = currentOuterClass ? Getattr(currentOuterClass, "Classprefix") : 0; } ; cpp_opt_declarators : SEMI { $$ = 0; } | declarator initializer c_decl_tail { $$ = new_node("cdecl"); Setattr($$,"name",$1.id); Setattr($$,"decl",$1.type); Setattr($$,"parms",$1.parms); set_nextSibling($$,$3); } ; /* ------------------------------------------------------------ class Name; ------------------------------------------------------------ */ cpp_forward_class_decl : storage_class cpptype idcolon SEMI { if ($1 && (Strcmp($1,"friend") == 0)) { /* Ignore */ $$ = 0; } else { $$ = new_node("classforward"); Setattr($$,"kind",$2); Setattr($$,"name",$3); Setattr($$,"sym:weak", "1"); add_symbols($$); } } ; /* ------------------------------------------------------------ template<...> decl ------------------------------------------------------------ */ cpp_template_decl : TEMPLATE LESSTHAN template_parms GREATERTHAN { if (currentOuterClass) Setattr(currentOuterClass, "template_parameters", template_parameters); template_parameters = $3; parsing_template_declaration = 1; } cpp_temp_possible { String *tname = 0; int error = 0; /* check if we get a namespace node with a class declaration, and retrieve the class */ Symtab *cscope = Swig_symbol_current(); Symtab *sti = 0; Node *ntop = $6; Node *ni = ntop; SwigType *ntype = ni ? nodeType(ni) : 0; while (ni && Strcmp(ntype,"namespace") == 0) { sti = Getattr(ni,"symtab"); ni = firstChild(ni); ntype = nodeType(ni); } if (sti) { Swig_symbol_setscope(sti); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); $6 = ni; } $$ = $6; if ($$) tname = Getattr($$,"name"); /* Check if the class is a template specialization */ if (($$) && (Strchr(tname,'<')) && (!is_operator(tname))) { /* If a specialization. Check if defined. */ Node *tempn = 0; { String *tbase = SwigType_templateprefix(tname); tempn = Swig_symbol_clookup_local(tbase,0); if (!tempn || (Strcmp(nodeType(tempn),"template") != 0)) { SWIG_WARN_NODE_BEGIN(tempn); Swig_warning(WARN_PARSE_TEMPLATE_SP_UNDEF, Getfile($$),Getline($$),"Specialization of non-template '%s'.\n", tbase); SWIG_WARN_NODE_END(tempn); tempn = 0; error = 1; } Delete(tbase); } Setattr($$,"specialization","1"); Setattr($$,"templatetype",nodeType($$)); set_nodeType($$,"template"); /* Template partial specialization */ if (tempn && ($3) && ($6)) { List *tlist; String *targs = SwigType_templateargs(tname); tlist = SwigType_parmlist(targs); /* Printf(stdout,"targs = '%s' %s\n", targs, tlist); */ if (!Getattr($$,"sym:weak")) { Setattr($$,"sym:typename","1"); } if (Len(tlist) != ParmList_len(Getattr(tempn,"templateparms"))) { Swig_error(Getfile($$),Getline($$),"Inconsistent argument count in template partial specialization. %d %d\n", Len(tlist), ParmList_len(Getattr(tempn,"templateparms"))); } else { /* This code builds the argument list for the partial template specialization. This is a little hairy, but the idea is as follows: $3 contains a list of arguments supplied for the template. For example template. tlist is a list of the specialization arguments--which may be different. For example class. tp is a copy of the arguments in the original template definition. The patching algorithm walks through the list of supplied arguments ($3), finds the position in the specialization arguments (tlist), and then patches the name in the argument list of the original template. */ { String *pn; Parm *p, *p1; int i, nargs; Parm *tp = CopyParmList(Getattr(tempn,"templateparms")); nargs = Len(tlist); p = $3; while (p) { for (i = 0; i < nargs; i++){ pn = Getattr(p,"name"); if (Strcmp(pn,SwigType_base(Getitem(tlist,i))) == 0) { int j; Parm *p1 = tp; for (j = 0; j < i; j++) { p1 = nextSibling(p1); } Setattr(p1,"name",pn); Setattr(p1,"partialarg","1"); } } p = nextSibling(p); } p1 = tp; i = 0; while (p1) { if (!Getattr(p1,"partialarg")) { Delattr(p1,"name"); Setattr(p1,"type", Getitem(tlist,i)); } i++; p1 = nextSibling(p1); } Setattr($$,"templateparms",tp); Delete(tp); } #if 0 /* Patch the parameter list */ if (tempn) { Parm *p,*p1; ParmList *tp = CopyParmList(Getattr(tempn,"templateparms")); p = $3; p1 = tp; while (p && p1) { String *pn = Getattr(p,"name"); Printf(stdout,"pn = '%s'\n", pn); if (pn) Setattr(p1,"name",pn); else Delattr(p1,"name"); pn = Getattr(p,"type"); if (pn) Setattr(p1,"type",pn); p = nextSibling(p); p1 = nextSibling(p1); } Setattr($$,"templateparms",tp); Delete(tp); } else { Setattr($$,"templateparms",$3); } #endif Delattr($$,"specialization"); Setattr($$,"partialspecialization","1"); /* Create a specialized name for matching */ { Parm *p = $3; String *fname = NewString(Getattr($$,"name")); String *ffname = 0; ParmList *partialparms = 0; char tmp[32]; int i, ilen; while (p) { String *n = Getattr(p,"name"); if (!n) { p = nextSibling(p); continue; } ilen = Len(tlist); for (i = 0; i < ilen; i++) { if (Strstr(Getitem(tlist,i),n)) { sprintf(tmp,"$%d",i+1); Replaceid(fname,n,tmp); } } p = nextSibling(p); } /* Patch argument names with typedef */ { Iterator tt; Parm *parm_current = 0; List *tparms = SwigType_parmlist(fname); ffname = SwigType_templateprefix(fname); Append(ffname,"<("); for (tt = First(tparms); tt.item; ) { SwigType *rtt = Swig_symbol_typedef_reduce(tt.item,0); SwigType *ttr = Swig_symbol_type_qualify(rtt,0); Parm *newp = NewParmWithoutFileLineInfo(ttr, 0); if (partialparms) set_nextSibling(parm_current, newp); else partialparms = newp; parm_current = newp; Append(ffname,ttr); tt = Next(tt); if (tt.item) Putc(',',ffname); Delete(rtt); Delete(ttr); } Delete(tparms); Append(ffname,")>"); } { Node *new_partial = NewHash(); String *partials = Getattr(tempn,"partials"); if (!partials) { partials = NewList(); Setattr(tempn,"partials",partials); Delete(partials); } /* Printf(stdout,"partial: fname = '%s', '%s'\n", fname, Swig_symbol_typedef_reduce(fname,0)); */ Setattr(new_partial, "partialparms", partialparms); Setattr(new_partial, "templcsymname", ffname); Append(partials, new_partial); } Setattr($$,"partialargs",ffname); Swig_symbol_cadd(ffname,$$); } } Delete(tlist); Delete(targs); } else { /* An explicit template specialization */ /* add default args from primary (unspecialized) template */ String *ty = Swig_symbol_template_deftype(tname,0); String *fname = Swig_symbol_type_qualify(ty,0); Swig_symbol_cadd(fname,$$); Delete(ty); Delete(fname); } } else if ($$) { Setattr($$,"templatetype",nodeType($6)); set_nodeType($$,"template"); Setattr($$,"templateparms", $3); if (!Getattr($$,"sym:weak")) { Setattr($$,"sym:typename","1"); } add_symbols($$); default_arguments($$); /* We also place a fully parameterized version in the symbol table */ { Parm *p; String *fname = NewStringf("%s<(", Getattr($$,"name")); p = $3; while (p) { String *n = Getattr(p,"name"); if (!n) n = Getattr(p,"type"); Append(fname,n); p = nextSibling(p); if (p) Putc(',',fname); } Append(fname,")>"); Swig_symbol_cadd(fname,$$); } } $$ = ntop; Swig_symbol_setscope(cscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (error || (nscope_inner && Strcmp(nodeType(nscope_inner), "class") == 0)) { $$ = 0; } if (currentOuterClass) template_parameters = Getattr(currentOuterClass, "template_parameters"); else template_parameters = 0; parsing_template_declaration = 0; } /* Explicit template instantiation */ | TEMPLATE cpptype idcolon { Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit template instantiation ignored.\n"); $$ = 0; } /* Explicit template instantiation without the translation unit */ | EXTERN TEMPLATE cpptype idcolon { Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit template instantiation ignored.\n"); $$ = 0; } ; cpp_temp_possible: c_decl { $$ = $1; } | cpp_class_decl { $$ = $1; } | cpp_constructor_decl { $$ = $1; } | cpp_static_assert { $$ = $1; } | cpp_template_decl { $$ = 0; } | cpp_forward_class_decl { $$ = $1; } | cpp_conversion_operator { $$ = $1; } ; template_parms : templateparameters { /* Rip out the parameter names */ Parm *p = $1; $$ = $1; while (p) { String *name = Getattr(p,"name"); if (!name) { /* Hmmm. Maybe it's a 'class T' parameter */ char *type = Char(Getattr(p,"type")); /* Template template parameter */ if (strncmp(type,"template ",16) == 0) { type += 16; } if ((strncmp(type,"class ",6) == 0) || (strncmp(type,"typename ", 9) == 0)) { char *t = strchr(type,' '); Setattr(p,"name", t+1); } else /* Variadic template args */ if ((strncmp(type,"class... ",9) == 0) || (strncmp(type,"typename... ", 12) == 0)) { char *t = strchr(type,' '); Setattr(p,"name", t+1); Setattr(p,"variadic", "1"); } else { /* Swig_error(cparse_file, cparse_line, "Missing template parameter name\n"); $$.rparms = 0; $$.parms = 0; break; */ } } p = nextSibling(p); } } ; templateparameters : templateparameter templateparameterstail { set_nextSibling($1,$2); $$ = $1; } | empty { $$ = 0; } ; templateparameter : templcpptype { $$ = NewParmWithoutFileLineInfo(NewString($1), 0); } | parm { $$ = $1; } ; templateparameterstail : COMMA templateparameter templateparameterstail { set_nextSibling($2,$3); $$ = $2; } | empty { $$ = 0; } ; /* Namespace support */ cpp_using_decl : USING idcolon SEMI { String *uname = Swig_symbol_type_qualify($2,0); String *name = Swig_scopename_last($2); $$ = new_node("using"); Setattr($$,"uname",uname); Setattr($$,"name", name); Delete(uname); Delete(name); add_symbols($$); } | USING NAMESPACE idcolon SEMI { Node *n = Swig_symbol_clookup($3,0); if (!n) { Swig_error(cparse_file, cparse_line, "Nothing known about namespace '%s'\n", $3); $$ = 0; } else { while (Strcmp(nodeType(n),"using") == 0) { n = Getattr(n,"node"); } if (n) { if (Strcmp(nodeType(n),"namespace") == 0) { Symtab *current = Swig_symbol_current(); Symtab *symtab = Getattr(n,"symtab"); $$ = new_node("using"); Setattr($$,"node",n); Setattr($$,"namespace", $3); if (current != symtab) { Swig_symbol_inherit(symtab); } } else { Swig_error(cparse_file, cparse_line, "'%s' is not a namespace.\n", $3); $$ = 0; } } else { $$ = 0; } } } ; cpp_namespace_decl : NAMESPACE idcolon LBRACE { Hash *h; $1 = Swig_symbol_current(); h = Swig_symbol_clookup($2,0); if (h && ($1 == Getattr(h,"sym:symtab")) && (Strcmp(nodeType(h),"namespace") == 0)) { if (Getattr(h,"alias")) { h = Getattr(h,"namespace"); Swig_warning(WARN_PARSE_NAMESPACE_ALIAS, cparse_file, cparse_line, "Namespace alias '%s' not allowed here. Assuming '%s'\n", $2, Getattr(h,"name")); $2 = Getattr(h,"name"); } Swig_symbol_setscope(Getattr(h,"symtab")); } else { Swig_symbol_newscope(); Swig_symbol_setscopename($2); } Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } interface RBRACE { Node *n = $5; set_nodeType(n,"namespace"); Setattr(n,"name",$2); Setattr(n,"symtab", Swig_symbol_popscope()); Swig_symbol_setscope($1); $$ = n; Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); } | NAMESPACE LBRACE { Hash *h; $1 = Swig_symbol_current(); h = Swig_symbol_clookup(" ",0); if (h && (Strcmp(nodeType(h),"namespace") == 0)) { Swig_symbol_setscope(Getattr(h,"symtab")); } else { Swig_symbol_newscope(); /* we don't use "__unnamed__", but a long 'empty' name */ Swig_symbol_setscopename(" "); } Namespaceprefix = 0; } interface RBRACE { $$ = $4; set_nodeType($$,"namespace"); Setattr($$,"unnamed","1"); Setattr($$,"symtab", Swig_symbol_popscope()); Swig_symbol_setscope($1); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols($$); } | NAMESPACE identifier EQUAL idcolon SEMI { /* Namespace alias */ Node *n; $$ = new_node("namespace"); Setattr($$,"name",$2); Setattr($$,"alias",$4); n = Swig_symbol_clookup($4,0); if (!n) { Swig_error(cparse_file, cparse_line, "Unknown namespace '%s'\n", $4); $$ = 0; } else { if (Strcmp(nodeType(n),"namespace") != 0) { Swig_error(cparse_file, cparse_line, "'%s' is not a namespace\n",$4); $$ = 0; } else { while (Getattr(n,"alias")) { n = Getattr(n,"namespace"); } Setattr($$,"namespace",n); add_symbols($$); /* Set up a scope alias */ Swig_symbol_alias($2,Getattr(n,"symtab")); } } } ; cpp_members : cpp_member cpp_members { $$ = $1; /* Insert cpp_member (including any siblings) to the front of the cpp_members linked list */ if ($$) { Node *p = $$; Node *pp =0; while (p) { pp = p; p = nextSibling(p); } set_nextSibling(pp,$2); if ($2) set_previousSibling($2, pp); } else { $$ = $2; } } | EXTEND LBRACE { extendmode = 1; if (cplus_mode != CPLUS_PUBLIC) { Swig_error(cparse_file,cparse_line,"%%extend can only be used in a public section\n"); } } cpp_members RBRACE { extendmode = 0; } cpp_members { $$ = new_node("extend"); mark_nodes_as_extend($4); appendChild($$,$4); set_nextSibling($$,$7); } | include_directive { $$ = $1; } | empty { $$ = 0;} | error { int start_line = cparse_line; skip_decl(); Swig_error(cparse_file,start_line,"Syntax error in input(3).\n"); exit(1); } cpp_members { $$ = $3; } ; /* ====================================================================== * C++ Class members * ====================================================================== */ /* A class member. May be data or a function. Static or virtual as well */ cpp_member : c_declaration { $$ = $1; } | cpp_constructor_decl { $$ = $1; if (extendmode && current_class) { String *symname; symname= make_name($$,Getattr($$,"name"), Getattr($$,"decl")); if (Strcmp(symname,Getattr($$,"name")) == 0) { /* No renaming operation. Set name to class name */ Delete(yyrename); yyrename = NewString(Getattr(current_class,"sym:name")); } else { Delete(yyrename); yyrename = symname; } } add_symbols($$); default_arguments($$); } | cpp_destructor_decl { $$ = $1; } | cpp_static_assert { $$ = $1; } | cpp_protection_decl { $$ = $1; } | cpp_swig_directive { $$ = $1; } | cpp_conversion_operator { $$ = $1; } | cpp_forward_class_decl { $$ = $1; } | cpp_class_decl { $$ = $1; } | storage_class idcolon SEMI { $$ = 0; } | cpp_using_decl { $$ = $1; } | cpp_template_decl { $$ = $1; } | cpp_catch_decl { $$ = 0; } | template_directive { $$ = $1; } | warn_directive { $$ = $1; } | anonymous_bitfield { $$ = 0; } | fragment_directive {$$ = $1; } | types_directive {$$ = $1; } | SEMI { $$ = 0; } ; /* Possibly a constructor */ /* Note: the use of 'type' is here to resolve a shift-reduce conflict. For example: typedef Foo (); typedef Foo (*ptr)(); */ cpp_constructor_decl : storage_class type LPAREN parms RPAREN ctor_end { if (inclass || extendmode) { SwigType *decl = NewStringEmpty(); $$ = new_node("constructor"); Setattr($$,"storage",$1); Setattr($$,"name",$2); Setattr($$,"parms",$4); SwigType_add_function(decl,$4); Setattr($$,"decl",decl); Setattr($$,"throws",$6.throws); Setattr($$,"throw",$6.throwf); Setattr($$,"noexcept",$6.nexcept); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } SetFlag($$,"feature:new"); if ($6.defarg) Setattr($$,"value",$6.defarg); } else { $$ = 0; } } ; /* A destructor (hopefully) */ cpp_destructor_decl : NOT idtemplate LPAREN parms RPAREN cpp_end { String *name = NewStringf("%s",$2); if (*(Char(name)) != '~') Insert(name,0,"~"); $$ = new_node("destructor"); Setattr($$,"name",name); Delete(name); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } { String *decl = NewStringEmpty(); SwigType_add_function(decl,$4); Setattr($$,"decl",decl); Delete(decl); } Setattr($$,"throws",$6.throws); Setattr($$,"throw",$6.throwf); Setattr($$,"noexcept",$6.nexcept); if ($6.val) Setattr($$,"value",$6.val); add_symbols($$); } /* A virtual destructor */ | VIRTUAL NOT idtemplate LPAREN parms RPAREN cpp_vend { String *name; $$ = new_node("destructor"); Setattr($$,"storage","virtual"); name = NewStringf("%s",$3); if (*(Char(name)) != '~') Insert(name,0,"~"); Setattr($$,"name",name); Delete(name); Setattr($$,"throws",$7.throws); Setattr($$,"throw",$7.throwf); Setattr($$,"noexcept",$7.nexcept); if ($7.val) Setattr($$,"value",$7.val); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr($$,"code",code); Delete(code); } { String *decl = NewStringEmpty(); SwigType_add_function(decl,$5); Setattr($$,"decl",decl); Delete(decl); } add_symbols($$); } ; /* C++ type conversion operator */ cpp_conversion_operator : storage_class CONVERSIONOPERATOR type pointer LPAREN parms RPAREN cpp_vend { $$ = new_node("cdecl"); Setattr($$,"type",$3); Setattr($$,"name",$2); Setattr($$,"storage",$1); SwigType_add_function($4,$6); if ($8.qualifier) { SwigType_push($4,$8.qualifier); } Setattr($$,"decl",$4); Setattr($$,"parms",$6); Setattr($$,"conversion_operator","1"); add_symbols($$); } | storage_class CONVERSIONOPERATOR type AND LPAREN parms RPAREN cpp_vend { SwigType *decl; $$ = new_node("cdecl"); Setattr($$,"type",$3); Setattr($$,"name",$2); Setattr($$,"storage",$1); decl = NewStringEmpty(); SwigType_add_reference(decl); SwigType_add_function(decl,$6); if ($8.qualifier) { SwigType_push(decl,$8.qualifier); } Setattr($$,"decl",decl); Setattr($$,"parms",$6); Setattr($$,"conversion_operator","1"); add_symbols($$); } | storage_class CONVERSIONOPERATOR type LAND LPAREN parms RPAREN cpp_vend { SwigType *decl; $$ = new_node("cdecl"); Setattr($$,"type",$3); Setattr($$,"name",$2); Setattr($$,"storage",$1); decl = NewStringEmpty(); SwigType_add_rvalue_reference(decl); SwigType_add_function(decl,$6); if ($8.qualifier) { SwigType_push(decl,$8.qualifier); } Setattr($$,"decl",decl); Setattr($$,"parms",$6); Setattr($$,"conversion_operator","1"); add_symbols($$); } | storage_class CONVERSIONOPERATOR type pointer AND LPAREN parms RPAREN cpp_vend { SwigType *decl; $$ = new_node("cdecl"); Setattr($$,"type",$3); Setattr($$,"name",$2); Setattr($$,"storage",$1); decl = NewStringEmpty(); SwigType_add_pointer(decl); SwigType_add_reference(decl); SwigType_add_function(decl,$7); if ($9.qualifier) { SwigType_push(decl,$9.qualifier); } Setattr($$,"decl",decl); Setattr($$,"parms",$7); Setattr($$,"conversion_operator","1"); add_symbols($$); } | storage_class CONVERSIONOPERATOR type LPAREN parms RPAREN cpp_vend { String *t = NewStringEmpty(); $$ = new_node("cdecl"); Setattr($$,"type",$3); Setattr($$,"name",$2); Setattr($$,"storage",$1); SwigType_add_function(t,$5); if ($7.qualifier) { SwigType_push(t,$7.qualifier); } Setattr($$,"decl",t); Setattr($$,"parms",$5); Setattr($$,"conversion_operator","1"); add_symbols($$); } ; /* isolated catch clause. */ cpp_catch_decl : CATCH LPAREN parms RPAREN LBRACE { skip_balanced('{','}'); $$ = 0; } ; /* static_assert(bool, const char*); */ cpp_static_assert : STATIC_ASSERT LPAREN { skip_balanced('(',')'); $$ = 0; } ; /* public: */ cpp_protection_decl : PUBLIC COLON { $$ = new_node("access"); Setattr($$,"kind","public"); cplus_mode = CPLUS_PUBLIC; } /* private: */ | PRIVATE COLON { $$ = new_node("access"); Setattr($$,"kind","private"); cplus_mode = CPLUS_PRIVATE; } /* protected: */ | PROTECTED COLON { $$ = new_node("access"); Setattr($$,"kind","protected"); cplus_mode = CPLUS_PROTECTED; } ; /* These directives can be included inside a class definition */ cpp_swig_directive: pragma_directive { $$ = $1; } /* A constant (includes #defines) inside a class */ | constant_directive { $$ = $1; } /* This is the new style rename */ | name_directive { $$ = $1; } /* rename directive */ | rename_directive { $$ = $1; } | feature_directive { $$ = $1; } | varargs_directive { $$ = $1; } | insert_directive { $$ = $1; } | typemap_directive { $$ = $1; } | apply_directive { $$ = $1; } | clear_directive { $$ = $1; } | echo_directive { $$ = $1; } ; cpp_end : cpp_const SEMI { Clear(scanner_ccode); $$.val = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } | cpp_const EQUAL default_delete SEMI { Clear(scanner_ccode); $$.val = $3.val; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } | cpp_const LBRACE { skip_balanced('{','}'); $$.val = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } ; cpp_vend : cpp_const SEMI { Clear(scanner_ccode); $$.val = 0; $$.qualifier = $1.qualifier; $$.bitfield = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } | cpp_const EQUAL definetype SEMI { Clear(scanner_ccode); $$.val = $3.val; $$.qualifier = $1.qualifier; $$.bitfield = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } | cpp_const LBRACE { skip_balanced('{','}'); $$.val = 0; $$.qualifier = $1.qualifier; $$.bitfield = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } ; anonymous_bitfield : storage_class anon_bitfield_type COLON expr SEMI { }; /* Equals type_right without the ENUM keyword and cpptype (templates etc.): */ anon_bitfield_type : primitive_type { $$ = $1; /* Printf(stdout,"primitive = '%s'\n", $$);*/ } | TYPE_BOOL { $$ = $1; } | TYPE_VOID { $$ = $1; } /* | TYPE_TYPEDEF template_decl { $$ = NewStringf("%s%s",$1,$2); } */ | TYPE_RAW { $$ = $1; } | idcolon { $$ = $1; } ; /* ====================================================================== * PRIMITIVES * ====================================================================== */ extern_string : EXTERN string { if (Strcmp($2,"C") == 0) { $$ = "externc"; } else if (Strcmp($2,"C++") == 0) { $$ = "extern"; } else { Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\".\n", $2); $$ = 0; } } ; storage_class : EXTERN { $$ = "extern"; } | extern_string { $$ = $1; } | extern_string THREAD_LOCAL { $$ = "thread_local"; } | extern_string TYPEDEF { $$ = "typedef"; } | STATIC { $$ = "static"; } | TYPEDEF { $$ = "typedef"; } | VIRTUAL { $$ = "virtual"; } | FRIEND { $$ = "friend"; } | EXPLICIT { $$ = "explicit"; } | CONSTEXPR { $$ = "constexpr"; } | EXPLICIT CONSTEXPR { $$ = "explicit constexpr"; } | CONSTEXPR EXPLICIT { $$ = "explicit constexpr"; } | STATIC CONSTEXPR { $$ = "static constexpr"; } | CONSTEXPR STATIC { $$ = "static constexpr"; } | THREAD_LOCAL { $$ = "thread_local"; } | THREAD_LOCAL STATIC { $$ = "static thread_local"; } | STATIC THREAD_LOCAL { $$ = "static thread_local"; } | EXTERN THREAD_LOCAL { $$ = "extern thread_local"; } | THREAD_LOCAL EXTERN { $$ = "extern thread_local"; } | empty { $$ = 0; } ; /* ------------------------------------------------------------------------------ Function parameter lists ------------------------------------------------------------------------------ */ parms : rawparms { Parm *p; $$ = $1; p = $1; while (p) { Replace(Getattr(p,"type"),"typename ", "", DOH_REPLACE_ANY); p = nextSibling(p); } } ; rawparms : parm ptail { set_nextSibling($1,$2); $$ = $1; } | empty { $$ = 0; } ; ptail : COMMA parm ptail { set_nextSibling($2,$3); $$ = $2; } | empty { $$ = 0; } ; parm : rawtype parameter_declarator { SwigType_push($1,$2.type); $$ = NewParmWithoutFileLineInfo($1,$2.id); Setfile($$,cparse_file); Setline($$,cparse_line); if ($2.defarg) { Setattr($$,"value",$2.defarg); } } | TEMPLATE LESSTHAN cpptype GREATERTHAN cpptype idcolon def_args { $$ = NewParmWithoutFileLineInfo(NewStringf("template %s %s", $5,$6), 0); Setfile($$,cparse_file); Setline($$,cparse_line); if ($7.val) { Setattr($$,"value",$7.val); } } | PERIOD PERIOD PERIOD { SwigType *t = NewString("v(...)"); $$ = NewParmWithoutFileLineInfo(t, 0); Setfile($$,cparse_file); Setline($$,cparse_line); } ; valparms : rawvalparms { Parm *p; $$ = $1; p = $1; while (p) { if (Getattr(p,"type")) { Replace(Getattr(p,"type"),"typename ", "", DOH_REPLACE_ANY); } p = nextSibling(p); } } ; rawvalparms : valparm valptail { set_nextSibling($1,$2); $$ = $1; } | empty { $$ = 0; } ; valptail : COMMA valparm valptail { set_nextSibling($2,$3); $$ = $2; } | empty { $$ = 0; } ; valparm : parm { $$ = $1; { /* We need to make a possible adjustment for integer parameters. */ SwigType *type; Node *n = 0; while (!n) { type = Getattr($1,"type"); n = Swig_symbol_clookup(type,0); /* See if we can find a node that matches the typename */ if ((n) && (Strcmp(nodeType(n),"cdecl") == 0)) { SwigType *decl = Getattr(n,"decl"); if (!SwigType_isfunction(decl)) { String *value = Getattr(n,"value"); if (value) { String *v = Copy(value); Setattr($1,"type",v); Delete(v); n = 0; } } } else { break; } } } } | valexpr { $$ = NewParmWithoutFileLineInfo(0,0); Setfile($$,cparse_file); Setline($$,cparse_line); Setattr($$,"value",$1.val); } ; def_args : EQUAL definetype { $$ = $2; if ($2.type == T_ERROR) { Swig_warning(WARN_PARSE_BAD_DEFAULT,cparse_file, cparse_line, "Can't set default argument (ignored)\n"); $$.val = 0; $$.rawval = 0; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } } | EQUAL definetype LBRACKET expr RBRACKET { $$ = $2; if ($2.type == T_ERROR) { Swig_warning(WARN_PARSE_BAD_DEFAULT,cparse_file, cparse_line, "Can't set default argument (ignored)\n"); $$ = $2; $$.val = 0; $$.rawval = 0; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } else { $$.val = NewStringf("%s[%s]",$2.val,$4.val); } } | EQUAL LBRACE { skip_balanced('{','}'); $$.val = NewString(scanner_ccode); $$.rawval = 0; $$.type = T_INT; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | COLON expr { $$.val = 0; $$.rawval = 0; $$.type = 0; $$.bitfield = $2.val; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | empty { $$.val = 0; $$.rawval = 0; $$.type = T_INT; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } ; parameter_declarator : declarator def_args { $$ = $1; $$.defarg = $2.rawval ? $2.rawval : $2.val; } | abstract_declarator def_args { $$ = $1; $$.defarg = $2.rawval ? $2.rawval : $2.val; } | def_args { $$.type = 0; $$.id = 0; $$.defarg = $1.rawval ? $1.rawval : $1.val; } ; plain_declarator : declarator { $$ = $1; if (SwigType_isfunction($1.type)) { Delete(SwigType_pop_function($1.type)); } else if (SwigType_isarray($1.type)) { SwigType *ta = SwigType_pop_arrays($1.type); if (SwigType_isfunction($1.type)) { Delete(SwigType_pop_function($1.type)); } else { $$.parms = 0; } SwigType_push($1.type,ta); Delete(ta); } else { $$.parms = 0; } } | abstract_declarator { $$ = $1; if (SwigType_isfunction($1.type)) { Delete(SwigType_pop_function($1.type)); } else if (SwigType_isarray($1.type)) { SwigType *ta = SwigType_pop_arrays($1.type); if (SwigType_isfunction($1.type)) { Delete(SwigType_pop_function($1.type)); } else { $$.parms = 0; } SwigType_push($1.type,ta); Delete(ta); } else { $$.parms = 0; } } | empty { $$.type = 0; $$.id = 0; $$.parms = 0; } ; declarator : pointer notso_direct_declarator { $$ = $2; if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | pointer AND notso_direct_declarator { $$ = $3; SwigType_add_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | pointer LAND notso_direct_declarator { $$ = $3; SwigType_add_rvalue_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | direct_declarator { $$ = $1; if (!$$.type) $$.type = NewStringEmpty(); } | AND notso_direct_declarator { $$ = $2; $$.type = NewStringEmpty(); SwigType_add_reference($$.type); if ($2.type) { SwigType_push($$.type,$2.type); Delete($2.type); } } | LAND notso_direct_declarator { /* Introduced in C++11, move operator && */ /* Adds one S/R conflict */ $$ = $2; $$.type = NewStringEmpty(); SwigType_add_rvalue_reference($$.type); if ($2.type) { SwigType_push($$.type,$2.type); Delete($2.type); } } | idcolon DSTAR notso_direct_declarator { SwigType *t = NewStringEmpty(); $$ = $3; SwigType_add_memberpointer(t,$1); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | pointer idcolon DSTAR notso_direct_declarator { SwigType *t = NewStringEmpty(); $$ = $4; SwigType_add_memberpointer(t,$2); SwigType_push($1,t); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; Delete(t); } | pointer idcolon DSTAR AND notso_direct_declarator { $$ = $5; SwigType_add_memberpointer($1,$2); SwigType_add_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | idcolon DSTAR AND notso_direct_declarator { SwigType *t = NewStringEmpty(); $$ = $4; SwigType_add_memberpointer(t,$1); SwigType_add_reference(t); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } /* Variadic versions eg. MyClasses&... myIds */ | pointer PERIOD PERIOD PERIOD notso_direct_declarator { $$ = $5; if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | pointer AND PERIOD PERIOD PERIOD notso_direct_declarator { $$ = $6; SwigType_add_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | pointer LAND PERIOD PERIOD PERIOD notso_direct_declarator { $$ = $6; SwigType_add_rvalue_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | PERIOD PERIOD PERIOD direct_declarator { $$ = $4; if (!$$.type) $$.type = NewStringEmpty(); } | AND PERIOD PERIOD PERIOD notso_direct_declarator { $$ = $5; $$.type = NewStringEmpty(); SwigType_add_reference($$.type); if ($5.type) { SwigType_push($$.type,$5.type); Delete($5.type); } } | LAND PERIOD PERIOD PERIOD notso_direct_declarator { /* Introduced in C++11, move operator && */ /* Adds one S/R conflict */ $$ = $5; $$.type = NewStringEmpty(); SwigType_add_rvalue_reference($$.type); if ($5.type) { SwigType_push($$.type,$5.type); Delete($5.type); } } | idcolon DSTAR PERIOD PERIOD PERIOD notso_direct_declarator { SwigType *t = NewStringEmpty(); $$ = $6; SwigType_add_memberpointer(t,$1); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | pointer idcolon DSTAR PERIOD PERIOD PERIOD notso_direct_declarator { SwigType *t = NewStringEmpty(); $$ = $7; SwigType_add_memberpointer(t,$2); SwigType_push($1,t); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; Delete(t); } | pointer idcolon DSTAR AND PERIOD PERIOD PERIOD notso_direct_declarator { $$ = $8; SwigType_add_memberpointer($1,$2); SwigType_add_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | pointer idcolon DSTAR LAND PERIOD PERIOD PERIOD notso_direct_declarator { $$ = $8; SwigType_add_memberpointer($1,$2); SwigType_add_rvalue_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | idcolon DSTAR AND PERIOD PERIOD PERIOD notso_direct_declarator { SwigType *t = NewStringEmpty(); $$ = $7; SwigType_add_memberpointer(t,$1); SwigType_add_reference(t); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | idcolon DSTAR LAND PERIOD PERIOD PERIOD notso_direct_declarator { SwigType *t = NewStringEmpty(); $$ = $7; SwigType_add_memberpointer(t,$1); SwigType_add_rvalue_reference(t); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } ; notso_direct_declarator : idcolon { /* Note: This is non-standard C. Template declarator is allowed to follow an identifier */ $$.id = Char($1); $$.type = 0; $$.parms = 0; $$.have_parms = 0; } | NOT idcolon { $$.id = Char(NewStringf("~%s",$2)); $$.type = 0; $$.parms = 0; $$.have_parms = 0; } /* This generates a shift-reduce conflict with constructors */ | LPAREN idcolon RPAREN { $$.id = Char($2); $$.type = 0; $$.parms = 0; $$.have_parms = 0; } /* | LPAREN AND idcolon RPAREN { $$.id = Char($3); $$.type = 0; $$.parms = 0; $$.have_parms = 0; } */ /* Technically, this should be LPAREN declarator RPAREN, but we get reduce/reduce conflicts */ | LPAREN pointer notso_direct_declarator RPAREN { $$ = $3; if ($$.type) { SwigType_push($2,$$.type); Delete($$.type); } $$.type = $2; } | LPAREN idcolon DSTAR notso_direct_declarator RPAREN { SwigType *t; $$ = $4; t = NewStringEmpty(); SwigType_add_memberpointer(t,$2); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | notso_direct_declarator LBRACKET RBRACKET { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_array(t,""); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | notso_direct_declarator LBRACKET expr RBRACKET { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_array(t,$3.val); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | notso_direct_declarator LPAREN parms RPAREN { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_function(t,$3); if (!$$.have_parms) { $$.parms = $3; $$.have_parms = 1; } if (!$$.type) { $$.type = t; } else { SwigType_push(t, $$.type); Delete($$.type); $$.type = t; } } ; direct_declarator : idcolon { /* Note: This is non-standard C. Template declarator is allowed to follow an identifier */ $$.id = Char($1); $$.type = 0; $$.parms = 0; $$.have_parms = 0; } | NOT idcolon { $$.id = Char(NewStringf("~%s",$2)); $$.type = 0; $$.parms = 0; $$.have_parms = 0; } /* This generate a shift-reduce conflict with constructors */ /* | LPAREN idcolon RPAREN { $$.id = Char($2); $$.type = 0; $$.parms = 0; $$.have_parms = 0; } */ /* Technically, this should be LPAREN declarator RPAREN, but we get reduce/reduce conflicts */ | LPAREN pointer direct_declarator RPAREN { $$ = $3; if ($$.type) { SwigType_push($2,$$.type); Delete($$.type); } $$.type = $2; } | LPAREN AND direct_declarator RPAREN { $$ = $3; if (!$$.type) { $$.type = NewStringEmpty(); } SwigType_add_reference($$.type); } | LPAREN LAND direct_declarator RPAREN { $$ = $3; if (!$$.type) { $$.type = NewStringEmpty(); } SwigType_add_rvalue_reference($$.type); } | LPAREN idcolon DSTAR direct_declarator RPAREN { SwigType *t; $$ = $4; t = NewStringEmpty(); SwigType_add_memberpointer(t,$2); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | direct_declarator LBRACKET RBRACKET { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_array(t,""); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | direct_declarator LBRACKET expr RBRACKET { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_array(t,$3.val); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | direct_declarator LPAREN parms RPAREN { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_function(t,$3); if (!$$.have_parms) { $$.parms = $3; $$.have_parms = 1; } if (!$$.type) { $$.type = t; } else { SwigType_push(t, $$.type); Delete($$.type); $$.type = t; } } /* User-defined string literals. eg. int operator"" _mySuffix(const char* val, int length) {...} */ /* This produces one S/R conflict. */ | OPERATOR ID LPAREN parms RPAREN { SwigType *t; Append($1, " "); /* intervening space is mandatory */ Append($1, Char($2)); $$.id = Char($1); t = NewStringEmpty(); SwigType_add_function(t,$4); if (!$$.have_parms) { $$.parms = $4; $$.have_parms = 1; } if (!$$.type) { $$.type = t; } else { SwigType_push(t, $$.type); Delete($$.type); $$.type = t; } } ; abstract_declarator : pointer { $$.type = $1; $$.id = 0; $$.parms = 0; $$.have_parms = 0; } | pointer direct_abstract_declarator { $$ = $2; SwigType_push($1,$2.type); $$.type = $1; Delete($2.type); } | pointer AND { $$.type = $1; SwigType_add_reference($$.type); $$.id = 0; $$.parms = 0; $$.have_parms = 0; } | pointer LAND { $$.type = $1; SwigType_add_rvalue_reference($$.type); $$.id = 0; $$.parms = 0; $$.have_parms = 0; } | pointer AND direct_abstract_declarator { $$ = $3; SwigType_add_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | pointer LAND direct_abstract_declarator { $$ = $3; SwigType_add_rvalue_reference($1); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } | direct_abstract_declarator { $$ = $1; } | AND direct_abstract_declarator { $$ = $2; $$.type = NewStringEmpty(); SwigType_add_reference($$.type); if ($2.type) { SwigType_push($$.type,$2.type); Delete($2.type); } } | LAND direct_abstract_declarator { $$ = $2; $$.type = NewStringEmpty(); SwigType_add_rvalue_reference($$.type); if ($2.type) { SwigType_push($$.type,$2.type); Delete($2.type); } } | AND { $$.id = 0; $$.parms = 0; $$.have_parms = 0; $$.type = NewStringEmpty(); SwigType_add_reference($$.type); } | LAND { $$.id = 0; $$.parms = 0; $$.have_parms = 0; $$.type = NewStringEmpty(); SwigType_add_rvalue_reference($$.type); } | idcolon DSTAR { $$.type = NewStringEmpty(); SwigType_add_memberpointer($$.type,$1); $$.id = 0; $$.parms = 0; $$.have_parms = 0; } | pointer idcolon DSTAR { SwigType *t = NewStringEmpty(); $$.type = $1; $$.id = 0; $$.parms = 0; $$.have_parms = 0; SwigType_add_memberpointer(t,$2); SwigType_push($$.type,t); Delete(t); } | pointer idcolon DSTAR direct_abstract_declarator { $$ = $4; SwigType_add_memberpointer($1,$2); if ($$.type) { SwigType_push($1,$$.type); Delete($$.type); } $$.type = $1; } ; direct_abstract_declarator : direct_abstract_declarator LBRACKET RBRACKET { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_array(t,""); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | direct_abstract_declarator LBRACKET expr RBRACKET { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_array(t,$3.val); if ($$.type) { SwigType_push(t,$$.type); Delete($$.type); } $$.type = t; } | LBRACKET RBRACKET { $$.type = NewStringEmpty(); $$.id = 0; $$.parms = 0; $$.have_parms = 0; SwigType_add_array($$.type,""); } | LBRACKET expr RBRACKET { $$.type = NewStringEmpty(); $$.id = 0; $$.parms = 0; $$.have_parms = 0; SwigType_add_array($$.type,$2.val); } | LPAREN abstract_declarator RPAREN { $$ = $2; } | direct_abstract_declarator LPAREN parms RPAREN { SwigType *t; $$ = $1; t = NewStringEmpty(); SwigType_add_function(t,$3); if (!$$.type) { $$.type = t; } else { SwigType_push(t,$$.type); Delete($$.type); $$.type = t; } if (!$$.have_parms) { $$.parms = $3; $$.have_parms = 1; } } | LPAREN parms RPAREN { $$.type = NewStringEmpty(); SwigType_add_function($$.type,$2); $$.parms = $2; $$.have_parms = 1; $$.id = 0; } ; pointer : STAR type_qualifier pointer { $$ = NewStringEmpty(); SwigType_add_pointer($$); SwigType_push($$,$2); SwigType_push($$,$3); Delete($3); } | STAR pointer { $$ = NewStringEmpty(); SwigType_add_pointer($$); SwigType_push($$,$2); Delete($2); } | STAR type_qualifier { $$ = NewStringEmpty(); SwigType_add_pointer($$); SwigType_push($$,$2); } | STAR { $$ = NewStringEmpty(); SwigType_add_pointer($$); } ; type_qualifier : type_qualifier_raw { $$ = NewStringEmpty(); if ($1) SwigType_add_qualifier($$,$1); } | type_qualifier_raw type_qualifier { $$ = $2; if ($1) SwigType_add_qualifier($$,$1); } ; type_qualifier_raw : CONST_QUAL { $$ = "const"; } | VOLATILE { $$ = "volatile"; } | REGISTER { $$ = 0; } ; /* Data type must be a built in type or an identifier for user-defined types This type can be preceded by a modifier. */ type : rawtype { $$ = $1; Replace($$,"typename ","", DOH_REPLACE_ANY); } ; rawtype : type_qualifier type_right { $$ = $2; SwigType_push($$,$1); } | type_right { $$ = $1; } | type_right type_qualifier { $$ = $1; SwigType_push($$,$2); } | type_qualifier type_right type_qualifier { $$ = $2; SwigType_push($$,$3); SwigType_push($$,$1); } ; type_right : primitive_type { $$ = $1; /* Printf(stdout,"primitive = '%s'\n", $$);*/ } | TYPE_BOOL { $$ = $1; } | TYPE_VOID { $$ = $1; } /* | TYPE_TYPEDEF template_decl { $$ = NewStringf("%s%s",$1,$2); } */ | c_enum_key idcolon { $$ = NewStringf("enum %s", $2); } | TYPE_RAW { $$ = $1; } | idcolon { $$ = $1; } | cpptype idcolon { $$ = NewStringf("%s %s", $1, $2); } | decltype { $$ = $1; } ; decltype : DECLTYPE LPAREN idcolon RPAREN { Node *n = Swig_symbol_clookup($3,0); if (!n) { Swig_error(cparse_file, cparse_line, "Identifier %s not defined.\n", $3); $$ = $3; } else { $$ = Getattr(n, "type"); } } ; primitive_type : primitive_type_list { if (!$1.type) $1.type = NewString("int"); if ($1.us) { $$ = NewStringf("%s %s", $1.us, $1.type); Delete($1.us); Delete($1.type); } else { $$ = $1.type; } if (Cmp($$,"signed int") == 0) { Delete($$); $$ = NewString("int"); } else if (Cmp($$,"signed long") == 0) { Delete($$); $$ = NewString("long"); } else if (Cmp($$,"signed short") == 0) { Delete($$); $$ = NewString("short"); } else if (Cmp($$,"signed long long") == 0) { Delete($$); $$ = NewString("long long"); } } ; primitive_type_list : type_specifier { $$ = $1; } | type_specifier primitive_type_list { if ($1.us && $2.us) { Swig_error(cparse_file, cparse_line, "Extra %s specifier.\n", $2.us); } $$ = $2; if ($1.us) $$.us = $1.us; if ($1.type) { if (!$2.type) $$.type = $1.type; else { int err = 0; if ((Cmp($1.type,"long") == 0)) { if ((Cmp($2.type,"long") == 0) || (Strncmp($2.type,"double",6) == 0)) { $$.type = NewStringf("long %s", $2.type); } else if (Cmp($2.type,"int") == 0) { $$.type = $1.type; } else { err = 1; } } else if ((Cmp($1.type,"short")) == 0) { if (Cmp($2.type,"int") == 0) { $$.type = $1.type; } else { err = 1; } } else if (Cmp($1.type,"int") == 0) { $$.type = $2.type; } else if (Cmp($1.type,"double") == 0) { if (Cmp($2.type,"long") == 0) { $$.type = NewString("long double"); } else if (Cmp($2.type,"complex") == 0) { $$.type = NewString("double complex"); } else { err = 1; } } else if (Cmp($1.type,"float") == 0) { if (Cmp($2.type,"complex") == 0) { $$.type = NewString("float complex"); } else { err = 1; } } else if (Cmp($1.type,"complex") == 0) { $$.type = NewStringf("%s complex", $2.type); } else { err = 1; } if (err) { Swig_error(cparse_file, cparse_line, "Extra %s specifier.\n", $1.type); } } } } ; type_specifier : TYPE_INT { $$.type = NewString("int"); $$.us = 0; } | TYPE_SHORT { $$.type = NewString("short"); $$.us = 0; } | TYPE_LONG { $$.type = NewString("long"); $$.us = 0; } | TYPE_CHAR { $$.type = NewString("char"); $$.us = 0; } | TYPE_WCHAR { $$.type = NewString("wchar_t"); $$.us = 0; } | TYPE_FLOAT { $$.type = NewString("float"); $$.us = 0; } | TYPE_DOUBLE { $$.type = NewString("double"); $$.us = 0; } | TYPE_SIGNED { $$.us = NewString("signed"); $$.type = 0; } | TYPE_UNSIGNED { $$.us = NewString("unsigned"); $$.type = 0; } | TYPE_COMPLEX { $$.type = NewString("complex"); $$.us = 0; } | TYPE_NON_ISO_INT8 { $$.type = NewString("__int8"); $$.us = 0; } | TYPE_NON_ISO_INT16 { $$.type = NewString("__int16"); $$.us = 0; } | TYPE_NON_ISO_INT32 { $$.type = NewString("__int32"); $$.us = 0; } | TYPE_NON_ISO_INT64 { $$.type = NewString("__int64"); $$.us = 0; } ; definetype : { /* scanner_check_typedef(); */ } expr { $$ = $2; if ($$.type == T_STRING) { $$.rawval = NewStringf("\"%(escape)s\"",$$.val); } else if ($$.type != T_CHAR && $$.type != T_WSTRING && $$.type != T_WCHAR) { $$.rawval = NewStringf("%s", $$.val); } $$.qualifier = 0; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; scanner_ignore_typedef(); } | default_delete { $$ = $1; } ; default_delete : deleted_definition { $$ = $1; } | explicit_default { $$ = $1; } ; /* For C++ deleted definition '= delete' */ deleted_definition : DELETE_KW { $$.val = NewString("delete"); $$.rawval = 0; $$.type = T_STRING; $$.qualifier = 0; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } ; /* For C++ explicitly defaulted functions '= default' */ explicit_default : DEFAULT { $$.val = NewString("default"); $$.rawval = 0; $$.type = T_STRING; $$.qualifier = 0; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } ; /* Some stuff for handling enums */ ename : identifier { $$ = $1; } | empty { $$ = (char *) 0;} ; optional_constant_directive : constant_directive { $$ = $1; } | empty { $$ = 0; } ; /* Enum lists - any #define macros (constant directives) within the enum list are ignored. Trailing commas accepted. */ enumlist : enumlist COMMA optional_constant_directive edecl optional_constant_directive { Node *leftSibling = Getattr($1,"_last"); set_nextSibling(leftSibling,$4); Setattr($1,"_last",$4); $$ = $1; } | enumlist COMMA optional_constant_directive { $$ = $1; } | optional_constant_directive edecl optional_constant_directive { Setattr($2,"_last",$2); $$ = $2; } | optional_constant_directive { $$ = 0; } ; edecl : identifier { SwigType *type = NewSwigType(T_INT); $$ = new_node("enumitem"); Setattr($$,"name",$1); Setattr($$,"type",type); SetFlag($$,"feature:immutable"); Delete(type); } | identifier EQUAL etype { SwigType *type = NewSwigType($3.type == T_BOOL ? T_BOOL : ($3.type == T_CHAR ? T_CHAR : T_INT)); $$ = new_node("enumitem"); Setattr($$,"name",$1); Setattr($$,"type",type); SetFlag($$,"feature:immutable"); Setattr($$,"enumvalue", $3.val); Setattr($$,"value",$1); Delete(type); } ; etype : expr { $$ = $1; if (($$.type != T_INT) && ($$.type != T_UINT) && ($$.type != T_LONG) && ($$.type != T_ULONG) && ($$.type != T_LONGLONG) && ($$.type != T_ULONGLONG) && ($$.type != T_SHORT) && ($$.type != T_USHORT) && ($$.type != T_SCHAR) && ($$.type != T_UCHAR) && ($$.type != T_CHAR) && ($$.type != T_BOOL)) { Swig_error(cparse_file,cparse_line,"Type error. Expecting an integral type\n"); } } ; /* Arithmetic expressions. Used for constants, C++ templates, and other cool stuff. */ expr : valexpr { $$ = $1; } | type { Node *n; $$.val = $1; $$.type = T_INT; /* Check if value is in scope */ n = Swig_symbol_clookup($1,0); if (n) { /* A band-aid for enum values used in expressions. */ if (Strcmp(nodeType(n),"enumitem") == 0) { String *q = Swig_symbol_qualified(n); if (q) { $$.val = NewStringf("%s::%s", q, Getattr(n,"name")); Delete(q); } } } } ; valexpr : exprnum { $$ = $1; } | string { $$.val = $1; $$.type = T_STRING; } | SIZEOF LPAREN type parameter_declarator RPAREN { SwigType_push($3,$4.type); $$.val = NewStringf("sizeof(%s)",SwigType_str($3,0)); $$.type = T_ULONG; } | SIZEOF PERIOD PERIOD PERIOD LPAREN type parameter_declarator RPAREN { SwigType_push($6,$7.type); $$.val = NewStringf("sizeof...(%s)",SwigType_str($6,0)); $$.type = T_ULONG; } | exprcompound { $$ = $1; } | wstring { $$.val = $1; $$.rawval = NewStringf("L\"%s\"", $$.val); $$.type = T_WSTRING; } | CHARCONST { $$.val = NewString($1); if (Len($$.val)) { $$.rawval = NewStringf("'%(escape)s'", $$.val); } else { $$.rawval = NewString("'\\0'"); } $$.type = T_CHAR; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | WCHARCONST { $$.val = NewString($1); if (Len($$.val)) { $$.rawval = NewStringf("L\'%s\'", $$.val); } else { $$.rawval = NewString("L'\\0'"); } $$.type = T_WCHAR; $$.bitfield = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } /* grouping */ | LPAREN expr RPAREN %prec CAST { $$.val = NewStringf("(%s)",$2.val); $$.type = $2.type; } /* A few common casting operations */ | LPAREN expr RPAREN expr %prec CAST { $$ = $4; if ($4.type != T_STRING) { switch ($2.type) { case T_FLOAT: case T_DOUBLE: case T_LONGDOUBLE: case T_FLTCPLX: case T_DBLCPLX: $$.val = NewStringf("(%s)%s", $2.val, $4.val); /* SwigType_str and decimal points don't mix! */ break; default: $$.val = NewStringf("(%s) %s", SwigType_str($2.val,0), $4.val); break; } } } | LPAREN expr pointer RPAREN expr %prec CAST { $$ = $5; if ($5.type != T_STRING) { SwigType_push($2.val,$3); $$.val = NewStringf("(%s) %s", SwigType_str($2.val,0), $5.val); } } | LPAREN expr AND RPAREN expr %prec CAST { $$ = $5; if ($5.type != T_STRING) { SwigType_add_reference($2.val); $$.val = NewStringf("(%s) %s", SwigType_str($2.val,0), $5.val); } } | LPAREN expr LAND RPAREN expr %prec CAST { $$ = $5; if ($5.type != T_STRING) { SwigType_add_rvalue_reference($2.val); $$.val = NewStringf("(%s) %s", SwigType_str($2.val,0), $5.val); } } | LPAREN expr pointer AND RPAREN expr %prec CAST { $$ = $6; if ($6.type != T_STRING) { SwigType_push($2.val,$3); SwigType_add_reference($2.val); $$.val = NewStringf("(%s) %s", SwigType_str($2.val,0), $6.val); } } | LPAREN expr pointer LAND RPAREN expr %prec CAST { $$ = $6; if ($6.type != T_STRING) { SwigType_push($2.val,$3); SwigType_add_rvalue_reference($2.val); $$.val = NewStringf("(%s) %s", SwigType_str($2.val,0), $6.val); } } | AND expr { $$ = $2; $$.val = NewStringf("&%s",$2.val); } | LAND expr { $$ = $2; $$.val = NewStringf("&&%s",$2.val); } | STAR expr { $$ = $2; $$.val = NewStringf("*%s",$2.val); } ; exprnum : NUM_INT { $$ = $1; } | NUM_FLOAT { $$ = $1; } | NUM_UNSIGNED { $$ = $1; } | NUM_LONG { $$ = $1; } | NUM_ULONG { $$ = $1; } | NUM_LONGLONG { $$ = $1; } | NUM_ULONGLONG { $$ = $1; } | NUM_BOOL { $$ = $1; } ; exprcompound : expr PLUS expr { $$.val = NewStringf("%s+%s", COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr MINUS expr { $$.val = NewStringf("%s-%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr STAR expr { $$.val = NewStringf("%s*%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr SLASH expr { $$.val = NewStringf("%s/%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr MODULO expr { $$.val = NewStringf("%s%%%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr AND expr { $$.val = NewStringf("%s&%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr OR expr { $$.val = NewStringf("%s|%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr XOR expr { $$.val = NewStringf("%s^%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote($1.type,$3.type); } | expr LSHIFT expr { $$.val = NewStringf("%s << %s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote_type($1.type); } | expr RSHIFT expr { $$.val = NewStringf("%s >> %s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = promote_type($1.type); } | expr LAND expr { $$.val = NewStringf("%s&&%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } | expr LOR expr { $$.val = NewStringf("%s||%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } | expr EQUALTO expr { $$.val = NewStringf("%s==%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } | expr NOTEQUALTO expr { $$.val = NewStringf("%s!=%s",COMPOUND_EXPR_VAL($1),COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } /* Sadly this causes 2 reduce-reduce conflicts with templates. FIXME resolve these. | expr GREATERTHAN expr { $$.val = NewStringf("%s > %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } | expr LESSTHAN expr { $$.val = NewStringf("%s < %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } */ | expr GREATERTHANOREQUALTO expr { $$.val = NewStringf("%s >= %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } | expr LESSTHANOREQUALTO expr { $$.val = NewStringf("%s <= %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } | expr QUESTIONMARK expr COLON expr %prec QUESTIONMARK { $$.val = NewStringf("%s?%s:%s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3), COMPOUND_EXPR_VAL($5)); /* This may not be exactly right, but is probably good enough * for the purposes of parsing constant expressions. */ $$.type = promote($3.type, $5.type); } | MINUS expr %prec UMINUS { $$.val = NewStringf("-%s",$2.val); $$.type = $2.type; } | PLUS expr %prec UMINUS { $$.val = NewStringf("+%s",$2.val); $$.type = $2.type; } | NOT expr { $$.val = NewStringf("~%s",$2.val); $$.type = $2.type; } | LNOT expr { $$.val = NewStringf("!%s",COMPOUND_EXPR_VAL($2)); $$.type = T_INT; } | type LPAREN { String *qty; skip_balanced('(',')'); qty = Swig_symbol_type_qualify($1,0); if (SwigType_istemplate(qty)) { String *nstr = SwigType_namestr(qty); Delete(qty); qty = nstr; } $$.val = NewStringf("%s%s",qty,scanner_ccode); Clear(scanner_ccode); $$.type = T_INT; Delete(qty); } ; ellipsis : PERIOD PERIOD PERIOD { $$ = NewString("..."); } ; variadic : ellipsis { $$ = $1; } | empty { $$ = 0; } ; inherit : raw_inherit { $$ = $1; } ; raw_inherit : COLON { inherit_list = 1; } base_list { $$ = $3; inherit_list = 0; } | empty { $$ = 0; } ; base_list : base_specifier { Hash *list = NewHash(); Node *base = $1; Node *name = Getattr(base,"name"); List *lpublic = NewList(); List *lprotected = NewList(); List *lprivate = NewList(); Setattr(list,"public",lpublic); Setattr(list,"protected",lprotected); Setattr(list,"private",lprivate); Delete(lpublic); Delete(lprotected); Delete(lprivate); Append(Getattr(list,Getattr(base,"access")),name); $$ = list; } | base_list COMMA base_specifier { Hash *list = $1; Node *base = $3; Node *name = Getattr(base,"name"); Append(Getattr(list,Getattr(base,"access")),name); $$ = list; } ; base_specifier : opt_virtual { $$ = cparse_line; } idcolon variadic { $$ = NewHash(); Setfile($$,cparse_file); Setline($$,$2); Setattr($$,"name",$3); Setfile($3,cparse_file); Setline($3,$2); if (last_cpptype && (Strcmp(last_cpptype,"struct") != 0)) { Setattr($$,"access","private"); Swig_warning(WARN_PARSE_NO_ACCESS, Getfile($$), Getline($$), "No access specifier given for base class '%s' (ignored).\n", SwigType_namestr($3)); } else { Setattr($$,"access","public"); } if ($4) SetFlag($$, "variadic"); } | opt_virtual access_specifier { $$ = cparse_line; } opt_virtual idcolon variadic { $$ = NewHash(); Setfile($$,cparse_file); Setline($$,$3); Setattr($$,"name",$5); Setfile($5,cparse_file); Setline($5,$3); Setattr($$,"access",$2); if (Strcmp($2,"public") != 0) { Swig_warning(WARN_PARSE_PRIVATE_INHERIT, Getfile($$), Getline($$), "%s inheritance from base '%s' (ignored).\n", $2, SwigType_namestr($5)); } if ($6) SetFlag($$, "variadic"); } ; access_specifier : PUBLIC { $$ = (char*)"public"; } | PRIVATE { $$ = (char*)"private"; } | PROTECTED { $$ = (char*)"protected"; } ; templcpptype : CLASS { $$ = (char*)"class"; if (!inherit_list) last_cpptype = $$; } | TYPENAME { $$ = (char *)"typename"; if (!inherit_list) last_cpptype = $$; } | CLASS PERIOD PERIOD PERIOD { $$ = (char *)"class..."; if (!inherit_list) last_cpptype = $$; } | TYPENAME PERIOD PERIOD PERIOD { $$ = (char *)"typename..."; if (!inherit_list) last_cpptype = $$; } ; cpptype : templcpptype { $$ = $1; } | STRUCT { $$ = (char*)"struct"; if (!inherit_list) last_cpptype = $$; } | UNION { $$ = (char*)"union"; if (!inherit_list) last_cpptype = $$; } ; classkey : CLASS { $$ = (char*)"class"; if (!inherit_list) last_cpptype = $$; } | STRUCT { $$ = (char*)"struct"; if (!inherit_list) last_cpptype = $$; } | UNION { $$ = (char*)"union"; if (!inherit_list) last_cpptype = $$; } ; classkeyopt : classkey { $$ = $1; } | empty { $$ = 0; } ; opt_virtual : VIRTUAL | empty ; virt_specifier_seq : OVERRIDE { $$ = 0; } | FINAL { $$ = 0; } | FINAL OVERRIDE { $$ = 0; } | OVERRIDE FINAL { $$ = 0; } ; exception_specification : THROW LPAREN parms RPAREN { $$.throws = $3; $$.throwf = NewString("1"); $$.nexcept = 0; } | NOEXCEPT { $$.throws = 0; $$.throwf = 0; $$.nexcept = NewString("true"); } | virt_specifier_seq { $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | NOEXCEPT virt_specifier_seq { $$.throws = 0; $$.throwf = 0; $$.nexcept = NewString("true"); } | NOEXCEPT LPAREN expr RPAREN { $$.throws = 0; $$.throwf = 0; $$.nexcept = $3.val; } ; cpp_const : type_qualifier { $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; $$.qualifier = $1; } | exception_specification { $$ = $1; $$.qualifier = 0; } | type_qualifier exception_specification { $$ = $2; $$.qualifier = $1; } | empty { $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; $$.qualifier = 0; } ; ctor_end : cpp_const ctor_initializer SEMI { Clear(scanner_ccode); $$.have_parms = 0; $$.defarg = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } | cpp_const ctor_initializer LBRACE { skip_balanced('{','}'); $$.have_parms = 0; $$.defarg = 0; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } | LPAREN parms RPAREN SEMI { Clear(scanner_ccode); $$.parms = $2; $$.have_parms = 1; $$.defarg = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | LPAREN parms RPAREN LBRACE { skip_balanced('{','}'); $$.parms = $2; $$.have_parms = 1; $$.defarg = 0; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | EQUAL definetype SEMI { $$.have_parms = 0; $$.defarg = $2.val; $$.throws = 0; $$.throwf = 0; $$.nexcept = 0; } | exception_specification EQUAL default_delete SEMI { $$.have_parms = 0; $$.defarg = $3.val; $$.throws = $1.throws; $$.throwf = $1.throwf; $$.nexcept = $1.nexcept; } ; ctor_initializer : COLON mem_initializer_list | empty ; mem_initializer_list : mem_initializer | mem_initializer_list COMMA mem_initializer | mem_initializer PERIOD PERIOD PERIOD | mem_initializer_list COMMA mem_initializer PERIOD PERIOD PERIOD ; mem_initializer : idcolon LPAREN { skip_balanced('(',')'); Clear(scanner_ccode); } /* Uniform initialization in C++11. Example: struct MyStruct { MyStruct(int x, double y) : x_{x}, y_{y} {} int x_; double y_; }; */ | idcolon LBRACE { skip_balanced('{','}'); Clear(scanner_ccode); } ; less_valparms_greater : LESSTHAN valparms GREATERTHAN { String *s = NewStringEmpty(); SwigType_add_template(s,$2); $$ = Char(s); scanner_last_id(1); } ; /* Identifiers including the C++11 identifiers with special meaning */ identifier : ID { $$ = $1; } | OVERRIDE { $$ = Swig_copy_string("override"); } | FINAL { $$ = Swig_copy_string("final"); } ; idstring : identifier { $$ = $1; } | default_delete { $$ = Char($1.val); } | string { $$ = Char($1); } ; idstringopt : idstring { $$ = $1; } | empty { $$ = 0; } ; idcolon : idtemplate idcolontail { $$ = 0; if (!$$) $$ = NewStringf("%s%s", $1,$2); Delete($2); } | NONID DCOLON idtemplatetemplate idcolontail { $$ = NewStringf("::%s%s",$3,$4); Delete($4); } | idtemplate { $$ = NewString($1); } | NONID DCOLON idtemplatetemplate { $$ = NewStringf("::%s",$3); } | OPERATOR { $$ = NewStringf("%s", $1); } | OPERATOR less_valparms_greater { $$ = NewStringf("%s%s", $1, $2); } | NONID DCOLON OPERATOR { $$ = NewStringf("::%s",$3); } ; idcolontail : DCOLON idtemplatetemplate idcolontail { $$ = NewStringf("::%s%s",$2,$3); Delete($3); } | DCOLON idtemplatetemplate { $$ = NewStringf("::%s",$2); } | DCOLON OPERATOR { $$ = NewStringf("::%s",$2); } /* | DCOLON CONVERSIONOPERATOR { $$ = NewString($2); } */ | DCNOT idtemplate { $$ = NewStringf("::~%s",$2); } ; idtemplate : identifier { $$ = NewStringf("%s", $1); } | identifier less_valparms_greater { $$ = NewStringf("%s%s", $1, $2); } ; idtemplatetemplate : idtemplate { $$ = $1; } | TEMPLATE identifier less_valparms_greater { $$ = NewStringf("%s%s", $2, $3); } ; /* Identifier, but no templates */ idcolonnt : identifier idcolontailnt { $$ = 0; if (!$$) $$ = NewStringf("%s%s", $1,$2); Delete($2); } | NONID DCOLON identifier idcolontailnt { $$ = NewStringf("::%s%s",$3,$4); Delete($4); } | identifier { $$ = NewString($1); } | NONID DCOLON identifier { $$ = NewStringf("::%s",$3); } | OPERATOR { $$ = NewString($1); } | NONID DCOLON OPERATOR { $$ = NewStringf("::%s",$3); } ; idcolontailnt : DCOLON identifier idcolontailnt { $$ = NewStringf("::%s%s",$2,$3); Delete($3); } | DCOLON identifier { $$ = NewStringf("::%s",$2); } | DCOLON OPERATOR { $$ = NewStringf("::%s",$2); } | DCNOT identifier { $$ = NewStringf("::~%s",$2); } ; /* Concatenated strings */ string : string STRING { $$ = NewStringf("%s%s", $1, $2); } | STRING { $$ = NewString($1);} ; /* Concatenated wide strings: L"str1" L"str2" */ wstring : wstring WSTRING { $$ = NewStringf("%s%s", $1, $2); } /* Concatenated wide string and normal string literal: L"str1" "str2" */ /*not all the compilers support this concatenation mode, so perhaps better to postpone it*/ /*| wstring STRING { here $2 comes unescaped, we have to escape it back first via NewStringf("%(escape)s)" $$ = NewStringf("%s%s", $1, $2); }*/ | WSTRING { $$ = NewString($1);} ; stringbrace : string { $$ = $1; } | LBRACE { skip_balanced('{','}'); $$ = NewString(scanner_ccode); } | HBLOCK { $$ = $1; } ; options : LPAREN kwargs RPAREN { Hash *n; $$ = NewHash(); n = $2; while(n) { String *name, *value; name = Getattr(n,"name"); value = Getattr(n,"value"); if (!value) value = (String *) "1"; Setattr($$,name, value); n = nextSibling(n); } } | empty { $$ = 0; }; /* Keyword arguments */ kwargs : idstring EQUAL stringnum { $$ = NewHash(); Setattr($$,"name",$1); Setattr($$,"value",$3); } | idstring EQUAL stringnum COMMA kwargs { $$ = NewHash(); Setattr($$,"name",$1); Setattr($$,"value",$3); set_nextSibling($$,$5); } | idstring { $$ = NewHash(); Setattr($$,"name",$1); } | idstring COMMA kwargs { $$ = NewHash(); Setattr($$,"name",$1); set_nextSibling($$,$3); } | idstring EQUAL stringtype { $$ = $3; Setattr($$,"name",$1); } | idstring EQUAL stringtype COMMA kwargs { $$ = $3; Setattr($$,"name",$1); set_nextSibling($$,$5); } ; stringnum : string { $$ = $1; } | exprnum { $$ = Char($1.val); } ; empty : ; %% SwigType *Swig_cparse_type(String *s) { String *ns; ns = NewStringf("%s;",s); Seek(ns,0,SEEK_SET); scanner_file(ns); top = 0; scanner_next_token(PARSETYPE); yyparse(); /* Printf(stdout,"typeparse: '%s' ---> '%s'\n", s, top); */ return top; } Parm *Swig_cparse_parm(String *s) { String *ns; ns = NewStringf("%s;",s); Seek(ns,0,SEEK_SET); scanner_file(ns); top = 0; scanner_next_token(PARSEPARM); yyparse(); /* Printf(stdout,"typeparse: '%s' ---> '%s'\n", s, top); */ Delete(ns); return top; } ParmList *Swig_cparse_parms(String *s, Node *file_line_node) { String *ns; char *cs = Char(s); if (cs && cs[0] != '(') { ns = NewStringf("(%s);",s); } else { ns = NewStringf("%s;",s); } Setfile(ns, Getfile(file_line_node)); Setline(ns, Getline(file_line_node)); Seek(ns,0,SEEK_SET); scanner_file(ns); top = 0; scanner_next_token(PARSEPARMS); yyparse(); /* Printf(stdout,"typeparse: '%s' ---> '%s'\n", s, top); */ return top; } swig-3.0.12/Source/CParse/cparse.h0000664000175000017500000000571713042756442016512 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * cparse.h * * SWIG parser module. * ----------------------------------------------------------------------------- */ #ifndef SWIG_CPARSE_H_ #define SWIG_CPARSE_H_ #include "swig.h" #include "swigwarn.h" #ifdef __cplusplus extern "C" { #endif /* cscanner.c */ extern String *cparse_file; extern int cparse_line; extern int cparse_cplusplus; extern int cparse_cplusplusout; extern int cparse_start_line; extern String *cparse_unknown_directive; extern void Swig_cparse_cplusplus(int); extern void Swig_cparse_cplusplusout(int); extern void scanner_file(File *); extern void scanner_next_token(int); extern void skip_balanced(int startchar, int endchar); extern String *get_raw_text_balanced(int startchar, int endchar); extern void skip_decl(void); extern void scanner_check_typedef(void); extern void scanner_ignore_typedef(void); extern void scanner_last_id(int); extern void scanner_clear_rename(void); extern void scanner_set_location(String *file, int line); extern void scanner_set_main_input_file(String *file); extern String *scanner_get_main_input_file(); extern void Swig_cparse_follow_locators(int); extern void start_inline(char *, int); extern String *scanner_ccode; extern int yylex(void); /* parser.y */ extern SwigType *Swig_cparse_type(String *); extern Node *Swig_cparse(File *); extern Hash *Swig_cparse_features(void); extern void SWIG_cparse_set_compact_default_args(int defargs); extern int SWIG_cparse_template_reduce(int treduce); /* util.c */ extern void Swig_cparse_replace_descriptor(String *s); extern SwigType *Swig_cparse_smartptr(Node *n); extern void cparse_normalize_void(Node *); extern Parm *Swig_cparse_parm(String *s); extern ParmList *Swig_cparse_parms(String *s, Node *file_line_node); extern Node *new_node(const_String_or_char_ptr tag); /* templ.c */ extern int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *tscope); extern Node *Swig_cparse_template_locate(String *name, ParmList *tparms, Symtab *tscope); extern void Swig_cparse_debug_templates(int); #ifdef __cplusplus } #endif #define SWIG_WARN_NODE_BEGIN(Node) \ { \ String *wrnfilter = Node ? Getattr(Node,"feature:warnfilter") : 0; \ if (wrnfilter) Swig_warnfilter(wrnfilter,1) #define SWIG_WARN_NODE_END(Node) \ if (wrnfilter) Swig_warnfilter(wrnfilter,0); \ } #define COMPOUND_EXPR_VAL(dtype) \ ((dtype).type == T_CHAR || (dtype).type == T_WCHAR ? (dtype).rawval : (dtype).val) #endif swig-3.0.12/Source/CParse/parser.c0000664000175000017500000151536113042756671016532 0ustar williamwilliam/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "3.0.4" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 0 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Copy the first part of user declarations. */ #line 25 "parser.y" /* yacc.c:339 */ #define yylex yylex #include "swig.h" #include "cparse.h" #include "preprocessor.h" #include /* We do this for portability */ #undef alloca #define alloca malloc /* ----------------------------------------------------------------------------- * Externals * ----------------------------------------------------------------------------- */ int yyparse(); /* NEW Variables */ static Node *top = 0; /* Top of the generated parse tree */ static int unnamed = 0; /* Unnamed datatype counter */ static Hash *classes = 0; /* Hash table of classes */ static Hash *classes_typedefs = 0; /* Hash table of typedef classes: typedef struct X {...} Y; */ static Symtab *prev_symtab = 0; static Node *current_class = 0; String *ModuleName = 0; static Node *module_node = 0; static String *Classprefix = 0; static String *Namespaceprefix = 0; static int inclass = 0; static Node *currentOuterClass = 0; /* for nested classes */ static const char *last_cpptype = 0; static int inherit_list = 0; static Parm *template_parameters = 0; static int parsing_template_declaration = 0; static int extendmode = 0; static int compact_default_args = 0; static int template_reduce = 0; static int cparse_externc = 0; int ignore_nested_classes = 0; int kwargs_supported = 0; /* ----------------------------------------------------------------------------- * Assist Functions * ----------------------------------------------------------------------------- */ /* Called by the parser (yyparse) when an error is found.*/ static void yyerror (const char *e) { (void)e; } /* Copies a node. Does not copy tree links or symbol table data (except for sym:name) */ static Node *copy_node(Node *n) { Node *nn; Iterator k; nn = NewHash(); Setfile(nn,Getfile(n)); Setline(nn,Getline(n)); for (k = First(n); k.key; k = Next(k)) { String *ci; String *key = k.key; char *ckey = Char(key); if ((strcmp(ckey,"nextSibling") == 0) || (strcmp(ckey,"previousSibling") == 0) || (strcmp(ckey,"parentNode") == 0) || (strcmp(ckey,"lastChild") == 0)) { continue; } if (Strncmp(key,"csym:",5) == 0) continue; /* We do copy sym:name. For templates */ if ((strcmp(ckey,"sym:name") == 0) || (strcmp(ckey,"sym:weak") == 0) || (strcmp(ckey,"sym:typename") == 0)) { String *ci = Copy(k.item); Setattr(nn,key, ci); Delete(ci); continue; } if (strcmp(ckey,"sym:symtab") == 0) { Setattr(nn,"sym:needs_symtab", "1"); } /* We don't copy any other symbol table attributes */ if (strncmp(ckey,"sym:",4) == 0) { continue; } /* If children. We copy them recursively using this function */ if (strcmp(ckey,"firstChild") == 0) { /* Copy children */ Node *cn = k.item; while (cn) { Node *copy = copy_node(cn); appendChild(nn,copy); Delete(copy); cn = nextSibling(cn); } continue; } /* We don't copy the symbol table. But we drop an attribute requires_symtab so that functions know it needs to be built */ if (strcmp(ckey,"symtab") == 0) { /* Node defined a symbol table. */ Setattr(nn,"requires_symtab","1"); continue; } /* Can't copy nodes */ if (strcmp(ckey,"node") == 0) { continue; } if ((strcmp(ckey,"parms") == 0) || (strcmp(ckey,"pattern") == 0) || (strcmp(ckey,"throws") == 0) || (strcmp(ckey,"kwargs") == 0)) { ParmList *pl = CopyParmList(k.item); Setattr(nn,key,pl); Delete(pl); continue; } if (strcmp(ckey,"nested:outer") == 0) { /* don't copy outer classes links, they will be updated later */ Setattr(nn, key, k.item); continue; } /* defaultargs will be patched back in later in update_defaultargs() */ if (strcmp(ckey,"defaultargs") == 0) { Setattr(nn, "needs_defaultargs", "1"); continue; } /* Looks okay. Just copy the data using Copy */ ci = Copy(k.item); Setattr(nn, key, ci); Delete(ci); } return nn; } /* ----------------------------------------------------------------------------- * Variables * ----------------------------------------------------------------------------- */ static char *typemap_lang = 0; /* Current language setting */ static int cplus_mode = 0; /* C++ modes */ #define CPLUS_PUBLIC 1 #define CPLUS_PRIVATE 2 #define CPLUS_PROTECTED 3 /* include types */ static int import_mode = 0; void SWIG_typemap_lang(const char *tm_lang) { typemap_lang = Swig_copy_string(tm_lang); } void SWIG_cparse_set_compact_default_args(int defargs) { compact_default_args = defargs; } int SWIG_cparse_template_reduce(int treduce) { template_reduce = treduce; return treduce; } /* ----------------------------------------------------------------------------- * Assist functions * ----------------------------------------------------------------------------- */ static int promote_type(int t) { if (t <= T_UCHAR || t == T_CHAR) return T_INT; return t; } /* Perform type-promotion for binary operators */ static int promote(int t1, int t2) { t1 = promote_type(t1); t2 = promote_type(t2); return t1 > t2 ? t1 : t2; } static String *yyrename = 0; /* Forward renaming operator */ static String *resolve_create_node_scope(String *cname); Hash *Swig_cparse_features(void) { static Hash *features_hash = 0; if (!features_hash) features_hash = NewHash(); return features_hash; } /* Fully qualify any template parameters */ static String *feature_identifier_fix(String *s) { String *tp = SwigType_istemplate_templateprefix(s); if (tp) { String *ts, *ta, *tq; ts = SwigType_templatesuffix(s); ta = SwigType_templateargs(s); tq = Swig_symbol_type_qualify(ta,0); Append(tp,tq); Append(tp,ts); Delete(ts); Delete(ta); Delete(tq); return tp; } else { return NewString(s); } } static void set_access_mode(Node *n) { if (cplus_mode == CPLUS_PUBLIC) Setattr(n, "access", "public"); else if (cplus_mode == CPLUS_PROTECTED) Setattr(n, "access", "protected"); else Setattr(n, "access", "private"); } static void restore_access_mode(Node *n) { String *mode = Getattr(n, "access"); if (Strcmp(mode, "private") == 0) cplus_mode = CPLUS_PRIVATE; else if (Strcmp(mode, "protected") == 0) cplus_mode = CPLUS_PROTECTED; else cplus_mode = CPLUS_PUBLIC; } /* Generate the symbol table name for an object */ /* This is a bit of a mess. Need to clean up */ static String *add_oldname = 0; static String *make_name(Node *n, String *name,SwigType *decl) { String *made_name = 0; int destructor = name && (*(Char(name)) == '~'); if (yyrename) { String *s = NewString(yyrename); Delete(yyrename); yyrename = 0; if (destructor && (*(Char(s)) != '~')) { Insert(s,0,"~"); } return s; } if (!name) return 0; if (parsing_template_declaration) SetFlag(n, "parsing_template_declaration"); made_name = Swig_name_make(n, Namespaceprefix, name, decl, add_oldname); Delattr(n, "parsing_template_declaration"); return made_name; } /* Generate an unnamed identifier */ static String *make_unnamed() { unnamed++; return NewStringf("$unnamed%d$",unnamed); } /* Return if the node is a friend declaration */ static int is_friend(Node *n) { return Cmp(Getattr(n,"storage"),"friend") == 0; } static int is_operator(String *name) { return Strncmp(name,"operator ", 9) == 0; } /* Add declaration list to symbol table */ static int add_only_one = 0; static void add_symbols(Node *n) { String *decl; String *wrn = 0; if (inclass && n) { cparse_normalize_void(n); } while (n) { String *symname = 0; /* for friends, we need to pop the scope once */ String *old_prefix = 0; Symtab *old_scope = 0; int isfriend = inclass && is_friend(n); int iscdecl = Cmp(nodeType(n),"cdecl") == 0; int only_csymbol = 0; if (inclass) { String *name = Getattr(n, "name"); if (isfriend) { /* for friends, we need to add the scopename if needed */ String *prefix = name ? Swig_scopename_prefix(name) : 0; old_prefix = Namespaceprefix; old_scope = Swig_symbol_popscope(); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (!prefix) { if (name && !is_operator(name) && Namespaceprefix) { String *nname = NewStringf("%s::%s", Namespaceprefix, name); Setattr(n,"name",nname); Delete(nname); } } else { Symtab *st = Swig_symbol_getscope(prefix); String *ns = st ? Getattr(st,"name") : prefix; String *base = Swig_scopename_last(name); String *nname = NewStringf("%s::%s", ns, base); Setattr(n,"name",nname); Delete(nname); Delete(base); Delete(prefix); } Namespaceprefix = 0; } else { /* for member functions, we need to remove the redundant class scope if provided, as in struct Foo { int Foo::method(int a); }; */ String *prefix = name ? Swig_scopename_prefix(name) : 0; if (prefix) { if (Classprefix && (Equal(prefix,Classprefix))) { String *base = Swig_scopename_last(name); Setattr(n,"name",base); Delete(base); } Delete(prefix); } } } if (!isfriend && (inclass || extendmode)) { Setattr(n,"ismember","1"); } if (extendmode) { if (!Getattr(n, "template")) SetFlag(n,"isextendmember"); } if (!isfriend && inclass) { if ((cplus_mode != CPLUS_PUBLIC)) { only_csymbol = 1; if (cplus_mode == CPLUS_PROTECTED) { Setattr(n,"access", "protected"); only_csymbol = !Swig_need_protected(n); } else { Setattr(n,"access", "private"); /* private are needed only when they are pure virtuals - why? */ if ((Cmp(Getattr(n,"storage"),"virtual") == 0) && (Cmp(Getattr(n,"value"),"0") == 0)) { only_csymbol = 0; } if (Cmp(nodeType(n),"destructor") == 0) { /* Needed for "unref" feature */ only_csymbol = 0; } } } else { Setattr(n,"access", "public"); } } if (Getattr(n,"sym:name")) { n = nextSibling(n); continue; } decl = Getattr(n,"decl"); if (!SwigType_isfunction(decl)) { String *name = Getattr(n,"name"); String *makename = Getattr(n,"parser:makename"); if (iscdecl) { String *storage = Getattr(n, "storage"); if (Cmp(storage,"typedef") == 0) { Setattr(n,"kind","typedef"); } else { SwigType *type = Getattr(n,"type"); String *value = Getattr(n,"value"); Setattr(n,"kind","variable"); if (value && Len(value)) { Setattr(n,"hasvalue","1"); } if (type) { SwigType *ty; SwigType *tmp = 0; if (decl) { ty = tmp = Copy(type); SwigType_push(ty,decl); } else { ty = type; } if (!SwigType_ismutable(ty) || (storage && Strstr(storage, "constexpr"))) { SetFlag(n,"hasconsttype"); SetFlag(n,"feature:immutable"); } if (tmp) Delete(tmp); } if (!type) { Printf(stderr,"notype name %s\n", name); } } } Swig_features_get(Swig_cparse_features(), Namespaceprefix, name, 0, n); if (makename) { symname = make_name(n, makename,0); Delattr(n,"parser:makename"); /* temporary information, don't leave it hanging around */ } else { makename = name; symname = make_name(n, makename,0); } if (!symname) { symname = Copy(Getattr(n,"unnamed")); } if (symname) { if (parsing_template_declaration) SetFlag(n, "parsing_template_declaration"); wrn = Swig_name_warning(n, Namespaceprefix, symname,0); Delattr(n, "parsing_template_declaration"); } } else { String *name = Getattr(n,"name"); SwigType *fdecl = Copy(decl); SwigType *fun = SwigType_pop_function(fdecl); if (iscdecl) { Setattr(n,"kind","function"); } Swig_features_get(Swig_cparse_features(),Namespaceprefix,name,fun,n); symname = make_name(n, name,fun); if (parsing_template_declaration) SetFlag(n, "parsing_template_declaration"); wrn = Swig_name_warning(n, Namespaceprefix,symname,fun); Delattr(n, "parsing_template_declaration"); Delete(fdecl); Delete(fun); } if (!symname) { n = nextSibling(n); continue; } if (cparse_cplusplus) { String *value = Getattr(n, "value"); if (value && Strcmp(value, "delete") == 0) { /* C++11 deleted definition / deleted function */ SetFlag(n,"deleted"); SetFlag(n,"feature:ignore"); } } if (only_csymbol || GetFlag(n,"feature:ignore") || strncmp(Char(symname),"$ignore",7) == 0) { /* Only add to C symbol table and continue */ Swig_symbol_add(0, n); if (!only_csymbol && !GetFlag(n, "feature:ignore")) { /* Print the warning attached to $ignore name, if any */ char *c = Char(symname) + 7; if (strlen(c)) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0,Getfile(n), Getline(n), "%s\n",c+1); SWIG_WARN_NODE_END(n); } /* If the symbol was ignored via "rename" and is visible, set also feature:ignore*/ SetFlag(n, "feature:ignore"); } if (!GetFlag(n, "feature:ignore") && Strcmp(symname,"$ignore") == 0) { /* Add feature:ignore if the symbol was explicitely ignored, regardless of visibility */ SetFlag(n, "feature:ignore"); } } else { Node *c; if ((wrn) && (Len(wrn))) { String *metaname = symname; if (!Getmeta(metaname,"already_warned")) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(0,Getfile(n),Getline(n), "%s\n", wrn); SWIG_WARN_NODE_END(n); Setmeta(metaname,"already_warned","1"); } } c = Swig_symbol_add(symname,n); if (c != n) { /* symbol conflict attempting to add in the new symbol */ if (Getattr(n,"sym:weak")) { Setattr(n,"sym:name",symname); } else { String *e = NewStringEmpty(); String *en = NewStringEmpty(); String *ec = NewStringEmpty(); int redefined = Swig_need_redefined_warn(n,c,inclass); if (redefined) { Printf(en,"Identifier '%s' redefined (ignored)",symname); Printf(ec,"previous definition of '%s'",symname); } else { Printf(en,"Redundant redeclaration of '%s'",symname); Printf(ec,"previous declaration of '%s'",symname); } if (Cmp(symname,Getattr(n,"name"))) { Printf(en," (Renamed from '%s')", SwigType_namestr(Getattr(n,"name"))); } Printf(en,","); if (Cmp(symname,Getattr(c,"name"))) { Printf(ec," (Renamed from '%s')", SwigType_namestr(Getattr(c,"name"))); } Printf(ec,"."); SWIG_WARN_NODE_BEGIN(n); if (redefined) { Swig_warning(WARN_PARSE_REDEFINED,Getfile(n),Getline(n),"%s\n",en); Swig_warning(WARN_PARSE_REDEFINED,Getfile(c),Getline(c),"%s\n",ec); } else if (!is_friend(n) && !is_friend(c)) { Swig_warning(WARN_PARSE_REDUNDANT,Getfile(n),Getline(n),"%s\n",en); Swig_warning(WARN_PARSE_REDUNDANT,Getfile(c),Getline(c),"%s\n",ec); } SWIG_WARN_NODE_END(n); Printf(e,"%s:%d:%s\n%s:%d:%s\n",Getfile(n),Getline(n),en, Getfile(c),Getline(c),ec); Setattr(n,"error",e); Delete(e); Delete(en); Delete(ec); } } } /* restore the class scope if needed */ if (isfriend) { Swig_symbol_setscope(old_scope); if (old_prefix) { Delete(Namespaceprefix); Namespaceprefix = old_prefix; } } Delete(symname); if (add_only_one) return; n = nextSibling(n); } } /* add symbols a parse tree node copy */ static void add_symbols_copy(Node *n) { String *name; int emode = 0; while (n) { char *cnodeType = Char(nodeType(n)); if (strcmp(cnodeType,"access") == 0) { String *kind = Getattr(n,"kind"); if (Strcmp(kind,"public") == 0) { cplus_mode = CPLUS_PUBLIC; } else if (Strcmp(kind,"private") == 0) { cplus_mode = CPLUS_PRIVATE; } else if (Strcmp(kind,"protected") == 0) { cplus_mode = CPLUS_PROTECTED; } n = nextSibling(n); continue; } add_oldname = Getattr(n,"sym:name"); if ((add_oldname) || (Getattr(n,"sym:needs_symtab"))) { int old_inclass = -1; Node *old_current_class = 0; if (add_oldname) { DohIncref(add_oldname); /* Disable this, it prevents %rename to work with templates */ /* If already renamed, we used that name */ /* if (Strcmp(add_oldname, Getattr(n,"name")) != 0) { Delete(yyrename); yyrename = Copy(add_oldname); } */ } Delattr(n,"sym:needs_symtab"); Delattr(n,"sym:name"); add_only_one = 1; add_symbols(n); if (Getattr(n,"partialargs")) { Swig_symbol_cadd(Getattr(n,"partialargs"),n); } add_only_one = 0; name = Getattr(n,"name"); if (Getattr(n,"requires_symtab")) { Swig_symbol_newscope(); Swig_symbol_setscopename(name); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } if (strcmp(cnodeType,"class") == 0) { old_inclass = inclass; inclass = 1; old_current_class = current_class; current_class = n; if (Strcmp(Getattr(n,"kind"),"class") == 0) { cplus_mode = CPLUS_PRIVATE; } else { cplus_mode = CPLUS_PUBLIC; } } if (strcmp(cnodeType,"extend") == 0) { emode = cplus_mode; cplus_mode = CPLUS_PUBLIC; } add_symbols_copy(firstChild(n)); if (strcmp(cnodeType,"extend") == 0) { cplus_mode = emode; } if (Getattr(n,"requires_symtab")) { Setattr(n,"symtab", Swig_symbol_popscope()); Delattr(n,"requires_symtab"); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } if (add_oldname) { Delete(add_oldname); add_oldname = 0; } if (strcmp(cnodeType,"class") == 0) { inclass = old_inclass; current_class = old_current_class; } } else { if (strcmp(cnodeType,"extend") == 0) { emode = cplus_mode; cplus_mode = CPLUS_PUBLIC; } add_symbols_copy(firstChild(n)); if (strcmp(cnodeType,"extend") == 0) { cplus_mode = emode; } } n = nextSibling(n); } } /* Add in the "defaultargs" attribute for functions in instantiated templates. * n should be any instantiated template (class or start of linked list of functions). */ static void update_defaultargs(Node *n) { if (n) { Node *firstdefaultargs = n; update_defaultargs(firstChild(n)); n = nextSibling(n); /* recursively loop through nodes of all types, but all we really need are the overloaded functions */ while (n) { update_defaultargs(firstChild(n)); if (!Getattr(n, "defaultargs")) { if (Getattr(n, "needs_defaultargs")) { Setattr(n, "defaultargs", firstdefaultargs); Delattr(n, "needs_defaultargs"); } else { firstdefaultargs = n; } } else { /* Functions added in with %extend (for specialized template classes) will already have default args patched up */ assert(Getattr(n, "defaultargs") == firstdefaultargs); } n = nextSibling(n); } } } /* Check a set of declarations to see if any are pure-abstract */ static List *pure_abstracts(Node *n) { List *abstracts = 0; while (n) { if (Cmp(nodeType(n),"cdecl") == 0) { String *decl = Getattr(n,"decl"); if (SwigType_isfunction(decl)) { String *init = Getattr(n,"value"); if (Cmp(init,"0") == 0) { if (!abstracts) { abstracts = NewList(); } Append(abstracts,n); SetFlag(n,"abstract"); } } } else if (Cmp(nodeType(n),"destructor") == 0) { if (Cmp(Getattr(n,"value"),"0") == 0) { if (!abstracts) { abstracts = NewList(); } Append(abstracts,n); SetFlag(n,"abstract"); } } n = nextSibling(n); } return abstracts; } /* Make a classname */ static String *make_class_name(String *name) { String *nname = 0; String *prefix; if (Namespaceprefix) { nname= NewStringf("%s::%s", Namespaceprefix, name); } else { nname = NewString(name); } prefix = SwigType_istemplate_templateprefix(nname); if (prefix) { String *args, *qargs; args = SwigType_templateargs(nname); qargs = Swig_symbol_type_qualify(args,0); Append(prefix,qargs); Delete(nname); Delete(args); Delete(qargs); nname = prefix; } return nname; } /* Use typedef name as class name */ static void add_typedef_name(Node *n, Node *declnode, String *oldName, Symtab *cscope, String *scpname) { String *class_rename = 0; SwigType *decl = Getattr(declnode, "decl"); if (!decl || !Len(decl)) { String *cname; String *tdscopename; String *class_scope = Swig_symbol_qualifiedscopename(cscope); String *name = Getattr(declnode, "name"); cname = Copy(name); Setattr(n, "tdname", cname); tdscopename = class_scope ? NewStringf("%s::%s", class_scope, name) : Copy(name); class_rename = Getattr(n, "class_rename"); if (class_rename && (Strcmp(class_rename, oldName) == 0)) Setattr(n, "class_rename", NewString(name)); if (!classes_typedefs) classes_typedefs = NewHash(); if (!Equal(scpname, tdscopename) && !Getattr(classes_typedefs, tdscopename)) { Setattr(classes_typedefs, tdscopename, n); } Setattr(n, "decl", decl); Delete(class_scope); Delete(cname); Delete(tdscopename); } } /* If the class name is qualified. We need to create or lookup namespace entries */ static Symtab *set_scope_to_global() { Symtab *symtab = Swig_symbol_global_scope(); Swig_symbol_setscope(symtab); return symtab; } /* Remove the block braces, { and }, if the 'noblock' attribute is set. * Node *kw can be either a Hash or Parmlist. */ static String *remove_block(Node *kw, const String *inputcode) { String *modified_code = 0; while (kw) { String *name = Getattr(kw,"name"); if (name && (Cmp(name,"noblock") == 0)) { char *cstr = Char(inputcode); int len = Len(inputcode); if (len && cstr[0] == '{') { --len; ++cstr; if (len && cstr[len - 1] == '}') { --len; } /* we now remove the extra spaces */ while (len && isspace((int)cstr[0])) { --len; ++cstr; } while (len && isspace((int)cstr[len - 1])) { --len; } modified_code = NewStringWithSize(cstr, len); break; } } kw = nextSibling(kw); } return modified_code; } static Node *nscope = 0; static Node *nscope_inner = 0; /* Remove the scope prefix from cname and return the base name without the prefix. * The scopes required for the symbol name are resolved and/or created, if required. * For example AA::BB::CC as input returns CC and creates the namespace AA then inner * namespace BB in the current scope. If cname is found to already exist as a weak symbol * (forward reference) then the scope might be changed to match, such as when a symbol match * is made via a using reference. */ static String *resolve_create_node_scope(String *cname) { Symtab *gscope = 0; Node *cname_node = 0; int skip_lookup = 0; nscope = 0; nscope_inner = 0; if (Strncmp(cname,"::",2) == 0) skip_lookup = 1; cname_node = skip_lookup ? 0 : Swig_symbol_clookup_no_inherit(cname, 0); if (cname_node) { /* The symbol has been defined already or is in another scope. If it is a weak symbol, it needs replacing and if it was brought into the current scope via a using declaration, the scope needs adjusting appropriately for the new symbol. Similarly for defined templates. */ Symtab *symtab = Getattr(cname_node, "sym:symtab"); Node *sym_weak = Getattr(cname_node, "sym:weak"); if ((symtab && sym_weak) || Equal(nodeType(cname_node), "template")) { /* Check if the scope is the current scope */ String *current_scopename = Swig_symbol_qualifiedscopename(0); String *found_scopename = Swig_symbol_qualifiedscopename(symtab); int len; if (!current_scopename) current_scopename = NewString(""); if (!found_scopename) found_scopename = NewString(""); len = Len(current_scopename); if ((len > 0) && (Strncmp(current_scopename, found_scopename, len) == 0)) { if (Len(found_scopename) > len + 2) { /* A matching weak symbol was found in non-global scope, some scope adjustment may be required */ String *new_cname = NewString(Char(found_scopename) + len + 2); /* skip over "::" prefix */ String *base = Swig_scopename_last(cname); Printf(new_cname, "::%s", base); cname = new_cname; Delete(base); } else { /* A matching weak symbol was found in the same non-global local scope, no scope adjustment required */ assert(len == Len(found_scopename)); } } else { String *base = Swig_scopename_last(cname); if (Len(found_scopename) > 0) { /* A matching weak symbol was found in a different scope to the local scope - probably via a using declaration */ cname = NewStringf("%s::%s", found_scopename, base); } else { /* Either: 1) A matching weak symbol was found in a different scope to the local scope - this is actually a symbol with the same name in a different scope which we don't want, so no adjustment required. 2) A matching weak symbol was found in the global scope - no adjustment required. */ cname = Copy(base); } Delete(base); } Delete(current_scopename); Delete(found_scopename); } } if (Swig_scopename_check(cname)) { Node *ns; String *prefix = Swig_scopename_prefix(cname); String *base = Swig_scopename_last(cname); if (prefix && (Strncmp(prefix,"::",2) == 0)) { /* I don't think we can use :: global scope to declare classes and hence neither %template. - consider reporting error instead - wsfulton. */ /* Use the global scope */ String *nprefix = NewString(Char(prefix)+2); Delete(prefix); prefix= nprefix; gscope = set_scope_to_global(); } if (Len(prefix) == 0) { /* Use the global scope, but we need to add a 'global' namespace. */ if (!gscope) gscope = set_scope_to_global(); /* note that this namespace is not the "unnamed" one, and we don't use Setattr(nscope,"name", ""), because the unnamed namespace is private */ nscope = new_node("namespace"); Setattr(nscope,"symtab", gscope);; nscope_inner = nscope; return base; } /* Try to locate the scope */ ns = Swig_symbol_clookup(prefix,0); if (!ns) { Swig_error(cparse_file,cparse_line,"Undefined scope '%s'\n", prefix); } else { Symtab *nstab = Getattr(ns,"symtab"); if (!nstab) { Swig_error(cparse_file,cparse_line, "'%s' is not defined as a valid scope.\n", prefix); ns = 0; } else { /* Check if the node scope is the current scope */ String *tname = Swig_symbol_qualifiedscopename(0); String *nname = Swig_symbol_qualifiedscopename(nstab); if (tname && (Strcmp(tname,nname) == 0)) { ns = 0; cname = base; } Delete(tname); Delete(nname); } if (ns) { /* we will try to create a new node using the namespaces we can find in the scope name */ List *scopes; String *sname; Iterator si; String *name = NewString(prefix); scopes = NewList(); while (name) { String *base = Swig_scopename_last(name); String *tprefix = Swig_scopename_prefix(name); Insert(scopes,0,base); Delete(base); Delete(name); name = tprefix; } for (si = First(scopes); si.item; si = Next(si)) { Node *ns1,*ns2; sname = si.item; ns1 = Swig_symbol_clookup(sname,0); assert(ns1); if (Strcmp(nodeType(ns1),"namespace") == 0) { if (Getattr(ns1,"alias")) { ns1 = Getattr(ns1,"namespace"); } } else { /* now this last part is a class */ si = Next(si); /* or a nested class tree, which is unrolled here */ for (; si.item; si = Next(si)) { if (si.item) { Printf(sname,"::%s",si.item); } } /* we get the 'inner' class */ nscope_inner = Swig_symbol_clookup(sname,0); /* set the scope to the inner class */ Swig_symbol_setscope(Getattr(nscope_inner,"symtab")); /* save the last namespace prefix */ Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); /* and return the node name, including the inner class prefix */ break; } /* here we just populate the namespace tree as usual */ ns2 = new_node("namespace"); Setattr(ns2,"name",sname); Setattr(ns2,"symtab", Getattr(ns1,"symtab")); add_symbols(ns2); Swig_symbol_setscope(Getattr(ns1,"symtab")); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (nscope_inner) { if (Getattr(nscope_inner,"symtab") != Getattr(ns2,"symtab")) { appendChild(nscope_inner,ns2); Delete(ns2); } } nscope_inner = ns2; if (!nscope) nscope = ns2; } cname = base; Delete(scopes); } } Delete(prefix); } return cname; } /* look for simple typedef name in typedef list */ static String *try_to_find_a_name_for_unnamed_structure(const char *storage, Node *decls) { String *name = 0; Node *n = decls; if (storage && (strcmp(storage, "typedef") == 0)) { for (; n; n = nextSibling(n)) { if (!Len(Getattr(n, "decl"))) { name = Copy(Getattr(n, "name")); break; } } } return name; } /* traverse copied tree segment, and update outer class links*/ static void update_nested_classes(Node *n) { Node *c = firstChild(n); while (c) { if (Getattr(c, "nested:outer")) Setattr(c, "nested:outer", n); update_nested_classes(c); c = nextSibling(c); } } /* ----------------------------------------------------------------------------- * nested_forward_declaration() * * Nested struct handling for C++ code if the nested classes are disabled. * Create the nested class/struct/union as a forward declaration. * ----------------------------------------------------------------------------- */ static Node *nested_forward_declaration(const char *storage, const char *kind, String *sname, String *name, Node *cpp_opt_declarators) { Node *nn = 0; if (sname) { /* Add forward declaration of the nested type */ Node *n = new_node("classforward"); Setattr(n, "kind", kind); Setattr(n, "name", sname); Setattr(n, "storage", storage); Setattr(n, "sym:weak", "1"); add_symbols(n); nn = n; } /* Add any variable instances. Also add in any further typedefs of the nested type. Note that anonymous typedefs (eg typedef struct {...} a, b;) are treated as class forward declarations */ if (cpp_opt_declarators) { int storage_typedef = (storage && (strcmp(storage, "typedef") == 0)); int variable_of_anonymous_type = !sname && !storage_typedef; if (!variable_of_anonymous_type) { int anonymous_typedef = !sname && (storage && (strcmp(storage, "typedef") == 0)); Node *n = cpp_opt_declarators; SwigType *type = name; while (n) { Setattr(n, "type", type); Setattr(n, "storage", storage); if (anonymous_typedef) { Setattr(n, "nodeType", "classforward"); Setattr(n, "sym:weak", "1"); } n = nextSibling(n); } add_symbols(cpp_opt_declarators); if (nn) { set_nextSibling(nn, cpp_opt_declarators); } else { nn = cpp_opt_declarators; } } } if (!currentOuterClass || !GetFlag(currentOuterClass, "nested")) { if (nn && Equal(nodeType(nn), "classforward")) { Node *n = nn; if (!GetFlag(n, "feature:ignore")) { SWIG_WARN_NODE_BEGIN(n); Swig_warning(WARN_PARSE_NAMED_NESTED_CLASS, cparse_file, cparse_line,"Nested %s not currently supported (%s ignored)\n", kind, sname ? sname : name); SWIG_WARN_NODE_END(n); } } else { Swig_warning(WARN_PARSE_UNNAMED_NESTED_CLASS, cparse_file, cparse_line, "Nested %s not currently supported (ignored).\n", kind); } } return nn; } Node *Swig_cparse(File *f) { scanner_file(f); top = 0; yyparse(); return top; } static void single_new_feature(const char *featurename, String *val, Hash *featureattribs, char *declaratorid, SwigType *type, ParmList *declaratorparms, String *qualifier) { String *fname; String *name; String *fixname; SwigType *t = Copy(type); /* Printf(stdout, "single_new_feature: [%s] [%s] [%s] [%s] [%s] [%s]\n", featurename, val, declaratorid, t, ParmList_str_defaultargs(declaratorparms), qualifier); */ /* Warn about deprecated features */ if (strcmp(featurename, "nestedworkaround") == 0) Swig_warning(WARN_DEPRECATED_NESTED_WORKAROUND, cparse_file, cparse_line, "The 'nestedworkaround' feature is deprecated.\n"); fname = NewStringf("feature:%s",featurename); if (declaratorid) { fixname = feature_identifier_fix(declaratorid); } else { fixname = NewStringEmpty(); } if (Namespaceprefix) { name = NewStringf("%s::%s",Namespaceprefix, fixname); } else { name = fixname; } if (declaratorparms) Setmeta(val,"parms",declaratorparms); if (!Len(t)) t = 0; if (t) { if (qualifier) SwigType_push(t,qualifier); if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(), nname, decl, fname, val, featureattribs); Delete(nname); } else { Swig_feature_set(Swig_cparse_features(), name, decl, fname, val, featureattribs); } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(),nname,0,fname,val, featureattribs); Delete(nname); } } else { /* Global feature, that is, feature not associated with any particular symbol */ Swig_feature_set(Swig_cparse_features(),name,0,fname,val, featureattribs); } Delete(fname); Delete(name); } /* Add a new feature to the Hash. Additional features are added if the feature has a parameter list (declaratorparms) * and one or more of the parameters have a default argument. An extra feature is added for each defaulted parameter, * simulating the equivalent overloaded method. */ static void new_feature(const char *featurename, String *val, Hash *featureattribs, char *declaratorid, SwigType *type, ParmList *declaratorparms, String *qualifier) { ParmList *declparms = declaratorparms; /* remove the { and } braces if the noblock attribute is set */ String *newval = remove_block(featureattribs, val); val = newval ? newval : val; /* Add the feature */ single_new_feature(featurename, val, featureattribs, declaratorid, type, declaratorparms, qualifier); /* Add extra features if there are default parameters in the parameter list */ if (type) { while (declparms) { if (ParmList_has_defaultargs(declparms)) { /* Create a parameter list for the new feature by copying all but the last (defaulted) parameter */ ParmList* newparms = CopyParmListMax(declparms, ParmList_len(declparms)-1); /* Create new declaration - with the last parameter removed */ SwigType *newtype = Copy(type); Delete(SwigType_pop_function(newtype)); /* remove the old parameter list from newtype */ SwigType_add_function(newtype,newparms); single_new_feature(featurename, Copy(val), featureattribs, declaratorid, newtype, newparms, qualifier); declparms = newparms; } else { declparms = 0; } } } } /* check if a function declaration is a plain C object */ static int is_cfunction(Node *n) { if (!cparse_cplusplus || cparse_externc) return 1; if (Swig_storage_isexternc(n)) { return 1; } return 0; } /* If the Node is a function with parameters, check to see if any of the parameters * have default arguments. If so create a new function for each defaulted argument. * The additional functions form a linked list of nodes with the head being the original Node n. */ static void default_arguments(Node *n) { Node *function = n; if (function) { ParmList *varargs = Getattr(function,"feature:varargs"); if (varargs) { /* Handles the %varargs directive by looking for "feature:varargs" and * substituting ... with an alternative set of arguments. */ Parm *p = Getattr(function,"parms"); Parm *pp = 0; while (p) { SwigType *t = Getattr(p,"type"); if (Strcmp(t,"v(...)") == 0) { if (pp) { ParmList *cv = Copy(varargs); set_nextSibling(pp,cv); Delete(cv); } else { ParmList *cv = Copy(varargs); Setattr(function,"parms", cv); Delete(cv); } break; } pp = p; p = nextSibling(p); } } /* Do not add in functions if kwargs is being used or if user wants old default argument wrapping (one wrapped method per function irrespective of number of default arguments) */ if (compact_default_args || is_cfunction(function) || GetFlag(function,"feature:compactdefaultargs") || (GetFlag(function,"feature:kwargs") && kwargs_supported)) { ParmList *p = Getattr(function,"parms"); if (p) Setattr(p,"compactdefargs", "1"); /* mark parameters for special handling */ function = 0; /* don't add in extra methods */ } } while (function) { ParmList *parms = Getattr(function,"parms"); if (ParmList_has_defaultargs(parms)) { /* Create a parameter list for the new function by copying all but the last (defaulted) parameter */ ParmList* newparms = CopyParmListMax(parms,ParmList_len(parms)-1); /* Create new function and add to symbol table */ { SwigType *ntype = Copy(nodeType(function)); char *cntype = Char(ntype); Node *new_function = new_node(ntype); SwigType *decl = Copy(Getattr(function,"decl")); int constqualifier = SwigType_isconst(decl); String *ccode = Copy(Getattr(function,"code")); String *cstorage = Copy(Getattr(function,"storage")); String *cvalue = Copy(Getattr(function,"value")); SwigType *ctype = Copy(Getattr(function,"type")); String *cthrow = Copy(Getattr(function,"throw")); Delete(SwigType_pop_function(decl)); /* remove the old parameter list from decl */ SwigType_add_function(decl,newparms); if (constqualifier) SwigType_add_qualifier(decl,"const"); Setattr(new_function,"name", Getattr(function,"name")); Setattr(new_function,"code", ccode); Setattr(new_function,"decl", decl); Setattr(new_function,"parms", newparms); Setattr(new_function,"storage", cstorage); Setattr(new_function,"value", cvalue); Setattr(new_function,"type", ctype); Setattr(new_function,"throw", cthrow); Delete(ccode); Delete(cstorage); Delete(cvalue); Delete(ctype); Delete(cthrow); Delete(decl); { Node *throws = Getattr(function,"throws"); ParmList *pl = CopyParmList(throws); if (throws) Setattr(new_function,"throws",pl); Delete(pl); } /* copy specific attributes for global (or in a namespace) template functions - these are not templated class methods */ if (strcmp(cntype,"template") == 0) { Node *templatetype = Getattr(function,"templatetype"); Node *symtypename = Getattr(function,"sym:typename"); Parm *templateparms = Getattr(function,"templateparms"); if (templatetype) { Node *tmp = Copy(templatetype); Setattr(new_function,"templatetype",tmp); Delete(tmp); } if (symtypename) { Node *tmp = Copy(symtypename); Setattr(new_function,"sym:typename",tmp); Delete(tmp); } if (templateparms) { Parm *tmp = CopyParmList(templateparms); Setattr(new_function,"templateparms",tmp); Delete(tmp); } } else if (strcmp(cntype,"constructor") == 0) { /* only copied for constructors as this is not a user defined feature - it is hard coded in the parser */ if (GetFlag(function,"feature:new")) SetFlag(new_function,"feature:new"); } add_symbols(new_function); /* mark added functions as ones with overloaded parameters and point to the parsed method */ Setattr(new_function,"defaultargs", n); /* Point to the new function, extending the linked list */ set_nextSibling(function, new_function); Delete(new_function); function = new_function; Delete(ntype); } } else { function = 0; } } } /* ----------------------------------------------------------------------------- * mark_nodes_as_extend() * * Used by the %extend to mark subtypes with "feature:extend". * template instances declared within %extend are skipped * ----------------------------------------------------------------------------- */ static void mark_nodes_as_extend(Node *n) { for (; n; n = nextSibling(n)) { if (Getattr(n, "template") && Strcmp(nodeType(n), "class") == 0) continue; /* Fix me: extend is not a feature. Replace with isextendmember? */ Setattr(n, "feature:extend", "1"); mark_nodes_as_extend(firstChild(n)); } } #line 1397 "y.tab.c" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* In a future release of Bison, this section will be replaced by #include "y.tab.h". */ #ifndef YY_YY_Y_TAB_H_INCLUDED # define YY_YY_Y_TAB_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { ID = 258, HBLOCK = 259, POUND = 260, STRING = 261, WSTRING = 262, INCLUDE = 263, IMPORT = 264, INSERT = 265, CHARCONST = 266, WCHARCONST = 267, NUM_INT = 268, NUM_FLOAT = 269, NUM_UNSIGNED = 270, NUM_LONG = 271, NUM_ULONG = 272, NUM_LONGLONG = 273, NUM_ULONGLONG = 274, NUM_BOOL = 275, TYPEDEF = 276, TYPE_INT = 277, TYPE_UNSIGNED = 278, TYPE_SHORT = 279, TYPE_LONG = 280, TYPE_FLOAT = 281, TYPE_DOUBLE = 282, TYPE_CHAR = 283, TYPE_WCHAR = 284, TYPE_VOID = 285, TYPE_SIGNED = 286, TYPE_BOOL = 287, TYPE_COMPLEX = 288, TYPE_TYPEDEF = 289, TYPE_RAW = 290, TYPE_NON_ISO_INT8 = 291, TYPE_NON_ISO_INT16 = 292, TYPE_NON_ISO_INT32 = 293, TYPE_NON_ISO_INT64 = 294, LPAREN = 295, RPAREN = 296, COMMA = 297, SEMI = 298, EXTERN = 299, INIT = 300, LBRACE = 301, RBRACE = 302, PERIOD = 303, CONST_QUAL = 304, VOLATILE = 305, REGISTER = 306, STRUCT = 307, UNION = 308, EQUAL = 309, SIZEOF = 310, MODULE = 311, LBRACKET = 312, RBRACKET = 313, BEGINFILE = 314, ENDOFFILE = 315, ILLEGAL = 316, CONSTANT = 317, NAME = 318, RENAME = 319, NAMEWARN = 320, EXTEND = 321, PRAGMA = 322, FEATURE = 323, VARARGS = 324, ENUM = 325, CLASS = 326, TYPENAME = 327, PRIVATE = 328, PUBLIC = 329, PROTECTED = 330, COLON = 331, STATIC = 332, VIRTUAL = 333, FRIEND = 334, THROW = 335, CATCH = 336, EXPLICIT = 337, STATIC_ASSERT = 338, CONSTEXPR = 339, THREAD_LOCAL = 340, DECLTYPE = 341, AUTO = 342, NOEXCEPT = 343, OVERRIDE = 344, FINAL = 345, USING = 346, NAMESPACE = 347, NATIVE = 348, INLINE = 349, TYPEMAP = 350, EXCEPT = 351, ECHO = 352, APPLY = 353, CLEAR = 354, SWIGTEMPLATE = 355, FRAGMENT = 356, WARN = 357, LESSTHAN = 358, GREATERTHAN = 359, DELETE_KW = 360, DEFAULT = 361, LESSTHANOREQUALTO = 362, GREATERTHANOREQUALTO = 363, EQUALTO = 364, NOTEQUALTO = 365, ARROW = 366, QUESTIONMARK = 367, TYPES = 368, PARMS = 369, NONID = 370, DSTAR = 371, DCNOT = 372, TEMPLATE = 373, OPERATOR = 374, CONVERSIONOPERATOR = 375, PARSETYPE = 376, PARSEPARM = 377, PARSEPARMS = 378, CAST = 379, LOR = 380, LAND = 381, OR = 382, XOR = 383, AND = 384, LSHIFT = 385, RSHIFT = 386, PLUS = 387, MINUS = 388, STAR = 389, SLASH = 390, MODULO = 391, UMINUS = 392, NOT = 393, LNOT = 394, DCOLON = 395 }; #endif /* Tokens. */ #define ID 258 #define HBLOCK 259 #define POUND 260 #define STRING 261 #define WSTRING 262 #define INCLUDE 263 #define IMPORT 264 #define INSERT 265 #define CHARCONST 266 #define WCHARCONST 267 #define NUM_INT 268 #define NUM_FLOAT 269 #define NUM_UNSIGNED 270 #define NUM_LONG 271 #define NUM_ULONG 272 #define NUM_LONGLONG 273 #define NUM_ULONGLONG 274 #define NUM_BOOL 275 #define TYPEDEF 276 #define TYPE_INT 277 #define TYPE_UNSIGNED 278 #define TYPE_SHORT 279 #define TYPE_LONG 280 #define TYPE_FLOAT 281 #define TYPE_DOUBLE 282 #define TYPE_CHAR 283 #define TYPE_WCHAR 284 #define TYPE_VOID 285 #define TYPE_SIGNED 286 #define TYPE_BOOL 287 #define TYPE_COMPLEX 288 #define TYPE_TYPEDEF 289 #define TYPE_RAW 290 #define TYPE_NON_ISO_INT8 291 #define TYPE_NON_ISO_INT16 292 #define TYPE_NON_ISO_INT32 293 #define TYPE_NON_ISO_INT64 294 #define LPAREN 295 #define RPAREN 296 #define COMMA 297 #define SEMI 298 #define EXTERN 299 #define INIT 300 #define LBRACE 301 #define RBRACE 302 #define PERIOD 303 #define CONST_QUAL 304 #define VOLATILE 305 #define REGISTER 306 #define STRUCT 307 #define UNION 308 #define EQUAL 309 #define SIZEOF 310 #define MODULE 311 #define LBRACKET 312 #define RBRACKET 313 #define BEGINFILE 314 #define ENDOFFILE 315 #define ILLEGAL 316 #define CONSTANT 317 #define NAME 318 #define RENAME 319 #define NAMEWARN 320 #define EXTEND 321 #define PRAGMA 322 #define FEATURE 323 #define VARARGS 324 #define ENUM 325 #define CLASS 326 #define TYPENAME 327 #define PRIVATE 328 #define PUBLIC 329 #define PROTECTED 330 #define COLON 331 #define STATIC 332 #define VIRTUAL 333 #define FRIEND 334 #define THROW 335 #define CATCH 336 #define EXPLICIT 337 #define STATIC_ASSERT 338 #define CONSTEXPR 339 #define THREAD_LOCAL 340 #define DECLTYPE 341 #define AUTO 342 #define NOEXCEPT 343 #define OVERRIDE 344 #define FINAL 345 #define USING 346 #define NAMESPACE 347 #define NATIVE 348 #define INLINE 349 #define TYPEMAP 350 #define EXCEPT 351 #define ECHO 352 #define APPLY 353 #define CLEAR 354 #define SWIGTEMPLATE 355 #define FRAGMENT 356 #define WARN 357 #define LESSTHAN 358 #define GREATERTHAN 359 #define DELETE_KW 360 #define DEFAULT 361 #define LESSTHANOREQUALTO 362 #define GREATERTHANOREQUALTO 363 #define EQUALTO 364 #define NOTEQUALTO 365 #define ARROW 366 #define QUESTIONMARK 367 #define TYPES 368 #define PARMS 369 #define NONID 370 #define DSTAR 371 #define DCNOT 372 #define TEMPLATE 373 #define OPERATOR 374 #define CONVERSIONOPERATOR 375 #define PARSETYPE 376 #define PARSEPARM 377 #define PARSEPARMS 378 #define CAST 379 #define LOR 380 #define LAND 381 #define OR 382 #define XOR 383 #define AND 384 #define LSHIFT 385 #define RSHIFT 386 #define PLUS 387 #define MINUS 388 #define STAR 389 #define SLASH 390 #define MODULO 391 #define UMINUS 392 #define NOT 393 #define LNOT 394 #define DCOLON 395 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 1356 "parser.y" /* yacc.c:355 */ const char *id; List *bases; struct Define { String *val; String *rawval; int type; String *qualifier; String *bitfield; Parm *throws; String *throwf; String *nexcept; } dtype; struct { const char *type; String *filename; int line; } loc; struct { char *id; SwigType *type; String *defarg; ParmList *parms; short have_parms; ParmList *throws; String *throwf; String *nexcept; } decl; Parm *tparms; struct { String *method; Hash *kwargs; } tmap; struct { String *type; String *us; } ptype; SwigType *type; String *str; Parm *p; ParmList *pl; int intvalue; Node *node; #line 1762 "y.tab.c" /* yacc.c:355 */ }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE yylval; int yyparse (void); #endif /* !YY_YY_Y_TAB_H_INCLUDED */ /* Copy the second part of user declarations. */ #line 1779 "y.tab.c" /* yacc.c:358 */ #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE # if (defined __GNUC__ \ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C # define YY_ATTRIBUTE(Spec) __attribute__(Spec) # else # define YY_ATTRIBUTE(Spec) /* empty */ # endif #endif #ifndef YY_ATTRIBUTE_PURE # define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) #endif #ifndef YY_ATTRIBUTE_UNUSED # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) #endif #if !defined _Noreturn \ && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) # if defined _MSC_VER && 1200 <= _MSC_VER # define _Noreturn __declspec (noreturn) # else # define _Noreturn YY_ATTRIBUTE ((__noreturn__)) # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(E) ((void) (E)) #else # define YYUSE(E) /* empty */ #endif #if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ /* Suppress an incorrect diagnostic about yylval being uninitialized. */ # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 60 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 5039 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 141 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 171 /* YYNRULES -- Number of rules. */ #define YYNRULES 579 /* YYNSTATES -- Number of states. */ #define YYNSTATES 1128 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 395 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex, without out-of-bounds checking. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { 0, 1521, 1521, 1533, 1537, 1540, 1543, 1546, 1549, 1554, 1559, 1564, 1565, 1566, 1567, 1568, 1578, 1594, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1631, 1631, 1713, 1723, 1734, 1755, 1777, 1788, 1797, 1816, 1822, 1828, 1833, 1840, 1847, 1851, 1864, 1873, 1888, 1901, 1901, 1957, 1958, 1965, 1984, 2015, 2019, 2029, 2034, 2052, 2095, 2101, 2114, 2120, 2146, 2152, 2159, 2160, 2163, 2164, 2171, 2217, 2263, 2274, 2277, 2304, 2310, 2316, 2322, 2330, 2336, 2342, 2348, 2356, 2357, 2358, 2361, 2366, 2376, 2412, 2413, 2448, 2465, 2473, 2486, 2511, 2517, 2521, 2524, 2535, 2540, 2553, 2565, 2863, 2873, 2880, 2881, 2885, 2885, 2910, 2916, 2926, 2944, 3012, 3070, 3074, 3097, 3101, 3112, 3119, 3126, 3133, 3142, 3143, 3144, 3148, 3149, 3150, 3161, 3166, 3171, 3178, 3184, 3189, 3192, 3192, 3205, 3208, 3211, 3220, 3223, 3230, 3252, 3281, 3379, 3431, 3432, 3433, 3434, 3435, 3436, 3441, 3441, 3689, 3689, 3836, 3837, 3849, 3867, 3867, 4128, 4134, 4140, 4143, 4146, 4149, 4152, 4155, 4158, 4163, 4199, 4203, 4206, 4209, 4214, 4218, 4223, 4233, 4264, 4264, 4293, 4293, 4315, 4342, 4359, 4364, 4359, 4372, 4373, 4374, 4374, 4390, 4391, 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 4418, 4419, 4420, 4421, 4422, 4423, 4424, 4433, 4461, 4488, 4519, 4534, 4551, 4569, 4588, 4607, 4614, 4621, 4628, 4636, 4644, 4647, 4651, 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4664, 4671, 4678, 4687, 4696, 4705, 4717, 4720, 4723, 4724, 4728, 4730, 4738, 4750, 4751, 4752, 4753, 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, 4776, 4787, 4791, 4794, 4798, 4802, 4812, 4820, 4828, 4841, 4845, 4848, 4852, 4856, 4884, 4892, 4904, 4919, 4929, 4938, 4949, 4953, 4957, 4964, 4981, 4998, 5006, 5014, 5023, 5032, 5036, 5045, 5056, 5067, 5079, 5089, 5103, 5111, 5120, 5129, 5133, 5142, 5153, 5164, 5176, 5186, 5196, 5207, 5220, 5227, 5235, 5251, 5259, 5270, 5281, 5292, 5311, 5319, 5336, 5344, 5351, 5358, 5369, 5380, 5391, 5411, 5432, 5438, 5444, 5451, 5458, 5467, 5476, 5479, 5488, 5497, 5504, 5511, 5518, 5528, 5539, 5550, 5561, 5568, 5575, 5578, 5595, 5605, 5612, 5618, 5623, 5629, 5633, 5639, 5640, 5641, 5647, 5653, 5657, 5658, 5662, 5669, 5672, 5673, 5677, 5678, 5680, 5683, 5686, 5691, 5702, 5727, 5730, 5784, 5788, 5792, 5796, 5800, 5804, 5808, 5812, 5816, 5820, 5824, 5828, 5832, 5836, 5842, 5842, 5856, 5861, 5864, 5870, 5883, 5897, 5898, 5901, 5902, 5906, 5912, 5915, 5919, 5924, 5932, 5944, 5959, 5960, 5979, 5980, 5984, 5989, 5994, 5995, 6000, 6013, 6028, 6035, 6052, 6059, 6066, 6073, 6081, 6089, 6093, 6097, 6103, 6104, 6105, 6106, 6107, 6108, 6109, 6110, 6113, 6117, 6121, 6125, 6129, 6133, 6137, 6141, 6145, 6149, 6153, 6157, 6161, 6165, 6179, 6183, 6187, 6193, 6197, 6201, 6205, 6209, 6225, 6230, 6233, 6238, 6243, 6243, 6244, 6247, 6264, 6273, 6273, 6291, 6291, 6309, 6310, 6311, 6314, 6318, 6322, 6326, 6332, 6335, 6339, 6345, 6349, 6353, 6359, 6362, 6367, 6368, 6371, 6374, 6377, 6380, 6385, 6390, 6395, 6400, 6405, 6412, 6418, 6422, 6426, 6434, 6442, 6450, 6459, 6468, 6475, 6484, 6485, 6488, 6489, 6490, 6491, 6494, 6506, 6512, 6521, 6522, 6523, 6526, 6527, 6528, 6531, 6532, 6535, 6540, 6544, 6547, 6550, 6553, 6556, 6561, 6565, 6568, 6575, 6581, 6584, 6589, 6592, 6598, 6603, 6607, 6610, 6613, 6616, 6621, 6625, 6628, 6631, 6637, 6640, 6643, 6651, 6654, 6657, 6661, 6666, 6679, 6683, 6688, 6694, 6698, 6703, 6707, 6714, 6717, 6722 }; #endif #if YYDEBUG || YYERROR_VERBOSE || 0 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "ID", "HBLOCK", "POUND", "STRING", "WSTRING", "INCLUDE", "IMPORT", "INSERT", "CHARCONST", "WCHARCONST", "NUM_INT", "NUM_FLOAT", "NUM_UNSIGNED", "NUM_LONG", "NUM_ULONG", "NUM_LONGLONG", "NUM_ULONGLONG", "NUM_BOOL", "TYPEDEF", "TYPE_INT", "TYPE_UNSIGNED", "TYPE_SHORT", "TYPE_LONG", "TYPE_FLOAT", "TYPE_DOUBLE", "TYPE_CHAR", "TYPE_WCHAR", "TYPE_VOID", "TYPE_SIGNED", "TYPE_BOOL", "TYPE_COMPLEX", "TYPE_TYPEDEF", "TYPE_RAW", "TYPE_NON_ISO_INT8", "TYPE_NON_ISO_INT16", "TYPE_NON_ISO_INT32", "TYPE_NON_ISO_INT64", "LPAREN", "RPAREN", "COMMA", "SEMI", "EXTERN", "INIT", "LBRACE", "RBRACE", "PERIOD", "CONST_QUAL", "VOLATILE", "REGISTER", "STRUCT", "UNION", "EQUAL", "SIZEOF", "MODULE", "LBRACKET", "RBRACKET", "BEGINFILE", "ENDOFFILE", "ILLEGAL", "CONSTANT", "NAME", "RENAME", "NAMEWARN", "EXTEND", "PRAGMA", "FEATURE", "VARARGS", "ENUM", "CLASS", "TYPENAME", "PRIVATE", "PUBLIC", "PROTECTED", "COLON", "STATIC", "VIRTUAL", "FRIEND", "THROW", "CATCH", "EXPLICIT", "STATIC_ASSERT", "CONSTEXPR", "THREAD_LOCAL", "DECLTYPE", "AUTO", "NOEXCEPT", "OVERRIDE", "FINAL", "USING", "NAMESPACE", "NATIVE", "INLINE", "TYPEMAP", "EXCEPT", "ECHO", "APPLY", "CLEAR", "SWIGTEMPLATE", "FRAGMENT", "WARN", "LESSTHAN", "GREATERTHAN", "DELETE_KW", "DEFAULT", "LESSTHANOREQUALTO", "GREATERTHANOREQUALTO", "EQUALTO", "NOTEQUALTO", "ARROW", "QUESTIONMARK", "TYPES", "PARMS", "NONID", "DSTAR", "DCNOT", "TEMPLATE", "OPERATOR", "CONVERSIONOPERATOR", "PARSETYPE", "PARSEPARM", "PARSEPARMS", "CAST", "LOR", "LAND", "OR", "XOR", "AND", "LSHIFT", "RSHIFT", "PLUS", "MINUS", "STAR", "SLASH", "MODULO", "UMINUS", "NOT", "LNOT", "DCOLON", "$accept", "program", "interface", "declaration", "swig_directive", "extend_directive", "$@1", "apply_directive", "clear_directive", "constant_directive", "echo_directive", "except_directive", "stringtype", "fname", "fragment_directive", "include_directive", "$@2", "includetype", "inline_directive", "insert_directive", "module_directive", "name_directive", "native_directive", "pragma_directive", "pragma_arg", "pragma_lang", "rename_directive", "rename_namewarn", "feature_directive", "stringbracesemi", "featattr", "varargs_directive", "varargs_parms", "typemap_directive", "typemap_type", "tm_list", "tm_tail", "typemap_parm", "types_directive", "template_directive", "warn_directive", "c_declaration", "$@3", "c_decl", "c_decl_tail", "initializer", "cpp_alternate_rettype", "cpp_lambda_decl", "lambda_introducer", "lambda_body", "lambda_tail", "$@4", "c_enum_key", "c_enum_inherit", "c_enum_forward_decl", "c_enum_decl", "c_constructor_decl", "cpp_declaration", "cpp_class_decl", "@5", "@6", "cpp_opt_declarators", "cpp_forward_class_decl", "cpp_template_decl", "$@7", "cpp_temp_possible", "template_parms", "templateparameters", "templateparameter", "templateparameterstail", "cpp_using_decl", "cpp_namespace_decl", "$@8", "$@9", "cpp_members", "$@10", "$@11", "$@12", "cpp_member", "cpp_constructor_decl", "cpp_destructor_decl", "cpp_conversion_operator", "cpp_catch_decl", "cpp_static_assert", "cpp_protection_decl", "cpp_swig_directive", "cpp_end", "cpp_vend", "anonymous_bitfield", "anon_bitfield_type", "extern_string", "storage_class", "parms", "rawparms", "ptail", "parm", "valparms", "rawvalparms", "valptail", "valparm", "def_args", "parameter_declarator", "plain_declarator", "declarator", "notso_direct_declarator", "direct_declarator", "abstract_declarator", "direct_abstract_declarator", "pointer", "type_qualifier", "type_qualifier_raw", "type", "rawtype", "type_right", "decltype", "primitive_type", "primitive_type_list", "type_specifier", "definetype", "$@13", "default_delete", "deleted_definition", "explicit_default", "ename", "optional_constant_directive", "enumlist", "edecl", "etype", "expr", "valexpr", "exprnum", "exprcompound", "ellipsis", "variadic", "inherit", "raw_inherit", "$@14", "base_list", "base_specifier", "@15", "@16", "access_specifier", "templcpptype", "cpptype", "classkey", "classkeyopt", "opt_virtual", "virt_specifier_seq", "exception_specification", "cpp_const", "ctor_end", "ctor_initializer", "mem_initializer_list", "mem_initializer", "less_valparms_greater", "identifier", "idstring", "idstringopt", "idcolon", "idcolontail", "idtemplate", "idtemplatetemplate", "idcolonnt", "idcolontailnt", "string", "wstring", "stringbrace", "options", "kwargs", "stringnum", "empty", YY_NULLPTR }; #endif # ifdef YYPRINT /* YYTOKNUM[NUM] -- (External) token number corresponding to the (internal) symbol number NUM (which must be that of a token). */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395 }; # endif #define YYPACT_NINF -1018 #define yypact_value_is_default(Yystate) \ (!!((Yystate) == (-1018))) #define YYTABLE_NINF -580 #define yytable_value_is_error(Yytable_value) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { 564, 4133, 4205, 188, 63, 3623, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 159, -1018, -1018, -1018, -1018, -1018, 262, 257, 264, 32, -1018, -1018, 179, 250, 256, 292, 382, 4850, 728, 129, 728, -1018, -1018, -1018, 2504, -1018, 292, 256, -1018, 75, -1018, 396, 406, 4567, -1018, 293, -1018, -1018, -1018, 416, -1018, -1018, 36, 446, 4277, 452, -1018, -1018, 446, 457, 461, 465, 530, -1018, -1018, 478, 439, 361, 22, 137, 471, 488, 218, 492, 498, 551, 4638, 4638, 524, 535, 579, 567, 752, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 446, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 1559, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 31, 4709, -1018, 562, -1018, -1018, 571, 578, 292, 57, 401, 2151, -1018, -1018, -1018, 728, -1018, 3295, 585, 85, 2285, 3089, 33, 1089, 1235, 69, 292, -1018, -1018, 245, 307, 245, 327, 1652, 525, -1018, -1018, -1018, -1018, -1018, 207, 305, -1018, -1018, -1018, 604, -1018, 614, -1018, -1018, 409, -1018, -1018, 401, 48, 409, 409, -1018, 620, 1654, -1018, 8, 879, 316, 207, 207, -1018, 409, 4495, -1018, -1018, 4567, -1018, -1018, -1018, -1018, -1018, 292, 298, -1018, 120, 621, 207, -1018, -1018, 409, 207, -1018, -1018, -1018, 663, 4567, 626, 479, 653, 634, 409, 579, 663, 4567, 4567, 292, 579, 2124, 1870, 1873, 409, 532, 594, -1018, -1018, 1654, 292, 1672, 217, -1018, 675, 677, 660, 207, -1018, -1018, 75, 639, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 3089, 427, 3089, 3089, 3089, 3089, 3089, 3089, 3089, -1018, 654, -1018, 695, 705, 374, 2904, 19, -1018, -1018, 663, 753, -1018, -1018, 3408, 1382, 1382, 721, 729, 1161, 656, 734, -1018, -1018, -1018, 731, 3089, -1018, -1018, -1018, -1018, 4281, -1018, 2904, 756, 3408, 769, 292, 370, 327, -1018, 773, 370, 327, -1018, 714, -1018, -1018, 4567, 2419, -1018, 4567, 2553, 801, 1336, 1838, 370, 327, 736, 1779, -1018, -1018, 75, 814, 4567, -1018, -1018, -1018, -1018, 829, 663, 292, -1018, -1018, 38, 832, -1018, -1018, 387, 245, 286, -1018, 840, -1018, -1018, -1018, -1018, 292, -1018, 850, 839, 641, 852, 858, -1018, 861, 865, -1018, 4780, -1018, 292, -1018, 863, 868, -1018, 869, 870, 4638, -1018, -1018, -1018, -1018, -1018, 4638, -1018, -1018, -1018, 871, -1018, -1018, 744, 219, 872, 813, -1018, 883, -1018, 56, -1018, -1018, 34, 156, 156, 156, 301, 810, 886, 153, 887, 1897, 2157, 815, 1779, 822, 49, 859, 357, -1018, 3480, 1081, -1018, 891, -1018, 359, -1018, -1018, -1018, -1018, 256, -1018, 401, 2387, 4780, 892, 3172, 1887, -1018, -1018, -1018, -1018, -1018, -1018, 2151, -1018, -1018, -1018, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, 3089, -1018, 379, 379, 405, 828, 27, -1018, 559, -1018, -1018, 379, 379, 633, 830, 156, 156, 3089, 2904, -1018, 4567, 1814, 18, 899, -1018, 4567, 2687, 903, -1018, 912, -1018, 4642, 913, -1018, 4729, 907, 908, 370, 327, 914, 370, 327, 1718, 916, 922, 2291, 370, -1018, -1018, 614, 235, -1018, -1018, 409, 1964, -1018, 917, 918, -1018, 926, -1018, 597, 1331, 2376, 932, 4567, 1654, 928, -1018, 479, 3725, 933, -1018, 713, 4638, 285, 935, 931, 634, 487, 936, 409, 4567, 124, 889, 4567, -1018, -1018, -1018, 156, 1159, 1388, 23, -1018, 2239, 4920, 924, 4850, 355, -1018, 941, 810, 949, 145, 900, 905, 308, -1018, 800, -1018, 245, 919, -1018, -1018, 950, -1018, 292, 3089, 2821, 2955, 3223, 121, 129, 944, 695, 934, 934, 1281, 1281, 2787, 3261, 3172, 1618, 2528, 1887, 503, 503, 678, 678, -1018, -1018, -1018, 830, -1018, -1018, -1018, -1018, 379, 652, 307, 4854, 959, 770, 830, -1018, 1388, 1388, 960, -1018, 4866, 1388, -1018, -1018, -1018, -1018, 1388, 954, 955, 962, 963, 2373, 370, 327, 964, 968, 969, 370, -1018, -1018, -1018, 663, 3827, -1018, 965, -1018, 219, 966, -1018, -1018, -1018, -1018, -1018, 663, -1018, -1018, -1018, 979, -1018, 460, 663, -1018, 970, 182, 793, 1331, -1018, 460, -1018, 977, -1018, -1018, 3929, 41, 4780, 442, -1018, -1018, 4567, -1018, -1018, 882, -1018, 161, 925, -1018, 984, 980, -1018, 292, 1233, 883, -1018, 460, 260, 1388, -1018, -1018, -1018, 1081, -1018, -1018, -1018, -1018, 214, -1018, -1018, 967, 1061, 4567, 3089, -1018, -1018, -1018, -1018, 1654, -1018, -1018, -1018, -1018, 245, -1018, -1018, 988, -1018, 772, -1018, 2023, -1018, 245, 2904, 3089, 3089, 3223, 3550, 3089, 992, 995, 996, 998, -1018, 3089, -1018, -1018, -1018, -1018, 838, 370, -1018, -1018, 370, 370, 1388, 1388, 999, 1001, 1002, 370, 1388, 1003, 1005, -1018, 409, 409, 2023, 4567, 779, -1018, 124, -1018, 1964, 1427, 409, 1013, -1018, 460, 1000, -1018, -1018, 663, 1654, 118, -1018, 4638, -1018, 1014, 362, 207, 368, -1018, 2151, 294, -1018, 1008, 36, 1006, 789, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 4348, -1018, 4031, 1028, -1018, 308, 4567, -1018, 389, -1018, 207, 424, -1018, 4567, 286, 1018, 1007, -1018, 1015, 2520, 1081, -1018, 919, -1018, -1018, -1018, 292, -1018, -1018, -1018, 1029, 1009, 1010, 1012, 938, 207, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 1027, 2023, -1018, -1018, -1018, -1018, -1018, -1018, -1018, -1018, 4420, 1031, 2023, -1018, 2904, 2904, 2904, 3089, 3089, -1018, 4780, 3038, -1018, 370, 370, 1388, 1034, 1041, 370, 1388, 1388, -1018, -1018, 1032, 1049, -1018, -1018, 663, 1054, -1018, 460, 1444, 124, -1018, 1056, -1018, 1059, -1018, -1018, 161, -1018, -1018, 161, 1017, -1018, -1018, 4780, -1018, 4567, 1654, 4780, 1736, -1018, -1018, -1018, 1072, -1018, -1018, -1018, 967, 1063, 967, 1496, 1077, 1084, 286, 292, 520, -1018, -1018, -1018, 308, -1018, 1080, 919, 2023, -1018, -1018, -1018, -1018, 207, 1094, 1512, -1018, 1060, 1067, 1068, 1071, 1076, 242, 1101, 2904, 2904, 129, 370, 1388, 1388, 370, 370, -1018, 1110, -1018, 1111, -1018, 460, -1018, -1018, -1018, -1018, -1018, 1113, 479, 1055, 72, 3480, 460, 1115, -1018, 3089, 207, -1018, 1081, 550, -1018, 1120, 1124, 1119, 234, -1018, -1018, -1018, 1125, -1018, -1018, -1018, 292, -1018, 2023, 1128, 4567, -1018, -1018, 1081, 3089, -1018, 1512, 1131, 370, 370, -1018, -1018, 1132, -1018, 1137, -1018, 4567, 1134, 1141, 13, 1142, -3, -1018, -1018, 2904, 967, 308, -1018, -1018, -1018, 292, 1143, -1018, -1018, 1144, 1080, 1135, 4567, 1148, 308, 2653, -1018, -1018, -1018, -1018, 1152, 4567, 4567, 4567, 1145, 1061, 4780, 389, -1018, -1018, 1150, 1154, -1018, -1018, -1018, 1162, 460, -1018, -1018, 460, 1165, 1169, 1178, 4567, -1018, 1177, -1018, 1176, -1018, 2023, 460, -1018, 483, -1018, 519, 460, 460, 460, 1184, 389, 1180, -1018, -1018, -1018, -1018, 286, -1018, -1018, 286, -1018, -1018, -1018, 460, -1018, -1018, 1183, 1188, -1018, -1018, -1018 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_uint16 yydefact[] = { 579, 0, 0, 0, 0, 0, 10, 4, 529, 389, 397, 390, 391, 394, 395, 392, 393, 379, 396, 378, 398, 381, 399, 400, 401, 402, 0, 369, 370, 371, 492, 493, 145, 487, 488, 0, 530, 531, 0, 0, 541, 0, 0, 0, 367, 579, 374, 384, 377, 386, 387, 491, 0, 548, 382, 539, 6, 0, 0, 579, 1, 15, 64, 60, 61, 0, 261, 14, 256, 579, 0, 0, 82, 83, 579, 579, 0, 0, 260, 262, 263, 0, 264, 265, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 11, 18, 19, 20, 21, 22, 23, 24, 25, 579, 26, 27, 28, 29, 30, 31, 32, 0, 33, 34, 35, 36, 37, 38, 12, 113, 118, 115, 114, 16, 13, 154, 155, 156, 157, 158, 159, 257, 0, 275, 0, 147, 146, 0, 0, 0, 0, 0, 579, 542, 380, 3, 373, 368, 579, 0, 403, 0, 0, 541, 352, 351, 366, 0, 298, 281, 579, 305, 579, 348, 342, 332, 295, 375, 388, 383, 549, 0, 0, 537, 5, 8, 0, 276, 579, 278, 17, 0, 563, 273, 0, 255, 0, 0, 570, 0, 0, 372, 548, 0, 579, 0, 0, 78, 0, 579, 268, 272, 579, 266, 269, 267, 274, 271, 0, 0, 189, 548, 0, 0, 62, 63, 0, 0, 51, 49, 46, 47, 579, 0, 579, 0, 579, 579, 0, 112, 579, 579, 0, 0, 0, 0, 0, 0, 0, 332, 259, 258, 0, 579, 0, 579, 283, 0, 0, 0, 0, 543, 550, 540, 0, 565, 429, 430, 441, 442, 443, 444, 445, 446, 447, 448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 284, 579, 422, 372, 0, 421, 423, 427, 424, 428, 286, 376, 579, 352, 351, 0, 0, 342, 382, 0, 293, 408, 409, 291, 0, 405, 406, 407, 358, 0, 421, 294, 0, 579, 0, 0, 307, 350, 324, 0, 306, 349, 364, 365, 333, 296, 579, 0, 297, 579, 0, 0, 345, 344, 302, 343, 324, 353, 547, 546, 545, 0, 0, 277, 280, 533, 532, 0, 534, 0, 562, 116, 573, 0, 68, 45, 0, 579, 403, 70, 0, 495, 496, 494, 497, 0, 498, 0, 74, 0, 0, 0, 98, 0, 0, 185, 0, 579, 0, 187, 0, 0, 103, 0, 0, 0, 107, 299, 300, 301, 42, 0, 104, 106, 535, 0, 536, 54, 0, 53, 0, 0, 178, 579, 182, 491, 180, 169, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 324, 0, 0, 332, 579, 548, 411, 579, 579, 475, 0, 474, 383, 477, 489, 490, 385, 0, 538, 0, 0, 0, 0, 439, 438, 467, 466, 440, 468, 469, 528, 0, 285, 288, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 352, 351, 342, 382, 0, 332, 0, 362, 360, 345, 344, 0, 332, 353, 0, 0, 404, 359, 579, 342, 382, 0, 325, 579, 0, 0, 363, 0, 338, 0, 0, 356, 0, 0, 0, 304, 347, 0, 303, 346, 354, 0, 0, 0, 308, 544, 7, 579, 0, 170, 579, 0, 0, 569, 0, 0, 69, 0, 77, 0, 0, 0, 0, 0, 0, 0, 186, 579, 0, 0, 579, 579, 0, 0, 108, 0, 579, 0, 0, 0, 0, 0, 167, 0, 179, 184, 58, 0, 0, 0, 0, 79, 0, 0, 0, 0, 0, 149, 0, 382, 0, 506, 501, 502, 0, 127, 579, 507, 579, 579, 162, 166, 0, 551, 0, 431, 0, 0, 366, 0, 579, 0, 579, 464, 463, 461, 462, 0, 460, 459, 455, 456, 454, 457, 458, 449, 450, 451, 452, 453, 0, 353, 336, 335, 334, 354, 0, 315, 0, 0, 0, 324, 326, 353, 0, 0, 329, 0, 0, 340, 339, 361, 357, 0, 0, 0, 0, 0, 0, 309, 355, 0, 0, 0, 311, 279, 66, 67, 65, 0, 574, 575, 578, 577, 571, 44, 43, 39, 76, 73, 75, 568, 93, 567, 0, 88, 579, 566, 92, 0, 577, 0, 0, 99, 579, 227, 0, 190, 191, 0, 256, 0, 0, 50, 48, 579, 41, 105, 0, 556, 554, 0, 57, 0, 0, 110, 0, 579, 579, 579, 579, 0, 0, 133, 132, 134, 579, 136, 131, 135, 140, 0, 148, 150, 579, 579, 579, 0, 508, 504, 503, 126, 0, 123, 125, 121, 128, 579, 129, 499, 476, 478, 480, 500, 0, 160, 579, 432, 0, 0, 366, 365, 0, 0, 0, 0, 0, 287, 0, 337, 292, 341, 327, 0, 317, 331, 330, 316, 312, 0, 0, 0, 0, 0, 310, 0, 0, 0, 117, 0, 0, 0, 579, 510, 511, 0, 513, 0, 0, 0, 0, 90, 579, 0, 119, 188, 255, 0, 548, 101, 0, 100, 0, 0, 0, 0, 552, 579, 0, 52, 0, 256, 0, 0, 171, 172, 176, 175, 168, 173, 177, 174, 0, 183, 0, 0, 81, 0, 579, 141, 0, 412, 417, 0, 413, 579, 403, 511, 579, 153, 0, 0, 579, 130, 579, 485, 484, 486, 0, 482, 198, 218, 0, 0, 0, 0, 262, 0, 240, 241, 233, 242, 216, 196, 238, 234, 232, 235, 236, 237, 239, 217, 213, 214, 200, 208, 207, 211, 210, 0, 0, 201, 202, 206, 212, 203, 204, 205, 215, 0, 275, 0, 282, 435, 434, 433, 0, 0, 425, 0, 465, 328, 314, 313, 0, 0, 0, 318, 0, 0, 576, 572, 0, 0, 512, 84, 577, 95, 89, 579, 0, 0, 97, 0, 71, 0, 109, 557, 555, 561, 560, 559, 0, 55, 56, 0, 228, 579, 0, 0, 0, 59, 80, 122, 0, 143, 142, 139, 579, 418, 579, 0, 0, 0, 0, 0, 0, 521, 505, 509, 0, 479, 579, 579, 0, 193, 230, 229, 231, 0, 0, 0, 192, 379, 378, 381, 0, 377, 382, 0, 437, 436, 579, 319, 0, 0, 323, 322, 40, 0, 96, 0, 91, 579, 86, 72, 102, 553, 558, 0, 579, 0, 0, 579, 579, 0, 416, 0, 415, 151, 579, 0, 518, 0, 520, 522, 0, 514, 515, 124, 0, 472, 481, 473, 0, 199, 0, 0, 579, 164, 163, 579, 0, 209, 0, 0, 321, 320, 94, 85, 0, 111, 0, 167, 579, 0, 0, 0, 0, 0, 144, 419, 420, 579, 0, 516, 517, 519, 0, 0, 526, 527, 0, 579, 0, 579, 0, 0, 0, 161, 426, 87, 120, 0, 579, 579, 579, 0, 579, 0, 0, 414, 152, 523, 0, 471, 483, 194, 0, 579, 165, 249, 579, 0, 0, 0, 579, 219, 0, 137, 0, 524, 0, 579, 220, 0, 226, 0, 579, 579, 579, 0, 0, 0, 195, 221, 243, 245, 0, 246, 248, 403, 224, 223, 222, 579, 138, 525, 0, 0, 225, 244, 247 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -1018, -1018, -367, -1018, -1018, -1018, -1018, 44, 68, -4, 77, -1018, 706, -1018, 82, 84, -1018, -1018, -1018, 97, -1018, 99, -1018, 100, -1018, -1018, 105, -1018, 109, -540, -643, 110, -1018, 117, -1018, -353, 683, -71, 119, 146, 152, 174, -1018, 533, -792, -692, -1018, -1018, -1018, -862, -1017, -1018, -134, -1018, -1018, -1018, -1018, -1018, 10, -1018, -1018, 208, 24, 46, -1018, -1018, 304, -1018, 682, 542, 190, -1018, -1018, -1018, -742, -1018, -1018, -1018, -1018, 545, -1018, 553, 199, 554, -1018, -1018, -1018, -474, -1018, -1018, -1018, 45, -56, -1018, 730, 16, 451, -1018, 661, 804, -25, -584, -534, -95, 1102, -200, -145, 745, 62, 35, -1018, -68, 54, -11, 691, -541, 1211, -1018, -347, -1018, -150, -1018, -1018, -1018, -867, -1018, 263, -1018, 937, -136, -499, -1018, -1018, 210, 831, -1018, -1018, -1018, 430, -1018, -1018, -1018, -214, -52, -1018, -1018, 313, 697, -382, -614, 206, -1018, -1018, 231, -30, 123, -116, -1018, 946, -218, -139, 1116, -1018, -393, 1109, -1018, 602, 230, -196, -505, 0 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { -1, 4, 5, 99, 100, 101, 776, 853, 854, 855, 856, 106, 400, 401, 857, 858, 704, 109, 110, 859, 112, 860, 114, 861, 664, 202, 862, 117, 863, 670, 537, 864, 374, 865, 384, 231, 395, 232, 866, 867, 868, 869, 525, 125, 730, 579, 711, 126, 716, 825, 942, 1000, 41, 571, 127, 128, 129, 130, 870, 886, 739, 1025, 871, 872, 702, 813, 404, 405, 406, 559, 873, 135, 545, 380, 874, 1021, 1097, 959, 875, 876, 877, 878, 879, 880, 881, 882, 1099, 1101, 883, 971, 137, 884, 298, 183, 346, 184, 282, 283, 454, 284, 580, 165, 389, 166, 319, 167, 168, 169, 244, 43, 44, 285, 197, 46, 47, 48, 49, 50, 306, 307, 348, 309, 310, 426, 827, 828, 943, 1046, 287, 313, 289, 290, 1016, 1017, 432, 433, 584, 735, 736, 843, 958, 844, 51, 52, 367, 368, 737, 582, 779, 1102, 834, 951, 1009, 1010, 176, 53, 355, 398, 54, 179, 55, 259, 696, 801, 291, 292, 673, 193, 356, 659, 185 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { 6, 104, 196, 182, 249, 139, 308, 258, 681, 299, 149, 750, 288, 543, 530, 131, 700, 42, 57, 822, 164, 229, 243, 408, 230, 230, 385, 713, 657, 132, 938, 676, 152, 785, 907, 550, 315, 657, 341, 258, 353, 440, 188, 824, 417, 172, 238, 188, 583, 102, 138, 133, 246, 1071, 353, 45, 45, 780, 1094, 627, 8, -290, 361, 60, 627, 788, 212, 329, 617, 194, 250, 350, 145, 103, 194, 203, 1001, 357, 1003, 153, 526, 173, 105, 363, 330, 391, 251, 107, 372, 108, 1121, 820, 527, 561, 354, 260, 479, 481, -181, 213, 486, 360, 111, 569, 113, 115, 833, 170, 1074, 194, 116, 148, 1039, 45, 118, 119, 247, 397, 27, 28, 29, 189, 120, -290, 121, 520, 189, 419, 666, 149, 188, 303, 8, 967, 628, 390, 148, 786, 352, 707, 8, 328, 1072, 331, 974, 955, 36, 37, 293, 375, 299, 122, 376, 424, 190, 430, 8, 123, 654, 8, -181, 919, 747, 1014, 281, 423, 172, 667, 172, 154, 668, 299, 387, 916, 381, 256, 257, 155, 684, 124, 403, 1076, 1075, 156, 347, 722, 157, 294, 353, 58, 304, 305, 177, 198, 687, 134, 359, 326, 1040, 732, 369, 1041, 286, 162, 136, 158, 162, 140, 45, 217, 8, 308, 479, 481, 486, 178, 300, 1020, 36, 37, 8, 148, 220, 148, 325, 353, 36, 37, 59, 214, 392, 1107, 396, 399, 577, 578, -534, 409, 669, 651, 910, 188, 36, 37, 38, 36, 37, 748, 159, 428, 749, 435, 38, 407, 823, 160, 40, 1077, 161, 45, 824, 164, 45, 162, 221, 555, 353, 163, 38, 985, 1085, 38, 40, 502, 1055, 159, 505, 912, 799, 1059, 1056, 652, 45, 657, 455, 1028, 172, 162, 621, 622, 45, 45, 170, 431, 163, 8, 36, 37, 928, 156, 986, 800, 414, 821, 200, 143, 36, 37, 8, 726, 349, 542, 144, 1049, 141, 349, 349, 288, -254, 146, 230, 158, 349, 551, 370, 371, 230, 349, 688, 583, 655, 689, 38, 142, 1062, 529, 40, 819, 832, 239, 929, 378, 383, 972, 408, 349, 386, 329, 170, 45, 727, 728, 379, 147, 729, 1109, 349, 477, 698, 148, 172, 522, 621, 415, 330, 8, 349, 332, 364, 365, 45, 8, 427, 573, 1035, 595, 989, 8, 494, 439, 6, 36, 37, 45, 333, 1044, 45, 366, 501, 589, 8, 304, 305, 1030, 36, 37, 909, 391, 718, 45, -410, 719, 586, -410, 148, -579, 560, 38, 8, 588, 498, 40, 8, 186, 154, 188, -579, -548, -548, 295, 674, 414, 155, 256, 342, 151, 572, 499, 156, 940, 172, 157, 941, -410, 435, 431, 157, 624, 210, 180, 671, -548, 630, 211, 679, 295, 666, 390, 188, 181, 158, 36, 37, 30, 31, 583, 187, 36, 37, 833, 148, 1037, 157, 36, 37, 581, 945, 443, 705, 281, 1100, 946, 33, 34, 8, 444, 36, 37, -579, 230, 564, 922, 8, 45, 948, 794, 192, 925, 668, 38, 8, 414, 199, 159, 36, 37, 795, 201, 36, 37, 160, 204, 38, 161, 594, 205, 40, 286, 162, 27, 28, 29, 163, 412, 304, 305, 413, 216, 208, 154, 38, 162, 347, 209, 40, 6, 1111, 155, 219, 1112, 992, 484, 222, 993, 485, 8, 157, 1113, 223, 104, 575, 224, 392, 139, 225, 6, 139, 45, 576, 577, 578, 396, 45, 131, 678, 226, 731, 188, 733, 717, 36, 37, 1114, 1012, 233, 1115, 1013, 132, 36, 37, 164, 699, 418, 1116, 407, 234, 36, 37, 905, 906, 334, 172, 787, 172, 738, 188, 38, 102, 138, 133, 40, 686, 45, 1050, 38, 172, 1051, 455, 159, 329, 618, 663, 693, 188, 170, 160, 694, 236, 161, 45, 252, 103, 45, 162, 206, 207, 330, 163, 792, 253, 105, 36, 37, 583, 1110, 107, 254, 108, 746, 1117, 1118, 1119, 837, 302, 797, 469, 470, 471, 472, 473, 111, 340, 113, 115, 583, 344, 1125, 38, 116, 349, 104, 40, 118, 119, 139, 325, 345, 170, 420, 349, 120, 421, 121, 358, 131, 835, 288, 382, 674, 353, 318, 781, 388, 329, 619, 695, 394, 349, 132, 781, 104, 308, 535, 536, 139, 1, 2, 3, 914, 122, 330, 832, 329, 754, 131, 123, 393, 918, 102, 138, 133, 438, 139, 560, 6, 781, 778, 838, 132, 330, 423, 172, 810, 965, 778, 826, 887, 124, 408, 829, 781, 908, 103, 436, 920, 437, 811, 230, 102, 138, 133, 105, 172, 134, 66, 152, 107, 453, 108, 885, 778, 172, 136, 441, 45, 456, 581, 817, 812, 935, 249, 111, 103, 113, 115, 778, 238, 685, 452, 116, 474, 105, 482, 118, 119, 251, 107, 939, 108, 1124, 483, 120, 488, 121, 947, 45, 885, 27, 28, 29, 746, 111, 489, 113, 115, 553, 554, 781, 490, 116, 78, 79, 80, 118, 119, 82, 493, 83, 84, 1008, 122, 120, 293, 121, 30, 31, 123, 325, 501, 793, 498, 757, 471, 472, 473, 104, 935, 496, 281, 139, 988, 500, 778, 33, 34, 1022, 977, 499, 124, 131, 122, 45, 251, 952, 783, 784, 123, 172, 424, 738, 430, 30, 31, 132, 134, 840, 841, 842, 162, 508, 391, 1005, 515, 136, 156, 237, 286, 521, 124, 575, 33, 34, 995, 102, 138, 133, 997, 576, 577, 578, 523, 1026, 581, 528, 134, 885, 158, 45, 498, 896, 575, 531, 8, 136, 45, 188, 885, 103, 576, 577, 578, 533, 932, 534, 538, 499, 105, 349, 349, 539, 390, 107, 540, 108, 546, 320, 324, 349, 541, 547, 548, 549, 552, 556, 781, 338, 111, 557, 113, 115, 362, 923, 924, 926, 116, 558, 562, 563, 118, 119, 566, 567, 409, 568, 1026, 570, 120, 585, 121, 826, 596, 826, 1043, 829, 616, 829, 620, 629, 407, 778, 944, 633, 164, 634, 636, 638, 639, 1018, 738, 885, 660, 661, 640, 1123, 646, 122, 308, 1061, 36, 37, 647, 123, 662, 677, 680, 690, 683, 172, 691, 697, 701, 715, 720, 1068, 304, 305, 45, 150, 781, 721, 724, 171, 751, 124, 725, 392, 740, 734, 175, 781, 756, 760, 764, 765, 1083, 172, 1093, 774, 775, 134, 766, 767, 770, 1088, 1089, 1090, 771, 772, 136, 777, 789, 885, 798, 778, 782, 803, 172, 804, 802, 70, 839, 215, 218, 891, 778, 1106, 892, 893, 894, 170, 581, 320, 324, 917, 826, 338, 931, 899, 829, 900, 901, 903, 45, 904, 915, 921, 953, 170, 1018, 1042, 414, 581, 930, 245, 467, 468, 469, 470, 471, 472, 473, 937, 949, 781, 966, 960, 964, 45, -197, 983, 511, 514, 979, 950, 781, 961, 962, 781, 963, 980, 984, 255, 8, 45, 312, 314, 784, 885, 781, 990, 301, 830, 991, 781, 781, 781, 321, 321, 778, 327, 27, 28, 29, 999, 45, 831, 339, 1002, 1006, 778, 781, 994, 778, 45, 45, 45, 944, 1007, 1015, 316, 27, 28, 29, 778, 1023, 156, -252, 317, 778, 778, 778, 575, 245, -251, -253, 45, 157, 1027, 1029, 576, 577, 578, -250, 1033, 1034, 778, 1036, 158, 1045, 1038, 377, 575, 8, 1052, 8, 188, 1053, 1054, 1060, 576, 577, 578, 1065, 1057, 1069, 1066, 171, 191, 36, 37, 1067, 1070, 1082, 1073, 410, 1091, 416, 321, 321, 1084, 422, 1079, 1080, 1087, 425, 150, 245, 434, 1095, 359, 227, 154, 1096, 1098, 38, 235, 1103, 155, 40, 442, 1104, 445, 446, 447, 448, 449, 450, 451, 157, 1105, 320, 324, 338, 824, 1108, 1120, 1126, 318, 1122, 511, 514, 1127, 171, 656, 692, 809, 996, 1064, 8, 338, 703, 478, 480, 480, 491, 818, 487, 814, 36, 37, 36, 37, 650, 927, 66, 815, 816, 597, 752, 712, 645, 174, 495, 323, 497, 587, 1048, 504, 1081, 956, 507, 1019, 337, 723, 38, 316, 38, 806, 159, 1092, 159, 321, 321, 322, 1078, 241, 321, 484, 242, 796, 485, 0, 157, 162, 343, 0, 351, 163, 524, 163, 0, 351, 351, 0, 0, 416, 0, 0, 351, 0, 78, 79, 80, 351, 532, 82, 807, 83, 84, 0, 0, 0, 0, 0, 36, 37, 0, 544, 0, 0, 0, 351, 0, 0, 8, 666, 0, 188, 0, 8, 0, 0, 351, 402, 323, 0, 337, 0, 411, 351, 38, 808, 351, 0, 40, 0, 0, 0, 480, 480, 480, 0, 0, 0, 565, 645, 321, 321, 0, 321, 0, 359, 0, 318, 667, 574, 316, 668, 0, 155, 0, 0, 0, 0, 509, 8, 0, 0, 457, 458, 0, 8, 0, 157, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 467, 468, 469, 470, 471, 472, 473, 0, 0, 36, 37, 154, 615, 0, 36, 37, 623, 418, 0, 8, 0, 0, 0, 480, 480, 632, 510, 513, 157, 626, 0, 519, 0, 0, 669, 38, 8, 0, 0, 159, 38, 0, 0, 0, 40, 0, 241, 0, 0, 242, 321, 0, 0, 321, 162, 0, 359, 0, 163, 913, 36, 37, 0, 318, 155, 0, 36, 37, 0, 0, 245, 0, 0, 359, 245, 0, 987, 171, 0, 0, 0, 155, 0, 0, 0, 0, 38, 0, 8, 0, 159, 0, 38, 0, 0, 0, 40, 480, 245, 321, 0, 0, 321, 714, 8, 36, 37, 0, 0, 163, 0, 510, 513, 0, 519, 318, 742, 604, 607, 612, 0, 0, 36, 37, 741, 359, 0, 0, 1004, 0, 171, 38, 0, 155, 0, 159, 0, 0, 0, 0, 0, 359, 241, 0, 1024, 242, 0, 0, 38, 155, 162, 8, 159, 0, 163, 0, 0, 0, 0, 241, 0, 0, 242, 321, 321, 0, 0, 162, 321, 0, 0, 163, 0, 321, 36, 37, 0, 0, 321, 0, 0, 0, 0, 0, 0, 625, 0, 0, 240, 0, 36, 37, 0, 0, 0, 0, 155, 0, 0, 0, 38, 0, 0, 0, 159, 0, 644, 0, 0, 649, 0, 241, 245, 0, 242, 0, 38, 0, 0, 162, 159, 653, 0, 163, 351, 658, 0, 241, 0, 0, 242, 0, 665, 672, 675, 162, 805, 36, 37, 163, 0, 0, 321, 0, 8, 0, 8, 0, 836, 0, 0, 0, 351, 0, 672, 625, 0, 0, 644, 0, 0, 706, 245, 38, 8, 0, 0, 159, 0, 888, 889, 449, 0, 890, 241, 0, 0, 242, 0, 895, 0, 316, 162, 359, 0, 0, 163, 0, 0, 334, 0, 155, 0, 0, 0, 0, 0, 0, 157, 321, 321, 429, 0, 0, 0, 321, 0, 0, 0, 155, 8, 0, 0, 0, 457, 458, 459, 460, 245, 758, 759, 0, 0, 0, 762, 0, 0, 245, 8, 763, 36, 37, 36, 37, 769, 465, 466, 467, 468, 469, 470, 471, 472, 473, 0, 0, 0, 316, 0, 0, 36, 37, 0, 0, 0, 641, 38, 0, 38, 0, 40, 0, 159, 0, 157, 998, 0, 335, 0, 241, 336, 8, 242, 155, 0, 672, 38, 162, 957, 318, 159, 163, 0, 791, 0, 672, 0, 241, 0, 0, 242, 0, 0, 0, 0, 162, 36, 37, 758, 163, 0, 0, 0, 0, 0, 0, 8, 0, 418, 0, 0, 0, 0, 0, 36, 37, 516, 975, 976, 973, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 8, 0, 0, 642, 321, 0, 643, 0, 321, 321, 38, 0, 0, 316, 159, 318, 0, 0, 0, 0, 245, 241, 0, 0, 242, 897, 898, 36, 37, 162, 157, 902, 8, 163, 0, 8, 0, 316, 245, 0, 245, 0, 351, 351, 0, 512, 0, 0, 672, 0, 911, 245, 351, 38, 157, 1011, 0, 40, 0, 8, 0, 0, 36, 37, 517, 0, 0, 518, 0, 418, 0, 245, 418, 0, 791, 0, 318, 317, 0, 0, 322, 0, 171, 0, 321, 321, 36, 37, 38, 0, 0, 0, 40, 0, 0, 0, 418, 0, 1047, 484, 171, 0, 485, 574, 509, 0, 0, 0, 0, 0, 0, 318, 38, 0, 0, 0, 40, 0, 36, 37, 0, 36, 37, 1063, 1058, 0, 0, 0, 0, 188, 0, 0, 0, 0, 245, 318, 264, 265, 266, 267, 268, 269, 270, 271, 38, 36, 37, 38, 40, 0, 0, 40, 0, 457, 458, 459, 460, 0, 1011, 0, 978, 0, 0, 0, 981, 982, 0, 318, 0, 0, 318, 38, 0, 0, 0, 40, 467, 468, 469, 470, 471, 472, 473, 845, 672, -579, 62, 0, 0, 0, 63, 64, 65, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 66, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, 0, -579, -579, -579, -579, -579, 0, 0, 0, 846, 68, 0, 0, -579, 0, -579, -579, -579, -579, -579, 0, 0, 0, 0, 1031, 1032, 0, 0, 70, 71, 72, 73, 847, 75, 76, 77, -579, -579, -579, 848, 849, 850, 0, 78, 851, 80, 0, 81, 82, 807, 83, 84, -579, -579, 0, -579, -579, 85, 0, 0, 0, 89, 0, 91, 92, 93, 94, 95, 96, 0, 8, 0, 0, 188, 0, 0, 0, 0, 0, 97, 0, -579, 0, 0, 98, -579, -579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 188, 261, 0, 8, 852, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 0, 0, 0, 0, 0, 418, 0, 26, 27, 28, 29, 30, 31, 512, 273, 0, 0, 0, 0, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 0, 0, 0, 0, 304, 305, 0, 0, 0, 0, 0, 0, 35, 0, 38, 36, 37, 8, 40, 0, 0, 36, 37, 0, 0, 412, 0, 0, 413, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 39, 40, 0, 38, 0, 0, 0, 40, 274, 0, 418, 275, 0, 0, 276, 277, 278, 0, 641, 8, 279, 280, 188, 261, 0, 8, 318, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 0, 0, 36, 37, 0, 418, 0, 0, 27, 28, 29, 30, 31, 648, 273, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 32, 33, 34, 40, 0, 0, 0, 0, 0, 0, 642, 0, 0, 643, 0, 0, 35, 0, 0, 36, 37, 8, 318, 0, 8, 36, 37, 188, 0, 0, 0, 0, 0, 0, 264, 265, 266, 267, 268, 269, 270, 271, 0, 0, 0, 38, 0, 0, 0, 40, 0, 38, 0, 0, 0, 40, 274, 0, 418, 275, 0, 0, 276, 277, 278, 0, 768, 8, 279, 280, 188, 261, 0, 590, 318, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 0, 0, 36, 37, 0, 36, 37, 0, 27, 28, 29, 30, 31, 0, 273, 0, 0, 503, 0, 0, 0, 304, 305, 0, 0, 0, 0, 0, 38, 32, 33, 34, 40, 0, 457, 458, 459, 460, 0, 461, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 318, 462, 591, 464, 465, 592, 467, 468, 469, 470, 593, 472, 473, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 38, 18, 0, 20, 40, 0, 22, 23, 24, 25, 0, 274, 0, 0, 275, 0, 0, 276, 277, 278, 0, 0, 8, 279, 280, 188, 261, 954, 0, 0, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 0, 273, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 457, 458, 459, 460, 0, 461, 0, 0, 457, 458, 459, 460, 35, 0, 0, 36, 37, 0, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 466, 467, 468, 469, 470, 471, 472, 473, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 274, 0, 0, 275, 0, 0, 276, 277, 278, 0, 0, 8, 279, 280, 188, 261, 0, 1086, 0, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 0, 273, 0, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 457, 458, 459, 460, 0, 461, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 274, 0, 0, 275, 0, 0, 276, 277, 278, 0, 0, 8, 279, 280, 188, 261, 0, 0, 0, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 743, 753, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 457, 458, 459, 460, 0, 461, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 274, 0, 0, 275, 0, 0, 276, 277, 278, 0, 0, 8, 279, 280, 188, 261, 0, 0, 0, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 744, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 0, 273, 457, 458, 459, 460, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 35, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 274, 0, 0, 275, 0, 0, 276, 277, 278, 0, 0, 8, 279, 280, 188, 261, 0, 0, 0, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 0, 273, 457, 458, 459, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 35, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 274, 0, 0, 275, 0, 0, 276, 277, 278, 0, 0, 8, 279, 280, 188, 261, 0, 0, 0, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 272, 0, 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 0, 273, 457, 458, 459, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 0, 8, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 35, 0, 0, 36, 37, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 295, 0, 0, 38, 0, 0, 0, 40, 26, 27, 28, 29, 30, 31, 0, 0, 0, 157, 0, 0, 276, 277, 745, 0, 0, 0, 279, 280, 0, 0, 32, 33, 34, 457, 458, 459, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 8, 0, 39, 40, 0, 0, 0, 0, 0, 0, 296, 0, 0, 297, 0, 0, 0, 0, 162, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 295, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 0, 0, 0, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 38, 0, 0, 39, 40, 26, 27, 28, 29, 30, 31, 475, 0, 0, 476, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 38, 0, 0, 39, 40, 0, 0, 30, 31, 0, 0, 412, 0, 0, 413, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 32, 33, 34, -2, 61, 0, -579, 62, 0, 0, 0, 63, 64, 65, 0, 0, 35, 0, 0, 36, 37, 0, 0, 0, 66, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, 0, -579, -579, -579, -579, -579, 0, 0, 38, 67, 68, 0, 40, 0, 0, -579, -579, -579, -579, -579, 0, 0, 69, 0, 0, 0, 0, 162, 70, 71, 72, 73, 74, 75, 76, 77, -579, -579, -579, 0, 0, 0, 0, 78, 79, 80, 0, 81, 82, 0, 83, 84, -579, -579, 0, -579, -579, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 61, 0, -579, 62, 0, 0, 0, 63, 64, 65, 97, 0, -579, 0, 0, 98, -579, 0, 0, 0, 66, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, 0, -579, -579, -579, -579, -579, 0, 0, 0, 67, 68, 0, 0, 682, 0, -579, -579, -579, -579, -579, 0, 0, 69, 0, 0, 0, 0, 0, 70, 71, 72, 73, 74, 75, 76, 77, -579, -579, -579, 0, 0, 0, 0, 78, 79, 80, 0, 81, 82, 0, 83, 84, -579, -579, 0, -579, -579, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 61, 0, -579, 62, 0, 0, 0, 63, 64, 65, 97, 0, -579, 0, 0, 98, -579, 0, 0, 0, 66, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, 0, -579, -579, -579, -579, -579, 0, 0, 0, 67, 68, 0, 0, 773, 0, -579, -579, -579, -579, -579, 0, 0, 69, 0, 0, 0, 0, 0, 70, 71, 72, 73, 74, 75, 76, 77, -579, -579, -579, 0, 0, 0, 0, 78, 79, 80, 0, 81, 82, 0, 83, 84, -579, -579, 0, -579, -579, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 61, 0, -579, 62, 0, 0, 0, 63, 64, 65, 97, 0, -579, 0, 0, 98, -579, 0, 0, 0, 66, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, 0, -579, -579, -579, -579, -579, 0, 0, 0, 67, 68, 0, 0, 790, 0, -579, -579, -579, -579, -579, 0, 0, 69, 0, 0, 0, 0, 0, 70, 71, 72, 73, 74, 75, 76, 77, -579, -579, -579, 0, 0, 0, 0, 78, 79, 80, 0, 81, 82, 0, 83, 84, -579, -579, 0, -579, -579, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 61, 0, -579, 62, 0, 0, 0, 63, 64, 65, 97, 0, -579, 0, 0, 98, -579, 0, 0, 0, 66, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, -579, 0, -579, -579, -579, -579, -579, 0, 0, 0, 67, 68, 0, 0, 0, 0, -579, -579, -579, -579, -579, 0, 0, 69, 0, 0, 0, 936, 0, 70, 71, 72, 73, 74, 75, 76, 77, -579, -579, -579, 0, 0, 0, 0, 78, 79, 80, 0, 81, 82, 0, 83, 84, -579, -579, 0, -579, -579, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 97, 0, -579, 0, 0, 98, -579, 0, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 56, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 38, 0, 0, 39, 40, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 195, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 38, 0, 0, 39, 40, 0, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 457, 458, 459, 460, 38, 461, 0, 0, 40, 27, 28, 29, 30, 31, 0, 0, 0, 0, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 32, 33, 34, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 933, 0, 36, 37, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 968, 18, 969, 20, 0, 970, 22, 23, 24, 25, 0, 0, 0, 38, 0, 0, 0, 40, 934, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 35, 248, 373, 36, 37, 0, 0, 0, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 38, 0, 0, 0, 40, 934, 0, 0, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 38, 0, 0, 39, 40, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 228, 0, 0, 0, 38, 0, 0, 39, 40, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 635, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 457, 458, 459, 460, 38, 461, 0, 0, 40, 27, 28, 29, 30, 31, 0, 0, 0, 0, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 32, 33, 34, 0, 8, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 35, 248, 0, 36, 37, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 0, 38, 0, 0, 0, 40, 27, 28, 29, 30, 31, 0, 0, 457, 458, 459, 460, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 8, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 35, 0, 0, 36, 37, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 32, 33, 34, 8, 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 36, 37, 0, 9, 10, 11, 12, 13, 14, 15, 16, 708, 18, 709, 20, 0, 710, 22, 23, 24, 25, 0, 457, 458, 459, 460, 38, 461, 0, 0, 40, 0, 0, 0, 457, 458, 459, 460, 0, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 0, 0, 0, 35, 0, 0, 36, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 40 }; static const yytype_int16 yycheck[] = { 0, 5, 70, 59, 138, 5, 156, 146, 542, 154, 40, 595, 148, 380, 361, 5, 556, 1, 2, 711, 45, 92, 117, 237, 92, 93, 222, 568, 527, 5, 822, 536, 43, 676, 776, 388, 3, 536, 177, 178, 6, 259, 6, 46, 240, 45, 98, 6, 430, 5, 5, 5, 21, 40, 6, 1, 2, 671, 1075, 41, 3, 42, 54, 0, 41, 679, 44, 40, 41, 69, 138, 187, 40, 5, 74, 75, 943, 193, 945, 44, 42, 46, 5, 199, 57, 230, 138, 5, 204, 5, 1107, 705, 54, 59, 46, 147, 296, 297, 42, 77, 300, 196, 5, 54, 5, 5, 720, 45, 111, 109, 5, 103, 40, 59, 5, 5, 85, 233, 49, 50, 51, 85, 5, 104, 5, 343, 85, 243, 4, 159, 6, 46, 3, 875, 116, 230, 103, 677, 190, 116, 3, 166, 129, 168, 886, 837, 89, 90, 148, 205, 295, 5, 208, 248, 118, 250, 3, 5, 525, 3, 104, 43, 41, 955, 148, 116, 166, 43, 168, 40, 46, 316, 228, 787, 54, 118, 119, 48, 545, 5, 236, 1048, 1044, 54, 184, 40, 57, 152, 6, 1, 105, 106, 117, 70, 547, 5, 40, 162, 126, 581, 200, 129, 148, 134, 5, 76, 134, 48, 154, 86, 3, 361, 412, 413, 414, 140, 154, 959, 89, 90, 3, 103, 4, 103, 162, 6, 89, 90, 40, 92, 230, 1093, 232, 233, 89, 90, 54, 237, 114, 4, 780, 6, 89, 90, 115, 89, 90, 126, 119, 249, 129, 251, 115, 237, 40, 126, 119, 1049, 129, 205, 46, 286, 208, 134, 46, 46, 6, 138, 115, 912, 1062, 115, 119, 329, 40, 119, 332, 782, 117, 1021, 46, 46, 228, 782, 284, 43, 286, 134, 488, 489, 236, 237, 230, 76, 138, 3, 89, 90, 4, 54, 914, 140, 240, 43, 74, 48, 89, 90, 3, 1, 187, 379, 48, 1005, 52, 192, 193, 453, 76, 140, 388, 76, 199, 394, 201, 202, 394, 204, 43, 711, 526, 46, 115, 71, 1026, 360, 119, 704, 720, 109, 46, 43, 219, 884, 558, 222, 223, 40, 286, 295, 42, 43, 54, 103, 46, 1097, 233, 295, 554, 103, 360, 345, 562, 240, 57, 3, 243, 40, 52, 53, 316, 3, 249, 429, 988, 443, 916, 3, 316, 256, 380, 89, 90, 329, 57, 999, 332, 71, 326, 441, 3, 105, 106, 977, 89, 90, 778, 542, 43, 345, 43, 46, 43, 46, 103, 46, 406, 115, 3, 439, 40, 119, 3, 120, 40, 6, 42, 116, 117, 40, 536, 359, 48, 118, 119, 43, 426, 57, 54, 40, 430, 57, 43, 76, 434, 76, 57, 493, 77, 43, 535, 140, 498, 82, 539, 40, 4, 542, 6, 43, 76, 89, 90, 52, 53, 837, 40, 89, 90, 1073, 103, 995, 57, 89, 90, 430, 42, 40, 563, 453, 1084, 47, 71, 72, 3, 48, 89, 90, 104, 547, 418, 119, 3, 429, 831, 43, 40, 119, 46, 115, 3, 429, 40, 119, 89, 90, 54, 40, 89, 90, 126, 40, 115, 129, 442, 40, 119, 453, 134, 49, 50, 51, 138, 126, 105, 106, 129, 46, 40, 40, 115, 134, 522, 84, 119, 525, 43, 48, 40, 46, 923, 126, 40, 926, 129, 3, 57, 54, 40, 543, 80, 43, 542, 543, 46, 545, 546, 493, 88, 89, 90, 551, 498, 543, 538, 4, 581, 6, 583, 570, 89, 90, 43, 43, 40, 46, 46, 543, 89, 90, 595, 555, 40, 54, 558, 40, 89, 90, 774, 775, 48, 581, 677, 583, 584, 6, 115, 543, 543, 543, 119, 546, 538, 43, 115, 595, 46, 597, 119, 40, 41, 4, 115, 6, 542, 126, 119, 40, 129, 555, 48, 543, 558, 134, 84, 85, 57, 138, 686, 48, 543, 89, 90, 1005, 1098, 543, 48, 543, 593, 1103, 1104, 1105, 727, 48, 690, 132, 133, 134, 135, 136, 543, 116, 543, 543, 1026, 41, 1120, 115, 543, 526, 654, 119, 543, 543, 654, 593, 42, 595, 126, 536, 543, 129, 543, 43, 654, 721, 802, 46, 784, 6, 138, 671, 46, 40, 41, 552, 42, 554, 654, 679, 684, 831, 41, 42, 684, 121, 122, 123, 783, 543, 57, 1073, 40, 41, 684, 543, 43, 792, 654, 654, 654, 41, 702, 703, 704, 705, 671, 732, 684, 57, 116, 711, 702, 852, 679, 719, 741, 543, 932, 719, 720, 777, 654, 48, 795, 48, 702, 795, 684, 684, 684, 654, 732, 543, 21, 746, 654, 42, 654, 739, 705, 741, 543, 104, 690, 40, 711, 702, 702, 817, 884, 654, 684, 654, 654, 720, 808, 44, 104, 654, 7, 684, 41, 654, 654, 817, 684, 823, 684, 1116, 41, 654, 116, 654, 830, 721, 776, 49, 50, 51, 745, 684, 48, 684, 684, 41, 42, 787, 57, 684, 77, 78, 79, 684, 684, 82, 40, 84, 85, 949, 654, 684, 802, 684, 52, 53, 654, 745, 746, 686, 40, 41, 134, 135, 136, 819, 884, 48, 802, 819, 915, 48, 787, 71, 72, 964, 894, 57, 654, 819, 684, 777, 884, 833, 41, 42, 684, 837, 933, 839, 935, 52, 53, 819, 654, 73, 74, 75, 134, 48, 995, 946, 116, 654, 54, 103, 802, 43, 684, 80, 71, 72, 930, 819, 819, 819, 934, 88, 89, 90, 41, 966, 837, 41, 684, 875, 76, 823, 40, 41, 80, 41, 3, 684, 830, 6, 886, 819, 88, 89, 90, 41, 103, 54, 42, 57, 819, 774, 775, 41, 995, 819, 41, 819, 41, 160, 161, 784, 43, 41, 41, 41, 41, 41, 914, 170, 819, 104, 819, 819, 41, 798, 799, 800, 819, 42, 116, 41, 819, 819, 43, 116, 932, 111, 1029, 76, 819, 46, 819, 943, 48, 945, 998, 943, 116, 945, 116, 48, 932, 914, 827, 48, 977, 41, 41, 48, 48, 957, 958, 959, 43, 43, 48, 1113, 48, 819, 1116, 1023, 89, 90, 48, 819, 46, 41, 46, 40, 43, 977, 47, 43, 91, 57, 41, 1039, 105, 106, 932, 41, 988, 40, 90, 45, 48, 819, 89, 995, 46, 78, 52, 999, 41, 41, 48, 48, 1060, 1005, 1074, 42, 42, 819, 48, 48, 48, 1069, 1070, 1071, 48, 48, 819, 40, 43, 1021, 140, 988, 54, 41, 1026, 47, 103, 62, 42, 85, 86, 41, 999, 1091, 41, 41, 40, 977, 1005, 296, 297, 43, 1048, 300, 40, 48, 1048, 48, 48, 48, 998, 48, 41, 41, 41, 995, 1058, 997, 998, 1026, 54, 117, 130, 131, 132, 133, 134, 135, 136, 43, 54, 1073, 47, 46, 138, 1023, 47, 47, 335, 336, 48, 76, 1084, 76, 76, 1087, 76, 48, 41, 145, 3, 1039, 157, 158, 42, 1097, 1098, 43, 154, 40, 43, 1103, 1104, 1105, 160, 161, 1073, 163, 49, 50, 51, 41, 1060, 54, 170, 54, 41, 1084, 1120, 104, 1087, 1069, 1070, 1071, 1003, 43, 48, 40, 49, 50, 51, 1098, 40, 54, 76, 48, 1103, 1104, 1105, 80, 196, 76, 76, 1091, 57, 76, 47, 88, 89, 90, 76, 43, 43, 1120, 43, 76, 43, 104, 214, 80, 3, 43, 3, 6, 42, 48, 40, 88, 89, 90, 41, 48, 40, 43, 230, 68, 89, 90, 43, 40, 47, 41, 238, 40, 240, 241, 242, 41, 244, 48, 48, 41, 248, 249, 250, 251, 48, 40, 91, 40, 48, 41, 115, 96, 41, 48, 119, 272, 41, 274, 275, 276, 277, 278, 279, 280, 57, 41, 475, 476, 477, 46, 48, 41, 43, 138, 48, 484, 485, 43, 286, 527, 551, 702, 932, 1029, 3, 494, 558, 295, 296, 297, 307, 703, 300, 702, 89, 90, 89, 90, 522, 802, 21, 702, 702, 453, 597, 568, 515, 50, 316, 161, 318, 434, 1003, 330, 1058, 839, 333, 958, 170, 576, 115, 40, 115, 44, 119, 1073, 119, 335, 336, 48, 1053, 126, 340, 126, 129, 687, 129, -1, 57, 134, 178, -1, 187, 138, 352, 138, -1, 192, 193, -1, -1, 359, -1, -1, 199, -1, 77, 78, 79, 204, 368, 82, 83, 84, 85, -1, -1, -1, -1, -1, 89, 90, -1, 381, -1, -1, -1, 222, -1, -1, 3, 4, -1, 6, -1, 3, -1, -1, 233, 234, 242, -1, 244, -1, 239, 240, 115, 118, 243, -1, 119, -1, -1, -1, 412, 413, 414, -1, -1, -1, 418, 620, 420, 421, -1, 423, -1, 40, -1, 138, 43, 429, 40, 46, -1, 48, -1, -1, -1, -1, 48, 3, -1, -1, 107, 108, -1, 3, -1, 57, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 130, 131, 132, 133, 134, 135, 136, -1, -1, 89, 90, 40, 477, -1, 89, 90, 490, 40, -1, 3, -1, -1, -1, 488, 489, 499, 335, 336, 57, 494, -1, 340, -1, -1, 114, 115, 3, -1, -1, 119, 115, -1, -1, -1, 119, -1, 126, -1, -1, 129, 515, -1, -1, 518, 134, -1, 40, -1, 138, 43, 89, 90, -1, 138, 48, -1, 89, 90, -1, -1, 535, -1, -1, 40, 539, -1, 43, 542, -1, -1, -1, 48, -1, -1, -1, -1, 115, -1, 3, -1, 119, -1, 115, -1, -1, -1, 119, 562, 563, 564, -1, -1, 567, 568, 3, 89, 90, -1, -1, 138, -1, 420, 421, -1, 423, 138, 590, 591, 592, 593, -1, -1, 89, 90, 589, 40, -1, -1, 43, -1, 595, 115, -1, 48, -1, 119, -1, -1, -1, -1, -1, 40, 126, -1, 43, 129, -1, -1, 115, 48, 134, 3, 119, -1, 138, -1, -1, -1, -1, 126, -1, -1, 129, 628, 629, -1, -1, 134, 633, -1, -1, 138, -1, 638, 89, 90, -1, -1, 643, -1, -1, -1, -1, -1, -1, 494, -1, -1, 40, -1, 89, 90, -1, -1, -1, -1, 48, -1, -1, -1, 115, -1, -1, -1, 119, -1, 515, -1, -1, 518, -1, 126, 677, -1, 129, -1, 115, -1, -1, 134, 119, 523, -1, 138, 526, 527, -1, 126, -1, -1, 129, -1, 534, 535, 536, 134, 701, 89, 90, 138, -1, -1, 707, -1, 3, -1, 3, -1, 722, -1, -1, -1, 554, -1, 556, 564, -1, -1, 567, -1, -1, 563, 727, 115, 3, -1, -1, 119, -1, 743, 744, 745, -1, 747, 126, -1, -1, 129, -1, 753, -1, 40, 134, 40, -1, -1, 138, -1, -1, 48, -1, 48, -1, -1, -1, -1, -1, -1, 57, 764, 765, 40, -1, -1, -1, 770, -1, -1, -1, 48, 3, -1, -1, -1, 107, 108, 109, 110, 783, 628, 629, -1, -1, -1, 633, -1, -1, 792, 3, 638, 89, 90, 89, 90, 643, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1, -1, -1, 40, -1, -1, 89, 90, -1, -1, -1, 48, 115, -1, 115, -1, 119, -1, 119, -1, 57, 40, -1, 126, -1, 126, 129, 3, 129, 48, -1, 677, 115, 134, 843, 138, 119, 138, -1, 685, -1, 687, -1, 126, -1, -1, 129, -1, -1, -1, -1, 134, 89, 90, 707, 138, -1, -1, -1, -1, -1, -1, 3, -1, 40, -1, -1, -1, -1, -1, 89, 90, 48, 891, 892, 884, -1, -1, 115, -1, -1, -1, 119, -1, -1, -1, 3, -1, -1, 126, 899, -1, 129, -1, 903, 904, 115, -1, -1, 40, 119, 138, -1, -1, -1, -1, 915, 126, -1, -1, 129, 764, 765, 89, 90, 134, 57, 770, 3, 138, -1, 3, -1, 40, 933, -1, 935, -1, 774, 775, -1, 48, -1, -1, 780, -1, 782, 946, 784, 115, 57, 950, -1, 119, -1, 3, -1, -1, 89, 90, 126, -1, -1, 129, -1, 40, -1, 966, 40, -1, 806, -1, 138, 48, -1, -1, 48, -1, 977, -1, 979, 980, 89, 90, 115, -1, -1, -1, 119, -1, -1, -1, 40, -1, 1002, 126, 995, -1, 129, 998, 48, -1, -1, -1, -1, -1, -1, 138, 115, -1, -1, -1, 119, -1, 89, 90, -1, 89, 90, 1027, 1019, -1, -1, -1, -1, 6, -1, -1, -1, -1, 1029, 138, 13, 14, 15, 16, 17, 18, 19, 20, 115, 89, 90, 115, 119, -1, -1, 119, -1, 107, 108, 109, 110, -1, 1053, -1, 899, -1, -1, -1, 903, 904, -1, 138, -1, -1, 138, 115, -1, -1, -1, 119, 130, 131, 132, 133, 134, 135, 136, 1, 916, 3, 4, -1, -1, -1, 8, 9, 10, -1, 138, -1, -1, -1, -1, -1, -1, -1, -1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 43, 44, -1, -1, 47, -1, 49, 50, 51, 52, 53, -1, -1, -1, -1, 979, 980, -1, -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, -1, 77, 78, 79, -1, 81, 82, 83, 84, 85, 86, 87, -1, 89, 90, 91, -1, -1, -1, 95, -1, 97, 98, 99, 100, 101, 102, -1, 3, -1, -1, 6, -1, -1, -1, -1, -1, 113, -1, 115, -1, -1, 118, 119, 120, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, 6, 7, -1, 3, 138, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, -1, -1, -1, 40, -1, 48, 49, 50, 51, 52, 53, 48, 55, -1, -1, -1, -1, -1, -1, 89, 90, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, -1, -1, -1, -1, 105, 106, -1, -1, -1, -1, -1, -1, 86, -1, 115, 89, 90, 3, 119, -1, -1, 89, 90, -1, -1, 126, -1, -1, 129, -1, -1, -1, -1, 134, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, 118, 119, -1, 115, -1, -1, -1, 119, 126, -1, 40, 129, -1, -1, 132, 133, 134, -1, 48, 3, 138, 139, 6, 7, -1, 3, 138, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, 89, 90, -1, 40, -1, -1, 49, 50, 51, 52, 53, 48, 55, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, 70, 71, 72, 119, -1, -1, -1, -1, -1, -1, 126, -1, -1, 129, -1, -1, 86, -1, -1, 89, 90, 3, 138, -1, 3, 89, 90, 6, -1, -1, -1, -1, -1, -1, 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, -1, 115, -1, -1, -1, 119, -1, 115, -1, -1, -1, 119, 126, -1, 40, 129, -1, -1, 132, 133, 134, -1, 48, 3, 138, 139, 6, 7, -1, 41, 138, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, 89, 90, -1, 89, 90, -1, 49, 50, 51, 52, 53, -1, 55, -1, -1, 58, -1, -1, -1, 105, 106, -1, -1, -1, -1, -1, 115, 70, 71, 72, 119, -1, 107, 108, 109, 110, -1, 112, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, 138, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 115, 31, -1, 33, 119, -1, 36, 37, 38, 39, -1, 126, -1, -1, 129, -1, -1, 132, 133, 134, -1, -1, 3, 138, 139, 6, 7, 41, -1, -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, 107, 108, 109, 110, -1, 112, -1, -1, 107, 108, 109, 110, 86, -1, -1, 89, 90, -1, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 129, 130, 131, 132, 133, 134, 135, 136, -1, -1, -1, 115, -1, -1, -1, 119, -1, -1, -1, -1, -1, -1, 126, -1, -1, 129, -1, -1, 132, 133, 134, -1, -1, 3, 138, 139, 6, 7, -1, 43, -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, 107, 108, 109, 110, -1, 112, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, 119, -1, -1, -1, -1, -1, -1, 126, -1, -1, 129, -1, -1, 132, 133, 134, -1, -1, 3, 138, 139, 6, 7, -1, -1, -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, 41, 76, -1, -1, -1, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, 107, 108, 109, 110, -1, 112, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, 119, -1, -1, -1, -1, -1, -1, 126, -1, -1, 129, -1, -1, 132, 133, 134, -1, -1, 3, 138, 139, 6, 7, -1, -1, -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, 41, -1, -1, -1, -1, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 107, 108, 109, 110, -1, 112, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 86, -1, -1, 89, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, 119, -1, -1, -1, -1, -1, -1, 126, -1, -1, 129, -1, -1, 132, 133, 134, -1, -1, 3, 138, 139, 6, 7, -1, -1, -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 107, 108, 109, 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 86, -1, -1, 89, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, 119, -1, -1, -1, -1, -1, -1, 126, -1, -1, 129, -1, -1, 132, 133, 134, -1, -1, 3, 138, 139, 6, 7, -1, -1, -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, -1, -1, -1, -1, -1, -1, 49, 50, 51, 52, 53, -1, 55, 107, 108, 109, 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, -1, 3, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 86, -1, -1, 89, 90, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, 115, -1, -1, -1, 119, 48, 49, 50, 51, 52, 53, -1, -1, -1, 57, -1, -1, 132, 133, 134, -1, -1, -1, 138, 139, -1, -1, 70, 71, 72, 107, 108, 109, 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, 3, -1, 118, 119, -1, -1, -1, -1, -1, -1, 126, -1, -1, 129, -1, -1, -1, -1, 134, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, -1, -1, -1, -1, -1, 48, 49, 50, 51, 52, 53, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 115, -1, -1, 118, 119, 48, 49, 50, 51, 52, 53, 126, -1, -1, 129, -1, -1, -1, -1, 134, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, -1, -1, 115, -1, -1, 118, 119, -1, -1, 52, 53, -1, -1, 126, -1, -1, 129, -1, -1, -1, -1, 134, -1, -1, -1, -1, -1, 70, 71, 72, 0, 1, -1, 3, 4, -1, -1, -1, 8, 9, 10, -1, -1, 86, -1, -1, 89, 90, -1, -1, -1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, 115, 43, 44, -1, 119, -1, -1, 49, 50, 51, 52, 53, -1, -1, 56, -1, -1, -1, -1, 134, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, 77, 78, 79, -1, 81, 82, -1, 84, 85, 86, 87, -1, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 1, -1, 3, 4, -1, -1, -1, 8, 9, 10, 113, -1, 115, -1, -1, 118, 119, -1, -1, -1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 43, 44, -1, -1, 47, -1, 49, 50, 51, 52, 53, -1, -1, 56, -1, -1, -1, -1, -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, 77, 78, 79, -1, 81, 82, -1, 84, 85, 86, 87, -1, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 1, -1, 3, 4, -1, -1, -1, 8, 9, 10, 113, -1, 115, -1, -1, 118, 119, -1, -1, -1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 43, 44, -1, -1, 47, -1, 49, 50, 51, 52, 53, -1, -1, 56, -1, -1, -1, -1, -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, 77, 78, 79, -1, 81, 82, -1, 84, 85, 86, 87, -1, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 1, -1, 3, 4, -1, -1, -1, 8, 9, 10, 113, -1, 115, -1, -1, 118, 119, -1, -1, -1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 43, 44, -1, -1, 47, -1, 49, 50, 51, 52, 53, -1, -1, 56, -1, -1, -1, -1, -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, 77, 78, 79, -1, 81, 82, -1, 84, 85, 86, 87, -1, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 1, -1, 3, 4, -1, -1, -1, 8, 9, 10, 113, -1, 115, -1, -1, 118, 119, -1, -1, -1, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 43, 44, -1, -1, -1, -1, 49, 50, 51, 52, 53, -1, -1, 56, -1, -1, -1, 60, -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, 77, 78, 79, -1, 81, 82, -1, 84, 85, 86, 87, -1, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 113, -1, 115, -1, -1, 118, 119, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, -1, -1, -1, -1, -1, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, 1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 115, -1, -1, 118, 119, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, 1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 115, -1, -1, 118, 119, -1, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 107, 108, 109, 110, 115, 112, -1, -1, 119, 49, 50, 51, 52, 53, -1, -1, -1, -1, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 70, 71, 72, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, 87, -1, 89, 90, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 115, -1, -1, -1, 119, 120, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, -1, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 86, 87, 13, 89, 90, -1, -1, -1, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 115, -1, -1, -1, 119, 120, -1, -1, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, 115, -1, -1, 118, 119, 48, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 40, -1, -1, -1, 115, -1, -1, 118, 119, 49, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, 107, 108, 109, 110, 115, 112, -1, -1, 119, 49, 50, 51, 52, 53, -1, -1, -1, -1, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 70, 71, 72, -1, 3, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, 86, 87, -1, 89, 90, -1, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, -1, 115, -1, -1, -1, 119, 49, 50, 51, 52, 53, -1, -1, 107, 108, 109, 110, -1, 112, -1, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, 3, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 86, -1, -1, 89, 90, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, -1, -1, -1, -1, 115, -1, -1, -1, 119, -1, -1, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, 70, 71, 72, 3, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 86, -1, -1, 89, 90, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, -1, 35, 36, 37, 38, 39, -1, 107, 108, 109, 110, 115, 112, -1, -1, 119, -1, -1, -1, 107, 108, 109, 110, -1, 112, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, -1, -1, -1, 86, -1, -1, 89, 90, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, 119 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { 0, 121, 122, 123, 142, 143, 311, 1, 3, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 48, 49, 50, 51, 52, 53, 70, 71, 72, 86, 89, 90, 115, 118, 119, 193, 236, 250, 251, 253, 254, 255, 256, 257, 258, 283, 284, 296, 299, 301, 1, 236, 1, 40, 0, 1, 4, 8, 9, 10, 21, 43, 44, 56, 62, 63, 64, 65, 66, 67, 68, 69, 77, 78, 79, 81, 82, 84, 85, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 113, 118, 144, 145, 146, 148, 149, 150, 151, 152, 155, 156, 158, 159, 160, 161, 162, 163, 164, 167, 168, 169, 172, 174, 179, 180, 181, 182, 184, 188, 195, 196, 197, 198, 199, 203, 204, 211, 212, 223, 231, 232, 311, 48, 52, 71, 48, 48, 40, 140, 103, 103, 295, 299, 43, 254, 250, 40, 48, 54, 57, 76, 119, 126, 129, 134, 138, 241, 242, 244, 246, 247, 248, 249, 299, 311, 250, 257, 299, 295, 117, 140, 300, 43, 43, 233, 234, 236, 311, 120, 40, 6, 85, 118, 305, 40, 308, 311, 1, 252, 253, 296, 40, 308, 40, 166, 311, 40, 40, 84, 85, 40, 84, 77, 82, 44, 77, 92, 299, 46, 296, 299, 40, 4, 46, 40, 40, 43, 46, 4, 305, 40, 178, 252, 176, 178, 40, 40, 305, 40, 103, 284, 308, 40, 126, 129, 244, 249, 299, 21, 85, 87, 193, 252, 284, 48, 48, 48, 299, 118, 119, 301, 302, 284, 7, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 40, 55, 126, 129, 132, 133, 134, 138, 139, 236, 237, 238, 240, 252, 253, 269, 270, 271, 272, 305, 306, 311, 250, 40, 126, 129, 233, 247, 249, 299, 48, 46, 105, 106, 259, 260, 261, 262, 263, 58, 269, 270, 269, 3, 40, 48, 138, 245, 248, 299, 48, 245, 248, 249, 250, 299, 241, 40, 57, 241, 40, 57, 48, 126, 129, 245, 248, 299, 116, 301, 119, 302, 41, 42, 235, 311, 261, 296, 297, 305, 284, 6, 46, 297, 309, 297, 43, 40, 244, 54, 41, 297, 52, 53, 71, 285, 286, 311, 296, 296, 297, 13, 173, 233, 233, 299, 43, 54, 214, 54, 46, 296, 175, 309, 296, 233, 46, 243, 244, 247, 311, 43, 42, 177, 311, 297, 298, 311, 153, 154, 305, 233, 207, 208, 209, 236, 283, 311, 299, 305, 126, 129, 249, 296, 299, 309, 40, 297, 126, 129, 299, 116, 244, 299, 264, 296, 311, 40, 244, 76, 275, 276, 299, 311, 48, 48, 41, 296, 300, 104, 269, 40, 48, 269, 269, 269, 269, 269, 269, 269, 104, 42, 239, 311, 40, 107, 108, 109, 110, 112, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 7, 126, 129, 249, 299, 246, 299, 246, 41, 41, 126, 129, 246, 299, 116, 48, 57, 269, 58, 40, 249, 299, 48, 299, 40, 57, 48, 249, 233, 58, 269, 233, 58, 269, 48, 48, 245, 248, 48, 245, 248, 116, 48, 126, 129, 245, 300, 43, 236, 41, 299, 183, 42, 54, 41, 241, 259, 41, 299, 41, 54, 41, 42, 171, 42, 41, 41, 43, 252, 143, 299, 213, 41, 41, 41, 41, 176, 178, 41, 41, 42, 46, 41, 104, 42, 210, 311, 59, 116, 41, 249, 299, 43, 116, 111, 54, 76, 194, 311, 233, 299, 80, 88, 89, 90, 186, 241, 250, 288, 289, 277, 46, 43, 275, 295, 284, 41, 126, 129, 134, 249, 252, 48, 240, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 299, 116, 41, 41, 41, 116, 246, 246, 269, 233, 245, 299, 41, 116, 48, 233, 58, 269, 48, 41, 58, 41, 58, 48, 48, 48, 48, 126, 129, 245, 248, 48, 48, 48, 245, 235, 4, 46, 305, 143, 309, 153, 271, 305, 310, 43, 43, 46, 4, 165, 305, 4, 43, 46, 114, 170, 244, 305, 307, 297, 305, 310, 41, 236, 244, 46, 243, 47, 43, 143, 44, 232, 176, 43, 46, 40, 47, 177, 115, 119, 296, 303, 43, 309, 236, 170, 91, 205, 209, 157, 244, 305, 116, 30, 32, 35, 187, 255, 256, 299, 57, 189, 254, 43, 46, 41, 40, 40, 288, 90, 89, 1, 42, 43, 46, 185, 241, 289, 241, 78, 278, 279, 287, 311, 201, 46, 299, 269, 41, 41, 134, 250, 41, 126, 129, 242, 48, 239, 76, 41, 58, 41, 41, 245, 245, 41, 58, 245, 245, 48, 48, 48, 48, 48, 245, 48, 48, 48, 47, 42, 42, 147, 40, 250, 289, 290, 311, 54, 41, 42, 171, 170, 244, 290, 43, 47, 305, 252, 296, 43, 54, 307, 233, 140, 117, 140, 304, 103, 41, 47, 299, 44, 83, 118, 184, 199, 203, 204, 206, 220, 222, 224, 232, 210, 143, 290, 43, 186, 40, 46, 190, 150, 265, 266, 311, 40, 54, 289, 290, 291, 233, 269, 244, 241, 42, 73, 74, 75, 280, 282, 1, 43, 66, 73, 74, 75, 78, 138, 148, 149, 150, 151, 155, 156, 160, 162, 164, 167, 169, 172, 174, 179, 180, 181, 182, 199, 203, 204, 211, 215, 219, 220, 221, 222, 223, 224, 225, 226, 229, 232, 311, 200, 241, 269, 269, 269, 41, 41, 41, 40, 269, 41, 245, 245, 48, 48, 48, 245, 48, 48, 309, 309, 215, 233, 289, 170, 305, 310, 43, 244, 41, 290, 43, 244, 43, 178, 41, 119, 296, 296, 119, 296, 237, 4, 46, 54, 40, 103, 87, 120, 252, 60, 43, 185, 233, 40, 43, 191, 267, 296, 42, 47, 233, 259, 54, 76, 292, 311, 41, 41, 186, 279, 299, 281, 218, 46, 76, 76, 76, 138, 301, 47, 215, 30, 32, 35, 230, 256, 299, 215, 269, 269, 252, 245, 48, 48, 245, 245, 47, 41, 171, 290, 43, 244, 170, 43, 43, 304, 304, 104, 252, 207, 252, 40, 41, 192, 265, 54, 265, 43, 244, 41, 43, 261, 293, 294, 299, 43, 46, 185, 48, 273, 274, 311, 287, 215, 216, 301, 40, 43, 202, 244, 76, 43, 47, 242, 245, 245, 43, 43, 290, 43, 243, 104, 40, 126, 129, 249, 233, 290, 43, 268, 269, 267, 186, 43, 46, 43, 42, 48, 40, 46, 48, 299, 215, 40, 233, 186, 269, 202, 41, 43, 43, 233, 40, 40, 40, 129, 41, 111, 190, 265, 185, 294, 48, 48, 274, 47, 233, 41, 185, 43, 41, 233, 233, 233, 40, 291, 252, 191, 48, 48, 217, 41, 227, 290, 228, 290, 41, 41, 41, 233, 190, 48, 215, 228, 43, 46, 54, 43, 46, 54, 228, 228, 228, 41, 191, 48, 261, 259, 228, 43, 43 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { 0, 141, 142, 142, 142, 142, 142, 142, 142, 143, 143, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 147, 146, 148, 149, 150, 150, 150, 151, 151, 152, 152, 152, 152, 153, 154, 154, 155, 155, 155, 157, 156, 158, 158, 159, 159, 160, 160, 160, 160, 161, 162, 162, 163, 163, 164, 164, 165, 165, 166, 166, 167, 167, 167, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 171, 171, 172, 173, 173, 174, 174, 174, 175, 176, 177, 177, 178, 178, 178, 179, 180, 181, 182, 182, 182, 183, 182, 182, 182, 182, 184, 184, 185, 185, 185, 185, 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, 188, 188, 188, 189, 190, 191, 192, 191, 193, 193, 193, 194, 194, 195, 196, 196, 197, 198, 198, 198, 198, 198, 198, 200, 199, 201, 199, 202, 202, 203, 205, 204, 204, 204, 206, 206, 206, 206, 206, 206, 206, 207, 208, 208, 209, 209, 210, 210, 211, 211, 213, 212, 214, 212, 212, 215, 216, 217, 215, 215, 215, 218, 215, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 220, 221, 221, 222, 222, 222, 222, 222, 223, 224, 225, 225, 225, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 228, 228, 228, 229, 230, 230, 230, 230, 230, 231, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 233, 234, 234, 235, 235, 236, 236, 236, 237, 238, 238, 239, 239, 240, 240, 241, 241, 241, 241, 241, 242, 242, 242, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 249, 250, 250, 251, 251, 251, 252, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 255, 256, 257, 257, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 260, 259, 259, 261, 261, 262, 263, 264, 264, 265, 265, 266, 266, 266, 266, 267, 267, 268, 269, 269, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 271, 271, 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 273, 274, 274, 275, 277, 276, 276, 278, 278, 280, 279, 281, 279, 282, 282, 282, 283, 283, 283, 283, 284, 284, 284, 285, 285, 285, 286, 286, 287, 287, 288, 288, 288, 288, 289, 289, 289, 289, 289, 290, 290, 290, 290, 291, 291, 291, 291, 291, 291, 292, 292, 293, 293, 293, 293, 294, 294, 295, 296, 296, 296, 297, 297, 297, 298, 298, 299, 299, 299, 299, 299, 299, 299, 300, 300, 300, 300, 301, 301, 302, 302, 303, 303, 303, 303, 303, 303, 304, 304, 304, 304, 305, 305, 306, 306, 307, 307, 307, 308, 308, 309, 309, 309, 309, 309, 309, 310, 310, 311 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 3, 2, 3, 2, 5, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 8, 5, 3, 5, 5, 3, 2, 2, 5, 2, 5, 2, 4, 1, 1, 7, 7, 5, 0, 7, 1, 1, 2, 2, 1, 5, 5, 5, 3, 4, 3, 7, 8, 5, 3, 1, 1, 3, 1, 4, 7, 6, 1, 1, 7, 9, 8, 10, 5, 7, 6, 8, 1, 1, 5, 4, 5, 7, 1, 3, 6, 6, 8, 1, 2, 3, 1, 2, 3, 6, 5, 9, 2, 1, 1, 1, 0, 6, 1, 6, 10, 5, 7, 1, 4, 1, 1, 1, 2, 2, 3, 1, 1, 1, 1, 1, 1, 11, 13, 7, 1, 1, 1, 0, 3, 1, 2, 2, 2, 1, 5, 8, 10, 6, 1, 1, 1, 1, 1, 1, 0, 9, 0, 8, 1, 3, 4, 0, 6, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 3, 4, 0, 6, 0, 5, 5, 2, 0, 0, 7, 1, 1, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 7, 8, 8, 8, 9, 7, 5, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 2, 2, 4, 2, 5, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 1, 3, 1, 2, 7, 3, 1, 2, 1, 3, 1, 1, 1, 2, 5, 2, 2, 1, 2, 2, 1, 1, 1, 1, 2, 3, 3, 1, 2, 2, 3, 4, 5, 4, 5, 6, 6, 4, 5, 5, 6, 7, 8, 8, 7, 7, 1, 2, 3, 4, 5, 3, 4, 4, 1, 2, 4, 4, 4, 5, 3, 4, 4, 5, 1, 2, 2, 2, 3, 3, 1, 2, 2, 1, 1, 2, 3, 4, 3, 4, 2, 3, 3, 4, 3, 3, 2, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 3, 3, 1, 1, 3, 1, 1, 1, 1, 1, 5, 8, 1, 1, 1, 1, 3, 4, 5, 5, 5, 6, 6, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 2, 2, 2, 2, 2, 3, 1, 1, 1, 0, 3, 1, 1, 3, 0, 4, 0, 6, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 4, 1, 1, 2, 4, 1, 1, 2, 1, 3, 3, 4, 4, 3, 4, 2, 1, 1, 3, 4, 6, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 3, 1, 2, 3, 3, 2, 2, 2, 1, 2, 1, 3, 2, 4, 1, 3, 1, 3, 3, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 3, 1, 3, 5, 1, 3, 3, 5, 1, 1, 0 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Error token number */ #define YYTERROR 1 #define YYERRCODE 256 /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*----------------------------------------. | Print this symbol's value on YYOUTPUT. | `----------------------------------------*/ static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) { FILE *yyo = yyoutput; YYUSE (yyo); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # endif YYUSE (yytype); } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) { YYFPRINTF (yyoutput, "%s %s (", yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) { unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yystos[yyssp[yyi + 1 - yynrhs]], &(yyvsp[(yyi + 1) - (yynrhs)]) ); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ static YYSIZE_T yystrlen (const char *yystr) { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * yystpcpy (char *yydest, const char *yysrc) { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); YYSIZE_T yysize = yysize0; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULLPTR; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; { YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } { YYSIZE_T yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) { YYUSE (yyvaluep); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YYUSE (yytype); YY_IGNORE_MAYBE_UNINITIALIZED_END } /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; /*----------. | yyparse. | `----------*/ int yyparse (void) { int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: 'yyss': related to states. 'yyvs': related to semantic values. Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken = 0; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yyssp = yyss = yyssa; yyvsp = yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = yylex (); } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: #line 1521 "parser.y" /* yacc.c:1646 */ { if (!classes) classes = NewHash(); Setattr((yyvsp[0].node),"classes",classes); Setattr((yyvsp[0].node),"name",ModuleName); if ((!module_node) && ModuleName) { module_node = new_node("module"); Setattr(module_node,"name",ModuleName); } Setattr((yyvsp[0].node),"module",module_node); top = (yyvsp[0].node); } #line 4493 "y.tab.c" /* yacc.c:1646 */ break; case 3: #line 1533 "parser.y" /* yacc.c:1646 */ { top = Copy(Getattr((yyvsp[-1].p),"type")); Delete((yyvsp[-1].p)); } #line 4502 "y.tab.c" /* yacc.c:1646 */ break; case 4: #line 1537 "parser.y" /* yacc.c:1646 */ { top = 0; } #line 4510 "y.tab.c" /* yacc.c:1646 */ break; case 5: #line 1540 "parser.y" /* yacc.c:1646 */ { top = (yyvsp[-1].p); } #line 4518 "y.tab.c" /* yacc.c:1646 */ break; case 6: #line 1543 "parser.y" /* yacc.c:1646 */ { top = 0; } #line 4526 "y.tab.c" /* yacc.c:1646 */ break; case 7: #line 1546 "parser.y" /* yacc.c:1646 */ { top = (yyvsp[-2].pl); } #line 4534 "y.tab.c" /* yacc.c:1646 */ break; case 8: #line 1549 "parser.y" /* yacc.c:1646 */ { top = 0; } #line 4542 "y.tab.c" /* yacc.c:1646 */ break; case 9: #line 1554 "parser.y" /* yacc.c:1646 */ { /* add declaration to end of linked list (the declaration isn't always a single declaration, sometimes it is a linked list itself) */ appendChild((yyvsp[-1].node),(yyvsp[0].node)); (yyval.node) = (yyvsp[-1].node); } #line 4552 "y.tab.c" /* yacc.c:1646 */ break; case 10: #line 1559 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("top"); } #line 4560 "y.tab.c" /* yacc.c:1646 */ break; case 11: #line 1564 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4566 "y.tab.c" /* yacc.c:1646 */ break; case 12: #line 1565 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4572 "y.tab.c" /* yacc.c:1646 */ break; case 13: #line 1566 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4578 "y.tab.c" /* yacc.c:1646 */ break; case 14: #line 1567 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 4584 "y.tab.c" /* yacc.c:1646 */ break; case 15: #line 1568 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; if (cparse_unknown_directive) { Swig_error(cparse_file, cparse_line, "Unknown directive '%s'.\n", cparse_unknown_directive); } else { Swig_error(cparse_file, cparse_line, "Syntax error in input(1).\n"); } exit(1); } #line 4598 "y.tab.c" /* yacc.c:1646 */ break; case 16: #line 1578 "parser.y" /* yacc.c:1646 */ { if ((yyval.node)) { add_symbols((yyval.node)); } (yyval.node) = (yyvsp[0].node); } #line 4609 "y.tab.c" /* yacc.c:1646 */ break; case 17: #line 1594 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; skip_decl(); } #line 4618 "y.tab.c" /* yacc.c:1646 */ break; case 18: #line 1604 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4624 "y.tab.c" /* yacc.c:1646 */ break; case 19: #line 1605 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4630 "y.tab.c" /* yacc.c:1646 */ break; case 20: #line 1606 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4636 "y.tab.c" /* yacc.c:1646 */ break; case 21: #line 1607 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4642 "y.tab.c" /* yacc.c:1646 */ break; case 22: #line 1608 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4648 "y.tab.c" /* yacc.c:1646 */ break; case 23: #line 1609 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4654 "y.tab.c" /* yacc.c:1646 */ break; case 24: #line 1610 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4660 "y.tab.c" /* yacc.c:1646 */ break; case 25: #line 1611 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4666 "y.tab.c" /* yacc.c:1646 */ break; case 26: #line 1612 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4672 "y.tab.c" /* yacc.c:1646 */ break; case 27: #line 1613 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4678 "y.tab.c" /* yacc.c:1646 */ break; case 28: #line 1614 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4684 "y.tab.c" /* yacc.c:1646 */ break; case 29: #line 1615 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4690 "y.tab.c" /* yacc.c:1646 */ break; case 30: #line 1616 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4696 "y.tab.c" /* yacc.c:1646 */ break; case 31: #line 1617 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4702 "y.tab.c" /* yacc.c:1646 */ break; case 32: #line 1618 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4708 "y.tab.c" /* yacc.c:1646 */ break; case 33: #line 1619 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4714 "y.tab.c" /* yacc.c:1646 */ break; case 34: #line 1620 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4720 "y.tab.c" /* yacc.c:1646 */ break; case 35: #line 1621 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4726 "y.tab.c" /* yacc.c:1646 */ break; case 36: #line 1622 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4732 "y.tab.c" /* yacc.c:1646 */ break; case 37: #line 1623 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4738 "y.tab.c" /* yacc.c:1646 */ break; case 38: #line 1624 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 4744 "y.tab.c" /* yacc.c:1646 */ break; case 39: #line 1631 "parser.y" /* yacc.c:1646 */ { Node *cls; String *clsname; extendmode = 1; cplus_mode = CPLUS_PUBLIC; if (!classes) classes = NewHash(); if (!classes_typedefs) classes_typedefs = NewHash(); clsname = make_class_name((yyvsp[-1].str)); cls = Getattr(classes,clsname); if (!cls) { cls = Getattr(classes_typedefs, clsname); if (!cls) { /* No previous definition. Create a new scope */ Node *am = Getattr(Swig_extend_hash(),clsname); if (!am) { Swig_symbol_newscope(); Swig_symbol_setscopename((yyvsp[-1].str)); prev_symtab = 0; } else { prev_symtab = Swig_symbol_setscope(Getattr(am,"symtab")); } current_class = 0; } else { /* Previous typedef class definition. Use its symbol table. Deprecated, just the real name should be used. Note that %extend before the class typedef never worked, only %extend after the class typdef. */ prev_symtab = Swig_symbol_setscope(Getattr(cls, "symtab")); current_class = cls; SWIG_WARN_NODE_BEGIN(cls); Swig_warning(WARN_PARSE_EXTEND_NAME, cparse_file, cparse_line, "Deprecated %%extend name used - the %s name '%s' should be used instead of the typedef name '%s'.\n", Getattr(cls, "kind"), SwigType_namestr(Getattr(cls, "name")), (yyvsp[-1].str)); SWIG_WARN_NODE_END(cls); } } else { /* Previous class definition. Use its symbol table */ prev_symtab = Swig_symbol_setscope(Getattr(cls,"symtab")); current_class = cls; } Classprefix = NewString((yyvsp[-1].str)); Namespaceprefix= Swig_symbol_qualifiedscopename(0); Delete(clsname); } #line 4790 "y.tab.c" /* yacc.c:1646 */ break; case 40: #line 1671 "parser.y" /* yacc.c:1646 */ { String *clsname; extendmode = 0; (yyval.node) = new_node("extend"); Setattr((yyval.node),"symtab",Swig_symbol_popscope()); if (prev_symtab) { Swig_symbol_setscope(prev_symtab); } Namespaceprefix = Swig_symbol_qualifiedscopename(0); clsname = make_class_name((yyvsp[-4].str)); Setattr((yyval.node),"name",clsname); mark_nodes_as_extend((yyvsp[-1].node)); if (current_class) { /* We add the extension to the previously defined class */ appendChild((yyval.node), (yyvsp[-1].node)); appendChild(current_class,(yyval.node)); } else { /* We store the extensions in the extensions hash */ Node *am = Getattr(Swig_extend_hash(),clsname); if (am) { /* Append the members to the previous extend methods */ appendChild(am, (yyvsp[-1].node)); } else { appendChild((yyval.node), (yyvsp[-1].node)); Setattr(Swig_extend_hash(),clsname,(yyval.node)); } } current_class = 0; Delete(Classprefix); Delete(clsname); Classprefix = 0; prev_symtab = 0; (yyval.node) = 0; } #line 4831 "y.tab.c" /* yacc.c:1646 */ break; case 41: #line 1713 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("apply"); Setattr((yyval.node),"pattern",Getattr((yyvsp[-3].p),"pattern")); appendChild((yyval.node),(yyvsp[-1].p)); } #line 4841 "y.tab.c" /* yacc.c:1646 */ break; case 42: #line 1723 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("clear"); appendChild((yyval.node),(yyvsp[-1].p)); } #line 4850 "y.tab.c" /* yacc.c:1646 */ break; case 43: #line 1734 "parser.y" /* yacc.c:1646 */ { if (((yyvsp[-1].dtype).type != T_ERROR) && ((yyvsp[-1].dtype).type != T_SYMBOL)) { SwigType *type = NewSwigType((yyvsp[-1].dtype).type); (yyval.node) = new_node("constant"); Setattr((yyval.node),"name",(yyvsp[-3].id)); Setattr((yyval.node),"type",type); Setattr((yyval.node),"value",(yyvsp[-1].dtype).val); if ((yyvsp[-1].dtype).rawval) Setattr((yyval.node),"rawval", (yyvsp[-1].dtype).rawval); Setattr((yyval.node),"storage","%constant"); SetFlag((yyval.node),"feature:immutable"); add_symbols((yyval.node)); Delete(type); } else { if ((yyvsp[-1].dtype).type == T_ERROR) { Swig_warning(WARN_PARSE_UNSUPPORTED_VALUE,cparse_file,cparse_line,"Unsupported constant value (ignored)\n"); } (yyval.node) = 0; } } #line 4875 "y.tab.c" /* yacc.c:1646 */ break; case 44: #line 1755 "parser.y" /* yacc.c:1646 */ { if (((yyvsp[-1].dtype).type != T_ERROR) && ((yyvsp[-1].dtype).type != T_SYMBOL)) { SwigType_push((yyvsp[-3].type),(yyvsp[-2].decl).type); /* Sneaky callback function trick */ if (SwigType_isfunction((yyvsp[-3].type))) { SwigType_add_pointer((yyvsp[-3].type)); } (yyval.node) = new_node("constant"); Setattr((yyval.node),"name",(yyvsp[-2].decl).id); Setattr((yyval.node),"type",(yyvsp[-3].type)); Setattr((yyval.node),"value",(yyvsp[-1].dtype).val); if ((yyvsp[-1].dtype).rawval) Setattr((yyval.node),"rawval", (yyvsp[-1].dtype).rawval); Setattr((yyval.node),"storage","%constant"); SetFlag((yyval.node),"feature:immutable"); add_symbols((yyval.node)); } else { if ((yyvsp[-1].dtype).type == T_ERROR) { Swig_warning(WARN_PARSE_UNSUPPORTED_VALUE,cparse_file,cparse_line,"Unsupported constant value\n"); } (yyval.node) = 0; } } #line 4902 "y.tab.c" /* yacc.c:1646 */ break; case 45: #line 1777 "parser.y" /* yacc.c:1646 */ { Swig_warning(WARN_PARSE_BAD_VALUE,cparse_file,cparse_line,"Bad constant value (ignored).\n"); (yyval.node) = 0; } #line 4911 "y.tab.c" /* yacc.c:1646 */ break; case 46: #line 1788 "parser.y" /* yacc.c:1646 */ { char temp[64]; Replace((yyvsp[0].str),"$file",cparse_file, DOH_REPLACE_ANY); sprintf(temp,"%d", cparse_line); Replace((yyvsp[0].str),"$line",temp,DOH_REPLACE_ANY); Printf(stderr,"%s\n", (yyvsp[0].str)); Delete((yyvsp[0].str)); (yyval.node) = 0; } #line 4925 "y.tab.c" /* yacc.c:1646 */ break; case 47: #line 1797 "parser.y" /* yacc.c:1646 */ { char temp[64]; String *s = (yyvsp[0].str); Replace(s,"$file",cparse_file, DOH_REPLACE_ANY); sprintf(temp,"%d", cparse_line); Replace(s,"$line",temp,DOH_REPLACE_ANY); Printf(stderr,"%s\n", s); Delete(s); (yyval.node) = 0; } #line 4940 "y.tab.c" /* yacc.c:1646 */ break; case 48: #line 1816 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.node) = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } #line 4950 "y.tab.c" /* yacc.c:1646 */ break; case 49: #line 1822 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.node) = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } #line 4960 "y.tab.c" /* yacc.c:1646 */ break; case 50: #line 1828 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } #line 4969 "y.tab.c" /* yacc.c:1646 */ break; case 51: #line 1833 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; Swig_warning(WARN_DEPRECATED_EXCEPT,cparse_file, cparse_line, "%%except is deprecated. Use %%exception instead.\n"); } #line 4978 "y.tab.c" /* yacc.c:1646 */ break; case 52: #line 1840 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"value",(yyvsp[-3].str)); Setattr((yyval.node),"type",Getattr((yyvsp[-1].p),"type")); } #line 4988 "y.tab.c" /* yacc.c:1646 */ break; case 53: #line 1847 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"value",(yyvsp[0].str)); } #line 4997 "y.tab.c" /* yacc.c:1646 */ break; case 54: #line 1851 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 5005 "y.tab.c" /* yacc.c:1646 */ break; case 55: #line 1864 "parser.y" /* yacc.c:1646 */ { Hash *p = (yyvsp[-2].node); (yyval.node) = new_node("fragment"); Setattr((yyval.node),"value",Getattr((yyvsp[-4].node),"value")); Setattr((yyval.node),"type",Getattr((yyvsp[-4].node),"type")); Setattr((yyval.node),"section",Getattr(p,"name")); Setattr((yyval.node),"kwargs",nextSibling(p)); Setattr((yyval.node),"code",(yyvsp[0].str)); } #line 5019 "y.tab.c" /* yacc.c:1646 */ break; case 56: #line 1873 "parser.y" /* yacc.c:1646 */ { Hash *p = (yyvsp[-2].node); String *code; skip_balanced('{','}'); (yyval.node) = new_node("fragment"); Setattr((yyval.node),"value",Getattr((yyvsp[-4].node),"value")); Setattr((yyval.node),"type",Getattr((yyvsp[-4].node),"type")); Setattr((yyval.node),"section",Getattr(p,"name")); Setattr((yyval.node),"kwargs",nextSibling(p)); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } #line 5039 "y.tab.c" /* yacc.c:1646 */ break; case 57: #line 1888 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("fragment"); Setattr((yyval.node),"value",Getattr((yyvsp[-2].node),"value")); Setattr((yyval.node),"type",Getattr((yyvsp[-2].node),"type")); Setattr((yyval.node),"emitonly","1"); } #line 5050 "y.tab.c" /* yacc.c:1646 */ break; case 58: #line 1901 "parser.y" /* yacc.c:1646 */ { (yyvsp[-3].loc).filename = Copy(cparse_file); (yyvsp[-3].loc).line = cparse_line; scanner_set_location((yyvsp[-1].str),1); if ((yyvsp[-2].node)) { String *maininput = Getattr((yyvsp[-2].node), "maininput"); if (maininput) scanner_set_main_input_file(NewString(maininput)); } } #line 5065 "y.tab.c" /* yacc.c:1646 */ break; case 59: #line 1910 "parser.y" /* yacc.c:1646 */ { String *mname = 0; (yyval.node) = (yyvsp[-1].node); scanner_set_location((yyvsp[-6].loc).filename,(yyvsp[-6].loc).line+1); if (strcmp((yyvsp[-6].loc).type,"include") == 0) set_nodeType((yyval.node),"include"); if (strcmp((yyvsp[-6].loc).type,"import") == 0) { mname = (yyvsp[-5].node) ? Getattr((yyvsp[-5].node),"module") : 0; set_nodeType((yyval.node),"import"); if (import_mode) --import_mode; } Setattr((yyval.node),"name",(yyvsp[-4].str)); /* Search for the module (if any) */ { Node *n = firstChild((yyval.node)); while (n) { if (Strcmp(nodeType(n),"module") == 0) { if (mname) { Setattr(n,"name", mname); mname = 0; } Setattr((yyval.node),"module",Getattr(n,"name")); break; } n = nextSibling(n); } if (mname) { /* There is no module node in the import node, ie, you imported a .h file directly. We are forced then to create a new import node with a module node. */ Node *nint = new_node("import"); Node *mnode = new_node("module"); Setattr(mnode,"name", mname); Setattr(mnode,"options",(yyvsp[-5].node)); appendChild(nint,mnode); Delete(mnode); appendChild(nint,firstChild((yyval.node))); (yyval.node) = nint; Setattr((yyval.node),"module",mname); } } Setattr((yyval.node),"options",(yyvsp[-5].node)); } #line 5115 "y.tab.c" /* yacc.c:1646 */ break; case 60: #line 1957 "parser.y" /* yacc.c:1646 */ { (yyval.loc).type = "include"; } #line 5121 "y.tab.c" /* yacc.c:1646 */ break; case 61: #line 1958 "parser.y" /* yacc.c:1646 */ { (yyval.loc).type = "import"; ++import_mode;} #line 5127 "y.tab.c" /* yacc.c:1646 */ break; case 62: #line 1965 "parser.y" /* yacc.c:1646 */ { String *cpps; if (Namespaceprefix) { Swig_error(cparse_file, cparse_start_line, "%%inline directive inside a namespace is disallowed.\n"); (yyval.node) = 0; } else { (yyval.node) = new_node("insert"); Setattr((yyval.node),"code",(yyvsp[0].str)); /* Need to run through the preprocessor */ Seek((yyvsp[0].str),0,SEEK_SET); Setline((yyvsp[0].str),cparse_start_line); Setfile((yyvsp[0].str),cparse_file); cpps = Preprocessor_parse((yyvsp[0].str)); start_inline(Char(cpps), cparse_start_line); Delete((yyvsp[0].str)); Delete(cpps); } } #line 5151 "y.tab.c" /* yacc.c:1646 */ break; case 63: #line 1984 "parser.y" /* yacc.c:1646 */ { String *cpps; int start_line = cparse_line; skip_balanced('{','}'); if (Namespaceprefix) { Swig_error(cparse_file, cparse_start_line, "%%inline directive inside a namespace is disallowed.\n"); (yyval.node) = 0; } else { String *code; (yyval.node) = new_node("insert"); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); code = Copy(scanner_ccode); Setattr((yyval.node),"code", code); Delete(code); cpps=Copy(scanner_ccode); start_inline(Char(cpps), start_line); Delete(cpps); } } #line 5177 "y.tab.c" /* yacc.c:1646 */ break; case 64: #line 2015 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("insert"); Setattr((yyval.node),"code",(yyvsp[0].str)); } #line 5186 "y.tab.c" /* yacc.c:1646 */ break; case 65: #line 2019 "parser.y" /* yacc.c:1646 */ { String *code = NewStringEmpty(); (yyval.node) = new_node("insert"); Setattr((yyval.node),"section",(yyvsp[-2].id)); Setattr((yyval.node),"code",code); if (Swig_insert_file((yyvsp[0].str),code) < 0) { Swig_error(cparse_file, cparse_line, "Couldn't find '%s'.\n", (yyvsp[0].str)); (yyval.node) = 0; } } #line 5201 "y.tab.c" /* yacc.c:1646 */ break; case 66: #line 2029 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("insert"); Setattr((yyval.node),"section",(yyvsp[-2].id)); Setattr((yyval.node),"code",(yyvsp[0].str)); } #line 5211 "y.tab.c" /* yacc.c:1646 */ break; case 67: #line 2034 "parser.y" /* yacc.c:1646 */ { String *code; skip_balanced('{','}'); (yyval.node) = new_node("insert"); Setattr((yyval.node),"section",(yyvsp[-2].id)); Delitem(scanner_ccode,0); Delitem(scanner_ccode,DOH_END); code = Copy(scanner_ccode); Setattr((yyval.node),"code", code); Delete(code); } #line 5227 "y.tab.c" /* yacc.c:1646 */ break; case 68: #line 2052 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("module"); if ((yyvsp[-1].node)) { Setattr((yyval.node),"options",(yyvsp[-1].node)); if (Getattr((yyvsp[-1].node),"directors")) { Wrapper_director_mode_set(1); if (!cparse_cplusplus) { Swig_error(cparse_file, cparse_line, "Directors are not supported for C code and require the -c++ option\n"); } } if (Getattr((yyvsp[-1].node),"dirprot")) { Wrapper_director_protected_mode_set(1); } if (Getattr((yyvsp[-1].node),"allprotected")) { Wrapper_all_protected_mode_set(1); } if (Getattr((yyvsp[-1].node),"templatereduce")) { template_reduce = 1; } if (Getattr((yyvsp[-1].node),"notemplatereduce")) { template_reduce = 0; } } if (!ModuleName) ModuleName = NewString((yyvsp[0].id)); if (!import_mode) { /* first module included, we apply global ModuleName, which can be modify by -module */ String *mname = Copy(ModuleName); Setattr((yyval.node),"name",mname); Delete(mname); } else { /* import mode, we just pass the idstring */ Setattr((yyval.node),"name",(yyvsp[0].id)); } if (!module_node) module_node = (yyval.node); } #line 5268 "y.tab.c" /* yacc.c:1646 */ break; case 69: #line 2095 "parser.y" /* yacc.c:1646 */ { Swig_warning(WARN_DEPRECATED_NAME,cparse_file,cparse_line, "%%name is deprecated. Use %%rename instead.\n"); Delete(yyrename); yyrename = NewString((yyvsp[-1].id)); (yyval.node) = 0; } #line 5279 "y.tab.c" /* yacc.c:1646 */ break; case 70: #line 2101 "parser.y" /* yacc.c:1646 */ { Swig_warning(WARN_DEPRECATED_NAME,cparse_file,cparse_line, "%%name is deprecated. Use %%rename instead.\n"); (yyval.node) = 0; Swig_error(cparse_file,cparse_line,"Missing argument to %%name directive.\n"); } #line 5289 "y.tab.c" /* yacc.c:1646 */ break; case 71: #line 2114 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("native"); Setattr((yyval.node),"name",(yyvsp[-4].id)); Setattr((yyval.node),"wrap:name",(yyvsp[-1].id)); add_symbols((yyval.node)); } #line 5300 "y.tab.c" /* yacc.c:1646 */ break; case 72: #line 2120 "parser.y" /* yacc.c:1646 */ { if (!SwigType_isfunction((yyvsp[-1].decl).type)) { Swig_error(cparse_file,cparse_line,"%%native declaration '%s' is not a function.\n", (yyvsp[-1].decl).id); (yyval.node) = 0; } else { Delete(SwigType_pop_function((yyvsp[-1].decl).type)); /* Need check for function here */ SwigType_push((yyvsp[-2].type),(yyvsp[-1].decl).type); (yyval.node) = new_node("native"); Setattr((yyval.node),"name",(yyvsp[-5].id)); Setattr((yyval.node),"wrap:name",(yyvsp[-1].decl).id); Setattr((yyval.node),"type",(yyvsp[-2].type)); Setattr((yyval.node),"parms",(yyvsp[-1].decl).parms); Setattr((yyval.node),"decl",(yyvsp[-1].decl).type); } add_symbols((yyval.node)); } #line 5322 "y.tab.c" /* yacc.c:1646 */ break; case 73: #line 2146 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("pragma"); Setattr((yyval.node),"lang",(yyvsp[-3].id)); Setattr((yyval.node),"name",(yyvsp[-2].id)); Setattr((yyval.node),"value",(yyvsp[0].str)); } #line 5333 "y.tab.c" /* yacc.c:1646 */ break; case 74: #line 2152 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("pragma"); Setattr((yyval.node),"lang",(yyvsp[-1].id)); Setattr((yyval.node),"name",(yyvsp[0].id)); } #line 5343 "y.tab.c" /* yacc.c:1646 */ break; case 75: #line 2159 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 5349 "y.tab.c" /* yacc.c:1646 */ break; case 76: #line 2160 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 5355 "y.tab.c" /* yacc.c:1646 */ break; case 77: #line 2163 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[-1].id); } #line 5361 "y.tab.c" /* yacc.c:1646 */ break; case 78: #line 2164 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char *) "swig"; } #line 5367 "y.tab.c" /* yacc.c:1646 */ break; case 79: #line 2171 "parser.y" /* yacc.c:1646 */ { SwigType *t = (yyvsp[-2].decl).type; Hash *kws = NewHash(); String *fixname; fixname = feature_identifier_fix((yyvsp[-2].decl).id); Setattr(kws,"name",(yyvsp[-1].id)); if (!Len(t)) t = 0; /* Special declarator check */ if (t) { if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ((yyvsp[-3].intvalue)) { Swig_name_rename_add(Namespaceprefix, nname,decl,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,nname,decl,kws); } Delete(nname); } else { if ((yyvsp[-3].intvalue)) { Swig_name_rename_add(Namespaceprefix,(fixname),decl,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),decl,kws); } } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ((yyvsp[-3].intvalue)) { Swig_name_rename_add(Namespaceprefix,(nname),0,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,(nname),0,kws); } Delete(nname); } } else { if ((yyvsp[-3].intvalue)) { Swig_name_rename_add(Namespaceprefix,(fixname),0,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),0,kws); } } (yyval.node) = 0; scanner_clear_rename(); } #line 5418 "y.tab.c" /* yacc.c:1646 */ break; case 80: #line 2217 "parser.y" /* yacc.c:1646 */ { String *fixname; Hash *kws = (yyvsp[-4].node); SwigType *t = (yyvsp[-2].decl).type; fixname = feature_identifier_fix((yyvsp[-2].decl).id); if (!Len(t)) t = 0; /* Special declarator check */ if (t) { if ((yyvsp[-1].dtype).qualifier) SwigType_push(t,(yyvsp[-1].dtype).qualifier); if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ((yyvsp[-6].intvalue)) { Swig_name_rename_add(Namespaceprefix, nname,decl,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,nname,decl,kws); } Delete(nname); } else { if ((yyvsp[-6].intvalue)) { Swig_name_rename_add(Namespaceprefix,(fixname),decl,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),decl,kws); } } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",fixname); if ((yyvsp[-6].intvalue)) { Swig_name_rename_add(Namespaceprefix,(nname),0,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,(nname),0,kws); } Delete(nname); } } else { if ((yyvsp[-6].intvalue)) { Swig_name_rename_add(Namespaceprefix,(fixname),0,kws,(yyvsp[-2].decl).parms); } else { Swig_name_namewarn_add(Namespaceprefix,(fixname),0,kws); } } (yyval.node) = 0; scanner_clear_rename(); } #line 5469 "y.tab.c" /* yacc.c:1646 */ break; case 81: #line 2263 "parser.y" /* yacc.c:1646 */ { if ((yyvsp[-5].intvalue)) { Swig_name_rename_add(Namespaceprefix,(yyvsp[-1].str),0,(yyvsp[-3].node),0); } else { Swig_name_namewarn_add(Namespaceprefix,(yyvsp[-1].str),0,(yyvsp[-3].node)); } (yyval.node) = 0; scanner_clear_rename(); } #line 5483 "y.tab.c" /* yacc.c:1646 */ break; case 82: #line 2274 "parser.y" /* yacc.c:1646 */ { (yyval.intvalue) = 1; } #line 5491 "y.tab.c" /* yacc.c:1646 */ break; case 83: #line 2277 "parser.y" /* yacc.c:1646 */ { (yyval.intvalue) = 0; } #line 5499 "y.tab.c" /* yacc.c:1646 */ break; case 84: #line 2304 "parser.y" /* yacc.c:1646 */ { String *val = (yyvsp[0].str) ? NewString((yyvsp[0].str)) : NewString("1"); new_feature((yyvsp[-4].id), val, 0, (yyvsp[-2].decl).id, (yyvsp[-2].decl).type, (yyvsp[-2].decl).parms, (yyvsp[-1].dtype).qualifier); (yyval.node) = 0; scanner_clear_rename(); } #line 5510 "y.tab.c" /* yacc.c:1646 */ break; case 85: #line 2310 "parser.y" /* yacc.c:1646 */ { String *val = Len((yyvsp[-4].str)) ? (yyvsp[-4].str) : 0; new_feature((yyvsp[-6].id), val, 0, (yyvsp[-2].decl).id, (yyvsp[-2].decl).type, (yyvsp[-2].decl).parms, (yyvsp[-1].dtype).qualifier); (yyval.node) = 0; scanner_clear_rename(); } #line 5521 "y.tab.c" /* yacc.c:1646 */ break; case 86: #line 2316 "parser.y" /* yacc.c:1646 */ { String *val = (yyvsp[0].str) ? NewString((yyvsp[0].str)) : NewString("1"); new_feature((yyvsp[-5].id), val, (yyvsp[-4].node), (yyvsp[-2].decl).id, (yyvsp[-2].decl).type, (yyvsp[-2].decl).parms, (yyvsp[-1].dtype).qualifier); (yyval.node) = 0; scanner_clear_rename(); } #line 5532 "y.tab.c" /* yacc.c:1646 */ break; case 87: #line 2322 "parser.y" /* yacc.c:1646 */ { String *val = Len((yyvsp[-5].str)) ? (yyvsp[-5].str) : 0; new_feature((yyvsp[-7].id), val, (yyvsp[-4].node), (yyvsp[-2].decl).id, (yyvsp[-2].decl).type, (yyvsp[-2].decl).parms, (yyvsp[-1].dtype).qualifier); (yyval.node) = 0; scanner_clear_rename(); } #line 5543 "y.tab.c" /* yacc.c:1646 */ break; case 88: #line 2330 "parser.y" /* yacc.c:1646 */ { String *val = (yyvsp[0].str) ? NewString((yyvsp[0].str)) : NewString("1"); new_feature((yyvsp[-2].id), val, 0, 0, 0, 0, 0); (yyval.node) = 0; scanner_clear_rename(); } #line 5554 "y.tab.c" /* yacc.c:1646 */ break; case 89: #line 2336 "parser.y" /* yacc.c:1646 */ { String *val = Len((yyvsp[-2].str)) ? (yyvsp[-2].str) : 0; new_feature((yyvsp[-4].id), val, 0, 0, 0, 0, 0); (yyval.node) = 0; scanner_clear_rename(); } #line 5565 "y.tab.c" /* yacc.c:1646 */ break; case 90: #line 2342 "parser.y" /* yacc.c:1646 */ { String *val = (yyvsp[0].str) ? NewString((yyvsp[0].str)) : NewString("1"); new_feature((yyvsp[-3].id), val, (yyvsp[-2].node), 0, 0, 0, 0); (yyval.node) = 0; scanner_clear_rename(); } #line 5576 "y.tab.c" /* yacc.c:1646 */ break; case 91: #line 2348 "parser.y" /* yacc.c:1646 */ { String *val = Len((yyvsp[-3].str)) ? (yyvsp[-3].str) : 0; new_feature((yyvsp[-5].id), val, (yyvsp[-2].node), 0, 0, 0, 0); (yyval.node) = 0; scanner_clear_rename(); } #line 5587 "y.tab.c" /* yacc.c:1646 */ break; case 92: #line 2356 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 5593 "y.tab.c" /* yacc.c:1646 */ break; case 93: #line 2357 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; } #line 5599 "y.tab.c" /* yacc.c:1646 */ break; case 94: #line 2358 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[-2].pl); } #line 5605 "y.tab.c" /* yacc.c:1646 */ break; case 95: #line 2361 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"name",(yyvsp[-2].id)); Setattr((yyval.node),"value",(yyvsp[0].str)); } #line 5615 "y.tab.c" /* yacc.c:1646 */ break; case 96: #line 2366 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"name",(yyvsp[-3].id)); Setattr((yyval.node),"value",(yyvsp[-1].str)); set_nextSibling((yyval.node),(yyvsp[0].node)); } #line 5626 "y.tab.c" /* yacc.c:1646 */ break; case 97: #line 2376 "parser.y" /* yacc.c:1646 */ { Parm *val; String *name; SwigType *t; if (Namespaceprefix) name = NewStringf("%s::%s", Namespaceprefix, (yyvsp[-2].decl).id); else name = NewString((yyvsp[-2].decl).id); val = (yyvsp[-4].pl); if ((yyvsp[-2].decl).parms) { Setmeta(val,"parms",(yyvsp[-2].decl).parms); } t = (yyvsp[-2].decl).type; if (!Len(t)) t = 0; if (t) { if ((yyvsp[-1].dtype).qualifier) SwigType_push(t,(yyvsp[-1].dtype).qualifier); if (SwigType_isfunction(t)) { SwigType *decl = SwigType_pop_function(t); if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(), nname, decl, "feature:varargs", val, 0); Delete(nname); } else { Swig_feature_set(Swig_cparse_features(), name, decl, "feature:varargs", val, 0); } Delete(decl); } else if (SwigType_ispointer(t)) { String *nname = NewStringf("*%s",name); Swig_feature_set(Swig_cparse_features(),nname,0,"feature:varargs",val, 0); Delete(nname); } } else { Swig_feature_set(Swig_cparse_features(),name,0,"feature:varargs",val, 0); } Delete(name); (yyval.node) = 0; } #line 5666 "y.tab.c" /* yacc.c:1646 */ break; case 98: #line 2412 "parser.y" /* yacc.c:1646 */ { (yyval.pl) = (yyvsp[0].pl); } #line 5672 "y.tab.c" /* yacc.c:1646 */ break; case 99: #line 2413 "parser.y" /* yacc.c:1646 */ { int i; int n; Parm *p; n = atoi(Char((yyvsp[-2].dtype).val)); if (n <= 0) { Swig_error(cparse_file, cparse_line,"Argument count in %%varargs must be positive.\n"); (yyval.pl) = 0; } else { String *name = Getattr((yyvsp[0].p), "name"); (yyval.pl) = Copy((yyvsp[0].p)); if (name) Setattr((yyval.pl), "name", NewStringf("%s%d", name, n)); for (i = 1; i < n; i++) { p = Copy((yyvsp[0].p)); name = Getattr(p, "name"); if (name) Setattr(p, "name", NewStringf("%s%d", name, n-i)); set_nextSibling(p,(yyval.pl)); Delete((yyval.pl)); (yyval.pl) = p; } } } #line 5701 "y.tab.c" /* yacc.c:1646 */ break; case 100: #line 2448 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; if ((yyvsp[-3].tmap).method) { String *code = 0; (yyval.node) = new_node("typemap"); Setattr((yyval.node),"method",(yyvsp[-3].tmap).method); if ((yyvsp[-3].tmap).kwargs) { ParmList *kw = (yyvsp[-3].tmap).kwargs; code = remove_block(kw, (yyvsp[0].str)); Setattr((yyval.node),"kwargs", (yyvsp[-3].tmap).kwargs); } code = code ? code : NewString((yyvsp[0].str)); Setattr((yyval.node),"code", code); Delete(code); appendChild((yyval.node),(yyvsp[-1].p)); } } #line 5723 "y.tab.c" /* yacc.c:1646 */ break; case 101: #line 2465 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; if ((yyvsp[-3].tmap).method) { (yyval.node) = new_node("typemap"); Setattr((yyval.node),"method",(yyvsp[-3].tmap).method); appendChild((yyval.node),(yyvsp[-1].p)); } } #line 5736 "y.tab.c" /* yacc.c:1646 */ break; case 102: #line 2473 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; if ((yyvsp[-5].tmap).method) { (yyval.node) = new_node("typemapcopy"); Setattr((yyval.node),"method",(yyvsp[-5].tmap).method); Setattr((yyval.node),"pattern", Getattr((yyvsp[-1].p),"pattern")); appendChild((yyval.node),(yyvsp[-3].p)); } } #line 5750 "y.tab.c" /* yacc.c:1646 */ break; case 103: #line 2486 "parser.y" /* yacc.c:1646 */ { Hash *p; String *name; p = nextSibling((yyvsp[0].node)); if (p && (!Getattr(p,"value"))) { /* this is the deprecated two argument typemap form */ Swig_warning(WARN_DEPRECATED_TYPEMAP_LANG,cparse_file, cparse_line, "Specifying the language name in %%typemap is deprecated - use #ifdef SWIG instead.\n"); /* two argument typemap form */ name = Getattr((yyvsp[0].node),"name"); if (!name || (Strcmp(name,typemap_lang))) { (yyval.tmap).method = 0; (yyval.tmap).kwargs = 0; } else { (yyval.tmap).method = Getattr(p,"name"); (yyval.tmap).kwargs = nextSibling(p); } } else { /* one-argument typemap-form */ (yyval.tmap).method = Getattr((yyvsp[0].node),"name"); (yyval.tmap).kwargs = p; } } #line 5778 "y.tab.c" /* yacc.c:1646 */ break; case 104: #line 2511 "parser.y" /* yacc.c:1646 */ { (yyval.p) = (yyvsp[-1].p); set_nextSibling((yyval.p),(yyvsp[0].p)); } #line 5787 "y.tab.c" /* yacc.c:1646 */ break; case 105: #line 2517 "parser.y" /* yacc.c:1646 */ { (yyval.p) = (yyvsp[-1].p); set_nextSibling((yyval.p),(yyvsp[0].p)); } #line 5796 "y.tab.c" /* yacc.c:1646 */ break; case 106: #line 2521 "parser.y" /* yacc.c:1646 */ { (yyval.p) = 0;} #line 5802 "y.tab.c" /* yacc.c:1646 */ break; case 107: #line 2524 "parser.y" /* yacc.c:1646 */ { Parm *parm; SwigType_push((yyvsp[-1].type),(yyvsp[0].decl).type); (yyval.p) = new_node("typemapitem"); parm = NewParmWithoutFileLineInfo((yyvsp[-1].type),(yyvsp[0].decl).id); Setattr((yyval.p),"pattern",parm); Setattr((yyval.p),"parms", (yyvsp[0].decl).parms); Delete(parm); /* $$ = NewParmWithoutFileLineInfo($1,$2.id); Setattr($$,"parms",$2.parms); */ } #line 5818 "y.tab.c" /* yacc.c:1646 */ break; case 108: #line 2535 "parser.y" /* yacc.c:1646 */ { (yyval.p) = new_node("typemapitem"); Setattr((yyval.p),"pattern",(yyvsp[-1].pl)); /* Setattr($$,"multitype",$2); */ } #line 5828 "y.tab.c" /* yacc.c:1646 */ break; case 109: #line 2540 "parser.y" /* yacc.c:1646 */ { (yyval.p) = new_node("typemapitem"); Setattr((yyval.p),"pattern", (yyvsp[-4].pl)); /* Setattr($$,"multitype",$2); */ Setattr((yyval.p),"parms",(yyvsp[-1].pl)); } #line 5839 "y.tab.c" /* yacc.c:1646 */ break; case 110: #line 2553 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("types"); Setattr((yyval.node),"parms",(yyvsp[-2].pl)); if ((yyvsp[0].str)) Setattr((yyval.node),"convcode",NewString((yyvsp[0].str))); } #line 5850 "y.tab.c" /* yacc.c:1646 */ break; case 111: #line 2565 "parser.y" /* yacc.c:1646 */ { Parm *p, *tp; Node *n; Node *outer_class = currentOuterClass; Symtab *tscope = 0; int specialized = 0; int variadic = 0; (yyval.node) = 0; tscope = Swig_symbol_current(); /* Get the current scope */ /* If the class name is qualified, we need to create or lookup namespace entries */ if (!inclass) { (yyvsp[-4].str) = resolve_create_node_scope((yyvsp[-4].str)); } if (nscope_inner && Strcmp(nodeType(nscope_inner), "class") == 0) { outer_class = nscope_inner; } /* We use the new namespace entry 'nscope' only to emit the template node. The template parameters are resolved in the current 'tscope'. This is closer to the C++ (typedef) behavior. */ n = Swig_cparse_template_locate((yyvsp[-4].str),(yyvsp[-2].p),tscope); /* Patch the argument types to respect namespaces */ p = (yyvsp[-2].p); while (p) { SwigType *value = Getattr(p,"value"); if (!value) { SwigType *ty = Getattr(p,"type"); if (ty) { SwigType *rty = 0; int reduce = template_reduce; if (reduce || !SwigType_ispointer(ty)) { rty = Swig_symbol_typedef_reduce(ty,tscope); if (!reduce) reduce = SwigType_ispointer(rty); } ty = reduce ? Swig_symbol_type_qualify(rty,tscope) : Swig_symbol_type_qualify(ty,tscope); Setattr(p,"type",ty); Delete(ty); Delete(rty); } } else { value = Swig_symbol_type_qualify(value,tscope); Setattr(p,"value",value); Delete(value); } p = nextSibling(p); } /* Look for the template */ { Node *nn = n; Node *linklistend = 0; Node *linkliststart = 0; while (nn) { Node *templnode = 0; if (Strcmp(nodeType(nn),"template") == 0) { int nnisclass = (Strcmp(Getattr(nn,"templatetype"),"class") == 0); /* if not a templated class it is a templated function */ Parm *tparms = Getattr(nn,"templateparms"); if (!tparms) { specialized = 1; } else if (Getattr(tparms,"variadic") && strncmp(Char(Getattr(tparms,"variadic")), "1", 1)==0) { variadic = 1; } if (nnisclass && !variadic && !specialized && (ParmList_len((yyvsp[-2].p)) > ParmList_len(tparms))) { Swig_error(cparse_file, cparse_line, "Too many template parameters. Maximum of %d.\n", ParmList_len(tparms)); } else if (nnisclass && !specialized && ((ParmList_len((yyvsp[-2].p)) < (ParmList_numrequired(tparms) - (variadic?1:0))))) { /* Variadic parameter is optional */ Swig_error(cparse_file, cparse_line, "Not enough template parameters specified. %d required.\n", (ParmList_numrequired(tparms)-(variadic?1:0)) ); } else if (!nnisclass && ((ParmList_len((yyvsp[-2].p)) != ParmList_len(tparms)))) { /* must be an overloaded templated method - ignore it as it is overloaded with a different number of template parameters */ nn = Getattr(nn,"sym:nextSibling"); /* repeat for overloaded templated functions */ continue; } else { String *tname = Copy((yyvsp[-4].str)); int def_supplied = 0; /* Expand the template */ Node *templ = Swig_symbol_clookup((yyvsp[-4].str),0); Parm *targs = templ ? Getattr(templ,"templateparms") : 0; ParmList *temparms; if (specialized) temparms = CopyParmList((yyvsp[-2].p)); else temparms = CopyParmList(tparms); /* Create typedef's and arguments */ p = (yyvsp[-2].p); tp = temparms; if (!p && ParmList_len(p) != ParmList_len(temparms)) { /* we have no template parameters supplied in %template for a template that has default args*/ p = tp; def_supplied = 1; } while (p) { String *value = Getattr(p,"value"); if (def_supplied) { Setattr(p,"default","1"); } if (value) { Setattr(tp,"value",value); } else { SwigType *ty = Getattr(p,"type"); if (ty) { Setattr(tp,"type",ty); } Delattr(tp,"value"); } /* fix default arg values */ if (targs) { Parm *pi = temparms; Parm *ti = targs; String *tv = Getattr(tp,"value"); if (!tv) tv = Getattr(tp,"type"); while(pi != tp && ti && pi) { String *name = Getattr(ti,"name"); String *value = Getattr(pi,"value"); if (!value) value = Getattr(pi,"type"); Replaceid(tv, name, value); pi = nextSibling(pi); ti = nextSibling(ti); } } p = nextSibling(p); tp = nextSibling(tp); if (!p && tp) { p = tp; def_supplied = 1; } else if (p && !tp) { /* Variadic template - tp < p */ SWIG_WARN_NODE_BEGIN(nn); Swig_warning(WARN_CPP11_VARIADIC_TEMPLATE,cparse_file, cparse_line,"Only the first variadic template argument is currently supported.\n"); SWIG_WARN_NODE_END(nn); break; } } templnode = copy_node(nn); update_nested_classes(templnode); /* update classes nested within template */ /* We need to set the node name based on name used to instantiate */ Setattr(templnode,"name",tname); Delete(tname); if (!specialized) { Delattr(templnode,"sym:typename"); } else { Setattr(templnode,"sym:typename","1"); } /* for now, nested %template is allowed only in the same scope as the template declaration */ if ((yyvsp[-6].id) && !(nnisclass && ((outer_class && (outer_class != Getattr(nn, "nested:outer"))) ||(extendmode && current_class && (current_class != Getattr(nn, "nested:outer")))))) { /* Comment this out for 1.3.28. We need to re-enable it later but first we need to move %ignore from using %rename to use %feature(ignore). String *symname = Swig_name_make(templnode,0,$3,0,0); */ String *symname = NewString((yyvsp[-6].id)); Swig_cparse_template_expand(templnode,symname,temparms,tscope); Setattr(templnode,"sym:name",symname); } else { static int cnt = 0; String *nname = NewStringf("__dummy_%d__", cnt++); Swig_cparse_template_expand(templnode,nname,temparms,tscope); Setattr(templnode,"sym:name",nname); Delete(nname); Setattr(templnode,"feature:onlychildren", "typemap,typemapitem,typemapcopy,typedef,types,fragment"); if ((yyvsp[-6].id)) { Swig_warning(WARN_PARSE_NESTED_TEMPLATE, cparse_file, cparse_line, "Named nested template instantiations not supported. Processing as if no name was given to %%template().\n"); } } Delattr(templnode,"templatetype"); Setattr(templnode,"template",nn); Setfile(templnode,cparse_file); Setline(templnode,cparse_line); Delete(temparms); if (outer_class && nnisclass) { SetFlag(templnode, "nested"); Setattr(templnode, "nested:outer", outer_class); } add_symbols_copy(templnode); if (Strcmp(nodeType(templnode),"class") == 0) { /* Identify pure abstract methods */ Setattr(templnode,"abstracts", pure_abstracts(firstChild(templnode))); /* Set up inheritance in symbol table */ { Symtab *csyms; List *baselist = Getattr(templnode,"baselist"); csyms = Swig_symbol_current(); Swig_symbol_setscope(Getattr(templnode,"symtab")); if (baselist) { List *bases = Swig_make_inherit_list(Getattr(templnode,"name"),baselist, Namespaceprefix); if (bases) { Iterator s; for (s = First(bases); s.item; s = Next(s)) { Symtab *st = Getattr(s.item,"symtab"); if (st) { Setfile(st,Getfile(s.item)); Setline(st,Getline(s.item)); Swig_symbol_inherit(st); } } Delete(bases); } } Swig_symbol_setscope(csyms); } /* Merge in %extend methods for this class. This only merges methods within %extend for a template specialized class such as template class K {}; %extend K { ... } The copy_node() call above has already added in the generic %extend methods such as template class K {}; %extend K { ... } */ /* !!! This may be broken. We may have to add the %extend methods at the beginning of the class */ { String *stmp = 0; String *clsname; Node *am; if (Namespaceprefix) { clsname = stmp = NewStringf("%s::%s", Namespaceprefix, Getattr(templnode,"name")); } else { clsname = Getattr(templnode,"name"); } am = Getattr(Swig_extend_hash(),clsname); if (am) { Symtab *st = Swig_symbol_current(); Swig_symbol_setscope(Getattr(templnode,"symtab")); /* Printf(stdout,"%s: %s %p %p\n", Getattr(templnode,"name"), clsname, Swig_symbol_current(), Getattr(templnode,"symtab")); */ Swig_extend_merge(templnode,am); Swig_symbol_setscope(st); Swig_extend_append_previous(templnode,am); Delattr(Swig_extend_hash(),clsname); } if (stmp) Delete(stmp); } /* Add to classes hash */ if (!classes) classes = NewHash(); if (Namespaceprefix) { String *temp = NewStringf("%s::%s", Namespaceprefix, Getattr(templnode,"name")); Setattr(classes,temp,templnode); Delete(temp); } else { String *qs = Swig_symbol_qualifiedscopename(templnode); Setattr(classes, qs,templnode); Delete(qs); } } } /* all the overloaded templated functions are added into a linked list */ if (!linkliststart) linkliststart = templnode; if (nscope_inner) { /* non-global namespace */ if (templnode) { appendChild(nscope_inner,templnode); Delete(templnode); if (nscope) (yyval.node) = nscope; } } else { /* global namespace */ if (!linklistend) { (yyval.node) = templnode; } else { set_nextSibling(linklistend,templnode); Delete(templnode); } linklistend = templnode; } } nn = Getattr(nn,"sym:nextSibling"); /* repeat for overloaded templated functions. If a templated class there will never be a sibling. */ } update_defaultargs(linkliststart); } Swig_symbol_setscope(tscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } #line 6146 "y.tab.c" /* yacc.c:1646 */ break; case 112: #line 2863 "parser.y" /* yacc.c:1646 */ { Swig_warning(0,cparse_file, cparse_line,"%s\n", (yyvsp[0].str)); (yyval.node) = 0; } #line 6155 "y.tab.c" /* yacc.c:1646 */ break; case 113: #line 2873 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); if ((yyval.node)) { add_symbols((yyval.node)); default_arguments((yyval.node)); } } #line 6167 "y.tab.c" /* yacc.c:1646 */ break; case 114: #line 2880 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 6173 "y.tab.c" /* yacc.c:1646 */ break; case 115: #line 2881 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 6179 "y.tab.c" /* yacc.c:1646 */ break; case 116: #line 2885 "parser.y" /* yacc.c:1646 */ { if (Strcmp((yyvsp[-1].str),"C") == 0) { cparse_externc = 1; } } #line 6189 "y.tab.c" /* yacc.c:1646 */ break; case 117: #line 2889 "parser.y" /* yacc.c:1646 */ { cparse_externc = 0; if (Strcmp((yyvsp[-4].str),"C") == 0) { Node *n = firstChild((yyvsp[-1].node)); (yyval.node) = new_node("extern"); Setattr((yyval.node),"name",(yyvsp[-4].str)); appendChild((yyval.node),n); while (n) { SwigType *decl = Getattr(n,"decl"); if (SwigType_isfunction(decl) && !Equal(Getattr(n, "storage"), "typedef")) { Setattr(n,"storage","externc"); } n = nextSibling(n); } } else { Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\".\n", (yyvsp[-4].str)); (yyval.node) = new_node("extern"); Setattr((yyval.node),"name",(yyvsp[-4].str)); appendChild((yyval.node),firstChild((yyvsp[-1].node))); } } #line 6215 "y.tab.c" /* yacc.c:1646 */ break; case 118: #line 2910 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); SWIG_WARN_NODE_BEGIN((yyval.node)); Swig_warning(WARN_CPP11_LAMBDA, cparse_file, cparse_line, "Lambda expressions and closures are not fully supported yet.\n"); SWIG_WARN_NODE_END((yyval.node)); } #line 6226 "y.tab.c" /* yacc.c:1646 */ break; case 119: #line 2916 "parser.y" /* yacc.c:1646 */ { /* Convert using statement to a typedef statement */ (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"type",(yyvsp[-2].type)); Setattr((yyval.node),"storage","typedef"); Setattr((yyval.node),"name",(yyvsp[-4].str)); Setattr((yyval.node),"decl",(yyvsp[-1].decl).type); SetFlag((yyval.node),"typealias"); add_symbols((yyval.node)); } #line 6241 "y.tab.c" /* yacc.c:1646 */ break; case 120: #line 2926 "parser.y" /* yacc.c:1646 */ { /* Convert alias template to a "template" typedef statement */ (yyval.node) = new_node("template"); Setattr((yyval.node),"type",(yyvsp[-2].type)); Setattr((yyval.node),"storage","typedef"); Setattr((yyval.node),"name",(yyvsp[-4].str)); Setattr((yyval.node),"decl",(yyvsp[-1].decl).type); Setattr((yyval.node),"templateparms",(yyvsp[-7].tparms)); Setattr((yyval.node),"templatetype","cdecl"); SetFlag((yyval.node),"aliastemplate"); add_symbols((yyval.node)); } #line 6258 "y.tab.c" /* yacc.c:1646 */ break; case 121: #line 2944 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("cdecl"); if ((yyvsp[-1].dtype).qualifier) SwigType_push((yyvsp[-2].decl).type,(yyvsp[-1].dtype).qualifier); Setattr((yyval.node),"type",(yyvsp[-3].type)); Setattr((yyval.node),"storage",(yyvsp[-4].id)); Setattr((yyval.node),"name",(yyvsp[-2].decl).id); Setattr((yyval.node),"decl",(yyvsp[-2].decl).type); Setattr((yyval.node),"parms",(yyvsp[-2].decl).parms); Setattr((yyval.node),"value",(yyvsp[-1].dtype).val); Setattr((yyval.node),"throws",(yyvsp[-1].dtype).throws); Setattr((yyval.node),"throw",(yyvsp[-1].dtype).throwf); Setattr((yyval.node),"noexcept",(yyvsp[-1].dtype).nexcept); if ((yyvsp[-1].dtype).val && (yyvsp[-1].dtype).type) { /* store initializer type as it might be different to the declared type */ SwigType *valuetype = NewSwigType((yyvsp[-1].dtype).type); if (Len(valuetype) > 0) Setattr((yyval.node),"valuetype",valuetype); else Delete(valuetype); } if (!(yyvsp[0].node)) { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } } else { Node *n = (yyvsp[0].node); /* Inherit attributes */ while (n) { String *type = Copy((yyvsp[-3].type)); Setattr(n,"type",type); Setattr(n,"storage",(yyvsp[-4].id)); n = nextSibling(n); Delete(type); } } if ((yyvsp[-1].dtype).bitfield) { Setattr((yyval.node),"bitfield", (yyvsp[-1].dtype).bitfield); } /* Look for "::" declarations (ignored) */ if (Strstr((yyvsp[-2].decl).id,"::")) { /* This is a special case. If the scope name of the declaration exactly matches that of the declaration, then we will allow it. Otherwise, delete. */ String *p = Swig_scopename_prefix((yyvsp[-2].decl).id); if (p) { if ((Namespaceprefix && Strcmp(p, Namespaceprefix) == 0) || (Classprefix && Strcmp(p, Classprefix) == 0)) { String *lstr = Swig_scopename_last((yyvsp[-2].decl).id); Setattr((yyval.node),"name",lstr); Delete(lstr); set_nextSibling((yyval.node),(yyvsp[0].node)); } else { Delete((yyval.node)); (yyval.node) = (yyvsp[0].node); } Delete(p); } else { Delete((yyval.node)); (yyval.node) = (yyvsp[0].node); } } else { set_nextSibling((yyval.node),(yyvsp[0].node)); } } #line 6329 "y.tab.c" /* yacc.c:1646 */ break; case 122: #line 3012 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("cdecl"); if ((yyvsp[-1].dtype).qualifier) SwigType_push((yyvsp[-4].decl).type,(yyvsp[-1].dtype).qualifier); Setattr((yyval.node),"type",(yyvsp[-2].node)); Setattr((yyval.node),"storage",(yyvsp[-6].id)); Setattr((yyval.node),"name",(yyvsp[-4].decl).id); Setattr((yyval.node),"decl",(yyvsp[-4].decl).type); Setattr((yyval.node),"parms",(yyvsp[-4].decl).parms); Setattr((yyval.node),"value",(yyvsp[-1].dtype).val); Setattr((yyval.node),"throws",(yyvsp[-1].dtype).throws); Setattr((yyval.node),"throw",(yyvsp[-1].dtype).throwf); Setattr((yyval.node),"noexcept",(yyvsp[-1].dtype).nexcept); if (!(yyvsp[0].node)) { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } } else { Node *n = (yyvsp[0].node); while (n) { String *type = Copy((yyvsp[-2].node)); Setattr(n,"type",type); Setattr(n,"storage",(yyvsp[-6].id)); n = nextSibling(n); Delete(type); } } if ((yyvsp[-1].dtype).bitfield) { Setattr((yyval.node),"bitfield", (yyvsp[-1].dtype).bitfield); } if (Strstr((yyvsp[-4].decl).id,"::")) { String *p = Swig_scopename_prefix((yyvsp[-4].decl).id); if (p) { if ((Namespaceprefix && Strcmp(p, Namespaceprefix) == 0) || (Classprefix && Strcmp(p, Classprefix) == 0)) { String *lstr = Swig_scopename_last((yyvsp[-4].decl).id); Setattr((yyval.node),"name",lstr); Delete(lstr); set_nextSibling((yyval.node),(yyvsp[0].node)); } else { Delete((yyval.node)); (yyval.node) = (yyvsp[0].node); } Delete(p); } else { Delete((yyval.node)); (yyval.node) = (yyvsp[0].node); } } else { set_nextSibling((yyval.node),(yyvsp[0].node)); } } #line 6388 "y.tab.c" /* yacc.c:1646 */ break; case 123: #line 3070 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; Clear(scanner_ccode); } #line 6397 "y.tab.c" /* yacc.c:1646 */ break; case 124: #line 3074 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("cdecl"); if ((yyvsp[-1].dtype).qualifier) SwigType_push((yyvsp[-2].decl).type,(yyvsp[-1].dtype).qualifier); Setattr((yyval.node),"name",(yyvsp[-2].decl).id); Setattr((yyval.node),"decl",(yyvsp[-2].decl).type); Setattr((yyval.node),"parms",(yyvsp[-2].decl).parms); Setattr((yyval.node),"value",(yyvsp[-1].dtype).val); Setattr((yyval.node),"throws",(yyvsp[-1].dtype).throws); Setattr((yyval.node),"throw",(yyvsp[-1].dtype).throwf); Setattr((yyval.node),"noexcept",(yyvsp[-1].dtype).nexcept); if ((yyvsp[-1].dtype).bitfield) { Setattr((yyval.node),"bitfield", (yyvsp[-1].dtype).bitfield); } if (!(yyvsp[0].node)) { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } } else { set_nextSibling((yyval.node),(yyvsp[0].node)); } } #line 6425 "y.tab.c" /* yacc.c:1646 */ break; case 125: #line 3097 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.node) = 0; } #line 6434 "y.tab.c" /* yacc.c:1646 */ break; case 126: #line 3101 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; if (yychar == RPAREN) { Swig_error(cparse_file, cparse_line, "Unexpected ')'.\n"); } else { Swig_error(cparse_file, cparse_line, "Syntax error - possibly a missing semicolon.\n"); } exit(1); } #line 6448 "y.tab.c" /* yacc.c:1646 */ break; case 127: #line 3112 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).qualifier = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 6460 "y.tab.c" /* yacc.c:1646 */ break; case 128: #line 3119 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).qualifier = (yyvsp[-1].str); (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 6472 "y.tab.c" /* yacc.c:1646 */ break; case 129: #line 3126 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).qualifier = 0; (yyval.dtype).throws = (yyvsp[-1].dtype).throws; (yyval.dtype).throwf = (yyvsp[-1].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-1].dtype).nexcept; } #line 6484 "y.tab.c" /* yacc.c:1646 */ break; case 130: #line 3133 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).qualifier = (yyvsp[-2].str); (yyval.dtype).throws = (yyvsp[-1].dtype).throws; (yyval.dtype).throwf = (yyvsp[-1].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-1].dtype).nexcept; } #line 6496 "y.tab.c" /* yacc.c:1646 */ break; case 131: #line 3142 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].type); } #line 6502 "y.tab.c" /* yacc.c:1646 */ break; case 132: #line 3143 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].type); } #line 6508 "y.tab.c" /* yacc.c:1646 */ break; case 133: #line 3144 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].type); } #line 6514 "y.tab.c" /* yacc.c:1646 */ break; case 134: #line 3148 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].type); } #line 6520 "y.tab.c" /* yacc.c:1646 */ break; case 135: #line 3149 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].str); } #line 6526 "y.tab.c" /* yacc.c:1646 */ break; case 136: #line 3150 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].type); } #line 6532 "y.tab.c" /* yacc.c:1646 */ break; case 137: #line 3161 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("lambda"); Setattr((yyval.node),"name",(yyvsp[-8].str)); add_symbols((yyval.node)); } #line 6542 "y.tab.c" /* yacc.c:1646 */ break; case 138: #line 3166 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("lambda"); Setattr((yyval.node),"name",(yyvsp[-10].str)); add_symbols((yyval.node)); } #line 6552 "y.tab.c" /* yacc.c:1646 */ break; case 139: #line 3171 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("lambda"); Setattr((yyval.node),"name",(yyvsp[-4].str)); add_symbols((yyval.node)); } #line 6562 "y.tab.c" /* yacc.c:1646 */ break; case 140: #line 3178 "parser.y" /* yacc.c:1646 */ { skip_balanced('[',']'); (yyval.node) = 0; } #line 6571 "y.tab.c" /* yacc.c:1646 */ break; case 141: #line 3184 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.node) = 0; } #line 6580 "y.tab.c" /* yacc.c:1646 */ break; case 142: #line 3189 "parser.y" /* yacc.c:1646 */ { (yyval.pl) = 0; } #line 6588 "y.tab.c" /* yacc.c:1646 */ break; case 143: #line 3192 "parser.y" /* yacc.c:1646 */ { skip_balanced('(',')'); } #line 6596 "y.tab.c" /* yacc.c:1646 */ break; case 144: #line 3194 "parser.y" /* yacc.c:1646 */ { (yyval.pl) = 0; } #line 6604 "y.tab.c" /* yacc.c:1646 */ break; case 145: #line 3205 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (char *)"enum"; } #line 6612 "y.tab.c" /* yacc.c:1646 */ break; case 146: #line 3208 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (char *)"enum class"; } #line 6620 "y.tab.c" /* yacc.c:1646 */ break; case 147: #line 3211 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (char *)"enum struct"; } #line 6628 "y.tab.c" /* yacc.c:1646 */ break; case 148: #line 3220 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].type); } #line 6636 "y.tab.c" /* yacc.c:1646 */ break; case 149: #line 3223 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 6642 "y.tab.c" /* yacc.c:1646 */ break; case 150: #line 3230 "parser.y" /* yacc.c:1646 */ { SwigType *ty = 0; int scopedenum = (yyvsp[-2].id) && !Equal((yyvsp[-3].node), "enum"); (yyval.node) = new_node("enumforward"); ty = NewStringf("enum %s", (yyvsp[-2].id)); Setattr((yyval.node),"enumkey",(yyvsp[-3].node)); if (scopedenum) SetFlag((yyval.node), "scopedenum"); Setattr((yyval.node),"name",(yyvsp[-2].id)); Setattr((yyval.node),"inherit",(yyvsp[-1].node)); Setattr((yyval.node),"type",ty); Setattr((yyval.node),"sym:weak", "1"); add_symbols((yyval.node)); } #line 6661 "y.tab.c" /* yacc.c:1646 */ break; case 151: #line 3252 "parser.y" /* yacc.c:1646 */ { SwigType *ty = 0; int scopedenum = (yyvsp[-5].id) && !Equal((yyvsp[-6].node), "enum"); (yyval.node) = new_node("enum"); ty = NewStringf("enum %s", (yyvsp[-5].id)); Setattr((yyval.node),"enumkey",(yyvsp[-6].node)); if (scopedenum) SetFlag((yyval.node), "scopedenum"); Setattr((yyval.node),"name",(yyvsp[-5].id)); Setattr((yyval.node),"inherit",(yyvsp[-4].node)); Setattr((yyval.node),"type",ty); appendChild((yyval.node),(yyvsp[-2].node)); add_symbols((yyval.node)); /* Add to tag space */ if (scopedenum) { Swig_symbol_newscope(); Swig_symbol_setscopename((yyvsp[-5].id)); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } add_symbols((yyvsp[-2].node)); /* Add enum values to appropriate enum or enum class scope */ if (scopedenum) { Setattr((yyval.node),"symtab", Swig_symbol_popscope()); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } } #line 6695 "y.tab.c" /* yacc.c:1646 */ break; case 152: #line 3281 "parser.y" /* yacc.c:1646 */ { Node *n; SwigType *ty = 0; String *unnamed = 0; int unnamedinstance = 0; int scopedenum = (yyvsp[-7].id) && !Equal((yyvsp[-8].node), "enum"); (yyval.node) = new_node("enum"); Setattr((yyval.node),"enumkey",(yyvsp[-8].node)); if (scopedenum) SetFlag((yyval.node), "scopedenum"); Setattr((yyval.node),"inherit",(yyvsp[-6].node)); if ((yyvsp[-7].id)) { Setattr((yyval.node),"name",(yyvsp[-7].id)); ty = NewStringf("enum %s", (yyvsp[-7].id)); } else if ((yyvsp[-2].decl).id) { unnamed = make_unnamed(); ty = NewStringf("enum %s", unnamed); Setattr((yyval.node),"unnamed",unnamed); /* name is not set for unnamed enum instances, e.g. enum { foo } Instance; */ if ((yyvsp[-9].id) && Cmp((yyvsp[-9].id),"typedef") == 0) { Setattr((yyval.node),"name",(yyvsp[-2].decl).id); } else { unnamedinstance = 1; } Setattr((yyval.node),"storage",(yyvsp[-9].id)); } if ((yyvsp[-2].decl).id && Cmp((yyvsp[-9].id),"typedef") == 0) { Setattr((yyval.node),"tdname",(yyvsp[-2].decl).id); Setattr((yyval.node),"allows_typedef","1"); } appendChild((yyval.node),(yyvsp[-4].node)); n = new_node("cdecl"); Setattr(n,"type",ty); Setattr(n,"name",(yyvsp[-2].decl).id); Setattr(n,"storage",(yyvsp[-9].id)); Setattr(n,"decl",(yyvsp[-2].decl).type); Setattr(n,"parms",(yyvsp[-2].decl).parms); Setattr(n,"unnamed",unnamed); if (unnamedinstance) { SwigType *cty = NewString("enum "); Setattr((yyval.node),"type",cty); SetFlag((yyval.node),"unnamedinstance"); SetFlag(n,"unnamedinstance"); Delete(cty); } if ((yyvsp[0].node)) { Node *p = (yyvsp[0].node); set_nextSibling(n,p); while (p) { SwigType *cty = Copy(ty); Setattr(p,"type",cty); Setattr(p,"unnamed",unnamed); Setattr(p,"storage",(yyvsp[-9].id)); Delete(cty); p = nextSibling(p); } } else { if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr(n,"code",code); Delete(code); } } /* Ensure that typedef enum ABC {foo} XYZ; uses XYZ for sym:name, like structs. * Note that class_rename/yyrename are bit of a mess so used this simple approach to change the name. */ if ((yyvsp[-2].decl).id && (yyvsp[-7].id) && Cmp((yyvsp[-9].id),"typedef") == 0) { String *name = NewString((yyvsp[-2].decl).id); Setattr((yyval.node), "parser:makename", name); Delete(name); } add_symbols((yyval.node)); /* Add enum to tag space */ set_nextSibling((yyval.node),n); Delete(n); if (scopedenum) { Swig_symbol_newscope(); Swig_symbol_setscopename((yyvsp[-7].id)); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } add_symbols((yyvsp[-4].node)); /* Add enum values to appropriate enum or enum class scope */ if (scopedenum) { Setattr((yyval.node),"symtab", Swig_symbol_popscope()); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } add_symbols(n); Delete(unnamed); } #line 6796 "y.tab.c" /* yacc.c:1646 */ break; case 153: #line 3379 "parser.y" /* yacc.c:1646 */ { /* This is a sick hack. If the ctor_end has parameters, and the parms parameter only has 1 parameter, this could be a declaration of the form: type (id)(parms) Otherwise it's an error. */ int err = 0; (yyval.node) = 0; if ((ParmList_len((yyvsp[-2].pl)) == 1) && (!Swig_scopename_check((yyvsp[-4].type)))) { SwigType *ty = Getattr((yyvsp[-2].pl),"type"); String *name = Getattr((yyvsp[-2].pl),"name"); err = 1; if (!name) { (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"type",(yyvsp[-4].type)); Setattr((yyval.node),"storage",(yyvsp[-5].id)); Setattr((yyval.node),"name",ty); if ((yyvsp[0].decl).have_parms) { SwigType *decl = NewStringEmpty(); SwigType_add_function(decl,(yyvsp[0].decl).parms); Setattr((yyval.node),"decl",decl); Setattr((yyval.node),"parms",(yyvsp[0].decl).parms); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } } if ((yyvsp[0].decl).defarg) { Setattr((yyval.node),"value",(yyvsp[0].decl).defarg); } Setattr((yyval.node),"throws",(yyvsp[0].decl).throws); Setattr((yyval.node),"throw",(yyvsp[0].decl).throwf); Setattr((yyval.node),"noexcept",(yyvsp[0].decl).nexcept); err = 0; } } if (err) { Swig_error(cparse_file,cparse_line,"Syntax error in input(2).\n"); exit(1); } } #line 6847 "y.tab.c" /* yacc.c:1646 */ break; case 154: #line 3431 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 6853 "y.tab.c" /* yacc.c:1646 */ break; case 155: #line 3432 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 6859 "y.tab.c" /* yacc.c:1646 */ break; case 156: #line 3433 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 6865 "y.tab.c" /* yacc.c:1646 */ break; case 157: #line 3434 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 6871 "y.tab.c" /* yacc.c:1646 */ break; case 158: #line 3435 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 6877 "y.tab.c" /* yacc.c:1646 */ break; case 159: #line 3436 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 6883 "y.tab.c" /* yacc.c:1646 */ break; case 160: #line 3441 "parser.y" /* yacc.c:1646 */ { String *prefix; List *bases = 0; Node *scope = 0; String *code; (yyval.node) = new_node("class"); Setline((yyval.node),cparse_start_line); Setattr((yyval.node),"kind",(yyvsp[-3].id)); if ((yyvsp[-1].bases)) { Setattr((yyval.node),"baselist", Getattr((yyvsp[-1].bases),"public")); Setattr((yyval.node),"protectedbaselist", Getattr((yyvsp[-1].bases),"protected")); Setattr((yyval.node),"privatebaselist", Getattr((yyvsp[-1].bases),"private")); } Setattr((yyval.node),"allows_typedef","1"); /* preserve the current scope */ Setattr((yyval.node),"prev_symtab",Swig_symbol_current()); /* If the class name is qualified. We need to create or lookup namespace/scope entries */ scope = resolve_create_node_scope((yyvsp[-2].str)); /* save nscope_inner to the class - it may be overwritten in nested classes*/ Setattr((yyval.node), "nested:innerscope", nscope_inner); Setattr((yyval.node), "nested:nscope", nscope); Setfile(scope,cparse_file); Setline(scope,cparse_line); (yyvsp[-2].str) = scope; Setattr((yyval.node),"name",(yyvsp[-2].str)); if (currentOuterClass) { SetFlag((yyval.node), "nested"); Setattr((yyval.node), "nested:outer", currentOuterClass); set_access_mode((yyval.node)); } Swig_features_get(Swig_cparse_features(), Namespaceprefix, Getattr((yyval.node), "name"), 0, (yyval.node)); /* save yyrename to the class attribute, to be used later in add_symbols()*/ Setattr((yyval.node), "class_rename", make_name((yyval.node), (yyvsp[-2].str), 0)); Setattr((yyval.node), "Classprefix", (yyvsp[-2].str)); Classprefix = NewString((yyvsp[-2].str)); /* Deal with inheritance */ if ((yyvsp[-1].bases)) bases = Swig_make_inherit_list((yyvsp[-2].str),Getattr((yyvsp[-1].bases),"public"),Namespaceprefix); prefix = SwigType_istemplate_templateprefix((yyvsp[-2].str)); if (prefix) { String *fbase, *tbase; if (Namespaceprefix) { fbase = NewStringf("%s::%s", Namespaceprefix,(yyvsp[-2].str)); tbase = NewStringf("%s::%s", Namespaceprefix, prefix); } else { fbase = Copy((yyvsp[-2].str)); tbase = Copy(prefix); } Swig_name_inherit(tbase,fbase); Delete(fbase); Delete(tbase); } if (strcmp((yyvsp[-3].id),"class") == 0) { cplus_mode = CPLUS_PRIVATE; } else { cplus_mode = CPLUS_PUBLIC; } if (!cparse_cplusplus) { set_scope_to_global(); } Swig_symbol_newscope(); Swig_symbol_setscopename((yyvsp[-2].str)); Swig_inherit_base_symbols(bases); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); cparse_start_line = cparse_line; /* If there are active template parameters, we need to make sure they are placed in the class symbol table so we can catch shadows */ if (template_parameters) { Parm *tp = template_parameters; while(tp) { String *tpname = Copy(Getattr(tp,"name")); Node *tn = new_node("templateparm"); Setattr(tn,"name",tpname); Swig_symbol_cadd(tpname,tn); tp = nextSibling(tp); Delete(tpname); } } Delete(prefix); inclass = 1; currentOuterClass = (yyval.node); if (cparse_cplusplusout) { /* save the structure declaration to declare it in global scope for C++ to see */ code = get_raw_text_balanced('{', '}'); Setattr((yyval.node), "code", code); Delete(code); } } #line 6982 "y.tab.c" /* yacc.c:1646 */ break; case 161: #line 3534 "parser.y" /* yacc.c:1646 */ { Node *p; SwigType *ty; Symtab *cscope; Node *am = 0; String *scpname = 0; (void) (yyvsp[-3].node); (yyval.node) = currentOuterClass; currentOuterClass = Getattr((yyval.node), "nested:outer"); nscope_inner = Getattr((yyval.node), "nested:innerscope"); nscope = Getattr((yyval.node), "nested:nscope"); Delattr((yyval.node), "nested:innerscope"); Delattr((yyval.node), "nested:nscope"); if (nscope_inner && Strcmp(nodeType(nscope_inner), "class") == 0) { /* actual parent class for this class */ Node* forward_declaration = Swig_symbol_clookup_no_inherit(Getattr((yyval.node),"name"), Getattr(nscope_inner, "symtab")); if (forward_declaration) { Setattr((yyval.node), "access", Getattr(forward_declaration, "access")); } Setattr((yyval.node), "nested:outer", nscope_inner); SetFlag((yyval.node), "nested"); } if (!currentOuterClass) inclass = 0; cscope = Getattr((yyval.node), "prev_symtab"); Delattr((yyval.node), "prev_symtab"); /* Check for pure-abstract class */ Setattr((yyval.node),"abstracts", pure_abstracts((yyvsp[-2].node))); /* This bit of code merges in a previously defined %extend directive (if any) */ { String *clsname = Swig_symbol_qualifiedscopename(0); am = Getattr(Swig_extend_hash(), clsname); if (am) { Swig_extend_merge((yyval.node), am); Delattr(Swig_extend_hash(), clsname); } Delete(clsname); } if (!classes) classes = NewHash(); scpname = Swig_symbol_qualifiedscopename(0); Setattr(classes, scpname, (yyval.node)); appendChild((yyval.node), (yyvsp[-2].node)); if (am) Swig_extend_append_previous((yyval.node), am); p = (yyvsp[0].node); if (p && !nscope_inner) { if (!cparse_cplusplus && currentOuterClass) appendChild(currentOuterClass, p); else appendSibling((yyval.node), p); } if (nscope_inner) { ty = NewString(scpname); /* if the class is declared out of scope, let the declarator use fully qualified type*/ } else if (cparse_cplusplus && !cparse_externc) { ty = NewString((yyvsp[-6].str)); } else { ty = NewStringf("%s %s", (yyvsp[-7].id), (yyvsp[-6].str)); } while (p) { Setattr(p, "storage", (yyvsp[-8].id)); Setattr(p, "type" ,ty); if (!cparse_cplusplus && currentOuterClass && (!Getattr(currentOuterClass, "name"))) { SetFlag(p, "hasconsttype"); SetFlag(p, "feature:immutable"); } p = nextSibling(p); } if ((yyvsp[0].node) && Cmp((yyvsp[-8].id),"typedef") == 0) add_typedef_name((yyval.node), (yyvsp[0].node), (yyvsp[-6].str), cscope, scpname); Delete(scpname); if (cplus_mode != CPLUS_PUBLIC) { /* we 'open' the class at the end, to allow %template to add new members */ Node *pa = new_node("access"); Setattr(pa, "kind", "public"); cplus_mode = CPLUS_PUBLIC; appendChild((yyval.node), pa); Delete(pa); } if (currentOuterClass) restore_access_mode((yyval.node)); Setattr((yyval.node), "symtab", Swig_symbol_popscope()); Classprefix = Getattr((yyval.node), "Classprefix"); Delattr((yyval.node), "Classprefix"); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (cplus_mode == CPLUS_PRIVATE) { (yyval.node) = 0; /* skip private nested classes */ } else if (cparse_cplusplus && currentOuterClass && ignore_nested_classes && !GetFlag((yyval.node), "feature:flatnested")) { (yyval.node) = nested_forward_declaration((yyvsp[-8].id), (yyvsp[-7].id), (yyvsp[-6].str), Copy((yyvsp[-6].str)), (yyvsp[0].node)); } else if (nscope_inner) { /* this is tricky */ /* we add the declaration in the original namespace */ if (Strcmp(nodeType(nscope_inner), "class") == 0 && cparse_cplusplus && ignore_nested_classes && !GetFlag((yyval.node), "feature:flatnested")) (yyval.node) = nested_forward_declaration((yyvsp[-8].id), (yyvsp[-7].id), (yyvsp[-6].str), Copy((yyvsp[-6].str)), (yyvsp[0].node)); appendChild(nscope_inner, (yyval.node)); Swig_symbol_setscope(Getattr(nscope_inner, "symtab")); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); yyrename = Copy(Getattr((yyval.node), "class_rename")); add_symbols((yyval.node)); Delattr((yyval.node), "class_rename"); /* but the variable definition in the current scope */ Swig_symbol_setscope(cscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols((yyvsp[0].node)); if (nscope) { (yyval.node) = nscope; /* here we return recreated namespace tower instead of the class itself */ if ((yyvsp[0].node)) { appendSibling((yyval.node), (yyvsp[0].node)); } } else if (!SwigType_istemplate(ty) && template_parameters == 0) { /* for tempalte we need the class itself */ (yyval.node) = (yyvsp[0].node); } } else { Delete(yyrename); yyrename = 0; if (!cparse_cplusplus && currentOuterClass) { /* nested C structs go into global scope*/ Node *outer = currentOuterClass; while (Getattr(outer, "nested:outer")) outer = Getattr(outer, "nested:outer"); appendSibling(outer, (yyval.node)); add_symbols((yyvsp[0].node)); set_scope_to_global(); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); yyrename = Copy(Getattr((yyval.node), "class_rename")); add_symbols((yyval.node)); if (!cparse_cplusplusout) Delattr((yyval.node), "nested:outer"); Delattr((yyval.node), "class_rename"); (yyval.node) = 0; } else { yyrename = Copy(Getattr((yyval.node), "class_rename")); add_symbols((yyval.node)); add_symbols((yyvsp[0].node)); Delattr((yyval.node), "class_rename"); } } Delete(ty); Swig_symbol_setscope(cscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); Classprefix = currentOuterClass ? Getattr(currentOuterClass, "Classprefix") : 0; } #line 7139 "y.tab.c" /* yacc.c:1646 */ break; case 162: #line 3689 "parser.y" /* yacc.c:1646 */ { String *unnamed; String *code; unnamed = make_unnamed(); (yyval.node) = new_node("class"); Setline((yyval.node),cparse_start_line); Setattr((yyval.node),"kind",(yyvsp[-2].id)); if ((yyvsp[-1].bases)) { Setattr((yyval.node),"baselist", Getattr((yyvsp[-1].bases),"public")); Setattr((yyval.node),"protectedbaselist", Getattr((yyvsp[-1].bases),"protected")); Setattr((yyval.node),"privatebaselist", Getattr((yyvsp[-1].bases),"private")); } Setattr((yyval.node),"storage",(yyvsp[-3].id)); Setattr((yyval.node),"unnamed",unnamed); Setattr((yyval.node),"allows_typedef","1"); if (currentOuterClass) { SetFlag((yyval.node), "nested"); Setattr((yyval.node), "nested:outer", currentOuterClass); set_access_mode((yyval.node)); } Swig_features_get(Swig_cparse_features(), Namespaceprefix, 0, 0, (yyval.node)); /* save yyrename to the class attribute, to be used later in add_symbols()*/ Setattr((yyval.node), "class_rename", make_name((yyval.node),0,0)); if (strcmp((yyvsp[-2].id),"class") == 0) { cplus_mode = CPLUS_PRIVATE; } else { cplus_mode = CPLUS_PUBLIC; } Swig_symbol_newscope(); cparse_start_line = cparse_line; currentOuterClass = (yyval.node); inclass = 1; Classprefix = 0; Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); /* save the structure declaration to make a typedef for it later*/ code = get_raw_text_balanced('{', '}'); Setattr((yyval.node), "code", code); Delete(code); } #line 7184 "y.tab.c" /* yacc.c:1646 */ break; case 163: #line 3728 "parser.y" /* yacc.c:1646 */ { String *unnamed; List *bases = 0; String *name = 0; Node *n; Classprefix = 0; (void)(yyvsp[-3].node); (yyval.node) = currentOuterClass; currentOuterClass = Getattr((yyval.node), "nested:outer"); if (!currentOuterClass) inclass = 0; else restore_access_mode((yyval.node)); unnamed = Getattr((yyval.node),"unnamed"); /* Check for pure-abstract class */ Setattr((yyval.node),"abstracts", pure_abstracts((yyvsp[-2].node))); n = (yyvsp[0].node); if (cparse_cplusplus && currentOuterClass && ignore_nested_classes && !GetFlag((yyval.node), "feature:flatnested")) { String *name = n ? Copy(Getattr(n, "name")) : 0; (yyval.node) = nested_forward_declaration((yyvsp[-7].id), (yyvsp[-6].id), 0, name, n); Swig_symbol_popscope(); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } else if (n) { appendSibling((yyval.node),n); /* If a proper typedef name was given, we'll use it to set the scope name */ name = try_to_find_a_name_for_unnamed_structure((yyvsp[-7].id), n); if (name) { String *scpname = 0; SwigType *ty; Setattr((yyval.node),"tdname",name); Setattr((yyval.node),"name",name); Swig_symbol_setscopename(name); if ((yyvsp[-5].bases)) bases = Swig_make_inherit_list(name,Getattr((yyvsp[-5].bases),"public"),Namespaceprefix); Swig_inherit_base_symbols(bases); /* If a proper name was given, we use that as the typedef, not unnamed */ Clear(unnamed); Append(unnamed, name); if (cparse_cplusplus && !cparse_externc) { ty = NewString(name); } else { ty = NewStringf("%s %s", (yyvsp[-6].id),name); } while (n) { Setattr(n,"storage",(yyvsp[-7].id)); Setattr(n, "type", ty); if (!cparse_cplusplus && currentOuterClass && (!Getattr(currentOuterClass, "name"))) { SetFlag(n,"hasconsttype"); SetFlag(n,"feature:immutable"); } n = nextSibling(n); } n = (yyvsp[0].node); /* Check for previous extensions */ { String *clsname = Swig_symbol_qualifiedscopename(0); Node *am = Getattr(Swig_extend_hash(),clsname); if (am) { /* Merge the extension into the symbol table */ Swig_extend_merge((yyval.node),am); Swig_extend_append_previous((yyval.node),am); Delattr(Swig_extend_hash(),clsname); } Delete(clsname); } if (!classes) classes = NewHash(); scpname = Swig_symbol_qualifiedscopename(0); Setattr(classes,scpname,(yyval.node)); Delete(scpname); } else { /* no suitable name was found for a struct */ Setattr((yyval.node), "nested:unnamed", Getattr(n, "name")); /* save the name of the first declarator for later use in name generation*/ while (n) { /* attach unnamed struct to the declarators, so that they would receive proper type later*/ Setattr(n, "nested:unnamedtype", (yyval.node)); Setattr(n, "storage", (yyvsp[-7].id)); n = nextSibling(n); } n = (yyvsp[0].node); Swig_symbol_setscopename(""); } appendChild((yyval.node),(yyvsp[-2].node)); /* Pop the scope */ Setattr((yyval.node),"symtab",Swig_symbol_popscope()); if (name) { Delete(yyrename); yyrename = Copy(Getattr((yyval.node), "class_rename")); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols((yyval.node)); add_symbols(n); Delattr((yyval.node), "class_rename"); }else if (cparse_cplusplus) (yyval.node) = 0; /* ignore unnamed structs for C++ */ Delete(unnamed); } else { /* unnamed struct w/o declarator*/ Swig_symbol_popscope(); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols((yyvsp[-2].node)); Delete((yyval.node)); (yyval.node) = (yyvsp[-2].node); /* pass member list to outer class/namespace (instead of self)*/ } Classprefix = currentOuterClass ? Getattr(currentOuterClass, "Classprefix") : 0; } #line 7295 "y.tab.c" /* yacc.c:1646 */ break; case 164: #line 3836 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 7301 "y.tab.c" /* yacc.c:1646 */ break; case 165: #line 3837 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"name",(yyvsp[-2].decl).id); Setattr((yyval.node),"decl",(yyvsp[-2].decl).type); Setattr((yyval.node),"parms",(yyvsp[-2].decl).parms); set_nextSibling((yyval.node),(yyvsp[0].node)); } #line 7313 "y.tab.c" /* yacc.c:1646 */ break; case 166: #line 3849 "parser.y" /* yacc.c:1646 */ { if ((yyvsp[-3].id) && (Strcmp((yyvsp[-3].id),"friend") == 0)) { /* Ignore */ (yyval.node) = 0; } else { (yyval.node) = new_node("classforward"); Setattr((yyval.node),"kind",(yyvsp[-2].id)); Setattr((yyval.node),"name",(yyvsp[-1].str)); Setattr((yyval.node),"sym:weak", "1"); add_symbols((yyval.node)); } } #line 7330 "y.tab.c" /* yacc.c:1646 */ break; case 167: #line 3867 "parser.y" /* yacc.c:1646 */ { if (currentOuterClass) Setattr(currentOuterClass, "template_parameters", template_parameters); template_parameters = (yyvsp[-1].tparms); parsing_template_declaration = 1; } #line 7341 "y.tab.c" /* yacc.c:1646 */ break; case 168: #line 3872 "parser.y" /* yacc.c:1646 */ { String *tname = 0; int error = 0; /* check if we get a namespace node with a class declaration, and retrieve the class */ Symtab *cscope = Swig_symbol_current(); Symtab *sti = 0; Node *ntop = (yyvsp[0].node); Node *ni = ntop; SwigType *ntype = ni ? nodeType(ni) : 0; while (ni && Strcmp(ntype,"namespace") == 0) { sti = Getattr(ni,"symtab"); ni = firstChild(ni); ntype = nodeType(ni); } if (sti) { Swig_symbol_setscope(sti); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); (yyvsp[0].node) = ni; } (yyval.node) = (yyvsp[0].node); if ((yyval.node)) tname = Getattr((yyval.node),"name"); /* Check if the class is a template specialization */ if (((yyval.node)) && (Strchr(tname,'<')) && (!is_operator(tname))) { /* If a specialization. Check if defined. */ Node *tempn = 0; { String *tbase = SwigType_templateprefix(tname); tempn = Swig_symbol_clookup_local(tbase,0); if (!tempn || (Strcmp(nodeType(tempn),"template") != 0)) { SWIG_WARN_NODE_BEGIN(tempn); Swig_warning(WARN_PARSE_TEMPLATE_SP_UNDEF, Getfile((yyval.node)),Getline((yyval.node)),"Specialization of non-template '%s'.\n", tbase); SWIG_WARN_NODE_END(tempn); tempn = 0; error = 1; } Delete(tbase); } Setattr((yyval.node),"specialization","1"); Setattr((yyval.node),"templatetype",nodeType((yyval.node))); set_nodeType((yyval.node),"template"); /* Template partial specialization */ if (tempn && ((yyvsp[-3].tparms)) && ((yyvsp[0].node))) { List *tlist; String *targs = SwigType_templateargs(tname); tlist = SwigType_parmlist(targs); /* Printf(stdout,"targs = '%s' %s\n", targs, tlist); */ if (!Getattr((yyval.node),"sym:weak")) { Setattr((yyval.node),"sym:typename","1"); } if (Len(tlist) != ParmList_len(Getattr(tempn,"templateparms"))) { Swig_error(Getfile((yyval.node)),Getline((yyval.node)),"Inconsistent argument count in template partial specialization. %d %d\n", Len(tlist), ParmList_len(Getattr(tempn,"templateparms"))); } else { /* This code builds the argument list for the partial template specialization. This is a little hairy, but the idea is as follows: $3 contains a list of arguments supplied for the template. For example template. tlist is a list of the specialization arguments--which may be different. For example class. tp is a copy of the arguments in the original template definition. The patching algorithm walks through the list of supplied arguments ($3), finds the position in the specialization arguments (tlist), and then patches the name in the argument list of the original template. */ { String *pn; Parm *p, *p1; int i, nargs; Parm *tp = CopyParmList(Getattr(tempn,"templateparms")); nargs = Len(tlist); p = (yyvsp[-3].tparms); while (p) { for (i = 0; i < nargs; i++){ pn = Getattr(p,"name"); if (Strcmp(pn,SwigType_base(Getitem(tlist,i))) == 0) { int j; Parm *p1 = tp; for (j = 0; j < i; j++) { p1 = nextSibling(p1); } Setattr(p1,"name",pn); Setattr(p1,"partialarg","1"); } } p = nextSibling(p); } p1 = tp; i = 0; while (p1) { if (!Getattr(p1,"partialarg")) { Delattr(p1,"name"); Setattr(p1,"type", Getitem(tlist,i)); } i++; p1 = nextSibling(p1); } Setattr((yyval.node),"templateparms",tp); Delete(tp); } #if 0 /* Patch the parameter list */ if (tempn) { Parm *p,*p1; ParmList *tp = CopyParmList(Getattr(tempn,"templateparms")); p = (yyvsp[-3].tparms); p1 = tp; while (p && p1) { String *pn = Getattr(p,"name"); Printf(stdout,"pn = '%s'\n", pn); if (pn) Setattr(p1,"name",pn); else Delattr(p1,"name"); pn = Getattr(p,"type"); if (pn) Setattr(p1,"type",pn); p = nextSibling(p); p1 = nextSibling(p1); } Setattr((yyval.node),"templateparms",tp); Delete(tp); } else { Setattr((yyval.node),"templateparms",(yyvsp[-3].tparms)); } #endif Delattr((yyval.node),"specialization"); Setattr((yyval.node),"partialspecialization","1"); /* Create a specialized name for matching */ { Parm *p = (yyvsp[-3].tparms); String *fname = NewString(Getattr((yyval.node),"name")); String *ffname = 0; ParmList *partialparms = 0; char tmp[32]; int i, ilen; while (p) { String *n = Getattr(p,"name"); if (!n) { p = nextSibling(p); continue; } ilen = Len(tlist); for (i = 0; i < ilen; i++) { if (Strstr(Getitem(tlist,i),n)) { sprintf(tmp,"$%d",i+1); Replaceid(fname,n,tmp); } } p = nextSibling(p); } /* Patch argument names with typedef */ { Iterator tt; Parm *parm_current = 0; List *tparms = SwigType_parmlist(fname); ffname = SwigType_templateprefix(fname); Append(ffname,"<("); for (tt = First(tparms); tt.item; ) { SwigType *rtt = Swig_symbol_typedef_reduce(tt.item,0); SwigType *ttr = Swig_symbol_type_qualify(rtt,0); Parm *newp = NewParmWithoutFileLineInfo(ttr, 0); if (partialparms) set_nextSibling(parm_current, newp); else partialparms = newp; parm_current = newp; Append(ffname,ttr); tt = Next(tt); if (tt.item) Putc(',',ffname); Delete(rtt); Delete(ttr); } Delete(tparms); Append(ffname,")>"); } { Node *new_partial = NewHash(); String *partials = Getattr(tempn,"partials"); if (!partials) { partials = NewList(); Setattr(tempn,"partials",partials); Delete(partials); } /* Printf(stdout,"partial: fname = '%s', '%s'\n", fname, Swig_symbol_typedef_reduce(fname,0)); */ Setattr(new_partial, "partialparms", partialparms); Setattr(new_partial, "templcsymname", ffname); Append(partials, new_partial); } Setattr((yyval.node),"partialargs",ffname); Swig_symbol_cadd(ffname,(yyval.node)); } } Delete(tlist); Delete(targs); } else { /* An explicit template specialization */ /* add default args from primary (unspecialized) template */ String *ty = Swig_symbol_template_deftype(tname,0); String *fname = Swig_symbol_type_qualify(ty,0); Swig_symbol_cadd(fname,(yyval.node)); Delete(ty); Delete(fname); } } else if ((yyval.node)) { Setattr((yyval.node),"templatetype",nodeType((yyvsp[0].node))); set_nodeType((yyval.node),"template"); Setattr((yyval.node),"templateparms", (yyvsp[-3].tparms)); if (!Getattr((yyval.node),"sym:weak")) { Setattr((yyval.node),"sym:typename","1"); } add_symbols((yyval.node)); default_arguments((yyval.node)); /* We also place a fully parameterized version in the symbol table */ { Parm *p; String *fname = NewStringf("%s<(", Getattr((yyval.node),"name")); p = (yyvsp[-3].tparms); while (p) { String *n = Getattr(p,"name"); if (!n) n = Getattr(p,"type"); Append(fname,n); p = nextSibling(p); if (p) Putc(',',fname); } Append(fname,")>"); Swig_symbol_cadd(fname,(yyval.node)); } } (yyval.node) = ntop; Swig_symbol_setscope(cscope); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); if (error || (nscope_inner && Strcmp(nodeType(nscope_inner), "class") == 0)) { (yyval.node) = 0; } if (currentOuterClass) template_parameters = Getattr(currentOuterClass, "template_parameters"); else template_parameters = 0; parsing_template_declaration = 0; } #line 7600 "y.tab.c" /* yacc.c:1646 */ break; case 169: #line 4128 "parser.y" /* yacc.c:1646 */ { Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit template instantiation ignored.\n"); (yyval.node) = 0; } #line 7609 "y.tab.c" /* yacc.c:1646 */ break; case 170: #line 4134 "parser.y" /* yacc.c:1646 */ { Swig_warning(WARN_PARSE_EXPLICIT_TEMPLATE, cparse_file, cparse_line, "Explicit template instantiation ignored.\n"); (yyval.node) = 0; } #line 7618 "y.tab.c" /* yacc.c:1646 */ break; case 171: #line 4140 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7626 "y.tab.c" /* yacc.c:1646 */ break; case 172: #line 4143 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7634 "y.tab.c" /* yacc.c:1646 */ break; case 173: #line 4146 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7642 "y.tab.c" /* yacc.c:1646 */ break; case 174: #line 4149 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7650 "y.tab.c" /* yacc.c:1646 */ break; case 175: #line 4152 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 7658 "y.tab.c" /* yacc.c:1646 */ break; case 176: #line 4155 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7666 "y.tab.c" /* yacc.c:1646 */ break; case 177: #line 4158 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7674 "y.tab.c" /* yacc.c:1646 */ break; case 178: #line 4163 "parser.y" /* yacc.c:1646 */ { /* Rip out the parameter names */ Parm *p = (yyvsp[0].pl); (yyval.tparms) = (yyvsp[0].pl); while (p) { String *name = Getattr(p,"name"); if (!name) { /* Hmmm. Maybe it's a 'class T' parameter */ char *type = Char(Getattr(p,"type")); /* Template template parameter */ if (strncmp(type,"template ",16) == 0) { type += 16; } if ((strncmp(type,"class ",6) == 0) || (strncmp(type,"typename ", 9) == 0)) { char *t = strchr(type,' '); Setattr(p,"name", t+1); } else /* Variadic template args */ if ((strncmp(type,"class... ",9) == 0) || (strncmp(type,"typename... ", 12) == 0)) { char *t = strchr(type,' '); Setattr(p,"name", t+1); Setattr(p,"variadic", "1"); } else { /* Swig_error(cparse_file, cparse_line, "Missing template parameter name\n"); $$.rparms = 0; $$.parms = 0; break; */ } } p = nextSibling(p); } } #line 7713 "y.tab.c" /* yacc.c:1646 */ break; case 179: #line 4199 "parser.y" /* yacc.c:1646 */ { set_nextSibling((yyvsp[-1].p),(yyvsp[0].pl)); (yyval.pl) = (yyvsp[-1].p); } #line 7722 "y.tab.c" /* yacc.c:1646 */ break; case 180: #line 4203 "parser.y" /* yacc.c:1646 */ { (yyval.pl) = 0; } #line 7728 "y.tab.c" /* yacc.c:1646 */ break; case 181: #line 4206 "parser.y" /* yacc.c:1646 */ { (yyval.p) = NewParmWithoutFileLineInfo(NewString((yyvsp[0].id)), 0); } #line 7736 "y.tab.c" /* yacc.c:1646 */ break; case 182: #line 4209 "parser.y" /* yacc.c:1646 */ { (yyval.p) = (yyvsp[0].p); } #line 7744 "y.tab.c" /* yacc.c:1646 */ break; case 183: #line 4214 "parser.y" /* yacc.c:1646 */ { set_nextSibling((yyvsp[-1].p),(yyvsp[0].pl)); (yyval.pl) = (yyvsp[-1].p); } #line 7753 "y.tab.c" /* yacc.c:1646 */ break; case 184: #line 4218 "parser.y" /* yacc.c:1646 */ { (yyval.pl) = 0; } #line 7759 "y.tab.c" /* yacc.c:1646 */ break; case 185: #line 4223 "parser.y" /* yacc.c:1646 */ { String *uname = Swig_symbol_type_qualify((yyvsp[-1].str),0); String *name = Swig_scopename_last((yyvsp[-1].str)); (yyval.node) = new_node("using"); Setattr((yyval.node),"uname",uname); Setattr((yyval.node),"name", name); Delete(uname); Delete(name); add_symbols((yyval.node)); } #line 7774 "y.tab.c" /* yacc.c:1646 */ break; case 186: #line 4233 "parser.y" /* yacc.c:1646 */ { Node *n = Swig_symbol_clookup((yyvsp[-1].str),0); if (!n) { Swig_error(cparse_file, cparse_line, "Nothing known about namespace '%s'\n", (yyvsp[-1].str)); (yyval.node) = 0; } else { while (Strcmp(nodeType(n),"using") == 0) { n = Getattr(n,"node"); } if (n) { if (Strcmp(nodeType(n),"namespace") == 0) { Symtab *current = Swig_symbol_current(); Symtab *symtab = Getattr(n,"symtab"); (yyval.node) = new_node("using"); Setattr((yyval.node),"node",n); Setattr((yyval.node),"namespace", (yyvsp[-1].str)); if (current != symtab) { Swig_symbol_inherit(symtab); } } else { Swig_error(cparse_file, cparse_line, "'%s' is not a namespace.\n", (yyvsp[-1].str)); (yyval.node) = 0; } } else { (yyval.node) = 0; } } } #line 7808 "y.tab.c" /* yacc.c:1646 */ break; case 187: #line 4264 "parser.y" /* yacc.c:1646 */ { Hash *h; (yyvsp[-2].node) = Swig_symbol_current(); h = Swig_symbol_clookup((yyvsp[-1].str),0); if (h && ((yyvsp[-2].node) == Getattr(h,"sym:symtab")) && (Strcmp(nodeType(h),"namespace") == 0)) { if (Getattr(h,"alias")) { h = Getattr(h,"namespace"); Swig_warning(WARN_PARSE_NAMESPACE_ALIAS, cparse_file, cparse_line, "Namespace alias '%s' not allowed here. Assuming '%s'\n", (yyvsp[-1].str), Getattr(h,"name")); (yyvsp[-1].str) = Getattr(h,"name"); } Swig_symbol_setscope(Getattr(h,"symtab")); } else { Swig_symbol_newscope(); Swig_symbol_setscopename((yyvsp[-1].str)); } Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); } #line 7832 "y.tab.c" /* yacc.c:1646 */ break; case 188: #line 4282 "parser.y" /* yacc.c:1646 */ { Node *n = (yyvsp[-1].node); set_nodeType(n,"namespace"); Setattr(n,"name",(yyvsp[-4].str)); Setattr(n,"symtab", Swig_symbol_popscope()); Swig_symbol_setscope((yyvsp[-5].node)); (yyval.node) = n; Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols((yyval.node)); } #line 7848 "y.tab.c" /* yacc.c:1646 */ break; case 189: #line 4293 "parser.y" /* yacc.c:1646 */ { Hash *h; (yyvsp[-1].node) = Swig_symbol_current(); h = Swig_symbol_clookup(" ",0); if (h && (Strcmp(nodeType(h),"namespace") == 0)) { Swig_symbol_setscope(Getattr(h,"symtab")); } else { Swig_symbol_newscope(); /* we don't use "__unnamed__", but a long 'empty' name */ Swig_symbol_setscopename(" "); } Namespaceprefix = 0; } #line 7866 "y.tab.c" /* yacc.c:1646 */ break; case 190: #line 4305 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[-1].node); set_nodeType((yyval.node),"namespace"); Setattr((yyval.node),"unnamed","1"); Setattr((yyval.node),"symtab", Swig_symbol_popscope()); Swig_symbol_setscope((yyvsp[-4].node)); Delete(Namespaceprefix); Namespaceprefix = Swig_symbol_qualifiedscopename(0); add_symbols((yyval.node)); } #line 7881 "y.tab.c" /* yacc.c:1646 */ break; case 191: #line 4315 "parser.y" /* yacc.c:1646 */ { /* Namespace alias */ Node *n; (yyval.node) = new_node("namespace"); Setattr((yyval.node),"name",(yyvsp[-3].id)); Setattr((yyval.node),"alias",(yyvsp[-1].str)); n = Swig_symbol_clookup((yyvsp[-1].str),0); if (!n) { Swig_error(cparse_file, cparse_line, "Unknown namespace '%s'\n", (yyvsp[-1].str)); (yyval.node) = 0; } else { if (Strcmp(nodeType(n),"namespace") != 0) { Swig_error(cparse_file, cparse_line, "'%s' is not a namespace\n",(yyvsp[-1].str)); (yyval.node) = 0; } else { while (Getattr(n,"alias")) { n = Getattr(n,"namespace"); } Setattr((yyval.node),"namespace",n); add_symbols((yyval.node)); /* Set up a scope alias */ Swig_symbol_alias((yyvsp[-3].id),Getattr(n,"symtab")); } } } #line 7911 "y.tab.c" /* yacc.c:1646 */ break; case 192: #line 4342 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[-1].node); /* Insert cpp_member (including any siblings) to the front of the cpp_members linked list */ if ((yyval.node)) { Node *p = (yyval.node); Node *pp =0; while (p) { pp = p; p = nextSibling(p); } set_nextSibling(pp,(yyvsp[0].node)); if ((yyvsp[0].node)) set_previousSibling((yyvsp[0].node), pp); } else { (yyval.node) = (yyvsp[0].node); } } #line 7933 "y.tab.c" /* yacc.c:1646 */ break; case 193: #line 4359 "parser.y" /* yacc.c:1646 */ { extendmode = 1; if (cplus_mode != CPLUS_PUBLIC) { Swig_error(cparse_file,cparse_line,"%%extend can only be used in a public section\n"); } } #line 7944 "y.tab.c" /* yacc.c:1646 */ break; case 194: #line 4364 "parser.y" /* yacc.c:1646 */ { extendmode = 0; } #line 7952 "y.tab.c" /* yacc.c:1646 */ break; case 195: #line 4366 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("extend"); mark_nodes_as_extend((yyvsp[-3].node)); appendChild((yyval.node),(yyvsp[-3].node)); set_nextSibling((yyval.node),(yyvsp[0].node)); } #line 7963 "y.tab.c" /* yacc.c:1646 */ break; case 196: #line 4372 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7969 "y.tab.c" /* yacc.c:1646 */ break; case 197: #line 4373 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0;} #line 7975 "y.tab.c" /* yacc.c:1646 */ break; case 198: #line 4374 "parser.y" /* yacc.c:1646 */ { int start_line = cparse_line; skip_decl(); Swig_error(cparse_file,start_line,"Syntax error in input(3).\n"); exit(1); } #line 7986 "y.tab.c" /* yacc.c:1646 */ break; case 199: #line 4379 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 7994 "y.tab.c" /* yacc.c:1646 */ break; case 200: #line 4390 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8000 "y.tab.c" /* yacc.c:1646 */ break; case 201: #line 4391 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); if (extendmode && current_class) { String *symname; symname= make_name((yyval.node),Getattr((yyval.node),"name"), Getattr((yyval.node),"decl")); if (Strcmp(symname,Getattr((yyval.node),"name")) == 0) { /* No renaming operation. Set name to class name */ Delete(yyrename); yyrename = NewString(Getattr(current_class,"sym:name")); } else { Delete(yyrename); yyrename = symname; } } add_symbols((yyval.node)); default_arguments((yyval.node)); } #line 8022 "y.tab.c" /* yacc.c:1646 */ break; case 202: #line 4408 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8028 "y.tab.c" /* yacc.c:1646 */ break; case 203: #line 4409 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8034 "y.tab.c" /* yacc.c:1646 */ break; case 204: #line 4410 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8040 "y.tab.c" /* yacc.c:1646 */ break; case 205: #line 4411 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8046 "y.tab.c" /* yacc.c:1646 */ break; case 206: #line 4412 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8052 "y.tab.c" /* yacc.c:1646 */ break; case 207: #line 4413 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8058 "y.tab.c" /* yacc.c:1646 */ break; case 208: #line 4414 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8064 "y.tab.c" /* yacc.c:1646 */ break; case 209: #line 4415 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 8070 "y.tab.c" /* yacc.c:1646 */ break; case 210: #line 4416 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8076 "y.tab.c" /* yacc.c:1646 */ break; case 211: #line 4417 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8082 "y.tab.c" /* yacc.c:1646 */ break; case 212: #line 4418 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 8088 "y.tab.c" /* yacc.c:1646 */ break; case 213: #line 4419 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8094 "y.tab.c" /* yacc.c:1646 */ break; case 214: #line 4420 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8100 "y.tab.c" /* yacc.c:1646 */ break; case 215: #line 4421 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 8106 "y.tab.c" /* yacc.c:1646 */ break; case 216: #line 4422 "parser.y" /* yacc.c:1646 */ {(yyval.node) = (yyvsp[0].node); } #line 8112 "y.tab.c" /* yacc.c:1646 */ break; case 217: #line 4423 "parser.y" /* yacc.c:1646 */ {(yyval.node) = (yyvsp[0].node); } #line 8118 "y.tab.c" /* yacc.c:1646 */ break; case 218: #line 4424 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 8124 "y.tab.c" /* yacc.c:1646 */ break; case 219: #line 4433 "parser.y" /* yacc.c:1646 */ { if (inclass || extendmode) { SwigType *decl = NewStringEmpty(); (yyval.node) = new_node("constructor"); Setattr((yyval.node),"storage",(yyvsp[-5].id)); Setattr((yyval.node),"name",(yyvsp[-4].type)); Setattr((yyval.node),"parms",(yyvsp[-2].pl)); SwigType_add_function(decl,(yyvsp[-2].pl)); Setattr((yyval.node),"decl",decl); Setattr((yyval.node),"throws",(yyvsp[0].decl).throws); Setattr((yyval.node),"throw",(yyvsp[0].decl).throwf); Setattr((yyval.node),"noexcept",(yyvsp[0].decl).nexcept); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } SetFlag((yyval.node),"feature:new"); if ((yyvsp[0].decl).defarg) Setattr((yyval.node),"value",(yyvsp[0].decl).defarg); } else { (yyval.node) = 0; } } #line 8153 "y.tab.c" /* yacc.c:1646 */ break; case 220: #line 4461 "parser.y" /* yacc.c:1646 */ { String *name = NewStringf("%s",(yyvsp[-4].str)); if (*(Char(name)) != '~') Insert(name,0,"~"); (yyval.node) = new_node("destructor"); Setattr((yyval.node),"name",name); Delete(name); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } { String *decl = NewStringEmpty(); SwigType_add_function(decl,(yyvsp[-2].pl)); Setattr((yyval.node),"decl",decl); Delete(decl); } Setattr((yyval.node),"throws",(yyvsp[0].dtype).throws); Setattr((yyval.node),"throw",(yyvsp[0].dtype).throwf); Setattr((yyval.node),"noexcept",(yyvsp[0].dtype).nexcept); if ((yyvsp[0].dtype).val) Setattr((yyval.node),"value",(yyvsp[0].dtype).val); add_symbols((yyval.node)); } #line 8182 "y.tab.c" /* yacc.c:1646 */ break; case 221: #line 4488 "parser.y" /* yacc.c:1646 */ { String *name; (yyval.node) = new_node("destructor"); Setattr((yyval.node),"storage","virtual"); name = NewStringf("%s",(yyvsp[-4].str)); if (*(Char(name)) != '~') Insert(name,0,"~"); Setattr((yyval.node),"name",name); Delete(name); Setattr((yyval.node),"throws",(yyvsp[0].dtype).throws); Setattr((yyval.node),"throw",(yyvsp[0].dtype).throwf); Setattr((yyval.node),"noexcept",(yyvsp[0].dtype).nexcept); if ((yyvsp[0].dtype).val) Setattr((yyval.node),"value",(yyvsp[0].dtype).val); if (Len(scanner_ccode)) { String *code = Copy(scanner_ccode); Setattr((yyval.node),"code",code); Delete(code); } { String *decl = NewStringEmpty(); SwigType_add_function(decl,(yyvsp[-2].pl)); Setattr((yyval.node),"decl",decl); Delete(decl); } add_symbols((yyval.node)); } #line 8214 "y.tab.c" /* yacc.c:1646 */ break; case 222: #line 4519 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"type",(yyvsp[-5].type)); Setattr((yyval.node),"name",(yyvsp[-6].str)); Setattr((yyval.node),"storage",(yyvsp[-7].id)); SwigType_add_function((yyvsp[-4].type),(yyvsp[-2].pl)); if ((yyvsp[0].dtype).qualifier) { SwigType_push((yyvsp[-4].type),(yyvsp[0].dtype).qualifier); } Setattr((yyval.node),"decl",(yyvsp[-4].type)); Setattr((yyval.node),"parms",(yyvsp[-2].pl)); Setattr((yyval.node),"conversion_operator","1"); add_symbols((yyval.node)); } #line 8234 "y.tab.c" /* yacc.c:1646 */ break; case 223: #line 4534 "parser.y" /* yacc.c:1646 */ { SwigType *decl; (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"type",(yyvsp[-5].type)); Setattr((yyval.node),"name",(yyvsp[-6].str)); Setattr((yyval.node),"storage",(yyvsp[-7].id)); decl = NewStringEmpty(); SwigType_add_reference(decl); SwigType_add_function(decl,(yyvsp[-2].pl)); if ((yyvsp[0].dtype).qualifier) { SwigType_push(decl,(yyvsp[0].dtype).qualifier); } Setattr((yyval.node),"decl",decl); Setattr((yyval.node),"parms",(yyvsp[-2].pl)); Setattr((yyval.node),"conversion_operator","1"); add_symbols((yyval.node)); } #line 8256 "y.tab.c" /* yacc.c:1646 */ break; case 224: #line 4551 "parser.y" /* yacc.c:1646 */ { SwigType *decl; (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"type",(yyvsp[-5].type)); Setattr((yyval.node),"name",(yyvsp[-6].str)); Setattr((yyval.node),"storage",(yyvsp[-7].id)); decl = NewStringEmpty(); SwigType_add_rvalue_reference(decl); SwigType_add_function(decl,(yyvsp[-2].pl)); if ((yyvsp[0].dtype).qualifier) { SwigType_push(decl,(yyvsp[0].dtype).qualifier); } Setattr((yyval.node),"decl",decl); Setattr((yyval.node),"parms",(yyvsp[-2].pl)); Setattr((yyval.node),"conversion_operator","1"); add_symbols((yyval.node)); } #line 8278 "y.tab.c" /* yacc.c:1646 */ break; case 225: #line 4569 "parser.y" /* yacc.c:1646 */ { SwigType *decl; (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"type",(yyvsp[-6].type)); Setattr((yyval.node),"name",(yyvsp[-7].str)); Setattr((yyval.node),"storage",(yyvsp[-8].id)); decl = NewStringEmpty(); SwigType_add_pointer(decl); SwigType_add_reference(decl); SwigType_add_function(decl,(yyvsp[-2].pl)); if ((yyvsp[0].dtype).qualifier) { SwigType_push(decl,(yyvsp[0].dtype).qualifier); } Setattr((yyval.node),"decl",decl); Setattr((yyval.node),"parms",(yyvsp[-2].pl)); Setattr((yyval.node),"conversion_operator","1"); add_symbols((yyval.node)); } #line 8301 "y.tab.c" /* yacc.c:1646 */ break; case 226: #line 4588 "parser.y" /* yacc.c:1646 */ { String *t = NewStringEmpty(); (yyval.node) = new_node("cdecl"); Setattr((yyval.node),"type",(yyvsp[-4].type)); Setattr((yyval.node),"name",(yyvsp[-5].str)); Setattr((yyval.node),"storage",(yyvsp[-6].id)); SwigType_add_function(t,(yyvsp[-2].pl)); if ((yyvsp[0].dtype).qualifier) { SwigType_push(t,(yyvsp[0].dtype).qualifier); } Setattr((yyval.node),"decl",t); Setattr((yyval.node),"parms",(yyvsp[-2].pl)); Setattr((yyval.node),"conversion_operator","1"); add_symbols((yyval.node)); } #line 8321 "y.tab.c" /* yacc.c:1646 */ break; case 227: #line 4607 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.node) = 0; } #line 8330 "y.tab.c" /* yacc.c:1646 */ break; case 228: #line 4614 "parser.y" /* yacc.c:1646 */ { skip_balanced('(',')'); (yyval.node) = 0; } #line 8339 "y.tab.c" /* yacc.c:1646 */ break; case 229: #line 4621 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("access"); Setattr((yyval.node),"kind","public"); cplus_mode = CPLUS_PUBLIC; } #line 8349 "y.tab.c" /* yacc.c:1646 */ break; case 230: #line 4628 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("access"); Setattr((yyval.node),"kind","private"); cplus_mode = CPLUS_PRIVATE; } #line 8359 "y.tab.c" /* yacc.c:1646 */ break; case 231: #line 4636 "parser.y" /* yacc.c:1646 */ { (yyval.node) = new_node("access"); Setattr((yyval.node),"kind","protected"); cplus_mode = CPLUS_PROTECTED; } #line 8369 "y.tab.c" /* yacc.c:1646 */ break; case 232: #line 4644 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8375 "y.tab.c" /* yacc.c:1646 */ break; case 233: #line 4647 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8381 "y.tab.c" /* yacc.c:1646 */ break; case 234: #line 4651 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8387 "y.tab.c" /* yacc.c:1646 */ break; case 235: #line 4654 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8393 "y.tab.c" /* yacc.c:1646 */ break; case 236: #line 4655 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8399 "y.tab.c" /* yacc.c:1646 */ break; case 237: #line 4656 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8405 "y.tab.c" /* yacc.c:1646 */ break; case 238: #line 4657 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8411 "y.tab.c" /* yacc.c:1646 */ break; case 239: #line 4658 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8417 "y.tab.c" /* yacc.c:1646 */ break; case 240: #line 4659 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8423 "y.tab.c" /* yacc.c:1646 */ break; case 241: #line 4660 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8429 "y.tab.c" /* yacc.c:1646 */ break; case 242: #line 4661 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 8435 "y.tab.c" /* yacc.c:1646 */ break; case 243: #line 4664 "parser.y" /* yacc.c:1646 */ { Clear(scanner_ccode); (yyval.dtype).val = 0; (yyval.dtype).throws = (yyvsp[-1].dtype).throws; (yyval.dtype).throwf = (yyvsp[-1].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-1].dtype).nexcept; } #line 8447 "y.tab.c" /* yacc.c:1646 */ break; case 244: #line 4671 "parser.y" /* yacc.c:1646 */ { Clear(scanner_ccode); (yyval.dtype).val = (yyvsp[-1].dtype).val; (yyval.dtype).throws = (yyvsp[-3].dtype).throws; (yyval.dtype).throwf = (yyvsp[-3].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-3].dtype).nexcept; } #line 8459 "y.tab.c" /* yacc.c:1646 */ break; case 245: #line 4678 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.dtype).val = 0; (yyval.dtype).throws = (yyvsp[-1].dtype).throws; (yyval.dtype).throwf = (yyvsp[-1].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-1].dtype).nexcept; } #line 8471 "y.tab.c" /* yacc.c:1646 */ break; case 246: #line 4687 "parser.y" /* yacc.c:1646 */ { Clear(scanner_ccode); (yyval.dtype).val = 0; (yyval.dtype).qualifier = (yyvsp[-1].dtype).qualifier; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = (yyvsp[-1].dtype).throws; (yyval.dtype).throwf = (yyvsp[-1].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-1].dtype).nexcept; } #line 8485 "y.tab.c" /* yacc.c:1646 */ break; case 247: #line 4696 "parser.y" /* yacc.c:1646 */ { Clear(scanner_ccode); (yyval.dtype).val = (yyvsp[-1].dtype).val; (yyval.dtype).qualifier = (yyvsp[-3].dtype).qualifier; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = (yyvsp[-3].dtype).throws; (yyval.dtype).throwf = (yyvsp[-3].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-3].dtype).nexcept; } #line 8499 "y.tab.c" /* yacc.c:1646 */ break; case 248: #line 4705 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.dtype).val = 0; (yyval.dtype).qualifier = (yyvsp[-1].dtype).qualifier; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = (yyvsp[-1].dtype).throws; (yyval.dtype).throwf = (yyvsp[-1].dtype).throwf; (yyval.dtype).nexcept = (yyvsp[-1].dtype).nexcept; } #line 8513 "y.tab.c" /* yacc.c:1646 */ break; case 249: #line 4717 "parser.y" /* yacc.c:1646 */ { } #line 8519 "y.tab.c" /* yacc.c:1646 */ break; case 250: #line 4720 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); /* Printf(stdout,"primitive = '%s'\n", $$);*/ } #line 8527 "y.tab.c" /* yacc.c:1646 */ break; case 251: #line 4723 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 8533 "y.tab.c" /* yacc.c:1646 */ break; case 252: #line 4724 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 8539 "y.tab.c" /* yacc.c:1646 */ break; case 253: #line 4728 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 8545 "y.tab.c" /* yacc.c:1646 */ break; case 254: #line 4730 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].str); } #line 8553 "y.tab.c" /* yacc.c:1646 */ break; case 255: #line 4738 "parser.y" /* yacc.c:1646 */ { if (Strcmp((yyvsp[0].str),"C") == 0) { (yyval.id) = "externc"; } else if (Strcmp((yyvsp[0].str),"C++") == 0) { (yyval.id) = "extern"; } else { Swig_warning(WARN_PARSE_UNDEFINED_EXTERN,cparse_file, cparse_line,"Unrecognized extern type \"%s\".\n", (yyvsp[0].str)); (yyval.id) = 0; } } #line 8568 "y.tab.c" /* yacc.c:1646 */ break; case 256: #line 4750 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "extern"; } #line 8574 "y.tab.c" /* yacc.c:1646 */ break; case 257: #line 4751 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[0].id); } #line 8580 "y.tab.c" /* yacc.c:1646 */ break; case 258: #line 4752 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "thread_local"; } #line 8586 "y.tab.c" /* yacc.c:1646 */ break; case 259: #line 4753 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "typedef"; } #line 8592 "y.tab.c" /* yacc.c:1646 */ break; case 260: #line 4754 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "static"; } #line 8598 "y.tab.c" /* yacc.c:1646 */ break; case 261: #line 4755 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "typedef"; } #line 8604 "y.tab.c" /* yacc.c:1646 */ break; case 262: #line 4756 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "virtual"; } #line 8610 "y.tab.c" /* yacc.c:1646 */ break; case 263: #line 4757 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "friend"; } #line 8616 "y.tab.c" /* yacc.c:1646 */ break; case 264: #line 4758 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "explicit"; } #line 8622 "y.tab.c" /* yacc.c:1646 */ break; case 265: #line 4759 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "constexpr"; } #line 8628 "y.tab.c" /* yacc.c:1646 */ break; case 266: #line 4760 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "explicit constexpr"; } #line 8634 "y.tab.c" /* yacc.c:1646 */ break; case 267: #line 4761 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "explicit constexpr"; } #line 8640 "y.tab.c" /* yacc.c:1646 */ break; case 268: #line 4762 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "static constexpr"; } #line 8646 "y.tab.c" /* yacc.c:1646 */ break; case 269: #line 4763 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "static constexpr"; } #line 8652 "y.tab.c" /* yacc.c:1646 */ break; case 270: #line 4764 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "thread_local"; } #line 8658 "y.tab.c" /* yacc.c:1646 */ break; case 271: #line 4765 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "static thread_local"; } #line 8664 "y.tab.c" /* yacc.c:1646 */ break; case 272: #line 4766 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "static thread_local"; } #line 8670 "y.tab.c" /* yacc.c:1646 */ break; case 273: #line 4767 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "extern thread_local"; } #line 8676 "y.tab.c" /* yacc.c:1646 */ break; case 274: #line 4768 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "extern thread_local"; } #line 8682 "y.tab.c" /* yacc.c:1646 */ break; case 275: #line 4769 "parser.y" /* yacc.c:1646 */ { (yyval.id) = 0; } #line 8688 "y.tab.c" /* yacc.c:1646 */ break; case 276: #line 4776 "parser.y" /* yacc.c:1646 */ { Parm *p; (yyval.pl) = (yyvsp[0].pl); p = (yyvsp[0].pl); while (p) { Replace(Getattr(p,"type"),"typename ", "", DOH_REPLACE_ANY); p = nextSibling(p); } } #line 8702 "y.tab.c" /* yacc.c:1646 */ break; case 277: #line 4787 "parser.y" /* yacc.c:1646 */ { set_nextSibling((yyvsp[-1].p),(yyvsp[0].pl)); (yyval.pl) = (yyvsp[-1].p); } #line 8711 "y.tab.c" /* yacc.c:1646 */ break; case 278: #line 4791 "parser.y" /* yacc.c:1646 */ { (yyval.pl) = 0; } #line 8717 "y.tab.c" /* yacc.c:1646 */ break; case 279: #line 4794 "parser.y" /* yacc.c:1646 */ { set_nextSibling((yyvsp[-1].p),(yyvsp[0].pl)); (yyval.pl) = (yyvsp[-1].p); } #line 8726 "y.tab.c" /* yacc.c:1646 */ break; case 280: #line 4798 "parser.y" /* yacc.c:1646 */ { (yyval.pl) = 0; } #line 8732 "y.tab.c" /* yacc.c:1646 */ break; case 281: #line 4802 "parser.y" /* yacc.c:1646 */ { SwigType_push((yyvsp[-1].type),(yyvsp[0].decl).type); (yyval.p) = NewParmWithoutFileLineInfo((yyvsp[-1].type),(yyvsp[0].decl).id); Setfile((yyval.p),cparse_file); Setline((yyval.p),cparse_line); if ((yyvsp[0].decl).defarg) { Setattr((yyval.p),"value",(yyvsp[0].decl).defarg); } } #line 8746 "y.tab.c" /* yacc.c:1646 */ break; case 282: #line 4812 "parser.y" /* yacc.c:1646 */ { (yyval.p) = NewParmWithoutFileLineInfo(NewStringf("template %s %s", (yyvsp[-2].id),(yyvsp[-1].str)), 0); Setfile((yyval.p),cparse_file); Setline((yyval.p),cparse_line); if ((yyvsp[0].dtype).val) { Setattr((yyval.p),"value",(yyvsp[0].dtype).val); } } #line 8759 "y.tab.c" /* yacc.c:1646 */ break; case 283: #line 4820 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewString("v(...)"); (yyval.p) = NewParmWithoutFileLineInfo(t, 0); Setfile((yyval.p),cparse_file); Setline((yyval.p),cparse_line); } #line 8770 "y.tab.c" /* yacc.c:1646 */ break; case 284: #line 4828 "parser.y" /* yacc.c:1646 */ { Parm *p; (yyval.p) = (yyvsp[0].p); p = (yyvsp[0].p); while (p) { if (Getattr(p,"type")) { Replace(Getattr(p,"type"),"typename ", "", DOH_REPLACE_ANY); } p = nextSibling(p); } } #line 8786 "y.tab.c" /* yacc.c:1646 */ break; case 285: #line 4841 "parser.y" /* yacc.c:1646 */ { set_nextSibling((yyvsp[-1].p),(yyvsp[0].p)); (yyval.p) = (yyvsp[-1].p); } #line 8795 "y.tab.c" /* yacc.c:1646 */ break; case 286: #line 4845 "parser.y" /* yacc.c:1646 */ { (yyval.p) = 0; } #line 8801 "y.tab.c" /* yacc.c:1646 */ break; case 287: #line 4848 "parser.y" /* yacc.c:1646 */ { set_nextSibling((yyvsp[-1].p),(yyvsp[0].p)); (yyval.p) = (yyvsp[-1].p); } #line 8810 "y.tab.c" /* yacc.c:1646 */ break; case 288: #line 4852 "parser.y" /* yacc.c:1646 */ { (yyval.p) = 0; } #line 8816 "y.tab.c" /* yacc.c:1646 */ break; case 289: #line 4856 "parser.y" /* yacc.c:1646 */ { (yyval.p) = (yyvsp[0].p); { /* We need to make a possible adjustment for integer parameters. */ SwigType *type; Node *n = 0; while (!n) { type = Getattr((yyvsp[0].p),"type"); n = Swig_symbol_clookup(type,0); /* See if we can find a node that matches the typename */ if ((n) && (Strcmp(nodeType(n),"cdecl") == 0)) { SwigType *decl = Getattr(n,"decl"); if (!SwigType_isfunction(decl)) { String *value = Getattr(n,"value"); if (value) { String *v = Copy(value); Setattr((yyvsp[0].p),"type",v); Delete(v); n = 0; } } } else { break; } } } } #line 8849 "y.tab.c" /* yacc.c:1646 */ break; case 290: #line 4884 "parser.y" /* yacc.c:1646 */ { (yyval.p) = NewParmWithoutFileLineInfo(0,0); Setfile((yyval.p),cparse_file); Setline((yyval.p),cparse_line); Setattr((yyval.p),"value",(yyvsp[0].dtype).val); } #line 8860 "y.tab.c" /* yacc.c:1646 */ break; case 291: #line 4892 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyvsp[0].dtype).type == T_ERROR) { Swig_warning(WARN_PARSE_BAD_DEFAULT,cparse_file, cparse_line, "Can't set default argument (ignored)\n"); (yyval.dtype).val = 0; (yyval.dtype).rawval = 0; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } } #line 8877 "y.tab.c" /* yacc.c:1646 */ break; case 292: #line 4904 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[-3].dtype); if ((yyvsp[-3].dtype).type == T_ERROR) { Swig_warning(WARN_PARSE_BAD_DEFAULT,cparse_file, cparse_line, "Can't set default argument (ignored)\n"); (yyval.dtype) = (yyvsp[-3].dtype); (yyval.dtype).val = 0; (yyval.dtype).rawval = 0; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } else { (yyval.dtype).val = NewStringf("%s[%s]",(yyvsp[-3].dtype).val,(yyvsp[-1].dtype).val); } } #line 8897 "y.tab.c" /* yacc.c:1646 */ break; case 293: #line 4919 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.dtype).val = NewString(scanner_ccode); (yyval.dtype).rawval = 0; (yyval.dtype).type = T_INT; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 8912 "y.tab.c" /* yacc.c:1646 */ break; case 294: #line 4929 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = 0; (yyval.dtype).rawval = 0; (yyval.dtype).type = 0; (yyval.dtype).bitfield = (yyvsp[0].dtype).val; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 8926 "y.tab.c" /* yacc.c:1646 */ break; case 295: #line 4938 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = 0; (yyval.dtype).rawval = 0; (yyval.dtype).type = T_INT; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 8940 "y.tab.c" /* yacc.c:1646 */ break; case 296: #line 4949 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[-1].decl); (yyval.decl).defarg = (yyvsp[0].dtype).rawval ? (yyvsp[0].dtype).rawval : (yyvsp[0].dtype).val; } #line 8949 "y.tab.c" /* yacc.c:1646 */ break; case 297: #line 4953 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[-1].decl); (yyval.decl).defarg = (yyvsp[0].dtype).rawval ? (yyvsp[0].dtype).rawval : (yyvsp[0].dtype).val; } #line 8958 "y.tab.c" /* yacc.c:1646 */ break; case 298: #line 4957 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = 0; (yyval.decl).id = 0; (yyval.decl).defarg = (yyvsp[0].dtype).rawval ? (yyvsp[0].dtype).rawval : (yyvsp[0].dtype).val; } #line 8968 "y.tab.c" /* yacc.c:1646 */ break; case 299: #line 4964 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); if (SwigType_isfunction((yyvsp[0].decl).type)) { Delete(SwigType_pop_function((yyvsp[0].decl).type)); } else if (SwigType_isarray((yyvsp[0].decl).type)) { SwigType *ta = SwigType_pop_arrays((yyvsp[0].decl).type); if (SwigType_isfunction((yyvsp[0].decl).type)) { Delete(SwigType_pop_function((yyvsp[0].decl).type)); } else { (yyval.decl).parms = 0; } SwigType_push((yyvsp[0].decl).type,ta); Delete(ta); } else { (yyval.decl).parms = 0; } } #line 8990 "y.tab.c" /* yacc.c:1646 */ break; case 300: #line 4981 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); if (SwigType_isfunction((yyvsp[0].decl).type)) { Delete(SwigType_pop_function((yyvsp[0].decl).type)); } else if (SwigType_isarray((yyvsp[0].decl).type)) { SwigType *ta = SwigType_pop_arrays((yyvsp[0].decl).type); if (SwigType_isfunction((yyvsp[0].decl).type)) { Delete(SwigType_pop_function((yyvsp[0].decl).type)); } else { (yyval.decl).parms = 0; } SwigType_push((yyvsp[0].decl).type,ta); Delete(ta); } else { (yyval.decl).parms = 0; } } #line 9012 "y.tab.c" /* yacc.c:1646 */ break; case 301: #line 4998 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = 0; (yyval.decl).id = 0; (yyval.decl).parms = 0; } #line 9022 "y.tab.c" /* yacc.c:1646 */ break; case 302: #line 5006 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); if ((yyval.decl).type) { SwigType_push((yyvsp[-1].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-1].type); } #line 9035 "y.tab.c" /* yacc.c:1646 */ break; case 303: #line 5014 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_reference((yyvsp[-2].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-2].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-2].type); } #line 9049 "y.tab.c" /* yacc.c:1646 */ break; case 304: #line 5023 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_rvalue_reference((yyvsp[-2].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-2].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-2].type); } #line 9063 "y.tab.c" /* yacc.c:1646 */ break; case 305: #line 5032 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); if (!(yyval.decl).type) (yyval.decl).type = NewStringEmpty(); } #line 9072 "y.tab.c" /* yacc.c:1646 */ break; case 306: #line 5036 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); (yyval.decl).type = NewStringEmpty(); SwigType_add_reference((yyval.decl).type); if ((yyvsp[0].decl).type) { SwigType_push((yyval.decl).type,(yyvsp[0].decl).type); Delete((yyvsp[0].decl).type); } } #line 9086 "y.tab.c" /* yacc.c:1646 */ break; case 307: #line 5045 "parser.y" /* yacc.c:1646 */ { /* Introduced in C++11, move operator && */ /* Adds one S/R conflict */ (yyval.decl) = (yyvsp[0].decl); (yyval.decl).type = NewStringEmpty(); SwigType_add_rvalue_reference((yyval.decl).type); if ((yyvsp[0].decl).type) { SwigType_push((yyval.decl).type,(yyvsp[0].decl).type); Delete((yyvsp[0].decl).type); } } #line 9102 "y.tab.c" /* yacc.c:1646 */ break; case 308: #line 5056 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer(t,(yyvsp[-2].str)); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9118 "y.tab.c" /* yacc.c:1646 */ break; case 309: #line 5067 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer(t,(yyvsp[-2].str)); SwigType_push((yyvsp[-3].type),t); if ((yyval.decl).type) { SwigType_push((yyvsp[-3].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-3].type); Delete(t); } #line 9135 "y.tab.c" /* yacc.c:1646 */ break; case 310: #line 5079 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer((yyvsp[-4].type),(yyvsp[-3].str)); SwigType_add_reference((yyvsp[-4].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-4].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-4].type); } #line 9150 "y.tab.c" /* yacc.c:1646 */ break; case 311: #line 5089 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer(t,(yyvsp[-3].str)); SwigType_add_reference(t); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9166 "y.tab.c" /* yacc.c:1646 */ break; case 312: #line 5103 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); if ((yyval.decl).type) { SwigType_push((yyvsp[-4].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-4].type); } #line 9179 "y.tab.c" /* yacc.c:1646 */ break; case 313: #line 5111 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_reference((yyvsp[-5].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-5].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-5].type); } #line 9193 "y.tab.c" /* yacc.c:1646 */ break; case 314: #line 5120 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_rvalue_reference((yyvsp[-5].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-5].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-5].type); } #line 9207 "y.tab.c" /* yacc.c:1646 */ break; case 315: #line 5129 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); if (!(yyval.decl).type) (yyval.decl).type = NewStringEmpty(); } #line 9216 "y.tab.c" /* yacc.c:1646 */ break; case 316: #line 5133 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); (yyval.decl).type = NewStringEmpty(); SwigType_add_reference((yyval.decl).type); if ((yyvsp[0].decl).type) { SwigType_push((yyval.decl).type,(yyvsp[0].decl).type); Delete((yyvsp[0].decl).type); } } #line 9230 "y.tab.c" /* yacc.c:1646 */ break; case 317: #line 5142 "parser.y" /* yacc.c:1646 */ { /* Introduced in C++11, move operator && */ /* Adds one S/R conflict */ (yyval.decl) = (yyvsp[0].decl); (yyval.decl).type = NewStringEmpty(); SwigType_add_rvalue_reference((yyval.decl).type); if ((yyvsp[0].decl).type) { SwigType_push((yyval.decl).type,(yyvsp[0].decl).type); Delete((yyvsp[0].decl).type); } } #line 9246 "y.tab.c" /* yacc.c:1646 */ break; case 318: #line 5153 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer(t,(yyvsp[-5].str)); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9262 "y.tab.c" /* yacc.c:1646 */ break; case 319: #line 5164 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer(t,(yyvsp[-5].str)); SwigType_push((yyvsp[-6].type),t); if ((yyval.decl).type) { SwigType_push((yyvsp[-6].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-6].type); Delete(t); } #line 9279 "y.tab.c" /* yacc.c:1646 */ break; case 320: #line 5176 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer((yyvsp[-7].type),(yyvsp[-6].str)); SwigType_add_reference((yyvsp[-7].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-7].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-7].type); } #line 9294 "y.tab.c" /* yacc.c:1646 */ break; case 321: #line 5186 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer((yyvsp[-7].type),(yyvsp[-6].str)); SwigType_add_rvalue_reference((yyvsp[-7].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-7].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-7].type); } #line 9309 "y.tab.c" /* yacc.c:1646 */ break; case 322: #line 5196 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer(t,(yyvsp[-6].str)); SwigType_add_reference(t); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9325 "y.tab.c" /* yacc.c:1646 */ break; case 323: #line 5207 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer(t,(yyvsp[-6].str)); SwigType_add_rvalue_reference(t); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9341 "y.tab.c" /* yacc.c:1646 */ break; case 324: #line 5220 "parser.y" /* yacc.c:1646 */ { /* Note: This is non-standard C. Template declarator is allowed to follow an identifier */ (yyval.decl).id = Char((yyvsp[0].str)); (yyval.decl).type = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9353 "y.tab.c" /* yacc.c:1646 */ break; case 325: #line 5227 "parser.y" /* yacc.c:1646 */ { (yyval.decl).id = Char(NewStringf("~%s",(yyvsp[0].str))); (yyval.decl).type = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9364 "y.tab.c" /* yacc.c:1646 */ break; case 326: #line 5235 "parser.y" /* yacc.c:1646 */ { (yyval.decl).id = Char((yyvsp[-1].str)); (yyval.decl).type = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9375 "y.tab.c" /* yacc.c:1646 */ break; case 327: #line 5251 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[-1].decl); if ((yyval.decl).type) { SwigType_push((yyvsp[-2].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-2].type); } #line 9388 "y.tab.c" /* yacc.c:1646 */ break; case 328: #line 5259 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-1].decl); t = NewStringEmpty(); SwigType_add_memberpointer(t,(yyvsp[-3].str)); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9404 "y.tab.c" /* yacc.c:1646 */ break; case 329: #line 5270 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-2].decl); t = NewStringEmpty(); SwigType_add_array(t,""); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9420 "y.tab.c" /* yacc.c:1646 */ break; case 330: #line 5281 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-3].decl); t = NewStringEmpty(); SwigType_add_array(t,(yyvsp[-1].dtype).val); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9436 "y.tab.c" /* yacc.c:1646 */ break; case 331: #line 5292 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-3].decl); t = NewStringEmpty(); SwigType_add_function(t,(yyvsp[-1].pl)); if (!(yyval.decl).have_parms) { (yyval.decl).parms = (yyvsp[-1].pl); (yyval.decl).have_parms = 1; } if (!(yyval.decl).type) { (yyval.decl).type = t; } else { SwigType_push(t, (yyval.decl).type); Delete((yyval.decl).type); (yyval.decl).type = t; } } #line 9458 "y.tab.c" /* yacc.c:1646 */ break; case 332: #line 5311 "parser.y" /* yacc.c:1646 */ { /* Note: This is non-standard C. Template declarator is allowed to follow an identifier */ (yyval.decl).id = Char((yyvsp[0].str)); (yyval.decl).type = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9470 "y.tab.c" /* yacc.c:1646 */ break; case 333: #line 5319 "parser.y" /* yacc.c:1646 */ { (yyval.decl).id = Char(NewStringf("~%s",(yyvsp[0].str))); (yyval.decl).type = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9481 "y.tab.c" /* yacc.c:1646 */ break; case 334: #line 5336 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[-1].decl); if ((yyval.decl).type) { SwigType_push((yyvsp[-2].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-2].type); } #line 9494 "y.tab.c" /* yacc.c:1646 */ break; case 335: #line 5344 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[-1].decl); if (!(yyval.decl).type) { (yyval.decl).type = NewStringEmpty(); } SwigType_add_reference((yyval.decl).type); } #line 9506 "y.tab.c" /* yacc.c:1646 */ break; case 336: #line 5351 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[-1].decl); if (!(yyval.decl).type) { (yyval.decl).type = NewStringEmpty(); } SwigType_add_rvalue_reference((yyval.decl).type); } #line 9518 "y.tab.c" /* yacc.c:1646 */ break; case 337: #line 5358 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-1].decl); t = NewStringEmpty(); SwigType_add_memberpointer(t,(yyvsp[-3].str)); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9534 "y.tab.c" /* yacc.c:1646 */ break; case 338: #line 5369 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-2].decl); t = NewStringEmpty(); SwigType_add_array(t,""); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9550 "y.tab.c" /* yacc.c:1646 */ break; case 339: #line 5380 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-3].decl); t = NewStringEmpty(); SwigType_add_array(t,(yyvsp[-1].dtype).val); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9566 "y.tab.c" /* yacc.c:1646 */ break; case 340: #line 5391 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-3].decl); t = NewStringEmpty(); SwigType_add_function(t,(yyvsp[-1].pl)); if (!(yyval.decl).have_parms) { (yyval.decl).parms = (yyvsp[-1].pl); (yyval.decl).have_parms = 1; } if (!(yyval.decl).type) { (yyval.decl).type = t; } else { SwigType_push(t, (yyval.decl).type); Delete((yyval.decl).type); (yyval.decl).type = t; } } #line 9588 "y.tab.c" /* yacc.c:1646 */ break; case 341: #line 5411 "parser.y" /* yacc.c:1646 */ { SwigType *t; Append((yyvsp[-4].str), " "); /* intervening space is mandatory */ Append((yyvsp[-4].str), Char((yyvsp[-3].id))); (yyval.decl).id = Char((yyvsp[-4].str)); t = NewStringEmpty(); SwigType_add_function(t,(yyvsp[-1].pl)); if (!(yyval.decl).have_parms) { (yyval.decl).parms = (yyvsp[-1].pl); (yyval.decl).have_parms = 1; } if (!(yyval.decl).type) { (yyval.decl).type = t; } else { SwigType_push(t, (yyval.decl).type); Delete((yyval.decl).type); (yyval.decl).type = t; } } #line 9612 "y.tab.c" /* yacc.c:1646 */ break; case 342: #line 5432 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = (yyvsp[0].type); (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9623 "y.tab.c" /* yacc.c:1646 */ break; case 343: #line 5438 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_push((yyvsp[-1].type),(yyvsp[0].decl).type); (yyval.decl).type = (yyvsp[-1].type); Delete((yyvsp[0].decl).type); } #line 9634 "y.tab.c" /* yacc.c:1646 */ break; case 344: #line 5444 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = (yyvsp[-1].type); SwigType_add_reference((yyval.decl).type); (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9646 "y.tab.c" /* yacc.c:1646 */ break; case 345: #line 5451 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = (yyvsp[-1].type); SwigType_add_rvalue_reference((yyval.decl).type); (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9658 "y.tab.c" /* yacc.c:1646 */ break; case 346: #line 5458 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_reference((yyvsp[-2].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-2].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-2].type); } #line 9672 "y.tab.c" /* yacc.c:1646 */ break; case 347: #line 5467 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_rvalue_reference((yyvsp[-2].type)); if ((yyval.decl).type) { SwigType_push((yyvsp[-2].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-2].type); } #line 9686 "y.tab.c" /* yacc.c:1646 */ break; case 348: #line 5476 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); } #line 9694 "y.tab.c" /* yacc.c:1646 */ break; case 349: #line 5479 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); (yyval.decl).type = NewStringEmpty(); SwigType_add_reference((yyval.decl).type); if ((yyvsp[0].decl).type) { SwigType_push((yyval.decl).type,(yyvsp[0].decl).type); Delete((yyvsp[0].decl).type); } } #line 9708 "y.tab.c" /* yacc.c:1646 */ break; case 350: #line 5488 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); (yyval.decl).type = NewStringEmpty(); SwigType_add_rvalue_reference((yyval.decl).type); if ((yyvsp[0].decl).type) { SwigType_push((yyval.decl).type,(yyvsp[0].decl).type); Delete((yyvsp[0].decl).type); } } #line 9722 "y.tab.c" /* yacc.c:1646 */ break; case 351: #line 5497 "parser.y" /* yacc.c:1646 */ { (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; (yyval.decl).type = NewStringEmpty(); SwigType_add_reference((yyval.decl).type); } #line 9734 "y.tab.c" /* yacc.c:1646 */ break; case 352: #line 5504 "parser.y" /* yacc.c:1646 */ { (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; (yyval.decl).type = NewStringEmpty(); SwigType_add_rvalue_reference((yyval.decl).type); } #line 9746 "y.tab.c" /* yacc.c:1646 */ break; case 353: #line 5511 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = NewStringEmpty(); SwigType_add_memberpointer((yyval.decl).type,(yyvsp[-1].str)); (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; } #line 9758 "y.tab.c" /* yacc.c:1646 */ break; case 354: #line 5518 "parser.y" /* yacc.c:1646 */ { SwigType *t = NewStringEmpty(); (yyval.decl).type = (yyvsp[-2].type); (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; SwigType_add_memberpointer(t,(yyvsp[-1].str)); SwigType_push((yyval.decl).type,t); Delete(t); } #line 9773 "y.tab.c" /* yacc.c:1646 */ break; case 355: #line 5528 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[0].decl); SwigType_add_memberpointer((yyvsp[-3].type),(yyvsp[-2].str)); if ((yyval.decl).type) { SwigType_push((yyvsp[-3].type),(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = (yyvsp[-3].type); } #line 9787 "y.tab.c" /* yacc.c:1646 */ break; case 356: #line 5539 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-2].decl); t = NewStringEmpty(); SwigType_add_array(t,""); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9803 "y.tab.c" /* yacc.c:1646 */ break; case 357: #line 5550 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-3].decl); t = NewStringEmpty(); SwigType_add_array(t,(yyvsp[-1].dtype).val); if ((yyval.decl).type) { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); } (yyval.decl).type = t; } #line 9819 "y.tab.c" /* yacc.c:1646 */ break; case 358: #line 5561 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = NewStringEmpty(); (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; SwigType_add_array((yyval.decl).type,""); } #line 9831 "y.tab.c" /* yacc.c:1646 */ break; case 359: #line 5568 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = NewStringEmpty(); (yyval.decl).id = 0; (yyval.decl).parms = 0; (yyval.decl).have_parms = 0; SwigType_add_array((yyval.decl).type,(yyvsp[-1].dtype).val); } #line 9843 "y.tab.c" /* yacc.c:1646 */ break; case 360: #line 5575 "parser.y" /* yacc.c:1646 */ { (yyval.decl) = (yyvsp[-1].decl); } #line 9851 "y.tab.c" /* yacc.c:1646 */ break; case 361: #line 5578 "parser.y" /* yacc.c:1646 */ { SwigType *t; (yyval.decl) = (yyvsp[-3].decl); t = NewStringEmpty(); SwigType_add_function(t,(yyvsp[-1].pl)); if (!(yyval.decl).type) { (yyval.decl).type = t; } else { SwigType_push(t,(yyval.decl).type); Delete((yyval.decl).type); (yyval.decl).type = t; } if (!(yyval.decl).have_parms) { (yyval.decl).parms = (yyvsp[-1].pl); (yyval.decl).have_parms = 1; } } #line 9873 "y.tab.c" /* yacc.c:1646 */ break; case 362: #line 5595 "parser.y" /* yacc.c:1646 */ { (yyval.decl).type = NewStringEmpty(); SwigType_add_function((yyval.decl).type,(yyvsp[-1].pl)); (yyval.decl).parms = (yyvsp[-1].pl); (yyval.decl).have_parms = 1; (yyval.decl).id = 0; } #line 9885 "y.tab.c" /* yacc.c:1646 */ break; case 363: #line 5605 "parser.y" /* yacc.c:1646 */ { (yyval.type) = NewStringEmpty(); SwigType_add_pointer((yyval.type)); SwigType_push((yyval.type),(yyvsp[-1].str)); SwigType_push((yyval.type),(yyvsp[0].type)); Delete((yyvsp[0].type)); } #line 9897 "y.tab.c" /* yacc.c:1646 */ break; case 364: #line 5612 "parser.y" /* yacc.c:1646 */ { (yyval.type) = NewStringEmpty(); SwigType_add_pointer((yyval.type)); SwigType_push((yyval.type),(yyvsp[0].type)); Delete((yyvsp[0].type)); } #line 9908 "y.tab.c" /* yacc.c:1646 */ break; case 365: #line 5618 "parser.y" /* yacc.c:1646 */ { (yyval.type) = NewStringEmpty(); SwigType_add_pointer((yyval.type)); SwigType_push((yyval.type),(yyvsp[0].str)); } #line 9918 "y.tab.c" /* yacc.c:1646 */ break; case 366: #line 5623 "parser.y" /* yacc.c:1646 */ { (yyval.type) = NewStringEmpty(); SwigType_add_pointer((yyval.type)); } #line 9927 "y.tab.c" /* yacc.c:1646 */ break; case 367: #line 5629 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringEmpty(); if ((yyvsp[0].id)) SwigType_add_qualifier((yyval.str),(yyvsp[0].id)); } #line 9936 "y.tab.c" /* yacc.c:1646 */ break; case 368: #line 5633 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); if ((yyvsp[-1].id)) SwigType_add_qualifier((yyval.str),(yyvsp[-1].id)); } #line 9945 "y.tab.c" /* yacc.c:1646 */ break; case 369: #line 5639 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "const"; } #line 9951 "y.tab.c" /* yacc.c:1646 */ break; case 370: #line 5640 "parser.y" /* yacc.c:1646 */ { (yyval.id) = "volatile"; } #line 9957 "y.tab.c" /* yacc.c:1646 */ break; case 371: #line 5641 "parser.y" /* yacc.c:1646 */ { (yyval.id) = 0; } #line 9963 "y.tab.c" /* yacc.c:1646 */ break; case 372: #line 5647 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); Replace((yyval.type),"typename ","", DOH_REPLACE_ANY); } #line 9972 "y.tab.c" /* yacc.c:1646 */ break; case 373: #line 5653 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); SwigType_push((yyval.type),(yyvsp[-1].str)); } #line 9981 "y.tab.c" /* yacc.c:1646 */ break; case 374: #line 5657 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 9987 "y.tab.c" /* yacc.c:1646 */ break; case 375: #line 5658 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[-1].type); SwigType_push((yyval.type),(yyvsp[0].str)); } #line 9996 "y.tab.c" /* yacc.c:1646 */ break; case 376: #line 5662 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[-1].type); SwigType_push((yyval.type),(yyvsp[0].str)); SwigType_push((yyval.type),(yyvsp[-2].str)); } #line 10006 "y.tab.c" /* yacc.c:1646 */ break; case 377: #line 5669 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); /* Printf(stdout,"primitive = '%s'\n", $$);*/ } #line 10014 "y.tab.c" /* yacc.c:1646 */ break; case 378: #line 5672 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 10020 "y.tab.c" /* yacc.c:1646 */ break; case 379: #line 5673 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 10026 "y.tab.c" /* yacc.c:1646 */ break; case 380: #line 5677 "parser.y" /* yacc.c:1646 */ { (yyval.type) = NewStringf("enum %s", (yyvsp[0].str)); } #line 10032 "y.tab.c" /* yacc.c:1646 */ break; case 381: #line 5678 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 10038 "y.tab.c" /* yacc.c:1646 */ break; case 382: #line 5680 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].str); } #line 10046 "y.tab.c" /* yacc.c:1646 */ break; case 383: #line 5683 "parser.y" /* yacc.c:1646 */ { (yyval.type) = NewStringf("%s %s", (yyvsp[-1].id), (yyvsp[0].str)); } #line 10054 "y.tab.c" /* yacc.c:1646 */ break; case 384: #line 5686 "parser.y" /* yacc.c:1646 */ { (yyval.type) = (yyvsp[0].type); } #line 10062 "y.tab.c" /* yacc.c:1646 */ break; case 385: #line 5691 "parser.y" /* yacc.c:1646 */ { Node *n = Swig_symbol_clookup((yyvsp[-1].str),0); if (!n) { Swig_error(cparse_file, cparse_line, "Identifier %s not defined.\n", (yyvsp[-1].str)); (yyval.type) = (yyvsp[-1].str); } else { (yyval.type) = Getattr(n, "type"); } } #line 10076 "y.tab.c" /* yacc.c:1646 */ break; case 386: #line 5702 "parser.y" /* yacc.c:1646 */ { if (!(yyvsp[0].ptype).type) (yyvsp[0].ptype).type = NewString("int"); if ((yyvsp[0].ptype).us) { (yyval.type) = NewStringf("%s %s", (yyvsp[0].ptype).us, (yyvsp[0].ptype).type); Delete((yyvsp[0].ptype).us); Delete((yyvsp[0].ptype).type); } else { (yyval.type) = (yyvsp[0].ptype).type; } if (Cmp((yyval.type),"signed int") == 0) { Delete((yyval.type)); (yyval.type) = NewString("int"); } else if (Cmp((yyval.type),"signed long") == 0) { Delete((yyval.type)); (yyval.type) = NewString("long"); } else if (Cmp((yyval.type),"signed short") == 0) { Delete((yyval.type)); (yyval.type) = NewString("short"); } else if (Cmp((yyval.type),"signed long long") == 0) { Delete((yyval.type)); (yyval.type) = NewString("long long"); } } #line 10104 "y.tab.c" /* yacc.c:1646 */ break; case 387: #line 5727 "parser.y" /* yacc.c:1646 */ { (yyval.ptype) = (yyvsp[0].ptype); } #line 10112 "y.tab.c" /* yacc.c:1646 */ break; case 388: #line 5730 "parser.y" /* yacc.c:1646 */ { if ((yyvsp[-1].ptype).us && (yyvsp[0].ptype).us) { Swig_error(cparse_file, cparse_line, "Extra %s specifier.\n", (yyvsp[0].ptype).us); } (yyval.ptype) = (yyvsp[0].ptype); if ((yyvsp[-1].ptype).us) (yyval.ptype).us = (yyvsp[-1].ptype).us; if ((yyvsp[-1].ptype).type) { if (!(yyvsp[0].ptype).type) (yyval.ptype).type = (yyvsp[-1].ptype).type; else { int err = 0; if ((Cmp((yyvsp[-1].ptype).type,"long") == 0)) { if ((Cmp((yyvsp[0].ptype).type,"long") == 0) || (Strncmp((yyvsp[0].ptype).type,"double",6) == 0)) { (yyval.ptype).type = NewStringf("long %s", (yyvsp[0].ptype).type); } else if (Cmp((yyvsp[0].ptype).type,"int") == 0) { (yyval.ptype).type = (yyvsp[-1].ptype).type; } else { err = 1; } } else if ((Cmp((yyvsp[-1].ptype).type,"short")) == 0) { if (Cmp((yyvsp[0].ptype).type,"int") == 0) { (yyval.ptype).type = (yyvsp[-1].ptype).type; } else { err = 1; } } else if (Cmp((yyvsp[-1].ptype).type,"int") == 0) { (yyval.ptype).type = (yyvsp[0].ptype).type; } else if (Cmp((yyvsp[-1].ptype).type,"double") == 0) { if (Cmp((yyvsp[0].ptype).type,"long") == 0) { (yyval.ptype).type = NewString("long double"); } else if (Cmp((yyvsp[0].ptype).type,"complex") == 0) { (yyval.ptype).type = NewString("double complex"); } else { err = 1; } } else if (Cmp((yyvsp[-1].ptype).type,"float") == 0) { if (Cmp((yyvsp[0].ptype).type,"complex") == 0) { (yyval.ptype).type = NewString("float complex"); } else { err = 1; } } else if (Cmp((yyvsp[-1].ptype).type,"complex") == 0) { (yyval.ptype).type = NewStringf("%s complex", (yyvsp[0].ptype).type); } else { err = 1; } if (err) { Swig_error(cparse_file, cparse_line, "Extra %s specifier.\n", (yyvsp[-1].ptype).type); } } } } #line 10168 "y.tab.c" /* yacc.c:1646 */ break; case 389: #line 5784 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("int"); (yyval.ptype).us = 0; } #line 10177 "y.tab.c" /* yacc.c:1646 */ break; case 390: #line 5788 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("short"); (yyval.ptype).us = 0; } #line 10186 "y.tab.c" /* yacc.c:1646 */ break; case 391: #line 5792 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("long"); (yyval.ptype).us = 0; } #line 10195 "y.tab.c" /* yacc.c:1646 */ break; case 392: #line 5796 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("char"); (yyval.ptype).us = 0; } #line 10204 "y.tab.c" /* yacc.c:1646 */ break; case 393: #line 5800 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("wchar_t"); (yyval.ptype).us = 0; } #line 10213 "y.tab.c" /* yacc.c:1646 */ break; case 394: #line 5804 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("float"); (yyval.ptype).us = 0; } #line 10222 "y.tab.c" /* yacc.c:1646 */ break; case 395: #line 5808 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("double"); (yyval.ptype).us = 0; } #line 10231 "y.tab.c" /* yacc.c:1646 */ break; case 396: #line 5812 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).us = NewString("signed"); (yyval.ptype).type = 0; } #line 10240 "y.tab.c" /* yacc.c:1646 */ break; case 397: #line 5816 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).us = NewString("unsigned"); (yyval.ptype).type = 0; } #line 10249 "y.tab.c" /* yacc.c:1646 */ break; case 398: #line 5820 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("complex"); (yyval.ptype).us = 0; } #line 10258 "y.tab.c" /* yacc.c:1646 */ break; case 399: #line 5824 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("__int8"); (yyval.ptype).us = 0; } #line 10267 "y.tab.c" /* yacc.c:1646 */ break; case 400: #line 5828 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("__int16"); (yyval.ptype).us = 0; } #line 10276 "y.tab.c" /* yacc.c:1646 */ break; case 401: #line 5832 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("__int32"); (yyval.ptype).us = 0; } #line 10285 "y.tab.c" /* yacc.c:1646 */ break; case 402: #line 5836 "parser.y" /* yacc.c:1646 */ { (yyval.ptype).type = NewString("__int64"); (yyval.ptype).us = 0; } #line 10294 "y.tab.c" /* yacc.c:1646 */ break; case 403: #line 5842 "parser.y" /* yacc.c:1646 */ { /* scanner_check_typedef(); */ } #line 10300 "y.tab.c" /* yacc.c:1646 */ break; case 404: #line 5842 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyval.dtype).type == T_STRING) { (yyval.dtype).rawval = NewStringf("\"%(escape)s\"",(yyval.dtype).val); } else if ((yyval.dtype).type != T_CHAR && (yyval.dtype).type != T_WSTRING && (yyval.dtype).type != T_WCHAR) { (yyval.dtype).rawval = NewStringf("%s", (yyval.dtype).val); } (yyval.dtype).qualifier = 0; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; scanner_ignore_typedef(); } #line 10319 "y.tab.c" /* yacc.c:1646 */ break; case 405: #line 5856 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10327 "y.tab.c" /* yacc.c:1646 */ break; case 406: #line 5861 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10335 "y.tab.c" /* yacc.c:1646 */ break; case 407: #line 5864 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10343 "y.tab.c" /* yacc.c:1646 */ break; case 408: #line 5870 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewString("delete"); (yyval.dtype).rawval = 0; (yyval.dtype).type = T_STRING; (yyval.dtype).qualifier = 0; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 10358 "y.tab.c" /* yacc.c:1646 */ break; case 409: #line 5883 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewString("default"); (yyval.dtype).rawval = 0; (yyval.dtype).type = T_STRING; (yyval.dtype).qualifier = 0; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 10373 "y.tab.c" /* yacc.c:1646 */ break; case 410: #line 5897 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[0].id); } #line 10379 "y.tab.c" /* yacc.c:1646 */ break; case 411: #line 5898 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char *) 0;} #line 10385 "y.tab.c" /* yacc.c:1646 */ break; case 412: #line 5901 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); } #line 10391 "y.tab.c" /* yacc.c:1646 */ break; case 413: #line 5902 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 10397 "y.tab.c" /* yacc.c:1646 */ break; case 414: #line 5906 "parser.y" /* yacc.c:1646 */ { Node *leftSibling = Getattr((yyvsp[-4].node),"_last"); set_nextSibling(leftSibling,(yyvsp[-1].node)); Setattr((yyvsp[-4].node),"_last",(yyvsp[-1].node)); (yyval.node) = (yyvsp[-4].node); } #line 10408 "y.tab.c" /* yacc.c:1646 */ break; case 415: #line 5912 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[-2].node); } #line 10416 "y.tab.c" /* yacc.c:1646 */ break; case 416: #line 5915 "parser.y" /* yacc.c:1646 */ { Setattr((yyvsp[-1].node),"_last",(yyvsp[-1].node)); (yyval.node) = (yyvsp[-1].node); } #line 10425 "y.tab.c" /* yacc.c:1646 */ break; case 417: #line 5919 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 10433 "y.tab.c" /* yacc.c:1646 */ break; case 418: #line 5924 "parser.y" /* yacc.c:1646 */ { SwigType *type = NewSwigType(T_INT); (yyval.node) = new_node("enumitem"); Setattr((yyval.node),"name",(yyvsp[0].id)); Setattr((yyval.node),"type",type); SetFlag((yyval.node),"feature:immutable"); Delete(type); } #line 10446 "y.tab.c" /* yacc.c:1646 */ break; case 419: #line 5932 "parser.y" /* yacc.c:1646 */ { SwigType *type = NewSwigType((yyvsp[0].dtype).type == T_BOOL ? T_BOOL : ((yyvsp[0].dtype).type == T_CHAR ? T_CHAR : T_INT)); (yyval.node) = new_node("enumitem"); Setattr((yyval.node),"name",(yyvsp[-2].id)); Setattr((yyval.node),"type",type); SetFlag((yyval.node),"feature:immutable"); Setattr((yyval.node),"enumvalue", (yyvsp[0].dtype).val); Setattr((yyval.node),"value",(yyvsp[-2].id)); Delete(type); } #line 10461 "y.tab.c" /* yacc.c:1646 */ break; case 420: #line 5944 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if (((yyval.dtype).type != T_INT) && ((yyval.dtype).type != T_UINT) && ((yyval.dtype).type != T_LONG) && ((yyval.dtype).type != T_ULONG) && ((yyval.dtype).type != T_LONGLONG) && ((yyval.dtype).type != T_ULONGLONG) && ((yyval.dtype).type != T_SHORT) && ((yyval.dtype).type != T_USHORT) && ((yyval.dtype).type != T_SCHAR) && ((yyval.dtype).type != T_UCHAR) && ((yyval.dtype).type != T_CHAR) && ((yyval.dtype).type != T_BOOL)) { Swig_error(cparse_file,cparse_line,"Type error. Expecting an integral type\n"); } } #line 10477 "y.tab.c" /* yacc.c:1646 */ break; case 421: #line 5959 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10483 "y.tab.c" /* yacc.c:1646 */ break; case 422: #line 5960 "parser.y" /* yacc.c:1646 */ { Node *n; (yyval.dtype).val = (yyvsp[0].type); (yyval.dtype).type = T_INT; /* Check if value is in scope */ n = Swig_symbol_clookup((yyvsp[0].type),0); if (n) { /* A band-aid for enum values used in expressions. */ if (Strcmp(nodeType(n),"enumitem") == 0) { String *q = Swig_symbol_qualified(n); if (q) { (yyval.dtype).val = NewStringf("%s::%s", q, Getattr(n,"name")); Delete(q); } } } } #line 10505 "y.tab.c" /* yacc.c:1646 */ break; case 423: #line 5979 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10511 "y.tab.c" /* yacc.c:1646 */ break; case 424: #line 5980 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = (yyvsp[0].str); (yyval.dtype).type = T_STRING; } #line 10520 "y.tab.c" /* yacc.c:1646 */ break; case 425: #line 5984 "parser.y" /* yacc.c:1646 */ { SwigType_push((yyvsp[-2].type),(yyvsp[-1].decl).type); (yyval.dtype).val = NewStringf("sizeof(%s)",SwigType_str((yyvsp[-2].type),0)); (yyval.dtype).type = T_ULONG; } #line 10530 "y.tab.c" /* yacc.c:1646 */ break; case 426: #line 5989 "parser.y" /* yacc.c:1646 */ { SwigType_push((yyvsp[-2].type),(yyvsp[-1].decl).type); (yyval.dtype).val = NewStringf("sizeof...(%s)",SwigType_str((yyvsp[-2].type),0)); (yyval.dtype).type = T_ULONG; } #line 10540 "y.tab.c" /* yacc.c:1646 */ break; case 427: #line 5994 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10546 "y.tab.c" /* yacc.c:1646 */ break; case 428: #line 5995 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = (yyvsp[0].str); (yyval.dtype).rawval = NewStringf("L\"%s\"", (yyval.dtype).val); (yyval.dtype).type = T_WSTRING; } #line 10556 "y.tab.c" /* yacc.c:1646 */ break; case 429: #line 6000 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewString((yyvsp[0].str)); if (Len((yyval.dtype).val)) { (yyval.dtype).rawval = NewStringf("'%(escape)s'", (yyval.dtype).val); } else { (yyval.dtype).rawval = NewString("'\\0'"); } (yyval.dtype).type = T_CHAR; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 10574 "y.tab.c" /* yacc.c:1646 */ break; case 430: #line 6013 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewString((yyvsp[0].str)); if (Len((yyval.dtype).val)) { (yyval.dtype).rawval = NewStringf("L\'%s\'", (yyval.dtype).val); } else { (yyval.dtype).rawval = NewString("L'\\0'"); } (yyval.dtype).type = T_WCHAR; (yyval.dtype).bitfield = 0; (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 10592 "y.tab.c" /* yacc.c:1646 */ break; case 431: #line 6028 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("(%s)",(yyvsp[-1].dtype).val); (yyval.dtype).type = (yyvsp[-1].dtype).type; } #line 10601 "y.tab.c" /* yacc.c:1646 */ break; case 432: #line 6035 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyvsp[0].dtype).type != T_STRING) { switch ((yyvsp[-2].dtype).type) { case T_FLOAT: case T_DOUBLE: case T_LONGDOUBLE: case T_FLTCPLX: case T_DBLCPLX: (yyval.dtype).val = NewStringf("(%s)%s", (yyvsp[-2].dtype).val, (yyvsp[0].dtype).val); /* SwigType_str and decimal points don't mix! */ break; default: (yyval.dtype).val = NewStringf("(%s) %s", SwigType_str((yyvsp[-2].dtype).val,0), (yyvsp[0].dtype).val); break; } } } #line 10623 "y.tab.c" /* yacc.c:1646 */ break; case 433: #line 6052 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyvsp[0].dtype).type != T_STRING) { SwigType_push((yyvsp[-3].dtype).val,(yyvsp[-2].type)); (yyval.dtype).val = NewStringf("(%s) %s", SwigType_str((yyvsp[-3].dtype).val,0), (yyvsp[0].dtype).val); } } #line 10635 "y.tab.c" /* yacc.c:1646 */ break; case 434: #line 6059 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyvsp[0].dtype).type != T_STRING) { SwigType_add_reference((yyvsp[-3].dtype).val); (yyval.dtype).val = NewStringf("(%s) %s", SwigType_str((yyvsp[-3].dtype).val,0), (yyvsp[0].dtype).val); } } #line 10647 "y.tab.c" /* yacc.c:1646 */ break; case 435: #line 6066 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyvsp[0].dtype).type != T_STRING) { SwigType_add_rvalue_reference((yyvsp[-3].dtype).val); (yyval.dtype).val = NewStringf("(%s) %s", SwigType_str((yyvsp[-3].dtype).val,0), (yyvsp[0].dtype).val); } } #line 10659 "y.tab.c" /* yacc.c:1646 */ break; case 436: #line 6073 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyvsp[0].dtype).type != T_STRING) { SwigType_push((yyvsp[-4].dtype).val,(yyvsp[-3].type)); SwigType_add_reference((yyvsp[-4].dtype).val); (yyval.dtype).val = NewStringf("(%s) %s", SwigType_str((yyvsp[-4].dtype).val,0), (yyvsp[0].dtype).val); } } #line 10672 "y.tab.c" /* yacc.c:1646 */ break; case 437: #line 6081 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); if ((yyvsp[0].dtype).type != T_STRING) { SwigType_push((yyvsp[-4].dtype).val,(yyvsp[-3].type)); SwigType_add_rvalue_reference((yyvsp[-4].dtype).val); (yyval.dtype).val = NewStringf("(%s) %s", SwigType_str((yyvsp[-4].dtype).val,0), (yyvsp[0].dtype).val); } } #line 10685 "y.tab.c" /* yacc.c:1646 */ break; case 438: #line 6089 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).val = NewStringf("&%s",(yyvsp[0].dtype).val); } #line 10694 "y.tab.c" /* yacc.c:1646 */ break; case 439: #line 6093 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).val = NewStringf("&&%s",(yyvsp[0].dtype).val); } #line 10703 "y.tab.c" /* yacc.c:1646 */ break; case 440: #line 6097 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).val = NewStringf("*%s",(yyvsp[0].dtype).val); } #line 10712 "y.tab.c" /* yacc.c:1646 */ break; case 441: #line 6103 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10718 "y.tab.c" /* yacc.c:1646 */ break; case 442: #line 6104 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10724 "y.tab.c" /* yacc.c:1646 */ break; case 443: #line 6105 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10730 "y.tab.c" /* yacc.c:1646 */ break; case 444: #line 6106 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10736 "y.tab.c" /* yacc.c:1646 */ break; case 445: #line 6107 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10742 "y.tab.c" /* yacc.c:1646 */ break; case 446: #line 6108 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10748 "y.tab.c" /* yacc.c:1646 */ break; case 447: #line 6109 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10754 "y.tab.c" /* yacc.c:1646 */ break; case 448: #line 6110 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); } #line 10760 "y.tab.c" /* yacc.c:1646 */ break; case 449: #line 6113 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s+%s", COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10769 "y.tab.c" /* yacc.c:1646 */ break; case 450: #line 6117 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s-%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10778 "y.tab.c" /* yacc.c:1646 */ break; case 451: #line 6121 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s*%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10787 "y.tab.c" /* yacc.c:1646 */ break; case 452: #line 6125 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s/%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10796 "y.tab.c" /* yacc.c:1646 */ break; case 453: #line 6129 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s%%%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10805 "y.tab.c" /* yacc.c:1646 */ break; case 454: #line 6133 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s&%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10814 "y.tab.c" /* yacc.c:1646 */ break; case 455: #line 6137 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s|%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10823 "y.tab.c" /* yacc.c:1646 */ break; case 456: #line 6141 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s^%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote((yyvsp[-2].dtype).type,(yyvsp[0].dtype).type); } #line 10832 "y.tab.c" /* yacc.c:1646 */ break; case 457: #line 6145 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s << %s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote_type((yyvsp[-2].dtype).type); } #line 10841 "y.tab.c" /* yacc.c:1646 */ break; case 458: #line 6149 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s >> %s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = promote_type((yyvsp[-2].dtype).type); } #line 10850 "y.tab.c" /* yacc.c:1646 */ break; case 459: #line 6153 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s&&%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = cparse_cplusplus ? T_BOOL : T_INT; } #line 10859 "y.tab.c" /* yacc.c:1646 */ break; case 460: #line 6157 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s||%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = cparse_cplusplus ? T_BOOL : T_INT; } #line 10868 "y.tab.c" /* yacc.c:1646 */ break; case 461: #line 6161 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s==%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = cparse_cplusplus ? T_BOOL : T_INT; } #line 10877 "y.tab.c" /* yacc.c:1646 */ break; case 462: #line 6165 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s!=%s",COMPOUND_EXPR_VAL((yyvsp[-2].dtype)),COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = cparse_cplusplus ? T_BOOL : T_INT; } #line 10886 "y.tab.c" /* yacc.c:1646 */ break; case 463: #line 6179 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s >= %s", COMPOUND_EXPR_VAL((yyvsp[-2].dtype)), COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = cparse_cplusplus ? T_BOOL : T_INT; } #line 10895 "y.tab.c" /* yacc.c:1646 */ break; case 464: #line 6183 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s <= %s", COMPOUND_EXPR_VAL((yyvsp[-2].dtype)), COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = cparse_cplusplus ? T_BOOL : T_INT; } #line 10904 "y.tab.c" /* yacc.c:1646 */ break; case 465: #line 6187 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("%s?%s:%s", COMPOUND_EXPR_VAL((yyvsp[-4].dtype)), COMPOUND_EXPR_VAL((yyvsp[-2].dtype)), COMPOUND_EXPR_VAL((yyvsp[0].dtype))); /* This may not be exactly right, but is probably good enough * for the purposes of parsing constant expressions. */ (yyval.dtype).type = promote((yyvsp[-2].dtype).type, (yyvsp[0].dtype).type); } #line 10915 "y.tab.c" /* yacc.c:1646 */ break; case 466: #line 6193 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("-%s",(yyvsp[0].dtype).val); (yyval.dtype).type = (yyvsp[0].dtype).type; } #line 10924 "y.tab.c" /* yacc.c:1646 */ break; case 467: #line 6197 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("+%s",(yyvsp[0].dtype).val); (yyval.dtype).type = (yyvsp[0].dtype).type; } #line 10933 "y.tab.c" /* yacc.c:1646 */ break; case 468: #line 6201 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("~%s",(yyvsp[0].dtype).val); (yyval.dtype).type = (yyvsp[0].dtype).type; } #line 10942 "y.tab.c" /* yacc.c:1646 */ break; case 469: #line 6205 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).val = NewStringf("!%s",COMPOUND_EXPR_VAL((yyvsp[0].dtype))); (yyval.dtype).type = T_INT; } #line 10951 "y.tab.c" /* yacc.c:1646 */ break; case 470: #line 6209 "parser.y" /* yacc.c:1646 */ { String *qty; skip_balanced('(',')'); qty = Swig_symbol_type_qualify((yyvsp[-1].type),0); if (SwigType_istemplate(qty)) { String *nstr = SwigType_namestr(qty); Delete(qty); qty = nstr; } (yyval.dtype).val = NewStringf("%s%s",qty,scanner_ccode); Clear(scanner_ccode); (yyval.dtype).type = T_INT; Delete(qty); } #line 10970 "y.tab.c" /* yacc.c:1646 */ break; case 471: #line 6225 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewString("..."); } #line 10978 "y.tab.c" /* yacc.c:1646 */ break; case 472: #line 6230 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 10986 "y.tab.c" /* yacc.c:1646 */ break; case 473: #line 6233 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; } #line 10994 "y.tab.c" /* yacc.c:1646 */ break; case 474: #line 6238 "parser.y" /* yacc.c:1646 */ { (yyval.bases) = (yyvsp[0].bases); } #line 11002 "y.tab.c" /* yacc.c:1646 */ break; case 475: #line 6243 "parser.y" /* yacc.c:1646 */ { inherit_list = 1; } #line 11008 "y.tab.c" /* yacc.c:1646 */ break; case 476: #line 6243 "parser.y" /* yacc.c:1646 */ { (yyval.bases) = (yyvsp[0].bases); inherit_list = 0; } #line 11014 "y.tab.c" /* yacc.c:1646 */ break; case 477: #line 6244 "parser.y" /* yacc.c:1646 */ { (yyval.bases) = 0; } #line 11020 "y.tab.c" /* yacc.c:1646 */ break; case 478: #line 6247 "parser.y" /* yacc.c:1646 */ { Hash *list = NewHash(); Node *base = (yyvsp[0].node); Node *name = Getattr(base,"name"); List *lpublic = NewList(); List *lprotected = NewList(); List *lprivate = NewList(); Setattr(list,"public",lpublic); Setattr(list,"protected",lprotected); Setattr(list,"private",lprivate); Delete(lpublic); Delete(lprotected); Delete(lprivate); Append(Getattr(list,Getattr(base,"access")),name); (yyval.bases) = list; } #line 11041 "y.tab.c" /* yacc.c:1646 */ break; case 479: #line 6264 "parser.y" /* yacc.c:1646 */ { Hash *list = (yyvsp[-2].bases); Node *base = (yyvsp[0].node); Node *name = Getattr(base,"name"); Append(Getattr(list,Getattr(base,"access")),name); (yyval.bases) = list; } #line 11053 "y.tab.c" /* yacc.c:1646 */ break; case 480: #line 6273 "parser.y" /* yacc.c:1646 */ { (yyval.intvalue) = cparse_line; } #line 11061 "y.tab.c" /* yacc.c:1646 */ break; case 481: #line 6275 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setfile((yyval.node),cparse_file); Setline((yyval.node),(yyvsp[-2].intvalue)); Setattr((yyval.node),"name",(yyvsp[-1].str)); Setfile((yyvsp[-1].str),cparse_file); Setline((yyvsp[-1].str),(yyvsp[-2].intvalue)); if (last_cpptype && (Strcmp(last_cpptype,"struct") != 0)) { Setattr((yyval.node),"access","private"); Swig_warning(WARN_PARSE_NO_ACCESS, Getfile((yyval.node)), Getline((yyval.node)), "No access specifier given for base class '%s' (ignored).\n", SwigType_namestr((yyvsp[-1].str))); } else { Setattr((yyval.node),"access","public"); } if ((yyvsp[0].str)) SetFlag((yyval.node), "variadic"); } #line 11082 "y.tab.c" /* yacc.c:1646 */ break; case 482: #line 6291 "parser.y" /* yacc.c:1646 */ { (yyval.intvalue) = cparse_line; } #line 11090 "y.tab.c" /* yacc.c:1646 */ break; case 483: #line 6293 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setfile((yyval.node),cparse_file); Setline((yyval.node),(yyvsp[-3].intvalue)); Setattr((yyval.node),"name",(yyvsp[-1].str)); Setfile((yyvsp[-1].str),cparse_file); Setline((yyvsp[-1].str),(yyvsp[-3].intvalue)); Setattr((yyval.node),"access",(yyvsp[-4].id)); if (Strcmp((yyvsp[-4].id),"public") != 0) { Swig_warning(WARN_PARSE_PRIVATE_INHERIT, Getfile((yyval.node)), Getline((yyval.node)), "%s inheritance from base '%s' (ignored).\n", (yyvsp[-4].id), SwigType_namestr((yyvsp[-1].str))); } if ((yyvsp[0].str)) SetFlag((yyval.node), "variadic"); } #line 11109 "y.tab.c" /* yacc.c:1646 */ break; case 484: #line 6309 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"public"; } #line 11115 "y.tab.c" /* yacc.c:1646 */ break; case 485: #line 6310 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"private"; } #line 11121 "y.tab.c" /* yacc.c:1646 */ break; case 486: #line 6311 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"protected"; } #line 11127 "y.tab.c" /* yacc.c:1646 */ break; case 487: #line 6314 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"class"; if (!inherit_list) last_cpptype = (yyval.id); } #line 11136 "y.tab.c" /* yacc.c:1646 */ break; case 488: #line 6318 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char *)"typename"; if (!inherit_list) last_cpptype = (yyval.id); } #line 11145 "y.tab.c" /* yacc.c:1646 */ break; case 489: #line 6322 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char *)"class..."; if (!inherit_list) last_cpptype = (yyval.id); } #line 11154 "y.tab.c" /* yacc.c:1646 */ break; case 490: #line 6326 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char *)"typename..."; if (!inherit_list) last_cpptype = (yyval.id); } #line 11163 "y.tab.c" /* yacc.c:1646 */ break; case 491: #line 6332 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[0].id); } #line 11171 "y.tab.c" /* yacc.c:1646 */ break; case 492: #line 6335 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"struct"; if (!inherit_list) last_cpptype = (yyval.id); } #line 11180 "y.tab.c" /* yacc.c:1646 */ break; case 493: #line 6339 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"union"; if (!inherit_list) last_cpptype = (yyval.id); } #line 11189 "y.tab.c" /* yacc.c:1646 */ break; case 494: #line 6345 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"class"; if (!inherit_list) last_cpptype = (yyval.id); } #line 11198 "y.tab.c" /* yacc.c:1646 */ break; case 495: #line 6349 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"struct"; if (!inherit_list) last_cpptype = (yyval.id); } #line 11207 "y.tab.c" /* yacc.c:1646 */ break; case 496: #line 6353 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (char*)"union"; if (!inherit_list) last_cpptype = (yyval.id); } #line 11216 "y.tab.c" /* yacc.c:1646 */ break; case 497: #line 6359 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[0].id); } #line 11224 "y.tab.c" /* yacc.c:1646 */ break; case 498: #line 6362 "parser.y" /* yacc.c:1646 */ { (yyval.id) = 0; } #line 11232 "y.tab.c" /* yacc.c:1646 */ break; case 501: #line 6371 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; } #line 11240 "y.tab.c" /* yacc.c:1646 */ break; case 502: #line 6374 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; } #line 11248 "y.tab.c" /* yacc.c:1646 */ break; case 503: #line 6377 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; } #line 11256 "y.tab.c" /* yacc.c:1646 */ break; case 504: #line 6380 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; } #line 11264 "y.tab.c" /* yacc.c:1646 */ break; case 505: #line 6385 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).throws = (yyvsp[-1].pl); (yyval.dtype).throwf = NewString("1"); (yyval.dtype).nexcept = 0; } #line 11274 "y.tab.c" /* yacc.c:1646 */ break; case 506: #line 6390 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = NewString("true"); } #line 11284 "y.tab.c" /* yacc.c:1646 */ break; case 507: #line 6395 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; } #line 11294 "y.tab.c" /* yacc.c:1646 */ break; case 508: #line 6400 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = NewString("true"); } #line 11304 "y.tab.c" /* yacc.c:1646 */ break; case 509: #line 6405 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = (yyvsp[-1].dtype).val; } #line 11314 "y.tab.c" /* yacc.c:1646 */ break; case 510: #line 6412 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; (yyval.dtype).qualifier = (yyvsp[0].str); } #line 11325 "y.tab.c" /* yacc.c:1646 */ break; case 511: #line 6418 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).qualifier = 0; } #line 11334 "y.tab.c" /* yacc.c:1646 */ break; case 512: #line 6422 "parser.y" /* yacc.c:1646 */ { (yyval.dtype) = (yyvsp[0].dtype); (yyval.dtype).qualifier = (yyvsp[-1].str); } #line 11343 "y.tab.c" /* yacc.c:1646 */ break; case 513: #line 6426 "parser.y" /* yacc.c:1646 */ { (yyval.dtype).throws = 0; (yyval.dtype).throwf = 0; (yyval.dtype).nexcept = 0; (yyval.dtype).qualifier = 0; } #line 11354 "y.tab.c" /* yacc.c:1646 */ break; case 514: #line 6434 "parser.y" /* yacc.c:1646 */ { Clear(scanner_ccode); (yyval.decl).have_parms = 0; (yyval.decl).defarg = 0; (yyval.decl).throws = (yyvsp[-2].dtype).throws; (yyval.decl).throwf = (yyvsp[-2].dtype).throwf; (yyval.decl).nexcept = (yyvsp[-2].dtype).nexcept; } #line 11367 "y.tab.c" /* yacc.c:1646 */ break; case 515: #line 6442 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.decl).have_parms = 0; (yyval.decl).defarg = 0; (yyval.decl).throws = (yyvsp[-2].dtype).throws; (yyval.decl).throwf = (yyvsp[-2].dtype).throwf; (yyval.decl).nexcept = (yyvsp[-2].dtype).nexcept; } #line 11380 "y.tab.c" /* yacc.c:1646 */ break; case 516: #line 6450 "parser.y" /* yacc.c:1646 */ { Clear(scanner_ccode); (yyval.decl).parms = (yyvsp[-2].pl); (yyval.decl).have_parms = 1; (yyval.decl).defarg = 0; (yyval.decl).throws = 0; (yyval.decl).throwf = 0; (yyval.decl).nexcept = 0; } #line 11394 "y.tab.c" /* yacc.c:1646 */ break; case 517: #line 6459 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.decl).parms = (yyvsp[-2].pl); (yyval.decl).have_parms = 1; (yyval.decl).defarg = 0; (yyval.decl).throws = 0; (yyval.decl).throwf = 0; (yyval.decl).nexcept = 0; } #line 11408 "y.tab.c" /* yacc.c:1646 */ break; case 518: #line 6468 "parser.y" /* yacc.c:1646 */ { (yyval.decl).have_parms = 0; (yyval.decl).defarg = (yyvsp[-1].dtype).val; (yyval.decl).throws = 0; (yyval.decl).throwf = 0; (yyval.decl).nexcept = 0; } #line 11420 "y.tab.c" /* yacc.c:1646 */ break; case 519: #line 6475 "parser.y" /* yacc.c:1646 */ { (yyval.decl).have_parms = 0; (yyval.decl).defarg = (yyvsp[-1].dtype).val; (yyval.decl).throws = (yyvsp[-3].dtype).throws; (yyval.decl).throwf = (yyvsp[-3].dtype).throwf; (yyval.decl).nexcept = (yyvsp[-3].dtype).nexcept; } #line 11432 "y.tab.c" /* yacc.c:1646 */ break; case 526: #line 6494 "parser.y" /* yacc.c:1646 */ { skip_balanced('(',')'); Clear(scanner_ccode); } #line 11441 "y.tab.c" /* yacc.c:1646 */ break; case 527: #line 6506 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); Clear(scanner_ccode); } #line 11450 "y.tab.c" /* yacc.c:1646 */ break; case 528: #line 6512 "parser.y" /* yacc.c:1646 */ { String *s = NewStringEmpty(); SwigType_add_template(s,(yyvsp[-1].p)); (yyval.id) = Char(s); scanner_last_id(1); } #line 11461 "y.tab.c" /* yacc.c:1646 */ break; case 529: #line 6521 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[0].id); } #line 11467 "y.tab.c" /* yacc.c:1646 */ break; case 530: #line 6522 "parser.y" /* yacc.c:1646 */ { (yyval.id) = Swig_copy_string("override"); } #line 11473 "y.tab.c" /* yacc.c:1646 */ break; case 531: #line 6523 "parser.y" /* yacc.c:1646 */ { (yyval.id) = Swig_copy_string("final"); } #line 11479 "y.tab.c" /* yacc.c:1646 */ break; case 532: #line 6526 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[0].id); } #line 11485 "y.tab.c" /* yacc.c:1646 */ break; case 533: #line 6527 "parser.y" /* yacc.c:1646 */ { (yyval.id) = Char((yyvsp[0].dtype).val); } #line 11491 "y.tab.c" /* yacc.c:1646 */ break; case 534: #line 6528 "parser.y" /* yacc.c:1646 */ { (yyval.id) = Char((yyvsp[0].str)); } #line 11497 "y.tab.c" /* yacc.c:1646 */ break; case 535: #line 6531 "parser.y" /* yacc.c:1646 */ { (yyval.id) = (yyvsp[0].id); } #line 11503 "y.tab.c" /* yacc.c:1646 */ break; case 536: #line 6532 "parser.y" /* yacc.c:1646 */ { (yyval.id) = 0; } #line 11509 "y.tab.c" /* yacc.c:1646 */ break; case 537: #line 6535 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; if (!(yyval.str)) (yyval.str) = NewStringf("%s%s", (yyvsp[-1].str),(yyvsp[0].str)); Delete((yyvsp[0].str)); } #line 11519 "y.tab.c" /* yacc.c:1646 */ break; case 538: #line 6540 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s%s",(yyvsp[-1].str),(yyvsp[0].str)); Delete((yyvsp[0].str)); } #line 11528 "y.tab.c" /* yacc.c:1646 */ break; case 539: #line 6544 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewString((yyvsp[0].str)); } #line 11536 "y.tab.c" /* yacc.c:1646 */ break; case 540: #line 6547 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].str)); } #line 11544 "y.tab.c" /* yacc.c:1646 */ break; case 541: #line 6550 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("%s", (yyvsp[0].str)); } #line 11552 "y.tab.c" /* yacc.c:1646 */ break; case 542: #line 6553 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("%s%s", (yyvsp[-1].str), (yyvsp[0].id)); } #line 11560 "y.tab.c" /* yacc.c:1646 */ break; case 543: #line 6556 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].str)); } #line 11568 "y.tab.c" /* yacc.c:1646 */ break; case 544: #line 6561 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s%s",(yyvsp[-1].str),(yyvsp[0].str)); Delete((yyvsp[0].str)); } #line 11577 "y.tab.c" /* yacc.c:1646 */ break; case 545: #line 6565 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].str)); } #line 11585 "y.tab.c" /* yacc.c:1646 */ break; case 546: #line 6568 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].str)); } #line 11593 "y.tab.c" /* yacc.c:1646 */ break; case 547: #line 6575 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::~%s",(yyvsp[0].str)); } #line 11601 "y.tab.c" /* yacc.c:1646 */ break; case 548: #line 6581 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("%s", (yyvsp[0].id)); } #line 11609 "y.tab.c" /* yacc.c:1646 */ break; case 549: #line 6584 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("%s%s", (yyvsp[-1].id), (yyvsp[0].id)); } #line 11617 "y.tab.c" /* yacc.c:1646 */ break; case 550: #line 6589 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 11625 "y.tab.c" /* yacc.c:1646 */ break; case 551: #line 6592 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("%s%s", (yyvsp[-1].id), (yyvsp[0].id)); } #line 11633 "y.tab.c" /* yacc.c:1646 */ break; case 552: #line 6598 "parser.y" /* yacc.c:1646 */ { (yyval.str) = 0; if (!(yyval.str)) (yyval.str) = NewStringf("%s%s", (yyvsp[-1].id),(yyvsp[0].str)); Delete((yyvsp[0].str)); } #line 11643 "y.tab.c" /* yacc.c:1646 */ break; case 553: #line 6603 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s%s",(yyvsp[-1].id),(yyvsp[0].str)); Delete((yyvsp[0].str)); } #line 11652 "y.tab.c" /* yacc.c:1646 */ break; case 554: #line 6607 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewString((yyvsp[0].id)); } #line 11660 "y.tab.c" /* yacc.c:1646 */ break; case 555: #line 6610 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].id)); } #line 11668 "y.tab.c" /* yacc.c:1646 */ break; case 556: #line 6613 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewString((yyvsp[0].str)); } #line 11676 "y.tab.c" /* yacc.c:1646 */ break; case 557: #line 6616 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].str)); } #line 11684 "y.tab.c" /* yacc.c:1646 */ break; case 558: #line 6621 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s%s",(yyvsp[-1].id),(yyvsp[0].str)); Delete((yyvsp[0].str)); } #line 11693 "y.tab.c" /* yacc.c:1646 */ break; case 559: #line 6625 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].id)); } #line 11701 "y.tab.c" /* yacc.c:1646 */ break; case 560: #line 6628 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::%s",(yyvsp[0].str)); } #line 11709 "y.tab.c" /* yacc.c:1646 */ break; case 561: #line 6631 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("::~%s",(yyvsp[0].id)); } #line 11717 "y.tab.c" /* yacc.c:1646 */ break; case 562: #line 6637 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("%s%s", (yyvsp[-1].str), (yyvsp[0].id)); } #line 11725 "y.tab.c" /* yacc.c:1646 */ break; case 563: #line 6640 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewString((yyvsp[0].id));} #line 11731 "y.tab.c" /* yacc.c:1646 */ break; case 564: #line 6643 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewStringf("%s%s", (yyvsp[-1].str), (yyvsp[0].id)); } #line 11739 "y.tab.c" /* yacc.c:1646 */ break; case 565: #line 6651 "parser.y" /* yacc.c:1646 */ { (yyval.str) = NewString((yyvsp[0].id));} #line 11745 "y.tab.c" /* yacc.c:1646 */ break; case 566: #line 6654 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 11753 "y.tab.c" /* yacc.c:1646 */ break; case 567: #line 6657 "parser.y" /* yacc.c:1646 */ { skip_balanced('{','}'); (yyval.str) = NewString(scanner_ccode); } #line 11762 "y.tab.c" /* yacc.c:1646 */ break; case 568: #line 6661 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 11770 "y.tab.c" /* yacc.c:1646 */ break; case 569: #line 6666 "parser.y" /* yacc.c:1646 */ { Hash *n; (yyval.node) = NewHash(); n = (yyvsp[-1].node); while(n) { String *name, *value; name = Getattr(n,"name"); value = Getattr(n,"value"); if (!value) value = (String *) "1"; Setattr((yyval.node),name, value); n = nextSibling(n); } } #line 11788 "y.tab.c" /* yacc.c:1646 */ break; case 570: #line 6679 "parser.y" /* yacc.c:1646 */ { (yyval.node) = 0; } #line 11794 "y.tab.c" /* yacc.c:1646 */ break; case 571: #line 6683 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"name",(yyvsp[-2].id)); Setattr((yyval.node),"value",(yyvsp[0].str)); } #line 11804 "y.tab.c" /* yacc.c:1646 */ break; case 572: #line 6688 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"name",(yyvsp[-4].id)); Setattr((yyval.node),"value",(yyvsp[-2].str)); set_nextSibling((yyval.node),(yyvsp[0].node)); } #line 11815 "y.tab.c" /* yacc.c:1646 */ break; case 573: #line 6694 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"name",(yyvsp[0].id)); } #line 11824 "y.tab.c" /* yacc.c:1646 */ break; case 574: #line 6698 "parser.y" /* yacc.c:1646 */ { (yyval.node) = NewHash(); Setattr((yyval.node),"name",(yyvsp[-2].id)); set_nextSibling((yyval.node),(yyvsp[0].node)); } #line 11834 "y.tab.c" /* yacc.c:1646 */ break; case 575: #line 6703 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[0].node); Setattr((yyval.node),"name",(yyvsp[-2].id)); } #line 11843 "y.tab.c" /* yacc.c:1646 */ break; case 576: #line 6707 "parser.y" /* yacc.c:1646 */ { (yyval.node) = (yyvsp[-2].node); Setattr((yyval.node),"name",(yyvsp[-4].id)); set_nextSibling((yyval.node),(yyvsp[0].node)); } #line 11853 "y.tab.c" /* yacc.c:1646 */ break; case 577: #line 6714 "parser.y" /* yacc.c:1646 */ { (yyval.str) = (yyvsp[0].str); } #line 11861 "y.tab.c" /* yacc.c:1646 */ break; case 578: #line 6717 "parser.y" /* yacc.c:1646 */ { (yyval.str) = Char((yyvsp[0].dtype).val); } #line 11869 "y.tab.c" /* yacc.c:1646 */ break; #line 11873 "y.tab.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined yyoverflow || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif return yyresult; } #line 6724 "parser.y" /* yacc.c:1906 */ SwigType *Swig_cparse_type(String *s) { String *ns; ns = NewStringf("%s;",s); Seek(ns,0,SEEK_SET); scanner_file(ns); top = 0; scanner_next_token(PARSETYPE); yyparse(); /* Printf(stdout,"typeparse: '%s' ---> '%s'\n", s, top); */ return top; } Parm *Swig_cparse_parm(String *s) { String *ns; ns = NewStringf("%s;",s); Seek(ns,0,SEEK_SET); scanner_file(ns); top = 0; scanner_next_token(PARSEPARM); yyparse(); /* Printf(stdout,"typeparse: '%s' ---> '%s'\n", s, top); */ Delete(ns); return top; } ParmList *Swig_cparse_parms(String *s, Node *file_line_node) { String *ns; char *cs = Char(s); if (cs && cs[0] != '(') { ns = NewStringf("(%s);",s); } else { ns = NewStringf("%s;",s); } Setfile(ns, Getfile(file_line_node)); Setline(ns, Getline(file_line_node)); Seek(ns,0,SEEK_SET); scanner_file(ns); top = 0; scanner_next_token(PARSEPARMS); yyparse(); /* Printf(stdout,"typeparse: '%s' ---> '%s'\n", s, top); */ return top; } swig-3.0.12/Source/CParse/templ.c0000664000175000017500000006607413042756442016354 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * templ.c * * Expands a template into a specialized version. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" static int template_debug = 0; const char *baselists[3]; void SwigType_template_init() { baselists[0] = "baselist"; baselists[1] = "protectedbaselist"; baselists[2] = "privatebaselist"; } static void add_parms(ParmList *p, List *patchlist, List *typelist) { while (p) { SwigType *ty = Getattr(p, "type"); SwigType *val = Getattr(p, "value"); Append(typelist, ty); Append(typelist, val); Append(patchlist, val); p = nextSibling(p); } } void Swig_cparse_debug_templates(int x) { template_debug = x; } /* ----------------------------------------------------------------------------- * cparse_template_expand() * * Expands a template node into a specialized version. This is done by * patching typenames and other aspects of the node according to a list of * template parameters * ----------------------------------------------------------------------------- */ static int cparse_template_expand(Node *n, String *tname, String *rname, String *templateargs, List *patchlist, List *typelist, List *cpatchlist) { static int expanded = 0; int ret; String *nodeType; if (!n) return 0; nodeType = nodeType(n); if (Getattr(n, "error")) return 0; if (Equal(nodeType, "template")) { /* Change the node type back to normal */ if (!expanded) { expanded = 1; set_nodeType(n, Getattr(n, "templatetype")); ret = cparse_template_expand(n, tname, rname, templateargs, patchlist, typelist, cpatchlist); expanded = 0; return ret; } else { /* Called when template appears inside another template */ /* Member templates */ set_nodeType(n, Getattr(n, "templatetype")); ret = cparse_template_expand(n, tname, rname, templateargs, patchlist, typelist, cpatchlist); set_nodeType(n, "template"); return ret; } } else if (Equal(nodeType, "cdecl")) { /* A simple C declaration */ SwigType *t, *v, *d; String *code; t = Getattr(n, "type"); v = Getattr(n, "value"); d = Getattr(n, "decl"); code = Getattr(n, "code"); Append(typelist, t); Append(typelist, d); Append(patchlist, v); Append(cpatchlist, code); if (Getattr(n, "conversion_operator")) { Append(cpatchlist, Getattr(n, "name")); if (Getattr(n, "sym:name")) { Append(cpatchlist, Getattr(n, "sym:name")); } } if (checkAttribute(n, "storage", "friend")) { String *symname = Getattr(n, "sym:name"); if (symname) { String *stripped_name = SwigType_templateprefix(symname); Setattr(n, "sym:name", stripped_name); Delete(stripped_name); } Append(typelist, Getattr(n, "name")); } add_parms(Getattr(n, "parms"), cpatchlist, typelist); add_parms(Getattr(n, "throws"), cpatchlist, typelist); } else if (Equal(nodeType, "class")) { /* Patch base classes */ { int b = 0; for (b = 0; b < 3; ++b) { List *bases = Getattr(n, baselists[b]); if (bases) { int i; int ilen = Len(bases); for (i = 0; i < ilen; i++) { String *name = Copy(Getitem(bases, i)); Setitem(bases, i, name); Append(typelist, name); } } } } /* Patch children */ { Node *cn = firstChild(n); while (cn) { cparse_template_expand(cn, tname, rname, templateargs, patchlist, typelist, cpatchlist); cn = nextSibling(cn); } } } else if (Equal(nodeType, "constructor")) { String *name = Getattr(n, "name"); if (!(Getattr(n, "templatetype"))) { String *symname; String *stripped_name = SwigType_templateprefix(name); if (Strstr(tname, stripped_name)) { Replaceid(name, stripped_name, tname); } Delete(stripped_name); symname = Getattr(n, "sym:name"); if (symname) { stripped_name = SwigType_templateprefix(symname); if (Strstr(tname, stripped_name)) { Replaceid(symname, stripped_name, tname); } Delete(stripped_name); } if (strchr(Char(name), '<')) { Append(patchlist, Getattr(n, "name")); } else { Append(name, templateargs); } name = Getattr(n, "sym:name"); if (name) { if (strchr(Char(name), '<')) { Clear(name); Append(name, rname); } else { String *tmp = Copy(name); Replace(tmp, tname, rname, DOH_REPLACE_ANY); Clear(name); Append(name, tmp); Delete(tmp); } } /* Setattr(n,"sym:name",name); */ } Append(cpatchlist, Getattr(n, "code")); Append(typelist, Getattr(n, "decl")); add_parms(Getattr(n, "parms"), cpatchlist, typelist); add_parms(Getattr(n, "throws"), cpatchlist, typelist); } else if (Equal(nodeType, "destructor")) { String *name = Getattr(n, "name"); if (name) { if (strchr(Char(name), '<')) Append(patchlist, Getattr(n, "name")); else Append(name, templateargs); } name = Getattr(n, "sym:name"); if (name) { if (strchr(Char(name), '<')) { String *sn = Copy(tname); Setattr(n, "sym:name", sn); Delete(sn); } else { Replace(name, tname, rname, DOH_REPLACE_ANY); } } /* Setattr(n,"sym:name",name); */ Append(cpatchlist, Getattr(n, "code")); } else if (Equal(nodeType, "using")) { String *uname = Getattr(n, "uname"); if (uname && strchr(Char(uname), '<')) { Append(patchlist, uname); } if (Getattr(n, "namespace")) { /* Namespace link. This is nasty. Is other namespace defined? */ } } else { /* Look for obvious parameters */ Node *cn; Append(cpatchlist, Getattr(n, "code")); Append(typelist, Getattr(n, "type")); Append(typelist, Getattr(n, "decl")); add_parms(Getattr(n, "parms"), cpatchlist, typelist); add_parms(Getattr(n, "kwargs"), cpatchlist, typelist); add_parms(Getattr(n, "pattern"), cpatchlist, typelist); add_parms(Getattr(n, "throws"), cpatchlist, typelist); cn = firstChild(n); while (cn) { cparse_template_expand(cn, tname, rname, templateargs, patchlist, typelist, cpatchlist); cn = nextSibling(cn); } } return 0; } static String *partial_arg(String *s, String *p) { char *c; char *cp = Char(p); String *prefix; String *newarg; /* Find the prefix on the partial argument */ c = strchr(cp, '$'); if (!c) { return Copy(s); } prefix = NewStringWithSize(cp, (int)(c - cp)); newarg = Copy(s); Replace(newarg, prefix, "", DOH_REPLACE_ANY | DOH_REPLACE_FIRST); Delete(prefix); return newarg; } /* ----------------------------------------------------------------------------- * Swig_cparse_template_expand() * ----------------------------------------------------------------------------- */ int Swig_cparse_template_expand(Node *n, String *rname, ParmList *tparms, Symtab *tscope) { List *patchlist, *cpatchlist, *typelist; String *templateargs; String *tname; String *iname; String *tbase; patchlist = NewList(); cpatchlist = NewList(); typelist = NewList(); { String *tmp = NewStringEmpty(); if (tparms) { SwigType_add_template(tmp, tparms); } templateargs = Copy(tmp); Delete(tmp); } tname = Copy(Getattr(n, "name")); tbase = Swig_scopename_last(tname); /* Look for partial specialization matching */ if (Getattr(n, "partialargs")) { Parm *p, *tp; ParmList *ptargs = SwigType_function_parms(Getattr(n, "partialargs"), n); p = ptargs; tp = tparms; while (p && tp) { SwigType *ptype; SwigType *tptype; SwigType *partial_type; ptype = Getattr(p, "type"); tptype = Getattr(tp, "type"); if (ptype && tptype) { partial_type = partial_arg(tptype, ptype); /* Printf(stdout,"partial '%s' '%s' ---> '%s'\n", tptype, ptype, partial_type); */ Setattr(tp, "type", partial_type); Delete(partial_type); } p = nextSibling(p); tp = nextSibling(tp); } assert(ParmList_len(ptargs) == ParmList_len(tparms)); Delete(ptargs); } /* Parm *p = tparms; while (p) { Printf(stdout, "tparm: '%s' '%s' '%s'\n", Getattr(p, "name"), Getattr(p, "type"), Getattr(p, "value")); p = nextSibling(p); } */ /* Printf(stdout,"targs = '%s'\n", templateargs); Printf(stdout,"rname = '%s'\n", rname); Printf(stdout,"tname = '%s'\n", tname); */ cparse_template_expand(n, tname, rname, templateargs, patchlist, typelist, cpatchlist); /* Set the name */ { String *name = Getattr(n, "name"); if (name) { Append(name, templateargs); } iname = name; } /* Patch all of the types */ { Parm *tp = Getattr(n, "templateparms"); Parm *p = tparms; /* Printf(stdout,"%s\n", ParmList_str_defaultargs(tp)); */ if (tp) { Symtab *tsdecl = Getattr(n, "sym:symtab"); while (p && tp) { String *name, *value, *valuestr, *tmp, *tmpr; int sz, i; String *dvalue = 0; String *qvalue = 0; name = Getattr(tp, "name"); value = Getattr(p, "value"); if (name) { if (!value) value = Getattr(p, "type"); qvalue = Swig_symbol_typedef_reduce(value, tsdecl); dvalue = Swig_symbol_type_qualify(qvalue, tsdecl); if (SwigType_istemplate(dvalue)) { String *ty = Swig_symbol_template_deftype(dvalue, tscope); Delete(dvalue); dvalue = ty; } assert(dvalue); valuestr = SwigType_str(dvalue, 0); /* Need to patch default arguments */ { Parm *rp = nextSibling(p); while (rp) { String *rvalue = Getattr(rp, "value"); if (rvalue) { Replace(rvalue, name, dvalue, DOH_REPLACE_ID); } rp = nextSibling(rp); } } sz = Len(patchlist); for (i = 0; i < sz; i++) { String *s = Getitem(patchlist, i); Replace(s, name, dvalue, DOH_REPLACE_ID); } sz = Len(typelist); for (i = 0; i < sz; i++) { String *s = Getitem(typelist, i); /* Replace(s,name,value, DOH_REPLACE_ID); */ /* Printf(stdout,"name = '%s', value = '%s', tbase = '%s', iname='%s' s = '%s' --> ", name, dvalue, tbase, iname, s); */ SwigType_typename_replace(s, name, dvalue); SwigType_typename_replace(s, tbase, iname); /* Printf(stdout,"'%s'\n", s); */ } tmp = NewStringf("#%s", name); tmpr = NewStringf("\"%s\"", valuestr); sz = Len(cpatchlist); for (i = 0; i < sz; i++) { String *s = Getitem(cpatchlist, i); Replace(s, tmp, tmpr, DOH_REPLACE_ID); Replace(s, name, valuestr, DOH_REPLACE_ID); } Delete(tmp); Delete(tmpr); Delete(valuestr); Delete(dvalue); Delete(qvalue); } p = nextSibling(p); tp = nextSibling(tp); if (!p) p = tp; } } else { /* No template parameters at all. This could be a specialization */ int i, sz; sz = Len(typelist); for (i = 0; i < sz; i++) { String *s = Getitem(typelist, i); SwigType_typename_replace(s, tbase, iname); } } } /* Patch bases */ { List *bases = Getattr(n, "baselist"); if (bases) { Iterator b; for (b = First(bases); b.item; b = Next(b)) { String *qn = Swig_symbol_type_qualify(b.item, tscope); Clear(b.item); Append(b.item, qn); Delete(qn); } } } Delete(patchlist); Delete(cpatchlist); Delete(typelist); Delete(tbase); Delete(tname); Delete(templateargs); /* set_nodeType(n,"template"); */ return 0; } typedef enum { ExactNoMatch = -2, PartiallySpecializedNoMatch = -1, PartiallySpecializedMatch = 1, ExactMatch = 2 } EMatch; /* ----------------------------------------------------------------------------- * does_parm_match() * * Template argument deduction - check if a template type matches a partially specialized * template parameter type. Typedef reduce 'partial_parm_type' to see if it matches 'type'. * * type - template parameter type to match against * partial_parm_type - partially specialized template type - a possible match * partial_parm_type_base - base type of partial_parm_type * tscope - template scope * specialization_priority - (output) contains a value indicating how good the match is * (higher is better) only set if return is set to PartiallySpecializedMatch or ExactMatch. * ----------------------------------------------------------------------------- */ static EMatch does_parm_match(SwigType *type, SwigType *partial_parm_type, const char *partial_parm_type_base, Symtab *tscope, int *specialization_priority) { static const int EXACT_MATCH_PRIORITY = 99999; /* a number bigger than the length of any conceivable type */ int matches; int substitutions; EMatch match; SwigType *ty = Swig_symbol_typedef_reduce(type, tscope); String *base = SwigType_base(ty); SwigType *t = Copy(partial_parm_type); substitutions = Replaceid(t, partial_parm_type_base, base); /* eg: Replaceid("p.$1", "$1", "int") returns t="p.int" */ matches = Equal(ty, t); *specialization_priority = -1; if (substitutions == 1) { /* we have a non-explicit specialized parameter (in partial_parm_type) because a substitution for $1, $2... etc has taken place */ SwigType *tt = Copy(partial_parm_type); int len; /* check for match to partial specialization type, for example, all of the following could match the type in the %template: template struct XX {}; template struct XX {}; // r.$1 template struct XX {}; // r.q(const).$1 template struct XX {}; // r.q(const).p.$1 %template(XXX) XX; // r.q(const).p.int where type="r.q(const).p.int" will match either of tt="r.", tt="r.q(const)" tt="r.q(const).p" */ Replaceid(tt, partial_parm_type_base, ""); /* remove the $1, $2 etc, eg tt="p.$1" => "p." */ len = Len(tt); if (Strncmp(tt, ty, len) == 0) { match = PartiallySpecializedMatch; *specialization_priority = len; } else { match = PartiallySpecializedNoMatch; } Delete(tt); } else { match = matches ? ExactMatch : ExactNoMatch; if (matches) *specialization_priority = EXACT_MATCH_PRIORITY; /* exact matches always take precedence */ } /* Printf(stdout, " does_parm_match %2d %5d [%s] [%s]\n", match, *specialization_priority, type, partial_parm_type); */ Delete(t); Delete(base); Delete(ty); return match; } /* ----------------------------------------------------------------------------- * template_locate() * * Search for a template that matches name with given parameters. * ----------------------------------------------------------------------------- */ static Node *template_locate(String *name, Parm *tparms, Symtab *tscope) { Node *n = 0; String *tname = 0; Node *templ; Symtab *primary_scope = 0; List *possiblepartials = 0; Parm *p; Parm *parms = 0; Parm *targs; ParmList *expandedparms; int *priorities_matrix = 0; int max_possible_partials = 0; int posslen = 0; /* Search for primary (unspecialized) template */ templ = Swig_symbol_clookup(name, 0); if (template_debug) { tname = Copy(name); SwigType_add_template(tname, tparms); Printf(stdout, "\n"); Swig_diagnostic(cparse_file, cparse_line, "template_debug: Searching for match to: '%s'\n", tname); Delete(tname); tname = 0; } if (templ) { tname = Copy(name); parms = CopyParmList(tparms); /* All template specializations must be in the primary template's scope, store the symbol table for this scope for specialization lookups */ primary_scope = Getattr(templ, "sym:symtab"); /* Add default values from primary template */ targs = Getattr(templ, "templateparms"); expandedparms = Swig_symbol_template_defargs(parms, targs, tscope, primary_scope); /* reduce the typedef */ p = expandedparms; while (p) { SwigType *ty = Getattr(p, "type"); if (ty) { SwigType *nt = Swig_symbol_type_qualify(ty, tscope); Setattr(p, "type", nt); Delete(nt); } p = nextSibling(p); } SwigType_add_template(tname, expandedparms); /* Search for an explicit (exact) specialization. Example: template<> class name { ... } */ { if (template_debug) { Printf(stdout, " searching for : '%s' (explicit specialization)\n", tname); } n = Swig_symbol_clookup_local(tname, primary_scope); if (!n) { SwigType *rname = Swig_symbol_typedef_reduce(tname, tscope); if (!Equal(rname, tname)) { if (template_debug) { Printf(stdout, " searching for : '%s' (explicit specialization with typedef reduction)\n", rname); } n = Swig_symbol_clookup_local(rname, primary_scope); } Delete(rname); } if (n) { Node *tn; String *nodeType = nodeType(n); if (Equal(nodeType, "template")) { if (template_debug) { Printf(stdout, " explicit specialization found: '%s'\n", Getattr(n, "name")); } goto success; } tn = Getattr(n, "template"); if (tn) { if (template_debug) { Printf(stdout, " previous instantiation found: '%s'\n", Getattr(n, "name")); } n = tn; goto success; /* Previously wrapped by a template instantiation */ } Swig_error(cparse_file, cparse_line, "'%s' is not defined as a template. (%s)\n", name, nodeType(n)); Delete(tname); Delete(parms); return 0; /* Found a match, but it's not a template of any kind. */ } } /* Search for partial specializations. * Example: template class name { ... } * There are 3 types of template arguments: * (1) Template type arguments * (2) Template non type arguments * (3) Template template arguments * only (1) is really supported for partial specializations */ /* Rank each template parameter against the desired template parameters then build a matrix of best matches */ possiblepartials = NewList(); { char tmp[32]; List *partials; partials = Getattr(templ, "partials"); /* note that these partial specializations do not include explicit specializations */ if (partials) { Iterator pi; int parms_len = ParmList_len(parms); int *priorities_row; max_possible_partials = Len(partials); priorities_matrix = (int *)malloc(sizeof(int) * max_possible_partials * parms_len); /* slightly wasteful allocation for max possible matches */ priorities_row = priorities_matrix; for (pi = First(partials); pi.item; pi = Next(pi)) { Parm *p = parms; int all_parameters_match = 1; int i = 1; Parm *partialparms = Getattr(pi.item, "partialparms"); Parm *pp = partialparms; String *templcsymname = Getattr(pi.item, "templcsymname"); if (template_debug) { Printf(stdout, " checking match: '%s' (partial specialization)\n", templcsymname); } if (ParmList_len(partialparms) == parms_len) { while (p && pp) { SwigType *t; sprintf(tmp, "$%d", i); t = Getattr(p, "type"); if (!t) t = Getattr(p, "value"); if (t) { EMatch match = does_parm_match(t, Getattr(pp, "type"), tmp, tscope, priorities_row + i - 1); if (match < (int)PartiallySpecializedMatch) { all_parameters_match = 0; break; } } i++; p = nextSibling(p); pp = nextSibling(pp); } if (all_parameters_match) { Append(possiblepartials, pi.item); priorities_row += parms_len; } } } } } posslen = Len(possiblepartials); if (template_debug) { int i; if (posslen == 0) Printf(stdout, " matched partials: NONE\n"); else if (posslen == 1) Printf(stdout, " chosen partial: '%s'\n", Getattr(Getitem(possiblepartials, 0), "templcsymname")); else { Printf(stdout, " possibly matched partials:\n"); for (i = 0; i < posslen; i++) { Printf(stdout, " '%s'\n", Getattr(Getitem(possiblepartials, i), "templcsymname")); } } } if (posslen > 1) { /* Now go through all the possibly matched partial specialization templates and look for a non-ambiguous match. * Exact matches rank the highest and deduced parameters are ranked by how specialized they are, eg looking for * a match to const int *, the following rank (highest to lowest): * const int * (exact match) * const T * * T * * T * * An ambiguous example when attempting to match as either specialization could match: %template() X; * template X class {}; // primary template * template X class {}; // specialization (1) * template X class {}; // specialization (2) */ if (template_debug) { int row, col; int parms_len = ParmList_len(parms); Printf(stdout, " parameter priorities matrix (%d parms):\n", parms_len); for (row = 0; row < posslen; row++) { int *priorities_row = priorities_matrix + row*parms_len; Printf(stdout, " "); for (col = 0; col < parms_len; col++) { Printf(stdout, "%5d ", priorities_row[col]); } Printf(stdout, "\n"); } } { int row, col; int parms_len = ParmList_len(parms); /* Printf(stdout, " parameter priorities inverse matrix (%d parms):\n", parms_len); */ for (col = 0; col < parms_len; col++) { int *priorities_col = priorities_matrix + col; int maxpriority = -1; /* Printf(stdout, "max_possible_partials: %d col:%d\n", max_possible_partials, col); Printf(stdout, " "); */ /* determine the highest rank for this nth parameter */ for (row = 0; row < posslen; row++) { int *element_ptr = priorities_col + row*parms_len; int priority = *element_ptr; if (priority > maxpriority) maxpriority = priority; /* Printf(stdout, "%5d ", priority); */ } /* Printf(stdout, "\n"); */ /* flag all the parameters which equal the highest rank */ for (row = 0; row < posslen; row++) { int *element_ptr = priorities_col + row*parms_len; int priority = *element_ptr; *element_ptr = (priority >= maxpriority) ? 1 : 0; } } } { int row, col; int parms_len = ParmList_len(parms); Iterator pi = First(possiblepartials); Node *chosenpartials = NewList(); if (template_debug) Printf(stdout, " priority flags matrix:\n"); for (row = 0; row < posslen; row++) { int *priorities_row = priorities_matrix + row*parms_len; int highest_count = 0; /* count of highest priority parameters */ for (col = 0; col < parms_len; col++) { highest_count += priorities_row[col]; } if (template_debug) { Printf(stdout, " "); for (col = 0; col < parms_len; col++) { Printf(stdout, "%5d ", priorities_row[col]); } Printf(stdout, "\n"); } if (highest_count == parms_len) { Append(chosenpartials, pi.item); } pi = Next(pi); } if (Len(chosenpartials) > 0) { /* one or more best match found */ Delete(possiblepartials); possiblepartials = chosenpartials; posslen = Len(possiblepartials); } else { /* no best match found */ Delete(chosenpartials); } } } if (posslen > 0) { String *s = Getattr(Getitem(possiblepartials, 0), "templcsymname"); n = Swig_symbol_clookup_local(s, primary_scope); if (posslen > 1) { int i; if (n) { Swig_warning(WARN_PARSE_TEMPLATE_AMBIG, cparse_file, cparse_line, "Instantiation of template '%s' is ambiguous,\n", SwigType_namestr(tname)); Swig_warning(WARN_PARSE_TEMPLATE_AMBIG, Getfile(n), Getline(n), " instantiation '%s' used,\n", SwigType_namestr(Getattr(n, "name"))); } for (i = 1; i < posslen; i++) { String *templcsymname = Getattr(Getitem(possiblepartials, i), "templcsymname"); Node *ignored_node = Swig_symbol_clookup_local(templcsymname, primary_scope); assert(ignored_node); Swig_warning(WARN_PARSE_TEMPLATE_AMBIG, Getfile(ignored_node), Getline(ignored_node), " instantiation '%s' ignored.\n", SwigType_namestr(Getattr(ignored_node, "name"))); } } } if (!n) { if (template_debug) { Printf(stdout, " chosen primary template: '%s'\n", Getattr(templ, "name")); } n = templ; } } else { if (template_debug) { Printf(stdout, " primary template not found\n"); } /* Give up if primary (unspecialized) template not found as specializations will only exist if there is a primary template */ n = 0; } if (!n) { Swig_error(cparse_file, cparse_line, "Template '%s' undefined.\n", name); } else if (n) { String *nodeType = nodeType(n); if (!Equal(nodeType, "template")) { Swig_error(cparse_file, cparse_line, "'%s' is not defined as a template. (%s)\n", name, nodeType); n = 0; } } success: Delete(tname); Delete(possiblepartials); if ((template_debug) && (n)) { /* Printf(stdout, "Node: %p\n", n); Swig_print_node(n); */ Printf(stdout, " chosen template:'%s'\n", Getattr(n, "name")); } Delete(parms); free(priorities_matrix); return n; } /* ----------------------------------------------------------------------------- * Swig_cparse_template_locate() * * Search for a template that matches name with given parameters. * For templated classes finds the specialized template should there be one. * For templated functions finds the unspecialized template even if a specialized * template exists. * ----------------------------------------------------------------------------- */ Node *Swig_cparse_template_locate(String *name, Parm *tparms, Symtab *tscope) { Node *n = template_locate(name, tparms, tscope); /* this function does what we want for templated classes */ if (n) { String *nodeType = nodeType(n); int isclass = 0; assert(Equal(nodeType, "template")); isclass = (Equal(Getattr(n, "templatetype"), "class")); if (!isclass) { /* If not a templated class we must have a templated function. The template found is not necessarily the one we want when dealing with templated functions. We don't want any specialized templated functions as they won't have the default parameters. Let's look for the unspecialized template. Also make sure the number of template parameters is correct as it is possible to overload a templated function with different numbers of template parameters. */ if (template_debug) { Printf(stdout, " Not a templated class, seeking most appropriate templated function\n"); } n = Swig_symbol_clookup_local(name, 0); while (n) { Parm *tparmsfound = Getattr(n, "templateparms"); if (ParmList_len(tparms) == ParmList_len(tparmsfound)) { /* successful match */ break; } /* repeat until we find a match with correct number of templated parameters */ n = Getattr(n, "sym:nextSibling"); } if (!n) { Swig_error(cparse_file, cparse_line, "Template '%s' undefined.\n", name); } if ((template_debug) && (n)) { Printf(stdout, "Templated function found: %p\n", n); Swig_print_node(n); } } } return n; } swig-3.0.12/Source/CParse/util.c0000664000175000017500000000717613042756442016206 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * util.c * * Parsing utilities. * ----------------------------------------------------------------------------- */ #include "swig.h" #include "cparse.h" /* ----------------------------------------------------------------------------- * Swig_cparse_replace_descriptor() * * Replaces type descriptor string $descriptor() with the SWIG type descriptor * string. * ----------------------------------------------------------------------------- */ void Swig_cparse_replace_descriptor(String *s) { char tmp[512]; String *arg = 0; SwigType *t; char *c = 0; while ((c = strstr(Char(s), "$descriptor("))) { char *d = tmp; int level = 0; while (*c) { if (*c == '(') level++; if (*c == ')') { level--; if (level == 0) { break; } } *d = *c; d++; c++; } *d = 0; arg = NewString(tmp + 12); t = Swig_cparse_type(arg); Delete(arg); arg = 0; if (t) { String *mangle; String *descriptor; mangle = SwigType_manglestr(t); descriptor = NewStringf("SWIGTYPE%s", mangle); SwigType_remember(t); *d = ')'; d++; *d = 0; Replace(s, tmp, descriptor, DOH_REPLACE_ANY); Delete(mangle); Delete(descriptor); Delete(t); } else { Swig_error(Getfile(s), Getline(s), "Bad $descriptor() macro.\n"); break; } } } /* ----------------------------------------------------------------------------- * Swig_cparse_smartptr() * * Parse the type in smartptr feature and convert into a SwigType. * Error out if the parsing fails as this is like a parser syntax error. * ----------------------------------------------------------------------------- */ SwigType *Swig_cparse_smartptr(Node *n) { SwigType *smart = 0; String *smartptr = Getattr(n, "feature:smartptr"); if (smartptr) { SwigType *cpt = Swig_cparse_type(smartptr); if (cpt) { smart = SwigType_typedef_resolve_all(cpt); Delete(cpt); } else { Swig_error(Getfile(n), Getline(n), "Invalid type (%s) in 'smartptr' feature for class %s.\n", smartptr, SwigType_namestr(Getattr(n, "name"))); } } return smart; } /* ----------------------------------------------------------------------------- * cparse_normalize_void() * * This function is used to replace arguments of the form (void) with empty * arguments in C++ * ----------------------------------------------------------------------------- */ void cparse_normalize_void(Node *n) { String *decl = Getattr(n, "decl"); Parm *parms = Getattr(n, "parms"); if (SwigType_isfunction(decl)) { if ((ParmList_len(parms) == 1) && (SwigType_type(Getattr(parms, "type")) == T_VOID)) { Replaceall(decl, "f(void).", "f()."); Delattr(n, "parms"); } } } /* ----------------------------------------------------------------------------- * new_node() * * Create an empty parse node, setting file and line number information * ----------------------------------------------------------------------------- */ Node *new_node(const_String_or_char_ptr tag) { Node *n = NewHash(); set_nodeType(n,tag); Setfile(n,cparse_file); Setline(n,cparse_line); return n; } swig-3.0.12/Source/CParse/parser.h0000664000175000017500000002045613042756671016532 0ustar williamwilliam/* A Bison parser, made by GNU Bison 3.0.4. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ #ifndef YY_YY_Y_TAB_H_INCLUDED # define YY_YY_Y_TAB_H_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { ID = 258, HBLOCK = 259, POUND = 260, STRING = 261, WSTRING = 262, INCLUDE = 263, IMPORT = 264, INSERT = 265, CHARCONST = 266, WCHARCONST = 267, NUM_INT = 268, NUM_FLOAT = 269, NUM_UNSIGNED = 270, NUM_LONG = 271, NUM_ULONG = 272, NUM_LONGLONG = 273, NUM_ULONGLONG = 274, NUM_BOOL = 275, TYPEDEF = 276, TYPE_INT = 277, TYPE_UNSIGNED = 278, TYPE_SHORT = 279, TYPE_LONG = 280, TYPE_FLOAT = 281, TYPE_DOUBLE = 282, TYPE_CHAR = 283, TYPE_WCHAR = 284, TYPE_VOID = 285, TYPE_SIGNED = 286, TYPE_BOOL = 287, TYPE_COMPLEX = 288, TYPE_TYPEDEF = 289, TYPE_RAW = 290, TYPE_NON_ISO_INT8 = 291, TYPE_NON_ISO_INT16 = 292, TYPE_NON_ISO_INT32 = 293, TYPE_NON_ISO_INT64 = 294, LPAREN = 295, RPAREN = 296, COMMA = 297, SEMI = 298, EXTERN = 299, INIT = 300, LBRACE = 301, RBRACE = 302, PERIOD = 303, CONST_QUAL = 304, VOLATILE = 305, REGISTER = 306, STRUCT = 307, UNION = 308, EQUAL = 309, SIZEOF = 310, MODULE = 311, LBRACKET = 312, RBRACKET = 313, BEGINFILE = 314, ENDOFFILE = 315, ILLEGAL = 316, CONSTANT = 317, NAME = 318, RENAME = 319, NAMEWARN = 320, EXTEND = 321, PRAGMA = 322, FEATURE = 323, VARARGS = 324, ENUM = 325, CLASS = 326, TYPENAME = 327, PRIVATE = 328, PUBLIC = 329, PROTECTED = 330, COLON = 331, STATIC = 332, VIRTUAL = 333, FRIEND = 334, THROW = 335, CATCH = 336, EXPLICIT = 337, STATIC_ASSERT = 338, CONSTEXPR = 339, THREAD_LOCAL = 340, DECLTYPE = 341, AUTO = 342, NOEXCEPT = 343, OVERRIDE = 344, FINAL = 345, USING = 346, NAMESPACE = 347, NATIVE = 348, INLINE = 349, TYPEMAP = 350, EXCEPT = 351, ECHO = 352, APPLY = 353, CLEAR = 354, SWIGTEMPLATE = 355, FRAGMENT = 356, WARN = 357, LESSTHAN = 358, GREATERTHAN = 359, DELETE_KW = 360, DEFAULT = 361, LESSTHANOREQUALTO = 362, GREATERTHANOREQUALTO = 363, EQUALTO = 364, NOTEQUALTO = 365, ARROW = 366, QUESTIONMARK = 367, TYPES = 368, PARMS = 369, NONID = 370, DSTAR = 371, DCNOT = 372, TEMPLATE = 373, OPERATOR = 374, CONVERSIONOPERATOR = 375, PARSETYPE = 376, PARSEPARM = 377, PARSEPARMS = 378, CAST = 379, LOR = 380, LAND = 381, OR = 382, XOR = 383, AND = 384, LSHIFT = 385, RSHIFT = 386, PLUS = 387, MINUS = 388, STAR = 389, SLASH = 390, MODULO = 391, UMINUS = 392, NOT = 393, LNOT = 394, DCOLON = 395 }; #endif /* Tokens. */ #define ID 258 #define HBLOCK 259 #define POUND 260 #define STRING 261 #define WSTRING 262 #define INCLUDE 263 #define IMPORT 264 #define INSERT 265 #define CHARCONST 266 #define WCHARCONST 267 #define NUM_INT 268 #define NUM_FLOAT 269 #define NUM_UNSIGNED 270 #define NUM_LONG 271 #define NUM_ULONG 272 #define NUM_LONGLONG 273 #define NUM_ULONGLONG 274 #define NUM_BOOL 275 #define TYPEDEF 276 #define TYPE_INT 277 #define TYPE_UNSIGNED 278 #define TYPE_SHORT 279 #define TYPE_LONG 280 #define TYPE_FLOAT 281 #define TYPE_DOUBLE 282 #define TYPE_CHAR 283 #define TYPE_WCHAR 284 #define TYPE_VOID 285 #define TYPE_SIGNED 286 #define TYPE_BOOL 287 #define TYPE_COMPLEX 288 #define TYPE_TYPEDEF 289 #define TYPE_RAW 290 #define TYPE_NON_ISO_INT8 291 #define TYPE_NON_ISO_INT16 292 #define TYPE_NON_ISO_INT32 293 #define TYPE_NON_ISO_INT64 294 #define LPAREN 295 #define RPAREN 296 #define COMMA 297 #define SEMI 298 #define EXTERN 299 #define INIT 300 #define LBRACE 301 #define RBRACE 302 #define PERIOD 303 #define CONST_QUAL 304 #define VOLATILE 305 #define REGISTER 306 #define STRUCT 307 #define UNION 308 #define EQUAL 309 #define SIZEOF 310 #define MODULE 311 #define LBRACKET 312 #define RBRACKET 313 #define BEGINFILE 314 #define ENDOFFILE 315 #define ILLEGAL 316 #define CONSTANT 317 #define NAME 318 #define RENAME 319 #define NAMEWARN 320 #define EXTEND 321 #define PRAGMA 322 #define FEATURE 323 #define VARARGS 324 #define ENUM 325 #define CLASS 326 #define TYPENAME 327 #define PRIVATE 328 #define PUBLIC 329 #define PROTECTED 330 #define COLON 331 #define STATIC 332 #define VIRTUAL 333 #define FRIEND 334 #define THROW 335 #define CATCH 336 #define EXPLICIT 337 #define STATIC_ASSERT 338 #define CONSTEXPR 339 #define THREAD_LOCAL 340 #define DECLTYPE 341 #define AUTO 342 #define NOEXCEPT 343 #define OVERRIDE 344 #define FINAL 345 #define USING 346 #define NAMESPACE 347 #define NATIVE 348 #define INLINE 349 #define TYPEMAP 350 #define EXCEPT 351 #define ECHO 352 #define APPLY 353 #define CLEAR 354 #define SWIGTEMPLATE 355 #define FRAGMENT 356 #define WARN 357 #define LESSTHAN 358 #define GREATERTHAN 359 #define DELETE_KW 360 #define DEFAULT 361 #define LESSTHANOREQUALTO 362 #define GREATERTHANOREQUALTO 363 #define EQUALTO 364 #define NOTEQUALTO 365 #define ARROW 366 #define QUESTIONMARK 367 #define TYPES 368 #define PARMS 369 #define NONID 370 #define DSTAR 371 #define DCNOT 372 #define TEMPLATE 373 #define OPERATOR 374 #define CONVERSIONOPERATOR 375 #define PARSETYPE 376 #define PARSEPARM 377 #define PARSEPARMS 378 #define CAST 379 #define LOR 380 #define LAND 381 #define OR 382 #define XOR 383 #define AND 384 #define LSHIFT 385 #define RSHIFT 386 #define PLUS 387 #define MINUS 388 #define STAR 389 #define SLASH 390 #define MODULO 391 #define UMINUS 392 #define NOT 393 #define LNOT 394 #define DCOLON 395 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED union YYSTYPE { #line 1356 "parser.y" /* yacc.c:1909 */ const char *id; List *bases; struct Define { String *val; String *rawval; int type; String *qualifier; String *bitfield; Parm *throws; String *throwf; String *nexcept; } dtype; struct { const char *type; String *filename; int line; } loc; struct { char *id; SwigType *type; String *defarg; ParmList *parms; short have_parms; ParmList *throws; String *throwf; String *nexcept; } decl; Parm *tparms; struct { String *method; Hash *kwargs; } tmap; struct { String *type; String *us; } ptype; SwigType *type; String *str; Parm *p; ParmList *pl; int intvalue; Node *node; #line 379 "y.tab.h" /* yacc.c:1909 */ }; typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif extern YYSTYPE yylval; int yyparse (void); #endif /* !YY_YY_Y_TAB_H_INCLUDED */ swig-3.0.12/Source/README0000664000175000017500000000136613042756442014563 0ustar williamwilliamSWIG Source directory Source/DOH - A core set of basic datatypes including strings, lists, hashes, and files. Used extensively by the rest of SWIG. Source/Swig - Swig core. Type-system, utility functions. Source/Preprocessor - SWIG C Preprocessor Source/CParse - SWIG C Parser (still messy) Source/Modules - Language modules. Source/Include - Include files. Historic directories which may be in CVS, but have been removed: Source/Modules1.1 - Old SWIG-1.1 modules. Empty. Source/LParse - Experimental parser. Officially dead as CParse is more capable. Source/SWIG1.1 - Old SWIG1.1 core. Completely empty now. swig-3.0.12/Source/DOH/0000775000175000017500000000000013042756442014307 5ustar williamwilliamswig-3.0.12/Source/DOH/hash.c0000664000175000017500000003343513042756442015406 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * hash.c * * Implements a simple hash table object. * ----------------------------------------------------------------------------- */ #include "dohint.h" extern DohObjInfo DohHashType; /* Hash node */ typedef struct HashNode { DOH *key; DOH *object; struct HashNode *next; } HashNode; /* Hash object */ typedef struct Hash { DOH *file; int line; HashNode **hashtable; int hashsize; int nitems; } Hash; /* Key interning structure */ typedef struct KeyValue { char *cstr; DOH *sstr; struct KeyValue *left; struct KeyValue *right; } KeyValue; static KeyValue *root = 0; static int max_expand = 1; /* Find or create a key in the interned key table */ static DOH *find_key(DOH *doh_c) { char *c = (char *) doh_c; KeyValue *r, *s; int d = 0; /* OK, sure, we use a binary tree for maintaining interned symbols. Then we use their hash values for accessing secondary hash tables. */ r = root; s = 0; while (r) { s = r; d = strcmp(r->cstr, c); if (d == 0) return r->sstr; if (d < 0) r = r->left; else r = r->right; } /* fprintf(stderr,"Interning '%s'\n", c); */ r = (KeyValue *) DohMalloc(sizeof(KeyValue)); r->cstr = (char *) DohMalloc(strlen(c) + 1); strcpy(r->cstr, c); r->sstr = NewString(c); DohIntern(r->sstr); r->left = 0; r->right = 0; if (!s) { root = r; } else { if (d < 0) s->left = r; else s->right = r; } return r->sstr; } #define HASH_INIT_SIZE 7 /* Create a new hash node */ static HashNode *NewNode(DOH *k, void *obj) { HashNode *hn = (HashNode *) DohMalloc(sizeof(HashNode)); hn->key = k; Incref(hn->key); hn->object = obj; Incref(obj); hn->next = 0; return hn; } /* Delete a hash node */ static void DelNode(HashNode *hn) { Delete(hn->key); Delete(hn->object); DohFree(hn); } /* ----------------------------------------------------------------------------- * DelHash() * * Delete a hash table. * ----------------------------------------------------------------------------- */ static void DelHash(DOH *ho) { Hash *h = (Hash *) ObjData(ho); HashNode *n, *next; int i; for (i = 0; i < h->hashsize; i++) { n = h->hashtable[i]; while (n) { next = n->next; DelNode(n); n = next; } } DohFree(h->hashtable); h->hashtable = 0; h->hashsize = 0; DohFree(h); } /* ----------------------------------------------------------------------------- * Hash_clear() * * Clear all of the entries in the hash table. * ----------------------------------------------------------------------------- */ static void Hash_clear(DOH *ho) { Hash *h = (Hash *) ObjData(ho); HashNode *n, *next; int i; for (i = 0; i < h->hashsize; i++) { n = h->hashtable[i]; while (n) { next = n->next; DelNode(n); n = next; } h->hashtable[i] = 0; } h->nitems = 0; } /* resize the hash table */ static void resize(Hash *h) { HashNode *n, *next, **table; int oldsize, newsize; int i, p, hv; if (h->nitems < 2 * h->hashsize) return; /* Too big. We have to rescale everything now */ oldsize = h->hashsize; /* Calculate a new size */ newsize = 2 * oldsize + 1; p = 3; while (p < (newsize >> 1)) { if (((newsize / p) * p) == newsize) { newsize += 2; p = 3; continue; } p = p + 2; } table = (HashNode **) DohMalloc(newsize * sizeof(HashNode *)); for (i = 0; i < newsize; i++) { table[i] = 0; } /* Walk down the old set of nodes and re-place */ h->hashsize = newsize; for (i = 0; i < oldsize; i++) { n = h->hashtable[i]; while (n) { hv = Hashval(n->key) % newsize; next = n->next; n->next = table[hv]; table[hv] = n; n = next; } } DohFree(h->hashtable); h->hashtable = table; } /* ----------------------------------------------------------------------------- * Hash_setattr() * * Set an attribute in the hash table. Deletes the existing entry if it already * exists. * ----------------------------------------------------------------------------- */ static int Hash_setattr(DOH *ho, DOH *k, DOH *obj) { int hv; HashNode *n, *prev; Hash *h = (Hash *) ObjData(ho); if (!obj) { return DohDelattr(ho, k); } if (!DohCheck(k)) k = find_key(k); if (!DohCheck(obj)) { obj = NewString((char *) obj); Decref(obj); } hv = (Hashval(k)) % h->hashsize; n = h->hashtable[hv]; prev = 0; while (n) { if (Cmp(n->key, k) == 0) { /* Node already exists. Just replace its contents */ if (n->object == obj) { /* Whoa. Same object. Do nothing */ return 1; } Delete(n->object); n->object = obj; Incref(obj); return 1; /* Return 1 to indicate a replacement */ } else { prev = n; n = n->next; } } /* Add this to the table */ n = NewNode(k, obj); if (prev) prev->next = n; else h->hashtable[hv] = n; h->nitems++; resize(h); return 0; } /* ----------------------------------------------------------------------------- * Hash_getattr() * * Get an attribute from the hash table. Returns 0 if it doesn't exist. * ----------------------------------------------------------------------------- */ typedef int (*binop) (DOH *obj1, DOH *obj2); static DOH *Hash_getattr(DOH *h, DOH *k) { DOH *obj = 0; Hash *ho = (Hash *) ObjData(h); DOH *ko = DohCheck(k) ? k : find_key(k); int hv = Hashval(ko) % ho->hashsize; DohObjInfo *k_type = ((DohBase*)ko)->type; HashNode *n = ho->hashtable[hv]; if (k_type->doh_equal) { binop equal = k_type->doh_equal; while (n) { DohBase *nk = (DohBase *)n->key; if ((k_type == nk->type) && equal(ko, nk)) obj = n->object; n = n->next; } } else { binop cmp = k_type->doh_cmp; while (n) { DohBase *nk = (DohBase *)n->key; if ((k_type == nk->type) && (cmp(ko, nk) == 0)) obj = n->object; n = n->next; } } return obj; } /* ----------------------------------------------------------------------------- * Hash_delattr() * * Delete an object from the hash table. * ----------------------------------------------------------------------------- */ static int Hash_delattr(DOH *ho, DOH *k) { HashNode *n, *prev; int hv; Hash *h = (Hash *) ObjData(ho); if (!DohCheck(k)) k = find_key(k); hv = Hashval(k) % h->hashsize; n = h->hashtable[hv]; prev = 0; while (n) { if (Cmp(n->key, k) == 0) { /* Found it, kill it */ if (prev) { prev->next = n->next; } else { h->hashtable[hv] = n->next; } DelNode(n); h->nitems--; return 1; } prev = n; n = n->next; } return 0; } static DohIterator Hash_firstiter(DOH *ho) { DohIterator iter; Hash *h = (Hash *) ObjData(ho); iter.object = ho; iter._current = 0; iter.item = 0; iter.key = 0; iter._index = 0; /* Index in hash table */ while ((iter._index < h->hashsize) && !h->hashtable[iter._index]) iter._index++; if (iter._index >= h->hashsize) { return iter; } iter._current = h->hashtable[iter._index]; iter.item = ((HashNode *) iter._current)->object; iter.key = ((HashNode *) iter._current)->key; /* Actually save the next slot in the hash. This makes it possible to delete the item being iterated over without trashing the universe */ iter._current = ((HashNode *) iter._current)->next; return iter; } static DohIterator Hash_nextiter(DohIterator iter) { Hash *h = (Hash *) ObjData(iter.object); if (!iter._current) { iter._index++; while ((iter._index < h->hashsize) && !h->hashtable[iter._index]) { iter._index++; } if (iter._index >= h->hashsize) { iter.item = 0; iter.key = 0; iter._current = 0; return iter; } iter._current = h->hashtable[iter._index]; } iter.key = ((HashNode *) iter._current)->key; iter.item = ((HashNode *) iter._current)->object; /* Store the next node to iterator on */ iter._current = ((HashNode *) iter._current)->next; return iter; } /* ----------------------------------------------------------------------------- * Hash_keys() * * Return a list of keys * ----------------------------------------------------------------------------- */ static DOH *Hash_keys(DOH *so) { DOH *keys; Iterator i; keys = NewList(); for (i = First(so); i.key; i = Next(i)) { Append(keys, i.key); } return keys; } /* ----------------------------------------------------------------------------- * DohSetMaxHashExpand() * * Controls how many Hash objects are displayed in full in Hash_str * ----------------------------------------------------------------------------- */ void DohSetMaxHashExpand(int count) { max_expand = count; } /* ----------------------------------------------------------------------------- * DohGetMaxHashExpand() * * Returns how many Hash objects are displayed in full in Hash_str * ----------------------------------------------------------------------------- */ int DohGetMaxHashExpand(void) { return max_expand; } /* ----------------------------------------------------------------------------- * Hash_str() * * Create a string representation of a hash table (mainly for debugging). * ----------------------------------------------------------------------------- */ static DOH *Hash_str(DOH *ho) { int i, j; HashNode *n; DOH *s; static int expanded = 0; static const char *tab = " "; Hash *h = (Hash *) ObjData(ho); s = NewStringEmpty(); if (ObjGetMark(ho)) { Printf(s, "Hash(%p)", ho); return s; } if (expanded >= max_expand) { /* replace each hash attribute with a '.' */ Printf(s, "Hash(%p) {", ho); for (i = 0; i < h->hashsize; i++) { n = h->hashtable[i]; while (n) { Putc('.', s); n = n->next; } } Putc('}', s); return s; } ObjSetMark(ho, 1); Printf(s, "Hash(%p) {\n", ho); for (i = 0; i < h->hashsize; i++) { n = h->hashtable[i]; while (n) { for (j = 0; j < expanded + 1; j++) Printf(s, tab); expanded += 1; Printf(s, "'%s' : %s, \n", n->key, n->object); expanded -= 1; n = n->next; } } for (j = 0; j < expanded; j++) Printf(s, tab); Printf(s, "}"); ObjSetMark(ho, 0); return s; } /* ----------------------------------------------------------------------------- * Hash_len() * * Return number of entries in the hash table. * ----------------------------------------------------------------------------- */ static int Hash_len(DOH *ho) { Hash *h = (Hash *) ObjData(ho); return h->nitems; } /* ----------------------------------------------------------------------------- * CopyHash() * * Make a copy of a hash table. Note: this is a shallow copy. * ----------------------------------------------------------------------------- */ static DOH *CopyHash(DOH *ho) { Hash *h, *nh; HashNode *n; DOH *nho; int i; h = (Hash *) ObjData(ho); nh = (Hash *) DohMalloc(sizeof(Hash)); nh->hashsize = h->hashsize; nh->hashtable = (HashNode **) DohMalloc(nh->hashsize * sizeof(HashNode *)); for (i = 0; i < nh->hashsize; i++) { nh->hashtable[i] = 0; } nh->nitems = 0; nh->line = h->line; nh->file = h->file; if (nh->file) Incref(nh->file); nho = DohObjMalloc(&DohHashType, nh); for (i = 0; i < h->hashsize; i++) { n = h->hashtable[i]; while (n) { Hash_setattr(nho, n->key, n->object); n = n->next; } } return nho; } static void Hash_setfile(DOH *ho, DOH *file) { DOH *fo; Hash *h = (Hash *) ObjData(ho); if (!DohCheck(file)) { fo = NewString(file); Decref(fo); } else fo = file; Incref(fo); Delete(h->file); h->file = fo; } static DOH *Hash_getfile(DOH *ho) { Hash *h = (Hash *) ObjData(ho); return h->file; } static void Hash_setline(DOH *ho, int line) { Hash *h = (Hash *) ObjData(ho); h->line = line; } static int Hash_getline(DOH *ho) { Hash *h = (Hash *) ObjData(ho); return h->line; } /* ----------------------------------------------------------------------------- * type information * ----------------------------------------------------------------------------- */ static DohHashMethods HashHashMethods = { Hash_getattr, Hash_setattr, Hash_delattr, Hash_keys, }; DohObjInfo DohHashType = { "Hash", /* objname */ DelHash, /* doh_del */ CopyHash, /* doh_copy */ Hash_clear, /* doh_clear */ Hash_str, /* doh_str */ 0, /* doh_data */ 0, /* doh_dump */ Hash_len, /* doh_len */ 0, /* doh_hash */ 0, /* doh_cmp */ 0, /* doh_equal */ Hash_firstiter, /* doh_first */ Hash_nextiter, /* doh_next */ Hash_setfile, /* doh_setfile */ Hash_getfile, /* doh_getfile */ Hash_setline, /* doh_setline */ Hash_getline, /* doh_getline */ &HashHashMethods, /* doh_mapping */ 0, /* doh_sequence */ 0, /* doh_file */ 0, /* doh_string */ 0, /* doh_positional */ 0, }; /* ----------------------------------------------------------------------------- * NewHash() * * Create a new hash table. * ----------------------------------------------------------------------------- */ DOH *DohNewHash(void) { Hash *h; int i; h = (Hash *) DohMalloc(sizeof(Hash)); h->hashsize = HASH_INIT_SIZE; h->hashtable = (HashNode **) DohMalloc(h->hashsize * sizeof(HashNode *)); for (i = 0; i < h->hashsize; i++) { h->hashtable[i] = 0; } h->nitems = 0; h->file = 0; h->line = 0; return DohObjMalloc(&DohHashType, h); } swig-3.0.12/Source/DOH/base.c0000664000175000017500000006510613042756442015375 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * base.c * * This file contains the function entry points for dispatching methods on * DOH objects. A number of small utility functions are also included. * ----------------------------------------------------------------------------- */ #include "dohint.h" /* ----------------------------------------------------------------------------- * DohDelete() * ----------------------------------------------------------------------------- */ #ifndef SWIG_DEBUG_DELETE #define SWIG_DEBUG_DELETE 0 #endif void DohDelete(DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!obj) return; if (!DohCheck(b)) { #if SWIG_DEBUG_DELETE fputs("DOH: Fatal error. Attempt to delete a non-doh object.\n", stderr); abort(); #else assert(0); #endif return; } if (b->flag_intern) return; assert(b->refcount > 0); b->refcount--; if (b->refcount <= 0) { objinfo = b->type; if (objinfo->doh_del) { (objinfo->doh_del) (b); } else { if (b->data) DohFree(b->data); } DohObjFree(b); } } /* ----------------------------------------------------------------------------- * DohCopy() * ----------------------------------------------------------------------------- */ DOH *DohCopy(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!obj) return 0; if (!DohCheck(b)) { #if SWIG_DEBUG_DELETE fputs("DOH: Fatal error. Attempt to copy a non-doh object.\n", stderr); abort(); #else assert(0); #endif return 0; } objinfo = b->type; if (objinfo->doh_copy) { DohBase *bc = (DohBase *) (objinfo->doh_copy) (b); if ((bc) && b->meta) { bc->meta = Copy(b->meta); } return (DOH *) bc; } return 0; } void DohIncref(DOH *obj) { Incref(obj); } /* ----------------------------------------------------------------------------- * DohClear() * ----------------------------------------------------------------------------- */ void DohClear(DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_clear) (objinfo->doh_clear) (b); } /* ----------------------------------------------------------------------------- * DohStr() * ----------------------------------------------------------------------------- */ DOH *DohStr(const DOH *obj) { char buffer[512]; DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(b)) { objinfo = b->type; if (objinfo->doh_str) { return (objinfo->doh_str) (b); } sprintf(buffer, "", objinfo->objname, (void *) b); return NewString(buffer); } else { return NewString(obj); } } /* ----------------------------------------------------------------------------- * DohDump() * ----------------------------------------------------------------------------- */ int DohDump(const DOH *obj, DOH *out) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_dump) { return (objinfo->doh_dump) (b, out); } return 0; } /* ----------------------------------------------------------------------------- * DohLen() - Defaults to strlen() if not a DOH object * ----------------------------------------------------------------------------- */ int DohLen(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!b) return 0; if (DohCheck(b)) { objinfo = b->type; if (objinfo->doh_len) { return (objinfo->doh_len) (b); } return 0; } else { return (int)strlen((char *) obj); } } /* ----------------------------------------------------------------------------- * DohHashVal() * ----------------------------------------------------------------------------- */ int DohHashval(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; /* obj is already checked and/or converted into DohBase* */ /* if (DohCheck(b)) */ { objinfo = b->type; if (objinfo->doh_hashval) { return (objinfo->doh_hashval) (b); } } return 0; } /* ----------------------------------------------------------------------------- * DohData() * ----------------------------------------------------------------------------- */ void *DohData(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(obj)) { objinfo = b->type; if (objinfo->doh_data) { return (objinfo->doh_data) (b); } return 0; } return (void *) obj; } /* ----------------------------------------------------------------------------- * RawData() * ----------------------------------------------------------------------------- */ static void *RawData(DohBase *b) { DohObjInfo *objinfo = b->type; return (objinfo->doh_data) ? (objinfo->doh_data) (b) : 0; } /* ----------------------------------------------------------------------------- * DohCmp() * ----------------------------------------------------------------------------- */ int DohCmp(const DOH *obj1, const DOH *obj2) { DohBase *b1, *b2; DohObjInfo *b1info, *b2info; int c1, c2; b1 = (DohBase *) obj1; b2 = (DohBase *) obj2; c1 = DohCheck(b1); c2 = DohCheck(b2); /* most of the times, obj2 is a plain c string */ if (!c1 || !c2) { if ((b1 == 0) && (b2 == 0)) return 0; if (b1 && !b2) return 1; if (!b1 && b2) return -1; return strcmp((char *) (c1 ? RawData(b1) : (void *) obj1), (char *) (c2 ? RawData(b2) : (void *) obj2)); } b1info = b1->type; b2info = b2->type; if ((b1info == b2info) && (b1info->doh_cmp)) return (b1info->doh_cmp) (b1, b2); return 1; } /* ----------------------------------------------------------------------------- * DohEqual() * ----------------------------------------------------------------------------- */ int DohEqual(const DOH *obj1, const DOH *obj2) { DohBase *b1 = (DohBase *) obj1; DohBase *b2 = (DohBase *) obj2; if (!b1) { return !b2; } else if (!b2) { return 0; } else { DohObjInfo *b1info = 0; DohObjInfo *b2info = 0; if (DohCheck(b1)) { b1info = b1->type; if (DohCheck(b2)) { b2info = b2->type; } else { int len = (b1info->doh_len) (b1); char *cobj = (char *) obj2; return len == (int) strlen(cobj) ? (memcmp(RawData(b1), cobj, len) == 0) : 0; } } else if (DohCheck(b2)) { int len = (b2->type->doh_len) (b2); char *cobj = (char *) obj1; return len == (int) strlen(cobj) ? (memcmp(RawData(b2), cobj, len) == 0) : 0; } else { return strcmp((char *) obj1, (char *) obj2) == 0; } if (!b1info) { return obj1 == obj2; } else if (b1info == b2info) { return b1info->doh_equal ? (b1info->doh_equal) (b1, b2) : (b1info->doh_cmp ? (b1info->doh_cmp) (b1, b2) == 0 : (b1 == b2)); } else { return 0; } } } /* ----------------------------------------------------------------------------- * DohFirst() * ----------------------------------------------------------------------------- */ DohIterator DohFirst(DOH *obj) { DohIterator iter; DohBase *b; DohObjInfo *binfo; b = (DohBase *) obj; if (DohCheck(b)) { binfo = b->type; if (binfo->doh_first) { return (binfo->doh_first) (b); } } iter.object = 0; iter.item = 0; iter.key = 0; iter._current = 0; iter._index = 0; return iter; } /* ----------------------------------------------------------------------------- * DohNext() * ----------------------------------------------------------------------------- */ DohIterator DohNext(DohIterator iter) { DohIterator niter; if (iter.object) { DohBase *b; DohObjInfo *binfo; b = (DohBase *) iter.object; binfo = b->type; if (binfo->doh_next) { return (binfo->doh_next) (iter); } } niter = iter; return niter; } /* ----------------------------------------------------------------------------- * DohIsMapping() * ----------------------------------------------------------------------------- */ int DohIsMapping(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!DohCheck(b)) return 0; objinfo = b->type; if (objinfo->doh_hash) return 1; else return 0; } /* ----------------------------------------------------------------------------- * DohGetattr() * ----------------------------------------------------------------------------- */ DOH *DohGetattr(DOH *obj, const DOH *name) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_hash && objinfo->doh_hash->doh_getattr) { DOH *r = (objinfo->doh_hash->doh_getattr) (b, (DOH *) name); return (r == DohNone) ? 0 : r; } return 0; } /* ----------------------------------------------------------------------------- * DohSetattr() * ----------------------------------------------------------------------------- */ int DohSetattr(DOH *obj, const DOH *name, const DOH *value) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_hash && objinfo->doh_hash->doh_setattr) { return (objinfo->doh_hash->doh_setattr) (b, (DOH *) name, (DOH *) value); } return 0; } /* ----------------------------------------------------------------------------- * DohDelattr() * ----------------------------------------------------------------------------- */ int DohDelattr(DOH *obj, const DOH *name) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_hash && objinfo->doh_hash->doh_delattr) { return (objinfo->doh_hash->doh_delattr) (b, (DOH *) name); } return 0; } /* ----------------------------------------------------------------------------- * DohCheckattr() * ----------------------------------------------------------------------------- */ int DohCheckattr(DOH *obj, const DOH *name, const DOH *value) { DOH *attr = Getattr(obj,name); if (!attr) return 0; return DohEqual(attr,value); } /* ----------------------------------------------------------------------------- * DohKeys() * ----------------------------------------------------------------------------- */ DOH *DohKeys(DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo && objinfo->doh_hash->doh_keys) { return (objinfo->doh_hash->doh_keys) (b); } return 0; } /* ----------------------------------------------------------------------------- * DohGetInt() * ----------------------------------------------------------------------------- */ int DohGetInt(DOH *obj, const DOH *name) { DOH *val; val = Getattr(obj, (DOH *) name); if (!val) return 0; if (DohIsString(val)) { return atoi((char *) Data(val)); } return 0; } /* ----------------------------------------------------------------------------- * DohGetDouble() * ----------------------------------------------------------------------------- */ double DohGetDouble(DOH *obj, const DOH *name) { DOH *val; val = Getattr(obj, (DOH *) name); if (!val) return 0; if (DohIsString(val)) { return atof((char *) Data(val)); } return 0; } /* ----------------------------------------------------------------------------- * DohGetChar() * ----------------------------------------------------------------------------- */ char *DohGetChar(DOH *obj, const DOH *name) { DOH *val; val = Getattr(obj, (DOH *) name); if (!val) return 0; if (DohIsString(val)) { return (char *) Data(val); } return 0; } /* ----------------------------------------------------------------------------- * DohGetFlagAttr() / DohGetFlag() * A flag is unset if the attribute (name) does not exist on the node (obj), * or it is set to "0". If the attribute is set to any other value, * the flag is set. * * DohGetFlag() returns if the flag is set or not * DohGetFlagAttr() returns the flag value if is set, NULL otherwise * ----------------------------------------------------------------------------- */ DOH *DohGetFlagAttr(DOH *obj, const DOH *name) { DOH *val = Getattr(obj, (DOH *) name); if (!val) { return NULL; } else { const char *cval = Char(val); if (!cval) return val; return (strcmp(cval, "0") != 0) ? val : NULL; } } int DohGetFlag(DOH *obj, const DOH *name) { return DohGetFlagAttr(obj, name) ? 1 : 0; } /* ----------------------------------------------------------------------------- * DohGetVoid() * ----------------------------------------------------------------------------- */ void *DohGetVoid(DOH *obj, const DOH *name) { DOH *val; val = Getattr(obj, (DOH *) name); if (!val) return 0; return (void *) Data(val); } /* ----------------------------------------------------------------------------- * DohSetInt() * ----------------------------------------------------------------------------- */ void DohSetInt(DOH *obj, const DOH *name, int value) { DOH *temp; temp = NewStringEmpty(); Printf(temp, "%d", value); Setattr(obj, (DOH *) name, temp); } /* ----------------------------------------------------------------------------- * DohSetDouble() * ----------------------------------------------------------------------------- */ void DohSetDouble(DOH *obj, const DOH *name, double value) { DOH *temp; temp = NewStringEmpty(); Printf(temp, "%0.17f", value); Setattr(obj, (DOH *) name, temp); } /* ----------------------------------------------------------------------------- * DohSetChar() * ----------------------------------------------------------------------------- */ void DohSetChar(DOH *obj, const DOH *name, char *value) { Setattr(obj, (DOH *) name, NewString(value)); } /* ----------------------------------------------------------------------------- * DohSetFlag() * ----------------------------------------------------------------------------- */ void DohSetFlagAttr(DOH *obj, const DOH *name, const DOH *attr) { Setattr(obj, (DOH *) name, attr ? attr : NewString("0")); } void DohSetFlag(DOH *obj, const DOH *name) { Setattr(obj, (DOH *) name, NewString("1")); } /* ----------------------------------------------------------------------------- * DohSetVoid() * ----------------------------------------------------------------------------- */ void DohSetVoid(DOH *obj, const DOH *name, void *value) { Setattr(obj, (DOH *) name, NewVoid(value, 0)); } /* ----------------------------------------------------------------------------- * DohIsSequence() * ----------------------------------------------------------------------------- */ int DohIsSequence(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!DohCheck(b)) return 0; objinfo = b->type; if (objinfo->doh_list) return 1; else return 0; } /* ----------------------------------------------------------------------------- * DohGetitem() * ----------------------------------------------------------------------------- */ DOH *DohGetitem(DOH *obj, int index) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_list && objinfo->doh_list->doh_getitem) { return (objinfo->doh_list->doh_getitem) (b, index); } return 0; } /* ----------------------------------------------------------------------------- * DohSetitem() * ----------------------------------------------------------------------------- */ int DohSetitem(DOH *obj, int index, const DOH *value) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_list && objinfo->doh_list->doh_setitem) { return (objinfo->doh_list->doh_setitem) (b, index, (DOH *) value); } return -1; } /* ----------------------------------------------------------------------------- * DohDelitem() * ----------------------------------------------------------------------------- */ int DohDelitem(DOH *obj, int index) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_list && objinfo->doh_list->doh_delitem) { return (objinfo->doh_list->doh_delitem) (b, index); } return -1; } /* ----------------------------------------------------------------------------- * DohInsertitem() * ----------------------------------------------------------------------------- */ int DohInsertitem(DOH *obj, int index, const DOH *value) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_list && objinfo->doh_list->doh_insitem) { return (objinfo->doh_list->doh_insitem) (b, index, (DOH *) value); } return -1; } /* ----------------------------------------------------------------------------- * DohDelslice() * ----------------------------------------------------------------------------- */ int DohDelslice(DOH *obj, int sindex, int eindex) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo = b->type; if (objinfo->doh_list && objinfo->doh_list->doh_delslice) { return (objinfo->doh_list->doh_delslice) (b, sindex, eindex); } return -1; } /* ----------------------------------------------------------------------------- * DohIsFile() * ----------------------------------------------------------------------------- */ int DohIsFile(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!DohCheck(b)) return 0; objinfo = b->type; if (objinfo->doh_file) return 1; else return 0; } /* ----------------------------------------------------------------------------- * DohRead() * ----------------------------------------------------------------------------- */ int DohRead(DOH *obj, void *buffer, int length) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(obj)) { objinfo = b->type; if ((objinfo->doh_file) && (objinfo->doh_file->doh_read)) { return (objinfo->doh_file->doh_read) (b, buffer, length); } return -1; } /* Hmmm. Not a file. Maybe it's a real FILE */ return (int)fread(buffer, 1, length, (FILE *) b); } /* ----------------------------------------------------------------------------- * DohWrite() * ----------------------------------------------------------------------------- */ int DohWrite(DOH *obj, const void *buffer, int length) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(obj)) { objinfo = b->type; if ((objinfo->doh_file) && (objinfo->doh_file->doh_write)) { return (objinfo->doh_file->doh_write) (b, buffer, length); } return -1; } /* Hmmm. Not a file. Maybe it's a real FILE */ return (int)fwrite(buffer, 1, length, (FILE *) b); } /* ----------------------------------------------------------------------------- * DohSeek() * ----------------------------------------------------------------------------- */ int DohSeek(DOH *obj, long offset, int whence) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(obj)) { objinfo = b->type; if ((objinfo->doh_file) && (objinfo->doh_file->doh_seek)) { return (objinfo->doh_file->doh_seek) (b, offset, whence); } return -1; } return fseek((FILE *) b, offset, whence); } /* ----------------------------------------------------------------------------- * DohTell() * ----------------------------------------------------------------------------- */ long DohTell(DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(obj)) { objinfo = b->type; if ((objinfo->doh_file) && (objinfo->doh_file->doh_tell)) { return (objinfo->doh_file->doh_tell) (b); } return -1; } return ftell((FILE *) b); } /* ----------------------------------------------------------------------------- * DohGetc() * ----------------------------------------------------------------------------- */ int DohGetc(DOH *obj) { static DOH *lastdoh = 0; DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (obj == lastdoh) { objinfo = b->type; return (objinfo->doh_file->doh_getc) (b); } if (DohCheck(obj)) { objinfo = b->type; if (objinfo->doh_file->doh_getc) { lastdoh = obj; return (objinfo->doh_file->doh_getc) (b); } return EOF; } return fgetc((FILE *) b); } /* ----------------------------------------------------------------------------- * DohPutc() * ----------------------------------------------------------------------------- */ int DohPutc(int ch, DOH *obj) { static DOH *lastdoh = 0; DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (obj == lastdoh) { objinfo = b->type; return (objinfo->doh_file->doh_putc) (b, ch); } if (DohCheck(obj)) { objinfo = b->type; if (objinfo->doh_file->doh_putc) { lastdoh = obj; return (objinfo->doh_file->doh_putc) (b, ch); } return EOF; } return fputc(ch, (FILE *) b); } /* ----------------------------------------------------------------------------- * DohUngetc() * ----------------------------------------------------------------------------- */ int DohUngetc(int ch, DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(obj)) { objinfo = b->type; if (objinfo->doh_file->doh_ungetc) { return (objinfo->doh_file->doh_ungetc) (b, ch); } return EOF; } return ungetc(ch, (FILE *) b); } /* ----------------------------------------------------------------------------- * DohClose() * ----------------------------------------------------------------------------- */ /* int DohClose(DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (DohCheck(obj)) { objinfo = b->type; if (objinfo->doh_file->doh_close) { return (objinfo->doh_file->doh_close) (b); } return 0; } return fclose((FILE *) obj); } */ /* ----------------------------------------------------------------------------- * DohIsString() * ----------------------------------------------------------------------------- */ int DohIsString(const DOH *obj) { DohBase *b = (DohBase *) obj; DohObjInfo *objinfo; if (!DohCheck(b)) return 0; objinfo = b->type; if (objinfo->doh_string) return 1; else return 0; } /* ----------------------------------------------------------------------------- * DohReplace() * ----------------------------------------------------------------------------- */ int DohReplace(DOH *src, const DOH *token, const DOH *rep, int flags) { DohBase *b = (DohBase *) src; DohObjInfo *objinfo; if (!token) return 0; if (!rep) rep = ""; if (DohIsString(src)) { objinfo = b->type; if (objinfo->doh_string->doh_replace) { return (objinfo->doh_string->doh_replace) (b, (DOH *) token, (DOH *) rep, flags); } } return 0; } /* ----------------------------------------------------------------------------- * DohChop() * ----------------------------------------------------------------------------- */ void DohChop(DOH *src) { DohBase *b = (DohBase *) src; DohObjInfo *objinfo; if (DohIsString(src)) { objinfo = b->type; if (objinfo->doh_string->doh_chop) { (objinfo->doh_string->doh_chop) (b); } } } /* ----------------------------------------------------------------------------- * DohSetFile() * ----------------------------------------------------------------------------- */ void DohSetfile(DOH *ho, DOH *file) { DohBase *h = (DohBase *) ho; DohObjInfo *objinfo; if (!h) return; objinfo = h->type; if (objinfo->doh_setfile) (objinfo->doh_setfile) (h, file); } /* ----------------------------------------------------------------------------- * DohGetFile() * ----------------------------------------------------------------------------- */ DOH *DohGetfile(const DOH *ho) { DohBase *h = (DohBase *) ho; DohObjInfo *objinfo; if (!h) return 0; objinfo = h->type; if (objinfo->doh_getfile) return (objinfo->doh_getfile) (h); return 0; } /* ----------------------------------------------------------------------------- * DohSetLine() * ----------------------------------------------------------------------------- */ void DohSetline(DOH *ho, int l) { DohBase *h = (DohBase *) ho; DohObjInfo *objinfo; if (!h) return; objinfo = h->type; if (objinfo->doh_setline) (objinfo->doh_setline) (h, l); } /* ----------------------------------------------------------------------------- * DohGetLine() * ----------------------------------------------------------------------------- */ int DohGetline(const DOH *ho) { DohBase *h = (DohBase *) ho; DohObjInfo *objinfo; if (!h) return 0; objinfo = h->type; if (objinfo->doh_getline) return (objinfo->doh_getline) (h); return 0; } /* ----------------------------------------------------------------------------- * DohGetmeta() * ----------------------------------------------------------------------------- */ DOH *DohGetmeta(DOH *ho, const DOH *name) { DohBase *h = (DohBase *) ho; if (!DohCheck(ho)) return 0; if (!h->meta) return 0; return DohGetattr(h->meta, name); } /* ----------------------------------------------------------------------------- * DohGetmeta() * ----------------------------------------------------------------------------- */ int DohSetmeta(DOH *ho, const DOH *name, const DOH *value) { DohBase *h = (DohBase *) ho; if (!DohCheck(ho)) return 0; if (!h->meta) h->meta = NewHash(); return DohSetattr(h->meta, name, value); } /* ----------------------------------------------------------------------------- * DohDelmeta() * ----------------------------------------------------------------------------- */ int DohDelmeta(DOH *ho, const DOH *name) { DohBase *h = (DohBase *) ho; if (!DohCheck(ho)) return 0; if (!h->meta) return 0; return DohDelattr(h->meta, name); } /* ----------------------------------------------------------------------------- * DohSetmark() * ----------------------------------------------------------------------------- */ void DohSetmark(DOH *ho, int x) { DohBase *h = (DohBase *) ho; h->flag_usermark = x; } int DohGetmark(DOH *ho) { DohBase *h = (DohBase *) ho; return h->flag_usermark; } /* ----------------------------------------------------------------------------- * DohCall() * * Invokes a function via DOH. A Function is represented by a hash table with * the following attributes: * * "builtin" - Pointer to built-in function (if any) * * (Additional attributes may be added later) * * Returns a DOH object with result on success. Returns NULL on error * ----------------------------------------------------------------------------- */ DOH *DohCall(DOH *func, DOH *args) { DOH *result; DohFuncPtr_t builtin; builtin.p = GetVoid(func, "builtin"); if (!builtin.p) return 0; result = (*builtin.func) (args); return result; } swig-3.0.12/Source/DOH/string.c0000664000175000017500000007060413042756442015770 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * string.c * * Implements a string object that supports both sequence operations and * file semantics. * ----------------------------------------------------------------------------- */ #include "dohint.h" extern DohObjInfo DohStringType; typedef struct String { DOH *file; int line; int maxsize; /* Max size allocated */ int len; /* Current length */ int hashkey; /* Hash key value */ int sp; /* Current position */ char *str; /* String data */ } String; /* ----------------------------------------------------------------------------- * String_data() - Return as a 'void *' * ----------------------------------------------------------------------------- */ static void *String_data(DOH *so) { String *s = (String *) ObjData(so); s->str[s->len] = 0; return (void *) s->str; } /* static char *String_char(DOH *so) { return (char *) String_data(so); } */ /* ----------------------------------------------------------------------------- * String_dump() - Serialize a string onto out * ----------------------------------------------------------------------------- */ static int String_dump(DOH *so, DOH *out) { int nsent; int ret; String *s = (String *) ObjData(so); nsent = 0; while (nsent < s->len) { ret = Write(out, s->str + nsent, (s->len - nsent)); if (ret < 0) return ret; nsent += ret; } return nsent; } /* ----------------------------------------------------------------------------- * CopyString() - Copy a string * ----------------------------------------------------------------------------- */ static DOH *CopyString(DOH *so) { String *str; String *s = (String *) ObjData(so); str = (String *) DohMalloc(sizeof(String)); str->hashkey = s->hashkey; str->sp = s->sp; str->line = s->line; str->file = s->file; if (str->file) Incref(str->file); str->str = (char *) DohMalloc(s->len + 1); memcpy(str->str, s->str, s->len); str->maxsize = s->len; str->len = s->len; str->str[str->len] = 0; return DohObjMalloc(&DohStringType, str); } /* ----------------------------------------------------------------------------- * DelString() - Delete a string * ----------------------------------------------------------------------------- */ static void DelString(DOH *so) { String *s = (String *) ObjData(so); DohFree(s->str); DohFree(s); } /* ----------------------------------------------------------------------------- * DohString_len() - Length of a string * ----------------------------------------------------------------------------- */ static int String_len(DOH *so) { String *s = (String *) ObjData(so); return s->len; } /* ----------------------------------------------------------------------------- * String_cmp() - Compare two strings * ----------------------------------------------------------------------------- */ static int String_cmp(DOH *so1, DOH *so2) { String *s1, *s2; char *c1, *c2; int maxlen, i; s1 = (String *) ObjData(so1); s2 = (String *) ObjData(so2); maxlen = s1->len; if (s2->len < maxlen) maxlen = s2->len; c1 = s1->str; c2 = s2->str; for (i = maxlen; i; --i, c1++, c2++) { if (*c1 != *c2) break; } if (i != 0) { if (*c1 < *c2) return -1; else return 1; } if (s1->len == s2->len) return 0; if (s1->len > s2->len) return 1; return -1; } /* ----------------------------------------------------------------------------- * String_equal() - Say if two string are equal * ----------------------------------------------------------------------------- */ static int String_equal(DOH *so1, DOH *so2) { String *s1 = (String *) ObjData(so1); String *s2 = (String *) ObjData(so2); register int len = s1->len; if (len != s2->len) { return 0; } else { register char *c1 = s1->str; register char *c2 = s2->str; #if 0 register int mlen = len >> 2; register int i = mlen; for (; i; --i) { if (*(c1++) != *(c2++)) return 0; if (*(c1++) != *(c2++)) return 0; if (*(c1++) != *(c2++)) return 0; if (*(c1++) != *(c2++)) return 0; } for (i = len - (mlen << 2); i; --i) { if (*(c1++) != *(c2++)) return 0; } return 1; #else return memcmp(c1, c2, len) == 0; #endif } } /* ----------------------------------------------------------------------------- * String_hash() - Compute string hash value * ----------------------------------------------------------------------------- */ static int String_hash(DOH *so) { String *s = (String *) ObjData(so); if (s->hashkey >= 0) { return s->hashkey; } else { register char *c = s->str; register unsigned int len = s->len > 50 ? 50 : s->len; register unsigned int h = 0; register unsigned int mlen = len >> 2; register unsigned int i = mlen; for (; i; --i) { h = (h << 5) + *(c++); h = (h << 5) + *(c++); h = (h << 5) + *(c++); h = (h << 5) + *(c++); } for (i = len - (mlen << 2); i; --i) { h = (h << 5) + *(c++); } h &= 0x7fffffff; s->hashkey = (int)h; return h; } } /* ----------------------------------------------------------------------------- * DohString_append() - Append to s * ----------------------------------------------------------------------------- */ static void DohString_append(DOH *so, const DOHString_or_char *str) { int oldlen, newlen, newmaxsize, l, sp; char *tc; String *s = (String *) ObjData(so); char *newstr = 0; if (DohCheck(str)) { String *ss = (String *) ObjData(str); newstr = (char *) String_data((DOH *) str); l = ss->len; } else { newstr = (char *) (str); l = (int) strlen(newstr); } if (!newstr) return; s->hashkey = -1; oldlen = s->len; newlen = oldlen + l + 1; if (newlen >= s->maxsize - 1) { newmaxsize = 2 * s->maxsize; if (newlen >= newmaxsize - 1) newmaxsize = newlen + 1; s->str = (char *) DohRealloc(s->str, newmaxsize); assert(s->str); s->maxsize = newmaxsize; } tc = s->str; memcpy(tc + oldlen, newstr, l + 1); sp = s->sp; if (sp >= oldlen) { int i = oldlen + l - sp; tc += sp; for (; i; --i) { if (*(tc++) == '\n') s->line++; } s->sp = oldlen + l; } s->len += l; } /* ----------------------------------------------------------------------------- * String_clear() - Clear a string * ----------------------------------------------------------------------------- */ static void String_clear(DOH *so) { String *s = (String *) ObjData(so); s->hashkey = -1; s->len = 0; *(s->str) = 0; s->sp = 0; s->line = 1; } /* ----------------------------------------------------------------------------- * String_insert() - Insert a string * ----------------------------------------------------------------------------- */ static int String_insert(DOH *so, int pos, DOH *str) { String *s; int len; char *data; if (pos == DOH_END) { DohString_append(so, str); return 0; } s = (String *) ObjData(so); s->hashkey = -1; if (DohCheck(str)) { String *ss = (String *) ObjData(str); data = (char *) String_data(str); len = ss->len; } else { data = (char *) (str); len = (int) strlen(data); } if (pos < 0) pos = 0; else if (pos > s->len) pos = s->len; /* See if there is room to insert the new data */ while (s->maxsize <= s->len + len) { int newsize = 2 * s->maxsize; s->str = (char *) DohRealloc(s->str, newsize); assert(s->str); s->maxsize = newsize; } memmove(s->str + pos + len, s->str + pos, (s->len - pos)); memcpy(s->str + pos, data, len); if (s->sp >= pos) { int i; for (i = 0; i < len; i++) { if (data[i] == '\n') s->line++; } s->sp += len; } s->len += len; s->str[s->len] = 0; return 0; } /* ----------------------------------------------------------------------------- * String_delitem() - Delete a character * ----------------------------------------------------------------------------- */ static int String_delitem(DOH *so, int pos) { String *s = (String *) ObjData(so); s->hashkey = -1; if (pos == DOH_END) pos = s->len - 1; if (pos == DOH_BEGIN) pos = 0; if (s->len == 0) return 0; if (s->sp > pos) { s->sp--; assert(s->sp >= 0); if (s->str[pos] == '\n') s->line--; } memmove(s->str + pos, s->str + pos + 1, ((s->len - 1) - pos)); s->len--; s->str[s->len] = 0; return 0; } /* ----------------------------------------------------------------------------- * String_delslice() - Delete a range * ----------------------------------------------------------------------------- */ static int String_delslice(DOH *so, int sindex, int eindex) { String *s = (String *) ObjData(so); int size; if (s->len == 0) return 0; s->hashkey = -1; if (eindex == DOH_END) eindex = s->len; if (sindex == DOH_BEGIN) sindex = 0; size = eindex - sindex; if (s->sp > sindex) { /* Adjust the file pointer and line count */ int i, end; if (s->sp > eindex) { end = eindex; s->sp -= size; } else { end = s->sp; s->sp = sindex; } for (i = sindex; i < end; i++) { if (s->str[i] == '\n') s->line--; } assert(s->sp >= 0); } memmove(s->str + sindex, s->str + eindex, s->len - eindex); s->len -= size; s->str[s->len] = 0; return 0; } /* ----------------------------------------------------------------------------- * String_str() - Returns a string (used by printing commands) * ----------------------------------------------------------------------------- */ static DOH *String_str(DOH *so) { String *s = (String *) ObjData(so); s->str[s->len] = 0; return NewString(s->str); } /* ----------------------------------------------------------------------------- * String_read() - Read data from a string * ----------------------------------------------------------------------------- */ static int String_read(DOH *so, void *buffer, int len) { int reallen, retlen; char *cb; String *s = (String *) ObjData(so); if ((s->sp + len) > s->len) reallen = (s->len - s->sp); else reallen = len; cb = (char *) buffer; retlen = reallen; if (reallen > 0) { memmove(cb, s->str + s->sp, reallen); s->sp += reallen; } return retlen; } /* ----------------------------------------------------------------------------- * String_write() - Write data to a string * ----------------------------------------------------------------------------- */ static int String_write(DOH *so, const void *buffer, int len) { int newlen; String *s = (String *) ObjData(so); s->hashkey = -1; if (s->sp > s->len) s->sp = s->len; newlen = s->sp + len + 1; if (newlen > s->maxsize) { s->str = (char *) DohRealloc(s->str, newlen); assert(s->str); s->maxsize = newlen; s->len = s->sp + len; } if ((s->sp + len) > s->len) s->len = s->sp + len; memmove(s->str + s->sp, buffer, len); s->sp += len; s->str[s->len] = 0; return len; } /* ----------------------------------------------------------------------------- * String_seek() - Seek to a new position * ----------------------------------------------------------------------------- */ static int String_seek(DOH *so, long offset, int whence) { int pos, nsp, inc; String *s = (String *) ObjData(so); if (whence == SEEK_SET) pos = 0; else if (whence == SEEK_CUR) pos = s->sp; else if (whence == SEEK_END) { pos = s->len; offset = -offset; } else pos = s->sp; nsp = pos + offset; if (nsp < 0) nsp = 0; if (s->len > 0 && nsp > s->len) nsp = s->len; inc = (nsp > s->sp) ? 1 : -1; { #if 0 register int sp = s->sp; register char *tc = s->str; register int len = s->len; while (sp != nsp) { int prev = sp + inc; if (prev >= 0 && prev <= len && tc[prev] == '\n') s->line += inc; sp += inc; } #else register int sp = s->sp; register char *tc = s->str; if (inc > 0) { while (sp != nsp) { if (tc[++sp] == '\n') ++s->line; } } else { while (sp != nsp) { if (tc[--sp] == '\n') --s->line; } } #endif s->sp = sp; } assert(s->sp >= 0); return 0; } /* ----------------------------------------------------------------------------- * String_tell() - Return current position * ----------------------------------------------------------------------------- */ static long String_tell(DOH *so) { String *s = (String *) ObjData(so); return (long) (s->sp); } /* ----------------------------------------------------------------------------- * String_putc() * ----------------------------------------------------------------------------- */ static int String_putc(DOH *so, int ch) { String *s = (String *) ObjData(so); register int len = s->len; register int sp = s->sp; s->hashkey = -1; if (sp >= len) { register int maxsize = s->maxsize; register char *tc = s->str; if (len > (maxsize - 2)) { maxsize *= 2; tc = (char *) DohRealloc(tc, maxsize); assert(tc); s->maxsize = (int) maxsize; s->str = tc; } tc += sp; *tc = (char) ch; *(++tc) = 0; s->len = s->sp = sp + 1; } else { s->str[s->sp++] = (char) ch; } if (ch == '\n') s->line++; return ch; } /* ----------------------------------------------------------------------------- * String_getc() * ----------------------------------------------------------------------------- */ static int String_getc(DOH *so) { int c; String *s = (String *) ObjData(so); if (s->sp >= s->len) c = EOF; else c = (int)(unsigned char) s->str[s->sp++]; if (c == '\n') s->line++; return c; } /* ----------------------------------------------------------------------------- * String_ungetc() * ----------------------------------------------------------------------------- */ static int String_ungetc(DOH *so, int ch) { String *s = (String *) ObjData(so); if (ch == EOF) return ch; if (s->sp <= 0) return EOF; s->sp--; if (ch == '\n') s->line--; return ch; } static char *end_quote(char *s) { char *qs; char qc; char *q; char *nl; qc = *s; qs = s; while (1) { q = strpbrk(s + 1, "\"\'"); nl = strchr(s + 1, '\n'); if (nl && (nl < q)) { /* A new line appears before the end of the string */ if (*(nl - 1) == '\\') { s = nl + 1; continue; } /* String was terminated by a newline. Wing it */ return qs; } if (!q && nl) { return qs; } if (!q) return 0; if ((*q == qc) && (*(q - 1) != '\\')) return q; s = q; } } static char *match_simple(char *base, char *s, char *token, int tokenlen) { (void) base; (void) tokenlen; return strstr(s, token); } static char *match_identifier(char *base, char *s, char *token, int tokenlen) { while (s) { s = strstr(s, token); if (!s) return 0; if ((s > base) && (isalnum((int) *(s - 1)) || (*(s - 1) == '_'))) { s += tokenlen; continue; } if (isalnum((int) *(s + tokenlen)) || (*(s + tokenlen) == '_')) { s += tokenlen; continue; } return s; } return 0; } static char *match_identifier_begin(char *base, char *s, char *token, int tokenlen) { while (s) { s = strstr(s, token); if (!s) return 0; if ((s > base) && (isalnum((int) *(s - 1)) || (*(s - 1) == '_'))) { s += tokenlen; continue; } return s; } return 0; } static char *match_identifier_end(char *base, char *s, char *token, int tokenlen) { (void) base; while (s) { s = strstr(s, token); if (!s) return 0; if (isalnum((int) *(s + tokenlen)) || (*(s + tokenlen) == '_')) { s += tokenlen; continue; } return s; } return 0; } static char *match_number_end(char *base, char *s, char *token, int tokenlen) { (void) base; while (s) { s = strstr(s, token); if (!s) return 0; if (isdigit((int) *(s + tokenlen))) { s += tokenlen; continue; } return s; } return 0; } /* ----------------------------------------------------------------------------- * replace_simple() * * Replaces count non-overlapping occurrences of token with rep in a string. * ----------------------------------------------------------------------------- */ static int replace_simple(String *str, char *token, char *rep, int flags, int count, char *(*match) (char *, char *, char *, int)) { int tokenlen; /* Length of the token */ int replen; /* Length of the replacement */ int delta, expand = 0; int ic; int rcount = 0; int noquote = 0; char *c, *s, *t, *first; char *q, *q2; register char *base; int i; /* Figure out if anything gets replaced */ if (!strlen(token)) return 0; base = str->str; tokenlen = (int)strlen(token); s = (*match) (base, base, token, tokenlen); if (!s) return 0; /* No matches. Who cares */ str->hashkey = -1; if (flags & DOH_REPLACE_NOQUOTE) noquote = 1; /* If we are not replacing inside quotes, we need to do a little extra work */ if (noquote) { q = strpbrk(base, "\"\'"); if (!q) { noquote = 0; /* Well, no quotes to worry about. Oh well */ } else { while (q && (q < s)) { /* First match was found inside a quote. Try to find another match */ q2 = end_quote(q); if (!q2) { return 0; } if (q2 > s) { /* Find next match */ s = (*match) (base, q2 + 1, token, tokenlen); } if (!s) return 0; /* Oh well, no matches */ q = strpbrk(q2 + 1, "\"\'"); if (!q) noquote = 0; /* No more quotes */ } } } first = s; replen = (int)strlen(rep); delta = (replen - tokenlen); if (delta <= 0) { /* String is either shrinking or staying the same size */ /* In this case, we do the replacement in place without memory reallocation */ ic = count; t = s; /* Target of memory copies */ while (ic && s) { if (replen) { memcpy(t, rep, replen); t += replen; } rcount++; expand += delta; /* Find the next location */ s += tokenlen; if (ic == 1) break; c = (*match) (base, s, token, tokenlen); if (noquote) { q = strpbrk(s, "\"\'"); if (!q) { noquote = 0; } else { while (q && (q < c)) { /* First match was found inside a quote. Try to find another match */ q2 = end_quote(q); if (!q2) { c = 0; break; } if (q2 > c) c = (*match) (base, q2 + 1, token, tokenlen); if (!c) break; q = strpbrk(q2 + 1, "\"\'"); if (!q) noquote = 0; /* No more quotes */ } } } if (delta) { if (c) { memmove(t, s, c - s); t += (c - s); } else { memmove(t, s, (str->str + str->len) - s + 1); } } else { t += (c - s); } s = c; ic--; } if (s && delta) { memmove(t, s, (str->str + str->len) - s + 1); } str->len += expand; str->str[str->len] = 0; if (str->sp >= str->len) str->sp += expand; /* Fix the end of file pointer */ return rcount; } /* The string is expanding as a result of the replacement */ /* Figure out how much expansion is going to occur and allocate a new string */ { char *ns; int newsize; rcount++; ic = count - 1; s += tokenlen; while (ic && (c = (*match) (base, s, token, tokenlen))) { if (noquote) { q = strpbrk(s, "\"\'"); if (!q) { break; } else { while (q && (q < c)) { /* First match was found inside a quote. Try to find another match */ q2 = end_quote(q); if (!q2) { c = 0; break; } if (q2 > c) { c = (*match) (base, q2 + 1, token, tokenlen); if (!c) break; } q = strpbrk(q2 + 1, "\"\'"); if (!q) noquote = 0; } } } if (c) { rcount++; ic--; s = c + tokenlen; } else { break; } } expand = delta * rcount; /* Total amount of expansion for the replacement */ newsize = str->maxsize; while ((str->len + expand) >= newsize) newsize *= 2; ns = (char *) DohMalloc(newsize); assert(ns); t = ns; s = first; /* Copy the first part of the string */ if (first > str->str) { memcpy(t, str->str, (first - str->str)); t += (first - str->str); } for (i = 0; i < rcount; i++) { memcpy(t, rep, replen); t += replen; s += tokenlen; c = (*match) (base, s, token, tokenlen); if (noquote) { q = strpbrk(s, "\"\'"); if (!q) { noquote = 0; } else { while (q && (q < c)) { /* First match was found inside a quote. Try to find another match */ q2 = end_quote(q); if (!q2) { c = 0; break; } if (q2 > c) { c = (*match) (base, q2 + 1, token, tokenlen); if (!c) break; } q = strpbrk(q2 + 1, "\"\'"); if (!q) noquote = 0; /* No more quotes */ } } } if (i < (rcount - 1)) { memcpy(t, s, c - s); t += (c - s); } else { memcpy(t, s, (str->str + str->len) - s + 1); } s = c; } c = str->str; str->str = ns; if (str->sp >= str->len) str->sp += expand; str->len += expand; str->str[str->len] = 0; str->maxsize = newsize; DohFree(c); return rcount; } } /* ----------------------------------------------------------------------------- * String_replace() * ----------------------------------------------------------------------------- */ static int String_replace(DOH *stro, const DOHString_or_char *token, const DOHString_or_char *rep, int flags) { int count = -1; String *str = (String *) ObjData(stro); if (flags & DOH_REPLACE_FIRST) count = 1; if (flags & DOH_REPLACE_ID_END) { return replace_simple(str, Char(token), Char(rep), flags, count, match_identifier_end); } else if (flags & DOH_REPLACE_ID_BEGIN) { return replace_simple(str, Char(token), Char(rep), flags, count, match_identifier_begin); } else if (flags & DOH_REPLACE_ID) { return replace_simple(str, Char(token), Char(rep), flags, count, match_identifier); } else if (flags & DOH_REPLACE_NUMBER_END) { return replace_simple(str, Char(token), Char(rep), flags, count, match_number_end); } else { return replace_simple(str, Char(token), Char(rep), flags, count, match_simple); } } /* ----------------------------------------------------------------------------- * String_chop() * ----------------------------------------------------------------------------- */ static void String_chop(DOH *so) { char *c; String *str = (String *) ObjData(so); /* Replace trailing whitespace */ c = str->str + str->len - 1; while ((str->len > 0) && (isspace((int) *c))) { if (str->sp >= str->len) { str->sp--; if (*c == '\n') str->line--; } str->len--; c--; } str->str[str->len] = 0; assert(str->sp >= 0); str->hashkey = -1; } static void String_setfile(DOH *so, DOH *file) { DOH *fo; String *str = (String *) ObjData(so); if (!DohCheck(file)) { fo = NewString(file); Decref(fo); } else fo = file; Incref(fo); Delete(str->file); str->file = fo; } static DOH *String_getfile(DOH *so) { String *str = (String *) ObjData(so); return str->file; } static void String_setline(DOH *so, int line) { String *str = (String *) ObjData(so); str->line = line; } static int String_getline(DOH *so) { String *str = (String *) ObjData(so); return str->line; } static DohListMethods StringListMethods = { 0, /* doh_getitem */ 0, /* doh_setitem */ String_delitem, /* doh_delitem */ String_insert, /* doh_insitem */ String_delslice, /* doh_delslice */ }; static DohFileMethods StringFileMethods = { String_read, String_write, String_putc, String_getc, String_ungetc, String_seek, String_tell, 0, /* close */ }; static DohStringMethods StringStringMethods = { String_replace, String_chop, }; DohObjInfo DohStringType = { "String", /* objname */ DelString, /* doh_del */ CopyString, /* doh_copy */ String_clear, /* doh_clear */ String_str, /* doh_str */ String_data, /* doh_data */ String_dump, /* doh_dump */ String_len, /* doh_len */ String_hash, /* doh_hash */ String_cmp, /* doh_cmp */ String_equal, /* doh_equal */ 0, /* doh_first */ 0, /* doh_next */ String_setfile, /* doh_setfile */ String_getfile, /* doh_getfile */ String_setline, /* doh_setline */ String_getline, /* doh_getline */ 0, /* doh_mapping */ &StringListMethods, /* doh_sequence */ &StringFileMethods, /* doh_file */ &StringStringMethods, /* doh_string */ 0, /* doh_position */ 0 }; #define INIT_MAXSIZE 16 /* ----------------------------------------------------------------------------- * NewString() - Create a new string * ----------------------------------------------------------------------------- */ DOHString *DohNewString(const DOHString_or_char *so) { int l = 0, max; String *str; char *s; int hashkey = -1; if (DohCheck(so)) { str = (String *) ObjData(so); s = (char *) String_data((String *) so); l = s ? str->len : 0; hashkey = str->hashkey; } else { s = (char *) so; l = s ? (int) strlen(s) : 0; } str = (String *) DohMalloc(sizeof(String)); str->hashkey = hashkey; str->sp = 0; str->line = 1; str->file = 0; max = INIT_MAXSIZE; if (s) { if ((l + 1) > max) max = l + 1; } str->str = (char *) DohMalloc(max); str->maxsize = max; if (s) { strcpy(str->str, s); str->len = l; str->sp = l; } else { str->str[0] = 0; str->len = 0; } return DohObjMalloc(&DohStringType, str); } /* ----------------------------------------------------------------------------- * NewStringEmpty() - Create a new string * ----------------------------------------------------------------------------- */ DOHString *DohNewStringEmpty(void) { int max = INIT_MAXSIZE; String *str = (String *) DohMalloc(sizeof(String)); str->hashkey = 0; str->sp = 0; str->line = 1; str->file = 0; str->str = (char *) DohMalloc(max); str->maxsize = max; str->str[0] = 0; str->len = 0; return DohObjMalloc(&DohStringType, str); } /* ----------------------------------------------------------------------------- * NewStringWithSize() - Create a new string * ----------------------------------------------------------------------------- */ DOHString *DohNewStringWithSize(const DOHString_or_char *so, int len) { int l = 0, max; String *str; char *s; if (DohCheck(so)) { s = (char *) String_data((String *) so); } else { s = (char *) so; } str = (String *) DohMalloc(sizeof(String)); str->hashkey = -1; str->sp = 0; str->line = 1; str->file = 0; max = INIT_MAXSIZE; if (s) { l = (int) len; if ((l + 1) > max) max = l + 1; } str->str = (char *) DohMalloc(max); str->maxsize = max; if (s) { strncpy(str->str, s, len); str->str[l] = 0; str->len = l; str->sp = l; } else { str->str[0] = 0; str->len = 0; } return DohObjMalloc(&DohStringType, str); } /* ----------------------------------------------------------------------------- * NewStringf() * * Create a new string from a list of objects. * ----------------------------------------------------------------------------- */ DOHString *DohNewStringf(const DOHString_or_char *fmt, ...) { va_list ap; DOH *r; va_start(ap, fmt); r = NewStringEmpty(); DohvPrintf(r, Char(fmt), ap); va_end(ap); return (DOHString *) r; } /* ----------------------------------------------------------------------------- * Strcmp() * Strncmp() * Strstr() * Strchr() * * Some utility functions. * ----------------------------------------------------------------------------- */ int DohStrcmp(const DOHString_or_char *s1, const DOHString_or_char *s2) { const char *c1 = Char(s1); const char *c2 = Char(s2); return strcmp(c1, c2); } int DohStrncmp(const DOHString_or_char *s1, const DOHString_or_char *s2, int n) { return strncmp(Char(s1), Char(s2), n); } char *DohStrstr(const DOHString_or_char *s1, const DOHString_or_char *s2) { char *p1 = Char(s1); char *p2 = Char(s2); return p1 == 0 || p2 == 0 || *p2 == '\0' ? p1 : strstr(p1, p2); } char *DohStrchr(const DOHString_or_char *s1, int ch) { return strchr(Char(s1), ch); } swig-3.0.12/Source/DOH/dohint.h0000664000175000017500000001137413042756442015753 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * dohint.h * * This file describes internally managed objects. * ----------------------------------------------------------------------------- */ #ifndef _DOHINT_H #define _DOHINT_H #include "doh.h" #include #include #include #include #include #include /* Hash objects */ typedef struct { DOH *(*doh_getattr) (DOH *obj, DOH *name); /* Get attribute */ int (*doh_setattr) (DOH *obj, DOH *name, DOH *value); /* Set attribute */ int (*doh_delattr) (DOH *obj, DOH *name); /* Del attribute */ DOH *(*doh_keys) (DOH *obj); /* All keys as a list */ } DohHashMethods; /* List objects */ typedef struct { DOH *(*doh_getitem) (DOH *obj, int index); /* Get item */ int (*doh_setitem) (DOH *obj, int index, DOH *value); /* Set item */ int (*doh_delitem) (DOH *obj, int index); /* Delete item */ int (*doh_insitem) (DOH *obj, int index, DOH *value); /* Insert item */ int (*doh_delslice) (DOH *obj, int sindex, int eindex); /* Delete slice */ } DohListMethods; /* File methods */ typedef struct { int (*doh_read) (DOH *obj, void *buffer, int nbytes); /* Read bytes */ int (*doh_write) (DOH *obj, const void *buffer, int nbytes); /* Write bytes */ int (*doh_putc) (DOH *obj, int ch); /* Put character */ int (*doh_getc) (DOH *obj); /* Get character */ int (*doh_ungetc) (DOH *obj, int ch); /* Unget character */ int (*doh_seek) (DOH *obj, long offset, int whence); /* Seek */ long (*doh_tell) (DOH *obj); /* Tell */ int (*doh_close) (DOH *obj); /* Close */ } DohFileMethods; /* String methods */ typedef struct { int (*doh_replace) (DOH *obj, const DOHString_or_char *old, const DOHString_or_char *rep, int flags); void (*doh_chop) (DOH *obj); } DohStringMethods; /* ----------------------------------------------------------------------------- * DohObjInfo * ----------------------------------------------------------------------------- */ typedef struct DohObjInfo { const char *objname; /* Object name */ /* Basic object methods */ void (*doh_del) (DOH *obj); /* Delete object */ DOH *(*doh_copy) (DOH *obj); /* Copy and object */ void (*doh_clear) (DOH *obj); /* Clear an object */ /* I/O methods */ DOH *(*doh_str) (DOH *obj); /* Make a full string */ void *(*doh_data) (DOH *obj); /* Return raw data */ int (*doh_dump) (DOH *obj, DOH *out); /* Serialize on out */ /* Length and hash values */ int (*doh_len) (DOH *obj); int (*doh_hashval) (DOH *obj); /* Compare */ int (*doh_cmp) (DOH *obj1, DOH *obj2); /* Equal */ int (*doh_equal) (DOH *obj1, DOH *obj2); /* Iterators */ DohIterator (*doh_first) (DOH *obj); DohIterator (*doh_next) (DohIterator); /* Positional */ void (*doh_setfile) (DOH *obj, DOHString_or_char *file); DOH *(*doh_getfile) (DOH *obj); void (*doh_setline) (DOH *obj, int line); int (*doh_getline) (DOH *obj); DohHashMethods *doh_hash; /* Hash methods */ DohListMethods *doh_list; /* List methods */ DohFileMethods *doh_file; /* File methods */ DohStringMethods *doh_string; /* String methods */ void *doh_reserved; /* Reserved */ void *clientdata; /* User data */ } DohObjInfo; typedef struct { void *data; /* Data pointer */ DohObjInfo *type; void *meta; /* Meta data */ unsigned int flag_intern:1; /* Interned object */ unsigned int flag_marked:1; /* Mark flag. Used to avoid recursive loops in places */ unsigned int flag_user:1; /* User flag */ unsigned int flag_usermark:1; /* User marked */ unsigned int refcount:28; /* Reference count (max 16 million) */ } DohBase; /* Macros for decrefing and increfing (safe for null objects). */ #define Decref(a) if (a) ((DohBase *) a)->refcount-- #define Incref(a) if (a) ((DohBase *) a)->refcount++ #define Refcount(a) ((DohBase *) a)->refcount /* Macros for manipulating objects in a safe manner */ #define ObjData(a) ((DohBase *)a)->data #define ObjSetMark(a,x) ((DohBase *)a)->flag_marked = x #define ObjGetMark(a) ((DohBase *)a)->flag_marked #define ObjType(a) ((DohBase *)a)->type extern DOH *DohObjMalloc(DohObjInfo *type, void *data); /* Allocate a DOH object */ extern void DohObjFree(DOH *ptr); /* Free a DOH object */ #endif /* DOHINT_H */ swig-3.0.12/Source/DOH/file.c0000664000175000017500000001725213042756442015401 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * file.c * * This file implements a file-like object that can be built around an * ordinary FILE * or integer file descriptor. * ----------------------------------------------------------------------------- */ #include "dohint.h" #ifdef DOH_INTFILE #include #endif #include typedef struct { FILE *filep; int fd; int closeondel; } DohFile; /* ----------------------------------------------------------------------------- * DelFile() * ----------------------------------------------------------------------------- */ static void DelFile(DOH *fo) { DohFile *f = (DohFile *) ObjData(fo); if (f->closeondel) { if (f->filep) { fclose(f->filep); } #ifdef DOH_INTFILE if (f->fd) { close(f->fd); } #endif } DohFree(f); } /* ----------------------------------------------------------------------------- * File_read() * ----------------------------------------------------------------------------- */ static int File_read(DOH *fo, void *buffer, int len) { DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { return (int)fread(buffer, 1, len, f->filep); } else if (f->fd) { #ifdef DOH_INTFILE return read(f->fd, buffer, len); #endif } return -1; } /* ----------------------------------------------------------------------------- * File_write() * ----------------------------------------------------------------------------- */ static int File_write(DOH *fo, const void *buffer, int len) { DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { int ret = (int) fwrite(buffer, 1, len, f->filep); int err = (ret != len) ? ferror(f->filep) : 0; return err ? -1 : ret; } else if (f->fd) { #ifdef DOH_INTFILE return write(f->fd, buffer, len); #endif } return -1; } /* ----------------------------------------------------------------------------- * File_seek() * ----------------------------------------------------------------------------- */ static int File_seek(DOH *fo, long offset, int whence) { DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { return fseek(f->filep, offset, whence); } else if (f->fd) { #ifdef DOH_INTFILE return lseek(f->fd, offset, whence); #endif } return -1; } /* ----------------------------------------------------------------------------- * File_tell() * ----------------------------------------------------------------------------- */ static long File_tell(DOH *fo) { DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { return ftell(f->filep); } else if (f->fd) { #ifdef DOH_INTFILE return lseek(f->fd, 0, SEEK_CUR); #endif } return -1; } /* ----------------------------------------------------------------------------- * File_putc() * ----------------------------------------------------------------------------- */ static int File_putc(DOH *fo, int ch) { DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { return fputc(ch, f->filep); } else if (f->fd) { #ifdef DOH_INTFILE char c; c = (char) ch; return write(f->fd, &c, 1); #endif } return -1; } /* ----------------------------------------------------------------------------- * File_getc() * ----------------------------------------------------------------------------- */ static int File_getc(DOH *fo) { DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { return fgetc(f->filep); } else if (f->fd) { #ifdef DOH_INTFILE unsigned char c; if (read(f->fd, &c, 1) < 0) return EOF; return c; #endif } return EOF; } /* ----------------------------------------------------------------------------- * File_ungetc() * * Put a character back onto the input * ----------------------------------------------------------------------------- */ static int File_ungetc(DOH *fo, int ch) { DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { return ungetc(ch, f->filep); } else if (f->fd) { #ifdef DOH_INTFILE /* Not implemented yet */ #endif } return -1; } /* ----------------------------------------------------------------------------- * File_close() * * Close the file * ----------------------------------------------------------------------------- */ static int File_close(DOH *fo) { int ret = 0; DohFile *f = (DohFile *) ObjData(fo); if (f->filep) { ret = fclose(f->filep); f->filep = 0; } else if (f->fd) { #ifdef DOH_INTFILE ret = close(f->fd); f->fd = 0; #endif } return ret; } static DohFileMethods FileFileMethods = { File_read, File_write, File_putc, File_getc, File_ungetc, File_seek, File_tell, File_close, /* close */ }; static DohObjInfo DohFileType = { "DohFile", /* objname */ DelFile, /* doh_del */ 0, /* doh_copy */ 0, /* doh_clear */ 0, /* doh_str */ 0, /* doh_data */ 0, /* doh_dump */ 0, /* doh_len */ 0, /* doh_hash */ 0, /* doh_cmp */ 0, /* doh_equal */ 0, /* doh_first */ 0, /* doh_next */ 0, /* doh_setfile */ 0, /* doh_getfile */ 0, /* doh_setline */ 0, /* doh_getline */ 0, /* doh_mapping */ 0, /* doh_sequence */ &FileFileMethods, /* doh_file */ 0, /* doh_string */ 0, /* doh_callable */ 0, /* doh_position */ }; /* ----------------------------------------------------------------------------- * NewFile() * * Create a new file from a given filename and mode. * If newfiles is non-zero, the filename is added to the list of new files. * ----------------------------------------------------------------------------- */ DOH *DohNewFile(DOH *filename, const char *mode, DOHList *newfiles) { DohFile *f; FILE *file; char *filen; filen = Char(filename); file = fopen(filen, mode); if (!file) return 0; f = (DohFile *) DohMalloc(sizeof(DohFile)); if (!f) { fclose(file); return 0; } if (newfiles) Append(newfiles, filename); f->filep = file; f->fd = 0; f->closeondel = 1; return DohObjMalloc(&DohFileType, f); } /* ----------------------------------------------------------------------------- * NewFileFromFile() * * Create a file object from an already open FILE *. * ----------------------------------------------------------------------------- */ DOH *DohNewFileFromFile(FILE *file) { DohFile *f; f = (DohFile *) DohMalloc(sizeof(DohFile)); if (!f) return 0; f->filep = file; f->fd = 0; f->closeondel = 0; return DohObjMalloc(&DohFileType, f); } /* ----------------------------------------------------------------------------- * NewFileFromFd() * * Create a file object from an already open FILE *. * ----------------------------------------------------------------------------- */ DOH *DohNewFileFromFd(int fd) { DohFile *f; f = (DohFile *) DohMalloc(sizeof(DohFile)); if (!f) return 0; f->filep = 0; f->fd = fd; f->closeondel = 0; return DohObjMalloc(&DohFileType, f); } /* ----------------------------------------------------------------------------- * FileErrorDisplay() * * Display cause of one of the NewFile functions failing. * ----------------------------------------------------------------------------- */ void DohFileErrorDisplay(DOHString * filename) { Printf(stderr, "Unable to open file %s: %s\n", filename, strerror(errno)); } swig-3.0.12/Source/DOH/memory.c0000664000175000017500000001434213042756442015767 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * memory.c * * This file implements all of DOH's memory management including allocation * of objects and checking of objects. * ----------------------------------------------------------------------------- */ #include "dohint.h" #ifndef DOH_POOL_SIZE #define DOH_POOL_SIZE 16384 #endif /* Checks stale DOH object use - will use a lot more memory as pool memory is not re-used. */ /* #define DOH_DEBUG_MEMORY_POOLS */ static int PoolSize = DOH_POOL_SIZE; DOH *DohNone = 0; /* The DOH None object */ typedef struct pool { DohBase *ptr; /* Start of pool */ int len; /* Length of pool */ int blen; /* Byte length of pool */ int current; /* Current position for next allocation */ char *pbeg; /* Beg of pool */ char *pend; /* End of pool */ struct pool *next; /* Next pool */ } Pool; static DohBase *FreeList = 0; /* List of free objects */ static Pool *Pools = 0; static int pools_initialized = 0; /* ---------------------------------------------------------------------- * CreatePool() - Create a new memory pool * ---------------------------------------------------------------------- */ static void CreatePool() { Pool *p = 0; p = (Pool *) DohMalloc(sizeof(Pool)); assert(p); p->ptr = (DohBase *) DohMalloc(sizeof(DohBase) * PoolSize); assert(p->ptr); memset(p->ptr, 0, sizeof(DohBase) * PoolSize); p->len = PoolSize; p->blen = PoolSize * sizeof(DohBase); p->current = 0; p->pbeg = ((char *) p->ptr); p->pend = p->pbeg + p->blen; p->next = Pools; Pools = p; } /* ---------------------------------------------------------------------- * InitPools() - Initialize the memory allocator * ---------------------------------------------------------------------- */ static void InitPools() { if (pools_initialized) return; CreatePool(); /* Create initial pool */ pools_initialized = 1; DohNone = NewVoid(0, 0); /* Create the None object */ DohIntern(DohNone); } /* ---------------------------------------------------------------------- * DohCheck() * * Returns 1 if an arbitrary pointer is a DOH object. * ---------------------------------------------------------------------- */ int DohCheck(const DOH *ptr) { register Pool *p = Pools; register char *cptr = (char *) ptr; while (p) { if ((cptr >= p->pbeg) && (cptr < p->pend)) { #ifdef DOH_DEBUG_MEMORY_POOLS DohBase *b = (DohBase *) ptr; int DOH_object_already_deleted = b->type == 0; assert(!DOH_object_already_deleted); #endif return 1; } /* pptr = (char *) p->ptr; if ((cptr >= pptr) && (cptr < (pptr+(p->current*sizeof(DohBase))))) return 1; */ p = p->next; } return 0; } /* ----------------------------------------------------------------------------- * DohIntern() * ----------------------------------------------------------------------------- */ void DohIntern(DOH *obj) { DohBase *b = (DohBase *) obj; b->flag_intern = 1; } /* ---------------------------------------------------------------------- * DohObjMalloc() * * Allocate memory for a new object. * ---------------------------------------------------------------------- */ DOH *DohObjMalloc(DohObjInfo *type, void *data) { DohBase *obj; if (!pools_initialized) InitPools(); #ifndef DOH_DEBUG_MEMORY_POOLS if (FreeList) { obj = FreeList; FreeList = (DohBase *) obj->data; } else { #endif while (Pools->current == Pools->len) { CreatePool(); } obj = Pools->ptr + Pools->current; ++Pools->current; #ifndef DOH_DEBUG_MEMORY_POOLS } #endif obj->type = type; obj->data = data; obj->meta = 0; obj->refcount = 1; obj->flag_intern = 0; obj->flag_marked = 0; obj->flag_user = 0; obj->flag_usermark = 0; return (DOH *) obj; } /* ---------------------------------------------------------------------- * DohObjFree() - Free a DOH object * ---------------------------------------------------------------------- */ void DohObjFree(DOH *ptr) { DohBase *b, *meta; b = (DohBase *) ptr; if (b->flag_intern) return; meta = (DohBase *) b->meta; b->data = (void *) FreeList; b->meta = 0; b->type = 0; b->refcount = 0; FreeList = b; if (meta) { Delete(meta); } } /* ---------------------------------------------------------------------- * DohMemoryDebug() * * Display memory usage statistics * ---------------------------------------------------------------------- */ void DohMemoryDebug(void) { extern DohObjInfo DohStringType; extern DohObjInfo DohListType; extern DohObjInfo DohHashType; Pool *p; int totsize = 0; int totused = 0; int totfree = 0; int numstring = 0; int numlist = 0; int numhash = 0; printf("Memory statistics:\n\n"); printf("Pools:\n"); p = Pools; while (p) { /* Calculate number of used, free items */ int i; int nused = 0, nfree = 0; for (i = 0; i < p->len; i++) { if (p->ptr[i].refcount <= 0) nfree++; else { nused++; if (p->ptr[i].type == &DohStringType) numstring++; else if (p->ptr[i].type == &DohListType) numlist++; else if (p->ptr[i].type == &DohHashType) numhash++; } } printf(" Pool %8p: size = %10d. used = %10d. free = %10d\n", (void *) p, p->len, nused, nfree); totsize += p->len; totused += nused; totfree += nfree; p = p->next; } printf("\n Total: size = %10d, used = %10d, free = %10d\n", totsize, totused, totfree); printf("\nObject types\n"); printf(" Strings : %d\n", numstring); printf(" Lists : %d\n", numlist); printf(" Hashes : %d\n", numhash); #if 0 p = Pools; while (p) { int i; for (i = 0; i < p->len; i++) { if (p->ptr[i].refcount > 0) { if (p->ptr[i].type == &DohStringType) { Printf(stdout, "%s\n", p->ptr + i); } } } p = p->next; } #endif } swig-3.0.12/Source/DOH/fio.c0000664000175000017500000003225213042756442015234 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * fio.c * * This file implements a number of standard I/O operations included * formatted output, readline, and splitting. * ----------------------------------------------------------------------------- */ #include "dohint.h" #define OBUFLEN 512 static DOH *encodings = 0; /* Encoding hash */ /* ----------------------------------------------------------------------------- * Writen() * * Writes N characters of output and retries until all characters are * written. This is useful should a write operation encounter a spurious signal. * ----------------------------------------------------------------------------- */ static int Writen(DOH *out, void *buffer, int len) { int nw = len, ret; char *cb = (char *) buffer; while (nw) { ret = Write(out, cb, nw); if (ret < 0) return -1; nw = nw - ret; cb += ret; } return len; } /* ----------------------------------------------------------------------------- * DohEncoding() * * Registers a new printf encoding method. An encoder function should accept * two file-like objects and operate as a filter. * ----------------------------------------------------------------------------- */ void DohEncoding(const char *name, DOH *(*fn) (DOH *s)) { DohFuncPtr_t fp; if (!encodings) encodings = NewHash(); fp.func = fn; Setattr(encodings, (void *) name, NewVoid(fp.p, 0)); } /* internal function for processing an encoding */ static DOH *encode(char *name, DOH *s) { DOH *handle, *ns; DohFuncPtr_t fp; long pos; char *cfmt = strchr(name, ':'); DOH *tmp = 0; if (cfmt) { tmp = NewString(cfmt + 1); Append(tmp, s); Setfile(tmp, Getfile((DOH *) s)); Setline(tmp, Getline((DOH *) s)); *cfmt = '\0'; } if (!encodings || !(handle = Getattr(encodings, name))) { return Copy(s); } if (tmp) s = tmp; pos = Tell(s); Seek(s, 0, SEEK_SET); fp.p = Data(handle); ns = (*fp.func) (s); assert(pos != -1); (void)Seek(s, pos, SEEK_SET); if (tmp) Delete(tmp); return ns; } /* ----------------------------------------------------------------------------- * DohvPrintf() * * DOH implementation of printf. Output can be directed to any file-like object * including bare FILE * objects. The same formatting codes as printf are * recognized with two extensions: * * %s - Prints a "char *" or the string representation of any * DOH object. This will implicitly result in a call to * Str(obj). * * %(encoder)* - Filters the output through an encoding function registered * with DohEncoder(). * * Note: This function is not particularly memory efficient with large strings. * It's better to use Dump() or some other method instead. * ----------------------------------------------------------------------------- */ int DohvPrintf(DOH *so, const char *format, va_list ap) { static const char *fmt_codes = "dioxXucsSfeEgGpn"; int state = 0; const char *p = format; char newformat[256]; char obuffer[OBUFLEN]; char *fmt = 0; char temp[64]; int widthval = 0; int precval = 0; int maxwidth; char *w = 0; int ivalue; double dvalue; void *pvalue; char *stemp; int nbytes = 0; char encoder[128], *ec = 0; int plevel = 0; memset(newformat, 0, sizeof(newformat)); while (*p) { switch (state) { case 0: /* Ordinary text */ if (*p != '%') { Putc(*p, so); nbytes++; } else { fmt = newformat; widthval = 0; precval = 0; *(fmt++) = *p; encoder[0] = 0; state = 10; } break; case 10: /* Look for a width and precision */ if (isdigit((int) *p) && (*p != '0')) { w = temp; *(w++) = *p; *(fmt++) = *p; state = 20; } else if (strchr(fmt_codes, *p)) { /* Got one of the formatting codes */ p--; state = 100; } else if (*p == '*') { /* Width field is specified in the format list */ widthval = va_arg(ap, int); sprintf(temp, "%d", widthval); for (w = temp; *w; w++) { *(fmt++) = *w; } state = 30; } else if (*p == '%') { Putc(*p, so); fmt = newformat; nbytes++; state = 0; } else if (*p == '(') { ++plevel; ec = encoder; state = 60; } else { *(fmt++) = *p; } break; case 20: /* Hmmm. At the start of a width field */ if (isdigit((int) *p)) { *(w++) = *p; *(fmt++) = *p; } else if (strchr(fmt_codes, *p)) { /* Got one of the formatting codes */ /* Figure out width */ *w = 0; widthval = atoi(temp); p--; state = 100; } else if (*p == '.') { *w = 0; widthval = atoi(temp); w = temp; *(fmt++) = *p; state = 40; } else { /* ??? */ *w = 0; widthval = atoi(temp); state = 50; } break; case 30: /* Parsed a width from an argument. Look for a . */ if (*p == '.') { w = temp; *(fmt++) = *p; state = 40; } else if (strchr(fmt_codes, *p)) { /* Got one of the formatting codes */ /* Figure out width */ p--; state = 100; } else { /* hmmm. Something else. */ state = 50; } break; case 40: /* Start of precision expected */ if (isdigit((int) *p) && (*p != '0')) { *(fmt++) = *p; *(w++) = *p; state = 41; } else if (*p == '*') { /* Precision field is specified in the format list */ precval = va_arg(ap, int); sprintf(temp, "%d", precval); for (w = temp; *w; w++) { *(fmt++) = *w; } state = 50; } else if (strchr(fmt_codes, *p)) { p--; state = 100; } else { *(fmt++) = *p; state = 50; } break; case 41: if (isdigit((int) *p)) { *(fmt++) = *p; *(w++) = *p; } else if (strchr(fmt_codes, *p)) { /* Got one of the formatting codes */ /* Figure out width */ *w = 0; precval = atoi(temp); p--; state = 100; } else { *w = 0; precval = atoi(temp); *(fmt++) = *p; state = 50; } break; /* Hang out, wait for format specifier */ case 50: if (strchr(fmt_codes, *p)) { p--; state = 100; } else { *(fmt++) = *p; } break; /* Got an encoding header */ case 60: if (*p == '(') { ++plevel; *ec = *p; ec++; } else if (*p == ')') { --plevel; if (plevel <= 0) { *ec = 0; state = 10; } else { *ec = *p; ec++; } } else { *ec = *p; ec++; } break; case 100: /* Got a formatting code */ if (widthval < precval) maxwidth = precval; else maxwidth = widthval; if ((*p == 's') || (*p == 'S')) { /* Null-Terminated string */ DOH *doh; DOH *Sval; DOH *enc = 0; doh = va_arg(ap, DOH *); if (DohCheck(doh)) { /* Is a DOH object. */ if (DohIsString(doh)) { Sval = doh; } else { Sval = Str(doh); } if (strlen(encoder)) { enc = encode(encoder, Sval); maxwidth = maxwidth + (int)strlen(newformat) + Len(enc); } else { maxwidth = maxwidth + (int)strlen(newformat) + Len(Sval); } *(fmt++) = 's'; *fmt = 0; if ((maxwidth + 1) < OBUFLEN) { stemp = obuffer; } else { stemp = (char *) DohMalloc(maxwidth + 1); } if (enc) { nbytes += sprintf(stemp, newformat, Data(enc)); } else { nbytes += sprintf(stemp, newformat, Data(Sval)); } if (Writen(so, stemp, (int)strlen(stemp)) < 0) return -1; if ((DOH *) Sval != doh) { Delete(Sval); } if (enc) Delete(enc); if (*p == 'S') { Delete(doh); } if (stemp != obuffer) { DohFree(stemp); } } else { if (!doh) doh = (char *) ""; if (strlen(encoder)) { DOH *s = NewString(doh); Seek(s, 0, SEEK_SET); enc = encode(encoder, s); Delete(s); doh = Char(enc); } else { enc = 0; } maxwidth = maxwidth + (int)strlen(newformat) + (int)strlen((char *) doh); *(fmt++) = 's'; *fmt = 0; if ((maxwidth + 1) < OBUFLEN) { stemp = obuffer; } else { stemp = (char *) DohMalloc(maxwidth + 1); } nbytes += sprintf(stemp, newformat, doh); if (Writen(so, stemp, (int)strlen(stemp)) < 0) return -1; if (stemp != obuffer) { DohFree(stemp); } if (enc) Delete(enc); } } else { *(fmt++) = *p; *fmt = 0; maxwidth = maxwidth + (int)strlen(newformat) + 64; /* Only allocate a buffer if it is too big to fit. Shouldn't have to do this very often */ if (maxwidth < OBUFLEN) stemp = obuffer; else stemp = (char *) DohMalloc(maxwidth + 1); switch (*p) { case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': case 'c': ivalue = va_arg(ap, int); nbytes += sprintf(stemp, newformat, ivalue); break; case 'f': case 'g': case 'e': case 'E': case 'G': dvalue = va_arg(ap, double); nbytes += sprintf(stemp, newformat, dvalue); break; case 'p': pvalue = va_arg(ap, void *); nbytes += sprintf(stemp, newformat, pvalue); break; default: break; } if (Writen(so, stemp, (int)strlen(stemp)) < 0) return -1; if (stemp != obuffer) DohFree(stemp); } state = 0; break; } p++; } if (state) { int r; *fmt = 0; r = Writen(so, fmt, (int)strlen(fmt)); if (r < 0) return -1; nbytes += r; } return nbytes; } /* ----------------------------------------------------------------------------- * DohPrintf() * * Variable length argument entry point to Printf * ----------------------------------------------------------------------------- */ int DohPrintf(DOH *obj, const char *format, ...) { va_list ap; int ret; va_start(ap, format); ret = DohvPrintf(obj, format, ap); va_end(ap); return ret; } /* ----------------------------------------------------------------------------- * DohPrintv() * * Print a null-terminated variable length list of DOH objects * ----------------------------------------------------------------------------- */ int DohPrintv(DOHFile * f, ...) { va_list ap; int ret = 0; DOH *obj; va_start(ap, f); while (1) { obj = va_arg(ap, void *); if ((!obj) || (obj == DohNone)) break; if (DohCheck(obj)) { ret += DohDump(obj, f); } else { ret += DohWrite(f, obj, (int)strlen((char *) obj)); } } va_end(ap); return ret; } /* ----------------------------------------------------------------------------- * DohCopyto() * * Copies all of the input from an input stream to an output stream. Returns the * number of bytes copied. * ----------------------------------------------------------------------------- */ int DohCopyto(DOH *in, DOH *out) { int nbytes = 0, ret; int nwrite = 0, wret; char *cw; char buffer[16384]; if ((!in) || (!out)) return 0; while (1) { ret = Read(in, buffer, 16384); if (ret > 0) { nwrite = ret; cw = buffer; while (nwrite) { wret = Write(out, cw, nwrite); if (wret < 0) { nbytes = -1; break; } nwrite = nwrite - wret; cw += wret; } nbytes += ret; } else { break; } } return nbytes; } /* ----------------------------------------------------------------------------- * DohSplit() * * Split an input stream into a list of strings delimited by the specified * character. Optionally accepts a maximum number of splits to perform. * ----------------------------------------------------------------------------- */ DOH *DohSplit(DOH *in, char ch, int nsplits) { DOH *list; DOH *str; int c; list = NewList(); if (DohIsString(in)) { Seek(in, 0, SEEK_SET); } while (1) { str = NewStringEmpty(); do { c = Getc(in); } while ((c != EOF) && (c == ch)); if (c != EOF) { Putc(c, str); while (1) { c = Getc(in); if ((c == EOF) || ((c == ch) && (nsplits != 0))) break; Putc(c, str); } nsplits--; } Append(list, str); Delete(str); if (c == EOF) break; } return list; } /* ----------------------------------------------------------------------------- * DohSplitLines() * * Split an input stream into a list of strings delimited by newline characters. * ----------------------------------------------------------------------------- */ DOH *DohSplitLines(DOH *in) { DOH *list; DOH *str; int c = 0; list = NewList(); if (DohIsString(in)) { Seek(in, 0, SEEK_SET); } while (c != EOF) { str = NewStringEmpty(); while ((c = Getc(in)) != '\n' && c != EOF) { Putc(c, str); } Append(list, str); Delete(str); } return list; } /* ----------------------------------------------------------------------------- * DohReadline() * * Read a single input line and return it as a string. * ----------------------------------------------------------------------------- */ DOH *DohReadline(DOH *in) { char c; int n = 0; DOH *s = NewStringEmpty(); while (1) { if (Read(in, &c, 1) < 0) { if (n == 0) { Delete(s); s = 0; } break; } if (c == '\n') break; if (c == '\r') continue; Putc(c, s); n++; } return s; } swig-3.0.12/Source/DOH/README0000664000175000017500000001112513042756442015167 0ustar williamwilliamDOH (Dave's Object Hack) Overview: --------- DOH is a small C library that provides a number of simple yet powerful data structures. The data structures are built around a dynamic typing model in which any given object is allowed to support one or more classes of operations. Furthermore, a simple garbage collection scheme and a variety of interesting library methods are available. All and all, the operation of DOH makes massive abuse of the C type system and would probably make the language purists scream and performance addicts run away in horror. However, I really don't care--so there! However, for the rest of us, DOH is actually kind of fun to use. This is only a short description of the methods and is no way meant to be exhaustive. Common Operations (for all types) --------------------------------- Delete(obj) Decrease the reference count and destroy if zero Copy(obj) Make a copy of an object. Clear(obj) Clear an object. Setscope(obj) Set scope of an object (guru's only) Str(obj) Create a string representation of obj. Data(obj) Return pointer to raw data in an object Char(obj) Convert to a char * Len(obj) Length of an object Hash(obj) Hash value (used for mapping) Cmp(obj1,obj2) Compare two objects. Name(obj) Return the object name First(obj) Return first object (iterator) Next(obj) Return next object Dump(obj,out) Serialize on out Load(in) Unserialize from in First(obj) Iterator Next(iter) Next iterator Mapping Operations (for hash table behavior) -------------------------------------------- Getattr(hash,key) Get an attribute Setattr(hash,key,value) Set an attribute Delattr(hash,key) Delete an attribute First(hash) Get first object (iterator) Next(hash) Get next object GetInt(hash,key) Get attribute as an 'int' SetInt(hash,key,ivalue) Set attribute as an 'int' GetDouble(hash,key) Get attribute as a 'double' SetDouble(hash,key,dvalue) Set Attribute as a 'double' GetChar(hash,key) Get attribute as a 'char *' Sequence Operations ------------------- Getitem(list,index) Get an item Setitem(list,index,val) Set an item Delitem(list,index) Delete an item Insert(list,index,val) Insert an item Append(list,val) Append to end Push(list,val) Insert at beginning File Operations --------------- Read(obj,buffer,len) Read data Write(obj,buffer,len) Write data Getc(obj) Get a character Putc(ch,obj) Put a character Ungetc(ch,obj) Put character back on input stream Seek(obj,offset,whence) Seek Tell(obj) Return file pointer Delete(obj) Decrease the reference count, close file if zero String Operations ----------------- Replace(obj, orig, rep, flags) Replace occurrences of orig with rep. Chop(obj) Remove trailing whitespace flags is one of the following: DOH_REPLACE_ANY DOH_REPLACE_NOQUOTE DOH_REPLACE_ID DOH_REPLACE_FIRST Callable Operations ------------------- Call(obj, args) Perform a function call with arguments args. Miscellaneous library functions ------------------------------- NewScope() Create a new scope DelScope(s) Delete scope s Readline(in) Read a line of input from in Printf(out,fmt,...) Formatted output DohEncoding(name, fn) Register a format encoding for Printf Currently Available datatypes ------------------------------ NewString(char *initial) Strings NewHash() Hash NewList() List NewVoid(void *ptr, void (*del)(void *)) Void NewFile(char *filename, char *mode, List *newfiles) File NewCallable(DOH *(*func)(DOH *, DOH *)) Callable object Odds and ends: 1. All objects are of type 'DOH *' 2. When in doubt, see rule (1) 3. In certain cases, DOH performs implicit conversions of 'char *' to an appropriate DOH string representation. For operations involving files, DOH works with many kinds of objects including FILE *, DOH File objects, and DOH strings. Don't even ask how this works. 4. More complete documentation is forthcoming. swig-3.0.12/Source/DOH/list.c0000664000175000017500000002275713042756442015443 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * list.c * * Implements a simple list object. * ----------------------------------------------------------------------------- */ #include "dohint.h" typedef struct List { int maxitems; /* Max size */ int nitems; /* Num items */ DOH *file; int line; DOH **items; } List; extern DohObjInfo DohListType; /* Doubles amount of memory in a list */ static void more(List *l) { l->items = (void **) DohRealloc(l->items, l->maxitems * 2 * sizeof(void *)); assert(l->items); l->maxitems *= 2; } /* ----------------------------------------------------------------------------- * CopyList() * * Make a shallow copy of a list. * ----------------------------------------------------------------------------- */ static DOH *CopyList(DOH *lo) { List *l, *nl; int i; l = (List *) ObjData(lo); nl = (List *) DohMalloc(sizeof(List)); nl->nitems = l->nitems; nl->maxitems = l->maxitems; nl->items = (void **) DohMalloc(l->maxitems * sizeof(void *)); for (i = 0; i < l->nitems; i++) { nl->items[i] = l->items[i]; Incref(nl->items[i]); } nl->file = l->file; if (nl->file) Incref(nl->file); nl->line = l->line; return DohObjMalloc(&DohListType, nl); } /* ----------------------------------------------------------------------------- * DelList() * * Delete a list. * ----------------------------------------------------------------------------- */ static void DelList(DOH *lo) { List *l = (List *) ObjData(lo); int i; for (i = 0; i < l->nitems; i++) Delete(l->items[i]); DohFree(l->items); DohFree(l); } /* ----------------------------------------------------------------------------- * List_clear() * * Remove all of the list entries, but keep the list object intact. * ----------------------------------------------------------------------------- */ static void List_clear(DOH *lo) { List *l = (List *) ObjData(lo); int i; for (i = 0; i < l->nitems; i++) { Delete(l->items[i]); } l->nitems = 0; } /* ----------------------------------------------------------------------------- * List_insert() * * Insert an item into the list. If the item is not a DOH object, it is assumed * to be a 'char *' and is used to construct an equivalent string object. * ----------------------------------------------------------------------------- */ static int List_insert(DOH *lo, int pos, DOH *item) { List *l = (List *) ObjData(lo); int i; if (!item) return -1; if (!DohCheck(item)) { item = NewString(item); Decref(item); } if (pos == DOH_END) pos = l->nitems; if (pos < 0) pos = 0; if (pos > l->nitems) pos = l->nitems; if (l->nitems == l->maxitems) more(l); for (i = l->nitems; i > pos; i--) { l->items[i] = l->items[i - 1]; } l->items[pos] = item; Incref(item); l->nitems++; return 0; } /* ----------------------------------------------------------------------------- * List_remove() * * Remove an item from a list. * ----------------------------------------------------------------------------- */ static int List_remove(DOH *lo, int pos) { List *l = (List *) ObjData(lo); int i; if (pos == DOH_END) pos = l->nitems - 1; if (pos == DOH_BEGIN) pos = 0; assert(!((pos < 0) || (pos >= l->nitems))); Delete(l->items[pos]); for (i = pos; i < l->nitems - 1; i++) { l->items[i] = l->items[i + 1]; } l->nitems--; return 0; } /* ----------------------------------------------------------------------------- * List_len() * * Return the number of elements in the list * ----------------------------------------------------------------------------- */ static int List_len(DOH *lo) { List *l = (List *) ObjData(lo); return l->nitems; } /* ----------------------------------------------------------------------------- * List_get() * * Get the nth item from the list. * ----------------------------------------------------------------------------- */ static DOH *List_get(DOH *lo, int n) { List *l = (List *) ObjData(lo); if (n == DOH_END) n = l->nitems - 1; if (n == DOH_BEGIN) n = 0; assert(!((n < 0) || (n >= l->nitems))); return l->items[n]; } /* ----------------------------------------------------------------------------- * List_set() * * Set the nth item in the list replacing any previous item. * ----------------------------------------------------------------------------- */ static int List_set(DOH *lo, int n, DOH *val) { List *l = (List *) ObjData(lo); if (!val) return -1; assert(!((n < 0) || (n >= l->nitems))); if (!DohCheck(val)) { val = NewString(val); Decref(val); } Delete(l->items[n]); l->items[n] = val; Incref(val); Delete(val); return 0; } /* ----------------------------------------------------------------------------- * List_first() * * Return the first item in the list. * ----------------------------------------------------------------------------- */ static DohIterator List_first(DOH *lo) { DohIterator iter; List *l = (List *) ObjData(lo); iter.object = lo; iter._index = 0; iter._current = 0; iter.key = 0; if (l->nitems > 0) { iter.item = l->items[0]; } else { iter.item = 0; } return iter; } /* ----------------------------------------------------------------------------- * List_next() * * Return the next item in the list. * ----------------------------------------------------------------------------- */ static DohIterator List_next(DohIterator iter) { List *l = (List *) ObjData(iter.object); iter._index = iter._index + 1; if (iter._index >= l->nitems) { iter.item = 0; iter.key = 0; } else { iter.item = l->items[iter._index]; } return iter; } /* ----------------------------------------------------------------------------- * List_str() * * Create a string representation of the list. * ----------------------------------------------------------------------------- */ static DOH *List_str(DOH *lo) { DOH *s; int i; List *l = (List *) ObjData(lo); s = NewStringEmpty(); if (ObjGetMark(lo)) { Printf(s, "List(%p)", lo); return s; } ObjSetMark(lo, 1); Printf(s, "List[ "); for (i = 0; i < l->nitems; i++) { Printf(s, "%s", l->items[i]); if ((i + 1) < l->nitems) Printf(s, ", "); } Printf(s, " ]"); ObjSetMark(lo, 0); return s; } /* ----------------------------------------------------------------------------- * List_dump() * * Dump the items to an output stream. * ----------------------------------------------------------------------------- */ static int List_dump(DOH *lo, DOH *out) { int nsent = 0; int i, ret; List *l = (List *) ObjData(lo); for (i = 0; i < l->nitems; i++) { ret = Dump(l->items[i], out); if (ret < 0) return -1; nsent += ret; } return nsent; } static void List_setfile(DOH *lo, DOH *file) { DOH *fo; List *l = (List *) ObjData(lo); if (!DohCheck(file)) { fo = NewString(file); Decref(fo); } else fo = file; Incref(fo); Delete(l->file); l->file = fo; } static DOH *List_getfile(DOH *lo) { List *l = (List *) ObjData(lo); return l->file; } static void List_setline(DOH *lo, int line) { List *l = (List *) ObjData(lo); l->line = line; } static int List_getline(DOH *lo) { List *l = (List *) ObjData(lo); return l->line; } static DohListMethods ListListMethods = { List_get, List_set, List_remove, List_insert, 0, /* delslice */ }; DohObjInfo DohListType = { "List", /* objname */ DelList, /* doh_del */ CopyList, /* doh_copy */ List_clear, /* doh_clear */ List_str, /* doh_str */ 0, /* doh_data */ List_dump, /* doh_dump */ List_len, /* doh_len */ 0, /* doh_hash */ 0, /* doh_cmp */ 0, /* doh_equal */ List_first, /* doh_first */ List_next, /* doh_next */ List_setfile, /* doh_setfile */ List_getfile, /* doh_getfile */ List_setline, /* doh_setline */ List_getline, /* doh_getline */ 0, /* doh_mapping */ &ListListMethods, /* doh_sequence */ 0, /* doh_file */ 0, /* doh_string */ 0, /* doh_callable */ 0, /* doh_position */ }; /* ----------------------------------------------------------------------------- * NewList() * * Create a new list. * ----------------------------------------------------------------------------- */ #define MAXLISTITEMS 8 DOH *DohNewList(void) { List *l; int i; l = (List *) DohMalloc(sizeof(List)); l->nitems = 0; l->maxitems = MAXLISTITEMS; l->items = (void **) DohMalloc(l->maxitems * sizeof(void *)); for (i = 0; i < MAXLISTITEMS; i++) { l->items[i] = 0; } l->file = 0; l->line = 0; return DohObjMalloc(&DohListType, l); } static int (*List_sort_compare_func) (const DOH *, const DOH *); static int List_qsort_compare(const void *a, const void *b) { return List_sort_compare_func(*((DOH **) a), *((DOH **) b)); } /* Sort a list */ void DohSortList(DOH *lo, int (*cmp) (const DOH *, const DOH *)) { List *l = (List *) ObjData(lo); if (cmp) { List_sort_compare_func = cmp; } else { List_sort_compare_func = DohCmp; } qsort(l->items, l->nitems, sizeof(DOH *), List_qsort_compare); } swig-3.0.12/Source/DOH/void.c0000664000175000017500000000577713042756442015434 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * void.c * * Implements a "void" object that is really just a DOH container around * an arbitrary C object represented as a void *. * ----------------------------------------------------------------------------- */ #include "dohint.h" typedef struct { void *ptr; void (*del) (void *); } VoidObj; /* ----------------------------------------------------------------------------- * Void_delete() * * Delete a void object. Invokes the destructor supplied at the time of creation. * ----------------------------------------------------------------------------- */ static void Void_delete(DOH *vo) { VoidObj *v = (VoidObj *) ObjData(vo); if (v->del) (*v->del) (v->ptr); DohFree(v); } /* ----------------------------------------------------------------------------- * Void_copy() * * Copies a void object. This is only a shallow copy. The object destruction * function is not copied in order to avoid potential double-free problems. * ----------------------------------------------------------------------------- */ static DOH *Void_copy(DOH *vo) { VoidObj *v = (VoidObj *) ObjData(vo); return NewVoid(v->ptr, 0); } /* ----------------------------------------------------------------------------- * Void_data() * * Returns the void * stored in the object. * ----------------------------------------------------------------------------- */ static void *Void_data(DOH *vo) { VoidObj *v = (VoidObj *) ObjData(vo); return v->ptr; } static DohObjInfo DohVoidType = { "VoidObj", /* objname */ Void_delete, /* doh_del */ Void_copy, /* doh_copy */ 0, /* doh_clear */ 0, /* doh_str */ Void_data, /* doh_data */ 0, /* doh_dump */ 0, /* doh_len */ 0, /* doh_hash */ 0, /* doh_cmp */ 0, /* doh_equal */ 0, /* doh_first */ 0, /* doh_next */ 0, /* doh_setfile */ 0, /* doh_getfile */ 0, /* doh_setline */ 0, /* doh_getline */ 0, /* doh_mapping */ 0, /* doh_sequence */ 0, /* doh_file */ 0, /* doh_string */ 0, /* doh_reserved */ 0, /* clientdata */ }; /* ----------------------------------------------------------------------------- * NewVoid() * * Creates a new Void object given a void * and an optional destructor function. * ----------------------------------------------------------------------------- */ DOH *DohNewVoid(void *obj, void (*del) (void *)) { VoidObj *v; v = (VoidObj *) DohMalloc(sizeof(VoidObj)); v->ptr = obj; v->del = del; return DohObjMalloc(&DohVoidType, v); } swig-3.0.12/Source/DOH/doh.h0000664000175000017500000004166413042756442015245 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This file is part of SWIG, which is licensed as a whole under version 3 * (or any later version) of the GNU General Public License. Some additional * terms also apply to certain portions of SWIG. The full details of the SWIG * license and copyrights can be found in the LICENSE and COPYRIGHT files * included with the SWIG source code as distributed by the SWIG developers * and at http://www.swig.org/legal.html. * * doh.h * * This file describes of the externally visible functions in DOH. * ----------------------------------------------------------------------------- */ #ifndef _DOH_H #define _DOH_H #ifndef MACSWIG #include "swigconfig.h" #endif #include #include /* Set the namespace prefix for DOH API functions. This can be used to control visibility of the functions in libraries */ /* Set this macro if you want to change DOH linkage. You would do this if you wanted to hide DOH in a library using a different set of names. Note: simply change "Doh" to a new name. */ /* #define DOH_NAMESPACE(x) Doh ## x */ #ifdef DOH_NAMESPACE /* Namespace control. These macros define all of the public API names in DOH */ #define DohCheck DOH_NAMESPACE(Check) #define DohIntern DOH_NAMESPACE(Intern) #define DohDelete DOH_NAMESPACE(Delete) #define DohCopy DOH_NAMESPACE(Copy) #define DohClear DOH_NAMESPACE(Clear) #define DohStr DOH_NAMESPACE(Str) #define DohData DOH_NAMESPACE(Data) #define DohDump DOH_NAMESPACE(Dump) #define DohLen DOH_NAMESPACE(Len) #define DohHashval DOH_NAMESPACE(Hashval) #define DohCmp DOH_NAMESPACE(Cmp) #define DohEqual DOH_NAMESPACE(Equal) #define DohIncref DOH_NAMESPACE(Incref) #define DohCheckattr DOH_NAMESPACE(Checkattr) #define DohSetattr DOH_NAMESPACE(Setattr) #define DohDelattr DOH_NAMESPACE(Delattr) #define DohKeys DOH_NAMESPACE(Keys) #define DohGetInt DOH_NAMESPACE(GetInt) #define DohGetDouble DOH_NAMESPACE(GetDouble) #define DohGetChar DOH_NAMESPACE(GetChar) #define DohSetChar DOH_NAMESPACE(SetChar) #define DohSetInt DOH_NAMESPACE(SetInt) #define DohSetDouble DOH_NAMESPACE(SetDouble) #define DohSetVoid DOH_NAMESPACE(SetVoid) #define DohGetVoid DOH_NAMESPACE(GetVoid) #define DohGetitem DOH_NAMESPACE(Getitem) #define DohSetitem DOH_NAMESPACE(Setitem) #define DohDelitem DOH_NAMESPACE(Delitem) #define DohInsertitem DOH_NAMESPACE(Insertitem) #define DohDelslice DOH_NAMESPACE(Delslice) #define DohWrite DOH_NAMESPACE(Write) #define DohRead DOH_NAMESPACE(Read) #define DohSeek DOH_NAMESPACE(Seek) #define DohTell DOH_NAMESPACE(Tell) #define DohGetc DOH_NAMESPACE(Getc) #define DohPutc DOH_NAMESPACE(Putc) #define DohUngetc DOH_NAMESPACE(Ungetc) #define DohGetline DOH_NAMESPACE(Getline) #define DohSetline DOH_NAMESPACE(Setline) #define DohGetfile DOH_NAMESPACE(Getfile) #define DohSetfile DOH_NAMESPACE(Setfile) #define DohReplace DOH_NAMESPACE(Replace) #define DohChop DOH_NAMESPACE(Chop) #define DohGetmeta DOH_NAMESPACE(Getmeta) #define DohSetmeta DOH_NAMESPACE(Setmeta) #define DohDelmeta DOH_NAMESPACE(Delmeta) #define DohEncoding DOH_NAMESPACE(Encoding) #define DohPrintf DOH_NAMESPACE(Printf) #define DohvPrintf DOH_NAMESPACE(vPrintf) #define DohPrintv DOH_NAMESPACE(Printv) #define DohReadline DOH_NAMESPACE(Readline) #define DohIsMapping DOH_NAMESPACE(IsMapping) #define DohIsSequence DOH_NAMESPACE(IsSequence) #define DohIsString DOH_NAMESPACE(IsString) #define DohIsFile DOH_NAMESPACE(IsFile) #define DohNewString DOH_NAMESPACE(NewString) #define DohNewStringEmpty DOH_NAMESPACE(NewStringEmpty) #define DohNewStringWithSize DOH_NAMESPACE(NewStringWithSize) #define DohNewStringf DOH_NAMESPACE(NewStringf) #define DohStrcmp DOH_NAMESPACE(Strcmp) #define DohStrncmp DOH_NAMESPACE(Strncmp) #define DohStrstr DOH_NAMESPACE(Strstr) #define DohStrchr DOH_NAMESPACE(Strchr) #define DohNewFile DOH_NAMESPACE(NewFile) #define DohNewFileFromFile DOH_NAMESPACE(NewFileFromFile) #define DohNewFileFromFd DOH_NAMESPACE(NewFileFromFd) #define DohFileErrorDisplay DOH_NAMESPACE(FileErrorDisplay) #define DohClose DOH_NAMESPACE(Close) #define DohCopyto DOH_NAMESPACE(Copyto) #define DohNewList DOH_NAMESPACE(NewList) #define DohNewHash DOH_NAMESPACE(NewHash) #define DohNewVoid DOH_NAMESPACE(NewVoid) #define DohSplit DOH_NAMESPACE(Split) #define DohSplitLines DOH_NAMESPACE(SplitLines) #define DohNone DOH_NAMESPACE(None) #define DohCall DOH_NAMESPACE(Call) #define DohObjMalloc DOH_NAMESPACE(ObjMalloc) #define DohObjFree DOH_NAMESPACE(ObjFree) #define DohMemoryDebug DOH_NAMESPACE(MemoryDebug) #define DohStringType DOH_NAMESPACE(StringType) #define DohListType DOH_NAMESPACE(ListType) #define DohHashType DOH_NAMESPACE(HashType) #define DohFileType DOH_NAMESPACE(FileType) #define DohVoidType DOH_NAMESPACE(VoidType) #define DohIterator DOH_NAMESPACE(Iterator) #define DohFirst DOH_NAMESPACE(First) #define DohNext DOH_NAMESPACE(Next) #endif #define DOH_MAJOR_VERSION 0 #define DOH_MINOR_VERSION 1 typedef void DOH; /* * With dynamic typing, all DOH objects are technically of type 'void *'. * However, to clarify the reading of source code, the following symbolic * names are used. */ #define DOHString DOH #define DOHList DOH #define DOHHash DOH #define DOHFile DOH #define DOHVoid DOH #define DOHString_or_char DOH #define DOHObj_or_char DOH typedef const DOHString_or_char * const_String_or_char_ptr; typedef const DOHString_or_char * DOHconst_String_or_char_ptr; #define DOH_BEGIN -1 #define DOH_END -2 #define DOH_CUR -3 #define DOH_CURRENT -3 /* Iterator objects */ typedef struct { void *key; /* Current key (if any) */ void *item; /* Current item */ void *object; /* Object being iterated over */ void *_current; /* Internal use */ int _index; /* Internal use */ } DohIterator; /* Memory management */ #ifndef DohMalloc #define DohMalloc malloc #endif #ifndef DohRealloc #define DohRealloc realloc #endif #ifndef DohFree #define DohFree free #endif extern int DohCheck(const DOH *ptr); /* Check if a DOH object */ extern void DohIntern(DOH *); /* Intern an object */ /* Basic object methods. Common to most objects */ extern void DohDelete(DOH *obj); /* Delete an object */ extern DOH *DohCopy(const DOH *obj); extern void DohClear(DOH *obj); extern DOHString *DohStr(const DOH *obj); extern void *DohData(const DOH *obj); extern int DohDump(const DOH *obj, DOHFile * out); extern int DohLen(const DOH *obj); extern int DohHashval(const DOH *obj); extern int DohCmp(const DOH *obj1, const DOH *obj2); extern int DohEqual(const DOH *obj1, const DOH *obj2); extern void DohIncref(DOH *obj); /* Mapping methods */ extern DOH *DohGetattr(DOH *obj, const DOHString_or_char *name); extern int DohSetattr(DOH *obj, const DOHString_or_char *name, const DOHObj_or_char * value); extern int DohDelattr(DOH *obj, const DOHString_or_char *name); extern int DohCheckattr(DOH *obj, const DOHString_or_char *name, const DOHString_or_char *value); extern DOH *DohKeys(DOH *obj); extern int DohGetInt(DOH *obj, const DOHString_or_char *name); extern void DohSetInt(DOH *obj, const DOHString_or_char *name, int); extern double DohGetDouble(DOH *obj, const DOHString_or_char *name); extern void DohSetDouble(DOH *obj, const DOHString_or_char *name, double); extern char *DohGetChar(DOH *obj, const DOHString_or_char *name); extern void DohSetChar(DOH *obj, const DOH *name, char *value); extern void *DohGetFlagAttr(DOH *obj, const DOHString_or_char *name); extern int DohGetFlag(DOH *obj, const DOHString_or_char *name); extern void DohSetFlagAttr(DOH *obj, const DOHString_or_char *name, const DOHString_or_char *attr); extern void DohSetFlag(DOH *obj, const DOHString_or_char *name); extern void *DohGetVoid(DOH *obj, const DOHString_or_char *name); extern void DohSetVoid(DOH *obj, const DOHString_or_char *name, void *value); /* Sequence methods */ extern DOH *DohGetitem(DOH *obj, int index); extern int DohSetitem(DOH *obj, int index, const DOHObj_or_char * value); extern int DohDelitem(DOH *obj, int index); extern int DohInsertitem(DOH *obj, int index, const DOHObj_or_char * value); extern int DohDelslice(DOH *obj, int sindex, int eindex); /* File methods */ extern int DohWrite(DOHFile * obj, const void *buffer, int length); extern int DohRead(DOHFile * obj, void *buffer, int length); extern int DohSeek(DOHFile * obj, long offset, int whence); extern long DohTell(DOHFile * obj); extern int DohGetc(DOHFile * obj); extern int DohPutc(int ch, DOHFile * obj); extern int DohUngetc(int ch, DOHFile * obj); /* Iterators */ extern DohIterator DohFirst(DOH *obj); extern DohIterator DohNext(DohIterator x); /* Positional */ extern int DohGetline(const DOH *obj); extern void DohSetline(DOH *obj, int line); extern DOH *DohGetfile(const DOH *obj); extern void DohSetfile(DOH *obj, DOH *file); /* String Methods */ extern int DohReplace(DOHString * src, const DOHString_or_char *token, const DOHString_or_char *rep, int flags); extern void DohChop(DOHString * src); /* Meta-variables */ extern DOH *DohGetmeta(DOH *, const DOH *); extern int DohSetmeta(DOH *, const DOH *, const DOH *value); extern int DohDelmeta(DOH *, const DOH *); /* Utility functions */ extern void DohEncoding(const char *name, DOH *(*fn) (DOH *s)); extern int DohPrintf(DOHFile * obj, const char *format, ...); extern int DohvPrintf(DOHFile * obj, const char *format, va_list ap); extern int DohPrintv(DOHFile * obj, ...); extern DOH *DohReadline(DOHFile * in); /* Miscellaneous */ extern int DohIsMapping(const DOH *obj); extern int DohIsSequence(const DOH *obj); extern int DohIsString(const DOH *obj); extern int DohIsFile(const DOH *obj); extern void DohSetMaxHashExpand(int count); extern int DohGetMaxHashExpand(void); extern void DohSetmark(DOH *obj, int x); extern int DohGetmark(DOH *obj); /* ----------------------------------------------------------------------------- * Strings. * ----------------------------------------------------------------------------- */ extern DOHString *DohNewStringEmpty(void); extern DOHString *DohNewString(const DOHString_or_char *c); extern DOHString *DohNewStringWithSize(const DOHString_or_char *c, int len); extern DOHString *DohNewStringf(const DOHString_or_char *fmt, ...); extern int DohStrcmp(const DOHString_or_char *s1, const DOHString_or_char *s2); extern int DohStrncmp(const DOHString_or_char *s1, const DOHString_or_char *s2, int n); extern char *DohStrstr(const DOHString_or_char *s1, const DOHString_or_char *s2); extern char *DohStrchr(const DOHString_or_char *s1, int ch); /* String replacement flags */ #define DOH_REPLACE_ANY 0x01 #define DOH_REPLACE_NOQUOTE 0x02 #define DOH_REPLACE_ID 0x04 #define DOH_REPLACE_FIRST 0x08 #define DOH_REPLACE_ID_BEGIN 0x10 #define DOH_REPLACE_ID_END 0x20 #define DOH_REPLACE_NUMBER_END 0x40 #define Replaceall(s,t,r) DohReplace(s,t,r,DOH_REPLACE_ANY) #define Replaceid(s,t,r) DohReplace(s,t,r,DOH_REPLACE_ID) /* ----------------------------------------------------------------------------- * Files * ----------------------------------------------------------------------------- */ extern DOHFile *DohNewFile(DOH *filename, const char *mode, DOHList *outfiles); extern DOHFile *DohNewFileFromFile(FILE *f); extern DOHFile *DohNewFileFromFd(int fd); extern void DohFileErrorDisplay(DOHString * filename); /* Deprecated, just use DohDelete extern int DohClose(DOH *file); */ extern int DohCopyto(DOHFile * input, DOHFile * output); /* ----------------------------------------------------------------------------- * List * ----------------------------------------------------------------------------- */ extern DOHList *DohNewList(void); extern void DohSortList(DOH *lo, int (*cmp) (const DOH *, const DOH *)); /* ----------------------------------------------------------------------------- * Hash * ----------------------------------------------------------------------------- */ extern DOHHash *DohNewHash(void); /* ----------------------------------------------------------------------------- * Void * ----------------------------------------------------------------------------- */ extern DOHVoid *DohNewVoid(void *ptr, void (*del) (void *)); extern DOHList *DohSplit(DOHFile * input, char ch, int nsplits); extern DOHList *DohSplitLines(DOHFile * input); extern DOH *DohNone; /* Helper union for converting between function and object pointers. */ typedef union DohFuncPtr { void* p; DOH *(*func)(DOH *); } DohFuncPtr_t; extern void DohMemoryDebug(void); #ifndef DOH_LONG_NAMES /* Macros to invoke the above functions. Includes the location of the caller to simplify debugging if something goes wrong */ #define Delete DohDelete #define Copy DohCopy #define Clear DohClear #define Str DohStr #define Dump DohDump #define Getattr DohGetattr #define Setattr DohSetattr #define Delattr DohDelattr #define Checkattr DohCheckattr #define Hashval DohHashval #define Getitem DohGetitem #define Setitem DohSetitem #define Delitem DohDelitem #define Insert DohInsertitem #define Delslice DohDelslice #define Append(s,x) DohInsertitem(s,DOH_END,x) #define Push(s,x) DohInsertitem(s,DOH_BEGIN,x) #define Len DohLen #define Data DohData #define Char (char *) Data #define Cmp DohCmp #define Equal DohEqual #define Setline DohSetline #define Getline DohGetline #define Setfile DohSetfile #define Getfile DohGetfile #define Write DohWrite #define Read DohRead #define Seek DohSeek #define Tell DohTell #define Printf DohPrintf #define Printv DohPrintv #define Getc DohGetc #define Putc DohPutc #define Ungetc DohUngetc /* #define StringPutc DohStringPutc */ /* #define StringGetc DohStringGetc */ /* #define StringUngetc DohStringUngetc */ /* #define StringAppend Append */ /* #define StringLen DohStringLen */ /* #define StringChar DohStringChar */ /* #define StringEqual DohStringEqual */ #define Close DohClose #define vPrintf DohvPrintf #define GetInt DohGetInt #define GetDouble DohGetDouble #define GetChar DohGetChar #define GetVoid DohGetVoid #define GetFlagAttr DohGetFlagAttr #define GetFlag DohGetFlag #define SetInt DohSetInt #define SetDouble DohSetDouble #define SetChar DohSetattr #define SetVoid DohSetVoid #define SetFlagAttr DohSetFlagAttr #define SetFlag DohSetFlag #define UnsetFlag(o,n) DohSetFlagAttr(o,n,NULL) #define ClearFlag(o,n) DohSetFlagAttr(o,n,"") #define Readline DohReadline #define Replace DohReplace #define Chop DohChop #define Getmeta DohGetmeta #define Setmeta DohSetmeta #define Delmeta DohDelmeta #define NewString DohNewString #define NewStringEmpty DohNewStringEmpty #define NewStringWithSize DohNewStringWithSize #define NewStringf DohNewStringf #define NewHash DohNewHash #define NewList DohNewList #define NewFile DohNewFile #define NewFileFromFile DohNewFileFromFile #define NewFileFromFd DohNewFileFromFd #define FileErrorDisplay DohFileErrorDisplay #define Close DohClose #define NewVoid DohNewVoid #define Keys DohKeys #define Strcmp DohStrcmp #define Strncmp DohStrncmp #define Strstr DohStrstr #define Strchr DohStrchr #define Copyto DohCopyto #define Split DohSplit #define SplitLines DohSplitLines #define Setmark DohSetmark #define Getmark DohGetmark #define SetMaxHashExpand DohSetMaxHashExpand #define GetMaxHashExpand DohGetMaxHashExpand #define None DohNone #define Call DohCall #define First DohFirst #define Next DohNext #define Iterator DohIterator #define SortList DohSortList #endif #ifdef NIL #undef NIL #endif #define NIL (char *) NULL #endif /* DOH_H */ swig-3.0.12/ANNOUNCE0000664000175000017500000000246613042756442013576 0ustar williamwilliam*** ANNOUNCE: SWIG 3.0.12 (27 Jan 2017) *** http://www.swig.org We're pleased to announce SWIG-3.0.12, the latest SWIG release. What is SWIG? ============= SWIG is a software development tool that reads C/C++ header files and generates the wrapper code needed to make C and C++ code accessible from other programming languages including Perl, Python, Tcl, Ruby, PHP, C#, Go, Java, Javascript, Lua, Scheme (Guile, MzScheme, CHICKEN), D, Ocaml, Pike, Modula-3, Octave, R, Scilab, Common Lisp (CLISP, Allegro CL, CFFI, UFFI). SWIG can also export its parse tree in the form of XML and Lisp s-expressions. Major applications of SWIG include generation of scripting language extension modules, rapid prototyping, testing, and user interface development for large C/C++ systems. Release Notes ============= Detailed release notes are available with the release and are also published on the SWIG web site at http://swig.org/release.html. Availability ============ The release is available for download on Sourceforge at http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz A Windows version is also available at http://prdownloads.sourceforge.net/swig/swigwin-3.0.12.zip Please report problems with this release to the swig-devel mailing list, details at http://www.swig.org/mail.html. --- The SWIG Developers swig-3.0.12/LICENSE-UNIVERSITIES0000664000175000017500000001106013042756442015367 0ustar williamwilliamSWIG is distributed under the following terms: I. Copyright (c) 1995-1998 The University of Utah and the Regents of the University of California All Rights Reserved Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that (1) The above copyright notice and the following two paragraphs appear in all copies of the source code and (2) redistributions including binaries reproduces these notices in the supporting documentation. Substantial modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated in all files where they apply. IN NO EVENT SHALL THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, THE UNIVERSITY OF UTAH OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, AND THE UNIVERSITY OF UTAH SPECIFICALLY DISCLAIM ANY WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. II. This software includes contributions that are Copyright (c) 1998-2005 University of Chicago. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of the University of Chicago nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF CHICAGO AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF CHICAGO OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. III. This software includes contributions that are Copyright (c) 2005-2006 Arizona Board of Regents (University of Arizona). All Rights Reserved Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that (1) The above copyright notice and the following paragraph appear in all copies of the source code and (2) redistributions including binaries reproduces these notices in the supporting documentation. Substantial modifications to this software may be copyrighted by their authors and need not follow the licensing terms described here, provided that the new terms are clearly indicated in all files where they apply. THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF ARIZONA AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF ARIZONA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. swig-3.0.12/LICENSE0000664000175000017500000000206213042756442013442 0ustar williamwilliamSWIG 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. See the LICENSE-GPL file for the full terms of the GNU General Public license version 3. Portions of SWIG are also licensed under the terms of the licenses in the file LICENSE-UNIVERSITIES. You must observe the terms of these licenses, as well as the terms of the GNU General Public License, when you distribute SWIG. The SWIG library and examples, under the Lib and Examples top level directories, are distributed under the following terms: You may copy, modify, distribute, and make derivative works based on this software, in source code or object code form, without restriction. If you distribute the software to others, you may do so according to the terms of your choice. This software is offered as is, without warranty of any kind. See the COPYRIGHT file for a list of contributors to SWIG and their copyright notices. swig-3.0.12/COPYRIGHT0000664000175000017500000001454513042756442013741 0ustar williamwilliamSWIG Copyright and Authors -------------------------- Copyright (c) 1995-2011 The SWIG Developers Copyright (c) 2005-2006 Arizona Board of Regents (University of Arizona). Copyright (c) 1998-2005 University of Chicago. Copyright (c) 1995-1998 The University of Utah and the Regents of the University of California Portions also copyrighted by: Network Applied Communication Laboratory, Inc Information-technology Promotion Agency, Japan Active SWIG Developers: William Fulton (wsf@fultondesigns.co.uk) (SWIG core, Java, C#, Windows, Cygwin) Olly Betts (olly@survex.com) (PHP) Joseph Wang (joequant@gmail.com) (R) Xavier Delacour (xavier.delacour@gmail.com) (Octave) David Nadlinger (code@klickverbot.at) (D) Oliver Buchtala (oliver.buchtala@gmail.com) (Javascript) Neha Narang (narangneha03@gmail.com) (Javascript) Simon Marchetto (simon.marchetto@scilab-enterprises.com) (Scilab) Past SWIG developers and major contributors include: Dave Beazley (dave-swig@dabeaz.com) (SWIG core, Python, Tcl, Perl) Henning Thielemann (swig@henning-thielemann.de) (Modula3) Matthias Köppe (mkoeppe@mail.math.uni-magdeburg.de) (Guile, MzScheme) Luigi Ballabio (luigi.ballabio@fastwebnet.it) (STL wrapping) Mikel Bancroft (mikel@franz.com) (Allegro CL) Surendra Singhi (efuzzyone@netscape.net) (CLISP, CFFI) Marcelo Matus (mmatus@acms.arizona.edu) (SWIG core, Python, UTL[python,perl,tcl,ruby]) Art Yerkes (ayerkes@speakeasy.net) (Ocaml) Lyle Johnson (lyle@users.sourceforge.net) (Ruby) Charlie Savage (cfis@interserv.com) (Ruby) Thien-Thi Nguyen (ttn@glug.org) (build/test/misc) Richard Palmer (richard@magicality.org) (PHP) Sam Liddicott - Ananova Ltd (saml@liddicott.com) (PHP) Tim Hockin - Sun Microsystems (thockin@sun.com) (PHP) Kevin Ruland (PHP) Shibukawa Yoshiki (Japanese Translation) Jason Stewart (jason@openinformatics.com) (Perl5) Loic Dachary (Perl5) David Fletcher (Perl5) Gary Holt (Perl5) Masaki Fukushima (Ruby) Scott Michel (scottm@cs.ucla.edu) (Java directors) Tiger Feng (songyanf@cs.uchicago.edu) (SWIG core) Mark Rose (mrose@stm.lbl.gov) (Directors) Jonah Beckford (beckford@usermail.com) (CHICKEN) Ahmon Dancy (dancy@franz.com) (Allegro CL) Dirk Gerrits (Allegro CL) Neil Cawse (C#) Harco de Hilster (Java) Alexey Dyachenko (dyachenko@fromru.com) (Tcl) Bob Techentin (Tcl) Martin Froehlich (Guile) Marcio Luis Teixeira (Guile) Duncan Temple Lang (R) Miklos Vajna (PHP directors) Mark Gossage (mark@gossage.cjb.net) (Lua) Raman Gopalan (ramangopalan@gmail.com) (eLua) Gonzalo Garramuno (ggarra@advancedsl.com.ar) (Ruby, Ruby's UTL) John Lenz (Guile, MzScheme updates, Chicken module, runtime system) Baozeng Ding (Scilab) Ian Lance Taylor (Go) Vadim Zeitlin (PCRE, Python) Stefan Zager (szager@gmail.com) (Python) Vincent Couvert (Scilab) Sylvestre Ledru (Scilab) Wolfgang Frisch (Scilab) Past contributors include: James Michael DuPont, Clark McGrew, Dustin Mitchell, Ian Cooke, Catalin Dumitrescu, Baran Kovuk, Oleg Tolmatcev, Tal Shalif, Lluis Padro, Chris Seatory, Igor Bely, Robin Dunn, Edward Zimmermann, David Ascher, Dominique Dumont, Pier Giorgio Esposito, Hasan Baran Kovuk, Klaus Wiederänders, Richard Beare, Hans Oesterholt. (See CHANGES and CHANGES.current and the bug tracker for a more complete list). Past students: Songyan Feng (Chicago). Xinghua Shi (Chicago). Jing Cao (Chicago). Aquinas Hobor (Chicago). Historically, the following people contributed to early versions of SWIG. Peter Lomdahl, Brad Holian, Shujia Zhou, Niels Jensen, and Tim Germann at Los Alamos National Laboratory were the first users. Patrick Tullmann at the University of Utah suggested the idea of automatic documentation generation. John Schmidt and Kurtis Bleeker at the University of Utah tested out the early versions. Chris Johnson supported SWIG's developed at the University of Utah. John Buckman, Larry Virden, and Tom Schwaller provided valuable input on the first releases and improving the portability of SWIG. David Fletcher and Gary Holt have provided a great deal of input on improving SWIG's Perl5 implementation. Kevin Butler contributed the first Windows NT port. Early bug reports and patches: Adam Hupp, Arthur Smyles, Brad Clements, Brett Williams, Buck Hodges, Burkhard Kloss, Chia-Liang Kao, Craig Files, Dennis Marsa, Dieter Baron, Drake Diedrich, Fleur Diana Dragan, Gary Pennington, Geoffrey Hort, Gerald Williams, Greg Anderson, Greg Kochanski, Greg Troxel, Henry Rowley, Irina Kotlova, Israel Taller, James Bailey, Jim Fulton, Joel Reed, Jon Travis, Junio Hamano, Justin Heyes-Jones, Karl Forner, Keith Davidson, Krzysztof Kozminski, Larry Virden, Luke J Crook, Magnus Ljung, Marc Zonzon, Mark Howson, Micahel Scharf, Michel Sanner, Mike Romberg, Mike Simons, Mike Weiblen, Paul Brannan, Ram Bhamidipaty, Reinhard Fobbe, Rich Wales, Richard Salz, Roy Lecates, Rudy Albachten, Scott Drummonds Scott Michel, Shaun Lowry, Steve Galser, Tarn Weisner Burton, Thomas Weidner, Tony Seward, Uwe Steinmann, Vadim Chugunov, Wyss Clemens, Zhong Ren. swig-3.0.12/autogen.sh0000775000175000017500000000111213042756442014431 0ustar williamwilliam#! /bin/sh # Bootstrap the development environment - add extra files needed to run configure. # Note autoreconf should do what this file achieves, but it has a bug when working with automake! # The latest config.guess and config.sub should be copied into Tools/config. # This script will ensure the latest is copied from your autotool installation. set -e set -x test -d Tools/config || mkdir Tools/config ${ACLOCAL-aclocal} -I Tools/config ${AUTOHEADER-autoheader} ${AUTOMAKE-automake} --add-missing --copy --force-missing ${AUTOCONF-autoconf} cd CCache && ${AUTORECONF-autoreconf} swig-3.0.12/vms/0000775000175000017500000000000013042756442013242 5ustar williamwilliamswig-3.0.12/vms/logicals.com0000664000175000017500000000077213042756442015545 0ustar williamwilliam$! $! $! $ proc = f$environment("PROCEDURE") $ proc = f$parse(proc,"sys$disk:[]",,,"NO_CONCEAL") $ cur_dev = f$parse(proc,,,"DEVICE","SYNTAX_ONLY") $ cur_dir = f$parse(proc,,,"DIRECTORY","SYNTAX_ONLY") $ cur_dir = f$extract(1,f$length(cur_dir)-2,cur_dir) $ cur_dir = cur_dir - "[" $ cur_dir = cur_dir - "]" $ cur_dir = cur_dir - "<" $ cur_dir = cur_dir - ">" $ $! remove trealing .VMS $ root_dir = f$extract(0,f$length(cur_dir)-4,cur_dir) $ $ define 'p1' /trans=concealed swig_root 'cur_dev'['root_dir'.] swig-3.0.12/vms/build_init.com0000664000175000017500000000053213042756442016064 0ustar williamwilliam$ set def swig_root:[vms] $ $ swiglib = "swig_root:[vms.o_alpha]swig.olb $ $ if (f$search("swig_root:[vms]o_alpha.dir") .eqs. "") then $ - create/dir swig_root:[vms.o_alpha] $ $ copy swigconfig.h [-.source.include] $ copy swigver.h [-.source.include] $ $ if (f$search("''swiglib'") .eqs. "") then $ - library/create/object 'swiglib' $ swig-3.0.12/vms/genbuild.py0000664000175000017500000000772413042756442015417 0ustar williamwilliamimport os.path, string, posix, pyvms # # IDIR = ['swig_root:[source.swig]', 'swig_root:[source.doh.include]', 'swig_root:[source.include]', 'swig_root:[source.preprocessor]'] def new_file(fg, dirname): global IDIR fn = 'swig_root:[vms.scripts]compil_' + os.path.basename(dirname) + '.com' print >> fg, '$ @' + fn f = open(fn, 'w') print >> f, '$!' print >> f, '$! Generated by genbuild.py' print >> f, '$!' print >> f, '$ libname = "swig_root:[vms.o_alpha]swig.olb"' print >> f, '$' print >> f, '$ set default', pyvms.crtl_to_vms(dirname)[0][0] print >> f, '$' print >> f, "$ idir := ", IDIR[0] for i in range(1, len(IDIR)): print >> f, '$ idir = idir + ",' + IDIR[i] + '"' print >> f, '$' print >> f, "$ iflags = \"/include=(''idir', sys$disk:[])\"" print >> f, '$ oflags = \"/object=swig_root:[vms.o_alpha]' print >> f, "$ cflags = \"''oflags'''iflags'''dflags'\"" print >> f, "$ cxxflags = \"''oflags'''iflags'''dflags'\"" print >> f, '$' return f def end_file(f): print >>f,"""$ exit $! $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 = Source file $! P4 - P8 What it depends on $ $ modname = f$parse(p3,,,"name") $ set noon $ set message/nofacility/noident/noseverity/notext $ libr/lis=swig_root:[vms]swiglib.tmp/full/width=132/only='modname' 'libname' $ set message/facility/ident/severity/text $ on error then exit $ open/read swigtmp swig_root:[vms]swiglib.tmp $! skip header $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $! $ $ read/end=module_not_found swigtmp r $ modfound = 1 $ Time = f$cvtime(f$extract(49, 20, r)) $ goto end_search_module $ module_not_found: $ modfound = 0 $ $ end_search_module: $ close swigtmp $ delete swig_root:[vms]swiglib.tmp;* $ $ if modfound .eq. 0 then $ goto Makeit $ $! Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(1) $ 'P2' 'P3' $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE""" def listRep(args, dirname, filenames): fg = args[0] first = 1 for fn in filenames: if fn[-2:] == '.c': if first: first = 0 fc = new_file(fg, dirname) cstr = "\"cc ''cflags'\" " line = "$ call make swig_root:[vms.o_alpha]" line += fn[:-1] + 'obj -' print >> fc, line line = "\t" + cstr + fn print >> fc, line elif fn[-4:] == '.cxx': if first: first = 0 fc = new_file(fg, dirname) cstr = "\"cxx ''cxxflags'\" " line = "$ call make swig_root:[vms.o_alpha]" line += fn[:-3] + 'obj -' print >> fc, line line = "\t" + cstr + fn print >> fc, line if first == 0: end_file(fc) fc.close() # def genbuild(f, dir): os.path.walk(dir, listRep, (f,)) cmd = 'set default swig_root:[vms]' # f = open('swig_root:[vms.scripts]build_all.com','w') print >> f, '$!' print >> f, '$! Generated by genbuild.py' print >> f, '$!' print >> f, '$ set default swig_root:[vms]' print >> f, '$' print >> f, '$ @swig_root:[vms]build_init' # genbuild(f, '/swig_root/source') print >> f, '$' print >> f, '$ set default swig_root:[vms]' print >> f, '$' print >> f, '$ @swig_root:[vms]build_end' f.close swig-3.0.12/vms/swigconfig.h0000664000175000017500000000012713042756442015552 0ustar williamwilliam /* Note that this file has changed. TODO Get the latest from the original version. */ swig-3.0.12/vms/aaareadme.txt0000664000175000017500000000064213042756442015705 0ustar williamwilliamPort on OpenVMS 7.3 using CC 6.5 and CXX 6.5 Building procedure: $ @logicals $ @build_all the logicals swig_root is defined by the procedure logicals.com. The logicals.com procedure can be invoke with an optional argument for the define command, for example: $ @logicals "/system/exec" genbuild.py is the python program use to generate all the procedures in the [vms.scripts] directory. jf.pieronne@laposte.net swig-3.0.12/vms/build_swig.com0000664000175000017500000000004413042756442016070 0ustar williamwilliam$ @swig_root:[vms.scripts]build_all swig-3.0.12/vms/scripts/0000775000175000017500000000000013042756442014731 5ustar williamwilliamswig-3.0.12/vms/scripts/compil_swig.com0000664000175000017500000000626113042756442017752 0ustar williamwilliam$! $! Generated by genbuild.py $! $ libname = "swig_root:[vms.o_alpha]swig.olb" $ $ set default SWIG_ROOT:[SOURCE.SWIG] $ $ idir := swig_root:[source.swig] $ idir = idir + ",swig_root:[source.doh.include]" $ idir = idir + ",swig_root:[source.include]" $ idir = idir + ",swig_root:[source.preprocessor]" $ $ iflags = "/include=(''idir', sys$disk:[])" $ oflags = "/object=swig_root:[vms.o_alpha] $ cflags = "''oflags'''iflags'''dflags'" $ cxxflags = "''oflags'''iflags'''dflags'" $ $ call make swig_root:[vms.o_alpha]cwrap.obj - "cc ''cflags'" cwrap.c $ call make swig_root:[vms.o_alpha]error.obj - "cc ''cflags'" error.c $ call make swig_root:[vms.o_alpha]fragment.obj - "cc ''cflags'" fragment.c $ call make swig_root:[vms.o_alpha]getopt.obj - "cc ''cflags'" getopt.c $ call make swig_root:[vms.o_alpha]include.obj - "cc ''cflags'" include.c $ call make swig_root:[vms.o_alpha]misc.obj - "cc ''cflags'" misc.c $ call make swig_root:[vms.o_alpha]naming.obj - "cc ''cflags'" naming.c $ call make swig_root:[vms.o_alpha]parms.obj - "cc ''cflags'" parms.c $ call make swig_root:[vms.o_alpha]scanner.obj - "cc ''cflags'" scanner.c $ call make swig_root:[vms.o_alpha]stype.obj - "cc ''cflags'" stype.c $ call make swig_root:[vms.o_alpha]symbol.obj - "cc ''cflags'" symbol.c $ call make swig_root:[vms.o_alpha]tree.obj - "cc ''cflags'" tree.c $ call make swig_root:[vms.o_alpha]typemap.obj - "cc ''cflags'" typemap.c $ call make swig_root:[vms.o_alpha]typesys.obj - "cc ''cflags'" typesys.c $ call make swig_root:[vms.o_alpha]warn.obj - "cc ''cflags'" warn.c $ call make swig_root:[vms.o_alpha]wrapfunc.obj - "cc ''cflags'" wrapfunc.c $ exit $! $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 = Source file $! P4 - P8 What it depends on $ $ modname = f$parse(p3,,,"name") $ set noon $ set message/nofacility/noident/noseverity/notext $ libr/lis=swig_root:[vms]swiglib.tmp/full/width=132/only='modname' 'libname' $ set message/facility/ident/severity/text $ on error then exit $ open/read swigtmp swig_root:[vms]swiglib.tmp $! skip header $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $! $ $ read/end=module_not_found swigtmp r $ modfound = 1 $ Time = f$cvtime(f$extract(49, 20, r)) $ goto end_search_module $ module_not_found: $ modfound = 0 $ $ end_search_module: $ close swigtmp $ delete swig_root:[vms]swiglib.tmp;* $ $ if modfound .eq. 0 then $ goto Makeit $ $! Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(1) $ 'P2' 'P3' $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE swig-3.0.12/vms/scripts/build_all.com0000664000175000017500000000057613042756442017370 0ustar williamwilliam$! $! Generated by genbuild.py $! $ set default swig_root:[vms] $ $ @swig_root:[vms]build_init $ @swig_root:[vms.scripts]compil_cparse.com $ @swig_root:[vms.scripts]compil_doh.com $ @swig_root:[vms.scripts]compil_modules1_1.com $ @swig_root:[vms.scripts]compil_preprocessor.com $ @swig_root:[vms.scripts]compil_swig.com $ $ set default swig_root:[vms] $ $ @swig_root:[vms]build_end swig-3.0.12/vms/scripts/compil_cparse.com0000664000175000017500000000451113042756442020252 0ustar williamwilliam$! $! Generated by genbuild.py $! $ libname = "swig_root:[vms.o_alpha]swig.olb" $ $ set default SWIG_ROOT:[SOURCE.CPARSE] $ $ idir := swig_root:[source.swig] $ idir = idir + ",swig_root:[source.doh.include]" $ idir = idir + ",swig_root:[source.include]" $ idir = idir + ",swig_root:[source.preprocessor]" $ $ iflags = "/include=(''idir', sys$disk:[])" $ oflags = "/object=swig_root:[vms.o_alpha] $ cflags = "''oflags'''iflags'''dflags'" $ cxxflags = "''oflags'''iflags'''dflags'" $ $ call make swig_root:[vms.o_alpha]cscanner.obj - "cc ''cflags'" cscanner.c $ call make swig_root:[vms.o_alpha]parser.obj - "cc ''cflags'" parser.c $ call make swig_root:[vms.o_alpha]templ.obj - "cc ''cflags'" templ.c $ call make swig_root:[vms.o_alpha]util.obj - "cc ''cflags'" util.c $ exit $! $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 = Source file $! P4 - P8 What it depends on $ $ modname = f$parse(p3,,,"name") $ set noon $ set message/nofacility/noident/noseverity/notext $ libr/lis=swig_root:[vms]swiglib.tmp/full/width=132/only='modname' 'libname' $ set message/facility/ident/severity/text $ on error then exit $ open/read swigtmp swig_root:[vms]swiglib.tmp $! skip header $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $! $ $ read/end=module_not_found swigtmp r $ modfound = 1 $ Time = f$cvtime(f$extract(49, 20, r)) $ goto end_search_module $ module_not_found: $ modfound = 0 $ $ end_search_module: $ close swigtmp $ delete swig_root:[vms]swiglib.tmp;* $ $ if modfound .eq. 0 then $ goto Makeit $ $! Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(1) $ 'P2' 'P3' $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE swig-3.0.12/vms/scripts/compil_preprocessor.com0000664000175000017500000000426513042756442021531 0ustar williamwilliam$! $! Generated by genbuild.py $! $ libname = "swig_root:[vms.o_alpha]swig.olb" $ $ set default SWIG_ROOT:[SOURCE.PREPROCESSOR] $ $ idir := swig_root:[source.swig] $ idir = idir + ",swig_root:[source.doh.include]" $ idir = idir + ",swig_root:[source.include]" $ idir = idir + ",swig_root:[source.preprocessor]" $ $ iflags = "/include=(''idir', sys$disk:[])" $ oflags = "/object=swig_root:[vms.o_alpha] $ cflags = "''oflags'''iflags'''dflags'" $ cxxflags = "''oflags'''iflags'''dflags'" $ $ call make swig_root:[vms.o_alpha]cpp.obj - "cc ''cflags'" cpp.c $ call make swig_root:[vms.o_alpha]expr.obj - "cc ''cflags'" expr.c $ exit $! $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 = Source file $! P4 - P8 What it depends on $ $ modname = f$parse(p3,,,"name") $ set noon $ set message/nofacility/noident/noseverity/notext $ libr/lis=swig_root:[vms]swiglib.tmp/full/width=132/only='modname' 'libname' $ set message/facility/ident/severity/text $ on error then exit $ open/read swigtmp swig_root:[vms]swiglib.tmp $! skip header $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $! $ $ read/end=module_not_found swigtmp r $ modfound = 1 $ Time = f$cvtime(f$extract(49, 20, r)) $ goto end_search_module $ module_not_found: $ modfound = 0 $ $ end_search_module: $ close swigtmp $ delete swig_root:[vms]swiglib.tmp;* $ $ if modfound .eq. 0 then $ goto Makeit $ $! Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(1) $ 'P2' 'P3' $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE swig-3.0.12/vms/scripts/compil_doh.com0000664000175000017500000000512613042756442017552 0ustar williamwilliam$! $! Generated by genbuild.py $! $ libname = "swig_root:[vms.o_alpha]swig.olb" $ $ set default SWIG_ROOT:[SOURCE.DOH.DOH] $ $ idir := swig_root:[source.swig] $ idir = idir + ",swig_root:[source.doh.include]" $ idir = idir + ",swig_root:[source.include]" $ idir = idir + ",swig_root:[source.preprocessor]" $ $ iflags = "/include=(''idir', sys$disk:[])" $ oflags = "/object=swig_root:[vms.o_alpha] $ cflags = "''oflags'''iflags'''dflags'" $ cxxflags = "''oflags'''iflags'''dflags'" $ $ call make swig_root:[vms.o_alpha]base.obj - "cc ''cflags'" base.c $ call make swig_root:[vms.o_alpha]file.obj - "cc ''cflags'" file.c $ call make swig_root:[vms.o_alpha]fio.obj - "cc ''cflags'" fio.c $ call make swig_root:[vms.o_alpha]hash.obj - "cc ''cflags'" hash.c $ call make swig_root:[vms.o_alpha]list.obj - "cc ''cflags'" list.c $ call make swig_root:[vms.o_alpha]memory.obj - "cc ''cflags'" memory.c $ call make swig_root:[vms.o_alpha]string.obj - "cc ''cflags'" string.c $ call make swig_root:[vms.o_alpha]void.obj - "cc ''cflags'" void.c $ exit $! $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 = Source file $! P4 - P8 What it depends on $ $ modname = f$parse(p3,,,"name") $ set noon $ set message/nofacility/noident/noseverity/notext $ libr/lis=swig_root:[vms]swiglib.tmp/full/width=132/only='modname' 'libname' $ set message/facility/ident/severity/text $ on error then exit $ open/read swigtmp swig_root:[vms]swiglib.tmp $! skip header $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $! $ $ read/end=module_not_found swigtmp r $ modfound = 1 $ Time = f$cvtime(f$extract(49, 20, r)) $ goto end_search_module $ module_not_found: $ modfound = 0 $ $ end_search_module: $ close swigtmp $ delete swig_root:[vms]swiglib.tmp;* $ $ if modfound .eq. 0 then $ goto Makeit $ $! Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(1) $ 'P2' 'P3' $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE swig-3.0.12/vms/scripts/compil_modules1_1.com0000664000175000017500000000717713042756442020761 0ustar williamwilliam$! $! Generated by genbuild.py $! $ libname = "swig_root:[vms.o_alpha]swig.olb" $ $ set default SWIG_ROOT:[SOURCE.MODULES1_1] $ $ idir := swig_root:[source.swig] $ idir = idir + ",swig_root:[source.doh.include]" $ idir = idir + ",swig_root:[source.include]" $ idir = idir + ",swig_root:[source.preprocessor]" $ $ iflags = "/include=(''idir', sys$disk:[])" $ oflags = "/object=swig_root:[vms.o_alpha] $ cflags = "''oflags'''iflags'''dflags'" $ cxxflags = "''oflags'''iflags'''dflags'" $ $ call make swig_root:[vms.o_alpha]allocate.obj - "cxx ''cxxflags'" allocate.cxx $ call make swig_root:[vms.o_alpha]browser.obj - "cxx ''cxxflags'" browser.cxx $ call make swig_root:[vms.o_alpha]contract.obj - "cxx ''cxxflags'" contract.cxx $ call make swig_root:[vms.o_alpha]emit.obj - "cxx ''cxxflags'" emit.cxx $ call make swig_root:[vms.o_alpha]guile.obj - "cxx ''cxxflags'" guile.cxx $ call make swig_root:[vms.o_alpha]java.obj - "cxx ''cxxflags'" java.cxx $ call make swig_root:[vms.o_alpha]lang.obj - "cxx ''cxxflags'" lang.cxx $ call make swig_root:[vms.o_alpha]main.obj - "cxx ''cxxflags'" main.cxx $ call make swig_root:[vms.o_alpha]module.obj - "cxx ''cxxflags'" module.cxx $ call make swig_root:[vms.o_alpha]mzscheme.obj - "cxx ''cxxflags'" mzscheme.cxx $ call make swig_root:[vms.o_alpha]ocaml.obj - "cxx ''cxxflags'" ocaml.cxx $ call make swig_root:[vms.o_alpha]overload.obj - "cxx ''cxxflags'" overload.cxx $ call make swig_root:[vms.o_alpha]perl5.obj - "cxx ''cxxflags'" perl5.cxx $ call make swig_root:[vms.o_alpha]php4.obj - "cxx ''cxxflags'" php4.cxx $ call make swig_root:[vms.o_alpha]pike.obj - "cxx ''cxxflags'" pike.cxx $ call make swig_root:[vms.o_alpha]python.obj - "cxx ''cxxflags'" python.cxx $ call make swig_root:[vms.o_alpha]ruby.obj - "cxx ''cxxflags'" ruby.cxx $ call make swig_root:[vms.o_alpha]swigmain.obj - "cxx ''cxxflags'" swigmain.cxx $ call make swig_root:[vms.o_alpha]tcl8.obj - "cxx ''cxxflags'" tcl8.cxx $ call make swig_root:[vms.o_alpha]typepass.obj - "cxx ''cxxflags'" typepass.cxx $ call make swig_root:[vms.o_alpha]xml.obj - "cxx ''cxxflags'" xml.cxx $ exit $! $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 = Source file $! P4 - P8 What it depends on $ $ modname = f$parse(p3,,,"name") $ set noon $ set message/nofacility/noident/noseverity/notext $ libr/lis=swig_root:[vms]swiglib.tmp/full/width=132/only='modname' 'libname' $ set message/facility/ident/severity/text $ on error then exit $ open/read swigtmp swig_root:[vms]swiglib.tmp $! skip header $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $ read swigtmp r $! $ $ read/end=module_not_found swigtmp r $ modfound = 1 $ Time = f$cvtime(f$extract(49, 20, r)) $ goto end_search_module $ module_not_found: $ modfound = 0 $ $ end_search_module: $ close swigtmp $ delete swig_root:[vms]swiglib.tmp;* $ $ if modfound .eq. 0 then $ goto Makeit $ $! Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(1) $ 'P2' 'P3' $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE swig-3.0.12/vms/build_end.com0000664000175000017500000000112413042756442015665 0ustar williamwilliam$ set def swig_root:[vms] $ $ file = f$search("swig_root:[vms.o_alpha]*.obj") $ newobj = 0 $ if file .nes. "" $ then $ v = f$verify(1) $ library/replace swig_root:[vms.o_alpha]swig.olb swig_root:[vms.o_alpha]*.obj $ delete swig_root:[vms.o_alpha]*.obj;* $ v = f$verify(v) $ newobj = 1 $ endif $ file = f$search("swig_root:[vms]swig.exe") $ if file .eqs. "" .or. newobj $ then $ v = f$verify(1) $ cxxlink/exe=swig_root:[vms]swig.exe - /repo=swig_root:[source.modules1_1.cxx_repository] - swig_root:[vms.o_alpha]swig.olb/include=swigmain $ v = f$verify(v) $ endif swig-3.0.12/Makefile.in0000664000175000017500000005157313042756442014515 0ustar williamwilliam####################################################################### # SWIG top level Makefile ####################################################################### .PHONY: ccache source swig prefix = @prefix@ exec_prefix = @exec_prefix@ srcdir = @srcdir@ datarootdir = @datarootdir@ ##################################################################### # Make options - override these to see more output ##################################################################### RUNPIPE = \>/dev/null FLAGS = -k -s ##################################################################### # Compiler and system configuration ##################################################################### SHELL = /bin/sh SWIG_LIB_INSTALL = @SWIG_LIB_INSTALL@ BIN_DIR = @bindir@ ENABLE_CCACHE = @ENABLE_CCACHE@ TARGET_NOEXE= swig TARGET = $(TARGET_NOEXE)@EXEEXT@ SOURCE = Source CCACHE = CCache DOCS = Doc/Manual HAVE_CXX11_COMPILER = @HAVE_CXX11_COMPILER@ swig: libfiles source ccache source: @cd $(SOURCE) && $(MAKE) ccache: test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE)) libfiles: $(srcdir)/Lib/swigwarn.swg # Files required just for the tarball maintainer: libfiles @cd $(SOURCE) && $(MAKE) CParse/parser.h ##################################################################### # Documentation ##################################################################### docs: docs-main docs-main: @echo making docs @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) all clean-baks ##################################################################### # All the languages SWIG speaks (when it wants to) ##################################################################### skip-tcl = test -n "@SKIP_TCL@" skip-perl5 = test -n "@SKIP_PERL5@" skip-python = test -n "@SKIP_PYTHON@" skip-java = test -n "@SKIP_JAVA@" skip-guile = test -n "@SKIP_GUILE@" skip-mzscheme = test -n "@SKIP_MZSCHEME@" skip-ruby = test -n "@SKIP_RUBY@" skip-php = test -n "@SKIP_PHP@" skip-php5 = test -n "@SKIP_PHP5@" skip-ocaml = test -n "@SKIP_OCAML@" skip-octave = test -n "@SKIP_OCTAVE@" skip-pike = test -n "@SKIP_PIKE@" skip-chicken = test -n "@SKIP_CHICKEN@" skip-csharp = test -n "@SKIP_CSHARP@" skip-modula3 = test -n "@SKIP_MODULA3@" skip-lua = test -n "@SKIP_LUA@" skip-allegrocl = test -n "@SKIP_ALLEGROCL@" skip-clisp = test -n "@SKIP_CLISP@" skip-cffi = test -n "@SKIP_CFFI@" skip-uffi = test -n "@SKIP_UFFI@" skip-r = test -n "@SKIP_R@" skip-scilab = test -n "@SKIP_SCILAB@" skip-go = test -n "@SKIP_GO@" skip-d = test -n "@SKIP_D@" skip-javascript = test -n "@SKIP_JAVASCRIPT@" # Additional dependencies for some tests skip-gcj = test -n "@SKIP_GCJ@" skip-android = test -n "@SKIP_ANDROID@" # Special errors test-case skip-errors = test -n "" check-%-enabled: @if $(skip-$*); then \ echo skipping $* version; \ exit 1; \ fi ##################################################################### # CHECK ##################################################################### ACTION = check NOSKIP = check-aliveness: test -x ./$(TARGET) ./$(TARGET) -version ./$(TARGET) -help @$(skip-tcl) || ./$(TARGET) -tcl -help @$(skip-perl5) || ./$(TARGET) -perl -help @$(skip-python) || ./$(TARGET) -python -help @$(skip-java) || ./$(TARGET) -java -help @$(skip-guile) || ./$(TARGET) -guile -help @$(skip-mzscheme) || ./$(TARGET) -mzscheme -help @$(skip-ruby) || ./$(TARGET) -ruby -help @$(skip-ocaml) || ./$(TARGET) -ocaml -help @$(skip-octave) || ./$(TARGET) -octave -help @$(skip-php) || ./$(TARGET) -php7 -help @$(skip-php5) || ./$(TARGET) -php5 -help @$(skip-pike) || ./$(TARGET) -pike -help @$(skip-chicken) || ./$(TARGET) -chicken -help @$(skip-csharp) || ./$(TARGET) -csharp -help @$(skip-modula3) || ./$(TARGET) -modula3 -help @$(skip-allegrocl)|| ./$(TARGET) -allegrocl -help @$(skip-clisp) || ./$(TARGET) -clisp -help @$(skip-uffi) || ./$(TARGET) -uffi -help @$(skip-cffi) || ./$(TARGET) -cffi -help @$(skip-lua) || ./$(TARGET) -lua -help @$(skip-r) || ./$(TARGET) -r -help @$(skip-scilab) || ./$(TARGET) -scilab -help @$(skip-go) || ./$(TARGET) -go -help @$(skip-d) || ./$(TARGET) -d -help @$(skip-javascript) || ./$(TARGET) -javascript -help check-ccache: test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) check) # Checks / displays versions of each target language check-versions: \ check-tcl-version \ check-perl5-version \ check-python-version \ check-java-version \ check-javascript-version \ check-android-version \ check-guile-version \ check-mzscheme-version \ check-ruby-version \ check-ocaml-version \ check-octave-version \ check-php-version \ check-php5-version \ check-pike-version \ check-chicken-version \ check-csharp-version \ check-modula3-version \ check-lua-version \ check-allegrocl-version \ check-clisp-version \ check-uffi-version \ check-cffi-version \ check-r-version \ check-scilab-version \ check-go-version \ check-d-version # all examples check-%-version : @if test -z "$(skip-$*)"; then \ echo $* unknown; \ exit 1; \ fi @if $(skip-$*); then \ echo skipping $* version; \ else \ echo showing $* version; \ (cd Examples && $(MAKE) $(FLAGS) $*_version) \ fi # Checks examples for compilation (does not run them) check-examples: \ check-tcl-examples \ check-perl5-examples \ check-python-examples \ check-java-examples \ check-android-examples \ check-guile-examples \ check-mzscheme-examples \ check-ruby-examples \ check-ocaml-examples \ check-octave-examples \ check-php-examples \ check-php5-examples \ check-pike-examples \ check-chicken-examples \ check-csharp-examples \ check-modula3-examples \ check-lua-examples \ check-allegrocl-examples \ check-clisp-examples \ check-uffi-examples \ check-cffi-examples \ check-r-examples \ check-scilab-examples \ check-go-examples \ check-d-examples \ check-javascript-examples tcl_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/tcl/check.list) perl5_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/perl5/check.list) python_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/python/check.list) java_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/java/check.list) android_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/android/check.list) guile_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/guile/check.list) mzscheme_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/mzscheme/check.list) ruby_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/ruby/check.list) ocaml_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/ocaml/check.list) octave_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/octave/check.list) php_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/php/check.list) php5_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/php5/check.list) pike_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/pike/check.list) chicken_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/chicken/check.list) csharp_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/csharp/check.list) modula3_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/modula3/check.list) lua_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/lua/check.list) allegrocl_examples := clisp_examples := uffi_examples := cffi_examples := r_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/r/check.list) scilab_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/scilab/check.list) go_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/go/check.list) d_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/d/check.list) javascript_examples:=$(shell sed '/^\#/d' $(srcdir)/Examples/javascript/check.list) # all examples check-%-examples : @if test -z "$(skip-$*)"; then \ echo $* unknown; \ exit 1; \ fi @if $(skip-$*); then \ echo skipping $* $(ACTION); \ elif test -z "$($(strip $*_examples))"; then \ echo empty $* $(ACTION); \ else \ $(MAKE) $(FLAGS) $($*_examples:=.actionexample) LANGUAGE=$* ACTION=$(ACTION); \ fi # individual example %.actionexample: @cd Examples && $(MAKE) Makefile @echo $(ACTION)ing Examples/$(LANGUAGE)/$* @(cd Examples/$(LANGUAGE)/$* && $(MAKE) $(FLAGS) $(ACTION) RUNPIPE=$(RUNPIPE)) # gcj individual example java.actionexample: @cd Examples && $(MAKE) Makefile @if $(skip-gcj); then \ echo "skipping Examples/$(LANGUAGE)/java $(ACTION) (gcj test)"; \ else \ echo $(ACTION)ing Examples/$(LANGUAGE)/java; \ (cd Examples/$(LANGUAGE)/java && $(MAKE) $(FLAGS) $(ACTION) RUNPIPE=$(RUNPIPE)) \ fi # Checks testcases in the test-suite excluding those which are known to be broken check-test-suite: \ check-errors-test-suite \ check-tcl-test-suite \ check-perl5-test-suite \ check-python-test-suite \ check-java-test-suite \ check-guile-test-suite \ check-mzscheme-test-suite \ check-ruby-test-suite \ check-ocaml-test-suite \ check-octave-test-suite \ check-php-test-suite \ check-php5-test-suite \ check-pike-test-suite \ check-csharp-test-suite \ check-modula3-test-suite \ check-lua-test-suite \ check-allegrocl-test-suite \ check-clisp-test-suite \ check-uffi-test-suite \ check-cffi-test-suite \ check-chicken-test-suite \ check-r-test-suite \ check-scilab-test-suite \ check-go-test-suite \ check-d-test-suite \ check-javascript-test-suite check-%-test-suite: @if test -z "$(skip-$*)"; then \ echo $* unknown; \ exit 1; \ fi @passed=true; \ dir="Examples/test-suite/$*"; \ if $(skip-$*) -a "$(NOSKIP)" != "1"; then \ echo skipping $* test-suite $(ACTION); \ elif [ ! -d $$dir ]; then \ echo warning: cannot $(ACTION) $* test-suite "(no dir $$dir)";\ else \ echo $(ACTION)ing $* test-suite; \ (cd $$dir && $(MAKE) $(FLAGS) $(ACTION) HAVE_CXX11_COMPILER=$(HAVE_CXX11_COMPILER)) \ || passed=false; \ fi; \ test $$passed = true # Partial test-suite check - it only invokes SWIG, ie no compilation and no runtime testing partialcheck-test-suite: @$(MAKE) $(FLAGS) check-test-suite ACTION=partialcheck NOSKIP=1 partialcheck-%-test-suite: @$(MAKE) $(FLAGS) check-$*-test-suite ACTION=partialcheck NOSKIP=1 check: check-aliveness check-ccache check-versions check-examples check-test-suite # Run known-to-be-broken as well as not broken testcases in the test-suite all-test-suite: \ all-tcl-test-suite \ all-perl5-test-suite \ all-python-test-suite \ all-java-test-suite \ all-guile-test-suite \ all-mzscheme-test-suite \ all-ruby-test-suite \ all-ocaml-test-suite \ all-octave-test-suite \ all-php-test-suite \ all-php5-test-suite \ all-pike-test-suite \ all-csharp-test-suite \ all-modula3-test-suite \ all-lua-test-suite \ all-allegrocl-test-suite \ all-clisp-test-suite \ all-uffi-test-suite \ all-cffi-test-suite \ all-chicken-test-suite \ all-r-test-suite \ all-scilab-test-suite \ all-go-test-suite \ all-d-test-suite \ all-javascript-test-suite all-%-test-suite: @$(MAKE) $(FLAGS) check-$*-test-suite ACTION=all # Run known-to-be-broken testcases in the test-suite broken-test-suite: \ broken-tcl-test-suite \ broken-perl5-test-suite \ broken-python-test-suite \ broken-java-test-suite \ broken-guile-test-suite \ broken-mzscheme-test-suite \ broken-ruby-test-suite \ broken-ocaml-test-suite \ broken-octave-test-suite \ broken-php-test-suite \ broken-php5-test-suite \ broken-pike-test-suite \ broken-csharp-test-suite \ broken-modula3-test-suite \ broken-lua-test-suite \ broken-allegrocl-test-suite \ broken-clisp-test-suite \ broken-uffi-test-suite \ broken-cffi-test-suite \ broken-chicken-test-suite \ broken-r-test-suite \ broken-scilab-test-suite \ broken-go-test-suite \ broken-d-test-suite \ broken-javascript-test-suite broken-%-test-suite: @$(MAKE) $(FLAGS) check-$*-test-suite ACTION=broken ##################################################################### # CLEAN ##################################################################### clean: clean-objects clean-examples clean-test-suite clean-objects: clean-source clean-ccache clean-source: @echo cleaning Source @cd $(SOURCE) && $(MAKE) $(FLAGS) clean @rm -f $(TARGET) clean-examples: @$(MAKE) $(FLAGS) check-examples ACTION=clean clean-test-suite: @$(MAKE) $(FLAGS) check-test-suite ACTION=clean NOSKIP=1 clean-%-examples: @$(MAKE) $(FLAGS) check-$*-examples ACTION=clean clean-%-test-suite: @$(MAKE) $(FLAGS) check-$*-test-suite ACTION=clean NOSKIP=1 clean-ccache: test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) $(FLAGS) clean) ##################################################################### # DISTCLEAN - clean what configure built ##################################################################### DISTCLEAN-DEAD = config.status config.log config.cache swig.spec Makefile mkmf.log preinst-swig distclean-helper: distclean-test-suite distclean-examples distclean-tools distclean-dead distclean: distclean-source distclean-ccache distclean-helper distclean-source: @echo distcleaning Source @cd $(SOURCE) && $(MAKE) $(FLAGS) distclean @rm -f $(TARGET) distclean-test-suite: @echo distcleaning Examples/test-suite @$(MAKE) $(FLAGS) check-test-suite ACTION=distclean NOSKIP=1 distclean-examples: @echo distcleaning Examples @$(MAKE) $(FLAGS) clean-examples @cd Examples && $(MAKE) $(FLAGS) distclean @if test "x$(srcdir)" != "x."; then \ for mkfile in `cd $(srcdir) && find Examples/ -type f -name Makefile`; do \ rm -f "$$mkfile"; \ done; \ fi distclean-ccache: @test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) $(FLAGS) distclean) distclean-tools: @echo distcleaning Tools @cd Tools/javascript && $(MAKE) $(FLAGS) distclean distclean-dead: rm -f $(DISTCLEAN-DEAD) rm -rf autom4te.cache ##################################################################### # MAINTAINER CLEAN - clean what the maintainer builds and ships in # the distributed tarball - should not delete anything needed to run # ./configure && make ##################################################################### maintainer-clean: @echo maintainer-cleaning source @cd $(SOURCE) && $(MAKE) $(FLAGS) maintainer-clean @echo maintainer-cleaning CCache @test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) $(FLAGS) maintainer-clean) @echo maintainer-cleaning docs @test -d $(DOCS) || exit 0; cd $(DOCS) && $(MAKE) $(FLAGS) maintainer-clean @echo maintainer-cleaning Lib files @rm -f $(srcdir)/Lib/swigwarn.swg @echo distcleaning @$(MAKE) $(FLAGS) distclean-helper check-maintainer-clean: maintainer-clean @if test "x$(srcdir)" = "x."; then \ echo "skipping maintainer-clean check (in-source-tree build)"; \ exit 0; \ fi; \ for file in `find . -type f`; do \ echo "file missed by maintainer-clean: $$file"; \ done; \ test "x$$file" = x && echo "all files cleaned by maintainer-clean" ##################################################################### # Update the Lib/swigwarn.swg file # Note: Generated into the source tree rather than build tree ##################################################################### $(srcdir)/Lib/swigwarn.swg: $(srcdir)/Source/Include/swigwarn.h mkdir -p Lib echo "/* SWIG warning codes */" > $@ cat $? | grep "^#define WARN\|/\*.*\*/\|^[ \t]*$$" | sed 's/^#define \(WARN.*[0-9][0-9]*\)\(.*\)$$/%define SWIG\1 %enddef\2/' >> $@ ##################################################################### # TARGETS: install & friends ##################################################################### INSTALL = @abs_srcdir@/Tools/config/install-sh -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} -m 755 MKINSTDIRS = @abs_srcdir@/Tools/config/install-sh -m 0755 -d # Use standard autoconf approach to transform executable name using --program-prefix and --program-suffix transform = @program_transform_name@ install: install-main install-lib install-ccache @echo "Installation complete" install-main: @echo "Installing SWIG executable" @$(MKINSTDIRS) $(DESTDIR)$(BIN_DIR) @echo "Installing $(DESTDIR)$(BIN_DIR)/`echo $(TARGET_NOEXE) | sed '$(transform)'`@EXEEXT@" @$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(BIN_DIR)/`echo $(TARGET_NOEXE) | sed '$(transform)'`@EXEEXT@ lib-languages = gcj typemaps tcl perl5 python guile java mzscheme ruby php php5 ocaml octave \ pike chicken csharp modula3 allegrocl clisp lua cffi uffi r go d javascript javascript/jsc \ javascript/v8 scilab lib-modules = std install-lib: @echo "Installing the SWIG library" @$(MKINSTDIRS) $(DESTDIR)$(SWIG_LIB_INSTALL) @for file in $(srcdir)/Lib/*.i $(srcdir)/Lib/*.swg ; do \ i=`basename $$file` ; \ echo "Installing $(DESTDIR)$(SWIG_LIB_INSTALL)/$$i"; \ $(INSTALL_DATA) $$file $(DESTDIR)$(SWIG_LIB_INSTALL)/$$i; \ done; @for lang in $(lib-languages) $(lib-modules); \ do \ echo "Installing language specific files for $$lang"; \ dst=$(DESTDIR)$(SWIG_LIB_INSTALL)/$$lang; \ $(MKINSTDIRS) $$dst; \ (doti="`cd $(srcdir)/Lib/$$lang && ls *.i 2>/dev/null || echo ''`"; \ dotswg="`cd $(srcdir)/Lib/$$lang && ls *.swg 2>/dev/null || echo ''`"; \ if [ -f $(srcdir)/Lib/$$lang/extra-install.list ]; then \ extra="`sed '/^#/d' $(srcdir)/Lib/$$lang/extra-install.list`"; \ fi; \ files="`echo $$doti $$dotswg $$extra`"; \ if [ x"$$files" = x ]; then \ echo "Installing nothing from Lib/$$lang"; \ else for file in $$doti $$dotswg $$extra; \ do \ echo "Installing $$dst/$$file"; \ $(INSTALL_DATA) $(srcdir)/Lib/$$lang/$$file $$dst/$$file; \ done; \ fi) ; \ done install-ccache: @test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) install) ##################################################################### # TARGETS: uninstall & friends ##################################################################### uninstall: uninstall-main uninstall-lib uninstall-ccache @echo "Uninstall complete" uninstall-main: @echo "Uninstalling SWIG executable $(DESTDIR)$(BIN_DIR)/`echo $(TARGET_NOEXE) | sed '$(transform)'`@EXEEXT@" rm -f $(DESTDIR)$(BIN_DIR)/`echo $(TARGET_NOEXE) | sed '$(transform)'`@EXEEXT@ uninstall-lib: @echo "Uninstalling the SWIG library" rm -rf $(DESTDIR)$(SWIG_LIB_INSTALL)/ uninstall-ccache: test -z "$(ENABLE_CCACHE)" || (cd $(CCACHE) && $(MAKE) uninstall) ############################################################################ # DIST and other maintenance ############################################################################ # distribution directory dd = @PACKAGE_NAME@-@PACKAGE_VERSION@ srpm = @PACKAGE_NAME@-@PACKAGE_VERSION@ dist: @echo "'make dist' not implemented - use Tools/mkdist.py instead - e.g.:" @echo "Tools/mkdist.py @VERSION@ master" @false srcrpm: rm -fr $(srpm) $(srpm).src.rpm echo "TODO: update to use git instead of cvs" cvs export -d $(srpm) -r HEAD SWIG cp swig.spec $(srpm) tar -cf - $(srpm) | gzip --best > $(srpm).tar.gz rm -fr $(srpm) rpmbuild -ts $(srpm).tar.gz # Update the autoconf files for detecting host/targets. Automake will do this in # version 1.10 for our case of not having a top level Makefile.am. Until then we # can fetch them manually and will have to commit them to Git. configfiles: wget ftp://ftp.gnu.org/pub/gnu/config/config.guess -O Tools/config/config.guess chmod a+x Tools/config/config.guess wget ftp://ftp.gnu.org/pub/gnu/config/config.sub -O Tools/config/config.sub chmod a+x Tools/config/config.sub # Regenerate Makefile if Makefile.in or config.status have changed. Makefile: $(srcdir)/Makefile.in config.status $(SHELL) ./config.status # This target is usually called from Source/Makefile when configure.ac has # changed. am--refresh: $(srcdir)/configure $(srcdir)/configure: $(srcdir)/configure.ac @echo "Build system is out of date. If the following commands fail, please reconfigure by hand (rerun: ./autogen.sh && ./configure)" cd $(srcdir) && ./autogen.sh $(SHELL) ./config.status --recheck ############################################################################ # Tools ############################################################################ # Coverity static code analyser build and submit - EMAIL and PASSWORD need specifying # See http://scan.coverity.com/start/ EMAIL=wsf@fultondesigns.co.uk PASSWORD= coverity: test -n "$(PASSWORD)" || (echo "PASSWORD not set" && false) $(MAKE) clean-source rm -rf cov-int cov-build --dir cov-int $(MAKE) source tar czvf swig-coverity.tgz cov-int curl --form file=@swig-coverity.tgz --form project=swig --form password=$(PASSWORD) --form email=$(EMAIL) http://scan5.coverity.com/cgi-bin/upload.py # Makefile ends here swig-3.0.12/Tools/0000775000175000017500000000000013042756442013535 5ustar williamwilliamswig-3.0.12/Tools/travis-osx-install.sh0000775000175000017500000000105513042756442017660 0ustar williamwilliam#!/bin/bash set -e # exit on failure (same as -o errexit) sw_vers brew update brew list # brew install pcre # Travis Xcode-7.3 has pcre # brew install boost WITHLANG=$SWIGLANG case "$SWIGLANG" in "csharp") brew install mono ;; "guile") Tools/brew-install guile ;; "lua") brew install lua ;; "python") WITHLANG=$SWIGLANG$PY3 if [[ "$PY3" ]]; then brew install python3 brew list -v python3 fi ;; esac # Workaround for https://github.com/travis-ci/travis-ci/issues/6522 set +e # turn off exit on failure (same as +o errexit) swig-3.0.12/Tools/travis-linux-install.sh0000775000175000017500000000471213042756442020211 0ustar williamwilliam#!/bin/bash set -e # exit on failure (same as -o errexit) lsb_release -a sudo apt-get -qq update if [[ "$CC" == gcc-5 ]]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo apt-get -qq update sudo apt-get install -qq g++-5 elif [[ "$CC" == gcc-6 ]]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo apt-get -qq update sudo apt-get install -qq g++-6 fi sudo apt-get -qq install libboost-dev WITHLANG=$SWIGLANG case "$SWIGLANG" in "") ;; "csharp") sudo apt-get -qq install mono-devel ;; "d") wget http://downloads.dlang.org/releases/2014/dmd_2.066.0-0_amd64.deb sudo dpkg -i dmd_2.066.0-0_amd64.deb ;; "go") ;; "javascript") case "$ENGINE" in "node") sudo add-apt-repository -y ppa:chris-lea/node.js sudo apt-get -qq update sudo apt-get install -qq nodejs rlwrap sudo npm install -g node-gyp ;; "jsc") sudo apt-get install -qq libwebkitgtk-dev ;; "v8") sudo apt-get install -qq libv8-dev ;; esac ;; "guile") sudo apt-get -qq install guile-2.0-dev ;; "lua") if [[ -z "$VER" ]]; then sudo apt-get -qq install lua5.2 liblua5.2-dev else sudo add-apt-repository -y ppa:ubuntu-cloud-archive/mitaka-staging sudo apt-get -qq update sudo apt-get -qq install lua${VER} liblua${VER}-dev fi ;; "ocaml") # configure also looks for ocamldlgen, but this isn't packaged. But it isn't used by default so this doesn't matter. sudo apt-get -qq install ocaml ocaml-findlib ;; "octave") if [[ -z "$VER" ]]; then sudo apt-get -qq install liboctave-dev else sudo add-apt-repository -y ppa:kwwette/octaves sudo apt-get -qq update sudo apt-get -qq install liboctave${VER}-dev fi ;; "php5") sudo apt-get -qq install php5-cli php5-dev ;; "php") sudo add-apt-repository -y ppa:ondrej/php sudo apt-get -qq update sudo apt-get -qq install php$VER-cli php$VER-dev ;; "python") pip install pep8 if [[ "$PY3" ]]; then sudo apt-get install -qq python3-dev fi WITHLANG=$SWIGLANG$PY3 if [[ "$VER" ]]; then sudo add-apt-repository -y ppa:fkrull/deadsnakes sudo apt-get -qq update sudo apt-get -qq install python${VER}-dev WITHLANG=$SWIGLANG$PY3=$SWIGLANG$VER fi ;; "r") sudo apt-get -qq install r-base ;; "ruby") if [[ "$VER" ]]; then rvm install $VER fi ;; "scilab") sudo apt-get -qq install scilab ;; "tcl") sudo apt-get -qq install tcl-dev ;; esac set +e # turn off exit on failure (same as +o errexit) swig-3.0.12/Tools/testflags.py0000775000175000017500000000656113042756442016116 0ustar williamwilliam#!/usr/bin/env python def get_cflags(language, std, compiler): if std == None or len(std) == 0: std = "gnu89" c_common = "-fdiagnostics-show-option -std=" + std + " -Wno-long-long -Wreturn-type -Wdeclaration-after-statement -Wmissing-field-initializers" cflags = { "csharp":"-Werror " + c_common, "d":"-Werror " + c_common, "go":"-Werror " + c_common + " -Wno-declaration-after-statement", "guile":"-Werror " + c_common, "java":"-Werror " + c_common, "javascript":"-Werror " + c_common, "lua":"-Werror " + c_common, "octave":"-Werror " + c_common, "perl5":"-Werror " + c_common, "php":"-Werror " + c_common, "php5":"-Werror " + c_common, "python":"-Werror " + c_common, "r":"-Werror " + c_common, "ruby":"-Werror " + c_common, "scilab":"-Werror " + c_common, "tcl":"-Werror " + c_common, } if compiler == 'clang': cflags["guile"] += " -Wno-attributes" # -Wno-attributes is for clang LLVM 3.5 and bdw-gc < 7.5 used by guile if language not in cflags: raise RuntimeError("{} is not a supported language".format(language)) return cflags[language] def get_cxxflags(language, std, compiler): if std == None or len(std) == 0: std = "c++98" cxx_common = "-fdiagnostics-show-option -std=" + std + " -Wno-long-long -Wreturn-type -Wmissing-field-initializers" cxxflags = { "csharp":"-Werror " + cxx_common, "d":"-Werror " + cxx_common, "go":"-Werror " + cxx_common, "guile":"-Werror " + cxx_common, "java":"-Werror " + cxx_common, "javascript":"-Werror " + cxx_common + " -Wno-error=unused-function", # Until overload_rename is fixed for node "lua":"-Werror " + cxx_common, "octave":"-Werror " + cxx_common, "perl5":"-Werror " + cxx_common, "php":"-Werror " + cxx_common, "php5":"-Werror " + cxx_common, "python":"-Werror " + cxx_common, "r":"-Werror " + cxx_common, "ruby":"-Werror " + cxx_common, "scilab":"-Werror " + cxx_common, "tcl":"-Werror " + cxx_common, } if compiler == 'clang': cxxflags["guile"] += " -Wno-attributes" # -Wno-attributes is for clang LLVM 3.5 and bdw-gc < 7.5 used by guile if language not in cxxflags: raise RuntimeError("{} is not a supported language".format(language)) return cxxflags[language] import argparse parser = argparse.ArgumentParser(description="Display CFLAGS or CXXFLAGS to use for testing the SWIG examples and test-suite.") parser.add_argument('-l', '--language', required=True, help='set language to show flags for') flags = parser.add_mutually_exclusive_group(required=True) flags.add_argument('-c', '--cflags', action='store_true', default=False, help='show CFLAGS') flags.add_argument('-x', '--cxxflags', action='store_true', default=False, help='show CXXFLAGS') parser.add_argument('-s', '--std', required=False, help='language standard flags for the -std= option') parser.add_argument('-C', '--compiler', required=False, help='compiler used (clang or gcc)') args = parser.parse_args() if args.cflags: get_flags = get_cflags elif args.cxxflags: get_flags = get_cxxflags else: parser.print_help() exit(1) print(get_flags(args.language, args.std, args.compiler)) swig-3.0.12/Tools/mkwindows.sh0000775000175000017500000001110213042756442016111 0ustar williamwilliam#!/bin/sh # Build Windows distribution (swigwin-2.0.x.zip) from source tarball (swig-2.0.x.tar.gz) # Requires running in either: # - MinGW environment # - Linux using MinGW cross compiler # - Cygwin using MinGW compiler # path to zip program zip= # options for configure extraconfigureoptions= compileflags="-O2 -Wall -Wextra" if test x$1 != x; then version=$1 if test x$2 != x; then zip=$2; echo zip: $zip; fi else echo "Usage: mkwindows.sh version [zip]" echo " Build SWIG Windows distribution from source tarball. Works on Cygwin, MinGW or Linux" echo " version should be 2.0.x" echo " zip is full path to zip program - default is /c/cygwin/bin/zip on MinGW, zip on Linux and Cygwin" exit 1 fi uname=`uname -a` mingw=`echo "$uname" | grep -i mingw` linux=`echo "$uname" | grep -i linux` cygwin=`echo "$uname" | grep -i cygwin` if test "$mingw"; then echo "Building native Windows executable on MinGW"; if test x$zip = x; then zip=/c/cygwin/bin/zip fi else if test "$linux"; then echo "Building native Windows executable on Linux" if test x$zip = x; then zip=zip fi echo "Checking that mingw 32-bit gcc is installed/available" if test -n "`which i686-w64-mingw32-gcc`" ; then i686-w64-mingw32-gcc --version || exit 1 i686-w64-mingw32-g++ --version || exit 1 extraconfigureoptions="--host=i686-w64-mingw32 --build=i686-linux" # Statically link so that libstdc++-6.dll and libgcc_s_sjlj-1.dll don't have to be shipped compileflags="$compileflags -static-libgcc -static-libstdc++" elif test -n "`which i586-mingw32msvc-gcc`" ; then i586-mingw32msvc-gcc --version || exit 1 i586-mingw32msvc-g++ --version || exit 1 extraconfigureoptions="--host=i586-mingw32msvc --build=i686-linux" else echo "Could not detect mingw gcc - please install mingw-w64 package." exit 1; fi else if test "$cygwin"; then echo "Building native Windows executable on Cygwin" if test x$zip = x; then zip=zip fi compileflags="$compileflags -mno-cygwin" else echo "Unknown platform. Requires either Linux or MinGW." exit 1; fi fi fi export CFLAGS="$compileflags" export CXXFLAGS="$compileflags" swigbasename=swig-$version swigwinbasename=swigwin-$version tarball=$swigbasename.tar.gz pcre_tarball=`ls pcre-*.tar.*` if ! test -f "$pcre_tarball"; then echo "Could not find PCRE tarball. Please download a PCRE source tarball from http://www.pcre.org" echo "and place in the same directory as the SWIG tarball." exit 1 fi if test -f "$tarball"; then builddir=build-$version if test -e $builddir; then echo "Deleting directory $builddir..." rm -rf $builddir fi echo "Creating directory $builddir..." mkdir $builddir cd $builddir echo "Unzipping tarball..." tar -zxf ../$tarball sleep 2 # fix strange not finding newly created directory if test -d $swigbasename; then mv $swigbasename $swigwinbasename tar -zxf ../$tarball cd $swigbasename (cd ../.. && cp $pcre_tarball $builddir/$swigbasename) echo Running: Tools/pcre-build.sh $extraconfigureoptions ./Tools/pcre-build.sh $extraconfigureoptions echo Running: ./configure $extraconfigureoptions --without-alllang ./configure $extraconfigureoptions --without-alllang echo "Compiling (quietly)..." make > build.log echo "Simple check to see if swig.exe runs..." env LD_LIBRARY_PATH= PATH= ./swig.exe -version || exit 1 echo "Simple check to see if ccache-swig.exe runs..." env LD_LIBRARY_PATH= PATH= ./CCache/ccache-swig.exe -V || exit 1 echo "Creating $swigwinbasename.zip..." cd .. cp $swigbasename/swig.exe $swigwinbasename cp $swigbasename/CCache/ccache-swig.exe $swigwinbasename/CCache cp $swigbasename/Lib/swigwarn.swg $swigwinbasename/Lib sleep 2 # fix strange not finding swig.exe echo "Unzip into a directory of your choice. Please read the README file as well as Doc\Manual\Windows.html for installation instructions." > swig_windows_zip_comments.txt rm -f ../$swigwinbasename.zip $zip -q -r -9 -z < swig_windows_zip_comments.txt ../$swigwinbasename.zip $swigwinbasename rm -f swig_windows_zip_comments.txt echo "Cleaning up..." cd .. rm -rf $builddir echo "Finished building $swigwinbasename.zip" else echo "Expecting tarball to create directory: $swigbasename but it does not exist" exit 1 fi else echo tarball missing: $tarball exit 1 fi exit 0 swig-3.0.12/Tools/nuget-install.cmd0000664000175000017500000000116013042756442017006 0ustar williamwilliamrem Workaround 'nuget install' not being reliable by retrying a few times @echo off rem initiate the retry number set errorCode=1 set retryNumber=0 set maxRetries=5 :RESTORE nuget install %* rem problem? IF ERRORLEVEL %errorCode% GOTO :RETRY rem everything is fine! GOTO :EXIT :RETRY @echo Oops, nuget restore exited with code %errorCode% - let us try again! set /a retryNumber=%retryNumber%+1 IF %reTryNumber% LSS %maxRetries% (GOTO :RESTORE) IF %retryNumber% EQU %maxRetries% (GOTO :ERR) :ERR @echo Sorry, we tried restoring nuget packages for %maxRetries% times and all attempts were unsuccessful! EXIT /B 1 :EXIT swig-3.0.12/Tools/obs-buildlogs.py0000775000175000017500000000213513042756442016660 0ustar williamwilliam#!/usr/bin/env python import os import subprocess import argparse import glob def remove_old_files(): files = glob.glob("*.log") for file in files: os.remove(file) def download(): repos = subprocess.Popen(['osc', 'repositories'], stdout=subprocess.PIPE) for line in repos.stdout: command = ['osc', 'buildlog', '--last'] + line.split() filename = "-".join(line.split()) + ".log" print "Downloading logs using: {}".format(" ".join(command)) buildlog = subprocess.Popen(command, stdout=subprocess.PIPE) print("Writing log to {}".format(filename)) file = open(filename, "w") if buildlog.stderr != None: print("Errors: {}".format(buildlog.stderr)) for log_line in buildlog.stdout: file.write(log_line) print("Finished") parser = argparse.ArgumentParser(description="Download OpenBuild logs using osc. All the logs for each architecture from the last completed builds are downloaded and stored as .log files. Must be run from a working copy that is already checked out, eg after running obs-update.") args = parser.parse_args() remove_old_files() download() swig-3.0.12/Tools/config/0000775000175000017500000000000013042756667015013 5ustar williamwilliamswig-3.0.12/Tools/config/ax_compare_version.m40000664000175000017500000001465213042756442021137 0ustar williamwilliam# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_compare_version.html # =========================================================================== # # SYNOPSIS # # AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # # DESCRIPTION # # This macro compares two version strings. Due to the various number of # minor-version numbers that can exist, and the fact that string # comparisons are not compatible with numeric comparisons, this is not # necessarily trivial to do in a autoconf script. This macro makes doing # these comparisons easy. # # The six basic comparisons are available, as well as checking equality # limited to a certain number of minor-version levels. # # The operator OP determines what type of comparison to do, and can be one # of: # # eq - equal (test A == B) # ne - not equal (test A != B) # le - less than or equal (test A <= B) # ge - greater than or equal (test A >= B) # lt - less than (test A < B) # gt - greater than (test A > B) # # Additionally, the eq and ne operator can have a number after it to limit # the test to that number of minor versions. # # eq0 - equal up to the length of the shorter version # ne0 - not equal up to the length of the shorter version # eqN - equal up to N sub-version levels # neN - not equal up to N sub-version levels # # When the condition is true, shell commands ACTION-IF-TRUE are run, # otherwise shell commands ACTION-IF-FALSE are run. The environment # variable 'ax_compare_version' is always set to either 'true' or 'false' # as well. # # Examples: # # AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) # AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) # # would both be true. # # AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) # AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) # # would both be false. # # AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) # # would be true because it is only comparing two minor versions. # # AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) # # would be true because it is only comparing the lesser number of minor # versions of the two values. # # Note: The characters that separate the version numbers do not matter. An # empty string is the same as version 0. OP is evaluated by autoconf, not # configure, so must be a string, not a variable. # # The author would like to acknowledge Guido Draheim whose advice about # the m4_case and m4_ifvaln functions make this macro only include the # portions necessary to perform the specific comparison specified by the # OP argument in the final configure script. # # LICENSE # # Copyright (c) 2008 Tim Toolan # # 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. This file is offered as-is, without any # warranty. #serial 11 dnl ######################################################################### AC_DEFUN([AX_COMPARE_VERSION], [ AC_REQUIRE([AC_PROG_AWK]) # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. AS_VAR_PUSHDEF([A],[ax_compare_version_A]) A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` AS_VAR_PUSHDEF([B],[ax_compare_version_B]) B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ -e 's/[[^0-9]]//g'` dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary dnl # then the first line is used to determine if the condition is true. dnl # The sed right after the echo is to remove any indented white space. m4_case(m4_tolower($2), [lt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [gt],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` ], [le],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` ], [ge],[ ax_compare_version=`echo "x$A x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` ],[ dnl Split the operator from the subversion count if present. m4_bmatch(m4_substr($2,2), [0],[ # A count of zero means use the length of the shorter version. # Determine the number of characters in A and B. ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` # Set A to no more than B's length and B to no more than A's length. A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` ], [[0-9]+],[ # A count greater than zero means use only that many subversions A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` ], [.+],[ AC_WARNING( [illegal OP numeric parameter: $2]) ],[]) # Pad zeros at end of numbers to make same length. ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" B="$B`echo $A | sed 's/./0/g'`" A="$ax_compare_version_tmp_A" # Check for equality or inequality as necessary. m4_case(m4_tolower(m4_substr($2,0,2)), [eq],[ test "x$A" = "x$B" && ax_compare_version=true ], [ne],[ test "x$A" != "x$B" && ax_compare_version=true ],[ AC_WARNING([illegal OP parameter: $2]) ]) ]) AS_VAR_POPDEF([A])dnl AS_VAR_POPDEF([B])dnl dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. if test "$ax_compare_version" = "true" ; then m4_ifvaln([$4],[$4],[:])dnl m4_ifvaln([$5],[else $5])dnl fi ]) dnl AX_COMPARE_VERSION swig-3.0.12/Tools/config/install-sh0000755000175000017500000003546313042756667017030 0ustar williamwilliam#!/bin/sh # install - install a program, script, or datafile scriptversion=2014-09-12.12; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # $RANDOM is not portable (e.g. dash); use it when possible to # lower collision chance tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so # create the $tmpdir first (and fail if unsuccessful) to make sure # that nobody tries to guess the $tmpdir name. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: swig-3.0.12/Tools/config/depcomp0000755000175000017500000005601613042756667016376 0ustar williamwilliam#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2013-05-30.07; # UTC # Copyright (C) 1999-2014 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: swig-3.0.12/Tools/config/ax_cxx_compile_stdcxx_11.m40000664000175000017500000001002413042756442022141 0ustar williamwilliam# ============================================================================ # http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================ # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext], [nostop]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXXFLAGS to enable support. # CXX11FLAGS will also contain any necessary switches to enable support. # HAVE_CXX11_COMPILER will additionally be set to yes if there is support. # If the second argument is not specified, errors out if no mode that # supports C++11 baseline syntax can be found. The first argument, if # specified, indicates whether you insist on an extended mode # (e.g. -std=gnu++11) or a strict conformance mode (e.g. -std=c++11). # If neither is specified, you get whatever works, with preference for an # extended mode. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2012 William Fulton # # 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. This file is offered as-is, without any # warranty. #serial 1 m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); ]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl m4_if([$1], [], [], [$1], [ext], [], [$1], [noext], [], [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl m4_if([$2], [], [], [$2], [nostop], [], [m4_fatal([invalid argument `$2' to AX_CXX_COMPILE_STDCXX_11])])dnl AC_LANG_ASSERT([C++])dnl ac_success=no CXX11FLAGS= AC_CACHE_CHECK(whether $CXX supports C++11 features by default, ax_cv_cxx_compile_cxx11, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [ax_cv_cxx_compile_cxx11=yes], [ax_cv_cxx_compile_cxx11=no])]) if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi m4_if([$1], [noext], [], [dnl if test x$ac_success = xno; then for switch in -std=gnu++11 -std=gnu++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" CXX11FLAGS=$switch ac_success=yes break fi done fi]) m4_if([$1], [ext], [], [dnl if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch]) AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch, $cachevar, [ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])], [eval $cachevar=yes], [eval $cachevar=no]) CXXFLAGS="$ac_save_CXXFLAGS"]) if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" CXX11FLAGS=$switch ac_success=yes break fi done fi]) if test x$ac_success = xno; then if test x$2 != xnostop; then AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.]) fi else HAVE_CXX11_COMPILER=yes fi ]) swig-3.0.12/Tools/config/compile0000755000175000017500000001624513042756667016377 0ustar williamwilliam#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: swig-3.0.12/Tools/config/ac_define_dir.m40000664000175000017500000000224013042756442017775 0ustar williamwilliamdnl @synopsis AC_DEFINE_DIR(VARNAME, DIR [, DESCRIPTION]) dnl dnl This macro sets VARNAME to the expansion of the DIR variable, dnl taking care of fixing up ${prefix} and such. dnl dnl VARNAME is then offered as both an output variable and a C dnl preprocessor symbol. dnl dnl Example: dnl dnl AC_DEFINE_DIR([DATADIR], [datadir], [Where data are placed to.]) dnl dnl @category Misc dnl @author Stepan Kasal dnl @author Andreas Schwab dnl @author Guido Draheim dnl @author Alexandre Oliva dnl @version 2005-07-29 dnl @license AllPermissive AC_DEFUN([AC_DEFINE_DIR], [ prefix_NONE= exec_prefix_NONE= test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn dnl refers to ${prefix}. Thus we have to use `eval' twice. eval ac_define_dir="\"[$]$2\"" eval ac_define_dir="\"$ac_define_dir\"" AC_SUBST($1, "$ac_define_dir") AC_DEFINE_UNQUOTED($1, "$ac_define_dir", [$3]) test "$prefix_NONE" && prefix=NONE test "$exec_prefix_NONE" && exec_prefix=NONE ]) swig-3.0.12/Tools/config/ax_path_generic.m40000664000175000017500000001262613042756442020373 0ustar williamwilliam# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_path_generic.html # =========================================================================== # # SYNOPSIS # # AX_PATH_GENERIC(LIBRARY,[MINIMUM-VERSION,[SED-EXPR-EXTRACTOR]],[ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],[CONFIG-SCRIPTS],[CFLAGS-ARG],[LIBS-ARG]) # # DESCRIPTION # # Runs the LIBRARY-config script and defines LIBRARY_CFLAGS and # LIBRARY_LIBS unless the user had predefined them in the environment. # # The script must support `--cflags' and `--libs' args. If MINIMUM-VERSION # is specified, the script must also support the `--version' arg. If the # `--with-library-[exec-]prefix' arguments to ./configure are given, it # must also support `--prefix' and `--exec-prefix'. Prefereable use # CONFIG-SCRIPTS as config script, CFLAGS-ARG instead of `--cflags` and # LIBS-ARG instead of `--libs`, if given. # # The SED-EXPR-EXTRACTOR parameter representes the expression used in sed # to extract the version number. Use it if your 'foo-config --version' # dumps something like 'Foo library v1.0.0 (alfa)' instead of '1.0.0'. # # The macro respects LIBRARY_CONFIG, LIBRARY_CFLAGS and LIBRARY_LIBS # variables. If the first one is defined, it specifies the name of the # config script to use. If the latter two are defined, the script is not # ran at all and their values are used instead (if only one of them is # defined, the empty value of the remaining one is still used). # # Example: # # AX_PATH_GENERIC(Foo, 1.0.0) # # would run `foo-config --version' and check that it is at least 1.0.0, if # successful the following variables would be defined and substituted: # # FOO_CFLAGS to `foo-config --cflags` # FOO_LIBS to `foo-config --libs` # # Example: # # AX_PATH_GENERIC([Bar],,,[ # AC_MSG_ERROR([Cannot find Bar library]) # ]) # # would check for bar-config program, defining and substituting the # following variables: # # BAR_CFLAGS to `bar-config --cflags` # BAR_LIBS to `bar-config --libs` # # Example: # # ./configure BAZ_LIBS=/usr/lib/libbaz.a # # would link with a static version of baz library even if `baz-config # --libs` returns just "-lbaz" that would normally result in using the # shared library. # # This macro is a rearranged version of AC_PATH_GENERIC from Angus Lees. # # LICENSE # # Copyright (c) 2009 Francesco Salvestrini # # 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. This file is offered as-is, without any # warranty. #serial 13 AU_ALIAS([AC_PATH_GENERIC], [AX_PATH_GENERIC]) AC_DEFUN([AX_PATH_GENERIC],[ AC_REQUIRE([AC_PROG_SED]) dnl we're going to need uppercase and lowercase versions of the dnl string `LIBRARY' pushdef([UP], translit([$1], [a-z], [A-Z]))dnl pushdef([DOWN], translit([$1], [A-Z], [a-z]))dnl AC_ARG_WITH(DOWN-prefix,[AS_HELP_STRING([--with-]DOWN[-prefix=PREFIX], [Prefix where $1 is installed (optional)])], DOWN[]_config_prefix="$withval", DOWN[]_config_prefix="") AC_ARG_WITH(DOWN-exec-prefix,[AS_HELP_STRING([--with-]DOWN[-exec-prefix=EPREFIX], [Exec prefix where $1 is installed (optional)])], DOWN[]_config_exec_prefix="$withval", DOWN[]_config_exec_prefix="") AC_ARG_VAR(UP[]_CONFIG, [config script used for $1]) AC_ARG_VAR(UP[]_CFLAGS, [CFLAGS used for $1]) AC_ARG_VAR(UP[]_LIBS, [LIBS used for $1]) AS_IF([test x"$UP[]_CFLAGS" != x -o x"$UP[]_LIBS" != x],[ dnl Don't run config script at all, use user-provided values instead. AC_SUBST(UP[]_CFLAGS) AC_SUBST(UP[]_LIBS) : $4 ],[ AS_IF([test x$DOWN[]_config_exec_prefix != x],[ DOWN[]_config_args="$DOWN[]_config_args --exec-prefix=$DOWN[]_config_exec_prefix" AS_IF([test x${UP[]_CONFIG+set} != xset],[ UP[]_CONFIG=$DOWN[]_config_exec_prefix/bin/DOWN-config ]) ]) AS_IF([test x$DOWN[]_config_prefix != x],[ DOWN[]_config_args="$DOWN[]_config_args --prefix=$DOWN[]_config_prefix" AS_IF([test x${UP[]_CONFIG+set} != xset],[ UP[]_CONFIG=$DOWN[]_config_prefix/bin/DOWN-config ]) ]) AC_PATH_PROGS(UP[]_CONFIG,[$6 DOWN-config],[no]) AS_IF([test "$UP[]_CONFIG" = "no"],[ : $5 ],[ dnl Get the CFLAGS from LIBRARY-config script AS_IF([test x"$7" = x],[ UP[]_CFLAGS="`$UP[]_CONFIG $DOWN[]_config_args --cflags`" ],[ UP[]_CFLAGS="`$UP[]_CONFIG $DOWN[]_config_args $7`" ]) dnl Get the LIBS from LIBRARY-config script AS_IF([test x"$8" = x],[ UP[]_LIBS="`$UP[]_CONFIG $DOWN[]_config_args --libs`" ],[ UP[]_LIBS="`$UP[]_CONFIG $DOWN[]_config_args $8`" ]) AS_IF([test x"$2" != x],[ dnl Check for provided library version AS_IF([test x"$3" != x],[ dnl Use provided sed expression DOWN[]_version="`$UP[]_CONFIG $DOWN[]_config_args --version | $SED -e $3`" ],[ DOWN[]_version="`$UP[]_CONFIG $DOWN[]_config_args --version | $SED -e 's/^\ *\(.*\)\ *$/\1/'`" ]) AC_MSG_CHECKING([for $1 ($DOWN[]_version) >= $2]) AX_COMPARE_VERSION($DOWN[]_version,[ge],[$2],[ AC_MSG_RESULT([yes]) AC_SUBST(UP[]_CFLAGS) AC_SUBST(UP[]_LIBS) : $4 ],[ AC_MSG_RESULT([no]) : $5 ]) ],[ AC_SUBST(UP[]_CFLAGS) AC_SUBST(UP[]_LIBS) : $4 ]) ]) ]) popdef([UP]) popdef([DOWN]) ]) swig-3.0.12/Tools/config/ax_boost_base.m40000664000175000017500000002576713042756442020075 0ustar williamwilliam# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_boost_base.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Test for the Boost C++ libraries of a particular version (or newer) # # If no path to the installed boost library is given the macro searchs # under /usr, /usr/local, /opt and /opt/local and evaluates the # $BOOST_ROOT environment variable. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) # # And sets: # # HAVE_BOOST # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2009 Peter Adolphs # # 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. This file is offered as-is, without any # warranty. #serial 26 AC_DEFUN([AX_BOOST_BASE], [ AC_ARG_WITH([boost], [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], [use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) @<:@ARG=yes@:>@ ])], [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ac_boost_path="" else want_boost="yes" ac_boost_path="$withval" fi ], [want_boost="yes"]) AC_ARG_WITH([boost-libdir], AS_HELP_STRING([--with-boost-libdir=LIB_DIR], [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]), [ if test -d "$withval" then ac_boost_lib_path="$withval" else AC_MSG_ERROR(--with-boost-libdir expected directory name) fi ], [ac_boost_lib_path=""] ) if test "x$want_boost" = "xyes"; then boost_lib_version_req=ifelse([$1], ,1.20.0,$1) boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` if test "x$boost_lib_version_req_sub_minor" = "x" ; then boost_lib_version_req_sub_minor="0" fi WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) succeeded=no dnl On 64-bit systems check for system libraries in both lib64 and lib. dnl The former is specified by FHS, but e.g. Debian does not adhere to dnl this (as it rises problems for generic multi-arch support). dnl The last entry in the list is chosen by default when no libraries dnl are found, e.g. when only header-only libraries are installed! libsubdirs="lib" ax_arch=`uname -m` case $ax_arch in x86_64) libsubdirs="lib64 libx32 lib lib64" ;; ppc64|s390x|sparc64|aarch64|ppc64le) libsubdirs="lib64 lib lib64 ppc64le" ;; esac dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give dnl them priority over the other paths since, if libs are found there, they dnl are almost assuredly the ones desired. AC_REQUIRE([AC_CANONICAL_HOST]) libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs" case ${host_cpu} in i?86) libsubdirs="lib/i386-${host_os} $libsubdirs" ;; esac dnl first we check the system location for boost libraries dnl this location ist chosen if boost libraries are installed with the --layout=system option dnl or if you install boost with RPM if test "$ac_boost_path" != ""; then BOOST_CPPFLAGS="-I$ac_boost_path/include" for ac_boost_path_tmp in $libsubdirs; do if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" break fi done elif test "$cross_compiling" != yes; then for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then for libsubdir in $libsubdirs ; do if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" break; fi done fi dnl overwrite ld flags if we have required special directory with dnl --with-boost-libdir parameter if test "$ac_boost_lib_path" != ""; then BOOST_LDFLAGS="-L$ac_boost_lib_path" fi CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes"; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= BOOST_LDFLAGS= _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done dnl if nothing found search for layout used in Windows distributions if test -z "$BOOST_CPPFLAGS"; then if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then BOOST_CPPFLAGS="-I$ac_boost_path" fi fi fi else if test "$cross_compiling" != yes; then for ac_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp best_path=$ac_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test "$ac_boost_lib_path" = ""; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test "x$BOOST_ROOT" != "x"; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) fi if test "$succeeded" != "yes" ; then if test "$_version" = "0" ; then AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) else AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) fi # execute ACTION-IF-NOT-FOUND (if present): ifelse([$3], , :, [$3]) else AC_SUBST(BOOST_CPPFLAGS) AC_SUBST(BOOST_LDFLAGS) AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) # execute ACTION-IF-FOUND (if present): ifelse([$2], , :, [$2]) fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) swig-3.0.12/Tools/config/ac_compile_warnings.m40000664000175000017500000000335313042756442021253 0ustar williamwilliamdnl @synopsis AC_COMPILE_WARNINGS dnl dnl Set the maximum warning verbosity according to C and C++ compiler used. dnl Currently supports g++ and gcc. dnl dnl The compiler options are always added CFLAGS and CXXFLAGS even if dnl these are overridden at configure time. Removing the maximum warning dnl flags can be removed with --without-maximum-compile-warnings. For example: dnl dnl ./configure --without-maximum-compile-warnings CFLAGS= CXXFLAGS= dnl dnl @category Misc dnl @author Loic Dachary dnl @author William Fulton dnl @version 2005-04-29 dnl @license GPLWithACException AC_DEFUN([AC_COMPILE_WARNINGS], [ AC_MSG_CHECKING([maximum warning verbosity option]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_CXX]) AC_ARG_WITH([maximum-compile-warnings], AS_HELP_STRING([--without-maximum-compile-warnings], [Disable maximum warning verbosity]), [ac_compile_warnings_on="$withval"], [ac_compile_warnings_on=""]) if test x"$ac_compile_warnings_on" = xno then ac_compile_warnings_msg=no else if test -n "$CXX" then if test "$GXX" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" fi if test -n "$CC" then if test "$GCC" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" fi fi AC_MSG_RESULT([$ac_compile_warnings_msg]) unset ac_compile_warnings_msg unset ac_compile_warnings_opt ]) swig-3.0.12/Tools/config/ylwrap0000755000175000017500000001531213042756667016257 0ustar williamwilliam#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2013-01-12.17; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # Written by Tom Tromey . # # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . get_dirname () { case $1 in */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; # Otherwise, we want the empty string (not "."). esac } # guard FILE # ---------- # The CPP macro used to guard inclusion of FILE. guard () { printf '%s\n' "$1" \ | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ -e 's/__*/_/g' } # quote_for_sed [STRING] # ---------------------- # Return STRING (or stdin) quoted to be used as a sed pattern. quote_for_sed () { case $# in 0) cat;; 1) printf '%s\n' "$1";; esac \ | sed -e 's|[][\\.*]|\\&|g' } case "$1" in '') echo "$0: No files given. Try '$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input=$1 shift # We'll later need for a correct munging of "#line" directives. input_sub_rx=`get_dirname "$input" | quote_for_sed` case $input in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input=`pwd`/$input ;; esac input_rx=`get_dirname "$input" | quote_for_sed` # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot=false if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot=true fi # The parser itself, the first file, is the destination of the .y.c # rule in the Makefile. parser=$1 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for # instance, we rename #include "y.tab.h" into #include "parse.h" # during the conversion from y.tab.c to parse.c. sed_fix_filenames= # Also rename header guards, as Bison 2.7 for instance uses its header # guard in its implementation file. sed_fix_header_guards= while test $# -ne 0; do if test x"$1" = x"--"; then shift break fi from=$1 # Handle y_tab.c and y_tab.h output by DOS if $y_tab_nodot; then case $from in "y.tab.c") from=y_tab.c;; "y.tab.h") from=y_tab.h;; esac fi shift to=$1 shift sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" done # The program to run. prog=$1 shift # Make any relative path in $prog absolute. case $prog in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog=`pwd`/$prog ;; esac dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then for from in * do to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend '../'. case $to in [\\/]* | ?:[\\/]*) target=$to;; *) target=../$to;; esac # Do not overwrite unchanged header files to avoid useless # recompilations. Always update the parser itself: it is the # destination of the .y.c rule in the Makefile. Divert the # output of all other files to a temporary file so we can # compare them to existing versions. if test $from != $parser; then realtarget=$target target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` fi # Munge "#line" or "#" directives. Don't let the resulting # debug information point at an absolute srcdir. Use the real # output file name, not yy.lex.c for instance. Adjust the # include guards too. sed -e "/^#/!b" \ -e "s|$input_rx|$input_sub_rx|" \ -e "$sed_fix_filenames" \ -e "$sed_fix_header_guards" \ "$from" >"$target" || ret=$? # Check whether files must be updated. if test "$from" != "$parser"; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$to is unchanged" rm -f "$target" else echo "updating $to" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the parser. This is a # blatant hack to let us support using "yacc -d". If -d is not # specified, don't fail when the header file is "missing". if test "$from" = "$parser"; then ret=1 fi fi done fi # Remove the directory. cd .. rm -rf $dirname exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: swig-3.0.12/Tools/config/missing0000755000175000017500000001533013042756667016412 0ustar williamwilliam#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: swig-3.0.12/Tools/config/config.guess0000755000175000017500000012475313042756667017345 0ustar williamwilliam#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This 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 . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || \ echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then 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) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; e2k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp 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` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: swig-3.0.12/Tools/config/config.sub0000755000175000017500000010646013042756667017003 0ustar williamwilliam#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2015 Free Software Foundation, Inc. timestamp='2015-08-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This 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 . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: swig-3.0.12/Tools/brew-install0000775000175000017500000000120713042756442016066 0ustar williamwilliam#!/bin/bash # Wrapper around 'brew install' emitting a message every minute if the command is still running. # This is used on Travis to ensure the install isn't killed when there is no output over a long period (10 minutes). # Usage: brew-install package, where package is the name of the package for brew to install. seconds=0 minutes=0 brew install $1 & while true; do ps -p$! 2>& 1>/dev/null if [ $? = 0 ]; then if [ $seconds = 60 ]; then let seconds=0 let minutes=minutes+1 echo "brew install $1 still running ($minutes min)" fi sleep 1 let seconds=seconds+1 else break fi done wait $! exit $? swig-3.0.12/Tools/pcre-build.sh0000775000175000017500000000427113042756442016126 0ustar williamwilliam#!/bin/sh pcre_subdir=pcre/pcre-swig-install pcre_install_dir=`pwd`/$pcre_subdir usage() { echo "Helper script to build PCRE as a static library from a tarball just for use during the" echo "SWIG build. It does not install PCRE for global use on your system." echo "Usage: pcre-build.sh [--help] [args]" echo " args - optional additional arguments passed on to the PCRE configure script (leave out" echo " unless you are an expert at configure)" echo " --help - Display this help information." echo "Instructions:" echo " - Download the latest PCRE source tarball from http://www.pcre.org and place in the" echo " directory that you will configure and build SWIG." echo " - Run this script in the same directory that you intend to configure and build SWIG in." echo " This will configure and build PCRE as a static library." echo " - Afterwards run the SWIG configure script which will then find and use the PCRE static" echo " libraries in the $pcre_subdir subdirectory." exit 0 } bail() { echo $1 >&2 exit 1 } if test "$1" = "-h" -o "$1" = "-help" -o "$1" = "--help" ; then usage fi if test -f "pcre-build.sh" ; then echo "Error: this script should not be run in the Tools directory" >&2 echo "" usage fi echo "Looking for PCRE tarball..." rm -rf pcre pcre_tarball=`ls pcre-*.tar*` test -n "$pcre_tarball" || bail "Could not find tarball matching pattern: pcre-*.tar*" test -f "$pcre_tarball" || bail "Could not find a single PCRE tarball. Found: $pcre_tarball" echo "Extracting tarball: $pcre_tarball" tar -xf $pcre_tarball || bail "Could not untar $pcre_tarball" pcre_dir=`echo $pcre_tarball | sed -e "s/\.tar.*//"` echo "Configuring PCRE in directory: pcre" mv $pcre_dir pcre || bail "Could not create pcre directory" cd pcre && ./configure --prefix=$pcre_install_dir --disable-shared $* || bail "PCRE configure failed" echo "Building PCRE..." ${MAKE:-make} -s || bail "Could not build PCRE" echo "Installing PCRE locally to $pcre_install_dir..." ${MAKE:-make} -s install || bail "Could not install PCRE" echo "" echo "The SWIG configure script can now be run, whereupon PCRE will automatically be detected and used from $pcre_install_dir/bin/pcre-config." swig-3.0.12/Tools/check-include-path.pike0000664000175000017500000000110713042756442020036 0ustar williamwilliam/** * This is a helper script to identify the proper include path * for Pike header files. It should be run with the full path * to the Pike executable as its single argument, e.g. * * pike check-include-path.pike /usr/local/bin/pike * * and its output should be the correct path to the header * files, e.g. * * /usr/local/pike/7.2.239/include/pike * */ int main(int argc, array(string) argv) { string prefix = replace(argv[1], "/bin/pike", ""); write(prefix + "/pike/" + __MAJOR__ + "." + __MINOR__ + "." + __BUILD__ + "/include/pike"); return 0; } swig-3.0.12/Tools/vcfilter0000775000175000017500000000065713042756442015311 0ustar williamwilliam#!/bin/sh # This is a simple utility for Cygwin/Mingw which is useful when running the SWIG # test-suite through Visual Studio. If the output from the test-suite is piped # through this utility, it will filter the junk that the compiler outputs to stdout. # Typical usage: make check | vcfilter # dos2unix needed for ^ and $ to work. 2>&1 dos2unix | grep -v -e "\.cxx$" -e "\.c$" -e "^ Creating library" -e "^Generating Code" swig-3.0.12/Tools/mkdist.py0000775000175000017500000000607113042756442015411 0ustar williamwilliam#!/usr/bin/env python # This script builds a swig-x.y.z distribution. # Usage: mkdist.py version branch, where version should be x.y.z and branch is normally 'master' import sys import string import os import subprocess def failed(): print "mkdist.py failed to complete" sys.exit(2) try: version = sys.argv[1] dirname = "swig-" + version branch = sys.argv[2] except: print "Usage: mkdist.py version branch, where version should be x.y.z and branch is normally 'master'" sys.exit(1) if sys.version_info[0:2] < (2, 7): print "Error: Python 2.7 is required" sys.exit(3) # Check name matches normal unix conventions if string.lower(dirname) != dirname: print "directory name ("+dirname+") should be in lowercase" sys.exit(3) # If directory and tarball exist, remove it print "Removing ", dirname os.system("rm -rf "+dirname) print "Removing "+dirname+".tar if exists" os.system("rm -f "+dirname+".tar.gz") print "Removing "+dirname+".tar.gz if exists" os.system("rm -f "+dirname+".tar") # Grab the code from git print "Checking git repository is in sync with remote repository" os.system("git remote update origin") == 0 or failed() command = ["git", "status", "--porcelain", "-uno"] out = subprocess.check_output(command) if out.strip() != "": print "Local git repository has modifications" print " ".join(command) print out sys.exit(3) command = ["git", "log", "--oneline", branch + "..origin/" + branch] out = subprocess.check_output(command) if out.strip() != "": print "Remote repository has additional modifications to local repository" print " ".join(command) print out sys.exit(3) command = ["git", "log", "--oneline", "origin/" + branch + ".." + branch] out = subprocess.check_output(command) if out.strip() != "": print "Local repository has modifications not pushed to the remote repository" print "These should be pushed and checked that they pass Continuous Integration testing before continuing" print " ".join(command) print out sys.exit(3) print "Tagging release" tag = "'rel-" + version + "'" os.system("git tag -a -m " + tag + " " + tag) == 0 or failed() outdir = os.path.basename(os.getcwd()) + "/" + dirname + "/" print "Grabbing tagged release git repository using 'git archive' into " + outdir os.system("(cd .. && git archive --prefix=" + outdir + " " + tag + " . | tar -xf -)") == 0 or failed() # Go build the system print "Building system" os.system("cd "+dirname+" && ./autogen.sh") == 0 or failed() os.system("cd "+dirname+"/Source/CParse && bison -y -d parser.y && mv y.tab.c parser.c && mv y.tab.h parser.h") == 0 or failed() os.system("cd "+dirname+" && make -f Makefile.in libfiles srcdir=./") == 0 or failed() # Remove autoconf files os.system("find "+dirname+" -name autom4te.cache -exec rm -rf {} \\;") # Build documentation print "Building html documentation" os.system("cd "+dirname+"/Doc/Manual && make all clean-baks") == 0 or failed() # Build the tar-ball os.system("tar -cf "+dirname+".tar "+dirname) == 0 or failed() os.system("gzip "+dirname+".tar") == 0 or failed() print "Finished building "+dirname+".tar.gz" swig-3.0.12/Tools/capitalize0000775000175000017500000000034713042756442015614 0ustar williamwilliam#!/bin/sh # usage: capitalize word # write word to stdout w/ first character upcased first_char=`echo $1 | sed 's/^\(.\).*/\1/' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` echo ${first_char}`echo $1 | sed 's/^.//'` swig-3.0.12/Tools/swig.gdb0000664000175000017500000000244013042756442015164 0ustar williamwilliam# User-defined commands for easier debugging of SWIG in gdb # # This file can be "included" into your main .gdbinit file using: # source swig.gdb # or otherwise paste the contents into .gdbinit # # Note all user defined commands can be seen using: # (gdb) show user # The documentation for each command can be easily viewed, for example: # (gdb) help swigprint define swigprint if ($argc == 2) set $expand_count = $arg1 else set $expand_count = -1 end Printf "%s\n", Swig_to_string($arg0, $expand_count) end document swigprint Displays any SWIG DOH object Usage: swigprint swigobject [hashexpandcount] swigobject - The object to display. hashexpandcount - Number of nested Hash types to expand (default is 1). See Swig_set_max_hash_expand() to change default. end define locswigprint if ($argc == 2) set $expand_count = $arg1 else set $expand_count = -1 end Printf "%s\n", Swig_to_string_with_location($arg0, $expand_count) end document locswigprint Displays any SWIG DOH object prefixed with file and line location Usage: locswigprint swigobject [hashexpandcount] swigobject - The object to display. hashexpandcount - Number of nested Hash types to expand (default is 1). See Swig_set_max_hash_expand() to change default. end swig-3.0.12/Tools/javascript/0000775000175000017500000000000013042756442015703 5ustar williamwilliamswig-3.0.12/Tools/javascript/js_shell.h0000664000175000017500000000161013042756442017655 0ustar williamwilliam#ifndef JS_SHELL_H #define JS_SHELL_H #include #include typedef void* HANDLE; typedef void* MODULE; class JSShell { public: enum Engine { JSC = 0, V8 }; public: JSShell() {} virtual ~JSShell() = 0; static JSShell* Create(Engine engine = JSC); std::string LoadModule(const std::string& name, HANDLE* library); virtual bool RunScript(const std::string& scriptPath); virtual bool RunShell(); void setModulePath(const std::vector& modulePath) { module_path = modulePath; } protected: virtual bool InitializeEngine() = 0; virtual bool ExecuteScript(const std::string& source, const std::string& scriptPath) = 0; virtual bool DisposeEngine() = 0; static std::string ReadFile(const std::string& fileName); protected: std::vector loaded_modules; std::vector module_path; }; #endif // JS_SHELL_H swig-3.0.12/Tools/javascript/Makefile.in0000664000175000017500000000432213042756442017751 0ustar williamwilliam# ---------------------------------------------------------------- # Compile a custom javascript interpreter # ---------------------------------------------------------------- # # Note: # There is no common CLI Javascript interpreter. # V8 comes with one 'd8' which however does not provide a means # to load extensions. Therefore, by default we use nodejs as # environment. # For testing native v8 and jsc extensions we provide our own # interpreter (see 'Tools/javascript'). # # ---------------------------------------------------------------- all: javascript CC = @CC@ # HACK: under Mac OS X a g++ compiled interpreter is seg-faulting when loading module libraries # with 'c++' it works... probably some missing flags? JSCXX = @JSINTERPRETERCXX@ CPPFLAGS = @BOOST_CPPFLAGS@ CFLAGS = @PLATCFLAGS@ CXXFLAGS = @PLATCXXFLAGS@ LDFLAGS = LINKFLAGS = @JSINTERPRETERLINKFLAGS@ ROOT_DIR = @ROOT_DIR@ JSINCLUDES = @JSCOREINC@ @JSV8INC@ JSDYNAMICLINKING = @JSCOREDYNAMICLINKING@ @JSV8DYNAMICLINKING@ JSV8ENABLED = @JSV8ENABLED@ JSCENABLED = @JSCENABLED@ srcdir = @srcdir@ ifneq (, $(V8_VERSION)) JSV8_VERSION=$(V8_VERSION) else JSV8_VERSION=0x031110 endif # Regenerate Makefile if Makefile.in or config.status have changed. Makefile: $(srcdir)/Makefile.in ../../config.status cd ../.. && $(SHELL) ./config.status Tools/javascript/Makefile # These settings are provided by 'configure' (see '/configure.in') ifeq (1, $(JSV8ENABLED)) JS_INTERPRETER_SRC_V8 = v8_shell.cxx JS_INTERPRETER_ENABLE_V8 = -DENABLE_V8 -DSWIG_V8_VERSION=$(JSV8_VERSION) -DV8_DEPRECATION_WARNINGS endif ifeq (1, $(JSCENABLED)) JS_INTERPRETER_SRC_JSC = jsc_shell.cxx JS_INTERPRETER_ENABLE_JSC = -DENABLE_JSC endif JS_INTERPRETER_DEFINES = $(JS_INTERPRETER_ENABLE_JSC) $(JS_INTERPRETER_ENABLE_V8) JS_INTERPRETER_SRC = javascript.cxx js_shell.cxx $(JS_INTERPRETER_SRC_JSC) $(JS_INTERPRETER_SRC_V8) JS_INTERPRETER_OBJS = $(JS_INTERPRETER_SRC:.cxx=.o) %.o: $(srcdir)/%.cxx $(JSCXX) $(JS_INTERPRETER_DEFINES) $(CPPFLAGS) $(CXXFLAGS) $(JSINCLUDES) -o $@ -c $< javascript: $(JS_INTERPRETER_OBJS) $(JSCXX) $^ $(CXXFLAGS) $(LDFLAGS) -o javascript $(JSDYNAMICLINKING) $(LINKFLAGS) clean: rm -f *.o rm -f javascript distclean: clean rm -f Makefile swig-3.0.12/Tools/javascript/jsc_shell.cxx0000664000175000017500000001576313042756442020411 0ustar williamwilliam#include #include "js_shell.h" #include #include #ifdef __GNUC__ #include #define LOAD_SYMBOL(handle, name) dlsym(handle, name) #else #error "implement dll loading" #endif class JSCShell: public JSShell { typedef int (*JSCIntializer)(JSGlobalContextRef context, JSObjectRef *module); public: JSCShell() {}; virtual ~JSCShell(); protected: virtual bool InitializeEngine(); virtual bool ExecuteScript(const std::string& source, const std::string& scriptPath); virtual bool DisposeEngine(); private: JSObjectRef Import(const std::string &moduleName); static JSValueRef Print(JSContextRef context, JSObjectRef object, JSObjectRef globalobj, size_t argc, const JSValueRef args[], JSValueRef* ex); static JSValueRef Require(JSContextRef context, JSObjectRef object, JSObjectRef globalobj, size_t argc, const JSValueRef args[], JSValueRef* ex); static bool RegisterFunction(JSGlobalContextRef context, JSObjectRef object, const char* functionName, JSObjectCallAsFunctionCallback cbFunction); static void PrintError(JSContextRef, JSValueRef); private: JSGlobalContextRef context; }; JSCShell::~JSCShell() { if(context != 0) { JSGlobalContextRelease(context); context = 0; } } bool JSCShell::InitializeEngine() { if(context != 0) { JSGlobalContextRelease(context); context = 0; } // TODO: check for initialization errors context = JSGlobalContextCreate(NULL); if(context == 0) return false; JSObjectRef globalObject = JSContextGetGlobalObject(context); // store this for later use JSClassDefinition __shell_classdef__ = JSClassDefinition(); JSClassRef __shell_class__ = JSClassCreate(&__shell_classdef__); JSObjectRef __shell__ = JSObjectMake(context, __shell_class__, 0); bool success = JSObjectSetPrivate(__shell__, (void*) (long) this); if (!success) { std::cerr << "Could not register the shell in the Javascript context" << std::endl; return false; } JSStringRef shellKey = JSStringCreateWithUTF8CString("__shell__"); JSObjectSetProperty(context, globalObject, shellKey, __shell__, kJSPropertyAttributeReadOnly, NULL); JSStringRelease(shellKey); JSCShell::RegisterFunction(context, globalObject, "print", JSCShell::Print); JSCShell::RegisterFunction(context, globalObject, "require", JSCShell::Require); return true; } bool JSCShell::ExecuteScript(const std::string& source, const std::string& scriptPath) { JSStringRef jsScript; JSStringRef sourceURL; JSValueRef ex; jsScript = JSStringCreateWithUTF8CString(source.c_str()); sourceURL = JSStringCreateWithUTF8CString(scriptPath.c_str()); JSValueRef jsResult = JSEvaluateScript(context, jsScript, 0, sourceURL, 0, &ex); JSStringRelease(jsScript); if (jsResult == NULL && ex != NULL) { JSCShell::PrintError(context, ex); return false; } return true; } bool JSCShell::DisposeEngine() { JSGlobalContextRelease(context); context = 0; return true; } JSValueRef JSCShell::Print(JSContextRef context, JSObjectRef object, JSObjectRef globalobj, size_t argc, const JSValueRef args[], JSValueRef* ex) { if (argc > 0) { JSStringRef string = JSValueToStringCopy(context, args[0], NULL); size_t numChars = JSStringGetMaximumUTF8CStringSize(string); char *stringUTF8 = new char[numChars]; JSStringGetUTF8CString(string, stringUTF8, numChars); printf("%s\n", stringUTF8); delete[] stringUTF8; } return JSValueMakeUndefined(context); } // Attention: this feature should not create too high expectations. // It is only capable of loading things relative to the execution directory // and not relative to the parent script. JSValueRef JSCShell::Require(JSContextRef context, JSObjectRef object, JSObjectRef globalObj, size_t argc, const JSValueRef args[], JSValueRef* ex) { JSObjectRef module; JSStringRef shellKey = JSStringCreateWithUTF8CString("__shell__"); JSValueRef shellAsVal = JSObjectGetProperty(context, globalObj, shellKey, NULL); JSStringRelease(shellKey); JSObjectRef shell = JSValueToObject(context, shellAsVal, 0); JSCShell *_this = (JSCShell*) (long) JSObjectGetPrivate(shell); if (argc > 0) { JSStringRef string = JSValueToStringCopy(context, args[0], NULL); size_t numChars = JSStringGetMaximumUTF8CStringSize(string); char *stringUTF8 = new char[numChars]; JSStringGetUTF8CString(string, stringUTF8, numChars); std::string modulePath(stringUTF8); module = _this->Import(modulePath); delete[] stringUTF8; } if (module) { return module; } else { printf("Ooops.\n"); return JSValueMakeUndefined(context); } } JSObjectRef JSCShell::Import(const std::string& module_path) { HANDLE library; std::string module_name = LoadModule(module_path, &library); if (library == 0) { printf("Could not load module."); return 0; } std::string symname = std::string(module_name).append("_initialize"); JSCIntializer init_function = reinterpret_cast((long) LOAD_SYMBOL(library, symname.c_str())); if(init_function == 0) { printf("Could not find module's initializer function."); return 0; } JSObjectRef module; init_function(context, &module); return module; } bool JSCShell::RegisterFunction(JSGlobalContextRef context, JSObjectRef object, const char* functionName, JSObjectCallAsFunctionCallback callback) { JSStringRef js_functionName = JSStringCreateWithUTF8CString(functionName); JSObjectSetProperty(context, object, js_functionName, JSObjectMakeFunctionWithCallback(context, js_functionName, callback), kJSPropertyAttributeNone, NULL); JSStringRelease(js_functionName); return true; } void JSCShell::PrintError(JSContextRef ctx, JSValueRef err) { char *buffer; size_t length; JSStringRef string = JSValueToStringCopy(ctx, err, 0); length = JSStringGetLength(string); buffer = new char[length+1]; JSStringGetUTF8CString(string, buffer, length+1); std::string errMsg(buffer); JSStringRelease(string); delete[] buffer; JSObjectRef errObj = JSValueToObject(ctx, err, 0); if(errObj == 0) { std::cerr << errMsg << std::endl; return; } JSStringRef sourceURLKey = JSStringCreateWithUTF8CString("sourceURL"); JSStringRef sourceURLStr = JSValueToStringCopy(ctx, JSObjectGetProperty(ctx, errObj, sourceURLKey, 0), 0); length = JSStringGetLength(sourceURLStr); buffer = new char[length+1]; JSStringGetUTF8CString(sourceURLStr, buffer, length+1); std::string sourceURL(buffer); delete[] buffer; JSStringRelease(sourceURLStr); JSStringRelease(sourceURLKey); JSStringRef lineKey = JSStringCreateWithUTF8CString("line"); JSValueRef jsLine = JSObjectGetProperty(ctx, errObj, lineKey, 0); int line = (int) JSValueToNumber(ctx, jsLine, 0); JSStringRelease(lineKey); std::cerr << sourceURL << ":" << line << ":" << errMsg << std::endl; } JSShell* JSCShell_Create() { return new JSCShell(); } swig-3.0.12/Tools/javascript/javascript.cxx0000664000175000017500000000255213042756442020601 0ustar williamwilliam#include #include #include #include #include #include #include "js_shell.h" void print_usage() { std::cout << "javascript [-i] [-jsc|-v8] [-l module] " << std::endl; } int main(int argc, char* argv[]) { #if defined(JAVASCRIPT_INTERPRETER_STOP) std::cout << "Attach your Debugger and press any key to continue" << std::endl; std::cin.get(); #endif std::string scriptPath = ""; bool interactive = false; JSShell* shell = 0; std::vector modulePath; modulePath.push_back("."); for (int idx = 1; idx < argc; ++idx) { if(strcmp(argv[idx], "-v8") == 0) { shell = JSShell::Create(JSShell::V8); } else if(strcmp(argv[idx], "-jsc") == 0) { shell = JSShell::Create(JSShell::JSC); } else if(strcmp(argv[idx], "-i") == 0) { interactive = true; } else if(strcmp(argv[idx], "-L") == 0) { modulePath.push_back(argv[++idx]); } else { scriptPath = argv[idx]; } } if (shell == 0) { shell = JSShell::Create(); } shell->setModulePath(modulePath); bool failed = false; if(interactive) { failed = !(shell->RunShell()); } else { failed = !(shell->RunScript(scriptPath)); } if (failed) { delete shell; printf("FAIL: Error during execution of script.\n"); return 1; } delete shell; return 0; } swig-3.0.12/Tools/javascript/js_shell.cxx0000664000175000017500000000653313042756442020241 0ustar williamwilliam#include "js_shell.h" #include #include #include #include #include #ifdef __GNUC__ #ifdef __APPLE__ #define LIBRARY_EXT ".bundle" #else #define LIBRARY_EXT ".so" #endif #include #define LOAD_LIBRARY(name) dlopen(name, RTLD_LAZY) #define CLOSE_LIBRARY(handle) dlclose(handle) #define LIBRARY_ERROR dlerror #define LIBRARYFILE(name) std::string("lib").append(name).append(LIBRARY_EXT) #else #error "implement dll loading" #endif JSShell::~JSShell() { for(std::vector::iterator it = loaded_modules.begin(); it != loaded_modules.end(); ++it) { HANDLE handle = *it; CLOSE_LIBRARY(handle); } } // TODO: this could be done more intelligent... // - can we achieve source file relative loading? // - better path resolution std::string JSShell::LoadModule(const std::string& name, HANDLE* library) { // works only for posix like OSs size_t pathIdx = name.find_last_of("/"); std::string lib_name; std::string module_name; if (pathIdx == std::string::npos) { module_name = name; lib_name = std::string(name).append(LIBRARY_EXT); } else { std::string path = name.substr(0, pathIdx+1); module_name = name.substr(pathIdx+1); lib_name = path.append(module_name).append(LIBRARY_EXT); } std::string lib_path; HANDLE handle = 0; for (int i = 0; i < module_path.size(); ++i) { lib_path = module_path[i] + "/" + lib_name; if (access( lib_path.c_str(), F_OK ) != -1) { handle = LOAD_LIBRARY(lib_path.c_str()); } } if(handle == 0) { std::cerr << "Could not find module " << lib_path << ":" << std::endl << LIBRARY_ERROR() << std::endl; return 0; } loaded_modules.push_back(handle); *library = handle; return module_name; } bool JSShell::RunScript(const std::string& scriptPath) { std::string source = ReadFile(scriptPath); if(!InitializeEngine()) return false; // Node.js compatibility: make `print` available as `console.log()` ExecuteScript("var console = {}; console.log = print;", ""); if(!ExecuteScript(source, scriptPath)) { return false; } return DisposeEngine(); } bool JSShell::RunShell() { if(!InitializeEngine()) return false; static const int kBufferSize = 1024; while (true) { char buffer[kBufferSize]; printf("> "); char* str = fgets(buffer, kBufferSize, stdin); if (str == NULL) break; std::string source(str); ExecuteScript(source, "(shell)"); } printf("\n"); return true; } std::string JSShell::ReadFile(const std::string& fileName) { std::string script; std::ifstream file(fileName.c_str()); if (file.is_open()) { while ( file.good() ) { std::string line; getline(file, line); script.append(line); script.append("\n"); } file.close(); } else { std::cout << "Unable to open file " << fileName << "." << std::endl; } return script; } #ifdef ENABLE_JSC extern JSShell* JSCShell_Create(); #endif #ifdef ENABLE_V8 extern JSShell* V8Shell_Create(); #endif typedef JSShell*(*ShellFactory)(); static ShellFactory js_shell_factories[2] = { #ifdef ENABLE_JSC JSCShell_Create, #else 0, #endif #ifdef ENABLE_V8 V8Shell_Create, #else 0, #endif }; JSShell *JSShell::Create(Engine engine) { if(js_shell_factories[engine] == 0) { throw "Engine not available."; } return js_shell_factories[engine](); } swig-3.0.12/Tools/javascript/v8_shell.cxx0000664000175000017500000002556713042756442020172 0ustar williamwilliam#include #include #include #include #include #include #include #include "js_shell.h" typedef int (*V8ExtensionInitializer) (v8::Handle module); // Note: these typedefs and defines are used to deal with v8 API changes since version 3.19.00 #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) typedef v8::Handle SwigV8ReturnValue; typedef v8::Arguments SwigV8Arguments; typedef v8::AccessorInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) return scope.Close(val) #define SWIGV8_RETURN_INFO(val, info) return scope.Close(val) #else typedef void SwigV8ReturnValue; typedef v8::FunctionCallbackInfo SwigV8Arguments; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) args.GetReturnValue().Set(val); return #define SWIGV8_RETURN_INFO(val, info) info.GetReturnValue().Set(val); return #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032117) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope #define SWIGV8_ESCAPE(val) return scope.Close(val) #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Close(val) #else #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::EscapableHandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Escape(val) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318) #define SWIGV8_CURRENT_CONTEXT() v8::Context::GetCurrent() #define SWIGV8_STRING_NEW(str) v8::String::New(str) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(func) #define SWIGV8_OBJECT_NEW() v8::Object::New() #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(val) #define SWIGV8_UNDEFINED() v8::Undefined() #else #define SWIGV8_CURRENT_CONTEXT() v8::Isolate::GetCurrent()->GetCurrentContext() #define SWIGV8_STRING_NEW(str) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), func) #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent()) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(v8::Isolate::GetCurrent(), val) #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent()) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) typedef v8::Persistent SwigV8Context; #else typedef v8::Local SwigV8Context; #endif class V8Shell: public JSShell { public: V8Shell(); virtual ~V8Shell(); virtual bool RunScript(const std::string &scriptPath); virtual bool RunShell(); protected: virtual bool InitializeEngine(); virtual bool ExecuteScript(const std::string &source, const std::string &scriptPath); virtual bool DisposeEngine(); private: v8::Handle Import(const std::string &moduleName); SwigV8Context CreateShellContext(); void ReportException(v8::TryCatch *handler); static SwigV8ReturnValue Print(const SwigV8Arguments &args); static SwigV8ReturnValue Require(const SwigV8Arguments &args); static SwigV8ReturnValue Quit(const SwigV8Arguments &args); static SwigV8ReturnValue Version(const SwigV8Arguments &args); static const char* ToCString(const v8::String::Utf8Value &value); }; #ifdef __GNUC__ #include #define LOAD_SYMBOL(handle, name) dlsym(handle, name) #else #error "implement dll loading" #endif V8Shell::V8Shell() {} V8Shell::~V8Shell() {} bool V8Shell::RunScript(const std::string &scriptPath) { std::string source = ReadFile(scriptPath); v8::Isolate *isolate = v8::Isolate::New(); v8::Isolate::Scope isolate_scope(isolate); SWIGV8_HANDLESCOPE(); SwigV8Context context = CreateShellContext(); if (context.IsEmpty()) { printf("Could not create context.\n"); return false; } context->Enter(); // Store a pointer to this shell for later use v8::Handle global = context->Global(); v8::Local __shell__ = SWIGV8_EXTERNAL_NEW((void*) (long) this); global->SetHiddenValue(SWIGV8_STRING_NEW("__shell__"), __shell__); // Node.js compatibility: make `print` available as `console.log()` ExecuteScript("var console = {}; console.log = print;", ""); bool success = ExecuteScript(source, scriptPath); // Cleanup context->Exit(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) context.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) context.Dispose(v8::Isolate::GetCurrent()); #else // context.Dispose(); #endif // v8::V8::Dispose(); return success; } bool V8Shell::RunShell() { SWIGV8_HANDLESCOPE(); SwigV8Context context = CreateShellContext(); if (context.IsEmpty()) { printf("Could not create context.\n"); return false; } context->Enter(); v8::Context::Scope context_scope(context); ExecuteScript("var console = {}; console.log = print;", ""); static const int kBufferSize = 1024; while (true) { char buffer[kBufferSize]; printf("> "); char *str = fgets(buffer, kBufferSize, stdin); if (str == NULL) break; std::string source(str); ExecuteScript(source, "(shell)"); } printf("\n"); // Cleanup context->Exit(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) context.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) context.Dispose(v8::Isolate::GetCurrent()); #else // context.Dispose(); #endif // v8::V8::Dispose(); return true; } bool V8Shell::InitializeEngine() { return true; } bool V8Shell::ExecuteScript(const std::string &source, const std::string &name) { SWIGV8_HANDLESCOPE(); v8::TryCatch try_catch; v8::Handle script = v8::Script::Compile(SWIGV8_STRING_NEW(source.c_str()), SWIGV8_STRING_NEW(name.c_str())); // Stop if script is empty if (script.IsEmpty()) { // Print errors that happened during compilation. ReportException(&try_catch); return false; } v8::Handle result = script->Run(); // Print errors that happened during execution. if (try_catch.HasCaught()) { ReportException(&try_catch); return false; } else { return true; } } bool V8Shell::DisposeEngine() { return true; } SwigV8Context V8Shell::CreateShellContext() { // Create a template for the global object. v8::Handle global = v8::ObjectTemplate::New(); // Bind global functions global->Set(SWIGV8_STRING_NEW("print"), SWIGV8_FUNCTEMPLATE_NEW(V8Shell::Print)); global->Set(SWIGV8_STRING_NEW("quit"), SWIGV8_FUNCTEMPLATE_NEW(V8Shell::Quit)); global->Set(SWIGV8_STRING_NEW("require"), SWIGV8_FUNCTEMPLATE_NEW(V8Shell::Require)); global->Set(SWIGV8_STRING_NEW("version"), SWIGV8_FUNCTEMPLATE_NEW(V8Shell::Version)); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) SwigV8Context context = v8::Context::New(NULL, global); return context; #else SwigV8Context context = v8::Context::New(v8::Isolate::GetCurrent(), NULL, global); return context; #endif } v8::Handle V8Shell::Import(const std::string &module_path) { SWIGV8_HANDLESCOPE_ESC(); HANDLE library; std::string module_name = LoadModule(module_path, &library); std::string symname = std::string(module_name).append("_initialize"); V8ExtensionInitializer init_function = reinterpret_cast((long) LOAD_SYMBOL(library, symname.c_str())); if(init_function == 0) { printf("Could not find initializer function."); return SWIGV8_UNDEFINED(); } v8::Local module = SWIGV8_OBJECT_NEW(); init_function(module); SWIGV8_ESCAPE(module); } SwigV8ReturnValue V8Shell::Print(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); bool first = true; for (int i = 0; i < args.Length(); i++) { if (first) { first = false; } else { printf(" "); } v8::String::Utf8Value str(args[i]); const char *cstr = V8Shell::ToCString(str); printf("%s", cstr); } printf("\n"); fflush(stdout); SWIGV8_RETURN(SWIGV8_UNDEFINED()); } SwigV8ReturnValue V8Shell::Require(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); if (args.Length() != 1) { printf("Illegal arguments for `require`"); }; v8::String::Utf8Value str(args[0]); const char *cstr = V8Shell::ToCString(str); std::string moduleName(cstr); v8::Local global = SWIGV8_CURRENT_CONTEXT()->Global(); v8::Local hidden = global->GetHiddenValue(SWIGV8_STRING_NEW("__shell__")); v8::Local __shell__ = v8::Local::Cast(hidden); V8Shell *_this = (V8Shell *) (long) __shell__->Value(); v8::Handle module = _this->Import(moduleName); SWIGV8_RETURN(module); } SwigV8ReturnValue V8Shell::Quit(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); int exit_code = args[0]->Int32Value(); fflush(stdout); fflush(stderr); exit(exit_code); SWIGV8_RETURN(SWIGV8_UNDEFINED()); } SwigV8ReturnValue V8Shell::Version(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); SWIGV8_RETURN(SWIGV8_STRING_NEW(v8::V8::GetVersion())); } void V8Shell::ReportException(v8::TryCatch *try_catch) { SWIGV8_HANDLESCOPE(); v8::String::Utf8Value exception(try_catch->Exception()); const char *exception_string = V8Shell::ToCString(exception); v8::Handle message = try_catch->Message(); if (message.IsEmpty()) { // V8 didn't provide any extra information about this error; just // print the exception. printf("%s\n", exception_string); } else { // Print (filename):(line number): (message). v8::String::Utf8Value filename(message->GetScriptResourceName()); const char *filename_string = V8Shell::ToCString(filename); int linenum = message->GetLineNumber(); printf("%s:%i: %s\n", filename_string, linenum, exception_string); // Print line of source code. v8::String::Utf8Value sourceline(message->GetSourceLine()); const char *sourceline_string = V8Shell::ToCString(sourceline); printf("%s\n", sourceline_string); // Print wavy underline (GetUnderline is deprecated). int start = message->GetStartColumn(); for (int i = 0; i < start; i++) { printf(" "); } int end = message->GetEndColumn(); for (int i = start; i < end; i++) { printf("^"); } printf("\n"); v8::String::Utf8Value stack_trace(try_catch->StackTrace()); if (stack_trace.length() > 0) { const char *stack_trace_string = V8Shell::ToCString(stack_trace); printf("%s\n", stack_trace_string); } } } // Extracts a C string from a V8 Utf8Value. const char *V8Shell::ToCString(const v8::String::Utf8Value &value) { return *value ? *value : ""; } JSShell *V8Shell_Create() { return new V8Shell(); } swig-3.0.12/Tools/pyname_patch.py0000664000175000017500000001166413042756442016567 0ustar williamwilliam#!/usr/bin/env python """ From SWIG 1.3.37 we deprecated all SWIG symbols that start with Py, since they are inappropriate and discouraged in Python documentation (from http://www.python.org/doc/2.5.2/api/includes.html): "All user visible names defined by Python.h (except those defined by the included standard headers) have one of the prefixes "Py" or "_Py". Names beginning with "_Py" are for internal use by the Python implementation and should not be used by extension writers. Structure member names do not have a reserved prefix. Important: user code should never define names that begin with "Py" or "_Py". This confuses the reader, and jeopardizes the portability of the user code to future Python versions, which may define additional names beginning with one of these prefixes." This file is a simple script used for change all of these symbols, for user code or SWIG itself. """ import re from shutil import copyfile import sys symbols = [ #(old name, new name) ("PySequence_Base", "SwigPySequence_Base"), ("PySequence_Cont", "SwigPySequence_Cont"), ("PySwigIterator_T", "SwigPyIterator_T"), ("PyPairBoolOutputIterator", "SwigPyPairBoolOutputIterator"), ("PySwigIterator", "SwigPyIterator"), ("PySwigIterator_T", "SwigPyIterator_T"), ("PyMapIterator_T", "SwigPyMapIterator_T"), ("PyMapKeyIterator_T", "SwigPyMapKeyIterator_T"), ("PyMapValueIterator_T", "SwigPyMapValueITerator_T"), ("PyObject_ptr", "SwigPtr_PyObject"), ("PyObject_var", "SwigVar_PyObject"), ("PyOper", "SwigPyOper"), ("PySeq", "SwigPySeq"), ("PySequence_ArrowProxy", "SwigPySequence_ArrowProxy"), ("PySequence_Cont", "SwigPySequence_Cont"), ("PySequence_InputIterator", "SwigPySequence_InputIterator"), ("PySequence_Ref", "SwigPySequence_Ref"), ("PySwigClientData", "SwigPyClientData"), ("PySwigClientData_Del", "SwigPyClientData_Del"), ("PySwigClientData_New", "SwigPyClientData_New"), ("PySwigIterator", "SwigPyIterator"), ("PySwigIteratorClosed_T", "SwigPyIteratorClosed_T"), ("PySwigIteratorOpen_T", "SwigPyIteratorOpen_T"), ("PySwigIterator_T", "SwigPyIterator_T"), ("PySwigObject", "SwigPyObject"), ("PySwigObject_Check", "SwigPyObject_Check"), ("PySwigObject_GetDesc", "SwigPyObject_GetDesc"), ("PySwigObject_New", "SwigPyObject_New"), ("PySwigObject_acquire", "SwigPyObject_acquire"), ("PySwigObject_append", "SwigPyObject_append"), ("PySwigObject_as_number", "SwigPyObject_as_number"), ("PySwigObject_compare", "SwigPyObject_compare"), ("PySwigObject_dealloc", "SwigPyObject_dealloc"), ("PySwigObject_disown", "SwigPyObject_disown"), ("PySwigObject_format", "SwigPyObject_format"), ("PySwigObject_getattr", "SwigPyObject_getattr"), ("PySwigObject_hex", "SwigPyObject_hex"), ("PySwigObject_long", "SwigPyObject_long"), ("PySwigObject_next", "SwigPyObject_next"), ("PySwigObject_oct", "SwigPyObject_oct"), ("PySwigObject_own", "SwigPyObject_own"), ("PySwigObject_print", "SwigPyObject_print"), ("PySwigObject_repr", "SwigPyObject_repr"), ("PySwigObject_richcompare", "SwigPyObject_richcompare"), ("PySwigObject_str", "SwigPyObject_str"), ("PySwigObject_type", "SwigPyObject_type"), ("PySwigPacked", "SwigPyPacked"), ("PySwigPacked_Check", "SwigPyPacked_Check"), ("PySwigPacked_New", "SwigPyPacked_New"), ("PySwigPacked_UnpackData", "SwigPyPacked_UnpackData"), ("PySwigPacked_compare", "SwigPyPacked_compare"), ("PySwigPacked_dealloc", "SwigPyPacked_dealloc"), ("PySwigPacked_print", "SwigPyPacked_print"), ("PySwigPacked_repr", "SwigPyPacked_repr"), ("PySwigPacked_str", "SwigPyPacked_str"), ("PySwigPacked_type", "SwigPyPacked_type"), ("pyseq", "swigpyseq"), ("pyswigobject_type", "swigpyobject_type"), ("pyswigpacked_type", "swigpypacked_type"), ] res = [(re.compile("\\b(%s)\\b"%oldname), newname) for oldname, newname in symbols] def patch_file(fn): newf = [] changed = False for line in open(fn): for r, newname in res: line, n = r.subn(newname, line) if n>0: changed = True newf.append(line) if changed: copyfile(fn, fn+".bak") f = open(fn, "w") f.write("".join(newf)) f.close() return changed def main(fns): for fn in fns: try: if patch_file(fn): print "Patched file", fn except IOError: print "Error occurred during patching", fn return if __name__=="__main__": if len(sys.argv) > 1: main(sys.argv[1:]) else: print "Patch your interface file for SWIG's Py* symbol name deprecation." print "Usage:" print " %s files..."%sys.argv[0] swig-3.0.12/Tools/convertpath0000775000175000017500000000174613042756442016030 0ustar williamwilliam#!/bin/sh # Unix to Windows path conversion in a script. # Useful for avoiding backslash quoting difficulties in Makefiles. # Acts as a much dumbed down cygpath tool mainly for use on MinGW. usage() { cat <&2; exit 1 ;; esac ;; -u) shift; echo $@ | sed -e 's,\\,/,g' ;; -w) shift; echo $@ | sed -e 's,/,\\,g' ;; -h) shift; usage; ;; *) usage; exit 1 ;; esac exit 0 swig-3.0.12/Tools/setup.py.tmpl0000664000175000017500000001125713042756442016230 0ustar williamwilliam#!@PYTHON@ '''A setup.py script with better SWIG support. To use it, either rename it to setup.py.in and have it pe processed by your configure script (you will need to define @PYTHON@), or replace the @*@ strings by hand. Copyright 2001, Anthony Joseph Seward''' from distutils.core import setup, Extension ############################################################################### ## Start of better Swig support ############################################################################### from distutils.command.build_ext import build_ext import os import string class build_swig_ext(build_ext): '''Better swig support for Distutils''' ## __ Tell Distutils about the options user_options = build_ext.user_options boolean_options = build_ext.boolean_options user_options.append( ('swig-doc=', None, 'what type of documentation should SWIG produce (default: none)') ) user_options.append( ('swig-inc=', None, 'a list of directories to add to the SWIG include path' + "(separated by ':')(default: SWIG)") ) user_options.append( ('swig-shadow', None, 'have SWIG create shadow classes' + ' (also adds docstrings to the shadow classes') ) boolean_options.append('swig-shadow') def initialize_options(self): '''Initialize the new options after the inherited ones''' build_ext.initialize_options(self) self.swig_doc = 'none' self.swig_inc = 'SWIG' self.swig_shadow = None def swig_sources(self, sources): """Override the definition of 'swig_sources' in build_ext. This is essentially the same function but with better swig support. I will now quote the original docstring: Walk the list of source files in 'sources', looking for SWIG interface (.i) files. Run SWIG on all that are found, and return a modified 'sources' list with SWIG source files replaced by the generated C (or C++) files. """ new_sources = [] swig_sources = [] swig_targets = {} # XXX this drops generated C/C++ files into the source tree, which # is fine for developers who want to distribute the generated # source -- but there should be an option to put SWIG output in # the temp dir. if self.swig_cpp: target_ext = '.cpp' else: target_ext = '.c' for source in sources: (base, ext) = os.path.splitext(source) if ext == ".i": # SWIG interface file new_sources.append(base + target_ext) swig_sources.append(source) swig_targets[source] = new_sources[-1] else: new_sources.append(source) if not swig_sources: return new_sources includes = self.swig_inc if type(includes) is type(''): includes = string.split(includes, ':') includes = map(lambda x: '-I'+x, includes) includes = string.join(includes) swig = self.find_swig() ## swig_cmd = [swig, "-python", "-d%s" % self.swig_doc, includes] swig_cmd = [swig, '-v', '-python', '-d%s' % self.swig_doc, includes] if self.swig_cpp: swig_cmd.append('-c++') if self.swig_shadow: swig_cmd.append('-shadow') ## swig1.1 swig_cmd.append('-docstring') for source in swig_sources: target = swig_targets[source] self.announce('swigging %s to %s' % (source, target)) self.spawn(swig_cmd + ['-o', target, source]) return new_sources # swig_sources () ############################################################################### ## End of improved swig support ############################################################################### package = '@PACKAGE@' version = '@VERSION@' include_dirs = ['@top_srcdir@'] lib_dirs = ['@top_srcdir@/@PACKAGE@'] libraries = ['@PACKAGE@', 'stdc++'] setup(name = package, version = version, description = '', author = '', author_email = '', url = 'http://', cmdclass = {'build_ext': build_swig_ext}, ext_modules = [Extension(package+'cmodule', [package+'.i'], include_dirs=include_dirs, library_dirs=lib_dirs, libraries=libraries, )], options = {'build_ext': {'swig_doc': 'html', 'swig_cpp': not None, 'swig_shadow': not None} } ) swig-3.0.12/Tools/mkrelease.py0000775000175000017500000000375613042756442016075 0ustar williamwilliam#!/usr/bin/env python # This script builds the SWIG source tarball, creates the Windows executable and the Windows zip package # and uploads them both to SF ready for release. Also uploaded are the release notes. import sys import string import os def failed(message): if message == "": print "mkrelease.py failed to complete" else: print message sys.exit(2) try: version = sys.argv[1] branch = sys.argv[2] username = sys.argv[3] except: print "Usage: python mkrelease.py version branch username" print "where version should be x.y.z and username is your SF username" sys.exit(1) print "Looking for rsync" os.system("which rsync") and failed("rsync not installed/found. Please install.") print "Making source tarball" os.system("python ./mkdist.py " + version + " " + branch) and failed("") print "Build Windows package" os.system("./mkwindows.sh " + version) and failed("") print "Uploading to SourceForge" swig_dir_sf = username + ",swig@frs.sourceforge.net:/home/frs/project/s/sw/swig/swig/swig-" + version + "/" swigwin_dir_sf = username + ",swig@frs.sourceforge.net:/home/frs/project/s/sw/swig/swigwin/swigwin-" + version + "/" # If a file with 'readme' in the name exists in the same folder as the zip/tarball, it gets automatically displayed as the release notes by SF full_readme_file = "readme-" + version + ".txt" os.system("rm -f " + full_readme_file) os.system("cat swig-" + version + "/README " + "swig-" + version + "/CHANGES.current " + "swig-" + version + "/RELEASENOTES " + "> " + full_readme_file) os.system("rsync --archive --verbose -P --times -e ssh " + "swig-" + version + ".tar.gz " + full_readme_file + " " + swig_dir_sf) and failed("") os.system("rsync --archive --verbose -P --times -e ssh " + "swigwin-" + version + ".zip " + full_readme_file + " " + swigwin_dir_sf) and failed("") print "Finished" print "Now log in to SourceForge and set the operating systems applicable to the newly uploaded tarball and zip file. Also remember to do a 'git push --tags'." swig-3.0.12/Tools/obs-update0000775000175000017500000000136213042756442015530 0ustar williamwilliam#!/bin/bash # Update SWIG tarball on openSUSE Build Service to contain the latest from master # Requires the openSUSE Build Service command-line tool (osc) # See http://openbuildservice.org/download/ # And these packages: obs-service-tar_scm obs-service-recompress obs-service-set_version # Results appear at https://build.opensuse.org/package/show/home:kwk:swig/swig-raw set -e set -x rm -rf home-kwk-swig/swig-raw mkdir -p home-kwk-swig cd home-kwk-swig # check out 'swig-raw' osc co -o swig-raw home:kwk:swig swig-raw cd swig-raw # remove existing tarball osc rm swig*tar.bz2 # fetch latest master branch from git and create tarball osc service disabledrun # add new tarball osc addremove # check changes into build service, triggers build osc ci swig-3.0.12/aclocal.m40000664000175000017500000012267513042756666014322 0ustar williamwilliam# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 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_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2014 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. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 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. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 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. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 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 macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 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. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 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. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 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. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 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. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 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. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2014 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. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 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. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 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. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 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. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 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. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([Tools/config/ac_compile_warnings.m4]) m4_include([Tools/config/ac_define_dir.m4]) m4_include([Tools/config/ax_boost_base.m4]) m4_include([Tools/config/ax_compare_version.m4]) m4_include([Tools/config/ax_cxx_compile_stdcxx_11.m4]) m4_include([Tools/config/ax_path_generic.m4]) swig-3.0.12/CCache/0000775000175000017500000000000013042756671013547 5ustar williamwilliamswig-3.0.12/CCache/install-sh0000775000175000017500000001124513042756442015552 0ustar williamwilliam#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 swig-3.0.12/CCache/config.h.in0000664000175000017500000000610713042756671015576 0ustar williamwilliam/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you would like to have zlib compression for ccache. */ #undef ENABLE_ZLIB /* Define to 1 if you have the `asprintf' function. */ #undef HAVE_ASPRINTF /* */ #undef HAVE_C99_VSNPRINTF /* */ #undef HAVE_COMPAR_FN_T /* Define to 1 if you have the header file. */ #undef HAVE_CTYPE_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getpwuid' function. */ #undef HAVE_GETPWUID /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkstemp' function. */ #undef HAVE_MKSTEMP /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH /* Define to 1 if you have the `snprintf' function. */ #undef HAVE_SNPRINTF /* 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 header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* 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, 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_TIME_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_UNISTD_H /* Define to 1 if you have the `utimes' function. */ #undef HAVE_UTIMES /* Define to 1 if you have the `vasprintf' function. */ #undef HAVE_VASPRINTF /* Define to 1 if you have the `vsnprintf' function. */ #undef HAVE_VSNPRINTF /* 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 home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define _GNU_SOURCE so that we get all necessary prototypes */ #undef _GNU_SOURCE swig-3.0.12/CCache/debian/0000775000175000017500000000000013042756442014765 5ustar williamwilliamswig-3.0.12/CCache/debian/examples0000664000175000017500000000004513042756442016525 0ustar williamwilliamdebian/update-ccache manage-cache.sh swig-3.0.12/CCache/debian/patches/0000775000175000017500000000000013042756442016414 5ustar williamwilliamswig-3.0.12/CCache/debian/patches/14_hardlink_doc.diff0000664000175000017500000000366613042756442022206 0ustar williamwilliamIndex: ccache.1 =================================================================== RCS file: /cvsroot/ccache/ccache.1,v retrieving revision 1.26 diff -u -r1.26 ccache.1 --- ccache.1 24 Nov 2005 21:10:08 -0000 1.26 +++ ccache.1 21 Jul 2007 21:03:32 -0000 @@ -330,7 +330,7 @@ .IP o Use the same \fBCCACHE_DIR\fP environment variable setting .IP o -Set the \fBCCACHE_NOLINK\fP environment variable +Unset the \fBCCACHE_HARDLINK\fP environment variable .IP o Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in Index: ccache.yo =================================================================== RCS file: /cvsroot/ccache/ccache.yo,v retrieving revision 1.27 diff -u -r1.27 ccache.yo --- ccache.yo 24 Nov 2005 21:54:09 -0000 1.27 +++ ccache.yo 21 Jul 2007 21:03:32 -0000 @@ -289,7 +289,7 @@ itemize( it() Use the same bf(CCACHE_DIR) environment variable setting - it() Set the bf(CCACHE_NOLINK) environment variable + it() Unset the bf(CCACHE_HARDLINK) environment variable it() Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group. Index: web/ccache-man.html =================================================================== RCS file: /cvsroot/ccache/web/ccache-man.html,v retrieving revision 1.25 diff -u -r1.25 ccache-man.html --- web/ccache-man.html 13 Sep 2004 10:38:17 -0000 1.25 +++ web/ccache-man.html 21 Jul 2007 21:03:32 -0000 @@ -256,7 +256,7 @@ following conditions need to be met:

  • Use the same CCACHE_DIR environment variable setting -
  • Set the CCACHE_NOLINK environment variable +
  • Unset the CCACHE_HARDLINK environment variable
  • Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group. swig-3.0.12/CCache/debian/patches/05_nfs_fix.diff0000664000175000017500000000230713042756442021210 0ustar williamwilliam--- ccache.1.orig 2007-05-20 17:30:57.000000000 +1200 +++ ccache.1 2007-05-20 17:31:27.000000000 +1200 @@ -367,12 +367,6 @@ .IP o ccache avoids a double call to cpp on a cache miss .PP -.SH "BUGS" -.PP -When the cache is stored on an NFS filesystem, the filesystem must be -exported with the \fBno_subtree_check\fP option to make renames between -directories reliable\&. -.PP .SH "CREDITS" .PP Thanks to the following people for their contributions to ccache --- util.c.patched 2007-05-20 18:19:11.000000000 +1200 +++ util.c 2007-05-20 18:20:55.000000000 +1200 @@ -58,9 +58,26 @@ } } +static int safe_rename(const char* oldpath, const char* newpath) +{ + /* safe_rename is for creating entries in the cache. + + Works like rename(), but it never overwrites an existing + cache entry. This avoids corruption on NFS. */ + int status = link( oldpath, newpath ); + if( status == 0 || errno == EEXIST ) + { + return unlink( oldpath ); + } + else + { + return -1; + } +} + /* move a file using rename */ int move_file(const char *src, const char *dest) { - return rename(src, dest); + return safe_rename(src, dest); } /* copy a file - used when hard links don't work swig-3.0.12/CCache/debian/patches/07_cachedirtag.diff0000664000175000017500000000361013042756442022012 0ustar williamwilliamIndex: ccache.c =================================================================== --- ccache.c (révision 7695) +++ ccache.c (copie de travail) @@ -1029,6 +1029,14 @@ exit(1); } + if (!getenv("CCACHE_READONLY")) { + if (create_cachedirtag(cache_dir) != 0) { + fprintf(stderr,"ccache: failed to create %s/CACHEDIR.TAG (%s)\n", + cache_dir, strerror(errno)); + exit(1); + } + } + ccache(argc, argv); return 1; } Index: ccache.h =================================================================== --- ccache.h (révision 7695) +++ ccache.h (copie de travail) @@ -81,6 +81,7 @@ int copy_file(const char *src, const char *dest); int create_dir(const char *dir); +int create_cachedirtag(const char *dir); void x_asprintf(char **ptr, const char *format, ...); char *x_strdup(const char *s); void *x_realloc(void *ptr, size_t size); Index: util.c =================================================================== --- util.c (révision 7695) +++ util.c (copie de travail) @@ -138,6 +138,39 @@ return 0; } +char const CACHEDIR_TAG[] = + "Signature: 8a477f597d28d172789f06886806bc55\n" + "# This file is a cache directory tag created by ccache.\n" + "# For information about cache directory tags, see:\n" + "# http://www.brynosaurus.com/cachedir/\n"; + +int create_cachedirtag(const char *dir) +{ + char *filename; + struct stat st; + FILE *f; + x_asprintf(&filename, "%s/CACHEDIR.TAG", dir); + if (stat(filename, &st) == 0) { + if (S_ISREG(st.st_mode)) { + goto success; + } + errno = EEXIST; + goto error; + } + f = fopen(filename, "w"); + if (!f) goto error; + if (fwrite(CACHEDIR_TAG, sizeof(CACHEDIR_TAG)-1, 1, f) != 1) { + goto error; + } + if (fclose(f)) goto error; +success: + free(filename); + return 0; +error: + free(filename); + return 1; +} + /* this is like asprintf() but dies if the malloc fails note that we use vsnprintf in a rather poor way to make this more portable swig-3.0.12/CCache/debian/patches/03_long_options.diff0000664000175000017500000001150413042756442022263 0ustar williamwilliamIndex: ccache.c =================================================================== --- ccache.c (révision 7695) +++ ccache.c (copie de travail) @@ -22,6 +22,7 @@ */ #include "ccache.h" +#include /* the base cache directory */ char *cache_dir = NULL; @@ -885,14 +886,14 @@ printf("\tcompiler [compile options] (via symbolic link)\n"); printf("\nOptions:\n"); - printf("-s show statistics summary\n"); - printf("-z zero statistics\n"); - printf("-c run a cache cleanup\n"); - printf("-C clear the cache completely\n"); - printf("-F set maximum files in cache\n"); - printf("-M set maximum size of cache (use G, M or K)\n"); - printf("-h this help page\n"); - printf("-V print version number\n"); + printf("-s, --show-stats show statistics summary\n"); + printf("-z, --zero-stats zero statistics\n"); + printf("-c, --cleanup run a cache cleanup\n"); + printf("-C, --clear clear the cache completely\n"); + printf("-F , --max-files= set maximum files in cache\n"); + printf("-M , --max-size= set maximum size of cache (use G, M or K)\n"); + printf("-h, --help this help page\n"); + printf("-V, --version print version number\n"); } /* the main program when not doing a compile */ @@ -901,7 +902,21 @@ int c; size_t v; - while ((c = getopt(argc, argv, "hszcCF:M:V")) != -1) { + static struct option long_options[] = + { + {"show-stats", no_argument, 0, 's'}, + {"zero-stats", no_argument, 0, 'z'}, + {"cleanup", no_argument, 0, 'c'}, + {"clear", no_argument, 0, 'C'}, + {"max-files", required_argument, 0, 'F'}, + {"max-size", required_argument, 0, 'M'}, + {"help", no_argument, 0, 'h'}, + {"version", no_argument, 0, 'V'}, + {0, 0, 0, 0} + }; + int option_index = 0; + + while ((c = getopt_long(argc, argv, "hszcCF:M:V", long_options, &option_index)) != -1) { switch (c) { case 'V': printf("ccache version %s\n", CCACHE_VERSION); Index: ccache.1 =================================================================== --- ccache.1 (révision 7695) +++ ccache.1 (copie de travail) @@ -23,14 +23,14 @@ .nf --s show statistics summary --z zero statistics --c run a cache cleanup --C clear the cache completely --F set maximum files in cache --M set maximum size of cache (use G, M or K) --h this help page --V print version number +\-s, \-\-show-stats show statistics summary +\-z, \-\-zero-stats zero statistics +\-c, \-\-cleanup run a cache cleanup +\-C, \-\-clear clear the cache completely +\-F , \-\-max-files= set maximum files in cache +\-M , \-\-max-size= set maximum size of cache (use G, M or K) +\-h, \-\-help this help page +\-V, \-\-version print version number .fi @@ -43,22 +43,22 @@ normal compiler options apply and you should refer to your compilers documentation\&. .PP -.IP "\fB-h\fP" +.IP "\fB-h, --help\fP" Print a options summary page .IP -.IP "\fB-s\fP" +.IP "\fB-s, --show-stats\fP" Print the current statistics summary for the cache\&. The statistics are stored spread across the subdirectories of the cache\&. Using "ccache -s" adds up the statistics across all subdirectories and prints the totals\&. .IP -.IP "\fB-z\fP" +.IP "\fB-z, --zero-stats\fP" Zero the cache statistics\&. .IP -.IP "\fB-V\fP" +.IP "\fB-V, --version\fP" Print the ccache version number .IP -.IP "\fB-c\fP" +.IP "\fB-c, --cleanup\fP" Clean the cache and re-calculate the cache file count and size totals\&. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps @@ -66,16 +66,16 @@ if you manually modify the cache contents or believe that the cache size statistics may be inaccurate\&. .IP -.IP "\fB-C\fP" +.IP "\fB-C, --clear\fP" Clear the entire cache, removing all cached files\&. .IP -.IP "\fB-F maxfiles\fP" +.IP "\fB-F , --max-files=\fP" This sets the maximum number of files allowed in the cache\&. The value is stored inside the cache directory and applies to all future compiles\&. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16\&. .IP -.IP "\fB-M maxsize\fP" +.IP "\fB-M , --max-size=\fP" This sets the maximum cache size\&. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value\&. The default is gigabytes\&. The actual value stored is swig-3.0.12/CCache/debian/patches/01_no_home.diff0000664000175000017500000000414213042756442021173 0ustar williamwilliam--- ccache.c +++ ccache.c @@ -836,6 +836,13 @@ { /* find the real compiler */ find_compiler(argc, argv); + + /* use the real compiler if HOME is not set */ + if (!cache_dir) { + cc_log("Unable to determine home directory\n"); + cc_log("ccache is disabled\n"); + failed(); + } /* we might be disabled */ if (getenv("CCACHE_DISABLE")) { @@ -895,6 +902,13 @@ printf("-V print version number\n"); } +static void check_cache_dir(void) +{ + if (!cache_dir) { + fatal("Unable to determine home directory"); + } +} + /* the main program when not doing a compile */ static int ccache_main(int argc, char *argv[]) { @@ -914,31 +928,37 @@ exit(0); case 's': + check_cache_dir(); stats_summary(); break; case 'c': + check_cache_dir(); cleanup_all(cache_dir); printf("Cleaned cache\n"); break; case 'C': + check_cache_dir(); wipe_all(cache_dir); printf("Cleared cache\n"); break; case 'z': + check_cache_dir(); stats_zero(); printf("Statistics cleared\n"); break; case 'F': + check_cache_dir(); v = atoi(optarg); stats_set_limits(v, -1); printf("Set cache file limit to %u\n", (unsigned)v); break; case 'M': + check_cache_dir(); v = value_units(optarg); stats_set_limits(-1, v); printf("Set cache size limit to %uk\n", (unsigned)v); @@ -983,7 +1003,10 @@ cache_dir = getenv("CCACHE_DIR"); if (!cache_dir) { - x_asprintf(&cache_dir, "%s/.ccache", get_home_directory()); + const char *home_directory = get_home_directory(); + if (home_directory) { + x_asprintf(&cache_dir, "%s/.ccache", home_directory); + } } temp_dir = getenv("CCACHE_TEMPDIR"); @@ -1023,7 +1046,7 @@ } /* make sure the cache dir exists */ - if (create_dir(cache_dir) != 0) { + if (cache_dir && (create_dir(cache_dir) != 0)) { fprintf(stderr,"ccache: failed to create %s (%s)\n", cache_dir, strerror(errno)); exit(1); --- util.c +++ util.c @@ -448,7 +448,7 @@ } } #endif - fatal("Unable to determine home directory"); + cc_log("Unable to determine home directory"); return NULL; } swig-3.0.12/CCache/debian/patches/12_cachesize_permissions.diff0000664000175000017500000000374513042756442024152 0ustar williamwilliam--- stats.c (révision 8804) +++ stats.c (copie de travail) @@ -286,7 +286,7 @@ /* set the per directory limits */ -void stats_set_limits(long maxfiles, long maxsize) +int stats_set_limits(long maxfiles, long maxsize) { int dir; unsigned counters[STATS_END]; @@ -298,7 +298,9 @@ maxsize /= 16; } - create_dir(cache_dir); + if (create_dir(cache_dir) != 0) { + return 1; + } /* set the limits in each directory */ for (dir=0;dir<=0xF;dir++) { @@ -306,7 +308,9 @@ int fd; x_asprintf(&cdir, "%s/%1x", cache_dir, dir); - create_dir(cdir); + if (create_dir(cdir) != 0) { + return 1; + } x_asprintf(&fname, "%s/stats", cdir); free(cdir); @@ -326,6 +330,8 @@ } free(fname); } + + return 0; } /* set the per directory sizes */ --- ccache.c (révision 8804) +++ ccache.c (copie de travail) @@ -935,15 +934,23 @@ case 'F': check_cache_dir(); v = atoi(optarg); - stats_set_limits(v, -1); - printf("Set cache file limit to %u\n", (unsigned)v); + if (stats_set_limits(v, -1) == 0) { + printf("Set cache file limit to %u\n", (unsigned)v); + } else { + printf("Could not set cache file limit.\n"); + exit(1); + } break; case 'M': check_cache_dir(); v = value_units(optarg); - stats_set_limits(-1, v); - printf("Set cache size limit to %uk\n", (unsigned)v); + if (stats_set_limits(-1, v) == 0) { + printf("Set cache size limit to %uk\n", (unsigned)v); + } else { + printf("Could not set cache size limit.\n"); + exit(1); + } break; default: --- ccache.h (révision 8804) +++ ccache.h (copie de travail) @@ -101,7 +101,7 @@ void stats_summary(void); void stats_tocache(size_t size); void stats_read(const char *stats_file, unsigned counters[STATS_END]); -void stats_set_limits(long maxfiles, long maxsize); +int stats_set_limits(long maxfiles, long maxsize); size_t value_units(const char *s); void display_size(unsigned v); void stats_set_sizes(const char *dir, size_t num_files, size_t total_size); swig-3.0.12/CCache/debian/patches/10_lru_cleanup.diff0000664000175000017500000000105713042756442022062 0ustar williamwilliam--- ccache.c (révision 8804) +++ ccache.c (copie de travail) @@ -481,6 +481,9 @@ return; } + /* update timestamps for LRU cleanup + also gives output_file a sensible mtime when hard-linking (for make) */ + utime(hashname, NULL); utime(stderr_file, NULL); if (strcmp(output_file, "/dev/null") == 0) { @@ -513,10 +516,6 @@ failed(); } } - if (ret == 0) { - /* update the mtime on the file so that make doesn't get confused */ - utime(output_file, NULL); - } /* get rid of the intermediate preprocessor file */ if (i_tmpfile) { swig-3.0.12/CCache/debian/patches/04_ignore_profile.diff0000664000175000017500000000077713042756442022567 0ustar williamwilliamdiff -ru ccache-2.4/ccache.c ccache-2.4-tp/ccache.c --- ccache.c 2007-05-20 03:14:19.000000000 +1000 +++ ccache.c 2007-05-20 03:17:54.000000000 +1000 @@ -641,6 +641,9 @@ /* these are too hard */ if (strcmp(argv[i], "-fbranch-probabilities")==0 || + strcmp(argv[i], "-fprofile-arcs") == 0 || + strcmp(argv[i], "-ftest-coverage") == 0 || + strcmp(argv[i], "--coverage") == 0 || strcmp(argv[i], "-M") == 0 || strcmp(argv[i], "-MM") == 0 || strcmp(argv[i], "-x") == 0) { swig-3.0.12/CCache/debian/patches/02_ccache-compressed.diff0000664000175000017500000007377113042756442023136 0ustar williamwilliamIndex: ccache.1 =================================================================== RCS file: /home/cvsroot/lars/ccache/ccache.1,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.6 diff -u -r1.1.1.1.2.1 -r1.6 --- ccache.1 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ ccache.1 21 Nov 2004 18:19:28 -0000 1.6 @@ -210,7 +210,8 @@ CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy\&. Using hard links is faster, but can confuse programs like -\&'make\&' that rely on modification times\&. +\&'make\&' that rely on modification times\&. Hard links are never made for +compressed cache files\&. .IP .IP "\fBCCACHE_RECACHE\fP" This forces ccache to not use any cached @@ -257,6 +258,11 @@ the default\&. On HP-UX set this environment variable to "i" if you use the aCC compiler\&. .IP +.IP "\fBCCACHE_NOCOMPRESS\fP" +If you set the environment variable +CCACHE_NOCOMPRESS then there is no compression used on files that go +into the cache\&. +.IP .PP .SH "CACHE SIZE MANAGEMENT" .PP @@ -269,6 +275,14 @@ below the numbers you specified in order to avoid doing the cache clean operation too often\&. .PP +.SH "CACHE COMPRESSION" +.PP +By default ccache will compress all files it puts into the cache +using the zlib compression\&. While this involves a negligible +performance slowdown, it significantly increases the number of files +that fit in the cache\&. You can turn off compression setting the +CCACHE_NOCOMPRESS environment variable\&. +.PP .SH "HOW IT WORKS" .PP The basic idea is to detect when you are compiling exactly the same Index: ccache.c =================================================================== RCS file: /home/cvsroot/lars/ccache/ccache.c,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.9 diff -u -r1.1.1.1.2.1 -r1.9 --- ccache.c 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ ccache.c 21 Nov 2004 18:19:28 -0000 1.9 @@ -199,7 +199,7 @@ fd = open(tmp_stderr, O_RDONLY | O_BINARY); if (fd != -1) { if (strcmp(output_file, "/dev/null") == 0 || - rename(tmp_hashname, output_file) == 0 || errno == ENOENT) { + move_file(tmp_hashname, output_file) == 0 || errno == ENOENT) { if (cpp_stderr) { /* we might have some stderr from cpp */ int fd2 = open(cpp_stderr, O_RDONLY | O_BINARY); @@ -231,14 +231,25 @@ x_asprintf(&path_stderr, "%s.stderr", hashname); if (stat(tmp_stderr, &st1) != 0 || - stat(tmp_hashname, &st2) != 0 || - rename(tmp_hashname, hashname) != 0 || - rename(tmp_stderr, path_stderr) != 0) { + stat(tmp_hashname, &st2) != 0 || + move_file(tmp_hashname, hashname) != 0 || + move_file(tmp_stderr, path_stderr) != 0) { cc_log("failed to rename tmp files - %s\n", strerror(errno)); stats_update(STATS_ERROR); failed(); } +#if ENABLE_ZLIB + /* do an extra stat on the cache files for + the size statistics */ + if (stat(path_stderr, &st1) != 0 || + stat(hashname, &st2) != 0) { + cc_log("failed to stat cache files - %s\n", strerror(errno)); + stats_update(STATS_ERROR); + failed(); + } +#endif + cc_log("Placed %s into cache\n", output_file); stats_tocache(file_size(&st1) + file_size(&st2)); @@ -474,7 +485,13 @@ } /* the user might be disabling cache hits */ +#ifndef ENABLE_ZLIB + /* if the cache file is compressed we must recache */ + if ((first && getenv("CCACHE_RECACHE")) || + test_if_compressed(hashname) == 1) { +#else if (first && getenv("CCACHE_RECACHE")) { +#endif close(fd_stderr); unlink(stderr_file); free(stderr_file); @@ -487,7 +504,9 @@ ret = 0; } else { unlink(output_file); - if (getenv("CCACHE_HARDLINK")) { + /* only make a hardlink if the cache file is uncompressed */ + if (getenv("CCACHE_HARDLINK") && + test_if_compressed(hashname) == 0) { ret = link(hashname, output_file); } else { ret = copy_file(hashname, output_file); Index: ccache.h =================================================================== RCS file: /home/cvsroot/lars/ccache/ccache.h,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.7 diff -u -r1.1.1.1.2.1 -r1.7 --- ccache.h 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ ccache.h 21 Nov 2004 18:19:28 -0000 1.7 @@ -23,6 +23,10 @@ #include #endif +#ifdef ENABLE_ZLIB +#include +#endif + #define STATUS_NOTFOUND 3 #define STATUS_FATAL 4 #define STATUS_NOCACHE 5 @@ -36,6 +40,13 @@ #define DEFAULT_MAXSIZE (1000*1000) #endif +/* file copy mode */ +#ifdef ENABLE_ZLIB +#define COPY_UNCOMPRESSED 0 +#define COPY_FROM_CACHE 1 +#define COPY_TO_CACHE 2 +#endif + enum stats { STATS_NONE=0, STATS_STDOUT, @@ -79,6 +90,8 @@ void copy_fd(int fd_in, int fd_out); int copy_file(const char *src, const char *dest); +int move_file(const char *src, const char *dest); +int test_if_compressed(const char *filename); int create_dir(const char *dir); void x_asprintf(char **ptr, const char *format, ...); Index: ccache.yo =================================================================== RCS file: /home/cvsroot/lars/ccache/ccache.yo,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.5 diff -u -r1.1.1.1.2.1 -r1.5 --- ccache.yo 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ ccache.yo 21 Nov 2004 18:19:28 -0000 1.5 @@ -169,6 +169,11 @@ this optimisation, in which case this option could allow ccache to be used. +dit(bf(CCACHE_NOCOMPRESS)) If you set the environment variable +CCACHE_NOCOMPRESS then there is no compression used on files that go +into the cache. However, this setting has no effect on how files are +retrieved from the cache, compressed results will still be usable. + dit(bf(CCACHE_NOSTATS)) If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile. @@ -181,7 +186,8 @@ CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like -'make' that rely on modification times. +'make' that rely on modification times. Hard links are never made for +compressed cache files. dit(bf(CCACHE_RECACHE)) This forces ccache to not use any cached results, even if it finds them. New results are still cached, but @@ -236,6 +242,14 @@ below the numbers you specified in order to avoid doing the cache clean operation too often. +manpagesection(CACHE COMPRESSION) + +By default ccache will compress all files it puts into the cache +using the zlib compression. While this involves a negligible +performance slowdown, it significantly increases the number of files +that fit in the cache. You can turn off compression setting the +CCACHE_NOCOMPRESS environment variable. + manpagesection(HOW IT WORKS) The basic idea is to detect when you are compiling exactly the same @@ -294,6 +308,8 @@ cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this. + it() Set bf(CCACHE_NOCOMPRESS) for all users, if there are users with + versions of ccache that do not support compression. ) manpagesection(HISTORY) Index: config.h.in =================================================================== RCS file: /home/cvsroot/lars/ccache/config.h.in,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- config.h.in 30 Apr 2004 13:13:41 -0000 1.1.1.1 +++ config.h.in 4 May 2004 20:49:26 -0000 1.2 @@ -98,3 +98,6 @@ /* Define _GNU_SOURCE so that we get all necessary prototypes */ #undef _GNU_SOURCE + +/* Define to 1 if you like to have zlib compression for the ccache. */ +#undef ENABLE_ZLIB Index: configure =================================================================== RCS file: /home/cvsroot/lars/ccache/configure,v retrieving revision 1.1.1.1.2.1 diff -u -r1.1.1.1.2.1 configure --- configure 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ configure 21 Nov 2004 18:24:42 -0000 @@ -836,6 +836,11 @@ cat <<\_ACEOF +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-zlib enable zlib support for ccache compression + Some influential environment variables: CC C compiler command CFLAGS C compiler flags @@ -936,7 +941,7 @@ else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi - cd "$ac_popdir" + cd $ac_popdir done fi @@ -1859,7 +1864,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -1917,7 +1923,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2033,7 +2040,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2087,7 +2095,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2132,7 +2141,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2176,7 +2186,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2609,7 +2620,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2681,7 +2693,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2735,7 +2748,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2806,7 +2820,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2860,7 +2875,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2927,7 +2943,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -2997,7 +3014,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3078,7 +3096,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3248,7 +3267,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3319,7 +3339,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3509,7 +3530,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3611,7 +3633,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3676,7 +3699,8 @@ cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3775,6 +3799,229 @@ fi +# Check whether --enable-zlib or --disable-zlib was given. +if test "${enable_zlib+set}" = set; then + enableval="$enable_zlib" + +else + enable_zlib=yes +fi; + +if test x"$enable_zlib" = x"yes"; then + if test "${ac_cv_header_zlib_h+set}" = set; then + echo "$as_me:$LINENO: checking for zlib.h" >&5 +echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_zlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_zlib_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking zlib.h usability" >&5 +echo $ECHO_N "checking zlib.h usability... $ECHO_C" >&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 { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking zlib.h presence" >&5 +echo $ECHO_N "checking zlib.h presence... $ECHO_C" >&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 { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&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 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + 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 +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: zlib.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: zlib.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: zlib.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: zlib.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: zlib.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: zlib.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: zlib.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: zlib.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for zlib.h" >&5 +echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6 +if test "${ac_cv_header_zlib_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_zlib_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5 +echo "${ECHO_T}$ac_cv_header_zlib_h" >&6 + +fi +if test $ac_cv_header_zlib_h = yes; then + echo "$as_me:$LINENO: checking for gzdopen in -lz" >&5 +echo $ECHO_N "checking for gzdopen in -lz... $ECHO_C" >&6 +if test "${ac_cv_lib_z_gzdopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $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 gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gzdopen (); +int +main () +{ +gzdopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_z_gzdopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_z_gzdopen=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_z_gzdopen" >&5 +echo "${ECHO_T}$ac_cv_lib_z_gzdopen" >&6 +if test $ac_cv_lib_z_gzdopen = yes; then + LIBS="-lz $LIBS"; cat >>confdefs.h <<\_ACEOF +#define ENABLE_ZLIB 1 +_ACEOF + +fi + +fi + + +fi + ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF @@ -4568,6 +4815,11 @@ *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi # 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. */ @@ -4606,12 +4858,6 @@ fi;; esac done` || { (exit 1); exit 1; } - - if test x"$ac_file" != x-; then - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - rm -f "$ac_file" - fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub Index: configure.in =================================================================== RCS file: /home/cvsroot/lars/ccache/configure.in,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.4 diff -u -r1.1.1.1.2.1 -r1.4 --- configure.in 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ configure.in 21 Nov 2004 18:19:28 -0000 1.4 @@ -68,5 +68,14 @@ AC_DEFINE(HAVE_C99_VSNPRINTF, 1, [ ]) fi +dnl Check for zlib. +AC_ARG_ENABLE([zlib], + AS_HELP_STRING([--enable-zlib], [enable zlib support for ccache compression]),, + [enable_zlib=yes]) + +if test x"$enable_zlib" = x"yes"; then + AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, gzdopen, LIBS="-lz $LIBS"; AC_DEFINE(ENABLE_ZLIB))) +fi + AC_CONFIG_FILES([Makefile]) AC_OUTPUT Index: util.c =================================================================== RCS file: /home/cvsroot/lars/ccache/util.c,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.11 diff -u -r1.1.1.1.2.1 -r1.11 --- util.c 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ util.c 21 Nov 2004 18:19:28 -0000 1.11 @@ -44,6 +44,7 @@ exit(1); } +#ifndef ENABLE_ZLIB /* copy all data from one file descriptor to another */ void copy_fd(int fd_in, int fd_out) { @@ -57,6 +58,11 @@ } } +/* move a file using rename */ +int move_file(const char *src, const char *dest) { + return rename(src, dest); +} + /* copy a file - used when hard links don't work the copy is done via a temporary file and atomic rename */ @@ -120,6 +126,174 @@ return 0; } +#else /* ENABLE_ZLIB */ + +/* copy all data from one file descriptor to another + possibly decompressing it +*/ +void copy_fd(int fd_in, int fd_out) { + char buf[10240]; + int n; + gzFile gz_in; + + gz_in = gzdopen(dup(fd_in), "rb"); + + if (!gz_in) { + fatal("Failed to copy fd"); + } + + while ((n = gzread(gz_in, buf, sizeof(buf))) > 0) { + if (write(fd_out, buf, n) != n) { + fatal("Failed to copy fd"); + } + } +} + +static int _copy_file(const char *src, const char *dest, int mode) { + int fd_in, fd_out; + gzFile gz_in, gz_out = NULL; + char buf[10240]; + int n, ret; + char *tmp_name; + mode_t mask; + struct stat st; + + x_asprintf(&tmp_name, "%s.XXXXXX", dest); + + if (getenv("CCACHE_NOCOMPRESS")) { + mode = COPY_UNCOMPRESSED; + } + + /* open source file */ + fd_in = open(src, O_RDONLY); + if (fd_in == -1) { + return -1; + } + + gz_in = gzdopen(fd_in, "rb"); + if (!gz_in) { + close(fd_in); + return -1; + } + + /* open destination file */ + fd_out = mkstemp(tmp_name); + if (fd_out == -1) { + gzclose(gz_in); + free(tmp_name); + return -1; + } + + if (mode == COPY_TO_CACHE) { + /* The gzip file format occupies at least 20 bytes. So + it will always occupy an entire filesystem block, + even for empty files. + Since most stderr files will be empty, we turn off + compression in this case to save space. + */ + if (fstat(fd_in, &st) != 0) { + gzclose(gz_in); + close(fd_out); + free(tmp_name); + return -1; + } + if (file_size(&st) == 0) { + mode = COPY_UNCOMPRESSED; + } + } + + if (mode == COPY_TO_CACHE) { + gz_out = gzdopen(dup(fd_out), "wb"); + if (!gz_out) { + gzclose(gz_in); + close(fd_out); + free(tmp_name); + return -1; + } + } + + while ((n = gzread(gz_in, buf, sizeof(buf))) > 0) { + if (mode == COPY_TO_CACHE) { + ret = gzwrite(gz_out, buf, n); + } else { + ret = write(fd_out, buf, n); + } + if (ret != n) { + gzclose(gz_in); + if (gz_out) { + gzclose(gz_out); + } + close(fd_out); + unlink(tmp_name); + free(tmp_name); + return -1; + } + } + + gzclose(gz_in); + if (gz_out) { + gzclose(gz_out); + } + + /* get perms right on the tmp file */ + mask = umask(0); + fchmod(fd_out, 0666 & ~mask); + umask(mask); + + /* the close can fail on NFS if out of space */ + if (close(fd_out) == -1) { + unlink(tmp_name); + free(tmp_name); + return -1; + } + + unlink(dest); + + if (rename(tmp_name, dest) == -1) { + unlink(tmp_name); + free(tmp_name); + return -1; + } + + free(tmp_name); + + return 0; +} + +/* move a file to the cache, compressing it */ +int move_file(const char *src, const char *dest) { + int ret; + + ret = _copy_file(src, dest, COPY_TO_CACHE); + if (ret != -1) unlink(src); + return ret; +} + +/* copy a file from the cache, decompressing it */ +int copy_file(const char *src, const char *dest) { + return _copy_file(src, dest, COPY_FROM_CACHE); +} +#endif /* ENABLE_ZLIB */ + +/* test if a file is zlib compressed */ +int test_if_compressed(const char *filename) { + FILE *f; + + f = fopen(filename, "rb"); + if (!f) { + return 0; + } + + /* test if file starts with 1F8B, which is zlib's + * magic number */ + if ((fgetc(f) != 0x1f) || (fgetc(f) != 0x8b)) { + fclose(f); + return 0; + } + + fclose(f); + return 1; +} /* make sure a directory exists */ int create_dir(const char *dir) Index: manage-cache.sh =================================================================== RCS file: manage-cache.sh diff -N manage-cache.sh --- manage-cache.sh 1 Jan 1970 00:00:00 -0000 +++ manage-cache.sh-cache.sh 12 May 2004 19:22:20 -0000 1.1 @@ -0,0 +1,68 @@ +#!/bin/bash +# +# 2004-05-12 lars@gustaebel.de + +CCACHE_DIR=${CCACHE_DIR:-$HOME/.ccache} + +echo "Do you want to compress or decompress the ccache in $CCACHE_DIR?" +read -p "Type c or d: " mode + +if [ "$mode" != "c" ] && [ "$mode" != "d" ] +then + exit 1 +fi + +is_compressed() { + test "$(head -c 2 $1)" = $'\x1f\x8b' + return $? +} + +tmpfile=$(mktemp) + +for dir in 0 1 2 3 4 5 6 7 8 9 a b c d e f +do + # process ccache subdir + echo -n "$dir " + + # find cache files + find $CCACHE_DIR/$dir -type f -name '*-*' | + sort > $tmpfile + + oldsize=$(cat $CCACHE_DIR/$dir/stats | cut -d ' ' -f 13) + newsize=0 + + while read file + do + # empty files will be ignored since compressing + # them makes them bigger + test $(stat -c %s $file) -eq 0 && continue + + if [ $mode = c ] + then + if ! is_compressed $file + then + gzip $file + mv $file.gz $file + fi + else + if is_compressed $file + then + mv $file $file.gz + gzip -d $file.gz + fi + fi + + # calculate new size statistic for this subdir + let newsize=$newsize+$(stat -c "%B*%b" $file)/1024 + done < $tmpfile + + # update statistic file + read -a numbers < $CCACHE_DIR/$dir/stats + numbers[12]=$newsize + echo "${numbers[*]} " > $CCACHE_DIR/$dir/stats +done +echo + +# clean up +rm $tmpfile + Index: Makefile.in =================================================================== RCS file: /home/cvsroot/lars/ccache/Makefile.in,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.12 diff -u -r1.1.1.1.2.1 -r1.12 --- Makefile.in 21 Nov 2004 17:55:36 -0000 1.1.1.1.2.1 +++ Makefile.in 21 Nov 2004 18:19:28 -0000 1.12 @@ -11,6 +11,7 @@ CFLAGS=@CFLAGS@ -I. EXEEXT=@EXEEXT@ +LIBS= @LIBS@ OBJS= ccache.o mdfour.o hash.o execute.o util.o args.o stats.o \ cleanup.o snprintf.o unify.o HEADERS = ccache.h mdfour.h @@ -20,7 +21,7 @@ docs: ccache.1 web/ccache-man.html ccache$(EXEEXT): $(OBJS) $(HEADERS) - $(CC) $(CFLAGS) -o $@ $(OBJS) + $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) ccache.1: ccache.yo -yodl2man -o ccache.1 ccache.yo swig-3.0.12/CCache/debian/patches/13_html_links.diff0000664000175000017500000000222613042756442021717 0ustar williamwilliam--- web/index.html~ 2004-09-13 13:38:30.000000000 +0300 +++ web/index.html 2004-09-26 01:04:38.458008118 +0300 @@ -29,10 +29,10 @@
  • fixed handling of HOME environment variable
-See the manual page for details +See the manual page for details on the new options.

-You can get this release from the download directory +You can get this release from the download directory

NOTE! This release changes the hash input slighly, so you will probably find that you will not get any hits against your existing @@ -87,7 +87,7 @@

Documentation

-See the manual page +See the manual page

Performance

@@ -116,7 +116,7 @@

Download

You can download the latest release from the download directory.

+href="http://ccache.samba.org/ftp/ccache/">download directory.

For the bleeding edge, you can fetch ccache via CVS or rsync. To fetch via cvs use the following command: swig-3.0.12/CCache/debian/patches/08_manpage_hyphens.diff0000664000175000017500000000722713042756442022733 0ustar williamwilliamIndex: ccache.1 =================================================================== --- ccache.1 (révision 7695) +++ ccache.1 (copie de travail) @@ -49,7 +49,7 @@ .IP "\fB-s\fP" Print the current statistics summary for the cache\&. The statistics are stored spread across the subdirectories of the -cache\&. Using "ccache -s" adds up the statistics across all +cache\&. Using "ccache \-s" adds up the statistics across all subdirectories and prints the totals\&. .IP .IP "\fB-z\fP" @@ -60,7 +60,7 @@ .IP .IP "\fB-c\fP" Clean the cache and re-calculate the cache file count and -size totals\&. Normally the -c option should not be necessary as ccache +size totals\&. Normally the \-c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile\&. This option is mostly useful if you manually modify the cache contents or believe that the cache @@ -100,9 +100,9 @@ cp ccache /usr/local/bin/ - ln -s /usr/local/bin/ccache /usr/local/bin/gcc - ln -s /usr/local/bin/ccache /usr/local/bin/g++ - ln -s /usr/local/bin/ccache /usr/local/bin/cc + ln \-s /usr/local/bin/ccache /usr/local/bin/gcc + ln \-s /usr/local/bin/ccache /usr/local/bin/g++ + ln \-s /usr/local/bin/ccache /usr/local/bin/cc .fi @@ -118,7 +118,7 @@ .PP When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using\&. The only exception -to this is the option \&'--ccache-skip\&'\&. That option can be used to tell +to this is the option \&'\-\-ccache-skip\&'\&. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is\&. .PP @@ -128,7 +128,7 @@ of the resulting object file (among other things)\&. The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C -file)\&. By using --ccache-skip you can force an option to not be +file)\&. By using \-\-ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option\&. .PP @@ -238,7 +238,7 @@ .IP "\fBCCACHE_UNIFY\fP" If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor -output if -g is not used in the compile\&. The unifier is slower than a +output if \-g is not used in the compile\&. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of @@ -262,7 +262,7 @@ .PP By default ccache has a one gigabyte limit on the cache size and no maximum number of files\&. You can set a different limit using the -"ccache -M" and "ccache -F" options, which set the size and number of +"ccache \-M" and "ccache \-F" options, which set the size and number of files limits\&. .PP When these limits are reached ccache will reduce the cache to 20% @@ -276,7 +276,7 @@ that it is the same code by forming a hash of: .PP .IP o -the pre-processor output from running the compiler with -E +the pre-processor output from running the compiler with \-E .IP o the command line options .IP o @@ -331,7 +331,7 @@ .IP o Make sure that the setgid bit is set on all directories in the cache\&. This tells the filesystem to inherit group ownership for new -directories\&. The command "chmod g+s `find $CCACHE_DIR -type d`" might +directories\&. The command "chmod g+s `find $CCACHE_DIR \-type d`" might be useful for this\&. .PP .SH "HISTORY" swig-3.0.12/CCache/debian/patches/09_respect_ldflags.diff0000664000175000017500000000053613042756442022723 0ustar williamwilliam--- Makefile.in.orig 2008-03-23 17:01:19.000000000 +1300 +++ Makefile.in 2008-03-23 17:03:03.000000000 +1300 @@ -21,7 +21,7 @@ docs: ccache.1 web/ccache-man.html ccache$(EXEEXT): $(OBJS) $(HEADERS) - $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) ccache.1: ccache.yo -yodl2man -o ccache.1 ccache.yo swig-3.0.12/CCache/debian/patches/11_utimes.diff0000664000175000017500000000460213042756442021057 0ustar williamwilliam--- ccache.c 2004-09-13 03:38:30.000000000 -0700 +++ ccache.c 2006-06-09 16:29:16.695117780 -0700 @@ -481,8 +481,13 @@ /* update timestamps for LRU cleanup also gives output_file a sensible mtime when hard-linking (for make) */ +#ifdef HAVE_UTIMES + utimes(hashname, NULL); + utimes(stderr_file, NULL); +#else utime(hashname, NULL); utime(stderr_file, NULL); +#endif if (strcmp(output_file, "/dev/null") == 0) { ret = 0; --- ccache.h 2004-09-13 03:38:30.000000000 -0700 +++ ccache.h 2006-06-09 16:28:16.601658626 -0700 @@ -22,6 +22,9 @@ #ifdef HAVE_PWD_H #include #endif +#ifdef HAVE_SYS_TIME_H +#include +#endif #define STATUS_NOTFOUND 3 #define STATUS_FATAL 4 --- config.h.in 2003-09-27 21:48:17.000000000 -0700 +++ config.h.in 2006-06-09 16:25:43.000000000 -0700 @@ -19,6 +19,9 @@ /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME +/* Define to 1 if you have the `getpwuid' function. */ +#undef HAVE_GETPWUID + /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H @@ -31,6 +34,9 @@ /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H +/* Define to 1 if you have the header file. */ +#undef HAVE_PWD_H + /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH @@ -60,6 +66,9 @@ /* 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_TIME_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H @@ -69,6 +78,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* Define to 1 if you have the `utimes' function. */ +#undef HAVE_UTIMES + /* Define to 1 if you have the `vasprintf' function. */ #undef HAVE_VASPRINTF --- configure.in 2004-09-13 03:38:30.000000000 -0700 +++ configure.in 2006-06-09 16:25:15.541288184 -0700 @@ -27,10 +27,11 @@ AC_HEADER_TIME AC_HEADER_SYS_WAIT -AC_CHECK_HEADERS(ctype.h strings.h stdlib.h string.h pwd.h) +AC_CHECK_HEADERS(ctype.h strings.h stdlib.h string.h pwd.h sys/time.h) AC_CHECK_FUNCS(realpath snprintf vsnprintf vasprintf asprintf mkstemp) AC_CHECK_FUNCS(gethostname getpwuid) +AC_CHECK_FUNCS(utimes) AC_CACHE_CHECK([for compar_fn_t in stdlib.h],ccache_cv_COMPAR_FN_T, [ AC_TRY_COMPILE( swig-3.0.12/CCache/debian/patches/CREDITS0000664000175000017500000000317213042756442017437 0ustar williamwilliam01_no_home.diff: Francois Marier Made especially for the Debian package. 02_ccache_compressed.diff: Lars Gustäbel http://www.gustaebel.de/lars/ccache/ (downloaded on 2007-05-20) 03_long_options.diff: Francois Marier Made especially for the Debian package. 04_ignore_profile.diff: Ted Percival http://bugs.debian.org/cgi-bin/bugreport.cgi?msg=20;filename=ccache-profile.patch;att=1;bug=215849 05_nfs_fix.diff: John Coiner http://lists.samba.org/archive/ccache/2007q1/000265.html 06_md.diff: Andrea Bittau http://darkircop.org/ccache/ccache-2.4-md.patch (downloaded on 2007-06-30) 07_cachedirtag.diff: Karl Chen http://lists.samba.org/archive/ccache/2008q1/000316.html (downloaded on 2008-02-02) 08_manpage_hyphens.diff: Francois Marier Made especially for the Debian package. 09_respect_ldflags.diff: Lisa Seelye http://sources.gentoo.org/viewcvs.py/gentoo-x86/dev-util/ccache/files/ccache-2.4-respectflags.patch?rev=1.1&view=markup 10_lru_cleanup.diff: RW http://lists.samba.org/archive/ccache/2008q2/000339.html (downloaded on 2008-04-11) 11_utimes.diff: Robin H. Johnson http://sources.gentoo.org/viewcvs.py/gentoo-x86/dev-util/ccache/files/ccache-2.4-utimes.patch?rev=1.1&view=markup 12_cachesize_permissions.diff: Francois Marier Made especially for the Debian package to fix http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=332527 swig-3.0.12/CCache/debian/patches/06_md.diff0000664000175000017500000000422513042756442020156 0ustar williamwilliam--- ccache.c Mon Sep 13 11:38:30 2004 +++ ccache.c Thu Jun 21 22:17:32 2007 @@ -627,6 +627,13 @@ static void process_args(int argc, char int found_S_opt = 0; struct stat st; char *e; + /* is gcc being asked to output dependencies? */ + int generating_dependencies = 0; + /* is the dependency makefile name overridden with -MF? */ + int dependency_filename_specified = 0; + /* is the dependency makefile target name specified with -MQ or -MF? */ + int dependency_target_specified = 0; + stripped_args = args_init(0, NULL); @@ -702,6 +709,18 @@ static void process_args(int argc, char continue; } + /* These options require special handling, because they + behave differently with gcc -E, when the output + file is not specified. */ + + if (strcmp(argv[i], "-MD") == 0 || strcmp(argv[i], "-MMD") == 0) { + generating_dependencies = 1; + } else if (strcmp(argv[i], "-MF") == 0) { + dependency_filename_specified = 1; + } else if (strcmp(argv[i], "-MQ") == 0 || strcmp(argv[i], "-MT") == 0) { + dependency_target_specified = 1; + } + /* options that take an argument */ { const char *opts[] = {"-I", "-include", "-imacros", "-iprefix", @@ -812,6 +831,41 @@ static void process_args(int argc, char } p[1] = found_S_opt ? 's' : 'o'; p[2] = 0; + } + + /* If dependencies are generated, configure the preprocessor */ + + if (generating_dependencies && output_file) { + if (!dependency_filename_specified) { + char *default_depfile_name = x_strdup(output_file); + char *p = strrchr(default_depfile_name, '.'); + + if (p) { + if (strlen(p) < 2) { + stats_update(STATS_ARGS); + failed(); + return; + } + *p = 0; + } + else { + int len = p - default_depfile_name; + + p = x_malloc(len + 3); + strncpy(default_depfile_name, p, len - 1); + free(default_depfile_name); + default_depfile_name = p; + } + + strcat(default_depfile_name, ".d"); + args_add(stripped_args, "-MF"); + args_add(stripped_args, default_depfile_name); + } + + if (!dependency_target_specified) { + args_add(stripped_args, "-MT"); + args_add(stripped_args, output_file); + } } /* cope with -o /dev/null */ swig-3.0.12/CCache/debian/dirs0000664000175000017500000000005213042756442015646 0ustar williamwilliamusr/bin usr/lib/ccache usr/share/man/man1 swig-3.0.12/CCache/debian/README.Debian0000664000175000017500000000401013042756442017021 0ustar williamwilliamInstalling ccache ----------------- The recommended way to use this with Debian is to either create "cc" and "gcc" symlinks to /usr/bin/ccache in your private bin directory (which must be before the real cc and gcc in your path), or use CC="ccache gcc" on the make command line. Another option is to just prepend /usr/lib/ccache in your PATH environment variable, like export PATH="/usr/lib/ccache:$PATH" Note that ccache works with both native and cross compilers. Ignoring whitespace ------------------- If you wish to set up ccache so that it ignores blank lines, have a look at the CCACHE_UNIFY option. However, please note that this option is off by default since the reported line numbers may not match the source files anymore. NFS Issues ---------- (from John Coiner on the ccache mailing list) When CCache creates a hardlinked output file, it calls utime() to update the timestamp on the object, so that Make realizes that the object has changed. On NFS, utime() has no coherency guarantee, AFAIK. When utime() runs on host A, and our parallel implementation of Make is running on host B, sometimes Make doesn't see the new timestamp soon enough -- and neglects to relink the final binary. That's a one-way ticket to Silent Mysterious Failure Town. Instead of relying on the object file timestamp, we create a dummy file with a reliable timestamp: objs/foo.o objs/foo.o.built : if ( ccache gcc -o foo.o -c foo.c ) ; \ then touch objs/foo.o.built ; \ else exit 1; \ fi binary : objs/foo.o.built gcc -o binary objs/foo.o NFS does make a coherency guarantee, that if a file is written and close()d on host A, and subsequently open()ed on host B, that the second open() will reflect all modifications and attributes from the close(). Since Make does open() when checking timestamps, and the dummy file is close()d when it's created, the binary will always relink after the object is recompiled. -- Francois Marier Sun, 20 May 2007 17:35:36 +1200 swig-3.0.12/CCache/debian/rules0000664000175000017500000001160113042756442016041 0ustar williamwilliam#!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) export DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) export DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE)) confflags += --build $(DEB_HOST_GNU_TYPE) else confflags += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE) endif ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif config.status: configure dh_testdir # Apply Debian specific patches cp $(CURDIR)/ccache.c $(CURDIR)/ccache.c.unpatched cp $(CURDIR)/util.c $(CURDIR)/util.c.unpatched cp $(CURDIR)/ccache.1 $(CURDIR)/ccache.1.unpatched cp $(CURDIR)/ccache.h $(CURDIR)/ccache.h.unpatched cp $(CURDIR)/ccache.yo $(CURDIR)/ccache.yo.unpatched cp $(CURDIR)/config.h.in $(CURDIR)/config.h.in.unpatched cp $(CURDIR)/configure $(CURDIR)/configure.unpatched cp $(CURDIR)/configure.in $(CURDIR)/configure.in.unpatched cp $(CURDIR)/Makefile.in $(CURDIR)/Makefile.in.unpatched if test ! -f patch-stamp; then \ for patch in $(CURDIR)/debian/patches/*.diff ;\ do \ echo APPLYING PATCH\: $${patch##*/};\ patch -p0 < $$patch ;\ done ;\ touch patch-stamp ;\ fi chmod +x $(CURDIR)/manage-cache.sh ./configure $(confflags) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info build: build-stamp build-stamp: config.status dh_testdir $(MAKE) touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp # Unapply patches -test -r $(CURDIR)/ccache.c.unpatched && mv $(CURDIR)/ccache.c.unpatched $(CURDIR)/ccache.c -test -r $(CURDIR)/util.c.unpatched && mv $(CURDIR)/util.c.unpatched $(CURDIR)/util.c -test -r $(CURDIR)/ccache.1.unpatched && mv $(CURDIR)/ccache.1.unpatched $(CURDIR)/ccache.1 -test -r $(CURDIR)/ccache.h.unpatched && mv $(CURDIR)/ccache.h.unpatched $(CURDIR)/ccache.h -test -r $(CURDIR)/ccache.yo.unpatched && mv $(CURDIR)/ccache.yo.unpatched $(CURDIR)/ccache.yo -test -r $(CURDIR)/config.h.in.unpatched && mv $(CURDIR)/config.h.in.unpatched $(CURDIR)/config.h.in -test -r $(CURDIR)/configure.unpatched && mv $(CURDIR)/configure.unpatched $(CURDIR)/configure -test -r $(CURDIR)/configure.in.unpatched && mv $(CURDIR)/configure.in.unpatched $(CURDIR)/configure.in -test -r $(CURDIR)/Makefile.in.unpatched && mv $(CURDIR)/Makefile.in.unpatched $(CURDIR)/Makefile.in -rm -f $(CURDIR)/manage-cache.sh -rm -f patch-stamp [ ! -f Makefile ] || $(MAKE) distclean dh_clean # Update config.sub and config.guess -test -r /usr/share/misc/config.sub && \ cp -f /usr/share/misc/config.sub config.sub -test -r /usr/share/misc/config.guess && \ cp -f /usr/share/misc/config.guess config.guess install: build dh_testdir dh_testroot dh_clean -k dh_installdirs # Add here commands to install the package into debian/ccache. $(MAKE) install prefix=$(CURDIR)/debian/ccache/usr ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/$(DEB_BUILD_GNU_TYPE)-gcc ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/$(DEB_BUILD_GNU_TYPE)-g++ set -e; for ver in 2.95 3.0 3.2 3.3 3.4 4.0 4.1 4.2 4.3; do \ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/$(DEB_BUILD_GNU_TYPE)-gcc-$$ver; \ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/gcc-$$ver; \ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/$(DEB_BUILD_GNU_TYPE)-g++-$$ver; \ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/g++-$$ver; \ done ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/cc ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/c++ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/gcc ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/g++ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/i586-mingw32msvc-c++ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/i586-mingw32msvc-cc ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/i586-mingw32msvc-g++ ln -s ../../bin/ccache $(CURDIR)/debian/ccache/usr/lib/ccache/i586-mingw32msvc-gcc # Build architecture-independent files here. binary-indep: build install # We have nothing to do by default. # Build architecture-dependent files here. binary-arch: build install dh_testdir dh_testroot dh_installdocs dh_installexamples dh_installmenu dh_installcron dh_installman dh_installinfo dh_installchangelogs dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install swig-3.0.12/CCache/debian/changelog0000664000175000017500000001637713042756442016655 0ustar williamwilliamccache (2.4-15) unstable; urgency=low * Add a new patch which improve the consistency of timestamps on cached objects to make sure clean-up is based on least recently used objects. * Patch the set_limit call so that non-writable cache directories return an error when attempting to size the max(files|size) (closes: #332527) -- Francois Marier Sun, 13 Apr 2008 15:07:05 +1200 ccache (2.4-14) unstable; urgency=low * Mention the long options everywhere in the manpage * Merge Gentoo patches: - respect user's LDFLAGS - use utimes() for timestamp if possible -- Francois Marier Sun, 23 Mar 2008 16:30:11 +1300 ccache (2.4-13) unstable; urgency=low * Update CACHEDIR.TAG patch to avoid creating the tag file when the CCACHE_READONLY environment variable is set. (closes: #464356) * Mention the GNU-style long options in the manpage -- Francois Marier Thu, 07 Feb 2008 10:50:42 +1300 ccache (2.4-12) unstable; urgency=low * Add symlink for gcc 4.3 (closes: #463590) * Add support for the CACHEDIR.TAG spec, thanks to Karl Chen. (see http://www.brynosaurus.com/cachedir/) * Fix hyphens in manpage (lintian notice) * Bump Standards-Version up to 3.7.3 (no changes) * Bump debhelper compatibility to 6 -- Francois Marier Sat, 02 Feb 2008 10:37:22 +1300 ccache (2.4-11) unstable; urgency=low * Add the collab-maint repo to debian/control -- Francois Marier Tue, 20 Nov 2007 15:26:37 +1300 ccache (2.4-10) unstable; urgency=low * Document where the patches are from in debian/patches/CREDITS * debian/rules: - Fixed "make distclean" lintian warning - Removed commented-out entries * Set debhelper compatibility to 5 * Add homepage field in debian/control * Add symlinks for MinGW (closes: #445782) * Bump the version to 5 in the debhelper dependency -- Francois Marier Fri, 19 Oct 2007 16:04:37 +1300 ccache (2.4-9) unstable; urgency=low * Add a symlink for gcc 4.2 (closes: #431007) * Fix dependencies when using -o (closes: #217713) -- Francois Marier Sat, 30 Jun 2007 17:58:44 +1200 ccache (2.4-8) unstable; urgency=low * Enable zlib compression of the cache by default (closes: #409848). Thanks to Sami Liedes for suggesting this. * Disable ccache when profiling (closes: #215849). Thanks to Ted Percival for the Patch. * Fix NFS renaming issues and add instructions to the README. Thanks to John Coiner and instructions. * Put all patches in debian/patches and apply them at build time. -- Francois Marier Sun, 20 May 2007 19:42:34 +1200 ccache (2.4-7) unstable; urgency=low * Use the real compiler when HOME is not set (closes: #396350) * Include user script under doc/examples (closes: #392435) Thanks to Behan Webster! * Add support for GNU --long options (closes: #297126) -- Francois Marier Sat, 18 Nov 2006 00:50:59 -0500 ccache (2.4-6) unstable; urgency=low * Include symlinks for gcc 4.1 (closes: #372838) * Update watch file -- Francois Marier Tue, 13 Jun 2006 22:17:37 -0400 ccache (2.4-5) unstable; urgency=low * Document the fact that cross-compiling is supported (closes: #349221) * Bump Standards-Version up to 3.7.2 (no changes) -- Francois Marier Sun, 4 Jun 2006 01:20:07 -0400 ccache (2.4-4) unstable; urgency=low * Mention another way to use ccache in README.Debian (thanks to Benjamin Drieu for the suggestion) (closes: #267632) * Update FSF address * Fix watch file -- Francois Marier Sat, 26 Nov 2005 00:15:13 -0500 ccache (2.4-3) unstable; urgency=low * Actually use the configuration flags in debian/rules * Bump Standards-Version up to 3.6.2 (no changes) -- Francois Marier Sun, 26 Jun 2005 13:33:19 -0400 ccache (2.4-2) unstable; urgency=low * Add gcc and g++ symlinks to /usr/lib/ccache (closes: #313490) * Remove invalid entry from Depends -- Francois Marier Wed, 15 Jun 2005 20:51:03 -0400 ccache (2.4-1) unstable; urgency=low * New maintainer (closes: #312867) * New upstream version: (closes: #273753, #239640) - New CCACHE_READONLY and CCACHE_TEMPDIR options - Fixed handling of hard-linked compilers on AIX - Fixed handling of HOME environment variable (closes: #299880) - Show cache directory in stats output * Fix copyright file * Add 'distcc' to Suggests (closes: #269158) * Add a note about whitespace in README.Debian (closes: #229116) * Update rules to add symmlinks for gcc 3.4 & 4.0 (closes: #261177) * Acknowledge NMUs (closes: #200185, #177129, #174417) -- Francois Marier Sun, 12 Jun 2005 12:05:34 -0400 ccache (2.3-1.1) unstable; urgency=low * Non-maintainer upload during BSP * Re-apply patch for #200185 ccache: Incorrect symlinks in /usr/lib/ccache (Closes: #200185) -- Frank Lichtenheld Fri, 19 Mar 2004 11:14:50 +0100 ccache (2.3-1) unstable; urgency=low * New upstream release: obsoletes existing caches. * Tweak package description in arbitrary way (closes: #181721) -- Paul Russell Mon, 29 Sep 2003 02:53:20 +0200 ccache (2.2-2) unstable; urgency=low * Insert more symlinks in ccache dir (closes: #197468) -- Paul Russell Mon, 16 Jun 2003 10:52:50 +0100 ccache (2.2-1) unstable; urgency=low * New upstream release (closes: #150755) * Insert more symlinks in ccache dir (closes: #144462) -- Paul Russell Mon, 17 Feb 2003 07:19:36 +0100 ccache (2.1.1-2) unstable; urgency=low * Restored /usr/lib/ccache symlinks (closes: #179393) * Fixed manpage typo (closes: #179564) * With thanks to Andreas Rottmann. -- Paul Russell Wed, 5 Feb 2003 10:01:10 +0100 ccache (2.1.1-1) unstable; urgency=low * NMU (with maintainer consent). * New upstream release (closes: #174417, #177129). * debian/control: + Build-Depend on and use dephelper 4 (DH_COMPAT = 4). + Bumped Standards-Version to 3.5.8. + No full stop on short package description (fixes linda warning). * debian/copright: + Make lintian feel comfortable; fixes warnings: - copyright-should-refer-to-common-license-file-for-gpl - copyright-lists-upstream-authors-with-dh_make-boilerplate * Built with g++ 3.2 :-). -- Andreas Rottmann Thu, 16 Jan 2003 11:42:38 +0100 ccache (1.9-1) unstable; urgency=low * New upstream release (closes: #144920) -- Paul Russell Mon, 13 May 2002 10:01:09 +0200 ccache (1.8-1) unstable; urgency=low * New upstream release (closes: #145401) -- Paul Russell Fri, 3 May 2002 02:26:32 +0200 ccache (1.7-1) unstable; urgency=low * New upstream release * Install symlinks in /usr/lib/ccache (closes: #141337) -- Paul Russell Wed, 10 Apr 2002 17:51:21 +0200 ccache (1.4-1) unstable; urgency=low * New upstream release -- Paul Russell Wed, 3 Apr 2002 03:41:46 +0200 ccache (1.2-1) unstable; urgency=low * Initial Release. -- Paul Russell Sun, 31 Mar 2002 14:08:57 +0200 swig-3.0.12/CCache/debian/copyright0000664000175000017500000000240613042756442016722 0ustar williamwilliamThis package was debianized by Paul Russell on Sun, 31 Mar 2002 14:08:57 +0200. It was downloaded from http://ccache.samba.org/ftp/ccache/ The ccache-zlib patch was downloaded from http://www.gustaebel.de/lars/ccache/ Upstream Author: Andrew Tridgell Copyright: 2002-2005 Andrew Tridgell 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA You are free to distribute this software under the terms of the GNU General Public License. On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL file. swig-3.0.12/CCache/debian/docs0000664000175000017500000000000713042756442015635 0ustar williamwilliamREADME swig-3.0.12/CCache/debian/update-ccache0000664000175000017500000000171513042756442017402 0ustar williamwilliam#!/bin/sh # # Update compiler links to ccache (in /usr/local/bin) # # The idea is that /usr/local/bin is ahead of /usr/bin in your PATH, so adding # the link /usr/local/bin/cc -> /usr/bin/ccache means that it is run instead of # /usr/bin/cc # # Written by: Behan Webster # DIRECTORY=/usr/local/bin CCACHE=/usr/bin/ccache CCDIR=/usr/lib/ccache usage() { echo "Usage: `basename $0` [--directory

] [--remove]" exit 0 } while [ $# -gt 0 ] ; do case "$1" in -d*|--d*|--directory) DIRECTORY=$2; shift; shift;; -h*|--h*|--help) usage;; -r*|--r*|--remove) REMOVE=1; shift;; -t*|--t*|--test) TEST=echo; shift;; esac done for FILE in `cd $CCDIR; ls` ; do LINK=$DIRECTORY/$FILE if [ -z "$REMOVE" ] ; then # Add link $TEST ln -fs $CCACHE $LINK else # Remove link if [ -L "$LINK" ] ; then $TEST rm -f $LINK fi fi done # vim: sw=4 ts=4 swig-3.0.12/CCache/debian/watch0000664000175000017500000000007313042756442016016 0ustar williamwilliamversion=2 http://samba.org/ftp/ccache/ccache-(.*)\.tar\.gz swig-3.0.12/CCache/debian/control0000664000175000017500000000131613042756442016371 0ustar williamwilliamSource: ccache Section: devel Priority: optional Maintainer: Francois Marier Build-Depends: debhelper (>> 6), autotools-dev, zlib1g-dev Standards-Version: 3.7.3 Homepage: http://ccache.samba.org Vcs-Svn: svn://svn.debian.org/svn/collab-maint/deb-maint/ccache/ Vcs-Browser: http://svn.debian.org/wsvn/collab-maint/deb-maint/ccache/ Package: ccache Architecture: any Depends: ${shlibs:Depends} Suggests: distcc Description: Compiler results cacher, for fast recompiles ccache is a compiler cache. It speeds up re-compilation of C/C++ code by caching previous compiles and detecting when the same compile is being done again. . This is similar to, but faster than, the compilercache package. swig-3.0.12/CCache/debian/NEWS0000664000175000017500000000164213042756442015467 0ustar williamwilliamccache (2.4-8) unstable; urgency=high zlib compression is now enabled by default in order to increase the amount of object files that can fit in the cache. The impact on performance is supposed to be almost negligible (see http://www.gustaebel.de/lars/ccache/). If you do want to disable it however, simply export the CCACHE_NOCOMPRESS environment variable. Note that a zlib-enabled ccache will still read your existing uncompressed cache. If you want to compress/uncompress your cache, see the manage-cache.sh script under /usr/share/doc/ccache/examples/. -- Francois Marier Sun, 20 May 2007 19:45:07 +1200 ccache (2.4-1) unstable; urgency=low * This release changes the hash input slighly, so you will probably find that you will not get any hits against your existing cache when you upgrade. -- Francois Marier Sat, 11 Jun 2005 13:54:33 -0400 swig-3.0.12/CCache/debian/compat0000664000175000017500000000000213042756442016163 0ustar williamwilliam6 swig-3.0.12/CCache/COPYING0000664000175000017500000004307613042756442014610 0ustar williamwilliam GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. END OF TERMS AND CONDITIONS Appendix: 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 convey 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) 19yy 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., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. swig-3.0.12/CCache/execute.c0000664000175000017500000001433113042756442015353 0ustar williamwilliam/* Copyright (C) Andrew Tridgell 2002 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ccache.h" #ifdef _WIN32 char *argvtos(char **argv) { int i, len; char *ptr, *str; for (i = 0, len = 0; argv[i]; i++) { len += strlen(argv[i]) + 3; } str = ptr = (char *)malloc(len + 1); if (str == NULL) return NULL; for (i = 0; argv[i]; i++) { len = strlen(argv[i]); *ptr++ = '"'; memcpy(ptr, argv[i], len); ptr += len; *ptr++ = '"'; *ptr++ = ' '; } *ptr = 0; return str; } #endif /* execute a compiler backend, capturing all output to the given paths the full path to the compiler to run is in argv[0] */ int execute(char **argv, const char *path_stdout, const char *path_stderr) { #ifdef _WIN32 #if 1 PROCESS_INFORMATION pinfo; STARTUPINFO sinfo; BOOL ret; DWORD exitcode; char *args; HANDLE fd_out, fd_err; SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE}; /* TODO: needs moving after possible exit() below, but before stdout is redirected */ if (ccache_verbose) { display_execute_args(argv); } fd_out = CreateFile(path_stdout, GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (fd_out == INVALID_HANDLE_VALUE) { return STATUS_NOCACHE; } fd_err = CreateFile(path_stderr, GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (fd_err == INVALID_HANDLE_VALUE) { return STATUS_NOCACHE; } ZeroMemory(&pinfo, sizeof(PROCESS_INFORMATION)); ZeroMemory(&sinfo, sizeof(STARTUPINFO)); sinfo.cb = sizeof(STARTUPINFO); sinfo.hStdError = fd_err; sinfo.hStdOutput = fd_out; sinfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE); sinfo.dwFlags |= STARTF_USESTDHANDLES; args = argvtos(argv); ret = CreateProcessA(argv[0], args, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo); free(args); CloseHandle(fd_out); CloseHandle(fd_err); if (ret == 0) return -1; WaitForSingleObject(pinfo.hProcess, INFINITE); GetExitCodeProcess(pinfo.hProcess, &exitcode); CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread); return exitcode; #else /* possibly slightly faster */ /* needs fixing to quote commandline options to handle spaces in CCACHE_DIR etc */ int status = -2; int fd, std_od = -1, std_ed = -1; /* TODO: needs moving after possible exit() below, but before stdout is redirected */ if (ccache_verbose) { display_execute_args(argv); } unlink(path_stdout); std_od = _dup(1); fd = _open(path_stdout, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 0666); if (fd == -1) { exit(STATUS_NOCACHE); } _dup2(fd, 1); _close(fd); unlink(path_stderr); fd = _open(path_stderr, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 0666); std_ed = _dup(2); if (fd == -1) { exit(STATUS_NOCACHE); } _dup2(fd, 2); _close(fd); /* Spawn process (_exec* familly doesn't return) */ status = _spawnv(_P_WAIT, argv[0], (const char **)argv); /* Restore descriptors */ if (std_od != -1) _dup2(std_od, 1); if (std_ed != -1) _dup2(std_ed, 2); _flushall(); return (status>0); #endif #else pid_t pid; int status; pid = fork(); if (pid == -1) fatal("Failed to fork"); if (pid == 0) { int fd; /* TODO: needs moving after possible exit() below, but before stdout is redirected */ if (ccache_verbose) { display_execute_args(argv); } unlink(path_stdout); fd = open(path_stdout, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 0666); if (fd == -1) { exit(STATUS_NOCACHE); } dup2(fd, 1); close(fd); unlink(path_stderr); fd = open(path_stderr, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 0666); if (fd == -1) { exit(STATUS_NOCACHE); } dup2(fd, 2); close(fd); exit(execv(argv[0], argv)); } if (waitpid(pid, &status, 0) != pid) { fatal("waitpid failed"); } if (WEXITSTATUS(status) == 0 && WIFSIGNALED(status)) { return -1; } return WEXITSTATUS(status); #endif } /* find an executable by name in $PATH. Exclude any that are links to exclude_name */ char *find_executable(const char *name, const char *exclude_name) { #if _WIN32 (void)exclude_name; DWORD ret; char namebuf[MAX_PATH]; ret = SearchPathA(getenv("CCACHE_PATH"), name, ".exe", sizeof(namebuf), namebuf, NULL); if (ret != 0) { return x_strdup(namebuf); } return NULL; #else char *path; char *tok; struct stat st1, st2; if (*name == '/') { return x_strdup(name); } path = getenv("CCACHE_PATH"); if (!path) { path = getenv("PATH"); } if (!path) { cc_log("no PATH variable!?\n"); stats_update(STATS_ENVIRONMMENT); return NULL; } path = x_strdup(path); /* search the path looking for the first compiler of the right name that isn't us */ for (tok=strtok(path,":"); tok; tok = strtok(NULL, ":")) { char *fname; x_asprintf(&fname, "%s/%s", tok, name); /* look for a normal executable file */ if (access(fname, X_OK) == 0 && lstat(fname, &st1) == 0 && stat(fname, &st2) == 0 && S_ISREG(st2.st_mode)) { /* if its a symlink then ensure it doesn't point at something called exclude_name */ if (S_ISLNK(st1.st_mode)) { char *buf = x_realpath(fname); if (buf) { char *p = str_basename(buf); if (strcmp(p, exclude_name) == 0) { /* its a link to "ccache" ! */ free(p); free(buf); continue; } free(buf); free(p); } } /* found it! */ free(path); return fname; } free(fname); } free(path); return NULL; #endif } void display_execute_args(char **argv) { if (argv) { printf("ccache executing: "); while (*argv) { printf("%s ", *argv); ++argv; } printf("\n"); fflush(stdout); } } swig-3.0.12/CCache/hash.c0000664000175000017500000000332313042756442014633 0ustar williamwilliam/* Copyright (C) Andrew Tridgell 2002 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* simple front-end functions to mdfour code */ #include "ccache.h" static struct mdfour md; void hash_buffer(const char *s, int len) { mdfour_update(&md, (unsigned char *)s, len); } void hash_start(void) { mdfour_begin(&md); } void hash_string(const char *s) { hash_buffer(s, strlen(s)); } void hash_int(int x) { hash_buffer((char *)&x, sizeof(x)); } /* add contents of a file to the hash */ void hash_file(const char *fname) { char buf[1024]; int fd, n; fd = open(fname, O_RDONLY|O_BINARY); if (fd == -1) { cc_log("Failed to open %s\n", fname); fatal("hash_file"); } while ((n = read(fd, buf, sizeof(buf))) > 0) { hash_buffer(buf, n); } close(fd); } /* return the hash result as a static string */ char *hash_result(void) { unsigned char sum[16]; static char ret[53]; int i; hash_buffer(NULL, 0); mdfour_result(&md, sum); for (i=0;i<16;i++) { sprintf(&ret[i*2], "%02x", (unsigned)sum[i]); } sprintf(&ret[i*2], "-%u", (unsigned)md.totalN); return ret; } swig-3.0.12/CCache/ccache_swig_config.h.in0000664000175000017500000000005113042756442020101 0ustar williamwilliam#define SWIG_VERSION "@PACKAGE_VERSION@" swig-3.0.12/CCache/mdfour.c0000664000175000017500000001401313042756442015202 0ustar williamwilliam/* a implementation of MD4 designed for use in the SMB authentication protocol Copyright (C) Andrew Tridgell 1997-1998. 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ccache.h" /* NOTE: This code makes no attempt to be fast! It assumes that a int is at least 32 bits long */ static struct mdfour *m; #define MASK32 (0xffffffff) #define F(X,Y,Z) ((((X)&(Y)) | ((~(X))&(Z)))) #define G(X,Y,Z) ((((X)&(Y)) | ((X)&(Z)) | ((Y)&(Z)))) #define H(X,Y,Z) (((X)^(Y)^(Z))) #define lshift(x,s) (((((x)<<(s))&MASK32) | (((x)>>(32-(s)))&MASK32))) #define ROUND1(a,b,c,d,k,s) a = lshift((a + F(b,c,d) + M[k])&MASK32, s) #define ROUND2(a,b,c,d,k,s) a = lshift((a + G(b,c,d) + M[k] + 0x5A827999)&MASK32,s) #define ROUND3(a,b,c,d,k,s) a = lshift((a + H(b,c,d) + M[k] + 0x6ED9EBA1)&MASK32,s) /* this applies md4 to 64 byte chunks */ static void mdfour64(uint32 *M) { uint32 AA, BB, CC, DD; uint32 A,B,C,D; A = m->A; B = m->B; C = m->C; D = m->D; AA = A; BB = B; CC = C; DD = D; ROUND1(A,B,C,D, 0, 3); ROUND1(D,A,B,C, 1, 7); ROUND1(C,D,A,B, 2, 11); ROUND1(B,C,D,A, 3, 19); ROUND1(A,B,C,D, 4, 3); ROUND1(D,A,B,C, 5, 7); ROUND1(C,D,A,B, 6, 11); ROUND1(B,C,D,A, 7, 19); ROUND1(A,B,C,D, 8, 3); ROUND1(D,A,B,C, 9, 7); ROUND1(C,D,A,B, 10, 11); ROUND1(B,C,D,A, 11, 19); ROUND1(A,B,C,D, 12, 3); ROUND1(D,A,B,C, 13, 7); ROUND1(C,D,A,B, 14, 11); ROUND1(B,C,D,A, 15, 19); ROUND2(A,B,C,D, 0, 3); ROUND2(D,A,B,C, 4, 5); ROUND2(C,D,A,B, 8, 9); ROUND2(B,C,D,A, 12, 13); ROUND2(A,B,C,D, 1, 3); ROUND2(D,A,B,C, 5, 5); ROUND2(C,D,A,B, 9, 9); ROUND2(B,C,D,A, 13, 13); ROUND2(A,B,C,D, 2, 3); ROUND2(D,A,B,C, 6, 5); ROUND2(C,D,A,B, 10, 9); ROUND2(B,C,D,A, 14, 13); ROUND2(A,B,C,D, 3, 3); ROUND2(D,A,B,C, 7, 5); ROUND2(C,D,A,B, 11, 9); ROUND2(B,C,D,A, 15, 13); ROUND3(A,B,C,D, 0, 3); ROUND3(D,A,B,C, 8, 9); ROUND3(C,D,A,B, 4, 11); ROUND3(B,C,D,A, 12, 15); ROUND3(A,B,C,D, 2, 3); ROUND3(D,A,B,C, 10, 9); ROUND3(C,D,A,B, 6, 11); ROUND3(B,C,D,A, 14, 15); ROUND3(A,B,C,D, 1, 3); ROUND3(D,A,B,C, 9, 9); ROUND3(C,D,A,B, 5, 11); ROUND3(B,C,D,A, 13, 15); ROUND3(A,B,C,D, 3, 3); ROUND3(D,A,B,C, 11, 9); ROUND3(C,D,A,B, 7, 11); ROUND3(B,C,D,A, 15, 15); A += AA; B += BB; C += CC; D += DD; A &= MASK32; B &= MASK32; C &= MASK32; D &= MASK32; m->A = A; m->B = B; m->C = C; m->D = D; } static void copy64(uint32 *M, const unsigned char *in) { int i; for (i=0;i<16;i++) M[i] = (in[i*4+3]<<24) | (in[i*4+2]<<16) | (in[i*4+1]<<8) | (in[i*4+0]<<0); } static void copy4(unsigned char *out,uint32 x) { out[0] = x&0xFF; out[1] = (x>>8)&0xFF; out[2] = (x>>16)&0xFF; out[3] = (x>>24)&0xFF; } void mdfour_begin(struct mdfour *md) { md->A = 0x67452301; md->B = 0xefcdab89; md->C = 0x98badcfe; md->D = 0x10325476; md->totalN = 0; md->tail_len = 0; } static void mdfour_tail(const unsigned char *in, int n) { unsigned char buf[128]; uint32 M[16]; uint32 b; m->totalN += n; b = m->totalN * 8; memset(buf, 0, 128); if (n) memcpy(buf, in, n); buf[n] = 0x80; if (n <= 55) { copy4(buf+56, b); copy64(M, buf); mdfour64(M); } else { copy4(buf+120, b); copy64(M, buf); mdfour64(M); copy64(M, buf+64); mdfour64(M); } } void mdfour_update(struct mdfour *md, const unsigned char *in, int n) { uint32 M[16]; m = md; if (in == NULL) { mdfour_tail(md->tail, md->tail_len); return; } if (md->tail_len) { int len = 64 - md->tail_len; if (len > n) len = n; memcpy(md->tail+md->tail_len, in, len); md->tail_len += len; n -= len; in += len; if (md->tail_len == 64) { copy64(M, md->tail); mdfour64(M); m->totalN += 64; md->tail_len = 0; } } while (n >= 64) { copy64(M, in); mdfour64(M); in += 64; n -= 64; m->totalN += 64; } if (n) { memcpy(md->tail, in, n); md->tail_len = n; } } void mdfour_result(struct mdfour *md, unsigned char *out) { m = md; copy4(out, m->A); copy4(out+4, m->B); copy4(out+8, m->C); copy4(out+12, m->D); } void mdfour(unsigned char *out, const unsigned char *in, int n) { struct mdfour md; mdfour_begin(&md); mdfour_update(&md, in, n); mdfour_update(&md, NULL, 0); mdfour_result(&md, out); } #ifdef TEST_MDFOUR static void file_checksum1(char *fname) { int fd, i; struct mdfour md; unsigned char buf[1024], sum[16]; unsigned chunk; fd = open(fname,O_RDONLY|O_BINARY); if (fd == -1) { perror("fname"); exit(1); } chunk = 1 + random() % (sizeof(buf) - 1); mdfour_begin(&md); while (1) { int n = read(fd, buf, chunk); if (n >= 0) { mdfour_update(&md, buf, n); } if (n < chunk) break; } close(fd); mdfour_update(&md, NULL, 0); mdfour_result(&md, sum); for (i=0;i<16;i++) printf("%02x", sum[i]); printf("\n"); } #if 0 #include "../md4.h" static void file_checksum2(char *fname) { int fd, i; MDstruct md; unsigned char buf[64], sum[16]; fd = open(fname,O_RDONLY|O_BINARY); if (fd == -1) { perror("fname"); exit(1); } MDbegin(&md); while (1) { int n = read(fd, buf, sizeof(buf)); if (n <= 0) break; MDupdate(&md, buf, n*8); } if (!md.done) { MDupdate(&md, buf, 0); } close(fd); memcpy(sum, md.buffer, 16); for (i=0;i<16;i++) printf("%02x", sum[i]); printf("\n"); } #endif int main(int argc, char *argv[]) { file_checksum1(argv[1]); #if 0 file_checksum2(argv[1]); #endif return 0; } #endif swig-3.0.12/CCache/Makefile.in0000664000175000017500000000541113042756442015611 0ustar williamwilliamdatarootdir = @datarootdir@ srcdir=@srcdir@ VPATH=@srcdir@ prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ mandir=@mandir@ INSTALLCMD=@INSTALL@ PACKAGE_NAME=@PACKAGE_NAME@ # Soft link test can be skipped on systems that don't support soft linking NOSOFTLINKSTEST= CC=@CC@ CFLAGS=@CFLAGS@ -I. SWIG=swig SWIG_LIB=../$(srcdir)/../Lib EXEEXT=@EXEEXT@ # Use standard autoconf approach to transform executable name using --program-prefix and --program-suffix transform = @program_transform_name@ LIBS= @LIBS@ OBJS= ccache.o mdfour.o hash.o execute.o util.o args.o stats.o \ cleanup.o snprintf.o unify.o HEADERS = ccache.h mdfour.h all: $(PACKAGE_NAME)$(EXEEXT) # Regenerate Makefile if Makefile.in or config.status have changed. Makefile: $(srcdir)/Makefile.in ./config.status $(SHELL) ./config.status # Note that HTML documentation is actually generated and used from the main SWIG documentation Makefile docs: $(srcdir)/$(PACKAGE_NAME).1 $(srcdir)/web/ccache-man.html $(PACKAGE_NAME)$(EXEEXT): $(OBJS) $(HEADERS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) $(srcdir)/$(PACKAGE_NAME).1: $(srcdir)/ccache.yo -yodl2man -o $(srcdir)/$(PACKAGE_NAME).1 $(srcdir)/ccache.yo $(srcdir)/web/ccache-man.html: $(srcdir)/ccache.yo yodl2html -o $(srcdir)/web/ccache-man.html $(srcdir)/ccache.yo install: $(PACKAGE_NAME)$(EXEEXT) @echo "Installing $(PACKAGE_NAME)" @echo "Installing $(DESTDIR)${bindir}/`echo $(PACKAGE_NAME) | sed '$(transform)'`$(EXEEXT)" ${INSTALLCMD} -d $(DESTDIR)${bindir} ${INSTALLCMD} -m 755 $(PACKAGE_NAME)$(EXEEXT) $(DESTDIR)${bindir}/`echo $(PACKAGE_NAME) | sed '$(transform)'`$(EXEEXT) install-docs: $(srcdir)/$(PACKAGE_NAME).1 @echo "Installing $(DESTDIR)${mandir}/man1/`echo $(PACKAGE_NAME) | sed '$(transform)'`.1" ${INSTALLCMD} -d $(DESTDIR)${mandir}/man1 ${INSTALLCMD} -m 644 $(srcdir)/$(PACKAGE_NAME).1 $(DESTDIR)${mandir}/man1/`echo $(PACKAGE_NAME) | sed '$(transform)'`.1 uninstall: $(PACKAGE_NAME)$(EXEEXT) rm -f $(DESTDIR)${bindir}/`echo $(PACKAGE_NAME) | sed '$(transform)'`$(EXEEXT) uninstall-docs: $(srcdir)/$(PACKAGE_NAME).1 rm -f $(DESTDIR)${mandir}/man1/`echo $(PACKAGE_NAME) | sed '$(transform)'`.1 clean: /bin/rm -f $(OBJS) *~ $(PACKAGE_NAME)$(EXEEXT) test: test.sh SWIG_LIB='$(SWIG_LIB)' PATH=../..:$$PATH SWIG='$(SWIG)' CC='$(CC)' NOSOFTLINKSTEST='$(NOSOFTLINKSTEST)' $(srcdir)/test.sh check: test distclean: clean /bin/rm -f Makefile config.h config.sub config.log build-stamp config.status ccache_swig_config.h /bin/rm -rf autom4te.cache maintainer-clean: distclean /bin/rm -f $(srcdir)/$(PACKAGE_NAME).1 $(srcdir)/web/ccache-man.html # FIXME: To fix this, test.sh needs to be able to take ccache from the # installed prefix, not from the source dir. installcheck: @echo "WARNING! This is not really \"installcheck\" yet." $(MAKE) check swig-3.0.12/CCache/cleanup.c0000664000175000017500000001205113042756442015335 0ustar williamwilliam/* Copyright (C) Andrew Tridgell 2002 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* functions to cleanup the cache directory when it gets too large */ #include "ccache.h" static struct files { char *fname; time_t mtime; size_t size; } **files; static unsigned allocated; static unsigned num_files; static size_t total_size; static size_t total_files; static size_t size_threshold; static size_t files_threshold; /* file comparison function to try to delete the oldest files first */ static int files_compare(struct files **f1, struct files **f2) { if ((*f2)->mtime == (*f1)->mtime) { return strcmp((*f2)->fname, (*f1)->fname); } if ((*f2)->mtime > (*f1)->mtime) { return -1; } return 1; } /* this builds the list of files in the cache */ static void traverse_fn(const char *fname, struct stat *st) { char *p; if (!S_ISREG(st->st_mode)) return; p = str_basename(fname); if (strcmp(p, "stats") == 0) { free(p); return; } free(p); if (num_files == allocated) { allocated = 10000 + num_files*2; files = (struct files **)x_realloc(files, sizeof(struct files *)*allocated); } files[num_files] = (struct files *)x_malloc(sizeof(struct files)); files[num_files]->fname = x_strdup(fname); files[num_files]->mtime = st->st_mtime; files[num_files]->size = file_size(st) / 1024; total_size += files[num_files]->size; num_files++; } /* sort the files we've found and delete the oldest ones until we are below the thresholds */ static void sort_and_clean(size_t minfiles) { unsigned i; size_t adjusted_minfiles = minfiles; if (num_files > 1) { /* sort in ascending data order */ qsort(files, num_files, sizeof(struct files *), (COMPAR_FN_T)files_compare); } /* ensure newly cached files (minfiles) are kept - instead of matching the filenames of those newly cached, a faster and simpler approach assumes these are the most recent in the cache and if any other cached files have an identical time stamp, they will also be kept - this approach would not be needed if the cleanup was done at exit. */ if (minfiles != 0 && minfiles < num_files) { unsigned minfiles_index = num_files - minfiles; time_t minfiles_time = files[minfiles_index]->mtime; for (i=1; i<=minfiles_index; i++) { if (files[minfiles_index-i]->mtime == minfiles_time) adjusted_minfiles++; else break; } } /* delete enough files to bring us below the threshold */ for (i=0;ifname) != 0 && errno != ENOENT) { fprintf(stderr, "unlink %s - %s\n", files[i]->fname, strerror(errno)); continue; } total_size -= files[i]->size; } total_files = num_files - i; } /* cleanup in one cache subdir */ void cleanup_dir(const char *dir, size_t maxfiles, size_t maxsize, size_t minfiles) { unsigned i; size_threshold = maxsize * LIMIT_MULTIPLE; files_threshold = maxfiles * LIMIT_MULTIPLE; num_files = 0; total_size = 0; /* build a list of files */ traverse(dir, traverse_fn); /* clean the cache */ sort_and_clean(minfiles); stats_set_sizes(dir, total_files, total_size); /* free it up */ for (i=0;ifname); free(files[i]); files[i] = NULL; } if (files) free(files); allocated = 0; files = NULL; num_files = 0; total_size = 0; } /* cleanup in all cache subdirs */ void cleanup_all(const char *dir) { unsigned counters[STATS_END]; char *dname, *sfile; int i; for (i=0;i<=0xF;i++) { x_asprintf(&dname, "%s/%1x", dir, i); x_asprintf(&sfile, "%s/%1x/stats", dir, i); memset(counters, 0, sizeof(counters)); stats_read(sfile, counters); cleanup_dir(dname, counters[STATS_MAXFILES], counters[STATS_MAXSIZE], 0); free(dname); free(sfile); } } /* traverse function for wiping files */ static void wipe_fn(const char *fname, struct stat *st) { char *p; if (!S_ISREG(st->st_mode)) return; p = str_basename(fname); if (strcmp(p, "stats") == 0) { free(p); return; } free(p); unlink(fname); } /* wipe all cached files in all subdirs */ void wipe_all(const char *dir) { char *dname; int i; for (i=0;i<=0xF;i++) { x_asprintf(&dname, "%s/%1x", dir, i); traverse(dir, wipe_fn); free(dname); } /* and fix the counters */ cleanup_all(dir); } swig-3.0.12/CCache/stats.c0000664000175000017500000002152113042756442015046 0ustar williamwilliam/* Copyright (C) Andrew Tridgell 2002 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* routines to handle the stats files the stats file is stored one per cache subdirectory to make this more scalable */ #include "ccache.h" extern char *stats_file; extern char *cache_dir; #define STATS_VERSION 1 #define FLAG_NOZERO 1 /* don't zero with the -z option */ #define FLAG_ALWAYS 2 /* always show, even if zero */ static struct { enum stats stat; char *message; void (*fn)(unsigned ); unsigned flags; } stats_info[] = { { STATS_CACHED, "cache hit ", NULL, FLAG_ALWAYS }, { STATS_TOCACHE, "cache miss ", NULL, FLAG_ALWAYS }, { STATS_LINK, "called for link ", NULL, 0 }, { STATS_MULTIPLE, "multiple source files ", NULL, 0 }, { STATS_STDOUT, "compiler produced stdout ", NULL, 0 }, { STATS_STATUS, "compile failed ", NULL, 0 }, { STATS_ERROR, "ccache internal error ", NULL, 0 }, { STATS_PREPROCESSOR, "preprocessor error ", NULL, 0 }, { STATS_COMPILER, "couldn't find the compiler ", NULL, 0 }, { STATS_MISSING, "cache file missing ", NULL, 0 }, { STATS_ARGS, "bad compiler arguments ", NULL, 0 }, { STATS_NOTC, "not a C/C++ file ", NULL, 0 }, { STATS_CONFTEST, "autoconf compile/link ", NULL, 0 }, { STATS_UNSUPPORTED, "unsupported compiler option ", NULL, 0 }, { STATS_OUTSTDOUT, "output to stdout ", NULL, 0 }, { STATS_DEVICE, "output to a non-regular file ", NULL, 0 }, { STATS_NOINPUT, "no input file ", NULL, 0 }, { STATS_ENVIRONMMENT, "error due to bad env variable ", NULL, 0 }, { STATS_NUMFILES, "files in cache ", NULL, FLAG_NOZERO|FLAG_ALWAYS }, { STATS_TOTALSIZE, "cache size ", display_size , FLAG_NOZERO|FLAG_ALWAYS }, { STATS_MAXFILES, "max files ", NULL, FLAG_NOZERO }, { STATS_MAXSIZE, "max cache size ", display_size, FLAG_NOZERO }, { STATS_NONE, NULL, NULL, 0 } }; /* parse a stats file from a buffer - adding to the counters */ static void parse_stats(unsigned counters[STATS_END], char *buf) { int i; char *p, *p2; p = buf; for (i=0;i= (int)sizeof(buf)-1) fatal("stats too long?!"); } len += snprintf(buf+len, sizeof(buf)-(len+1), "\n"); if (len >= (int)sizeof(buf)-1) fatal("stats too long?!"); lseek(fd, 0, SEEK_SET); if (write(fd, buf, len) == -1) fatal("could not write stats"); } /* fill in some default stats values */ static void stats_default(unsigned counters[STATS_END]) { counters[STATS_MAXSIZE] += DEFAULT_MAXSIZE / 16; } /* read in the stats from one dir and add to the counters */ static void stats_read_fd(int fd, unsigned counters[STATS_END]) { char buf[1024]; int len; len = read(fd, buf, sizeof(buf)-1); if (len <= 0) { stats_default(counters); return; } buf[len] = 0; parse_stats(counters, buf); } /* update the stats counter for this compile */ static void stats_update_size(enum stats stat, size_t size, size_t numfiles) { int fd; unsigned counters[STATS_END]; int need_cleanup = 0; if (getenv("CCACHE_NOSTATS")) return; if (!stats_file) { if (!cache_dir) return; x_asprintf(&stats_file, "%s/stats", cache_dir); } /* open safely to try to prevent symlink races */ fd = safe_open(stats_file); /* still can't get it? don't bother ... */ if (fd == -1) return; memset(counters, 0, sizeof(counters)); if (lock_fd(fd) != 0) { close(fd); return; } /* read in the old stats */ stats_read_fd(fd, counters); /* update them */ counters[stat]++; /* on a cache miss we up the file count and size */ if (stat == STATS_TOCACHE) { counters[STATS_NUMFILES] += numfiles; counters[STATS_TOTALSIZE] += size; } /* and write them out */ write_stats(fd, counters); close(fd); /* we might need to cleanup if the cache has now got too big */ if (counters[STATS_MAXFILES] != 0 && counters[STATS_NUMFILES] > counters[STATS_MAXFILES]) { need_cleanup = 1; } if (counters[STATS_MAXSIZE] != 0 && counters[STATS_TOTALSIZE] > counters[STATS_MAXSIZE]) { need_cleanup = 1; } if (need_cleanup) { char *p = dirname(stats_file); cleanup_dir(p, counters[STATS_MAXFILES], counters[STATS_MAXSIZE], numfiles); free(p); } } /* record a cache miss */ void stats_tocache(size_t size, size_t numfiles) { /* convert size to kilobytes */ size = size / 1024; stats_update_size(STATS_TOCACHE, size, numfiles); } /* update a normal stat */ void stats_update(enum stats stat) { stats_update_size(stat, 0, 0); } /* read in the stats from one dir and add to the counters */ void stats_read(const char *stats_file, unsigned counters[STATS_END]) { int fd; fd = open(stats_file, O_RDONLY|O_BINARY); if (fd == -1) { stats_default(counters); return; } lock_fd(fd); stats_read_fd(fd, counters); close(fd); } /* sum and display the total stats for all cache dirs */ void stats_summary(void) { int dir, i; unsigned counters[STATS_END]; memset(counters, 0, sizeof(counters)); /* add up the stats in each directory */ for (dir=-1;dir<=0xF;dir++) { char *fname; if (dir == -1) { x_asprintf(&fname, "%s/stats", cache_dir); } else { x_asprintf(&fname, "%s/%1x/stats", cache_dir, dir); } stats_read(fname, counters); free(fname); /* oh what a nasty hack ... */ if (dir == -1) { counters[STATS_MAXSIZE] = 0; } } printf("cache directory %s\n", cache_dir); /* and display them */ for (i=0;stats_info[i].message;i++) { enum stats stat = stats_info[i].stat; if (counters[stat] == 0 && !(stats_info[i].flags & FLAG_ALWAYS)) { continue; } printf("%s ", stats_info[i].message); if (stats_info[i].fn) { stats_info[i].fn(counters[stat]); printf("\n"); } else { printf("%8u\n", counters[stat]); } } } /* zero all the stats structures */ void stats_zero(void) { int dir, fd; unsigned i; char *fname; unsigned counters[STATS_END]; x_asprintf(&fname, "%s/stats", cache_dir); unlink(fname); free(fname); for (dir=0;dir<=0xF;dir++) { x_asprintf(&fname, "%s/%1x/stats", cache_dir, dir); fd = safe_open(fname); if (fd == -1) { free(fname); continue; } memset(counters, 0, sizeof(counters)); lock_fd(fd); stats_read_fd(fd, counters); for (i=0;stats_info[i].message;i++) { if (!(stats_info[i].flags & FLAG_NOZERO)) { counters[stats_info[i].stat] = 0; } } write_stats(fd, counters); close(fd); free(fname); } } /* set the per directory limits */ int stats_set_limits(long maxfiles, long maxsize) { int dir; unsigned counters[STATS_END]; if (maxfiles != -1) { maxfiles /= 16; } if (maxsize != -1) { maxsize /= 16; } if (create_dir(cache_dir) != 0) { return 1; } /* set the limits in each directory */ for (dir=0;dir<=0xF;dir++) { char *fname, *cdir; int fd; x_asprintf(&cdir, "%s/%1x", cache_dir, dir); if (create_dir(cdir) != 0) { return 1; } x_asprintf(&fname, "%s/stats", cdir); free(cdir); memset(counters, 0, sizeof(counters)); fd = safe_open(fname); if (fd != -1) { lock_fd(fd); stats_read_fd(fd, counters); if (maxfiles != -1) { counters[STATS_MAXFILES] = maxfiles; } if (maxsize != -1) { counters[STATS_MAXSIZE] = maxsize; } write_stats(fd, counters); close(fd); } free(fname); } return 0; } /* set the per directory sizes */ void stats_set_sizes(const char *dir, size_t num_files, size_t total_size) { int fd; unsigned counters[STATS_END]; char *stats_file; create_dir(dir); x_asprintf(&stats_file, "%s/stats", dir); memset(counters, 0, sizeof(counters)); fd = safe_open(stats_file); if (fd != -1) { lock_fd(fd); stats_read_fd(fd, counters); counters[STATS_NUMFILES] = num_files; counters[STATS_TOTALSIZE] = total_size; write_stats(fd, counters); close(fd); } free(stats_file); } swig-3.0.12/CCache/packaging/0000775000175000017500000000000013042756442015467 5ustar williamwilliamswig-3.0.12/CCache/packaging/ccache.spec0000664000175000017500000000133513042756442017553 0ustar williamwilliamSummary: Compiler Cache Name: ccache Version: 2.3 Release: 1 Group: Development/Languages License: GPL URL: http://ccache.samba.org/ Source: ccache-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-root %description ccache caches gcc output files %prep %setup -q %build %configure make install -d -m 0755 $RPM_BUILD_ROOT%{_bindir} install -m 0755 ccache $RPM_BUILD_ROOT%{_bindir} install -d -m 0755 $RPM_BUILD_ROOT%{_mandir}/man1 install -m 0644 ccache.1 $RPM_BUILD_ROOT%{_mandir}/man1 %files %defattr(-,root,root) %doc README %{_mandir}/man1/ccache.1* %{_bindir}/ccache %clean [ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT %changelog * Mon Apr 01 2002 Peter Jones - Created the package swig-3.0.12/CCache/packaging/README0000664000175000017500000000037313042756442016352 0ustar williamwilliamThese packaging files are contributd by users of ccache. I do not maintain them, and they may well need updating before you use them. I don't distribute binary packages of ccache myself, but if you wish to add ccache to a distribution then that's OK swig-3.0.12/CCache/test.sh0000775000175000017500000002636213042756442015072 0ustar williamwilliam#!/bin/sh # a simple test suite for ccache # tridge@samba.org if test -n "$CC"; then COMPILER="$CC" else COMPILER=cc fi if test -n "$SWIG"; then SWIG="$SWIG" else SWIG=swig fi # fix: Remove ccache from $PATH if it exists # as it will influence the unit tests PATH="`echo $PATH | \ sed -e 's!:/usr\(/local\)*/lib\([0-9]\)*/ccache\(/\)*!!g'`" CCACHE=../ccache-swig TESTDIR=test.$$ test_failed() { reason="$1" echo $1 $CCACHE -s cd .. rm -rf $TESTDIR echo TEST FAILED exit 1 } randcode() { outfile="$1" nlines=$2 i=0; ( while [ $i -lt $nlines ]; do echo "int foo$nlines$i(int x) { return x; }" i=`expr $i + 1` done ) >> "$outfile" } genswigcode() { outfile="$1" nlines=$2 i=0; ( echo "%module swigtest$2;" while [ $i -lt $nlines ]; do echo "int foo$nlines$i(int x);" echo "struct Bar$nlines$i { int y; };" i=`expr $i + 1` done ) >> "$outfile" } getstat() { stat="$1" value=`$CCACHE -s | grep "$stat" | cut -c34-40` echo $value } checkstat() { stat="$1" expected_value="$2" value=`getstat "$stat"` # echo "exp: $expected_value got: $value $testname" if [ "$expected_value" != "$value" ]; then test_failed "SUITE: $testsuite TEST: $testname - Expected $stat to be $expected_value got $value" fi } basetests() { echo "starting testsuite $testsuite" rm -rf "$CCACHE_DIR" checkstat 'cache hit' 0 checkstat 'cache miss' 0 j=1 rm -f *.c while [ $j -lt 32 ]; do randcode test$j.c $j j=`expr $j + 1` done testname="BASIC" $CCACHE_COMPILE -c test1.c checkstat 'cache hit' 0 checkstat 'cache miss' 1 testname="BASIC2" $CCACHE_COMPILE -c test1.c checkstat 'cache hit' 1 checkstat 'cache miss' 1 testname="debug" $CCACHE_COMPILE -c test1.c -g checkstat 'cache hit' 1 checkstat 'cache miss' 2 testname="debug2" $CCACHE_COMPILE -c test1.c -g checkstat 'cache hit' 2 checkstat 'cache miss' 2 testname="output" $CCACHE_COMPILE -c test1.c -o foo.o checkstat 'cache hit' 3 checkstat 'cache miss' 2 testname="link" $CCACHE_COMPILE test1.c -o test 2> /dev/null checkstat 'called for link' 1 testname="multiple" $CCACHE_COMPILE -c test1.c test2.c checkstat 'multiple source files' 1 testname="find" $CCACHE blahblah -c test1.c 2> /dev/null checkstat "couldn't find the compiler" 1 testname="bad" $CCACHE_COMPILE -c test1.c -I 2> /dev/null checkstat 'bad compiler arguments' 1 testname="c/c++" ln -f test1.c test1.ccc $CCACHE_COMPILE -c test1.ccc 2> /dev/null checkstat 'not a C/C++ file' 1 testname="unsupported" $CCACHE_COMPILE -M foo -c test1.c > /dev/null 2>&1 checkstat 'unsupported compiler option' 1 testname="stdout" $CCACHE echo foo -c test1.c > /dev/null checkstat 'compiler produced stdout' 1 testname="non-regular" mkdir testd $CCACHE_COMPILE -o testd -c test1.c > /dev/null 2>&1 rm -rf testd checkstat 'output to a non-regular file' 1 testname="no-input" $CCACHE_COMPILE -c -O2 2> /dev/null checkstat 'no input file' 1 testname="CCACHE_DISABLE" CCACHE_DISABLE=1 $CCACHE_COMPILE -c test1.c 2> /dev/null checkstat 'cache hit' 3 $CCACHE_COMPILE -c test1.c checkstat 'cache hit' 4 testname="CCACHE_CPP2" CCACHE_CPP2=1 $CCACHE_COMPILE -c test1.c -O -O checkstat 'cache hit' 4 checkstat 'cache miss' 3 CCACHE_CPP2=1 $CCACHE_COMPILE -c test1.c -O -O checkstat 'cache hit' 5 checkstat 'cache miss' 3 testname="CCACHE_NOSTATS" CCACHE_NOSTATS=1 $CCACHE_COMPILE -c test1.c -O -O checkstat 'cache hit' 5 checkstat 'cache miss' 3 testname="CCACHE_RECACHE" CCACHE_RECACHE=1 $CCACHE_COMPILE -c test1.c -O -O checkstat 'cache hit' 5 checkstat 'cache miss' 4 # strictly speaking should be 6 - RECACHE causes a double counting! checkstat 'files in cache' 8 $CCACHE -c > /dev/null checkstat 'files in cache' 6 testname="CCACHE_HASHDIR" CCACHE_HASHDIR=1 $CCACHE_COMPILE -c test1.c -O -O checkstat 'cache hit' 5 checkstat 'cache miss' 5 CCACHE_HASHDIR=1 $CCACHE_COMPILE -c test1.c -O -O checkstat 'cache hit' 6 checkstat 'cache miss' 5 checkstat 'files in cache' 8 testname="comments" echo '/* a silly comment */' > test1-comment.c cat test1.c >> test1-comment.c $CCACHE_COMPILE -c test1-comment.c rm -f test1-comment* checkstat 'cache hit' 6 checkstat 'cache miss' 6 testname="CCACHE_UNIFY" CCACHE_UNIFY=1 $CCACHE_COMPILE -c test1.c checkstat 'cache hit' 6 checkstat 'cache miss' 7 mv test1.c test1-saved.c echo '/* another comment */' > test1.c cat test1-saved.c >> test1.c CCACHE_UNIFY=1 $CCACHE_COMPILE -c test1.c mv test1-saved.c test1.c checkstat 'cache hit' 7 checkstat 'cache miss' 7 testname="cache-size" for f in *.c; do $CCACHE_COMPILE -c $f done checkstat 'cache hit' 8 checkstat 'cache miss' 37 checkstat 'files in cache' 72 $CCACHE -F 48 -c > /dev/null if [ `getstat 'files in cache'` -gt 48 ]; then test_failed '-F test failed' fi testname="cpp call" $CCACHE_COMPILE -c test1.c -E > test1.i checkstat 'cache hit' 8 checkstat 'cache miss' 37 testname="direct .i compile" $CCACHE_COMPILE -c test1.c checkstat 'cache hit' 8 checkstat 'cache miss' 38 $CCACHE_COMPILE -c test1.i checkstat 'cache hit' 9 checkstat 'cache miss' 38 $CCACHE_COMPILE -c test1.i checkstat 'cache hit' 10 checkstat 'cache miss' 38 # removed these tests as some compilers (including newer versions of gcc) # determine which language to use based on .ii/.i extension, and C++ may # not be installed # testname="direct .ii file" # mv test1.i test1.ii # $CCACHE_COMPILE -c test1.ii # checkstat 'cache hit' 10 # checkstat 'cache miss' 39 # $CCACHE_COMPILE -c test1.ii # checkstat 'cache hit' 11 # checkstat 'cache miss' 39 testname="stripc" # This test might not be portable CCACHE_STRIPC=1 $CCACHE_COMPILE -c test1.c checkstat 'cache hit' 10 checkstat 'cache miss' 39 CCACHE_STRIPC=1 $CCACHE_COMPILE -c test1.c checkstat 'cache hit' 11 checkstat 'cache miss' 39 testname="zero-stats" $CCACHE -z > /dev/null checkstat 'cache hit' 0 checkstat 'cache miss' 0 testname="clear" $CCACHE -C > /dev/null checkstat 'files in cache' 0 rm -f test1.c } swigtests() { echo "starting swig testsuite $testsuite" rm -rf "$CCACHE_DIR" checkstat 'cache hit' 0 checkstat 'cache miss' 0 j=1 rm -f *.i genswigcode testswig1.i 1 testname="BASIC" $CCACHE_COMPILE -java testswig1.i checkstat 'cache hit' 0 checkstat 'cache miss' 1 checkstat 'files in cache' 6 testname="BASIC2" $CCACHE_COMPILE -java testswig1.i checkstat 'cache hit' 1 checkstat 'cache miss' 1 testname="output" $CCACHE_COMPILE -java testswig1.i -o foo_wrap.c checkstat 'cache hit' 1 checkstat 'cache miss' 2 testname="bad" $CCACHE_COMPILE -java testswig1.i -I 2> /dev/null checkstat 'bad compiler arguments' 1 testname="stdout" $CCACHE_COMPILE -v -java testswig1.i > /dev/null checkstat 'compiler produced stdout' 1 testname="non-regular" mkdir testd $CCACHE_COMPILE -o testd -java testswig1.i > /dev/null 2>&1 rm -rf testd checkstat 'output to a non-regular file' 1 testname="no-input" $CCACHE_COMPILE -java 2> /dev/null checkstat 'no input file' 1 testname="CCACHE_DISABLE" CCACHE_DISABLE=1 $CCACHE_COMPILE -java testswig1.i 2> /dev/null checkstat 'cache hit' 1 $CCACHE_COMPILE -java testswig1.i checkstat 'cache hit' 2 testname="CCACHE_CPP2" CCACHE_CPP2=1 $CCACHE_COMPILE -java -O -O testswig1.i checkstat 'cache hit' 2 checkstat 'cache miss' 3 CCACHE_CPP2=1 $CCACHE_COMPILE -java -O -O testswig1.i checkstat 'cache hit' 3 checkstat 'cache miss' 3 testname="CCACHE_NOSTATS" CCACHE_NOSTATS=1 $CCACHE_COMPILE -java -O -O testswig1.i checkstat 'cache hit' 3 checkstat 'cache miss' 3 testname="CCACHE_RECACHE" CCACHE_RECACHE=1 $CCACHE_COMPILE -java -O -O testswig1.i checkstat 'cache hit' 3 checkstat 'cache miss' 4 # strictly speaking should be 3x6=18 instead of 4x6=24 - RECACHE causes a double counting! checkstat 'files in cache' 24 $CCACHE -c > /dev/null checkstat 'files in cache' 18 testname="CCACHE_HASHDIR" CCACHE_HASHDIR=1 $CCACHE_COMPILE -java -O -O testswig1.i checkstat 'cache hit' 3 checkstat 'cache miss' 5 CCACHE_HASHDIR=1 $CCACHE_COMPILE -java -O -O testswig1.i checkstat 'cache hit' 4 checkstat 'cache miss' 5 checkstat 'files in cache' 24 testname="cpp call" $CCACHE_COMPILE -java -E testswig1.i > testswig1-preproc.i checkstat 'cache hit' 4 checkstat 'cache miss' 5 testname="direct .i compile" $CCACHE_COMPILE -java testswig1.i checkstat 'cache hit' 5 checkstat 'cache miss' 5 # No cache hit due to different input file name, -nopreprocess should not be given twice to SWIG $CCACHE_COMPILE -java -nopreprocess testswig1-preproc.i checkstat 'cache hit' 5 checkstat 'cache miss' 6 $CCACHE_COMPILE -java -nopreprocess testswig1-preproc.i checkstat 'cache hit' 6 checkstat 'cache miss' 6 testname="stripc" CCACHE_STRIPC=1 $CCACHE_COMPILE -java -O -O testswig1.i checkstat 'cache hit' 7 checkstat 'cache miss' 6 CCACHE_STRIPC=1 $CCACHE_COMPILE -java -O -O -O testswig1.i checkstat 'cache hit' 7 checkstat 'cache miss' 7 rm -f testswig1-preproc.i rm -f testswig1.i } ###### # main program rm -rf $TESTDIR mkdir $TESTDIR cd $TESTDIR || exit 1 unset CCACHE_DIR unset CCACHE_TEMPDIR unset CCACHE_LOGFILE unset CCACHE_VERBOSE unset CCACHE_PATH unset CCACHE_CC unset CCACHE_PREFIX unset CCACHE_DISABLE unset CCACHE_READONLY unset CCACHE_CPP2 unset CCACHE_NOCOMPRESS unset CCACHE_NOSTATS unset CCACHE_NLEVELS unset CCACHE_HARDLINK unset CCACHE_RECACHE unset CCACHE_UMASK unset CCACHE_HASHDIR unset CCACHE_UNIFY unset CCACHE_EXTENSION unset CCACHE_STRIPC unset CCACHE_SWIG CCACHE_DIR="ccache dir" # with space in directory name (like Windows default) mkdir "$CCACHE_DIR" export CCACHE_DIR testsuite="base" CCACHE_COMPILE="$CCACHE $COMPILER" basetests CCACHE_COMPILE="$CCACHE $SWIG" swigtests if test -z "$NOSOFTLINKSTEST"; then testsuite="link" ln -s $CCACHE $COMPILER CCACHE_COMPILE="./$COMPILER" basetests rm "./$COMPILER" ln -s $CCACHE $SWIG CCACHE_COMPILE="./$SWIG" swigtests rm "./$SWIG" else echo "skipping testsuite link" fi testsuite="hardlink" CCACHE_COMPILE="env CCACHE_NOCOMPRESS=1 CCACHE_HARDLINK=1 $CCACHE $COMPILER" basetests CCACHE_COMPILE="env CCACHE_NOCOMPRESS=1 CCACHE_HARDLINK=1 $CCACHE $SWIG" swigtests testsuite="cpp2" CCACHE_COMPILE="env CCACHE_CPP2=1 $CCACHE $COMPILER" basetests CCACHE_COMPILE="env CCACHE_CPP2=1 $CCACHE $SWIG" swigtests testsuite="nlevels4" CCACHE_COMPILE="env CCACHE_NLEVELS=4 $CCACHE $COMPILER" basetests testsuite="nlevels1" CCACHE_COMPILE="env CCACHE_NLEVELS=1 $CCACHE $COMPILER" basetests cd .. rm -rf $TESTDIR echo test done - OK exit 0 swig-3.0.12/CCache/configure.ac0000664000175000017500000000460413042756442016035 0ustar williamwilliamdnl Process this file with autoconf to produce a configure script. AC_INIT([ccache-swig], [0.0]) # Get version from SWIG in ccache_swig_config.h.in AC_PREREQ(2.52) AC_CONFIG_SRCDIR([ccache.h]) AC_MSG_NOTICE([Configuring ccache]) AC_CONFIG_HEADER(config.h) dnl Checks for programs. AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL AC_ARG_PROGRAM # for program_transform_name AC_DEFINE([_GNU_SOURCE], 1, [Define _GNU_SOURCE so that we get all necessary prototypes]) # If GCC, turn on warnings. if test "x$GCC" = "xyes" then CFLAGS="$CFLAGS -Wall -W" else CFLAGS="$CFLAGS -O" fi AC_HEADER_DIRENT AC_HEADER_TIME AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(ctype.h strings.h stdlib.h string.h pwd.h sys/time.h) AC_CHECK_FUNCS(realpath snprintf vsnprintf vasprintf asprintf mkstemp) AC_CHECK_FUNCS(gethostname getpwuid) AC_CHECK_FUNCS(utimes) AC_CACHE_CHECK([for compar_fn_t in stdlib.h],ccache_cv_COMPAR_FN_T, [ AC_TRY_COMPILE( [#include ], [ void test_fn(void) { qsort(NULL, 0, 0, (__compar_fn_t)NULL); } ], ccache_cv_COMPAR_FN_T=yes,ccache_cv_COMPAR_FN_T=no)]) if test x"$ccache_cv_COMPAR_FN_T" = x"yes"; then AC_DEFINE(HAVE_COMPAR_FN_T, 1, [ ]) fi dnl Note: This could be replaced by AC_FUNC_SNPRINTF() in the autoconf macro archive AC_CACHE_CHECK([for C99 vsnprintf],ccache_cv_HAVE_C99_VSNPRINTF,[ AC_TRY_RUN([ #include #include void foo(const char *format, ...) { va_list ap; int len; char buf[5]; va_start(ap, format); len = vsnprintf(0, 0, format, ap); va_end(ap); if (len != 5) exit(1); if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1); exit(0); } main() { foo("hello"); } ], ccache_cv_HAVE_C99_VSNPRINTF=yes,ccache_cv_HAVE_C99_VSNPRINTF=no,ccache_cv_HAVE_C99_VSNPRINTF=cross)]) if test x"$ccache_cv_HAVE_C99_VSNPRINTF" = x"yes"; then AC_DEFINE(HAVE_C99_VSNPRINTF, 1, [ ]) fi dnl Check for zlib. dnl Note: This could be replaced by CHECK_ZLIB() in the autoconf macro archive AC_ARG_ENABLE([zlib], AS_HELP_STRING([--enable-zlib], [enable zlib support for ccache compression]),, [enable_zlib=yes]) if test x"$enable_zlib" = x"yes"; then AC_CHECK_HEADER(zlib.h, AC_CHECK_LIB(z, gzdopen, [LIBS="-lz $LIBS" AC_DEFINE([ENABLE_ZLIB], 1, [Define to 1 if you would like to have zlib compression for ccache.]) ] )) fi AC_CONFIG_FILES([Makefile]) AC_OUTPUT swig-3.0.12/CCache/ccache.c0000664000175000017500000010376613042756442015132 0ustar williamwilliam/* a re-implementation of the compilercache scripts in C The idea is based on the shell-script compilercache by Erik Thiele Copyright (C) Andrew Tridgell 2002 Copyright (C) Martin Pool 2003 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ccache.h" /* verbose mode */ int ccache_verbose = 0; /* the base cache directory */ char *cache_dir = NULL; /* the directory for temporary files */ static char *temp_dir = NULL; /* the debug logfile name, if set */ char *cache_logfile = NULL; /* the argument list after processing */ static ARGS *stripped_args; /* the original argument list */ static ARGS *orig_args; /* the output filename being compiled to */ static char *output_file; /* the source file */ static char *input_file; /* the name of the file containing the cached object code */ static char *hashname; /* the extension of the file after pre-processing */ static const char *i_extension; /* the name of the temporary pre-processor file */ static char *i_tmpfile; /* are we compiling a .i or .ii file directly? */ static int direct_i_file; /* the name of the cpp stderr file */ static char *cpp_stderr; /* the name of the statistics file */ char *stats_file = NULL; /* can we safely use the unification hashing backend? */ static int enable_unify; /* should we strip -c when running the preprocessor only? */ static int strip_c_option; /* customisation for using the SWIG compiler */ static int swig; /* a list of supported file extensions, and the equivalent extension for code that has been through the pre-processor */ static struct { char *extension; char *i_extension; } extensions[] = { {"c", "i"}, {"C", "ii"}, {"m", "mi"}, {"cc", "ii"}, {"CC", "ii"}, {"cpp", "ii"}, {"CPP", "ii"}, {"cxx", "ii"}, {"CXX", "ii"}, {"c++", "ii"}, {"C++", "ii"}, {"i", "i"}, {"ii", "ii"}, {NULL, NULL}}; /* something went badly wrong - just execute the real compiler */ static void failed(void) { char *e; /* delete intermediate pre-processor file if needed */ if (i_tmpfile) { if (!direct_i_file) { unlink(i_tmpfile); } free(i_tmpfile); i_tmpfile = NULL; } /* delete the cpp stderr file if necessary */ if (cpp_stderr) { unlink(cpp_stderr); free(cpp_stderr); cpp_stderr = NULL; } /* strip any local args */ args_strip(orig_args, "--ccache-"); if ((e=getenv("CCACHE_PREFIX"))) { char *p = find_executable(e, MYNAME); if (!p) { cc_log("could not find executable (%s)\n", e); perror(e); exit(1); } args_add_prefix(orig_args, p); free(p); } if (ccache_verbose) { display_execute_args(orig_args->argv); } if (swig) { putenv("CCACHE_OUTFILES"); } #ifndef _WIN32 execv(orig_args->argv[0], orig_args->argv); cc_log("execv returned (%s)!\n", strerror(errno)); perror(orig_args->argv[0]); exit(1); #else /* execv on Windows causes the 'non-regular' testcase to fail, so use Win32 API instead */ { PROCESS_INFORMATION pinfo; STARTUPINFO sinfo; BOOL ret; DWORD exitcode; char *args; ZeroMemory(&pinfo, sizeof(PROCESS_INFORMATION)); ZeroMemory(&sinfo, sizeof(STARTUPINFO)); sinfo.cb = sizeof(STARTUPINFO); args = argvtos(orig_args->argv); ret = CreateProcessA(orig_args->argv[0], args, NULL, NULL, TRUE, 0, NULL, NULL, &sinfo, &pinfo); if (!ret) { exitcode = 1; cc_log("CreateProcessA failed starting %s\n", orig_args->argv[0]); perror_win32(orig_args->argv[0]); } else { WaitForSingleObject(pinfo.hProcess, INFINITE); GetExitCodeProcess(pinfo.hProcess, &exitcode); CloseHandle(pinfo.hProcess); CloseHandle(pinfo.hThread); } free(args); exit(exitcode); } #endif } /* return a string to be used to distinguish temporary files this also tries to cope with NFS by adding the local hostname */ static const char *tmp_string(void) { static char *ret; if (!ret) { char hostname[200]; strcpy(hostname, "unknown"); #if HAVE_GETHOSTNAME gethostname(hostname, sizeof(hostname)-1); #endif hostname[sizeof(hostname)-1] = 0; if (asprintf(&ret, "%s.%u", hostname, (unsigned)getpid()) == -1) { fatal("could not allocate tmp_string"); } } return ret; } /* update cached file sizes and count helper function for to_cache() */ static void to_cache_stats_helper(struct stat *pstat, char *cached_filename, char *tmp_outfiles, int *files_size, int *cached_files_count) { #if ENABLE_ZLIB /* do an extra stat on the cache file for the size statistics */ if (stat(cached_filename, pstat) != 0) { cc_log("failed to stat cache files - %s\n", strerror(errno)); stats_update(STATS_ERROR); if (tmp_outfiles) { unlink(tmp_outfiles); } failed(); } #else (void)cached_filename; (void)tmp_outfiles; #endif (*files_size) += file_size(pstat); (*cached_files_count)++; } /* run the real compiler and put the result in cache */ static void to_cache(ARGS *args) { char *path_stderr; char *tmp_stdout, *tmp_stderr, *tmp_outfiles; struct stat st1; int status; int cached_files_count = 0; int files_size = 0; x_asprintf(&tmp_stdout, "%s/tmp.stdout.%s", temp_dir, tmp_string()); x_asprintf(&tmp_stderr, "%s/tmp.stderr.%s", temp_dir, tmp_string()); x_asprintf(&tmp_outfiles, "%s/tmp.outfiles.%s", temp_dir, tmp_string()); if (strip_c_option && !swig) { args_add(stripped_args, "-c"); } if (output_file) { args_add(args, "-o"); args_add(args, output_file); } /* Turn off DEPENDENCIES_OUTPUT when running cc1, because * otherwise it will emit a line like * * tmp.stdout.vexed.732.o: /home/mbp/.ccache/tmp.stdout.vexed.732.i * * unsetenv() is on BSD and Linux but not portable. */ putenv("DEPENDENCIES_OUTPUT"); /* Give SWIG a filename for it to create and populate with a list of files that it generates */ if (swig) { char *ccache_outfiles; x_asprintf(&ccache_outfiles, "CCACHE_OUTFILES=%s", tmp_outfiles); unlink(tmp_outfiles); if (getenv("CCACHE_OUTFILES") || putenv(ccache_outfiles) == -1) { cc_log("CCACHE_OUTFILES env variable already set or could not be set\n"); stats_update(STATS_ERROR); failed(); } } if (getenv("CCACHE_CPP2")) { args_add(args, input_file); } else { if (swig) { args_add(args, "-nopreprocess"); } args_add(args, i_tmpfile); } status = execute(args->argv, tmp_stdout, tmp_stderr); args_pop(args, 3); if (stat(tmp_stdout, &st1) != 0 || st1.st_size != 0) { cc_log("compiler produced stdout for %s\n", input_file); stats_update(STATS_STDOUT); unlink(tmp_stdout); unlink(tmp_stderr); unlink(tmp_outfiles); if (!swig) unlink(output_file); failed(); } unlink(tmp_stdout); if (status != 0) { int fd; cc_log("compile of %s gave status = %d\n", input_file, status); stats_update(STATS_STATUS); fd = open(tmp_stderr, O_RDONLY | O_BINARY); if (fd != -1) { if (cpp_stderr) { /* we might have some stderr from cpp */ int fd2 = open(cpp_stderr, O_RDONLY | O_BINARY); if (fd2 != -1) { copy_fd(fd2, 2); close(fd2); unlink(cpp_stderr); cpp_stderr = NULL; } } /* we can use a quick method of getting the failed output */ copy_fd(fd, 2); close(fd); unlink(tmp_stderr); if (i_tmpfile && !direct_i_file) { unlink(i_tmpfile); } exit(status); } unlink(tmp_stderr); unlink(tmp_outfiles); if (!swig) unlink(output_file); failed(); } else { int hardlink = (getenv("CCACHE_NOCOMPRESS") != 0) && (getenv("CCACHE_HARDLINK") != 0); if (swig) { /* read the list of generated files and copy each of them into the cache */ FILE *file; file = fopen(tmp_outfiles, "r"); if (file) { char out_filename[FILENAME_MAX + 1]; char out_filename_cache[FILENAME_MAX + 1]; while (fgets(out_filename, FILENAME_MAX, file)) { char *linefeed = strchr(out_filename, '\n'); if (linefeed) { char *potential_cr = linefeed - 1; if (potential_cr >= out_filename && *potential_cr == '\r') *potential_cr = 0; *linefeed = 0; if (cached_files_count == 0) { strcpy(out_filename_cache, hashname); } else { sprintf(out_filename_cache, "%s.%d", hashname, cached_files_count); } if (commit_to_cache(out_filename, out_filename_cache, hardlink) != 0) { fclose(file); unlink(tmp_outfiles); failed(); } to_cache_stats_helper(&st1, out_filename_cache, tmp_outfiles, &files_size, &cached_files_count); } else { cached_files_count = 0; break; } } fclose(file); if (cached_files_count == 0) { cc_log("failed to copy output files to cache - internal error\n"); stats_update(STATS_ERROR); unlink(tmp_outfiles); failed(); } /* also copy the (uncompressed) file containing the list of generated files into the cache */ sprintf(out_filename_cache, "%s.outfiles", hashname); if (stat(tmp_outfiles, &st1) != 0 || safe_rename(tmp_outfiles, out_filename_cache) != 0) { cc_log("failed to copy outfiles file to cache - %s\n", strerror(errno)); stats_update(STATS_ERROR); unlink(tmp_outfiles); failed(); } to_cache_stats_helper(&st1, out_filename_cache, tmp_outfiles, &files_size, &cached_files_count); unlink(tmp_outfiles); } else { cc_log("failed to open temp outfiles file - %s\n", strerror(errno)); stats_update(STATS_ERROR); failed(); } } else { if (commit_to_cache(output_file, hashname, hardlink) != 0) { failed(); } to_cache_stats_helper(&st1, hashname, 0, &files_size, &cached_files_count); } } x_asprintf(&path_stderr, "%s.stderr", hashname); if (stat(tmp_stderr, &st1) != 0 || move_file(tmp_stderr, path_stderr) != 0) { cc_log("failed to rename tmp files - %s\n", strerror(errno)); stats_update(STATS_ERROR); failed(); } to_cache_stats_helper(&st1, path_stderr, 0, &files_size, &cached_files_count); cc_log("Placed %d files for %s into cache\n", cached_files_count, input_file); stats_tocache(files_size, cached_files_count); free(tmp_stderr); free(tmp_stdout); free(tmp_outfiles); free(path_stderr); } /* find the hash for a command. The hash includes all argument lists, plus the output from running the compiler with -E */ static void find_hash(ARGS *args) { int i; char *path_stdout, *path_stderr; char *hash_dir; char *s; struct stat st; int status; int nlevels = 2; char *input_base; char *tmp; if ((s = getenv("CCACHE_NLEVELS"))) { nlevels = atoi(s); if (nlevels < 1) nlevels = 1; if (nlevels > 8) nlevels = 8; } hash_start(); /* when we are doing the unifying tricks we need to include the input file name in the hash to get the warnings right */ if (enable_unify || swig) { hash_string(input_file); } if (swig) { if (output_file) { hash_string(output_file); } } else { /* we have to hash the extension, as a .i file isn't treated the same by the compiler as a .ii file */ hash_string(i_extension); } /* first the arguments */ for (i=1;iargc;i++) { /* some arguments don't contribute to the hash. The theory is that these arguments will change the output of -E if they are going to have any effect at all, or they only affect linking */ if (i < args->argc-1) { if (strcmp(args->argv[i], "-I") == 0 || strcmp(args->argv[i], "-include") == 0 || strcmp(args->argv[i], "-L") == 0 || strcmp(args->argv[i], "-D") == 0 || strcmp(args->argv[i], "-idirafter") == 0 || strcmp(args->argv[i], "-isystem") == 0) { i++; continue; } } if (strncmp(args->argv[i], "-I", 2) == 0 || strncmp(args->argv[i], "-L", 2) == 0 || strncmp(args->argv[i], "-D", 2) == 0 || strncmp(args->argv[i], "-idirafter", 10) == 0 || strncmp(args->argv[i], "-isystem", 8) == 0) { continue; } if (strncmp(args->argv[i], "--specs=", 8) == 0 && stat(args->argv[i]+8, &st) == 0) { /* if given a explicit specs file, then hash that file, but don't include the path to it in the hash */ hash_file(args->argv[i]+8); continue; } /* all other arguments are included in the hash */ hash_string(args->argv[i]); } /* the compiler driver size and date. This is a simple minded way to try and detect compiler upgrades. It is not 100% reliable */ if (stat(args->argv[0], &st) != 0) { cc_log("Couldn't stat the compiler!? (argv[0]='%s')\n", args->argv[0]); stats_update(STATS_COMPILER); failed(); } /* also include the hash of the compiler name - as some compilers use hard links and behave differently depending on the real name */ if (st.st_nlink > 1) { char *path = str_basename(args->argv[0]); hash_string(path); free(path); } hash_int(st.st_size); hash_int(st.st_mtime); /* possibly hash the current working directory */ if (getenv("CCACHE_HASHDIR")) { char *cwd = gnu_getcwd(); if (cwd) { hash_string(cwd); free(cwd); } } /* ~/hello.c -> tmp.hello.123.i limit the basename to 10 characters in order to cope with filesystem with small maximum filename length limits */ input_base = str_basename(input_file); tmp = strchr(input_base, '.'); if (tmp != NULL) { *tmp = 0; } if (strlen(input_base) > 10) { input_base[10] = 0; } /* now the run */ x_asprintf(&path_stdout, "%s/%s.tmp.%s.%s", temp_dir, input_base, tmp_string(), i_extension); x_asprintf(&path_stderr, "%s/tmp.cpp_stderr.%s", temp_dir, tmp_string()); free(input_base); if (!direct_i_file) { /* run cpp on the input file to obtain the .i */ args_add(args, "-E"); args_add(args, input_file); status = execute(args->argv, path_stdout, path_stderr); args_pop(args, 2); } else { /* we are compiling a .i or .ii file - that means we can skip the cpp stage and directly form the correct i_tmpfile */ path_stdout = x_strdup(input_file); if (create_empty_file(path_stderr) != 0) { cc_log("failed to create empty stderr file\n"); stats_update(STATS_ERROR); failed(); } status = 0; } if (status != 0) { if (!direct_i_file) { unlink(path_stdout); } unlink(path_stderr); cc_log("the preprocessor gave %d\n", status); stats_update(STATS_PREPROCESSOR); failed(); } /* if the compilation is with -g then we have to include the whole of the preprocessor output, which means we are sensitive to line number information. Otherwise we can discard line number info, which makes us less sensitive to reformatting changes Note! I have now disabled the unification code by default as it gives the wrong line numbers for warnings. Pity. */ if (!enable_unify) { hash_file(path_stdout); } else { if (unify_hash(path_stdout) != 0) { stats_update(STATS_ERROR); failed(); } } hash_file(path_stderr); i_tmpfile = path_stdout; if (!getenv("CCACHE_CPP2")) { /* if we are using the CPP trick then we need to remember this stderr data and output it just before the main stderr from the compiler pass */ cpp_stderr = path_stderr; } else { unlink(path_stderr); free(path_stderr); } /* we use a N level subdir for the cache path to reduce the impact on filesystems which are slow for large directories */ s = hash_result(); x_asprintf(&hash_dir, "%s/%c", cache_dir, s[0]); x_asprintf(&stats_file, "%s/stats", hash_dir); for (i=1; i= out_filename && *potential_cr == '\r') *potential_cr = 0; *linefeed = 0; if (retrieved_files_count == 0) { strcpy(out_filename_cache, hashname); } else { sprintf(out_filename_cache, "%s.%d", hashname, retrieved_files_count); } passfail = retrieve_from_cache(out_filename_cache, out_filename, hardlink); if (passfail == -1) { break; } retrieved_files_count++; } else { cc_log("failed to copy output files from cache - internal error\n"); stats_update(STATS_ERROR); passfail = -1; break; } } if (retrieved_files_count == 0) { cc_log("failed to copy output files from cache - internal error\n"); stats_update(STATS_ERROR); passfail = -1; } fclose(file); } else { cc_log("failed to open cached outfiles file - %s\n", strerror(errno)); stats_update(STATS_ERROR); } } else { passfail = retrieve_from_cache(hashname, output_file, hardlink); } if (passfail == -1) { close(fd_stderr); unlink(stderr_file); free(stderr_file); return; } free(stderr_file); } /* get rid of the intermediate preprocessor file */ if (i_tmpfile) { if (!direct_i_file) { unlink(i_tmpfile); } free(i_tmpfile); i_tmpfile = NULL; } /* send the cpp stderr, if applicable */ fd_cpp_stderr = open(cpp_stderr, O_RDONLY | O_BINARY); if (fd_cpp_stderr != -1) { copy_fd(fd_cpp_stderr, 2); close(fd_cpp_stderr); unlink(cpp_stderr); free(cpp_stderr); cpp_stderr = NULL; } /* send the stderr */ copy_fd(fd_stderr, 2); close(fd_stderr); /* and exit with the right status code */ if (first) { cc_log("got cached result for %s\n", input_file); stats_update(STATS_CACHED); } exit(0); } /* find the real compiler. We just search the PATH to find a executable of the same name that isn't a link to ourselves */ static void find_compiler(int argc, char **argv) { char *base; char *path; orig_args = args_init(argc, argv); base = str_basename(argv[0]); /* we might be being invoked like "ccache gcc -c foo.c" */ if (strcmp(base, MYNAME) == 0) { args_remove_first(orig_args); free(base); if (strchr(argv[1],'/') #ifdef _WIN32 || strchr(argv[1],'\\') #endif ) { /* a full path was given */ return; } base = str_basename(argv[1]); } /* support user override of the compiler */ if ((path=getenv("CCACHE_CC"))) { free(base); base = x_strdup(path); } orig_args->argv[0] = find_executable(base, MYNAME); /* can't find the compiler! */ if (!orig_args->argv[0]) { stats_update(STATS_COMPILER); cc_log("could not find compiler (%s)\n", base); perror(base); free(base); exit(1); } free(base); } /* check a filename for C/C++ extension. Return the pre-processor extension */ static const char *check_extension(const char *fname, int *direct_i) { int i; const char *p; if (direct_i) { *direct_i = 0; } if (swig) return "ii"; /* any file extension is acceptable as input for SWIG */ p = strrchr(fname, '.'); if (!p) return NULL; p++; for (i=0; extensions[i].extension; i++) { if (strcmp(p, extensions[i].extension) == 0) { if (direct_i && strcmp(p, extensions[i].i_extension) == 0) { *direct_i = 1; } p = getenv("CCACHE_EXTENSION"); if (p) return p; return extensions[i].i_extension; } } return NULL; } /* process the compiler options to form the correct set of options for obtaining the preprocessor output */ static void process_args(int argc, char **argv) { int i; int found_c_opt = 0; int found_S_opt = 0; struct stat st; char *e; /* is gcc being asked to output dependencies? */ int generating_dependencies = 0; /* is the dependency makefile name overridden with -MF? */ int dependency_filename_specified = 0; /* is the dependency makefile target name specified with -MQ or -MF? */ int dependency_target_specified = 0; stripped_args = args_init(0, NULL); args_add(stripped_args, argv[0]); /* -c not required for SWIG */ if (swig) { found_c_opt = 1; } for (i=1; iargv[0]); if (strstr(basename, "swig") || getenv("CCACHE_SWIG")) { swig = 1; } free(basename); } /* the main ccache driver function */ static void ccache(int argc, char *argv[]) { /* find the real compiler */ find_compiler(argc, argv); /* use the real compiler if HOME is not set */ if (!cache_dir) { cc_log("Unable to determine home directory\n"); cc_log("ccache is disabled\n"); failed(); } /* we might be disabled */ if (getenv("CCACHE_DISABLE")) { cc_log("ccache is disabled\n"); failed(); } if (getenv("CCACHE_STRIPC")) { strip_c_option = 1; } if (getenv("CCACHE_UNIFY")) { enable_unify = 1; } detect_swig(); /* process argument list, returning a new set of arguments for pre-processing */ process_args(orig_args->argc, orig_args->argv); /* run with -E to find the hash */ find_hash(stripped_args); /* if we can return from cache at this point then do */ from_cache(1); if (getenv("CCACHE_READONLY")) { cc_log("read-only set - doing real compile\n"); failed(); } /* run real compiler, sending output to cache */ to_cache(stripped_args); /* return from cache */ from_cache(0); /* oh oh! */ cc_log("secondary from_cache failed!\n"); stats_update(STATS_ERROR); failed(); } static void usage(void) { printf("%s, a compiler cache including support for SWIG. Version %s\n", MYNAME, CCACHE_VERSION); printf("Copyright Andrew Tridgell, 2002\n\n"); printf("Usage:\n"); printf("\t" MYNAME " [options]\n"); printf("\t" MYNAME " compiler [compile options]\n"); printf("\tcompiler [compile options] (via symbolic link)\n"); printf("\nOptions:\n"); printf("-s show statistics summary\n"); printf("-z zero statistics\n"); printf("-c run a cache cleanup\n"); printf("-C clear the cache completely\n"); printf("-F set maximum files in cache\n"); printf("-M set maximum size of cache (use G, M or K)\n"); printf("-h this help page\n"); printf("-V print version number\n"); } static void check_cache_dir(void) { if (!cache_dir) { fatal("Unable to determine home directory"); } } /* the main program when not doing a compile */ static int ccache_main(int argc, char *argv[]) { int c; size_t v; while ((c = getopt(argc, argv, "hszcCF:M:V")) != -1) { switch (c) { case 'V': printf("%s version %s\n", MYNAME, CCACHE_VERSION); printf("Copyright Andrew Tridgell 2002\n"); printf("Released under the GNU GPL v2 or later\n"); exit(0); case 'h': usage(); exit(0); case 's': check_cache_dir(); stats_summary(); break; case 'c': check_cache_dir(); cleanup_all(cache_dir); printf("Cleaned cache\n"); break; case 'C': check_cache_dir(); wipe_all(cache_dir); printf("Cleared cache\n"); break; case 'z': check_cache_dir(); stats_zero(); printf("Statistics cleared\n"); break; case 'F': check_cache_dir(); v = atoi(optarg); if (stats_set_limits(v, -1) == 0) { printf("Set cache file limit to %u\n", (unsigned)v); } else { printf("Could not set cache file limit.\n"); exit(1); } break; case 'M': check_cache_dir(); v = value_units(optarg); if (stats_set_limits(-1, v) == 0) { printf("Set cache size limit to %uk\n", (unsigned)v); } else { printf("Could not set cache size limit.\n"); exit(1); } break; default: usage(); exit(1); } } return 0; } /* Make a copy of stderr that will not be cached, so things like distcc can send networking errors to it. */ static void setup_uncached_err(void) { char *buf; int uncached_fd; uncached_fd = dup(2); if (uncached_fd == -1) { cc_log("dup(2) failed\n"); stats_update(STATS_ERROR); failed(); } /* leak a pointer to the environment */ x_asprintf(&buf, "UNCACHED_ERR_FD=%d", uncached_fd); if (putenv(buf) == -1) { cc_log("putenv failed\n"); close(uncached_fd); stats_update(STATS_ERROR); failed(); } } int main(int argc, char *argv[]) { char *p; cache_dir = getenv("CCACHE_DIR"); if (!cache_dir) { const char *home_directory = get_home_directory(); if (home_directory) { x_asprintf(&cache_dir, "%s/.ccache", home_directory); } } cache_logfile = getenv("CCACHE_LOGFILE"); if (getenv("CCACHE_VERBOSE")) { ccache_verbose = 1; } setup_uncached_err(); /* the user might have set CCACHE_UMASK */ p = getenv("CCACHE_UMASK"); if (p) { mode_t mask; errno = 0; mask = strtol(p, NULL, 8); if (errno == 0) { umask(mask); } } /* check if we are being invoked as "ccache" */ if (strlen(argv[0]) >= strlen(MYNAME) && strcmp(argv[0] + strlen(argv[0]) - strlen(MYNAME), MYNAME) == 0) { if (argc < 2) { usage(); exit(1); } /* if the first argument isn't an option, then assume we are being passed a compiler name and options */ if (argv[1][0] == '-') { return ccache_main(argc, argv); } } /* make sure the cache dir exists */ if (cache_dir && (create_dir(cache_dir) != 0)) { fprintf(stderr,"ccache: failed to create %s (%s)\n", cache_dir, strerror(errno)); exit(1); } temp_dir = getenv("CCACHE_TEMPDIR"); if (!temp_dir) { x_asprintf(&temp_dir, "%s/temp", cache_dir); /* make sure temp dir exists if not supplied by user */ if (temp_dir && create_dir(temp_dir) != 0) { fprintf(stderr,"ccache: failed to create %s (%s)\n", temp_dir, strerror(errno)); exit(1); } } if (!getenv("CCACHE_READONLY")) { if (create_cachedirtag(cache_dir) != 0) { fprintf(stderr,"ccache: failed to create %s/CACHEDIR.TAG (%s)\n", cache_dir, strerror(errno)); exit(1); } } ccache(argc, argv); return 1; } swig-3.0.12/CCache/util.c0000664000175000017500000004155313042756442014674 0ustar williamwilliam/* Copyright (C) Andrew Tridgell 2002 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ccache.h" static FILE *logfile; /* log a message to the CCACHE_LOGFILE location */ void cc_log(const char *format, ...) { va_list ap; extern char *cache_logfile; if (!cache_logfile) return; if (!logfile) logfile = fopen(cache_logfile, "a"); if (!logfile) return; va_start(ap, format); vfprintf(logfile, format, ap); va_end(ap); fflush(logfile); } /* something went badly wrong! */ void fatal(const char *msg) { cc_log("FATAL: %s\n", msg); exit(1); } int safe_rename(const char* oldpath, const char* newpath) { /* safe_rename is for creating entries in the cache. Works like rename(), but it never overwrites an existing cache entry. This avoids corruption on NFS. */ #ifndef _WIN32 int status = link(oldpath, newpath); if( status == 0 || errno == EEXIST ) #else int status = CreateHardLinkA(newpath, oldpath, NULL) ? 0 : -1; if( status == 0 || GetLastError() == ERROR_ALREADY_EXISTS ) #endif { return unlink( oldpath ); } else { return -1; } } #ifndef ENABLE_ZLIB /* copy all data from one file descriptor to another */ void copy_fd(int fd_in, int fd_out) { char buf[10240]; int n; while ((n = read(fd_in, buf, sizeof(buf))) > 0) { if (write(fd_out, buf, n) != n) { fatal("Failed to copy fd"); } } } #ifndef HAVE_MKSTEMP /* cheap and nasty mkstemp replacement */ int mkstemp(char *template) { mktemp(template); return open(template, O_RDWR | O_CREAT | O_EXCL | O_BINARY, 0600); } #endif /* move a file using rename */ int move_file(const char *src, const char *dest) { return safe_rename(src, dest); } /* copy a file - used when hard links don't work the copy is done via a temporary file and atomic rename */ static int copy_file(const char *src, const char *dest) { int fd1, fd2; char buf[10240]; int n; char *tmp_name; mode_t mask; x_asprintf(&tmp_name, "%s.XXXXXX", dest); fd1 = open(src, O_RDONLY|O_BINARY); if (fd1 == -1) { free(tmp_name); return -1; } fd2 = mkstemp(tmp_name); if (fd2 == -1) { close(fd1); free(tmp_name); return -1; } while ((n = read(fd1, buf, sizeof(buf))) > 0) { if (write(fd2, buf, n) != n) { close(fd2); close(fd1); unlink(tmp_name); free(tmp_name); return -1; } } close(fd1); /* get perms right on the tmp file */ #ifndef _WIN32 mask = umask(0); fchmod(fd2, 0666 & ~mask); umask(mask); #else (void)mask; #endif /* the close can fail on NFS if out of space */ if (close(fd2) == -1) { unlink(tmp_name); free(tmp_name); return -1; } unlink(dest); if (rename(tmp_name, dest) == -1) { unlink(tmp_name); free(tmp_name); return -1; } free(tmp_name); return 0; } /* copy a file to the cache */ static int copy_file_to_cache(const char *src, const char *dest) { return copy_file(src, dest); } /* copy a file from the cache */ static int copy_file_from_cache(const char *src, const char *dest) { return copy_file(src, dest); } #else /* ENABLE_ZLIB */ /* copy all data from one file descriptor to another possibly decompressing it */ void copy_fd(int fd_in, int fd_out) { char buf[10240]; int n; gzFile gz_in; gz_in = gzdopen(dup(fd_in), "rb"); if (!gz_in) { fatal("Failed to copy fd"); } while ((n = gzread(gz_in, buf, sizeof(buf))) > 0) { if (write(fd_out, buf, n) != n) { gzclose(gz_in); fatal("Failed to copy fd"); } } gzclose(gz_in); } static int _copy_file(const char *src, const char *dest, int mode) { int fd_in, fd_out; gzFile gz_in, gz_out = NULL; char buf[10240]; int n, ret; char *tmp_name; mode_t mask; struct stat st; x_asprintf(&tmp_name, "%s.XXXXXX", dest); if (getenv("CCACHE_NOCOMPRESS")) { mode = COPY_UNCOMPRESSED; } /* open source file */ fd_in = open(src, O_RDONLY); if (fd_in == -1) { return -1; } gz_in = gzdopen(fd_in, "rb"); if (!gz_in) { close(fd_in); return -1; } /* open destination file */ fd_out = mkstemp(tmp_name); if (fd_out == -1) { gzclose(gz_in); free(tmp_name); return -1; } if (mode == COPY_TO_CACHE) { /* The gzip file format occupies at least 20 bytes. So it will always occupy an entire filesystem block, even for empty files. Since most stderr files will be empty, we turn off compression in this case to save space. */ if (fstat(fd_in, &st) != 0) { gzclose(gz_in); close(fd_out); free(tmp_name); return -1; } if (file_size(&st) == 0) { mode = COPY_UNCOMPRESSED; } } if (mode == COPY_TO_CACHE) { int dup_fd_out = dup(fd_out); gz_out = gzdopen(dup_fd_out, "wb"); if (!gz_out) { gzclose(gz_in); close(dup_fd_out); close(fd_out); free(tmp_name); return -1; } } while ((n = gzread(gz_in, buf, sizeof(buf))) > 0) { if (mode == COPY_TO_CACHE) { ret = gzwrite(gz_out, buf, n); } else { ret = write(fd_out, buf, n); } if (ret != n) { gzclose(gz_in); if (gz_out) { gzclose(gz_out); } close(fd_out); unlink(tmp_name); free(tmp_name); return -1; } } gzclose(gz_in); if (gz_out) { gzclose(gz_out); } /* get perms right on the tmp file */ mask = umask(0); fchmod(fd_out, 0666 & ~mask); umask(mask); /* the close can fail on NFS if out of space */ if (close(fd_out) == -1) { unlink(tmp_name); free(tmp_name); return -1; } unlink(dest); if (rename(tmp_name, dest) == -1) { unlink(tmp_name); free(tmp_name); return -1; } free(tmp_name); return 0; } /* move a file to the cache, compressing it */ int move_file(const char *src, const char *dest) { int ret; ret = _copy_file(src, dest, COPY_TO_CACHE); if (ret != -1) unlink(src); return ret; } /* copy a file to the cache, compressing it */ static int copy_file_to_cache(const char *src, const char *dest) { return _copy_file(src, dest, COPY_TO_CACHE); } /* copy a file from the cache, decompressing it */ static int copy_file_from_cache(const char *src, const char *dest) { return _copy_file(src, dest, COPY_FROM_CACHE); } #endif /* ENABLE_ZLIB */ /* test if a file is zlib compressed */ int test_if_compressed(const char *filename) { FILE *f; f = fopen(filename, "rb"); if (!f) { return 0; } /* test if file starts with 1F8B, which is zlib's * magic number */ if ((fgetc(f) != 0x1f) || (fgetc(f) != 0x8b)) { fclose(f); return 0; } fclose(f); return 1; } /* copy file to the cache with error checking taking into account compression and hard linking if desired */ int commit_to_cache(const char *src, const char *dest, int hardlink) { int ret = -1; struct stat st; if (stat(src, &st) == 0) { unlink(dest); if (hardlink) { #ifdef _WIN32 ret = CreateHardLinkA(dest, src, NULL) ? 0 : -1; #else ret = link(src, dest); #endif } if (ret == -1) { ret = copy_file_to_cache(src, dest); if (ret == -1) { cc_log("failed to commit %s -> %s (%s)\n", src, dest, strerror(errno)); stats_update(STATS_ERROR); } } } else { cc_log("failed to put %s in the cache (%s)\n", src, strerror(errno)); stats_update(STATS_ERROR); } return ret; } /* copy file out of the cache with error checking taking into account compression and hard linking if desired */ int retrieve_from_cache(const char *src, const char *dest, int hardlink) { int ret = 0; x_utimes(src); if (strcmp(dest, "/dev/null") == 0) { ret = 0; } else { unlink(dest); /* only make a hardlink if the cache file is uncompressed */ if (hardlink && test_if_compressed(src) == 0) { #ifdef _WIN32 ret = CreateHardLinkA(dest, src, NULL) ? 0 : -1; #else ret = link(src, dest); #endif } else { ret = copy_file_from_cache(src, dest); } } /* the cached file might have been deleted by some external process */ if (ret == -1 && errno == ENOENT) { cc_log("hashfile missing for %s\n", dest); stats_update(STATS_MISSING); return -1; } if (ret == -1) { ret = copy_file_from_cache(src, dest); if (ret == -1) { cc_log("failed to retrieve %s -> %s (%s)\n", src, dest, strerror(errno)); stats_update(STATS_ERROR); return -1; } } return ret; } /* make sure a directory exists */ int create_dir(const char *dir) { struct stat st; if (stat(dir, &st) == 0) { if (S_ISDIR(st.st_mode)) { return 0; } errno = ENOTDIR; return 1; } #ifdef _WIN32 if (mkdir(dir) != 0 && errno != EEXIST) { return 1; } #else if (mkdir(dir, 0777) != 0 && errno != EEXIST) { return 1; } #endif return 0; } char const CACHEDIR_TAG[] = "Signature: 8a477f597d28d172789f06886806bc55\n" "# This file is a cache directory tag created by ccache.\n" "# For information about cache directory tags, see:\n" "# http://www.brynosaurus.com/cachedir/\n"; int create_cachedirtag(const char *dir) { char *filename; struct stat st; FILE *f; x_asprintf(&filename, "%s/CACHEDIR.TAG", dir); if (stat(filename, &st) == 0) { if (S_ISREG(st.st_mode)) { goto success; } errno = EEXIST; goto error; } f = fopen(filename, "w"); if (!f) goto error; if (fwrite(CACHEDIR_TAG, sizeof(CACHEDIR_TAG)-1, 1, f) != 1) { fclose(f); goto error; } if (fclose(f)) goto error; success: free(filename); return 0; error: free(filename); return 1; } /* this is like asprintf() but dies if the malloc fails note that we use vsnprintf in a rather poor way to make this more portable */ void x_asprintf(char **ptr, const char *format, ...) { va_list ap; *ptr = NULL; va_start(ap, format); if (vasprintf(ptr, format, ap) == -1) { fatal("out of memory in x_asprintf"); } va_end(ap); if (!*ptr) fatal("out of memory in x_asprintf"); } /* this is like strdup() but dies if the malloc fails */ char *x_strdup(const char *s) { char *ret; ret = strdup(s); if (!ret) { fatal("out of memory in strdup\n"); } return ret; } /* this is like malloc() but dies if the malloc fails */ void *x_malloc(size_t size) { void *ret; ret = malloc(size); if (!ret) { fatal("out of memory in malloc\n"); } return ret; } /* this is like realloc() but dies if the malloc fails */ void *x_realloc(void *ptr, size_t size) { void *p2; #if 1 /* Avoid invalid read in memcpy below */ p2 = realloc(ptr, size); if (!p2) { fatal("out of memory in x_realloc"); } #else if (!ptr) return x_malloc(size); p2 = malloc(size); if (!p2) { fatal("out of memory in x_realloc"); } if (ptr) { /* Note invalid read as the memcpy reads beyond the memory allocated by ptr */ memcpy(p2, ptr, size); free(ptr); } #endif return p2; } /* revsusive directory traversal - used for cleanup fn() is called on all files/dirs in the tree */ void traverse(const char *dir, void (*fn)(const char *, struct stat *)) { DIR *d; struct dirent *de; d = opendir(dir); if (!d) return; while ((de = readdir(d))) { char *fname; struct stat st; if (strcmp(de->d_name,".") == 0) continue; if (strcmp(de->d_name,"..") == 0) continue; if (strlen(de->d_name) == 0) continue; x_asprintf(&fname, "%s/%s", dir, de->d_name); #ifdef _WIN32 if (stat(fname, &st)) #else if (lstat(fname, &st)) #endif { if (errno != ENOENT) { perror(fname); } free(fname); continue; } if (S_ISDIR(st.st_mode)) { traverse(fname, fn); } fn(fname, &st); free(fname); } closedir(d); } /* return the base name of a file - caller frees */ char *str_basename(const char *s) { char *p = strrchr(s, '/'); if (p) { s = (p+1); } #ifdef _WIN32 p = strrchr(s, '\\'); if (p) { s = (p+1); } #endif return x_strdup(s); } /* return the dir name of a file - caller frees */ char *dirname(char *s) { char *p; s = x_strdup(s); p = strrchr(s, '/'); #ifdef _WIN32 p = strrchr(s, '\\'); #endif if (p) { *p = 0; } return s; } /* http://www.ecst.csuchico.edu/~beej/guide/ipc/flock.html http://cvs.php.net/viewvc.cgi/php-src/win32/flock.c?revision=1.2&view=markup Should return 0 for success, >0 otherwise */ int lock_fd(int fd) { #ifdef _WIN32 # if 1 return _locking(fd, _LK_NBLCK, 1); # else HANDLE fl = (HANDLE)_get_osfhandle(fd); OVERLAPPED o; memset(&o, 0, sizeof(o)); return (LockFileEx(fl, LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &o)) ? 0 : GetLastError(); # endif #else struct flock fl; int ret; fl.l_type = F_WRLCK; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 1; fl.l_pid = 0; /* not sure why we would be getting a signal here, but one user claimed it is possible */ do { ret = fcntl(fd, F_SETLKW, &fl); } while (ret == -1 && errno == EINTR); return ret; #endif } /* return size on disk of a file */ size_t file_size(struct stat *st) { #ifdef _WIN32 return (st->st_size + 1023) & ~1023; #else size_t size = st->st_blocks * 512; if ((size_t)st->st_size > size) { /* probably a broken stat() call ... */ size = (st->st_size + 1023) & ~1023; } return size; #endif } /* a safe open/create for read-write */ int safe_open(const char *fname) { int fd = open(fname, O_RDWR|O_BINARY); if (fd == -1 && errno == ENOENT) { fd = open(fname, O_RDWR|O_CREAT|O_EXCL|O_BINARY, 0666); if (fd == -1 && errno == EEXIST) { fd = open(fname, O_RDWR|O_BINARY); } } return fd; } /* display a kilobyte unsigned value in M, k or G */ void display_size(unsigned v) { if (v > 1024*1024) { printf("%8.1f Gbytes", v/((double)(1024*1024))); } else if (v > 1024) { printf("%8.1f Mbytes", v/((double)(1024))); } else { printf("%8u Kbytes", v); } } /* return a value in multiples of 1024 give a string that can end in K, M or G */ size_t value_units(const char *s) { char m; double v = atof(s); m = s[strlen(s)-1]; switch (m) { case 'G': case 'g': default: v *= 1024*1024; break; case 'M': case 'm': v *= 1024; break; case 'K': case 'k': v *= 1; break; } return (size_t)v; } /* a sane realpath() function, trying to cope with stupid path limits and a broken API */ char *x_realpath(const char *path) { #ifdef _WIN32 char namebuf[MAX_PATH]; DWORD ret; ret = GetFullPathNameA(path, sizeof(namebuf), namebuf, NULL); if (ret == 0 || ret >= sizeof(namebuf)) { return NULL; } return x_strdup(namebuf); #else int maxlen; char *ret, *p; #ifdef PATH_MAX maxlen = PATH_MAX; #elif defined(MAXPATHLEN) maxlen = MAXPATHLEN; #elif defined(_PC_PATH_MAX) maxlen = pathconf(path, _PC_PATH_MAX); #endif if (maxlen < 4096) maxlen = 4096; ret = x_malloc(maxlen); #if HAVE_REALPATH p = realpath(path, ret); #else /* yes, there are such systems. This replacement relies on the fact that when we call x_realpath we only care about symlinks */ { int len = readlink(path, ret, maxlen-1); if (len == -1) { free(ret); return NULL; } ret[len] = 0; p = ret; } #endif if (p) { p = x_strdup(p); free(ret); return p; } free(ret); return NULL; #endif } /* a getcwd that will returns an allocated buffer */ char *gnu_getcwd(void) { unsigned size = 128; while (1) { char *buffer = (char *)x_malloc(size); if (getcwd(buffer, size) == buffer) { return buffer; } free(buffer); if (errno != ERANGE) { return 0; } size *= 2; } } /* create an empty file */ int create_empty_file(const char *fname) { int fd; fd = open(fname, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL|O_BINARY, 0666); if (fd == -1) { return -1; } close(fd); return 0; } /* return current users home directory or die */ const char *get_home_directory(void) { #ifdef _WIN32 static char home_path[MAX_PATH] = {0}; HRESULT ret; /* we already have the path */ if (home_path[0] != 0) { return home_path; } /* get the path to "Application Data" folder */ ret = SHGetFolderPathA(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, home_path); if (SUCCEEDED(ret)) { return home_path; } fprintf(stderr, "ccache: Unable to determine home directory\n"); return NULL; #else const char *p = getenv("HOME"); if (p) { return p; } #ifdef HAVE_GETPWUID { struct passwd *pwd = getpwuid(getuid()); if (pwd) { return pwd->pw_dir; } } #endif fatal("Unable to determine home directory"); return NULL; #endif } int x_utimes(const char *filename) { #ifdef HAVE_UTIMES return utimes(filename, NULL); #else return utime(filename, NULL); #endif } #ifdef _WIN32 /* perror for Win32 API calls, using GetLastError() instead of errno */ void perror_win32(LPTSTR pszFunction) { LPTSTR pszMessage; DWORD dwLastError = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&pszMessage, 0, NULL ); fprintf(stderr, "%s: %s\n", pszFunction, pszMessage); LocalFree(pszMessage); } #endif swig-3.0.12/CCache/snprintf.c0000664000175000017500000005346613042756442015570 0ustar williamwilliam/* * Copyright Patrick Powell 1995 * This code is based on code written by Patrick Powell (papowell@astart.com) * It may be used for any purpose as long as this notice remains intact * on all source code distributions */ /************************************************************** * Original: * Patrick Powell Tue Apr 11 09:48:21 PDT 1995 * A bombproof version of doprnt (dopr) included. * Sigh. This sort of thing is always nasty do deal with. Note that * the version here does not include floating point... * * snprintf() is used instead of sprintf() as it does limit checks * for string length. This covers a nasty loophole. * * The other functions are there to prevent NULL pointers from * causing nast effects. * * More Recently: * Brandon Long 9/15/96 for mutt 0.43 * This was ugly. It is still ugly. I opted out of floating point * numbers, but the formatter understands just about everything * from the normal C string format, at least as far as I can tell from * the Solaris 2.5 printf(3S) man page. * * Brandon Long 10/22/97 for mutt 0.87.1 * Ok, added some minimal floating point support, which means this * probably requires libm on most operating systems. Don't yet * support the exponent (e,E) and sigfig (g,G). Also, fmtint() * was pretty badly broken, it just wasn't being exercised in ways * which showed it, so that's been fixed. Also, formated the code * to mutt conventions, and removed dead code left over from the * original. Also, there is now a builtin-test, just compile with: * gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm * and run snprintf for results. * * Thomas Roessler 01/27/98 for mutt 0.89i * The PGP code was using unsigned hexadecimal formats. * Unfortunately, unsigned formats simply didn't work. * * Michael Elkins 03/05/98 for mutt 0.90.8 * The original code assumed that both snprintf() and vsnprintf() were * missing. Some systems only have snprintf() but not vsnprintf(), so * the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF. * * Andrew Tridgell (tridge@samba.org) Oct 1998 * fixed handling of %.0f * added test for HAVE_LONG_DOUBLE * * tridge@samba.org, idra@samba.org, April 2001 * got rid of fcvt code (twas buggy and made testing harder) * added C99 semantics * **************************************************************/ #ifndef NO_CONFIG_H /* for some tests */ #include "config.h" #endif #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STRINGS_H #include #endif #ifdef HAVE_CTYPE_H #include #endif #include #include #ifdef HAVE_STDLIB_H #include #endif #if defined(HAVE_SNPRINTF) && defined(HAVE_VSNPRINTF) && defined(HAVE_C99_VSNPRINTF) /* only include stdio.h if we are not re-defining snprintf or vsnprintf */ #include /* make the compiler happy with an empty file */ void dummy_snprintf(void) {} #else #ifdef HAVE_LONG_DOUBLE #define LDOUBLE long double #else #define LDOUBLE double #endif #ifdef HAVE_LONG_LONG #define LLONG long long #else #define LLONG long #endif static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args); static void fmtstr(char *buffer, size_t *currlen, size_t maxlen, char *value, int flags, int min, int max); static void fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base, int min, int max, int flags); static void fmtfp(char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue, int min, int max, int flags); static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c); /* * dopr(): poor man's version of doprintf */ /* format read states */ #define DP_S_DEFAULT 0 #define DP_S_FLAGS 1 #define DP_S_MIN 2 #define DP_S_DOT 3 #define DP_S_MAX 4 #define DP_S_MOD 5 #define DP_S_CONV 6 #define DP_S_DONE 7 /* format flags - Bits */ #define DP_F_MINUS (1 << 0) #define DP_F_PLUS (1 << 1) #define DP_F_SPACE (1 << 2) #define DP_F_NUM (1 << 3) #define DP_F_ZERO (1 << 4) #define DP_F_UP (1 << 5) #define DP_F_UNSIGNED (1 << 6) /* Conversion Flags */ #define DP_C_SHORT 1 #define DP_C_LONG 2 #define DP_C_LDOUBLE 3 #define DP_C_LLONG 4 #define char_to_int(p) ((p)- '0') #ifndef MAX #define MAX(p,q) (((p) >= (q)) ? (p) : (q)) #endif static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args) { char ch; LLONG value; LDOUBLE fvalue; char *strvalue; int min; int max; int state; int flags; int cflags; size_t currlen; state = DP_S_DEFAULT; currlen = flags = cflags = min = 0; max = -1; ch = *format++; while (state != DP_S_DONE) { if (ch == '\0') state = DP_S_DONE; switch(state) { case DP_S_DEFAULT: if (ch == '%') state = DP_S_FLAGS; else dopr_outch (buffer, &currlen, maxlen, ch); ch = *format++; break; case DP_S_FLAGS: switch (ch) { case '-': flags |= DP_F_MINUS; ch = *format++; break; case '+': flags |= DP_F_PLUS; ch = *format++; break; case ' ': flags |= DP_F_SPACE; ch = *format++; break; case '#': flags |= DP_F_NUM; ch = *format++; break; case '0': flags |= DP_F_ZERO; ch = *format++; break; default: state = DP_S_MIN; break; } break; case DP_S_MIN: if (isdigit((unsigned char)ch)) { min = 10*min + char_to_int (ch); ch = *format++; } else if (ch == '*') { min = va_arg (args, int); ch = *format++; state = DP_S_DOT; } else { state = DP_S_DOT; } break; case DP_S_DOT: if (ch == '.') { state = DP_S_MAX; ch = *format++; } else { state = DP_S_MOD; } break; case DP_S_MAX: if (isdigit((unsigned char)ch)) { if (max < 0) max = 0; max = 10*max + char_to_int (ch); ch = *format++; } else if (ch == '*') { max = va_arg (args, int); ch = *format++; state = DP_S_MOD; } else { state = DP_S_MOD; } break; case DP_S_MOD: switch (ch) { case 'h': cflags = DP_C_SHORT; ch = *format++; break; case 'l': cflags = DP_C_LONG; ch = *format++; if (ch == 'l') { /* It's a long long */ cflags = DP_C_LLONG; ch = *format++; } break; case 'L': cflags = DP_C_LDOUBLE; ch = *format++; break; default: break; } state = DP_S_CONV; break; case DP_S_CONV: switch (ch) { case 'd': case 'i': if (cflags == DP_C_SHORT) value = va_arg (args, int); else if (cflags == DP_C_LONG) value = va_arg (args, long int); else if (cflags == DP_C_LLONG) value = va_arg (args, LLONG); else value = va_arg (args, int); fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags); break; case 'o': flags |= DP_F_UNSIGNED; if (cflags == DP_C_SHORT) value = va_arg (args, unsigned int); else if (cflags == DP_C_LONG) value = (long)va_arg (args, unsigned long int); else if (cflags == DP_C_LLONG) value = (long)va_arg (args, unsigned LLONG); else value = (long)va_arg (args, unsigned int); fmtint (buffer, &currlen, maxlen, value, 8, min, max, flags); break; case 'u': flags |= DP_F_UNSIGNED; if (cflags == DP_C_SHORT) value = va_arg (args, unsigned int); else if (cflags == DP_C_LONG) value = (long)va_arg (args, unsigned long int); else if (cflags == DP_C_LLONG) value = (LLONG)va_arg (args, unsigned LLONG); else value = (long)va_arg (args, unsigned int); fmtint (buffer, &currlen, maxlen, value, 10, min, max, flags); break; case 'X': flags |= DP_F_UP; case 'x': flags |= DP_F_UNSIGNED; if (cflags == DP_C_SHORT) value = va_arg (args, unsigned int); else if (cflags == DP_C_LONG) value = (long)va_arg (args, unsigned long int); else if (cflags == DP_C_LLONG) value = (LLONG)va_arg (args, unsigned LLONG); else value = (long)va_arg (args, unsigned int); fmtint (buffer, &currlen, maxlen, value, 16, min, max, flags); break; case 'f': if (cflags == DP_C_LDOUBLE) fvalue = va_arg (args, LDOUBLE); else fvalue = va_arg (args, double); /* um, floating point? */ fmtfp (buffer, &currlen, maxlen, fvalue, min, max, flags); break; case 'E': flags |= DP_F_UP; case 'e': if (cflags == DP_C_LDOUBLE) fvalue = va_arg (args, LDOUBLE); else fvalue = va_arg (args, double); break; case 'G': flags |= DP_F_UP; case 'g': if (cflags == DP_C_LDOUBLE) fvalue = va_arg (args, LDOUBLE); else fvalue = va_arg (args, double); break; case 'c': dopr_outch (buffer, &currlen, maxlen, va_arg (args, int)); break; case 's': strvalue = va_arg (args, char *); if (!strvalue) strvalue = "(NULL)"; if (max == -1) { max = strlen(strvalue); } if (min > 0 && max >= 0 && min > max) max = min; fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max); break; case 'p': strvalue = (char *)va_arg(args, void *); fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags); break; case 'n': if (cflags == DP_C_SHORT) { short int *num; num = va_arg (args, short int *); *num = currlen; } else if (cflags == DP_C_LONG) { long int *num; num = va_arg (args, long int *); *num = (long int)currlen; } else if (cflags == DP_C_LLONG) { LLONG *num; num = va_arg (args, LLONG *); *num = (LLONG)currlen; } else { int *num; num = va_arg (args, int *); *num = currlen; } break; case '%': dopr_outch (buffer, &currlen, maxlen, ch); break; case 'w': /* not supported yet, treat as next char */ ch = *format++; break; default: /* Unknown, skip */ break; } ch = *format++; state = DP_S_DEFAULT; flags = cflags = min = 0; max = -1; break; case DP_S_DONE: break; default: /* hmm? */ break; /* some picky compilers need this */ } } if (maxlen != 0) { if (currlen < maxlen - 1) buffer[currlen] = '\0'; else if (maxlen > 0) buffer[maxlen - 1] = '\0'; } return currlen; } static void fmtstr(char *buffer, size_t *currlen, size_t maxlen, char *value, int flags, int min, int max) { int padlen, strln; /* amount to pad */ int cnt = 0; #ifdef DEBUG_SNPRINTF printf("fmtstr min=%d max=%d s=[%s]\n", min, max, value); #endif if (value == 0) { value = ""; } for (strln = 0; value[strln]; ++strln); /* strlen */ padlen = min - strln; if (padlen < 0) padlen = 0; if (flags & DP_F_MINUS) padlen = -padlen; /* Left Justify */ while ((padlen > 0) && (cnt < max)) { dopr_outch (buffer, currlen, maxlen, ' '); --padlen; ++cnt; } while (*value && (cnt < max)) { dopr_outch (buffer, currlen, maxlen, *value++); ++cnt; } while ((padlen < 0) && (cnt < max)) { dopr_outch (buffer, currlen, maxlen, ' '); ++padlen; ++cnt; } } /* Have to handle DP_F_NUM (ie 0x and 0 alternates) */ static void fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base, int min, int max, int flags) { int signvalue = 0; unsigned long uvalue; char convert[20]; int place = 0; int spadlen = 0; /* amount to space pad */ int zpadlen = 0; /* amount to zero pad */ int caps = 0; if (max < 0) max = 0; uvalue = value; if(!(flags & DP_F_UNSIGNED)) { if( value < 0 ) { signvalue = '-'; uvalue = -value; } else { if (flags & DP_F_PLUS) /* Do a sign (+/i) */ signvalue = '+'; else if (flags & DP_F_SPACE) signvalue = ' '; } } if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ do { convert[place++] = (caps? "0123456789ABCDEF":"0123456789abcdef") [uvalue % (unsigned)base ]; uvalue = (uvalue / (unsigned)base ); } while(uvalue && (place < 20)); if (place == 20) place--; convert[place] = 0; zpadlen = max - place; spadlen = min - MAX (max, place) - (signvalue ? 1 : 0); if (zpadlen < 0) zpadlen = 0; if (spadlen < 0) spadlen = 0; if (flags & DP_F_ZERO) { zpadlen = MAX(zpadlen, spadlen); spadlen = 0; } if (flags & DP_F_MINUS) spadlen = -spadlen; /* Left Justifty */ #ifdef DEBUG_SNPRINTF printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n", zpadlen, spadlen, min, max, place); #endif /* Spaces */ while (spadlen > 0) { dopr_outch (buffer, currlen, maxlen, ' '); --spadlen; } /* Sign */ if (signvalue) dopr_outch (buffer, currlen, maxlen, signvalue); /* Zeros */ if (zpadlen > 0) { while (zpadlen > 0) { dopr_outch (buffer, currlen, maxlen, '0'); --zpadlen; } } /* Digits */ while (place > 0) dopr_outch (buffer, currlen, maxlen, convert[--place]); /* Left Justified spaces */ while (spadlen < 0) { dopr_outch (buffer, currlen, maxlen, ' '); ++spadlen; } } static LDOUBLE abs_val(LDOUBLE value) { LDOUBLE result = value; if (value < 0) result = -value; return result; } static LDOUBLE POW10(int exp) { LDOUBLE result = 1; while (exp) { result *= 10; exp--; } return result; } static LLONG ROUND(LDOUBLE value) { LLONG intpart; intpart = (LLONG)value; value = value - intpart; if (value >= 0.5) intpart++; return intpart; } /* a replacement for modf that doesn't need the math library. Should be portable, but slow */ static double my_modf(double x0, double *iptr) { int i; long l; double x = x0; double f = 1.0; for (i=0;i<100;i++) { l = (long)x; if (l <= (x+1) && l >= (x-1)) break; x *= 0.1; f *= 10.0; } if (i == 100) { /* yikes! the number is beyond what we can handle. What do we do? */ (*iptr) = 0; return 0; } if (i != 0) { double i2; double ret; ret = my_modf(x0-l*f, &i2); (*iptr) = l*f + i2; return ret; } (*iptr) = l; return x - (*iptr); } static void fmtfp (char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue, int min, int max, int flags) { int signvalue = 0; double ufvalue; char iconvert[311]; char fconvert[311]; int iplace = 0; int fplace = 0; int padlen = 0; /* amount to pad */ int zpadlen = 0; int caps = 0; int index; double intpart; double fracpart; double temp; /* * AIX manpage says the default is 0, but Solaris says the default * is 6, and sprintf on AIX defaults to 6 */ if (max < 0) max = 6; ufvalue = abs_val (fvalue); if (fvalue < 0) { signvalue = '-'; } else { if (flags & DP_F_PLUS) { /* Do a sign (+/i) */ signvalue = '+'; } else { if (flags & DP_F_SPACE) signvalue = ' '; } } #if 0 if (flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ #endif #if 0 if (max == 0) ufvalue += 0.5; /* if max = 0 we must round */ #endif /* * Sorry, we only support 16 digits past the decimal because of our * conversion method */ if (max > 16) max = 16; /* We "cheat" by converting the fractional part to integer by * multiplying by a factor of 10 */ temp = ufvalue; my_modf(temp, &intpart); fracpart = ROUND((POW10(max)) * (ufvalue - intpart)); if (fracpart >= POW10(max)) { intpart++; fracpart -= POW10(max); } /* Convert integer part */ do { temp = intpart; my_modf(intpart*0.1, &intpart); temp = temp*0.1; index = (int) ((temp -intpart +0.05)* 10.0); /* index = (int) (((double)(temp*0.1) -intpart +0.05) *10.0); */ /* printf ("%llf, %f, %x\n", temp, intpart, index); */ iconvert[iplace++] = (caps? "0123456789ABCDEF":"0123456789abcdef")[index]; } while (intpart && (iplace < 311)); if (iplace == 311) iplace--; iconvert[iplace] = 0; /* Convert fractional part */ if (fracpart) { do { temp = fracpart; my_modf(fracpart*0.1, &fracpart); temp = temp*0.1; index = (int) ((temp -fracpart +0.05)* 10.0); /* index = (int) ((((temp/10) -fracpart) +0.05) *10); */ /* printf ("%lf, %lf, %ld\n", temp, fracpart, index); */ fconvert[fplace++] = (caps? "0123456789ABCDEF":"0123456789abcdef")[index]; } while(fracpart && (fplace < 311)); if (fplace == 311) fplace--; } fconvert[fplace] = 0; /* -1 for decimal point, another -1 if we are printing a sign */ padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); zpadlen = max - fplace; if (zpadlen < 0) zpadlen = 0; if (padlen < 0) padlen = 0; if (flags & DP_F_MINUS) padlen = -padlen; /* Left Justifty */ if ((flags & DP_F_ZERO) && (padlen > 0)) { if (signvalue) { dopr_outch (buffer, currlen, maxlen, signvalue); --padlen; signvalue = 0; } while (padlen > 0) { dopr_outch (buffer, currlen, maxlen, '0'); --padlen; } } while (padlen > 0) { dopr_outch (buffer, currlen, maxlen, ' '); --padlen; } if (signvalue) dopr_outch (buffer, currlen, maxlen, signvalue); while (iplace > 0) dopr_outch (buffer, currlen, maxlen, iconvert[--iplace]); #ifdef DEBUG_SNPRINTF printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen); #endif /* * Decimal point. This should probably use locale to find the correct * char to print out. */ if (max > 0) { dopr_outch (buffer, currlen, maxlen, '.'); while (fplace > 0) dopr_outch (buffer, currlen, maxlen, fconvert[--fplace]); } while (zpadlen > 0) { dopr_outch (buffer, currlen, maxlen, '0'); --zpadlen; } while (padlen < 0) { dopr_outch (buffer, currlen, maxlen, ' '); ++padlen; } } static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c) { if (*currlen < maxlen) { buffer[(*currlen)] = c; } (*currlen)++; } /* yes this really must be a ||. Don't muck with this (tridge) */ #if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF) int vsnprintf (char *str, size_t count, const char *fmt, va_list args) { return dopr(str, count, fmt, args); } #endif /* yes this really must be a ||. Don't muck wiith this (tridge) * * The logic for these two is that we need our own definition if the * OS *either* has no definition of *sprintf, or if it does have one * that doesn't work properly according to the autoconf test. Perhaps * these should really be smb_snprintf to avoid conflicts with buggy * linkers? -- mbp */ #if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_SNPRINTF) int snprintf(char *str,size_t count,const char *fmt,...) { size_t ret; va_list ap; va_start(ap, fmt); ret = vsnprintf(str, count, fmt, ap); va_end(ap); return ret; } #endif #endif #ifndef HAVE_VASPRINTF int vasprintf(char **ptr, const char *format, va_list ap) { int ret; ret = vsnprintf(0, 0, format, ap); if (ret <= 0) return ret; (*ptr) = (char *)malloc(ret+1); if (!*ptr) return -1; ret = vsnprintf(*ptr, ret+1, format, ap); return ret; } #endif #ifndef HAVE_ASPRINTF int asprintf(char **ptr, const char *format, ...) { va_list ap; int ret; *ptr = 0; va_start(ap, format); ret = vasprintf(ptr, format, ap); va_end(ap); return ret; } #endif #ifndef HAVE_VSYSLOG #ifdef HAVE_SYSLOG void vsyslog (int facility_priority, char *format, va_list arglist) { char *msg = 0; vasprintf(&msg, format, arglist); if (!msg) return; syslog(facility_priority, "%s", msg); free(msg); } #endif /* HAVE_SYSLOG */ #endif /* HAVE_VSYSLOG */ #ifdef TEST_SNPRINTF int sprintf(char *str,const char *fmt,...); int main (void) { char buf1[1024]; char buf2[1024]; char *fp_fmt[] = { "%1.1f", "%-1.5f", "%1.5f", "%123.9f", "%10.5f", "% 10.5f", "%+22.9f", "%+4.9f", "%01.3f", "%4f", "%3.1f", "%3.2f", "%.0f", "%f", "-16.16f", 0 }; double fp_nums[] = { 6442452944.1234, -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, 0.9996, 1.996, 4.136, 0}; char *int_fmt[] = { "%-1.5d", "%1.5d", "%123.9d", "%5.5d", "%10.5d", "% 10.5d", "%+22.33d", "%01.3d", "%4d", "%d", 0 }; long int_nums[] = { -1, 134, 91340, 341, 0203, 0}; char *str_fmt[] = { "10.5s", "5.10s", "10.1s", "0.10s", "10.0s", "1.10s", "%s", "%.1s", "%.10s", "%10s", 0 }; char *str_vals[] = {"hello", "a", "", "a longer string", 0}; int x, y; int fail = 0; int num = 0; printf ("Testing snprintf format codes against system sprintf...\n"); for (x = 0; fp_fmt[x] ; x++) { for (y = 0; fp_nums[y] != 0 ; y++) { int l1 = snprintf(0, 0, fp_fmt[x], fp_nums[y]); int l2 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]); sprintf (buf2, fp_fmt[x], fp_nums[y]); if (strcmp (buf1, buf2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", fp_fmt[x], buf1, buf2); fail++; } if (l1 != l2) { printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, fp_fmt[x]); fail++; } num++; } } for (x = 0; int_fmt[x] ; x++) { for (y = 0; int_nums[y] != 0 ; y++) { int l1 = snprintf(0, 0, int_fmt[x], int_nums[y]); int l2 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]); sprintf (buf2, int_fmt[x], int_nums[y]); if (strcmp (buf1, buf2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", int_fmt[x], buf1, buf2); fail++; } if (l1 != l2) { printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, int_fmt[x]); fail++; } num++; } } for (x = 0; str_fmt[x] ; x++) { for (y = 0; str_vals[y] != 0 ; y++) { int l1 = snprintf(0, 0, str_fmt[x], str_vals[y]); int l2 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]); sprintf (buf2, str_fmt[x], str_vals[y]); if (strcmp (buf1, buf2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf = [%s]\n\t sprintf = [%s]\n", str_fmt[x], buf1, buf2); fail++; } if (l1 != l2) { printf("snprintf l1 != l2 (%d %d) %s\n", l1, l2, str_fmt[x]); fail++; } num++; } } printf ("%d tests failed out of %d.\n", fail, num); printf("seeing how many digits we support\n"); { double v0 = 0.12345678901234567890123456789012345678901; for (x=0; x<100; x++) { snprintf(buf1, sizeof(buf1), "%1.1f", v0*pow(10, x)); sprintf(buf2, "%1.1f", v0*pow(10, x)); if (strcmp(buf1, buf2)) { printf("we seem to support %d digits\n", x-1); break; } } } return 0; } #endif /* SNPRINTF_TEST */ swig-3.0.12/CCache/configure0000775000175000017500000044534413042756671015474 0ustar williamwilliam#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for ccache-swig 0.0. # # # Copyright (C) 1992-1996, 1998-2012 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 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 # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (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 # 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. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -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_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$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_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_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'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ccache-swig' PACKAGE_TARNAME='ccache-swig' PACKAGE_VERSION='0.0' PACKAGE_STRING='ccache-swig 0.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="ccache.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 EGREP GREP INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM 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 runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_zlib ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # 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_fn_error $? "invalid feature name: $ac_useropt" 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_fn_error $? "invalid feature name: $ac_useropt" 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$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_fn_error $? "invalid package name: $ac_useropt" 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_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $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_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $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 runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $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_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures ccache-swig 0.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/ccache-swig] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of ccache-swig 0.0:";; 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-zlib enable zlib support for ccache compression Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$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 ccache-swig configure 0.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 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 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func 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 ccache-swig $as_me 0.0, which was generated by GNU Autoconf 2.69. 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) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$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= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" 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 $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" 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 $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" 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'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > 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 cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _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 # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac 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 /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$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" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$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. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$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_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Get version from SWIG in ccache_swig_config.h.in { $as_echo "$as_me:${as_lineno-$LINENO}: Configuring ccache" >&5 $as_echo "$as_me: Configuring ccache" >&6;} ac_config_headers="$ac_config_headers config.h" 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; 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:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+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 if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$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 ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else 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:${as_lineno-$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:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$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:${as_lineno-$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:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* 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" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg 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:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$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 ${ac_cv_prog_CPP+:} false; 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } 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_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # for program_transform_name $as_echo "#define _GNU_SOURCE 1" >>confdefs.h # If GCC, turn on warnings. if test "x$GCC" = "xyes" then CFLAGS="$CFLAGS -Wall -W" else CFLAGS="$CFLAGS -O" fi 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:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = 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:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #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 if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$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 ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$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 $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$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 ${ac_cv_path_GREP+:} false; 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" as_fn_executable_p "$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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; 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" as_fn_executable_p "$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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h 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` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in ctype.h strings.h stdlib.h string.h pwd.h sys/time.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in realpath snprintf vsnprintf vasprintf asprintf mkstemp do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in gethostname getpwuid do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in utimes do : ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes" if test "x$ac_cv_func_utimes" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UTIMES 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compar_fn_t in stdlib.h" >&5 $as_echo_n "checking for compar_fn_t in stdlib.h... " >&6; } if ${ccache_cv_COMPAR_FN_T+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { void test_fn(void) { qsort(NULL, 0, 0, (__compar_fn_t)NULL); } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ccache_cv_COMPAR_FN_T=yes else ccache_cv_COMPAR_FN_T=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ccache_cv_COMPAR_FN_T" >&5 $as_echo "$ccache_cv_COMPAR_FN_T" >&6; } if test x"$ccache_cv_COMPAR_FN_T" = x"yes"; then $as_echo "#define HAVE_COMPAR_FN_T 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99 vsnprintf" >&5 $as_echo_n "checking for C99 vsnprintf... " >&6; } if ${ccache_cv_HAVE_C99_VSNPRINTF+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ccache_cv_HAVE_C99_VSNPRINTF=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void foo(const char *format, ...) { va_list ap; int len; char buf[5]; va_start(ap, format); len = vsnprintf(0, 0, format, ap); va_end(ap); if (len != 5) exit(1); if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1); exit(0); } main() { foo("hello"); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ccache_cv_HAVE_C99_VSNPRINTF=yes else ccache_cv_HAVE_C99_VSNPRINTF=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ccache_cv_HAVE_C99_VSNPRINTF" >&5 $as_echo "$ccache_cv_HAVE_C99_VSNPRINTF" >&6; } if test x"$ccache_cv_HAVE_C99_VSNPRINTF" = x"yes"; then $as_echo "#define HAVE_C99_VSNPRINTF 1" >>confdefs.h fi # Check whether --enable-zlib was given. if test "${enable_zlib+set}" = set; then : enableval=$enable_zlib; else enable_zlib=yes fi if test x"$enable_zlib" = x"yes"; then ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzdopen in -lz" >&5 $as_echo_n "checking for gzdopen in -lz... " >&6; } if ${ac_cv_lib_z_gzdopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzdopen (); int main () { return gzdopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_gzdopen=yes else ac_cv_lib_z_gzdopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzdopen" >&5 $as_echo "$ac_cv_lib_z_gzdopen" >&6; } if test "x$ac_cv_lib_z_gzdopen" = xyes; then : LIBS="-lz $LIBS" $as_echo "#define ENABLE_ZLIB 1" >>confdefs.h fi fi 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:${as_lineno-$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= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+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 if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$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= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$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. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -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_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 # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (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 # 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. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$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_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_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 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by ccache-swig $as_me 0.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ ccache-swig config.status 0.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; 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"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $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_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$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_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+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= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $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:${as_lineno-$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 >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $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"; as_fn_mkdir_p 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 # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$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 s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $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 "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi swig-3.0.12/CCache/ccache.h0000664000175000017500000001104713042756442015125 0ustar williamwilliam#include "ccache_swig_config.h" #define CCACHE_VERSION SWIG_VERSION #ifndef _WIN32 #include "config.h" #else #include #define PACKAGE_NAME "ccache-swig.exe" #endif #include #include #include #include #include #include #ifndef _WIN32 #include #include #else #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0500 #endif #include #include #endif #include #include #include #include #include #include #include #include #include #ifdef HAVE_PWD_H #include #endif #ifdef HAVE_SYS_TIME_H #include #endif #ifdef ENABLE_ZLIB #include #endif #define STATUS_NOTFOUND 3 #define STATUS_FATAL 4 #define STATUS_NOCACHE 5 #define MYNAME PACKAGE_NAME #define LIMIT_MULTIPLE 0.8 /* default maximum cache size */ #ifndef DEFAULT_MAXSIZE #define DEFAULT_MAXSIZE (1000*1000) #endif /* file copy mode */ #ifdef ENABLE_ZLIB #define COPY_UNCOMPRESSED 0 #define COPY_FROM_CACHE 1 #define COPY_TO_CACHE 2 #endif enum stats { STATS_NONE=0, STATS_STDOUT, STATS_STATUS, STATS_ERROR, STATS_TOCACHE, STATS_PREPROCESSOR, STATS_COMPILER, STATS_MISSING, STATS_CACHED, STATS_ARGS, STATS_LINK, STATS_NUMFILES, STATS_TOTALSIZE, STATS_MAXFILES, STATS_MAXSIZE, STATS_NOTC, STATS_DEVICE, STATS_NOINPUT, STATS_ENVIRONMMENT, STATS_MULTIPLE, STATS_CONFTEST, STATS_UNSUPPORTED, STATS_OUTSTDOUT, STATS_END }; typedef unsigned uint32; #include "mdfour.h" void hash_start(void); void hash_string(const char *s); void hash_int(int x); void hash_file(const char *fname); char *hash_result(void); void hash_buffer(const char *s, int len); void cc_log(const char *format, ...); void fatal(const char *msg); void copy_fd(int fd_in, int fd_out); int safe_rename(const char* oldpath, const char* newpath); int move_file(const char *src, const char *dest); int test_if_compressed(const char *filename); int commit_to_cache(const char *src, const char *dest, int hardlink); int retrieve_from_cache(const char *src, const char *dest, int hardlink); int create_dir(const char *dir); int create_cachedirtag(const char *dir); void x_asprintf(char **ptr, const char *format, ...); char *x_strdup(const char *s); void *x_realloc(void *ptr, size_t size); void *x_malloc(size_t size); void traverse(const char *dir, void (*fn)(const char *, struct stat *)); char *str_basename(const char *s); char *dirname(char *s); int lock_fd(int fd); size_t file_size(struct stat *st); int safe_open(const char *fname); char *x_realpath(const char *path); char *gnu_getcwd(void); int create_empty_file(const char *fname); const char *get_home_directory(void); int x_utimes(const char *filename); #ifdef _WIN32 void perror_win32(LPTSTR pszFunction); #endif void stats_update(enum stats stat); void stats_zero(void); void stats_summary(void); void stats_tocache(size_t size, size_t numfiles); void stats_read(const char *stats_file, unsigned counters[STATS_END]); int stats_set_limits(long maxfiles, long maxsize); size_t value_units(const char *s); void display_size(unsigned v); void stats_set_sizes(const char *dir, size_t num_files, size_t total_size); int unify_hash(const char *fname); #ifndef HAVE_VASPRINTF int vasprintf(char **, const char *, va_list ); #endif #ifndef HAVE_ASPRINTF int asprintf(char **ptr, const char *format, ...); #endif #ifndef HAVE_SNPRINTF int snprintf(char *,size_t ,const char *, ...); #endif void cleanup_dir(const char *dir, size_t maxfiles, size_t maxsize, size_t minfiles); void cleanup_all(const char *dir); void wipe_all(const char *dir); #ifdef _WIN32 char *argvtos(char **argv); #endif int execute(char **argv, const char *path_stdout, const char *path_stderr); char *find_executable(const char *name, const char *exclude_name); void display_execute_args(char **argv); typedef struct { char **argv; int argc; } ARGS; ARGS *args_init(int , char **); void args_add(ARGS *args, const char *s); void args_add_prefix(ARGS *args, const char *s); void args_pop(ARGS *args, int n); void args_strip(ARGS *args, const char *prefix); void args_remove_first(ARGS *args); extern int ccache_verbose; #if HAVE_COMPAR_FN_T #define COMPAR_FN_T __compar_fn_t #else typedef int (*COMPAR_FN_T)(const void *, const void *); #endif /* work with silly DOS binary open */ #ifndef O_BINARY #define O_BINARY 0 #endif /* mkstemp() on some versions of cygwin don't handle binary files, so override */ /* Seems okay in Cygwin 1.7.0 #ifdef __CYGWIN__ #undef HAVE_MKSTEMP #endif */ swig-3.0.12/CCache/unify.c0000664000175000017500000001606313042756442015047 0ustar williamwilliam/* Copyright (C) Andrew Tridgell 2002 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* C/C++ unifier the idea is that changes that don't affect the resulting C code should not change the hash. This is achieved by folding white-space and other non-semantic fluff in the input into a single unified format. This unifier was design to match the output of the unifier in compilercache, which is flex based. The major difference is that this unifier is much faster (about 2x) and more forgiving of syntactic errors. Continuing on syntactic errors is important to cope with C/C++ extensions in the local compiler (for example, inline assembly systems). */ #include "ccache.h" static char *s_tokens[] = { "...", ">>=", "<<=", "+=", "-=", "*=", "/=", "%=", "&=", "^=", "|=", ">>", "<<", "++", "--", "->", "&&", "||", "<=", ">=", "==", "!=", ";", "{", "<%", "}", "%>", ",", ":", "=", "(", ")", "[", "<:", "]", ":>", ".", "&", "!", "~", "-", "+", "*", "/", "%", "<", ">", "^", "|", "?", 0 }; #define C_ALPHA 1 #define C_SPACE 2 #define C_TOKEN 4 #define C_QUOTE 8 #define C_DIGIT 16 #define C_HEX 32 #define C_FLOAT 64 #define C_SIGN 128 static struct { unsigned char type; unsigned char num_toks; char *toks[7]; } tokens[256]; /* build up the table used by the unifier */ static void build_table(void) { unsigned char c; int i; static int done; if (done) return; done = 1; memset(tokens, 0, sizeof(tokens)); for (c=0;c<128;c++) { if (isalpha(c) || c == '_') tokens[c].type |= C_ALPHA; if (isdigit(c)) tokens[c].type |= C_DIGIT; if (isspace(c)) tokens[c].type |= C_SPACE; if (isxdigit(c)) tokens[c].type |= C_HEX; } tokens['\''].type |= C_QUOTE; tokens['"'].type |= C_QUOTE; tokens['l'].type |= C_FLOAT; tokens['L'].type |= C_FLOAT; tokens['f'].type |= C_FLOAT; tokens['F'].type |= C_FLOAT; tokens['U'].type |= C_FLOAT; tokens['u'].type |= C_FLOAT; tokens['-'].type |= C_SIGN; tokens['+'].type |= C_SIGN; for (i=0;s_tokens[i];i++) { c = s_tokens[i][0]; tokens[c].type |= C_TOKEN; tokens[c].toks[tokens[c].num_toks] = s_tokens[i]; tokens[c].num_toks++; } } /* buffer up characters before hashing them */ static void pushchar(unsigned char c) { static unsigned char buf[64]; static int len; if (c == 0) { if (len > 0) { hash_buffer((char *)buf, len); len = 0; } hash_buffer(NULL, 0); return; } buf[len++] = c; if (len == 64) { hash_buffer((char *)buf, len); len = 0; } } /* hash some C/C++ code after unifying */ static void unify(unsigned char *p, size_t size) { size_t ofs; unsigned char q; int i; build_table(); for (ofs=0; ofs 2 && p[ofs+1] == ' ' && isdigit(p[ofs+2])) { do { ofs++; } while (ofs < size && p[ofs] != '\n'); ofs++; } else { do { pushchar(p[ofs]); ofs++; } while (ofs < size && p[ofs] != '\n'); pushchar('\n'); ofs++; } continue; } if (tokens[p[ofs]].type & C_ALPHA) { do { pushchar(p[ofs]); ofs++; } while (ofs < size && (tokens[p[ofs]].type & (C_ALPHA|C_DIGIT))); pushchar('\n'); continue; } if (tokens[p[ofs]].type & C_DIGIT) { do { pushchar(p[ofs]); ofs++; } while (ofs < size && ((tokens[p[ofs]].type & C_DIGIT) || p[ofs] == '.')); if (ofs < size && (p[ofs] == 'x' || p[ofs] == 'X')) { do { pushchar(p[ofs]); ofs++; } while (ofs < size && (tokens[p[ofs]].type & C_HEX)); } if (ofs < size && (p[ofs] == 'E' || p[ofs] == 'e')) { pushchar(p[ofs]); ofs++; while (ofs < size && (tokens[p[ofs]].type & (C_DIGIT|C_SIGN))) { pushchar(p[ofs]); ofs++; } } while (ofs < size && (tokens[p[ofs]].type & C_FLOAT)) { pushchar(p[ofs]); ofs++; } pushchar('\n'); continue; } if (tokens[p[ofs]].type & C_SPACE) { do { ofs++; } while (ofs < size && (tokens[p[ofs]].type & C_SPACE)); continue; } if (tokens[p[ofs]].type & C_QUOTE) { q = p[ofs]; pushchar(p[ofs]); do { ofs++; while (ofs < size-1 && p[ofs] == '\\') { pushchar(p[ofs]); pushchar(p[ofs+1]); ofs+=2; } pushchar(p[ofs]); } while (ofs < size && p[ofs] != q); pushchar('\n'); ofs++; continue; } if (tokens[p[ofs]].type & C_TOKEN) { q = p[ofs]; for (i=0;i= ofs+len && memcmp(&p[ofs], s, len) == 0) { int j; for (j=0;s[j];j++) { pushchar(s[j]); ofs++; } pushchar('\n'); break; } } if (i < tokens[q].num_toks) { continue; } } pushchar(p[ofs]); pushchar('\n'); ofs++; } pushchar(0); } /* hash a file that consists of preprocessor output, but remove any line number information from the hash */ int unify_hash(const char *fname) { #ifdef _WIN32 HANDLE file; HANDLE section; DWORD filesize_low; char *map; int ret = -1; file = CreateFileA(fname, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (file != INVALID_HANDLE_VALUE) { filesize_low = GetFileSize(file, NULL); if (!(filesize_low == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)) { section = CreateFileMappingA(file, NULL, PAGE_READONLY, 0, 0, NULL); CloseHandle(file); if (section != NULL) { map = MapViewOfFile(section, FILE_MAP_READ, 0, 0, 0); CloseHandle(section); if (map != NULL) ret = 0; } } } if (ret == -1) { cc_log("Failed to open preprocessor output %s\n", fname); stats_update(STATS_PREPROCESSOR); return -1; } /* pass it through the unifier */ unify((unsigned char *)map, filesize_low); UnmapViewOfFile(map); return 0; #else int fd; struct stat st; char *map; fd = open(fname, O_RDONLY|O_BINARY); if (fd == -1 || fstat(fd, &st) != 0) { cc_log("Failed to open preprocessor output %s\n", fname); if (fd != -1) close(fd); stats_update(STATS_PREPROCESSOR); return -1; } /* we use mmap() to make it easy to handle arbitrarily long lines in preprocessor output. I have seen lines of over 100k in length, so this is well worth it */ map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); close(fd); if (map == (char *)-1) { cc_log("Failed to mmap %s\n", fname); stats_update(STATS_PREPROCESSOR); return -1; } /* pass it through the unifier */ unify((unsigned char *)map, st.st_size); munmap(map, st.st_size); return 0; #endif } swig-3.0.12/CCache/args.c0000664000175000017500000000454013042756442014646 0ustar williamwilliam/* convenient routines for argument list handling Copyright (C) Andrew Tridgell 2002 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ccache.h" ARGS *args_init(int init_argc, char **init_args) { ARGS *args; int i; args = (ARGS *)x_malloc(sizeof(ARGS)); args->argc = 0; args->argv = (char **)x_malloc(sizeof(char *)); args->argv[0] = NULL; for (i=0;iargv = (char**)x_realloc(args->argv, (args->argc + 2) * sizeof(char *)); args->argv[args->argc] = x_strdup(s); args->argc++; args->argv[args->argc] = NULL; } /* pop the last element off the args list */ void args_pop(ARGS *args, int n) { while (n--) { args->argc--; free(args->argv[args->argc]); args->argv[args->argc] = NULL; } } /* remove the first element of the argument list */ void args_remove_first(ARGS *args) { free(args->argv[0]); memmove(&args->argv[0], &args->argv[1], args->argc * sizeof(args->argv[0])); args->argc--; } /* add an argument into the front of the argument list */ void args_add_prefix(ARGS *args, const char *s) { args->argv = (char**)x_realloc(args->argv, (args->argc + 2) * sizeof(char *)); memmove(&args->argv[1], &args->argv[0], (args->argc+1) * sizeof(args->argv[0])); args->argv[0] = x_strdup(s); args->argc++; } /* strip any arguments beginning with the specified prefix */ void args_strip(ARGS *args, const char *prefix) { int i; for (i=0; iargc; ) { if (strncmp(args->argv[i], prefix, strlen(prefix)) == 0) { free(args->argv[i]); memmove(&args->argv[i], &args->argv[i+1], args->argc * sizeof(args->argv[i])); args->argc--; } else { i++; } } } swig-3.0.12/CCache/README.swig0000664000175000017500000000072013042756442015372 0ustar williamwilliamThis directory contains a version of ccache. The initial version was based on ccache-2.4 plus debian patches 01-02, 04-14, see the debian/patches subdirectory. The ccache-win32-2.4 modifications to ccache-2.4 have also been merged in. Changes have been made to support cacheing the output from SWIG. The ability to cache c/c++ compiler output has been retained. Additional features added are the CCACHE_VERBOSE and CCACHE_SWIG environment variables, see docs. swig-3.0.12/CCache/mdfour.h0000664000175000017500000000231113042756442015205 0ustar williamwilliam/* Unix SMB/Netbios implementation. Version 1.9. a implementation of MD4 designed for use in the SMB authentication protocol Copyright (C) Andrew Tridgell 1997-1998. 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ struct mdfour { uint32 A, B, C, D; uint32 totalN; unsigned char tail[64]; unsigned tail_len; }; void mdfour_begin(struct mdfour *md); void mdfour_update(struct mdfour *md, const unsigned char *in, int n); void mdfour_result(struct mdfour *md, unsigned char *out); void mdfour(unsigned char *out, const unsigned char *in, int n); swig-3.0.12/CCache/README0000664000175000017500000000125513042756442014426 0ustar williamwilliamThis is a re-implementation of "compilercache" in C The original compilercache scripts were by Erik Thiele (erikyyy@erikyyy.de) and I would like to thank him for an excellent piece of work. See http://www.erikyyy.de/compilercache/ for the original shell scripts. I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version. Please see the manual page and documentation at http://ccache.samba.org/ INSTALLATION ------------ Please run: ./configure make make install then read the ccache manual page ----------- Andrew Tridgell http://samba.org/~tridge/ bugs@ccache.samba.org swig-3.0.12/CCache/ccache.yo0000664000175000017500000004202713042756442015327 0ustar williamwilliamwhenman( COMMENT(html output not great if included when using html2doc) manpage(ccache-swig)(1)()()() ) whenhtml(htmlcommand( ccache-swig(1) manpage

Using SWIG with ccache - ccache-swig(1) manpage

)) manpagename(ccache-swig)(a fast compiler cache) whenhtml(htmlcommand( ccache-swig - a fast compiler cache )) manpagesynopsis() ccache-swig [OPTION] ccache-swig [COMPILER OPTIONS] [COMPILER OPTIONS] manpagedescription() ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. ccache and ccache-swig are used interchangeably in this document. manpagesection(OPTIONS SUMMARY) Here is a summary of the options to ccache-swig. verb( -s show statistics summary -z zero statistics -c run a cache cleanup -C clear the cache completely -F set maximum files in cache -M set maximum size of cache (use G, M or K) -h this help page -V print version number ) manpageoptions() These options only apply when you invoke ccache as "ccache-swig". When invoked as a compiler none of these options apply. In that case your normal compiler options apply and you should refer to your compilers documentation. startdit() dit(bf(-h)) Print a options summary page dit(bf(-s)) Print the current statistics summary for the cache. The statistics are stored spread across the subdirectories of the cache. Using "ccache-swig -s" adds up the statistics across all subdirectories and prints the totals. dit(bf(-z)) Zero the cache statistics. dit(bf(-V)) Print the ccache version number dit(bf(-c)) Clean the cache and re-calculate the cache file count and size totals. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile. This option is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate. dit(bf(-C)) Clear the entire cache, removing all cached files. dit(bf(-F )) This sets the maximum number of files allowed in the cache. The value is stored inside the cache directory and applies to all future compiles. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16. dit(bf(-M )) This sets the maximum cache size. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value. The default is gigabytes. The actual value stored is rounded down to the nearest multiple of 16 kilobytes. enddit() manpagesection(INSTALLATION) There are two ways to use ccache. You can either prefix your compile commands with "ccache-swig" or you can create a symbolic link between ccache-swig and the names of your compilers. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects. The second method is most useful for when you wish to use ccache for all your compiles. To install for usage by the first method just copy ccache-swig to somewhere in your path. To install for the second method do something like this: verb( cp ccache-swig /usr/local/bin/ ln -s /usr/local/bin/ccache-swig /usr/local/bin/gcc ln -s /usr/local/bin/ccache-swig /usr/local/bin/g++ ln -s /usr/local/bin/ccache-swig /usr/local/bin/cc ln -s /usr/local/bin/ccache-swig /usr/local/bin/swig ) This will work as long as /usr/local/bin comes before the path to gcc (which is usually in /usr/bin). After installing you may wish to run "which gcc" to make sure that the correct link is being used. Note! Do not use a hard link, use a symbolic link. A hardlink will cause "interesting" problems. manpagesection(EXTRA OPTIONS) When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option '--ccache-skip'. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is. The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things). The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C file). By using --ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option. manpagesection(ENVIRONMENT VARIABLES) ccache uses a number of environment variables to control operation. In most cases you won't need any of these as the defaults will be fine. startdit() dit(bf(CCACHE_DIR)) the CCACHE_DIR environment variable specifies where ccache will keep its cached compiler output. The default is "$HOME/.ccache". dit(bf(CCACHE_TEMPDIR)) the CCACHE_TEMPDIR environment variable specifies where ccache will put temporary files. The default is the same as CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same filesystem as the CCACHE_DIR path, so that renames of files between the two directories can work. dit(bf(CCACHE_LOGFILE)) If you set the CCACHE_LOGFILE environment variable then ccache will write some log information on cache hits and misses in that file. This is useful for tracking down problems. dit(bf(CCACHE_VERBOSE)) If you set the CCACHE_VERBOSE environment variable then ccache will display on stdout all the compiler invocations that it makes. This can useful for debugging unexpected problems. dit(bf(CCACHE_PATH)) You can optionally set CCACHE_PATH to a colon separated path where ccache will look for the real compilers. If you don't do this then ccache will look for the first executable matching the compiler name in the normal PATH that isn't a symbolic link to ccache itself. dit(bf(CCACHE_CC)) You can optionally set CCACHE_CC to force the name of the compiler to use. If you don't do this then ccache works it out from the command line. dit(bf(CCACHE_PREFIX)) This option adds a prefix to the command line that ccache runs when invoking the compiler. Also see the section below on using ccache with distcc. dit(bf(CCACHE_DISABLE)) If you set the environment variable CCACHE_DISABLE then ccache will just call the real compiler, bypassing the cache completely. dit(bf(CCACHE_READONLY)) the CCACHE_READONLY environment variable tells ccache to attempt to use existing cached object files, but not to try to add anything new to the cache. If you are using this because your CCACHE_DIR is read-only, then you may find that you also need to set CCACHE_TEMPDIR as otherwise ccache will fail to create the temporary files. dit(bf(CCACHE_CPP2)) If you set the environment variable CCACHE_CPP2 then ccache will not use the optimisation of avoiding the 2nd call to the pre-processor by compiling the pre-processed output that was used for finding the hash in the case of a cache miss. This is primarily a debugging option, although it is possible that some unusual compilers will have problems with the intermediate filename extensions used in this optimisation, in which case this option could allow ccache to be used. dit(bf(CCACHE_NOCOMPRESS)) If you set the environment variable CCACHE_NOCOMPRESS then there is no compression used on files that go into the cache. However, this setting has no effect on how files are retrieved from the cache, compressed results will still be usable. dit(bf(CCACHE_NOSTATS)) If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile. dit(bf(CCACHE_NLEVELS)) The environment variable CCACHE_NLEVELS allows you to choose the number of levels of hash in the cache directory. The default is 2. The minimum is 1 and the maximum is 8. dit(bf(CCACHE_HARDLINK)) If you set the environment variable CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like 'make' that rely on modification times. Hard links are never made for compressed cache files. dit(bf(CCACHE_RECACHE)) This forces ccache to not use any cached results, even if it finds them. New results are still cached, but existing cache entries are ignored. dit(bf(CCACHE_UMASK)) This sets the umask for ccache and all child processes (such as the compiler). This is mostly useful when you wish to share your cache with other users. Note that this also affects the file permissions set on the object files created from your compilations. dit(bf(CCACHE_HASHDIR)) This tells ccache to hash the current working directory when calculating the hash that is used to distinguish two compiles. This prevents a problem with the storage of the current working directory in the debug info of a object file, which can lead ccache to give a cached object file that has the working directory in the debug info set incorrectly. This option is off by default as the incorrect setting of this debug info rarely causes problems. If you strike problems with gdb not using the correct directory then enable this option. dit(bf(CCACHE_UNIFY)) If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor output if -g is not used in the compile. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only. Note that using CCACHE_UNIFY changes the hash, so cached compiles with CCACHE_UNIFY set cannot be used when CCACHE_UNIFY is not set and vice versa. The reason the unifier is off by default is that it can give incorrect line number information in compiler warning messages. dit(bf(CCACHE_EXTENSION)) Normally ccache tries to automatically determine the extension to use for intermediate C pre-processor files based on the type of file being compiled. Unfortunately this sometimes doesn't work, for example when using the aCC compiler on HP-UX. On systems like this you can use the CCACHE_EXTENSION option to override the default. On HP-UX set this environment variable to "i" if you use the aCC compiler. dit(bf(CCACHE_STRIPC)) If you set the environment variable CCACHE_STRIPC then ccache will strip the -c option when invoking the preprocessor. This option is primarily for the Sun Workshop C++ compiler as without this option an unwarranted warning is displayed: CC: Warning: "-E" redefines product from "object" to "source (stdout)" when -E and -c is used together. dit(bf(CCACHE_SWIG)) When using SWIG as the compiler and it does not have 'swig' in the executable name, then the CCACHE_SWIG environment variable needs to be set in order for ccache to work correctly with SWIG. The use of CCACHE_CPP2 is also recommended for SWIG due to some preprocessor quirks, however, use of CCACHE_CPP2 can often be skipped -- check your generated code with and without this option set. Known problems are using preprocessor directives within %inline blocks and the use of '#pragma SWIG'. enddit() manpagesection(CACHE SIZE MANAGEMENT) By default ccache has a one gigabyte limit on the cache size and no maximum number of files. You can set a different limit using the "ccache -M" and "ccache -F" options, which set the size and number of files limits. When these limits are reached ccache will reduce the cache to 20% below the numbers you specified in order to avoid doing the cache clean operation too often. manpagesection(CACHE COMPRESSION) By default on most platforms ccache will compress all files it puts into the cache using the zlib compression. While this involves a negligible performance slowdown, it significantly increases the number of files that fit in the cache. You can turn off compression setting the CCACHE_NOCOMPRESS environment variable. manpagesection(HOW IT WORKS) The basic idea is to detect when you are compiling exactly the same code a 2nd time and use the previously compiled output. You detect that it is the same code by forming a hash of: itemization( it() the pre-processor output from running the compiler with -E it() the command line options it() the real compilers size and modification time it() any stderr output generated by the compiler ) These are hashed using md4 (a strong hash) and a cache file is formed based on that hash result. When the same compilation is done a second time ccache is able to supply the correct compiler output (including all warnings etc) from the cache. ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache. If you ever discover a case where ccache changes the output of your compiler then please let me know. manpagesection(USING CCACHE WITH DISTCC) distcc is a very useful program for distributing compilation across a range of compiler servers. It is often useful to combine distcc with ccache, so that compiles that are done are sped up by distcc, but that ccache avoids the compile completely where possible. To use distcc with ccache I recommend using the CCACHE_PREFIX option. You just need to set the environment variable CCACHE_PREFIX to 'distcc' and ccache will prefix the command line used with the compiler with the command 'distcc'. manpagesection(SHARING A CACHE) A group of developers can increase the cache hit rate by sharing a cache directory. The hard links however cause unwanted side effects, as all links to a cached file share the file's modification timestamp. This results in false dependencies to be triggered by timestamp-based build systems whenever another user links to an existing file. Typically, users will see that their libraries and binaries are relinked without reason. To share a cache without side effects, the following conditions need to be met: itemization( it() Use the same bf(CCACHE_DIR) environment variable setting it() Unset the bf(CCACHE_HARDLINK) environment variable it() Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group. it() Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache). it() Make sure that the setgid bit is set on all directories in the cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this. it() Set bf(CCACHE_NOCOMPRESS) for all users, if there are users with versions of ccache that do not support compression. ) manpagesection(HISTORY) ccache was inspired by the compilercache shell script script written by Erik Thiele and I would like to thank him for an excellent piece of work. See url(http://www.erikyyy.de/compilercache/)(http://www.erikyyy.de/compilercache/) for the Erik's scripts. ccache-swig is a port of the original ccache with support added for use with SWIG. I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version. manpagesection(DIFFERENCES FROM COMPILERCACHE) The biggest differences between Erik's compilercache script and ccache are: itemization( it() ccache is written in C, which makes it a bit faster (calling out to external programs is mostly what slowed down the scripts). it() ccache can automatically find the real compiler it() ccache keeps statistics on hits/misses it() ccache can do automatic cache management it() ccache can cache compiler output that includes warnings. In many cases this gives ccache a much higher cache hit rate. it() ccache can handle a much wider ranger of compiler options it() ccache avoids a double call to cpp on a cache miss ) manpagesection(CREDITS) Thanks to the following people for their contributions to ccache itemization( it() Erik Thiele for the original compilercache script it() Luciano Rocha for the idea of compiling the pre-processor output to avoid a 2nd cpp pass it() Paul Russell for many suggestions and the debian packaging ) manpageauthor() ccache was written by Andrew Tridgell url(http://samba.org/~tridge/)(http://samba.org/~tridge/). ccache was adapted to create ccache-swig for use with SWIG by William Fulton. If you wish to report a problem or make a suggestion then please email the SWIG developers on the swig-devel mailing list, see url(http://www.swig.org/mail.html)(http://www.swig.org/mail.html) ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details. whenhtml(htmlcommand( )) swig-3.0.12/CCache/web/0000775000175000017500000000000013042756442014320 5ustar williamwilliamswig-3.0.12/CCache/web/index.html0000664000175000017500000001237713042756442016327 0ustar williamwilliam ccache

ccache

ccache is a compiler cache. It acts as a caching pre-processor to C/C++ compilers, using the -E compiler switch and a hash to detect when a compilation can be satisfied from cache. This often results in a 5 to 10 times speedup in common compilations.

The idea came from Erik Thiele wrote the original compilercache program as a bourne shell script. ccache is a re-implementation of Erik's idea in C with more features and better performance.

Latest release

The latest release is ccache 2.4.
  • Added CCACHE_READONLY option
  • Added CCACHE_TEMPDIR option
  • fixed handling of hard-linked compilers on AIX
  • added O_BINARY support, to try and support win32 compiles
  • show cache directory in stats output
  • fixed handling of HOME environment variable
See the manual page for details on the new options.

You can get this release from the download directory

NOTE! This release changes the hash input slighly, so you will probably find that you will not get any hits against your existing cache when you upgrade.

Why bother?

Why bother with a compiler cache? If you ever run "make clean; make" then you can probably benefit from ccache. It is very common for developers to do a clean build of a project for a whole host of reasons, and this throws away all the information from your previous compiles.

By using ccache you can get exactly the same effect as "make clean; make" but much faster. It also helps a lot when doing RPM builds, as RPM can make doing incremental builds tricky.

I put the effort into writing ccache for 2 reasons. The first is the Samba build farm (http://build.samba.org/) which constantly does clean builds of Samba on about 30 machines after each CVS commit. On some of those machines the build took over an hour. By using ccache we get the same effect as clean builds but about 6 times faster.

The second reason is the autobuild system I used to run for Quantum. That system builds our whole Linux based OS from scratch after every CVS commit to catch compilation problems quickly. Using ccache those builds are much faster.

Is it safe?

Yes. The most important aspect of a compiler cache is to always produce exactly the same output that the real compiler would produce. The includes providing exactly the same object files and exactly the same compiler warnings that would be produced if you use the real compiler. The only way you should be able to tell that you are using ccache is the speed.

I have coded ccache very carefully to try to provide these guarantees.

Features

  • keeps statistics on hits/misses
  • automatic cache size management
  • can cache compiles that generate warnings
  • easy installation
  • very low overhead
  • uses hard links where possible to avoid copies

Documentation

See the manual page

Performance

Here are some results for compiling Samba on my Linux laptop. I have also included the results of using Erik's compilercache program (version 1.0.10) for comparison.

    ccache  compilercache
normal 13m 4s 13m 4s
uncached 13m 15s 15m 41s
cached 2m 45s 4m 26s

How to use it

You can use ccache in two ways. The first is just to prefix your compile commands with "ccache". For example, you could change the "CC=gcc" line in your Makefile to be "CC=ccache gcc".

Alternatively, you can create symbolic links from your compilers name to ccache. This allows you to use ccache without any changes to your build system.

Download

You can download the latest release from the download directory.

For the bleeding edge, you can fetch ccache via CVS or rsync. To fetch via cvs use the following command:

  cvs -d :pserver:cvs@pserver.samba.org:/cvsroot co ccache
To fetch via rsync use this command:
  rsync -Pavz samba.org::ftp/unpacked/ccache .

Related projects

Here are some related programs you may find interesting
  • distcc - a distributed compilation system
  • cachecc1 - a gcc specific cache
  • gocache - a cross platform compiler cache

Mailing list

A mailing list is available for discussion of ccache.


Andrew Tridgell
bugs@ccache.samba.org
swig-3.0.12/Doc/0000775000175000017500000000000013042756442013142 5ustar williamwilliamswig-3.0.12/Doc/Manual/0000775000175000017500000000000013042756703014357 5ustar williamwilliamswig-3.0.12/Doc/Manual/Pike.html0000664000175000017500000001424513042756672016150 0ustar williamwilliam SWIG and Pike

35 SWIG and Pike

This chapter describes SWIG support for Pike. As of this writing, the SWIG Pike module is still under development and is not considered ready for prime time. The Pike module is being developed against the Pike 7.4.10 release and may not be compatible with previous versions of Pike.

This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

35.1 Preliminaries

35.1.1 Running SWIG

Suppose that you defined a SWIG module such as the following:

%module example

%{
#include "example.h"
%}

int fact(int n);

To build a C extension module for Pike, run SWIG using the -pike option :

$ swig -pike example.i

If you're building a C++ extension, be sure to add the -c++ option:

$ swig -c++ -pike example.i

This creates a single source file named example_wrap.c (or example_wrap.cxx, if you ran SWIG with the -c++ option). The SWIG-generated source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option:

$ swig -pike -o pseudonym.c example.i

35.1.2 Getting the right header files

In order to compile the C/C++ wrappers, the compiler needs to know the path to the Pike header files. These files are usually contained in a directory such as

/usr/local/pike/7.4.10/include/pike

There doesn't seem to be any way to get Pike itself to reveal the location of these files, so you may need to hunt around for them. You're looking for files with the names global.h, program.h and so on.

35.1.3 Using your module

To use your module, simply use Pike's import statement:

$ pike
Pike v7.4 release 10 running Hilfe v3.5 (Incremental Pike Frontend)
> import example;
> fact(4);
(1) Result: 24

35.2 Basic C/C++ Mapping

35.2.1 Modules

All of the code for a given SWIG module is wrapped into a single Pike module. Since the name of the shared library that implements your module ultimately determines the module's name (as far as Pike is concerned), SWIG's %module directive doesn't really have any significance.

35.2.2 Functions

Global functions are wrapped as new Pike built-in functions. For example,

%module example

int fact(int n);

creates a new built-in function example.fact(n) that works exactly as you'd expect it to:

> import example;
> fact(4);
(1) Result: 24

35.2.3 Global variables

Global variables are currently wrapped as a pair of functions, one to get the current value of the variable and another to set it. For example, the declaration

%module example

double Foo;

will result in two functions, Foo_get() and Foo_set():

> import example;
> Foo_get();
(1) Result: 3.000000
> Foo_set(3.14159);
(2) Result: 0
> Foo_get();
(3) Result: 3.141590

35.2.4 Constants and enumerated types

Enumerated types in C/C++ declarations are wrapped as Pike constants, not as Pike enums.

35.2.5 Constructors and Destructors

Constructors are wrapped as create() methods, and destructors are wrapped as destroy() methods, for Pike classes.

35.2.6 Static Members

Since Pike doesn't support static methods or data for Pike classes, static member functions in your C++ classes are wrapped as regular functions and static member variables are wrapped as pairs of functions (one to get the value of the static member variable, and another to set it). The names of these functions are prepended with the name of the class. For example, given this C++ class declaration:

class Shape
{
public:
    static void print();
    static int nshapes;
};

SWIG will generate a Shape_print() method that invokes the static Shape::print() member function, as well as a pair of methods, Shape_nshapes_get() and Shape_nshapes_set(), to get and set the value of Shape::nshapes.

swig-3.0.12/Doc/Manual/Arguments.html0000664000175000017500000003051413042756671017221 0ustar williamwilliam Argument Handling

10 Argument Handling

In Chapter 3, SWIG's treatment of basic datatypes and pointers was described. In particular, primitive types such as int and double are mapped to corresponding types in the target language. For everything else, pointers are used to refer to structures, classes, arrays, and other user-defined datatypes. However, in certain applications it is desirable to change SWIG's handling of a specific datatype. For example, you might want to return multiple values through the arguments of a function. This chapter describes some of the techniques for doing this.

10.1 The typemaps.i library

This section describes the typemaps.i library file--commonly used to change certain properties of argument conversion.

10.1.1 Introduction

Suppose you had a C function like this:

void add(double a, double b, double *result) {
  *result = a + b;
}

From reading the source code, it is clear that the function is storing a value in the double *result parameter. However, since SWIG does not examine function bodies, it has no way to know that this is the underlying behavior.

One way to deal with this is to use the typemaps.i library file and write interface code like this:

// Simple example using typemaps
%module example
%include "typemaps.i"

%apply double *OUTPUT { double *result };
%inline %{
extern void add(double a, double b, double *result);
%}

The %apply directive tells SWIG that you are going to apply a special type handling rule to a type. The "double *OUTPUT" specification is the name of a rule that defines how to return an output value from an argument of type double *. This rule gets applied to all of the datatypes listed in curly braces-- in this case "double *result".

When the resulting module is created, you can now use the function like this (shown for Python):

>>> a = add(3, 4)
>>> print a
7
>>>

In this case, you can see how the output value normally returned in the third argument has magically been transformed into a function return value. Clearly this makes the function much easier to use since it is no longer necessary to manufacture a special double * object and pass it to the function somehow.

Once a typemap has been applied to a type, it stays in effect for all future occurrences of the type and name. For example, you could write the following:

%module example
%include "typemaps.i"

%apply double *OUTPUT { double *result };

%inline %{
extern void add(double a, double b, double *result);
extern void sub(double a, double b, double *result);
extern void mul(double a, double b, double *result);
extern void div(double a, double b, double *result);
%}
...

In this case, the double *OUTPUT rule is applied to all of the functions that follow.

Typemap transformations can even be extended to multiple return values. For example, consider this code:

%include "typemaps.i"
%apply int *OUTPUT { int *width, int *height };

// Returns a pair (width, height)
void getwinsize(int winid, int *width, int *height);

In this case, the function returns multiple values, allowing it to be used like this:

>>> w, h = genwinsize(wid)
>>> print w
400
>>> print h
300
>>>

It should also be noted that although the %apply directive is used to associate typemap rules to datatypes, you can also use the rule names directly in arguments. For example, you could write this:

// Simple example using typemaps
%module example
%include "typemaps.i"

%{
extern void add(double a, double b, double *OUTPUT);
%}
extern void add(double a, double b, double *OUTPUT);

Typemaps stay in effect until they are explicitly deleted or redefined to something else. To clear a typemap, the %clear directive should be used. For example:

%clear double *result;      // Remove all typemaps for double *result

10.1.2 Input parameters

The following typemaps instruct SWIG that a pointer really only holds a single input value:

int *INPUT
short *INPUT
long *INPUT
unsigned int *INPUT
unsigned short *INPUT
unsigned long *INPUT
double *INPUT
float *INPUT

When used, it allows values to be passed instead of pointers. For example, consider this function:

double add(double *a, double *b) {
  return *a+*b;
}

Now, consider this SWIG interface:

%module example
%include "typemaps.i"
...
%{
extern double add(double *, double *);
%}
extern double add(double *INPUT, double *INPUT);

When the function is used in the scripting language interpreter, it will work like this:

result = add(3, 4)

10.1.3 Output parameters

The following typemap rules tell SWIG that pointer is the output value of a function. When used, you do not need to supply the argument when calling the function. Instead, one or more output values are returned.

int *OUTPUT
short *OUTPUT
long *OUTPUT
unsigned int *OUTPUT
unsigned short *OUTPUT
unsigned long *OUTPUT
double *OUTPUT
float *OUTPUT

These methods can be used as shown in an earlier example. For example, if you have this C function :

void add(double a, double b, double *c) {
  *c = a+b;
}

A SWIG interface file might look like this :

%module example
%include "typemaps.i"
...
%inline %{
extern void add(double a, double b, double *OUTPUT);
%}

In this case, only a single output value is returned, but this is not a restriction. An arbitrary number of output values can be returned by applying the output rules to more than one argument (as shown previously).

If the function also returns a value, it is returned along with the argument. For example, if you had this:

extern int foo(double a, double b, double *OUTPUT);

The function will return two values like this:

iresult, dresult = foo(3.5, 2)

10.1.4 Input/Output parameters

When a pointer serves as both an input and output value you can use the following typemaps :

int *INOUT
short *INOUT
long *INOUT
unsigned int *INOUT
unsigned short *INOUT
unsigned long *INOUT
double *INOUT
float *INOUT

A C function that uses this might be something like this:

void negate(double *x) {
  *x = -(*x);
}

To make x function as both and input and output value, declare the function like this in an interface file :

%module example
%include "typemaps.i"
...
%{
extern void negate(double *);
%}
extern void negate(double *INOUT);

Now within a script, you can simply call the function normally :

a = negate(3);         # a = -3 after calling this

One subtle point of the INOUT rule is that many scripting languages enforce mutability constraints on primitive objects (meaning that simple objects like integers and strings aren't supposed to change). Because of this, you can't just modify the object's value in place as the underlying C function does in this example. Therefore, the INOUT rule returns the modified value as a new object rather than directly overwriting the value of the original input object.

Compatibility note : The INOUT rule used to be known as BOTH in earlier versions of SWIG. Backwards compatibility is preserved, but deprecated.

10.1.5 Using different names

As previously shown, the %apply directive can be used to apply the INPUT, OUTPUT, and INOUT typemaps to different argument names. For example:

// Make double *result an output value
%apply double *OUTPUT { double *result };

// Make Int32 *in an input value
%apply int *INPUT { Int32 *in };

// Make long *x inout
%apply long *INOUT {long *x};

To clear a rule, the %clear directive is used:

%clear double *result;
%clear Int32 *in, long *x;

Typemap declarations are lexically scoped so a typemap takes effect from the point of definition to the end of the file or a matching %clear declaration.

10.2 Applying constraints to input values

In addition to changing the handling of various input values, it is also possible to use typemaps to apply constraints. For example, maybe you want to insure that a value is positive, or that a pointer is non-NULL. This can be accomplished including the constraints.i library file.

10.2.1 Simple constraint example

The constraints library is best illustrated by the following interface file :

// Interface file with constraints
%module example
%include "constraints.i"

double exp(double x);
double log(double POSITIVE);         // Allow only positive values
double sqrt(double NONNEGATIVE);     // Non-negative values only
double inv(double NONZERO);          // Non-zero values
void   free(void *NONNULL);          // Non-NULL pointers only

The behavior of this file is exactly as you would expect. If any of the arguments violate the constraint condition, a scripting language exception will be raised. As a result, it is possible to catch bad values, prevent mysterious program crashes and so on.

10.2.2 Constraint methods

The following constraints are currently available

POSITIVE                     Any number > 0 (not zero)
NEGATIVE                     Any number < 0 (not zero)
NONNEGATIVE                  Any number >= 0
NONPOSITIVE                  Any number <= 0
NONZERO                      Nonzero number
NONNULL                      Non-NULL pointer (pointers only).

10.2.3 Applying constraints to new datatypes

The constraints library only supports the primitive C datatypes, but it is easy to apply it to new datatypes using %apply. For example :

// Apply a constraint to a Real variable
%apply Number POSITIVE { Real in };

// Apply a constraint to a pointer type
%apply Pointer NONNULL { Vector * };

The special types of "Number" and "Pointer" can be applied to any numeric and pointer variable type respectively. To later remove a constraint, the %clear directive can be used :

%clear Real in;
%clear Vector *;
swig-3.0.12/Doc/Manual/Library.html0000664000175000017500000014266713042756671016675 0ustar williamwilliam SWIG Library

9 SWIG library

To help build extension modules, SWIG is packaged with a library of support files that you can include in your own interfaces. These files often define new SWIG directives or provide utility functions that can be used to access parts of the standard C and C++ libraries. This chapter provides a reference to the current set of supported library files.

Compatibility note: Older versions of SWIG included a number of library files for manipulating pointers, arrays, and other structures. Most these files are now deprecated and have been removed from the distribution. Alternative libraries provide similar functionality. Please read this chapter carefully if you used the old libraries.

9.1 The %include directive and library search path

Library files are included using the %include directive. When searching for files, directories are searched in the following order:

  1. The current directory
  2. Directories specified with the -I command line option
  3. ./swig_lib
  4. SWIG library install location as reported by swig -swiglib, for example /usr/local/share/swig/1.3.30
  5. On Windows, a directory Lib relative to the location of swig.exe is also searched.

Within directories mentioned in points 3-5, SWIG first looks for a subdirectory corresponding to a target language (e.g., python, tcl, etc.). If found, SWIG will search the language specific directory first. This allows for language-specific implementations of library files.

You can ignore the installed SWIG library by setting the SWIG_LIB environment variable. Set the environment variable to hold an alternative library directory.

The directories that are searched are displayed when using -verbose commandline option.

9.2 C Arrays and Pointers

This section describes library modules for manipulating low-level C arrays and pointers. The primary use of these modules is in supporting C declarations that manipulate bare pointers such as int *, double *, or void *. The modules can be used to allocate memory, manufacture pointers, dereference memory, and wrap pointers as class-like objects. Since these functions provide direct access to memory, their use is potentially unsafe and you should exercise caution.

9.2.1 cpointer.i

The cpointer.i module defines macros that can be used to used to generate wrappers around simple C pointers. The primary use of this module is in generating pointers to primitive datatypes such as int and double.

%pointer_functions(type, name)

Generates a collection of four functions for manipulating a pointer type *:

type *new_name()

Creates a new object of type type and returns a pointer to it. In C, the object is created using calloc(). In C++, new is used.

type *copy_name(type value)

Creates a new object of type type and returns a pointer to it. An initial value is set by copying it from value. In C, the object is created using calloc(). In C++, new is used.

type *delete_name(type *obj)

Deletes an object type type.

void name_assign(type *obj, type value)

Assigns *obj = value.

type name_value(type *obj)

Returns the value of *obj.

When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

Here is a simple example of using %pointer_functions():

%module example
%include "cpointer.i"

/* Create some functions for working with "int *" */
%pointer_functions(int, intp);

/* A function that uses an "int *" */
void add(int x, int y, int *result);

Now, in Python:

>>> import example
>>> c = example.new_intp()     # Create an "int" for storing result
>>> example.add(3, 4, c)       # Call function
>>> example.intp_value(c)      # Dereference
7
>>> example.delete_intp(c)     # Delete

%pointer_class(type, name)

Wraps a pointer of type * inside a class-based interface. This interface is as follows:

struct name {
  name();                            // Create pointer object
  ~name();                           // Delete pointer object
  void assign(type value);           // Assign value
  type value();                      // Get value
  type *cast();                      // Cast the pointer to original type
  static name *frompointer(type *);  // Create class wrapper from existing
                                     // pointer
};

When using this macro, type is restricted to a simple type name like int, float, or Foo. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, the "class" may be transparently passed to any function that expects the pointer.

If the target language does not support proxy classes, the use of this macro will produce the example same functions as %pointer_functions() macro.

It should be noted that the class interface does introduce a new object or wrap a pointer inside a special structure. Instead, the raw pointer is used directly.

Here is the same example using a class instead:

%module example
%include "cpointer.i"

/* Wrap a class interface around an "int *" */
%pointer_class(int, intp);

/* A function that uses an "int *" */
void add(int x, int y, int *result);

Now, in Python (using proxy classes)

>>> import example
>>> c = example.intp()         # Create an "int" for storing result
>>> example.add(3, 4, c)       # Call function
>>> c.value()                  # Dereference
7

Of the two macros, %pointer_class is probably the most convenient when working with simple pointers. This is because the pointers are access like objects and they can be easily garbage collected (destruction of the pointer object destroys the underlying object).

%pointer_cast(type1, type2, name)

Creates a casting function that converts type1 to type2. The name of the function is name. For example:

%pointer_cast(int *, unsigned int *, int_to_uint);

In this example, the function int_to_uint() would be used to cast types in the target language.

Note: None of these macros can be used to safely work with strings (char * or char **).

Note: When working with simple pointers, typemaps can often be used to provide more seamless operation.

9.2.2 carrays.i

This module defines macros that assist in wrapping ordinary C pointers as arrays. The module does not provide any safety or an extra layer of wrapping--it merely provides functionality for creating, destroying, and modifying the contents of raw C array data.

%array_functions(type, name)

Creates four functions.

type *new_name(int nelements)

Creates a new array of objects of type type. In C, the array is allocated using calloc(). In C++, new [] is used.

type *delete_name(type *ary)

Deletes an array. In C, free() is used. In C++, delete [] is used.

type name_getitem(type *ary, int index)

Returns the value ary[index].

void name_setitem(type *ary, int index, type value)

Assigns ary[index] = value.

When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

Here is an example of %array_functions(). Suppose you had a function like this:

void print_array(double x[10]) {
  int i;
  for (i = 0; i < 10; i++) {
    printf("[%d] = %g\n", i, x[i]);
  }
}

To wrap it, you might write this:

%module example

%include "carrays.i"
%array_functions(double, doubleArray);

void print_array(double x[10]);

Now, in a scripting language, you might write this:

a = new_doubleArray(10)             # Create an array
for i in range(0, 10):
    doubleArray_setitem(a, i, 2*i)  # Set a value
print_array(a)                      # Pass to C
delete_doubleArray(a)               # Destroy array

%array_class(type, name)

Wraps a pointer of type * inside a class-based interface. This interface is as follows:

struct name {
  name(int nelements);                  // Create an array
  ~name();                              // Delete array
  type getitem(int index);              // Return item
  void setitem(int index, type value);  // Set item
  type *cast();                         // Cast to original type
  static name *frompointer(type *);     // Create class wrapper from
                                        // existing pointer
};

When using this macro, type is restricted to a simple type name like int or float. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, it can be transparently passed to any function that expects the pointer.

When combined with proxy classes, the %array_class() macro can be especially useful. For example:

%module example
%include "carrays.i"
%array_class(double, doubleArray);

void print_array(double x[10]);

Allows you to do this:

import example
c = example.doubleArray(10)  # Create double[10]
for i in range(0, 10):
    c[i] = 2*i               # Assign values
example.print_array(c)       # Pass to C

Note: These macros do not encapsulate C arrays inside a special data structure or proxy. There is no bounds checking or safety of any kind. If you want this, you should consider using a special array object rather than a bare pointer.

Note: %array_functions() and %array_class() should not be used with types of char or char *.

9.2.3 cmalloc.i

This module defines macros for wrapping the low-level C memory allocation functions malloc(), calloc(), realloc(), and free().

%malloc(type [, name=type])

Creates a wrapper around malloc() with the following prototype:

type *malloc_name(int nbytes = sizeof(type));

If type is void, then the size parameter nbytes is required. The name parameter only needs to be specified when wrapping a type that is not a valid identifier (e.g., "int *", "double **", etc.).

%calloc(type [, name=type])

Creates a wrapper around calloc() with the following prototype:

type *calloc_name(int nobj =1, int sz = sizeof(type));

If type is void, then the size parameter sz is required.

%realloc(type [, name=type])

Creates a wrapper around realloc() with the following prototype:

type *realloc_name(type *ptr, int nitems);

Note: unlike the C realloc(), the wrapper generated by this macro implicitly includes the size of the corresponding type. For example, realloc_int(p, 100) reallocates p so that it holds 100 integers.

%free(type [, name=type])

Creates a wrapper around free() with the following prototype:

void free_name(type *ptr);

%sizeof(type [, name=type])

Creates the constant:

%constant int sizeof_name = sizeof(type);

%allocators(type [, name=type])

Generates wrappers for all five of the above operations.

Here is a simple example that illustrates the use of these macros:

// SWIG interface
%module example
%include "cmalloc.i"

%malloc(int);
%free(int);

%malloc(int *, intp);
%free(int *, intp);

%allocators(double);

Now, in a script:

>>> from example import *
>>> a = malloc_int()
>>> a
'_000efa70_p_int'
>>> free_int(a)
>>> b = malloc_intp()
>>> b
'_000efb20_p_p_int'
>>> free_intp(b)
>>> c = calloc_double(50)
>>> c
'_000fab98_p_double'
>>> c = realloc_double(100000)
>>> free_double(c)
>>> print sizeof_double
8
>>>

9.2.4 cdata.i

The cdata.i module defines functions for converting raw C data to and from strings in the target language. The primary applications of this module would be packing/unpacking of binary data structures---for instance, if you needed to extract data from a buffer. The target language must support strings with embedded binary data in order for this to work.

const char *cdata(void *ptr, size_t nbytes)

Converts nbytes of data at ptr into a string. ptr can be any pointer.

void memmove(void *ptr, const char *s)

Copies all of the string data in s into the memory pointed to by ptr. The string may contain embedded NULL bytes. This is actually a wrapper to the standard C library memmove function, which is declared as void memmove(void *ptr, const void *src, size_t n). The src and length n parameters are extracted from the language specific string s in the underlying wrapper code.

One use of these functions is packing and unpacking data from memory. Here is a short example:

// SWIG interface
%module example
%include "carrays.i"
%include "cdata.i"

%array_class(int, intArray);

Python example:

>>> a = intArray(10)
>>> for i in range(0, 10):
...    a[i] = i
>>> b = cdata(a, 40)
>>> b
'\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04
\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t'
>>> c = intArray(10)
>>> memmove(c, b)
>>> print c[4]
4
>>>

Since the size of data is not always known, the following macro is also defined:

%cdata(type [, name=type])

Generates the following function for extracting C data for a given type.

char *cdata_name(type* ptr, int nitems)

nitems is the number of items of the given type to extract.

Note: These functions provide direct access to memory and can be used to overwrite data. Clearly they are unsafe.

9.3 C String Handling

A common problem when working with C programs is dealing with functions that manipulate raw character data using char *. In part, problems arise because there are different interpretations of char *---it could be a NULL-terminated string or it could point to binary data. Moreover, functions that manipulate raw strings may mutate data, perform implicit memory allocations, or utilize fixed-sized buffers.

The problems (and perils) of using char * are well-known. However, SWIG is not in the business of enforcing morality. The modules in this section provide basic functionality for manipulating raw C strings.

9.3.1 Default string handling

Suppose you have a C function with this prototype:

char *foo(char *s);

The default wrapping behavior for this function is to set s to a raw char * that refers to the internal string data in the target language. In other words, if you were using a language like Tcl, and you wrote this,

% foo Hello

then s would point to the representation of "Hello" inside the Tcl interpreter. When returning a char *, SWIG assumes that it is a NULL-terminated string and makes a copy of it. This gives the target language its own copy of the result.

There are obvious problems with the default behavior. First, since a char * argument points to data inside the target language, it is NOT safe for a function to modify this data (doing so may corrupt the interpreter and lead to a crash). Furthermore, the default behavior does not work well with binary data. Instead, strings are assumed to be NULL-terminated.

9.3.2 Passing binary data

If you have a function that expects binary data,

size_t parity(char *str, size_t len, size_t initial);

you can wrap the parameters (char *str, size_t len) as a single argument using a typemap. Just do this:

%apply (char *STRING, size_t LENGTH) { (char *str, size_t len) };
...
size_t parity(char *str, size_t len, size_t initial);

Now, in the target language, you can use binary string data like this:

>>> s = "H\x00\x15eg\x09\x20"
>>> parity(s, 0)

In the wrapper function, the passed string will be expanded to a pointer and length parameter. The (char *STRING, int LENGTH) multi-argument typemap is also available in addition to (char *STRING, size_t LENGTH).

9.3.3 Using %newobject to release memory

If you have a function that allocates memory like this,

char *foo() {
  char *result = (char *) malloc(...);
  ...
  return result;
}

then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

To fix the memory leak, use the %newobject directive.

%newobject foo;
...
char *foo();

This will release the result if the appropriate target language support is available. SWIG provides the appropriate "newfree" typemap for char * so that the memory is released, however, you may need to provide your own "newfree" typemap for other types. See Object ownership and %newobject for more details.

9.3.4 cstring.i

The cstring.i library file provides a collection of macros for dealing with functions that either mutate string arguments or which try to output string data through their arguments. An example of such a function might be this rather questionable implementation:

void get_path(char *s) {
  // Potential buffer overflow---uh, oh.
  sprintf(s, "%s/%s", base_directory, sub_directory);
}
...
// Somewhere else in the C program
{
  char path[1024];
  ...
  get_path(path);
  ...
}

(Off topic rant: If your program really has functions like this, you would be well-advised to replace them with safer alternatives involving bounds checking).

The macros defined in this module all expand to various combinations of typemaps. Therefore, the same pattern matching rules and ideas apply.

%cstring_bounded_output(parm, maxsize)

Turns parameter parm into an output value. The output string is assumed to be NULL-terminated and smaller than maxsize characters. Here is an example:

%cstring_bounded_output(char *path, 1024);
...
void get_path(char *path);

In the target language:

>>> get_path()
/home/beazley/packages/Foo/Bar
>>>

Internally, the wrapper function allocates a small buffer (on the stack) of the requested size and passes it as the pointer value. Data stored in the buffer is then returned as a function return value. If the function already returns a value, then the return value and the output string are returned together (multiple return values). If more than maxsize bytes are written, your program will crash with a buffer overflow!

%cstring_chunk_output(parm, chunksize)

Turns parameter parm into an output value. The output string is always chunksize and may contain binary data. Here is an example:

%cstring_chunk_output(char *packet, PACKETSIZE);
...
void get_packet(char *packet);

In the target language:

>>> get_packet()
'\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
>>>

This macro is essentially identical to %cstring_bounded_output. The only difference is that the result is always chunksize characters. Furthermore, the result can contain binary data. If more than maxsize bytes are written, your program will crash with a buffer overflow!

%cstring_bounded_mutable(parm, maxsize)

Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated and smaller than maxsize characters. The output string is also assumed to be NULL-terminated and less than maxsize characters.

%cstring_bounded_mutable(char *ustr, 1024);
...
void make_upper(char *ustr);

In the target language:

>>> make_upper("hello world")
'HELLO WORLD'
>>>

Internally, this macro is almost exactly the same as %cstring_bounded_output. The only difference is that the parameter accepts an input value that is used to initialize the internal buffer. It is important to emphasize that this function does not mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If more than maxsize bytes are written, your program will crash with a buffer overflow!

%cstring_mutable(parm [, expansion])

Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated. An optional parameter expansion specifies the number of extra characters by which the string might grow when it is modified. The output string is assumed to be NULL-terminated and less than the size of the input string plus any expansion characters.

%cstring_mutable(char *ustr);
...
void make_upper(char *ustr);

%cstring_mutable(char *hstr, HEADER_SIZE);
...
void attach_header(char *hstr);

In the target language:

>>> make_upper("hello world")
'HELLO WORLD'
>>> attach_header("Hello world")
'header: Hello world'
>>>

This macro differs from %cstring_bounded_mutable() in that a buffer is dynamically allocated (on the heap using malloc/new). This buffer is always large enough to store a copy of the input value plus any expansion bytes that might have been requested. It is important to emphasize that this function does not directly mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If the function expands the result by more than expansion extra bytes, then the program will crash with a buffer overflow!

%cstring_output_maxsize(parm, maxparm)

This macro is used to handle bounded character output functions where both a char * and a maximum length parameter are provided. As input, a user simply supplies the maximum length. The return value is assumed to be a NULL-terminated string.

%cstring_output_maxsize(char *path, int maxpath);
...
void get_path(char *path, int maxpath);

In the target language:

>>> get_path(1024)
'/home/beazley/Packages/Foo/Bar'
>>>

This macro provides a safer alternative for functions that need to write string data into a buffer. User supplied buffer size is used to dynamically allocate memory on heap. Results are placed into that buffer and returned as a string object.

%cstring_output_withsize(parm, maxparm)

This macro is used to handle bounded character output functions where both a char * and a pointer int * are passed. Initially, the int * parameter points to a value containing the maximum size. On return, this value is assumed to contain the actual number of bytes. As input, a user simply supplies the maximum length. The output value is a string that may contain binary data.

%cstring_output_withsize(char *data, int *maxdata);
...
void get_data(char *data, int *maxdata);

In the target language:

>>> get_data(1024)
'x627388912'
>>> get_data(1024)
'xyzzy'
>>>

This macro is a somewhat more powerful version of %cstring_output_chunk(). Memory is dynamically allocated and can be arbitrary large. Furthermore, a function can control how much data is actually returned by changing the value of the maxparm argument.

%cstring_output_allocate(parm, release)

This macro is used to return strings that are allocated within the program and returned in a parameter of type char **. For example:

void foo(char **s) {
  *s = (char *) malloc(64);
  sprintf(*s, "Hello world\n");
}

The returned string is assumed to be NULL-terminated. release specifies how the allocated memory is to be released (if applicable). Here is an example:

%cstring_output_allocate(char **s, free(*$1));
...
void foo(char **s);

In the target language:

>>> foo()
'Hello world\n'
>>>

%cstring_output_allocate_size(parm, szparm, release)

This macro is used to return strings that are allocated within the program and returned in two parameters of type char ** and int *. For example:

void foo(char **s, int *sz) {
  *s = (char *) malloc(64);
  *sz = 64;
  // Write some binary data
  ...
}

The returned string may contain binary data. release specifies how the allocated memory is to be released (if applicable). Here is an example:

%cstring_output_allocate_size(char **s, int *slen, free(*$1));
...
void foo(char **s, int *slen);

In the target language:

>>> foo()
'\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
>>>

This is the safest and most reliable way to return binary string data in SWIG. If you have functions that conform to another prototype, you might consider wrapping them with a helper function. For example, if you had this:

char  *get_data(int *len);

You could wrap it with a function like this:

void my_get_data(char **result, int *len) {
  *result = get_data(len);
}

Comments:

  • Support for the cstring.i module depends on the target language. Not all SWIG modules currently support this library.
  • Reliable handling of raw C strings is a delicate topic. There are many ways to accomplish this in SWIG. This library provides support for a few common techniques.
  • If used in C++, this library uses new and delete [] for memory allocation. If using ANSI C, the library uses malloc() and free().
  • Rather than manipulating char * directly, you might consider using a special string structure or class instead.

9.4 STL/C++ Library

The library modules in this section provide access to parts of the standard C++ library including the STL. SWIG support for the STL is an ongoing effort. Support is quite comprehensive for some language modules but some of the lesser used modules do not have quite as much library code written.

The following table shows which C++ classes are supported and the equivalent SWIG interface library file for the C++ library.

C++ class C++ Library file SWIG Interface library file
std::auto_ptr memory std_auto_ptr.i
std::deque deque std_deque.i
std::list list std_list.i
std::map map std_map.i
std::pair utility std_pair.i
std::set set std_set.i
std::string string std_string.i
std::vector vector std_vector.i
std::array array (C++11) std_array.i
std::shared_ptr shared_ptr (C++11) std_shared_ptr.i

The list is by no means complete; some language modules support a subset of the above and some support additional STL classes. Please look for the library files in the appropriate language library directory.

9.4.1 std::string

The std_string.i library provides typemaps for converting C++ std::string objects to and from strings in the target scripting language. For example:

%module example
%include "std_string.i"

std::string foo();
void        bar(const std::string &x);

In the target language:

x = foo();                # Returns a string object
bar("Hello World");       # Pass string as std::string

A common problem that people encounter is that of classes/structures containing a std::string. This can be overcome by defining a typemap. For example:

%module example
%include "std_string.i"

%apply const std::string& {std::string* foo};

struct my_struct
{
  std::string foo;
};

In the target language:

x = my_struct();
x.foo="Hello World";      # assign with string
print x.foo;              # print as string

This module only supports types std::string and const std::string &. Pointers and non-const references are left unmodified and returned as SWIG pointers.

This library file is fully aware of C++ namespaces. If you export std::string or rename it with a typedef, make sure you include those declarations in your interface. For example:

%module example
%include "std_string.i"

using namespace std;
typedef std::string String;
...
void foo(string s, const String &t);     // std_string typemaps still applied

9.4.2 std::vector

The std_vector.i library provides support for the C++ std::vector class in the STL. Using this library involves the use of the %template directive. All you need to do is to instantiate different versions of vector for the types that you want to use. For example:

%module example
%include "std_vector.i"

namespace std {
  %template(vectori) vector<int>;
  %template(vectord) vector<double>;
};

When a template vector<X> is instantiated a number of things happen:

  • A class that exposes the C++ API is created in the target language . This can be used to create objects, invoke methods, etc. This class is currently a subset of the real STL vector class.
  • Input typemaps are defined for vector<X>, const vector<X> &, and const vector<X> *. For each of these, a pointer vector<X> * may be passed or a native list object in the target language.
  • An output typemap is defined for vector<X>. In this case, the values in the vector are expanded into a list object in the target language.
  • For all other variations of the type, the wrappers expect to receive a vector<X> * object in the usual manner.
  • An exception handler for std::out_of_range is defined.
  • Optionally, special methods for indexing, item retrieval, slicing, and element assignment may be defined. This depends on the target language.

To illustrate the use of this library, consider the following functions:

/* File : example.h */

#include <vector>
#include <algorithm>
#include <functional>
#include <numeric>

double average(std::vector<int> v) {
  return std::accumulate(v.begin(), v.end(), 0.0)/v.size();
}

std::vector<double> half(const std::vector<double>& v) {
  std::vector<double> w(v);
  for (unsigned int i=0; i<w.size(); i++)
    w[i] /= 2.0;
  return w;
}

void halve_in_place(std::vector<double>& v) {
  std::transform(v.begin(), v.end(), v.begin(),
                 std::bind2nd(std::divides<double>(), 2.0));
}

To wrap with SWIG, you might write the following:

%module example
%{
#include "example.h"
%}

%include "std_vector.i"
// Instantiate templates used by example
namespace std {
  %template(IntVector) vector<int>;
  %template(DoubleVector) vector<double>;
}

// Include the header file with above prototypes
%include "example.h"

Now, to illustrate the behavior in the scripting interpreter, consider this Python example:

>>> from example import *
>>> iv = IntVector(4)         # Create an vector<int>
>>> for i in range(0, 4):
...      iv[i] = i
>>> average(iv)               # Call method
1.5
>>> average([0, 1, 2, 3])        # Call with list
1.5
>>> half([1, 2, 3])             # Half a list
(0.5, 1.0, 1.5)
>>> halve_in_place([1, 2, 3])   # Oops
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: Type error. Expected _p_std__vectorTdouble_t
>>> dv = DoubleVector(4)
>>> for i in range(0, 4):
...       dv[i] = i
>>> halve_in_place(dv)       # Ok
>>> for i in dv:
...       print i
...
0.0
0.5
1.0
1.5
>>> dv[20] = 4.5
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "example.py", line 81, in __setitem__
    def __setitem__(*args): return apply(examplec.DoubleVector___setitem__, args)
IndexError: vector index out of range
>>>

This library module is fully aware of C++ namespaces. If you use vectors with other names, make sure you include the appropriate using or typedef directives. For example:

%include "std_vector.i"

namespace std {
  %template(IntVector) vector<int>;
}

using namespace std;
typedef std::vector Vector;

void foo(vector<int> *x, const Vector &x);

Note: This module makes use of several advanced SWIG features including templatized typemaps and template partial specialization. If you are trying to wrap other C++ code with templates, you might look at the code contained in std_vector.i. Alternatively, you can show them the code if you want to make their head explode.

Note: This module is defined for all SWIG target languages. However argument conversion details and the public API exposed to the interpreter vary.

9.4.3 STL exceptions

Many of the STL wrapper functions add parameter checking and will throw a language dependent error/exception should the values not be valid. The classic example is array bounds checking. The library wrappers are written to throw a C++ exception in the case of error. The C++ exception in turn gets converted into an appropriate error/exception for the target language. By and large this handling should not need customising, however, customisation can easily be achieved by supplying appropriate "throws" typemaps. For example:

%module example
%include "std_vector.i"
%typemap(throws) std::out_of_range {
  // custom exception handler
}
%template(VectInt) std::vector<int>;

The custom exception handler might, for example, log the exception then convert it into a specific error/exception for the target language.

When using the STL it is advisable to add in an exception handler to catch all STL exceptions. The %exception directive can be used by placing the following code before any other methods or libraries to be wrapped:

%include "exception.i"

%exception {
  try {
    $action
  } catch (const std::exception& e) {
    SWIG_exception(SWIG_RuntimeError, e.what());
  }
}

Any thrown STL exceptions will then be gracefully handled instead of causing a crash.

9.4.4 shared_ptr smart pointer

Some target languages have support for handling the shared_ptr reference counted smart pointer. This smart pointer is available in the standard C++11 library as std::shared_ptr. It was also in TR1 as std::tr1::shared_ptr before it was fully standardized. Support for the widely used boost::shared_ptr is also available.

In order to use std::shared_ptr, the std_shared_ptr.i library file should be included:

%include <std_shared_ptr.i>

The pre-standard std::tr1::shared_ptr can be used by including the following macro before including the std_shared_ptr.i library file:

#define SWIG_SHARED_PTR_SUBNAMESPACE tr1
%include <std_shared_ptr.i>

In order to use boost::shared_ptr, the boost_shared_ptr.i library file should be included:

%include <boost_shared_ptr.i>

You can only use one of these variants of shared_ptr in your interface file at a time. and all three variants must be used in conjunction with the %shared_ptr(T) macro, where T is the underlying pointer type equating to usage shared_ptr<T>. The type T must be non-primitive. A simple example demonstrates usage:

%module example
%include <boost_shared_ptr.i>
%shared_ptr(IntValue)

%inline %{
#include <boost/shared_ptr.hpp>

struct IntValue {
  int value;
  IntValue(int v) : value(v) {}
};

static int extractValue(const IntValue &t) {
  return t.value;
}

static int extractValueSmart(boost::shared_ptr<IntValue> t) {
  return t->value;
}
%}

Note that the %shared_ptr(IntValue) declaration occurs after the inclusion of the boost_shared_ptr.i library which provides the macro and, very importantly, before any usage or declaration of the type, IntValue. The %shared_ptr macro provides, a few things for handling this smart pointer, but mostly a number of typemaps. These typemaps override the default typemaps so that the underlying proxy class is stored and passed around as a pointer to a shared_ptr instead of a plain pointer to the underlying type. This approach means that any instantiation of the type can be passed to methods taking the type by value, reference, pointer or as a smart pointer. The interested reader might want to look at the generated code, however, usage is simple and no different handling is required from the target language. For example, a simple use case of the above code from Java would be:

IntValue iv = new IntValue(1234);
int val1 = example.extractValue(iv);
int val2 = example.extractValueSmart(iv);
System.out.println(val1 + " " + val2);

This shared_ptr library works quite differently to SWIG's normal, but somewhat limited, smart pointer handling. The shared_ptr library does not generate extra wrappers, just for smart pointer handling, in addition to the proxy class. The normal proxy class including inheritance relationships is generated as usual. The only real change introduced by the %shared_ptr macro is that the proxy class stores a pointer to the shared_ptr instance instead of a raw pointer to the instance. A proxy class derived from a base which is being wrapped with shared_ptr can and must be wrapped as a shared_ptr too. In other words all classes in an inheritance hierarchy must all be used with the %shared_ptr macro. For example the following code can be used with the base class shown earlier:

%shared_ptr(DerivedIntValue)
%inline %{
struct DerivedIntValue : IntValue {
  DerivedIntValue(int value) : IntValue(value) {}
  ...
};
%}

A shared_ptr of the derived class can now be passed to a method where the base is expected in the target language, just as it can in C++:

DerivedIntValue div = new DerivedIntValue(5678);
int val3 = example.extractValue(div);
int val4 = example.extractValueSmart(div);

If the %shared_ptr macro is omitted for any class in the inheritance hierarchy, SWIG will warn about this and the generated code may or may not result in a C++ compilation error. For example, the following input:

%include "boost_shared_ptr.i"
%shared_ptr(Parent);

%inline %{
  #include <boost/shared_ptr.hpp>
  struct GrandParent {
    virtual ~GrandParent() {}
  };

  struct Parent : GrandParent {
    virtual ~Parent() {}
  };

  struct Child : Parent {
    virtual ~Child() {}
  };
%}

warns about the missing smart pointer information:

example.i:12: Warning 520: Base class 'GrandParent' of 'Parent' is not similarly marked as a smart pointer.
example.i:16: Warning 520: Derived class 'Child' of 'Parent' is not similarly marked as a smart pointer.

Adding the missing %shared_ptr macros will fix this:

%include "boost_shared_ptr.i"
%shared_ptr(GrandParent);
%shared_ptr(Parent);
%shared_ptr(Child);

... as before ...

Note: There is somewhat limited support for %shared_ptr and the director feature and the degrees of success varies among the different target languages. Please help to improve this support by providing patches with improvements.

9.4.5 auto_ptr smart pointer

While std::auto_ptr is deprecated in C++11, some existing code may still be using it, so SWIG provides limited support for this class: std_auto_ptr.i defines the typemaps which apply to the functions returning objects of this type. Any other use of std_auto_ptr.i is not directly supported.

A typical example of use would be

%include <std_auto_ptr.i>

%auto_ptr(Klass)
%inline %{
class Klass {
public:
  // Factory function creating objects of this class:
  static std::auto_ptr<Klass> Create(int value) {
    return std::auto_ptr<Klass>(new Klass(value));
  }

  int getValue() const { return m_value; }

private:
  DerivedIntValue(int value) : m_value(value) {}
  int m_value;
};
%}

The returned objects can be used naturally from the target language, e.g. from C#:

Klass k = Klass.Create(17);
int value = k.getValue();

9.5 Utility Libraries

9.5.1 exception.i

The exception.i library provides a language-independent function for raising a run-time exception in the target language. This library is largely used by the SWIG library writers. If possible, use the error handling scheme available to your target language as there is greater flexibility in what errors/exceptions can be thrown.

SWIG_exception(int code, const char *message)

Raises an exception in the target language. code is one of the following symbolic constants:

SWIG_MemoryError
SWIG_IOError
SWIG_RuntimeError
SWIG_IndexError
SWIG_TypeError
SWIG_DivisionByZero
SWIG_OverflowError
SWIG_SyntaxError
SWIG_ValueError
SWIG_SystemError

message is a string indicating more information about the problem.

The primary use of this module is in writing language-independent exception handlers. For example:

%include "exception.i"
%exception std::vector::getitem {
  try {
    $action
  } catch (std::out_of_range& e) {
    SWIG_exception(SWIG_IndexError, const_cast<char*>(e.what()));
  }
}
swig-3.0.12/Doc/Manual/Lua.html0000664000175000017500000023233113042756672015777 0ustar williamwilliam SWIG and Lua

28 SWIG and Lua

Lua is an extension programming language designed to support general procedural programming with data description facilities. It also offers good support for object-oriented programming, functional programming, and data-driven programming. Lua is intended to be used as a powerful, light-weight configuration language for any program that needs one. Lua is implemented as a library, written in clean C (that is, in the common subset of ANSI C and C++). It's also a really tiny language, less than 6000 lines of code, which compiles to <100 kilobytes of binary code. It can be found at http://www.lua.org

eLua stands for Embedded Lua (can be thought of as a flavor of Lua) and offers the full implementation of the Lua programming language to the embedded world, extending it with specific features for efficient and portable software embedded development. eLua runs on smaller devices like microcontrollers and provides the full features of the regular Lua desktop version. More information on eLua can be found here: http://www.eluaproject.net

28.1 Preliminaries

The current SWIG implementation is designed to work with Lua 5.0.x, 5.1.x and 5.2.x. It should work with later versions of Lua, but certainly not with Lua 4.0 due to substantial API changes. It is possible to either static link or dynamic link a Lua module into the interpreter (normally Lua static links its libraries, as dynamic linking is not available on all platforms). SWIG also has support for eLua starting from eLua 0.8. Due to substantial changes between SWIG 2.x and SWIG 3.0 and unavailability of testing platform, eLua status was downgraded to 'experimental'.

28.2 Running SWIG

Suppose that you defined a SWIG module such as the following:

%module example
%{
#include "example.h"
%}
int gcd(int x, int y);
extern double Foo;

To build a Lua module, run SWIG using the -lua option.

$ swig -lua example.i

If building a C++ extension, add the -c++ option:

$ swig -c++ -lua example.i

This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function "int luaopen_example(lua_State* L)" which must be called to register the module with the Lua interpreter. The name "luaopen_example" depends upon the name of the module.

To build an eLua module, run SWIG using -lua and add either -elua or -eluac.

$ swig -lua -elua example.i

or

$ swig -lua -eluac example.i

The -elua option puts all the C function wrappers and variable get/set wrappers in rotables. It also generates a metatable which will control the access to these variables from eLua. It also offers a significant amount of module size compression. On the other hand, the -eluac option puts all the wrappers in a single rotable. With this option, no matter how huge the module, it will consume no additional microcontroller SRAM (crass compression). There is a catch though: Metatables are not generated with -eluac. To access any value from eLua, one must directly call the wrapper function associated with that value.

28.2.1 Additional command line options

The following table list the additional commandline options available for the Lua module. They can also be seen by using:

swig -lua -help 
Lua specific options
-elua Generates LTR compatible wrappers for smaller devices running elua.
-eluac LTR compatible wrappers in "crass compress" mode for elua.
-nomoduleglobal Do not register the module name as a global variable but return the module table from calls to require.
-no-old-metatable-bindings Disable backward compatibility: old-style binding names generations and a few other things. Explanations are included in appropriate later sections.
-squash-bases Squashes symbols from all inheritance tree of a given class into itself. Emulates pre-SWIG3.0 inheritance. Insignificantly speeds things up, but increases memory consumption.

28.2.2 Compiling and Linking and Interpreter

Normally Lua is embedded into another program and will be statically linked. An extremely simple stand-alone interpreter (min.c) is given below:

#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

extern int luaopen_example(lua_State* L); // declare the wrapped module

int main(int argc, char* argv[])
{
 lua_State *L;
 if (argc<2)
 {
  printf("%s: <filename.lua>\n", argv[0]);
  return 0;
 }
 L=lua_open();
 luaopen_base(L);       // load basic libs (eg. print)
 luaopen_example(L);    // load the wrapped module
 if (luaL_loadfile(L, argv[1])==0) // load and run the file
  lua_pcall(L, 0, 0, 0);
 else
  printf("unable to load %s\n", argv[1]);
 lua_close(L);
 return 0;
}

A much improved set of code can be found in the Lua distribution src/lua/lua.c. Include your module, just add the external declaration & add a #define LUA_EXTRALIBS {"example", luaopen_example}, at the relevant place.

The exact commands for compiling and linking vary from platform to platform. Here is a possible set of commands of doing this:

$ swig -lua example.i -o example_wrap.c
$ gcc -I/usr/include/lua -c min.c -o min.o
$ gcc -I/usr/include/lua -c example_wrap.c -o example_wrap.o
$ gcc -c example.c -o example.o
$ gcc -I/usr/include/lua -L/usr/lib/lua min.o example_wrap.o example.o -o my_lua

For eLua, the source must be built along with the wrappers generated by SWIG. Make sure the eLua source files platform_conf.h and auxmods.h are updated with the entries of your new module. Please note: "mod" is the module name.

/* Sample platform_conf.h */
#define LUA_PLATFORM_LIBS_ROM\
  _ROM( AUXLIB_PIO, luaopen_pio, pio_map )\
  _ROM( AUXLIB_TMR, luaopen_tmr, tmr_map )\
  _ROM( AUXLIB_MOD, luaopen_mod, mod_map )\
  ....
/* Sample auxmods.h */
#define AUXLIB_PIO       "pio"
LUALIB_API int ( luaopen_pio )(lua_State *L );

#define AUXLIB_MOD       "mod"
LUALIB_API int ( luaopen_mod )(lua_State *L );
....

More information on building and configuring eLua can be found here: http://www.eluaproject.net/doc/v0.8/en_building.html

28.2.3 Compiling a dynamic module

Most, but not all platforms support the dynamic loading of modules (Windows & Linux do). Refer to the Lua manual to determine if your platform supports it. For compiling a dynamically loaded module the same wrapper can be used. Assuming you have code you need to link to in a file called example.c, the commands will be something like this:

$ swig -lua example.i -o example_wrap.c
$ gcc -fPIC -I/usr/include/lua -c example_wrap.c -o example_wrap.o
$ gcc -fPIC -c example.c -o example.o
$ gcc -shared -I/usr/include/lua -L/usr/lib/lua example_wrap.o example.o -o example.so

The wrappers produced by SWIG can be compiled and linked with Lua 5.1.x and later. The loading is extremely simple.

require("example")

For those using Lua 5.0.x, you will also need an interpreter with the loadlib function (such as the default interpreter compiled with Lua). In order to dynamically load a module you must call the loadlib function with two parameters: the filename of the shared library, and the function exported by SWIG. Calling loadlib should return the function, which you then call to initialise the module

my_init=loadlib("example.so", "luaopen_example") -- for Unix/Linux
--my_init=loadlib("example.dll", "luaopen_example") -- for Windows
assert(my_init) -- make sure it's not nil
my_init()       -- call the init fn of the lib

Or can be done in a single line of Lua code

assert(loadlib("example.so", "luaopen_example"))()

If the code didn't work, don't panic. The best thing to do is to copy the module and your interpreter into a single directory and then execute the interpreter and try to manually load the module (take care, all this code is case sensitive).

a, b, c=package.loadlib("example.so", "luaopen_example") -- for Unix/Linux
--a, b, c=package.loadlib("example.dll", "luaopen_example") -- for Windows
print(a, b, c)

Note: for Lua 5.0:
The loadlib() function is in the global namespace, not in a package. So it's just loadlib().

if 'a' is a function, this is all working fine, all you need to do is call it

  a()

to load your library which will add a table 'example' with all the functions added.

If it doesn't work, look at the error messages, in particular message 'b'
The specified module could not be found.
Means that is cannot find the module, check your the location and spelling of the module.
The specified procedure could not be found.
Means that it loaded the module, but cannot find the named function. Again check the spelling, and if possible check to make sure the functions were exported correctly.
'loadlib' not installed/supported
Is quite obvious (Go back and consult the Lua documents on how to enable loadlib for your platform).

28.2.4 Using your module

Assuming all goes well, you will be able to this:

$ ./my_lua
> print(example.gcd(4, 6))
2
> print(example.Foo)
3
> example.Foo=4
> print(example.Foo)
4
>

28.3 A tour of basic C/C++ wrapping

By default, SWIG tries to build a very natural Lua interface to your C/C++ code. This section briefly covers the essential aspects of this wrapping.

28.3.1 Modules

The SWIG module directive specifies the name of the Lua module. If you specify `module example', then everything is wrapped into a Lua table 'example' containing all the functions and variables. When choosing a module name, make sure you don't use the same name as a built-in Lua command or standard module name.

28.3.2 Functions

Global functions are wrapped as new Lua built-in functions. For example,

%module example
int fact(int n);

creates a built-in function example.fact(n) that works exactly like you think it does:

> print example.fact(4)
24
>

To avoid name collisions, SWIG create a Lua table which keeps all the functions, constants, classes and global variables in. It is possible to copy the functions, constants and classes (but not variables) out of this and into the global environment with the following code. This can easily overwrite existing functions, so this must be used with care. This option is considered deprecated and will be removed in the near future.

> for k, v in pairs(example) do _G[k]=v end
> print(fact(4))
24
>

It is also possible to rename the module with an assignment.

> e=example
> print(e.fact(4))
24
> print(example.fact(4))
24

28.3.3 Global variables

Global variables (which are linked to C code) are supported, and appear to be just another variable in Lua. However the actual mechanism is more complex. Given a global variable:

%module example
extern double Foo;

SWIG will effectively generate two functions example.Foo_set() and example.Foo_get(). It then adds a metatable to the table 'example' to call these functions at the correct time (when you attempt to set or get examples.Foo). Therefore if you were to attempt to assign the global to another variable, you will get a local copy within the interpreter, which is no longer linked to the C code.

> print(example.Foo)
3
> c=example.Foo   -- c is a COPY of example.Foo, not the same thing
> example.Foo=4
> print(c)
3
> c=5 -- this will not effect the original example.Foo
> print(example.Foo, c)
4    5

It is therefore not possible to 'move' the global variable into the global namespace as it is with functions. It is however, possible to rename the module with an assignment, to make it more convenient.

> e=example
> -- e and example are the same table
> -- so e.Foo and example.Foo are the same thing
> example.Foo=4
> print(e.Foo)
4

If a variable is marked with the %immutable directive then any attempts to set this variable will cause a Lua error. Given a global variable:

%module example
%immutable;
extern double Foo;
%mutable;

SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

> print(e.Foo) -- reading works ok
4
> example.Foo=40 -- but writing does not
This variable is immutable
stack traceback:
        [C]: ?
        [C]: ?
        stdin:1: in main chunk
        [C]: ?

For those people who would rather that SWIG silently ignore the setting of immutables (as previous versions of the Lua bindings did), adding a -DSWIGLUA_IGNORE_SET_IMMUTABLE compile option will remove this.

Unlike earlier versions of the binding, it is now possible to add new functions or variables to the module, just as if it were a normal table. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

> -- example.PI does not exist
> print(example.PI)
nil
> example.PI=3.142 -- new value added
> print(example.PI)
3.142

If you have used the -eluac option for your eLua module, you will have to follow a different approach while manipulating global variables. (This is not applicable for wrappers generated with -elua)

> -- Applicable only with -eluac. (num is defined)
> print(example.num_get())
20
> example.num_set(50) -- new value added
> print(example.num_get())
50

In general, functions of the form "variable_get()" and "variable_set()" are automatically generated by SWIG for use with -eluac.

28.3.4 Constants and enums

Because Lua doesn't really have the concept of constants, C/C++ constants are not really constant in Lua. They are actually just a copy of the value into the Lua interpreter. Therefore they can be changed just as any other value. For example given some constants:

%module example
%constant int ICONST=42;
#define    SCONST      "Hello World"
enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};

This is 'effectively' converted into the following Lua code:

example.ICONST=42
example.SCONST="Hello World"
example.SUNDAY=0
....

Constants are not guaranteed to remain constant in Lua. The name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

If you're using eLua and have used -elua or -eluac to generate your wrapper, macro constants and enums should be accessed through a rotable called "const". In eLua, macro constants and enums are guaranteed to remain constants since they are all contained within a rotable. A regular C constant is accessed from eLua just as if it were a regular global variable, just that the property of value immutability is demonstrated if an attempt at modifying a C constant is made.

> print(example.ICONST)
10
> print(example.const.SUNDAY)
0
> print(example.const.SCONST)
Hello World

28.3.4.1 Constants/enums and classes/structures

Enums are exported into a class table. For example, given some enums:

%module example
enum Days { SUNDAY = 0, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };
struct Test {
  enum { TEST1 = 10, TEST2 = 20 };
#ifdef __cplusplus // There are no static members in C
  static const int ICONST = 12;
#endif
};

There is a slight difference in behaviour wrapping C and C++ code due to the different scoping rules of C and C++. The wrapped C++ code is used as follows from Lua code:

> print(example.SUNDAY)
0
> print(example.Test.TEST1)
10
> print(example.Test.ICONST)
12

Enums within a C struct are in the global namespace and are used as follows from Lua

> print(example.SUNDAY)
0
> -- See the difference here
> print(example.TEST1)
10

Compatibility Note: Versions of SWIG prior to SWIG-3.0.0 did not generate the class table members above. There is no change in the C wrappers, but the following code was the only way to access these constants/enums when wrapping C++ member constants:

> print(example.Test_TEST1)
10
> print(example.Test_ICONST)
12

The old-style bindings are still generated in addition to the new ones. If the -no-old-metatable-bindings option is used, then these old-style bindings are not generated.

It is worth mentioning, that example.Test.TEST1 and example.Test_TEST1 are different entities and changing one does not change the other. Given the fact that these are constantes and they are not supposed to be changed, it is up to you to avoid such issues.

28.3.5 Pointers

C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

%module example

FILE *fopen(const char *filename, const char *mode);
int fputs(const char *, FILE *);
int fclose(FILE *);

When wrapped, you will be able to use the functions in a natural way from Lua. For example:

> f=example.fopen("junk", "w")
> example.fputs("Hello World", f)
> example.fclose(f)

Unlike many scripting languages, Lua has had support for pointers to C/C++ object built in for a long time. They are called 'userdata'. Unlike many other SWIG versions which use some kind of encoded character string, all objects will be represented as a userdata. The SWIG-Lua bindings provides a special function swig_type(), which if given a userdata object will return the type of object pointed to as a string (assuming it was a SWIG wrapped object).

> print(f)
userdata: 003FDA80
> print(swig_type(f))
FILE * -- it's a FILE*

Lua enforces the integrity of its userdata, so it is virtually impossible to corrupt the data. But as the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes & structs (see below). One final note: if a function returns a NULL pointer, this is not encoded as a userdata, but as a Lua nil.

> f=example.fopen("not there", "r") -- this will return a NULL in C
> print(f)
nil

28.3.6 Structures

If you wrap a C structure, it is also mapped to a Lua userdata. By adding a metatable to the userdata, this provides a very natural interface. For example,

struct Point{
  int x, y;
};

is used as follows:

> p=example.new_Point()
> p.x=3
> p.y=5
> print(p.x, p.y)
3       5
>

Similar access is provided for unions and the data members of C++ classes.
C structures can be created using a function new_Point(), and both C structures and C++ classes can be created using just the name Point().

If you print out the value of p in the above example, you will see something like this:

> print(p)
userdata: 003FA320

Like the pointer in the previous section, this is held as a userdata. However, additional features have been added to make this more usable. SWIG effectively creates some accessor/mutator functions to get and set the data. These functions will be added to the userdata's metatable. This provides the natural access to the member variables that were shown above (see end of the document for full details).

const members of a structure are read-only. Data members can also be forced to be read-only using the immutable directive. As with other immutables, setting attempts will be cause an error. For example:

struct Foo {
  ...
  %immutable;
  int x;        // Read-only members
  char *name;
  %mutable;
  ...
};

The mechanism for managing char* members as well as array members is similar to other languages. It is somewhat cumbersome and should probably be better handled by defining of typemaps (described later).

When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

struct Foo {
  int a;
};

struct Bar {
  Foo f;
};

Now, suppose that you access the f attribute of Bar like this:

> b = Bar()
> x = b.f

In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

Bar b;
Foo *x = &b->f;       // Points inside b

Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

> b = Bar()
> b.f.a = 3               -- Modify attribute of structure member
> x = b.f
> x.a = 3                 -- Modifies the same structure

For eLua with the -eluac option, structure manipulation has to be performed with specific structure functions generated by SWIG. Let's say you have the following structure definition:

struct data {
  int x, y;
  double z;
};

> --From eLua
> a = example.new_data()
> example.data_x_set(a, 10)
> example.data_y_set(a, 20)
> print(example.data_x_get(a), example.data_y_get(a))
10 20

In general, functions of the form "new_struct()", "struct_member_get()", "struct_member_set()" and "free_struct()" are automatically generated by SWIG for each structure defined in C. (Please note: This doesn't apply for modules generated with the -elua option)

28.3.7 C++ classes

C++ classes are wrapped by a Lua userdata as well. For example, if you have this class,

class List {
public:
  List();
  ~List();
  int  search(char *item);
  void insert(char *item);
  void remove(char *item);
  char *get(int n);
  int  length;
};

you can use it in Lua like this:

> l = example.List()
> l:insert("Ale")
> l:insert("Stout")
> l:insert("Lager")
> print(l:get(1))
Stout
> print(l:length)
3
>

(Note: for calling methods of a class, you use class:method(args), not class.method(args), it's an easy mistake to make. However for data attributes it is class.attribute)

Class data members are accessed in the same manner as C structures. Static class members present a special problem for Lua, as Lua doesn't have support for such features. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

class Spam {
public:
  static void foo();
  static int bar;
};

In Lua, C++ static members can be accessed as follows:

> example.Spam.foo()            -- calling Spam::foo()
> a=example.Spam.bar            -- reading Spam::bar 
> example.Spam.bar=b            -- writing to Spam::bar

It is not (currently) possible to access static members of an instance:

> s=example.Spam()              -- s is a Spam instance
> s.foo()                       -- Spam::foo() via an instance
                                -- does NOT work

Compatibility Note: In versions prior to SWIG-3.0.0 only the following names would work:

> example.Spam_foo()            -- calling Spam::foo()
> a=example.Spam_bar            -- reading Spam::bar 
> example.Spam_bar=b            -- writing to Spam::bar

Both style names are generated by default now. However, if the -no-old-metatable-bindings option is used, then the backward compatible names are not generated in addition to ordinary ones.

28.3.8 C++ inheritance

SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

class Foo {
...
};

class Bar : public Foo {
...
};

And if you have functions like this

void spam(Foo *f);

then the function spam() accepts a Foo pointer or a pointer to any class derived from Foo.

It is safe to use multiple inheritance with SWIG.

28.3.9 Pointers, references, values, and arrays

In C++, there are many different ways a function might receive and manipulate objects. For example:

void spam1(Foo *x);      // Pass by pointer
void spam2(Foo &x);      // Pass by reference
void spam3(Foo x);       // Pass by value
void spam4(Foo x[]);     // Array of objects

In SWIG, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

> f = Foo()           -- Create a Foo
> spam1(f)            -- Ok. Pointer
> spam2(f)            -- Ok. Reference
> spam3(f)            -- Ok. Value.
> spam4(f)            -- Ok. Array (1 element)

Similar behaviour occurs for return values. For example, if you had functions like this,

Foo *spam5();
Foo &spam6();
Foo  spam7();

then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Lua will release this memory when the return value is garbage collected). The other two are pointers which are assumed to be managed by the C code and so will not be garbage collected.

28.3.10 C++ overloaded functions

C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

void foo(int);
void foo(char *c);

You can use them in Lua in a straightforward manner:

> foo(3)           -- foo(int)
> foo("Hello")     -- foo(char *c)

However due to Lua's coercion mechanism is can sometimes do strange things.

> foo("3")           -- "3" can be coerced into an int, so it calls foo(int)!

As this coercion mechanism is an integral part of Lua, there is no easy way to get around this other than renaming of functions (see below).

Similarly, if you have a class like this,

class Foo {
public:
  Foo();
  Foo(const Foo &);
  ...
};

you can write Lua code like this:

> f = Foo()          -- Create a Foo
> g = Foo(f)         -- Copy f

Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

void spam(int);
void spam(short);

or

void foo(Bar *b);
void foo(Bar &b);

If declarations such as these appear, you will get a warning message like this:

example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
example.i:11: Warning 509: as it is shadowed by spam(int).

To fix this, you either need to ignore or rename one of the methods. For example:

%rename(spam_short) spam(short);
...
void spam(int);
void spam(short);   // Accessed as spam_short

or

%ignore spam(short);
...
void spam(int);
void spam(short);   // Ignored

SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

Please refer to the "SWIG and C++" chapter for more information about overloading.

Dealing with the Lua coercion mechanism, the priority is roughly (integers, floats, strings, userdata). But it is better to rename the functions rather than rely upon the ordering.

28.3.11 C++ operators

Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

class Complex {
private:
  double rpart, ipart;
public:
  Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
  Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
  Complex &operator=(const Complex &c);
  Complex operator+(const Complex &c) const;
  Complex operator-(const Complex &c) const;
  Complex operator*(const Complex &c) const;
  Complex operator-() const;

  double re() const { return rpart; }
  double im() const { return ipart; }
};

When wrapped, it works like you expect:

> c = Complex(3, 4)
> d = Complex(7, 8)
> e = c + d
> e:re()
10.0
> e:im()
12.0

One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

class Complex {
...
friend Complex operator+(double, const Complex &c);
...
};

then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

%rename(Complex_add_dc) operator+(double, const Complex &);
...
Complex operator+(double, const Complex &c);

There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

Also, be aware that certain operators don't map cleanly to Lua, and some Lua operators don't map cleanly to C++ operators. For instance, overloaded assignment operators don't map to Lua semantics and will be ignored, and C++ doesn't support Lua's concatenation operator (..).

In order to keep maximum compatibility within the different languages in SWIG, the Lua bindings uses the same set of operator names as python. Although internally it renames the functions to something else (on order to work with Lua).

The current list of operators which can be overloaded (and the alternative function names) are:

  • __add__ operator+
  • __sub__ operator-
  • __mul__ operator *
  • __div__ operator/
  • __unm__ unary minus
  • __call__ operator() (often used in functor classes)
  • __pow__ the exponential fn (no C++ equivalent, Lua uses ^)
  • __concat__ the concatenation operator (Lua's ..)
  • __eq__ operator==
  • __lt__ operator<
  • __le__ operator<=

Note: in Lua, only the equals, less than, and less than equals operators are defined. The other operators (!=, >, >=) are achieved by using a logical not applied to the results of other operators.

The following operators cannot be overloaded (mainly because they are not supported in Lua)

  • ++ and --
  • +=, -=, *= etc
  • % operator (you have to use math.mod)
  • assignment operator
  • all bitwise/logical operations

SWIG also accepts the __str__() member function which converts an object to a string. This function should return a const char*, preferably to static memory. This will be used for the print() and tostring() functions in Lua. Assuming the complex class has a function

const char* __str__()
{
        static char buffer[255];
        sprintf(buffer, "Complex(%g, %g)", this->re(), this->im());
        return buffer;
}

Then this will support the following code in Lua

> c = Complex(3, 4)
> d = Complex(7, 8)
> e = c + d
> print(e)
Complex(10, 12)
> s=tostring(e) -- s is the number in string form
> print(s)
Complex(10, 12)

It is also possible to overload the operator[], but currently this cannot be automatically performed. To overload the operator[] you need to provide two functions, __getitem__() and __setitem__()

class Complex
{
        //....
        double __getitem__(int i)const; // i is the index, returns the data
        void __setitem__(int i, double d); // i is the index, d is the data
};

C++ operators are mapped to Lua predefined metafunctions. Class inherits from its bases the following list of metafunctions ( thus inheriting the folloging operators and pseudo-operators):

  • __add__
  • __sub__
  • __mul__
  • __div__
  • __unm__
  • __mod__
  • __call__
  • __pow__
  • __concat__
  • __eq__
  • __lt__
  • __le__
  • __len__
  • __getitem__
  • __setitem__
  • __tostring used internally by Lua for tostring() function. __str__ is mapped to this function

No other lua metafunction is inherited. For example, __gc is not inherited and must be redefined in every class. __tostring is subject to a special handling. If absent in class and in class bases, a default one will be provided by SWIG.

28.3.12 Class extension with %extend

One of the more interesting features of SWIG is that it can extend structures and classes with new methods. In the previous section, the Complex class would have benefited greatly from an __str__() method as well as some repairs to the operator overloading. It can also be used to add additional functions to the class if they are needed.

Take the original Complex class

class Complex {
private:
  double rpart, ipart;
public:
  Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
  Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
  Complex &operator=(const Complex &c);
  Complex operator+(const Complex &c) const;
  Complex operator-(const Complex &c) const;
  Complex operator*(const Complex &c) const;
  Complex operator-() const;

  double re() const { return rpart; }
  double im() const { return ipart; }
};

Now we extend it with some new code

%extend Complex {
  const char *__str__() {
    static char tmp[1024];
    sprintf(tmp, "Complex(%g, %g)", $self->re(), $self->im());
    return tmp;
  }
  bool operator==(const Complex& c) {
    return ($self->re()==c.re() && $self->im()==c.im());
  }
};

Now, in Lua

> c = Complex(3, 4)
> d = Complex(7, 8)
> e = c + d
> print(e)      -- print uses __str__ to get the string form to print
Complex(10, 12)
> print(e==Complex(10, 12))  -- testing the == operator
true
> print(e!=Complex(12, 12))  -- the != uses the == operator
true

Extend works with both C and C++ code, on classes and structs. It does not modify the underlying object in any way---the extensions only show up in the Lua interface. The only item to take note of is the code has to use the '$self' instead of 'this', and that you cannot access protected/private members of the code (as you are not officially part of the class).

28.3.13 Using %newobject to release memory

If you have a function that allocates memory like this,

char *foo() {
  char *result = (char *) malloc(...);
  ...
  return result;
}

then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

To fix the memory leak, use the %newobject directive.

%newobject foo;
...
char *foo();

This will release the allocated memory.

28.3.14 C++ templates

C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the template directive. For example:

%module example
%{
#include "pair.h"
%}

template<class T1, class T2>
struct pair {
  typedef T1 first_type;
  typedef T2 second_type;
  T1 first;
  T2 second;
  pair();
  pair(const T1&, const T2&);
  ~pair();
};

%template(pairii) pair<int, int>;

In Lua:

> p = example.pairii(3, 4)
> print(p.first, p.second)
3    4

Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

28.3.15 C++ Smart Pointers

In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

template<class T> class SmartPtr {
  ...
  T *operator->();
  ...
}

Then, if you have a class like this,

class Foo {
public:
  int x;
  int bar();
};

A smart pointer would be used in C++ as follows:

SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
...
p->x = 3;                        // Foo::x
int y = p->bar();                // Foo::bar

To wrap this, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using template if necessary. For example:

%module example
...
%template(SmartPtrFoo) SmartPtr<Foo>;
...

Now, in Lua, everything should just "work":

> p = example.CreateFoo()          -- Create a smart-pointer somehow
> p.x = 3                          -- Foo::x
> print(p:bar())                   -- Foo::bar

If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

> f = p:__deref__()     -- Returns underlying Foo *

28.3.16 C++ Exceptions

Lua does not natively support exceptions, but it has errors which are similar. When a Lua function terminates with an error it returns one value back to the caller. SWIG automatically maps any basic type which is thrown into a Lua error. Therefore for a function:

int message() throw(const char *) {
  throw("I died.");
  return 1;
}

SWIG will automatically convert this to a Lua error.

> message()
I died.
stack traceback:
        [C]: in function 'message'
        stdin:1: in main chunk
        [C]: ?
>

If you want to catch an exception, you must use either pcall() or xpcall(), which are documented in the Lua manual. Using xpcall will allow you to obtain additional debug information (such as a stacktrace).

> function a() b() end -- function a() calls function b()
> function b() message() end -- function b() calls C++ function message(), which throws 
> ok, res=pcall(a)  -- call the function
> print(ok, res)
false   I died.
> ok, res=xpcall(a, debug.traceback)  -- call the function
> print(ok, res)
false   I died.
stack traceback:
        [C]: in function 'message'
        runme.lua:70: in function 'b'
        runme.lua:67: in function <runme.lua:66>
        [C]: in function 'xpcall'
        runme.lua:95: in main chunk
        [C]: ?

SWIG is able to throw numeric types, enums, chars, char*'s and std::string's without problem. It has also written typemaps for std::exception and its derived classes, which convert the exception into an error string.

However it's not so simple to throw other types of objects. Thrown objects are not valid outside the 'catch' block. Therefore they cannot be returned to the interpreter. The obvious ways to overcome this would be to either return a copy of the object, or to convert the object to a string and return that. Though it seems obvious to perform the former, in some cases this is not possible, most notably when SWIG has no information about the object, or the object is not copyable/creatable.

Therefore by default SWIG converts all thrown object into strings and returns them. So given a function:

void throw_A() throw(A*) {
  throw new A();
}

SWIG will just convert it (poorly) to a string and use that as its error. (This is not that useful, but it always works).

> throw_A()
object exception:A *
stack traceback:
        [C]: in function 'unknown'
        stdin:1: in main chunk
        [C]: ?
>

To get a more useful behaviour out of SWIG you must either: provide a way to convert your exceptions into strings, or throw objects which can be copied.

If you have your own class which you want output as a string you will need to add a typemap something like this:

%typemap(throws) my_except
%{ 
  lua_pushstring(L, $1.what()); // assuming my_except::what() returns a const char* message
  SWIG_fail; // trigger the error handler
%}

If you wish your exception to be returned to the interpreter, it must firstly be copyable. Then you must have an additional %apply statement, to tell SWIG to return a copy of this object to the interpreter. For example:

%apply SWIGTYPE EXCEPTION_BY_VAL {Exc}; // tell SWIG to return Exc by value to interpreter

class Exc {
public:
  Exc(int c, const char *m) {
    code = c;
    strncpy(msg, m, 256);
  }
  int code;
  char msg[256];
};

void throw_exc() throw(Exc) {
  throw(Exc(42, "Hosed"));
} 

Then the following code can be used (note: we use pcall to catch the error so we can process the exception).

> ok, res=pcall(throw_exc)
> print(ok)
false
> print(res)
userdata: 0003D880
> print(res.code, res.msg)
42      Hosed
>

Note: it is also possible (though tedious) to have a function throw several different kinds of exceptions. To process this will require a pcall, followed by a set of if statements checking the type of the error.

All of this code assumes that your C++ code uses exception specification (which a lot doesn't). If it doesn't consult the "Exception handling with %catches" section and the "Exception handling with %exception" section, for more details on how to add exception specification to functions or globally (respectively).

28.3.17 Namespaces

Since SWIG-3.0.0 C++ namespaces are supported via the %nspace feature.

Namespaces are mapped into Lua tables. Each of those tables contains names that were defined within appropriate namespace. Namespaces structure (a.k.a nested namespaces) is preserved. Consider the following C++ code:

%module example
%nspace MyWorld::Nested::Dweller;
%nspace MyWorld::World;

int module_function() { return 7; }
int module_variable = 9;

namespace MyWorld {
  class World {
  public:
    World() : world_max_count(9) {}
    int create_world() { return 17; }
    const int world_max_count; // = 9
  };
  namespace Nested {
    class Dweller {
      public:
        enum Gender { MALE = 0, FEMALE = 1 };
        static int count() { return 19; }
    };
  }
}

Now, from Lua usage is as follows:

> print(example.module_function())
7
> print(example.module_variable)
9
> print(example.MyWorld.World():create_world())
17
> print(example.MyWorld.World.world_max_count)
9
> print(example.MyWorld.Nested.Dweller.MALE)
0
> print(example.MyWorld.Nested.Dweller.count())
19
>

28.3.17.1 Compatibility Note

If SWIG is running in a backwards compatible way, i.e. without the -no-old-metatable-bindings option, then additional old-style names are generated (notice the underscore):

9
> print(example.MyWorld.Nested.Dweller_MALE)
0
> print(example.MyWorld.Nested.Dweller_count())
11
>

28.3.17.2 Names

If SWIG is launched without -no-old-metatable-bindings option, then it enters backward-compatible mode. While in this mode, it tries to generate additional names for static functions, class static constants and class enums. Those names are in a form $classname_$symbolname and are added to the scope surrounding the class. If %nspace is enabled, then class namespace is taken as scope. If there is no namespace, or %nspace is disabled, then module is considered a class namespace.

Consider the following C++ code

%module example
%nspace MyWorld::Test;
namespace MyWorld {
class Test {
  public:
  enum { TEST1 = 10, TEST2 }
  static const int ICONST = 12;
};
class Test2 {
  public:
  enum { TEST3 = 20, TEST4 }
  static const int ICONST2 = 23;
}

When in backward compatible mode, in addition to the usual names, the following ones will be generated (notice the underscore):

9
> print(example.MyWorld.Test_TEST1) -- Test has %nspace enabled
10
> print(example.MyWorld.Test_ICONST) -- Test has %nspace enabled
12
> print(example.Test2_TEST3) -- Test2 doesn't have %nspace enabled
20
> print(example.Test2_ICONST2) -- Test2 doesn't have %nspace enabled
23
>

There is a slight difference with enums when in C mode. As per C standard, enums from C structures are exported to surrounding scope without any prefixing. Pretending that Test2 is a struct, not class, that would be:

> print(example.TEST3) -- NOT Test2_TEST3
20
>

28.3.17.3 Inheritance

The internal organization of inheritance has changed. Consider the following C++ code:

%module example
class Base {
  public:
  int base_func()
};
class Derived : public Base {
  public:
  int derived_func()
}

Lets assume for a moment that class member functions are stored in .fn table. Previously, when classes were exported to Lua during module initialization, for every derived class all service tables ST(i.e. ".fn") were squashed and added to corresponding derived class ST: Everything from .fn table of class Base was copied to .fn table of class Derived and so on. This was a recursive procedure, so in the end the whole inheritance tree of derived class was squashed into derived class.

That means that any changes done to class Base after module initialization wouldn't affect class Derived:

base = example.Base()
der = example.Derived()
> print(base.base_func)
function: 0x1367940
> getmetatable(base)[".fn"].new_func = function (x) return x -- Adding new function to class Base (to class, not to an instance!)
> print(base.new_func) -- Checking this function
function
> print(der.new_func) -- Wouldn't work. Derived doesn't check Base any more.
nil
>

This behaviour was changed. Now unless -squash-bases option is provided, Derived store a list of it's bases and if some symbol is not found in it's own service tables then its bases are searched for it. Option -squash-bases will effectively return old behaviour.

> print(der.new_func) -- Now it works
function
>

28.4 Typemaps

This section explains what typemaps are and how to use them. The default wrapping behaviour of SWIG is enough in most cases. However sometimes SWIG may need a little additional assistance to know which typemap to apply to provide the best wrapping. This section will be explaining how to use typemaps to best effect

28.4.1 What is a typemap?

A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Lua to C, you might define a typemap like this:

%module example

%typemap(in) int {
  $1 = (int) lua_tonumber(L, $input);
  printf("Received an integer : %d\n", $1);
}
%inline %{
extern int fact(int n);
%}

Note: you shouldn't use this typemap, as SWIG already has a typemap for this task. This is purely for example.

Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input is the index on the Lua stack for the value to be used.

When this example is compiled into a Lua module, it operates as follows:

> require "example"
> print(example.fact(6))
Received an integer : 6
720

28.4.2 Using typemaps

There are many ready written typemaps built into SWIG for all common types (int, float, short, long, char*, enum and more), which SWIG uses automatically, with no effort required on your part.

However for more complex functions which use input/output parameters or arrays, you will need to make use of <typemaps.i>, which contains typemaps for these situations. For example, consider these functions:

void add(int x, int y, int *result) {
  *result = x + y;
}

int sub(int *x1, int *y1) {
  return *x1-*y1;
}

void swap(int *sx, int *sy) {
  int t=*sx;
  *sx=*sy;
  *sy=t;
}

It is clear to the programmer, that 'result' is an output parameter, 'x1' and 'y1' are input parameters and 'sx' and 'sy' are input/output parameters. However is not apparent to SWIG, so SWIG must to informed about which kind they are, so it can wrapper accordingly.

One means would be to rename the argument name to help SWIG, eg void add(int x, int y, int *OUTPUT), however it is easier to use the %apply to achieve the same result, as shown below.

%include <typemaps.i>
%apply int* OUTPUT {int *result}; // int *result is output
%apply int* INPUT {int *x1, int *y1}; // int *x1 and int *y1 are input
%apply int* INOUT {int *sx, int *sy}; // int *sx and int *sy are input and output

void add(int x, int y, int *result);
int sub(int *x1, int *y1);
void swap(int *sx, int *sy);

When wrapped, it gives the following results:

> require "example"
> print(example.add(1, 2))
3
> print(demo.sub(1, 2))
-1
> a, b=1, 2
> c, d=demo.swap(a, b)
> print(a, b, c, d)
1       2       2       1

Notice, that 'result' is not required in the arguments to call the function, as it an output parameter only. For 'sx' and 'sy' they must be passed in (as they are input), but the original value is not modified (Lua does not have a pass by reference feature). The modified results are then returned as two return values. All INPUT/OUTPUT/INOUT arguments will behave in a similar manner.

Note: C++ references must be handled exactly the same way. However SWIG will automatically wrap a const int& as an input parameter (since that it obviously input).

28.4.3 Typemaps and arrays

Arrays present a challenge for SWIG, because like pointers SWIG does not know whether these are input or output values, nor does SWIG have any indication of how large an array should be. However with the proper guidance SWIG can easily wrapper arrays for convenient usage.

Given the functions:

extern void sort_int(int* arr, int len);
extern void sort_double(double* arr, int len);

There are basically two ways that SWIG can deal with this. The first way, uses the <carrays.i> library to create an array in C/C++ then this can be filled within Lua and passed into the function. It works, but it's a bit tedious. More details can be found in the carrays.i documentation.

The second and more intuitive way, would be to pass a Lua table directly into the function, and have SWIG automatically convert between Lua-table and C-array. Within the <typemaps.i> file there are typemaps ready written to perform this task. To use them is again a matter of using %apply in the correct manner.

The wrapper file below, shows both the use of carrays as well as the use of the typemap to wrap arrays.

// using the C-array
%include <carrays.i>
// this declares a batch of function for manipulating C integer arrays
%array_functions(int, int)

extern void sort_int(int* arr, int len); // the function to wrap

// using typemaps
%include <typemaps.i>
%apply (double *INOUT, int) {(double* arr, int len)};

extern void sort_double(double* arr, int len); // the function to wrap

Once wrapped, the functions can both be called, though with different ease of use:

require "example"
ARRAY_SIZE=10

-- passing a C array to the sort_int()
arr=example.new_int(ARRAY_SIZE) -- create the array
for i=0, ARRAY_SIZE-1 do -- index 0..9 (just like C)
    example.int_setitem(arr, i, math.random(1000))
end
example.sort_int(arr, ARRAY_SIZE)  -- call the function
example.delete_int(arr) -- must delete the allocated memory

-- use a typemap to call with a Lua-table
-- one item of note: the typemap creates a copy, rather than edit-in-place
t={} -- a Lua table
for i=1, ARRAY_SIZE do -- index 1..10 (Lua style)
    t[i]=math.random(1000)/10
end
t=example.sort_double(t) -- replace t with the result

Obviously the first version could be made less tedious by writing a Lua function to perform the conversion from a table to a C-array. The %luacode directive is good for this. See SWIG\Examples\lua\arrays for an example of this.

Warning: in C indexes start at ZERO, in Lua indexes start at ONE. SWIG expects C-arrays to be filled for 0..N-1 and Lua tables to be 1..N, (the indexing follows the norm for the language). In the typemap when it converts the table to an array it quietly changes the indexing accordingly. Take note of this behaviour if you have a C function which returns indexes.

Note: SWIG also can support arrays of pointers in a similar manner.

28.4.4 Typemaps and pointer-pointer functions

Several C++ libraries use a pointer-pointer functions to create its objects. These functions require a pointer to a pointer which is then filled with the pointer to the new object. Microsoft's COM and DirectX as well as many other libraries have this kind of function. An example is given below:

struct iMath;    // some structure
int Create_Math(iMath** pptr); // its creator (assume it mallocs)

Which would be used with the following C code:

iMath* ptr;
int ok;
ok=Create_Math(&ptr);
// do things with ptr
//...
free(ptr); // dispose of iMath

SWIG has a ready written typemap to deal with such a kind of function in <typemaps.i>. It provides the correct wrapping as well as setting the flag to inform Lua that the object in question should be garbage collected. Therefore the code is simply:

%include <typemaps.i>
%apply SWIGTYPE** OUTPUT{iMath **pptr }; // tell SWIG it's an output

struct iMath;    // some structure
int Create_Math(iMath** pptr); // its creator (assume it mallocs)

The usage is as follows:

ok, ptr=Create_Math() -- ptr is an iMath* which is returned with the int (ok)
ptr=nil -- the iMath* will be GC'ed as normal

28.5 Writing typemaps

This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Lua C API as well as the material in the "Typemaps" chapter.

Before proceeding, it should be stressed that writing typemaps is rarely needed unless you want to change some aspect of the wrapping, or to achieve an effect which in not available with the default bindings.

Before proceeding, you should read the previous section on using typemaps, and look at the existing typemaps found in luatypemaps.swg and typemaps.i. These are both well documented and fairly easy to read. You should not attempt to write your own typemaps until you have read and can understand both of these files (they may well also give you an idea to base your work on).

28.5.1 Typemaps you can write

There are many different types of typemap that can be written, the full list can be found in the "Typemaps" chapter. However the following are the most commonly used ones.

  • in this is for input arguments to functions
  • out this is for return types from functions
  • argout this is for a function argument which is actually returning something
  • typecheck this is used to determine which overloaded function should be called (the syntax for the typecheck is different from the typemap, see typemaps for details).

28.5.2 SWIG's Lua-C API

This section explains the SWIG specific Lua-C API. It does not cover the main Lua-C api, as this is well documented and not worth covering.

int SWIG_ConvertPtr(lua_State* L, int index, void** ptr, swig_type_info *type, int flags);

This is the standard function used for converting a Lua userdata to a void*. It takes the value at the given index in the Lua state and converts it to a userdata. It will then provide the necessary type checks, confirming that the pointer is compatible with the type given in 'type'. Then finally setting '*ptr' to the pointer. If flags is set to SWIG_POINTER_DISOWN, this is will clear any ownership flag set on the object.
This returns a value which can be checked with the macro SWIG_IsOK()

void SWIG_NewPointerObj(lua_State* L, void* ptr, swig_type_info *type, int own);

This is the opposite of SWIG_ConvertPtr, as it pushes a new userdata which wrappers the pointer 'ptr' of type 'type'. The parameter 'own' specifies if the object is owned be Lua and if it is 1 then Lua will GC the object when the userdata is disposed of.

void* SWIG_MustGetPtr(lua_State* L, int index, swig_type_info *type, int flags, int argnum, const char* func_name);

This function is a version of SWIG_ConvertPtr(), except that it will either work, or it will trigger a lua_error() with a text error message. This function is rarely used, and may be deprecated in the future.

SWIG_fail

This macro, when called within the context of a SWIG wrapped function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then triggers a lua_error.
A common use for this code is:
if (!SWIG_IsOK(SWIG_ConvertPtr( .....)){
 lua_pushstring(L, "something bad happened");
 SWIG_fail;
}

SWIG_fail_arg(char* func_name, int argnum, char* type)

This macro, when called within the context of a SWIG wrapped function, will display the error message and jump to the error handler code. The error message is of the form
"Error in func_name (arg argnum), expected 'type' got 'whatever the type was'"

SWIG_fail_ptr(const char* fn_name, int argnum, swig_type_info* type);

Similar to SWIG_fail_arg, except that it will display the swig_type_info information instead.

28.6 Customization of your Bindings

This section covers adding of some small extra bits to your module to add the last finishing touches.

28.6.1 Writing your own custom wrappers

Sometimes, it may be necessary to add your own special functions, which bypass the normal SWIG wrapper method, and just use the native Lua API calls. These 'native' functions allow direct adding of your own code into the module. This is performed with the %native directive as follows:

%native(my_func) int native_function(lua_State*L);  // registers native_function() with SWIG
...
%{
int native_function(lua_State*L) // my native code
{
 ...
}
%}

The %native directive in the above example, tells SWIG that there is a function int native_function(lua_State*L); which is to be added into the module under the name 'my_func'. SWIG will not add any wrapper for this function, beyond adding it into the function table. How you write your code is entirely up to you.

28.6.2 Adding additional Lua code

As well as adding additional C/C++ code, it's also possible to add your own Lua code to the module as well. This code is executed once all other initialisation, including the %init code has been called.

The directive %luacode adds code into the module which is executed upon loading. Normally you would use this to add your own functions to the module. Though you could easily perform other tasks.

%module example;

%luacode {
  function example.greet() 
    print "hello world" 
  end

  print "Module loaded ok"
}
...
%}

Notice that the code is not part of the module table. Therefore any references to the module must have the module name added.

Should there be an error in the Lua code, this will not stop loading of the module. The default behaviour of SWIG is to print an error message to stderr and then continue. It is possible to change this behaviour by using a #define SWIG_DOSTRING_FAIL(STR) to define a different behaviour should the code fail.

Good uses for this feature is adding of new code, or writing helper functions to simplify some of the code. See Examples/lua/arrays for an example of this code.

28.7 Details on the Lua binding

In the previous section, a high-level view of Lua wrapping was presented. Obviously a lot of stuff happens behind the scenes to make this happen. This section will explain some of the low-level details on how this is achieved.

If you just want to use SWIG and don't care how it works, then stop reading here. This is going into the guts of the code and how it works. It's mainly for people who need to know what's going on within the code.

28.7.1 Binding global data into the module.

Assuming that you had some global data that you wanted to share between C and Lua. How does SWIG do it?

%module example;
extern double Foo;

SWIG will effectively generate the pair of functions

void Foo_set(double);
double Foo_get();

At initialisation time, it will then add to the interpreter a table called 'example', which represents the module. It will then add all its functions to the module. (Note: older versions of SWIG actually added the Foo_set() and Foo_get() functions, current implementation does not add these functions any more.) But it also adds a metatable to this table, which has two functions (__index and __newindex) as well as two tables (.get and .set) The following Lua code will show these hidden features.

> print(example)
table: 003F8F90
> m=getmetatable(example)
> table.foreach(m, print)
.set    table: 003F9088
.get    table: 003F9038
__index function: 003F8FE0
__newindex      function: 003F8FF8
> g=m['.get']
> table.foreach(g, print)
Foo     function: 003FAFD8
>

The .get and .set tables are lookups connecting the variable name 'Foo' to the accessor/mutator functions (Foo_set, Foo_get)

The Lua equivalent of the code for the __index and __newindex looks a bit like this

function __index(mod, name)
        local g=getmetatable(mod)['.get'] -- gets the table
        if not g then return nil end
        local f=g[name] -- looks for the function
        -- calls it & returns the value
        if type(f)=="function" then return f() end
        return nil
end

function __newindex(mod, name, value)
        local s=getmetatable(mod)['.set'] -- gets the table
        if not s then return end
        local f=s[name] -- looks for the function
        -- calls it to set the value
        if type(f)=="function" then f(value)
        else rawset(mod, name, value) end
end

That way when you call 'a=example.Foo', the interpreter looks at the table 'example' sees that there is no field 'Foo' and calls __index. This will in turn check in '.get' table and find the existence of 'Foo' and then return the value of the C function call 'Foo_get()'. Similarly for the code 'example.Foo=10', the interpreter will check the table, then call the __newindex which will then check the '.set' table and call the C function 'Foo_set(10)'.

28.7.2 Userdata and Metatables

As mentioned earlier, classes and structures, are all held as pointer, using the Lua 'userdata' structure. This structure is actually a pointer to a C structure 'swig_lua_userdata', which contains the pointer to the data, a pointer to the swig_type_info (an internal SWIG struct) and a flag which marks if the object is to be disposed of when the interpreter no longer needs it. The actual accessing of the object is done via the metatable attached to this userdata.

The metatable is a Lua 5.0 feature (which is also why SWIG cannot wrap Lua 4.0). It's a table which holds a list of functions, operators and attributes. This is what gives the userdata the feeling that it is a real object and not just a hunk of memory.

Given a class

%module excpp;

class Point
{
public:
 int x, y;
 Point(){x=y=0;}
 ~Point(){}
 virtual void Print(){printf("Point @%p (%d, %d)\n", this, x, y);}
};

SWIG will create a module excpp, with all the various functions inside. However to allow the intuitive use of the userdata, SWIG also creates up a set of metatables. As seen in the above section on global variables, use of the metatables allows for wrappers to be used intuitively. To save effort, the code creates one metatable per class and stores it inside Lua's registry. Then when a new object is instantiated, the metatable is found in the registry and the userdata associated with the metatable. Currently, derived classes make a complete copy of the base class' table and then add on their own additional functions.

Some of the internals can be seen by looking at the metatable of a class:

> p=excpp.Point()
> print(p)
userdata: 003FDB28
> m=getmetatable(p)
> table.foreach(m, print)
.type   Point
__gc    function: 003FB6C8
__newindex      function: 003FB6B0
__index function: 003FB698
.get    table: 003FB4D8
.set    table: 003FB500
.fn     table: 003FB528

The '.type' attribute is the name of the class. The '.get' and '.set' tables work in a similar manner to the modules, the main difference is the '.fn' table which also holds all the member functions. (The '__gc' function is the class' destructor function)

The Lua equivalent of the code for enabling functions looks a little like this

function __index(obj, name)
        local m=getmetatable(obj) -- gets the metatable
        if not m then return nil end
        local g=m['.get'] -- gets the attribute table
        if not g then return nil end
        local f=g[name] -- looks for the get_attribute function
        -- calls it & returns the value
        if type(f)=="function" then return f() end
        -- ok, so it not an attribute, maybe it's a function
        local fn=m['.fn'] -- gets the function table
        if not fn then return nil end
        local f=fn[name] -- looks for the function
        -- if found the fn then return the function
        -- so the interpreter can call it
        if type(f)=="function" then return f end
        return nil
end

So when 'p:Print()' is called, the __index looks on the object metatable for a 'Print' attribute, then looks for a 'Print' function. When it finds the function, it returns the function, and then interpreter can call 'Point_Print(p)'

In theory, you can play with this usertable & add new features, but remember that it is a shared table between all instances of one class, and you could very easily corrupt the functions in all the instances.

Note: Both the opaque structures (like the FILE*) and normal wrapped classes/structs use the same 'swig_lua_userdata' structure. Though the opaque structures has do not have a metatable attached, or any information on how to dispose of them when the interpreter has finished with them.

Note: Operator overloads are basically done in the same way, by adding functions such as '__add' & '__call' to the class' metatable. The current implementation is a bit rough as it will add any member function beginning with '__' into the metatable too, assuming its an operator overload.

28.7.3 Memory management

Lua is very helpful with the memory management. The 'swig_lua_userdata' is fully managed by the interpreter itself. This means that neither the C code nor the Lua code can damage it. Once a piece of userdata has no references to it, it is not instantly collected, but will be collected when Lua deems is necessary. (You can force collection by calling the Lua function collectgarbage()). Once the userdata is about to be free'ed, the interpreter will check the userdata for a metatable and for a function '__gc'. If this exists this is called. For all complete types (ie normal wrapped classes & structs) this should exist. The '__gc' function will check the 'swig_lua_userdata' to check for the 'own' field and if this is true (which is will be for all owned data) it will then call the destructor on the pointer.

It is currently not recommended to edit this field or add some user code, to change the behaviour. Though for those who wish to try, here is where to look.

It is also currently not possible to change the ownership flag on the data (unlike most other scripting languages, Lua does not permit access to the data from within the interpreter).

swig-3.0.12/Doc/Manual/index.html0000664000175000017500000000137413042756442016361 0ustar williamwilliam SWIG-3.0 Documentation

SWIG-3.0 Documentation

The SWIG documentation is available in one of the following formats. swig-3.0.12/Doc/Manual/Preface.html0000664000175000017500000004104613042756671016623 0ustar williamwilliam Preface

1 Preface

1.1 Introduction

SWIG (Simplified Wrapper and Interface Generator) is a software development tool for building scripting language interfaces to C and C++ programs. Originally developed in 1995, SWIG was first used by scientists in the Theoretical Physics Division at Los Alamos National Laboratory for building user interfaces to simulation codes running on the Connection Machine 5 supercomputer. In this environment, scientists needed to work with huge amounts of simulation data, complex hardware, and a constantly changing code base. The use of a scripting language interface provided a simple yet highly flexible foundation for solving these types of problems. SWIG simplifies development by largely automating the task of scripting language integration--allowing developers and users to focus on more important problems.

Although SWIG was originally developed for scientific applications, it has since evolved into a general purpose tool that is used in a wide variety of applications--in fact almost anything where C/C++ programming is involved.

1.2 SWIG Versions

In the late 1990's, the most stable version of SWIG was release 1.1p5. Versions 1.3.x were officially development versions and these were released over a period of 10 years starting from the year 2000. The final version in the 1.3.x series was 1.3.40, but in truth the 1.3.x series had been stable for many years. An official stable version was released along with the decision to make SWIG license changes and this gave rise to version 2.0.0 in 2010.

1.3 SWIG License

The LICENSE file shipped with SWIG in the top level directory contains the SWIG license. For further insight into the license including the license of SWIG's output code, please visit the SWIG legal page - http://www.swig.org/legal.html.

The license was clarified in version 2.0.0 so that the code that SWIG generated could be distributed under license terms of the user's choice/requirements and at the same time the SWIG source was placed under the GNU General Public License version 3.

1.4 SWIG resources

The official location of SWIG related material is

This site contains the latest version of the software, users guide, and information regarding bugs, installation problems, and implementation tricks.

You can also subscribe to the swig-user mailing list by visiting the page

The mailing list often discusses some of the more technical aspects of SWIG along with information about beta releases and future work.

Git and Subversion access to the latest version of SWIG is also available. More information about this can be obtained at:

1.5 Prerequisites

This manual assumes that you know how to write C/C++ programs and that you have at least heard of scripting languages such as Tcl, Python, and Perl. A detailed knowledge of these scripting languages is not required although some familiarity won't hurt. No prior experience with building C extensions to these languages is required---after all, this is what SWIG does automatically. However, you should be reasonably familiar with the use of compilers, linkers, and makefiles since making scripting language extensions is somewhat more complicated than writing a normal C program.

Over time SWIG releases have become significantly more capable in their C++ handling--especially support for advanced features like namespaces, overloaded operators, and templates. Whenever possible, this manual tries to cover the technicalities of this interface. However, this isn't meant to be a tutorial on C++ programming. For many of the gory details, you will almost certainly want to consult a good C++ reference. If you don't program in C++, you may just want to skip those parts of the manual.

1.6 Organization of this manual

The first few chapters of this manual describe SWIG in general and provide an overview of its capabilities. The remaining chapters are devoted to specific SWIG language modules and are self contained. Thus, if you are using SWIG to build Python interfaces, you can probably skip to that chapter and find almost everything you need to know.

1.7 How to avoid reading the manual

If you hate reading manuals, glance at the "Introduction" which contains a few simple examples. These examples contain about 95% of everything you need to know to use SWIG. After that, simply use the language-specific chapters as a reference. The SWIG distribution also comes with a large directory of examples that illustrate different topics.

1.8 Backwards compatibility

If you are a previous user of SWIG, don't expect SWIG to provide complete backwards compatibility. Although the developers strive to the utmost to keep backwards compatibility, this isn't always possible as the primary goal over time is to make SWIG better---a process that would simply be impossible if the developers are constantly bogged down with backwards compatibility issues. Potential incompatibilities are clearly marked in the detailed release notes.

If you need to work with different versions of SWIG and backwards compatibility is an issue, you can use the SWIG_VERSION preprocessor symbol which holds the version of SWIG being executed. SWIG_VERSION is a hexadecimal integer such as 0x010311 (corresponding to SWIG-1.3.11). This can be used in an interface file to define different typemaps, take advantage of different features etc:

#if SWIG_VERSION >= 0x010311
/* Use some fancy new feature */
#endif

Note: The version symbol is not defined in the generated SWIG wrapper file. The SWIG preprocessor has defined SWIG_VERSION since SWIG-1.3.11.

1.9 Release notes

The CHANGES.current, CHANGES and RELEASENOTES files shipped with SWIG in the top level directory contain, respectively, detailed release notes for the current version, detailed release notes for previous releases and summary release notes from SWIG-1.3.22 onwards.

1.10 Credits

SWIG is an unfunded project that would not be possible without the contributions of many people working in their spare time. If you have benefitted from using SWIG, please consider Donating to SWIG to keep development going. There have been a large varied number of people who have made contributions at all levels over time. Contributors are mentioned either in the COPYRIGHT file or CHANGES files shipped with SWIG or in submitted bugs.

1.11 Bug reports

Although every attempt has been made to make SWIG bug-free, we are also trying to make feature improvements that may introduce bugs. To report a bug, either send mail to the SWIG developer list at the swig-devel mailing list or report a bug at the SWIG bug tracker. In your report, be as specific as possible, including (if applicable), error messages, tracebacks (if a core dump occurred), corresponding portions of the SWIG interface file used, and any important pieces of the SWIG generated wrapper code. We can only fix bugs if we know about them.

1.12 Installation

1.12.1 Windows installation

Please see the dedicated Windows chapter for instructions on installing SWIG on Windows and running the examples. The Windows distribution is called swigwin and includes a prebuilt SWIG executable, swig.exe, included in the top level directory. Otherwise it is exactly the same as the main SWIG distribution. There is no need to download anything else.

1.12.2 Unix installation

These installation instructions are for using the distributed tarball, for example, swig-3.0.8.tar.gz. If you wish to build and install from source on Github, extra steps are required. Please see the Bleeding Edge page on the SWIG website.

You must use GNU make to build and install SWIG.

PCRE needs to be installed on your system to build SWIG, in particular pcre-config must be available. If you have PCRE headers and libraries but not pcre-config itself or, alternatively, wish to override the compiler or linker flags returned by pcre-config, you may set PCRE_LIBS and PCRE_CFLAGS variables to be used instead. And if you don't have PCRE at all, the configure script will provide instructions for obtaining it.

To build and install SWIG, simply type the following:

$ ./configure
$ make
$ make install

By default SWIG installs itself in /usr/local. If you need to install SWIG in a different location or in your home directory, use the --prefix option to ./configure. For example:

$ ./configure --prefix=/home/yourname/projects
$ make
$ make install

Note: the directory given to --prefix must be an absolute pathname. Do not use the ~ shell-escape to refer to your home directory. SWIG won't work properly if you do this.

The INSTALL file shipped in the top level directory details more about using configure. Also try

$ ./configure --help.

The configure script will attempt to locate various packages on your machine including Tcl, Perl5, Python and all the other target languages that SWIG supports. Don't panic if you get 'not found' messages -- SWIG does not need these packages to compile or run. The configure script is actually looking for these packages so that you can try out the SWIG examples contained in the 'Examples' directory without having to hack Makefiles. Note that the --without-xxx options, where xxx is a target language, have minimal effect. All they do is reduce the amount of testing done with 'make check'. The SWIG executable and library files installed cannot currently be configured with a subset of target languages.

SWIG used to include a set of runtime libraries for some languages for working with multiple modules. These are no longer built during the installation stage. However, users can build them just like any wrapper module as described in the Modules chapter. The CHANGES file shipped with SWIG in the top level directory also lists some examples which build the runtime library.

Note:

  • If you checked the code out via Git, you will have to run ./autogen.sh before ./configure. In addition, a full build of SWIG requires a number of packages to be installed. Full instructions at SWIG bleeding edge.

1.12.3 Macintosh OS X installation

SWIG is known to work on various flavors of OS X. Follow the Unix installation instructions above. However, as of this writing, there is still great deal of inconsistency with how shared libaries are handled by various scripting languages on OS X.

Users of OS X should be aware that Darwin handles shared libraries and linking in a radically different way than most Unix systems. In order to test SWIG and run the examples, SWIG configures itself to use flat namespaces and to allow undefined symbols (-flat_namespace -undefined suppress). This mostly closely follows the Unix model and makes it more likely that the SWIG examples will work with whatever installation of software you might have. However, this is generally not the recommended technique for building larger extension modules. Instead, you should utilize Darwin's two-level namespaces. Some details about this can be found here Understanding Two-Level Namespaces.

Needless to say, you might have to experiment a bit to get things working at first.

1.12.4 Testing

If you want to test SWIG after building it, a check can be performed on Unix operating systems. Type the following:

    $ make -k check

This step can be performed either before or after installation. The check requires at least one of the target languages to be installed. If it fails, it may mean that you have an uninstalled language module or that the file 'Examples/Makefile' has been incorrectly configured. It may also fail due to compiler issues such as a broken C++ compiler. Even if the check fails, there is a pretty good chance SWIG still works correctly --- you will just have to mess around with one of the examples and some makefiles to get it to work. Some tests may also fail due to missing dependency packages, eg PCRE or Boost, but this will require careful analysis of the configure output done during configuration.

The test suite executed by the check is designed to stress-test many parts of the implementation including obscure corner cases. If some of these tests fail or generate warning messages, there is no reason for alarm --- the test may be related to some new SWIG feature or a difficult bug that we're trying to resolve. Chances are that SWIG will work just fine for you. Note that if you have more than one CPU/core, then you can use parallel make to speed up the check as it does take quite some time to run, for example:

    $ make -j2 -k check

Also, SWIG's support for C++ is sufficiently advanced that certain tests may fail on older C++ compilers (for instance if your compiler does not support member templates). These errors are harmless if you don't intend to use these features in your own programs.

Note: The test-suite currently contains over 500 tests. If you have many different target languages installed and a slow machine, it might take more than an hour to run the test-suite.

1.12.5 Examples

The Examples directory contains a variety of examples of using SWIG and it has some browsable documentation. Simply point your browser to the file "Example/index.html".

The Examples directory also includes Visual C++ project 6 (.dsp) files for building some of the examples on Windows. Later versions of Visual Studio will convert these old style project files into a current solution file.

swig-3.0.12/Doc/Manual/Android.html0000664000175000017500000005070513042756671016640 0ustar williamwilliam SWIG and Android

19 SWIG and Android

This chapter describes SWIG's support of Android.

19.1 Overview

The Android chapter is fairly short as support for Android is the same as for Java, where the Java Native Interface (JNI) is used to call from Android Java into C or C++ compiled code. Everything in the Java chapter applies to generating code for access from Android Java code. This chapter contains a few Android specific notes and examples.

19.2 Android examples

19.2.1 Examples introduction

The examples require the Android SDK and Android NDK which can be installed as per instructions in the links. The Eclipse version is not required for these examples as just the command line tools are used (shown for Linux as the host, but Windows will be very similar, if not identical in most places). Add the SDK tools and NDK tools to your path and create a directory somewhere for your Android projects (adjust PATH as necessary to where you installed the tools):

$ export PATH=$HOME/android/android-sdk-linux_x86/tools:$HOME/android/android-sdk-linux_x86/platform-tools:$HOME/android/android-ndk-r6b:$PATH
$ mkdir AndroidApps 
$ cd AndroidApps

The examples use a target id of 1. This might need changing depending on your setup. After installation of the Android SDK, the available target ids can be viewed by running the command below. Please adjust the id to suit your target device.

$ android list targets

The following examples are shipped with SWIG under the Examples/android directory and include a Makefile to build and install each example.

19.2.2 Simple C example

This simple C example shows how to call a C function as well as read and modify a global variable. First we'll create and build a pure Java Android app. Afterwards the JNI code will be generated by SWIG and built into the app. First create and build an app called SwigSimple in a subdirectory called simple using the commands below. Adjust the --target id as mentioned earlier in the Examples introduction. Managing Projects from the Command Line on the Android developer's site is a useful reference for these steps.

$ android create project --target 1 --name SwigSimple --path ./simple --activity SwigSimple --package org.swig.simple
$ cd simple
$ ant debug

Modify src/org/swig/simple/SwigSimple.java from the default to:

package org.swig.simple;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.ScrollView;
import android.text.method.ScrollingMovementMethod;

public class SwigSimple extends Activity
{
    TextView outputText = null;
    ScrollView scroller = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        outputText = (TextView)findViewById(R.id.OutputText);
        outputText.setText("Press 'Run' to start...\n");
        outputText.setMovementMethod(new ScrollingMovementMethod());

        scroller = (ScrollView)findViewById(R.id.Scroller);
    }

    public void onRunButtonClick(View view)
    {
      outputText.append("Started...\n");
      nativeCall();
      outputText.append("Finished!\n");
      
      // Ensure scroll to end of text
      scroller.post(new Runnable() {
        public void run() {
          scroller.fullScroll(ScrollView.FOCUS_DOWN);
        }
      });
    }

    /** Calls into C/C++ code */
    public void nativeCall()
    {
        // TODO
    }
}

The above simply adds a Run button and scrollable text view as the GUI aspects of the program. The associated resources need to be created, modify res/layout/main.xml as follows:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
    android:id="@+id/RunButton"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:text="Run..."  
    android:onClick="onRunButtonClick"
    />
<ScrollView
    android:id="@+id/Scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:id="@+id/OutputText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
</ScrollView>
</LinearLayout>

Rebuild the project with your changes:

$ ant debug

Although there are no native function calls in the code, yet, you may want to check that this simple pure Java app runs before adding in the native calls. First, set up your Android device for hardware debugging, see Using hardware devices on the Android developer's site. When complete your device should be listed in those attached, something like:

$ adb devices
List of devices attached 
A32-6DBE0001-9FF80000-015D62C3-02018028 device

This means you are now ready to install the application...

$ adb install bin/SwigSimple-debug.apk 
95 KB/s (4834 bytes in 0.049s)
        pkg: /data/local/tmp/SwigSimple-debug.apk
Success

The newly installed 'SwigSimple' app will be amongst all your other applications on the home screen. Run the app and it will show a Run button text box below it. Press the Run button to see the simple text output.

The application can be uninstalled like any other application and in fact must be uninstalled before installing an updated version. Uninstalling is quite easy too from your host computer:

$ adb uninstall org.swig.simple
Success

Now that you have a pure Java Android app working, let's add some JNI code generated from SWIG.

First create a jni subdirectory and then create some C source code in jni/example.c:

/* File : example.c */

/* A global variable */
double Foo = 3.0;

/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
  int g;
  g = y;
  while (x > 0) {
    g = x;
    x = y % x;
    y = g;
  }
  return g;
}

Create a SWIG interface file for this C code, jni/example.i:

/* File : example.i */
%module example

%inline %{
extern int    gcd(int x, int y);
extern double Foo;
%}

Invoke SWIG as follows:

$ swig -java -package org.swig.simple -outdir src/org/swig/simple -o jni/example_wrap.c jni/example.i

SWIG generates the following files:

  • src/org/swig/simple/exampleJNI.java
  • src/org/swig/simple/example.java
  • jni/example_wrap.c

Next we need to create a standard Android NDK build system file jni/Android.mk:

# File: Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := example
LOCAL_SRC_FILES := example_wrap.c example.c

include $(BUILD_SHARED_LIBRARY)

See the Android NDK documentation for more on the NDK build system and getting started with the NDK. A simple invocation of ndk-build will compile the .c files and generate a shared object/system library. Output will be similar to:

$ ndk-build
Compile thumb  : example <= example_wrap.c
Compile thumb  : example <= example.c
SharedLibrary  : libexample.so
Install        : libexample.so => libs/armeabi/libexample.so

Now that the C JNI layer has been built, we can write Java code to call into the this layer. Modify the nativeCall method in src/org/swig/simple/SwigSimple.java to call the JNI code as follows and add the static constructor to load the system library containing the compiled JNI C code:

    /** Calls into C/C++ code */
    public void nativeCall()
    {
      // Call our gcd() function
      
      int x = 42;
      int y = 105;
      int g = example.gcd(x, y);
      outputText.append("The greatest common divisor of " + x + " and " + y + " is " + g + "\n");

      // Manipulate the Foo global variable

      // Output its current value
      double foo = example.getFoo();
      outputText.append("Foo = " + foo + "\n");

      // Change its value
      example.setFoo(3.1415926);

      // See if the change took effect
      outputText.append("Foo = " + example.getFoo() + "\n");

      // Restore value
      example.setFoo(foo);
    }

    /** static constructor */
    static {
        System.loadLibrary("example");
    }

Compile the Java code as usual, uninstall the old version of the app if still installed and re-install the new app:

$ ant debug
$ adb uninstall org.swig.simple
$ adb install bin/SwigSimple-debug.apk 

Run the app again and this time you will see the output pictured below, showing the result of calls into the C code:

Android screenshot of SwigSimple example

19.2.3 C++ class example

The steps for calling C++ code are almost identical to those in the previous C code example. All the steps required to compile and use a simple hierarchy of classes for shapes are shown in this example.

First create an Android project called SwigClass in a subdirectory called class. The steps below create and build a the JNI C++ app. Adjust the --target id as mentioned earlier in the Examples introduction.

$ android create project --target 1 --name SwigClass --path ./class --activity SwigClass --package org.swig.classexample
$ cd class

Now create a jni subdirectory and then create a C++ header file jni/example.h which defines our hierarchy of shape classes:

/* File : example.h */

class Shape {
public:
  Shape() {
    nshapes++;
  }
  virtual ~Shape() {
    nshapes--;
  }
  double  x, y;   
  void    move(double dx, double dy);
  virtual double area() = 0;
  virtual double perimeter() = 0;
  static  int nshapes;
};

class Circle : public Shape {
private:
  double radius;
public:
  Circle(double r) : radius(r) { }
  virtual double area();
  virtual double perimeter();
};

class Square : public Shape {
private:
  double width;
public:
  Square(double w) : width(w) { }
  virtual double area();
  virtual double perimeter();
};

and create the implementation in the jni/example.cpp file:

/* File : example.cpp */

#include "example.h"
#define M_PI 3.14159265358979323846

/* Move the shape to a new location */
void Shape::move(double dx, double dy) {
  x += dx;
  y += dy;
}

int Shape::nshapes = 0;

double Circle::area() {
  return M_PI*radius*radius;
}

double Circle::perimeter() {
  return 2*M_PI*radius;
}

double Square::area() {
  return width*width;
}

double Square::perimeter() {
  return 4*width;
}

Create a SWIG interface file for this C++ code in jni/example.i:

/* File : example.i */
%module example

%{
#include "example.h"
%}

/* Let's just grab the original header file here */
%include "example.h"

Invoke SWIG as follows, note that the -c++ option is required for C++ code:

$ swig -c++ -java -package org.swig.classexample -outdir src/org/swig/classexample -o jni/example_wrap.cpp jni/example.i

SWIG generates the following files:

  • src/org/swig/classexample/Square.java
  • src/org/swig/classexample/exampleJNI.java
  • src/org/swig/classexample/example.java
  • src/org/swig/classexample/Circle.java
  • src/org/swig/classexample/Shape.java
  • jni/example_wrap.cpp

Next we need to create an Android NDK build system file for compiling the C++ code jni/Android.mk. The -frtti compiler flag isn't strictly needed for this example, but is needed for any code that uses C++ RTTI:

# File: Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := example
LOCAL_SRC_FILES := example_wrap.cpp example.cpp
LOCAL_CFLAGS    := -frtti

include $(BUILD_SHARED_LIBRARY)

A simple invocation of ndk-build will compile the .cpp files and generate a shared object/system library. Output will be similar to:

$ ndk-build
Compile++ thumb  : example <= example_wrap.cpp
Compile++ thumb  : example <= example.cpp
StaticLibrary  : libstdc++.a
SharedLibrary  : libexample.so
Install        : libexample.so => libs/armeabi/libexample.so

Now that the C JNI layer has been built, we can write Java code to call into this layer. Modify src/org/swig/classexample/SwigClass.java from the default to:

package org.swig.classexample;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.ScrollView;
import android.text.method.ScrollingMovementMethod;

public class SwigClass extends Activity
{
    TextView outputText = null;
    ScrollView scroller = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        outputText = (TextView)findViewById(R.id.OutputText);
        outputText.setText("Press 'Run' to start...\n");
        outputText.setMovementMethod(new ScrollingMovementMethod());

        scroller = (ScrollView)findViewById(R.id.Scroller);
    }

    public void onRunButtonClick(View view)
    {
      outputText.append("Started...\n");
      nativeCall();
      outputText.append("Finished!\n");
      
      // Ensure scroll to end of text
      scroller.post(new Runnable() {
        public void run() {
          scroller.fullScroll(ScrollView.FOCUS_DOWN);
        }
      });
    }

    /** Calls into C/C++ code */
    public void nativeCall()
    {
      // ----- Object creation -----

      outputText.append( "Creating some objects:\n" );
      Circle c = new Circle(10);
      outputText.append( "    Created circle " + c + "\n");
      Square s = new Square(10);
      outputText.append( "    Created square " + s + "\n");

      // ----- Access a static member -----

      outputText.append( "\nA total of " + Shape.getNshapes() + " shapes were created\n" );

      // ----- Member data access -----

      // Notice how we can do this using functions specific to
      // the 'Circle' class.
      c.setX(20);
      c.setY(30);

      // Now use the same functions in the base class
      Shape shape = s;
      shape.setX(-10);
      shape.setY(5);

      outputText.append( "\nHere is their current position:\n" );
      outputText.append( "    Circle = (" + c.getX() + " " + c.getY() + ")\n" );
      outputText.append( "    Square = (" + s.getX() + " " + s.getY() + ")\n" );

      // ----- Call some methods -----

      outputText.append( "\nHere are some properties of the shapes:\n" );
      Shape[] shapes = {c, s};
      for (int i=0; i<shapes.length; i++)
      {
        outputText.append( "   " + shapes[i].toString() + "\n" );
        outputText.append( "        area      = " + shapes[i].area() + "\n" );
        outputText.append( "        perimeter = " + shapes[i].perimeter() + "\n" );
      }

      // Notice how the area() and perimeter() functions really
      // invoke the appropriate virtual method on each object.

      // ----- Delete everything -----

      outputText.append( "\nGuess I'll clean up now\n" );

      // Note: this invokes the virtual destructor
      // You could leave this to the garbage collector
      c.delete();
      s.delete();

      outputText.append( Shape.getNshapes() + " shapes remain\n" );
      outputText.append( "Goodbye\n" );
    }

    /** static constructor */
    static {
        System.loadLibrary("example");
    }
}

Note the static constructor and the interesting JNI code is in the nativeCall method. The remaining code deals with the GUI aspects which are identical to the previous C simple example. Modify res/layout/main.xml to contain the xml for the 'Run' button and scrollable text view:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
    android:id="@+id/RunButton"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:text="Run..."  
    android:onClick="onRunButtonClick"
    />
<ScrollView
    android:id="@+id/Scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:id="@+id/OutputText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
</ScrollView>
</LinearLayout>

Compile the Java code as usual, uninstall the old version of the app if installed and re-install the new app:

$ ant debug
$ adb uninstall org.swig.classexample
$ adb install bin/SwigClass-debug.apk 

Run the app to see the result of calling the C++ code from Java:

Android screenshot of SwigClass example

19.2.4 Other examples

The Examples/android directory contains further examples which can be run and installed in a similar manner to the previous two examples.

Note that the 'extend' example is demonstrates the directors feature. Normally C++ exception handling and the STL is not available by default in the version of g++ shipped with Android, but this example turns these features on as described in the next section.

19.3 C++ STL

Should the C++ Standard Template Library (STL) be required, an Application.mk file needs to be created in the same directory as the Android.mk directory containing information about the STL to use. See the NDK documentation in the $NDKROOT/docs folder especially CPLUSPLUS-SUPPORT.html. Below is an example of the Application.mk file to make the STLport static library available for use:

# File: Application.mk
APP_STL := gnustl_static
swig-3.0.12/Doc/Manual/maketoc.py0000664000175000017500000000125713042756442016361 0ustar williamwilliam#!/usr/bin/env python import sys import os chs = open("chapters").readlines() f = open("Contents.html","w") print >>f, """ SWIG Users Manual

SWIG Users Manual

""" f.close() num = 1 for c in chs: c = c.strip() print "Processing %s" % c if c: os.system("python makechap.py %s %d >> Contents.html" % (c,num)) num += 1 f = open("Contents.html","a") print >>f, """ """ swig-3.0.12/Doc/Manual/swig16.png0000664000175000017500000001264213042756442016212 0ustar williamwilliam‰PNG  IHDR§U’ÌPLTEÿÿÿzzzÊÊÊ555ððð¡¡¡OOOýýýéé鬬¬ZZZßßߘ˜˜CCCfff'''×××½½½ùùù´´´}}}ääännn¿¿¿ÏÏÏ___“““///:::¦¦¦TTTaaaMMM ………ÇÇÇîîîòòòÒÒÒ÷÷÷‹‹‹ÍÍÍÚÚÚ···...áááGGGuuu???$$$æææiii €€€žžžIIIkkk,,,‚‚‚sssÅÅÅ>>>¯¯¯€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿÞêµp]IDATxœb`ÿÿbh ÿÿ$îäS”Ç«ÿÿxwJ °š››s©áUÿÿXwºÉ°˜ssƒ|*ÿÿ8wò)CÜ(**j ‚\üøTÿÿwꈛªqq9‚)ÊÆ\Ž‚øtÿÿ¢»;õÅ•LÌÕÔ  îÊØŸ6ÿÿ¢«;]Ä•åÌÕ€‘ w¢±»1Ì©\¢êx´ÿÿ¢›;%ØØÍÁ¡v˜±(„ºÐÊÝ ¤Jx´ÿÿ¢‹;™äQÍ…ÕîîÆV g‚1HÄÿÿ¢¹;”X€Qí(*Šp#(ü@޹‚Ü!1Çÿÿ¢©;ù ÕÔ žaB*î0— TÅÛ(ÿÿ¢™;xÌÔ`íFÀ`‡!ȵàd ÌC*V`GÅ@Ø·qÿÿ¢‰;]xäÔ¸D‘Ó#r$[1ƒÒ ÂtwgBh^ÂSuÿÿ¢º;uL ÕŒ#"·@CÑ †îVht¢1ÔÅ à6Æm,ÿÿ¢ª;­`\à °!Ñ Žr+˜û€a¨bD*V*HNvwçÕÅi4ÿÿ¢š;ÙLÕŒ‘#œê ±- G ³TÀñîs© PTä jÜm;ÿÿ¢†;µuÁµ5̉0÷‰Â‚PÅ ÌR¹$`I•`9Hpwÿÿ¢Ôâ pä‚"8-BÓ¡$—€\ça0€ãè ..ˆZP&R(€”õš¸ìÿÿ¢ÄœÀêTÃc–c ÉèpðiP\ƒ!0E•t´ô$å¡Ùž’D5Åeÿÿ"×Bl2†æ ªÐ¹š†ghchâc°‚2€nŸ»»Ô A°#a„;¾ ÿÿ"˲&ö úÚÑ”î°\Í) ·Ah3 r¡;84¤’A†ðj ¸KPÿÿ"Õz’ò† 7s9:rÁò,©1@Jd`á‡)$a‚ÃÓblLª@JGè)H (.{ÿÿ"Å"’,‚j`7;:ŠÂÊ =ð(; ’A!q$û€ÄÜÍ €9Ë8K ¸*I0J‚s<¢u×Áa7ÿÿ"ÖbJ, &®°ýì-pÁÚRZ2‚ÝA «0@Â\®iGPp:«2)»š)ÊØ‚r‚¢^Ôʇýÿÿ"Æn’ÀòQÍ Ž ¢0/à!+„+A4¨ ‚²­ âî\ÀÈÖQ²E†¼€¼¡(8Ô¡.ÅS‚ÿÿ"äN7qP@×ó6(0!íqhA+€T .d€E10Ì!å#8傼¡ânÌëºLæÚÊØ\’.­ y ämc-ìîÿÿÂçNiq95¹@Í\p‚ä‚6&¹ ÕÔ °;¬`áu¬»»“¾48¡ë®f/Áè¢ã̪9!Íeh¢eàTÔ»[ÿÿÂáN `UÊÖÀ¸‡ "IÂêF+QD¥ v%4Ü`aê(ÍÈáêîÎ|P«i0ŠÙȃ³ —𽤍h²b°‚ ¸:ÿÿÂâN1pŒiPÒìJ¤^ ¼5 ­{ %’<$!aêÎ¥ÌȨìq%¸TQ\œŒÂ:,@¢üºÂà(60TdEhŽÇQ2ÿÿBs'§“‰ 9¨ëêèq!RÇì>0„µ4 Á ­¡î…9ÖÝ^ƒQRR$ÁDE,¦+Ôg¦³Ò)σýØÛvÿÿBq§¢=¨*H,ƒÉq„gp(Ïñ ·‚ó6(|U¬àÏ`Ï%ÍÈÇ j˜ãEÙ%˜\ܹ°¢’¶]D±—LÿÿBq§¸¢‡$R[Ú¿qGnYBúŒîÐV(êÔøeÔÜa±$Ô€ýqEQ+xáD¢ÀrÉ™Ç XŽ:‰I ó ˜12JÉ¢›Ò¾š½× ÿÿBq§%°l„¦GPXº#"ä,`j3àZhé ÎÎVjÀ΢Œ(,׸ŒY9Õ é¢@@‡ñ8»3ˆÊÛ*òH*Êkeä®0æ±¶íÿÿBq§¨ çBJŒÐ~ ¸«tx÷ÑòºW˜à˜ìᤠƒ¨š'£ RJ:^T‘ÑNÕè Wee~[`$»ñ€ô3À“¨86wÿÿBÍG‚ÈYÛB¸C*ݬPú¢ ŠÜÂr]­õùmiQÅJMTŠÑZÙÝ ^úƒB”Ë…QLÇpŽÀ¬ª,ô¢ç2HÔ›;ÿÿBu§<(ã¸C\mAÂ>v%˜PSTæ‚”ò`eŠŒÚr<à2â0GwqF)`R@þ@µ¢Àf$Ÿ#(¦(3“2´\‚ rLÿÿBu§’(ZÝ íçˆB#YN”­ = wGE ìer¼•£¨ £¶28ZAkyPƒ ñ¶'9*ò12 €8 ˆî¨¨1wÿÿBu§—(<®!ÝYˆû@!¬>lmùÍaÎTÓÖÔò°~¯;—"°XW…5“@ ” è&e{¤âœBÙµ™„íAm5W`p2 ȇÀE$@±µíÿÿBu§ˆ¬^„¦BHÔÀ* ” ^U“5Ð`Ý!`³„ €(¬.µÕõyäQ*+`̳¸°–ƒ«½¹œŒ‘0 pAÛÉàŠgØJPÿÿB« áwÄxPÀœ®„Òhä ¹ðAªj pT¶,í- xè3’»,#0ÏXÁ«SHQot¨£¦$ze¡<¸fÇ>¶¶ÿÿBs§-,ù‰Bú­Ð¢SAÕHJ«‰Bƒ€ ’IêŽÊ<öjŠàðTƒ "@vŽ¢ŠŒBB† @µ£ ?¿"¼½£¸µ§>-1w+s ƒµø•€î”ÕH°’”£q¬,gÍH0àhŽhc*JʃÚ •€+6 ½<ŒÿÿBs§0°_4œáé´]ä¤l#榣#`Ïb ë#¨sª´%æ`m {°‹`ªæ(Á(àꎠ@Äen±OYRÚˆ8Ú¶ÇÒ¶ÿÿBoש¹Ã:=îð¼ Œ>FEnW{9e.p(ƒq s¼ƒ¼9¸i¤ E9pÉr­;ƒ —,Ð-îRžg5gQ–PT–1Qƒ4^ÁePBzÓXÚvÿÿBw'‹(d@iÌ@TÔ‰QBUŒßØ®w4w„” –±(@]Y@úôxelYÀ$+H¯]ÍQ†Q[Æ‘A¥òyCÔÜžE^Ú:µb°‚'´ Ãp'ÿÿBw§-¬Ñna€†1€n6eäöAÀ=8p 4b$Êt¡Ž“$Å(¸ãØÕ Ö‰•¢ŽjÀ°–QCÊîð:‚R .cÅ P̪ÿÿBw§8hF^ÝBÆPEùEBYPÍ\PNNÐ\ €Ô˜ÿmXDXA9ÉYˆÑŽÅ’iáYÛœ•ÑÚž¨0`îà —¯ØK&ÿÿBw§d°œ*Ú\ãZHè˜ê8h0jØ:‚º‡ õÆ…õ\õݸø5¤$ùåx ÙRj\lŒ.r؆[x'Qp¡ˆáNÿÿÂè™Ã zpun0˜K‚d4,À DuÔÀE3ÐjŒÚnвNrfâ|&¦À SVçu+hé,døÔ°ºÍÉVVÐ~ ¤âPEwÿÿÂp§¼(¼ ʆ½=Êœ³¾ — ¤Ã­lž[8é° Hóñ1ê"kU }7ws{sxD?” †¤f+XÔ#ÿÿÂp'lh Ò:gAQW9%f„ a%h‡F X²Š ¸H(šÛ»%ÜÔdDUMzh¯™`hÂFÃÁŽæ>EtgÿÿÂp§$KCÑ ÃDV\ʶr,rr,f¶Ê $ঠi…q™ë0J+ûéüö ÉI5whÿRkªDWèp¤|¦LG5CeI>^tG12ÿÿÂp§&´n‡9rjÊÎLª@`íl ,Œ\¡e¨ƒl ȰhƒÜÉ# M²ÂïFd6¬E,çäl%m„0ÝÿÿÂg0…È€S68c“¢œ­²¢ ??¼#'¿Œ(dvÀÞØÒeÔVSe³Ö¢Ú®¶V (CM¢›ÖÙà²ç·³ÁŽ0ÿÿÂt§h¤ip‹Rþs·#h´ÉžXÉ+«AFŒ]AE-5>ky FF~Aw‡¨ ; 30!¥ž¨£½­³ Žñ/ÿÿÂt§l.RzBªh7Þ‘KMñr¶Àָ̒3gå>E;~~'v5Q$w¸[!» ¹:‚Ž:‚3ò2ªøÂÿÿÂt§˜(,]-]¬ÜYìxÔ@YÑ\ÎD†‘×ÜÖ‘2Ví¨ìo¹2Ù *ûî*XËÌø¶ke‘a³ ìFÿÿÂt§ˆbTS2F`¥¢æÌ˨ok/¯l§Ìð’jüÐñY`Q fí¦(§ìèîh®æŽì4·ÂFšU Ýh59eg1,ÂÿÿÂ2^'( )š¬ }pÁ¬pµ8A=ÿÍíåà£[îŽ\\\ræ —€ëô¼USŒkEURÜÿÿÂâN[x ÎGàqð ,)rÙrA‡ A…(9¸£9 •9ÔÈvå•U¹It#ÿÿÂâNIÈPd&HÒ[TcAÈ 8ÚÊY©@û3Âá+÷ªÀHÐÔš¹<fË’8ÿÿÂâNcH-æÁ5µ¨œœ D–ÙÞÔ×E,D/¿aÖ`'G{[kulDÿÿÂ6î -é¡%(¤Í+*/ï* Ã¤ÌÂ/)`oïÑ@k´|ců ­ÀntæÃ·6‰ÿÿÂæNypƒÜ«V†'Ð=öÀ.¤3“¢œ(¸Ië›ÇÂÈÖà,­©fÔäáDÿÿÂæNeèšÐp,å@[ÕÔ@C³ÐæØ‘î pǪ0ÀJÈà0[KS„ÿÿÂæN&h¹ñƒ¤nm)‚ƒÔ š{ ‹hö«egn"‹p¢ÿÿÂæN .ð°18yA²«¬[*$a4 Pxç[ÔQPX<âœð'ÿÿÂ:$.˜Ü¡}køT%¤Á¦k4ÂF:¡¹ÔXxT)ÉÖ8ÿÿÂêN3wD Ñ>‡7 ?(œ¡…¬¸‰ ,)ÍÖ8ÿÿÂêNEQQX“ ÚÁ¶‚†¬ lü’]À“~  Æï¬JnNÿÿÂêN¤™6+xáÍ/Ðá5wH îÈeï*ƒ«N=ÿÿÂêN#cèX ê«\ Síа…ë*@{7‚ÿÿÂ>k­áa‹=`5=lÔS³ ZñHÿÿÂîN~Èä´1-6­  ÷DAS½®’Üts#ÿÿÂîNEQXï”]À+¸ ó°Ö#'Vm4ÿÿÂîNcØ 2lÙ#$ Y€­pjV3DÿÿÂîN CHÁ›ì, alink = re.compile(r".*", re.IGNORECASE) heading = re.compile(r"(_nn\d)", re.IGNORECASE) def getheadingname(m): autogeneratedheading = True; if m.group(1) != None: amatch = alink.match(m.group(1)) if amatch: # A non-autogenerated heading - keep it headingname = amatch.group(1) autogeneratedheading = heading.match(headingname) if autogeneratedheading: # The heading name was either non-existent or autogenerated, # We can create a new heading / change the existing heading headingname = "%s_nn%d" % (filenamebase, nameindex) return headingname # Return heading - 1.1. Introduction in the examples below: # old style example:

1.1 Introduction

# new style example:

1.1 Introduction

def getheadingtext(m, s): prevheadingtext_newstyle = m.group(2) prevheadingtext_oldstyle = m.group(3) if len(prevheadingtext_oldstyle) == 0 and len(prevheadingtext_newstyle) == 0: raise RuntimeError("No heading text in line:\n%s" % s) if len(prevheadingtext_oldstyle) > 0 and len(prevheadingtext_newstyle) > 0: raise RuntimeError("Two heading texts, only one should be specified in line:\n%s" % s) prevheadingtext = prevheadingtext_oldstyle if len(prevheadingtext_oldstyle) > 0 else prevheadingtext_newstyle return prevheadingtext ############################################################################### # Main program ############################################################################### if len(sys.argv) != 3: print "usage: makechap.py filename num" sys.exit(1) filename = sys.argv[1] filenamebase = string.split(filename,".")[0] num = int(sys.argv[2]) section = 0 subsection = 0 subsubsection = 0 nameindex = 0 name = "" # Regexs for

,...

sections h1 = re.compile(r".*?

(\s*[\d\s]*(.*?))*[\d\s]*(.*?)

", re.IGNORECASE) h2 = re.compile(r".*?

(\s*[\d\.\s]*(.*?))*[\d\.\s]*(.*?)

", re.IGNORECASE) h3 = re.compile(r".*?

(\s*[\d\.\s]*(.*?))*[\d\.\s]*(.*?)

", re.IGNORECASE) h4 = re.compile(r".*?

(\s*[\d\.\s]*(.*?))*[\d\.\s]*(.*?)

", re.IGNORECASE) h5 = re.compile(r".*?
(\s*[\d\.\s]*(.*?))*[\d\.\s]*(.*?)
", re.IGNORECASE) data = open(filename).read() # Read data open(filename+".bak","w").write(data) # Make backup lines = data.splitlines() result = [ ] # This is the result of postprocessing the file index = "\n
\n" # index contains the index for adding at the top of the file. Also printed to stdout. skip = 0 skipspace = 0 for s in lines: if s == "": if not skip: skip = 1 else: skip = 0 continue; if skip: continue if not s and skipspace: continue if skipspace: result.append("") result.append("") skipspace = 0 m = h1.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 headingname = getheadingname(m) result.append("""

%d %s

""" % (headingname,num,prevheadingtext)) result.append("@INDEX@") section = 0 subsection = 0 subsubsection = 0 subsubsubsection = 0 name = prevheadingtext skipspace = 1 continue m = h2.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 section += 1 headingname = getheadingname(m) result.append("""

%d.%d %s

""" % (headingname,num,section, prevheadingtext)) if subsubsubsection: index += "\n" if subsubsection: index += "\n" if subsection: index += "\n" if section == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsection = 0 subsubsection = 0 subsubsubsection = 0 skipspace = 1 continue m = h3.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsection += 1 headingname = getheadingname(m) result.append("""

    %d.%d.%d %s

    """ % (headingname,num,section, subsection, prevheadingtext)) if subsubsubsection: index += "
\n" if subsubsection: index += "\n" if subsection == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsubsection = 0 skipspace = 1 continue m = h4.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsubsection += 1 headingname = getheadingname(m) result.append("""

    %d.%d.%d.%d %s

    """ % (headingname,num,section, subsection, subsubsection, prevheadingtext)) if subsubsubsection: index += "
\n" if subsubsection == 1: index += "
    \n" index += """
  • %s\n""" % (headingname,prevheadingtext) subsubsubsection = 0 skipspace = 1 continue m = h5.match(s) if m: prevheadingtext = getheadingtext(m, s) nameindex += 1 subsubsubsection += 1 headingname = getheadingname(m) result.append("""
    %d.%d.%d.%d.%d %s
    """ % (headingname,num,section, subsection, subsubsection, subsubsubsection, prevheadingtext)) if subsubsubsection == 1: index += "
      \n" index += """
    • %s\n""" % (headingname,prevheadingtext) skipspace = 1 continue result.append(s) if subsubsubsection: index += "
    \n" if subsubsection: index += "
\n" if subsection: index += "\n" if section: index += "\n" index += "
\n\n" data = "\n".join(result) data = data.replace("@INDEX@",index) + "\n"; # Write the file back out open(filename,"w").write(data) # Print the TOC data to stdout correcting the anchor links for external referencing index = index.replace("
  • %d %s\n""" % (filename,filenamebase,num,name) print index swig-3.0.12/Doc/Manual/fixstyle.py0000664000175000017500000000111513042756442016576 0ustar williamwilliam#!/usr/bin/python # Replace the inline htmldoc stylesheet with the SWIG stylesheet import sys import string filename = sys.argv[1] data = open(filename).read() open(filename+".bak","w").write(data) swigstyle = "\n" + open("style.css").read() lines = data.splitlines() result = [ ] skip = False for s in lines: if not skip: result.append(s) if s == "": result.append(s) skip = False data = "\n".join(result) open(filename,"w").write(data) swig-3.0.12/Doc/Manual/CCache.html0000664000175000017500000004676013042756671016374 0ustar williamwilliam ccache-swig(1) manpage

    17 Using SWIG with ccache - ccache-swig(1) manpage

    17.1 NAME

    ccache-swig - a fast compiler cache

    17.2 SYNOPSIS

    ccache-swig [OPTION]

    ccache-swig <compiler> [COMPILER OPTIONS]

    <compiler> [COMPILER OPTIONS]

    17.3 DESCRIPTION

    ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. ccache and ccache-swig are used interchangeably in this document.

    17.4 OPTIONS SUMMARY

    Here is a summary of the options to ccache-swig.

    
    -s                      show statistics summary
    -z                      zero statistics
    -c                      run a cache cleanup
    -C                      clear the cache completely
    -F <n>                  set maximum files in cache
    -M <n>                  set maximum size of cache (use G, M or K)
    -h                      this help page
    -V                      print version number
    
    

    17.5 OPTIONS

    These options only apply when you invoke ccache as "ccache-swig". When invoked as a compiler none of these options apply. In that case your normal compiler options apply and you should refer to your compilers documentation.

    -h
    Print a options summary page

    -s
    Print the current statistics summary for the cache. The statistics are stored spread across the subdirectories of the cache. Using "ccache-swig -s" adds up the statistics across all subdirectories and prints the totals.

    -z
    Zero the cache statistics.

    -V
    Print the ccache version number

    -c
    Clean the cache and re-calculate the cache file count and size totals. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile. This option is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate.

    -C
    Clear the entire cache, removing all cached files.

    -F <maxfiles>
    This sets the maximum number of files allowed in the cache. The value is stored inside the cache directory and applies to all future compiles. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16.

    -M <maxsize>
    This sets the maximum cache size. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value. The default is gigabytes. The actual value stored is rounded down to the nearest multiple of 16 kilobytes.

    17.6 INSTALLATION

    There are two ways to use ccache. You can either prefix your compile commands with "ccache-swig" or you can create a symbolic link between ccache-swig and the names of your compilers. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects. The second method is most useful for when you wish to use ccache for all your compiles.

    To install for usage by the first method just copy ccache-swig to somewhere in your path.

    To install for the second method do something like this:

    
      cp ccache-swig /usr/local/bin/
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/gcc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/g++
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/cc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/swig
    
    
    This will work as long as /usr/local/bin comes before the path to gcc (which is usually in /usr/bin). After installing you may wish to run "which gcc" to make sure that the correct link is being used.

    Note! Do not use a hard link, use a symbolic link. A hardlink will cause "interesting" problems.

    17.7 EXTRA OPTIONS

    When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option '--ccache-skip'. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is.

    The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things). The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C file). By using --ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option.

    17.8 ENVIRONMENT VARIABLES

    ccache uses a number of environment variables to control operation. In most cases you won't need any of these as the defaults will be fine.

    CCACHE_DIR
    the CCACHE_DIR environment variable specifies where ccache will keep its cached compiler output. The default is "$HOME/.ccache".

    CCACHE_TEMPDIR
    the CCACHE_TEMPDIR environment variable specifies where ccache will put temporary files. The default is the same as CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same filesystem as the CCACHE_DIR path, so that renames of files between the two directories can work.

    CCACHE_LOGFILE
    If you set the CCACHE_LOGFILE environment variable then ccache will write some log information on cache hits and misses in that file. This is useful for tracking down problems.

    CCACHE_VERBOSE
    If you set the CCACHE_VERBOSE environment variable then ccache will display on stdout all the compiler invocations that it makes. This can useful for debugging unexpected problems.

    CCACHE_PATH
    You can optionally set CCACHE_PATH to a colon separated path where ccache will look for the real compilers. If you don't do this then ccache will look for the first executable matching the compiler name in the normal PATH that isn't a symbolic link to ccache itself.

    CCACHE_CC
    You can optionally set CCACHE_CC to force the name of the compiler to use. If you don't do this then ccache works it out from the command line.

    CCACHE_PREFIX
    This option adds a prefix to the command line that ccache runs when invoking the compiler. Also see the section below on using ccache with distcc.

    CCACHE_DISABLE
    If you set the environment variable CCACHE_DISABLE then ccache will just call the real compiler, bypassing the cache completely.

    CCACHE_READONLY
    the CCACHE_READONLY environment variable tells ccache to attempt to use existing cached object files, but not to try to add anything new to the cache. If you are using this because your CCACHE_DIR is read-only, then you may find that you also need to set CCACHE_TEMPDIR as otherwise ccache will fail to create the temporary files.

    CCACHE_CPP2
    If you set the environment variable CCACHE_CPP2 then ccache will not use the optimisation of avoiding the 2nd call to the pre-processor by compiling the pre-processed output that was used for finding the hash in the case of a cache miss. This is primarily a debugging option, although it is possible that some unusual compilers will have problems with the intermediate filename extensions used in this optimisation, in which case this option could allow ccache to be used.

    CCACHE_NOCOMPRESS
    If you set the environment variable CCACHE_NOCOMPRESS then there is no compression used on files that go into the cache. However, this setting has no effect on how files are retrieved from the cache, compressed results will still be usable.

    CCACHE_NOSTATS
    If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile.

    CCACHE_NLEVELS
    The environment variable CCACHE_NLEVELS allows you to choose the number of levels of hash in the cache directory. The default is 2. The minimum is 1 and the maximum is 8.

    CCACHE_HARDLINK
    If you set the environment variable CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like 'make' that rely on modification times. Hard links are never made for compressed cache files.

    CCACHE_RECACHE
    This forces ccache to not use any cached results, even if it finds them. New results are still cached, but existing cache entries are ignored.

    CCACHE_UMASK
    This sets the umask for ccache and all child processes (such as the compiler). This is mostly useful when you wish to share your cache with other users. Note that this also affects the file permissions set on the object files created from your compilations.

    CCACHE_HASHDIR
    This tells ccache to hash the current working directory when calculating the hash that is used to distinguish two compiles. This prevents a problem with the storage of the current working directory in the debug info of a object file, which can lead ccache to give a cached object file that has the working directory in the debug info set incorrectly. This option is off by default as the incorrect setting of this debug info rarely causes problems. If you strike problems with gdb not using the correct directory then enable this option.

    CCACHE_UNIFY
    If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor output if -g is not used in the compile. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only. Note that using CCACHE_UNIFY changes the hash, so cached compiles with CCACHE_UNIFY set cannot be used when CCACHE_UNIFY is not set and vice versa. The reason the unifier is off by default is that it can give incorrect line number information in compiler warning messages.

    CCACHE_EXTENSION
    Normally ccache tries to automatically determine the extension to use for intermediate C pre-processor files based on the type of file being compiled. Unfortunately this sometimes doesn't work, for example when using the aCC compiler on HP-UX. On systems like this you can use the CCACHE_EXTENSION option to override the default. On HP-UX set this environment variable to "i" if you use the aCC compiler.

    CCACHE_STRIPC
    If you set the environment variable CCACHE_STRIPC then ccache will strip the -c option when invoking the preprocessor. This option is primarily for the Sun Workshop C++ compiler as without this option an unwarranted warning is displayed: CC: Warning: "-E" redefines product from "object" to "source (stdout)" when -E and -c is used together.

    CCACHE_SWIG
    When using SWIG as the compiler and it does not have 'swig' in the executable name, then the CCACHE_SWIG environment variable needs to be set in order for ccache to work correctly with SWIG. The use of CCACHE_CPP2 is also recommended for SWIG due to some preprocessor quirks, however, use of CCACHE_CPP2 can often be skipped -- check your generated code with and without this option set. Known problems are using preprocessor directives within %inline blocks and the use of '#pragma SWIG'.

    17.9 CACHE SIZE MANAGEMENT

    By default ccache has a one gigabyte limit on the cache size and no maximum number of files. You can set a different limit using the "ccache -M" and "ccache -F" options, which set the size and number of files limits.

    When these limits are reached ccache will reduce the cache to 20% below the numbers you specified in order to avoid doing the cache clean operation too often.

    17.10 CACHE COMPRESSION

    By default on most platforms ccache will compress all files it puts into the cache using the zlib compression. While this involves a negligible performance slowdown, it significantly increases the number of files that fit in the cache. You can turn off compression setting the CCACHE_NOCOMPRESS environment variable.

    17.11 HOW IT WORKS

    The basic idea is to detect when you are compiling exactly the same code a 2nd time and use the previously compiled output. You detect that it is the same code by forming a hash of:

    • the pre-processor output from running the compiler with -E
    • the command line options
    • the real compilers size and modification time
    • any stderr output generated by the compiler

    These are hashed using md4 (a strong hash) and a cache file is formed based on that hash result. When the same compilation is done a second time ccache is able to supply the correct compiler output (including all warnings etc) from the cache.

    ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache. If you ever discover a case where ccache changes the output of your compiler then please let me know.

    17.12 USING CCACHE WITH DISTCC

    distcc is a very useful program for distributing compilation across a range of compiler servers. It is often useful to combine distcc with ccache, so that compiles that are done are sped up by distcc, but that ccache avoids the compile completely where possible.

    To use distcc with ccache I recommend using the CCACHE_PREFIX option. You just need to set the environment variable CCACHE_PREFIX to 'distcc' and ccache will prefix the command line used with the compiler with the command 'distcc'.

    17.13 SHARING A CACHE

    A group of developers can increase the cache hit rate by sharing a cache directory. The hard links however cause unwanted side effects, as all links to a cached file share the file's modification timestamp. This results in false dependencies to be triggered by timestamp-based build systems whenever another user links to an existing file. Typically, users will see that their libraries and binaries are relinked without reason. To share a cache without side effects, the following conditions need to be met:

    • Use the same CCACHE_DIR environment variable setting
    • Unset the CCACHE_HARDLINK environment variable
    • Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group.
    • Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache).
    • Make sure that the setgid bit is set on all directories in the cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this.
    • Set CCACHE_NOCOMPRESS for all users, if there are users with versions of ccache that do not support compression.

    17.14 HISTORY

    ccache was inspired by the compilercache shell script script written by Erik Thiele and I would like to thank him for an excellent piece of work. See http://www.erikyyy.de/compilercache/ for the Erik's scripts. ccache-swig is a port of the original ccache with support added for use with SWIG.

    I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version.

    17.15 DIFFERENCES FROM COMPILERCACHE

    The biggest differences between Erik's compilercache script and ccache are:

    • ccache is written in C, which makes it a bit faster (calling out to external programs is mostly what slowed down the scripts).
    • ccache can automatically find the real compiler
    • ccache keeps statistics on hits/misses
    • ccache can do automatic cache management
    • ccache can cache compiler output that includes warnings. In many cases this gives ccache a much higher cache hit rate.
    • ccache can handle a much wider ranger of compiler options
    • ccache avoids a double call to cpp on a cache miss

    17.16 CREDITS

    Thanks to the following people for their contributions to ccache

    • Erik Thiele for the original compilercache script
    • Luciano Rocha for the idea of compiling the pre-processor output to avoid a 2nd cpp pass
    • Paul Russell for many suggestions and the debian packaging

    17.17 AUTHOR

    ccache was written by Andrew Tridgell http://samba.org/~tridge/. ccache was adapted to create ccache-swig for use with SWIG by William Fulton.

    If you wish to report a problem or make a suggestion then please email the SWIG developers on the swig-devel mailing list, see http://www.swig.org/mail.html

    ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details.

    swig-3.0.12/Doc/Manual/Lisp.html0000664000175000017500000005710513042756672016171 0ustar williamwilliam SWIG and Common Lisp

    27 SWIG and Common Lisp

    Common Lisp is a high-level, all-purpose, object-oriented, dynamic, functional programming language with long history. Common Lisp is used in many fields, ranging from web development to finance, and also common in computer science education. There are more than 9 different implementations of common lisp which are available, all have different foreign function interfaces. SWIG currently supports only the Allegro Common Lisp, Common Foreign Function Interface(CFFI), CLisp and UFFI foreign function interfaces.

    27.1 Allegro Common Lisp

    Allegro Common Lisp support in SWIG has been updated to include support for both C and C++. You can read about the interface here

    27.2 Common Foreign Function Interface(CFFI)

    CFFI, the Common Foreign Function Interface, is a portable foreign function interface for ANSI Common Lisp systems, similar in spirit to UFFI. Unlike UFFI, CFFI requires only a small set of low-level functionality from the Lisp implementation, such as calling a foreign function by name, allocating foreign memory, and dereferencing pointers.

    To run the cffi module of SWIG requires very little effort, you just need to run:

    swig -cffi -module module-name   file-name 
    
    

    But a better was of using all the power of SWIG is to write SWIG interface files. Below we will explain how to write interface files and the various things which you can do with them.

    27.2.1 Additional Commandline Options

    The following table list the additional commandline options available for the CLISP module. They can also be seen by using:

    swig -cffi -help 
    

    CFFI specific options
    -generate-typedef If this option is given then defctype will be used to generate
    shortcuts according to the typedefs in the input.
    -[no]cwrap Turn on or turn off generation of an intermediate C file when
    creating a C interface. By default this is only done for C++ code.
    -[no]swig-lisp Turns on or off generation of code for helper lisp macro, functions, etc. which SWIG uses while generating wrappers. These macros, functions may still be used by generated wrapper code.

    27.2.2 Generating CFFI bindings

    As we mentioned earlier the ideal way to use SWIG is to use interface files. To illustrate the use of it, let's assume that we have a file named test.h with the following C code:
    #define y 5
    #define x (y >>  1)
    
    typedef int days;
    
    struct bar {
      short p, q;
      char a, b;
      int *z[1000];
      struct bar * n;
    };
      
    struct   bar * my_struct;
    
    struct foo {
      int a;
      struct foo * b[100];
    };
    
    int pointer_func(void (*ClosureFun)( void* _fun, void* _data, void* _evt ), int p);
    
    int func123(div_t * p, int **q[100], int r[][1000][10]);
    
    void lispsort_double (int n, double * array);
    
    enum color { RED, BLUE, GREEN};
    
    Corresponding to this we will write a simple interface file:
    %module test
    
    %include "test.h"
    
    
    The generated SWIG Code will be:
    ;;;SWIG wrapper code starts here
    
    (cl:defmacro defanonenum (&body enums)
       "Converts anonymous enums to defconstants."
      `(cl:progn , @(cl:loop for value in enums
                            for index = 0 then (cl:1+ index)
                            when (cl:listp value) do (cl:setf index (cl:second value)
                                                              value (cl:first value))
                            collect `(cl:defconstant , value , index))))
    
    (cl:eval-when (:compile-toplevel :load-toplevel)
      (cl:unless (cl:fboundp 'swig-lispify)
        (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*))
          (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst)))
                        (cl:cond
                          ((cl:null lst)
                           rest)
                          ((cl:upper-case-p c)
                           (helper (cl:cdr lst) 'upper
                                   (cl:case last
                                     ((lower digit) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:lower-case-p c)
                           (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest)))
                          ((cl:digit-char-p c)
                           (helper (cl:cdr lst) 'digit 
                                   (cl:case last
                                     ((upper lower) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:char-equal c #\_)
                           (helper (cl:cdr lst) '_ (cl:cons #\- rest)))
                          (cl:t
                           (cl:error "Invalid character: ~A" c)))))
            (cl:let ((fix (cl:case flag
                            ((constant enumvalue) "+")
                            (variable "*")
                            (cl:t ""))))
              (cl:intern
               (cl:concatenate
                'cl:string
                fix
                (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil))
                fix)
               package))))))
    
    ;;;SWIG wrapper code ends here
    
    
    (cl:defconstant y 5)
    
    (cl:defconstant x (cl:ash 5 -1))
    
    (cffi:defcstruct bar
            (p :short)
            (q :short)
            (a :char)
            (b :char)
            (z :pointer)
            (n :pointer))
    
    (cffi:defcvar ("my_struct" my_struct)
     :pointer)
    
    (cffi:defcstruct foo
            (a :int)
            (b :pointer))
    
    (cffi:defcfun ("pointer_func" pointer_func) :int
      (ClosureFun :pointer)
      (p :int))
    
    (cffi:defcfun ("func123" func123) :int
      (p :pointer)
      (q :pointer)
      (r :pointer))
    
    (cffi:defcfun ("lispsort_double" lispsort_double) :void
      (n :int)
      (array :pointer))
    
    (cffi:defcenum color
            :RED
            :BLUE
            :GREEN)
    

    The SWIG wrapper code refers to the special code which SWIG may need to use while wrapping C code. You can turn on/off the generation of this code by using the -[no]swig-lisp option. You must have noticed that SWIG goes one extra step to ensure that CFFI does not do automatic lispification of the C function names. The reason SWIG does this is because quite often developers want to build a nice CLOS based lispy API, and this one to one correspondence between C function names and lisp function name helps.

    Maybe you want to have your own convention for generating lisp function names for corresponding C function names, or you just want to lispify the names, also, before we forget you want to export the generated lisp names. To do this, we will use the SWIG feature directive. Let's edit the interface file such that the C type "div_t*" is changed to Lisp type ":my-pointer", we lispify all names, export everything, and do some more stuff.

    %module test
    
    %typemap(cin) div_t* ":my-pointer";
    
    %feature("intern_function", "1");
    %feature("export");
    
    %feature("inline") lispsort_double;
    %feature("intern_function", "my-lispify") lispsort_double;
    %feature("export", package="'some-other-package") lispsort_double;
    
    %rename func123 renamed_cool_func;
    
    %ignore "pointer_func";
    
    %include "test.h"
    
    

    The typemap(cin) ensures that for all arguments which are input to C with the type "div_t*", the ":my-pointer" type be used. Similarly typemap(cout) are used for all types which are returned from C.

    The feature intern_function ensures that all C names are interned using the swig-lispify function. The "1" given to the feature is optional. The use of feature like %feature("intern_function", "1"); globally enables interning for everything. If you want to target a single function, or declaration then use the targeted version of feature, %feature("intern_function", "my-lispify") lispsort_double;, here we are using an additional feature which allows us to use our lispify function.

    The export feature allows us to export the symbols. If the package argument is given, then the symbol will be exported to the specified Lisp package. The inline feature declaims the declared function as inline. The rename directive allows us to change the name(it is useful when generating C wrapper code for handling overloaded functions). The ignore directive ignores a certain declaration.

    There are several other things which are possible, to see some example of usage of SWIG look at the Lispbuilder and wxCL projects. The generated code with 'noswig-lisp' option is:

    (cl:defconstant #.(swig-lispify "y" 'constant) 5)
    
    (cl:export '#.(swig-lispify "y" 'constant))
    
    (cl:defconstant #.(swig-lispify "x" 'constant) (cl:ash 5 -1))
    
    (cl:export '#.(swig-lispify "x" 'constant))
    
    (cffi:defcstruct #.(swig-lispify "bar" 'classname)
            (#.(swig-lispify "p" 'slotname) :short)
            (#.(swig-lispify "q" 'slotname) :short)
            (#.(swig-lispify "a" 'slotname) :char)
            (#.(swig-lispify "b" 'slotname) :char)
            (#.(swig-lispify "z" 'slotname) :pointer)
            (#.(swig-lispify "n" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "bar" 'classname))
    
    (cl:export '#.(swig-lispify "p" 'slotname))
    
    (cl:export '#.(swig-lispify "q" 'slotname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cl:export '#.(swig-lispify "z" 'slotname))
    
    (cl:export '#.(swig-lispify "n" 'slotname))
    
    (cffi:defcvar ("my_struct" #.(swig-lispify "my_struct" 'variable))
     :pointer)
    
    (cl:export '#.(swig-lispify "my_struct" 'variable))
    
    (cffi:defcstruct #.(swig-lispify "foo" 'classname)
            (#.(swig-lispify "a" 'slotname) :int)
            (#.(swig-lispify "b" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "foo" 'classname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cffi:defcfun ("renamed_cool_func" #.(swig-lispify "renamed_cool_func" 'function)) :int
      (p :my-pointer)
      (q :pointer)
      (r :pointer))
    
    (cl:export '#.(swig-lispify "renamed_cool_func" 'function))
    
    (cl:declaim (cl:inline #.(my-lispify "lispsort_double" 'function)))
    
    (cffi:defcfun ("lispsort_double" #.(my-lispify "lispsort_double" 'function)) :void
      (n :int)
      (array :pointer))
    
    (cl:export '#.(my-lispify "lispsort_double" 'function) 'some-other-package)
    
    (cffi:defcenum #.(swig-lispify "color" 'enumname)
            #.(swig-lispify "RED" 'enumvalue :keyword)
            #.(swig-lispify "BLUE" 'enumvalue :keyword)
            #.(swig-lispify "GREEN" 'enumvalue :keyword))
    
    (cl:export '#.(swig-lispify "color" 'enumname))
    
    

    27.2.3 Generating CFFI bindings for C++ code

    This feature to SWIG (for CFFI) is very new and still far from complete. Pitch in with your patches, bug reports and feature requests to improve it.

    Generating bindings for C++ code, requires -c++ option to be present and it first generates C binding which will wrap the C++ code, and then generates the corresponding CFFI wrapper code. In the generated C wrapper code, you will often want to put your own C code, such as the code to include various files. This can be done by making use of "%{" and "%}" as shown below.

    %{
     #include "Test/test.h"
    %}
    

    Also, while parsing the C++ file and generating C wrapper code SWIG may need to be able to understand various symbols used in other header files. To help SWIG in doing this while ensuring that wrapper code is generated for the target file, use the "import" directive. The "include" directive specifies the target file for which wrapper code will be generated.

    
    %import "ancillary/header.h"
    
    %include "target/header.h"
    
    
    Various features which were available for C headers can also be used here. The target header which we are going to use here is:
    namespace OpenDemo {
      class Test
      {
        public:
          float x;
          // constructors
          Test (void) {x = 0;}
          Test (float X) {x = X;}
    
          // vector addition
          Test operator+ (const Test& v) const {return Test (x+v.x);}
    
          // length squared
          float lengthSquared (void) const {return this->dot (*this);}
    
          static float distance (const Test& a, const Test& b){return(a-b).length();}
    
          inline Test parallelComponent (const Test& unitBasis) const {
            return unitBasis * projection;
          }
    
          Test setYtoZero (void) const {return Test (this->x);}
    
          static const Test zero;
      };
    
      inline Test operator* (float s, const Test& v) {return v*s;}
    
      inline std::ostream& operator<< (std::ostream& o, const Test& v)
      {
        return o << "(" << v.x << ")";
      }
    
      inline Test RandomUnitVectorOnXZPlane (void)
      {
        return RandomVectorInUnitRadiusSphere().setYtoZero().normalize();
      }
    }
    

    The interface used is:

    %module test
    %include "test.cpp"
    
    SWIG generates 3 files, the first one is a C wrap which we don't show, the second is the plain CFFI wrapper which is as shown below:
    (cffi:defcfun ("_wrap_Test_x_set" Test_x_set) :void
      (self :pointer)
      (x :float))
    
    (cffi:defcfun ("_wrap_Test_x_get" Test_x_get) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_0" new_Test) :pointer)
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_1" new_Test) :pointer
      (X :float))
    
    (cffi:defcfun ("_wrap_Test___add__" Test___add__) :pointer
      (self :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_Test_lengthSquared" Test_lengthSquared) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_Test_distance" Test_distance) :float
      (a :pointer)
      (b :pointer))
    
    (cffi:defcfun ("_wrap_Test_parallelComponent" Test_parallelComponent) :pointer
      (self :pointer)
      (unitBasis :pointer))
    
    (cffi:defcfun ("_wrap_Test_setYtoZero" Test_setYtoZero) :pointer
      (self :pointer))
    
    (cffi:defcvar ("Test_zero" Test_zero)
     :pointer)
    
    (cffi:defcfun ("_wrap_delete_Test" delete_Test) :void
      (self :pointer))
    
    (cffi:defcfun ("_wrap___mul__" __mul__) :pointer
      (s :float)
      (v :pointer))
    
    (cffi:defcfun ("_wrap___lshift__" __lshift__) :pointer
      (o :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_RandomUnitVectorOnXZPlane" RandomUnitVectorOnXZPlane) :pointer)
    
    The output is pretty good but it fails in disambiguating overloaded functions such as the constructor, in this case. One way of resolving this problem is to make the interface use the rename directiv, but hopefully there are better solutions. In addition SWIG also generates, a CLOS file
    (clos:defclass test()
      ((ff :reader ff-pointer)))
    
    (clos:defmethod (cl:setf x) (arg0 (obj test))
      (Test_x_set (ff-pointer obj) arg0))
    
    (clos:defmethod x ((obj test))
      (Test_x_get (ff-pointer obj)))
    
    (cl:shadow "+")
    (clos:defmethod + ((obj test) (self test) (v test))
      (Test___add__ (ff-pointer obj) (ff-pointer self) (ff-pointer v)))
    
    (clos:defmethod length-squared ((obj test) (self test))
      (Test_lengthSquared (ff-pointer obj) (ff-pointer self)))
    
    (clos:defmethod parallel-component ((obj test) (self test) (unitBasis test))
      (Test_parallelComponent (ff-pointer obj) (ff-pointer self) (ff-pointer unitBasis)))
    
    (clos:defmethod set-yto-zero ((obj test) (self test))
      (Test_setYtoZero (ff-pointer obj) (ff-pointer self)))
    

    I agree that the CFFI C++ module needs lot more work. But I hope it provides a starting point, on which you can base your work of importing C++ libraries to Lisp.

    If you have any questions, suggestions, patches, etc., related to CFFI module feel free to contact us on the SWIG mailing list, and also please add a "[CFFI]" tag in the subject line.

    27.2.4 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file:

    • lisphead - inserts before type declarations
    • swiglisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    27.3 CLISP

    CLISP is a feature-loaded implementation of common lisp which is portable across most of the operating system environments and hardware. CLISP includes an interpreter, a compiler, a debugger, CLOS, MOP, a foreign language interface, i18n, regular expressions, a socket interface, and more. An X11 interface is available through CLX, Garnet and CLUE/CLIO. Command line editing is provided by readline. CLISP runs Maxima, ACL2 and many other Common Lisp packages.

    To run the clisp module of SWIG requires very little effort, you just need to execute:

    swig -clisp -module module-name   file-name 
    
    

    Because of the high level nature of the CLISP FFI, the bindings generated by SWIG may not be absolutely correct, and you may need to modify them. The good thing is that you don't need to complex interface file for the CLISP module. The CLISP module tries to produce code which is both human readable and easily modifyable.

    27.3.1 Additional Commandline Options

    The following table list the additional commandline options available for the CLISP module. They can also be seen by using:

    swig -clisp -help 
    

    CLISP specific options
    -extern-all If this option is given then clisp definitions for all the functions
    and global variables will be created otherwise only definitions for
    externed functions and variables are created.
    -generate-typedef If this option is given then def-c-type will be used to generate
    shortcuts according to the typedefs in the input.

    27.3.2 Details on CLISP bindings

    As mentioned earlier the CLISP bindings generated by SWIG may need some modifications. The clisp module creates a lisp file with the same name as the module name. This lisp file contains a 'defpackage' declaration, with the package name same as the module name. This package uses the 'common-lisp' and 'ffi' packages. Also, package exports all the functions, structures and variables for which an ffi binding was generated.
    After generating the defpackage statement, the clisp module also sets the default language.

    (defpackage :test
        (:use :common-lisp :ffi)
      (:export
       :make-bar
       :bar-x
       :bar-y
       :bar-a
       :bar-b
       :bar-z
       :bar-n
       :pointer_func
       :func123
       :make-cfunr
       :lispsort_double
       :test123))
    
    (in-package :test)
    
    (default-foreign-language :stdc)
    

    The ffi wrappers for functions and variables are generated as shown below. When functions have arguments of type "double * array", SWIG doesn't knows whether it is an 'out' argument or it is an array which will be passed, so SWIG plays it safe by declaring it as an '(array (ffi:c-ptr DOUBLE-FLOAT))'. For arguments of type "int **z[100]" where SWIG has more information, i.e., it knows that 'z' is an array of pointers to pointers of integers, SWIG defines it to be '(z (ffi:c-ptr (ffi:c-array (ffi:c-ptr (ffi:c-ptr ffi:int)) 100)))'

    extern "C" {
    int pointer_func(void (*ClosureFun)( void* _fun, void* _data, void* _evt ), int y);
    
    int func123(div_t * x, int **z[100], int y[][1000][10]);
    
    void lispsort_double (int n, double * array);
    
    void test123(float x , double y);
    
    }
    
    (ffi:def-call-out pointer_func
        (:name "pointer_func")
      (:arguments (ClosureFun (ffi:c-function (:arguments (arg0 (ffi:c-pointer NIL))
                                                          (arg1 (ffi:c-pointer NIL))
                                                          (arg2 (ffi:c-pointer NIL)))
                                              (:return-type NIL)))
                  (y ffi:int))
      (:return-type ffi:int)
      (:library +library-name+))
    
    (ffi:def-call-out func123
        (:name "func123")
      (:arguments (x (ffi:c-pointer div_t))
                  (z (ffi:c-ptr (ffi:c-array (ffi:c-ptr (ffi:c-ptr ffi:int)) 100)))
                  (y (ffi:c-ptr (ffi:c-ptr (ffi:c-array ffi:int (1000 10))))))
      (:return-type ffi:int)
      (:library +library-name+))
    
    
    (ffi:def-call-out lispsort_double
        (:name "lispsort_double")
      (:arguments (n ffi:int)
                  (array (ffi:c-ptr DOUBLE-FLOAT)))
      (:return-type NIL)
      (:library +library-name+))
    
    (ffi:def-call-out test123
        (:name "test")
      (:arguments (x SINGLE-FLOAT)
                  (y DOUBLE-FLOAT))
      (:return-type NIL)
      (:library +library-name+))
    
    

    The module also handles strutcures and #define constants as shown below. SWIG automatically adds the constructors and accessors created for the struct to the list of symbols exported by the package.

    struct bar {
      short x, y;
      char a, b;
      int *z[1000];
      struct bar * n;
    };
    
    #define max 1000
    
    (ffi:def-c-struct bar
        (x :type ffi:short)
      (y :type ffi:short)
      (a :type character)
      (b :type character)
      (z :type (ffi:c-array (ffi:c-ptr ffi:int) 1000))
      (n :type (ffi:c-pointer bar)))
    
    (defconstant max 1000)
    
    

    27.4 UFFI

    swig-3.0.12/Doc/Manual/Octave.html0000664000175000017500000007204213042756672016500 0ustar williamwilliam SWIG and Octave

    32 SWIG and Octave

    Octave is a high-level language intended for numerical programming that is mostly compatible with MATLAB. More information can be found at Octave web site.

    This chapter is intended to give an introduction to using the module. You should also read the SWIG documentation that is not specific to Octave. Also, there are a dozen or so examples in the Examples/octave directory, and hundreds in the test suite (Examples/test-suite and Examples/test-suite/octave).

    32.1 Preliminaries

    SWIG is regularly tested against the following versions of Octave: 3.8, 4.0, 4.2.

    Every effort is made to maintain backward compatibility with older versions of Octave. This cannot be guaranteed however, as in recent times new Octave releases have required nontrivial updates to SWIG, which may break backward compatibility for older Octave versions against which SWIG is not regularly tested.

    The SWIG runtime exports the function swig_octave_prereq() for checking the version of Octave.

    32.2 Running SWIG

    Let's start with a very simple SWIG interface file, example.i:

    %module swigexample
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo; 

    To build an Octave module when wrapping C code, run SWIG using the -octave option:

    $ swig -octave -o example_wrap.cpp example.i 

    The -c++ option is also required when wrapping C++ code:

    $ swig -octave -c++ -o example_wrap.cpp example.i 

    This creates a C++ source file "example_wrap.cpp". A C++ file is generated even when wrapping C code as Octave is itself written in C++ and requires wrapper code to be in the same language. The generated C++ source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application (in this case, the gcd implementation) to create an extension module.

    32.2.1 Command-line options

    The swig command line has a number of options you can use, like to redirect its output. Use swig -help to learn about these. Options specific to the Octave module are:

    $ swig -octave -help
    ...
    Octave Options (available with -octave)
         -globals name - Set name used to access C global variables [default: 'cvar']
                         Use '.' to load C global variables into module namespace
         -opprefix str - Prefix str for global operator functions [default: 'op_']
    

    The -globals option sets the name of the variable which is the namespace for C global variables exported by the module. The special name "." loads C global variables into the module namespace, i.e. alongside C functions and structs exported by the module. The -opprefix options sets the prefix of the names of global/friend operator functions.

    32.2.2 Compiling a dynamic module

    Octave modules are DLLs/shared objects having the ".oct" suffix. Building an oct file is usually done with the mkoctfile command (either within Octave itself, or from the shell). For example,

    $ swig -octave -c++ -o example_wrap.cpp example.i
    $ mkoctfile example_wrap.cpp example.c
    

    where "example.c" is the file containing the gcd() implementation.

    mkoctfile can also be used to extract the build parameters required to invoke the compiler and linker yourself. See the Octave manual and mkoctfile man page.

    mkoctfile will produce "swigexample.oct", which contains the compiled extension module. Loading it into Octave is then a matter of invoking

    octave:1> swigexample

    32.2.3 Using your module

    Assuming all goes well, you will be able to do this:

    $ octave -q
    octave:1> swigexample
    octave:2> swigexample.gcd(4, 6)
    ans =  2
    octave:3> swigexample.cvar.Foo
    ans =  3
    octave:4> swigexample.cvar.Foo=4;
    octave:5> swigexample.cvar.Foo
    ans =  4 

    32.3 A tour of basic C/C++ wrapping

    32.3.1 Modules

    The SWIG module directive specifies the name of the Octave module. If you specify "module swigexample", then in Octave everything in the module will be accessible under "swigexample", as in the above example. When choosing a module name, make sure you don't use the same name as a built-in Octave command or standard module name.

    When Octave is asked to invoke swigexample, it will try to find the ".m" or ".oct" file that defines the function "swigexample". You therefore need to make sure that "swigexample.oct" is in Octave's search path, which can be specified with the environment variable "OCTAVE_PATH".

    To load an Octave module, simply type its name:

    octave:1> swigexample;
    octave:2> gcd(4, 6)
    ans =  2
    octave:3> cvar.Foo
    ans =  3
    octave:4> cvar.Foo=4;
    octave:5> cvar.Foo
    ans =  4
    

    Modules can also be loaded from within functions, even before being loaded in the base context. If the module is also used in the base context, however, it must first be loaded again:

    octave:1> function l = my_lcm(a, b)
    > swigexample
    > l = abs(a*b)/swigexample.gcd(a, b);
    > endfunction
    octave:2> my_lcm(4, 6)
    ans =  12
    octave:3> swigexample.gcd(4, 6)
    error: can't perform indexing operations for <unknown type> type
    octave:3> swigexample;
    octave:4> swigexample.gcd(4, 6)
    ans =  2
    

    32.3.2 Functions

    Global functions are wrapped as new Octave built-in functions. For example,

    %module swigexample
    int fact(int n); 

    creates a built-in function swigexample.fact(n) that works exactly like you think it does:

    octave:1> swigexample.fact(4)
    24 

    32.3.3 Global variables

    Global variables are a little special in Octave. Given a global variable:

    %module swigexample
    extern double Foo;
    

    To expose variables, SWIG actually generates two functions, to get and set the value. In this case, Foo_set and Foo_set would be generated. SWIG then automatically calls these functions when you get and set the variable-- in the former case creating a local copy in the interpreter of the C variables, and in the latter case copying an interpreter variables onto the C variable.

    octave:1> swigexample;
    octave:2> c=swigexample.cvar.Foo
    c =  3
    octave:3> swigexample.cvar.Foo=4;
    octave:4> c
    c =  3
    octave:5> swigexample.cvar.Foo
    ans =  4

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause an Octave error. Given a global variable:

    %module swigexample
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    octave:1> swigexample
    octave:2> swigexample.Foo=4
    error: attempt to set immutable member variable
    error: assignment failed, or no method for `swig_type = scalar'
    error: evaluating assignment expression near line 2, column 12 

    It is possible to add new functions or variables to the module. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    octave:1> swigexample;
    octave:2> swigexample.PI=3.142;
    octave:3> swigexample.PI
    ans =  3.1420 

    32.3.4 Constants and enums

    Because Octave doesn't really have the concept of constants, C/C++ constants are not really constant in Octave. They are actually just a copy of the value into the Octave interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module swigexample
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Octave code:

    swigexample.ICONST=42
    swigexample.SCONST="Hello World"
    swigexample.SUNDAY=0
    .... 

    32.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface: C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module swigexample
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Octave. For example:

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("w", "junk");
    octave:3> swigexample.fputs("Hello world", f);
    octave:4> swigexample.fclose(f);
    

    Simply printing the value of a wrapped C++ type will print its typename. E.g.,

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("junk", "w");
    octave:3> f
    f =
    
    {
      _p_FILE, ptr = 0x9b0cd00
    } 

    As the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes and structs (see below).

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("not there", "r");
    error: value on right hand side of assignment is undefined
    error: evaluating assignment expression near line 2, column 2 

    32.3.6 Structures and C++ classes

    SWIG wraps C structures and C++ classes by using a special Octave type called a swig_ref. A swig_ref contains a reference to one or more instances of C/C++ objects, or just the type information for an object. For each wrapped structure and class, a swig_ref will be exposed that has the name of the type. When invoked as a function, it creates a new object of its type and returns a swig_ref that points to that instance. This provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    octave:1> swigexample;
    octave:2> p=swigexample.Point();
    octave:3> p.x=3;
    octave:4> p.y=5;
    octave:5> p.x, p.y
    ans =  3
    ans =  5 
    

    In C++, invoking the type object in this way calls the object's constructor. swig_ref objects can also be acquired by having a wrapped function return a pointer, reference, or value of a non-primitive type.

    The swig_ref type handles indexing operations such that usage maps closely to what you would have in C/C++. Structure members are accessed as in the above example, by calling set and get methods for C++ variables. Methods also work as expected. For example, code wrapped in the following way

    class Point{
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2)+pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x; y=_y;
      }
    };
    

    can be used from Octave like this

    octave:1> swigexample;
    octave:2> p1=swigexample.Point(3, 5);
    octave:3> p2=swigexample.Point(1, 2);
    octave:4> p1.distance(p2)
    ans =  3.6056
    

    By using the swig_this() and swig_type() functions, one can discover the pointers to and types of the underlying C/C++ object.

    octave:5> swig_this(p1)
    ans = 162504808
    octave:6> swig_type(p1)
    ans = Point
    

    Note that swig_ref is a reference-counted pointer to a C/C++ object/type, and as such has pass-by-reference semantics. For example if one has a allocated a single object but has two swig_ref's pointing to it, modifying the object through either of them will change the single allocated object. This differs from the usual pass-by-value (copy-on-write) semantics that Octave maintains for built-in types. For example, in the following snippet, modifying b does not modify a,

    octave:7> a=struct('x', 4)
    a =
    {
      x =  4
    }
    
    octave:8> b=a
    b =
    {
      x =  4
    }
    
    octave:9> b.y=4
    b =
    {
      x =  4
      y =  4
    }
    
    octave:10> a
    a =
    {
      x =  4
    }
    

    However, when dealing with wrapped objects, one gets the behavior

    octave:2> a=Point(3, 5)
    a =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:3> b=a
    b =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:4> b.set(2, 1);
    octave:5> b.x, b.y
    ans =  2
    ans =  1
    octave:6> a.x, a.y
    ans =  2
    ans =  1
    

    Depending on the ownership setting of a swig_ref, it may call C++ destructors when its reference count goes to zero. See the section on memory management below for details.

    32.3.7 C++ inheritance

    Single and multiple inheritance are fully supported. The swig_ref type carries type information along with any C++ object pointer it holds. This information contains the full class hierarchy. When an indexing operation (such as a method invocation) occurs, the tree is walked to find a match in the current class as well as any of its bases. The lookup is then cached in the swig_ref.

    32.3.8 C++ overloaded functions

    Overloaded functions are supported, and handled as in other modules. That is, each overload is wrapped separately (under internal names), and a dispatch function is also emitted under the external/visible name. The dispatch function selects which overload to call (if any) based on the passed arguments. typecheck typemaps are used to analyze each argument, as well as assign precedence. See the chapter on typemaps for details.

    32.3.9 C++ operators

    C++ operator overloading is supported, in a way similar to other modules. The swig_ref type supports all unary and binary operators between itself and all other types that exist in the system at module load time. When an operator is used (where one of the operands is a swig_ref), the runtime routes the call to either a member function of the given object, or to a global function whose named is derived from the types of the operands (either both or just the lhs or rhs).

    For example, if a and b are SWIG variables in Octave, a+b becomes a.__add__(b). The wrapper is then free to implement __add__ to do whatever it wants. A wrapper may define the __add__ function manually, %rename some other function to it, or %rename a C++ operator to it.

    By default the C++ operators are renamed to their corresponding Octave operators. So without doing any work, the following interface

    %inline {
    struct A {
      int value;
      A(int _value) : value(_value) {}
      A operator+ (const A& x) {
        return A(value+x.value);
      }
    };
    }
    

    is usable from Octave like this:

    a=A(2), b=A(3), c=a+b
    assert(c.value==5);
    

    Octave operators are mapped in the following way:

    __brace__      a{args}
    __brace_asgn__ a{args} = rhs
    __paren__      a(args)
    __paren_asgn__ a(args) = rhs
    __str__        generates string rep
    __not__        !a
    __uplus__      +a
    __uminus__     -a
    __transpose__  a.'
    __hermitian__  a'
    __incr__       a++
    __decr__       a--
    __add__        a + b
    __sub__        a - b
    __mul__        a * b
    __div__        a / b
    __pow__        a ^ b
    __ldiv__       a \ b
    __lshift__     a << b
    __rshift__     a >> b
    __lt__         a < b
    __le__         a <= b
    __eq__         a == b
    __ge__         a >= b
    __gt__         a > b
    __ne__         a != b
    __el_mul__     a .* b
    __el_div__     a ./ b
    __el_pow__     a .^ b
    __el_ldiv__    a .\ b
    __el_and__     a & b
    __el_or__      a | b
    

    On the C++ side, the default mappings are as follows:

    %rename(__add__)       *::operator+;
    %rename(__add__)       *::operator+();
    %rename(__add__)       *::operator+() const;
    %rename(__sub__)       *::operator-;
    %rename(__uminus__)    *::operator-();
    %rename(__uminus__)    *::operator-() const;
    %rename(__mul__)       *::operator*;
    %rename(__div__)       *::operator/;
    %rename(__mod__)       *::operator%;
    %rename(__lshift__)    *::operator<<;
    %rename(__rshift__)    *::operator>>;
    %rename(__el_and__)    *::operator&&;
    %rename(__el_or__)     *::operator||;
    %rename(__xor__)       *::operator^;
    %rename(__invert__)    *::operator~;
    %rename(__lt__)        *::operator<;
    %rename(__le__)        *::operator<=;
    %rename(__gt__)        *::operator>;
    %rename(__ge__)        *::operator>=;
    %rename(__eq__)        *::operator==;
    %rename(__ne__)        *::operator!=;
    %rename(__not__)       *::operator!;
    %rename(__incr__)      *::operator++;
    %rename(__decr__)      *::operator--;
    %rename(__paren__)     *::operator();
    %rename(__brace__)     *::operator[];
    

    Octave can also utilise friend (i.e. non-member) operators with a simple %rename: see the example in the Examples/octave/operator directory.

    32.3.10 Class extension with %extend

    The %extend directive works the same as in other modules.

    You can use it to define special behavior, like for example defining Octave operators not mapped to C++ operators, or defining certain Octave mechanisms such as how an object prints. For example, the octave_value::{is_string, string_value, print} functions are routed to a special method __str__ that can be defined inside an %extend.

    %extend A {
    string __str__() {
      stringstream sout;
      sout<<$self->value;
      return sout.str();
    }
    }
    

    Then in Octave one gets,

    octave:1> a=A(4);
    octave:2> a
    a = 4
    octave:3> printf("%s\n", a);
    4
    octave:4> a.__str__()
    4
    

    Similarly, Octave can use the __float__ method to convert an object to a numeric value.

    Octave 3.8.0 and later versions will also map unary functions X() to the corresponding __X__ method, where X includes: abs(), acos(), acosh(), angle(), arg(), asin(), asinh(), atan(), atanh(), cbrt(), ceil(), conj(), cos(), cosh(), dawson(), erf(), erfc(), erfcinv(), erfcx(), erfi(), erfinv(), exp(), expm1(), finite(), fix(), floor(), gamma(), imag(), isalnum(), isalpha(), isascii(), iscntrl(), isdigit(), isgraph(), isinf(), islower(), isna(), isnan(), isprint(), ispunct(), isspace(), isupper(), isxdigit(), lgamma(), log(), log10(), log1p(), log2(), real(), round(), roundb(), signbit(), signum(), sin(), sinh(), sqrt(), tan(), tanh(), toascii(), tolower(), toupper()

    32.3.11 C++ templates

    C++ class and function templates are fully supported as in other modules, in that the %template directive may used to create explicit instantiations of templated types. For example, function templates can be instantiated as follows:

    %module swigexample
    %inline {
      template<class __scalar>
        __scalar mul(__scalar a, __scalar b) {
        return a*b;
      }
    }
    %include <std_complex.i>
    %template(mul) mul<std::complex<double> >
    %template(mul) mul<double>
    

    and then used from Octave

    octave:1> mul(4, 3)
    ans =  12
    octave:2> mul(4.2, 3.6)
    ans =  15.120
    octave:3> mul(3+4i, 10+2i)
    ans =  22 + 46i
    

    Similarly, class templates can be instantiated as in the following example,

    %module swigexample
    %include <std_complex.i>
    %include <std_string.i>
    %inline {
      #include <sstream>
      template<class __scalar> class sum {
        __scalar s;
      public:
        sum(__scalar _s=0) : s(_s) {}
        sum& add(__scalar _s) {
          s+=_s;
          return *this;
        }
        std::string __str__() const {
          std::stringstream sout;
          sout<<s;
          return sout.str();
        }
      };
    }
    %template(sum_complex) sum<std::complex<double> >;
    %template(sum_double) sum<double>;
    

    and then used from Octave

    octave:2> a=sum_complex(2+3i);
    octave:3> a.add(2)
    ans =
    
    (4, 3)
    octave:4> a.add(3+i)
    ans =
    
    (7, 4)
    

    32.3.12 C++ Smart Pointers

    32.3.12.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Octave in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    32.3.12.2 Generic Smart Pointers

    C++ smart pointers are fully supported as in other modules.

    32.3.13 Directors (calling Octave from C++ code)

    There is full support for SWIG Directors, which permits Octave code to subclass C++ classes, and implement their virtual methods.

    Octave has no direct support for object oriented programming, however the swig_ref type provides some of this support. You can manufacture a swig_ref using the subclass function (provided by the SWIG/Octave runtime).

    For example,

    octave:1> a=subclass();
    octave:2> a.my_var = 4;
    octave:3> a.my_method = @(self) printf("my_var = ", self.my_var);
    octave:4> a.my_method();
    my_var = 4
    

    subclass() can also be used to subclass one or more C++ types. Suppose you have an interface defined by

    %inline {
    class A {
    public:
      virtual my_method() {
        printf("c-side routine called\n");
      }
    };
    void call_your_method(A& a) {
      a.my_method();
    }
    }
    

    Then from Octave you can say:

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   printf("octave-side routine called\n");
    octave:4> end
    octave:5> call_your_method(B());
    octave-side routine called
    

    or more concisely,

    octave:1> B=@() subclass(A(), 'my_method', @(self) printf("octave-side routine called\n"));
    octave:2> call_your_method(B());
    octave-side routine called
    

    Note that you have to enable directors via the %feature directive (see other modules for this).

    subclass() will accept any number of C++ bases or other subclass()'ed objects, (string, octave_value) pairs, and function_handles. In the first case, these are taken as base classes; in the second case, as named members (either variables or functions, depending on whether the given value is a function handle); in the third case, as member functions whose name is taken from the given function handle. E.g.,

    octave:1> B=@(some_var=2) subclass(A(), 'some_var', some_var, @some_func, 'another_func',
    @(self) do_stuff())
    

    You can also assign non-C++ member variables and functions after construct time. There is no support for non-C++ static members.

    There is limited support for explicitly referencing C++ bases. So, in the example above, we could have

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   self.A.my_method();
    octave:4>   printf("octave-side routine called\n");
    octave:5> end
    octave:6> call_your_method(B());
    c-side routine called
    octave-side routine called
    

    32.3.14 Threads

    The use of threads in wrapped Director code is not supported; i.e., an Octave-side implementation of a C++ class must be called from the Octave interpreter's thread. Anything fancier (apartment/queue model, whatever) is left to the user. Without anything fancier, this amounts to the limitation that Octave must drive the module... like, for example, an optimization package that calls Octave to evaluate an objective function.

    32.3.15 Memory management

    As noted above, swig_ref represents a reference counted pointer to a C/C++-side object. It also contains a flag indicating whether Octave or the C/C++ code owns the object. If Octave owns it, any destructors will be called when the reference count reaches zero. If the C/C++ side owns the object, then destructors will not be called when the reference count goes to zero.

    For example,

    %inline {
    class A {
    public:
      A() { printf("A constructing\n"); }
      ~A() { printf("A destructing\n"); }
    };
    }
    

    Would produce this behavior in Octave:

    octave:1> a=A();
    A constructing
    octave:2> b=a;
    octave:3> clear a;
    octave:4> b=4;
    A destructing
    

    The %newobject directive may be used to control this behavior for pointers returned from functions.

    In the case where one wishes for the C++ side to own an object that was created in Octave (especially a Director object), one can use the __disown() method to invert this logic. Then letting the Octave reference count go to zero will not destroy the object, but destroying the object will invalidate the Octave-side object if it still exists (and call destructors of other C++ bases in the case of multiple inheritance/subclass()'ing).

    32.3.16 STL support

    Various STL library files are provided for wrapping STL containers.

    32.3.17 Matrix typemaps

    Octave provides a rich set of classes for dealing with matrices. Currently there are no built-in typemaps to deal with those. However, these are relatively straight forward for users to add themselves (see the docs on typemaps). Without much work (a single typemap decl-- say, 5 lines of code in the interface file), it would be possible to have a function

    double my_det(const double* mat, int m, int n);
    

    that is accessed from Octave as,

    octave:1> my_det(rand(4));
    ans = -0.18388
    

    swig-3.0.12/Doc/Manual/Php.html0000664000175000017500000010640613042756672016010 0ustar williamwilliam SWIG and PHP

    34 SWIG and PHP

    In this chapter, we discuss SWIG's support of PHP. The PHP module was extensively rewritten in release 1.3.26, and support for generating OO wrappers for PHP5 was added in 1.3.30. The PHP module now supports most of the features available in some of the other languages.

    SWIG supports generating wrappers for PHP5 and PHP7. Support for PHP4 was removed in SWIG 1.3.37.

    Currently any PHP5 or PHP7 release should work, but we don't regularly test with PHP < 5.3.

    In order to use this module, you will need to have a copy of the PHP include files to compile the SWIG generated files. If you installed PHP from a binary package, you may need to install a "php-dev" or "php-devel" package for these to be installed. You can find out where these files are by running php-config --includes. To use the built PHP module you will need either the php binary or the Apache php module. If you want to build your extension into php directly, you will need the complete PHP source tree available.

    34.1 Generating PHP Extensions

    To build a PHP extension, run swig using the -php5 or -php7 option as follows (-php is also supported and currently is an alias for -php5):

    swig -php7 example.i
    

    This will produce 3 files example_wrap.c, php_example.h and example.php. The first file, example_wrap.c contains all of the C code needed to build a PHP extension. The second file, php_example.h contains the header information needed if you wish to statically link the extension into the php interpreter. The third file, example.php can be included by PHP scripts. It attempts to dynamically load the extension and contains extra php code specified in the interface file. If wrapping C++ code with PHP classes, it will also contain PHP class wrappers.

    SWIG can generate PHP extensions from C++ libraries as well when given the -c++ option. The support for C++ is discussed in more detail in section 27.2.6. The generated C++ wrapper will be called example_wrap.cpp (for PHP5) or example_wrap.cxx (for PHP7 where the default has been changed to align with SWIG's default for every other language). You can specify a different extension for the C++ wrapper using -cppext - e.g. if you want example_wrap.cc use -cppext cc.

    The usual (and recommended) way is to build the extension as a separate dynamically loaded module (which is supported by all modern operating systems).

    It is also possible to rebuild PHP from source so that your module is statically linked into the php executable/library. This is a lot more work, and also requires a full rebuild of PHP to update your module, and it doesn't play nicely with package system. We don't recommend this approach, or provide explicit support for it.

    34.1.1 Building a loadable extension

    To build your module as a dynamically loadable extension, use compilation commands like these (if you aren't using GCC, the commands will be different, and there may be some variation between platforms - these commands should at least work for Linux though):

            gcc `php-config --includes` -fpic -c example_wrap.c example.c
            gcc -shared example_wrap.o example.o -o example.so
    

    34.1.2 Using PHP Extensions

    To test the extension from a PHP script, you first need to tell PHP to load it. To do this, add a line like this to the [PHP] section of php.ini:

            extension=/path/to/modulename.so
    

    If the module is in PHP's default extension directory, you can omit the path.

    For some SAPIs (for example, the CLI SAPI) you can instead use the dl() function to load an extension at run time, by adding a like like this to the start of each PHP script which uses your extension:

            dl("/path/to/modulename.so"); // Load the module
    

    But note that this doesn't work when running PHP through a webserver in PHP5.3 and later - you'll need to use extension in php.ini as described above.

    The PHP module which SWIG generates will also attempt to do the dl() call for you if the extension isn't already loaded:

            include("example.php");
    

    This PHP module also defines the PHP classes for the wrapped API, so you'll almost certainly want to include it anyway.

    34.2 Basic PHP interface

    It is important to understand that PHP uses a single global namespace into which all symbols from extension modules are loaded. It is quite possible for names of symbols in one extension module to clash with other symbols unless care is taken to %rename them. At present SWIG doesn't have support for the namespace feature added in PHP 5.3.

    34.2.1 Constants

    These work in much the same way as in C/C++. Constants can be defined by using either the normal C pre-processor declarations, or the %constant SWIG directive. These will then be available from your PHP script as a PHP constant, (i.e. no dollar sign is needed to access them.) For example, with a swig interface file like this,

    %module example
    
    #define PI 3.14159
    
    %constant int E  = 2.71828
    

    you can access the constants in your PHP script like this,

    include("example.php");
    
    echo "PI = " . PI . "\n";
    
    echo "E = " . E . "\n";
    
    

    There's one peculiarity of how constants work in PHP which it is useful to note (this is not specific to SWIG though) - if you try to use an undeclared constant, PHP will emit a notice and then expand the constant to a string version of the constant's name. Unfortunately it is easy to miss the notice if you're using PHP in a webserver, as it will probably end up in error.log or similar.

    For example,

    %module example
    
    #define EASY_TO_MISPELL 0
    

    accessed incorrectly in PHP,

    include("example.php");
    
    if(EASY_TO_MISPEL) {
      ...
    } else {
      ...
    }
    
    

    The mis-spelled constant will become the string 'EASY_TO_MISPEL', which is treated as true by the if test, when the value of the intended constant would be treated as false! Modern versions of PHP will at least issue a PHP notice by default when this happens.

    34.2.2 Global Variables

    Because PHP does not provide a mechanism to intercept access and assignment of global variables, global variables are supported through the use of automatically generated accessor functions.

    %module example;
    
    %inline %{
      double seki = 2;
      void print_seki() {
        zend_printf("seki is now %f\n", seki);
      }
    %}
    

    is accessed as follows:

    include("example.php");
    print seki_get();
    seki_set( seki_get() * 2); # The C variable is now 4.
    print seki_get();
    

    SWIG supports global variables of all C datatypes including pointers and complex objects. Additional types can be supported by using the varinit typemap.

    SWIG honors the %immutable modifier by not generating code for the _set method. This provides read-only access to the variable from the php script. Attempting to access the _set method will result in a php fatal error because the function is undefined.

    At this time SWIG does not support custom accessor methods.

    34.2.3 Functions

    C functions are converted into PHP functions. Default/optional arguments are also allowed. An interface file like this :

    %module example
    int foo(int a);
    double bar(double, double b = 3.0);
    ...
    

    Will be accessed in PHP like this :

    include("example.php");
    $a = foo(2);
    $b = bar(3.5, -1.5);
    $c = bar(3.5);  # Use default argument for 2nd parameter
    
    

    34.2.4 Overloading

    Although PHP does not support overloading functions natively, swig will generate dispatch functions which will use %typecheck typemaps to allow overloading. This dispatch function's operation and precedence is described in Wrapping Overloaded Functions and Methods.

    34.2.5 Pointers and References

    Pointers to C/C++ objects are represented as PHP resources, rather like MySQL connection handles.

    There are multiple ways to wrap pointers to simple types. Given the following C method:

      void add( int *in1, int *in2, int *result);
    

    One can include cpointer.i to generate PHP wrappers to int *.

    %module example
    %include "cpointer.i"
    %pointer_functions(int, intp)
    
    void add( int *in1, int *in2, int *result);
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1=copy_intp(3);
    $in2=copy_intp(5);
    $result=new_intp();
    
    add( $in1, $in2, $result );
    
    echo "The sum " . intp_value($in1) . " + " . intp_value($in2) . " = " . intp_value( $result) . "\n";
    ?>
    

    An alternative would be to use the include typemaps.i which defines named typemaps for INPUT, OUTPUT and INOUT variables. One needs to either %apply the appropriate typemap or adjust the parameter names as appropriate.

    %module example
    %include "typemaps.i"
    
    void add( int *INPUT, int *INPUT, int *OUTPUT);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result= add($in1, $in2);  # Note using variables for the input is unnecessary.
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    Because PHP has a native concept of reference, it may seem more natural to the PHP developer to use references to pass pointers. To enable this, one needs to include phppointers.i which defines the named typemap REF.

    Prior to SWIG 3.0, the REF typemaps relied on PHP's call-time pass-by-reference, which was deprecated in PHP 5.3 and removed in PHP 5.4. So if you use these REF typemaps, you should ensure that SWIG≥3.0 is used to generate wrappers from your interface file.

    In case you write your own typemaps, SWIG supports an attribute called byref: if you set that, then SWIG will make sure that the generated wrapper function will want the input parameter as a reference.

    %module example
    %include "phppointers.i"
    
    void add( int *REF, int *REF, int *REF);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result = 0;
    add($in1, $in2, $result);
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    It is important to note that a php variable which is NULL when passed by reference would end up passing a NULL pointer into the function. In PHP, an unassigned variable (i.e. where the first reference to the variable is not an assignment) is NULL. In the above example, if any of the three variables had not been assigned, a NULL pointer would have been passed into add. Depending on the implementation of the function, this may or may not be a good thing.

    We chose to allow passing NULL pointers into functions because that is sometimes required in C libraries. A NULL pointer can be created in PHP in a number of ways: by using unset on an existing variable, or assigning NULL to a variable.

    34.2.6 Structures and C++ classes

    SWIG defaults to wrapping C++ structs and classes with PHP classes - this is done by generating a PHP wrapper script which defines proxy classes which calls a set of flat functions which actually wrap the C++ class. You can disable this wrapper layer by passing the command-line option "-noproxy" in which case you'll just get the flat functions.

    This interface file

    %module vector
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      double magnitude();
    };
    
    struct Complex {
     double re, im;
    };
    

    Would be used in the following way from PHP:

    <?php
      require "vector.php";
    
      $v = new Vector();
      $v->x = 3;
      $v->y = 4;
      $v->z = 5;
    
      echo "Magnitude of ($v->x, $v->y, $v->z) = " . $v->magnitude() . "\n";
    
      $v = NULL;   # destructor called.
    
      $c = new Complex();
    
      $c->re = 0;
      $c->im = 0;
    
      # $c destructor called when $c goes out of scope.
    ?>
    

    Member variables and methods are accessed using the -> operator.

    34.2.6.1 Using -noproxy

    The -noproxy option flattens the object structure and generates collections of named functions (these are the functions which the PHP class wrappers call). The above example results in the following PHP functions:

    new_Vector();
    Vector_x_set($obj, $d);
    Vector_x_get($obj);
    Vector_y_set($obj, $d);
    Vector_y_get($obj);
    Vector_z_set($obj, $d);
    Vector_z_get($obj);
    Vector_magnitude($obj);
    new_Complex();
    Complex_re_set($obj, $d);
    Complex_re_get($obj);
    Complex_im_set($obj, $d);
    Complex_im_get($obj);
    

    34.2.6.2 Constructors and Destructors

    The constructor is called when new Object() (or new_Object() if using -noproxy) is used to create an instance of the object. If multiple constructors are defined for an object, function overloading will be used to determine which constructor to execute.

    Because PHP uses reference counting to manage resources, simple assignment of one variable to another such as:

    $ref = $v;
    

    causes the symbol $ref to refer to the same underlying object as $v. This does not result in a call to the C++ copy constructor or copy assignment operator.

    One can force execution of the copy constructor by using:

    $o_copy = new Object($o);
    

    Destructors are automatically called when all variables referencing the instance are reassigned or go out of scope. The destructor is not available to be called manually. To force a destructor to be called the programmer can either reassign the variable or call unset($v)

    34.2.6.3 Static Member Variables

    Static member variables in C++ are not wrapped as such in PHP as it does not appear to be possible to intercept accesses to such variables. Therefore, static member variables are wrapped using a class function with the same name, which returns the current value of the class variable. For example

    %module example
    
    class Ko {
      static int threats;
    };
    
    

    would be accessed in PHP as,

    include("example.php");
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    To set the static member variable, pass the value as the argument to the class function, e.g.

    
    Ko::threats(10);
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    34.2.6.4 Static Member Functions

    Static member functions are supported in PHP using the class::function() syntax. For example

    %module example
    class Ko {
      static void threats();
    };
    
    would be executed in PHP as,
    include("example.php");
    Ko::threats();
    

    34.2.6.5 Specifying Implemented Interfaces

    PHP supports the concept of abstract interfaces which a class can implement. Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example MyIterator) implements the Iterator interface like so:

    %typemap("phpinterfaces") MyIterator "Iterator";
    

    If there are multiple interfaces, just list them separated by commas.

    34.2.7 PHP Pragmas, Startup and Shutdown code

    To place PHP code in the generated "example.php" file one can use the code pragma. The code is inserted after loading the shared object.

    %module example
    %pragma(php) code="
    # This code is inserted into example.php
    echo \"example.php execution\\n\";
    "
    

    Results in the following in "example.php"

    # This code is inserted into example.php
    echo "example.php execution\n";
    

    The include pragma is a short cut to add include statements to the example.php file.

    %module example
    %pragma(php) code="
    include \"include.php\";
    "
    %pragma(php) include="include.php"   // equivalent.
    

    The phpinfo pragma inserts code in the PHP_MINFO_FUNCTION which is called from PHP's phpinfo() function.

    %module example;
    %pragma(php) phpinfo="
      zend_printf("An example of PHP support through SWIG\n");
      php_info_print_table_start();
      php_info_print_table_header(2, \"Directive\", \"Value\");
      php_info_print_table_row(2, \"Example support\", \"enabled\");
      php_info_print_table_end();
    "
    

    To insert code into the PHP_MINIT_FUNCTION, one can use either %init or %minit.

    %module example;
    %init {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    %minit {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    

    To insert code into the PHP_MSHUTDOWN_FUNCTION, one can use either %shutdown or %mshutdown.

    %module example;
    %mshutdown {
      zend_printf("Inserted into PHP_MSHUTDOWN_FUNCTION\n");
    }
    

    The %rinit and %rshutdown statements are very similar but insert code into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.

    34.3 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to PHP. In particular, if a C++ class has been extended in PHP (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. Support for generating PHP classes has been added in SWIG 1.3.40. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to PHP implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in PHP and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor PHP code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    34.3.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
        Foo(int foo);
        virtual void one();
        virtual void two();
    };
    
    class Bar: public Foo {
    public:
        virtual void three();
    };
    

    then at the PHP side you can define

    require("mymodule.php");
    
    class MyFoo extends Foo {
      function one() {
        print "one from php\n";
      }
    }
    

    34.3.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the PHP proxy classes. The director classes store a pointer to their underlying PHP object. Indeed, this is quite similar to the "_cPtr" and "thisown" members of the PHP proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in PHP via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in PHP were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or PHP. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in PHP, the Zend API is used to call the method of the underlying PHP object (after which the usual virtual method resolution in PHP automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in PHP, unless there's a good reason not to. The reason for this is simple: PHP has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the PHP proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the PHP method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the called and the declaring class name of the given method. If these are not the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in PHP, SWIG creates an instance of the original C++ class and assigns it to ->_cPtr. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through PHP.

    34.3.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. PHP instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the PHP object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special ->thisown property of the proxy class. After setting this property to 0, the director class no longer destroys the PHP object. Assuming no outstanding references to the PHP object remain, the PHP object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Here is an example:

    class Foo {
    public:
        ...
    };
    class FooContainer {
    public:
        void addFoo(Foo *);
        ...
    };
    

    $c = new FooContainer();
    $a = new Foo();
    $a->thisown = 0;
    $c->addFoo($a);
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point.

    34.3.4 Exception unrolling

    With directors routing method calls to PHP, and proxies routing them to C++, the handling of exceptions is an important concern. By default, an exception thrown in PHP code called from C++ causes the PHP interpreter to flag that an exception is thrown, then return passes to C++ as if the PHP function had returned Null. Assuming the directorout typemaps handle this (those SWIG defines by default should) then once control returns to PHP code again, the PHP exception will actually propagate.

    Sometimes this control flow is problematic, and you want to skip any handling in the C++ code. To achieve this, it is necessary to temporarily translate the PHP exception into a C++ exception. This can be achieved using the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
        if ($error == FAILURE) {
            throw Swig::DirectorMethodException();
        }
    }
    

    This code will check the PHP error state after each method call from a director into PHP, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the PHP error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in PHP, travels up to C++ through a proxy class, and then back into PHP via a director method. If an exception occurs in PHP at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
        try { $action }
        catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the PHP error state is still set when Swig::DirectorMethodException is thrown, PHP will register the exception as soon as the C wrapper function returns.

    34.3.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in PHP and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from PHP. Relative to the speed of PHP execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through PHP in order to ensure that the method does not have an extended PHP implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with PHP objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to PHP objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in PHP.

    34.3.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    34.3.7 Miscellaneous

    Director typemaps for STL classes are mostly in place, and hence you should be able to use std::string, etc., as you would any other type.

    swig-3.0.12/Doc/Manual/Tcl.html0000664000175000017500000023556713042756672016016 0ustar williamwilliam SWIG and Tcl

    40 SWIG and Tcl

    Caution: This chapter is under repair!

    This chapter discusses SWIG's support of Tcl. SWIG currently requires Tcl 8.0 or a later release. Earlier releases of SWIG supported Tcl 7.x, but this is no longer supported.

    40.1 Preliminaries

    To build a Tcl module, run SWIG using the -tcl option :

    $ swig -tcl example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -tcl example.i
    

    This creates a file example_wrap.c or example_wrap.cxx that contains all of the code needed to build a Tcl extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    40.1.1 Getting the right header files

    In order to compile the wrapper code, the compiler needs the tcl.h header file. This file is usually contained in the directory

    /usr/local/include
    

    Be aware that some Tcl versions install this header file with a version number attached to it. If this is the case, you should probably make a symbolic link so that tcl.h points to the correct header file.

    40.1.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -tcl example.i
    $ gcc -fPIC -c example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/local/include
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact commands for doing this vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/tcl directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module. If the name of your SWIG module is "example", the name of the corresponding object file should be "example.so". The name of the module is specified using the %module directive or the -module command line option.

    40.1.3 Static linking

    An alternative approach to dynamic linking is to rebuild the Tcl interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Tcl involves writing a special function Tcl_AppInit() and using it to initialize the interpreter and your module. With SWIG, the tclsh.i and wish.i library files can be used to rebuild the tclsh and wish interpreters respectively. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "tclsh.i"       // Include code for rebuilding tclsh
    
    

    The tclsh.i library file includes supporting code that contains everything needed to rebuild tclsh. To rebuild the interpreter, you simply do something like this:

    $ swig -tcl example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/local/include/ \
            -L/usr/local/lib -ltcl -lm -ldl \
            -o mytclsh
    
    

    You will need to supply the same libraries that were used to build Tcl the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. If this actually works, the new version of Tcl should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    40.1.4 Using your module

    To use your module, simply use the Tcl load command. If all goes well, you will be able to this:

    $ tclsh
    % load ./example.so
    % fact 4
    24
    %
    

    A common error received by first-time users is the following:

    % load ./example.so
    couldn't find procedure Example_Init
    % 
    

    This error is almost always caused when the name of the shared object file doesn't match the name of the module supplied using the SWIG %module directive. Double-check the interface to make sure the module name and the shared object file match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    % load ./example.so
    couldn't load file "./example.so": ./example.so: undefined symbol: fact
    % 
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following problem when you try to use your module:

    % load ./example.so
    couldn't load file "./example.so": libfoo.so: cannot open shared object file:
    No such file or directory
    %        
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Tcl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib tclsh
    

    Finally, you can use a command such as ldconfig to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    40.1.5 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Tcl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    % swig -c++ -tcl example.i
    % g++ -fPIC -c example.cxx
    % g++ -fPIC -c example_wrap.cxx -I/usr/local/include
    % g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -tcl example.i
    % CC -KPIC -c example.cxx
    % CC -KPIC -c example_wrap.cxx -I/usr/local/include
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Tcl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Tcl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Tcl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    40.1.6 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Tcl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    40.1.7 Setting a package prefix

    To avoid namespace problems, you can instruct SWIG to append a package prefix to all of your functions and variables. This is done using the -prefix option as follows :

    swig -tcl -prefix Foo example.i
    

    If you have a function "bar" in the SWIG file, the prefix option will append the prefix to the name when creating a command and call it "Foo_bar".

    40.1.8 Using namespaces

    Alternatively, you can have SWIG install your module into a Tcl namespace by specifying the -namespace option :

    swig -tcl -namespace example.i
    

    By default, the name of the namespace will be the same as the module name, but you can override it using the -prefix option.

    When the -namespace option is used, objects in the module are always accessed with the namespace name such as Foo::bar.

    40.2 Building Tcl/Tk Extensions under Windows 95/NT

    Building a SWIG extension to Tcl/Tk under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into tclsh or wish. This section covers the process of using SWIG with Microsoft Visual C++. although the procedure may be similar with other compilers.

    40.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -tcl -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Tcl installation under "Additional include directories".
    • Finally, select the settings for the entire project and go to "Link Options". Add the Tcl library file to your link libraries. For example "tcl80.lib". Also, set the name of the output file to match the name of your Tcl module (ie. example.dll).
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Tcl extension, simply run tclsh or wish and use the load command. For example :

    MSDOS > tclsh80
    % load example.dll
    % fact 4
    24
    %
    

    40.2.2 Using NMAKE

    Alternatively, SWIG extensions can be built by writing a Makefile for NMAKE. To do this, make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for building various SWIG generated extensions
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib 
    winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO /
    MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS    = /Z7 /Od /c /nologo
    TCL_INCLUDES  = -Id:\tcl8.0a2\generic -Id:\tcl8.0a2\win
    TCLLIB        = d:\tcl8.0a2\win\tcl80.lib
    
    tcl:
            ..\..\swig -tcl -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(TCL_INCLUDES) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) $(TCLLIB) example.obj example_wrap.obj
    
    

    To build the extension, run NMAKE (you may need to run vcvars32 first). This is a pretty minimal Makefile, but hopefully its enough to get you started. With a little practice, you'll be making lots of Tcl extensions.

    40.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Tcl interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped in an interface that mimics the style of Tk widgets and [incr Tcl] classes. This section briefly covers the essential aspects of this wrapping.

    40.3.1 Modules

    The SWIG %module directive specifies the name of the Tcl module. If you specify `%module example', then everything is compiled into an extension module example.so. When choosing a module name, make sure you don't use the same name as a built-in Tcl command.

    One pitfall to watch out for is module names involving numbers. If you specify a module name like %module md5, you'll find that the load command no longer seems to work:

    % load ./md5.so
    couldn't find procedure Md_Init
    

    To fix this, supply an extra argument to load like this:

    % load ./md5.so md5
    

    40.3.2 Functions

    Global functions are wrapped as new Tcl built-in commands. For example,

    %module example
    int fact(int n);
    

    creates a built-in function fact that works exactly like you think it does:

    % load ./example.so
    % fact 4
    24
    % set x [fact 6]
    %
    

    40.3.3 Global variables

    C/C++ global variables are wrapped by Tcl global variables. For example:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern double density;
    %}
    ...
    

    Now look at the Tcl interface:

    % puts $density          # Output value of C global variable
    1.0
    % set density 0.95       # Change value
    

    If you make an error in variable assignment, you will get an error message. For example:

    % set density "hello"
    can't set "density": Type error. expected a double.
    %
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    40.3.4 Constants and enums

    C/C++ constants are installed as global Tcl variables containing the appropriate value. To create a constant, use #define, enum, or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Tcl---the value of the constant could be accidentally reassigned.You will just have to be careful.

    A peculiarity of installing constants as variables is that it is necessary to use the Tcl global statement to access constants in procedure bodies. For example:

    proc blah {} {
      global FOO
      bar $FOO
    }
    

    If a program relies on a lot of constants, this can be extremely annoying. To fix the problem, consider using the following typemap rule:

    %apply int CONSTANT { int x };
    #define FOO 42
    ...
    void bar(int x);
    

    When applied to an input argument, the CONSTANT rule allows a constant to be passed to a function using its actual value or a symbolic identifier name. For example:

    proc blah {} {
      bar FOO
    }
    

    When an identifier name is given, it is used to perform an implicit hash-table lookup of the value during argument conversion. This allows the global statement to be omitted.

    40.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Tcl. For example:

    % load ./example.so
    % set f [fopen junk w]
    % fputs "Hello World\n" $f
    % fclose $f
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values--normally an encoded character string like this:

    % puts $f
    _c0671108_p_FILE
    % 
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Tcl.

    The NULL pointer is represented by the string NULL.

    As much as you might be inclined to modify a pointer value directly from Tcl, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
        return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    40.3.6 Structures

    If you wrap a C structure, it is wrapped by a Tcl interface that somewhat resembles a Tk widget. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    % Vector v
    % v configure -x 3.5 -y 7.2
    % puts "[v cget -x] [v cget -y] [v cget -z]"
    3.5 7.2 0.0
    % 
    

    Similar access is provided for unions and the data members of C++ classes.

    In the above example, v is a name that's used for the object. However, underneath the covers, there's a pointer to a raw C structure. This can be obtained by looking at the -this attribute. For example:

    % puts [v cget -this]
    _88e31408_p_Vector
    

    Further details about the relationship between the Tcl and the underlying C structure are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
        int  x[16];
    };
    

    If accessed in Tcl, you will see behavior like this:

    % Bar b
    % puts [b cget -x]
    _801861a4_p_int
    % 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    % Bar c
    % c configure -x [b cget -x]   # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    % Bar b
    % set x [b cget -f]
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    However, one peculiarity of accessing a substructure like this is that the returned value does work quite like you might expect. For example:

    % Bar b
    % set x [b cget -f]
    % x cget -a
    invalid command name "x"
    

    This is because the returned value was not created in a normal way from the interpreter (x is not a command object). To make it function normally, just evaluate the variable like this:

    % Bar b
    % set x [b cget -f]
    % $x cget -a
    0
    %
    

    In this example, x points inside the original structure. This means that modifications work just like you would expect. For example:

    
    % Bar b
    % set x [b cget -f]
    % $x configure -a 3            # Modifies contents of f (inside b)
    % [b cget -f] -configure -a 3  # Same thing
    

    In many of these structure examples, a simple name like "v" or "b" has been given to wrapped structures. If necessary, this name can be passed to functions that expect to receive an object. For example, if you have a function like this,

    void blah(Foo *f);
    

    you can call the function in Tcl as follows:

    % Foo x            # Create a Foo object 
    % blah x           # Pass the object to a function
    

    It is also possible to call the function using the raw pointer value. For instance:

    % blah [x cget -this]   # Pass object to a function
    

    It is also possible to create and use objects using variables. For example:

    % set b [Bar]            # Create a Bar
    % $b cget -f             # Member access
    % puts $b
    _108fea88_p_Bar
    %
    

    Finally, to destroy objects created from Tcl, you can either let the object name go out of scope or you can explicitly delete the object. For example:

    % Foo f                 # Create object f
    % rename f ""
    

    or

    % Foo f                 # Create object f
    % f -delete
    

    Note: Tcl only destroys the underlying object if it has ownership. See the memory management section that appears shortly.

    40.3.7 C++ classes

    C++ classes are wrapped as an extension of structure wrapping. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Tcl like this:

    % List x
    % x insert Ale
    % x insert Stout
    % x insert Lager
    % x get 1
    Stout
    % puts [x cget -length]
    3
    %
    

    Class data members are accessed in the same manner as C structures.

    Static class members are accessed as global functions or variables. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Tcl, the static member is accessed as follows:

    % Spam_foo        # Spam::foo()
    % puts $Spam_bar  # Spam::bar
    

    40.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    An object of type Bar can be used where a Foo is expected. For example, if you have this function:

    void spam(Foo *f);
    

    then the function spam() accepts a Foo * or a pointer to any class derived from Foo. For instance:

    % Foo f      # Create a Foo
    % Bar b      # Create a Bar
    % spam f     # OK
    % spam b     # OK
    

    It is safe to use multiple inheritance with SWIG.

    40.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Tcl, there is no detailed distinction like this. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    % Foo f             # Create a Foo
    % spam1 f           # Ok. Pointer
    % spam2 f           # Ok. Reference
    % spam3 f           # Ok. Value.
    % spam4 f           # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Tcl will release this memory when the return value is garbage collected).

    40.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Tcl in a straightforward manner:

    % foo 3            # foo(int)
    % foo Hello        # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
        Foo();
        Foo(const Foo &);
        ...
    };
    

    you can write Tcl code like this:

    % Foo f                # Create a Foo
    % Foo g f              # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    40.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like this:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c + d]
    % $e re
    10.0
    % $e im
    12.0
    

    It should be stressed that operators in SWIG have no relationship to operators in Tcl. In fact, the only thing that's happening here is that an operator like operator + has been renamed to a method +. Therefore, the statement [c + d] is really just invoking the + method on c. When more than operator is defined (with different arguments), the standard method overloading facilities are used. Here is a rather odd looking example:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c - d]       # operator-(const Complex &)
    % puts "[$e re] [$e im]"
    10.0 12.0
    % set f [c -]         # operator-()
    % puts "[$f re] [$f im]"
    -3.0 -4.0
    %
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    40.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Tcl as follows:

    % load ./example.so
    % fact 3
    6
    % Vector v
    % v configure -x 3.4
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
        int spam();
    }
    
    namespace Bar {
        int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    40.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Tcl:

    % pairii p 3 4
    % p cget -first
    3
    % p cget -second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    40.3.14 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Tcl, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Tcl, everything should just "work":

    % set p [CreateFoo]                  # Create a smart-pointer somehow
    % $p configure -x 3                  # Foo::x
    % $p bar                             # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    % set f [$p __deref__]    # Returns underlying Foo *
    

    40.4 Further details on the Tcl class interface

    In the previous section, a high-level view of Tcl wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Tcl class-like objects. This provides a very natural Tcl interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    40.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
        return new Foo();
    }
    void delete_Foo(Foo *f) {
        delete f;
    }
    int Foo_x_get(Foo *f) {
        return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
        f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
        return f->spam(arg1);
    }
    

    These wrappers are actually found in the Tcl extension module. For example, you can certainly do this:

    % load ./example.so
    % set f [new_Foo]
    % Foo_x_get $f
    0
    % Foo_spam $f 3
    1
    %
    

    However, in addition to this, the classname Foo is used as an object constructor function. This allows objects to be encapsulated objects that look a lot like Tk widgets as shown in the last section.

    40.4.2 Memory management

    Associated with each wrapped object, is an ownership flag thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Tcl interpreter destroys the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Tcl automatically takes ownership of the result. For example:

    class Foo {
    public:
        Foo();
        Foo bar();
    };
    

    In Tcl:

    % Foo f
    % f cget -thisown
    1
    % set g [f bar]
    % $g cget -thisown
    1
    

    On the other hand, when pointers are returned to Tcl, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
        ...
        Foo *spam();
        ...
    };
    

    % Foo f
    % set s [f spam]
    % $s cget -thisown
    0
    % 
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Tcl to assume ownership and destroy it!

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
        int  value;
        Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Tcl, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    % Foo f
    % f cget -thisown
    1
    % set head f
    % f cget -thisown
    0
    

    In this case, C is now holding a reference to the object---you probably don't want Tcl to destroy it. Similarly, this occurs for members. For example:

    % Foo f
    % Foo g
    % f cget -thisown
    1
    % g cget -thisown
    1
    % f configure -next g
    % g cget -thisown 
    0
    %
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Tcl code:

    % Object v                 # Create an object
    % Node n                   # Create a node
    % n setvalue v             # Set value
    % v cget -thisown
    1
    % 
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Tcl still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    % v -disown              # Give ownership to C/C++
    % v -acquire             # Acquire ownership
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    40.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Tcl, this allows you to pass simple values instead of pointer. For example:

    set a [add 3 4]
    puts $a
    7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Tcl, a mutated parameter shows up as a return value. For example:

    set a [negate 3]
    puts $a
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Tcl, the function will return multiple values as a list.

    set r [send_message "Hello World"]
    set bytes [lindex $r 0]
    set success [lindex $r 1]
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    set dim [get_dimensions $m]
    set r  [lindex $dim 0]
    set c  [lindex $dim 1]
    

    40.6 Exception handling

    The %exception directive can be used to create a user-definable exception handler in charge of converting exceptions in your C/C++ program into Tcl exceptions. The chapter on customization features contains more details, but suppose you extended the array example into a C++ class like the following :

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    The functions associated with this class can throw a C++ range exception for an out-of-bounds array access. We can catch this in our Tcl extension by specifying the following in an interface file :

    %exception {
      try {
        $action                // Gets substituted by actual function call
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on "Customization Features" for more examples.

    40.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Tcl C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Tcl interface.

    40.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Tcl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
        if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
          return TCL_ERROR;
        printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type Tcl_Obj *.

    When this example is compiled into a Tcl module, it operates as follows:

    % load ./example.so
    % fact 6
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int n.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
        $1 = Tcl_GetStringFromObj($input, &$2);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Tcl object. This allows the function to be used like this (notice how the length parameter is omitted):

    % count e "Hello World"
    1
    

    40.7.2 Tcl typemaps

    The previous section illustrated an "in" typemap for converting Tcl objects to C. A variety of different typemap methods are defined by the Tcl module. For example, to convert a C integer back into a Tcl object, you might define an "out" typemap like this:

    %typemap(out) int {
        Tcl_SetObjResult(interp, Tcl_NewIntObj($1));
    }
    

    The following list details all of the typemap methods that can be used by the Tcl module:

    %typemap(in)

    Converts Tcl objects to input function arguments

    %typemap(out)

    Converts return value of a C function to a Tcl object

    %typemap(varin)

    Assigns a C global variable from a Tcl object

    %typemap(varout)

    Returns a C global variable as a Tcl object

    %typemap(freearg)

    Cleans up a function argument (if necessary)

    %typemap(argout)

    Output argument processing

    %typemap(ret)

    Cleanup of function return values

    %typemap(consttab)

    Creation of Tcl constants (constant table)

    %typemap(constcode)

    Creation of Tcl constants (init function)

    %typemap(memberin)

    Setting of structure/class member data

    %typemap(globalin)

    Setting of C global variables

    %typemap(check)

    Checks function input values.

    %typemap(default)

    Set a default value for an argument (making it optional).

    %typemap(arginit)

    Initialize an argument to a value before any conversions occur.

    Examples of these methods will appear shortly.

    40.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Tcl.

    $input

    A Tcl_Obj * holding a raw Tcl object with an argument or variable value.

    $result

    A Tcl_Obj * that holds the result to be returned to Tcl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Tcl name of the wrapper function being created.

    40.7.4 Converting a Tcl list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Tcl list to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      Tcl_Obj **listobjv;
      int       nitems;
      int       i;
      if (Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) {
        return TCL_ERROR;
      }
      $1 = (char **) malloc((nitems+1)*sizeof(char *));
      for (i = 0; i < nitems; i++) {
        $1[i] = Tcl_GetStringFromObj(listobjv[i], 0);
      }
      $1[i] = 0;
    }
    
    // This gives SWIG some cleanup code that will get called after the function call
    %typemap(freearg) char ** {
      if ($1) {
        free($1);
      }
    }
    
    // Now a test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    %}
    %include "tclsh.i"
    
    

    In Tcl:

    % print_args {John Guido Larry}
    argv[0] = John
    argv[1] = Guido
    argv[2] = Larry
    3
    

    40.7.5 Returning values in arguments

    The "argout" typemap can be used to return a value originating from a function argument. For example :

    // A typemap defining how to return an argument by appending it to the result
    %typemap(argout) double *outvalue {
      Tcl_Obj *o = Tcl_NewDoubleObj($1);
      Tcl_ListObjAppendElement(interp, $result, o);
    }
    
    // A typemap telling SWIG to ignore an argument for input
    // However, we still need to pass a pointer to the C function
    %typemap(in, numinputs=0) double *outvalue (double temp) {
      $1 = &temp;
    }
    
    // Now a function returning two values
    int mypow(double a, double b, double *outvalue) {
      if ((a < 0) || (b < 0)) return -1;
      *outvalue = pow(a, b);
      return 0;
    };
    

    When wrapped, SWIG matches the argout typemap to the "double *outvalue" argument. The numinputs=0 specification tells SWIG to simply ignore this argument when generating wrapper code. As a result, a Tcl function using these typemaps will work like this :

    % mypow 2 3     # Returns two values, a status value and the result
    0 8
    %
    

    40.7.6 Useful functions

    The following tables provide some functions that may be useful in writing Tcl typemaps.

    Integers

    Tcl_Obj   *Tcl_NewIntObj(int Value);
    void       Tcl_SetIntObj(Tcl_Obj *obj, int Value);
    int        Tcl_GetIntFromObj(Tcl_Interp *, Tcl_Obj *obj, int *ip);
    

    Floating Point

    Tcl_Obj  *Tcl_NewDoubleObj(double Value);
    void      Tcl_SetDoubleObj(Tcl_Obj *obj, double value);
    int       Tcl_GetDoubleFromObj(Tcl_Interp *, Tcl_Obj *o, double *dp);
    

    Strings

    Tcl_Obj  *Tcl_NewStringObj(char *str, int len);
    char     *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len);
    void      Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len);
    

    Lists

    Tcl_Obj  *Tcl_NewListObj(int objc, Tcl_Obj *objv);
    int       Tcl_ListObjAppendList(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr);
    int       Tcl_ListObjAppendElement(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *element);
    int       Tcl_ListObjGetElements(Tcl_Interp *, Tcl_Obj *listPtr, int *objcPtr,
                                     Tcl_Obj ***objvPtr);
    int       Tcl_ListObjLength(Tcl_Interp *, Tcl_Obj *listPtr, int *intPtr);
    int       Tcl_ListObjIndex(Tcl_Interp *, Tcl_Obj *listPtr, int index,
                               Tcl_Obj_Obj **objptr);
    int       Tcl_ListObjReplace(Tcl_Interp *, Tcl_Obj *listPtr, int first, int count,
                                 int objc, Tcl_Obj *objv);
    

    Objects

    Tcl_Obj *Tcl_DuplicateObj(Tcl_Obj *obj);
    void     Tcl_IncrRefCount(Tcl_Obj *obj);
    void     Tcl_DecrRefCount(Tcl_Obj *obj);
    int      Tcl_IsShared(Tcl_Obj *obj);
    

    40.7.7 Standard typemaps

    The following typemaps show how to convert a few common kinds of objects between Tcl and C (and to give a better idea of how typemaps work)

    Integer conversion

    %typemap(in) int, short, long {
      int temp;
      if (Tcl_GetIntFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) int, short, long {
      Tcl_SetIntObj($result, (int) $1);
    }
    

    Floating point conversion

    %typemap(in) float, double {
      double temp;
      if (Tcl_GetDoubleFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) float, double {
      Tcl_SetDoubleObj($result, $1);
    }
    

    String Conversion

    %typemap(in) char * {
      int len;
      $1 = Tcl_GetStringFromObj(interp, &len);
    }
    

    %typemap(out, noblock=1, fragment="SWIG_FromCharPtr") char *, const char * {
      Tcl_SetObjResult(interp, SWIG_FromCharPtr((const char *)$1));
    }
    
    

    40.7.8 Pointer handling

    SWIG pointers are mapped into Tcl strings containing the hexadecimal value and type. The following functions can be used to create and read pointer values.

    int SWIG_ConvertPtr(Tcl_Obj *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Tcl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is currently reserved for future expansion. Returns 0 on success and -1 on error.

    Tcl_Obj *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int flags)

    Creates a new Tcl pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag reserved for future expansion.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    Tcl_Obj *;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    40.8 Turning a SWIG module into a Tcl Package.

    Tcl 7.4 introduced the idea of an extension package. By default, SWIG generates all of the code necessary to create a package. To set the package version, simply use the -pkgversion option. For example:

    % swig -tcl -pkgversion 2.3 example.i
    

    After building the SWIG generated module, you need to execute the "pkg_mkIndex" command inside tclsh. For example :

    unix > tclsh
    % pkg_mkIndex . example.so
    % exit
    

    This creates a file "pkgIndex.tcl" with information about the package. To use your package, you now need to move it to its own subdirectory which has the same name as the package. For example :

    ./example/
               pkgIndex.tcl           # The file created by pkg_mkIndex
               example.so             # The SWIG generated module
    

    Finally, assuming that you're not entirely confused at this point, make sure that the example subdirectory is visible from the directories contained in either the tcl_library or auto_path variables. At this point you're ready to use the package as follows :

    unix > tclsh
    % package require example
    % fact 4
    24
    %
    

    If you're working with an example in the current directory and this doesn't work, do this instead :

    unix > tclsh
    % lappend auto_path .
    % package require example
    % fact 4
    24
    

    As a final note, most SWIG examples do not yet use the package commands. For simple extensions it may be easier just to use the load command instead.

    40.9 Building new kinds of Tcl interfaces (in Tcl)

    One of the most interesting aspects of Tcl and SWIG is that you can create entirely new kinds of Tcl interfaces in Tcl using the low-level SWIG accessor functions. For example, suppose you had a library of helper functions to access arrays :

    /* File : array.i */
    %module array
    
    %inline %{
    double *new_double(int size) {
            return (double *) malloc(size*sizeof(double));
    }
    void delete_double(double *a) {
            free(a);
    }
    double get_double(double *a, int index) {
            return a[index];
    }
    void set_double(double *a, int index, double val) {
            a[index] = val;
    }
    int *new_int(int size) {
            return (int *) malloc(size*sizeof(int));
    }
    void delete_int(int *a) {
            free(a);
    }
    int get_int(int *a, int index) {
            return a[index];
    }
    int set_int(int *a, int index, int val) {
            a[index] = val;
    }
    %}
    
    

    While these could be called directly, we could also write a Tcl script like this :

    proc Array {type size} {
        set ptr [new_$type $size]
        set code {
            set method [lindex $args 0]
            set parms [concat $ptr [lrange $args 1 end]]
            switch $method {
                get {return [eval "get_$type $parms"]}
                set {return [eval "set_$type $parms"]}
                delete {eval "delete_$type $ptr; rename $ptr {}"}
            }
        }
        # Create a procedure
        uplevel "proc $ptr args {set ptr $ptr; set type $type;$code}"
        return $ptr
    }
    

    Our script allows easy array access as follows :

    set a [Array double 100]                   ;# Create a double [100]
    for {set i 0} {$i < 100} {incr i 1} {      ;# Clear the array
            $a set $i 0.0
    }
    $a set 3 3.1455                            ;# Set an individual element
    set b [$a get 10]                          ;# Retrieve an element
    
    set ia [Array int 50]                      ;# Create an int[50]
    for {set i 0} {$i < 50} {incr i 1} {       ;# Clear it
            $ia set $i 0
    }
    $ia set 3 7                                ;# Set an individual element
    set ib [$ia get 10]                        ;# Get an individual element
    
    $a delete                                  ;# Destroy a
    $ia delete                                 ;# Destroy ia
    

    The cool thing about this approach is that it makes a common interface for two different types of arrays. In fact, if we were to add more C datatypes to our wrapper file, the Tcl code would work with those as well--without modification. If an unsupported datatype was requested, the Tcl code would simply return with an error so there is very little danger of blowing something up (although it is easily accomplished with an out of bounds array access).

    40.9.1 Proxy classes

    A similar approach can be applied to proxy classes (also known as shadow classes). The following example is provided by Erik Bierwagen and Paul Saxe. To use it, run SWIG with the -noobject option (which disables the builtin object oriented interface). When running Tcl, simply source this file. Now, objects can be used in a more or less natural fashion.

    # swig_c++.tcl
    # Provides a simple object oriented interface using
    # SWIG's low level interface.
    #
    
    proc new {objectType handle_r args} {
        # Creates a new SWIG object of the given type,
        # returning a handle in the variable "handle_r".
        #
        # Also creates a procedure for the object and a trace on
        # the handle variable that deletes the object when the
        # handle variable is overwritten or unset
        upvar $handle_r handle
        #
        # Create the new object
        #
        eval set handle \[new_$objectType $args\]
        #
        # Set up the object procedure
        #
        proc $handle {cmd args} "eval ${objectType}_\$cmd $handle \$args"
        #
        # And the trace ...
        #
        uplevel trace variable $handle_r uw "{deleteObject $objectType $handle}"
        #
        # Return the handle so that 'new' can be used as an argument to a procedure
        #
        return $handle
    }
    
    proc deleteObject {objectType handle name element op} {
        #
        # Check that the object handle has a reasonable form
        #
        if {![regexp {_[0-9a-f]*_(.+)_p} $handle]} {
            error "deleteObject: not a valid object handle: $handle"
        }
        #
        # Remove the object procedure
        #
        catch {rename $handle {}}
        #
        # Delete the object
        #
        delete_$objectType $handle
    }
    
    proc delete {handle_r} {
        #
        # A synonym for unset that is more familiar to C++ programmers
        #
        uplevel unset $handle_r
    }
    

    To use this file, we simply source it and execute commands such as "new" and "delete" to manipulate objects. For example :

    // list.i
    %module List
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example
    
    class List {
    public:
      List();  // Create a new list
      ~List(); // Destroy a list
      int  search(char *value);
      void insert(char *);  // Insert a new item into the list
      void remove(char *);  // Remove item from list
      char *get(int n);     // Get the nth item in the list
      int  length;          // The current length of the list
    static void print(List *l);  // Print out the contents of the list
    };
    

    Now a Tcl script using the interface...

    load ./list.so list       ; # Load the module
    source swig_c++.tcl       ; # Source the object file
    
    new List l
    $l insert Dave
    $l insert John
    $l insert Guido
    $l remove Dave
    puts $l length_get
    
    delete l
    

    The cool thing about this example is that it works with any C++ object wrapped by SWIG and requires no special compilation. Proof that a short, but clever Tcl script can be combined with SWIG to do many interesting things.

    40.10 Tcl/Tk Stubs

    For background information about the Tcl Stubs feature, see http://www.tcl.tk/doc/howto/stubs.html.

    As of SWIG 1.3.10, the generated C/C++ wrapper will use the Tcl Stubs feature if compiled with -DUSE_TCL_STUBS.

    As of SWIG 1.3.40, the generated C/C++ wrapper will use the Tk Stubs feature if compiled with -DUSE_TK_STUBS. Also, you can override the minimum version to support which is passed to Tcl_InitStubs() and Tk_InitStubs() with -DSWIG_TCL_STUBS_VERSION="8.3" or the version being compiled with using -DSWIG_TCL_STUBS_VERSION=TCL_VERSION.

    swig-3.0.12/Doc/Manual/Contents.html0000664000175000017500000026653213042756672017065 0ustar williamwilliam SWIG Users Manual

    SWIG Users Manual

    1 Preface

    2 Introduction

    3 Getting started on Windows

    4 Scripting Languages

    5 SWIG Basics

    6 SWIG and C++

    7 SWIG and C++11

    8 Preprocessing

    9 SWIG library

    10 Argument Handling

    11 Typemaps

    12 Customization Features

    13 Contracts

    14 Variable Length Arguments

    15 Warning Messages

    16 Working with Modules

    17 Using SWIG with ccache - ccache-swig(1) manpage

    18 SWIG and Allegro Common Lisp

    19 SWIG and Android

    20 SWIG and C#

    21 SWIG and Chicken

    22 SWIG and D

    23 SWIG and Go

    24 SWIG and Guile

    25 SWIG and Java

    26 SWIG and Javascript

    27 SWIG and Common Lisp

    28 SWIG and Lua

    29 SWIG and Modula-3

    30 SWIG and MzScheme/Racket

    31 SWIG and Ocaml

    32 SWIG and Octave

    33 SWIG and Perl5

    34 SWIG and PHP

    35 SWIG and Pike

    36 SWIG and Python

    37 SWIG and R

    38 SWIG and Ruby

    39 SWIG and Scilab

    40 SWIG and Tcl

    41 Extending SWIG to support new languages

    swig-3.0.12/Doc/Manual/Scripting.html0000664000175000017500000003454313042756671017224 0ustar williamwilliam Scripting Languages

    4 Scripting Languages

    This chapter provides a brief overview of scripting language extension programming and the mechanisms by which scripting language interpreters access C and C++ code.

    4.1 The two language view of the world

    When a scripting language is used to control a C program, the resulting system tends to look as follows:

    Scripting language input - C/C++ functions output

    In this programming model, the scripting language interpreter is used for high level control whereas the underlying functionality of the C/C++ program is accessed through special scripting language "commands." If you have ever tried to write your own simple command interpreter, you might view the scripting language approach to be a highly advanced implementation of that. Likewise, If you have ever used a package such as MATLAB or IDL, it is a very similar model--the interpreter executes user commands and scripts. However, most of the underlying functionality is written in a low-level language like C or Fortran.

    The two-language model of computing is extremely powerful because it exploits the strengths of each language. C/C++ can be used for maximal performance and complicated systems programming tasks. Scripting languages can be used for rapid prototyping, interactive debugging, scripting, and access to high-level data structures such associative arrays.

    4.2 How does a scripting language talk to C?

    Scripting languages are built around a parser that knows how to execute commands and scripts. Within this parser, there is a mechanism for executing commands and accessing variables. Normally, this is used to implement the builtin features of the language. However, by extending the interpreter, it is usually possible to add new commands and variables. To do this, most languages define a special API for adding new commands. Furthermore, a special foreign function interface defines how these new commands are supposed to hook into the interpreter.

    Typically, when you add a new command to a scripting interpreter you need to do two things; first you need to write a special "wrapper" function that serves as the glue between the interpreter and the underlying C function. Then you need to give the interpreter information about the wrapper by providing details about the name of the function, arguments, and so forth. The next few sections illustrate the process.

    4.2.1 Wrapper functions

    Suppose you have an ordinary C function like this :

    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    

    In order to access this function from a scripting language, it is necessary to write a special "wrapper" function that serves as the glue between the scripting language and the underlying C function. A wrapper function must do three things :

    • Gather function arguments and make sure they are valid.
    • Call the C function.
    • Convert the return value into a form recognized by the scripting language.

    As an example, the Tcl wrapper function for the fact() function above example might look like the following :

    int wrap_fact(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
      int result;
      int arg0;
      if (argc != 2) {
        interp->result = "wrong # args";
        return TCL_ERROR;
      }
      arg0 = atoi(argv[1]);
      result = fact(arg0);
      sprintf(interp->result, "%d", result);
      return TCL_OK;
    }
    
    

    Once you have created a wrapper function, the final step is to tell the scripting language about the new function. This is usually done in an initialization function called by the language when the module is loaded. For example, adding the above function to the Tcl interpreter requires code like the following :

    int Wrap_Init(Tcl_Interp *interp) {
      Tcl_CreateCommand(interp, "fact", wrap_fact, (ClientData) NULL,
                        (Tcl_CmdDeleteProc *) NULL);
      return TCL_OK;
    }
    

    When executed, Tcl will now have a new command called "fact" that you can use like any other Tcl command.

    Although the process of adding a new function to Tcl has been illustrated, the procedure is almost identical for Perl and Python. Both require special wrappers to be written and both need additional initialization code. Only the specific details are different.

    4.2.2 Variable linking

    Variable linking refers to the problem of mapping a C/C++ global variable to a variable in the scripting language interpreter. For example, suppose you had the following variable:

    double Foo = 3.5;
    

    It might be nice to access it from a script as follows (shown for Perl):

    $a = $Foo * 2.3;   # Evaluation
    $Foo = $a + 2.0;   # Assignment
    

    To provide such access, variables are commonly manipulated using a pair of get/set functions. For example, whenever the value of a variable is read, a "get" function is invoked. Similarly, whenever the value of a variable is changed, a "set" function is called.

    In many languages, calls to the get/set functions can be attached to evaluation and assignment operators. Therefore, evaluating a variable such as $Foo might implicitly call the get function. Similarly, typing $Foo = 4 would call the underlying set function to change the value.

    4.2.3 Constants

    In many cases, a C program or library may define a large collection of constants. For example:

    #define RED   0xff0000
    #define BLUE  0x0000ff
    #define GREEN 0x00ff00
    

    To make constants available, their values can be stored in scripting language variables such as $RED, $BLUE, and $GREEN. Virtually all scripting languages provide C functions for creating variables so installing constants is usually a trivial exercise.

    4.2.4 Structures and classes

    Although scripting languages have no trouble accessing simple functions and variables, accessing C/C++ structures and classes present a different problem. This is because the implementation of structures is largely related to the problem of data representation and layout. Furthermore, certain language features are difficult to map to an interpreter. For instance, what does C++ inheritance mean in a Perl interface?

    The most straightforward technique for handling structures is to implement a collection of accessor functions that hide the underlying representation of a structure. For example,

    struct Vector {
      Vector();
      ~Vector();
      double x, y, z;
    };
    
    

    can be transformed into the following set of functions :

    Vector *new_Vector();
    void delete_Vector(Vector *v);
    double Vector_x_get(Vector *v);
    double Vector_y_get(Vector *v);
    double Vector_z_get(Vector *v);
    void Vector_x_set(Vector *v, double x);
    void Vector_y_set(Vector *v, double y);
    void Vector_z_set(Vector *v, double z);
    
    

    Now, from an interpreter these function might be used as follows:

    % set v [new_Vector]
    % Vector_x_set $v 3.5
    % Vector_y_get $v
    % delete_Vector $v
    % ...
    

    Since accessor functions provide a mechanism for accessing the internals of an object, the interpreter does not need to know anything about the actual representation of a Vector.

    4.2.5 Proxy classes

    In certain cases, it is possible to use the low-level accessor functions to create a proxy class, also known as a shadow class. A proxy class is a special kind of object that gets created in a scripting language to access a C/C++ class (or struct) in a way that looks like the original structure (that is, it proxies the real C++ class). For example, if you have the following C++ definition :

    class Vector {
    public:
      Vector();
      ~Vector();
      double x, y, z;
    };
    

    A proxy classing mechanism would allow you to access the structure in a more natural manner from the interpreter. For example, in Python, you might want to do this:

    >>> v = Vector()
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = -13
    >>> ...
    >>> del v
    

    Similarly, in Perl5 you may want the interface to work like this:

    $v = new Vector;
    $v->{x} = 3;
    $v->{y} = 4;
    $v->{z} = -13;
    
    

    Finally, in Tcl :

    Vector v
    v configure -x 3 -y 4 -z -13
    
    

    When proxy classes are used, two objects are really at work--one in the scripting language, and an underlying C/C++ object. Operations affect both objects equally and for all practical purposes, it appears as if you are simply manipulating a C/C++ object.

    4.3 Building scripting language extensions

    The final step in using a scripting language with your C/C++ application is adding your extensions to the scripting language itself. There are two primary approaches for doing this. The preferred technique is to build a dynamically loadable extension in the form of a shared library. Alternatively, you can recompile the scripting language interpreter with your extensions added to it.

    4.3.1 Shared libraries and dynamic loading

    To create a shared library or DLL, you often need to look at the manual pages for your compiler and linker. However, the procedure for a few common platforms is shown below:

    # Build a shared library for Solaris
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    ld -G example.o example_wrap.o -o example.so
    
    # Build a shared library for Linux
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    gcc -shared example.o example_wrap.o -o example.so
    

    To use your shared library, you simply use the corresponding command in the scripting language (load, import, use, etc...). This will import your module and allow you to start using it. For example:

    % load ./example.so
    % fact 4
    24
    %
    

    When working with C++ codes, the process of building shared libraries may be more complicated--primarily due to the fact that C++ modules may need additional code in order to operate correctly. On many machines, you can build a shared C++ module by following the above procedures, but changing the link line to the following :

    c++ -shared example.o example_wrap.o -o example.so
    

    4.3.2 Linking with shared libraries

    When building extensions as shared libraries, it is not uncommon for your extension to rely upon other shared libraries on your machine. In order for the extension to work, it needs to be able to find all of these libraries at run-time. Otherwise, you may get an error such as the following :

    >>> import graph
    Traceback (innermost last):
      File "<stdin>", line 1, in ?
      File "/home/sci/data1/beazley/graph/graph.py", line 2, in ?
        import graphc
    ImportError:  1101:/home/sci/data1/beazley/bin/python: rld: Fatal Error: cannot 
    successfully map soname 'libgraph.so' under any of the filenames /usr/lib/libgraph.so:/
    lib/libgraph.so:/lib/cmplrs/cc/libgraph.so:/usr/lib/cmplrs/cc/libgraph.so:
    >>>
    

    What this error means is that the extension module created by SWIG depends upon a shared library called "libgraph.so" that the system was unable to locate. To fix this problem, there are a few approaches you can take.

    • Link your extension and explicitly tell the linker where the required libraries are located. Often times, this can be done with a special linker flag such as -R, -rpath, etc. This is not implemented in a standard manner so read the man pages for your linker to find out more about how to set the search path for shared libraries.
    • Put shared libraries in the same directory as the executable. This technique is sometimes required for correct operation on non-Unix platforms.
    • Set the UNIX environment variable LD_LIBRARY_PATH to the directory where shared libraries are located before running Python. Although this is an easy solution, it is not recommended. Consider setting the path using linker options instead.

    4.3.3 Static linking

    With static linking, you rebuild the scripting language interpreter with extensions. The process usually involves compiling a short main program that adds your customized commands to the language and starts the interpreter. You then link your program with a library to produce a new scripting language executable.

    Although static linking is supported on all platforms, this is not the preferred technique for building scripting language extensions. In fact, there are very few practical reasons for doing this--consider using shared libraries instead.

    swig-3.0.12/Doc/Manual/Modules.html0000664000175000017500000003336013042756671016666 0ustar williamwilliam Working with Modules

    16 Working with Modules

    16.1 Modules Introduction

    Each invocation of SWIG requires a module name to be specified. The module name is used to name the resulting target language extension module. Exactly what this means and what the name is used for depends on the target language, for example the name can define a target language namespace or merely be a useful name for naming files or helper classes. Essentially, a module comprises target language wrappers for a chosen collection of global variables/functions, structs/classes and other C/C++ types.

    The module name can be supplied in one of two ways. The first is to specify it with the special %module directive. This directive must appear at the beginning of the interface file. The general form of this directive is:

    %module(option1="value1", option2="value2", ...) modulename
    

    where the modulename is mandatory and the options add one or more optional additional features. Typically no options are specified, for example:

    %module mymodule
    

    The second way to specify the module name is with the -module command line option, for example -module mymodule. If the module name is supplied on the command line, it overrides the name specified by the %module directive.

    When first working with SWIG, users commonly start by creating a single module. That is, you might define a single SWIG interface that wraps some set of C/C++ code. You then compile all of the generated wrapper code together and use it. For large applications, however, this approach is problematic---the size of the generated wrapper code can be rather large. Moreover, it is probably easier to manage the target language interface when it is broken up into smaller pieces.

    This chapter describes the problem of using SWIG in programs where you want to create a collection of modules. Each module in the collection is created via separate invocations of SWIG.

    16.2 Basics

    The basic usage case with multiple modules is when modules do not have cross-references (ie. when wrapping multiple independent C APIs). In that case, swig input files should just work out of the box - you simply create multiple wrapper .cxx files, link them into your application, and insert/load each in the scripting language runtime as you would do for the single module case.

    A bit more complex is the case in which modules need to share information. For example, when one module extends the class of another by deriving from it:

    // File: base.h
    class base {
    public:
      int foo();
    };
    
     
    // File: base_module.i
    %module base_module
    
    %{
    #include "base.h"
    %}
    %include "base.h"
    
     
    // File: derived_module.i
    %module derived_module
    
    %import "base_module.i"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    %}
    

    To create the wrapper properly, module derived_module needs to know about the base class and that its interface is covered in another module. The line %import "base_module.i" lets SWIG know exactly that. Often the .h file is passed to %import instead of the .i, which unfortunately doesn't work for all language modules. For example, Python requires the name of module that the base class exists in so that the proxy classes can fully inherit the base class's methods. Typically you will get a warning when the module name is missing, eg:

    derived_module.i:8: Warning 401: Base class 'base' ignored - unknown module name for base. Either
    import
    the appropriate module interface file or specify the name of the module in the %import directive.
    

    It is sometimes desirable to import the header file rather than the interface file and overcome the above warning. For example in the case of the imported interface being quite large, it may be desirable to simplify matters and just import a small header file of dependent types. This can be done by specifying the optional module attribute in the %import directive. The derived_module.i file shown above could be replaced with the following:

    // File: derived_module.i
    %module derived_module
    
    %import(module="base_module") "base.h"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    

    Note that "base_module" is the module name and is the same as that specified in %module in base_module.i as well as the %import in derived_module.i.

    Another issue to beware of is that multiple dependent wrappers should not be linked/loaded in parallel from multiple threads as SWIG provides no locking - for more on that issue, read on.

    16.3 The SWIG runtime code

    Many of SWIG's target languages generate a set of functions commonly known as the "SWIG runtime." These functions are primarily related to the runtime type system which checks pointer types and performs other tasks such as proper casting of pointer values in C++. As a general rule, the statically typed target languages, such as Java, use the language's built in static type checking and have no need for a SWIG runtime. All the dynamically typed / interpreted languages rely on the SWIG runtime.

    The runtime functions are private to each SWIG-generated module. That is, the runtime functions are declared with "static" linkage and are visible only to the wrapper functions defined in that module. The only problem with this approach is that when more than one SWIG module is used in the same application, those modules often need to share type information. This is especially true for C++ programs where SWIG must collect and share information about inheritance relationships that cross module boundaries.

    To solve the problem of sharing information across modules, a pointer to the type information is stored in a global variable in the target language namespace. During module initialization, type information is loaded into the global data structure of type information from all modules.

    There are a few trade offs with this approach. This type information is global across all SWIG modules loaded, and can cause type conflicts between modules that were not designed to work together. To solve this approach, the SWIG runtime code uses a define SWIG_TYPE_TABLE to provide a unique type table. This behavior can be enabled when compiling the generated _wrap.cxx or _wrap.c file by adding -DSWIG_TYPE_TABLE=myprojectname to the command line argument.

    Then, only modules compiled with SWIG_TYPE_TABLE set to myprojectname will share type information. So if your project has three modules, all three should be compiled with -DSWIG_TYPE_TABLE=myprojectname, and then these three modules will share type information. But any other project's types will not interfere or clash with the types in your module.

    Another issue relating to the global type table is thread safety. If two modules try and load at the same time, the type information can become corrupt. SWIG currently does not provide any locking, and if you use threads, you must make sure that modules are loaded serially. Be careful if you use threads and the automatic module loading that some scripting languages provide. One solution is to load all modules before spawning any threads, or use SWIG_TYPE_TABLE to separate type tables so they do not clash with each other.

    Lastly, SWIG uses a #define SWIG_RUNTIME_VERSION, located in Lib/swigrun.swg and near the top of every generated module. This number gets incremented when the data structures change, so that SWIG modules generated with different versions can peacefully coexist. So the type structures are separated by the (SWIG_TYPE_TABLE, SWIG_RUNTIME_VERSION) pair, where by default SWIG_TYPE_TABLE is empty. Only modules compiled with the same pair will share type information.

    16.4 External access to the runtime

    As described in The run-time type checker, the functions SWIG_TypeQuery, SWIG_NewPointerObj, and others sometimes need to be called. Calling these functions from a typemap is supported, since the typemap code is embedded into the _wrap.c file, which has those declarations available. If you need to call the SWIG run-time functions from another C file, there is one header you need to include. To generate the header that needs to be included, SWIG can be run in a different mode via -external-runtime to generate the run-time instead of the normal mode of processing an input interface file. For example:

    $ swig -python -external-runtime <filename>
    

    The filename argument is optional and if it is not passed, then the default filename will be something like swigpyrun.h, depending on the language. This header file should be treated like any of the other _wrap.c output files, and should be regenerated when the _wrap files are. After including this header, your code will be able to call SWIG_TypeQuery, SWIG_NewPointerObj, SWIG_ConvertPtr and others. The exact argument parameters for these functions might differ between language modules; please check the language module chapters for more information.

    Inside this header the functions are declared static and are included inline into the file, and thus the file does not need to be linked against any SWIG libraries or code (you might still need to link against the language libraries like libpython-2.3). Data is shared between this file and the _wrap.c files through a global variable in the scripting language. It is also possible to copy this header file along with the generated wrapper files into your own package, so that you can distribute a package that can be compiled without SWIG installed (this works because the header file is self-contained, and does not need to link with anything).

    This header will also use the -DSWIG_TYPE_TABLE described above, so when compiling any code which includes the generated header file should define the SWIG_TYPE_TABLE to be the same as the module whose types you are trying to access.

    16.5 A word of caution about static libraries

    When working with multiple SWIG modules, you should take care not to use static libraries. For example, if you have a static library libfoo.a and you link a collection of SWIG modules with that library, each module will get its own private copy of the library code inserted into it. This is very often NOT what you want and it can lead to unexpected or bizarre program behavior. When working with dynamically loadable modules, you should try to work exclusively with shared libraries.

    16.6 References

    Due to the complexity of working with shared libraries and multiple modules, it might be a good idea to consult an outside reference. John Levine's "Linkers and Loaders" is highly recommended.

    16.7 Reducing the wrapper file size

    Using multiple modules with the %import directive is the most common approach to modularising large projects. In this way a number of different wrapper files can be generated, thereby avoiding the generation of a single large wrapper file. There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options and features.

    -fcompact
    This command line option will compact the size of the wrapper file without changing the code generated into the wrapper file. It simply removes blank lines and joins lines of code together. This is useful for compilers that have a maximum file size that can be handled.

    -fvirtual
    This command line option will remove the generation of superfluous virtual method wrappers. Consider the following inheritance hierarchy:

    struct Base {
      virtual void method();
      ...
    };
    
    struct Derived : Base {
      virtual void method();
      ...
    };
    

    Normally wrappers are generated for both methods, whereas this command line option will suppress the generation of a wrapper for Derived::method. Normal polymorphic behaviour remains as Derived::method will still be called should you have a Derived instance and call the wrapper for Base::method.

    %feature("compactdefaultargs")
    This feature can reduce the number of wrapper methods when wrapping methods with default arguments. The section on default arguments discusses the feature and its limitations.

    swig-3.0.12/Doc/Manual/Typemaps.html0000664000175000017500000042132513042756671017062 0ustar williamwilliam Typemaps

    11 Typemaps

    11.1 Introduction

    Chances are, you are reading this chapter for one of two reasons; you either want to customize SWIG's behavior or you overheard someone mumbling some incomprehensible drivel about "typemaps" and you asked yourself "typemaps, what are those?" That said, let's start with a short disclaimer that "typemaps" are an advanced customization feature that provide direct access to SWIG's low-level code generator. Not only that, they are an integral part of the SWIG C++ type system (a non-trivial topic of its own). Typemaps are generally not a required part of using SWIG. Therefore, you might want to re-read the earlier chapters if you have found your way to this chapter with only a vague idea of what SWIG already does by default.

    11.1.1 Type conversion

    One of the most important problems in wrapper code generation is the conversion or marshalling of datatypes between programming languages. Specifically, for every C/C++ declaration, SWIG must somehow generate wrapper code that allows values to be passed back and forth between languages. Since every programming language represents data differently, this is not a simple of matter of simply linking code together with the C linker. Instead, SWIG has to know something about how data is represented in each language and how it can be manipulated.

    To illustrate, suppose you had a simple C function like this:

    int factorial(int n);
    

    To access this function from Python, a pair of Python API functions are used to convert integer values. For example:

    long PyInt_AsLong(PyObject *obj);      /* Python --> C */
    PyObject *PyInt_FromLong(long x);      /* C --> Python */
    

    The first function is used to convert the input argument from a Python integer object to C long. The second function is used to convert a value from C back into a Python integer object.

    Inside the wrapper function, you might see these functions used like this:

    PyObject *wrap_factorial(PyObject *self, PyObject *args) {
      int       arg1;
      int       result;
      PyObject *obj1;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("O:factorial", &obj1)) return NULL;
      arg1 = PyInt_AsLong(obj1);
      result = factorial(arg1);
      resultobj = PyInt_FromLong(result);
      return resultobj;
    }
    

    Every target language supported by SWIG has functions that work in a similar manner. For example, in Perl, the following functions are used:

    IV SvIV(SV *sv);                     /* Perl --> C */
    void sv_setiv(SV *sv, IV val);       /* C --> Perl */
    

    In Tcl:

    int Tcl_GetLongFromObj(Tcl_Interp *interp, Tcl_Obj *obj, long *value);
    Tcl_Obj *Tcl_NewIntObj(long value);
    

    The precise details are not so important. What is important is that all of the underlying type conversion is handled by collections of utility functions and short bits of C code like this---you simply have to read the extension documentation for your favorite language to know how it works (an exercise left to the reader).

    11.1.2 Typemaps

    Since type handling is so central to wrapper code generation, SWIG allows it to be completely defined (or redefined) by the user. To do this, a special %typemap directive is used. For example:

    /* Convert from Python --> C */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    
    /* Convert from C --> Python */
    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    At first glance, this code will look a little confusing. However, there is really not much to it. The first typemap (the "in" typemap) is used to convert a value from the target language to C. The second typemap (the "out" typemap) is used to convert in the other direction. The content of each typemap is a small fragment of code that is inserted directly into the SWIG generated wrapper functions. The code is usually C or C++ code which will be generated into the C/C++ wrapper functions. Note that this isn't always the case as some target language modules allow target language code within the typemaps which gets generated into target language specific files. Within this code, a number of special variables prefixed with a $ are expanded. These are really just placeholders for C/C++ variables that are generated in the course of creating the wrapper function. In this case, $input refers to an input object that needs to be converted to C/C++ and $result refers to an object that is going to be returned by a wrapper function. $1 refers to a C/C++ variable that has the same type as specified in the typemap declaration (an int in this example).

    A short example might make this a little more clear. If you were wrapping a function like this:

    int gcd(int x, int y);
    

    A wrapper function would look approximately like this:

    PyObject *wrap_gcd(PyObject *self, PyObject *args) {
      int arg1;
      int arg2;
      int result;
      PyObject *obj1;
      PyObject *obj2;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("OO:gcd", &obj1, &obj2)) return NULL;
    
      /* "in" typemap, argument 1 */
      {
        arg1 = PyInt_AsLong(obj1);
      }
    
      /* "in" typemap, argument 2 */
      {
        arg2 = PyInt_AsLong(obj2);
      }
    
      result = gcd(arg1, arg2);
    
      /* "out" typemap, return value */
      {
        resultobj = PyInt_FromLong(result);
      }
    
      return resultobj;
    }
    

    In this code, you can see how the typemap code has been inserted into the function. You can also see how the special $ variables have been expanded to match certain variable names inside the wrapper function. This is really the whole idea behind typemaps--they simply let you insert arbitrary code into different parts of the generated wrapper functions. Because arbitrary code can be inserted, it possible to completely change the way in which values are converted.

    11.1.3 Pattern matching

    As the name implies, the purpose of a typemap is to "map" C datatypes to types in the target language. Once a typemap is defined for a C datatype, it is applied to all future occurrences of that type in the input file. For example:

    /* Convert from Perl --> C */
    %typemap(in) int {
      $1 = SvIV($input);
    }
    
    ...
    int factorial(int n);
    int gcd(int x, int y);
    int count(char *s, char *t, int max);
    

    The matching of typemaps to C datatypes is more than a simple textual match. In fact, typemaps are fully built into the underlying type system. Therefore, typemaps are unaffected by typedef, namespaces, and other declarations that might hide the underlying type. For example, you could have code like this:

    /* Convert from Ruby--> C */
    %typemap(in) int {
      $1 = NUM2INT($input);
    }
    ...
    typedef int Integer;
    namespace foo {
      typedef Integer Number;
    };
    
    int foo(int x);
    int bar(Integer y);
    int spam(foo::Number a, foo::Number b);
    

    In this case, the typemap is still applied to the proper arguments even though typenames don't always match the text "int". This ability to track types is a critical part of SWIG--in fact, all of the target language modules work merely define a set of typemaps for the basic types. Yet, it is never necessary to write new typemaps for typenames introduced by typedef.

    In addition to tracking typenames, typemaps may also be specialized to match against a specific argument name. For example, you could write a typemap like this:

    %typemap(in) double nonnegative {
      $1 = PyFloat_AsDouble($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "argument must be nonnegative.");
        SWIG_fail;
      }
    }
    
    ...
    double sin(double x);
    double cos(double x);
    double sqrt(double nonnegative);
    
    typedef double Real;
    double log(Real nonnegative);
    ...
    

    For certain tasks such as input argument conversion, typemaps can be defined for sequences of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);   /* char *str */
      $2 = PyString_Size($input);       /* int len   */
    }
    ...
    int count(char *str, int len, char c);
    

    In this case, a single input object is expanded into a pair of C arguments. This example also provides a hint to the unusual variable naming scheme involving $1, $2, and so forth.

    11.1.4 Reusing typemaps

    Typemaps are normally defined for specific type and argument name patterns. However, typemaps can also be copied and reused. One way to do this is to use assignment like this:

    %typemap(in) Integer = int;   
    %typemap(in) (char *buffer, int size) = (char *str, int len);
    

    A more general form of copying is found in the %apply directive like this:

    %typemap(in) int {
      /* Convert an integer argument */
      ...
    }
    %typemap(out) int {
      /* Return an integer value */
      ...
    }
    
    /* Apply all of the integer typemaps to size_t */
    %apply int { size_t };    
    

    %apply merely takes all of the typemaps that are defined for one type and applies them to other types. Note: you can include a comma separated set of types in the { ... } part of %apply.

    It should be noted that it is not necessary to copy typemaps for types that are related by typedef. For example, if you have this,

    typedef int size_t;
    

    then SWIG already knows that the int typemaps apply. You don't have to do anything.

    11.1.5 What can be done with typemaps?

    The primary use of typemaps is for defining wrapper generation behavior at the level of individual C/C++ datatypes. There are currently six general categories of problems that typemaps address:

    Argument handling

    int foo(int x, double y, char *s);
    
    • Input argument conversion ("in" typemap).
    • Input argument type checking for types used in overloaded methods ("typecheck" typemap).
    • Output argument handling ("argout" typemap).
    • Input argument value checking ("check" typemap).
    • Input argument initialization ("arginit" typemap).
    • Default arguments ("default" typemap).
    • Input argument resource management ("freearg" typemap).

    Return value handling

    int foo(int x, double y, char *s);
    
    • Function return value conversion ("out" typemap).
    • Return value resource management ("ret" typemap).
    • Resource management for newly allocated objects ("newfree" typemap).

    Exception handling

    int foo(int x, double y, char *s) throw(MemoryError, IndexError);
    
    • Handling of C++ exception specifications. ("throw" typemap).

    Global variables

    int foo;
    
    • Assignment of a global variable. ("varin" typemap).
    • Reading a global variable. ("varout" typemap).

    Member variables

    struct Foo {
      int x[20];
    };
    
    • Assignment of data to a class/structure member. ("memberin" typemap).

    Constant creation

    #define FOO 3
    %constant int BAR = 42;
    enum { ALE, LAGER, STOUT };
    
    • Creation of constant values. ("consttab" or "constcode" typemap).

    Details of each of these typemaps will be covered shortly. Also, certain language modules may define additional typemaps that expand upon this list. For example, the Java module defines a variety of typemaps for controlling additional aspects of the Java bindings. Consult language specific documentation for further details.

    11.1.6 What can't be done with typemaps?

    Typemaps can't be used to define properties that apply to C/C++ declarations as a whole. For example, suppose you had a declaration like this,

    Foo *make_Foo(int n);
    

    and you wanted to tell SWIG that make_Foo(int n) returned a newly allocated object (for the purposes of providing better memory management). Clearly, this property of make_Foo(int n) is not a property that would be associated with the datatype Foo * by itself. Therefore, a completely different SWIG customization mechanism (%feature) is used for this purpose. Consult the Customization Features chapter for more information about that.

    Typemaps also can't be used to rearrange or transform the order of arguments. For example, if you had a function like this:

    void foo(int, char *);
    

    you can't use typemaps to interchange the arguments, allowing you to call the function like this:

    foo("hello", 3)          # Reversed arguments
    

    If you want to change the calling conventions of a function, write a helper function instead. For example:

    %rename(foo) wrap_foo;
    %inline %{
    void wrap_foo(char *s, int x) {
      foo(x, s);
    }
    %}
    

    11.1.7 Similarities to Aspect Oriented Programming

    SWIG has parallels to Aspect Oriented Software Development (AOP). The AOP terminology with respect to SWIG typemaps can be viewed as follows:

    • Cross-cutting concerns: The cross-cutting concerns are the modularization of the functionality that the typemaps implement, which is primarily marshalling of types from/to the target language and C/C++.
    • Advice: The typemap body contains code which is executed whenever the marshalling is required.
    • Pointcut: The pointcuts are the positions in the wrapper code that the typemap code is generated into.
    • Aspect: Aspects are the combination of the pointcut and the advice, hence each typemap is an aspect.

    SWIG can also be viewed as has having a second set of aspects based around %feature. Features such as %exception are also cross-cutting concerns as they encapsulate code that can be used to add logging or exception handling to any function.

    11.1.8 The rest of this chapter

    The rest of this chapter provides detailed information for people who want to write new typemaps. This information is of particular importance to anyone who intends to write a new SWIG target language module. Power users can also use this information to write application specific type conversion rules.

    Since typemaps are strongly tied to the underlying C++ type system, subsequent sections assume that you are reasonably familiar with the basic details of values, pointers, references, arrays, type qualifiers (e.g., const), structures, namespaces, templates, and memory management in C/C++. If not, you would be well-advised to consult a copy of "The C Programming Language" by Kernighan and Ritchie or "The C++ Programming Language" by Stroustrup before going any further.

    11.2 Typemap specifications

    This section describes the behavior of the %typemap directive itself.

    11.2.1 Defining a typemap

    New typemaps are defined using the %typemap declaration. The general form of this declaration is as follows (parts enclosed in [ ... ] are optional):

    %typemap(method [, modifiers]) typelist code ;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout". The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent. They are also known as typemap attributes.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist    :  typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern :  type [ (parms) ]
                |  type name [ (parms) ]
                |  ( typelist ) [ (parms) ]
    
    

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the code used in the typemap. Usually this is C/C++ code, but in the statically typed target languages, such as Java and C#, this can contain target language code for certain typemaps. It can take any one of the following forms:

    code       : { ... }
               | " ... "
               | %{ ... %}
    

    Note that the preprocessor will expand code within the {} delimiters, but not in the last two styles of delimiters, see Preprocessor and Typemaps. Here are some examples of valid typemap specifications:

    /* Simple typemap declarations */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{ 
      $1 = PyInt_AsLong($input);
    %}
    
    /* Typemap with extra argument name */
    %typemap(in) int nonnegative {
      ...
    }
    
    /* Multiple types in one typemap */
    %typemap(in) int, short, long { 
      $1 = SvIV($input);
    }
    
    /* Typemap with modifiers */
    %typemap(in, doc="integer") int "$1 = scm_to_int($input);";
    
    /* Typemap applied to patterns of multiple arguments */
    %typemap(in) (char *str, int len),
                 (char *buffer, int size)
    {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    /* Typemap with extra pattern parameters */
    %typemap(in, numinputs=0) int *output (int temp),
                              long *output (long temp)
    {
      $1 = &temp;
    }
    

    Admittedly, it's not the most readable syntax at first glance. However, the purpose of the individual pieces will become clear.

    11.2.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
    ...
    }
    
    int fact(int);                    // typemap1
    int gcd(int x, int y);            // typemap1
    
    // typemap2
    %typemap(in) int {
    ...
    }
    
    int isprime(int);                 // typemap2
    

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
     ...
    }
    
    %extend Foo {
      int blah(int x);    // typemap has no effect.  Declaration is attached to Foo which
                          // appears before the %typemap declaration.
    };
    

    11.2.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;
    

    or this:

    %typemap(in) Integer, Number, int32_t = int;
    

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in)     int { ... }
    %typemap(out)    int { ... }
    %typemap(varin)  int { ... }
    %typemap(varout) int { ... }
    

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer };            // Copy all int typemaps to Integer
    %apply int { Integer, Number };    // Copy all int typemaps to both Integer and Number
    

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output };                    // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) };  // Multiple arguments
    

    11.2.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int;               // Clears typemap for int
    %typemap(in) int, long, short;  // Clears typemap for int, long, short
    %typemap(in) int *output;       
    

    The %clear directive clears all typemaps for a given type. For example:

    %clear int;                     // Removes all types for int
    %clear int *output, long *output;
    

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    11.2.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };
    

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string {          /* std::string */
        ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string {          /* Foo::string */
        ...
      }
    }
    

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the forward class declaration class string.

    11.3 Pattern matching rules

    The section describes the pattern matching rules by which C/C++ datatypes are associated with typemaps. The matching rules can be observed in practice by using the debugging options also described.

    11.3.1 Basic matching rules

    Typemaps are matched using both a type and a name (typically the name of a argument). For a given TYPE NAME pair, the following rules are applied, in order, to find a match. The first typemap found is used.

    • Typemaps that exactly match TYPE and NAME.
    • Typemaps that exactly match TYPE only.
    • If TYPE is a C++ template of type T< TPARMS >, where TPARMS are the template parameters, the type is stripped of the template parameters and the following checks are then made:
      • Typemaps that exactly match T and NAME.
      • Typemaps that exactly match T only.

    If TYPE includes qualifiers (const, volatile, etc.), each qualifier is stripped one at a time to form a new stripped type and the matching rules above are repeated on the stripped type. The left-most qualifier is stripped first, resulting in the right-most (or top-level) qualifier being stripped last. For example int const*const is first stripped to int *const then int *.

    If TYPE is an array. The following transformation is made:

    • Replace all dimensions to [ANY] and look for a generic array typemap.

    To illustrate, suppose that you had a function like this:

    int foo(const char *s);
    

    To find a typemap for the argument const char *s, SWIG will search for the following typemaps:

    const char *s           Exact type and name match
    const char *            Exact type match
    char *s                 Type and name match (qualifier stripped)
    char *                  Type match (qualifier stripped)
    

    When more than one typemap rule might be defined, only the first match found is actually used. Here is an example that shows how some of the basic rules are applied:

    %typemap(in) int *x {
      ... typemap 1
    }
    
    %typemap(in) int * {
      ... typemap 2
    }
    
    %typemap(in) const int *z {
      ... typemap 3
    }
    
    %typemap(in) int [4] {
      ... typemap 4
    }
    
    %typemap(in) int [ANY] {
      ... typemap 5
    }
    
    void A(int *x);        // int *x rule       (typemap 1)
    void B(int *y);        // int * rule        (typemap 2)
    void C(const int *x);  // int *x rule       (typemap 1)
    void D(const int *z);  // const int *z rule (typemap 3)
    void E(int x[4]);      // int [4] rule      (typemap 4)
    void F(int x[1000]);   // int [ANY] rule    (typemap 5)
    

    Compatibility note: SWIG-2.0.0 introduced stripping the qualifiers one step at a time. Prior versions stripped all qualifiers in one step.

    11.3.2 Typedef reductions matching

    If no match is found using the rules in the previous section, SWIG applies a typedef reduction to the type and repeats the typemap search for the reduced type. To illustrate, suppose you had code like this:

    %typemap(in) int {
      ... typemap 1
    }
    
    typedef int Integer;
    void blah(Integer x);
    

    To find the typemap for Integer x, SWIG will first search for the following typemaps:

    Integer x
    Integer
    

    Finding no match, it then applies a reduction Integer -> int to the type and repeats the search.

    int x
    int      --> match: typemap 1
    

    Even though two types might be the same via typedef, SWIG allows typemaps to be defined for each typename independently. This allows for interesting customization possibilities based solely on the typename itself. For example, you could write code like this:

    typedef double  pdouble;     // Positive double
    
    // typemap 1
    %typemap(in) double {
      ... get a double ...
    }
    // typemap 2
    %typemap(in) pdouble {
      ... get a positive double ...
    }
    double sin(double x);           // typemap 1
    pdouble sqrt(pdouble x);        // typemap 2
    

    When reducing the type, only one typedef reduction is applied at a time. The search process continues to apply reductions until a match is found or until no more reductions can be made.

    For complicated types, the reduction process can generate a long list of patterns. Consider the following:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    To find a match for the Row4 rows[10] argument, SWIG would check the following patterns, stopping only when it found a match:

    Row4 rows[10]
    Row4 [10]
    Row4 rows[ANY]
    Row4 [ANY]
    
    # Reduce Row4 --> Integer[4]
    Integer rows[10][4]
    Integer [10][4]
    Integer rows[ANY][ANY]
    Integer [ANY][ANY]
    
    # Reduce Integer --> int
    int rows[10][4]
    int [10][4]
    int rows[ANY][ANY]
    int [ANY][ANY]
    

    For parameterized types like templates, the situation is even more complicated. Suppose you had some declarations like this:

    typedef int Integer;
    typedef foo<Integer, Integer> fooii;
    void blah(fooii *x);
    

    In this case, the following typemap patterns are searched for the argument fooii *x:

    fooii *x
    fooii *
    
    # Reduce fooii --> foo<Integer, Integer>
    foo<Integer, Integer> *x
    foo<Integer, Integer> *
    
    # Reduce Integer -> int
    foo<int, Integer> *x
    foo<int, Integer> *
    
    # Reduce Integer -> int
    foo<int, int> *x
    foo<int, int> *
    

    Typemap reductions are always applied to the left-most type that appears. Only when no reductions can be made to the left-most type are reductions made to other parts of the type. This behavior means that you could define a typemap for foo<int, Integer>, but a typemap for foo<Integer, int> would never be matched. Admittedly, this is rather esoteric--there's little practical reason to write a typemap quite like that. Of course, you could rely on this to confuse your coworkers even more.

    As a point of clarification, it is worth emphasizing that typedef matching is a typedef reduction process only, that is, SWIG does not search for every single possible typedef. Given a type in a declaration, it will only reduce the type, it won't build it up looking for typedefs. For example, given the type Struct, the typemap below will not be used for the aStruct parameter, because Struct is fully reduced:

    struct Struct {...};
    typedef Struct StructTypedef;
    
    %typemap(in) StructTypedef { 
      ...
    }
    
    void go(Struct aStruct);
    

    11.3.3 Default typemap matching rules

    If the basic pattern matching rules result in no match being made, even after typedef reductions, the default typemap matching rules are used to look for a suitable typemap match. These rules match a generic typemap based on the reserved SWIGTYPE base type. For example pointers will use SWIGTYPE * and references will use SWIGTYPE &. More precisely, the rules are based on the C++ class template partial specialization matching rules used by C++ compilers when looking for an appropriate partial template specialization. This means that a match is chosen from the most specialized set of generic typemap types available. For example, when looking for a match to int const *, the rules will prefer to match SWIGTYPE const * if available before matching SWIGTYPE *, before matching SWIGTYPE.

    Most SWIG language modules use typemaps to define the default behavior of the C primitive types. This is entirely straightforward. For example, a set of typemaps for primitives marshalled by value or const reference are written like this:

    %typemap(in) int           "... convert to int ...";
    %typemap(in) short         "... convert to short ...";
    %typemap(in) float         "... convert to float ...";
    ...
    %typemap(in) const int &   "... convert ...";
    %typemap(in) const short & "... convert ...";
    %typemap(in) const float & "... convert ...";
    ...
    

    Since typemap matching follows all typedef declarations, any sort of type that is mapped to a primitive type by value or const reference through typedef will be picked up by one of these primitive typemaps. Most language modules also define typemaps for char pointers and char arrays to handle strings, so these non-default types will also be used in preference as the basic typemap matching rules provide a better match than the default typemap matching rules.

    Below is a list of the typical default types supplied by language modules, showing what the "in" typemap would look like:

    %typemap(in) SWIGTYPE &            { ... default reference handling ...                       };
    %typemap(in) SWIGTYPE *            { ... default pointer handling ...                         };
    %typemap(in) SWIGTYPE *const       { ... default pointer const handling ...                   };
    %typemap(in) SWIGTYPE *const&      { ... default pointer const reference handling ...         };
    %typemap(in) SWIGTYPE[ANY]         { ... 1D fixed size arrays handlling ...                   };
    %typemap(in) SWIGTYPE []           { ... unknown sized array handling ...                     };
    %typemap(in) enum SWIGTYPE         { ... default handling for enum values ...                 };
    %typemap(in) const enum SWIGTYPE & { ... default handling for const enum reference values ... };
    %typemap(in) SWIGTYPE (CLASS::*)   { ... default pointer member handling ...                  };
    %typemap(in) SWIGTYPE              { ... simple default handling ...                          };
    

    If you wanted to change SWIG's default handling for simple pointers, you would simply redefine the rule for SWIGTYPE *. Note, the simple default typemap rule is used to match against simple types that don't match any other rules:

    %typemap(in) SWIGTYPE              { ... simple default handling ...                          } 
    

    This typemap is important because it is the rule that gets triggered when call or return by value is used. For instance, if you have a declaration like this:

    double dot_product(Vector a, Vector b);
    

    The Vector type will usually just get matched against SWIGTYPE. The default implementation of SWIGTYPE is to convert the value into pointers (as described in this earlier section).

    By redefining SWIGTYPE it may be possible to implement other behavior. For example, if you cleared all typemaps for SWIGTYPE, SWIG simply won't wrap any unknown datatype (which might be useful for debugging). Alternatively, you might modify SWIGTYPE to marshal objects into strings instead of converting them to pointers.

    Let's consider an example where the following typemaps are defined and SWIG is looking for the best match for the enum shown below:

    %typemap(in) const Hello &          { ... }
    %typemap(in) const enum SWIGTYPE &  { ... }
    %typemap(in) enum SWIGTYPE &        { ... }
    %typemap(in) SWIGTYPE &             { ... }
    %typemap(in) SWIGTYPE               { ... }
    
    enum Hello {};
    const Hello &hi;
    

    The typemap at the top of the list will be chosen, not because it is defined first, but because it is the closest match for the type being wrapped. If any of the typemaps in the above list were not defined, then the next one on the list would have precedence.

    The best way to explore the default typemaps is to look at the ones already defined for a particular language module. Typemap definitions are usually found in the SWIG library in a file such as java.swg, csharp.swg etc. However, for many of the target languages the typemaps are hidden behind complicated macros, so the best way to view the default typemaps, or any typemaps for that matter, is to look at the preprocessed output by running swig -E on any interface file. Finally the best way to view the typemap matching rules in action is via the debugging typemap pattern matching options covered later on.

    Compatibility note: The default typemap matching rules were modified in SWIG-2.0.0 from a slightly simpler scheme to match the current C++ class template partial specialization matching rules.

    11.3.4 Multi-arguments typemaps

    When multi-argument typemaps are specified, they take precedence over any typemaps specified for a single type. For example:

    %typemap(in) (char *buffer, int len) {
      // typemap 1
    }
    
    %typemap(in) char *buffer {
      // typemap 2
    }
    
    void foo(char *buffer, int len, int count); // (char *buffer, int len)
    void bar(char *buffer, int blah);           // char *buffer
    

    Multi-argument typemaps are also more restrictive in the way that they are matched. Currently, the first argument follows the matching rules described in the previous section, but all subsequent arguments must match exactly.

    11.3.5 Matching rules compared to C++ templates

    For those intimately familiar with C++ templates, a comparison of the typemap matching rules and template type deduction is interesting. The two areas considered are firstly the default typemaps and their similarities to partial template specialization and secondly, non-default typemaps and their similarities to full template specialization.

    For default (SWIGTYPE) typemaps the rules are inspired by C++ class template partial specialization. For example, given partial specialization for T const& :

    template <typename T> struct X             { void a(); };
    template <typename T> struct X< T const& > { void b(); };
    

    The full (unspecialized) template is matched with most types, such as:

    X< int & >            x1;  x1.a();
    

    and the following all match the T const& partial specialization:

    X< int *const& >      x2;  x2.b();
    X< int const*const& > x3;  x3.b();
    X< int const& >       x4;  x4.b();
    

    Now, given just these two default typemaps, where T is analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) SWIGTYPE const& { ... }
    

    The generic default typemap SWIGTYPE is used with most types, such as

    int &
    

    and the following all match the SWIGTYPE const& typemap, just like the partial template matching:

    int *const&
    int const*const&
    int const&
    

    Note that the template and typemap matching rules are not identical for all default typemaps though, for example, with arrays.

    For non-default typemaps, one might expect SWIG to follow the fully specialized template rules. This is nearly the case, but not quite. Consider a very similar example to the earlier partially specialized template but this time there is a fully specialized template:

    template <typename T> struct Y       { void a(); };
    template <> struct Y< int const & >  { void b(); };
    

    Only the one type matches the specialized template exactly:

    Y< int & >             y1;  y1.a();
    Y< int *const& >       y2;  y2.a();
    Y< int const *const& > y3;  y3.a();
    Y< int const& >        y4;  y4.b(); // fully specialized match
    

    Given typemaps with the same types used for the template declared above, where T is again analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int const&      { ... }
    

    The comparison between non-default typemaps and fully specialized single parameter templates turns out to be the same, as just the one type will match the non-default typemap:

    int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int const&
    

    However, if a non-const type is used instead:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int &           { ... }
    

    then there is a clear difference to template matching as both the const and non-const types match the typemap:

    int &             // matches non-default typemap int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int &
    

    There are other subtle differences such as typedef handling, but at least it should be clear that the typemap matching rules are similar to those for specialized template handling.

    11.3.6 Debugging typemap pattern matching

    There are two useful debug command line options available for debugging typemaps, -debug-tmsearch and -debug-tmused.

    The -debug-tmsearch option is a verbose option for debugging typemap searches. This can be very useful for watching the pattern matching process in action and for debugging which typemaps are used. The option displays all the typemaps and types that are looked for until a successful pattern match is made. As the display includes searches for each and every type needed for wrapping, the amount of information displayed can be large. Normally you would manually search through the displayed information for the particular type that you are interested in.

    For example, consider some of the code used in the Typedef reductions section already covered:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    A sample of the debugging output is shown below for the "in" typemap:

    swig -perl -debug-tmsearch example.i
    ...
    example.h:3: Searching for a suitable 'in' typemap for: Row4 rows[10]
      Looking for: Row4 rows[10]
      Looking for: Row4 [10]
      Looking for: Row4 rows[ANY]
      Looking for: Row4 [ANY]
      Looking for: Integer rows[10][4]
      Looking for: Integer [10][4]
      Looking for: Integer rows[ANY][ANY]
      Looking for: Integer [ANY][ANY]
      Looking for: int rows[10][4]
      Looking for: int [10][4]
      Looking for: int rows[ANY][ANY]
      Looking for: int [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][ANY]
      Looking for: SWIGTYPE [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][]
      Looking for: SWIGTYPE [ANY][]
      Looking for: SWIGTYPE *rows[ANY]
      Looking for: SWIGTYPE *[ANY]
      Looking for: SWIGTYPE rows[ANY]
      Looking for: SWIGTYPE [ANY]
      Looking for: SWIGTYPE rows[]
      Looking for: SWIGTYPE []
      Using: %typemap(in) SWIGTYPE []
    ...
    

    showing that the best default match supplied by SWIG is the SWIGTYPE [] typemap. As the example shows, the successful match displays the used typemap source including typemap method, type and optional name in one of these simplified formats:

    • Using: %typemap(method) type name
    • Using: %typemap(method) type name = type2 name2
    • Using: %apply type2 name2 { type name }

    This information might meet your debugging needs, however, you might want to analyze further. If you next invoke SWIG with the -E option to display the preprocessed output, and search for the particular typemap used, you'll find the full typemap contents (example shown below for Python):

    %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) {
      res = SWIG_ConvertPtr($input, &argp, $descriptor, $disown |  0 );
      if (!SWIG_IsOK(res)) { 
        SWIG_exception_fail(SWIG_ArgError(res), "in method '" "$symname" "', argument "
                           "$argnum"" of type '" "$type""'"); 
      } 
      $1 = ($ltype)(argp);
    }
    

    The generated code for the foo wrapper will then contain the snippets of the typemap with the special variables expanded. The rest of this chapter will need reading though to fully understand all of this, however, the relevant parts of the generated code for the above typemap can be seen below:

    SWIGINTERN PyObject *_wrap_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    ...
      void *argp1 = 0 ;
      int res1 = 0 ;
    ...
      res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_a_4__int, 0 |  0 );
      if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "foo" "', argument "
                           "1"" of type '" "int [10][4]""'"); 
      } 
      arg1 = (int (*)[4])(argp1);
    ...
    }
    

    Searches for multi-argument typemaps are not mentioned unless a matching multi-argument typemap does actually exist. For example, the output for the code in the earlier multi-arguments section is as follows:

    ...
    example.h:39: Searching for a suitable 'in' typemap for: char *buffer
      Looking for: char *buffer
      Multi-argument typemap found...
      Using: %typemap(in) (char *buffer, int len)
    ...
    

    The second option for debugging is -debug-tmused and this displays the typemaps used. This option is a less verbose version of the -debug-tmsearch option as it only displays each successfully found typemap on a separate single line. The output displays the type, and name if present, the typemap method in brackets and then the actual typemap used in the same simplified format output by the -debug-tmsearch option. Below is the output for the example code at the start of this section on debugging.

    $ swig -perl -debug-tmused example.i
    example.h:3: Typemap for Row4 rows[10] (in) : %typemap(in) SWIGTYPE []
    example.h:3: Typemap for Row4 rows[10] (typecheck) : %typemap(typecheck) SWIGTYPE *
    example.h:3: Typemap for Row4 rows[10] (freearg) : %typemap(freearg) SWIGTYPE []
    example.h:3: Typemap for void foo (out) : %typemap(out) void
    

    Now, consider the following interface file:

    %module example
    
    %{
    void set_value(const char* val) {}
    %}
    
    %typemap(check) char *NON_NULL {
      if (!$1) {
        /* ... error handling ... */
      }
    }
    
    // use default pointer handling instead of strings
    %apply SWIGTYPE * { const char* val, const char* another_value }
    
    %typemap(check) const char* val = char* NON_NULL;
    
    %typemap(arginit, noblock=1) const char* val {
      $1 = "";
    }
    
    void set_value(const char* val);
    
    

    and the output debug:

    swig -perl5 -debug-tmused example.i
    example.i:21: Typemap for char const *val (arginit) : %typemap(arginit) char const *val
    example.i:21: Typemap for char const *val (in) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (typecheck) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (check) : %typemap(check) char const *val = char *NON_NULL
    example.i:21: Typemap for char const *val (freearg) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for void set_value (out) : %typemap(out) void
    

    The following observations about what is displayed can be noted (the same applies for -debug-tmsearch):

    • The relevant typemap is shown, but for typemap copying, the appropriate %typemap or %apply is displayed, for example, the "check" and "in" typemaps.
    • The typemap modifiers are not shown, eg the noblock=1 modifier in the "arginit" typemap.
    • The exact %apply statement might look different to what is in the actual code. For example, the const char* another_value is not shown as it is not relevant here. Also the types may be displayed slightly differently - char const * and not const char*.

    11.4 Code generation rules

    This section describes rules by which typemap code is inserted into the generated wrapper code.

    11.4.1 Scope

    When a typemap is defined like this:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    the typemap code is inserted into the wrapper function using a new block scope. In other words, the wrapper code will look like this:

    wrap_whatever() {
      ...
      // Typemap code
      {
        arg1 = PyInt_AsLong(obj1);
      }
      ...
    }
    

    Because the typemap code is enclosed in its own block, it is legal to declare temporary variables for use during typemap execution. For example:

    %typemap(in) short {
      long temp;          /* Temporary value */
      if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) {
        return TCL_ERROR;
      }
      $1 = (short) temp;
    }
    

    Of course, any variables that you declare inside a typemap are destroyed as soon as the typemap code has executed (they are not visible to other parts of the wrapper function or other typemaps that might use the same variable names).

    Occasionally, typemap code will be specified using a few alternative forms. For example:

    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{
    $1 = PyInt_AsLong($input);
    %}
    %typemap(in, noblock=1) int {
    $1 = PyInt_AsLong($input);
    }
    

    These three forms are mainly used for cosmetics--the specified code is not enclosed inside a block scope when it is emitted. This sometimes results in a less complicated looking wrapper function. Note that only the third of the three typemaps have the typemap code passed through the SWIG preprocessor.

    11.4.2 Declaring new local variables

    Sometimes it is useful to declare a new local variable that exists within the scope of the entire wrapper function. A good example of this might be an application in which you wanted to marshal strings. Suppose you had a C++ function like this

    int foo(std::string *s);
    

    and you wanted to pass a native string in the target language as an argument. For instance, in Perl, you wanted the function to work like this:

    $x = foo("Hello World");
    

    To do this, you can't just pass a raw Perl string as the std::string * argument. Instead, you have to create a temporary std::string object, copy the Perl string data into it, and then pass a pointer to the object. To do this, simply specify the typemap with an extra parameter like this:

    %typemap(in) std::string * (std::string temp) {
      unsigned int len;
      char        *s;
      s = SvPV($input, len);         /* Extract string data */
      temp.assign(s, len);           /* Assign to temp */
      $1 = &temp;                   /* Set argument to point to temp */
    }
    

    In this case, temp becomes a local variable in the scope of the entire wrapper function. For example:

    wrap_foo() {
      std::string temp;    <--- Declaration of temp goes here
      ...
    
      /* Typemap code */
      {
        ...
        temp.assign(s, len);
        ...
      }
      ...
    }
    

    When you set temp to a value, it persists for the duration of the wrapper function and gets cleaned up automatically on exit.

    It is perfectly safe to use more than one typemap involving local variables in the same declaration. For example, you could declare a function as :

    void foo(std::string *x, std::string *y, std::string *z);
    

    This is safely handled because SWIG actually renames all local variable references by appending an argument number suffix. Therefore, the generated code would actually look like this:

    wrap_foo() {
      int *arg1;    /* Actual arguments */
      int *arg2;
      int *arg3;
      std::string temp1;    /* Locals declared in the typemap */
      std::string temp2;
      std::string temp3;
      ...
      {
        char *s;
        unsigned int len;
        ...
        temp1.assign(s, len);
        arg1 = *temp1;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp2.assign(s, len);
        arg2 = &temp2;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp3.assign(s, len);
        arg3 = &temp3;
      }
      ...
    }
    

    There is an exception: if the variable name starts with the _global_ prefix, the argument number is not appended. Such variables can be used throughout the generated wrapper function. For example, the above typemap could be rewritten to use _global_temp instead of temp and the generated code would then contain a single _global_temp variable instead of temp1, temp2 and temp3:

    %typemap(in) std::string * (std::string _global_temp) {
     ... as above ...
    }
    

    Some typemaps do not recognize local variables (or they may simply not apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap).

    Note:

    When declaring a typemap for multiple types, each type must have its own local variable declaration.

    %typemap(in) const std::string *, std::string * (std::string temp) // NO!
    // only std::string * has a local variable
    // const std::string * does not (oops)
    ....
    
    %typemap(in) const std::string * (std::string temp), std::string * (std::string temp) // Correct
    ....
    

    11.4.3 Special variables

    Within all typemaps, the following special variables are expanded. This is by no means a complete list as some target languages have additional special variables which are documented in the language specific chapters.

    VariableMeaning
    $n A C local variable corresponding to type n in the typemap pattern.
    $argnum Argument number. Only available in typemaps related to argument conversion
    $n_name Argument name
    $n_type Real C datatype of type n.
    $n_ltype ltype of type n
    $n_mangle Mangled form of type n. For example _p_Foo
    $n_descriptor Type descriptor structure for type n. For example SWIGTYPE_p_Foo. This is primarily used when interacting with the run-time type checker (described later).
    $*n_type Real C datatype of type n with one pointer removed.
    $*n_ltype ltype of type n with one pointer removed.
    $*n_mangle Mangled form of type n with one pointer removed.
    $*n_descriptor Type descriptor structure for type n with one pointer removed.
    $&n_type Real C datatype of type n with one pointer added.
    $&n_ltype ltype of type n with one pointer added.
    $&n_mangle Mangled form of type n with one pointer added.
    $&n_descriptor Type descriptor structure for type n with one pointer added.
    $n_basetype Base typename with all pointers and qualifiers stripped.

    Within the table, $n refers to a specific type within the typemap specification. For example, if you write this

    %typemap(in) int *INPUT {
    
    }
    

    then $1 refers to int *INPUT. If you have a typemap like this,

    %typemap(in) (int argc, char *argv[]) {
      ...
    }
    

    then $1 refers to int argc and $2 refers to char *argv[].

    Substitutions related to types and names always fill in values from the actual code that was matched. This is useful when a typemap might match multiple C datatype. For example:

    %typemap(in)  int, short, long {
      $1 = ($1_ltype) PyInt_AsLong($input);
    }
    

    In this case, $1_ltype is replaced with the datatype that is actually matched.

    When typemap code is emitted, the C/C++ datatype of the special variables $1 and $2 is always an "ltype." An "ltype" is simply a type that can legally appear on the left-hand side of a C assignment operation. Here are a few examples of types and ltypes:

    type              ltype
    ------            ----------------
    int               int
    const int         int
    const int *       int *
    int [4]           int *
    int [4][5]        int (*)[5]
    

    In most cases a ltype is simply the C datatype with qualifiers stripped off. In addition, arrays are converted into pointers.

    Variables such as $&1_type and $*1_type are used to safely modify the type by removing or adding pointers. Although not needed in most typemaps, these substitutions are sometimes needed to properly work with typemaps that convert values between pointers and values.

    If necessary, type related substitutions can also be used when declaring locals. For example:

    %typemap(in) int * ($*1_type temp) {
      temp = PyInt_AsLong($input);
      $1 = &temp;
    }
    

    There is one word of caution about declaring local variables in this manner. If you declare a local variable using a type substitution such as $1_ltype temp, it won't work like you expect for arrays and certain kinds of pointers. For example, if you wrote this,

    %typemap(in) int [10][20] {
      $1_ltype temp;
    }
    

    then the declaration of temp will be expanded as

    int (*)[20] temp;
    

    This is illegal C syntax and won't compile. There is currently no straightforward way to work around this problem in SWIG due to the way that typemap code is expanded and processed. However, one possible workaround is to simply pick an alternative type such as void * and use casts to get the correct type when needed. For example:

    %typemap(in) int [10][20] {
      void *temp;
      ...
      (($1_ltype) temp)[i][j] = x;    /* set a value */
      ...
    }
    

    Another approach, which only works for arrays is to use the $1_basetype substitution. For example:

    %typemap(in) int [10][20] {
      $1_basetype temp[10][20];
      ...
      temp[i][j] = x;    /* set a value */
      ...
    }
    

    11.4.4 Special variable macros

    Special variable macros are like macro functions in that they take one or more input arguments which are used for the macro expansion. They look like macro/function calls but use the special variable $ prefix to the macro name. Note that unlike normal macros, the expansion is not done by the preprocessor, it is done during the SWIG parsing/compilation stages. The following special variable macros are available across all language modules.

    11.4.4.1 $descriptor(type)

    This macro expands into the type descriptor structure for any C/C++ type specified in type. It behaves like the $1_descriptor special variable described above except that the type to expand is taken from the macro argument rather than inferred from the typemap type. For example, $descriptor(std::vector<int> *) will expand into SWIGTYPE_p_std__vectorT_int_t. This macro is mostly used in the scripting target languages and is demonstrated later in the Run-time type checker usage section.

    11.4.4.2 $typemap(method, typepattern)

    This macro uses the pattern matching rules described earlier to lookup and then substitute the special variable macro with the code in the matched typemap. The typemap to search for is specified by the arguments, where method is the typemap method name and typepattern is a type pattern as per the %typemap specification in the Defining a typemap section.

    The special variables within the matched typemap are expanded into those for the matched typemap type, not the typemap within which the macro is called. In practice, there is little use for this macro in the scripting target languages. It is mostly used in the target languages that are statically typed as a way to obtain the target language type given the C/C++ type and more commonly only when the C++ type is a template parameter.

    The example below is for C# only and uses some typemap method names documented in the C# chapter, but it shows some of the possible syntax variations.

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo($typemap(cstype, unsigned long aa) var1,
               $typemap(cstype, unsigned long bb) var2,
               $typemap(cstype, (unsigned long bb)) var3,
               $typemap(cstype, unsigned long) var4)
      {
        // do something
      }
    %}
    

    The result is the following expansion

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo(uint var1,
               bool var2,
               bool var3,
               uint var4)
      {
        // do something
      }
    %}
    

    11.4.5 Special variables and typemap attributes

    As of SWIG-3.0.7 typemap attributes will also expand special variables and special variable macros.

    Example usage showing the expansion in the 'out' attribute (C# specific) as well as the main typemap body:

    %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype"
    

    is equivalent to the following as $*1_ltype expands to unsigned int:

    %typemap(ctype, out="unsigned int") unsigned int& "unsigned int"
    

    11.4.6 Special variables combined with special variable macros

    Special variables can also be used within special variable macros. The special variables are expanded before they are used in the special variable macros.

    Consider the following C# typemaps:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)"
    

    Special variables are expanded first and hence the above is equivalent to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)"
    

    which then expands to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="uint") unsigned int& "uint"
    

    11.5 Common typemap methods

    The set of typemaps recognized by a language module may vary. However, the following typemap methods are nearly universal:

    11.5.1 "in" typemap

    The "in" typemap is used to convert function arguments from the target language to C. For example:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    The following special variables are available:

    $input            - Input object holding value to be converted.
    $symname          - Name of function/method being wrapped
    

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. The numinputs attributes facilitates this. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    

    At this time, only zero or one arguments may be converted. When numinputs is set to 0, the argument is effectively ignored and cannot be supplied from the target language. The argument is still required when making the C/C++ call and the above typemap shows the value used is instead obtained from a locally declared variable called temp. Usually numinputs is not specified, whereupon the default value is 1, that is, there is a one to one mapping of the number of arguments when used from the target language to the C/C++ call. Multi-argument typemaps provide a similar concept where the number of arguments mapped from the target language to C/C++ can be changed for multiple adjacent C/C++ arguments.

    Compatibility note: Specifying numinputs=0 is the same as the old "ignore" typemap.

    11.5.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type. Set to 1 if the input argument is the correct type otherwise set to 0.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in the Typemaps and overloading section.

    11.5.3 "out" typemap

    The "out" typemap is used to convert function/method return values from C into the target language. For example:

    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $symname          - Name of function/method being wrapped
    

    The "out" typemap supports an optional attribute flag called "optimal". This is for code optimisation and is detailed in the Optimal code generation when returning by value section.

    11.5.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }
    

    11.5.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);
    

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    11.5.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }
    

    11.5.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout) int *out {
      // Append output value $1 to $result
      ...
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $input            - The original input object passed.
    $symname          - Name of function/method being wrapped
    

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    See the typemaps.i library file for examples.

    11.5.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input);
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }
    

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    11.5.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();
    

    See Object ownership and %newobject for further details.

    11.5.10 "ret" typemap

    The "ret" typemap is not used very often, but can be useful for anything associated with the return type, such as resource management, return value error checking, etc. Usually this can all be done in the "out" typemap, but sometimes it is handy to use the "out" typemap code untouched and add to the generated code using the code in the "ret" typemap. One such case is memory clean up. For example, a stringheap_t type is defined indicating that the returned memory must be deleted and a string_t type is defined indicating that the returned memory must not be deleted.

    %typemap(ret) stringheap_t %{
      free($1);
    %}
    
    typedef char * string_t;
    typedef char * stringheap_t;
    
    string_t MakeString1();
    stringheap_t MakeString2();
    

    The "ret" typemap above will only be used for MakeString2, but both functions will use the default "out" typemap for char * provided by SWIG. The code above would ensure the appropriate memory is freed in all target languages as the need to provide custom "out" typemaps (which involve target language specific code) is not necessary.

    This approach is an alternative to using the "newfree" typemap and %newobject as there is no need to list all the functions that require the memory cleanup, it is purely done on types.

    11.5.11 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }
    

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    11.5.12 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    11.5.13 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    11.5.14 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      PyErr_SetString(PyExc_RuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);
    

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      PyErr_SetString(PyExc_RuntimeError, _e);
      SWIG_fail;
    }
    ...
    

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    11.6 Some typemap examples

    This section contains a few examples. Consult language module documentation for more examples.

    11.6.1 Typemaps for arrays

    A common use of typemaps is to provide support for C arrays appearing both as arguments to functions and as structure members.

    For example, suppose you had a function like this:

    void set_vector(int type, float value[4]);
    

    If you wanted to handle float value[4] as a list of floats, you might write a typemap similar to this:

    
    %typemap(in) float value[4] (float temp[4]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != 4) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected 4 elements");
        SWIG_fail;
      }
      for (i = 0; i < 4; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the variable temp allocates a small array on the C stack. The typemap then populates this array and passes it to the underlying C function.

    When used from Python, the typemap allows the following type of function call:

    >>> set_vector(type, [ 1, 2.5, 5, 20 ])
    

    If you wanted to generalize the typemap to apply to arrays of all dimensions you might write this:

    %typemap(in) float value[ANY] (float temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the special variable $1_dim0 is expanded with the actual array dimensions. Multidimensional arrays can be matched in a similar manner. For example:

    %typemap(in) float matrix[ANY][ANY] (float temp[$1_dim0][$1_dim1]) {
      ... convert a 2d array ...
    }
    

    For large arrays, it may be impractical to allocate storage on the stack using a temporary variable as shown. To work with heap allocated data, the following technique can be used.

    %typemap(in) float value[ANY] {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      $1 = (float *) malloc($1_dim0*sizeof(float));
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          $1[i] = (float) PyFloat_AsDouble(o);
        } else {
          free($1);
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");
          SWIG_fail;
        }
      }
    }
    %typemap(freearg) float value[ANY] {
      if ($1) free($1);
    }
    

    In this case, an array is allocated using malloc. The freearg typemap is then used to release the argument after the function has been called.

    Another common use of array typemaps is to provide support for array structure members. Due to subtle differences between pointers and arrays in C, you can't just "assign" to a array structure member. Instead, you have to explicitly copy elements into the array. For example, suppose you had a structure like this:

    struct SomeObject {
      float  value[4];
      ...
    };
    

    When SWIG runs, it won't produce any code to set the vec member. You may even get a warning message like this:

    $ swig -python  example.i
    example.i:10: Warning 462: Unable to set variable of type float [4].
    

    These warning messages indicate that SWIG does not know how you want to set the vec field.

    To fix this, you can supply a special "memberin" typemap like this:

    %typemap(memberin) float [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
          $1[i] = $input[i];
      }
    }
    

    The memberin typemap is used to set a structure member from data that has already been converted from the target language to C. In this case, $input is the local variable in which converted input data is stored. This typemap then copies this data into the structure.

    When combined with the earlier typemaps for arrays, the combination of the "in" and "memberin" typemap allows the following usage:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    

    Related to structure member input, it may be desirable to return structure members as a new kind of object. For example, in this example, you will get very odd program behavior where the structure member can be set nicely, but reading the member simply returns a pointer:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    _1008fea8_p_float
    >>> 
    

    To fix this, you can write an "out" typemap. For example:

    %typemap(out) float [ANY] {
      int i;
      $result = PyList_New($1_dim0);
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PyFloat_FromDouble((double) $1[i]);
        PyList_SetItem($result, i, o);
      }
    }
    

    Now, you will find that member access is quite nice:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    [ 1, 2.5, 5, 10]
    

    Compatibility Note: SWIG1.1 used to provide a special "memberout" typemap. However, it was mostly useless and has since been eliminated. To return structure members, simply use the "out" typemap.

    11.6.2 Implementing constraints with typemaps

    One particularly interesting application of typemaps is the implementation of argument constraints. This can be done with the "check" typemap. When used, this allows you to provide code for checking the values of function arguments. For example:

    %module math
    
    %typemap(check) double posdouble {
      if ($1 < 0) {
        croak("Expecting a positive number");
      }
    }
    
    ...
    double sqrt(double posdouble);
    
    

    This provides a sanity check to your wrapper function. If a negative number is passed to this function, a Perl exception will be raised and your program terminated with an error message.

    This kind of checking can be particularly useful when working with pointers. For example:

    %typemap(check) Vector * {
      if ($1 == 0) {
        PyErr_SetString(PyExc_TypeError, "NULL Pointer not allowed");
        SWIG_fail;
      }
    }
    
    

    will prevent any function involving a Vector * from accepting a NULL pointer. As a result, SWIG can often prevent a potential segmentation faults or other run-time problems by raising an exception rather than blindly passing values to the underlying C/C++ program.

    11.7 Typemaps for multiple target languages

    The code within typemaps is usually language dependent, however, many target languages support the same typemaps. In order to distinguish typemaps across different languages, the preprocessor should be used. For example, the "in" typemap for Perl and Ruby could be written as:

    #if defined(SWIGPERL)
      %typemap(in) int "$1 = ($1_ltype) SvIV($input);"
    #elif defined(SWIGRUBY)
      %typemap(in) int "$1 = NUM2INT($input);"
    #else
      #warning no "in" typemap defined
    #endif
    

    The full set of language specific macros is defined in the Conditional Compilation section. The example above also shows a common approach of issuing a warning for an as yet unsupported language.

    Compatibility note: In SWIG-1.1 different languages could be distinguished with the language name being put within the %typemap directive, for example,
    %typemap(ruby, in) int "$1 = NUM2INT($input);".

    11.8 Optimal code generation when returning by value

    The "out" typemap is the main typemap for return types. This typemap supports an optional attribute flag called "optimal", which is for reducing temporary variables and the amount of generated code, thereby giving the compiler the opportunity to use return value optimization for generating faster executing code. It only really makes a difference when returning objects by value and has some limitations on usage, as explained later on.

    When a function returns an object by value, SWIG generates code that instantiates the default type on the stack then assigns the value returned by the function call to it. A copy of this object is then made on the heap and this is what is ultimately stored and used from the target language. This will be clearer considering an example. Consider running the following code through SWIG:

    %typemap(out) SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    
    %inline %{
    #include <iostream>
    using namespace std;
    
    struct XX {
      XX() { cout << "XX()" << endl; }
      XX(int i) { cout << "XX(" << i << ")" << endl; }
      XX(const XX &other) { cout << "XX(const XX &)" << endl; }
      XX & operator =(const XX &other) { cout << "operator=(const XX &)" << endl; return *this; }
      ~XX() { cout << "~XX()" << endl; }
      static XX create() { 
        return XX(0);
      }
    };
    %}
    

    The "out" typemap shown is the default typemap for C# when returning objects by value. When making a call to XX::create() from C#, the output is as follows:

    XX()
    XX(0)
    operator=(const XX &)
    ~XX()
    XX(const XX &)
    ~XX()
    ~XX()
    

    Note that three objects are being created as well as an assignment. Wouldn't it be great if the XX::create() method was the only time a constructor was called? As the method returns by value, this is asking a lot and the code that SWIG generates by default makes it impossible for the compiler to use return value optimisation (RVO). However, this is where the "optimal" attribute in the "out" typemap can help out. If the typemap code is kept the same and just the "optimal" attribute specified like this:

    %typemap(out, optimal="1") SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    

    then when the code is run again, the output is simply:

    XX(0)
    ~XX()
    

    How the "optimal" attribute works is best explained using the generated code. Without "optimal", the generated code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      XX result;
      result = XX::create();
      jresult = new XX((const XX &)result);
      return jresult;
    }
    
    

    With the "optimal" attribute, the code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      jresult = new XX((const XX &)XX::create());
      return jresult;
    }
    

    The major difference is the result temporary variable holding the value returned from XX::create() is no longer generated and instead the copy constructor call is made directly from the value returned by XX::create(). With modern compilers implementing RVO, the copy is not actually done, in fact the object is never created on the stack in XX::create() at all, it is simply created directly on the heap. In the first instance, the $1 special variable in the typemap is expanded into result. In the second instance, $1 is expanded into XX::create() and this is essentially what the "optimal" attribute is telling SWIG to do.

    The "optimal" attribute optimisation is not turned on by default as it has a number of restrictions. Firstly, some code cannot be condensed into a simple call for passing into the copy constructor. One common occurrence is when %exception is used. Consider adding the following %exception to the example:

    %exception XX::create() %{
    try {
      $action
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    %}
    

    SWIG can detect when the "optimal" attribute cannot be used and will ignore it and in this case will issue the following warning:

    example.i:28: Warning 474: Method XX::create() usage of the optimal attribute ignored
    example.i:14: Warning 474: in the out typemap as the following cannot be used to generate
    optimal code: 
    try {
      result = XX::create();
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    

    It should be clear that the above code cannot be used as the argument to the copy constructor call, that is, for the $1 substitution.

    Secondly, if the typemaps uses $1 more than once, then multiple calls to the wrapped function will be made. Obviously that is not very optimal. In fact SWIG attempts to detect this and will issue a warning something like:

    example.i:21: Warning 475: Multiple calls to XX::create() might be generated due to
    example.i:7: Warning 475: optimal attribute usage in the out typemap.
    

    However, it doesn't always get it right, for example when $1 is within some commented out code.

    11.9 Multi-argument typemaps

    So far, the typemaps presented have focused on the problem of dealing with single values. For example, converting a single input object to a single argument in a function call. However, certain conversion problems are difficult to handle in this manner. As an example, consider the example at the very beginning of this chapter:

    int foo(int argc, char *argv[]);
    

    Suppose that you wanted to wrap this function so that it accepted a single list of strings like this:

    >>> foo(["ale", "lager", "stout"])
    

    To do this, you not only need to map a list of strings to char *argv[], but the value of int argc is implicitly determined by the length of the list. Using only simple typemaps, this type of conversion is possible, but extremely painful. Multi-argument typemaps help in this situation.

    A multi-argument typemap is a conversion rule that specifies how to convert a single object in the target language to a set of consecutive function arguments in C/C++. For example, the following multi-argument maps perform the conversion described for the above example:

    %typemap(in) (int argc, char *argv[]) {
      int i;
      if (!PyList_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a list");
        SWIG_fail;
      }
      $1 = PyList_Size($input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      for (i = 0; i < $1; i++) {
        PyObject *s = PyList_GetItem($input, i);
        if (!PyString_Check(s)) {
          free($2);
          PyErr_SetString(PyExc_ValueError, "List items must be strings");
          SWIG_fail;
        }
        $2[i] = PyString_AsString(s);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char *argv[]) {
      if ($2) free($2);
    }
    
    /* Required for C++ method overloading */
    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char *argv[]) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    A multi-argument map is always specified by surrounding the arguments with parentheses as shown. For example:

    %typemap(in) (int argc, char *argv[]) { ... }
    

    Within the typemap code, the variables $1, $2, and so forth refer to each type in the map. All of the usual substitutions apply--just use the appropriate $1 or $2 prefix on the variable name (e.g., $2_type, $1_ltype, etc.)

    Multi-argument typemaps always have precedence over simple typemaps and SWIG always performs longest-match searching. Therefore, you will get the following behavior:

    %typemap(in) int argc                              { ... typemap 1 ... }
    %typemap(in) (int argc, char *argv[])              { ... typemap 2 ... }
    %typemap(in) (int argc, char *argv[], char *env[]) { ... typemap 3 ... }
    
    int foo(int argc, char *argv[]);                   // Uses typemap 2
    int bar(int argc, int x);                          // Uses typemap 1
    int spam(int argc, char *argv[], char *env[]);     // Uses typemap 3
    

    It should be stressed that multi-argument typemaps can appear anywhere in a function declaration and can appear more than once. For example, you could write this:

    %typemap(in) (int scount, char *swords[]) { ... }
    %typemap(in) (int wcount, char *words[]) { ... }
    
    void search_words(int scount, char *swords[], int wcount, char *words[], int maxcount);
    

    Other directives such as %apply and %clear also work with multi-argument maps. For example:

    %apply (int argc, char *argv[]) {
        (int scount, char *swords[]),
        (int wcount, char *words[])
    };
    ...
    %clear (int scount, char *swords[]), (int wcount, char *words[]);
    ...
    

    Don't forget to also provide a suitable typemap for overloaded functions, such as %typecheck shown for foo above. This is only required if the function is overloaded in C++.

    Although multi-argument typemaps may seem like an exotic, little used feature, there are several situations where they make sense. First, suppose you wanted to wrap functions similar to the low-level read() and write() system calls. For example:

    typedef unsigned int size_t;
    
    int read(int fd, void *rbuffer, size_t len);
    int write(int fd, void *wbuffer, size_t len);
    

    As is, the only way to use the functions would be to allocate memory and pass some kind of pointer as the second argument---a process that might require the use of a helper function. However, using multi-argument maps, the functions can be transformed into something more natural. For example, you might write typemaps like this:

    // typemap for an outgoing buffer
    %typemap(in) (void *wbuffer, size_t len) {
      if (!PyString_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a string");
        SWIG_fail;
      }
      $1 = (void *) PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    // typemap for an incoming buffer
    %typemap(in) (void *rbuffer, size_t len) {
      if (!PyInt_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting an integer");
        SWIG_fail;
      }
      $2 = PyInt_AsLong($input);
      if ($2 < 0) {
        PyErr_SetString(PyExc_ValueError, "Positive integer expected");
        SWIG_fail;
      }
      $1 = (void *) malloc($2);
    }
    
    // Return the buffer.  Discarding any previous return result
    %typemap(argout) (void *rbuffer, size_t len) {
      Py_XDECREF($result);   /* Blow away any previous result */
      if (result < 0) {      /* Check for I/O error */
        free($1);
        PyErr_SetFromErrno(PyExc_IOError);
        return NULL;
      }
      $result = PyString_FromStringAndSize($1, result);
      free($1);
    }
    

    (note: In the above example, $result and result are two different variables. result is the real C datatype that was returned by the function. $result is the scripting language object being returned to the interpreter.).

    Now, in a script, you can write code that simply passes buffers as strings like this:

    >>> f = example.open("Makefile")
    >>> example.read(f, 40)
    'TOP        = ../..\nSWIG       = $(TOP)/.'
    >>> example.read(f, 40)
    './swig\nSRCS       = example.c\nTARGET    '
    >>> example.close(f)
    0
    >>> g = example.open("foo", example.O_WRONLY | example.O_CREAT, 0644)
    >>> example.write(g, "Hello world\n")
    12
    >>> example.write(g, "This is a test\n")
    15
    >>> example.close(g)
    0
    >>>
    

    A number of multi-argument typemap problems also arise in libraries that perform matrix-calculations--especially if they are mapped onto low-level Fortran or C code. For example, you might have a function like this:

    int is_symmetric(double *mat, int rows, int columns);
    

    In this case, you might want to pass some kind of higher-level object as an matrix. To do this, you could write a multi-argument typemap like this:

    %typemap(in) (double *mat, int rows, int columns) {
      MatrixObject *a;
      a = GetMatrixFromObject($input);     /* Get matrix somehow */
    
      /* Get matrix properties */
      $1 = GetPointer(a);
      $2 = GetRows(a);
      $3 = GetColumns(a);
    }
    

    This kind of technique can be used to hook into scripting-language matrix packages such as Numeric Python. However, it should also be stressed that some care is in order. For example, when crossing languages you may need to worry about issues such as row-major vs. column-major ordering (and perform conversions if needed). Note that multi-argument typemaps cannot deal with non-consecutive C/C++ arguments; a workaround such as a helper function re-ordering the arguments to make them consecutive will need to be written.

    11.10 Typemap warnings

    Warnings can be added to typemaps so that SWIG generates a warning message whenever the typemap is used. See the information in the issuing warnings section.

    11.11 Typemap fragments

    The primary purpose of fragments is to reduce code bloat that repeated use of typemap code can lead to. Fragments are snippets of code that can be thought of as code dependencies of a typemap. If a fragment is used by more than one typemap, then the snippet of code within the fragment is only generated once. Code bloat is typically reduced by moving typemap code into a support function and then placing the support function into a fragment.

    For example, if you have a very long typemap

    %typemap(in) MyClass * {
      MyClass *value = 0;
    
      ... many lines of marshalling code  ...
    
      $result = value;
    }
    

    the same marshalling code is often repeated in several typemaps, such as "in", "varin", "directorout", etc. SWIG copies the code for each argument that requires the typemap code, easily leading to code bloat in the generated code. To eliminate this, define a fragment that includes the common marshalling code:

    %fragment("AsMyClass", "header") {
      MyClass *AsMyClass(PyObject *obj) {
        MyClass *value = 0;
    
        ... many lines of marshalling code  ...
    
        return value;
      }
    }
    
    %typemap(in, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    
    %typemap(varin, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    

    When the "in" or "varin" typemaps for MyClass are required, the contents of the fragment called "AsMyClass" is added to the "header" section within the generated code, and then the typemap code is emitted. Hence, the method AsMyClass will be generated into the wrapper code before any typemap code that calls it.

    To define a fragment you need a fragment name, a section name for generating the fragment code into, and the code itself. See Code insertion blocks for a full list of section names. Usually the section name used is "header". Different delimiters can be used:

    %fragment("my_name", "header") %{ ... %}
    %fragment("my_name", "header") { ... }
    %fragment("my_name", "header") " ... "
    

    and these follow the usual preprocessing rules mentioned in the Preprocessing delimiters section. The following are some rules and guidelines for using fragments:

    1. A fragment is added to the wrapping code only once. When using the MyClass * typemaps above and wrapping the method:

      void foo(MyClass *a, MyClass *b);
      

      the generated code will look something like:

      MyClass *AsMyClass(PyObject *obj) {
        ...
      }
      
      void _wrap_foo(...) {
        ....
        arg1 = AsMyClass(obj1);
        arg2 = AsMyClass(obj2);
        ...
        foo(arg1, arg2);
      }
      

      even as there is duplicated typemap code to process both a and b, the AsMyClass method will be defined only once.

    2. A fragment should only be defined once. If there is more than one definition, the first definition is the one used. All other definitions are silently ignored. For example, if you have

      %fragment("AsMyClass", "header") { ...definition 1... }
      ....
      %fragment("AsMyClass", "header") { ...definition 2... }
      

      only the first definition is used. In this way you can override the default fragments in a SWIG library by defining your fragment before the library %include. Note that this behavior is the opposite to typemaps, where the last typemap defined/applied prevails. Fragments follow the first-in-first-out convention since they are intended to be global, while typemaps are intended to be locally specialized.

    3. Fragment names cannot contain commas.

    4. A fragment can use one or more additional fragments, for example:

      %fragment("<limits.h>", "header") {
        %#include <limits.h>
      }
      
      
      %fragment("AsMyClass", "header", fragment="<limits.h>") {
        MyClass *AsMyClass(PyObject *obj) {
          MyClass *value = 0;
      
          ... some marshalling code  ...
      
          if  (ival < CHAR_MIN /*defined in <limits.h>*/) {
            ...
          } else {
            ...
          }
          ...
          return value;
        }
      }
      

      in this case, when the "AsMyClass" fragment is emitted, it also triggers the inclusion of the "<limits.h>" fragment.

    5. A fragment can have dependencies on a number of other fragments, for example:

      %fragment("bigfragment", "header", fragment="frag1", fragment="frag2", fragment="frag3") "";
      

      When the "bigfragment" is used, the three dependent fragments "frag1", "frag2" and "frag3" are also pulled in. Note that as "bigframent" is empty (the empty string - ""), it does not add any code itself, but merely triggers the inclusion of the other fragments.

    6. A typemap can also use more than one fragment, but since the syntax is different, you need to specify the dependent fragments in a comma separated list. Consider:

      %typemap(in, fragment="frag1, frag2, frag3") {...}
      

      which is equivalent to:

      %typemap(in, fragment="bigfragment") {...}
      

      when used with the "bigfragment" defined above.

    7. Finally, you can force the inclusion of a fragment at any point in the generated code as follows:

      %fragment("bigfragment");
      

      which is very useful inside a template class, for example.

    Most readers will probably want to skip the next two sub-sections on advanced fragment usage unless a desire to really get to grips with some powerful but tricky macro and fragment usage that is used in parts of the SWIG typemap library.

    11.11.1 Fragment type specialization

    Fragments can be type specialized. The syntax is as follows:

    %fragment("name", "header") { ...a type independent fragment... }
    %fragment("name"{type}, "header") { ...a type dependent fragment...  }
    

    where type is a C/C++ type. Like typemaps, fragments can also be used inside templates, for example:

    template <class T>
    struct A {
      %fragment("incode"{A<T>}, "header") {
        ... 'incode' specialized fragment ...
      }
    
      %typemap(in, fragment="incode"{A<T>}) {
        ... here we use the 'type specialized' fragment "incode"{A<T>} ...
      }
    };
    

    11.11.2 Fragments and automatic typemap specialization

    Since fragments can be type specialized, they can be elegantly used to specialize typemaps. For example, if you have something like:

    %fragment("incode"{float}, "header") {
      float in_method_float(PyObject *obj) {
        ...
      }
    }
    
    %fragment("incode"{long}, "header") {
      float in_method_long(PyObject *obj) {
        ...
      }
    }
    
    // %my_typemaps macro definition
    %define %my_typemaps(Type) 
    %typemap(in, fragment="incode"{Type}) Type {
      value = in_method_##Type(obj);
    }
    %enddef
    
    %my_typemaps(float);
    %my_typemaps(long);
    

    then the proper "incode"{float} or "incode"{long} fragment will be used, and the in_method_float and in_method_long methods will be called whenever the float or long types are used as input parameters.

    This feature is used a lot in the typemaps shipped in the SWIG library for some scripting languages. The interested (or very brave) reader can take a look at the fragments.swg file shipped with SWIG to see this in action.

    11.12 The run-time type checker

    Most scripting languages need type information at run-time. This type information can include how to construct types, how to garbage collect types, and the inheritance relationships between types. If the language interface does not provide its own type information storage, the generated SWIG code needs to provide it.

    Requirements for the type system:

    • Store inheritance and type equivalence information and be able to correctly re-create the type pointer.
    • Share type information between modules.
    • Modules can be loaded in any order, regardless of actual type dependency.
    • Avoid the use of dynamically allocated memory, and library/system calls in general.
    • Provide a reasonably fast implementation, minimizing the lookup time for all language modules.
    • Custom, language specific information can be attached to types.
    • Modules can be unloaded from the type system.

    11.12.1 Implementation

    The run-time type checker is used by many, but not all, of SWIG's supported target languages. The run-time type checker features are not required and are thus not used for statically typed languages such as Java and C#. The scripting and scheme based languages rely on it and it forms a critical part of SWIG's operation for these languages.

    When pointers, arrays, and objects are wrapped by SWIG, they are normally converted into typed pointer objects. For example, an instance of Foo * might be a string encoded like this:

    _108e688_p_Foo
    

    At a basic level, the type checker simply restores some type-safety to extension modules. However, the type checker is also responsible for making sure that wrapped C++ classes are handled correctly---especially when inheritance is used. This is especially important when an extension module makes use of multiple inheritance. For example:

    class Foo {
    public:
      int x;
    };
    
    class Bar {
    public:
      int y;
    };
    
    class FooBar : public Foo, public Bar {
    public:
      int z;
    };
    

    When the class FooBar is organized in memory, it contains the contents of the classes Foo and Bar as well as its own data members. For example:

    FooBar --> | -----------|  <-- Foo
               |   int x    |
               |------------|  <-- Bar
               |   int y    |
               |------------|
               |   int z    |
               |------------|
    

    Because of the way that base class data is stacked together, the casting of a Foobar * to either of the base classes may change the actual value of the pointer. This means that it is generally not safe to represent pointers using a simple integer or a bare void *---type tags are needed to implement correct handling of pointer values (and to make adjustments when needed).

    In the wrapper code generated for each language, pointers are handled through the use of special type descriptors and conversion functions. For example, if you look at the wrapper code for Python, you will see code similar to the following (simplified for brevity):

    if (!SWIG_IsOK(SWIG_ConvertPtr(obj0, (void **) &arg1, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method 'GrabVal', expecting type Foo");
    }
    

    In this code, SWIGTYPE_p_Foo is the type descriptor that describes Foo *. The type descriptor is actually a pointer to a structure that contains information about the type name to use in the target language, a list of equivalent typenames (via typedef or inheritance), and pointer value handling information (if applicable). The SWIG_ConvertPtr() function is simply a utility function that takes a pointer object in the target language and a type-descriptor object and uses this information to generate a C++ pointer. The SWIG_IsOK macro checks the return value for errors and SWIG_exception_fail can be called to raise an exception in the target language. However, the exact name and calling conventions of the conversion function depends on the target language (see language specific chapters for details).

    The actual type code is in swigrun.swg, and gets inserted near the top of the generated swig wrapper file. The phrase "a type X that can cast into a type Y" means that given a type X, it can be converted into a type Y. In other words, X is a derived class of Y or X is a typedef of Y. The structure to store type information looks like this:

    /* Structure to store information on one type */
    typedef struct swig_type_info {
      const char *name;             /* mangled name of this type */
      const char *str;              /* human readable name for this type */
      swig_dycast_func dcast;       /* dynamic cast function down a hierarchy */
      struct swig_cast_info *cast;  /* Linked list of types that can cast into this type */
      void *clientdata;             /* Language specific type data */
    } swig_type_info;
    
    /* Structure to store a type and conversion function used for casting */
    typedef struct swig_cast_info {
      swig_type_info *type;          /* pointer to type that is equivalent to this type */
      swig_converter_func converter; /* function to cast the void pointers */
      struct swig_cast_info *next;   /* pointer to next cast in linked list */
      struct swig_cast_info *prev;   /* pointer to the previous cast */
    } swig_cast_info;
    

    Each swig_type_info stores a linked list of types that it is equivalent to. Each entry in this doubly linked list stores a pointer back to another swig_type_info structure, along with a pointer to a conversion function. This conversion function is used to solve the above problem of the FooBar class, correctly returning a pointer to the type we want.

    The basic problem we need to solve is verifying and building arguments passed to functions. So going back to the SWIG_ConvertPtr() function example from above, we are expecting a Foo * and need to check if obj0 is in fact a Foo *. From before, SWIGTYPE_p_Foo is just a pointer to the swig_type_info structure describing Foo *. So we loop through the linked list of swig_cast_info structures attached to SWIGTYPE_p_Foo. If we see that the type of obj0 is in the linked list, we pass the object through the associated conversion function and then return a positive. If we reach the end of the linked list without a match, then obj0 can not be converted to a Foo * and an error is generated.

    Another issue needing to be addressed is sharing type information between multiple modules. More explicitly, we need to have ONE swig_type_info for each type. If two modules both use the type, the second module loaded must lookup and use the swig_type_info structure from the module already loaded. Because no dynamic memory is used and the circular dependencies of the casting information, loading the type information is somewhat tricky, and not explained here. A complete description is in the Lib/swiginit.swg file (and near the top of any generated file).

    Each module has one swig_module_info structure which looks like this:

    /* Structure used to store module information
     * Each module generates one structure like this, and the runtime collects
     * all of these structures and stores them in a circularly linked list.*/
    typedef struct swig_module_info {
      swig_type_info **types;         /* Array of pointers to swig_type_info structs in this module */
      int size;                       /* Number of types in this module */
      struct swig_module_info *next;  /* Pointer to next element in circularly linked list */
      swig_type_info **type_initial;  /* Array of initially generated type structures */
      swig_cast_info **cast_initial;  /* Array of initially generated casting structures */
      void *clientdata;               /* Language specific module data */
    } swig_module_info;
    

    Each module stores an array of pointers to swig_type_info structures and the number of types in this module. So when a second module is loaded, it finds the swig_module_info structure for the first module and searches the array of types. If any of its own types are in the first module and have already been loaded, it uses those swig_type_info structures rather than creating new ones. These swig_module_info structures are chained together in a circularly linked list.

    11.12.2 Usage

    This section covers how to use these functions from typemaps. To learn how to call these functions from external files (not the generated _wrap.c file), see the External access to the run-time system section.

    When pointers are converted in a typemap, the typemap code often looks similar to this:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    The most critical part is the typemap is the use of the $1_descriptor special variable. When placed in a typemap, this is expanded into the SWIGTYPE_* type descriptor object above. As a general rule, you should always use $1_descriptor instead of trying to hard-code the type descriptor name directly.

    There is another reason why you should always use the $1_descriptor variable. When this special variable is expanded, SWIG marks the corresponding type as "in use." When type-tables and type information is emitted in the wrapper file, descriptor information is only generated for those datatypes that were actually used in the interface. This greatly reduces the size of the type tables and improves efficiency.

    Occasionally, you might need to write a typemap that needs to convert pointers of other types. To handle this, the special variable macro $descriptor(type) covered earlier can be used to generate the SWIG type descriptor name for any C datatype. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        Bar *temp;
        if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &temp, $descriptor(Bar *), 0))) {
          SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo or Bar");
        }
        $1 = (Foo *)temp;
      }
    }
    

    The primary use of $descriptor(type) is when writing typemaps for container objects and other complex data structures. There are some restrictions on the argument---namely it must be a fully defined C datatype. It can not be any of the special typemap variables.

    In certain cases, SWIG may not generate type-descriptors like you expect. For example, if you are converting pointers in some non-standard way or working with an unusual combination of interface files and modules, you may find that SWIG omits information for a specific type descriptor. To fix this, you may need to use the %types directive. For example:

    %types(int *, short *, long *, float *, double *);
    

    When %types is used, SWIG generates type-descriptor information even if those datatypes never appear elsewhere in the interface file.

    Further details about the run-time type checking can be found in the documentation for individual language modules. Reading the source code may also help. The file Lib/swigrun.swg in the SWIG library contains all of the source of the generated code for type-checking. This code is also included in every generated wrapped file so you probably just look at the output of SWIG to get a better sense for how types are managed.

    11.13 Typemaps and overloading

    This section does not apply to the statically typed languages like Java and C#, where overloading of the types is handled much like C++ by generating overloaded methods in the target language. In many of the other target languages, SWIG still fully supports C++ overloaded methods and functions. For example, if you have a collection of functions like this:

    int foo(int x);
    int foo(double x);
    int foo(char *s, int y);
    

    You can access the functions in a normal way from the scripting interpreter:

    # Python
    foo(3)           # foo(int)
    foo(3.5)         # foo(double)
    foo("hello", 5)  # foo(char *, int)
    
    # Tcl
    foo 3            # foo(int)
    foo 3.5          # foo(double)
    foo hello 5      # foo(char *, int)
    

    To implement overloading, SWIG generates a separate wrapper function for each overloaded method. For example, the above functions would produce something roughly like this:

    // wrapper pseudocode
    _wrap_foo_0(argc, args[]) {       // foo(int)
      int arg1;
      int result;
      ...
      arg1 = FromInteger(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_1(argc, args[]) {       // foo(double)
      double arg1;
      int result;
      ...
      arg1 = FromDouble(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_2(argc, args[]) {       // foo(char *, int)
      char *arg1;
      int   arg2;
      int result;
      ...
      arg1 = FromString(args[0]);
      arg2 = FromInteger(args[1]);
      result = foo(arg1, arg2);
      return ToInteger(result);
    }
    
    

    Next, a dynamic dispatch function is generated:

    _wrap_foo(argc, args[]) {
      if (argc == 1) {
        if (IsInteger(args[0])) {
          return _wrap_foo_0(argc, args);
        }
        if (IsDouble(args[0])) {
          return _wrap_foo_1(argc, args);
        }
      }
      if (argc == 2) {
        if (IsString(args[0]) && IsInteger(args[1])) {
          return _wrap_foo_2(argc, args);
        }
      }
      error("No matching function!\n");
    }
    

    The purpose of the dynamic dispatch function is to select the appropriate C++ function based on argument types---a task that must be performed at runtime in most of SWIG's target languages.

    The generation of the dynamic dispatch function is a relatively tricky affair. Not only must input typemaps be taken into account (these typemaps can radically change the types of arguments accepted), but overloaded methods must also be sorted and checked in a very specific order to resolve potential ambiguity. A high-level overview of this ranking process is found in the "SWIG and C++" chapter. What isn't mentioned in that chapter is the mechanism by which it is implemented---as a collection of typemaps.

    To support dynamic dispatch, SWIG first defines a general purpose type hierarchy as follows:

    Symbolic Name                   Precedence Value
    ------------------------------  ------------------
    SWIG_TYPECHECK_POINTER           0  
    SWIG_TYPECHECK_VOIDPTR           10 
    SWIG_TYPECHECK_BOOL              15 
    SWIG_TYPECHECK_UINT8             20 
    SWIG_TYPECHECK_INT8              25 
    SWIG_TYPECHECK_UINT16            30 
    SWIG_TYPECHECK_INT16             35 
    SWIG_TYPECHECK_UINT32            40 
    SWIG_TYPECHECK_INT32             45 
    SWIG_TYPECHECK_UINT64            50 
    SWIG_TYPECHECK_INT64             55 
    SWIG_TYPECHECK_UINT128           60 
    SWIG_TYPECHECK_INT128            65 
    SWIG_TYPECHECK_INTEGER           70 
    SWIG_TYPECHECK_FLOAT             80 
    SWIG_TYPECHECK_DOUBLE            90 
    SWIG_TYPECHECK_COMPLEX           100 
    SWIG_TYPECHECK_UNICHAR           110 
    SWIG_TYPECHECK_UNISTRING         120 
    SWIG_TYPECHECK_CHAR              130 
    SWIG_TYPECHECK_STRING            140 
    SWIG_TYPECHECK_BOOL_ARRAY        1015 
    SWIG_TYPECHECK_INT8_ARRAY        1025 
    SWIG_TYPECHECK_INT16_ARRAY       1035 
    SWIG_TYPECHECK_INT32_ARRAY       1045 
    SWIG_TYPECHECK_INT64_ARRAY       1055 
    SWIG_TYPECHECK_INT128_ARRAY      1065 
    SWIG_TYPECHECK_FLOAT_ARRAY       1080 
    SWIG_TYPECHECK_DOUBLE_ARRAY      1090 
    SWIG_TYPECHECK_CHAR_ARRAY        1130 
    SWIG_TYPECHECK_STRING_ARRAY      1140 
    

    (These precedence levels are defined in swig.swg, a library file that's included by all target language modules.)

    In this table, the precedence-level determines the order in which types are going to be checked. Low values are always checked before higher values. For example, integers are checked before floats, single values are checked before arrays, and so forth.

    Using the above table as a guide, each target language defines a collection of "typecheck" typemaps. The following excerpt from the Python module illustrates this:

    /* Python type checking rules */
    /* Note:  %typecheck(X) is a macro for %typemap(typecheck, precedence=X) */
    
    %typecheck(SWIG_TYPECHECK_INTEGER)
      int, short, long,
      unsigned int, unsigned short, unsigned long,
      signed char, unsigned char,
      long long, unsigned long long,
      const int &, const short &, const long &,
      const unsigned int &, const unsigned short &, const unsigned long &,
      const long long &, const unsigned long long &,
      enum SWIGTYPE,
      bool, const bool &
    {
      $1 = (PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_DOUBLE)
      float, double,
      const float &, const double &
    {
      $1 = (PyFloat_Check($input) || PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_CHAR) char {
      $1 = (PyString_Check($input) && (PyString_Size($input) == 1)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_STRING) char * {
      $1 = PyString_Check($input) ? 1 : 0;
    }
    
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, noblock=1) SWIGTYPE * {
      void *vptr = 0;
      int res = SWIG_ConvertPtr($input, &vptr, $1_descriptor, 0);
      $1 = SWIG_IsOK(res) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_POINTER) PyObject * {
      $1 = ($input != 0);
    }
    

    It might take a bit of contemplation, but this code has merely organized all of the basic C++ types, provided some simple type-checking code, and assigned each type a precedence value.

    Finally, to generate the dynamic dispatch function, SWIG uses the following algorithm:

    • Overloaded methods are first sorted by the number of required arguments.
    • Methods with the same number of arguments are then sorted by precedence values of argument types.
    • Typecheck typemaps are then emitted to produce a dispatch function that checks arguments in the correct order.

    If you haven't written any typemaps of your own, it is unnecessary to worry about the typechecking rules. However, if you have written new input typemaps, you might have to supply a typechecking rule as well. An easy way to do this is to simply copy one of the existing typechecking rules. Here is an example,

    // Typemap for a C++ string
    %typemap(in) std::string {
      if (PyString_Check($input)) {
        $1 = std::string(PyString_AsString($input));
      } else {
        SWIG_exception(SWIG_TypeError, "string expected");
      }
    }
    // Copy the typecheck code for "char *".  
    %typemap(typecheck) std::string = char *;
    

    The bottom line: If you are writing new typemaps and you are using overloaded methods, you will probably have to write new typecheck code or copy and modify existing typecheck code.

    If you write a typecheck typemap and omit the precedence level, for example commenting it out as shown below:

    %typemap(typecheck /*, precedence=SWIG_TYPECHECK_INTEGER*/) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    then the type is given a precedence higher than any other known precedence level and a warning is issued:

    example.i:18: Warning 467: Overloaded method foo(int) not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'int').
    

    Notes:

    • Typecheck typemaps are not used for non-overloaded methods. Because of this, it is still always necessary to check types in any "in" typemaps.
    • The dynamic dispatch process is only meant to be a heuristic. There are many corner cases where SWIG simply can't disambiguate types to the same degree as C++. The only way to resolve this ambiguity is to use the %rename directive to rename one of the overloaded methods (effectively eliminating overloading).
    • Typechecking may be partial. For example, if working with arrays, the typecheck code might simply check the type of the first array element and use that to dispatch to the correct function. Subsequent "in" typemaps would then perform more extensive type-checking.
    • Make sure you read the section on overloading in the "SWIG and C++" chapter.

    11.14 More about %apply and %clear

    In order to implement certain kinds of program behavior, it is sometimes necessary to write sets of typemaps. For example, to support output arguments, one often writes a set of typemaps like this:

    %typemap(in, numinputs=0) int *OUTPUT (int temp) {
      $1 = &temp;
    }
    %typemap(argout) int *OUTPUT {
      // return value somehow
    }
    

    To make it easier to apply the typemap to different argument types and names, the %apply directive performs a copy of all typemaps from one type to another. For example, if you specify this,

    %apply int *OUTPUT { int *retvalue, int32 *output };
    

    then all of the int *OUTPUT typemaps are copied to int *retvalue and int32 *output.

    However, there is a subtle aspect of %apply that needs more description. Namely, %apply does not overwrite a typemap rule if it is already defined for the target datatype. This behavior allows you to do two things:

    • You can specialize parts of a complex typemap rule by first defining a few typemaps and then using %apply to incorporate the remaining pieces.
    • Sets of different typemaps can be applied to the same datatype using repeated %apply directives.

    For example:

    %typemap(in) int *INPUT (int temp) {
      temp = ... get value from $input ...;
      $1 = &temp;
    }
    
    %typemap(check) int *POSITIVE {
      if (*$1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected a positive number!\n");
        return NULL;
      }
    }
    
    ...
    %apply int *INPUT     { int *invalue };
    %apply int *POSITIVE  { int *invalue };
    

    Since %apply does not overwrite or replace any existing rules, the only way to reset behavior is to use the %clear directive. %clear removes all typemap rules defined for a specific datatype. For example:

    %clear int *invalue;
    

    11.15 Passing data between typemaps

    It is also important to note that the primary use of local variables is to create stack-allocated objects for temporary use inside a wrapper function (this is faster and less-prone to error than allocating data on the heap). In general, the variables are not intended to pass information between different types of typemaps. However, this can be done if you realize that local names have the argument number appended to them. For example, you could do this:

    %typemap(in) int *(int temp) {
      temp = (int) PyInt_AsLong($input);
      $1 = &temp;
    }
    
    %typemap(argout) int * {
      PyObject *o = PyInt_FromLong(temp$argnum);
      ...
    }
    

    In this case, the $argnum variable is expanded into the argument number. Therefore, the code will reference the appropriate local such as temp1 and temp2. It should be noted that there are plenty of opportunities to break the universe here and that accessing locals in this manner should probably be avoided. At the very least, you should make sure that the typemaps sharing information have exactly the same types and names.

    11.16 C++ "this" pointer

    All the rules discussed for typemaps apply to C++ as well as C. However in addition C++ passes an extra parameter into every non-static class method -- the this pointer. Occasionally it can be useful to apply a typemap to this pointer (for example to check and make sure this is non-null before deferencing). Actually, C also has an the equivalent of the this pointer which is used when accessing variables in a C struct.

    In order to customise the this pointer handling, target a variable named self in your typemaps. self is the name SWIG uses to refer to the extra parameter in wrapped functions.

    For example, if wrapping for Java generation:

    %typemap(check) SWIGTYPE *self %{
    if (!$1) {
      SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
        "invalid native object; delete() likely already called");
      return $null;
    }
    %}
    

    In the above case, the $1 variable is expanded into the argument name that SWIG is using as the this pointer. SWIG will then insert the check code before the actual C++ class method is called, and will raise an exception rather than crash the Java virtual machine. The generated code will look something like:

      if (!arg1) {
        SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
          "invalid native object; delete() likely already called");
        return ;
      }
      (arg1)->wrappedFunction(...);
    

    Note that if you have a parameter named self then it will also match the typemap. One work around is to create an interface file that wraps the method, but gives the argument a name other than self.

    11.17 Where to go for more information?

    The best place to find out more information about writing typemaps is to look in the SWIG library. Most language modules define all of their default behavior using typemaps. These are found in files such as python.swg, perl5.swg, tcl8.swg and so forth. The typemaps.i file in the library also contains numerous examples. You should look at these files to get a feel for how to define typemaps of your own. Some of the language modules support additional typemaps and further information is available in the individual chapters for each target language. There you may also find more hands-on practical examples.

    swig-3.0.12/Doc/Manual/Allegrocl.html0000664000175000017500000021102013042756671017151 0ustar williamwilliam SWIG and Allegro Common Lisp

    18 SWIG and Allegro Common Lisp

    This chapter describes SWIG's support of Allegro Common Lisp. Allegro CL is a full-featured implementation of the Common Lisp language standard that includes many vendor-specific enhancements and add-on modules for increased usability.

    One such module included in Allegro CL is the Foreign Functions Interface (FFI). This module, tailored primarily toward interfacing with C/C++ and, historically, Fortran, provides a means by which compiled foreign code can be loaded into a running lisp environment and executed. The interface supports the calling of foreign functions and methods, allows for executing lisp routines from foreign code (callbacks), and the passing of data between foreign and lisp code.

    The goal of this module is to make it possible to quickly generate the necessary foreign function definitions so one can make use of C/C++ foreign libraries directly from lisp without the tedium of having to code them by hand. When necessary, it will also generate further C/C++ code that will need to be linked with the intended library for proper interfacing from lisp. It has been designed with an eye toward flexibility. Some foreign function calls may release the heap, while other should not. Some foreign functions should automatically convert lisp strings into native strings, while others should not. These adjustments and many more are possible with the current module.

    It is significant to note that, while this is a vendor-specific module, we would like to acknowledge the current and ongoing work by developers in the open source lisp community that are working on similar interfaces to implementation-independent foreign function interfaces (UFFI or CFFI, for example). Such work can only benefit the lisp community, and we would not be unhappy to see some enterprising folk use this work to add to it.

    18.1 Basics

    18.1.1 Running SWIG

    If you're reading this, you must have some library you need to generate an interface for. In order for SWIG to do this work, however, it needs a bit of information about how it should go about creating your interface, and what you are interfacing to.

    SWIG expects a description of what in the foreign interface you wish to connect to. It must consisting of C/C++ declarations and special SWIG directives. SWIG can be furnished with a header file, but an interface can also be generated without library headers by supplying a simple text file--called the interface file, which is typically named with a .i extension--containing any foreign declarations of identifiers you wish to use. The most common approach is to use a an interface file with directives to parse the needed headers. A straight parse of library headers will result in usable code, but SWIG directives provides much freedom in how a user might tailor the generated code to their needs or style of coding.

    Note that SWIG does not require any function definitions; the declarations of those functions is all that is necessary. Be careful when tuning the interface as it is quite possible to generate code that will not load or compile.

    An example interface file is shown below. It makes use of two SWIG directives, one of which requests that the declarations in a header file be used to generate part of the interface, and also includes an additional declaration to be added.

    example.i
    %module example
    
    %include "header.h"
    
    int fact(int n);
    

    The contents of header.h are very simple:

    header.h
    int fact(char *statement);   // pass it a fact, and it will rate it.
    

    The contents of example.cl will look like this:

    example.cl
    (defpackage :example
      (:use :common-lisp :swig :ff :excl))
    
      ... helper routines for defining the interface ...
    
    (swig-in-package ())
    
    (swig-defun ("fact")
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defun ("fact")
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    The generated file contains calls to internal swig helper functions. In this case there are two calls to swig-defun. These calls will expand into code that will make the appropriate definitions using the Allegro FFI. Note also, that this code is erroneous. Function overloading is not supported in C, and this code will not compile even though SWIG did not complain.

    In order to generate a C interface to Allegro CL using this code run swig using the -allegrocl option, as below:

    % swig -allegrocl example.i
    

    When building an interface to C++ code, include the -c++ option:

    % swig -allegrocl -c++ example.i
    

    As a result of running one of the above commands, a file named example.cl will be generated containing the lisp side of the interface. As well, a file example_wrap.cxx is also generated, containing C/C++ wrapper code to facilitate access to C++ methods, enumeration values, and constant values. Wrapper functions are necessary in C++ due to the lack of a standard for mangling the names of symbols across all C++ compilers. These wrapper functions are exported from the shared library as appropriate, using the C name mangling convention. The lisp code that is generated will interface to your foreign library through these wrappers.

    It is possible to disable the creation of the .cxx file when generating a C interface by using the -nocwrap command-line argument. For interfaces that don't contain complex enum or constant expressions, contain nested struct/union declarations, or doesn't need to use many of the SWIG customization featuers, this will result in a more streamlined, direct interface to the intended module.

    The generated wrapper file is below. It contains very simple wrappers by default, that simply pass the arguments to the actual function.

    example_wrap.i
      ... lots of SWIG internals ...
    
    EXPORT int ACL___fact__SWIG_0 (char *larg1) {
      int lresult = (int)0 ;
      char *arg1 = (char *) 0 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    
    
    EXPORT int ACL___fact__SWIG_1 (int larg1) {
      int lresult = (int)0 ;
      int arg1 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    

    And again, the generated lisp code. Note that it differs from what is generated when parsing C code:

      ...
    
    (swig-in-package ())
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_0" :type :function :arity 1)
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_1" :type :function :arity 1)
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    In this case, the interface generates two swig-defmethod forms and a swig-dispatcher form. This provides a single functional interface for all overloaded routines. A more detailed description of this features is to be found in the section titled Function overloading/Parameter defaulting.

    In order to load a C++ interface, you will need to build a shared library from example_wrap.cxx. Be sure to link in the actual library you created the interface for, as well as any other dependent shared libraries. For example, if you intend to be able to call back into lisp, you will also need to link in the Allegro shared library. The library you create from the C++ wrapper will be what you then load into Allegro CL.

    18.1.2 Command Line Options

    There are three Allegro CL specific command-line option:

    swig -allegrocl [ options ] filename
    
       -identifier-converter [name] - Binds the variable swig:*swig-identifier-convert* 
                                      in the generated .cl file to name.
                                      This function is used to generate symbols
                                      for the lisp side of the interface.
    
       -cwrap - [default] Generate a .cxx file containing C wrapper function when
                wrapping C code. The interface generated is similar to what is
                done for C++ code.
       -nocwrap - Explicitly turn off generation of .cxx wrappers for C code. Reasonable
                  for modules with simple interfaces. Can not handle all legal enum
                  and constant constructs, or take advantage of SWIG customization features.
    
       -isolate - With this command-line argument, all lisp helper functions are defined
                  in a unique package named swig.<module-name> rather than
                  swig. This prevents conflicts when the module is
                  intended to be used with other swig generated interfaces that may,
                  for instance, make use of different identifier converters.
    

    See Section 17.5 Identifier converter functions for more details.

    18.1.3 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file

    • lisphead - inserts before type declarations
    • lisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    18.2 Wrapping Overview

    New users to SWIG are encouraged to read SWIG Basics, and SWIG and C++, for those interested in generating an interface to C++.

    18.2.1 Function Wrapping

    Writing lisp code that directly invokes functions at the foreign function interface level can be cumbersome. Data must often be translated between lisp and foreign types, data extracted from objects, foreign objects allocated and freed upon completion of the foreign call. Dealing with pointers can be unwieldy when it comes to keeping them distinct from other valid integer values.

    We make an attempt to ease some of these burdens by making the interface to foreign code much more lisp-like, rather than C like. How this is done is described in later chapters. The layers themselves, appear as follows:

            ______________
           |              |  (foreign side)
           | Foreign Code |  What we're generating an interface to.
           |______________|
                   |
                   |
            _______v______
           |              |  (foreign side)
           | Wrapper code |  extern "C" wrappers calling C++ 
           |______________|  functions and methods.
                   |
        .  . . - - + - - . .  .
            _______v______
           |              |  (lisp side)
           |  FFI Layer   |  Low level lisp interface. ff:def-foreign-call,
           |______________|  ff:def-foreign-variable
                   |
                   +----------------------------
            _______v______              _______v______
           |              |            |              | (lisp side)    
           |    Defuns    |            |  Defmethods  | wrapper for overloaded
           |______________|            |______________| functions or those with
            (lisp side)                        |        defaulted arguments
            Wrapper for non-overloaded         |
            functions and methods       _______v______
                                       |              | (lisp side)
                                       |    Defuns    | dispatch function
                                       |______________| to overloads based
                                                        on arity
      

    18.2.2 Foreign Wrappers

    These wrappers are as generated by SWIG default. The types of function parameters can be transformed in place using the CTYPE typemap. This is use for converting pass-by-value parameters to pass-by-reference where necessary. All wrapper parameters are then bound to local variables for possible transformation of values (see LIN typemap). Return values can be transformed via the OUT typemap.

    18.2.3 FFI Wrappers

    These are the generated ff:def-foreign-call forms. No typemaps are applicable to this layer, but the %ffargs directive is available for use in .i files, to specify which keyword arguments should be specified for a given function.

    ffargs.i:
    %module ffargs
    
    %ffargs(strings_convert="nil", call_direct="t") foo;
    %ffargs(strings_convert="nil", release_heap=":never", optimize_for_space="t") bar;
    
    int foo(float f1, float f2);
    int foo(float f1, char c2);
    
    void bar(void *lisp_fn);
    
    char *xxx();
      

    Generates:

    ffargs.cl:
    (swig-in-package ())
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_0" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_f2 cl:single-float :float ))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_f2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_1" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_c2 cl:character :char character))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_c2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("foo" :type :function :arities (2)))
    (swig-defun ("bar" "ACL___bar__SWIG_0" :type :function)
      ((PARM0_lisp_fn  (* :void) ))
      (:returning (:void )
       :release-heap :never
       :optimize-for-space t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_lisp_fn))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("xxx" "ACL___xxx__SWIG_0" :type :function)
      (:void)
      (:returning ((* :char) )
       :strings-convert t)
      (swig-ff-call))
      
    %ffargs(strings_convert="t");

    Is the only default value specified in allegrocl.swg to force the muffling of warnings about automatic string conversion when defining ff:def-foreign-call's.

    18.2.4 Non-overloaded Defuns

    These are simple defuns. There is no typechecking of arguments. Parameters are bound to local variables for possible transformation of values, such as pulling values out of instance slots or allocating temporary stack allocated structures, via the lin typemap. These arguments are then passed to the foreign-call (where typechecking may occur). The return value from this function can be manipulated via the lout typemap.

    18.2.5 Overloaded Defuns

    In the case of overloaded functions, mulitple layers are generated. First, all the overloads for a given name are separated out into groups based on arity, and are wrapped in defmethods. Each method calls a distinct wrapper function, but are themselves distinguished by the types of their arguments (see lispclass typemap). These are further wrapped in a dispatching function (defun) which will invoke the appropriate generic-function based on arity. This provides a single functional interface to all overloads. The return value from this function can be manipulated via the lout typemap.

    18.2.6 What about constant and variable access?

    Along with the described functional layering, when creating a .cxx wrapper, this module will generate getter and--if not immutable--setter, functions for variables and constants. If the -nocwrap option is used, defconstant and ff:def-foreign-variable forms will be generated for accessing constants and global variables. These, along with the defuns listed above are the intended API for calling into the foreign module.

    18.2.7 Object Wrapping

    All non-primitive types (Classes, structs, unions, and typedefs involving same) have a corresponding foreign-type defined on the lisp side via ff:def-foreign-type.

    All non-primitive types are further represented by a CLOS class, created via defclass. An attempt is made to create the same class hierarchy, with all classes inheriting directly or indirectly from ff:foreign-pointer. Further, wherever it is apparent, all pointers returned from foreign code are wrapped in a CLOS instance of the appropriate class. For ff:def-foreign-calls that have been defined to expect a :foreign-address type as argument, these CLOS instances can legally be passed and the pointer to the C++ object automatically extracted. This is a natural feature of Allegro's foreign function interface.

    18.3 Wrapping Details

    In this section is described how particular C/C++ constructs are translated into lisp.

    18.3.1 Namespaces

    C++ namespaces are translated into Lisp packages by SWIG. The Global namespace is mapped to a package named by the %module directive or the -module command-line argument. Further namespaces are generated by the swig-defpackage utility function and given names based on Allegro CLs nested namespace convention. For example:

    foo.i:
    %module foo
    
    %{
    #include "foo.h"
    %}
    
    %include "foo.h"
    
    namespace car {
      ...
      namespace tires {
        int do_something(int n);
      }
    }
        

    Generates the following code.

    foo.cl
    (defpackage :foo
      (:use :common-lisp :swig :ff :excl))
    
    ...
    
    (swig-defpackage ("car"))
    (swig-defpackage ("car" "tires"))
    
    ...
    
    (swig-in-package ("car" "tires"))
    (swig-defun ("do_something" "ACL_car_tires__do_something__SWIG_0" :type :function)
      ((PARM0_n  :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
        

    The above interface file would cause packages foo, foo.car, and foo.car.tires to be created. One would find the function wrapper for do_something defined in the foo.car.tires package(*).

    (*) Except for the package named by the module, all namespace names are passed to the identifier-converter-function as strings with a :type of :namespace. It is the job of this function to generate the desired symbol, accounting for case preferences, additional naming cues, etc.

    Note that packages created by swig-defpackage do not use the COMMON-LISP or EXCL package. This reduces possible conflicts when defining foreign types via the SWIG interface in all but the toplevel modules package. This may lead to confusion if, for example, the current package is foo.car.tires and you attempt to use a common-lisp function such as (car '(1 2 3).

    18.3.2 Constants

    Constants, as declared by the preprocessor #define macro or SWIG %constant directive, are included in SWIG's parse tree when it can be determined that they are, or could be reduced to, a literal value. Such values are translated into defconstant forms in the generated lisp wrapper when the -nocwrap command-line options is used. Else, wrapper functions are generated as in the case of variable access (see section below).

    Here are examples of simple preprocessor constants when using -nocwrap.

    #define A 1                    => (swig-defconstant "A" 1)  
    #define B 'c'                  => (swig-defconstant "B" #\c)
    #define C B                    => (swig-defconstant "C" #\c)
    #define D 1.0e2                => (swig-defconstant "D" 1.0d2)
    #define E 2222                 => (swig-defconstant "E" 2222)
    #define F (unsigned int)2222   => no code generated
    #define G 1.02e2f              => (swig-defconstant "G" 1.02f2)
    #define H foo                  => no code generated
          

    Note that where SWIG is unable to determine if a constant is a literal, no node is added to the SWIG parse tree, and so no values can be generated.

    For preprocessor constants containing expressions which can be reduced to literal values, nodes are created, but with no simplification of the constant value. A very very simple infix to prefix converter has been implemented that tries to do the right thing for simple cases, but does not for more complex expressions. If the literal parser determines that something is wrong, a warning will be generated and the literal expression will be included in the generated code, but commented out.

    #define I A + E                => (swig-defconstant "I" (+ 1 2222))
    #define J 1|2                  => (swig-defconstant "J" (logior 1 2))
    #define Y 1 + 2 * 3 + 4        => (swig-defconstant "Y" (* (+ 1 2) (+ 3 4)))
    #define Y1 (1 + 2) * (3 + 4)   => (swig-defconstant "Y1" (* (+ 1 2) (+ 3 4)))
    #define Y2 1 * 2 + 3 * 4       => (swig-defconstant "Y2" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Y3 (1 * 2) + (3 * 4)   => (swig-defconstant "Y3" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Z 1 + 2 - 3 + 4 * 5    => (swig-defconstant "Z" (* (+ 1 (- 2 3) 4) 5)) ;; WRONG
          

    Users are cautioned to get to know their constants before use, or not use the -nocwrap command-line option.

    18.3.3 Variables

    For C wrapping, a def-foreign-variable call is generated for access to global variables.

    When wrapping C++ code, both global and member variables, getter wrappers are generated for accessing their value, and if not immutable, setter wrappers as well. In the example below, note the lack of a setter wrapper for global_var, defined as const.

    vars.h
    namespace nnn {
      int const global_var = 2;
      float glob_float = 2.0;
    }
        

    Generated code:

    vars.cl
    (swig-in-package ("nnn"))
    (swig-defun ("global_var" "ACL_nnn__global_var_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:int )
       :strings-convert t)
      (swig-ff-call))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_set__SWIG_0" :type :setter)
      ((PARM0_glob_float  :float ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_glob_float))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:float )
       :strings-convert t)
      (swig-ff-call))
        

    Note also, that where applicable, setter wrappers are implemented as setf methods on the getter function, providing a lispy interface to the foreign code.

    user> (load "globalvar.dll")
    ; Foreign loading globalvar.dll.
    t
    user> (load "globalvar.cl")
    ; Loading c:\mikel\src\swig\test\globalvar.cl
    t
    user> 
    globalvar> (globalvar.nnn::global_var)
    2
    globalvar> (globalvar.nnn::glob_float)
    2.0
    globalvar> (setf (globalvar.nnn::glob_float) 3.0)
    3.0
    globalvar> (globalvar.nnn::glob_float)
    3.0
        

    18.3.4 Enumerations

    In C, an enumeration value is an integer value, while in C++ an enumeration value is implicitly convertible to an integer value, but can also be distinguished by its enum type. For each enum declaration a def-foreign-type is generated, assigning the enum a default type of :int. Users may adjust the foreign type of enums via SWIG typemaps.

    Enum values are a bit trickier as they can be initialized using any valid C/C++ expression. In C with the -nocwrap command-line option, we handle the typical cases (simple integer initialization) and generate a defconstant form for each enum value. This has the advantage of it not being necessary to probe into foreign space to retrieve enum values. When generating a .cxx wrapper file, a more general solution is employed. A wrapper variable is created in the module_wrap.cxx file, and a ff:def-foreign-variable call is generated to retrieve its value into lisp.

    For example, the following header file

    enum.h:
    enum COL { RED, GREEN, BLUE };
    enum FOO { FOO1 = 10, FOO2, FOO3 };
          

    In -nocwrap mode, generates

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defconstant "RED" 0)
    (swig-defconstant "GREEN" (+ #.(swig-insert-id "RED" () :type :constant) 1))
    (swig-defconstant "BLUE" (+ #.(swig-insert-id "GREEN" () :type :constant) 1))
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defconstant "FOO1" 10)
    (swig-defconstant "FOO2" (+ #.(swig-insert-id "FOO1" () :type :constant) 1))
    (swig-defconstant "FOO3" (+ #.(swig-insert-id "FOO2" () :type :constant) 1))
          

    And when generating a .cxx wrapper

    enum_wrap.cxx:
    EXPORT const int ACL_ENUM___RED__SWIG_0 = RED;
    EXPORT const int ACL_ENUM___GREEN__SWIG_0 = GREEN;
    EXPORT const int ACL_ENUM___BLUE__SWIG_0 = BLUE;
    EXPORT const int ACL_ENUM___FOO1__SWIG_0 = FOO1;
    EXPORT const int ACL_ENUM___FOO2__SWIG_0 = FOO2;
    EXPORT const int ACL_ENUM___FOO3__SWIG_0 = FOO3;
          

    and

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defvar "FOO1" "ACL_ENUM___FOO1__SWIG_0" :type :constant)
    (swig-defvar "FOO2" "ACL_ENUM___FOO2__SWIG_0" :type :constant)
    (swig-defvar "FOO3" "ACL_ENUM___FOO3__SWIG_0" :type :constant)
    
          

    18.3.5 Arrays

    One limitation in the Allegro CL foreign-types module, is that, without macrology, expressions may not be used to specify the dimensions of an array declaration. This is not a horrible drawback unless it is necessary to allocate foreign structures based on the array declaration using ff:allocate-fobject. When it can be determined that an array bound is a valid numeric value, SWIG will include this in the generated array declaration on the lisp side, otherwise the value will be included, but commented out.

    Below is a comprehensive example, showing a number of legal C/C++ array declarations and how they are translated into foreign-type specifications in the generated lisp code.

    array.h
    #define MAX_BUF_SIZE 1024
    
    namespace FOO {
      int global_var1[13];
      float global_var2[MAX_BUF_SIZE];
    
    }
    
    enum COLOR { RED = 10, GREEN = 20, BLUE, PURPLE = 50, CYAN };
    
    namespace BAR {
      char global_var3[MAX_BUF_SIZE + 1];
      float global_var4[MAX_BUF_SIZE][13];
      signed short global_var5[MAX_BUF_SIZE + MAX_BUF_SIZE];
    
      int enum_var5[GREEN];
      int enum_var6[CYAN];
    
      COLOR enum_var7[CYAN][MAX_BUF_SIZE];
    }
        

    Generates:

    array.cl
    (in-package #.*swig-module-name*)
    
    (swig-defpackage ("FOO"))
    (swig-defpackage ("BAR"))
    
    (swig-in-package ())
    (swig-def-foreign-type "COLOR" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    (swig-defvar "PURPLE" "ACL_ENUM___PURPLE__SWIG_0" :type :constant)
    (swig-defvar "CYAN" "ACL_ENUM___CYAN__SWIG_0" :type :constant)
    
    (swig-in-package ())
    
    (swig-defconstant "MAX_BUF_SIZE" 1024)
    (swig-in-package ("FOO"))
    
    (swig-defun ("global_var1" "ACL_FOO__global_var1_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* :int) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var2" "ACL_FOO__global_var2_set__SWIG_0" :type :setter)
      ((global_var2  (:array :float 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var2))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-in-package ())
    (swig-in-package ("BAR"))
    (swig-defun ("global_var3" "ACL_BAR__global_var3_set__SWIG_0" :type :setter)
      ((global_var3  (:array :char #|1024+1|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var3))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_set__SWIG_0" :type :setter)
      ((global_var4  (:array (:array :float 13) 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var4))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array :float 13)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var5" "ACL_BAR__global_var5_set__SWIG_0" :type :setter)
      ((global_var5  (:array :short #|1024+1024|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var5" "ACL_BAR__enum_var5_set__SWIG_0" :type :setter)
      ((enum_var5  (:array :int #|GREEN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var6" "ACL_BAR__enum_var6_set__SWIG_0" :type :setter)
      ((enum_var6  (:array :int #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var6))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_set__SWIG_0" :type :setter)
      ((enum_var7  (:array (:array #.(swig-insert-id "COLOR" ()) 1024) #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var7))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array #.(swig-insert-id "COLOR" ()) 1024)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
        

    18.3.6 Classes and Structs and Unions (oh my!)

    18.3.6.1 CLOS wrapping of

    Classes, unions, and structs are all treated the same way by the interface generator. For any of these objects, a def-foreign-type and a defclass form are generated. For every function that returns an object (or pointer/reference) of C/C++ type X, the wrapping defun (or defmethod) on the Lisp side will automatically wrap the pointer returned in an instance of the appropriate class. This makes it much easier to write and debug code than if pointers were passed around as a jumble of integer values.

    18.3.6.2 CLOS Inheritance

    The CLOS class schema generated by the interface mirrors the inheritance of the classes in foreign code, with the ff:foreign-pointer class at its root. ff:foreign-pointer is a thin wrapper for pointers that is made available by the foreign function interface. Its key benefit is that it may be passed as an argument to any ff:def-foreign-call that is expecting a pointer as the parameter.

    18.3.6.3 Member fields and functions

    All public fields will have accessor getter/setter functions generated for them, as appropriate. All public member functions will have wrapper functions generated.

    We currently ignore anything that isn't public (i.e. private or protected), because the C++ compiler won't allow the wrapper functions to access such fields. Likewise, the interface does nothing for friend directives,

    18.3.6.4 Why not directly access C++ classes using foreign types?

    The def-foreign-type generated by the SWIG interface is currently incomplete. We can reliably generate the object layout of simple structs and unions; they can be allocated via ff:allocate-fobject, and their member variables accessed directly using the various ff:fslot-value-* functions. However, the layout of C++ classes is more complicated. Different compilers adjust class layout based on inheritance patterns, and the presence of virtual member functions. The size of member function pointers vary across compilers as well. As a result, it is recommended that users of any generated interface not attempt to access C++ instances via the foreign type system, but instead use the more robust wrapper functions.

    18.3.7 Templates

    18.3.7.1 Generating wrapper code for templates

    SWIG provides support for dealing with templates, but by default, it will not generate any member variable or function wrappers for templated classes. In order to create these wrappers, you need to explicitly tell SWIG to instantiate them. This is done via the %template directive.

    18.3.7.2 Implicit Template instantiation

    While no wrapper code is generated for accessing member variables, or calling member functions, type code is generated to include these templated classes in the foreign-type and CLOS class schema.

    18.3.8 Typedef, Templates, and Synonym Types

    In C/C++ it is possible, via typedef, to have many names refer to the same type. In general, this is not a problem, though it can lead to confusion. Assume the below C++ header file:

    synonyms.h
    class A { 
      int x;
      int y;
    };
    
    typedef A Foo;
    
    A *xxx(int i);         /* sets A->x = A->y = i */
    Foo *yyy(int i);       /* sets Foo->x = Foo->y = i */
    
    int zzz(A *inst = 0);  /* return inst->x + inst->y */
        

    The function zzz is an overloaded functions; the foreign function call to it will be wrapped in a generic-function whose argument will be checked against a type of A. Assuming a simple implementation, a call to xxx(1) will return a pointer to an A object, which will be wrapped in a CLOS instance of class A, and a call to yyy(1) will result in a CLOS instance of type Foo being returned. Without establishing a clear type relationship between Foo and A, an attempt to call zzz(yyy(1)) will result in an error.

    We resolve this issue, by noting synonym relationships between types while generating the interface. A Primary type is selected (more on this below) from the candidate list of synonyms. For all other synonyms, intead of generating a distinct CLOS class definition, we generate a form that expands to:

    (setf (find-class <synonym>) <primary>)

    The result is that all references to synonym types in foreign code, are wrapped in the same CLOS wrapper, and, in particular, method specialization in wrapping generic functions works as expected.

    Given the above header file, synonym.h, a Lisp session would appear as follows:

    CL-USER> (load "synonym.dll")
    ; Foreign loading synonym.dll.
    t
    CL-USER> (load "synonym.cl")
    ; Loading c:\mikel\src\swig\test\synonym.cl
    t
    CL-USER> 
    synonym> (setf a (xxx 3))
    #<A nil #x3261a0 @ #x207299da>
    synonym> (setf foo (yyy 10))
    #<A nil #x3291d0 @ #x2072e982>
    synonym> (zzz a)
    6
    synonym> (zzz foo)
    20
    synonym> 
        

    18.3.8.1 Choosing a primary type

    The choice of a primary type is selected by the following criteria from a set of synonym types.

    • If a synonym type has a class definition, it is the primary type.
    • If a synonym type is a class template and has been explicitly instantiated via %template, it is the primary type.
    • For all other sets of synonymous types, the synonym which is parsed first becomes the primary type.

    18.3.9 Function overloading/Parameter defaulting

    For each possible argument combination, a distinct wrapper function is created in the .cxx file. On the Lisp side, a generic functions is defined for each possible arity the overloaded/defaulted call may have. Each distinct wrapper is then called from within a defmethod on the appropriate generic function. These are further wrapped inside a dispatch function that checks the number of arguments it is called with and passes them via apply to the appropriate generic-function. This allows for a single entry point to overloaded functions on the lisp side.

    Example:

    overload.h:
    
    class A {
     public:
      int x;
      int y;
    };
    
    float xxx(int i, int x = 0);   /* return i * x */
    float xxx(A *inst, int x);     /* return x + A->x + A->y */
        

    Creates the following three wrappers, for each of the possible argument combinations

    overload_wrap.cxx
    EXPORT void ACL___delete_A__SWIG_0 (A *larg1) {
      A *arg1 = (A *) 0 ;
    
      arg1 = larg1;
      try {
        delete arg1;
    
      } catch (...) {
    
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_0 (int larg1, int larg2) {
      float lresult = (float)0 ;
      int arg1 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_1 (int larg1) {
      float lresult = (float)0 ;
      int arg1 ;
      float result;
    
      arg1 = larg1;
      try {
        result = (float)xxx(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_2 (A *larg1, int larg2) {
      float lresult = (float)0 ;
      A *arg1 = (A *) 0 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
        

    And the following foreign-function-call and method definitions on the lisp side:

    overload.cl
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_0" :type :function :arity 2)
      ((PARM0_i cl:integer :int )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_1" :type :function :arity 1)
      ((PARM0_i cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_2" :type :function :arity 2)
      ((PARM0_inst #.(swig-insert-id "A" () :type :class) (* #.(swig-insert-id "A" ())) )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_inst))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("xxx" :type :function :arities (1 2)))
        

    And their usage in a sample lisp session:

    overload> (setf a (new_A))
    #<A nil #x329268 @ #x206cf612>
    overload> (setf (A_x a) 10)
    10
    overload> (setf (A_y a) 20)
    20
    overload> (xxx 1)
    0.0
    overload> (xxx 3 10)
    30.0
    overload> (xxx a 1)
    31.0
    overload> (xxx a 2)
    32.0
    overload> 
        

    18.3.10 Operator wrapping and Operator overloading

    Wrappers to defined C++ Operators are automatically renamed, using %rename, to the following defaults:

    /* name conversion for overloaded operators. */
    #ifdef __cplusplus
    %rename(__add__)             *::operator+;
    %rename(__pos__)             *::operator+();
    %rename(__pos__)             *::operator+() const;
    
    %rename(__sub__)             *::operator-;
    %rename(__neg__)             *::operator-() const;
    %rename(__neg__)             *::operator-();
    
    %rename(__mul__)             *::operator*;
    %rename(__deref__)           *::operator*();
    %rename(__deref__)           *::operator*() const;
    
    %rename(__div__)             *::operator/;
    %rename(__mod__)             *::operator%;
    %rename(__logxor__)          *::operator^;
    %rename(__logand__)          *::operator&;
    %rename(__logior__)          *::operator|;
    %rename(__lognot__)          *::operator~();
    %rename(__lognot__)          *::operator~() const;
    
    %rename(__not__)             *::operator!();
    %rename(__not__)             *::operator!() const;
    
    %rename(__assign__)          *::operator=;
    
    %rename(__add_assign__)      *::operator+=;
    %rename(__sub_assign__)      *::operator-=;
    %rename(__mul_assign__)      *::operator*=;
    %rename(__div_assign__)      *::operator/=;
    %rename(__mod_assign__)      *::operator%=;
    %rename(__logxor_assign__)   *::operator^=;
    %rename(__logand_assign__)   *::operator&=;
    %rename(__logior_assign__)   *::operator|=;
    
    %rename(__lshift__)          *::operator<<;
    %rename(__lshift_assign__)   *::operator<<=;
    %rename(__rshift__)          *::operator>>;
    %rename(__rshift_assign__)   *::operator>>=;
    
    %rename(__eq__)              *::operator==;
    %rename(__ne__)              *::operator!=;
    %rename(__lt__)              *::operator<;
    %rename(__gt__)              *::operator>;
    %rename(__lte__)             *::operator<=;
    %rename(__gte__)             *::operator>=;
    
    %rename(__and__)             *::operator&&;
    %rename(__or__)              *::operator||;
    
    %rename(__preincr__)         *::operator++();
    %rename(__postincr__)        *::operator++(int);
    %rename(__predecr__)         *::operator--();
    %rename(__postdecr__)        *::operator--(int);
    
    %rename(__comma__)           *::operator,();
    %rename(__comma__)           *::operator,() const;
    
    %rename(__member_ref__)      *::operator->;
    %rename(__member_func_ref__) *::operator->*;
    
    %rename(__funcall__)         *::operator();
    %rename(__aref__)            *::operator[];
        

    Name mangling occurs on all such renamed identifiers, so that wrapper name generated by B::operator= will be B___eq__, i.e. <class-or-namespace>_ has been added. Users may modify these default names by adding %rename directives in their own .i files.

    Operator overloading can be achieved by adding functions based on the mangled names of the function. In the following example, a class B is defined with a Operator== method defined. The swig %extend directive is used to add an overload method on Operator==.

    opoverload.h
    class B {
     public:
      int x;
      int y;
      bool operator==(B const& other) const;
    };
        

    and

    opoverload.i
    %module opoverload
    
    %{
    #include <fstream>
    #include "opoverload.h"
    %}
    
    %{
    bool B___eq__(B const *inst, int const x)
    {
      // insert the function definition into the wrapper code before
      // the wrapper for it.
      // ... do stuff ...
    }
    %}
    
    %include "opoverload.h"
    
    %extend B {
     public:
      bool __eq__(int const x) const;
    };
        

    Either operator can be called via a single call to the dispatch function:

    opoverload> (B___eq__ x1 x2)
    nil
    opoverload> (B___eq__ x1 3)
    nil
    opoverload> 
        

    18.3.11 Varargs

    Variable length argument lists are not supported, by default. If such a function is encountered, a warning will generated to stderr. Varargs are supported via the SWIG %varargs directive. This directive allows you to specify a (finite) argument list which will be inserted into the wrapper in place of the variable length argument indicator. As an example, consider the function printf(). Its declaration would appear as follows:

    See the following section on Variable Length arguments provides examples on how %varargs can be used, along with other ways such functions can be wrapped.

    18.3.12 C++ Exceptions

    Each C++ wrapper includes a handler to catch any exceptions that may be thrown while in foreign code. This helps prevent simple C++ errors from killing the entire lisp process. There is currently no mechanism to have these exceptions forwarded to the lisp condition system, nor has any explicit support of the exception related SWIG typemaps been implemented.

    18.3.13 Pass by value, pass by reference

    Allegro CL does not support the passing of non-primitive foreign structures by value. As a result, SWIG must automatically detect and convert function parameters and return values to pointers whenever necessary. This is done via the use of typemaps, and should not require any fine tuning by the user, even for newly defined types.

    18.4 Typemaps

    SWIG Typemaps provide a powerful tool for automatically generating code to handle various menial tasks required of writing an interface to foreign code. The purpose of this section is to describe each of the typemaps used by the Allegro CL module. Please read the chapter on Typemaps for more information.

    18.4.1 Code Generation in the C++ Wrapper

    Every C++ wrapper generated by SWIG takes the following form:

    return-val wrapper-name(parm0, parm1, ..., parmN)
    {
      return-val lresult;   /* return value from wrapper */
      <local-declaration>
      ... results;          /* return value from function call */
    
      <binding locals to parameters>
    
      try {
        result = function-name(local0, local1, ..., localN);
    
        <convert and bind result to lresult>
    
        return lresult;
      catch (...) {
        return (int)0;
      }
        

    18.4.1.1 IN Typemap

    the in typemap is used to generate code to convert parameters passed to C++ wrapper functions into the arguments desired for the call being wrapped. That is, it fills in the code for the <binding locals to parameters> section above. We use this map to automatically convert parameters passed by reference to the wrapper function into by-value arguments for the wrapped call, and also to convert boolean values, which are passed as integers from lisp (by default), into the appropriate type for the language of code being wrapped.

    These are the default specifications for the IN typemap. Here, $input refers to the parameter code is being generated for, and $1 is the local variable to which it is being assigned. The default settings of this typemap are as follows:

    %typemap(in) bool                          "$1 = (bool)$input;";
    %typemap(in) char, unsigned char, signed char,
                 short, signed short, unsigned short,
                 int, signed int, unsigned int,
                 long, signed long, unsigned long,
                 float, double, long double, char *, void *, void,
                 enum SWIGTYPE, SWIGTYPE *,
                 SWIGTYPE[ANY], SWIGTYPE &     "$1 = $input;";
    %typemap(in) SWIGTYPE                      "$1 = *$input;";
        

    18.4.1.2 OUT Typemap

    The out typemap is used to generate code to form the return value of the wrapper from the return value of the wrapped function. This code is placed in the <convert and bind result to lresult> section of the above code diagram. Its default mapping is as follows:

    %typemap(out) bool                          "$result = (int)$1;";
    %typemap(out) char, unsigned char, signed char,
                  short, signed short, unsigned short,
                  int, signed int, unsigned int,
                  long, signed long, unsigned long,
                  float, double, long double, char *, void *, void,
                  enum SWIGTYPE, SWIGTYPE *,
                  SWIGTYPE[ANY], SWIGTYPE &    "$result = $1;";
    %typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
        

    18.4.1.3 CTYPE Typemap

    This typemap is not used for code generation, but purely for the transformation of types in the parameter list of the wrapper function. Its primary use is to handle by-value to by-reference conversion in the wrappers parameter list. Its default settings are:

    %typemap(ctype) bool                       "int";
    %typemap(ctype) char, unsigned char, signed char,
                    short, signed short, unsigned short,
                    int, signed int, unsigned int,
                    long, signed long, unsigned long,
                    float, double, long double, char *, void *, void,
                    enum SWIGTYPE, SWIGTYPE *,
                    SWIGTYPE[ANY], SWIGTYPE &  "$1_ltype";
    %typemap(ctype) SWIGTYPE                   "$&1_type";
        

    These three typemaps are specifically employed by the Allegro CL interface generator. SWIG also implements a number of other typemaps that can be used for generating code in the C/C++ wrappers. You can read about these common typemaps here.

    18.4.2 Code generation in Lisp wrappers

    A number of custom typemaps have also been added to facilitate the generation of code in the lisp side of the interface. These are described below. The basic code generation structure is applied as a series of nested expressions, one for each parameter, then one for manipulating the return value, and last, the foreign function call itself.

    Note that the typemaps below use fully qualified symbols where necessary. Users writing their own typemaps should do likewise. See the explanation in the last paragraph of 16.3.1 Namespaces for details.

    18.4.2.1 LIN Typemap

    The LIN typemap allows for the manipulating the lisp objects passed as arguments to the wrapping defun before passing them to the foreign function call. For example, when passing lisp strings to foreign code, it is often necessary to copy the string into a foreign structure of type (:char *) of appropriate size, and pass this copy to the foreign call. Using the LIN typemap, one could arrange for the stack-allocation of a foreign char array, copy your string into it, and not have to worry about freeing the copy after the function returns.

    The LIN typemap accepts the following $variable references.

    • $in - expands to the name of the parameter being applied to this typemap
    • $out - expands to the name of the local variable assigned to this typemap
    • $in_fftype - the foreign function type of the C type.
    • $*in_fftype - the foreign function type of the C type with one pointer removed. If there is no pointer, then $*in_fftype is the same as $in_fftype.
    • $body - very important. Instructs SWIG where subsequent code generation steps should be inserted into the current typemap. Leaving out a $body reference will result in lisp wrappers that do very little by way of calling into foreign code. Not recommended.
    %typemap(lin) SWIGTYPE "(cl:let (($out $in))\n  $body)";
        

    18.4.2.2 LOUT Typemap

    The LOUT typemap is the means by which we effect the wrapping of foreign pointers in CLOS instances. It is applied after all LIN typemaps, and immediately before the actual foreign-call.

    The LOUT typemap uses the following $variable

    • $lclass - Expands to the CLOS class that represents foreign-objects of the return type matching this typemap.
    • $body - Same as for the LIN map. Place this variable where you want the foreign-function call to occur.
    • $ldestructor - Expands to the symbol naming the destructor for this class ($lclass) of object. Allows you to insert finalization or automatic garbage collection into the wrapper code (see default mappings below).
    %typemap(lout) bool, char, unsigned char, signed char,
                   short, signed short, unsigned short,
                   int, signed int, unsigned int,
                   long, signed long, unsigned long,
                   float, double, long double, char *, void *, void,
                   enum SWIGTYPE    "$body";
    %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *,
                   SWIGTYPE &       "(cl:make-instance '$lclass :foreign-address $body)";
    %typemap(lout) SWIGTYPE    "(cl:let* ((address $body)\n
                                (ACL_result (cl:make-instance '$lclass :foreign-address address)))\n
                                (cl:unless (cl::zerop address)\n
                                (excl:schedule-finalization ACL_result #'$ldestructor))\n
                                 ACL_result)";
        

    18.4.2.3 FFITYPE Typemap

    The FFITYPE typemap works as a helper for a body of code that converts C/C++ type specifications into Allegro CL foreign-type specifications. These foreign-type specifications appear in ff:def-foreing-type declarations, and in the argument list and return values of ff:def-foreign-calls. You would modify this typemap if you want to change how the FFI passes through arguments of a given type. For example, if you know that a particular compiler represents booleans as a single byte, you might add an entry for:

    %typemap(ffitype) bool ":unsigned-char";
        

    Note that this typemap is pure type transformation, and is not used in any code generations step the way the LIN and LOUT typemaps are. The default mappings for this typemap are:

    %typemap(ffitype) bool ":int";
    %typemap(ffitype) char ":char";
    %typemap(ffitype) unsigned char ":unsigned-char";
    %typemap(ffitype) signed char ":char";
    %typemap(ffitype) short, signed short ":short";
    %typemap(ffitype) unsigned short ":unsigned-short";
    %typemap(ffitype) int, signed int ":int";
    %typemap(ffitype) unsigned int ":unsigned-int";
    %typemap(ffitype) long, signed long ":long";
    %typemap(ffitype) unsigned long ":unsigned-long";
    %typemap(ffitype) float ":float";
    %typemap(ffitype) double ":double";
    %typemap(ffitype) char * "(* :char)";
    %typemap(ffitype) void * "(* :void)";
    %typemap(ffitype) void ":void";
    %typemap(ffitype) enum SWIGTYPE ":int";
    %typemap(ffitype) SWIGTYPE & "(* :void)";
        

    18.4.2.4 LISPTYPE Typemap

    This is another type only transformation map, and is used to provide the lisp-type, which is the optional third argument in argument specifier in a ff:def-foreign-call form. Specifying a lisp-type allows the foreign call to perform type checking on the arguments passed in. The default entries in this typemap are:

    %typemap(lisptype) bool "cl:boolean";
    %typemap(lisptype) char "cl:character";
    %typemap(lisptype) unsigned char "cl:integer";
    %typemap(lisptype) signed char "cl:integer";
        

    18.4.2.5 LISPCLASS Typemap

    The LISPCLASS typemap is used to generate the method signatures for the generic-functions which wrap overloaded functions and functions with defaulted arguments. The default entries are:

    %typemap(lispclass) bool "t";
    %typemap(lispclass) char "cl:character";
    %typemap(lispclass) unsigned char, signed char,
                        short, signed short, unsigned short,
                        int, signed int, unsigned int,
                        long, signed long, unsigned long,
                        enum SWIGTYPE       "cl:integer";
    %typemap(lispclass) float "cl:single-float";
    %typemap(lispclass) double "cl:double-float";
    %typemap(lispclass) char * "cl:string";
        

    18.4.3 Modifying SWIG behavior using typemaps

    The following example shows how we made use of the above typemaps to add support for the wchar_t type.

    %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
    
    %typemap(in)        wchar_t "$1 = $input;";
    %typemap(lin)       wchar_t "(cl:let (($out (cl:char-code $in)))\n  $body)";
    %typemap(lin)       wchar_t* "(excl:with-native-string
                                             ($out $in
                                              :external-format #+little-endian :fat-le 
                                                               #-little-endian :fat)\n
                                     $body)"
    
    %typemap(out)       wchar_t "$result = $1;";
    %typemap(lout)      wchar_t "(cl:code-char $body)";
    %typemap(lout)      wchar_t* "(excl:native-to-string $body
                                              :external-format #+little-endian :fat-le
                                                               #-little-endian :fat)";
    
    %typemap(ffitype)   wchar_t ":unsigned-short";
    %typemap(lisptype)  wchar_t "";
    %typemap(ctype)     wchar_t "wchar_t";
    %typemap(lispclass) wchar_t "cl:character";
    %typemap(lispclass) wchar_t* "cl:string";
        

    18.5 Identifier Converter functions

    18.5.1 Creating symbols in the lisp environment

    Various symbols must be generated in the lisp environment to which class definitions, functions, constants, variables, etc. must be bound. Rather than force a particular convention for naming these symbols, an identifier (to symbol) conversion function is used. A user-defined identifier-converter can then implement any symbol naming, case-modifying, scheme desired.

    In generated SWIG code, whenever some interface object must be referenced by its lisp symbol, a macro is inserted that calls the identifier-converter function to generate the appropriate symbol reference. It is therefore expected that the identifier-converter function reliably return the same (eq) symbol given the same set of arguments.

    18.5.2 Existing identifier-converter functions

    Two basic identifier routines have been defined.

    18.5.2.1 identifier-convert-null

    No modification of the identifier string is performed. Based on other arguments, the identifier may be concatenated with other strings, from which a symbol will be created.

    18.5.2.2 identifier-convert-lispify

    All underscores in the identifier string are converted to hyphens. Otherwise, identifier-convert-lispify performs the same symbol transformations.

    18.5.2.3 Default identifier to symbol conversions

    Check the definitions of the above two default identifier-converters in Lib/allegrocl/allegrocl.swg for default naming conventions.

    18.5.3 Defining your own identifier-converter

    A user-defined identifier-converter function should conform to the following specification:

    (defun identifier-convert-fn (id &key type class arity) ...body...)
    result ==> symbol or (setf symbol)
    

    The ID argument is a string representing an identifier in the foreign environment.

    The :type keyword argument provides more information on the type of identifier. Its value is a symbol. This allows the identifier-converter to apply different heuristics when mapping different types of identifiers to symbols. SWIG will generate calls to your identifier-converter using the following types.

    • :class - names a CLOS class.
    • :constant - names a defconstant
    • :constructor - names a function for creating a foreign object
    • :destructor - names a function for freeing a foreign object
    • :function - names a CLOS wrapping defmethod or defun.
    • :ff-operator - names a foreign call defined via ff:def-foreign-call
    • :getter - getter function
    • :namespace - names a C++ namespace
    • :setter - names a setter function. May return a (setf symbol) reference
    • :operator - names a C++ operator, such as Operator=, Operator*.
    • :slot - names a slot in a struct/class/union declaration.
    • :type - names a foreign-type defined via ff:def-foreign-type.
    • :variable - names a variable defined via ff:def-foreign-variable.

    The :class keyword argument is a string naming a foreign class. When non-nil, it indicates that the current identifier has scope in the specified class.

    The :arity keyword argument only appears in swig:swig-defmethod forms generated for overloaded functions. Its value is an integer indicating the number of arguments passed to the routine indicated by this identifier.

    18.5.4 Instructing SWIG to use a particular identifier-converter

    By default, SWIG will use identifier-converter-null. To specify another convert function, use the -identifier-converter command-line argument. The value should be a string naming the function you wish the interface to use instead, when generating symbols. ex:

    % swig -allegrocl -c++ -module mymodule -identifier-converter my-identifier-converter
    
    swig-3.0.12/Doc/Manual/Mzscheme.html0000664000175000017500000001204113042756672017023 0ustar williamwilliam SWIG and MzScheme/Racket

    30 SWIG and MzScheme/Racket

    This section contains information on SWIG's support of Racket, formally known as MzScheme.

    30.1 Creating native structures

    Example interface file:

    /* define a macro for the struct creation */
    %define handle_ptr(TYPE, NAME)
    %typemap(argout) TYPE *NAME{
      Scheme_Object *o = SWIG_NewStructFromPtr($1, $*1_mangle);
      SWIG_APPEND_VALUE(o);
    }
    
    %typemap(in, numinputs=0) TYPE *NAME (TYPE temp) {
      $1 = &temp;
    }
    %enddef
    
    /* setup the typemaps for the pointer to an output parameter cntrs */
    handle_ptr(struct diag_cntrs, cntrs);
    

    Then in scheme, you can use regular struct access procedures like

            ; suppose a function created a struct foo as
            ; (define foo (make-diag-cntrs (#x1 #x2 #x3) (make-inspector))
            ; Then you can do
            (format "0x~x" (diag-cntrs-field1 foo))
            (format "0x~x" (diag-cntrs-field2 foo))
            ;etc...
    

    30.2 Simple example

    A few examples are available in the Examples/mzscheme directory. The code and log of a session using SWIG below should help getting started.

    C header file:

    // example.h
    int fact(int n);
    

    C source code:

    // File: example.c
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      }
      else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    

    SWIG interface file:

    /* File: example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    int fact(int n);
    

    The session below using the above files is on an OS X machine, but the points to be made are more general. On OS X, libtool is the tool which creates libraries, which are named .dylib, rather than .so on other unixes, or .dll on Windows.

    % swig -mzscheme -declaremodule example.i
    % gcc -c -m32 -o example.o example.c # force 32-bit object file (mzscheme is 32-bit only)
    % libtool -dynamic -o libexample.dylib example.o # make it into a library
    % ls # what've we got so far?
    example.c example.o
    example.h example_wrap.c
    example.i libexample.dylib*
    % mzc --cgc --cc example_wrap.c # compile the wrapping code
    % LDFLAGS="-L. -lexample" mzc --ld example_wrap.dylib example_wrap.o # ...and link it
    % mzscheme -e '(path->string (build-path "compiled" "native" (system-library-subpath)))'
    "compiled/native/i386-macosx/3m"
    % mkdir -p compiled/native/i386-macosx/3m # move the extension library to a magic place
    % mv example_wrap.dylib compiled/native/i386-macosx/3m/example_ss.dylib
    % mzscheme
    Welcome to MzScheme v4.2.4 [3m], Copyright (c) 2004-2010 PLT Scheme Inc.
    > (require "example.ss")
    > (fact 5)
    120
    > ^D
    % echo 'It works!'
    

    Some points of interest:

    • This is on a 64-bit machine, so we have to include the -m32 option when building the object file
    • If you want to declare a scheme module (and you probably do), it's important that you include the -declaremodule option to swig (if you miss this out, it'll appear to work, but fail later).
    • Use mzc to compile and then link the wrapped code. You'll probably need to adjust the link flags to refer to the library you're wrapping (you can either do this with an LDFLAGS declaration, as here, or with multiple ++ldf options to mzc).
    • Create the directory with path (build-path "compiled" "native" (system-library-subpath)) and move the freshly-generated .dylib to there, changing its name to module-name_ss.dylib. After that, you can REQUIRE the new module with (require "module-name.ss").
    • The above requests mzc to create an extension using the CGC garbage-collector. The alternative -- the 3m collector -- has generally better performance, but work is still required for SWIG to emit code which is compatible with it.

    30.3 External documentation

    See the C API for more description of using the mechanism for adding extensions. The main documentation is here.

    Tip: mzc's --vv option is very useful for debugging the inevitable library problems you'll encounter.

    swig-3.0.12/Doc/Manual/Chicken.html0000664000175000017500000006002313042756671016616 0ustar williamwilliam SWIG and Chicken

    21 SWIG and Chicken

    This chapter describes SWIG's support of CHICKEN. CHICKEN is a Scheme-to-C compiler supporting most of the language features as defined in the Revised^5 Report on Scheme. Its main attributes are that it

    1. generates portable C code
    2. includes a customizable interpreter
    3. links to C libraries with a simple Foreign Function Interface
    4. supports full tail-recursion and first-class continuations

    When confronted with a large C library, CHICKEN users can use SWIG to generate CHICKEN wrappers for the C library. However, the real advantages of using SWIG with CHICKEN are its support for C++ -- object-oriented code is difficult to wrap by hand in CHICKEN -- and its typed pointer representation, essential for C and C++ libraries involving structures or classes.

    21.1 Preliminaries

    CHICKEN support was introduced to SWIG in version 1.3.18. SWIG relies on some recent additions to CHICKEN, which are only present in releases of CHICKEN with version number greater than or equal to 1.89. To use a chicken version between 1.40 and 1.89, see the Garbage collection section below.

    You may want to look at any of the examples in Examples/chicken/ directory for the basic steps to run SWIG CHICKEN.

    21.1.1 Running SWIG in C mode

    To run SWIG CHICKEN in C mode, use the -chicken option.

    % swig -chicken example.i

    To allow the wrapper to take advantage of future CHICKEN code generation improvements, part of the wrapper is direct CHICKEN function calls (example_wrap.c) and part is CHICKEN Scheme (example.scm). The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c
    

    So for the C mode of SWIG CHICKEN, example_wrap.c and oexample.c are the files that must be compiled to object files and linked into your project.

    21.1.2 Running SWIG in C++ mode

    To run SWIG CHICKEN in C++ mode, use the -chicken -c++ option.

    % swig -chicken -c++ example.i

    This will generate example_wrap.cxx and example.scm. The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c

    So for the C++ mode of SWIG CHICKEN, example_wrap.cxx and oexample.c are the files that must be compiled to object files and linked into your project.

    21.2 Code Generation

    21.2.1 Naming Conventions

    Given a C variable, function or constant declaration named Foo_Bar, the declaration will be available in CHICKEN as an identifier ending with Foo-Bar. That is, an underscore is converted to a dash.

    You may control what the CHICKEN identifier will be by using the %rename SWIG directive in the SWIG interface file.

    21.2.2 Modules

    The name of the module must be declared one of two ways:

    • Placing %module example in the SWIG interface file.
    • Using -module example on the SWIG command line.

    The generated example.scm file then exports (declare (unit modulename)). If you do not want SWIG to export the (declare (unit modulename)), pass the -nounit option to SWIG.

    CHICKEN will be able to access the module using the (declare (uses modulename)) CHICKEN Scheme form.

    21.2.3 Constants and Variables

    Constants may be created using any of the four constructs in the interface file:

    1. #define MYCONSTANT1 ...
    2. %constant int MYCONSTANT2 = ...
    3. const int MYCONSTANT3 = ...
    4. enum { MYCONSTANT4 = ... };

    In all cases, the constants may be accessed from within CHICKEN using the form (MYCONSTANT1); that is, the constants may be accessed using the read-only parameter form.

    Variables are accessed using the full parameter form. For example, to set the C variable "int my_variable;", use the Scheme form (my-variable 2345). To get the C variable, use (my-variable).

    The %feature("constasvar") can be applied to any constant or immutable variable. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. This causes the generated .scm file to just contain the code (set! MYCONSTANT1 (MYCONSTANT1)). See Features and the %feature directive for info on how to apply the %feature.

    21.2.4 Functions

    C functions declared in the SWIG interface file will have corresponding CHICKEN Scheme procedures. For example, the C function "int sqrt(double x);" will be available using the Scheme form (sqrt 2345.0). A void return value will give C_SCHEME_UNDEFINED as a result.

    A function may return more than one value by using the OUTPUT specifier (see Lib/chicken/typemaps.i). They will be returned as multiple values using (values) if there is more than one result (that is, a non-void return value and at least one argout parameter, or a void return value and at least two argout parameters). The return values can then be accessed with (call-with-values).

    21.2.5 Exceptions

    The SWIG chicken module has support for exceptions thrown from C or C++ code to be caught in scheme. See Exception handling with %exception for more information about declaring exceptions in the interface file.

    Chicken supports both the SWIG_exception(int code, const char *msg) interface as well as a SWIG_ThrowException(C_word val) function for throwing exceptions from inside the %exception blocks. SWIG_exception will throw a list consisting of the code (as an integer) and the message. Both of these will throw an exception using (abort), which can be handled by (handle-exceptions). See the Chicken manual on Exceptions and SFRI-12. Since the exception values are thrown directly, if (condition-case) is used to catch an exception the exception will come through in the val () case.

    The following simple module

    %module exception_test
    
    %inline %{
      void test_throw(int i) throws (int) { 
        if (i == 1) throw 15; 
      }
    %}
    

    could be run with

    (handle-exceptions exvar 
      (if (= exvar 15)
        (print "Correct!") 
        (print "Threw something else " exvar))
      (test-throw 1))
    

    21.3 TinyCLOS

    The author of TinyCLOS, Gregor Kiczales, describes TinyCLOS as: "Tiny CLOS is a Scheme implementation of a 'kernelized' CLOS, with a metaobject protocol. The implementation is even simpler than the simple CLOS found in 'The Art of the Metaobject Protocol', weighing in at around 850 lines of code, including (some) comments and documentation."

    Almost all good Scheme books describe how to use metaobjects and generic procedures to implement an object-oriented Scheme system. Please consult a Scheme book if you are unfamiliar with the concept.

    CHICKEN has a modified version of TinyCLOS, which SWIG CHICKEN uses if the -proxy argument is given. If -proxy is passed, then the generated example.scm file will contain TinyCLOS class definitions. A class named Foo is declared as <Foo>, and each member variable is allocated a slot. Member functions are exported as generic functions.

    Primitive symbols and functions (the interface that would be presented if -proxy was not passed) are hidden and no longer accessible. If the -unhideprimitive command line argument is passed to SWIG, then the primitive symbols will be available, but each will be prefixed by the string "primitive:"

    The exported symbol names can be controlled with the -closprefix and -useclassprefix arguments. If -useclassprefix is passed to SWIG, every member function will be generated with the class name as a prefix. If the -closprefix mymod: argument is passed to SWIG, then the exported functions will be prefixed by the string "mymod:". If -useclassprefix is passed, -closprefix is ignored.

    21.4 Linkage

    Please refer to CHICKEN - A practical and portable Scheme system - User's manual for detailed help on how to link object files to create a CHICKEN Scheme program. Briefly, to link object files, be sure to add `chicken-config -extra-libs -libs` or `chicken-config -shared -extra-libs -libs`to your linker options. Use the -shared option if you want to create a dynamically loadable module. You might also want to use the much simpler csc or csc.bat.

    Each scheme file that is generated by SWIG contains (declare (uses modname)). This means that to load the module from scheme code, the code must include (declare (uses modname)).

    21.4.1 Static binary or shared library linked at compile time

    We can easily use csc to build a static binary.

    $ swig -chicken example.i
    $ csc -v example.scm example_impl.c example_wrap.c test_script.scm -o example
    $ ./example
    

    Similar to the above, any number of module.scm files could be compiled into a shared library, and then that shared library linked when compiling the main application.

    $ swig -chicken example.i
    $ csc -sv example.scm example_wrap.c example_impl.c -o example.so
    

    The example.so file can then linked with test_script.scm when it is compiled, in which case test_script.scm must have (declare (uses example)). Multiple SWIG modules could have been linked into example.so and each one accessed with a (declare (uses ... )).

    $ csc -v test_script.scm -lexample
    

    An alternative is that the test_script.scm can have the code (load-library 'example "example.so"), in which case the test script does not need to be linked with example.so. The test_script.scm file can then be run with csi.

    21.4.2 Building chicken extension libraries

    Building a shared library like in the above section only works if the library is linked at compile time with a script containing (declare (uses ...)) or is loaded explicitly with (load-library 'example "example.so"). It is not the format that CHICKEN expects for extension libraries and eggs. The problem is the (declare (unit modname)) inside the modname.scm file. There are two possible solutions to this.

    First, SWIG accepts a -nounit argument, in which case the (declare (unit modname)) is not generated. Then, the modname.scm and modname_wrap.c files must be compiled into their own shared library.

    $ csc -sv modname.scm modname_wrap.c modname_impl.c -o modname.so
    

    This library can then be loaded by scheme code with the (require 'modname) function. See the Loading-extension-libraries in the eval unit inside the CHICKEN manual for more information.

    Another alternative is to run SWIG normally and create a scheme file that contains (declare (uses modname)) and then compile that file into the shared library as well. For example, inside the mod_load.scm file,

    (declare (uses mod1))
    (declare (uses mod2))
    

    Which would then be compiled with

    $ swig -chicken mod1.i
    $ swig -chicken mod2.i
    $ csc -sv mod_load.scm mod1.scm mod2.scm mod1_wrap.c mod2_wrap.c mod1_impl.c mod2_impl.c -o mod.so
    

    Then the extension library can be loaded with (require 'mod). As we can see here, mod_load.scm contains the code that gets executed when the module is loaded. All this code does is load both mod1 and mod2. As we can see, this technique is more useful when you want to combine a few SWIG modules into one chicken extension library, especially if modules are related by %import

    In either method, the files that are compiled into the shared library could also be packaged into an egg. The mod1_wrap.c and mod2_wrap.c files that are created by SWIG are stand alone and do not need SWIG to be installed to be compiled. Thus the egg could be distributed and used by anyone, even if SWIG is not installed.

    See the Examples/chicken/egg directory in the SWIG source for an example that builds two eggs, one using the first method and one using the second method.

    21.4.3 Linking multiple SWIG modules with TinyCLOS

    Linking together multiple modules that share type information using the %import directive while also using -proxy is more complicated. For example, if mod2.i imports mod1.i, then the mod2.scm file contains references to symbols declared in mod1.scm, and thus a (declare (uses mod1)) or (require 'mod1) must be exported to the top of mod2.scm. By default, when SWIG encounters an %import "modname.i" directive, it exports (declare (uses modname)) into the scm file. This works fine unless mod1 was compiled with the -nounit argument or was compiled into an extension library with other modules under a different name.

    One option is to override the automatic generation of (declare (uses mod1)) by passing the -noclosuses option to SWIG when compiling mod2.i. SWIG then provides the %insert(closprefix) %{ %} directive. Any scheme code inside that directive is inserted into the generated .scm file, and if mod1 was compiled with -nounit, the directive should contain (require 'mod1). This option allows for mixed loading as well, where some modules are imported with (declare (uses modname)) (which means they were compiled without -nounit) and some are imported with (require 'modname).

    The other option is to use the second idea in the above section. Compile all the modules normally, without any %insert(closprefix), -nounit, or -noclosuses. Then the modules will import each other correctly with (declare (uses ...)). To create an extension library or an egg, just create a module_load.scm file that (declare (uses ...)) all the modules.

    21.5 Typemaps

    The Chicken module handles all types via typemaps. This information is read from Lib/chicken/typemaps.i and Lib/chicken/chicken.swg.

    21.6 Pointers

    For pointer types, SWIG uses CHICKEN tagged pointers. A tagged pointer is an ordinary CHICKEN pointer with an extra slot for a void *. With SWIG CHICKEN, this void * is a pointer to a type-info structure. So each pointer used as input or output from the SWIG-generated CHICKEN wrappers will have type information attached to it. This will let the wrappers correctly determine which method should be called according to the object type hierarchy exposed in the SWIG interface files.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(void *ptr, swig_type_info *type, int owner), The function that calls SWIG_NewPointerObj must have a variable declared C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); It is ok to call SWIG_NewPointerObj more than once, just make sure known_space has enough space for all the created pointers.

    To get the pointer represented by a CHICKEN tagged pointer, the wrapper code calls the function SWIG_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags), passing a pointer to a struct representing the expected pointer type. flags is either zero or SWIG_POINTER_DISOWN (see below).

    21.6.1 Garbage collection

    If the owner flag passed to SWIG_NewPointerObj is 1, NewPointerObj will add a finalizer to the type which will call the destructor or delete method of that type. The destructor and delete functions are no longer exported for use in scheme code, instead SWIG and chicken manage pointers. In situations where SWIG knows that a function is returning a type that should be garbage collected, SWIG will automatically set the owner flag to 1. For other functions, the %newobject directive must be specified for functions whose return values should be garbage collected. See Object ownership and %newobject for more information.

    In situations where a C or C++ function will assume ownership of a pointer, and thus chicken should no longer garbage collect it, SWIG provides the DISOWN input typemap. After applying this typemap (see the Typemaps chapter for more information on how to apply typemaps), any pointer that gets passed in will no longer be garbage collected. An object is disowned by passing the SWIG_POINTER_DISOWN flag to SWIG_ConvertPtr. Warning: Since the lifetime of the object is now controlled by the underlying code, the object might get deleted while the scheme code still holds a pointer to it. Further use of this pointer can lead to a crash.

    Adding a finalizer function from C code was added to chicken in the 1.89 release, so garbage collection does not work for chicken versions below 1.89. If you would like the SWIG generated code to work with chicken 1.40 to 1.89, pass the -nocollection argument to SWIG. This will not export code inside the _wrap.c file to register finalizers, and will then export destructor functions which must be called manually.

    21.7 Unsupported features and known problems

    • No director support.
    • No support for c++ standard types like std::vector.
    • The TinyCLOS wrappers for overloaded functions will not work correctly when using %feature(compactdefaultargs).

    21.7.1 TinyCLOS problems with Chicken version <= 1.92

    In Chicken versions equal to or below 1.92, TinyCLOS has a limitation such that generic methods do not properly work on methods with different number of specializers: TinyCLOS assumes that every method added to a generic function will have the same number of specializers. SWIG generates functions with different lengths of specializers when C/C++ functions are overloaded. For example, the code

    class Foo {};
    int foo(int a, Foo *b);
    int foo(int a);
    

    will produce scheme code

    (define-method (foo (arg0 <top>) (arg1 <Foo>)) (call primitive function))
    (define-method (foo (arg0 <top>)) (call primitive function))
    

    Using unpatched TinyCLOS, the second (define-method) will replace the first one, so calling (foo 3 f) will produce an error.

    There are three solutions to this. The easist is to upgrade to the latest Chicken version. Otherwise, the file Lib/chicken/tinyclos-multi-generic.patch in the SWIG source contains a patch against tinyclos.scm inside the 1.92 chicken source to add support into TinyCLOS for multi-argument generics. (This patch was accepted into Chicken) This requires chicken to be rebuilt and custom install of chicken. An alternative is the Lib/chicken/multi-generic.scm file in the SWIG source. This file can be loaded after TinyCLOS is loaded, and it will override some functions inside TinyCLOS to correctly support multi-argument generics. Please see the comments at the top of both files for more information.

    swig-3.0.12/Doc/Manual/ch2.1.png0000664000175000017500000000611213042756442015700 0ustar williamwilliam‰PNG  IHDRy•Š,zBPLTEÿÿÿÿÿÌÿÿ™ÿÿfÿÿ3ÿÿÿÌÿÿÌÌÿÌ™ÿÌfÿÌ3ÿÌÿ™ÿÿ™Ìÿ™™ÿ™fÿ™3ÿ™ÿfÿÿfÌÿf™ÿffÿf3ÿfÿ3ÿÿ3Ìÿ3™ÿ3fÿ33ÿ3ÿÿÿÌÿ™ÿfÿ3ÿÌÿÿÌÿÌÌÿ™ÌÿfÌÿ3ÌÿÌÌÿÌÌÌÌÌ™ÌÌfÌÌ3ÌÌÌ™ÿÌ™ÌÌ™™Ì™fÌ™3Ì™ÌfÿÌfÌÌf™ÌffÌf3ÌfÌ3ÿÌ3ÌÌ3™Ì3fÌ33Ì3ÌÿÌÌÌ™ÌfÌ3Ì™ÿÿ™ÿÌ™ÿ™™ÿf™ÿ3™ÿ™Ìÿ™Ì̙̙™Ìf™Ì3™Ì™™ÿ™™Ì™™™™™f™™3™™™fÿ™fÌ™f™™ff™f3™f™3ÿ™3Ì™3™™3f™33™3™ÿ™Ì™™™f™3™fÿÿfÿÌfÿ™fÿffÿ3fÿfÌÿfÌÌfÌ™fÌffÌ3fÌf™ÿf™Ìf™™f™ff™3f™ffÿffÌff™fffff3fff3ÿf3Ìf3™f3ff33f3fÿfÌf™fff3f3ÿÿ3ÿÌ3ÿ™3ÿf3ÿ33ÿ3Ìÿ3ÌÌ3Ì™3Ìf3Ì33Ì3™ÿ3™Ì3™™3™f3™33™3fÿ3fÌ3f™3ff3f33f33ÿ33Ì33™33f333333ÿ3Ì3™3f333ÿÿÿÌÿ™ÿfÿ3ÿÌÿÌÌÌ™ÌfÌ3Ì™ÿ™Ì™™™f™3™fÿfÌf™fff3f3ÿ3Ì3™3f333ÿÌ™f3îÝ»ªˆwUD"îÝ»ªˆwUD"îÝ»ªˆwUD"îîîÝÝÝ»»»ªªªˆˆˆwwwUUUDDD"""û‚™ IDATxÚb`ÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿ¢ú?l-C ÿÿ ù yÿÿ¢MÈ—¼KKÓÿÿuñ@ùÿÿuñ@ùÿÿuñ@ùÿÿœ.ÆbÂm­ÿÿhcoB  ý'd(š!´ yÿÿà+ýO±q´ #Ú†<ÿÿ ù yÿÿðÿZdüGŠŒÿ`iXyÂR¾ ˜Â€U!Ât œÎ¥mÈÿÿø‡…¢ó 8ëÿXøü‡q¡Lr¨ á¦"TÀÌÄí^Ú†<ÿÿð\ zh¨ÀÓ!ñÿ?Š2Æf#v…È:Ð%&äÿÿ å#’ï)yXÑ„;ä1 ËòÿÿèÒ†¼Ç^ÎÿÇÐð 3*– H9ÿÿm›ÿH¥6zÈ#'UÜåÎGTðÚ½äù?@!ÿÿ<5,ÒÈìx} oüG&ÐˈÿHU3.…(HVÚÿÿÄí`¼±ÖàTH„ ´ yÿÿš!ÿŸØÇ©ðÿ€‡<ÿÿÊ!OI™Jg ÿÿ¼!ÿåG¤%8amCÿÿï(ÿÿuñ@ùÿÿuñ@ùÿÿ¢‹GW}ÿÿ ù yÿÿEÿÿEÿÿEÿÿ5ÈÐô ÿÿb!χ †jÐÿÿ!?$ƒÿÿ!?ƒÿÿ ùÿÿ ùÿÿ¢U†TBÿÿ&É~†;ÿÿÉ~H&xÿÿEÎÐ wÿÿúÉ~¨†;ÿÿòÉ~È<ÿÿâé~‡;ÿÿÒÉ~H‡;ÿÿÊÉ~h<ÿÿºÉ~¨‡;ÿÿÊÉ~h‡;ÿÿúé~¨ºÿÿêÉ~è:ÿÿEÿÿEÿÿEÿÿ"²Ý6 ¨¾‰ÿÿ ù yÿÿÂò£ùžâb$ÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ!ÿ(†<ÿÿ¢cÈÿÇHÄÙ†]ÑWKÑÛËxÍÿÿ¢™3ÐWúüG¿Ç-Fˆ»ð?6 þc³¿f A­ ÿÿ¢UÈÿÇð ®›úˆ·Û•°°Kèþ :üÖ Àîÿÿ¢‘càׯÒ*ä‘-øfßlåÿ  yÿÿ¢cЊ™ÿh!tíüä«íÿ£ß\brq‚"îVl!b ŠAþƼúÿÿ¢yÈ£\SÌ€|ý<Ò¥ëws£\í™aHy„5ÿQ­ è0¦AÈÿÿ€G½Ž›óžn´ §I yxF[Í‹j Ž `K^ÿÿG\?$‡<þr×EáøCž&¥ ÿÿ¢q ‹+Í#©!+ä‘¥1›=T y R=^}ÿÿ¢m«ý:z”ì‹rÝ=©!d*—`ÈÿÇV–àKóä^}ÿÿ¢}O ™B½ÔQ #I )ÅÒ¶ÁbÁì=7,ÎA úÿ(u-^GP°ç¯Fÿÿòã6ƒÙ™xÝÿÿú!?TSÿÿc•C2äÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ ù yÿÿ§mÐòt\ÿÿ ù yÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿEÿÿUŸ˜Å"AIEND®B`‚swig-3.0.12/Doc/Manual/Ocaml.html0000664000175000017500000010216513042756672016312 0ustar williamwilliam SWIG and Ocaml

    31 SWIG and Ocaml

    This chapter describes SWIG's support of Ocaml.

    Ocaml is a relatively recent addition to the ML family, and is a recent addition to SWIG. It's the second compiled, typed language to be added. Ocaml has widely acknowledged benefits for engineers, mostly derived from a sophisticated type system, compile-time checking which eliminates several classes of common programming errors, and good native performance. While all of this is wonderful, there are well-written C and C++ libraries that Ocaml users will want to take advantage of as part of their arsenal (such as SSL and gdbm), as well as their own mature C and C++ code. SWIG allows this code to be used in a natural, type-safe way with Ocaml, by providing the necessary, but repetitive glue code which creates and uses Ocaml values to communicate with C and C++ code. In addition, SWIG also produces the needed Ocaml source that binds variants, functions, classes, etc.

    If you're not familiar with the Objective Caml language, you can visit The Ocaml Website.

    31.1 Preliminaries

    SWIG 3.0 works with Ocaml 3.08.3 and above. Given the choice, you should use the latest stable release. The SWIG Ocaml module has been tested on Linux (x86, PPC, Sparc) and Cygwin on Windows. The best way to determine whether your system will work is to compile the examples and test-suite which come with SWIG. You can do this by running make check from the SWIG root directory after installing SWIG. The Ocaml module has been tested using the system's dynamic linking (the usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's Dl package. The ocaml_dynamic and ocaml_dynamic_cpp targets in the file Examples/Makefile illustrate how to compile and link SWIG modules that will be loaded dynamically. This has only been tested on Linux so far.

    31.1.1 Running SWIG

    The basics of getting a SWIG Ocaml module up and running can be seen from one of SWIG's example Makefiles, but is also described here. To build an Ocaml module, run SWIG using the -ocaml option.

    %swig -ocaml example.i
    

    This will produce 3 files. The file example_wrap.c contains all of the C code needed to build an Ocaml module. To build the module, you will compile the file example_wrap.c with ocamlc or ocamlopt to create the needed .o file. You will need to compile the resulting .ml and .mli files as well, and do the final link with -custom (not needed for native link).

    31.1.2 Compiling the code

    The OCaml SWIG module now requires you to compile a module (Swig) separately. In addition to aggregating common SWIG functionality, the Swig module contains the data structure that represents C/C++ values. This allows easier data sharing between modules if two or more are combined, because the type of each SWIG'ed module's c_obj is derived from Swig.c_obj_t. This also allows SWIG to acquire new conversions painlessly, as well as giving the user more freedom with respect to custom typing. Use ocamlc or ocamlopt to compile your SWIG interface like:

    % swig -ocaml -co swig.mli ; swig -ocaml co swig.ml
    % ocamlc -c swig.mli ; ocamlc -c swig.ml
    % ocamlc -c -ccopt "-I/usr/include/foo" example_wrap.c
    % ocamlc -c example.mli
    % ocamlc -c example.ml
    

    ocamlc is aware of .c files and knows how to handle them. Unfortunately, it does not know about .cxx, .cc, or .cpp files, so when SWIG is invoked in C++ mode, you must:

    % cp example_wrap.cxx example_wrap.cxx.c
    % ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c
    % ...
    

    31.1.3 The camlp4 module

    The camlp4 module (swigp4.ml -> swigp4.cmo) contains a simple rewriter which makes C++ code blend more seamlessly with objective caml code. Its use is optional, but encouraged. The source file is included in the Lib/ocaml directory of the SWIG source distribution. You can checkout this file with "swig -ocaml -co swigp4.ml". You should compile the file with "ocamlc -I `camlp4 -where` -pp 'camlp4o pa_extend.cmo q_MLast.cmo' -c swigp4.ml"

    The basic principle of the module is to recognize certain non-caml expressions and convert them for use with C++ code as interfaced by SWIG. The camlp4 module is written to work with generated SWIG interfaces, and probably isn't great to use with anything else.

    Here are the main rewriting rules:

    InputRewritten to
    f'( ... ) as in
    atoi'("0") or
    _exit'(0)
    f(C_list [ ... ]) as in
    atoi (C_list [ C_string "0" ]) or
    _exit (C_list [ C_int 0 ])
    object -> method ( ... )(invoke object) "method" (C_list [ ... ])
    object 'binop argument as in
    a '+= b
    (invoke object) "+=" argument as in
    (invoke a) "+=" b
    Note that because camlp4 always recognizes << and >>, they are replaced by lsl and lsr in operator names.
    'unop object as in
    '! a
    (invoke a) "!" C_void
    Smart pointer access like this
    object '-> method ( args )
    (invoke (invoke object "->" C_void))
    Invoke syntax
    object . '( ... )
    (invoke object) "()" (C_list [ ... ])
    Array syntax
    object '[ 10 ]
    (invoke object) "[]" (C_int 10)
    Assignment syntax
    let a = '10 and b = '"foo" and c = '1.0 and d = 'true
    let a = C_int 10 and b = C_string "foo" and c = C_double 1.0 and d = C_bool true
    Cast syntax
    let a = _atoi '("2") as int
    let b = (getenv "PATH") to string
    This works for int, string, float, bool
    let a = get_int (_atoi (C_string "2"))
    let b = C_string (getenv "PATH")

    31.1.4 Using your module

    You can test-drive your module by building a toplevel ocaml interpreter. Consult the ocaml manual for details.

    When linking any ocaml bytecode with your module, use the -custom option to build your functions into the primitive list. This option is not needed when you build native code.

    31.1.5 Compilation problems and compiling with C++

    As mentioned above, .cxx files need special handling to be compiled with ocamlc. Other than that, C code that uses class as a non-keyword, and C code that is too liberal with pointer types may not compile under the C++ compiler. Most code meant to be compiled as C++ will not have problems.

    31.2 The low-level Ocaml/C interface

    In order to provide access to overloaded functions, and provide sensible outputs from them, all C entities are represented as members of the c_obj type:

    In the code as seen by the typemap writer, there is a value, swig_result, that always contains the current return data. It is a list, and must be appended with the caml_list_append function, or with functions and macros provided by objective caml.

    type c_obj =
        C_void
      | C_bool of bool
      | C_char of char
      | C_uchar of char
      | C_short of int
      | C_ushort of int
      | C_int of int
      | C_uint of int32
      | C_int32 of int32
      | C_int64 of int64
      | C_float of float
      | C_double of float
      | C_ptr of int64 * int64
      | C_array of c_obj array
      | C_list of c_obj list
      | C_obj of (string -> c_obj -> c_obj)
      | C_string of string
      | C_enum of c_enum_t
    

    A few functions exist which generate and return these:

    • caml_ptr_val receives a c_obj and returns a void *. This should be used for all pointer purposes.
    • caml_long_val receives a c_obj and returns a long. This should be used for most integral purposes.
    • caml_val_ptr receives a void * and returns a c_obj.
    • caml_val_bool receives a C int and returns a c_obj representing its bool value.
    • caml_val_(u)?(char|short|int|long|float|double) receives an appropriate C value and returns a c_obj representing it.
    • caml_val_string receives a char * and returns a string value.
    • caml_val_string_len receives a char * and a length and returns a string value.
    • caml_val_obj receives a void * and an object type and returns a C_obj, which contains a closure giving method access.

    Because of this style, a typemap can return any kind of value it wants from a function. This enables out typemaps and inout typemaps to work well. The one thing to remember about outputting values is that you must append them to the return list with swig_result = caml_list_append(swig_result, v).

    This function will return a new list that has your element appended. Upon return to caml space, the fnhelper function beautifies the result. A list containing a single item degrades to only that item (i.e. [ C_int 3 ] -> C_int 3), and a list containing more than one item is wrapped in C_list (i.e. [ C_char 'a' ; C_char 'b' -> C_list [ C_char 'a' ; C_char b ]). This is in order to make return values easier to handle when functions have only one return value, such as constructors, and operators. In addition, string, pointer, and object values are interchangeable with respect to caml_ptr_val, so you can allocate memory as caml strings and still use the resulting pointers for C purposes, even using them to construct simple objects on. Note, though, that foreign C++ code does not respect the garbage collector, although the SWIG interface does.

    The wild card type that you can use in lots of different ways is C_obj. It allows you to wrap any type of thing you like as an object using the same mechanism that the ocaml module does. When evaluated in caml_ptr_val, the returned value is the result of a call to the object's "&" operator, taken as a pointer.

    You should only construct values using objective caml, or using the functions caml_val_* functions provided as static functions to a SWIG ocaml module, as well as the caml_list_* functions. These functions provide everything a typemap needs to produce values. In addition, value items pass through directly, but you must make your own type signature for a function that uses value in this way.

    31.2.1 The generated module

    The SWIG %module directive specifies the name of the Ocaml module to be generated. If you specified `%module example', then your Ocaml code will be accessible in the module Example. The module name is always capitalized as is the ocaml convention. Note that you must not use any Ocaml keyword to name your module. Remember that the keywords are not the same as the C++ ones.

    You can introduce extra code into the output wherever you like with SWIG. These are the places you can introduce code:
    "header"This code is inserted near the beginning of the C wrapper file, before any function definitions.
    "wrapper"This code is inserted in the function definition section.
    "runtime"This code is inserted near the end of the C wrapper file.
    "mli"This code is inserted into the caml interface file. Special signatures should be inserted here.
    "ml"This code is inserted in the caml code defining the interface to your C code. Special caml code, as well as any initialization which should run when the module is loaded may be inserted here.
    "classtemplate"The "classtemplate" place is special because it describes the output SWIG will generate for class definitions.

    31.2.2 Enums

    SWIG will wrap enumerations as polymorphic variants in the output Ocaml code, as above in C_enum. In order to support all C++-style uses of enums, the function int_to_enum and enum_to_int are provided for ocaml code to produce and consume these values as integers. Other than that, correct uses of enums will not have a problem. Since enum labels may overlap between enums, the enum_to_int and int_to_enum functions take an enum type label as an argument. Example:

    %module enum_test
    %{
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    %}
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    

    The output mli contains:

    type c_enum_type = [
      `unknown
    | `c_enum_type
    ]
    type c_enum_tag = [
      `int of int
    | `a
    | `b
    | `c
    | `d
    ]
    val int_to_enum c_enum_type -> int -> c_obj
    val enum_to_int c_enum_type -> c_obj -> c_obj
    

    So it's possible to do this:

    bash-2.05a$ ocamlmktop -custom enum_test_wrap.o enum_test.cmo -o enum_test_top
    bash-2.05a$ ./enum_test_top
            Objective Caml version 3.04
    
    # open Enum_test ;;
    # let x = C_enum `a ;;
    val x : Enum_test.c_obj = C_enum `a
    # enum_to_int `c_enum_type x ;;
    - : Enum_test.c_obj = C_int 1
    # int_to_enum `c_enum_type 4 ;;
    - : Enum_test.c_obj = C_enum `c
    

    31.2.2.1 Enum typing in Ocaml

    The ocaml SWIG module now has support for loading and using multiple SWIG modules at the same time. This enhances modularity, but presents problems when used with a language which assumes that each module's types are complete at compile time. In order to achieve total soundness enum types are now isolated per-module. The type issue matters when values are shared between functions imported from different modules. You must convert values to master values using the swig_val function before sharing them with another module.

    31.2.3 Arrays

    31.2.3.1 Simple types of bounded arrays

    SWIG has support for array types, but you generally will need to provide a typemap to handle them. You can currently roll your own, or expand some of the macros provided (but not included by default) with the SWIG distribution.

    By including "carray.i", you will get access to some macros that help you create typemaps for array types fairly easily.

    %make_simple_array_typemap is the easiest way to get access to arrays of simple types with known bounds in your code, but this only works for arrays whose bounds are completely specified.

    31.2.3.2 Complex and unbounded arrays

    Unfortunately, unbounded arrays and pointers can't be handled in a completely general way by SWIG, because the end-condition of such an array can't be predicted. In some cases, it will be by consent (e.g. an array of four or more chars), sometimes by explicit length (char *buffer, int len), and sometimes by sentinel value (0, -1, etc.). SWIG can't predict which of these methods will be used in the array, so you have to specify it for yourself in the form of a typemap.

    31.2.3.3 Using an object

    It's possible to use C++ to your advantage by creating a simple object that provides access to your array. This may be more desirable in some cases, since the object can provide bounds checking, etc., that prevents crashes.

    Consider writing an object when the ending condition of your array is complex, such as using a required sentinel, etc.

    31.2.3.4 Example typemap for a function taking float * and int

    This is a simple example in typemap for an array of float, where the length of the array is specified as an extra parameter. Other such typemaps will work similarly. In the example, the function printfloats is called with a float array, and specified length. The actual length reported in the len argument is the length of the array passed from ocaml, making passing an array into this type of function convenient.

    tarray.i
    %module tarray
    %{
    #include <stdio.h>
    
    void printfloats( float *tab, int len ) {
      int i;
    
      for( i = 0; i < len; i++ ) {
        printf( "%f ", tab[i] );
      }
    
      printf( "\n" );
    }
    %}
    
    %typemap(in) (float *tab, int len) {
      int i;
      /* $*1_type */
      $2 = caml_array_len($input);
      $1 = ($*1_type *)malloc( $2 * sizeof( float ) );
      for( i = 0; i < $2; i++ ) {
        $1[i] = caml_double_val(caml_array_nth($input, i));
      }
    }
    
    void printfloats( float *tab, int len );
    
    Sample Run
    # open Tarray ;;
    # _printfloats (C_array [| C_double 1.0 ; C_double 3.0 ; C_double 5.6666 |]) ;;
    1.000000 3.000000 5.666600
    - : Tarray.c_obj = C_void
    

    31.2.4 C++ Classes

    C++ classes, along with structs and unions are represented by C_obj (string -> c_obj -> c_obj) wrapped closures. These objects contain a method list, and a type, which allow them to be used like C++ objects. When passed into typemaps that use pointers, they degrade to pointers through their "&" method. Every method an object has is represented as a string in the object's method table, and each method table exists in memory only once. In addition to any other operators an object might have, certain builtin ones are provided by SWIG: (all of these take no arguments (C_void))

    "~"Delete this object
    "&"Return an ordinary C_ptr value representing this object's address
    "sizeof"If enabled with ("sizeof"="1") on the module node, return the object's size in char.
    ":methods"Returns a list of strings containing the names of the methods this object contains
    ":classof"Returns the name of the class this object belongs to.
    ":parents"Returns a list of all direct parent classes which have been wrapped by SWIG.
    "::[parent-class]"Returns a view of the object as the indicated parent class. This is mainly used internally by the SWIG module, but may be useful to client programs.
    "[member-variable]"Each member variable is wrapped as a method with an optional parameter. Called with one argument, the member variable is set to the value of the argument. With zero arguments, the value is returned.

    Note that this string belongs to the wrapper object, and not the underlying pointer, so using create_[x]_from_ptr alters the returned value for the same object.

    31.2.4.1 STL vector and string Example

    Standard typemaps are now provided for STL vector and string. More are in the works. STL strings are passed just like normal strings, and returned as strings. STL string references don't mutate the original string, (which might be surprising), because Ocaml strings are mutable but have fixed length. Instead, use multiple returns, as in the argout_ref example.

    example.i
    %module example
    %{
    #include "example.h"
    %}
    
    %include <stl.i>
    
    namespace std {
      %template(StringVector) std::vector < string >;
    };
    
    %include "example.h"
    
    This example is in Examples/ocaml/stl

    Since there's a makefile in that directory, the example is easy to build.

    Here's a sample transcript of an interactive session using a string vector after making a toplevel (make toplevel). This example uses the camlp4 module.

    bash-2.05a$ ./example_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Example ;;
    # let x = new_StringVector '() ;;
    val x : Example.c_obj = C_obj <fun>
    # x -> ":methods" () ;;
    - : Example.c_obj =
    C_list
     [C_string "nop"; C_string "size"; C_string "empty"; C_string "clear";
      C_string "push_back"; C_string "[]"; C_string "="; C_string "set";
      C_string "~"; C_string "&"; C_string ":parents"; C_string ":classof";
      C_string ":methods"]
    # x -> push_back ("foo") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("bar") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("baz") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "bar"
    # x -> set (1, "spam") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "spam"
    # for i = 0 to (x -> size() as int) - 1 do
        print_endline ((x '[i to int]) as string)
      done ;;
    foo
    bar
    baz
    - : unit = ()
    #
    

    31.2.4.2 C++ Class Example

    Here's a simple example using Trolltech's Qt Library:

    qt.i
    %module qt
    %{
    #include <qapplication.h>
    #include <qpushbutton.h>
    %}
    class QApplication {
    public:
      QApplication( int argc, char **argv );
      void setMainWidget( QWidget *widget );
      void exec();
    };
    
    class QPushButton {
    public:
      QPushButton( char *str, QWidget *w );
      void resize( int x, int y );
      void show();
    };
    

    31.2.4.3 Compiling the example

    bash-2.05a$ QTPATH=/your/qt/path
    bash-2.05a$ for file in swig.mli swig.ml swigp4.ml ; do swig -ocaml -co $file ; done
    bash-2.05a$ ocamlc -c swig.mli ; ocamlc -c swig.ml
    bash-2.05a$ ocamlc -I `camlp4 -where` -pp "camlp4o pa_extend.cmo q_MLast.cmo" -c swigp4.ml
    bash-2.05a$ swig -ocaml -c++ -I$QTPATH/include qt.i
    bash-2.05a$ mv qt_wrap.cxx qt_wrap.c
    bash-2.05a$ ocamlc -c -ccopt -xc++ -ccopt -g -g -ccopt -I$QTPATH/include qt_wrap.c
    bash-2.05a$ ocamlc -c qt.mli
    bash-2.05a$ ocamlc -c qt.ml
    bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
      camlp4o.cma swigp4.cmo qt_wrap.o qt.cmo -o qt_top -cclib \
      -L$QTPATH/lib -cclib -lqt
    

    31.2.4.4 Sample Session

    bash-2.05a$ ./qt_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Qt ;;
    # let a = new_QApplication '(0, 0) ;;
    val a : Qt.c_obj = C_obj <fun>
    # let hello = new_QPushButton '("hi", 0) ;;
    val hello : Qt.c_obj = C_obj <fun>
    # hello -> resize (100, 30) ;;
    - : Qt.c_obj = C_void
    # hello -> show () ;;
    - : Qt.c_obj = C_void
    # a -> exec () ;;
    

    Assuming you have a working installation of QT, you will see a window containing the string "hi" in a button.

    31.2.5 Director Classes

    31.2.5.1 Director Introduction

    Director classes are classes which allow Ocaml code to override the public methods of a C++ object. This facility allows the user to use C++ libraries that require a derived class to provide application specific functionality in the context of an application or utility framework.

    You can turn on director classes by using an optional module argument like this:

    %module(directors="1")
    
    ...
    
    // Turn on the director class for a specific class like this:
    %feature("director")
    class foo {
      ...
    };
    

    31.2.5.2 Overriding Methods in Ocaml

    Because the Ocaml language module treats C++ method calls as calls to a certain function, all you need to do is to define the function that will handle the method calls in terms of the public methods of the object, and any other relevant information. The function new_derived_object uses a stub class to call your methods in place of the ones provided by the underlying implementation. The object you receive is the underlying object, so you are free to call any methods you want from within your derived method. Note that calls to the underlying object do not invoke Ocaml code. You need to handle that yourself.

    new_derived_object receives your function, the function that creates the underlying object, and any constructor arguments, and provides an object that you can use in any usual way. When C++ code calls one of the object's methods, the object invokes the Ocaml function as if it had been invoked from Ocaml, allowing any method definitions to override the C++ ones.

    In this example, I'll examine the objective caml code involved in providing an overloaded class. This example is contained in Examples/ocaml/shapes.

    31.2.5.3 Director Usage Example

    example_prog.ml
    open Swig
    open Example
    
    ...
    
    let triangle_class pts ob meth args =
      match meth with
          "cover" ->
            (match args with
                 C_list [ x_arg ; y_arg ] ->
                 let xa = x_arg as float
                 and ya = y_arg as float in
                   (point_in_triangle pts xa ya) to bool
               | _ -> raise (Failure "cover needs two double arguments."))
        | _ -> (invoke ob) meth args ;;
    
    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '() ;;
    
    let _ = _draw_shape_coverage '(triangle, C_int 60, C_int 20) ;;
    

    This is the meat of what you need to do. The actual "class" definition containing the overloaded method is defined in the function triangle_class. This is a lot like the class definitions emitted by SWIG, if you look at example.ml, which is generated when SWIG consumes example.i. Basically, you are given the arguments as a c_obj and the method name as a string, and you must intercept the method you are interested in and provide whatever return value you need. Bear in mind that the underlying C++ code needs the right return type, or an exception will be thrown. This exception will generally be Failure, or NotObject. You must call other ocaml methods that you rely on yourself. Due to the way directors are implemented, method calls on your object from with ocaml code will always invoke C++ methods even if they are overridden in ocaml.

    In the example, the draw_shape_coverage function plots the indicated number of points as either covered (x) or uncovered ( ) between 0 and 1 on the X and Y axes. Your shape implementation can provide any coverage map it likes, as long as it responds to the "cover" method call with a boolean return (the underlying method returns bool). This might allow a tricky shape implementation, such as a boolean combination, to be expressed in a more effortless style in ocaml, while leaving the "engine" part of the program in C++.

    31.2.5.4 Creating director objects

    The definition of the actual object triangle can be described this way:

    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '()
    

    The first argument to new_derived_object, new_shape is the method which returns a shape instance. This function will be invoked with the third argument will be appended to the argument list [ C_void ]. In the example, the actual argument list is sent as (C_list [ C_void ; C_void ]). The augmented constructor for a director class needs the first argument to determine whether it is being constructed as a derived object, or as an object of the indicated type only (in this case shape). The Second argument is a closure that will be added to the final C_obj.

    The actual object passed to the self parameter of the director object will be a C_director_core, containing a c_obj option ref and a c_obj. The c_obj provided is the same object that will be returned from new_derived object, that is, the object exposing the overridden methods. The other part is an option ref that will have its value extracted before becoming the ob parameter of your class closure. This ref will contain None if the C++ object underlying is ever destroyed, and will consequently trigger an exception when any method is called on the object after that point (the actual raise is from an inner function used by new_derived_object, and throws NotObject). This prevents a deleted C++ object from causing a core dump, as long as the object is destroyed properly.

    31.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    Special typemaps exist for use with directors, the directorin, directorout, directorargout are used in place of in, out, argout typemaps, except that their direction is reversed. They provide for you to provide argout values, as well as a function return value in the same way you provide function arguments, and to receive arguments the same way you normally receive function returns.

    31.2.5.6 typemap

    The directorin typemap is used when you will receive arguments from a call made by C++ code to you, therefore, values will be translated from C++ to ocaml. You must provide some valid C_obj value. This is the value your ocaml code receives when you are called. In general, a simple directorin typemap can use the same body as a simple out typemap.

    31.2.5.7 directorout typemap

    The directorout typemap is used when you will send an argument from your code back to the C++ caller. That is; directorout specifies a function return conversion. You can usually use the same body as an in typemap for the same type, except when there are special requirements for object ownership, etc.

    31.2.5.8 directorargout typemap

    C++ allows function arguments which are by pointer (*) and by reference (&) to receive a value from the called function, as well as sending one there. Sometimes, this is the main purpose of the argument given. directorargout typemaps allow your caml code to emulate this by specifying additional return values to be put into the output parameters. The SWIG ocaml module is a bit loose in order to make code easier to write. In this case, your return to the caller must be a list containing the normal function return first, followed by any argout values in order. These argout values will be taken from the list and assigned to the values to be returned to C++ through directorargout typemaps. In the event that you don't specify all of the necessary values, integral values will read zero, and struct or object returns have undefined results.

    31.2.6 Exceptions

    Catching exceptions is now supported using SWIG's %exception feature. A simple but not too useful example is provided by the throw_exception testcase in Examples/test-suite. You can provide your own exceptions, too.

    swig-3.0.12/Doc/Manual/android-class.png0000664000175000017500000003446613042756442017625 0ustar williamwilliam‰PNG  IHDRÎv)r8ýIDATxœí}”EÕo¼õ¼'Oó)êª D‚$BÂ?³ˆ`–1$˜L%«Aã‚c@X¢Ä>¾¸¢Æ1@\‚„5j<»ïÏÆÏèFEz¢‹Ê1ñ&Ñ ¢ G}jªëoϽUu«nßë½–Áh#xõât£À À(4êf€Ól8õÔSgΜyb- –kÖ¬Y5sN>ùdkÕŒ¶hã”SN #†“N: O‘&~Eu3ÀlÎ9çœóÎ;oéÒ¥Ë\wÝuêO<}ã߈”2ל9sæÏŸ¿dÉ’åµP*•òÌ3Ï´ÖÎhKÌ›7ï /´Òâñ<¿–d zç;ßù® z{{o¾ùæ¿ÿýï[¶lAXƯZµ ä.sÍ;÷â‹/~—‚ñññ}èCW_}õ5×\ó½ï}ï½ï}¯|ôŽw¼}ŽßaFK£ûÛßþö+®¸b``à–[nÙ¾}û—¾ô¥/~ñ‹ ¨~ô£ïÿûW®\yÆgXóž<ó¤ã§wâ´ãpŸf¦#pÒ4É:u3ÀÉ6\pÁ+\uÕU<ðÀ¿þõ¯_þò—üàÕG‹-’¹0¼ímo“úúú}ôѧžzê™gžùë_ÿú»ßýÌ Ÿ"eww·µvFû¤ùž÷¼çöÛoéö³ŸEà3ŸùÌÖ­[‡††>ÿùÏá _¸üòËÁ$fÆ®9] .8ÿ}ž·îÆ×_sã\\ën<[Öß8÷ýÏZúÖÅg½þ,L HŸ `ýóõÑ\Ìh÷»ßýnõÑùçŸ/suÖYË–-“~îãÞ{ïç pß}÷ýêW¿’O1ñ}öÙ)½n†ŸúÔ§0*a8Óâï¾ûîçž{®\.kñˆùÃþ€,û÷ïÇê J /ºè¢uëÖa€…COOÏ[ßúVܱиì²Ëhd$ Ör-<á¥<ëÆMÚt¿·ù~ïæû=-pÓ½ÿö_>fÑÂ…gvÍ9¹8É,fÞ\ ´cùÚµk±˜ùÛßþ†>ƒwî¹çÊ\0!PúmÛ¶=gÃÈÈ%@JÈÖÚ©âË_þ2†$ü`5¾¿¿Ÿþ£O~ò“j<ÈôÙgŸ}üñÇ÷îÝ‹§ øšYLÌœ9Ë üï×_ý7¾ñ_ÿú×ÿøÇ?~ó›ß|ë[ßÚ°aâñänfðÒŸÿügPfî=ôÐ_þò,1ðôÄOÔrÍš9ó¥®+oœZþ¡WþÁa廽w­Ÿýæ ß¼|Ùò[oÙò·ÿ÷·ƒÖßÿáÅ‹/¼`áé§ rJ† ޼á oÀ„…æ¢{X·Aº`ÂZ¼x1ýãÿ1HóÚ×¾v¢¹³fA Øîc÷îÝÿ·ˆ¿2üï|“¤Ú>ªÿdÄÅûÞ÷>Ð.þV•ð—Ü¿ò•¯HjÆœÿÏþsÏž=ßüæ7 ù‘ßýîwÆ2ØšÅ׿þõXY`¼ÇÀŠùá… ‚¢ c§3fÌPÓŸtÒŒ9gœvÕç^ô‘o>ïãwy»ë¿}ì.oåU3æŸ7ÃÀÀ¯õð#¿~äâÞwΟwîüyóQÚɳOžÞoH™ö4¿ÿýï?ùä“K–,ÁŠ ‚,FÐ.&D¬ùæøË\à`ðÃG>òÄÓ›"<öØc2ü“ŸüO¯»î:¤Ä„e­‘6°Ú& Ÿ¥R ¤ aôsŸûâ?þñS<8å]wÝ…HüõˆÁêaL#aYÀ„O4³qãÆ}ûöA¤Ä€i‹Dâé´iÓÔô3Nœ®èß1éºÿzÞÀ7¼ÝâZþžc¯X{ÅÏîûÙÃ=¼ÿ¾ý‡xxÁ‚ Î8ýŒ'Ì@®dœDRVl˜¡°ø:tèž{îÈ"ÅLmj.,õ¾ýíocl¸ÿþû%Ñ?úè£2Œ—Ž)iRë0£iÐà‡?üáŸþô' Æ£££ˆ¿ýöÛ1?ËÄDô—_~9ÂwÞy' w¯yÍkèô@!÷Þ{/ø ð£ýC!"ÍÑpÖ¬™‹.\¼¼wÚš›þLJ¿âýçW¼ëþË[pñQ3O˜yÂI'œý†³¿>ö­-·Λ7ÿä™'?ãø×÷šã`€©! F`€¹c­†å;þ›nº £‚ÚÊc=VfAýĪñ–[nùéO*‰þ·¿ý­ ÿüç?¿ù曑)êf¤ þ‹|~b0Öö*00#0©[o½1øëƒ,X!>,K@ÇwÑ Ä?¬X0t‚– .bÜD$žª´ æÔÙ§Î9sN÷²#úÿ·‡ëÚÿã-»â…H8õØ©¯ëz&'Θñjd:vê”)SŽ>æhäJ†^õªW]Á1Ç6øêW¿ ±iÅŠGWã¨£Ž’¹ׯ_¾aŒ—¯¢’ cäÀÓ«¯¾)‘>ÞÿÈh`†¿Á-\wíÚµtéÒË.»ŒdÐ(Èýü#=Åê%,‹£ÆW¿úÕ’¨0ØcüðÃcá„Å6Eâ)Ò¹¦¼ø¥¯è^zDÿv¯o»wÍvïŸóÖmý·u·öþÛ»ú¶Ãún;ìªÛ»ì¦Ã¦N™úÊ£^9µ˜bCg5À²h.-fÀvÚS™ë•¯|¥ŒüØÇ>&‰þ‘G‘a ÿ2 Ò[kg¤ ¬Fˆ´ø¡¡!ÄC*ExåÊ•O=õVØCfûýïÿÌ3Ï`é~Ëâ»—½ìeô¿£Z ÌåË—S$ž‚ Ì\Çwü¬Sf.Xõ¿.^wØEô/?ðv?°âšÃÞ¶î¿Ï˜qÌ©§Ÿ þA–ºàh^ô¢ý»‚·¼å-4åá\rÉ%ÿ^ ™ }˜eÔÉógpPÝH¾ø »êf"/õNÄ*´ªã­)A¦ xðmÛÓ9˜¡f^¾ó={#3@Ãõõ_ äbµ³VlõãzeØæ;ß›|O`h€°V‘ Lý|ÏðÞÔ€ï|ÏÛ½Ù3ßùž«{Ý À`0L>br÷üîÒŠRÏŠžô‘¯÷ŒT1éðIƒ[…†æ¾{öß3žÞ}|ïøÐ¶!0[Ö=f0”7•=tèÐ#‡Ä=½ë‘à^ÞR¿Þƒ‘=xè‰&lu  J¡£ö‡æÝ³î1ƒ¡D9A¥|G-O<‘u  Ê&#ë3 ª|¤)w鼂 †¥Ø¢ñwi@¦rÇ&­ð#,3ò„ êè1¹k™^õP ë¬.ûž;÷ @1ÂbÜÎÑñ»Ç±LÂ1¥%%ÁÕ%„^÷‰+ë3 „í·ý0¨ õïB8q:Ø ¼¹Œ˜ ¸g™LéCH È X&ɼ5îûÅ.#gèìì,-)‘ÿÆÞÕ½‰ßÉi$ª˜rÌ”¬ûÊ`0 ƒÁ`0 ƒÁ`0Z “&Mš=köôiӽެ›Â`4 ý¡mCååÉ“r<·çŽ=CÛ‡†w ÷]Ù—Í>mvÿzáµx쎱á‘a\}ë¢.óJtÍéj  Ñs5V>#'˜~âôÑ£ƒ›d€@-§CøÉëžßH›¦LE« ßµp™7@‡þ®»Ñs5V>#7ÀúG0À–˜ ày=+{pM>bòÀ }ëûˆ,JK„\]g‰aOÁjƒ[‡¶aí…ŸåÍe„Q=~Ê2¿`ÑÏ×±S ï<²Ù)Ã<†^Qà–Áþkû…Æ@Ž2/¡÷Ò^ÌQx*yJ{P{¡µ¹0ùÈ\ÐæáíÃ-(±ì£V>£å{ðiTø Þ2ˆåˆ¤CÔÐÙÙ‰iÁó5…P‡çÓ_ϪÏ— 6 AÝ:È„®¹Ær\!Ðî7uËÕøPô– ×ÎQYšÕk@ú˜0Òk}dhu`À_[¨@¥ÈoZ $ãj`4--/€ˆÔ‚Ÿ#ÃV Â16c¥áÈàZÖ\¹¦{®!'(ŠöH@™Ú*¨ª%j®E „ébê”`BS*ehu`56.ŒîªúûQ –ËAø¡#Më*].u°\ÁBûZ¸/h‚ú‘~xÇ0Å d±âRªq[f¥…B`¨$ÆšJÕ*5["s•V”hu„}‡ VZõ:¼@ü0Œ¼"î à`Ï_‘ÐI[“ø‰§¸hLÕ~: eÓèÛ»º¤BD…£$¿‚©FP³šÆl‰ÌEã=&ŒdJaóÔçO3ÀÈ-hh\`0Zqg£¥W`0Z<0 ¸2DORס­¦Q+Ž–Â.ɯ Fˆ5€ˆ¥…‘¿ÃS·G\ˆœ’€‘*bÉšê%&±Ýcr+¡ö³mˆ~¢‚þ ý}ëú©¥”»“R³²gem>"’€‘âÊåMeµTŒ©Úöî*@Ïg½™R(¢ù{üòœKœøÒüà'c`¤‡ÎºævGKÕ €a¤a^ž©2e÷ün„1Øã¢“cÄô®î¥§‚»˜©!™] `ðVÈzB…æ˜)–Ôj¨Òà÷c˜ÍA,@æ•q7 Bcª U-Fü%«Ù0ÒA¬‹¨ÈQÕ_Ü7 Bã*C^E&¡™Õléu…Ÿ3 Öb<0 Ø2@‡gIˆ¼ênAE)H“’s³muµ6ºŠ£Éˆ; Ü0@Ûž²+Zª•‚&‘ÓiÈJîQ[]EŠÑtÄ;ð·ð«b…Ϧä£)©JA’È(o.÷¯§ÈrV¡Ÿ£»Féû`Y]y“ÐBzÒ¼˜øè‘¬Tø Ö¬]#T6Ö÷÷¬ìAxJ´k6OÂ,=E!¨øT–0ËA R" b´>ª æÍÜÌï`N—¶ìQ~L%j¡*¥ …PÑI0–Dv Gõs^ÐhZk~ö®…~ÒÙJÀeožç*‡Þš$ RÈÖÚt™¤"­Zƒù8/sÄ’¬ ~L%ÏP c€ c'k× ©vJ´;Q܆*\Õ¡[Ô¢P#Y‚èšÛ…dֿɖ;Ê!+Z²µn]&½Õ fdŽX3@0Ô)P¦’© Ʀ­ZY¬äv5Ê“„+‹2@kž„›ðSc‡.“ÖG­ÁÖÚÍDÜsRv °0÷é´ d*yªRƒ:DEfíš=ëÒ%ŒÌæI„.ް/ìºL•EŽÚGÝ/²FÜ] ’z1Â@¬n»@¦‚§ª9€vZ…=ÚU½jùš=ÍòƒÌæ©0Ë¡ùÇ*›åLXöÅbÙG­Á,gŽÖй[éþ–bÚšçS Ft´ÆIpyS9Øt'{ü9ðfCÕ³n#.ZCl jÃw«ýÃ&Óø0)‡ Œ Ñ3ƒ‘š"$§/ä†Û†J”U{æ+ûzyƒÃÛ†ihÆ ¬¾5ÕÔÞÉÃßV—BTlEn¦!u Y}!kz‡!U'GÝfÕ`¦±V¤«i ©FQ[B˜!#íÉ¢mÙZŽ£Á¦!&µF‡ÞuPSB¶¡ý\kVÅ*@ s«{…÷´ºRùAê3@ÂúBõÒtr4]£À‘YXšú5…¨ÀˆjKàj’¡…dO®VõB¾— +'¬Áæ{Ój4õ¦Ì"ÙQ ô•æ–ìŠUÊ#4Û­+•+¤.$«/T—!M%Áªk–¦aM¡ˆjKH†¡­EgÑMáp“ðÕ¬2€µœ°›ïM«ÑÔ›2;î„#§–ôcõzt¥¼žº-;™ ]W*WPÍØJP_ÈLïF„ÔªU+„¥±V$áÐ8ÒÔ–¤¶©¶D"#…‘†D•¬å„vÊxo5=²i$oäž¿ú¢£w‡e'ë €¿ Š®T®4 ZC¨…”ÚRÕŸh•MO|œ0’R[Ê¡ú“­Ë­¡ ÔBHJm)oêOn´.ð À(4¶ ”ˆ¾ ¼Ðö3„fmçXÝS"ÁZx(«ì š1 ä"©DFéÂ’h zæ~ f¬ Ä(4x`² Ôº¨W×2·º™9lX±ìµ.ØXPJhg»@“ K8ÚÇ“GvJ- ù–i ÇÝZ 6ÔŠÆ‚ÚÙ.f ÇLie«1Wk+ 3¿”gcAù7ÔÎvÄ(¥•ÆpØXûý´¢± v¶ Dy­Ä(¥jã„òrÃacAíg,¨íi–pÌ”ó¯CÊØc8l,¨ýŒµ³] ÓN .o*ÓºÖó5®Ñ*1¬ú3€Û޵v 6ÔŠÆ‚ò¨ Ô4yÔå= n2°± Ü¢ º@Mf6”[t`0qeµEêï¶’Eó-! Å.„œ=ØRP Ö LnY¤7ƒ4ßRzÌiNâÄl)¨=K“É+Ûda)H5!¶‘ʦqÄ–‚Úqe¡µ¡_ÚÿI\Ù&KAô1~ÐŒ‘ #¦Æ[ j$p@'ö ¦4”m²²„F‚OÐfÜoQ¸`KAmdvhÀNCÙ&sKAd(Åì[ jij ZÉj–#âwrÊ6™X ’(-)Ƀz­kl)¨=Ï6èÜ.ÒK‘Û…i(Û4ßRW‘ÔQµd]ãˆ-µÒÒJö¨•-1RBZ'Ámüy.£–.3£%Àº@ŒB£ ß0ž…FA¿`0<0 –…ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 d€‹˜–¼Z޽O#Z+­æ`å'”d]‚¾k1ù4P~;¡àNÖH`(o*£ý›@·c/çÓˆ**U=iÒ$úó@ýdZ"fùív²ޏ2ÙtЖxᎽèëAí©i)ÈüôpÝ5*?¼Ôš¤e7cÑ'—ô‰#¥1Û ù·ò ›E¦ƒ-B˜«/k Ñ©.Àšãd­ˆ;€ñO|3.QíØKs¡>¥ÄžÓ›¥°ºÖ+j¶tOXŠãAô—‡»¾ ü[6‹´b%B]}%Dt@fºkŽ“µ" ® @vJ<ß|H•ij¿Fšû LKAXJa±þ©=Ó1–b‰3 „kEäÞÇ´Y¤+æêËRBýÈ´¶¥êd­ˆ5€0‘™ÝÆNdp[ -ÁÆ4QØ-”(ž°ÔòÌí²¶Ád‹,ÍßV%ÒêêË,¡d5s%ìd­ÝKF~*ïÎt†§:ö20ò©ÛR£ìÈħÕJ¡î Ë`ktÿV†Í"ÓׄÝÕ—QBDda.À¬¹t²VĚȖü)–C ¨Ž½4ÿYêÓš–‚f  s`õ­z=¦yÂ2ÀÚÍ¿•gØ,2lIX]}™%Dw@fuf/39'kEëÙQ¸­Ò¢‚O‚í`(XÈf€‚€gF¡Á2£Ðà€Qh° À(4x`,0 ž…ËŒBƒgF¡Á2£Ðà€Qh° À(4x`qeù©‘Wù¸¤á¦DQÀ”öm¢$ÎV£3¢)7Ô.ÔÕwFDÄdÏÿšÉõX±o‘j˜"›â©‰  ÕfÖ¯¶C\ÀÊY¿‘4foGµocµícÖ+ T ¡Ûé<²SÚ·CJ ·j.wDƒ7—Ñ´£™â‘tØ¢/ýMFT£ÖwÙKöê– _š‘†Š¸3€´ A†!âX¿‘ÿk˜½*û6†mk½’d$4c;V˜h¶³ ª¡À°‚føHi³fkHûØß4a¤íÑ^”™ÝÚ”áŸ,(’—¶~£þ¯V{;h¶}¬õJÐ,Vx†­+È\î.X …0€ijE3÷bš0r0€%»ÍäÃäe€†­ßT-ëCìí˜D¥^«À Û9b²d,!ˆ¬"‡»ƒÁ:°QÐúÞè-a8‘¼ аõ™Ìaog¾ʹIX½VÐŒíL,É|ó8pwP’úfd!¦­!m ã0adöݺ2Y‘—@¤² Ô˜õu` ³·3aMÈFsaõ†m©Æv<ߘ([ˆÎÀÝAÙÕ,Ä´5¤Ù;r˜0²ö]Ën¶„…`7X¨yàýû‚O‚›f€‚ušf€‚gF¡Ñ CptX°9jŒE!§CȦêùTjBžï ;è ±ÏÃJA9Gê3–¿rÿ;ÛYÆÖY)(ÿH]hÛ—=+{èË@PøÏ4Çàù{8¤z)­’D±,䀩äù§ˆ— ÐØ5X+e¥ ü£2þ{a£¦¢ó£š9c:“TѲP]ÚA•Ó’@ÛÐ :"ÐNX)(ÿhÒ9@×Ü.úp[=%ËMVÀ0‰§˜hùѲšvD|¿ †TŒy±RPþѼ] °M0 ò€R‰(AR’¢XŠ¢„yl#Ù)þH*e¥ ÖBúßTÊ9‚ˆ«–@#b däÁÀItƒ€É1µƒ4¨ Иšœ‚ÄZhÄŸX)¨uþ÷s»hÄ•%’Œ­ tƒ<þž ©Ð™ àÅÓÒ 2€×š:E9.V j9d© ¶˜N yÐb¥ ¼!Ë“à&3@´ƒX)(oÈR¨É À`˜`] F¡Ñ¶ß0QÀ3£Ðàï…ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 –…ÏŒB#® `u”͈ù•LRß ”V3Dê'£‰TÑÆŸ1¤â)ž žJU5ý¦EntH©‚ÀЏ2€•4»=Ñ­ú4fÉÈ…£t#S’QJ€æ -ëû{VöëH¢9G±Â½ßê^Üé³É°öÈZ´ôîWÑ»ªwl÷£³Ÿhfï$´àŽ¿C~hêù¦Ô*è#R2Êd­+ì•ZóšV”î«ÅªßŽf…¸3Þ¯´¾·0íöD´ê#Ð9 ¼åÀæŸ=°ÇæƒlCP9ôõ:zK_¬ ›%+JŽbÕ\øGÉkÚG-Azç« ËH²®0ŸhZï&šg4€zWe'¦º TM†:ÍqSب*½óU¨oO³ ¤fÑz7Ѽ(K [Ž*ô•y­VÍîë}ÉÁ(•] ÍnOD«> ›BŸ‡‚ .´h÷Y(Ìu¡E»Ï3£ÐhI mÆæ¨ ë²,6BÊŒ’«f:À¢]|ȵºó(_º¥°é-Ì'Z]¹èPœdb¹»Õ»ª7p–Þ,šVêÒœiu*ÛîÁvj­î»Ky‰}˜ÊѲæ³D\ÞTVw–´ìVŸhõæ"ÿTT;Ë]»–@:HQ0UeTEšþõbøÝ5Š÷"Jhº"Ò©2Ò°Ñ5§ ÕúïZËñ*vÉ1Þhû÷¦‹¦ô¦VDÇŸò¨{~7míY ´êY•‹ÂT€$L‡†n’µËzÉþ‹õüã3j<„+m»#Yˆ”MhVŸhå2»#a~GZ3@Ø9Q Þ5QxCŽž¡+B§‰žOdôŸ!FlBWÞTX9ø?ĬŒpÚù«§h°h5šjE¦¶ i›¡À`Ù®£ëÙ”‹ÂT€$Lsï§Š|¥a]6K&$ÈE¯ýE㉨wÈ"Iy²áÍŒi8Auß&yµi†ìÓ’ÜšÒu$Q†Ì¥éŠ †Rü7 {ð€Eð¢}H°–£yaQ@×`Ñ”^ µ"S[¤† Ga:TbôSçpÝ ‡ZŽ›¬ºIj³dTMzÔä3àÓŠEJR–0= É˜ÆrÄúGj¹vˆ±’(\:‰"­À­ãùÄAÓ·¦äX¥+â¿¢ðfÉÓžgœìšå„Qƒ©Á¢×èéjEæ?Æà/¤AË­¿T„ýåÁЮÀ\38ºl–Œ\;H®À–K d t{wÝ^ͯ¦æMÆ4–Ë«,¤<£vÁáˆ-Y¤%¸rˆ²'RWtBL½$„ÕP˜¾t)'pˆTWdzSƒE«ÑT+ÒµeüOL¨|½šÑTª1›ªj6fízöšuµ4òò=@½´ôéA=ˆ%UiZÓQ¡%6•aÔ\¨B=÷‘Wu`RŽÙT3yx쨮j¦ÑΧ[¹™êµT¾1tÏï&º4ý,hÍ žÈh  éÀhP›Ê0tôkdXæ¥z Ú€u’¡":³*ÕhMµ¦ÑÔlµËã këki]äE¨×"–>=€Ôå„JÓ3±Z T†A/@ÙHƒ»d?U=%áýpÔªf£­|&ÒØÔl¬µ«Gøai¬uµ(r1ÔkÈ®ÒS?Ü3€„Jy*M»u`¼ðlê1R§@SÁJC*)^ »Sƒ€Ò¸ÕlTTg5U¢i=XëjEäB¨×"™>qÈ¿V¨$(Òž•¦'f€jC7š ”l¨Ð”–”HIÁT ÞƒŸ˜Î,Çlª™Æ¡f#k'˜æúÔ4a¯¥u‘‹ ^‹@fúÄA—Ð2ZwÝ  ºQ[UhH”G¢9‹zŒ²æ&õ³³©–ºlj6Zí^µ:š5MØki]äE`02A.f#+äB`0²ÏŒB£%e€†Õ*µ8â6£ZKǪÉ#¡©âDÔ52x¢(Ñ—1ƒ¾¹/DÉG«+Š"Y»µ…¦òRžÑª3@#;ÐÕ>¹âCÛ ±jòLUœ(ºFV;95‚\Á^™ÖfùÕ„U¯IMcUª©bd¾–œ#2€i0Çsz×R5[¢;ÿRf¹ËÒfÇœ9A9,Þ8tÌ\QÄ™×*û™—Tò1ë2Ó˜Š@QTŒbM6¹˜,s܎ƪ ãDuþ¥ºKq{ïªÀqTljéH¨†n$L‹7Qt´\QD÷+;ýh¡UÉÇZ—–ÆTŠ¢bäx-ùD.dÓ^ˆÛ»–u@­íüKa€Þ»" LK§ÊÐD¸Å‡®‘;W˜"PhJ>z]¶4E 0#‡òR>‘—Àd‡w-«Y„ÚοªÀ彫× `ÓÒÑ4yÔrª8aºFî\aŠ@aK SÉÇd€èŠ@a*Fnå¥"/2@]Þµ¢0€ÕքìZÞ»¢´ÙÔÒÑ5ê*ªA¦*N]#3WE Í",ÙTò1À­EÅÈ|-Þe–ÈÑ Ý»V0Kð‡Yîò#BÓÒ15y&Tƒ UœHºFF®(Š@2—*'˜Ë}j*ET1Ò^KΑ Ù J#"ò2002A^dfF&ÈÅ À`d…\Èõ¢Á›ü!bÃÖ¬]hàTÛpNÍ÷fêIÈŒ´½†µê Pa³O›-• Òû“šï5Ìm˜ˆ  ^ÃØGXÞ}„I/8(“vQ¨½–*:Ò\v}v–²ðf5:D]CJjƒC‡*)°°¼û£Q¸ô6(}#ìc€ºì,eâ5ÌÔ52»æ¥ï5Œ}„åÝGÜC¡aj×W„0@]v–²ò¦é™]k‚×0ö–wa4`›T"Fô `8Ôkg)s¯a¤Xav­ ^ÃØGXÞ}„É?Eɪ)­ªô½G†i=S—¥L¼†IH]#³kMðÆ>Âòî# y©ƒr»07•I¡·„4b2ôg€zí,yYx ól†‰4ù¾ ^ÃØGXóøn¬ö½KLÓkûkrÎÅûk˜rˆV= f0AKê5 †•ÍÞŽ5Æ‘˜‘Cð  »•ÅÞŽÃÛ8#?ÈÅ÷^.}„i–sÌÍx¹Bnf€üùó ‡Hš¹‡Ç#F® Ÿ>˜Ú¹˜rë#Œ—@m\È9ôF°[ê”fhM <Šþˆ‘KäbÈ¡0‚i©S³·£Å¨ÊHfbF‘€Áȹ˜Œ¬ €ÁÈ <0 –”V«LCUMß°jPË¡Ug€<øóªMß°jP+"2€i0Ç˽0Ï0}Ãçb­ˆ\̃9¹÷æ¦oX3¢‘ À´’a¦éf€VD^f€–ófš¾á%P+"/2@Ëù“P­ÿ±jPË!G3@Ëù#¨ÖÿX5¨å ñ J# ò2002A^dfF&ÈÅ À`d…\È FVà€QhäB`0²ÏŒBƒeF¡Á3£Ð`€Qhð À(4X`<0 –…ÏŒB#¶ Ð!¼4ƒ‡†G†Éy‚>¢w —7•'Mš4û´Ù}ëú¬ŸÂXÁ¦Œ(ˆ;ôoè§Ï¯<ÿ¨$›V)Ÿ>àšrÌr¶Î ÀH±dë®`ƒòæ2…¥'wÓÆuü);ôŸ*$ q3}vˆ&‰¯Š•5]Œ‰l–…¯ù\2»cµb¼[9²v2 !?Š—cZ¥¿ÏhbÍøçL]Š1Œð€&zVöˆ>¹k?UH 8õªÎâÕïÐkºSí i5Z@³b¤6O+'° çƒìJÍ ÏgBjbòïå»]KP@ ½;†1È™c1Âã[,­(vªªˆÎÂôHe1¦&ˆâbLµË‚ÁX¥i+hF\ÔJµrÔVÉñ~P¡SȈÚÑa`‹· 2B¬@X=P–@øw“lŠÁb€À2Åwöb¢×~VÔt1¦–&WÍî¸@+Çdô"Lnö†e• ÷@x“®P1@•)‘aZiFx$•“¥Ní§Z~]K 2@KUk¦xÜ.Æ `éŽaÅÈlž,Ç\Q@ÔÛp &H0š‰¸»@ Œ‹ Ú ÌЮîÅO!úC¦gáÁO’ é¿×~J¨Û ã‚iÁ¥ Á5]Œ9ÀìŽÕŠ‘Ö<µœ !¸b>ˆh £ƒ$02ëÕ Þ`m'ðIpÝ`h'°.PÝ`h'ð À(4âÊ]_µÐ¨ÙBMeÄG¬ ºë«Ö¢ªF1Z±d‡ßSÛ‡v!i‘Ò˜ 9Q<…Yµ†4_Ö\a®ÄÌfL8 Qb´ bÍÏ?šzzx$N»(e¸BN˜§°0­¡Éª±ÿ_VWbÖf˜È´ó8FÛ – à`]ÛǦlãPÈ õ¢5¤æuûÿ2ýh˜Í0i BŒ¶A¬ †ë+E½Ç<"µ*äÔô¦+ã´s_‡ÿ/zAîãaF{ Þ÷ᮯ4õ“˜¬ 95=……i U9PrúÿÒÀ¡Ä PÄ=s}¥©÷XµÄL…œšžÂ´†´]&‡ÿ/Ó—^˜^3@#] ÖÚ*e´rtÌ Àh>r¤ Ä Àh>r40ÍGövè‡F&ÈÞ.3#C$oÈ3,áXczVöÐþ#i’¢zUÞT–{ xp”ÿ1®g3ïÃ`ÄDòvÌÏÀ͘àvÏ'îÃÄâlòÄ)}bïUìFÙÍû0ñ¼] Óˆ;&0 eèA2¦n\(^Ç äíÅg$ õa1ªò¥]/ˆÁˆ‡äíÕ½Q–@ÕÆv0€è¥-MÇÁˆTì™–pÌ‚é+b «Š@ˆÝ5*E^MÇÁˆéY!–X†Å\#)äú$xú´é<Ø3REŽt4Ðg»i8Ý`0$r=0i#® 0¶{ Ëtqˆ»¹ìPg{T¯D 7q„Ži.ƒQ¸3€Fˆ‹:ÖG13’B\@e‡EªGµì™:?šâ2ºíp1‘ä à°¨#Õ´dêü˜ŠCž §Û !1@sâ«YÔQíG¸í™:?¦Þ„çsKÜ®3éͺ u­ï´dêüX€½ª0AZ2@Ô´dêü˜ŠCyC#&š=Ô´äÙt~4Å!¡…Ê»@Œ$€`tçh~uŒTñ À'ÁŒ‚‚f€<ê1MQÁ˜EĤÃ'uÍéÂ<ÀZ÷ ƒÁ`0 ƒÁ`0 +þ?³ºýÿí¦b IEND®B`‚swig-3.0.12/Doc/Manual/Modula3.html0000664000175000017500000006223413042756672016565 0ustar williamwilliam SWIG and Modula-3

    29 SWIG and Modula-3

    This chapter describes SWIG's support for Modula-3. You should be familiar with the basics of SWIG, especially typemaps.

    29.1 Overview

    Modula-3 is a compiled language in the tradition of Niklaus Wirth's Modula 2, which is in turn a successor to Pascal.

    SWIG's Modula-3 support is currently very basic and highly experimental! Many features are still not designed satisfyingly and I need more discussion about the odds and ends. Don't rely on any feature, incompatible changes are likely in the future! However, the Modula-3 generator was already useful for interfacing to the libraries:

    1. PLPlot
    2. FFTW

    29.1.1 Motivation

    Although it is possible to write Modula-3 code that performs as well as C/C++ most existing libraries are not written in Modula-3 but in C or C++, and even libraries in other languages may provide C header files.

    Fortunately Modula-3 can call C functions, but you have to write Modula-3 interfaces to them, and to make things comfortable you will also need wrappers that convert between high-level features of Modula-3 (garbage collecting, exceptions) and the explicit tracking of allocated memory and exception codes used by C APIs.

    SWIG converts C headers to Modula-3 interfaces for you, and using typemaps you can pass TEXTs or open arrays, and convert error return codes into exceptions.

    If the library API is ill designed writing appropriate typemaps can still be time-consuming. E.g. C programmers are very creative to work-around missing data types like (real) enumerations and sets. You should turn such work-arounds back to the Modula-3 way otherwise you lose static safety and consistency.

    Without SWIG you would probably never consider trying to call C++ libraries from Modula-3, but with SWIG this is becomes feasible. SWIG can generate C wrappers to C++ functions and object methods that may throw exceptions, and then wrap these C wrappers for Modula-3. To make it complete you can then hide the C interface with Modula-3 classes and exceptions.

    SWIG allows you to call C and C++ libraries from Modula-3 (even with call back functions), but it doesn't allow you to easily integrate a Modula-3 module into a C/C++ project.

    29.2 Conception

    29.2.1 Interfaces to C libraries

    Modula-3 has integrated support for calling C functions. This is also extensively used by the standard Modula-3 libraries to call OS functions. The Modula-3 part of SWIG and the corresponding SWIG library modula3.swg contain code that uses these features. Because of the built-in support there is no need for calling the SWIG kernel to generate wrappers written in C. All conversion and argument checking can be done in Modula-3 and the interfacing is quite efficient. All you have to do is to write pieces of Modula-3 code that SWIG puts together.

    C library support integrated in Modula-3
    Pragma <* EXTERNAL *> Precedes a declaration of a PROCEDURE that is implemented in an external library instead of a Modula-3 module.
    Pragma <* CALLBACK *> Precedes a declaration of a PROCEDURE that should be called by external library code.
    Module Ctypes Contains Modula-3 types that match some basic C types.
    Module M3toC Contains routines that convert between Modula-3's TEXT type and C's char * type.

    In each run of SWIG the Modula-3 part generates several files:

    Module name scheme Identifier for %insert Description
    ModuleRaw.i3 m3rawintf Declaration of types that are equivalent to those of the C library, EXTERNAL procedures as interface to the C library functions
    ModuleRaw.m3 m3rawimpl Almost empty.
    Module.i3 m3wrapintf Declaration of comfortable wrappers to the C library functions.
    Module.m3 m3wrapimpl Implementation of the wrappers that convert between Modula-3 and C types, check for validity of values, hand-over resource management to the garbage collector using WeakRefs and raises exceptions.
    m3makefile m3makefile Add the modules above to the Modula-3 project and specify the name of the Modula-3 wrapper library to be generated. Today I'm not sure if it is a good idea to create a m3makefile in each run, because SWIG must be started for each Modula-3 module it creates. Thus the m3makefile is overwritten each time. :-(

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    |
    v
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C library

    I have still no good conception how one can split C library interfaces into type oriented interfaces. A Module in Modula-3 represents an Abstract DataType (or call it a static classes, i.e. a class without virtual methods). E.g. if you have a principal type, say Database, it is good Modula-3 style to set up one Module with the name Database where the database type is declared with the name T and where all functions are declared that operates on it.

    The normal operation of SWIG is to generate a fixed set of files per call. To generate multiple modules one has to write one SWIG interface (different SWIG interfaces can share common data) per module. Identifiers belonging to a different module may ignored (%ignore) and the principal type must be renamed (%typemap).

    29.2.2 Interfaces to C++ libraries

    Interfaces to C++ files are much more complicated and there are some more design decisions that are not made, yet. Modula-3 has no support for C++ functions but C++ compilers should support generating C++ functions with a C interface.

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    C++ library
    |
    v
    ^
    |
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C interface to C++
    module_wrap.cxx
    generated by the SWIG core

    Wrapping C++ libraries arises additional problems:

    • Is it sensible to wrap C++ classes with Modula-3 classes?
    • How to find the wrapping Modula-3 class for a class pointer that is returned by a C++ routine?
    • How to deal with multiple inheritance which was neglected for Modula-3 for good reasons?
    • Is it possible to sub-class C++ classes with Modula-3 code? This issue is addressed by directors, a feature that was experimentally added to some Language modules like Java and Python.
    • How to manage storage with the garbage collector of Modula-3? Support for %newobject and %typemap(newfree) isn't implemented, yet. What's about resources that are managed by the garbage collector but shall be passed back to the storage management of the C++ library? This is a general issue which is not solved in a satisfying fashion as far as I know.
    • How to turn C++ exceptions into Modula-3 exceptions? There's also no support for %exception, yet.

    Be warned: There is no C++ library I wrote a SWIG interface for, so I'm not sure if this is possible or sensible, yet.

    29.3 Preliminaries

    29.3.1 Compilers

    There are different Modula-3 compilers around: cm3, pm3, ezm3, Klagenfurth Modula-3, Cambridge Modula-3. SWIG itself does not contain compiler specific code but the modula3.swg library file may do so. For testing examples I use Critical Mass cm3.

    29.3.2 Additional Commandline Options

    There are some experimental command line options that prevent SWIG from generating interface files. Instead files are emitted that may assist you when writing SWIG interface files.

    Modula-3 specific options Description
    -generateconst <file> Disable generation of interfaces and wrappers. Instead write code for computing numeric values of constants to the specified file.
    C code may contain several constant definitions written as preprocessor macros. Other language modules of SWIG use compute-once-use-readonly variables or functions to wrap such definitions. All of them can invoke C code dynamically for computing the macro values. But if one wants to turn them into Modula-3 integer constants, enumerations or set types, the values of these expressions has to be known statically. Although definitions like (1 << FLAG_MAXIMIZEWINDOW) must be considered as good C style they are hard to convert to Modula-3 since the value computation can use every feature of C.
    Thus I implemented these switch to extract all constant definitions and write a C program that output the values of them. It works for numeric constants only and treats all of them as double. Future versions may generate a C++ program that can detect the type of the macros by overloaded output functions. Then strings can also be processed.
    -generaterename <file> Disable generation of interfaces and wrappers. Instead generate suggestions for %rename.
    C libraries use a naming style that is neither homogeneous nor similar to that of Modula-3. C function names often contain a prefix denoting the library and some name components separated by underscores or capitalization changes. To get library interfaces that are really Modula-3 like you should rename the function names with the %rename directive. This switch outputs a list of such directives with a name suggestion generated by a simple heuristic.
    -generatetypemap <file> Disable generation of interfaces and wrappers. Instead generate templates for some basic typemaps.

    29.4 Modula-3 typemaps

    29.4.1 Inputs and outputs

    Each C procedure has a bunch of inputs and outputs. Inputs are passed as function arguments, outputs are updated referential arguments and the function value.

    Each C type can have several typemaps that apply only in case if a type is used for an input argument, for an output argument, or for a return value. A further typemap may specify the direction that is used for certain parameters. I have chosen this separation in order to be able to write general typemaps for the modula3.swg typemap library. In the library code the final usage of the type is not known. Using separate typemaps for each possible use allows appropriate definitions for each case. If these pre-definitions are fine then the direction of the function parameter is the only hint the user must give.

    The typemaps specific to Modula-3 have a common name scheme: A typemap name starts with "m3", followed by "raw" or "wrap" depending on whether it controls the generation of the ModuleRaw.i3 or the Module.i3, respectively. It follows an "in" for typemaps applied to input argument, "out" for output arguments, "arg" for all kind of arguments, "ret" for returned values.

    The main task of SWIG is to build wrapper function, i.e. functions that convert values between C and Modula-3 and call the corresponding C function. Modula-3 wrapper functions generated by SWIG consist of the following parts:

    • Generate PROCEDURE signature.
    • Declare local variables.
    • Convert input values from Modula-3 to C.
    • Check for input value integrity.
    • Call the C function.
    • Check returned values, e.g. error codes.
    • Convert and write back values into Modula-3 records.
    • Free temporary storage.
    • Return values.
    Typemap Example Description
    m3wrapargvar $1: INTEGER := $1_name; Declaration of some variables needed for temporary results.
    m3wrapargconst $1 = "$1_name"; Declaration of some constant, maybe for debug purposes.
    m3wrapargraw ORD($1_name) The expression that should be passed as argument to the raw Modula-3 interface function.
    m3wrapargdir out Referential arguments can be used for input, output, update. ???
    m3wrapinmode READONLY One of Modula-3 parameter modes VALUE (or empty), VAR, READONLY
    m3wrapinname New name of the input argument.
    m3wrapintype Modula-3 type of the input argument.
    m3wrapindefault Default value of the input argument
    m3wrapinconv $1 := M3toC.SharedTtoS($1_name); Statement for converting the Modula-3 input value to C compliant value.
    m3wrapincheck IF Text.Length($1_name) > 10 THEN RAISE E("str too long"); END; Check the integrity of the input value.
    m3wrapoutname Name of the RECORD field to be used for returning multiple values. This applies to referential output arguments that shall be turned into return values.
    m3wrapouttype Type of the value that is returned instead of a referential output argument.
    m3wrapoutconv
    m3wrapoutcheck
    m3wrapretraw
    m3wrapretname
    m3wraprettype
    m3wrapretvar
    m3wrapretconv
    m3wrapretcheck
    m3wrapfreearg M3toC.FreeSharedS(str, arg1); Free resources that were temporarily used in the wrapper. Since this step should never be skipped, SWIG will put it in the FINALLY branch of a TRY .. FINALLY structure.

    29.4.2 Subranges, Enumerations, Sets

    Subranges, enumerations, and sets are machine oriented types that make Modula very strong and expressive compared with the type systems of many other languages.

    • Subranges are used for statically restricted choices of integers.
    • Enumerations are used for named choices.
    • Sets are commonly used for flag (option) sets.

    Using them extensively makes Modula code very safe and readable.

    C supports enumerations, too, but they are not as safe as the ones of Modula. Thus they are abused for many things: For named choices, for integer constant definitions, for sets. To make it complete every way of defining a value in C (#define, const int, enum) is somewhere used for defining something that must be handled completely different in Modula-3 (INTEGER, enumeration, SET).

    I played around with several %features and %pragmas that split the task up into converting the C bit patterns (integer or bit set) into Modula-3 bit patterns (integer or bit set) and change the type as requested. See the corresponding example in the Examples/modula3/enum/example.i file. This is quite messy and not satisfying. So the best what you can currently do is to rewrite constant definitions manually. Though this is a tedious work that I'd like to automate.

    29.4.3 Objects

    Declarations of C++ classes are mapped to OBJECT types while it is tried to retain the access hierarchy "public - protected - private" using partial revelation. Though the example in Examples/modula3/class/example.i is not really useful, yet.

    29.4.4 Imports

    Pieces of Modula-3 code provided by typemaps may contain identifiers from foreign modules. If the typemap m3wrapinconv for blah * contains code using the function M3toC.SharedTtoS you may declare %typemap("m3wrapinconv:import") blah * %{M3toC%}. Then the module M3toC is imported if the m3wrapinconv typemap for blah * is used at least once. Use %typemap("m3wrapinconv:import") blah * %{MyConversions AS M3toC%} if you need module renaming. Unqualified import is not supported.

    It is cumbersome to add this typemap to each piece of Modula-3 code. It is especially useful when writing general typemaps for the modula3.swg typemap library. For a monolithic module you might be better off if you add the imports directly:

    %insert(m3rawintf) %{
    IMPORT M3toC;
    %}
    

    29.4.5 Exceptions

    Modula-3 provides another possibility of an output of a function: exceptions.

    Any piece of Modula-3 code that SWIG inserts due to a typemap can raise an exception. This way you can also convert an error code from a C function into a Modula-3 exception.

    The RAISES clause is controlled by typemaps with the throws extension. If the typemap m3wrapinconv for blah * contains code that may raise the exceptions OSError.E you should declare %typemap("m3wrapinconv:throws") blah * %{OSError.E%}.

    29.4.6 Example

    The generation of wrappers in Modula-3 needs very fine control to take advantage of the language features. Here is an example of a generated wrapper where almost everything is generated by a typemap:

             (* %relabel  m3wrapinmode m3wrapinname m3wrapintype  m3wrapindefault *)
      PROCEDURE Name     (READONLY       str       :    TEXT    :=      ""       )
                  (* m3wrapoutcheck:throws *)
         : NameResult RAISES {E} =
        CONST
          arg1name = "str";                  (* m3wrapargconst *)
        VAR
          arg0   : C.char_star;              (* m3wrapretvar *)
          arg1   : C.char_star;              (* m3wrapargvar *)
          arg2   : C.int;
          result : RECORD
               (*m3wrapretname  m3wraprettype*)
                     unixPath : TEXT;
               (*m3wrapoutname  m3wrapouttype*)
                     checksum : CARDINAL;
                   END;
        BEGIN
          TRY
            arg1 := M3toC.SharedTtoS(str);   (* m3wrapinconv *)
            IF Text.Length(arg1) > 10 THEN   (* m3wrapincheck *)
              RAISE E("str too long");
            END;
     (* m3wrapretraw           m3wrapargraw *)
            arg0 := MessyToUnix  (arg1,   arg2);
            result.unixPath := M3toC.CopyStoT(arg0);  (* m3wrapretconv *)
            result.checksum := arg2;         (* m3wrapoutconv *)
            IF result.checksum = 0 THEN      (* m3wrapoutcheck *)
              RAISE E("invalid checksum");
            END;
          FINALLY
            M3toC.FreeSharedS(str, arg1);     (* m3wrapfreearg *)
          END;
        END Name;
    

    29.5 More hints to the generator

    29.5.1 Features

    Feature Example Description
    multiretval %m3multiretval get_box; or %feature("modula3:multiretval") get_box; Let the denoted function return a RECORD rather than a plain value. This RECORD contains all arguments with "out" direction including the return value of the C function (if there is one). If more than one argument is "out" then the function must have the multiretval feature activated, but it is explicitly requested from the user to prevent mistakes.
    constnumeric %constnumeric(12) twelve; or %feature("constnumeric", "12") twelve; This feature can be used to tell Modula-3's back-end of SWIG the value of an identifier. This is necessary in the cases where it was defined by a non-trivial C expression. This feature is used by the -generateconst option. In future it may be generalized to other kind of values such as strings.

    29.5.2 Pragmas

    Pragma Example Description
    unsafe %pragma(modula3) unsafe="true"; Mark the raw interface modules as UNSAFE. This will be necessary in many cases.
    library %pragma(modula3) library="m3fftw"; Specifies the library name for the wrapper library to be created. It should be distinct from the name of the library to be wrapped.

    29.6 Remarks

    • The Modula-3 part of SWIG doesn't try to generate nicely formatted code. If you need to read the generated code, use m3pp to postprocess the Modula files.
    swig-3.0.12/Doc/Manual/Makefile0000664000175000017500000001214613042756442016023 0ustar williamwilliam# Makefile for generating the SWIG documentation # # Note that the htmldoc package needs to be installed. wkhtmltopdf patched with qt is also required # and can be installed from http://wkhtmltopdf.org/downloads.html. # # The .html files are first processed and updated with chapter numbering and anchor names # are added to the HTML headings using the python scripts. The htmldoc program is then # used to generate the single page HTML version of the documentation. # wkhtmltopdf is used to generate the pdf document from the single page html file. # HTML TIDY (package also known as tidy) is also required and is used as an aid to HTML # validation. # # Additional html validation can be done using the validate target. # Additional link checking can be done using the linkchecker1 and linkchecker2 target. # # Note the # and " are escaped HTMLDOC_OPTIONS = "--book --toclevels 4 --no-numbered --toctitle \"Table of Contents\" --title --titleimage swig16.png --linkcolor \#0000ff --linkstyle underline --size Universal --left 0.50in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 10.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --links --no-embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password \"\" --user-password \"\" --browserwidth 680" .PHONY: maketoc check generate all maintainer-clean validate test all: maketoc check generate maketoc: python maketoc.py # Use this to regenerate CCache.html should this ever be needed CCache.html: ../../CCache/ccache.yo yodl2html -o CCache.html ../../CCache/ccache.yo # Tabs in the html files will stop the build as wkhtmltopdf does not expand them correctly - replace them with the appropriate number of tabs # Use htmltidy to warn about some HTML errors. Note that it is not used to clean/tidy the HTML, # it is just used as a primitive HTML checker. # CCache.html is generated by yodl2html and has a few insignificant problems, so we don't put it through tidy check: all="index.html Sections.html `sed '/^#/d' chapters | grep -v CCache.html`" && for a in $$all; do echo "Check for tabs $$a" && if grep -P '\t' $$a; then echo "Please delete the tabs from the lines above" && exit 1; fi; done && for a in $$all; do echo "HTML tidy check $$a" && tidy -errors --gnu-emacs yes -quiet $$a; done; # Note wkhtmltopdf limitations for generating pdf docs: # 1)

    Text

    style links don't work and need changing to #

    Text

    # 2) Tabs in
     elements should be expanded to 8 spaces by default, but
    #     are expanded to just one space and css tab-size is not working.
    #  3) 
       elements do not always select a fixed-width font - try installing the
    #     Courier font to fix - these have been added to style.css.
    generate: SWIGDocumentation.html
    	wkhtmltopdf --version | grep "with patched qt" || (echo "wkhtmltopdf is not the patched qt version and so cannot be used - download it from http://wkhtmltopdf.org/downloads.html" && false)
    	wkhtmltopdf --margin-top 20mm --margin-bottom 20mm --margin-left 10mm --margin-right 10mm --header-font-size 6 --footer-font-size 6 --header-spacing 6 --footer-spacing 6 --header-center '[doctitle]' --footer-left '[subsection]' --footer-right '[page]' SWIGDocumentation.html SWIGDocumentation.pdf
    
    SWIGDocumentation.html: swightml.book
    	htmldoc --batch swightml.book || true
    	python fixstyle.py SWIGDocumentation.html
    
    swightml.book: chapters Sections.html
    	echo "#HTMLDOC 1.8.24" > swightml.book
    	echo -t html -f SWIGDocumentation.html $(HTMLDOC_OPTIONS) >> swightml.book
    	echo "Sections.html" >> swightml.book
    	cat chapters >> swightml.book
    
    maintainer-clean: clean-baks
    	rm -f swightml.book
    	rm -f SWIGDocumentation.html
    	rm -f SWIGDocumentation.pdf
    	rm -rf linkchecker-tmp
    
    clean-baks:
    	rm -f *.bak
    
    test:
    	grep "href=\".*\.html\"" index.html
    	grep "href=\".*\.html\"" Sections.html
    	all=`sed '/^#/d' chapters`; for a in $$all; do grep -l "href=\".*\.html\"" $$a; done;
    
    # Validating using the WDG offline validator - http://www.htmlhelp.com/tools/validator/offline/
    validate:
    	all=`sed '/^#/d' chapters`; for a in $$all; do validate --emacs $$a; done;
    
    # Link checking using linkchecker of the index.html only file (including anchors)
    linkchecker1:
    	@echo -----------------------------------------------------------------------
    	@echo Note linkchecker versions prior to 6.1 do not work properly wrt anchors
    	@echo -----------------------------------------------------------------------
    	linkchecker --config=./linkchecker.config --anchors index.html
    
    # Check for links which don't work including those generated from the individual .html files into SWIGDocumentation.html
    linkchecker2:
    	rm -rf linkchecker-tmp
    	mkdir linkchecker-tmp
    	cp SWIGDocumentation.html linkchecker-tmp
    	cp *.png linkchecker-tmp
    	(cd linkchecker-tmp && linkchecker --config=../linkchecker.config -F text --no-warnings SWIGDocumentation.html)
    
    swig-3.0.12/Doc/Manual/Python.html0000664000175000017500000055621313042756672016547 0ustar  williamwilliam
    
    
    SWIG and Python
    
    
    
    
    
    

    36 SWIG and Python

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Python. SWIG is compatible with most recent Python versions including Python 3.0 and Python 2.6, as well as older versions dating back to Python 2.0. For the best results, consider using Python 2.3 or newer.

    This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

    36.1 Overview

    To build Python extension modules, SWIG uses a layered approach in which parts of the extension module are defined in C and other parts are defined in Python. The C layer contains low-level wrappers whereas Python code is used to define high-level features.

    This layered approach recognizes the fact that certain aspects of extension building are better accomplished in each language (instead of trying to do everything in C or C++). Furthermore, by generating code in both languages, you get a lot more flexibility since you can enhance the extension module with support code in either language.

    In describing the Python interface, this chapter starts by covering the basics of configuration, compiling, and installing Python modules. Next, the Python interface to common C and C++ programming features is described. Advanced customization features such as typemaps are then described followed by a discussion of low-level implementation details.

    36.2 Preliminaries

    36.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    int fact(int n);
    

    The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a python extension, inserting the module init code. This .i file wraps the following simple C file:

    /* File: example.c */
    
    #include "example.h"
    
    int fact(int n) {
        if (n < 0){ /* This should probably return an error, but this is simpler */
            return 0;
        }
        if (n == 0) {
            return 1;
        }
        else {
            /* testing for overflow would be a good idea here */
            return n * fact(n-1);
        }
    }
    
    

    With the header file:

    /* File: example.h */
    
    int fact(int n);
    

    To build a Python module, run SWIG using the -python option:

    $ swig -python example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -python example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and a Python source file example.py. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module. The Python source file contains high-level support code. This is the file that you will import to use the module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The name of the Python file is derived from the module name specified with %module. If the module name is example, then a file example.py is created.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    36.2.2 Using distutils

    The preferred approach to building an extension module for python is to compile it with distutils, which comes with all recent versions of python (Distutils Docs).

    Distutils takes care of making sure that your extension is built with all the correct flags, headers, etc. for the version of Python it is run with. Distutils will compile your extension into a shared object file or DLL (.so on Linux, .pyd on Windows, etc). In addition, distutils can handle installing your package into site-packages, if that is desired. A configuration file (conventionally called: setup.py) describes the extension (and related python modules). The distutils will then generate all the right compiler directives to build it for you.

    Here is a sample setup.py file for the above example:

    #!/usr/bin/env python
    
    """
    setup.py file for SWIG example
    """
    
    from distutils.core import setup, Extension
    
    
    example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
    
    setup (name = 'example',
           version = '0.1',
           author      = "SWIG Docs",
           description = """Simple swig example from docs""",
           ext_modules = [example_module],
           py_modules = ["example"],
           )
    

    In this example, the line: example_module = Extension(....) creates an Extension module object, defining the name as _example, and using the source code files: example_wrap.c, generated by swig, and example.c, your original c source. The swig (and other python extension modules) tradition is for the compiled extension to have the name of the python portion, prefixed by an underscore. If the name of your python module is "example.py", then the name of the corresponding object file will be"_example.so"

    The setup call then sets up distutils to build your package, defining some meta data, and passing in your extension module object. Once this is saved as setup.py, you can build your extension with these commands:

    $ swig -python example.i
    $ python setup.py build_ext --inplace
    

    And a .so, or .pyd or... will be created for you. It will build a version that matches the python that you run the command with. Taking apart the command line:

    • python -- the version of python you want to build for
    • setup.py -- the name of your setup script (it can be called anything, but setup.py is the tradition)
    • build_ext -- telling distutils to build extensions
    • --inplace -- this tells distutils to put the extension lib in the current dir. Otherwise, it will put it inside a build hierarchy, and you'd have to move it to use it.

    The distutils have many other features, consult the python distutils docs for details.

    This same approach works on all platforms if the appropriate compiler is installed. (it can even build extensions to the standard Windows Python using MingGW)

    36.2.3 Hand compiling a dynamic module

    While the preferred approach to building an extension module is to use the distutils, some people like to integrate building extensions with a larger build system, and thus may wish to compile their modules without the distutils. To do this, you need to compile your program using commands like this (shown for Linux):

    $ swig -python example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
    $ gcc -shared example.o example_wrap.o -o _example.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/python directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module prefixed by an underscore. If the name of your module is "example", then the name of the corresponding object file should be "_example.so" or "_examplemodule.so". The name of the module is specified using the %module directive or the -module command line option.

    Compatibility Note: In SWIG-1.3.13 and earlier releases, module names did not include the leading underscore. This is because modules were normally created as C-only extensions without the extra Python support file (instead, creating Python code was supported as an optional feature). This has been changed in SWIG-1.3.14 and is consistent with other Python extension modules. For example, the socket module actually consists of two files; socket.py and _socket.so. Many other built-in Python modules follow a similar convention.

    36.2.4 Static linking

    An alternative approach to dynamic linking is to rebuild the Python interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Python involves finding the Python source, adding an entry to the Modules/Setup file, and rebuilding the interpreter using the Python Makefile. However, newer Python versions have changed the build process. You may need to edit the 'setup.py' file in the Python distribution instead.

    In earlier versions of SWIG, the embed.i library file could be used to rebuild the interpreter. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "embed.i"       // Include code for a static version of Python
    
    

    The embed.i library file includes supporting code that contains everything needed to rebuild Python. To rebuild the interpreter, you simply do something like this:

    $ swig -python -lembed.i example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/include/python2.7 \
            -I/usr/lib/python2.7/config-x86_64-linux-gnu \
            -I/usr/lib/python2.7/config \
            -L/usr/lib/python2.7/config -lpython2.7 -lm -ldl \
            -o mypython
    

    You will need to supply the same libraries that were used to build Python the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. Assuming this actually works, the new version of Python should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    Compatibility note: The embed.i library file is deprecated and has not been actively maintained for many years. Even though it appears to "work" with Python 2.7, no future support is guaranteed. If using static linking, you might want to rely on a different approach (perhaps using distutils).

    36.2.5 Using your module

    To use your module, simply use the Python import statement. If all goes well, you will be able to run this:

    $ python
    >>> import example
    >>> example.fact(4)
    24
    >>>
    

    A common error received by first-time users is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 2, in ?
        import _example
    ImportError: No module named _example
    

    If you get this message, it means that you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called _example.so. And don't forget the leading underscore (_).

    Another possible error is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: dynamic module does not define init function (init_example)
    >>>                                                               
    

    This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    Traceback (most recent call last):
      File "example.py", line 3, in ?
        import example
    ImportError: ./_example.so: undefined symbol: fact
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o _example.so
    

    If the foo library is compiled as a shared library, you might encounter the following problem when you try to use your module:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: libfoo.so: cannot open shared object file: No such file or directory
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib  \
          -o _example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Python, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib python
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    36.2.6 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Python interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly. This should be a non-issue if you're using distutils, as it takes care of all that for you. The following is included for historical reasons, and in case you need to compile on your own.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -python example.i
    $ g++ -O2 -fPIC -c example.cxx
    $ g++ -O2 -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ g++ -shared example.o example_wrap.o -o _example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -python example.i
    $ CC -c example.cxx
    $ CC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o _example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Python interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Python.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Python, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    36.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Python executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    On the Linux x86_64 platform (Opteron or EM64T), besides of the required compiler option -fPIC discussed above, you will need to be careful about the libraries you link with or the library path you use. In general, a Linux distribution will have two set of libraries, one for native x86_64 programs (under /usr/lib64), and another for 32 bits compatibility (under /usr/lib). Also, the compiler options -m32 and -m64 allow you to choose the desired binary format for your python extension.

    36.2.8 Building Python Extensions under Windows

    Building a SWIG extension to Python under Windows is roughly similar to the process used with Unix. Using the distutils, it is essentially identical. If you have the same version of the MS compiler that Python was built with (the python2.4 and python2.5 distributed by python.org are built with Visual Studio 2003), the standard python setup.py build should just work.

    As of python2.5, the distutils support building extensions with MingGW out of the box. Following the instruction here: Building Python extensions for Windows with only free tools should get you started.

    If you need to build it on your own, the following notes are provided:

    You will need to create a DLL that can be loaded into the interpreter. This section briefly describes the use of SWIG with Microsoft Visual C++. As a starting point, many of SWIG's examples include project files (.dsp files) for Visual C++ 6. These can be opened by more recent versions of Visual Studio. You might want to take a quick look at these examples in addition to reading this section.

    In Developer Studio, SWIG should be invoked as a custom build option. This is usually done as follows:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio keeps a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Python installation under "Additional include directories".
    • Define the symbol __WIN32__ under preprocessor options.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Python library file to your link libraries. For example "python21.lib". Also, set the name of the output file to match the name of your Python module, ie. _example.pyd - Note that _example.dll also worked with Python-2.4 and earlier.
    • Build your project.

    If all went well, SWIG will be automatically invoked whenever you build your project. Any changes made to the interface file will result in SWIG being automatically executed to produce a new version of the wrapper file.

    To run your new Python extension, simply run Python and use the import command as normal. For example :

    $ python
    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    If you get an ImportError exception when importing the module, you may have forgotten to include additional library files when you built your module. If you get an access violation or some kind of general protection fault immediately upon import, you have a more serious problem. This is often caused by linking your extension module against the wrong set of Win32 debug or thread libraries. You will have to fiddle around with the build options of project to try and track this down.

    A 'Debug' build of the wrappers requires a debug build of the Python interpreter. This normally requires building the Python interpreter from source, which is not a job for the feint-hearted. Alternatively you can use the 'Release' build of the Python interpreter with a 'Debug' build of your wrappers by defining the SWIG_PYTHON_INTERPRETER_NO_DEBUG symbol under the preprocessor options. Or you can ensure this macro is defined at the beginning of the wrapper code using the following in your interface file, where _MSC_VER ensures it is only used by the Visual Studio compiler:

    %begin %{
    #ifdef _MSC_VER
    #define SWIG_PYTHON_INTERPRETER_NO_DEBUG
    #endif
    %}
    

    Some users have reported success in building extension modules using Cygwin and other compilers. However, the problem of building usable DLLs with these compilers tends to be rather problematic. For the latest information, you may want to consult the SWIG Wiki.

    36.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Python interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, and so forth. This section briefly covers the essential aspects of this wrapping.

    36.3.1 Modules

    The SWIG %module directive specifies the name of the Python module. If you specify `%module example', then everything is wrapped into a Python 'example' module. Underneath the covers, this module consists of a Python source file example.py and a low-level extension module _example.so. When choosing a module name, make sure you don't use the same name as a built-in Python command or standard module name.

    36.3.2 Functions

    Global functions are wrapped as new Python built-in functions. For example,

    %module example
    int fact(int n);
    

    creates a built-in function example.fact(n) that works exactly like you think it does:

    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    36.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. However, the underlying mechanism is somewhat different than you might expect due to the way that Python assignment works. When you type the following in Python

    a = 3.4
    

    "a" becomes a name for an object containing the value 3.4. If you later type

    b = a
    

    then "a" and "b" are both names for the object containing the value 3.4. Thus, there is only one object containing 3.4 and "a" and "b" are both names that refer to it. This is quite different than C where a variable name refers to a memory location in which a value is stored (and assignment copies data into that location). Because of this, there is no direct way to map variable assignment in C to variable assignment in Python.

    To provide access to C global variables, SWIG creates a special object called `cvar' that is added to each SWIG generated module. Global variables are then accessed as attributes of this object. For example, consider this interface

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now look at the Python interface:

    >>> import example
    >>> # Print out value of a C global variable
    >>> print example.cvar.My_variable
    4
    >>> # Set the value of a C global variable
    >>> example.cvar.density = 0.8442
    >>> # Use in a math operation
    >>> example.cvar.density = example.cvar.density*1.10
    

    If you make an error in variable assignment, you will receive an error message. For example:

    >>> example.cvar.density = "Hello"
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: C variable 'density (double )'
    >>> 
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    If you would like to access variables using a name other than "cvar", it can be changed using the -globals option :

    $ swig -python -globals myvar example.i
    

    Some care is in order when importing multiple SWIG modules. If you use the "from <file> import *" style of importing, you will get a name clash on the variable `cvar' and you will only be able to access global variables from the last module loaded. To prevent this, you might consider renaming cvar or making it private to the module by giving it a name that starts with a leading underscore. SWIG does not create cvar if there are no global variables in a module.

    36.3.4 Constants and enums

    C/C++ constants are installed as Python objects containing the appropriate value. To create a constant, use #define, enum, or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Python---the name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    36.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Python. For example:

    >>> import example
    >>> f = example.fopen("junk", "w")
    >>> example.fputs("Hello World\n", f)
    >>> example.fclose(f)
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values using an especial python container object:

    >>> print f
    <Swig Object of type 'FILE *' at 0xb7d6f470>
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Python. Of course, that isn't much of a concern in this example.

    In older versions of SWIG (1.3.22 or older), pointers were represented using a plain string object. If you have an old package that still requires that representation, or you just feel nostalgic, you can always retrieve it by casting the pointer object to a string:

    >>> print str(f)
    _c0671108_p_FILE
    

    Also, if you need to pass the raw pointer value to some external python library, you can do it by casting the pointer object to an integer:

    >>> print int(f)
    135833352
    

    However, the inverse operation is not possible, i.e., you can't build a SWIG pointer object from a raw integer value.

    Note also that the '0' or NULL pointer is always represented by None, no matter what type swig is addressing. In the previous example, you can call:

    >>> example.fclose(None)
    

    and that will be equivalent to the following, but not really useful, C code:

    FILE *f = NULL;
    fclose(f);
    

    As much as you might be inclined to modify a pointer value directly from Python, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect, it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
        return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    36.3.6 Structures

    If you wrap a C structure, it is wrapped by a Python class. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    >>> v = example.Vector()
    >>> v.x = 3.5
    >>> v.y = 7.2
    >>> print v.x, v.y, v.z
    7.8 -4.5 0.0
    >>> 
    

    Similar access is provided for unions and the data members of C++ classes.

    If you print out the value of v in the above example, you will see something like this:

    >>> print v
    <C Vector instance at _18e31408_p_Vector>
    

    This object is actually a Python instance that has been wrapped around a pointer to the low-level C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object can be found in the .this attribute. For example:

    >>> print v.this
    _18e31408_p_Vector
    >>>
    

    Further details about the Python proxy class are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
        int  x[16];
    };
    

    If accessed in Python, you will see behavior like this:

    >>> b = example.Bar()
    >>> print b.x
    _801861a4_p_int
    >>> 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    >>> c = example.Bar()
    >>> c.x = b.x             # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    >>> b = Bar()
    >>> x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    >>> b = Bar()
    >>> b.f.a = 3               # Modify attribute of structure member
    >>> x = b.f                   
    >>> x.a = 3                 # Modifies the same structure
    

    36.3.7 C++ classes

    C++ classes are wrapped by Python classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Python like this:

    >>> l = example.List()
    >>> l.insert("Ale")
    >>> l.insert("Stout")
    >>> l.insert("Lager")
    >>> l.get(1)
    'Stout'
    >>> print l.length
    3
    >>>
    

    Class data members are accessed in the same manner as C structures.

    Static class members present a special problem for Python. Prior to Python-2.2, Python classes had no support for static methods and no version of Python supports static member variables in a manner that SWIG can utilize. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Python, the static member can be access in three different ways:

    >>> example.Spam_foo()    # Spam::foo()
    >>> s = example.Spam()
    >>> s.foo()               # Spam::foo() via an instance
    >>> example.Spam.foo()    # Spam::foo(). Python-2.2 only
    

    The first two methods of access are supported in all versions of Python. The last technique is only available in Python-2.2 and later versions.

    Static member variables are currently accessed as global variables. This means, they are accessed through cvar like this:

    >>> print example.cvar.Spam_bar
    7
    

    36.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Python classes that reflect the same inheritance structure. All of the usual Python utility functions work normally:

    >>> b = Bar()
    >>> instance(b, Foo)
    1
    >>> issubclass(Bar, Foo)
    1
    >>> issubclass(Foo, Bar)
    0
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    36.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(const Foo &x);// Pass by const reference
    void spam4(Foo x);       // Pass by value
    void spam5(Foo x[]);     // Array of objects
    

    In Python, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    >>> f = Foo()           # Create a Foo
    >>> spam1(f)            # Ok. Pointer
    >>> spam2(f)            # Ok. Reference
    >>> spam3(f)            # Ok. Const reference
    >>> spam4(f)            # Ok. Value.
    >>> spam5(f)            # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam6();
    Foo &spam7();
    Foo  spam8();
    const Foo &spam9();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam8) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Python will release this memory when the return value is garbage collected). The fourth case (spam9) which returns a const reference, in most of the cases will be treated as a returning value, and it will follow the same allocation/deallocation process.

    36.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Python in a straightforward manner:

    >>> foo(3)           # foo(int)
    >>> foo("Hello")     # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
        Foo();
        Foo(const Foo &);
        ...
    };
    

    you can write Python code like this:

    >>> f = Foo()          # Create a Foo
    >>> g = Foo(f)         # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    36.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
    
      Complex operator+=(const Complex &c) const;
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    >>> c = Complex(3, 4)
    >>> d = Complex(7, 8)
    >>> e = c + d
    >>> e.re()
    10.0
    >>> e.im()
    12.0
    >>> c += d
    >>> c.re()
    10.0
    >>> c.im()
    12.0
    
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Python. For instance, overloaded assignment operators don't map to Python semantics and will be ignored.

    36.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Python as follows:

    >>> import example
    >>> example.fact(3)
    6
    >>> v = example.Vector()
    >>> v.x = 3.4
    >>> print v.y
    0.0
    >>>
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
        int spam();
    }
    
    namespace Bar {
        int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    36.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
     ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Python:

    >>> import example
    >>> p = example.pairii(3, 4)
    >>> p.first
    3
    >>> p.second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    36.3.14 C++ Smart Pointers

    36.3.14.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Python in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    36.3.14.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Python, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Python, everything should just "work":

    >>> p = example.CreateFoo()          # Create a smart-pointer somehow
    >>> p.x = 3                          # Foo::x
    >>> p.bar()                          # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    >>> f = p.__deref__()     # Returns underlying Foo *
    

    36.3.15 C++ reference counted objects

    The C++ reference counted objects section contains Python examples of memory management using referencing counting.

    36.4 Further details on the Python class interface

    In the previous section, a high-level view of Python wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Python proxy classes. This provides a very natural Python interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    New in SWIG version 2.0.4: The use of Python proxy classes has performance implications that may be unacceptable for a high-performance library. The new -builtin option instructs SWIG to forego the use of proxy classes, and instead create wrapped types as new built-in Python types. When this option is used, the following section ("Proxy classes") does not apply. Details on the use of the -builtin option are in the Built-in Types section.

    36.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
        int x;
        int spam(int);
        ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
        return new Foo();
    }
    void delete_Foo(Foo *f) {
        delete f;
    }
    int Foo_x_get(Foo *f) {
        return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
        f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
        return f->spam(arg1);
    }
    

    These wrappers can be found in the low-level extension module (e.g., _example).

    Using these wrappers, SWIG generates a high-level Python proxy class (also known as a shadow class) like this (shown for Python 2.2):

    import _example
    
    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
        def __del__(self):
            if self.thisown:
                _example.delete_Foo(self.this)
        def spam(self, arg1):
            return _example.Foo_spam(self.this, arg1)
        x = property(_example.Foo_x_get, _example.Foo_x_set)
    

    This class merely holds a pointer to the underlying C++ object (.this) and dispatches methods and member variable access to that object using the low-level accessor functions. From a user's point of view, it makes the class work normally:

    >>> f = example.Foo()
    >>> f.x = 3
    >>> y = f.spam(5)
    

    The fact that the class has been wrapped by a real Python class offers certain advantages. For instance, you can attach new Python methods to the class and you can even inherit from it (something not supported by Python built-in types until Python 2.2).

    36.4.2 Built-in Types

    The -builtin option provides a significant performance improvement in the wrapped code. To understand the difference between proxy classes and built-in types, let's take a look at what a wrapped object looks like under both circumstances.

    When proxy classes are used, each wrapped object in python is an instance of a pure python class. As a reminder, here is what the __init__ method looks like in a proxy class:

    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
    

    When a Foo instance is created, the call to _example.new_Foo() creates a new C++ Foo instance; wraps that C++ instance inside an instance of a python built-in type called SwigPyObject; and stores the SwigPyObject instance in the 'this' field of the python Foo object. Did you get all that? So, the python Foo object is composed of three parts:

    • The python Foo instance, which contains...
    • ... an instance of struct SwigPyObject, which contains...
    • ... a C++ Foo instance

    When -builtin is used, the pure python layer is stripped off. Each wrapped class is turned into a new python built-in type which inherits from SwigPyObject, and SwigPyObject instances are returned directly from the wrapped methods. For more information about python built-in extensions, please refer to the python documentation:

    http://docs.python.org/extending/newtypes.html

    36.4.2.1 Limitations

    Use of the -builtin option implies a couple of limitations:

    • python version support:

      • Versions 2.5 and up are fully supported
      • Versions 2.3 and 2.4 are mostly supported; there are problems with director classes and/or sub-classing a wrapped type in python.
      • Versions older than 2.3 are not supported.
    • Some legacy syntax is no longer supported; in particular:

      • The functional interface is no longer exposed. For example, you may no longer call Whizzo.new_CrunchyFrog(). Instead, you must use Whizzo.CrunchyFrog().
      • Static member variables are no longer accessed through the 'cvar' field (e.g., Dances.cvar.FishSlap). They are instead accessed in the idiomatic way (Dances.FishSlap).
    • Wrapped types may not be raised as python exceptions. Here's why: the python internals expect that all sub-classes of Exception will have this struct layout:

      typedef struct {
          PyObject_HEAD
          PyObject *dict;
          PyObject *args;
          PyObject *message;
      } PyBaseExceptionObject;
      

      But swig-generated wrappers expect that all swig-wrapped classes will have this struct layout:

      typedef struct {
          PyObject_HEAD
          void *ptr;
          swig_type_info *ty;
          int own;
          PyObject *next;
          PyObject *dict;
      } SwigPyObject;
      

      There are workarounds for this. For example, if you wrap this class:

      class MyException {
      public:
          MyException (const char *msg_);
          ~MyException ();
      
          const char *what () const;
      
      private:
          char *msg;
      };
      

      ... you can define this python class, which may be raised as an exception:

      class MyPyException(Exception):
          def __init__(self, msg, *args):
              Exception.__init__(self, *args)
              self.myexc = MyException(msg)
          def what(self):
              return self.myexc.what()
      
    • Reverse binary operators (e.g., __radd__) are not supported.

      To illustrate this point, if you have a wrapped class called MyString, and you want to use instances of MyString interchangeably with native python strings, you can define an 'operator+ (const char*)' method :

      class MyString {
      public:
          MyString (const char *init);
          MyString operator+ (const char *other) const;
          ...
      };
      

      SWIG will automatically create an operator overload in python that will allow this:

      from MyModule import MyString
      
      mystr = MyString("No one expects")
      episode = mystr + " the Spanish Inquisition"
      

      This works because the first operand (mystr) defines a way to add a native string to itself. However, the following will not work:

      from MyModule import MyString
      
      mystr = MyString("Parrot")
      episode = "Dead " + mystr
      

      The above code fails, because the first operand -- a native python string -- doesn't know how to add an instance of MyString to itself.

    • If you have multiple SWIG modules that share type information (more info), the -builtin option requires a bit of extra discipline to ensure that base classes are initialized before derived classes. Specifically:

      • There must be an unambiguous dependency graph for the modules.

      • Module dependencies must be explicitly stated with %import statements in the SWIG interface file.

      As an example, suppose module A has this interface in A.i :

      %module "A";
      
      class Base {
      ...
      };
      

      If you want to wrap another module containing a class that inherits from A, this is how it would look :

      %module "B";
      
      %import "A.i"
      
      class Derived : public Base {
      ...
      };
      

      The import "A.i" statement is required, because module B depends on module A.

      As long as you obey these requirements, your python code may import the modules in any order :

      import B
      import A
      
      assert(issubclass(B.Derived, A.Base))
      

    36.4.2.2 Operator overloads and slots -- use them!

    The entire justification for the -builtin option is improved performance. To that end, the best way to squeeze maximum performance out of your wrappers is to use operator overloads. Named method dispatch is slow in python, even when compared to other scripting languages. However, python built-in types have a large number of "slots", analogous to C++ operator overloads, which allow you to short-circuit named method dispatch for certain common operations.

    By default, SWIG will translate most C++ arithmetic operator overloads into python slot entries. For example, suppose you have this class:

    class Twit {
    public:
        Twit operator+ (const Twit& twit) const;
    
        // Forward to operator+
        Twit add (const Twit& twit) const
        { return *this + twit; }
    };
    

    SWIG will automatically register operator+ as a python slot operator for addition. You may write python code like this:

    from MyModule import Twit
    
    nigel = Twit()
    emily = Twit()
    percival = nigel + emily
    percival = nigel.add(emily)
    

    The last two lines of the python code are equivalent, but the line that uses the '+' operator is much faster.

    In-place operators (e.g., operator+=) and comparison operators (operator==, operator<, etc.) are also converted to python slot operators. For a complete list of C++ operators that are automatically converted to python slot operators, refer to the file python/pyopers.swig in the SWIG library.

    Read about all of the available python slots here: http://docs.python.org/c-api/typeobj.html

    There are two ways to define a python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand.

    To dispatch to a statically defined function, use %feature("python:<slot>"), where <slot> is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods or PyBufferProcs. You may override (almost) all of these slots.

    Let's consider an example setting the tp_hash slot for the MyClass type. This is akin to providing a __hash__ method (for non-builtin types) to make a type hashable. The hashable type can then for example be added to a Python dict.

    %feature("python:tp_hash") MyClass "myHashFunc";
    
    class MyClass {
    public:
      long field1;
      long field2;
      ...
    };
    
    %{
    #if PY_VERSION_HEX >= 0x03020000
      static Py_hash_t myHashFunc(PyObject *pyobj)
    #else
      static long myHashFunc(PyObject *pyobj)
    #endif
      {
        MyClass *cobj;
        // Convert pyobj to cobj
        return (cobj->field1 * (cobj->field2 << 7));
      }
    %}
    

    If you examine the generated code, the supplied hash function will now be the function callback in the tp_hash slot for the builtin type for MyClass:

    static PyHeapTypeObject SwigPyBuiltin__MyClass_type = {
        ...
        (hashfunc) myHashFunc,       /* tp_hash */
        ...
    

    NOTE: It is the responsibility of the programmer (that's you!) to ensure that a statically defined slot function has the correct signature, the hashfunc typedef in this case.

    If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example:

    %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc;
    
    #if PY_VERSION_HEX < 0x03020000
      #define Py_hash_t long
    #endif
    
    class MyClass {
      public:
        Py_hash_t myHashFunc() const;
        ...
    };
    

    NOTE: Some python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshal the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate the chosen closure function.

    There is further information on %feature("python:slot") in the file python/pyopers.swig in the SWIG library.

    36.4.3 Memory management

    NOTE: Although this section refers to proxy objects, everything here also applies when the -builtin option is used.

    Associated with proxy object, is an ownership flag .thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Python interpreter will destroy the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Python automatically takes ownership of the result. For example:

    class Foo {
    public:
        Foo();
        Foo bar();
    };
    

    In Python:

    >>> f = Foo()
    >>> f.thisown
    1
    >>> g = f.bar()
    >>> g.thisown
    1
    

    On the other hand, when pointers are returned to Python, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
        ...
        Foo *spam();
        ...
    };
    

    >>> f = Foo()
    >>> s = f.spam()
    >>> print s.thisown
    0
    >>>
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Python to assume ownership and destroy it!

    A good way to indicate that ownership should be set for a returned pointer is to use the %newobject directive.

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
        int  value;
        Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Python, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    >>> f = example.Foo()
    >>> f.thisown
    1
    >>> example.cvar.head = f           
    >>> f.thisown
    0
    >>>
    

    In this case, C is now holding a reference to the object---you probably don't want Python to destroy it. Similarly, this occurs for members. For example:

    >>> f = example.Foo()
    >>> g = example.Foo()
    >>> f.thisown
    1
    >>> g.thisown
    1
    >>> f.next = g
    >>> g.thisown
    0
    >>>
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Python code:

    >>> v = Object()           # Create an object
    >>> n = Node()             # Create a node
    >>> n.set_value(v)         # Set value
    >>> v.thisown
    1
    >>> del v
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Python still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    >>> v.thisown = 0
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    36.4.4 Python 2.2 and classic classes

    SWIG makes every attempt to preserve backwards compatibility with older versions of Python to the extent that it is possible. However, in Python-2.2, an entirely new type of class system was introduced. This new-style class system offers many enhancements including static member functions, properties (managed attributes), and class methods. Details about all of these changes can be found on www.python.org and is not repeated here.

    To address differences between Python versions, SWIG currently emits dual-mode proxy class wrappers. In Python-2.2 and newer releases, these wrappers encapsulate C++ objects in new-style classes that take advantage of new features (static methods and properties). However, if these very same wrappers are imported into an older version of Python, old-style classes are used instead.

    This dual-nature of the wrapper code means that you can create extension modules with SWIG and those modules will work with all versions of Python ranging from Python-2.0 to the very latest release. Moreover, the wrappers take advantage of Python-2.2 features when available.

    For the most part, the interface presented to users is the same regardless of what version of Python is used. The only incompatibility lies in the handling of static member functions. In Python-2.2, they can be accessed via the class itself. In Python-2.1 and earlier, they have to be accessed as a global function or through an instance (see the earlier section).

    36.5 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Python. In particular, if a C++ class has been extended in Python (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Python implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Python and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Python code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    36.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
        Foo(int foo);
        virtual ~Foo();
        virtual void one();
        virtual void two();
    };
    
    class Bar: public Foo {
    public:
        virtual void three();
    };
    

    then at the python side you can define

    import mymodule
    
    class MyFoo(mymodule.Foo):
        def __init__(self, foo):
            mymodule.Foo.__init__(self, foo)
    #       super().__init__(foo) # Alternative construction for Python3
    
        def one(self):
            print "one from python"
    

    36.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Python proxy classes. The director classes store a pointer to their underlying Python object and handle various issues related to object ownership. Indeed, this is quite similar to the "this" and "thisown" members of the Python proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in Python via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Python were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Python. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Python, the Python API is used to call the method of the underlying Python object (after which the usual virtual method resolution in Python automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Python, unless there's a good reason not to. The reason for this is simple: Python has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Python proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Python method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Python object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Python, SWIG creates an instance of the original C++ class and assigns it to .this. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Python.

    36.5.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Python instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the Python object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special __disown__() method of the proxy class. After calling this method, the .thisown flag is set to zero, and the director class increments the reference count of the Python object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Python object remain, the Python object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    To help ensure that no references to the Python object remain after calling __disown__(), this method returns a weak reference to the Python object. Weak references are only available in Python versions 2.1 and higher, so for older versions you must explicitly delete all references. Here is an example:

    class Foo {
    public:
        ...
    };
    class FooContainer {
    public:
        void addFoo(Foo *);
        ...
    };
    

    >>> c = FooContainer()
    >>> a = Foo().__disown__()
    >>> c.addFoo(a)
    >>> b = Foo()
    >>> b = b.__disown__()
    >>> c.addFoo(b)
    >>> c.addFoo(Foo().__disown__())
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point. Note that no hard references to the Foo objects remain in Python.

    36.5.4 Exception unrolling

    With directors routing method calls to Python, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Python. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
        if ($error != NULL) {
            throw Swig::DirectorMethodException();
        }
    }
    

    This code will check the Python error state after each method call from a director into Python, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the Python error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in Python, travels up to C++ through a proxy class, and then back into Python via a director method. If an exception occurs in Python at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
        try { $action }
        catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Python error state is still set when Swig::DirectorMethodException is thrown, Python will register the exception as soon as the C wrapper function returns.

    36.5.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Python and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Python. Relative to the speed of Python execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Python in order to ensure that the method does not have an extended Python implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Python objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Python objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Python.

    36.5.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    36.5.7 Miscellaneous

    Director typemaps for STL classes are in place, and hence you should be able to use std::vector, std::string, etc., as you would any other type.

    Note: The director typemaps for return types based in const references, such as

    class Foo {
    …
        virtual const int& bar();
    …
    };
    

    will work only for simple call scenarios. Usually the resulting code is neither thread or reentrant safe. Hence, the user is advised to avoid returning const references in director methods. For example, the user could modify the method interface to use lvalue return types, wherever possible, for example

    class Foo {
    …
        virtual int bar();
    …
    };
    

    If that is not possible, the user should avoid enabling the director feature for reentrant, recursive or threaded member methods that return const references.

    36.6 Common customization features

    The last section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve your the interface to an extension module.

    36.6.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Python, but there may be no easy way to call it. For example, you might get errors like this:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_a_4__double
    

    The problem here is that there is no easy way to construct and manipulate a suitable double [4][4] value to use. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Python, you could then write code like this:

    >>> a = new_mat44()
    >>> mat44_set(a, 0, 0, 1.0)
    >>> mat44_set(a, 1, 1, 1.0)
    >>> mat44_set(a, 2, 2, 1.0)
    ...
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to clean this up using Python code, typemaps, and other customization features as covered in later sections.

    36.6.2 Adding additional Python code

    If writing support code in C isn't enough, it is also possible to write code in Python. This code gets inserted in to the .py file created by SWIG. One use of Python code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %pythoncode %{
    def set_transform(im, x):
        a = new_mat44()
        for i in range(4):
            for j in range(4):
                mat44_set(a, i, j, x[i][j])
        _example.set_transform(im, a)
        free_mat44(a)
    %}
    

    In this example, set_transform() provides a high-level Python interface built on top of low-level helper functions. For example, this code now seems to work:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this whole scheme for wrapping the two-dimension array argument is rather ad-hoc. Besides, shouldn't a Python list or a Numeric Python array just work normally? We'll get to those examples soon enough. For now, think of this example as an illustration of what can be done without having to rely on any of the more advanced customization features.

    There is also %pythonbegin which is another directive very similar to %pythoncode, but generates the given Python code at the beginning of the .py file. This directive works in the same way as %pythoncode, except the code is copied just after the SWIG banner (comment) at the top of the file, before any real code. This provides an opportunity to add your own description in a comment near the top of the file as well as Python imports that have to appear at the top of the file, such as "from __future__ import" statements.

    The following shows example usage for Python 2.6 to use print as it can in Python 3, that is, as a function instead of a statement:

    %pythonbegin %{
    # This module provides wrappers to the Whizz Bang library
    %}
    
    %pythonbegin %{
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    %}
    

    which can be seen when viewing the first few lines of the generated .py file:

    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 2.0.11
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.
    
    # This module provides wrappers to the Whizz Bang library
    
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    
    

    When using %pythoncode and %pythonbegin you generally want to make sure that the block is delimited by %{ and %}. If you delimit it with { and } then any lines with a leading # will be handled by SWIG as preprocessor directives, when you probably meant them as Python comments. Prior to SWIG 3.0.3, invalid preprocessor directives were silently ignored, so generally using the wrong delimiters resulted in such comments not appearing in the generated output (though a comment starting with a valid preprocessor directive could cause problems, for example: # error handling). SWIG 3.0.3 and later report an error for invalid preprocessor directives, so you may have to update existing interface files to delimit blocks of Python code correctly.

    As an alternative to providing a block containing Python code, you can include python code from a file. The code is inserted exactly as in the file, so this avoids any issues with the SWIG preprocessor. It's a good approach if you have a non-trivial chunk of Python code to insert. To use this feature you specify a filename in double quotes, for example:

    %pythoncode "somecode.py"
    

    Sometimes you may want to replace or modify the wrapper function that SWIG creates in the proxy .py file. The Python module in SWIG provides some features that enable you to do this. First, to entirely replace a proxy function you can use %feature("shadow"). For example:

    %module example
    
    // Rewrite bar() python code
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        #do something before
        $action
        #do something after
    %}
        
    class Foo {
    public:
        int bar(int x);
    };
    

    where $action will be replaced by the call to the C/C++ proper method.

    Often the proxy function created by SWIG is fine, but you simply want to add code to it without touching the rest of the generated function body. For these cases SWIG provides the pythonprepend and pythonappend features which do exactly as their names suggest. The pythonprepend feature will insert its value at the beginning of the proxy function, and pythonappend will insert code at the end of the proxy, just before the return statement.

    %module example
    
    // Add python code to bar() 
    
    %feature("pythonprepend") Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %feature("pythonappend") Foo::bar(int) %{
        #do something after C++ call
    %}
    
        
    class Foo {
    public:
        int bar(int x);
    };
    

    Notes: Usually the pythonappend and pythonprepend features are safer to use than the shadow feature. Also, from SWIG version 1.3.28 you can use the directive forms %pythonappend and %pythonprepend as follows:

    %module example
    
    // Add python code to bar() 
    
    %pythonprepend Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar(int) %{
        #do something after C++ call
    %}
    
        
    class Foo {
    public:
        int bar(int x);
    };
    

    Note that when the underlying C++ method is overloaded, there is only one proxy Python method for multiple C++ methods. In this case, only one of parsed methods is examined for the feature. You are better off specifying the feature without the argument list to ensure it will get used, as it will then get attached to all the overloaded C++ methods. For example:

    %module example
    
    // Add python code to bar()
    
    %pythonprepend Foo::bar %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar %{
        #do something after C++ call
    %}
    
    
    class Foo {
    public:
        int bar(int x);
        int bar();
    };
    

    The same applies for overloaded constructors.

    36.6.3 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods--at least in the Python interface. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Python

    >>> v = example.Vector(2, 3, 4)
    >>> print v
    Vector(2, 3, 4)
    >>>
    

    %extend can be used for many more tasks than this. For example, if you wanted to overload a Python operator, you might do this:

    %extend Vector {
      Vector __add__(Vector *other) {
        Vector v;
        v.x = $self->x + other->x;
        v.y = $self->y + other->y;
        v.z = $self->z + other->z;
        return v;
      }
    };
    

    Use it like this:

    >>> import example
    >>> v = example.Vector(2, 3, 4)
    >>> w = example.Vector(10, 11, 12)
    >>> print v+w
    Vector(12, 14, 16)
    >>> 
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Python interface.

    36.6.4 Exception handling with %exception

    If a C or C++ function throws an error, you may want to convert that error into a Python exception. To do this, you can use the %exception directive. %exception simply lets you rewrite part of the generated wrapper code to include an error check.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        PyErr_SetString(PyExc_MemoryError, "Not enough memory");
        SWIG_fail;
      }
    }
    void *malloc(size_t nbytes);
    

    In Python,

    >>> a = example.malloc(2000000000)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    MemoryError: Not enough memory
    >>>
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        PyErr_SetString(PyExc_RuntimeError, err_message());
        SWIG_fail;
      }
    }
    

    No declaration name is given to %exception, it is applied to all wrapper functions.

    C++ exceptions are also easy to handle. For example, you can write code like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        PyErr_SetString(PyExc_IndexError, const_cast<char*>(e.what()));
        SWIG_fail;
      }
    }
    
    class Base {
    public:
      Foo *getitem(int index);      // Exception handled added
      ...
    };
    

    When raising a Python exception from C, use the PyErr_SetString() function as shown above followed by SWIG_fail. The following exception types can be used as the first argument.

    PyExc_ArithmeticError
    PyExc_AssertionError
    PyExc_AttributeError
    PyExc_EnvironmentError
    PyExc_EOFError
    PyExc_Exception
    PyExc_FloatingPointError
    PyExc_ImportError
    PyExc_IndexError
    PyExc_IOError
    PyExc_KeyError
    PyExc_KeyboardInterrupt
    PyExc_LookupError
    PyExc_MemoryError
    PyExc_NameError
    PyExc_NotImplementedError
    PyExc_OSError
    PyExc_OverflowError
    PyExc_RuntimeError
    PyExc_StandardError
    PyExc_SyntaxError
    PyExc_SystemError
    PyExc_TypeError
    PyExc_UnicodeError
    PyExc_ValueError
    PyExc_ZeroDivisionError
    

    SWIG_fail is a C macro which when called within the context of SWIG wrapper function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then return from the wrapper function so that the Python interpreter can raise the Python exception. This macro should always be called after setting a Python error in code snippets, such as typemaps and %exception, that are ultimately generated into the wrapper function.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    36.7 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings, binary data, and arrays. This chapter discusses the common techniques for solving these problems.

    36.7.1 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Python, this allows you to pass simple values. For example:

    >>> a = add(3, 4)
    >>> print a
    7
    >>> b = sub(7, 4)
    >>> print b
    3
    >>>
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Python, a mutated parameter shows up as a return value. For example:

    >>> a = negate(3)
    >>> print a
    -3
    >>>
    

    Note: Since most primitive Python objects are immutable, it is not possible to perform in-place modification of a Python object passed as a parameter.

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Python, the function will return multiple values.

    bytes, success = send_message("Hello World")
    if not success:
        print "Whoa!"
    else:
        print "Sent", bytes
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Python:

    >>> r, c = get_dimensions(m)
    

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    may not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    36.7.2 Simple pointers

    If you must work with simple pointers such as int * or double * and you don't want to use typemaps.i, consider using the cpointer.i library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Python, you would use the functions like this:

    >>> result = new_intp()
    >>> print result
    _108fea8_p_int
    >>> add(3, 4, result)
    >>> print intp_value(result)
    7
    >>>
    

    If you replace %pointer_functions() by %pointer_class(type, name), the interface is more class-like.

    >>> result = intp()
    >>> add(3, 4, result)
    >>> print result.value()
    7
    

    See the SWIG Library chapter for further details.

    36.7.3 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
        int i, sum = 0;
        for (i = 0; i < nitems; i++) {
            sum += first[i];
        }
        return sum;
    }
    

    To wrap this into Python, you need to pass an array pointer as the first argument. A simple way to do this is to use the carrays.i library file. For example:

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Python:

    >>> a = intArray(10000000)         # Array of 10-million integers
    >>> for i in xrange(10000):        # Set some values
    ...     a[i] = i
    >>> sumitems(a, 10000)
    49995000
    >>>
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    36.7.4 String handling

    If a C function has an argument of char *, then a Python string can be passed as input. For example:

    // C
    void foo(char *s);
    
    # Python
    >>> foo("Hello")
    

    When a Python string is passed as a parameter, the C function receives a pointer to the raw data contained in the string. Since Python strings are immutable, it is illegal for your program to change the value. In fact, doing so will probably crash the Python interpreter.

    If your program modifies the input parameter or uses it to return data, consider using the cstring.i library file described in the SWIG Library chapter.

    When functions return a char *, it is assumed to be a NULL-terminated string. Data is copied into a new Python string and returned.

    If your program needs to work with binary data, you can use a typemap to expand a Python string into a pointer/length argument pair. As luck would have it, just such a typemap is already defined. Just do this:

    %apply (char *STRING, int LENGTH) { (char *data, int size) };
    ...
    int parity(char *data, int size, int initial);
    

    Now in Python:

    >>> parity("e\x09ffss\x00\x00\x01\nx", 0)
    

    If you need to return binary data, you might use the cstring.i library file. The cdata.i library can also be used to extra binary data from arbitrary pointers.

    36.7.5 Default arguments

    C++ default argument code generation is documented in the main Default arguments section. There is also an optional Python specific feature that can be used called the python:cdefaultargs feature flag. By default, SWIG attempts to convert C++ default argument values into Python values and generates code into the Python layer containing these values. For example:

    struct CDA {
      int fff(int a = 1, bool b = false);
    };
    

    From Python this can be called as follows:

    >>> CDA().fff()        # C++ layer receives a=1 and b=false
    >>> CDA().fff(2)       # C++ layer receives a=2 and b=false
    >>> CDA().fff(3, True) # C++ layer receives a=3 and b=true
    

    The default code generation in the Python layer is:

    class CDA(object):
        ...
        def fff(self, a=1, b=False):
            return _default_args.CDA_fff(self, a, b)
    

    Adding the feature:

    %feature("python:cdefaultargs") CDA::fff;
    struct CDA {
      int fff(int a = 1, bool b = false);
    

    results in identical behaviour when called from Python, however, it results in different code generation:

    class CDA(object):
        ...
        def fff(self, *args):
            return _default_args.CDA_fff(self, *args)
    

    The default arguments are obtained in the C++ wrapper layer instead of the Python layer. Some code generation modes are quite different, eg -builtin and -fastproxy, and are unaffected by python:cdefaultargs as the default values are always obtained from the C++ layer.

    Note that not all default arguments can be converted into a Python equivalent. When SWIG does not convert them, it will generate code to obtain them from the C++ layer as if python:cdefaultargs was specified. This will happen if just one argument cannot be converted into a Python equivalent. This occurs typically when the argument is not fully numeric, such as int(1):

    struct CDA {
      int fff(int a = int(1), bool b = false);
    };
    

    Compatibility Note: SWIG-3.0.6 introduced the python:cdefaultargs feature. Versions of SWIG prior to this varied in their ability to convert C++ default values into equivalent Python default argument values.

    36.8 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Python C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Python interface or if you want to elevate your guru status.

    36.8.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Python to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) PyLong_AsLong($input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type PyObject *.

    When this example is compiled into a Python module, it operates as follows:

    >>> from example import *
    >>> fact(6)
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = (int) PyLong_AsLong($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "Expected a nonnegative value.");
        SWIG_fail;
      }
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) PyLong_AsLong($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Python object. This allows the function to be used like this (notice how the length parameter is omitted):

    >>> example.count('e', 'Hello World')
    1
    >>>
    

    36.8.2 Python typemaps

    The previous section illustrated an "in" typemap for converting Python objects to C. A variety of different typemap methods are defined by the Python module. For example, to convert a C integer back into a Python object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = PyInt_FromLong((long) $1);
    }
    

    A detailed list of available methods can be found in the "Typemaps" chapter.

    However, the best source of typemap information (and examples) is probably the Python module itself. In fact, all of SWIG's default type handling is defined by typemaps. You can view these typemaps by looking at the files in the SWIG library. Just take into account that in the latest versions of swig (1.3.22+), the library files are not very pristine clear for the casual reader, as they used to be. The extensive use of macros and other ugly techniques in the latest version produce a very powerful and consistent python typemap library, but at the cost of simplicity and pedagogic value.

    To learn how to write a simple or your first typemap, you better take a look at the SWIG library version 1.3.20 or so.

    36.8.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Python.

    $input

    A PyObject * holding a raw Python object with an argument or variable value.

    $result

    A PyObject * that holds the result to be returned to Python.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Python name of the wrapper function being created.

    36.8.4 Useful Python Functions

    When you write a typemap, you usually have to work directly with Python objects. The following functions may prove to be useful.

    Python Integer Functions

    PyObject *PyInt_FromLong(long l);
    long      PyInt_AsLong(PyObject *);
    int       PyInt_Check(PyObject *);
    

    Python Floating Point Functions

    PyObject *PyFloat_FromDouble(double);
    double    PyFloat_AsDouble(PyObject *);
    int       PyFloat_Check(PyObject *);
    

    Python String Functions

    PyObject *PyString_FromString(char *);
    PyObject *PyString_FromStringAndSize(char *, lint len);
    int       PyString_Size(PyObject *);
    char     *PyString_AsString(PyObject *);
    int       PyString_Check(PyObject *);
    

    Python List Functions

    PyObject *PyList_New(int size);
    int       PyList_Size(PyObject *list);
    PyObject *PyList_GetItem(PyObject *list, int i);
    int       PyList_SetItem(PyObject *list, int i, PyObject *item);
    int       PyList_Insert(PyObject *list, int i, PyObject *item);
    int       PyList_Append(PyObject *list, PyObject *item);
    PyObject *PyList_GetSlice(PyObject *list, int i, int j);
    int       PyList_SetSlice(PyObject *list, int i, int , PyObject *list2);
    int       PyList_Sort(PyObject *list);
    int       PyList_Reverse(PyObject *list);
    PyObject *PyList_AsTuple(PyObject *list);
    int       PyList_Check(PyObject *);
    

    Python Tuple Functions

    PyObject *PyTuple_New(int size);
    int       PyTuple_Size(PyObject *);
    PyObject *PyTuple_GetItem(PyObject *, int i);
    int       PyTuple_SetItem(PyObject *, int i, PyObject *item);
    PyObject *PyTuple_GetSlice(PyObject *t, int i, int j);
    int       PyTuple_Check(PyObject *);
    

    Python Dictionary Functions

    PyObject *PyDict_New();
    int       PyDict_Check(PyObject *);
    int       PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
    int       PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
    int       PyDict_DelItem(PyObject *p, PyObject *key);
    int       PyDict_DelItemString(PyObject *p, char *key);
    PyObject* PyDict_Keys(PyObject *p);
    PyObject* PyDict_Values(PyObject *p);
    PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
    PyObject* PyDict_GetItemString(PyObject *p, const char *key);
    int       PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
    Py_ssize_t PyDict_Size(PyObject *p);
    int       PyDict_Update(PyObject *a, PyObject *b);
    int       PyDict_Merge(PyObject *a, PyObject *b, int override);
    PyObject* PyDict_Items(PyObject *p);
    

    Python File Conversion Functions

    PyObject *PyFile_FromFile(FILE *f);
    FILE     *PyFile_AsFile(PyObject *);
    int       PyFile_Check(PyObject *);
    

    Abstract Object Interface

    write me
    

    36.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "python.swg" and "typemaps.i" in the SWIG library.

    36.9.1 Converting Python list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Python list object to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int size = PyList_Size($input);
        int i = 0;
        $1 = (char **) malloc((size+1)*sizeof(char *));
        for (i = 0; i < size; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $1[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($1);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $1[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    // This cleans up the char ** array we malloc'd before the function call
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}
    
    

    When this module is compiled, the wrapped C function now operates as follows :

    >>> from argv import *
    >>> print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John
    5
    

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    36.9.2 Expanding a Python object into multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Python list as the char **argv. This allows the function to be used from Python as follows:

    >>> foo(4, ["foo", "bar", "spam", "1"])
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example:

    %typemap(in) (int argc, char **argv) {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int i;
        $1 = PyList_Size($input);
        $2 = (char **) malloc(($1+1)*sizeof(char *));
        for (i = 0; i < $1; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $2[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($2);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $2[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    %typemap(freearg) (int argc, char **argv) {
      free((char *) $2);
    }
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Python object.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    >>> foo(["foo", "bar", "spam", "1"])
    

    If your function is overloaded in C++, for example:

    int foo(int argc, char **argv);
    int foo();
    

    don't forget to also provide a suitable typecheck typemap for overloading such as:

    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char **argv) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    If you don't you'll get an error message along the lines of:

    Traceback (most recent call last):
      File "runme.py", line 3, in >module<
        example.foo(["foo", "bar", "spam", "1"])
    NotImplementedError: Wrong number or type of arguments for overloaded function 'foo'.
      Possible C/C++ prototypes are:
        foo(int, char **)
        foo()
    

    36.9.3 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in arguments rather than in the return value of a function. For example:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      ... Do a bunch of stuff ...
      *out1 = result1;
      *out2 = result2;
      return status;
    }
    

    A typemap can be used to handle this case as follows :

    %module outarg
    
    // This tells SWIG to treat an double * argument with name 'OutValue' as
    // an output value.  We'll append the value to the current result which 
    // is guaranteed to be a List object by SWIG.
    
    %typemap(argout) double *OutValue {
      PyObject *o, *o2, *o3;
      o = PyFloat_FromDouble(*$1);
      if ((!$result) || ($result == Py_None)) {
        $result = o;
      } else {
        if (!PyTuple_Check($result)) {
          PyObject *o2 = $result;
          $result = PyTuple_New(1);
          PyTuple_SetItem($result, 0, o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3, 0, o);
        o2 = $result;
        $result = PySequence_Concat(o2, o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
      }
    }
    
    int spam(double a, double b, double *OutValue, double *OutValue);
    
    

    The typemap works as follows. First, a check is made to see if any previous result exists. If so, it is turned into a tuple and the new output value is concatenated to it. Otherwise, the result is returned normally. For the sample function spam(), there are three output values--meaning that the function will return a 3-tuple of the results.

    As written, the function must accept 4 arguments as input values, last two being pointers to doubles. If these arguments are only used to hold output values (and have no meaningful input value), an additional typemap can be written. For example:

    %typemap(in, numinputs=0) double *OutValue(double temp) {
      $1 = &temp;
    }
    
    

    By specifying numinputs=0, the input value is ignored. However, since the argument still has to be set to some meaningful value before calling C, it is set to point to a local variable temp. When the function stores its output value, it will simply be placed in this local variable. As a result, the function can now be used as follows:

    >>> a = spam(4, 5)
    >>> print a
    (0, 2.45, 5.0)
    >>> x, y, z = spam(4, 5)
    >>>
    

    36.9.4 Mapping Python tuples into small arrays

    In some applications, it is sometimes desirable to pass small arrays of numbers as arguments. For example :

    extern void set_direction(double a[4]);       // Set direction vector
    

    This too, can be handled used typemaps as follows :

    // Grab a 4 element array as a Python 4-tuple
    %typemap(in) double[4](double temp[4]) {   // temp[4] becomes a local variable
      int i;
      if (PyTuple_Check($input)) {
        if (!PyArg_ParseTuple($input, "dddd", temp, temp+1, temp+2, temp+3)) {
          PyErr_SetString(PyExc_TypeError, "tuple must have 4 elements");
          SWIG_fail;
        }
        $1 = &temp[0];
      } else {
        PyErr_SetString(PyExc_TypeError, "expected a tuple.");
        SWIG_fail;
      }
    }
    
    

    This allows our set_direction function to be called from Python as follows :

    >>> set_direction((0.5, 0.0, 1.0, -0.25))
    

    Since our mapping copies the contents of a Python tuple into a C array, such an approach would not be recommended for huge arrays, but for small structures, this approach works fine.

    36.9.5 Mapping sequences to C arrays

    Suppose that you wanted to generalize the previous example to handle C arrays of different sizes. To do this, you might write a typemap as follows:

    // Map a Python sequence into any sized C double array
    %typemap(in) double[ANY](double temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        SWIG_fail;
      }
      if (PyObject_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Expecting a sequence with $1_dim0 elements");
        SWIG_fail;
      }
      for (i =0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          SWIG_fail;
        }
        temp[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      $1 = &temp[0];
    }
    

    In this case, the variable $1_dim0 is expanded to match the array dimensions actually used in the C code. This allows the typemap to be applied to types such as:

    void foo(double x[10]);
    void bar(double a[4], double b[8]);
    

    Since the above typemap code gets inserted into every wrapper function where used, it might make sense to use a helper function instead. This will greatly reduce the amount of wrapper code. For example:

    %{
    static int convert_darray(PyObject *input, double *ptr, int size) {
      int i;
      if (!PySequence_Check(input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        return 0;
      }
      if (PyObject_Length(input) != size) {
        PyErr_SetString(PyExc_ValueError, "Sequence size mismatch");
        return 0;
      }
      for (i =0; i < size; i++) {
        PyObject *o = PySequence_GetItem(input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          return 0;
        }
        ptr[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      return 1;
    }
    %}
    
    %typemap(in) double [ANY](double temp[$1_dim0]) {
      if (!convert_darray($input, temp, $1_dim0)) {
        SWIG_fail;
      }
      $1 = &temp[0];
    }
    

    36.9.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Python object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is the bitwise-or of several flag values including SWIG_POINTER_EXCEPTION and SWIG_POINTER_DISOWN. The first flag makes the function raise an exception on type error. The second flag additionally steals ownership of an object. Returns 0 on success and -1 on error.

    PyObject *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Python pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Python should take ownership of the pointer.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    PyObject *obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    Although the pointer handling functions are primarily intended for manipulating low-level pointers, both functions are fully aware of Python proxy classes. Specifically, SWIG_ConvertPtr() will retrieve a pointer from any object that has a this attribute. In addition, SWIG_NewPointerObj() can automatically generate a proxy class object (if applicable).

    36.10 Docstring Features

    Using docstrings in Python code is becoming more and more important and more tools are coming on the scene that take advantage of them, everything from full-blown documentation generators to class browsers and popup call-tips in Python-aware IDEs. Given the way that SWIG generates the proxy code by default, your users will normally get something like "function_name(*args)" in the popup calltip of their IDE which is next to useless when the real function prototype might be something like this:

    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    The features described in this section make it easy for you to add docstrings to your modules, functions and methods that can then be used by the various tools out there to make the programming experience of your users much simpler.

    36.10.1 Module docstring

    Python allows a docstring at the beginning of the .py file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    36.10.2 %feature("autodoc")

    As alluded to above SWIG will generate all the function and method proxy wrappers with just "*args" (or "*args, **kwargs" if the -keyword option is used) for a parameter list and will then sort out the individual parameters in the C wrapper code. This is nice and simple for the wrapper code, but makes it difficult to be programmer and tool friendly as anyone looking at the .py file will not be able to find out anything about the parameters that the functions accept.

    But since SWIG does know everything about the function it is possible to generate a docstring containing the parameter types, names and default values. Since many of the docstring tools are adopting a standard of recognizing if the first thing in the docstring is a function prototype then using that instead of what they found from introspection, then life is good once more.

    SWIG's Python module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause a docstring to be generated that includes the name of the function, parameter names, default values if any, and return type if any. There are also four levels for autodoc controlled by the value given to the feature, %feature("autodoc", "level"). The four values for level are covered in the following sub-sections.

    36.10.2.1 %feature("autodoc", "0")

    When level "0" is used then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    Then Python code like this will be generated:

    def function_name(*args, **kwargs):
        """function_name(x, y, foo=None, bar=None) -> bool"""
        ...
    

    36.10.2.2 %feature("autodoc", "1")

    When level "1" is used then the parameter types will be used in the autodoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Python user. Pointer, reference and const info is removed if the associated type is has an associated Python type (%rename's are thus shown correctly). This works most of the time, otherwise a C/C++ type will be used. See the next section for the "docstring" feature for tweaking the docstrings to your liking. Given the example above, then turning on the parameter types with level "1" will result in Python code like this:

    def function_name(*args, **kwargs):
        """function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool"""
        ...
    

    36.10.2.3 %feature("autodoc", "2")

    Level "2" results in the function prototype as per level "0". In addition, a line of documentation is generated for each parameter using numpydoc style. Using the previous example, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    Note that the documentation for each parameter is sourced from the "doc" typemap which by default shows the C/C++ type rather than the simplified Python type name described earlier for level "1". Typemaps can of course change the output for any particular type, for example the int x parameter:

    %feature("autodoc", "2");
    %typemap("doc") int x "$1_name (C++ type: $1_type) -- Input $1_name dimension"
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    resulting in

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x (C++ type: int) -- Input x dimension
        y: int
        foo: Foo *
        bar: Bar *
    
        """
    

    36.10.2.4 %feature("autodoc", "3")

    Level "3" results in the function prototype as per level "1" but also contains the same additional line of documentation for each parameter as per level "2". Using our earlier example again, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    36.10.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Python programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);
    

    36.10.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together. If the docstring is all on a single line then it is output like this::

    """This is the docstring"""
    

    Otherwise, to aid readability it is output like this:

    """
    This is a multi-line docstring
    with more than one line.
    """
    

    36.11 Python Packages

    Python has concepts of modules and packages. Modules are separate units of code and may be grouped together to form a package. Packages may be nested, that is they may contain subpackages. This leads to tree-like hierarchy, with packages as intermediate nodes and modules as leaf nodes.

    The hierarchy of Python packages/modules follows the hierarchy of *.py files found in a source tree (or, more generally, in the Python path). Normally, the developer creates new module by placing a *.py file somewhere under Python path; the module is then named after that *.py file. A package is created by placing an __init__.py file within a directory; the package is then named after that directory. For example, the following source tree:

    mod1.py
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    defines the following Python packages and modules:

    pkg1            # package
    pkg1.pkg2       # package
    mod1            # module
    pkg1.mod2       # module
    pkg1.pkg2.mod3  # module
    

    The purpose of an __init__.py file is two-fold. First, the existence of __init__.py in a directory informs the Python interpreter that this directory contains a Python package. Second, the code in __init__.py is loaded/executed automatically when the package is initialized (when it or its submodule/subpackage gets import'ed). By default, SWIG generates proxy Python code – one *.py file for each *.i interface. The __init__.py files, however, are not generated by SWIG. They should be created by other means. Both files (module *.py and __init__.py) should be installed in appropriate destination directories in order to obtain a desirable package/module hierarchy.

    Python3 adds another option for packages with PEP 0420 (implicit namespace packages). Implicit namespace packages no longer use __init__.py files. SWIG generated Python modules support implicit namespace packages. See 36.11.5 Implicit Namespace Packages for more information.

    If you place a SWIG generated module into a Python package then there are details concerning the way SWIG searches for the wrapper module that you may want to familiarize yourself with.

    The way Python defines its modules and packages impacts SWIG users. Some users may need to use special features such as the package option in the %module directive or import related command line options. These are explained in the following sections.

    36.11.1 Setting the Python package

    Using the package option in the %module directive allows you to specify a Python package that the module will be in when installed.

    %module(package="wx") xrc
    

    This is useful when the .i file is %imported by another .i file. By default SWIG will assume that the importer is able to find the importee with just the module name, but if they live in separate Python packages then this won't work. However if the importee specifies what its package is with the %module option then the Python code generated for the importer will use that package name when importing the other module and in base class declarations, etc..

    SWIG assumes that the package option provided to %module together with the module name (that is, wx.xrc in the above example) forms a fully qualified (absolute) name of a module (in Python terms). This is important especially for Python 3, where absolute imports are used by default. It's up to you to place the generated module files (.py, .so) in appropriate subdirectories. For example, if you have an interface file foo.i with:

    %module(package="pkg1.pkg2") foo
    

    then the resulting directory layout should be

    pkg1/
    pkg1/__init__.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/foo.py        # (generated by SWIG)
    pkg1/pkg2/_foo.so       # (shared library built from C/C++ code generated by SWIG)
    

    36.11.2 Absolute and relative imports

    Suppose, we have the following hierarchy of files:

    pkg1/
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    Let the contents of pkg1/pkg2/mod3.py be

    class M3: pass
    

    We edit pkg1/mod2.py and want to import module pkg1/pkg2/mod3.py in order to derive from class M3. We can write appropriate Python code in several ways, for example:

    1. Using "import <>" syntax with absolute package name:

      # pkg1/mod2.py
      import pkg1.pkg2.mod3
      class M2(pkg1.pkg2.mod3.M3): pass
      
    2. Using "import <>" syntax with package name relative to pkg1 (only in Python 2.7 and earlier):

      # pkg1/mod2.py
      import pkg2.mod3
      class M2(pkg2.mod3.M3): pass
      
    3. Using "from <> import <>" syntax (relative import syntax, only in Python 2.5 and later):

      # pkg1/mod2.py
      from .pkg2 import mod3
      class M2(mod3.M3): pass
      
    4. Other variants, for example the following construction in order to have the pkg2.mod3.M3 symbol available in mod2 as in point 2 above (but now under Python 3):

      # pkg1/mod2.py
      from . import pkg2
      from .pkg2 import mod3
      class M2(pkg2.mod3.M3): pass
      

    Now suppose we have mod2.i with

    // mod2.i
    %module (package="pkg1") mod2
    %import "mod3.i"
    // ...
    

    and mod3.i with

    // mod3.i
    %module (package="pkg1.pkg2") mod3
    // ...
    

    By default, SWIG would generate mod2.py proxy file with import directive as in point 1. This can be changed with the -relativeimport command line option. The -relativeimport instructs SWIG to organize imports as in point 2 (for Python < 2.7.0) or as in point 4 for Python 2.7.0 and newer. This is a check done at the time the module is imported. In short, if you have mod2.i and mod3.i as above, then without -relativeimport SWIG will write

    import pkg1.pkg2.mod3
    

    to mod2.py proxy file, and with -relativeimport it will write

    from sys import version_info
    if version_info >= (2, 7, 0):
        from . import pkg2
        import pkg1.pkg2.mod3
    else:
        import pkg2.mod3
    del version_info
    

    You should avoid using relative imports and use absolute ones whenever possible. There are some cases, however, when relative imports may be necessary. The first example is, when some (legacy) Python code refers entities imported by proxy files generated by SWIG, and it assumes that the proxy file uses relative imports. Second case is, when one puts import directives in __init__.py to import symbols from submodules or subpackages and the submodule depends on other submodules (discussed later).

    36.11.3 Enforcing absolute import semantics

    As you may know, there is an incompatibility in import semantics (for the import <> syntax) between Python 2 and 3. In Python 2.4 and earlier it is not clear whether

    import foo
    

    refers to a top-level module or to another module inside the current package. In Python 3 it always refers to a top-level module (see PEP 328). To instruct Python 2.5 through 2.7 to use new semantics (that is import foo is interpreted as absolute import), one has to put the following line

    from __future__ import absolute_import
    

    at the very beginning of his proxy *.py file. In SWIG, it may be accomplished with %pythonbegin directive as follows:

    %pythonbegin %{
    from __future__ import absolute_import
    %}
    

    36.11.4 Importing from __init__.py

    Imports in __init__.py are handy when you want to populate a package's namespace with names imported from other modules. In SWIG based projects this approach may also be used to split large pieces of code into smaller modules, compile them in parallel and then re-assemble everything at runtime by importing submodules' contents in __init__.py, for example.

    Unfortunately import directives in __init__.py may cause problems, especially if they refer to a package's submodules. This is caused by the way Python initializes packages. If you spot problems with imports from __init__.py try using -relativeimport option. Below we explain in detail one issue, for which the -relativeimport workaround may be helpful.

    Consider the following example (Python 3):

    pkg1/__init__.py        # (empty)
    pkg1/pkg2/__init__.py   # (imports something from bar.py)
    pkg1/pkg2/foo.py
    pkg1/pkg2/bar.py        # (imports foo.py)
    

    If the file contents are:

    • pkg1/pkg2/__init__.py:

      # pkg1/pkg2/__init__.py
      from .bar import Bar
      
    • pkg1/pkg2/foo.py:

      # pkg1/pkg2/foo.py
      class Foo: pass
      
    • pkg1/pkg2/bar.py:

      # pkg1/pkg2/bar.py
      import pkg1.pkg2.foo
      class Bar(pkg1.pkg2.foo.Foo): pass
      

    Now if one simply used import pkg1.pkg2, it will usually fail:

    >>> import pkg1.pkg2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "./pkg1/pkg2/__init__.py", line 2, in <module>
        from .bar import Bar
      File "./pkg1/pkg2/bar.py", line 3, in <module>
        class Bar(pkg1.pkg2.foo.Foo): pass
    AttributeError: 'module' object has no attribute 'pkg2'
    

    Surprisingly, if we execute the import pkg1.pkg2 directive for the second time, it succeeds. The reason seems to be following: when Python spots the from .bar import Bar directive in pkg1/pkg2/__init__.py it starts loading pkg1/pkg2/bar.py. This module imports pkg1.pkg2.foo in turn and tries to use pkg1.pkg2.foo.Foo, but the package pkg1 is not fully initialized yet (the initialization procedure is actually in progress) and it seems like the effect of the already seen import pkg1.pkg2.pkg3.foo is "delayed" or ignored. Exactly the same may happen to a proxy module generated by SWIG.

    One workaround for this case is to use a relative import in pkg1/pkg2/bar.py. If we change bar.py to be:

    from .pkg3 import foo
    class Bar(foo.Foo): pass
    

    or

    from . import pkg3
    from .pkg3 import foo
    class Bar(pkg3.foo.Foo): pass
    

    then the example works again. With SWIG, you need to enable the -relativeimport option in order to have the above workaround in effect (note, that the Python 2 case also needs the -relativeimport workaround).

    36.11.5 Implicit Namespace Packages

    Python 3.3 introduced PEP 0420 which implements implicit namespace packages. In a nutshell, implicit namespace packages remove the requirement of an __init__.py file and allow packages to be split across multiple PATH elements. For example:

    /fragment1/pkg1/mod1.py
    /fragment2/pkg1/mod2.py
    /fragment3/pkg1/mod3.py
    

    If PYTHONPATH is set to "/fragment1:/fragment2:/fragment3", then mod1, mod2 and mod3 will be part of pkg1. This allows for splitting of packages into separate pieces. This can be useful for SWIG generated wrappers in the following way.

    Suppose you create a SWIG wrapper for a module called robin. The SWIG generated code consists of two files robin.py and _robin.so. You wish to make these modules part of a subpackage (brave.sir). With implicit namespace packages you can place these files in the following configurations:

    Using PYTHONPATH="/some/path"

    /some/path/brave/sir/robin.py
    /some/path/brave/sir/_robin.so
    

    Using PYTHONPATH="/some/path:/some/other/path"

    /some/path/brave/sir/robin.py
    /some/other/path/brave/sir/_robin.so
    

    Finally suppose that your pure python code is stored in a .zip file or some other way (database, web service connection, etc). Python can load the robin.py module using a custom importer. But the _robin.so module will need to be located on a file system. Implicit namespace packages make this possible. For example, using PYTHONPATH="/some/path/foo.zip:/some/other/path"

    Contents of foo.zip

    brave/
    brave/sir/
    brave/sir/robin.py
    

    File system contents

    /some/other/path/brave/sir/_robin.so
    

    Support for implicit namespace packages was added to python-3.3. The zipimporter requires python-3.5.1 or newer to work with subpackages.

    Compatibility Note: Support for implicit namespace packages was added in SWIG-3.0.9.

    36.11.6 Searching for the wrapper module

    When SWIG creates wrappers from an interface file, say foo.i, two Python modules are created. There is a pure Python module module (foo.py) and C/C++ code which is built and linked into a dynamically (or statically) loaded low-level module _foo (see the Preliminaries section for details). So, the interface file really defines two Python modules. How these two modules are loaded is covered next.

    The pure Python module needs to load the C/C++ module in order to link to the wrapped C/C++ methods. To do this it must make some assumptions about what package the C/C++ module may be located in. The approach the pure Python module uses to find the C/C++ module is as follows:

    1. The pure Python module, foo.py, tries to load the C/C++ module, _foo, from the same package foo.py is located in. The package name is determined from the __name__ attribute given to foo.py by the Python loader that imported foo.py. If foo.py is not in a package then _foo is loaded as a global module.

    2. If the above import of _foo results in an ImportError being thrown, then foo.py makes a final attempt to load _foo as a global module.

    The Python code implementing the loading logic described above is quite complex to handle multiple versions of Python, but it can be replaced with custom code. This is not recommended unless you understand the full intricacies of importing Python modules. The custom code can be specified by setting the moduleimport option of the %module directive with the appropriate import code. For example:

    %module(moduleimport="import _foo") foo
    

    The special variable $module will also be expanded into the low-level C/C++ module name, _foo in the case above. When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define MODULEIMPORT
    "
    print 'Loading low-level module $module'
    import $module
    print 'Module has loaded'
    "
    %enddef
    
    %module(moduleimport=MODULEIMPORT) foo
    

    Now let's consider an example using the SWIG default loading logic. Suppose foo.i is compiled into foo.py and _foo.so. Assuming /dir is on PYTHONPATH, then the two modules can be installed and used in the following ways:

    36.11.6.1 Both modules in the same package

    Both modules are in one package:

    /dir/package/foo.py
    /dir/package/__init__.py
    /dir/package/_foo.so
    

    And imported with

    from package import foo
    

    36.11.6.2 Split modules

    The pure python module is in a package and the C/C++ module is global:

    /dir/package/foo.py
    /dir/package/__init__.py
    /dir/_foo.so
    

    And imported with

    from package import foo
    

    36.11.6.3 Both modules are global

    Both modules are global:

    /dir/foo.py
    /dir/_foo.so
    

    And imported with

    import foo
    

    If _foo is statically linked into an embedded Python interpreter, then it may or may not be in a Python package. This depends in the exact way the module was loaded statically. The above search order will still be used for statically loaded modules. So, one may place the module either globally or in a package as desired.

    36.11.6.4 Statically linked C modules

    It is strongly recommended to use dynamically linked modules for the C portion of your pair of Python modules. If for some reason you still need to link the C module of the pair of Python modules generated by SWIG into your interpreter, then this section provides some details on how this impacts the pure Python modules ability to locate the other part of the pair. Please also see the Static Linking section.

    When Python is extended with C code the Python interpreter needs to be informed about details of the new C functions that have been linked into the executable. The code to do this is created by SWIG and is automatically called in the correct way when the module is dynamically loaded. However when the code is not dynamically loaded (because it is statically linked) Then the initialization method for the module created by SWIG is not called automatically and the Python interpreter has no idea that the new SWIG C module exists.

    Before Python 3, one could simply call the init method created by SWIG which would have normally been called when the shared object was dynamically loaded. The specific name of this method is not given here because statically linked modules are not encouraged with SWIG (Static Linking). However one can find this init function in the C file generated by SWIG.

    If you are really keen on static linking there are two ways to initialize the SWIG generated C module with the init method. Which way you use depends on what version of Python your module is being linked with. Python 2 and Python 3 treat this init function differently. And the way they treat it affects how the pure Python module will be able to locate the C module.

    The details concerning this are covered completly in the documentation for Python itself. Links to the relavent sections follow:

    There are two keys things to understand. The first is that in Python 2 the init() function returns void. In Python 3 the init() function returns a PyObject * which points to the new module. Secondly, when you call the init() method manually, you are the Python importer. So, you determine which package the C module will be located in.

    So, if you are using Python 3 it is important that you follow what is described in the Python documentation linked above. In particular, you can't simply call the init() function generated by SWIG and cast the PyObject pointer it returns over the side. If you do then Python 3 will have no idea that your C module exists and the pure Python half of your wrapper will not be able to find it. You need to register your module with the Python interpreter as described in the Python docs.

    With Python 2 things are somewhat more simple. In this case the init function returns void. Calling it will register your new C module as a global module. The pure Python part of the SWIG wrapper will be able to find it because it tries both the pure Python module it is part of and the global module. If you wish not to have the statically linked module be a global module then you will either need to refer to the Python documentation on how to do this (remember you are now the Python importer) or use dynamic linking.

    36.12 Python 3 Support

    SWIG is able to support Python 3.0. The wrapper code generated by SWIG can be compiled with both Python 2.x or 3.0. Further more, by passing the -py3 command line option to SWIG, wrapper code with some Python 3 specific features can be generated (see below subsections for details of these features). The -py3 option also disables some incompatible features for Python 3, such as -classic.

    There is a list of known-to-be-broken features in Python 3:

    • No more support for FILE* typemaps, because PyFile_AsFile has been dropped in Python 3.
    • The -apply command line option is removed and generating code using apply() is no longer supported.

    The following are Python 3.0 new features that are currently supported by SWIG.

    36.12.1 Function annotation

    The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this:

      def foo(self, bar : "int"=0) -> "void" : ...
    

    Also, even if without passing SWIG the -py3 option, the parameter list still could be generated:

      def foo(self, bar=0): ...
    

    But for overloaded function or method, the parameter list would fallback to *args or self, *args, and **kwargs may be append depend on whether you enabled the keyword argument. This fallback is due to all overloaded functions share the same function in SWIG generated proxy class.

    For detailed usage of function annotation, see PEP 3107.

    36.12.2 Buffer interface

    Buffer protocols were revised in Python 3. SWIG also gains a series of new typemaps to support buffer interfaces. These typemap macros are defined in pybuffer.i, which must be included in order to use them. By using these typemaps, your wrapped function will be able to accept any Python object that exposes a suitable buffer interface.

    For example, the get_path() function puts the path string into the memory pointed to by its argument:

    void get_path(char *s);
    

    Then you can write a typemap like this: (the following example is applied to both Python 3.0 and 2.6, since the bytearray type is backported to 2.6.

    %include <pybuffer.i>
    %pybuffer_mutable_string(char *str);
    void get_path(char *s);
    

    And then on the Python side the wrapped get_path could be used in this way:

    >>> p = bytearray(10)
    >>> get_path(p)
    >>> print(p)
    bytearray(b'/Foo/Bar/\x00')
    

    The macros defined in pybuffer.i are similar to those in cstring.i:

    %pybuffer_mutable_binary(parm, size_parm)

    The macro can be used to generate a typemap which maps a buffer of an object to a pointer provided by parm and a size argument provided by size_parm. For example:

    %pybuffer_mutable_binary(char *str, size_t size);
    ...
    int snprintf(char *str, size_t size, const char *format, ...);
    

    In Python:

    >>> buf = bytearray(6)
    >>> snprintf(buf, "Hello world!")
    >>> print(buf)
    bytearray(b'Hello\x00')
    >>> 
    

    %pybuffer_mutable_string(parm)

    This typemap macro requires the buffer to be a zero terminated string, and maps the pointer of the buffer to parm. For example:

    %pybuffer_mutable_string(char *str);
    ...
    size_t make_upper(char *str);
    

    In Python:

    >>> buf = bytearray(b'foo\x00')
    >>> make_upper(buf)
    >>> print(buf)
    bytearray(b'FOO\x00')
    >>>
    

    Both %pybuffer_mutable_binary and %pybuffer_mutable_string require the provided buffer to be mutable, eg. they can accept a bytearray type but can't accept an immutable byte type.

    %pybuffer_binary(parm, size_parm)

    This macro maps an object's buffer to a pointer parm and a size size_parm. It is similar to %pybuffer_mutable_binary, except the %pybuffer_binary an accept both mutable and immutable buffers. As a result, the wrapped function should not modify the buffer.

    %pybuffer_string(parm)

    This macro maps an object's buffer as a string pointer parm. It is similar to %pybuffer_mutable_string but the buffer could be both mutable and immutable. And your function should not modify the buffer.

    36.12.3 Abstract base classes

    By including pyabc.i and using the -py3 command line option when calling SWIG, the proxy classes of the STL containers will automatically gain an appropriate abstract base class. For example, the following SWIG interface:

    %include <pyabc.i>
    %include <std_map.i>
    %include <std_list.i>
    
    namespace std {
      %template(Mapii) map<int, int>;
      %template(IntList) list<int>;
    }
    

    will generate a Python proxy class Mapii inheriting from collections.MutableMap and a proxy class IntList inheriting from collections.MutableSequence.

    pyabc.i also provides a macro %pythonabc that could be used to define an abstract base class for your own C++ class:

    %pythonabc(MySet, collections.MutableSet);
    

    For details of abstract base class, please see PEP 3119.

    36.12.4 Byte string output conversion

    By default, any byte string (char* or std::string) returned from C or C++ code is decoded to text as UTF-8. This decoding uses the surrogateescape error handler under Python 3.1 or higher -- this error handler decodes invalid byte sequences to high surrogate characters in the range U+DC80 to U+DCFF. As an example, consider the following SWIG interface, which exposes a byte string that cannot be completely decoded as UTF-8:

    %module example
    
    %include <std_string.i>
    
    %inline %{
    
    const char* non_utf8_c_str(void) {
            return "h\xe9llo w\xc3\xb6rld";
    }
    
    %}
    

    When this method is called from Python 3, the return value is the following text string:

    >>> s = example.non_utf8_c_str()
    >>> s
    'h\udce9llo wörld'
    

    Since the C string contains bytes that cannot be decoded as UTF-8, those raw bytes are represented as high surrogate characters that can be used to obtain the original byte sequence:

    >>> b = s.encode('utf-8', errors='surrogateescape')
    >>> b
    b'h\xe9llo w\xc3\xb6rld'
    

    One can then attempt a different encoding, if desired (or simply leave the byte string as a raw sequence of bytes for use in binary protocols):

    >>> b.decode('latin-1')
    'héllo wörld'
    

    Note, however, that text strings containing surrogate characters are rejected with the default strict codec error handler. For example:

    >>> with open('test', 'w') as f:
    ...     print(s, file=f)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce9' in position 1: surrogates not allowed
    

    This requires the user to check most strings returned by SWIG bindings, but the alternative is for a non-UTF8 byte string to be completely inaccessible in Python 3 code.

    For more details about the surrogateescape error handler, please see PEP 383.

    In some cases, users may wish to instead handle all byte strings as bytes objects in Python 3. This can be accomplished by adding SWIG_PYTHON_STRICT_BYTE_CHAR to the generated code:

    %module char_to_bytes
    %begin %{
    #define SWIG_PYTHON_STRICT_BYTE_CHAR
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    This will modify the behavior so that only Python 3 bytes objects will be accepted and converted to a C/C++ string, and any string returned from C/C++ will be converted to a bytes object in Python 3:

    >>> from char_to_bytes import *
    >>> charstring(b"hi") # Byte string
    b'hi'
    >>> charstring("hi")  # Unicode string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    Note that in Python 2, defining SWIG_PYTHON_STRICT_BYTE_CHAR has no effect, since strings in Python 2 are equivalent to Python 3 bytes objects. However, there is a similar capability to force unicode-only handling for wide characters C/C++ strings (wchar_t * or std::wstring types) in Python 2. By default, in Python 2 both strings and unicode strings are converted to C/C++ wide strings, and returned wide strings are converted to a Python unicode string. To instead only convert unicode strings to wide strings, users can add SWIG_PYTHON_STRICT_UNICODE_WCHAR to the generated code:

    %module wchar_to_unicode
    %begin %{
    #define SWIG_PYTHON_STRICT_UNICODE_WCHAR
    %}
    
    wchar_t *wcharstring(wchar_t *s) {
      return s;
    }
    

    This ensures that only unicode strings are accepted by wcharstring in both Python 2 and Python 3:

    >>> from wchar_to_unicode import *
    >>> wcharstring(u"hi") # Unicode string
    u'hi'
    >>> wcharstring(b"hi") # Byte string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'wchar_t *'
    

    By defining both SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR, Python wrapper code can support overloads taking both std::string (as Python bytes) and std::wstring (as Python unicode).

    36.12.5 Python 2 Unicode

    A Python 3 string is a Unicode string so by default a Python 3 string that contains Unicode characters passed to C/C++ will be accepted and converted to a C/C++ string (char * or std::string types). A Python 2 string is not a unicode string by default and should a Unicode string be passed to C/C++ it will fail to convert to a C/C++ string (char * or std::string types). The Python 2 behavior can be made more like Python 3 by defining SWIG_PYTHON_2_UNICODE when compiling the generated C/C++ code. By default when the following is wrapped:

    %module unicode_strings
    char *charstring(char *s) {
      return s;
    }
    

    An error will occur when using Unicode strings in Python 2:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    When the SWIG_PYTHON_2_UNICODE macro is added to the generated code:

    %module unicode_strings
    %begin %{
    #define SWIG_PYTHON_2_UNICODE
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    Unicode strings will be successfully accepted and converted from UTF-8, but note that they are returned as a normal Python 2 string:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    'hi'
    >>>
    

    Note that defining both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at the same time is not allowed, since the first is allowing unicode conversion and the second is explicitly prohibiting it.

    swig-3.0.12/Doc/Manual/Javascript.html0000664000175000017500000010233513042756672017364 0ustar williamwilliam

    26 SWIG and Javascript

    This chapter describes SWIG's support of Javascript. It does not cover SWIG basics, but only information that is specific to this module.

    26.1 Overview

    Javascript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. Its arguably the most popular language for web development. Javascript has gone beyond being a browser-based scripting language and with node.js, it is also used as a backend development language.

    Native Javascript extensions can be used for applications that embed a web-browser view or that embed a Javascript engine (such as node.js). Extending a general purpose web-browser is not possible as this would be a severe security issue.

    SWIG Javascript currently supports JavascriptCore, the Javascript engine used by Safari/Webkit, and v8, which is used by Chromium and node.js.

    WebKit is a modern browser implementation available as open-source which can be embedded into an application. With node-webkit there is a platform which uses Google's Chromium as Web-Browser widget and node.js for javascript extensions.

    26.2 Preliminaries

    26.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;

    To build a Javascript module, run SWIG using the -javascript option and a desired target engine -jsc, -v8, or -node. The generator for node is essentially delegating to the v8 generator and adds some necessary preprocessor definitions.

    $ swig -javascript -jsc example.i

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -javascript -jsc example.i

    The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.

    The API headers for V8 >= 4.3.0 define constants which SWIG can use to determine the V8 version it is compiling for. For versions < 4.3.0, you need to specify the V8 version when running SWIG. This is specified as a hex constant, but the constant is read as pairs of decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't represent components > 99, but this constant is only useful for V8 < 4.3.0, and no V8 versions from that era had a component > 99. For example:

    $ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i

    If you're targetting V8 >= 4.3.0, you would just run swig like so:

    $ swig -c++ -javascript -v8 example.i

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named example the corresponding initializer for JavascriptCore would be

    bool example_initialize(JSGlobalContextRef context, JSObjectRef *exports)

    and for v8:

    void example_initialize(v8::Handle<v8::Object> exports)

    Note: be aware that v8 has a C++ API, and thus, the generated modules must be compiled as C++.

    26.2.2 Running Tests and Examples

    The configuration for tests and examples currently supports Linux and Mac only and not MinGW (Windows) yet.

    The default interpreter is node.js as it is available on all platforms and convenient to use.

    Running the examples with JavascriptCore requires libjavascriptcoregtk-1.0 to be installed, e.g., under Ubuntu with

    $ sudo apt-get install libjavascriptcoregtk-1.0-dev

    Running with V8 requires libv8:

    $ sudo apt-get install libv8-dev

    Examples can be run using

    $ make check-javascript-examples ENGINE=jsc

    ENGINE can be node, jsc, or v8.

    The test-suite can be run using

    $ make check-javascript-test-suite ENGINE=jsc

    You can specify a specific V8 version for running the examples and tests

    $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8

    26.2.3 Known Issues

    At the moment, the Javascript generators pass all tests syntactically, i.e., the generated source code compiles. However, there are still remaining runtime issues.

    • Default optional arguments do not work for all targeted interpreters

    • Multiple output arguments do not work for JSC

    • C89 incompatibily: the JSC generator might still generate C89 violating code

    • long long is not supported

    • %native is not supported

    • Javascript callbacks are not supported

    • instanceOf does not work under JSC

    The primary development environment has been Linux (Ubuntu 12.04). Windows and Mac OS X have been tested sporadically. Therefore, the generators might have more issues on those platforms. Please report back any problem you observe to help us improving this module quickly.

    26.3 Integration

    This chapter gives a short introduction how to use a native Javascript extension: as a node.js module, and as an extension for an embedded Webkit.

    26.3.1 Creating node.js Extensions

    To install node.js you can download an installer from their web-site for Mac OS X and Windows. For Linux you can either build the source yourself and run sudo checkinstall or keep to the (probably stone-age) packaged version. For Ubuntu there is a PPA available.

    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs

    As v8 is written in C++ and comes as a C++ library it is crucial to compile your module using the same compiler flags as used for building v8. To make things easier, node.js provides a build tool called node-gyp.

    You have to install it using npm:

    $ sudo npm install -g node-gyp

    node-gyp expects a configuration file named binding.gyp which is basically in JSON format and conforms to the same format that is used with Google's build-tool gyp.

    binding.gyp:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    First create the wrapper using SWIG:

    $ swig -javascript -node -c++ example.i

    Then run node-gyp build to actually create the module:

    $ node-gyp build

    This will create a build folder containing the native module. To use the extension you need to 'require' it in your Javascript source file:

    require("./build/Release/example")

    A more detailed explanation is given in the Examples section.

    26.3.1.1 Troubleshooting

    • 'module' object has no attribute 'script_main'

    This error happens when gyp is installed as a distribution package. It seems to be outdated. Removing it resolves the problem.

    $ sudo apt-get remove gyp

    26.3.2 Embedded Webkit

    Webkit is pre-installed on Mac OS X and available as a library for GTK.

    26.3.2.1 Mac OS X

    There is general information about programming with WebKit on Apple Developer Documentation. Details about Cocoa programming are not covered here.

    An integration of a native extension 'example' would look like this:

    #import "appDelegate.h"
    
    extern bool example_initialize(JSGlobalContextRef context, JSObjectRef* exports);
    
    
    @implementation ExampleAppDelegate
    
    @synthesize webView;
    
    - (void)addGlobalObject:(JSContextRef) context:(NSString *)objectName:(JSObjectRef) theObject {
      JSObjectRef global = JSContextGetGlobalObject(context);
      JSStringRef objectJSName = JSStringCreateWithCFString( (CFStringRef) objectName )
      if ( objectJSName != NULL ) {
        JSObjectSetProperty(context, global, objectJSName, theObject, kJSPropertyAttributeReadOnly, NULL);
        JSStringRelease( objectJSName );
      }
    }
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    
      // Start a webview with the bundled index.html file
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *url =  [NSString stringWithFormat: @"file://%@/Contents/Assets/index.html", path];
    
      WebFrame *webframe = [webView mainFrame];
      JSGlobalContextRef context = [webframe globalContext];
    
      JSObjectRef example;
      example_initialize(context, &example);
      [self addGlobalObject:context:@"example":example]
    
      JSObjectSetProperty(context, global, JSStringRef propertyName, example, JSPropertyAttributes attributes, NULL);
    
      [ [webView mainFrame] loadRequest:
        [NSURLRequest requestWithURL: [NSURL URLWithString:url] ]
      ];
    }
    
    @end

    26.3.2.2 GTK

    There is general information about programming GTK at GTK documentation and in the GTK tutorial, and for Webkit there is a Webkit GTK+ API Reference.

    An integration of a native extension 'example' would look like this:

    #include <gtk/gtk.h>
    #include <webkit/webkit.h>
    
    extern bool example_initialize(JSGlobalContextRef context);
    
    int main(int argc, char* argv[])
    {
      // Initialize GTK+
      gtk_init(&argc, &argv);
    
      ...
    
      // Create a browser instance
      WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
      WebFrame *webframe = webkit_web_view_get_main_frame(webView);
      JSGlobalContextRef context = webkit_web_frame_get_global_context(webFrame);
      JSObjectRef global = JSContextGetGlobalObject(context);
    
      JSObjectRef exampleModule;
      example_initialize(context, &exampleModule);
      JSStringRef jsName = JSStringCreateWithUTF8CString("example");
      JSObjectSetProperty(context, global, jsName, exampleModule, kJSPropertyAttributeReadOnly, NULL);
      JSStringRelease(jsName);
    
      ...
    
      // Load a web page into the browser instance
      webkit_web_view_load_uri(webView, "http://www.webkitgtk.org/");
    
      ...
    
      // Run the main GTK+ event loop
      gtk_main();
    
      return 0;
    }

    26.3.3 Creating Applications with node-webkit

    To get started with node-webkit there is a very informative set of wiki pages.

    Similar to node.js, node-webkit is started from command line within a node.js project directory. Native extensions are created in the very same way as for node.js, except that a customized gyp derivate has to be used: nw-gyp.

    A simple example would have the following structure:

    - package.json
    - app.html
    - app.js
    - node_modules
      / example
      ... (as known from node.js)
    

    The configuration file essentially conforms to node.js syntax. It has some extras to configure node-webkit. See the Manifest specification for more details.

    package.json:

    {
      "name": "example",
      "main": "app.html",
      "window": {
        "show": true,
        "width": 800,
        "height": 600
      }
    }

    The 'main' property of package.json specifies a web-page to be rendered in the main window.

    app.html:

    <html>
      <head>
        <script src="app.js"></script>
      </head>
      <body>
        <div>
          The greatest common divisor of
          <span id="x"></span> and
          <span id="y"></span> is
          <span id="z"></span>.
        </div>
      </body>
    </html>

    As known from node.js one can use require to load javascript modules. Additionally, node-webkit provides an API that allows to manipulate the window's menu, open new windows, and many more things.

    app.js:

    window.onload = function() {
      var example = require("example");
      var x = 18;
      var y = 24;
      var z = example.gcd(x, y);
      document.querySelector('#x').innerHTML = x;
      document.querySelector('#y').innerHTML = y;
      document.querySelector('#z').innerHTML = z;
    };

    26.4 Examples

    Some basic examples are shown here in more detail.

    26.4.1 Simple

    The common example simple looks like this:

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}

    To make this available as a node extension a binding.gyp has to be created:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    Then node-gyp is used to build the extension:

    $ node-gyp configure build

    From a 'nodejs` application the extension would be used like this:

    // import the extension via require
    var example = require("./build/Release/example");
    
    // calling the global method
    var x = 42;
    var y = 105;
    var g = example.gcd(x, y);
    
    // Accessing the global variable
    var f = example.Foo;
    example.Foo = 3.1415926;

    First the module example is loaded from the previously built extension. Global methods and variables are available in the scope of the module.

    Note: ECMAScript 5, the currently implemented Javascript standard, does not have modules. node.js and other implementations provide this mechanism defined by the CommonJS group. For browsers this is provided by Browserify, for instance.

    26.4.2 Class

    The common example class defines three classes, Shape, Circle, and Square:

    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;
      void    move(double dx, double dy);
      virtual double area(void) = 0;
      virtual double perimeter(void) = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area(void);
      virtual double perimeter(void);
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area(void);
      virtual double perimeter(void);
    };

    Circle and Square inherit from Shape. Shape has a static variable nshapes, a function move that can't be overridden (non-virtual), and two abstract functions area and perimeter (pure virtual) that must be overridden by the sub-classes.

    A nodejs extension is built the same way as for the simple example.

    In Javascript it can be used as follows:

    var example = require("./build/Release/example");
    
    // local aliases for convenience
    var Shape = example.Shape;
    var Circle = example.Circle;
    var Square = example.Square;
    
    // creating new instances using the 'new' operator
    var c = new Circle(10);
    var s = new Square(10);
    
    // accessing a static member
    Shape.nshapes;
    
    // accessing member variables
    c.x = 20;
    c.y = 30;
    s.x = -10;
    s.y = 5;
    
    // calling some methods
    c.area();
    c.perimeter();
    s.area();
    s.perimeter();
    
    // instantiation of Shape is not permitted
    new Shape();

    Running these commands in an interactive node shell results in the following output:

    $ node -i
    & var example = require("./build/Release/example");
    undefined
    & var Shape = example.Shape;
    undefined
    & var Circle = example.Circle;
    undefined
    & var Square = example.Square;
    undefined
    & var c = new Circle(10);
    undefined
    & var s = new Square(10);
    undefined
    & Shape.nshapes;
    2
    & c.x = 20;
    20
    & c.y = 30;
    30
    & s.x = -10;
    -10
    & s.y = 5;
    5
    & c.area();
    314.1592653589793
    & c.perimeter();
    62.83185307179586
    & s.area();
    100
    & s.perimeter();
    40
    & c.move(40, 40)
    undefined
    & c.x
    60
    & c.y
    70
    & new Shape()
    Error: Class Shape can not be instantiated
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.EventEmitter.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

    Note: In ECMAScript 5 there is no concept for classes. Instead each function can be used as a constructor function which is executed by the 'new' operator. Furthermore, during construction the key property prototype of the constructor function is used to attach a prototype instance to the created object. A prototype is essentially an object itself that is the first-class delegate of a class used whenever the access to a property of an object fails. The very same prototype instance is shared among all instances of one type. Prototypal inheritance is explained in more detail on in Inheritance and the prototype chain, for instance.

    26.5 Implementation

    The Javascript Module implementation has taken a very different approach compared to other language modules in order to support different Javascript interpreters.

    26.5.1 Source Code

    The Javascript module is implemented in Source/Modules/javascript.cxx. It dispatches the code generation to a JSEmitter instance, V8Emitter or JSCEmitter. Additionally there are some helpers: Template, for templated code generation, and JSEmitterState, which is used to manage state information during AST traversal. This rough map shall make it easier to find a way through this huge source file:

    // module wide defines
    
    #define NAME "name"
    ...
    
    // ###############################
    // #  Helper class declarations
    
    class JSEmitterState { ... };
    
    class Template { ... };
    
    // ###############################
    // # JSEmitter declaration
    
    class JSEmitter { ... };
    
    // Emitter factory declarations
    
    JSEmitter *swig_javascript_create_JSCEmitter();
    JSEmitter *swig_javascript_create_V8Emitter();
    
    // ###############################
    // # Javascript module
    
    // Javascript module declaration
    
    class JAVASCRIPT:public Language { ... };
    
    // Javascript module implementation
    
    int JAVASCRIPT::functionWrapper(Node *n) { ... }
    ...
    
    // Module factory implementation
    
    static Language *new_swig_javascript() { ... }
    
    extern "C" Language *swig_javascript(void) { ... }
    
    // ###############################
    // # JSEmitter base implementation
    
    JSEmitter::JSEmitter() { ... }
    
    Template JSEmitter::getTemplate(const String *name) { ... }
    ...
    
    // ###############################
    // # JSCEmitter
    
    // JSCEmitter declaration
    
    class JSCEmitter: public JSEmitter { ... };
    
    // JSCEmitter implementation
    
    JSCEmitter::JSCEmitter() { ... }
    
    void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { ... }
    ...
    
    // JSCEmitter factory
    
    JSEmitter *swig_javascript_create_JSCEmitter() { ... }
    
    
    // ###############################
    // # V8Emitter
    
    // V8Emitter declaration
    
    class V8Emitter: public JSEmitter { ... };
    
    // V8Emitter implementation
    
    V8Emitter::V8Emitter() { ... }
    
    int V8Emitter::initialize(Node *n) { ... }
    
    // V8Emitter factory
    
    JSEmitter *swig_javascript_create_V8Emitter() { ... }
    
    
    // ###############################
    // # Helper implementation (JSEmitterState, Template)
    
    JSEmitterState::JSEmitterState() { ... }
    ...
    
    Template::Template(const String *code_) { ... }
    ...

    26.5.2 Code Templates

    All generated code is created on the basis of code templates. The templates for JavascriptCore can be found in Lib/javascript/jsc/javascriptcode.swg, for v8 in Lib/javascript/v8/javascriptcode.swg.

    To track the originating code template for generated code you can run

    $ swig -javascript -jsc -debug-codetemplates

    which wraps generated code with a descriptive comment

    /* begin fragment("template_name") */
    
    ...generated code ...
    
    /* end fragment("template_name") */

    The Template class is used like this:

    Template t_register = getTemplate("jsv8_register_static_variable");
    t_register.replace("$jsparent", state.clazz(NAME_MANGLED))
        .replace("$jsname", state.variable(NAME))
        .replace("$jsgetter", state.variable(GETTER))
        .replace("$jssetter", state.variable(SETTER))
        .trim().
        print(f_init_static_wrappers);

    A code template is registered with the JSEmitter via fragment(name, "template"), e.g.,

    %fragment ("jsc_variable_declaration", "templates")
    %{
      {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone},
    %}

    Template creates a copy of that string and Template::replace uses Swig's Replaceall to replace variables in the template. Template::trim can be used to eliminate leading and trailing whitespaces. Template::print is used to write the final template string to a Swig DOH (based on Printv). All methods allow chaining.

    26.5.3 Emitter

    The Javascript module delegates code generation to a JSEmitter instance. The following extract shows the essential interface:

    class JSEmitter {
      ...
    
      /**
       * Opens output files and temporary output DOHs.
       */
      virtual int initialize(Node *n);
    
      /**
       * Writes all collected code into the output file(s).
       */
      virtual int dump(Node *n) = 0;
    
      /**
       * Cleans up all open output DOHs.
       */
      virtual int close() = 0;
    
      ...
    
      /**
       * Invoked at the beginning of the classHandler.
       */
      virtual int enterClass(Node *);
    
      /**
       * Invoked at the end of the classHandler.
       */
      virtual int exitClass(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the variableHandler.
       */
      virtual int enterVariable(Node *);
    
      /**
       * Invoked at the end of the variableHandler.
       */
      virtual int exitVariable(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the functionHandler.
       */
      virtual int enterFunction(Node *);
    
      /**
       * Invoked at the end of the functionHandler.
       */
      virtual int exitFunction(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked by functionWrapper callback after call to Language::functionWrapper.
       */
      virtual int emitWrapperFunction(Node *n);
    
      /**
       * Invoked from constantWrapper after call to Language::constantWrapper.
       **/
      virtual int emitConstant(Node *n);
    
      /**
       * Registers a given code snippet for a given key name.
       *
       * This method is called by the fragmentDirective handler
       * of the JAVASCRIPT language module.
       **/
      int registerTemplate(const String *name, const String *code);
    
      /**
       * Retrieve the code template registered for a given name.
       */
      Template getTemplate(const String *name);
    
      State &getState();
    
      ...
    
    }

    The module calls initialize, dump, and close from within the top method:

    int JAVASCRIPT::top(Node *n) {
      emitter->initialize(n);
    
      Language::top(n);
    
      emitter->dump(n);
      emitter->close();
    
      return SWIG_OK;
    }

    The methods enterClass and exitClass are called from within the classHandler method:

    int JAVASCRIPT::classHandler(Node *n) {
    
      emitter->enterClass(n);
      Language::classHandler(n);
      emitter->exitClass(n);
    
      return SWIG_OK;
    }

    In enterClass the emitter stores state information that is necessary when processing class members. In exitClass the wrapper code for the whole class is generated.

    26.5.4 Emitter states

    For storing information during the AST traversal the emitter provides a JSEmitterState with different slots to store data representing the scopes global, class, function, and variable.

    class JSEmitterState {
    
    public:
    
      JSEmitterState();
    
      ~JSEmitterState();
    
      DOH *global();
    
      DOH *global(const char* key, DOH *initial = 0);
    
      DOH *clazz(bool reset = false);
    
      DOH *clazz(const char* key, DOH *initial = 0);
    
      DOH *function(bool reset = false);
    
      DOH *function(const char* key, DOH *initial = 0);
    
      DOH *variable(bool reset = false);
    
      DOH *variable(const char* key, DOH *initial = 0);
    
      static int IsSet(DOH *val);
    
      ...
    };

    When entering a scope, such as in enterClass, the corresponding state is reset and new data is stored:

    state.clazz(RESET);
    state.clazz(NAME, Getattr(n, "sym:name"));

    State information can be retrieved using state.clazz(NAME) or with Getattr on state.clazz() which actually returns a Hash instance.

    26.5.5 Handling Exceptions in JavascriptCore

    Applications with an embedded JavascriptCore should be able to present detailed exception messages that occur in the Javascript engine. Below is an example derived from code provided by Brian Barnes on how these exception details can be extracted.

    void script_exception_to_string(JSContextRef js_context, JSValueRef exception_value_ref, char* return_error_string, int return_error_string_max_length)
    {
      JSObjectRef exception_object;
      JSValueRef value_ref;
      JSStringRef jsstring_property_name = NULL;
      JSValueRef temporary_exception = NULL;
      JSStringRef js_return_string = NULL;
      size_t bytes_needed;
      char* c_result_string = NULL;
      exception_object = JSValueToObject(js_context, exception_value_ref, NULL);
    
      /* source url */
      strcpy(return_error_string, "[");
      jsstring_property_name = JSStringCreateWithUTF8CString("sourceURL");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, ":", return_error_string_max_length-1);
    
      /* line number */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("line");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, "]", return_error_string_max_length-1);
    
      /* error message */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("message");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      if(NULL == value_ref)
      {
        strncat(return_error_string, "Unknown Error", return_error_string_max_length-1);
      }
      else
      {
        js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
        bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
        c_result_string = (char*)calloc(bytes_needed, sizeof(char));
        JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
        JSStringRelease(js_return_string);
        strncat(return_error_string, c_result_string, return_error_string_max_length-1);
        free(c_result_string);
      }
    }

    It would be used in the following way:

    if(js_exception)
    {
      char return_error_string[256];
      script_exception_to_string(js_context, js_exception, return_error_string, 256);
      printf("Compile error is %s", return_error_string);
    }
    swig-3.0.12/Doc/Manual/linkchecker.config0000664000175000017500000000012513042756442020026 0ustar williamwilliam[filtering] ignorewarnings=http-robots-denied ignorewarnings=https-certificate-error swig-3.0.12/Doc/Manual/SWIGPlus.html0000664000175000017500000043157513042756671016705 0ustar williamwilliam SWIG and C++

    6 SWIG and C++

    This chapter describes SWIG's support for wrapping C++. As a prerequisite, you should first read the chapter SWIG Basics to see how SWIG wraps ANSI C. Support for C++ builds upon ANSI C wrapping and that material will be useful in understanding this chapter.

    6.1 Comments on C++ Wrapping

    Because of its complexity and the fact that C++ can be difficult to integrate with itself let alone other languages, SWIG only provides support for a subset of C++ features. Fortunately, this is now a rather large subset.

    In part, the problem with C++ wrapping is that there is no semantically obvious (or automatic ) way to map many of its advanced features into other languages. As a simple example, consider the problem of wrapping C++ multiple inheritance to a target language with no such support. Similarly, the use of overloaded operators and overloaded functions can be problematic when no such capability exists in a target language.

    A more subtle issue with C++ has to do with the way that some C++ programmers think about programming libraries. In the world of SWIG, you are really trying to create binary-level software components for use in other languages. In order for this to work, a "component" has to contain real executable instructions and there has to be some kind of binary linking mechanism for accessing its functionality. In contrast, C++ has increasingly relied upon generic programming and templates for much of its functionality. Although templates are a powerful feature, they are largely orthogonal to the whole notion of binary components and libraries. For example, an STL vector does not define any kind of binary object for which SWIG can just create a wrapper. To further complicate matters, these libraries often utilize a lot of behind the scenes magic in which the semantics of seemingly basic operations (e.g., pointer dereferencing, procedure call, etc.) can be changed in dramatic and sometimes non-obvious ways. Although this "magic" may present few problems in a C++-only universe, it greatly complicates the problem of crossing language boundaries and provides many opportunities to shoot yourself in the foot. You will just have to be careful.

    6.2 Approach

    To wrap C++, SWIG uses a layered approach to code generation. At the lowest level, SWIG generates a collection of procedural ANSI-C style wrappers. These wrappers take care of basic type conversion, type checking, error handling, and other low-level details of the C++ binding. These wrappers are also sufficient to bind C++ into any target language that supports built-in procedures. In some sense, you might view this layer of wrapping as providing a C library interface to C++. On top of the low-level procedural (flattened) interface, SWIG generates proxy classes that provide a natural object-oriented (OO) interface to the underlying code. The proxy classes are typically written in the target language itself. For instance, in Python, a real Python class is used to provide a wrapper around the underlying C++ object.

    It is important to emphasize that SWIG takes a deliberately conservative and non-intrusive approach to C++ wrapping. SWIG does not encapsulate C++ classes inside a special C++ adaptor, it does not rely upon templates, nor does it add in additional C++ inheritance when generating wrappers. The last thing that most C++ programs need is even more compiler magic. Therefore, SWIG tries to maintain a very strict and clean separation between the implementation of your C++ application and the resulting wrapper code. You might say that SWIG has been written to follow the principle of least surprise--it does not play sneaky tricks with the C++ type system, it doesn't mess with your class hierarchies, and it doesn't introduce new semantics. Although this approach might not provide the most seamless integration with C++, it is safe, simple, portable, and debuggable.

    Some of this chapter focuses on the low-level procedural interface to C++ that is used as the foundation for all language modules. Keep in mind that the target languages also provide the high-level OO interface via proxy classes. More detailed coverage can be found in the documentation for each target language.

    6.3 Supported C++ features

    SWIG currently supports most C++ features including the following:

    • Classes
    • Constructors and destructors
    • Virtual functions
    • Public inheritance (including multiple inheritance)
    • Static functions
    • Function and method overloading
    • Operator overloading for many standard operators
    • References
    • Templates (including specialization and member templates)
    • Pointers to members
    • Namespaces
    • Default parameters
    • Smart pointers

    The following C++ features are not currently supported:

    • Overloaded versions of certain operators (new, delete, etc.)

    As a rule of thumb, SWIG should not be used on raw C++ source files, use header files only.

    SWIG's C++ support is an ongoing project so some of these limitations may be lifted in future releases. However, we make no promises. Also, submitting a bug report is a very good way to get problems fixed (wink).

    6.4 Command line options and compilation

    When wrapping C++ code, it is critical that SWIG be called with the `-c++' option. This changes the way a number of critical features such as memory management are handled. It also enables the recognition of C++ keywords. Without the -c++ flag, SWIG will either issue a warning or a large number of syntax errors if it encounters C++ code in an interface file.

    When compiling and linking the resulting wrapper file, it is normal to use the C++ compiler. For example:

    $ swig -c++ -tcl example.i
    $ c++ -fPIC -c example_wrap.cxx 
    $ c++ example_wrap.o $(OBJS) -o example.so
    

    Unfortunately, the process varies slightly on each platform. Make sure you refer to the documentation on each target language for further details. The SWIG Wiki also has further details.

    Compatibility Note: Early versions of SWIG generated just a flattened low-level C style API to C++ classes by default. The -noproxy commandline option is recognised by many target languages and will generate just this interface as in earlier versions.

    6.5 Proxy classes

    In order to provide a natural mapping from C++ classes to the target language classes, SWIG's target languages mostly wrap C++ classes with special proxy classes. These proxy classes are typically implemented in the target language itself. For example, if you're building a Python module, each C++ class is wrapped by a Python proxy class. Or if you're building a Java module, each C++ class is wrapped by a Java proxy class.

    6.5.1 Construction of proxy classes

    Proxy classes are always constructed as an extra layer of wrapping that uses low-level accessor functions. To illustrate, suppose you had a C++ class like this:

    class Foo {
      public:
        Foo();
        ~Foo();
        int  bar(int x);
        int  x;
    };
    

    Using C++ as pseudocode, a proxy class looks something like this:

    class FooProxy {
      private:
        Foo    *self;
      public:
        FooProxy() {
          self = new_Foo();
        }
        ~FooProxy() {
          delete_Foo(self);
        }
        int bar(int x) {
          return Foo_bar(self, x);
        }
        int x_get() {
          return Foo_x_get(self);
        }
        void x_set(int x) {
          Foo_x_set(self, x);
        }
    };
    

    Of course, always keep in mind that the real proxy class is written in the target language. For example, in Python, the proxy might look roughly like this:

    class Foo:
        def __init__(self):
            self.this = new_Foo()
        def __del__(self):
            delete_Foo(self.this)
        def bar(self, x):
            return Foo_bar(self.this, x)
        def __getattr__(self, name):
            if name == 'x':
                return Foo_x_get(self.this)
            ...
        def __setattr__(self, name, value):
            if name == 'x':
                Foo_x_set(self.this, value)
            ...
    

    Again, it's important to emphasize that the low-level accessor functions are always used by the proxy classes. Whenever possible, proxies try to take advantage of language features that are similar to C++. This might include operator overloading, exception handling, and other features.

    6.5.2 Resource management in proxies

    A major issue with proxies concerns the memory management of wrapped objects. Consider the following C++ code:

    class Foo {
    public:
      Foo();
      ~Foo();
      int bar(int x);
      int x;
    };
    
    class Spam {
    public:
          Foo *value;
          ...
    };
    

    Consider some script code that uses these classes:

    f = Foo()               # Creates a new Foo
    s = Spam()              # Creates a new Spam
    s.value = f             # Stores a reference to f inside s
    g = s.value             # Returns stored reference
    g = 4                   # Reassign g to some other value
    del f                   # Destroy f 
    

    Now, ponder the resulting memory management issues. When objects are created in the script, the objects are wrapped by newly created proxy classes. That is, there is both a new proxy class instance and a new instance of the underlying C++ class. In this example, both f and s are created in this way. However, the statement s.value is rather curious---when executed, a pointer to f is stored inside another object. This means that the scripting proxy class AND another C++ class share a reference to the same object. To make matters even more interesting, consider the statement g = s.value. When executed, this creates a new proxy class g that provides a wrapper around the C++ object stored in s.value. In general, there is no way to know where this object came from---it could have been created by the script, but it could also have been generated internally. In this particular example, the assignment of g results in a second proxy class for f. In other words, a reference to f is now shared by two proxy classes and a C++ class.

    Finally, consider what happens when objects are destroyed. In the statement, g=4, the variable g is reassigned. In many languages, this makes the old value of g available for garbage collection. Therefore, this causes one of the proxy classes to be destroyed. Later on, the statement del f destroys the other proxy class. Of course, there is still a reference to the original object stored inside another C++ object. What happens to it? Is the object still valid?

    To deal with memory management problems, proxy classes provide an API for controlling ownership. In C++ pseudocode, ownership control might look roughly like this:

    class FooProxy {
      public:
        Foo    *self;
        int     thisown;
    
        FooProxy() {
          self = new_Foo();
          thisown = 1;       // Newly created object
        }
        ~FooProxy() {
          if (thisown) delete_Foo(self);
        }
        ...
        // Ownership control API
        void disown() {
          thisown = 0;
        }
        void acquire() {
          thisown = 1;
        }
    };
    
    class FooPtrProxy: public FooProxy {
    public:
      FooPtrProxy(Foo *s) {
        self = s;
        thisown = 0;
      }
    };
    
    class SpamProxy {
      ...
      FooProxy *value_get() {
        return FooPtrProxy(Spam_value_get(self));
      }
      void value_set(FooProxy *v) {
        Spam_value_set(self, v->self);
        v->disown();
      }
      ...
    };
    

    Looking at this code, there are a few central features:

    • Each proxy class keeps an extra flag to indicate ownership. C++ objects are only destroyed if the ownership flag is set.
    • When new objects are created in the target language, the ownership flag is set.
    • When a reference to an internal C++ object is returned, it is wrapped by a proxy class, but the proxy class does not have ownership.
    • In certain cases, ownership is adjusted. For instance, when a value is assigned to the member of a class, ownership is lost.
    • Manual ownership control is provided by special disown() and acquire() methods.

    Given the tricky nature of C++ memory management, it is impossible for proxy classes to automatically handle every possible memory management problem. However, proxies do provide a mechanism for manual control that can be used (if necessary) to address some of the more tricky memory management problems.

    6.5.3 Language specific details

    Language specific details on proxy classes are contained in the chapters describing each target language. This chapter has merely introduced the topic in a very general way.

    6.6 Simple C++ wrapping

    The following code shows a SWIG interface file for a simple C++ class.

    %module list
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example for linked list
    
    class List {
    public:
      List();
      ~List();
      int  search(char *value);
      void insert(char *);
      void remove(char *);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    To generate wrappers for this class, SWIG first reduces the class to a collection of low-level C-style accessor functions which are then used by the proxy classes.

    6.6.1 Constructors and destructors

    C++ constructors and destructors are translated into accessor functions such as the following :

    List * new_List(void) {
      return new List;
    }
    void delete_List(List *l) {
      delete l;
    }
    
    

    6.6.2 Default constructors, copy constructors and implicit destructors

    Following the C++ rules for implicit constructor and destructors, SWIG will automatically assume there is one even when they are not explicitly declared in the class interface.

    In general then:

    • If a C++ class does not declare any explicit constructor, SWIG will automatically generate a wrapper for one.
    • If a C++ class does not declare an explicit copy constructor, SWIG will automatically generate a wrapper for one if the %copyctor is used.
    • If a C++ class does not declare an explicit destructor, SWIG will automatically generate a wrapper for one.

    And as in C++, a few rules that alters the previous behavior:

    • A default constructor is not created if a class already defines a constructor with arguments.
    • Default constructors are not generated for classes with pure virtual methods or for classes that inherit from an abstract class, but don't provide definitions for all of the pure methods.
    • A default constructor is not created unless all base classes support a default constructor.
    • Default constructors and implicit destructors are not created if a class defines them in a private or protected section.
    • Default constructors and implicit destructors are not created if any base class defines a non-public default constructor or destructor.

    SWIG should never generate a default constructor, copy constructor or default destructor wrapper for a class in which it is illegal to do so. In some cases, however, it could be necessary (if the complete class declaration is not visible from SWIG, and one of the above rules is violated) or desired (to reduce the size of the final interface) by manually disabling the implicit constructor/destructor generation.

    To manually disable these, the %nodefaultctor and %nodefaultdtor feature flag directives can be used. Note that these directives only affects the implicit generation, and they have no effect if the default/copy constructors or destructor are explicitly declared in the class interface.

    For example:

    %nodefaultctor Foo;  // Disable the default constructor for class Foo.
    class Foo {          // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {          // A default constructor is generated, if possible
    ...
    };
    

    The directive %nodefaultctor can also be applied "globally", as in:

    %nodefaultctor; // Disable creation of default constructors
    class Foo {     // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {   
    public:
      Bar();        // The default constructor is generated, since one is declared
    };
    %clearnodefaultctor; // Enable the creation of default constructors again
    

    The corresponding %nodefaultdtor directive can be used to disable the generation of the default or implicit destructor, if needed. Be aware, however, that this could lead to memory leaks in the target language. Hence, it is recommended to use this directive only in well known cases. For example:

    %nodefaultdtor Foo;   // Disable the implicit/default destructor for class Foo.
    class Foo {           // No destructor is generated, unless one is declared
    ...
    };
    

    Compatibility Note: The generation of default constructors/implicit destructors was made the default behavior in SWIG 1.3.7. This may break certain older modules, but the old behavior can be easily restored using %nodefault or the -nodefault command line option. Furthermore, in order for SWIG to properly generate (or not generate) default constructors, it must be able to gather information from both the private and protected sections (specifically, it needs to know if a private or protected constructor/destructor is defined). In older versions of SWIG, it was fairly common to simply remove or comment out the private and protected sections of a class due to parser limitations. However, this removal may now cause SWIG to erroneously generate constructors for classes that define a constructor in those sections. Consider restoring those sections in the interface or using %nodefault to fix the problem.

    Note: The %nodefault directive/-nodefault options described above, which disable both the default constructor and the implicit destructors, could lead to memory leaks, and so it is strongly recommended to not use them.

    6.6.3 When constructor wrappers aren't created

    If a class defines a constructor, SWIG normally tries to generate a wrapper for it. However, SWIG will not generate a constructor wrapper if it thinks that it will result in illegal wrapper code. There are really two cases where this might show up.

    First, SWIG won't generate wrappers for protected or private constructors. For example:

    class Foo {
    protected:
      Foo();         // Not wrapped.
    public:
        ...
    };
    

    Next, SWIG won't generate wrappers for a class if it appears to be abstract--that is, it has undefined pure virtual methods. Here are some examples:

    class Bar {
    public:
      Bar();               // Not wrapped.  Bar is abstract.
      virtual void spam(void) = 0;
    };
    
    class Grok : public Bar {
    public:
          Grok();            // Not wrapped. No implementation of abstract spam().
    };
    

    Some users are surprised (or confused) to find missing constructor wrappers in their interfaces. In almost all cases, this is caused when classes are determined to be abstract. To see if this is the case, run SWIG with all of its warnings turned on:

    % swig -Wall -python module.i
    

    In this mode, SWIG will issue a warning for all abstract classes. It is possible to force a class to be non-abstract using this:

    %feature("notabstract") Foo;
    
    class Foo : public Bar {
    public:
      Foo();    // Generated no matter what---not abstract.
      ...
    };
    

    More information about %feature can be found in the Customization features chapter.

    6.6.4 Copy constructors

    If a class defines more than one constructor, its behavior depends on the capabilities of the target language. If overloading is supported, the copy constructor is accessible using the normal constructor function. For example, if you have this:

    class List {
    public:
        List();    
        List(const List &);      // Copy constructor
        ...
    };
    

    then the copy constructor can be used as follows:

    x = List()               # Create a list
    y = List(x)              # Copy list x
    

    If the target language does not support overloading, then the copy constructor is available through a special function like this:

    List *copy_List(List *f) {
        return new List(*f);
    }
    

    Note: For a class X, SWIG only treats a constructor as a copy constructor if it can be applied to an object of type X or X *. If more than one copy constructor is defined, only the first definition that appears is used as the copy constructor--other definitions will result in a name-clash. Constructors such as X(const X &), X(X &), and X(X *) are handled as copy constructors in SWIG.

    Note: SWIG does not generate a copy constructor wrapper unless one is explicitly declared in the class. This differs from the treatment of default constructors and destructors. However, copy constructor wrappers can be generated if using the copyctor feature flag. For example:

    %copyctor List;
    
    class List {
    public:
        List();    
    };
    

    Will generate a copy constructor wrapper for List.

    Compatibility note: Special support for copy constructors was not added until SWIG-1.3.12. In previous versions, copy constructors could be wrapped, but they had to be renamed. For example:

    class Foo {
    public:
        Foo();
      %name(CopyFoo) Foo(const Foo &);
        ...
    };
    

    For backwards compatibility, SWIG does not perform any special copy-constructor handling if the constructor has been manually renamed. For instance, in the above example, the name of the constructor is set to new_CopyFoo(). This is the same as in older versions.

    6.6.5 Member functions

    All member functions are roughly translated into accessor functions like this :

    int List_search(List *obj, char *value) {
      return obj->search(value);
    }
    
    

    This translation is the same even if the member function has been declared as virtual.

    It should be noted that SWIG does not actually create a C accessor function in the code it generates. Instead, member access such as obj->search(value) is directly inlined into the generated wrapper functions. However, the name and calling convention of the low-level procedural wrappers match the accessor function prototype described above.

    6.6.6 Static members

    Static member functions are called directly without making any special transformations. For example, the static member function print(List *l) directly invokes List::print(List *l) in the generated wrapper code.

    6.6.7 Member data

    Member data is handled in exactly the same manner as for C structures. A pair of accessor functions are effectively created. For example :

    int List_length_get(List *obj) {
      return obj->length;
    }
    int List_length_set(List *obj, int value) {
      obj->length = value;
      return value;
    }
    
    

    A read-only member can be created using the %immutable and %mutable feature flag directive. For example, we probably wouldn't want the user to change the length of a list so we could do the following to make the value available, but read-only.

    class List {
    public:
    ...
    %immutable;
      int length;
    %mutable;
    ...
    };
    

    Alternatively, you can specify an immutable member in advance like this:

    %immutable List::length;
    ...
    class List {
      ...
      int length;         // Immutable by above directive
      ...
    };
    

    Similarly, all data attributes declared as const are wrapped as read-only members.

    By default, SWIG uses the const reference typemaps for members that are primitive types. There are some subtle issues when wrapping data members that are not primitive types, such as classes. For instance, if you had another class like this,

    class Foo {
    public:
        List items;
        ...
    

    then the low-level accessor to the items member actually uses pointers. For example:

    List *Foo_items_get(Foo *self) {
        return &self->items;
    }
    void Foo_items_set(Foo *self, List *value) {
        self->items = *value;
    }
    

    More information about this can be found in the SWIG Basics chapter, Structure data members section.

    The wrapper code to generate the accessors for classes comes from the pointer typemaps. This can be somewhat unnatural for some types. For example, a user would expect the STL std::string class member variables to be wrapped as a string in the target language, rather than a pointer to this class. The const reference typemaps offer this type of marshalling, so there is a feature to tell SWIG to use the const reference typemaps rather than the pointer typemaps. It is the naturalvar feature and can be used to effectively change the way accessors are generated to the following:

    const List &Foo_items_get(Foo *self) {
        return self->items;
    }
    void Foo_items_set(Foo *self, const List &value) {
        self->items = value;
    }
    

    The %naturalvar directive is a macro for, and hence equivalent to, %feature("naturalvar"). It can be used as follows:

    // All List variables will use const List& typemaps
    %naturalvar List;
    
    // Only Foo::myList will use const List& typemaps
    %naturalvar Foo::myList;
    struct Foo {
      List myList;
    };
    
    // All non-primitive types will use const reference typemaps
    %naturalvar;
    

    The observant reader will notice that %naturalvar works like any other feature flag directive but with some extra flexibility. The first of the example usages above shows %naturalvar attaching to the myList's variable type, that is the List class. The second usage shows %naturalvar attaching to the variable name. Hence the naturalvar feature can be used on either the variable's name or type. Note that using the naturalvar feature on a variable's name overrides any naturalvar feature attached to the variable's type.

    It is generally a good idea to use this feature globally as the reference typemaps have extra NULL checking compared to the pointer typemaps. A pointer can be NULL, whereas a reference cannot, so the extra checking ensures that the target language user does not pass in a value that translates to a NULL pointer and thereby preventing any potential NULL pointer dereferences. The %naturalvar feature will apply to global variables in addition to member variables in some language modules, eg C# and Java.

    The naturalvar behavior can also be turned on as a global setting via the -naturalvar commandline option or the module mode option, %module(naturalvar=1). However, any use of %feature("naturalvar") will override the global setting.

    Compatibility note: The %naturalvar feature was introduced in SWIG-1.3.28, prior to which it was necessary to manually apply the const reference typemaps, eg %apply const std::string & { std::string * }, but this example would also apply the typemaps to methods taking a std::string pointer.

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    Compatibility note: Prior to SWIG-1.3.12, all members of unknown type were wrapped into accessor functions using pointers. For example, if you had a structure like this

    struct Foo {
      size_t  len;
    };
    

    and nothing was known about size_t, then accessors would be written to work with size_t *. Starting in SWIG-1.3.12, this behavior has been modified. Specifically, pointers will only be used if SWIG knows that a datatype corresponds to a structure or class. Therefore, the above code would be wrapped into accessors involving size_t. This change is subtle, but it smooths over a few problems related to structure wrapping and some of SWIG's customization features.

    6.7 Default arguments

    SWIG will wrap all types of functions that have default arguments. For example member functions:

    class Foo {
    public:
        void bar(int x, int y = 3, int z = 4);
    };
    

    SWIG handles default arguments by generating an extra overloaded method for each defaulted argument. SWIG is effectively handling methods with default arguments as if it was wrapping the equivalent overloaded methods. Thus for the example above, it is as if we had instead given the following to SWIG:

    class Foo {
    public:
        void bar(int x, int y, int z);
        void bar(int x, int y);
        void bar(int x);
    };
    

    The wrappers produced are exactly the same as if the above code was instead fed into SWIG. Details of this are covered later in the Wrapping Overloaded Functions and Methods section. This approach allows SWIG to wrap all possible default arguments, but can be verbose. For example if a method has ten default arguments, then eleven wrapper methods are generated.

    Please see the Features and default arguments section for more information on using %feature with functions with default arguments. The Ambiguity resolution and renaming section also deals with using %rename and %ignore on methods with default arguments. If you are writing your own typemaps for types used in methods with default arguments, you may also need to write a typecheck typemap. See the Typemaps and overloading section for details or otherwise use the compactdefaultargs feature flag as mentioned below.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped default arguments slightly differently. Instead a single wrapper method was generated and the default values were copied into the C++ wrappers so that the method being wrapped was then called with all the arguments specified. If the size of the wrappers are a concern then this approach to wrapping methods with default arguments can be re-activated by using the compactdefaultargs feature flag.

    %feature("compactdefaultargs") Foo::bar;
    class Foo {
    public:
        void bar(int x, int y = 3, int z = 4);
    };
    

    This is great for reducing the size of the wrappers, but the caveat is it does not work for the statically typed languages, such as C# and Java, which don't have optional arguments in the language, Another restriction of this feature is that it cannot handle default arguments that are not public. The following example illustrates this:

    class Foo {
    private:
      static const int spam;
    public:
      void bar(int x, int y = spam);   // Won't work with %feature("compactdefaultargs") -
                                       // private default value
    };
    

    This produces uncompilable wrapper code because default values in C++ are evaluated in the same scope as the member function whereas SWIG evaluates them in the scope of a wrapper function (meaning that the values have to be public).

    The compactdefaultargs feature is automatically turned on when wrapping C code with default arguments. Some target languages will also automatically turn on this feature if the keyword arguments feature (kwargs) is specified for either C or C++ functions, and the target language supports kwargs, the compactdefaultargs feature is also automatically turned on. Keyword arguments are a language feature of some scripting languages, for example Ruby and Python. SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.

    6.8 Protection

    SWIG wraps class members that are public following the C++ conventions, i.e., by explicit public declaration or by the use of the using directive. In general, anything specified in a private or protected section will be ignored, although the internal code generator sometimes looks at the contents of the private and protected sections so that it can properly generate code for default constructors and destructors. Directors could also modify the way non-public virtual protected members are treated.

    By default, members of a class definition are assumed to be private until you explicitly give a `public:' declaration (This is the same convention used by C++).

    6.9 Enums and constants

    Enumerations and constants are handled differently by the different language modules and are described in detail in the appropriate language chapter. However, many languages map enums and constants in a class definition into constants with the classname as a prefix. For example :

    class Swig {
    public:
      enum {ALE, LAGER, PORTER, STOUT};
    };
    
    

    Generates the following set of constants in the target scripting language :

    Swig_ALE = Swig::ALE
    Swig_LAGER = Swig::LAGER
    Swig_PORTER = Swig::PORTER
    Swig_STOUT = Swig::STOUT
    
    

    Members declared as const are wrapped as read-only members and do not create constants.

    6.10 Friends

    Friend declarations are recognised by SWIG. For example, if you have this code:

    class Foo {
    public:
      ...
      friend void blah(Foo *f);
      ...
    };
    

    then the friend declaration does result in a wrapper code equivalent to one generated for the following declaration

    class Foo {
    public:
        ...
    };
    
    void blah(Foo *f);    
    

    A friend declaration, as in C++, is understood to be in the same scope where the class is declared, hence, you can have

    
    %ignore bar::blah(Foo *f);
    
    namespace bar {
    
      class Foo {
      public:
        ...
        friend void blah(Foo *f);
        ...
      };
    }
    

    and a wrapper for the method 'blah' will not be generated.

    6.11 References and pointers

    C++ references are supported, but SWIG transforms them back into pointers. For example, a declaration like this :

    class Foo {
    public:
      double bar(double &a);
    }
    

    has a low-level accessor

    double Foo_bar(Foo *obj, double *a) {
      obj->bar(*a);
    }
    

    As a special case, most language modules pass const references to primitive datatypes (int, short, float, etc.) by value instead of pointers. For example, if you have a function like this,

    void foo(const int &x);
    

    it is called from a script as follows:

    foo(3)              # Notice pass by value
    

    Functions that return a reference are remapped to return a pointer instead. For example:

    class Bar {
    public:
      Foo &spam();
    };
    

    Generates an accessor like this:

    Foo *Bar_spam(Bar *obj) {
      Foo &result = obj->spam();
      return &result;
    }
    

    However, functions that return const references to primitive datatypes (int, short, etc.) normally return the result as a value rather than a pointer. For example, a function like this,

    const int &bar();
    

    will return integers such as 37 or 42 in the target scripting language rather than a pointer to an integer.

    Don't return references to objects allocated as local variables on the stack. SWIG doesn't make a copy of the objects so this will probably cause your program to crash.

    Note: The special treatment for references to primitive datatypes is necessary to provide more seamless integration with more advanced C++ wrapping applications---especially related to templates and the STL. This was first added in SWIG-1.3.12.

    6.12 Pass and return by value

    Occasionally, a C++ program will pass and return class objects by value. For example, a function like this might appear:

    Vector cross_product(Vector a, Vector b);
    

    If no information is supplied about Vector, SWIG creates a wrapper function similar to the following:

    Vector *wrap_cross_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      Vector r = cross_product(x, y);
      return new Vector(r);
    }

    In order for the wrapper code to compile, Vector must define a copy constructor and a default constructor.

    If Vector is defined as a class in the interface, but it does not support a default constructor, SWIG changes the wrapper code by encapsulating the arguments inside a special C++ template wrapper class, through a process called the "Fulton Transform". This produces a wrapper that looks like this:

    Vector cross_product(Vector *a, Vector *b) {
      SwigValueWrapper<Vector> x = *a;
      SwigValueWrapper<Vector> y = *b;
      SwigValueWrapper<Vector> r = cross_product(x, y);
      return new Vector(r);
    }
    

    This transformation is a little sneaky, but it provides support for pass-by-value even when a class does not provide a default constructor and it makes it possible to properly support a number of SWIG's customization options. The definition of SwigValueWrapper can be found by reading the SWIG wrapper code. This class is really nothing more than a thin wrapper around a pointer.

    Although SWIG usually detects the classes to which the Fulton Transform should be applied, in some situations it's necessary to override it. That's done with %feature("valuewrapper") to ensure it is used and %feature("novaluewrapper") to ensure it is not used:

    %feature("novaluewrapper") A;    
    class A;
    
    %feature("valuewrapper") B;
    struct B { 
        B();
        // ....
    };   
    

    It is well worth considering turning this feature on for classes that do have a default constructor. It will remove a redundant constructor call at the point of the variable declaration in the wrapper, so will generate notably better performance for large objects or for classes with expensive construction. Alternatively consider returning a reference or a pointer.

    Note: this transformation has no effect on typemaps or any other part of SWIG---it should be transparent except that you may see this code when reading the SWIG output file.

    Note: This template transformation is new in SWIG-1.3.11 and may be refined in future SWIG releases. In practice, it is only absolutely necessary to do this for classes that don't define a default constructor.

    Note: The use of this template only occurs when objects are passed or returned by value. It is not used for C++ pointers or references.

    6.13 Inheritance

    SWIG supports C++ inheritance of classes and allows both single and multiple inheritance, as limited or allowed by the target language. The SWIG type-checker knows about the relationship between base and derived classes and allows pointers to any object of a derived class to be used in functions of a base class. The type-checker properly casts pointer values and is safe to use with multiple inheritance.

    SWIG treats private or protected inheritance as close to the C++ spirit, and target language capabilities, as possible. In most cases, this means that SWIG will parse the non-public inheritance declarations, but that will have no effect in the generated code, besides the implicit policies derived for constructors and destructors.

    The following example shows how SWIG handles inheritance. For clarity, the full C++ code has been omitted.

    // shapes.i
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      double x, y;
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    

    When wrapped into Python, we can perform the following operations (shown using the low level Python accessors):

    $ python
    >>> import shapes
    >>> circle = shapes.new_Circle(7)
    >>> square = shapes.new_Square(10)
    >>> print shapes.Circle_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(square)
    100.00000000000000000
    >>> shapes.Shape_set_location(square, 2, -3)
    >>> print shapes.Shape_perimeter(square)
    40.00000000000000000
    >>>
    

    In this example, Circle and Square objects have been created. Member functions can be invoked on each object by making calls to Circle_area, Square_area, and so on. However, the same results can be accomplished by simply using the Shape_area function on either object.

    One important point concerning inheritance is that the low-level accessor functions are only generated for classes in which they are actually declared. For instance, in the above example, the method set_location() is only accessible as Shape_set_location() and not as Circle_set_location() or Square_set_location(). Of course, the Shape_set_location() function will accept any kind of object derived from Shape. Similarly, accessor functions for the attributes x and y are generated as Shape_x_get(), Shape_x_set(), Shape_y_get(), and Shape_y_set(). Functions such as Circle_x_get() are not available--instead you should use Shape_x_get().

    Note that there is a one to one correlation between the low-level accessor functions and the proxy methods and therefore there is also a one to one correlation between the C++ class methods and the generated proxy class methods.

    Note: For the best results, SWIG requires all base classes to be defined in an interface. Otherwise, you may get a warning message like this:

    example.i:18: Warning 401: Nothing known about base class 'Foo'. Ignored.
    

    If any base class is undefined, SWIG still generates correct type relationships. For instance, a function accepting a Foo * will accept any object derived from Foo regardless of whether or not SWIG actually wrapped the Foo class. If you really don't want to generate wrappers for the base class, but you want to silence the warning, you might consider using the %import directive to include the file that defines Foo. %import simply gathers type information, but doesn't generate wrappers. Alternatively, you could just define Foo as an empty class in the SWIG interface or use warning suppression.

    Note: typedef-names can be used as base classes. For example:

    class Foo {
    ...
    };
    
    typedef Foo FooObj;
    class Bar : public FooObj {     // Ok.  Base class is Foo
    ...
    };
    

    Similarly, typedef allows unnamed structures to be used as base classes. For example:

    typedef struct {
      ...
    } Foo;
    
    class Bar : public Foo {    // Ok. 
    ...
    };
    

    Compatibility Note: Starting in version 1.3.7, SWIG only generates low-level accessor wrappers for the declarations that are actually defined in each class. This differs from SWIG1.1 which used to inherit all of the declarations defined in base classes and regenerate specialized accessor functions such as Circle_x_get(), Square_x_get(), Circle_set_location(), and Square_set_location(). This behavior resulted in huge amounts of replicated code for large class hierarchies and made it awkward to build applications spread across multiple modules (since accessor functions are duplicated in every single module). It is also unnecessary to have such wrappers when advanced features like proxy classes are used. Note: Further optimizations are enabled when using the -fvirtual option, which avoids the regenerating of wrapper functions for virtual members that are already defined in a base class.

    6.14 A brief discussion of multiple inheritance, pointers, and type checking

    When a target scripting language refers to a C++ object, it normally uses a tagged pointer object that contains both the value of the pointer and a type string. For example, in Tcl, a C++ pointer might be encoded as a string like this:

    _808fea88_p_Circle
    

    A somewhat common question is whether or not the type-tag could be safely removed from the pointer. For instance, to get better performance, could you strip all type tags and just use simple integers instead?

    In general, the answer to this question is no. In the wrappers, all pointers are converted into a common data representation in the target language. Typically this is the equivalent of casting a pointer to void *. This means that any C++ type information associated with the pointer is lost in the conversion.

    The problem with losing type information is that it is needed to properly support many advanced C++ features--especially multiple inheritance. For example, suppose you had code like this:

    class A {
    public:
      int x;
    };
    
    class B {
    public:
      int y;
    };
    
    class C : public A, public B {
    };
    
    int A_function(A *a) {
      return a->x;
    }
    
    int B_function(B *b) {
      return b->y;
    }
    

    Now, consider the following code that uses void *.

    C *c = new C();
    void *p = (void *) c;
    ...
    int x = A_function((A *) p);
    int y = B_function((B *) p);
    

    In this code, both A_function() and B_function() may legally accept an object of type C * (via inheritance). However, one of the functions will always return the wrong result when used as shown. The reason for this is that even though p points to an object of type C, the casting operation doesn't work like you would expect. Internally, this has to do with the data representation of C. With multiple inheritance, the data from each base class is stacked together. For example:

                 ------------    <--- (C *),  (A *)
                |     A      |
                |------------|   <--- (B *)
                |     B      |
                 ------------   
    

    Because of this stacking, a pointer of type C * may change value when it is converted to a A * or B *. However, this adjustment does not occur if you are converting from a void *.

    The use of type tags marks all pointers with the real type of the underlying object. This extra information is then used by SWIG generated wrappers to correctly cast pointer values under inheritance (avoiding the above problem).

    Some of the language modules are able to solve the problem by storing multiple instances of the pointer, for example, A *, in the A proxy class as well as C * in the C proxy class. The correct cast can then be made by choosing the correct void * pointer to use and is guaranteed to work as the cast to a void pointer and back to the same type does not lose any type information:

    C *c = new C();
    void *p = (void *) c;
    void *pA = (void *) c;
    void *pB = (void *) c;
    ...
    int x = A_function((A *) pA);
    int y = B_function((B *) pB);
    

    In practice, the pointer is held as an integral number in the target language proxy class.

    6.15 Wrapping Overloaded Functions and Methods

    In many language modules, SWIG provides partial support for overloaded functions, methods, and constructors. For example, if you supply SWIG with overloaded functions like this:

    void foo(int x) {
      printf("x is %d\n", x);
    }
    void foo(char *x) {
      printf("x is '%s'\n", x);
    }
    

    The function is used in a completely natural way. For example:

    >>> foo(3)
    x is 3
    >>> foo("hello")
    x is 'hello'
    >>>
    

    Overloading works in a similar manner for methods and constructors. For example if you have this code,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);   // Copy constructor
      void bar(int x);
      void bar(char *s, int y);
    };
    

    it might be used like this

    >>> f = Foo()          # Create a Foo
    >>> f.bar(3)
    >>> g = Foo(f)         # Copy Foo
    >>> f.bar("hello", 2)
    

    6.15.1 Dispatch function generation

    The implementation of overloaded functions and methods is somewhat complicated due to the dynamic nature of scripting languages. Unlike C++, which binds overloaded methods at compile time, SWIG must determine the proper function as a runtime check for scripting language targets. This check is further complicated by the typeless nature of certain scripting languages. For instance, in Tcl, all types are simply strings. Therefore, if you have two overloaded functions like this,

    void foo(char *x);
    void foo(int x);
    

    the order in which the arguments are checked plays a rather critical role.

    For statically typed languages, SWIG uses the language's method overloading mechanism. To implement overloading for the scripting languages, SWIG generates a dispatch function that checks the number of passed arguments and their types. To create this function, SWIG first examines all of the overloaded methods and ranks them according to the following rules:

    1. Number of required arguments. Methods are sorted by increasing number of required arguments.
    2. Argument type precedence. All C++ datatypes are assigned a numeric type precedence value (which is determined by the language module).

      Type              Precedence
      ----------------  ----------
      TYPE *            0     (High)
      void *            20
      Integers          40
      Floating point    60
      char              80
      Strings           100   (Low)
      

      Using these precedence values, overloaded methods with the same number of required arguments are sorted in increased order of precedence values.

    This may sound very confusing, but an example will help. Consider the following collection of overloaded methods:

    void foo(double);
    void foo(int);
    void foo(Bar *);
    void foo();
    void foo(int x, int y, int z, int w);
    void foo(int x, int y, int z = 3);
    void foo(double x, double y);
    void foo(double x, Bar *z);
    

    The first rule simply ranks the functions by required argument count. This would produce the following list:

    rank
    -----
    [0]   foo()
    [1]   foo(double);
    [2]   foo(int);
    [3]   foo(Bar *);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, double y)
    [6]   foo(double x, Bar *z)
    [7]   foo(int x, int y, int z, int w);
    

    The second rule, simply refines the ranking by looking at argument type precedence values.

    rank
    -----
    [0]   foo()
    [1]   foo(Bar *);
    [2]   foo(int);
    [3]   foo(double);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, Bar *z)
    [6]   foo(double x, double y)
    [7]   foo(int x, int y, int z, int w);
    

    Finally, to generate the dispatch function, the arguments passed to an overloaded method are simply checked in the same order as they appear in this ranking.

    If you're still confused, don't worry about it---SWIG is probably doing the right thing.

    6.15.2 Ambiguity in Overloading

    Regrettably, SWIG is not able to support every possible use of valid C++ overloading. Consider the following example:

    void foo(int x);
    void foo(long x);
    

    In C++, this is perfectly legal. However, in a scripting language, there is generally only one kind of integer object. Therefore, which one of these functions do you pick? Clearly, there is no way to truly make a distinction just by looking at the value of the integer itself (int and long may even be the same precision). Therefore, when SWIG encounters this situation, it may generate a warning message like this for scripting languages:

    example.i:4: Warning 509: Overloaded method foo(long) effectively ignored,
    example.i:3: Warning 509: as it is shadowed by foo(int).
    

    or for statically typed languages like Java:

    example.i:4: Warning 516: Overloaded method foo(long) ignored,
    example.i:3: Warning 516: using foo(int) instead.
    at example.i:3 used.
    

    This means that the second overloaded function will be inaccessible from a scripting interface or the method won't be wrapped at all. This is done as SWIG does not know how to disambiguate it from an earlier method.

    Ambiguity problems are known to arise in the following situations:

    • Integer conversions. Datatypes such as int, long, and short cannot be disambiguated in some languages. Shown above.
    • Floating point conversion. float and double can not be disambiguated in some languages.
    • Pointers and references. For example, Foo * and Foo &.
    • Pointers and arrays. For example, Foo * and Foo [4].
    • Pointers and instances. For example, Foo and Foo *. Note: SWIG converts all instances to pointers.
    • Qualifiers. For example, const Foo * and Foo *.
    • Default vs. non default arguments. For example, foo(int a, int b) and foo(int a, int b = 3).

    When an ambiguity arises, methods are checked in the same order as they appear in the interface file. Therefore, earlier methods will shadow methods that appear later.

    When wrapping an overloaded function, there is a chance that you will get a warning message like this:

    example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - 
    no precedence level in typecheck typemap for 'int').
    

    This error means that the target language module supports overloading, but for some reason there is no type-checking rule that can be used to generate a working dispatch function. The resulting behavior is then undefined. You should report this as a bug to the SWIG bug tracking database if this is due to one of the typemaps supplied with SWIG.

    If you get an error message such as the following,

    foo.i:6. Overloaded declaration ignored.  Spam::foo(double )
    foo.i:5. Previous declaration is Spam::foo(int )
    foo.i:7. Overloaded declaration ignored.  Spam::foo(Bar *, Spam *, int )
    foo.i:5. Previous declaration is Spam::foo(int )
    

    it means that the target language module has not yet implemented support for overloaded functions and methods. The only way to fix the problem is to read the next section.

    6.15.3 Ambiguity resolution and renaming

    If an ambiguity in overload resolution occurs or if a module doesn't allow overloading, there are a few strategies for dealing with the problem. First, you can tell SWIG to ignore one of the methods. This is easy---simply use the %ignore directive. For example:

    %ignore foo(long);
    
    void foo(int);
    void foo(long);       // Ignored.  Oh well.
    

    The other alternative is to rename one of the methods. This can be done using %rename. For example:

    %rename("foo_short") foo(short);
    %rename(foo_long) foo(long);
    
    void foo(int);
    void foo(short);      // Accessed as foo_short()
    void foo(long);       // Accessed as foo_long()
    

    Note that the quotes around the new name are optional, however, should the new name be a C/C++ keyword they would be essential in order to avoid a parsing error. The %ignore and %rename directives are both rather powerful in their ability to match declarations. When used in their simple form, they apply to both global functions and methods. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    If you only want the renaming to apply to a certain scope, the C++ scope resolution operator (::) can be used. For example:

    %rename(foo_i) ::foo(int);      // Only rename foo(int) in the global scope.
                                    // (will not rename class members)
    
    %rename(foo_i) Spam::foo(int);  // Only rename foo(int) in class Spam
    

    When a renaming operator is applied to a class as in Spam::foo(int), it is applied to that class and all derived classes. This can be used to apply a consistent renaming across an entire class hierarchy with only a few declarations. For example:

    %rename(foo_i) Spam::foo(int);
    %rename(foo_d) Spam::foo(double);
    
    class Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Grok : public Bar {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    

    It is also possible to include %rename specifications in the class definition itself. For example:

    class Spam {
      %rename(foo_i) foo(int);
      %rename(foo_d) foo(double);
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
    ...
    };
    

    In this case, the %rename directives still get applied across the entire inheritance hierarchy, but it's no longer necessary to explicitly specify the class prefix Spam::.

    A special form of %rename can be used to apply a renaming just to class members (of all classes):

    %rename(foo_i) *::foo(int);   // Only rename foo(int) if it appears in a class.
    

    Note: the *:: syntax is non-standard C++, but the '*' is meant to be a wildcard that matches any class name (we couldn't think of a better alternative so if you have a better idea, send email to the swig-devel mailing list.

    Although this discussion has primarily focused on %rename all of the same rules also apply to %ignore. For example:

    %ignore foo(double);          // Ignore all foo(double)
    %ignore Spam::foo;            // Ignore foo in class Spam
    %ignore Spam::foo(double);    // Ignore foo(double) in class Spam
    %ignore *::foo(double);       // Ignore foo(double) in all classes
    

    When applied to a base class, %ignore forces all definitions in derived classes to disappear. For example, %ignore Spam::foo(double) will eliminate foo(double) in Spam and all classes derived from Spam.

    Notes on %rename and %ignore:

    • Since, the %rename declaration is used to declare a renaming in advance, it can be placed at the start of an interface file. This makes it possible to apply a consistent name resolution without having to modify header files. For example:

      %module foo
      
      /* Rename these overloaded functions */
      %rename(foo_i) foo(int); 
      %rename(foo_d) foo(double);
      
      %include "header.h"
      
    • The scope qualifier (::) can also be used on simple names. For example:

      %rename(bar) ::foo;       // Rename foo to bar in global scope only
      %rename(bar) Spam::foo;   // Rename foo to bar in class Spam only
      %rename(bar) *::foo;      // Rename foo in classes only
      
    • Name matching tries to find the most specific match that is defined. A qualified name such as Spam::foo always has higher precedence than an unqualified name foo. Spam::foo has higher precedence than *::foo and *::foo has higher precedence than foo. A parameterized name has higher precedence than an unparameterized name within the same scope level. However, an unparameterized name with a scope qualifier has higher precedence than a parameterized name in global scope (e.g., a renaming of Spam::foo takes precedence over a renaming of foo(int)).

    • The order in which %rename directives are defined does not matter as long as they appear before the declarations to be renamed. Thus, there is no difference between saying:

      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      %rename(Foo) Spam::foo;
      

      and this

      %rename(Foo) Spam::foo;
      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      

      (the declarations are not stored in a linked list and order has no importance). Of course, a repeated %rename directive will change the setting for a previous %rename directive if exactly the same name, scope, and parameters are supplied.

    • For multiple inheritance where renaming rules are defined for multiple base classes, the first renaming rule found on a depth-first traversal of the class hierarchy is used.
    • The name matching rules strictly follow member qualification rules. For example, if you have a class like this:

      class Spam {
      public:
        ...
        void bar() const;
        ...
      };
      

      the declaration

      %rename(name) Spam::bar();
      

      will not apply as there is no unqualified member bar(). The following will apply as the qualifier matches correctly:

      %rename(name) Spam::bar() const;
      

      An often overlooked C++ feature is that classes can define two different overloaded members that differ only in their qualifiers, like this:

      class Spam {
      public:
        ...
        void bar();         // Unqualified member
        void bar() const;   // Qualified member
        ...
      };
      

      %rename can then be used to target each of the overloaded methods individually. For example we can give them separate names in the target language:

      %rename(name1) Spam::bar();
      %rename(name2) Spam::bar() const;
      

      Similarly, if you merely wanted to ignore one of the declarations, use %ignore with the full qualification. For example, the following directive would tell SWIG to ignore the const version of bar() above:

      %ignore Spam::bar() const;   // Ignore bar() const, but leave other bar() alone
      
    • Currently no resolution is performed in order to match function parameters. This means function parameter types must match exactly. For example, namespace qualifiers and typedefs will not work. The following usage of typedefs demonstrates this:

      typedef int Integer;
      
      %rename(foo_i) foo(int);
      
      class Spam {
      public:
        void foo(Integer);  // Stays 'foo' (not renamed)
      };
      class Ham {
      public:
        void foo(int);      // Renamed to foo_i
      };
      
    • The name matching rules also use default arguments for finer control when wrapping methods that have default arguments. Recall that methods with default arguments are wrapped as if the equivalent overloaded methods had been parsed (Default arguments section). Let's consider the following example class:

      class Spam {
      public:
        ...
        void bar(int i=-1, double d=0.0);
        ...
      };
      

      The following %rename will match exactly and apply to all the target language overloaded methods because the declaration with the default arguments exactly matches the wrapped method:

      %rename(newbar) Spam::bar(int i=-1, double d=0.0);
      

      The C++ method can then be called from the target language with the new name no matter how many arguments are specified, for example: newbar(2, 2.0), newbar(2) or newbar(). However, if the %rename does not contain the default arguments, it will only apply to the single equivalent target language overloaded method. So if instead we have:

      %rename(newbar) Spam::bar(int i, double d);
      

      The C++ method must then be called from the target language with the new name newbar(2, 2.0) when both arguments are supplied or with the original name as bar(2) (one argument) or bar() (no arguments). In fact it is possible to use %rename on the equivalent overloaded methods, to rename all the equivalent overloaded methods:

      %rename(bar_2args)   Spam::bar(int i, double d);
      %rename(bar_1arg)    Spam::bar(int i);
      %rename(bar_default) Spam::bar();
      

      Similarly, the extra overloaded methods can be selectively ignored using %ignore.

      Compatibility note: The %rename directive introduced the default argument matching rules in SWIG-1.3.23 at the same time as the changes to wrapping methods with default arguments was introduced.

    6.15.4 Comments on overloading

    Support for overloaded methods was first added in SWIG-1.3.14. The implementation is somewhat unusual when compared to similar tools. For instance, the order in which declarations appear is largely irrelevant in SWIG. Furthermore, SWIG does not rely upon trial execution or exception handling to figure out which method to invoke.

    Internally, the overloading mechanism is completely configurable by the target language module. Therefore, the degree of overloading support may vary from language to language. As a general rule, statically typed languages like Java are able to provide more support than dynamically typed languages like Perl, Python, Ruby, and Tcl.

    6.16 Wrapping overloaded operators

    C++ overloaded operator declarations can be wrapped. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c) {
        rpart = c.rpart;
        ipart = c.ipart;
        return *this;
      }
      Complex operator+(const Complex &c) const {
        return Complex(rpart+c.rpart, ipart+c.ipart);
      }
      Complex operator-(const Complex &c) const {
        return Complex(rpart-c.rpart, ipart-c.ipart);
      }
      Complex operator*(const Complex &c) const {
        return Complex(rpart*c.rpart - ipart*c.ipart,
                       rpart*c.ipart + c.rpart*ipart);
      }
      Complex operator-() const {
        return Complex(-rpart, -ipart);
      }
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When operator declarations appear, they are handled in exactly the same manner as regular methods. However, the names of these methods are set to strings like "operator +" or "operator -". The problem with these names is that they are illegal identifiers in most scripting languages. For instance, you can't just create a method called "operator +" in Python--there won't be any way to call it.

    Some language modules already know how to automatically handle certain operators (mapping them into operators in the target language). However, the underlying implementation of this is really managed in a very general way using the %rename directive. For example, in Python a declaration similar to this is used:

    %rename(__add__) Complex::operator+;
    

    This binds the + operator to a method called __add__ (which is conveniently the same name used to implement the Python + operator). Internally, the generated wrapper code for a wrapped operator will look something like this pseudocode:

    _wrap_Complex___add__(args) {
      ... get args ...
      obj->operator+(args);
      ...
    }
    

    When used in the target language, it may now be possible to use the overloaded operator normally. For example:

    >>> a = Complex(3, 4)
    >>> b = Complex(5, 2)
    >>> c = a + b           # Invokes __add__ method
    

    It is important to realize that there is nothing magical happening here. The %rename directive really only picks a valid method name. If you wrote this:

    %rename(add) operator+;
    

    The resulting scripting interface might work like this:

    a = Complex(3, 4)
    b = Complex(5, 2)
    c = a.add(b)      # Call a.operator+(b)
    

    All of the techniques described to deal with overloaded functions also apply to operators. For example:

    %ignore Complex::operator=;             // Ignore = in class Complex
    %ignore *::operator=;                   // Ignore = in all classes
    %ignore operator=;                      // Ignore = everywhere.
    
    %rename(__sub__) Complex::operator-; 
    %rename(__neg__) Complex::operator-();  // Unary - 
    

    The last part of this example illustrates how multiple definitions of the operator- method might be handled.

    Handling operators in this manner is mostly straightforward. However, there are a few subtle issues to keep in mind:

    • In C++, it is fairly common to define different versions of the operators to account for different types. For example, a class might also include a friend function like this:

      class Complex {
      public:
        friend Complex operator+(Complex &, double);
      };
      Complex operator+(Complex &, double);
      

      SWIG simply ignores all friend declarations. Furthermore, it doesn't know how to associate the associated operator+ with the class (because it's not a member of the class).

      It's still possible to make a wrapper for this operator, but you'll have to handle it like a normal function. For example:

      %rename(add_complex_double) operator+(Complex &, double);
      
    • Certain operators are ignored by default. For instance, new and delete operators are ignored as well as conversion and index operators. A warning such as the one below is shown:

      example.i:12: Warning 503: Can't wrap 'operator []' unless renamed to a valid identifier.
      
    • The index operator, operator[], is particularly difficult to overload due to differences in C++ implementations. Specifically, the get and set operators in other languages typically are separated into two methods such that additional logic can be packed into the operations; C# uses this[type key] { get { ... } set { ... }}, Python uses __getitem__ and __setitem__, etc. In C++ if the return type of operator[] is a reference and the method is const, it is often indicative of the setter, and and the getter is usually a const function return an object by value. In the absence of any hard and fast rules and the fact that there may be multiple index operators, it is up to the user to choose the getter and setter to use by using %rename as shown earlier.

    • The semantics of certain C++ operators may not match those in the target language.

    6.17 Class extension

    New methods can be added to a class using the %extend directive. This directive is primarily used in conjunction with proxy classes to add additional functionality to an existing class. For example :

    %module vector
    %{
    #include "vector.h"
    %}
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      ... bunch of C++ methods ...
      %extend {
        char *__str__() {
          static char temp[256];
          sprintf(temp, "[ %g, %g, %g ]", $self->x, $self->y, $self->z);
          return &temp[0];
        }
      }
    };
    

    This code adds a __str__ method to our class for producing a string representation of the object. In Python, such a method would allow us to print the value of an object using the print command.

    >>>
    >>> v = Vector();
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = 0
    >>> print(v)
    [ 3.0, 4.0, 0.0 ]
    >>>
    
    

    The C++ 'this' pointer is often needed to access member variables, methods etc. The $self special variable should be used wherever you could use 'this'. The example above demonstrates this for accessing member variables. Note that the members dereferenced by $self must be public members as the code is ultimately generated into a global function and so will not have any access to non-public members. The implicit 'this' pointer that is present in C++ methods is not present in %extend methods. In order to access anything in the extended class or its base class, an explicit 'this' is required. The following example shows how one could access base class members:

    struct Base {
      virtual void method(int v) {
        ...
      }
      int value;
    };
    struct Derived : Base {
    };
    %extend Derived {
      virtual void method(int v) {
        $self->Base::method(v); // akin to this->Base::method(v);
        $self->value = v;       // akin to this->value = v;
        ...
      }
    }
    

    The following special variables are expanded if used within a %extend block: $name, $symname, $overname, $decl, $fulldecl, $parentclassname and $parentclasssymname. The Special variables section provides more information each of these special variables.

    The %extend directive follows all of the same conventions as its use with C structures. Please refer to the Adding member functions to C structures section for further details.

    Compatibility note: The %extend directive is a new name for the %addmethods directive in SWIG1.1. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    6.18 Templates

    Template type names may appear anywhere a type is expected in an interface file. For example:

    void foo(vector<int> *a, int n);
    void bar(list<int, 100> *x);
    

    There are some restrictions on the use of non-type arguments. Simple literals are supported, and so are some constant expressions. However, use of '<' and '>' within a constant expressions currently is not supported by SWIG ('<=' and '>=' are though). For example:

    void bar(list<int, 100> *x);                // OK
    void bar(list<int, 2*50> *x);               // OK
    void bar(list<int, (2>1 ? 100 : 50)> *x)    // Not supported
    

    The type system is smart enough to figure out clever games you might try to play with typedef. For instance, consider this code:

    typedef int Integer;
    void foo(vector<int> *x, vector<Integer> *y);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. The wrapper for foo() will accept either variant.

    Starting with SWIG-1.3.7, simple C++ template declarations can also be wrapped. SWIG-1.3.12 greatly expands upon the earlier implementation. Before discussing this any further, there are a few things you need to know about template wrapping. First, a bare C++ template does not define any sort of runnable object-code for which SWIG can normally create a wrapper. Therefore, in order to wrap a template, you need to give SWIG information about a particular template instantiation (e.g., vector<int>, array<double>, etc.). Second, an instantiation name such as vector<int> is generally not a valid identifier name in most target languages. Thus, you will need to give the template instantiation a more suitable name such as intvector when creating a wrapper.

    To illustrate, consider the following template definition:

    template<class T> class List {
    private:
        T *data;
        int nitems;
        int maxitems;
    public:
        List(int max) {
          data = new T [max];
          nitems = 0;
          maxitems = max;
        }
        ~List() {
          delete [] data;
        };
        void append(T obj) {
          if (nitems < maxitems) {
            data[nitems++] = obj;
          }
        }
        int length() {
          return nitems;
        }
        T get(int n) {
          return data[n];
        }
    };
    

    By itself, this template declaration is useless--SWIG simply ignores it because it doesn't know how to generate any code until unless a definition of T is provided.

    One way to create wrappers for a specific template instantiation is to simply provide an expanded version of the class directly like this:

    %rename(intList) List<int>;       // Rename to a suitable identifier
    class List<int> {
    private:
        int *data;
        int nitems;
        int maxitems;
    public:
        List(int max);
        ~List();
        void append(int obj);
        int length();
        int get(int n);
    };
    

    The %rename directive is needed to give the template class an appropriate identifier name in the target language (most languages would not recognize C++ template syntax as a valid class name). The rest of the code is the same as what would appear in a normal class definition.

    Since manual expansion of templates gets old in a hurry, the %template directive can be used to create instantiations of a template class. Semantically, %template is simply a shortcut---it expands template code in exactly the same way as shown above. Here are some examples:

    /* Instantiate a few different versions of the template */
    %template(intList) List<int>;
    %template(doubleList) List<double>;
    

    The argument to %template() is the name of the instantiation in the target language. The name you choose should not conflict with any other declarations in the interface file with one exception---it is okay for the template name to match that of a typedef declaration. For example:

    %template(intList) List<int>;
    ...
    typedef List<int> intList;    // OK
    

    SWIG can also generate wrappers for function templates using a similar technique. For example:

    // Function template
    template<class T> T max(T a, T b) { return a > b ? a : b; }
    
    // Make some different versions of this function
    %template(maxint) max<int>;
    %template(maxdouble) max<double>;
    

    In this case, maxint and maxdouble become unique names for specific instantiations of the function.

    The number of arguments supplied to %template should match that in the original template definition. Template default arguments are supported. For example:

    template vector<typename T, int max=100> class vector {
    ...
    };
    
    %template(intvec) vector<int>;           // OK
    %template(vec1000) vector<int, 1000>;     // OK
    

    The %template directive should not be used to wrap the same template instantiation more than once in the same scope. This will generate an error. For example:

    %template(intList) List<int>;
    %template(Listint) List<int>;    // Error.   Template already wrapped.
    

    This error is caused because the template expansion results in two identical classes with the same name. This generates a symbol table conflict. Besides, it probably more efficient to only wrap a specific instantiation only once in order to reduce the potential for code bloat.

    Since the type system knows how to handle typedef, it is generally not necessary to instantiate different versions of a template for typenames that are equivalent. For instance, consider this code:

    %template(intList) vector<int>;
    typedef int Integer;
    ...
    void foo(vector<Integer> *x);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. Any use of Vector<Integer> is mapped back to the instantiation of vector<int> created earlier. Therefore, it is not necessary to instantiate a new class for the type Integer (doing so is redundant and will simply result in code bloat).

    When a template is instantiated using %template, information about that class is saved by SWIG and used elsewhere in the program. For example, if you wrote code like this,

    ...
    %template(intList) List<int>;
    ...
    class UltraList : public List<int> {
      ...
    };
    

    then SWIG knows that List<int> was already wrapped as a class called intList and arranges to handle the inheritance correctly. If, on the other hand, nothing is known about List<int>, you will get a warning message similar to this:

    example.h:42: Warning 401. Nothing known about class 'List<int >'. Ignored. 
    example.h:42: Warning 401. Maybe you forgot to instantiate 'List<int >' using %template. 
    

    If a template class inherits from another template class, you need to make sure that base classes are instantiated before derived classes. For example:

    template<class T> class Foo {
    ...
    };
    
    template<class T> class Bar : public Foo<T> {
    ...
    };
    
    // Instantiate base classes first 
    %template(intFoo) Foo<int>;
    %template(doubleFoo) Foo<double>;
    
    // Now instantiate derived classes
    %template(intBar) Bar<int>;
    %template(doubleBar) Bar<double>;
    

    The order is important since SWIG uses the instantiation names to properly set up the inheritance hierarchy in the resulting wrapper code (and base classes need to be wrapped before derived classes). Don't worry--if you get the order wrong, SWIG should generate a warning message.

    Occasionally, you may need to tell SWIG about base classes that are defined by templates, but which aren't supposed to be wrapped. Since SWIG is not able to automatically instantiate templates for this purpose, you must do it manually. To do this, simply use the empty template instantiation, that is, %template with no name. For example:

    // Instantiate traits<double, double>, but don't wrap it.
    %template() traits<double, double>;
    

    If you have to instantiate a lot of different classes for many different types, you might consider writing a SWIG macro. For example:

    %define TEMPLATE_WRAP(prefix, T...) 
    %template(prefix ## Foo) Foo<T >;
    %template(prefix ## Bar) Bar<T >;
    ...
    %enddef
    
    TEMPLATE_WRAP(int, int)
    TEMPLATE_WRAP(double, double)
    TEMPLATE_WRAP(String, char *)
    TEMPLATE_WRAP(PairStringInt, std::pair<string, int>)
    ...
    

    Note the use of a vararg macro for the type T. If this wasn't used, the comma in the templated type in the last example would not be possible.

    The SWIG template mechanism does support specialization. For instance, if you define a class like this,

    template<> class List<int> {
    private:
        int *data;
        int nitems;
        int maxitems;
    public:
        List(int max);
        ~List();
        void append(int obj);
        int length();
        int get(int n);
    };
    

    then SWIG will use this code whenever the user expands List<int>. In practice, this may have very little effect on the underlying wrapper code since specialization is often used to provide slightly modified method bodies (which are ignored by SWIG). However, special SWIG directives such as %typemap, %extend, and so forth can be attached to a specialization to provide customization for specific types.

    Partial template specialization is partially supported by SWIG. For example, this code defines a template that is applied when the template argument is a pointer.

    template<class T> class List<T*> {
    private:
        T *data;
        int nitems;
        int maxitems;
    public:
        List(int max);
        ~List();
        void append(int obj);
        int length();
        T get(int n);
    };
    

    SWIG supports both template explicit specialization and partial specialization. Consider:

    template<class T1, class T2> class Foo { };                     // (1) primary template
    template<>                   class Foo<double *, int *> { };    // (2) explicit specialization
    template<class T1, class T2> class Foo<T1, T2 *> { };           // (3) partial specialization
    

    SWIG is able to properly match explicit instantiations:

    Foo<double *, int *>     // explicit specialization matching (2)
    

    SWIG implements template argument deduction so that the following partial specialization examples work just like they would with a C++ compiler:

    Foo<int *, int *>        // partial specialization matching (3)
    Foo<int *, const int *>  // partial specialization matching (3)
    Foo<int *, int **>       // partial specialization matching (3)
    

    Member function templates are supported. The underlying principle is the same as for normal templates--SWIG can't create a wrapper unless you provide more information about types. For example, a class with a member template might look like this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    

    To expand the template, simply use %template inside the class.

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    Or, if you want to leave the original class definition alone, just do this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    %extend Foo {
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    or simply

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    
    %template(bari) Foo::bar<int>;
    %template(bard) Foo::bar<double>;
    

    In this case, the %extend directive is not needed, and %template does exactly the same job, i.e., it adds two new methods to the Foo class.

    Note: because of the way that templates are handled, the %template directive must always appear after the definition of the template to be expanded.

    Now, if your target language supports overloading, you can even try

    %template(bar) Foo::bar<int>;
    %template(bar) Foo::bar<double>;
    

    and since the two new wrapped methods have the same name 'bar', they will be overloaded, and when called, the correct method will be dispatched depending on the argument type.

    When used with members, the %template directive may be placed in another template class. Here is a slightly perverse example:

    // A template
    template<class T> class Foo {
    public:
      // A member template
      template<class S> T bar(S x, S y) { ... };
      ...
    };
    
    // Expand a few member templates
    %extend Foo {
      %template(bari) bar<int>;
      %template(bard) bar<double>;
    }
    
    // Create some wrappers for the template
    %template(Fooi) Foo<int>;
    %template(Food) Foo<double>;
    

    Miraculously, you will find that each expansion of Foo has member functions bari() and bard() added.

    A common use of member templates is to define constructors for copies and conversions. For example:

    template<class T1, class T2> struct pair {
      T1 first;
      T2 second;
      pair() : first(T1()), second(T2()) { }
      pair(const T1 &x, const T2 &y) : first(x), second(y) { }
      template<class U1, class U2> pair(const pair<U1, U2> &x)
                                           : first(x.first), second(x.second) { }
    };
    

    This declaration is perfectly acceptable to SWIG, but the constructor template will be ignored unless you explicitly expand it. To do that, you could expand a few versions of the constructor in the template class itself. For example:

    %extend pair {
      %template(pair) pair<T1, T2>;        // Generate default copy constructor
    };
    

    When using %extend in this manner, notice how you can still use the template parameters in the original template definition.

    Alternatively, you could expand the constructor template in selected instantiations. For example:

    // Instantiate a few versions
    %template(pairii) pair<int, int>;
    %template(pairdd) pair<double, double>;
    
    // Create a default constructor only 
    %extend pair<int, int> {
      %template(paird) pair<int, int>;         // Default constructor
    };
    
    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(paird) pair<double, dobule>;   // Default constructor
      %template(pairc) pair<int, int>;         // Conversion constructor
    };
    

    And if your target language supports overloading, then you can try instead:

    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(pair) pair<double, dobule>;   // Default constructor
      %template(pair) pair<int, int>;         // Conversion constructor
    };
    

    In this case, the default and conversion constructors have the same name. Hence, SWIG will overload them and define an unique visible constructor, that will dispatch the proper call depending on the argument type.

    If all of this isn't quite enough and you really want to make someone's head explode, SWIG directives such as %rename, %extend, and %typemap can be included directly in template definitions. For example:

    // File : list.h
    template<class T> class List {
      ...
    public:
      %rename(__getitem__) get(int);
      List(int max);
      ~List();
      ...
      T get(int index);
      %extend {
        char *__str__() {
          /* Make a string representation */
          ...
        }
      }
    };
    

    In this example, the extra SWIG directives are propagated to every template instantiation.

    It is also possible to separate these declarations from the template class. For example:

    %rename(__getitem__) List::get;
    %extend List {
      char *__str__() {
        /* Make a string representation */
        ...
      }
      /* Make a copy */
      T *__copy__() {
        return new List<T>(*$self);
      }
    };
    
    ...
    template<class T> class List {
        ...
        public:
        List() { }
        T get(int index);
        ...
    };
    

    When %extend is decoupled from the class definition, it is legal to use the same template parameters as provided in the class definition. These are replaced when the template is expanded. In addition, the %extend directive can be used to add additional methods to a specific instantiation. For example:

    %template(intList) List<int>;
    
    %extend List<int> {
        void blah() {
              printf("Hey, I'm an List<int>!\n");
        }
    };
    

    SWIG even supports overloaded templated functions. As usual the %template directive is used to wrap templated functions. For example:

    template<class T> void foo(T x) { };
    template<class T> void foo(T x, T y) { };
    
    %template(foo) foo<int>;
    

    This will generate two overloaded wrapper methods, the first will take a single integer as an argument and the second will take two integer arguments.

    It is even possible to extend a class via %extend with template methods, for example:

    %include <std_string.i>
    
    %inline %{
    class ExtendMe {
    public:
      template <typename T>
      T do_stuff_impl(int a, T b, double d) {
        return b;
      }
    };
    %}
    
    %extend ExtendMe {
      template<typename T>
      T do_overloaded_stuff(T b) {
        return $self->do_stuff_impl(0, b, 4.0);
      }
    }
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<std::string>;
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<double>;
    

    The wrapped ExtendMe class will then have two (overloaded) methods called do_overloaded_stuff.

    Compatibility Note: Extending a class with template methods was added in version 3.0.12

    Needless to say, SWIG's template support provides plenty of opportunities to break the universe. That said, an important final point is that SWIG does not perform extensive error checking of templates! Specifically, SWIG does not perform type checking nor does it check to see if the actual contents of the template declaration make any sense. Since the C++ compiler checks this when it compiles the resulting wrapper file, there is no practical reason for SWIG to duplicate this functionality.

    As SWIG's template support does not perform type checking %template can be used as early as after a template declaration. You can, and rarely have to, use %template before the template parameters have been declared. For example:

    template <class T> class OuterTemplateClass {};
    
    // The nested class OuterClass::InnerClass inherits from the template class
    // OuterTemplateClass<OuterClass::InnerStruct> and thus the template needs
    // to be expanded with %template before the OuterClass declaration.
    %template(OuterTemplateClass_OuterClass__InnerStruct)
        OuterTemplateClass<OuterClass::InnerStruct>
    
    
    // Don't forget to use %feature("flatnested") for OuterClass::InnerStruct and
    // OuterClass::InnerClass if the target language doesn't support nested classes.
    class OuterClass {
        public:
            // Forward declarations:
            struct InnerStruct;
            class InnerClass;
    };
    
    struct OuterClass::InnerStruct {};
    
    // Expanding the template at this point with %template is too late as the
    // OuterClass::InnerClass declaration is processed inside OuterClass.
    
    class OuterClass::InnerClass : public OuterTemplateClass<InnerStruct> {};
    

    Compatibility Note: The first implementation of template support relied heavily on macro expansion in the preprocessor. Templates have been more tightly integrated into the parser and type system in SWIG-1.3.12 and the preprocessor is no longer used. Code that relied on preprocessing features in template expansion will no longer work. However, SWIG still allows the # operator to be used to generate a string from a template argument.

    Compatibility Note: In earlier versions of SWIG, the %template directive introduced a new class name. This name could then be used with other directives. For example:

    %template(vectori) vector<int>;
    %extend vectori {
        void somemethod() { }
    };
    

    This behavior is no longer supported. Instead, you should use the original template name as the class name. For example:

    %template(vectori) vector<int>;
    %extend vector<int> {
        void somemethod() { }
    };
    

    Similar changes apply to typemaps and other customization features.

    6.19 Namespaces

    Support for C++ namespaces is comprehensive, but by default simple, however, some target languages can turn on more advanced namespace support via the nspace feature, described later. Code within unnamed namespaces is ignored as there is no external access to symbols declared within the unnamed namespace. Before detailing the default implementation for named namespaces, it is worth noting that the semantics of C++ namespaces is extremely non-trivial--especially with regard to the C++ type system and class machinery. At a most basic level, namespaces are sometimes used to encapsulate common functionality. For example:

    namespace math {
      double sin(double);
      double cos(double);
    
      class Complex {
        double im, re;
      public:
        ...
      };
      ...
    };
    

    Members of the namespace are accessed in C++ by prepending the namespace prefix to names. For example:

    double x = math::sin(1.0);
    double magnitude(math::Complex *c);
    math::Complex c;
    ...
    

    At this level, namespaces are relatively easy to manage. However, things start to get very ugly when you throw in the other ways a namespace can be used. For example, selective symbols can be exported from a namespace with using.

    using math::Complex;
    double magnitude(Complex *c);       // Namespace prefix stripped
    

    Similarly, the contents of an entire namespace can be made available like this:

    using namespace math;
    double x = sin(1.0);
    double magnitude(Complex *c);
    

    Alternatively, a namespace can be aliased:

    namespace M = math;
    double x = M::sin(1.0);
    double magnitude(M::Complex *c);
    

    Using combinations of these features, it is possible to write head-exploding code like this:

    namespace A {
      class Foo {
      };
    }
    
    namespace B {
      namespace C {
        using namespace A;
      }
      typedef C::Foo FooClass;
    }
    
    namespace BIGB = B;
    
    namespace D {
      using BIGB::FooClass;
      class Bar : public FooClass {
      }
    };
    
    class Spam : public D::Bar {
    };
    
    void evil(A::Foo *a, B::FooClass *b, B::C::Foo *c, BIGB::FooClass *d,
              BIGB::C::Foo *e, D::FooClass *f);
    
    

    Given the possibility for such perversion, it's hard to imagine how every C++ programmer might want such code wrapped into the target language. Clearly this code defines three different classes. However, one of those classes is accessible under at least six different names!

    SWIG fully supports C++ namespaces in its internal type system and class handling code. If you feed SWIG the above code, it will be parsed correctly, it will generate compilable wrapper code, and it will produce a working scripting language module. However, the default wrapping behavior is to flatten namespaces in the target language. This means that the contents of all namespaces are merged together in the resulting scripting language module. For example, if you have code like this,

    %module foo
    namespace foo {
      void bar(int);
      void spam();
    }
    
    namespace bar {
      void blah();
    }
    
    

    then SWIG simply creates three wrapper functions bar(), spam(), and blah() in the target language. SWIG does not prepend the names with a namespace prefix nor are the functions packaged in any kind of nested scope.

    There is some rationale for taking this approach. Since C++ namespaces are often used to define modules in C++, there is a natural correlation between the likely contents of a SWIG module and the contents of a namespace. For instance, it would not be unreasonable to assume that a programmer might make a separate extension module for each C++ namespace. In this case, it would be redundant to prepend everything with an additional namespace prefix when the module itself already serves as a namespace in the target language. Or put another way, if you want SWIG to keep namespaces separate, simply wrap each namespace with its own SWIG interface.

    Because namespaces are flattened, it is possible for symbols defined in different namespaces to generate a name conflict in the target language. For example:

    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);
    }
    

    When this conflict occurs, you will get an error message that resembles this:

    example.i:26. Error. 'foo' is multiply defined in the generated target language module.
    example.i:23. Previous declaration of 'foo'
    

    To resolve this error, simply use %rename to disambiguate the declarations. For example:

    %rename(B_foo) B::foo;
    ...
    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);     // Gets renamed to B_foo
    }
    

    Similarly, %ignore can be used to ignore declarations.

    using declarations do not have any effect on the generated wrapper code. They are ignored by SWIG language modules and they do not result in any code. However, these declarations are used by the internal type system to track type-names. Therefore, if you have code like this:

    namespace A {
      typedef int Integer;
    }
    using namespace A;
    void foo(Integer x);
    

    SWIG knows that Integer is the same as A::Integer which is the same as int.

    Namespaces may be combined with templates. If necessary, the %template directive can be used to expand a template defined in a different namespace. For example:

    namespace foo {
        template<typename T> T max(T a, T b) { return a > b ? a : b; }
    }
    
    using foo::max;
    
    %template(maxint)   max<int>;           // Okay.
    %template(maxfloat) foo::max<float>;    // Okay (qualified name).
    
    namespace bar {
        using namespace foo;
        %template(maxdouble)  max<double>;    // Okay.
    }
    

    The combination of namespaces and other SWIG directives may introduce subtle scope-related problems. The key thing to keep in mind is that all SWIG generated wrappers are produced in the global namespace. Symbols from other namespaces are always accessed using fully qualified names---names are never imported into the global space unless the interface happens to do so with a using declaration. In almost all cases, SWIG adjusts typenames and symbols to be fully qualified. However, this is not done in code fragments such as function bodies, typemaps, exception handlers, and so forth. For example, consider the following:

    namespace foo {
      typedef int Integer;
      class bar {
        public:
          ...
      };
    }
    
    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        Integer r = x + y;        // Error. Integer not defined in this scope
        return r;
      }
    };
    

    In this case, SWIG correctly resolves the added method parameters and return type to foo::Integer. However, since function bodies aren't parsed and such code is emitted in the global namespace, this code produces a compiler error about Integer. To fix the problem, make sure you use fully qualified names. For example:

    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        foo::Integer r = x + y;        // Ok.
        return r;
      }
    };
    

    Note: SWIG does not propagate using declarations to the resulting wrapper code. If these declarations appear in an interface, they should also appear in any header files that might have been included in a %{ ... %} section. In other words, don't insert extra using declarations into a SWIG interface unless they also appear in the underlying C++ code.

    Note: Code inclusion directives such as %{ ... %} or %inline %{ ... %} should not be placed inside a namespace declaration. The code emitted by these directives will not be enclosed in a namespace and you may get very strange results. If you need to use namespaces with these directives, consider the following:

    // Good version
    %inline %{
    namespace foo {
      void bar(int) { ... }
      ...
    }
    %}
    
    // Bad version.  Emitted code not placed in namespace.
    namespace foo {
    %inline %{
      void bar(int) { ... }   /* I'm bad */
      ...
      %}
    }
    

    Note: When the %extend directive is used inside a namespace, the namespace name is included in the generated functions. For example, if you have code like this,

    namespace foo {
      class bar {
        public:
          %extend {
            int blah(int x);
          };
      };
    }
    

    the added method blah() is mapped to a function int foo_bar_blah(foo::bar *self, int x). This function resides in the global namespace.

    Note: Although namespaces are flattened in the target language, the SWIG generated wrapper code observes the same namespace conventions as used in the input file. Thus, if there are no symbol conflicts in the input, there will be no conflicts in the generated code.

    Note: In the same way that no resolution is performed on parameters, a conversion operator name must match exactly to how it is defined. Do not change the qualification of the operator. For example, suppose you had an interface like this:

    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator bar();      // Conversion of spam -> bar
        ...
      };
    }
    

    The following is how the feature is expected to be written for a successful match:

    %rename(tofoo) foo::spam::operator bar();
    

    The following does not work as no namespace resolution is performed in the matching of conversion operator names:

    %rename(tofoo) foo::spam::operator foo::bar();
    

    Note, however, that if the operator is defined using a qualifier in its name, then the feature must use it too...

    %rename(tofoo) foo::spam::operator bar();      // will not match
    %rename(tofoo) foo::spam::operator foo::bar(); // will match
    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator foo::bar();
        ...
      };
    }
    

    Compatibility Note: Versions of SWIG prior to 1.3.32 were inconsistent in this approach. A fully qualified name was usually required, but would not work in some situations.

    Note: The flattening of namespaces is only intended to serve as a basic namespace implementation. None of the target language modules are currently programmed with any namespace awareness. In the future, language modules may or may not provide more advanced namespace support.

    6.19.1 The nspace feature for namespaces

    Some target languages provide support for the nspace feature. The feature can be applied to any class, struct, union or enum declared within a named namespace. The feature wraps the type within the target language specific concept of a namespace, for example, a Java package or C# namespace. Please see the language specific sections to see if the target language you are interested in supports the nspace feature.

    The feature is demonstrated below for C# using the following example:

    %feature("nspace") MyWorld::Material::Color;
    %nspace MyWorld::Wrapping::Color; // %nspace is a macro for %feature("nspace")
    
    namespace MyWorld {
      namespace Material {
        class Color {
        ...
        };
      }
      namespace Wrapping {
        class Color {
        ...
        };
      }
    }
    

    Without the nspace feature directives above or %rename, you would get the following warning resulting in just one of the Color classes being available for use from the target language:

    example.i:9: Error: 'Color' is multiply defined in the generated target language module.
    example.i:5: Error: Previous declaration of 'Color'
    

    With the nspace feature the two Color classes are wrapped into the equivalent C# namespaces. A fully qualified constructor call of each these two types in C# is then:

    MyWorld.Material.Color materialColor = new MyWorld.Material.Color();
    MyWorld.Wrapping.Color wrappingColor = new MyWorld.Wrapping.Color();
    

    Note that the nspace feature does not apply to variables and functions simply declared in a namespace. For example, the following symbols cannot co-exist in the target language without renaming. This may change in a future version.

    namespace MyWorld {
      namespace Material {
        int quantity;
        void dispatch();
      }
      namespace Wrapping {
        int quantity;
        void dispatch();
      }
    }
    

    Compatibility Note: The nspace feature was first introduced in SWIG-2.0.0.

    6.20 Renaming templated types in namespaces

    As has been mentioned, when %rename includes parameters, the parameter types must match exactly (no typedef or namespace resolution is performed). SWIG treats templated types slightly differently and has an additional matching rule so unlike non-templated types, an exact match is not always required. If the fully qualified templated type is specified, it will have a higher precedence over the generic template type. In the example below, the generic template type is used to rename to bbb and the fully qualified type is used to rename to ccc.

    %rename(bbb) Space::ABC::aaa(T t);                  // will match but with lower precedence than ccc
    %rename(ccc) Space::ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence
                                                                 // than bbb
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    It should now be apparent that there are many ways to achieve a renaming with %rename. This is demonstrated by the following two examples, which are effectively the same as the above example. Below shows how %rename can be placed inside a namespace.

    namespace Space {
      %rename(bbb) ABC::aaa(T t);                     // will match but with lower precedence than ccc
      %rename(ccc) ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence than bbb
      %rename(ddd) ABC<Space::XYZ>::aaa(XYZ t);       // will not match
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    Note that ddd does not match as there is no namespace resolution for parameter types and the fully qualified type must be specified for template type expansion. The following example shows how %rename can be placed within %extend.

    namespace Space {
      %extend ABC {
        %rename(bbb) aaa(T t);         // will match but with lower precedence than ccc
      }
      %extend ABC<Space::XYZ> {
        %rename(ccc) aaa(Space::XYZ t);// will match but with higher precedence than bbb
        %rename(ddd) aaa(XYZ t);       // will not match
      }
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    6.21 Exception specifications

    When C++ programs utilize exceptions, exceptional behavior is sometimes specified as part of a function or method declaration. For example:

    class Error { };
    
    class Foo {
    public:
        ...
        void blah() throw(Error);
        ...
    };
    

    If an exception specification is used, SWIG automatically generates wrapper code for catching the indicated exception and, when possible, rethrowing it into the target language, or converting it into an error in the target language otherwise. For example, in Python, you can write code like this:

    f = Foo()
    try:
        f.blah()
    except Error, e:
        # e is a wrapped instance of "Error"
    

    Details of how to tailor code for handling the caught C++ exception and converting it into the target language's exception/error handling mechanism is outlined in the "throws" typemap section.

    Since exception specifications are sometimes only used sparingly, this alone may not be enough to properly handle C++ exceptions. To do that, a different set of special SWIG directives are used. Consult the "Exception handling with %exception" section for details. The next section details a way of simulating an exception specification or replacing an existing one.

    6.22 Exception handling with %catches

    Exceptions are automatically handled for methods with an exception specification. Similar handling can be achieved for methods without exception specifications through the %catches feature. It is also possible to replace any declared exception specification using the %catches feature. In fact, %catches uses the same "throws" typemaps that SWIG uses for exception specifications in handling exceptions. The %catches feature must contain a list of possible types that can be thrown. For each type that is in the list, SWIG will generate a catch handler, in the same way that it would for types declared in the exception specification. Note that the list can also include the catch all specification "...". For example,

    struct EBase { virtual ~EBase(); };
    struct Error1 : EBase { };
    struct Error2 : EBase { };
    struct Error3 : EBase { };
    struct Error4 : EBase { };
    
    %catches(Error1, Error2, ...) Foo::bar();
    %catches(EBase) Foo::blah();
    
    class Foo {
    public:
        ...
        void bar();
        void blah() throw(Error1, Error2, Error3, Error4);
        ...
    };
    

    For the Foo::bar() method, which can throw anything, SWIG will generate catch handlers for Error1, Error2 as well as a catch all handler (...). Each catch handler will convert the caught exception and convert it into a target language error/exception. The catch all handler will convert the caught exception into an unknown error/exception.

    Without the %catches feature being attached to Foo::blah(), SWIG will generate catch handlers for all of the types in the exception specification, that is, Error1, Error2, Error3, Error4. However, with the %catches feature above, just a single catch handler for the base class, EBase will be generated to convert the C++ exception into a target language error/exception.

    6.23 Pointers to Members

    Starting with SWIG-1.3.7, there is limited parsing support for pointers to C++ class members. For example:

    double do_op(Object *o, double (Object::*callback)(double, double));
    extern double (Object::*fooptr)(double, double);
    %constant double (Object::*FOO)(double, double) = &Object::foo;
    

    Although these kinds of pointers can be parsed and represented by the SWIG type system, few language modules know how to handle them due to implementation differences from standard C pointers. Readers are strongly advised to consult an advanced text such as the "The Annotated C++ Manual" for specific details.

    When pointers to members are supported, the pointer value might appear as a special string like this:

    >>> print example.FOO
    _ff0d54a800000000_m_Object__f_double_double__double
    >>>
    

    In this case, the hexadecimal digits represent the entire value of the pointer which is usually the contents of a small C++ structure on most machines.

    SWIG's type-checking mechanism is also more limited when working with member pointers. Normally SWIG tries to keep track of inheritance when checking types. However, no such support is currently provided for member pointers.

    6.24 Smart pointers and operator->()

    In some C++ programs, objects are often encapsulated by smart-pointers or proxy classes. This is sometimes done to implement automatic memory management (reference counting) or persistence. Typically a smart-pointer is defined by a template class where the -> operator has been overloaded. This class is then wrapped around some other class. For example:

    // Smart-pointer class
    template<class T> class SmartPtr {
        T *pointee;
    public:
        SmartPtr(T *p) : pointee(p) { ... }
        T *operator->() {
            return pointee;
        }
        ...
    };
    
    // Ordinary class
    class Foo_Impl {
    public:
        int x;
        virtual void bar();
        ...
    };
    
    // Smart-pointer wrapper
    typedef SmartPtr<Foo_Impl> Foo;
    
    // Create smart pointer Foo
    Foo make_Foo() {
        return SmartPtr<Foo_Impl>(new Foo_Impl());
    }
    
    // Do something with smart pointer Foo
    void do_something(Foo f) {
        printf("x = %d\n", f->x);
        f->bar();
    }
    
    // Call the wrapped smart pointer proxy class in the target language 'Foo'
    %template(Foo) SmartPtr<Foo_Impl>;
    

    A key feature of this approach is that by defining operator-> the methods and attributes of the object wrapped by a smart pointer are transparently accessible. For example, expressions such as these (from the previous example),

    f->x
    f->bar()
    

    are transparently mapped to the following

    (f.operator->())->x;
    (f.operator->())->bar();
    

    When generating wrappers, SWIG tries to emulate this functionality to the extent that it is possible. To do this, whenever operator->() is encountered in a class, SWIG looks at its returned type and uses it to generate wrappers for accessing attributes of the underlying object. For example, wrapping the above code produces wrappers like this:

    int Foo_x_get(Foo *f) {
      return (*f)->x;
    }
    void Foo_x_set(Foo *f, int value) {
      (*f)->x = value;
    }
    void Foo_bar(Foo *f) {
      (*f)->bar();
    }
    

    These wrappers take a smart-pointer instance as an argument, but dereference it in a way to gain access to the object returned by operator->(). You should carefully compare these wrappers to those in the first part of this chapter (they are slightly different).

    The end result is that access looks very similar to C++. For example, you could do this in Python:

    >>> f = make_Foo()
    >>> print f.x
    0
    >>> f.bar()
    >>>
    

    When generating wrappers through a smart-pointer, SWIG tries to generate wrappers for all methods and attributes that might be accessible through operator->(). This includes any methods that might be accessible through inheritance. However, there are a number of restrictions:

    • Member variables and methods are wrapped through a smart pointer. Enumerations, constructors, and destructors are not wrapped.
    • If the smart-pointer class and the underlying object both define a method or variable of the same name, then the smart-pointer version has precedence. For example, if you have this code

      class Foo {
      public:
          int x;
      };
      
      class Bar {
      public:
          int x;       
          Foo *operator->();
      };
      

      then the wrapper for Bar::x accesses the x defined in Bar, and not the x defined in Foo.

    If your intent is to only expose the smart-pointer class in the interface, it is not necessary to wrap both the smart-pointer class and the class for the underlying object. However, you must still tell SWIG about both classes if you want the technique described in this section to work. To only generate wrappers for the smart-pointer class, you can use the %ignore directive. For example:

    %ignore Foo;
    class Foo {       // Ignored
    };
    
    class Bar {
    public:
      Foo *operator->();
      ...
    };
    

    Alternatively, you can import the definition of Foo from a separate file using %import.

    Note: When a class defines operator->(), the operator itself is wrapped as a method __deref__(). For example:

    f = Foo()               # Smart-pointer
    p = f.__deref__()       # Raw pointer from operator->
    

    Note: To disable the smart-pointer behavior, use %ignore to ignore operator->(). For example:

    %ignore Bar::operator->;
    

    Note: Smart pointer support was first added in SWIG-1.3.14.

    6.25 C++ reference counted objects - ref/unref feature

    Another similar idiom in C++ is the use of reference counted objects. Consider for example:

    class RCObj  {
      // implement the ref counting mechanism
      int add_ref();
      int del_ref();
      int ref_count();
    
    public:
      virtual ~RCObj() = 0;
    
      int ref() const {
        return add_ref();
      }
    
      int unref() const {
        if (ref_count() == 0 || del_ref() == 0 ) {
          delete this;
          return 0;
        }
        return ref_count();
      }
    };
    
    
    class A : RCObj {
    public:
      A();
      int foo();
    };
    
    
    class B {
      A *_a;
    
    public:
      B(A *a) : _a(a) { 
        a->ref(); 
      }
    
      ~B() { 
        a->unref(); 
      }
    };
    
    int main() {
      A *a  = new A();       // (count: 0)
      a->ref();           // 'a' ref here (count: 1)
    
      B *b1 = new B(a);   // 'a' ref here (count: 2)
      if (1 + 1 == 2) {
        B *b2 = new B(a); // 'a' ref here (count: 3)
        delete b2;        // 'a' unref, but not deleted (count: 2)
      }
    
      delete b1;          // 'a' unref, but not deleted (count: 1)
      a->unref();         // 'a' unref and deleted (count: 0)
    }
    

    In the example above, the 'A' class instance 'a' is a reference counted object, which can't be deleted arbitrarily since it is shared between the objects 'b1' and 'b2'. 'A' is derived from a Reference Counted Object 'RCObj', which implements the ref/unref idiom.

    To tell SWIG that 'RCObj' and all its derived classes are reference counted objects, use the "ref" and "unref" features. These are also available as %refobject and %unrefobject, respectively. For example:

    %module example
    ...
    
    %feature("ref")   RCObj "$this->ref();"
    %feature("unref") RCObj "$this->unref();"
    
    %include "rcobj.h"
    %include "A.h"
    ...
    

    where the code passed to the "ref" and "unref" features will be executed as needed whenever a new object is passed to python, or when python tries to release the proxy object instance, respectively.

    On the python side, the use of a reference counted object is no different to any other regular instance:

    def create_A():
        a = A()         # SWIG ref 'a' - new object is passed to python (count: 1)
        b1 = B(a)       # C++ ref 'a (count: 2)
        if 1 + 1 == 2:
            b2 = B(a)   # C++ ref 'a' (count: 3)
        return a        # 'b1' and 'b2' are released and deleted, C++ unref 'a' twice (count: 1)
    
    a = create_A()      # (count: 1)
    exit                # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    Note that the user doesn't explicitly need to call 'a->ref()' nor 'a->unref()' (and neither 'delete a'). Instead, SWIG takes cares of executing the "ref" and "unref" calls as needed. If the user doesn't specify the "ref/unref" feature for a type, SWIG will produce code equivalent to defining these features:

    %feature("ref")   ""
    %feature("unref") "delete $this;"
    

    In other words, SWIG will not do anything special when a new object is passed to python, and it will always 'delete' the underlying object when python releases the proxy instance.

    The %newobject feature is designed to indicate to the target language that it should take ownership of the returned object. When used in conjunction with a type that has the "ref" feature associated with it, it additionally emits the code in the "ref" feature into the C++ wrapper. Consider wrapping the following factory function in addition to the above:

    %newobject AFactory;
    A *AFactory() {
      return new A();
    }
    

    The AFactory function now acts much like a call to the A constructor with respect to memory handling:

    a = AFactory()    # SWIG ref 'a' due to %newobject (count: 1)
    exit              # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    6.26 Using declarations and inheritance

    using declarations are sometimes used to adjust access to members of base classes. For example:

    class Foo {
    public:
          int  blah(int x);
    };
    
    class Bar {
    public:
          double blah(double x);
    };
    
    class FooBar : public Foo, public Bar {
    public:
          using Foo::blah;  
          using Bar::blah;
          char *blah(const char *x);
    };
    

    In this example, the using declarations make different versions of the overloaded blah() method accessible from the derived class. For example:

    FooBar *f;
    f->blah(3);         // Ok. Invokes Foo::blah(int)
    f->blah(3.5);       // Ok. Invokes Bar::blah(double)
    f->blah("hello");   // Ok. Invokes FooBar::blah(const char *);
    

    SWIG emulates the same functionality when creating wrappers. For example, if you wrap this code in Python, the module works just like you would expect:

    >>> import example
    >>> f = example.FooBar()
    >>> f.blah(3)
    >>> f.blah(3.5)
    >>> f.blah("hello")
    

    using declarations can also be used to change access when applicable. For example:

    class Foo {
    protected:
        int x;
        int blah(int x);
    };
    
    class Bar : public Foo {
    public:
        using Foo::x;       // Make x public
        using Foo::blah;    // Make blah public
    };
    

    This also works in SWIG---the exposed declarations will be wrapped normally.

    When using declarations are used as shown in these examples, declarations from the base classes are copied into the derived class and wrapped normally. When copied, the declarations retain any properties that might have been attached using %rename, %ignore, or %feature. Thus, if a method is ignored in a base class, it will also be ignored by a using declaration.

    Because a using declaration does not provide fine-grained control over the declarations that get imported, it may be difficult to manage such declarations in applications that make heavy use of SWIG customization features. If you can't get using to work correctly, you can always change the interface to the following:

    
    class FooBar : public Foo, public Bar {
    public:
    #ifndef SWIG
          using Foo::blah;  
          using Bar::blah;
    #else
          int blah(int x);         // explicitly tell SWIG about other declarations
          double blah(double x);
    #endif
    
          char *blah(const char *x);
    };
    

    Notes:

    • If a derived class redefines a method defined in a base class, then a using declaration won't cause a conflict. For example:

      class Foo {
      public:
        int blah(int );
        double blah(double);
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;    // Only imports blah(double);
        int blah(int);
      };
      
    • Resolving ambiguity in overloading may prevent declarations from being imported by using. For example:

      %rename(blah_long) Foo::blah(long);
      class Foo {
      public:
        int blah(int);
        long blah(long);  // Renamed to blah_long
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;     // Only imports blah(int)
        double blah(double x);
      };
      

    6.27 Nested classes

    If the target language supports the nested classes concept (like Java), the nested C++ classes are wrapped as nested target language proxy classes. (In case of Java - "static" nested classes.) Only public nested classes are wrapped. Otherwise there is little difference between nested and normal classes.

    If the target language doesn't support nested classes directly, or the support is not implemented in the language module (like for python currently), then the visible nested classes are moved to the same name space as the containing class (nesting hierarchy is "flattened"). The same behaviour may be turned on for C# and Java by the %feature ("flatnested"); If there is a class with the same name in the outer namespace the inner class (or the global one) may be renamed or ignored:

    %rename (Bar_Foo) Bar::Foo;
    class Foo {};
    class Bar {
      public:
      class Foo {};
    };
    

    If a nested class, within an outer class, has to be used as a template parameter within the outer class, then the template will have to be instantiated with %template before the beginning of the outer class. An example can be found in the Templates section.

    Compatibility Note: Prior to SWIG-3.0.0, there was limited nested class support. Nested classes were treated as opaque pointers. However, there was a workaround for nested class support in these older versions requiring the user to replicate the nested class in the global scope, adding in a typedef for the nested class in the global scope and using the "nestedworkaround" feature on the nested class. This resulted in approximately the same behaviour as the "flatnested" feature. With proper nested class support now available in SWIG-3.0.0, this feature has been deprecated and no longer works requiring code changes. If you see the following warning:

    example.i:8: Warning 126: The nestedworkaround feature is deprecated
    

    consider using the "flatnested" feature discussed above which generates a non-nested proxy class, like the "nestedworkaround" feature did. Alternatively, use the default nested class code generation, which may generate an equivalent to a nested proxy class in the target language, depending on the target language support.

    SWIG-1.3.40 and earlier versions did not have the nestedworkaround feature and the generated code resulting from parsing nested classes did not always compile. Nested class warnings could also not be suppressed using %warnfilter.

    6.28 A brief rant about const-correctness

    A common issue when working with C++ programs is dealing with all possible ways in which the const qualifier (or lack thereof) will break your program, all programs linked against your program, and all programs linked against those programs.

    Although SWIG knows how to correctly deal with const in its internal type system and it knows how to generate wrappers that are free of const-related warnings, SWIG does not make any attempt to preserve const-correctness in the target language. Thus, it is possible to pass const qualified objects to non-const methods and functions. For example, consider the following code in C++:

    const Object * foo();
    void bar(Object *);
    
    ...
    // C++ code
    void blah() {
      bar(foo());         // Error: bar discards const
    };
    

    Now, consider the behavior when wrapped into a Python module:

    >>> bar(foo())         # Okay
    >>> 
    

    Although this is clearly a violation of the C++ type-system, fixing the problem doesn't seem to be worth the added implementation complexity that would be required to support it in the SWIG run-time type system. There are no plans to change this in future releases (although we'll never rule anything out entirely).

    The bottom line is that this particular issue does not appear to be a problem for most SWIG projects. Of course, you might want to consider using another tool if maintaining constness is the most important part of your project.

    6.29 Where to go for more information

    If you're wrapping serious C++ code, you might want to pick up a copy of "The Annotated C++ Reference Manual" by Ellis and Stroustrup. This is the reference document we use to guide a lot of SWIG's C++ support.

    swig-3.0.12/Doc/Manual/chapters0000664000175000017500000000100213042756442016104 0ustar williamwilliamPreface.html Introduction.html Windows.html Scripting.html SWIG.html SWIGPlus.html CPlusPlus11.html Preprocessor.html Library.html Arguments.html Typemaps.html Customization.html Contract.html Varargs.html Warnings.html Modules.html CCache.html Allegrocl.html Android.html CSharp.html Chicken.html D.html Go.html Guile.html Java.html Javascript.html Lisp.html Lua.html Modula3.html Mzscheme.html Ocaml.html Octave.html Perl5.html Php.html Pike.html Python.html R.html Ruby.html Scilab.html Tcl.html Extending.html swig-3.0.12/Doc/Manual/Sections.html0000664000175000017500000000604113042756442017035 0ustar williamwilliam SWIG-3.0 Documentation

    SWIG-3.0 Documentation

    Last update : SWIG-3.0.12 (27 Jan 2017)

    Sections

    SWIG Core Documentation

    Language Module Documentation

    Developer Documentation

    swig-3.0.12/Doc/Manual/CSharp.html0000664000175000017500000026671613042756671016453 0ustar williamwilliam SWIG and C#

    20 SWIG and C#

    20.1 Introduction

    The purpose of the C# module is to offer an automated way of accessing existing C/C++ code from .NET languages. The wrapper code implementation uses C# and the Platform Invoke (PInvoke) interface to access natively compiled C/C++ code. The PInvoke interface has been chosen over Microsoft's Managed C++ interface as it is portable to both Microsoft Windows and non-Microsoft platforms. PInvoke is part of the ECMA/ISO C# specification. It is also better suited for robust production environments due to the Managed C++ flaw called the Mixed DLL Loading Problem. SWIG C# works equally well on non-Microsoft operating systems such as Linux, Solaris and Apple Mac using Mono and Portable.NET.

    To get the most out of this chapter an understanding of interop is required. The Microsoft Developer Network (MSDN) has a good reference guide in a section titled "Interop Marshaling". Monodoc, available from the Mono project, has a very useful section titled Interop with native libraries.

    20.1.1 SWIG 2 Compatibility

    In order to minimize name collisions between names generated based on input to SWIG and names used in the generated code from the .NET framework, SWIG 3 fully qualifies the use of all .NET types. Furthermore, SWIG 3 avoids using directives in generated code. This breaks backwards compatibility with typemaps, pragmas, etc written for use with SWIG 2 that assume the presence of using System; or using System.Runtime.InteropServices; directives in the intermediate class imports, module imports, or proxy imports. SWIG 3 supports backwards compatibility though the use of the SWIG2_CSHARP macro. If SWIG2_CSHARP is defined, SWIG 3 generates using directives in the intermediate class, module class, and proxy class code similar to those generated by SWIG 2. This can be done without modifying any of the input code by passing the -DSWIG2_CSHARP commandline parameter when executing swig.

    20.1.2 Additional command line options

    The following table lists the additional commandline options available for the C# module. They can also be seen by using:

    swig -csharp -help 
    
    C# specific options
    -dllimport <dl> Override DllImport attribute name to <dl>
    -namespace <nm> Generate wrappers into C# namespace <nm>
    -noproxy Generate the low-level functional interface instead of proxy classes
    -oldvarnames Old intermediary method names for variable wrappers
    -outfile <file> Write all C# into a single <file> located in the output directory

    The -outfile option combines all the generated C# code into a single output file instead of creating multiple C# files. The default, when this option is not provided, is to generate separate .cs files for the module class, intermediary class and each of the generated proxy and type wrapper classes. Note that the file extension (.cs) will not be automatically added and needs to be provided. Due to possible compiler limits it is not advisable to use -outfile for large projects.

    20.2 Differences to the Java module

    The C# module is very similar to the Java module, so until some more complete documentation has been written, please use the Java documentation as a guide to using SWIG with C#. The C# module has the same major SWIG features as the Java module. The rest of this section should be read in conjunction with the Java documentation as it lists the main differences. The most notable differences to Java are the following:

    • When invoking SWIG use the -csharp command line option instead of -java.
    • The -nopgcpp command line option does not exist.
    • The -package command line option does not exist.
    • The -namespace <name> commandline option will generate all code into the namespace specified by <name>. C# supports nested namespaces that are not lexically nested, so nested namespaces will of course also work. For example: -namespace com.bloggs.widget, will generate code into C# namespaces:
      namespace com.bloggs.widget {
        ...
      }
      
      Note that by default, the generated C# classes have no namespace and the module name is unrelated to namespaces. The module name is just like in Java and is merely used to name some of the generated classes.
    • The nspace feature is also supported as described in this general section with a C# example. Unlike Java which requires the use of the -package option when using the nspace feature, the -namespace option is not mandatory for C#.
    • The -dllimport <name> commandline option specifies the name of the DLL for the DllImport attribute for every PInvoke method. If this commandline option is not given, the DllImport DLL name is the same as the module name. This option is useful for when one wants to invoke SWIG multiple times on different modules, yet compile all the resulting code into a single DLL.
    • C/C++ variables are wrapped with C# properties and not JavaBean style getters and setters.
    • Global constants are generated into the module class. There is no constants interface.
    • There is no implementation for type unsafe enums - not deemed necessary.
    • The default enum wrapping approach is proper C# enums, not typesafe enums.
      Note that %csconst(0) will be ignored when wrapping C/C++ enums with proper C# enums. This is because C# enum items must be initialised from a compile time constant. If an enum item has an initialiser and the initialiser doesn't compile as C# code, then the %csconstvalue directive must be used as %csconst(0) will have no effect. If it was used, it would generate an illegal runtime initialisation via a PInvoke call.
    • C# doesn't support the notion of throws clauses. Therefore there is no 'throws' typemap attribute support for adding exception classes to a throws clause. Likewise there is no need for an equivalent to %javaexception. In fact, throwing C# exceptions works quite differently, see C# Exceptions below.
    • The majority of the typemaps are in csharp.swg, not java.swg.
    • Typemap equivalent names:

      jni                         -> ctype
      jtype                       -> imtype
      jstype                      -> cstype
      javain                      -> csin
      javaout                     -> csout
      javadirectorin              -> csdirectorin
      javadirectorout             -> csdirectorout
      javainterfaces              -> csinterfaces and csinterfaces_derived
      javabase                    -> csbase
      javaclassmodifiers          -> csclassmodifiers
      javacode                    -> cscode
      javaimports                 -> csimports
      javabody                    -> csbody
      javafinalize                -> csfinalize
      javadestruct                -> csdestruct
      javadestruct_derived        -> csdestruct_derived
      javainterfacecode           -> csinterfacecode
      
    • Typemap macros:

      SWIG_JAVABODY_PROXY         -> SWIG_CSBODY_PROXY
      SWIG_JAVABODY_TYPEWRAPPER   -> SWIG_CSBODY_TYPEWRAPPER
      
    • Additional typemaps:

      csvarin                     C# code property set typemap
      csvarout                    C# code property get typemap
      csattributes                C# attributes for attaching to proxy classes/enums
      
    • Additional typemap attributes:

      The "null" attribute in the "out" typemap can be specified to provide a value for $null to expand into for wrapped functions that return non-void. Normally the default value of 0 is used. For example this is needed if you change the return type to void:

      %typemap(ctype) Status "void"
      %typemap(out, null="") Status { ... }
      
    • Feature equivalent names:

      %javaconst                  -> %csconst
      %javaconstvalue             -> %csconstvalue
      %javamethodmodifiers        -> %csmethodmodifiers
      
    • Pragma equivalent names:

      %pragma(java)               -> %pragma(csharp)
      jniclassbase                -> imclassbase
      jniclassclassmodifiers      -> imclassclassmodifiers
      jniclasscode                -> imclasscode
      jniclassimports             -> imclassimports
      jniclassinterfaces          -> imclassinterfaces
      
    • Special variable equivalent names:

      $javaclassname              -> $csclassname
      $&javaclassname             -> $&csclassname
      $*javaclassname             -> $*csclassname
      $javaclazzname              -> $csclazzname
      $javainput                  -> $csinput
      $jnicall                    -> $imcall
      $javainterfacename          -> $csinterfacename
      $&javainterfacename         -> $&csinterfacename
      $*javainterfacename         -> $*csinterfacename
      
    • Unlike the "javain" typemap, the "csin" typemap does not support the 'pgcpp' attribute as the C# module does not have a premature garbage collection prevention parameter. The "csin" typemap supports additional optional attributes called 'cshin' and 'terminator'. The "csdirectorin" typemap supports additional optional attributes called 'terminator'. The 'cshin' attribute should contain the parameter type and name whenever a constructor helper function is generated due to the 'pre' or 'post' attributes. The 'terminator' attribute normally just contains a closing brace for when the 'pre' attribute contains an opening brace, such as when a C# using or fixed block is started. Note that 'pre', 'post', 'terminator' and 'cshin' attributes are not used for marshalling the property set. Please see the Date marshalling example and Date marshalling of properties example for further understanding of these "csin" applicable attributes. Please see the Date marshalling director example for further understanding of the "csdirectorin" attributes.

    • Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional out attribute which is used for output types. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap. An example shows that char * could be marshalled in different ways,

      %typemap(imtype, out="global::System.IntPtr") char * "string"
      char * function(char *);
      

      The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is:

      public static extern global::System.IntPtr function(string jarg1);
      
    • Support for type attributes. The 'imtype' and 'cstype' typemaps can have an optional inattributes and outattributes typemap attribute. The 'imtype' typemap can also have an optional directorinattributes and directoroutattributes typemap attribute which attaches to director delegates, an implementation detail of directors, see directors implementation. Note that there are C# attributes and typemap attributes, don't get confused between the two!! The C# attributes specified in these typemap attributes are generated wherever the type is used in the C# wrappers. These can be used to specify any C# attribute associated with a C/C++ type, but are more typically used for the C# MarshalAs attribute. For example:

      %typemap(imtype,
               inattributes="[global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]",
               outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]") const char * "String"
      
      const char * GetMsg() {}
      void SetMsg(const char *msg) {}
      

      The intermediary class will then have the marshalling as specified by everything in the 'imtype' typemap:

      class examplePINVOKE {
        ...
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_GetMsg")]
        [return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]
        public static extern String GetMsg();
      
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_SetMsg")]
        public static extern void SetMsg([global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]String jarg1);
      }
      

      Note that the DllImport attribute is always generated, irrespective of any additional attributes specified.

      These attributes are associated with the C/C++ parameter type or return type, which is subtly different to the attribute features and typemaps covered next. Note that all these different C# attributes can be combined so that a method has more than one attribute.

      The directorinattributes and directoroutattributes typemap attribute are attached to the delegates in the director class, for example, the SwigDelegateBase_0

    • Support for attaching C# attributes to wrapped methods, variables and enum values. This is done using the %csattributes feature, see %feature directives. Note that C# attributes are attached to proxy classes and enums using the csattributes typemap. For example, imagine we have a custom attribute class, ThreadSafeAttribute, for labelling thread safety. The following SWIG code shows how to attach this C# attribute to some methods and the class declaration itself:

      %typemap(csattributes) AClass          "[ThreadSafe]"
      %csattributes AClass::AClass(double d) "[ThreadSafe(false)]"
      %csattributes AClass::AMethod()        "[ThreadSafe(true)]"
      
      %inline %{
      class AClass {
      public:
        AClass(double a) {}
        void AMethod() {}
      };
      %}
      

      will generate a C# proxy class:

      [ThreadSafe]
      public class AClass : global::System.IDisposable {
        ...
        [ThreadSafe(false)]
        public AClass(double a) ...
      
        [ThreadSafe(true)]
        public void AMethod() ...
      }
      

      If C# attributes need adding to the set or get part of C# properties, when wrapping C/C++ variables, they can be added using the 'csvarin' and 'csvarout' typemaps respectively. Note that the type used for the property is specified in the 'cstype' typemap. If the 'out' attribute exists in this typemap, then the type used is from the 'out' attribute.

      An example for attaching attributes to the enum and enum values is shown below.

      %typemap(csattributes) Couleur "[global::System.ComponentModel.Description(\"Colours\")]"
      %csattributes Rouge "[global::System.ComponentModel.Description(\"Red\")]"
      %csattributes Vert "[global::System.ComponentModel.Description(\"Green\")]"
      %inline %{
        enum Couleur { Rouge, Orange, Vert };
      %}
      

      which will result in the following C# enum:

      [global::System.ComponentModel.Description("Colours")]
      public enum Couleur {
        [global::System.ComponentModel.Description("Red")]
        Rouge,
        Orange,
        [global::System.ComponentModel.Description("Green")]
        Vert
      }
      
    • The intermediary classname has PINVOKE appended after the module name instead of JNI, for example modulenamePINVOKE.

    • The %csmethodmodifiers feature can also be applied to variables as well as methods. In addition to the default public modifier that SWIG generates when %csmethodmodifiers is not specified, the feature will also replace the virtual/new/override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the virtual/new/override modifiers incorrect, for example with multiple inheritance.

    • The name of the intermediary class can be changed from its default, that is, the module name with PINVOKE appended after it. The module directive attribute imclassname is used to achieve this:

      %module (imclassname="name") modulename
      

      If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    • There is no additional 'premature garbage collection prevention parameter' as the marshalling of the HandleRef object takes care of ensuring a reference to the proxy class is held until the unmanaged call completed.

    $dllimport
    This is a C# only special variable that can be used in typemaps, pragmas, features etc. The special variable will get translated into the value specified by the -dllimport commandline option if specified, otherwise it is equivalent to the $module special variable.

    $imclassname
    This special variable expands to the intermediary class name. For C# this is usually the same as '$modulePINVOKE' ('$moduleJNI' for Java), unless the imclassname attribute is specified in the %module directive.

    The directory Examples/csharp has a number of simple examples. Visual Studio .NET 2003 solution and project files are available for compiling with the Microsoft .NET C# compiler on Windows. This also works with newer versions of Visual Studio if you allow it to convert the solution to the latest version. If your SWIG installation went well on a Unix environment and your C# compiler was detected, you should be able to type make in each example directory. After SWIG has run and both the C# and C/C++ compilers have finished building, the examples will be run, by either running runme.exe or by running mono runme.exe (Mono C# compiler). Windows users can also get the examples working using a Cygwin or MinGW environment for automatic configuration of the example makefiles. Any one of the C# compilers (Mono or Microsoft) can be detected from within a Cygwin or Mingw environment if installed in your path.

    20.3 Void pointers

    By default SWIG treats void * as any other pointer and hence marshalls it as a type wrapper class called SWIGTYPE_p_void. If you want to marshall with the .NET System.IntPtr type instead, there is a simple set of named typemaps called void *VOID_INT_PTR that can be used. They can be applied like any other named typemaps:

    %apply void *VOID_INT_PTR { void * }
    void * f(void *v);
    

    20.4 C# Arrays

    There are various ways to pass arrays from C# to C/C++. The default wrapping treats arrays as pointers and as such simple type wrapper classes are generated, eg SWIGTYPE_p_int when wrapping the C type int [] or int *. This gives a rather restricted use of the underlying unmanaged code and the most practical way to use arrays is to enhance or customise with one of the following three approaches; namely the SWIG C arrays library, P/Invoke default array marshalling or pinned arrays.

    20.4.1 The SWIG C arrays library

    The C arrays library keeps all the array memory in the unmanaged layer. The library is available to all language modules and is documented in the carrays.i library section. Please refer to this section for details, but for convenience, the C# usage for the two examples outlined there is shown below.

    For the %array_functions example, the equivalent usage would be:

    SWIGTYPE_p_double a = example.new_doubleArray(10);  // Create an array
    for (int i=0; i<10; i++)
      example.doubleArray_setitem(a, i, 2*i);           // Set a value
    example.print_array(a);                             // Pass to C
    example.delete_doubleArray(a);                      // Destroy array
    

    and for the %array_class example, the equivalent usage would be:

    doubleArray c = new doubleArray(10);    // Create double[10]
    for (int i=0; i<10; i++)
      c.setitem(i, 2*i);                    // Assign values
    example.print_array(c.cast());          // Pass to C
    

    20.4.2 Managed arrays using P/Invoke default array marshalling

    In the P/Invoke default marshalling scheme, one needs to designate whether the invoked function will treat a managed array parameter as input, output, or both. When the function is invoked, the CLR allocates a separate chunk of memory as big as the given managed array, which is automatically released at the end of the function call. If the array parameter is marked as being input, the content of the managed array is copied into this buffer when the call is made. Correspondingly, if the array parameter is marked as being output, the contents of the reserved buffer are copied back into the managed array after the call returns. A pointer to this buffer is passed to the native function.

    The reason for allocating a separate buffer is to leave the CLR free to relocate the managed array object during garbage collection. If the overhead caused by the copying is causing a significant performance penalty, consider pinning the managed array and passing a direct reference as described in the next section.

    For more information on the subject, see the Default Marshaling for Arrays article on MSDN.

    The P/Invoke default marshalling is supported by the arrays_csharp.i library via the INPUT, OUTPUT and INOUT typemaps. Let's look at some example usage. Consider the following C function:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We can now instruct SWIG to use the default marshalling typemaps by

    %include "arrays_csharp.i"
    
    %apply int INPUT[]  {int *sourceArray}
    %apply int OUTPUT[] {int *targetArray}
    

    As a result, we get the following method in the module class:

    public static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        examplePINVOKE.myArrayCopy(sourceArray, targetArray, nitems);
    }
    

    If we look beneath the surface at the corresponding intermediary class code, we see that SWIG has generated code that uses attributes (from the System.Runtime.InteropServices namespace) to tell the CLR to use default marshalling for the arrays:

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                          [global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                           int jarg3);
    

    As an example of passing an inout array (i.e. the target function will both read from and write to the array), consider this C function that swaps a given number of elements in the given arrays:

    void myArraySwap(int *array1, int *array2, int nitems);
    

    Now, we can instruct SWIG to wrap this by

    %include "arrays_csharp.i"
    
    %apply int INOUT[] {int *array1}
    %apply int INOUT[] {int *array2}
    

    This results in the module class method

      public static void myArraySwap(int[] array1, int[] array2, int nitems) {
        examplePINVOKE.myArraySwap(array1, array2, nitems);
      }
    

    and intermediary class method

      [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArraySwap")]
      public static extern void myArraySwap([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                            [global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                             int jarg3);
    

    20.4.3 Managed arrays using pinning

    It is also possible to pin a given array in memory (i.e. fix its location in memory), obtain a direct pointer to it, and then pass this pointer to the wrapped C/C++ function. This approach involves no copying, but it makes the work of the garbage collector harder as the managed array object can not be relocated before the fix on the array is released. You should avoid fixing arrays in memory in cases where the control may re-enter the managed side via a callback and/or another thread may produce enough garbage to trigger garbage collection.

    For more information, see the fixed statement in the C# language reference.

    Now let's look at an example using pinning, thus avoiding the CLR making copies of the arrays passed as parameters. The arrays_csharp.i library file again provides the required support via the FIXED typemaps. Let's use the same function from the previous section:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We now need to declare the module class method unsafe, as we are using pointers:

    %csmethodmodifiers myArrayCopy "public unsafe";
     

    Apply the appropriate typemaps to the array parameters:

    %include "arrays_csharp.i"
    
    %apply int FIXED[] {int *sourceArray}
    %apply int FIXED[] {int *targetArray}
    

    Notice that there is no need for separate in, out or inout typemaps as is the case when using P/Invoke default marshalling.

    As a result, we get the following method in the module class:

      public unsafe static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        fixed ( int *swig_ptrTo_sourceArray = sourceArray ) {
        fixed ( int *swig_ptrTo_targetArray = targetArray ) {
        {
          examplePINVOKE.myArrayCopy((global::System.IntPtr)swig_ptrTo_sourceArray, (global::System.IntPtr)swig_ptrTo_targetArray,
                                     nitems);
        }
        }
        }
      }
    

    On the method signature level the only difference to the version using P/Invoke default marshalling is the "unsafe" quantifier, which is required because we are handling pointers.

    Also the intermediary class method looks a little different from the default marshalling example - the method is expecting an IntPtr as the parameter type.

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy(global::System.IntPtr jarg1, global::System.IntPtr jarg2, int jarg3);
    

    20.5 C# Exceptions

    It is possible to throw a C# Exception from C/C++ code. SWIG already provides the framework for throwing C# exceptions if it is able to detect that a C++ exception could be thrown. Automatically detecting that a C++ exception could be thrown is only possible when a C++ exception specification is used, see Exception specifications. The Exception handling with %exception section details the %exception feature. Customised code for handling exceptions with or without a C++ exception specification is possible and the details follow. However anyone wishing to do this should be familiar with the contents of the sections referred to above.

    Unfortunately a C# exception cannot simply be thrown from unmanaged code for a variety of reasons. Most notably being that throwing a C# exception results in exceptions being thrown across the C PInvoke interface and C does not understand exceptions. The design revolves around a C# exception being constructed and stored as a pending exception, to be thrown only when the unmanaged code has completed. Implementing this is a tad involved and there are thus some unusual typemap constructs. Some practical examples follow and they should be read in conjunction with the rest of this section.

    First some details about the design that must be followed. Each typemap or feature that generates unmanaged code supports an attribute called canthrow. This is simply a flag which when set indicates that the code in the typemap/feature has code which might want to throw a C# exception. The code in the typemap/feature can then raise a C# exception by calling one of the C functions, SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument(). When called, the function makes a callback into the managed world via a delegate. The callback creates and stores an exception ready for throwing when the unmanaged code has finished. The typemap/feature unmanaged code is then expected to force an immediate return from the unmanaged wrapper function, so that the pending managed exception can then be thrown. The support code has been carefully designed to be efficient as well as thread-safe. However to achieve the goal of efficiency requires some optional code generation in the managed code typemaps. Code to check for pending exceptions is generated if and only if the unmanaged code has code to set a pending exception, that is if the canthrow attribute is set. The optional managed code is generated using the excode typemap attribute and $excode special variable in the relevant managed code typemaps. Simply, if any relevant unmanaged code has the canthrow attribute set, then any occurrences of $excode is replaced with the code in the excode attribute. If the canthrow attribute is not set, then any occurrences of $excode are replaced with nothing.

    The prototypes for the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() functions are

    static void SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code,
                                               const char *msg);
    
    static void SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code,
                                                       const char *msg,
                                                       const char *param_name);
    

    The first parameter defines which .NET exceptions can be thrown:

    typedef enum {
      SWIG_CSharpApplicationException,
      SWIG_CSharpArithmeticException,
      SWIG_CSharpDivideByZeroException,
      SWIG_CSharpIndexOutOfRangeException,
      SWIG_CSharpInvalidCastException,
      SWIG_CSharpInvalidOperationException,
      SWIG_CSharpIOException,
      SWIG_CSharpNullReferenceException,
      SWIG_CSharpOutOfMemoryException,
      SWIG_CSharpOverflowException,
      SWIG_CSharpSystemException
    } SWIG_CSharpExceptionCodes;
    
    typedef enum {
      SWIG_CSharpArgumentException,
      SWIG_CSharpArgumentNullException,
      SWIG_CSharpArgumentOutOfRangeException,
    } SWIG_CSharpExceptionArgumentCodes;
    

    where, for example, SWIG_CSharpApplicationException corresponds to the .NET exception, ApplicationException. The msg and param_name parameters contain the C# exception message and parameter name associated with the exception.

    The %exception feature in C# has the canthrow attribute set. The %csnothrowexception feature is like %exception, but it does not have the canthrow attribute set so should only be used when a C# exception is not created.

    20.5.1 C# exception example using "check" typemap

    Let's say we have the following simple C++ method:

    void positivesonly(int number);
    

    and we want to check that the input number is always positive and if not throw a C# ArgumentOutOfRangeException. The "check" typemap is designed for checking input parameters. Below you will see the canthrow attribute is set because the code contains a call to SWIG_CSharpSetPendingExceptionArgument(). The full example follows:

    %module example
    
    %typemap(check, canthrow=1) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    // SWIGEXCODE is a macro used by many other csout typemaps
    %define SWIGEXCODE
     "\n    if ($modulePINVOKE.SWIGPendingException.Pending)"
     "\n      throw $modulePINVOKE.SWIGPendingException.Retrieve();"
    %enddef
    %typemap(csout, excode=SWIGEXCODE) void {
        $imcall;$excode
      }
    %}
    
    %inline %{
    
    void positivesonly(int number) {
    }
    
    %}
    

    When the following C# code is executed:

    public class runme {
        static void Main() {
          example.positivesonly(-1);
        }
    }
    

    The exception is thrown:

    Unhandled Exception: System.ArgumentOutOfRangeException: only positive numbers accepted
    Parameter name: number
    in <0x00034> example:positivesonly (int)
    in <0x0000c> runme:Main ()
    

    Now let's analyse the generated code to gain a fuller understanding of the typemaps. The generated unmanaged C++ code is:

    SWIGEXPORT void SWIGSTDCALL CSharp_positivesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      if (arg1 < 0) {
        SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
          "only positive numbers accepted", "number");
        return ;
      }
    
      positivesonly(arg1);
    
    }
    

    This largely comes from the "check" typemap. The managed code in the module class is:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
    }
    

    This comes largely from the "csout" typemap.

    The "csout" typemap is the same as the default void "csout" typemap so is not strictly necessary for the example. However, it is shown to demonstrate what managed output code typemaps should contain, that is, a $excode special variable and an excode attribute. Also note that $excode is expanded into the code held in the excode attribute. The $imcall as always expands into examplePINVOKE.positivesonly(number). The exception support code in the intermediary class, examplePINVOKE, is not shown, but is contained within the inner classes, SWIGPendingException and SWIGExceptionHelper and is always generated. These classes can be seen in any of the generated wrappers. However, all that is required of a user is as demonstrated in the "csin" typemap above. That is, is to check SWIGPendingException.Pending and to throw the exception returned by SWIGPendingException.Retrieve().

    If the "check" typemap did not exist, then the following module class would instead be generated:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
      }
    
    }
    

    Here we see the pending exception checking code is omitted. In fact, the code above would be generated if the canthrow attribute was not in the "check" typemap, such as:

    %typemap(check) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    %}
    

    Note that if SWIG detects you have used SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument() without setting the canthrow attribute you will get a warning message similar to

    example.i:21: Warning 845: Unmanaged code contains a call to a SWIG_CSharpSetPendingException
    method and C# code does not handle pending exceptions via the canthrow attribute.
    

    Actually it will issue this warning for any function beginning with SWIG_CSharpSetPendingException.

    20.5.2 C# exception example using %exception

    Let's consider a similar, but more common example that throws a C++ exception from within a wrapped function. We can use %exception as mentioned in Exception handling with %exception.

    %exception negativesonly(int value) %{
    try {
      $action
    } catch (std::out_of_range e) {
      SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
      return $null;
    }
    %}
    
    %inline %{
    #include <stdexcept>
    void negativesonly(int value) {
      if (value >= 0)
        throw std::out_of_range("number should be negative");
    }
    %}
    

    The generated unmanaged code this time catches the C++ exception and converts it into a C# ApplicationException.

    SWIGEXPORT void SWIGSTDCALL CSharp_negativesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      try {
        negativesonly(arg1);
    
      } catch (std::out_of_range e) {
        SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
        return ;
      }
    }
    

    The managed code generated does check for the pending exception as mentioned earlier as the C# version of %exception has the canthrow attribute set by default:

      public static void negativesonly(int value) {
        examplePINVOKE.negativesonly(value);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    

    20.5.3 C# exception example using exception specifications

    When C++ exception specifications are used, SWIG is able to detect that the method might throw an exception. By default SWIG will automatically generate code to catch the exception and convert it into a managed ApplicationException, as defined by the default "throws" typemaps. The following example has a user supplied "throws" typemap which is used whenever an exception specification contains a std::out_of_range, such as the evensonly method below.

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), NULL);
      return $null;
    }
    
    %inline %{
    #include <stdexcept>
    void evensonly(int input) throw (std::out_of_range) {
      if (input%2 != 0)
        throw std::out_of_range("number is not even");
    }
    %}
    

    Note that the type for the throws typemap is the type in the exception specification. SWIG generates a try catch block with the throws typemap code in the catch handler.

    SWIGEXPORT void SWIGSTDCALL CSharp_evensonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
      try {
        evensonly(arg1);
      }
      catch(std::out_of_range &_e) {
        {
          SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, (&_e)->what(), NULL);
          return ;
        }
      }
    }
    

    Multiple catch handlers are generated should there be more than one exception specifications declared.

    20.5.4 Custom C# ApplicationException example

    This example involves a user defined exception. The conventional .NET exception handling approach is to create a custom ApplicationException and throw it in your application. The goal in this example is to convert the STL std::out_of_range exception into one of these custom .NET exceptions.

    The default exception handling is quite easy to use as the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() methods are provided by SWIG. However, for a custom C# exception, the boiler plate code that supports these functions needs replicating. In essence this consists of some C/C++ code and C# code. The C/C++ code can be generated into the wrapper file using the %insert(runtime) directive and the C# code can be generated into the intermediary class using the imclasscode pragma as follows:

    %insert(runtime) %{
      // Code to handle throwing of C# CustomApplicationException from C/C++ code.
      // The equivalent delegate to the callback, CSharpExceptionCallback_t, is CustomExceptionDelegate
      // and the equivalent customExceptionCallback instance is customDelegate
      typedef void (SWIGSTDCALL* CSharpExceptionCallback_t)(const char *);
      CSharpExceptionCallback_t customExceptionCallback = NULL;
    
      extern "C" SWIGEXPORT
      void SWIGSTDCALL CustomExceptionRegisterCallback(CSharpExceptionCallback_t customCallback) {
        customExceptionCallback = customCallback;
      }
    
      // Note that SWIG detects any method calls named starting with
      // SWIG_CSharpSetPendingException for warning 845
      static void SWIG_CSharpSetPendingExceptionCustom(const char *msg) {
        customExceptionCallback(msg);
      }
    %}
    
    %pragma(csharp) imclasscode=%{
      class CustomExceptionHelper {
        // C# delegate for the C/C++ customExceptionCallback
        public delegate void CustomExceptionDelegate(string message);
        static CustomExceptionDelegate customDelegate =
                                       new CustomExceptionDelegate(SetPendingCustomException);
    
        [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="CustomExceptionRegisterCallback")]
        public static extern
               void CustomExceptionRegisterCallback(CustomExceptionDelegate customCallback);
    
        static void SetPendingCustomException(string message) {
          SWIGPendingException.Set(new CustomApplicationException(message));
        }
    
        static CustomExceptionHelper() {
          CustomExceptionRegisterCallback(customDelegate);
        }
      }
      static CustomExceptionHelper exceptionHelper = new CustomExceptionHelper();
    %}
    

    The method stored in the C# delegate instance, customDelegate is what gets called by the C/C++ callback. However, the equivalent to the C# delegate, that is the C/C++ callback, needs to be assigned before any unmanaged code is executed. This is achieved by putting the initialisation code in the intermediary class. Recall that the intermediary class contains all the PInvoke methods, so the static variables in the intermediary class will be initialised before any of the PInvoke methods in this class are called. The exceptionHelper static variable ensures the C/C++ callback is initialised with the value in customDelegate by calling the CustomExceptionRegisterCallback method in the CustomExceptionHelper static constructor. Once this has been done, unmanaged code can make callbacks into the managed world as customExceptionCallback will be initialised with a valid callback/delegate. Any calls to SWIG_CSharpSetPendingExceptionCustom() will make the callback to create the pending exception in the same way that SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() does. In fact the method has been similarly named so that SWIG can issue the warning about missing canthrow attributes as discussed earlier. It is an invaluable warning as it is easy to forget the canthrow attribute when writing typemaps/features.

    The SWIGPendingException helper class is not shown, but is generated as an inner class into the intermediary class. It stores the pending exception in Thread Local Storage so that the exception handling mechanism is thread safe.

    The boiler plate code above must be used in addition to a handcrafted CustomApplicationException:

    // Custom C# Exception
    class CustomApplicationException : global::System.ApplicationException {
      public CustomApplicationException(string message) 
        : base(message) {
      }
    }
    

    and the SWIG interface code:

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionCustom($1.what());
      return $null;
    }
    
    %inline %{
    void oddsonly(int input) throw (std::out_of_range) {
      if (input%2 != 1)
        throw std::out_of_range("number is not odd");
    }
    %}
    

    The "throws" typemap now simply calls our new SWIG_CSharpSetPendingExceptionCustom() function so that the exception can be caught, as such:

    try {
      example.oddsonly(2);
    } catch (CustomApplicationException e) {
      ...
    }
    

    20.6 C# Directors

    The SWIG directors feature adds extra code to the generated C# proxy classes that enable these classes to be used in cross-language polymorphism. Essentially, it enables unmanaged C++ code to call back into managed code for virtual methods so that a C# class can derive from a wrapped C++ class.

    The following sections provide information on the C# director implementation and contain most of the information required to use the C# directors. However, the Java directors section should also be read in order to gain more insight into directors.

    20.6.1 Directors example

    Imagine we are wrapping a C++ base class, Base, from which we would like to inherit in C#. Such a class is shown below as well as another class, Caller, which calls the virtual method UIntMethod from pure unmanaged C++ code.

    // file: example.h
    class Base {
    public:
      virtual ~Base() {}
    
      virtual unsigned int UIntMethod(unsigned int x) {
        std::cout << "Base - UIntMethod(" << x << ")" << std::endl;
        return x;
      }
      virtual void BaseBoolMethod(const Base &b, bool flag) {}
    };
    
    class Caller {
    public:
      Caller(): m_base(0) {}
      ~Caller() { delBase(); }
      void set(Base *b) { delBase(); m_base = b; }
      void reset() { m_base = 0; }
      unsigned int UIntMethodCall(unsigned int x) { return m_base->UIntMethod(x); }
    
    private:
      Base *m_base;
      void delBase() { delete m_base; m_base = 0; }
    };
    

    The director feature is turned off by default and the following simple interface file shows how directors are enabled for the class Base.

    /* File : example.i */
    %module(directors="1") example
    %{
    #include "example.h"
    %}
    
    %feature("director") Base;
    
    %include "example.h"
    

    The following is a C# class inheriting from Base:

    public class CSharpDerived : Base
    {
      public override uint UIntMethod(uint x)
      {
        Console.WriteLine("CSharpDerived - UIntMethod({0})", x);
        return x;
      }
    }
    

    The Caller class can demonstrate the UIntMethod method being called from unmanaged code using the following C# code:

    public class runme
    {
      static void Main() 
      {
        Caller myCaller = new Caller();
    
        // Test pure C++ class
        using (Base myBase = new Base())
        {
          makeCalls(myCaller, myBase);
        }
    
        // Test director / C# derived class
        using (Base myBase = new CSharpDerived())
        {
          makeCalls(myCaller, myBase);
        }
      }
    
      static void makeCalls(Caller myCaller, Base myBase)
      {
        myCaller.set(myBase);
        myCaller.UIntMethodCall(123);
        myCaller.reset();
      }
    }
    

    If the above is run, the output is then:

    Base - UIntMethod(123)
    CSharpDerived - UIntMethod(123)
    

    20.6.2 Directors implementation

    The previous section demonstrated a simple example where the virtual UIntMethod method was called from C++ code, even when the overridden method is implemented in C#. The intention of this section is to gain an insight into how the director feature works. It shows the generated code for the two virtual methods, UIntMethod and BaseBoolMethod, when the director feature is enabled for the Base class.

    Below is the generated C# Base director class.

    public class Base : global::System.IDisposable {
      private global::System.Runtime.InteropServices.HandleRef swigCPtr;
      protected bool swigCMemOwn;
    
      internal Base(global::System.IntPtr cPtr, bool cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
      }
    
      internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Base obj) {
        return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
      }
    
      ~Base() {
        Dispose();
      }
    
      public virtual void Dispose() {
        lock(this) {
          if(swigCPtr.Handle != global::System.IntPtr.Zero && swigCMemOwn) {
            swigCMemOwn = false;
            examplePINVOKE.delete_Base(swigCPtr);
          }
          swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
          global::System.GC.SuppressFinalize(this);
        }
      }
    
      public virtual uint UIntMethod(uint x) {
        uint ret = examplePINVOKE.Base_UIntMethod(swigCPtr, x);
        return ret;
      }
    
      public virtual void BaseBoolMethod(Base b, bool flag) {
        examplePINVOKE.Base_BaseBoolMethod(swigCPtr, Base.getCPtr(b), flag);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public Base() : this(examplePINVOKE.new_Base(), true) {
        SwigDirectorConnect();
      }
    
      private void SwigDirectorConnect() {
        if (SwigDerivedClassHasMethod("UIntMethod", swigMethodTypes0))
          swigDelegate0 = new SwigDelegateBase_0(SwigDirectorUIntMethod);
        if (SwigDerivedClassHasMethod("BaseBoolMethod", swigMethodTypes1))
          swigDelegate1 = new SwigDelegateBase_1(SwigDirectorBaseBoolMethod);
        examplePINVOKE.Base_director_connect(swigCPtr, swigDelegate0, swigDelegate1);
      }
    
      private bool SwigDerivedClassHasMethod(string methodName, global::System.global::System.Type[] methodTypes) {
        System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, methodTypes);
        bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(Base));
        return hasDerivedMethod;
      }
    
      private uint SwigDirectorUIntMethod(uint x) {
        return UIntMethod(x);
      }
    
      private void SwigDirectorBaseBoolMethod(global::System.IntPtr b, bool flag) {
        BaseBoolMethod(new Base(b, false), flag);
      }
    
      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    
      private SwigDelegateBase_0 swigDelegate0;
      private SwigDelegateBase_1 swigDelegate1;
    
      private static global::System.Type[] swigMethodTypes0 = new global::System.Type[] { typeof(uint) };
      private static global::System.Type[] swigMethodTypes1 = new global::System.Type[] { typeof(Base), typeof(bool) };
    }
    

    Everything from the SwigDirectorConnect() method and below is code that is only generated when directors are enabled. The design comprises a C# delegate being initialised for each virtual method on construction of the class. Let's examine the BaseBoolMethod.

    In the Base constructor a call is made to SwigDirectorConnect() which contains the initialisation code for all the virtual methods. It uses a support method, SwigDerivedClassHasMethod(), which simply uses reflection to determine if the named method, BaseBoolMethod, with the list of required parameter types, exists in a subclass. If it does not exist, the delegate is not initialised as there is no need for unmanaged code to call back into managed C# code. However, if there is an overridden method in any subclass, the delegate is required. It is then initialised to the SwigDirectorBaseBoolMethod which in turn will call BaseBoolMethod if invoked. The delegate is not initialised to the BaseBoolMethod directly as quite often types will need marshalling from the unmanaged type to the managed type in which case an intermediary method (SwigDirectorBaseBoolMethod) is required for the marshalling. In this case, the C# Base class needs to be created from the unmanaged IntPtr type.

    The last thing that SwigDirectorConnect() does is to pass the delegates to the unmanaged code. It calls the intermediary method Base_director_connect() which is really a call to the C function CSharp_Base_director_connect(). This method simply maps each C# delegate onto a C function pointer.

    SWIGEXPORT void SWIGSTDCALL CSharp_Base_director_connect(void *objarg, 
                                            SwigDirector_Base::SWIG_Callback0_t callback0,
                                            SwigDirector_Base::SWIG_Callback1_t callback1) {
      Base *obj = (Base *)objarg;
      SwigDirector_Base *director = dynamic_cast<SwigDirector_Base *>(obj);
      if (director) {
        director->swig_connect_director(callback0, callback1);
      }
    }
    
    class SwigDirector_Base : public Base, public Swig::Director {
    public:
      SwigDirector_Base();
      virtual unsigned int UIntMethod(unsigned int x);
      virtual ~SwigDirector_Base();
      virtual void BaseBoolMethod(Base const &b, bool flag);
    
      typedef unsigned int (SWIGSTDCALL* SWIG_Callback0_t)(unsigned int);
      typedef void (SWIGSTDCALL* SWIG_Callback1_t)(void *, unsigned int);
      void swig_connect_director(SWIG_Callback0_t callbackUIntMethod,
                                 SWIG_Callback1_t callbackBaseBoolMethod);
    
    private:
      SWIG_Callback0_t swig_callbackUIntMethod;
      SWIG_Callback1_t swig_callbackBaseBoolMethod;
      void swig_init_callbacks();
    };
    
    void SwigDirector_Base::swig_connect_director(SWIG_Callback0_t callbackUIntMethod, 
                                                  SWIG_Callback1_t callbackBaseBoolMethod) {
      swig_callbackUIntMethod = callbackUIntMethod;
      swig_callbackBaseBoolMethod = callbackBaseBoolMethod;
    }
    

    Note that for each director class SWIG creates an unmanaged director class for making the callbacks. For example Base has SwigDirector_Base and SwigDirector_Base is derived from Base. Should a C# class be derived from Base, the underlying C++ SwigDirector_Base is created rather than Base. The SwigDirector_Base class then implements all the virtual methods, redirecting calls up to managed code if the callback/delegate is non-zero. The implementation of SwigDirector_Base::BaseBoolMethod shows this - the callback is made by invoking the swig_callbackBaseBoolMethod function pointer:

    void SwigDirector_Base::BaseBoolMethod(Base const &b, bool flag) {
      void * jb = 0 ;
      unsigned int jflag  ;
      
      if (!swig_callbackBaseBoolMethod) {
        Base::BaseBoolMethod(b, flag);
        return;
      } else {
        jb = (Base *) &b; 
        jflag = flag;
        swig_callbackBaseBoolMethod(jb, jflag);
      }
    }
    

    The delegates from the above example are public by default:

      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    These can be changed if desired via the csdirectordelegatemodifiers %feature directive. For example, using %feature("csdirectordelegatemodifiers") "internal" before SWIG parses the Base class will change all the delegates to internal:

      internal delegate uint SwigDelegateBase_0(uint x);
      internal delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    20.6.3 Director caveats

    There is a subtle gotcha with directors. If default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. An example will clarify this and the reasoning behind the recommendation. Consider the following C++ class wrapped as a director class:

    class Defaults {
    public:
      virtual ~Defaults();
      virtual void DefaultMethod(int a=-100);
    };
    

    Recall that C++ methods with default parameters generate overloaded methods for each defaulted parameter, so a C# derived class can be created with two DefaultMethod override methods:

    public class CSharpDefaults : Defaults
    {
      public override void DefaultMethod()
      {
        DefaultMethod(-100); // note C++ default value used
      }
      public override void DefaultMethod(int x)
      {
      }
    }
    

    It may not be clear at first, but should a user intend to call CSharpDefaults.DefaultMethod() from C++, a call is actually made to CSharpDefaults.DefaultMethod(int). This is because the initial call is made in C++ and therefore the DefaultMethod(int) method will be called as is expected with C++ calls to methods with defaults, with the default being set to -100. The callback/delegate matching this method is of course the overloaded method DefaultMethod(int). However, a call from C# to CSharpDefaults.DefaultMethod() will of course call this exact method and in order for behaviour to be consistent with calls from C++, the implementation should pass the call on to CSharpDefaults.DefaultMethod(int)using the C++ default value, as shown above.

    20.7 Multiple modules

    When using multiple modules it is is possible to compile each SWIG generated wrapper into a different assembly. However, by default the generated code may not compile if generated classes in one assembly use generated classes in another assembly. The visibility of the getCPtr() and pointer constructor generated from the csbody typemaps needs changing. The default visibility is internal but it needs to be public for access from a different assembly. Just changing 'internal' to 'public' in the typemap achieves this. Two macros are available in csharp.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the csbody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
      SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    Alternatively, instead of exposing these as public, consider using the [assembly:InternalsVisibleTo("Name")] attribute available in the .NET framework when you know which assemblies these can be exposed to. Another approach would be to make these public, but also to hide them from intellisense by using the [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] attribute if you don't want users to easily stumble upon these so called 'internal workings' of the wrappers.

    20.8 C# Typemap examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "csharp.swg" and "typemaps.i" in the SWIG library.

    20.8.1 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from C# after running the code through SWIG:

          Wheel wheel = new Bike(10).getWheel();
          Console.WriteLine("wheel size: " + wheel.size);
          // Simulate a garbage collection
          global::System.GC.Collect();
          global::System.GC.WaitForPendingFinalizers();
          global::System.Console.WriteLine("wheel size: " + wheel.size);
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(cscode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a C# reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(csout, excode=SWIGEXCODE) Wheel& getWheel {
        global::System.IntPtr cPtr = $imcall;$excode
        $csclassname ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new $csclassname(cPtr, $owner);
          ret.addReference(this);
        }
        return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel : global::System.IDisposable {
      ...
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike : global::System.IDisposable {
      ...
      public Wheel getWheel() {
        global::System.IntPtr cPtr = examplePINVOKE.Bike_getWheel(swigCPtr);
        Wheel ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    20.8.2 Memory management for objects passed to the C++ layer

    The example is a direct equivalent to this Java equivalent. Managing memory can be tricky when using C++ and C# proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

      Container container;
      Element element(20);
      container.setElement(&element);
      cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from C#

          Container container = new Container();
          Element element = new Element(20);
          container.setElement(element);
    

    The C++ code will always print out 20, but the value printed out may not be this in the C# equivalent code. In order to understand why, consider a garbage collection occuring...

          Container container = new Container();
          Element element = new Element(20);
          container.setElement(element);
          Console.WriteLine("element.value: " + container.getElement().value);
          // Simulate a garbage collection
          global::System.GC.Collect();
          global::System.GC.WaitForPendingFinalizers();
          global::System.Console.WriteLine("element.value: " + container.getElement().value);
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the C# layer...

    public class Container : global::System.IDisposable {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private global::System.Runtime.InteropServices.HandleRef getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    
      public void setElement(Element e) {
        examplePINVOKE.Container_setElement(swigCPtr, getCPtrAndAddReference(e));
      }
    }
    

    The following typemaps will generate the desired code. The 'csin' typemap matches the input parameter type for the setElement method. The 'cscode' typemap simply adds in the specified code into the C# proxy class.

    %typemap(csin) Element *e "getCPtrAndAddReference($csinput)"
    
    %typemap(cscode) Container %{
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private global::System.Runtime.InteropServices.HandleRef getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    %}
    

    20.8.3 Date marshalling using the csin typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard .NET date class, System.DateTime by using the 'pre', 'post' and 'pgcppname' attributes of the "csin" typemap (the C# equivalent to the "javain" typemap). The example is an equivalent to the Java Date marshalling example. The idea is that the System.DateTime is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate();
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the C# proxy class CDate is used in the proxy interface:

    public class Action : global::System.IDisposable {
      ...
      public Action(CDate dateIn, CDate dateOut) 
          : this(examplePINVOKE.new_Action(CDate.getCPtr(dateIn), CDate.getCPtr(dateOut)), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public int doSomething(CDate dateIn, CDate dateOut) {
        int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                    CDate.getCPtr(dateIn), 
                                                    CDate.getCPtr(dateOut));
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
        return ret;
      }
    }
    

    The CDate & and const CDate & C# code is generated from the following two default typemaps:

    %typemap(cstype) SWIGTYPE & "$csclassname"
    %typemap(csin) SWIGTYPE & "$csclassname.getCPtr($csinput)"
    

    where '$csclassname' is translated into the proxy class name, CDate and '$csinput' is translated into the name of the parameter, eg dateIn. From C#, the intention is then to call into a modifed API with something like:

    System.DateTime dateIn = new System.DateTime(2011, 4, 13);
    System.DateTime dateOut = new System.DateTime();
    
    // Note in calls below, dateIn remains unchanged and dateOut 
    // is set to a new value by the C++ call
    Action action = new Action(dateIn, out dateOut);
    dateIn = new System.DateTime(2012, 7, 14);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the C# layer, a System.DateTime is converted into a CDate. The intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(cstype) const CDate & "System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);"
            ) const CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(cstype) CDate & "out System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate();", 
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="out $csinput"
            ) CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    

    The resulting generated proxy code in the Action class follows:

    public class Action : global::System.IDisposable {
      ...
      public int doSomething(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                      CDate.getCPtr(tempdateIn), 
                                                      CDate.getCPtr(tempdateOut));
          if (examplePINVOKE.SWIGPendingException.Pending) 
            throw examplePINVOKE.SWIGPendingException.Retrieve();
          return ret;
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private global::System.IntPtr SwigConstructAction(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          return examplePINVOKE.new_Action(CDate.getCPtr(tempdateIn), CDate.getCPtr(tempdateOut));
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(System.DateTime dateIn, out System.DateTime dateOut) 
          : this(Action.SwigConstructAction(dateIn, out dateOut), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    }
    

    A few things to note:

    • The "cstype" typemap has changed the parameter type to System.DateTime instead of the default generated CDate proxy.
    • The non-const CDate & type is marshalled as a reference parameter in C# as the date cannot be explicitly set once the object has been created, so a new object is created instead.
    • The code in the 'pre' attribute appears before the intermediary call (examplePINVOKE.new_Action / examplePINVOKE.Action_doSomething).
    • The code in the 'post' attribute appears after the intermediary call.
    • A try .. finally block is generated with the intermediary call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the intermediary call and the 'post' code being inserted before the return statement is not possible given that the intermediary call and method return comes from a single source (the "csout" typemap).
    • The temporary variables in the "csin" typemaps are called temp$csin, where "$csin" is replaced with the parameter name. "$csin" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "csin" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows C# code to be called before the intermediary call made in the constructor initialization list.
    • The 'cshin' attribute is required for the SwigConstructAction constructor helper function so that the 2nd parameter is declared as out dateOut instead of just dateOut.

    So far we have considered the date as an input only and an output only type. Now let's consider CDate * used as an input/output type. Consider the following C++ function which modifies the date passed in:

    void addYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() + years, pDate->getMonth(), pDate->getDay());
    }
    

    If usage of CDate * commonly follows this input/output pattern, usage from C# like the following

    System.DateTime christmasEve = new System.DateTime(2000, 12, 24);
    example.addYears(ref christmasEve, 10); // christmasEve now contains 2010-12-24
    

    will be possible with the following CDate * typemaps

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    

    Globals are wrapped by the module class and for a module called example, the typemaps result in the following code:

    public class example {
      public static void addYears(ref System.DateTime pDate, int years) {
        CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day);
        try {
          examplePINVOKE.addYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
      }
      ...
    }
    

    The following typemap is the same as the previous but demonstrates how a using block can be used for the temporary variable. The only change to the previous typemap is the introduction of the 'terminator' attribute to terminate the using block. The subtractYears method is nearly identical to the above addYears method.

    %typemap(csin,
      pre="    using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {",
      post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
           " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
      terminator="    } // terminate temp$csinput using block",
      cshin="ref $csinput"
     ) CDate *
      "$csclassname.getCPtr(temp$csinput)"
    
    void subtractYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay());
    }
    

    The resulting generated code shows the termination of the using block:

    public class example {
      public static void subtractYears(ref System.DateTime pDate, int years) {
        using (CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day)) {
        try {
          examplePINVOKE.subtractYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
        } // terminate temppDate using block
      }
      ...
    }
    

    20.8.4 A date example demonstrating marshalling of C# properties

    The previous section looked at converting a C++ date class to System.DateTime for parameters. This section extends this idea so that the correct marshalling is obtained when wrapping C++ variables. Consider the same CDate class from the previous section and a global variable:

    CDate ImportantDate = CDate(1999, 12, 31);
    

    The aim is to use System.DateTime from C# when accessing this date as shown in the following usage where the module name is 'example':

    example.ImportantDate = new System.DateTime(2000, 11, 22);
    System.DateTime importantDate = example.ImportantDate;
    Console.WriteLine("Important date: " + importantDate);
    

    When SWIG wraps a variable that is a class/struct/union, it is wrapped using a pointer to the type for the reasons given in Structure data members. The typemap type required is thus CDate *. Given that the previous section already designed CDate * typemaps, we'll use those same typemaps plus the 'csvarin' and 'csvarout' typemaps.

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(csvarin, excode=SWIGEXCODE2) CDate * %{
        /* csvarin typemap code */
        set {
          CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);
          $imcall;$excode
        } %}
    
    %typemap(csvarout, excode=SWIGEXCODE2) CDate * %{
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = $imcall;
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, $owner);$excode
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } %}
    

    For a module called example, the typemaps result in the following code:

    public class example {
      public static System.DateTime ImportantDate {
        /* csvarin typemap code */
        set {
          CDate tempvalue = new CDate(value.Year, value.Month, value.Day);
          examplePINVOKE.ImportantDate_set(CDate.getCPtr(tempvalue));
        } 
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = examplePINVOKE.ImportantDate_get();
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, false);
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } 
      }
      ...
    }
    

    Some points to note:

    • The property set comes from the 'csvarin' typemap and the property get comes from the 'csvarout' typemap.
    • The type used for the property comes from the 'cstype' typemap. This particular example has the 'out' attribute set in the typemap and as it is specified, it is used in preference to the type in the typemap body. This is because the type in the 'out' attribute can never include modifiers such as 'ref', thereby avoiding code such as public static ref System.DateTime ImportantDate { ..., which would of course not compile.
    • The $excode special variable expands to nothing as there are no exception handlers specified in any of the unmanaged code typemaps (in fact the marshalling was done using the default unmanaged code typemaps.)
    • The $imcall typemap expands to the appropriate intermediary method call in the examplePINVOKE class.
    • The $csinput special variable in the 'csin' typemap always expands to value for properties. In this case $csclassname.getCPtr(temp$csinput) expands to CDate.getCPtr(tempvalue).
    • The 'csin' typemap has 'pre', 'post' and 'cshin' attributes, and these are all ignored in the property set. The code in these attributes must instead be replicated within the 'csvarin' typemap. The line creating the temp$csinput variable is such an example; it is identical to what is in the 'pre' attribute.

    20.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    The 'pre' and 'post' attributes in the "csdirectorin" typemap act like the attributes of the same name in the "csin" typemap. For example if we modify the Date marshalling example like this:

    class CDate {
      ...
      void setYear(int);
      void setMonth(int);
      void setDay(int);
    };
    struct Action {
      virtual void someCallback(CDate &date);
      virtual ~Action();
      ...
    };
    

    and declare %feature ("director") for the Action class, we would have to define additional marshalling rules for CDate & parameter. The typemap may look like this:

    %typemap(csdirectorin,
             pre="System.DateTime temp$iminput = new System.DateTime();",
             post="CDate temp2$iminput = new CDate($iminput, false);\n"
                  "temp2$iminput.setYear(tempdate.Year);\n"
                  "temp2$iminput.setMonth(tempdate.Month);\n"
                  "temp2$iminput.setDay(tempdate.Day);"
             ) CDate &date "out temp$iminput"
    

    The generated proxy class code will then contain the following wrapper for calling user-overloaded someCallback():

    ...
      private void SwigDirectorsomeCallback(global::System.IntPtr date) {
        System.DateTime tempdate = new System.DateTime();
        try {
          someCallback(out tempdate);
        } finally {
          // we create a managed wrapper around the existing C reference, just for convenience
          CDate temp2date = new CDate(date, false);
          temp2date.setYear(tempdate.Year);
          temp2date.setMonth(tempdate.Month);
          temp2date.setDay(tempdate.Day);
        }
      }
    ...
    

    Pay special attention to the memory management issues, using these attributes.

    20.8.6 Turning wrapped classes into partial classes

    C# supports the notion of partial classes whereby a class definition can be split into more than one file. It is possible to turn the wrapped C++ class into a partial C# class using the csclassmodifiers typemap. Consider a C++ class called ExtendMe:

    class ExtendMe {
    public:
      int Part1() { return 1; }
    };
    

    The default C# proxy class generated is:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    The default csclassmodifiers typemap shipped with SWIG is

    %typemap(csclassmodifiers) SWIGTYPE "public class"
    

    Note that the type used is the special catch all type SWIGTYPE. If instead we use the following typemap to override this for just the ExtendMe class:

    %typemap(csclassmodifiers) ExtendMe "public partial class"
    

    The C# proxy class becomes a partial class:

    public partial class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    You can then of course declare another part of the partial class elsewhere, for example:

    public partial class ExtendMe : global::System.IDisposable {
      public int Part2() {
        return 2;
      }
    }
    

    and compile the following code:

    ExtendMe em = new ExtendMe();
    Console.WriteLine("part1: {0}", em.Part1());
    Console.WriteLine("part2: {0}", em.Part2());
    

    demonstrating that the class contains methods calling both unmanaged code - Part1() and managed code - Part2(). The following example is an alternative approach to adding managed code to the generated proxy class.

    20.8.7 Extending proxy classes with additional C# code

    The previous example showed how to use partial classes to add functionality to a generated C# proxy class. It is also possible to extend a wrapped struct/class with C/C++ code by using the %extend directive. A third approach is to add some C# methods into the generated proxy class with the cscode typemap. If we declare the following typemap before SWIG parses the ExtendMe class used in the previous example

    %typemap(cscode) ExtendMe %{
      public int Part3() {
        return 3;
      }
    %}
    
    

    The generated C# proxy class will instead be:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part3() {
        return 3;
      }
      public int Part1() {
        ...
      }
    }
    

    20.8.8 Underlying type for enums

    C# enums use int as the underlying type for each enum item. If you wish to change the underlying type to something else, then use the csbase typemap. For example when your C++ code uses a value larget than int, this is necessary as the C# compiler will not compile values which are too large to fit into an int. Here is an example:

    %typemap(csbase) BigNumbers "uint"
    %inline %{
      enum BigNumbers { big=0x80000000, bigger };
    %}
    

    The generated enum will then use the given underlying type and compile correctly:

    public enum BigNumbers : uint {
      big = 0x80000000,
      bigger
    }
    
    swig-3.0.12/Doc/Manual/CPlusPlus11.html0000664000175000017500000011426113042756671017312 0ustar williamwilliam SWIG and C++11

    7 SWIG and C++11

    7.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++11 standard. This part of SWIG is still a work in progress.

    SWIG supports the new C++ syntax changes with some minor limitations in some areas such as decltype expressions and variadic templates. Wrappers for the new STL types (unordered_ containers, result_of, tuples) are incomplete. The wrappers for the new containers would work much like the C++03 containers and users are welcome to help by adapting the existing container interface files and submitting them as a patch for inclusion in future versions of SWIG.

    7.2 Core language changes

    7.2.1 Rvalue reference and move semantics

    SWIG correctly parses the rvalue reference syntax '&&', for example the typical usage of it in the move constructor and move assignment operator below:

    class MyClass {
    ...
      std::vector<int> numbers;
    public:
      MyClass(MyClass &&other) : numbers(std::move(other.numbers)) {}
      MyClass & operator=(MyClass &&other) {
        numbers = std::move(other.numbers);
        return *this;
      }
    };
    

    Rvalue references are designed for C++ temporaries and so are not very useful when used from non-C++ target languages. Generally you would just ignore them via %ignore before parsing the class. For example, ignore the move constructor:

    %ignore MyClass::MyClass(MyClass &&);
    

    The plan is to ignore move constructors by default in a future version of SWIG. Note that both normal assignment operators as well as move assignment operators are ignored by default in most target languages with the following warning:

    example.i:18: Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
    

    7.2.2 Generalized constant expressions

    SWIG parses and identifies the keyword constexpr, but cannot fully utilise it. These C++ compile time constants are usable as runtime constants from the target languages. Below shows example usage for assigning a C++ compile time constant from a compile time constant function:

    constexpr int XXX() { return 10; }
    constexpr int YYY = XXX() + 100;
    

    When either of these is used from a target language, a runtime call is made to obtain the underlying constant.

    7.2.3 Extern template

    SWIG correctly parses the keywords extern template. However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG. SWIG only uses %template for instantiating and wrapping templates.

    template class std::vector<int>;        // C++03 explicit instantiation in C++
    extern template class std::vector<int>; // C++11 explicit instantiation suppression in C++
    %template(VectorInt) std::vector<int>;  // SWIG instantiation
    

    7.2.4 Initializer lists

    Initializer lists are very much a C++ compiler construct and are not very accessible from wrappers as they are intended for compile time initialization of classes using the special std::initializer_list type. SWIG detects usage of initializer lists and will emit a special informative warning each time one is used:

    example.i:33: Warning 476: Initialization using std::initializer_list.
    

    Initializer lists usually appear in constructors but can appear in any function or method. They often appear in constructors which are overloaded with alternative approaches to initializing a class, such as the std container's push_back method for adding elements to a container. The recommended approach then is to simply ignore the initializer-list constructor, for example:

    %ignore Container::Container(std::initializer_list<int>);
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Alternatively you could modify the class and add another constructor for initialization by some other means, for example by a std::vector:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    And then call this constructor from your target language, for example, in Python, the following will call the constructor taking the std::vector:

    >>> c = Container( [1, 2, 3, 4] )
    

    If you are unable to modify the class being wrapped, consider ignoring the initializer-list constructor and using %extend to add in an alternative constructor:

    %include <std_vector.i>
    %extend Container {
      Container(const std::vector<int> &elements) {
        Container *c = new Container();
        for (int element : elements)
          c->push_back(element);
        return c;
      }
    }
    
    %ignore Container::Container(std::initializer_list<int>);
    
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    The above makes the wrappers look is as if the class had been declared as follows:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
    //  Container(std::initializer_list<int>); // initializer-list constructor (ignored)
      Container();
      void push_back(const int &);
      ...
    };
    

    std::initializer_list is simply a container that can only be initialized at compile time. As it is just a C++ type, it is possible to write typemaps for a target language container to map onto std::initializer_list. However, this can only be done for a fixed number of elements as initializer lists are not designed to be constructed with a variable number of arguments at runtime. The example below is a very simple approach which ignores any parameters passed in and merely initializes with a fixed list of fixed integer values chosen at compile time:

    %typemap(in) std::initializer_list<int> {
      $1 = {10, 20, 30, 40, 50};
    }
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Any attempt at passing in values from the target language will be ignored and be replaced by {10, 20, 30, 40, 50}. Needless to say, this approach is very limited, but could be improved upon, but only slightly. A typemap could be written to map a fixed number of elements on to the std::initializer_list, but with values decided at runtime. The typemaps would be target language specific.

    Note that the default typemap for std::initializer_list does nothing but issue the warning and hence any user supplied typemaps will override it and suppress the warning.

    7.2.5 Uniform initialization

    The curly brackets {} for member initialization are fully supported by SWIG:

    struct BasicStruct {
     int x;
     double y;
    };
     
    struct AltStruct {
      AltStruct(int x, double y) : x_{x}, y_{y} {}
     
      int x_;
      double y_;
    };
    
    BasicStruct var1{5, 3.2}; // only fills the struct components
    AltStruct var2{2, 4.3};   // calls the constructor
    

    Uniform initialization does not affect usage from the target language, for example in Python:

    >>> a = AltStruct(10, 142.15)
    >>> a.x_
    10
    >>> a.y_
    142.15
    

    7.2.6 Type inference

    SWIG supports decltype() with some limitations. Single variables are allowed, however, expressions are not supported yet. For example, the following code will work:

    int i;
    decltype(i) j;
    

    However, using an expression inside the decltype results in syntax error:

    int i; int j;
    decltype(i+j) k;  // syntax error
    

    7.2.7 Range-based for-loop

    This feature is part of the implementation block only. SWIG ignores it.

    7.2.8 Lambda functions and expressions

    SWIG correctly parses most of the Lambda functions syntax. For example:

    auto val = [] { return something; };
    auto sum = [](int x, int y) { return x+y; };
    auto sum = [](int x, int y) -> int { return x+y; };
    

    The lambda functions are removed from the wrappers for now, because of the lack of support for closures (scope of the lambda functions) in the target languages.

    Lambda functions used to create variables can also be parsed, but due to limited support of auto when the type is deduced from the expression, the variables are simply ignored.

    auto six = [](int x, int y) { return x+y; }(4, 2);
    

    Better support should be available in a later release.

    7.2.9 Alternate function syntax

    SWIG fully supports the new definition of functions. For example:

    struct SomeStruct {
      int FuncName(int x, int y);
    };
    

    can now be written as in C++11:

    struct SomeStruct {
      auto FuncName(int x, int y) -> int;
    };
     
    auto SomeStruct::FuncName(int x, int y) -> int {
      return x + y;
    }
    

    The usage in the target languages remains the same, for example in Python:

    >>> a = SomeStruct()
    >>> a.FuncName(10, 5)
    15
    

    SWIG will also deal with type inference for the return type, as per the limitations described earlier. For example:

    auto square(float a, float b) -> decltype(a);
    

    7.2.10 Object construction improvement

    There are three parts to object construction improvement. The first improvement is constructor delegation such as the following:

    class A {
    public:
      int a;
      int b;
      int c;
    
      A() : A(10) {}
      A(int aa) : A(aa, 20) {}
      A(int aa, int bb) : A(aa, bb, 30) {}
      A(int aa, int bb, int cc) { a=aa; b=bb; c=cc; }
    };
    

    where peer constructors can be called. SWIG handles this without any issue.

    The second improvement is constructor inheritance via a using declaration. This is parsed correctly, but the additional constructors are not currently added to the derived proxy class in the target language. An example is shown below:

    class BaseClass {
    public:
      BaseClass(int iValue);
    };
    
    class DerivedClass: public BaseClass {
      public:
      using BaseClass::BaseClass; // Adds DerivedClass(int) constructor
    };
    

    The final part is member initialization at the site of the declaration. This kind of initialization is handled by SWIG.

    class SomeClass {
    public:
      SomeClass() {}
      explicit SomeClass(int new_value) : value(new_value) {}
    
      int value = 5;
    };
    

    7.2.11 Explicit overrides and final

    The special identifiers final and override can be used on methods and destructors, such as in the following example:

    struct BaseStruct {
      virtual void ab() const = 0;
      virtual void cd();
      virtual void ef();
      virtual ~BaseStruct();
    };
    struct DerivedStruct : BaseStruct {
      virtual void ab() const override;
      virtual void cd() final;
      virtual void ef() final override;
      virtual ~DerivedStruct() override;
    };
    

    7.2.12 Null pointer constant

    The nullptr constant is mostly unimportant in wrappers. In the few places it has an effect, it is treated like NULL.

    7.2.13 Strongly typed enumerations

    SWIG supports strongly typed enumerations and parses the new enum class syntax and forward declarator for the enums, such as:

    enum class MyEnum : unsigned int;
    

    Strongly typed enums are often used to avoid name clashes such as the following:

    struct Color {
      enum class RainbowColors : unsigned int {
        Red, Orange, Yellow, Green, Blue, Indigo, Violet
      };
      
      enum class WarmColors {
        Yellow, Orange, Red
      };
    
      // Note normal enum
      enum PrimeColors {
        Red=100, Green, Blue
      };
    };
    

    There are various ways that the target languages handle enums, so it is not possible to precisely state how they are handled in this section. However, generally, most scripting languages mangle in the strongly typed enumeration's class name, but do not use any additional mangling for normal enumerations. For example, in Python, the following code

    print Color.RainbowColors_Red, Color.WarmColors_Red, Color.Red
    

    results in

    0 2 100
    

    The strongly typed languages often wrap normal enums into an enum class and so treat normal enums and strongly typed enums the same. The equivalent in Java is:

    System.out.println(Color.RainbowColors.Red.swigValue() + " " + Color.WarmColors.Red.swigValue() + " " + Color.PrimeColors.Red.swigValue());
    

    7.2.14 Double angle brackets

    SWIG correctly parses the symbols >> as closing the template block, if found inside it at the top level, or as the right shift operator >> otherwise.

    std::vector<std::vector<int>> myIntTable;
    

    7.2.15 Explicit conversion operators

    SWIG correctly parses the keyword explicit for operators in addition to constructors now. For example:

    class U {
    public:
      int u;
    };
    
    class V {
    public:
      int v;
    };
    
    class TestClass {
    public:
      //implicit converting constructor
      TestClass(U const &val) { t=val.u; }
    
      // explicit constructor
      explicit TestClass(V const &val) { t=val.v; }
    
      int t;
    };
    
    struct Testable {
      // explicit conversion operator
      explicit operator bool() const {
        return false;
      }
    };
    

    The effect of explicit constructors and operators has little relevance for the proxy classes as target languages don't have the same concepts of implicit conversions as C++. Conversion operators either with or without explicit need renaming to a valid identifier name in order to make them available as a normal proxy method.

    7.2.16 Type alias and alias templates

    A type alias is a statement of the form:

    using PFD = void (*)(double); // New introduced syntax
    

    which is equivalent to the old style typedef:

    typedef void (*PFD)(double);  // The old style
    

    The following is an example of an alias template:

    template< typename T1, typename T2, int N >
    class SomeType {
    public:
      T1 a;
      T2 b;
    };
    
    template< typename T2 >
    using TypedefName = SomeType<char*, T2, 5>;
    

    SWIG supports both type aliasing and alias templates. However, in order to use an alias template, two %template directives must be used:

    %template(SomeTypeBool) SomeType<char*, bool, 5>;
    %template() TypedefName<bool>;
    

    Firstly, the actual template is instantiated with a name to be used by the target language, as per any template being wrapped. Secondly, the empty template instantiation, %template(), is required for the alias template. This second requirement is necessary to add the appropriate instantiated template type into the type system as SWIG does not automatically instantiate templates. See the Templates section for more general information on wrapping templates.

    7.2.17 Unrestricted unions

    SWIG fully supports any type inside a union even if it does not define a trivial constructor. For example, the wrapper for the following code correctly provides access to all members in the union:

    struct point {
      point() {}
      point(int x, int y) : x_(x), y_(y) {}
      int x_, y_;
    };
    
    #include <new> // For placement 'new' in the constructor below
    union P {
      int z;
      double w;
      point p; // Illegal in C++03; legal in C++11.
      // Due to the point member, a constructor definition is required.
      P() {
        new(&p) point();
      }
    } p1;
    

    7.2.18 Variadic templates

    SWIG supports the variadic templates syntax (inside the <> block, variadic class inheritance and variadic constructor and initializers) with some limitations. The following code is correctly parsed:

    template <typename... BaseClasses> class ClassName : public BaseClasses... {
    public:
      ClassName (BaseClasses &&... baseClasses) : BaseClasses(baseClasses)... {}
    }
    

    For now however, the %template directive only accepts one parameter substitution for the variable template parameters.

    %template(MyVariant1) ClassName<>         // zero argument not supported yet
    %template(MyVariant2) ClassName<int>      // ok
    %template(MyVariant3) ClassName<int, int> // too many arguments not supported yet
    

    Support for the variadic sizeof() function is correctly parsed:

    const int SIZE = sizeof...(ClassName<int, int>);
    

    In the above example SIZE is of course wrapped as a constant.

    7.2.19 New string literals

    SWIG supports wide string and Unicode string constants and raw string literals.

    // New string literals
    wstring         aa =  L"Wide string";
    const char     *bb = u8"UTF-8 string";
    const char16_t *cc =  u"UTF-16 string";
    const char32_t *dd =  U"UTF-32 string";
    
    // Raw string literals
    const char      *xx =        ")I'm an \"ascii\" \\ string.";
    const char      *ee =   R"XXX()I'm an "ascii" \ string.)XXX"; // same as xx
    wstring          ff =  LR"XXX(I'm a "raw wide" \ string.)XXX";
    const char      *gg = u8R"XXX(I'm a "raw UTF-8" \ string.)XXX";
    const char16_t  *hh =  uR"XXX(I'm a "raw UTF-16" \ string.)XXX";
    const char32_t  *ii =  UR"XXX(I'm a "raw UTF-32" \ string.)XXX";
    

    Non-ASCII string support varies quite a bit among the various target languages though.

    Note: There is a bug currently where SWIG's preprocessor incorrectly parses an odd number of double quotes inside raw string literals.

    7.2.20 User-defined literals

    SWIG parses the declaration of user-defined literals, that is, the operator "" _mysuffix() function syntax.

    Some examples are the raw literal:

    OutputType operator "" _myRawLiteral(const char * value);
    

    numeric cooked literals:

    OutputType operator "" _mySuffixIntegral(unsigned long long);
    OutputType operator "" _mySuffixFloat(long double);
    

    and cooked string literals:

    OutputType operator "" _mySuffix(const char * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const wchar_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char16_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char32_t * string_values, size_t num_chars);
    

    Like other operators that SWIG parses, a warning is given about renaming the operator in order for it to be wrapped:

    example.i:27: Warning 503: Can't wrap 'operator "" _myRawLiteral' unless renamed to a valid identifier.
    

    If %rename is used, then it can be called like any other wrapped method. Currently you need to specify the full declaration including parameters for %rename:

    %rename(MyRawLiteral)  operator"" _myRawLiteral(const char * value);
    

    Or if you just wish to ignore it altogether:

    %ignore operator "" _myRawLiteral(const char * value);
    

    Note that use of user-defined literals such as the following still give a syntax error:

    OutputType var1 = "1234"_suffix;
    OutputType var2 = 1234_suffix;
    OutputType var3 = 3.1416_suffix;
    

    7.2.21 Thread-local storage

    SWIG correctly parses the thread_local keyword. For example, variables reachable by the current thread can be defined as:

    struct A {
      static thread_local int val;
    };
    thread_local int global_val;
    

    The use of the thread_local storage specifier does not affect the wrapping process; it does not modify the wrapper code compared to when it is not specified. A variable will be thread local if accessed from different threads from the target language in the same way that it will be thread local if accessed from C++ code.

    7.2.22 Explicitly defaulted functions and deleted functions

    SWIG handles explicitly defaulted functions, that is, = default added to a function declaration. Deleted definitions, which are also called deleted functions, have = delete added to the function declaration. For example:

    struct NonCopyable {
      NonCopyable & operator=(const NonCopyable &) = delete; /* Removes operator= */
      NonCopyable(const NonCopyable &) = delete;             /* Removes copy constructor */
      NonCopyable() = default;                               /* Explicitly allows the empty constructor */
    };
    

    Wrappers for deleted functions will not be available in the target language. Wrappers for defaulted functions will of course be available in the target language. Explicitly defaulted functions have no direct effect for SWIG wrapping as the declaration is handled much like any other method declaration parsed by SWIG.

    Deleted functions are also designed to prevent implicit conversions when calling the function. For example, the C++ compiler will not compile any code which attempts to use an int as the type of the parameter passed to f below:

    struct NoInt {
      void f(double i);
      void f(int) = delete;
    };
    

    This is a C++ compile time check and SWIG does not make any attempt to detect if the target language is using an int instead of a double though, so in this case it is entirely possible to pass an int instead of a double to f from Java, Python etc.

    7.2.23 Type long long int

    SWIG correctly parses and uses the new long long type already introduced in C99 some time ago.

    7.2.24 Static assertions

    SWIG correctly parses the new static_assert declarations. This is a C++ compile time directive so there isn't anything useful that SWIG can do with it.

    template <typename T>
    struct Check {
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    };
    

    7.2.25 Allow sizeof to work on members of classes without an explicit object

    SWIG can parse the new sizeof() on types as well as on objects. For example:

    struct A {
      int member;
    };
    
    const int SIZE = sizeof(A::member); // does not work with C++03. Okay with C++11
    

    In Python:

    >>> SIZE
    8
    

    7.2.26 Exception specifications and noexcept

    C++11 added in the noexcept specification to exception specifications to indicate that a function simply may or may not throw an exception, without actually naming any exception. SWIG understands these, although there isn't any useful way that this information can be taken advantage of by target languages, so it is as good as ignored during the wrapping process. Below are some examples of noexcept in function declarations:

    static void noex1() noexcept;
    int noex2(int) noexcept(true);
    int noex3(int, bool) noexcept(false);
    

    7.2.27 Control and query object alignment

    An alignof operator is used mostly within C++ to return alignment in number of bytes, but could be used to initialize a variable as shown below. The variable's value will be available for access by the target language as any other variable's compile time initialised value.

    const int align1 = alignof(A::member);
    

    The alignas specifier for variable alignment is not yet supported. Example usage:

    struct alignas(16) S {
      int num;
    };
    alignas(double) unsigned char c[sizeof(double)];
    

    Use the preprocessor to work around this for now:

    #define alignas(T)
    

    7.2.28 Attributes

    Attributes such as those shown below, are not yet supported and will give a syntax error.

    int [[attr1]] i [[attr2, attr3]];
    
    [[noreturn, nothrow]] void f [[noreturn]] ();
    

    7.3 Standard library changes

    7.3.1 Threading facilities

    SWIG does not currently wrap or use any of the new threading classes introduced (thread, mutex, locks, condition variables, task). The main reason is that SWIG target languages offer their own threading facilities so there is limited use for them.

    7.3.2 Tuple types

    SWIG does not provide library files for the new tuple types yet. Variadic template support requires further work to provide substantial tuple wrappers.

    7.3.3 Hash tables

    The new hash tables in the STL are unordered_set, unordered_multiset, unordered_map, unordered_multimap. These are not available in SWIG, but in principle should be easily implemented by adapting the current STL containers.

    7.3.4 Regular expressions

    While SWIG could provide wrappers for the new C++11 regular expressions classes, there is little need as the target languages have their own regular expression facilities.

    7.3.5 General-purpose smart pointers

    SWIG provides special smart pointer handling for std::shared_ptr in the same way it has support for boost::shared_ptr. Please see the shared_ptr smart pointer library section. There is no special smart pointer handling available for std::weak_ptr and std::unique_ptr yet.

    7.3.6 Extensible random number facility

    This feature extends and standardizes the standard library only and does not effect the C++ language nor SWIG.

    7.3.7 Wrapper reference

    Wrapper references are similar to normal C++ references but are copy-constructible and copy-assignable. They could conceivably be used in public APIs. There is no special support for std::reference_wrapper in SWIG though. Users would need to write their own typemaps if wrapper references are being used and these would be similar to the plain C++ reference typemaps.

    7.3.8 Polymorphic wrappers for function objects

    SWIG supports functor classes in a few languages in a very natural way. However nothing is provided yet for the new std::function template. SWIG will parse usage of the template like any other template.

    %rename(__call__) Test::operator(); // Default renaming used for Python
    
    struct Test {
      bool operator()(int x, int y); // function object
    };
    
    #include <functional>
    std::function<void (int, int)> pF = Test;   // function template wrapper
    
    

    Example of supported usage of the plain functor from Python is shown below. It does not involve std::function.

    t = Test()
    b = t(1, 2) # invoke C++ function object
    

    7.3.9 Type traits for metaprogramming

    The type_traits functions to support C++ metaprogramming is useful at compile time and is aimed specifically at C++ development:

    #include <type_traits>
    
    // First way of operating.
    template< bool B > struct algorithm {
      template< class T1, class T2 > static int do_it(T1 &, T2 &)  { /*...*/ return 1; }
    };
    
    // Second way of operating.
    template<> struct algorithm<true> {
      template< class T1, class T2 > static int do_it(T1, T2)  { /*...*/ return 2; }
    };
    
    // Instantiating 'elaborate' will automatically instantiate the correct way to operate, depending on the types used.
    template< class T1, class T2 > int elaborate(T1 A, T2 B) {
      // Use the second way only if 'T1' is an integer and if 'T2' is a floating point,
      // otherwise use the first way.
      return algorithm< std::is_integral<T1>::value && std::is_floating_point<T2>::value >::do_it(A, B);
    }
    

    SWIG correctly parses the template specialization, template types etc. However, metaprogramming and the additional support in the type_traits header is really for compile time and is not much use at runtime for the target languages. For example, as SWIG requires explicit instantiation of templates via %template, there isn't much that std::is_integral<int> is going to provide by itself. However, template functions using such metaprogramming techniques might be useful to wrap. For example, the following instantiations could be made:

    %template(Elaborate) elaborate<int, int>;
    %template(Elaborate) elaborate<int, double>;
    

    Then the appropriate algorithm can be called for the subset of types given by the above %template instantiations from a target language, such as Python:

    >>> Elaborate(0, 0)
    1
    >>> Elaborate(0, 0.0)
    2
    

    7.3.10 Uniform method for computing return type of function objects

    The new std::result_of class introduced in the <functional> header provides a generic way to obtain the return type of a function type via std::result_of::type. There isn't any library interface file to support this type. With a bit of work, SWIG will deduce the return type of functions when used in std::result_of using the approach shown below. The technique basically forward declares the std::result_of template class, then partially specializes it for the function types of interest. SWIG will use the partial specialization and hence correctly use the std::result_of::type provided in the partial specialization.

    %inline %{
    #include <functional>
    typedef double(*fn_ptr)(double);
    %}
    
    namespace std {
      // Forward declaration of result_of
      template<typename Func> struct result_of;
      // Add in a partial specialization of result_of
      template<> struct result_of< fn_ptr(double) > {
        typedef double type;
      };
    }
    
    %template() std::result_of< fn_ptr(double) >;
    
    %inline %{
    
    double square(double x) {
      return (x * x);
    }
    
    template<class Fun, class Arg>
    typename std::result_of<Fun(Arg)>::type test_result_impl(Fun fun, Arg arg) {
      return fun(arg);
    }
    %}
    
    %template(test_result) test_result_impl< fn_ptr, double >;
    %constant double (*SQUARE)(double) = square;
    

    Note the first use of %template which SWIG requires to instantiate the template. The empty template instantiation suffices as no proxy class is required for std::result_of<Fun(Arg)>::type as this type is really just a double. The second %template instantiates the template function which is being wrapped for use as a callback. The %constant can then be used for any callback function as described in Pointers to functions and callbacks.

    Example usage from Python should give the not too surprising result:

    >>> test_result(SQUARE, 5.0)
    25.0
    

    Phew, that is a lot of hard work to get a callback working. You could just go with the more attractive option of just using double as the return type in the function declaration instead of result_of!

    swig-3.0.12/Doc/Manual/Varargs.html0000664000175000017500000007510313042756671016664 0ustar williamwilliam Variable Length Arguments

    14 Variable Length Arguments

    (a.k.a, "The horror. The horror.")

    This chapter describes the problem of wrapping functions that take a variable number of arguments. For instance, generating wrappers for the C printf() family of functions.

    This topic is sufficiently advanced to merit its own chapter. In fact, support for varargs is an often requested feature that was first added in SWIG-1.3.12. Most other wrapper generation tools have wisely chosen to avoid this issue.

    14.1 Introduction

    Some C and C++ programs may include functions that accept a variable number of arguments. For example, most programmers are familiar with functions from the C library such as the following:

    int printf(const char *fmt, ...)
    int fprintf(FILE *, const char *fmt, ...);
    int sprintf(char *s, const char *fmt, ...);
    

    Although there is probably little practical purpose in wrapping these specific C library functions in a scripting language (what would be the point?), a library may include its own set of special functions based on a similar API. For example:

    int  traceprintf(const char *fmt, ...);
    

    In this case, you may want to have some kind of access from the target language.

    Before describing the SWIG implementation, it is important to discuss the common uses of varargs that you are likely to encounter in real programs. Obviously, there are the printf() style output functions as shown. Closely related to this would be scanf() style input functions that accept a format string and a list of pointers into which return values are placed. However, variable length arguments are also sometimes used to write functions that accept a NULL-terminated list of pointers. A good example of this would be a function like this:

    int execlp(const char *path, const char *arg1, ...);
    ...
    
    /* Example */
    execlp("ls", "ls", "-l", NULL);
    

    In addition, varargs is sometimes used to fake default arguments in older C libraries. For instance, the low level open() system call is often declared as a varargs function so that it will accept two or three arguments:

    int open(const char *path, int oflag, ...);
    ...
    
    /* Examples */
    f = open("foo", O_RDONLY);
    g = open("bar", O_WRONLY | O_CREAT, 0644);
    

    Finally, to implement a varargs function, recall that you have to use the C library functions defined in <stdarg.h>. For example:

    List make_list(const char *s, ...) {
      va_list ap;
      List    x;
      ...
      va_start(ap, s);
      while (s) {
        x.append(s);
        s = va_arg(ap, const char *);
      }
      va_end(ap);
      return x;
    }
    

    14.2 The Problem

    Generating wrappers for a variable length argument function presents a number of special challenges. Although C provides support for implementing functions that receive variable length arguments, there are no functions that can go in the other direction. Specifically, you can't write a function that dynamically creates a list of arguments and which invokes a varargs function on your behalf.

    Although it is possible to write functions that accept the special type va_list, this is something entirely different. You can't take a va_list structure and pass it in place of the variable length arguments to another varargs function. It just doesn't work.

    The reason this doesn't work has to do with the way that function calls get compiled. For example, suppose that your program has a function call like this:

    printf("Hello %s. Your number is %d\n", name, num);
    

    When the compiler looks at this, it knows that you are calling printf() with exactly three arguments. Furthermore, it knows that the number of arguments as well are their types and sizes is never going to change during program execution. Therefore, this gets turned to machine code that sets up a three-argument stack frame followed by a call to printf().

    In contrast, suppose you attempted to make some kind of wrapper around printf() using code like this:

    int wrap_printf(const char *fmt, ...) {
      va_list ap;
      va_start(ap, fmt);
      ...
      printf(fmt, ap);
      ...
      va_end(ap);
    };
    

    Although this code might compile, it won't do what you expect. This is because the call to printf() is compiled as a procedure call involving only two arguments. However, clearly a two-argument configuration of the call stack is completely wrong if your intent is to pass an arbitrary number of arguments to the real printf(). Needless to say, it won't work.

    Unfortunately, the situation just described is exactly the problem faced by wrapper generation tools. In general, the number of passed arguments will not be known until run-time. To make matters even worse, you won't know the types and sizes of arguments until run-time as well. Needless to say, there is no obvious way to make the C compiler generate code for a function call involving an unknown number of arguments of unknown types.

    In theory, it is possible to write a wrapper that does the right thing. However, this involves knowing the underlying ABI for the target platform and language as well as writing special purpose code that manually constructed the call stack before making a procedure call. Unfortunately, both of these tasks require the use of inline assembly code. Clearly, that's the kind of solution you would much rather avoid.

    With this nastiness in mind, SWIG provides a number of solutions to the varargs wrapping problem. Most of these solutions are compromises that provide limited varargs support without having to resort to assembly language. However, SWIG can also support real varargs wrapping (with stack-frame manipulation) if you are willing to get hands dirty. Keep reading.

    14.3 Default varargs support

    When variable length arguments appear in an interface, the default behavior is to drop the variable argument list entirely, replacing them with a single NULL pointer. For example, if you had this function,

    void traceprintf(const char *fmt, ...);
    

    it would be wrapped as if it had been declared as follows:

    void traceprintf(const char *fmt);
    

    When the function is called inside the wrappers, it is called as follows:

    traceprintf(arg1, NULL);
    

    Arguably, this approach seems to defeat the whole point of variable length arguments. However, this actually provides enough support for many simple kinds of varargs functions to still be useful, however it does come with a caveat. For instance, you could make function calls like this (in Python):

    >>> traceprintf("Hello World")
    >>> traceprintf("Hello %s. Your number is %d\n" % (name, num))
    >>> traceprintf("Your result is 90%%.")
    

    Notice how string formatting is being done in Python instead of C. The caveat is the strings passed must be safe to use in C though. For example if name was to contain a "%" it should be double escaped in order to avoid unpredictable behaviour:

    >>> traceprintf("Your result is 90%.\n")  # unpredictable behaviour
    >>> traceprintf("Your result is 90%%.\n") # good
    

    Read on for further solutions.

    14.4 Argument replacement using %varargs

    Instead of dropping the variable length arguments, an alternative approach is to replace (...) with a set of suitable arguments. SWIG provides a special %varargs directive that can be used to do this. For example,

    %varargs(int mode = 0) open;
    ...
    int open(const char *path, int oflags, ...);
    

    is equivalent to this:

    int open(const char *path, int oflags, int mode = 0);
    

    In this case, %varargs is simply providing more specific information about the extra arguments that might be passed to a function. If the arguments to a varargs function are of uniform type, %varargs can also accept a numerical argument count as follows:

    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    and is effectively seen as:

    int execlp(const char *path, const char *arg, 
               char *str1 = NULL, 
               char *str2 = NULL, 
               char *str3 = NULL);
    

    This would wrap execlp() as a function that accepted up to 3 optional arguments. Depending on the application, this may be more than enough for practical purposes.

    The handling of default arguments can be changed via the compactdefaultargs feature. If this feature is used, for example

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    a call from the target language which does not provide the maximum number of arguments, such as, execlp("a", "b", "c") will generate C code which includes the missing default values, that is, execlp("a", "b", "c", NULL, NULL). If compactdefaultargs is not used, then the generated code will be execlp("a", "b", "c"). The former is useful for helping providing a sentinel to terminate the argument list. However, this is not guaranteed, for example when a user passes a non-NULL value for all the parameters. When using compactdefaultargs it is possible to guarantee the NULL sentinel is passed through the, numinputs=0 'in' typemap attribute, naming the last parameter. For example,

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    %typemap(in, numinputs=0) char *str3 ""
    ...
    int execlp(const char *path, const char *arg, ...);
    

    Note that str3 is the name of the last argument, as we have used %varargs with 3. Now execlp("a", "b", "c", "d", "e") will result in an error as one too many arguments has been passed, as now only 2 additional 'str' arguments can be passed with the 3rd one always using the specified default NULL.

    Argument replacement is most appropriate in cases where the types of the extra arguments are uniform and the maximum number of arguments are known. Argument replacement is not as useful when working with functions that accept mixed argument types such as printf(). Providing general purpose wrappers to such functions presents special problems (covered shortly).

    14.5 Varargs and typemaps

    Variable length arguments may be used in typemap specifications. For example:

    %typemap(in) (...) {
        // Get variable length arguments (somehow)
        ...
    }
    
    %typemap(in) (const char *fmt, ...) {
        // Multi-argument typemap
    }
    

    However, this immediately raises the question of what "type" is actually used to represent (...). For lack of a better alternative, the type of (...) is set to void *. Since there is no way to dynamically pass arguments to a varargs function (as previously described), the void * argument value is intended to serve as a place holder for storing some kind of information about the extra arguments (if any). In addition, the default behavior of SWIG is to pass the void * value as an argument to the function. Therefore, you could use the pointer to hold a valid argument value if you wanted.

    To illustrate, here is a safer version of wrapping printf() in Python:

    %typemap(in) (const char *fmt, ...) {
        $1 = "%s";                                /* Fix format string to %s */
        $2 = (void *) PyString_AsString($input);  /* Get string argument */
    };
    ...
    int printf(const char *fmt, ...);
    

    In this example, the format string is implicitly set to "%s". This prevents a program from passing a bogus format string to the extension. Then, the passed input object is decoded and placed in the void * argument defined for the (...) argument. When the actual function call is made, the underlying wrapper code will look roughly like this:

    wrap_printf() {
      char *arg1;
      void *arg2;
      int   result;
    
      arg1 = "%s";
      arg2 = (void *) PyString_AsString(arg2obj);
      ...
      result = printf(arg1, arg2);
      ...
    }
    

    Notice how both arguments are passed to the function and it does what you would expect.

    The next example illustrates a more advanced kind of varargs typemap. Disclaimer: this requires special support in the target language module and is not guaranteed to work with all SWIG modules at this time. It also starts to illustrate some of the more fundamental problems with supporting varargs in more generality.

    If a typemap is defined for any form of (...), many SWIG modules will generate wrappers that accept a variable number of arguments as input and will make these arguments available in some form. The precise details of this depends on the language module being used (consult the appropriate chapter for more details). However, suppose that you wanted to create a Python wrapper for the execlp() function shown earlier. To do this using a typemap instead of using %varargs, you might first write a typemap like this:

    %typemap(in) (...)(char *vargs[10]) {
      int i;
      int argc;
      for (i = 0; i < 10; i++) vargs[i] = 0;
      argc = PyTuple_Size(varargs);
      if (argc > 10) {
        PyErr_SetString(PyExc_ValueError, "Too many arguments");
        SWIG_fail;
      }
      for (i = 0; i < argc; i++) {
        PyObject *pyobj = PyTuple_GetItem(varargs, i);
        char *str = 0;
    %#if PY_VERSION_HEX>=0x03000000
        PyObject *pystr;
        if (!PyUnicode_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        pystr = PyUnicode_AsUTF8String(pyobj);
        str = strdup(PyBytes_AsString(pystr));
        Py_XDECREF(pystr);
    %#else  
        if (!PyString_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        str = PyString_AsString(pyobj);
    %#endif
        vargs[i] = str;
      }
      $1 = (void *)vargs;
    }
    
    %typemap(freearg) (...) {
    %#if PY_VERSION_HEX>=0x03000000
      int i;
      for (i = 0; i < 10; i++) {
        free(vargs$argnum[i]);
      }
    %#endif
    }
    

    In the 'in' typemap, the special variable varargs is a tuple holding all of the extra arguments passed (this is specific to the Python module). The typemap then pulls this apart and sticks the values into the array of strings args. Then, the array is assigned to $1 (recall that this is the void * variable corresponding to (...)). However, this assignment is only half of the picture----clearly this alone is not enough to make the function work. The 'freearg' typemap cleans up memory allocated in the 'in' typemap; this code is generated to be called after the execlp function is called. To patch everything up, you have to rewrite the underlying action code using the %feature directive like this:

    %feature("action") execlp {
      char **vargs = (char **) arg3;
      result = execlp(arg1, arg2, vargs[0], vargs[1], vargs[2], vargs[3], vargs[4],
                      vargs[5], vargs[6], vargs[7], vargs[8], vargs[9], NULL);
    }
    
    int execlp(const char *path, const char *arg, ...);
    

    This patches everything up and creates a function that more or less works. However, don't try explaining this to your coworkers unless you know for certain that they've had several cups of coffee. If you really want to elevate your guru status and increase your job security, continue to the next section.

    14.6 Varargs wrapping with libffi

    All of the previous examples have relied on features of SWIG that are portable and which don't rely upon any low-level machine-level details. In many ways, they have all dodged the real issue of variable length arguments by recasting a varargs function into some weaker variation with a fixed number of arguments of known types. In many cases, this works perfectly fine. However, if you want more generality than this, you need to bring out some bigger guns.

    One way to do this is to use a special purpose library such as libffi (http://www.sourceware.org/libffi/). libffi is a library that allows you to dynamically construct call-stacks and invoke procedures in a relatively platform independent manner. Details about the library can be found in the libffi distribution and are not repeated here.

    To illustrate the use of libffi, suppose that you really wanted to create a wrapper for execlp() that accepted any number of arguments. To do this, you might make a few adjustments to the previous example. For example:

    /* Take an arbitrary number of extra arguments and place into an array
       of strings */
    
    %typemap(in) (...) {
      char **argv;
      int    argc;
      int    i;
    
      argc = PyTuple_Size(varargs);
      argv = (char **) malloc(sizeof(char *)*(argc+1));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (!PyString_Check(o)) {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        argv[i] = PyString_AsString(o);
      }
      argv[i] = NULL;
      $1 = (void *) argv;
    }
    
    /* Rewrite the function call, using libffi */    
    
    %feature("action") execlp {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      char      **args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+3)*sizeof(ffi_type *));
      values = (void **) malloc((vc+3)*sizeof(void *));
      args   = (char **) arg3;
    
      /* Set up path parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
      
      /* Set up first argument */
      types[1] = &ffi_type_pointer;
      values[1] = &arg2;
    
      /* Set up rest of parameters */
      for (i = 0; i <= vc; i++) {
        types[2+i] = &ffi_type_pointer;
        values[2+i] = &args[i];
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+3,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) execlp, &result, values);
      } else {
        free(types);
        free(values);
        free(arg3);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(arg3);
    }
    
    /* Declare the function. Whew! */
    int execlp(const char *path, const char *arg1, ...);
    

    Looking at this example, you may start to wonder if SWIG is making life any easier. Given the amount of code involved, you might also wonder why you didn't just write a hand-crafted wrapper! Either that or you're wondering "why in the hell am I trying to wrap this varargs function in the first place?!?" Obviously, those are questions you'll have to answer for yourself.

    As a more extreme example of libffi, here is some code that attempts to wrap printf(),

    /* A wrapper for printf() using libffi */
    
    %{
    /* Structure for holding passed arguments after conversion */
      typedef struct {
        int type;
        union {
          int    ivalue;
          double dvalue;
          void   *pvalue;
        } val;
      } vtype;
      enum { VT_INT, VT_DOUBLE, VT_POINTER };
    %}
    
    %typemap(in) (const char *fmt, ...) {
      vtype *argv;
      int    argc;
      int    i;
    
      /* Format string */
      $1 = PyString_AsString($input);
    
      /* Variable length arguments */
      argc = PyTuple_Size(varargs);
      argv = (vtype *) malloc(argc*sizeof(vtype));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (PyInt_Check(o)) {
          argv[i].type = VT_INT;
          argv[i].val.ivalue = PyInt_AsLong(o);
        } else if (PyFloat_Check(o)) {
          argv[i].type = VT_DOUBLE;
          argv[i].val.dvalue = PyFloat_AsDouble(o);
        } else if (PyString_Check(o)) {
          argv[i].type = VT_POINTER;
          argv[i].val.pvalue = (void *) PyString_AsString(o);
        } else {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Unsupported argument type");
          return NULL;
        }
      }
      $2 = (void *) argv;
    }
    
    /* Rewrite the function call using libffi */    
    %feature("action") printf {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      vtype     *args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+1)*sizeof(ffi_type *));
      values = (void **) malloc((vc+1)*sizeof(void *));
      args   = (vtype *) arg2;
    
      /* Set up fmt parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
    
      /* Set up rest of parameters */
      for (i = 0; i < vc; i++) {
        switch(args[i].type) {
        case VT_INT:
          types[1+i] = &ffi_type_uint;
          values[1+i] = &args[i].val.ivalue;
          break;
        case VT_DOUBLE:
          types[1+i] = &ffi_type_double;
          values[1+i] = &args[i].val.dvalue;
          break;
        case VT_POINTER:
          types[1+i] = &ffi_type_pointer;
          values[1+i] = &args[i].val.pvalue;
          break;
        default:
          abort();    /* Whoa! We're seriously hosed */
          break;   
        }
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+1,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) printf, &result, values);
      } else {
        free(types);
        free(values);
        free(args);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(args);
    }
    
    /* The function */
    int printf(const char *fmt, ...);
    

    Much to your amazement, it even seems to work if you try it:

    >>> import example
    >>> example.printf("Grade: %s   %d/60 = %0.2f%%\n", "Dave", 47, 47.0*100/60)
    Grade: Dave   47/60 = 78.33%
    >>>
    

    Of course, there are still some limitations to consider:

    >>> example.printf("la de da de da %s", 42)
    Segmentation fault (core dumped)
    

    And, on this note, we leave further exploration of libffi to the reader as an exercise. Although Python has been used as an example, most of the techniques in this section can be extrapolated to other language modules with a bit of work. The only details you need to know is how the extra arguments are accessed in each target language. For example, in the Python module, we used the special varargs variable to get these arguments. Modules such as Tcl8 and Perl5 simply provide an argument number for the first extra argument. This can be used to index into an array of passed arguments to get values. Please consult the chapter on each language module for more details.

    14.7 Wrapping of va_list

    Closely related to variable length argument wrapping, you may encounter functions that accept a parameter of type va_list. For example:

    int vprintf(const char *fmt, va_list ap);
    

    As far as we know, there is no obvious way to wrap these functions with SWIG. This is because there is no documented way to assemble the proper va_list structure (there are no C library functions to do it and the contents of va_list are opaque). Not only that, the contents of a va_list structure are closely tied to the underlying call-stack. It's not clear that exporting a va_list would have any use or that it would work at all.

    A workaround can be implemented by writing a simple varargs C wrapper and then using the techniques discussed earlier in this chapter for varargs. Below is a simple wrapper for vprintf renamed so that it can still be called as vprintf from your target language. The %varargs used in the example restricts the function to taking one string argument.

    %{
    int vprintf(const char *fmt, va_list ap);
    %}
    
    %varargs(const char *) my_vprintf;
    %rename(vprintf) my_vprintf;
    
    %inline %{
    int my_vprintf(const char *fmt, ...) {
      va_list ap;
      int result;
    
      va_start(ap, fmt);
      result = vprintf(fmt, ap);
      va_end(ap);
      return result;
    }
    %}
    

    14.8 C++ Issues

    Wrapping of C++ member functions that accept a variable number of arguments presents a number of challenges. By far, the easiest way to handle this is to use the %varargs directive. This is portable and it fully supports classes much like the %rename directive. For example:

    %varargs (10, char * = NULL) Foo::bar;
    
    class Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    
    class Spam: public Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    

    %varargs also works with constructors, operators, and any other C++ programming construct that accepts variable arguments.

    Doing anything more advanced than this is likely to involve a serious world of pain. In order to use a library like libffi, you will need to know the underlying calling conventions and details of the C++ ABI. For instance, the details of how this is passed to member functions as well as any hidden arguments that might be used to pass additional information. These details are implementation specific and may differ between compilers and even different versions of the same compiler. Also, be aware that invoking a member function is further complicated if it is a virtual method. In this case, invocation might require a table lookup to obtain the proper function address (although you might be able to obtain an address by casting a bound pointer to a pointer to function as described in the C++ ARM section 18.3.4).

    If you do decide to change the underlying action code, be aware that SWIG always places the this pointer in arg1. Other arguments are placed in arg2, arg3, and so forth. For example:

    %feature("action") Foo::bar {
      ...
      result = arg1->bar(arg2, arg3, etc.);
      ...
    }
    

    Given the potential to shoot yourself in the foot, it is probably easier to reconsider your design or to provide an alternative interface using a helper function than it is to create a fully general wrapper to a varargs C++ member function.

    14.9 Discussion

    This chapter has provided a number of techniques that can be used to address the problem of variable length argument wrapping. If you care about portability and ease of use, the %varargs directive is probably the easiest way to tackle the problem. However, using typemaps, it is possible to do some very advanced kinds of wrapping.

    One point of discussion concerns the structure of the libffi examples in the previous section. Looking at that code, it is not at all clear that this is the easiest way to solve the problem. However, there are a number of subtle aspects of the solution to consider--mostly concerning the way in which the problem has been decomposed. First, the example is structured in a way that tries to maintain separation between wrapper-specific information and the declaration of the function itself. The idea here is that you might structure your interface like this:

    %typemap(const char *fmt, ...) {
      ...
    }
    %feature("action") traceprintf {
      ...
    }
    
    /* Include some header file with traceprintf in it */
    %include "someheader.h"
    

    Second, careful scrutiny will reveal that the typemaps involving (...) have nothing whatsoever to do with the libffi library. In fact, they are generic with respect to the way in which the function is actually called. This decoupling means that it will be much easier to consider other library alternatives for making the function call. For instance, if libffi wasn't supported on a certain platform, you might be able to use something else instead. You could use conditional compilation to control this:

    #ifdef USE_LIBFFI
    %feature("action") printf {
      ...
    }
    #endif
    #ifdef USE_OTHERFFI
    %feature("action") printf {
    ...
    }
    #endif
    

    Finally, even though you might be inclined to just write a hand-written wrapper for varargs functions, the techniques used in the previous section have the advantage of being compatible with all other features of SWIG such as exception handling.

    As a final word, some C programmers seem to have the assumption that the wrapping of variable length argument functions is an easily solved problem. However, this section has hopefully dispelled some of these myths. All things being equal, you are better off avoiding variable length arguments if you can. If you can't avoid them, please consider some of the simple solutions first. If you can't live with a simple solution, proceed with caution. At the very least, make sure you carefully read the section "A7.3.2 Function Calls" in Kernighan and Ritchie and make sure you fully understand the parameter passing conventions used for varargs. Also, be aware of the platform dependencies and reliability issues that this will introduce. Good luck.

    swig-3.0.12/Doc/Manual/Windows.html0000664000175000017500000003701013042756671016704 0ustar williamwilliam Getting started on Windows

    3 Getting started on Windows

    This chapter describes SWIG usage on Microsoft Windows. Installing SWIG and running the examples is covered as well as building the SWIG executable. Usage within the Unix like environments MinGW and Cygwin is also detailed.

    3.1 Installation on Windows

    SWIG does not come with the usual Windows type installation program, however it is quite easy to get started. The main steps are:

    • Download the swigwin zip package from the SWIG website and unzip into a directory. This is all that needs downloading for the Windows platform.
    • Set environment variables as described in the SWIG Windows Examples section in order to run examples using Visual C++.

    3.1.1 Windows Executable

    The swigwin distribution contains the SWIG Windows executable, swig.exe, which will run on 32 bit versions of Windows, ie Windows 95 and later. If you want to build your own swig.exe have a look at Building swig.exe on Windows.

    3.2 SWIG Windows Examples

    Using Microsoft Visual C++ is the most common approach to compiling and linking SWIG's output. The Examples directory has a few Visual C++ project files (.dsp files). These were produced by Visual C++ 6. Newer versions of Visual Studio should be able to open and convert these project files. Each C# example comes with a Visual Studio 2005 solution and associated project files instead of Visual C++ 6 project files. The project files have been set up to execute SWIG in a custom build rule for the SWIG interface (.i) file. Alternatively run the examples using Cygwin.

    More information on each of the examples is available with the examples distributed with SWIG (Examples/index.html).

    3.2.1 Instructions for using the Examples with Visual Studio

    Ensure the SWIG executable is as supplied in the SWIG root directory in order for the examples to work. Most languages require some environment variables to be set before running Visual C++. Note that Visual C++ must be re-started to pick up any changes in environment variables. Open up an example .dsp file, Visual C++ will create a workspace for you (.dsw file). Ensure the Release build is selected then do a Rebuild All from the Build menu. The required environment variables are displayed with their current values.

    The list of required environment variables for each module language is also listed below. They are usually set from the Control Panel and System properties, but this depends on which flavour of Windows you are running. If you don't want to use environment variables then change all occurrences of the environment variables in the .dsp files with hard coded values. If you are interested in how the project files are set up there is explanatory information in some of the language module's documentation.

    3.2.1.1 C#

    The C# examples do not require any environment variables to be set as a C# project file is included. Just open up the .sln solution file in Visual Studio .NET 2003 or later, select Release Build, and do a Rebuild All from the Build menu. The accompanying C# and C++ project files are automatically used by the solution file.

    3.2.1.2 Java

    JAVA_INCLUDE : Set this to the directory containing jni.h
    JAVA_BIN : Set this to the bin directory containing javac.exe

    Example using JDK1.3:
    JAVA_INCLUDE: D:\jdk1.3\include
    JAVA_BIN: D:\jdk1.3\bin

    3.2.1.3 Perl

    PERL5_INCLUDE : Set this to the directory containing perl.h
    PERL5_LIB : Set this to the Perl library including path for linking

    Example using nsPerl 5.004_04:

    PERL5_INCLUDE: D:\nsPerl5.004_04\lib\CORE
    PERL5_LIB: D:\nsPerl5.004_04\lib\CORE\perl.lib

    3.2.1.4 Python

    PYTHON_INCLUDE : Set this to the directory that contains Python.h
    PYTHON_LIB : Set this to the python library including path for linking

    Example using Python 2.1.1:
    PYTHON_INCLUDE: D:\python21\include
    PYTHON_LIB: D:\python21\libs\python21.lib

    3.2.1.5 TCL

    TCL_INCLUDE : Set this to the directory containing tcl.h
    TCL_LIB : Set this to the TCL library including path for linking

    Example using ActiveTcl 8.3.3.3
    TCL_INCLUDE: D:\tcl\include
    TCL_LIB: D:\tcl\lib\tcl83.lib

    3.2.1.6 R

    R_INCLUDE : Set this to the directory containing R.h
    R_LIB : Set this to the R library (Rdll.lib) including path for linking. The library needs to be built as described in the R README.packages file (the pexports.exe approach is the easiest).

    Example using R 2.5.1:
    R_INCLUDE: C:\Program Files\R\R-2.5.1\include
    R_LIB: C:\Program Files\R\R-2.5.1\bin\Rdll.lib

    3.2.1.7 Ruby

    RUBY_INCLUDE : Set this to the directory containing ruby.h
    RUBY_LIB : Set this to the ruby library including path for linking

    Example using Ruby 1.6.4:
    RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32
    RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib

    3.2.2 Instructions for using the Examples with other compilers

    If you do not have access to Visual C++ you will have to set up project files / Makefiles for your chosen compiler. There is a section in each of the language modules detailing what needs setting up using Visual C++ which may be of some guidance. Alternatively you may want to use Cygwin as described in the following section.

    3.3 SWIG on Cygwin and MinGW

    SWIG can also be compiled and run using Cygwin or MinGW which provides a Unix like front end to Windows and comes free with gcc, an ANSI C/C++ compiler. However, this is not a recommended approach as the prebuilt executable is supplied.

    3.3.1 Building swig.exe on Windows

    If you want to replicate the build of swig.exe that comes with the download, follow the MinGW instructions below. This is not necessary to use the supplied swig.exe. This information is provided for those that want to modify the SWIG source code in a Windows environment. Normally this is not needed, so most people will want to ignore this section.

    3.3.1.1 Building swig.exe using MinGW and MSYS

    The short abbreviated instructions follow...

    • Install MinGW and MSYS from the MinGW site. This provides a Unix environment on Windows.
    • Follow the usual Unix instructions in the README file in the SWIG root directory to build swig.exe from the MinGW command prompt.

    The step by step instructions to download and install MinGW and MSYS, then download and build the latest version of SWIG from Github follow... Note that the instructions for obtaining SWIG from Github are also online at SWIG Bleeding Edge.

    Pitfall note: Execute the steps in the order shown and don't use spaces in path names. In fact it is best to use the default installation directories.

    1. Download the following packages from the MinGW download page or MinGW SourceForge download page. Note that at the time of writing, the majority of these are in the Current release list and some are in the Snapshot or Previous release list.
      • MinGW-3.1.0-1.exe
      • MSYS-1.0.11-2004.04.30-1.exe
      • msysDTK-1.0.1.exe
      • bison-2.0-MSYS.tar.gz
      • msys-autoconf-2.59.tar.bz2
      • msys-automake-1.8.2.tar.bz2
    2. Install MinGW-3.1.0-1.exe (C:\MinGW is default location.)
    3. Install MSYS-1.0.11-2004.04.30-1.exe. Make sure you install it on the same windows drive letter as MinGW (C:\msys\1.0 is default). In the post install script,
      • Answer y to the "do you wish to continue with the post install?"
      • Answer y to the "do you have MinGW installed?"
      • Type in the folder in which you installed MinGW (C:/MinGW is default)
    4. Install msysDTK-1.0.1.exe to the same folder that you installed MSYS (C:\msys\1.0 is default).
    5. Copy the following to the MSYS install folder (C:\msys\1.0 is default):
      • msys-automake-1.8.2.tar.bz2
      • msys-autoconf-2.59.tar.bz2
      • bison-2.0-MSYS.tar.gz
    6. Start the MSYS command prompt and execute:
      cd /
      tar -jxf msys-automake-1.8.2.tar.bz2
      tar -jxf msys-autoconf-2.59.tar.bz2
      tar -zxf bison-2.0-MSYS.tar.gz
      
    7. The very latest development version of SWIG is available from SWIG on Github and can be downloaded as a zip file or if you have Git installed, via Git. Either download the latest Zip file snapshot and unzip and rename the top level folder to /usr/src/swig. Otherwise if using Git, type in the following:
      mkdir /usr/src
      cd /usr/src
      git clone https://github.com/swig/swig.git
      
      Pitfall note: If you want to place SWIG in a different folder to the proposed /usr/src/swig, do not use MSYS emulated windows drive letters, because the autotools will fail miserably on those.
    8. The PCRE third party library needs to be built next. Download the latest PCRE source tarball, such as pcre-8.10.tar.bz2, from PCRE and place in the /usr/src/swig directory. Build PCRE as a static library using the Tools/pcre-build.sh script as follows:
      cd /usr/src/swig
      Tools/pcre-build.sh
      
    9. You are now ready to build SWIG. Execute the following commands to build swig.exe:
      cd /usr/src/swig
      ./autogen.sh
      ./configure
      make
      

    3.3.1.2 Building swig.exe using Cygwin

    Note that SWIG can also be built using Cygwin. However, SWIG will then require the Cygwin DLL when executing. Follow the Unix instructions in the README file in the SWIG root directory. Note that the Cygwin environment will also allow one to regenerate the autotool generated files which are supplied with the release distribution. These files are generated using the autogen.sh script and will only need regenerating in circumstances such as changing the build system.

    3.3.1.3 Building swig.exe alternatives

    If you don't want to install Cygwin or MinGW, use a different compiler to build SWIG. For example, all the source code files can be added to a Visual C++ project file in order to build swig.exe from the Visual C++ IDE.

    3.3.2 Running the examples on Windows using Cygwin

    The examples and test-suite work as successfully on Cygwin as on any other Unix operating system. The modules which are known to work are Python, Tcl, Perl, Ruby, Java and C#. Follow the Unix instructions in the README file in the SWIG root directory to build the examples.

    3.4 Microsoft extensions and other Windows quirks

    A common problem when using SWIG on Windows are the Microsoft function calling conventions which are not in the C++ standard. SWIG parses ISO C/C++ so cannot deal with proprietary conventions such as __declspec(dllimport), __stdcall etc. There is a Windows interface file, windows.i, to deal with these calling conventions though. The file also contains typemaps for handling commonly used Windows specific types such as __int64, BOOL, DWORD etc. Include it like you would any other interface file, for example:

    %include <windows.i>
    
    __declspec(dllexport) ULONG __stdcall foo(DWORD, __int32);
    

    Note that if you follow Microsoft's recommendation of wrapping the __declspec calls in a preprocessor definition, you will need to make sure that the definition is included by SWIG as well, by either defining it manually or via a header. For example, if you have specified the preprocessor definition in a header named export_lib.h and include other headers which depend on it, you should use the %include directive to include the definition explicitly. For example, if you had a header file, bar.h, which depended on export_lib.h, your SWIG definition file might look like:

    // bar.i
    %module bar
    %include <windows.i>
    %include "export_lib.h"
    %include "bar.h"
    

    where export_lib.h may contain:

    // export_lib.h
    #define BAR_API __declspec(dllexport)
    

    and bar.h may look like:

    // bar.h
    #include "export_lib.h"
    BAR_API void bar_function(int, double);
    

    Using the preprocessor to remove BAR_API is a popular simpler solution:

    // bar.i
    %module bar
    #define BAR_API
    %include "bar.h"
    
    swig-3.0.12/Doc/Manual/SWIGDocumentation.html0000664000175000017500001106145213042756672020567 0ustar williamwilliam SWIG-3.0 Documentation
    SWIG-3.0 Documentation

    SWIG-3.0 Documentation



    Table of Contents



    SWIG-3.0 Documentation 1 Preface 2 Introduction 3 Getting started on Windows 4 Scripting Languages 5 SWIG Basics 6 SWIG and C++ 7 SWIG and C++11 8 Preprocessing 9 SWIG library 10 Argument Handling 11 Typemaps 12 Customization Features 13 Contracts 14 Variable Length Arguments 15 Warning Messages 16 Working with Modules 17 Using SWIG with ccache - ccache-swig(1) manpage 18 SWIG and Allegro Common Lisp 19 SWIG and Android 20 SWIG and C# 21 SWIG and Chicken 22 SWIG and D 23 SWIG and Go 24 SWIG and Guile 25 SWIG and Java 26 SWIG and Javascript 27 SWIG and Common Lisp 28 SWIG and Lua 29 SWIG and Modula-3 30 SWIG and MzScheme/Racket 31 SWIG and Ocaml 32 SWIG and Octave 33 SWIG and Perl5 34 SWIG and PHP 35 SWIG and Pike 36 SWIG and Python 37 SWIG and R 38 SWIG and Ruby 39 SWIG and Scilab 40 SWIG and Tcl 41 Extending SWIG to support new languages

    SWIG-3.0 Documentation

    Last update : SWIG-3.0.12 (27 Jan 2017)

    Sections

    SWIG Core Documentation

    Language Module Documentation

    Developer Documentation


    1 Preface

    1.1 Introduction

    SWIG (Simplified Wrapper and Interface Generator) is a software development tool for building scripting language interfaces to C and C++ programs. Originally developed in 1995, SWIG was first used by scientists in the Theoretical Physics Division at Los Alamos National Laboratory for building user interfaces to simulation codes running on the Connection Machine 5 supercomputer. In this environment, scientists needed to work with huge amounts of simulation data, complex hardware, and a constantly changing code base. The use of a scripting language interface provided a simple yet highly flexible foundation for solving these types of problems. SWIG simplifies development by largely automating the task of scripting language integration--allowing developers and users to focus on more important problems.

    Although SWIG was originally developed for scientific applications, it has since evolved into a general purpose tool that is used in a wide variety of applications--in fact almost anything where C/C++ programming is involved.

    1.2 SWIG Versions

    In the late 1990's, the most stable version of SWIG was release 1.1p5. Versions 1.3.x were officially development versions and these were released over a period of 10 years starting from the year 2000. The final version in the 1.3.x series was 1.3.40, but in truth the 1.3.x series had been stable for many years. An official stable version was released along with the decision to make SWIG license changes and this gave rise to version 2.0.0 in 2010.

    1.3 SWIG License

    The LICENSE file shipped with SWIG in the top level directory contains the SWIG license. For further insight into the license including the license of SWIG's output code, please visit the SWIG legal page - http://www.swig.org/legal.html.

    The license was clarified in version 2.0.0 so that the code that SWIG generated could be distributed under license terms of the user's choice/requirements and at the same time the SWIG source was placed under the GNU General Public License version 3.

    1.4 SWIG resources

    The official location of SWIG related material is

    This site contains the latest version of the software, users guide, and information regarding bugs, installation problems, and implementation tricks.

    You can also subscribe to the swig-user mailing list by visiting the page

    The mailing list often discusses some of the more technical aspects of SWIG along with information about beta releases and future work.

    Git and Subversion access to the latest version of SWIG is also available. More information about this can be obtained at:

    1.5 Prerequisites

    This manual assumes that you know how to write C/C++ programs and that you have at least heard of scripting languages such as Tcl, Python, and Perl. A detailed knowledge of these scripting languages is not required although some familiarity won't hurt. No prior experience with building C extensions to these languages is required---after all, this is what SWIG does automatically. However, you should be reasonably familiar with the use of compilers, linkers, and makefiles since making scripting language extensions is somewhat more complicated than writing a normal C program.

    Over time SWIG releases have become significantly more capable in their C++ handling--especially support for advanced features like namespaces, overloaded operators, and templates. Whenever possible, this manual tries to cover the technicalities of this interface. However, this isn't meant to be a tutorial on C++ programming. For many of the gory details, you will almost certainly want to consult a good C++ reference. If you don't program in C++, you may just want to skip those parts of the manual.

    1.6 Organization of this manual

    The first few chapters of this manual describe SWIG in general and provide an overview of its capabilities. The remaining chapters are devoted to specific SWIG language modules and are self contained. Thus, if you are using SWIG to build Python interfaces, you can probably skip to that chapter and find almost everything you need to know.

    1.7 How to avoid reading the manual

    If you hate reading manuals, glance at the "Introduction" which contains a few simple examples. These examples contain about 95% of everything you need to know to use SWIG. After that, simply use the language-specific chapters as a reference. The SWIG distribution also comes with a large directory of examples that illustrate different topics.

    1.8 Backwards compatibility

    If you are a previous user of SWIG, don't expect SWIG to provide complete backwards compatibility. Although the developers strive to the utmost to keep backwards compatibility, this isn't always possible as the primary goal over time is to make SWIG better---a process that would simply be impossible if the developers are constantly bogged down with backwards compatibility issues. Potential incompatibilities are clearly marked in the detailed release notes.

    If you need to work with different versions of SWIG and backwards compatibility is an issue, you can use the SWIG_VERSION preprocessor symbol which holds the version of SWIG being executed. SWIG_VERSION is a hexadecimal integer such as 0x010311 (corresponding to SWIG-1.3.11). This can be used in an interface file to define different typemaps, take advantage of different features etc:

    #if SWIG_VERSION >= 0x010311
    /* Use some fancy new feature */
    #endif
    

    Note: The version symbol is not defined in the generated SWIG wrapper file. The SWIG preprocessor has defined SWIG_VERSION since SWIG-1.3.11.

    1.9 Release notes

    The CHANGES.current, CHANGES and RELEASENOTES files shipped with SWIG in the top level directory contain, respectively, detailed release notes for the current version, detailed release notes for previous releases and summary release notes from SWIG-1.3.22 onwards.

    1.10 Credits

    SWIG is an unfunded project that would not be possible without the contributions of many people working in their spare time. If you have benefitted from using SWIG, please consider Donating to SWIG to keep development going. There have been a large varied number of people who have made contributions at all levels over time. Contributors are mentioned either in the COPYRIGHT file or CHANGES files shipped with SWIG or in submitted bugs.

    1.11 Bug reports

    Although every attempt has been made to make SWIG bug-free, we are also trying to make feature improvements that may introduce bugs. To report a bug, either send mail to the SWIG developer list at the swig-devel mailing list or report a bug at the SWIG bug tracker. In your report, be as specific as possible, including (if applicable), error messages, tracebacks (if a core dump occurred), corresponding portions of the SWIG interface file used, and any important pieces of the SWIG generated wrapper code. We can only fix bugs if we know about them.

    1.12 Installation

    1.12.1 Windows installation

    Please see the dedicated Windows chapter for instructions on installing SWIG on Windows and running the examples. The Windows distribution is called swigwin and includes a prebuilt SWIG executable, swig.exe, included in the top level directory. Otherwise it is exactly the same as the main SWIG distribution. There is no need to download anything else.

    1.12.2 Unix installation

    These installation instructions are for using the distributed tarball, for example, swig-3.0.8.tar.gz. If you wish to build and install from source on Github, extra steps are required. Please see the Bleeding Edge page on the SWIG website.

    You must use GNU make to build and install SWIG.

    PCRE needs to be installed on your system to build SWIG, in particular pcre-config must be available. If you have PCRE headers and libraries but not pcre-config itself or, alternatively, wish to override the compiler or linker flags returned by pcre-config, you may set PCRE_LIBS and PCRE_CFLAGS variables to be used instead. And if you don't have PCRE at all, the configure script will provide instructions for obtaining it.

    To build and install SWIG, simply type the following:

    $ ./configure
    $ make
    $ make install
    

    By default SWIG installs itself in /usr/local. If you need to install SWIG in a different location or in your home directory, use the --prefix option to ./configure. For example:

    $ ./configure --prefix=/home/yourname/projects
    $ make
    $ make install
    

    Note: the directory given to --prefix must be an absolute pathname. Do not use the ~ shell-escape to refer to your home directory. SWIG won't work properly if you do this.

    The INSTALL file shipped in the top level directory details more about using configure. Also try

    $ ./configure --help.
    

    The configure script will attempt to locate various packages on your machine including Tcl, Perl5, Python and all the other target languages that SWIG supports. Don't panic if you get 'not found' messages -- SWIG does not need these packages to compile or run. The configure script is actually looking for these packages so that you can try out the SWIG examples contained in the 'Examples' directory without having to hack Makefiles. Note that the --without-xxx options, where xxx is a target language, have minimal effect. All they do is reduce the amount of testing done with 'make check'. The SWIG executable and library files installed cannot currently be configured with a subset of target languages.

    SWIG used to include a set of runtime libraries for some languages for working with multiple modules. These are no longer built during the installation stage. However, users can build them just like any wrapper module as described in the Modules chapter. The CHANGES file shipped with SWIG in the top level directory also lists some examples which build the runtime library.

    Note:

    • If you checked the code out via Git, you will have to run ./autogen.sh before ./configure. In addition, a full build of SWIG requires a number of packages to be installed. Full instructions at SWIG bleeding edge.

    1.12.3 Macintosh OS X installation

    SWIG is known to work on various flavors of OS X. Follow the Unix installation instructions above. However, as of this writing, there is still great deal of inconsistency with how shared libaries are handled by various scripting languages on OS X.

    Users of OS X should be aware that Darwin handles shared libraries and linking in a radically different way than most Unix systems. In order to test SWIG and run the examples, SWIG configures itself to use flat namespaces and to allow undefined symbols (-flat_namespace -undefined suppress). This mostly closely follows the Unix model and makes it more likely that the SWIG examples will work with whatever installation of software you might have. However, this is generally not the recommended technique for building larger extension modules. Instead, you should utilize Darwin's two-level namespaces. Some details about this can be found here Understanding Two-Level Namespaces.

    Needless to say, you might have to experiment a bit to get things working at first.

    1.12.4 Testing

    If you want to test SWIG after building it, a check can be performed on Unix operating systems. Type the following:

        $ make -k check
    

    This step can be performed either before or after installation. The check requires at least one of the target languages to be installed. If it fails, it may mean that you have an uninstalled language module or that the file 'Examples/Makefile' has been incorrectly configured. It may also fail due to compiler issues such as a broken C++ compiler. Even if the check fails, there is a pretty good chance SWIG still works correctly --- you will just have to mess around with one of the examples and some makefiles to get it to work. Some tests may also fail due to missing dependency packages, eg PCRE or Boost, but this will require careful analysis of the configure output done during configuration.

    The test suite executed by the check is designed to stress-test many parts of the implementation including obscure corner cases. If some of these tests fail or generate warning messages, there is no reason for alarm --- the test may be related to some new SWIG feature or a difficult bug that we're trying to resolve. Chances are that SWIG will work just fine for you. Note that if you have more than one CPU/core, then you can use parallel make to speed up the check as it does take quite some time to run, for example:

        $ make -j2 -k check
    

    Also, SWIG's support for C++ is sufficiently advanced that certain tests may fail on older C++ compilers (for instance if your compiler does not support member templates). These errors are harmless if you don't intend to use these features in your own programs.

    Note: The test-suite currently contains over 500 tests. If you have many different target languages installed and a slow machine, it might take more than an hour to run the test-suite.

    1.12.5 Examples

    The Examples directory contains a variety of examples of using SWIG and it has some browsable documentation. Simply point your browser to the file "Example/index.html".

    The Examples directory also includes Visual C++ project 6 (.dsp) files for building some of the examples on Windows. Later versions of Visual Studio will convert these old style project files into a current solution file.


    2 Introduction

    2.1 What is SWIG?

    SWIG is a software development tool that simplifies the task of interfacing different languages to C and C++ programs. In a nutshell, SWIG is a compiler that takes C/C++ declarations and creates the wrappers needed to access those declarations from other languages including Perl, Python, Tcl, Ruby, Guile, and Java. SWIG normally requires no modifications to existing code and can often be used to build a usable interface in only a few minutes. Possible applications of SWIG include:

    • Building interpreted interfaces to existing C programs.
    • Rapid prototyping and application development.
    • Interactive debugging.
    • Reengineering or refactoring of legacy software into scripting language components.
    • Making a graphical user interface (using Tk for example).
    • Testing of C libraries and programs (using scripts).
    • Building high performance C modules for scripting languages.
    • Making C programming more enjoyable (or tolerable depending on your point of view).
    • Impressing your friends.
    • Obtaining vast sums of research funding (although obviously not applicable to the author).

    SWIG was originally designed to make it extremely easy for scientists and engineers to build extensible scientific software without having to get a degree in software engineering. Because of this, the use of SWIG tends to be somewhat informal and ad-hoc (e.g., SWIG does not require users to provide formal interface specifications as you would find in a dedicated IDL compiler). Although this style of development isn't appropriate for every project, it is particularly well suited to software development in the small; especially the research and development work that is commonly found in scientific and engineering projects. However, nowadays SWIG is known to be used in many large open source and commercial projects.

    2.2 Why use SWIG?

    As stated in the previous section, the primary purpose of SWIG is to simplify the task of integrating C/C++ with other programming languages. However, why would anyone want to do that? To answer that question, it is useful to list a few strengths of C/C++ programming:

    • Excellent support for writing programming libraries.
    • High performance (number crunching, data processing, graphics, etc.).
    • Systems programming and systems integration.
    • Large user community and software base.

    Next, let's list a few problems with C/C++ programming

    • Writing a user interface is rather painful (i.e., consider programming with MFC, X11, GTK, or any number of other libraries).
    • Testing is time consuming (the compile/debug cycle).
    • Not easy to reconfigure or customize without recompilation.
    • Modularization can be tricky.
    • Security concerns (buffer overflows for instance).

    To address these limitations, many programmers have arrived at the conclusion that it is much easier to use different programming languages for different tasks. For instance, writing a graphical user interface may be significantly easier in a scripting language like Python or Tcl (consider the reasons why millions of programmers have used languages like Visual Basic if you need more proof). An interactive interpreter might also serve as a useful debugging and testing tool. Other languages like Java might greatly simplify the task of writing distributed computing software. The key point is that different programming languages offer different strengths and weaknesses. Moreover, it is extremely unlikely that any programming is ever going to be perfect. Therefore, by combining languages together, you can utilize the best features of each language and greatly simplify certain aspects of software development.

    From the standpoint of C/C++, a lot of people use SWIG because they want to break out of the traditional monolithic C programming model which usually results in programs that resemble this:

    • A collection of functions and variables that do something useful.
    • A main() program that starts everything.
    • A horrible collection of hacks that form some kind of user interface (but which no-one really wants to touch).

    Instead of going down that route, incorporating C/C++ into a higher level language often results in a more modular design, less code, better flexibility, and increased programmer productivity.

    SWIG tries to make the problem of C/C++ integration as painless as possible. This allows you to focus on the underlying C program and using the high-level language interface, but not the tedious and complex chore of making the two languages talk to each other. At the same time, SWIG recognizes that all applications are different. Therefore, it provides a wide variety of customization features that let you change almost every aspect of the language bindings. This is the main reason why SWIG has such a large user manual ;-).

    2.3 A SWIG example

    The best way to illustrate SWIG is with a simple example. Consider the following C code:

    /* File : example.c */
    
    double  My_variable  = 3.0;
    
    /* Compute factorial of n */
    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    
    /* Compute n mod m */
    int my_mod(int n, int m) {
      return(n % m);
    }
    

    Suppose that you wanted to access these functions and the global variable My_variable from Tcl. You start by making a SWIG interface file as shown below (by convention, these files carry a .i suffix) :

    2.3.1 SWIG interface file

    /* File : example.i */
    %module example
    %{
    /* Put headers and other declarations here */
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    %}
    
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    

    The interface file contains ANSI C function prototypes and variable declarations. The %module directive defines the name of the module that will be created by SWIG. The %{ %} block provides a location for inserting additional code, such as C header files or additional C declarations, into the generated C wrapper code.

    2.3.2 The swig command

    SWIG is invoked using the swig command. We can use this to build a Tcl module (under Linux) as follows :

    unix > swig -tcl example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include
    unix > gcc -shared example.o example_wrap.o -o example.so
    unix > tclsh
    % load ./example.so
    % fact 4
    24
    % my_mod 23 7
    2
    % expr $My_variable + 4.5
    7.5
    %
    

    The swig command produced a new file called example_wrap.c that should be compiled along with the example.c file. Most operating systems and scripting languages now support dynamic loading of modules. In our example, our Tcl module has been compiled into a shared library that can be loaded into Tcl. When loaded, Tcl can now access the functions and variables declared in the SWIG interface. A look at the file example_wrap.c reveals a hideous mess. However, you almost never need to worry about it.

    2.3.3 Building a Perl5 module

    Now, let's turn these functions into a Perl5 module. Without making any changes type the following (shown for Solaris):

    unix > swig -perl5 example.i
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so # This is for Solaris
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    unix >
    

    2.3.4 Building a Python module

    Finally, let's build a module for Python (shown for Irix).

    unix > swig -python example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.0
    unix > gcc -shared example.o example_wrap.o -o _example.so
    unix > python
    Python 2.0 (#6, Feb 21 2001, 13:29:45)
    [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
    Type "copyright", "credits" or "license" for more information.     
    >>> import example
    >>> example.fact(4)
    24
    >>> example.my_mod(23, 7)
    2
    >>> example.cvar.My_variable + 4.5
    7.5
    

    2.3.5 Shortcuts

    To the truly lazy programmer, one may wonder why we needed the extra interface file at all. As it turns out, you can often do without it. For example, you could also build a Perl5 module by just running SWIG on the C header file and specifying a module name as follows

    unix > swig -perl5 -module example example.h
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    

    2.4 Supported C/C++ language features

    A primary goal of the SWIG project is to make the language binding process extremely easy. Although a few simple examples have been shown, SWIG is quite capable in supporting most of C++. Some of the major features include:

    • Full C99 preprocessing.
    • All ANSI C and C++ datatypes.
    • Functions, variables, and constants.
    • Classes.
    • Single and multiple inheritance.
    • Overloaded functions and methods.
    • Overloaded operators.
    • C++ templates (including member templates, specialization, and partial specialization).
    • Namespaces.
    • Variable length arguments.
    • C++ smart pointers.

    Most of C++11 is also supported. Details are in the C++11 section.

    It is important to stress that SWIG is not a simplistic C++ lexing tool like several apparently similar wrapper generation tools. SWIG not only parses C++, it implements the full C++ type system and it is able to understand C++ semantics. SWIG generates its wrappers with full knowledge of this information. As a result, you will find SWIG to be just as capable of dealing with nasty corner cases as it is in wrapping simple C++ code. In fact, SWIG is able to handle C++ code that stresses the very limits of many C++ compilers.

    2.5 Non-intrusive interface building

    When used as intended, SWIG requires minimal (if any) modification to existing C or C++ code. This makes SWIG extremely easy to use with existing packages and promotes software reuse and modularity. By making the C/C++ code independent of the high level interface, you can change the interface and reuse the code in other applications. It is also possible to support different types of interfaces depending on the application.

    2.6 Incorporating SWIG into a build system

    SWIG is a command line tool and as such can be incorporated into any build system that supports invoking external tools/compilers. SWIG is most commonly invoked from within a Makefile, but is also known to be invoked from popular IDEs such as Microsoft Visual Studio.

    If you are using the GNU Autotools ( Autoconf/ Automake / Libtool) to configure SWIG use in your project, the SWIG Autoconf macros can be used. The primary macro is ax_pkg_swig, see http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig . The ax_python_devel macro is also helpful for generating Python extensions. See the Autoconf Archive for further information on this and other Autoconf macros.

    There is growing support for SWIG in some build tools, for example CMake is a cross-platform, open-source build manager with built in support for SWIG. CMake can detect the SWIG executable and many of the target language libraries for linking against. CMake knows how to build shared libraries and loadable modules on many different operating systems. This allows easy cross platform SWIG development. It can also generate the custom commands necessary for driving SWIG from IDEs and makefiles. All of this can be done from a single cross platform input file. The following example is a CMake input file for creating a python wrapper for the SWIG interface file, example.i:

    
    # This is a CMake example for Python
    
    FIND_PACKAGE(SWIG REQUIRED)
    INCLUDE(${SWIG_USE_FILE})
    
    FIND_PACKAGE(PythonLibs)
    INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
    
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
    
    SET(CMAKE_SWIG_FLAGS "")
    
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-includeall")
    SWIG_ADD_MODULE(example python example.i example.cxx)
    SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})
    
    

    The above example will generate native build files such as makefiles, nmake files and Visual Studio projects which will invoke SWIG and compile the generated C++ files into _example.so (UNIX) or _example.pyd (Windows). For other target languages on Windows a dll, instead of a .pyd file, is usually generated.

    2.7 Hands off code generation

    SWIG is designed to produce working code that needs no hand-modification (in fact, if you look at the output, you probably won't want to modify it). You should think of your target language interface being defined entirely by the input to SWIG, not the resulting output file. While this approach may limit flexibility for hard-core hackers, it allows others to forget about the low-level implementation details.

    2.8 SWIG and freedom

    No, this isn't a special section on the sorry state of world politics. However, it may be useful to know that SWIG was written with a certain "philosophy" about programming---namely that programmers are smart and that tools should just stay out of their way. Because of that, you will find that SWIG is extremely permissive in what it lets you get away with. In fact, you can use SWIG to go well beyond "shooting yourself in the foot" if dangerous programming is your goal. On the other hand, this kind of freedom may be exactly what is needed to work with complicated and unusual C/C++ applications.

    Ironically, the freedom that SWIG provides is countered by an extremely conservative approach to code generation. At its core, SWIG tries to distill even the most advanced C++ code down to a small well-defined set of interface building techniques based on ANSI C programming. Because of this, you will find that SWIG interfaces can be easily compiled by virtually every C/C++ compiler and that they can be used on any platform. Again, this is an important part of staying out of the programmer's way----the last thing any developer wants to do is to spend their time debugging the output of a tool that relies on non-portable or unreliable programming features. Dependencies are often a source of incompatibilities and problems and so additional third party libraries are not used in the generated code. SWIG will also generally avoid generating code that introduces a dependency on the C++ Standard Template Library (STL). SWIG will generate code that depends on the C libraries though.


    3 Getting started on Windows

    This chapter describes SWIG usage on Microsoft Windows. Installing SWIG and running the examples is covered as well as building the SWIG executable. Usage within the Unix like environments MinGW and Cygwin is also detailed.

    3.1 Installation on Windows

    SWIG does not come with the usual Windows type installation program, however it is quite easy to get started. The main steps are:

    • Download the swigwin zip package from the SWIG website and unzip into a directory. This is all that needs downloading for the Windows platform.
    • Set environment variables as described in the SWIG Windows Examples section in order to run examples using Visual C++.

    3.1.1 Windows Executable

    The swigwin distribution contains the SWIG Windows executable, swig.exe, which will run on 32 bit versions of Windows, ie Windows 95 and later. If you want to build your own swig.exe have a look at Building swig.exe on Windows.

    3.2 SWIG Windows Examples

    Using Microsoft Visual C++ is the most common approach to compiling and linking SWIG's output. The Examples directory has a few Visual C++ project files (.dsp files). These were produced by Visual C++ 6. Newer versions of Visual Studio should be able to open and convert these project files. Each C# example comes with a Visual Studio 2005 solution and associated project files instead of Visual C++ 6 project files. The project files have been set up to execute SWIG in a custom build rule for the SWIG interface (.i) file. Alternatively run the examples using Cygwin.

    More information on each of the examples is available with the examples distributed with SWIG (Examples/index.html).

    3.2.1 Instructions for using the Examples with Visual Studio

    Ensure the SWIG executable is as supplied in the SWIG root directory in order for the examples to work. Most languages require some environment variables to be set before running Visual C++. Note that Visual C++ must be re-started to pick up any changes in environment variables. Open up an example .dsp file, Visual C++ will create a workspace for you (.dsw file). Ensure the Release build is selected then do a Rebuild All from the Build menu. The required environment variables are displayed with their current values.

    The list of required environment variables for each module language is also listed below. They are usually set from the Control Panel and System properties, but this depends on which flavour of Windows you are running. If you don't want to use environment variables then change all occurrences of the environment variables in the .dsp files with hard coded values. If you are interested in how the project files are set up there is explanatory information in some of the language module's documentation.

    3.2.1.1 C#

    The C# examples do not require any environment variables to be set as a C# project file is included. Just open up the .sln solution file in Visual Studio .NET 2003 or later, select Release Build, and do a Rebuild All from the Build menu. The accompanying C# and C++ project files are automatically used by the solution file.

    3.2.1.2 Java

    JAVA_INCLUDE : Set this to the directory containing jni.h
    JAVA_BIN : Set this to the bin directory containing javac.exe

    Example using JDK1.3:
    JAVA_INCLUDE: D:\jdk1.3\include
    JAVA_BIN: D:\jdk1.3\bin

    3.2.1.3 Perl

    PERL5_INCLUDE : Set this to the directory containing perl.h
    PERL5_LIB : Set this to the Perl library including path for linking

    Example using nsPerl 5.004_04:

    PERL5_INCLUDE: D:\nsPerl5.004_04\lib\CORE
    PERL5_LIB: D:\nsPerl5.004_04\lib\CORE\perl.lib

    3.2.1.4 Python

    PYTHON_INCLUDE : Set this to the directory that contains Python.h
    PYTHON_LIB : Set this to the python library including path for linking

    Example using Python 2.1.1:
    PYTHON_INCLUDE: D:\python21\include
    PYTHON_LIB: D:\python21\libs\python21.lib

    3.2.1.5 TCL

    TCL_INCLUDE : Set this to the directory containing tcl.h
    TCL_LIB : Set this to the TCL library including path for linking

    Example using ActiveTcl 8.3.3.3
    TCL_INCLUDE: D:\tcl\include
    TCL_LIB: D:\tcl\lib\tcl83.lib

    3.2.1.6 R

    R_INCLUDE : Set this to the directory containing R.h
    R_LIB : Set this to the R library (Rdll.lib) including path for linking. The library needs to be built as described in the R README.packages file (the pexports.exe approach is the easiest).

    Example using R 2.5.1:
    R_INCLUDE: C:\Program Files\R\R-2.5.1\include
    R_LIB: C:\Program Files\R\R-2.5.1\bin\Rdll.lib

    3.2.1.7 Ruby

    RUBY_INCLUDE : Set this to the directory containing ruby.h
    RUBY_LIB : Set this to the ruby library including path for linking

    Example using Ruby 1.6.4:
    RUBY_INCLUDE: D:\ruby\lib\ruby\1.6\i586-mswin32
    RUBY_LIB: D:\ruby\lib\mswin32-ruby16.lib

    3.2.2 Instructions for using the Examples with other compilers

    If you do not have access to Visual C++ you will have to set up project files / Makefiles for your chosen compiler. There is a section in each of the language modules detailing what needs setting up using Visual C++ which may be of some guidance. Alternatively you may want to use Cygwin as described in the following section.

    3.3 SWIG on Cygwin and MinGW

    SWIG can also be compiled and run using Cygwin or MinGW which provides a Unix like front end to Windows and comes free with gcc, an ANSI C/C++ compiler. However, this is not a recommended approach as the prebuilt executable is supplied.

    3.3.1 Building swig.exe on Windows

    If you want to replicate the build of swig.exe that comes with the download, follow the MinGW instructions below. This is not necessary to use the supplied swig.exe. This information is provided for those that want to modify the SWIG source code in a Windows environment. Normally this is not needed, so most people will want to ignore this section.

    3.3.1.1 Building swig.exe using MinGW and MSYS

    The short abbreviated instructions follow...

    • Install MinGW and MSYS from the MinGW site. This provides a Unix environment on Windows.
    • Follow the usual Unix instructions in the README file in the SWIG root directory to build swig.exe from the MinGW command prompt.

    The step by step instructions to download and install MinGW and MSYS, then download and build the latest version of SWIG from Github follow... Note that the instructions for obtaining SWIG from Github are also online at SWIG Bleeding Edge.

    Pitfall note: Execute the steps in the order shown and don't use spaces in path names. In fact it is best to use the default installation directories.

    1. Download the following packages from the MinGW download page or MinGW SourceForge download page. Note that at the time of writing, the majority of these are in the Current release list and some are in the Snapshot or Previous release list.
      • MinGW-3.1.0-1.exe
      • MSYS-1.0.11-2004.04.30-1.exe
      • msysDTK-1.0.1.exe
      • bison-2.0-MSYS.tar.gz
      • msys-autoconf-2.59.tar.bz2
      • msys-automake-1.8.2.tar.bz2
    2. Install MinGW-3.1.0-1.exe (C:\MinGW is default location.)
    3. Install MSYS-1.0.11-2004.04.30-1.exe. Make sure you install it on the same windows drive letter as MinGW (C:\msys\1.0 is default). In the post install script,
      • Answer y to the "do you wish to continue with the post install?"
      • Answer y to the "do you have MinGW installed?"
      • Type in the folder in which you installed MinGW (C:/MinGW is default)
    4. Install msysDTK-1.0.1.exe to the same folder that you installed MSYS (C:\msys\1.0 is default).
    5. Copy the following to the MSYS install folder (C:\msys\1.0 is default):
      • msys-automake-1.8.2.tar.bz2
      • msys-autoconf-2.59.tar.bz2
      • bison-2.0-MSYS.tar.gz
    6. Start the MSYS command prompt and execute:
      cd /
      tar -jxf msys-automake-1.8.2.tar.bz2
      tar -jxf msys-autoconf-2.59.tar.bz2
      tar -zxf bison-2.0-MSYS.tar.gz
      
    7. The very latest development version of SWIG is available from SWIG on Github and can be downloaded as a zip file or if you have Git installed, via Git. Either download the latest Zip file snapshot and unzip and rename the top level folder to /usr/src/swig. Otherwise if using Git, type in the following:
      mkdir /usr/src
      cd /usr/src
      git clone https://github.com/swig/swig.git
      
      Pitfall note: If you want to place SWIG in a different folder to the proposed /usr/src/swig, do not use MSYS emulated windows drive letters, because the autotools will fail miserably on those.
    8. The PCRE third party library needs to be built next. Download the latest PCRE source tarball, such as pcre-8.10.tar.bz2, from PCRE and place in the /usr/src/swig directory. Build PCRE as a static library using the Tools/pcre-build.sh script as follows:
      cd /usr/src/swig
      Tools/pcre-build.sh
      
    9. You are now ready to build SWIG. Execute the following commands to build swig.exe:
      cd /usr/src/swig
      ./autogen.sh
      ./configure
      make
      

    3.3.1.2 Building swig.exe using Cygwin

    Note that SWIG can also be built using Cygwin. However, SWIG will then require the Cygwin DLL when executing. Follow the Unix instructions in the README file in the SWIG root directory. Note that the Cygwin environment will also allow one to regenerate the autotool generated files which are supplied with the release distribution. These files are generated using the autogen.sh script and will only need regenerating in circumstances such as changing the build system.

    3.3.1.3 Building swig.exe alternatives

    If you don't want to install Cygwin or MinGW, use a different compiler to build SWIG. For example, all the source code files can be added to a Visual C++ project file in order to build swig.exe from the Visual C++ IDE.

    3.3.2 Running the examples on Windows using Cygwin

    The examples and test-suite work as successfully on Cygwin as on any other Unix operating system. The modules which are known to work are Python, Tcl, Perl, Ruby, Java and C#. Follow the Unix instructions in the README file in the SWIG root directory to build the examples.

    3.4 Microsoft extensions and other Windows quirks

    A common problem when using SWIG on Windows are the Microsoft function calling conventions which are not in the C++ standard. SWIG parses ISO C/C++ so cannot deal with proprietary conventions such as __declspec(dllimport), __stdcall etc. There is a Windows interface file, windows.i, to deal with these calling conventions though. The file also contains typemaps for handling commonly used Windows specific types such as __int64, BOOL , DWORD etc. Include it like you would any other interface file, for example:

    %include <windows.i>
    
    __declspec(dllexport) ULONG __stdcall foo(DWORD, __int32);
    

    Note that if you follow Microsoft's recommendation of wrapping the __declspec calls in a preprocessor definition, you will need to make sure that the definition is included by SWIG as well, by either defining it manually or via a header. For example, if you have specified the preprocessor definition in a header named export_lib.h and include other headers which depend on it, you should use the %include directive to include the definition explicitly. For example, if you had a header file, bar.h, which depended on export_lib.h, your SWIG definition file might look like:

    // bar.i
    %module bar
    %include <windows.i>
    %include "export_lib.h"
    %include "bar.h"
    

    where export_lib.h may contain:

    // export_lib.h
    #define BAR_API __declspec(dllexport)
    

    and bar.h may look like:

    // bar.h
    #include "export_lib.h"
    BAR_API void bar_function(int, double);
    

    Using the preprocessor to remove BAR_API is a popular simpler solution:

    // bar.i
    %module bar
    #define BAR_API
    %include "bar.h"
    

    4 Scripting Languages

    This chapter provides a brief overview of scripting language extension programming and the mechanisms by which scripting language interpreters access C and C++ code.

    4.1 The two language view of the world

    When a scripting language is used to control a C program, the resulting system tends to look as follows:

    Scripting language input - C/C++ functions output

    In this programming model, the scripting language interpreter is used for high level control whereas the underlying functionality of the C/C++ program is accessed through special scripting language "commands." If you have ever tried to write your own simple command interpreter, you might view the scripting language approach to be a highly advanced implementation of that. Likewise, If you have ever used a package such as MATLAB or IDL, it is a very similar model--the interpreter executes user commands and scripts. However, most of the underlying functionality is written in a low-level language like C or Fortran.

    The two-language model of computing is extremely powerful because it exploits the strengths of each language. C/C++ can be used for maximal performance and complicated systems programming tasks. Scripting languages can be used for rapid prototyping, interactive debugging, scripting, and access to high-level data structures such associative arrays.

    4.2 How does a scripting language talk to C?

    Scripting languages are built around a parser that knows how to execute commands and scripts. Within this parser, there is a mechanism for executing commands and accessing variables. Normally, this is used to implement the builtin features of the language. However, by extending the interpreter, it is usually possible to add new commands and variables. To do this, most languages define a special API for adding new commands. Furthermore, a special foreign function interface defines how these new commands are supposed to hook into the interpreter.

    Typically, when you add a new command to a scripting interpreter you need to do two things; first you need to write a special "wrapper" function that serves as the glue between the interpreter and the underlying C function. Then you need to give the interpreter information about the wrapper by providing details about the name of the function, arguments, and so forth. The next few sections illustrate the process.

    4.2.1 Wrapper functions

    Suppose you have an ordinary C function like this :

    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    

    In order to access this function from a scripting language, it is necessary to write a special "wrapper" function that serves as the glue between the scripting language and the underlying C function. A wrapper function must do three things :

    • Gather function arguments and make sure they are valid.
    • Call the C function.
    • Convert the return value into a form recognized by the scripting language.

    As an example, the Tcl wrapper function for the fact() function above example might look like the following :

    int wrap_fact(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
      int result;
      int arg0;
      if (argc != 2) {
        interp->result = "wrong # args";
        return TCL_ERROR;
      }
      arg0 = atoi(argv[1]);
      result = fact(arg0);
      sprintf(interp->result, "%d", result);
      return TCL_OK;
    }
    
    

    Once you have created a wrapper function, the final step is to tell the scripting language about the new function. This is usually done in an initialization function called by the language when the module is loaded. For example, adding the above function to the Tcl interpreter requires code like the following :

    int Wrap_Init(Tcl_Interp *interp) {
      Tcl_CreateCommand(interp, "fact", wrap_fact, (ClientData) NULL,
                        (Tcl_CmdDeleteProc *) NULL);
      return TCL_OK;
    }
    

    When executed, Tcl will now have a new command called "fact " that you can use like any other Tcl command.

    Although the process of adding a new function to Tcl has been illustrated, the procedure is almost identical for Perl and Python. Both require special wrappers to be written and both need additional initialization code. Only the specific details are different.

    4.2.2 Variable linking

    Variable linking refers to the problem of mapping a C/C++ global variable to a variable in the scripting language interpreter. For example, suppose you had the following variable:

    double Foo = 3.5;
    

    It might be nice to access it from a script as follows (shown for Perl):

    $a = $Foo * 2.3;   # Evaluation
    $Foo = $a + 2.0;   # Assignment
    

    To provide such access, variables are commonly manipulated using a pair of get/set functions. For example, whenever the value of a variable is read, a "get" function is invoked. Similarly, whenever the value of a variable is changed, a "set" function is called.

    In many languages, calls to the get/set functions can be attached to evaluation and assignment operators. Therefore, evaluating a variable such as $Foo might implicitly call the get function. Similarly, typing $Foo = 4 would call the underlying set function to change the value.

    4.2.3 Constants

    In many cases, a C program or library may define a large collection of constants. For example:

    #define RED   0xff0000
    #define BLUE  0x0000ff
    #define GREEN 0x00ff00
    

    To make constants available, their values can be stored in scripting language variables such as $RED, $BLUE, and $GREEN. Virtually all scripting languages provide C functions for creating variables so installing constants is usually a trivial exercise.

    4.2.4 Structures and classes

    Although scripting languages have no trouble accessing simple functions and variables, accessing C/C++ structures and classes present a different problem. This is because the implementation of structures is largely related to the problem of data representation and layout. Furthermore, certain language features are difficult to map to an interpreter. For instance, what does C++ inheritance mean in a Perl interface?

    The most straightforward technique for handling structures is to implement a collection of accessor functions that hide the underlying representation of a structure. For example,

    struct Vector {
      Vector();
      ~Vector();
      double x, y, z;
    };
    
    

    can be transformed into the following set of functions :

    Vector *new_Vector();
    void delete_Vector(Vector *v);
    double Vector_x_get(Vector *v);
    double Vector_y_get(Vector *v);
    double Vector_z_get(Vector *v);
    void Vector_x_set(Vector *v, double x);
    void Vector_y_set(Vector *v, double y);
    void Vector_z_set(Vector *v, double z);
    
    

    Now, from an interpreter these function might be used as follows:

    % set v [new_Vector]
    % Vector_x_set $v 3.5
    % Vector_y_get $v
    % delete_Vector $v
    % ...
    

    Since accessor functions provide a mechanism for accessing the internals of an object, the interpreter does not need to know anything about the actual representation of a Vector.

    4.2.5 Proxy classes

    In certain cases, it is possible to use the low-level accessor functions to create a proxy class, also known as a shadow class. A proxy class is a special kind of object that gets created in a scripting language to access a C/C++ class (or struct) in a way that looks like the original structure (that is, it proxies the real C++ class). For example, if you have the following C++ definition :

    class Vector {
    public:
      Vector();
      ~Vector();
      double x, y, z;
    };
    

    A proxy classing mechanism would allow you to access the structure in a more natural manner from the interpreter. For example, in Python, you might want to do this:

    >>> v = Vector()
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = -13
    >>> ...
    >>> del v
    

    Similarly, in Perl5 you may want the interface to work like this:

    $v = new Vector;
    $v->{x} = 3;
    $v->{y} = 4;
    $v->{z} = -13;
    
    

    Finally, in Tcl :

    Vector v
    v configure -x 3 -y 4 -z -13
    
    

    When proxy classes are used, two objects are really at work--one in the scripting language, and an underlying C/C++ object. Operations affect both objects equally and for all practical purposes, it appears as if you are simply manipulating a C/C++ object.

    4.3 Building scripting language extensions

    The final step in using a scripting language with your C/C++ application is adding your extensions to the scripting language itself. There are two primary approaches for doing this. The preferred technique is to build a dynamically loadable extension in the form of a shared library. Alternatively, you can recompile the scripting language interpreter with your extensions added to it.

    4.3.1 Shared libraries and dynamic loading

    To create a shared library or DLL, you often need to look at the manual pages for your compiler and linker. However, the procedure for a few common platforms is shown below:

    # Build a shared library for Solaris
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    ld -G example.o example_wrap.o -o example.so
    
    # Build a shared library for Linux
    gcc -fpic -c example.c example_wrap.c -I/usr/local/include
    gcc -shared example.o example_wrap.o -o example.so
    

    To use your shared library, you simply use the corresponding command in the scripting language (load, import, use, etc...). This will import your module and allow you to start using it. For example:

    % load ./example.so
    % fact 4
    24
    %
    

    When working with C++ codes, the process of building shared libraries may be more complicated--primarily due to the fact that C++ modules may need additional code in order to operate correctly. On many machines, you can build a shared C++ module by following the above procedures, but changing the link line to the following :

    c++ -shared example.o example_wrap.o -o example.so
    

    4.3.2 Linking with shared libraries

    When building extensions as shared libraries, it is not uncommon for your extension to rely upon other shared libraries on your machine. In order for the extension to work, it needs to be able to find all of these libraries at run-time. Otherwise, you may get an error such as the following :

    >>> import graph
    Traceback (innermost last):
      File "<stdin>", line 1, in ?
      File "/home/sci/data1/beazley/graph/graph.py", line 2, in ?
        import graphc
    ImportError:  1101:/home/sci/data1/beazley/bin/python: rld: Fatal Error: cannot 
    successfully map soname 'libgraph.so' under any of the filenames /usr/lib/libgraph.so:/
    lib/libgraph.so:/lib/cmplrs/cc/libgraph.so:/usr/lib/cmplrs/cc/libgraph.so:
    >>>
    

    What this error means is that the extension module created by SWIG depends upon a shared library called "libgraph.so" that the system was unable to locate. To fix this problem, there are a few approaches you can take.

    • Link your extension and explicitly tell the linker where the required libraries are located. Often times, this can be done with a special linker flag such as -R, -rpath, etc. This is not implemented in a standard manner so read the man pages for your linker to find out more about how to set the search path for shared libraries.
    • Put shared libraries in the same directory as the executable. This technique is sometimes required for correct operation on non-Unix platforms.
    • Set the UNIX environment variable LD_LIBRARY_PATH to the directory where shared libraries are located before running Python. Although this is an easy solution, it is not recommended. Consider setting the path using linker options instead.

    4.3.3 Static linking

    With static linking, you rebuild the scripting language interpreter with extensions. The process usually involves compiling a short main program that adds your customized commands to the language and starts the interpreter. You then link your program with a library to produce a new scripting language executable.

    Although static linking is supported on all platforms, this is not the preferred technique for building scripting language extensions. In fact, there are very few practical reasons for doing this--consider using shared libraries instead.


    5 SWIG Basics

    This chapter describes the basic operation of SWIG, the structure of its input files, and how it handles standard ANSI C declarations. C++ support is described in the next chapter. However, C++ programmers should still read this chapter to understand the basics. Specific details about each target language are described in later chapters.

    5.1 Running SWIG

    To run SWIG, use the swig command with options and a filename like this:

    swig [ options ] filename
    

    where filename is a SWIG interface file or a C/C++ header file. Below is a subset of options that can be used. Additional options are also defined for each target language. A full list can be obtained by typing swig -help or swig -<lang> -help for language <lang> specific options.

    -allegrocl            Generate ALLEGROCL wrappers
    -chicken              Generate CHICKEN wrappers
    -clisp                Generate CLISP wrappers
    -cffi                 Generate CFFI wrappers
    -csharp               Generate C# wrappers
    -d                    Generate D wrappers
    -go                   Generate Go wrappers
    -guile                Generate Guile wrappers
    -java                 Generate Java wrappers
    -javascript           Generate Javascript wrappers
    -lua                  Generate Lua wrappers
    -modula3              Generate Modula 3 wrappers
    -mzscheme             Generate Mzscheme wrappers
    -ocaml                Generate Ocaml wrappers
    -octave               Generate Octave wrappers
    -perl                 Generate Perl wrappers
    -php5                 Generate PHP5 wrappers
    -php7                 Generate PHP7 wrappers
    -pike                 Generate Pike wrappers
    -python               Generate Python wrappers
    -r                    Generate R (aka GNU S) wrappers
    -ruby                 Generate Ruby wrappers
    -scilab               Generate Scilab wrappers
    -sexp                 Generate Lisp S-Expressions wrappers
    -tcl                  Generate Tcl wrappers
    -uffi                 Generate Common Lisp / UFFI wrappers
    -xml                  Generate XML wrappers
    
    -c++                  Enable C++ processing
    -cppext ext           Change file extension of C++ generated files to ext
                          (default is cxx, except for PHP5 which uses cpp)
    -Dsymbol              Define a preprocessor symbol
    -Fmicrosoft           Display error/warning messages in Microsoft format
    -Fstandard            Display error/warning messages in commonly used format
    -help                 Display all options
    -Idir                 Add a directory to the file include path
    -lifile               Include SWIG library file <ifile>
    -module name          Set the name of the SWIG module
    -o outfile            Set name of C/C++ output file to <outfile>
    -oh headfile          Set name of C++ output header file for directors to <headfile>
    -outcurrentdir        Set default output dir to current dir instead of input file's path
    -outdir dir           Set language specific files output directory
    -pcreversion          Display PCRE version information
    -swiglib              Report location of SWIG library and exit
    -version              Display SWIG version number
    
    

    5.1.1 Input format

    As input, SWIG expects a file containing ANSI C/C++ declarations and special SWIG directives. More often than not, this is a special SWIG interface file which is usually denoted with a special .i or .swg suffix. In certain cases, SWIG can be used directly on raw header files or source files. However, this is not the most typical case and there are several reasons why you might not want to do this (described later).

    The most common format of a SWIG interface is as follows:

    %module mymodule 
    %{
    #include "myheader.h"
    %}
    // Now list ANSI C/C++ declarations
    int foo;
    int bar(int x);
    ...
    

    The module name is supplied using the special %module directive. Modules are described further in the Modules Introduction section.

    Everything in the %{ ... %} block is simply copied verbatim to the resulting wrapper file created by SWIG. This section is almost always used to include header files and other declarations that are required to make the generated wrapper code compile. It is important to emphasize that just because you include a declaration in a SWIG input file, that declaration does not automatically appear in the generated wrapper code---therefore you need to make sure you include the proper header files in the %{ ... %} section. It should be noted that the text enclosed in %{ ... %} is not parsed or interpreted by SWIG. The %{...%} syntax and semantics in SWIG is analogous to that of the declarations section used in input files to parser generation tools such as yacc or bison.

    5.1.2 SWIG Output

    The output of SWIG is a C/C++ file that contains all of the wrapper code needed to build an extension module. SWIG may generate some additional files depending on the target language. By default, an input file with the name file.i is transformed into a file file_wrap.c or file_wrap.cxx (depending on whether or not the -c++ option has been used). The name of the output C/C++ file can be changed using the -o option. In certain cases, file suffixes are used by the compiler to determine the source language (C, C++, etc.). Therefore, you have to use the -o option to change the suffix of the SWIG-generated wrapper file if you want something different than the default. For example:

    $ swig -c++ -python -o example_wrap.cpp example.i
    

    The C/C++ output file created by SWIG often contains everything that is needed to construct an extension module for the target scripting language. SWIG is not a stub compiler nor is it usually necessary to edit the output file (and if you look at the output, you probably won't want to). To build the final extension module, the SWIG output file is compiled and linked with the rest of your C/C++ program to create a shared library.

    For many target languages SWIG will also generate proxy class files in the target language. The default output directory for these language specific files is the same directory as the generated C/C++ file. This can be modified using the -outdir option. For example:

    $ swig -c++ -python -outdir pyfiles -o cppfiles/example_wrap.cpp example.i
    

    If the directories cppfiles and pyfiles exist, the following will be generated:

    cppfiles/example_wrap.cpp
    pyfiles/example.py
    

    If the -outcurrentdir option is used (without -o) then SWIG behaves like a typical C/C++ compiler and the default output directory is then the current directory. Without this option the default output directory is the path to the input file. If -o and -outcurrentdir are used together, -outcurrentdir is effectively ignored as the output directory for the language files is the same directory as the generated C/C++ file if not overridden with -outdir.

    5.1.3 Comments

    C and C++ style comments may appear anywhere in interface files. In previous versions of SWIG, comments were used to generate documentation files. However, this feature is currently under repair and will reappear in a later SWIG release.

    5.1.4 C Preprocessor

    Like C, SWIG preprocesses all input files through an enhanced version of the C preprocessor. All standard preprocessor features are supported including file inclusion, conditional compilation and macros. However, #include statements are ignored unless the -includeall command line option has been supplied. The reason for disabling includes is that SWIG is sometimes used to process raw C header files. In this case, you usually only want the extension module to include functions in the supplied header file rather than everything that might be included by that header file (i.e., system headers, C library functions, etc.).

    It should also be noted that the SWIG preprocessor skips all text enclosed inside a %{...%} block. In addition, the preprocessor includes a number of macro handling enhancements that make it more powerful than the normal C preprocessor. These extensions are described in the "Preprocessor" chapter.

    5.1.5 SWIG Directives

    Most of SWIG's operation is controlled by special directives that are always preceded by a "%" to distinguish them from normal C declarations. These directives are used to give SWIG hints or to alter SWIG's parsing behavior in some manner.

    Since SWIG directives are not legal C syntax, it is generally not possible to include them in header files. However, SWIG directives can be included in C header files using conditional compilation like this:

    /* header.h  --- Some header file */
    
    /* SWIG directives -- only seen if SWIG is running */ 
    #ifdef SWIG
    %module foo
    #endif
    

    SWIG is a special preprocessing symbol defined by SWIG when it is parsing an input file.

    5.1.6 Parser Limitations

    Although SWIG can parse most C/C++ declarations, it does not provide a complete C/C++ parser implementation. Most of these limitations pertain to very complicated type declarations and certain advanced C++ features. Specifically, the following features are not currently supported:

    • Non-conventional type declarations. For example, SWIG does not support declarations such as the following (even though this is legal C):

      /* Non-conventional placement of storage specifier (extern) */
      const int extern Number;
      
      /* Extra declarator grouping */
      Matrix (foo);    // A global variable
      
      /* Extra declarator grouping in parameters */
      void bar(Spam (Grok)(Doh));
      
      

      In practice, few (if any) C programmers actually write code like this since this style is never featured in programming books. However, if you're feeling particularly obfuscated, you can certainly break SWIG (although why would you want to?).

    • Running SWIG on C++ source files (the code in a .C, .cpp or .cxx file) is not recommended. The usual approach is to feed SWIG header files for parsing C++ definitions and declarations. The main reason is if SWIG parses a scoped definition or declaration (as is normal for C++ source files), it is ignored, unless a declaration for the symbol was parsed earlier. For example

      /* bar not wrapped unless foo has been defined and 
         the declaration of bar within foo has already been parsed */
      int foo::bar(int) {
          ... whatever ...
      }
      
    • Certain advanced features of C++ such as nested classes are not yet fully supported. Please see the C++ Nested classes section for more information.

    In the event of a parsing error, conditional compilation can be used to skip offending code. For example:

    #ifndef SWIG
    ... some bad declarations ...
    #endif
    

    Alternatively, you can just delete the offending code from the interface file.

    One of the reasons why SWIG does not provide a full C++ parser implementation is that it has been designed to work with incomplete specifications and to be very permissive in its handling of C/C++ datatypes (e.g., SWIG can generate interfaces even when there are missing class declarations or opaque datatypes). Unfortunately, this approach makes it extremely difficult to implement certain parts of a C/C++ parser as most compilers use type information to assist in the parsing of more complex declarations (for the truly curious, the primary complication in the implementation is that the SWIG parser does not utilize a separate typedef-name terminal symbol as described on p. 234 of K&R).

    5.2 Wrapping Simple C Declarations

    SWIG wraps simple C declarations by creating an interface that closely matches the way in which the declarations would be used in a C program. For example, consider the following interface file:

    %module example
    
    %inline %{
    extern double sin(double x);
    extern int strcmp(const char *, const char *);
    extern int Foo;
    %}
    #define STATUS 50
    #define VERSION "1.1"
    

    In this file, there are two functions sin() and strcmp(), a global variable Foo, and two constants STATUS and VERSION. When SWIG creates an extension module, these declarations are accessible as scripting language functions, variables, and constants respectively. For example, in Tcl:

    % sin 3
    5.2335956
    % strcmp Dave Mike
    -1
    % puts $Foo
    42
    % puts $STATUS
    50
    % puts $VERSION
    1.1
    

    Or in Python:

    >>> example.sin(3)
    5.2335956
    >>> example.strcmp('Dave', 'Mike')
    -1
    >>> print example.cvar.Foo
    42
    >>> print example.STATUS
    50
    >>> print example.VERSION
    1.1
    

    Whenever possible, SWIG creates an interface that closely matches the underlying C/C++ code. However, due to subtle differences between languages, run-time environments, and semantics, it is not always possible to do so. The next few sections describe various aspects of this mapping.

    5.2.1 Basic Type Handling

    In order to build an interface, SWIG has to convert C/C++ datatypes to equivalent types in the target language. Generally, scripting languages provide a more limited set of primitive types than C. Therefore, this conversion process involves a certain amount of type coercion.

    Most scripting languages provide a single integer type that is implemented using the int or long datatype in C. The following list shows all of the C datatypes that SWIG will convert to and from integers in the target language:

    int
    short
    long
    unsigned
    signed
    unsigned short
    unsigned long
    unsigned char
    signed char
    bool
    

    When an integral value is converted from C, a cast is used to convert it to the representation in the target language. Thus, a 16 bit short in C may be promoted to a 32 bit integer. When integers are converted in the other direction, the value is cast back into the original C type. If the value is too large to fit, it is silently truncated.

    unsigned char and signed char are special cases that are handled as small 8-bit integers. Normally, the char datatype is mapped as a one-character ASCII string.

    The bool datatype is cast to and from an integer value of 0 and 1 unless the target language provides a special boolean type.

    Some care is required when working with large integer values. Most scripting languages use 32-bit integers so mapping a 64-bit long integer may lead to truncation errors. Similar problems may arise with 32 bit unsigned integers (which may appear as large negative numbers). As a rule of thumb, the int datatype and all variations of char and short datatypes are safe to use. For unsigned int and long datatypes, you will need to carefully check the correct operation of your program after it has been wrapped with SWIG.

    Although the SWIG parser supports the long long datatype, not all language modules support it. This is because long long usually exceeds the integer precision available in the target language. In certain modules such as Tcl and Perl5, long long integers are encoded as strings. This allows the full range of these numbers to be represented. However, it does not allow long long values to be used in arithmetic expressions. It should also be noted that although long long is part of the ISO C99 standard, it is not universally supported by all C compilers. Make sure you are using a compiler that supports long long before trying to use this type with SWIG.

    SWIG recognizes the following floating point types :

    float
    double
    

    Floating point numbers are mapped to and from the natural representation of floats in the target language. This is almost always a C double. The rarely used datatype of long double is not supported by SWIG.

    The char datatype is mapped into a NULL terminated ASCII string with a single character. When used in a scripting language it shows up as a tiny string containing the character value. When converting the value back into C, SWIG takes a character string from the scripting language and strips off the first character as the char value. Thus if the value "foo" is assigned to a char datatype, it gets the value `f'.

    The char * datatype is handled as a NULL-terminated ASCII string. SWIG maps this into a 8-bit character string in the target scripting language. SWIG converts character strings in the target language to NULL terminated strings before passing them into C/C++. The default handling of these strings does not allow them to have embedded NULL bytes. Therefore, the char * datatype is not generally suitable for passing binary data. However, it is possible to change this behavior by defining a SWIG typemap. See the chapter on Typemaps for details about this.

    At this time, SWIG provides limited support for Unicode and wide-character strings (the C wchar_t type). Some languages provide typemaps for wchar_t, but bear in mind these might not be portable across different operating systems. This is a delicate topic that is poorly understood by many programmers and not implemented in a consistent manner across languages. For those scripting languages that provide Unicode support, Unicode strings are often available in an 8-bit representation such as UTF-8 that can be mapped to the char * type (in which case the SWIG interface will probably work). If the program you are wrapping uses Unicode, there is no guarantee that Unicode characters in the target language will use the same internal representation (e.g., UCS-2 vs. UCS-4). You may need to write some special conversion functions.

    5.2.2 Global Variables

    Whenever possible, SWIG maps C/C++ global variables into scripting language variables. For example,

    %module example
    double foo;
    
    

    results in a scripting language variable like this:

    # Tcl
    set foo [3.5]                   ;# Set foo to 3.5
    puts $foo                       ;# Print the value of foo
    
    # Python
    cvar.foo = 3.5                  # Set foo to 3.5
    print cvar.foo                  # Print value of foo
    
    # Perl
    $foo = 3.5;                     # Set foo to 3.5
    print $foo, "\n";               # Print value of foo
    
    # Ruby
    Module.foo = 3.5               # Set foo to 3.5
    print Module.foo, "\n"         # Print value of foo
    

    Whenever the scripting language variable is used, the underlying C global variable is accessed. Although SWIG makes every attempt to make global variables work like scripting language variables, it is not always possible to do so. For instance, in Python, all global variables must be accessed through a special variable object known as cvar (shown above). In Ruby, variables are accessed as attributes of the module. Other languages may convert variables to a pair of accessor functions. For example, the Java module generates a pair of functions double get_foo() and set_foo(double val) that are used to manipulate the value.

    Finally, if a global variable has been declared as const, it only supports read-only access. Note: this behavior is new to SWIG-1.3. Earlier versions of SWIG incorrectly handled const and created constants instead.

    5.2.3 Constants

    Constants can be created using #define, enumerations, or a special %constant directive. The following interface file shows a few valid constant declarations :

    #define I_CONST       5               // An integer constant
    #define PI            3.14159         // A Floating point constant
    #define S_CONST       "hello world"   // A string constant
    #define NEWLINE       '\n'            // Character constant
    
    enum boolean {NO=0, YES=1};
    enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
                 SEP, OCT, NOV, DEC};
    %constant double BLAH = 42.37;
    #define PI_4 PI/4
    #define FLAGS 0x04 | 0x08 | 0x40
    
    

    In #define declarations, the type of a constant is inferred by syntax. For example, a number with a decimal point is assumed to be floating point. In addition, SWIG must be able to fully resolve all of the symbols used in a #define in order for a constant to actually be created. This restriction is necessary because #define is also used to define preprocessor macros that are definitely not meant to be part of the scripting language interface. For example:

    #define EXTERN extern
    
    EXTERN void foo();
    

    In this case, you probably don't want to create a constant called EXTERN (what would the value be?). In general, SWIG will not create constants for macros unless the value can be completely determined by the preprocessor. For instance, in the above example, the declaration

    #define PI_4  PI/4
    

    defines a constant because PI was already defined as a constant and the value is known. However, for the same conservative reasons even a constant with a simple cast will be ignored, such as

    #define F_CONST (double) 5            // A floating point constant with cast
    

    The use of constant expressions is allowed, but SWIG does not evaluate them. Rather, it passes them through to the output file and lets the C compiler perform the final evaluation (SWIG does perform a limited form of type-checking however).

    For enumerations, it is critical that the original enum definition be included somewhere in the interface file (either in a header file or in the %{ %} block). SWIG only translates the enumeration into code needed to add the constants to a scripting language. It needs the original enumeration declaration in order to get the correct enum values as assigned by the C compiler.

    The %constant directive is used to more precisely create constants corresponding to different C datatypes. Although it is not usually needed for simple values, it is more useful when working with pointers and other more complex datatypes. Typically, %constant is only used when you want to add constants to the scripting language interface that are not defined in the original header file.

    5.2.4 A brief word about const

    A common confusion with C programming is the semantic meaning of the const qualifier in declarations--especially when it is mixed with pointers and other type modifiers. In fact, previous versions of SWIG handled const incorrectly--a situation that SWIG-1.3.7 and newer releases have fixed.

    Starting with SWIG-1.3, all variable declarations, regardless of any use of const, are wrapped as global variables. If a declaration happens to be declared as const, it is wrapped as a read-only variable. To tell if a variable is const or not, you need to look at the right-most occurrence of the const qualifier (that appears before the variable name). If the right-most const occurs after all other type modifiers (such as pointers), then the variable is const. Otherwise, it is not.

    Here are some examples of const declarations.

    const char a;           // A constant character
    char const b;           // A constant character (the same)
    char *const c;          // A constant pointer to a character
    const char *const d;    // A constant pointer to a constant character
    

    Here is an example of a declaration that is not const:

    const char *e;          // A pointer to a constant character.  The pointer
                            // may be modified.
    

    In this case, the pointer e can change---it's only the value being pointed to that is read-only.

    Please note that for const parameters or return types used in a function, SWIG pretty much ignores the fact that these are const, see the section on const-correctness for more information.

    Compatibility Note: One reason for changing SWIG to handle const declarations as read-only variables is that there are many situations where the value of a const variable might change. For example, a library might export a symbol as const in its public API to discourage modification, but still allow the value to change through some other kind of internal mechanism. Furthermore, programmers often overlook the fact that with a constant declaration like char *const, the underlying data being pointed to can be modified--it's only the pointer itself that is constant. In an embedded system, a const declaration might refer to a read-only memory address such as the location of a memory-mapped I/O device port (where the value changes, but writing to the port is not supported by the hardware). Rather than trying to build a bunch of special cases into the const qualifier, the new interpretation of const as "read-only" is simple and exactly matches the actual semantics of const in C/C++. If you really want to create a constant as in older versions of SWIG, use the %constant directive instead. For example:

    %constant double PI = 3.14159;
    

    or

    #ifdef SWIG
    #define const %constant
    #endif
    const double foo = 3.4;
    const double bar = 23.4;
    const int    spam = 42;
    #ifdef SWIG
    #undef const
    #endif
    ...
    
    

    5.2.5 A cautionary tale of char *

    Before going any further, there is one bit of caution involving char * that must now be mentioned. When strings are passed from a scripting language to a C char *, the pointer usually points to string data stored inside the interpreter. It is almost always a really bad idea to modify this data. Furthermore, some languages may explicitly disallow it. For instance, in Python, strings are supposed to be immutable. If you violate this, you will probably receive a vast amount of wrath when you unleash your module on the world.

    The primary source of problems are functions that might modify string data in place. A classic example would be a function like this:

    char *strcat(char *s, const char *t)
    

    Although SWIG will certainly generate a wrapper for this, its behavior will be undefined. In fact, it will probably cause your application to crash with a segmentation fault or other memory related problem. This is because s refers to some internal data in the target language---data that you shouldn't be touching.

    The bottom line: don't rely on char * for anything other than read-only input values. However, it must be noted that you could change the behavior of SWIG using typemaps.

    5.3 Pointers and complex objects

    Most C programs manipulate arrays, structures, and other types of objects. This section discusses the handling of these datatypes.

    5.3.1 Simple pointers

    Pointers to primitive C datatypes such as

    int *
    double ***
    char **
    

    are fully supported by SWIG. Rather than trying to convert the data being pointed to into a scripting representation, SWIG simply encodes the pointer itself into a representation that contains the actual value of the pointer and a type-tag. Thus, the SWIG representation of the above pointers (in Tcl), might look like this:

    _10081012_p_int
    _1008e124_ppp_double
    _f8ac_pp_char
    

    A NULL pointer is represented by the string "NULL" or the value 0 encoded with type information.

    All pointers are treated as opaque objects by SWIG. Thus, a pointer may be returned by a function and passed around to other C functions as needed. For all practical purposes, the scripting language interface works in exactly the same way as you would use the pointer in a C program. The only difference is that there is no mechanism for dereferencing the pointer since this would require the target language to understand the memory layout of the underlying object.

    The scripting language representation of a pointer value should never be manipulated directly. Even though the values shown look like hexadecimal addresses, the numbers used may differ from the actual machine address (e.g., on little-endian machines, the digits may appear in reverse order). Furthermore, SWIG does not normally map pointers into high-level objects such as associative arrays or lists (for example, converting an int * into an list of integers). There are several reasons why SWIG does not do this:

    • There is not enough information in a C declaration to properly map pointers into higher level constructs. For example, an int * may indeed be an array of integers, but if it contains ten million elements, converting it into a list object is probably a bad idea.
    • The underlying semantics associated with a pointer is not known by SWIG. For instance, an int * might not be an array at all--perhaps it is an output value!
    • By handling all pointers in a consistent manner, the implementation of SWIG is greatly simplified and less prone to error.

    5.3.2 Run time pointer type checking

    By allowing pointers to be manipulated from a scripting language, extension modules effectively bypass compile-time type checking in the C/C++ compiler. To prevent errors, a type signature is encoded into all pointer values and is used to perform run-time type checking. This type-checking process is an integral part of SWIG and can not be disabled or modified without using typemaps (described in later chapters).

    Like C, void * matches any kind of pointer. Furthermore, NULL pointers can be passed to any function that expects to receive a pointer. Although this has the potential to cause a crash, NULL pointers are also sometimes used as sentinel values or to denote a missing/empty value. Therefore, SWIG leaves NULL pointer checking up to the application.

    5.3.3 Derived types, structs, and classes

    For everything else (structs, classes, arrays, etc...) SWIG applies a very simple rule :

    Everything else is a pointer

    In other words, SWIG manipulates everything else by reference. This model makes sense because most C/C++ programs make heavy use of pointers and SWIG can use the type-checked pointer mechanism already present for handling pointers to basic datatypes.

    Although this probably sounds complicated, it's really quite simple. Suppose you have an interface file like this :

    %module fileio
    FILE *fopen(char *, char *);
    int fclose(FILE *);
    unsigned fread(void *ptr, unsigned size, unsigned nobj, FILE *);
    unsigned fwrite(void *ptr, unsigned size, unsigned nobj, FILE *);
    void *malloc(int nbytes);
    void free(void *);
    
    

    In this file, SWIG doesn't know what a FILE is, but since it's used as a pointer, so it doesn't really matter what it is. If you wrapped this module into Python, you can use the functions just like you expect :

    # Copy a file 
    def filecopy(source, target):
      f1 = fopen(source, "r")
      f2 = fopen(target, "w")
      buffer = malloc(8192)
      nbytes = fread(buffer, 8192, 1, f1)
      while (nbytes > 0):
        fwrite(buffer, 8192, 1, f2)
              nbytes = fread(buffer, 8192, 1, f1)
      free(buffer)
    

    In this case f1, f2, and buffer are all opaque objects containing C pointers. It doesn't matter what value they contain--our program works just fine without this knowledge.

    5.3.4 Undefined datatypes

    When SWIG encounters an undeclared datatype, it automatically assumes that it is a structure or class. For example, suppose the following function appeared in a SWIG input file:

    void matrix_multiply(Matrix *a, Matrix *b, Matrix *c);
    

    SWIG has no idea what a "Matrix" is. However, it is obviously a pointer to something so SWIG generates a wrapper using its generic pointer handling code.

    Unlike C or C++, SWIG does not actually care whether Matrix has been previously defined in the interface file or not. This allows SWIG to generate interfaces from only partial or limited information. In some cases, you may not care what a Matrix really is as long as you can pass an opaque reference to one around in the scripting language interface.

    An important detail to mention is that SWIG will gladly generate wrappers for an interface when there are unspecified type names. However, all unspecified types are internally handled as pointers to structures or classes! For example, consider the following declaration:

    void foo(size_t num);
    

    If size_t is undeclared, SWIG generates wrappers that expect to receive a type of size_t * (this mapping is described shortly). As a result, the scripting interface might behave strangely. For example:

    foo(40);
    TypeError: expected a _p_size_t.
    

    The only way to fix this problem is to make sure you properly declare type names using typedef.

    5.3.5 Typedef

    Like C, typedef can be used to define new type names in SWIG. For example:

    typedef unsigned int size_t;
    

    typedef definitions appearing in a SWIG interface are not propagated to the generated wrapper code. Therefore, they either need to be defined in an included header file or placed in the declarations section like this:

    %{
    /* Include in the generated wrapper file */
    typedef unsigned int size_t;
    %}
    /* Tell SWIG about it */
    typedef unsigned int size_t;
    

    or

    %inline %{
    typedef unsigned int size_t;
    %}
    

    In certain cases, you might be able to include other header files to collect type information. For example:

    %module example
    %import "sys/types.h"
    

    In this case, you might run SWIG as follows:

    $ swig -I/usr/include -includeall example.i
    

    It should be noted that your mileage will vary greatly here. System headers are notoriously complicated and may rely upon a variety of non-standard C coding extensions (e.g., such as special directives to GCC). Unless you exactly specify the right include directories and preprocessor symbols, this may not work correctly (you will have to experiment).

    SWIG tracks typedef declarations and uses this information for run-time type checking. For instance, if you use the above typedef and had the following function declaration:

    void foo(unsigned int *ptr);
    

    The corresponding wrapper function will accept arguments of type unsigned int * or size_t *.

    5.4 Other Practicalities

    So far, this chapter has presented almost everything you need to know to use SWIG for simple interfaces. However, some C programs use idioms that are somewhat more difficult to map to a scripting language interface. This section describes some of these issues.

    5.4.1 Passing structures by value

    Sometimes a C function takes structure parameters that are passed by value. For example, consider the following function:

    double dot_product(Vector a, Vector b);
    

    To deal with this, SWIG transforms the function to use pointers by creating a wrapper equivalent to the following:

    double wrap_dot_product(Vector *a, Vector *b) {
        Vector x = *a;
        Vector y = *b;
        return dot_product(x, y);
    }
    

    In the target language, the dot_product() function now accepts pointers to Vectors instead of Vectors. For the most part, this transformation is transparent so you might not notice.

    5.4.2 Return by value

    C functions that return structures or classes datatypes by value are more difficult to handle. Consider the following function:

    Vector cross_product(Vector v1, Vector v2);
    

    This function wants to return Vector, but SWIG only really supports pointers. As a result, SWIG creates a wrapper like this:

    Vector *wrap_cross_product(Vector *v1, Vector *v2) {
            Vector x = *v1;
            Vector y = *v2;
            Vector *result;
            result = (Vector *) malloc(sizeof(Vector));
            *(result) = cross(x, y);
            return result;
    }
    

    or if SWIG was run with the -c++ option:

    Vector *wrap_cross(Vector *v1, Vector *v2) {
            Vector x = *v1;
            Vector y = *v2;
            Vector *result = new Vector(cross(x, y)); // Uses default copy constructor
            return result;
    }
    

    In both cases, SWIG allocates a new object and returns a reference to it. It is up to the user to delete the returned object when it is no longer in use. Clearly, this will leak memory if you are unaware of the implicit memory allocation and don't take steps to free the result. That said, it should be noted that some language modules can now automatically track newly created objects and reclaim memory for you. Consult the documentation for each language module for more details.

    It should also be noted that the handling of pass/return by value in C++ has some special cases. For example, the above code fragments don't work correctly if Vector doesn't define a default constructor. The section on SWIG and C++ has more information about this case.

    5.4.3 Linking to structure variables

    When global variables or class members involving structures are encountered, SWIG handles them as pointers. For example, a global variable like this

    Vector unit_i;
    

    gets mapped to an underlying pair of set/get functions like this :

    Vector *unit_i_get() {
      return &unit_i;
    }
    void unit_i_set(Vector *value) {
      unit_i = *value;
    }
    

    Again some caution is in order. A global variable created in this manner will show up as a pointer in the target scripting language. It would be an extremely bad idea to free or destroy such a pointer. Also, C++ classes must supply a properly defined copy constructor in order for assignment to work correctly.

    5.4.4 Linking to char *

    When a global variable of type char * appears, SWIG uses malloc() or new to allocate memory for the new value. Specifically, if you have a variable like this

    char *foo;
    

    SWIG generates the following code:

    /* C mode */
    void foo_set(char *value) {
      if (foo) free(foo);
      foo = (char *) malloc(strlen(value)+1);
      strcpy(foo, value);
    }
    
    /* C++ mode.  When -c++ option is used */
    void foo_set(char *value) {
      if (foo) delete [] foo;
      foo = new char[strlen(value)+1];
      strcpy(foo, value);
    }
    

    If this is not the behavior that you want, consider making the variable read-only using the %immutable directive. Alternatively, you might write a short assist-function to set the value exactly like you want. For example:

    %inline %{
      void set_foo(char *value) {
        strncpy(foo, value, 50);
      }
    %}
    

    Note: If you write an assist function like this, you will have to call it as a function from the target scripting language (it does not work like a variable). For example, in Python you will have to write:

    >>> set_foo("Hello World")
    

    A common mistake with char * variables is to link to a variable declared like this:

    char *VERSION = "1.0";
    

    In this case, the variable will be readable, but any attempt to change the value results in a segmentation or general protection fault. This is due to the fact that SWIG is trying to release the old value using free or delete when the string literal value currently assigned to the variable wasn't allocated using malloc() or new. To fix this behavior, you can either mark the variable as read-only, write a typemap (as described in Chapter 6), or write a special set function as shown. Another alternative is to declare the variable as an array:

    char VERSION[64] = "1.0";
    

    When variables of type const char * are declared, SWIG still generates functions for setting and getting the value. However, the default behavior does not release the previous contents (resulting in a possible memory leak). In fact, you may get a warning message such as this when wrapping such a variable:

    example.i:20. Typemap warning. Setting const char * variable may leak memory
    

    The reason for this behavior is that const char * variables are often used to point to string literals. For example:

    const char *foo = "Hello World\n";
    

    Therefore, it's a really bad idea to call free() on such a pointer. On the other hand, it is legal to change the pointer to point to some other value. When setting a variable of this type, SWIG allocates a new string (using malloc or new) and changes the pointer to point to the new value. However, repeated modifications of the value will result in a memory leak since the old value is not released.

    5.4.5 Arrays

    Arrays are fully supported by SWIG, but they are always handled as pointers instead of mapping them to a special array object or list in the target language. Thus, the following declarations :

    int foobar(int a[40]);
    void grok(char *argv[]);
    void transpose(double a[20][20]);
    

    are processed as if they were really declared like this:

    int foobar(int *a);
    void grok(char **argv);
    void transpose(double (*a)[20]);
    

    Like C, SWIG does not perform array bounds checking. It is up to the user to make sure the pointer points to a suitably allocated region of memory.

    Multi-dimensional arrays are transformed into a pointer to an array of one less dimension. For example:

    int [10];         // Maps to int *
    int [10][20];     // Maps to int (*)[20]
    int [10][20][30]; // Maps to int (*)[20][30]
    

    It is important to note that in the C type system, a multidimensional array a[][] is NOT equivalent to a single pointer *a or a double pointer such as **a. Instead, a pointer to an array is used (as shown above) where the actual value of the pointer is the starting memory location of the array. The reader is strongly advised to dust off their C book and re-read the section on arrays before using them with SWIG.

    Array variables are supported, but are read-only by default. For example:

    int   a[100][200];
    

    In this case, reading the variable 'a' returns a pointer of type int (*)[200] that points to the first element of the array &a[0][0]. Trying to modify 'a' results in an error. This is because SWIG does not know how to copy data from the target language into the array. To work around this limitation, you may want to write a few simple assist functions like this:

    %inline %{
    void a_set(int i, int j, int val) {
      a[i][j] = val;
    }
    int a_get(int i, int j) {
      return a[i][j];
    }
    %}
    

    To dynamically create arrays of various sizes and shapes, it may be useful to write some helper functions in your interface. For example:

    // Some array helpers
    %inline %{
      /* Create any sort of [size] array */
      int *int_array(int size) {
        return (int *) malloc(size*sizeof(int));
      }
      /* Create a two-dimension array [size][10] */
      int (*int_array_10(int size))[10] {
        return (int (*)[10]) malloc(size*10*sizeof(int));
      }
    %}
    

    Arrays of char are handled as a special case by SWIG. In this case, strings in the target language can be stored in the array. For example, if you have a declaration like this,

    char pathname[256];
    

    SWIG generates functions for both getting and setting the value that are equivalent to the following code:

    char *pathname_get() {
      return pathname;
    }
    void pathname_set(char *value) {
      strncpy(pathname, value, 256);
    }
    

    In the target language, the value can be set like a normal variable.

    5.4.6 Creating read-only variables

    A read-only variable can be created by using the %immutable directive as shown :

    // File : interface.i
    
    int a;       // Can read/write
    %immutable;
    int b, c, d;   // Read only variables
    %mutable;
    double x, y;  // read/write
    

    The %immutable directive enables read-only mode until it is explicitly disabled using the %mutable directive. As an alternative to turning read-only mode off and on like this, individual declarations can also be tagged as immutable. For example:

    %immutable x;                   // Make x read-only
    ...
    double x;                       // Read-only (from earlier %immutable directive)
    double y;                       // Read-write
    ...
    

    The %mutable and %immutable directives are actually %feature directives defined like this:

    #define %immutable   %feature("immutable")
    #define %mutable     %feature("immutable", "")
    

    If you wanted to make all wrapped variables read-only, barring one or two, it might be easier to take this approach:

    %immutable;                     // Make all variables read-only
    %feature("immutable", "0") x;   // except, make x read/write
    ...
    double x;
    double y;
    double z;
    ...
    

    Read-only variables are also created when declarations are declared as const. For example:

    const int foo;               /* Read only variable */
    char * const version="1.0";  /* Read only variable */
    

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    5.4.7 Renaming and ignoring declarations

    5.4.7.1 Simple renaming of specific identifiers

    Normally, the name of a C declaration is used when that declaration is wrapped into the target language. However, this may generate a conflict with a keyword or already existing function in the scripting language. To resolve a name conflict, you can use the %rename directive as shown :

    // interface.i
    
    %rename(my_print) print;
    extern void print(const char *);
    
    %rename(foo) a_really_long_and_annoying_name;
    extern int a_really_long_and_annoying_name;
    
    

    SWIG still calls the correct C function, but in this case the function print() will really be called "my_print()" in the target language.

    The placement of the %rename directive is arbitrary as long as it appears before the declarations to be renamed. A common technique is to write code for wrapping a header file like this:

    // interface.i
    
    %rename(my_print) print;
    %rename(foo) a_really_long_and_annoying_name;
    
    %include "header.h"
    

    %rename applies a renaming operation to all future occurrences of a name. The renaming applies to functions, variables, class and structure names, member functions, and member data. For example, if you had two-dozen C++ classes, all with a member function named `print' (which is a keyword in Python), you could rename them all to `output' by specifying :

    %rename(output) print; // Rename all `print' functions to `output'
    

    SWIG does not normally perform any checks to see if the functions it wraps are already defined in the target scripting language. However, if you are careful about namespaces and your use of modules, you can usually avoid these problems.

    Closely related to %rename is the %ignore directive. %ignore instructs SWIG to ignore declarations that match a given identifier. For example:

    %ignore print;         // Ignore all declarations named print
    %ignore MYMACRO;       // Ignore a macro
    ...
    #define MYMACRO 123
    void print(const char *);
    ...
    

    Any function, variable etc which matches %ignore will not be wrapped and therefore will not be available from the target language. A common usage of %ignore is to selectively remove certain declarations from a header file without having to add conditional compilation to the header. However, it should be stressed that this only works for simple declarations. If you need to remove a whole section of problematic code, the SWIG preprocessor should be used instead.

    Compatibility note: Older versions of SWIG provided a special %name directive for renaming declarations. For example:

    %name(output) extern void print(const char *);
    

    This directive is still supported, but it is deprecated and should probably be avoided. The %rename directive is more powerful and better supports wrapping of raw header file information.

    5.4.7.2 Advanced renaming support

    While writing %rename for specific declarations is simple enough, sometimes the same renaming rule needs to be applied to many, maybe all, identifiers in the SWIG input. For example, it may be necessary to apply some transformation to all the names in the target language to better follow its naming conventions, like adding a specific prefix to all wrapped functions. Doing it individually for each function is impractical so SWIG supports applying a renaming rule to all declarations if the name of the identifier to be renamed is not specified:

    %rename("myprefix_%s") ""; // print -> myprefix_print
    

    This also shows that the argument of %rename doesn't have to be a literal string but can be a printf()-like format string. In the simplest form, "%s" is replaced with the name of the original declaration, as shown above. However this is not always enough and SWIG provides extensions to the usual format string syntax to allow applying a (SWIG-defined) function to the argument. For example, to wrap all C functions do_something_long() as more Java-like doSomethingLong() you can use the "lowercamelcase" extended format specifier like this:

    %rename("%(lowercamelcase)s") ""; // foo_bar -> fooBar; FooBar -> fooBar
    

    Some functions can be parametrized, for example the "strip" one strips the provided prefix from its argument. The prefix is specified as part of the format string, following a colon after the function name:

    %rename("%(strip:[wx])s") ""; // wxHello -> Hello; FooBar -> FooBar
    

    Below is the table summarizing all currently defined functions with an example of applying each one. Note that some of them have two names, a shorter one and a more descriptive one, but the two functions are otherwise equivalent:

    FunctionReturnsExample (in/out)
    uppercase or upperUpper case version of the string.PrintPRINT
    lowercase or lowerLower case version of the string.Printprint
    titleString with first letter capitalized and the rest in lower case.printPrint
    firstuppercaseString with the first letter capitalized and the rest unchanged.printIt PrintIt
    firstlowercaseString with the first letter in lower case and the rest unchanged.PrintIt printIt
    camelcase or ctitleString with capitalized first letter and any letter following an underscore (which are removed in the process) and rest in lower case. print_itPrintIt
    lowercamelcase or lctitleString with every letter following an underscore (which is removed in the process) capitalized and rest, including the first letter, in lower case. print_itprintIt
    undercase or utitleLower case string with underscores inserted before every upper case letter in the original string and any number not at the end of string. Logically, this is the reverse of camelcase.PrintIt print_it
    schemifyString with all underscores replaced with dashes, resulting in more Lispers/Schemers-pleasing name. print_itprint-it
    strip:[prefix]String without the given prefix or the original string if it doesn't start with this prefix. Note that square brackets should be used literally, e.g. %rename("strip:[wx]")wxPrintPrint
    rstrip:[suffix]String without the given suffix or the original string if it doesn't end with this suffix. Note that square brackets should be used literally, e.g. %rename("rstrip:[Cls]")PrintClsPrint
    regex:/pattern/subst/String after (Perl-like) regex substitution operation. This function allows to apply arbitrary regular expressions to the identifier names. The pattern part is a regular expression in Perl syntax (as supported by the Perl Compatible Regular Expressions (PCRE)) library and the subst string can contain back-references of the form \N where N is a digit from 0 to 9, or one of the following escape sequences: \l, \L, \u, \U or \E. The back-references are replaced with the contents of the corresponding capture group while the escape sequences perform the case conversion in the substitution string: \l and \L convert to the lower case, while \u and \U convert to the upper case. The difference between the elements of each pair is that \l and \u change the case of the next character only, while \L and \U do it for all the remaining characters or until \E is encountered. Finally please notice that backslashes need to be escaped in C strings, so in practice "\\" must be used in all these escape sequences. For example, to remove any alphabetic prefix before an underscore and capitalize the remaining part you could use the following directive: %rename("regex:/(\\w+)_(.*)/\\u\\2/") prefix_printPrint
    command:cmdOutput of an external command cmd with the string passed to it as input. Notice that this function is extremely slow compared to all the other ones as it involves spawning a separate process and using it for many declarations is not recommended. The cmd is not enclosed in square brackets but must be terminated with a triple '<' sign, e.g. %rename("command:tr -d aeiou <<<") (nonsensical example removing all vowels)PrintPrnt

    The most general function of all of the above ones (not counting command which is even more powerful in principle but which should generally be avoided because of performance considerations) is the regex one. Here are some more examples of its use:

    // Strip the wx prefix from all identifiers except those starting with wxEVT
    %rename("%(regex:/wx(?!EVT)(.*)/\\1/)s") ""; // wxSomeWidget -> SomeWidget
                                                 // wxEVT_PAINT -> wxEVT_PAINT
    
    // Apply a rule for renaming the enum elements to avoid the common prefixes
    // which are redundant in C#/Java
    %rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) ""; // Colour_Red -> Red
    
    // Remove all "Set/Get" prefixes.
    %rename("%(regex:/^(Set|Get)(.*)/\\2/)s") ""; // SetValue -> Value
                                                  // GetValue -> Value
    

    As before, everything that was said above about %rename also applies to %ignore. In fact, the latter is just a special case of the former and ignoring an identifier is the same as renaming it to the special "$ignore" value. So the following snippets

    %ignore print;
    

    and

    %rename("$ignore") print;
    

    are exactly equivalent and %rename can be used to selectively ignore multiple declarations using the previously described matching possibilities.

    5.4.7.3 Limiting global renaming rules

    As explained in the previous sections, it is possible to either rename individual declarations or apply a rename rule to all of them at once. In practice, the latter is however rarely appropriate as there are always some exceptions to the general rules. To deal with them, the scope of an unnamed %rename can be limited using subsequent match parameters. They can be applied to any of the attributes associated by SWIG with the declarations appearing in its input. For example:

    %rename("foo", match$name="bar") "";
    

    can be used to achieve the same effect as the simpler

    %rename("foo") bar;
    

    and so is not very interesting on its own. However match can also be applied to the declaration type, for example match="class" restricts the match to class declarations only (in C++) and match="enumitem" restricts it to the enum elements. SWIG also provides convenience macros for such match expressions, for example

    %rename("%(title)s", %$isenumitem) "";
    

    will capitalize the names of all the enum elements but not change the case of the other declarations. Similarly, %$isclass, %$isfunction, %$isconstructor, %$isunion, %$istemplate, and %$isvariable can be used. Many other checks are possible and this documentation is not exhaustive, see the "%rename predicates" section in swig.swg for the full list of supported match expressions.

    In addition to literally matching some string with match you can also use regexmatch or notregexmatch to match a string against a regular expression. For example, to ignore all functions having "Old" as a suffix you could use

    %rename("$ignore", regexmatch$name="Old$") "";
    

    For simple cases like this, specifying the regular expression for the declaration name directly can be preferable and can also be done using regextarget:

    %rename("$ignore", regextarget=1) "Old$";
    

    Notice that the check is done only against the name of the declaration itself, if you need to match the full name of a C++ declaration you must use fullname attribute:

    %rename("$ignore", regextarget=1, fullname=1) "NameSpace::ClassName::.*Old$";
    

    As for notregexmatch, it restricts the match only to the strings not matching the specified regular expression. So to rename all declarations to lower case except those consisting of capital letters only:

    %rename("$(lower)s", notregexmatch$name="^[A-Z]+$") "";
    

    Finally, variants of %rename and %ignore directives can be used to help wrap C++ overloaded functions and methods or C++ methods which use default arguments. This is described in the Ambiguity resolution and renaming section in the C++ chapter.

    5.4.7.4 Ignoring everything then wrapping a few selected symbols

    Using the techniques described above it is possible to ignore everything in a header and then selectively wrap a few chosen methods or classes. For example, consider a header, myheader.h which has many classes in it and just the one class called Star is wanted within this header, the following approach could be taken:

    %ignore ""; // Ignore everything
    
    // Unignore chosen class 'Star'
    %rename("%s") Star;
    
    // As the ignore everything will include the constructor, destructor, methods etc
    // in the class, these have to be explicitly unignored too:
    %rename("%s") Star::Star;
    %rename("%s") Star::~Star;
    %rename("%s") Star::shine; // named method
    
    %include "myheader.h"
    

    Another approach which might be more suitable as it does not require naming all the methods in the chosen class is to begin by ignoring just the classes. This does not add an explicit ignore to any members of the class, so when the chosen class is unignored, all of its methods will be wrapped.

    %rename($ignore, %$isclass) ""; // Only ignore all classes
    %rename("%s") Star; // Unignore 'Star'
    %include "myheader.h"
    

    5.4.8 Default/optional arguments

    SWIG supports default arguments in both C and C++ code. For example:

    int plot(double x, double y, int color=WHITE);
    

    In this case, SWIG generates wrapper code where the default arguments are optional in the target language. For example, this function could be used in Tcl as follows :

    % plot -3.4 7.5    # Use default value
    % plot -3.4 7.5 10 # set color to 10 instead
    
    

    Although the ANSI C standard does not allow default arguments, default arguments specified in a SWIG interface work with both C and C++.

    Note: There is a subtle semantic issue concerning the use of default arguments and the SWIG generated wrapper code. When default arguments are used in C code, the default values are emitted into the wrappers and the function is invoked with a full set of arguments. This is different to when wrapping C++ where an overloaded wrapper method is generated for each defaulted argument. Please refer to the section on default arguments in the C++ chapter for further details.

    5.4.9 Pointers to functions and callbacks

    Occasionally, a C library may include functions that expect to receive pointers to functions--possibly to serve as callbacks. SWIG provides full support for function pointers provided that the callback functions are defined in C and not in the target language. For example, consider a function like this:

    int binary_op(int a, int b, int (*op)(int, int));
    

    When you first wrap something like this into an extension module, you may find the function to be impossible to use. For instance, in Python:

    >>> def add(x, y):
    ...     return x+y
    ...
    >>> binary_op(3, 4, add)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_f_int_int__int
    >>>
    

    The reason for this error is that SWIG doesn't know how to map a scripting language function into a C callback. However, existing C functions can be used as arguments provided you install them as constants. One way to do this is to use the %constant directive like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %constant int add(int, int);
    %constant int sub(int, int);
    %constant int mul(int, int);
    

    In this case, add, sub, and mul become function pointer constants in the target scripting language. This allows you to use them as follows:

    >>> binary_op(3, 4, add)
    7
    >>> binary_op(3, 4, mul)
    12
    >>>
    

    Unfortunately, by declaring the callback functions as constants, they are no longer accessible as functions. For example:

    >>> add(3, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: object is not callable: '_ff020efc_p_f_int_int__int'
    >>>
    

    If you want to make a function available as both a callback function and a function, you can use the %callback and %nocallback directives like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %callback("%s_cb");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    The argument to %callback is a printf-style format string that specifies the naming convention for the callback constants (%s gets replaced by the function name). The callback mode remains in effect until it is explicitly disabled using %nocallback. When you do this, the interface now works as follows:

    >>> binary_op(3, 4, add_cb)
    7
    >>> binary_op(3, 4, mul_cb)
    12
    >>> add(3, 4)
    7
    >>> mul(3, 4)
    12
    

    Notice that when the function is used as a callback, special names such as add_cb are used instead. To call the function normally, just use the original function name such as add().

    SWIG provides a number of extensions to standard C printf formatting that may be useful in this context. For instance, the following variation installs the callbacks as all upper case constants such as ADD, SUB, and MUL:

    /* Some callback functions */
    %callback("%(uppercase)s");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    A format string of "%(lowercase)s" converts all characters to lower case. A string of "%(title)s" capitalizes the first character and converts the rest to lower case.

    And now, a final note about function pointer support. Although SWIG does not normally allow callback functions to be written in the target language, this can be accomplished with the use of typemaps and other advanced SWIG features. See the Typemaps chapter for more about typemaps and individual target language chapters for more on callbacks and the 'director' feature.

    5.5 Structures and unions

    This section describes the behavior of SWIG when processing ANSI C structures and union declarations. Extensions to handle C++ are described in the next section.

    If SWIG encounters the definition of a structure or union, it creates a set of accessor functions. Although SWIG does not need structure definitions to build an interface, providing definitions makes it possible to access structure members. The accessor functions generated by SWIG simply take a pointer to an object and allow access to an individual member. For example, the declaration :

    struct Vector {
      double x, y, z;
    }
    
    

    gets transformed into the following set of accessor functions :

    double Vector_x_get(struct Vector *obj) {
      return obj->x;
    }
    double Vector_y_get(struct Vector *obj) { 
      return obj->y;
    }
    double Vector_z_get(struct Vector *obj) { 
      return obj->z;
    }
    void Vector_x_set(struct Vector *obj, double value) {
      obj->x = value;
    }
    void Vector_y_set(struct Vector *obj, double value) {
      obj->y = value;
    }
    void Vector_z_set(struct Vector *obj, double value) {
      obj->z = value;
    }
    

    In addition, SWIG creates default constructor and destructor functions if none are defined in the interface. For example:

    struct Vector *new_Vector() {
        return (Vector *) calloc(1, sizeof(struct Vector));
    }
    void delete_Vector(struct Vector *obj) {
        free(obj);
    }
    

    Using these low-level accessor functions, an object can be minimally manipulated from the target language using code like this:

    v = new_Vector()
    Vector_x_set(v, 2)
    Vector_y_set(v, 10)
    Vector_z_set(v, -5)
    ...
    delete_Vector(v)
    

    However, most of SWIG's language modules also provide a high-level interface that is more convenient. Keep reading.

    5.5.1 Typedef and structures

    SWIG supports the following construct which is quite common in C programs :

    typedef struct {
      double x, y, z;
    } Vector;
    
    

    When encountered, SWIG assumes that the name of the object is `Vector' and creates accessor functions like before. The only difference is that the use of typedef allows SWIG to drop the struct keyword on its generated code. For example:

    double Vector_x_get(Vector *obj) {
      return obj->x;
    }
    

    If two different names are used like this :

    typedef struct vector_struct {
      double x, y, z;
    } Vector;
    
    

    the name Vector is used instead of vector_struct since this is more typical C programming style. If declarations defined later in the interface use the type struct vector_struct, SWIG knows that this is the same as Vector and it generates the appropriate type-checking code.

    5.5.2 Character strings and structures

    Structures involving character strings require some care. SWIG assumes that all members of type char * have been dynamically allocated using malloc() and that they are NULL-terminated ASCII strings. When such a member is modified, the previous contents will be released, and the new contents allocated. For example :

    %module mymodule
    ...
    struct Foo {
      char *name;
      ...
    }
    
    

    This results in the following accessor functions :

    char *Foo_name_get(Foo *obj) {
      return Foo->name;
    }
    
    char *Foo_name_set(Foo *obj, char *c) {
      if (obj->name)
        free(obj->name);
      obj->name = (char *) malloc(strlen(c)+1);
      strcpy(obj->name, c);
      return obj->name;
    }
    

    If this behavior differs from what you need in your applications, the SWIG "memberin" typemap can be used to change it. See the typemaps chapter for further details.

    Note: If the -c++ option is used, new and delete are used to perform memory allocation.

    5.5.3 Array members

    Arrays may appear as the members of structures, but they will be read-only. SWIG will write an accessor function that returns the pointer to the first element of the array, but will not write a function to change the contents of the array itself. When this situation is detected, SWIG may generate a warning message such as the following :

    interface.i:116. Warning. Array member will be read-only
    

    To eliminate the warning message, typemaps can be used, but this is discussed in a later chapter. In many cases, the warning message is harmless.

    5.5.4 Structure data members

    Occasionally, a structure will contain data members that are themselves structures. For example:

    typedef struct Foo {
      int x;
    } Foo;
    
    typedef struct Bar {
      int y;
      Foo f;           /* struct member */
    } Bar;
    

    When a structure member is wrapped, it is handled as a pointer, unless the %naturalvar directive is used where it is handled more like a C++ reference (see C++ Member data). The accessors to the member variable as a pointer are effectively wrapped as follows:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    void Bar_f_set(Bar *b, Foo *value) {
      b->f = *value;
    }
    

    The reasons for this are somewhat subtle but have to do with the problem of modifying and accessing data inside the data member. For example, suppose you wanted to modify the value of f.x of a Bar object like this:

    Bar *b;
    b->f.x = 37;
    

    Translating this assignment to function calls (as would be used inside the scripting language interface) results in the following code:

    Bar *b;
    Foo_x_set(Bar_f_get(b), 37);
    

    In this code, if the Bar_f_get() function were to return a Foo instead of a Foo *, then the resulting modification would be applied to a copy of f and not the data member f itself. Clearly that's not what you want!

    It should be noted that this transformation to pointers only occurs if SWIG knows that a data member is a structure or class. For instance, if you had a structure like this,

    struct Foo {
      WORD   w;
    };
    

    and nothing was known about WORD, then SWIG will generate more normal accessor functions like this:

    WORD Foo_w_get(Foo *f) {
        return f->w;
    }
    void Foo_w_set(FOO *f, WORD value) {
        f->w = value;
    }
    

    Compatibility Note: SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes to pointers. Starting in SWIG-1.3.12, this transformation only occurs if a datatype is known to be a structure, class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared datatype is really a struct, simply use a forward struct declaration such as "struct Foo;".

    5.5.5 C constructors and destructors

    When wrapping structures, it is generally useful to have a mechanism for creating and destroying objects. If you don't do anything, SWIG will automatically generate functions for creating and destroying objects using malloc() and free(). Note: the use of malloc() only applies when SWIG is used on C code (i.e., when the -c++ option is not supplied on the command line). C++ is handled differently.

    If you don't want SWIG to generate default constructors for your interfaces, you can use the %nodefaultctor directive or the -nodefaultctor command line option. For example:

    swig -nodefaultctor example.i 
    

    or

    %module foo
    ...
    %nodefaultctor;        // Don't create default constructors
    ... declarations ...
    %clearnodefaultctor;   // Re-enable default constructors
    

    If you need more precise control, %nodefaultctor can selectively target individual structure definitions. For example:

    %nodefaultctor Foo;      // No default constructor for Foo
    ...
    struct Foo {             // No default constructor generated.
    };
    
    struct Bar {             // Default constructor generated.
    };
    

    Since ignoring the implicit or default destructors most of the time produces memory leaks, SWIG will always try to generate them. If needed, however, you can selectively disable the generation of the default/implicit destructor by using %nodefaultdtor

    %nodefaultdtor Foo; // No default/implicit destructor for Foo
    ...
    struct Foo {              // No default destructor is generated.
    };
    
    struct Bar {              // Default destructor generated.
    };
    

    Compatibility note: Prior to SWIG-1.3.7, SWIG did not generate default constructors or destructors unless you explicitly turned them on using -make_default. However, it appears that most users want to have constructor and destructor functions so it has now been enabled as the default behavior.

    Note: There are also the -nodefault option and %nodefault directive, which disable both the default or implicit destructor generation. This could lead to memory leaks across the target languages, and it is highly recommended you don't use them.

    5.5.6 Adding member functions to C structures

    Most languages provide a mechanism for creating classes and supporting object oriented programming. From a C standpoint, object oriented programming really just boils down to the process of attaching functions to structures. These functions normally operate on an instance of the structure (or object). Although there is a natural mapping of C++ to such a scheme, there is no direct mechanism for utilizing it with C code. However, SWIG provides a special %extend directive that makes it possible to attach methods to C structures for purposes of building an object oriented interface. Suppose you have a C header file with the following declaration :

    /* file : vector.h */
    ...
    typedef struct Vector {
      double x, y, z;
    } Vector;
    
    

    You can make a Vector look a lot like a class by writing a SWIG interface like this:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    %include "vector.h"          // Just grab original C header file
    %extend Vector {             // Attach these functions to struct Vector
      Vector(double x, double y, double z) {
        Vector *v;
        v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
      ~Vector() {
        free($self);
      }
      double magnitude() {
        return sqrt($self->x*$self->x+$self->y*$self->y+$self->z*$self->z);
      }
      void print() {
        printf("Vector [%g, %g, %g]\n", $self->x, $self->y, $self->z);
      }
    };
    
    

    Note the usage of the $self special variable. Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required. Also note that C++ constructor and destructor syntax has been used to simulate a constructor and destructor, even for C code. There is one subtle difference to a normal C++ constructor implementation though and that is although the constructor declaration is as per a normal C++ constructor, the newly constructed object must be returned as if the constructor declaration had a return value, a Vector * in this case.

    Now, when used with proxy classes in Python, you can do things like this :

    >>> v = Vector(3, 4, 0)                 # Create a new vector
    >>> print v.magnitude()                # Print magnitude
    5.0
    >>> v.print()                  # Print it out
    [ 3, 4, 0 ]
    >>> del v                      # Destroy it
    

    The %extend directive can also be used inside the definition of the Vector structure. For example:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(double x, double y, double z) { ... }
        ~Vector() { ... }
        ...
      }
    } Vector;
    

    Note that %extend can be used to access externally written functions provided they follow the naming convention used in this example :

    /* File : vector.c */
    /* Vector methods */
    #include "vector.h"
    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = (Vector *) malloc(sizeof(Vector));
      v->x = x;
      v->y = y;
      v->z = z;
      return v;
    }
    void delete_Vector(Vector *v) {
      free(v);
    }
    
    double Vector_magnitude(Vector *v) {
      return sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    
    // File : vector.i
    // Interface file
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(int, int, int); // This calls new_Vector()
        ~Vector();           // This calls delete_Vector()
        double magnitude();  // This will call Vector_magnitude()
        ...
      }
    } Vector;
    

    The name used for %extend should be the name of the struct and not the name of any typedef to the struct. For example:

    typedef struct Integer {
      int value;
    } Int;
    %extend Integer { ...  } /* Correct name */
    %extend Int { ...  } /* Incorrect name */
    
    struct Float {
      float value;
    };
    typedef struct Float FloatValue;
    %extend Float { ...  } /* Correct name */
    %extend FloatValue { ...  } /* Incorrect name */
    

    There is one exception to this rule and that is when the struct is anonymously named such as:

    typedef struct {
      double value;
    } Double;
    %extend Double { ...  } /* Okay */
    

    A little known feature of the %extend directive is that it can also be used to add synthesized attributes or to modify the behavior of existing data attributes. For example, suppose you wanted to make magnitude a read-only attribute of Vector instead of a method. To do this, you might write some code like this:

    // Add a new attribute to Vector
    %extend Vector {
        const double magnitude;
    }
    // Now supply the implementation of the Vector_magnitude_get function
    %{
    const double Vector_magnitude_get(Vector *v) {
      return (const double) sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    %}
    
    

    Now, for all practical purposes, magnitude will appear like an attribute of the object.

    A similar technique can also be used to work with data members that you want to process. For example, consider this interface:

    typedef struct Person {
      char name[50];
      ...
    } Person;
    

    Say you wanted to ensure name was always upper case, you can rewrite the interface as follows to ensure this occurs whenever a name is read or written to:

    typedef struct Person {
      %extend {
        char name[50];
      }
      ...
    } Person;
    
    %{
    #include <string.h>
    #include <ctype.h>
    
    void make_upper(char *name) {
      char *c;
      for (c = name; *c; ++c)
        *c = (char)toupper((int)*c);
    }
    
    /* Specific implementation of set/get functions forcing capitalization */
    
    char *Person_name_get(Person *p) {
      make_upper(p->name);
      return p->name;
    }
    
    void Person_name_set(Person *p, char *val) {
      strncpy(p->name, val, 50);
      make_upper(p->name);
    }
    %}
    

    Finally, it should be stressed that even though %extend can be used to add new data members, these new members can not require the allocation of additional storage in the object (e.g., their values must be entirely synthesized from existing attributes of the structure or obtained elsewhere).

    Compatibility note: The %extend directive is a new name for the %addmethods directive. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    5.5.7 Nested structures

    Occasionally, a C program will involve structures like this :

    typedef struct Object {
      int objtype;
      union {
        int ivalue;
        double dvalue;
        char *strvalue;
        void *ptrvalue;
      } intRep;
    } Object;
    
    

    When SWIG encounters this, it performs a structure splitting operation that transforms the declaration into the equivalent of the following:

    typedef union {
      int ivalue;
      double dvalue;
      char *strvalue;
      void *ptrvalue;
    } Object_intRep;
    
    typedef struct Object {
      int objType;
      Object_intRep intRep;
    } Object;
    
    

    SWIG will then create an Object_intRep structure for use inside the interface file. Accessor functions will be created for both structures. In this case, functions like this would be created :

    Object_intRep *Object_intRep_get(Object *o) {
      return (Object_intRep *) &o->intRep;
    }
    int Object_intRep_ivalue_get(Object_intRep *o) {
      return o->ivalue;
    }
    int Object_intRep_ivalue_set(Object_intRep *o, int value) {
      return (o->ivalue = value);
    }
    double Object_intRep_dvalue_get(Object_intRep *o) {
      return o->dvalue;
    }
    ... etc ...
    
    

    Although this process is a little hairy, it works like you would expect in the target scripting language--especially when proxy classes are used. For instance, in Perl:

    # Perl5 script for accessing nested member
    $o = CreateObject();                    # Create an object somehow
    $o->{intRep}->{ivalue} = 7              # Change value of o.intRep.ivalue
    

    If you have a lot of nested structure declarations, it is advisable to double-check them after running SWIG. Although, there is a good chance that they will work, you may have to modify the interface file in certain cases.

    Finally, note that nesting is handled differently in C++ mode, see Nested classes.

    5.5.8 Other things to note about structure wrapping

    SWIG doesn't care if the declaration of a structure in a .i file exactly matches that used in the underlying C code (except in the case of nested structures). For this reason, there are no problems omitting problematic members or simply omitting the structure definition altogether. If you are happy passing pointers around, this can be done without ever giving SWIG a structure definition.

    Starting with SWIG1.3, a number of improvements have been made to SWIG's code generator. Specifically, even though structure access has been described in terms of high-level accessor functions such as this,

    double Vector_x_get(Vector *v) {
      return v->x;
    }
    

    most of the generated code is actually inlined directly into wrapper functions. Therefore, no function Vector_x_get() actually exists in the generated wrapper file. For example, when creating a Tcl module, the following function is generated instead:

    static int
    _wrap_Vector_x_get(ClientData clientData, Tcl_Interp *interp, 
                       int objc, Tcl_Obj *CONST objv[]) {
      struct Vector *arg1 ;
      double result ;
    
      if (SWIG_GetArgs(interp, objc, objv, "p:Vector_x_get self ", &arg0,
                       SWIGTYPE_p_Vector) == TCL_ERROR)
        return TCL_ERROR;
      result = (double ) (arg1->x);
      Tcl_SetObjResult(interp, Tcl_NewDoubleObj((double) result));
      return TCL_OK;
    }
    

    The only exception to this rule are methods defined with %extend . In this case, the added code is contained in a separate function.

    Finally, it is important to note that most language modules may choose to build a more advanced interface. Although you may never use the low-level interface described here, most of SWIG's language modules use it in some way or another.

    5.6 Code Insertion

    Sometimes it is necessary to insert special code into the resulting wrapper file generated by SWIG. For example, you may want to include additional C code to perform initialization or other operations. There are four common ways to insert code, but it's useful to know how the output of SWIG is structured first.

    5.6.1 The output of SWIG

    When SWIG creates its output C/C++ file, it is broken up into five sections corresponding to runtime code, headers, wrapper functions, and module initialization code (in that order).

    • Begin section.
      A placeholder for users to put code at the beginning of the C/C++ wrapper file. This is most often used to define preprocessor macros that are used in later sections.
    • Runtime code.
      This code is internal to SWIG and is used to include type-checking and other support functions that are used by the rest of the module.
    • Header section.
      This is user-defined support code that has been included by the %{ ... %} directive. Usually this consists of header files and other helper functions.
    • Wrapper code.
      These are the wrappers generated automatically by SWIG.
    • Module initialization.
      The function generated by SWIG to initialize the module upon loading.

    5.6.2 Code insertion blocks

    The %insert directive enables inserting blocks of code into a given section of the generated code. It can be used in one of two ways:

    %insert("section") "filename"
    %insert("section") %{ ... %}
    

    The first will dump the contents of the file in the given filename into the named section. The second inserts the code between the braces into the named section. For example, the following adds code into the runtime section:

    %insert("runtime") %{
      ... code in runtime section ...
    %}
    

    There are the 5 sections, however, some target languages add in additional sections and some of these result in code being generated into a target language file instead of the C/C++ wrapper file. These are documented when available in the target language chapters. Macros named after the code sections are available as additional directives and these macro directives are normally used instead of %insert . For example, %runtime is used instead of %insert("runtime"). The valid sections and order of the sections in the generated C/C++ wrapper file is as shown:

    %begin %{
      ... code in begin section ...
    %}
    
    %runtime %{
      ... code in runtime section ...
    %}
    
    %header %{
      ... code in header section ...
    %}
    
    %wrapper %{
      ... code in wrapper section ...
    %}
    
    %init %{
      ... code in init section ...
    %}
    

    The bare %{ ... %} directive is a shortcut that is the same as %header %{ ... %}.

    The %begin section is effectively empty as it just contains the SWIG banner by default. This section is provided as a way for users to insert code at the top of the wrapper file before any other code is generated. Everything in a code insertion block is copied verbatim into the output file and is not parsed by SWIG. Most SWIG input files have at least one such block to include header files and support C code. Additional code blocks may be placed anywhere in a SWIG file as needed.

    %module mymodule
    %{
    #include "my_header.h"
    %}
    ... Declare functions here
    %{
    
    void some_extra_function() {
      ...
    }
    %}
    

    A common use for code blocks is to write "helper" functions. These are functions that are used specifically for the purpose of building an interface, but which are generally not visible to the normal C program. For example :

    %{
    /* Create a new vector */
    static Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    
    %}
    // Now wrap it 
    Vector *new_Vector();
    

    5.6.3 Inlined code blocks

    Since the process of writing helper functions is fairly common, there is a special inlined form of code block that is used as follows :

    %inline %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    
    

    The %inline directive inserts all of the code that follows verbatim into the header portion of an interface file. The code is then parsed by both the SWIG preprocessor and parser. Thus, the above example creates a new command new_Vector using only one declaration. Since the code inside an %inline %{ ... %} block is given to both the C compiler and SWIG, it is illegal to include any SWIG directives inside a %{ ... %} block.

    5.6.4 Initialization blocks

    When code is included in the %init section, it is copied directly into the module initialization function. For example, if you needed to perform some extra initialization on module loading, you could write this:

    %init %{
      init_variables();
    %}
    

    5.7 An Interface Building Strategy

    This section describes the general approach for building interfaces with SWIG. The specifics related to a particular scripting language are found in later chapters.

    5.7.1 Preparing a C program for SWIG

    SWIG doesn't require modifications to your C code, but if you feed it a collection of raw C header files or source code, the results might not be what you expect---in fact, they might be awful. Here's a series of steps you can follow to make an interface for a C program :

    • Identify the functions that you want to wrap. It's probably not necessary to access every single function of a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are a particularly good source for finding things to wrap.
    • Create a new interface file to describe the scripting language interface to your program.
    • Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
    • Make sure everything in the interface file uses ANSI C/C++ syntax.
    • Make sure all necessary `typedef' declarations and type-information is available in the interface file. In particular, ensure that the type information is specified in the correct order as required by a C/C++ compiler. Most importantly, define a type before it is used! A C compiler will tell you if the full type information is not available if it is needed, whereas SWIG will usually not warn or error out as it is designed to work without full type information. However, if type information is not specified correctly, the wrappers can be sub-optimal and even result in uncompilable C/C++ code.
    • If your program has a main() function, you may need to rename it (read on).
    • Run SWIG and compile.

    Although this may sound complicated, the process turns out to be fairly easy once you get the hang of it.

    In the process of building an interface, SWIG may encounter syntax errors or other problems. The best way to deal with this is to simply copy the offending code into a separate interface file and edit it. However, the SWIG developers have worked very hard to improve the SWIG parser--you should report parsing errors to the swig-devel mailing list or to the SWIG bug tracker.

    5.7.2 The SWIG interface file

    The preferred method of using SWIG is to generate a separate interface file. Suppose you have the following C header file :

    /* File : header.h */
    
    #include <stdio.h>
    #include <math.h>
    
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    A typical SWIG interface file for this header file would look like the following :

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    Of course, in this case, our header file is pretty simple so we could use a simpler approach and use an interface file like this:

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    %include "header.h"
    

    The main advantage of this approach is minimal maintenance of an interface file for when the header file changes in the future. In more complex projects, an interface file containing numerous %include and #include statements like this is one of the most common approaches to interface file design due to lower maintenance overhead.

    5.7.3 Why use separate interface files?

    Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package. There are several reasons why you might want to do this:

    • It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
    • Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
    • Interface files can provide more structure and organization.
    • SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
    • Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files.

    5.7.4 Getting the right header files

    Sometimes, it is necessary to use certain header files in order for the code generated by SWIG to compile properly. Make sure you include certain header files by using a %{ %} block like this:

    %module graphics
    %{
    #include <GL/gl.h>
    #include <GL/glu.h>
    %}
    
    // Put the rest of the declarations here
    ...
    

    5.7.5 What to do with main()

    If your program defines a main() function, you may need to get rid of it or rename it in order to use a scripting language. Most scripting languages define their own main() procedure that is called instead. main() also makes no sense when working with dynamic loading. There are a few approaches to solving the main() conflict :

    • Get rid of main() entirely.
    • Rename main() to something else. You can do this by compiling your C program with an option like -Dmain=oldmain.
    • Use conditional compilation to only include main() when not using a scripting language.

    Getting rid of main() may cause potential initialization problems of a program. To handle this problem, you may consider writing a special function called program_init() that initializes your program upon startup. This function could then be called either from the scripting language as the first operation, or when the SWIG generated module is loaded.

    As a general note, many C programs only use the main() function to parse command line options and to set parameters. However, by using a scripting language, you are probably trying to create a program that is more interactive. In many cases, the old main() program can be completely replaced by a Perl, Python, or Tcl script.

    Note: In some cases, you might be inclined to create a scripting language wrapper for main(). If you do this, the compilation will probably work and your module might even load correctly. The only trouble is that when you call your main() wrapper, you will find that it actually invokes the main() of the scripting language interpreter itself! This behavior is a side effect of the symbol binding mechanism used in the dynamic linker. The bottom line: don't do this.


    6 SWIG and C++

    This chapter describes SWIG's support for wrapping C++. As a prerequisite, you should first read the chapter SWIG Basics to see how SWIG wraps ANSI C. Support for C++ builds upon ANSI C wrapping and that material will be useful in understanding this chapter.

    6.1 Comments on C++ Wrapping

    Because of its complexity and the fact that C++ can be difficult to integrate with itself let alone other languages, SWIG only provides support for a subset of C++ features. Fortunately, this is now a rather large subset.

    In part, the problem with C++ wrapping is that there is no semantically obvious (or automatic ) way to map many of its advanced features into other languages. As a simple example, consider the problem of wrapping C++ multiple inheritance to a target language with no such support. Similarly, the use of overloaded operators and overloaded functions can be problematic when no such capability exists in a target language.

    A more subtle issue with C++ has to do with the way that some C++ programmers think about programming libraries. In the world of SWIG, you are really trying to create binary-level software components for use in other languages. In order for this to work, a "component" has to contain real executable instructions and there has to be some kind of binary linking mechanism for accessing its functionality. In contrast, C++ has increasingly relied upon generic programming and templates for much of its functionality. Although templates are a powerful feature, they are largely orthogonal to the whole notion of binary components and libraries. For example, an STL vector does not define any kind of binary object for which SWIG can just create a wrapper. To further complicate matters, these libraries often utilize a lot of behind the scenes magic in which the semantics of seemingly basic operations (e.g., pointer dereferencing, procedure call, etc.) can be changed in dramatic and sometimes non-obvious ways. Although this "magic" may present few problems in a C++-only universe, it greatly complicates the problem of crossing language boundaries and provides many opportunities to shoot yourself in the foot. You will just have to be careful.

    6.2 Approach

    To wrap C++, SWIG uses a layered approach to code generation. At the lowest level, SWIG generates a collection of procedural ANSI-C style wrappers. These wrappers take care of basic type conversion, type checking, error handling, and other low-level details of the C++ binding. These wrappers are also sufficient to bind C++ into any target language that supports built-in procedures. In some sense, you might view this layer of wrapping as providing a C library interface to C++. On top of the low-level procedural (flattened) interface, SWIG generates proxy classes that provide a natural object-oriented (OO) interface to the underlying code. The proxy classes are typically written in the target language itself. For instance, in Python, a real Python class is used to provide a wrapper around the underlying C++ object.

    It is important to emphasize that SWIG takes a deliberately conservative and non-intrusive approach to C++ wrapping. SWIG does not encapsulate C++ classes inside a special C++ adaptor, it does not rely upon templates, nor does it add in additional C++ inheritance when generating wrappers. The last thing that most C++ programs need is even more compiler magic. Therefore, SWIG tries to maintain a very strict and clean separation between the implementation of your C++ application and the resulting wrapper code. You might say that SWIG has been written to follow the principle of least surprise--it does not play sneaky tricks with the C++ type system, it doesn't mess with your class hierarchies, and it doesn't introduce new semantics. Although this approach might not provide the most seamless integration with C++, it is safe, simple, portable, and debuggable.

    Some of this chapter focuses on the low-level procedural interface to C++ that is used as the foundation for all language modules. Keep in mind that the target languages also provide the high-level OO interface via proxy classes. More detailed coverage can be found in the documentation for each target language.

    6.3 Supported C++ features

    SWIG currently supports most C++ features including the following:

    • Classes
    • Constructors and destructors
    • Virtual functions
    • Public inheritance (including multiple inheritance)
    • Static functions
    • Function and method overloading
    • Operator overloading for many standard operators
    • References
    • Templates (including specialization and member templates)
    • Pointers to members
    • Namespaces
    • Default parameters
    • Smart pointers

    The following C++ features are not currently supported:

    • Overloaded versions of certain operators (new, delete, etc.)

    As a rule of thumb, SWIG should not be used on raw C++ source files, use header files only.

    SWIG's C++ support is an ongoing project so some of these limitations may be lifted in future releases. However, we make no promises. Also, submitting a bug report is a very good way to get problems fixed (wink).

    6.4 Command line options and compilation

    When wrapping C++ code, it is critical that SWIG be called with the `-c++' option. This changes the way a number of critical features such as memory management are handled. It also enables the recognition of C++ keywords. Without the -c++ flag, SWIG will either issue a warning or a large number of syntax errors if it encounters C++ code in an interface file.

    When compiling and linking the resulting wrapper file, it is normal to use the C++ compiler. For example:

    $ swig -c++ -tcl example.i
    $ c++ -fPIC -c example_wrap.cxx 
    $ c++ example_wrap.o $(OBJS) -o example.so
    

    Unfortunately, the process varies slightly on each platform. Make sure you refer to the documentation on each target language for further details. The SWIG Wiki also has further details.

    Compatibility Note: Early versions of SWIG generated just a flattened low-level C style API to C++ classes by default. The -noproxy commandline option is recognised by many target languages and will generate just this interface as in earlier versions.

    6.5 Proxy classes

    In order to provide a natural mapping from C++ classes to the target language classes, SWIG's target languages mostly wrap C++ classes with special proxy classes. These proxy classes are typically implemented in the target language itself. For example, if you're building a Python module, each C++ class is wrapped by a Python proxy class. Or if you're building a Java module, each C++ class is wrapped by a Java proxy class.

    6.5.1 Construction of proxy classes

    Proxy classes are always constructed as an extra layer of wrapping that uses low-level accessor functions. To illustrate, suppose you had a C++ class like this:

    class Foo {
      public:
        Foo();
        ~Foo();
        int  bar(int x);
        int  x;
    };
    

    Using C++ as pseudocode, a proxy class looks something like this:

    class FooProxy {
      private:
        Foo    *self;
      public:
        FooProxy() {
          self = new_Foo();
        }
        ~FooProxy() {
          delete_Foo(self);
        }
        int bar(int x) {
          return Foo_bar(self, x);
        }
        int x_get() {
          return Foo_x_get(self);
        }
        void x_set(int x) {
          Foo_x_set(self, x);
        }
    };
    

    Of course, always keep in mind that the real proxy class is written in the target language. For example, in Python, the proxy might look roughly like this:

    class Foo:
        def __init__(self):
            self.this = new_Foo()
        def __del__(self):
            delete_Foo(self.this)
        def bar(self, x):
            return Foo_bar(self.this, x)
        def __getattr__(self, name):
            if name == 'x':
                return Foo_x_get(self.this)
            ...
        def __setattr__(self, name, value):
            if name == 'x':
                Foo_x_set(self.this, value)
            ...
    

    Again, it's important to emphasize that the low-level accessor functions are always used by the proxy classes. Whenever possible, proxies try to take advantage of language features that are similar to C++. This might include operator overloading, exception handling, and other features.

    6.5.2 Resource management in proxies

    A major issue with proxies concerns the memory management of wrapped objects. Consider the following C++ code:

    class Foo {
    public:
      Foo();
      ~Foo();
      int bar(int x);
      int x;
    };
    
    class Spam {
    public:
          Foo *value;
          ...
    };
    

    Consider some script code that uses these classes:

    f = Foo()               # Creates a new Foo
    s = Spam()              # Creates a new Spam
    s.value = f             # Stores a reference to f inside s
    g = s.value             # Returns stored reference
    g = 4                   # Reassign g to some other value
    del f                   # Destroy f 
    

    Now, ponder the resulting memory management issues. When objects are created in the script, the objects are wrapped by newly created proxy classes. That is, there is both a new proxy class instance and a new instance of the underlying C++ class. In this example, both f and s are created in this way. However, the statement s.value is rather curious---when executed, a pointer to f is stored inside another object. This means that the scripting proxy class AND another C++ class share a reference to the same object. To make matters even more interesting, consider the statement g = s.value. When executed, this creates a new proxy class g that provides a wrapper around the C++ object stored in s.value . In general, there is no way to know where this object came from---it could have been created by the script, but it could also have been generated internally. In this particular example, the assignment of g results in a second proxy class for f. In other words, a reference to f is now shared by two proxy classes and a C++ class.

    Finally, consider what happens when objects are destroyed. In the statement, g=4, the variable g is reassigned. In many languages, this makes the old value of g available for garbage collection. Therefore, this causes one of the proxy classes to be destroyed. Later on, the statement del f destroys the other proxy class. Of course, there is still a reference to the original object stored inside another C++ object. What happens to it? Is the object still valid?

    To deal with memory management problems, proxy classes provide an API for controlling ownership. In C++ pseudocode, ownership control might look roughly like this:

    class FooProxy {
      public:
        Foo    *self;
        int     thisown;
    
        FooProxy() {
          self = new_Foo();
          thisown = 1;       // Newly created object
        }
        ~FooProxy() {
          if (thisown) delete_Foo(self);
        }
        ...
        // Ownership control API
        void disown() {
          thisown = 0;
        }
        void acquire() {
          thisown = 1;
        }
    };
    
    class FooPtrProxy: public FooProxy {
    public:
      FooPtrProxy(Foo *s) {
        self = s;
        thisown = 0;
      }
    };
    
    class SpamProxy {
      ...
      FooProxy *value_get() {
        return FooPtrProxy(Spam_value_get(self));
      }
      void value_set(FooProxy *v) {
        Spam_value_set(self, v->self);
        v->disown();
      }
      ...
    };
    

    Looking at this code, there are a few central features:

    • Each proxy class keeps an extra flag to indicate ownership. C++ objects are only destroyed if the ownership flag is set.
    • When new objects are created in the target language, the ownership flag is set.
    • When a reference to an internal C++ object is returned, it is wrapped by a proxy class, but the proxy class does not have ownership.
    • In certain cases, ownership is adjusted. For instance, when a value is assigned to the member of a class, ownership is lost.
    • Manual ownership control is provided by special disown() and acquire() methods.

    Given the tricky nature of C++ memory management, it is impossible for proxy classes to automatically handle every possible memory management problem. However, proxies do provide a mechanism for manual control that can be used (if necessary) to address some of the more tricky memory management problems.

    6.5.3 Language specific details

    Language specific details on proxy classes are contained in the chapters describing each target language. This chapter has merely introduced the topic in a very general way.

    6.6 Simple C++ wrapping

    The following code shows a SWIG interface file for a simple C++ class.

    %module list
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example for linked list
    
    class List {
    public:
      List();
      ~List();
      int  search(char *value);
      void insert(char *);
      void remove(char *);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    To generate wrappers for this class, SWIG first reduces the class to a collection of low-level C-style accessor functions which are then used by the proxy classes.

    6.6.1 Constructors and destructors

    C++ constructors and destructors are translated into accessor functions such as the following :

    List * new_List(void) {
      return new List;
    }
    void delete_List(List *l) {
      delete l;
    }
    
    

    6.6.2 Default constructors, copy constructors and implicit destructors

    Following the C++ rules for implicit constructor and destructors, SWIG will automatically assume there is one even when they are not explicitly declared in the class interface.

    In general then:

    • If a C++ class does not declare any explicit constructor, SWIG will automatically generate a wrapper for one.
    • If a C++ class does not declare an explicit copy constructor, SWIG will automatically generate a wrapper for one if the %copyctor is used.
    • If a C++ class does not declare an explicit destructor, SWIG will automatically generate a wrapper for one.

    And as in C++, a few rules that alters the previous behavior:

    • A default constructor is not created if a class already defines a constructor with arguments.
    • Default constructors are not generated for classes with pure virtual methods or for classes that inherit from an abstract class, but don't provide definitions for all of the pure methods.
    • A default constructor is not created unless all base classes support a default constructor.
    • Default constructors and implicit destructors are not created if a class defines them in a private or protected section.
    • Default constructors and implicit destructors are not created if any base class defines a non-public default constructor or destructor.

    SWIG should never generate a default constructor, copy constructor or default destructor wrapper for a class in which it is illegal to do so. In some cases, however, it could be necessary (if the complete class declaration is not visible from SWIG, and one of the above rules is violated) or desired (to reduce the size of the final interface) by manually disabling the implicit constructor/destructor generation.

    To manually disable these, the %nodefaultctor and %nodefaultdtor feature flag directives can be used. Note that these directives only affects the implicit generation, and they have no effect if the default/copy constructors or destructor are explicitly declared in the class interface.

    For example:

    %nodefaultctor Foo;  // Disable the default constructor for class Foo.
    class Foo {          // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {          // A default constructor is generated, if possible
    ...
    };
    

    The directive %nodefaultctor can also be applied "globally", as in:

    %nodefaultctor; // Disable creation of default constructors
    class Foo {     // No default constructor is generated, unless one is declared
    ...
    };
    class Bar {   
    public:
      Bar();        // The default constructor is generated, since one is declared
    };
    %clearnodefaultctor; // Enable the creation of default constructors again
    

    The corresponding %nodefaultdtor directive can be used to disable the generation of the default or implicit destructor, if needed. Be aware, however, that this could lead to memory leaks in the target language. Hence, it is recommended to use this directive only in well known cases. For example:

    %nodefaultdtor Foo;   // Disable the implicit/default destructor for class Foo.
    class Foo {           // No destructor is generated, unless one is declared
    ...
    };
    

    Compatibility Note: The generation of default constructors/implicit destructors was made the default behavior in SWIG 1.3.7. This may break certain older modules, but the old behavior can be easily restored using %nodefault or the -nodefault command line option. Furthermore, in order for SWIG to properly generate (or not generate) default constructors, it must be able to gather information from both the private and protected sections (specifically, it needs to know if a private or protected constructor/destructor is defined). In older versions of SWIG, it was fairly common to simply remove or comment out the private and protected sections of a class due to parser limitations. However, this removal may now cause SWIG to erroneously generate constructors for classes that define a constructor in those sections. Consider restoring those sections in the interface or using %nodefault to fix the problem.

    Note: The %nodefault directive/-nodefault options described above, which disable both the default constructor and the implicit destructors, could lead to memory leaks, and so it is strongly recommended to not use them.

    6.6.3 When constructor wrappers aren't created

    If a class defines a constructor, SWIG normally tries to generate a wrapper for it. However, SWIG will not generate a constructor wrapper if it thinks that it will result in illegal wrapper code. There are really two cases where this might show up.

    First, SWIG won't generate wrappers for protected or private constructors. For example:

    class Foo {
    protected:
      Foo();         // Not wrapped.
    public:
        ...
    };
    

    Next, SWIG won't generate wrappers for a class if it appears to be abstract--that is, it has undefined pure virtual methods. Here are some examples:

    class Bar {
    public:
      Bar();               // Not wrapped.  Bar is abstract.
      virtual void spam(void) = 0;
    };
    
    class Grok : public Bar {
    public:
          Grok();            // Not wrapped. No implementation of abstract spam().
    };
    

    Some users are surprised (or confused) to find missing constructor wrappers in their interfaces. In almost all cases, this is caused when classes are determined to be abstract. To see if this is the case, run SWIG with all of its warnings turned on:

    % swig -Wall -python module.i
    

    In this mode, SWIG will issue a warning for all abstract classes. It is possible to force a class to be non-abstract using this:

    %feature("notabstract") Foo;
    
    class Foo : public Bar {
    public:
      Foo();    // Generated no matter what---not abstract.
      ...
    };
    

    More information about %feature can be found in the Customization features chapter.

    6.6.4 Copy constructors

    If a class defines more than one constructor, its behavior depends on the capabilities of the target language. If overloading is supported, the copy constructor is accessible using the normal constructor function. For example, if you have this:

    class List {
    public:
        List();    
        List(const List &);      // Copy constructor
        ...
    };
    

    then the copy constructor can be used as follows:

    x = List()               # Create a list
    y = List(x)              # Copy list x
    

    If the target language does not support overloading, then the copy constructor is available through a special function like this:

    List *copy_List(List *f) {
        return new List(*f);
    }
    

    Note: For a class X, SWIG only treats a constructor as a copy constructor if it can be applied to an object of type X or X *. If more than one copy constructor is defined, only the first definition that appears is used as the copy constructor--other definitions will result in a name-clash. Constructors such as X(const X &), X(X &), and X(X *) are handled as copy constructors in SWIG.

    Note: SWIG does not generate a copy constructor wrapper unless one is explicitly declared in the class. This differs from the treatment of default constructors and destructors. However, copy constructor wrappers can be generated if using the copyctor feature flag. For example:

    %copyctor List;
    
    class List {
    public:
        List();    
    };
    

    Will generate a copy constructor wrapper for List.

    Compatibility note: Special support for copy constructors was not added until SWIG-1.3.12. In previous versions, copy constructors could be wrapped, but they had to be renamed. For example:

    class Foo {
    public:
        Foo();
      %name(CopyFoo) Foo(const Foo &);
        ...
    };
    

    For backwards compatibility, SWIG does not perform any special copy-constructor handling if the constructor has been manually renamed. For instance, in the above example, the name of the constructor is set to new_CopyFoo(). This is the same as in older versions.

    6.6.5 Member functions

    All member functions are roughly translated into accessor functions like this :

    int List_search(List *obj, char *value) {
      return obj->search(value);
    }
    
    

    This translation is the same even if the member function has been declared as virtual.

    It should be noted that SWIG does not actually create a C accessor function in the code it generates. Instead, member access such as obj->search(value) is directly inlined into the generated wrapper functions. However, the name and calling convention of the low-level procedural wrappers match the accessor function prototype described above.

    6.6.6 Static members

    Static member functions are called directly without making any special transformations. For example, the static member function print(List *l) directly invokes List::print(List *l) in the generated wrapper code.

    6.6.7 Member data

    Member data is handled in exactly the same manner as for C structures. A pair of accessor functions are effectively created. For example :

    int List_length_get(List *obj) {
      return obj->length;
    }
    int List_length_set(List *obj, int value) {
      obj->length = value;
      return value;
    }
    
    

    A read-only member can be created using the %immutable and %mutable feature flag directive. For example, we probably wouldn't want the user to change the length of a list so we could do the following to make the value available, but read-only.

    class List {
    public:
    ...
    %immutable;
      int length;
    %mutable;
    ...
    };
    

    Alternatively, you can specify an immutable member in advance like this:

    %immutable List::length;
    ...
    class List {
      ...
      int length;         // Immutable by above directive
      ...
    };
    

    Similarly, all data attributes declared as const are wrapped as read-only members.

    By default, SWIG uses the const reference typemaps for members that are primitive types. There are some subtle issues when wrapping data members that are not primitive types, such as classes. For instance, if you had another class like this,

    class Foo {
    public:
        List items;
        ...
    

    then the low-level accessor to the items member actually uses pointers. For example:

    List *Foo_items_get(Foo *self) {
        return &self->items;
    }
    void Foo_items_set(Foo *self, List *value) {
        self->items = *value;
    }
    

    More information about this can be found in the SWIG Basics chapter, Structure data members section.

    The wrapper code to generate the accessors for classes comes from the pointer typemaps. This can be somewhat unnatural for some types. For example, a user would expect the STL std::string class member variables to be wrapped as a string in the target language, rather than a pointer to this class. The const reference typemaps offer this type of marshalling, so there is a feature to tell SWIG to use the const reference typemaps rather than the pointer typemaps. It is the naturalvar feature and can be used to effectively change the way accessors are generated to the following:

    const List &Foo_items_get(Foo *self) {
        return self->items;
    }
    void Foo_items_set(Foo *self, const List &value) {
        self->items = value;
    }
    

    The %naturalvar directive is a macro for, and hence equivalent to, %feature("naturalvar"). It can be used as follows:

    // All List variables will use const List& typemaps
    %naturalvar List;
    
    // Only Foo::myList will use const List& typemaps
    %naturalvar Foo::myList;
    struct Foo {
      List myList;
    };
    
    // All non-primitive types will use const reference typemaps
    %naturalvar;
    

    The observant reader will notice that %naturalvar works like any other feature flag directive but with some extra flexibility. The first of the example usages above shows %naturalvar attaching to the myList 's variable type, that is the List class. The second usage shows %naturalvar attaching to the variable name. Hence the naturalvar feature can be used on either the variable's name or type. Note that using the naturalvar feature on a variable's name overrides any naturalvar feature attached to the variable's type.

    It is generally a good idea to use this feature globally as the reference typemaps have extra NULL checking compared to the pointer typemaps. A pointer can be NULL, whereas a reference cannot, so the extra checking ensures that the target language user does not pass in a value that translates to a NULL pointer and thereby preventing any potential NULL pointer dereferences. The %naturalvar feature will apply to global variables in addition to member variables in some language modules, eg C# and Java.

    The naturalvar behavior can also be turned on as a global setting via the -naturalvar commandline option or the module mode option, %module(naturalvar=1). However, any use of %feature("naturalvar") will override the global setting.

    Compatibility note: The %naturalvar feature was introduced in SWIG-1.3.28, prior to which it was necessary to manually apply the const reference typemaps, eg %apply const std::string & { std::string * }, but this example would also apply the typemaps to methods taking a std::string pointer.

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    Compatibility note: Prior to SWIG-1.3.12, all members of unknown type were wrapped into accessor functions using pointers. For example, if you had a structure like this

    struct Foo {
      size_t  len;
    };
    

    and nothing was known about size_t, then accessors would be written to work with size_t *. Starting in SWIG-1.3.12, this behavior has been modified. Specifically, pointers will only be used if SWIG knows that a datatype corresponds to a structure or class. Therefore, the above code would be wrapped into accessors involving size_t. This change is subtle, but it smooths over a few problems related to structure wrapping and some of SWIG's customization features.

    6.7 Default arguments

    SWIG will wrap all types of functions that have default arguments. For example member functions:

    class Foo {
    public:
        void bar(int x, int y = 3, int z = 4);
    };
    

    SWIG handles default arguments by generating an extra overloaded method for each defaulted argument. SWIG is effectively handling methods with default arguments as if it was wrapping the equivalent overloaded methods. Thus for the example above, it is as if we had instead given the following to SWIG:

    class Foo {
    public:
        void bar(int x, int y, int z);
        void bar(int x, int y);
        void bar(int x);
    };
    

    The wrappers produced are exactly the same as if the above code was instead fed into SWIG. Details of this are covered later in the Wrapping Overloaded Functions and Methods section. This approach allows SWIG to wrap all possible default arguments, but can be verbose. For example if a method has ten default arguments, then eleven wrapper methods are generated.

    Please see the Features and default arguments section for more information on using %feature with functions with default arguments. The Ambiguity resolution and renaming section also deals with using %rename and %ignore on methods with default arguments. If you are writing your own typemaps for types used in methods with default arguments, you may also need to write a typecheck typemap. See the Typemaps and overloading section for details or otherwise use the compactdefaultargs feature flag as mentioned below.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped default arguments slightly differently. Instead a single wrapper method was generated and the default values were copied into the C++ wrappers so that the method being wrapped was then called with all the arguments specified. If the size of the wrappers are a concern then this approach to wrapping methods with default arguments can be re-activated by using the compactdefaultargs feature flag.

    %feature("compactdefaultargs") Foo::bar;
    class Foo {
    public:
        void bar(int x, int y = 3, int z = 4);
    };
    

    This is great for reducing the size of the wrappers, but the caveat is it does not work for the statically typed languages, such as C# and Java, which don't have optional arguments in the language, Another restriction of this feature is that it cannot handle default arguments that are not public. The following example illustrates this:

    class Foo {
    private:
      static const int spam;
    public:
      void bar(int x, int y = spam);   // Won't work with %feature("compactdefaultargs") -
                                       // private default value
    };
    

    This produces uncompilable wrapper code because default values in C++ are evaluated in the same scope as the member function whereas SWIG evaluates them in the scope of a wrapper function (meaning that the values have to be public).

    The compactdefaultargs feature is automatically turned on when wrapping C code with default arguments. Some target languages will also automatically turn on this feature if the keyword arguments feature (kwargs) is specified for either C or C++ functions, and the target language supports kwargs, the compactdefaultargs feature is also automatically turned on. Keyword arguments are a language feature of some scripting languages, for example Ruby and Python. SWIG is unable to support kwargs when wrapping overloaded methods, so the default approach cannot be used.

    6.8 Protection

    SWIG wraps class members that are public following the C++ conventions, i.e., by explicit public declaration or by the use of the using directive. In general, anything specified in a private or protected section will be ignored, although the internal code generator sometimes looks at the contents of the private and protected sections so that it can properly generate code for default constructors and destructors. Directors could also modify the way non-public virtual protected members are treated.

    By default, members of a class definition are assumed to be private until you explicitly give a `public:' declaration (This is the same convention used by C++).

    6.9 Enums and constants

    Enumerations and constants are handled differently by the different language modules and are described in detail in the appropriate language chapter. However, many languages map enums and constants in a class definition into constants with the classname as a prefix. For example :

    class Swig {
    public:
      enum {ALE, LAGER, PORTER, STOUT};
    };
    
    

    Generates the following set of constants in the target scripting language :

    Swig_ALE = Swig::ALE
    Swig_LAGER = Swig::LAGER
    Swig_PORTER = Swig::PORTER
    Swig_STOUT = Swig::STOUT
    
    

    Members declared as const are wrapped as read-only members and do not create constants.

    6.10 Friends

    Friend declarations are recognised by SWIG. For example, if you have this code:

    class Foo {
    public:
      ...
      friend void blah(Foo *f);
      ...
    };
    

    then the friend declaration does result in a wrapper code equivalent to one generated for the following declaration

    class Foo {
    public:
        ...
    };
    
    void blah(Foo *f);    
    

    A friend declaration, as in C++, is understood to be in the same scope where the class is declared, hence, you can have

    
    %ignore bar::blah(Foo *f);
    
    namespace bar {
    
      class Foo {
      public:
        ...
        friend void blah(Foo *f);
        ...
      };
    }
    

    and a wrapper for the method 'blah' will not be generated.

    6.11 References and pointers

    C++ references are supported, but SWIG transforms them back into pointers. For example, a declaration like this :

    class Foo {
    public:
      double bar(double &a);
    }
    

    has a low-level accessor

    double Foo_bar(Foo *obj, double *a) {
      obj->bar(*a);
    }
    

    As a special case, most language modules pass const references to primitive datatypes (int, short, float, etc.) by value instead of pointers. For example, if you have a function like this,

    void foo(const int &x);
    

    it is called from a script as follows:

    foo(3)              # Notice pass by value
    

    Functions that return a reference are remapped to return a pointer instead. For example:

    class Bar {
    public:
      Foo &spam();
    };
    

    Generates an accessor like this:

    Foo *Bar_spam(Bar *obj) {
      Foo &result = obj->spam();
      return &result;
    }
    

    However, functions that return const references to primitive datatypes (int, short, etc.) normally return the result as a value rather than a pointer. For example, a function like this,

    const int &bar();
    

    will return integers such as 37 or 42 in the target scripting language rather than a pointer to an integer.

    Don't return references to objects allocated as local variables on the stack. SWIG doesn't make a copy of the objects so this will probably cause your program to crash.

    Note: The special treatment for references to primitive datatypes is necessary to provide more seamless integration with more advanced C++ wrapping applications---especially related to templates and the STL. This was first added in SWIG-1.3.12.

    6.12 Pass and return by value

    Occasionally, a C++ program will pass and return class objects by value. For example, a function like this might appear:

    Vector cross_product(Vector a, Vector b);
    

    If no information is supplied about Vector, SWIG creates a wrapper function similar to the following:

    Vector *wrap_cross_product(Vector *a, Vector *b) {
      Vector x = *a;
      Vector y = *b;
      Vector r = cross_product(x, y);
      return new Vector(r);
    }

    In order for the wrapper code to compile, Vector must define a copy constructor and a default constructor.

    If Vector is defined as a class in the interface, but it does not support a default constructor, SWIG changes the wrapper code by encapsulating the arguments inside a special C++ template wrapper class, through a process called the "Fulton Transform". This produces a wrapper that looks like this:

    Vector cross_product(Vector *a, Vector *b) {
      SwigValueWrapper<Vector> x = *a;
      SwigValueWrapper<Vector> y = *b;
      SwigValueWrapper<Vector> r = cross_product(x, y);
      return new Vector(r);
    }
    

    This transformation is a little sneaky, but it provides support for pass-by-value even when a class does not provide a default constructor and it makes it possible to properly support a number of SWIG's customization options. The definition of SwigValueWrapper can be found by reading the SWIG wrapper code. This class is really nothing more than a thin wrapper around a pointer.

    Although SWIG usually detects the classes to which the Fulton Transform should be applied, in some situations it's necessary to override it. That's done with %feature("valuewrapper") to ensure it is used and %feature("novaluewrapper") to ensure it is not used:

    %feature("novaluewrapper") A;    
    class A;
    
    %feature("valuewrapper") B;
    struct B { 
        B();
        // ....
    };   
    

    It is well worth considering turning this feature on for classes that do have a default constructor. It will remove a redundant constructor call at the point of the variable declaration in the wrapper, so will generate notably better performance for large objects or for classes with expensive construction. Alternatively consider returning a reference or a pointer.

    Note: this transformation has no effect on typemaps or any other part of SWIG---it should be transparent except that you may see this code when reading the SWIG output file.

    Note: This template transformation is new in SWIG-1.3.11 and may be refined in future SWIG releases. In practice, it is only absolutely necessary to do this for classes that don't define a default constructor.

    Note: The use of this template only occurs when objects are passed or returned by value. It is not used for C++ pointers or references.

    6.13 Inheritance

    SWIG supports C++ inheritance of classes and allows both single and multiple inheritance, as limited or allowed by the target language. The SWIG type-checker knows about the relationship between base and derived classes and allows pointers to any object of a derived class to be used in functions of a base class. The type-checker properly casts pointer values and is safe to use with multiple inheritance.

    SWIG treats private or protected inheritance as close to the C++ spirit, and target language capabilities, as possible. In most cases, this means that SWIG will parse the non-public inheritance declarations, but that will have no effect in the generated code, besides the implicit policies derived for constructors and destructors.

    The following example shows how SWIG handles inheritance. For clarity, the full C++ code has been omitted.

    // shapes.i
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      double x, y;
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    

    When wrapped into Python, we can perform the following operations (shown using the low level Python accessors):

    $ python
    >>> import shapes
    >>> circle = shapes.new_Circle(7)
    >>> square = shapes.new_Square(10)
    >>> print shapes.Circle_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(circle)
    153.93804004599999757
    >>> print shapes.Shape_area(square)
    100.00000000000000000
    >>> shapes.Shape_set_location(square, 2, -3)
    >>> print shapes.Shape_perimeter(square)
    40.00000000000000000
    >>>
    

    In this example, Circle and Square objects have been created. Member functions can be invoked on each object by making calls to Circle_area, Square_area, and so on. However, the same results can be accomplished by simply using the Shape_area function on either object.

    One important point concerning inheritance is that the low-level accessor functions are only generated for classes in which they are actually declared. For instance, in the above example, the method set_location() is only accessible as Shape_set_location() and not as Circle_set_location() or Square_set_location() . Of course, the Shape_set_location() function will accept any kind of object derived from Shape. Similarly, accessor functions for the attributes x and y are generated as Shape_x_get(), Shape_x_set(), Shape_y_get(), and Shape_y_set(). Functions such as Circle_x_get() are not available--instead you should use Shape_x_get().

    Note that there is a one to one correlation between the low-level accessor functions and the proxy methods and therefore there is also a one to one correlation between the C++ class methods and the generated proxy class methods.

    Note: For the best results, SWIG requires all base classes to be defined in an interface. Otherwise, you may get a warning message like this:

    example.i:18: Warning 401: Nothing known about base class 'Foo'. Ignored.
    

    If any base class is undefined, SWIG still generates correct type relationships. For instance, a function accepting a Foo * will accept any object derived from Foo regardless of whether or not SWIG actually wrapped the Foo class. If you really don't want to generate wrappers for the base class, but you want to silence the warning, you might consider using the %import directive to include the file that defines Foo. %import simply gathers type information, but doesn't generate wrappers. Alternatively, you could just define Foo as an empty class in the SWIG interface or use warning suppression .

    Note: typedef-names can be used as base classes. For example:

    class Foo {
    ...
    };
    
    typedef Foo FooObj;
    class Bar : public FooObj {     // Ok.  Base class is Foo
    ...
    };
    

    Similarly, typedef allows unnamed structures to be used as base classes. For example:

    typedef struct {
      ...
    } Foo;
    
    class Bar : public Foo {    // Ok. 
    ...
    };
    

    Compatibility Note: Starting in version 1.3.7, SWIG only generates low-level accessor wrappers for the declarations that are actually defined in each class. This differs from SWIG1.1 which used to inherit all of the declarations defined in base classes and regenerate specialized accessor functions such as Circle_x_get(), Square_x_get(), Circle_set_location(), and Square_set_location(). This behavior resulted in huge amounts of replicated code for large class hierarchies and made it awkward to build applications spread across multiple modules (since accessor functions are duplicated in every single module). It is also unnecessary to have such wrappers when advanced features like proxy classes are used. Note: Further optimizations are enabled when using the -fvirtual option, which avoids the regenerating of wrapper functions for virtual members that are already defined in a base class.

    6.14 A brief discussion of multiple inheritance, pointers, and type checking

    When a target scripting language refers to a C++ object, it normally uses a tagged pointer object that contains both the value of the pointer and a type string. For example, in Tcl, a C++ pointer might be encoded as a string like this:

    _808fea88_p_Circle
    

    A somewhat common question is whether or not the type-tag could be safely removed from the pointer. For instance, to get better performance, could you strip all type tags and just use simple integers instead?

    In general, the answer to this question is no. In the wrappers, all pointers are converted into a common data representation in the target language. Typically this is the equivalent of casting a pointer to void *. This means that any C++ type information associated with the pointer is lost in the conversion.

    The problem with losing type information is that it is needed to properly support many advanced C++ features--especially multiple inheritance. For example, suppose you had code like this:

    class A {
    public:
      int x;
    };
    
    class B {
    public:
      int y;
    };
    
    class C : public A, public B {
    };
    
    int A_function(A *a) {
      return a->x;
    }
    
    int B_function(B *b) {
      return b->y;
    }
    

    Now, consider the following code that uses void *.

    C *c = new C();
    void *p = (void *) c;
    ...
    int x = A_function((A *) p);
    int y = B_function((B *) p);
    

    In this code, both A_function() and B_function() may legally accept an object of type C * (via inheritance). However, one of the functions will always return the wrong result when used as shown. The reason for this is that even though p points to an object of type C, the casting operation doesn't work like you would expect. Internally, this has to do with the data representation of C. With multiple inheritance, the data from each base class is stacked together. For example:

                 ------------    <--- (C *),  (A *)
                |     A      |
                |------------|   <--- (B *)
                |     B      |
                 ------------   
    

    Because of this stacking, a pointer of type C * may change value when it is converted to a A * or B *. However, this adjustment does not occur if you are converting from a void *.

    The use of type tags marks all pointers with the real type of the underlying object. This extra information is then used by SWIG generated wrappers to correctly cast pointer values under inheritance (avoiding the above problem).

    Some of the language modules are able to solve the problem by storing multiple instances of the pointer, for example, A *, in the A proxy class as well as C * in the C proxy class. The correct cast can then be made by choosing the correct void * pointer to use and is guaranteed to work as the cast to a void pointer and back to the same type does not lose any type information:

    C *c = new C();
    void *p = (void *) c;
    void *pA = (void *) c;
    void *pB = (void *) c;
    ...
    int x = A_function((A *) pA);
    int y = B_function((B *) pB);
    

    In practice, the pointer is held as an integral number in the target language proxy class.

    6.15 Wrapping Overloaded Functions and Methods

    In many language modules, SWIG provides partial support for overloaded functions, methods, and constructors. For example, if you supply SWIG with overloaded functions like this:

    void foo(int x) {
      printf("x is %d\n", x);
    }
    void foo(char *x) {
      printf("x is '%s'\n", x);
    }
    

    The function is used in a completely natural way. For example:

    >>> foo(3)
    x is 3
    >>> foo("hello")
    x is 'hello'
    >>>
    

    Overloading works in a similar manner for methods and constructors. For example if you have this code,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);   // Copy constructor
      void bar(int x);
      void bar(char *s, int y);
    };
    

    it might be used like this

    >>> f = Foo()          # Create a Foo
    >>> f.bar(3)
    >>> g = Foo(f)         # Copy Foo
    >>> f.bar("hello", 2)
    

    6.15.1 Dispatch function generation

    The implementation of overloaded functions and methods is somewhat complicated due to the dynamic nature of scripting languages. Unlike C++, which binds overloaded methods at compile time, SWIG must determine the proper function as a runtime check for scripting language targets. This check is further complicated by the typeless nature of certain scripting languages. For instance, in Tcl, all types are simply strings. Therefore, if you have two overloaded functions like this,

    void foo(char *x);
    void foo(int x);
    

    the order in which the arguments are checked plays a rather critical role.

    For statically typed languages, SWIG uses the language's method overloading mechanism. To implement overloading for the scripting languages, SWIG generates a dispatch function that checks the number of passed arguments and their types. To create this function, SWIG first examines all of the overloaded methods and ranks them according to the following rules:

    1. Number of required arguments. Methods are sorted by increasing number of required arguments.
    2. Argument type precedence. All C++ datatypes are assigned a numeric type precedence value (which is determined by the language module).

      Type              Precedence
      ----------------  ----------
      TYPE *            0     (High)
      void *            20
      Integers          40
      Floating point    60
      char              80
      Strings           100   (Low)
      

      Using these precedence values, overloaded methods with the same number of required arguments are sorted in increased order of precedence values.

    This may sound very confusing, but an example will help. Consider the following collection of overloaded methods:

    void foo(double);
    void foo(int);
    void foo(Bar *);
    void foo();
    void foo(int x, int y, int z, int w);
    void foo(int x, int y, int z = 3);
    void foo(double x, double y);
    void foo(double x, Bar *z);
    

    The first rule simply ranks the functions by required argument count. This would produce the following list:

    rank
    -----
    [0]   foo()
    [1]   foo(double);
    [2]   foo(int);
    [3]   foo(Bar *);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, double y)
    [6]   foo(double x, Bar *z)
    [7]   foo(int x, int y, int z, int w);
    

    The second rule, simply refines the ranking by looking at argument type precedence values.

    rank
    -----
    [0]   foo()
    [1]   foo(Bar *);
    [2]   foo(int);
    [3]   foo(double);
    [4]   foo(int x, int y, int z = 3);
    [5]   foo(double x, Bar *z)
    [6]   foo(double x, double y)
    [7]   foo(int x, int y, int z, int w);
    

    Finally, to generate the dispatch function, the arguments passed to an overloaded method are simply checked in the same order as they appear in this ranking.

    If you're still confused, don't worry about it---SWIG is probably doing the right thing.

    6.15.2 Ambiguity in Overloading

    Regrettably, SWIG is not able to support every possible use of valid C++ overloading. Consider the following example:

    void foo(int x);
    void foo(long x);
    

    In C++, this is perfectly legal. However, in a scripting language, there is generally only one kind of integer object. Therefore, which one of these functions do you pick? Clearly, there is no way to truly make a distinction just by looking at the value of the integer itself ( int and long may even be the same precision). Therefore, when SWIG encounters this situation, it may generate a warning message like this for scripting languages:

    example.i:4: Warning 509: Overloaded method foo(long) effectively ignored,
    example.i:3: Warning 509: as it is shadowed by foo(int).
    

    or for statically typed languages like Java:

    example.i:4: Warning 516: Overloaded method foo(long) ignored,
    example.i:3: Warning 516: using foo(int) instead.
    at example.i:3 used.
    

    This means that the second overloaded function will be inaccessible from a scripting interface or the method won't be wrapped at all. This is done as SWIG does not know how to disambiguate it from an earlier method.

    Ambiguity problems are known to arise in the following situations:

    • Integer conversions. Datatypes such as int, long, and short cannot be disambiguated in some languages. Shown above.
    • Floating point conversion. float and double can not be disambiguated in some languages.
    • Pointers and references. For example, Foo * and Foo & .
    • Pointers and arrays. For example, Foo * and Foo [4] .
    • Pointers and instances. For example, Foo and Foo * . Note: SWIG converts all instances to pointers.
    • Qualifiers. For example, const Foo * and Foo *.
    • Default vs. non default arguments. For example, foo(int a, int b) and foo(int a, int b = 3).

    When an ambiguity arises, methods are checked in the same order as they appear in the interface file. Therefore, earlier methods will shadow methods that appear later.

    When wrapping an overloaded function, there is a chance that you will get a warning message like this:

    example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - 
    no precedence level in typecheck typemap for 'int').
    

    This error means that the target language module supports overloading, but for some reason there is no type-checking rule that can be used to generate a working dispatch function. The resulting behavior is then undefined. You should report this as a bug to the SWIG bug tracking database if this is due to one of the typemaps supplied with SWIG.

    If you get an error message such as the following,

    foo.i:6. Overloaded declaration ignored.  Spam::foo(double )
    foo.i:5. Previous declaration is Spam::foo(int )
    foo.i:7. Overloaded declaration ignored.  Spam::foo(Bar *, Spam *, int )
    foo.i:5. Previous declaration is Spam::foo(int )
    

    it means that the target language module has not yet implemented support for overloaded functions and methods. The only way to fix the problem is to read the next section.

    6.15.3 Ambiguity resolution and renaming

    If an ambiguity in overload resolution occurs or if a module doesn't allow overloading, there are a few strategies for dealing with the problem. First, you can tell SWIG to ignore one of the methods. This is easy---simply use the %ignore directive. For example:

    %ignore foo(long);
    
    void foo(int);
    void foo(long);       // Ignored.  Oh well.
    

    The other alternative is to rename one of the methods. This can be done using %rename. For example:

    %rename("foo_short") foo(short);
    %rename(foo_long) foo(long);
    
    void foo(int);
    void foo(short);      // Accessed as foo_short()
    void foo(long);       // Accessed as foo_long()
    

    Note that the quotes around the new name are optional, however, should the new name be a C/C++ keyword they would be essential in order to avoid a parsing error. The %ignore and %rename directives are both rather powerful in their ability to match declarations. When used in their simple form, they apply to both global functions and methods. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    If you only want the renaming to apply to a certain scope, the C++ scope resolution operator (::) can be used. For example:

    %rename(foo_i) ::foo(int);      // Only rename foo(int) in the global scope.
                                    // (will not rename class members)
    
    %rename(foo_i) Spam::foo(int);  // Only rename foo(int) in class Spam
    

    When a renaming operator is applied to a class as in Spam::foo(int), it is applied to that class and all derived classes. This can be used to apply a consistent renaming across an entire class hierarchy with only a few declarations. For example:

    %rename(foo_i) Spam::foo(int);
    %rename(foo_d) Spam::foo(double);
    
    class Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Grok : public Bar {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    

    It is also possible to include %rename specifications in the class definition itself. For example:

    class Spam {
      %rename(foo_i) foo(int);
      %rename(foo_d) foo(double);
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
      ...
    };
    
    class Bar : public Spam {
    public:
      virtual void foo(int);      // Renamed to foo_i
      virtual void foo(double);   // Renamed to foo_d
    ...
    };
    

    In this case, the %rename directives still get applied across the entire inheritance hierarchy, but it's no longer necessary to explicitly specify the class prefix Spam::.

    A special form of %rename can be used to apply a renaming just to class members (of all classes):

    %rename(foo_i) *::foo(int);   // Only rename foo(int) if it appears in a class.
    

    Note: the *:: syntax is non-standard C++, but the '*' is meant to be a wildcard that matches any class name (we couldn't think of a better alternative so if you have a better idea, send email to the swig-devel mailing list.

    Although this discussion has primarily focused on %rename all of the same rules also apply to %ignore. For example:

    %ignore foo(double);          // Ignore all foo(double)
    %ignore Spam::foo;            // Ignore foo in class Spam
    %ignore Spam::foo(double);    // Ignore foo(double) in class Spam
    %ignore *::foo(double);       // Ignore foo(double) in all classes
    

    When applied to a base class, %ignore forces all definitions in derived classes to disappear. For example, %ignore Spam::foo(double) will eliminate foo(double) in Spam and all classes derived from Spam.

    Notes on %rename and %ignore:

    • Since, the %rename declaration is used to declare a renaming in advance, it can be placed at the start of an interface file. This makes it possible to apply a consistent name resolution without having to modify header files. For example:

      %module foo
      
      /* Rename these overloaded functions */
      %rename(foo_i) foo(int); 
      %rename(foo_d) foo(double);
      
      %include "header.h"
      
    • The scope qualifier (::) can also be used on simple names. For example:

      %rename(bar) ::foo;       // Rename foo to bar in global scope only
      %rename(bar) Spam::foo;   // Rename foo to bar in class Spam only
      %rename(bar) *::foo;      // Rename foo in classes only
      
    • Name matching tries to find the most specific match that is defined. A qualified name such as Spam::foo always has higher precedence than an unqualified name foo. Spam::foo has higher precedence than *::foo and *::foo has higher precedence than foo. A parameterized name has higher precedence than an unparameterized name within the same scope level. However, an unparameterized name with a scope qualifier has higher precedence than a parameterized name in global scope (e.g., a renaming of Spam::foo takes precedence over a renaming of foo(int) ).

    • The order in which %rename directives are defined does not matter as long as they appear before the declarations to be renamed. Thus, there is no difference between saying:

      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      %rename(Foo) Spam::foo;
      

      and this

      %rename(Foo) Spam::foo;
      %rename(bar) foo;
      %rename(foo_i) Spam::foo(int);
      

      (the declarations are not stored in a linked list and order has no importance). Of course, a repeated %rename directive will change the setting for a previous %rename directive if exactly the same name, scope, and parameters are supplied.

    • For multiple inheritance where renaming rules are defined for multiple base classes, the first renaming rule found on a depth-first traversal of the class hierarchy is used.
    • The name matching rules strictly follow member qualification rules. For example, if you have a class like this:

      class Spam {
      public:
        ...
        void bar() const;
        ...
      };
      

      the declaration

      %rename(name) Spam::bar();
      

      will not apply as there is no unqualified member bar(). The following will apply as the qualifier matches correctly:

      %rename(name) Spam::bar() const;
      

      An often overlooked C++ feature is that classes can define two different overloaded members that differ only in their qualifiers, like this:

      class Spam {
      public:
        ...
        void bar();         // Unqualified member
        void bar() const;   // Qualified member
        ...
      };
      

      %rename can then be used to target each of the overloaded methods individually. For example we can give them separate names in the target language:

      %rename(name1) Spam::bar();
      %rename(name2) Spam::bar() const;
      

      Similarly, if you merely wanted to ignore one of the declarations, use %ignore with the full qualification. For example, the following directive would tell SWIG to ignore the const version of bar() above:

      %ignore Spam::bar() const;   // Ignore bar() const, but leave other bar() alone
      
    • Currently no resolution is performed in order to match function parameters. This means function parameter types must match exactly. For example, namespace qualifiers and typedefs will not work. The following usage of typedefs demonstrates this:

      typedef int Integer;
      
      %rename(foo_i) foo(int);
      
      class Spam {
      public:
        void foo(Integer);  // Stays 'foo' (not renamed)
      };
      class Ham {
      public:
        void foo(int);      // Renamed to foo_i
      };
      
    • The name matching rules also use default arguments for finer control when wrapping methods that have default arguments. Recall that methods with default arguments are wrapped as if the equivalent overloaded methods had been parsed (Default arguments section). Let's consider the following example class:

      class Spam {
      public:
        ...
        void bar(int i=-1, double d=0.0);
        ...
      };
      

      The following %rename will match exactly and apply to all the target language overloaded methods because the declaration with the default arguments exactly matches the wrapped method:

      %rename(newbar) Spam::bar(int i=-1, double d=0.0);
      

      The C++ method can then be called from the target language with the new name no matter how many arguments are specified, for example: newbar(2, 2.0), newbar(2) or newbar(). However, if the %rename does not contain the default arguments, it will only apply to the single equivalent target language overloaded method. So if instead we have:

      %rename(newbar) Spam::bar(int i, double d);
      

      The C++ method must then be called from the target language with the new name newbar(2, 2.0) when both arguments are supplied or with the original name as bar(2) (one argument) or bar() (no arguments). In fact it is possible to use %rename on the equivalent overloaded methods, to rename all the equivalent overloaded methods:

      %rename(bar_2args)   Spam::bar(int i, double d);
      %rename(bar_1arg)    Spam::bar(int i);
      %rename(bar_default) Spam::bar();
      

      Similarly, the extra overloaded methods can be selectively ignored using %ignore.

      Compatibility note: The %rename directive introduced the default argument matching rules in SWIG-1.3.23 at the same time as the changes to wrapping methods with default arguments was introduced.

    6.15.4 Comments on overloading

    Support for overloaded methods was first added in SWIG-1.3.14. The implementation is somewhat unusual when compared to similar tools. For instance, the order in which declarations appear is largely irrelevant in SWIG. Furthermore, SWIG does not rely upon trial execution or exception handling to figure out which method to invoke.

    Internally, the overloading mechanism is completely configurable by the target language module. Therefore, the degree of overloading support may vary from language to language. As a general rule, statically typed languages like Java are able to provide more support than dynamically typed languages like Perl, Python, Ruby, and Tcl.

    6.16 Wrapping overloaded operators

    C++ overloaded operator declarations can be wrapped. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c) {
        rpart = c.rpart;
        ipart = c.ipart;
        return *this;
      }
      Complex operator+(const Complex &c) const {
        return Complex(rpart+c.rpart, ipart+c.ipart);
      }
      Complex operator-(const Complex &c) const {
        return Complex(rpart-c.rpart, ipart-c.ipart);
      }
      Complex operator*(const Complex &c) const {
        return Complex(rpart*c.rpart - ipart*c.ipart,
                       rpart*c.ipart + c.rpart*ipart);
      }
      Complex operator-() const {
        return Complex(-rpart, -ipart);
      }
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When operator declarations appear, they are handled in exactly the same manner as regular methods. However, the names of these methods are set to strings like "operator +" or "operator -". The problem with these names is that they are illegal identifiers in most scripting languages. For instance, you can't just create a method called "operator +" in Python--there won't be any way to call it.

    Some language modules already know how to automatically handle certain operators (mapping them into operators in the target language). However, the underlying implementation of this is really managed in a very general way using the %rename directive. For example, in Python a declaration similar to this is used:

    %rename(__add__) Complex::operator+;
    

    This binds the + operator to a method called __add__ (which is conveniently the same name used to implement the Python + operator). Internally, the generated wrapper code for a wrapped operator will look something like this pseudocode:

    _wrap_Complex___add__(args) {
      ... get args ...
      obj->operator+(args);
      ...
    }
    

    When used in the target language, it may now be possible to use the overloaded operator normally. For example:

    >>> a = Complex(3, 4)
    >>> b = Complex(5, 2)
    >>> c = a + b           # Invokes __add__ method
    

    It is important to realize that there is nothing magical happening here. The %rename directive really only picks a valid method name. If you wrote this:

    %rename(add) operator+;
    

    The resulting scripting interface might work like this:

    a = Complex(3, 4)
    b = Complex(5, 2)
    c = a.add(b)      # Call a.operator+(b)
    

    All of the techniques described to deal with overloaded functions also apply to operators. For example:

    %ignore Complex::operator=;             // Ignore = in class Complex
    %ignore *::operator=;                   // Ignore = in all classes
    %ignore operator=;                      // Ignore = everywhere.
    
    %rename(__sub__) Complex::operator-; 
    %rename(__neg__) Complex::operator-();  // Unary - 
    

    The last part of this example illustrates how multiple definitions of the operator- method might be handled.

    Handling operators in this manner is mostly straightforward. However, there are a few subtle issues to keep in mind:

    • In C++, it is fairly common to define different versions of the operators to account for different types. For example, a class might also include a friend function like this:

      class Complex {
      public:
        friend Complex operator+(Complex &, double);
      };
      Complex operator+(Complex &, double);
      

      SWIG simply ignores all friend declarations. Furthermore, it doesn't know how to associate the associated operator+ with the class (because it's not a member of the class).

      It's still possible to make a wrapper for this operator, but you'll have to handle it like a normal function. For example:

      %rename(add_complex_double) operator+(Complex &, double);
      
    • Certain operators are ignored by default. For instance, new and delete operators are ignored as well as conversion and index operators. A warning such as the one below is shown:

      example.i:12: Warning 503: Can't wrap 'operator []' unless renamed to a valid identifier.
      
    • The index operator, operator[], is particularly difficult to overload due to differences in C++ implementations. Specifically, the get and set operators in other languages typically are separated into two methods such that additional logic can be packed into the operations; C# uses this[type key] { get { ... } set { ... }}, Python uses __getitem__ and __setitem__, etc. In C++ if the return type of operator[] is a reference and the method is const, it is often indicative of the setter, and and the getter is usually a const function return an object by value. In the absence of any hard and fast rules and the fact that there may be multiple index operators, it is up to the user to choose the getter and setter to use by using %rename as shown earlier.

    • The semantics of certain C++ operators may not match those in the target language.

    6.17 Class extension

    New methods can be added to a class using the %extend directive. This directive is primarily used in conjunction with proxy classes to add additional functionality to an existing class. For example :

    %module vector
    %{
    #include "vector.h"
    %}
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      ... bunch of C++ methods ...
      %extend {
        char *__str__() {
          static char temp[256];
          sprintf(temp, "[ %g, %g, %g ]", $self->x, $self->y, $self->z);
          return &temp[0];
        }
      }
    };
    

    This code adds a __str__ method to our class for producing a string representation of the object. In Python, such a method would allow us to print the value of an object using the print command.

    >>>
    >>> v = Vector();
    >>> v.x = 3
    >>> v.y = 4
    >>> v.z = 0
    >>> print(v)
    [ 3.0, 4.0, 0.0 ]
    >>>
    
    

    The C++ 'this' pointer is often needed to access member variables, methods etc. The $self special variable should be used wherever you could use 'this'. The example above demonstrates this for accessing member variables. Note that the members dereferenced by $self must be public members as the code is ultimately generated into a global function and so will not have any access to non-public members. The implicit 'this' pointer that is present in C++ methods is not present in %extend methods. In order to access anything in the extended class or its base class, an explicit 'this' is required. The following example shows how one could access base class members:

    struct Base {
      virtual void method(int v) {
        ...
      }
      int value;
    };
    struct Derived : Base {
    };
    %extend Derived {
      virtual void method(int v) {
        $self->Base::method(v); // akin to this->Base::method(v);
        $self->value = v;       // akin to this->value = v;
        ...
      }
    }
    

    The following special variables are expanded if used within a %extend block: $name, $symname, $overname, $decl, $fulldecl, $parentclassname and $parentclasssymname. The Special variables section provides more information each of these special variables.

    The %extend directive follows all of the same conventions as its use with C structures. Please refer to the Adding member functions to C structures section for further details.

    Compatibility note: The %extend directive is a new name for the %addmethods directive in SWIG1.1. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    6.18 Templates

    Template type names may appear anywhere a type is expected in an interface file. For example:

    void foo(vector<int> *a, int n);
    void bar(list<int, 100> *x);
    

    There are some restrictions on the use of non-type arguments. Simple literals are supported, and so are some constant expressions. However, use of '<' and '>' within a constant expressions currently is not supported by SWIG ('<=' and '>=' are though). For example:

    void bar(list<int, 100> *x);                // OK
    void bar(list<int, 2*50> *x);               // OK
    void bar(list<int, (2>1 ? 100 : 50)> *x)    // Not supported
    

    The type system is smart enough to figure out clever games you might try to play with typedef. For instance, consider this code:

    typedef int Integer;
    void foo(vector<int> *x, vector<Integer> *y);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. The wrapper for foo() will accept either variant.

    Starting with SWIG-1.3.7, simple C++ template declarations can also be wrapped. SWIG-1.3.12 greatly expands upon the earlier implementation. Before discussing this any further, there are a few things you need to know about template wrapping. First, a bare C++ template does not define any sort of runnable object-code for which SWIG can normally create a wrapper. Therefore, in order to wrap a template, you need to give SWIG information about a particular template instantiation (e.g., vector<int>, array<double>, etc.). Second, an instantiation name such as vector<int> is generally not a valid identifier name in most target languages. Thus, you will need to give the template instantiation a more suitable name such as intvector when creating a wrapper.

    To illustrate, consider the following template definition:

    template<class T> class List {
    private:
        T *data;
        int nitems;
        int maxitems;
    public:
        List(int max) {
          data = new T [max];
          nitems = 0;
          maxitems = max;
        }
        ~List() {
          delete [] data;
        };
        void append(T obj) {
          if (nitems < maxitems) {
            data[nitems++] = obj;
          }
        }
        int length() {
          return nitems;
        }
        T get(int n) {
          return data[n];
        }
    };
    

    By itself, this template declaration is useless--SWIG simply ignores it because it doesn't know how to generate any code until unless a definition of T is provided.

    One way to create wrappers for a specific template instantiation is to simply provide an expanded version of the class directly like this:

    %rename(intList) List<int>;       // Rename to a suitable identifier
    class List<int> {
    private:
        int *data;
        int nitems;
        int maxitems;
    public:
        List(int max);
        ~List();
        void append(int obj);
        int length();
        int get(int n);
    };
    

    The %rename directive is needed to give the template class an appropriate identifier name in the target language (most languages would not recognize C++ template syntax as a valid class name). The rest of the code is the same as what would appear in a normal class definition.

    Since manual expansion of templates gets old in a hurry, the %template directive can be used to create instantiations of a template class. Semantically, %template is simply a shortcut---it expands template code in exactly the same way as shown above. Here are some examples:

    /* Instantiate a few different versions of the template */
    %template(intList) List<int>;
    %template(doubleList) List<double>;
    

    The argument to %template() is the name of the instantiation in the target language. The name you choose should not conflict with any other declarations in the interface file with one exception---it is okay for the template name to match that of a typedef declaration. For example:

    %template(intList) List<int>;
    ...
    typedef List<int> intList;    // OK
    

    SWIG can also generate wrappers for function templates using a similar technique. For example:

    // Function template
    template<class T> T max(T a, T b) { return a > b ? a : b; }
    
    // Make some different versions of this function
    %template(maxint) max<int>;
    %template(maxdouble) max<double>;
    

    In this case, maxint and maxdouble become unique names for specific instantiations of the function.

    The number of arguments supplied to %template should match that in the original template definition. Template default arguments are supported. For example:

    template vector<typename T, int max=100> class vector {
    ...
    };
    
    %template(intvec) vector<int>;           // OK
    %template(vec1000) vector<int, 1000>;     // OK
    

    The %template directive should not be used to wrap the same template instantiation more than once in the same scope. This will generate an error. For example:

    %template(intList) List<int>;
    %template(Listint) List<int>;    // Error.   Template already wrapped.
    

    This error is caused because the template expansion results in two identical classes with the same name. This generates a symbol table conflict. Besides, it probably more efficient to only wrap a specific instantiation only once in order to reduce the potential for code bloat.

    Since the type system knows how to handle typedef, it is generally not necessary to instantiate different versions of a template for typenames that are equivalent. For instance, consider this code:

    %template(intList) vector<int>;
    typedef int Integer;
    ...
    void foo(vector<Integer> *x);
    

    In this case, vector<Integer> is exactly the same type as vector<int>. Any use of Vector<Integer> is mapped back to the instantiation of vector<int> created earlier. Therefore, it is not necessary to instantiate a new class for the type Integer (doing so is redundant and will simply result in code bloat).

    When a template is instantiated using %template, information about that class is saved by SWIG and used elsewhere in the program. For example, if you wrote code like this,

    ...
    %template(intList) List<int>;
    ...
    class UltraList : public List<int> {
      ...
    };
    

    then SWIG knows that List<int> was already wrapped as a class called intList and arranges to handle the inheritance correctly. If, on the other hand, nothing is known about List<int> , you will get a warning message similar to this:

    example.h:42: Warning 401. Nothing known about class 'List<int >'. Ignored. 
    example.h:42: Warning 401. Maybe you forgot to instantiate 'List<int >' using %template. 
    

    If a template class inherits from another template class, you need to make sure that base classes are instantiated before derived classes. For example:

    template<class T> class Foo {
    ...
    };
    
    template<class T> class Bar : public Foo<T> {
    ...
    };
    
    // Instantiate base classes first 
    %template(intFoo) Foo<int>;
    %template(doubleFoo) Foo<double>;
    
    // Now instantiate derived classes
    %template(intBar) Bar<int>;
    %template(doubleBar) Bar<double>;
    

    The order is important since SWIG uses the instantiation names to properly set up the inheritance hierarchy in the resulting wrapper code (and base classes need to be wrapped before derived classes). Don't worry--if you get the order wrong, SWIG should generate a warning message.

    Occasionally, you may need to tell SWIG about base classes that are defined by templates, but which aren't supposed to be wrapped. Since SWIG is not able to automatically instantiate templates for this purpose, you must do it manually. To do this, simply use the empty template instantiation, that is, %template with no name. For example:

    // Instantiate traits<double, double>, but don't wrap it.
    %template() traits<double, double>;
    

    If you have to instantiate a lot of different classes for many different types, you might consider writing a SWIG macro. For example:

    %define TEMPLATE_WRAP(prefix, T...) 
    %template(prefix ## Foo) Foo<T >;
    %template(prefix ## Bar) Bar<T >;
    ...
    %enddef
    
    TEMPLATE_WRAP(int, int)
    TEMPLATE_WRAP(double, double)
    TEMPLATE_WRAP(String, char *)
    TEMPLATE_WRAP(PairStringInt, std::pair<string, int>)
    ...
    

    Note the use of a vararg macro for the type T. If this wasn't used, the comma in the templated type in the last example would not be possible.

    The SWIG template mechanism does support specialization. For instance, if you define a class like this,

    template<> class List<int> {
    private:
        int *data;
        int nitems;
        int maxitems;
    public:
        List(int max);
        ~List();
        void append(int obj);
        int length();
        int get(int n);
    };
    

    then SWIG will use this code whenever the user expands List<int> . In practice, this may have very little effect on the underlying wrapper code since specialization is often used to provide slightly modified method bodies (which are ignored by SWIG). However, special SWIG directives such as %typemap, %extend, and so forth can be attached to a specialization to provide customization for specific types.

    Partial template specialization is partially supported by SWIG. For example, this code defines a template that is applied when the template argument is a pointer.

    template<class T> class List<T*> {
    private:
        T *data;
        int nitems;
        int maxitems;
    public:
        List(int max);
        ~List();
        void append(int obj);
        int length();
        T get(int n);
    };
    

    SWIG supports both template explicit specialization and partial specialization. Consider:

    template<class T1, class T2> class Foo { };                     // (1) primary template
    template<>                   class Foo<double *, int *> { };    // (2) explicit specialization
    template<class T1, class T2> class Foo<T1, T2 *> { };           // (3) partial specialization
    

    SWIG is able to properly match explicit instantiations:

    Foo<double *, int *>     // explicit specialization matching (2)
    

    SWIG implements template argument deduction so that the following partial specialization examples work just like they would with a C++ compiler:

    Foo<int *, int *>        // partial specialization matching (3)
    Foo<int *, const int *>  // partial specialization matching (3)
    Foo<int *, int **>       // partial specialization matching (3)
    

    Member function templates are supported. The underlying principle is the same as for normal templates--SWIG can't create a wrapper unless you provide more information about types. For example, a class with a member template might look like this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    

    To expand the template, simply use %template inside the class.

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    Or, if you want to leave the original class definition alone, just do this:

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    %extend Foo {
      %template(barint)    bar<int>;
      %template(bardouble) bar<double>;
    };
    

    or simply

    class Foo {
    public:
      template<class T> void bar(T x, T y) { ... };
      ...
    };
    ...
    
    %template(bari) Foo::bar<int>;
    %template(bard) Foo::bar<double>;
    

    In this case, the %extend directive is not needed, and %template does exactly the same job, i.e., it adds two new methods to the Foo class.

    Note: because of the way that templates are handled, the %template directive must always appear after the definition of the template to be expanded.

    Now, if your target language supports overloading, you can even try

    %template(bar) Foo::bar<int>;
    %template(bar) Foo::bar<double>;
    

    and since the two new wrapped methods have the same name 'bar', they will be overloaded, and when called, the correct method will be dispatched depending on the argument type.

    When used with members, the %template directive may be placed in another template class. Here is a slightly perverse example:

    // A template
    template<class T> class Foo {
    public:
      // A member template
      template<class S> T bar(S x, S y) { ... };
      ...
    };
    
    // Expand a few member templates
    %extend Foo {
      %template(bari) bar<int>;
      %template(bard) bar<double>;
    }
    
    // Create some wrappers for the template
    %template(Fooi) Foo<int>;
    %template(Food) Foo<double>;
    

    Miraculously, you will find that each expansion of Foo has member functions bari() and bard() added.

    A common use of member templates is to define constructors for copies and conversions. For example:

    template<class T1, class T2> struct pair {
      T1 first;
      T2 second;
      pair() : first(T1()), second(T2()) { }
      pair(const T1 &x, const T2 &y) : first(x), second(y) { }
      template<class U1, class U2> pair(const pair<U1, U2> &x)
                                           : first(x.first), second(x.second) { }
    };
    

    This declaration is perfectly acceptable to SWIG, but the constructor template will be ignored unless you explicitly expand it. To do that, you could expand a few versions of the constructor in the template class itself. For example:

    %extend pair {
      %template(pair) pair<T1, T2>;        // Generate default copy constructor
    };
    

    When using %extend in this manner, notice how you can still use the template parameters in the original template definition.

    Alternatively, you could expand the constructor template in selected instantiations. For example:

    // Instantiate a few versions
    %template(pairii) pair<int, int>;
    %template(pairdd) pair<double, double>;
    
    // Create a default constructor only 
    %extend pair<int, int> {
      %template(paird) pair<int, int>;         // Default constructor
    };
    
    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(paird) pair<double, dobule>;   // Default constructor
      %template(pairc) pair<int, int>;         // Conversion constructor
    };
    

    And if your target language supports overloading, then you can try instead:

    // Create default and conversion constructors 
    %extend pair<double, double> {
      %template(pair) pair<double, dobule>;   // Default constructor
      %template(pair) pair<int, int>;         // Conversion constructor
    };
    

    In this case, the default and conversion constructors have the same name. Hence, SWIG will overload them and define an unique visible constructor, that will dispatch the proper call depending on the argument type.

    If all of this isn't quite enough and you really want to make someone's head explode, SWIG directives such as %rename, %extend, and %typemap can be included directly in template definitions. For example:

    // File : list.h
    template<class T> class List {
      ...
    public:
      %rename(__getitem__) get(int);
      List(int max);
      ~List();
      ...
      T get(int index);
      %extend {
        char *__str__() {
          /* Make a string representation */
          ...
        }
      }
    };
    

    In this example, the extra SWIG directives are propagated to every template instantiation.

    It is also possible to separate these declarations from the template class. For example:

    %rename(__getitem__) List::get;
    %extend List {
      char *__str__() {
        /* Make a string representation */
        ...
      }
      /* Make a copy */
      T *__copy__() {
        return new List<T>(*$self);
      }
    };
    
    ...
    template<class T> class List {
        ...
        public:
        List() { }
        T get(int index);
        ...
    };
    

    When %extend is decoupled from the class definition, it is legal to use the same template parameters as provided in the class definition. These are replaced when the template is expanded. In addition, the %extend directive can be used to add additional methods to a specific instantiation. For example:

    %template(intList) List<int>;
    
    %extend List<int> {
        void blah() {
              printf("Hey, I'm an List<int>!\n");
        }
    };
    

    SWIG even supports overloaded templated functions. As usual the %template directive is used to wrap templated functions. For example:

    template<class T> void foo(T x) { };
    template<class T> void foo(T x, T y) { };
    
    %template(foo) foo<int>;
    

    This will generate two overloaded wrapper methods, the first will take a single integer as an argument and the second will take two integer arguments.

    It is even possible to extend a class via %extend with template methods, for example:

    %include <std_string.i>
    
    %inline %{
    class ExtendMe {
    public:
      template <typename T>
      T do_stuff_impl(int a, T b, double d) {
        return b;
      }
    };
    %}
    
    %extend ExtendMe {
      template<typename T>
      T do_overloaded_stuff(T b) {
        return $self->do_stuff_impl(0, b, 4.0);
      }
    }
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<std::string>;
    %template(do_overloaded_stuff) ExtendMe::do_overloaded_stuff<double>;
    

    The wrapped ExtendMe class will then have two (overloaded) methods called do_overloaded_stuff.

    Compatibility Note: Extending a class with template methods was added in version 3.0.12

    Needless to say, SWIG's template support provides plenty of opportunities to break the universe. That said, an important final point is that SWIG does not perform extensive error checking of templates! Specifically, SWIG does not perform type checking nor does it check to see if the actual contents of the template declaration make any sense. Since the C++ compiler checks this when it compiles the resulting wrapper file, there is no practical reason for SWIG to duplicate this functionality.

    As SWIG's template support does not perform type checking %template can be used as early as after a template declaration. You can, and rarely have to, use %template before the template parameters have been declared. For example:

    template <class T> class OuterTemplateClass {};
    
    // The nested class OuterClass::InnerClass inherits from the template class
    // OuterTemplateClass<OuterClass::InnerStruct> and thus the template needs
    // to be expanded with %template before the OuterClass declaration.
    %template(OuterTemplateClass_OuterClass__InnerStruct)
        OuterTemplateClass<OuterClass::InnerStruct>
    
    
    // Don't forget to use %feature("flatnested") for OuterClass::InnerStruct and
    // OuterClass::InnerClass if the target language doesn't support nested classes.
    class OuterClass {
        public:
            // Forward declarations:
            struct InnerStruct;
            class InnerClass;
    };
    
    struct OuterClass::InnerStruct {};
    
    // Expanding the template at this point with %template is too late as the
    // OuterClass::InnerClass declaration is processed inside OuterClass.
    
    class OuterClass::InnerClass : public OuterTemplateClass<InnerStruct> {};
    

    Compatibility Note: The first implementation of template support relied heavily on macro expansion in the preprocessor. Templates have been more tightly integrated into the parser and type system in SWIG-1.3.12 and the preprocessor is no longer used. Code that relied on preprocessing features in template expansion will no longer work. However, SWIG still allows the # operator to be used to generate a string from a template argument.

    Compatibility Note: In earlier versions of SWIG, the %template directive introduced a new class name. This name could then be used with other directives. For example:

    %template(vectori) vector<int>;
    %extend vectori {
        void somemethod() { }
    };
    

    This behavior is no longer supported. Instead, you should use the original template name as the class name. For example:

    %template(vectori) vector<int>;
    %extend vector<int> {
        void somemethod() { }
    };
    

    Similar changes apply to typemaps and other customization features.

    6.19 Namespaces

    Support for C++ namespaces is comprehensive, but by default simple, however, some target languages can turn on more advanced namespace support via the nspace feature, described later. Code within unnamed namespaces is ignored as there is no external access to symbols declared within the unnamed namespace. Before detailing the default implementation for named namespaces, it is worth noting that the semantics of C++ namespaces is extremely non-trivial--especially with regard to the C++ type system and class machinery. At a most basic level, namespaces are sometimes used to encapsulate common functionality. For example:

    namespace math {
      double sin(double);
      double cos(double);
    
      class Complex {
        double im, re;
      public:
        ...
      };
      ...
    };
    

    Members of the namespace are accessed in C++ by prepending the namespace prefix to names. For example:

    double x = math::sin(1.0);
    double magnitude(math::Complex *c);
    math::Complex c;
    ...
    

    At this level, namespaces are relatively easy to manage. However, things start to get very ugly when you throw in the other ways a namespace can be used. For example, selective symbols can be exported from a namespace with using.

    using math::Complex;
    double magnitude(Complex *c);       // Namespace prefix stripped
    

    Similarly, the contents of an entire namespace can be made available like this:

    using namespace math;
    double x = sin(1.0);
    double magnitude(Complex *c);
    

    Alternatively, a namespace can be aliased:

    namespace M = math;
    double x = M::sin(1.0);
    double magnitude(M::Complex *c);
    

    Using combinations of these features, it is possible to write head-exploding code like this:

    namespace A {
      class Foo {
      };
    }
    
    namespace B {
      namespace C {
        using namespace A;
      }
      typedef C::Foo FooClass;
    }
    
    namespace BIGB = B;
    
    namespace D {
      using BIGB::FooClass;
      class Bar : public FooClass {
      }
    };
    
    class Spam : public D::Bar {
    };
    
    void evil(A::Foo *a, B::FooClass *b, B::C::Foo *c, BIGB::FooClass *d,
              BIGB::C::Foo *e, D::FooClass *f);
    
    

    Given the possibility for such perversion, it's hard to imagine how every C++ programmer might want such code wrapped into the target language. Clearly this code defines three different classes. However, one of those classes is accessible under at least six different names!

    SWIG fully supports C++ namespaces in its internal type system and class handling code. If you feed SWIG the above code, it will be parsed correctly, it will generate compilable wrapper code, and it will produce a working scripting language module. However, the default wrapping behavior is to flatten namespaces in the target language. This means that the contents of all namespaces are merged together in the resulting scripting language module. For example, if you have code like this,

    %module foo
    namespace foo {
      void bar(int);
      void spam();
    }
    
    namespace bar {
      void blah();
    }
    
    

    then SWIG simply creates three wrapper functions bar(), spam(), and blah() in the target language. SWIG does not prepend the names with a namespace prefix nor are the functions packaged in any kind of nested scope.

    There is some rationale for taking this approach. Since C++ namespaces are often used to define modules in C++, there is a natural correlation between the likely contents of a SWIG module and the contents of a namespace. For instance, it would not be unreasonable to assume that a programmer might make a separate extension module for each C++ namespace. In this case, it would be redundant to prepend everything with an additional namespace prefix when the module itself already serves as a namespace in the target language. Or put another way, if you want SWIG to keep namespaces separate, simply wrap each namespace with its own SWIG interface.

    Because namespaces are flattened, it is possible for symbols defined in different namespaces to generate a name conflict in the target language. For example:

    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);
    }
    

    When this conflict occurs, you will get an error message that resembles this:

    example.i:26. Error. 'foo' is multiply defined in the generated target language module.
    example.i:23. Previous declaration of 'foo'
    

    To resolve this error, simply use %rename to disambiguate the declarations. For example:

    %rename(B_foo) B::foo;
    ...
    namespace A {
      void foo(int);
    }
    namespace B {
      void foo(double);     // Gets renamed to B_foo
    }
    

    Similarly, %ignore can be used to ignore declarations.

    using declarations do not have any effect on the generated wrapper code. They are ignored by SWIG language modules and they do not result in any code. However, these declarations are used by the internal type system to track type-names. Therefore, if you have code like this:

    namespace A {
      typedef int Integer;
    }
    using namespace A;
    void foo(Integer x);
    

    SWIG knows that Integer is the same as A::Integer which is the same as int.

    Namespaces may be combined with templates. If necessary, the %template directive can be used to expand a template defined in a different namespace. For example:

    namespace foo {
        template<typename T> T max(T a, T b) { return a > b ? a : b; }
    }
    
    using foo::max;
    
    %template(maxint)   max<int>;           // Okay.
    %template(maxfloat) foo::max<float>;    // Okay (qualified name).
    
    namespace bar {
        using namespace foo;
        %template(maxdouble)  max<double>;    // Okay.
    }
    

    The combination of namespaces and other SWIG directives may introduce subtle scope-related problems. The key thing to keep in mind is that all SWIG generated wrappers are produced in the global namespace. Symbols from other namespaces are always accessed using fully qualified names---names are never imported into the global space unless the interface happens to do so with a using declaration. In almost all cases, SWIG adjusts typenames and symbols to be fully qualified. However, this is not done in code fragments such as function bodies, typemaps, exception handlers, and so forth. For example, consider the following:

    namespace foo {
      typedef int Integer;
      class bar {
        public:
          ...
      };
    }
    
    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        Integer r = x + y;        // Error. Integer not defined in this scope
        return r;
      }
    };
    

    In this case, SWIG correctly resolves the added method parameters and return type to foo::Integer. However, since function bodies aren't parsed and such code is emitted in the global namespace, this code produces a compiler error about Integer. To fix the problem, make sure you use fully qualified names. For example:

    %extend foo::bar {
      Integer add(Integer x, Integer y) {
        foo::Integer r = x + y;        // Ok.
        return r;
      }
    };
    

    Note: SWIG does not propagate using declarations to the resulting wrapper code. If these declarations appear in an interface, they should also appear in any header files that might have been included in a %{ ... %} section. In other words, don't insert extra using declarations into a SWIG interface unless they also appear in the underlying C++ code.

    Note: Code inclusion directives such as %{ ... %} or %inline %{ ... %} should not be placed inside a namespace declaration. The code emitted by these directives will not be enclosed in a namespace and you may get very strange results. If you need to use namespaces with these directives, consider the following:

    // Good version
    %inline %{
    namespace foo {
      void bar(int) { ... }
      ...
    }
    %}
    
    // Bad version.  Emitted code not placed in namespace.
    namespace foo {
    %inline %{
      void bar(int) { ... }   /* I'm bad */
      ...
      %}
    }
    

    Note: When the %extend directive is used inside a namespace, the namespace name is included in the generated functions. For example, if you have code like this,

    namespace foo {
      class bar {
        public:
          %extend {
            int blah(int x);
          };
      };
    }
    

    the added method blah() is mapped to a function int foo_bar_blah(foo::bar *self, int x). This function resides in the global namespace.

    Note: Although namespaces are flattened in the target language, the SWIG generated wrapper code observes the same namespace conventions as used in the input file. Thus, if there are no symbol conflicts in the input, there will be no conflicts in the generated code.

    Note: In the same way that no resolution is performed on parameters, a conversion operator name must match exactly to how it is defined. Do not change the qualification of the operator. For example, suppose you had an interface like this:

    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator bar();      // Conversion of spam -> bar
        ...
      };
    }
    

    The following is how the feature is expected to be written for a successful match:

    %rename(tofoo) foo::spam::operator bar();
    

    The following does not work as no namespace resolution is performed in the matching of conversion operator names:

    %rename(tofoo) foo::spam::operator foo::bar();
    

    Note, however, that if the operator is defined using a qualifier in its name, then the feature must use it too...

    %rename(tofoo) foo::spam::operator bar();      // will not match
    %rename(tofoo) foo::spam::operator foo::bar(); // will match
    namespace foo {
      class bar;
      class spam {
        public:
        ...
        operator foo::bar();
        ...
      };
    }
    

    Compatibility Note: Versions of SWIG prior to 1.3.32 were inconsistent in this approach. A fully qualified name was usually required, but would not work in some situations.

    Note: The flattening of namespaces is only intended to serve as a basic namespace implementation. None of the target language modules are currently programmed with any namespace awareness. In the future, language modules may or may not provide more advanced namespace support.

    6.19.1 The nspace feature for namespaces

    Some target languages provide support for the nspace feature. The feature can be applied to any class, struct, union or enum declared within a named namespace. The feature wraps the type within the target language specific concept of a namespace, for example, a Java package or C# namespace. Please see the language specific sections to see if the target language you are interested in supports the nspace feature.

    The feature is demonstrated below for C# using the following example:

    %feature("nspace") MyWorld::Material::Color;
    %nspace MyWorld::Wrapping::Color; // %nspace is a macro for %feature("nspace")
    
    namespace MyWorld {
      namespace Material {
        class Color {
        ...
        };
      }
      namespace Wrapping {
        class Color {
        ...
        };
      }
    }
    

    Without the nspace feature directives above or %rename , you would get the following warning resulting in just one of the Color classes being available for use from the target language:

    example.i:9: Error: 'Color' is multiply defined in the generated target language module.
    example.i:5: Error: Previous declaration of 'Color'
    

    With the nspace feature the two Color classes are wrapped into the equivalent C# namespaces. A fully qualified constructor call of each these two types in C# is then:

    MyWorld.Material.Color materialColor = new MyWorld.Material.Color();
    MyWorld.Wrapping.Color wrappingColor = new MyWorld.Wrapping.Color();
    

    Note that the nspace feature does not apply to variables and functions simply declared in a namespace. For example, the following symbols cannot co-exist in the target language without renaming. This may change in a future version.

    namespace MyWorld {
      namespace Material {
        int quantity;
        void dispatch();
      }
      namespace Wrapping {
        int quantity;
        void dispatch();
      }
    }
    

    Compatibility Note: The nspace feature was first introduced in SWIG-2.0.0.

    6.20 Renaming templated types in namespaces

    As has been mentioned, when %rename includes parameters, the parameter types must match exactly (no typedef or namespace resolution is performed). SWIG treats templated types slightly differently and has an additional matching rule so unlike non-templated types, an exact match is not always required. If the fully qualified templated type is specified, it will have a higher precedence over the generic template type. In the example below, the generic template type is used to rename to bbb and the fully qualified type is used to rename to ccc.

    %rename(bbb) Space::ABC::aaa(T t);                  // will match but with lower precedence than ccc
    %rename(ccc) Space::ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence
                                                                 // than bbb
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    It should now be apparent that there are many ways to achieve a renaming with %rename. This is demonstrated by the following two examples, which are effectively the same as the above example. Below shows how %rename can be placed inside a namespace.

    namespace Space {
      %rename(bbb) ABC::aaa(T t);                     // will match but with lower precedence than ccc
      %rename(ccc) ABC<Space::XYZ>::aaa(Space::XYZ t);// will match but with higher precedence than bbb
      %rename(ddd) ABC<Space::XYZ>::aaa(XYZ t);       // will not match
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    Note that ddd does not match as there is no namespace resolution for parameter types and the fully qualified type must be specified for template type expansion. The following example shows how %rename can be placed within %extend.

    namespace Space {
      %extend ABC {
        %rename(bbb) aaa(T t);         // will match but with lower precedence than ccc
      }
      %extend ABC<Space::XYZ> {
        %rename(ccc) aaa(Space::XYZ t);// will match but with higher precedence than bbb
        %rename(ddd) aaa(XYZ t);       // will not match
      }
    }
    
    namespace Space {
      class XYZ {};
      template<typename T> struct ABC {
        void aaa(T t) {}
      };
    }
    %template(ABCXYZ) Space::ABC<Space::XYZ>;
    

    6.21 Exception specifications

    When C++ programs utilize exceptions, exceptional behavior is sometimes specified as part of a function or method declaration. For example:

    class Error { };
    
    class Foo {
    public:
        ...
        void blah() throw(Error);
        ...
    };
    

    If an exception specification is used, SWIG automatically generates wrapper code for catching the indicated exception and, when possible, rethrowing it into the target language, or converting it into an error in the target language otherwise. For example, in Python, you can write code like this:

    f = Foo()
    try:
        f.blah()
    except Error, e:
        # e is a wrapped instance of "Error"
    

    Details of how to tailor code for handling the caught C++ exception and converting it into the target language's exception/error handling mechanism is outlined in the "throws" typemap section.

    Since exception specifications are sometimes only used sparingly, this alone may not be enough to properly handle C++ exceptions. To do that, a different set of special SWIG directives are used. Consult the "Exception handling with %exception " section for details. The next section details a way of simulating an exception specification or replacing an existing one.

    6.22 Exception handling with %catches

    Exceptions are automatically handled for methods with an exception specification. Similar handling can be achieved for methods without exception specifications through the %catches feature. It is also possible to replace any declared exception specification using the %catches feature. In fact, %catches uses the same "throws" typemaps that SWIG uses for exception specifications in handling exceptions. The %catches feature must contain a list of possible types that can be thrown. For each type that is in the list, SWIG will generate a catch handler, in the same way that it would for types declared in the exception specification. Note that the list can also include the catch all specification "...". For example,

    struct EBase { virtual ~EBase(); };
    struct Error1 : EBase { };
    struct Error2 : EBase { };
    struct Error3 : EBase { };
    struct Error4 : EBase { };
    
    %catches(Error1, Error2, ...) Foo::bar();
    %catches(EBase) Foo::blah();
    
    class Foo {
    public:
        ...
        void bar();
        void blah() throw(Error1, Error2, Error3, Error4);
        ...
    };
    

    For the Foo::bar() method, which can throw anything, SWIG will generate catch handlers for Error1, Error2 as well as a catch all handler (...). Each catch handler will convert the caught exception and convert it into a target language error/exception. The catch all handler will convert the caught exception into an unknown error/exception.

    Without the %catches feature being attached to Foo::blah(), SWIG will generate catch handlers for all of the types in the exception specification, that is, Error1, Error2, Error3, Error4. However, with the %catches feature above, just a single catch handler for the base class, EBase will be generated to convert the C++ exception into a target language error/exception.

    6.23 Pointers to Members

    Starting with SWIG-1.3.7, there is limited parsing support for pointers to C++ class members. For example:

    double do_op(Object *o, double (Object::*callback)(double, double));
    extern double (Object::*fooptr)(double, double);
    %constant double (Object::*FOO)(double, double) = &Object::foo;
    

    Although these kinds of pointers can be parsed and represented by the SWIG type system, few language modules know how to handle them due to implementation differences from standard C pointers. Readers are strongly advised to consult an advanced text such as the "The Annotated C++ Manual" for specific details.

    When pointers to members are supported, the pointer value might appear as a special string like this:

    >>> print example.FOO
    _ff0d54a800000000_m_Object__f_double_double__double
    >>>
    

    In this case, the hexadecimal digits represent the entire value of the pointer which is usually the contents of a small C++ structure on most machines.

    SWIG's type-checking mechanism is also more limited when working with member pointers. Normally SWIG tries to keep track of inheritance when checking types. However, no such support is currently provided for member pointers.

    6.24 Smart pointers and operator->()

    In some C++ programs, objects are often encapsulated by smart-pointers or proxy classes. This is sometimes done to implement automatic memory management (reference counting) or persistence. Typically a smart-pointer is defined by a template class where the -> operator has been overloaded. This class is then wrapped around some other class. For example:

    // Smart-pointer class
    template<class T> class SmartPtr {
        T *pointee;
    public:
        SmartPtr(T *p) : pointee(p) { ... }
        T *operator->() {
            return pointee;
        }
        ...
    };
    
    // Ordinary class
    class Foo_Impl {
    public:
        int x;
        virtual void bar();
        ...
    };
    
    // Smart-pointer wrapper
    typedef SmartPtr<Foo_Impl> Foo;
    
    // Create smart pointer Foo
    Foo make_Foo() {
        return SmartPtr<Foo_Impl>(new Foo_Impl());
    }
    
    // Do something with smart pointer Foo
    void do_something(Foo f) {
        printf("x = %d\n", f->x);
        f->bar();
    }
    
    // Call the wrapped smart pointer proxy class in the target language 'Foo'
    %template(Foo) SmartPtr<Foo_Impl>;
    

    A key feature of this approach is that by defining operator-> the methods and attributes of the object wrapped by a smart pointer are transparently accessible. For example, expressions such as these (from the previous example),

    f->x
    f->bar()
    

    are transparently mapped to the following

    (f.operator->())->x;
    (f.operator->())->bar();
    

    When generating wrappers, SWIG tries to emulate this functionality to the extent that it is possible. To do this, whenever operator->() is encountered in a class, SWIG looks at its returned type and uses it to generate wrappers for accessing attributes of the underlying object. For example, wrapping the above code produces wrappers like this:

    int Foo_x_get(Foo *f) {
      return (*f)->x;
    }
    void Foo_x_set(Foo *f, int value) {
      (*f)->x = value;
    }
    void Foo_bar(Foo *f) {
      (*f)->bar();
    }
    

    These wrappers take a smart-pointer instance as an argument, but dereference it in a way to gain access to the object returned by operator->(). You should carefully compare these wrappers to those in the first part of this chapter (they are slightly different).

    The end result is that access looks very similar to C++. For example, you could do this in Python:

    >>> f = make_Foo()
    >>> print f.x
    0
    >>> f.bar()
    >>>
    

    When generating wrappers through a smart-pointer, SWIG tries to generate wrappers for all methods and attributes that might be accessible through operator->(). This includes any methods that might be accessible through inheritance. However, there are a number of restrictions:

    • Member variables and methods are wrapped through a smart pointer. Enumerations, constructors, and destructors are not wrapped.
    • If the smart-pointer class and the underlying object both define a method or variable of the same name, then the smart-pointer version has precedence. For example, if you have this code

      class Foo {
      public:
          int x;
      };
      
      class Bar {
      public:
          int x;       
          Foo *operator->();
      };
      

      then the wrapper for Bar::x accesses the x defined in Bar, and not the x defined in Foo.

    If your intent is to only expose the smart-pointer class in the interface, it is not necessary to wrap both the smart-pointer class and the class for the underlying object. However, you must still tell SWIG about both classes if you want the technique described in this section to work. To only generate wrappers for the smart-pointer class, you can use the %ignore directive. For example:

    %ignore Foo;
    class Foo {       // Ignored
    };
    
    class Bar {
    public:
      Foo *operator->();
      ...
    };
    

    Alternatively, you can import the definition of Foo from a separate file using %import.

    Note: When a class defines operator->(), the operator itself is wrapped as a method __deref__(). For example:

    f = Foo()               # Smart-pointer
    p = f.__deref__()       # Raw pointer from operator->
    

    Note: To disable the smart-pointer behavior, use %ignore to ignore operator->(). For example:

    %ignore Bar::operator->;
    

    Note: Smart pointer support was first added in SWIG-1.3.14.

    6.25 C++ reference counted objects - ref/unref feature

    Another similar idiom in C++ is the use of reference counted objects. Consider for example:

    class RCObj  {
      // implement the ref counting mechanism
      int add_ref();
      int del_ref();
      int ref_count();
    
    public:
      virtual ~RCObj() = 0;
    
      int ref() const {
        return add_ref();
      }
    
      int unref() const {
        if (ref_count() == 0 || del_ref() == 0 ) {
          delete this;
          return 0;
        }
        return ref_count();
      }
    };
    
    
    class A : RCObj {
    public:
      A();
      int foo();
    };
    
    
    class B {
      A *_a;
    
    public:
      B(A *a) : _a(a) { 
        a->ref(); 
      }
    
      ~B() { 
        a->unref(); 
      }
    };
    
    int main() {
      A *a  = new A();       // (count: 0)
      a->ref();           // 'a' ref here (count: 1)
    
      B *b1 = new B(a);   // 'a' ref here (count: 2)
      if (1 + 1 == 2) {
        B *b2 = new B(a); // 'a' ref here (count: 3)
        delete b2;        // 'a' unref, but not deleted (count: 2)
      }
    
      delete b1;          // 'a' unref, but not deleted (count: 1)
      a->unref();         // 'a' unref and deleted (count: 0)
    }
    

    In the example above, the 'A' class instance 'a' is a reference counted object, which can't be deleted arbitrarily since it is shared between the objects 'b1' and 'b2'. 'A' is derived from a Reference Counted Object 'RCObj', which implements the ref/unref idiom.

    To tell SWIG that 'RCObj' and all its derived classes are reference counted objects, use the "ref" and "unref" features. These are also available as %refobject and %unrefobject, respectively. For example:

    %module example
    ...
    
    %feature("ref")   RCObj "$this->ref();"
    %feature("unref") RCObj "$this->unref();"
    
    %include "rcobj.h"
    %include "A.h"
    ...
    

    where the code passed to the "ref" and "unref" features will be executed as needed whenever a new object is passed to python, or when python tries to release the proxy object instance, respectively.

    On the python side, the use of a reference counted object is no different to any other regular instance:

    def create_A():
        a = A()         # SWIG ref 'a' - new object is passed to python (count: 1)
        b1 = B(a)       # C++ ref 'a (count: 2)
        if 1 + 1 == 2:
            b2 = B(a)   # C++ ref 'a' (count: 3)
        return a        # 'b1' and 'b2' are released and deleted, C++ unref 'a' twice (count: 1)
    
    a = create_A()      # (count: 1)
    exit                # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    Note that the user doesn't explicitly need to call 'a->ref()' nor 'a->unref()' (and neither 'delete a'). Instead, SWIG takes cares of executing the "ref" and "unref" calls as needed. If the user doesn't specify the "ref/unref" feature for a type, SWIG will produce code equivalent to defining these features:

    %feature("ref")   ""
    %feature("unref") "delete $this;"
    

    In other words, SWIG will not do anything special when a new object is passed to python, and it will always 'delete' the underlying object when python releases the proxy instance.

    The %newobject feature is designed to indicate to the target language that it should take ownership of the returned object. When used in conjunction with a type that has the "ref" feature associated with it, it additionally emits the code in the "ref" feature into the C++ wrapper. Consider wrapping the following factory function in addition to the above:

    %newobject AFactory;
    A *AFactory() {
      return new A();
    }
    

    The AFactory function now acts much like a call to the A constructor with respect to memory handling:

    a = AFactory()    # SWIG ref 'a' due to %newobject (count: 1)
    exit              # 'a' is released, SWIG unref 'a' called in the destructor wrapper (count: 0)
    

    6.26 Using declarations and inheritance

    using declarations are sometimes used to adjust access to members of base classes. For example:

    class Foo {
    public:
          int  blah(int x);
    };
    
    class Bar {
    public:
          double blah(double x);
    };
    
    class FooBar : public Foo, public Bar {
    public:
          using Foo::blah;  
          using Bar::blah;
          char *blah(const char *x);
    };
    

    In this example, the using declarations make different versions of the overloaded blah() method accessible from the derived class. For example:

    FooBar *f;
    f->blah(3);         // Ok. Invokes Foo::blah(int)
    f->blah(3.5);       // Ok. Invokes Bar::blah(double)
    f->blah("hello");   // Ok. Invokes FooBar::blah(const char *);
    

    SWIG emulates the same functionality when creating wrappers. For example, if you wrap this code in Python, the module works just like you would expect:

    >>> import example
    >>> f = example.FooBar()
    >>> f.blah(3)
    >>> f.blah(3.5)
    >>> f.blah("hello")
    

    using declarations can also be used to change access when applicable. For example:

    class Foo {
    protected:
        int x;
        int blah(int x);
    };
    
    class Bar : public Foo {
    public:
        using Foo::x;       // Make x public
        using Foo::blah;    // Make blah public
    };
    

    This also works in SWIG---the exposed declarations will be wrapped normally.

    When using declarations are used as shown in these examples, declarations from the base classes are copied into the derived class and wrapped normally. When copied, the declarations retain any properties that might have been attached using %rename , %ignore, or %feature. Thus, if a method is ignored in a base class, it will also be ignored by a using declaration.

    Because a using declaration does not provide fine-grained control over the declarations that get imported, it may be difficult to manage such declarations in applications that make heavy use of SWIG customization features. If you can't get using to work correctly, you can always change the interface to the following:

    
    class FooBar : public Foo, public Bar {
    public:
    #ifndef SWIG
          using Foo::blah;  
          using Bar::blah;
    #else
          int blah(int x);         // explicitly tell SWIG about other declarations
          double blah(double x);
    #endif
    
          char *blah(const char *x);
    };
    

    Notes:

    • If a derived class redefines a method defined in a base class, then a using declaration won't cause a conflict. For example:

      class Foo {
      public:
        int blah(int );
        double blah(double);
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;    // Only imports blah(double);
        int blah(int);
      };
      
    • Resolving ambiguity in overloading may prevent declarations from being imported by using. For example:

      %rename(blah_long) Foo::blah(long);
      class Foo {
      public:
        int blah(int);
        long blah(long);  // Renamed to blah_long
      };
      
      class Bar : public Foo {
      public:
        using Foo::blah;     // Only imports blah(int)
        double blah(double x);
      };
      

    6.27 Nested classes

    If the target language supports the nested classes concept (like Java), the nested C++ classes are wrapped as nested target language proxy classes. (In case of Java - "static" nested classes.) Only public nested classes are wrapped. Otherwise there is little difference between nested and normal classes.

    If the target language doesn't support nested classes directly, or the support is not implemented in the language module (like for python currently), then the visible nested classes are moved to the same name space as the containing class (nesting hierarchy is "flattened"). The same behaviour may be turned on for C# and Java by the %feature ("flatnested"); If there is a class with the same name in the outer namespace the inner class (or the global one) may be renamed or ignored:

    %rename (Bar_Foo) Bar::Foo;
    class Foo {};
    class Bar {
      public:
      class Foo {};
    };
    

    If a nested class, within an outer class, has to be used as a template parameter within the outer class, then the template will have to be instantiated with %template before the beginning of the outer class. An example can be found in the Templates section.

    Compatibility Note: Prior to SWIG-3.0.0, there was limited nested class support. Nested classes were treated as opaque pointers. However, there was a workaround for nested class support in these older versions requiring the user to replicate the nested class in the global scope, adding in a typedef for the nested class in the global scope and using the "nestedworkaround" feature on the nested class. This resulted in approximately the same behaviour as the "flatnested" feature. With proper nested class support now available in SWIG-3.0.0, this feature has been deprecated and no longer works requiring code changes. If you see the following warning:

    example.i:8: Warning 126: The nestedworkaround feature is deprecated
    

    consider using the "flatnested" feature discussed above which generates a non-nested proxy class, like the "nestedworkaround" feature did. Alternatively, use the default nested class code generation, which may generate an equivalent to a nested proxy class in the target language, depending on the target language support.

    SWIG-1.3.40 and earlier versions did not have the nestedworkaround feature and the generated code resulting from parsing nested classes did not always compile. Nested class warnings could also not be suppressed using %warnfilter.

    6.28 A brief rant about const-correctness

    A common issue when working with C++ programs is dealing with all possible ways in which the const qualifier (or lack thereof) will break your program, all programs linked against your program, and all programs linked against those programs.

    Although SWIG knows how to correctly deal with const in its internal type system and it knows how to generate wrappers that are free of const-related warnings, SWIG does not make any attempt to preserve const-correctness in the target language. Thus, it is possible to pass const qualified objects to non-const methods and functions. For example, consider the following code in C++:

    const Object * foo();
    void bar(Object *);
    
    ...
    // C++ code
    void blah() {
      bar(foo());         // Error: bar discards const
    };
    

    Now, consider the behavior when wrapped into a Python module:

    >>> bar(foo())         # Okay
    >>> 
    

    Although this is clearly a violation of the C++ type-system, fixing the problem doesn't seem to be worth the added implementation complexity that would be required to support it in the SWIG run-time type system. There are no plans to change this in future releases (although we'll never rule anything out entirely).

    The bottom line is that this particular issue does not appear to be a problem for most SWIG projects. Of course, you might want to consider using another tool if maintaining constness is the most important part of your project.

    6.29 Where to go for more information

    If you're wrapping serious C++ code, you might want to pick up a copy of "The Annotated C++ Reference Manual" by Ellis and Stroustrup. This is the reference document we use to guide a lot of SWIG's C++ support.


    7 SWIG and C++11

    7.1 Introduction

    This chapter gives you a brief overview about the SWIG implementation of the C++11 standard. This part of SWIG is still a work in progress.

    SWIG supports the new C++ syntax changes with some minor limitations in some areas such as decltype expressions and variadic templates. Wrappers for the new STL types (unordered_ containers, result_of, tuples) are incomplete. The wrappers for the new containers would work much like the C++03 containers and users are welcome to help by adapting the existing container interface files and submitting them as a patch for inclusion in future versions of SWIG.

    7.2 Core language changes

    7.2.1 Rvalue reference and move semantics

    SWIG correctly parses the rvalue reference syntax '&&', for example the typical usage of it in the move constructor and move assignment operator below:

    class MyClass {
    ...
      std::vector<int> numbers;
    public:
      MyClass(MyClass &&other) : numbers(std::move(other.numbers)) {}
      MyClass & operator=(MyClass &&other) {
        numbers = std::move(other.numbers);
        return *this;
      }
    };
    

    Rvalue references are designed for C++ temporaries and so are not very useful when used from non-C++ target languages. Generally you would just ignore them via %ignore before parsing the class. For example, ignore the move constructor:

    %ignore MyClass::MyClass(MyClass &&);
    

    The plan is to ignore move constructors by default in a future version of SWIG. Note that both normal assignment operators as well as move assignment operators are ignored by default in most target languages with the following warning:

    example.i:18: Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
    

    7.2.2 Generalized constant expressions

    SWIG parses and identifies the keyword constexpr, but cannot fully utilise it. These C++ compile time constants are usable as runtime constants from the target languages. Below shows example usage for assigning a C++ compile time constant from a compile time constant function:

    constexpr int XXX() { return 10; }
    constexpr int YYY = XXX() + 100;
    

    When either of these is used from a target language, a runtime call is made to obtain the underlying constant.

    7.2.3 Extern template

    SWIG correctly parses the keywords extern template. However, this template instantiation suppression in a translation unit has no relevance outside of the C++ compiler and so is not used by SWIG. SWIG only uses %template for instantiating and wrapping templates.

    template class std::vector<int>;        // C++03 explicit instantiation in C++
    extern template class std::vector<int>; // C++11 explicit instantiation suppression in C++
    %template(VectorInt) std::vector<int>;  // SWIG instantiation
    

    7.2.4 Initializer lists

    Initializer lists are very much a C++ compiler construct and are not very accessible from wrappers as they are intended for compile time initialization of classes using the special std::initializer_list type. SWIG detects usage of initializer lists and will emit a special informative warning each time one is used:

    example.i:33: Warning 476: Initialization using std::initializer_list.
    

    Initializer lists usually appear in constructors but can appear in any function or method. They often appear in constructors which are overloaded with alternative approaches to initializing a class, such as the std container's push_back method for adding elements to a container. The recommended approach then is to simply ignore the initializer-list constructor, for example:

    %ignore Container::Container(std::initializer_list<int>);
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Alternatively you could modify the class and add another constructor for initialization by some other means, for example by a std::vector:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    And then call this constructor from your target language, for example, in Python, the following will call the constructor taking the std::vector:

    >>> c = Container( [1, 2, 3, 4] )
    

    If you are unable to modify the class being wrapped, consider ignoring the initializer-list constructor and using %extend to add in an alternative constructor:

    %include <std_vector.i>
    %extend Container {
      Container(const std::vector<int> &elements) {
        Container *c = new Container();
        for (int element : elements)
          c->push_back(element);
        return c;
      }
    }
    
    %ignore Container::Container(std::initializer_list<int>);
    
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    The above makes the wrappers look is as if the class had been declared as follows:

    %include <std_vector.i>
    class Container {
    public:
      Container(const std::vector<int> &);
    //  Container(std::initializer_list<int>); // initializer-list constructor (ignored)
      Container();
      void push_back(const int &);
      ...
    };
    

    std::initializer_list is simply a container that can only be initialized at compile time. As it is just a C++ type, it is possible to write typemaps for a target language container to map onto std::initializer_list. However, this can only be done for a fixed number of elements as initializer lists are not designed to be constructed with a variable number of arguments at runtime. The example below is a very simple approach which ignores any parameters passed in and merely initializes with a fixed list of fixed integer values chosen at compile time:

    %typemap(in) std::initializer_list<int> {
      $1 = {10, 20, 30, 40, 50};
    }
    class Container {
    public:
      Container(std::initializer_list<int>); // initializer-list constructor
      Container();
      void push_back(const int &);
      ...
    };
    

    Any attempt at passing in values from the target language will be ignored and be replaced by {10, 20, 30, 40, 50}. Needless to say, this approach is very limited, but could be improved upon, but only slightly. A typemap could be written to map a fixed number of elements on to the std::initializer_list, but with values decided at runtime. The typemaps would be target language specific.

    Note that the default typemap for std::initializer_list does nothing but issue the warning and hence any user supplied typemaps will override it and suppress the warning.

    7.2.5 Uniform initialization

    The curly brackets {} for member initialization are fully supported by SWIG:

    struct BasicStruct {
     int x;
     double y;
    };
     
    struct AltStruct {
      AltStruct(int x, double y) : x_{x}, y_{y} {}
     
      int x_;
      double y_;
    };
    
    BasicStruct var1{5, 3.2}; // only fills the struct components
    AltStruct var2{2, 4.3};   // calls the constructor
    

    Uniform initialization does not affect usage from the target language, for example in Python:

    >>> a = AltStruct(10, 142.15)
    >>> a.x_
    10
    >>> a.y_
    142.15
    

    7.2.6 Type inference

    SWIG supports decltype() with some limitations. Single variables are allowed, however, expressions are not supported yet. For example, the following code will work:

    int i;
    decltype(i) j;
    

    However, using an expression inside the decltype results in syntax error:

    int i; int j;
    decltype(i+j) k;  // syntax error
    

    7.2.7 Range-based for-loop

    This feature is part of the implementation block only. SWIG ignores it.

    7.2.8 Lambda functions and expressions

    SWIG correctly parses most of the Lambda functions syntax. For example:

    auto val = [] { return something; };
    auto sum = [](int x, int y) { return x+y; };
    auto sum = [](int x, int y) -> int { return x+y; };
    

    The lambda functions are removed from the wrappers for now, because of the lack of support for closures (scope of the lambda functions) in the target languages.

    Lambda functions used to create variables can also be parsed, but due to limited support of auto when the type is deduced from the expression, the variables are simply ignored.

    auto six = [](int x, int y) { return x+y; }(4, 2);
    

    Better support should be available in a later release.

    7.2.9 Alternate function syntax

    SWIG fully supports the new definition of functions. For example:

    struct SomeStruct {
      int FuncName(int x, int y);
    };
    

    can now be written as in C++11:

    struct SomeStruct {
      auto FuncName(int x, int y) -> int;
    };
     
    auto SomeStruct::FuncName(int x, int y) -> int {
      return x + y;
    }
    

    The usage in the target languages remains the same, for example in Python:

    >>> a = SomeStruct()
    >>> a.FuncName(10, 5)
    15
    

    SWIG will also deal with type inference for the return type, as per the limitations described earlier. For example:

    auto square(float a, float b) -> decltype(a);
    

    7.2.10 Object construction improvement

    There are three parts to object construction improvement. The first improvement is constructor delegation such as the following:

    class A {
    public:
      int a;
      int b;
      int c;
    
      A() : A(10) {}
      A(int aa) : A(aa, 20) {}
      A(int aa, int bb) : A(aa, bb, 30) {}
      A(int aa, int bb, int cc) { a=aa; b=bb; c=cc; }
    };
    

    where peer constructors can be called. SWIG handles this without any issue.

    The second improvement is constructor inheritance via a using declaration. This is parsed correctly, but the additional constructors are not currently added to the derived proxy class in the target language. An example is shown below:

    class BaseClass {
    public:
      BaseClass(int iValue);
    };
    
    class DerivedClass: public BaseClass {
      public:
      using BaseClass::BaseClass; // Adds DerivedClass(int) constructor
    };
    

    The final part is member initialization at the site of the declaration. This kind of initialization is handled by SWIG.

    class SomeClass {
    public:
      SomeClass() {}
      explicit SomeClass(int new_value) : value(new_value) {}
    
      int value = 5;
    };
    

    7.2.11 Explicit overrides and final

    The special identifiers final and override can be used on methods and destructors, such as in the following example:

    struct BaseStruct {
      virtual void ab() const = 0;
      virtual void cd();
      virtual void ef();
      virtual ~BaseStruct();
    };
    struct DerivedStruct : BaseStruct {
      virtual void ab() const override;
      virtual void cd() final;
      virtual void ef() final override;
      virtual ~DerivedStruct() override;
    };
    

    7.2.12 Null pointer constant

    The nullptr constant is mostly unimportant in wrappers. In the few places it has an effect, it is treated like NULL.

    7.2.13 Strongly typed enumerations

    SWIG supports strongly typed enumerations and parses the new enum class syntax and forward declarator for the enums, such as:

    enum class MyEnum : unsigned int;
    

    Strongly typed enums are often used to avoid name clashes such as the following:

    struct Color {
      enum class RainbowColors : unsigned int {
        Red, Orange, Yellow, Green, Blue, Indigo, Violet
      };
      
      enum class WarmColors {
        Yellow, Orange, Red
      };
    
      // Note normal enum
      enum PrimeColors {
        Red=100, Green, Blue
      };
    };
    

    There are various ways that the target languages handle enums, so it is not possible to precisely state how they are handled in this section. However, generally, most scripting languages mangle in the strongly typed enumeration's class name, but do not use any additional mangling for normal enumerations. For example, in Python, the following code

    print Color.RainbowColors_Red, Color.WarmColors_Red, Color.Red
    

    results in

    0 2 100
    

    The strongly typed languages often wrap normal enums into an enum class and so treat normal enums and strongly typed enums the same. The equivalent in Java is:

    System.out.println(Color.RainbowColors.Red.swigValue() + " " + Color.WarmColors.Red.swigValue() + " " + Color.PrimeColors.Red.swigValue());
    

    7.2.14 Double angle brackets

    SWIG correctly parses the symbols >> as closing the template block, if found inside it at the top level, or as the right shift operator >> otherwise.

    std::vector<std::vector<int>> myIntTable;
    

    7.2.15 Explicit conversion operators

    SWIG correctly parses the keyword explicit for operators in addition to constructors now. For example:

    class U {
    public:
      int u;
    };
    
    class V {
    public:
      int v;
    };
    
    class TestClass {
    public:
      //implicit converting constructor
      TestClass(U const &val) { t=val.u; }
    
      // explicit constructor
      explicit TestClass(V const &val) { t=val.v; }
    
      int t;
    };
    
    struct Testable {
      // explicit conversion operator
      explicit operator bool() const {
        return false;
      }
    };
    

    The effect of explicit constructors and operators has little relevance for the proxy classes as target languages don't have the same concepts of implicit conversions as C++. Conversion operators either with or without explicit need renaming to a valid identifier name in order to make them available as a normal proxy method.

    7.2.16 Type alias and alias templates

    A type alias is a statement of the form:

    using PFD = void (*)(double); // New introduced syntax
    

    which is equivalent to the old style typedef:

    typedef void (*PFD)(double);  // The old style
    

    The following is an example of an alias template:

    template< typename T1, typename T2, int N >
    class SomeType {
    public:
      T1 a;
      T2 b;
    };
    
    template< typename T2 >
    using TypedefName = SomeType<char*, T2, 5>;
    

    SWIG supports both type aliasing and alias templates. However, in order to use an alias template, two %template directives must be used:

    %template(SomeTypeBool) SomeType<char*, bool, 5>;
    %template() TypedefName<bool>;
    

    Firstly, the actual template is instantiated with a name to be used by the target language, as per any template being wrapped. Secondly, the empty template instantiation, %template(), is required for the alias template. This second requirement is necessary to add the appropriate instantiated template type into the type system as SWIG does not automatically instantiate templates. See the Templates section for more general information on wrapping templates.

    7.2.17 Unrestricted unions

    SWIG fully supports any type inside a union even if it does not define a trivial constructor. For example, the wrapper for the following code correctly provides access to all members in the union:

    struct point {
      point() {}
      point(int x, int y) : x_(x), y_(y) {}
      int x_, y_;
    };
    
    #include <new> // For placement 'new' in the constructor below
    union P {
      int z;
      double w;
      point p; // Illegal in C++03; legal in C++11.
      // Due to the point member, a constructor definition is required.
      P() {
        new(&p) point();
      }
    } p1;
    

    7.2.18 Variadic templates

    SWIG supports the variadic templates syntax (inside the <> block, variadic class inheritance and variadic constructor and initializers) with some limitations. The following code is correctly parsed:

    template <typename... BaseClasses> class ClassName : public BaseClasses... {
    public:
      ClassName (BaseClasses &&... baseClasses) : BaseClasses(baseClasses)... {}
    }
    

    For now however, the %template directive only accepts one parameter substitution for the variable template parameters.

    %template(MyVariant1) ClassName<>         // zero argument not supported yet
    %template(MyVariant2) ClassName<int>      // ok
    %template(MyVariant3) ClassName<int, int> // too many arguments not supported yet
    

    Support for the variadic sizeof() function is correctly parsed:

    const int SIZE = sizeof...(ClassName<int, int>);
    

    In the above example SIZE is of course wrapped as a constant.

    7.2.19 New string literals

    SWIG supports wide string and Unicode string constants and raw string literals.

    // New string literals
    wstring         aa =  L"Wide string";
    const char     *bb = u8"UTF-8 string";
    const char16_t *cc =  u"UTF-16 string";
    const char32_t *dd =  U"UTF-32 string";
    
    // Raw string literals
    const char      *xx =        ")I'm an \"ascii\" \\ string.";
    const char      *ee =   R"XXX()I'm an "ascii" \ string.)XXX"; // same as xx
    wstring          ff =  LR"XXX(I'm a "raw wide" \ string.)XXX";
    const char      *gg = u8R"XXX(I'm a "raw UTF-8" \ string.)XXX";
    const char16_t  *hh =  uR"XXX(I'm a "raw UTF-16" \ string.)XXX";
    const char32_t  *ii =  UR"XXX(I'm a "raw UTF-32" \ string.)XXX";
    

    Non-ASCII string support varies quite a bit among the various target languages though.

    Note: There is a bug currently where SWIG's preprocessor incorrectly parses an odd number of double quotes inside raw string literals.

    7.2.20 User-defined literals

    SWIG parses the declaration of user-defined literals, that is, the operator "" _mysuffix() function syntax.

    Some examples are the raw literal:

    OutputType operator "" _myRawLiteral(const char * value);
    

    numeric cooked literals:

    OutputType operator "" _mySuffixIntegral(unsigned long long);
    OutputType operator "" _mySuffixFloat(long double);
    

    and cooked string literals:

    OutputType operator "" _mySuffix(const char * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const wchar_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char16_t * string_values, size_t num_chars);
    OutputType operator "" _mySuffix(const char32_t * string_values, size_t num_chars);
    

    Like other operators that SWIG parses, a warning is given about renaming the operator in order for it to be wrapped:

    example.i:27: Warning 503: Can't wrap 'operator "" _myRawLiteral' unless renamed to a valid identifier.
    

    If %rename is used, then it can be called like any other wrapped method. Currently you need to specify the full declaration including parameters for %rename:

    %rename(MyRawLiteral)  operator"" _myRawLiteral(const char * value);
    

    Or if you just wish to ignore it altogether:

    %ignore operator "" _myRawLiteral(const char * value);
    

    Note that use of user-defined literals such as the following still give a syntax error:

    OutputType var1 = "1234"_suffix;
    OutputType var2 = 1234_suffix;
    OutputType var3 = 3.1416_suffix;
    

    7.2.21 Thread-local storage

    SWIG correctly parses the thread_local keyword. For example, variables reachable by the current thread can be defined as:

    struct A {
      static thread_local int val;
    };
    thread_local int global_val;
    

    The use of the thread_local storage specifier does not affect the wrapping process; it does not modify the wrapper code compared to when it is not specified. A variable will be thread local if accessed from different threads from the target language in the same way that it will be thread local if accessed from C++ code.

    7.2.22 Explicitly defaulted functions and deleted functions

    SWIG handles explicitly defaulted functions, that is, = default added to a function declaration. Deleted definitions, which are also called deleted functions, have = delete added to the function declaration. For example:

    struct NonCopyable {
      NonCopyable & operator=(const NonCopyable &) = delete; /* Removes operator= */
      NonCopyable(const NonCopyable &) = delete;             /* Removes copy constructor */
      NonCopyable() = default;                               /* Explicitly allows the empty constructor */
    };
    

    Wrappers for deleted functions will not be available in the target language. Wrappers for defaulted functions will of course be available in the target language. Explicitly defaulted functions have no direct effect for SWIG wrapping as the declaration is handled much like any other method declaration parsed by SWIG.

    Deleted functions are also designed to prevent implicit conversions when calling the function. For example, the C++ compiler will not compile any code which attempts to use an int as the type of the parameter passed to f below:

    struct NoInt {
      void f(double i);
      void f(int) = delete;
    };
    

    This is a C++ compile time check and SWIG does not make any attempt to detect if the target language is using an int instead of a double though, so in this case it is entirely possible to pass an int instead of a double to f from Java, Python etc.

    7.2.23 Type long long int

    SWIG correctly parses and uses the new long long type already introduced in C99 some time ago.

    7.2.24 Static assertions

    SWIG correctly parses the new static_assert declarations. This is a C++ compile time directive so there isn't anything useful that SWIG can do with it.

    template <typename T>
    struct Check {
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
    };
    

    7.2.25 Allow sizeof to work on members of classes without an explicit object

    SWIG can parse the new sizeof() on types as well as on objects. For example:

    struct A {
      int member;
    };
    
    const int SIZE = sizeof(A::member); // does not work with C++03. Okay with C++11
    

    In Python:

    >>> SIZE
    8
    

    7.2.26 Exception specifications and noexcept

    C++11 added in the noexcept specification to exception specifications to indicate that a function simply may or may not throw an exception, without actually naming any exception. SWIG understands these, although there isn't any useful way that this information can be taken advantage of by target languages, so it is as good as ignored during the wrapping process. Below are some examples of noexcept in function declarations:

    static void noex1() noexcept;
    int noex2(int) noexcept(true);
    int noex3(int, bool) noexcept(false);
    

    7.2.27 Control and query object alignment

    An alignof operator is used mostly within C++ to return alignment in number of bytes, but could be used to initialize a variable as shown below. The variable's value will be available for access by the target language as any other variable's compile time initialised value.

    const int align1 = alignof(A::member);
    

    The alignas specifier for variable alignment is not yet supported. Example usage:

    struct alignas(16) S {
      int num;
    };
    alignas(double) unsigned char c[sizeof(double)];
    

    Use the preprocessor to work around this for now:

    #define alignas(T)
    

    7.2.28 Attributes

    Attributes such as those shown below, are not yet supported and will give a syntax error.

    int [[attr1]] i [[attr2, attr3]];
    
    [[noreturn, nothrow]] void f [[noreturn]] ();
    

    7.3 Standard library changes

    7.3.1 Threading facilities

    SWIG does not currently wrap or use any of the new threading classes introduced (thread, mutex, locks, condition variables, task). The main reason is that SWIG target languages offer their own threading facilities so there is limited use for them.

    7.3.2 Tuple types

    SWIG does not provide library files for the new tuple types yet. Variadic template support requires further work to provide substantial tuple wrappers.

    7.3.3 Hash tables

    The new hash tables in the STL are unordered_set, unordered_multiset, unordered_map, unordered_multimap . These are not available in SWIG, but in principle should be easily implemented by adapting the current STL containers.

    7.3.4 Regular expressions

    While SWIG could provide wrappers for the new C++11 regular expressions classes, there is little need as the target languages have their own regular expression facilities.

    7.3.5 General-purpose smart pointers

    SWIG provides special smart pointer handling for std::shared_ptr in the same way it has support for boost::shared_ptr. Please see the shared_ptr smart pointer library section. There is no special smart pointer handling available for std::weak_ptr and std::unique_ptr yet.

    7.3.6 Extensible random number facility

    This feature extends and standardizes the standard library only and does not effect the C++ language nor SWIG.

    7.3.7 Wrapper reference

    Wrapper references are similar to normal C++ references but are copy-constructible and copy-assignable. They could conceivably be used in public APIs. There is no special support for std::reference_wrapper in SWIG though. Users would need to write their own typemaps if wrapper references are being used and these would be similar to the plain C++ reference typemaps.

    7.3.8 Polymorphic wrappers for function objects

    SWIG supports functor classes in a few languages in a very natural way. However nothing is provided yet for the new std::function template. SWIG will parse usage of the template like any other template.

    %rename(__call__) Test::operator(); // Default renaming used for Python
    
    struct Test {
      bool operator()(int x, int y); // function object
    };
    
    #include <functional>
    std::function<void (int, int)> pF = Test;   // function template wrapper
    
    

    Example of supported usage of the plain functor from Python is shown below. It does not involve std::function.

    t = Test()
    b = t(1, 2) # invoke C++ function object
    

    7.3.9 Type traits for metaprogramming

    The type_traits functions to support C++ metaprogramming is useful at compile time and is aimed specifically at C++ development:

    #include <type_traits>
    
    // First way of operating.
    template< bool B > struct algorithm {
      template< class T1, class T2 > static int do_it(T1 &, T2 &)  { /*...*/ return 1; }
    };
    
    // Second way of operating.
    template<> struct algorithm<true> {
      template< class T1, class T2 > static int do_it(T1, T2)  { /*...*/ return 2; }
    };
    
    // Instantiating 'elaborate' will automatically instantiate the correct way to operate, depending on the types used.
    template< class T1, class T2 > int elaborate(T1 A, T2 B) {
      // Use the second way only if 'T1' is an integer and if 'T2' is a floating point,
      // otherwise use the first way.
      return algorithm< std::is_integral<T1>::value && std::is_floating_point<T2>::value >::do_it(A, B);
    }
    

    SWIG correctly parses the template specialization, template types etc. However, metaprogramming and the additional support in the type_traits header is really for compile time and is not much use at runtime for the target languages. For example, as SWIG requires explicit instantiation of templates via %template, there isn't much that std::is_integral<int> is going to provide by itself. However, template functions using such metaprogramming techniques might be useful to wrap. For example, the following instantiations could be made:

    %template(Elaborate) elaborate<int, int>;
    %template(Elaborate) elaborate<int, double>;
    

    Then the appropriate algorithm can be called for the subset of types given by the above %template instantiations from a target language, such as Python:

    >>> Elaborate(0, 0)
    1
    >>> Elaborate(0, 0.0)
    2
    

    7.3.10 Uniform method for computing return type of function objects

    The new std::result_of class introduced in the <functional> header provides a generic way to obtain the return type of a function type via std::result_of::type. There isn't any library interface file to support this type. With a bit of work, SWIG will deduce the return type of functions when used in std::result_of using the approach shown below. The technique basically forward declares the std::result_of template class, then partially specializes it for the function types of interest. SWIG will use the partial specialization and hence correctly use the std::result_of::type provided in the partial specialization.

    %inline %{
    #include <functional>
    typedef double(*fn_ptr)(double);
    %}
    
    namespace std {
      // Forward declaration of result_of
      template<typename Func> struct result_of;
      // Add in a partial specialization of result_of
      template<> struct result_of< fn_ptr(double) > {
        typedef double type;
      };
    }
    
    %template() std::result_of< fn_ptr(double) >;
    
    %inline %{
    
    double square(double x) {
      return (x * x);
    }
    
    template<class Fun, class Arg>
    typename std::result_of<Fun(Arg)>::type test_result_impl(Fun fun, Arg arg) {
      return fun(arg);
    }
    %}
    
    %template(test_result) test_result_impl< fn_ptr, double >;
    %constant double (*SQUARE)(double) = square;
    

    Note the first use of %template which SWIG requires to instantiate the template. The empty template instantiation suffices as no proxy class is required for std::result_of<Fun(Arg)>::type as this type is really just a double. The second %template instantiates the template function which is being wrapped for use as a callback. The %constant can then be used for any callback function as described in Pointers to functions and callbacks.

    Example usage from Python should give the not too surprising result:

    >>> test_result(SQUARE, 5.0)
    25.0
    

    Phew, that is a lot of hard work to get a callback working. You could just go with the more attractive option of just using double as the return type in the function declaration instead of result_of !


    8 Preprocessing

    SWIG includes its own enhanced version of the C preprocessor. The preprocessor supports the standard preprocessor directives and macro expansion rules. However, a number of modifications and enhancements have been made. This chapter describes some of these modifications.

    8.1 File inclusion

    To include another file into a SWIG interface, use the %include directive like this:

    %include "pointer.i"
    

    Unlike, #include, %include includes each file once (and will not reload the file on subsequent %include declarations). Therefore, it is not necessary to use include-guards in SWIG interfaces.

    By default, the #include is ignored unless you run SWIG with the -includeall option. The reason for ignoring traditional includes is that you often don't want SWIG to try and wrap everything included in standard header system headers and auxiliary files.

    8.2 File imports

    SWIG provides another file inclusion directive with the %import directive. For example:

    %import "foo.i"
    

    The purpose of %import is to collect certain information from another SWIG interface file or a header file without actually generating any wrapper code. Such information generally includes type declarations (e.g., typedef) as well as C++ classes that might be used as base-classes for class declarations in the interface. The use of %import is also important when SWIG is used to generate extensions as a collection of related modules. This is an advanced topic and is described in later in the Working with Modules chapter.

    The -importall directive tells SWIG to follow all #include statements as imports. This might be useful if you want to extract type definitions from system header files without generating any wrappers.

    8.3 Conditional Compilation

    SWIG fully supports the use of #if, #ifdef, #ifndef, #else, #endif to conditionally include parts of an interface. The following symbols are predefined by SWIG when it is parsing the interface:

    SWIG                            Always defined when SWIG is processing a file
    SWIGIMPORTED                    Defined when SWIG is importing a file with %import
    SWIG_VERSION                    Hexadecimal (binary-coded decimal) number containing SWIG version,
                                    such as 0x010311 (corresponding to SWIG-1.3.11).
    
    SWIGALLEGROCL                   Defined when using Allegro CL
    SWIGCFFI                        Defined when using CFFI
    SWIGCHICKEN                     Defined when using CHICKEN
    SWIGCLISP                       Defined when using CLISP
    SWIGCSHARP                      Defined when using C#
    SWIGGUILE                       Defined when using Guile
    SWIGJAVA                        Defined when using Java
    SWIGJAVASCRIPT                  Defined when using Javascript
    SWIG_JAVASCRIPT_JSC             Defined when using Javascript for JavascriptCore
    SWIG_JAVASCRIPT_V8              Defined when using Javascript for v8 or node.js 
    SWIGLUA                         Defined when using Lua
    SWIGMODULA3                     Defined when using Modula-3
    SWIGMZSCHEME                    Defined when using Mzscheme
    SWIGOCAML                       Defined when using Ocaml
    SWIGOCTAVE                      Defined when using Octave
    SWIGPERL                        Defined when using Perl
    SWIGPHP                         Defined when using PHP5 or PHP7
    SWIGPHP5                        Defined when using PHP5
    SWIGPHP7                        Defined when using PHP7
    SWIGPIKE                        Defined when using Pike
    SWIGPYTHON                      Defined when using Python
    SWIGR                           Defined when using R
    SWIGRUBY                        Defined when using Ruby
    SWIGSCILAB                      Defined when using Scilab
    SWIGSEXP                        Defined when using S-expressions
    SWIGTCL                         Defined when using Tcl
    SWIGXML                         Defined when using XML
    

    In addition, SWIG defines the following set of standard C/C++ macros:

    __LINE__                        Current line number
    __FILE__                        Current file name
    __STDC__                        Defined to indicate ANSI C
    __cplusplus                     Defined when -c++ option used
    

    Interface files can look at these symbols as necessary to change the way in which an interface is generated or to mix SWIG directives with C code. These symbols are also defined within the C code generated by SWIG (except for the symbol `SWIG' which is only defined within the SWIG compiler).

    8.4 Macro Expansion

    Traditional preprocessor macros can be used in SWIG interfaces. Be aware that the #define statement is also used to try and detect constants. Therefore, if you have something like this in your file,

    #ifndef _FOO_H 1
    #define _FOO_H 1
    ...
    #endif
    

    you may get some extra constants such as _FOO_H showing up in the scripting interface.

    More complex macros can be defined in the standard way. For example:

    #define EXTERN extern
    #ifdef __STDC__
    #define _ANSI(args)   (args)
    #else
    #define _ANSI(args) ()
    #endif
    

    The following operators can appear in macro definitions:

    • #x
      Converts macro argument x to a string surrounded by double quotes ("x").
    • x ## y
      Concatenates x and y together to form xy.
    • `x`
      If x is a string surrounded by double quotes, do nothing. Otherwise, turn into a string like #x. This is a non-standard SWIG extension.

    8.5 SWIG Macros

    SWIG provides an enhanced macro capability with the %define and %enddef directives. For example:

    %define ARRAYHELPER(type, name)
    %inline %{
    type *new_ ## name (int nitems) {
      return (type *) malloc(sizeof(type)*nitems);
    }
    void delete_ ## name(type *t) {
      free(t);
    }
    type name ## _get(type *t, int index) {
      return t[index];
    }
    void name ## _set(type *t, int index, type val) {
      t[index] = val;
    }
    %}
    %enddef
    
    ARRAYHELPER(int, IntArray)
    ARRAYHELPER(double, DoubleArray)
    

    The primary purpose of %define is to define large macros of code. Unlike normal C preprocessor macros, it is not necessary to terminate each line with a continuation character (\)--the macro definition extends to the first occurrence of %enddef. Furthermore, when such macros are expanded, they are reparsed through the C preprocessor. Thus, SWIG macros can contain all other preprocessor directives except for nested %define statements.

    The SWIG macro capability is a very quick and easy way to generate large amounts of code. In fact, many of SWIG's advanced features and libraries are built using this mechanism (such as C++ template support).

    8.6 C99 and GNU Extensions

    SWIG-1.3.12 and newer releases support variadic preprocessor macros. For example:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, __VA_ARGS__)
    

    When used, any extra arguments to ... are placed into the special variable __VA_ARGS__. This also works with special SWIG macros defined using %define.

    SWIG allows a variable number of arguments to be empty. However, this often results in an extra comma (, ) and syntax error in the resulting expansion. For example:

    DEBUGF("hello");   --> fprintf(stderr, "hello", );
    

    To get rid of the extra comma, use ## like this:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, ##__VA_ARGS__)
    

    SWIG also supports GNU-style variadic macros. For example:

    #define DEBUGF(fmt, args...)  fprintf(stdout, fmt, args)
    

    Comment: It's not entirely clear how variadic macros might be useful to interface building. However, they are used internally to implement a number of SWIG directives and are provided to make SWIG more compatible with C99 code.

    8.7 Preprocessing and delimiters

    The preprocessor handles { }, " " and %{ %} delimiters differently.

    8.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    The SWIG preprocessor does not process any text enclosed in a code block %{ ... %}. Therefore, if you write code like this,

    %{
    #ifdef NEED_BLAH
    int blah() {
      ...
    }
    #endif
    %}
    

    the contents of the %{ ... %} block are copied without modification to the output (including all preprocessor directives).

    8.7.2 Preprocessing and { ... } delimiters

    SWIG always runs the preprocessor on text appearing inside { ... }. However, sometimes it is desirable to make a preprocessor directive pass through to the output file. For example:

    %extend Foo {
      void bar() {
        #ifdef DEBUG
          printf("I'm in bar\n");
        #endif
      }
    }
    

    By default, SWIG will interpret the #ifdef DEBUG statement. However, if you really wanted that code to actually go into the wrapper file, prefix the preprocessor directives with % like this:

    %extend Foo {
      void bar() {
        %#ifdef DEBUG
          printf("I'm in bar\n");
        %#endif
      }
    }
    

    SWIG will strip the extra % and leave the preprocessor directive in the code.

    8.8 Preprocessor and Typemaps

    Typemaps support a special attribute called noblock where the { ... } delimiters can be used, but the delimiters are not actually generated into the code. The effect is then similar to using "" or %{ %} delimiters but the code is run through the preprocessor. For example:

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int {$1= SWIG_macro(int);}
    

    might generate

      {
        arg1=(int)jarg1;
      }
    

    whereas

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in, noblock=1) Int {$1= SWIG_macro(int);}
    

    might generate

      arg1=(int)jarg1;
    

    and

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int %{$1=SWIG_macro(int);%}
    

    would generate

      arg1=SWIG_macro(int);
    

    8.9 Viewing preprocessor output

    Like many compilers, SWIG supports a -E command line option to display the output from the preprocessor. When the -E switch is used, SWIG will not generate any wrappers. Instead the results after the preprocessor has run are displayed. This might be useful as an aid to debugging and viewing the results of macro expansions.

    8.10 The #error and #warning directives

    SWIG supports the commonly used #warning and #error preprocessor directives. The #warning directive will cause SWIG to issue a warning then continue processing. The #error directive will cause SWIG to exit with a fatal error. Example usage:

    #error "This is a fatal error message"
    #warning "This is a warning message"
    

    The #error behaviour can be made to work like #warning if the -cpperraswarn commandline option is used. Alternatively, the #pragma directive can be used to the same effect, for example:

      /* Modified behaviour: #error does not cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=1
      /* Normal behaviour: #error does cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=0
    

    9 SWIG library

    To help build extension modules, SWIG is packaged with a library of support files that you can include in your own interfaces. These files often define new SWIG directives or provide utility functions that can be used to access parts of the standard C and C++ libraries. This chapter provides a reference to the current set of supported library files.

    Compatibility note: Older versions of SWIG included a number of library files for manipulating pointers, arrays, and other structures. Most these files are now deprecated and have been removed from the distribution. Alternative libraries provide similar functionality. Please read this chapter carefully if you used the old libraries.

    9.1 The %include directive and library search path

    Library files are included using the %include directive. When searching for files, directories are searched in the following order:

    1. The current directory
    2. Directories specified with the -I command line option
    3. ./swig_lib
    4. SWIG library install location as reported by swig -swiglib, for example /usr/local/share/swig/1.3.30
    5. On Windows, a directory Lib relative to the location of swig.exe is also searched.

    Within directories mentioned in points 3-5, SWIG first looks for a subdirectory corresponding to a target language (e.g., python, tcl, etc.). If found, SWIG will search the language specific directory first. This allows for language-specific implementations of library files.

    You can ignore the installed SWIG library by setting the SWIG_LIB environment variable. Set the environment variable to hold an alternative library directory.

    The directories that are searched are displayed when using -verbose commandline option.

    9.2 C Arrays and Pointers

    This section describes library modules for manipulating low-level C arrays and pointers. The primary use of these modules is in supporting C declarations that manipulate bare pointers such as int *, double *, or void *. The modules can be used to allocate memory, manufacture pointers, dereference memory, and wrap pointers as class-like objects. Since these functions provide direct access to memory, their use is potentially unsafe and you should exercise caution.

    9.2.1 cpointer.i

    The cpointer.i module defines macros that can be used to used to generate wrappers around simple C pointers. The primary use of this module is in generating pointers to primitive datatypes such as int and double.

    %pointer_functions(type, name)

    Generates a collection of four functions for manipulating a pointer type *:

    type *new_name()

    Creates a new object of type type and returns a pointer to it. In C, the object is created using calloc(). In C++, new is used.

    type *copy_name(type value)

    Creates a new object of type type and returns a pointer to it. An initial value is set by copying it from value. In C, the object is created using calloc(). In C++, new is used.

    type *delete_name(type *obj)

    Deletes an object type type.

    void name_assign(type *obj, type value)

    Assigns *obj = value.

    type name_value(type *obj)

    Returns the value of *obj.

    When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

    Here is a simple example of using %pointer_functions():

    %module example
    %include "cpointer.i"
    
    /* Create some functions for working with "int *" */
    %pointer_functions(int, intp);
    
    /* A function that uses an "int *" */
    void add(int x, int y, int *result);
    

    Now, in Python:

    >>> import example
    >>> c = example.new_intp()     # Create an "int" for storing result
    >>> example.add(3, 4, c)       # Call function
    >>> example.intp_value(c)      # Dereference
    7
    >>> example.delete_intp(c)     # Delete
    

    %pointer_class(type, name)

    Wraps a pointer of type * inside a class-based interface. This interface is as follows:

    struct name {
      name();                            // Create pointer object
      ~name();                           // Delete pointer object
      void assign(type value);           // Assign value
      type value();                      // Get value
      type *cast();                      // Cast the pointer to original type
      static name *frompointer(type *);  // Create class wrapper from existing
                                         // pointer
    };
    

    When using this macro, type is restricted to a simple type name like int, float, or Foo. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, the "class" may be transparently passed to any function that expects the pointer.

    If the target language does not support proxy classes, the use of this macro will produce the example same functions as %pointer_functions() macro.

    It should be noted that the class interface does introduce a new object or wrap a pointer inside a special structure. Instead, the raw pointer is used directly.

    Here is the same example using a class instead:

    %module example
    %include "cpointer.i"
    
    /* Wrap a class interface around an "int *" */
    %pointer_class(int, intp);
    
    /* A function that uses an "int *" */
    void add(int x, int y, int *result);
    

    Now, in Python (using proxy classes)

    >>> import example
    >>> c = example.intp()         # Create an "int" for storing result
    >>> example.add(3, 4, c)       # Call function
    >>> c.value()                  # Dereference
    7
    

    Of the two macros, %pointer_class is probably the most convenient when working with simple pointers. This is because the pointers are access like objects and they can be easily garbage collected (destruction of the pointer object destroys the underlying object).

    %pointer_cast(type1, type2, name)

    Creates a casting function that converts type1 to type2 . The name of the function is name. For example:

    %pointer_cast(int *, unsigned int *, int_to_uint);
    

    In this example, the function int_to_uint() would be used to cast types in the target language.

    Note: None of these macros can be used to safely work with strings (char * or char **).

    Note: When working with simple pointers, typemaps can often be used to provide more seamless operation.

    9.2.2 carrays.i

    This module defines macros that assist in wrapping ordinary C pointers as arrays. The module does not provide any safety or an extra layer of wrapping--it merely provides functionality for creating, destroying, and modifying the contents of raw C array data.

    %array_functions(type, name)

    Creates four functions.

    type *new_name(int nelements)

    Creates a new array of objects of type type. In C, the array is allocated using calloc(). In C++, new [] is used.

    type *delete_name(type *ary)

    Deletes an array. In C, free() is used. In C++, delete [] is used.

    type name_getitem(type *ary, int index)

    Returns the value ary[index].

    void name_setitem(type *ary, int index, type value)

    Assigns ary[index] = value.

    When using this macro, type may be any type and name must be a legal identifier in the target language. name should not correspond to any other name used in the interface file.

    Here is an example of %array_functions(). Suppose you had a function like this:

    void print_array(double x[10]) {
      int i;
      for (i = 0; i < 10; i++) {
        printf("[%d] = %g\n", i, x[i]);
      }
    }
    

    To wrap it, you might write this:

    %module example
    
    %include "carrays.i"
    %array_functions(double, doubleArray);
    
    void print_array(double x[10]);
    

    Now, in a scripting language, you might write this:

    a = new_doubleArray(10)             # Create an array
    for i in range(0, 10):
        doubleArray_setitem(a, i, 2*i)  # Set a value
    print_array(a)                      # Pass to C
    delete_doubleArray(a)               # Destroy array
    

    %array_class(type, name)

    Wraps a pointer of type * inside a class-based interface. This interface is as follows:

    struct name {
      name(int nelements);                  // Create an array
      ~name();                              // Delete array
      type getitem(int index);              // Return item
      void setitem(int index, type value);  // Set item
      type *cast();                         // Cast to original type
      static name *frompointer(type *);     // Create class wrapper from
                                            // existing pointer
    };
    

    When using this macro, type is restricted to a simple type name like int or float. Pointers and other complicated types are not allowed. name must be a valid identifier not already in use. When a pointer is wrapped as a class, it can be transparently passed to any function that expects the pointer.

    When combined with proxy classes, the %array_class() macro can be especially useful. For example:

    %module example
    %include "carrays.i"
    %array_class(double, doubleArray);
    
    void print_array(double x[10]);
    

    Allows you to do this:

    import example
    c = example.doubleArray(10)  # Create double[10]
    for i in range(0, 10):
        c[i] = 2*i               # Assign values
    example.print_array(c)       # Pass to C
    

    Note: These macros do not encapsulate C arrays inside a special data structure or proxy. There is no bounds checking or safety of any kind. If you want this, you should consider using a special array object rather than a bare pointer.

    Note: %array_functions() and %array_class() should not be used with types of char or char *.

    9.2.3 cmalloc.i

    This module defines macros for wrapping the low-level C memory allocation functions malloc(), calloc(), realloc(), and free().

    %malloc(type [, name=type])

    Creates a wrapper around malloc() with the following prototype:

    type *malloc_name(int nbytes = sizeof(type));
    

    If type is void, then the size parameter nbytes is required. The name parameter only needs to be specified when wrapping a type that is not a valid identifier (e.g., " int *", "double **", etc.).

    %calloc(type [, name=type])

    Creates a wrapper around calloc() with the following prototype:

    type *calloc_name(int nobj =1, int sz = sizeof(type));
    

    If type is void, then the size parameter sz is required.

    %realloc(type [, name=type])

    Creates a wrapper around realloc() with the following prototype:

    type *realloc_name(type *ptr, int nitems);
    

    Note: unlike the C realloc(), the wrapper generated by this macro implicitly includes the size of the corresponding type. For example, realloc_int(p, 100) reallocates p so that it holds 100 integers.

    %free(type [, name=type])

    Creates a wrapper around free() with the following prototype:

    void free_name(type *ptr);
    

    %sizeof(type [, name=type])

    Creates the constant:

    %constant int sizeof_name = sizeof(type);
    

    %allocators(type [, name=type])

    Generates wrappers for all five of the above operations.

    Here is a simple example that illustrates the use of these macros:

    // SWIG interface
    %module example
    %include "cmalloc.i"
    
    %malloc(int);
    %free(int);
    
    %malloc(int *, intp);
    %free(int *, intp);
    
    %allocators(double);
    

    Now, in a script:

    >>> from example import *
    >>> a = malloc_int()
    >>> a
    '_000efa70_p_int'
    >>> free_int(a)
    >>> b = malloc_intp()
    >>> b
    '_000efb20_p_p_int'
    >>> free_intp(b)
    >>> c = calloc_double(50)
    >>> c
    '_000fab98_p_double'
    >>> c = realloc_double(100000)
    >>> free_double(c)
    >>> print sizeof_double
    8
    >>>
    

    9.2.4 cdata.i

    The cdata.i module defines functions for converting raw C data to and from strings in the target language. The primary applications of this module would be packing/unpacking of binary data structures---for instance, if you needed to extract data from a buffer. The target language must support strings with embedded binary data in order for this to work.

    const char *cdata(void *ptr, size_t nbytes)

    Converts nbytes of data at ptr into a string. ptr can be any pointer.

    void memmove(void *ptr, const char *s)

    Copies all of the string data in s into the memory pointed to by ptr. The string may contain embedded NULL bytes. This is actually a wrapper to the standard C library memmove function, which is declared as void memmove(void *ptr, const void *src, size_t n). The src and length n parameters are extracted from the language specific string s in the underlying wrapper code.

    One use of these functions is packing and unpacking data from memory. Here is a short example:

    // SWIG interface
    %module example
    %include "carrays.i"
    %include "cdata.i"
    
    %array_class(int, intArray);
    

    Python example:

    >>> a = intArray(10)
    >>> for i in range(0, 10):
    ...    a[i] = i
    >>> b = cdata(a, 40)
    >>> b
    '\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04
    \x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\t'
    >>> c = intArray(10)
    >>> memmove(c, b)
    >>> print c[4]
    4
    >>>
    

    Since the size of data is not always known, the following macro is also defined:

    %cdata(type [, name=type])

    Generates the following function for extracting C data for a given type.

    char *cdata_name(type* ptr, int nitems)
    

    nitems is the number of items of the given type to extract.

    Note: These functions provide direct access to memory and can be used to overwrite data. Clearly they are unsafe.

    9.3 C String Handling

    A common problem when working with C programs is dealing with functions that manipulate raw character data using char *. In part, problems arise because there are different interpretations of char *---it could be a NULL-terminated string or it could point to binary data. Moreover, functions that manipulate raw strings may mutate data, perform implicit memory allocations, or utilize fixed-sized buffers.

    The problems (and perils) of using char * are well-known. However, SWIG is not in the business of enforcing morality. The modules in this section provide basic functionality for manipulating raw C strings.

    9.3.1 Default string handling

    Suppose you have a C function with this prototype:

    char *foo(char *s);
    

    The default wrapping behavior for this function is to set s to a raw char * that refers to the internal string data in the target language. In other words, if you were using a language like Tcl, and you wrote this,

    % foo Hello
    

    then s would point to the representation of "Hello" inside the Tcl interpreter. When returning a char *, SWIG assumes that it is a NULL-terminated string and makes a copy of it. This gives the target language its own copy of the result.

    There are obvious problems with the default behavior. First, since a char * argument points to data inside the target language, it is NOT safe for a function to modify this data (doing so may corrupt the interpreter and lead to a crash). Furthermore, the default behavior does not work well with binary data. Instead, strings are assumed to be NULL-terminated.

    9.3.2 Passing binary data

    If you have a function that expects binary data,

    size_t parity(char *str, size_t len, size_t initial);
    

    you can wrap the parameters (char *str, size_t len) as a single argument using a typemap. Just do this:

    %apply (char *STRING, size_t LENGTH) { (char *str, size_t len) };
    ...
    size_t parity(char *str, size_t len, size_t initial);
    

    Now, in the target language, you can use binary string data like this:

    >>> s = "H\x00\x15eg\x09\x20"
    >>> parity(s, 0)
    

    In the wrapper function, the passed string will be expanded to a pointer and length parameter. The (char *STRING, int LENGTH) multi-argument typemap is also available in addition to (char *STRING, size_t LENGTH).

    9.3.3 Using %newobject to release memory

    If you have a function that allocates memory like this,

    char *foo() {
      char *result = (char *) malloc(...);
      ...
      return result;
    }
    

    then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

    To fix the memory leak, use the %newobject directive.

    %newobject foo;
    ...
    char *foo();
    

    This will release the result if the appropriate target language support is available. SWIG provides the appropriate "newfree" typemap for char * so that the memory is released, however, you may need to provide your own "newfree" typemap for other types. See Object ownership and %newobject for more details.

    9.3.4 cstring.i

    The cstring.i library file provides a collection of macros for dealing with functions that either mutate string arguments or which try to output string data through their arguments. An example of such a function might be this rather questionable implementation:

    void get_path(char *s) {
      // Potential buffer overflow---uh, oh.
      sprintf(s, "%s/%s", base_directory, sub_directory);
    }
    ...
    // Somewhere else in the C program
    {
      char path[1024];
      ...
      get_path(path);
      ...
    }
    

    (Off topic rant: If your program really has functions like this, you would be well-advised to replace them with safer alternatives involving bounds checking).

    The macros defined in this module all expand to various combinations of typemaps. Therefore, the same pattern matching rules and ideas apply.

    %cstring_bounded_output(parm, maxsize)

    Turns parameter parm into an output value. The output string is assumed to be NULL-terminated and smaller than maxsize characters. Here is an example:

    %cstring_bounded_output(char *path, 1024);
    ...
    void get_path(char *path);
    

    In the target language:

    >>> get_path()
    /home/beazley/packages/Foo/Bar
    >>>
    

    Internally, the wrapper function allocates a small buffer (on the stack) of the requested size and passes it as the pointer value. Data stored in the buffer is then returned as a function return value. If the function already returns a value, then the return value and the output string are returned together (multiple return values). If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_chunk_output(parm, chunksize)

    Turns parameter parm into an output value. The output string is always chunksize and may contain binary data. Here is an example:

    %cstring_chunk_output(char *packet, PACKETSIZE);
    ...
    void get_packet(char *packet);
    

    In the target language:

    >>> get_packet()
    '\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
    >>>
    

    This macro is essentially identical to %cstring_bounded_output . The only difference is that the result is always chunksize characters. Furthermore, the result can contain binary data. If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_bounded_mutable(parm, maxsize)

    Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated and smaller than maxsize characters. The output string is also assumed to be NULL-terminated and less than maxsize characters.

    %cstring_bounded_mutable(char *ustr, 1024);
    ...
    void make_upper(char *ustr);
    

    In the target language:

    >>> make_upper("hello world")
    'HELLO WORLD'
    >>>
    

    Internally, this macro is almost exactly the same as %cstring_bounded_output. The only difference is that the parameter accepts an input value that is used to initialize the internal buffer. It is important to emphasize that this function does not mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If more than maxsize bytes are written, your program will crash with a buffer overflow!

    %cstring_mutable(parm [, expansion])

    Turns parameter parm into a mutable string argument. The input string is assumed to be NULL-terminated. An optional parameter expansion specifies the number of extra characters by which the string might grow when it is modified. The output string is assumed to be NULL-terminated and less than the size of the input string plus any expansion characters.

    %cstring_mutable(char *ustr);
    ...
    void make_upper(char *ustr);
    
    %cstring_mutable(char *hstr, HEADER_SIZE);
    ...
    void attach_header(char *hstr);
    

    In the target language:

    >>> make_upper("hello world")
    'HELLO WORLD'
    >>> attach_header("Hello world")
    'header: Hello world'
    >>>
    

    This macro differs from %cstring_bounded_mutable() in that a buffer is dynamically allocated (on the heap using malloc/new ). This buffer is always large enough to store a copy of the input value plus any expansion bytes that might have been requested. It is important to emphasize that this function does not directly mutate the string value passed---instead it makes a copy of the input value, mutates it, and returns it as a result. If the function expands the result by more than expansion extra bytes, then the program will crash with a buffer overflow!

    %cstring_output_maxsize(parm, maxparm)

    This macro is used to handle bounded character output functions where both a char * and a maximum length parameter are provided. As input, a user simply supplies the maximum length. The return value is assumed to be a NULL-terminated string.

    %cstring_output_maxsize(char *path, int maxpath);
    ...
    void get_path(char *path, int maxpath);
    

    In the target language:

    >>> get_path(1024)
    '/home/beazley/Packages/Foo/Bar'
    >>>
    

    This macro provides a safer alternative for functions that need to write string data into a buffer. User supplied buffer size is used to dynamically allocate memory on heap. Results are placed into that buffer and returned as a string object.

    %cstring_output_withsize(parm, maxparm)

    This macro is used to handle bounded character output functions where both a char * and a pointer int * are passed. Initially, the int * parameter points to a value containing the maximum size. On return, this value is assumed to contain the actual number of bytes. As input, a user simply supplies the maximum length. The output value is a string that may contain binary data.

    %cstring_output_withsize(char *data, int *maxdata);
    ...
    void get_data(char *data, int *maxdata);
    

    In the target language:

    >>> get_data(1024)
    'x627388912'
    >>> get_data(1024)
    'xyzzy'
    >>>
    

    This macro is a somewhat more powerful version of %cstring_output_chunk(). Memory is dynamically allocated and can be arbitrary large. Furthermore, a function can control how much data is actually returned by changing the value of the maxparm argument.

    %cstring_output_allocate(parm, release)

    This macro is used to return strings that are allocated within the program and returned in a parameter of type char **. For example:

    void foo(char **s) {
      *s = (char *) malloc(64);
      sprintf(*s, "Hello world\n");
    }
    

    The returned string is assumed to be NULL-terminated. release specifies how the allocated memory is to be released (if applicable). Here is an example:

    %cstring_output_allocate(char **s, free(*$1));
    ...
    void foo(char **s);
    

    In the target language:

    >>> foo()
    'Hello world\n'
    >>>
    

    %cstring_output_allocate_size(parm, szparm, release)

    This macro is used to return strings that are allocated within the program and returned in two parameters of type char ** and int *. For example:

    void foo(char **s, int *sz) {
      *s = (char *) malloc(64);
      *sz = 64;
      // Write some binary data
      ...
    }
    

    The returned string may contain binary data. release specifies how the allocated memory is to be released (if applicable). Here is an example:

    %cstring_output_allocate_size(char **s, int *slen, free(*$1));
    ...
    void foo(char **s, int *slen);
    

    In the target language:

    >>> foo()
    '\xa9Y:\xf6\xd7\xe1\x87\xdbH;y\x97\x7f\xd3\x99\x14V\xec\x06\xea\xa2\x88'
    >>>
    

    This is the safest and most reliable way to return binary string data in SWIG. If you have functions that conform to another prototype, you might consider wrapping them with a helper function. For example, if you had this:

    char  *get_data(int *len);
    

    You could wrap it with a function like this:

    void my_get_data(char **result, int *len) {
      *result = get_data(len);
    }
    

    Comments:

    • Support for the cstring.i module depends on the target language. Not all SWIG modules currently support this library.
    • Reliable handling of raw C strings is a delicate topic. There are many ways to accomplish this in SWIG. This library provides support for a few common techniques.
    • If used in C++, this library uses new and delete [] for memory allocation. If using ANSI C, the library uses malloc() and free().
    • Rather than manipulating char * directly, you might consider using a special string structure or class instead.

    9.4 STL/C++ Library

    The library modules in this section provide access to parts of the standard C++ library including the STL. SWIG support for the STL is an ongoing effort. Support is quite comprehensive for some language modules but some of the lesser used modules do not have quite as much library code written.

    The following table shows which C++ classes are supported and the equivalent SWIG interface library file for the C++ library.

    C++ classC++ Library file SWIG Interface library file
    std::auto_ptrmemorystd_auto_ptr.i
    std::dequedequestd_deque.i
    std::listliststd_list.i
    std::mapmapstd_map.i
    std::pairutilitystd_pair.i
    std::setsetstd_set.i
    std::stringstringstd_string.i
    std::vectorvectorstd_vector.i
    std::arrayarray (C++11)std_array.i
    std::shared_ptrshared_ptr (C++11) std_shared_ptr.i

    The list is by no means complete; some language modules support a subset of the above and some support additional STL classes. Please look for the library files in the appropriate language library directory.

    9.4.1 std::string

    The std_string.i library provides typemaps for converting C++ std::string objects to and from strings in the target scripting language. For example:

    %module example
    %include "std_string.i"
    
    std::string foo();
    void        bar(const std::string &x);
    

    In the target language:

    x = foo();                # Returns a string object
    bar("Hello World");       # Pass string as std::string
    

    A common problem that people encounter is that of classes/structures containing a std::string. This can be overcome by defining a typemap. For example:

    %module example
    %include "std_string.i"
    
    %apply const std::string& {std::string* foo};
    
    struct my_struct
    {
      std::string foo;
    };
    

    In the target language:

    x = my_struct();
    x.foo="Hello World";      # assign with string
    print x.foo;              # print as string
    

    This module only supports types std::string and const std::string &. Pointers and non-const references are left unmodified and returned as SWIG pointers.

    This library file is fully aware of C++ namespaces. If you export std::string or rename it with a typedef, make sure you include those declarations in your interface. For example:

    %module example
    %include "std_string.i"
    
    using namespace std;
    typedef std::string String;
    ...
    void foo(string s, const String &t);     // std_string typemaps still applied
    

    9.4.2 std::vector

    The std_vector.i library provides support for the C++ std::vector class in the STL. Using this library involves the use of the %template directive. All you need to do is to instantiate different versions of vector for the types that you want to use. For example:

    %module example
    %include "std_vector.i"
    
    namespace std {
      %template(vectori) vector<int>;
      %template(vectord) vector<double>;
    };
    

    When a template vector<X> is instantiated a number of things happen:

    • A class that exposes the C++ API is created in the target language . This can be used to create objects, invoke methods, etc. This class is currently a subset of the real STL vector class.
    • Input typemaps are defined for vector<X>, const vector<X> &, and const vector<X> *. For each of these, a pointer vector<X> * may be passed or a native list object in the target language.
    • An output typemap is defined for vector<X>. In this case, the values in the vector are expanded into a list object in the target language.
    • For all other variations of the type, the wrappers expect to receive a vector<X> * object in the usual manner.
    • An exception handler for std::out_of_range is defined.
    • Optionally, special methods for indexing, item retrieval, slicing, and element assignment may be defined. This depends on the target language.

    To illustrate the use of this library, consider the following functions:

    /* File : example.h */
    
    #include <vector>
    #include <algorithm>
    #include <functional>
    #include <numeric>
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0)/v.size();
    }
    
    std::vector<double> half(const std::vector<double>& v) {
      std::vector<double> w(v);
      for (unsigned int i=0; i<w.size(); i++)
        w[i] /= 2.0;
      return w;
    }
    
    void halve_in_place(std::vector<double>& v) {
      std::transform(v.begin(), v.end(), v.begin(),
                     std::bind2nd(std::divides<double>(), 2.0));
    }
    

    To wrap with SWIG, you might write the following:

    %module example
    %{
    #include "example.h"
    %}
    
    %include "std_vector.i"
    // Instantiate templates used by example
    namespace std {
      %template(IntVector) vector<int>;
      %template(DoubleVector) vector<double>;
    }
    
    // Include the header file with above prototypes
    %include "example.h"
    

    Now, to illustrate the behavior in the scripting interpreter, consider this Python example:

    >>> from example import *
    >>> iv = IntVector(4)         # Create an vector<int>
    >>> for i in range(0, 4):
    ...      iv[i] = i
    >>> average(iv)               # Call method
    1.5
    >>> average([0, 1, 2, 3])        # Call with list
    1.5
    >>> half([1, 2, 3])             # Half a list
    (0.5, 1.0, 1.5)
    >>> halve_in_place([1, 2, 3])   # Oops
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_std__vectorTdouble_t
    >>> dv = DoubleVector(4)
    >>> for i in range(0, 4):
    ...       dv[i] = i
    >>> halve_in_place(dv)       # Ok
    >>> for i in dv:
    ...       print i
    ...
    0.0
    0.5
    1.0
    1.5
    >>> dv[20] = 4.5
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 81, in __setitem__
        def __setitem__(*args): return apply(examplec.DoubleVector___setitem__, args)
    IndexError: vector index out of range
    >>>
    

    This library module is fully aware of C++ namespaces. If you use vectors with other names, make sure you include the appropriate using or typedef directives. For example:

    %include "std_vector.i"
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    using namespace std;
    typedef std::vector Vector;
    
    void foo(vector<int> *x, const Vector &x);
    

    Note: This module makes use of several advanced SWIG features including templatized typemaps and template partial specialization. If you are trying to wrap other C++ code with templates, you might look at the code contained in std_vector.i. Alternatively, you can show them the code if you want to make their head explode.

    Note: This module is defined for all SWIG target languages. However argument conversion details and the public API exposed to the interpreter vary.

    9.4.3 STL exceptions

    Many of the STL wrapper functions add parameter checking and will throw a language dependent error/exception should the values not be valid. The classic example is array bounds checking. The library wrappers are written to throw a C++ exception in the case of error. The C++ exception in turn gets converted into an appropriate error/exception for the target language. By and large this handling should not need customising, however, customisation can easily be achieved by supplying appropriate "throws" typemaps. For example:

    %module example
    %include "std_vector.i"
    %typemap(throws) std::out_of_range {
      // custom exception handler
    }
    %template(VectInt) std::vector<int>;
    

    The custom exception handler might, for example, log the exception then convert it into a specific error/exception for the target language.

    When using the STL it is advisable to add in an exception handler to catch all STL exceptions. The %exception directive can be used by placing the following code before any other methods or libraries to be wrapped:

    %include "exception.i"
    
    %exception {
      try {
        $action
      } catch (const std::exception& e) {
        SWIG_exception(SWIG_RuntimeError, e.what());
      }
    }
    

    Any thrown STL exceptions will then be gracefully handled instead of causing a crash.

    9.4.4 shared_ptr smart pointer

    Some target languages have support for handling the shared_ptr reference counted smart pointer. This smart pointer is available in the standard C++11 library as std::shared_ptr. It was also in TR1 as std::tr1::shared_ptr before it was fully standardized. Support for the widely used boost::shared_ptr is also available.

    In order to use std::shared_ptr, the std_shared_ptr.i library file should be included:

    %include <std_shared_ptr.i>
    

    The pre-standard std::tr1::shared_ptr can be used by including the following macro before including the std_shared_ptr.i library file:

    #define SWIG_SHARED_PTR_SUBNAMESPACE tr1
    %include <std_shared_ptr.i>
    

    In order to use boost::shared_ptr, the boost_shared_ptr.i library file should be included:

    %include <boost_shared_ptr.i>
    

    You can only use one of these variants of shared_ptr in your interface file at a time. and all three variants must be used in conjunction with the %shared_ptr(T) macro, where T is the underlying pointer type equating to usage shared_ptr<T>. The type T must be non-primitive. A simple example demonstrates usage:

    %module example
    %include <boost_shared_ptr.i>
    %shared_ptr(IntValue)
    
    %inline %{
    #include <boost/shared_ptr.hpp>
    
    struct IntValue {
      int value;
      IntValue(int v) : value(v) {}
    };
    
    static int extractValue(const IntValue &t) {
      return t.value;
    }
    
    static int extractValueSmart(boost::shared_ptr<IntValue> t) {
      return t->value;
    }
    %}
    

    Note that the %shared_ptr(IntValue) declaration occurs after the inclusion of the boost_shared_ptr.i library which provides the macro and, very importantly, before any usage or declaration of the type, IntValue. The %shared_ptr macro provides, a few things for handling this smart pointer, but mostly a number of typemaps. These typemaps override the default typemaps so that the underlying proxy class is stored and passed around as a pointer to a shared_ptr instead of a plain pointer to the underlying type. This approach means that any instantiation of the type can be passed to methods taking the type by value, reference, pointer or as a smart pointer. The interested reader might want to look at the generated code, however, usage is simple and no different handling is required from the target language. For example, a simple use case of the above code from Java would be:

    IntValue iv = new IntValue(1234);
    int val1 = example.extractValue(iv);
    int val2 = example.extractValueSmart(iv);
    System.out.println(val1 + " " + val2);
    

    This shared_ptr library works quite differently to SWIG's normal, but somewhat limited, smart pointer handling. The shared_ptr library does not generate extra wrappers, just for smart pointer handling, in addition to the proxy class. The normal proxy class including inheritance relationships is generated as usual. The only real change introduced by the %shared_ptr macro is that the proxy class stores a pointer to the shared_ptr instance instead of a raw pointer to the instance. A proxy class derived from a base which is being wrapped with shared_ptr can and must be wrapped as a shared_ptr too. In other words all classes in an inheritance hierarchy must all be used with the %shared_ptr macro. For example the following code can be used with the base class shown earlier:

    %shared_ptr(DerivedIntValue)
    %inline %{
    struct DerivedIntValue : IntValue {
      DerivedIntValue(int value) : IntValue(value) {}
      ...
    };
    %}
    

    A shared_ptr of the derived class can now be passed to a method where the base is expected in the target language, just as it can in C++:

    DerivedIntValue div = new DerivedIntValue(5678);
    int val3 = example.extractValue(div);
    int val4 = example.extractValueSmart(div);
    

    If the %shared_ptr macro is omitted for any class in the inheritance hierarchy, SWIG will warn about this and the generated code may or may not result in a C++ compilation error. For example, the following input:

    %include "boost_shared_ptr.i"
    %shared_ptr(Parent);
    
    %inline %{
      #include <boost/shared_ptr.hpp>
      struct GrandParent {
        virtual ~GrandParent() {}
      };
    
      struct Parent : GrandParent {
        virtual ~Parent() {}
      };
    
      struct Child : Parent {
        virtual ~Child() {}
      };
    %}
    

    warns about the missing smart pointer information:

    example.i:12: Warning 520: Base class 'GrandParent' of 'Parent' is not similarly marked as a smart pointer.
    example.i:16: Warning 520: Derived class 'Child' of 'Parent' is not similarly marked as a smart pointer.
    

    Adding the missing %shared_ptr macros will fix this:

    %include "boost_shared_ptr.i"
    %shared_ptr(GrandParent);
    %shared_ptr(Parent);
    %shared_ptr(Child);
    
    ... as before ...
    

    Note: There is somewhat limited support for %shared_ptr and the director feature and the degrees of success varies among the different target languages. Please help to improve this support by providing patches with improvements.

    9.4.5 auto_ptr smart pointer

    While std::auto_ptr is deprecated in C++11, some existing code may still be using it, so SWIG provides limited support for this class: std_auto_ptr.i defines the typemaps which apply to the functions returning objects of this type. Any other use of std_auto_ptr.i is not directly supported.

    A typical example of use would be

    %include <std_auto_ptr.i>
    
    %auto_ptr(Klass)
    %inline %{
    class Klass {
    public:
      // Factory function creating objects of this class:
      static std::auto_ptr<Klass> Create(int value) {
        return std::auto_ptr<Klass>(new Klass(value));
      }
    
      int getValue() const { return m_value; }
    
    private:
      DerivedIntValue(int value) : m_value(value) {}
      int m_value;
    };
    %}
    

    The returned objects can be used naturally from the target language, e.g. from C#:

    Klass k = Klass.Create(17);
    int value = k.getValue();
    

    9.5 Utility Libraries

    9.5.1 exception.i

    The exception.i library provides a language-independent function for raising a run-time exception in the target language. This library is largely used by the SWIG library writers. If possible, use the error handling scheme available to your target language as there is greater flexibility in what errors/exceptions can be thrown.

    SWIG_exception(int code, const char *message)

    Raises an exception in the target language. code is one of the following symbolic constants:

    SWIG_MemoryError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    

    message is a string indicating more information about the problem.

    The primary use of this module is in writing language-independent exception handlers. For example:

    %include "exception.i"
    %exception std::vector::getitem {
      try {
        $action
      } catch (std::out_of_range& e) {
        SWIG_exception(SWIG_IndexError, const_cast<char*>(e.what()));
      }
    }
    

    10 Argument Handling

    In Chapter 3, SWIG's treatment of basic datatypes and pointers was described. In particular, primitive types such as int and double are mapped to corresponding types in the target language. For everything else, pointers are used to refer to structures, classes, arrays, and other user-defined datatypes. However, in certain applications it is desirable to change SWIG's handling of a specific datatype. For example, you might want to return multiple values through the arguments of a function. This chapter describes some of the techniques for doing this.

    10.1 The typemaps.i library

    This section describes the typemaps.i library file--commonly used to change certain properties of argument conversion.

    10.1.1 Introduction

    Suppose you had a C function like this:

    void add(double a, double b, double *result) {
      *result = a + b;
    }
    

    From reading the source code, it is clear that the function is storing a value in the double *result parameter. However, since SWIG does not examine function bodies, it has no way to know that this is the underlying behavior.

    One way to deal with this is to use the typemaps.i library file and write interface code like this:

    // Simple example using typemaps
    %module example
    %include "typemaps.i"
    
    %apply double *OUTPUT { double *result };
    %inline %{
    extern void add(double a, double b, double *result);
    %}
    

    The %apply directive tells SWIG that you are going to apply a special type handling rule to a type. The "double *OUTPUT" specification is the name of a rule that defines how to return an output value from an argument of type double *. This rule gets applied to all of the datatypes listed in curly braces-- in this case " double *result".

    When the resulting module is created, you can now use the function like this (shown for Python):

    >>> a = add(3, 4)
    >>> print a
    7
    >>>
    

    In this case, you can see how the output value normally returned in the third argument has magically been transformed into a function return value. Clearly this makes the function much easier to use since it is no longer necessary to manufacture a special double * object and pass it to the function somehow.

    Once a typemap has been applied to a type, it stays in effect for all future occurrences of the type and name. For example, you could write the following:

    %module example
    %include "typemaps.i"
    
    %apply double *OUTPUT { double *result };
    
    %inline %{
    extern void add(double a, double b, double *result);
    extern void sub(double a, double b, double *result);
    extern void mul(double a, double b, double *result);
    extern void div(double a, double b, double *result);
    %}
    ...
    

    In this case, the double *OUTPUT rule is applied to all of the functions that follow.

    Typemap transformations can even be extended to multiple return values. For example, consider this code:

    %include "typemaps.i"
    %apply int *OUTPUT { int *width, int *height };
    
    // Returns a pair (width, height)
    void getwinsize(int winid, int *width, int *height);
    

    In this case, the function returns multiple values, allowing it to be used like this:

    >>> w, h = genwinsize(wid)
    >>> print w
    400
    >>> print h
    300
    >>>
    

    It should also be noted that although the %apply directive is used to associate typemap rules to datatypes, you can also use the rule names directly in arguments. For example, you could write this:

    // Simple example using typemaps
    %module example
    %include "typemaps.i"
    
    %{
    extern void add(double a, double b, double *OUTPUT);
    %}
    extern void add(double a, double b, double *OUTPUT);
    

    Typemaps stay in effect until they are explicitly deleted or redefined to something else. To clear a typemap, the %clear directive should be used. For example:

    %clear double *result;      // Remove all typemaps for double *result
    

    10.1.2 Input parameters

    The following typemaps instruct SWIG that a pointer really only holds a single input value:

    int *INPUT
    short *INPUT
    long *INPUT
    unsigned int *INPUT
    unsigned short *INPUT
    unsigned long *INPUT
    double *INPUT
    float *INPUT
    

    When used, it allows values to be passed instead of pointers. For example, consider this function:

    double add(double *a, double *b) {
      return *a+*b;
    }
    

    Now, consider this SWIG interface:

    %module example
    %include "typemaps.i"
    ...
    %{
    extern double add(double *, double *);
    %}
    extern double add(double *INPUT, double *INPUT);
    
    

    When the function is used in the scripting language interpreter, it will work like this:

    result = add(3, 4)
    

    10.1.3 Output parameters

    The following typemap rules tell SWIG that pointer is the output value of a function. When used, you do not need to supply the argument when calling the function. Instead, one or more output values are returned.

    int *OUTPUT
    short *OUTPUT
    long *OUTPUT
    unsigned int *OUTPUT
    unsigned short *OUTPUT
    unsigned long *OUTPUT
    double *OUTPUT
    float *OUTPUT
    
    

    These methods can be used as shown in an earlier example. For example, if you have this C function :

    void add(double a, double b, double *c) {
      *c = a+b;
    }
    

    A SWIG interface file might look like this :

    %module example
    %include "typemaps.i"
    ...
    %inline %{
    extern void add(double a, double b, double *OUTPUT);
    %}
    
    

    In this case, only a single output value is returned, but this is not a restriction. An arbitrary number of output values can be returned by applying the output rules to more than one argument (as shown previously).

    If the function also returns a value, it is returned along with the argument. For example, if you had this:

    extern int foo(double a, double b, double *OUTPUT);
    

    The function will return two values like this:

    iresult, dresult = foo(3.5, 2)
    

    10.1.4 Input/Output parameters

    When a pointer serves as both an input and output value you can use the following typemaps :

    int *INOUT
    short *INOUT
    long *INOUT
    unsigned int *INOUT
    unsigned short *INOUT
    unsigned long *INOUT
    double *INOUT
    float *INOUT
    
    

    A C function that uses this might be something like this:

    void negate(double *x) {
      *x = -(*x);
    }
    
    

    To make x function as both and input and output value, declare the function like this in an interface file :

    %module example
    %include "typemaps.i"
    ...
    %{
    extern void negate(double *);
    %}
    extern void negate(double *INOUT);
    
    

    Now within a script, you can simply call the function normally :

    a = negate(3);         # a = -3 after calling this
    

    One subtle point of the INOUT rule is that many scripting languages enforce mutability constraints on primitive objects (meaning that simple objects like integers and strings aren't supposed to change). Because of this, you can't just modify the object's value in place as the underlying C function does in this example. Therefore, the INOUT rule returns the modified value as a new object rather than directly overwriting the value of the original input object.

    Compatibility note : The INOUT rule used to be known as BOTH in earlier versions of SWIG. Backwards compatibility is preserved, but deprecated.

    10.1.5 Using different names

    As previously shown, the %apply directive can be used to apply the INPUT, OUTPUT, and INOUT typemaps to different argument names. For example:

    // Make double *result an output value
    %apply double *OUTPUT { double *result };
    
    // Make Int32 *in an input value
    %apply int *INPUT { Int32 *in };
    
    // Make long *x inout
    %apply long *INOUT {long *x};
    
    

    To clear a rule, the %clear directive is used:

    %clear double *result;
    %clear Int32 *in, long *x;
    

    Typemap declarations are lexically scoped so a typemap takes effect from the point of definition to the end of the file or a matching %clear declaration.

    10.2 Applying constraints to input values

    In addition to changing the handling of various input values, it is also possible to use typemaps to apply constraints. For example, maybe you want to insure that a value is positive, or that a pointer is non-NULL. This can be accomplished including the constraints.i library file.

    10.2.1 Simple constraint example

    The constraints library is best illustrated by the following interface file :

    // Interface file with constraints
    %module example
    %include "constraints.i"
    
    double exp(double x);
    double log(double POSITIVE);         // Allow only positive values
    double sqrt(double NONNEGATIVE);     // Non-negative values only
    double inv(double NONZERO);          // Non-zero values
    void   free(void *NONNULL);          // Non-NULL pointers only
    
    

    The behavior of this file is exactly as you would expect. If any of the arguments violate the constraint condition, a scripting language exception will be raised. As a result, it is possible to catch bad values, prevent mysterious program crashes and so on.

    10.2.2 Constraint methods

    The following constraints are currently available

    POSITIVE                     Any number > 0 (not zero)
    NEGATIVE                     Any number < 0 (not zero)
    NONNEGATIVE                  Any number >= 0
    NONPOSITIVE                  Any number <= 0
    NONZERO                      Nonzero number
    NONNULL                      Non-NULL pointer (pointers only).
    
    

    10.2.3 Applying constraints to new datatypes

    The constraints library only supports the primitive C datatypes, but it is easy to apply it to new datatypes using %apply. For example :

    // Apply a constraint to a Real variable
    %apply Number POSITIVE { Real in };
    
    // Apply a constraint to a pointer type
    %apply Pointer NONNULL { Vector * };
    
    

    The special types of "Number" and "Pointer" can be applied to any numeric and pointer variable type respectively. To later remove a constraint, the %clear directive can be used :

    %clear Real in;
    %clear Vector *;
    

    11 Typemaps

    11.1 Introduction

    Chances are, you are reading this chapter for one of two reasons; you either want to customize SWIG's behavior or you overheard someone mumbling some incomprehensible drivel about "typemaps" and you asked yourself "typemaps, what are those?" That said, let's start with a short disclaimer that "typemaps" are an advanced customization feature that provide direct access to SWIG's low-level code generator. Not only that, they are an integral part of the SWIG C++ type system (a non-trivial topic of its own). Typemaps are generally not a required part of using SWIG. Therefore, you might want to re-read the earlier chapters if you have found your way to this chapter with only a vague idea of what SWIG already does by default.

    11.1.1 Type conversion

    One of the most important problems in wrapper code generation is the conversion or marshalling of datatypes between programming languages. Specifically, for every C/C++ declaration, SWIG must somehow generate wrapper code that allows values to be passed back and forth between languages. Since every programming language represents data differently, this is not a simple of matter of simply linking code together with the C linker. Instead, SWIG has to know something about how data is represented in each language and how it can be manipulated.

    To illustrate, suppose you had a simple C function like this:

    int factorial(int n);
    

    To access this function from Python, a pair of Python API functions are used to convert integer values. For example:

    long PyInt_AsLong(PyObject *obj);      /* Python --> C */
    PyObject *PyInt_FromLong(long x);      /* C --> Python */
    

    The first function is used to convert the input argument from a Python integer object to C long. The second function is used to convert a value from C back into a Python integer object.

    Inside the wrapper function, you might see these functions used like this:

    PyObject *wrap_factorial(PyObject *self, PyObject *args) {
      int       arg1;
      int       result;
      PyObject *obj1;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("O:factorial", &obj1)) return NULL;
      arg1 = PyInt_AsLong(obj1);
      result = factorial(arg1);
      resultobj = PyInt_FromLong(result);
      return resultobj;
    }
    

    Every target language supported by SWIG has functions that work in a similar manner. For example, in Perl, the following functions are used:

    IV SvIV(SV *sv);                     /* Perl --> C */
    void sv_setiv(SV *sv, IV val);       /* C --> Perl */
    

    In Tcl:

    int Tcl_GetLongFromObj(Tcl_Interp *interp, Tcl_Obj *obj, long *value);
    Tcl_Obj *Tcl_NewIntObj(long value);
    

    The precise details are not so important. What is important is that all of the underlying type conversion is handled by collections of utility functions and short bits of C code like this---you simply have to read the extension documentation for your favorite language to know how it works (an exercise left to the reader).

    11.1.2 Typemaps

    Since type handling is so central to wrapper code generation, SWIG allows it to be completely defined (or redefined) by the user. To do this, a special %typemap directive is used. For example:

    /* Convert from Python --> C */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    
    /* Convert from C --> Python */
    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    At first glance, this code will look a little confusing. However, there is really not much to it. The first typemap (the "in" typemap) is used to convert a value from the target language to C. The second typemap (the "out" typemap) is used to convert in the other direction. The content of each typemap is a small fragment of code that is inserted directly into the SWIG generated wrapper functions. The code is usually C or C++ code which will be generated into the C/C++ wrapper functions. Note that this isn't always the case as some target language modules allow target language code within the typemaps which gets generated into target language specific files. Within this code, a number of special variables prefixed with a $ are expanded. These are really just placeholders for C/C++ variables that are generated in the course of creating the wrapper function. In this case, $input refers to an input object that needs to be converted to C/C++ and $result refers to an object that is going to be returned by a wrapper function. $1 refers to a C/C++ variable that has the same type as specified in the typemap declaration (an int in this example).

    A short example might make this a little more clear. If you were wrapping a function like this:

    int gcd(int x, int y);
    

    A wrapper function would look approximately like this:

    PyObject *wrap_gcd(PyObject *self, PyObject *args) {
      int arg1;
      int arg2;
      int result;
      PyObject *obj1;
      PyObject *obj2;
      PyObject *resultobj;
    
      if (!PyArg_ParseTuple("OO:gcd", &obj1, &obj2)) return NULL;
    
      /* "in" typemap, argument 1 */
      {
        arg1 = PyInt_AsLong(obj1);
      }
    
      /* "in" typemap, argument 2 */
      {
        arg2 = PyInt_AsLong(obj2);
      }
    
      result = gcd(arg1, arg2);
    
      /* "out" typemap, return value */
      {
        resultobj = PyInt_FromLong(result);
      }
    
      return resultobj;
    }
    

    In this code, you can see how the typemap code has been inserted into the function. You can also see how the special $ variables have been expanded to match certain variable names inside the wrapper function. This is really the whole idea behind typemaps--they simply let you insert arbitrary code into different parts of the generated wrapper functions. Because arbitrary code can be inserted, it possible to completely change the way in which values are converted.

    11.1.3 Pattern matching

    As the name implies, the purpose of a typemap is to "map" C datatypes to types in the target language. Once a typemap is defined for a C datatype, it is applied to all future occurrences of that type in the input file. For example:

    /* Convert from Perl --> C */
    %typemap(in) int {
      $1 = SvIV($input);
    }
    
    ...
    int factorial(int n);
    int gcd(int x, int y);
    int count(char *s, char *t, int max);
    

    The matching of typemaps to C datatypes is more than a simple textual match. In fact, typemaps are fully built into the underlying type system. Therefore, typemaps are unaffected by typedef, namespaces, and other declarations that might hide the underlying type. For example, you could have code like this:

    /* Convert from Ruby--> C */
    %typemap(in) int {
      $1 = NUM2INT($input);
    }
    ...
    typedef int Integer;
    namespace foo {
      typedef Integer Number;
    };
    
    int foo(int x);
    int bar(Integer y);
    int spam(foo::Number a, foo::Number b);
    

    In this case, the typemap is still applied to the proper arguments even though typenames don't always match the text "int". This ability to track types is a critical part of SWIG--in fact, all of the target language modules work merely define a set of typemaps for the basic types. Yet, it is never necessary to write new typemaps for typenames introduced by typedef.

    In addition to tracking typenames, typemaps may also be specialized to match against a specific argument name. For example, you could write a typemap like this:

    %typemap(in) double nonnegative {
      $1 = PyFloat_AsDouble($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "argument must be nonnegative.");
        SWIG_fail;
      }
    }
    
    ...
    double sin(double x);
    double cos(double x);
    double sqrt(double nonnegative);
    
    typedef double Real;
    double log(Real nonnegative);
    ...
    

    For certain tasks such as input argument conversion, typemaps can be defined for sequences of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);   /* char *str */
      $2 = PyString_Size($input);       /* int len   */
    }
    ...
    int count(char *str, int len, char c);
    

    In this case, a single input object is expanded into a pair of C arguments. This example also provides a hint to the unusual variable naming scheme involving $1, $2, and so forth.

    11.1.4 Reusing typemaps

    Typemaps are normally defined for specific type and argument name patterns. However, typemaps can also be copied and reused. One way to do this is to use assignment like this:

    %typemap(in) Integer = int;   
    %typemap(in) (char *buffer, int size) = (char *str, int len);
    

    A more general form of copying is found in the %apply directive like this:

    %typemap(in) int {
      /* Convert an integer argument */
      ...
    }
    %typemap(out) int {
      /* Return an integer value */
      ...
    }
    
    /* Apply all of the integer typemaps to size_t */
    %apply int { size_t };    
    

    %apply merely takes all of the typemaps that are defined for one type and applies them to other types. Note: you can include a comma separated set of types in the { ... } part of %apply.

    It should be noted that it is not necessary to copy typemaps for types that are related by typedef. For example, if you have this,

    typedef int size_t;
    

    then SWIG already knows that the int typemaps apply. You don't have to do anything.

    11.1.5 What can be done with typemaps?

    The primary use of typemaps is for defining wrapper generation behavior at the level of individual C/C++ datatypes. There are currently six general categories of problems that typemaps address:

    Argument handling

    int foo(int x, double y, char *s);
    
    • Input argument conversion ("in" typemap).
    • Input argument type checking for types used in overloaded methods ("typecheck" typemap).
    • Output argument handling ("argout" typemap).
    • Input argument value checking ("check" typemap).
    • Input argument initialization ("arginit" typemap).
    • Default arguments ("default" typemap).
    • Input argument resource management ("freearg" typemap).

    Return value handling

    int foo(int x, double y, char *s);
    
    • Function return value conversion ("out" typemap).
    • Return value resource management ("ret" typemap).
    • Resource management for newly allocated objects ("newfree" typemap).

    Exception handling

    int foo(int x, double y, char *s) throw(MemoryError, IndexError);
    
    • Handling of C++ exception specifications. ("throw" typemap).

    Global variables

    int foo;
    
    • Assignment of a global variable. ("varin" typemap).
    • Reading a global variable. ("varout" typemap).

    Member variables

    struct Foo {
      int x[20];
    };
    
    • Assignment of data to a class/structure member. ("memberin" typemap).

    Constant creation

    #define FOO 3
    %constant int BAR = 42;
    enum { ALE, LAGER, STOUT };
    
    • Creation of constant values. ("consttab" or "constcode" typemap).

    Details of each of these typemaps will be covered shortly. Also, certain language modules may define additional typemaps that expand upon this list. For example, the Java module defines a variety of typemaps for controlling additional aspects of the Java bindings. Consult language specific documentation for further details.

    11.1.6 What can't be done with typemaps?

    Typemaps can't be used to define properties that apply to C/C++ declarations as a whole. For example, suppose you had a declaration like this,

    Foo *make_Foo(int n);
    

    and you wanted to tell SWIG that make_Foo(int n) returned a newly allocated object (for the purposes of providing better memory management). Clearly, this property of make_Foo(int n) is not a property that would be associated with the datatype Foo * by itself. Therefore, a completely different SWIG customization mechanism (%feature) is used for this purpose. Consult the Customization Features chapter for more information about that.

    Typemaps also can't be used to rearrange or transform the order of arguments. For example, if you had a function like this:

    void foo(int, char *);
    

    you can't use typemaps to interchange the arguments, allowing you to call the function like this:

    foo("hello", 3)          # Reversed arguments
    

    If you want to change the calling conventions of a function, write a helper function instead. For example:

    %rename(foo) wrap_foo;
    %inline %{
    void wrap_foo(char *s, int x) {
      foo(x, s);
    }
    %}
    

    11.1.7 Similarities to Aspect Oriented Programming

    SWIG has parallels to Aspect Oriented Software Development (AOP). The AOP terminology with respect to SWIG typemaps can be viewed as follows:

    • Cross-cutting concerns: The cross-cutting concerns are the modularization of the functionality that the typemaps implement, which is primarily marshalling of types from/to the target language and C/C++.
    • Advice: The typemap body contains code which is executed whenever the marshalling is required.
    • Pointcut: The pointcuts are the positions in the wrapper code that the typemap code is generated into.
    • Aspect: Aspects are the combination of the pointcut and the advice, hence each typemap is an aspect.

    SWIG can also be viewed as has having a second set of aspects based around %feature. Features such as %exception are also cross-cutting concerns as they encapsulate code that can be used to add logging or exception handling to any function.

    11.1.8 The rest of this chapter

    The rest of this chapter provides detailed information for people who want to write new typemaps. This information is of particular importance to anyone who intends to write a new SWIG target language module. Power users can also use this information to write application specific type conversion rules.

    Since typemaps are strongly tied to the underlying C++ type system, subsequent sections assume that you are reasonably familiar with the basic details of values, pointers, references, arrays, type qualifiers (e.g., const), structures, namespaces, templates, and memory management in C/C++. If not, you would be well-advised to consult a copy of "The C Programming Language" by Kernighan and Ritchie or "The C++ Programming Language" by Stroustrup before going any further.

    11.2 Typemap specifications

    This section describes the behavior of the %typemap directive itself.

    11.2.1 Defining a typemap

    New typemaps are defined using the %typemap declaration. The general form of this declaration is as follows (parts enclosed in [ ... ] are optional):

    %typemap(method [, modifiers]) typelist code ;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout". The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent. They are also known as typemap attributes.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist    :  typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern :  type [ (parms) ]
                |  type name [ (parms) ]
                |  ( typelist ) [ (parms) ]
    
    

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the code used in the typemap. Usually this is C/C++ code, but in the statically typed target languages, such as Java and C#, this can contain target language code for certain typemaps. It can take any one of the following forms:

    code       : { ... }
               | " ... "
               | %{ ... %}
    

    Note that the preprocessor will expand code within the {} delimiters, but not in the last two styles of delimiters, see Preprocessor and Typemaps. Here are some examples of valid typemap specifications:

    /* Simple typemap declarations */
    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{ 
      $1 = PyInt_AsLong($input);
    %}
    
    /* Typemap with extra argument name */
    %typemap(in) int nonnegative {
      ...
    }
    
    /* Multiple types in one typemap */
    %typemap(in) int, short, long { 
      $1 = SvIV($input);
    }
    
    /* Typemap with modifiers */
    %typemap(in, doc="integer") int "$1 = scm_to_int($input);";
    
    /* Typemap applied to patterns of multiple arguments */
    %typemap(in) (char *str, int len),
                 (char *buffer, int size)
    {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    /* Typemap with extra pattern parameters */
    %typemap(in, numinputs=0) int *output (int temp),
                              long *output (long temp)
    {
      $1 = &temp;
    }
    

    Admittedly, it's not the most readable syntax at first glance. However, the purpose of the individual pieces will become clear.

    11.2.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
    ...
    }
    
    int fact(int);                    // typemap1
    int gcd(int x, int y);            // typemap1
    
    // typemap2
    %typemap(in) int {
    ...
    }
    
    int isprime(int);                 // typemap2
    

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
     ...
    }
    
    %extend Foo {
      int blah(int x);    // typemap has no effect.  Declaration is attached to Foo which
                          // appears before the %typemap declaration.
    };
    

    11.2.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;
    

    or this:

    %typemap(in) Integer, Number, int32_t = int;
    

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in)     int { ... }
    %typemap(out)    int { ... }
    %typemap(varin)  int { ... }
    %typemap(varout) int { ... }
    

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer };            // Copy all int typemaps to Integer
    %apply int { Integer, Number };    // Copy all int typemaps to both Integer and Number
    

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output };                    // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) };  // Multiple arguments
    

    11.2.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int;               // Clears typemap for int
    %typemap(in) int, long, short;  // Clears typemap for int, long, short
    %typemap(in) int *output;       
    

    The %clear directive clears all typemaps for a given type. For example:

    %clear int;                     // Removes all types for int
    %clear int *output, long *output;
    

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    11.2.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };
    

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string {          /* std::string */
        ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string {          /* Foo::string */
        ...
      }
    }
    

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the forward class declaration class string.

    11.3 Pattern matching rules

    The section describes the pattern matching rules by which C/C++ datatypes are associated with typemaps. The matching rules can be observed in practice by using the debugging options also described.

    11.3.1 Basic matching rules

    Typemaps are matched using both a type and a name (typically the name of a argument). For a given TYPE NAME pair, the following rules are applied, in order, to find a match. The first typemap found is used.

    • Typemaps that exactly match TYPE and NAME.
    • Typemaps that exactly match TYPE only.
    • If TYPE is a C++ template of type T< TPARMS >, where TPARMS are the template parameters, the type is stripped of the template parameters and the following checks are then made:
      • Typemaps that exactly match T and NAME.
      • Typemaps that exactly match T only.

    If TYPE includes qualifiers (const, volatile, etc.), each qualifier is stripped one at a time to form a new stripped type and the matching rules above are repeated on the stripped type. The left-most qualifier is stripped first, resulting in the right-most (or top-level) qualifier being stripped last. For example int const*const is first stripped to int *const then int *.

    If TYPE is an array. The following transformation is made:

    • Replace all dimensions to [ANY] and look for a generic array typemap.

    To illustrate, suppose that you had a function like this:

    int foo(const char *s);
    

    To find a typemap for the argument const char *s, SWIG will search for the following typemaps:

    const char *s           Exact type and name match
    const char *            Exact type match
    char *s                 Type and name match (qualifier stripped)
    char *                  Type match (qualifier stripped)
    

    When more than one typemap rule might be defined, only the first match found is actually used. Here is an example that shows how some of the basic rules are applied:

    %typemap(in) int *x {
      ... typemap 1
    }
    
    %typemap(in) int * {
      ... typemap 2
    }
    
    %typemap(in) const int *z {
      ... typemap 3
    }
    
    %typemap(in) int [4] {
      ... typemap 4
    }
    
    %typemap(in) int [ANY] {
      ... typemap 5
    }
    
    void A(int *x);        // int *x rule       (typemap 1)
    void B(int *y);        // int * rule        (typemap 2)
    void C(const int *x);  // int *x rule       (typemap 1)
    void D(const int *z);  // const int *z rule (typemap 3)
    void E(int x[4]);      // int [4] rule      (typemap 4)
    void F(int x[1000]);   // int [ANY] rule    (typemap 5)
    

    Compatibility note: SWIG-2.0.0 introduced stripping the qualifiers one step at a time. Prior versions stripped all qualifiers in one step.

    11.3.2 Typedef reductions matching

    If no match is found using the rules in the previous section, SWIG applies a typedef reduction to the type and repeats the typemap search for the reduced type. To illustrate, suppose you had code like this:

    %typemap(in) int {
      ... typemap 1
    }
    
    typedef int Integer;
    void blah(Integer x);
    

    To find the typemap for Integer x, SWIG will first search for the following typemaps:

    Integer x
    Integer
    

    Finding no match, it then applies a reduction Integer -> int to the type and repeats the search.

    int x
    int      --> match: typemap 1
    

    Even though two types might be the same via typedef, SWIG allows typemaps to be defined for each typename independently. This allows for interesting customization possibilities based solely on the typename itself. For example, you could write code like this:

    typedef double  pdouble;     // Positive double
    
    // typemap 1
    %typemap(in) double {
      ... get a double ...
    }
    // typemap 2
    %typemap(in) pdouble {
      ... get a positive double ...
    }
    double sin(double x);           // typemap 1
    pdouble sqrt(pdouble x);        // typemap 2
    

    When reducing the type, only one typedef reduction is applied at a time. The search process continues to apply reductions until a match is found or until no more reductions can be made.

    For complicated types, the reduction process can generate a long list of patterns. Consider the following:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    To find a match for the Row4 rows[10] argument, SWIG would check the following patterns, stopping only when it found a match:

    Row4 rows[10]
    Row4 [10]
    Row4 rows[ANY]
    Row4 [ANY]
    
    # Reduce Row4 --> Integer[4]
    Integer rows[10][4]
    Integer [10][4]
    Integer rows[ANY][ANY]
    Integer [ANY][ANY]
    
    # Reduce Integer --> int
    int rows[10][4]
    int [10][4]
    int rows[ANY][ANY]
    int [ANY][ANY]
    

    For parameterized types like templates, the situation is even more complicated. Suppose you had some declarations like this:

    typedef int Integer;
    typedef foo<Integer, Integer> fooii;
    void blah(fooii *x);
    

    In this case, the following typemap patterns are searched for the argument fooii *x:

    fooii *x
    fooii *
    
    # Reduce fooii --> foo<Integer, Integer>
    foo<Integer, Integer> *x
    foo<Integer, Integer> *
    
    # Reduce Integer -> int
    foo<int, Integer> *x
    foo<int, Integer> *
    
    # Reduce Integer -> int
    foo<int, int> *x
    foo<int, int> *
    

    Typemap reductions are always applied to the left-most type that appears. Only when no reductions can be made to the left-most type are reductions made to other parts of the type. This behavior means that you could define a typemap for foo<int, Integer>, but a typemap for foo<Integer, int> would never be matched. Admittedly, this is rather esoteric--there's little practical reason to write a typemap quite like that. Of course, you could rely on this to confuse your coworkers even more.

    As a point of clarification, it is worth emphasizing that typedef matching is a typedef reduction process only, that is, SWIG does not search for every single possible typedef. Given a type in a declaration, it will only reduce the type, it won't build it up looking for typedefs. For example, given the type Struct, the typemap below will not be used for the aStruct parameter, because Struct is fully reduced:

    struct Struct {...};
    typedef Struct StructTypedef;
    
    %typemap(in) StructTypedef { 
      ...
    }
    
    void go(Struct aStruct);
    

    11.3.3 Default typemap matching rules

    If the basic pattern matching rules result in no match being made, even after typedef reductions, the default typemap matching rules are used to look for a suitable typemap match. These rules match a generic typemap based on the reserved SWIGTYPE base type. For example pointers will use SWIGTYPE * and references will use SWIGTYPE &. More precisely, the rules are based on the C++ class template partial specialization matching rules used by C++ compilers when looking for an appropriate partial template specialization. This means that a match is chosen from the most specialized set of generic typemap types available. For example, when looking for a match to int const *, the rules will prefer to match SWIGTYPE const * if available before matching SWIGTYPE *, before matching SWIGTYPE.

    Most SWIG language modules use typemaps to define the default behavior of the C primitive types. This is entirely straightforward. For example, a set of typemaps for primitives marshalled by value or const reference are written like this:

    %typemap(in) int           "... convert to int ...";
    %typemap(in) short         "... convert to short ...";
    %typemap(in) float         "... convert to float ...";
    ...
    %typemap(in) const int &   "... convert ...";
    %typemap(in) const short & "... convert ...";
    %typemap(in) const float & "... convert ...";
    ...
    

    Since typemap matching follows all typedef declarations, any sort of type that is mapped to a primitive type by value or const reference through typedef will be picked up by one of these primitive typemaps. Most language modules also define typemaps for char pointers and char arrays to handle strings, so these non-default types will also be used in preference as the basic typemap matching rules provide a better match than the default typemap matching rules.

    Below is a list of the typical default types supplied by language modules, showing what the "in" typemap would look like:

    %typemap(in) SWIGTYPE &            { ... default reference handling ...                       };
    %typemap(in) SWIGTYPE *            { ... default pointer handling ...                         };
    %typemap(in) SWIGTYPE *const       { ... default pointer const handling ...                   };
    %typemap(in) SWIGTYPE *const&      { ... default pointer const reference handling ...         };
    %typemap(in) SWIGTYPE[ANY]         { ... 1D fixed size arrays handlling ...                   };
    %typemap(in) SWIGTYPE []           { ... unknown sized array handling ...                     };
    %typemap(in) enum SWIGTYPE         { ... default handling for enum values ...                 };
    %typemap(in) const enum SWIGTYPE & { ... default handling for const enum reference values ... };
    %typemap(in) SWIGTYPE (CLASS::*)   { ... default pointer member handling ...                  };
    %typemap(in) SWIGTYPE              { ... simple default handling ...                          };
    

    If you wanted to change SWIG's default handling for simple pointers, you would simply redefine the rule for SWIGTYPE *. Note, the simple default typemap rule is used to match against simple types that don't match any other rules:

    %typemap(in) SWIGTYPE              { ... simple default handling ...                          } 
    

    This typemap is important because it is the rule that gets triggered when call or return by value is used. For instance, if you have a declaration like this:

    double dot_product(Vector a, Vector b);
    

    The Vector type will usually just get matched against SWIGTYPE. The default implementation of SWIGTYPE is to convert the value into pointers (as described in this earlier section).

    By redefining SWIGTYPE it may be possible to implement other behavior. For example, if you cleared all typemaps for SWIGTYPE, SWIG simply won't wrap any unknown datatype (which might be useful for debugging). Alternatively, you might modify SWIGTYPE to marshal objects into strings instead of converting them to pointers.

    Let's consider an example where the following typemaps are defined and SWIG is looking for the best match for the enum shown below:

    %typemap(in) const Hello &          { ... }
    %typemap(in) const enum SWIGTYPE &  { ... }
    %typemap(in) enum SWIGTYPE &        { ... }
    %typemap(in) SWIGTYPE &             { ... }
    %typemap(in) SWIGTYPE               { ... }
    
    enum Hello {};
    const Hello &hi;
    

    The typemap at the top of the list will be chosen, not because it is defined first, but because it is the closest match for the type being wrapped. If any of the typemaps in the above list were not defined, then the next one on the list would have precedence.

    The best way to explore the default typemaps is to look at the ones already defined for a particular language module. Typemap definitions are usually found in the SWIG library in a file such as java.swg , csharp.swg etc. However, for many of the target languages the typemaps are hidden behind complicated macros, so the best way to view the default typemaps, or any typemaps for that matter, is to look at the preprocessed output by running swig -E on any interface file. Finally the best way to view the typemap matching rules in action is via the debugging typemap pattern matching options covered later on.

    Compatibility note: The default typemap matching rules were modified in SWIG-2.0.0 from a slightly simpler scheme to match the current C++ class template partial specialization matching rules.

    11.3.4 Multi-arguments typemaps

    When multi-argument typemaps are specified, they take precedence over any typemaps specified for a single type. For example:

    %typemap(in) (char *buffer, int len) {
      // typemap 1
    }
    
    %typemap(in) char *buffer {
      // typemap 2
    }
    
    void foo(char *buffer, int len, int count); // (char *buffer, int len)
    void bar(char *buffer, int blah);           // char *buffer
    

    Multi-argument typemaps are also more restrictive in the way that they are matched. Currently, the first argument follows the matching rules described in the previous section, but all subsequent arguments must match exactly.

    11.3.5 Matching rules compared to C++ templates

    For those intimately familiar with C++ templates, a comparison of the typemap matching rules and template type deduction is interesting. The two areas considered are firstly the default typemaps and their similarities to partial template specialization and secondly, non-default typemaps and their similarities to full template specialization.

    For default (SWIGTYPE) typemaps the rules are inspired by C++ class template partial specialization. For example, given partial specialization for T const& :

    template <typename T> struct X             { void a(); };
    template <typename T> struct X< T const& > { void b(); };
    

    The full (unspecialized) template is matched with most types, such as:

    X< int & >            x1;  x1.a();
    

    and the following all match the T const& partial specialization:

    X< int *const& >      x2;  x2.b();
    X< int const*const& > x3;  x3.b();
    X< int const& >       x4;  x4.b();
    

    Now, given just these two default typemaps, where T is analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) SWIGTYPE const& { ... }
    

    The generic default typemap SWIGTYPE is used with most types, such as

    int &
    

    and the following all match the SWIGTYPE const& typemap, just like the partial template matching:

    int *const&
    int const*const&
    int const&
    

    Note that the template and typemap matching rules are not identical for all default typemaps though, for example, with arrays.

    For non-default typemaps, one might expect SWIG to follow the fully specialized template rules. This is nearly the case, but not quite. Consider a very similar example to the earlier partially specialized template but this time there is a fully specialized template:

    template <typename T> struct Y       { void a(); };
    template <> struct Y< int const & >  { void b(); };
    

    Only the one type matches the specialized template exactly:

    Y< int & >             y1;  y1.a();
    Y< int *const& >       y2;  y2.a();
    Y< int const *const& > y3;  y3.a();
    Y< int const& >        y4;  y4.b(); // fully specialized match
    

    Given typemaps with the same types used for the template declared above, where T is again analogous to SWIGTYPE:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int const&      { ... }
    

    The comparison between non-default typemaps and fully specialized single parameter templates turns out to be the same, as just the one type will match the non-default typemap:

    int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int const&
    

    However, if a non-const type is used instead:

    %typemap(...) SWIGTYPE        { ... }
    %typemap(...) int &           { ... }
    

    then there is a clear difference to template matching as both the const and non-const types match the typemap:

    int &             // matches non-default typemap int &
    int *const&
    int const*const&
    int const&        // matches non-default typemap int &
    

    There are other subtle differences such as typedef handling, but at least it should be clear that the typemap matching rules are similar to those for specialized template handling.

    11.3.6 Debugging typemap pattern matching

    There are two useful debug command line options available for debugging typemaps, -debug-tmsearch and -debug-tmused .

    The -debug-tmsearch option is a verbose option for debugging typemap searches. This can be very useful for watching the pattern matching process in action and for debugging which typemaps are used. The option displays all the typemaps and types that are looked for until a successful pattern match is made. As the display includes searches for each and every type needed for wrapping, the amount of information displayed can be large. Normally you would manually search through the displayed information for the particular type that you are interested in.

    For example, consider some of the code used in the Typedef reductions section already covered:

    typedef int Integer;
    typedef Integer Row4[4];
    void foo(Row4 rows[10]);
    

    A sample of the debugging output is shown below for the "in" typemap:

    swig -perl -debug-tmsearch example.i
    ...
    example.h:3: Searching for a suitable 'in' typemap for: Row4 rows[10]
      Looking for: Row4 rows[10]
      Looking for: Row4 [10]
      Looking for: Row4 rows[ANY]
      Looking for: Row4 [ANY]
      Looking for: Integer rows[10][4]
      Looking for: Integer [10][4]
      Looking for: Integer rows[ANY][ANY]
      Looking for: Integer [ANY][ANY]
      Looking for: int rows[10][4]
      Looking for: int [10][4]
      Looking for: int rows[ANY][ANY]
      Looking for: int [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][ANY]
      Looking for: SWIGTYPE [ANY][ANY]
      Looking for: SWIGTYPE rows[ANY][]
      Looking for: SWIGTYPE [ANY][]
      Looking for: SWIGTYPE *rows[ANY]
      Looking for: SWIGTYPE *[ANY]
      Looking for: SWIGTYPE rows[ANY]
      Looking for: SWIGTYPE [ANY]
      Looking for: SWIGTYPE rows[]
      Looking for: SWIGTYPE []
      Using: %typemap(in) SWIGTYPE []
    ...
    

    showing that the best default match supplied by SWIG is the SWIGTYPE [] typemap. As the example shows, the successful match displays the used typemap source including typemap method, type and optional name in one of these simplified formats:

    • Using: %typemap(method) type name
    • Using: %typemap(method) type name = type2 name2
    • Using: %apply type2 name2 { type name }

    This information might meet your debugging needs, however, you might want to analyze further. If you next invoke SWIG with the -E option to display the preprocessed output, and search for the particular typemap used, you'll find the full typemap contents (example shown below for Python):

    %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) {
      res = SWIG_ConvertPtr($input, &argp, $descriptor, $disown |  0 );
      if (!SWIG_IsOK(res)) { 
        SWIG_exception_fail(SWIG_ArgError(res), "in method '" "$symname" "', argument "
                           "$argnum"" of type '" "$type""'"); 
      } 
      $1 = ($ltype)(argp);
    }
    

    The generated code for the foo wrapper will then contain the snippets of the typemap with the special variables expanded. The rest of this chapter will need reading though to fully understand all of this, however, the relevant parts of the generated code for the above typemap can be seen below:

    SWIGINTERN PyObject *_wrap_foo(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
    ...
      void *argp1 = 0 ;
      int res1 = 0 ;
    ...
      res1 = SWIG_ConvertPtr(obj0, &argp1, SWIGTYPE_p_a_4__int, 0 |  0 );
      if (!SWIG_IsOK(res1)) {
        SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "foo" "', argument "
                           "1"" of type '" "int [10][4]""'"); 
      } 
      arg1 = (int (*)[4])(argp1);
    ...
    }
    

    Searches for multi-argument typemaps are not mentioned unless a matching multi-argument typemap does actually exist. For example, the output for the code in the earlier multi-arguments section is as follows:

    ...
    example.h:39: Searching for a suitable 'in' typemap for: char *buffer
      Looking for: char *buffer
      Multi-argument typemap found...
      Using: %typemap(in) (char *buffer, int len)
    ...
    

    The second option for debugging is -debug-tmused and this displays the typemaps used. This option is a less verbose version of the -debug-tmsearch option as it only displays each successfully found typemap on a separate single line. The output displays the type, and name if present, the typemap method in brackets and then the actual typemap used in the same simplified format output by the -debug-tmsearch option. Below is the output for the example code at the start of this section on debugging.

    $ swig -perl -debug-tmused example.i
    example.h:3: Typemap for Row4 rows[10] (in) : %typemap(in) SWIGTYPE []
    example.h:3: Typemap for Row4 rows[10] (typecheck) : %typemap(typecheck) SWIGTYPE *
    example.h:3: Typemap for Row4 rows[10] (freearg) : %typemap(freearg) SWIGTYPE []
    example.h:3: Typemap for void foo (out) : %typemap(out) void
    

    Now, consider the following interface file:

    %module example
    
    %{
    void set_value(const char* val) {}
    %}
    
    %typemap(check) char *NON_NULL {
      if (!$1) {
        /* ... error handling ... */
      }
    }
    
    // use default pointer handling instead of strings
    %apply SWIGTYPE * { const char* val, const char* another_value }
    
    %typemap(check) const char* val = char* NON_NULL;
    
    %typemap(arginit, noblock=1) const char* val {
      $1 = "";
    }
    
    void set_value(const char* val);
    
    

    and the output debug:

    swig -perl5 -debug-tmused example.i
    example.i:21: Typemap for char const *val (arginit) : %typemap(arginit) char const *val
    example.i:21: Typemap for char const *val (in) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (typecheck) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for char const *val (check) : %typemap(check) char const *val = char *NON_NULL
    example.i:21: Typemap for char const *val (freearg) : %apply SWIGTYPE * { char const *val }
    example.i:21: Typemap for void set_value (out) : %typemap(out) void
    

    The following observations about what is displayed can be noted (the same applies for -debug-tmsearch):

    • The relevant typemap is shown, but for typemap copying, the appropriate %typemap or %apply is displayed, for example, the "check" and "in" typemaps.
    • The typemap modifiers are not shown, eg the noblock=1 modifier in the "arginit" typemap.
    • The exact %apply statement might look different to what is in the actual code. For example, the const char* another_value is not shown as it is not relevant here. Also the types may be displayed slightly differently - char const * and not const char*.

    11.4 Code generation rules

    This section describes rules by which typemap code is inserted into the generated wrapper code.

    11.4.1 Scope

    When a typemap is defined like this:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    the typemap code is inserted into the wrapper function using a new block scope. In other words, the wrapper code will look like this:

    wrap_whatever() {
      ...
      // Typemap code
      {
        arg1 = PyInt_AsLong(obj1);
      }
      ...
    }
    

    Because the typemap code is enclosed in its own block, it is legal to declare temporary variables for use during typemap execution. For example:

    %typemap(in) short {
      long temp;          /* Temporary value */
      if (Tcl_GetLongFromObj(interp, $input, &temp) != TCL_OK) {
        return TCL_ERROR;
      }
      $1 = (short) temp;
    }
    

    Of course, any variables that you declare inside a typemap are destroyed as soon as the typemap code has executed (they are not visible to other parts of the wrapper function or other typemaps that might use the same variable names).

    Occasionally, typemap code will be specified using a few alternative forms. For example:

    %typemap(in) int "$1 = PyInt_AsLong($input);";
    %typemap(in) int %{
    $1 = PyInt_AsLong($input);
    %}
    %typemap(in, noblock=1) int {
    $1 = PyInt_AsLong($input);
    }
    

    These three forms are mainly used for cosmetics--the specified code is not enclosed inside a block scope when it is emitted. This sometimes results in a less complicated looking wrapper function. Note that only the third of the three typemaps have the typemap code passed through the SWIG preprocessor.

    11.4.2 Declaring new local variables

    Sometimes it is useful to declare a new local variable that exists within the scope of the entire wrapper function. A good example of this might be an application in which you wanted to marshal strings. Suppose you had a C++ function like this

    int foo(std::string *s);
    

    and you wanted to pass a native string in the target language as an argument. For instance, in Perl, you wanted the function to work like this:

    $x = foo("Hello World");
    

    To do this, you can't just pass a raw Perl string as the std::string * argument. Instead, you have to create a temporary std::string object, copy the Perl string data into it, and then pass a pointer to the object. To do this, simply specify the typemap with an extra parameter like this:

    %typemap(in) std::string * (std::string temp) {
      unsigned int len;
      char        *s;
      s = SvPV($input, len);         /* Extract string data */
      temp.assign(s, len);           /* Assign to temp */
      $1 = &temp;                   /* Set argument to point to temp */
    }
    

    In this case, temp becomes a local variable in the scope of the entire wrapper function. For example:

    wrap_foo() {
      std::string temp;    <--- Declaration of temp goes here
      ...
    
      /* Typemap code */
      {
        ...
        temp.assign(s, len);
        ...
      }
      ...
    }
    

    When you set temp to a value, it persists for the duration of the wrapper function and gets cleaned up automatically on exit.

    It is perfectly safe to use more than one typemap involving local variables in the same declaration. For example, you could declare a function as :

    void foo(std::string *x, std::string *y, std::string *z);
    

    This is safely handled because SWIG actually renames all local variable references by appending an argument number suffix. Therefore, the generated code would actually look like this:

    wrap_foo() {
      int *arg1;    /* Actual arguments */
      int *arg2;
      int *arg3;
      std::string temp1;    /* Locals declared in the typemap */
      std::string temp2;
      std::string temp3;
      ...
      {
        char *s;
        unsigned int len;
        ...
        temp1.assign(s, len);
        arg1 = *temp1;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp2.assign(s, len);
        arg2 = &temp2;
      }
      {
        char *s;
        unsigned int len;
        ...
        temp3.assign(s, len);
        arg3 = &temp3;
      }
      ...
    }
    

    There is an exception: if the variable name starts with the _global_ prefix, the argument number is not appended. Such variables can be used throughout the generated wrapper function. For example, the above typemap could be rewritten to use _global_temp instead of temp and the generated code would then contain a single _global_temp variable instead of temp1, temp2 and temp3:

    %typemap(in) std::string * (std::string _global_temp) {
     ... as above ...
    }
    

    Some typemaps do not recognize local variables (or they may simply not apply). At this time, only typemaps that apply to argument conversion support this (input typemaps such as the "in" typemap).

    Note:

    When declaring a typemap for multiple types, each type must have its own local variable declaration.

    %typemap(in) const std::string *, std::string * (std::string temp) // NO!
    // only std::string * has a local variable
    // const std::string * does not (oops)
    ....
    
    %typemap(in) const std::string * (std::string temp), std::string * (std::string temp) // Correct
    ....
    

    11.4.3 Special variables

    Within all typemaps, the following special variables are expanded. This is by no means a complete list as some target languages have additional special variables which are documented in the language specific chapters.

    VariableMeaning
    $n A C local variable corresponding to type n in the typemap pattern.
    $argnumArgument number. Only available in typemaps related to argument conversion
    $n_nameArgument name
    $n_typeReal C datatype of type n.
    $n_ltypeltype of type n
    $n_mangleMangled form of type n. For example _p_Foo
    $n_descriptorType descriptor structure for type n. For example SWIGTYPE_p_Foo. This is primarily used when interacting with the run-time type checker (described later).
    $*n_typeReal C datatype of type n with one pointer removed.
    $*n_ltypeltype of type n with one pointer removed.
    $*n_mangleMangled form of type n with one pointer removed.
    $*n_descriptorType descriptor structure for type n with one pointer removed.
    $&n_typeReal C datatype of type n with one pointer added.
    $&n_ltypeltype of type n with one pointer added.
    $&n_mangleMangled form of type n with one pointer added.
    $&n_descriptorType descriptor structure for type n with one pointer added.
    $n_basetypeBase typename with all pointers and qualifiers stripped.

    Within the table, $n refers to a specific type within the typemap specification. For example, if you write this

    %typemap(in) int *INPUT {
    
    }
    

    then $1 refers to int *INPUT. If you have a typemap like this,

    %typemap(in) (int argc, char *argv[]) {
      ...
    }
    

    then $1 refers to int argc and $2 refers to char *argv[].

    Substitutions related to types and names always fill in values from the actual code that was matched. This is useful when a typemap might match multiple C datatype. For example:

    %typemap(in)  int, short, long {
      $1 = ($1_ltype) PyInt_AsLong($input);
    }
    

    In this case, $1_ltype is replaced with the datatype that is actually matched.

    When typemap code is emitted, the C/C++ datatype of the special variables $1 and $2 is always an "ltype." An "ltype" is simply a type that can legally appear on the left-hand side of a C assignment operation. Here are a few examples of types and ltypes:

    type              ltype
    ------            ----------------
    int               int
    const int         int
    const int *       int *
    int [4]           int *
    int [4][5]        int (*)[5]
    

    In most cases a ltype is simply the C datatype with qualifiers stripped off. In addition, arrays are converted into pointers.

    Variables such as $&1_type and $*1_type are used to safely modify the type by removing or adding pointers. Although not needed in most typemaps, these substitutions are sometimes needed to properly work with typemaps that convert values between pointers and values.

    If necessary, type related substitutions can also be used when declaring locals. For example:

    %typemap(in) int * ($*1_type temp) {
      temp = PyInt_AsLong($input);
      $1 = &temp;
    }
    

    There is one word of caution about declaring local variables in this manner. If you declare a local variable using a type substitution such as $1_ltype temp, it won't work like you expect for arrays and certain kinds of pointers. For example, if you wrote this,

    %typemap(in) int [10][20] {
      $1_ltype temp;
    }
    

    then the declaration of temp will be expanded as

    int (*)[20] temp;
    

    This is illegal C syntax and won't compile. There is currently no straightforward way to work around this problem in SWIG due to the way that typemap code is expanded and processed. However, one possible workaround is to simply pick an alternative type such as void * and use casts to get the correct type when needed. For example:

    %typemap(in) int [10][20] {
      void *temp;
      ...
      (($1_ltype) temp)[i][j] = x;    /* set a value */
      ...
    }
    

    Another approach, which only works for arrays is to use the $1_basetype substitution. For example:

    %typemap(in) int [10][20] {
      $1_basetype temp[10][20];
      ...
      temp[i][j] = x;    /* set a value */
      ...
    }
    

    11.4.4 Special variable macros

    Special variable macros are like macro functions in that they take one or more input arguments which are used for the macro expansion. They look like macro/function calls but use the special variable $ prefix to the macro name. Note that unlike normal macros, the expansion is not done by the preprocessor, it is done during the SWIG parsing/compilation stages. The following special variable macros are available across all language modules.

    11.4.4.1 $descriptor(type)

    This macro expands into the type descriptor structure for any C/C++ type specified in type. It behaves like the $1_descriptor special variable described above except that the type to expand is taken from the macro argument rather than inferred from the typemap type. For example, $descriptor(std::vector<int> *) will expand into SWIGTYPE_p_std__vectorT_int_t. This macro is mostly used in the scripting target languages and is demonstrated later in the Run-time type checker usage section.

    11.4.4.2 $typemap(method, typepattern)

    This macro uses the pattern matching rules described earlier to lookup and then substitute the special variable macro with the code in the matched typemap. The typemap to search for is specified by the arguments, where method is the typemap method name and typepattern is a type pattern as per the %typemap specification in the Defining a typemap section.

    The special variables within the matched typemap are expanded into those for the matched typemap type, not the typemap within which the macro is called. In practice, there is little use for this macro in the scripting target languages. It is mostly used in the target languages that are statically typed as a way to obtain the target language type given the C/C++ type and more commonly only when the C++ type is a template parameter.

    The example below is for C# only and uses some typemap method names documented in the C# chapter, but it shows some of the possible syntax variations.

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo($typemap(cstype, unsigned long aa) var1,
               $typemap(cstype, unsigned long bb) var2,
               $typemap(cstype, (unsigned long bb)) var3,
               $typemap(cstype, unsigned long) var4)
      {
        // do something
      }
    %}
    

    The result is the following expansion

    %typemap(cstype) unsigned long    "uint"
    %typemap(cstype) unsigned long bb "bool"
    %typemap(cscode) BarClass %{
      void foo(uint var1,
               bool var2,
               bool var3,
               uint var4)
      {
        // do something
      }
    %}
    

    11.4.5 Special variables and typemap attributes

    As of SWIG-3.0.7 typemap attributes will also expand special variables and special variable macros.

    Example usage showing the expansion in the 'out' attribute (C# specific) as well as the main typemap body:

    %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype"
    

    is equivalent to the following as $*1_ltype expands to unsigned int:

    %typemap(ctype, out="unsigned int") unsigned int& "unsigned int"
    

    11.4.6 Special variables combined with special variable macros

    Special variables can also be used within special variable macros. The special variables are expanded before they are used in the special variable macros.

    Consider the following C# typemaps:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)"
    

    Special variables are expanded first and hence the above is equivalent to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)"
    

    which then expands to:

    %typemap(cstype) unsigned int "uint"
    %typemap(cstype, out="uint") unsigned int& "uint"
    

    11.5 Common typemap methods

    The set of typemaps recognized by a language module may vary. However, the following typemap methods are nearly universal:

    11.5.1 "in" typemap

    The "in" typemap is used to convert function arguments from the target language to C. For example:

    %typemap(in) int {
      $1 = PyInt_AsLong($input);
    }
    

    The following special variables are available:

    $input            - Input object holding value to be converted.
    $symname          - Name of function/method being wrapped
    

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. The numinputs attributes facilitates this. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    

    At this time, only zero or one arguments may be converted. When numinputs is set to 0, the argument is effectively ignored and cannot be supplied from the target language. The argument is still required when making the C/C++ call and the above typemap shows the value used is instead obtained from a locally declared variable called temp. Usually numinputs is not specified, whereupon the default value is 1, that is, there is a one to one mapping of the number of arguments when used from the target language to the C/C++ call. Multi-argument typemaps provide a similar concept where the number of arguments mapped from the target language to C/C++ can be changed for multiple adjacent C/C++ arguments.

    Compatibility note: Specifying numinputs=0 is the same as the old "ignore" typemap.

    11.5.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type. Set to 1 if the input argument is the correct type otherwise set to 0.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in the Typemaps and overloading section.

    11.5.3 "out" typemap

    The "out" typemap is used to convert function/method return values from C into the target language. For example:

    %typemap(out) int {
      $result = PyInt_FromLong($1);
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $symname          - Name of function/method being wrapped
    

    The "out" typemap supports an optional attribute flag called "optimal". This is for code optimisation and is detailed in the Optimal code generation when returning by value section.

    11.5.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }
    

    11.5.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);
    

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    11.5.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }
    

    11.5.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout) int *out {
      // Append output value $1 to $result
      ...
    }
    

    The following special variables are available.

    $result           - Result object returned to target language.
    $input            - The original input object passed.
    $symname          - Name of function/method being wrapped
    

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    See the typemaps.i library file for examples.

    11.5.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input);
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }
    

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    11.5.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();
    

    See Object ownership and %newobject for further details.

    11.5.10 "ret" typemap

    The "ret" typemap is not used very often, but can be useful for anything associated with the return type, such as resource management, return value error checking, etc. Usually this can all be done in the "out" typemap, but sometimes it is handy to use the "out" typemap code untouched and add to the generated code using the code in the "ret" typemap. One such case is memory clean up. For example, a stringheap_t type is defined indicating that the returned memory must be deleted and a string_t type is defined indicating that the returned memory must not be deleted.

    %typemap(ret) stringheap_t %{
      free($1);
    %}
    
    typedef char * string_t;
    typedef char * stringheap_t;
    
    string_t MakeString1();
    stringheap_t MakeString2();
    

    The "ret" typemap above will only be used for MakeString2, but both functions will use the default "out" typemap for char * provided by SWIG. The code above would ensure the appropriate memory is freed in all target languages as the need to provide custom "out" typemaps (which involve target language specific code) is not necessary.

    This approach is an alternative to using the "newfree" typemap and %newobject as there is no need to list all the functions that require the memory cleanup, it is purely done on types.

    11.5.11 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }
    

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    11.5.12 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    11.5.13 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    11.5.14 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      PyErr_SetString(PyExc_RuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);
    

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      PyErr_SetString(PyExc_RuntimeError, _e);
      SWIG_fail;
    }
    ...
    

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    11.6 Some typemap examples

    This section contains a few examples. Consult language module documentation for more examples.

    11.6.1 Typemaps for arrays

    A common use of typemaps is to provide support for C arrays appearing both as arguments to functions and as structure members.

    For example, suppose you had a function like this:

    void set_vector(int type, float value[4]);
    

    If you wanted to handle float value[4] as a list of floats, you might write a typemap similar to this:

    
    %typemap(in) float value[4] (float temp[4]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != 4) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected 4 elements");
        SWIG_fail;
      }
      for (i = 0; i < 4; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the variable temp allocates a small array on the C stack. The typemap then populates this array and passes it to the underlying C function.

    When used from Python, the typemap allows the following type of function call:

    >>> set_vector(type, [ 1, 2.5, 5, 20 ])
    

    If you wanted to generalize the typemap to apply to arrays of all dimensions you might write this:

    %typemap(in) float value[ANY] (float temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          temp[i] = (float) PyFloat_AsDouble(o);
        } else {
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");      
          SWIG_fail;
        }
      }
      $1 = temp;
    }
    

    In this example, the special variable $1_dim0 is expanded with the actual array dimensions. Multidimensional arrays can be matched in a similar manner. For example:

    %typemap(in) float matrix[ANY][ANY] (float temp[$1_dim0][$1_dim1]) {
      ... convert a 2d array ...
    }
    

    For large arrays, it may be impractical to allocate storage on the stack using a temporary variable as shown. To work with heap allocated data, the following technique can be used.

    %typemap(in) float value[ANY] {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expected a sequence");
        SWIG_fail;
      }
      if (PySequence_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Size mismatch. Expected $1_dim0 elements");
        SWIG_fail;
      }
      $1 = (float *) malloc($1_dim0*sizeof(float));
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (PyNumber_Check(o)) {
          $1[i] = (float) PyFloat_AsDouble(o);
        } else {
          free($1);
          PyErr_SetString(PyExc_ValueError, "Sequence elements must be numbers");
          SWIG_fail;
        }
      }
    }
    %typemap(freearg) float value[ANY] {
      if ($1) free($1);
    }
    

    In this case, an array is allocated using malloc. The freearg typemap is then used to release the argument after the function has been called.

    Another common use of array typemaps is to provide support for array structure members. Due to subtle differences between pointers and arrays in C, you can't just "assign" to a array structure member. Instead, you have to explicitly copy elements into the array. For example, suppose you had a structure like this:

    struct SomeObject {
      float  value[4];
      ...
    };
    

    When SWIG runs, it won't produce any code to set the vec member. You may even get a warning message like this:

    $ swig -python  example.i
    example.i:10: Warning 462: Unable to set variable of type float [4].
    

    These warning messages indicate that SWIG does not know how you want to set the vec field.

    To fix this, you can supply a special "memberin" typemap like this:

    %typemap(memberin) float [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
          $1[i] = $input[i];
      }
    }
    

    The memberin typemap is used to set a structure member from data that has already been converted from the target language to C. In this case, $input is the local variable in which converted input data is stored. This typemap then copies this data into the structure.

    When combined with the earlier typemaps for arrays, the combination of the "in" and "memberin" typemap allows the following usage:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    

    Related to structure member input, it may be desirable to return structure members as a new kind of object. For example, in this example, you will get very odd program behavior where the structure member can be set nicely, but reading the member simply returns a pointer:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    _1008fea8_p_float
    >>> 
    

    To fix this, you can write an "out" typemap. For example:

    %typemap(out) float [ANY] {
      int i;
      $result = PyList_New($1_dim0);
      for (i = 0; i < $1_dim0; i++) {
        PyObject *o = PyFloat_FromDouble((double) $1[i]);
        PyList_SetItem($result, i, o);
      }
    }
    

    Now, you will find that member access is quite nice:

    >>> s = SomeObject()
    >>> s.x = [1, 2.5, 5, 10]
    >>> print s.x
    [ 1, 2.5, 5, 10]
    

    Compatibility Note: SWIG1.1 used to provide a special "memberout" typemap. However, it was mostly useless and has since been eliminated. To return structure members, simply use the "out" typemap.

    11.6.2 Implementing constraints with typemaps

    One particularly interesting application of typemaps is the implementation of argument constraints. This can be done with the "check" typemap. When used, this allows you to provide code for checking the values of function arguments. For example:

    %module math
    
    %typemap(check) double posdouble {
      if ($1 < 0) {
        croak("Expecting a positive number");
      }
    }
    
    ...
    double sqrt(double posdouble);
    
    

    This provides a sanity check to your wrapper function. If a negative number is passed to this function, a Perl exception will be raised and your program terminated with an error message.

    This kind of checking can be particularly useful when working with pointers. For example:

    %typemap(check) Vector * {
      if ($1 == 0) {
        PyErr_SetString(PyExc_TypeError, "NULL Pointer not allowed");
        SWIG_fail;
      }
    }
    
    

    will prevent any function involving a Vector * from accepting a NULL pointer. As a result, SWIG can often prevent a potential segmentation faults or other run-time problems by raising an exception rather than blindly passing values to the underlying C/C++ program.

    11.7 Typemaps for multiple target languages

    The code within typemaps is usually language dependent, however, many target languages support the same typemaps. In order to distinguish typemaps across different languages, the preprocessor should be used. For example, the "in" typemap for Perl and Ruby could be written as:

    #if defined(SWIGPERL)
      %typemap(in) int "$1 = ($1_ltype) SvIV($input);"
    #elif defined(SWIGRUBY)
      %typemap(in) int "$1 = NUM2INT($input);"
    #else
      #warning no "in" typemap defined
    #endif
    

    The full set of language specific macros is defined in the Conditional Compilation section. The example above also shows a common approach of issuing a warning for an as yet unsupported language.

    Compatibility note: In SWIG-1.1 different languages could be distinguished with the language name being put within the %typemap directive, for example,
    %typemap(ruby, in) int "$1 = NUM2INT($input);".

    11.8 Optimal code generation when returning by value

    The "out" typemap is the main typemap for return types. This typemap supports an optional attribute flag called "optimal", which is for reducing temporary variables and the amount of generated code, thereby giving the compiler the opportunity to use return value optimization for generating faster executing code. It only really makes a difference when returning objects by value and has some limitations on usage, as explained later on.

    When a function returns an object by value, SWIG generates code that instantiates the default type on the stack then assigns the value returned by the function call to it. A copy of this object is then made on the heap and this is what is ultimately stored and used from the target language. This will be clearer considering an example. Consider running the following code through SWIG:

    %typemap(out) SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    
    %inline %{
    #include <iostream>
    using namespace std;
    
    struct XX {
      XX() { cout << "XX()" << endl; }
      XX(int i) { cout << "XX(" << i << ")" << endl; }
      XX(const XX &other) { cout << "XX(const XX &)" << endl; }
      XX & operator =(const XX &other) { cout << "operator=(const XX &)" << endl; return *this; }
      ~XX() { cout << "~XX()" << endl; }
      static XX create() { 
        return XX(0);
      }
    };
    %}
    

    The "out" typemap shown is the default typemap for C# when returning objects by value. When making a call to XX::create() from C#, the output is as follows:

    XX()
    XX(0)
    operator=(const XX &)
    ~XX()
    XX(const XX &)
    ~XX()
    ~XX()
    

    Note that three objects are being created as well as an assignment. Wouldn't it be great if the XX::create() method was the only time a constructor was called? As the method returns by value, this is asking a lot and the code that SWIG generates by default makes it impossible for the compiler to use return value optimisation (RVO) . However, this is where the "optimal" attribute in the "out" typemap can help out. If the typemap code is kept the same and just the "optimal" attribute specified like this:

    %typemap(out, optimal="1") SWIGTYPE %{
      $result = new $1_ltype((const $1_ltype &)$1);
    %}
    

    then when the code is run again, the output is simply:

    XX(0)
    ~XX()
    

    How the "optimal" attribute works is best explained using the generated code. Without "optimal", the generated code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      XX result;
      result = XX::create();
      jresult = new XX((const XX &)result);
      return jresult;
    }
    
    

    With the "optimal" attribute, the code is:

    SWIGEXPORT void * SWIGSTDCALL CSharp_XX_create() {
      void * jresult ;
      jresult = new XX((const XX &)XX::create());
      return jresult;
    }
    

    The major difference is the result temporary variable holding the value returned from XX::create() is no longer generated and instead the copy constructor call is made directly from the value returned by XX::create(). With modern compilers implementing RVO, the copy is not actually done, in fact the object is never created on the stack in XX::create() at all, it is simply created directly on the heap. In the first instance, the $1 special variable in the typemap is expanded into result. In the second instance, $1 is expanded into XX::create() and this is essentially what the "optimal" attribute is telling SWIG to do.

    The "optimal" attribute optimisation is not turned on by default as it has a number of restrictions. Firstly, some code cannot be condensed into a simple call for passing into the copy constructor. One common occurrence is when %exception is used. Consider adding the following %exception to the example:

    %exception XX::create() %{
    try {
      $action
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    %}
    

    SWIG can detect when the "optimal" attribute cannot be used and will ignore it and in this case will issue the following warning:

    example.i:28: Warning 474: Method XX::create() usage of the optimal attribute ignored
    example.i:14: Warning 474: in the out typemap as the following cannot be used to generate
    optimal code: 
    try {
      result = XX::create();
    } catch(const std::exception &e) {
      cout << e.what() << endl;
    }
    

    It should be clear that the above code cannot be used as the argument to the copy constructor call, that is, for the $1 substitution.

    Secondly, if the typemaps uses $1 more than once, then multiple calls to the wrapped function will be made. Obviously that is not very optimal. In fact SWIG attempts to detect this and will issue a warning something like:

    example.i:21: Warning 475: Multiple calls to XX::create() might be generated due to
    example.i:7: Warning 475: optimal attribute usage in the out typemap.
    

    However, it doesn't always get it right, for example when $1 is within some commented out code.

    11.9 Multi-argument typemaps

    So far, the typemaps presented have focused on the problem of dealing with single values. For example, converting a single input object to a single argument in a function call. However, certain conversion problems are difficult to handle in this manner. As an example, consider the example at the very beginning of this chapter:

    int foo(int argc, char *argv[]);
    

    Suppose that you wanted to wrap this function so that it accepted a single list of strings like this:

    >>> foo(["ale", "lager", "stout"])
    

    To do this, you not only need to map a list of strings to char *argv[], but the value of int argc is implicitly determined by the length of the list. Using only simple typemaps, this type of conversion is possible, but extremely painful. Multi-argument typemaps help in this situation.

    A multi-argument typemap is a conversion rule that specifies how to convert a single object in the target language to a set of consecutive function arguments in C/C++. For example, the following multi-argument maps perform the conversion described for the above example:

    %typemap(in) (int argc, char *argv[]) {
      int i;
      if (!PyList_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a list");
        SWIG_fail;
      }
      $1 = PyList_Size($input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      for (i = 0; i < $1; i++) {
        PyObject *s = PyList_GetItem($input, i);
        if (!PyString_Check(s)) {
          free($2);
          PyErr_SetString(PyExc_ValueError, "List items must be strings");
          SWIG_fail;
        }
        $2[i] = PyString_AsString(s);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char *argv[]) {
      if ($2) free($2);
    }
    
    /* Required for C++ method overloading */
    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char *argv[]) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    A multi-argument map is always specified by surrounding the arguments with parentheses as shown. For example:

    %typemap(in) (int argc, char *argv[]) { ... }
    

    Within the typemap code, the variables $1, $2, and so forth refer to each type in the map. All of the usual substitutions apply--just use the appropriate $1 or $2 prefix on the variable name (e.g., $2_type, $1_ltype, etc.)

    Multi-argument typemaps always have precedence over simple typemaps and SWIG always performs longest-match searching. Therefore, you will get the following behavior:

    %typemap(in) int argc                              { ... typemap 1 ... }
    %typemap(in) (int argc, char *argv[])              { ... typemap 2 ... }
    %typemap(in) (int argc, char *argv[], char *env[]) { ... typemap 3 ... }
    
    int foo(int argc, char *argv[]);                   // Uses typemap 2
    int bar(int argc, int x);                          // Uses typemap 1
    int spam(int argc, char *argv[], char *env[]);     // Uses typemap 3
    

    It should be stressed that multi-argument typemaps can appear anywhere in a function declaration and can appear more than once. For example, you could write this:

    %typemap(in) (int scount, char *swords[]) { ... }
    %typemap(in) (int wcount, char *words[]) { ... }
    
    void search_words(int scount, char *swords[], int wcount, char *words[], int maxcount);
    

    Other directives such as %apply and %clear also work with multi-argument maps. For example:

    %apply (int argc, char *argv[]) {
        (int scount, char *swords[]),
        (int wcount, char *words[])
    };
    ...
    %clear (int scount, char *swords[]), (int wcount, char *words[]);
    ...
    

    Don't forget to also provide a suitable typemap for overloaded functions, such as %typecheck shown for foo above. This is only required if the function is overloaded in C++.

    Although multi-argument typemaps may seem like an exotic, little used feature, there are several situations where they make sense. First, suppose you wanted to wrap functions similar to the low-level read() and write() system calls. For example:

    typedef unsigned int size_t;
    
    int read(int fd, void *rbuffer, size_t len);
    int write(int fd, void *wbuffer, size_t len);
    

    As is, the only way to use the functions would be to allocate memory and pass some kind of pointer as the second argument---a process that might require the use of a helper function. However, using multi-argument maps, the functions can be transformed into something more natural. For example, you might write typemaps like this:

    // typemap for an outgoing buffer
    %typemap(in) (void *wbuffer, size_t len) {
      if (!PyString_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting a string");
        SWIG_fail;
      }
      $1 = (void *) PyString_AsString($input);
      $2 = PyString_Size($input);
    }
    
    // typemap for an incoming buffer
    %typemap(in) (void *rbuffer, size_t len) {
      if (!PyInt_Check($input)) {
        PyErr_SetString(PyExc_ValueError, "Expecting an integer");
        SWIG_fail;
      }
      $2 = PyInt_AsLong($input);
      if ($2 < 0) {
        PyErr_SetString(PyExc_ValueError, "Positive integer expected");
        SWIG_fail;
      }
      $1 = (void *) malloc($2);
    }
    
    // Return the buffer.  Discarding any previous return result
    %typemap(argout) (void *rbuffer, size_t len) {
      Py_XDECREF($result);   /* Blow away any previous result */
      if (result < 0) {      /* Check for I/O error */
        free($1);
        PyErr_SetFromErrno(PyExc_IOError);
        return NULL;
      }
      $result = PyString_FromStringAndSize($1, result);
      free($1);
    }
    

    (note: In the above example, $result and result are two different variables. result is the real C datatype that was returned by the function. $result is the scripting language object being returned to the interpreter.).

    Now, in a script, you can write code that simply passes buffers as strings like this:

    >>> f = example.open("Makefile")
    >>> example.read(f, 40)
    'TOP        = ../..\nSWIG       = $(TOP)/.'
    >>> example.read(f, 40)
    './swig\nSRCS       = example.c\nTARGET    '
    >>> example.close(f)
    0
    >>> g = example.open("foo", example.O_WRONLY | example.O_CREAT, 0644)
    >>> example.write(g, "Hello world\n")
    12
    >>> example.write(g, "This is a test\n")
    15
    >>> example.close(g)
    0
    >>>
    

    A number of multi-argument typemap problems also arise in libraries that perform matrix-calculations--especially if they are mapped onto low-level Fortran or C code. For example, you might have a function like this:

    int is_symmetric(double *mat, int rows, int columns);
    

    In this case, you might want to pass some kind of higher-level object as an matrix. To do this, you could write a multi-argument typemap like this:

    %typemap(in) (double *mat, int rows, int columns) {
      MatrixObject *a;
      a = GetMatrixFromObject($input);     /* Get matrix somehow */
    
      /* Get matrix properties */
      $1 = GetPointer(a);
      $2 = GetRows(a);
      $3 = GetColumns(a);
    }
    

    This kind of technique can be used to hook into scripting-language matrix packages such as Numeric Python. However, it should also be stressed that some care is in order. For example, when crossing languages you may need to worry about issues such as row-major vs. column-major ordering (and perform conversions if needed). Note that multi-argument typemaps cannot deal with non-consecutive C/C++ arguments; a workaround such as a helper function re-ordering the arguments to make them consecutive will need to be written.

    11.10 Typemap warnings

    Warnings can be added to typemaps so that SWIG generates a warning message whenever the typemap is used. See the information in the issuing warnings section.

    11.11 Typemap fragments

    The primary purpose of fragments is to reduce code bloat that repeated use of typemap code can lead to. Fragments are snippets of code that can be thought of as code dependencies of a typemap. If a fragment is used by more than one typemap, then the snippet of code within the fragment is only generated once. Code bloat is typically reduced by moving typemap code into a support function and then placing the support function into a fragment.

    For example, if you have a very long typemap

    %typemap(in) MyClass * {
      MyClass *value = 0;
    
      ... many lines of marshalling code  ...
    
      $result = value;
    }
    

    the same marshalling code is often repeated in several typemaps, such as "in", "varin", "directorout", etc. SWIG copies the code for each argument that requires the typemap code, easily leading to code bloat in the generated code. To eliminate this, define a fragment that includes the common marshalling code:

    %fragment("AsMyClass", "header") {
      MyClass *AsMyClass(PyObject *obj) {
        MyClass *value = 0;
    
        ... many lines of marshalling code  ...
    
        return value;
      }
    }
    
    %typemap(in, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    
    %typemap(varin, fragment="AsMyClass") MyClass * {
      $result = AsMyClass($input);
    }
    

    When the "in" or "varin" typemaps for MyClass are required, the contents of the fragment called "AsMyClass" is added to the "header" section within the generated code, and then the typemap code is emitted. Hence, the method AsMyClass will be generated into the wrapper code before any typemap code that calls it.

    To define a fragment you need a fragment name, a section name for generating the fragment code into, and the code itself. See Code insertion blocks for a full list of section names. Usually the section name used is "header". Different delimiters can be used:

    %fragment("my_name", "header") %{ ... %}
    %fragment("my_name", "header") { ... }
    %fragment("my_name", "header") " ... "
    

    and these follow the usual preprocessing rules mentioned in the Preprocessing delimiters section. The following are some rules and guidelines for using fragments:

    1. A fragment is added to the wrapping code only once. When using the MyClass * typemaps above and wrapping the method:

      void foo(MyClass *a, MyClass *b);
      

      the generated code will look something like:

      MyClass *AsMyClass(PyObject *obj) {
        ...
      }
      
      void _wrap_foo(...) {
        ....
        arg1 = AsMyClass(obj1);
        arg2 = AsMyClass(obj2);
        ...
        foo(arg1, arg2);
      }
      

      even as there is duplicated typemap code to process both a and b, the AsMyClass method will be defined only once.

    2. A fragment should only be defined once. If there is more than one definition, the first definition is the one used. All other definitions are silently ignored. For example, if you have

      %fragment("AsMyClass", "header") { ...definition 1... }
      ....
      %fragment("AsMyClass", "header") { ...definition 2... }
      

      only the first definition is used. In this way you can override the default fragments in a SWIG library by defining your fragment before the library %include. Note that this behavior is the opposite to typemaps, where the last typemap defined/applied prevails. Fragments follow the first-in-first-out convention since they are intended to be global, while typemaps are intended to be locally specialized.

    3. Fragment names cannot contain commas.

    4. A fragment can use one or more additional fragments, for example:

      %fragment("<limits.h>", "header") {
        %#include <limits.h>
      }
      
      
      %fragment("AsMyClass", "header", fragment="<limits.h>") {
        MyClass *AsMyClass(PyObject *obj) {
          MyClass *value = 0;
      
          ... some marshalling code  ...
      
          if  (ival < CHAR_MIN /*defined in <limits.h>*/) {
            ...
          } else {
            ...
          }
          ...
          return value;
        }
      }
      

      in this case, when the "AsMyClass" fragment is emitted, it also triggers the inclusion of the "<limits.h>" fragment.

    5. A fragment can have dependencies on a number of other fragments, for example:

      %fragment("bigfragment", "header", fragment="frag1", fragment="frag2", fragment="frag3") "";
      

      When the "bigfragment" is used, the three dependent fragments "frag1", "frag2" and "frag3" are also pulled in. Note that as "bigframent" is empty (the empty string - ""), it does not add any code itself, but merely triggers the inclusion of the other fragments.

    6. A typemap can also use more than one fragment, but since the syntax is different, you need to specify the dependent fragments in a comma separated list. Consider:

      %typemap(in, fragment="frag1, frag2, frag3") {...}
      

      which is equivalent to:

      %typemap(in, fragment="bigfragment") {...}
      

      when used with the "bigfragment" defined above.

    7. Finally, you can force the inclusion of a fragment at any point in the generated code as follows:

      %fragment("bigfragment");
      

      which is very useful inside a template class, for example.

    Most readers will probably want to skip the next two sub-sections on advanced fragment usage unless a desire to really get to grips with some powerful but tricky macro and fragment usage that is used in parts of the SWIG typemap library.

    11.11.1 Fragment type specialization

    Fragments can be type specialized. The syntax is as follows:

    %fragment("name", "header") { ...a type independent fragment... }
    %fragment("name"{type}, "header") { ...a type dependent fragment...  }
    

    where type is a C/C++ type. Like typemaps, fragments can also be used inside templates, for example:

    template <class T>
    struct A {
      %fragment("incode"{A<T>}, "header") {
        ... 'incode' specialized fragment ...
      }
    
      %typemap(in, fragment="incode"{A<T>}) {
        ... here we use the 'type specialized' fragment "incode"{A<T>} ...
      }
    };
    

    11.11.2 Fragments and automatic typemap specialization

    Since fragments can be type specialized, they can be elegantly used to specialize typemaps. For example, if you have something like:

    %fragment("incode"{float}, "header") {
      float in_method_float(PyObject *obj) {
        ...
      }
    }
    
    %fragment("incode"{long}, "header") {
      float in_method_long(PyObject *obj) {
        ...
      }
    }
    
    // %my_typemaps macro definition
    %define %my_typemaps(Type) 
    %typemap(in, fragment="incode"{Type}) Type {
      value = in_method_##Type(obj);
    }
    %enddef
    
    %my_typemaps(float);
    %my_typemaps(long);
    

    then the proper "incode"{float} or "incode"{long} fragment will be used, and the in_method_float and in_method_long methods will be called whenever the float or long types are used as input parameters.

    This feature is used a lot in the typemaps shipped in the SWIG library for some scripting languages. The interested (or very brave) reader can take a look at the fragments.swg file shipped with SWIG to see this in action.

    11.12 The run-time type checker

    Most scripting languages need type information at run-time. This type information can include how to construct types, how to garbage collect types, and the inheritance relationships between types. If the language interface does not provide its own type information storage, the generated SWIG code needs to provide it.

    Requirements for the type system:

    • Store inheritance and type equivalence information and be able to correctly re-create the type pointer.
    • Share type information between modules.
    • Modules can be loaded in any order, regardless of actual type dependency.
    • Avoid the use of dynamically allocated memory, and library/system calls in general.
    • Provide a reasonably fast implementation, minimizing the lookup time for all language modules.
    • Custom, language specific information can be attached to types.
    • Modules can be unloaded from the type system.

    11.12.1 Implementation

    The run-time type checker is used by many, but not all, of SWIG's supported target languages. The run-time type checker features are not required and are thus not used for statically typed languages such as Java and C#. The scripting and scheme based languages rely on it and it forms a critical part of SWIG's operation for these languages.

    When pointers, arrays, and objects are wrapped by SWIG, they are normally converted into typed pointer objects. For example, an instance of Foo * might be a string encoded like this:

    _108e688_p_Foo
    

    At a basic level, the type checker simply restores some type-safety to extension modules. However, the type checker is also responsible for making sure that wrapped C++ classes are handled correctly---especially when inheritance is used. This is especially important when an extension module makes use of multiple inheritance. For example:

    class Foo {
    public:
      int x;
    };
    
    class Bar {
    public:
      int y;
    };
    
    class FooBar : public Foo, public Bar {
    public:
      int z;
    };
    

    When the class FooBar is organized in memory, it contains the contents of the classes Foo and Bar as well as its own data members. For example:

    FooBar --> | -----------|  <-- Foo
               |   int x    |
               |------------|  <-- Bar
               |   int y    |
               |------------|
               |   int z    |
               |------------|
    

    Because of the way that base class data is stacked together, the casting of a Foobar * to either of the base classes may change the actual value of the pointer. This means that it is generally not safe to represent pointers using a simple integer or a bare void * ---type tags are needed to implement correct handling of pointer values (and to make adjustments when needed).

    In the wrapper code generated for each language, pointers are handled through the use of special type descriptors and conversion functions. For example, if you look at the wrapper code for Python, you will see code similar to the following (simplified for brevity):

    if (!SWIG_IsOK(SWIG_ConvertPtr(obj0, (void **) &arg1, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method 'GrabVal', expecting type Foo");
    }
    

    In this code, SWIGTYPE_p_Foo is the type descriptor that describes Foo *. The type descriptor is actually a pointer to a structure that contains information about the type name to use in the target language, a list of equivalent typenames (via typedef or inheritance), and pointer value handling information (if applicable). The SWIG_ConvertPtr() function is simply a utility function that takes a pointer object in the target language and a type-descriptor object and uses this information to generate a C++ pointer. The SWIG_IsOK macro checks the return value for errors and SWIG_exception_fail can be called to raise an exception in the target language. However, the exact name and calling conventions of the conversion function depends on the target language (see language specific chapters for details).

    The actual type code is in swigrun.swg, and gets inserted near the top of the generated swig wrapper file. The phrase "a type X that can cast into a type Y" means that given a type X, it can be converted into a type Y. In other words, X is a derived class of Y or X is a typedef of Y. The structure to store type information looks like this:

    /* Structure to store information on one type */
    typedef struct swig_type_info {
      const char *name;             /* mangled name of this type */
      const char *str;              /* human readable name for this type */
      swig_dycast_func dcast;       /* dynamic cast function down a hierarchy */
      struct swig_cast_info *cast;  /* Linked list of types that can cast into this type */
      void *clientdata;             /* Language specific type data */
    } swig_type_info;
    
    /* Structure to store a type and conversion function used for casting */
    typedef struct swig_cast_info {
      swig_type_info *type;          /* pointer to type that is equivalent to this type */
      swig_converter_func converter; /* function to cast the void pointers */
      struct swig_cast_info *next;   /* pointer to next cast in linked list */
      struct swig_cast_info *prev;   /* pointer to the previous cast */
    } swig_cast_info;
    

    Each swig_type_info stores a linked list of types that it is equivalent to. Each entry in this doubly linked list stores a pointer back to another swig_type_info structure, along with a pointer to a conversion function. This conversion function is used to solve the above problem of the FooBar class, correctly returning a pointer to the type we want.

    The basic problem we need to solve is verifying and building arguments passed to functions. So going back to the SWIG_ConvertPtr() function example from above, we are expecting a Foo * and need to check if obj0 is in fact a Foo * . From before, SWIGTYPE_p_Foo is just a pointer to the swig_type_info structure describing Foo *. So we loop through the linked list of swig_cast_info structures attached to SWIGTYPE_p_Foo. If we see that the type of obj0 is in the linked list, we pass the object through the associated conversion function and then return a positive. If we reach the end of the linked list without a match, then obj0 can not be converted to a Foo * and an error is generated.

    Another issue needing to be addressed is sharing type information between multiple modules. More explicitly, we need to have ONE swig_type_info for each type. If two modules both use the type, the second module loaded must lookup and use the swig_type_info structure from the module already loaded. Because no dynamic memory is used and the circular dependencies of the casting information, loading the type information is somewhat tricky, and not explained here. A complete description is in the Lib/swiginit.swg file (and near the top of any generated file).

    Each module has one swig_module_info structure which looks like this:

    /* Structure used to store module information
     * Each module generates one structure like this, and the runtime collects
     * all of these structures and stores them in a circularly linked list.*/
    typedef struct swig_module_info {
      swig_type_info **types;         /* Array of pointers to swig_type_info structs in this module */
      int size;                       /* Number of types in this module */
      struct swig_module_info *next;  /* Pointer to next element in circularly linked list */
      swig_type_info **type_initial;  /* Array of initially generated type structures */
      swig_cast_info **cast_initial;  /* Array of initially generated casting structures */
      void *clientdata;               /* Language specific module data */
    } swig_module_info;
    

    Each module stores an array of pointers to swig_type_info structures and the number of types in this module. So when a second module is loaded, it finds the swig_module_info structure for the first module and searches the array of types. If any of its own types are in the first module and have already been loaded, it uses those swig_type_info structures rather than creating new ones. These swig_module_info structures are chained together in a circularly linked list.

    11.12.2 Usage

    This section covers how to use these functions from typemaps. To learn how to call these functions from external files (not the generated _wrap.c file), see the External access to the run-time system section.

    When pointers are converted in a typemap, the typemap code often looks similar to this:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    The most critical part is the typemap is the use of the $1_descriptor special variable. When placed in a typemap, this is expanded into the SWIGTYPE_* type descriptor object above. As a general rule, you should always use $1_descriptor instead of trying to hard-code the type descriptor name directly.

    There is another reason why you should always use the $1_descriptor variable. When this special variable is expanded, SWIG marks the corresponding type as "in use." When type-tables and type information is emitted in the wrapper file, descriptor information is only generated for those datatypes that were actually used in the interface. This greatly reduces the size of the type tables and improves efficiency.

    Occasionally, you might need to write a typemap that needs to convert pointers of other types. To handle this, the special variable macro $descriptor(type) covered earlier can be used to generate the SWIG type descriptor name for any C datatype. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        Bar *temp;
        if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &temp, $descriptor(Bar *), 0))) {
          SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo or Bar");
        }
        $1 = (Foo *)temp;
      }
    }
    

    The primary use of $descriptor(type) is when writing typemaps for container objects and other complex data structures. There are some restrictions on the argument---namely it must be a fully defined C datatype. It can not be any of the special typemap variables.

    In certain cases, SWIG may not generate type-descriptors like you expect. For example, if you are converting pointers in some non-standard way or working with an unusual combination of interface files and modules, you may find that SWIG omits information for a specific type descriptor. To fix this, you may need to use the %types directive. For example:

    %types(int *, short *, long *, float *, double *);
    

    When %types is used, SWIG generates type-descriptor information even if those datatypes never appear elsewhere in the interface file.

    Further details about the run-time type checking can be found in the documentation for individual language modules. Reading the source code may also help. The file Lib/swigrun.swg in the SWIG library contains all of the source of the generated code for type-checking. This code is also included in every generated wrapped file so you probably just look at the output of SWIG to get a better sense for how types are managed.

    11.13 Typemaps and overloading

    This section does not apply to the statically typed languages like Java and C#, where overloading of the types is handled much like C++ by generating overloaded methods in the target language. In many of the other target languages, SWIG still fully supports C++ overloaded methods and functions. For example, if you have a collection of functions like this:

    int foo(int x);
    int foo(double x);
    int foo(char *s, int y);
    

    You can access the functions in a normal way from the scripting interpreter:

    # Python
    foo(3)           # foo(int)
    foo(3.5)         # foo(double)
    foo("hello", 5)  # foo(char *, int)
    
    # Tcl
    foo 3            # foo(int)
    foo 3.5          # foo(double)
    foo hello 5      # foo(char *, int)
    

    To implement overloading, SWIG generates a separate wrapper function for each overloaded method. For example, the above functions would produce something roughly like this:

    // wrapper pseudocode
    _wrap_foo_0(argc, args[]) {       // foo(int)
      int arg1;
      int result;
      ...
      arg1 = FromInteger(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_1(argc, args[]) {       // foo(double)
      double arg1;
      int result;
      ...
      arg1 = FromDouble(args[0]);
      result = foo(arg1);
      return ToInteger(result);
    }
    
    _wrap_foo_2(argc, args[]) {       // foo(char *, int)
      char *arg1;
      int   arg2;
      int result;
      ...
      arg1 = FromString(args[0]);
      arg2 = FromInteger(args[1]);
      result = foo(arg1, arg2);
      return ToInteger(result);
    }
    
    

    Next, a dynamic dispatch function is generated:

    _wrap_foo(argc, args[]) {
      if (argc == 1) {
        if (IsInteger(args[0])) {
          return _wrap_foo_0(argc, args);
        }
        if (IsDouble(args[0])) {
          return _wrap_foo_1(argc, args);
        }
      }
      if (argc == 2) {
        if (IsString(args[0]) && IsInteger(args[1])) {
          return _wrap_foo_2(argc, args);
        }
      }
      error("No matching function!\n");
    }
    

    The purpose of the dynamic dispatch function is to select the appropriate C++ function based on argument types---a task that must be performed at runtime in most of SWIG's target languages.

    The generation of the dynamic dispatch function is a relatively tricky affair. Not only must input typemaps be taken into account (these typemaps can radically change the types of arguments accepted), but overloaded methods must also be sorted and checked in a very specific order to resolve potential ambiguity. A high-level overview of this ranking process is found in the "SWIG and C++ " chapter. What isn't mentioned in that chapter is the mechanism by which it is implemented---as a collection of typemaps.

    To support dynamic dispatch, SWIG first defines a general purpose type hierarchy as follows:

    Symbolic Name                   Precedence Value
    ------------------------------  ------------------
    SWIG_TYPECHECK_POINTER           0  
    SWIG_TYPECHECK_VOIDPTR           10 
    SWIG_TYPECHECK_BOOL              15 
    SWIG_TYPECHECK_UINT8             20 
    SWIG_TYPECHECK_INT8              25 
    SWIG_TYPECHECK_UINT16            30 
    SWIG_TYPECHECK_INT16             35 
    SWIG_TYPECHECK_UINT32            40 
    SWIG_TYPECHECK_INT32             45 
    SWIG_TYPECHECK_UINT64            50 
    SWIG_TYPECHECK_INT64             55 
    SWIG_TYPECHECK_UINT128           60 
    SWIG_TYPECHECK_INT128            65 
    SWIG_TYPECHECK_INTEGER           70 
    SWIG_TYPECHECK_FLOAT             80 
    SWIG_TYPECHECK_DOUBLE            90 
    SWIG_TYPECHECK_COMPLEX           100 
    SWIG_TYPECHECK_UNICHAR           110 
    SWIG_TYPECHECK_UNISTRING         120 
    SWIG_TYPECHECK_CHAR              130 
    SWIG_TYPECHECK_STRING            140 
    SWIG_TYPECHECK_BOOL_ARRAY        1015 
    SWIG_TYPECHECK_INT8_ARRAY        1025 
    SWIG_TYPECHECK_INT16_ARRAY       1035 
    SWIG_TYPECHECK_INT32_ARRAY       1045 
    SWIG_TYPECHECK_INT64_ARRAY       1055 
    SWIG_TYPECHECK_INT128_ARRAY      1065 
    SWIG_TYPECHECK_FLOAT_ARRAY       1080 
    SWIG_TYPECHECK_DOUBLE_ARRAY      1090 
    SWIG_TYPECHECK_CHAR_ARRAY        1130 
    SWIG_TYPECHECK_STRING_ARRAY      1140 
    

    (These precedence levels are defined in swig.swg, a library file that's included by all target language modules.)

    In this table, the precedence-level determines the order in which types are going to be checked. Low values are always checked before higher values. For example, integers are checked before floats, single values are checked before arrays, and so forth.

    Using the above table as a guide, each target language defines a collection of "typecheck" typemaps. The following excerpt from the Python module illustrates this:

    /* Python type checking rules */
    /* Note:  %typecheck(X) is a macro for %typemap(typecheck, precedence=X) */
    
    %typecheck(SWIG_TYPECHECK_INTEGER)
      int, short, long,
      unsigned int, unsigned short, unsigned long,
      signed char, unsigned char,
      long long, unsigned long long,
      const int &, const short &, const long &,
      const unsigned int &, const unsigned short &, const unsigned long &,
      const long long &, const unsigned long long &,
      enum SWIGTYPE,
      bool, const bool &
    {
      $1 = (PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_DOUBLE)
      float, double,
      const float &, const double &
    {
      $1 = (PyFloat_Check($input) || PyInt_Check($input) || PyLong_Check($input)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_CHAR) char {
      $1 = (PyString_Check($input) && (PyString_Size($input) == 1)) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_STRING) char * {
      $1 = PyString_Check($input) ? 1 : 0;
    }
    
    %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER, noblock=1) SWIGTYPE * {
      void *vptr = 0;
      int res = SWIG_ConvertPtr($input, &vptr, $1_descriptor, 0);
      $1 = SWIG_IsOK(res) ? 1 : 0;
    }
    
    %typecheck(SWIG_TYPECHECK_POINTER) PyObject * {
      $1 = ($input != 0);
    }
    

    It might take a bit of contemplation, but this code has merely organized all of the basic C++ types, provided some simple type-checking code, and assigned each type a precedence value.

    Finally, to generate the dynamic dispatch function, SWIG uses the following algorithm:

    • Overloaded methods are first sorted by the number of required arguments.
    • Methods with the same number of arguments are then sorted by precedence values of argument types.
    • Typecheck typemaps are then emitted to produce a dispatch function that checks arguments in the correct order.

    If you haven't written any typemaps of your own, it is unnecessary to worry about the typechecking rules. However, if you have written new input typemaps, you might have to supply a typechecking rule as well. An easy way to do this is to simply copy one of the existing typechecking rules. Here is an example,

    // Typemap for a C++ string
    %typemap(in) std::string {
      if (PyString_Check($input)) {
        $1 = std::string(PyString_AsString($input));
      } else {
        SWIG_exception(SWIG_TypeError, "string expected");
      }
    }
    // Copy the typecheck code for "char *".  
    %typemap(typecheck) std::string = char *;
    

    The bottom line: If you are writing new typemaps and you are using overloaded methods, you will probably have to write new typecheck code or copy and modify existing typecheck code.

    If you write a typecheck typemap and omit the precedence level, for example commenting it out as shown below:

    %typemap(typecheck /*, precedence=SWIG_TYPECHECK_INTEGER*/) int {
      $1 = PyInt_Check($input) ? 1 : 0;
    }
    

    then the type is given a precedence higher than any other known precedence level and a warning is issued:

    example.i:18: Warning 467: Overloaded method foo(int) not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'int').
    

    Notes:

    • Typecheck typemaps are not used for non-overloaded methods. Because of this, it is still always necessary to check types in any "in" typemaps.
    • The dynamic dispatch process is only meant to be a heuristic. There are many corner cases where SWIG simply can't disambiguate types to the same degree as C++. The only way to resolve this ambiguity is to use the %rename directive to rename one of the overloaded methods (effectively eliminating overloading).
    • Typechecking may be partial. For example, if working with arrays, the typecheck code might simply check the type of the first array element and use that to dispatch to the correct function. Subsequent "in" typemaps would then perform more extensive type-checking.
    • Make sure you read the section on overloading in the " SWIG and C++" chapter.

    11.14 More about %apply and %clear

    In order to implement certain kinds of program behavior, it is sometimes necessary to write sets of typemaps. For example, to support output arguments, one often writes a set of typemaps like this:

    %typemap(in, numinputs=0) int *OUTPUT (int temp) {
      $1 = &temp;
    }
    %typemap(argout) int *OUTPUT {
      // return value somehow
    }
    

    To make it easier to apply the typemap to different argument types and names, the %apply directive performs a copy of all typemaps from one type to another. For example, if you specify this,

    %apply int *OUTPUT { int *retvalue, int32 *output };
    

    then all of the int *OUTPUT typemaps are copied to int *retvalue and int32 *output.

    However, there is a subtle aspect of %apply that needs more description. Namely, %apply does not overwrite a typemap rule if it is already defined for the target datatype. This behavior allows you to do two things:

    • You can specialize parts of a complex typemap rule by first defining a few typemaps and then using %apply to incorporate the remaining pieces.
    • Sets of different typemaps can be applied to the same datatype using repeated %apply directives.

    For example:

    %typemap(in) int *INPUT (int temp) {
      temp = ... get value from $input ...;
      $1 = &temp;
    }
    
    %typemap(check) int *POSITIVE {
      if (*$1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected a positive number!\n");
        return NULL;
      }
    }
    
    ...
    %apply int *INPUT     { int *invalue };
    %apply int *POSITIVE  { int *invalue };
    

    Since %apply does not overwrite or replace any existing rules, the only way to reset behavior is to use the %clear directive. %clear removes all typemap rules defined for a specific datatype. For example:

    %clear int *invalue;
    

    11.15 Passing data between typemaps

    It is also important to note that the primary use of local variables is to create stack-allocated objects for temporary use inside a wrapper function (this is faster and less-prone to error than allocating data on the heap). In general, the variables are not intended to pass information between different types of typemaps. However, this can be done if you realize that local names have the argument number appended to them. For example, you could do this:

    %typemap(in) int *(int temp) {
      temp = (int) PyInt_AsLong($input);
      $1 = &temp;
    }
    
    %typemap(argout) int * {
      PyObject *o = PyInt_FromLong(temp$argnum);
      ...
    }
    

    In this case, the $argnum variable is expanded into the argument number. Therefore, the code will reference the appropriate local such as temp1 and temp2. It should be noted that there are plenty of opportunities to break the universe here and that accessing locals in this manner should probably be avoided. At the very least, you should make sure that the typemaps sharing information have exactly the same types and names.

    11.16 C++ "this" pointer

    All the rules discussed for typemaps apply to C++ as well as C. However in addition C++ passes an extra parameter into every non-static class method -- the this pointer. Occasionally it can be useful to apply a typemap to this pointer (for example to check and make sure this is non-null before deferencing). Actually, C also has an the equivalent of the this pointer which is used when accessing variables in a C struct.

    In order to customise the this pointer handling, target a variable named self in your typemaps. self is the name SWIG uses to refer to the extra parameter in wrapped functions.

    For example, if wrapping for Java generation:

    %typemap(check) SWIGTYPE *self %{
    if (!$1) {
      SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
        "invalid native object; delete() likely already called");
      return $null;
    }
    %}
    

    In the above case, the $1 variable is expanded into the argument name that SWIG is using as the this pointer. SWIG will then insert the check code before the actual C++ class method is called, and will raise an exception rather than crash the Java virtual machine. The generated code will look something like:

      if (!arg1) {
        SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException,
          "invalid native object; delete() likely already called");
        return ;
      }
      (arg1)->wrappedFunction(...);
    

    Note that if you have a parameter named self then it will also match the typemap. One work around is to create an interface file that wraps the method, but gives the argument a name other than self.

    11.17 Where to go for more information?

    The best place to find out more information about writing typemaps is to look in the SWIG library. Most language modules define all of their default behavior using typemaps. These are found in files such as python.swg, perl5.swg, tcl8.swg and so forth. The typemaps.i file in the library also contains numerous examples. You should look at these files to get a feel for how to define typemaps of your own. Some of the language modules support additional typemaps and further information is available in the individual chapters for each target language. There you may also find more hands-on practical examples.


    12 Customization Features

    In many cases, it is desirable to change the default wrapping of particular declarations in an interface. For example, you might want to provide hooks for catching C++ exceptions, add assertions, or provide hints to the underlying code generator. This chapter describes some of these customization techniques. First, a discussion of exception handling is presented. Then, a more general-purpose customization mechanism known as "features" is described.

    12.1 Exception handling with %exception

    The %exception directive allows you to define a general purpose exception handler. For example, you can specify the following:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        ... handle error ...
      }
    }
    

    How the exception is handled depends on the target language, for example, Python:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        PyErr_SetString(PyExc_IndexError, "index out-of-bounds");
        SWIG_fail;
      }
    }
    

    When defined, the code enclosed in braces is inserted directly into the low-level wrapper functions. The special variable $action is one of a few %exception special variables supported and gets replaced with the actual operation to be performed (a function call, method invocation, attribute access, etc.). An exception handler remains in effect until it is explicitly deleted. This is done by using either %exception or %noexception with no code. For example:

    %exception;   // Deletes any previously defined handler
    

    Compatibility note: Previous versions of SWIG used a special directive %except for exception handling. That directive is deprecated--%exception provides the same functionality, but is substantially more flexible.

    12.1.1 Handling exceptions in C code

    C has no formal exception handling mechanism so there are several approaches that might be used. A somewhat common technique is to simply set a special error code. For example:

    /* File : except.c */
    
    static char error_message[256];
    static int error_status = 0;
    
    void throw_exception(char *msg) {
      strncpy(error_message, msg, 256);
      error_status = 1;
    }
    
    void clear_exception() {
      error_status = 0;
    }
    char *check_exception() {
      if (error_status)
        return error_message;
      else
        return NULL;
    }
    
    

    To use these functions, functions simply call throw_exception() to indicate an error occurred. For example :

    double inv(double x) {
      if (x != 0)
        return 1.0/x;
      else {
        throw_exception("Division by zero");
        return 0;
      }
    }
    

    To catch the exception, you can write a simple exception handler such as the following (shown for Perl5) :

    %exception {
      char *err;
      clear_exception();
      $action
      if ((err = check_exception())) {
        croak(err);
      }
    }
    

    In this case, when an error occurs, it is translated into a Perl error. Each target language has its own approach to creating a runtime error/exception in and for Perl it is the croak method shown above.

    12.1.2 Exception handling with longjmp()

    Exception handling can also be added to C code using the <setjmp.h> library. Here is a minimalistic implementation that relies on the C preprocessor :

    /* File : except.c
       Just the declaration of a few global variables we're going to use */
    
    #include <setjmp.h>
    jmp_buf exception_buffer;
    int exception_status;
    
    /* File : except.h */
    #include <setjmp.h>
    extern jmp_buf exception_buffer;
    extern int exception_status;
    
    #define try if ((exception_status = setjmp(exception_buffer)) == 0)
    #define catch(val) else if (exception_status == val)
    #define throw(val) longjmp(exception_buffer, val)
    #define finally else
    
    /* Exception codes */
    
    #define RangeError     1
    #define DivisionByZero 2
    #define OutOfMemory    3
    
    

    Now, within a C program, you can do the following :

    double inv(double x) {
      if (x)
        return 1.0/x;
      else
        throw(DivisionByZero);
    }
    
    

    Finally, to create a SWIG exception handler, write the following :

    %{
    #include "except.h"
    %}
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } finally {
        croak("Unknown exception");
      }
    }
    

    Note: This implementation is only intended to illustrate the general idea. To make it work better, you'll need to modify it to handle nested try declarations.

    12.1.3 Handling C++ exceptions

    Handling C++ exceptions is also straightforward. For example:

    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } catch(...) {
        croak("Unknown exception");
      }
    }
    
    

    The exception types need to be declared as classes elsewhere, possibly in a header file :

    class RangeError {};
    class DivisionByZero {};
    class OutOfMemory {};
    

    12.1.4 Exception handlers for variables

    By default all variables will ignore %exception, so it is effectively turned off for all variables wrappers. This applies to global variables, member variables and static member variables. The approach is certainly a logical one when wrapping variables in C. However, in C++, it is quite possible for an exception to be thrown while the variable is being assigned. To ensure %exception is used when wrapping variables, it needs to be 'turned on' using the %allowexception feature. Note that %allowexception is just a macro for %feature("allowexcept"), that is, it is a feature called "allowexcept". Any variable which has this feature attached to it, will then use the %exception feature, but of course, only if there is a %exception attached to the variable in the first place. The %allowexception feature works like any other feature and so can be used globally or for selective variables.

    %allowexception;                // turn on globally
    %allowexception Klass::MyVar;   // turn on for a specific variable
    
    %noallowexception Klass::MyVar; // turn off for a specific variable
    %noallowexception;              // turn off globally
    

    12.1.5 Defining different exception handlers

    By default, the %exception directive creates an exception handler that is used for all wrapper functions that follow it. Unless there is a well-defined (and simple) error handling mechanism in place, defining one universal exception handler may be unwieldy and result in excessive code bloat since the handler is inlined into each wrapper function.

    To fix this, you can be more selective about how you use the %exception directive. One approach is to only place it around critical pieces of code. For example:

    %exception {
      ... your exception handler ...
    }
    /* Define critical operations that can throw exceptions here */
    
    %exception;
    
    /* Define non-critical operations that don't throw exceptions */
    

    More precise control over exception handling can be obtained by attaching an exception handler to specific declaration name. For example:

    %exception allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    In this case, the exception handler is only attached to declarations named "allocate". This would include both global and member functions. The names supplied to %exception follow the same rules as for %rename described in the section on Ambiguity resolution and renaming. For example, if you wanted to define an exception handler for a specific class, you might write this:

    %exception Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    When a class prefix is supplied, the exception handler is applied to the corresponding declaration in the specified class as well as for identically named functions appearing in derived classes.

    %exception can even be used to pinpoint a precise declaration when overloading is used. For example:

    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    Attaching exceptions to specific declarations is a good way to reduce code bloat. It can also be a useful way to attach exceptions to specific parts of a header file. For example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    // Define a few exception handlers for specific declarations
    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %exception Object::getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Index out of range");
      }
    }
    ...
    // Read a raw header file
    %include "someheader.h"
    

    Compatibility note: The %exception directive replaces the functionality provided by the deprecated "except" typemap. The typemap would allow exceptions to be thrown in the target language based on the return type of a function and was intended to be a mechanism for pinpointing specific declarations. However, it never really worked that well and the new %exception directive is much better.

    12.1.6 Special variables for %exception

    The %exception directive supports a few special variables which are placeholders for code substitution. The following table shows the available special variables and details what the special variables are replaced with.

    $actionThe actual operation to be performed (a function call, method invocation, variable access, etc.)
    $nameThe C/C++ symbol name for the function.
    $symnameThe symbol name used internally by SWIG
    $overnameThe extra mangling used in the symbol name for overloaded method. Expands to nothing if the wrapped method is not overloaded.
    $wrapnameThe language specific wrapper name (usually a C function name exported from the shared object/dll)
    $declThe fully qualified C/C++ declaration of the method being wrapped without the return type
    $fulldeclThe fully qualified C/C++ declaration of the method being wrapped including the return type
    $parentclassnameThe parent class name (if any) for a method.
    $parentclasssymnameThe target language parent class name (if any) for a method.

    The special variables are often used in situations where method calls are logged. Exactly which form of the method call needs logging is up to individual requirements, but the example code below shows all the possible expansions, plus how an exception message could be tailored to show the C++ method declaration:

    %exception Special::something {
      log("symname: $symname");
      log("overname: $overname");
      log("wrapname: $wrapname");
      log("decl: $decl");
      log("fulldecl: $fulldecl");
      try {
        $action
      } 
      catch (MemoryError) {
          croak("Out of memory in $decl");
      }
    }
    void log(const char *message);
    struct Special {
      void something(const char *c);
      void something(int i);
    };
    

    Below shows the expansions for the 1st of the overloaded something wrapper methods for Perl:

      log("symname: Special_something");
      log("overname: __SWIG_0");
      log("wrapname: _wrap_Special_something__SWIG_0");
      log("decl: Special::something(char const *)");
      log("fulldecl: void Special::something(char const *)");
      try {
        (arg1)->something((char const *)arg2);
      } 
      catch (MemoryError) {
        croak("Out of memory in Special::something(char const *)");
      }
    

    12.1.7 Using The SWIG exception library

    The exception.i library file provides support for creating language independent exceptions in your interfaces. To use it, simply put an "%include exception.i" in your interface file. This provides a function SWIG_exception() that can be used to raise common scripting language exceptions in a portable manner. For example :

    // Language independent exception handler
    %include exception.i       
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        SWIG_exception(SWIG_ValueError, "Range Error");
      } catch(DivisionByZero) {
        SWIG_exception(SWIG_DivisionByZero, "Division by zero");
      } catch(OutOfMemory) {
        SWIG_exception(SWIG_MemoryError, "Out of memory");
      } catch(...) {
        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
      }
    }
    
    

    As arguments, SWIG_exception() takes an error type code (an integer) and an error message string. The currently supported error types are :

    SWIG_UnknownError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    SWIG_AttributeError
    SWIG_MemoryError
    SWIG_NullReferenceError
    

    The SWIG_exception() function can also be used in typemaps.

    12.2 Object ownership and %newobject

    A common problem in some applications is managing proper ownership of objects. For example, consider a function like this:

    Foo *blah() {
      Foo *f = new Foo();
      return f;
    }
    

    If you wrap the function blah(), SWIG has no idea that the return value is a newly allocated object. As a result, the resulting extension module may produce a memory leak (SWIG is conservative and will never delete objects unless it knows for certain that the returned object was newly created).

    To fix this, you can provide an extra hint to the code generator using the %newobject directive. For example:

    %newobject blah;
    Foo *blah();
    

    %newobject works exactly like %rename and %exception. In other words, you can attach it to class members and parameterized declarations as before. For example:

    %newobject ::blah();                   // Only applies to global blah
    %newobject Object::blah(int, double);  // Only blah(int, double) in Object
    %newobject *::copy;                    // Copy method in all classes
    ...
    

    When %newobject is supplied, many language modules will arrange to take ownership of the return value. This allows the value to be automatically garbage-collected when it is no longer in use. However, this depends entirely on the target language (a language module may also choose to ignore the %newobject directive).

    Closely related to %newobject is a special typemap. The "newfree" typemap can be used to deallocate a newly allocated return value. It is only available on methods for which %newobject has been applied and is commonly used to clean-up string results. For example:

    %typemap(newfree) char * "free($1);";
    ...
    %newobject strdup;
    ...
    char *strdup(const char *s);
    

    In this case, the result of the function is a string in the target language. Since this string is a copy of the original result, the data returned by strdup() is no longer needed. The "newfree" typemap in the example simply releases this memory.

    As a complement to the %newobject, from SWIG 1.3.28, you can use the %delobject directive. For example, if you have two methods, one to create objects and one to destroy them, you can use:

    %newobject create_foo;
    %delobject destroy_foo;
    ...
    Foo *create_foo();
    void destroy_foo(Foo *foo);
    

    or in a member method as:

    %delobject Foo::destroy;
    
    class Foo {
    public:
      void destroy() { delete this;}
    
    private:
      ~Foo();
    };
    

    %delobject instructs SWIG that the first argument passed to the method will be destroyed, and therefore, the target language should not attempt to deallocate it twice. This is similar to use the DISOWN typemap in the first method argument, and in fact, it also depends on the target language on implementing the 'disown' mechanism properly.

    The use of %newobject is also integrated with reference counting and is covered in the C++ reference counted objects section.

    Compatibility note: Previous versions of SWIG had a special %new directive. However, unlike %newobject, it only applied to the next declaration. For example:

    %new char *strdup(const char *s);
    

    For now this is still supported but is deprecated.

    How to shoot yourself in the foot: The %newobject directive is not a declaration modifier like the old %new directive. Don't write code like this:

    %newobject
    char *strdup(const char *s);
    

    The results might not be what you expect.

    12.3 Features and the %feature directive

    Both %exception and %newobject are examples of a more general purpose customization mechanism known as "features." A feature is simply a user-definable property that is attached to specific declarations. Features are attached using the %feature directive. For example:

    %feature("except") Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %feature("new", "1") *::copy;
    

    In fact, the %exception and %newobject directives are really nothing more than macros involving %feature:

    #define %exception %feature("except")
    #define %newobject %feature("new", "1")
    

    The name matching rules outlined in the Ambiguity resolution and renaming section applies to all %feature directives. In fact the %rename directive is just a special form of %feature. The matching rules mean that features are very flexible and can be applied with pinpoint accuracy to specific declarations if needed. Additionally, if no declaration name is given, a global feature is said to be defined. This feature is then attached to every declaration that follows. This is how global exception handlers are defined. For example:

    /* Define a global exception handler */
    %feature("except") {
      try {
        $action
      }
      ...
    }
    
    ... bunch of declarations ...
    

    The %feature directive can be used with different syntax. The following are all equivalent:

    %feature("except") Object::method { $action };
    %feature("except") Object::method %{ $action %};
    %feature("except") Object::method " $action ";
    %feature("except", "$action") Object::method;
    

    The syntax in the first variation will generate the { } delimiters used whereas the other variations will not.

    12.3.1 Feature attributes

    The %feature directive also accepts XML style attributes in the same way that typemaps do. Any number of attributes can be specified. The following is the generic syntax for features:

    %feature("name", "value", attribute1="AttributeValue1") symbol;
    %feature("name", attribute1="AttributeValue1") symbol {value};
    %feature("name", attribute1="AttributeValue1") symbol %{value%};
    %feature("name", attribute1="AttributeValue1") symbol "value";
    

    More than one attribute can be specified using a comma separated list. The Java module is an example that uses attributes in %feature("except"). The throws attribute specifies the name of a Java class to add to a proxy method's throws clause. In the following example, MyExceptionClass is the name of the Java class for adding to the throws clause.

    %feature("except", throws="MyExceptionClass") Object::method { 
      try {
        $action
      } catch (...) {
        ... code to throw a MyExceptionClass Java exception ...
      }
    };
    

    Further details can be obtained from the Java exception handling section.

    12.3.2 Feature flags

    Feature flags are used to enable or disable a particular feature. Feature flags are a common but simple usage of %feature and the feature value should be either 1 to enable or 0 to disable the feature.

    %feature("featurename")          // enables feature
    %feature("featurename", "1")     // enables feature
    %feature("featurename", "x")     // enables feature
    %feature("featurename", "0")     // disables feature
    %feature("featurename", "")      // clears feature
    

    Actually any value other than zero will enable the feature. Note that if the value is omitted completely, the default value becomes 1, thereby enabling the feature. A feature is cleared by specifying no value, see Clearing features. The %immutable directive described in the Creating read-only variables section, is just a macro for %feature("immutable"), and can be used to demonstrates feature flags:

                                    // features are disabled by default
    int red;                        // mutable
    
    %feature("immutable");          // global enable
    int orange;                     // immutable
    
    %feature("immutable", "0");     // global disable
    int yellow;                     // mutable
    
    %feature("immutable", "1");     // another form of global enable
    int green;                      // immutable
    
    %feature("immutable", "");      // clears the global feature
    int blue;                       // mutable
    

    Note that features are disabled by default and must be explicitly enabled either globally or by specifying a targeted declaration. The above intersperses SWIG directives with C code. Of course you can target features explicitly, so the above could also be rewritten as:

    %feature("immutable", "1") orange;
    %feature("immutable", "1") green;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    The above approach allows for the C declarations to be separated from the SWIG directives for when the C declarations are parsed from a C header file. The logic above can of course be inverted and rewritten as:

    %feature("immutable", "1");
    %feature("immutable", "0") red;
    %feature("immutable", "0") yellow;
    %feature("immutable", "0") blue;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    As hinted above for %immutable, most feature flags can also be specified via alternative syntax. The alternative syntax is just a macro in the swig.swg Library file. The following shows the alternative syntax for the imaginary featurename feature:

    %featurename       // equivalent to %feature("featurename", "1") ie enables feature
    %nofeaturename     // equivalent to %feature("featurename", "0") ie disables feature
    %clearfeaturename  // equivalent to %feature("featurename", "")  ie clears feature
    

    The concept of clearing features is discussed next.

    12.3.3 Clearing features

    A feature stays in effect until it is explicitly cleared. A feature is cleared by supplying a %feature directive with no value. For example %feature("name", ""). A cleared feature means that any feature exactly matching any previously defined feature is no longer used in the name matching rules. So if a feature is cleared, it might mean that another name matching rule will apply. To clarify, let's consider the except feature again (%exception):

    // Define global exception handler
    %feature("except") {
      try {
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    // Define exception handler for all clone methods to log the method calls
    %feature("except") *::clone() {
      try {
        logger.info("$action");
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    ... initial set of class declarations with clone methods ...
    
    // clear the previously defined feature
    %feature("except", "") *::clone();
    
    ... final set of class declarations with clone methods ...
    

    In the above scenario, the initial set of clone methods will log all method invocations from the target language. This specific feature is cleared for the final set of clone methods. However, these clone methods will still have an exception handler (without logging) as the next best feature match for them is the global exception handler.

    Note that clearing a feature is not always the same as disabling it. Clearing the feature above with %feature("except", "") *::clone() is not the same as specifying %feature("except", "0") *::clone() . The former will disable the feature for clone methods - the feature is still a better match than the global feature. If on the other hand, no global exception handler had been defined at all, then clearing the feature would be the same as disabling it as no other feature would have matched.

    Note that the feature must match exactly for it to be cleared by any previously defined feature. For example the following attempt to clear the initial feature will not work:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") *::clone();
    

    but this will:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") clone();
    

    SWIG provides macros for disabling and clearing features. Many of these can be found in the swig.swg library file. The typical pattern is to define three macros; one to define the feature itself, one to disable the feature and one to clear the feature. The three macros below show this for the "except" feature:

    #define %exception      %feature("except")
    #define %noexception    %feature("except", "0")
    #define %clearexception %feature("except", "")
    

    12.3.4 Features and default arguments

    SWIG treats methods with default arguments as separate overloaded methods as detailed in the default arguments section. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example:

    %feature("except") hello(int i=0, double d=0.0) { ... }
    void hello(int i=0, double d=0.0);
    

    will apply the feature to all three wrapper methods, that is:

    void hello(int i, double d);
    void hello(int i);
    void hello();
    

    If the default arguments are not specified in the feature:

    %feature("except") hello(int i, double d) { ... }
    void hello(int i=0, double d=0.0);
    

    then the feature will only apply to this wrapper method:

    void hello(int i, double d);
    

    and not these wrapper methods:

    void hello(int i);
    void hello();
    

    If compactdefaultargs are being used, then the difference between specifying or not specifying default arguments in a feature is not applicable as just one wrapper is generated.

    Compatibility note: The different behaviour of features specified with or without default arguments was introduced in SWIG-1.3.23 when the approach to wrapping methods with default arguments was changed.

    12.3.5 Feature example

    As has been shown earlier, the intended use for the %feature directive is as a highly flexible customization mechanism that can be used to annotate declarations with additional information for use by specific target language modules. Another example is in the Python module. You might use %feature to rewrite proxy/shadow class code as follows:

    %module example
    %rename(bar_id) bar(int, double);
    
    // Rewrite bar() to allow some nice overloading
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        if len(args) == 3:
            return apply(examplec.Foo_bar_id, args)
        return apply(examplec.Foo_bar, args)
    %}
        
    class Foo {
    public:
      int bar(int x);
      int bar(int x, double y);
    }
    

    Further details of %feature usage is described in the documentation for specific language modules.


    13 Contracts

    A common problem that arises when wrapping C libraries is that of maintaining reliability and checking for errors. The fact of the matter is that many C programs are notorious for not providing error checks. Not only that, when you expose the internals of an application as a library, it often becomes possible to crash it simply by providing bad inputs or using it in a way that wasn't intended.

    This chapter describes SWIG's support for software contracts. In the context of SWIG, a contract can be viewed as a runtime constraint that is attached to a declaration. For example, you can easily attach argument checking rules, check the output values of a function and more. When one of the rules is violated by a script, a runtime exception is generated rather than having the program continue to execute.

    13.1 The %contract directive

    Contracts are added to a declaration using the %contract directive. Here is a simple example:

    %contract sqrt(double x) {
    require:
      x >= 0;
    ensure:
      sqrt >= 0;
    }
    
    ...
    double sqrt(double);
    

    In this case, a contract is being added to the sqrt() function. The %contract directive must always appear before the declaration in question. Within the contract there are two sections, both of which are optional. The require: section specifies conditions that must hold before the function is called. Typically, this is used to check argument values. The ensure: section specifies conditions that must hold after the function is called. This is often used to check return values or the state of the program. In both cases, the conditions that must hold must be specified as boolean expressions.

    In the above example, we're simply making sure that sqrt() returns a non-negative number (if it didn't, then it would be broken in some way).

    Once a contract has been specified, it modifies the behavior of the resulting module. For example:

    >>> example.sqrt(2)
    1.4142135623730951
    >>> example.sqrt(-2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    RuntimeError: Contract violation: require: (arg1>=0)
    >>>
    

    13.2 %contract and classes

    The %contract directive can also be applied to class methods and constructors. For example:

    %contract Foo::bar(int x, int y) {
    require:
      x > 0;
    ensure:
      bar > 0;
    }
    
    %contract Foo::Foo(int a) {
    require:
      a > 0;
    }
    
    class Foo {
    public:
      Foo(int);
      int bar(int, int);
    };
    

    The way in which %contract is applied is exactly the same as the %feature directive. Thus, any contract that you specified for a base class will also be attached to inherited methods. For example:

    class Spam : public Foo {
    public:
      int bar(int, int);    // Gets contract defined for Foo::bar(int, int)
    };
    

    In addition to this, separate contracts can be applied to both the base class and a derived class. For example:

    %contract Foo::bar(int x, int) {
    require:
      x > 0;
    }
    
    %contract Spam::bar(int, int y) {
    require:
      y > 0;
    }
    
    class Foo {
    public:
      int bar(int, int);   // Gets Foo::bar contract.
    };
    
    class Spam : public Foo {
    public:
      int bar(int, int);   // Gets Foo::bar and Spam::bar contract
    };
    

    When more than one contract is applied, the conditions specified in a "require:" section are combined together using a logical-AND operation. In other words conditions specified for the base class and conditions specified for the derived class all must hold. In the above example, this means that both the arguments to Spam::bar must be positive.

    13.3 Constant aggregation and %aggregate_check

    Consider an interface file that contains the following code:

    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    One thing you might want to do is impose a constraint on the direction parameter to make sure it's one of a few accepted values. To do that, SWIG provides an easy to use macro %aggregate_check() that works like this:

    %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
    

    This merely defines a utility function of the form

    int check_direction(int x);
    

    That checks the argument x to see if it is one of the values listed. This utility function can be used in contracts. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %contract move(SomeObject *, int direction, in) {
    require:
      check_direction(direction);
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Alternatively, it can be used in typemaps and other directives. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %typemap(check) int direction {
      if (!check_direction($1)) SWIG_exception(SWIG_ValueError, "Bad direction");
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Regrettably, there is no automatic way to perform similar checks with enums values. Maybe in a future release.

    13.4 Notes

    Contract support was implemented by Songyan (Tiger) Feng and first appeared in SWIG-1.3.20.


    14 Variable Length Arguments

    (a.k.a, "The horror. The horror.")

    This chapter describes the problem of wrapping functions that take a variable number of arguments. For instance, generating wrappers for the C printf() family of functions.

    This topic is sufficiently advanced to merit its own chapter. In fact, support for varargs is an often requested feature that was first added in SWIG-1.3.12. Most other wrapper generation tools have wisely chosen to avoid this issue.

    14.1 Introduction

    Some C and C++ programs may include functions that accept a variable number of arguments. For example, most programmers are familiar with functions from the C library such as the following:

    int printf(const char *fmt, ...)
    int fprintf(FILE *, const char *fmt, ...);
    int sprintf(char *s, const char *fmt, ...);
    

    Although there is probably little practical purpose in wrapping these specific C library functions in a scripting language (what would be the point?), a library may include its own set of special functions based on a similar API. For example:

    int  traceprintf(const char *fmt, ...);
    

    In this case, you may want to have some kind of access from the target language.

    Before describing the SWIG implementation, it is important to discuss the common uses of varargs that you are likely to encounter in real programs. Obviously, there are the printf() style output functions as shown. Closely related to this would be scanf() style input functions that accept a format string and a list of pointers into which return values are placed. However, variable length arguments are also sometimes used to write functions that accept a NULL-terminated list of pointers. A good example of this would be a function like this:

    int execlp(const char *path, const char *arg1, ...);
    ...
    
    /* Example */
    execlp("ls", "ls", "-l", NULL);
    

    In addition, varargs is sometimes used to fake default arguments in older C libraries. For instance, the low level open() system call is often declared as a varargs function so that it will accept two or three arguments:

    int open(const char *path, int oflag, ...);
    ...
    
    /* Examples */
    f = open("foo", O_RDONLY);
    g = open("bar", O_WRONLY | O_CREAT, 0644);
    

    Finally, to implement a varargs function, recall that you have to use the C library functions defined in <stdarg.h>. For example:

    List make_list(const char *s, ...) {
      va_list ap;
      List    x;
      ...
      va_start(ap, s);
      while (s) {
        x.append(s);
        s = va_arg(ap, const char *);
      }
      va_end(ap);
      return x;
    }
    

    14.2 The Problem

    Generating wrappers for a variable length argument function presents a number of special challenges. Although C provides support for implementing functions that receive variable length arguments, there are no functions that can go in the other direction. Specifically, you can't write a function that dynamically creates a list of arguments and which invokes a varargs function on your behalf.

    Although it is possible to write functions that accept the special type va_list, this is something entirely different. You can't take a va_list structure and pass it in place of the variable length arguments to another varargs function. It just doesn't work.

    The reason this doesn't work has to do with the way that function calls get compiled. For example, suppose that your program has a function call like this:

    printf("Hello %s. Your number is %d\n", name, num);
    

    When the compiler looks at this, it knows that you are calling printf() with exactly three arguments. Furthermore, it knows that the number of arguments as well are their types and sizes is never going to change during program execution. Therefore, this gets turned to machine code that sets up a three-argument stack frame followed by a call to printf().

    In contrast, suppose you attempted to make some kind of wrapper around printf() using code like this:

    int wrap_printf(const char *fmt, ...) {
      va_list ap;
      va_start(ap, fmt);
      ...
      printf(fmt, ap);
      ...
      va_end(ap);
    };
    

    Although this code might compile, it won't do what you expect. This is because the call to printf() is compiled as a procedure call involving only two arguments. However, clearly a two-argument configuration of the call stack is completely wrong if your intent is to pass an arbitrary number of arguments to the real printf(). Needless to say, it won't work.

    Unfortunately, the situation just described is exactly the problem faced by wrapper generation tools. In general, the number of passed arguments will not be known until run-time. To make matters even worse, you won't know the types and sizes of arguments until run-time as well. Needless to say, there is no obvious way to make the C compiler generate code for a function call involving an unknown number of arguments of unknown types.

    In theory, it is possible to write a wrapper that does the right thing. However, this involves knowing the underlying ABI for the target platform and language as well as writing special purpose code that manually constructed the call stack before making a procedure call. Unfortunately, both of these tasks require the use of inline assembly code. Clearly, that's the kind of solution you would much rather avoid.

    With this nastiness in mind, SWIG provides a number of solutions to the varargs wrapping problem. Most of these solutions are compromises that provide limited varargs support without having to resort to assembly language. However, SWIG can also support real varargs wrapping (with stack-frame manipulation) if you are willing to get hands dirty. Keep reading.

    14.3 Default varargs support

    When variable length arguments appear in an interface, the default behavior is to drop the variable argument list entirely, replacing them with a single NULL pointer. For example, if you had this function,

    void traceprintf(const char *fmt, ...);
    

    it would be wrapped as if it had been declared as follows:

    void traceprintf(const char *fmt);
    

    When the function is called inside the wrappers, it is called as follows:

    traceprintf(arg1, NULL);
    

    Arguably, this approach seems to defeat the whole point of variable length arguments. However, this actually provides enough support for many simple kinds of varargs functions to still be useful, however it does come with a caveat. For instance, you could make function calls like this (in Python):

    >>> traceprintf("Hello World")
    >>> traceprintf("Hello %s. Your number is %d\n" % (name, num))
    >>> traceprintf("Your result is 90%%.")
    

    Notice how string formatting is being done in Python instead of C. The caveat is the strings passed must be safe to use in C though. For example if name was to contain a "%" it should be double escaped in order to avoid unpredictable behaviour:

    >>> traceprintf("Your result is 90%.\n")  # unpredictable behaviour
    >>> traceprintf("Your result is 90%%.\n") # good
    

    Read on for further solutions.

    14.4 Argument replacement using %varargs

    Instead of dropping the variable length arguments, an alternative approach is to replace (...) with a set of suitable arguments. SWIG provides a special %varargs directive that can be used to do this. For example,

    %varargs(int mode = 0) open;
    ...
    int open(const char *path, int oflags, ...);
    

    is equivalent to this:

    int open(const char *path, int oflags, int mode = 0);
    

    In this case, %varargs is simply providing more specific information about the extra arguments that might be passed to a function. If the arguments to a varargs function are of uniform type, %varargs can also accept a numerical argument count as follows:

    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    and is effectively seen as:

    int execlp(const char *path, const char *arg, 
               char *str1 = NULL, 
               char *str2 = NULL, 
               char *str3 = NULL);
    

    This would wrap execlp() as a function that accepted up to 3 optional arguments. Depending on the application, this may be more than enough for practical purposes.

    The handling of default arguments can be changed via the compactdefaultargs feature. If this feature is used, for example

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    ...
    int execlp(const char *path, const char *arg, ...);
    

    a call from the target language which does not provide the maximum number of arguments, such as, execlp("a", "b", "c") will generate C code which includes the missing default values, that is, execlp("a", "b", "c", NULL, NULL). If compactdefaultargs is not used, then the generated code will be execlp("a", "b", "c") . The former is useful for helping providing a sentinel to terminate the argument list. However, this is not guaranteed, for example when a user passes a non-NULL value for all the parameters. When using compactdefaultargs it is possible to guarantee the NULL sentinel is passed through the, numinputs=0 'in' typemap attribute, naming the last parameter. For example,

    %feature("compactdefaultargs") execlp;
    %varargs(3, char *str = NULL) execlp;
    %typemap(in, numinputs=0) char *str3 ""
    ...
    int execlp(const char *path, const char *arg, ...);
    

    Note that str3 is the name of the last argument, as we have used %varargs with 3. Now execlp("a", "b", "c", "d", "e") will result in an error as one too many arguments has been passed, as now only 2 additional 'str' arguments can be passed with the 3rd one always using the specified default NULL.

    Argument replacement is most appropriate in cases where the types of the extra arguments are uniform and the maximum number of arguments are known. Argument replacement is not as useful when working with functions that accept mixed argument types such as printf(). Providing general purpose wrappers to such functions presents special problems (covered shortly).

    14.5 Varargs and typemaps

    Variable length arguments may be used in typemap specifications. For example:

    %typemap(in) (...) {
        // Get variable length arguments (somehow)
        ...
    }
    
    %typemap(in) (const char *fmt, ...) {
        // Multi-argument typemap
    }
    

    However, this immediately raises the question of what "type" is actually used to represent (...). For lack of a better alternative, the type of (...) is set to void *. Since there is no way to dynamically pass arguments to a varargs function (as previously described), the void * argument value is intended to serve as a place holder for storing some kind of information about the extra arguments (if any). In addition, the default behavior of SWIG is to pass the void * value as an argument to the function. Therefore, you could use the pointer to hold a valid argument value if you wanted.

    To illustrate, here is a safer version of wrapping printf() in Python:

    %typemap(in) (const char *fmt, ...) {
        $1 = "%s";                                /* Fix format string to %s */
        $2 = (void *) PyString_AsString($input);  /* Get string argument */
    };
    ...
    int printf(const char *fmt, ...);
    

    In this example, the format string is implicitly set to "%s" . This prevents a program from passing a bogus format string to the extension. Then, the passed input object is decoded and placed in the void * argument defined for the (...) argument. When the actual function call is made, the underlying wrapper code will look roughly like this:

    wrap_printf() {
      char *arg1;
      void *arg2;
      int   result;
    
      arg1 = "%s";
      arg2 = (void *) PyString_AsString(arg2obj);
      ...
      result = printf(arg1, arg2);
      ...
    }
    

    Notice how both arguments are passed to the function and it does what you would expect.

    The next example illustrates a more advanced kind of varargs typemap. Disclaimer: this requires special support in the target language module and is not guaranteed to work with all SWIG modules at this time. It also starts to illustrate some of the more fundamental problems with supporting varargs in more generality.

    If a typemap is defined for any form of (...), many SWIG modules will generate wrappers that accept a variable number of arguments as input and will make these arguments available in some form. The precise details of this depends on the language module being used (consult the appropriate chapter for more details). However, suppose that you wanted to create a Python wrapper for the execlp() function shown earlier. To do this using a typemap instead of using %varargs, you might first write a typemap like this:

    %typemap(in) (...)(char *vargs[10]) {
      int i;
      int argc;
      for (i = 0; i < 10; i++) vargs[i] = 0;
      argc = PyTuple_Size(varargs);
      if (argc > 10) {
        PyErr_SetString(PyExc_ValueError, "Too many arguments");
        SWIG_fail;
      }
      for (i = 0; i < argc; i++) {
        PyObject *pyobj = PyTuple_GetItem(varargs, i);
        char *str = 0;
    %#if PY_VERSION_HEX>=0x03000000
        PyObject *pystr;
        if (!PyUnicode_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        pystr = PyUnicode_AsUTF8String(pyobj);
        str = strdup(PyBytes_AsString(pystr));
        Py_XDECREF(pystr);
    %#else  
        if (!PyString_Check(pyobj)) {
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        str = PyString_AsString(pyobj);
    %#endif
        vargs[i] = str;
      }
      $1 = (void *)vargs;
    }
    
    %typemap(freearg) (...) {
    %#if PY_VERSION_HEX>=0x03000000
      int i;
      for (i = 0; i < 10; i++) {
        free(vargs$argnum[i]);
      }
    %#endif
    }
    

    In the 'in' typemap, the special variable varargs is a tuple holding all of the extra arguments passed (this is specific to the Python module). The typemap then pulls this apart and sticks the values into the array of strings args. Then, the array is assigned to $1 (recall that this is the void * variable corresponding to (...)). However, this assignment is only half of the picture----clearly this alone is not enough to make the function work. The 'freearg' typemap cleans up memory allocated in the 'in' typemap; this code is generated to be called after the execlp function is called. To patch everything up, you have to rewrite the underlying action code using the %feature directive like this:

    %feature("action") execlp {
      char **vargs = (char **) arg3;
      result = execlp(arg1, arg2, vargs[0], vargs[1], vargs[2], vargs[3], vargs[4],
                      vargs[5], vargs[6], vargs[7], vargs[8], vargs[9], NULL);
    }
    
    int execlp(const char *path, const char *arg, ...);
    

    This patches everything up and creates a function that more or less works. However, don't try explaining this to your coworkers unless you know for certain that they've had several cups of coffee. If you really want to elevate your guru status and increase your job security, continue to the next section.

    14.6 Varargs wrapping with libffi

    All of the previous examples have relied on features of SWIG that are portable and which don't rely upon any low-level machine-level details. In many ways, they have all dodged the real issue of variable length arguments by recasting a varargs function into some weaker variation with a fixed number of arguments of known types. In many cases, this works perfectly fine. However, if you want more generality than this, you need to bring out some bigger guns.

    One way to do this is to use a special purpose library such as libffi ( http://www.sourceware.org/libffi/). libffi is a library that allows you to dynamically construct call-stacks and invoke procedures in a relatively platform independent manner. Details about the library can be found in the libffi distribution and are not repeated here.

    To illustrate the use of libffi, suppose that you really wanted to create a wrapper for execlp() that accepted any number of arguments. To do this, you might make a few adjustments to the previous example. For example:

    /* Take an arbitrary number of extra arguments and place into an array
       of strings */
    
    %typemap(in) (...) {
      char **argv;
      int    argc;
      int    i;
    
      argc = PyTuple_Size(varargs);
      argv = (char **) malloc(sizeof(char *)*(argc+1));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (!PyString_Check(o)) {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Expected a string");
          SWIG_fail;
        }
        argv[i] = PyString_AsString(o);
      }
      argv[i] = NULL;
      $1 = (void *) argv;
    }
    
    /* Rewrite the function call, using libffi */    
    
    %feature("action") execlp {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      char      **args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+3)*sizeof(ffi_type *));
      values = (void **) malloc((vc+3)*sizeof(void *));
      args   = (char **) arg3;
    
      /* Set up path parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
      
      /* Set up first argument */
      types[1] = &ffi_type_pointer;
      values[1] = &arg2;
    
      /* Set up rest of parameters */
      for (i = 0; i <= vc; i++) {
        types[2+i] = &ffi_type_pointer;
        values[2+i] = &args[i];
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+3,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) execlp, &result, values);
      } else {
        free(types);
        free(values);
        free(arg3);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(arg3);
    }
    
    /* Declare the function. Whew! */
    int execlp(const char *path, const char *arg1, ...);
    

    Looking at this example, you may start to wonder if SWIG is making life any easier. Given the amount of code involved, you might also wonder why you didn't just write a hand-crafted wrapper! Either that or you're wondering "why in the hell am I trying to wrap this varargs function in the first place?!?" Obviously, those are questions you'll have to answer for yourself.

    As a more extreme example of libffi, here is some code that attempts to wrap printf(),

    /* A wrapper for printf() using libffi */
    
    %{
    /* Structure for holding passed arguments after conversion */
      typedef struct {
        int type;
        union {
          int    ivalue;
          double dvalue;
          void   *pvalue;
        } val;
      } vtype;
      enum { VT_INT, VT_DOUBLE, VT_POINTER };
    %}
    
    %typemap(in) (const char *fmt, ...) {
      vtype *argv;
      int    argc;
      int    i;
    
      /* Format string */
      $1 = PyString_AsString($input);
    
      /* Variable length arguments */
      argc = PyTuple_Size(varargs);
      argv = (vtype *) malloc(argc*sizeof(vtype));
      for (i = 0; i < argc; i++) {
        PyObject *o = PyTuple_GetItem(varargs, i);
        if (PyInt_Check(o)) {
          argv[i].type = VT_INT;
          argv[i].val.ivalue = PyInt_AsLong(o);
        } else if (PyFloat_Check(o)) {
          argv[i].type = VT_DOUBLE;
          argv[i].val.dvalue = PyFloat_AsDouble(o);
        } else if (PyString_Check(o)) {
          argv[i].type = VT_POINTER;
          argv[i].val.pvalue = (void *) PyString_AsString(o);
        } else {
          free(argv);
          PyErr_SetString(PyExc_ValueError, "Unsupported argument type");
          return NULL;
        }
      }
      $2 = (void *) argv;
    }
    
    /* Rewrite the function call using libffi */    
    %feature("action") printf {
      int       i, vc;
      ffi_cif   cif;
      ffi_type  **types;
      void      **values;
      vtype     *args;
    
      vc = PyTuple_Size(varargs);
      types  = (ffi_type **) malloc((vc+1)*sizeof(ffi_type *));
      values = (void **) malloc((vc+1)*sizeof(void *));
      args   = (vtype *) arg2;
    
      /* Set up fmt parameter */
      types[0] = &ffi_type_pointer;
      values[0] = &arg1;
    
      /* Set up rest of parameters */
      for (i = 0; i < vc; i++) {
        switch(args[i].type) {
        case VT_INT:
          types[1+i] = &ffi_type_uint;
          values[1+i] = &args[i].val.ivalue;
          break;
        case VT_DOUBLE:
          types[1+i] = &ffi_type_double;
          values[1+i] = &args[i].val.dvalue;
          break;
        case VT_POINTER:
          types[1+i] = &ffi_type_pointer;
          values[1+i] = &args[i].val.pvalue;
          break;
        default:
          abort();    /* Whoa! We're seriously hosed */
          break;   
        }
      }
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, vc+1,
                       &ffi_type_uint, types) == FFI_OK) {
        ffi_call(&cif, (void (*)()) printf, &result, values);
      } else {
        free(types);
        free(values);
        free(args);
        PyErr_SetString(PyExc_RuntimeError, "Whoa!!!!!");
        SWIG_fail;
      }
      free(types);
      free(values);
      free(args);
    }
    
    /* The function */
    int printf(const char *fmt, ...);
    

    Much to your amazement, it even seems to work if you try it:

    >>> import example
    >>> example.printf("Grade: %s   %d/60 = %0.2f%%\n", "Dave", 47, 47.0*100/60)
    Grade: Dave   47/60 = 78.33%
    >>>
    

    Of course, there are still some limitations to consider:

    >>> example.printf("la de da de da %s", 42)
    Segmentation fault (core dumped)
    

    And, on this note, we leave further exploration of libffi to the reader as an exercise. Although Python has been used as an example, most of the techniques in this section can be extrapolated to other language modules with a bit of work. The only details you need to know is how the extra arguments are accessed in each target language. For example, in the Python module, we used the special varargs variable to get these arguments. Modules such as Tcl8 and Perl5 simply provide an argument number for the first extra argument. This can be used to index into an array of passed arguments to get values. Please consult the chapter on each language module for more details.

    14.7 Wrapping of va_list

    Closely related to variable length argument wrapping, you may encounter functions that accept a parameter of type va_list. For example:

    int vprintf(const char *fmt, va_list ap);
    

    As far as we know, there is no obvious way to wrap these functions with SWIG. This is because there is no documented way to assemble the proper va_list structure (there are no C library functions to do it and the contents of va_list are opaque). Not only that, the contents of a va_list structure are closely tied to the underlying call-stack. It's not clear that exporting a va_list would have any use or that it would work at all.

    A workaround can be implemented by writing a simple varargs C wrapper and then using the techniques discussed earlier in this chapter for varargs. Below is a simple wrapper for vprintf renamed so that it can still be called as vprintf from your target language. The %varargs used in the example restricts the function to taking one string argument.

    %{
    int vprintf(const char *fmt, va_list ap);
    %}
    
    %varargs(const char *) my_vprintf;
    %rename(vprintf) my_vprintf;
    
    %inline %{
    int my_vprintf(const char *fmt, ...) {
      va_list ap;
      int result;
    
      va_start(ap, fmt);
      result = vprintf(fmt, ap);
      va_end(ap);
      return result;
    }
    %}
    

    14.8 C++ Issues

    Wrapping of C++ member functions that accept a variable number of arguments presents a number of challenges. By far, the easiest way to handle this is to use the %varargs directive. This is portable and it fully supports classes much like the %rename directive. For example:

    %varargs (10, char * = NULL) Foo::bar;
    
    class Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    
    class Spam: public Foo {
    public:
      virtual void bar(char *arg, ...);   // gets varargs above
    };
    

    %varargs also works with constructors, operators, and any other C++ programming construct that accepts variable arguments.

    Doing anything more advanced than this is likely to involve a serious world of pain. In order to use a library like libffi, you will need to know the underlying calling conventions and details of the C++ ABI. For instance, the details of how this is passed to member functions as well as any hidden arguments that might be used to pass additional information. These details are implementation specific and may differ between compilers and even different versions of the same compiler. Also, be aware that invoking a member function is further complicated if it is a virtual method. In this case, invocation might require a table lookup to obtain the proper function address (although you might be able to obtain an address by casting a bound pointer to a pointer to function as described in the C++ ARM section 18.3.4).

    If you do decide to change the underlying action code, be aware that SWIG always places the this pointer in arg1. Other arguments are placed in arg2, arg3, and so forth. For example:

    %feature("action") Foo::bar {
      ...
      result = arg1->bar(arg2, arg3, etc.);
      ...
    }
    

    Given the potential to shoot yourself in the foot, it is probably easier to reconsider your design or to provide an alternative interface using a helper function than it is to create a fully general wrapper to a varargs C++ member function.

    14.9 Discussion

    This chapter has provided a number of techniques that can be used to address the problem of variable length argument wrapping. If you care about portability and ease of use, the %varargs directive is probably the easiest way to tackle the problem. However, using typemaps, it is possible to do some very advanced kinds of wrapping.

    One point of discussion concerns the structure of the libffi examples in the previous section. Looking at that code, it is not at all clear that this is the easiest way to solve the problem. However, there are a number of subtle aspects of the solution to consider--mostly concerning the way in which the problem has been decomposed. First, the example is structured in a way that tries to maintain separation between wrapper-specific information and the declaration of the function itself. The idea here is that you might structure your interface like this:

    %typemap(const char *fmt, ...) {
      ...
    }
    %feature("action") traceprintf {
      ...
    }
    
    /* Include some header file with traceprintf in it */
    %include "someheader.h"
    

    Second, careful scrutiny will reveal that the typemaps involving (...) have nothing whatsoever to do with the libffi library. In fact, they are generic with respect to the way in which the function is actually called. This decoupling means that it will be much easier to consider other library alternatives for making the function call. For instance, if libffi wasn't supported on a certain platform, you might be able to use something else instead. You could use conditional compilation to control this:

    #ifdef USE_LIBFFI
    %feature("action") printf {
      ...
    }
    #endif
    #ifdef USE_OTHERFFI
    %feature("action") printf {
    ...
    }
    #endif
    

    Finally, even though you might be inclined to just write a hand-written wrapper for varargs functions, the techniques used in the previous section have the advantage of being compatible with all other features of SWIG such as exception handling.

    As a final word, some C programmers seem to have the assumption that the wrapping of variable length argument functions is an easily solved problem. However, this section has hopefully dispelled some of these myths. All things being equal, you are better off avoiding variable length arguments if you can. If you can't avoid them, please consider some of the simple solutions first. If you can't live with a simple solution, proceed with caution. At the very least, make sure you carefully read the section "A7.3.2 Function Calls" in Kernighan and Ritchie and make sure you fully understand the parameter passing conventions used for varargs. Also, be aware of the platform dependencies and reliability issues that this will introduce. Good luck.


    15 Warning Messages

    15.1 Introduction

    During compilation, SWIG may generate a variety of warning messages. For example:

    example.i:16: Warning 501: Overloaded declaration ignored.  bar(double)
    example.i:15: Warning 501: Previous declaration is bar(int)
    

    Typically, warning messages indicate non-fatal problems with the input where the generated wrapper code will probably compile, but it may not work like you expect.

    15.2 Warning message suppression

    All warning messages have a numeric code that is shown in the warning message itself. To suppress the printing of a warning message, a number of techniques can be used. First, you can run SWIG with the -w command line option. For example:

    % swig -python -w501 example.i
    % swig -python -w501,505,401 example.i
    

    Alternatively, warnings can be suppressed by inserting a special preprocessor pragma into the input file:

    %module example
    #pragma SWIG nowarn=501
    #pragma SWIG nowarn=501,505,401
    

    Finally, code-generation warnings can be disabled on a declaration by declaration basis using the %warnfilter directive. For example:

    %module example
    %warnfilter(501) foo;
    ...
    int foo(int);
    int foo(double);              // Silently ignored.
    

    The %warnfilter directive has the same semantics as other declaration modifiers like %rename, %ignore and %feature, see the %feature directive section. For example, if you wanted to suppress a warning for a method in a class hierarchy, you could do this:

    %warnfilter(501) Object::foo;
    class Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    
    class Derived : public Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    

    Warnings can be suppressed for an entire class by supplying a class name. For example:

    %warnfilter(501) Object;
    
    class Object {
    public:
      ...                      // All 501 warnings ignored in class
    };
    

    There is no option to suppress all SWIG warning messages. The warning messages are there for a reason---to tell you that something may be broken in your interface. Ignore the warning messages at your own peril.

    15.3 Enabling extra warnings

    Some warning messages are disabled by default and are generated only to provide additional diagnostics. These warnings can be turned on using the -Wextra option. For example:

    % swig -Wextra -python example.i
    

    To selectively turn on extra warning messages, you can use the directives and options in the previous section--simply add a "+" to all warning numbers. For example:

    % swig -w+309,+452 example.i
    

    or in your interface file use either

    #pragma SWIG nowarn=+309,+452
    

    or

    %warnfilter(+309,+452) foo;
    

    Note: selective enabling of warnings with %warnfilter overrides any global settings you might have made using -w or #pragma.

    You can of course also enable all warnings and suppress a select few, for example:

    % swig -Wextra -w309,452 example.i
    

    The warnings on the right take precedence over the warnings on the left, so in the above example -Wextra adds numerous warnings including 452, but then -w309,452 overrides this and so 452 is suppressesed.

    If you would like all warnings to appear, regardless of the warning filters used, then use the -Wall option. The -Wall option also turns on the extra warnings that -Wextra adds, however, it is subtely different. When -Wall is used, it also disables all other warning filters, that is, any warnings suppressed or added in %warnfilter, #pragma SWIG nowarn or the -w option.

    15.4 Issuing a warning message

    Warning messages can be issued from an interface file using a number of directives. The %warn directive is the most simple:

    %warn "900:This is your last warning!"
    

    All warning messages are optionally prefixed by the warning number to use. If you are generating your own warnings, make sure you don't use numbers defined in the table at the end of this section.

    The %ignorewarn directive is the same as %ignore except that it issues a warning message whenever a matching declaration is found. For example:

    %ignorewarn("362:operator= ignored") operator=;
    

    Warning messages can be associated with typemaps using the warning attribute of a typemap declaration. For example:

    %typemap(in, warning="901:You are really going to regret this usage of $1_type $1_name") blah * {
      ...
    }
    

    In this case, the warning message will be printed whenever the typemap is actually used and the special variables will be expanded as appropriate, for example:

    example.i:23: Warning 901: You are really going to regret this usage of blah * self
    example.i:24: Warning 901: You are really going to regret this usage of blah * stuff
    

    15.5 Symbolic symbols

    The swigwarn.swg file that is installed with SWIG contains symbol constants that could also be used in %warnfilter and #pragma SWIG nowarn. For example this file contains the following line:

    %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef
    

    so SWIGWARN_TYPE_UNDEFINED_CLASS could be used instead of 401, for example:

    #pragma SWIG nowarn=SWIGWARN_TYPE_UNDEFINED_CLASS
    

    or

    %warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS) Foo;
    

    15.6 Commentary

    The ability to suppress warning messages is really only provided for advanced users and is not recommended in normal use. You are advised to modify your interface to fix the problems highlighted by the warnings wherever possible instead of suppressing warnings.

    Certain types of SWIG problems are errors. These usually arise due to parsing errors (bad syntax) or semantic problems for which there is no obvious recovery. There is no mechanism for suppressing error messages.

    15.7 Warnings as errors

    Warnings can be handled as errors by using the -Werror command line option. This will cause SWIG to exit with a non successful exit code if a warning is encountered.

    15.8 Message output format

    The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example:

    $ swig -python -Fstandard example.i
    example.i:4: Syntax error in input(1).
    $ swig -python -Fmicrosoft example.i
    example.i(4) : Syntax error in input(1).
    

    15.9 Warning number reference

    15.9.1 Deprecated features (100-199)

    • 101. Deprecated %extern directive.
    • 102. Deprecated %val directive.
    • 103. Deprecated %out directive.
    • 104. Deprecated %disabledoc directive.
    • 105. Deprecated %enabledoc directive.
    • 106. Deprecated %doconly directive.
    • 107. Deprecated %style directive.
    • 108. Deprecated %localstyle directive.
    • 109. Deprecated %title directive.
    • 110. Deprecated %section directive.
    • 111. Deprecated %subsection directive.
    • 112. Deprecated %subsubsection directive.
    • 113. Deprecated %addmethods directive.
    • 114. Deprecated %readonly directive.
    • 115. Deprecated %readwrite directive.
    • 116. Deprecated %except directive.
    • 117. Deprecated %new directive.
    • 118. Deprecated %typemap(except).
    • 119. Deprecated %typemap(ignore).
    • 120. Deprecated command line option (-runtime, -noruntime).
    • 121. Deprecated %name directive.
    • 126. The 'nestedworkaround' feature is deprecated.

    15.9.2 Preprocessor (200-299)

    • 201. Unable to find filename.
    • 202. Could not evaluate expression expr.
    • 203. Both includeall and importall are defined: using includeall.
    • 204. CPP #warning, "warning".
    • 205. CPP #error, "error".
    • 206. Unexpected tokens after #directive directive.

    15.9.3 C/C++ Parser (300-399)

    • 301. class keyword used, but not in C++ mode.
    • 302. Identifier 'name' redefined (ignored).
    • 303. %extend defined for an undeclared class 'name '.
    • 304. Unsupported constant value (ignored).
    • 305. Bad constant value (ignored).
    • 306. 'identifier' is private in this context.
    • 307. Can't set default argument value (ignored)
    • 308. Namespace alias 'name' not allowed here. Assuming ' name'
    • 309. [private | protected] inheritance ignored.
    • 310. Template 'name' was already wrapped as 'name' (ignored)
    • 312. Unnamed nested class not currently supported (ignored).
    • 313. Unrecognized extern type "name" (ignored).
    • 314. 'identifier' is a lang keyword.
    • 315. Nothing known about 'identifier'.
    • 316. Repeated %module directive.
    • 317. Specialization of non-template 'name'.
    • 318. Instantiation of template 'name' is ambiguous, instantiation templ used, instantiation templ ignored.
    • 319. No access specifier given for base class name (ignored).
    • 320. Explicit template instantiation ignored.
    • 321. identifier conflicts with a built-in name.
    • 322. Redundant redeclaration of 'name'.
    • 323. Recursive scope inheritance of 'name'.
    • 324. Named nested template instantiations not supported. Processing as if no name was given to %template().
    • 325. Nested kind not currently supported (name ignored).
    • 326. Deprecated %extend name used - the kind name 'name ' should be used instead of the typedef name 'name'.
    • 350. operator new ignored.
    • 351. operator delete ignored.
    • 352. operator+ ignored.
    • 353. operator- ignored.
    • 354. operator* ignored.
    • 355. operator/ ignored.
    • 356. operator% ignored.
    • 357. operator^ ignored.
    • 358. operator& ignored.
    • 359. operator| ignored.
    • 360. operator~ ignored.
    • 361. operator! ignored.
    • 362. operator= ignored.
    • 363. operator< ignored.
    • 364. operator> ignored.
    • 365. operator+= ignored.
    • 366. operator-= ignored.
    • 367. operator*= ignored.
    • 368. operator/= ignored.
    • 369. operator%= ignored.
    • 370. operator^= ignored.
    • 371. operator&= ignored.
    • 372. operator|= ignored.
    • 373. operator<< ignored.
    • 374. operator>>ignored.
    • 375. operator<<= ignored.
    • 376. operator>>= ignored.
    • 377. operator== ignored.
    • 378. operator!= ignored.
    • 379. operator<= ignored.
    • 380. operator>= ignored.
    • 381. operator&& ignored.
    • 382. operator|| ignored.
    • 383. operator++ ignored.
    • 384. operator-- ignored.
    • 385. operator, ignored.
    • 386. operator-<* ignored.
    • 387. operator-< ignored.
    • 388. operator() ignored.
    • 389. operator[] ignored.
    • 390. operator+ ignored (unary).
    • 391. operator- ignored (unary).
    • 392. operator* ignored (unary).
    • 393. operator& ignored (unary).
    • 394. operator new[] ignored.
    • 395. operator delete[] ignored.

    15.9.4 Types and typemaps (400-499)

    • 401. Nothing known about class 'name'. Ignored.
    • 402. Base class 'name' is incomplete.
    • 403. Class 'name' might be abstract.
    • 450. Deprecated typemap feature ($source/$target).
    • 451. Setting const char * variable may leak memory.
    • 452. Reserved
    • 453. Can't apply (pattern). No typemaps are defined.
    • 460. Unable to use type type as a function argument.
    • 461. Unable to use return type type in function name .
    • 462. Unable to set variable of type type.
    • 463. Unable to read variable of type type.
    • 464. Unsupported constant value.
    • 465. Unable to handle type type.
    • 466. Unsupported variable type type.
    • 467. Overloaded declaration not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'type ')
    • 468. No 'throw' typemap defined for exception type type
    • 469. No or improper directorin typemap defined for type
    • 470. Thread/reentrant unsafe wrapping, consider returning by value instead.
    • 471. Unable to use return type type in director method
    • 474. Method method usage of the optimal attribute ignored in the out typemap as the following cannot be used to generate optimal code: code
    • 475. Multiple calls to method might be generated due to optimal attribute usage in the out typemap.
    • 476. Initialization using std::initializer_list.
    • 477. No directorthrows typemap defined for type

    15.9.5 Code generation (500-599)

    • 501. Overloaded declaration ignored. decl. Previous declaration is decl.
    • 502. Overloaded constructor ignored. decl. Previous declaration is decl.
    • 503. Can't wrap 'identifier' unless renamed to a valid identifier.
    • 504. Function name must have a return type. Ignored.
    • 505. Variable length arguments discarded.
    • 506. Can't wrap varargs with keyword arguments enabled.
    • 507. Adding native function name not supported (ignored).
    • 508. Declaration of 'name' shadows declaration accessible via operator->(), previous declaration of'declaration'.
    • 509. Overloaded method declaration effectively ignored, as it is shadowed by declaration.
    • 510. Friend function 'name' ignored.
    • 511. Can't use keyword arguments with overloaded functions.
    • 512. Overloaded method declaration ignored, using non-const method declaration instead.
    • 513. Can't generate wrappers for unnamed struct/class.
    • 514.
    • 515.
    • 516. Overloaded method declaration ignored, using declaration instead.
    • 517.
    • 518. Portability warning: File file1 will be overwritten by file2 on case insensitive filesystems such as Windows' FAT32 and NTFS unless the class/module name is renamed.
    • 519. %template() contains no name. Template method ignored: declaration
    • 520. Base/Derived class 'classname1' of ' classname2' is not similarly marked as a smart pointer.
    • 521. Illegal destructor name name. Ignored.
    • 522. Use of an illegal constructor name 'name' in %extend is deprecated, the constructor name should be 'name'.
    • 523. Use of an illegal destructor name 'name' in %extend is deprecated, the destructor name should be 'name'.

    15.9.6 Language module specific (700-899)

    • 801. Wrong name (corrected to 'name'). (Ruby).
    • 810. No jni typemap defined for type (Java).
    • 811. No jtype typemap defined for type (Java).
    • 812. No jstype typemap defined for type (Java).
    • 813. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in Java. (Java).
    • 814.
    • 815. No javafinalize typemap defined for type (Java).
    • 816. No javabody typemap defined for type (Java).
    • 817. No javaout typemap defined for type (Java).
    • 818. No javain typemap defined for type (Java).
    • 819. No javadirectorin typemap defined for type (Java).
    • 820. No javadirectorout typemap defined for type (Java).
    • 821.
    • 822. Covariant return types not supported in Java. Proxy method will return basetype (Java).
    • 823. No javaconstruct typemap defined for type (Java).
    • 824. Missing JNI descriptor in directorin typemap defined for type (Java).
    • 825. "directorconnect" attribute missing in type "javaconstruct" typemap. (Java).
    • 826. The nspace feature is used on 'type' without -package. The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package. (Java).
    • 830. No ctype typemap defined for type (C#).
    • 831. No cstype typemap defined for type (C#).
    • 832. No cswtype typemap defined for type (C#).
    • 833. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in C#. (C#).
    • 834.
    • 835. No csfinalize typemap defined for type (C#).
    • 836. No csbody typemap defined for type (C#).
    • 837. No csout typemap defined for type (C#).
    • 838. No csin typemap defined for type (C#).
    • 839.
    • 840.
    • 841.
    • 842. Covariant return types not supported in C#. Proxy method will return basetype (C#).
    • 843. No csconstruct typemap defined for type (C#).
    • 844. C# exception may not be thrown - no $excode or excode attribute in typemap typemap. (C#).
    • 845. Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute. (C#).
    • 870. Warning for classname: Base baseclass ignored. Multiple inheritance is not supported in PHP. (Php).
    • 871. Unrecognized pragma pragma. (Php).

    15.9.7 User defined (900-999)

    These numbers can be used by your own application.

    15.10 History

    The ability to control warning messages was first added to SWIG-1.3.12.


    16 Working with Modules

    16.1 Modules Introduction

    Each invocation of SWIG requires a module name to be specified. The module name is used to name the resulting target language extension module. Exactly what this means and what the name is used for depends on the target language, for example the name can define a target language namespace or merely be a useful name for naming files or helper classes. Essentially, a module comprises target language wrappers for a chosen collection of global variables/functions, structs/classes and other C/C++ types.

    The module name can be supplied in one of two ways. The first is to specify it with the special %module directive. This directive must appear at the beginning of the interface file. The general form of this directive is:

    %module(option1="value1", option2="value2", ...) modulename
    

    where the modulename is mandatory and the options add one or more optional additional features. Typically no options are specified, for example:

    %module mymodule
    

    The second way to specify the module name is with the -module command line option, for example -module mymodule. If the module name is supplied on the command line, it overrides the name specified by the %module directive.

    When first working with SWIG, users commonly start by creating a single module. That is, you might define a single SWIG interface that wraps some set of C/C++ code. You then compile all of the generated wrapper code together and use it. For large applications, however, this approach is problematic---the size of the generated wrapper code can be rather large. Moreover, it is probably easier to manage the target language interface when it is broken up into smaller pieces.

    This chapter describes the problem of using SWIG in programs where you want to create a collection of modules. Each module in the collection is created via separate invocations of SWIG.

    16.2 Basics

    The basic usage case with multiple modules is when modules do not have cross-references (ie. when wrapping multiple independent C APIs). In that case, swig input files should just work out of the box - you simply create multiple wrapper .cxx files, link them into your application, and insert/load each in the scripting language runtime as you would do for the single module case.

    A bit more complex is the case in which modules need to share information. For example, when one module extends the class of another by deriving from it:

    // File: base.h
    class base {
    public:
      int foo();
    };
    
     
    // File: base_module.i
    %module base_module
    
    %{
    #include "base.h"
    %}
    %include "base.h"
    
     
    // File: derived_module.i
    %module derived_module
    
    %import "base_module.i"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    %}
    

    To create the wrapper properly, module derived_module needs to know about the base class and that its interface is covered in another module. The line %import "base_module.i" lets SWIG know exactly that. Often the .h file is passed to %import instead of the .i, which unfortunately doesn't work for all language modules. For example, Python requires the name of module that the base class exists in so that the proxy classes can fully inherit the base class's methods. Typically you will get a warning when the module name is missing, eg:

    derived_module.i:8: Warning 401: Base class 'base' ignored - unknown module name for base. Either
    import
    the appropriate module interface file or specify the name of the module in the %import directive.
    

    It is sometimes desirable to import the header file rather than the interface file and overcome the above warning. For example in the case of the imported interface being quite large, it may be desirable to simplify matters and just import a small header file of dependent types. This can be done by specifying the optional module attribute in the %import directive. The derived_module.i file shown above could be replaced with the following:

    // File: derived_module.i
    %module derived_module
    
    %import(module="base_module") "base.h"
    
    %inline %{
    class derived : public base {
    public:
      int bar();
    };
    

    Note that "base_module" is the module name and is the same as that specified in %module in base_module.i as well as the %import in derived_module.i.

    Another issue to beware of is that multiple dependent wrappers should not be linked/loaded in parallel from multiple threads as SWIG provides no locking - for more on that issue, read on.

    16.3 The SWIG runtime code

    Many of SWIG's target languages generate a set of functions commonly known as the "SWIG runtime." These functions are primarily related to the runtime type system which checks pointer types and performs other tasks such as proper casting of pointer values in C++. As a general rule, the statically typed target languages, such as Java, use the language's built in static type checking and have no need for a SWIG runtime. All the dynamically typed / interpreted languages rely on the SWIG runtime.

    The runtime functions are private to each SWIG-generated module. That is, the runtime functions are declared with "static" linkage and are visible only to the wrapper functions defined in that module. The only problem with this approach is that when more than one SWIG module is used in the same application, those modules often need to share type information. This is especially true for C++ programs where SWIG must collect and share information about inheritance relationships that cross module boundaries.

    To solve the problem of sharing information across modules, a pointer to the type information is stored in a global variable in the target language namespace. During module initialization, type information is loaded into the global data structure of type information from all modules.

    There are a few trade offs with this approach. This type information is global across all SWIG modules loaded, and can cause type conflicts between modules that were not designed to work together. To solve this approach, the SWIG runtime code uses a define SWIG_TYPE_TABLE to provide a unique type table. This behavior can be enabled when compiling the generated _wrap.cxx or _wrap.c file by adding -DSWIG_TYPE_TABLE=myprojectname to the command line argument.

    Then, only modules compiled with SWIG_TYPE_TABLE set to myprojectname will share type information. So if your project has three modules, all three should be compiled with -DSWIG_TYPE_TABLE=myprojectname, and then these three modules will share type information. But any other project's types will not interfere or clash with the types in your module.

    Another issue relating to the global type table is thread safety. If two modules try and load at the same time, the type information can become corrupt. SWIG currently does not provide any locking, and if you use threads, you must make sure that modules are loaded serially. Be careful if you use threads and the automatic module loading that some scripting languages provide. One solution is to load all modules before spawning any threads, or use SWIG_TYPE_TABLE to separate type tables so they do not clash with each other.

    Lastly, SWIG uses a #define SWIG_RUNTIME_VERSION, located in Lib/swigrun.swg and near the top of every generated module. This number gets incremented when the data structures change, so that SWIG modules generated with different versions can peacefully coexist. So the type structures are separated by the (SWIG_TYPE_TABLE, SWIG_RUNTIME_VERSION) pair, where by default SWIG_TYPE_TABLE is empty. Only modules compiled with the same pair will share type information.

    16.4 External access to the runtime

    As described in The run-time type checker, the functions SWIG_TypeQuery, SWIG_NewPointerObj, and others sometimes need to be called. Calling these functions from a typemap is supported, since the typemap code is embedded into the _wrap.c file, which has those declarations available. If you need to call the SWIG run-time functions from another C file, there is one header you need to include. To generate the header that needs to be included, SWIG can be run in a different mode via -external-runtime to generate the run-time instead of the normal mode of processing an input interface file. For example:

    $ swig -python -external-runtime <filename>
    

    The filename argument is optional and if it is not passed, then the default filename will be something like swigpyrun.h, depending on the language. This header file should be treated like any of the other _wrap.c output files, and should be regenerated when the _wrap files are. After including this header, your code will be able to call SWIG_TypeQuery, SWIG_NewPointerObj, SWIG_ConvertPtr and others. The exact argument parameters for these functions might differ between language modules; please check the language module chapters for more information.

    Inside this header the functions are declared static and are included inline into the file, and thus the file does not need to be linked against any SWIG libraries or code (you might still need to link against the language libraries like libpython-2.3). Data is shared between this file and the _wrap.c files through a global variable in the scripting language. It is also possible to copy this header file along with the generated wrapper files into your own package, so that you can distribute a package that can be compiled without SWIG installed (this works because the header file is self-contained, and does not need to link with anything).

    This header will also use the -DSWIG_TYPE_TABLE described above, so when compiling any code which includes the generated header file should define the SWIG_TYPE_TABLE to be the same as the module whose types you are trying to access.

    16.5 A word of caution about static libraries

    When working with multiple SWIG modules, you should take care not to use static libraries. For example, if you have a static library libfoo.a and you link a collection of SWIG modules with that library, each module will get its own private copy of the library code inserted into it. This is very often NOT what you want and it can lead to unexpected or bizarre program behavior. When working with dynamically loadable modules, you should try to work exclusively with shared libraries.

    16.6 References

    Due to the complexity of working with shared libraries and multiple modules, it might be a good idea to consult an outside reference. John Levine's "Linkers and Loaders" is highly recommended.

    16.7 Reducing the wrapper file size

    Using multiple modules with the %import directive is the most common approach to modularising large projects. In this way a number of different wrapper files can be generated, thereby avoiding the generation of a single large wrapper file. There are a couple of alternative solutions for reducing the size of a wrapper file through the use of command line options and features.

    -fcompact
    This command line option will compact the size of the wrapper file without changing the code generated into the wrapper file. It simply removes blank lines and joins lines of code together. This is useful for compilers that have a maximum file size that can be handled.

    -fvirtual
    This command line option will remove the generation of superfluous virtual method wrappers. Consider the following inheritance hierarchy:

    struct Base {
      virtual void method();
      ...
    };
    
    struct Derived : Base {
      virtual void method();
      ...
    };
    

    Normally wrappers are generated for both methods, whereas this command line option will suppress the generation of a wrapper for Derived::method. Normal polymorphic behaviour remains as Derived::method will still be called should you have a Derived instance and call the wrapper for Base::method.

    %feature("compactdefaultargs")
    This feature can reduce the number of wrapper methods when wrapping methods with default arguments. The section on default arguments discusses the feature and its limitations.


    17 Using SWIG with ccache - ccache-swig(1) manpage

    17.1 NAME

    ccache-swig - a fast compiler cache

    17.2 SYNOPSIS

    ccache-swig [OPTION]

    ccache-swig <compiler> [COMPILER OPTIONS]

    <compiler> [COMPILER OPTIONS]

    17.3 DESCRIPTION

    ccache-swig is a compiler cache. It speeds up re-compilation of C/C++/SWIG code by caching previous compiles and detecting when the same compile is being done again. ccache-swig is ccache plus support for SWIG. ccache and ccache-swig are used interchangeably in this document.

    17.4 OPTIONS SUMMARY

    Here is a summary of the options to ccache-swig.

    
    -s                      show statistics summary
    -z                      zero statistics
    -c                      run a cache cleanup
    -C                      clear the cache completely
    -F <n>                  set maximum files in cache
    -M <n>                  set maximum size of cache (use G, M or K)
    -h                      this help page
    -V                      print version number
    
    

    17.5 OPTIONS

    These options only apply when you invoke ccache as "ccache-swig". When invoked as a compiler none of these options apply. In that case your normal compiler options apply and you should refer to your compilers documentation.

    -h
    Print a options summary page

    -s
    Print the current statistics summary for the cache. The statistics are stored spread across the subdirectories of the cache. Using "ccache-swig -s" adds up the statistics across all subdirectories and prints the totals.

    -z
    Zero the cache statistics.

    -V
    Print the ccache version number

    -c
    Clean the cache and re-calculate the cache file count and size totals. Normally the -c option should not be necessary as ccache keeps the cache below the specified limits at runtime and keeps statistics up to date on each compile. This option is mostly useful if you manually modify the cache contents or believe that the cache size statistics may be inaccurate.

    -C
    Clear the entire cache, removing all cached files.

    -F <maxfiles>
    This sets the maximum number of files allowed in the cache. The value is stored inside the cache directory and applies to all future compiles. Due to the way the value is stored the actual value used is always rounded down to the nearest multiple of 16.

    -M <maxsize>
    This sets the maximum cache size. You can specify a value in gigabytes, megabytes or kilobytes by appending a G, M or K to the value. The default is gigabytes. The actual value stored is rounded down to the nearest multiple of 16 kilobytes.

    17.6 INSTALLATION

    There are two ways to use ccache. You can either prefix your compile commands with "ccache-swig" or you can create a symbolic link between ccache-swig and the names of your compilers. The first method is most convenient if you just want to try out ccache or wish to use it for some specific projects. The second method is most useful for when you wish to use ccache for all your compiles.

    To install for usage by the first method just copy ccache-swig to somewhere in your path.

    To install for the second method do something like this:

    
      cp ccache-swig /usr/local/bin/
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/gcc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/g++
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/cc
      ln -s /usr/local/bin/ccache-swig /usr/local/bin/swig
    
    
    This will work as long as /usr/local/bin comes before the path to gcc (which is usually in /usr/bin). After installing you may wish to run "which gcc" to make sure that the correct link is being used.

    Note! Do not use a hard link, use a symbolic link. A hardlink will cause "interesting" problems.

    17.7 EXTRA OPTIONS

    When run as a compiler front end ccache usually just takes the same command line options as the compiler you are using. The only exception to this is the option '--ccache-skip'. That option can be used to tell ccache that the next option is definitely not a input filename, and should be passed along to the compiler as-is.

    The reason this can be important is that ccache does need to parse the command line and determine what is an input filename and what is a compiler option, as it needs the input filename to determine the name of the resulting object file (among other things). The heuristic ccache uses in this parse is that any string on the command line that exists as a file is treated as an input file name (usually a C file). By using --ccache-skip you can force an option to not be treated as an input file name and instead be passed along to the compiler as a command line option.

    17.8 ENVIRONMENT VARIABLES

    ccache uses a number of environment variables to control operation. In most cases you won't need any of these as the defaults will be fine.

    CCACHE_DIR
    the CCACHE_DIR environment variable specifies where ccache will keep its cached compiler output. The default is "$HOME/.ccache".

    CCACHE_TEMPDIR
    the CCACHE_TEMPDIR environment variable specifies where ccache will put temporary files. The default is the same as CCACHE_DIR. Note that the CCACHE_TEMPDIR path must be on the same filesystem as the CCACHE_DIR path, so that renames of files between the two directories can work.

    CCACHE_LOGFILE
    If you set the CCACHE_LOGFILE environment variable then ccache will write some log information on cache hits and misses in that file. This is useful for tracking down problems.

    CCACHE_VERBOSE
    If you set the CCACHE_VERBOSE environment variable then ccache will display on stdout all the compiler invocations that it makes. This can useful for debugging unexpected problems.

    CCACHE_PATH
    You can optionally set CCACHE_PATH to a colon separated path where ccache will look for the real compilers. If you don't do this then ccache will look for the first executable matching the compiler name in the normal PATH that isn't a symbolic link to ccache itself.

    CCACHE_CC
    You can optionally set CCACHE_CC to force the name of the compiler to use. If you don't do this then ccache works it out from the command line.

    CCACHE_PREFIX
    This option adds a prefix to the command line that ccache runs when invoking the compiler. Also see the section below on using ccache with distcc.

    CCACHE_DISABLE
    If you set the environment variable CCACHE_DISABLE then ccache will just call the real compiler, bypassing the cache completely.

    CCACHE_READONLY
    the CCACHE_READONLY environment variable tells ccache to attempt to use existing cached object files, but not to try to add anything new to the cache. If you are using this because your CCACHE_DIR is read-only, then you may find that you also need to set CCACHE_TEMPDIR as otherwise ccache will fail to create the temporary files.

    CCACHE_CPP2
    If you set the environment variable CCACHE_CPP2 then ccache will not use the optimisation of avoiding the 2nd call to the pre-processor by compiling the pre-processed output that was used for finding the hash in the case of a cache miss. This is primarily a debugging option, although it is possible that some unusual compilers will have problems with the intermediate filename extensions used in this optimisation, in which case this option could allow ccache to be used.

    CCACHE_NOCOMPRESS
    If you set the environment variable CCACHE_NOCOMPRESS then there is no compression used on files that go into the cache. However, this setting has no effect on how files are retrieved from the cache, compressed results will still be usable.

    CCACHE_NOSTATS
    If you set the environment variable CCACHE_NOSTATS then ccache will not update the statistics files on each compile.

    CCACHE_NLEVELS
    The environment variable CCACHE_NLEVELS allows you to choose the number of levels of hash in the cache directory. The default is 2. The minimum is 1 and the maximum is 8.

    CCACHE_HARDLINK
    If you set the environment variable CCACHE_HARDLINK then ccache will attempt to use hard links from the cache directory when creating the compiler output rather than using a file copy. Using hard links is faster, but can confuse programs like 'make' that rely on modification times. Hard links are never made for compressed cache files.

    CCACHE_RECACHE
    This forces ccache to not use any cached results, even if it finds them. New results are still cached, but existing cache entries are ignored.

    CCACHE_UMASK
    This sets the umask for ccache and all child processes (such as the compiler). This is mostly useful when you wish to share your cache with other users. Note that this also affects the file permissions set on the object files created from your compilations.

    CCACHE_HASHDIR
    This tells ccache to hash the current working directory when calculating the hash that is used to distinguish two compiles. This prevents a problem with the storage of the current working directory in the debug info of a object file, which can lead ccache to give a cached object file that has the working directory in the debug info set incorrectly. This option is off by default as the incorrect setting of this debug info rarely causes problems. If you strike problems with gdb not using the correct directory then enable this option.

    CCACHE_UNIFY
    If you set the environment variable CCACHE_UNIFY then ccache will use the C/C++ unifier when hashing the pre-processor output if -g is not used in the compile. The unifier is slower than a normal hash, so setting this environment variable loses a little bit of speed, but it means that ccache can take advantage of not recompiling when the changes to the source code consist of reformatting only. Note that using CCACHE_UNIFY changes the hash, so cached compiles with CCACHE_UNIFY set cannot be used when CCACHE_UNIFY is not set and vice versa. The reason the unifier is off by default is that it can give incorrect line number information in compiler warning messages.

    CCACHE_EXTENSION
    Normally ccache tries to automatically determine the extension to use for intermediate C pre-processor files based on the type of file being compiled. Unfortunately this sometimes doesn't work, for example when using the aCC compiler on HP-UX. On systems like this you can use the CCACHE_EXTENSION option to override the default. On HP-UX set this environment variable to "i" if you use the aCC compiler.

    CCACHE_STRIPC
    If you set the environment variable CCACHE_STRIPC then ccache will strip the -c option when invoking the preprocessor. This option is primarily for the Sun Workshop C++ compiler as without this option an unwarranted warning is displayed: CC: Warning: "-E" redefines product from "object" to "source (stdout)" when -E and -c is used together.

    CCACHE_SWIG
    When using SWIG as the compiler and it does not have 'swig' in the executable name, then the CCACHE_SWIG environment variable needs to be set in order for ccache to work correctly with SWIG. The use of CCACHE_CPP2 is also recommended for SWIG due to some preprocessor quirks, however, use of CCACHE_CPP2 can often be skipped -- check your generated code with and without this option set. Known problems are using preprocessor directives within %inline blocks and the use of '#pragma SWIG'.

    17.9 CACHE SIZE MANAGEMENT

    By default ccache has a one gigabyte limit on the cache size and no maximum number of files. You can set a different limit using the "ccache -M" and "ccache -F" options, which set the size and number of files limits.

    When these limits are reached ccache will reduce the cache to 20% below the numbers you specified in order to avoid doing the cache clean operation too often.

    17.10 CACHE COMPRESSION

    By default on most platforms ccache will compress all files it puts into the cache using the zlib compression. While this involves a negligible performance slowdown, it significantly increases the number of files that fit in the cache. You can turn off compression setting the CCACHE_NOCOMPRESS environment variable.

    17.11 HOW IT WORKS

    The basic idea is to detect when you are compiling exactly the same code a 2nd time and use the previously compiled output. You detect that it is the same code by forming a hash of:

    • the pre-processor output from running the compiler with -E
    • the command line options
    • the real compilers size and modification time
    • any stderr output generated by the compiler

    These are hashed using md4 (a strong hash) and a cache file is formed based on that hash result. When the same compilation is done a second time ccache is able to supply the correct compiler output (including all warnings etc) from the cache.

    ccache has been carefully written to always produce exactly the same compiler output that you would get without the cache. If you ever discover a case where ccache changes the output of your compiler then please let me know.

    17.12 USING CCACHE WITH DISTCC

    distcc is a very useful program for distributing compilation across a range of compiler servers. It is often useful to combine distcc with ccache, so that compiles that are done are sped up by distcc, but that ccache avoids the compile completely where possible.

    To use distcc with ccache I recommend using the CCACHE_PREFIX option. You just need to set the environment variable CCACHE_PREFIX to 'distcc' and ccache will prefix the command line used with the compiler with the command 'distcc'.

    17.13 SHARING A CACHE

    A group of developers can increase the cache hit rate by sharing a cache directory. The hard links however cause unwanted side effects, as all links to a cached file share the file's modification timestamp. This results in false dependencies to be triggered by timestamp-based build systems whenever another user links to an existing file. Typically, users will see that their libraries and binaries are relinked without reason. To share a cache without side effects, the following conditions need to be met:

    • Use the same CCACHE_DIR environment variable setting
    • Unset the CCACHE_HARDLINK environment variable
    • Make sure everyone sets the CCACHE_UMASK environment variable to 002, this ensures that cached files are accessible to everyone in the group.
    • Make sure that all users have write permission in the entire cache directory (and that you trust all users of the shared cache).
    • Make sure that the setgid bit is set on all directories in the cache. This tells the filesystem to inherit group ownership for new directories. The command "chmod g+s `find $CCACHE_DIR -type d`" might be useful for this.
    • Set CCACHE_NOCOMPRESS for all users, if there are users with versions of ccache that do not support compression.

    17.14 HISTORY

    ccache was inspired by the compilercache shell script script written by Erik Thiele and I would like to thank him for an excellent piece of work. See http://www.erikyyy.de/compilercache/ for the Erik's scripts. ccache-swig is a port of the original ccache with support added for use with SWIG.

    I wrote ccache because I wanted to get a bit more speed out of a compiler cache and I wanted to remove some of the limitations of the shell-script version.

    17.15 DIFFERENCES FROM COMPILERCACHE

    The biggest differences between Erik's compilercache script and ccache are:

    • ccache is written in C, which makes it a bit faster (calling out to external programs is mostly what slowed down the scripts).
    • ccache can automatically find the real compiler
    • ccache keeps statistics on hits/misses
    • ccache can do automatic cache management
    • ccache can cache compiler output that includes warnings. In many cases this gives ccache a much higher cache hit rate.
    • ccache can handle a much wider ranger of compiler options
    • ccache avoids a double call to cpp on a cache miss

    17.16 CREDITS

    Thanks to the following people for their contributions to ccache

    • Erik Thiele for the original compilercache script
    • Luciano Rocha for the idea of compiling the pre-processor output to avoid a 2nd cpp pass
    • Paul Russell for many suggestions and the debian packaging

    17.17 AUTHOR

    ccache was written by Andrew Tridgell http://samba.org/~tridge/. ccache was adapted to create ccache-swig for use with SWIG by William Fulton.

    If you wish to report a problem or make a suggestion then please email the SWIG developers on the swig-devel mailing list, see http://www.swig.org/mail.html

    ccache is released under the GNU General Public License version 2 or later. Please see the file COPYING for license details.


    18 SWIG and Allegro Common Lisp

    This chapter describes SWIG's support of Allegro Common Lisp. Allegro CL is a full-featured implementation of the Common Lisp language standard that includes many vendor-specific enhancements and add-on modules for increased usability.

    One such module included in Allegro CL is the Foreign Functions Interface (FFI). This module, tailored primarily toward interfacing with C/C++ and, historically, Fortran, provides a means by which compiled foreign code can be loaded into a running lisp environment and executed. The interface supports the calling of foreign functions and methods, allows for executing lisp routines from foreign code (callbacks), and the passing of data between foreign and lisp code.

    The goal of this module is to make it possible to quickly generate the necessary foreign function definitions so one can make use of C/C++ foreign libraries directly from lisp without the tedium of having to code them by hand. When necessary, it will also generate further C/C++ code that will need to be linked with the intended library for proper interfacing from lisp. It has been designed with an eye toward flexibility. Some foreign function calls may release the heap, while other should not. Some foreign functions should automatically convert lisp strings into native strings, while others should not. These adjustments and many more are possible with the current module.

    It is significant to note that, while this is a vendor-specific module, we would like to acknowledge the current and ongoing work by developers in the open source lisp community that are working on similar interfaces to implementation-independent foreign function interfaces (UFFI or CFFI, for example). Such work can only benefit the lisp community, and we would not be unhappy to see some enterprising folk use this work to add to it.

    18.1 Basics

    18.1.1 Running SWIG

    If you're reading this, you must have some library you need to generate an interface for. In order for SWIG to do this work, however, it needs a bit of information about how it should go about creating your interface, and what you are interfacing to.

    SWIG expects a description of what in the foreign interface you wish to connect to. It must consisting of C/C++ declarations and special SWIG directives. SWIG can be furnished with a header file, but an interface can also be generated without library headers by supplying a simple text file--called the interface file, which is typically named with a .i extension--containing any foreign declarations of identifiers you wish to use. The most common approach is to use a an interface file with directives to parse the needed headers. A straight parse of library headers will result in usable code, but SWIG directives provides much freedom in how a user might tailor the generated code to their needs or style of coding.

    Note that SWIG does not require any function definitions; the declarations of those functions is all that is necessary. Be careful when tuning the interface as it is quite possible to generate code that will not load or compile.

    An example interface file is shown below. It makes use of two SWIG directives, one of which requests that the declarations in a header file be used to generate part of the interface, and also includes an additional declaration to be added.

    example.i
    %module example
    
    %include "header.h"
    
    int fact(int n);
    

    The contents of header.h are very simple:

    header.h
    int fact(char *statement);   // pass it a fact, and it will rate it.
    

    The contents of example.cl will look like this:

    example.cl
    (defpackage :example
      (:use :common-lisp :swig :ff :excl))
    
      ... helper routines for defining the interface ...
    
    (swig-in-package ())
    
    (swig-defun ("fact")
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defun ("fact")
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    The generated file contains calls to internal swig helper functions. In this case there are two calls to swig-defun. These calls will expand into code that will make the appropriate definitions using the Allegro FFI. Note also, that this code is erroneous. Function overloading is not supported in C, and this code will not compile even though SWIG did not complain.

    In order to generate a C interface to Allegro CL using this code run swig using the -allegrocl option, as below:

    % swig -allegrocl example.i
    

    When building an interface to C++ code, include the -c++ option:

    % swig -allegrocl -c++ example.i
    

    As a result of running one of the above commands, a file named example.cl will be generated containing the lisp side of the interface. As well, a file example_wrap.cxx is also generated, containing C/C++ wrapper code to facilitate access to C++ methods, enumeration values, and constant values. Wrapper functions are necessary in C++ due to the lack of a standard for mangling the names of symbols across all C++ compilers. These wrapper functions are exported from the shared library as appropriate, using the C name mangling convention. The lisp code that is generated will interface to your foreign library through these wrappers.

    It is possible to disable the creation of the .cxx file when generating a C interface by using the -nocwrap command-line argument. For interfaces that don't contain complex enum or constant expressions, contain nested struct/union declarations, or doesn't need to use many of the SWIG customization featuers, this will result in a more streamlined, direct interface to the intended module.

    The generated wrapper file is below. It contains very simple wrappers by default, that simply pass the arguments to the actual function.

    example_wrap.i
      ... lots of SWIG internals ...
    
    EXPORT int ACL___fact__SWIG_0 (char *larg1) {
      int lresult = (int)0 ;
      char *arg1 = (char *) 0 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    
    
    EXPORT int ACL___fact__SWIG_1 (int larg1) {
      int lresult = (int)0 ;
      int arg1 ;
      int result;
    
      arg1 = larg1;
      try {
        result = (int)fact(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (int)0;
      }
    }
    

    And again, the generated lisp code. Note that it differs from what is generated when parsing C code:

      ...
    
    (swig-in-package ())
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_0" :type :function :arity 1)
      ((PARM0_statement cl:string (* :char) ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_statement))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("fact" "ACL___fact__SWIG_1" :type :function :arity 1)
      ((PARM0_n cl:integer :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
    
    (swig-dispatcher ("fact" :type :function :arities (1)))
    

    In this case, the interface generates two swig-defmethod forms and a swig-dispatcher form. This provides a single functional interface for all overloaded routines. A more detailed description of this features is to be found in the section titled Function overloading/Parameter defaulting.

    In order to load a C++ interface, you will need to build a shared library from example_wrap.cxx. Be sure to link in the actual library you created the interface for, as well as any other dependent shared libraries. For example, if you intend to be able to call back into lisp, you will also need to link in the Allegro shared library. The library you create from the C++ wrapper will be what you then load into Allegro CL.

    18.1.2 Command Line Options

    There are three Allegro CL specific command-line option:

    swig -allegrocl [ options ] filename
    
       -identifier-converter [name] - Binds the variable swig:*swig-identifier-convert* 
                                      in the generated .cl file to name.
                                      This function is used to generate symbols
                                      for the lisp side of the interface.
    
       -cwrap - [default] Generate a .cxx file containing C wrapper function when
                wrapping C code. The interface generated is similar to what is
                done for C++ code.
       -nocwrap - Explicitly turn off generation of .cxx wrappers for C code. Reasonable
                  for modules with simple interfaces. Can not handle all legal enum
                  and constant constructs, or take advantage of SWIG customization features.
    
       -isolate - With this command-line argument, all lisp helper functions are defined
                  in a unique package named swig.<module-name> rather than
                  swig. This prevents conflicts when the module is
                  intended to be used with other swig generated interfaces that may,
                  for instance, make use of different identifier converters.
    

    See Section 17.5 Identifier converter functions for more details.

    18.1.3 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file

    • lisphead - inserts before type declarations
    • lisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    18.2 Wrapping Overview

    New users to SWIG are encouraged to read SWIG Basics , and SWIG and C++, for those interested in generating an interface to C++.

    18.2.1 Function Wrapping

    Writing lisp code that directly invokes functions at the foreign function interface level can be cumbersome. Data must often be translated between lisp and foreign types, data extracted from objects, foreign objects allocated and freed upon completion of the foreign call. Dealing with pointers can be unwieldy when it comes to keeping them distinct from other valid integer values.

    We make an attempt to ease some of these burdens by making the interface to foreign code much more lisp-like, rather than C like. How this is done is described in later chapters. The layers themselves, appear as follows:

            ______________
           |              |  (foreign side)
           | Foreign Code |  What we're generating an interface to.
           |______________|
                   |
                   |
            _______v______
           |              |  (foreign side)
           | Wrapper code |  extern "C" wrappers calling C++ 
           |______________|  functions and methods.
                   |
        .  . . - - + - - . .  .
            _______v______
           |              |  (lisp side)
           |  FFI Layer   |  Low level lisp interface. ff:def-foreign-call,
           |______________|  ff:def-foreign-variable
                   |
                   +----------------------------
            _______v______              _______v______
           |              |            |              | (lisp side)    
           |    Defuns    |            |  Defmethods  | wrapper for overloaded
           |______________|            |______________| functions or those with
            (lisp side)                        |        defaulted arguments
            Wrapper for non-overloaded         |
            functions and methods       _______v______
                                       |              | (lisp side)
                                       |    Defuns    | dispatch function
                                       |______________| to overloads based
                                                        on arity
      

    18.2.2 Foreign Wrappers

    These wrappers are as generated by SWIG default. The types of function parameters can be transformed in place using the CTYPE typemap. This is use for converting pass-by-value parameters to pass-by-reference where necessary. All wrapper parameters are then bound to local variables for possible transformation of values (see LIN typemap). Return values can be transformed via the OUT typemap.

    18.2.3 FFI Wrappers

    These are the generated ff:def-foreign-call forms. No typemaps are applicable to this layer, but the %ffargs directive is available for use in .i files, to specify which keyword arguments should be specified for a given function.

    ffargs.i:
    %module ffargs
    
    %ffargs(strings_convert="nil", call_direct="t") foo;
    %ffargs(strings_convert="nil", release_heap=":never", optimize_for_space="t") bar;
    
    int foo(float f1, float f2);
    int foo(float f1, char c2);
    
    void bar(void *lisp_fn);
    
    char *xxx();
      

    Generates:

    ffargs.cl:
    (swig-in-package ())
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_0" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_f2 cl:single-float :float ))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_f2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("foo" "ACL___foo__SWIG_1" :type :function :arity 2)
      ((PARM0_f1 cl:single-float :float )
       (PARM1_c2 cl:character :char character))
      (:returning (:int )
       :call-direct t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_f1))
      (let ((SWIG_arg1 PARM1_c2))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("foo" :type :function :arities (2)))
    (swig-defun ("bar" "ACL___bar__SWIG_0" :type :function)
      ((PARM0_lisp_fn  (* :void) ))
      (:returning (:void )
       :release-heap :never
       :optimize-for-space t
       :strings-convert nil)
      (let ((SWIG_arg0 PARM0_lisp_fn))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("xxx" "ACL___xxx__SWIG_0" :type :function)
      (:void)
      (:returning ((* :char) )
       :strings-convert t)
      (swig-ff-call))
      
    %ffargs(strings_convert="t");

    Is the only default value specified in allegrocl.swg to force the muffling of warnings about automatic string conversion when defining ff:def-foreign-call's.

    18.2.4 Non-overloaded Defuns

    These are simple defuns. There is no typechecking of arguments. Parameters are bound to local variables for possible transformation of values, such as pulling values out of instance slots or allocating temporary stack allocated structures, via the lin typemap. These arguments are then passed to the foreign-call (where typechecking may occur). The return value from this function can be manipulated via the lout typemap.

    18.2.5 Overloaded Defuns

    In the case of overloaded functions, mulitple layers are generated. First, all the overloads for a given name are separated out into groups based on arity, and are wrapped in defmethods. Each method calls a distinct wrapper function, but are themselves distinguished by the types of their arguments (see lispclass typemap). These are further wrapped in a dispatching function (defun) which will invoke the appropriate generic-function based on arity. This provides a single functional interface to all overloads. The return value from this function can be manipulated via the lout typemap.

    18.2.6 What about constant and variable access?

    Along with the described functional layering, when creating a .cxx wrapper, this module will generate getter and--if not immutable--setter, functions for variables and constants. If the -nocwrap option is used, defconstant and ff:def-foreign-variable forms will be generated for accessing constants and global variables. These, along with the defuns listed above are the intended API for calling into the foreign module.

    18.2.7 Object Wrapping

    All non-primitive types (Classes, structs, unions, and typedefs involving same) have a corresponding foreign-type defined on the lisp side via ff:def-foreign-type.

    All non-primitive types are further represented by a CLOS class, created via defclass. An attempt is made to create the same class hierarchy, with all classes inheriting directly or indirectly from ff:foreign-pointer. Further, wherever it is apparent, all pointers returned from foreign code are wrapped in a CLOS instance of the appropriate class. For ff:def-foreign-calls that have been defined to expect a :foreign-address type as argument, these CLOS instances can legally be passed and the pointer to the C++ object automatically extracted. This is a natural feature of Allegro's foreign function interface.

    18.3 Wrapping Details

    In this section is described how particular C/C++ constructs are translated into lisp.

    18.3.1 Namespaces

    C++ namespaces are translated into Lisp packages by SWIG. The Global namespace is mapped to a package named by the %module directive or the -module command-line argument. Further namespaces are generated by the swig-defpackage utility function and given names based on Allegro CLs nested namespace convention. For example:

    foo.i:
    %module foo
    
    %{
    #include "foo.h"
    %}
    
    %include "foo.h"
    
    namespace car {
      ...
      namespace tires {
        int do_something(int n);
      }
    }
        

    Generates the following code.

    foo.cl
    (defpackage :foo
      (:use :common-lisp :swig :ff :excl))
    
    ...
    
    (swig-defpackage ("car"))
    (swig-defpackage ("car" "tires"))
    
    ...
    
    (swig-in-package ("car" "tires"))
    (swig-defun ("do_something" "ACL_car_tires__do_something__SWIG_0" :type :function)
      ((PARM0_n  :int ))
      (:returning (:int )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_n))
      (swig-ff-call SWIG_arg0)))
        

    The above interface file would cause packages foo, foo.car, and foo.car.tires to be created. One would find the function wrapper for do_something defined in the foo.car.tires package(*).

    (*) Except for the package named by the module, all namespace names are passed to the identifier-converter-function as strings with a :type of :namespace. It is the job of this function to generate the desired symbol, accounting for case preferences, additional naming cues, etc.

    Note that packages created by swig-defpackage do not use the COMMON-LISP or EXCL package. This reduces possible conflicts when defining foreign types via the SWIG interface in all but the toplevel modules package. This may lead to confusion if, for example, the current package is foo.car.tires and you attempt to use a common-lisp function such as (car '(1 2 3).

    18.3.2 Constants

    Constants, as declared by the preprocessor #define macro or SWIG %constant directive, are included in SWIG's parse tree when it can be determined that they are, or could be reduced to, a literal value. Such values are translated into defconstant forms in the generated lisp wrapper when the -nocwrap command-line options is used. Else, wrapper functions are generated as in the case of variable access (see section below).

    Here are examples of simple preprocessor constants when using -nocwrap.

    #define A 1                    => (swig-defconstant "A" 1)  
    #define B 'c'                  => (swig-defconstant "B" #\c)
    #define C B                    => (swig-defconstant "C" #\c)
    #define D 1.0e2                => (swig-defconstant "D" 1.0d2)
    #define E 2222                 => (swig-defconstant "E" 2222)
    #define F (unsigned int)2222   => no code generated
    #define G 1.02e2f              => (swig-defconstant "G" 1.02f2)
    #define H foo                  => no code generated
          

    Note that where SWIG is unable to determine if a constant is a literal, no node is added to the SWIG parse tree, and so no values can be generated.

    For preprocessor constants containing expressions which can be reduced to literal values, nodes are created, but with no simplification of the constant value. A very very simple infix to prefix converter has been implemented that tries to do the right thing for simple cases, but does not for more complex expressions. If the literal parser determines that something is wrong, a warning will be generated and the literal expression will be included in the generated code, but commented out.

    #define I A + E                => (swig-defconstant "I" (+ 1 2222))
    #define J 1|2                  => (swig-defconstant "J" (logior 1 2))
    #define Y 1 + 2 * 3 + 4        => (swig-defconstant "Y" (* (+ 1 2) (+ 3 4)))
    #define Y1 (1 + 2) * (3 + 4)   => (swig-defconstant "Y1" (* (+ 1 2) (+ 3 4)))
    #define Y2 1 * 2 + 3 * 4       => (swig-defconstant "Y2" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Y3 (1 * 2) + (3 * 4)   => (swig-defconstant "Y3" (* 1 (+ 2 3) 4))  ;; WRONG
    #define Z 1 + 2 - 3 + 4 * 5    => (swig-defconstant "Z" (* (+ 1 (- 2 3) 4) 5)) ;; WRONG
          

    Users are cautioned to get to know their constants before use, or not use the -nocwrap command-line option.

    18.3.3 Variables

    For C wrapping, a def-foreign-variable call is generated for access to global variables.

    When wrapping C++ code, both global and member variables, getter wrappers are generated for accessing their value, and if not immutable, setter wrappers as well. In the example below, note the lack of a setter wrapper for global_var, defined as const.

    vars.h
    namespace nnn {
      int const global_var = 2;
      float glob_float = 2.0;
    }
        

    Generated code:

    vars.cl
    (swig-in-package ("nnn"))
    (swig-defun ("global_var" "ACL_nnn__global_var_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:int )
       :strings-convert t)
      (swig-ff-call))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_set__SWIG_0" :type :setter)
      ((PARM0_glob_float  :float ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_glob_float))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("glob_float" "ACL_nnn__glob_float_get__SWIG_0" :type :getter)
      (:void)
      (:returning (:float )
       :strings-convert t)
      (swig-ff-call))
        

    Note also, that where applicable, setter wrappers are implemented as setf methods on the getter function, providing a lispy interface to the foreign code.

    user> (load "globalvar.dll")
    ; Foreign loading globalvar.dll.
    t
    user> (load "globalvar.cl")
    ; Loading c:\mikel\src\swig\test\globalvar.cl
    t
    user> 
    globalvar> (globalvar.nnn::global_var)
    2
    globalvar> (globalvar.nnn::glob_float)
    2.0
    globalvar> (setf (globalvar.nnn::glob_float) 3.0)
    3.0
    globalvar> (globalvar.nnn::glob_float)
    3.0
        

    18.3.4 Enumerations

    In C, an enumeration value is an integer value, while in C++ an enumeration value is implicitly convertible to an integer value, but can also be distinguished by its enum type. For each enum declaration a def-foreign-type is generated, assigning the enum a default type of :int. Users may adjust the foreign type of enums via SWIG typemaps .

    Enum values are a bit trickier as they can be initialized using any valid C/C++ expression. In C with the -nocwrap command-line option, we handle the typical cases (simple integer initialization) and generate a defconstant form for each enum value. This has the advantage of it not being necessary to probe into foreign space to retrieve enum values. When generating a .cxx wrapper file, a more general solution is employed. A wrapper variable is created in the module_wrap.cxx file, and a ff:def-foreign-variable call is generated to retrieve its value into lisp.

    For example, the following header file

    enum.h:
    enum COL { RED, GREEN, BLUE };
    enum FOO { FOO1 = 10, FOO2, FOO3 };
          

    In -nocwrap mode, generates

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defconstant "RED" 0)
    (swig-defconstant "GREEN" (+ #.(swig-insert-id "RED" () :type :constant) 1))
    (swig-defconstant "BLUE" (+ #.(swig-insert-id "GREEN" () :type :constant) 1))
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defconstant "FOO1" 10)
    (swig-defconstant "FOO2" (+ #.(swig-insert-id "FOO1" () :type :constant) 1))
    (swig-defconstant "FOO3" (+ #.(swig-insert-id "FOO2" () :type :constant) 1))
          

    And when generating a .cxx wrapper

    enum_wrap.cxx:
    EXPORT const int ACL_ENUM___RED__SWIG_0 = RED;
    EXPORT const int ACL_ENUM___GREEN__SWIG_0 = GREEN;
    EXPORT const int ACL_ENUM___BLUE__SWIG_0 = BLUE;
    EXPORT const int ACL_ENUM___FOO1__SWIG_0 = FOO1;
    EXPORT const int ACL_ENUM___FOO2__SWIG_0 = FOO2;
    EXPORT const int ACL_ENUM___FOO3__SWIG_0 = FOO3;
          

    and

    enum.cl:
    (swig-def-foreign-type "COL" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    
    (swig-def-foreign-type "FOO" :int)
    (swig-defvar "FOO1" "ACL_ENUM___FOO1__SWIG_0" :type :constant)
    (swig-defvar "FOO2" "ACL_ENUM___FOO2__SWIG_0" :type :constant)
    (swig-defvar "FOO3" "ACL_ENUM___FOO3__SWIG_0" :type :constant)
    
          

    18.3.5 Arrays

    One limitation in the Allegro CL foreign-types module, is that, without macrology, expressions may not be used to specify the dimensions of an array declaration. This is not a horrible drawback unless it is necessary to allocate foreign structures based on the array declaration using ff:allocate-fobject. When it can be determined that an array bound is a valid numeric value, SWIG will include this in the generated array declaration on the lisp side, otherwise the value will be included, but commented out.

    Below is a comprehensive example, showing a number of legal C/C++ array declarations and how they are translated into foreign-type specifications in the generated lisp code.

    array.h
    #define MAX_BUF_SIZE 1024
    
    namespace FOO {
      int global_var1[13];
      float global_var2[MAX_BUF_SIZE];
    
    }
    
    enum COLOR { RED = 10, GREEN = 20, BLUE, PURPLE = 50, CYAN };
    
    namespace BAR {
      char global_var3[MAX_BUF_SIZE + 1];
      float global_var4[MAX_BUF_SIZE][13];
      signed short global_var5[MAX_BUF_SIZE + MAX_BUF_SIZE];
    
      int enum_var5[GREEN];
      int enum_var6[CYAN];
    
      COLOR enum_var7[CYAN][MAX_BUF_SIZE];
    }
        

    Generates:

    array.cl
    (in-package #.*swig-module-name*)
    
    (swig-defpackage ("FOO"))
    (swig-defpackage ("BAR"))
    
    (swig-in-package ())
    (swig-def-foreign-type "COLOR" :int)
    (swig-defvar "RED" "ACL_ENUM___RED__SWIG_0" :type :constant)
    (swig-defvar "GREEN" "ACL_ENUM___GREEN__SWIG_0" :type :constant)
    (swig-defvar "BLUE" "ACL_ENUM___BLUE__SWIG_0" :type :constant)
    (swig-defvar "PURPLE" "ACL_ENUM___PURPLE__SWIG_0" :type :constant)
    (swig-defvar "CYAN" "ACL_ENUM___CYAN__SWIG_0" :type :constant)
    
    (swig-in-package ())
    
    (swig-defconstant "MAX_BUF_SIZE" 1024)
    (swig-in-package ("FOO"))
    
    (swig-defun ("global_var1" "ACL_FOO__global_var1_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* :int) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var2" "ACL_FOO__global_var2_set__SWIG_0" :type :setter)
      ((global_var2  (:array :float 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var2))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-in-package ())
    (swig-in-package ("BAR"))
    (swig-defun ("global_var3" "ACL_BAR__global_var3_set__SWIG_0" :type :setter)
      ((global_var3  (:array :char #|1024+1|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var3))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_set__SWIG_0" :type :setter)
      ((global_var4  (:array (:array :float 13) 1024) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var4))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("global_var4" "ACL_BAR__global_var4_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array :float 13)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
    
    
    (swig-defun ("global_var5" "ACL_BAR__global_var5_set__SWIG_0" :type :setter)
      ((global_var5  (:array :short #|1024+1024|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 global_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var5" "ACL_BAR__enum_var5_set__SWIG_0" :type :setter)
      ((enum_var5  (:array :int #|GREEN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var5))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var6" "ACL_BAR__enum_var6_set__SWIG_0" :type :setter)
      ((enum_var6  (:array :int #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var6))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_set__SWIG_0" :type :setter)
      ((enum_var7  (:array (:array #.(swig-insert-id "COLOR" ()) 1024) #|CYAN|#) ))
      (:returning (:void )
       :strings-convert t)
      (let ((SWIG_arg0 enum_var7))
      (swig-ff-call SWIG_arg0)))
    
    
    (swig-defun ("enum_var7" "ACL_BAR__enum_var7_get__SWIG_0" :type :getter)
      (:void)
      (:returning ((* (:array #.(swig-insert-id "COLOR" ()) 1024)) )
       :strings-convert t)
      (make-instance 'ff:foreign-pointer :foreign-address (swig-ff-call)))
        

    18.3.6 Classes and Structs and Unions (oh my!)

    18.3.6.1 CLOS wrapping of

    Classes, unions, and structs are all treated the same way by the interface generator. For any of these objects, a def-foreign-type and a defclass form are generated. For every function that returns an object (or pointer/reference) of C/C++ type X, the wrapping defun (or defmethod) on the Lisp side will automatically wrap the pointer returned in an instance of the appropriate class. This makes it much easier to write and debug code than if pointers were passed around as a jumble of integer values.

    18.3.6.2 CLOS Inheritance

    The CLOS class schema generated by the interface mirrors the inheritance of the classes in foreign code, with the ff:foreign-pointer class at its root. ff:foreign-pointer is a thin wrapper for pointers that is made available by the foreign function interface. Its key benefit is that it may be passed as an argument to any ff:def-foreign-call that is expecting a pointer as the parameter.

    18.3.6.3 Member fields and functions

    All public fields will have accessor getter/setter functions generated for them, as appropriate. All public member functions will have wrapper functions generated.

    We currently ignore anything that isn't public (i.e. private or protected), because the C++ compiler won't allow the wrapper functions to access such fields. Likewise, the interface does nothing for friend directives,

    18.3.6.4 Why not directly access C++ classes using foreign types?

    The def-foreign-type generated by the SWIG interface is currently incomplete. We can reliably generate the object layout of simple structs and unions; they can be allocated via ff:allocate-fobject, and their member variables accessed directly using the various ff:fslot-value-* functions. However, the layout of C++ classes is more complicated. Different compilers adjust class layout based on inheritance patterns, and the presence of virtual member functions. The size of member function pointers vary across compilers as well. As a result, it is recommended that users of any generated interface not attempt to access C++ instances via the foreign type system, but instead use the more robust wrapper functions.

    18.3.7 Templates

    18.3.7.1 Generating wrapper code for templates

    SWIG provides support for dealing with templates, but by default, it will not generate any member variable or function wrappers for templated classes. In order to create these wrappers, you need to explicitly tell SWIG to instantiate them. This is done via the %template directive.

    18.3.7.2 Implicit Template instantiation

    While no wrapper code is generated for accessing member variables, or calling member functions, type code is generated to include these templated classes in the foreign-type and CLOS class schema.

    18.3.8 Typedef, Templates, and Synonym Types

    In C/C++ it is possible, via typedef, to have many names refer to the same type. In general, this is not a problem, though it can lead to confusion. Assume the below C++ header file:

    synonyms.h
    class A { 
      int x;
      int y;
    };
    
    typedef A Foo;
    
    A *xxx(int i);         /* sets A->x = A->y = i */
    Foo *yyy(int i);       /* sets Foo->x = Foo->y = i */
    
    int zzz(A *inst = 0);  /* return inst->x + inst->y */
        

    The function zzz is an overloaded functions; the foreign function call to it will be wrapped in a generic-function whose argument will be checked against a type of A. Assuming a simple implementation, a call to xxx(1) will return a pointer to an A object, which will be wrapped in a CLOS instance of class A , and a call to yyy(1) will result in a CLOS instance of type Foo being returned. Without establishing a clear type relationship between Foo and A, an attempt to call zzz(yyy(1)) will result in an error.

    We resolve this issue, by noting synonym relationships between types while generating the interface. A Primary type is selected (more on this below) from the candidate list of synonyms. For all other synonyms, intead of generating a distinct CLOS class definition, we generate a form that expands to:

    (setf (find-class <synonym>) <primary>)

    The result is that all references to synonym types in foreign code, are wrapped in the same CLOS wrapper, and, in particular, method specialization in wrapping generic functions works as expected.

    Given the above header file, synonym.h, a Lisp session would appear as follows:

    CL-USER> (load "synonym.dll")
    ; Foreign loading synonym.dll.
    t
    CL-USER> (load "synonym.cl")
    ; Loading c:\mikel\src\swig\test\synonym.cl
    t
    CL-USER> 
    synonym> (setf a (xxx 3))
    #<A nil #x3261a0 @ #x207299da>
    synonym> (setf foo (yyy 10))
    #<A nil #x3291d0 @ #x2072e982>
    synonym> (zzz a)
    6
    synonym> (zzz foo)
    20
    synonym> 
        

    18.3.8.1 Choosing a primary type

    The choice of a primary type is selected by the following criteria from a set of synonym types.

    • If a synonym type has a class definition, it is the primary type.
    • If a synonym type is a class template and has been explicitly instantiated via %template, it is the primary type.
    • For all other sets of synonymous types, the synonym which is parsed first becomes the primary type.

    18.3.9 Function overloading/Parameter defaulting

    For each possible argument combination, a distinct wrapper function is created in the .cxx file. On the Lisp side, a generic functions is defined for each possible arity the overloaded/defaulted call may have. Each distinct wrapper is then called from within a defmethod on the appropriate generic function. These are further wrapped inside a dispatch function that checks the number of arguments it is called with and passes them via apply to the appropriate generic-function. This allows for a single entry point to overloaded functions on the lisp side.

    Example:

    overload.h:
    
    class A {
     public:
      int x;
      int y;
    };
    
    float xxx(int i, int x = 0);   /* return i * x */
    float xxx(A *inst, int x);     /* return x + A->x + A->y */
        

    Creates the following three wrappers, for each of the possible argument combinations

    overload_wrap.cxx
    EXPORT void ACL___delete_A__SWIG_0 (A *larg1) {
      A *arg1 = (A *) 0 ;
    
      arg1 = larg1;
      try {
        delete arg1;
    
      } catch (...) {
    
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_0 (int larg1, int larg2) {
      float lresult = (float)0 ;
      int arg1 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_1 (int larg1) {
      float lresult = (float)0 ;
      int arg1 ;
      float result;
    
      arg1 = larg1;
      try {
        result = (float)xxx(arg1);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
    
    
    EXPORT float ACL___xxx__SWIG_2 (A *larg1, int larg2) {
      float lresult = (float)0 ;
      A *arg1 = (A *) 0 ;
      int arg2 ;
      float result;
    
      arg1 = larg1;
      arg2 = larg2;
      try {
        result = (float)xxx(arg1, arg2);
    
        lresult = result;
        return lresult;
      } catch (...) {
        return (float)0;
      }
    }
        

    And the following foreign-function-call and method definitions on the lisp side:

    overload.cl
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_0" :type :function :arity 2)
      ((PARM0_i cl:integer :int )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_1" :type :function :arity 1)
      ((PARM0_i cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_i))
      (swig-ff-call SWIG_arg0)))
    
    (swig-defmethod ("xxx" "ACL___xxx__SWIG_2" :type :function :arity 2)
      ((PARM0_inst #.(swig-insert-id "A" () :type :class) (* #.(swig-insert-id "A" ())) )
       (PARM1_x cl:integer :int ))
      (:returning (:float )
       :strings-convert t)
      (let ((SWIG_arg0 PARM0_inst))
      (let ((SWIG_arg1 PARM1_x))
      (swig-ff-call SWIG_arg0 SWIG_arg1))))
    
    (swig-dispatcher ("xxx" :type :function :arities (1 2)))
        

    And their usage in a sample lisp session:

    overload> (setf a (new_A))
    #<A nil #x329268 @ #x206cf612>
    overload> (setf (A_x a) 10)
    10
    overload> (setf (A_y a) 20)
    20
    overload> (xxx 1)
    0.0
    overload> (xxx 3 10)
    30.0
    overload> (xxx a 1)
    31.0
    overload> (xxx a 2)
    32.0
    overload> 
        

    18.3.10 Operator wrapping and Operator overloading

    Wrappers to defined C++ Operators are automatically renamed, using %rename, to the following defaults:

    /* name conversion for overloaded operators. */
    #ifdef __cplusplus
    %rename(__add__)             *::operator+;
    %rename(__pos__)             *::operator+();
    %rename(__pos__)             *::operator+() const;
    
    %rename(__sub__)             *::operator-;
    %rename(__neg__)             *::operator-() const;
    %rename(__neg__)             *::operator-();
    
    %rename(__mul__)             *::operator*;
    %rename(__deref__)           *::operator*();
    %rename(__deref__)           *::operator*() const;
    
    %rename(__div__)             *::operator/;
    %rename(__mod__)             *::operator%;
    %rename(__logxor__)          *::operator^;
    %rename(__logand__)          *::operator&;
    %rename(__logior__)          *::operator|;
    %rename(__lognot__)          *::operator~();
    %rename(__lognot__)          *::operator~() const;
    
    %rename(__not__)             *::operator!();
    %rename(__not__)             *::operator!() const;
    
    %rename(__assign__)          *::operator=;
    
    %rename(__add_assign__)      *::operator+=;
    %rename(__sub_assign__)      *::operator-=;
    %rename(__mul_assign__)      *::operator*=;
    %rename(__div_assign__)      *::operator/=;
    %rename(__mod_assign__)      *::operator%=;
    %rename(__logxor_assign__)   *::operator^=;
    %rename(__logand_assign__)   *::operator&=;
    %rename(__logior_assign__)   *::operator|=;
    
    %rename(__lshift__)          *::operator<<;
    %rename(__lshift_assign__)   *::operator<<=;
    %rename(__rshift__)          *::operator>>;
    %rename(__rshift_assign__)   *::operator>>=;
    
    %rename(__eq__)              *::operator==;
    %rename(__ne__)              *::operator!=;
    %rename(__lt__)              *::operator<;
    %rename(__gt__)              *::operator>;
    %rename(__lte__)             *::operator<=;
    %rename(__gte__)             *::operator>=;
    
    %rename(__and__)             *::operator&&;
    %rename(__or__)              *::operator||;
    
    %rename(__preincr__)         *::operator++();
    %rename(__postincr__)        *::operator++(int);
    %rename(__predecr__)         *::operator--();
    %rename(__postdecr__)        *::operator--(int);
    
    %rename(__comma__)           *::operator,();
    %rename(__comma__)           *::operator,() const;
    
    %rename(__member_ref__)      *::operator->;
    %rename(__member_func_ref__) *::operator->*;
    
    %rename(__funcall__)         *::operator();
    %rename(__aref__)            *::operator[];
        

    Name mangling occurs on all such renamed identifiers, so that wrapper name generated by B::operator= will be B___eq__ , i.e. <class-or-namespace>_ has been added. Users may modify these default names by adding %rename directives in their own .i files.

    Operator overloading can be achieved by adding functions based on the mangled names of the function. In the following example, a class B is defined with a Operator== method defined. The swig %extend directive is used to add an overload method on Operator==.

    opoverload.h
    class B {
     public:
      int x;
      int y;
      bool operator==(B const& other) const;
    };
        

    and

    opoverload.i
    %module opoverload
    
    %{
    #include <fstream>
    #include "opoverload.h"
    %}
    
    %{
    bool B___eq__(B const *inst, int const x)
    {
      // insert the function definition into the wrapper code before
      // the wrapper for it.
      // ... do stuff ...
    }
    %}
    
    %include "opoverload.h"
    
    %extend B {
     public:
      bool __eq__(int const x) const;
    };
        

    Either operator can be called via a single call to the dispatch function:

    opoverload> (B___eq__ x1 x2)
    nil
    opoverload> (B___eq__ x1 3)
    nil
    opoverload> 
        

    18.3.11 Varargs

    Variable length argument lists are not supported, by default. If such a function is encountered, a warning will generated to stderr. Varargs are supported via the SWIG %varargs directive. This directive allows you to specify a (finite) argument list which will be inserted into the wrapper in place of the variable length argument indicator. As an example, consider the function printf(). Its declaration would appear as follows:

    See the following section on Variable Length arguments provides examples on how %varargs can be used, along with other ways such functions can be wrapped.

    18.3.12 C++ Exceptions

    Each C++ wrapper includes a handler to catch any exceptions that may be thrown while in foreign code. This helps prevent simple C++ errors from killing the entire lisp process. There is currently no mechanism to have these exceptions forwarded to the lisp condition system, nor has any explicit support of the exception related SWIG typemaps been implemented.

    18.3.13 Pass by value, pass by reference

    Allegro CL does not support the passing of non-primitive foreign structures by value. As a result, SWIG must automatically detect and convert function parameters and return values to pointers whenever necessary. This is done via the use of typemaps, and should not require any fine tuning by the user, even for newly defined types.

    18.4 Typemaps

    SWIG Typemaps provide a powerful tool for automatically generating code to handle various menial tasks required of writing an interface to foreign code. The purpose of this section is to describe each of the typemaps used by the Allegro CL module. Please read the chapter on Typemaps for more information.

    18.4.1 Code Generation in the C++ Wrapper

    Every C++ wrapper generated by SWIG takes the following form:

    return-val wrapper-name(parm0, parm1, ..., parmN)
    {
      return-val lresult;   /* return value from wrapper */
      <local-declaration>
      ... results;          /* return value from function call */
    
      <binding locals to parameters>
    
      try {
        result = function-name(local0, local1, ..., localN);
    
        <convert and bind result to lresult>
    
        return lresult;
      catch (...) {
        return (int)0;
      }
        

    18.4.1.1 IN Typemap

    the in typemap is used to generate code to convert parameters passed to C++ wrapper functions into the arguments desired for the call being wrapped. That is, it fills in the code for the <binding locals to parameters> section above. We use this map to automatically convert parameters passed by reference to the wrapper function into by-value arguments for the wrapped call, and also to convert boolean values, which are passed as integers from lisp (by default), into the appropriate type for the language of code being wrapped.

    These are the default specifications for the IN typemap. Here, $input refers to the parameter code is being generated for, and $1 is the local variable to which it is being assigned. The default settings of this typemap are as follows:

    %typemap(in) bool                          "$1 = (bool)$input;";
    %typemap(in) char, unsigned char, signed char,
                 short, signed short, unsigned short,
                 int, signed int, unsigned int,
                 long, signed long, unsigned long,
                 float, double, long double, char *, void *, void,
                 enum SWIGTYPE, SWIGTYPE *,
                 SWIGTYPE[ANY], SWIGTYPE &     "$1 = $input;";
    %typemap(in) SWIGTYPE                      "$1 = *$input;";
        

    18.4.1.2 OUT Typemap

    The out typemap is used to generate code to form the return value of the wrapper from the return value of the wrapped function. This code is placed in the <convert and bind result to lresult> section of the above code diagram. Its default mapping is as follows:

    %typemap(out) bool                          "$result = (int)$1;";
    %typemap(out) char, unsigned char, signed char,
                  short, signed short, unsigned short,
                  int, signed int, unsigned int,
                  long, signed long, unsigned long,
                  float, double, long double, char *, void *, void,
                  enum SWIGTYPE, SWIGTYPE *,
                  SWIGTYPE[ANY], SWIGTYPE &    "$result = $1;";
    %typemap(out) SWIGTYPE                     "$result = new $1_type($1);";
        

    18.4.1.3 CTYPE Typemap

    This typemap is not used for code generation, but purely for the transformation of types in the parameter list of the wrapper function. Its primary use is to handle by-value to by-reference conversion in the wrappers parameter list. Its default settings are:

    %typemap(ctype) bool                       "int";
    %typemap(ctype) char, unsigned char, signed char,
                    short, signed short, unsigned short,
                    int, signed int, unsigned int,
                    long, signed long, unsigned long,
                    float, double, long double, char *, void *, void,
                    enum SWIGTYPE, SWIGTYPE *,
                    SWIGTYPE[ANY], SWIGTYPE &  "$1_ltype";
    %typemap(ctype) SWIGTYPE                   "$&1_type";
        

    These three typemaps are specifically employed by the Allegro CL interface generator. SWIG also implements a number of other typemaps that can be used for generating code in the C/C++ wrappers. You can read about these common typemaps here.

    18.4.2 Code generation in Lisp wrappers

    A number of custom typemaps have also been added to facilitate the generation of code in the lisp side of the interface. These are described below. The basic code generation structure is applied as a series of nested expressions, one for each parameter, then one for manipulating the return value, and last, the foreign function call itself.

    Note that the typemaps below use fully qualified symbols where necessary. Users writing their own typemaps should do likewise. See the explanation in the last paragraph of 16.3.1 Namespaces for details.

    18.4.2.1 LIN Typemap

    The LIN typemap allows for the manipulating the lisp objects passed as arguments to the wrapping defun before passing them to the foreign function call. For example, when passing lisp strings to foreign code, it is often necessary to copy the string into a foreign structure of type (:char *) of appropriate size, and pass this copy to the foreign call. Using the LIN typemap, one could arrange for the stack-allocation of a foreign char array, copy your string into it, and not have to worry about freeing the copy after the function returns.

    The LIN typemap accepts the following $variable references.

    • $in - expands to the name of the parameter being applied to this typemap
    • $out - expands to the name of the local variable assigned to this typemap
    • $in_fftype - the foreign function type of the C type.
    • $*in_fftype - the foreign function type of the C type with one pointer removed. If there is no pointer, then $*in_fftype is the same as $in_fftype.
    • $body - very important. Instructs SWIG where subsequent code generation steps should be inserted into the current typemap. Leaving out a $body reference will result in lisp wrappers that do very little by way of calling into foreign code. Not recommended.
    %typemap(lin) SWIGTYPE "(cl:let (($out $in))\n  $body)";
        

    18.4.2.2 LOUT Typemap

    The LOUT typemap is the means by which we effect the wrapping of foreign pointers in CLOS instances. It is applied after all LIN typemaps, and immediately before the actual foreign-call.

    The LOUT typemap uses the following $variable

    • $lclass - Expands to the CLOS class that represents foreign-objects of the return type matching this typemap.
    • $body - Same as for the LIN map. Place this variable where you want the foreign-function call to occur.
    • $ldestructor - Expands to the symbol naming the destructor for this class ($lclass) of object. Allows you to insert finalization or automatic garbage collection into the wrapper code (see default mappings below).
    %typemap(lout) bool, char, unsigned char, signed char,
                   short, signed short, unsigned short,
                   int, signed int, unsigned int,
                   long, signed long, unsigned long,
                   float, double, long double, char *, void *, void,
                   enum SWIGTYPE    "$body";
    %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *,
                   SWIGTYPE &       "(cl:make-instance '$lclass :foreign-address $body)";
    %typemap(lout) SWIGTYPE    "(cl:let* ((address $body)\n
                                (ACL_result (cl:make-instance '$lclass :foreign-address address)))\n
                                (cl:unless (cl::zerop address)\n
                                (excl:schedule-finalization ACL_result #'$ldestructor))\n
                                 ACL_result)";
        

    18.4.2.3 FFITYPE Typemap

    The FFITYPE typemap works as a helper for a body of code that converts C/C++ type specifications into Allegro CL foreign-type specifications. These foreign-type specifications appear in ff:def-foreing-type declarations, and in the argument list and return values of ff:def-foreign-calls. You would modify this typemap if you want to change how the FFI passes through arguments of a given type. For example, if you know that a particular compiler represents booleans as a single byte, you might add an entry for:

    %typemap(ffitype) bool ":unsigned-char";
        

    Note that this typemap is pure type transformation, and is not used in any code generations step the way the LIN and LOUT typemaps are. The default mappings for this typemap are:

    %typemap(ffitype) bool ":int";
    %typemap(ffitype) char ":char";
    %typemap(ffitype) unsigned char ":unsigned-char";
    %typemap(ffitype) signed char ":char";
    %typemap(ffitype) short, signed short ":short";
    %typemap(ffitype) unsigned short ":unsigned-short";
    %typemap(ffitype) int, signed int ":int";
    %typemap(ffitype) unsigned int ":unsigned-int";
    %typemap(ffitype) long, signed long ":long";
    %typemap(ffitype) unsigned long ":unsigned-long";
    %typemap(ffitype) float ":float";
    %typemap(ffitype) double ":double";
    %typemap(ffitype) char * "(* :char)";
    %typemap(ffitype) void * "(* :void)";
    %typemap(ffitype) void ":void";
    %typemap(ffitype) enum SWIGTYPE ":int";
    %typemap(ffitype) SWIGTYPE & "(* :void)";
        

    18.4.2.4 LISPTYPE Typemap

    This is another type only transformation map, and is used to provide the lisp-type, which is the optional third argument in argument specifier in a ff:def-foreign-call form. Specifying a lisp-type allows the foreign call to perform type checking on the arguments passed in. The default entries in this typemap are:

    %typemap(lisptype) bool "cl:boolean";
    %typemap(lisptype) char "cl:character";
    %typemap(lisptype) unsigned char "cl:integer";
    %typemap(lisptype) signed char "cl:integer";
        

    18.4.2.5 LISPCLASS Typemap

    The LISPCLASS typemap is used to generate the method signatures for the generic-functions which wrap overloaded functions and functions with defaulted arguments. The default entries are:

    %typemap(lispclass) bool "t";
    %typemap(lispclass) char "cl:character";
    %typemap(lispclass) unsigned char, signed char,
                        short, signed short, unsigned short,
                        int, signed int, unsigned int,
                        long, signed long, unsigned long,
                        enum SWIGTYPE       "cl:integer";
    %typemap(lispclass) float "cl:single-float";
    %typemap(lispclass) double "cl:double-float";
    %typemap(lispclass) char * "cl:string";
        

    18.4.3 Modifying SWIG behavior using typemaps

    The following example shows how we made use of the above typemaps to add support for the wchar_t type.

    %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
    
    %typemap(in)        wchar_t "$1 = $input;";
    %typemap(lin)       wchar_t "(cl:let (($out (cl:char-code $in)))\n  $body)";
    %typemap(lin)       wchar_t* "(excl:with-native-string
                                             ($out $in
                                              :external-format #+little-endian :fat-le 
                                                               #-little-endian :fat)\n
                                     $body)"
    
    %typemap(out)       wchar_t "$result = $1;";
    %typemap(lout)      wchar_t "(cl:code-char $body)";
    %typemap(lout)      wchar_t* "(excl:native-to-string $body
                                              :external-format #+little-endian :fat-le
                                                               #-little-endian :fat)";
    
    %typemap(ffitype)   wchar_t ":unsigned-short";
    %typemap(lisptype)  wchar_t "";
    %typemap(ctype)     wchar_t "wchar_t";
    %typemap(lispclass) wchar_t "cl:character";
    %typemap(lispclass) wchar_t* "cl:string";
        

    18.5 Identifier Converter functions

    18.5.1 Creating symbols in the lisp environment

    Various symbols must be generated in the lisp environment to which class definitions, functions, constants, variables, etc. must be bound. Rather than force a particular convention for naming these symbols, an identifier (to symbol) conversion function is used. A user-defined identifier-converter can then implement any symbol naming, case-modifying, scheme desired.

    In generated SWIG code, whenever some interface object must be referenced by its lisp symbol, a macro is inserted that calls the identifier-converter function to generate the appropriate symbol reference. It is therefore expected that the identifier-converter function reliably return the same (eq) symbol given the same set of arguments.

    18.5.2 Existing identifier-converter functions

    Two basic identifier routines have been defined.

    18.5.2.1 identifier-convert-null

    No modification of the identifier string is performed. Based on other arguments, the identifier may be concatenated with other strings, from which a symbol will be created.

    18.5.2.2 identifier-convert-lispify

    All underscores in the identifier string are converted to hyphens. Otherwise, identifier-convert-lispify performs the same symbol transformations.

    18.5.2.3 Default identifier to symbol conversions

    Check the definitions of the above two default identifier-converters in Lib/allegrocl/allegrocl.swg for default naming conventions.

    18.5.3 Defining your own identifier-converter

    A user-defined identifier-converter function should conform to the following specification:

    (defun identifier-convert-fn (id &key type class arity) ...body...)
    result ==> symbol or (setf symbol)
    

    The ID argument is a string representing an identifier in the foreign environment.

    The :type keyword argument provides more information on the type of identifier. Its value is a symbol. This allows the identifier-converter to apply different heuristics when mapping different types of identifiers to symbols. SWIG will generate calls to your identifier-converter using the following types.

    • :class - names a CLOS class.
    • :constant - names a defconstant
    • :constructor - names a function for creating a foreign object
    • :destructor - names a function for freeing a foreign object
    • :function - names a CLOS wrapping defmethod or defun.
    • :ff-operator - names a foreign call defined via ff:def-foreign-call
    • :getter - getter function
    • :namespace - names a C++ namespace
    • :setter - names a setter function. May return a (setf symbol) reference
    • :operator - names a C++ operator, such as Operator=, Operator*.
    • :slot - names a slot in a struct/class/union declaration.
    • :type - names a foreign-type defined via ff:def-foreign-type.
    • :variable - names a variable defined via ff:def-foreign-variable.

    The :class keyword argument is a string naming a foreign class. When non-nil, it indicates that the current identifier has scope in the specified class.

    The :arity keyword argument only appears in swig:swig-defmethod forms generated for overloaded functions. Its value is an integer indicating the number of arguments passed to the routine indicated by this identifier.

    18.5.4 Instructing SWIG to use a particular identifier-converter

    By default, SWIG will use identifier-converter-null. To specify another convert function, use the -identifier-converter command-line argument. The value should be a string naming the function you wish the interface to use instead, when generating symbols. ex:

    % swig -allegrocl -c++ -module mymodule -identifier-converter my-identifier-converter
    

    19 SWIG and Android

    This chapter describes SWIG's support of Android.

    19.1 Overview

    The Android chapter is fairly short as support for Android is the same as for Java, where the Java Native Interface (JNI) is used to call from Android Java into C or C++ compiled code. Everything in the Java chapter applies to generating code for access from Android Java code. This chapter contains a few Android specific notes and examples.

    19.2 Android examples

    19.2.1 Examples introduction

    The examples require the Android SDK and Android NDK which can be installed as per instructions in the links. The Eclipse version is not required for these examples as just the command line tools are used (shown for Linux as the host, but Windows will be very similar, if not identical in most places). Add the SDK tools and NDK tools to your path and create a directory somewhere for your Android projects (adjust PATH as necessary to where you installed the tools):

    $ export PATH=$HOME/android/android-sdk-linux_x86/tools:$HOME/android/android-sdk-linux_x86/platform-tools:$HOME/android/android-ndk-r6b:$PATH
    $ mkdir AndroidApps 
    $ cd AndroidApps
    

    The examples use a target id of 1. This might need changing depending on your setup. After installation of the Android SDK, the available target ids can be viewed by running the command below. Please adjust the id to suit your target device.

    $ android list targets
    

    The following examples are shipped with SWIG under the Examples/android directory and include a Makefile to build and install each example.

    19.2.2 Simple C example

    This simple C example shows how to call a C function as well as read and modify a global variable. First we'll create and build a pure Java Android app. Afterwards the JNI code will be generated by SWIG and built into the app. First create and build an app called SwigSimple in a subdirectory called simple using the commands below. Adjust the --target id as mentioned earlier in the Examples introduction. Managing Projects from the Command Line on the Android developer's site is a useful reference for these steps.

    $ android create project --target 1 --name SwigSimple --path ./simple --activity SwigSimple --package org.swig.simple
    $ cd simple
    $ ant debug
    

    Modify src/org/swig/simple/SwigSimple.java from the default to:

    package org.swig.simple;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ScrollView;
    import android.text.method.ScrollingMovementMethod;
    
    public class SwigSimple extends Activity
    {
        TextView outputText = null;
        ScrollView scroller = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            outputText = (TextView)findViewById(R.id.OutputText);
            outputText.setText("Press 'Run' to start...\n");
            outputText.setMovementMethod(new ScrollingMovementMethod());
    
            scroller = (ScrollView)findViewById(R.id.Scroller);
        }
    
        public void onRunButtonClick(View view)
        {
          outputText.append("Started...\n");
          nativeCall();
          outputText.append("Finished!\n");
          
          // Ensure scroll to end of text
          scroller.post(new Runnable() {
            public void run() {
              scroller.fullScroll(ScrollView.FOCUS_DOWN);
            }
          });
        }
    
        /** Calls into C/C++ code */
        public void nativeCall()
        {
            // TODO
        }
    }
    

    The above simply adds a Run button and scrollable text view as the GUI aspects of the program. The associated resources need to be created, modify res/layout/main.xml as follows:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <Button
        android:id="@+id/RunButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Run..."  
        android:onClick="onRunButtonClick"
        />
    <ScrollView
        android:id="@+id/Scroller"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView
        android:id="@+id/OutputText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </ScrollView>
    </LinearLayout>
    

    Rebuild the project with your changes:

    $ ant debug
    

    Although there are no native function calls in the code, yet, you may want to check that this simple pure Java app runs before adding in the native calls. First, set up your Android device for hardware debugging, see Using hardware devices on the Android developer's site. When complete your device should be listed in those attached, something like:

    $ adb devices
    List of devices attached 
    A32-6DBE0001-9FF80000-015D62C3-02018028 device
    

    This means you are now ready to install the application...

    $ adb install bin/SwigSimple-debug.apk 
    95 KB/s (4834 bytes in 0.049s)
            pkg: /data/local/tmp/SwigSimple-debug.apk
    Success
    

    The newly installed 'SwigSimple' app will be amongst all your other applications on the home screen. Run the app and it will show a Run button text box below it. Press the Run button to see the simple text output.

    The application can be uninstalled like any other application and in fact must be uninstalled before installing an updated version. Uninstalling is quite easy too from your host computer:

    $ adb uninstall org.swig.simple
    Success
    

    Now that you have a pure Java Android app working, let's add some JNI code generated from SWIG.

    First create a jni subdirectory and then create some C source code in jni/example.c:

    /* File : example.c */
    
    /* A global variable */
    double Foo = 3.0;
    
    /* Compute the greatest common divisor of positive integers */
    int gcd(int x, int y) {
      int g;
      g = y;
      while (x > 0) {
        g = x;
        x = y % x;
        y = g;
      }
      return g;
    }
    

    Create a SWIG interface file for this C code, jni/example.i :

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}
    

    Invoke SWIG as follows:

    $ swig -java -package org.swig.simple -outdir src/org/swig/simple -o jni/example_wrap.c jni/example.i
    

    SWIG generates the following files:

    • src/org/swig/simple/exampleJNI.java
    • src/org/swig/simple/example.java
    • jni/example_wrap.c

    Next we need to create a standard Android NDK build system file jni/Android.mk:

    # File: Android.mk
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := example
    LOCAL_SRC_FILES := example_wrap.c example.c
    
    include $(BUILD_SHARED_LIBRARY)
    

    See the Android NDK documentation for more on the NDK build system and getting started with the NDK. A simple invocation of ndk-build will compile the .c files and generate a shared object/system library. Output will be similar to:

    $ ndk-build
    Compile thumb  : example <= example_wrap.c
    Compile thumb  : example <= example.c
    SharedLibrary  : libexample.so
    Install        : libexample.so => libs/armeabi/libexample.so
    

    Now that the C JNI layer has been built, we can write Java code to call into the this layer. Modify the nativeCall method in src/org/swig/simple/SwigSimple.java to call the JNI code as follows and add the static constructor to load the system library containing the compiled JNI C code:

        /** Calls into C/C++ code */
        public void nativeCall()
        {
          // Call our gcd() function
          
          int x = 42;
          int y = 105;
          int g = example.gcd(x, y);
          outputText.append("The greatest common divisor of " + x + " and " + y + " is " + g + "\n");
    
          // Manipulate the Foo global variable
    
          // Output its current value
          double foo = example.getFoo();
          outputText.append("Foo = " + foo + "\n");
    
          // Change its value
          example.setFoo(3.1415926);
    
          // See if the change took effect
          outputText.append("Foo = " + example.getFoo() + "\n");
    
          // Restore value
          example.setFoo(foo);
        }
    
        /** static constructor */
        static {
            System.loadLibrary("example");
        }
    

    Compile the Java code as usual, uninstall the old version of the app if still installed and re-install the new app:

    $ ant debug
    $ adb uninstall org.swig.simple
    $ adb install bin/SwigSimple-debug.apk 
    

    Run the app again and this time you will see the output pictured below, showing the result of calls into the C code:

    Android screenshot of SwigSimple example

    19.2.3 C++ class example

    The steps for calling C++ code are almost identical to those in the previous C code example. All the steps required to compile and use a simple hierarchy of classes for shapes are shown in this example.

    First create an Android project called SwigClass in a subdirectory called class. The steps below create and build a the JNI C++ app. Adjust the --target id as mentioned earlier in the Examples introduction.

    $ android create project --target 1 --name SwigClass --path ./class --activity SwigClass --package org.swig.classexample
    $ cd class
    

    Now create a jni subdirectory and then create a C++ header file jni/example.h which defines our hierarchy of shape classes:

    /* File : example.h */
    
    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;   
      void    move(double dx, double dy);
      virtual double area() = 0;
      virtual double perimeter() = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area();
      virtual double perimeter();
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area();
      virtual double perimeter();
    };
    

    and create the implementation in the jni/example.cpp file:

    /* File : example.cpp */
    
    #include "example.h"
    #define M_PI 3.14159265358979323846
    
    /* Move the shape to a new location */
    void Shape::move(double dx, double dy) {
      x += dx;
      y += dy;
    }
    
    int Shape::nshapes = 0;
    
    double Circle::area() {
      return M_PI*radius*radius;
    }
    
    double Circle::perimeter() {
      return 2*M_PI*radius;
    }
    
    double Square::area() {
      return width*width;
    }
    
    double Square::perimeter() {
      return 4*width;
    }
    

    Create a SWIG interface file for this C++ code in jni/example.i :

    /* File : example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Let's just grab the original header file here */
    %include "example.h"
    

    Invoke SWIG as follows, note that the -c++ option is required for C++ code:

    $ swig -c++ -java -package org.swig.classexample -outdir src/org/swig/classexample -o jni/example_wrap.cpp jni/example.i
    

    SWIG generates the following files:

    • src/org/swig/classexample/Square.java
    • src/org/swig/classexample/exampleJNI.java
    • src/org/swig/classexample/example.java
    • src/org/swig/classexample/Circle.java
    • src/org/swig/classexample/Shape.java
    • jni/example_wrap.cpp

    Next we need to create an Android NDK build system file for compiling the C++ code jni/Android.mk. The -frtti compiler flag isn't strictly needed for this example, but is needed for any code that uses C++ RTTI:

    # File: Android.mk
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := example
    LOCAL_SRC_FILES := example_wrap.cpp example.cpp
    LOCAL_CFLAGS    := -frtti
    
    include $(BUILD_SHARED_LIBRARY)
    

    A simple invocation of ndk-build will compile the .cpp files and generate a shared object/system library. Output will be similar to:

    $ ndk-build
    Compile++ thumb  : example <= example_wrap.cpp
    Compile++ thumb  : example <= example.cpp
    StaticLibrary  : libstdc++.a
    SharedLibrary  : libexample.so
    Install        : libexample.so => libs/armeabi/libexample.so
    

    Now that the C JNI layer has been built, we can write Java code to call into this layer. Modify src/org/swig/classexample/SwigClass.java from the default to:

    package org.swig.classexample;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.ScrollView;
    import android.text.method.ScrollingMovementMethod;
    
    public class SwigClass extends Activity
    {
        TextView outputText = null;
        ScrollView scroller = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            outputText = (TextView)findViewById(R.id.OutputText);
            outputText.setText("Press 'Run' to start...\n");
            outputText.setMovementMethod(new ScrollingMovementMethod());
    
            scroller = (ScrollView)findViewById(R.id.Scroller);
        }
    
        public void onRunButtonClick(View view)
        {
          outputText.append("Started...\n");
          nativeCall();
          outputText.append("Finished!\n");
          
          // Ensure scroll to end of text
          scroller.post(new Runnable() {
            public void run() {
              scroller.fullScroll(ScrollView.FOCUS_DOWN);
            }
          });
        }
    
        /** Calls into C/C++ code */
        public void nativeCall()
        {
          // ----- Object creation -----
    
          outputText.append( "Creating some objects:\n" );
          Circle c = new Circle(10);
          outputText.append( "    Created circle " + c + "\n");
          Square s = new Square(10);
          outputText.append( "    Created square " + s + "\n");
    
          // ----- Access a static member -----
    
          outputText.append( "\nA total of " + Shape.getNshapes() + " shapes were created\n" );
    
          // ----- Member data access -----
    
          // Notice how we can do this using functions specific to
          // the 'Circle' class.
          c.setX(20);
          c.setY(30);
    
          // Now use the same functions in the base class
          Shape shape = s;
          shape.setX(-10);
          shape.setY(5);
    
          outputText.append( "\nHere is their current position:\n" );
          outputText.append( "    Circle = (" + c.getX() + " " + c.getY() + ")\n" );
          outputText.append( "    Square = (" + s.getX() + " " + s.getY() + ")\n" );
    
          // ----- Call some methods -----
    
          outputText.append( "\nHere are some properties of the shapes:\n" );
          Shape[] shapes = {c, s};
          for (int i=0; i<shapes.length; i++)
          {
            outputText.append( "   " + shapes[i].toString() + "\n" );
            outputText.append( "        area      = " + shapes[i].area() + "\n" );
            outputText.append( "        perimeter = " + shapes[i].perimeter() + "\n" );
          }
    
          // Notice how the area() and perimeter() functions really
          // invoke the appropriate virtual method on each object.
    
          // ----- Delete everything -----
    
          outputText.append( "\nGuess I'll clean up now\n" );
    
          // Note: this invokes the virtual destructor
          // You could leave this to the garbage collector
          c.delete();
          s.delete();
    
          outputText.append( Shape.getNshapes() + " shapes remain\n" );
          outputText.append( "Goodbye\n" );
        }
    
        /** static constructor */
        static {
            System.loadLibrary("example");
        }
    }
    

    Note the static constructor and the interesting JNI code is in the nativeCall method. The remaining code deals with the GUI aspects which are identical to the previous C simple example. Modify res/layout/main.xml to contain the xml for the 'Run' button and scrollable text view:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <Button
        android:id="@+id/RunButton"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="Run..."  
        android:onClick="onRunButtonClick"
        />
    <ScrollView
        android:id="@+id/Scroller"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView
        android:id="@+id/OutputText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </ScrollView>
    </LinearLayout>
    

    Compile the Java code as usual, uninstall the old version of the app if installed and re-install the new app:

    $ ant debug
    $ adb uninstall org.swig.classexample
    $ adb install bin/SwigClass-debug.apk 
    

    Run the app to see the result of calling the C++ code from Java:

    Android screenshot of SwigClass example

    19.2.4 Other examples

    The Examples/android directory contains further examples which can be run and installed in a similar manner to the previous two examples.

    Note that the 'extend' example is demonstrates the directors feature. Normally C++ exception handling and the STL is not available by default in the version of g++ shipped with Android, but this example turns these features on as described in the next section.

    19.3 C++ STL

    Should the C++ Standard Template Library (STL) be required, an Application.mk file needs to be created in the same directory as the Android.mk directory containing information about the STL to use. See the NDK documentation in the $NDKROOT/docs folder especially CPLUSPLUS-SUPPORT.html. Below is an example of the Application.mk file to make the STLport static library available for use:

    # File: Application.mk
    APP_STL := gnustl_static
    

    20 SWIG and C#

    20.1 Introduction

    The purpose of the C# module is to offer an automated way of accessing existing C/C++ code from .NET languages. The wrapper code implementation uses C# and the Platform Invoke (PInvoke) interface to access natively compiled C/C++ code. The PInvoke interface has been chosen over Microsoft's Managed C++ interface as it is portable to both Microsoft Windows and non-Microsoft platforms. PInvoke is part of the ECMA/ISO C# specification. It is also better suited for robust production environments due to the Managed C++ flaw called the Mixed DLL Loading Problem. SWIG C# works equally well on non-Microsoft operating systems such as Linux, Solaris and Apple Mac using Mono and Portable.NET.

    To get the most out of this chapter an understanding of interop is required. The Microsoft Developer Network (MSDN) has a good reference guide in a section titled "Interop Marshaling". Monodoc, available from the Mono project, has a very useful section titled Interop with native libraries.

    20.1.1 SWIG 2 Compatibility

    In order to minimize name collisions between names generated based on input to SWIG and names used in the generated code from the .NET framework, SWIG 3 fully qualifies the use of all .NET types. Furthermore, SWIG 3 avoids using directives in generated code. This breaks backwards compatibility with typemaps, pragmas, etc written for use with SWIG 2 that assume the presence of using System; or using System.Runtime.InteropServices; directives in the intermediate class imports, module imports, or proxy imports. SWIG 3 supports backwards compatibility though the use of the SWIG2_CSHARP macro. If SWIG2_CSHARP is defined, SWIG 3 generates using directives in the intermediate class, module class, and proxy class code similar to those generated by SWIG 2. This can be done without modifying any of the input code by passing the -DSWIG2_CSHARP commandline parameter when executing swig.

    20.1.2 Additional command line options

    The following table lists the additional commandline options available for the C# module. They can also be seen by using:

    swig -csharp -help 
    
    C# specific options
    -dllimport <dl>Override DllImport attribute name to <dl>
    -namespace <nm>Generate wrappers into C# namespace <nm>
    -noproxyGenerate the low-level functional interface instead of proxy classes
    -oldvarnamesOld intermediary method names for variable wrappers
    -outfile <file>Write all C# into a single <file> located in the output directory

    The -outfile option combines all the generated C# code into a single output file instead of creating multiple C# files. The default, when this option is not provided, is to generate separate .cs files for the module class, intermediary class and each of the generated proxy and type wrapper classes. Note that the file extension (.cs) will not be automatically added and needs to be provided. Due to possible compiler limits it is not advisable to use -outfile for large projects.

    20.2 Differences to the Java module

    The C# module is very similar to the Java module, so until some more complete documentation has been written, please use the Java documentation as a guide to using SWIG with C#. The C# module has the same major SWIG features as the Java module. The rest of this section should be read in conjunction with the Java documentation as it lists the main differences. The most notable differences to Java are the following:

    • When invoking SWIG use the -csharp command line option instead of -java.
    • The -nopgcpp command line option does not exist.
    • The -package command line option does not exist.
    • The -namespace <name> commandline option will generate all code into the namespace specified by <name>. C# supports nested namespaces that are not lexically nested, so nested namespaces will of course also work. For example: -namespace com.bloggs.widget , will generate code into C# namespaces:
      namespace com.bloggs.widget {
        ...
      }
      
      Note that by default, the generated C# classes have no namespace and the module name is unrelated to namespaces. The module name is just like in Java and is merely used to name some of the generated classes.
    • The nspace feature is also supported as described in this general section with a C# example. Unlike Java which requires the use of the -package option when using the nspace feature, the -namespace option is not mandatory for C#.
    • The -dllimport <name> commandline option specifies the name of the DLL for the DllImport attribute for every PInvoke method. If this commandline option is not given, the DllImport DLL name is the same as the module name. This option is useful for when one wants to invoke SWIG multiple times on different modules, yet compile all the resulting code into a single DLL.
    • C/C++ variables are wrapped with C# properties and not JavaBean style getters and setters.
    • Global constants are generated into the module class. There is no constants interface.
    • There is no implementation for type unsafe enums - not deemed necessary.
    • The default enum wrapping approach is proper C# enums, not typesafe enums.
      Note that %csconst(0) will be ignored when wrapping C/C++ enums with proper C# enums. This is because C# enum items must be initialised from a compile time constant. If an enum item has an initialiser and the initialiser doesn't compile as C# code, then the %csconstvalue directive must be used as %csconst(0) will have no effect. If it was used, it would generate an illegal runtime initialisation via a PInvoke call.
    • C# doesn't support the notion of throws clauses. Therefore there is no 'throws' typemap attribute support for adding exception classes to a throws clause. Likewise there is no need for an equivalent to %javaexception. In fact, throwing C# exceptions works quite differently, see C# Exceptions below.
    • The majority of the typemaps are in csharp.swg, not java.swg.
    • Typemap equivalent names:

      jni                         -> ctype
      jtype                       -> imtype
      jstype                      -> cstype
      javain                      -> csin
      javaout                     -> csout
      javadirectorin              -> csdirectorin
      javadirectorout             -> csdirectorout
      javainterfaces              -> csinterfaces and csinterfaces_derived
      javabase                    -> csbase
      javaclassmodifiers          -> csclassmodifiers
      javacode                    -> cscode
      javaimports                 -> csimports
      javabody                    -> csbody
      javafinalize                -> csfinalize
      javadestruct                -> csdestruct
      javadestruct_derived        -> csdestruct_derived
      javainterfacecode           -> csinterfacecode
      
    • Typemap macros:

      SWIG_JAVABODY_PROXY         -> SWIG_CSBODY_PROXY
      SWIG_JAVABODY_TYPEWRAPPER   -> SWIG_CSBODY_TYPEWRAPPER
      
    • Additional typemaps:

      csvarin                     C# code property set typemap
      csvarout                    C# code property get typemap
      csattributes                C# attributes for attaching to proxy classes/enums
      
    • Additional typemap attributes:

      The "null" attribute in the "out" typemap can be specified to provide a value for $null to expand into for wrapped functions that return non-void. Normally the default value of 0 is used. For example this is needed if you change the return type to void:

      %typemap(ctype) Status "void"
      %typemap(out, null="") Status { ... }
      
    • Feature equivalent names:

      %javaconst                  -> %csconst
      %javaconstvalue             -> %csconstvalue
      %javamethodmodifiers        -> %csmethodmodifiers
      
    • Pragma equivalent names:

      %pragma(java)               -> %pragma(csharp)
      jniclassbase                -> imclassbase
      jniclassclassmodifiers      -> imclassclassmodifiers
      jniclasscode                -> imclasscode
      jniclassimports             -> imclassimports
      jniclassinterfaces          -> imclassinterfaces
      
    • Special variable equivalent names:

      $javaclassname              -> $csclassname
      $&javaclassname             -> $&csclassname
      $*javaclassname             -> $*csclassname
      $javaclazzname              -> $csclazzname
      $javainput                  -> $csinput
      $jnicall                    -> $imcall
      $javainterfacename          -> $csinterfacename
      $&javainterfacename         -> $&csinterfacename
      $*javainterfacename         -> $*csinterfacename
      
    • Unlike the "javain" typemap, the "csin" typemap does not support the 'pgcpp' attribute as the C# module does not have a premature garbage collection prevention parameter. The "csin" typemap supports additional optional attributes called 'cshin' and 'terminator'. The "csdirectorin" typemap supports additional optional attributes called 'terminator'. The 'cshin' attribute should contain the parameter type and name whenever a constructor helper function is generated due to the 'pre' or 'post' attributes. The 'terminator' attribute normally just contains a closing brace for when the 'pre' attribute contains an opening brace, such as when a C# using or fixed block is started. Note that 'pre', 'post', 'terminator' and 'cshin' attributes are not used for marshalling the property set. Please see the Date marshalling example and Date marshalling of properties example for further understanding of these "csin" applicable attributes. Please see the Date marshalling director example for further understanding of the "csdirectorin" attributes.

    • Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional out attribute which is used for output types. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap. An example shows that char * could be marshalled in different ways,

      %typemap(imtype, out="global::System.IntPtr") char * "string"
      char * function(char *);
      

      The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is:

      public static extern global::System.IntPtr function(string jarg1);
      
    • Support for type attributes. The 'imtype' and 'cstype' typemaps can have an optional inattributes and outattributes typemap attribute. The 'imtype' typemap can also have an optional directorinattributes and directoroutattributes typemap attribute which attaches to director delegates, an implementation detail of directors, see directors implementation. Note that there are C# attributes and typemap attributes, don't get confused between the two!! The C# attributes specified in these typemap attributes are generated wherever the type is used in the C# wrappers. These can be used to specify any C# attribute associated with a C/C++ type, but are more typically used for the C# MarshalAs attribute. For example:

      %typemap(imtype,
               inattributes="[global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]",
               outattributes="[return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]") const char * "String"
      
      const char * GetMsg() {}
      void SetMsg(const char *msg) {}
      

      The intermediary class will then have the marshalling as specified by everything in the 'imtype' typemap:

      class examplePINVOKE {
        ...
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_GetMsg")]
        [return: global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]
        public static extern String GetMsg();
      
        [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_SetMsg")]
        public static extern void SetMsg([global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPStr)]String jarg1);
      }
      

      Note that the DllImport attribute is always generated, irrespective of any additional attributes specified.

      These attributes are associated with the C/C++ parameter type or return type, which is subtly different to the attribute features and typemaps covered next. Note that all these different C# attributes can be combined so that a method has more than one attribute.

      The directorinattributes and directoroutattributes typemap attribute are attached to the delegates in the director class, for example, the SwigDelegateBase_0

    • Support for attaching C# attributes to wrapped methods, variables and enum values. This is done using the %csattributes feature, see %feature directives. Note that C# attributes are attached to proxy classes and enums using the csattributes typemap. For example, imagine we have a custom attribute class, ThreadSafeAttribute, for labelling thread safety. The following SWIG code shows how to attach this C# attribute to some methods and the class declaration itself:

      %typemap(csattributes) AClass          "[ThreadSafe]"
      %csattributes AClass::AClass(double d) "[ThreadSafe(false)]"
      %csattributes AClass::AMethod()        "[ThreadSafe(true)]"
      
      %inline %{
      class AClass {
      public:
        AClass(double a) {}
        void AMethod() {}
      };
      %}
      

      will generate a C# proxy class:

      [ThreadSafe]
      public class AClass : global::System.IDisposable {
        ...
        [ThreadSafe(false)]
        public AClass(double a) ...
      
        [ThreadSafe(true)]
        public void AMethod() ...
      }
      

      If C# attributes need adding to the set or get part of C# properties, when wrapping C/C++ variables, they can be added using the 'csvarin' and 'csvarout' typemaps respectively. Note that the type used for the property is specified in the 'cstype' typemap. If the 'out' attribute exists in this typemap, then the type used is from the 'out' attribute.

      An example for attaching attributes to the enum and enum values is shown below.

      %typemap(csattributes) Couleur "[global::System.ComponentModel.Description(\"Colours\")]"
      %csattributes Rouge "[global::System.ComponentModel.Description(\"Red\")]"
      %csattributes Vert "[global::System.ComponentModel.Description(\"Green\")]"
      %inline %{
        enum Couleur { Rouge, Orange, Vert };
      %}
      

      which will result in the following C# enum:

      [global::System.ComponentModel.Description("Colours")]
      public enum Couleur {
        [global::System.ComponentModel.Description("Red")]
        Rouge,
        Orange,
        [global::System.ComponentModel.Description("Green")]
        Vert
      }
      
    • The intermediary classname has PINVOKE appended after the module name instead of JNI, for example modulenamePINVOKE .

    • The %csmethodmodifiers feature can also be applied to variables as well as methods. In addition to the default public modifier that SWIG generates when %csmethodmodifiers is not specified, the feature will also replace the virtual/new /override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the virtual/new/override modifiers incorrect, for example with multiple inheritance.

    • The name of the intermediary class can be changed from its default, that is, the module name with PINVOKE appended after it. The module directive attribute imclassname is used to achieve this:

      %module (imclassname="name") modulename
      

      If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    • There is no additional 'premature garbage collection prevention parameter' as the marshalling of the HandleRef object takes care of ensuring a reference to the proxy class is held until the unmanaged call completed.

    $dllimport
    This is a C# only special variable that can be used in typemaps, pragmas, features etc. The special variable will get translated into the value specified by the -dllimport commandline option if specified, otherwise it is equivalent to the $module special variable.

    $imclassname
    This special variable expands to the intermediary class name. For C# this is usually the same as '$modulePINVOKE' ('$moduleJNI' for Java), unless the imclassname attribute is specified in the %module directive.

    The directory Examples/csharp has a number of simple examples. Visual Studio .NET 2003 solution and project files are available for compiling with the Microsoft .NET C# compiler on Windows. This also works with newer versions of Visual Studio if you allow it to convert the solution to the latest version. If your SWIG installation went well on a Unix environment and your C# compiler was detected, you should be able to type make in each example directory. After SWIG has run and both the C# and C/C++ compilers have finished building, the examples will be run, by either running runme.exe or by running mono runme.exe (Mono C# compiler). Windows users can also get the examples working using a Cygwin or MinGW environment for automatic configuration of the example makefiles. Any one of the C# compilers (Mono or Microsoft) can be detected from within a Cygwin or Mingw environment if installed in your path.

    20.3 Void pointers

    By default SWIG treats void * as any other pointer and hence marshalls it as a type wrapper class called SWIGTYPE_p_void . If you want to marshall with the .NET System.IntPtr type instead, there is a simple set of named typemaps called void *VOID_INT_PTR that can be used. They can be applied like any other named typemaps:

    %apply void *VOID_INT_PTR { void * }
    void * f(void *v);
    

    20.4 C# Arrays

    There are various ways to pass arrays from C# to C/C++. The default wrapping treats arrays as pointers and as such simple type wrapper classes are generated, eg SWIGTYPE_p_int when wrapping the C type int [] or int *. This gives a rather restricted use of the underlying unmanaged code and the most practical way to use arrays is to enhance or customise with one of the following three approaches; namely the SWIG C arrays library, P/Invoke default array marshalling or pinned arrays.

    20.4.1 The SWIG C arrays library

    The C arrays library keeps all the array memory in the unmanaged layer. The library is available to all language modules and is documented in the carrays.i library section. Please refer to this section for details, but for convenience, the C# usage for the two examples outlined there is shown below.

    For the %array_functions example, the equivalent usage would be:

    SWIGTYPE_p_double a = example.new_doubleArray(10);  // Create an array
    for (int i=0; i<10; i++)
      example.doubleArray_setitem(a, i, 2*i);           // Set a value
    example.print_array(a);                             // Pass to C
    example.delete_doubleArray(a);                      // Destroy array
    

    and for the %array_class example, the equivalent usage would be:

    doubleArray c = new doubleArray(10);    // Create double[10]
    for (int i=0; i<10; i++)
      c.setitem(i, 2*i);                    // Assign values
    example.print_array(c.cast());          // Pass to C
    

    20.4.2 Managed arrays using P/Invoke default array marshalling

    In the P/Invoke default marshalling scheme, one needs to designate whether the invoked function will treat a managed array parameter as input, output, or both. When the function is invoked, the CLR allocates a separate chunk of memory as big as the given managed array, which is automatically released at the end of the function call. If the array parameter is marked as being input, the content of the managed array is copied into this buffer when the call is made. Correspondingly, if the array parameter is marked as being output, the contents of the reserved buffer are copied back into the managed array after the call returns. A pointer to this buffer is passed to the native function.

    The reason for allocating a separate buffer is to leave the CLR free to relocate the managed array object during garbage collection. If the overhead caused by the copying is causing a significant performance penalty, consider pinning the managed array and passing a direct reference as described in the next section.

    For more information on the subject, see the Default Marshaling for Arrays article on MSDN.

    The P/Invoke default marshalling is supported by the arrays_csharp.i library via the INPUT, OUTPUT and INOUT typemaps. Let's look at some example usage. Consider the following C function:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We can now instruct SWIG to use the default marshalling typemaps by

    %include "arrays_csharp.i"
    
    %apply int INPUT[]  {int *sourceArray}
    %apply int OUTPUT[] {int *targetArray}
    

    As a result, we get the following method in the module class:

    public static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        examplePINVOKE.myArrayCopy(sourceArray, targetArray, nitems);
    }
    

    If we look beneath the surface at the corresponding intermediary class code, we see that SWIG has generated code that uses attributes (from the System.Runtime.InteropServices namespace) to tell the CLR to use default marshalling for the arrays:

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                          [global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                           int jarg3);
    

    As an example of passing an inout array (i.e. the target function will both read from and write to the array), consider this C function that swaps a given number of elements in the given arrays:

    void myArraySwap(int *array1, int *array2, int nitems);
    

    Now, we can instruct SWIG to wrap this by

    %include "arrays_csharp.i"
    
    %apply int INOUT[] {int *array1}
    %apply int INOUT[] {int *array2}
    

    This results in the module class method

      public static void myArraySwap(int[] array1, int[] array2, int nitems) {
        examplePINVOKE.myArraySwap(array1, array2, nitems);
      }
    

    and intermediary class method

      [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArraySwap")]
      public static extern void myArraySwap([global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg1, 
                                            [global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(UnmanagedType.LPArray)]int[] jarg2,
                                             int jarg3);
    

    20.4.3 Managed arrays using pinning

    It is also possible to pin a given array in memory (i.e. fix its location in memory), obtain a direct pointer to it, and then pass this pointer to the wrapped C/C++ function. This approach involves no copying, but it makes the work of the garbage collector harder as the managed array object can not be relocated before the fix on the array is released. You should avoid fixing arrays in memory in cases where the control may re-enter the managed side via a callback and/or another thread may produce enough garbage to trigger garbage collection.

    For more information, see the fixed statement in the C# language reference.

    Now let's look at an example using pinning, thus avoiding the CLR making copies of the arrays passed as parameters. The arrays_csharp.i library file again provides the required support via the FIXED typemaps. Let's use the same function from the previous section:

    void myArrayCopy(int *sourceArray, int *targetArray, int nitems);
    

    We now need to declare the module class method unsafe, as we are using pointers:

    %csmethodmodifiers myArrayCopy "public unsafe";
     

    Apply the appropriate typemaps to the array parameters:

    %include "arrays_csharp.i"
    
    %apply int FIXED[] {int *sourceArray}
    %apply int FIXED[] {int *targetArray}
    

    Notice that there is no need for separate in, out or inout typemaps as is the case when using P/Invoke default marshalling.

    As a result, we get the following method in the module class:

      public unsafe static void myArrayCopy(int[] sourceArray, int[] targetArray, int nitems) {
        fixed ( int *swig_ptrTo_sourceArray = sourceArray ) {
        fixed ( int *swig_ptrTo_targetArray = targetArray ) {
        {
          examplePINVOKE.myArrayCopy((global::System.IntPtr)swig_ptrTo_sourceArray, (global::System.IntPtr)swig_ptrTo_targetArray,
                                     nitems);
        }
        }
        }
      }
    

    On the method signature level the only difference to the version using P/Invoke default marshalling is the "unsafe" quantifier, which is required because we are handling pointers.

    Also the intermediary class method looks a little different from the default marshalling example - the method is expecting an IntPtr as the parameter type.

    [global::System.Runtime.InteropServices.DllImport("example", EntryPoint="CSharp_myArrayCopy")]
    public static extern void myArrayCopy(global::System.IntPtr jarg1, global::System.IntPtr jarg2, int jarg3);
    

    20.5 C# Exceptions

    It is possible to throw a C# Exception from C/C++ code. SWIG already provides the framework for throwing C# exceptions if it is able to detect that a C++ exception could be thrown. Automatically detecting that a C++ exception could be thrown is only possible when a C++ exception specification is used, see Exception specifications. The Exception handling with %exception section details the %exception feature. Customised code for handling exceptions with or without a C++ exception specification is possible and the details follow. However anyone wishing to do this should be familiar with the contents of the sections referred to above.

    Unfortunately a C# exception cannot simply be thrown from unmanaged code for a variety of reasons. Most notably being that throwing a C# exception results in exceptions being thrown across the C PInvoke interface and C does not understand exceptions. The design revolves around a C# exception being constructed and stored as a pending exception, to be thrown only when the unmanaged code has completed. Implementing this is a tad involved and there are thus some unusual typemap constructs. Some practical examples follow and they should be read in conjunction with the rest of this section.

    First some details about the design that must be followed. Each typemap or feature that generates unmanaged code supports an attribute called canthrow. This is simply a flag which when set indicates that the code in the typemap/feature has code which might want to throw a C# exception. The code in the typemap/feature can then raise a C# exception by calling one of the C functions, SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument(). When called, the function makes a callback into the managed world via a delegate. The callback creates and stores an exception ready for throwing when the unmanaged code has finished. The typemap/feature unmanaged code is then expected to force an immediate return from the unmanaged wrapper function, so that the pending managed exception can then be thrown. The support code has been carefully designed to be efficient as well as thread-safe. However to achieve the goal of efficiency requires some optional code generation in the managed code typemaps. Code to check for pending exceptions is generated if and only if the unmanaged code has code to set a pending exception, that is if the canthrow attribute is set. The optional managed code is generated using the excode typemap attribute and $excode special variable in the relevant managed code typemaps. Simply, if any relevant unmanaged code has the canthrow attribute set, then any occurrences of $excode is replaced with the code in the excode attribute. If the canthrow attribute is not set, then any occurrences of $excode are replaced with nothing.

    The prototypes for the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() functions are

    static void SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code,
                                               const char *msg);
    
    static void SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code,
                                                       const char *msg,
                                                       const char *param_name);
    

    The first parameter defines which .NET exceptions can be thrown:

    typedef enum {
      SWIG_CSharpApplicationException,
      SWIG_CSharpArithmeticException,
      SWIG_CSharpDivideByZeroException,
      SWIG_CSharpIndexOutOfRangeException,
      SWIG_CSharpInvalidCastException,
      SWIG_CSharpInvalidOperationException,
      SWIG_CSharpIOException,
      SWIG_CSharpNullReferenceException,
      SWIG_CSharpOutOfMemoryException,
      SWIG_CSharpOverflowException,
      SWIG_CSharpSystemException
    } SWIG_CSharpExceptionCodes;
    
    typedef enum {
      SWIG_CSharpArgumentException,
      SWIG_CSharpArgumentNullException,
      SWIG_CSharpArgumentOutOfRangeException,
    } SWIG_CSharpExceptionArgumentCodes;
    

    where, for example, SWIG_CSharpApplicationException corresponds to the .NET exception, ApplicationException. The msg and param_name parameters contain the C# exception message and parameter name associated with the exception.

    The %exception feature in C# has the canthrow attribute set. The %csnothrowexception feature is like %exception, but it does not have the canthrow attribute set so should only be used when a C# exception is not created.

    20.5.1 C# exception example using "check" typemap

    Let's say we have the following simple C++ method:

    void positivesonly(int number);
    

    and we want to check that the input number is always positive and if not throw a C# ArgumentOutOfRangeException. The "check" typemap is designed for checking input parameters. Below you will see the canthrow attribute is set because the code contains a call to SWIG_CSharpSetPendingExceptionArgument(). The full example follows:

    %module example
    
    %typemap(check, canthrow=1) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    // SWIGEXCODE is a macro used by many other csout typemaps
    %define SWIGEXCODE
     "\n    if ($modulePINVOKE.SWIGPendingException.Pending)"
     "\n      throw $modulePINVOKE.SWIGPendingException.Retrieve();"
    %enddef
    %typemap(csout, excode=SWIGEXCODE) void {
        $imcall;$excode
      }
    %}
    
    %inline %{
    
    void positivesonly(int number) {
    }
    
    %}
    

    When the following C# code is executed:

    public class runme {
        static void Main() {
          example.positivesonly(-1);
        }
    }
    

    The exception is thrown:

    Unhandled Exception: System.ArgumentOutOfRangeException: only positive numbers accepted
    Parameter name: number
    in <0x00034> example:positivesonly (int)
    in <0x0000c> runme:Main ()
    

    Now let's analyse the generated code to gain a fuller understanding of the typemaps. The generated unmanaged C++ code is:

    SWIGEXPORT void SWIGSTDCALL CSharp_positivesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      if (arg1 < 0) {
        SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
          "only positive numbers accepted", "number");
        return ;
      }
    
      positivesonly(arg1);
    
    }
    

    This largely comes from the "check" typemap. The managed code in the module class is:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
    }
    

    This comes largely from the "csout" typemap.

    The "csout" typemap is the same as the default void "csout" typemap so is not strictly necessary for the example. However, it is shown to demonstrate what managed output code typemaps should contain, that is, a $excode special variable and an excode attribute. Also note that $excode is expanded into the code held in the excode attribute. The $imcall as always expands into examplePINVOKE.positivesonly(number). The exception support code in the intermediary class, examplePINVOKE, is not shown, but is contained within the inner classes, SWIGPendingException and SWIGExceptionHelper and is always generated. These classes can be seen in any of the generated wrappers. However, all that is required of a user is as demonstrated in the "csin" typemap above. That is, is to check SWIGPendingException.Pending and to throw the exception returned by SWIGPendingException.Retrieve().

    If the "check" typemap did not exist, then the following module class would instead be generated:

    public class example {
      public static void positivesonly(int number) {
        examplePINVOKE.positivesonly(number);
      }
    
    }
    

    Here we see the pending exception checking code is omitted. In fact, the code above would be generated if the canthrow attribute was not in the "check" typemap, such as:

    %typemap(check) int number %{
    if ($1 < 0) {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException,
                                             "only positive numbers accepted", "number");
      return $null;
    }
    %}
    

    Note that if SWIG detects you have used SWIG_CSharpSetPendingException() or SWIG_CSharpSetPendingExceptionArgument() without setting the canthrow attribute you will get a warning message similar to

    example.i:21: Warning 845: Unmanaged code contains a call to a SWIG_CSharpSetPendingException
    method and C# code does not handle pending exceptions via the canthrow attribute.
    

    Actually it will issue this warning for any function beginning with SWIG_CSharpSetPendingException.

    20.5.2 C# exception example using %exception

    Let's consider a similar, but more common example that throws a C++ exception from within a wrapped function. We can use %exception as mentioned in Exception handling with %exception.

    %exception negativesonly(int value) %{
    try {
      $action
    } catch (std::out_of_range e) {
      SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
      return $null;
    }
    %}
    
    %inline %{
    #include <stdexcept>
    void negativesonly(int value) {
      if (value >= 0)
        throw std::out_of_range("number should be negative");
    }
    %}
    

    The generated unmanaged code this time catches the C++ exception and converts it into a C# ApplicationException.

    SWIGEXPORT void SWIGSTDCALL CSharp_negativesonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
    
      try {
        negativesonly(arg1);
    
      } catch (std::out_of_range e) {
        SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, e.what());
        return ;
      }
    }
    

    The managed code generated does check for the pending exception as mentioned earlier as the C# version of %exception has the canthrow attribute set by default:

      public static void negativesonly(int value) {
        examplePINVOKE.negativesonly(value);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    

    20.5.3 C# exception example using exception specifications

    When C++ exception specifications are used, SWIG is able to detect that the method might throw an exception. By default SWIG will automatically generate code to catch the exception and convert it into a managed ApplicationException, as defined by the default "throws" typemaps. The following example has a user supplied "throws" typemap which is used whenever an exception specification contains a std::out_of_range, such as the evensonly method below.

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), NULL);
      return $null;
    }
    
    %inline %{
    #include <stdexcept>
    void evensonly(int input) throw (std::out_of_range) {
      if (input%2 != 0)
        throw std::out_of_range("number is not even");
    }
    %}
    

    Note that the type for the throws typemap is the type in the exception specification. SWIG generates a try catch block with the throws typemap code in the catch handler.

    SWIGEXPORT void SWIGSTDCALL CSharp_evensonly(int jarg1) {
      int arg1 ;
    
      arg1 = (int)jarg1;
      try {
        evensonly(arg1);
      }
      catch(std::out_of_range &_e) {
        {
          SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, (&_e)->what(), NULL);
          return ;
        }
      }
    }
    

    Multiple catch handlers are generated should there be more than one exception specifications declared.

    20.5.4 Custom C# ApplicationException example

    This example involves a user defined exception. The conventional .NET exception handling approach is to create a custom ApplicationException and throw it in your application. The goal in this example is to convert the STL std::out_of_range exception into one of these custom .NET exceptions.

    The default exception handling is quite easy to use as the SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() methods are provided by SWIG. However, for a custom C# exception, the boiler plate code that supports these functions needs replicating. In essence this consists of some C/C++ code and C# code. The C/C++ code can be generated into the wrapper file using the %insert(runtime) directive and the C# code can be generated into the intermediary class using the imclasscode pragma as follows:

    %insert(runtime) %{
      // Code to handle throwing of C# CustomApplicationException from C/C++ code.
      // The equivalent delegate to the callback, CSharpExceptionCallback_t, is CustomExceptionDelegate
      // and the equivalent customExceptionCallback instance is customDelegate
      typedef void (SWIGSTDCALL* CSharpExceptionCallback_t)(const char *);
      CSharpExceptionCallback_t customExceptionCallback = NULL;
    
      extern "C" SWIGEXPORT
      void SWIGSTDCALL CustomExceptionRegisterCallback(CSharpExceptionCallback_t customCallback) {
        customExceptionCallback = customCallback;
      }
    
      // Note that SWIG detects any method calls named starting with
      // SWIG_CSharpSetPendingException for warning 845
      static void SWIG_CSharpSetPendingExceptionCustom(const char *msg) {
        customExceptionCallback(msg);
      }
    %}
    
    %pragma(csharp) imclasscode=%{
      class CustomExceptionHelper {
        // C# delegate for the C/C++ customExceptionCallback
        public delegate void CustomExceptionDelegate(string message);
        static CustomExceptionDelegate customDelegate =
                                       new CustomExceptionDelegate(SetPendingCustomException);
    
        [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="CustomExceptionRegisterCallback")]
        public static extern
               void CustomExceptionRegisterCallback(CustomExceptionDelegate customCallback);
    
        static void SetPendingCustomException(string message) {
          SWIGPendingException.Set(new CustomApplicationException(message));
        }
    
        static CustomExceptionHelper() {
          CustomExceptionRegisterCallback(customDelegate);
        }
      }
      static CustomExceptionHelper exceptionHelper = new CustomExceptionHelper();
    %}
    

    The method stored in the C# delegate instance, customDelegate is what gets called by the C/C++ callback. However, the equivalent to the C# delegate, that is the C/C++ callback, needs to be assigned before any unmanaged code is executed. This is achieved by putting the initialisation code in the intermediary class. Recall that the intermediary class contains all the PInvoke methods, so the static variables in the intermediary class will be initialised before any of the PInvoke methods in this class are called. The exceptionHelper static variable ensures the C/C++ callback is initialised with the value in customDelegate by calling the CustomExceptionRegisterCallback method in the CustomExceptionHelper static constructor. Once this has been done, unmanaged code can make callbacks into the managed world as customExceptionCallback will be initialised with a valid callback/delegate. Any calls to SWIG_CSharpSetPendingExceptionCustom() will make the callback to create the pending exception in the same way that SWIG_CSharpSetPendingException() and SWIG_CSharpSetPendingExceptionArgument() does. In fact the method has been similarly named so that SWIG can issue the warning about missing canthrow attributes as discussed earlier. It is an invaluable warning as it is easy to forget the canthrow attribute when writing typemaps/features.

    The SWIGPendingException helper class is not shown, but is generated as an inner class into the intermediary class. It stores the pending exception in Thread Local Storage so that the exception handling mechanism is thread safe.

    The boiler plate code above must be used in addition to a handcrafted CustomApplicationException:

    // Custom C# Exception
    class CustomApplicationException : global::System.ApplicationException {
      public CustomApplicationException(string message) 
        : base(message) {
      }
    }
    

    and the SWIG interface code:

    %typemap(throws, canthrow=1) std::out_of_range {
      SWIG_CSharpSetPendingExceptionCustom($1.what());
      return $null;
    }
    
    %inline %{
    void oddsonly(int input) throw (std::out_of_range) {
      if (input%2 != 1)
        throw std::out_of_range("number is not odd");
    }
    %}
    

    The "throws" typemap now simply calls our new SWIG_CSharpSetPendingExceptionCustom() function so that the exception can be caught, as such:

    try {
      example.oddsonly(2);
    } catch (CustomApplicationException e) {
      ...
    }
    

    20.6 C# Directors

    The SWIG directors feature adds extra code to the generated C# proxy classes that enable these classes to be used in cross-language polymorphism. Essentially, it enables unmanaged C++ code to call back into managed code for virtual methods so that a C# class can derive from a wrapped C++ class.

    The following sections provide information on the C# director implementation and contain most of the information required to use the C# directors. However, the Java directors section should also be read in order to gain more insight into directors.

    20.6.1 Directors example

    Imagine we are wrapping a C++ base class, Base, from which we would like to inherit in C#. Such a class is shown below as well as another class, Caller, which calls the virtual method UIntMethod from pure unmanaged C++ code.

    // file: example.h
    class Base {
    public:
      virtual ~Base() {}
    
      virtual unsigned int UIntMethod(unsigned int x) {
        std::cout << "Base - UIntMethod(" << x << ")" << std::endl;
        return x;
      }
      virtual void BaseBoolMethod(const Base &b, bool flag) {}
    };
    
    class Caller {
    public:
      Caller(): m_base(0) {}
      ~Caller() { delBase(); }
      void set(Base *b) { delBase(); m_base = b; }
      void reset() { m_base = 0; }
      unsigned int UIntMethodCall(unsigned int x) { return m_base->UIntMethod(x); }
    
    private:
      Base *m_base;
      void delBase() { delete m_base; m_base = 0; }
    };
    

    The director feature is turned off by default and the following simple interface file shows how directors are enabled for the class Base.

    /* File : example.i */
    %module(directors="1") example
    %{
    #include "example.h"
    %}
    
    %feature("director") Base;
    
    %include "example.h"
    

    The following is a C# class inheriting from Base:

    public class CSharpDerived : Base
    {
      public override uint UIntMethod(uint x)
      {
        Console.WriteLine("CSharpDerived - UIntMethod({0})", x);
        return x;
      }
    }
    

    The Caller class can demonstrate the UIntMethod method being called from unmanaged code using the following C# code:

    public class runme
    {
      static void Main() 
      {
        Caller myCaller = new Caller();
    
        // Test pure C++ class
        using (Base myBase = new Base())
        {
          makeCalls(myCaller, myBase);
        }
    
        // Test director / C# derived class
        using (Base myBase = new CSharpDerived())
        {
          makeCalls(myCaller, myBase);
        }
      }
    
      static void makeCalls(Caller myCaller, Base myBase)
      {
        myCaller.set(myBase);
        myCaller.UIntMethodCall(123);
        myCaller.reset();
      }
    }
    

    If the above is run, the output is then:

    Base - UIntMethod(123)
    CSharpDerived - UIntMethod(123)
    

    20.6.2 Directors implementation

    The previous section demonstrated a simple example where the virtual UIntMethod method was called from C++ code, even when the overridden method is implemented in C#. The intention of this section is to gain an insight into how the director feature works. It shows the generated code for the two virtual methods, UIntMethod and BaseBoolMethod, when the director feature is enabled for the Base class.

    Below is the generated C# Base director class.

    public class Base : global::System.IDisposable {
      private global::System.Runtime.InteropServices.HandleRef swigCPtr;
      protected bool swigCMemOwn;
    
      internal Base(global::System.IntPtr cPtr, bool cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
      }
    
      internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Base obj) {
        return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
      }
    
      ~Base() {
        Dispose();
      }
    
      public virtual void Dispose() {
        lock(this) {
          if(swigCPtr.Handle != global::System.IntPtr.Zero && swigCMemOwn) {
            swigCMemOwn = false;
            examplePINVOKE.delete_Base(swigCPtr);
          }
          swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
          global::System.GC.SuppressFinalize(this);
        }
      }
    
      public virtual uint UIntMethod(uint x) {
        uint ret = examplePINVOKE.Base_UIntMethod(swigCPtr, x);
        return ret;
      }
    
      public virtual void BaseBoolMethod(Base b, bool flag) {
        examplePINVOKE.Base_BaseBoolMethod(swigCPtr, Base.getCPtr(b), flag);
        if (examplePINVOKE.SWIGPendingException.Pending)
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public Base() : this(examplePINVOKE.new_Base(), true) {
        SwigDirectorConnect();
      }
    
      private void SwigDirectorConnect() {
        if (SwigDerivedClassHasMethod("UIntMethod", swigMethodTypes0))
          swigDelegate0 = new SwigDelegateBase_0(SwigDirectorUIntMethod);
        if (SwigDerivedClassHasMethod("BaseBoolMethod", swigMethodTypes1))
          swigDelegate1 = new SwigDelegateBase_1(SwigDirectorBaseBoolMethod);
        examplePINVOKE.Base_director_connect(swigCPtr, swigDelegate0, swigDelegate1);
      }
    
      private bool SwigDerivedClassHasMethod(string methodName, global::System.global::System.Type[] methodTypes) {
        System.Reflection.MethodInfo methodInfo = this.GetType().GetMethod(methodName, methodTypes);
        bool hasDerivedMethod = methodInfo.DeclaringType.IsSubclassOf(typeof(Base));
        return hasDerivedMethod;
      }
    
      private uint SwigDirectorUIntMethod(uint x) {
        return UIntMethod(x);
      }
    
      private void SwigDirectorBaseBoolMethod(global::System.IntPtr b, bool flag) {
        BaseBoolMethod(new Base(b, false), flag);
      }
    
      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    
      private SwigDelegateBase_0 swigDelegate0;
      private SwigDelegateBase_1 swigDelegate1;
    
      private static global::System.Type[] swigMethodTypes0 = new global::System.Type[] { typeof(uint) };
      private static global::System.Type[] swigMethodTypes1 = new global::System.Type[] { typeof(Base), typeof(bool) };
    }
    

    Everything from the SwigDirectorConnect() method and below is code that is only generated when directors are enabled. The design comprises a C# delegate being initialised for each virtual method on construction of the class. Let's examine the BaseBoolMethod.

    In the Base constructor a call is made to SwigDirectorConnect() which contains the initialisation code for all the virtual methods. It uses a support method, SwigDerivedClassHasMethod(), which simply uses reflection to determine if the named method, BaseBoolMethod, with the list of required parameter types, exists in a subclass. If it does not exist, the delegate is not initialised as there is no need for unmanaged code to call back into managed C# code. However, if there is an overridden method in any subclass, the delegate is required. It is then initialised to the SwigDirectorBaseBoolMethod which in turn will call BaseBoolMethod if invoked. The delegate is not initialised to the BaseBoolMethod directly as quite often types will need marshalling from the unmanaged type to the managed type in which case an intermediary method (SwigDirectorBaseBoolMethod ) is required for the marshalling. In this case, the C# Base class needs to be created from the unmanaged IntPtr type.

    The last thing that SwigDirectorConnect() does is to pass the delegates to the unmanaged code. It calls the intermediary method Base_director_connect() which is really a call to the C function CSharp_Base_director_connect(). This method simply maps each C# delegate onto a C function pointer.

    SWIGEXPORT void SWIGSTDCALL CSharp_Base_director_connect(void *objarg, 
                                            SwigDirector_Base::SWIG_Callback0_t callback0,
                                            SwigDirector_Base::SWIG_Callback1_t callback1) {
      Base *obj = (Base *)objarg;
      SwigDirector_Base *director = dynamic_cast<SwigDirector_Base *>(obj);
      if (director) {
        director->swig_connect_director(callback0, callback1);
      }
    }
    
    class SwigDirector_Base : public Base, public Swig::Director {
    public:
      SwigDirector_Base();
      virtual unsigned int UIntMethod(unsigned int x);
      virtual ~SwigDirector_Base();
      virtual void BaseBoolMethod(Base const &b, bool flag);
    
      typedef unsigned int (SWIGSTDCALL* SWIG_Callback0_t)(unsigned int);
      typedef void (SWIGSTDCALL* SWIG_Callback1_t)(void *, unsigned int);
      void swig_connect_director(SWIG_Callback0_t callbackUIntMethod,
                                 SWIG_Callback1_t callbackBaseBoolMethod);
    
    private:
      SWIG_Callback0_t swig_callbackUIntMethod;
      SWIG_Callback1_t swig_callbackBaseBoolMethod;
      void swig_init_callbacks();
    };
    
    void SwigDirector_Base::swig_connect_director(SWIG_Callback0_t callbackUIntMethod, 
                                                  SWIG_Callback1_t callbackBaseBoolMethod) {
      swig_callbackUIntMethod = callbackUIntMethod;
      swig_callbackBaseBoolMethod = callbackBaseBoolMethod;
    }
    

    Note that for each director class SWIG creates an unmanaged director class for making the callbacks. For example Base has SwigDirector_Base and SwigDirector_Base is derived from Base. Should a C# class be derived from Base, the underlying C++ SwigDirector_Base is created rather than Base. The SwigDirector_Base class then implements all the virtual methods, redirecting calls up to managed code if the callback/delegate is non-zero. The implementation of SwigDirector_Base::BaseBoolMethod shows this - the callback is made by invoking the swig_callbackBaseBoolMethod function pointer:

    void SwigDirector_Base::BaseBoolMethod(Base const &b, bool flag) {
      void * jb = 0 ;
      unsigned int jflag  ;
      
      if (!swig_callbackBaseBoolMethod) {
        Base::BaseBoolMethod(b, flag);
        return;
      } else {
        jb = (Base *) &b; 
        jflag = flag;
        swig_callbackBaseBoolMethod(jb, jflag);
      }
    }
    

    The delegates from the above example are public by default:

      public delegate uint SwigDelegateBase_0(uint x);
      public delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    These can be changed if desired via the csdirectordelegatemodifiers %feature directive. For example, using %feature("csdirectordelegatemodifiers") "internal" before SWIG parses the Base class will change all the delegates to internal :

      internal delegate uint SwigDelegateBase_0(uint x);
      internal delegate void SwigDelegateBase_1(global::System.IntPtr b, bool flag);
    

    20.6.3 Director caveats

    There is a subtle gotcha with directors. If default parameters are used, it is recommended to follow a pattern of always calling a single method in any C# derived class. An example will clarify this and the reasoning behind the recommendation. Consider the following C++ class wrapped as a director class:

    class Defaults {
    public:
      virtual ~Defaults();
      virtual void DefaultMethod(int a=-100);
    };
    

    Recall that C++ methods with default parameters generate overloaded methods for each defaulted parameter, so a C# derived class can be created with two DefaultMethod override methods:

    public class CSharpDefaults : Defaults
    {
      public override void DefaultMethod()
      {
        DefaultMethod(-100); // note C++ default value used
      }
      public override void DefaultMethod(int x)
      {
      }
    }
    

    It may not be clear at first, but should a user intend to call CSharpDefaults.DefaultMethod() from C++, a call is actually made to CSharpDefaults.DefaultMethod(int). This is because the initial call is made in C++ and therefore the DefaultMethod(int) method will be called as is expected with C++ calls to methods with defaults, with the default being set to -100. The callback/delegate matching this method is of course the overloaded method DefaultMethod(int). However, a call from C# to CSharpDefaults.DefaultMethod() will of course call this exact method and in order for behaviour to be consistent with calls from C++, the implementation should pass the call on to CSharpDefaults.DefaultMethod(int)using the C++ default value, as shown above.

    20.7 Multiple modules

    When using multiple modules it is is possible to compile each SWIG generated wrapper into a different assembly. However, by default the generated code may not compile if generated classes in one assembly use generated classes in another assembly. The visibility of the getCPtr() and pointer constructor generated from the csbody typemaps needs changing. The default visibility is internal but it needs to be public for access from a different assembly. Just changing 'internal' to 'public' in the typemap achieves this. Two macros are available in csharp.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the csbody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_CSBODY_PROXY(public, public, SWIGTYPE)
      SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    Alternatively, instead of exposing these as public, consider using the [assembly:InternalsVisibleTo("Name")] attribute available in the .NET framework when you know which assemblies these can be exposed to. Another approach would be to make these public, but also to hide them from intellisense by using the [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] attribute if you don't want users to easily stumble upon these so called 'internal workings' of the wrappers.

    20.8 C# Typemap examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "csharp.swg" and "typemaps.i " in the SWIG library.

    20.8.1 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable. The example is a direct equivalent to this Java equivalent.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from C# after running the code through SWIG:

          Wheel wheel = new Bike(10).getWheel();
          Console.WriteLine("wheel size: " + wheel.size);
          // Simulate a garbage collection
          global::System.GC.Collect();
          global::System.GC.WaitForPendingFinalizers();
          global::System.Console.WriteLine("wheel size: " + wheel.size);
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(cscode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a C# reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(csout, excode=SWIGEXCODE) Wheel& getWheel {
        global::System.IntPtr cPtr = $imcall;$excode
        $csclassname ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new $csclassname(cPtr, $owner);
          ret.addReference(this);
        }
        return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel : global::System.IDisposable {
      ...
      // Ensure that the GC doesn't collect any Bike instance set from C#
      private Bike bikeReference;
      internal void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike : global::System.IDisposable {
      ...
      public Wheel getWheel() {
        global::System.IntPtr cPtr = examplePINVOKE.Bike_getWheel(swigCPtr);
        Wheel ret = null;
        if (cPtr != global::System.IntPtr.Zero) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    20.8.2 Memory management for objects passed to the C++ layer

    The example is a direct equivalent to this Java equivalent. Managing memory can be tricky when using C++ and C# proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

      Container container;
      Element element(20);
      container.setElement(&element);
      cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from C#

          Container container = new Container();
          Element element = new Element(20);
          container.setElement(element);
    

    The C++ code will always print out 20, but the value printed out may not be this in the C# equivalent code. In order to understand why, consider a garbage collection occuring...

          Container container = new Container();
          Element element = new Element(20);
          container.setElement(element);
          Console.WriteLine("element.value: " + container.getElement().value);
          // Simulate a garbage collection
          global::System.GC.Collect();
          global::System.GC.WaitForPendingFinalizers();
          global::System.Console.WriteLine("element.value: " + container.getElement().value);
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the C# layer...

    public class Container : global::System.IDisposable {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private global::System.Runtime.InteropServices.HandleRef getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    
      public void setElement(Element e) {
        examplePINVOKE.Container_setElement(swigCPtr, getCPtrAndAddReference(e));
      }
    }
    

    The following typemaps will generate the desired code. The 'csin' typemap matches the input parameter type for the setElement method. The 'cscode' typemap simply adds in the specified code into the C# proxy class.

    %typemap(csin) Element *e "getCPtrAndAddReference($csinput)"
    
    %typemap(cscode) Container %{
      // Ensure that the GC doesn't collect any Element set from C#
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private global::System.Runtime.InteropServices.HandleRef getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    %}
    

    20.8.3 Date marshalling using the csin typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard .NET date class, System.DateTime by using the 'pre', 'post' and 'pgcppname' attributes of the "csin" typemap (the C# equivalent to the "javain" typemap). The example is an equivalent to the Java Date marshalling example. The idea is that the System.DateTime is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate();
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the C# proxy class CDate is used in the proxy interface:

    public class Action : global::System.IDisposable {
      ...
      public Action(CDate dateIn, CDate dateOut) 
          : this(examplePINVOKE.new_Action(CDate.getCPtr(dateIn), CDate.getCPtr(dateOut)), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    
      public int doSomething(CDate dateIn, CDate dateOut) {
        int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                    CDate.getCPtr(dateIn), 
                                                    CDate.getCPtr(dateOut));
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
        return ret;
      }
    }
    

    The CDate & and const CDate & C# code is generated from the following two default typemaps:

    %typemap(cstype) SWIGTYPE & "$csclassname"
    %typemap(csin) SWIGTYPE & "$csclassname.getCPtr($csinput)"
    

    where '$csclassname' is translated into the proxy class name, CDate and '$csinput' is translated into the name of the parameter, eg dateIn. From C#, the intention is then to call into a modifed API with something like:

    System.DateTime dateIn = new System.DateTime(2011, 4, 13);
    System.DateTime dateOut = new System.DateTime();
    
    // Note in calls below, dateIn remains unchanged and dateOut 
    // is set to a new value by the C++ call
    Action action = new Action(dateIn, out dateOut);
    dateIn = new System.DateTime(2012, 7, 14);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the C# layer, a System.DateTime is converted into a CDate. The intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(cstype) const CDate & "System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);"
            ) const CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(cstype) CDate & "out System.DateTime"
    %typemap(csin, 
             pre="    CDate temp$csinput = new CDate();", 
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="out $csinput"
            ) CDate &
             "$csclassname.getCPtr(temp$csinput)"
    
    

    The resulting generated proxy code in the Action class follows:

    public class Action : global::System.IDisposable {
      ...
      public int doSomething(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          int ret = examplePINVOKE.Action_doSomething(swigCPtr, 
                                                      CDate.getCPtr(tempdateIn), 
                                                      CDate.getCPtr(tempdateOut));
          if (examplePINVOKE.SWIGPendingException.Pending) 
            throw examplePINVOKE.SWIGPendingException.Retrieve();
          return ret;
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private global::System.IntPtr SwigConstructAction(System.DateTime dateIn, out System.DateTime dateOut) {
        CDate tempdateIn = new CDate(dateIn.Year, dateIn.Month, dateIn.Day);
        CDate tempdateOut = new CDate();
        try {
          return examplePINVOKE.new_Action(CDate.getCPtr(tempdateIn), CDate.getCPtr(tempdateOut));
        } finally {
          dateOut = new System.DateTime(tempdateOut.getYear(), 
                                        tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(System.DateTime dateIn, out System.DateTime dateOut) 
          : this(Action.SwigConstructAction(dateIn, out dateOut), true) {
        if (examplePINVOKE.SWIGPendingException.Pending) 
          throw examplePINVOKE.SWIGPendingException.Retrieve();
      }
    }
    

    A few things to note:

    • The "cstype" typemap has changed the parameter type to System.DateTime instead of the default generated CDate proxy.
    • The non-const CDate & type is marshalled as a reference parameter in C# as the date cannot be explicitly set once the object has been created, so a new object is created instead.
    • The code in the 'pre' attribute appears before the intermediary call (examplePINVOKE.new_Action / examplePINVOKE.Action_doSomething).
    • The code in the 'post' attribute appears after the intermediary call.
    • A try .. finally block is generated with the intermediary call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the intermediary call and the 'post' code being inserted before the return statement is not possible given that the intermediary call and method return comes from a single source (the "csout" typemap).
    • The temporary variables in the "csin" typemaps are called temp$csin, where "$csin" is replaced with the parameter name. "$csin" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "csin" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows C# code to be called before the intermediary call made in the constructor initialization list.
    • The 'cshin' attribute is required for the SwigConstructAction constructor helper function so that the 2nd parameter is declared as out dateOut instead of just dateOut.

    So far we have considered the date as an input only and an output only type. Now let's consider CDate * used as an input/output type. Consider the following C++ function which modifies the date passed in:

    void addYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() + years, pDate->getMonth(), pDate->getDay());
    }
    

    If usage of CDate * commonly follows this input/output pattern, usage from C# like the following

    System.DateTime christmasEve = new System.DateTime(2000, 12, 24);
    example.addYears(ref christmasEve, 10); // christmasEve now contains 2010-12-24
    

    will be possible with the following CDate * typemaps

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    

    Globals are wrapped by the module class and for a module called example, the typemaps result in the following code:

    public class example {
      public static void addYears(ref System.DateTime pDate, int years) {
        CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day);
        try {
          examplePINVOKE.addYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
      }
      ...
    }
    

    The following typemap is the same as the previous but demonstrates how a using block can be used for the temporary variable. The only change to the previous typemap is the introduction of the 'terminator' attribute to terminate the using block. The subtractYears method is nearly identical to the above addYears method.

    %typemap(csin,
      pre="    using (CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day)) {",
      post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
           " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
      terminator="    } // terminate temp$csinput using block",
      cshin="ref $csinput"
     ) CDate *
      "$csclassname.getCPtr(temp$csinput)"
    
    void subtractYears(CDate *pDate, int years) {
      *pDate = CDate(pDate->getYear() - years, pDate->getMonth(), pDate->getDay());
    }
    

    The resulting generated code shows the termination of the using block:

    public class example {
      public static void subtractYears(ref System.DateTime pDate, int years) {
        using (CDate temppDate = new CDate(pDate.Year, pDate.Month, pDate.Day)) {
        try {
          examplePINVOKE.subtractYears(CDate.getCPtr(temppDate), years);
        } finally {
          pDate = new System.DateTime(temppDate.getYear(), temppDate.getMonth(), temppDate.getDay(),
                                      0, 0, 0);
        }
        } // terminate temppDate using block
      }
      ...
    }
    

    20.8.4 A date example demonstrating marshalling of C# properties

    The previous section looked at converting a C++ date class to System.DateTime for parameters. This section extends this idea so that the correct marshalling is obtained when wrapping C++ variables. Consider the same CDate class from the previous section and a global variable:

    CDate ImportantDate = CDate(1999, 12, 31);
    

    The aim is to use System.DateTime from C# when accessing this date as shown in the following usage where the module name is 'example':

    example.ImportantDate = new System.DateTime(2000, 11, 22);
    System.DateTime importantDate = example.ImportantDate;
    Console.WriteLine("Important date: " + importantDate);
    

    When SWIG wraps a variable that is a class/struct/union, it is wrapped using a pointer to the type for the reasons given in Structure data members. The typemap type required is thus CDate *. Given that the previous section already designed CDate * typemaps, we'll use those same typemaps plus the 'csvarin' and 'csvarout' typemaps.

    %typemap(cstype, out="System.DateTime") CDate * "ref System.DateTime"
    
    %typemap(csin,
             pre="    CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);",
             post="      $csinput = new System.DateTime(temp$csinput.getYear(),"
                  " temp$csinput.getMonth(), temp$csinput.getDay(), 0, 0, 0);",
             cshin="ref $csinput"
            ) CDate *
             "$csclassname.getCPtr(temp$csinput)"
    
    %typemap(csvarin, excode=SWIGEXCODE2) CDate * %{
        /* csvarin typemap code */
        set {
          CDate temp$csinput = new CDate($csinput.Year, $csinput.Month, $csinput.Day);
          $imcall;$excode
        } %}
    
    %typemap(csvarout, excode=SWIGEXCODE2) CDate * %{
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = $imcall;
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, $owner);$excode
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } %}
    

    For a module called example, the typemaps result in the following code:

    public class example {
      public static System.DateTime ImportantDate {
        /* csvarin typemap code */
        set {
          CDate tempvalue = new CDate(value.Year, value.Month, value.Day);
          examplePINVOKE.ImportantDate_set(CDate.getCPtr(tempvalue));
        } 
        /* csvarout typemap code */
        get {
          global::System.IntPtr cPtr = examplePINVOKE.ImportantDate_get();
          CDate tempDate = (cPtr == global::System.IntPtr.Zero) ? null : new CDate(cPtr, false);
          return new System.DateTime(tempDate.getYear(), tempDate.getMonth(), tempDate.getDay(),
                                     0, 0, 0);
        } 
      }
      ...
    }
    

    Some points to note:

    • The property set comes from the 'csvarin' typemap and the property get comes from the 'csvarout' typemap.
    • The type used for the property comes from the 'cstype' typemap. This particular example has the 'out' attribute set in the typemap and as it is specified, it is used in preference to the type in the typemap body. This is because the type in the 'out' attribute can never include modifiers such as 'ref', thereby avoiding code such as public static ref System.DateTime ImportantDate { ..., which would of course not compile.
    • The $excode special variable expands to nothing as there are no exception handlers specified in any of the unmanaged code typemaps (in fact the marshalling was done using the default unmanaged code typemaps.)
    • The $imcall typemap expands to the appropriate intermediary method call in the examplePINVOKE class.
    • The $csinput special variable in the 'csin' typemap always expands to value for properties. In this case $csclassname.getCPtr(temp$csinput) expands to CDate.getCPtr(tempvalue).
    • The 'csin' typemap has 'pre', 'post' and 'cshin' attributes, and these are all ignored in the property set. The code in these attributes must instead be replicated within the 'csvarin' typemap. The line creating the temp$csinput variable is such an example; it is identical to what is in the 'pre' attribute.

    20.8.5 Date example demonstrating the 'pre' and 'post' typemap attributes for directors

    The 'pre' and 'post' attributes in the "csdirectorin" typemap act like the attributes of the same name in the "csin" typemap. For example if we modify the Date marshalling example like this:

    class CDate {
      ...
      void setYear(int);
      void setMonth(int);
      void setDay(int);
    };
    struct Action {
      virtual void someCallback(CDate &date);
      virtual ~Action();
      ...
    };
    

    and declare %feature ("director") for the Action class, we would have to define additional marshalling rules for CDate & parameter. The typemap may look like this:

    %typemap(csdirectorin,
             pre="System.DateTime temp$iminput = new System.DateTime();",
             post="CDate temp2$iminput = new CDate($iminput, false);\n"
                  "temp2$iminput.setYear(tempdate.Year);\n"
                  "temp2$iminput.setMonth(tempdate.Month);\n"
                  "temp2$iminput.setDay(tempdate.Day);"
             ) CDate &date "out temp$iminput"
    

    The generated proxy class code will then contain the following wrapper for calling user-overloaded someCallback():

    ...
      private void SwigDirectorsomeCallback(global::System.IntPtr date) {
        System.DateTime tempdate = new System.DateTime();
        try {
          someCallback(out tempdate);
        } finally {
          // we create a managed wrapper around the existing C reference, just for convenience
          CDate temp2date = new CDate(date, false);
          temp2date.setYear(tempdate.Year);
          temp2date.setMonth(tempdate.Month);
          temp2date.setDay(tempdate.Day);
        }
      }
    ...
    

    Pay special attention to the memory management issues, using these attributes.

    20.8.6 Turning wrapped classes into partial classes

    C# supports the notion of partial classes whereby a class definition can be split into more than one file. It is possible to turn the wrapped C++ class into a partial C# class using the csclassmodifiers typemap. Consider a C++ class called ExtendMe :

    class ExtendMe {
    public:
      int Part1() { return 1; }
    };
    

    The default C# proxy class generated is:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    The default csclassmodifiers typemap shipped with SWIG is

    %typemap(csclassmodifiers) SWIGTYPE "public class"
    

    Note that the type used is the special catch all type SWIGTYPE . If instead we use the following typemap to override this for just the ExtendMe class:

    %typemap(csclassmodifiers) ExtendMe "public partial class"
    

    The C# proxy class becomes a partial class:

    public partial class ExtendMe : global::System.IDisposable {
      ...
      public int Part1() {
        ...
      }
    }
    

    You can then of course declare another part of the partial class elsewhere, for example:

    public partial class ExtendMe : global::System.IDisposable {
      public int Part2() {
        return 2;
      }
    }
    

    and compile the following code:

    ExtendMe em = new ExtendMe();
    Console.WriteLine("part1: {0}", em.Part1());
    Console.WriteLine("part2: {0}", em.Part2());
    

    demonstrating that the class contains methods calling both unmanaged code - Part1() and managed code - Part2(). The following example is an alternative approach to adding managed code to the generated proxy class.

    20.8.7 Extending proxy classes with additional C# code

    The previous example showed how to use partial classes to add functionality to a generated C# proxy class. It is also possible to extend a wrapped struct/class with C/C++ code by using the %extend directive. A third approach is to add some C# methods into the generated proxy class with the cscode typemap. If we declare the following typemap before SWIG parses the ExtendMe class used in the previous example

    %typemap(cscode) ExtendMe %{
      public int Part3() {
        return 3;
      }
    %}
    
    

    The generated C# proxy class will instead be:

    public class ExtendMe : global::System.IDisposable {
      ...
      public int Part3() {
        return 3;
      }
      public int Part1() {
        ...
      }
    }
    

    20.8.8 Underlying type for enums

    C# enums use int as the underlying type for each enum item. If you wish to change the underlying type to something else, then use the csbase typemap. For example when your C++ code uses a value larget than int, this is necessary as the C# compiler will not compile values which are too large to fit into an int. Here is an example:

    %typemap(csbase) BigNumbers "uint"
    %inline %{
      enum BigNumbers { big=0x80000000, bigger };
    %}
    

    The generated enum will then use the given underlying type and compile correctly:

    public enum BigNumbers : uint {
      big = 0x80000000,
      bigger
    }
    

    21 SWIG and Chicken

    This chapter describes SWIG's support of CHICKEN. CHICKEN is a Scheme-to-C compiler supporting most of the language features as defined in the Revised^5 Report on Scheme. Its main attributes are that it

    1. generates portable C code
    2. includes a customizable interpreter
    3. links to C libraries with a simple Foreign Function Interface
    4. supports full tail-recursion and first-class continuations

    When confronted with a large C library, CHICKEN users can use SWIG to generate CHICKEN wrappers for the C library. However, the real advantages of using SWIG with CHICKEN are its support for C++ -- object-oriented code is difficult to wrap by hand in CHICKEN -- and its typed pointer representation, essential for C and C++ libraries involving structures or classes.

    21.1 Preliminaries

    CHICKEN support was introduced to SWIG in version 1.3.18. SWIG relies on some recent additions to CHICKEN, which are only present in releases of CHICKEN with version number greater than or equal to 1.89. To use a chicken version between 1.40 and 1.89, see the Garbage collection section below.

    You may want to look at any of the examples in Examples/chicken/ directory for the basic steps to run SWIG CHICKEN.

    21.1.1 Running SWIG in C mode

    To run SWIG CHICKEN in C mode, use the -chicken option.

    % swig -chicken example.i

    To allow the wrapper to take advantage of future CHICKEN code generation improvements, part of the wrapper is direct CHICKEN function calls (example_wrap.c) and part is CHICKEN Scheme ( example.scm). The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c
    

    So for the C mode of SWIG CHICKEN, example_wrap.c and oexample.c are the files that must be compiled to object files and linked into your project.

    21.1.2 Running SWIG in C++ mode

    To run SWIG CHICKEN in C++ mode, use the -chicken -c++ option.

    % swig -chicken -c++ example.i

    This will generate example_wrap.cxx and example.scm . The basic Scheme code must be compiled to C using your system's CHICKEN compiler or both files can be compiled directly using the much simpler csc.

    % chicken example.scm -output-file oexample.c

    So for the C++ mode of SWIG CHICKEN, example_wrap.cxx and oexample.c are the files that must be compiled to object files and linked into your project.

    21.2 Code Generation

    21.2.1 Naming Conventions

    Given a C variable, function or constant declaration named Foo_Bar, the declaration will be available in CHICKEN as an identifier ending with Foo-Bar. That is, an underscore is converted to a dash.

    You may control what the CHICKEN identifier will be by using the %rename SWIG directive in the SWIG interface file.

    21.2.2 Modules

    The name of the module must be declared one of two ways:

    • Placing %module example in the SWIG interface file.
    • Using -module example on the SWIG command line.

    The generated example.scm file then exports (declare (unit modulename)). If you do not want SWIG to export the (declare (unit modulename)), pass the -nounit option to SWIG.

    CHICKEN will be able to access the module using the (declare (uses modulename)) CHICKEN Scheme form.

    21.2.3 Constants and Variables

    Constants may be created using any of the four constructs in the interface file:

    1. #define MYCONSTANT1 ...
    2. %constant int MYCONSTANT2 = ...
    3. const int MYCONSTANT3 = ...
    4. enum { MYCONSTANT4 = ... };

    In all cases, the constants may be accessed from within CHICKEN using the form (MYCONSTANT1); that is, the constants may be accessed using the read-only parameter form.

    Variables are accessed using the full parameter form. For example, to set the C variable "int my_variable;", use the Scheme form (my-variable 2345). To get the C variable, use (my-variable) .

    The %feature("constasvar") can be applied to any constant or immutable variable. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. This causes the generated .scm file to just contain the code (set! MYCONSTANT1 (MYCONSTANT1)). See Features and the %feature directive for info on how to apply the %feature.

    21.2.4 Functions

    C functions declared in the SWIG interface file will have corresponding CHICKEN Scheme procedures. For example, the C function "int sqrt(double x);" will be available using the Scheme form (sqrt 2345.0). A void return value will give C_SCHEME_UNDEFINED as a result.

    A function may return more than one value by using the OUTPUT specifier (see Lib/chicken/typemaps.i). They will be returned as multiple values using (values) if there is more than one result (that is, a non-void return value and at least one argout parameter, or a void return value and at least two argout parameters). The return values can then be accessed with (call-with-values) .

    21.2.5 Exceptions

    The SWIG chicken module has support for exceptions thrown from C or C++ code to be caught in scheme. See Exception handling with %exception for more information about declaring exceptions in the interface file.

    Chicken supports both the SWIG_exception(int code, const char *msg) interface as well as a SWIG_ThrowException(C_word val) function for throwing exceptions from inside the %exception blocks. SWIG_exception will throw a list consisting of the code (as an integer) and the message. Both of these will throw an exception using (abort), which can be handled by (handle-exceptions). See the Chicken manual on Exceptions and SFRI-12. Since the exception values are thrown directly, if (condition-case) is used to catch an exception the exception will come through in the val () case.

    The following simple module

    %module exception_test
    
    %inline %{
      void test_throw(int i) throws (int) { 
        if (i == 1) throw 15; 
      }
    %}
    

    could be run with

    (handle-exceptions exvar 
      (if (= exvar 15)
        (print "Correct!") 
        (print "Threw something else " exvar))
      (test-throw 1))
    

    21.3 TinyCLOS

    The author of TinyCLOS, Gregor Kiczales, describes TinyCLOS as: "Tiny CLOS is a Scheme implementation of a 'kernelized' CLOS, with a metaobject protocol. The implementation is even simpler than the simple CLOS found in 'The Art of the Metaobject Protocol', weighing in at around 850 lines of code, including (some) comments and documentation."

    Almost all good Scheme books describe how to use metaobjects and generic procedures to implement an object-oriented Scheme system. Please consult a Scheme book if you are unfamiliar with the concept.

    CHICKEN has a modified version of TinyCLOS, which SWIG CHICKEN uses if the -proxy argument is given. If -proxy is passed, then the generated example.scm file will contain TinyCLOS class definitions. A class named Foo is declared as <Foo>, and each member variable is allocated a slot. Member functions are exported as generic functions.

    Primitive symbols and functions (the interface that would be presented if -proxy was not passed) are hidden and no longer accessible. If the -unhideprimitive command line argument is passed to SWIG, then the primitive symbols will be available, but each will be prefixed by the string "primitive:"

    The exported symbol names can be controlled with the -closprefix and -useclassprefix arguments. If -useclassprefix is passed to SWIG, every member function will be generated with the class name as a prefix. If the -closprefix mymod: argument is passed to SWIG, then the exported functions will be prefixed by the string "mymod:". If -useclassprefix is passed, -closprefix is ignored.

    21.4 Linkage

    Please refer to CHICKEN - A practical and portable Scheme system - User's manual for detailed help on how to link object files to create a CHICKEN Scheme program. Briefly, to link object files, be sure to add `chicken-config -extra-libs -libs` or `chicken-config -shared -extra-libs -libs`to your linker options. Use the -shared option if you want to create a dynamically loadable module. You might also want to use the much simpler csc or csc.bat.

    Each scheme file that is generated by SWIG contains (declare (uses modname)). This means that to load the module from scheme code, the code must include (declare (uses modname )).

    21.4.1 Static binary or shared library linked at compile time

    We can easily use csc to build a static binary.

    $ swig -chicken example.i
    $ csc -v example.scm example_impl.c example_wrap.c test_script.scm -o example
    $ ./example
    

    Similar to the above, any number of module.scm files could be compiled into a shared library, and then that shared library linked when compiling the main application.

    $ swig -chicken example.i
    $ csc -sv example.scm example_wrap.c example_impl.c -o example.so
    

    The example.so file can then linked with test_script.scm when it is compiled, in which case test_script.scm must have (declare (uses example)). Multiple SWIG modules could have been linked into example.so and each one accessed with a (declare (uses ... )).

    $ csc -v test_script.scm -lexample
    

    An alternative is that the test_script.scm can have the code (load-library 'example "example.so"), in which case the test script does not need to be linked with example.so. The test_script.scm file can then be run with csi.

    21.4.2 Building chicken extension libraries

    Building a shared library like in the above section only works if the library is linked at compile time with a script containing (declare (uses ...)) or is loaded explicitly with (load-library 'example "example.so"). It is not the format that CHICKEN expects for extension libraries and eggs. The problem is the (declare (unit modname)) inside the modname.scm file. There are two possible solutions to this.

    First, SWIG accepts a -nounit argument, in which case the (declare (unit modname)) is not generated. Then, the modname.scm and modname_wrap.c files must be compiled into their own shared library.

    $ csc -sv modname.scm modname_wrap.c modname_impl.c -o modname.so
    

    This library can then be loaded by scheme code with the (require 'modname) function. See the Loading-extension-libraries in the eval unit inside the CHICKEN manual for more information.

    Another alternative is to run SWIG normally and create a scheme file that contains (declare (uses modname)) and then compile that file into the shared library as well. For example, inside the mod_load.scm file,

    (declare (uses mod1))
    (declare (uses mod2))
    

    Which would then be compiled with

    $ swig -chicken mod1.i
    $ swig -chicken mod2.i
    $ csc -sv mod_load.scm mod1.scm mod2.scm mod1_wrap.c mod2_wrap.c mod1_impl.c mod2_impl.c -o mod.so
    

    Then the extension library can be loaded with (require 'mod) . As we can see here, mod_load.scm contains the code that gets executed when the module is loaded. All this code does is load both mod1 and mod2. As we can see, this technique is more useful when you want to combine a few SWIG modules into one chicken extension library, especially if modules are related by %import

    In either method, the files that are compiled into the shared library could also be packaged into an egg. The mod1_wrap.c and mod2_wrap.c files that are created by SWIG are stand alone and do not need SWIG to be installed to be compiled. Thus the egg could be distributed and used by anyone, even if SWIG is not installed.

    See the Examples/chicken/egg directory in the SWIG source for an example that builds two eggs, one using the first method and one using the second method.

    21.4.3 Linking multiple SWIG modules with TinyCLOS

    Linking together multiple modules that share type information using the %import directive while also using -proxy is more complicated. For example, if mod2.i imports mod1.i , then the mod2.scm file contains references to symbols declared in mod1.scm, and thus a (declare (uses mod1 )) or (require 'mod1) must be exported to the top of mod2.scm. By default, when SWIG encounters an %import "modname.i" directive, it exports (declare (uses modname)) into the scm file. This works fine unless mod1 was compiled with the -nounit argument or was compiled into an extension library with other modules under a different name.

    One option is to override the automatic generation of (declare (uses mod1)) by passing the -noclosuses option to SWIG when compiling mod2.i. SWIG then provides the %insert(closprefix) %{ %} directive. Any scheme code inside that directive is inserted into the generated .scm file, and if mod1 was compiled with -nounit, the directive should contain (require 'mod1). This option allows for mixed loading as well, where some modules are imported with (declare (uses modname )) (which means they were compiled without -nounit) and some are imported with (require 'modname).

    The other option is to use the second idea in the above section. Compile all the modules normally, without any %insert(closprefix) , -nounit, or -noclosuses. Then the modules will import each other correctly with (declare (uses ...)). To create an extension library or an egg, just create a module_load.scm file that (declare (uses ...)) all the modules.

    21.5 Typemaps

    The Chicken module handles all types via typemaps. This information is read from Lib/chicken/typemaps.i and Lib/chicken/chicken.swg.

    21.6 Pointers

    For pointer types, SWIG uses CHICKEN tagged pointers. A tagged pointer is an ordinary CHICKEN pointer with an extra slot for a void *. With SWIG CHICKEN, this void * is a pointer to a type-info structure. So each pointer used as input or output from the SWIG-generated CHICKEN wrappers will have type information attached to it. This will let the wrappers correctly determine which method should be called according to the object type hierarchy exposed in the SWIG interface files.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(void *ptr, swig_type_info *type, int owner), The function that calls SWIG_NewPointerObj must have a variable declared C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); It is ok to call SWIG_NewPointerObj more than once, just make sure known_space has enough space for all the created pointers.

    To get the pointer represented by a CHICKEN tagged pointer, the wrapper code calls the function SWIG_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags), passing a pointer to a struct representing the expected pointer type. flags is either zero or SWIG_POINTER_DISOWN (see below).

    21.6.1 Garbage collection

    If the owner flag passed to SWIG_NewPointerObj is 1, NewPointerObj will add a finalizer to the type which will call the destructor or delete method of that type. The destructor and delete functions are no longer exported for use in scheme code, instead SWIG and chicken manage pointers. In situations where SWIG knows that a function is returning a type that should be garbage collected, SWIG will automatically set the owner flag to 1. For other functions, the %newobject directive must be specified for functions whose return values should be garbage collected. See Object ownership and %newobject for more information.

    In situations where a C or C++ function will assume ownership of a pointer, and thus chicken should no longer garbage collect it, SWIG provides the DISOWN input typemap. After applying this typemap (see the Typemaps chapter for more information on how to apply typemaps), any pointer that gets passed in will no longer be garbage collected. An object is disowned by passing the SWIG_POINTER_DISOWN flag to SWIG_ConvertPtr . Warning: Since the lifetime of the object is now controlled by the underlying code, the object might get deleted while the scheme code still holds a pointer to it. Further use of this pointer can lead to a crash.

    Adding a finalizer function from C code was added to chicken in the 1.89 release, so garbage collection does not work for chicken versions below 1.89. If you would like the SWIG generated code to work with chicken 1.40 to 1.89, pass the -nocollection argument to SWIG. This will not export code inside the _wrap.c file to register finalizers, and will then export destructor functions which must be called manually.

    21.7 Unsupported features and known problems

    • No director support.
    • No support for c++ standard types like std::vector.
    • The TinyCLOS wrappers for overloaded functions will not work correctly when using %feature(compactdefaultargs).

    21.7.1 TinyCLOS problems with Chicken version <= 1.92

    In Chicken versions equal to or below 1.92, TinyCLOS has a limitation such that generic methods do not properly work on methods with different number of specializers: TinyCLOS assumes that every method added to a generic function will have the same number of specializers. SWIG generates functions with different lengths of specializers when C/C++ functions are overloaded. For example, the code

    class Foo {};
    int foo(int a, Foo *b);
    int foo(int a);
    

    will produce scheme code

    (define-method (foo (arg0 <top>) (arg1 <Foo>)) (call primitive function))
    (define-method (foo (arg0 <top>)) (call primitive function))
    

    Using unpatched TinyCLOS, the second (define-method) will replace the first one, so calling (foo 3 f) will produce an error.

    There are three solutions to this. The easist is to upgrade to the latest Chicken version. Otherwise, the file Lib/chicken/tinyclos-multi-generic.patch in the SWIG source contains a patch against tinyclos.scm inside the 1.92 chicken source to add support into TinyCLOS for multi-argument generics. (This patch was accepted into Chicken) This requires chicken to be rebuilt and custom install of chicken. An alternative is the Lib/chicken/multi-generic.scm file in the SWIG source. This file can be loaded after TinyCLOS is loaded, and it will override some functions inside TinyCLOS to correctly support multi-argument generics. Please see the comments at the top of both files for more information.


    22 SWIG and D

    22.1 Introduction

    From the D Programming Language web site: D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. [...] The D language is statically typed and compiles directly to machine code. As such, it is not very surprising that D is able to directly interface with C libraries. Why would a SWIG module for D be needed then in the first place?

    Well, besides the obvious downside that the C header files have to be manually converted to D modules for this to work, there is one major inconvenience with this approach: D code usually is on a higher abstraction level than C, and many of the features that make D interesting are simply not available when dealing with C libraries, requiring you e.g. to manually convert strings between pointers to \0-terminated char arrays and D char arrays, making the algorithms from the D2 standard library unusable with C arrays and data structures, and so on.

    While these issues can be worked around relatively easy by hand-coding a thin wrapper layer around the C library in question, there is another issue where writing wrapper code per hand is not feasible: C++ libraries. D did not support interfacing to C++ in version 1 at all, and even if extern(C++) has been added to D2, the support is still very limited, and a custom wrapper layer is still required in many cases.

    To help addressing these issues, the SWIG C# module has been forked to support D. Is has evolved quite a lot since then, but there are still many similarities, so if you do not find what you are looking for on this page, it might be worth having a look at the chapter on C# (and also on Java, since the C# module was in turn forked from it).

    22.2 Command line invocation

    To activate the D module, pass the -d option to SWIG at the command line. The same standard command line switches as with any other language module are available, plus the following D specific ones:

    -d2

    By default, SWIG generates code for D1/Tango. Use the -d2 flag to target D2/Phobos instead.

    -splitproxy

    By default, SWIG generates two D modules: the proxy module, named like the source module (either specified via the %module directive or via the module command line switch), which contains all the proxy classes, functions, enums, etc., and the intermediary module (named like the proxy module, but suffixed with _im), which contains all the extern(C) function declarations and other private parts only used internally by the proxy module.

    If the split proxy mode is enabled by passing this switch at the command line, all proxy classes and enums are emitted to their own D module instead. The main proxy module only contains free functions and constants in this case.

    -package <pkg>

    By default, the proxy D modules and the intermediary D module are written to the root package. Using this option, you can specify another target package instead.

    -wrapperlibrary <wl>

    The code SWIG generates to dynamically load the C/C++ wrapper layer looks for a library called $module_wrap by default. With this switch, you can override the name of the file the wrapper code loads at runtime (the lib prefix and the suffix for shared libraries are appended automatically, depending on the OS).

    This might especially be useful if you want to invoke SWIG several times on separate modules, but compile the resulting code into a single shared library.

    22.3 Typemaps

    22.3.1 C# <-> D name comparison

    If you already know the SWIG C# module, you might find the following name comparison table useful:

     ctype                  <->  ctype
     imtype                 <->  imtype
     cstype                 <->  dtype
     csin                   <->  din
     csout                  <->  dout
     csdirectorin           <->  ddirectorin
     csdirectorout          <->  ddirectorout
     csinterfaces           <->  dinterfaces
     csinterfaces_derived   <->  dinterfaces_derived
     csbase                 <->  dbase
     csclassmodifiers       <->  dclassmodifiers
     cscode                 <->  dcode
     csimports              <->  dimports
     csbody                 <->  dbody
     csfinalize             <->  ddestructor
     csdestruct             <->  ddispose
     csdestruct_derived     <->  ddispose_derived
    

    22.3.2 ctype, imtype, dtype

    Mapping of types between the C/C++ library, the C/C++ library wrapper exposing the C functions, the D wrapper module importing these functions and the D proxy code.

    The ctype typemap is used to determine the types to use in the C wrapper functions. The types from the imtype typemap are used in the extern(C) declarations of these functions in the intermediary D module. The dtype typemap contains the D types used in the D proxy module/class.

    22.3.3 in, out, directorin, directorout

    Used for converting between the types for C/C++ and D when generating the code for the wrapper functions (on the C++ side).

    The code from the in typemap is used to convert arguments to the C wrapper function to the type used in the wrapped code (ctype ->original C++ type), the out typemap is utilized to convert values from the wrapped code to wrapper function return types (original C++ type->ctype).

    The directorin typemap is used to convert parameters to the type used in the D director callback function, its return value is processed by directorout (see below).

    22.3.4 din, dout, ddirectorin, ddirectorout

    Typemaps for code generation in D proxy and type wrapper classes.

    The din typemap is used for converting function parameter types from the type used in the proxy module or class to the type used in the intermediary D module (the $dinput macro is replaced). To inject further parameter processing code before or after the call to the intermediary layer, the pre , post and terminator attributes can be used (please refer to the C# date marshalling example for more information on these).

    The dout typemap is used for converting function return values from the return type used in the intermediary D module to the type returned by the proxy function. The $excode special variable in dout typemaps is replaced by the excode typemap attribute code if the method can throw any exceptions from unmanaged code, otherwise by nothing (the $imcall and $owner macros are replaced).

    The code from the ddirectorin and ddirectorout typemaps is used for conversion in director callback functions. Arguments are converted to the type used in the proxy class method they are calling by using the code from ddirectorin, the proxy class method return value is converted to the type the C++ code expects via the ddirectorout typemap (the $dcall and $winput macros are replaced).

    The full chain of type conversions when a director callback is invoked looks like this:

          type              CPPClass::method(type a)
            ↑                       ↓
       <directorout>          <directorin>
            ↑                       ↓
          ctype             methodCallback(ctype a)           C++
     :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          imtype            methodCallback(imtype a)           D
            ↑                       ↓
      <ddirectorout>          <ddirectorin>
            ↑                       ↓
          dtype             DClass.method(dtype a)

    22.3.5 typecheck typemaps

    Because, unlike many scripting languages supported by SWIG, D does not need any dynamic dispatch helper to access an overloaded function, the purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in D (as more than one C++ type maps to a single D type).

    22.3.6 Code injection typemaps

    These typemaps are used for generating the skeleton of proxy classes for C++ types.

    By overriding dbase, dinterfaces or dinterfaces_derived, the inheritance chain of the generated proxy class for a type can be modified. dclassmodifiers allows you to add any custom modifiers around the class keyword.

    Using dcode and dimports, you can specify additional D code which will be emitted into the class body respectively the imports section of the D module the class is written to.

    dconstructor, ddestructor, ddispose and ddispose_derived are used to generate the class constructor, destructor and dispose() method, respectively. The auxiliary code for handling the pointer to the C++ object is stored in dbody and dbody_derived. You can override them for specific types.

    Code can also be injected into the D proxy class using %proxycode.

    22.3.7 Special variable macros

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation , for example $1, $input, $result etc.

    When generating D wrappers, a few additional macros are available:

    $dclassname (C#: $csclassname)

    This special variable works similar to $n_type in that it returns the name of a type - it expands to the D proxy class name of the type being wrapped. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_p_SomeCppClass is generated when wrapping SomeCppClass **.

    There are two other variants available, $&dclassname and $*dclassname. The former adds a level of indirection, while the latter removes one. For instance, when wrapping Foo **, $*dclassname would be replaced by the proxy class name corresponding to Foo *.

    $dclazzname (C#: $csclazzname)

    This special variable expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_.

    This special variable might be useful for calling certain functions in the wrapper layer (e.g. upcast wrappers) which are mangled like this.

    $null

    In code inserted into the generated C/C++ wrapper functions, this variable is replaced by either 0 or nothing at all, depending on whether the function has a return value or not. It can be used to bail out early e.g. in case of errors (return $null;).

    $dinput (C#: $csinput)

    This variable is used in din typemaps and is replaced by the expression which is to be passed to C/C++.

    For example, this input

    %typemap(din) SomeClass * "SomeClass.getCPointer($dinput)"
    
    %inline %{
      class SomeClass {};
      void foo(SomeClass *arg);
    %}

    leads to the following D proxy code being generated:

    void foo(SomeClass arg) {
      example_im.foo(SomeClass.getCPointer(arg));
    }
    $imcall and $owner (C#: $imcall)

    These variables are used in dout typemaps. $imcall contains the call to the intermediary module which provides the value to be used, and $owner signals if the caller is responsible for managing the object lifetime (that is, if the called method is a constructor or has been marked via %newobject ).

    Consider the following example:

    %typemap(dout) SomeClass * {
      return new SomeClass($imcall, $owner);
    }
    
    %inline %{
      class SomeClass;
      SomeClass *foo();
    
      %newobject bar();
      SomeClass *bar();
    %}
    

    The code generated for foo() and bar() looks like this:

    SomeClass foo() {
      return new SomeClass(example_im.foo(), false);
    }
    
    SomeClass bar() {
      return new SomeClass(example_im.bar(), true);
    }
    
    $dcall and $winput (C#: $cscall, $iminput)

    These variables are used in the director-specific typemaps ddirectorin and ddirectorout. They are more or less the reverse of the $imcall and $dinput macros: $dcall contains the invocation of the D proxy method of which the return value is to be passed back to C++, $winput contains the parameter value from C++.

    $excode

    This variable is used in dout and dconstructor typemaps and is filled with the contents of the excode typemap attribute if an exception could be thrown from the C++ side. See the C# documentation for details.

    $dbaseclass

    Currently for internal use only, it contains the D name of the C++ base class (if any) inside proxy classes.

    $directorconnect

    This macro is only valid inside the dconstructor typemap and contains the value of the dconstructor typemap attribute if the currently wrapped class has directors enabled.

    This is how the default dconstructor typemap looks like (you usually do not want to specify a custom one):

    %typemap(dconstructor, excode=SWIGEXCODE,
             directorconnect="\n  swigDirectorConnect();") SWIGTYPE {
      this($imcall, true);$excode$directorconnect
    }
    
    $importtype(SomeDType)

    This macro is used in the dimports typemap if a dependency on another D type generated by SWIG is added by a custom typemap.

    Consider the following code snippet:

    %typemap(dinterfaces) SomeClass "AnInterface, AnotherInterface";
    

    This causes SWIG to add AnInterface and AnotherInterface to the base class list of SomeClass:

    class SomeClass : AnInterface, AnotherInterface {
      ...
    }
    

    For this to work, AnInterface and AnotherInterface have to be in scope. If SWIG is not in split proxy mode, this is already the case, but it it is, they have to be added to the import list via the dimports typemap. Additionally, the import statement depends on the package SWIG is configured to emit the modules to.

    The $importtype macro helps you to elegantly solve this problem:

    %typemap(dimports) RemoteMpe %{
    $importtype(AnInterface)
    $importtype(AnotherInterface)
    %}
    

    If SWIG is in split proxy mode, it expands to an import statement for the specified type, to nothing if not.

    $module

    Expands to the name of the main proxy D module.

    $imdmodule

    Contains the fully qualified name of the intermediary D module.

    22.4 D and %feature

    The D module defines a number of directives which modify the SWIG features set globally or for a specific declaration:

    %dmanifestconst and %dconstvalue(value)

    Out of the box, SWIG generates accessor methods for C #defines and C++ constants. The %dmanifestconst directive enables wrapping these constants as D manifest constants (const in D1, enum in D2).

    For this to work, the C/C++ code for the constant value must directly compile as D code, though. If this is not the case, you can manually override the expression written to the D proxy module using the %dconstvalue directive, passing the new value as parameter.

    For enums, again %dconstvalue can be used to override the value of an enum item if the initializer should not compile in D.

    %dmethodmodifiers

    This directive can be used to override the modifiers for a proxy function. For instance, you could make a public C++ member function private in D like this:

    %dmethodmodifiers A::foo "private";
    
    %inline %{
    struct A {
      void foo();
    };
    %}
    

    22.5 Pragmas

    There are a few SWIG pragmas specific to the D module, which you can use to influence the D code SWIG generates:

    %pragma(d) imdmodulecode

    The passed text (D code) is copied verbatim to the intermediary D module. For example, it can be (and is, internally) used to emit additional private helper code for the use by proxy typemaps.

    %pragma(d) imdmoduleimports

    Additional code to be emitted to the imports section of the intermediary D module (the $importtype macro can be used here). You probably want to use this in conjunction with the imdmodulecode pragma.

    %pragma(d) proxydmodulecode

    Just like proxydmodulecode, the argument is copied to the proxy D module (if SWIG is in split proxy mode and/or the nspace feature is used, it is emitted to the main proxy D module only).

    %pragma(d) globalproxyimports

    The D module currently does not support specifying dependencies on external modules (e.g. from the standard library) for the D typemaps. To add the import statements to the proxy modules (resp. to all proxy modules if in split proxy mode), you can use the globalproxyimports directive.

    For example:

    %typemap(din) char[] "($dinput ? tango.stdc.stringz.toStringz($dinput) : null)"
    %pragma(d) globalproxyimports = "static import tango.stdc.stringz;";
    
    %pragma(d) wrapperloadercode

    The D code for loading the wrapper library (it is copied to the intermediary D module). The $wrapperloaderbindcode variable is replaced by the list of commands for binding the functions from the wrapper library to the symbols in the intermediary D module.

    Each time this pragma is specified, the previous value is overwritten.

    %pragma(d) wrapperloaderbindcommand

    The D command to use for binding the wrapper functions from the C/C++ library to the symbols in the intermediary D module. The $function variable contains the name of the D function in the wrap module, the $symbol variable is replaced by the name of the symbol in the library.

    Each time this pragma is specified, the previous value is overwritten.

    22.6 D Exceptions

    Out of the box, C++ exceptions are fundamentally incompatible to their equivalent in the D world and cannot simply be propagated to a calling D method. There is, however, an easy way to solve this problem: Just catch the exception in the C/C++ wrapper layer, pass the contents to D, and make the wrapper code rethrow the exception in the D world.

    The implementation details of this are a bit crude, but the SWIG D module automatically takes care of this, as long as it is able to detect that an exception could potentially be thrown (e.g. because the C++ method has a throw(...) exception specification).

    As this feature is implemented in exactly the same way it is for C#, please see the C# documentation for a more detailed explanation.

    22.7 D Directors

    When the directors feature is activated, SWIG generates extra code on both the C++ and the D side to enable cross-language polymorphism. Essentially, this means that if you subclass a proxy class in D, C++ code can access any overridden virtual methods just as if you created a derived class in C++.

    There is no D specific documentation yet, but the way the feature is implemented is very similar to how it is done in Java and C#.

    22.8 Other features

    22.8.1 Extended namespace support (nspace)

    By default, SWIG flattens all C++ namespaces into a single target language namespace, but as for Java and C#, the nspace feature is supported for D. If it is active, C++ namespaces are mapped to D packages/modules. Note, however, that like for the other languages, free variables and functions are not supported yet; currently, they are all allows written to the main proxy D module.

    22.8.2 Native pointer support

    Contrary to many of the scripting languages supported by SWIG, D fully supports C-style pointers. The D module thus includes a custom mechanism to wrap C pointers directly as D pointers where applicable, that is, if the type that is pointed to is represented the same in C and D (on the bit-level), dubbed a primitive type below.

    Central to this custom pointer handling scheme are two typemap attributes: the cprimitive attribute on the dtype typemap and the nativepointer attribute on all the typemaps which influence the D side of the code (dtype, din, dout, ...). When a D typemap is looked up, the following happens behind the scenes:

    First, the matching typemap is determined by the usual typemap lookup rules. Then, it is checked if the result has the nativepointer attribute set. If it is present, it means that its value should replace the typemap value if and only if the actual type the typemap is looked up for is a primitive type, a pointer to a primitive type (through an arbitrary level of indirections), or a function pointer with only primitive types in its signature.

    To determine if a type should be considered primitive, the cprimitive attribute on its dtype attribute is used. For example, the dtype typemap for float has cprimitive="1", so the code from the nativepointer attribute is taken into account e.g. for float ** or the function pointer float (*)(float *).

    22.8.3 Operator overloading

    The D module comes with basic operator overloading support for both D1 and D2. There are, however, a few limitations arising from conceptual differences between C++ and D:

    The first key difference is that C++ supports free functions as operators (along with argument-dependent lookup), while D requires operators to be member functions of the class they are operating on. SWIG can only automatically generate wrapping code for member function operators; if you want to use operators defined as free functions in D, you need to handle them manually.

    Another set of differences between C++ and D concerns individual operators. For example, there are quite a few operators which are overloadable in C++, but not in D, for example && and || , but also !, and prefix increment/decrement operators in D1 resp. their postfix pendants in D2.

    There are also some cases where the operators can be translated to D, but the differences in the implementation details are big enough that a rather involved scheme would be required for automatic wrapping them, which has not been implemented yet. This affects, for example, the array subscript operator, [], in combination with assignments - while operator [] in C++ simply returns a reference which is then written to, D resorts to a separate opIndexAssign method -, or implicit casting (which was introduced in D2 via alias this ). Despite the lack of automatic support, manually handling these cases should be perfectly possible.

    22.8.4 Running the test-suite

    As with any other language, the SWIG test-suite can be built for D using the *-d-test-suite targets of the top-level Makefile. By default, D1 is targeted, to build it with D2, use the optional D_VERSION variable, e.g. make check-d-test-suite D_VERSION=2 .

    Note: If you want to use GDC on Linux or another platform which requires you to link libdl for dynamically loading the shared library, you might have to add -ldl manually to the d_compile target in Examples/Makefile, because GDC does not currently honor the pragma(lib, ...) statement.

    22.9 D Typemap examples

    There are no D-specific typemap examples yet. However, with the above name comparison table, you should be able to get an idea what can be done by looking at the corresponding C# section.

    22.10 Work in progress and planned features

    There are a couple of features which are not implemented yet, but would be very useful and might be added in the near future:

    • Static linking: Currently, the C wrapper code is compiled into a dynamic library, out of which the symbol addresses are looked up at runtime by the D part. If statically linking the different languages into one binary was supported, a tool-chain capable of performing IPO at link time could inline the wrapping code, effectively reducing the overhead for simple calls to zero.
    • C array handling: Many data structures in some C/C++ libraries contain array containing of a pointer to the first element and the element count. Currently, one must manually writing wrapper code to be able to access these from D. It should be possible to add a set of SWIG macros to semi-automatically generate conversion code.

    Some generated code might also be a bit rough around the edges, particularly in the following areas:

    • Memory management: Although the currently generated wrapper code works fine with regard to the GC for the test-suite, there might be issues coming up in real-world multi-threaded usage.
    • D2 support: Originally, the module has been developed for the use with D1, D2/Phobos support has been added in later. The basic features should work equally well for both, but there could be issues concerning const-correctness etc.

    23 SWIG and Go

    This chapter describes SWIG's support of Go. For more information on the Go programming language see golang.org .

    23.1 Overview

    Go does not support direct calling of functions written in C/C++. The cgo program may be used to generate wrappers to call C code from Go, but there is no convenient way to call C++ code. SWIG fills this gap.

    There are (at least) two different Go compilers. The first is the gc compiler of the Go distribution, normally invoked via the go tool. The second Go compiler is the gccgo compiler, which is a frontend to the GCC compiler suite. The interface to C/C++ code is completely different for the two Go compilers. SWIG supports both Go compilers, selected by the -gccgo command line option.

    Go is a type-safe compiled language and the wrapper code generated by SWIG is type-safe as well. In case of type issues the build will fail and hence SWIG's runtime library and runtime type checking are not used.

    23.2 Examples

    Working examples can be found in the SWIG source tree .

    Please note that the examples in the SWIG source tree use makefiles with the .i SWIG interface file extension for backwards compatibility with Go 1.

    23.3 Running SWIG with Go

    Most Go programs are built using the go tool. Since Go 1.1 the go tool has support for SWIG. To use it, give your SWIG interface file the extension .swig (for C code) or .swigcxx (for C++ code). Put that file in a GOPATH/src directory as usual for Go sources. Put other C/C++ code in the same directory with extensions of .c and .cxx. The go build and go install commands will automatically run SWIG for you and compile the generated wrapper code. To check the SWIG command line options the go tool uses run go build -x. To access the automatically generated files run go build -work. You'll find the files under the temporary WORK directory.

    To manually generate and compile C/C++ wrapper code for Go, use the -go option with SWIG. By default SWIG will generate code for the Go compiler of the Go distribution. To generate code for gccgo, you should also use the -gccgo option.

    When using the -cgo option, SWIG will generate files that can be used directly by go build. Starting with the Go 1.5 distribution the -cgo option has to be given. Put your SWIG interface file in a directory under GOPATH/src, and give it a name that does not end in the .swig or .swigcxx extension. Typically the SWIG interface file extension is .i in this case.

    % swig -go -cgo example.i
    % go install
    

    You will now have a Go package that you can import from other Go packages as usual.

    To use SWIG without the -cgo option, more steps are required. Recall that this only works with Go versions before 1.5. When using Go version 1.2 or later, or when using gccgo, the code generated by SWIG can be linked directly into the Go program. A typical command sequence when using the Go compiler of the Go distribution would look like this:

    % swig -go example.i
    % gcc -c code.c    # The C library being wrapped.
    % gcc -c example_wrap.c
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
    % go tool 6g main.go
    % go tool 6l main.6
    

    You can also put the wrapped code into a shared library, and when using the Go versions before 1.2 this is the only supported option. A typical command sequence for this approach would look like this:

    % swig -go -use-shlib example.i
    % gcc -c -fpic example.c
    % gcc -c -fpic example_wrap.c
    % gcc -shared example.o example_wrap.o -o example.so
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6
    % go tool 6g main.go  # your code, not generated by SWIG
    % go tool 6l main.6
    

    23.3.1 Go-specific Commandline Options

    These are the command line options for SWIG's Go module. They can also be seen by using:

    swig -go -help
    
    Go-specific options
    -cgoGenerate files to be used as input for the Go cgo tool. This option is required for Go 1.5 and later, and works for Go 1.2 and later. In the future this option will likely become the default.
    -intgosize <s>Set the size for the Go type int . This controls the size that the C/C++ code expects to see. The <s> argument should be 32 or 64. This option is currently required during the transition from Go 1.0 to Go 1.1, as the size of int on 64-bit x86 systems changes between those releases (from 32 bits to 64 bits). In the future the option may become optional, and SWIG will assume that the size of int is the size of a C pointer.
    -gccgoGenerate code for gccgo. The default is to generate code for the Go compiler of the Go distribution.
    -package <name>Set the name of the Go package to <name>. The default package name is the SWIG module name.
    -use-shlibTell SWIG to emit code that uses a shared library. This is only meaningful for the Go compiler of the Go distribution, which needs to know at compile time whether a shared library will be used.
    -soname <name>Set the runtime name of the shared library that the dynamic linker should include at runtime. The default is the package name with ".so" appended. This is only used when generating code for the Go compiler of the Go distribution; when using gccgo, the equivalent name will be taken from the -soname option passed to the linker. Using this option implies the -use-shlib option.
    -go-pkgpath <pkgpath>When generating code for gccgo, set the pkgpath to use. This corresponds to the -fgo-pkgpath option to gccgo.
    -go-prefix <prefix>When generating code for gccgo, set the prefix to use. This corresponds to the -fgo-prefix option to gccgo. If -go-pkgpath is used, -go-prefix will be ignored.

    23.3.2 Generated Wrapper Files

    There are two different approaches to generating wrapper files, controlled by SWIG's -cgo option. The -cgo option works with Go version 1.2 or later. It is required when using Go version 1.5 or later.

    With or without the -cgo option, SWIG will generate the following files when generating wrapper code:

    • MODULE.go will contain the Go functions that your Go code will call. These functions will be wrappers for the C++ functions defined by your module. This file should, of course, be compiled with the Go compiler.
    • MODULE_wrap.c or MODULE_wrap.cxx will contain C/C++ functions will be invoked by the Go wrapper code. This file should be compiled with the usual C or C++ compiler.
    • MODULE_wrap.h will be generated if you use the directors feature. It provides a definition of the generated C++ director classes. It is generally not necessary to use this file, but in some special cases it may be helpful to include it in your code, compiled with the usual C or C++ compiler.

    When neither the -cgo nor the -gccgo option is used, SWIG will also generate an additional file:

    • MODULE_gc.c will contain C code which should be compiled with the C compiler distributed as part of the gc compiler. It should then be combined with the compiled MODULE.go using go tool pack.

    23.4 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Go interface to your C/C++ code. However, the languages are somewhat different, so some modifications have to occur. This section briefly covers the essential aspects of this wrapping.

    23.4.1 Go Package Name

    All Go source code lives in a package. The name of this package will default to the name of the module from SWIG's %module directive. You may override this by using SWIG's -package command line option.

    23.4.2 Go Names

    In Go, a function is only visible outside the current package if the first letter of the name is uppercase. This is quite different from C/C++. Because of this, C/C++ names are modified when generating the Go interface: the first letter is forced to be uppercase if it is not already. This affects the names of functions, methods, variables, constants, enums, and classes.

    C/C++ variables are wrapped with setter and getter functions in Go. First the first letter of the variable name will be forced to uppercase, and then Get or Set will be prepended. For example, if the C/C++ variable is called var, then SWIG will define the functions GetVar and SetVar. If a variable is declared as const, or if SWIG's %immutable directive is used for the variable, then only the getter will be defined.

    C++ classes will be discussed further below. Here we'll note that the first letter of the class name will be forced to uppercase to give the name of a type in Go. A constructor will be named New followed by that name, and the destructor will be named Delete followed by that name.

    23.4.3 Go Constants

    C/C++ constants created via #define or the %constant directive become Go constants, declared with a const declaration.

    23.4.4 Go Enumerations

    C/C++ enumeration types will cause SWIG to define an integer type with the name of the enumeration (with first letter forced to uppercase as usual). The values of the enumeration will become variables in Go; code should avoid modifying those variables.

    23.4.5 Go Classes

    Go has interfaces, methods and inheritance, but it does not have classes in the same sense as C++. This sections describes how SWIG represents C++ classes represented in Go.

    For a C++ class ClassName, SWIG will define two types in Go: an underlying type, which will just hold a pointer to the C++ type, and an interface type. The interface type will be named ClassName . SWIG will define a function NewClassName which will take any constructor arguments and return a value of the interface type ClassName. SWIG will also define a destructor DeleteClassName .

    SWIG will represent any methods of the C++ class as methods on the underlying type, and also as methods of the interface type. Thus C++ methods may be invoked directly using the usual val.MethodName syntax. Public members of the C++ class will be given getter and setter functions defined as methods of the class.

    SWIG will represent static methods of C++ classes as ordinary Go functions. SWIG will use names like ClassNameMethodName. SWIG will give static members getter and setter functions with names like GetClassName_VarName.

    Given a value of the interface type, Go code can retrieve the pointer to the C++ type by calling the Swigcptr method. This will return a value of type SwigcptrClassName, which is just a name for uintptr. A Go type conversion can be used to convert this value to a different C++ type, but note that this conversion will not be type checked and is essentially equivalent to reinterpret_cast. This should only be used for very special cases, such as where C++ would use a dynamic_cast.

    Note that C++ pointers to compound objects are represented in go as objects themselves, not as go pointers. So, for example, if you wrap the following function:

    class MyClass {
      int MyMethod();
      static MyClass *MyFactoryFunction();
    };
    
    

    You will get go code that looks like this:

    type MyClass interface {
      Swigcptr() uintptr
      SwigIsMyClass()
      MyMethod() int
    }
    
    func MyClassMyFactoryFunction() MyClass {
      // swig magic here
    }
    

    Note that the factory function does not return a go pointer; it actually returns a go interface. If the returned pointer can be null, you can check for this by calling the Swigcptr() method.

    23.4.5.1 Go Class Memory Management

    Calling NewClassName for a C++ class ClassName will allocate memory using the C++ memory allocator. This memory will not be automatically freed by Go's garbage collector as the object ownership is not tracked. When you are done with the C++ object you must free it using DeleteClassName.

    The most Go idiomatic way to manage the memory for some C++ class is to call NewClassName followed by a defer of the DeleteClassName call. Using defer ensures that the memory of the C++ object is freed as soon as the function containing the defer statement returns. Furthemore defer works great for short-lived objects and fits nicely C++'s RAII idiom. Example:

    func UseClassName(...) ... {
      o := NewClassName(...)
      defer DeleteClassName(o)
      // Use the ClassName object
      return ...
    }
    

    With increasing complexity, especially complex C++ object hierarchies, the correct placement of defer statements becomes harder and harder as C++ objects need to be freed in the correct order. This problem can be eased by keeping a C++ object function local so that it is only available to the function that creates a C++ object and functions called by this function. Example:

    func WithClassName(constructor args, f func(ClassName, ...interface{}) error, data ...interface{}) error {
      o := NewClassName(constructor args)
      defer DeleteClassName(o)
      return f(o, data...)
    }
    
    func UseClassName(o ClassName, data ...interface{}) (err error) {
      // Use the ClassName object and additional data and return error.
    }
    
    func main() {
      WithClassName(constructor args, UseClassName, additional data)
    }
    

    Using defer has limitations though, especially when it comes to long-lived C++ objects whichs lifetimes are hard to predict. For such C++ objects a common technique is to store the C++ object into a Go object, and to use the Go function runtime.SetFinalizer to add a finalizer which frees the C++ object when the Go object is freed. It is strongly recommended to read the runtime.SetFinalizer documentation before using this technique to understand the runtime.SetFinalizer limitations.

    Common pitfalls with runtime.SetFinalizer are:

    • If a hierarchy of C++ objects will be automatically freed by Go finalizers then the Go objects that store the C++ objects need to replicate the hierarchy of the C++ objects to prevent that C++ objects are freed prematurely while other C++ objects still rely on them.
    • The usage of Go finalizers is problematic with C++'s RAII idiom as it isn't predictable when the finalizer will run and this might require a Close or Delete method to be added the Go object that stores a C++ object to mitigate.
    • The Go finalizer function typically runs in a different OS thread which can be problematic with C++ code that uses thread-local storage.

    runtime.SetFinalizer Example:

    import (
      "runtime"
      "wrap" // SWIG generated wrapper code
    )
    
    type GoClassName struct {
      wcn wrap.ClassName
    }
    
    func NewGoClassName() *GoClassName {
      o := &GoClassName{wcn: wrap.NewClassName()}
      runtime.SetFinalizer(o, deleteGoClassName)
      return o
    }
    
    func deleteGoClassName(o *GoClassName) {
      // Runs typically in a different OS thread!
      wrap.DeleteClassName(o.wcn)
      o.wcn = nil
    }
    
    func (o *GoClassName) Close() {
      // If the C++ object has a Close method.
      o.wcn.Close()
    
      // If the GoClassName object is no longer in an usable state.
      runtime.SetFinalizer(o, nil) // Remove finalizer.
      deleteGoClassName() // Free the C++ object.
    }
    

    23.4.5.2 Go Class Inheritance

    C++ class inheritance is automatically represented in Go due to its use of interfaces. The interface for a child class will be a superset of the interface of its parent class. Thus a value of the child class type in Go may be passed to a function which expects the parent class. Doing the reverse will require an explicit type assertion, which will be checked dynamically.

    23.4.6 Go Templates

    In order to use C++ templates in Go, you must tell SWIG to create wrappers for a particular template instantation. To do this, use the %template directive.

    23.4.7 Go Director Classes

    SWIG's director feature permits a Go type to act as the subclass of a C++ class. This is complicated by the fact that C++ and Go define inheritance differently. SWIG normally represents the C++ class inheritance automatically in Go via interfaces but with a Go type representing a subclass of a C++ class some manual work is necessary.

    This subchapter gives a step by step guide how to properly sublass a C++ class with a Go type. In general it is strongly recommended to follow this guide completely to avoid common pitfalls with directors in Go.

    23.4.7.1 Example C++ code

    The step by step guide is based on two example C++ classes. FooBarAbstract is an abstract C++ class and the FooBarCpp class inherits from it. This guide explains how to implement a FooBarGo class similar to the FooBarCpp class.

    FooBarAbstract abstract C++ class:

    class FooBarAbstract
    {
    public:
      FooBarAbstract() {};
      virtual ~FooBarAbstract() {};
    
      std::string FooBar() {
              return this->Foo() + ", " + this->Bar();
      };
    
    protected:
      virtual std::string Foo() {
              return "Foo";
      };
    
      virtual std::string Bar() = 0;
    };
    

    FooBarCpp C++ class:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    Returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    23.4.7.2 Enable director feature

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Second, you must use the %feature("director") directive to tell SWIG which classes should get directors. In the example the FooBarAbstract class needs the director feature enabled so that the FooBarGo class can inherit from it, like this:

    %feature("director") FooBarAbstract;
    

    For a more detailed documentation of the director feature and how to enable or disable it for specific classes and virtual methods see SWIG's Java documentation on directors.

    23.4.7.3 Constructor and destructor

    SWIG creates an additional set of constructor and destructor functions once the director feature has been enabled for a C++ class. NewDirectorClassName allows overriding virtual methods on the new object instance and DeleteDirectorClassName needs to be used to free a director object instance created with NewDirectorClassName. More on overriding virtual methods follows later in this guide under overriding virtual methods.

    The default constructor and destructor functions NewClassName and DeleteClassName can still be used as before so that existing code doesn't break just because the director feature has been enabled for a C++ class. The behavior is undefined if the default and director constructor and destructor functions get mixed and so great care needs to be taken that only one of the constructor and destructor function pairs is used for any object instance. Both constructor functions, the default and the director one, return the same interface type. This makes it potentially hard to know which destructor function, the default or the director one, needs to be called to delete an object instance.

    In theory the DirectorInterface method could be used to determine if an object instance was created via NewDirectorClassName:

    if o.DirectorInterface() != nil {
      DeleteDirectorClassName(o)
    } else {
      DeleteClassName(o)
    }
    

    In practice it is strongly recommended to embed a director object instance in a Go struct so that a director object instance will be represented as a distinct Go type that subclasses a C++ class. For this Go type custom constructor and destructor functions take care of the director constructor and destructor function calls and the resulting Go class will appear to the user as any other SWIG wrapped C++ class. More on properly subclassing a C++ class follows later in this guide under subclass via embedding .

    23.4.7.4 Override virtual methods

    In order to override virtual methods on a C++ class with Go methods the NewDirectorClassName constructor functions receives a DirectorInterface argument. The methods in the DirectorInterface are a subset of the public and protected virtual methods of the C++ class. If the DirectorInterface contains a method with a matching signature to a virtual method of the C++ class then the virtual C++ method will be overwritten with the Go method. As Go doesn't support protected methods all overriden protected virtual C++ methods will be public in Go.

    As an example see part of the FooBarGo class:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      ...
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      ...
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
      ...
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the virtual methods FooBarAbstract::Foo and FooBarAbstract::Bar have been overwritten with Go methods similarly to how the FooBarAbstract virtual methods are overwritten by the FooBarCpp class.

    The DirectorInterface in the example is implemented by the overwrittenMethodsOnFooBarAbstract Go struct type. A pointer to a overwrittenMethodsOnFooBarAbstract struct instance will be given to the NewDirectorFooBarAbstract constructor function. The constructor return value implements the FooBarAbstract interface. overwrittenMethodsOnFooBarAbstract could in theory be any Go type but in practice a struct is used as it typically contains at least a value of the C++ class interface so that the overwritten methods can use the rest of the C++ class. If the FooBarGo class would receive additional constructor arguments then these would also typically be stored in the overwrittenMethodsOnFooBarAbstract struct so that they can be used by the Go methods.

    23.4.7.5 Call base methods

    Often a virtual method will be overwritten to extend the original behavior of the method in the base class. This is also the case for the FooBarCpp::Foo method of the example code:

    virtual std::string Foo() {
      return "C++ " + FooBarAbstract::Foo();
    }
    

    To use base methods the DirectorClassNameMethodName wrapper functions are automatically generated by SWIG for public and protected virtual methods. The FooBarGo.Foo implementation in the example looks like this:

    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    23.4.7.6 Subclass via embedding

    As previously mentioned in this guide the default and director constructor functions return the same interface type. To properly subclass a C++ class with a Go type the director object instance returned by the NewDirectorClassName constructor function should be embedded into a Go struct so that it represents a distinct but compatible type in Go's type system. This Go struct should be private and the constructor and destructor functions should instead work with a public interface type so that the Go class that subclasses a C++ class can be used as a compatible drop in.

    The subclassing part of the FooBarGo class for an example looks like this:

    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
    
      return &fooBarGo{FooBarAbstract: fb}
    }
    
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the private fooBarGo struct embeds FooBarAbstract which lets the fooBarGo Go type "inherit" all the methods of the FooBarAbstract C++ class by means of embedding. The public FooBarGo interface type includes the FooBarAbstract interface and hence FooBarGo can be used as a drop in replacement for FooBarAbstract while the reverse isn't possible and would raise a compile time error. Furthemore the constructor and destructor functions NewFooBarGo and DeleteFooBarGo take care of all the director specifics and to the user the class appears as any other SWIG wrapped C++ class.

    23.4.7.7 Memory management with runtime.SetFinalizer

    In general all guidelines for C++ class memory management apply as well to director classes. One often overlooked limitation with runtime.SetFinalizer is that a finalizer doesn't run in case of a cycle and director classes typically have a cycle. The cycle in the FooBarGo class is here:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om) // fb.v = om
      om.fb = fb // Backlink causes cycle as fb.v = om!
      ...
    }
    

    In order to be able to use runtime.SetFinalizer nevertheless the finalizer needs to be set on something that isn't in a cycle and that references the director object instance. In the FooBarGo class example the FooBarAbstract director instance can be automatically deleted by setting the finalizer on fooBarGo:

    type fooBarGo struct {
      FooBarAbstract
    }
    
    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    

    Furthermore if runtime.SetFinalizer is in use either the DeleteClassName destructor function needs to be removed or the fooBarGo struct needs additional data to prevent double deletion. Please read the C++ class memory management subchapter before using runtime.SetFinalizer to know all of its gotchas.

    23.4.7.8 Complete FooBarGo example class

    The complete and annotated FooBarGo class looks like this:

    // FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
    // drop in replacement for FooBarAbstract but the reverse causes a compile time
    // error.
    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    // Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    // The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
    // This is also how the class hierarchy gets represented by the SWIG generated
    // wrapper code.  For an instance FooBarCpp has the IsFooBarAbstract and
    // IsFooBarCpp methods.
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    // Go type that defines the DirectorInterface. It contains the Foo and Bar
    // methods that overwrite the respective virtual C++ methods on FooBarAbstract.
    type overwrittenMethodsOnFooBarAbstract struct {
      // Backlink to FooBarAbstract so that the rest of the class can be used by
      // the overridden methods.
      fb FooBarAbstract
    
      // If additional constructor arguments have been given they are typically
      // stored here so that the overriden methods can use them.
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      // DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      return "Go Bar"
    }
    
    func NewFooBarGo() FooBarGo {
      // Instantiate FooBarAbstract with selected methods overridden.  The methods
      // that will be overwritten are defined on
      // overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
      // respective virtual C++ methods. Furthermore additional constructor
      // arguments will be typically stored in the
      // overwrittenMethodsOnFooBarAbstract struct.
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      // The memory of the FooBarAbstract director object instance can be
      // automatically freed once the FooBarGo instance is garbage collected by
      // uncommenting the following line.  Please make sure to understand the
      // runtime.SetFinalizer specific gotchas before doing this.  Furthemore
      // DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
      // struct needs additional data to prevent double deletion.
      // runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    
    // Recommended to be removed if runtime.SetFinalizer is in use.
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    Returned string by the FooBarGo.FooBar method is:

    Go Foo, Go Bar
    

    For comparison the FooBarCpp class looks like this:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    For comparison the returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete source of this example can be found under SWIG/Examples/go/director/.

    23.4.8 Default Go primitive type mappings

    The following table lists the default type mapping from C/C++ to Go. This table will tell you which Go type to expect for a function which uses a given C/C++ type.

    C/C++ typeGo type
    boolbool
    charbyte
    signed charint8
    unsigned charbyte
    shortint16
    unsigned shortuint16
    intint
    unsigned intuint
    longint64
    unsigned longuint64
    long longint64
    unsigned long longuint64
    floatfloat32
    doublefloat64
    char *
    char []
    string

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    These type mappings are defined by the "gotype" typemap. You may change that typemap, or add new values, to control how C/C++ types are mapped into Go types.

    23.4.9 Output arguments

    Because of limitations in the way output arguments are processed in swig, a function with output arguments will not have multiple return values. Instead, you must pass a pointer into the C++ function to tell it where to store the output value. In go, you supply a slice in the place of the output argument.

    For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters):

    double modf(double x, double *ip);
    

    You could wrap it with SWIG as follows:

    %include <typemaps.i>
    double modf(double x, double *OUTPUT);
    

    or you can use the %apply directive:

    %include <typemaps.i>
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    

    In Go you would use it like this:

    ptr := []float64{0.0}
    fraction := modulename.Modf(5.0, ptr)
    

    Since this is ugly, you may want to wrap the swig-generated API with some additional functions written in go that hide the ugly details.

    There are no char *OUTPUT typemaps. However you can apply the signed char * typemaps instead:

    %include <typemaps.i>
    %apply signed char *OUTPUT {char *output};
    void f(char *output);
    

    23.4.10 Adding additional go code

    Often the APIs generated by swig are not very natural in go, especially if there are output arguments. You can insert additional go wrapping code to add new APIs with %insert(go_wrapper), like this:

    %include <typemaps.i>
    // Change name of what swig generates to Wrapped_modf.  This function will
    // have the following signature in go:
    //   func Wrapped_modf(float64, []float64) float64
    %rename(wrapped_modf) modf(double x, double *ip);
    
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    
    %insert(go_wrapper) %{
    
    // The improved go interface to this function, which has two return values,
    // in the more natural go idiom:
    func Modf(x float64) (fracPart float64, intPart float64) {
      ip := []float64{0.0}
      fracPart = Wrapped_modf(x, ip)
      intPart = ip[0]
      return
    }
    
    %}
    

    For classes, since swig generates an interface, you can add additional methods by defining another interface that includes the swig-generated interface. For example,

    %rename(Wrapped_MyClass) MyClass;
    %rename(Wrapped_GetAValue) MyClass::GetAValue(int *x);
    %apply int *OUTPUT { int *x };
    
    class MyClass {
     public:
      MyClass();
      int AFineMethod(const char *arg); // Swig's wrapping is fine for this one.
      bool GetAValue(int *x);
    };
    
    %insert(go_wrapper) %{
    
    type MyClass interface {
      Wrapped_MyClass
      GetAValue() (int, bool)
    }
    
    func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
      ip := []int{0}
      ok := arg.Wrapped_GetAValue(ip)
      return ip[0], ok
    }
    
    %}
    

    Of course, if you have to rewrite most of the methods, instead of just a few, then you might as well define your own struct that includes the swig-wrapped object, instead of adding methods to the swig-generated object.

    If you need to import other go packages, you can do this with %go_import. For example,

    %go_import("fmt", _ "unusedPackage", rp "renamed/package")
    
    %insert(go_wrapper) %{
    
    func foo() {
      fmt.Println("Some string:", rp.GetString())
    }
    
    // Importing the same package twice is permitted,
    // Go code will be generated with only the first instance of the import.
    %go_import("fmt")
    
    %insert(go_wrapper) %{
    
    func bar() {
      fmt.Println("Hello world!")
    }
    
    %}
    

    23.4.11 Go typemaps

    You can use the %typemap directive to modify SWIG's default wrapping behavior for specific C/C++ types. You need to be familiar with the material in the general "Typemaps" chapter. That chapter explains how to define a typemap. This section describes some specific typemaps used for Go.

    In general type conversion code may be written either in C/C++ or in Go. The choice to make normally depends on where memory should be allocated. To allocate memory controlled by the Go garbage collector, write Go code. To allocate memory in the C/C++ heap, write C code.

    TypemapDescription
    gotype The Go type to use for a C++ type. This type will appear in the generated Go wrapper function. If this is not defined SWIG will use a default as described above.
    imtype An intermediate Go type used by the "goin", "goout", "godirectorin", and "godirectorout" typemaps. If this typemap is not defined for a C/C++ type, the gotype typemape will be used. This is useful when gotype is best converted to C/C++ using Go code.
    goin Go code to convert from gotype to imtype when calling a C/C++ function. SWIG will then internally convert imtype to a C/C++ type and pass it down. If this is not defined, or is the empty string, no conversion is done.
    in C/C++ code to convert the internally generated C/C++ type, based on imtype, into the C/C++ type that a function call expects. If this is not defined the value will simply be cast to the desired type.
    out C/C++ code to convert the C/C++ type that a function call returns into the internally generated C/C++ type, based on imtype, that will be returned to Go. If this is not defined the value will simply be cast to the desired type.
    goout Go code to convert a value returned from a C/C++ function from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    argout C/C++ code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. This uses the internally generated C/C++ type, based on imtype. This is only useful for a pointer type of some sort. If this is not defined nothing will be done.
    goargout Go code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. The value will be in imtype. This is only useful for a pointer type of some sort. If this is not defined, or is the empty string, nothing will be done.
    directorin C/C++ code to convert the C/C++ type used to call a director method into the internally generated C/C++ type, based on imtype, that will be passed to Go. If this is not defined the value will simply be cast to the desired type.
    godirectorin Go code to convert a value used to call a director method from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    godirectorout Go code to convert a value returned from a director method from gotype to imtype. If this is not defined, or is the empty string, no conversion is done.
    directorout C/C++ code to convert a value returned from a director method from the internally generated C/C++ type, based on imtype, into the type that the method should return If this is not defined the value will simply be cast to the desired type.

    24 SWIG and Guile

    This section details guile-specific support in SWIG.

    24.1 Supported Guile Versions

    SWIG works with Guile versions 1.8.x and 2.0.x. Support for version 1.6.x has been dropped. The last version of SWIG that still works with Guile version 1.6.x is SWIG 2.0.9.

    Note that starting with guile 2.0, the guile sources can be compiled for improved performance. This is currently not tested with swig so your mileage may vary. To be safe set environment variable GUILE_AUTO_COMPILE to 0 when using swig generated guile code.

    24.2 Meaning of "Module"

    There are three different concepts of "module" involved, defined separately for SWIG, Guile, and Libtool. To avoid horrible confusion, we explicitly prefix the context, e.g., "guile-module".

    24.3 Old GH Guile API

    Guile 1.8 and older could be interfaced using two different api's, the SCM or the GH API. The GH interface to guile is deprecated. Read more about why in the Guile manual.

    Support for the guile GH wrapper code generation has been dropped from SWIG. The last version of SWIG that can still generate guile GH wrapper code is 2.0.9. Please use that version if you really need the GH wrapper code.

    24.4 Linkage

    Guile support is complicated by a lack of user community cohesiveness, which manifests in multiple shared-library usage conventions. A set of policies implementing a usage convention is called a linkage.

    24.4.1 Simple Linkage

    The default linkage is the simplest; nothing special is done. In this case the function SWIG_init() is exported. Simple linkage can be used in several ways:

    • Embedded Guile, no modules. You want to embed a Guile interpreter into your program; all bindings made by SWIG shall show up in the root module. Then call SWIG_init() in the inner_main() function. See the "simple" and "matrix" examples under Examples/guile.
    • Dynamic module mix-in. You want to create a Guile module using define-module, containing both Scheme code and bindings made by SWIG; you want to load the SWIG modules as shared libraries into Guile.

      (define-module (my module))
      (define my-so (dynamic-link "./libexample.so"))
      (dynamic-call "SWIG_init" my-so) ; make SWIG bindings
      ;; Scheme definitions can go here
      

      Newer Guile versions provide a shorthand for dynamic-link and dynamic-call:

      (load-extension "./libexample.so" "SWIG_init")
      

      A more portable approach would be to drop the shared library extension:

      (load-extension "./libexample" "SWIG_init")
      

      You need to explicitly export those bindings made by SWIG that you want to import into other modules:

      (export foo bar)
      

      In this example, the procedures foo and bar would be exported. Alternatively, you can export all bindings with the following module-system hack:

      (module-map (lambda (sym var)
                    (module-export! (current-module) (list sym)))
                  (current-module))
      

      SWIG can also generate this Scheme stub (from define-module up to export) semi-automagically if you pass it the command-line argument -scmstub. The code will be exported in a file called module.scm in the directory specified by -outdir or the current directory if -outdir is not specified. Since SWIG doesn't know how to load your extension module (with dynamic-link or load-extension), you need to supply this information by including a directive like this in the interface file:

      %scheme %{ (load-extension "./libexample.so" "SWIG_init") %}
      

      (The %scheme directive allows to insert arbitrary Scheme code into the generated file module.scm; it is placed between the define-module form and the export form.)

    If you want to include several SWIG modules, you would need to rename SWIG_init via a preprocessor define to avoid symbol clashes. For this case, however, passive linkage is available.

    24.4.2 Passive Linkage

    Passive linkage is just like simple linkage, but it generates an initialization function whose name is derived from the module and package name (see below).

    You should use passive linkage rather than simple linkage when you are using multiple modules.

    24.4.3 Native Guile Module Linkage

    SWIG can also generate wrapper code that does all the Guile module declarations on its own if you pass it the -Linkage module command-line option.

    The module name is set with the -package and -module command-line options. Suppose you want to define a module with name (my lib foo); then you would have to pass the options -package my/lib -module foo . Note that the last part of the name can also be set via the SWIG directive %module.

    You can use this linkage in several ways:

    • Embedded Guile with SWIG modules. You want to embed a Guile interpreter into your program; the SWIG bindings shall be put into different modules. Simply call the function scm_init_my _modules_foo_module in the inner_main() function.
    • Dynamic Guile modules. You want to load the SWIG modules as shared libraries into Guile; all bindings are automatically put in newly created Guile modules.
      (define my-so (dynamic-link "./libfoo"))
      ;; create new module and put bindings there:
      (dynamic-call "scm_init_my_modules_foo_module" my-so) 
      
      Newer Guile versions have a shorthand procedure for this:
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module")
      

    24.4.4 Old Auto-Loading Guile Module Linkage

    Guile used to support an autoloading facility for object-code modules. This support has been marked deprecated in version 1.4.1 and is going to disappear sooner or later. SWIG still supports building auto-loading modules if you pass it the -Linkage ltdlmod command-line option.

    Auto-loading worked like this: Suppose a module with name (my lib foo) is required and not loaded yet. Guile will then search all directories in its search path for a Scheme file my/modules/foo.scm or a shared library my/ modules/libfoo.so (or my/ modules/libfoo.la; see the GNU libtool documentation). If a shared library is found that contains the symbol scm_init_my_modules_foo_module, the library is loaded, and the function at that symbol is called with no arguments in order to initialize the module.

    When invoked with the -Linkage ltdlmod command-line option, SWIG generates an exported module initialization function with an appropriate name.

    24.4.5 Hobbit4D Linkage

    The only other linkage supported at this time creates shared object libraries suitable for use by hobbit's (hobbit4d link) guile module. This is called the "hobbit" linkage, and requires also using the "-package" command line option to set the part of the module name before the last symbol. For example, both command lines:

    swig -guile -package my/lib foo.i
    swig -guile -package my/lib -module foo foo.i
    

    would create module (my lib foo) (assuming in the first case foo.i declares the module to be "foo"). The installed files are my/lib/libfoo.so.X.Y.Z and friends. This scheme is still very experimental; the (hobbit4d link) conventions are not well understood.

    24.5 Underscore Folding

    Underscores are converted to dashes in identifiers. Guile support may grow an option to inhibit this folding in the future, but no one has complained so far.

    You can use the SWIG directives %name and %rename to specify the Guile name of the wrapped functions and variables (see CHANGES).

    24.6 Typemaps

    The Guile module handles all types via typemaps. This information is read from Lib/guile/typemaps.i. Some non-standard typemap substitutions are supported:

    • $descriptor expands to a type descriptor for use with the SWIG_NewPointerObj() and SWIG_ConvertPtr functions.
    • For pointer types, $*descriptor expands to a descriptor for the direct base type (i.e., one pointer is stripped), whereas $basedescriptor expands to a descriptor for the base type (i.e., all pointers are stripped).

    A function returning void (more precisely, a function whose out typemap returns SCM_UNSPECIFIED) is treated as returning no values. In argout typemaps, one can use the macro GUILE_APPEND_RESULT in order to append a value to the list of function return values.

    Multiple values can be passed up to Scheme in one of three ways:

    • Multiple values as lists. By default, if more than one value is to be returned, a list of the values is created and returned; to switch back to this behavior, use

      %values_as_list;
    • Multiple values as vectors. By issuing

      %values_as_vector;

      vectors instead of lists will be used.

    • Multiple values for multiple-value continuations. This is the most elegant way. By issuing

      %multiple_values;

      multiple values are passed to the multiple-value continuation, as created by call-with-values or the convenience macro receive. The latter is available if you issue (use-modules (srfi srfi-8)). Assuming that your divide function wants to return two values, a quotient and a remainder, you can write:

      (receive (quotient remainder)
          (divide 35 17)
        body...)
      

      In body, the first result of divide will be bound to the variable quotient, and the second result to remainder.

    See also the "multivalue" example.

    Constants are exported as a function that returns the value. The %feature("constasvar") can be applied to any constant, immutable variable, or enum. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. See Features and the %feature directive for info on how to apply the %feature.

    24.7 Representation of pointers as smobs

    For pointer types, SWIG uses Guile smobs. SWIG smobs print like this: #<swig struct xyzzy * 0x1234affe> Two of them are equal? if and only if they have the same type and value.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(), passing a pointer to a struct representing the pointer type. The type index to store in the upper half of the CAR is read from this struct. To get the pointer represented by a smob, the wrapper code calls the function SWIG_ConvertPtr(), passing a pointer to a struct representing the expected pointer type. See also The run-time type checker. If the Scheme object passed was not a SWIG smob representing a compatible pointer, a wrong-type-arg exception is raised.

    24.7.1 Smobs

    In earlier versions of SWIG, C pointers were represented as Scheme strings containing a hexadecimal rendering of the pointer value and a mangled type name. As Guile allows registering user types, so-called "smobs" (small objects), a much cleaner representation has been implemented now. The details will be discussed in the following.

    The whole type system, when it is first initialized, creates two smobs named "swig" and "collected_swig". The swig smob is used for non-garbage collected smobs, while the collected_swig smob is used as described below. Each smob has the same format, which is a double cell created by SCM_NEWSMOB2() The first word of data is the pointer to the object and the second word of data is the swig_type_info * structure describing this type. If a generated GOOPS module has been loaded, smobs will be wrapped by the corresponding GOOPS class.

    24.7.2 Garbage Collection

    Garbage collection is a feature of Guile since version 1.6. As SWIG now requires Guile > 1.8, it is automatically included. Garbage collection works like this. Every swig_type_info structure stores in its clientdata field a pointer to the destructor for this type. The destructor is the generated wrapper around the delete function. So swig still exports a wrapper for the destructor, it just does not call scm_c_define_gsubr() for the wrapped delete function. So the only way to delete an object is from the garbage collector, since the delete function is not available to scripts. How swig determines if a type should be garbage collected is exactly like described in Object ownership and %newobject in the SWIG manual. All typemaps use an $owner var, and the guile module replaces $owner with 0 or 1 depending on feature:new.

    24.8 Native Guile pointers

    In addition to SWIG smob pointers, Guile's native pointer type are accepted as arguments to wrapped SWIG functions. This can be useful for passing pointers to bytevector data to wrapped functions.

    24.9 Exception Handling

    SWIG code calls scm_error on exception, using the following mapping:

          MAP(SWIG_MemoryError,     "swig-memory-error");
          MAP(SWIG_IOError,         "swig-io-error");
          MAP(SWIG_RuntimeError,    "swig-runtime-error");
          MAP(SWIG_IndexError,      "swig-index-error");
          MAP(SWIG_TypeError,       "swig-type-error");
          MAP(SWIG_DivisionByZero,  "swig-division-by-zero");
          MAP(SWIG_OverflowError,   "swig-overflow-error");
          MAP(SWIG_SyntaxError,     "swig-syntax-error");
          MAP(SWIG_ValueError,      "swig-value-error");
          MAP(SWIG_SystemError,     "swig-system-error");
    

    The default when not specified here is to use "swig-error". See Lib/exception.i for details.

    24.10 Procedure documentation

    If invoked with the command-line option -procdoc file , SWIG creates documentation strings for the generated wrapper functions, describing the procedure signature and return value, and writes them to file.

    SWIG can generate documentation strings in three formats, which are selected via the command-line option -procdocformat format :

    • guile-1.4 (default): Generates a format suitable for Guile 1.4.
    • plain: Generates a format suitable for Guile 1.4.1 and later.
    • texinfo: Generates texinfo source, which must be run through texinfo in order to get a format suitable for Guile 1.4.1 and later.

    You need to register the generated documentation file with Guile like this:

    (use-modules (ice-9 documentation))
    (set! documentation-files 
          (cons "file" documentation-files))
    

    Documentation strings can be configured using the Guile-specific typemap argument doc. See Lib/guile/typemaps.i for details.

    24.11 Procedures with setters

    For global variables, SWIG creates a single wrapper procedure ( variable :optional value), which is used for both getting and setting the value. For struct members, SWIG creates two wrapper procedures (struct-member-get pointer) and (struct-member-set pointer value).

    If invoked with the command-line option -emit-setters ( recommended), SWIG will additionally create procedures with setters. For global variables, the procedure-with-setter variable is created, so you can use (variable ) to get the value and (set! (variable) value) to set it. For struct members, the procedure-with-setter struct-member is created, so you can use (struct-member pointer) to get the value and (set! (struct -member pointer) value) to set it.

    If invoked with the command-line option -only-setters, SWIG will only create procedures with setters, i.e., for struct members, the procedures (struct-member -get pointer) and (struct-member-set pointer value) are not generated.

    24.12 GOOPS Proxy Classes

    SWIG can also generate classes and generic functions for use with Guile's Object-Oriented Programming System (GOOPS). GOOPS is a sophisticated object system in the spirit of the Common Lisp Object System (CLOS).

    To enable GOOPS support, pass the -proxy argument to swig. This will export the GOOPS wrapper definitions into the module.scm file in the directory specified by -outdir or the current directory. GOOPS support requires either passive or module linkage.

    The generated file will contain definitions of GOOPS classes mimicking the C++ class hierarchy.

    Enabling GOOPS support implies -emit-setters.

    If -emit-slot-accessors is also passed as an argument, then the generated file will contain accessor methods for all the slots in the classes and for global variables. The input class

      class Foo {
        public:
          Foo(int i) : a(i) {}
          int a;
          int getMultBy(int i) { return a * i; }
          Foo getFooMultBy(int i) { return Foo(a * i); }
      }; 
      Foo getFooPlus(int i) { return Foo(a + i); }
    

    will produce (if -emit-slot-accessors is not passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> getMultBy getFooMultBy getFooPlus )
    

    and will produce (if -emit-slot-accessors is passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set 
         #:accessor a)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> a getMultBy getFooMultBy getFooPlus )
    

    which can then be used by this code

    ;; not using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (slot-ref foo 'a)
    (slot-set! foo 'a 3)
    (getMultBy foo 4)
    (define foo2 (getFooMultBy foo 7))
    (slot-ref foo 'a)
    (slot-ref (getFooPlus foo 4) 'a)
    
    ;; using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (a foo)
    (set! (a foo) 5)
    (getMultBy foo 4)
    (a (getFooMultBy foo 7))
    

    Notice that constructor arguments are passed as a list after the #:args keyword. Hopefully in the future the following will be valid (make <Foo> #:a 5 #:b 4)

    Also note that the order the declarations occur in the .i file make a difference. For example,

    %module test
    
    %{ #include "foo.h" %}
    
    %inline %{
      int someFunc(Foo &a) {
        ...
      }
    %}
    
    %include "foo.h"
    

    This is a valid SWIG file it will work as you think it will for primitive support, but the generated GOOPS file will be broken. Since the someFunc definition is parsed by SWIG before all the declarations in foo.h, the generated GOOPS file will contain the definition of someFunc() before the definition of <Foo>. The generated GOOPS file would look like

    ;;...
    
    (define-method (someFunc (swig_smob <Foo>))
      (primitive:someFunc (slot-ref swig_smob 'smob)))
    
    ;;...
    
    (define-class <Foo> (<swig>)
      ;;...
    )
    
    ;;...
    

    Notice that <Foo> is used before it is defined. The fix is to just put the %import "foo.h" before the %inline block.

    24.12.1 Naming Issues

    As you can see in the example above, there are potential naming conflicts. The default exported accessor for the Foo::a variable is named a. The name of the wrapper global function is getFooPlus. If the -useclassprefix option is passed to swig, the name of all accessors and member functions will be prepended with the class name. So the accessor will be called Foo-a and the member functions will be called Foo-getMultBy. Also, if the -goopsprefix goops: argument is passed to swig, every identifier will be prefixed by goops:

    Two guile-modules are created by SWIG. The first module contains the primitive definitions of all the wrapped functions and variables, and is located either in the _wrap.cxx file (with -Linkage module ) or in the scmstub file (if -Linkage passive -scmstub). The name of this guile-module is the swig-module name (given on the command line with the -module argument or with the %module directive) concatenated with the string "-primitive". For example, if %module Test is set in the swig interface file, the name of the guile-module in the scmstub or -Linkage module will be Test-primitive. Also, the scmstub file will be named Test-primitive.scm. The string "primitive" can be changed by the -primsuffix swig argument. So the same interface, with the -primsuffix base will produce a module called Test-base . The second generated guile-module contains all the GOOPS class definitions and is located in a file named module.scm in the directory specified with -outdir or the current directory. The name of this guile-module is the name of the swig-module (given on the command line or with the %module directive). In the previous example, the GOOPS definitions will be in a file named Test.scm.

    Because of the naming conflicts, you can't in general use both the -primitive and the GOOPS guile-modules at the same time. To do this, you need to rename the exported symbols from one or both guile-modules. For example,

    (use-modules ((Test-primitive) #:renamer (symbol-prefix-proc 'primitive:)))
    (use-modules ((Test) #:renamer (symbol-prefix-proc 'goops:)))
    

    24.12.2 Linking

    The guile-modules generated above all need to be linked together. GOOPS support requires either passive or module linkage. The exported GOOPS guile-module will be the name of the swig-module and should be located in a file called Module.scm. This should be installed on the autoload path for guile, so that (use-modules (Package Module)) will load everything needed. Thus, the top of the GOOPS guile-module will contain code to load everything needed by the interface (the shared library, the scmstub module, etc.). The %goops directive inserts arbitrary code into the generated GOOPS guile-module, and should be used to load the dependent libraries.

    This breaks up into three cases

    • Passive Linkage without -scmstub: Note that this linkage style has the potential for naming conflicts, since the primitive exported function and variable names are not wrapped in a guile-module and might conflict with names from the GOOPS guile-module (see above). Pass the -goopsprefix argument to solve this problem. If the -exportprimitive option is passed to SWIG the (export ...) code that would be exported into the scmstub file is exported at the bottom of the generated GOOPS guile-module. The %goops directive should contain code to load the shared library.
      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module (with the -package my/modules -module foo command line arguments)

      (define-module (my modules foo))
      
      ;; %goops directive goes here
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      
    • Passive Linkage with -scmstub: Here, the name of the scmstub file should be Module-primitive.scm (with primitive replaced with whatever is given with the -primsuffix argument. The code to load the shared library should be located in the %scheme directive, which will then be added to the scmstub file. SWIG will automatically generate the line (use-modules ( Package Module-primitive)) into the GOOPS guile-module. So if Module-primitive.scm is on the autoload path for guile, the %goops directive can be empty. Otherwise, the %goops directive should contain whatever code is needed to load the Module-primitive.scm file into guile.

      %scheme %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      // only include the following definition if (my modules foo) cannot
      // be loaded automatically
      %goops %{ 
        (primitive-load "/path/to/foo-primitive.scm") 
        (primitive-load "/path/to/Swig/common.scm")
      %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (primitive-load "/path/to/foo-primitive.scm")
      (primitive-load "/path/to/Swig/common.scm")
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                             'primitive:)))
      
      
    • Module Linkage: This is very similar to passive linkage with a scmstub file. SWIG will also automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. Again the %goops directive should contain whatever code is needed to get that module loaded into guile.

      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                               'primitive:)))
      
      

    (Swig common): The generated GOOPS guile-module also imports definitions from the (Swig common) guile-module. This module is included with SWIG and should be installed by SWIG into the autoload path for guile (based on the configure script and whatever arguments are passed). If it is not, then the %goops directive also needs to contain code to load the common.scm file into guile. Also note that if you are trying to install the generated wrappers on a computer without SWIG installed, you will need to include the common.swg file along with the install.

    Multiple Modules: Type dependencies between modules is supported. For example, if mod1 includes definitions of some classes, and mod2 includes some classes derived from classes in mod1, the generated GOOPS file for mod2 will declare the correct superclasses. The only problem is that since mod2 uses symbols from mod1, the mod2 GOOPS file must include a (use-modules (mod2)). Currently, SWIG does not automatically export this line; it must be included in the %goops directive of mod2. Maybe in the future SWIG can detect dependencies and export this line. (how do other language modules handle this problem?)


    25 SWIG and Java

    This chapter describes SWIG's support of Java. It covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters.

    25.1 Overview

    The 100% Pure Java effort is a commendable concept, however in the real world programmers often either need to re-use their existing code or in some situations want to take advantage of Java but are forced into using some native (C/C++) code. The Java extension to SWIG makes it very easy to plumb in existing C/C++ code for access from Java, as SWIG writes the Java Native Interface (JNI) code for you. It is different to using the 'javah' tool as SWIG will wrap existing C/C++ code, whereas javah takes 'native' Java function declarations and creates C/C++ function prototypes. SWIG wraps C/C++ code using Java proxy classes and is very useful if you want to have access to large amounts of C/C++ code from Java. If only one or two JNI functions are needed then using SWIG may be overkill. SWIG enables a Java program to easily call into C/C++ code from Java. Historically, SWIG was not able to generate any code to call into Java code from C++. However, SWIG now supports full cross language polymorphism and code is generated to call up from C++ to Java when wrapping C++ virtual methods via the director feature.

    Java is one of the few non-scripting language modules in SWIG. As SWIG utilizes the type safety that the Java language offers, it takes a somewhat different approach to that used for scripting languages. In particular runtime type checking and the runtime library are not used by Java. This should be borne in mind when reading the rest of the SWIG documentation. This chapter on Java is relatively self contained and will provide you with nearly everything you need for using SWIG and Java. However, the "SWIG Basics" chapter will be a useful read in conjunction with this one.

    This chapter starts with a few practicalities on running SWIG and compiling the generated code. If you are looking for the minimum amount to read, have a look at the sections up to and including the tour of basic C/C++ wrapping section which explains how to call the various C/C++ code constructs from Java. Following this section are details of the C/C++ code and Java classes that SWIG generates. Due to the complexities of C and C++ there are different ways in which C/C++ code could be wrapped and called from Java. SWIG is a powerful tool and the rest of the chapter details how the default code wrapping can be tailored. Various customisation tips and techniques using SWIG directives are covered. The latter sections cover the advanced techniques of using typemaps for complete control of the wrapping process.

    25.2 Preliminaries

    SWIG 1.1 works with JDKs from JDK 1.1 to JDK1.4 (Java 2 SDK1.4) and should also work with any later versions. Given the choice, you should probably use the latest version of Sun's JDK. The SWIG Java module is known to work using Sun's JVM on Solaris, Linux and the various flavours of Microsoft Windows including Cygwin. The Kaffe JVM is known to give a few problems and at the time of writing was not a fully fledged JVM with full JNI support. The generated code is also known to work on vxWorks using WindRiver's PJava 3.1. The best way to determine whether your combination of operating system and JDK will work is to test the examples and test-suite that comes with SWIG. Run make -k check from the SWIG root directory after installing SWIG on Unix systems.

    The Java module requires your system to support shared libraries and dynamic loading. This is the commonly used method to load JNI code so your system will more than likely support this.

    Android uses Java JNI and also works with SWIG. Please read the Android chapter in conjunction with this one if you are targeting Android.

    25.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module test
    %{
    #include "stuff.h"
    %}
    int fact(int n);
    

    To build a Java module, run SWIG using the -java option :

    %swig -java example.i
    

    If building C++, add the -c++ option:

    $ swig -c++ -java example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and numerous Java files. The generated C/C++ source file contains the JNI wrapper code that needs to be compiled and linked with the rest of your C/C++ application.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. It is also possible to change the output directory that the Java files are generated into using -outdir.

    The module name, specified with %module, determines the name of various generated classes as discussed later. Note that the module name does not define a Java package and by default, the generated Java classes do not have a Java package. The -package option described below can specify a Java package name to use.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    25.2.2 Additional Commandline Options

    The following table lists the additional commandline options available for the Java module. They can also be seen by using:

    swig -java -help 
    
    Java specific options
    -nopgcppsuppress the premature garbage collection prevention parameter
    -noproxygenerate the low-level functional interface instead of proxy classes
    -package <name>set name of the Java package to <name>

    Their use will become clearer by the time you have finished reading this section on SWIG and Java.

    25.2.3 Getting the right header files

    In order to compile the C/C++ wrappers, the compiler needs the jni.h and jni_md.h header files which are part of the JDK. They are usually in directories like this:

    /usr/java/include
    /usr/java/include/<operating_system>
    

    The exact location may vary on your machine, but the above locations are typical.

    25.2.4 Compiling a dynamic module

    The JNI code exists in a dynamic module or shared library (DLL on Windows) and gets loaded by the JVM. Assuming you have code you need to link to in a file called example.c, in order to build a shared library file, you need to compile your module in a manner similar to the following (shown for Solaris):

    $ swig -java example.i
    $ gcc -fPIC -c example_wrap.c -I/usr/java/include -I/usr/java/include/solaris
    $ gcc -fPIC -c example.c
    $ ld -G example_wrap.o example.o -o libexample.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the Examples/java directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    Important
    If you are going to use optimisations turned on with gcc (for example -O2), ensure you also compile with -fno-strict-aliasing. The GCC optimisations have become more aggressive from gcc-4.0 onwards and will result in code that fails with strict aliasing optimisations turned on. See the C/C++ to Java typemaps section for more details.

    The name of the shared library output file is important. If the name of your SWIG module is "example", the name of the corresponding shared library file should be "libexample.so" (or equivalent depending on your machine, see Dynamic linking problems for more information). The name of the module is specified using the %module directive or -module command line option.

    25.2.5 Using your module

    To load your shared native library module in Java, simply use Java's System.loadLibrary method in a Java class:

    // runme.java
    
    public class runme {
      static {
        System.loadLibrary("example");
      }
    
      public static void main(String argv[]) {
        System.out.println(example.fact(4));
      }
    }
    

    Compile all the Java files and run:

    $ javac *.java
    $ java runme
    24
    $
    

    If it doesn't work have a look at the following section which discusses problems loading the shared library.

    25.2.6 Dynamic linking problems

    As shown in the previous section the code to load a native library (shared library) is System.loadLibrary("name"). This can fail with an UnsatisfiedLinkError exception and can be due to a number of reasons.

    You may get an exception similar to this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312)
            at java.lang.Runtime.loadLibrary0(Runtime.java:749)
            at java.lang.System.loadLibrary(System.java:820)
            at runme.<clinit>(runme.java:5)
    

    The most common cause for this is an incorrect naming of the native library for the name passed to the loadLibrary function. The string passed to the loadLibrary function must not include the file extension name in the string, that is .dll or .so. The string must be name and not libname for all platforms. On Windows the native library must then be called name.dll and on most Unix systems it must be called libname.so .

    Another common reason for the native library not loading is because it is not in your path. On Windows make sure the path environment variable contains the path to the native library. On Unix make sure that your LD_LIBRARY_PATH contains the path to the native library. Adding paths to LD_LIBRARY_PATH can slow down other programs on your system so you may want to consider alternative approaches. For example you could recompile your native library with extra path information using -rpath if you're using GNU, see the GNU linker documentation (ld man page). You could use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    The native library will also not load if there are any unresolved symbols in the compiled C/C++ code. The following exception is indicative of this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: libexample.so: undefined
    symbol: fact
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java, Compiled Code)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java, Compiled Code)
            at java.lang.Runtime.loadLibrary0(Runtime.java, Compiled Code)
            at java.lang.System.loadLibrary(System.java, Compiled Code)
            at runme.<clinit>(runme.java:5)
    $
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the native library file. Make sure you compile both the SWIG wrapper file and the code you are wrapping into the native library file. If you forget to compile and link in the SWIG wrapper file into your native library file, you will get a message similar to the following:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: exampleJNI.gcd(II)I
            at exampleJNI.gcd(Native Method)
            at example.gcd(example.java:12)
            at runme.main(runme.java:18)
    

    where gcd is the missing JNI function that SWIG generated into the wrapper file. Also make sure you pass all of the required libraries to the linker. The java -verbose:jni commandline switch is also a great way to get more information on unresolved symbols. One last piece of advice is to beware of the common faux pas of having more than one native library version in your path.

    In summary, ensure that you are using the correct C/C++ compiler and linker combination and options for successful native library loading. If you are using the examples that ship with SWIG, then the Examples/Makefile must have these set up correctly for your system. The SWIG installation package makes a best attempt at getting these correct but does not get it right 100% of the time. The SWIG Wiki also has some settings for commonly used compiler and operating system combinations. The following section also contains some C++ specific linking problems and solutions.

    25.2.7 Compilation problems and compiling with C++

    On most machines, shared library files should be linked using the C++ compiler. For example:

    % swig -c++ -java example.i
    % g++ -c -fpic example.cxx
    % g++ -c -fpic example_wrap.cxx -I/usr/java/j2sdk1.4.1/include -I/usr/java/j2sdk1.4.1/include/linux
    % g++ -shared example.o example_wrap.o -o libexample.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -java example.i
    % CC -c example.cxx
    % CC -c example_wrap.cxx -I/usr/java/include -I/usr/java/include/solaris
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o libexample.so -lCrun
    

    If you aren't entirely sure about the linking for C++, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your shared library. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    Finally make sure the version of JDK header files matches the version of Java that you are running as incompatibilities could lead to compilation problems or unpredictable behaviour.

    25.2.8 Building on Windows

    Building on Windows is roughly similar to the process used with Unix. You will want to produce a DLL that can be loaded by the Java Virtual Machine. This section covers the process of using SWIG with Microsoft Visual C++ 6 although the procedure may be similar with other compilers. In order for everything to work, you will need to have a JDK installed on your machine in order to read the JNI header files.

    25.2.8.1 Running SWIG from Visual Studio

    If you are developing your application within Microsoft Visual studio, SWIG can be invoked as a custom build option. The Examples\java directory has a few Windows Examples containing Visual Studio project (.dsp) files. The process to re-create the project files for a C project are roughly:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Don't worry if the wrapper file doesn't exist yet--Visual Studio will keep a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -java -o $(ProjDir)\$(InputName)_wrap.c $(InputPath) " in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to C/C++ tab and select the Preprocessor category. Add the include directories to the JNI header files under "Additional include directories", eg "C:\jdk1.3\include, C:\jdk1.3\include\win32".
    • Next, select the settings for the entire project and go to Link tab and select the General category. Set the name of the output file to match the name of your Java module (ie. example.dll).
    • Next, select the example.c and example_wrap.c files and go to the C/C++ tab and select the Precompiled Headers tab in the project settings. Disabling precompiled headers for these files will overcome any precompiled header errors while building.
    • Finally, add the java compilation as a post build rule in the Post-build step tab in project settings, eg, "c:\jdk1.3\bin\javac *.java"
    • Build your project.

    Note: If using C++, choose a C++ suffix for the wrapper file, for example example_wrap.cxx. Use _wrap.cxx instead of _wrap.c in the instructions above and add -c++ when invoking swig.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. When doing a build, any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file.

    The Java classes that SWIG output should also be compiled into .class files. To run the native code in the DLL (example.dll), make sure that it is in your path then run your Java program which uses it, as described in the previous section. If the library fails to load have a look at Dynamic linking problems.

    25.2.8.2 Using NMAKE

    Alternatively, a Makefile for use by NMAKE can be written. Make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for using SWIG and Java for C code
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO \
                 /MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS        = /Z7 /Od /c /nologo
    JAVA_INCLUDE    = -ID:\jdk1.3\include -ID:\jdk1.3\include\win32
    
    java::
            swig -java -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(JAVA_INCLUDE) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) example.obj example_wrap.obj
            javac *.java
    

    To build the DLL and compile the java code, run NMAKE (you may need to run vcvars32 first). This is a pretty simplistic Makefile, but hopefully its enough to get you started. Of course you may want to make changes for it to work for C++ by adding in the -c++ command line switch for swig and replacing .c with .cxx.

    25.3 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Java interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, variables are wrapped with JavaBean type getters and setters and so forth. This section briefly covers the essential aspects of this wrapping.

    25.3.1 Modules, packages and generated Java classes

    The SWIG %module directive specifies the name of the Java module. When you specify `%module example', the module name determines the name of some of the generated files in the module. The generated code consists of a module class file example.java , an intermediary JNI class file, exampleJNI.java as well as numerous other Java proxy class files. Each proxy class is named after the structs, unions and classes you are wrapping. You may also get a constants interface file if you are wrapping any unnamed enumerations or constants, for example exampleConstants.java. When choosing a module name, make sure you don't use the same name as one of the generated proxy class files nor a Java keyword. Sometimes a C/C++ type cannot be wrapped by a proxy class, for example a pointer to a primitive type. In these situations a type wrapper class is generated. Wrapping an enum generates an enum class, either a proper Java enum or a Java class that simulates the enums pattern. Details of all these generated classes will unfold as you read this section.

    The JNI (C/C++) code is generated into a file which also contains the module name, for example example_wrap.cxx or example_wrap.c. These C or C++ files complete the contents of the module.

    The generated Java classes can be placed into a Java package by using the -package commandline option. This is often combined with the -outdir to specify a package directory for generating the Java files.

    swig -java -package com.bloggs.swig -outdir com/bloggs/swig example.i
    

    SWIG won't create the directory, so make sure it exists beforehand.

    25.3.2 Functions

    There is no such thing as a global Java function so global C functions are wrapped as static methods in the module class. For example,

    %module example
    int fact(int n);
    
    

    creates a static function that works exactly like you think it might:

    public class example {
      public static int fact(int n) {
        // makes call using JNI to the C function
      }
    }
    

    The Java class example is the module class. The function can be used as follows from Java:

    System.out.println(example.fact(4));
    

    25.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. Java does not allow the overriding of the dot operator so all variables are accessed through getters and setters. Again because there is no such thing as a Java global variable, access to C/C++ global variables is done through static getter and setter functions in the module class.

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now in Java :

    // Print out value of a C global variable
    System.out.println("My_variable = " + example.getMy_variable());
    // Set the value of a C global variable
    example.setDensity(0.8442);
    

    The value returned by the getter will always be up to date even if the value is changed in C. Note that the getters and setters produced follow the JavaBean property design pattern. That is the first letter of the variable name is capitalized and preceded with set or get. If you have the misfortune of wrapping two variables that differ only in the capitalization of their first letters, use %rename to change one of the variable names. For example:

    %rename Clash RenamedClash;
    float Clash;
    int clash;
    

    If a variable is declared as const, it is wrapped as a read-only variable. That is only a getter is produced.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    25.3.4 Constants

    C/C++ constants are wrapped as Java static final variables. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    By default the generated static final variables are initialized by making a JNI call to get their value. The constants are generated into the constants interface and look like this:

    public interface exampleConstants {
      public final static double PI = exampleJNI.PI_get();
      public final static String VERSION = exampleJNI.VERSION_get();
      public final static int FOO = exampleJNI.FOO_get();
      public final static String path = exampleJNI.path_get();
    }
    

    Note that SWIG has inferred the C type and used an appropriate Java type that will fit the range of all possible values for the C type. By default SWIG generates runtime constants. They are not compiler constants that can, for example, be used in a switch statement. This can be changed by using the %javaconst(flag) directive. It works like all the other %feature directives. The default is %javaconst(0). It is possible to initialize all wrapped constants from pure Java code by placing a %javaconst(1) before SWIG parses the constants. Putting it at the top of your interface file would ensure this. Here is an example:

    %javaconst(1);
    %javaconst(0) BIG;
    %javaconst(0) LARGE;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    generates:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = exampleJNI.BIG_get();
      public final static java.math.BigInteger LARGE = exampleJNI.LARGE_get();
    }
    

    Note that SWIG has inferred the C long long type from BIG and used an appropriate Java type (long) as a Java long is the smallest sized Java type that will take all possible values for a C long long. Similarly for LARGE.

    Be careful using the %javaconst(1) directive as not all C code will compile as Java code. For example neither the 1000LL value for BIG nor 2000ULL for LARGE above would generate valid Java code. The example demonstrates how you can target particular constants (BIG and LARGE) with %javaconst. SWIG doesn't use %javaconst(1) as the default as it tries to generate code that will always compile. However, using a %javaconst(1) at the top of your interface file is strongly recommended as the preferred compile time constants will be generated and most C constants will compile as Java code and in any case the odd constant that doesn't can be fixed using %javaconst(0).

    There is an alternative directive which can be used for these rare constant values that won't compile as Java code. This is the %javaconstvalue(value) directive, where value is a Java code replacement for the C constant and can be either a string or a number. This is useful if you do not want to use either the parsed C value nor a JNI call, such as when the C parsed value will not compile as Java code and a compile time constant is required. The same example demonstrates this:

    %javaconst(1);
    %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE;
    %javaconstvalue(1000) BIG;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    Note the string quotes for "2000" are escaped. The following is then generated:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = 1000;
      public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000");
    }
    

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using a getter as described in the previous section. They are not wrapped as constants. The exception to this rule are static const integral values defined within a class/struct, where they are wrapped as constants, eg:.

    struct Maths {
      static const int FIVE = 5;
    };
    

    Compatibility Note: In SWIG-1.3.19 and earlier releases, the constants were generated into the module class and the constants interface didn't exist. Backwards compatibility is maintained as the module class implements the constants interface (even though some consider this type of interface implementation to be bad practice):

    public class example implements exampleConstants {
    }
    

    You thus have the choice of accessing these constants from either the module class or the constants interface, for example, example.EXPRESSION or exampleConstants.EXPRESSION. Or if you decide this practice isn't so bad and your own class implements exampleConstants, you can of course just use EXPRESSION.

    25.3.5 Enumerations

    SWIG handles both named and unnamed (anonymous) enumerations. There is a choice of approaches to wrapping named C/C++ enums. This is due to historical reasons as SWIG's initial support for enums was limited and Java did not originally have support for enums. Each approach has advantages and disadvantages and it is important for the user to decide which is the most appropriate solution. There are four approaches of which the first is the default approach based on the so called Java typesafe enum pattern. The second generates proper Java enums. The final two approaches use simple integers for each enum item. Before looking at the various approaches for wrapping named C/C++ enums, anonymous enums are considered.

    25.3.5.1 Anonymous enums

    There is no name for anonymous enums and so they are handled like constants. For example:

    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    is wrapped into the constants interface, in a similar manner as constants (see previous section):

    public interface exampleConstants {
      public final static int ALE = exampleJNI.ALE_get();
      public final static int LAGER = exampleJNI.LAGER_get();
      public final static int STOUT = exampleJNI.STOUT_get();
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = exampleJNI.PILZ_get();
    }
    

    The %javaconst(flag) and %javaconstvalue(value) directive introduced in the previous section on constants can also be used with enums. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is strongly recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. Using %javaconst(1) will ensure compile time constants are generated, thereby allowing the enum values to be used in Java switch statements. Example usage:

    %javaconst(1);
    %javaconst(0) PILSNER;
    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    generates:

    public interface exampleConstants {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = PILSNER;
    }
    

    As in the case of constants, you can access them through either the module class or the constants interface, for example, example.ALE or exampleConstants.ALE.

    25.3.5.2 Typesafe enums

    This is the default approach to wrapping named enums. The typesafe enum pattern is a relatively well known construct to work around the lack of enums in versions of Java prior to JDK 1.5. It basically defines a class for the enumeration and permits a limited number of final static instances of the class. Each instance equates to an enum item within the enumeration. The implementation is in the "enumtypesafe.swg" file. Let's look at an example:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", exampleJNI.LAGER_get());
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", exampleJNI.PILZ_get());
      [... additional support methods omitted for brevity ...]
    }
    

    See Typesafe enum classes to see the omitted support methods. Note that the enum item with an initializer (LAGER) is initialized with the enum value obtained via a JNI call. However, as with anonymous enums and constants, use of the %javaconst directive is strongly recommended to change this behaviour:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    The generated code is easier to read and more efficient as a true constant is used instead of a JNI call. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. The %javaconstvalue(value) directive can also be used for typesafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Typesafe enums have their advantages over using plain integers in that they can be used in a typesafe manner. However, there are limitations. For example, they cannot be used in switch statements and serialization is an issue. Please look at the following references for further information: http://java.sun.com/developer/Books/shiftintojava/page1.html#replaceenums Replace Enums with Classes in Effective Java Programming on the Sun website, Create enumerated constants in Java JavaWorld article, Java Tip 133: More on typesafe enums and Java Tip 122: Beware of Java typesafe enumerations JavaWorld tips.

    Note that the syntax required for using typesafe enums is the same as that for proper Java enums. This is useful during the period that a project has to support legacy versions of Java. When upgrading to JDK 1.5 or later, proper Java enums could be used instead, without users having to change their code. The following section details proper Java enum generation.

    25.3.5.3 Proper Java enums

    Proper Java enums were only introduced in JDK 1.5 so this approach is only compatible with more recent versions of Java. Java enums have been designed to overcome all the limitations of both typesafe and type unsafe enums and should be the choice solution, provided older versions of Java do not have to be supported. In this approach, each named C/C++ enum is wrapped by a Java enum. Java enums, by default, do not support enums with initializers. Java enums are in many respects similar to Java classes in that they can be customised with additional methods. SWIG takes advantage of this feature to facilitate wrapping C/C++ enums that have initializers. In order to wrap all possible C/C++ enums using proper Java enums, the "enums.swg" file must be used. Let's take a look at an example.

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    See Proper Java enum classes to see the omitted support methods. The generated Java enum has numerous additional methods to support enums with initializers, such as LAGER above. Note that as with the typesafe enum pattern, enum items with initializers are by default initialized with the enum value obtained via a JNI call. However, this is not the case above as we have used the recommended %javaconst(1) to avoid the JNI call. The %javaconstvalue(value) directive covered in the Constants section can also be used for proper Java enums.

    The additional support methods need not be generated if none of the enum items have initializers and this is covered later in the Simpler Java enums for enums without initializers section.

    25.3.5.4 Type unsafe enums

    In this approach each enum item in a named enumeration is wrapped as a static final integer in a class named after the C/C++ enum name. This is a commonly used pattern in Java to simulate C/C++ enums, but it is not typesafe. However, the main advantage over the typesafe enum pattern is enum items can be used in switch statements. In order to use this approach, the "enumtypeunsafe.swg" file must be used. Let's take a look at an example.

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    As is the case previously, the default is %javaconst(0) as not all C/C++ values will compile as Java code. However, again it is recommended to add in a %javaconst(1) directive. and the %javaconstvalue(value) directive covered in the Constants section can also be used for type unsafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Note that unlike typesafe enums, this approach requires users to mostly use different syntax compared with proper Java enums. Thus the upgrade path to proper enums provided in JDK 1.5 is more painful.

    25.3.5.5 Simple enums

    This approach is similar to the type unsafe approach. Each enum item is also wrapped as a static final integer. However, these integers are not generated into a class named after the C/C++ enum. Instead, global enums are generated into the constants interface. Also, enums defined in a C++ class have their enum items generated directly into the Java proxy class rather than an inner class within the Java proxy class. In fact, this approach is effectively wrapping the enums as if they were anonymous enums and the resulting code is as per anonymous enums. The implementation is in the "enumsimple.swg" file.

    Compatibility Note: SWIG-1.3.21 and earlier versions wrapped all enums using this approach. The type unsafe approach is preferable to this one and this simple approach is only included for backwards compatibility with these earlier versions of SWIG.

    25.3.6 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Java. For example:

    SWIGTYPE_p_FILE f = example.fopen("junk", "w");
    example.fputs("Hello World\n", f);
    example.fclose(f);
    

    C pointers in the Java module are stored in a Java long and cross the JNI boundary held within this 64 bit number. Many other SWIG language modules use an encoding of the pointer in a string. These scripting languages use the SWIG runtime type checker for dynamic type checking as they do not support static type checking by a compiler. In order to implement static type checking of pointers within Java, they are wrapped by a simple Java class. In the example above the FILE * pointer is wrapped with a type wrapper class called SWIGTYPE_p_FILE.

    Once obtained, a type wrapper object can be freely passed around to different C functions that expect to receive an object of that type. The only thing you can't do is dereference the pointer from Java. Of course, that isn't much of a concern in this example.

    As much as you might be inclined to modify a pointer value directly from Java, don't. The value is not necessarily the same as the logical memory address of the underlying object. The value will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Most JVMs are 32 bit applications so any JNI code must also be compiled as 32 bit. The net result is pointers in JNI code are also 32 bits and are stored in the high order 4 bytes on big-endian machines and in the low order 4 bytes on little-endian machines. By design it is also not possible to manually cast a pointer to a new type by using Java casts as it is particularly dangerous especially when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return a NULL pointer if the conversion can't be performed.

    25.3.7 Structures

    If you wrap a C structure, it is wrapped by a Java class with getters and setters for access to the member variables. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    Vector v = new Vector();
    v.setX(3.5);
    v.setY(7.2);
    double x = v.getX();
    double y = v.getY();
    

    The variable setters and getters are also based on the JavaBean design pattern already covered under the Global variables section. Similar access is provided for unions and the public data members of C++ classes.

    This object is actually an instance of a Java class that has been wrapped around a pointer to the C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object is held in the Java proxy class in much the same way as pointers are held by type wrapper classes. Further details about Java proxy classes are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Java, you will see behavior like this:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    Bar c = new Bar();
    c.setX(x);                    // Copy contents of b.x to c.x
    

    For array assignment (setters not getters), SWIG copies the entire contents of the array starting with the data pointed to by b.x . In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation. The default wrapping makes it hard to set or get just one element of the array and so array access from Java is somewhat limited. This can be changed easily though by using the approach outlined later in the Wrapping C arrays with Java arrays and Unbounded C Arrays sections.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f member of Bar like this:

    Bar b = new Bar();
    Foo x = b.getF();
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    Bar b = new Bar();
    b.getF().setA(3);   // Modify b.f.a
    Foo x = b.getF();                   
    x.setA(3);          // Modify x.a - this is the same as b.f.a
    

    25.3.8 C++ classes

    C++ classes are wrapped by Java classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Java like this:

    List l = new List();
    l.insert("Ale");
    l.insert("Stout");
    l.insert("Lager");
    String item = l.get(2);
    int length = l.getLength();
    

    Class data members are accessed in the same manner as C structures.

    Static class members are unsurprisingly wrapped as static members of the Java class:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    The static members work like any other Java static member:

    Spam.foo();
    int bar = Spam.getBar();
    

    25.3.9 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Java classes that reflect the same inheritance structure:

    Bar b = new Bar();
    Class c = b.getClass();
    System.out.println(c.getSuperclass().getName());
    

    will of course display:

    Foo
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the Java function spam() accepts instances of Foo or instances of any other proxy classes derived from Foo.

    Note that Java does not support multiple inheritance so any multiple inheritance in the C++ code is not going to work. A warning is given when multiple inheritance is detected and only the first base class is used.

    25.3.10 Pointers, references, arrays and pass by value

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Java, there is no detailed distinction like this--specifically, there are only instances of classes. There are no pointers nor references. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this from Java:

    Foo f = new Foo();  // Create a Foo
    example.spam1(f);   // Ok. Pointer
    example.spam2(f);   // Ok. Reference
    example.spam3(f);   // Ok. Value.
    example.spam4(f);   // Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Java will release this memory when the returned object's finalizer is run by the garbage collector).

    25.3.10.1 Null pointers

    Working with null pointers is easy. A Java null can be used whenever a method expects a proxy class or typewrapper class. However, it is not possible to pass null to C/C++ functions that take parameters by value or by reference. If you try you will get a NullPointerException.

    example.spam1(null);   // Pointer - ok
    example.spam2(null);   // Reference - NullPointerException
    example.spam3(null);   // Value - NullPointerException
    example.spam4(null);   // Array - ok
    

    For spam1 and spam4 above the Java null gets translated into a NULL pointer for passing to the C/C++ function. The converse also occurs, that is, NULL pointers are translated into null Java objects when returned from a C/C++ function.

    25.3.11 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    %module example
    
    void foo(int);
    void foo(char *c);
    

    You can use them in Java in a straightforward manner:

    example.foo(3);           // foo(int)
    example.foo("Hello");     // foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Java code like this:

    Foo f = new Foo();        // Create a Foo
    Foo g = new Foo(f);       // Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG cannot disambiguate as there can be more than one C++ type mapping onto a single Java type. For example:

    void spam(int);
    void spam(unsigned short);
    

    Here both int and unsigned short map onto a Java int. Here is another example:

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 515: Overloaded method spam(unsigned short) ignored.
    Method spam(int) at example.i:11 used.
    

    To fix this, you either need to either rename or ignore one of the methods. For example:

    %rename(spam_ushort) spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Now renamed to spam_ushort
    

    or

    %ignore spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Ignored
    

    25.3.12 C++ default arguments

    Any function with a default argument is wrapped by generating an additional function for each argument that is defaulted. For example, if we have the following C++:

    %module example
    
    void defaults(double d=10.0, int i=0);
    

    The following methods are generated in the Java module class:

    public class example {
      public static void defaults(double d, int i) { ... }
      public static void defaults(double d) { ... }
      public static void defaults() { ... }
    }
    

    It is as if SWIG had parsed three separate overloaded methods. The same approach is taken for static methods, constructors and member methods.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped these with a single wrapper method and so the default values could not be taken advantage of from Java. Further details on default arguments and how to restore this approach are given in the more general Default arguments section.

    25.3.13 C++ namespaces

    SWIG is aware of named C++ namespaces and they can be mapped to Java packages, however, the default wrapping flattens the namespaces, effectively ignoring them. So by default, the namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Java as follows:

    int f = example.fact(3);
    Vector v = new Vector();
    v.setX(3.4);
    double y = v.getY();
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and you want to keep their symbols separate, consider wrapping them as separate SWIG modules. Each SWIG module can be placed into a separate package.

    The default behaviour described above can be improved via the nspace feature. Note that it only works for classes, structs, unions and enums declared within a named C++ namespace. When the nspace feature is used, the C++ namespaces are converted into Java packages of the same name. Proxy classes are thus declared within a package and this proxy makes numerous calls to the JNI intermediary class which is declared in the unnamed package by default. As Java does not support types declared in a named package accessing types declared in an unnamed package, the -package commandline option described earlier generally should be used to provide a parent package. So if SWIG is run using the -package com.myco option, a wrapped class, MyWorld::Material::Color, can then be accessed as com.myco.MyWorld.Material.Color. If you don't specify a package, you will get the following warning:

    example.i:16: Warning 826: The nspace feature is used on 'MyWorld::Material::Color' without -package. The generated code 
    may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.
    

    If it is undesirable to have a single top level package, the nspace feature may be used without the -package commandline option (and the resulting warning ignored) if all of the types exposed using SWIG are placed in a package using the nspace feature and the 'jniclasspackage' pragma is used to specify a package for the JNI intermediary class.

    If the resulting use of the nspace feature and hence packages results in a proxy class in one package deriving or using a proxy class from another package, you will need to open up the visibility for the pointer constructor and getCPtr method from the default 'protected' to 'public' with the SWIG_JAVABODY_PROXY macro. See Java code typemaps.

    25.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include <utility>
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Java:

    pairii p = new pairii(3, 4);
    int first = p.getFirst();
    int second = p.getSecond();
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter.

    25.3.15 C++ Smart Pointers

    25.3.15.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Java in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    25.3.15.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Java, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Java, everything should just "work":

    SmartPtrFoo p = example.CreateFoo(); // Create a smart-pointer somehow
    p.setX(3);                           // Foo::x
    int y = p.bar();                     // Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    Foo f = p.__deref__();               // Returns underlying Foo *
    

    25.4 Further details on the generated Java classes

    In the previous section, a high-level view of Java wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Java proxy classes and type wrapper classes are used in situations where no proxies are generated. This provides a very natural, type safe Java interface to the C/C++ code and fits in with the Java programming paradigm. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work and then covers the type wrapper classes. Finally enum classes are covered. First, the crucial intermediary JNI class is considered.

    25.4.1 The intermediary JNI class

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a global function and class like this

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    void egg(Foo* chips);
    

    then SWIG transforms the class into a set of low-level procedural wrappers. These procedural wrappers essentially perform the equivalent of this C++ code:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int num, Foo* foo) {
      return f->spam(num, foo);
    }
    

    These procedural function names don't actually exist, but their functionality appears inside the generated JNI functions. The JNI functions have to follow a particular naming convention so the function names are actually:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1Foo(JNIEnv *jenv, jclass jcls);
    SWIGEXPORT void JNICALL Java_exampleJNI_delete_1Foo(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1);
    SWIGEXPORT void JNICALL Java_exampleJNI_Foo_1x_1set(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_, jint jarg2);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1x_1get(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1spam(JNIEnv *jenv, jclass jcls,
                                                      jlong jarg1, jobject jarg1_, jint jarg2,
                                                      jlong jarg3, jobject jarg3_);
    SWIGEXPORT void JNICALL Java_exampleJNI_egg(JNIEnv *jenv, jclass jcls,
                                                jlong jarg1, jobject jarg1_);
    

    For every JNI C function there has to be a static native Java function. These appear in the intermediary JNI class:

    class exampleJNI {
      public final static native long new_Foo();
      public final static native void delete_Foo(long jarg1);
      public final static native void Foo_x_set(long jarg1, Foo jarg1_, int jarg2);
      public final static native int Foo_x_get(long jarg1, Foo jarg1_);
      public final static native int Foo_spam(long jarg1, Foo jarg1_, int jarg2,
                                              long jarg3, Foo jarg3_);
      public final static native void egg(long jarg1, Foo jarg1_);
    }
    

    This class contains the complete Java - C/C++ interface so all function calls go via this class. As this class acts as a go-between for all JNI calls to C/C++ code from the Java proxy classes, type wrapper classes and module class, it is known as the intermediary JNI class.

    You may notice that SWIG uses a Java long wherever a pointer or class object needs to be marshalled across the Java-C/C++ boundary. This approach leads to minimal JNI code which makes for better performance as JNI code involves a lot of string manipulation. SWIG favours generating Java code over JNI code as Java code is compiled into byte code and avoids the costly string operations needed in JNI code. This approach has a downside though as the proxy class might get collected before the native method has completed. You might notice above that there is an additional parameters with a underscore postfix, eg jarg1_. These are added in order to prevent premature garbage collection when marshalling proxy classes.

    The functions in the intermediary JNI class cannot be accessed outside of its package. Access to them is gained through the module class for globals otherwise the appropriate proxy class.

    The name of the intermediary JNI class can be changed from its default, that is, the module name with JNI appended after it. The module directive attribute jniclassname is used to achieve this:

    %module (jniclassname="name") modulename
    

    If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    25.4.1.1 The intermediary JNI class pragmas

    The intermediary JNI class can be tailored through the use of pragmas, but is not commonly done. The pragmas for this class are:

    PragmaDescription
    jniclassbaseBase class for the intermediary JNI class
    jniclasspackagePackage in which to place the intermediary JNI class
    jniclassclassmodifiersClass modifiers and class type for the intermediary JNI class
    jniclasscodeJava code is copied verbatim into the intermediary JNI class
    jniclassimportsJava code, usually one or more import statements, placed before the intermediary JNI class definition
    jniclassinterfacesComma separated interface classes for the intermediary JNI class

    The pragma code appears in the generated intermediary JNI class where you would expect:

    [ jniclassimports pragma ]
    [ jniclassclassmodifiers pragma ] jniclassname extends [ jniclassbase pragma ]
                                              implements [ jniclassinterfaces pragma ] {
    [ jniclasscode pragma ]
    ... SWIG generated native methods ...
    }
    

    The jniclasscode pragma is quite useful for adding in a static block for loading the shared library / dynamic link library and demonstrates how pragmas work:

    %pragma(java) jniclasscode=%{
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. \n" + e);
          System.exit(1);
        }
      }
    %}
    

    Pragmas will take either "" or %{ %} as delimiters. For example, let's change the intermediary JNI class access to just the default package-private access.

    %pragma(java) jniclassclassmodifiers="class"
    

    All the methods in the intermediary JNI class will then not be callable outside of the package as the method modifiers have been changed from public access to default access. This is useful if you want to prevent users calling these low level functions.

    25.4.2 The Java module class

    All global functions and variable getters/setters appear in the module class. For our example, there is just one function:

    public class example {
      public static void egg(Foo chips) {
        exampleJNI.egg(Foo.getCPtr(chips), chips);
      }
    }
    

    The module class is necessary as there is no such thing as a global in Java so all the C globals are put into this class. They are generated as static functions and so must be accessed as such by using the module name in the static function call:

    example.egg(new Foo());
    

    The primary reason for having the module class wrapping the calls in the intermediary JNI class is to implement static type checking. In this case only a Foo can be passed to the egg function, whereas any long can be passed to the egg function in the intermediary JNI class.

    25.4.2.1 The Java module class pragmas

    The module class can be tailored through the use of pragmas, in the same manner as the intermediary JNI class. The pragmas are similarly named and are used in the same way. The complete list follows:

    PragmaDescription
    modulebaseBase class for the module class
    moduleclassmodifiersClass modifiers and class type for the module class
    modulecodeJava code is copied verbatim into the module class
    moduleimportsJava code, usually one or more import statements, placed before the module class definition
    moduleinterfacesComma separated interface classes for the module class

    The pragma code appears in the generated module class like this:

    [ moduleimports pragma ]
    [ modulemodifiers pragma ] modulename extends [ modulebase pragma ]
                                          implements [ moduleinterfaces pragma ] {
    [ modulecode pragma ]
    ... SWIG generated wrapper functions ...
    }
    

    See The intermediary JNI class pragmas section for further details on using pragmas.

    25.4.3 Java proxy classes

    A Java proxy class is generated for each structure, union or C++ class that is wrapped. Proxy classes have also been called peer classes. The default proxy class for our previous example looks like this:

    public class Foo {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Foo(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Foo obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Foo(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public void setX(int value) {
        exampleJNI.Foo_x_set(swigCPtr, this, value);
      }
    
      public int getX() {
        return exampleJNI.Foo_x_get(swigCPtr, this);
      }
    
      public int spam(int num, Foo foo) {
        return exampleJNI.Foo_spam(swigCPtr, this, num, Foo.getCPtr(foo), foo);
      }
    
      public Foo() {
        this(exampleJNI.new_Foo(), true);
      }
    
    }
    

    This class merely holds a pointer to the underlying C++ object ( swigCPtr). It also contains all the methods in the C++ class it is proxying plus getters and setters for public member variables. These functions call the native methods in the intermediary JNI class. The advantage of having this extra layer is the type safety that the proxy class functions offer. It adds static type checking which leads to fewer surprises at runtime. For example, you can see that if you attempt to use the spam() function it will only compile when the parameters passed are an int and a Foo. From a user's point of view, it makes the class work as if it were a Java class:

    Foo f = new Foo();
    f.setX(3);
    int y = f.spam(5, new Foo());
    

    25.4.3.1 Memory management

    Each proxy class has an ownership flag swigCMemOwn. The value of this flag determines who is responsible for deleting the underlying C++ object. If set to true, the proxy class's finalizer will destroy the C++ object when the proxy class is garbage collected. If set to false, then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Java automatically takes ownership of the result. On the other hand, when pointers or references are returned to Java, there is often no way to know where they came from. Therefore, the ownership is set to false. For example:

    class Foo {
    public:
      Foo();
      Foo bar1();
      Foo &bar2();
      Foo *bar2();
    };
    

    In Java:

    Foo f = new Foo();   //  f.swigCMemOwn = true
    Foo f1 = f.bar1();   // f1.swigCMemOwn = true
    Foo f2 = f.bar2();   // f2.swigCMemOwn = false
    Foo f3 = f.bar3();   // f3.swigCMemOwn = false
    

    This behavior for pointers and references is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Java to assume ownership and destroy it!

    For the most part, memory management issues remain hidden. However, there are situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Obj {};
    class Node {
      Obj *value;
    public:
      void set_value(Obj *v) { value = v; }
    };
    

    Now, consider the following Java code:

    Node n = new Node();    // Create a node
    {
      Obj o = new Obj();    // Create an object
      n.set_value(o);       // Set value
    }                       // o goes out of scope
    

    In this case, the Node n is holding a reference to o internally. However, SWIG has no way to know that this has occurred. The Java proxy class still thinks that it has ownership of o. As o has gone out of scope, it could be garbage collected in which case the C++ destructor will be invoked and n will then be holding a stale-pointer to o. If you're lucky, you will only get a segmentation fault.

    To work around this, the ownership flag of o needs changing to false. The ownership flag is a private member variable of the proxy class so this is not possible without some customization of the proxy class. This can be achieved by using a typemap to customise the proxy class with pure Java code as detailed later in the section on Java typemaps.

    Sometimes a function will create memory and return a pointer to a newly allocated object. SWIG has no way of knowing this so by default the proxy class does not manage the returned object. However, you can tell the proxy class to manage the memory if you specify the %newobject directive. Consider:

    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    If we call the factory function, then we have to manually delete the memory:

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = false
    ...
    obj.delete();
    

    Now add in the %newobject directive:

    %newobject Factory::createObj();
    
    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    A call to delete() is no longer necessary as the garbage collector will make the C++ destructor call because swigCMemOwn is now true.

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = true;
    ...
    

    Some memory management issues are quite tricky to fix and may only be noticeable after using for a long time. One such issue is premature garbage collection of an object created from Java and resultant usage from C++ code. The section on typemap examples cover two such scenarios, Memory management for objects passed to the C++ layer and Memory management when returning references to member variables

    25.4.3.2 Inheritance

    Java proxy classes will mirror C++ inheritance chains. For example, given the base class Base and its derived class Derived :

    class Base {
    public:
      virtual double foo();
    };
    
    class Derived : public Base {
    public:
      virtual double foo();
    };
    

    The base class is generated much like any other proxy class seen so far:

    public class Base {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Base(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Base obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Base(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public double foo() {
        return exampleJNI.Base_foo(swigCPtr, this);
      }
    
      public Base() {
        this(exampleJNI.new_Base(), true);
      }
    
    }
    

    The Derived class extends Base mirroring the C++ class inheritance hierarchy.

    public class Derived extends Base {
      private transient long swigCPtr;
    
      protected Derived(long cPtr, boolean cMemoryOwn) {
        super(exampleJNI.SWIGDerivedUpcast(cPtr), cMemoryOwn);
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Derived obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Derived(swigCPtr);
        }
        swigCPtr = 0;
        super.delete();
      }
    
      public double foo() {
        return exampleJNI.Derived_foo(swigCPtr, this);
      }
    
      public Derived() {
        this(exampleJNI.new_Derived(), true);
      }
    
    }
    

    Note the memory ownership is controlled by the base class. However each class in the inheritance hierarchy has its own pointer value which is obtained during construction. The SWIGDerivedUpcast() call converts the pointer from a Derived * to a Base *. This is a necessity as C++ compilers are free to implement pointers in the inheritance hierarchy with different values.

    It is of course possible to extend Base using your own Java classes. If Derived is provided by the C++ code, you could for example add in a pure Java class Extended derived from Base. There is a caveat and that is any C++ code will not know about your pure Java class Extended so this type of derivation is restricted. However, true cross language polymorphism can be achieved using the directors feature.

    25.4.3.3 Proxy classes and garbage collection

    By default each proxy class has a delete() and a finalize() method. The finalize() method calls delete() which frees any malloc'd memory for wrapped C structs or calls the C++ class destructors. The idea is for delete() to be called when you have finished with the C/C++ object. Ideally you need not call delete(), but rather leave it to the garbage collector to call it from the finalizer. When a program exits, the garbage collector does not guarantee to call all finalizers. An insight into the reasoning behind this can be obtained from Hans Boehm's Destructors, Finalizers, and Synchronization paper. Depending on what the finalizers do and which operating system you use, this may or may not be a problem.

    If the delete() call into JNI code is just for memory handling, there is not a problem when run on most operating systems, for example Windows and Unix. Say your JNI code creates memory on the heap which your finalizers should clean up, the finalizers may or may not be called before the program exits. In Windows and Unix all memory that a process uses is returned to the system on exit, so this isn't a problem. This is not the case in some operating systems like vxWorks. If however, your finalizer calls into JNI code invoking the C++ destructor which in turn releases a TCP/IP socket for example, there is no guarantee that it will be released. Note that with long running programs the garbage collector will eventually run, thereby calling any unreferenced object's finalizers.

    Some not so ideal solutions are:

    1. Call the System.runFinalizersOnExit(true) or Runtime.getRuntime().runFinalizersOnExit(true) to ensure the finalizers are called before the program exits. The catch is that this is a deprecated function call as the documentation says:

      This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

      In many cases you will be lucky and find that it works, but it is not to be advocated. Have a look at Java web site and search for runFinalizersOnExit.

    2. From jdk1.3 onwards a new function, addShutdownHook(), was introduced which is guaranteed to be called when your program exits. You can encourage the garbage collector to call the finalizers, for example, add this static block to the class that has the main() function:

        static {
          Runtime.getRuntime().addShutdownHook( 
            new Thread() {
              public void run() { System.gc(); System.runFinalization(); }
            }
          );
        }
      

      Although this usually works, the documentation doesn't guarantee that runFinalization() will actually call the finalizers. As the shutdown hook is guaranteed you could also make a JNI call to clean up any resources that are being tracked by the C/C++ code.

    3. Call the delete() function manually which will immediately invoke the C++ destructor. As a suggestion it may be a good idea to set the object to null so that should the object be inadvertently used again a Java null pointer exception is thrown, the alternative would crash the JVM by using a null C pointer. For example given a SWIG generated class A:

      A myA = new A();
      // use myA ...
      myA.delete();
      // any use of myA here would crash the JVM 
      myA=null;
      // any use of myA here would cause a Java null pointer exception to be thrown
      

      The SWIG generated code ensures that the memory is not deleted twice, in the event the finalizers get called in addition to the manual delete() call.

    4. Write your own object manager in Java. You could derive all SWIG classes from a single base class which could track which objects have had their finalizers run, then call the rest of them on program termination. The section on Java typemaps details how to specify a pure Java base class.

    See the How to Handle Java Finalization's Memory-Retention Issues article for alternative approaches to managing memory by avoiding finalizers altogether.

    25.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    As covered earlier, the C/C++ struct/class pointer is stored in the proxy class as a Java long and when needed is passed into the native method where it is cast into the appropriate type. This approach provides very fast marshalling but could be susceptible to premature garbage collection. Consider the following C++ code:

    class Wibble {
    };
    void wobble(Wibble &w);
    

    The module class contains the Java wrapper for the global wobble method:

    public class example {
      ...
      public static void wobble(Wibble w) {
        exampleJNI.wobble(Wibble.getCPtr(w), w);
      }
    }
    

    where example is the name of the module. All native methods go through the intermediary class which has the native method declared as such:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1, Wibble jarg1_);
    }
    

    The second parameter, jarg1_, is the premature garbage collection prevention parameter and is added to the native method parameter list whenever a C/C++ struct or class is marshalled as a Java long. In order to understand why, consider the alternative where the intermediary class method is declared without the additional parameter:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1);
    }
    

    and the following simple call to wobble:

    {
      Wibble w = new Wibble();
      example.wobble(w);
    }
    

    The hotspot compiler effectively sees something like:

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      // w is no longer reachable
      exampleJNI.wobble(w_ptr);
    }
    

    The Wibble object is no longer reachable after the point shown as in this bit of code, the Wibble object is not referenced again after this point. This means that it is a candidate for garbage collection. Should wobble be a long running method, it is quite likely that the finalizer for the Wibble instance will be called. This in turn will call its underlying C++ destructor which is obviously disastrous while the method wobble is running using this object. Even if wobble is not a long running method, it is possible for the Wibble instance to be finalized. By passing the Wibble instance into the native method, it will not be finalized as the JVM guarantees not to finalize any objects until the native method returns. Effectively, the code then becomes

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      exampleJNI.wobble(w_ptr, w);
      // w is no longer reachable
    }
    

    and therefore there is no possibility of premature garbage collection. In practice, this premature garbage collection was only ever observed in Sun's server JVM from jdk-1.3 onwards and in Sun's client JVM from jdk-1.6 onwards.

    The premature garbage collection prevention parameter for proxy classes is generated by default whenever proxy classes are passed by value, reference or with a pointer. The implementation for this extra parameter generation requires the "jtype" typemap to contain long and the "jstype" typemap to contain the name of a proxy class.

    The additional parameter does impose a slight performance overhead and the parameter generation can be suppressed globally with the -nopgcpp commandline option. More selective suppression is possible with the 'nopgcpp' attribute in the "jtype" Java typemap. The attribute is a flag and so should be set to "1" to enable the suppression, or it can be omitted or set to "0" to disable. For example:

    %typemap(jtype, nopgcpp="1") Wibble & "long"
    

    Compatibility note: The generation of this additional parameter did not occur in versions prior to SWIG-1.3.30.

    25.4.3.5 Single threaded applications and thread safety

    Single threaded Java applications using JNI need to consider thread safety. The same applies for the C# module where the .NET wrappers use PInvoke. Consider the C++ class:

    class Test {
      string str;
    public:
      Test() : str("initial") {}
    };
    

    and the Java proxy class generated by SWIG:

    public class Test {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Test(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Test obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      // Call C++ destructor
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Test(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      // Call C++ constructor
      public Test() {
        this(exampleJNI.new_Test(), true);
      }
    
    }
    

    It has two methods that call JNI methods, namely, exampleJNI.new_Test() for the C++ constructor and exampleJNI.delete_Test() for the C++ destructor. If the garbage collector collects an instance of this class, ie delete() is not explicitly called, then the C++ destructor will be run in a different thread to the main thread. This is because when an object is marked for garbage collection, any objects with finalizers are added to a finalization queue and the objects in the finalization queue have their finalize() methods run in a separate finalization thread. Therefore, if the C memory allocator is not thread safe, then the heap will get corrupted sooner or later, when a concurrent C++ delete and new are executed. It is thus essential, even in single threaded usage, to link to the C multi-thread runtime libraries, for example, use the /MD option for Visual C++ on Windows. Alternatively, lock all access to C++ functions that have heap allocation/deallocation.

    Note that some of the STL in Visual C++ 6 is not thread safe, so although code might be linked to the multithread runtime libraries, undefined behaviour might still occur in a single threaded Java program. Similarly some older versions of Sun Studio have bugs in the multi-threaded implementation of the std::string class and so will lead to undefined behaviour in these supposedly single threaded Java applications.

    The following innocuous Java usage of Test is an example that will crash very quickly on a multiprocessor machine if the JNI compiled code is linked against the single thread C runtime libraries.

    for (int i=0; i<100000; i++) {
      System.out.println("Iteration " + i);
      for (int k=0; k<10; k++) {
        Test test = new Test();
      }
      System.gc();
    }
    

    25.4.4 Type wrapper classes

    The generated type wrapper class, for say an int *, looks like this:

    public class SWIGTYPE_p_int {
      private transient long swigCPtr;
    
      protected SWIGTYPE_p_int(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected SWIGTYPE_p_int() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr(SWIGTYPE_p_int obj) {
        return obj.swigCPtr;
      }
    }
    

    The methods do not have public access, so by default it is impossible to do anything with objects of this class other than pass them around. The methods in the class are part of the inner workings of SWIG. If you need to mess around with pointers you will have to use some typemaps specific to the Java module to achieve this. The section on Java typemaps details how to modify the generated code.

    Note that if you use a pointer or reference to a proxy class in a function then no type wrapper class is generated because the proxy class can be used as the function parameter. If however, you need anything more complicated like a pointer to a pointer to a proxy class then a typewrapper class is generated for your use.

    Note that SWIG generates a type wrapper class and not a proxy class when it has not parsed the definition of a type that gets used. For example, say SWIG has not parsed the definition of class Snazzy because it is in a header file that you may have forgotten to use the %include directive on. Should SWIG parse Snazzy * being used in a function parameter, it will then generates a type wrapper class around a Snazzy pointer. Also recall from earlier that SWIG will use a pointer when a class is passed by value or by reference:

    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Should SWIG not know anything about Snazzy then a SWIGTYPE_p_Snazzy must be used for all 3 parameters in the spam function. The Java function generated is:

    public static void spam(SWIGTYPE_p_Snazzy x, SWIGTYPE_p_Snazzy y, SWIGTYPE_p_Snazzy z) {
     ...
    }
    

    Note that typedefs are tracked by SWIG and the typedef name is used to construct the type wrapper class name. For example, consider the case where Snazzy is a typedef to an int which SWIG does parse:

    typedef int Snazzy;
    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Because the typedefs have been tracked the Java function generated is:

    public static void spam(SWIGTYPE_p_int x, SWIGTYPE_p_int y, int z) { ... }
    

    25.4.5 Enum classes

    SWIG can generate three types of enum classes. The Enumerations section discussed these but omitted all the details. The following sub-sections detail the various types of enum classes that can be generated.

    25.4.5.1 Typesafe enum classes

    The following example demonstrates the typesafe enum classes which SWIG generates:

    %include "enumtypesafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    The following is the code that SWIG generates:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public String toString() {
        return swigName;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (int i = 0; i < swigValues.length; i++)
          if (swigValues[i].swigValue == swigValue)
            return swigValues[i];
        throw new IllegalArgumentException("No enum " + Beverage.class + " with value " +
                                                                             swigValue);
      }
    
      private Beverage(String swigName) {
        this.swigName = swigName;
        this.swigValue = swigNext++;
      }
    
      private Beverage(String swigName, int swigValue) {
        this.swigName = swigName;
        this.swigValue = swigValue;
        swigNext = swigValue+1;
      }
    
      private Beverage(String swigName, Beverage swigEnum) {
        this.swigName = swigName;
        this.swigValue = swigEnum.swigValue;
        swigNext = this.swigValue+1;
      }
    
      private static Beverage[] swigValues = { ALE, LAGER, STOUT, PILSNER, PILZ };
      private static int swigNext = 0;
      private final int swigValue;
      private final String swigName;
    }
    

    As can be seen, there are a fair number of support methods for the typesafe enum pattern. The typesafe enum pattern involves creating a fixed number of static instances of the enum class. The constructors are private to enforce this. Three constructors are available - two for C/C++ enums with an initializer and one for those without an initializer. Note that the two enums with initializers, LAGER and PILZ, each call one the two different initializer constructors. In order to use one of these typesafe enums, the swigToEnum static method must be called to return a reference to one of the static instances. The JNI layer returns the enum value from the C/C++ world as an integer and this method is used to find the appropriate Java enum static instance. The swigValue method is used for marshalling in the other direction. The toString method is overridden so that the enum name is available.

    25.4.5.2 Proper Java enum classes

    The following example demonstrates the Java enums approach:

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following Java enum:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        Beverage[] swigValues = Beverage.class.getEnumConstants();
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (Beverage swigEnum : swigValues)
          if (swigEnum.swigValue == swigValue)
            return swigEnum;
        throw new IllegalArgumentException("No enum " + Beverage.class +
                                           " with value " + swigValue);
      }
    
      private Beverage() {
        this.swigValue = SwigNext.next++;
      }
    
      private Beverage(int swigValue) {
        this.swigValue = swigValue;
        SwigNext.next = swigValue+1;
      }
    
      private Beverage(Beverage swigEnum) {
        this.swigValue = swigEnum.swigValue;
        SwigNext.next = this.swigValue+1;
      }
    
      private final int swigValue;
    
      private static class SwigNext {
        private static int next = 0;
      }
    }
    

    The enum items appear first. Like the typesafe enum pattern, the constructors are private. The constructors are required to handle C/C++ enums with initializers. The next variable is in the SwigNext inner class rather than in the enum class as static primitive variables cannot be modified from within enum constructors. Marshalling between Java enums and the C/C++ enum integer value is handled via the swigToEnum and swigValue methods. All the constructors and methods in the Java enum are required just to handle C/C++ enums with initializers. These needn't be generated if the enum being wrapped does not have any initializers and the Simpler Java enums for enums without initializers section describes how typemaps can be used to achieve this.

    25.4.5.3 Type unsafe enum classes

    The following example demonstrates type unsafe enums:

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following simple class:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    25.4.6 Interfaces

    By default SWIG wraps all C++ classes as Java classes. As Java only supports derivation from a single base class, SWIG has to ignore all bases except the first when a C++ class inherits from more than one base class. However, there is a family of SWIG macros that change the default wrapping and allows a C++ class to be wrapped as a Java interface instead of a Java class. These macros provide a way to support some sort of multiple inheritance as there is no limit to the number of interfaces that a Java class can inherit from.

    When a C++ class is wrapped as a Java interface, a Java proxy class is still needed. The swiginterface.i library file provides three macros for marking a C++ class to be wrapped as a Java interface. There is more than one macro in order to provide a choice for choosing the Java interface and Java proxy names.

    Interface Macro NameDescription
    %interface(CTYPE)For C++ class CTYPE, proxy class name is unchanged without any suffix added, interface name has SwigInterface added as a suffix.
    %interface_impl(CTYPE)For C++ class CTYPE , proxy class name has SwigImpl added as a suffix, interface name has no added suffix.
    %interface_custom("PROXY", "INTERFACE", CTYPE) For C++ class CTYPE, proxy class name is given by the string PROXY, interface name is given by the string INTERFACE. The PROXY and INTERFACE names can use the string formatting functions used in %rename.

    The table below has a few examples showing the resulting proxy and interface names for a C++ class called Base.

    Example UsageProxy Class Name Interface Class Name
    %interface(Base)Base BaseSwigInterface
    %interface_impl(Base)BaseSwigImpl Base
    %interface_custom("BaseProxy", "IBase", Base) BaseProxyIBase
    %interface_custom("%sProxy", "IBase", Base) BaseProxyIBase
    %interface_custom("%sProxy", "%sInterface", Base) BaseProxyBaseProxyInterface
    %interface_custom("%sProxy", "%(rstrip:[Proxy])sInterface", Base)BaseProxyBaseInterface

    The 2nd last example shows the names used in the string formatting functions. The input for PROXY that "%s" expands to is the proxy name, that is, Base. The input for INTERFACE that "%s" expands to is the proxy name, that is, BaseProxy .

    The last example shows rstrip and in this case strips the Proxy suffix and then adds on Interface.

    Consider the following C++ code:

    namespace Space {
      struct Base1 {
        virtual void Method1();
      };
      struct Base2 {
        virtual void Method2();
      };
      struct Derived : Base1, Base2 {
      };
      void UseBases(const Base1 &b1, const Base2 &b2);
    }
    

    By default all classes are wrapped and are available in Java, but, Derived has all bases ignored except the first. SWIG generates a warning for the above code:

    example.i:10: Warning 813: Warning for Derived, base Base2 ignored. 
    Multiple inheritance is not supported in Java.
    

    If we decide to wrap the two base classes as interfaces and add the following before SWIG parses the above example code:

    %include <swiginterface.i>
    %interface_impl(Space::Base1);
    %interface_impl(Space::Base2);
    

    then two interface files are generated, Base1.java and Base2.java in addition to proxy class files, Base1SwigImpl.java and Base2SwigImpl.java. The contents of interface file Base1.java for Base1 is shown below:

    public interface Base1 {
      long Base1_GetInterfaceCPtr();
      void Method1();
    }
    

    The proxy class in Base1SwigImpl.java for Base1 is as it would have been if %interface was not used, except the name has changed to Base1SwigImpl and it implements the appropriate base:

    public class Base1SwigImpl implements Base1 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Base1SwigImpl_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Base1SwigImpl_Method1(swigCPtr, this);
      }
    ...
    }
    

    In fact any class deriving from Base will now implement the interface instead of deriving from it (or ignoring the base in the case of multiple base classes). Hence the Derived proxy class will now implement both bases:

    public class Derived implements Base1, Base2 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public long Base2_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base2_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Derived_Method1(swigCPtr, this);
      }
    
      public void Method2() {
        exampleJNI.Derived_Method2(swigCPtr, this);
      }
    ...
    }
    

    Wherever a class marked as an interface is used, such as the UseBases method in the example, the interface name is used as the type in the Java layer:

      public static void UseBases(Base1 b1, Base2 b2) {
        exampleJNI.UseBases(b1.Base1_GetInterfaceCPtr(), b1, b2.Base2_GetInterfaceCPtr(), b2);
      }
    

    Note that each Java interface has a method added to obtain the correct C++ pointer for passing to the native function - Base1_GetInterfaceCPtr for Base1. This method is similar to the getCPtr method in the proxy classes. In fact, as shown above in the Derived class, the proxy classes implement this generated interface by calling a native method ( Derived_Base1_GetInterfaceCPtr) which calls an appropriate C++ cast of the pointer up the inheritance chain.

    The interface macros are implemented using the interface feature and typemaps. For example:

    %define %interface(CTYPE...)
    %feature("interface", name="%sSwigInterface") CTYPE;
    INTERFACE_TYPEMAPS(CTYPE)
    %enddef
    

    The feature accepts one attribute called name, which is the name of the Java interface mentioned earlier. The INTERFACE_TYPEMAPS macro implements the typemaps and can be viewed in the swiginterface.i file and contain the usual Java typemaps for generating code plus the javainterfacecode typemap which is only used when a class is marked with the interface feature. See Java code typemaps for details.

    25.5 Cross language polymorphism using directors

    Proxy classes provide a natural, object-oriented way to wrap C++ classes. as described earlier, each proxy instance has an associated C++ instance, and method calls from Java to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Java. In particular, if a C++ class has been extended in Java (by deriving from the proxy class), these classes will not be visible from C++ code. Virtual method calls from C++ are thus not able to access the lowest implementation in the inheritance chain.

    SWIG can address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Java implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Java and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Java code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions transparently takes care of all the cross-language method routing.

    25.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    25.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Java proxy classes. The director classes store a pointer to their underlying Java proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in Java via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its Java derived classes were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy JNI glue code that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Java. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Java, the Java API is used to call the method of the underlying Java object (after which the usual virtual method resolution in Java automatically finds the right implementation).

    25.5.3 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from Java types can result in large director methods. For this reason it is recommended that directors are selectively enabled only for specific classes that are likely to be extended in Java and used in C++.

    Although directors make it natural to mix native C++ objects with Java objects (as director objects), one should be aware of the obvious fact that method calls to Java objects from C++ will be much slower than calls to C++ objects. Additionally, compared to classes that do not use directors, the call routing in the director methods adds a small overhead. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Java.

    25.5.4 Simple directors example

    Consider the following SWIG interface file:

    %module(directors="1") example;
    
    %feature("director") DirectorBase;
    
    class DirectorBase {
    public:
      virtual ~DirectorBase() {}
      virtual void upcall_method() {}
    };
    
    void callup(DirectorBase *director) {
      director->upcall_method();
    }
    

    The following DirectorDerived Java class is derived from the Java proxy class DirectorBase and overrides upcall_method(). When C++ code invokes upcall_method() , the SWIG-generated C++ code redirects the call via JNI to the Java DirectorDerived subclass. Naturally, the SWIG generated C++ code and the generated Java intermediary class marshal and convert arguments between C++ and Java when needed.

    public class DirectorDerived extends DirectorBase {
      public DirectorDerived() {
      }
    
      public void upcall_method() {
        System.out.println("DirectorDerived::upcall_method() invoked.");
      }
    }
    

    Running the following Java code

    DirectorDerived director = new DirectorDerived();
    example.callup(director);
    

    will result in the following being output:

    DirectorDerived::upcall_method() invoked.
    

    25.5.5 Director threading issues

    Depending on your operating system and version of Java and how you are using threads, you might find the JVM hangs on exit. There are a couple of solutions to try out. The preferred solution requires jdk-1.4 and later and uses AttachCurrentThreadAsDaemon instead of AttachCurrentThread whenever a call into the JVM is required. This can be enabled by defining the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro when compiling the C++ wrapper code. For older JVMs define SWIG_JAVA_NO_DETACH_CURRENT_THREAD instead, to avoid the DetachCurrentThread call but this will result in a memory leak instead. For further details inspect the source code in the java/director.swg library file.

    Macros can be defined on the commandline when compiling your C++ code, or alternatively added to the C++ wrapper file as shown below:

    %insert("runtime") %{
    #define SWIG_JAVA_NO_DETACH_CURRENT_THREAD
    %}
    

    25.5.6 Director performance tuning

    When a new instance of a director (or subclass) is created in Java, the C++ side of the director performs a runtime check per director method to determine if that particular method is overridden in Java or if it should invoke the C++ base implementation directly. Although this makes initialization slightly more expensive, it is generally a good overall tradeoff.

    However, if all director methods are expected to usually be overridden by Java subclasses, then initialization can be made faster by avoiding these checks via the assumeoverride attribute. For example:

    %feature("director", assumeoverride=1) Foo;
    

    The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical.

    25.5.7 Java exceptions from directors

    With directors routing method calls to Java, and proxies routing them to C++, the handling of exceptions is an important concern. The default behavior from SWIG 3.0 onwards is to convert the thrown Java exception into a SWIG defined DirectorException C++ exception. SWIG 2.0 and earlier versions didn't provide any mechanism to handle the Java director method exceptions in C++.

    Converting Java exceptions into C++ exceptions can be done in two different ways using the director:except feature. In the simplest approach, a code block is attached to each director method to handle the mapping of Java exceptions into C++ exceptions.

    %feature("director:except") MyClass::method(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        jenv->ExceptionClear();
        if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException"))
          throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
        if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyJavaException"))
          throw MyCppException(Swig::JavaExceptionMessage(jenv, $error).message());
        throw std::runtime_error("Unexpected exception thrown in MyClass::method");
      }
    }
    
    class MyClass {
      /** Throws either a std::out_of_range or MyCppException on error */
      void method(int x);
    }
    

    This approach allows a flexible mapping of Java exceptions thrown by director methods into C++ exceptions expected by a C++ caller. There need not be any C++ exception specifications on the C++ method. The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are provided to simplify writing code for wrappers that use the director:except feature. The function Swig::ExceptionMatches matches the type of the jthrowable thrown against a fully qualified JNI style class name, such as "java/lang/IOError". If the throwable class is the same type, or derives from the given type, Swig::ExceptionMatches will return true. Care must be taken to provide the correct fully qualified name, since for wrapped exceptions the generated proxy class will have additional package qualification, depending on the '-package' argument and use of the nspace feature. The special variable $error is expanded by SWIG into a unique variable name and should be used for the assignment of the exception that occurred. The special variable $packagepath is replaced by the outer package provided for SWIG generation by the -package option. The utility class Swig::JavaExceptionMessage is a holder providing access to the message from the thrown Java exception. The message() method returns the exception message as a const char *, which is only valid during the lifetime of the holder. Any code using this message needs to copy it, for example into a std::string or a newly constructed C++ exception.

    Using the above approach to write handlers for a large number of methods will require repetitive duplication of the director:except feature code. To mitigate this, an alternative approach is provided via typemaps in a fashion analagous to the "throws" typemap. The "throws" typemap provides an approach to automatically map all the C++ exceptions listed in a method's defined exceptions (either from a C++ exception specification or a %catches feature) into Java exceptions. The "directorthrows" typemap provides the inverse mapping and should contain code to convert a suitably matching Java exception into a C++ exception. The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range :

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The "directorthrows" typemap is then used in conjunction with the director:except feature if the $directorthrowshandlers special variable is used in the feature code. Consider the following, which also happens to be the default:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        jenv->ExceptionClear();
        $directorthrowshandlers
        throw Swig::DirectorException(jenv, $error);
      }
    %}
    

    The code generated using the director:except feature replaces the $directorthrowshandlers special variable with the code in the "directorthrows" typemaps, for each and every exception defined for the method. The possible exceptions can be defined either with a C++ exception specification or %catches as described for the "throws" typemap.

    Consider the following director method:

      ...
      virtual void doSomething(int index) throw (std::out_of_range);
      ...
    

    When combined with the default director:except feature and the "directorthrows" typemap above, the resulting code generated in the director method after calling up to Java will be:

    jthrowable swigerror = jenv->ExceptionOccurred();
    if (swigerror) {
      jenv->ExceptionClear();
      if (Swig::ExceptionMatches(jenv, swigerror, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, swigerror).message());
      }
      
      throw Swig::DirectorException(jenv, swigerror);
    }
    

    Note: Beware of using exception specifications as the SWIG director methods will be generated with the same exception specifications and if the director method throws an exception that is not specified it is likely to terminate your program. See the C++ standard for more details. Using the %catches feature instead to define the handled exceptions does not suffer this potential fate.

    Because the default code generation maps any unhandled Java exceptions to Swig::DirectorException, any director methods that have exception specifications may cause program termination. To simply ignore unexpected exceptions, the default handling can be changed with:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        jenv->ExceptionClear();
        $directorthrowshandlers
        return $null; // exception is ignored
      }
    %}
    

    Alternatively an exception compatible with the existing director method exception specifications can be thrown. Assuming that all methods allow std::runtime_error to be thrown, the return $null; could be changed to:

      throw std::runtime_error(Swig::JavaExceptionMessage(jenv, $error).message());
    

    In more complex situations, a separate director:except feature may need to be attached to specific methods.

    Below is a complete example demonstrating the use of the "directorthrows" typemaps. In this example, a generic "directorthrows" typemap is appropriate for all three exceptions - all take single string constructors. If the exceptions had different constructors, it would be necessary to have separate typemaps for each exception type.

    %module(directors="1") example
    
    %{
      #include <string>
      #include <stdexcept>
    %}
    
    // Define exceptions in header section using std::runtime_error
    %define DEFINE_EXCEPTION(NAME)
    %{
      namespace MyNS {
        struct NAME : public std::runtime_error { NAME(const std::string &what) : runtime_error(what) {} };
      }
    %}
    %enddef
    
    // Expose C++ exceptions as Java Exceptions by changing the Java base class and providing a getMessage()
    %define DECLARE_EXCEPTION(NAME)
    %typemap(javabase) MyNS::NAME "java.lang.Exception";
    %rename(getMessage) MyNS::NAME::what;
    namespace MyNS {
      struct NAME {
        NAME(const std::string& what);
        const char * what();
      };
    }
    %enddef
    
    DEFINE_EXCEPTION(ExceptionA)
    DEFINE_EXCEPTION(ExceptionB)
    DEFINE_EXCEPTION(Unexpected)
    
    // Mark three methods to map director thrown exceptions.
    %feature("director:except") MyClass::meth1(int);
    %feature("director:except") MyClass::meth2;
    %feature("director:except") meth3;
    
    %typemap(directorthrows) MyNS::ExceptionA, MyNS::ExceptionB, MyNS::Unexpected %{
      if (Swig::ExceptionMatches(jenv, $error, "$packagepath/$javaclassname"))
        throw $1_type(Swig::JavaExceptionMessage(jenv, $error).message());
    %}
    
    DECLARE_EXCEPTION(ExceptionA)
    DECLARE_EXCEPTION(ExceptionB)
    DECLARE_EXCEPTION(Unexpected)
    
    %catches(MyNS::ExceptionA, MyNS::ExceptionB, MyNS::Unexpected) MyClass::meth2();
    
    %inline {
      class MyClass {
      public:
        virtual void meth1(int x) throw(MyNS::ExceptionA, MyNS::ExceptionB) = 0;
        virtual void meth2() = 0;   /* throws MyNS::ExceptionA, MyNS::ExceptionB, MyNS::Unexpected */
        virtual void meth3(float x) throw(MyNS::Unexpected) = 0;
        virtual ~MyClass() {}
      };
    }
    

    In this case the three different "directorthrows" typemaps will be used to generate the three different exception handlers for meth1 , meth2 and meth3. The generated handlers will have "if" blocks for each exception type specified, in the exception specification or %catches feature.

    Note that the "directorthrows" typemaps are important only if it is important for the the exceptions passed through the C++ layer to be mapped to distinct C++ exceptions. If director methods are being called by C++ code that is itself wrapped in a SWIG generated Java wrapper and access is always through this wrapper, the default Swig::DirectorException class provides enough information to reconstruct the original exception. In this case removing the $directorthrowshandlers special variable from the default director:except feature and simply always throwing a Swig::DirectorException will achieve the desired result. Along with this a generic exception feature is added to convert any caught Swig::DirectorExceptions back into the underlying Java exceptions via the Swig::DirectorException::raiseJavaException method, as demonstrated with %javaexception below:

    %javaexception("Exception") MyClass::myMethod %{
      try {
        $action
      } catch (Swig::DirectorException &e) {
        // raise/throw the Java exception that originally caused the DirectorException
        e.raiseJavaException(jenv);
        return $null;
      }
    %}
    

    See the Exception handling with %exception and %javaexception section for more on converting C++ exceptions to Java exceptions.

    25.6 Accessing protected members

    When using directors, the protected virtual methods are also wrapped. These methods are wrapped with a protected Java proxy method, so the only way that Java code can access these is from within a Java class derived from the director class.

    Members which are protected and non-virtual can also be accessed when using the 'allprotected' mode. The allprotected mode requires directors and is turned on by setting the allprotected option in addition to the directors option in the %module directive, like this:

    %module(directors="1", allprotected="1") modulename
    

    Protected member variables and methods (both static and non-static) will then be wrapped with protected access in the Java proxy class.

    Note: Neither the directors option nor the allprotected mode support types defined with protected scope. This includes any enums or typedefs declared in the protected section of the C++ class.

    The following simple example is a class with numerous protected members, including the constructor and destructor:

    %module(directors="1", allprotected="1") example
    
    %feature("director") ProtectedBase;
    
    // Ignore use of unsupported types (those defined in the protected section)
    %ignore ProtectedBase::typedefs;
    
    %inline %{
    
    class ProtectedBase {
    protected:
      ProtectedBase() {}
      virtual ~ProtectedBase() {}
      virtual void virtualMethod() const {}
      void nonStaticMethod(double d) const {}
      static void staticMethod(int i) {}
      int instanceMemberVariable;
      static int staticMemberVariable;
    
      // unsupported: types defined with protected access and the methods/variables which use them
      typedef int IntegerType;
      IntegerType typedefs(IntegerType it) { return it; }
    };
    int ProtectedBase::staticMemberVariable = 10;
    
    %}
    
    

    Note that the IntegerType has protected scope and the members which use this type must be ignored as they cannot be wrapped.

    The proxy methods are protected, so the only way the protected members can be accessed is within a class that derives from the director class, such as the following:

    class MyProtectedBase extends ProtectedBase
    {
      public MyProtectedBase() {
      }
    
      public void accessProtected() {
        virtualMethod();
        nonStaticMethod(1.2);
        staticMethod(99);
    
        setInstanceMemberVariable(5);
        int i = getInstanceMemberVariable();
    
        setStaticMemberVariable(10);
        i = getStaticMemberVariable();
      }
    }
    

    25.7 Common customization features

    An earlier section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve the interface to existing C/C++ code.

    25.7.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    typedef struct Image {...};
    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Java, but there may be no easy way to call it. The problem here is that a type wrapper class is generated for the two dimensional array parameter so there is no easy way to construct and manipulate a suitable double [4][4] value. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Java, you could then write code like this:

    Image im = new Image();
    SWIGTYPE_p_a_4__double a = example.new_mat44();
    example.mat44_set(a, 0, 0, 1.0);
    example.mat44_set(a, 1, 1, 1.0);
    example.mat44_set(a, 2, 2, 1.0);
    ...
    example.set_transform(im, a);
    example.free_mat44(a);
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to improve on this using Java code, typemaps, and other customization features as covered in later sections, but sometimes helper functions are a quick and easy solution to difficult cases.

    25.7.2 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods or constructors. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *toString() {
          static char tmp[1024];
          sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
          return tmp;
      }
      Vector(double x, double y, double z) {
          Vector *v = (Vector *) malloc(sizeof(Vector));
          v->x = x;
          v->y = y;
          v->z = z;
          return v;
      }
    };
    

    Now, in Java

    Vector v = new Vector(2, 3, 4);
    System.out.println(v);
    

    will display

    Vector(2, 3, 4)
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Java interface.

    25.7.3 Class extension with %proxycode

    The previous section described how to extend a wrapped class with C or C++ code. This section describes how to extend a wrapped class with Java code instead of C/C++ code. The %proxycode directive is used and is just a macro for %insert("proxycode"). The Code insertion block section describes the %insert directive. The section of code for insertion is "proxycode", that is, the Java proxy class. This directive must hence only be used within the scope of a class, otherwise it is silently ignored. There are two common ways to get the scope correct.

    The first is to use %proxycode inside a class that SWIG parses, for example a toString() method can be added to a C++ class using pure Java code. A C++ header file can mix C++ and Java code inside the C++ class as follows:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    

    The second is to use %proxycode within %extend as everything within a %extend block is effectively within the scope of the class, for example:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    
    %extend Flag {
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    }
    

    There is some very limited support of typemaps within a %proxycode block. A useful trick is to obtain the Java type for a given C/C++ type using the $typemap special macro. The following C++ template demonstrates this:

    %inline %{
    template<typename T> struct Value {
      T value;
      Value(const T& val) : value(val) {}
    };
    %}
    
    %extend Value {
    %proxycode %{
      public String toString() {
        // Note template type expansion is supported, so T is expanded to 'unsigned int' in this example
        // and $typemap(jstype, unsigned int) in turn is expanded to 'long'
        $typemap(jstype, T) val = getValue();
        return "$javaclassname value: " + val + " Java type: $typemap(jstype, T) JNI type: $typemap(jni, T)";
      }
    %}
    }
    %template(ValueUnsignedInt) Value<unsigned int>;
    

    The generated Java contains the expanded special variable and macro resulting in Java proxy code:

    public class ValueUnsignedInt {
      ...
      public String toString() {
        long val = getValue();
        return "ValueUnsignedInt value: " + val + " Java type: long JNI type: jlong";
      }
    
    }
    

    25.7.4 Exception handling with %exception and %javaexception

    If a C or C++ function throws an error, you may want to convert that error into a Java exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    In Java,

    SWIGTYPE_p_void a = example.malloc(2000000000);
    

    will produce a familiar looking Java exception:

    Exception in thread "main" java.lang.OutOfMemoryError: Not enough memory
            at exampleJNI.malloc(Native Method)
            at example.malloc(example.java:16)
            at runme.main(runme.java:112)
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception malloc {
      $action
      if (err_occurred()) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. The $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped. The return $null; handles all native method return types, namely those that have a void return and those that do not. This is useful for typemaps that will be used in native method returning all return types. See the section on Java special variables for further explanation.

    C++ exceptions are also easy to handle. We can catch the C++ exception and rethrow it as a Java exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
      public:
        FooClass *getitem(int index);      // Might throw std::out_of_range exception
        ...
    };
    

    In the example above, java.lang.Exception is a checked exception class and so ought to be declared in the throws clause of getitem. Classes can be specified for adding to the throws clause using %javaexception(classes) instead of %exception, where classes is a string containing one or more comma separated Java classes. The %clearjavaexception feature is the equivalent to %clearexception and clears previously declared exception handlers. The %nojavaexception feature is the equivalent to %noexception and disables the exception handler. See Clearing features for the difference on disabling and clearing features.

    %javaexception("java.lang.Exception") getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
    public:
      FooClass *getitem(int index);      // Might throw std::out_of_range exception
      ...
    };
    

    The generated proxy method now generates a throws clause containing java.lang.Exception:

    public class FooClass {
      ...
      public FooClass getitem(int index) throws java.lang.Exception { ... }
      ...
    }
    

    The examples above first use the C JNI calling syntax then the C++ JNI calling syntax. The C++ calling syntax will not compile as C and also vice versa. It is however possible to write JNI calls which will compile under both C and C++ and is covered in the Typemaps for both C and C++ compilation section.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter. The typemap example Handling C++ exception specifications as Java exceptions provides further exception handling capabilities.

    25.7.5 Method access with %javamethodmodifiers

    A Java feature called %javamethodmodifiers can be used to change the method modifiers from the default public. It applies to both module class methods and proxy class methods. For example:

    %javamethodmodifiers protect_me() "protected";
    void protect_me();
    

    Will produce the method in the module class with protected access.

    protected static void protect_me() {
      exampleJNI.protect_me();
    }
    

    25.8 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings and arrays. This chapter discusses the common techniques for solving these problems.

    25.8.1 Input and output parameters using primitive pointers and references

    A common problem in some C programs is handling parameters passed as simple pointers or references. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The typemaps.i library file will help in these situations. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Java, this allows you to pass simple values. For example:

    int result = example.sub(7, 4);
    System.out.println("7 - 4 = " + result);
    int[] sum = {0};
    example.add(3, 4, sum);
    System.out.println("3 + 4 = " + sum[0]);
    

    Which will display:

    7 - 4 = 3
    3 + 4 = 7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter will return the result in the first element of the integer array.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Java, the input parameter is the first element in a 1 element array and is replaced by the output of the function. For example:

    int[] neg = {3};
    example.negate(neg);
    System.out.println("Negative of 3 = " + neg[0]);
    

    And no prizes for guessing the output:

    Negative of 3 = -3
    

    These typemaps can also be applied to C++ references. The above examples would work the same if they had been defined using references instead of pointers. For example, the Java code to use the negate function would be the same if it were defined either as it is above:

    void negate(int *INOUT);
    

    or using a reference:

    void negate(int &INOUT);
    

    Note: Since most Java primitive types are immutable and are passed by value, it is not possible to perform in-place modification of a type passed as a parameter.

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    will not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    25.8.2 Simple pointers

    If you must work with simple pointers such as int * or double * another approach to using typemaps.i is to use the cpointer.i pointer library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int intPtr = example.new_intp();
    example.add(3, 4, intPtr);
    int result = example.intp_value(intPtr);
    System.out.println("3 + 4 = " + result);
    

    If you replace %pointer_functions(int, intp) by %pointer_class(int, intp), the interface is more class-like.

    intp intPtr = new intp();
    example.add(3, 4, intPtr.cast());
    int result = intPtr.value();
    System.out.println("3 + 4 = " + result);
    

    See the SWIG Library chapter for further details.

    25.8.3 Wrapping C arrays with Java arrays

    SWIG can wrap arrays in a more natural Java manner than the default by using the arrays_java.i library file. Let's consider an example:

    %include "arrays_java.i";
    int array[4];
    void populate(int x[]) {
      int i;
      for (i=0; i<4; i++)
        x[i] = 100 + i;
    }
    

    These one dimensional arrays can then be used as if they were Java arrays:

    int[] array = new int[4];
    example.populate(array);
    
    System.out.print("array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(array[i] + " ");
    
    example.setArray(array);
    
    int[] global_array = example.getArray();
    
    System.out.print("\nglobal_array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(global_array[i] + " ");
    

    Java arrays are always passed by reference, so any changes a function makes to the array will be seen by the calling function. Here is the output after running this code:

    array: 100 101 102 103
    global_array: 100 101 102 103
    

    Note that for assigning array variables the length of the C variable is used, so it is possible to use a Java array that is bigger than the C code will cope with. Only the number of elements in the C array will be used. However, if the Java array is not large enough then you are likely to get a segmentation fault or access violation, just like you would in C. When arrays are used in functions like populate, the size of the C array passed to the function is determined by the size of the Java array.

    Please be aware that the typemaps in this library are not efficient as all the elements are copied from the Java array to a C array whenever the array is passed to and from JNI code. There is an alternative approach using the SWIG array library and this is covered in the next section.

    25.8.4 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    One of the ways to wrap this is to apply the Java array typemaps that come in the arrays_java.i library file:

    %include "arrays_java.i"
    %apply int[] {int *};
    

    The ANY size will ensure the typemap is applied to arrays of all sizes. You could narrow the typemap matching rules by specifying a particular array size. Now you can use a pure Java array and pass it to the C code:

    int[] array = new int[10000000];          // Array of 10-million integers
    for (int i=0; i<array.length; i++) {      // Set some values
      array[i] = i;
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    and the sum would be displayed:

    Sum = 49995000
    

    This approach is probably the most natural way to use arrays. However, it suffers from performance problems when using large arrays as a lot of copying of the elements occurs in transferring the array from the Java world to the C++ world. An alternative approach to using Java arrays for C arrays is to use an alternative SWIG library file carrays.i. This approach can be more efficient for large arrays as the array is accessed one element at a time. For example:

    %include "carrays.i"
    %array_functions(int, intArray);
    

    The %array_functions(type, name) macro generates four helper functions that can be used to create and destroy arrays and operate on elements. In this case, the functions are as follows:

    int *new_intArray(int nelements);
    void delete_intArray(int *x);
    int intArray_getitem(int *x, int index);
    void intArray_setitem(int *x, int index, int value);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int array = example.new_intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {                           // Set some values
      example.intArray_setitem(array, i, i);
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    If you replace %array_functions(int, intp) by %array_class(int, intp), the interface is more class-like and a couple more helper functions are available for casting between the array and the type wrapper class.

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Java:

    intArray array = new intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {             // Set some values
      array.setitem(i, i);
    }
    int sum = example.sumitems(array.cast(), 10000);
    System.out.println("Sum = " + sum);
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    25.8.5 Binary data vs Strings

    By default SWIG handles char * as a string but there is a handy multi-argument typemap available as mentioned in Passing binary data. The following simple example demonstrates using a byte array instead of passing the default string type and length to the wrapped function.

    %apply (char *STRING, size_t LENGTH) { (const char data[], size_t len) }
    %inline %{
    void binaryChar1(const char data[], size_t len) {
      printf("len: %d data: ", len);
      for (size_t i=0; i<len; ++i)
        printf("%x ", data[i]);
      printf("\n");
    }
    %}
    

    Calling from Java requires just the byte array to be passed in as the multi-argument typemap being applied reduces the number of arguments in the target language to one, from the original two:

    byte[] data = "hi\0jk".getBytes();
    example.binaryChar1(data);     
    

    resulting in the output

    $ java runme
    len: 5 data: 68 69 0 6a 6b
    

    25.8.6 Overriding new and delete to allocate from Java heap

    Unlike some languages supported by SWIG, Java has a true garbage collection subsystem. Other languages will free SWIG wrapped objects when their reference count reaches zero. Java only schedules these objects for finalization, which may not occur for some time. Because SWIG objects are allocated on the C heap, Java users may find the JVM memory use quickly exceeds the assigned limits, as memory fills with unfinalized proxy objects. Forcing garbage collection is clearly an undesirable solution.

    An elegant fix for C++ users is to override new and delete using the following code (here shown included in a SWIG interface file)

    /* File: java_heap.i */
    %module test
    %{
    #include <stdexcept>
    #include "jni.h"
    
    /**
     *  A stash area embedded in each allocation to hold java handles
     */
    struct Jalloc {
      jbyteArray jba;
      jobject ref;
    };
    
    static JavaVM *cached_jvm = 0;
    
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
      cached_jvm = jvm;
      return JNI_VERSION_1_2;
    }
    
    static JNIEnv * JNU_GetEnv() {
      JNIEnv *env;
      jint rc = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2);
      if (rc == JNI_EDETACHED)
        throw std::runtime_error("current thread not attached");
      if (rc == JNI_EVERSION)
        throw std::runtime_error("jni version not supported");
      return env;
    }
    
    void * operator new(size_t t) {
      if (cached_jvm != 0) {
        JNIEnv *env = JNU_GetEnv();
        jbyteArray jba = env->NewByteArray((int) t + sizeof(Jalloc));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        void *jbuffer = static_cast<void *>(env->GetByteArrayElements(jba, 0));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        Jalloc *pJalloc = static_cast<Jalloc *>(jbuffer);
        pJalloc->jba = jba;
        /* Assign a global reference so byte array will persist until delete'ed */
        pJalloc->ref = env->NewGlobalRef(jba);
        if (env->ExceptionOccurred())
          throw bad_alloc();
        return static_cast<void *>(static_cast<char *>(jbuffer) + sizeof(Jalloc));
      }
      else { /* JNI_OnLoad not called, use malloc and mark as special */
        Jalloc *pJalloc = static_cast<Jalloc *>(malloc((int) t + sizeof(Jalloc)));
        if (!pJalloc)
          throw bad_alloc();
        pJalloc->ref = 0;
        return static_cast<void *>(
            static_cast<char *>(static_cast<void *>(pJalloc)) + sizeof(Jalloc));
      }
    }
    
    void operator delete(void *v) {
      if (v != 0) {
        void *buffer = static_cast<void *>( static_cast<char *>(v) - sizeof(Jalloc));
        Jalloc *pJalloc = static_cast<Jalloc *>(buffer);
        if (pJalloc->ref) {
          JNIEnv *env = JNU_GetEnv();
          env->DeleteGlobalRef(pJalloc->ref);
          env->ReleaseByteArrayElements(pJalloc->jba, static_cast<jbyte *>(buffer), 0);
        }
        else {
          free(buffer);
        }
      }
    }
    %}
    ...
    

    This code caches the Java environment during initialization, and when new is called, a Java ByteArray is allocated to provide the SWIG objects with space in the Java heap. This has the combined effect of re-asserting the Java virtual machine's limit on memory allocation, and puts additional pressure on the garbage collection system to run more frequently. This code is made slightly more complicated because allowances must be made if new is called before the JNI_OnLoad is executed. This can happen during static class initialization, for example.

    Unfortunately, because most Java implementations call malloc and free, this solution will not work for C wrapped structures. However, you are free to make functions that allocate and free memory from the Java heap using this model and use these functions in place of malloc and free in your own code.

    25.9 Java typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. You are advised to be familiar with the material in the " Typemaps" chapter. While not absolutely essential knowledge, this section assumes some familiarity with the Java Native Interface (JNI). JNI documentation can be consulted either online at Sun's Java web site or from a good JNI book. The following two books are recommended:

    • Title: 'Essential JNI: Java Native Interface.' Author: Rob Gordon. Publisher: Prentice Hall. ISBN: 0-13-679895-0.
    • Title: 'The Java Native Interface: Programmer's Guide and Specification.' Author: Sheng Liang. Publisher: Addison-Wesley. ISBN: 0-201-32577-2. Also available online at the Sun Developer Network.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the generated code.

    25.9.1 Default primitive type mappings

    The following table lists the default type mapping from Java to C/C++.

    C/C++ typeJava typeJNI type
    bool
    const bool &
    booleanjboolean
    char
    const char &
    charjchar
    signed char
    const signed char &
    bytejbyte
    unsigned char
    const unsigned char &
    shortjshort
    short
    const short &
    shortjshort
    unsigned short
    const unsigned short &
    intjint
    int
    const int &
    intjint
    unsigned int
    const unsigned int &
    longjlong
    long
    const long &
    intjint
    unsigned long
    const unsigned long &
    longjlong
    long long
    const long long &
    longjlong
    unsigned long long
    const unsigned long long &
    java.math.BigInteger jobject
    float
    const float &
    floatjfloat
    double
    const double &
    doublejdouble
    char *
    char []
    Stringjstring

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    Given the following C function:

    void func(unsigned short a, char *b, const long &c, unsigned long long d);
    

    The module class method would be:

    public static void func(int a, String b, int c, java.math.BigInteger d) {...}
    

    The intermediary JNI class would use the same types:

    public final static native void func(int jarg1, String jarg2, int jarg3,
                                         java.math.BigInteger jarg4);
    

    and the JNI function would look like this:

    SWIGEXPORT void JNICALL Java_exampleJNI_func(JNIEnv *jenv, jclass jcls,
                    jint jarg1, jstring jarg2, jint jarg3, jobject jarg4) {...}
    

    The mappings for C int and C long are appropriate for 32 bit applications which are used in the 32 bit JVMs. There is no perfect mapping between Java and C as Java doesn't support all the unsigned C data types. However, the mappings allow the full range of values for each C type from Java.

    25.9.2 Default typemaps for non-primitive types

    The previous section covered the primitive type mappings. Non-primitive types such as classes and structs are mapped using pointers on the C/C++ side and storing the pointer into a Java long variable which is held by the proxy class or type wrapper class. This applies whether the type is marshalled as a pointer, by reference or by value. It also applies for any unknown/incomplete types which use type wrapper classes.

    So in summary, the C/C++ pointer to non-primitive types is cast into the 64 bit Java long type and therefore the JNI type is a jlong. The Java type is either the proxy class or type wrapper class.

    25.9.3 Sixty four bit JVMs

    If you are using a 64 bit JVM you may have to override the C long, but probably not C int default mappings. Mappings will be system dependent, for example long will need remapping on Unix LP64 systems (long, pointer 64 bits, int 32 bits), but not on Microsoft 64 bit Windows which will be using a P64 IL32 (pointer 64 bits and int, long 32 bits) model. This may be automated in a future version of SWIG. Note that the Java write once run anywhere philosophy holds true for all pure Java code when moving to a 64 bit JVM. Unfortunately it won't of course hold true for JNI code.

    25.9.4 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Java to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is a placeholder for a local variable of type int. The $input variable contains the Java data, the JNI jint in this case.

    When this example is compiled into a Java module, it can be used as follows:

    System.out.println(example.fact(6));
    

    and the output will be:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer nonnegative);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
    ...
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Java parameter. This allows the function to be used like this (notice how the length parameter is omitted):

    int c = example.count('e', "Hello World");
    

    25.9.5 Typemaps for mapping C/C++ types to Java types

    The typemaps available to the Java module include the common typemaps listed in the main typemaps section. There are a number of additional typemaps which are necessary for using SWIG with Java. The most important of these implement the mapping of C/C++ types to Java types:


     
    TypemapDescription
    jniJNI C types. These provide the default mapping of types from C/C++ to JNI for use in the JNI (C/C++) code.
    jtypeJava intermediary types. These provide the default mapping of types from C/C++ to Java for use in the native functions in the intermediary JNI class. The type must be the equivalent Java type for the JNI C type specified in the "jni" typemap.
    jstypeJava types. These provide the default mapping of types from C/C++ to Java for use in the Java module class, proxy classes and type wrapper classes.
    javainConversion from jstype to jtype. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). In other words the typemap provides the conversion to the native method call parameter types.
    javaoutConversion from jtype to jstype. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). In other words the typemap provides the conversion from the native method call return type.
    javadirectorinConversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java. See Director typemaps.
    javadirectoroutConversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall. See Director typemaps.
    directorinConversion from C++ type to jni type for director methods. These are C++ typemaps which convert the parameters used in the C++ director method to the appropriate JNI intermediary type. The conversion is done in JNI code prior to calling the Java function from the JNI code. See Director typemaps.
    directoroutConversion from jni type to C++ type for director methods. These are C++ typemaps which convert the JNI return type used in the C++ director method to the appropriate C++ return type. The conversion is done in JNI code after calling the Java function from the JNI code. See Director typemaps.

    If you are writing your own typemaps to handle a particular type, you will normally have to write a collection of them. The default typemaps are in "java.swg" and so might be a good place for finding typemaps to base any new ones on.

    The "jni", "jtype" and "jstype" typemaps are usually defined together to handle the Java to C/C++ type mapping. An "in" typemap should be accompanied by a "javain" typemap and likewise an "out" typemap by a "javaout" typemap. If an "in" typemap is written, a "freearg" and "argout" typemap may also need to be written as some types have a default "freearg" and/or "argout" typemap which may need overriding. The "freearg" typemap sometimes releases memory allocated by the "in" typemap. The "argout" typemap sometimes sets values in function parameters which are passed by reference in Java.

    Note that the "in" typemap marshals the JNI type held in the "jni" typemap to the real C/C++ type and for the opposite direction, the "out" typemap marshals the real C/C++ type to the JNI type held in the "jni" typemap. For non-primitive types the "in" and "out" typemaps are responsible for casting between the C/C++ pointer and the 64 bit jlong type. There is no portable way to cast a pointer into a 64 bit integer type and the approach taken by SWIG is mostly portable, but breaks C/C++ aliasing rules. In summary, these rules state that a pointer to any type must never be dereferenced by a pointer to any other incompatible type. The following code snippet might aid in understand aliasing rules better:

    short a;
    short* pa = 0;
    int i = 0x1234;
    
    a = (short)i;    /* okay */
    a = *(short*)&i; /* breaks aliasing rules */
    

    An email posting, Aliasing, pointer casts and gcc 3.3 elaborates further on the subject. In SWIG, the "in" and "out" typemaps for pointers are typically

    %typemap(in) struct Foo * %{
      $1 = *(struct Foo **)&$input; /* cast jlong into C ptr */
    %}
    %typemap(out) struct Bar * %{
      *(struct Bar **)&$result = $1; /* cast C ptr into jlong */
    %}
    struct Bar {...};
    struct Foo {...};
    struct Bar * FooBar(struct Foo *f);
    

    resulting in the following code which breaks the aliasing rules:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_FooBar(JNIEnv *jenv, jclass jcls,
                                                    jlong jarg1, jobject jarg1_) {
      jlong jresult = 0 ;
      struct Foo *arg1 = (struct Foo *) 0 ;
      struct Bar *result = 0 ;
      
      (void)jenv;
      (void)jcls;
      (void)jarg1_;
      arg1 = *(struct Foo **)&jarg1; 
      result = (struct Bar *)FooBar(arg1);
      *(struct Bar **)&jresult = result; 
      return jresult;
    }
    

    If you are using gcc as your C compiler, you might get a "dereferencing type-punned pointer will break strict-aliasing rules" warning about this. Please see Compiling a dynamic module to avoid runtime problems with these strict aliasing rules.

    The default code generated by SWIG for the Java module comes from the typemaps in the "java.swg" library file which implements the Default primitive type mappings and Default typemaps for non-primitive types covered earlier. There are other type mapping typemaps in the Java library. These are listed below:


     
    C TypeTypemap FileKindJava Type Function
    primitive pointers and referencesINPUT typemaps.iinputJava basic typesAllows values to be used for C functions taking pointers for data input.
    primitive pointers and referencesOUTPUT typemaps.ioutputJava basic type arraysAllows values held within an array to be used for C functions taking pointers for data output.
    primitive pointers and referencesINOUT typemaps.iinput
    output
    Java basic type arraysAllows values held within an array to be used for C functions taking pointers for data input and output.
    string
    wstring
    [unnamed]std_string.iinput
    output
    StringUse for std::string mapping to Java String.
    arrays of primitive types[unnamed] arrays_java.iinput
    output
    arrays of primitive Java typesUse for mapping C arrays to Java arrays.
    arrays of classes/structs/unionsJAVA_ARRAYSOFCLASSES macroarrays_java.iinput
    output
    arrays of proxy classesUse for mapping C arrays to Java arrays.
    arrays of enumsARRAYSOFENUMSarrays_java.i input
    output
    int[]Use for mapping C arrays to Java arrays (typeunsafe and simple enum wrapping approaches only).
    char *BYTEvarious.iinput byte[]Java byte array is converted to char array
    char **STRING_ARRAYvarious.iinput
    output
    String[]Use for mapping NULL terminated arrays of C strings to Java String arrays
    unsigned char *NIOBUFFERvarious.i input
    output
    java.nio.BufferUse for mapping directly allocated buffers to c/c++. useful with directors and long lived memory objects

    25.9.6 Java typemap attributes

    There are a few additional typemap attributes that the Java module supports.

    The first of these is the 'throws' attribute. The throws attribute is optional and specified after the typemap name and contains one or more comma separated classes for adding to the throws clause for any methods that use that typemap. It is analogous to the %javaexception feature's throws attribute.

    %typemap(typemapname, throws="ExceptionClass1, ExceptionClass2") type { ... }
    

    The attribute is necessary for supporting Java checked exceptions and can be added to just about any typemap. The list of typemaps include all the C/C++ (JNI) typemaps in the " Typemaps" chapter and the Java specific typemaps listed in the previous section, barring the "jni", "jtype" and "jstype" typemaps as they could never contain code to throw an exception.

    The throws clause is generated for the proxy method as well as the JNI method in the JNI intermediary class. If a method uses more than one typemap and each of those typemaps have classes specified in the throws clause, the union of the exception classes is added to the throws clause ensuring there are no duplicate classes. See the NaN exception example for further usage.

    The "jtype" typemap has the optional 'nopgcpp' attribute which can be used to suppress the generation of the premature garbage collection prevention parameter.

    The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. These are used for generating code before and after the JNI call in the proxy class or module class. The 'pre' attribute contains code that is generated before the JNI call and the 'post' attribute contains code generated after the JNI call. The 'pgcppname' attribute is used to change the premature garbage collection prevention parameter name passed to the JNI function. This is sometimes needed when the 'pre' typemap creates a temporary variable which is then passed to the JNI function.

    Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a this call. In Java the this call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a Date marshalling example showing 'pre', 'post' and 'pgcppname' attributes in action.

    25.9.7 Java special variables

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation , for example $1, $input, $result etc.

    The Java module uses a few additional special variables:

    $javaclassname
    This special variable works like the other special variables and $javaclassname is similar to $1_type. It expands to the class name for use in Java given a pointer. SWIG wraps unions, structs and classes using pointers and in this case it expands to the Java proxy class name. For example, $javaclassname is replaced by the proxy classname Foo when wrapping a Foo * and $&javaclassname expands to the proxy classname when wrapping the C/C++ type Foo and $*javaclassname expands to the proxy classname when wrapping Foo *&. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_unsigned_short is generated when wrapping unsigned short *. The class name is fully qualified with the package name when using the nspace feature.

    $javaclazzname
    This special variable works like $javaclassname, but expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_. This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix.

    $null
    Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example:

    %typemap(check) int * %{ 
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return $null;
      }
    %}
    

    If the typemap gets put into a function with void as return, $null will expand to nothing:

    SWIGEXPORT void JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return ;
      }
      ...
    }
    

    otherwise $null expands to NULL

    SWIGEXPORT jobject JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return NULL;
      }
      ...
    }
    

    $javainput, $jnicall and $owner
    The $javainput special variable is used in "javain" typemaps and $jnicall and $owner are used in "javaout" typemaps. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the intermediary JNI class. $owner is replaced by either true if %newobject has been used, otherwise false . $javainput is analogous to the $input special variable. It is replaced by the parameter name.

    Here is an example:

    %typemap(javain) Class "Class.getCPtr($javainput)"
    %typemap(javain) unsigned short "$javainput"
    %typemap(javaout) Class * {
        return new Class($jnicall, $owner);
      }
    
    %inline %{
      class Class {...};
      Class * bar(Class cls, unsigned short ush) { return new Class(); };
    %}
    

    The generated proxy code is then:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), false);
    }
    

    Here $javainput has been replaced by cls and ush. $jnicall has been replaced by the native method call, exampleJNI.bar(...) and $owner has been replaced by false. If %newobject is used by adding the following at the beginning of our example:

    %newobject bar(Class cls, unsigned short ush);
    

    The generated code constructs the return type using true indicating the proxy class Class is responsible for destroying the C++ memory allocated for it in bar:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), true);
    }
    

    $static
    This special variable expands to either static or nothing depending on whether the class is an inner Java class or not. It is used in the "javaclassmodifiers" typemap so that global classes can be wrapped as Java proxy classes and nested C++ classes/enums can be wrapped with the Java equivalent, that is, static inner proxy classes.

    $error, $jniinput, $javacall and $packagepath
    These special variables are used in the directors typemaps. See Director specific typemaps for details.

    $module
    This special variable expands to the module name, as specified by %module or the -module commandline option.

    $imclassname
    This special variable expands to the intermediary class name. Usually this is the same as '$moduleJNI', unless the jniclassname attribute is specified in the %module directive.

    $javainterfacename
    This special variable is only expanded when the interface feature is applied to a class. It works much like $javaclassname , but instead of expanding to the proxy classname, it expands to the value in the name attribute in the interface feature. For example:

    %feature("interface", name="MyInterface") MyClass;
    %typemap(jstype) MyClass  "$&javainterfacename"
    %typemap(jstype) MyClass * "$javainterfacename"
    

    will result in the jstype typemap expanding to MyInterface for both MyClass and MyClass *. The interface name is fully qualified with the package name when using the nspace feature.

    $interfacename
    This special variable is only expanded when the interface feature is applied to a class. It expands to just the interface name and is thus different to $javainterfacename in that it is not fully qualified with the package name when using the nspace feature.

    25.9.8 Typemaps for both C and C++ compilation

    JNI calls must be written differently depending on whether the code is being compiled as C or C++. For example C compilation requires the pointer to a function pointer struct member syntax like

    const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    

    whereas C++ code compilation of the same function call is a member function call using a class pointer like

    const jclass clazz = jenv->FindClass("java/lang/String");
    

    To enable typemaps to be used for either C or C++ compilation, a set of JCALLx macros have been defined in Lib/java/javahead.swg, where x is the number of arguments in the C++ version of the JNI call. The above JNI calls would be written in a typemap like this

    const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
    

    Note that the SWIG preprocessor expands these into the appropriate C or C++ JNI calling convention. The C calling convention is emitted by default and the C++ calling convention is emitted when using the -c++ SWIG commandline option. If you do not intend your code to be targeting both C and C++ then your typemaps can use the appropriate JNI calling convention and need not use the JCALLx macros.

    25.9.9 Java code typemaps

    Most of SWIG's typemaps are used for the generation of C/C++ code. The typemaps in this section are used solely for the generation of Java code. Elements of proxy classes and type wrapper classes come from the following typemaps (the defaults).

    %typemap(javabase)

    base (extends) for Java class: empty default
    Note that this typemap accepts a replace attribute as an optional flag. When set to "1", it will replace/override any C++ base classes that might have been parsed. If this flag is not specified and there are C++ base classes, then a multiple inheritance warning is issued and the code in the typemap is ignored. The typemap also accepts a notderived attribute as an optional flag. When set to "1", it will not apply to classes that are derived from a C++ base. When used with the SWIGTYPE type, it is useful for giving a common base for all proxy classes, that is, providing a base class that sits in between all proxy classes and the Java base class Object for example: %typemap(javabase, notderived="1") SWIGTYPE "CommonBase".

    %typemap(javabody)

    the essential support body for proxy classes (proxy base classes only), typewrapper classes and enum classes. Default contains extra constructors, memory ownership control member variables (swigCMemOwn, swigCPtr), the getCPtr method etc.

    %typemap(javabody_derived)

    the essential support body for proxy classes (derived classes only). Same as "javabody" typemap, but only used for proxy derived classes.

    %typemap(javaclassmodifiers)

    class modifiers for the Java class: default is "public class"

    %typemap(javacode)

    Java code is copied verbatim to the Java class: empty default As there can only be one "javacode" typemap per class, also consider using the %proxycode directive which can be used multiple times per class and offers nearly identical functionality.

    %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized")

    destructor wrapper - the delete() method (proxy classes only), used for all proxy classes except those which have a base class : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute.

    %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized")

    destructor wrapper - the delete() method (proxy classes only), same as "javadestruct" but only used for derived proxy classes : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute.

    %typemap(javaimports)

    import statements for Java class: empty default

    %typemap(javainterfaces)

    interfaces (implements) for Java class: empty default

    %typemap(javafinalize)

    the finalize() method (proxy classes only): default calls the delete() method

    Note that the default javafinalize typemap must contain the full implementation of the finalize method. Any customization to this typemap must still declare a java finalize method with the correct signature. Note also that the name of the generated "delete" method may be affected by javadestruct and javadestruct_derived typemaps. Below shows an example modifying the finalizer, assuming the delete method has been renamed to swig_delete.

    %typemap(javafinalize) SWIGTYPE %{
      protected void finalize() {
        swig_delete();  // renamed to prevent conflict with existing delete method
      }
    ]%
    

    %typemap(javainterfacecode, declaration="...", cptrmethod="...")

    The code in this typemap is added to the body of a Java proxy class but only when a class is marked with the interface feature. The typemap is used in the proxy class marked with the interface feature as well as all proxy classes derived from the marked C++ class, as they are all generated as implementing the Java interface. The default typemap used in the %interface family of macros mentioned in the Java interfaces section, where CTYPE is the C++ class macro argument, is as follows:

    %typemap(javainterfacecode,
             declaration="  long $interfacename_GetInterfaceCPtr();\n",
             cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{
      public long $interfacename_GetInterfaceCPtr() {
        return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr);
      }
    %}
    

    The special variable $interfacename is expanded into the name specified in the interface feature.

    Compatibility Note: In SWIG-1.3.21 and earlier releases, typemaps called "javagetcptr" and "javaptrconstructormodifiers" were available. These are deprecated and the "javabody" typemap can be used instead. The javainterfacecode typemap and interface feature was introduced in SWIG-3.0.9.

    In summary the contents of the typemaps make up a proxy class like this:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody or javabody_derived typemap ]
    [ javafinalize typemap ]
    public synchronized void delete() [ javadestruct OR javadestruct_derived typemap ]
    [ javacode typemap ]
    [ javainterfacecode typemap]
    ... proxy functions ...
    }
    

    Note the delete() methodname and method modifiers are configurable, see "javadestruct" and "javadestruct_derived" typemaps above.

    The javainterfacecode typemap is only used when bases are marked by the interface feature and the implements list will also then be expanded to include these Java interfaces.

    The type wrapper class is similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The enum class is also similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    ... Enum values ...
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The "javaimports" typemap is ignored if the enum class is wrapped by an inner Java class, that is when wrapping an enum declared within a C++ class.

    The Java interface turned on by the interface feature is fairly simple:

    [ javaimports typemap ]
    public interface [ javainterfacename ] {
    [ javainterfacecode:cptrmethod typemap attribute ]
    ... interface declarations ...
    }
    

    where javainterfacename is the name attribute in the interface feature.

    The defaults can be overridden to tailor the generated classes. Here is an example which will change the getCPtr method and constructor from the default public access to protected access. If the classes in one package are not using the classes in another package, then these methods need not be public and removing access to these low level implementation details, is a good thing. If you are invoking SWIG more than once and generating the wrapped classes into different packages in each invocation, then you cannot do this as you will then have different packages.

    %typemap(javabody) SWIGTYPE %{
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected $javaclassname(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    The typemap code is the same that is in "java.swg", barring the last two method modifiers. Note that SWIGTYPE will target all proxy classes, but not the type wrapper classes. Also the above typemap is only used for proxy classes that are potential base classes. To target proxy classes that are derived from a wrapped class as well, the "javabody_derived" typemap should also be overridden.

    For the typemap to be used in all type wrapper classes, all the different types that type wrapper classes could be used for should be targeted:

    %typemap(javabody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
      private transient long swigCPtr;
    
      protected $javaclassname(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected $javaclassname() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    Again this is the same that is in "java.swg", barring the method modifier for getCPtr.

    When using multiple modules or the nspace feature it is common to invoke SWIG with a different -package command line option for each module. However, by default the generated code may not compile if generated classes in one package use generated classes in another package. The visibility of the getCPtr() and pointer constructor generated from the javabody typemaps needs changing. The default visibility is protected but it needs to be public for access from a different package. Just changing 'protected' to 'public' in the typemap achieves this. Two macros are available in java.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the javabody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
      SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    25.9.10 Director specific typemaps

    The Java directors feature requires the "javadirectorin", "javadirectorout", "directorin" and the "directorout" typemaps in order to work properly. The "javapackage" typemap is an optional typemap used to identify the Java package path for individual SWIG generated proxy classes used in director methods.

    %typemap(directorin)

    The "directorin" typemap is used for converting arguments in the C++ director class to the appropriate JNI type before the upcall to Java. This typemap also specifies the JNI field descriptor for the type in the "descriptor" attribute. For example, integers are converted as follows:

    %typemap(directorin, descriptor="I") int "$input = (jint) $1;"
    

    $input is the SWIG name of the JNI temporary variable passed to Java in the upcall. The descriptor="I" will put an I into the JNI field descriptor that identifies the Java method that will be called from C++. For more about JNI field descriptors and their importance, refer to the JNI documentation mentioned earlier. A typemap for C character strings is:

    %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
      $input = 0;
      if ($1) {
        $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
        if (!$input) return $null;
      }
      Swig::LocalRefGuard $1_refguard(jenv, $input);
    }
    

    The Swig::LocalRefGuard class should be used in directorin typemaps for newly allocated objects. It is used to control local reference counts ensuring the count is decremented after the call up into Java has completed. Its destructor simply calls jenv->DeleteLocalRef(obj) on the obj passed in during construction.

    User-defined types have the default "descriptor" attribute " L$packagepath/$javaclassname;" where $packagepath is the package name passed from the SWIG command line and $javaclassname is the Java proxy class' name. If the -package commandline option is not used to specify the package, then '$packagepath/' will be removed from the resulting output JNI field descriptor. Do not forget the terminating ';' for JNI field descriptors starting with 'L'. If the ';' is left out, Java will generate a "method not found" runtime error. Note that the $packagepath substitution always uses the path separator '/' when expanded. The $javaclassname expansion can be confusing as it is normally expanded using the '.' separator. However, $javaclassname is expanded using the path separator '/' in typemap's "descriptor" attribute as well as in the "directorthrows" typemap.

    %typemap(directorout)

    The "directorout" typemap is used for converting the JNI return type in the C++ director class to the appropriate C++ type after the upcall to Java. For example, integers are converted as follows:

    %typemap(directorout) int %{ $result = (int)$input; %}
    

    $input is the SWIG name of the JNI temporary variable returned from Java after the upcall. $result is the resulting output. A typemap for C character strings is:

    %typemap(directorout) char * {
      $1 = 0;
      if ($input) {
        $result = (char *)jenv->GetStringUTFChars($input, 0);
        if (!$1) return $null;
      }
    }
    

    %typemap(javadirectorin)

    Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorin) int "$jniinput"
    

    The $jniinput special variable is analogous to $javainput special variable. It is replaced by the input parameter name.

    %typemap(javadirectorout)

    Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorout) int "$javacall"
    

    The $javacall special variable is analogous to the $jnicall special variable. It is replaced by the call to the target Java method. The target method is the method in the Java proxy class which overrides the virtual C++ method in the C++ base class.

    %typemap(directorthrows)

    Conversion of Java exceptions to C++ exceptions in director method's exception handling. This typemap is expected to test the $error special variable for a matching Java exception and if successful convert and throw it into a C++ exception given by the typemap's type. The $error special variable is of type jthrowable and is substituted with a unique variable name in the generated code.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are helpers available when using directors and are described in the Java Exceptions from Directors section.

    %typemap(javapackage)

    The "javapackage" typemap is optional; it serves to identify a class's Java package. This typemap should be used in conjunction with classes that are defined outside of the current SWIG interface file. The typemap is only used if the type is used in a director method, that is, in a virtual method in a director class. For example:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    Assume that the Foo class is part of the Java package com.wombat.foo but the above interface file is part of the Java package com.wombat.example. Without the "javapackage" typemap, SWIG will assume that the Foo class belongs to com.wombat.example class. The corrected interface file looks like:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    %typemap("javapackage") Foo, Foo *, Foo & "com.wombat.foo";
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    SWIG looks up the package based on the actual type (plain Foo, Foo pointer and Foo reference), so it is important to associate all three types with the desired package. Practically speaking, you should create a separate SWIG interface file, which is %import-ed into each SWIG interface file, when you have multiple Java packages. Note the helper macros below, OTHER_PACKAGE_SPEC and ANOTHER_PACKAGE_SPEC, which reduce the amount of extra typing. " TYPE..." is useful when passing templated types to the macro, since multiargument template types appear to the SWIG preprocessor as multiple macro arguments.

    %typemap("javapackage") SWIGTYPE, SWIGTYPE *, SWIGTYPE &
                                                "package.for.most.classes";
    
    %define OTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.other.classes";
    %enddef
    
    %define ANOTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.another.set";
    %enddef
    
    OTHER_PACKAGE_SPEC(Package_2_class_one)
    ANOTHER_PACKAGE_SPEC(Package_3_class_two)
    /* etc */
    

    The basic strategy here is to provide a default package typemap for the majority of the classes, only providing "javapackage" typemaps for the exceptions.

    25.10 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "java.swg" and "typemaps.i " in the SWIG library.

    25.10.1 Simpler Java enums for enums without initializers

    The default Proper Java enums approach to wrapping enums is somewhat verbose. This is to handle all possible C/C++ enums, in particular enums with initializers. The generated code can be simplified if the enum being wrapped does not have any initializers.

    The following shows how to remove the support methods that are generated by default and instead use the methods in the Java enum base class java.lang.Enum and java.lang.Class for marshalling enums between C/C++ and Java. The type used for the typemaps below is enum SWIGTYPE which is the default type used for all enums. The "enums.swg" file should be examined in order to see the original overridden versions of the typemaps.

    %include "enums.swg"
    
    %typemap(javain) enum SWIGTYPE "$javainput.ordinal()"
    %typemap(javaout) enum SWIGTYPE {
        return $javaclassname.class.getEnumConstants()[$jnicall];
      }
    %typemap(javabody) enum SWIGTYPE ""
    
    %inline %{
      enum HairType { blonde, ginger, brunette };
      void setHair(HairType h);
      HairType getHair();
    %}
    

    SWIG will generate the following Java enum, which is somewhat simpler than the default:

    public enum HairType {
      blonde,
      ginger,
      brunette;
    }
    

    and the two Java proxy methods will be:

    public static void setHair(HairType h) {
      exampleJNI.setHair(h.ordinal());
    }
    
    public static HairType getHair() {
      return HairType.class.getEnumConstants()[exampleJNI.getHair()];
    }
    

    For marshalling Java enums to C/C++ enums, the ordinal method is used to convert the Java enum into an integer value for passing to the JNI layer, see the "javain" typemap. For marshalling C/C++ enums to Java enums, the C/C++ enum value is cast to an integer in the C/C++ typemaps (not shown). This integer value is then used to index into the array of enum constants that the Java language provides. See the getEnumConstants method in the "javaout" typemap.

    These typemaps can often be used as the default for wrapping enums as in many cases there won't be any enum initializers. In fact a good strategy is to always use these typemaps and to specifically handle enums with initializers using %apply. This would be done by using the original versions of these typemaps in "enums.swg" under another typemap name for applying using %apply.

    25.10.2 Handling C++ exception specifications as Java exceptions

    This example demonstrates various ways in which C++ exceptions can be tailored and converted into Java exceptions. Let's consider a simple file class SimpleFile and an exception class FileException which it may throw on error:

    %include "std_string.i" // for std::string typemaps
    #include <string>
    
    class FileException {
      std::string message;
    public:
      FileException(const std::string& msg) : message(msg) {}
      std::string what() {
        return message;
      }
    };
    
    class SimpleFile {
      std::string filename;
    public:
      SimpleFile(const std::string& filename) : filename(filename) {}
      void open() throw(FileException) {
      ...
      }
    };
    

    As the open method has a C++ exception specification, SWIG will parse this and know that the method can throw an exception. The "throws" typemap is then used when SWIG encounters an exception specification. The default generic "throws" typemap looks like this:

    %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY] %{
      SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException,
                              "C++ $1_type exception thrown");
      return $null;
    %}
    

    Basically SWIG will generate a C++ try catch block and the body of the "throws" typemap constitutes the catch block. The above typemap calls a SWIG supplied method which throws a java.lang.RuntimeException. This exception class is a runtime exception and therefore not a checked exception. If, however, we wanted to throw a checked exception, say java.io.IOException, then we could use the following typemap:

    %typemap(throws, throws="java.io.IOException") FileException {
      jclass excep = jenv->FindClass("java/io/IOException");
      if (excep)
        jenv->ThrowNew(excep, $1.what().c_str());
      return $null;
    }
    

    Note that this typemap uses the 'throws' typemap attribute to ensure a throws clause is generated. The generated proxy method then specifies the checked exception by containing java.io.IOException in the throws clause:

    public class SimpleFile {
      ...
      public void open() throws java.io.IOException { ... }
    }
    

    Lastly, if you don't want to map your C++ exception into one of the standard Java exceptions, the C++ class can be wrapped and turned into a custom Java exception class. If we go back to our example, the first thing we must do is get SWIG to wrap FileException and ensure that it derives from java.lang.Exception. Additionally, we might want to override the java.lang.Exception.getMessage() method. The typemaps to use then are as follows:

    %typemap(javabase) FileException "java.lang.Exception";
    %typemap(javacode) FileException %{
      public String getMessage() {
        return what();
      }
    %}
    

    This generates:

    public class FileException extends java.lang.Exception {
      ...
      public String getMessage() {
        return what();
      }
    
      public FileException(String msg) { ... }
    
      public String what() {
        return exampleJNI.FileException_what(swigCPtr, this);
      }
    }
    

    We could alternatively have used %rename to rename what() into getMessage().

    25.10.3 NaN Exception - exception handling for a particular type

    A Java exception can be thrown from any Java or JNI code. Therefore, as most typemaps contain either Java or JNI code, just about any typemap could throw an exception. The following example demonstrates exception handling on a type by type basis by checking for 'Not a number' (NaN) whenever a parameter of type float is wrapped.

    Consider the following C++ code:

    bool calculate(float first, float second);
    

    To validate every float being passed to C++, we could precede the code being wrapped by the following typemap which throws a runtime exception whenever the float is 'Not a Number':

    %module example
    %typemap(javain) float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    Note that the CheckForNaN support method has been added to the module class using the modulecode pragma. The following shows the generated code of interest:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    Note that the "javain" typemap is used for every occurrence of a float being used as an input. Of course, we could have targeted the typemap at a particular parameter by using float first, say, instead of just float.

    The exception checking could alternatively have been placed into the 'pre' attribute that the "javain" typemap supports. The "javain" typemap above could be replaced with the following:

    %typemap(javain, pre="    $module.CheckForNaN($javainput);") float "$javainput"
    

    which would modify the calculate function to instead be generated as:

    public class example {
      ...
      public static boolean calculate(float first, float second) {
        example.CheckForNaN(first);
        example.CheckForNaN(second);
        {
          return exampleJNI.calculate(first, second);
        }
      }
    }
    

    See the Date marshalling example for an example using further "javain" typemap attributes.

    If we decide that what we actually want is a checked exception instead of a runtime exception, we can change this easily enough. The proxy method that uses float as an input, must then add the exception class to the throws clause. SWIG can handle this as it supports the 'throws' typemap attribute for specifying classes for the throws clause. Thus we can modify the pragma and the typemap for the throws clause:

    %typemap(javain, throws="java.lang.Exception") float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    The calculate method now has a throws clause and even though the typemap is used twice for both float first and float second, the throws clause contains a single instance of java.lang.Exception:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) throws java.lang.Exception {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    If we were a martyr to the JNI cause, we could replace the succinct code within the "javain" typemap with a few pages of JNI code. If we had, we would have put it in the "in" typemap which, like all JNI and Java typemaps, also supports the 'throws' attribute.

    25.10.4 Converting Java String arrays to char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Java String array to be used as a char ** object.

    %module example
    
    /* This tells SWIG to treat char ** as a special case when used as a parameter
       in a function call */
    %typemap(in) char ** (jint size) {
      int i = 0;
      size = (*jenv)->GetArrayLength(jenv, $input);
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<size; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $1[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($1[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $1[i] = 0;
    }
    
    /* This cleans up the memory we malloc'd before the function call */
    %typemap(freearg) char ** {
      int i;
      for (i=0; i<size$argnum-1; i++)
        free($1[i]);
      free($1);
    }
    
    /* This allows a C function to return a char ** as a Java String array */
    %typemap(out) char ** {
      int i;
      int len=0;
      jstring temp_string;
      const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    
      while ($1[len]) len++;
      jresult = (*jenv)->NewObjectArray(jenv, len, clazz, NULL);
      /* exception checking omitted */
    
      for (i=0; i<len; i++) {
        temp_string = (*jenv)->NewStringUTF(jenv, *result++);
        (*jenv)->SetObjectArrayElement(jenv, jresult, i, temp_string);
        (*jenv)->DeleteLocalRef(jenv, temp_string);
      }
    }
    
    /* These 3 typemaps tell SWIG what JNI and Java types to use */
    %typemap(jni) char ** "jobjectArray"
    %typemap(jtype) char ** "String[]"
    %typemap(jstype) char ** "String[]"
    
    /* These 2 typemaps handle the conversion of the jtype to jstype typemap type
       and vice versa */
    %typemap(javain) char ** "$javainput"
    %typemap(javaout) char ** {
        return $jnicall;
      }
    
    /* Now a few test functions */
    %inline %{
    
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    
    char **get_args() {
      static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
      return &values[0];
    }
    
    %}
    

    Note that the 'C' JNI calling convention is used. Checking for any thrown exceptions after JNI function calls has been omitted. When this module is compiled, our wrapped C functions can be used by the following Java program:

    // File runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        String animals[] = {"Cat", "Dog", "Cow", "Goat"};
        example.print_args(animals);
        String args[] = example.get_args();
        for (int i=0; i<args.length; i++)
            System.out.println(i + ":" + args[i]);
      }
    }
    

    When compiled and run we get:

    $ java runme
    argv[0] = Cat
    argv[1] = Dog
    argv[2] = Cow
    argv[3] = Goat
    0:Dave
    1:Mike
    2:Susan
    3:John
    4:Michelle
    

    In the example, a few different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function. The "out" typemap is used for function return values. Lastly the "jni", "jtype" and "jstype" typemaps are also required to specify what Java types to use.

    25.10.5 Expanding a Java object to multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Java String array as the char **argv. This allows the function to be used from Java as follows:

    example.foo(4, new String[]{"red", "green", "blue", "white"});
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example's typemaps:

    %typemap(in) (int argc, char **argv) {
      int i = 0;
      $1 = (*jenv)->GetArrayLength(jenv, $input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<$1; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $2[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($2[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char **argv) {
      int i;
      for (i=0; i<$1-1; i++)
        free($2[i]);
      free($2);
    }
    
    %typemap(jni) (int argc, char **argv) "jobjectArray"
    %typemap(jtype) (int argc, char **argv) "String[]"
    %typemap(jstype) (int argc, char **argv) "String[]"
    
    %typemap(javain) (int argc, char **argv) "$javainput"
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Java parameter.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    example.foo(new String[]{"red", "green", "blue", "white"});
    

    25.10.6 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in function parameters rather than in the return value of a function. The typemaps.i file defines INPUT, OUTPUT and INOUT typemaps which can be used to solve some instances of this problem. This library file uses an array as a means of moving data to and from Java when wrapping a C function that takes non const pointers or non const references as parameters.

    Now we are going to outline an alternative approach to using arrays for C pointers. The INOUT typemap uses a double[] array for receiving and returning the double* parameters. In this approach we are able to use a Java class myDouble instead of double[] arrays where the C pointer double* is required.

    Here is our example function:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2);
    

    If we define a structure MyDouble containing a double member variable and use some typemaps we can solve this problem. For example we could put the following through SWIG:

    %module example
    
    /* Define a new structure to use instead of double * */
    %inline %{
    typedef struct {
      double value;
    } MyDouble;
    %}
    
    
    %{
    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      int status = 1;
      *out1 = a*10.0;
      *out2 = b*100.0;
      return status;
    }
    %}
    
    /* 
    This typemap will make any double * function parameters with name OUTVALUE take an
    argument of MyDouble instead of double *. This will 
    allow the calling function to read the double * value after returning from the function.
    */
    %typemap(in) double *OUTVALUE {
      jclass clazz = jenv->FindClass("MyDouble");
      jfieldID fid = jenv->GetFieldID(clazz, "swigCPtr", "J");
      jlong cPtr = jenv->GetLongField($input, fid);
      MyDouble *pMyDouble = NULL;
      *(MyDouble **)&pMyDouble = *(MyDouble **)&cPtr;
      $1 = &pMyDouble->value;
    }
    
    %typemap(jtype) double *OUTVALUE "MyDouble"
    %typemap(jstype) double *OUTVALUE "MyDouble"
    %typemap(jni) double *OUTVALUE "jobject"
    
    %typemap(javain) double *OUTVALUE "$javainput"
    
    /* Now we apply the typemap to the named variables */
    %apply double *OUTVALUE { double *out1, double *out2 };
    int spam(double a, double b, double *out1, double *out2);
    

    Note that the C++ JNI calling convention has been used this time and so must be compiled as C++ and the -c++ commandline must be passed to SWIG. JNI error checking has been omitted for clarity.

    What the typemaps do are make the named double* function parameters use our new MyDouble wrapper structure. The "in" typemap takes this structure, gets the C++ pointer to it, takes the double value member variable and passes it to the C++ spam function. In Java, when the function returns, we use the SWIG created getValue() function to get the output value. The following Java program demonstrates this:

    // File: runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        MyDouble out1 = new MyDouble();
        MyDouble out2 = new MyDouble();
        int ret = example.spam(1.2, 3.4, out1, out2);
        System.out.println(ret + "  " + out1.getValue() + "  " + out2.getValue());
      }
    }
    

    When compiled and run we get:

    $ java runme
    1 12.0  340.0
    

    25.10.7 Adding Java downcasts to polymorphic return types

    SWIG support for polymorphism works in that the appropriate virtual function is called. However, the default generated code does not allow for downcasting. Let's examine this with the following code:

    %include "std_string.i"
    
    #include <iostream>
    using namespace std;
    class Vehicle {
    public:
      virtual void start() = 0;
    ...
    };
    
    class Ambulance : public Vehicle {
      string vol;
    public:
      Ambulance(string volume) : vol(volume) {}
      virtual void start() {
        cout << "Ambulance started" << endl;
      }
      void sound_siren() {
        cout << vol << " siren sounded!" << endl;
      }
    ...
    };
    
    Vehicle *vehicle_factory() {
      return new Ambulance("Very loud");
    }
    

    If we execute the following Java code:

    Vehicle vehicle = example.vehicle_factory();
    vehicle.start();
    
    Ambulance ambulance = (Ambulance)vehicle;
    ambulance.sound_siren();
    

    We get:

    Ambulance started
    java.lang.ClassCastException
            at runme.main(runme.java:16)
    

    Even though we know from examination of the C++ code that vehicle_factory returns an object of type Ambulance, we are not able to use this knowledge to perform the downcast in Java. This occurs because the runtime type information is not completely passed from C++ to Java when returning the type from vehicle_factory(). Usually this is not a problem as virtual functions do work by default, such as in the case of start(). There are a few solutions to getting downcasts to work.

    The first is not to use a Java cast but a call to C++ to make the cast. Add this to your code:

    %exception Ambulance::dynamic_cast(Vehicle *vehicle) {
      $action
        if (!result) {
          jclass excep = jenv->FindClass("java/lang/ClassCastException");
          if (excep) {
            jenv->ThrowNew(excep, "dynamic_cast exception");
          }
        }
    }
    %extend Ambulance {
      static Ambulance *dynamic_cast(Vehicle *vehicle) {
        return dynamic_cast<Ambulance *>(vehicle);
      }
    };
    

    It would then be used from Java like this

    Ambulance ambulance = Ambulance.dynamic_cast(vehicle);
    ambulance.sound_siren();
    

    Should vehicle not be of type ambulance then a Java ClassCastException is thrown. The next solution is a purer solution in that Java downcasts can be performed on the types. Add the following before the definition of vehicle_factory:

    %typemap(out) Vehicle * {
      Ambulance *downcast = dynamic_cast<Ambulance *>($1);
      *(Ambulance **)&$result = downcast;
    }
    
    %typemap(javaout) Vehicle * {
        return new Ambulance($jnicall, $owner);
      }
    

    Here we are using our knowledge that vehicle_factory always returns type Ambulance so that the Java proxy is created as a type Ambulance. If vehicle_factory can manufacture any type of Vehicle and we want to be able to downcast using Java casts for any of these types, then a different approach is needed. Consider expanding our example with a new Vehicle type and a more flexible factory function:

    class FireEngine : public Vehicle {
    public:
      FireEngine() {}
      virtual void start() {
        cout << "FireEngine started" << endl;
      }
      void roll_out_hose() {
        cout << "Hose rolled out" << endl;
      }
      ...
    };
    Vehicle *vehicle_factory(int vehicle_number) {
      if (vehicle_number == 0)
        return new Ambulance("Very loud");
      else
        return new FireEngine();
    }
    

    To be able to downcast with this sort of Java code:

    FireEngine fireengine = (FireEngine)example.vehicle_factory(1);
    fireengine.roll_out_hose();
    Ambulance ambulance = (Ambulance)example.vehicle_factory(0);
    ambulance.sound_siren();
    

    the following typemaps targeted at the vehicle_factory function will achieve this. Note that in this case, the Java class is constructed using JNI code rather than passing a pointer across the JNI boundary in a Java long for construction in Java code.

    %typemap(jni) Vehicle *vehicle_factory "jobject"
    %typemap(jtype) Vehicle *vehicle_factory "Vehicle"
    %typemap(jstype) Vehicle *vehicle_factory "Vehicle"
    %typemap(javaout) Vehicle *vehicle_factory {
        return $jnicall;
      }
    
    %typemap(out) Vehicle *vehicle_factory {
      Ambulance *ambulance = dynamic_cast<Ambulance *>($1);
      FireEngine *fireengine = dynamic_cast<FireEngine *>($1);
      if (ambulance) {
        // call the Ambulance(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("Ambulance");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(Ambulance **)&cptr = ambulance;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      } else if (fireengine) {
        // call the FireEngine(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("FireEngine");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(FireEngine **)&cptr = fireengine;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      }
      else {
        cout << "Unexpected type " << endl;
      }
    
      if (!$result)
        cout << "Failed to create new java object" << endl;
    }
    

    Better error handling would need to be added into this code. There are other solutions to this problem, but this last example demonstrates some more involved JNI code. SWIG usually generates code which constructs the proxy classes using Java code as it is easier to handle error conditions and is faster. Note that the JNI code above uses a number of string lookups to call a constructor, whereas this would not occur using byte compiled Java code.

    25.10.8 Adding an equals method to the Java classes

    When a pointer is returned from a JNI function, it is wrapped using a new Java proxy class or type wrapper class. Even when the pointers are the same, it will not be possible to know that the two Java classes containing those pointers are actually the same object. It is common in Java to use the equals() method to check whether two objects are equivalent. The equals() method is usually accompanied by a hashCode() method in order to fulfill the requirement that the hash code is equal for equal objects. Pure Java code methods like these can be easily added:

    %typemap(javacode) SWIGTYPE %{
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof $javaclassname)
          equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
        return equal;
      }
      public int hashCode() {
        return (int)getPointer();
      }
    %}
    
    class Foo { };
    Foo* returnFoo(Foo *foo) { return foo; }
    

    The following would display false without the javacode typemap above. With the typemap defining the equals method the result is true.

    Foo foo1 = new Foo();
    Foo foo2 = example.returnFoo(foo1);
    System.out.println("foo1? " + foo1.equals(foo2));
    

    25.10.9 Void pointers and a common Java base class

    One might wonder why the common code that SWIG emits for the proxy and type wrapper classes is not pushed into a base class. The reason is that although swigCPtr could be put into a common base class for all classes wrapping C structures, it would not work for C++ classes involved in an inheritance chain. Each class derived from a base needs a separate swigCPtr because C++ compilers sometimes use a different pointer value when casting a derived class to a base. Additionally as Java only supports single inheritance, it would not be possible to derive wrapped classes from your own pure Java classes if the base class has been 'used up' by SWIG. However, you may want to move some of the common code into a base class. Here is an example which uses a common base class for all proxy classes and type wrapper classes:

    %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) "SWIG"
    
    %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) %{
      protected long getPointer() {
        return swigCPtr;
      }
    %}
    

    Define new base class called SWIG:

    public abstract class SWIG {
      protected abstract long getPointer();
    
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof SWIG)
          equal = (((SWIG)obj).getPointer() == this.getPointer());
        return equal;
      }
      
      SWIGTYPE_p_void getVoidPointer() {
        return new SWIGTYPE_p_void(getPointer(), false);
      }
    }
    

    This example contains some useful functionality which you may want in your code.

    • It has an equals() method. Unlike the previous example, the method code isn't replicated in all classes.
    • It also has a function which effectively implements a cast from the type of the proxy/type wrapper class to a void pointer. This is necessary for passing a proxy class or a type wrapper class to a function that takes a void pointer.

    25.10.10 Struct pointer to pointer

    Pointers to pointers are often used as output parameters in C factory type functions. These are a bit more tricky to handle. Consider the following situation where a Butler can be hired and fired:

    typedef struct {
      int hoursAvailable;
      char *greeting;
    } Butler;
    
    // Note: HireButler will allocate the memory 
    // The caller must free the memory by calling FireButler()!!
    extern int HireButler(Butler **ppButler);
    extern void FireButler(Butler *pButler);
    

    C code implementation:

    int HireButler(Butler **ppButler) {
      Butler *pButler = (Butler *)malloc(sizeof(Butler));
      pButler->hoursAvailable = 24;
      pButler->greeting = (char *)malloc(32);
      strcpy(pButler->greeting, "At your service Sir");
      *ppButler = pButler;
      return 1;
    }
    void FireButler(Butler *pButler) {
      free(pButler->greeting);
      free(pButler);
    }
    

    Let's take two approaches to wrapping this code. The first is to provide a functional interface, much like the original C interface. The following Java code shows how we intend the code to be used:

    Butler jeeves = new Butler();
    example.HireButler(jeeves);
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    example.FireButler(jeeves);
    

    Resulting in the following output when run:

    Greeting:     At your service Sir
    Availability: 24 hours per day
    

    Note the usage is very much like it would be used if we were writing C code, that is, explicit memory management is needed. No C memory is allocated in the construction of the Butler proxy class and the proxy class will not destroy the underlying C memory when it is collected. A number of typemaps and features are needed to implement this approach. The following interface file code should be placed before SWIG parses the above C code.

    %module example
    
    // Do not generate the default proxy constructor or destructor
    %nodefaultctor Butler;
    %nodefaultdtor Butler;
    
    // Add in pure Java code proxy constructor
    %typemap(javacode) Butler %{
      /** This constructor creates the proxy which initially does not create nor own any C memory */
      public Butler() {
        this(0, false);
      }
    %}
    
    // Type typemaps for marshalling Butler **
    %typemap(jni) Butler ** "jobject"
    %typemap(jtype) Butler ** "Butler"
    %typemap(jstype) Butler ** "Butler"
    
    // Typemaps for Butler ** as a parameter output type
    %typemap(in) Butler ** (Butler *ppButler = 0) %{
      $1 = &ppButler;
    %}
    %typemap(argout) Butler ** {
      // Give Java proxy the C pointer (of newly created object)
      jclass clazz = (*jenv)->FindClass(jenv, "Butler");
      jfieldID fid = (*jenv)->GetFieldID(jenv, clazz, "swigCPtr", "J");
      jlong cPtr = 0;
      *(Butler **)&cPtr = *$1;
      (*jenv)->SetLongField(jenv, $input, fid, cPtr);
    }
    %typemap(javain) Butler ** "$javainput"
    

    Note that the JNI code sets the proxy's swigCPtr member variable to point to the newly created object. The swigCMemOwn remains unchanged (at false), so that the proxy does not own the memory.

    Note: The old %nodefault directive disabled the default constructor and destructor at the same time. This is unsafe in most of the cases, and you can use the explicit %nodefaultctor and %nodefaultdtor directives to achieve the same result if needed.

    The second approach offers a more object oriented interface to the Java user. We do this by making the Java proxy class's constructor call the HireButler() method to create the underlying C object. Additionally we get the proxy to take ownership of the memory so that the finalizer will call the FireButler() function. The proxy class will thus take ownership of the memory and clean it up when no longer needed. We will also prevent the user from being able to explicitly call the HireButler() and FireButler() functions. Usage from Java will simply be:

    Butler jeeves = new Butler();
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    

    Note that the Butler class is used just like any other Java class and no extra coding by the user needs to be written to clear up the underlying C memory as the finalizer will be called by the garbage collector which in turn will call the FireButler() function. To implement this, we use the above interface file code but remove the javacode typemap and add the following:

    // Don't expose the memory allocation/de-allocation functions
    %ignore FireButler(Butler *pButler);
    %ignore HireButler(Butler **ppButler);
    
    // Add in a custom proxy constructor and destructor
    %extend Butler {
      Butler() {
        Butler *pButler = 0;
        HireButler(&pButler);
        return pButler;
      }
      ~Butler() {
        FireButler($self);
      }
    }
    

    Note that the code in %extend is using a C++ type constructor and destructor, yet the generated code will still compile as C code, see Adding member functions to C structures. The C functional interface has been completely morphed into an object-oriented interface and the Butler class would behave much like any pure Java class and feel more natural to Java users.

    25.10.11 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Java after running the code through SWIG:

    Wheel wheel = new Bike(10).getWheel();
    System.out.println("wheel size: " + wheel.getSize());
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("wheel size: " + wheel.getSize());
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(javacode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from Java
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a Java reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(javaout) Wheel& getWheel {
      long cPtr = $jnicall;
      $javaclassname ret = null;
      if (cPtr != 0) {
        ret = new $javaclassname(cPtr, $owner);
        ret.addReference(this);
      }
      return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel {
      ...
      // Ensure that the GC doesn't collect any bike set from Java 
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike {
      ...
      public Wheel getWheel() {
        long cPtr = exampleJNI.Bike_getWheel(swigCPtr, this);
        Wheel ret = null;
        if (cPtr != 0) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    25.10.12 Memory management for objects passed to the C++ layer

    Managing memory can be tricky when using C++ and Java proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

    Container container;
    Element element(20);
    container.setElement(&element);
    cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from Java

    Container container = new Container();
    container.setElement(new Element(20));
    System.out.println("element value: " + container.getElement().getValue());
    

    The C++ code will always print out 20, but the value printed out may not be this in the Java equivalent code. In order to understand why, consider a garbage collection occuring...

    Container container = new Container();
    container.setElement(new Element(20));
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("element value: " + container.getElement().getValue());
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the Java layer...

    public class Container {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private long getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    
      public void setElement(Element e) {
        exampleJNI.Container_setElement(swigCPtr, this, getCPtrAndAddReference(e), e);
      }
    }
    

    The following typemaps will generate the desired code. The 'javain' typemap matches the input parameter type for the setElement method. The 'javacode' typemap simply adds in the specified code into the Java proxy class.

    %typemap(javain) Element *e "getCPtrAndAddReference($javainput)"
    
    %typemap(javacode) Container %{
      // Ensure that the GC doesn't collect any element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private long getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    %}
    

    25.10.13 Date marshalling using the javain typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard Java date class, java.util.GregorianCalendar by using the 'pre', 'post' and 'pgcppname' attributes of the "javain" typemap. The idea is that the GregorianCalendar is used wherever the C++ API uses a CDate . Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the Java proxy class CDate is used in the proxy interface:

    public class Action {
      ...
      public static int doSomething(CDate dateIn, CDate dateOut) {
        return exampleJNI.Action_doSomething(CDate.getCPtr(dateIn), dateIn, 
                                             CDate.getCPtr(dateOut), dateOut);
      }
    
      public Action(CDate date, CDate dateOut) {
        this(exampleJNI.new_Action(CDate.getCPtr(date), date, 
                                   CDate.getCPtr(dateOut), dateOut), true);
      }
    }
    

    The CDate & and const CDate & Java code is generated from the following two default typemaps:

    %typemap(jstype) SWIGTYPE & "$javaclassname"
    %typemap(javain) SWIGTYPE & "$javaclassname.getCPtr($javainput)"
    

    where '$javaclassname' is translated into the proxy class name, CDate and '$javainput' is translated into the name of the parameter, eg dateIn. From Java, the intention is then to call into a modifed API with something like:

    java.util.GregorianCalendar calendarIn = 
      new java.util.GregorianCalendar(2011, java.util.Calendar.APRIL, 13, 0, 0, 0);
    java.util.GregorianCalendar calendarOut = new java.util.GregorianCalendar();
    
    // Note in calls below, calendarIn remains unchanged and calendarOut 
    // is set to a new value by the C++ call
    Action.doSomething(calendarIn, calendarOut);
    Action action = new Action(calendarIn, calendarOut);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the Java layer, a GregorianCalendar is converted into a CDate. The JNI intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(jstype) const CDate& "java.util.GregorianCalendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             pgcppname="temp$javainput") const CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    
    %typemap(jstype) CDate& "java.util.Calendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             post="      $javainput.set(temp$javainput.getYear(), temp$javainput.getMonth(), "
                  "temp$javainput.getDay(), 0, 0, 0);", 
             pgcppname="temp$javainput") CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    

    The resulting generated proxy code in the Action class follows:

    public class Action {
      ...
      public static int doSomething(java.util.GregorianCalendar dateIn, 
                                    java.util.Calendar dateOut) {
        CDate tempdateIn = new CDate(dateIn.get(java.util.Calendar.YEAR), 
                                     dateIn.get(java.util.Calendar.MONTH), 
                                     dateIn.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.Action_doSomething(CDate.getCPtr(tempdateIn), tempdateIn, 
                                               CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private long SwigConstructAction(java.util.GregorianCalendar date, 
                                              java.util.Calendar dateOut) {
        CDate tempdate = new CDate(date.get(java.util.Calendar.YEAR), 
                                   date.get(java.util.Calendar.MONTH), 
                                   date.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.new_Action(CDate.getCPtr(tempdate), tempdate, 
                                       CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(java.util.GregorianCalendar date, java.util.Calendar dateOut) {
        this(Action.SwigConstructAction(date, dateOut), true);
      }
    }
    

    A few things to note:

    • The "javatype" typemap has changed the parameter type to java.util.GregorianCalendar or java.util.Calendar instead of the default generated CDate proxy.
    • The code in the 'pre' attribute appears before the JNI call ( exampleJNI.new_Action / exampleJNI.Action_doSomething).
    • The code in the 'post' attribute appears after the JNI call.
    • A try .. finally block is generated with the JNI call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the JNI call and the 'post' code being generated before the return statement is not possible given that the JNI call is in one line and comes from the "javaout" typemap.
    • The temporary variables in the "javain" typemaps are called temp$javain, where "$javain" is replaced with the parameter name. "$javain" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "javain" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows Java code to be called before the JNI call and is required as the Java compiler won't compile code inserted before the 'this' call.
    • The 'pgcppname' attribute is used to modify the object being passed as the premature garbage collection prevention parameter (the 2nd and 4th parameters in the JNI calls).

    25.11 Living with Java Directors

    This section is intended to address frequently asked questions and frequently encountered problems when using Java directors.

    1. When my program starts up, it complains that method_foo cannot be found in a Java method called swig_module_init. How do I fix this?

      Open up the C++ wrapper source code file and look for "method_foo" (include the double quotes, they are important!) Look at the JNI field descriptor and make sure that each class that occurs in the descriptor has the correct package name in front of it. If the package name is incorrect, put a "javapackage" typemap in your SWIG interface file.

    2. I'm compiling my code and I'm using templates. I provided a javapackage typemap, but SWIG doesn't generate the right JNI field descriptor.

      Use the template's renamed name as the argument to the "javapackage" typemap:

      %typemap(javapackage)  std::vector<int>  "your.package.here"
      %template(VectorOfInt) std::vector<int>;
      
    3. When I pass class pointers or references through a C++ upcall and I try to type cast them, Java complains with a ClassCastException. What am I doing wrong?

      Normally, a non-director generated Java proxy class creates temporary Java objects as follows:

      public static void MyClass_method_upcall(MyClass self, long jarg1)
      {
        Foo darg1 = new Foo(jarg1, false);
      
        self.method_upcall(darg1);
      }
      

      Unfortunately, this loses the Java type information that is part of the underlying Foo director proxy class's Java object pointer causing the type cast to fail. The SWIG Java module's director code attempts to correct the problem, but only for director-enabled classes, since the director class retains a global reference to its Java object. Thus, for director-enabled classes and only for director-enabled classes, the generated proxy Java code looks something like:

      public static void MyClass_method_upcall(MyClass self, long jarg1,
                                               Foo jarg1_object)
      {
        Foo darg1 = (jarg1_object != null ? jarg1_object : new Foo(jarg1, false));
      
        self.method_upcall(darg1);
      }
      

      When you import a SWIG interface file containing class definitions, the classes you want to be director-enabled must be have the feature("director") enabled for type symmetry to work. This applies even when the class being wrapped isn't a director-enabled class but takes parameters that are director-enabled classes.

      The current "type symmetry" design will work for simple C++ inheritance, but will most likely fail for anything more complicated such as tree or diamond C++ inheritance hierarchies. Those who are interested in challenging problems are more than welcome to hack the Java::Java_director_declaration method in Source/Modules/java.cxx.

      If all else fails, you can use the downcastXXXXX() method to attempt to recover the director class's Java object pointer. For the Java Foo proxy class, the Foo director class's java object pointer can be accessed through the javaObjectFoo() method. The generated method's signature is:

        public static Foo javaObjectFoo(Foo obj);
      

      From your code, this method is invoked as follows:

      public class MyClassDerived {
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = (foo_object != null ?
                       (FooDerived) Foo.downcastFoo(foo_object) : null);
          /* rest of your code here */
        }
      }
      

      An good approach for managing downcasting is placing a static method in each derived class that performs the downcast from the superclass, e.g.,

      public class FooDerived extends Foo {
        /* ... */
        public static FooDerived downcastFooDerived(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object);
          }
      
          catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      Then change the code in MyClassDerived as follows:

      public class MyClassDerived extends MyClass {
        /* ... */
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = FooDerived.downcastFooDerived(foo_object);
          /* rest of your code here */
        }
      }
      
    4. Why isn't the proxy class declared abstract? Why aren't the director upcall methods in the proxy class declared abstract?

      Declaring the proxy class and its methods abstract would break the JNI argument marshalling and SWIG's downcall functionality (going from Java to C++.) Create an abstract Java subclass that inherits from the director-enabled class instead. Using the previous Foo class example:

      public abstract class UserVisibleFoo extends Foo {
        /** Make sure user overrides this method, it's where the upcall
         * happens.
         */
        public abstract void method_upcall(Foo foo_object);
      
        /// Downcast from Foo to UserVisibleFoo
        public static UserVisibleFoo downcastUserVisibleFoo(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object) : null;
          } catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      This doesn't prevent the user from creating subclasses derived from Foo, however, UserVisibleFoo provides the safety net that reminds the user to override the method_upcall() method.

    25.12 Odds and ends

    25.12.1 JavaDoc comments

    The SWIG documentation system is currently deprecated. When it is resurrected JavaDoc comments will be fully supported. If you can't wait for the full documentation system a couple of workarounds are available. The %javamethodmodifiers feature can be used for adding proxy class method comments and module class method comments. The "javaimports" typemap can be hijacked for adding in proxy class JavaDoc comments. The jniclassimports or jniclassclassmodifiers pragmas can also be used for adding intermediary JNI class comments and likewise the moduleimports or moduleclassmodifiers pragmas for the module class. Here is an example adding in a proxy class and method comment:

    %javamethodmodifiers Barmy::lose_marbles() "
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public";
    
    %typemap(javaimports) Barmy "
    /** The crazy class. Use as a last resort. */"
    
    class Barmy {
    public:
      void lose_marbles() {}
    };
    

    Note the "public" added at the end of the %javamethodmodifiers as this is the default for this feature. The generated proxy class with JavaDoc comments is then as follows:

    /** The crazy class. Use as a last resort. */
    public class Barmy {
    ...
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public void lose_marbles() {
        ...
      }
    ...
    }
    

    25.12.2 Functional interface without proxy classes

    It is possible to run SWIG in a mode that does not produce proxy classes by using the -noproxy commandline option. The interface is rather primitive when wrapping structures or classes and is accessed through function calls to the module class. All the functions in the module class are wrapped by functions with identical names as those in the intermediary JNI class.

    Consider the example we looked at when examining proxy classes:

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    

    When using -noproxy, type wrapper classes are generated instead of proxy classes. Access to all the functions and variables is through a C like set of functions where the first parameter passed is the pointer to the class, that is an instance of a type wrapper class. Here is what the module class looks like:

    public class example {
      public static void Foo_x_get(SWIGTYPE_p_Foo self, int x) {...}
      public static int Foo_x_get(SWIGTYPE_p_Foo self) {...}
      public static int Foo_spam(SWIGTYPE_p_Foo self, int num, SWIGTYPE_p_Foo foo) {...}
      public static SWIGTYPE_p_Foo new_Foo() {...}
      public static void delete_Foo(SWIGTYPE_p_Foo self) {...}
    }
    

    This approach is not nearly as natural as using proxy classes as the functions need to be used like this:

    SWIGTYPE_p_Foo foo = example.new_Foo();
    example.Foo_x_set(foo, 10);
    int var = example.Foo_x_get(foo);
    example.Foo_spam(foo, 20, foo);
    example.delete_Foo(foo);
    

    Unlike proxy classes, there is no attempt at tracking memory. All destructors have to be called manually for example the delete_Foo(foo) call above.

    25.12.3 Using your own JNI functions

    You may have some hand written JNI functions that you want to use in addition to the SWIG generated JNI functions. Adding these to your SWIG generated package is possible using the %native directive. If you don't want SWIG to wrap your JNI function then of course you can simply use the %ignore directive. However, if you want SWIG to generate just the Java code for a JNI function then use the %native directive. The C types for the parameters and return type must be specified in place of the JNI types and the function name must be the native method name. For example:

    %native (HandRolled) void HandRolled(int, char *);
    %{
    JNIEXPORT void JNICALL Java_packageName_moduleName_HandRolled(JNIEnv *, jclass,
                                                                  jlong, jstring);
    %}
    

    No C JNI function will be generated and the Java_packageName_moduleName_HandRolled function will be accessible using the SWIG generated Java native method call in the intermediary JNI class which will look like this:

      public final static native void HandRolled(int jarg1, String jarg2);
    

    and as usual this function is wrapped by another which for a global C function would appear in the module class:

      public static void HandRolled(int arg0, String arg1) {
        exampleJNI.HandRolled(arg0, arg1);
      }
    

    The packageName and moduleName must of course be correct else you will get linker errors when the JVM dynamically loads the JNI function. You may have to add in some "jtype", "jstype", "javain" and "javaout" typemaps when wrapping some JNI types. Here the default typemaps work for int and char *.

    In summary the %native directive is telling SWIG to generate the Java code to access the JNI C code, but not the JNI C function itself. This directive is only really useful if you want to mix your own hand crafted JNI code and the SWIG generated code into one Java class or package.

    25.12.4 Performance concerns and hints

    If you're directly manipulating huge arrays of complex objects from Java, performance may suffer greatly when using the array functions in arrays_java.i. Try and minimise the expensive JNI calls to C/C++ functions, perhaps by using temporary Java variables instead of accessing the information directly from the C/C++ object.

    Java classes without any finalizers generally speed up code execution as there is less for the garbage collector to do. Finalizer generation can be stopped by using an empty javafinalize typemap:

    %typemap(javafinalize) SWIGTYPE ""
    

    However, you will have to be careful about memory management and make sure that you code in a call to the delete() member function. This method normally calls the C++ destructor or free() for C code.

    25.12.5 Debugging

    The generated code can be debugged using both a Java debugger and a C++ debugger using the usual debugging techniques. Breakpoints can be set in either Java or C++ code and so both can be debugged simultaneously. Most debuggers do not understand both Java and C++, with one noteable exception of Sun Studio, where it is possible to step from Java code into a JNI method within one environment.

    Alternatively, debugging can involve placing debug printout statements in the JNI layer using the %exception directive. See the special variables for %exception section. Many of the default typemaps can also be overridden and modified for adding in extra logging/debug display information.

    The -Xcheck:jni and -Xcheck:nabounds Java executable options are useful for debugging to make sure the JNI code is behaving. The -verbose:jni and -verbose:gc are also useful options for monitoring code behaviour.

    25.13 Java Examples

    The directory Examples/java has a number of further examples. Take a look at these if you want to see some of the techniques described in action. The Examples/index.html file in the parent directory contains the SWIG Examples Documentation and is a useful starting point. If your SWIG installation went well Unix users should be able to type make in each example directory, then java main to see them running. For the benefit of Windows users, there are also Visual C++ project files in a couple of the Windows Examples . There are also many regression tests in the Examples/test-suite directory. Many of these have runtime tests in the java subdirectory.


    26 SWIG and Javascript

    This chapter describes SWIG's support of Javascript. It does not cover SWIG basics, but only information that is specific to this module.

    26.1 Overview

    Javascript is a prototype-based scripting language that is dynamic, weakly typed and has first-class functions. Its arguably the most popular language for web development. Javascript has gone beyond being a browser-based scripting language and with node.js, it is also used as a backend development language.

    Native Javascript extensions can be used for applications that embed a web-browser view or that embed a Javascript engine (such as node.js). Extending a general purpose web-browser is not possible as this would be a severe security issue.

    SWIG Javascript currently supports JavascriptCore, the Javascript engine used by Safari/Webkit, and v8, which is used by Chromium and node.js.

    WebKit is a modern browser implementation available as open-source which can be embedded into an application. With node-webkit there is a platform which uses Google's Chromium as Web-Browser widget and node.js for javascript extensions.

    26.2 Preliminaries

    26.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;

    To build a Javascript module, run SWIG using the -javascript option and a desired target engine -jsc, -v8, or -node. The generator for node is essentially delegating to the v8 generator and adds some necessary preprocessor definitions.

    $ swig -javascript -jsc example.i

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -javascript -jsc example.i

    The V8 code that SWIG generates should work with most versions from 3.11.10 up to 3.29.14 and later.

    The API headers for V8 >= 4.3.0 define constants which SWIG can use to determine the V8 version it is compiling for. For versions < 4.3.0, you need to specify the V8 version when running SWIG. This is specified as a hex constant, but the constant is read as pairs of decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't represent components > 99, but this constant is only useful for V8 < 4.3.0, and no V8 versions from that era had a component > 99. For example:

    $ swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i

    If you're targetting V8 >= 4.3.0, you would just run swig like so:

    $ swig -c++ -javascript -v8 example.i

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function which must be called to register the module with the Javascript interpreter. For example, if your module is named example the corresponding initializer for JavascriptCore would be

    bool example_initialize(JSGlobalContextRef context, JSObjectRef *exports)

    and for v8:

    void example_initialize(v8::Handle<v8::Object> exports)

    Note: be aware that v8 has a C++ API, and thus, the generated modules must be compiled as C++.

    26.2.2 Running Tests and Examples

    The configuration for tests and examples currently supports Linux and Mac only and not MinGW (Windows) yet.

    The default interpreter is node.js as it is available on all platforms and convenient to use.

    Running the examples with JavascriptCore requires libjavascriptcoregtk-1.0 to be installed, e.g., under Ubuntu with

    $ sudo apt-get install libjavascriptcoregtk-1.0-dev

    Running with V8 requires libv8:

    $ sudo apt-get install libv8-dev

    Examples can be run using

    $ make check-javascript-examples ENGINE=jsc

    ENGINE can be node, jsc, or v8.

    The test-suite can be run using

    $ make check-javascript-test-suite ENGINE=jsc

    You can specify a specific V8 version for running the examples and tests

    $ make check-javascript-examples V8_VERSION=0x032530 ENGINE=v8

    26.2.3 Known Issues

    At the moment, the Javascript generators pass all tests syntactically, i.e., the generated source code compiles. However, there are still remaining runtime issues.

    • Default optional arguments do not work for all targeted interpreters

    • Multiple output arguments do not work for JSC

    • C89 incompatibily: the JSC generator might still generate C89 violating code

    • long long is not supported

    • %native is not supported

    • Javascript callbacks are not supported

    • instanceOf does not work under JSC

    The primary development environment has been Linux (Ubuntu 12.04). Windows and Mac OS X have been tested sporadically. Therefore, the generators might have more issues on those platforms. Please report back any problem you observe to help us improving this module quickly.

    26.3 Integration

    This chapter gives a short introduction how to use a native Javascript extension: as a node.js module, and as an extension for an embedded Webkit.

    26.3.1 Creating node.js Extensions

    To install node.js you can download an installer from their web-site for Mac OS X and Windows. For Linux you can either build the source yourself and run sudo checkinstall or keep to the (probably stone-age) packaged version. For Ubuntu there is a PPA available.

    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs

    As v8 is written in C++ and comes as a C++ library it is crucial to compile your module using the same compiler flags as used for building v8. To make things easier, node.js provides a build tool called node-gyp.

    You have to install it using npm:

    $ sudo npm install -g node-gyp

    node-gyp expects a configuration file named binding.gyp which is basically in JSON format and conforms to the same format that is used with Google's build-tool gyp.

    binding.gyp:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    First create the wrapper using SWIG:

    $ swig -javascript -node -c++ example.i

    Then run node-gyp build to actually create the module:

    $ node-gyp build

    This will create a build folder containing the native module. To use the extension you need to 'require' it in your Javascript source file:

    require("./build/Release/example")

    A more detailed explanation is given in the Examples section.

    26.3.1.1 Troubleshooting

    • 'module' object has no attribute 'script_main'

    This error happens when gyp is installed as a distribution package. It seems to be outdated. Removing it resolves the problem.

    $ sudo apt-get remove gyp

    26.3.2 Embedded Webkit

    Webkit is pre-installed on Mac OS X and available as a library for GTK.

    26.3.2.1 Mac OS X

    There is general information about programming with WebKit on Apple Developer Documentation. Details about Cocoa programming are not covered here.

    An integration of a native extension 'example' would look like this:

    #import "appDelegate.h"
    
    extern bool example_initialize(JSGlobalContextRef context, JSObjectRef* exports);
    
    
    @implementation ExampleAppDelegate
    
    @synthesize webView;
    
    - (void)addGlobalObject:(JSContextRef) context:(NSString *)objectName:(JSObjectRef) theObject {
      JSObjectRef global = JSContextGetGlobalObject(context);
      JSStringRef objectJSName = JSStringCreateWithCFString( (CFStringRef) objectName )
      if ( objectJSName != NULL ) {
        JSObjectSetProperty(context, global, objectJSName, theObject, kJSPropertyAttributeReadOnly, NULL);
        JSStringRelease( objectJSName );
      }
    }
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    
      // Start a webview with the bundled index.html file
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *url =  [NSString stringWithFormat: @"file://%@/Contents/Assets/index.html", path];
    
      WebFrame *webframe = [webView mainFrame];
      JSGlobalContextRef context = [webframe globalContext];
    
      JSObjectRef example;
      example_initialize(context, &example);
      [self addGlobalObject:context:@"example":example]
    
      JSObjectSetProperty(context, global, JSStringRef propertyName, example, JSPropertyAttributes attributes, NULL);
    
      [ [webView mainFrame] loadRequest:
        [NSURLRequest requestWithURL: [NSURL URLWithString:url] ]
      ];
    }
    
    @end

    26.3.2.2 GTK

    There is general information about programming GTK at GTK documentation and in the GTK tutorial, and for Webkit there is a Webkit GTK+ API Reference.

    An integration of a native extension 'example' would look like this:

    #include <gtk/gtk.h>
    #include <webkit/webkit.h>
    
    extern bool example_initialize(JSGlobalContextRef context);
    
    int main(int argc, char* argv[])
    {
      // Initialize GTK+
      gtk_init(&argc, &argv);
    
      ...
    
      // Create a browser instance
      WebKitWebView *webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
      WebFrame *webframe = webkit_web_view_get_main_frame(webView);
      JSGlobalContextRef context = webkit_web_frame_get_global_context(webFrame);
      JSObjectRef global = JSContextGetGlobalObject(context);
    
      JSObjectRef exampleModule;
      example_initialize(context, &exampleModule);
      JSStringRef jsName = JSStringCreateWithUTF8CString("example");
      JSObjectSetProperty(context, global, jsName, exampleModule, kJSPropertyAttributeReadOnly, NULL);
      JSStringRelease(jsName);
    
      ...
    
      // Load a web page into the browser instance
      webkit_web_view_load_uri(webView, "http://www.webkitgtk.org/");
    
      ...
    
      // Run the main GTK+ event loop
      gtk_main();
    
      return 0;
    }

    26.3.3 Creating Applications with node-webkit

    To get started with node-webkit there is a very informative set of wiki pages.

    Similar to node.js, node-webkit is started from command line within a node.js project directory. Native extensions are created in the very same way as for node.js , except that a customized gyp derivate has to be used: nw-gyp.

    A simple example would have the following structure:

    - package.json
    - app.html
    - app.js
    - node_modules
      / example
      ... (as known from node.js)
    

    The configuration file essentially conforms to node.js syntax. It has some extras to configure node-webkit. See the Manifest specification for more details.

    package.json:

    {
      "name": "example",
      "main": "app.html",
      "window": {
        "show": true,
        "width": 800,
        "height": 600
      }
    }

    The 'main' property of package.json specifies a web-page to be rendered in the main window.

    app.html:

    <html>
      <head>
        <script src="app.js"></script>
      </head>
      <body>
        <div>
          The greatest common divisor of
          <span id="x"></span> and
          <span id="y"></span> is
          <span id="z"></span>.
        </div>
      </body>
    </html>

    As known from node.js one can use require to load javascript modules. Additionally, node-webkit provides an API that allows to manipulate the window's menu, open new windows, and many more things.

    app.js:

    window.onload = function() {
      var example = require("example");
      var x = 18;
      var y = 24;
      var z = example.gcd(x, y);
      document.querySelector('#x').innerHTML = x;
      document.querySelector('#y').innerHTML = y;
      document.querySelector('#z').innerHTML = z;
    };

    26.4 Examples

    Some basic examples are shown here in more detail.

    26.4.1 Simple

    The common example simple looks like this:

    /* File : example.i */
    %module example
    
    %inline %{
    extern int    gcd(int x, int y);
    extern double Foo;
    %}

    To make this available as a node extension a binding.gyp has to be created:

    {
      "targets": [
        {
          "target_name": "example",
          "sources": [ "example.cxx", "example_wrap.cxx" ]
        }
      ]
    }

    Then node-gyp is used to build the extension:

    $ node-gyp configure build

    From a 'nodejs` application the extension would be used like this:

    // import the extension via require
    var example = require("./build/Release/example");
    
    // calling the global method
    var x = 42;
    var y = 105;
    var g = example.gcd(x, y);
    
    // Accessing the global variable
    var f = example.Foo;
    example.Foo = 3.1415926;

    First the module example is loaded from the previously built extension. Global methods and variables are available in the scope of the module.

    Note: ECMAScript 5, the currently implemented Javascript standard, does not have modules. node.js and other implementations provide this mechanism defined by the CommonJS group. For browsers this is provided by Browserify, for instance.

    26.4.2 Class

    The common example class defines three classes, Shape, Circle, and Square:

    class Shape {
    public:
      Shape() {
        nshapes++;
      }
      virtual ~Shape() {
        nshapes--;
      }
      double  x, y;
      void    move(double dx, double dy);
      virtual double area(void) = 0;
      virtual double perimeter(void) = 0;
      static  int nshapes;
    };
    
    class Circle : public Shape {
    private:
      double radius;
    public:
      Circle(double r) : radius(r) { }
      virtual double area(void);
      virtual double perimeter(void);
    };
    
    class Square : public Shape {
    private:
      double width;
    public:
      Square(double w) : width(w) { }
      virtual double area(void);
      virtual double perimeter(void);
    };

    Circle and Square inherit from Shape . Shape has a static variable nshapes, a function move that can't be overridden (non-virtual), and two abstract functions area and perimeter (pure virtual) that must be overridden by the sub-classes.

    A nodejs extension is built the same way as for the simple example.

    In Javascript it can be used as follows:

    var example = require("./build/Release/example");
    
    // local aliases for convenience
    var Shape = example.Shape;
    var Circle = example.Circle;
    var Square = example.Square;
    
    // creating new instances using the 'new' operator
    var c = new Circle(10);
    var s = new Square(10);
    
    // accessing a static member
    Shape.nshapes;
    
    // accessing member variables
    c.x = 20;
    c.y = 30;
    s.x = -10;
    s.y = 5;
    
    // calling some methods
    c.area();
    c.perimeter();
    s.area();
    s.perimeter();
    
    // instantiation of Shape is not permitted
    new Shape();

    Running these commands in an interactive node shell results in the following output:

    $ node -i
    & var example = require("./build/Release/example");
    undefined
    & var Shape = example.Shape;
    undefined
    & var Circle = example.Circle;
    undefined
    & var Square = example.Square;
    undefined
    & var c = new Circle(10);
    undefined
    & var s = new Square(10);
    undefined
    & Shape.nshapes;
    2
    & c.x = 20;
    20
    & c.y = 30;
    30
    & s.x = -10;
    -10
    & s.y = 5;
    5
    & c.area();
    314.1592653589793
    & c.perimeter();
    62.83185307179586
    & s.area();
    100
    & s.perimeter();
    40
    & c.move(40, 40)
    undefined
    & c.x
    60
    & c.y
    70
    & new Shape()
    Error: Class Shape can not be instantiated
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)
    at ReadStream.EventEmitter.emit (events.js:98:17)
    at emitKey (readline.js:1095:12)

    Note: In ECMAScript 5 there is no concept for classes. Instead each function can be used as a constructor function which is executed by the 'new' operator. Furthermore, during construction the key property prototype of the constructor function is used to attach a prototype instance to the created object. A prototype is essentially an object itself that is the first-class delegate of a class used whenever the access to a property of an object fails. The very same prototype instance is shared among all instances of one type. Prototypal inheritance is explained in more detail on in Inheritance and the prototype chain, for instance.

    26.5 Implementation

    The Javascript Module implementation has taken a very different approach compared to other language modules in order to support different Javascript interpreters.

    26.5.1 Source Code

    The Javascript module is implemented in Source/Modules/javascript.cxx. It dispatches the code generation to a JSEmitter instance, V8Emitter or JSCEmitter. Additionally there are some helpers: Template , for templated code generation, and JSEmitterState, which is used to manage state information during AST traversal. This rough map shall make it easier to find a way through this huge source file:

    // module wide defines
    
    #define NAME "name"
    ...
    
    // ###############################
    // #  Helper class declarations
    
    class JSEmitterState { ... };
    
    class Template { ... };
    
    // ###############################
    // # JSEmitter declaration
    
    class JSEmitter { ... };
    
    // Emitter factory declarations
    
    JSEmitter *swig_javascript_create_JSCEmitter();
    JSEmitter *swig_javascript_create_V8Emitter();
    
    // ###############################
    // # Javascript module
    
    // Javascript module declaration
    
    class JAVASCRIPT:public Language { ... };
    
    // Javascript module implementation
    
    int JAVASCRIPT::functionWrapper(Node *n) { ... }
    ...
    
    // Module factory implementation
    
    static Language *new_swig_javascript() { ... }
    
    extern "C" Language *swig_javascript(void) { ... }
    
    // ###############################
    // # JSEmitter base implementation
    
    JSEmitter::JSEmitter() { ... }
    
    Template JSEmitter::getTemplate(const String *name) { ... }
    ...
    
    // ###############################
    // # JSCEmitter
    
    // JSCEmitter declaration
    
    class JSCEmitter: public JSEmitter { ... };
    
    // JSCEmitter implementation
    
    JSCEmitter::JSCEmitter() { ... }
    
    void JSCEmitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static) { ... }
    ...
    
    // JSCEmitter factory
    
    JSEmitter *swig_javascript_create_JSCEmitter() { ... }
    
    
    // ###############################
    // # V8Emitter
    
    // V8Emitter declaration
    
    class V8Emitter: public JSEmitter { ... };
    
    // V8Emitter implementation
    
    V8Emitter::V8Emitter() { ... }
    
    int V8Emitter::initialize(Node *n) { ... }
    
    // V8Emitter factory
    
    JSEmitter *swig_javascript_create_V8Emitter() { ... }
    
    
    // ###############################
    // # Helper implementation (JSEmitterState, Template)
    
    JSEmitterState::JSEmitterState() { ... }
    ...
    
    Template::Template(const String *code_) { ... }
    ...

    26.5.2 Code Templates

    All generated code is created on the basis of code templates. The templates for JavascriptCore can be found in Lib/javascript/jsc/javascriptcode.swg, for v8 in Lib/javascript/v8/javascriptcode.swg.

    To track the originating code template for generated code you can run

    $ swig -javascript -jsc -debug-codetemplates

    which wraps generated code with a descriptive comment

    /* begin fragment("template_name") */
    
    ...generated code ...
    
    /* end fragment("template_name") */

    The Template class is used like this:

    Template t_register = getTemplate("jsv8_register_static_variable");
    t_register.replace("$jsparent", state.clazz(NAME_MANGLED))
        .replace("$jsname", state.variable(NAME))
        .replace("$jsgetter", state.variable(GETTER))
        .replace("$jssetter", state.variable(SETTER))
        .trim().
        print(f_init_static_wrappers);

    A code template is registered with the JSEmitter via fragment(name, "template"), e.g.,

    %fragment ("jsc_variable_declaration", "templates")
    %{
      {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone},
    %}

    Template creates a copy of that string and Template::replace uses Swig's Replaceall to replace variables in the template. Template::trim can be used to eliminate leading and trailing whitespaces. Template::print is used to write the final template string to a Swig DOH (based on Printv). All methods allow chaining.

    26.5.3 Emitter

    The Javascript module delegates code generation to a JSEmitter instance. The following extract shows the essential interface:

    class JSEmitter {
      ...
    
      /**
       * Opens output files and temporary output DOHs.
       */
      virtual int initialize(Node *n);
    
      /**
       * Writes all collected code into the output file(s).
       */
      virtual int dump(Node *n) = 0;
    
      /**
       * Cleans up all open output DOHs.
       */
      virtual int close() = 0;
    
      ...
    
      /**
       * Invoked at the beginning of the classHandler.
       */
      virtual int enterClass(Node *);
    
      /**
       * Invoked at the end of the classHandler.
       */
      virtual int exitClass(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the variableHandler.
       */
      virtual int enterVariable(Node *);
    
      /**
       * Invoked at the end of the variableHandler.
       */
      virtual int exitVariable(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked at the beginning of the functionHandler.
       */
      virtual int enterFunction(Node *);
    
      /**
       * Invoked at the end of the functionHandler.
       */
      virtual int exitFunction(Node *) {
        return SWIG_OK;
      }
    
      /**
       * Invoked by functionWrapper callback after call to Language::functionWrapper.
       */
      virtual int emitWrapperFunction(Node *n);
    
      /**
       * Invoked from constantWrapper after call to Language::constantWrapper.
       **/
      virtual int emitConstant(Node *n);
    
      /**
       * Registers a given code snippet for a given key name.
       *
       * This method is called by the fragmentDirective handler
       * of the JAVASCRIPT language module.
       **/
      int registerTemplate(const String *name, const String *code);
    
      /**
       * Retrieve the code template registered for a given name.
       */
      Template getTemplate(const String *name);
    
      State &getState();
    
      ...
    
    }

    The module calls initialize, dump, and close from within the top method:

    int JAVASCRIPT::top(Node *n) {
      emitter->initialize(n);
    
      Language::top(n);
    
      emitter->dump(n);
      emitter->close();
    
      return SWIG_OK;
    }

    The methods enterClass and exitClass are called from within the classHandler method:

    int JAVASCRIPT::classHandler(Node *n) {
    
      emitter->enterClass(n);
      Language::classHandler(n);
      emitter->exitClass(n);
    
      return SWIG_OK;
    }

    In enterClass the emitter stores state information that is necessary when processing class members. In exitClass the wrapper code for the whole class is generated.

    26.5.4 Emitter states

    For storing information during the AST traversal the emitter provides a JSEmitterState with different slots to store data representing the scopes global, class, function, and variable.

    class JSEmitterState {
    
    public:
    
      JSEmitterState();
    
      ~JSEmitterState();
    
      DOH *global();
    
      DOH *global(const char* key, DOH *initial = 0);
    
      DOH *clazz(bool reset = false);
    
      DOH *clazz(const char* key, DOH *initial = 0);
    
      DOH *function(bool reset = false);
    
      DOH *function(const char* key, DOH *initial = 0);
    
      DOH *variable(bool reset = false);
    
      DOH *variable(const char* key, DOH *initial = 0);
    
      static int IsSet(DOH *val);
    
      ...
    };

    When entering a scope, such as in enterClass, the corresponding state is reset and new data is stored:

    state.clazz(RESET);
    state.clazz(NAME, Getattr(n, "sym:name"));

    State information can be retrieved using state.clazz(NAME) or with Getattr on state.clazz() which actually returns a Hash instance.

    26.5.5 Handling Exceptions in JavascriptCore

    Applications with an embedded JavascriptCore should be able to present detailed exception messages that occur in the Javascript engine. Below is an example derived from code provided by Brian Barnes on how these exception details can be extracted.

    void script_exception_to_string(JSContextRef js_context, JSValueRef exception_value_ref, char* return_error_string, int return_error_string_max_length)
    {
      JSObjectRef exception_object;
      JSValueRef value_ref;
      JSStringRef jsstring_property_name = NULL;
      JSValueRef temporary_exception = NULL;
      JSStringRef js_return_string = NULL;
      size_t bytes_needed;
      char* c_result_string = NULL;
      exception_object = JSValueToObject(js_context, exception_value_ref, NULL);
    
      /* source url */
      strcpy(return_error_string, "[");
      jsstring_property_name = JSStringCreateWithUTF8CString("sourceURL");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, ":", return_error_string_max_length-1);
    
      /* line number */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("line");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
      bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
      c_result_string = (char*)calloc(bytes_needed, sizeof(char));
      JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
      JSStringRelease(js_return_string);
      strncat(return_error_string, c_result_string, return_error_string_max_length-1);
      free(c_result_string);
    
      strncat(return_error_string, "]", return_error_string_max_length-1);
    
      /* error message */
    
      jsstring_property_name = JSStringCreateWithUTF8CString("message");
      value_ref = JSObjectGetProperty(js_context, exception_object, jsstring_property_name, &temporary_exception);
      JSStringRelease(jsstring_property_name);
      if(NULL == value_ref)
      {
        strncat(return_error_string, "Unknown Error", return_error_string_max_length-1);
      }
      else
      {
        js_return_string = JSValueToStringCopy(js_context, value_ref, NULL);
        bytes_needed = JSStringGetMaximumUTF8CStringSize(js_return_string);
        c_result_string = (char*)calloc(bytes_needed, sizeof(char));
        JSStringGetUTF8CString(js_return_string, c_result_string, bytes_needed);
        JSStringRelease(js_return_string);
        strncat(return_error_string, c_result_string, return_error_string_max_length-1);
        free(c_result_string);
      }
    }

    It would be used in the following way:

    if(js_exception)
    {
      char return_error_string[256];
      script_exception_to_string(js_context, js_exception, return_error_string, 256);
      printf("Compile error is %s", return_error_string);
    }

    27 SWIG and Common Lisp

    Common Lisp is a high-level, all-purpose, object-oriented, dynamic, functional programming language with long history. Common Lisp is used in many fields, ranging from web development to finance, and also common in computer science education. There are more than 9 different implementations of common lisp which are available, all have different foreign function interfaces. SWIG currently supports only the Allegro Common Lisp, Common Foreign Function Interface(CFFI), CLisp and UFFI foreign function interfaces.

    27.1 Allegro Common Lisp

    Allegro Common Lisp support in SWIG has been updated to include support for both C and C++. You can read about the interface here

    27.2 Common Foreign Function Interface(CFFI)

    CFFI, the Common Foreign Function Interface, is a portable foreign function interface for ANSI Common Lisp systems, similar in spirit to UFFI. Unlike UFFI, CFFI requires only a small set of low-level functionality from the Lisp implementation, such as calling a foreign function by name, allocating foreign memory, and dereferencing pointers.

    To run the cffi module of SWIG requires very little effort, you just need to run:

    swig -cffi -module module-name   file-name 
    
    

    But a better was of using all the power of SWIG is to write SWIG interface files. Below we will explain how to write interface files and the various things which you can do with them.

    27.2.1 Additional Commandline Options

    The following table list the additional commandline options available for the CLISP module. They can also be seen by using:

    swig -cffi -help 
    

    CFFI specific options
    -generate-typedefIf this option is given then defctype will be used to generate
    shortcuts according to the typedefs in the input.
    -[no]cwrapTurn on or turn off generation of an intermediate C file when
    creating a C interface. By default this is only done for C++ code.
    -[no]swig-lispTurns on or off generation of code for helper lisp macro, functions, etc. which SWIG uses while generating wrappers. These macros, functions may still be used by generated wrapper code.

    27.2.2 Generating CFFI bindings

    As we mentioned earlier the ideal way to use SWIG is to use interface files. To illustrate the use of it, let's assume that we have a file named test.h with the following C code:
    #define y 5
    #define x (y >>  1)
    
    typedef int days;
    
    struct bar {
      short p, q;
      char a, b;
      int *z[1000];
      struct bar * n;
    };
      
    struct   bar * my_struct;
    
    struct foo {
      int a;
      struct foo * b[100];
    };
    
    int pointer_func(void (*ClosureFun)( void* _fun, void* _data, void* _evt ), int p);
    
    int func123(div_t * p, int **q[100], int r[][1000][10]);
    
    void lispsort_double (int n, double * array);
    
    enum color { RED, BLUE, GREEN};
    
    Corresponding to this we will write a simple interface file:
    %module test
    
    %include "test.h"
    
    
    The generated SWIG Code will be:
    ;;;SWIG wrapper code starts here
    
    (cl:defmacro defanonenum (&body enums)
       "Converts anonymous enums to defconstants."
      `(cl:progn , @(cl:loop for value in enums
                            for index = 0 then (cl:1+ index)
                            when (cl:listp value) do (cl:setf index (cl:second value)
                                                              value (cl:first value))
                            collect `(cl:defconstant , value , index))))
    
    (cl:eval-when (:compile-toplevel :load-toplevel)
      (cl:unless (cl:fboundp 'swig-lispify)
        (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*))
          (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst)))
                        (cl:cond
                          ((cl:null lst)
                           rest)
                          ((cl:upper-case-p c)
                           (helper (cl:cdr lst) 'upper
                                   (cl:case last
                                     ((lower digit) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:lower-case-p c)
                           (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest)))
                          ((cl:digit-char-p c)
                           (helper (cl:cdr lst) 'digit 
                                   (cl:case last
                                     ((upper lower) (cl:list* c #\- rest))
                                     (cl:t (cl:cons c rest)))))
                          ((cl:char-equal c #\_)
                           (helper (cl:cdr lst) '_ (cl:cons #\- rest)))
                          (cl:t
                           (cl:error "Invalid character: ~A" c)))))
            (cl:let ((fix (cl:case flag
                            ((constant enumvalue) "+")
                            (variable "*")
                            (cl:t ""))))
              (cl:intern
               (cl:concatenate
                'cl:string
                fix
                (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil))
                fix)
               package))))))
    
    ;;;SWIG wrapper code ends here
    
    
    (cl:defconstant y 5)
    
    (cl:defconstant x (cl:ash 5 -1))
    
    (cffi:defcstruct bar
            (p :short)
            (q :short)
            (a :char)
            (b :char)
            (z :pointer)
            (n :pointer))
    
    (cffi:defcvar ("my_struct" my_struct)
     :pointer)
    
    (cffi:defcstruct foo
            (a :int)
            (b :pointer))
    
    (cffi:defcfun ("pointer_func" pointer_func) :int
      (ClosureFun :pointer)
      (p :int))
    
    (cffi:defcfun ("func123" func123) :int
      (p :pointer)
      (q :pointer)
      (r :pointer))
    
    (cffi:defcfun ("lispsort_double" lispsort_double) :void
      (n :int)
      (array :pointer))
    
    (cffi:defcenum color
            :RED
            :BLUE
            :GREEN)
    

    The SWIG wrapper code refers to the special code which SWIG may need to use while wrapping C code. You can turn on/off the generation of this code by using the -[no]swig-lisp option. You must have noticed that SWIG goes one extra step to ensure that CFFI does not do automatic lispification of the C function names. The reason SWIG does this is because quite often developers want to build a nice CLOS based lispy API, and this one to one correspondence between C function names and lisp function name helps.

    Maybe you want to have your own convention for generating lisp function names for corresponding C function names, or you just want to lispify the names, also, before we forget you want to export the generated lisp names. To do this, we will use the SWIG feature directive. Let's edit the interface file such that the C type "div_t*" is changed to Lisp type ":my-pointer", we lispify all names, export everything, and do some more stuff.

    %module test
    
    %typemap(cin) div_t* ":my-pointer";
    
    %feature("intern_function", "1");
    %feature("export");
    
    %feature("inline") lispsort_double;
    %feature("intern_function", "my-lispify") lispsort_double;
    %feature("export", package="'some-other-package") lispsort_double;
    
    %rename func123 renamed_cool_func;
    
    %ignore "pointer_func";
    
    %include "test.h"
    
    

    The typemap(cin) ensures that for all arguments which are input to C with the type "div_t*", the ":my-pointer" type be used. Similarly typemap(cout) are used for all types which are returned from C.

    The feature intern_function ensures that all C names are interned using the swig-lispify function. The "1" given to the feature is optional. The use of feature like %feature("intern_function", "1"); globally enables interning for everything. If you want to target a single function, or declaration then use the targeted version of feature, %feature("intern_function", "my-lispify") lispsort_double;, here we are using an additional feature which allows us to use our lispify function.

    The export feature allows us to export the symbols. If the package argument is given, then the symbol will be exported to the specified Lisp package. The inline feature declaims the declared function as inline. The rename directive allows us to change the name(it is useful when generating C wrapper code for handling overloaded functions). The ignore directive ignores a certain declaration.

    There are several other things which are possible, to see some example of usage of SWIG look at the Lispbuilder and wxCL projects. The generated code with 'noswig-lisp' option is:

    (cl:defconstant #.(swig-lispify "y" 'constant) 5)
    
    (cl:export '#.(swig-lispify "y" 'constant))
    
    (cl:defconstant #.(swig-lispify "x" 'constant) (cl:ash 5 -1))
    
    (cl:export '#.(swig-lispify "x" 'constant))
    
    (cffi:defcstruct #.(swig-lispify "bar" 'classname)
            (#.(swig-lispify "p" 'slotname) :short)
            (#.(swig-lispify "q" 'slotname) :short)
            (#.(swig-lispify "a" 'slotname) :char)
            (#.(swig-lispify "b" 'slotname) :char)
            (#.(swig-lispify "z" 'slotname) :pointer)
            (#.(swig-lispify "n" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "bar" 'classname))
    
    (cl:export '#.(swig-lispify "p" 'slotname))
    
    (cl:export '#.(swig-lispify "q" 'slotname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cl:export '#.(swig-lispify "z" 'slotname))
    
    (cl:export '#.(swig-lispify "n" 'slotname))
    
    (cffi:defcvar ("my_struct" #.(swig-lispify "my_struct" 'variable))
     :pointer)
    
    (cl:export '#.(swig-lispify "my_struct" 'variable))
    
    (cffi:defcstruct #.(swig-lispify "foo" 'classname)
            (#.(swig-lispify "a" 'slotname) :int)
            (#.(swig-lispify "b" 'slotname) :pointer))
    
    (cl:export '#.(swig-lispify "foo" 'classname))
    
    (cl:export '#.(swig-lispify "a" 'slotname))
    
    (cl:export '#.(swig-lispify "b" 'slotname))
    
    (cffi:defcfun ("renamed_cool_func" #.(swig-lispify "renamed_cool_func" 'function)) :int
      (p :my-pointer)
      (q :pointer)
      (r :pointer))
    
    (cl:export '#.(swig-lispify "renamed_cool_func" 'function))
    
    (cl:declaim (cl:inline #.(my-lispify "lispsort_double" 'function)))
    
    (cffi:defcfun ("lispsort_double" #.(my-lispify "lispsort_double" 'function)) :void
      (n :int)
      (array :pointer))
    
    (cl:export '#.(my-lispify "lispsort_double" 'function) 'some-other-package)
    
    (cffi:defcenum #.(swig-lispify "color" 'enumname)
            #.(swig-lispify "RED" 'enumvalue :keyword)
            #.(swig-lispify "BLUE" 'enumvalue :keyword)
            #.(swig-lispify "GREEN" 'enumvalue :keyword))
    
    (cl:export '#.(swig-lispify "color" 'enumname))
    
    

    27.2.3 Generating CFFI bindings for C++ code

    This feature to SWIG (for CFFI) is very new and still far from complete. Pitch in with your patches, bug reports and feature requests to improve it.

    Generating bindings for C++ code, requires -c++ option to be present and it first generates C binding which will wrap the C++ code, and then generates the corresponding CFFI wrapper code. In the generated C wrapper code, you will often want to put your own C code, such as the code to include various files. This can be done by making use of "%{" and "%}" as shown below.

    %{
     #include "Test/test.h"
    %}
    

    Also, while parsing the C++ file and generating C wrapper code SWIG may need to be able to understand various symbols used in other header files. To help SWIG in doing this while ensuring that wrapper code is generated for the target file, use the "import" directive. The "include" directive specifies the target file for which wrapper code will be generated.

    
    %import "ancillary/header.h"
    
    %include "target/header.h"
    
    
    Various features which were available for C headers can also be used here. The target header which we are going to use here is:
    namespace OpenDemo {
      class Test
      {
        public:
          float x;
          // constructors
          Test (void) {x = 0;}
          Test (float X) {x = X;}
    
          // vector addition
          Test operator+ (const Test& v) const {return Test (x+v.x);}
    
          // length squared
          float lengthSquared (void) const {return this->dot (*this);}
    
          static float distance (const Test& a, const Test& b){return(a-b).length();}
    
          inline Test parallelComponent (const Test& unitBasis) const {
            return unitBasis * projection;
          }
    
          Test setYtoZero (void) const {return Test (this->x);}
    
          static const Test zero;
      };
    
      inline Test operator* (float s, const Test& v) {return v*s;}
    
      inline std::ostream& operator<< (std::ostream& o, const Test& v)
      {
        return o << "(" << v.x << ")";
      }
    
      inline Test RandomUnitVectorOnXZPlane (void)
      {
        return RandomVectorInUnitRadiusSphere().setYtoZero().normalize();
      }
    }
    

    The interface used is:

    %module test
    %include "test.cpp"
    
    SWIG generates 3 files, the first one is a C wrap which we don't show, the second is the plain CFFI wrapper which is as shown below:
    (cffi:defcfun ("_wrap_Test_x_set" Test_x_set) :void
      (self :pointer)
      (x :float))
    
    (cffi:defcfun ("_wrap_Test_x_get" Test_x_get) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_0" new_Test) :pointer)
    
    (cffi:defcfun ("_wrap_new_Test__SWIG_1" new_Test) :pointer
      (X :float))
    
    (cffi:defcfun ("_wrap_Test___add__" Test___add__) :pointer
      (self :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_Test_lengthSquared" Test_lengthSquared) :float
      (self :pointer))
    
    (cffi:defcfun ("_wrap_Test_distance" Test_distance) :float
      (a :pointer)
      (b :pointer))
    
    (cffi:defcfun ("_wrap_Test_parallelComponent" Test_parallelComponent) :pointer
      (self :pointer)
      (unitBasis :pointer))
    
    (cffi:defcfun ("_wrap_Test_setYtoZero" Test_setYtoZero) :pointer
      (self :pointer))
    
    (cffi:defcvar ("Test_zero" Test_zero)
     :pointer)
    
    (cffi:defcfun ("_wrap_delete_Test" delete_Test) :void
      (self :pointer))
    
    (cffi:defcfun ("_wrap___mul__" __mul__) :pointer
      (s :float)
      (v :pointer))
    
    (cffi:defcfun ("_wrap___lshift__" __lshift__) :pointer
      (o :pointer)
      (v :pointer))
    
    (cffi:defcfun ("_wrap_RandomUnitVectorOnXZPlane" RandomUnitVectorOnXZPlane) :pointer)
    
    The output is pretty good but it fails in disambiguating overloaded functions such as the constructor, in this case. One way of resolving this problem is to make the interface use the rename directiv, but hopefully there are better solutions. In addition SWIG also generates, a CLOS file
    (clos:defclass test()
      ((ff :reader ff-pointer)))
    
    (clos:defmethod (cl:setf x) (arg0 (obj test))
      (Test_x_set (ff-pointer obj) arg0))
    
    (clos:defmethod x ((obj test))
      (Test_x_get (ff-pointer obj)))
    
    (cl:shadow "+")
    (clos:defmethod + ((obj test) (self test) (v test))
      (Test___add__ (ff-pointer obj) (ff-pointer self) (ff-pointer v)))
    
    (clos:defmethod length-squared ((obj test) (self test))
      (Test_lengthSquared (ff-pointer obj) (ff-pointer self)))
    
    (clos:defmethod parallel-component ((obj test) (self test) (unitBasis test))
      (Test_parallelComponent (ff-pointer obj) (ff-pointer self) (ff-pointer unitBasis)))
    
    (clos:defmethod set-yto-zero ((obj test) (self test))
      (Test_setYtoZero (ff-pointer obj) (ff-pointer self)))
    

    I agree that the CFFI C++ module needs lot more work. But I hope it provides a starting point, on which you can base your work of importing C++ libraries to Lisp.

    If you have any questions, suggestions, patches, etc., related to CFFI module feel free to contact us on the SWIG mailing list, and also please add a "[CFFI]" tag in the subject line.

    27.2.4 Inserting user code into generated files

    It is often necessary to include user-defined code into the automatically generated interface files. For example, when building a C++ interface, example_wrap.cxx will likely not compile unless you add a #include "header.h" directive. This can be done using the SWIG %insert(section) %{ ...code... %} directive:

    %module example
    
    %{
    #include "header.h"
    %}
    
    %include "header.h"
    
    int fact(int n);
    

    Additional sections have been added for inserting into the generated lisp interface file:

    • lisphead - inserts before type declarations
    • swiglisp - inserts after type declarations according to where it appears in the .i file

    Note that the block %{ ... %} is effectively a shortcut for %insert("header") %{ ... %}.

    27.3 CLISP

    CLISP is a feature-loaded implementation of common lisp which is portable across most of the operating system environments and hardware. CLISP includes an interpreter, a compiler, a debugger, CLOS, MOP, a foreign language interface, i18n, regular expressions, a socket interface, and more. An X11 interface is available through CLX, Garnet and CLUE/CLIO. Command line editing is provided by readline. CLISP runs Maxima, ACL2 and many other Common Lisp packages.

    To run the clisp module of SWIG requires very little effort, you just need to execute:

    swig -clisp -module module-name   file-name 
    
    

    Because of the high level nature of the CLISP FFI, the bindings generated by SWIG may not be absolutely correct, and you may need to modify them. The good thing is that you don't need to complex interface file for the CLISP module. The CLISP module tries to produce code which is both human readable and easily modifyable.

    27.3.1 Additional Commandline Options

    The following table list the additional commandline options available for the CLISP module. They can also be seen by using:

    swig -clisp -help 
    

    CLISP specific options
    -extern-allIf this option is given then clisp definitions for all the functions
    and global variables will be created otherwise only definitions for
    externed functions and variables are created.
    -generate-typedefIf this option is given then def-c-type will be used to generate
    shortcuts according to the typedefs in the input.

    27.3.2 Details on CLISP bindings

    As mentioned earlier the CLISP bindings generated by SWIG may need some modifications. The clisp module creates a lisp file with the same name as the module name. This lisp file contains a 'defpackage' declaration, with the package name same as the module name. This package uses the 'common-lisp' and 'ffi' packages. Also, package exports all the functions, structures and variables for which an ffi binding was generated.
    After generating the defpackage statement, the clisp module also sets the default language.

    (defpackage :test
        (:use :common-lisp :ffi)
      (:export
       :make-bar
       :bar-x
       :bar-y
       :bar-a
       :bar-b
       :bar-z
       :bar-n
       :pointer_func
       :func123
       :make-cfunr
       :lispsort_double
       :test123))
    
    (in-package :test)
    
    (default-foreign-language :stdc)
    

    The ffi wrappers for functions and variables are generated as shown below. When functions have arguments of type "double * array", SWIG doesn't knows whether it is an 'out' argument or it is an array which will be passed, so SWIG plays it safe by declaring it as an '(array (ffi:c-ptr DOUBLE-FLOAT))'. For arguments of type "int **z[100]" where SWIG has more information, i.e., it knows that 'z' is an array of pointers to pointers of integers, SWIG defines it to be '(z (ffi:c-ptr (ffi:c-array (ffi:c-ptr (ffi:c-ptr ffi:int)) 100)))'

    extern "C" {
    int pointer_func(void (*ClosureFun)( void* _fun, void* _data, void* _evt ), int y);
    
    int func123(div_t * x, int **z[100], int y[][1000][10]);
    
    void lispsort_double (int n, double * array);
    
    void test123(float x , double y);
    
    }
    
    (ffi:def-call-out pointer_func
        (:name "pointer_func")
      (:arguments (ClosureFun (ffi:c-function (:arguments (arg0 (ffi:c-pointer NIL))
                                                          (arg1 (ffi:c-pointer NIL))
                                                          (arg2 (ffi:c-pointer NIL)))
                                              (:return-type NIL)))
                  (y ffi:int))
      (:return-type ffi:int)
      (:library +library-name+))
    
    (ffi:def-call-out func123
        (:name "func123")
      (:arguments (x (ffi:c-pointer div_t))
                  (z (ffi:c-ptr (ffi:c-array (ffi:c-ptr (ffi:c-ptr ffi:int)) 100)))
                  (y (ffi:c-ptr (ffi:c-ptr (ffi:c-array ffi:int (1000 10))))))
      (:return-type ffi:int)
      (:library +library-name+))
    
    
    (ffi:def-call-out lispsort_double
        (:name "lispsort_double")
      (:arguments (n ffi:int)
                  (array (ffi:c-ptr DOUBLE-FLOAT)))
      (:return-type NIL)
      (:library +library-name+))
    
    (ffi:def-call-out test123
        (:name "test")
      (:arguments (x SINGLE-FLOAT)
                  (y DOUBLE-FLOAT))
      (:return-type NIL)
      (:library +library-name+))
    
    

    The module also handles strutcures and #define constants as shown below. SWIG automatically adds the constructors and accessors created for the struct to the list of symbols exported by the package.

    struct bar {
      short x, y;
      char a, b;
      int *z[1000];
      struct bar * n;
    };
    
    #define max 1000
    
    (ffi:def-c-struct bar
        (x :type ffi:short)
      (y :type ffi:short)
      (a :type character)
      (b :type character)
      (z :type (ffi:c-array (ffi:c-ptr ffi:int) 1000))
      (n :type (ffi:c-pointer bar)))
    
    (defconstant max 1000)
    
    

    27.4 UFFI


    28 SWIG and Lua

    Lua is an extension programming language designed to support general procedural programming with data description facilities. It also offers good support for object-oriented programming, functional programming, and data-driven programming. Lua is intended to be used as a powerful, light-weight configuration language for any program that needs one. Lua is implemented as a library, written in clean C (that is, in the common subset of ANSI C and C++). It's also a really tiny language, less than 6000 lines of code, which compiles to <100 kilobytes of binary code. It can be found at http://www.lua.org

    eLua stands for Embedded Lua (can be thought of as a flavor of Lua) and offers the full implementation of the Lua programming language to the embedded world, extending it with specific features for efficient and portable software embedded development. eLua runs on smaller devices like microcontrollers and provides the full features of the regular Lua desktop version. More information on eLua can be found here: http://www.eluaproject.net

    28.1 Preliminaries

    The current SWIG implementation is designed to work with Lua 5.0.x, 5.1.x and 5.2.x. It should work with later versions of Lua, but certainly not with Lua 4.0 due to substantial API changes. It is possible to either static link or dynamic link a Lua module into the interpreter (normally Lua static links its libraries, as dynamic linking is not available on all platforms). SWIG also has support for eLua starting from eLua 0.8. Due to substantial changes between SWIG 2.x and SWIG 3.0 and unavailability of testing platform, eLua status was downgraded to 'experimental'.

    28.2 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo;
    

    To build a Lua module, run SWIG using the -lua option.

    $ swig -lua example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -lua example.i
    

    This creates a C/C++ source file example_wrap.c or example_wrap.cxx. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The wrapped module will export one function "int luaopen_example(lua_State* L)" which must be called to register the module with the Lua interpreter. The name "luaopen_example" depends upon the name of the module.

    To build an eLua module, run SWIG using -lua and add either -elua or -eluac.

    $ swig -lua -elua example.i
    

    or

    $ swig -lua -eluac example.i
    

    The -elua option puts all the C function wrappers and variable get/set wrappers in rotables. It also generates a metatable which will control the access to these variables from eLua. It also offers a significant amount of module size compression. On the other hand, the -eluac option puts all the wrappers in a single rotable. With this option, no matter how huge the module, it will consume no additional microcontroller SRAM (crass compression). There is a catch though: Metatables are not generated with -eluac. To access any value from eLua, one must directly call the wrapper function associated with that value.

    28.2.1 Additional command line options

    The following table list the additional commandline options available for the Lua module. They can also be seen by using:

    swig -lua -help 
    
    Lua specific options
    -eluaGenerates LTR compatible wrappers for smaller devices running elua.
    -eluacLTR compatible wrappers in "crass compress" mode for elua.
    -nomoduleglobalDo not register the module name as a global variable but return the module table from calls to require.
    -no-old-metatable-bindingsDisable backward compatibility: old-style binding names generations and a few other things. Explanations are included in appropriate later sections.
    -squash-basesSquashes symbols from all inheritance tree of a given class into itself. Emulates pre-SWIG3.0 inheritance. Insignificantly speeds things up, but increases memory consumption.

    28.2.2 Compiling and Linking and Interpreter

    Normally Lua is embedded into another program and will be statically linked. An extremely simple stand-alone interpreter (min.c) is given below:

    #include <stdio.h>
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    
    extern int luaopen_example(lua_State* L); // declare the wrapped module
    
    int main(int argc, char* argv[])
    {
     lua_State *L;
     if (argc<2)
     {
      printf("%s: <filename.lua>\n", argv[0]);
      return 0;
     }
     L=lua_open();
     luaopen_base(L);       // load basic libs (eg. print)
     luaopen_example(L);    // load the wrapped module
     if (luaL_loadfile(L, argv[1])==0) // load and run the file
      lua_pcall(L, 0, 0, 0);
     else
      printf("unable to load %s\n", argv[1]);
     lua_close(L);
     return 0;
    }
    

    A much improved set of code can be found in the Lua distribution src/lua/lua.c. Include your module, just add the external declaration & add a #define LUA_EXTRALIBS {"example", luaopen_example}, at the relevant place.

    The exact commands for compiling and linking vary from platform to platform. Here is a possible set of commands of doing this:

    $ swig -lua example.i -o example_wrap.c
    $ gcc -I/usr/include/lua -c min.c -o min.o
    $ gcc -I/usr/include/lua -c example_wrap.c -o example_wrap.o
    $ gcc -c example.c -o example.o
    $ gcc -I/usr/include/lua -L/usr/lib/lua min.o example_wrap.o example.o -o my_lua
    

    For eLua, the source must be built along with the wrappers generated by SWIG. Make sure the eLua source files platform_conf.h and auxmods.h are updated with the entries of your new module. Please note: "mod" is the module name.

    /* Sample platform_conf.h */
    #define LUA_PLATFORM_LIBS_ROM\
      _ROM( AUXLIB_PIO, luaopen_pio, pio_map )\
      _ROM( AUXLIB_TMR, luaopen_tmr, tmr_map )\
      _ROM( AUXLIB_MOD, luaopen_mod, mod_map )\
      ....
    
    /* Sample auxmods.h */
    #define AUXLIB_PIO       "pio"
    LUALIB_API int ( luaopen_pio )(lua_State *L );
    
    #define AUXLIB_MOD       "mod"
    LUALIB_API int ( luaopen_mod )(lua_State *L );
    ....
    

    More information on building and configuring eLua can be found here: http://www.eluaproject.net/doc/v0.8/en_building.html

    28.2.3 Compiling a dynamic module

    Most, but not all platforms support the dynamic loading of modules (Windows & Linux do). Refer to the Lua manual to determine if your platform supports it. For compiling a dynamically loaded module the same wrapper can be used. Assuming you have code you need to link to in a file called example.c, the commands will be something like this:

    $ swig -lua example.i -o example_wrap.c
    $ gcc -fPIC -I/usr/include/lua -c example_wrap.c -o example_wrap.o
    $ gcc -fPIC -c example.c -o example.o
    $ gcc -shared -I/usr/include/lua -L/usr/lib/lua example_wrap.o example.o -o example.so
    

    The wrappers produced by SWIG can be compiled and linked with Lua 5.1.x and later. The loading is extremely simple.

    require("example")
    

    For those using Lua 5.0.x, you will also need an interpreter with the loadlib function (such as the default interpreter compiled with Lua). In order to dynamically load a module you must call the loadlib function with two parameters: the filename of the shared library, and the function exported by SWIG. Calling loadlib should return the function, which you then call to initialise the module

    my_init=loadlib("example.so", "luaopen_example") -- for Unix/Linux
    --my_init=loadlib("example.dll", "luaopen_example") -- for Windows
    assert(my_init) -- make sure it's not nil
    my_init()       -- call the init fn of the lib
    

    Or can be done in a single line of Lua code

    assert(loadlib("example.so", "luaopen_example"))()
    

    If the code didn't work, don't panic. The best thing to do is to copy the module and your interpreter into a single directory and then execute the interpreter and try to manually load the module (take care, all this code is case sensitive).

    a, b, c=package.loadlib("example.so", "luaopen_example") -- for Unix/Linux
    --a, b, c=package.loadlib("example.dll", "luaopen_example") -- for Windows
    print(a, b, c)
    

    Note: for Lua 5.0:
    The loadlib() function is in the global namespace, not in a package. So it's just loadlib().

    if 'a' is a function, this is all working fine, all you need to do is call it

      a()
    

    to load your library which will add a table 'example' with all the functions added.

    If it doesn't work, look at the error messages, in particular message 'b'
    The specified module could not be found.
    Means that is cannot find the module, check your the location and spelling of the module.
    The specified procedure could not be found.
    Means that it loaded the module, but cannot find the named function. Again check the spelling, and if possible check to make sure the functions were exported correctly.
    'loadlib' not installed/supported
    Is quite obvious (Go back and consult the Lua documents on how to enable loadlib for your platform).

    28.2.4 Using your module

    Assuming all goes well, you will be able to this:

    $ ./my_lua
    > print(example.gcd(4, 6))
    2
    > print(example.Foo)
    3
    > example.Foo=4
    > print(example.Foo)
    4
    >
    

    28.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Lua interface to your C/C++ code. This section briefly covers the essential aspects of this wrapping.

    28.3.1 Modules

    The SWIG module directive specifies the name of the Lua module. If you specify `module example', then everything is wrapped into a Lua table 'example' containing all the functions and variables. When choosing a module name, make sure you don't use the same name as a built-in Lua command or standard module name.

    28.3.2 Functions

    Global functions are wrapped as new Lua built-in functions. For example,

    %module example
    int fact(int n);

    creates a built-in function example.fact(n) that works exactly like you think it does:

    > print example.fact(4)
    24
    >
    

    To avoid name collisions, SWIG create a Lua table which keeps all the functions, constants, classes and global variables in. It is possible to copy the functions, constants and classes (but not variables) out of this and into the global environment with the following code. This can easily overwrite existing functions, so this must be used with care. This option is considered deprecated and will be removed in the near future.

    > for k, v in pairs(example) do _G[k]=v end
    > print(fact(4))
    24
    >
    

    It is also possible to rename the module with an assignment.

    > e=example
    > print(e.fact(4))
    24
    > print(example.fact(4))
    24
    

    28.3.3 Global variables

    Global variables (which are linked to C code) are supported, and appear to be just another variable in Lua. However the actual mechanism is more complex. Given a global variable:

    %module example
    extern double Foo;
    

    SWIG will effectively generate two functions example.Foo_set() and example.Foo_get(). It then adds a metatable to the table 'example' to call these functions at the correct time (when you attempt to set or get examples.Foo). Therefore if you were to attempt to assign the global to another variable, you will get a local copy within the interpreter, which is no longer linked to the C code.

    > print(example.Foo)
    3
    > c=example.Foo   -- c is a COPY of example.Foo, not the same thing
    > example.Foo=4
    > print(c)
    3
    > c=5 -- this will not effect the original example.Foo
    > print(example.Foo, c)
    4    5
    

    It is therefore not possible to 'move' the global variable into the global namespace as it is with functions. It is however, possible to rename the module with an assignment, to make it more convenient.

    > e=example
    > -- e and example are the same table
    > -- so e.Foo and example.Foo are the same thing
    > example.Foo=4
    > print(e.Foo)
    4
    

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause a Lua error. Given a global variable:

    %module example
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    > print(e.Foo) -- reading works ok
    4
    > example.Foo=40 -- but writing does not
    This variable is immutable
    stack traceback:
            [C]: ?
            [C]: ?
            stdin:1: in main chunk
            [C]: ?
    

    For those people who would rather that SWIG silently ignore the setting of immutables (as previous versions of the Lua bindings did), adding a -DSWIGLUA_IGNORE_SET_IMMUTABLE compile option will remove this.

    Unlike earlier versions of the binding, it is now possible to add new functions or variables to the module, just as if it were a normal table. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    > -- example.PI does not exist
    > print(example.PI)
    nil
    > example.PI=3.142 -- new value added
    > print(example.PI)
    3.142
    

    If you have used the -eluac option for your eLua module, you will have to follow a different approach while manipulating global variables. (This is not applicable for wrappers generated with -elua)

    > -- Applicable only with -eluac. (num is defined)
    > print(example.num_get())
    20
    > example.num_set(50) -- new value added
    > print(example.num_get())
    50
    

    In general, functions of the form "variable_get()" and "variable_set()" are automatically generated by SWIG for use with -eluac.

    28.3.4 Constants and enums

    Because Lua doesn't really have the concept of constants, C/C++ constants are not really constant in Lua. They are actually just a copy of the value into the Lua interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module example
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Lua code:

    example.ICONST=42
    example.SCONST="Hello World"
    example.SUNDAY=0
    ....
    

    Constants are not guaranteed to remain constant in Lua. The name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    If you're using eLua and have used -elua or -eluac to generate your wrapper, macro constants and enums should be accessed through a rotable called "const". In eLua, macro constants and enums are guaranteed to remain constants since they are all contained within a rotable. A regular C constant is accessed from eLua just as if it were a regular global variable, just that the property of value immutability is demonstrated if an attempt at modifying a C constant is made.

    > print(example.ICONST)
    10
    > print(example.const.SUNDAY)
    0
    > print(example.const.SCONST)
    Hello World
    

    28.3.4.1 Constants/enums and classes/structures

    Enums are exported into a class table. For example, given some enums:

    %module example
    enum Days { SUNDAY = 0, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY };
    struct Test {
      enum { TEST1 = 10, TEST2 = 20 };
    #ifdef __cplusplus // There are no static members in C
      static const int ICONST = 12;
    #endif
    };
    

    There is a slight difference in behaviour wrapping C and C++ code due to the different scoping rules of C and C++. The wrapped C++ code is used as follows from Lua code:

    > print(example.SUNDAY)
    0
    > print(example.Test.TEST1)
    10
    > print(example.Test.ICONST)
    12
    

    Enums within a C struct are in the global namespace and are used as follows from Lua

    > print(example.SUNDAY)
    0
    > -- See the difference here
    > print(example.TEST1)
    10
    

    Compatibility Note: Versions of SWIG prior to SWIG-3.0.0 did not generate the class table members above. There is no change in the C wrappers, but the following code was the only way to access these constants/enums when wrapping C++ member constants:

    > print(example.Test_TEST1)
    10
    > print(example.Test_ICONST)
    12
    

    The old-style bindings are still generated in addition to the new ones. If the -no-old-metatable-bindings option is used, then these old-style bindings are not generated.

    It is worth mentioning, that example.Test.TEST1 and example.Test_TEST1 are different entities and changing one does not change the other. Given the fact that these are constantes and they are not supposed to be changed, it is up to you to avoid such issues.

    28.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Lua. For example:

    > f=example.fopen("junk", "w")
    > example.fputs("Hello World", f)
    > example.fclose(f)
    

    Unlike many scripting languages, Lua has had support for pointers to C/C++ object built in for a long time. They are called 'userdata'. Unlike many other SWIG versions which use some kind of encoded character string, all objects will be represented as a userdata. The SWIG-Lua bindings provides a special function swig_type(), which if given a userdata object will return the type of object pointed to as a string (assuming it was a SWIG wrapped object).

    > print(f)
    userdata: 003FDA80
    > print(swig_type(f))
    FILE * -- it's a FILE*
    

    Lua enforces the integrity of its userdata, so it is virtually impossible to corrupt the data. But as the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes & structs (see below). One final note: if a function returns a NULL pointer, this is not encoded as a userdata, but as a Lua nil.

    > f=example.fopen("not there", "r") -- this will return a NULL in C
    > print(f)
    nil
    

    28.3.6 Structures

    If you wrap a C structure, it is also mapped to a Lua userdata. By adding a metatable to the userdata, this provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    > p=example.new_Point()
    > p.x=3
    > p.y=5
    > print(p.x, p.y)
    3       5
    >
    

    Similar access is provided for unions and the data members of C++ classes.
    C structures can be created using a function new_Point(), and both C structures and C++ classes can be created using just the name Point().

    If you print out the value of p in the above example, you will see something like this:

    > print(p)
    userdata: 003FA320
    

    Like the pointer in the previous section, this is held as a userdata. However, additional features have been added to make this more usable. SWIG effectively creates some accessor/mutator functions to get and set the data. These functions will be added to the userdata's metatable. This provides the natural access to the member variables that were shown above (see end of the document for full details).

    const members of a structure are read-only. Data members can also be forced to be read-only using the immutable directive. As with other immutables, setting attempts will be cause an error. For example:

    struct Foo {
      ...
      %immutable;
      int x;        // Read-only members
      char *name;
      %mutable;
      ...
    };
    

    The mechanism for managing char* members as well as array members is similar to other languages. It is somewhat cumbersome and should probably be better handled by defining of typemaps (described later).

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    > b = Bar()
    > x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       // Points inside b
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    > b = Bar()
    > b.f.a = 3               -- Modify attribute of structure member
    > x = b.f
    > x.a = 3                 -- Modifies the same structure
    

    For eLua with the -eluac option, structure manipulation has to be performed with specific structure functions generated by SWIG. Let's say you have the following structure definition:

    struct data {
      int x, y;
      double z;
    };
    
    > --From eLua
    > a = example.new_data()
    > example.data_x_set(a, 10)
    > example.data_y_set(a, 20)
    > print(example.data_x_get(a), example.data_y_get(a))
    10 20
    

    In general, functions of the form "new_struct()", "struct_member_get()", "struct_member_set()" and "free_struct()" are automatically generated by SWIG for each structure defined in C. (Please note: This doesn't apply for modules generated with the -elua option)

    28.3.7 C++ classes

    C++ classes are wrapped by a Lua userdata as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Lua like this:

    > l = example.List()
    > l:insert("Ale")
    > l:insert("Stout")
    > l:insert("Lager")
    > print(l:get(1))
    Stout
    > print(l:length)
    3
    >
    

    (Note: for calling methods of a class, you use class:method(args), not class.method(args), it's an easy mistake to make. However for data attributes it is class.attribute )

    Class data members are accessed in the same manner as C structures. Static class members present a special problem for Lua, as Lua doesn't have support for such features. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Lua, C++ static members can be accessed as follows:

    > example.Spam.foo()            -- calling Spam::foo()
    > a=example.Spam.bar            -- reading Spam::bar 
    > example.Spam.bar=b            -- writing to Spam::bar
    

    It is not (currently) possible to access static members of an instance:

    > s=example.Spam()              -- s is a Spam instance
    > s.foo()                       -- Spam::foo() via an instance
                                    -- does NOT work
    

    Compatibility Note: In versions prior to SWIG-3.0.0 only the following names would work:

    > example.Spam_foo()            -- calling Spam::foo()
    > a=example.Spam_bar            -- reading Spam::bar 
    > example.Spam_bar=b            -- writing to Spam::bar
    

    Both style names are generated by default now. However, if the -no-old-metatable-bindings option is used, then the backward compatible names are not generated in addition to ordinary ones.

    28.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    And if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts a Foo pointer or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    28.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In SWIG, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    > f = Foo()           -- Create a Foo
    > spam1(f)            -- Ok. Pointer
    > spam2(f)            -- Ok. Reference
    > spam3(f)            -- Ok. Value.
    > spam4(f)            -- Ok. Array (1 element)
    

    Similar behaviour occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Lua will release this memory when the return value is garbage collected). The other two are pointers which are assumed to be managed by the C code and so will not be garbage collected.

    28.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Lua in a straightforward manner:

    > foo(3)           -- foo(int)
    > foo("Hello")     -- foo(char *c)
    

    However due to Lua's coercion mechanism is can sometimes do strange things.

    > foo("3")           -- "3" can be coerced into an int, so it calls foo(int)!
    

    As this coercion mechanism is an integral part of Lua, there is no easy way to get around this other than renaming of functions (see below).

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Lua code like this:

    > f = Foo()          -- Create a Foo
    > g = Foo(f)         -- Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    Dealing with the Lua coercion mechanism, the priority is roughly (integers, floats, strings, userdata). But it is better to rename the functions rather than rely upon the ordering.

    28.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > e:re()
    10.0
    > e:im()
    12.0
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Lua, and some Lua operators don't map cleanly to C++ operators. For instance, overloaded assignment operators don't map to Lua semantics and will be ignored, and C++ doesn't support Lua's concatenation operator (.. ).

    In order to keep maximum compatibility within the different languages in SWIG, the Lua bindings uses the same set of operator names as python. Although internally it renames the functions to something else (on order to work with Lua).

    The current list of operators which can be overloaded (and the alternative function names) are:

    • __add__ operator+
    • __sub__ operator-
    • __mul__ operator *
    • __div__ operator/
    • __unm__ unary minus
    • __call__ operator() (often used in functor classes)
    • __pow__ the exponential fn (no C++ equivalent, Lua uses ^)
    • __concat__ the concatenation operator (Lua's ..)
    • __eq__ operator==
    • __lt__ operator<
    • __le__ operator<=

    Note: in Lua, only the equals, less than, and less than equals operators are defined. The other operators (!=, >, >=) are achieved by using a logical not applied to the results of other operators.

    The following operators cannot be overloaded (mainly because they are not supported in Lua)

    • ++ and --
    • +=, -=, *= etc
    • % operator (you have to use math.mod)
    • assignment operator
    • all bitwise/logical operations

    SWIG also accepts the __str__() member function which converts an object to a string. This function should return a const char*, preferably to static memory. This will be used for the print() and tostring() functions in Lua. Assuming the complex class has a function

    const char* __str__()
    {
            static char buffer[255];
            sprintf(buffer, "Complex(%g, %g)", this->re(), this->im());
            return buffer;
    }
    

    Then this will support the following code in Lua

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > print(e)
    Complex(10, 12)
    > s=tostring(e) -- s is the number in string form
    > print(s)
    Complex(10, 12)
    

    It is also possible to overload the operator[], but currently this cannot be automatically performed. To overload the operator[] you need to provide two functions, __getitem__() and __setitem__()

    class Complex
    {
            //....
            double __getitem__(int i)const; // i is the index, returns the data
            void __setitem__(int i, double d); // i is the index, d is the data
    };
    

    C++ operators are mapped to Lua predefined metafunctions. Class inherits from its bases the following list of metafunctions ( thus inheriting the folloging operators and pseudo-operators):

    • __add__
    • __sub__
    • __mul__
    • __div__
    • __unm__
    • __mod__
    • __call__
    • __pow__
    • __concat__
    • __eq__
    • __lt__
    • __le__
    • __len__
    • __getitem__
    • __setitem__
    • __tostring used internally by Lua for tostring() function. __str__ is mapped to this function

    No other lua metafunction is inherited. For example, __gc is not inherited and must be redefined in every class. __tostring is subject to a special handling. If absent in class and in class bases, a default one will be provided by SWIG.

    28.3.12 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods. In the previous section, the Complex class would have benefited greatly from an __str__() method as well as some repairs to the operator overloading. It can also be used to add additional functions to the class if they are needed.

    Take the original Complex class

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
    
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    Now we extend it with some new code

    %extend Complex {
      const char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Complex(%g, %g)", $self->re(), $self->im());
        return tmp;
      }
      bool operator==(const Complex& c) {
        return ($self->re()==c.re() && $self->im()==c.im());
      }
    };
    

    Now, in Lua

    > c = Complex(3, 4)
    > d = Complex(7, 8)
    > e = c + d
    > print(e)      -- print uses __str__ to get the string form to print
    Complex(10, 12)
    > print(e==Complex(10, 12))  -- testing the == operator
    true
    > print(e!=Complex(12, 12))  -- the != uses the == operator
    true
    

    Extend works with both C and C++ code, on classes and structs. It does not modify the underlying object in any way---the extensions only show up in the Lua interface. The only item to take note of is the code has to use the '$self' instead of 'this', and that you cannot access protected/private members of the code (as you are not officially part of the class).

    28.3.13 Using %newobject to release memory

    If you have a function that allocates memory like this,

    char *foo() {
      char *result = (char *) malloc(...);
      ...
      return result;
    }
    

    then the SWIG generated wrappers will have a memory leak--the returned data will be copied into a string object and the old contents ignored.

    To fix the memory leak, use the %newobject directive.

    %newobject foo;
    ...
    char *foo();
    

    This will release the allocated memory.

    28.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Lua:

    > p = example.pairii(3, 4)
    > print(p.first, p.second)
    3    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    28.3.15 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Lua, everything should just "work":

    > p = example.CreateFoo()          -- Create a smart-pointer somehow
    > p.x = 3                          -- Foo::x
    > print(p:bar())                   -- Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    > f = p:__deref__()     -- Returns underlying Foo *
    

    28.3.16 C++ Exceptions

    Lua does not natively support exceptions, but it has errors which are similar. When a Lua function terminates with an error it returns one value back to the caller. SWIG automatically maps any basic type which is thrown into a Lua error. Therefore for a function:

    int message() throw(const char *) {
      throw("I died.");
      return 1;
    }
    

    SWIG will automatically convert this to a Lua error.

    > message()
    I died.
    stack traceback:
            [C]: in function 'message'
            stdin:1: in main chunk
            [C]: ?
    >
    

    If you want to catch an exception, you must use either pcall() or xpcall(), which are documented in the Lua manual. Using xpcall will allow you to obtain additional debug information (such as a stacktrace).

    > function a() b() end -- function a() calls function b()
    > function b() message() end -- function b() calls C++ function message(), which throws 
    > ok, res=pcall(a)  -- call the function
    > print(ok, res)
    false   I died.
    > ok, res=xpcall(a, debug.traceback)  -- call the function
    > print(ok, res)
    false   I died.
    stack traceback:
            [C]: in function 'message'
            runme.lua:70: in function 'b'
            runme.lua:67: in function <runme.lua:66>
            [C]: in function 'xpcall'
            runme.lua:95: in main chunk
            [C]: ?
    

    SWIG is able to throw numeric types, enums, chars, char*'s and std::string's without problem. It has also written typemaps for std::exception and its derived classes, which convert the exception into an error string.

    However it's not so simple to throw other types of objects. Thrown objects are not valid outside the 'catch' block. Therefore they cannot be returned to the interpreter. The obvious ways to overcome this would be to either return a copy of the object, or to convert the object to a string and return that. Though it seems obvious to perform the former, in some cases this is not possible, most notably when SWIG has no information about the object, or the object is not copyable/creatable.

    Therefore by default SWIG converts all thrown object into strings and returns them. So given a function:

    void throw_A() throw(A*) {
      throw new A();
    }
    

    SWIG will just convert it (poorly) to a string and use that as its error. (This is not that useful, but it always works).

    > throw_A()
    object exception:A *
    stack traceback:
            [C]: in function 'unknown'
            stdin:1: in main chunk
            [C]: ?
    >
    

    To get a more useful behaviour out of SWIG you must either: provide a way to convert your exceptions into strings, or throw objects which can be copied.

    If you have your own class which you want output as a string you will need to add a typemap something like this:

    %typemap(throws) my_except
    %{ 
      lua_pushstring(L, $1.what()); // assuming my_except::what() returns a const char* message
      SWIG_fail; // trigger the error handler
    %}
    

    If you wish your exception to be returned to the interpreter, it must firstly be copyable. Then you must have an additional %apply statement, to tell SWIG to return a copy of this object to the interpreter. For example:

    %apply SWIGTYPE EXCEPTION_BY_VAL {Exc}; // tell SWIG to return Exc by value to interpreter
    
    class Exc {
    public:
      Exc(int c, const char *m) {
        code = c;
        strncpy(msg, m, 256);
      }
      int code;
      char msg[256];
    };
    
    void throw_exc() throw(Exc) {
      throw(Exc(42, "Hosed"));
    } 
    

    Then the following code can be used (note: we use pcall to catch the error so we can process the exception).

    > ok, res=pcall(throw_exc)
    > print(ok)
    false
    > print(res)
    userdata: 0003D880
    > print(res.code, res.msg)
    42      Hosed
    >
    

    Note: it is also possible (though tedious) to have a function throw several different kinds of exceptions. To process this will require a pcall, followed by a set of if statements checking the type of the error.

    All of this code assumes that your C++ code uses exception specification (which a lot doesn't). If it doesn't consult the " Exception handling with %catches" section and the " Exception handling with %exception" section, for more details on how to add exception specification to functions or globally (respectively).

    28.3.17 Namespaces

    Since SWIG-3.0.0 C++ namespaces are supported via the %nspace feature.

    Namespaces are mapped into Lua tables. Each of those tables contains names that were defined within appropriate namespace. Namespaces structure (a.k.a nested namespaces) is preserved. Consider the following C++ code:

    %module example
    %nspace MyWorld::Nested::Dweller;
    %nspace MyWorld::World;
    
    int module_function() { return 7; }
    int module_variable = 9;
    
    namespace MyWorld {
      class World {
      public:
        World() : world_max_count(9) {}
        int create_world() { return 17; }
        const int world_max_count; // = 9
      };
      namespace Nested {
        class Dweller {
          public:
            enum Gender { MALE = 0, FEMALE = 1 };
            static int count() { return 19; }
        };
      }
    }
    

    Now, from Lua usage is as follows:

    > print(example.module_function())
    7
    > print(example.module_variable)
    9
    > print(example.MyWorld.World():create_world())
    17
    > print(example.MyWorld.World.world_max_count)
    9
    > print(example.MyWorld.Nested.Dweller.MALE)
    0
    > print(example.MyWorld.Nested.Dweller.count())
    19
    >
    

    28.3.17.1 Compatibility Note

    If SWIG is running in a backwards compatible way, i.e. without the -no-old-metatable-bindings option, then additional old-style names are generated (notice the underscore):

    9
    > print(example.MyWorld.Nested.Dweller_MALE)
    0
    > print(example.MyWorld.Nested.Dweller_count())
    11
    >
    

    28.3.17.2 Names

    If SWIG is launched without -no-old-metatable-bindings option, then it enters backward-compatible mode. While in this mode, it tries to generate additional names for static functions, class static constants and class enums. Those names are in a form $classname_$symbolname and are added to the scope surrounding the class. If %nspace is enabled, then class namespace is taken as scope. If there is no namespace, or %nspace is disabled, then module is considered a class namespace.

    Consider the following C++ code

    %module example
    %nspace MyWorld::Test;
    namespace MyWorld {
    class Test {
      public:
      enum { TEST1 = 10, TEST2 }
      static const int ICONST = 12;
    };
    class Test2 {
      public:
      enum { TEST3 = 20, TEST4 }
      static const int ICONST2 = 23;
    }
    

    When in backward compatible mode, in addition to the usual names, the following ones will be generated (notice the underscore):

    9
    > print(example.MyWorld.Test_TEST1) -- Test has %nspace enabled
    10
    > print(example.MyWorld.Test_ICONST) -- Test has %nspace enabled
    12
    > print(example.Test2_TEST3) -- Test2 doesn't have %nspace enabled
    20
    > print(example.Test2_ICONST2) -- Test2 doesn't have %nspace enabled
    23
    >
    

    There is a slight difference with enums when in C mode. As per C standard, enums from C structures are exported to surrounding scope without any prefixing. Pretending that Test2 is a struct, not class, that would be:

    > print(example.TEST3) -- NOT Test2_TEST3
    20
    >
    

    28.3.17.3 Inheritance

    The internal organization of inheritance has changed. Consider the following C++ code:

    %module example
    class Base {
      public:
      int base_func()
    };
    class Derived : public Base {
      public:
      int derived_func()
    }
    

    Lets assume for a moment that class member functions are stored in .fn table. Previously, when classes were exported to Lua during module initialization, for every derived class all service tables ST(i.e. ".fn") were squashed and added to corresponding derived class ST: Everything from .fn table of class Base was copied to .fn table of class Derived and so on. This was a recursive procedure, so in the end the whole inheritance tree of derived class was squashed into derived class.

    That means that any changes done to class Base after module initialization wouldn't affect class Derived:

    base = example.Base()
    der = example.Derived()
    > print(base.base_func)
    function: 0x1367940
    > getmetatable(base)[".fn"].new_func = function (x) return x -- Adding new function to class Base (to class, not to an instance!)
    > print(base.new_func) -- Checking this function
    function
    > print(der.new_func) -- Wouldn't work. Derived doesn't check Base any more.
    nil
    >
    

    This behaviour was changed. Now unless -squash-bases option is provided, Derived store a list of it's bases and if some symbol is not found in it's own service tables then its bases are searched for it. Option -squash-bases will effectively return old behaviour.

    > print(der.new_func) -- Now it works
    function
    >
    

    28.4 Typemaps

    This section explains what typemaps are and how to use them. The default wrapping behaviour of SWIG is enough in most cases. However sometimes SWIG may need a little additional assistance to know which typemap to apply to provide the best wrapping. This section will be explaining how to use typemaps to best effect

    28.4.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Lua to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) lua_tonumber(L, $input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Note: you shouldn't use this typemap, as SWIG already has a typemap for this task. This is purely for example.

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input is the index on the Lua stack for the value to be used.

    When this example is compiled into a Lua module, it operates as follows:

    > require "example"
    > print(example.fact(6))
    Received an integer : 6
    720
    

    28.4.2 Using typemaps

    There are many ready written typemaps built into SWIG for all common types (int, float, short, long, char*, enum and more), which SWIG uses automatically, with no effort required on your part.

    However for more complex functions which use input/output parameters or arrays, you will need to make use of <typemaps.i>, which contains typemaps for these situations. For example, consider these functions:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    
    int sub(int *x1, int *y1) {
      return *x1-*y1;
    }
    
    void swap(int *sx, int *sy) {
      int t=*sx;
      *sx=*sy;
      *sy=t;
    }
    

    It is clear to the programmer, that 'result' is an output parameter, 'x1' and 'y1' are input parameters and 'sx' and 'sy' are input/output parameters. However is not apparent to SWIG, so SWIG must to informed about which kind they are, so it can wrapper accordingly.

    One means would be to rename the argument name to help SWIG, eg void add(int x, int y, int *OUTPUT), however it is easier to use the %apply to achieve the same result, as shown below.

    %include <typemaps.i>
    %apply int* OUTPUT {int *result}; // int *result is output
    %apply int* INPUT {int *x1, int *y1}; // int *x1 and int *y1 are input
    %apply int* INOUT {int *sx, int *sy}; // int *sx and int *sy are input and output
    
    void add(int x, int y, int *result);
    int sub(int *x1, int *y1);
    void swap(int *sx, int *sy);
    

    When wrapped, it gives the following results:

    > require "example"
    > print(example.add(1, 2))
    3
    > print(demo.sub(1, 2))
    -1
    > a, b=1, 2
    > c, d=demo.swap(a, b)
    > print(a, b, c, d)
    1       2       2       1
    

    Notice, that 'result' is not required in the arguments to call the function, as it an output parameter only. For 'sx' and 'sy' they must be passed in (as they are input), but the original value is not modified (Lua does not have a pass by reference feature). The modified results are then returned as two return values. All INPUT/OUTPUT/INOUT arguments will behave in a similar manner.

    Note: C++ references must be handled exactly the same way. However SWIG will automatically wrap a const int& as an input parameter (since that it obviously input).

    28.4.3 Typemaps and arrays

    Arrays present a challenge for SWIG, because like pointers SWIG does not know whether these are input or output values, nor does SWIG have any indication of how large an array should be. However with the proper guidance SWIG can easily wrapper arrays for convenient usage.

    Given the functions:

    extern void sort_int(int* arr, int len);
    extern void sort_double(double* arr, int len);
    

    There are basically two ways that SWIG can deal with this. The first way, uses the <carrays.i> library to create an array in C/C++ then this can be filled within Lua and passed into the function. It works, but it's a bit tedious. More details can be found in the carrays.i documentation.

    The second and more intuitive way, would be to pass a Lua table directly into the function, and have SWIG automatically convert between Lua-table and C-array. Within the <typemaps.i> file there are typemaps ready written to perform this task. To use them is again a matter of using %apply in the correct manner.

    The wrapper file below, shows both the use of carrays as well as the use of the typemap to wrap arrays.

    // using the C-array
    %include <carrays.i>
    // this declares a batch of function for manipulating C integer arrays
    %array_functions(int, int)
    
    extern void sort_int(int* arr, int len); // the function to wrap
    
    // using typemaps
    %include <typemaps.i>
    %apply (double *INOUT, int) {(double* arr, int len)};
    
    extern void sort_double(double* arr, int len); // the function to wrap
    

    Once wrapped, the functions can both be called, though with different ease of use:

    require "example"
    ARRAY_SIZE=10
    
    -- passing a C array to the sort_int()
    arr=example.new_int(ARRAY_SIZE) -- create the array
    for i=0, ARRAY_SIZE-1 do -- index 0..9 (just like C)
        example.int_setitem(arr, i, math.random(1000))
    end
    example.sort_int(arr, ARRAY_SIZE)  -- call the function
    example.delete_int(arr) -- must delete the allocated memory
    
    -- use a typemap to call with a Lua-table
    -- one item of note: the typemap creates a copy, rather than edit-in-place
    t={} -- a Lua table
    for i=1, ARRAY_SIZE do -- index 1..10 (Lua style)
        t[i]=math.random(1000)/10
    end
    t=example.sort_double(t) -- replace t with the result
    

    Obviously the first version could be made less tedious by writing a Lua function to perform the conversion from a table to a C-array. The %luacode directive is good for this. See SWIG\Examples\lua\arrays for an example of this.

    Warning: in C indexes start at ZERO, in Lua indexes start at ONE. SWIG expects C-arrays to be filled for 0..N-1 and Lua tables to be 1..N, (the indexing follows the norm for the language). In the typemap when it converts the table to an array it quietly changes the indexing accordingly. Take note of this behaviour if you have a C function which returns indexes.

    Note: SWIG also can support arrays of pointers in a similar manner.

    28.4.4 Typemaps and pointer-pointer functions

    Several C++ libraries use a pointer-pointer functions to create its objects. These functions require a pointer to a pointer which is then filled with the pointer to the new object. Microsoft's COM and DirectX as well as many other libraries have this kind of function. An example is given below:

    struct iMath;    // some structure
    int Create_Math(iMath** pptr); // its creator (assume it mallocs)
    

    Which would be used with the following C code:

    iMath* ptr;
    int ok;
    ok=Create_Math(&ptr);
    // do things with ptr
    //...
    free(ptr); // dispose of iMath
    

    SWIG has a ready written typemap to deal with such a kind of function in <typemaps.i>. It provides the correct wrapping as well as setting the flag to inform Lua that the object in question should be garbage collected. Therefore the code is simply:

    %include <typemaps.i>
    %apply SWIGTYPE** OUTPUT{iMath **pptr }; // tell SWIG it's an output
    
    struct iMath;    // some structure
    int Create_Math(iMath** pptr); // its creator (assume it mallocs)
    

    The usage is as follows:

    ok, ptr=Create_Math() -- ptr is an iMath* which is returned with the int (ok)
    ptr=nil -- the iMath* will be GC'ed as normal
    

    28.5 Writing typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Lua C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that writing typemaps is rarely needed unless you want to change some aspect of the wrapping, or to achieve an effect which in not available with the default bindings.

    Before proceeding, you should read the previous section on using typemaps, and look at the existing typemaps found in luatypemaps.swg and typemaps.i. These are both well documented and fairly easy to read. You should not attempt to write your own typemaps until you have read and can understand both of these files (they may well also give you an idea to base your work on).

    28.5.1 Typemaps you can write

    There are many different types of typemap that can be written, the full list can be found in the "Typemaps" chapter. However the following are the most commonly used ones.

    • in this is for input arguments to functions
    • out this is for return types from functions
    • argout this is for a function argument which is actually returning something
    • typecheck this is used to determine which overloaded function should be called (the syntax for the typecheck is different from the typemap, see typemaps for details).

    28.5.2 SWIG's Lua-C API

    This section explains the SWIG specific Lua-C API. It does not cover the main Lua-C api, as this is well documented and not worth covering.

    int SWIG_ConvertPtr(lua_State* L, int index, void** ptr, swig_type_info *type, int flags);

    This is the standard function used for converting a Lua userdata to a void*. It takes the value at the given index in the Lua state and converts it to a userdata. It will then provide the necessary type checks, confirming that the pointer is compatible with the type given in 'type'. Then finally setting '*ptr' to the pointer. If flags is set to SWIG_POINTER_DISOWN, this is will clear any ownership flag set on the object.
    This returns a value which can be checked with the macro SWIG_IsOK()

    void SWIG_NewPointerObj(lua_State* L, void* ptr, swig_type_info *type, int own);

    This is the opposite of SWIG_ConvertPtr, as it pushes a new userdata which wrappers the pointer 'ptr' of type 'type'. The parameter 'own' specifies if the object is owned be Lua and if it is 1 then Lua will GC the object when the userdata is disposed of.

    void* SWIG_MustGetPtr(lua_State* L, int index, swig_type_info *type, int flags, int argnum, const char* func_name);

    This function is a version of SWIG_ConvertPtr(), except that it will either work, or it will trigger a lua_error() with a text error message. This function is rarely used, and may be deprecated in the future.

    SWIG_fail

    This macro, when called within the context of a SWIG wrapped function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then triggers a lua_error.
    A common use for this code is:
    if (!SWIG_IsOK(SWIG_ConvertPtr( .....)){
     lua_pushstring(L, "something bad happened");
     SWIG_fail;
    }

    SWIG_fail_arg(char* func_name, int argnum, char* type)

    This macro, when called within the context of a SWIG wrapped function, will display the error message and jump to the error handler code. The error message is of the form
    "Error in func_name (arg argnum), expected 'type' got 'whatever the type was'"
    

    SWIG_fail_ptr(const char* fn_name, int argnum, swig_type_info* type);

    Similar to SWIG_fail_arg, except that it will display the swig_type_info information instead.

    28.6 Customization of your Bindings

    This section covers adding of some small extra bits to your module to add the last finishing touches.

    28.6.1 Writing your own custom wrappers

    Sometimes, it may be necessary to add your own special functions, which bypass the normal SWIG wrapper method, and just use the native Lua API calls. These 'native' functions allow direct adding of your own code into the module. This is performed with the %native directive as follows:

    %native(my_func) int native_function(lua_State*L);  // registers native_function() with SWIG
    ...
    %{
    int native_function(lua_State*L) // my native code
    {
     ...
    }
    %}
    

    The %native directive in the above example, tells SWIG that there is a function int native_function(lua_State*L); which is to be added into the module under the name 'my_func'. SWIG will not add any wrapper for this function, beyond adding it into the function table. How you write your code is entirely up to you.

    28.6.2 Adding additional Lua code

    As well as adding additional C/C++ code, it's also possible to add your own Lua code to the module as well. This code is executed once all other initialisation, including the %init code has been called.

    The directive %luacode adds code into the module which is executed upon loading. Normally you would use this to add your own functions to the module. Though you could easily perform other tasks.

    %module example;
    
    %luacode {
      function example.greet() 
        print "hello world" 
      end
    
      print "Module loaded ok"
    }
    ...
    %}
    

    Notice that the code is not part of the module table. Therefore any references to the module must have the module name added.

    Should there be an error in the Lua code, this will not stop loading of the module. The default behaviour of SWIG is to print an error message to stderr and then continue. It is possible to change this behaviour by using a #define SWIG_DOSTRING_FAIL(STR) to define a different behaviour should the code fail.

    Good uses for this feature is adding of new code, or writing helper functions to simplify some of the code. See Examples/lua/arrays for an example of this code.

    28.7 Details on the Lua binding

    In the previous section, a high-level view of Lua wrapping was presented. Obviously a lot of stuff happens behind the scenes to make this happen. This section will explain some of the low-level details on how this is achieved.

    If you just want to use SWIG and don't care how it works, then stop reading here. This is going into the guts of the code and how it works. It's mainly for people who need to know what's going on within the code.

    28.7.1 Binding global data into the module.

    Assuming that you had some global data that you wanted to share between C and Lua. How does SWIG do it?

    %module example;
    extern double Foo;
    

    SWIG will effectively generate the pair of functions

    void Foo_set(double);
    double Foo_get();
    

    At initialisation time, it will then add to the interpreter a table called 'example', which represents the module. It will then add all its functions to the module. (Note: older versions of SWIG actually added the Foo_set() and Foo_get() functions, current implementation does not add these functions any more.) But it also adds a metatable to this table, which has two functions (__index and __newindex ) as well as two tables (.get and .set) The following Lua code will show these hidden features.

    > print(example)
    table: 003F8F90
    > m=getmetatable(example)
    > table.foreach(m, print)
    .set    table: 003F9088
    .get    table: 003F9038
    __index function: 003F8FE0
    __newindex      function: 003F8FF8
    > g=m['.get']
    > table.foreach(g, print)
    Foo     function: 003FAFD8
    >
    

    The .get and .set tables are lookups connecting the variable name 'Foo' to the accessor/mutator functions (Foo_set, Foo_get)

    The Lua equivalent of the code for the __index and __newindex looks a bit like this

    function __index(mod, name)
            local g=getmetatable(mod)['.get'] -- gets the table
            if not g then return nil end
            local f=g[name] -- looks for the function
            -- calls it & returns the value
            if type(f)=="function" then return f() end
            return nil
    end
    
    function __newindex(mod, name, value)
            local s=getmetatable(mod)['.set'] -- gets the table
            if not s then return end
            local f=s[name] -- looks for the function
            -- calls it to set the value
            if type(f)=="function" then f(value)
            else rawset(mod, name, value) end
    end
    

    That way when you call 'a=example.Foo', the interpreter looks at the table 'example' sees that there is no field 'Foo' and calls __index. This will in turn check in '.get' table and find the existence of 'Foo' and then return the value of the C function call 'Foo_get()'. Similarly for the code 'example.Foo=10', the interpreter will check the table, then call the __newindex which will then check the '.set' table and call the C function 'Foo_set(10)'.

    28.7.2 Userdata and Metatables

    As mentioned earlier, classes and structures, are all held as pointer, using the Lua 'userdata' structure. This structure is actually a pointer to a C structure 'swig_lua_userdata', which contains the pointer to the data, a pointer to the swig_type_info (an internal SWIG struct) and a flag which marks if the object is to be disposed of when the interpreter no longer needs it. The actual accessing of the object is done via the metatable attached to this userdata.

    The metatable is a Lua 5.0 feature (which is also why SWIG cannot wrap Lua 4.0). It's a table which holds a list of functions, operators and attributes. This is what gives the userdata the feeling that it is a real object and not just a hunk of memory.

    Given a class

    %module excpp;
    
    class Point
    {
    public:
     int x, y;
     Point(){x=y=0;}
     ~Point(){}
     virtual void Print(){printf("Point @%p (%d, %d)\n", this, x, y);}
    };
    

    SWIG will create a module excpp, with all the various functions inside. However to allow the intuitive use of the userdata, SWIG also creates up a set of metatables. As seen in the above section on global variables, use of the metatables allows for wrappers to be used intuitively. To save effort, the code creates one metatable per class and stores it inside Lua's registry. Then when a new object is instantiated, the metatable is found in the registry and the userdata associated with the metatable. Currently, derived classes make a complete copy of the base class' table and then add on their own additional functions.

    Some of the internals can be seen by looking at the metatable of a class:

    > p=excpp.Point()
    > print(p)
    userdata: 003FDB28
    > m=getmetatable(p)
    > table.foreach(m, print)
    .type   Point
    __gc    function: 003FB6C8
    __newindex      function: 003FB6B0
    __index function: 003FB698
    .get    table: 003FB4D8
    .set    table: 003FB500
    .fn     table: 003FB528
    

    The '.type' attribute is the name of the class. The '.get' and '.set' tables work in a similar manner to the modules, the main difference is the '.fn' table which also holds all the member functions. (The '__gc' function is the class' destructor function)

    The Lua equivalent of the code for enabling functions looks a little like this

    function __index(obj, name)
            local m=getmetatable(obj) -- gets the metatable
            if not m then return nil end
            local g=m['.get'] -- gets the attribute table
            if not g then return nil end
            local f=g[name] -- looks for the get_attribute function
            -- calls it & returns the value
            if type(f)=="function" then return f() end
            -- ok, so it not an attribute, maybe it's a function
            local fn=m['.fn'] -- gets the function table
            if not fn then return nil end
            local f=fn[name] -- looks for the function
            -- if found the fn then return the function
            -- so the interpreter can call it
            if type(f)=="function" then return f end
            return nil
    end
    

    So when 'p:Print()' is called, the __index looks on the object metatable for a 'Print' attribute, then looks for a 'Print' function. When it finds the function, it returns the function, and then interpreter can call 'Point_Print(p)'

    In theory, you can play with this usertable & add new features, but remember that it is a shared table between all instances of one class, and you could very easily corrupt the functions in all the instances.

    Note: Both the opaque structures (like the FILE*) and normal wrapped classes/structs use the same 'swig_lua_userdata' structure. Though the opaque structures has do not have a metatable attached, or any information on how to dispose of them when the interpreter has finished with them.

    Note: Operator overloads are basically done in the same way, by adding functions such as '__add' & '__call' to the class' metatable. The current implementation is a bit rough as it will add any member function beginning with '__' into the metatable too, assuming its an operator overload.

    28.7.3 Memory management

    Lua is very helpful with the memory management. The 'swig_lua_userdata' is fully managed by the interpreter itself. This means that neither the C code nor the Lua code can damage it. Once a piece of userdata has no references to it, it is not instantly collected, but will be collected when Lua deems is necessary. (You can force collection by calling the Lua function collectgarbage() ). Once the userdata is about to be free'ed, the interpreter will check the userdata for a metatable and for a function '__gc'. If this exists this is called. For all complete types (ie normal wrapped classes & structs) this should exist. The '__gc' function will check the 'swig_lua_userdata' to check for the 'own' field and if this is true (which is will be for all owned data) it will then call the destructor on the pointer.

    It is currently not recommended to edit this field or add some user code, to change the behaviour. Though for those who wish to try, here is where to look.

    It is also currently not possible to change the ownership flag on the data (unlike most other scripting languages, Lua does not permit access to the data from within the interpreter).


    29 SWIG and Modula-3

    This chapter describes SWIG's support for Modula-3. You should be familiar with the basics of SWIG, especially typemaps.

    29.1 Overview

    Modula-3 is a compiled language in the tradition of Niklaus Wirth's Modula 2, which is in turn a successor to Pascal.

    SWIG's Modula-3 support is currently very basic and highly experimental! Many features are still not designed satisfyingly and I need more discussion about the odds and ends. Don't rely on any feature, incompatible changes are likely in the future! However, the Modula-3 generator was already useful for interfacing to the libraries:

    1. PLPlot
    2. FFTW

    29.1.1 Motivation

    Although it is possible to write Modula-3 code that performs as well as C/C++ most existing libraries are not written in Modula-3 but in C or C++, and even libraries in other languages may provide C header files.

    Fortunately Modula-3 can call C functions, but you have to write Modula-3 interfaces to them, and to make things comfortable you will also need wrappers that convert between high-level features of Modula-3 (garbage collecting, exceptions) and the explicit tracking of allocated memory and exception codes used by C APIs.

    SWIG converts C headers to Modula-3 interfaces for you, and using typemaps you can pass TEXTs or open arrays, and convert error return codes into exceptions.

    If the library API is ill designed writing appropriate typemaps can still be time-consuming. E.g. C programmers are very creative to work-around missing data types like (real) enumerations and sets. You should turn such work-arounds back to the Modula-3 way otherwise you lose static safety and consistency.

    Without SWIG you would probably never consider trying to call C++ libraries from Modula-3, but with SWIG this is becomes feasible. SWIG can generate C wrappers to C++ functions and object methods that may throw exceptions, and then wrap these C wrappers for Modula-3. To make it complete you can then hide the C interface with Modula-3 classes and exceptions.

    SWIG allows you to call C and C++ libraries from Modula-3 (even with call back functions), but it doesn't allow you to easily integrate a Modula-3 module into a C/C++ project.

    29.2 Conception

    29.2.1 Interfaces to C libraries

    Modula-3 has integrated support for calling C functions. This is also extensively used by the standard Modula-3 libraries to call OS functions. The Modula-3 part of SWIG and the corresponding SWIG library modula3.swg contain code that uses these features. Because of the built-in support there is no need for calling the SWIG kernel to generate wrappers written in C. All conversion and argument checking can be done in Modula-3 and the interfacing is quite efficient. All you have to do is to write pieces of Modula-3 code that SWIG puts together.

    C library support integrated in Modula-3
    Pragma <* EXTERNAL *>Precedes a declaration of a PROCEDURE that is implemented in an external library instead of a Modula-3 module.
    Pragma <* CALLBACK *>Precedes a declaration of a PROCEDURE that should be called by external library code.
    Module CtypesContains Modula-3 types that match some basic C types.
    Module M3toCContains routines that convert between Modula-3's TEXT type and C's char * type.

    In each run of SWIG the Modula-3 part generates several files:

    Module name schemeIdentifier for %insert Description
    ModuleRaw.i3m3rawintf Declaration of types that are equivalent to those of the C library, EXTERNAL procedures as interface to the C library functions
    ModuleRaw.m3m3rawimplAlmost empty.
    Module.i3m3wrapintf Declaration of comfortable wrappers to the C library functions.
    Module.m3m3wrapimpl Implementation of the wrappers that convert between Modula-3 and C types, check for validity of values, hand-over resource management to the garbage collector using WeakRefs and raises exceptions.
    m3makefilem3makefileAdd the modules above to the Modula-3 project and specify the name of the Modula-3 wrapper library to be generated. Today I'm not sure if it is a good idea to create a m3makefile in each run, because SWIG must be started for each Modula-3 module it creates. Thus the m3makefile is overwritten each time. :-(

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    |
    v
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C library

    I have still no good conception how one can split C library interfaces into type oriented interfaces. A Module in Modula-3 represents an Abstract DataType (or call it a static classes, i.e. a class without virtual methods). E.g. if you have a principal type, say Database, it is good Modula-3 style to set up one Module with the name Database where the database type is declared with the name T and where all functions are declared that operates on it.

    The normal operation of SWIG is to generate a fixed set of files per call. To generate multiple modules one has to write one SWIG interface (different SWIG interfaces can share common data) per module. Identifiers belonging to a different module may ignored (%ignore ) and the principal type must be renamed (%typemap).

    29.2.2 Interfaces to C++ libraries

    Interfaces to C++ files are much more complicated and there are some more design decisions that are not made, yet. Modula-3 has no support for C++ functions but C++ compilers should support generating C++ functions with a C interface.

    Here's a scheme of how the function calls to Modula-3 wrappers are redirected to C library functions:

    Modula-3 wrapper
    Module.i3
    generated by Modula-3 part of SWIG
    C++ library
    |
    v
    ^
    |
    Modula-3 interface to C
    ModuleRaw.i3
    generated by Modula-3 part of SWIG
    --> C interface to C++
    module_wrap.cxx
    generated by the SWIG core

    Wrapping C++ libraries arises additional problems:

    • Is it sensible to wrap C++ classes with Modula-3 classes?
    • How to find the wrapping Modula-3 class for a class pointer that is returned by a C++ routine?
    • How to deal with multiple inheritance which was neglected for Modula-3 for good reasons?
    • Is it possible to sub-class C++ classes with Modula-3 code? This issue is addressed by directors, a feature that was experimentally added to some Language modules like Java and Python.
    • How to manage storage with the garbage collector of Modula-3? Support for %newobject and %typemap(newfree) isn't implemented, yet. What's about resources that are managed by the garbage collector but shall be passed back to the storage management of the C++ library? This is a general issue which is not solved in a satisfying fashion as far as I know.
    • How to turn C++ exceptions into Modula-3 exceptions? There's also no support for %exception , yet.

    Be warned: There is no C++ library I wrote a SWIG interface for, so I'm not sure if this is possible or sensible, yet.

    29.3 Preliminaries

    29.3.1 Compilers

    There are different Modula-3 compilers around: cm3, pm3, ezm3, Klagenfurth Modula-3, Cambridge Modula-3. SWIG itself does not contain compiler specific code but the modula3.swg library file may do so. For testing examples I use Critical Mass cm3.

    29.3.2 Additional Commandline Options

    There are some experimental command line options that prevent SWIG from generating interface files. Instead files are emitted that may assist you when writing SWIG interface files.

    Modula-3 specific optionsDescription
    -generateconst <file> Disable generation of interfaces and wrappers. Instead write code for computing numeric values of constants to the specified file.
    C code may contain several constant definitions written as preprocessor macros. Other language modules of SWIG use compute-once-use-readonly variables or functions to wrap such definitions. All of them can invoke C code dynamically for computing the macro values. But if one wants to turn them into Modula-3 integer constants, enumerations or set types, the values of these expressions has to be known statically. Although definitions like (1 << FLAG_MAXIMIZEWINDOW) must be considered as good C style they are hard to convert to Modula-3 since the value computation can use every feature of C.
    Thus I implemented these switch to extract all constant definitions and write a C program that output the values of them. It works for numeric constants only and treats all of them as double. Future versions may generate a C++ program that can detect the type of the macros by overloaded output functions. Then strings can also be processed.
    -generaterename <file> Disable generation of interfaces and wrappers. Instead generate suggestions for %rename.
    C libraries use a naming style that is neither homogeneous nor similar to that of Modula-3. C function names often contain a prefix denoting the library and some name components separated by underscores or capitalization changes. To get library interfaces that are really Modula-3 like you should rename the function names with the %rename directive. This switch outputs a list of such directives with a name suggestion generated by a simple heuristic.
    -generatetypemap <file> Disable generation of interfaces and wrappers. Instead generate templates for some basic typemaps.

    29.4 Modula-3 typemaps

    29.4.1 Inputs and outputs

    Each C procedure has a bunch of inputs and outputs. Inputs are passed as function arguments, outputs are updated referential arguments and the function value.

    Each C type can have several typemaps that apply only in case if a type is used for an input argument, for an output argument, or for a return value. A further typemap may specify the direction that is used for certain parameters. I have chosen this separation in order to be able to write general typemaps for the modula3.swg typemap library. In the library code the final usage of the type is not known. Using separate typemaps for each possible use allows appropriate definitions for each case. If these pre-definitions are fine then the direction of the function parameter is the only hint the user must give.

    The typemaps specific to Modula-3 have a common name scheme: A typemap name starts with "m3", followed by "raw" or "wrap" depending on whether it controls the generation of the ModuleRaw.i3 or the Module.i3, respectively. It follows an "in" for typemaps applied to input argument, "out" for output arguments, "arg" for all kind of arguments, "ret" for returned values.

    The main task of SWIG is to build wrapper function, i.e. functions that convert values between C and Modula-3 and call the corresponding C function. Modula-3 wrapper functions generated by SWIG consist of the following parts:

    • Generate PROCEDURE signature.
    • Declare local variables.
    • Convert input values from Modula-3 to C.
    • Check for input value integrity.
    • Call the C function.
    • Check returned values, e.g. error codes.
    • Convert and write back values into Modula-3 records.
    • Free temporary storage.
    • Return values.
    TypemapExampleDescription
    m3wrapargvar$1: INTEGER := $1_name; Declaration of some variables needed for temporary results.
    m3wrapargconst$1 = "$1_name"; Declaration of some constant, maybe for debug purposes.
    m3wrapargrawORD($1_name) The expression that should be passed as argument to the raw Modula-3 interface function.
    m3wrapargdirout Referential arguments can be used for input, output, update. ???
    m3wrapinmodeREADONLY One of Modula-3 parameter modes VALUE (or empty), VAR, READONLY
    m3wrapinname New name of the input argument.
    m3wrapintype Modula-3 type of the input argument.
    m3wrapindefault Default value of the input argument
    m3wrapinconv$1 := M3toC.SharedTtoS($1_name); Statement for converting the Modula-3 input value to C compliant value.
    m3wrapincheckIF Text.Length($1_name) > 10 THEN RAISE E("str too long"); END; Check the integrity of the input value.
    m3wrapoutname Name of the RECORD field to be used for returning multiple values. This applies to referential output arguments that shall be turned into return values.
    m3wrapouttype Type of the value that is returned instead of a referential output argument.
    m3wrapoutconv
    m3wrapoutcheck
    m3wrapretraw
    m3wrapretname
    m3wraprettype
    m3wrapretvar
    m3wrapretconv
    m3wrapretcheck
    m3wrapfreeargM3toC.FreeSharedS(str, arg1); Free resources that were temporarily used in the wrapper. Since this step should never be skipped, SWIG will put it in the FINALLY branch of a TRY .. FINALLY structure.

    29.4.2 Subranges, Enumerations, Sets

    Subranges, enumerations, and sets are machine oriented types that make Modula very strong and expressive compared with the type systems of many other languages.

    • Subranges are used for statically restricted choices of integers.
    • Enumerations are used for named choices.
    • Sets are commonly used for flag (option) sets.

    Using them extensively makes Modula code very safe and readable.

    C supports enumerations, too, but they are not as safe as the ones of Modula. Thus they are abused for many things: For named choices, for integer constant definitions, for sets. To make it complete every way of defining a value in C (#define, const int, enum) is somewhere used for defining something that must be handled completely different in Modula-3 (INTEGER, enumeration, SET).

    I played around with several %features and %pragma s that split the task up into converting the C bit patterns (integer or bit set) into Modula-3 bit patterns (integer or bit set) and change the type as requested. See the corresponding example in the Examples/modula3/enum/example.i file. This is quite messy and not satisfying. So the best what you can currently do is to rewrite constant definitions manually. Though this is a tedious work that I'd like to automate.

    29.4.3 Objects

    Declarations of C++ classes are mapped to OBJECT types while it is tried to retain the access hierarchy "public - protected - private" using partial revelation. Though the example in Examples/modula3/class/example.i is not really useful, yet.

    29.4.4 Imports

    Pieces of Modula-3 code provided by typemaps may contain identifiers from foreign modules. If the typemap m3wrapinconv for blah * contains code using the function M3toC.SharedTtoS you may declare %typemap("m3wrapinconv:import") blah * %{M3toC%}. Then the module M3toC is imported if the m3wrapinconv typemap for blah * is used at least once. Use %typemap("m3wrapinconv:import") blah * %{MyConversions AS M3toC%} if you need module renaming. Unqualified import is not supported.

    It is cumbersome to add this typemap to each piece of Modula-3 code. It is especially useful when writing general typemaps for the modula3.swg typemap library. For a monolithic module you might be better off if you add the imports directly:

    %insert(m3rawintf) %{
    IMPORT M3toC;
    %}
    

    29.4.5 Exceptions

    Modula-3 provides another possibility of an output of a function: exceptions.

    Any piece of Modula-3 code that SWIG inserts due to a typemap can raise an exception. This way you can also convert an error code from a C function into a Modula-3 exception.

    The RAISES clause is controlled by typemaps with the throws extension. If the typemap m3wrapinconv for blah * contains code that may raise the exceptions OSError.E you should declare %typemap("m3wrapinconv:throws") blah * %{OSError.E%}.

    29.4.6 Example

    The generation of wrappers in Modula-3 needs very fine control to take advantage of the language features. Here is an example of a generated wrapper where almost everything is generated by a typemap:

             (* %relabel  m3wrapinmode m3wrapinname m3wrapintype  m3wrapindefault *)
      PROCEDURE Name     (READONLY       str       :    TEXT    :=      ""       )
                  (* m3wrapoutcheck:throws *)
         : NameResult RAISES {E} =
        CONST
          arg1name = "str";                  (* m3wrapargconst *)
        VAR
          arg0   : C.char_star;              (* m3wrapretvar *)
          arg1   : C.char_star;              (* m3wrapargvar *)
          arg2   : C.int;
          result : RECORD
               (*m3wrapretname  m3wraprettype*)
                     unixPath : TEXT;
               (*m3wrapoutname  m3wrapouttype*)
                     checksum : CARDINAL;
                   END;
        BEGIN
          TRY
            arg1 := M3toC.SharedTtoS(str);   (* m3wrapinconv *)
            IF Text.Length(arg1) > 10 THEN   (* m3wrapincheck *)
              RAISE E("str too long");
            END;
     (* m3wrapretraw           m3wrapargraw *)
            arg0 := MessyToUnix  (arg1,   arg2);
            result.unixPath := M3toC.CopyStoT(arg0);  (* m3wrapretconv *)
            result.checksum := arg2;         (* m3wrapoutconv *)
            IF result.checksum = 0 THEN      (* m3wrapoutcheck *)
              RAISE E("invalid checksum");
            END;
          FINALLY
            M3toC.FreeSharedS(str, arg1);     (* m3wrapfreearg *)
          END;
        END Name;
    

    29.5 More hints to the generator

    29.5.1 Features

    FeatureExampleDescription
    multiretval%m3multiretval get_box; or %feature("modula3:multiretval") get_box;Let the denoted function return a RECORD rather than a plain value. This RECORD contains all arguments with "out" direction including the return value of the C function (if there is one). If more than one argument is "out" then the function must have the multiretval feature activated, but it is explicitly requested from the user to prevent mistakes.
    constnumeric%constnumeric(12) twelve; or %feature("constnumeric", "12") twelve;This feature can be used to tell Modula-3's back-end of SWIG the value of an identifier. This is necessary in the cases where it was defined by a non-trivial C expression. This feature is used by the -generateconst option. In future it may be generalized to other kind of values such as strings.

    29.5.2 Pragmas

    PragmaExampleDescription
    unsafe%pragma(modula3) unsafe="true"; Mark the raw interface modules as UNSAFE. This will be necessary in many cases.
    library%pragma(modula3) library="m3fftw"; Specifies the library name for the wrapper library to be created. It should be distinct from the name of the library to be wrapped.

    29.6 Remarks

    • The Modula-3 part of SWIG doesn't try to generate nicely formatted code. If you need to read the generated code, use m3pp to postprocess the Modula files.

    30 SWIG and MzScheme/Racket

    This section contains information on SWIG's support of Racket, formally known as MzScheme.

    30.1 Creating native structures

    Example interface file:

    /* define a macro for the struct creation */
    %define handle_ptr(TYPE, NAME)
    %typemap(argout) TYPE *NAME{
      Scheme_Object *o = SWIG_NewStructFromPtr($1, $*1_mangle);
      SWIG_APPEND_VALUE(o);
    }
    
    %typemap(in, numinputs=0) TYPE *NAME (TYPE temp) {
      $1 = &temp;
    }
    %enddef
    
    /* setup the typemaps for the pointer to an output parameter cntrs */
    handle_ptr(struct diag_cntrs, cntrs);
    

    Then in scheme, you can use regular struct access procedures like

            ; suppose a function created a struct foo as
            ; (define foo (make-diag-cntrs (#x1 #x2 #x3) (make-inspector))
            ; Then you can do
            (format "0x~x" (diag-cntrs-field1 foo))
            (format "0x~x" (diag-cntrs-field2 foo))
            ;etc...
    

    30.2 Simple example

    A few examples are available in the Examples/mzscheme directory. The code and log of a session using SWIG below should help getting started.

    C header file:

    // example.h
    int fact(int n);
    

    C source code:

    // File: example.c
    #include "example.h"
    
    int fact(int n) {
      if (n < 0) { /* This should probably return an error, but this is simpler */
        return 0;
      }
      if (n == 0) {
        return 1;
      }
      else {
        /* testing for overflow would be a good idea here */
        return n * fact(n-1);
      }
    }
    

    SWIG interface file:

    /* File: example.i */
    %module example
    
    %{
    #include "example.h"
    %}
    
    int fact(int n);
    

    The session below using the above files is on an OS X machine, but the points to be made are more general. On OS X, libtool is the tool which creates libraries, which are named .dylib, rather than .so on other unixes, or .dll on Windows.

    % swig -mzscheme -declaremodule example.i
    % gcc -c -m32 -o example.o example.c # force 32-bit object file (mzscheme is 32-bit only)
    % libtool -dynamic -o libexample.dylib example.o # make it into a library
    % ls # what've we got so far?
    example.c example.o
    example.h example_wrap.c
    example.i libexample.dylib*
    % mzc --cgc --cc example_wrap.c # compile the wrapping code
    % LDFLAGS="-L. -lexample" mzc --ld example_wrap.dylib example_wrap.o # ...and link it
    % mzscheme -e '(path->string (build-path "compiled" "native" (system-library-subpath)))'
    "compiled/native/i386-macosx/3m"
    % mkdir -p compiled/native/i386-macosx/3m # move the extension library to a magic place
    % mv example_wrap.dylib compiled/native/i386-macosx/3m/example_ss.dylib
    % mzscheme
    Welcome to MzScheme v4.2.4 [3m], Copyright (c) 2004-2010 PLT Scheme Inc.
    > (require "example.ss")
    > (fact 5)
    120
    > ^D
    % echo 'It works!'
    

    Some points of interest:

    • This is on a 64-bit machine, so we have to include the -m32 option when building the object file
    • If you want to declare a scheme module (and you probably do), it's important that you include the -declaremodule option to swig (if you miss this out, it'll appear to work, but fail later).
    • Use mzc to compile and then link the wrapped code. You'll probably need to adjust the link flags to refer to the library you're wrapping (you can either do this with an LDFLAGS declaration, as here, or with multiple ++ldf options to mzc).
    • Create the directory with path (build-path "compiled" "native" (system-library-subpath)) and move the freshly-generated .dylib to there, changing its name to module-name_ss.dylib. After that, you can REQUIRE the new module with (require "module-name.ss").
    • The above requests mzc to create an extension using the CGC garbage-collector. The alternative -- the 3m collector -- has generally better performance, but work is still required for SWIG to emit code which is compatible with it.

    30.3 External documentation

    See the C API for more description of using the mechanism for adding extensions. The main documentation is here.

    Tip: mzc's --vv option is very useful for debugging the inevitable library problems you'll encounter.


    31 SWIG and Ocaml

    This chapter describes SWIG's support of Ocaml.

    Ocaml is a relatively recent addition to the ML family, and is a recent addition to SWIG. It's the second compiled, typed language to be added. Ocaml has widely acknowledged benefits for engineers, mostly derived from a sophisticated type system, compile-time checking which eliminates several classes of common programming errors, and good native performance. While all of this is wonderful, there are well-written C and C++ libraries that Ocaml users will want to take advantage of as part of their arsenal (such as SSL and gdbm), as well as their own mature C and C++ code. SWIG allows this code to be used in a natural, type-safe way with Ocaml, by providing the necessary, but repetitive glue code which creates and uses Ocaml values to communicate with C and C++ code. In addition, SWIG also produces the needed Ocaml source that binds variants, functions, classes, etc.

    If you're not familiar with the Objective Caml language, you can visit The Ocaml Website.

    31.1 Preliminaries

    SWIG 3.0 works with Ocaml 3.08.3 and above. Given the choice, you should use the latest stable release. The SWIG Ocaml module has been tested on Linux (x86, PPC, Sparc) and Cygwin on Windows. The best way to determine whether your system will work is to compile the examples and test-suite which come with SWIG. You can do this by running make check from the SWIG root directory after installing SWIG. The Ocaml module has been tested using the system's dynamic linking (the usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's Dl package. The ocaml_dynamic and ocaml_dynamic_cpp targets in the file Examples/Makefile illustrate how to compile and link SWIG modules that will be loaded dynamically. This has only been tested on Linux so far.

    31.1.1 Running SWIG

    The basics of getting a SWIG Ocaml module up and running can be seen from one of SWIG's example Makefiles, but is also described here. To build an Ocaml module, run SWIG using the -ocaml option.

    %swig -ocaml example.i
    

    This will produce 3 files. The file example_wrap.c contains all of the C code needed to build an Ocaml module. To build the module, you will compile the file example_wrap.c with ocamlc or ocamlopt to create the needed .o file. You will need to compile the resulting .ml and .mli files as well, and do the final link with -custom (not needed for native link).

    31.1.2 Compiling the code

    The OCaml SWIG module now requires you to compile a module (Swig ) separately. In addition to aggregating common SWIG functionality, the Swig module contains the data structure that represents C/C++ values. This allows easier data sharing between modules if two or more are combined, because the type of each SWIG'ed module's c_obj is derived from Swig.c_obj_t. This also allows SWIG to acquire new conversions painlessly, as well as giving the user more freedom with respect to custom typing. Use ocamlc or ocamlopt to compile your SWIG interface like:

    % swig -ocaml -co swig.mli ; swig -ocaml co swig.ml
    % ocamlc -c swig.mli ; ocamlc -c swig.ml
    % ocamlc -c -ccopt "-I/usr/include/foo" example_wrap.c
    % ocamlc -c example.mli
    % ocamlc -c example.ml
    

    ocamlc is aware of .c files and knows how to handle them. Unfortunately, it does not know about .cxx, .cc, or .cpp files, so when SWIG is invoked in C++ mode, you must:

    % cp example_wrap.cxx example_wrap.cxx.c
    % ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c
    % ...
    

    31.1.3 The camlp4 module

    The camlp4 module (swigp4.ml -> swigp4.cmo) contains a simple rewriter which makes C++ code blend more seamlessly with objective caml code. Its use is optional, but encouraged. The source file is included in the Lib/ocaml directory of the SWIG source distribution. You can checkout this file with "swig -ocaml -co swigp4.ml". You should compile the file with "ocamlc -I `camlp4 -where` -pp 'camlp4o pa_extend.cmo q_MLast.cmo' -c swigp4.ml"

    The basic principle of the module is to recognize certain non-caml expressions and convert them for use with C++ code as interfaced by SWIG. The camlp4 module is written to work with generated SWIG interfaces, and probably isn't great to use with anything else.

    Here are the main rewriting rules:

    InputRewritten to
    f'( ... ) as in
    atoi'("0") or
    _exit'(0)
    f(C_list [ ... ]) as in
    atoi (C_list [ C_string "0" ]) or
    _exit (C_list [ C_int 0 ])
    object -> method ( ... )(invoke object) "method" (C_list [ ... ])
    object 'binop argument as in
    a '+= b
    (invoke object) "+=" argument as in
    (invoke a) "+=" b
    Note that because camlp4 always recognizes << and >>, they are replaced by lsl and lsr in operator names.
    'unop object as in
    '! a
    (invoke a) "!" C_void
    Smart pointer access like this
    object '-> method ( args )
    (invoke (invoke object "->" C_void))
    Invoke syntax
    object . '( ... )
    (invoke object) "()" (C_list [ ... ])
    Array syntax
    object '[ 10 ]
    (invoke object) "[]" (C_int 10)
    Assignment syntax
    let a = '10 and b = '"foo" and c = '1.0 and d = 'true
    let a = C_int 10 and b = C_string "foo" and c = C_double 1.0 and d = C_bool true
    Cast syntax
    let a = _atoi '("2") as int
    let b = (getenv "PATH") to string
    This works for int, string, float, bool
    let a = get_int (_atoi (C_string "2"))
    let b = C_string (getenv "PATH")

    31.1.4 Using your module

    You can test-drive your module by building a toplevel ocaml interpreter. Consult the ocaml manual for details.

    When linking any ocaml bytecode with your module, use the -custom option to build your functions into the primitive list. This option is not needed when you build native code.

    31.1.5 Compilation problems and compiling with C++

    As mentioned above, .cxx files need special handling to be compiled with ocamlc. Other than that, C code that uses class as a non-keyword, and C code that is too liberal with pointer types may not compile under the C++ compiler. Most code meant to be compiled as C++ will not have problems.

    31.2 The low-level Ocaml/C interface

    In order to provide access to overloaded functions, and provide sensible outputs from them, all C entities are represented as members of the c_obj type:

    In the code as seen by the typemap writer, there is a value, swig_result, that always contains the current return data. It is a list, and must be appended with the caml_list_append function, or with functions and macros provided by objective caml.

    type c_obj =
        C_void
      | C_bool of bool
      | C_char of char
      | C_uchar of char
      | C_short of int
      | C_ushort of int
      | C_int of int
      | C_uint of int32
      | C_int32 of int32
      | C_int64 of int64
      | C_float of float
      | C_double of float
      | C_ptr of int64 * int64
      | C_array of c_obj array
      | C_list of c_obj list
      | C_obj of (string -> c_obj -> c_obj)
      | C_string of string
      | C_enum of c_enum_t
    

    A few functions exist which generate and return these:

    • caml_ptr_val receives a c_obj and returns a void *. This should be used for all pointer purposes.
    • caml_long_val receives a c_obj and returns a long. This should be used for most integral purposes.
    • caml_val_ptr receives a void * and returns a c_obj.
    • caml_val_bool receives a C int and returns a c_obj representing its bool value.
    • caml_val_(u)?(char|short|int|long|float|double) receives an appropriate C value and returns a c_obj representing it.
    • caml_val_string receives a char * and returns a string value.
    • caml_val_string_len receives a char * and a length and returns a string value.
    • caml_val_obj receives a void * and an object type and returns a C_obj, which contains a closure giving method access.

    Because of this style, a typemap can return any kind of value it wants from a function. This enables out typemaps and inout typemaps to work well. The one thing to remember about outputting values is that you must append them to the return list with swig_result = caml_list_append(swig_result, v).

    This function will return a new list that has your element appended. Upon return to caml space, the fnhelper function beautifies the result. A list containing a single item degrades to only that item (i.e. [ C_int 3 ] -> C_int 3), and a list containing more than one item is wrapped in C_list (i.e. [ C_char 'a' ; C_char 'b' -> C_list [ C_char 'a' ; C_char b ]). This is in order to make return values easier to handle when functions have only one return value, such as constructors, and operators. In addition, string, pointer, and object values are interchangeable with respect to caml_ptr_val, so you can allocate memory as caml strings and still use the resulting pointers for C purposes, even using them to construct simple objects on. Note, though, that foreign C++ code does not respect the garbage collector, although the SWIG interface does.

    The wild card type that you can use in lots of different ways is C_obj. It allows you to wrap any type of thing you like as an object using the same mechanism that the ocaml module does. When evaluated in caml_ptr_val, the returned value is the result of a call to the object's "&" operator, taken as a pointer.

    You should only construct values using objective caml, or using the functions caml_val_* functions provided as static functions to a SWIG ocaml module, as well as the caml_list_* functions. These functions provide everything a typemap needs to produce values. In addition, value items pass through directly, but you must make your own type signature for a function that uses value in this way.

    31.2.1 The generated module

    The SWIG %module directive specifies the name of the Ocaml module to be generated. If you specified `%module example', then your Ocaml code will be accessible in the module Example. The module name is always capitalized as is the ocaml convention. Note that you must not use any Ocaml keyword to name your module. Remember that the keywords are not the same as the C++ ones.

    You can introduce extra code into the output wherever you like with SWIG. These are the places you can introduce code:

    "header"This code is inserted near the beginning of the C wrapper file, before any function definitions.
    "wrapper"This code is inserted in the function definition section.
    "runtime"This code is inserted near the end of the C wrapper file.
    "mli"This code is inserted into the caml interface file. Special signatures should be inserted here.
    "ml"This code is inserted in the caml code defining the interface to your C code. Special caml code, as well as any initialization which should run when the module is loaded may be inserted here.
    "classtemplate"The "classtemplate" place is special because it describes the output SWIG will generate for class definitions.

    31.2.2 Enums

    SWIG will wrap enumerations as polymorphic variants in the output Ocaml code, as above in C_enum. In order to support all C++-style uses of enums, the function int_to_enum and enum_to_int are provided for ocaml code to produce and consume these values as integers. Other than that, correct uses of enums will not have a problem. Since enum labels may overlap between enums, the enum_to_int and int_to_enum functions take an enum type label as an argument. Example:

    %module enum_test
    %{
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    %}
    enum c_enum_type { a = 1, b, c = 4, d = 8 };
    

    The output mli contains:

    type c_enum_type = [
      `unknown
    | `c_enum_type
    ]
    type c_enum_tag = [
      `int of int
    | `a
    | `b
    | `c
    | `d
    ]
    val int_to_enum c_enum_type -> int -> c_obj
    val enum_to_int c_enum_type -> c_obj -> c_obj
    

    So it's possible to do this:

    bash-2.05a$ ocamlmktop -custom enum_test_wrap.o enum_test.cmo -o enum_test_top
    bash-2.05a$ ./enum_test_top
            Objective Caml version 3.04
    
    # open Enum_test ;;
    # let x = C_enum `a ;;
    val x : Enum_test.c_obj = C_enum `a
    # enum_to_int `c_enum_type x ;;
    - : Enum_test.c_obj = C_int 1
    # int_to_enum `c_enum_type 4 ;;
    - : Enum_test.c_obj = C_enum `c
    

    31.2.2.1 Enum typing in Ocaml

    The ocaml SWIG module now has support for loading and using multiple SWIG modules at the same time. This enhances modularity, but presents problems when used with a language which assumes that each module's types are complete at compile time. In order to achieve total soundness enum types are now isolated per-module. The type issue matters when values are shared between functions imported from different modules. You must convert values to master values using the swig_val function before sharing them with another module.

    31.2.3 Arrays

    31.2.3.1 Simple types of bounded arrays

    SWIG has support for array types, but you generally will need to provide a typemap to handle them. You can currently roll your own, or expand some of the macros provided (but not included by default) with the SWIG distribution.

    By including "carray.i", you will get access to some macros that help you create typemaps for array types fairly easily.

    %make_simple_array_typemap is the easiest way to get access to arrays of simple types with known bounds in your code, but this only works for arrays whose bounds are completely specified.

    31.2.3.2 Complex and unbounded arrays

    Unfortunately, unbounded arrays and pointers can't be handled in a completely general way by SWIG, because the end-condition of such an array can't be predicted. In some cases, it will be by consent (e.g. an array of four or more chars), sometimes by explicit length (char *buffer, int len), and sometimes by sentinel value (0, -1, etc.). SWIG can't predict which of these methods will be used in the array, so you have to specify it for yourself in the form of a typemap.

    31.2.3.3 Using an object

    It's possible to use C++ to your advantage by creating a simple object that provides access to your array. This may be more desirable in some cases, since the object can provide bounds checking, etc., that prevents crashes.

    Consider writing an object when the ending condition of your array is complex, such as using a required sentinel, etc.

    31.2.3.4 Example typemap for a function taking float * and int

    This is a simple example in typemap for an array of float, where the length of the array is specified as an extra parameter. Other such typemaps will work similarly. In the example, the function printfloats is called with a float array, and specified length. The actual length reported in the len argument is the length of the array passed from ocaml, making passing an array into this type of function convenient.

    tarray.i
    %module tarray
    %{
    #include <stdio.h>
    
    void printfloats( float *tab, int len ) {
      int i;
    
      for( i = 0; i < len; i++ ) {
        printf( "%f ", tab[i] );
      }
    
      printf( "\n" );
    }
    %}
    
    %typemap(in) (float *tab, int len) {
      int i;
      /* $*1_type */
      $2 = caml_array_len($input);
      $1 = ($*1_type *)malloc( $2 * sizeof( float ) );
      for( i = 0; i < $2; i++ ) {
        $1[i] = caml_double_val(caml_array_nth($input, i));
      }
    }
    
    void printfloats( float *tab, int len );
    
    Sample Run
    # open Tarray ;;
    # _printfloats (C_array [| C_double 1.0 ; C_double 3.0 ; C_double 5.6666 |]) ;;
    1.000000 3.000000 5.666600
    - : Tarray.c_obj = C_void
    

    31.2.4 C++ Classes

    C++ classes, along with structs and unions are represented by C_obj (string -> c_obj -> c_obj) wrapped closures. These objects contain a method list, and a type, which allow them to be used like C++ objects. When passed into typemaps that use pointers, they degrade to pointers through their "&" method. Every method an object has is represented as a string in the object's method table, and each method table exists in memory only once. In addition to any other operators an object might have, certain builtin ones are provided by SWIG: (all of these take no arguments (C_void))

    "~"Delete this object
    "&"Return an ordinary C_ptr value representing this object's address
    "sizeof"If enabled with ("sizeof"="1") on the module node, return the object's size in char.
    ":methods"Returns a list of strings containing the names of the methods this object contains
    ":classof"Returns the name of the class this object belongs to.
    ":parents"Returns a list of all direct parent classes which have been wrapped by SWIG.
    "::[parent-class]"Returns a view of the object as the indicated parent class. This is mainly used internally by the SWIG module, but may be useful to client programs.
    "[member-variable]"Each member variable is wrapped as a method with an optional parameter. Called with one argument, the member variable is set to the value of the argument. With zero arguments, the value is returned.

    Note that this string belongs to the wrapper object, and not the underlying pointer, so using create_[x]_from_ptr alters the returned value for the same object.

    31.2.4.1 STL vector and string Example

    Standard typemaps are now provided for STL vector and string. More are in the works. STL strings are passed just like normal strings, and returned as strings. STL string references don't mutate the original string, (which might be surprising), because Ocaml strings are mutable but have fixed length. Instead, use multiple returns, as in the argout_ref example.

    example.i
    %module example
    %{
    #include "example.h"
    %}
    
    %include <stl.i>
    
    namespace std {
      %template(StringVector) std::vector < string >;
    };
    
    %include "example.h"
    
    This example is in Examples/ocaml/stl

    Since there's a makefile in that directory, the example is easy to build.

    Here's a sample transcript of an interactive session using a string vector after making a toplevel (make toplevel). This example uses the camlp4 module.

    bash-2.05a$ ./example_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Example ;;
    # let x = new_StringVector '() ;;
    val x : Example.c_obj = C_obj <fun>
    # x -> ":methods" () ;;
    - : Example.c_obj =
    C_list
     [C_string "nop"; C_string "size"; C_string "empty"; C_string "clear";
      C_string "push_back"; C_string "[]"; C_string "="; C_string "set";
      C_string "~"; C_string "&"; C_string ":parents"; C_string ":classof";
      C_string ":methods"]
    # x -> push_back ("foo") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("bar") ;;
    - : Example.c_obj = C_void
    # x -> push_back ("baz") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "bar"
    # x -> set (1, "spam") ;;
    - : Example.c_obj = C_void
    # x '[1] ;;
    - : Example.c_obj = C_string "spam"
    # for i = 0 to (x -> size() as int) - 1 do
        print_endline ((x '[i to int]) as string)
      done ;;
    foo
    bar
    baz
    - : unit = ()
    #
    

    31.2.4.2 C++ Class Example

    Here's a simple example using Trolltech's Qt Library:

    qt.i
    %module qt
    %{
    #include <qapplication.h>
    #include <qpushbutton.h>
    %}
    class QApplication {
    public:
      QApplication( int argc, char **argv );
      void setMainWidget( QWidget *widget );
      void exec();
    };
    
    class QPushButton {
    public:
      QPushButton( char *str, QWidget *w );
      void resize( int x, int y );
      void show();
    };
    

    31.2.4.3 Compiling the example

    bash-2.05a$ QTPATH=/your/qt/path
    bash-2.05a$ for file in swig.mli swig.ml swigp4.ml ; do swig -ocaml -co $file ; done
    bash-2.05a$ ocamlc -c swig.mli ; ocamlc -c swig.ml
    bash-2.05a$ ocamlc -I `camlp4 -where` -pp "camlp4o pa_extend.cmo q_MLast.cmo" -c swigp4.ml
    bash-2.05a$ swig -ocaml -c++ -I$QTPATH/include qt.i
    bash-2.05a$ mv qt_wrap.cxx qt_wrap.c
    bash-2.05a$ ocamlc -c -ccopt -xc++ -ccopt -g -g -ccopt -I$QTPATH/include qt_wrap.c
    bash-2.05a$ ocamlc -c qt.mli
    bash-2.05a$ ocamlc -c qt.ml
    bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
      camlp4o.cma swigp4.cmo qt_wrap.o qt.cmo -o qt_top -cclib \
      -L$QTPATH/lib -cclib -lqt
    

    31.2.4.4 Sample Session

    bash-2.05a$ ./qt_top
            Objective Caml version 3.06
    
            Camlp4 Parsing version 3.06
    
    # open Swig ;;
    # open Qt ;;
    # let a = new_QApplication '(0, 0) ;;
    val a : Qt.c_obj = C_obj <fun>
    # let hello = new_QPushButton '("hi", 0) ;;
    val hello : Qt.c_obj = C_obj <fun>
    # hello -> resize (100, 30) ;;
    - : Qt.c_obj = C_void
    # hello -> show () ;;
    - : Qt.c_obj = C_void
    # a -> exec () ;;
    

    Assuming you have a working installation of QT, you will see a window containing the string "hi" in a button.

    31.2.5 Director Classes

    31.2.5.1 Director Introduction

    Director classes are classes which allow Ocaml code to override the public methods of a C++ object. This facility allows the user to use C++ libraries that require a derived class to provide application specific functionality in the context of an application or utility framework.

    You can turn on director classes by using an optional module argument like this:

    %module(directors="1")
    
    ...
    
    // Turn on the director class for a specific class like this:
    %feature("director")
    class foo {
      ...
    };
    

    31.2.5.2 Overriding Methods in Ocaml

    Because the Ocaml language module treats C++ method calls as calls to a certain function, all you need to do is to define the function that will handle the method calls in terms of the public methods of the object, and any other relevant information. The function new_derived_object uses a stub class to call your methods in place of the ones provided by the underlying implementation. The object you receive is the underlying object, so you are free to call any methods you want from within your derived method. Note that calls to the underlying object do not invoke Ocaml code. You need to handle that yourself.

    new_derived_object receives your function, the function that creates the underlying object, and any constructor arguments, and provides an object that you can use in any usual way. When C++ code calls one of the object's methods, the object invokes the Ocaml function as if it had been invoked from Ocaml, allowing any method definitions to override the C++ ones.

    In this example, I'll examine the objective caml code involved in providing an overloaded class. This example is contained in Examples/ocaml/shapes.

    31.2.5.3 Director Usage Example

    example_prog.ml
    open Swig
    open Example
    
    ...
    
    let triangle_class pts ob meth args =
      match meth with
          "cover" ->
            (match args with
                 C_list [ x_arg ; y_arg ] ->
                 let xa = x_arg as float
                 and ya = y_arg as float in
                   (point_in_triangle pts xa ya) to bool
               | _ -> raise (Failure "cover needs two double arguments."))
        | _ -> (invoke ob) meth args ;;
    
    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '() ;;
    
    let _ = _draw_shape_coverage '(triangle, C_int 60, C_int 20) ;;
    

    This is the meat of what you need to do. The actual "class" definition containing the overloaded method is defined in the function triangle_class. This is a lot like the class definitions emitted by SWIG, if you look at example.ml, which is generated when SWIG consumes example.i. Basically, you are given the arguments as a c_obj and the method name as a string, and you must intercept the method you are interested in and provide whatever return value you need. Bear in mind that the underlying C++ code needs the right return type, or an exception will be thrown. This exception will generally be Failure, or NotObject. You must call other ocaml methods that you rely on yourself. Due to the way directors are implemented, method calls on your object from with ocaml code will always invoke C++ methods even if they are overridden in ocaml.

    In the example, the draw_shape_coverage function plots the indicated number of points as either covered (x) or uncovered ( ) between 0 and 1 on the X and Y axes. Your shape implementation can provide any coverage map it likes, as long as it responds to the "cover" method call with a boolean return (the underlying method returns bool). This might allow a tricky shape implementation, such as a boolean combination, to be expressed in a more effortless style in ocaml, while leaving the "engine" part of the program in C++.

    31.2.5.4 Creating director objects

    The definition of the actual object triangle can be described this way:

    let triangle =
      new_derived_object
        new_shape
        (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
        '()
    

    The first argument to new_derived_object, new_shape is the method which returns a shape instance. This function will be invoked with the third argument will be appended to the argument list [ C_void ]. In the example, the actual argument list is sent as (C_list [ C_void ; C_void ]). The augmented constructor for a director class needs the first argument to determine whether it is being constructed as a derived object, or as an object of the indicated type only (in this case shape). The Second argument is a closure that will be added to the final C_obj.

    The actual object passed to the self parameter of the director object will be a C_director_core, containing a c_obj option ref and a c_obj. The c_obj provided is the same object that will be returned from new_derived object, that is, the object exposing the overridden methods. The other part is an option ref that will have its value extracted before becoming the ob parameter of your class closure. This ref will contain None if the C++ object underlying is ever destroyed, and will consequently trigger an exception when any method is called on the object after that point (the actual raise is from an inner function used by new_derived_object, and throws NotObject). This prevents a deleted C++ object from causing a core dump, as long as the object is destroyed properly.

    31.2.5.5 Typemaps for directors, directorin, directorout, directorargout

    Special typemaps exist for use with directors, the directorin, directorout, directorargout are used in place of in, out, argout typemaps, except that their direction is reversed. They provide for you to provide argout values, as well as a function return value in the same way you provide function arguments, and to receive arguments the same way you normally receive function returns.

    31.2.5.6 typemap

    The directorin typemap is used when you will receive arguments from a call made by C++ code to you, therefore, values will be translated from C++ to ocaml. You must provide some valid C_obj value. This is the value your ocaml code receives when you are called. In general, a simple directorin typemap can use the same body as a simple out typemap.

    31.2.5.7 directorout typemap

    The directorout typemap is used when you will send an argument from your code back to the C++ caller. That is; directorout specifies a function return conversion. You can usually use the same body as an in typemap for the same type, except when there are special requirements for object ownership, etc.

    31.2.5.8 directorargout typemap

    C++ allows function arguments which are by pointer (*) and by reference (&) to receive a value from the called function, as well as sending one there. Sometimes, this is the main purpose of the argument given. directorargout typemaps allow your caml code to emulate this by specifying additional return values to be put into the output parameters. The SWIG ocaml module is a bit loose in order to make code easier to write. In this case, your return to the caller must be a list containing the normal function return first, followed by any argout values in order. These argout values will be taken from the list and assigned to the values to be returned to C++ through directorargout typemaps. In the event that you don't specify all of the necessary values, integral values will read zero, and struct or object returns have undefined results.

    31.2.6 Exceptions

    Catching exceptions is now supported using SWIG's %exception feature. A simple but not too useful example is provided by the throw_exception testcase in Examples/test-suite. You can provide your own exceptions, too.


    32 SWIG and Octave

    Octave is a high-level language intended for numerical programming that is mostly compatible with MATLAB. More information can be found at Octave web site.

    This chapter is intended to give an introduction to using the module. You should also read the SWIG documentation that is not specific to Octave. Also, there are a dozen or so examples in the Examples/octave directory, and hundreds in the test suite (Examples/test-suite and Examples/test-suite/octave).

    32.1 Preliminaries

    SWIG is regularly tested against the following versions of Octave: 3.8, 4.0, 4.2.

    Every effort is made to maintain backward compatibility with older versions of Octave. This cannot be guaranteed however, as in recent times new Octave releases have required nontrivial updates to SWIG, which may break backward compatibility for older Octave versions against which SWIG is not regularly tested.

    The SWIG runtime exports the function swig_octave_prereq() for checking the version of Octave.

    32.2 Running SWIG

    Let's start with a very simple SWIG interface file, example.i:

    %module swigexample
    %{
    #include "example.h"
    %}
    int gcd(int x, int y);
    extern double Foo; 

    To build an Octave module when wrapping C code, run SWIG using the -octave option:

    $ swig -octave -o example_wrap.cpp example.i 

    The -c++ option is also required when wrapping C++ code:

    $ swig -octave -c++ -o example_wrap.cpp example.i 

    This creates a C++ source file "example_wrap.cpp". A C++ file is generated even when wrapping C code as Octave is itself written in C++ and requires wrapper code to be in the same language. The generated C++ source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application (in this case, the gcd implementation) to create an extension module.

    32.2.1 Command-line options

    The swig command line has a number of options you can use, like to redirect its output. Use swig -help to learn about these. Options specific to the Octave module are:

    $ swig -octave -help
    ...
    Octave Options (available with -octave)
         -globals name - Set name used to access C global variables [default: 'cvar']
                         Use '.' to load C global variables into module namespace
         -opprefix str - Prefix str for global operator functions [default: 'op_']
    

    The -globals option sets the name of the variable which is the namespace for C global variables exported by the module. The special name "." loads C global variables into the module namespace, i.e. alongside C functions and structs exported by the module. The -opprefix options sets the prefix of the names of global/friend operator functions.

    32.2.2 Compiling a dynamic module

    Octave modules are DLLs/shared objects having the ".oct" suffix. Building an oct file is usually done with the mkoctfile command (either within Octave itself, or from the shell). For example,

    $ swig -octave -c++ -o example_wrap.cpp example.i
    $ mkoctfile example_wrap.cpp example.c
    

    where "example.c" is the file containing the gcd() implementation.

    mkoctfile can also be used to extract the build parameters required to invoke the compiler and linker yourself. See the Octave manual and mkoctfile man page.

    mkoctfile will produce "swigexample.oct", which contains the compiled extension module. Loading it into Octave is then a matter of invoking

    octave:1> swigexample

    32.2.3 Using your module

    Assuming all goes well, you will be able to do this:

    $ octave -q
    octave:1> swigexample
    octave:2> swigexample.gcd(4, 6)
    ans =  2
    octave:3> swigexample.cvar.Foo
    ans =  3
    octave:4> swigexample.cvar.Foo=4;
    octave:5> swigexample.cvar.Foo
    ans =  4 

    32.3 A tour of basic C/C++ wrapping

    32.3.1 Modules

    The SWIG module directive specifies the name of the Octave module. If you specify "module swigexample", then in Octave everything in the module will be accessible under "swigexample", as in the above example. When choosing a module name, make sure you don't use the same name as a built-in Octave command or standard module name.

    When Octave is asked to invoke swigexample, it will try to find the ".m" or ".oct" file that defines the function "swigexample". You therefore need to make sure that "swigexample.oct" is in Octave's search path, which can be specified with the environment variable "OCTAVE_PATH".

    To load an Octave module, simply type its name:

    octave:1> swigexample;
    octave:2> gcd(4, 6)
    ans =  2
    octave:3> cvar.Foo
    ans =  3
    octave:4> cvar.Foo=4;
    octave:5> cvar.Foo
    ans =  4
    

    Modules can also be loaded from within functions, even before being loaded in the base context. If the module is also used in the base context, however, it must first be loaded again:

    octave:1> function l = my_lcm(a, b)
    > swigexample
    > l = abs(a*b)/swigexample.gcd(a, b);
    > endfunction
    octave:2> my_lcm(4, 6)
    ans =  12
    octave:3> swigexample.gcd(4, 6)
    error: can't perform indexing operations for <unknown type> type
    octave:3> swigexample;
    octave:4> swigexample.gcd(4, 6)
    ans =  2
    

    32.3.2 Functions

    Global functions are wrapped as new Octave built-in functions. For example,

    %module swigexample
    int fact(int n); 

    creates a built-in function swigexample.fact(n) that works exactly like you think it does:

    octave:1> swigexample.fact(4)
    24 

    32.3.3 Global variables

    Global variables are a little special in Octave. Given a global variable:

    %module swigexample
    extern double Foo;
    

    To expose variables, SWIG actually generates two functions, to get and set the value. In this case, Foo_set and Foo_set would be generated. SWIG then automatically calls these functions when you get and set the variable-- in the former case creating a local copy in the interpreter of the C variables, and in the latter case copying an interpreter variables onto the C variable.

    octave:1> swigexample;
    octave:2> c=swigexample.cvar.Foo
    c =  3
    octave:3> swigexample.cvar.Foo=4;
    octave:4> c
    c =  3
    octave:5> swigexample.cvar.Foo
    ans =  4

    If a variable is marked with the %immutable directive then any attempts to set this variable will cause an Octave error. Given a global variable:

    %module swigexample
    %immutable;
    extern double Foo;
    %mutable;
    

    SWIG will allow the reading of Foo but when a set attempt is made, an error function will be called.

    octave:1> swigexample
    octave:2> swigexample.Foo=4
    error: attempt to set immutable member variable
    error: assignment failed, or no method for `swig_type = scalar'
    error: evaluating assignment expression near line 2, column 12 

    It is possible to add new functions or variables to the module. This also allows the user to rename/remove existing functions and constants (but not linked variables, mutable or immutable). Therefore users are recommended to be careful when doing so.

    octave:1> swigexample;
    octave:2> swigexample.PI=3.142;
    octave:3> swigexample.PI
    ans =  3.1420 

    32.3.4 Constants and enums

    Because Octave doesn't really have the concept of constants, C/C++ constants are not really constant in Octave. They are actually just a copy of the value into the Octave interpreter. Therefore they can be changed just as any other value. For example given some constants:

    %module swigexample
    %constant int ICONST=42;
    #define    SCONST      "Hello World"
    enum Days{SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
    

    This is 'effectively' converted into the following Octave code:

    swigexample.ICONST=42
    swigexample.SCONST="Hello World"
    swigexample.SUNDAY=0
    .... 

    32.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface: C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Given a wrapping of the <file.h> interface:

    %module swigexample
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Octave. For example:

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("w", "junk");
    octave:3> swigexample.fputs("Hello world", f);
    octave:4> swigexample.fclose(f);
    

    Simply printing the value of a wrapped C++ type will print its typename. E.g.,

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("junk", "w");
    octave:3> f
    f =
    
    {
      _p_FILE, ptr = 0x9b0cd00
    } 

    As the user of the pointer, you are responsible for freeing it, or closing any resources associated with it (just as you would in a C program). This does not apply so strictly to classes and structs (see below).

    octave:1> swigexample;
    octave:2> f=swigexample.fopen("not there", "r");
    error: value on right hand side of assignment is undefined
    error: evaluating assignment expression near line 2, column 2 

    32.3.6 Structures and C++ classes

    SWIG wraps C structures and C++ classes by using a special Octave type called a swig_ref. A swig_ref contains a reference to one or more instances of C/C++ objects, or just the type information for an object. For each wrapped structure and class, a swig_ref will be exposed that has the name of the type. When invoked as a function, it creates a new object of its type and returns a swig_ref that points to that instance. This provides a very natural interface. For example,

    struct Point{
      int x, y;
    };
    

    is used as follows:

    octave:1> swigexample;
    octave:2> p=swigexample.Point();
    octave:3> p.x=3;
    octave:4> p.y=5;
    octave:5> p.x, p.y
    ans =  3
    ans =  5 
    

    In C++, invoking the type object in this way calls the object's constructor. swig_ref objects can also be acquired by having a wrapped function return a pointer, reference, or value of a non-primitive type.

    The swig_ref type handles indexing operations such that usage maps closely to what you would have in C/C++. Structure members are accessed as in the above example, by calling set and get methods for C++ variables. Methods also work as expected. For example, code wrapped in the following way

    class Point{
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2)+pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x; y=_y;
      }
    };
    

    can be used from Octave like this

    octave:1> swigexample;
    octave:2> p1=swigexample.Point(3, 5);
    octave:3> p2=swigexample.Point(1, 2);
    octave:4> p1.distance(p2)
    ans =  3.6056
    

    By using the swig_this() and swig_type() functions, one can discover the pointers to and types of the underlying C/C++ object.

    octave:5> swig_this(p1)
    ans = 162504808
    octave:6> swig_type(p1)
    ans = Point
    

    Note that swig_ref is a reference-counted pointer to a C/C++ object/type, and as such has pass-by-reference semantics. For example if one has a allocated a single object but has two swig_ref 's pointing to it, modifying the object through either of them will change the single allocated object. This differs from the usual pass-by-value (copy-on-write) semantics that Octave maintains for built-in types. For example, in the following snippet, modifying b does not modify a,

    octave:7> a=struct('x', 4)
    a =
    {
      x =  4
    }
    
    octave:8> b=a
    b =
    {
      x =  4
    }
    
    octave:9> b.y=4
    b =
    {
      x =  4
      y =  4
    }
    
    octave:10> a
    a =
    {
      x =  4
    }
    

    However, when dealing with wrapped objects, one gets the behavior

    octave:2> a=Point(3, 5)
    a =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:3> b=a
    b =
    
    {
      Point, ptr = 0x9afbbb0
    }
    
    octave:4> b.set(2, 1);
    octave:5> b.x, b.y
    ans =  2
    ans =  1
    octave:6> a.x, a.y
    ans =  2
    ans =  1
    

    Depending on the ownership setting of a swig_ref, it may call C++ destructors when its reference count goes to zero. See the section on memory management below for details.

    32.3.7 C++ inheritance

    Single and multiple inheritance are fully supported. The swig_ref type carries type information along with any C++ object pointer it holds. This information contains the full class hierarchy. When an indexing operation (such as a method invocation) occurs, the tree is walked to find a match in the current class as well as any of its bases. The lookup is then cached in the swig_ref.

    32.3.8 C++ overloaded functions

    Overloaded functions are supported, and handled as in other modules. That is, each overload is wrapped separately (under internal names), and a dispatch function is also emitted under the external/visible name. The dispatch function selects which overload to call (if any) based on the passed arguments. typecheck typemaps are used to analyze each argument, as well as assign precedence. See the chapter on typemaps for details.

    32.3.9 C++ operators

    C++ operator overloading is supported, in a way similar to other modules. The swig_ref type supports all unary and binary operators between itself and all other types that exist in the system at module load time. When an operator is used (where one of the operands is a swig_ref), the runtime routes the call to either a member function of the given object, or to a global function whose named is derived from the types of the operands (either both or just the lhs or rhs).

    For example, if a and b are SWIG variables in Octave, a+b becomes a.__add__(b). The wrapper is then free to implement __add__ to do whatever it wants. A wrapper may define the __add__ function manually, %rename some other function to it, or %rename a C++ operator to it.

    By default the C++ operators are renamed to their corresponding Octave operators. So without doing any work, the following interface

    %inline {
    struct A {
      int value;
      A(int _value) : value(_value) {}
      A operator+ (const A& x) {
        return A(value+x.value);
      }
    };
    }
    

    is usable from Octave like this:

    a=A(2), b=A(3), c=a+b
    assert(c.value==5);
    

    Octave operators are mapped in the following way:

    __brace__      a{args}
    __brace_asgn__ a{args} = rhs
    __paren__      a(args)
    __paren_asgn__ a(args) = rhs
    __str__        generates string rep
    __not__        !a
    __uplus__      +a
    __uminus__     -a
    __transpose__  a.'
    __hermitian__  a'
    __incr__       a++
    __decr__       a--
    __add__        a + b
    __sub__        a - b
    __mul__        a * b
    __div__        a / b
    __pow__        a ^ b
    __ldiv__       a \ b
    __lshift__     a <<b
    __rshift__     a >> b
    __lt__         a  <b
    __le__         a  <= b
    __eq__         a == b
    __ge__         a >= b
    __gt__         a > b
    __ne__         a != b
    __el_mul__     a .* b
    __el_div__     a ./ b
    __el_pow__     a .^ b
    __el_ldiv__    a .\ b
    __el_and__     a & b
    __el_or__      a | b
    

    On the C++ side, the default mappings are as follows:

    %rename(__add__)       *::operator+;
    %rename(__add__)       *::operator+();
    %rename(__add__)       *::operator+() const;
    %rename(__sub__)       *::operator-;
    %rename(__uminus__)    *::operator-();
    %rename(__uminus__)    *::operator-() const;
    %rename(__mul__)       *::operator*;
    %rename(__div__)       *::operator/;
    %rename(__mod__)       *::operator%;
    %rename(__lshift__)    *::operator<
    
    >;
    %rename(__el_and__)    *::operator&&;
    %rename(__el_or__)     *::operator||;
    %rename(__xor__)       *::operator^;
    %rename(__invert__)    *::operator~;
    %rename(__lt__)        *::operator
    
    ;
    %rename(__ge__)        *::operator>=;
    %rename(__eq__)        *::operator==;
    %rename(__ne__)        *::operator!=;
    %rename(__not__)       *::operator!;
    %rename(__incr__)      *::operator++;
    %rename(__decr__)      *::operator--;
    %rename(__paren__)     *::operator();
    %rename(__brace__)     *::operator[];
    

    Octave can also utilise friend (i.e. non-member) operators with a simple %rename: see the example in the Examples/octave/operator directory.

    32.3.10 Class extension with %extend

    The %extend directive works the same as in other modules.

    You can use it to define special behavior, like for example defining Octave operators not mapped to C++ operators, or defining certain Octave mechanisms such as how an object prints. For example, the octave_value::{is_string, string_value, print} functions are routed to a special method __str__ that can be defined inside an %extend.

    %extend A {
    string __str__() {
      stringstream sout;
      sout<<$self->value;
      return sout.str();
    }
    }
    

    Then in Octave one gets,

    octave:1> a=A(4);
    octave:2> a
    a = 4
    octave:3> printf("%s\n", a);
    4
    octave:4> a.__str__()
    4
    

    Similarly, Octave can use the __float__ method to convert an object to a numeric value.

    Octave 3.8.0 and later versions will also map unary functions X() to the corresponding __X__ method, where X includes: abs(), acos(), acosh(), angle(), arg(), asin(), asinh(), atan(), atanh(), cbrt(), ceil(), conj(), cos(), cosh(), dawson(), erf(), erfc(), erfcinv(), erfcx(), erfi(), erfinv(), exp(), expm1(), finite(), fix(), floor(), gamma(), imag(), isalnum(), isalpha(), isascii(), iscntrl(), isdigit(), isgraph(), isinf(), islower(), isna(), isnan(), isprint(), ispunct(), isspace(), isupper(), isxdigit(), lgamma(), log(), log10(), log1p(), log2(), real(), round(), roundb(), signbit(), signum(), sin(), sinh(), sqrt(), tan(), tanh(), toascii(), tolower(), toupper()

    32.3.11 C++ templates

    C++ class and function templates are fully supported as in other modules, in that the %template directive may used to create explicit instantiations of templated types. For example, function templates can be instantiated as follows:

    %module swigexample
    %inline {
      template<class __scalar>
        __scalar mul(__scalar a, __scalar b) {
        return a*b;
      }
    }
    %include <std_complex.i>
    %template(mul) mul<std::complex<double> >
    %template(mul) mul<double>
    

    and then used from Octave

    octave:1> mul(4, 3)
    ans =  12
    octave:2> mul(4.2, 3.6)
    ans =  15.120
    octave:3> mul(3+4i, 10+2i)
    ans =  22 + 46i
    

    Similarly, class templates can be instantiated as in the following example,

    %module swigexample
    %include <std_complex.i>
    %include <std_string.i>
    %inline {
      #include <sstream>
      template<class __scalar> class sum {
        __scalar s;
      public:
        sum(__scalar _s=0) : s(_s) {}
        sum& add(__scalar _s) {
          s+=_s;
          return *this;
        }
        std::string __str__() const {
          std::stringstream sout;
          sout<<s;
          return sout.str();
        }
      };
    }
    %template(sum_complex) sum<std::complex<double> >;
    %template(sum_double) sum<double>;
    

    and then used from Octave

    octave:2> a=sum_complex(2+3i);
    octave:3> a.add(2)
    ans =
    
    (4, 3)
    octave:4> a.add(3+i)
    ans =
    
    (7, 4)
    

    32.3.12 C++ Smart Pointers

    32.3.12.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Octave in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    32.3.12.2 Generic Smart Pointers

    C++ smart pointers are fully supported as in other modules.

    32.3.13 Directors (calling Octave from C++ code)

    There is full support for SWIG Directors, which permits Octave code to subclass C++ classes, and implement their virtual methods.

    Octave has no direct support for object oriented programming, however the swig_ref type provides some of this support. You can manufacture a swig_ref using the subclass function (provided by the SWIG/Octave runtime).

    For example,

    octave:1> a=subclass();
    octave:2> a.my_var = 4;
    octave:3> a.my_method = @(self) printf("my_var = ", self.my_var);
    octave:4> a.my_method();
    my_var = 4
    

    subclass() can also be used to subclass one or more C++ types. Suppose you have an interface defined by

    %inline {
    class A {
    public:
      virtual my_method() {
        printf("c-side routine called\n");
      }
    };
    void call_your_method(A& a) {
      a.my_method();
    }
    }
    

    Then from Octave you can say:

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   printf("octave-side routine called\n");
    octave:4> end
    octave:5> call_your_method(B());
    octave-side routine called
    

    or more concisely,

    octave:1> B=@() subclass(A(), 'my_method', @(self) printf("octave-side routine called\n"));
    octave:2> call_your_method(B());
    octave-side routine called
    

    Note that you have to enable directors via the %feature directive (see other modules for this).

    subclass() will accept any number of C++ bases or other subclass()'ed objects, (string, octave_value) pairs, and function_handles. In the first case, these are taken as base classes; in the second case, as named members (either variables or functions, depending on whether the given value is a function handle); in the third case, as member functions whose name is taken from the given function handle. E.g.,

    octave:1> B=@(some_var=2) subclass(A(), 'some_var', some_var, @some_func, 'another_func',
    @(self) do_stuff())
    

    You can also assign non-C++ member variables and functions after construct time. There is no support for non-C++ static members.

    There is limited support for explicitly referencing C++ bases. So, in the example above, we could have

    octave:1> B=@() subclass(A(), @my_method);
    octave:2> function my_method(self)
    octave:3>   self.A.my_method();
    octave:4>   printf("octave-side routine called\n");
    octave:5> end
    octave:6> call_your_method(B());
    c-side routine called
    octave-side routine called
    

    32.3.14 Threads

    The use of threads in wrapped Director code is not supported; i.e., an Octave-side implementation of a C++ class must be called from the Octave interpreter's thread. Anything fancier (apartment/queue model, whatever) is left to the user. Without anything fancier, this amounts to the limitation that Octave must drive the module... like, for example, an optimization package that calls Octave to evaluate an objective function.

    32.3.15 Memory management

    As noted above, swig_ref represents a reference counted pointer to a C/C++-side object. It also contains a flag indicating whether Octave or the C/C++ code owns the object. If Octave owns it, any destructors will be called when the reference count reaches zero. If the C/C++ side owns the object, then destructors will not be called when the reference count goes to zero.

    For example,

    %inline {
    class A {
    public:
      A() { printf("A constructing\n"); }
      ~A() { printf("A destructing\n"); }
    };
    }
    

    Would produce this behavior in Octave:

    octave:1> a=A();
    A constructing
    octave:2> b=a;
    octave:3> clear a;
    octave:4> b=4;
    A destructing
    

    The %newobject directive may be used to control this behavior for pointers returned from functions.

    In the case where one wishes for the C++ side to own an object that was created in Octave (especially a Director object), one can use the __disown() method to invert this logic. Then letting the Octave reference count go to zero will not destroy the object, but destroying the object will invalidate the Octave-side object if it still exists (and call destructors of other C++ bases in the case of multiple inheritance/subclass()'ing).

    32.3.16 STL support

    Various STL library files are provided for wrapping STL containers.

    32.3.17 Matrix typemaps

    Octave provides a rich set of classes for dealing with matrices. Currently there are no built-in typemaps to deal with those. However, these are relatively straight forward for users to add themselves (see the docs on typemaps). Without much work (a single typemap decl-- say, 5 lines of code in the interface file), it would be possible to have a function

    double my_det(const double* mat, int m, int n);
    

    that is accessed from Octave as,

    octave:1> my_det(rand(4));
    ans = -0.18388
    


    33 SWIG and Perl5

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Perl5. Although the Perl5 module is one of the earliest SWIG modules, it has continued to evolve and has been improved greatly with the help of SWIG users. For the best results, it is recommended that SWIG be used with Perl 5.8 or later. We're no longer testing regularly with older versions, but Perl 5.6 seems to mostly work, while older versions don't.

    33.1 Overview

    To build Perl extension modules, SWIG uses a layered approach. At the lowest level, simple procedural wrappers are generated for functions, classes, methods, and other declarations in the input file. Then, for structures and classes, an optional collection of Perl proxy classes can be generated in order to provide a more natural object oriented Perl interface. These proxy classes simply build upon the low-level interface.

    In describing the Perl interface, this chapter begins by covering the essentials. First, the problem of configuration, compiling, and installing Perl modules is discussed. Next, the low-level procedural interface is presented. Finally, proxy classes are described. Advanced customization features, typemaps, and other options are found near the end of the chapter.

    33.2 Preliminaries

    To build a Perl5 module, run SWIG using the -perl option as follows:

    swig -perl example.i
    
    

    This produces two files. The first file, example_wrap.c contains all of the C code needed to build a Perl5 module. The second file, example.pm contains supporting Perl code needed to properly load the module.

    To build the module, you will need to compile the file example_wrap.c and link it with the rest of your program.

    33.2.1 Getting the right header files

    In order to compile, SWIG extensions need the following Perl5 header files:

    #include "Extern.h"
    #include "perl.h"
    #include "XSUB.h"
    

    These are typically located in a directory like this

    /usr/lib/perl/5.14/CORE
    

    The SWIG configuration script automatically tries to locate this directory so that it can compile examples. However, if you need to find out where the directory is located, an easy way to find out is to ask Perl itself:

    $ perl -e 'use Config; print "$Config{archlib}\n";'
    /usr/lib/perl/5.14
    

    33.2.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -perl example.i
    $ gcc -fPIC example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/lib/perl/5.14/CORE -Dbool=char
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact compiler options vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/perl5 directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the shared object file must match the module name used in the SWIG interface file. If you used ` %module example', then the target should be named `example.so ', `example.sl', or the appropriate dynamic module name on your system.

    33.2.3 Building a dynamic module with MakeMaker

    It is also possible to use Perl to build dynamically loadable modules for you using the MakeMaker utility. To do this, write a Perl script such as the following:

    # File : Makefile.PL
    use ExtUtils::MakeMaker;
    WriteMakefile(
            `NAME'    => `example',                  # Name of package
            `LIBS'    => [`-lm'],                    # Name of custom libraries
            `OBJECT'  => `example.o example_wrap.o'  # Object files
    );
    
    

    Now, to build a module, simply follow these steps:

    $ perl Makefile.PL
    $ make
    $ make install
    

    If you are planning to distribute a SWIG-generated module, this is the preferred approach to compilation. More information about MakeMaker can be found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen, and Randal Schwartz.

    33.2.4 Building a static version of Perl

    If you machine does not support dynamic loading or if you've tried to use it without success, you can build a new version of the Perl interpreter with your SWIG extensions added to it. To build a static extension, you first need to invoke SWIG as follows:

    $ swig -perl -static example.i
    

    By default SWIG includes code for dynamic loading, but the -static option takes it out.

    Next, you will need to supply a main() function that initializes your extension and starts the Perl interpreter. While, this may sound daunting, SWIG can do this for you automatically as follows:

    %module example
    
    %inline %{
    extern double My_variable;
    extern int fact(int);
    %}
    
    // Include code for rebuilding Perl
    %include <perlmain.i>
    

    The same thing can be accomplished by running SWIG as follows:

    $ swig -perl -static -lperlmain.i example.i
    

    The perlmain.i file inserts Perl's main() function into the wrapper code and automatically initializes the SWIG generated module. If you just want to make a quick a dirty module, this may be the easiest way. By default, the perlmain.i code does not initialize any other Perl extensions. If you need to use other packages, you will need to modify it appropriately. You can do this by just copying perlmain.i out of the SWIG library, placing it in your own directory, and modifying it to suit your purposes.

    To build your new Perl executable, follow the exact same procedure as for a dynamic module, but change the link line to something like this:

    $ gcc example.o example_wrap.o -L/usr/lib/perl/5.14/CORE \
            -lperl -lsocket -lnsl -lm -o myperl
    

    This will produce a new version of Perl called myperl. It should be functionality identical to Perl with your C/C++ extension added to it. Depending on your machine, you may need to link with additional libraries such as -lsocket, -lnsl, -ldl, etc.

    33.2.5 Using the module

    To use the module, simply use the Perl use statement. If all goes well, you will be able to do this:

    $ perl
    use example;
    print example::fact(4), "\n";
    24
    

    A common error received by first-time users is the following:

    use example;
    Can't locate example.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at - line 1.
    BEGIN failed--compilation aborted at - line 1.
    

    This error is almost caused when the name of the shared object file you created doesn't match the module name you specified with the %module directive.

    A somewhat related, but slightly different error is this:

    use example;
    Can't find 'boot_example' symbol in ./example.so
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error is generated because Perl can't locate the module bootstrap function in the SWIG extension module. This could be caused by a mismatch between the module name and the shared library name. However, another possible cause is forgetting to link the SWIG-generated wrapper code with the rest of your application when you linked the extension module.

    Another common error is the following:

    use example;
    Can't load './example.so' for module example: ./example.so: 
    undefined symbol: Foo at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration. Better yet, update the header file so that it doesn't have an undefined declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following error when you try to use your module:

    use example;
    Can't load './example.so' for module example: libfoo.so: cannot open shared object file: 
    No such file or directory at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To get the loader to look in other locations, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Perl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib perl
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    33.2.6 Compilation problems and compiling with C++

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Perl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -perl example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -perl example.i
    $ CC -Kpic -c example.cxx
    $ CC -Kpic -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ CC -shared example.o example_wrap.o -o example.so -lCrun
    

    Of course, the names of the extra libraries are completely non-portable---you will probably need to do some experimentation.

    Another possible compile problem comes from recent versions of Perl (5.8.0) and the GNU tools. If you see errors having to do with _crypt_struct, that means _GNU_SOURCE is not defined and it needs to be. So you should compile the wrapper like:

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE -D_GNU_SOURCE
    

    -D_GNU_SOURCE is also included in the Perl ccflags, which can be found by running

    $ perl -e 'use Config; print "$Config{ccflags}\n";'
    

    So you could also compile the wrapper like

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE \
    `perl -MConfig -e 'print $Config{ccflags}'`
    

    Sometimes people have suggested that it is necessary to relink the Perl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary on most platforms. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Perl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example, notice the first line of output here:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    If linking wasn't enough of a problem, another major complication of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Perl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. Also, be aware that certain C++ features, especially RTTI, can behave strangely when working with multiple modules.

    It should be noted that you may get a lot of error messages about the 'bool' datatype when compiling a C++ Perl module. If you experience this problem, you can try the following:

    • Use -DHAS_BOOL when compiling the SWIG wrapper code
    • Or use -Dbool=char when compiling.

    Finally, recent versions of Perl (5.8.0) have namespace conflict problems. Perl defines a bunch of short macros to make the Perl API function names shorter. For example, in /usr/lib/perl/5.8.0/CORE/embed.h there is a line:

    #define do_open Perl_do_open
    

    The problem is, in the <iostream> header from GNU libstdc++v3 there is a private function named do_open. If <iostream> is included after the perl headers, then the Perl macro causes the iostream do_open to be renamed, which causes compile errors. Hopefully in the future Perl will support a PERL_NO_SHORT_NAMES flag, but for now the only solution is to undef the macros that conflict. Lib/perl5/noembed.h in the SWIG source has a list of macros that are known to conflict with either standard headers or other headers. But if you get macro type conflicts from other macros not included in Lib/perl5/noembed.h while compiling the wrapper, you will have to find the macro that conflicts and add an #undef into the .i file. Please report any conflicting macros you find to swig-user mailing list.

    33.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Perl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    33.3 Building Perl Extensions under Windows

    Building a SWIG extension to Perl under Windows is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Perl interpreter. This section assumes you are using SWIG with Microsoft Visual C++ although the procedure may be similar with other compilers.

    33.3.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly requires these steps:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note: If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -perl5 -o $(ProjDir)\$(InputName)_wrap.cxx $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.cxx" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Perl 5 installation under "Additional include directories".
    • Define the symbols WIN32 and MSWIN32 under preprocessor options. If using the ActiveWare port, also define the symbol PERL_OBJECT. Note that all extensions to the ActiveWare port must be compiled with the C++ compiler since Perl has been encapsulated in a C++ class.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Perl library file to your link libraries. For example "perl.lib". Also, set the name of the output file to match the name of your Perl module (ie. example.dll).
    • Build your project.

    Now, assuming you made it this far, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Perl extension, simply run Perl and use the use command as normal. For example:

    DOS > perl
    use example;
    $a = example::fact(4);
    print "$a\n";
    
    

    33.3.2 Using other compilers

    SWIG is known to work with Cygwin and may work with other compilers on Windows. For general hints and suggestions refer to the Windows chapter.

    33.4 The low-level interface

    At its core, the Perl module uses a simple low-level interface to C function, variables, constants, and classes. This low-level interface can be used to control your application. However, it is also used to construct more user-friendly proxy classes as described in the next section.

    33.4.1 Functions

    C functions are converted into new Perl built-in commands (or subroutines). For example:

    %module example
    int fact(int a);
    ...
    

    Now, in Perl:

    use example;
    $a = &example::fact(2);
    

    33.4.2 Global variables

    Global variables are handled using Perl's magic variable mechanism. SWIG generates a pair of functions that intercept read/write operations and attaches them to a Perl variable with the same name as the C global variable. Thus, an interface like this

    %module example;
    ...
    double Spam;
    ...
    

    is accessed as follows:

    use example;
    print $example::Spam, "\n";
    $example::Spam = $example::Spam + 4
    # ... etc ...
    
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    It is also possible to tag a specific variable as read-only like this:

    %{
    extern char *path;
    %}
    %immutable path; 
    ...
    ...
    extern char *path;       // Declared later in the input
    

    33.4.3 Constants

    By default, constants are wrapped as read-only Perl variables. For example:

    %module example
    
    #define FOO 42
    

    In Perl:

    use example;
    print $example::FOO, "\n";   # OK
    $example::FOO = 2;           # Error
    

    Alternatively, if you use swig's -const option, constants are wrapped such that the leading $ isn't required (by using a constant subroutine), which usually gives a more natural Perl interface, for example:

    use example;
    print example::FOO, "\n";
    

    33.4.4 Pointers

    SWIG represents pointers as blessed references. A blessed reference is the same as a Perl reference except that it has additional information attached to it indicating what kind of reference it is. That is, if you have a C declaration like this:

    Matrix *new_Matrix(int n, int m);
    

    The module returns a value generated as follows:

    $ptr = new_Matrix(int n, int m);     # Save pointer return result
    bless $ptr, "p_Matrix";              # Bless it as a pointer to Matrix
    

    SWIG uses the "blessing" to check the datatype of various pointers. In the event of a mismatch, an error or warning message is generated.

    To check to see if a value is the NULL pointer, use the defined() command:

    if (defined($ptr)) {
      print "Not a NULL pointer.";
    } else {
      print "Is a NULL pointer.";
    }
    
    

    To create a NULL pointer, you should pass the undef value to a function.

    The "value" of a Perl reference is not the same as the underlying C pointer that SWIG wrapper functions return. Suppose that $a and $b are two references that point to the same C object. In general, $a and $b will be different--since they are different references. Thus, it is a mistake to check the equality of $a and $b to check the equality of two C pointers. The correct method to check equality of C pointers is to dereference them as follows:

    if ($$a == $$b) {
      print "a and b point to the same thing in C";
    } else {
      print "a and b point to different objects.";
    }
    
    

    As much as you might be inclined to modify a pointer value directly from Perl, don't. Manipulating pointer values is architecture dependent and could cause your program to crash. Similarly, don't try to manually cast a pointer to a new type by reblessing a pointer. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
        return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return NULL if the conversion can't be performed.

    Compatibility Note: In earlier versions, SWIG tried to preserve the same pointer naming conventions as XS and xsubpp. Given the advancement of the SWIG typesystem and the growing differences between SWIG and XS, this is no longer supported.

    33.4.5 Structures

    Access to the contents of a structure are provided through a set of low-level accessor functions as described in the "SWIG Basics" chapter. For example,

    struct Vector {
      double x, y, z;
    };
    

    gets mapped into the following collection of accessor functions:

    struct Vector *new_Vector();
    void           delete_Vector(Vector *v);
    double         Vector_x_get(Vector *obj)
    void           Vector_x_set(Vector *obj, double x)
    double         Vector_y_get(Vector *obj)
    void           Vector_y_set(Vector *obj, double y)
    double         Vector_z_get(Vector *obj)
    void           Vector_z_set(Vector *obj, double z)
    
    

    These functions are then used to access structure data from Perl as follows:

    $v = example::new_Vector();
    print example::Vector_x_get($v), "\n";   # Get x component
    example::Vector_x_set($v, 7.8);          # Change x component
    

    Similar access is provided for unions and the data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    Array members are normally wrapped as read-only. For example,

    struct Foo {
      int x[50];
    };
    

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
        return self->x;
    };
    

    If you want to set an array member, you will need to supply a "memberin" typemap described later in this chapter. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Python string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };
    

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
        return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
        b->f = *val;
    }
    

    33.4.6 C++ classes

    C++ classes are wrapped by building a set of low level accessor functions. Consider the following class:

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    When wrapped by SWIG, the following functions are created:

    List    *new_List();
    void     delete_List(List *l);
    int      List_search(List *l, char *item);
    void     List_insert(List *l, char *item);
    void     List_remove(List *l, char *item);
    char    *List_get(List *l, int n);
    int      List_length_get(List *l);
    void     List_length_set(List *l, int n);
    void     List_print(List *l);
    
    

    In Perl, these functions are used in a straightforward manner:

    use example;
    $l = example::new_List();
    example::List_insert($l, "Ale");
    example::List_insert($l, "Stout");
    example::List_insert($l, "Lager")
    example::List_print($l)
    Lager
    Stout
    Ale
    print example::List_length_get($l), "\n";
    3
    

    At this low level, C++ objects are really just typed pointers. Member functions are accessed by calling a C-like wrapper with an instance pointer as the first argument. Although this interface is fairly primitive, it provides direct access to C++ objects. A higher level interface using Perl proxy classes can be built using these low-level accessors. This is described shortly.

    33.4.7 C++ classes and type-checking

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    and a function

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo. If necessary, the type-checker also adjusts the value of the pointer (as is necessary when multiple inheritance is used).

    33.4.8 C++ overloaded functions

    If you have a C++ program with overloaded functions or methods, you will need to disambiguate those methods using %rename. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    Now, in Perl, the methods are accessed as follows:

    use example;
    example::foo_i(3);
    $s = example::new_Spam();
    example::Spam_foo_i($s, 3);
    example::Spam_foo_d($s, 3.14);
    

    Please refer to the "SWIG Basics" chapter for more information.

    33.4.9 Operators

    As of version 1.3.27 SWIG automatically renames the most common C++ operators, and maps them into the perl module with the proper 'use overload ...' so you don't need to do any work.

    The following C++ operators are currently supported by the Perl module:

    • operator++
    • operator--
    • operator+
    • operator-
    • operator*
    • operator/
    • operator==
    • operator!=
    • operator%
    • operator>
    • operator<
    • operator and
    • operator or

    33.4.10 Modules and packages

    When you create a SWIG extension, everything gets placed into a single Perl module. The name of the module is determined by the %module directive. To use the module, do the following:

    $ perl5
    use example;                      # load the example module
    print example::fact(4), "\n"      # Call a function in it
    24
    

    Usually, a module consists of a collection of code that is contained within a single file. A package, on the other hand, is the Perl equivalent of a namespace. A package is a lot like a module, except that it is independent of files. Any number of files may be part of the same package--or a package may be broken up into a collection of modules if you prefer to think about it in this way.

    SWIG installs its functions into a package with the same name as the module.

    Incompatible Change: previous versions of SWIG enabled you to change the name of the package by using the -package option, this feature has been removed in order to properly support modules that used nested namespaces, e.g. Foo::Bar::Baz. To give your module a nested namespace simply provide the fully qualified name in your %module directive:

    %module "Foo::Bar::Baz"
    

    NOTE: the double quotes are necessary.

    Using the package option of the %module directive allows you to specify what Perl namespace that the module will be living in when installed. This is useful in the situation where a module maintainer wants to split a large module into smaller pieces to make maintenance easier, but doesn't want to have that affect the module name used by applications. So for example, if I wanted to split XML::Xerces into XML::Xerces::SAX, etc. , but I wanted all the applications to be able to access the classes using the XML::Xerces namespace I could use:

    %module(package="XML::Xerces") "XML::Xerces::SAX
    

    And now all the applications could use the class XML::Xerces::SAXParser. Without the package directive splitting the module would force applications to use the class XML::Xerces::SAX::SAXParser. This could break compatibility for existing applications that are already using the class under the name XML::Xerces::SAXParser.

    33.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Perl, this allows you to pass simple values. For example:

    $a = example::add(3, 4);
    print "$a\n";
    7
    $b = example::sub(7, 4);
    print "$b\n";
    3
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Perl, a mutated parameter shows up as a return value. For example:

    $a = example::negate(3);
    print "$a\n";
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Perl, the function will return multiple values.

    ($bytes, $success) = example::send_message("Hello World");
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    ($r, $c) = example::get_dimensions($m);
    

    In certain cases, it is possible to treat Perl references as C pointers. To do this, use the REFERENCE typemap. For example:

    %module example
    %include "typemaps.i"
    
    void add(int x, int y, int *REFERENCE);
    

    In Perl:

    use example;
    $c = 0.0;
    example::add(3, 4, \$c);
    print "$c\n";
    7
    

    Note: The REFERENCE feature is only currently supported for numeric types (integers and floating point).

    33.6 Exception handling

    The SWIG %exception directive can be used to create a user-definable exception handler for converting exceptions in your C/C++ program into Perl exceptions. The chapter on customization features contains more details, but suppose you have a C++ class like the following:

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Perl extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    class DoubleArray {
    ...
    };
    

    The exception handling code is inserted directly into generated wrapper functions. The $action variable is replaced with the C/C++ code being executed by the wrapper. When an exception handler is defined, errors can be caught and used to gracefully generate a Perl error instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on " Customization features" for more examples.

    Compatibility note: In SWIG1.1, exceptions were defined using the older %except directive:

    %except(python) {
      try {
        $function
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    This is still supported, but it is deprecated. The newer %exception directive provides the same functionality, but it has additional capabilities that make it more powerful.

    33.7 Remapping datatypes with typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Perl C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Perl interface.

    33.7.1 A simple typemap example

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Perl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) SvIV($input);
      printf("Received an integer : %d\n", $1);
    }
    ...
    %inline %{
    extern int fact(int n);
    %}
    
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object (usually a SV *).

    When this example is used in Perl5, it will operate as follows:

    use example;
    $n = example::fact(6);
    print "$n\n";
    ...
    
    Output:
    Received an integer : 6
    720
    

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) SvIV($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    It should be noted that the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, unsigned len) {
        $1 = SvPV($input, $2);
    };
    
    int count(char c, char *str, unsigned len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Perl object. This allows the function to be used like this (notice how the length parameter is omitted):

    example::count("e", "Hello World");
    1
    >>>
    

    33.7.2 Perl5 typemaps

    The previous section illustrated an "in" typemap for converting Perl objects to C. A variety of different typemap methods are defined by the Perl module. For example, to convert a C integer back into a Perl object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = sv_newmortal();
        set_setiv($result, (IV) $1);
        argvi++;
    }
    

    The following typemap methods are available:

    %typemap(in)

    Converts Perl5 object to input function arguments.

    %typemap(out)

    Converts function return value to a Perl5 value.

    %typemap(varin)

    Converts a Perl5 object to a global variable.

    %typemap(varout)

    Converts a global variable to a Perl5 object.

    %typemap(freearg)

    Cleans up a function argument after a function call

    %typemap(argout)

    Output argument handling

    %typemap(ret)

    Clean up return value from a function.

    %typemap(memberin)

    Setting of C++ member data (all languages).

    %typemap(memberout)

    Return of C++ member data (all languages).

    %typemap(check)

    Check value of input parameter.

    33.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Perl.

    $input

    A Perl object holding the value of an argument of variable value.

    $result

    A Perl object that holds the result to be returned to Perl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Perl name of the wrapper function being created.

    33.7.4 Useful functions

    When writing typemaps, it is necessary to work directly with Perl5 objects. This, unfortunately, can be a daunting task. Consult the "perlguts" man-page for all of the really ugly details. A short summary of commonly used functions is provided here for reference. It should be stressed that SWIG can be used quite effectively without knowing any of these details--especially now that there are typemap libraries that can already been written.

    Perl Integer Functions

    int   SvIV(SV *);
    void  sv_setiv(SV *sv, IV value);
    SV   *newSViv(IV value);
    int   SvIOK(SV *);
    

    Perl Floating Point Functions

    double SvNV(SV *);
    void   sv_setnv(SV *, double value);
    SV    *newSVnv(double value);
    int    SvNOK(SV *);
    

    Perl String Functions

    char     *SvPV(SV *, STRLEN len);
    void      sv_setpv(SV *, char *val);
    void      sv_setpvn(SV *, char *val, STRLEN len);
    SV       *newSVpv(char *value, STRLEN len);
    int       SvPOK(SV *);
    void      sv_catpv(SV *, char *);
    void      sv_catpvn(SV *, char *, STRLEN);
    

    Perl References

    void      sv_setref_pv(SV *, char *, void *ptr);
    int       sv_isobject(SV *);
    SV       *SvRV(SV *);
    int       sv_isa(SV *, char *0;
    

    33.8 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "perl5.swg" and "typemaps.i " in the SWIG library.

    33.8.1 Converting a Perl5 array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Perl5 array reference to be used as a char ** datatype.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      AV *tempav;
      I32 len;
      int i;
      SV  **tv;
      if (!SvROK($input))
        croak("Argument $argnum is not a reference.");
      if (SvTYPE(SvRV($input)) != SVt_PVAV)
        croak("Argument $argnum is not an array.");
      tempav = (AV*)SvRV($input);
      len = av_len(tempav);
      $1 = (char **) malloc((len+2)*sizeof(char *));
      for (i = 0; i <= len; i++) {
        tv = av_fetch(tempav, i, 0);
        $1[i] = (char *) SvPV(*tv, PL_na);
      }
      $1[i] = NULL;
    };
    
    // This cleans up the char ** array after the function call
    %typemap(freearg) char ** {
      free($1);
    }
    
    // Creates a new Perl array and places a NULL-terminated char ** into it
    %typemap(out) char ** {
      AV *myav;
      SV **svs;
      int i = 0, len = 0;
      /* Figure out how many elements we have */
      while ($1[len])
        len++;
      svs = (SV **) malloc(len*sizeof(SV *));
      for (i = 0; i < len ; i++) {
        svs[i] = sv_newmortal();
        sv_setpv((SV*)svs[i], $1[i]);
      };
      myav = av_make(len, svs);
      free(svs);
      $result = newRV_noinc((SV*)myav);
      sv_2mortal($result);
      argvi++;
    }
    
    // Now a few test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    
      // Returns a char ** list
      char **get_args() {
        static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
        return &values[0];
      }
    %}
    
    

    When this module is compiled, the wrapped C functions can be used in a Perl script as follows:

    use argv;
    @a = ("Dave", "Mike", "John", "Mary");           # Create an array of strings
    argv::print_args(\@a);                           # Pass it to our C function
    $b = argv::get_args();                           # Get array of strings from C
    print @$b, "\n";                                 # Print it out
    

    33.8.2 Return values

    Return values are placed on the argument stack of each wrapper function. The current value of the argument stack pointer is contained in a variable argvi. Whenever a new output value is added, it is critical that this value be incremented. For multiple output values, the final value of argvi should be the total number of output values.

    The total number of return values should not exceed the number of input values unless you explicitly extend the argument stack. This can be done using the EXTEND() macro as in:

    %typemap(argout) int *OUTPUT {
      if (argvi >= items) {
        EXTEND(sp, 1);              /* Extend the stack by 1 object */
      }
      $result = sv_newmortal();
      sv_setiv($target, (IV) *($1));
      argvi++;
    }
    

    33.8.3 Returning values from arguments

    Sometimes it is desirable for a function to return a value in one of its arguments. This example describes the implementation of the OUTPUT typemap.

    %module return
    
    // This tells SWIG to treat an double * argument with name 'OutDouble' as
    // an output value.  
    
    %typemap(argout) double *OUTPUT {
      $result = sv_newmortal();
      sv_setnv($result, *$input);
      argvi++;                     /* Increment return count -- important! */
    }
    
    // We don't care what the input value is. Ignore, but set to a temporary variable
    
    %typemap(in, numinputs=0) double *OUTPUT(double junk) {
      $1 = &junk;
    }
    
    // Now a function to test it
    %{
    /* Returns the first two input arguments */
    int multout(double a, double b, double *out1, double *out2) {
      *out1 = a;
      *out2 = b;
      return 0;
    };
    %}
    
    // If we name both parameters OutDouble both will be output
    
    int multout(double a, double b, double *OUTPUT, double *OUTPUT);
    ...
    

    When this function is called, the output arguments are appended to the stack used to return results. This shows up an array in Perl. For example:

    @r = multout(7, 13);
    print "multout(7, 13) = @r\n";
    ($x, $y) = multout(7, 13);
    

    33.8.4 Accessing array structure members

    Consider the following data structure:

    #define SIZE  8
    typedef struct {
        int   values[SIZE];
        ...
    } Foo;
    
    

    By default, SWIG doesn't know how to the handle the values structure member it's an array, not a pointer. In this case, SWIG makes the array member read-only. Reading will simply return a pointer to the first item in the array. To make the member writable, a "memberin" typemap can be used.

    %typemap(memberin) int [SIZE] {
        int i;
        for (i = 0; i < SIZE; i++) {
            $1[i] = $input[i];
        }
    }
    
    

    Whenever a int [SIZE] member is encountered in a structure or class, this typemap provides a safe mechanism for setting its value.

    As in the previous example, the typemap can be generalized for any dimension. For example:

    %typemap(memberin) int [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
        $1[i] = $input[i];
      }
    }
    

    When setting structure members, the input object is always assumed to be a C array of values that have already been converted from the target language. Because of this, the memberin typemap is almost always combined with the use of an "in" typemap. For example, the "in" typemap in the previous section would be used to convert an int[] array to C whereas the "memberin" typemap would be used to copy the converted array into a C data structure.

    33.8.5 Turning Perl references into C pointers

    A frequent confusion on the SWIG mailing list is errors caused by the mixing of Perl references and C pointers. For example, suppose you have a C function that modifies its arguments like this:

    void add(double a, double b, double *c) {
      *c = a + b;
    }
    

    A common misinterpretation of this function is the following Perl script:

    # Perl script
    $a = 3.5;
    $b = 7.5;
    $c = 0.0;          # Output value
    add($a, $b, \$c);    # Place result in c (Except that it doesn't work)
    

    To make this work with a reference, you can use a typemap such as this:

    %typemap(in) double * (double dvalue) {
      SV* tempsv;
      if (!SvROK($input)) {
        croak("expected a reference\n");
      }
      tempsv = SvRV($input);
      if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) {
        croak("expected a double reference\n");
      }
      dvalue = SvNV(tempsv);
      $1 = &dvalue;
    }
    
    %typemap(argout) double * {
      SV *tempsv;
      tempsv = SvRV($input);
      sv_setnv(tempsv, *$1);
    }
    

    Now, if you place this before the add function, you can do this:

    $a = 3.5;
    $b = 7.5;
    $c = 0.0;
    add($a, $b, \$c);            # Now it works!
    print "$c\n";
    
    

    33.8.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. To convert a pointer from Perl to C, the following function is used:

    int SWIG_ConvertPtr(SV *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Perl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. flags is currently undefined and reserved for future expansion. Returns 0 on success and -1 on error.

    void *SWIG_MakePtr(SV *obj, void *ptr, swig_type_info *ty, int flags)

    Creates a new Perl pointer object. obj is a Perl SV that has been initialized to hold the result, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and flags is a flag that controls properties of the conversion. flags is currently undefined and reserved.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    SV *sv = sv_newmortal();
    SWIG_MakePtr(sv, f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    33.9 Proxy classes

    Out of date. Needs update.

    Using the low-level procedural interface, SWIG can also construct a high-level object oriented interface to C structures and C++ classes. This is done by constructing a Perl proxy class (also known as a shadow class) that provides an OO wrapper to the underlying code. This section describes the implementation details of the proxy interface.

    33.9.1 Preliminaries

    Proxy classes, are generated by default. If you want to turn them off, use the -noproxy command line option. For example:

    $ swig -c++ -perl -noproxy example.i
    

    When proxy classes are used, SWIG moves all of the low-level procedural wrappers to another package name. By default, this package is named 'modulec' where 'module' is the name of the module you provided with the %module directive. Then, in place of the original module, SWIG creates a collection of high-level Perl wrappers. In your scripts, you will use these high level wrappers. The wrappers, in turn, interact with the low-level procedural module.

    33.9.2 Structure and class wrappers

    Suppose you have the following SWIG interface file:

    %module example
    struct Vector {
      Vector(double x, double y, double z);
      ~Vector();
      double x, y, z;
    };
    
    

    When wrapped, SWIG creates the following set of low-level accessor functions as described in previous sections.

    Vector *new_Vector(double x, double y, double z);
    void    delete_Vector(Vector *v);
    double  Vector_x_get(Vector *v);
    double  Vector_x_set(Vector *v, double value);
    double  Vector_y_get(Vector *v);
    double  Vector_y_set(Vector *v, double value);
    double  Vector_z_get(Vector *v);
    double  Vector_z_set(Vector *v, double value);
    
    

    However, when proxy classes are enabled, these accessor functions are wrapped inside a Perl class like this:

    package example::Vector;
    @ISA = qw( example );
    %OWNER = ();
    %BLESSEDMEMBERS = ();
    
    sub new () {
        my $self = shift;
        my @args = @_;
        $self = vectorc::new_Vector(@args);
        return undef if (!defined($self));
        bless $self, "example::Vector";
        $OWNER{$self} = 1;
        my %retval;
        tie %retval, "example::Vector", $self;
        return bless \%retval, "Vector";
    }
    
    sub DESTROY {
        return unless $_[0]->isa('HASH');
        my $self = tied(%{$_[0]});
        delete $ITERATORS{$self};
        if (exists $OWNER{$self}) {
            examplec::delete_Vector($self));
            delete $OWNER{$self};
        }
    }
    
    sub FETCH {
        my ($self, $field) = @_;
        my $member_func = "vectorc::Vector_${field}_get";
        my $val = &$member_func($self);
        if (exists $BLESSEDMEMBERS{$field}) {
            return undef if (!defined($val));
            my %retval;
            tie %retval, $BLESSEDMEMBERS{$field}, $val;
            return bless \%retval, $BLESSEDMEMBERS{$field};
        }
        return $val;
    }
    
    sub STORE {
        my ($self, $field, $newval) = @_;
        my $member_func = "vectorc::Vector_${field}_set";
        if (exists $BLESSEDMEMBERS{$field}) {
            &$member_func($self, tied(%{$newval}));
        } else {
            &$member_func($self, $newval);
        }
    }
    

    Each structure or class is mapped into a Perl package of the same name. The C++ constructors and destructors are mapped into constructors and destructors for the package and are always named "new" and "DESTROY". The constructor always returns a tied hash table. This hash table is used to access the member variables of a structure in addition to being able to invoke member functions. The %OWNER and %BLESSEDMEMBERS hash tables are used internally and described shortly.

    To use our new proxy class we can simply do the following:

    # Perl code using Vector class
    $v = new Vector(2, 3, 4);
    $w = Vector->new(-1, -2, -3);
    
    # Assignment of a single member
    $v->{x} = 7.5;
    
    # Assignment of all members
    %$v = ( x=>3,
            y=>9,
            z=>-2);
    
    # Reading members
    $x = $v->{x};
    
    # Destruction
    $v->DESTROY();
    
    

    33.9.3 Object Ownership

    In order for proxy classes to work properly, it is necessary for Perl to manage some mechanism of object ownership. Here's the crux of the problem---suppose you had a function like this:

    Vector *Vector_get(Vector *v, int index) {
      return &v[i];
    }
    

    This function takes a Vector pointer and returns a pointer to another Vector. Such a function might be used to manage arrays or lists of vectors (in C). Now contrast this function with the constructor for a Vector object:

    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = new Vector(x, y, z);        // Call C++ constructor
      return v;
    }
    

    Both functions return a Vector, but the constructor is returning a brand-new Vector while the other function is returning a Vector that was already created (hopefully). In Perl, both vectors will be indistinguishable---clearly a problem considering that we would probably like the newly created Vector to be destroyed when we are done with it.

    To manage these problems, each class contains two methods that access an internal hash table called %OWNER. This hash keeps a list of all of the objects that Perl knows that it has created. This happens in two cases: (1) when the constructor has been called, and (2) when a function implicitly creates a new object (as is done when SWIG needs to return a complex datatype by value). When the destructor is invoked, the Perl proxy class module checks the %OWNER hash to see if Perl created the object. If so, the C/C++ destructor is invoked. If not, we simply destroy the Perl object and leave the underlying C object alone (under the assumption that someone else must have created it).

    This scheme works remarkably well in practice but it isn't foolproof. In fact, it will fail if you create a new C object in Perl, pass it on to a C function that remembers the object, and then destroy the corresponding Perl object (this situation turns out to come up frequently when constructing objects like linked lists and trees). When C takes possession of an object, you can change Perl's ownership by simply deleting the object from the %OWNER hash. This is done using the DISOWN method.

    # Perl code to change ownership of an object
    $v = new Vector(x, y, z);
    $v->DISOWN();     
    

    To acquire ownership of an object, the ACQUIRE method can be used.

    # Given Perl ownership of a file
    $u = Vector_get($v);
    $u->ACQUIRE();
    
    

    As always, a little care is in order. SWIG does not provide reference counting, garbage collection, or advanced features one might find in sophisticated languages.

    33.9.4 Nested Objects

    Suppose that we have a new object that looks like this:

    struct Particle {
      Vector r;
      Vector v;
      Vector f;
      int type;
    }
    
    

    In this case, the members of the structure are complex objects that have already been encapsulated in a Perl proxy class. To handle these correctly, we use the %BLESSEDMEMBERS hash which would look like this (along with some supporting code):

    package Particle;
    ...
    %BLESSEDMEMBERS = (
            r => `Vector',
            v => `Vector',
            f => `Vector',
    );
    
    

    When fetching members from the structure, %BLESSEDMEMBERS is checked. If the requested field is present, we create a tied-hash table and return it. If not, we just return the corresponding member unmodified.

    This implementation allows us to operate on nested structures as follows:

    # Perl access of nested structure
    $p = new Particle();
    $p->{f}->{x} = 0.0;
    %${$p->{v}} = ( x=>0, y=>0, z=>0);         
    

    33.9.5 Proxy Functions

    When functions take arguments involving a complex object, it is sometimes necessary to write a proxy function. For example:

    double dot_product(Vector *v1, Vector *v2);
    

    Since Vector is an object already wrapped into a proxy class, we need to modify this function to accept arguments that are given in the form of tied hash tables. This is done by creating a Perl function like this:

    sub dot_product {
        my @args = @_;
        $args[0] = tied(%{$args[0]});         # Get the real pointer values
        $args[1] = tied(%{$args[1]});
        my $result = vectorc::dot_product(@args);
        return $result;
    }
    

    This function replaces the original function, but operates in an identical manner.

    33.9.6 Inheritance

    Simple C++ inheritance is handled using the Perl @ISA array in each class package. For example, if you have the following interface file:

    // shapes.i
    // SWIG interface file for shapes class
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    
    

    The resulting, Perl wrapper class will create the following code:

    Package Shape;
    @ISA = (shapes);
    ...
    Package Circle;
    @ISA = (shapes Shape);
    ...
    Package Square;
    @ISA = (shapes Shape);
    
    

    The @ISA array determines where to look for methods of a particular class. In this case, both the Circle and Square classes inherit functions from Shape so we'll want to look in the Shape base class for them. All classes also inherit from the top-level module shapes. This is because certain common operations needed to implement proxy classes are implemented only once and reused in the wrapper code for various classes and structures.

    Since SWIG proxy classes are implemented in Perl, it is easy to subclass from any SWIG generated class. To do this, simply put the name of a SWIG class in the @ISA array for your new class. However, be forewarned that this is not a trivial problem. In particular, inheritance of data members is extremely tricky (and I'm not even sure if it really works).

    33.9.7 Modifying the proxy methods

    It is possible to override the SWIG generated proxy/shadow methods, using %feature("shadow"). It works like all the other %feature directives. Here is a simple example showing how to add some Perl debug code to the constructor:

    /* Let's make the constructor of the class Square more verbose */
    %feature("shadow") Square(double w)
    %{
      sub new {
        my $pkg = shift;
        my $self = examplec::new_Square(@_);
        print STDERR "Constructed an @{[ref($self)]}\n";
        bless $self, $pkg if defined($self);
      }
    %}
    
    class Square {
    public:
      Square(double w);
      ...
    };
    

    33.10 Adding additional Perl code

    If writing support code in C isn't enough, it is also possible to write code in Perl. This code gets inserted in to the .pm file created by SWIG. One use of Perl code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %perlcode %{
    sub set_transform
    {
      my ($im, $x) = @_;
      my $a = new_mat44();
      for (my $i = 0; $i < 4, $i++)
      {
        for (my $j = 0; $j < 4, $j++)
        {
          mat44_set($a, $i, $j, $x->[i][j])
          }
      }
      example.set_transform($im, $a);
      free_mat44($a);
    }
    %}
    

    In this example, set_transform() provides a high-level Perl interface built on top of low-level helper functions. For example, this code now seems to work:

    my $a =
      [[1, 0, 0, 0],
      [0, 1, 0, 0],
      [0, 0, 1, 0],
      [0, 0, 0, 1]];
    set_transform($im, $a);
    

    33.11 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Perl. In particular, if a C++ class has been extended in Perl (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Perl implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Perl and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Perl code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    33.11.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
        Foo(int foo);
        virtual void one();
        virtual void two();
    };
    
    class Bar: public Foo {
    public:
        virtual void three();
    };
    

    then at the Perl side you can define

    use mymodule;
    
    package MyFoo;
    use base 'mymodule::Foo';
    
    sub one {
      print "one from Perl\n";
    }
    

    33.11.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Perl proxy classes. The director classes store a pointer to their underlying Perl object and handle various issues related to object ownership.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in Perl via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Perl were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Perl. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Perl, the Perl API is used to call the method of the underlying Perl object (after which the usual virtual method resolution in Perl automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Perl, unless there's a good reason not to. The reason for this is simple: Perl has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Perl proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Perl method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Perl object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Perl, SWIG creates an instance of the original C++ class. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Perl.

    33.11.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Perl instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to a Perl object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special DISOWN() method of the proxy class. After calling this method the director class increments the reference count of the Perl object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Perl object remain, the Perl object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Also note that due to the proxy implementation, the DESTROY() method on directors can be called for several reasons, many of which have little to do with the teardown of an object instance. To help disambiguate this, a second argument is added to the DESTROY() call when a C++ director object is being released. So, to avoid running your clean-up code when an object is not really going away, or after it has already been reclaimed, it is suggested that custom destructors in Perl subclasses looks something like:

    sub DESTROY {
      my($self, $final) = @_;
      if($final) {
        # real teardown code
      }
      shift->SUPER::DESTROY(@_);
    }
    

    33.11.4 Exception unrolling

    With directors routing method calls to Perl, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Perl. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
        if ($error != NULL) {
            throw Swig::DirectorMethodException();
        }
    }
    

    This code will check the Perl error state after each method call from a director into Perl, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler.

    It may be the case that a method call originates in Perl, travels up to C++ through a proxy class, and then back into Perl via a director method. If an exception occurs in Perl at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
        try { $action }
        catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Perl error state is still set when Swig::DirectorMethodException is thrown, Perl will register the exception as soon as the C wrapper function returns.

    33.11.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Perl and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Perl. Relative to the speed of Perl execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Perl in order to ensure that the method does not have an extended Perl implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Perl objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Perl objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Perl.

    33.11.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.


    34 SWIG and PHP

    In this chapter, we discuss SWIG's support of PHP. The PHP module was extensively rewritten in release 1.3.26, and support for generating OO wrappers for PHP5 was added in 1.3.30. The PHP module now supports most of the features available in some of the other languages.

    SWIG supports generating wrappers for PHP5 and PHP7. Support for PHP4 was removed in SWIG 1.3.37.

    Currently any PHP5 or PHP7 release should work, but we don't regularly test with PHP < 5.3.

    In order to use this module, you will need to have a copy of the PHP include files to compile the SWIG generated files. If you installed PHP from a binary package, you may need to install a "php-dev" or "php-devel" package for these to be installed. You can find out where these files are by running php-config --includes. To use the built PHP module you will need either the php binary or the Apache php module. If you want to build your extension into php directly, you will need the complete PHP source tree available.

    34.1 Generating PHP Extensions

    To build a PHP extension, run swig using the -php5 or -php7 option as follows (-php is also supported and currently is an alias for -php5):

    swig -php7 example.i
    

    This will produce 3 files example_wrap.c, php_example.h and example.php. The first file, example_wrap.c contains all of the C code needed to build a PHP extension. The second file, php_example.h contains the header information needed if you wish to statically link the extension into the php interpreter. The third file, example.php can be included by PHP scripts. It attempts to dynamically load the extension and contains extra php code specified in the interface file. If wrapping C++ code with PHP classes, it will also contain PHP class wrappers.

    SWIG can generate PHP extensions from C++ libraries as well when given the -c++ option. The support for C++ is discussed in more detail in section 27.2.6. The generated C++ wrapper will be called example_wrap.cpp (for PHP5) or example_wrap.cxx (for PHP7 where the default has been changed to align with SWIG's default for every other language). You can specify a different extension for the C++ wrapper using -cppext - e.g. if you want example_wrap.cc use -cppext cc.

    The usual (and recommended) way is to build the extension as a separate dynamically loaded module (which is supported by all modern operating systems).

    It is also possible to rebuild PHP from source so that your module is statically linked into the php executable/library. This is a lot more work, and also requires a full rebuild of PHP to update your module, and it doesn't play nicely with package system. We don't recommend this approach, or provide explicit support for it.

    34.1.1 Building a loadable extension

    To build your module as a dynamically loadable extension, use compilation commands like these (if you aren't using GCC, the commands will be different, and there may be some variation between platforms - these commands should at least work for Linux though):

            gcc `php-config --includes` -fpic -c example_wrap.c example.c
            gcc -shared example_wrap.o example.o -o example.so
    

    34.1.2 Using PHP Extensions

    To test the extension from a PHP script, you first need to tell PHP to load it. To do this, add a line like this to the [PHP] section of php.ini:

            extension=/path/to/modulename.so
    

    If the module is in PHP's default extension directory, you can omit the path.

    For some SAPIs (for example, the CLI SAPI) you can instead use the dl() function to load an extension at run time, by adding a like like this to the start of each PHP script which uses your extension:

            dl("/path/to/modulename.so"); // Load the module
    

    But note that this doesn't work when running PHP through a webserver in PHP5.3 and later - you'll need to use extension in php.ini as described above.

    The PHP module which SWIG generates will also attempt to do the dl() call for you if the extension isn't already loaded:

            include("example.php");
    

    This PHP module also defines the PHP classes for the wrapped API, so you'll almost certainly want to include it anyway.

    34.2 Basic PHP interface

    It is important to understand that PHP uses a single global namespace into which all symbols from extension modules are loaded. It is quite possible for names of symbols in one extension module to clash with other symbols unless care is taken to %rename them. At present SWIG doesn't have support for the namespace feature added in PHP 5.3.

    34.2.1 Constants

    These work in much the same way as in C/C++. Constants can be defined by using either the normal C pre-processor declarations, or the %constant SWIG directive. These will then be available from your PHP script as a PHP constant, (i.e. no dollar sign is needed to access them.) For example, with a swig interface file like this,

    %module example
    
    #define PI 3.14159
    
    %constant int E  = 2.71828
    

    you can access the constants in your PHP script like this,

    include("example.php");
    
    echo "PI = " . PI . "\n";
    
    echo "E = " . E . "\n";
    
    

    There's one peculiarity of how constants work in PHP which it is useful to note (this is not specific to SWIG though) - if you try to use an undeclared constant, PHP will emit a notice and then expand the constant to a string version of the constant's name. Unfortunately it is easy to miss the notice if you're using PHP in a webserver, as it will probably end up in error.log or similar.

    For example,

    %module example
    
    #define EASY_TO_MISPELL 0
    

    accessed incorrectly in PHP,

    include("example.php");
    
    if(EASY_TO_MISPEL) {
      ...
    } else {
      ...
    }
    
    

    The mis-spelled constant will become the string 'EASY_TO_MISPEL', which is treated as true by the if test, when the value of the intended constant would be treated as false! Modern versions of PHP will at least issue a PHP notice by default when this happens.

    34.2.2 Global Variables

    Because PHP does not provide a mechanism to intercept access and assignment of global variables, global variables are supported through the use of automatically generated accessor functions.

    %module example;
    
    %inline %{
      double seki = 2;
      void print_seki() {
        zend_printf("seki is now %f\n", seki);
      }
    %}
    

    is accessed as follows:

    include("example.php");
    print seki_get();
    seki_set( seki_get() * 2); # The C variable is now 4.
    print seki_get();
    

    SWIG supports global variables of all C datatypes including pointers and complex objects. Additional types can be supported by using the varinit typemap.

    SWIG honors the %immutable modifier by not generating code for the _set method. This provides read-only access to the variable from the php script. Attempting to access the _set method will result in a php fatal error because the function is undefined.

    At this time SWIG does not support custom accessor methods.

    34.2.3 Functions

    C functions are converted into PHP functions. Default/optional arguments are also allowed. An interface file like this :

    %module example
    int foo(int a);
    double bar(double, double b = 3.0);
    ...
    

    Will be accessed in PHP like this :

    include("example.php");
    $a = foo(2);
    $b = bar(3.5, -1.5);
    $c = bar(3.5);  # Use default argument for 2nd parameter
    
    

    34.2.4 Overloading

    Although PHP does not support overloading functions natively, swig will generate dispatch functions which will use %typecheck typemaps to allow overloading. This dispatch function's operation and precedence is described in Wrapping Overloaded Functions and Methods.

    34.2.5 Pointers and References

    Pointers to C/C++ objects are represented as PHP resources, rather like MySQL connection handles.

    There are multiple ways to wrap pointers to simple types. Given the following C method:

      void add( int *in1, int *in2, int *result);
    

    One can include cpointer.i to generate PHP wrappers to int *.

    %module example
    %include "cpointer.i"
    %pointer_functions(int, intp)
    
    void add( int *in1, int *in2, int *result);
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1=copy_intp(3);
    $in2=copy_intp(5);
    $result=new_intp();
    
    add( $in1, $in2, $result );
    
    echo "The sum " . intp_value($in1) . " + " . intp_value($in2) . " = " . intp_value( $result) . "\n";
    ?>
    

    An alternative would be to use the include typemaps.i which defines named typemaps for INPUT, OUTPUT and INOUT variables. One needs to either %apply the appropriate typemap or adjust the parameter names as appropriate.

    %module example
    %include "typemaps.i"
    
    void add( int *INPUT, int *INPUT, int *OUTPUT);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result= add($in1, $in2);  # Note using variables for the input is unnecessary.
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    Because PHP has a native concept of reference, it may seem more natural to the PHP developer to use references to pass pointers. To enable this, one needs to include phppointers.i which defines the named typemap REF.

    Prior to SWIG 3.0, the REF typemaps relied on PHP's call-time pass-by-reference, which was deprecated in PHP 5.3 and removed in PHP 5.4. So if you use these REF typemaps, you should ensure that SWIG≥3.0 is used to generate wrappers from your interface file.

    In case you write your own typemaps, SWIG supports an attribute called byref: if you set that, then SWIG will make sure that the generated wrapper function will want the input parameter as a reference.

    %module example
    %include "phppointers.i"
    
    void add( int *REF, int *REF, int *REF);
    
    

    This will result in the following usage in PHP:

    <?php
    
    include("example.php");
    
    $in1 = 3;
    $in2 = 5;
    $result = 0;
    add($in1, $in2, $result);
    
    echo "The sum $in1 + $in2 = $result\n";
    ?>
    

    It is important to note that a php variable which is NULL when passed by reference would end up passing a NULL pointer into the function. In PHP, an unassigned variable (i.e. where the first reference to the variable is not an assignment) is NULL. In the above example, if any of the three variables had not been assigned, a NULL pointer would have been passed into add. Depending on the implementation of the function, this may or may not be a good thing.

    We chose to allow passing NULL pointers into functions because that is sometimes required in C libraries. A NULL pointer can be created in PHP in a number of ways: by using unset on an existing variable, or assigning NULL to a variable.

    34.2.6 Structures and C++ classes

    SWIG defaults to wrapping C++ structs and classes with PHP classes - this is done by generating a PHP wrapper script which defines proxy classes which calls a set of flat functions which actually wrap the C++ class. You can disable this wrapper layer by passing the command-line option "-noproxy" in which case you'll just get the flat functions.

    This interface file

    %module vector
    
    class Vector {
    public:
      double x, y, z;
      Vector();
      ~Vector();
      double magnitude();
    };
    
    struct Complex {
     double re, im;
    };
    

    Would be used in the following way from PHP:

    <?php
      require "vector.php";
    
      $v = new Vector();
      $v->x = 3;
      $v->y = 4;
      $v->z = 5;
    
      echo "Magnitude of ($v->x, $v->y, $v->z) = " . $v->magnitude() . "\n";
    
      $v = NULL;   # destructor called.
    
      $c = new Complex();
    
      $c->re = 0;
      $c->im = 0;
    
      # $c destructor called when $c goes out of scope.
    ?>
    

    Member variables and methods are accessed using the -> operator.

    34.2.6.1 Using -noproxy

    The -noproxy option flattens the object structure and generates collections of named functions (these are the functions which the PHP class wrappers call). The above example results in the following PHP functions:

    new_Vector();
    Vector_x_set($obj, $d);
    Vector_x_get($obj);
    Vector_y_set($obj, $d);
    Vector_y_get($obj);
    Vector_z_set($obj, $d);
    Vector_z_get($obj);
    Vector_magnitude($obj);
    new_Complex();
    Complex_re_set($obj, $d);
    Complex_re_get($obj);
    Complex_im_set($obj, $d);
    Complex_im_get($obj);
    

    34.2.6.2 Constructors and Destructors

    The constructor is called when new Object() (or new_Object() if using -noproxy) is used to create an instance of the object. If multiple constructors are defined for an object, function overloading will be used to determine which constructor to execute.

    Because PHP uses reference counting to manage resources, simple assignment of one variable to another such as:

    $ref = $v;
    

    causes the symbol $ref to refer to the same underlying object as $v. This does not result in a call to the C++ copy constructor or copy assignment operator.

    One can force execution of the copy constructor by using:

    $o_copy = new Object($o);
    

    Destructors are automatically called when all variables referencing the instance are reassigned or go out of scope. The destructor is not available to be called manually. To force a destructor to be called the programmer can either reassign the variable or call unset($v)

    34.2.6.3 Static Member Variables

    Static member variables in C++ are not wrapped as such in PHP as it does not appear to be possible to intercept accesses to such variables. Therefore, static member variables are wrapped using a class function with the same name, which returns the current value of the class variable. For example

    %module example
    
    class Ko {
      static int threats;
    };
    
    

    would be accessed in PHP as,

    include("example.php");
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    To set the static member variable, pass the value as the argument to the class function, e.g.

    
    Ko::threats(10);
    
    echo "There have now been " . Ko::threats() . " threats\n";
    
    

    34.2.6.4 Static Member Functions

    Static member functions are supported in PHP using the class::function() syntax. For example

    %module example
    class Ko {
      static void threats();
    };
    
    would be executed in PHP as,
    include("example.php");
    Ko::threats();
    

    34.2.6.5 Specifying Implemented Interfaces

    PHP supports the concept of abstract interfaces which a class can implement. Since SWIG 3.0.3, you can tell SWIG that a wrapped class (for example MyIterator) implements the Iterator interface like so:

    %typemap("phpinterfaces") MyIterator "Iterator";
    

    If there are multiple interfaces, just list them separated by commas.

    34.2.7 PHP Pragmas, Startup and Shutdown code

    To place PHP code in the generated "example.php" file one can use the code pragma. The code is inserted after loading the shared object.

    %module example
    %pragma(php) code="
    # This code is inserted into example.php
    echo \"example.php execution\\n\";
    "
    

    Results in the following in "example.php"

    # This code is inserted into example.php
    echo "example.php execution\n";
    

    The include pragma is a short cut to add include statements to the example.php file.

    %module example
    %pragma(php) code="
    include \"include.php\";
    "
    %pragma(php) include="include.php"   // equivalent.
    

    The phpinfo pragma inserts code in the PHP_MINFO_FUNCTION which is called from PHP's phpinfo() function.

    %module example;
    %pragma(php) phpinfo="
      zend_printf("An example of PHP support through SWIG\n");
      php_info_print_table_start();
      php_info_print_table_header(2, \"Directive\", \"Value\");
      php_info_print_table_row(2, \"Example support\", \"enabled\");
      php_info_print_table_end();
    "
    

    To insert code into the PHP_MINIT_FUNCTION, one can use either %init or %minit.

    %module example;
    %init {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    %minit {
      zend_printf("Inserted into PHP_MINIT_FUNCTION\n");
    }
    

    To insert code into the PHP_MSHUTDOWN_FUNCTION, one can use either %shutdown or %mshutdown.

    %module example;
    %mshutdown {
      zend_printf("Inserted into PHP_MSHUTDOWN_FUNCTION\n");
    }
    

    The %rinit and %rshutdown statements are very similar but insert code into the request init (PHP_RINIT_FUNCTION) and request shutdown (PHP_RSHUTDOWN_FUNCTION) code respectively.

    34.3 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to PHP. In particular, if a C++ class has been extended in PHP (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. Support for generating PHP classes has been added in SWIG 1.3.40. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to PHP implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in PHP and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor PHP code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    34.3.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
        Foo(int foo);
        virtual void one();
        virtual void two();
    };
    
    class Bar: public Foo {
    public:
        virtual void three();
    };
    

    then at the PHP side you can define

    require("mymodule.php");
    
    class MyFoo extends Foo {
      function one() {
        print "one from php\n";
      }
    }
    

    34.3.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the PHP proxy classes. The director classes store a pointer to their underlying PHP object. Indeed, this is quite similar to the "_cPtr" and "thisown" members of the PHP proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in PHP via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in PHP were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or PHP. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in PHP, the Zend API is used to call the method of the underlying PHP object (after which the usual virtual method resolution in PHP automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in PHP, unless there's a good reason not to. The reason for this is simple: PHP has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the PHP proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the PHP method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the called and the declaring class name of the given method. If these are not the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in PHP, SWIG creates an instance of the original C++ class and assigns it to ->_cPtr. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through PHP.

    34.3.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. PHP instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the PHP object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special ->thisown property of the proxy class. After setting this property to 0, the director class no longer destroys the PHP object. Assuming no outstanding references to the PHP object remain, the PHP object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Here is an example:

    class Foo {
    public:
        ...
    };
    class FooContainer {
    public:
        void addFoo(Foo *);
        ...
    };
    

    $c = new FooContainer();
    $a = new Foo();
    $a->thisown = 0;
    $c->addFoo($a);
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point.

    34.3.4 Exception unrolling

    With directors routing method calls to PHP, and proxies routing them to C++, the handling of exceptions is an important concern. By default, an exception thrown in PHP code called from C++ causes the PHP interpreter to flag that an exception is thrown, then return passes to C++ as if the PHP function had returned Null. Assuming the directorout typemaps handle this (those SWIG defines by default should) then once control returns to PHP code again, the PHP exception will actually propagate.

    Sometimes this control flow is problematic, and you want to skip any handling in the C++ code. To achieve this, it is necessary to temporarily translate the PHP exception into a C++ exception. This can be achieved using the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
        if ($error == FAILURE) {
            throw Swig::DirectorMethodException();
        }
    }
    

    This code will check the PHP error state after each method call from a director into PHP, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the PHP error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in PHP, travels up to C++ through a proxy class, and then back into PHP via a director method. If an exception occurs in PHP at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
        try { $action }
        catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the PHP error state is still set when Swig::DirectorMethodException is thrown, PHP will register the exception as soon as the C wrapper function returns.

    34.3.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in PHP and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from PHP. Relative to the speed of PHP execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through PHP in order to ensure that the method does not have an extended PHP implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with PHP objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to PHP objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in PHP.

    34.3.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    34.3.7 Miscellaneous

    Director typemaps for STL classes are mostly in place, and hence you should be able to use std::string, etc., as you would any other type.


    35 SWIG and Pike

    This chapter describes SWIG support for Pike. As of this writing, the SWIG Pike module is still under development and is not considered ready for prime time. The Pike module is being developed against the Pike 7.4.10 release and may not be compatible with previous versions of Pike.

    This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

    35.1 Preliminaries

    35.1.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    %module example
    

    %{
    #include "example.h"
    %}

    int fact(int n);

    To build a C extension module for Pike, run SWIG using the -pike option :

    $ swig -pike example.i
    

    If you're building a C++ extension, be sure to add the -c++ option:

    $ swig -c++ -pike example.i
    

    This creates a single source file named example_wrap.c (or example_wrap.cxx, if you ran SWIG with the -c++ option). The SWIG-generated source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option:

    $ swig -pike -o pseudonym.c example.i
    

    35.1.2 Getting the right header files

    In order to compile the C/C++ wrappers, the compiler needs to know the path to the Pike header files. These files are usually contained in a directory such as

    /usr/local/pike/7.4.10/include/pike
    

    There doesn't seem to be any way to get Pike itself to reveal the location of these files, so you may need to hunt around for them. You're looking for files with the names global.h, program.h and so on.

    35.1.3 Using your module

    To use your module, simply use Pike's import statement:

    $ pike
    Pike v7.4 release 10 running Hilfe v3.5 (Incremental Pike Frontend)
    > import example;
    > fact(4);
    (1) Result: 24
    

    35.2 Basic C/C++ Mapping

    35.2.1 Modules

    All of the code for a given SWIG module is wrapped into a single Pike module. Since the name of the shared library that implements your module ultimately determines the module's name (as far as Pike is concerned), SWIG's %module directive doesn't really have any significance.

    35.2.2 Functions

    Global functions are wrapped as new Pike built-in functions. For example,

    %module example
    
    int fact(int n);
    

    creates a new built-in function example.fact(n) that works exactly as you'd expect it to:

    > import example;
    > fact(4);
    (1) Result: 24
    

    35.2.3 Global variables

    Global variables are currently wrapped as a pair of functions, one to get the current value of the variable and another to set it. For example, the declaration

    %module example
    
    double Foo;
    

    will result in two functions, Foo_get() and Foo_set() :

    > import example;
    > Foo_get();
    (1) Result: 3.000000
    > Foo_set(3.14159);
    (2) Result: 0
    > Foo_get();
    (3) Result: 3.141590
    

    35.2.4 Constants and enumerated types

    Enumerated types in C/C++ declarations are wrapped as Pike constants, not as Pike enums.

    35.2.5 Constructors and Destructors

    Constructors are wrapped as create() methods, and destructors are wrapped as destroy() methods, for Pike classes.

    35.2.6 Static Members

    Since Pike doesn't support static methods or data for Pike classes, static member functions in your C++ classes are wrapped as regular functions and static member variables are wrapped as pairs of functions (one to get the value of the static member variable, and another to set it). The names of these functions are prepended with the name of the class. For example, given this C++ class declaration:

    class Shape
    {
    public:
        static void print();
        static int nshapes;
    };
    

    SWIG will generate a Shape_print() method that invokes the static Shape::print() member function, as well as a pair of methods, Shape_nshapes_get() and Shape_nshapes_set(), to get and set the value of Shape::nshapes.


    36 SWIG and Python

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Python. SWIG is compatible with most recent Python versions including Python 3.0 and Python 2.6, as well as older versions dating back to Python 2.0. For the best results, consider using Python 2.3 or newer.

    This chapter covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters. At the very least, make sure you read the "SWIG Basics" chapter.

    36.1 Overview

    To build Python extension modules, SWIG uses a layered approach in which parts of the extension module are defined in C and other parts are defined in Python. The C layer contains low-level wrappers whereas Python code is used to define high-level features.

    This layered approach recognizes the fact that certain aspects of extension building are better accomplished in each language (instead of trying to do everything in C or C++). Furthermore, by generating code in both languages, you get a lot more flexibility since you can enhance the extension module with support code in either language.

    In describing the Python interface, this chapter starts by covering the basics of configuration, compiling, and installing Python modules. Next, the Python interface to common C and C++ programming features is described. Advanced customization features such as typemaps are then described followed by a discussion of low-level implementation details.

    36.2 Preliminaries

    36.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module example
    
    %{
    #define SWIG_FILE_WITH_INIT
    #include "example.h"
    %}
    
    int fact(int n);
    

    The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a python extension, inserting the module init code. This .i file wraps the following simple C file:

    /* File: example.c */
    
    #include "example.h"
    
    int fact(int n) {
        if (n < 0){ /* This should probably return an error, but this is simpler */
            return 0;
        }
        if (n == 0) {
            return 1;
        }
        else {
            /* testing for overflow would be a good idea here */
            return n * fact(n-1);
        }
    }
    
    

    With the header file:

    /* File: example.h */
    
    int fact(int n);
    

    To build a Python module, run SWIG using the -python option:

    $ swig -python example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -python example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and a Python source file example.py. The generated C source file contains the low-level wrappers that need to be compiled and linked with the rest of your C/C++ application to create an extension module. The Python source file contains high-level support code. This is the file that you will import to use the module.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. The name of the Python file is derived from the module name specified with %module. If the module name is example, then a file example.py is created.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    36.2.2 Using distutils

    The preferred approach to building an extension module for python is to compile it with distutils, which comes with all recent versions of python ( Distutils Docs).

    Distutils takes care of making sure that your extension is built with all the correct flags, headers, etc. for the version of Python it is run with. Distutils will compile your extension into a shared object file or DLL (.so on Linux, .pyd on Windows, etc). In addition, distutils can handle installing your package into site-packages, if that is desired. A configuration file (conventionally called: setup.py) describes the extension (and related python modules). The distutils will then generate all the right compiler directives to build it for you.

    Here is a sample setup.py file for the above example:

    #!/usr/bin/env python
    
    """
    setup.py file for SWIG example
    """
    
    from distutils.core import setup, Extension
    
    
    example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
    
    setup (name = 'example',
           version = '0.1',
           author      = "SWIG Docs",
           description = """Simple swig example from docs""",
           ext_modules = [example_module],
           py_modules = ["example"],
           )
    

    In this example, the line: example_module = Extension(....) creates an Extension module object, defining the name as _example , and using the source code files: example_wrap.c, generated by swig, and example.c, your original c source. The swig (and other python extension modules) tradition is for the compiled extension to have the name of the python portion, prefixed by an underscore. If the name of your python module is "example.py", then the name of the corresponding object file will be"_example.so"

    The setup call then sets up distutils to build your package, defining some meta data, and passing in your extension module object. Once this is saved as setup.py, you can build your extension with these commands:

    $ swig -python example.i
    $ python setup.py build_ext --inplace
    

    And a .so, or .pyd or... will be created for you. It will build a version that matches the python that you run the command with. Taking apart the command line:

    • python -- the version of python you want to build for
    • setup.py -- the name of your setup script (it can be called anything, but setup.py is the tradition)
    • build_ext -- telling distutils to build extensions
    • --inplace -- this tells distutils to put the extension lib in the current dir. Otherwise, it will put it inside a build hierarchy, and you'd have to move it to use it.

    The distutils have many other features, consult the python distutils docs for details.

    This same approach works on all platforms if the appropriate compiler is installed. (it can even build extensions to the standard Windows Python using MingGW)

    36.2.3 Hand compiling a dynamic module

    While the preferred approach to building an extension module is to use the distutils, some people like to integrate building extensions with a larger build system, and thus may wish to compile their modules without the distutils. To do this, you need to compile your program using commands like this (shown for Linux):

    $ swig -python example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
    $ gcc -shared example.o example_wrap.o -o _example.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/python directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module prefixed by an underscore. If the name of your module is "example", then the name of the corresponding object file should be "_example.so" or "_examplemodule.so ". The name of the module is specified using the %module directive or the -module command line option.

    Compatibility Note: In SWIG-1.3.13 and earlier releases, module names did not include the leading underscore. This is because modules were normally created as C-only extensions without the extra Python support file (instead, creating Python code was supported as an optional feature). This has been changed in SWIG-1.3.14 and is consistent with other Python extension modules. For example, the socket module actually consists of two files; socket.py and _socket.so. Many other built-in Python modules follow a similar convention.

    36.2.4 Static linking

    An alternative approach to dynamic linking is to rebuild the Python interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Python involves finding the Python source, adding an entry to the Modules/Setup file, and rebuilding the interpreter using the Python Makefile. However, newer Python versions have changed the build process. You may need to edit the 'setup.py' file in the Python distribution instead.

    In earlier versions of SWIG, the embed.i library file could be used to rebuild the interpreter. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "embed.i"       // Include code for a static version of Python
    
    

    The embed.i library file includes supporting code that contains everything needed to rebuild Python. To rebuild the interpreter, you simply do something like this:

    $ swig -python -lembed.i example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/include/python2.7 \
            -I/usr/lib/python2.7/config-x86_64-linux-gnu \
            -I/usr/lib/python2.7/config \
            -L/usr/lib/python2.7/config -lpython2.7 -lm -ldl \
            -o mypython
    

    You will need to supply the same libraries that were used to build Python the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. Assuming this actually works, the new version of Python should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    Compatibility note: The embed.i library file is deprecated and has not been actively maintained for many years. Even though it appears to "work" with Python 2.7, no future support is guaranteed. If using static linking, you might want to rely on a different approach (perhaps using distutils).

    36.2.5 Using your module

    To use your module, simply use the Python import statement. If all goes well, you will be able to run this:

    $ python
    >>> import example
    >>> example.fact(4)
    24
    >>>
    

    A common error received by first-time users is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "example.py", line 2, in ?
        import _example
    ImportError: No module named _example
    

    If you get this message, it means that you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called _example.so. And don't forget the leading underscore (_).

    Another possible error is the following:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: dynamic module does not define init function (init_example)
    >>>                                                               
    

    This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    Traceback (most recent call last):
      File "example.py", line 3, in ?
        import example
    ImportError: ./_example.so: undefined symbol: fact
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o _example.so
    

    If the foo library is compiled as a shared library, you might encounter the following problem when you try to use your module:

    >>> import example
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    ImportError: libfoo.so: cannot open shared object file: No such file or directory
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib  \
          -o _example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Python, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib python
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    36.2.6 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Python interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly. This should be a non-issue if you're using distutils, as it takes care of all that for you. The following is included for historical reasons, and in case you need to compile on your own.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -python example.i
    $ g++ -O2 -fPIC -c example.cxx
    $ g++ -O2 -fPIC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ g++ -shared example.o example_wrap.o -o _example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -python example.i
    $ CC -c example.cxx
    $ CC -c example_wrap.cxx -I/usr/local/include/python2.5
    $ CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o _example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Python interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Python.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Python, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    36.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Python executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    On the Linux x86_64 platform (Opteron or EM64T), besides of the required compiler option -fPIC discussed above, you will need to be careful about the libraries you link with or the library path you use. In general, a Linux distribution will have two set of libraries, one for native x86_64 programs (under /usr/lib64), and another for 32 bits compatibility (under /usr/lib). Also, the compiler options -m32 and -m64 allow you to choose the desired binary format for your python extension.

    36.2.8 Building Python Extensions under Windows

    Building a SWIG extension to Python under Windows is roughly similar to the process used with Unix. Using the distutils, it is essentially identical. If you have the same version of the MS compiler that Python was built with (the python2.4 and python2.5 distributed by python.org are built with Visual Studio 2003), the standard python setup.py build should just work.

    As of python2.5, the distutils support building extensions with MingGW out of the box. Following the instruction here: Building Python extensions for Windows with only free tools should get you started.

    If you need to build it on your own, the following notes are provided:

    You will need to create a DLL that can be loaded into the interpreter. This section briefly describes the use of SWIG with Microsoft Visual C++. As a starting point, many of SWIG's examples include project files (.dsp files) for Visual C++ 6. These can be opened by more recent versions of Visual Studio. You might want to take a quick look at these examples in addition to reading this section.

    In Developer Studio, SWIG should be invoked as a custom build option. This is usually done as follows:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio keeps a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -python -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Python installation under "Additional include directories".
    • Define the symbol __WIN32__ under preprocessor options.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Python library file to your link libraries. For example "python21.lib". Also, set the name of the output file to match the name of your Python module, ie. _example.pyd - Note that _example.dll also worked with Python-2.4 and earlier.
    • Build your project.

    If all went well, SWIG will be automatically invoked whenever you build your project. Any changes made to the interface file will result in SWIG being automatically executed to produce a new version of the wrapper file.

    To run your new Python extension, simply run Python and use the import command as normal. For example :

    $ python
    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    If you get an ImportError exception when importing the module, you may have forgotten to include additional library files when you built your module. If you get an access violation or some kind of general protection fault immediately upon import, you have a more serious problem. This is often caused by linking your extension module against the wrong set of Win32 debug or thread libraries. You will have to fiddle around with the build options of project to try and track this down.

    A 'Debug' build of the wrappers requires a debug build of the Python interpreter. This normally requires building the Python interpreter from source, which is not a job for the feint-hearted. Alternatively you can use the 'Release' build of the Python interpreter with a 'Debug' build of your wrappers by defining the SWIG_PYTHON_INTERPRETER_NO_DEBUG symbol under the preprocessor options. Or you can ensure this macro is defined at the beginning of the wrapper code using the following in your interface file, where _MSC_VER ensures it is only used by the Visual Studio compiler:

    %begin %{
    #ifdef _MSC_VER
    #define SWIG_PYTHON_INTERPRETER_NO_DEBUG
    #endif
    %}
    

    Some users have reported success in building extension modules using Cygwin and other compilers. However, the problem of building usable DLLs with these compilers tends to be rather problematic. For the latest information, you may want to consult the SWIG Wiki.

    36.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Python interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, and so forth. This section briefly covers the essential aspects of this wrapping.

    36.3.1 Modules

    The SWIG %module directive specifies the name of the Python module. If you specify `%module example', then everything is wrapped into a Python 'example' module. Underneath the covers, this module consists of a Python source file example.py and a low-level extension module _example.so. When choosing a module name, make sure you don't use the same name as a built-in Python command or standard module name.

    36.3.2 Functions

    Global functions are wrapped as new Python built-in functions. For example,

    %module example
    int fact(int n);
    

    creates a built-in function example.fact(n) that works exactly like you think it does:

    >>> import example
    >>> print example.fact(4)
    24
    >>>
    

    36.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. However, the underlying mechanism is somewhat different than you might expect due to the way that Python assignment works. When you type the following in Python

    a = 3.4
    

    "a" becomes a name for an object containing the value 3.4. If you later type

    b = a
    

    then "a" and "b" are both names for the object containing the value 3.4. Thus, there is only one object containing 3.4 and "a" and "b" are both names that refer to it. This is quite different than C where a variable name refers to a memory location in which a value is stored (and assignment copies data into that location). Because of this, there is no direct way to map variable assignment in C to variable assignment in Python.

    To provide access to C global variables, SWIG creates a special object called `cvar' that is added to each SWIG generated module. Global variables are then accessed as attributes of this object. For example, consider this interface

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now look at the Python interface:

    >>> import example
    >>> # Print out value of a C global variable
    >>> print example.cvar.My_variable
    4
    >>> # Set the value of a C global variable
    >>> example.cvar.density = 0.8442
    >>> # Use in a math operation
    >>> example.cvar.density = example.cvar.density*1.10
    

    If you make an error in variable assignment, you will receive an error message. For example:

    >>> example.cvar.density = "Hello"
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: C variable 'density (double )'
    >>> 
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    If you would like to access variables using a name other than " cvar", it can be changed using the -globals option :

    $ swig -python -globals myvar example.i
    

    Some care is in order when importing multiple SWIG modules. If you use the "from <file> import *" style of importing, you will get a name clash on the variable `cvar' and you will only be able to access global variables from the last module loaded. To prevent this, you might consider renaming cvar or making it private to the module by giving it a name that starts with a leading underscore. SWIG does not create cvar if there are no global variables in a module.

    36.3.4 Constants and enums

    C/C++ constants are installed as Python objects containing the appropriate value. To create a constant, use #define, enum , or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Python---the name of the constant could be accidentally reassigned to refer to some other object. Unfortunately, there is no easy way for SWIG to generate code that prevents this. You will just have to be careful.

    36.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Python. For example:

    >>> import example
    >>> f = example.fopen("junk", "w")
    >>> example.fputs("Hello World\n", f)
    >>> example.fclose(f)
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values using an especial python container object:

    >>> print f
    <Swig Object of type 'FILE *' at 0xb7d6f470>
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Python. Of course, that isn't much of a concern in this example.

    In older versions of SWIG (1.3.22 or older), pointers were represented using a plain string object. If you have an old package that still requires that representation, or you just feel nostalgic, you can always retrieve it by casting the pointer object to a string:

    >>> print str(f)
    _c0671108_p_FILE
    

    Also, if you need to pass the raw pointer value to some external python library, you can do it by casting the pointer object to an integer:

    >>> print int(f)
    135833352
    

    However, the inverse operation is not possible, i.e., you can't build a SWIG pointer object from a raw integer value.

    Note also that the '0' or NULL pointer is always represented by None, no matter what type swig is addressing. In the previous example, you can call:

    >>> example.fclose(None)
    

    and that will be equivalent to the following, but not really useful, C code:

    FILE *f = NULL;
    fclose(f);
    

    As much as you might be inclined to modify a pointer value directly from Python, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect, it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
        return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    36.3.6 Structures

    If you wrap a C structure, it is wrapped by a Python class. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    >>> v = example.Vector()
    >>> v.x = 3.5
    >>> v.y = 7.2
    >>> print v.x, v.y, v.z
    7.8 -4.5 0.0
    >>> 
    

    Similar access is provided for unions and the data members of C++ classes.

    If you print out the value of v in the above example, you will see something like this:

    >>> print v
    <C Vector instance at _18e31408_p_Vector>
    

    This object is actually a Python instance that has been wrapped around a pointer to the low-level C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object can be found in the .this attribute. For example:

    >>> print v.this
    _18e31408_p_Vector
    >>>
    

    Further details about the Python proxy class are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
        int  x[16];
    };
    

    If accessed in Python, you will see behavior like this:

    >>> b = example.Bar()
    >>> print b.x
    _801861a4_p_int
    >>> 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    >>> c = example.Bar()
    >>> c.x = b.x             # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    >>> b = Bar()
    >>> x = b.f
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    >>> b = Bar()
    >>> b.f.a = 3               # Modify attribute of structure member
    >>> x = b.f                   
    >>> x.a = 3                 # Modifies the same structure
    

    36.3.7 C++ classes

    C++ classes are wrapped by Python classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Python like this:

    >>> l = example.List()
    >>> l.insert("Ale")
    >>> l.insert("Stout")
    >>> l.insert("Lager")
    >>> l.get(1)
    'Stout'
    >>> print l.length
    3
    >>>
    

    Class data members are accessed in the same manner as C structures.

    Static class members present a special problem for Python. Prior to Python-2.2, Python classes had no support for static methods and no version of Python supports static member variables in a manner that SWIG can utilize. Therefore, SWIG generates wrappers that try to work around some of these issues. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Python, the static member can be access in three different ways:

    >>> example.Spam_foo()    # Spam::foo()
    >>> s = example.Spam()
    >>> s.foo()               # Spam::foo() via an instance
    >>> example.Spam.foo()    # Spam::foo(). Python-2.2 only
    

    The first two methods of access are supported in all versions of Python. The last technique is only available in Python-2.2 and later versions.

    Static member variables are currently accessed as global variables. This means, they are accessed through cvar like this:

    >>> print example.cvar.Spam_bar
    7
    

    36.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Python classes that reflect the same inheritance structure. All of the usual Python utility functions work normally:

    >>> b = Bar()
    >>> instance(b, Foo)
    1
    >>> issubclass(Bar, Foo)
    1
    >>> issubclass(Foo, Bar)
    0
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo.

    It is safe to use multiple inheritance with SWIG.

    36.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(const Foo &x);// Pass by const reference
    void spam4(Foo x);       // Pass by value
    void spam5(Foo x[]);     // Array of objects
    

    In Python, there is no detailed distinction like this--specifically, there are only "objects". There are no pointers, references, arrays, and so forth. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    >>> f = Foo()           # Create a Foo
    >>> spam1(f)            # Ok. Pointer
    >>> spam2(f)            # Ok. Reference
    >>> spam3(f)            # Ok. Const reference
    >>> spam4(f)            # Ok. Value.
    >>> spam5(f)            # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam6();
    Foo &spam7();
    Foo  spam8();
    const Foo &spam9();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam8) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Python will release this memory when the return value is garbage collected). The fourth case (spam9) which returns a const reference, in most of the cases will be treated as a returning value, and it will follow the same allocation/deallocation process.

    36.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Python in a straightforward manner:

    >>> foo(3)           # foo(int)
    >>> foo("Hello")     # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
        Foo();
        Foo(const Foo &);
        ...
    };
    

    you can write Python code like this:

    >>> f = Foo()          # Create a Foo
    >>> g = Foo(f)         # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    36.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
    
      Complex operator+=(const Complex &c) const;
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like you expect:

    >>> c = Complex(3, 4)
    >>> d = Complex(7, 8)
    >>> e = c + d
    >>> e.re()
    10.0
    >>> e.im()
    12.0
    >>> c += d
    >>> c.re()
    10.0
    >>> c.im()
    12.0
    
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    Also, be aware that certain operators don't map cleanly to Python. For instance, overloaded assignment operators don't map to Python semantics and will be ignored.

    36.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Python as follows:

    >>> import example
    >>> example.fact(3)
    6
    >>> v = example.Vector()
    >>> v.x = 3.4
    >>> print v.y
    0.0
    >>>
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
        int spam();
    }
    
    namespace Bar {
        int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    36.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
     ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Python:

    >>> import example
    >>> p = example.pairii(3, 4)
    >>> p.first
    3
    >>> p.second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    36.3.14 C++ Smart Pointers

    36.3.14.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Python in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    36.3.14.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Python, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Python, everything should just "work":

    >>> p = example.CreateFoo()          # Create a smart-pointer somehow
    >>> p.x = 3                          # Foo::x
    >>> p.bar()                          # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    >>> f = p.__deref__()     # Returns underlying Foo *
    

    36.3.15 C++ reference counted objects

    The C++ reference counted objects section contains Python examples of memory management using referencing counting.

    36.4 Further details on the Python class interface

    In the previous section, a high-level view of Python wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Python proxy classes. This provides a very natural Python interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    New in SWIG version 2.0.4: The use of Python proxy classes has performance implications that may be unacceptable for a high-performance library. The new -builtin option instructs SWIG to forego the use of proxy classes, and instead create wrapped types as new built-in Python types. When this option is used, the following section ("Proxy classes") does not apply. Details on the use of the -builtin option are in the Built-in Types section.

    36.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
        int x;
        int spam(int);
        ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
        return new Foo();
    }
    void delete_Foo(Foo *f) {
        delete f;
    }
    int Foo_x_get(Foo *f) {
        return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
        f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
        return f->spam(arg1);
    }
    

    These wrappers can be found in the low-level extension module (e.g., _example).

    Using these wrappers, SWIG generates a high-level Python proxy class (also known as a shadow class) like this (shown for Python 2.2):

    import _example
    
    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
        def __del__(self):
            if self.thisown:
                _example.delete_Foo(self.this)
        def spam(self, arg1):
            return _example.Foo_spam(self.this, arg1)
        x = property(_example.Foo_x_get, _example.Foo_x_set)
    

    This class merely holds a pointer to the underlying C++ object ( .this) and dispatches methods and member variable access to that object using the low-level accessor functions. From a user's point of view, it makes the class work normally:

    >>> f = example.Foo()
    >>> f.x = 3
    >>> y = f.spam(5)
    

    The fact that the class has been wrapped by a real Python class offers certain advantages. For instance, you can attach new Python methods to the class and you can even inherit from it (something not supported by Python built-in types until Python 2.2).

    36.4.2 Built-in Types

    The -builtin option provides a significant performance improvement in the wrapped code. To understand the difference between proxy classes and built-in types, let's take a look at what a wrapped object looks like under both circumstances.

    When proxy classes are used, each wrapped object in python is an instance of a pure python class. As a reminder, here is what the __init__ method looks like in a proxy class:

    class Foo(object):
        def __init__(self):
            self.this = _example.new_Foo()
            self.thisown = 1
    

    When a Foo instance is created, the call to _example.new_Foo() creates a new C++ Foo instance; wraps that C++ instance inside an instance of a python built-in type called SwigPyObject; and stores the SwigPyObject instance in the 'this' field of the python Foo object. Did you get all that? So, the python Foo object is composed of three parts:

    • The python Foo instance, which contains...
    • ... an instance of struct SwigPyObject, which contains...
    • ... a C++ Foo instance

    When -builtin is used, the pure python layer is stripped off. Each wrapped class is turned into a new python built-in type which inherits from SwigPyObject, and SwigPyObject instances are returned directly from the wrapped methods. For more information about python built-in extensions, please refer to the python documentation:

    http://docs.python.org/extending/newtypes.html

    36.4.2.1 Limitations

    Use of the -builtin option implies a couple of limitations:

    • python version support:

      • Versions 2.5 and up are fully supported
      • Versions 2.3 and 2.4 are mostly supported; there are problems with director classes and/or sub-classing a wrapped type in python.
      • Versions older than 2.3 are not supported.
    • Some legacy syntax is no longer supported; in particular:

      • The functional interface is no longer exposed. For example, you may no longer call Whizzo.new_CrunchyFrog(). Instead, you must use Whizzo.CrunchyFrog().
      • Static member variables are no longer accessed through the 'cvar' field (e.g., Dances.cvar.FishSlap). They are instead accessed in the idiomatic way (Dances.FishSlap).
    • Wrapped types may not be raised as python exceptions. Here's why: the python internals expect that all sub-classes of Exception will have this struct layout:

      typedef struct {
          PyObject_HEAD
          PyObject *dict;
          PyObject *args;
          PyObject *message;
      } PyBaseExceptionObject;
      

      But swig-generated wrappers expect that all swig-wrapped classes will have this struct layout:

      typedef struct {
          PyObject_HEAD
          void *ptr;
          swig_type_info *ty;
          int own;
          PyObject *next;
          PyObject *dict;
      } SwigPyObject;
      

      There are workarounds for this. For example, if you wrap this class:

      class MyException {
      public:
          MyException (const char *msg_);
          ~MyException ();
      
          const char *what () const;
      
      private:
          char *msg;
      };
      

      ... you can define this python class, which may be raised as an exception:

      class MyPyException(Exception):
          def __init__(self, msg, *args):
              Exception.__init__(self, *args)
              self.myexc = MyException(msg)
          def what(self):
              return self.myexc.what()
      
    • Reverse binary operators (e.g., __radd__) are not supported.

      To illustrate this point, if you have a wrapped class called MyString, and you want to use instances of MyString interchangeably with native python strings, you can define an 'operator+ (const char*)' method :

      class MyString {
      public:
          MyString (const char *init);
          MyString operator+ (const char *other) const;
          ...
      };
      

      SWIG will automatically create an operator overload in python that will allow this:

      from MyModule import MyString
      
      mystr = MyString("No one expects")
      episode = mystr + " the Spanish Inquisition"
      

      This works because the first operand (mystr) defines a way to add a native string to itself. However, the following will not work:

      from MyModule import MyString
      
      mystr = MyString("Parrot")
      episode = "Dead " + mystr
      

      The above code fails, because the first operand -- a native python string -- doesn't know how to add an instance of MyString to itself.

    • If you have multiple SWIG modules that share type information ( more info), the -builtin option requires a bit of extra discipline to ensure that base classes are initialized before derived classes. Specifically:

      • There must be an unambiguous dependency graph for the modules.

      • Module dependencies must be explicitly stated with %import statements in the SWIG interface file.

      As an example, suppose module A has this interface in A.i :

      %module "A";
      
      class Base {
      ...
      };
      

      If you want to wrap another module containing a class that inherits from A, this is how it would look :

      %module "B";
      
      %import "A.i"
      
      class Derived : public Base {
      ...
      };
      

      The import "A.i" statement is required, because module B depends on module A.

      As long as you obey these requirements, your python code may import the modules in any order :

      import B
      import A
      
      assert(issubclass(B.Derived, A.Base))
      

    36.4.2.2 Operator overloads and slots -- use them!

    The entire justification for the -builtin option is improved performance. To that end, the best way to squeeze maximum performance out of your wrappers is to use operator overloads. Named method dispatch is slow in python, even when compared to other scripting languages. However, python built-in types have a large number of "slots", analogous to C++ operator overloads, which allow you to short-circuit named method dispatch for certain common operations.

    By default, SWIG will translate most C++ arithmetic operator overloads into python slot entries. For example, suppose you have this class:

    class Twit {
    public:
        Twit operator+ (const Twit& twit) const;
    
        // Forward to operator+
        Twit add (const Twit& twit) const
        { return *this + twit; }
    };
    

    SWIG will automatically register operator+ as a python slot operator for addition. You may write python code like this:

    from MyModule import Twit
    
    nigel = Twit()
    emily = Twit()
    percival = nigel + emily
    percival = nigel.add(emily)
    

    The last two lines of the python code are equivalent, but the line that uses the '+' operator is much faster.

    In-place operators (e.g., operator+=) and comparison operators (operator==, operator<, etc.) are also converted to python slot operators. For a complete list of C++ operators that are automatically converted to python slot operators, refer to the file python/pyopers.swig in the SWIG library.

    Read about all of the available python slots here: http://docs.python.org/c-api/typeobj.html

    There are two ways to define a python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand.

    To dispatch to a statically defined function, use %feature("python:<slot>"), where <slot> is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods or PyBufferProcs. You may override (almost) all of these slots.

    Let's consider an example setting the tp_hash slot for the MyClass type. This is akin to providing a __hash__ method (for non-builtin types) to make a type hashable. The hashable type can then for example be added to a Python dict.

    %feature("python:tp_hash") MyClass "myHashFunc";
    
    class MyClass {
    public:
      long field1;
      long field2;
      ...
    };
    
    %{
    #if PY_VERSION_HEX >= 0x03020000
      static Py_hash_t myHashFunc(PyObject *pyobj)
    #else
      static long myHashFunc(PyObject *pyobj)
    #endif
      {
        MyClass *cobj;
        // Convert pyobj to cobj
        return (cobj->field1 * (cobj->field2 << 7));
      }
    %}
    

    If you examine the generated code, the supplied hash function will now be the function callback in the tp_hash slot for the builtin type for MyClass:

    static PyHeapTypeObject SwigPyBuiltin__MyClass_type = {
        ...
        (hashfunc) myHashFunc,       /* tp_hash */
        ...
    

    NOTE: It is the responsibility of the programmer (that's you!) to ensure that a statically defined slot function has the correct signature, the hashfunc typedef in this case.

    If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example:

    %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc;
    
    #if PY_VERSION_HEX < 0x03020000
      #define Py_hash_t long
    #endif
    
    class MyClass {
      public:
        Py_hash_t myHashFunc() const;
        ...
    };
    

    NOTE: Some python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshal the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate the chosen closure function.

    There is further information on %feature("python:slot") in the file python/pyopers.swig in the SWIG library.

    36.4.3 Memory management

    NOTE: Although this section refers to proxy objects, everything here also applies when the -builtin option is used.

    Associated with proxy object, is an ownership flag .thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Python interpreter will destroy the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Python automatically takes ownership of the result. For example:

    class Foo {
    public:
        Foo();
        Foo bar();
    };
    

    In Python:

    >>> f = Foo()
    >>> f.thisown
    1
    >>> g = f.bar()
    >>> g.thisown
    1
    

    On the other hand, when pointers are returned to Python, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
        ...
        Foo *spam();
        ...
    };
    

    >>> f = Foo()
    >>> s = f.spam()
    >>> print s.thisown
    0
    >>>
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Python to assume ownership and destroy it!

    A good way to indicate that ownership should be set for a returned pointer is to use the %newobject directive.

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
        int  value;
        Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Python, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    >>> f = example.Foo()
    >>> f.thisown
    1
    >>> example.cvar.head = f           
    >>> f.thisown
    0
    >>>
    

    In this case, C is now holding a reference to the object---you probably don't want Python to destroy it. Similarly, this occurs for members. For example:

    >>> f = example.Foo()
    >>> g = example.Foo()
    >>> f.thisown
    1
    >>> g.thisown
    1
    >>> f.next = g
    >>> g.thisown
    0
    >>>
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Python code:

    >>> v = Object()           # Create an object
    >>> n = Node()             # Create a node
    >>> n.set_value(v)         # Set value
    >>> v.thisown
    1
    >>> del v
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Python still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    >>> v.thisown = 0
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    36.4.4 Python 2.2 and classic classes

    SWIG makes every attempt to preserve backwards compatibility with older versions of Python to the extent that it is possible. However, in Python-2.2, an entirely new type of class system was introduced. This new-style class system offers many enhancements including static member functions, properties (managed attributes), and class methods. Details about all of these changes can be found on www.python.org and is not repeated here.

    To address differences between Python versions, SWIG currently emits dual-mode proxy class wrappers. In Python-2.2 and newer releases, these wrappers encapsulate C++ objects in new-style classes that take advantage of new features (static methods and properties). However, if these very same wrappers are imported into an older version of Python, old-style classes are used instead.

    This dual-nature of the wrapper code means that you can create extension modules with SWIG and those modules will work with all versions of Python ranging from Python-2.0 to the very latest release. Moreover, the wrappers take advantage of Python-2.2 features when available.

    For the most part, the interface presented to users is the same regardless of what version of Python is used. The only incompatibility lies in the handling of static member functions. In Python-2.2, they can be accessed via the class itself. In Python-2.1 and earlier, they have to be accessed as a global function or through an instance (see the earlier section).

    36.5 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Python. In particular, if a C++ class has been extended in Python (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG 1.3.18 to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Python implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Python and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Python code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    36.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
        Foo(int foo);
        virtual ~Foo();
        virtual void one();
        virtual void two();
    };
    
    class Bar: public Foo {
    public:
        virtual void three();
    };
    

    then at the python side you can define

    import mymodule
    
    class MyFoo(mymodule.Foo):
        def __init__(self, foo):
            mymodule.Foo.__init__(self, foo)
    #       super().__init__(foo) # Alternative construction for Python3
    
        def one(self):
            print "one from python"
    

    36.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Python proxy classes. The director classes store a pointer to their underlying Python object and handle various issues related to object ownership. Indeed, this is quite similar to the "this" and "thisown" members of the Python proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in Python via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Python were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Python. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Python, the Python API is used to call the method of the underlying Python object (after which the usual virtual method resolution in Python automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Python, unless there's a good reason not to. The reason for this is simple: Python has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Python proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Python method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Python object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Python, SWIG creates an instance of the original C++ class and assigns it to .this. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Python.

    36.5.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Python instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to the Python object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special __disown__() method of the proxy class. After calling this method, the .thisown flag is set to zero, and the director class increments the reference count of the Python object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Python object remain, the Python object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    To help ensure that no references to the Python object remain after calling __disown__(), this method returns a weak reference to the Python object. Weak references are only available in Python versions 2.1 and higher, so for older versions you must explicitly delete all references. Here is an example:

    class Foo {
    public:
        ...
    };
    class FooContainer {
    public:
        void addFoo(Foo *);
        ...
    };
    

    >>> c = FooContainer()
    >>> a = Foo().__disown__()
    >>> c.addFoo(a)
    >>> b = Foo()
    >>> b = b.__disown__()
    >>> c.addFoo(b)
    >>> c.addFoo(Foo().__disown__())
    

    In this example, we are assuming that FooContainer will take care of deleting all the Foo pointers it contains at some point. Note that no hard references to the Foo objects remain in Python.

    36.5.4 Exception unrolling

    With directors routing method calls to Python, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Python. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
        if ($error != NULL) {
            throw Swig::DirectorMethodException();
        }
    }
    

    This code will check the Python error state after each method call from a director into Python, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler. Currently no information about the Python error is stored in the Swig::DirectorMethodException object, but this will likely change in the future.

    It may be the case that a method call originates in Python, travels up to C++ through a proxy class, and then back into Python via a director method. If an exception occurs in Python at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
        try { $action }
        catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Python error state is still set when Swig::DirectorMethodException is thrown, Python will register the exception as soon as the C wrapper function returns.

    36.5.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Python and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Python. Relative to the speed of Python execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Python in order to ensure that the method does not have an extended Python implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Python objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Python objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Python.

    36.5.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    36.5.7 Miscellaneous

    Director typemaps for STL classes are in place, and hence you should be able to use std::vector, std::string, etc., as you would any other type.

    Note: The director typemaps for return types based in const references, such as

    class Foo {
    …
        virtual const int& bar();
    …
    };
    

    will work only for simple call scenarios. Usually the resulting code is neither thread or reentrant safe. Hence, the user is advised to avoid returning const references in director methods. For example, the user could modify the method interface to use lvalue return types, wherever possible, for example

    class Foo {
    …
        virtual int bar();
    …
    };
    

    If that is not possible, the user should avoid enabling the director feature for reentrant, recursive or threaded member methods that return const references.

    36.6 Common customization features

    The last section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve your the interface to an extension module.

    36.6.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Python, but there may be no easy way to call it. For example, you might get errors like this:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_a_4__double
    

    The problem here is that there is no easy way to construct and manipulate a suitable double [4][4] value to use. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Python, you could then write code like this:

    >>> a = new_mat44()
    >>> mat44_set(a, 0, 0, 1.0)
    >>> mat44_set(a, 1, 1, 1.0)
    >>> mat44_set(a, 2, 2, 1.0)
    ...
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to clean this up using Python code, typemaps, and other customization features as covered in later sections.

    36.6.2 Adding additional Python code

    If writing support code in C isn't enough, it is also possible to write code in Python. This code gets inserted in to the .py file created by SWIG. One use of Python code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %pythoncode %{
    def set_transform(im, x):
        a = new_mat44()
        for i in range(4):
            for j in range(4):
                mat44_set(a, i, j, x[i][j])
        _example.set_transform(im, a)
        free_mat44(a)
    %}
    

    In this example, set_transform() provides a high-level Python interface built on top of low-level helper functions. For example, this code now seems to work:

    >>> a = [
    ...   [1, 0, 0, 0],
    ...   [0, 1, 0, 0],
    ...   [0, 0, 1, 0],
    ...   [0, 0, 0, 1]]
    >>> set_transform(im, a)
    >>>
    

    Admittedly, this whole scheme for wrapping the two-dimension array argument is rather ad-hoc. Besides, shouldn't a Python list or a Numeric Python array just work normally? We'll get to those examples soon enough. For now, think of this example as an illustration of what can be done without having to rely on any of the more advanced customization features.

    There is also %pythonbegin which is another directive very similar to %pythoncode, but generates the given Python code at the beginning of the .py file. This directive works in the same way as %pythoncode, except the code is copied just after the SWIG banner (comment) at the top of the file, before any real code. This provides an opportunity to add your own description in a comment near the top of the file as well as Python imports that have to appear at the top of the file, such as "from __future__ import" statements.

    The following shows example usage for Python 2.6 to use print as it can in Python 3, that is, as a function instead of a statement:

    %pythonbegin %{
    # This module provides wrappers to the Whizz Bang library
    %}
    
    %pythonbegin %{
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    %}
    

    which can be seen when viewing the first few lines of the generated .py file:

    # This file was automatically generated by SWIG (http://www.swig.org).
    # Version 2.0.11
    #
    # Do not make changes to this file unless you know what you are doing--modify
    # the SWIG interface file instead.
    
    # This module provides wrappers to the Whizz Bang library
    
    from __future__ import print_function
    print("Loading", "Whizz", "Bang", sep=' ... ')
    
    

    When using %pythoncode and %pythonbegin you generally want to make sure that the block is delimited by %{ and %}. If you delimit it with { and } then any lines with a leading # will be handled by SWIG as preprocessor directives, when you probably meant them as Python comments. Prior to SWIG 3.0.3, invalid preprocessor directives were silently ignored, so generally using the wrong delimiters resulted in such comments not appearing in the generated output (though a comment starting with a valid preprocessor directive could cause problems, for example: # error handling). SWIG 3.0.3 and later report an error for invalid preprocessor directives, so you may have to update existing interface files to delimit blocks of Python code correctly.

    As an alternative to providing a block containing Python code, you can include python code from a file. The code is inserted exactly as in the file, so this avoids any issues with the SWIG preprocessor. It's a good approach if you have a non-trivial chunk of Python code to insert. To use this feature you specify a filename in double quotes, for example:

    %pythoncode "somecode.py"
    

    Sometimes you may want to replace or modify the wrapper function that SWIG creates in the proxy .py file. The Python module in SWIG provides some features that enable you to do this. First, to entirely replace a proxy function you can use %feature("shadow"). For example:

    %module example
    
    // Rewrite bar() python code
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        #do something before
        $action
        #do something after
    %}
        
    class Foo {
    public:
        int bar(int x);
    };
    

    where $action will be replaced by the call to the C/C++ proper method.

    Often the proxy function created by SWIG is fine, but you simply want to add code to it without touching the rest of the generated function body. For these cases SWIG provides the pythonprepend and pythonappend features which do exactly as their names suggest. The pythonprepend feature will insert its value at the beginning of the proxy function, and pythonappend will insert code at the end of the proxy, just before the return statement.

    %module example
    
    // Add python code to bar() 
    
    %feature("pythonprepend") Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %feature("pythonappend") Foo::bar(int) %{
        #do something after C++ call
    %}
    
        
    class Foo {
    public:
        int bar(int x);
    };
    

    Notes: Usually the pythonappend and pythonprepend features are safer to use than the shadow feature. Also, from SWIG version 1.3.28 you can use the directive forms %pythonappend and %pythonprepend as follows:

    %module example
    
    // Add python code to bar() 
    
    %pythonprepend Foo::bar(int) %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar(int) %{
        #do something after C++ call
    %}
    
        
    class Foo {
    public:
        int bar(int x);
    };
    

    Note that when the underlying C++ method is overloaded, there is only one proxy Python method for multiple C++ methods. In this case, only one of parsed methods is examined for the feature. You are better off specifying the feature without the argument list to ensure it will get used, as it will then get attached to all the overloaded C++ methods. For example:

    %module example
    
    // Add python code to bar()
    
    %pythonprepend Foo::bar %{
        #do something before C++ call
    %}
    
    %pythonappend Foo::bar %{
        #do something after C++ call
    %}
    
    
    class Foo {
    public:
        int bar(int x);
        int bar();
    };
    

    The same applies for overloaded constructors.

    36.6.3 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods--at least in the Python interface. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *__str__() {
        static char tmp[1024];
        sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
        return tmp;
      }
      Vector(double x, double y, double z) {
        Vector *v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
    };
    

    Now, in Python

    >>> v = example.Vector(2, 3, 4)
    >>> print v
    Vector(2, 3, 4)
    >>>
    

    %extend can be used for many more tasks than this. For example, if you wanted to overload a Python operator, you might do this:

    %extend Vector {
      Vector __add__(Vector *other) {
        Vector v;
        v.x = $self->x + other->x;
        v.y = $self->y + other->y;
        v.z = $self->z + other->z;
        return v;
      }
    };
    

    Use it like this:

    >>> import example
    >>> v = example.Vector(2, 3, 4)
    >>> w = example.Vector(10, 11, 12)
    >>> print v+w
    Vector(12, 14, 16)
    >>> 
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Python interface.

    36.6.4 Exception handling with %exception

    If a C or C++ function throws an error, you may want to convert that error into a Python exception. To do this, you can use the %exception directive. %exception simply lets you rewrite part of the generated wrapper code to include an error check.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        PyErr_SetString(PyExc_MemoryError, "Not enough memory");
        SWIG_fail;
      }
    }
    void *malloc(size_t nbytes);
    

    In Python,

    >>> a = example.malloc(2000000000)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    MemoryError: Not enough memory
    >>>
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception {
      $action
      if (err_occurred()) {
        PyErr_SetString(PyExc_RuntimeError, err_message());
        SWIG_fail;
      }
    }
    

    No declaration name is given to %exception, it is applied to all wrapper functions.

    C++ exceptions are also easy to handle. For example, you can write code like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        PyErr_SetString(PyExc_IndexError, const_cast<char*>(e.what()));
        SWIG_fail;
      }
    }
    
    class Base {
    public:
      Foo *getitem(int index);      // Exception handled added
      ...
    };
    

    When raising a Python exception from C, use the PyErr_SetString() function as shown above followed by SWIG_fail . The following exception types can be used as the first argument.

    PyExc_ArithmeticError
    PyExc_AssertionError
    PyExc_AttributeError
    PyExc_EnvironmentError
    PyExc_EOFError
    PyExc_Exception
    PyExc_FloatingPointError
    PyExc_ImportError
    PyExc_IndexError
    PyExc_IOError
    PyExc_KeyError
    PyExc_KeyboardInterrupt
    PyExc_LookupError
    PyExc_MemoryError
    PyExc_NameError
    PyExc_NotImplementedError
    PyExc_OSError
    PyExc_OverflowError
    PyExc_RuntimeError
    PyExc_StandardError
    PyExc_SyntaxError
    PyExc_SystemError
    PyExc_TypeError
    PyExc_UnicodeError
    PyExc_ValueError
    PyExc_ZeroDivisionError
    

    SWIG_fail is a C macro which when called within the context of SWIG wrapper function, will jump to the error handler code. This will call any cleanup code (freeing any temp variables) and then return from the wrapper function so that the Python interpreter can raise the Python exception. This macro should always be called after setting a Python error in code snippets, such as typemaps and %exception , that are ultimately generated into the wrapper function.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter.

    36.7 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings, binary data, and arrays. This chapter discusses the common techniques for solving these problems.

    36.7.1 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Python, this allows you to pass simple values. For example:

    >>> a = add(3, 4)
    >>> print a
    7
    >>> b = sub(7, 4)
    >>> print b
    3
    >>>
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Python, a mutated parameter shows up as a return value. For example:

    >>> a = negate(3)
    >>> print a
    -3
    >>>
    

    Note: Since most primitive Python objects are immutable, it is not possible to perform in-place modification of a Python object passed as a parameter.

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Python, the function will return multiple values.

    bytes, success = send_message("Hello World")
    if not success:
        print "Whoa!"
    else:
        print "Sent", bytes
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Python:

    >>> r, c = get_dimensions(m)
    

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    may not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    36.7.2 Simple pointers

    If you must work with simple pointers such as int * or double * and you don't want to use typemaps.i, consider using the cpointer.i library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Python, you would use the functions like this:

    >>> result = new_intp()
    >>> print result
    _108fea8_p_int
    >>> add(3, 4, result)
    >>> print intp_value(result)
    7
    >>>
    

    If you replace %pointer_functions() by %pointer_class(type, name), the interface is more class-like.

    >>> result = intp()
    >>> add(3, 4, result)
    >>> print result.value()
    7
    

    See the SWIG Library chapter for further details.

    36.7.3 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
        int i, sum = 0;
        for (i = 0; i < nitems; i++) {
            sum += first[i];
        }
        return sum;
    }
    

    To wrap this into Python, you need to pass an array pointer as the first argument. A simple way to do this is to use the carrays.i library file. For example:

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Python:

    >>> a = intArray(10000000)         # Array of 10-million integers
    >>> for i in xrange(10000):        # Set some values
    ...     a[i] = i
    >>> sumitems(a, 10000)
    49995000
    >>>
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    36.7.4 String handling

    If a C function has an argument of char *, then a Python string can be passed as input. For example:

    // C
    void foo(char *s);
    
    # Python
    >>> foo("Hello")
    

    When a Python string is passed as a parameter, the C function receives a pointer to the raw data contained in the string. Since Python strings are immutable, it is illegal for your program to change the value. In fact, doing so will probably crash the Python interpreter.

    If your program modifies the input parameter or uses it to return data, consider using the cstring.i library file described in the SWIG Library chapter.

    When functions return a char *, it is assumed to be a NULL-terminated string. Data is copied into a new Python string and returned.

    If your program needs to work with binary data, you can use a typemap to expand a Python string into a pointer/length argument pair. As luck would have it, just such a typemap is already defined. Just do this:

    %apply (char *STRING, int LENGTH) { (char *data, int size) };
    ...
    int parity(char *data, int size, int initial);
    

    Now in Python:

    >>> parity("e\x09ffss\x00\x00\x01\nx", 0)
    

    If you need to return binary data, you might use the cstring.i library file. The cdata.i library can also be used to extra binary data from arbitrary pointers.

    36.7.5 Default arguments

    C++ default argument code generation is documented in the main Default arguments section. There is also an optional Python specific feature that can be used called the python:cdefaultargs feature flag. By default, SWIG attempts to convert C++ default argument values into Python values and generates code into the Python layer containing these values. For example:

    struct CDA {
      int fff(int a = 1, bool b = false);
    };
    

    From Python this can be called as follows:

    >>> CDA().fff()        # C++ layer receives a=1 and b=false
    >>> CDA().fff(2)       # C++ layer receives a=2 and b=false
    >>> CDA().fff(3, True) # C++ layer receives a=3 and b=true
    

    The default code generation in the Python layer is:

    class CDA(object):
        ...
        def fff(self, a=1, b=False):
            return _default_args.CDA_fff(self, a, b)
    

    Adding the feature:

    %feature("python:cdefaultargs") CDA::fff;
    struct CDA {
      int fff(int a = 1, bool b = false);
    

    results in identical behaviour when called from Python, however, it results in different code generation:

    class CDA(object):
        ...
        def fff(self, *args):
            return _default_args.CDA_fff(self, *args)
    

    The default arguments are obtained in the C++ wrapper layer instead of the Python layer. Some code generation modes are quite different, eg -builtin and -fastproxy, and are unaffected by python:cdefaultargs as the default values are always obtained from the C++ layer.

    Note that not all default arguments can be converted into a Python equivalent. When SWIG does not convert them, it will generate code to obtain them from the C++ layer as if python:cdefaultargs was specified. This will happen if just one argument cannot be converted into a Python equivalent. This occurs typically when the argument is not fully numeric, such as int(1):

    struct CDA {
      int fff(int a = int(1), bool b = false);
    };
    

    Compatibility Note: SWIG-3.0.6 introduced the python:cdefaultargs feature. Versions of SWIG prior to this varied in their ability to convert C++ default values into equivalent Python default argument values.

    36.8 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Python C API as well as the material in the " Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Python interface or if you want to elevate your guru status.

    36.8.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Python to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) PyLong_AsLong($input);
      printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type PyObject *.

    When this example is compiled into a Python module, it operates as follows:

    >>> from example import *
    >>> fact(6)
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = (int) PyLong_AsLong($input);
      if ($1 < 0) {
        PyErr_SetString(PyExc_ValueError, "Expected a nonnegative value.");
        SWIG_fail;
      }
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) PyLong_AsLong($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = PyString_AsString($input);
      $2 = PyString_Size($input);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Python object. This allows the function to be used like this (notice how the length parameter is omitted):

    >>> example.count('e', 'Hello World')
    1
    >>>
    

    36.8.2 Python typemaps

    The previous section illustrated an "in" typemap for converting Python objects to C. A variety of different typemap methods are defined by the Python module. For example, to convert a C integer back into a Python object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = PyInt_FromLong((long) $1);
    }
    

    A detailed list of available methods can be found in the " Typemaps" chapter.

    However, the best source of typemap information (and examples) is probably the Python module itself. In fact, all of SWIG's default type handling is defined by typemaps. You can view these typemaps by looking at the files in the SWIG library. Just take into account that in the latest versions of swig (1.3.22+), the library files are not very pristine clear for the casual reader, as they used to be. The extensive use of macros and other ugly techniques in the latest version produce a very powerful and consistent python typemap library, but at the cost of simplicity and pedagogic value.

    To learn how to write a simple or your first typemap, you better take a look at the SWIG library version 1.3.20 or so.

    36.8.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Python.

    $input

    A PyObject * holding a raw Python object with an argument or variable value.

    $result

    A PyObject * that holds the result to be returned to Python.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Python name of the wrapper function being created.

    36.8.4 Useful Python Functions

    When you write a typemap, you usually have to work directly with Python objects. The following functions may prove to be useful.

    Python Integer Functions

    PyObject *PyInt_FromLong(long l);
    long      PyInt_AsLong(PyObject *);
    int       PyInt_Check(PyObject *);
    

    Python Floating Point Functions

    PyObject *PyFloat_FromDouble(double);
    double    PyFloat_AsDouble(PyObject *);
    int       PyFloat_Check(PyObject *);
    

    Python String Functions

    PyObject *PyString_FromString(char *);
    PyObject *PyString_FromStringAndSize(char *, lint len);
    int       PyString_Size(PyObject *);
    char     *PyString_AsString(PyObject *);
    int       PyString_Check(PyObject *);
    

    Python List Functions

    PyObject *PyList_New(int size);
    int       PyList_Size(PyObject *list);
    PyObject *PyList_GetItem(PyObject *list, int i);
    int       PyList_SetItem(PyObject *list, int i, PyObject *item);
    int       PyList_Insert(PyObject *list, int i, PyObject *item);
    int       PyList_Append(PyObject *list, PyObject *item);
    PyObject *PyList_GetSlice(PyObject *list, int i, int j);
    int       PyList_SetSlice(PyObject *list, int i, int , PyObject *list2);
    int       PyList_Sort(PyObject *list);
    int       PyList_Reverse(PyObject *list);
    PyObject *PyList_AsTuple(PyObject *list);
    int       PyList_Check(PyObject *);
    

    Python Tuple Functions

    PyObject *PyTuple_New(int size);
    int       PyTuple_Size(PyObject *);
    PyObject *PyTuple_GetItem(PyObject *, int i);
    int       PyTuple_SetItem(PyObject *, int i, PyObject *item);
    PyObject *PyTuple_GetSlice(PyObject *t, int i, int j);
    int       PyTuple_Check(PyObject *);
    

    Python Dictionary Functions

    PyObject *PyDict_New();
    int       PyDict_Check(PyObject *);
    int       PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
    int       PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
    int       PyDict_DelItem(PyObject *p, PyObject *key);
    int       PyDict_DelItemString(PyObject *p, char *key);
    PyObject* PyDict_Keys(PyObject *p);
    PyObject* PyDict_Values(PyObject *p);
    PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
    PyObject* PyDict_GetItemString(PyObject *p, const char *key);
    int       PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
    Py_ssize_t PyDict_Size(PyObject *p);
    int       PyDict_Update(PyObject *a, PyObject *b);
    int       PyDict_Merge(PyObject *a, PyObject *b, int override);
    PyObject* PyDict_Items(PyObject *p);
    

    Python File Conversion Functions

    PyObject *PyFile_FromFile(FILE *f);
    FILE     *PyFile_AsFile(PyObject *);
    int       PyFile_Check(PyObject *);
    

    Abstract Object Interface

    write me
    

    36.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "python.swg" and "typemaps.i " in the SWIG library.

    36.9.1 Converting Python list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Python list object to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int size = PyList_Size($input);
        int i = 0;
        $1 = (char **) malloc((size+1)*sizeof(char *));
        for (i = 0; i < size; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $1[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($1);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $1[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    // This cleans up the char ** array we malloc'd before the function call
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}
    
    

    When this module is compiled, the wrapped C function now operates as follows :

    >>> from argv import *
    >>> print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John
    5
    

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    36.9.2 Expanding a Python object into multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Python list as the char **argv. This allows the function to be used from Python as follows:

    >>> foo(4, ["foo", "bar", "spam", "1"])
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example:

    %typemap(in) (int argc, char **argv) {
      /* Check if is a list */
      if (PyList_Check($input)) {
        int i;
        $1 = PyList_Size($input);
        $2 = (char **) malloc(($1+1)*sizeof(char *));
        for (i = 0; i < $1; i++) {
          PyObject *o = PyList_GetItem($input, i);
          if (PyString_Check(o)) {
            $2[i] = PyString_AsString(PyList_GetItem($input, i));
          } else {
            free($2);
            PyErr_SetString(PyExc_TypeError, "list must contain strings");
            SWIG_fail;
          }
        }
        $2[i] = 0;
      } else {
        PyErr_SetString(PyExc_TypeError, "not a list");
        SWIG_fail;
      }
    }
    
    %typemap(freearg) (int argc, char **argv) {
      free((char *) $2);
    }
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Python object.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    >>> foo(["foo", "bar", "spam", "1"])
    

    If your function is overloaded in C++, for example:

    int foo(int argc, char **argv);
    int foo();
    

    don't forget to also provide a suitable typecheck typemap for overloading such as:

    %typecheck(SWIG_TYPECHECK_STRING_ARRAY) (int argc, char **argv) {
      $1 = PyList_Check($input) ? 1 : 0;
    }
    

    If you don't you'll get an error message along the lines of:

    Traceback (most recent call last):
      File "runme.py", line 3, in >module<
        example.foo(["foo", "bar", "spam", "1"])
    NotImplementedError: Wrong number or type of arguments for overloaded function 'foo'.
      Possible C/C++ prototypes are:
        foo(int, char **)
        foo()
    

    36.9.3 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in arguments rather than in the return value of a function. For example:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      ... Do a bunch of stuff ...
      *out1 = result1;
      *out2 = result2;
      return status;
    }
    

    A typemap can be used to handle this case as follows :

    %module outarg
    
    // This tells SWIG to treat an double * argument with name 'OutValue' as
    // an output value.  We'll append the value to the current result which 
    // is guaranteed to be a List object by SWIG.
    
    %typemap(argout) double *OutValue {
      PyObject *o, *o2, *o3;
      o = PyFloat_FromDouble(*$1);
      if ((!$result) || ($result == Py_None)) {
        $result = o;
      } else {
        if (!PyTuple_Check($result)) {
          PyObject *o2 = $result;
          $result = PyTuple_New(1);
          PyTuple_SetItem($result, 0, o2);
        }
        o3 = PyTuple_New(1);
        PyTuple_SetItem(o3, 0, o);
        o2 = $result;
        $result = PySequence_Concat(o2, o3);
        Py_DECREF(o2);
        Py_DECREF(o3);
      }
    }
    
    int spam(double a, double b, double *OutValue, double *OutValue);
    
    

    The typemap works as follows. First, a check is made to see if any previous result exists. If so, it is turned into a tuple and the new output value is concatenated to it. Otherwise, the result is returned normally. For the sample function spam(), there are three output values--meaning that the function will return a 3-tuple of the results.

    As written, the function must accept 4 arguments as input values, last two being pointers to doubles. If these arguments are only used to hold output values (and have no meaningful input value), an additional typemap can be written. For example:

    %typemap(in, numinputs=0) double *OutValue(double temp) {
      $1 = &temp;
    }
    
    

    By specifying numinputs=0, the input value is ignored. However, since the argument still has to be set to some meaningful value before calling C, it is set to point to a local variable temp. When the function stores its output value, it will simply be placed in this local variable. As a result, the function can now be used as follows:

    >>> a = spam(4, 5)
    >>> print a
    (0, 2.45, 5.0)
    >>> x, y, z = spam(4, 5)
    >>>
    

    36.9.4 Mapping Python tuples into small arrays

    In some applications, it is sometimes desirable to pass small arrays of numbers as arguments. For example :

    extern void set_direction(double a[4]);       // Set direction vector
    

    This too, can be handled used typemaps as follows :

    // Grab a 4 element array as a Python 4-tuple
    %typemap(in) double[4](double temp[4]) {   // temp[4] becomes a local variable
      int i;
      if (PyTuple_Check($input)) {
        if (!PyArg_ParseTuple($input, "dddd", temp, temp+1, temp+2, temp+3)) {
          PyErr_SetString(PyExc_TypeError, "tuple must have 4 elements");
          SWIG_fail;
        }
        $1 = &temp[0];
      } else {
        PyErr_SetString(PyExc_TypeError, "expected a tuple.");
        SWIG_fail;
      }
    }
    
    

    This allows our set_direction function to be called from Python as follows :

    >>> set_direction((0.5, 0.0, 1.0, -0.25))
    

    Since our mapping copies the contents of a Python tuple into a C array, such an approach would not be recommended for huge arrays, but for small structures, this approach works fine.

    36.9.5 Mapping sequences to C arrays

    Suppose that you wanted to generalize the previous example to handle C arrays of different sizes. To do this, you might write a typemap as follows:

    // Map a Python sequence into any sized C double array
    %typemap(in) double[ANY](double temp[$1_dim0]) {
      int i;
      if (!PySequence_Check($input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        SWIG_fail;
      }
      if (PyObject_Length($input) != $1_dim0) {
        PyErr_SetString(PyExc_ValueError, "Expecting a sequence with $1_dim0 elements");
        SWIG_fail;
      }
      for (i =0; i < $1_dim0; i++) {
        PyObject *o = PySequence_GetItem($input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          SWIG_fail;
        }
        temp[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      $1 = &temp[0];
    }
    

    In this case, the variable $1_dim0 is expanded to match the array dimensions actually used in the C code. This allows the typemap to be applied to types such as:

    void foo(double x[10]);
    void bar(double a[4], double b[8]);
    

    Since the above typemap code gets inserted into every wrapper function where used, it might make sense to use a helper function instead. This will greatly reduce the amount of wrapper code. For example:

    %{
    static int convert_darray(PyObject *input, double *ptr, int size) {
      int i;
      if (!PySequence_Check(input)) {
        PyErr_SetString(PyExc_TypeError, "Expecting a sequence");
        return 0;
      }
      if (PyObject_Length(input) != size) {
        PyErr_SetString(PyExc_ValueError, "Sequence size mismatch");
        return 0;
      }
      for (i =0; i < size; i++) {
        PyObject *o = PySequence_GetItem(input, i);
        if (!PyFloat_Check(o)) {
          Py_XDECREF(o);
          PyErr_SetString(PyExc_ValueError, "Expecting a sequence of floats");
          return 0;
        }
        ptr[i] = PyFloat_AsDouble(o);
        Py_DECREF(o);
      }
      return 1;
    }
    %}
    
    %typemap(in) double [ANY](double temp[$1_dim0]) {
      if (!convert_darray($input, temp, $1_dim0)) {
        SWIG_fail;
      }
      $1 = &temp[0];
    }
    

    36.9.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Python object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is the bitwise-or of several flag values including SWIG_POINTER_EXCEPTION and SWIG_POINTER_DISOWN . The first flag makes the function raise an exception on type error. The second flag additionally steals ownership of an object. Returns 0 on success and -1 on error.

    PyObject *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Python pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Python should take ownership of the pointer.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    PyObject *obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    Although the pointer handling functions are primarily intended for manipulating low-level pointers, both functions are fully aware of Python proxy classes. Specifically, SWIG_ConvertPtr() will retrieve a pointer from any object that has a this attribute. In addition, SWIG_NewPointerObj() can automatically generate a proxy class object (if applicable).

    36.10 Docstring Features

    Using docstrings in Python code is becoming more and more important and more tools are coming on the scene that take advantage of them, everything from full-blown documentation generators to class browsers and popup call-tips in Python-aware IDEs. Given the way that SWIG generates the proxy code by default, your users will normally get something like "function_name(*args)" in the popup calltip of their IDE which is next to useless when the real function prototype might be something like this:

    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    The features described in this section make it easy for you to add docstrings to your modules, functions and methods that can then be used by the various tools out there to make the programming experience of your users much simpler.

    36.10.1 Module docstring

    Python allows a docstring at the beginning of the .py file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example
    

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc
    

    36.10.2 %feature("autodoc")

    As alluded to above SWIG will generate all the function and method proxy wrappers with just "*args" (or "*args, **kwargs" if the -keyword option is used) for a parameter list and will then sort out the individual parameters in the C wrapper code. This is nice and simple for the wrapper code, but makes it difficult to be programmer and tool friendly as anyone looking at the .py file will not be able to find out anything about the parameters that the functions accept.

    But since SWIG does know everything about the function it is possible to generate a docstring containing the parameter types, names and default values. Since many of the docstring tools are adopting a standard of recognizing if the first thing in the docstring is a function prototype then using that instead of what they found from introspection, then life is good once more.

    SWIG's Python module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause a docstring to be generated that includes the name of the function, parameter names, default values if any, and return type if any. There are also four levels for autodoc controlled by the value given to the feature, %feature("autodoc", "level"). The four values for level are covered in the following sub-sections.

    36.10.2.1 %feature("autodoc", "0")

    When level "0" is used then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    Then Python code like this will be generated:

    def function_name(*args, **kwargs):
        """function_name(x, y, foo=None, bar=None) -> bool"""
        ...
    

    36.10.2.2 %feature("autodoc", "1")

    When level "1" is used then the parameter types will be used in the autodoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Python user. Pointer, reference and const info is removed if the associated type is has an associated Python type (%rename's are thus shown correctly). This works most of the time, otherwise a C/C++ type will be used. See the next section for the "docstring" feature for tweaking the docstrings to your liking. Given the example above, then turning on the parameter types with level "1" will result in Python code like this:

    def function_name(*args, **kwargs):
        """function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool"""
        ...
    

    36.10.2.3 %feature("autodoc", "2")

    Level "2" results in the function prototype as per level "0". In addition, a line of documentation is generated for each parameter using numpydoc style. Using the previous example, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    Note that the documentation for each parameter is sourced from the "doc" typemap which by default shows the C/C++ type rather than the simplified Python type name described earlier for level "1". Typemaps can of course change the output for any particular type, for example the int x parameter:

    %feature("autodoc", "2");
    %typemap("doc") int x "$1_name (C++ type: $1_type) -- Input $1_name dimension"
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);
    

    resulting in

    def function_name(*args, **kwargs):
        """
        function_name(x, y, foo=None, bar=None) -> bool
    
        Parameters
        ----------
        x (C++ type: int) -- Input x dimension
        y: int
        foo: Foo *
        bar: Bar *
    
        """
    

    36.10.2.4 %feature("autodoc", "3")

    Level "3" results in the function prototype as per level "1" but also contains the same additional line of documentation for each parameter as per level "2". Using our earlier example again, the generated code will be:

    def function_name(*args, **kwargs):
        """
        function_name(int x, int y, Foo foo=None, Bar bar=None) -> bool
    
        Parameters
        ----------
        x: int
        y: int
        foo: Foo *
        bar: Bar *
    
        """
        ...
    

    36.10.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Python programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);
    

    36.10.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together. If the docstring is all on a single line then it is output like this::

    """This is the docstring"""
    

    Otherwise, to aid readability it is output like this:

    """
    This is a multi-line docstring
    with more than one line.
    """
    

    36.11 Python Packages

    Python has concepts of modules and packages. Modules are separate units of code and may be grouped together to form a package. Packages may be nested, that is they may contain subpackages. This leads to tree-like hierarchy, with packages as intermediate nodes and modules as leaf nodes.

    The hierarchy of Python packages/modules follows the hierarchy of *.py files found in a source tree (or, more generally, in the Python path). Normally, the developer creates new module by placing a *.py file somewhere under Python path; the module is then named after that *.py file. A package is created by placing an __init__.py file within a directory; the package is then named after that directory. For example, the following source tree:

    mod1.py
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    defines the following Python packages and modules:

    pkg1            # package
    pkg1.pkg2       # package
    mod1            # module
    pkg1.mod2       # module
    pkg1.pkg2.mod3  # module
    

    The purpose of an __init__.py file is two-fold. First, the existence of __init__.py in a directory informs the Python interpreter that this directory contains a Python package. Second, the code in __init__.py is loaded/executed automatically when the package is initialized (when it or its submodule/subpackage gets import'ed). By default, SWIG generates proxy Python code – one *.py file for each *.i interface. The __init__.py files, however, are not generated by SWIG. They should be created by other means. Both files (module *.py and __init__.py) should be installed in appropriate destination directories in order to obtain a desirable package/module hierarchy.

    Python3 adds another option for packages with PEP 0420 (implicit namespace packages). Implicit namespace packages no longer use __init__.py files. SWIG generated Python modules support implicit namespace packages. See 36.11.5 Implicit Namespace Packages for more information.

    If you place a SWIG generated module into a Python package then there are details concerning the way SWIG searches for the wrapper module that you may want to familiarize yourself with.

    The way Python defines its modules and packages impacts SWIG users. Some users may need to use special features such as the package option in the %module directive or import related command line options. These are explained in the following sections.

    36.11.1 Setting the Python package

    Using the package option in the %module directive allows you to specify a Python package that the module will be in when installed.

    %module(package="wx") xrc
    

    This is useful when the .i file is %imported by another .i file. By default SWIG will assume that the importer is able to find the importee with just the module name, but if they live in separate Python packages then this won't work. However if the importee specifies what its package is with the %module option then the Python code generated for the importer will use that package name when importing the other module and in base class declarations, etc..

    SWIG assumes that the package option provided to %module together with the module name (that is, wx.xrc in the above example) forms a fully qualified (absolute) name of a module (in Python terms). This is important especially for Python 3, where absolute imports are used by default. It's up to you to place the generated module files (.py, .so) in appropriate subdirectories. For example, if you have an interface file foo.i with:

    %module(package="pkg1.pkg2") foo
    

    then the resulting directory layout should be

    pkg1/
    pkg1/__init__.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/foo.py        # (generated by SWIG)
    pkg1/pkg2/_foo.so       # (shared library built from C/C++ code generated by SWIG)
    

    36.11.2 Absolute and relative imports

    Suppose, we have the following hierarchy of files:

    pkg1/
    pkg1/__init__.py
    pkg1/mod2.py
    pkg1/pkg2/__init__.py
    pkg1/pkg2/mod3.py
    

    Let the contents of pkg1/pkg2/mod3.py be

    class M3: pass
    

    We edit pkg1/mod2.py and want to import module pkg1/pkg2/mod3.py in order to derive from class M3. We can write appropriate Python code in several ways, for example:

    1. Using "import <>" syntax with absolute package name:

      # pkg1/mod2.py
      import pkg1.pkg2.mod3
      class M2(pkg1.pkg2.mod3.M3): pass
      
    2. Using "import <>" syntax with package name relative to pkg1 (only in Python 2.7 and earlier):

      # pkg1/mod2.py
      import pkg2.mod3
      class M2(pkg2.mod3.M3): pass
      
    3. Using "from <> import <>" syntax (relative import syntax, only in Python 2.5 and later):

      # pkg1/mod2.py
      from .pkg2 import mod3
      class M2(mod3.M3): pass
      
    4. Other variants, for example the following construction in order to have the pkg2.mod3.M3 symbol available in mod2 as in point 2 above (but now under Python 3):

      # pkg1/mod2.py
      from . import pkg2
      from .pkg2 import mod3
      class M2(pkg2.mod3.M3): pass
      

    Now suppose we have mod2.i with

    // mod2.i
    %module (package="pkg1") mod2
    %import "mod3.i"
    // ...
    

    and mod3.i with

    // mod3.i
    %module (package="pkg1.pkg2") mod3
    // ...
    

    By default, SWIG would generate mod2.py proxy file with import directive as in point 1. This can be changed with the -relativeimport command line option. The -relativeimport instructs SWIG to organize imports as in point 2 (for Python < 2.7.0) or as in point 4 for Python 2.7.0 and newer. This is a check done at the time the module is imported. In short, if you have mod2.i and mod3.i as above, then without -relativeimport SWIG will write

    import pkg1.pkg2.mod3
    

    to mod2.py proxy file, and with -relativeimport it will write

    from sys import version_info
    if version_info >= (2, 7, 0):
        from . import pkg2
        import pkg1.pkg2.mod3
    else:
        import pkg2.mod3
    del version_info
    

    You should avoid using relative imports and use absolute ones whenever possible. There are some cases, however, when relative imports may be necessary. The first example is, when some (legacy) Python code refers entities imported by proxy files generated by SWIG, and it assumes that the proxy file uses relative imports. Second case is, when one puts import directives in __init__.py to import symbols from submodules or subpackages and the submodule depends on other submodules (discussed later).

    36.11.3 Enforcing absolute import semantics

    As you may know, there is an incompatibility in import semantics (for the import <> syntax) between Python 2 and 3. In Python 2.4 and earlier it is not clear whether

    import foo
    

    refers to a top-level module or to another module inside the current package. In Python 3 it always refers to a top-level module (see PEP 328). To instruct Python 2.5 through 2.7 to use new semantics (that is import foo is interpreted as absolute import), one has to put the following line

    from __future__ import absolute_import
    

    at the very beginning of his proxy *.py file. In SWIG, it may be accomplished with %pythonbegin directive as follows:

    %pythonbegin %{
    from __future__ import absolute_import
    %}
    

    36.11.4 Importing from __init__.py

    Imports in __init__.py are handy when you want to populate a package's namespace with names imported from other modules. In SWIG based projects this approach may also be used to split large pieces of code into smaller modules, compile them in parallel and then re-assemble everything at runtime by importing submodules' contents in __init__.py, for example.

    Unfortunately import directives in __init__.py may cause problems, especially if they refer to a package's submodules. This is caused by the way Python initializes packages. If you spot problems with imports from __init__.py try using -relativeimport option. Below we explain in detail one issue, for which the -relativeimport workaround may be helpful.

    Consider the following example (Python 3):

    pkg1/__init__.py        # (empty)
    pkg1/pkg2/__init__.py   # (imports something from bar.py)
    pkg1/pkg2/foo.py
    pkg1/pkg2/bar.py        # (imports foo.py)
    

    If the file contents are:

    • pkg1/pkg2/__init__.py:

      # pkg1/pkg2/__init__.py
      from .bar import Bar
      
    • pkg1/pkg2/foo.py:

      # pkg1/pkg2/foo.py
      class Foo: pass
      
    • pkg1/pkg2/bar.py:

      # pkg1/pkg2/bar.py
      import pkg1.pkg2.foo
      class Bar(pkg1.pkg2.foo.Foo): pass
      

    Now if one simply used import pkg1.pkg2, it will usually fail:

    >>> import pkg1.pkg2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "./pkg1/pkg2/__init__.py", line 2, in <module>
        from .bar import Bar
      File "./pkg1/pkg2/bar.py", line 3, in <module>
        class Bar(pkg1.pkg2.foo.Foo): pass
    AttributeError: 'module' object has no attribute 'pkg2'
    

    Surprisingly, if we execute the import pkg1.pkg2 directive for the second time, it succeeds. The reason seems to be following: when Python spots the from .bar import Bar directive in pkg1/pkg2/__init__.py it starts loading pkg1/pkg2/bar.py. This module imports pkg1.pkg2.foo in turn and tries to use pkg1.pkg2.foo.Foo, but the package pkg1 is not fully initialized yet (the initialization procedure is actually in progress) and it seems like the effect of the already seen import pkg1.pkg2.pkg3.foo is "delayed" or ignored. Exactly the same may happen to a proxy module generated by SWIG.

    One workaround for this case is to use a relative import in pkg1/pkg2/bar.py. If we change bar.py to be:

    from .pkg3 import foo
    class Bar(foo.Foo): pass
    

    or

    from . import pkg3
    from .pkg3 import foo
    class Bar(pkg3.foo.Foo): pass
    

    then the example works again. With SWIG, you need to enable the -relativeimport option in order to have the above workaround in effect (note, that the Python 2 case also needs the -relativeimport workaround).

    36.11.5 Implicit Namespace Packages

    Python 3.3 introduced PEP 0420 which implements implicit namespace packages. In a nutshell, implicit namespace packages remove the requirement of an __init__.py file and allow packages to be split across multiple PATH elements. For example:

    /fragment1/pkg1/mod1.py
    /fragment2/pkg1/mod2.py
    /fragment3/pkg1/mod3.py
    

    If PYTHONPATH is set to "/fragment1:/fragment2:/fragment3", then mod1, mod2 and mod3 will be part of pkg1. This allows for splitting of packages into separate pieces. This can be useful for SWIG generated wrappers in the following way.

    Suppose you create a SWIG wrapper for a module called robin. The SWIG generated code consists of two files robin.py and _robin.so. You wish to make these modules part of a subpackage (brave.sir). With implicit namespace packages you can place these files in the following configurations:

    Using PYTHONPATH="/some/path"

    /some/path/brave/sir/robin.py
    /some/path/brave/sir/_robin.so
    

    Using PYTHONPATH="/some/path:/some/other/path"

    /some/path/brave/sir/robin.py
    /some/other/path/brave/sir/_robin.so
    

    Finally suppose that your pure python code is stored in a .zip file or some other way (database, web service connection, etc). Python can load the robin.py module using a custom importer. But the _robin.so module will need to be located on a file system. Implicit namespace packages make this possible. For example, using PYTHONPATH="/some/path/foo.zip:/some/other/path"

    Contents of foo.zip

    brave/
    brave/sir/
    brave/sir/robin.py
    

    File system contents

    /some/other/path/brave/sir/_robin.so
    

    Support for implicit namespace packages was added to python-3.3. The zipimporter requires python-3.5.1 or newer to work with subpackages.

    Compatibility Note: Support for implicit namespace packages was added in SWIG-3.0.9.

    36.11.6 Searching for the wrapper module

    When SWIG creates wrappers from an interface file, say foo.i, two Python modules are created. There is a pure Python module module (foo.py) and C/C++ code which is built and linked into a dynamically (or statically) loaded low-level module _foo (see the Preliminaries section for details). So, the interface file really defines two Python modules. How these two modules are loaded is covered next.

    The pure Python module needs to load the C/C++ module in order to link to the wrapped C/C++ methods. To do this it must make some assumptions about what package the C/C++ module may be located in. The approach the pure Python module uses to find the C/C++ module is as follows:

    1. The pure Python module, foo.py, tries to load the C/C++ module, _foo, from the same package foo.py is located in. The package name is determined from the __name__ attribute given to foo.py by the Python loader that imported foo.py. If foo.py is not in a package then _foo is loaded as a global module.

    2. If the above import of _foo results in an ImportError being thrown, then foo.py makes a final attempt to load _foo as a global module.

    The Python code implementing the loading logic described above is quite complex to handle multiple versions of Python, but it can be replaced with custom code. This is not recommended unless you understand the full intricacies of importing Python modules. The custom code can be specified by setting the moduleimport option of the %module directive with the appropriate import code. For example:

    %module(moduleimport="import _foo") foo
    

    The special variable $module will also be expanded into the low-level C/C++ module name, _foo in the case above. When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define MODULEIMPORT
    "
    print 'Loading low-level module $module'
    import $module
    print 'Module has loaded'
    "
    %enddef
    
    %module(moduleimport=MODULEIMPORT) foo
    

    Now let's consider an example using the SWIG default loading logic. Suppose foo.i is compiled into foo.py and _foo.so. Assuming /dir is on PYTHONPATH, then the two modules can be installed and used in the following ways:

    36.11.6.1 Both modules in the same package

    Both modules are in one package:

    /dir/package/foo.py
    /dir/package/__init__.py
    /dir/package/_foo.so
    

    And imported with

    from package import foo
    

    36.11.6.2 Split modules

    The pure python module is in a package and the C/C++ module is global:

    /dir/package/foo.py
    /dir/package/__init__.py
    /dir/_foo.so
    

    And imported with

    from package import foo
    

    36.11.6.3 Both modules are global

    Both modules are global:

    /dir/foo.py
    /dir/_foo.so
    

    And imported with

    import foo
    

    If _foo is statically linked into an embedded Python interpreter, then it may or may not be in a Python package. This depends in the exact way the module was loaded statically. The above search order will still be used for statically loaded modules. So, one may place the module either globally or in a package as desired.

    36.11.6.4 Statically linked C modules

    It is strongly recommended to use dynamically linked modules for the C portion of your pair of Python modules. If for some reason you still need to link the C module of the pair of Python modules generated by SWIG into your interpreter, then this section provides some details on how this impacts the pure Python modules ability to locate the other part of the pair. Please also see the Static Linking section.

    When Python is extended with C code the Python interpreter needs to be informed about details of the new C functions that have been linked into the executable. The code to do this is created by SWIG and is automatically called in the correct way when the module is dynamically loaded. However when the code is not dynamically loaded (because it is statically linked) Then the initialization method for the module created by SWIG is not called automatically and the Python interpreter has no idea that the new SWIG C module exists.

    Before Python 3, one could simply call the init method created by SWIG which would have normally been called when the shared object was dynamically loaded. The specific name of this method is not given here because statically linked modules are not encouraged with SWIG ( Static Linking). However one can find this init function in the C file generated by SWIG.

    If you are really keen on static linking there are two ways to initialize the SWIG generated C module with the init method. Which way you use depends on what version of Python your module is being linked with. Python 2 and Python 3 treat this init function differently. And the way they treat it affects how the pure Python module will be able to locate the C module.

    The details concerning this are covered completly in the documentation for Python itself. Links to the relavent sections follow:

    There are two keys things to understand. The first is that in Python 2 the init() function returns void. In Python 3 the init() function returns a PyObject * which points to the new module. Secondly, when you call the init() method manually, you are the Python importer. So, you determine which package the C module will be located in.

    So, if you are using Python 3 it is important that you follow what is described in the Python documentation linked above. In particular, you can't simply call the init() function generated by SWIG and cast the PyObject pointer it returns over the side. If you do then Python 3 will have no idea that your C module exists and the pure Python half of your wrapper will not be able to find it. You need to register your module with the Python interpreter as described in the Python docs.

    With Python 2 things are somewhat more simple. In this case the init function returns void. Calling it will register your new C module as a global module. The pure Python part of the SWIG wrapper will be able to find it because it tries both the pure Python module it is part of and the global module. If you wish not to have the statically linked module be a global module then you will either need to refer to the Python documentation on how to do this (remember you are now the Python importer) or use dynamic linking.

    36.12 Python 3 Support

    SWIG is able to support Python 3.0. The wrapper code generated by SWIG can be compiled with both Python 2.x or 3.0. Further more, by passing the -py3 command line option to SWIG, wrapper code with some Python 3 specific features can be generated (see below subsections for details of these features). The -py3 option also disables some incompatible features for Python 3, such as -classic.

    There is a list of known-to-be-broken features in Python 3:

    • No more support for FILE* typemaps, because PyFile_AsFile has been dropped in Python 3.
    • The -apply command line option is removed and generating code using apply() is no longer supported.

    The following are Python 3.0 new features that are currently supported by SWIG.

    36.12.1 Function annotation

    The -py3 option will enable function annotation support. When used SWIG is able to generate proxy method definitions like this:

      def foo(self, bar : "int"=0) -> "void" : ...
    

    Also, even if without passing SWIG the -py3 option, the parameter list still could be generated:

      def foo(self, bar=0): ...
    

    But for overloaded function or method, the parameter list would fallback to *args or self, *args, and **kwargs may be append depend on whether you enabled the keyword argument. This fallback is due to all overloaded functions share the same function in SWIG generated proxy class.

    For detailed usage of function annotation, see PEP 3107.

    36.12.2 Buffer interface

    Buffer protocols were revised in Python 3. SWIG also gains a series of new typemaps to support buffer interfaces. These typemap macros are defined in pybuffer.i, which must be included in order to use them. By using these typemaps, your wrapped function will be able to accept any Python object that exposes a suitable buffer interface.

    For example, the get_path() function puts the path string into the memory pointed to by its argument:

    void get_path(char *s);
    

    Then you can write a typemap like this: (the following example is applied to both Python 3.0 and 2.6, since the bytearray type is backported to 2.6.

    %include <pybuffer.i>
    %pybuffer_mutable_string(char *str);
    void get_path(char *s);
    

    And then on the Python side the wrapped get_path could be used in this way:

    >>> p = bytearray(10)
    >>> get_path(p)
    >>> print(p)
    bytearray(b'/Foo/Bar/\x00')
    

    The macros defined in pybuffer.i are similar to those in cstring.i:

    %pybuffer_mutable_binary(parm, size_parm)

    The macro can be used to generate a typemap which maps a buffer of an object to a pointer provided by parm and a size argument provided by size_parm. For example:

    %pybuffer_mutable_binary(char *str, size_t size);
    ...
    int snprintf(char *str, size_t size, const char *format, ...);
    

    In Python:

    >>> buf = bytearray(6)
    >>> snprintf(buf, "Hello world!")
    >>> print(buf)
    bytearray(b'Hello\x00')
    >>> 
    

    %pybuffer_mutable_string(parm)

    This typemap macro requires the buffer to be a zero terminated string, and maps the pointer of the buffer to parm. For example:

    %pybuffer_mutable_string(char *str);
    ...
    size_t make_upper(char *str);
    

    In Python:

    >>> buf = bytearray(b'foo\x00')
    >>> make_upper(buf)
    >>> print(buf)
    bytearray(b'FOO\x00')
    >>>
    

    Both %pybuffer_mutable_binary and %pybuffer_mutable_string require the provided buffer to be mutable, eg. they can accept a bytearray type but can't accept an immutable byte type.

    %pybuffer_binary(parm, size_parm)

    This macro maps an object's buffer to a pointer parm and a size size_parm. It is similar to %pybuffer_mutable_binary , except the %pybuffer_binary an accept both mutable and immutable buffers. As a result, the wrapped function should not modify the buffer.

    %pybuffer_string(parm)

    This macro maps an object's buffer as a string pointer parm . It is similar to %pybuffer_mutable_string but the buffer could be both mutable and immutable. And your function should not modify the buffer.

    36.12.3 Abstract base classes

    By including pyabc.i and using the -py3 command line option when calling SWIG, the proxy classes of the STL containers will automatically gain an appropriate abstract base class. For example, the following SWIG interface:

    %include <pyabc.i>
    %include <std_map.i>
    %include <std_list.i>
    
    namespace std {
      %template(Mapii) map<int, int>;
      %template(IntList) list<int>;
    }
    

    will generate a Python proxy class Mapii inheriting from collections.MutableMap and a proxy class IntList inheriting from collections.MutableSequence.

    pyabc.i also provides a macro %pythonabc that could be used to define an abstract base class for your own C++ class:

    %pythonabc(MySet, collections.MutableSet);
    

    For details of abstract base class, please see PEP 3119.

    36.12.4 Byte string output conversion

    By default, any byte string (char* or std::string) returned from C or C++ code is decoded to text as UTF-8. This decoding uses the surrogateescape error handler under Python 3.1 or higher -- this error handler decodes invalid byte sequences to high surrogate characters in the range U+DC80 to U+DCFF. As an example, consider the following SWIG interface, which exposes a byte string that cannot be completely decoded as UTF-8:

    %module example
    
    %include <std_string.i>
    
    %inline %{
    
    const char* non_utf8_c_str(void) {
            return "h\xe9llo w\xc3\xb6rld";
    }
    
    %}
    

    When this method is called from Python 3, the return value is the following text string:

    >>> s = example.non_utf8_c_str()
    >>> s
    'h\udce9llo wörld'
    

    Since the C string contains bytes that cannot be decoded as UTF-8, those raw bytes are represented as high surrogate characters that can be used to obtain the original byte sequence:

    >>> b = s.encode('utf-8', errors='surrogateescape')
    >>> b
    b'h\xe9llo w\xc3\xb6rld'
    

    One can then attempt a different encoding, if desired (or simply leave the byte string as a raw sequence of bytes for use in binary protocols):

    >>> b.decode('latin-1')
    'héllo wörld'
    

    Note, however, that text strings containing surrogate characters are rejected with the default strict codec error handler. For example:

    >>> with open('test', 'w') as f:
    ...     print(s, file=f)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce9' in position 1: surrogates not allowed
    

    This requires the user to check most strings returned by SWIG bindings, but the alternative is for a non-UTF8 byte string to be completely inaccessible in Python 3 code.

    For more details about the surrogateescape error handler, please see PEP 383 .

    In some cases, users may wish to instead handle all byte strings as bytes objects in Python 3. This can be accomplished by adding SWIG_PYTHON_STRICT_BYTE_CHAR to the generated code:

    %module char_to_bytes
    %begin %{
    #define SWIG_PYTHON_STRICT_BYTE_CHAR
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    This will modify the behavior so that only Python 3 bytes objects will be accepted and converted to a C/C++ string, and any string returned from C/C++ will be converted to a bytes object in Python 3:

    >>> from char_to_bytes import *
    >>> charstring(b"hi") # Byte string
    b'hi'
    >>> charstring("hi")  # Unicode string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    Note that in Python 2, defining SWIG_PYTHON_STRICT_BYTE_CHAR has no effect, since strings in Python 2 are equivalent to Python 3 bytes objects. However, there is a similar capability to force unicode-only handling for wide characters C/C++ strings (wchar_t * or std::wstring types) in Python 2. By default, in Python 2 both strings and unicode strings are converted to C/C++ wide strings, and returned wide strings are converted to a Python unicode string. To instead only convert unicode strings to wide strings, users can add SWIG_PYTHON_STRICT_UNICODE_WCHAR to the generated code:

    %module wchar_to_unicode
    %begin %{
    #define SWIG_PYTHON_STRICT_UNICODE_WCHAR
    %}
    
    wchar_t *wcharstring(wchar_t *s) {
      return s;
    }
    

    This ensures that only unicode strings are accepted by wcharstring in both Python 2 and Python 3:

    >>> from wchar_to_unicode import *
    >>> wcharstring(u"hi") # Unicode string
    u'hi'
    >>> wcharstring(b"hi") # Byte string
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'wchar_t *'
    

    By defining both SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR, Python wrapper code can support overloads taking both std::string (as Python bytes) and std::wstring (as Python unicode).

    36.12.5 Python 2 Unicode

    A Python 3 string is a Unicode string so by default a Python 3 string that contains Unicode characters passed to C/C++ will be accepted and converted to a C/C++ string (char * or std::string types). A Python 2 string is not a unicode string by default and should a Unicode string be passed to C/C++ it will fail to convert to a C/C++ string (char * or std::string types). The Python 2 behavior can be made more like Python 3 by defining SWIG_PYTHON_2_UNICODE when compiling the generated C/C++ code. By default when the following is wrapped:

    %module unicode_strings
    char *charstring(char *s) {
      return s;
    }
    

    An error will occur when using Unicode strings in Python 2:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: in method 'charstring', argument 1 of type 'char *'
    

    When the SWIG_PYTHON_2_UNICODE macro is added to the generated code:

    %module unicode_strings
    %begin %{
    #define SWIG_PYTHON_2_UNICODE
    %}
    
    char *charstring(char *s) {
      return s;
    }
    

    Unicode strings will be successfully accepted and converted from UTF-8, but note that they are returned as a normal Python 2 string:

    >>> from unicode_strings import *
    >>> charstring("hi")
    'hi'
    >>> charstring(u"hi")
    'hi'
    >>>
    

    Note that defining both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at the same time is not allowed, since the first is allowing unicode conversion and the second is explicitly prohibiting it.


    37 SWIG and R

    R is a GPL'ed open source statistical and plotting environment. Information about R can be found at www.r-project.org. The R bindings are under active development. They have been used to compile and run an R interface to QuantLib running on Mandriva Linux with gcc. The R bindings also work on Microsoft Windows using Visual C++.

    37.1 Bugs

    Currently the following features are not implemented or broken:

    • Garbage collection of created objects
    • C Array wrappings

    37.2 Using R and SWIG

    To use R and SWIG in C mode, execute the following commands where example.c is the name of the file with the functions in them

    swig -r example.i
    R CMD SHLIB example_wrap.c example.c
    

    The corresponding options for C++ mode are

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB example_wrap.cpp example.cpp
    

    Note that R is sensitive to the names of the files. The name of the wrapper file must be the name of the library unless you use the -o option to R when building the library, for example:

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB -o example.so example_wrap.cpp example.cpp
    

    R is also sensitive to the name of the file extension in C and C++ mode. In C++ mode, the file extension must be .cpp rather than .cxx for the R compile command to recognize it. If your C++ code is in a file using something other than a .cpp extension, then it may still work using PKG_LIBS:

    swig -c++ -r -o example_wrap.cpp example.i
    PKG_LIBS="example.cxx" R CMD SHLIB -o example example_wrap.cpp
    

    The commands produces two files. A dynamic shared object file called example.so, or example.dll, and an R wrapper file called example.R. To load these files, start up R and type in the following commands

    dyn.load(paste("example", .Platform$dynlib.ext, sep=""))
    source("example.R")
    cacheMetaData(1)
    
    The cacheMetaData(1) will cause R to refresh its object tables. Without it, inheritance of wrapped objects may fail.

    These two files can be loaded in any order

    If you are compiling code yourself (not using R itself), there are a few things to watch out for:

    • The output shared library name (to the left of the file extension) MUST match the module name, or alternatively, you can also set the -package NAME command line argument. See swig -r -help for more information
    • If you do not set the output file name appropriately, you might see errors like
      > fact(4)
      Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :
        "R_swig_fact" not available for .Call() for package "example"
      
    • Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into

    37.3 Precompiling large R files

    In cases where the R file is large, one make save a lot of loading time by precompiling the R wrapper. This can be done by creating the file makeRData.R which contains the following
    source('BigFile.R')
    save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
    q(save="no")
    
    This will generate a compiled R file called BigFile.RData that will save a large amount of loading time.

    37.4 General policy

    The general policy of the module is to treat the C/C++ as a basic wrapping over the underlying functions and rely on the R type system to provide R syntax.

    37.5 Language conventions

    getitem and setitem use C++ conventions (i.e. zero based indices). [

    37.6 C++ classes

    C++ objects are implemented as external pointer objects with the class being the mangled name of the class. The C++ classes are encapsulated as an SEXP with an external pointer type. The class is the mangled name of the class. The nice thing about R is that is allows you to keep track of the pointer object which removes the necessity for a lot of the proxy class baggage you see in other languages.

    37.7 Enumerations

    enumerations are characters which are then converted back and forth to ints before calling the C routines. All of the enumeration code is done in R.


    38 SWIG and Ruby

    This chapter describes SWIG's support of Ruby.

    38.1 Preliminaries

    SWIG 3.0 is known to work with Ruby versions 1.8 and later. Given the choice, you should use the latest stable version of Ruby. You should also determine if your system supports shared libraries and dynamic loading. SWIG will work with or without dynamic loading, but the compilation process will vary.

    This chapter covers most SWIG features, but in less depth than is found in earlier chapters. At the very least, make sure you also read the "SWIG Basics" chapter. It is also assumed that the reader has a basic understanding of Ruby.

    38.1.1 Running SWIG

    To build a Ruby module, run SWIG using the -ruby option:

    $ swig -ruby example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -ruby example.i
    

    This creates a file example_wrap.c (example_wrap.cxx if compiling a C++ extension) that contains all of the code needed to build a Ruby extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    38.1.2 Getting the right header files

    In order to compile the wrapper code, the compiler needs the ruby.h header file and its dependencies, notably ruby/config.h which is found in a different, architecture-dependent, directory. The best way to find the compiler options needed to compile the code is to ask Ruby itself:

    $ ruby -rrbconfig -e 'puts "-I#{RbConfig::CONFIG[%q{rubyhdrdir}]} -I#{RbConfig::CONFIG[%q{rubyarchhdrdir}]}"'
    -I/usr/include/ruby-2.1.0 -I/usr/include/x86_64-linux-gnu/ruby-2.1.0
    

    38.1.3 Compiling a dynamic module

    Ruby extension modules are typically compiled into shared libraries that the interpreter loads dynamically at runtime. Since the exact commands for doing this vary from platform to platform, your best bet is to follow the steps described in the README.EXT file from the Ruby distribution:

    1. Create a file called extconf.rb that looks like the following:

      require 'mkmf'
      create_makefile('example')
    2. Type the following to build the extension:

      $ ruby extconf.rb
      $ make
      $ make install
          

    Of course, there is the problem that mkmf does not work correctly on all platforms, e.g, HPUX. If you need to add your own make rules to the file that extconf.rb produces, you can add this:

    open("Makefile", "a") { |mf|
     puts <<EOM
     # Your make rules go here
     EOM
    }
    

    to the end of the extconf.rb file. If for some reason you don't want to use the standard approach, you'll need to determine the correct compiler and linker flags for your build platform. For example, assuming you have code you need to link to in a file called example.c, a typical sequence of commands for the Linux operating system would look something like this:

    $ swig -ruby example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/include/ruby-2.1.0
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    If in doubt, consult the manual pages for your compiler and linker to determine the correct set of options. You might also check the SWIG Wiki for additional information.

    38.1.4 Using your module

    Ruby module names must be capitalized, but the convention for Ruby feature names is to use lowercase names. So, for example, the Etc extension module is imported by requiring the etc feature:

    # The feature name begins with a lowercase letter...
    require 'etc'
    
    # ... but the module name begins with an uppercase letter
    puts "Your login name: #{Etc.getlogin}"
    

    To stay consistent with this practice, you should always specify a lowercase module name with SWIG's %module directive. SWIG will automatically correct the resulting Ruby module name for your extension. So for example, a SWIG interface file that begins with:

    %module example

    will result in an extension module using the feature name "example" and Ruby module name "Example".

    38.1.5 Static linking

    An alternative approach to dynamic linking is to rebuild the Ruby interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Ruby involves finding the Ruby source, adding an entry to the ext/Setup file, adding your directory to the list of extensions in the file, and finally rebuilding Ruby.

    38.1.6 Compilation of C++ extensions

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -ruby example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/include/ruby-2.1.0
    $ g++ -shared example.o example_wrap.o -o example.so
    

    If you've written an extconf.rb script to automatically generate a Makefile for your C++ extension module, keep in mind that (as of this writing) Ruby still uses gcc and not g++ as its linker. As a result, the required C++ runtime library support will not be automatically linked into your extension module and it may fail to load on some platforms. A workaround for this problem is use the mkmf module's append_library() method to add one of the C++ runtime libraries to the list of libraries linked into your extension, e.g.

    require 'mkmf'
    $libs = append_library($libs, "supc++")
    create_makefile('example')

    38.2 Building Ruby Extensions under Windows 95/NT

    Building a SWIG extension to Ruby under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Ruby interpreter. For all recent versions of Ruby, the procedure described above (i.e. using an extconf.rb script) will work with Windows as well; you should be able to build your code into a DLL by typing:

    C:\swigtest> ruby extconf.rb
    C:\swigtest> nmake
    C:\swigtest> nmake install
    

    The remainder of this section covers the process of compiling SWIG-generated Ruby extensions with Microsoft Visual C++ 6 (i.e. within the Developer Studio IDE, instead of using the command line tools). In order to build extensions, you may need to download the source distribution to the Ruby package, as you will need the Ruby header files.

    38.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (i.e. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -ruby -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field". You may have to include the path to swig.exe.
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to the C/C++ tab and select the Preprocessor category. Add NT=1 to the Preprocessor definitions. This must be set else you will get compilation errors. Also add IMPORT to the preprocessor definitions, else you may get runtime errors. Also add the include directories for your Ruby installation under "Additional include directories".
    • Next, select the settings for the entire project and go to the Link tab and select the General category. Set the name of the output file to match the name of your Ruby module (i.e.. example.dll). Next add the Ruby library file to your link libraries under Object/Library modules. For example "mswin32-ruby16.lib. You also need to add the path to the library under the Input tab - Additional library path.
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Ruby extension, simply run Ruby and use the require command as normal. For example if you have this ruby file run.rb:

    # file: run.rb
    require 'Example'
    
    # Call a c function
    print "Foo = ", Example.Foo, "\n"

    Ensure the dll just built is in your path or current directory, then run the Ruby script from the DOS/Command prompt:

    C:\swigtest> ruby run.rb
    Foo = 3.0
    

    38.3 The Ruby-to-C/C++ Mapping

    This section describes the basics of how SWIG maps C or C++ declarations in your SWIG interface files to Ruby constructs.

    38.3.1 Modules

    The SWIG %module directive specifies the name of the Ruby module. If you specify:

    %module example

    then everything is wrapped into a Ruby module named Example that is nested directly under the global module. You can specify a more deeply nested module by specifying the fully-qualified module name in quotes, e.g.

    %module "foo::bar::spam"

    An alternate method of specifying a nested module name is to use the -prefix option on the SWIG command line. The prefix that you specify with this option will be prepended to the module name specified with the %module directive in your SWIG interface file. So for example, this declaration at the top of your SWIG interface file:

    %module "foo::bar::spam"

    will result in a nested module name of Foo::Bar::Spam, but you can achieve the same effect by specifying:

    %module spam

    and then running SWIG with the -prefix command line option:

    $ swig -ruby -prefix "foo::bar::" example.i
    

    Starting with SWIG 1.3.20, you can also choose to wrap everything into the global module by specifying the -globalmodule option on the SWIG command line, i.e.

    $ swig -ruby -globalmodule example.i
    

    Note that this does not relieve you of the requirement of specifying the SWIG module name with the %module directive (or the -module command-line option) as described earlier.

    When choosing a module name, do not use the same name as a built-in Ruby command or standard module name, as the results may be unpredictable. Similarly, if you're using the -globalmodule option to wrap everything into the global module, take care that the names of your constants, classes and methods don't conflict with any of Ruby's built-in names.

    38.3.2 Functions

    Global functions are wrapped as Ruby module methods. For example, given the SWIG interface file example.i:

    %module example
    
    int fact(int n);

    and C source file example.c:

    int fact(int n) {
      if (n == 0)
      return 1;
      return (n * fact(n-1));
    }

    SWIG will generate a method fact in the Example module that can be used like so:

    $ irb
    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(4)
    24

    38.3.3 Variable Linking

    C/C++ global variables are wrapped as a pair of singleton methods for the module: one to get the value of the global variable and one to set it. For example, the following SWIG interface file declares two global variables:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
      extern int variable1;
      extern double Variable2;
    %}
    ...

    Now look at the Ruby interface:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example.variable1 = 2
    2
    irb(main):003:0> Example.Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> Example.Variable2
    41.2

    If you make an error in variable assignment, you will receive an error message. For example:

    irb(main):005:0> Example.Variable2 = "hello"
    TypeError: no implicit conversion to float from string
    from (irb):5:in `Variable2='
    from (irb):5

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %immutable;
    %inline %{
      extern char *path;
    %}
    %mutable;

    The %immutable directive stays in effect until it is explicitly disabled using %mutable.

    38.3.4 Constants

    C/C++ constants are wrapped as module constants initialized to the appropriate value. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    
    const int BAR = 32;

    Remember to use the :: operator in Ruby to get at these constant values, e.g.

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example::PI
    3.14159

    38.3.5 Pointers

    "Opaque" pointers to arbitrary C/C++ types (i.e. types that aren't explicitly declared in your SWIG interface file) are wrapped as data objects. So, for example, consider a SWIG interface file containing only the declarations:

    Foo *get_foo();
    void set_foo(Foo *foo);

    For this case, the get_foo() method returns an instance of an internally generated Ruby class:

    irb(main):001:0> foo = Example::get_foo()
    #<SWIG::TYPE_p_Foo:0x402b1654>

    A NULL pointer is always represented by the Ruby nil object.

    38.3.6 Structures

    C/C++ structs are wrapped as Ruby classes, with accessor methods (i.e. "getters" and "setters") for all of the struct members. For example, this struct declaration:

    struct Vector {
      double x, y;
    };

    gets wrapped as a Vector class, with Ruby instance methods x, x=, y and y=. These methods can be used to access structure data from Ruby as follows:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> f = Example::Vector.new
    #<Example::Vector:0x4020b268>
    irb(main):003:0> f.x = 10
    nil
    irb(main):004:0> f.x
    10.0

    Similar access is provided for unions and the public data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive (in C++, private may also be used). For example:

    struct Foo {
      ...
      %immutable;
      int x; /* Read-only members */
      char *name;
      %mutable;
      ...
    };

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described shortly).

    Array members are normally wrapped as read-only. For example, this code:

    struct Foo {
      int x[50];
    };

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };

    If you want to set an array member, you will need to supply a "memberin" typemap described in the section on typemaps. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Ruby string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }

    38.3.7 C++ classes

    Like structs, C++ classes are wrapped by creating a new Ruby class of the same name with accessor methods for the public class member data. Additionally, public member functions for the class are wrapped as Ruby instance methods, and public static member functions are wrapped as Ruby singleton methods. So, given the C++ class declaration:

    class List {
    public:
      List();
      ~List();
      int search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int length;
      static void print(List *l);
    };

    SWIG would create a List class with:

    • instance methods search, insert, remove, and get;
    • instance methods length and length= (to get and set the value of the length data member); and,
    • a print singleton method for the class.

    In Ruby, these functions are used as follows:

    require 'Example'
    
    l = Example::List.new
    
    l.insert("Ale")
    l.insert("Stout")
    l.insert("Lager")
    Example.print(l)
    l.length()
    ----- produces the following output 
    Lager
    Stout
    Ale
    3

    38.3.8 C++ Inheritance

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this:

    class Parent {
      ...
    };
    
    class Child : public Parent {
      ...
    };

    those classes are wrapped into a hierarchy of Ruby classes that reflect the same inheritance structure. All of the usual Ruby utility methods work normally:

    irb(main):001:0> c = Child.new
    #<Bar:0x4016efd4>
    irb(main):002:0> c.instance_of? Child
    true
    irb(main):003:0> b.instance_of? Parent
    false
    irb(main):004:0> b.is_a? Child
    true
    irb(main):005:0> b.is_a? Parent
    true
    irb(main):006:0> Child < Parent
    true
    irb(main):007:0> Child > Parent
    false

    Furthermore, if you have a function like this:

    void spam(Parent *f);

    then the function spam() accepts Parent* or a pointer to any class derived from Parent.

    Until recently, the Ruby module for SWIG didn't support multiple inheritance, and this is still the default behavior. This doesn't mean that you can't wrap C++ classes which inherit from multiple base classes; it simply means that only the first base class listed in the class declaration is considered, and any additional base classes are ignored. As an example, consider a SWIG interface file with a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    For this case, the resulting Ruby class (Derived) will only consider Base1 as its superclass. It won't inherit any of Base2's member functions or data and it won't recognize Base2 as an "ancestor" of Derived (i.e. the is_a? relationship would fail). When SWIG processes this interface file, you'll see a warning message like:

    example.i:5: Warning 802: Warning for Derived: Base Base2 ignored.
    Multiple inheritance is not supported in Ruby.

    Starting with SWIG 1.3.20, the Ruby module for SWIG provides limited support for multiple inheritance. Because the approach for dealing with multiple inheritance introduces some limitations, this is an optional feature that you can activate with the -minherit command-line option:

    $ swig -c++ -ruby -minherit example.i
    

    Using our previous example, if your SWIG interface file contains a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    and you run SWIG with the -minherit command-line option, then you will end up with a Ruby class Derived that appears to "inherit" the member data and functions from both Base1 and Base2. What actually happens is that three different top-level classes are created, with Ruby's Object class as their superclass. Each of these classes defines a nested module named Impl, and it's in these nested Impl modules that the actual instance methods for the classes are defined, i.e.

    class Base1
      module Impl
      # Define Base1 methods here
      end
      include Impl
    end
    
    class Base2
      module Impl
      # Define Base2 methods here
      end
      include Impl
    end
    
    class Derived
      module Impl
      include Base1::Impl
      include Base2::Impl
      # Define Derived methods here
      end
      include Impl
    end

    Observe that after the nested Impl module for a class is defined, it is mixed-in to the class itself. Also observe that the Derived::Impl module first mixes-in its base classes' Impl modules, thus "inheriting" all of their behavior.

    The primary drawback is that, unlike the default mode of operation, neither Base1 nor Base2 is a true superclass of Derived anymore:

    obj = Derived.new
    obj.is_a? Base1 # this will return false...
    obj.is_a? Base2 # ... and so will this

    In most cases, this is not a serious problem since objects of type Derived will otherwise behave as though they inherit from both Base1 and Base2 (i.e. they exhibit "Duck Typing").

    38.3.9 C++ Overloaded Functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);

    You can use them in Ruby in a straightforward manner:

    irb(main):001:0> foo(3) # foo(int)
    irb(main):002:0> foo("Hello") # foo(char *c)

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };

    you can write Ruby code like this:

    irb(main):001:0> f = Foo.new # Create a Foo
    irb(main):002:0> g = Foo.new(f) # Copy f

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);

    or

    void foo(Bar *b);
    void foo(Bar &b);

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int); 
    void spam(short); // Accessed as spam_short

    or

    %ignore spam(short);
    ...
    void spam(int); 
    void spam(short); // Ignored

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    38.3.10 C++ Operators

    For the most part, overloaded operators are handled automatically by SWIG and do not require any special treatment on your part. So if your class declares an overloaded addition operator, e.g.

    class Complex {
      ...
      Complex operator+(Complex &);
      ...
    };

    the resulting Ruby class will also support the addition (+) method correctly.

    For cases where SWIG's built-in support is not sufficient, C++ operators can be wrapped using the %rename directive (available on SWIG 1.3.10 and later releases). All you need to do is give the operator the name of a valid Ruby identifier. For example:

    %rename(add_complex) operator+(Complex &, Complex &);
    ...
    Complex operator+(Complex &, Complex &);

    Now, in Ruby, you can do this:

    a = Example::Complex.new(2, 3)
    b = Example::Complex.new(4, -1)
    c = Example.add_complex(a, b)

    More details about wrapping C++ operators into Ruby operators is discussed in the section on operator overloading.

    38.3.11 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };

    it works in Ruby as follows:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(3)
    6
    irb(main):003:0> v = Example::Vector.new
    #<Example::Vector:0x4016f4d4>
    irb(main):004:0> v.x = 3.4
    3.4
    irb(main):004:0> v.y
    0.0

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    38.3.12 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(Pairii) pair<int, int>;

    In Ruby:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> p = Example::Pairii.new(3, 4)
    #<Example:Pairii:0x4016f4df>
    irb(main):003:0> p.first
    3
    irb(main):004:0> p.second
    4

    38.3.13 C++ Standard Template Library (STL)

    On a related note, the standard SWIG library contains a number of modules that provide typemaps for standard C++ library classes (such as std::pair, std::string and std::vector). These library modules don't provide wrappers around the templates themselves, but they do make it convenient for users of your extension module to pass Ruby objects (such as arrays and strings) to wrapped C++ code that expects instances of standard C++ templates. For example, suppose the C++ library you're wrapping has a function that expects a vector of floats:

    %module example
    
    float sum(const std::vector<float>& values);

    Rather than go through the hassle of writing an "in" typemap to convert an array of Ruby numbers into a std::vector<float>, you can just use the std_vector.i module from the standard SWIG library:

    %module example
    
    %include std_vector.i
    float sum(const std::vector<float>& values);

    Ruby's STL wrappings provide additional methods to make them behave more similarly to Ruby's native classes.

    Thus, you can do, for example:

    v = IntVector.new
    v << 2
    v << 3
    v << 4
    v.each { |x| puts x }
    
    => 2
    3
    4
    v.delete_if { |x| x == 3 }
    => [2, 4]

    The SWIG Ruby module provides also the ability for all the STL containers to carry around Ruby native objects (Fixnum, Classes, etc) making them act almost like Ruby's own Array, Hash, etc. To do that, you need to define a container that contains a swig::GC_VALUE, like:

    %module nativevector
    
    %{
    std::vector< swig::GC_VALUE > NativeVector;
    %}
    
    %template(NativeVector) std::vector< swig::GC_VALUE >;
    

    This vector can then contain any Ruby object, making them almost identical to Ruby's own Array class.

    require 'nativevector'
    include NativeVector
    
    v = NativeVector.new
    v << 1
    v << [1, 2]
    v << 'hello'
    
    class A; end
    
    v << A.new
    
    puts v
    => [1, [1, 2], 'hello', #<A:0x245325>]
    

    Obviously, there is a lot more to template wrapping than shown in these examples. More details can be found in the SWIG and C++ chapter.

    38.3.14 C++ STL Functors

    Some containers in the STL allow you to modify their default behavior by using so called functors or function objects. Functors are often just a very simple struct with operator() redefined or an actual C/C++ function. This allows you, for example, to always keep the sort order of a STL container to your liking.

    The Ruby STL mappings allows you to modify those containers that support functors using Ruby procs or methods, instead. Currently, this includes std::set, set::map, std::multiset and std::multimap.

    The functors in swig are called swig::UnaryFunction and swig::BinaryFunction. For C++ predicates (ie. functors that must return bool as a result) swig::UnaryPredicate and swig::BinaryPredicate are provided.

    As an example, if given this swig file:

    %module intset;
    
    %include <std_set.i>
    
    %template(IntSet) std::set< int, swig::BinaryPredicate >;
    

    You can then use the set from Ruby with or without a proc object as a predicate:

    require 'intset'
    include Intset
    
    # Default sorting behavior defined in C++
    a = IntSet.new
    a << 1
    a << 2
    a << 3
    a
    => [1, 2, 3]
    
    # Custom sorting behavior defined by a Ruby proc
    b = IntSet.new( proc { |a, b| a > b } )
    b << 1
    b << 2
    b << 3
    b
    =>  [3, 2, 1]
    

    38.3.15 C++ STL Iterators

    The STL is well known for the use of iterators. There are a number of iterators possible with different properties, but in general there are two main categories: const iterators and non-const iterators. The const iterators can access and not modify the values they point at, while the non-const iterators can both read and modify the values.

    The Ruby STL wrappings support both type of iterators by using a proxy class in-between. This proxy class is swig::Iterator or swig::ConstIterator. Derived from them are template classes that need to be initialized with the actual iterator for the container you are wrapping and often times with the beginning and ending points of the iteration range.

    The SWIG STL library already provides typemaps to all the standard containers to do this wrapping automatically for you, but if you have your own STL-like iterator, you will need to write your own typemap for them. For out typemaps, the special functions make_const_iterator and make_nonconst_iterator are provided.

    These can be used either like:

    make_const_iterator( iterator, rubyclass );
    make_const_iterator( iterator, iterator_begin, iterator_end, rubyclass );
    

    The iterators support a next() and previous() member function to just change the iterator without returning anything. previous() should obviously only be used for bidirectional iterators. You can also advance the iterator multiple steps by using standard math operations like +=.

    The value the iterator points at can be accessed with value() -- this is equivalent to dereferencing it with *i. For non-const iterators, a value=() function is also provided which allows you to change the value pointed by the iterator. This is equivalent to the C++ construct of dereferencing and assignment, like *i = something.

    Thus, given say a vector class of doubles defined as:

    %module doublevector
    
    %include std_vector.i
    
    %template(DoubleVector) std::vector<double>;
    

    Its iterator can then be used from Ruby like:

    require 'doublevector'
    include Doublevector
    
    v = DoubleVector.new
    v << 1
    v << 2
    v << 3
    
    #
    # an elaborate and less efficient way of doing v.map! { |x| x+2 }
    #
    i = v.begin
    e = v.end
    while i != e
      val = i.value
      val += 2
      i.value = val
      i.next
    end
    i
    >> [3, 4, 5 ]
    

    If you'd rather have STL classes without any iterators, you should define -DSWIG_NO_EXPORT_ITERATOR_METHODS when running swig.

    38.3.16 C++ Smart Pointers

    38.3.16.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Ruby in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    38.3.16.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo(); // Created somehow (not shown)
    ...
    p->x = 3; // Foo::x
    int y = p->bar(); // Foo::bar

    To wrap this in Ruby, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...

    Now, in Ruby, everything should just "work":

    irb(main):001:0> p = Example::CreateFoo() # Create a smart-pointer somehow
    #<Example::SmartPtrFoo:0x4016f4df>
    irb(main):002:0> p.x = 3 # Foo::x
    3
    irb(main):003:0> p.bar() # Foo::bar

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    irb(main):004:0> f = p.__deref__() # Returns underlying Foo *

    38.3.17 Cross-Language Polymorphism

    SWIG's Ruby module supports cross-language polymorphism (a.k.a. the "directors" feature) similar to that for SWIG's Python module. Rather than duplicate the information presented in the Python chapter, this section just notes the differences that you need to be aware of when using this feature with Ruby.

    38.3.17.1 Exception Unrolling

    Whenever a C++ director class routes one of its virtual member function calls to a Ruby instance method, there's always the possibility that an exception will be raised in the Ruby code. By default, those exceptions are ignored, which simply means that the exception will be exposed to the Ruby interpreter. If you would like to change this behavior, you can use the %feature("director:except") directive to indicate what action should be taken when a Ruby exception is raised. The following code should suffice in most cases:

    %feature("director:except") {
      throw Swig::DirectorMethodException($error);
    }

    When this feature is activated, the call to the Ruby instance method is "wrapped" using the rb_rescue2() function from Ruby's C API. If any Ruby exception is raised, it will be caught here and a C++ exception is raised in its place.

    38.4 Naming

    Ruby has several common naming conventions. Constants are generally in upper case, module and class names are in camel case and methods are in lower case with underscores. For example:

    • MATH::PI is a constant name
    • MyClass is a class name
    • my_method is a method name

    Prior to version 1.3.28, SWIG did not support these Ruby conventions. The only modifications it made to names was to capitalize the first letter of constants (which includes module and class names).

    SWIG 1.3.28 introduces the new -autorename command line parameter. When this parameter is specified, SWIG will automatically change constant, class and method names to conform with the standard Ruby naming conventions. For example:

    $ swig -ruby -autorename example.i
    

    To disable renaming use the -noautorename command line option.

    Since this change significantly changes the wrapper code generated by SWIG, it is turned off by default in SWIG 1.3.28. However, it is planned to become the default option in future releases.

    38.4.1 Defining Aliases

    It's a fairly common practice in the Ruby built-ins and standard library to provide aliases for method names. For example, Array#size is an alias for Array#length. If you would like to provide an alias for one of your class' instance methods, one approach is to use SWIG's %extend directive to add a new method of the aliased name that calls the original function. For example:

    class MyArray {
    public:
      // Construct an empty array
      MyArray();
    
      // Return the size of this array
      size_t length() const;
    };
    
    %extend MyArray {
      // MyArray#size is an alias for MyArray#length
      size_t size() const {
        return $self->length();
      }
    }
     

    A better solution is to use the %alias directive (unique to SWIG's Ruby module). The previous example could then be rewritten as:

    // MyArray#size is an alias for MyArray#length
    %alias MyArray::length "size";
    
    class MyArray {
    public:
      // Construct an empty array
      MyArray();
     
      // Return the size of this array
      size_t length() const;
    };

    Multiple aliases can be associated with a method by providing a comma-separated list of aliases to the %alias directive, e.g.

    %alias MyArray::length "amount, quantity, size";

    From an end-user's standpoint, there's no functional difference between these two approaches; i.e. they should get the same result from calling either MyArray#size or MyArray#length. However, when the %alias directive is used, SWIG doesn't need to generate all of the wrapper code that's usually associated with added methods like our MyArray::size() example.

    Note that the %alias directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.4.2 Predicate Methods

    Ruby methods that return a boolean value and end in a question mark are known as predicate methods. Examples of predicate methods in standard Ruby classes include Array#empty? (which returns true for an array containing no elements) and Object#instance_of? (which returns true if the object is an instance of the specified class). For consistency with Ruby conventions, methods that return boolean values should be marked as predicate methods.

    One cumbersome solution to this problem is to rename the method (using SWIG's %rename directive) and provide a custom typemap that converts the function's actual return type to Ruby's true or false. For example:

    %rename("is_it_safe?") is_it_safe();
    
    %typemap(out) int is_it_safe "$result = ($1 != 0) ? Qtrue : Qfalse;";
    
    int is_it_safe();

    A better solution is to use the %predicate directive (unique to SWIG's Ruby module) to designate a method as a predicate method. For the previous example, this would look like:

    %predicate is_it_safe();
    
    int is_it_safe();

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::is_it_safe?
    true

    The %predicate directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.4.3 Bang Methods

    Ruby methods that modify an object in-place and end in an exclamation mark are known as bang methods. An example of a bang method is Array#sort! which changes the ordering of items in an array. Contrast this with Array#sort, which returns a copy of the array with the items sorted instead of modifying the original array. For consistency with Ruby conventions, methods that modify objects in place should be marked as bang methods.

    Bang methods can be marked using the %bang directive which is unique to the Ruby module and was introduced in SWIG 1.3.28. For example:

    %bang sort(int arr[]);
    
    int sort(int arr[]); 

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::sort!(arr)

    The %bang directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.4.4 Getters and Setters

    Often times a C++ library will expose properties through getter and setter methods. For example:

    class Foo {
      Foo() {}
      int getValue() { return value_; }
      void setValue(int value) { value_ = value; }
    
    private:
      int value_;
    };

    By default, SWIG will expose these methods to Ruby as get_value and set_value. However, it more natural for these methods to be exposed in Ruby as value and value=. That allows the methods to be used like this:

    irb(main):001:0> foo = Foo.new()
    irb(main):002:0> foo.value = 5
    irb(main):003:0> puts foo.value

    This can be done by using the %rename directive:

    %rename("value") Foo::getValue();
    %rename("value=") Foo::setValue(int value);

    38.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }

    or

    int sub(int *x, int *y) {
      return *x-*y;
    }

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module Example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int sub(int *INPUT, int *INPUT);

    In Ruby, this allows you to pass simple values. For example:

    a = Example.add(3, 4)
    puts a
    7
    b = Example.sub(7, 4)
    puts b
    3

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module Example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT { int *x, int *y};
    
    void add(int x, int y, int *result);
    int sub(int *x, int *y);

    If a function mutates one of its parameters like this,

    void negate(int *x) {
     *x = -(*x);
    }

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);

    In Ruby, a mutated parameter shows up as a return value. For example:

    a = Example.negate(3)
    print a
    -3

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, success code, and error_code */
    int send_message(char *text, int *success, int *error_code);

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    ...
    int send_message(char *, int *OUTPUT, int *OUTPUT);

    When used in Ruby, the function will return an array of multiple values.

    bytes, success, error_code = send_message("Hello World")
    if not success
      print "error #{error_code} : in send_message"
    else
      print "Sent", bytes
    end

    Another way to access multiple return values is to use the %apply rule. In the following example, the parameters rows and columns are related to SWIG as OUTPUT values through the use of %apply

    %module Example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, int*columns);

    In Ruby:

    r, c = Example.get_dimensions(m)

    38.6 Exception handling

    38.6.1 Using the %exception directive

    The SWIG %exception directive can be used to define a user-definable exception handler that can convert C/C++ errors into Ruby exceptions. The chapter on Customization Features contains more details, but suppose you have a C++ class like the following :

    class DoubleArray {
    private:
      int n;
      double *ptr;
    public:
      // Create a new array of fixed size
      DoubleArray(int size) {
        ptr = new double[size];
        n = size;
      }
     
      // Destroy an array
      ~DoubleArray() {
        delete ptr;
      } 
     
      // Return the length of the array
      int length() {
        return n;
      }
     
      // Get an array item and perform bounds checking.
      double getitem(int i) {
        if ((i >= 0) && (i < n))
          return ptr[i];
        else
          throw RangeError();
      }
     
      // Set an array item and perform bounds checking.
      void setitem(int i, double val) {
        if ((i >= 0) && (i < n))
          ptr[i] = val;
        else {
          throw RangeError();
        }
      }
    };

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Ruby extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error.");
      }
    }
    
    class DoubleArray {
      ...
    };

    The exception handling code is inserted directly into generated wrapper functions. When an exception handler is defined, errors can be caught and used to gracefully raise a Ruby exception instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Because this is somewhat inefficient, you might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in getitem.");
      }
    }
     
    %exception setitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in setitem.");
      }
    }

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on Customization Features for more examples.

    38.6.2 Handling Ruby Blocks

    One of the highlights of Ruby and most of its standard library is the use of blocks, which allow the easy creation of continuations and other niceties. Blocks in ruby are also often used to simplify the passing of many arguments to a class.

    In order to make your class constructor support blocks, you can take advantage of the %exception directive, which will get run after the C++ class' constructor was called.

    For example, this yields the class over after its construction:

    class Window
    {
    public:
      Window(int x, int y, int w, int h);
      // .... other methods here ....
    };
    
    // Add support for yielding self in the Class' constructor.
    %exception Window::Window {
      $action
      if (rb_block_given_p()) {
        rb_yield(self);
      }
    }

    Then, in ruby, it can be used like:

    Window.new(0, 0, 360, 480) { |w|
      w.color = Fltk::RED
      w.border = false
    }
    

    For other methods, you can usually use a dummy parameter with a special in typemap, like:

    //
    // original function was:
    //
    // void func(int x);
    
    %typemap(in, numinputs=0) int RUBY_YIELD_SELF {
      if ( !rb_block_given_p() )
        rb_raise("No block given");
      return rb_yield(self);
    }
    
    %extend {
      void func(int x, int RUBY_YIELD_SELF );
    }
    

    For more information on typemaps, see Typemaps .

    38.6.3 Raising exceptions

    There are three ways to raise exceptions from C++ code to Ruby.

    The first way is to use SWIG_exception(int code, const char *msg) . The following table shows the mappings from SWIG error codes to Ruby exceptions:

    SWIG_MemoryError
    rb_eNoMemError
    SWIG_IOError
    rb_eIOError
    SWIG_RuntimeError
    rb_eRuntimeError
    SWIG_IndexError
    rb_eIndexError
    SWIG_TypeError
    rb_eTypeError
    SWIG_DivisionByZero
    rb_eZeroDivError
    SWIG_OverflowError
    rb_eRangeError
    SWIG_SyntaxError
    rb_eSyntaxError
    SWIG_ValueError
    rb_eArgError
    SWIG_SystemError
    rb_eFatal
    SWIG_AttributeError
    rb_eRuntimeError
    SWIG_NullReferenceError
    rb_eNullReferenceError*
    SWIG_ObjectPreviouslyDeletedError
    rb_eObjectPreviouslyDeleted*
    SWIG_UnknownError
    rb_eRuntimeError
    * These error classes are created by SWIG and are not built-in Ruby exception classes

    The second way to raise errors is to use SWIG_Raise(obj, type, desc). Obj is a C++ instance of an exception class, type is a string specifying the type of exception (for example, "MyError") and desc is the SWIG description of the exception class. For example:

    %raise(SWIG_NewPointerObj(e, SWIGTYPE_p_AssertionFailedException, 0), ":AssertionFailedException", SWIGTYPE_p_AssertionFailedException);
    

    This is useful when you want to pass the current exception object directly to Ruby, particularly when the object is an instance of class marked as an %exceptionclass (see the next section for more information).

    Last, you can raise an exception by directly calling Ruby's C api. This is done by invoking the rb_raise() function. The first argument passed to rb_raise() is the exception type. You can raise a custom exception type or one of the built-in Ruby exception types.

    38.6.4 Exception classes

    Starting with SWIG 1.3.28, the Ruby module supports the %exceptionclass directive, which is used to identify C++ classes that are used as exceptions. Classes that are marked with the %exceptionclass directive are exposed in Ruby as child classes of rb_eRuntimeError. This allows C++ exceptions to be directly mapped to Ruby exceptions, providing for a more natural integration between C++ code and Ruby code.

    %exceptionclass CustomError;
    
    %inline %{
      class CustomError { };
    
      class Foo { 
      public:
        void test() { throw CustomError; }
      };
    %}

    From Ruby you can now call this method like this:

    foo = Foo.new
    begin
      foo.test()
    rescue CustomError => e
      puts "Caught custom error"
    end 

    For another example look at swig/Examples/ruby/exception_class.

    38.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Ruby C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Ruby interface.

    38.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. The general form of this declaration is as follows ( parts enclosed in [...] are optional ):

    %typemap( method [, modifiers...] ) typelist code;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout" (or its director variations). The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist : typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern : type [ (parms) ]
      | type name [ (parms) ]
      | ( typelist ) [ (parms) ]

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the C code used in the typemap. It can take any one of the following forms:

    code : { ... }
      | " ... "
      | %{ ... %}

    For example, to convert integers from Ruby to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) NUM2INT($input);
      printf("Received an integer : %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input Ruby object.

    When this example is compiled into a Ruby module, the following sample code:

    require 'example'
    
    puts Example.fact(6)

    prints the result:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    In this case, the typemap code is only attached to arguments that exactly match "int n".

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    typedef int Integer;
    extern int fact(Integer n); // Above typemap is applied

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = StringValuePtr($input);
      $2 = (int) RSTRING($input)->len;
    };
    
    int count(char c, char *str, int len);

    When a multi-argument typemap is defined, the arguments are always handled as a single Ruby object. This allows the function count to be used as follows (notice how the length parameter is omitted):

    puts Example.count('o', 'Hello World')
    2

    38.7.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
      ...
    }
    
    int fact(int); // typemap1
    int gcd(int x, int y); // typemap1
    
    // typemap2
    %typemap(in) int {
      ...
    }
    
    int isprime(int); // typemap2

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
      ...
    }
    
    %extend Foo {
      int blah(int x); // typemap has no effect. Declaration is attached to Foo which 
      // appears before the %typemap declaration.
    };

    38.7.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;

    or this:

    %typemap(in) Integer, Number, int32_t = int;

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in) int { ... }
    %typemap(out) int { ... }
    %typemap(varin) int { ... }
    %typemap(varout) int { ... }

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer }; // Copy all int typemaps to Integer
    %apply int { Integer, Number }; // Copy all int typemaps to both Integer and Number

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output }; // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) }; // Multiple arguments

    38.7.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int; // Clears typemap for int
    %typemap(in) int, long, short; // Clears typemap for int, long, short
    %typemap(in) int *output; 

    The %clear directive clears all typemaps for a given type. For example:

    %clear int; // Removes all types for int
    %clear int *output, long *output;

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    38.7.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string { /* std::string */
      ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string { /* Foo::string */
      ...
      }
    }

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the class declaration class string .

    38.7.6 Ruby typemaps

    The following list details all of the typemap methods that can be used by the Ruby module:

    38.7.6.1 "in" typemap

    Converts Ruby objects to input function arguments. For example:

    %typemap(in) int {
      $1 = NUM2INT($input);
    }

    The following special variables are available:

    $input Input object holding value to be converted.
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }

    At this time, only zero or one arguments may be converted.

    38.7.6.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = FIXNUM_P($input) ? 1 : 0;
    }

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in a later section on "Typemaps and Overloading."

    38.7.6.3 "out" typemap

    Converts return value of a C function to a Ruby object.

    %typemap(out) int {
      $result = INT2NUM( $1 );
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    38.7.6.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }

    38.7.6.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    38.7.6.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }

    38.7.6.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout, fragment="output_helper") int *out {
      // Append output value $1 to $result (assuming a single integer in this case)
      $result = output_helper( $result, INT2NUM(*$1) );
    }

    The following special variables are available.

    $result Result object returned to target language.
    $input The original input object passed.
    $symname Name of function/method being wrapped.

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    Output helper is a fragment that usually defines a macro to some function like SWIG_Ruby_AppendOutput.

    See the typemaps.i library for examples.

    38.7.6.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input); 
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    38.7.6.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();

    See Object ownership and %newobject for further details.

    38.7.6.10 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    38.7.6.11 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    38.7.6.12 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    38.7.6.13 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      rb_raise(rb_eRuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      rb_raise(rb_eRuntimeError, _e);
      SWIG_fail;
    }
    ...

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    38.7.6.14 directorin typemap

    Converts C++ objects in director member functions to ruby objects. It is roughly the opposite of the "in" typemap, making its typemap rule often similar to the "out" typemap.

    %typemap(directorin) int {
      $result = INT2NUM($1);
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    38.7.6.15 directorout typemap

    Converts Ruby objects in director member functions to C++ objects. It is roughly the opposite of the "out" typemap, making its rule often similar to the "in" typemap.

    %typemap(directorout) int {
      $result = NUM2INT($1);
    }
    

    The following special variables are available:

    $inputRuby object being sent to the function
    $symnameName of function/method being wrapped
    $1...nArgument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    Currently, the directorout nor the out typemap support the option numoutputs, but the Ruby module provides that functionality through a %feature directive. Thus, a function can be made to return "nothing" if you do:

    %feature("numoutputs", "0") MyClass::function;
    

    This feature can be useful if a function returns a status code, which you want to discard but still use the typemap to raise an exception.

    38.7.6.16 directorargout typemap

    Output argument processing in director member functions.

    %typemap(directorargout,
    fragment="output_helper") int {
      $result = output_helper( $result, NUM2INT($1) );
    }
    

    The following special variables are available:

    $resultResult that the director function returns
    $inputRuby object being sent to the function
    $symnamename of the function/method being wrapped
    $1...nArgument being sent to the function
    $1_nameName of the argument (if provided)
    $1_typeThe actual C datatype matched by the typemap
    $1_ltypeThe assignable version of the C datatype matched by the typemap
    thisC++ this, referring to the instance of the class itself

    38.7.6.17 ret typemap

    Cleanup of function return values

    38.7.6.18 globalin typemap

    Setting of C global variables

    38.7.7 Typemap variables

    Within a typemap, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that is supposed to hold an argument value. For output values, this is the raw result that is supposed to be returned to Ruby.

    $input

    A VALUE holding a raw Ruby object with an argument or variable value.

    $result

    A VALUE that holds the result to be returned to Ruby.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Ruby name of the wrapper function being created.

    38.7.8 Useful Functions

    When you write a typemap, you usually have to work directly with Ruby objects. The following functions may prove to be useful. (These functions plus many more can be found in Programming Ruby book, by David Thomas and Andrew Hunt.)

    In addition, we list equivalent functions that SWIG defines, which provide a language neutral conversion (these functions are defined for each swig language supported). If you are trying to create a swig file that will work under multiple languages, it is recommended you stick to the swig functions instead of the native Ruby functions. That should help you avoid having to rewrite a lot of typemaps across multiple languages.

    38.7.8.1 C Datatypes to Ruby Objects

    RUBYSWIG
    INT2NUM(long or int)SWIG_From_int(int x) int to Fixnum or Bignum
    INT2FIX(long or int) int to Fixnum (faster than INT2NUM)
    CHR2FIX(char)SWIG_From_char(char x) char to Fixnum
    rb_str_new2(char*)SWIG_FromCharPtrAndSize(char*, size_t) char* to String
    rb_float_new(double)SWIG_From_double(double),
    SWIG_From_float(float)
    float/double to Float

    38.7.8.2 Ruby Objects to C Datatypes

    Here, while the Ruby versions return the value directly, the SWIG versions do not, but return a status value to indicate success ( SWIG_OK). While more akward to use, this allows you to write typemaps that report more helpful error messages, like:

    %typemap(in) size_t (int ok)
      ok = SWIG_AsVal_size_t($input, &$1);
      if (!SWIG_IsOK(ok)) {
        SWIG_exception_fail(SWIG_ArgError(ok), Ruby_Format_TypeError( "$1_name", "$1_type", "$symname", $argnum, $input));
      }
    }
    
    int NUM2INT(Numeric)SWIG_AsVal_int(VALUE, int*)
    int FIX2INT(Numeric)SWIG_AsVal_int(VALUE, int*)
    unsigned int NUM2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    unsigned int FIX2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    long NUM2LONG(Numeric)SWIG_AsVal_long(VALUE, long*)
    long FIX2LONG(Numeric)SWIG_AsVal_long(VALUE, long*)
    unsigned long FIX2ULONG(Numeric) SWIG_AsVal_unsigned_SS_long(VALUE, unsigned long*)
    char NUM2CHR(Numeric or String)SWIG_AsVal_char(VALUE, int*)
    char * StringValuePtr(String) SWIG_AsCharPtrAndSize(VALUE, char*, size_t, int* alloc)
    char * rb_str2cstr(String, int*length)
    double NUM2DBL(Numeric)(double) SWIG_AsVal_int(VALUE) or similar

    38.7.8.3 Macros for VALUE

    RSTRING_LEN(str)

    length of the Ruby string

    RSTRING_PTR(str)

    pointer to string storage

    RARRAY_LEN(arr)

    length of the Ruby array

    RARRAY(arr)->capa

    capacity of the Ruby array

    RARRAY_PTR(arr)

    pointer to array storage

    38.7.8.4 Exceptions

    void rb_raise(VALUE exception, const char *fmt, ...)

    Raises an exception. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_fatal(const char *fmt, ...)

    Raises a fatal exception, terminating the process. No rescue blocks are called, but ensure blocks will be called. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_bug(const char *fmt, ...)

    Terminates the process immediately -- no handlers of any sort will be called. The given format string fmt and remaining arguments are interpreted as with printf(). You should call this function only if a fatal bug has been exposed.

    void rb_sys_fail(const char *msg)

    Raises a platform-specific exception corresponding to the last known system error, with the given string msg.

    VALUE rb_rescue(VALUE (*body)(VALUE), VALUE args, VALUE(*rescue)(VALUE, VALUE), VALUE rargs)

    Executes body with the given args. If a StandardError exception is raised, then execute rescue with the given rargs.

    VALUE rb_ensure(VALUE(*body)(VALUE), VALUE args, VALUE(*ensure)(VALUE), VALUE eargs)

    Executes body with the given args. Whether or not an exception is raised, execute ensure with the given rargs after body has completed.

    VALUE rb_protect(VALUE (*body)(VALUE), VALUE args, int *result)

    Executes body with the given args and returns nonzero in result if any exception was raised.

    void rb_notimplement()

    Raises a NotImpError exception to indicate that the enclosed function is not implemented yet, or not available on this platform.

    void rb_exit(int status)

    Exits Ruby with the given status. Raises a SystemExit exception and calls registered exit functions and finalizers.

    void rb_warn(const char *fmt, ...)

    Unconditionally issues a warning message to standard error. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_warning(const char *fmt, ...)

    Conditionally issues a warning message to standard error if Ruby was invoked with the -w flag. The given format string fmt and remaining arguments are interpreted as with printf().

    38.7.8.5 Iterators

    void rb_iter_break()

    Breaks out of the enclosing iterator block.

    VALUE rb_each(VALUE obj)

    Invokes the each method of the given obj.

    VALUE rb_yield(VALUE arg)

    Transfers execution to the iterator block in the current context, passing arg as an argument. Multiple values may be passed in an array.

    int rb_block_given_p()

    Returns true if yield would execute a block in the current context; that is, if a code block was passed to the current method and is available to be called.

    VALUE rb_iterate(VALUE (*method)(VALUE), VALUE args, VALUE (*block)(VALUE, VALUE), VALUE arg2)

    Invokes method with argument args and block block. A yield from that method will invoke block with the argument given to yield, and a second argument arg2.

    VALUE rb_catch(const char *tag, VALUE (*proc)(VALUE, VALUE), VALUE value)

    Equivalent to Ruby's catch.

    void rb_throw(const char *tag, VALUE value)

    Equivalent to Ruby's throw.

    38.7.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the examples in the Example/ruby directory.

    38.7.10 Converting a Ruby array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Ruby Array instance to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Get the length of the array */
      int size = RARRAY($input)->len; 
      int i;
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* Get the first element in memory */
      VALUE *ptr = RARRAY($input)->ptr; 
      for (i=0; i < size; i++, ptr++) {
        /* Convert Ruby Object String to char* */
        $1[i]= StringValuePtr(*ptr); 
      }
      $1[i]=NULL; /* End of list */
    }
    
    // This cleans up the char ** array created before 
    // the function call
    
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}

    When this module is compiled, the wrapped C function now operates as follows :

    require 'Argv'
    Argv.print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    38.7.11 Collecting arguments in a hash

    Ruby's solution to the "keyword arguments" capability of some other languages is to allow the programmer to pass in one or more key-value pairs as arguments to a function. All of those key-value pairs are collected in a single Hash argument that's presented to the function. If it makes sense, you might want to provide similar functionality for your Ruby interface. For example, suppose you'd like to wrap this C function that collects information about people's vital statistics:

    void setVitalStats(const char *person, int nattributes, const char **names, int *values);

    and you'd like to be able to call it from Ruby by passing in an arbitrary number of key-value pairs as inputs, e.g.

    setVitalStats("Fred", 
      'weight' => 270, 
      'age' => 42 
    )

    To make this work, you need to write a typemap that expects a Ruby Hash as its input and somehow extracts the last three arguments ( nattributes, names and values) needed by your C function. Let's start with the basics:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
    }
     

    This %typemap directive tells SWIG that we want to match any function declaration that has the specified types and names of arguments somewhere in the argument list. The fact that we specified the argument names (nattributes, names and values) in our typemap is significant; this ensures that SWIG won't try to apply this typemap to other functions it sees that happen to have a similar declaration with different argument names. The arguments that appear in the second set of parentheses (keys_arr, i , key and val) define local variables that our typemap will need.

    Since we expect the input argument to be a Hash, let's next add a check for that:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
    }

    Check_Type() is just a macro (defined in the Ruby header files) that confirms that the input argument is of the correct type; if it isn't, an exception will be raised.

    The next task is to determine how many key-value pairs are present in the hash; we'll assign this number to the first typemap argument ( $1). This is a little tricky since the Ruby/C API doesn't provide a public function for querying the size of a hash, but we can get around that by calling the hash's size method directly and converting its result to a C int value:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
    }

    So now we know the number of attributes. Next we need to initialize the second and third typemap arguments (i.e. the two C arrays) to NULL and set the stage for extracting the keys and values from the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
        }
    }

    There are a number of ways we could extract the keys and values from the input hash, but the simplest approach is to first call the hash's keys method (which returns a Ruby array of the keys) and then start looping over the elements in that array:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
          for (i = 0; i < $1; i++) {
          }
        }
    }

    Recall that keys_arr and i are local variables for this typemap. For each element in the keys_arr array, we want to get the key itself, as well as the value corresponding to that key in the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
          }
        }
    }

    To be safe, we should again use the Check_Type() macro to confirm that the key is a String and the value is a Fixnum :

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
            Check_Type(key, T_STRING);
            Check_Type(val, T_FIXNUM);
          }
        }
    }

    Finally, we can convert these Ruby objects into their C equivalents and store them in our local C arrays:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
      Check_Type($input, T_HASH);
      $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
      $2 = NULL;
      $3 = NULL;
      if ($1 > 0) {
        $2 = (char **) malloc($1*sizeof(char *));
        $3 = (int *) malloc($1*sizeof(int));
        keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
        for (i = 0; i < $1; i++) {
          key = rb_ary_entry(keys_arr, i);
          val = rb_hash_aref($input, key);
          Check_Type(key, T_STRING);
          Check_Type(val, T_FIXNUM);
          $2[i] = StringValuePtr(key);
          $3[i] = NUM2INT(val);
        }
      }
    }

    We're not done yet. Since we used malloc() to dynamically allocate the memory used for the names and values arguments, we need to provide a corresponding "freearg" typemap to free that memory so that there is no memory leak. Fortunately, this typemap is a lot easier to write:

    %typemap(freearg) (int nattributes, const char **names, const int *values) {
      free((void *) $2);
      free((void *) $3);
    }

    All of the code for this example, as well as a sample Ruby program that uses the extension, can be found in the Examples/ruby/hashargs directory of the SWIG distribution.

    38.7.12 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(VALUE obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Ruby object obj to a C pointer whose address is ptr (i.e. ptr is a pointer to a pointer). The third argument, ty, is a pointer to a SWIG type descriptor structure. If ty is not NULL, that type information is used to validate type compatibility and other aspects of the type conversion. If flags is non-zero, any type errors encountered during this validation result in a Ruby TypeError exception being raised; if flags is zero, such type errors will cause SWIG_ConvertPtr() to return -1 but not raise an exception. If ty is NULL, no type-checking is performed.

    VALUE SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Ruby pointer object. Here, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Ruby should take ownership of the pointer (i.e. whether Ruby should free this data when the corresponding Ruby instance is garbage-collected).

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *foo;
    SWIG_ConvertPtr($input, (void **) &foo, SWIGTYPE_p_Foo, 1);
    
    VALUE obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 1);
    }

    38.7.12.1 Ruby Datatype Wrapping

    VALUE Data_Wrap_Struct(VALUE class, void (*mark)(void *), void (*free)(void *), void *ptr)

    Given a pointer ptr to some C data, and the two garbage collection routines for this data (mark and free ), return a VALUE for the Ruby object.

    VALUE Data_Make_Struct(VALUE class, c-type, void (*mark)(void *), void (*free)(void *), c-type *ptr)

    Allocates a new instance of a C data type c-type , assigns it to the pointer ptr, then wraps that pointer with Data_Wrap_Struct() as above.

    Data_Get_Struct(VALUE obj, c-type, c-type *ptr)

    Retrieves the original C pointer of type c-type from the data object obj and assigns that pointer to ptr.

    38.7.13 Example: STL Vector to Ruby Array

    Another use for macros and type maps is to create a Ruby array from a STL vector of pointers. In essence, copy of all the pointers in the vector into a Ruby array. The use of the macro is to make the typemap so generic that any vector with pointers can use the type map. The following is an example of how to construct this type of macro/typemap and should give insight into constructing similar typemaps for other STL structures:

    %define PTR_VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size());
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size());
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %enddef

    Note, that the "c ## classname.klass" is used in the preprocessor step to determine the actual object from the class name.

    To use the macro with a class Foo, the following is used:

    PTR_VECTOR_TO_RUBY_ARRAY(vector<foo *="">, Foo)

    It is also possible to create a STL vector of Ruby objects:

    %define RUBY_ARRAY_TO_PTR_VECTOR(vectorclassname, classname)
    %typemap(in) vectorclassname &, const vectorclassname & {
      Check_Type($input, T_ARRAY);
      vectorclassname *vec = new vectorclassname;
      int len = RARRAY($input)->len;
      for (int i=0; i!=len; i++) {
        VALUE inst = rb_ary_entry($input, i);
        //The following _should_ work but doesn't on HPUX
        // Check_Type(inst, T_DATA);
        classname *element = NULL;
        Data_Get_Struct(inst, classname, element);
        vec->push_back(element);
      }
      $1 = vec;
    }
    
    %typemap(freearg) vectorclassname &, const vectorclassname & {
      delete $1;
    }
    %enddef

    It is also possible to create a Ruby array from a vector of static data types:

    %define VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size()); 
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size()); 
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %enddef
    Note that this is mostly an example of typemaps. If you want to use the STL with ruby, you are advised to use the standard swig STL library, which does much more than this. Refer to the section called the C++ Standard Template Library.

    38.8 Docstring Features

    Using ri and rdoc web pages in Ruby libraries is a common practice. Given the way that SWIG generates the extensions by default, your users will normally not get any documentation for it, even if they run 'rdoc' on the resulting .c or .cxx file.

    The features described in this section make it easy for you to add rdoc strings to your modules, functions and methods that can then be read by Ruby's rdoc tool to generate html web pages, ri documentation, Windows chm file and an .xml description.

    rdoc can then be run from a console or shell window on a swig generated file.

    For example, to generate html web pages from a C++ file, you'd do:

    $ rdoc -E cxx=c -f html file_wrap.cxx
    

    To generate ri documentation from a c wrap file, you could do:

    $ rdoc -r file_wrap.c
    

    38.8.1 Module docstring

    Ruby allows a docstring at the beginning of the file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc

    38.8.2 %feature("autodoc")

    Since SWIG does know everything about the function it wraps, it is possible to generate an rdoc containing the parameter types, names and default values. Since Ruby ships with one of the best documentation systems of any language, it makes sense to take advantage of it.

    SWIG's Ruby module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause an rdoc comment to be generated in the wrapper file that includes the name of the function, parameter names, default values if any, and return type if any. There are also several options for autodoc controlled by the value given to the feature, described below.

    38.8.2.1 %feature("autodoc", "0")

    When the "0" option is given then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);

    Then Ruby code like this will be generated:

    function_name(x, y, foo=nil, bar=nil) -> bool
      ...

    38.8.2.2 %feature("autodoc", "1")

    When the "1" option is used then the parameter types will be used in the rdoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Ruby user. Pointer, reference and const info is removed, %rename's are evaluated, etc. (This is not always successful, but works most of the time. See the next section for what to do when it doesn't.) Given the example above, then turning on the parameter types with the "1" option will result in rdoc code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
      ...

    38.8.2.3 %feature("autodoc", "2")

    When the "2" option is used then the parameter types will not be used in the rdoc string. However, they will be listed in full after the function. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    38.8.2.4 %feature("autodoc", "3")

    When the "3" option is used then the function will be documented using a combination of "1" and "2" above. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
    
    Parameters:
            x - int
            y - int
            foo - Foo
            bar - Bar

    38.8.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Ruby programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);

    38.8.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together.

    38.9 Advanced Topics

    38.9.1 Operator overloading

    SWIG allows operator overloading with, by using the %extend or %rename commands in SWIG and the following operator names (derived from Python):

    General
    __repr__ inspect
    __str__ to_s
    __cmp__ <=>
    __hash__ hash
    __nonzero__ nonzero?
    Callable
    __call__ call
    Collection
    __len__ length
    __getitem__ []
    __setitem__ []=
    Numeric
    __add__ +
    __sub__ -
    __mul__ *
    __div__ /
    __mod__ %
    __divmod__ divmod
    __pow__ **
    __lshift__ <<
    __rshift__ >>
    __and__ &
    __xor__ ^
    __or__ |
    __neg__ -@
    __pos__ +@
    __abs__ abs
    __invert__ ~
    __int__ to_i
    __float__ to_f
    __coerce__ coerce
    Additions in 1.3.13
    __lt__ <
    __le__ <=
    __eq__ ==
    __gt__ >
    __ge__ >=

    Note that although SWIG supports the __eq__ magic method name for defining an equivalence operator, there is no separate method for handling inequality since Ruby parses the expression a != b as !(a == b).

    38.9.2 Creating Multi-Module Packages

    The chapter on Working with Modules discusses the basics of creating multi-module extensions with SWIG, and in particular the considerations for sharing runtime type information among the different modules.

    As an example, consider one module's interface file (shape.i ) that defines our base class:

    %module shape
    
    %{
    #include "Shape.h"
    %}
    
    class Shape {
    protected:
      double xpos;
      double ypos;
    protected:
      Shape(double x, double y);
    public:
      double getX() const;
      double getY() const;
    };

    We also have a separate interface file (circle.i) that defines a derived class:

    %module circle
    
    %{
    #include "Shape.h"
    #include "Circle.h"
    %}
    
    // Import the base class definition from Shape module
    %import shape.i
    
    class Circle : public Shape {
    protected:
      double radius;
    public:
      Circle(double x, double y, double r);
      double getRadius() const;
    };

    We'll start by building the Shape extension module:

    $ swig -c++ -ruby shape.i
    

    SWIG generates a wrapper file named shape_wrap.cxx. To compile this into a dynamically loadable extension for Ruby, prepare an extconf.rb script using this template:

    require 'mkmf'
    
    # Since the SWIG runtime support library for Ruby
    # depends on the Ruby library, make sure it's in the list
    # of libraries.
    $libs = append_library($libs, Config::CONFIG['RUBY_INSTALL_NAME'])
    
    # Create the makefile
    create_makefile('shape')

    Run this script to create a Makefile and then type make to build the shared library:

    $ ruby extconf.rb
    creating Makefile
    $ make
    g++ -fPIC -g -O2 -I. -I/usr/include/ruby-2.1.0 \
    -I. -c shape_wrap.cxx
    gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \
    -lruby -lruby -lc

    Note that depending on your installation, the outputs may be slightly different; these outputs are those for a Linux-based development environment. The end result should be a shared library (here, shape.so) containing the extension module code. Now repeat this process in a separate directory for the Circle module:

    1. Run SWIG to generate the wrapper code (circle_wrap.cxx);
    2. Write an extconf.rb script that your end-users can use to create a platform-specific Makefile for the extension;
    3. Build the shared library for this extension by typing make .

    Once you've built both of these extension modules, you can test them interactively in IRB to confirm that the Shape and Circle modules are properly loaded and initialized:

    $ irb
    irb(main):001:0> require 'shape'
    true
    irb(main):002:0> require 'circle'
    true
    irb(main):003:0> c = Circle::Circle.new(5, 5, 20)
    #<Circle::Circle:0xa097208>
    irb(main):004:0> c.kind_of? Shape::Shape
    true
    irb(main):005:0> c.getX()
    5.0

    38.9.3 Specifying Mixin Modules

    The Ruby language doesn't support multiple inheritance, but it does allow you to mix one or more modules into a class using Ruby's include method. For example, if you have a Ruby class that defines an each instance method, e.g.

    class Set
      def initialize
      @members = []
      end
     
      def each
      @members.each { |m| yield m }
      end
    end

    then you can mix-in Ruby's Enumerable module to easily add a lot of functionality to your class:

    class Set
      include Enumerable
      def initialize
        @members = []
      end
      def each
        @members.each { |m| yield m }
      end
    end

    To get the same benefit for your SWIG-wrapped classes, you can use the %mixin directive to specify the names of one or more modules that should be mixed-in to a class. For the above example, the SWIG interface specification might look like this:

    %mixin Set "Enumerable";
    
    class Set {
    public:
      // Constructor
      Set();
     
      // Iterates through set members
      void each();
    };

    Multiple modules can be mixed into a class by providing a comma-separated list of module names to the %mixin directive, e.g.

    %mixin Set "Fee, Fi, Fo, Fum";

    Note that the %mixin directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.10 Memory Management

    One of the most common issues in generating SWIG bindings for Ruby is proper memory management. The key to proper memory management is clearly defining whether a wrapper Ruby object owns the underlying C struct or C++ class. There are two possibilities:

    • The Ruby object is responsible for freeing the C struct or C++ object
    • The Ruby object should not free the C struct or C++ object because it will be freed by the underlying C or C++ code

    To complicate matters, object ownership may transfer from Ruby to C++ (or vice versa) depending on what function or methods are invoked. Clearly, developing a SWIG wrapper requires a thorough understanding of how the underlying library manages memory.

    38.10.1 Mark and Sweep Garbage Collector

    Ruby uses a mark and sweep garbage collector. When the garbage collector runs, it finds all the "root" objects, including local variables, global variables, global constants, hardware registers and the C stack. For each root object, the garbage collector sets its mark flag to true and calls rb_gc_mark on the object. The job of rb_gc_mark is to recursively mark all the objects that a Ruby object has a reference to (ignoring those objects that have already been marked). Those objects, in turn, may reference other objects. This process will continue until all active objects have been "marked." After the mark phase comes the sweep phase. In the sweep phase, all objects that have not been marked will be garbage collected.

    The Ruby C/API provides extension developers two hooks into the garbage collector - a "mark" function and a "sweep" function. By default these functions are set to NULL.

    If a C struct or C++ class references any other Ruby objects, then it must provide a "mark" function. The "mark" function should identify any referenced Ruby objects by calling the rb_gc_mark function for each one. Unsurprisingly, this function will be called by the Ruby garbage during the "mark" phase.

    During the sweep phase, Ruby destroys any unused objects. If any memory has been allocated in creating the underlying C struct or C++ struct, then a "free" function must be defined that deallocates this memory.

    38.10.2 Object Ownership

    As described above, memory management depends on clearly defining who is responsible for freeing the underlying C struct or C++ class. If the Ruby object is responsible for freeing the C++ object, then a "free" function must be registered for the object. If the Ruby object is not responsible for freeing the underlying memory, then a "free" function must not be registered for the object.

    For the most part, SWIG takes care of memory management issues. The rules it uses are:

    • When calling a C++ object's constructor from Ruby, SWIG will assign a "free" function thereby making the Ruby object responsible for freeing the C++ object
    • When calling a C++ member function that returns a pointer, SWIG will not assign a "free" function thereby making the underlying library responsible for freeing the object.

    To make this clearer, let's look at an example. Assume we have a Foo and a Bar class.

    /* File "RubyOwernshipExample.h" */
    
    class Foo
    {
    public:
      Foo() {}
      ~Foo() {}
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar(): foo_(new Foo) {}
      ~Bar() { delete foo_; }
      Foo* get_foo() { return foo_; }
      Foo* get_new_foo() { return new Foo; }
      void set_foo(Foo *foo) { delete foo_; foo_ = foo; }
    };

    First, consider this Ruby code:

    foo = Foo.new

    In this case, the Ruby code calls the underlying Foo C++ constructor, thus creating a new foo object. By default, SWIG will assign the new Ruby object a "free" function. When the Ruby object is garbage collected, the "free" function will be called. It in turn will call Foo's destructor.

    Next, consider this code:

    bar = Bar.new
    foo = bar.get_foo()

    In this case, the Ruby code calls a C++ member function, get_foo . By default, SWIG will not assign the Ruby object a "free" function. Thus, when the Ruby object is garbage collected the underlying C++ foo object is not affected.

    Unfortunately, the real world is not as simple as the examples above. For example:

    bar = Bar.new
    foo = bar.get_new_foo()

    In this case, the default SWIG behavior for calling member functions is incorrect. The Ruby object should assume ownership of the returned object. This can be done by using the %newobject directive. See Object ownership and %newobject for more information.

    The SWIG default mappings are also incorrect in this case:

    foo = Foo.new
    bar = Bar.new
    bar.set_foo(foo)

    Without modification, this code will cause a segmentation fault. When the Ruby foo object goes out of scope, it will free the underlying C++ foo object. However, when the Ruby bar object goes out of scope, it will call the C++ bar destructor which will also free the C++ foo object. The problem is that object ownership is transferred from the Ruby object to the C++ object when the set_foo method is called. This can be done by using the special DISOWN type map, which was added to the Ruby bindings in SWIG-1.3.26.

    Thus, a correct SWIG interface file correct mapping for these classes is:

    /* File RubyOwnershipExample.i */
    
    %module RubyOwnershipExample
    
    %{
    #include "RubyOwnershipExample.h"
    %}
    
    class Foo
    {
    public:
      Foo();
      ~Foo();
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar();
      ~Bar();
      Foo* get_foo();
    
      %newobject get_new_foo;
      Foo* get_new_foo();
    
      %apply SWIGTYPE *DISOWN {Foo *foo};
      void set_foo(Foo *foo);
      %clear Foo *foo;
    };
    

    This code can be seen in swig/examples/ruby/tracking.

    38.10.3 Object Tracking

    The remaining parts of this section will use the class library shown below to illustrate different memory management techniques. The class library models a zoo and the animals it contains.

    %module zoo
    
    %{
    #include <string>
    #include <vector>
    
    #include "zoo.h"
    %}
    
    class Animal
    {
    private:
      typedef std::vector<Animal*> AnimalsType;
      typedef AnimalsType::iterator IterType;
    protected:
      AnimalsType animals;
    protected:
      std::string name_;
    public:
      // Construct an animal with this name
      Animal(const char* name) : name_(name) {}
     
      // Return the animal's name
      const char* get_name() const { return name.c_str(); }
    };
    
    class Zoo
    {
    protected:
     std::vector<Animal *> animals;
     
    public:
      // Construct an empty zoo
      Zoo() {}
      
      /* Create a new animal. */
      static Animal* Zoo::create_animal(const char* name) {
        return new Animal(name);
      }
     
      // Add a new animal to the zoo
      void add_animal(Animal* animal) {
        animals.push_back(animal); 
      }
     
      Animal* remove_animal(size_t i) {
        Animal* result = this->animals[i];
        IterType iter = this->animals.begin();
        std::advance(iter, i);
        this->animals.erase(iter);
       
        return result;
      }
      
      // Return the number of animals in the zoo
      size_t get_num_animals() const {
        return animals.size(); 
      }
      
      // Return a pointer to the ith animal
      Animal* get_animal(size_t i) const {
        return animals[i]; 
      }
    };

    Let's say you SWIG this code and then run IRB:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3820>
    
    irb(main):004:0> tiger1.get_name()
    => "tiger1"
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a60>
    
    irb(main):006:0> zoo.add_animal(tiger)
    => nil
    
    irb(main):007:0> zoo.get_num_animals()
    => 1
    
    irb(main):007:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2bd4a18>
    
    irb(main):008:0> tiger2.get_name()
    => "tiger1"
    
    irb(main):009:0> tiger1.equal?(tiger2)
    => false
    

    Pay particular attention to the code tiger1.equal?(tiger2). Note that the two Ruby objects are not the same - but they reference the same underlying C++ object. This can cause problems. For example:

    irb(main):010:0> tiger1 = nil
    => nil
    
    irb(main):011:0> GC.start
    => nil
    
    irb(main):012:0> tiger2.get_name()
    (irb):12: [BUG] Segmentation fault
    

    After the garbage collector runs, as a result of our call to GC.start, callingtiger2.get_name() causes a segmentation fault. The problem is that when tiger1 is garbage collected, it frees the underlying C++ object. Thus, when tiger2 calls the get_name() method it invokes it on a destroyed object.

    This problem can be avoided if SWIG enforces a one-to-one mapping between Ruby objects and C++ classes. This can be done via the use of the %trackobjects functionality available in SWIG-1.3.26. and later.

    When the %trackobjects is turned on, SWIG automatically keeps track of mappings between C++ objects and Ruby objects. Note that enabling object tracking causes a slight performance degradation. Test results show this degradation to be about 3% to 5% when creating and destroying 100,000 animals in a row.

    Since %trackobjects is implemented as a %feature, it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features") . Thus it can be applied on a class-by-class basis if needed. To fix the example above:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Tell SWIG that create_animal creates a new object */
    %newobject Zoo::create_animal;
    
    /* Tell SWIG to keep track of mappings between C/C++ structs/classes. */
    %trackobjects;
    
    %include "example.h"

    When this code runs we see:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be37d8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a18>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):006:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2be37d8>
    
    irb(main):007:0> tiger1.equal?(tiger2)
    => true
    
    irb(main):008:0> tiger1 = nil
    => nil
    
    irb(main):009:0> GC.start
    => nil
    
    irb(main):010:0> tiger.get_name()
    => "tiger1"
    irb(main):011:0>

    For those who are interested, object tracking is implemented by storing Ruby objects in a hash table and keying them on C++ pointers. The underlying API is:

    static void SWIG_RubyAddTracking(void* ptr, VALUE object);
    static VALUE SWIG_RubyInstanceFor(void* ptr) ;
    static void SWIG_RubyRemoveTracking(void* ptr);
    static void SWIG_RubyUnlinkObjects(void* ptr);

    When an object is created, SWIG will automatically call the SWIG_RubyAddTracking method. Similarly, when an object is deleted, SWIG will call the SWIG_RubyRemoveTracking. When an object is returned to Ruby from C++, SWIG will use the SWIG_RubyInstanceFor method to ensure a one-to-one mapping from Ruby to C++ objects. Last, the RubyUnlinkObjects method unlinks a Ruby object from its underlying C++ object.

    In general, you will only need to use the SWIG_RubyInstanceFor , which is required for implementing mark functions as shown below. However, if you implement your own free functions (see below) you may also have to call the SWIG_RubyRemoveTracking and RubyUnlinkObjects methods.

    38.10.4 Mark Functions

    With a bit more testing, we see that our class library still has problems. For example:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bea6a8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be7960>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> tiger1 = nil
    => nil
    
    irb(main):007:0> GC.start
    => nil
    
    irb(main):005:0> tiger2 = zoo.get_animal(0)
    (irb):12: [BUG] Segmentation fault

    The problem is that Ruby does not know that the zoo object contains a reference to a Ruby object. Thus, when Ruby garbage collects tiger1 it frees the underlying C++ object.

    This can be fixed by implementing a mark function as described above in the Mark and Sweep Garbage Collector section. You can specify a mark function by using the %markfunc directive. Since the %markfunc directive is implemented using SWIG's' "features" mechanism it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features" for more details).

    A mark function takes a single argument, which is a pointer to the C++ object being marked; it should, in turn, call rb_gc_mark() for any instances that are reachable from the current object. The mark function for our Zoo class should therefore loop over all of the C++ animal objects in the zoo object, look up their Ruby object equivalent, and then call rb_gc_mark(). One possible implementation is:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Keep track of mappings between C/C++ structs/classes
     and Ruby objects so we can implement a mark function. */
    %trackobjects;
    
    /* Specify the mark function */
    %markfunc Zoo "mark_Zoo";
    
    %include "example.h"
    
    %header %{
    
    static void mark_Zoo(void* ptr) {
      Zoo* zoo = (Zoo*) ptr;
     
      /* Loop over each object and tell the garbage collector
      that we are holding a reference to them. */
      int count = zoo->get_num_animals();
     
      for(int i = 0; i < count; ++i) {
        Animal* animal = zoo->get_animal(i);
        VALUE object = SWIG_RubyInstanceFor(animal);
     
        if (object != Qnil) {
          rb_gc_mark(object);
        }
      }
    }
    %}

    Note the mark function is dependent on the SWIG_RUBY_InstanceFor method, and thus requires that %trackobjects is enabled. For more information, please refer to the ruby_track_objects.i test case in the SWIG test suite.

    When this code is compiled we now see:

    $ irb
    irb(main):002:0> tiger1=Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):003:0> Example::Zoo.new()
    => #<Example::Zoo:0x2be1780>
    
    irb(main):004:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2bde9c0>
    
    irb(main):005:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):009:0> tiger1 = nil
    => nil
    
    irb(main):010:0> GC.start
    => nil
    irb(main):014:0> tiger2 = zoo.get_animal(0)
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):015:0> tiger2.get_name()
    => "tiger1"
    irb(main):016:0>

    This code can be seen in swig/examples/ruby/mark_function.

    38.10.5 Free Functions

    By default, SWIG creates a "free" function that is called when a Ruby object is garbage collected. The free function simply calls the C++ object's destructor.

    However, sometimes an appropriate destructor does not exist or special processing needs to be performed before the destructor is called. Therefore, SWIG allows you to manually specify a "free" function via the use of the %freefunc directive. The %freefunc directive is implemented using SWIG's' "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    IMPORTANT ! - If you define your own free function, then you must ensure that you call the underlying C++ object's destructor. In addition, if object tracking is activated for the object's class, you must also call the SWIG_RubyRemoveTracking function (of course call this before you destroy the C++ object). Note that it is harmless to call this method if object tracking if off so it is advised to always call it.

    Note there is a subtle interaction between object ownership and free functions. A custom defined free function will only be called if the Ruby object owns the underlying C++ object. This also to Ruby objects which are created, but then transfer ownership to C++ objects via the use of the disown typemap described above.

    To show how to use the %freefunc directive, let's slightly change our example. Assume that the zoo object is responsible for freeing any animal that it contains. This means that the Zoo::add_animal function should be marked with a DISOWN typemap and the destructor should be updated as below:

    Zoo::~Zoo() {
      IterType iter = this->animals.begin();
      IterType end = this->animals.end();
     
      for(iter; iter != end; ++iter) {
        Animal* animal = *iter;
        delete animal;
      }
    }
    

    When we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    (irb):12: [BUG] Segmentation fault
    

    The error happens because the C++ animal object is freed when the zoo object is freed. Although this error is unavoidable, we can at least prevent the segmentation fault. To do this requires enabling object tracking and implementing a custom free function that calls the SWIG_RubyUnlinkObjects function for each animal object that is destroyed. The SWIG_RubyUnlinkObjects function notifies SWIG that a Ruby object's underlying C++ object is no longer valid. Once notified, SWIG will intercept any calls from the existing Ruby object to the destroyed C++ object and raise an exception.

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Specify that ownership is transferred to the zoo when calling add_animal */
    %apply SWIGTYPE *DISOWN { Animal* animal };
    
    /* Track objects */
    %trackobjects;
    
    /* Specify the mark function */
    %freefunc Zoo "free_Zoo";
    
    %include "example.h"
    
    %header %{
      static void free_Zoo(void* ptr) {
        Zoo* zoo = (Zoo*) ptr;
    
        /* Loop over each animal */
        int count = zoo->get_num_animals();
    
        for(int i = 0; i < count; ++i) {
          /* Get an animal */
          Animal* animal = zoo->get_animal(i);
    
          /* Unlink the Ruby object from the C++ object */
          SWIG_RubyUnlinkObjects(animal);
    
          /* Now remove the tracking for this animal */
          SWIG_RubyRemoveTracking(animal);
        }
    
        /* Now call SWIG_RubyRemoveTracking for the zoo */
        SWIG_RubyRemoveTracking(ptr);
        /* Now free the zoo which will free the animals it contains */
        delete zoo;
      }
    %} 

    Now when we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    RuntimeError: This Animal * already released
     from (irb):10:in `get_name'
     from (irb):10
    irb(main):011:0>

    Notice that SWIG can now detect the underlying C++ object has been freed, and thus raises a runtime exception.

    This code can be seen in swig/examples/ruby/free_function.

    38.10.6 Embedded Ruby and the C++ Stack

    As has been said, the Ruby GC runs and marks objects before its sweep phase. When the garbage collector is called, it will also try to mark any Ruby objects (VALUE) it finds in the machine registers and in the C++ stack.

    The stack is basically the history of the functions that have been called and also contains local variables, such as the ones you define whenever you do inside a function:

    VALUE obj;

    For ruby to determine where its stack space begins, during initialization a normal Ruby interpreter will call the ruby_init() function which in turn will call a function called Init_stack or similar. This function will store a pointer to the location where the stack points at that point in time.

    ruby_init() is presumed to always be called within the main() function of your program and whenever the GC is called, ruby will assume that the memory between the current location in memory and the pointer that was stored previously represents the stack, which may contain local (and temporary) VALUE ruby objects. Ruby will then be careful not to remove any of those objects in that location.

    So far so good. For a normal Ruby session, all the above is completely transparent and magic to the extensions developer.

    However, with an embedded Ruby, it may not always be possible to modify main() to make sure ruby_init() is called there. As such, ruby_init() will likely end up being called from within some other function. This can lead Ruby to measure incorrectly where the stack begins and can result in Ruby incorrectly collecting those temporary VALUE objects that are created once another function is called. The end result: random crashes and segmentation faults.

    This problem will often be seen in director functions that are used for callbacks, for example.

    To solve the problem, SWIG can now generate code with director functions containing the optional macros SWIG_INIT_STACK and SWIG_RELEASE_STACK. These macros will try to force Ruby to reinitialize the beginning of the stack the first time a director function is called. This will lead Ruby to measure and not collect any VALUE objects defined from that point on.

    To mark functions to either reset the ruby stack or not, you can use:

    %initstack Class::memberfunction;   // only re-init the stack in this director method
    %ignorestack Class::memberfunction; // do not re-init the stack in this director method
    %initstack Class;                   // init the stack on all the methods of this class
    %initstack;                         // all director functions will re-init the stack
    

    39 SWIG and Scilab

    Scilab is a scientific software package for numerical computations providing a powerful open computing environment for engineering and scientific applications that is mostly compatible with MATLAB. More information can be found at www.scilab.org.

    This chapter explains how to use SWIG for Scilab. After this introduction, you should be able to generate with SWIG a Scilab external module from a C/C++ library.

    39.1 Preliminaries

    SWIG for Scilab supports Linux. Other operating sytems haven't been tested.

    Scilab is supported from version 5.3.3 onwards. The forthcoming version 6, as of January 2015, is also supported.

    SWIG for Scilab supports C language. C++ is partially supported. See A basic tour of C/C++ wrapping for further details.

    39.2 Running SWIG

    Let's see how to use SWIG for Scilab on a small example.
    In this example we bind from C a function and a global variable into Scilab. The SWIG interface (stored in a file named example.i ), is the following:

    %module example
    
    %inline %{
    double Foo = 3.0;
    
    int fact(int n) {
        if (n < 0) {
            return 0;
        }
        else if (n == 0) {
            return 1;
        }
        else {
            return n * fact(n-1);
        }
    }
    %}
    

    Note: a code in an %inline section is both parsed and wrapped by SWIG, and inserted as is in the wrapper source file.

    39.2.1 Generating the module

    The module is generated using the swig executable and its -scilab option.

    $ swig -scilab example.i
    

    This command generates two files:

    • example_wrap.c: a C source file containing the wrapping code and also here the wrapped code (the fact() and Foo definitions)
    • loader.sce: a Scilab script used to load the module into Scilab

    Note: if the following error is returned:

    :1: Error: Unable to find 'swig.swg'
    :3: Error: Unable to find 'scilab.swg'
    

    it may be because the SWIG library is not found. Check the SWIG_LIB environment variable or your SWIG installation.

    Note: SWIG for Scilab can work in two modes related to the way the module is built, see the Building modes section for details. This example uses the builder mode.

    The swig executable has several other command line options you can use. See Scilab command line options for further details.

    39.2.2 Building the module

    To be loaded in Scilab, the wrapper has to be built into a dynamic module (or shared library).

    The commands to compile and link the wrapper (with gcc) into the shared library libexample.so are:

    $ gcc -fPIC -c -I/usr/local/include/scilab example_wrap.c
    $ gcc -shared example_wrap.o -o libexample.so
    

    Note: we supposed in this example that the path to the Scilab include directory is /usr/local/include/scilab (which is the case in a Debian environment), this should be changed for another environment.

    39.2.3 Loading the module

    Loading a module is done by running the loader script in Scilab:

    --> exec loader.sce
    

    Scilab should output the following messages:

    Shared archive loaded.
    Link done.
    

    which means that Scilab has successfully loaded the shared library. The module functions and other symbols are now available in Scilab.

    39.2.4 Using the module

    In Scilab, the function fact() is simply called as following:

    --> fact(5)
    ans  =
    
        120.
    

    For the Foo global variable, the accessors need to be used:

    --> Foo_get
    ans  =
    
        3.
    
    --> Foo_set(4);
    
    --> Foo_get
    ans  =
    
        4.
    

    Note: for conciseness, we assume in the subsequent Scilab code examples that the modules have been beforehand built and loaded in Scilab.

    39.2.5 Scilab command line options

    The following table lists the Scilab specific command line options in addition to the generic SWIG options:

    -builderGenerate the Scilab builder script
    -buildercflags <cflags>Add <cflags> to the builder compiler flags
    -builderldflags <ldflags>Add <ldlags> to the builder linker flags
    -buildersources <files>Add the (comma separated) files <files> to the builder sources
    -builderverbositylevel <level>Set the build verbosity level to <level> (default 0: off, 2: high)
    -builderflagscript <file>Use the Scilab script <file> to configure the compiler and linker flags
    -gatewayxml <gateway_id>Generate the gateway XML with the given <gateway_id>

    These options can be displayed with:

    $ swig -scilab -help
    

    39.3 A basic tour of C/C++ wrapping

    39.3.1 Overview

    SWIG for Scilab provides only a low-level C interface for Scilab (see Scripting Languages for the general approach to wrapping). This means that functions, structs, classes, variables, etc... are interfaced through C functions. These C functions are mapped as Scilab functions. There are a few exceptions, such as constants and enumerations, which can be wrapped directly as Scilab variables.

    39.3.2 Identifiers

    In Scilab 5.x, identifier names are composed of 24 characters maximum (this limitation should disappear from Scilab 6.0 onwards).
    Thus long function or variable names may be truncated and this can cause ambiguities.

    This happens especially when wrapping structs/classes, for which the wrapped function name is composed of the struct/class name and field names. In these cases, the %rename directive can be used to choose a different Scilab name.

    39.3.3 Functions

    Functions are wrapped as new Scilab built-in functions. For example:

    %module example
    
    %inline %{
    int fact(int n) {
      if (n > 1)
        return n * fact(n - 1);
      else
        return 1;
    }
    %}
    

    creates a built-in function fact(n) in Scilab:

    --> fact(4)
    ans  =
    
        24.
    

    39.3.3.1 Argument passing

    In the above example, the function parameter is a primitive type and is marshalled by value. So this function is wrapped without any additional customization. Argument values are converted between C types and Scilab types through type mappings. There are several default type mappings for primitive and complex types, described later in the Scilab typemaps section.

    When a parameter is not passed by value, such as a pointer or reference, SWIG does not know if it is an input, output (or both) parameter. The INPUT, OUTPUT, INOUT typemaps defined in the typemaps.i library can be used to specify this.

    Let's see this on two simple functions: sub() which has an output parameter, and inc(), which as input/output parameter:

    %module example
    
    %include <typemaps.i>
    
    extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
    extern void inc(int *INOUT, int *INPUT);
    
    %{
    void sub(int *x, int *y, int *result) {
      *result = *x - *y;
    }
    void inc(int *x, int *delta) {
      *x = *x + *delta;
    }
    %}
    

    In Scilab, parameters are passed by value. The output (and inout) parameters are returned as the result of the functions:

    --> sub(5, 3)
     ans  =
    
        2.
    
    --> inc(4, 3)
     ans  =
    
        7.
    

    39.3.3.2 Multiple output arguments

    A C function can have several output parameters. They can all be returned as results of the wrapped function as Scilab supports multiple return values from a function when using the typemaps.i library. If the C function itself returns a result, this is returned first before the parameter outputs.

    The example below shows this for a C function returning 2 values and a result:

    %module example
    
    %include <typemaps.i>
    
    int divide(int n, int d, int *OUTPUT, int *OUTPUT);
    
    %{
      int divide(int n, int d, int q*, int *r) {
        if (d != 0) {
          *q = n / d;
          *r = n % d;
          return 1;
        } else {
          return 0;
        }
      }
    %}
    

    --> [ret, q, r] = divide(20, 6)
     r  =
    
        2.
     q  =
    
        3.
     ret  =
    
        1.
    

    39.3.4 Global variables

    Global variables are manipulated through generated accessor functions. For example, for a given Foo global variable, SWIG actually generates two functions: Foo_get() to get the value of Foo, and Foo_set() to set the value. These functions are used as following:

    --> exec loader.sce;
    --> c = Foo_get();
    
    --> Foo_set(4);
    
    --> c
    c =
    
        3.
    
    --> Foo_get()
    ans  =
    
        4.
    

    It works for variables of primitive type, but also for non-primitive types: arrays, and structs/classes which are described later. For now, an example with two global primitive arrays x and y is shown:

    %module example
    
    %inline %{
    int x[10];
    double y[7];
    
    void initArrays()
    {
      int i;
      for (i = 0; i < 10; i++)
        x[i] = 1;
      for (i = 0; i < 7; i++)
        y[i] = 1.0f;
    }
    %}
    

    It works the same:

    --> exec loader.sce
    
    --> initArrays();
    --> x_get()
     ans  =
    
        1.    1.    1.    1.    1.    1.    1.    1.    1.    1.
    
    --> y_set([0:6] / 10);
    --> y_get()
     ans  =
    
        0.    0.1    0.2    0.3    0.4    0.5    0.6
    

    39.3.5 Constants and enumerations

    39.3.5.1 Constants

    There is not any constant in Scilab. By default, C/C++ constants are wrapped as getter functions. For example, for the following constants:

    %module example
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    the following getter functions are generated:

    --> exec loader.sce;
    --> ICONST_get();
     ans  =
    
        42.
    
    --> FCONST_get();
     ans  =
    
        2.1828
    
    --> CCONST_get();
     ans  =
    
        x
    
    --> CCONST2_get();
     ans  =
    
    --> SCONST_get();
     ans  =
    
        Hello World
    
    --> SCONST2_get();
     ans  =
    
        "Hello World"
    
    --> EXPR_get();
     ans  =
    
        48.5484
    
    --> iconst_get();
     ans  =
    
        37.
    
    --> fconst_get();
     ans  =
    
        3.14
    

    There is another mode in which constants are wrapped as Scilab variables. The variables are easier to use than functions, but the drawback is that variables are not constant and so can be modified.

    This mode can be enabled/disabled at any time in the interface file with %scilabconst(), which works like all the other %feature directives. Use the argument value "1" to enable and "0" to disable this mode. For example in this mode the previous constants:

    %module example
    
    %scilabconst(1);
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    are mapped to Scilab variables, with the same name:

    --> exec loader.sce;
    --> ICONST
     ans  =
    
        42
    
    --> FCONST
     ans  =
    
        2.1828
    
    --> CCONST
     ans  =
    
        x
    
    --> CCONST2
     ans  =
    
    --> SCONST
     ans  =
    
        Hello World
    
    --> SCONST2
     ans  =
    
        "Hello World"
    
    --> EXPR
     ans  =
    
        48.5484
    
    --> iconst
     ans  =
    
        37
    
    --> fconst
     ans  =
    
        3.14
    

    39.3.5.2 Enumerations

    The wrapping of enums is the same as for constants. By default, enums are wrapped as getter functions. For example, with the following enumeration:

    %module example
    typedef enum { RED, BLUE, GREEN } color;
    

    a getter function will be generated for each value of the enumeration:

    --> exec loader.sce;
    --> RED_get()
     ans  =
    
        0.
    
    --> BLUE_get()
     ans  =
    
        1.
    
    --> GREEN_get()
     ans  =
    
        2.
    

    The %scilabconst() feature is also available for enumerations:

    %module example
    %scilabconst(1) color;
    typedef enum { RED, BLUE, GREEN } color;
    

    --> exec loader.sce;
    --> RED
     ans  =
    
        0.
    
    --> BLUE
     ans  =
    
        1.
    
    --> GREEN
     ans  =
    
        2.
    
    

    39.3.6 Pointers

    Pointers are supported by SWIG. A pointer can be returned from a wrapped C/C++ function, stored in a Scilab variable, and used in input argument of another C/C++ function.

    Also, thanks to the SWIG runtime which stores informations about types, pointer types are tracked between exchanges Scilab and the native code. Indeed pointer types are stored alongside the pointer adress. A pointer is mapped to a Scilab structure ( tlist), which contains as fields the pointer address and the pointer type (in fact a pointer to the type information structure in the SWIG runtime).
    Why a native pointer is not mapped to a Scilab pointer (type name: "pointer", type ID: 128) ? The big advantage of mapping to a tlist is that it exposes a new type for the pointer in Scilab, type which can be acessed in Scilab with the typeof function, and manipulated using the overloading mechanism.

    Notes:

    • type tracking needs the SWIG runtime to be first initialized with the appropriate function (see the Module initialization section).
    • for any reason, if a wrapped pointer type is unknown (or if the SWIG runtime is not initialized), SWIG maps it to a Scilab pointer. Also, a Scilab pointer is always accepted as a pointer argument of a wrapped function. The drawaback is that pointer type is lost.

    Following is an example of the wrapping of the C FILE* pointer:

    %module example
    
    %{
    #include <stdio.h>
    %}
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    These functions can be used the same way as in C from Scilab:

    --> example_Init();
    
    --> f = fopen("junk", "w");
    --> typeof(f)
     ans  =
    
      _p_FILE
    
    --> fputs("Hello World", f);
    --> fclose(f);
    

    Note: the type name _p_FILE which means "pointer to FILE".

    The user of a pointer is responsible for freeing it or, like in the example, closing any resources associated with it (just as is required in a C program).

    39.3.6.1 Utility functions

    As a scripting language, Scilab does not provide functions to manipulate pointers. However, in some cases it can be useful, such as for testing or debugging.

    SWIG comes with two pointer utility functions:

    • SWIG_this(): returns the address value of a pointer
    • SWIG_ptr(): creates a pointer from an address value

    Note: a pointer created by SWIG_ptr() does not have any type and is mapped as a Scilab pointer.

    Following we use the utility functions on the previous example:

    --> f = fopen("junk", "w");
    --> fputs("Hello", f);
    --> addr = SWIG_this(f)
     ans  =
    
        8219088.
    
    --> p = SWIG_ptr(addr);
    --> typeof(p)
    ans  =
    
      pointer
    
    --> fputs(" World", p);
    --> fclose(f);
    

    39.3.6.2 Null pointers:

    Using the previous SWIG_this() and SWIG_ptr(), it is possible to create and check null pointers:

    --> p = SWIG_ptr(0);
    --> SWIG_this(p) == 0
     ans  =
    
        T
    

    39.3.7 Structures

    Structs exist in Scilab, but C structs are not (at least in this version of SWIG) mapped to Scilab structs. A C structure is wrapped through low-level accessor functions, i.e. functions that give access to the member variables of this structure. In Scilab, a structure is manipulated through a pointer which is passed as an argument to the accessor functions.

    Let's see it on an example of a struct with two members:

    %module example
    
    %inline %{
    
    typedef struct {
        int x;
        int arr[4];
    } Foo;
    
    %}
    

    Several functions are generated:

    • a constructor function new_Foo() which returns a pointer to a newly created struct Foo.
    • two member getter functions Foo_x_get(), Foo_arr_get() , to get the values of x and y for the struct pointer (provided as the first parameter to these functions)
    • two member setter functions Foo_x_set(), Foo_arr_set() , to set the values of x and y for the struct pointer (provided as the first parameter to these functions).
    • a destructor function delete_Foo() to release the struct pointer.

    Usage example:

    --> f = new_Foo();
    --> Foo_x_set(f, 100);
    --> Foo_x_get(f)
    ans  =
    
        100.
    
    --> Foo_arr_set(f, [0:3]);
    --> Foo_arr_get(f)
    ans  =
    
        0.    1.    2.    3.
    
    --> delete_Foo(f);
    

    Members of a structure that are also structures are also accepted and wrapped as a pointer:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
    } Bar;
    
    typedef struct {
      Bar b;
    } Foo;
    
    %}
    

    --> b = new_Bar();
    --> Bar_x_set(b, 20.);
    
    --> f = new_Foo();
    --> Foo_b_set(f, b);
    
    --> b2 = Foo_b_get(f);
    --> Bar_x_get(b2);
    ans  =
    
        20.
    

    Note: the pointer to the struct works as described in Pointers. For example, the type of the struct pointer can be get with typeof, as following:

    --> example_Init();
    --> b = new_Bar();
    --> typeof(b)
     ans  =
    
        _p_Bar
    --> delete_Bar(b);
    

    39.3.8 C++ classes

    Classes do not exist in Scilab. The classes are wrapped the same way as structs. Low-level accessor functions are generated for class members. Also, constructor and destructor functions are generated to create and destroy an instance of the class.

    For example, the following class:

    %module example
    
    %inline %{
    
    class Point {
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2) + pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x;
        y=_y;
      }
    };
    
    %}
    

    can be used in Scilab like this:

    --> p1 = Point_new(3, 5);
    --> p2 = Point_new(1, 2);
    --> p1.distance(p2)
    ans  =
    
        3.6056
    
    --> delete_Point(p1);
    --> delete_Point(p2);
    

    Note: like structs, class pointers are mapped as described in Pointers. Let's give an example which shows that each class pointer type is a new type in Scilab that can be used for example (through overloading) to implement a custom print for the Point class:

    --> function %_p_Point_p(p)
    -->     mprintf('[%d, %d]\n', Point_x_get(p), Point_y_get(p));
    --> endfunction
    
    --> example_Init();
    --> p = new_Point(1, 2)
     p  =
    
    [1, 2]
    
    --> delete_Point(p);
    

    39.3.9 C++ inheritance

    Inheritance is supported. SWIG knows the inheritance relationship between classes.

    A function is only generated for the class in which it is actually declared. But if one of its parameters is a class, any instance of a derived class is accepted as the argument.

    This mechanism also applies for accessor functions: they are generated only in the class in which they are defined. But any instance of a derived class can be used as the argument to these accessor functions.

    For example, let's take a base class Shape and two derived classes Circle and Square:

    %module example
    
    %inline %{
    
    class Shape {
    public:
      double x, y;
      void set_location(double _x, double _y) { x = _x; y = _y; }
      virtual double get_perimeter() { return 0; };
    };
    
    class Circle : public Shape {
    public:
      int radius;
      Circle(int _radius): radius(_radius) {};
      virtual double get_perimeter() { return 6.28 * radius; }
    };
    
    class Square : public Shape {
    public:
      int size;
      Square(int _size): size(_size) {};
      virtual double get_perimeter() { return 4 * size; }
    };
    
    %}
    

    To set the location of the Circle, we have to use the function set_location() of the parent Shape. But we can use either use the get_perimeter() function of the parent class or the derived class:

    --> c = new_Circle(3);
    
    --> Shape_set_location(c, 2, 3);
    --> Shape_x_get(c)
     ans  =
    
        2.
    
    --> Circle_get_perimeter(c)
     ans  =
    
        18.84
    
    --> Shape_get_perimeter(c)
     ans  =
    
        18.84
    

    39.3.10 C++ overloading

    As explained in 6.15 SWIG provides support for overloaded functions and constructors.

    As SWIG knows pointer types, the overloading works also with pointer types, here is is an example with a function magnify overloaded for the previous classes Shape and Circle:

    %module example
    
    void magnify(Square *square, double factor) {
        square->size *= factor;
    };
    
    void magnify(Circle *circle, double factor) {
        square->radius *= factor;
    };
    
    --> example_Init();
    --> c = new_Circle(3);
    --> s = new_Square(2);
    
    --> magnify(c, 10);
    --> Circle_get_radius(c)
     ans  =
    
       30;
    --> magnify(s, 10);
    --> Square_get_size(s)
     ans  =
    
       20;
    

    39.3.11 Pointers, references, values, and arrays

    In C++ objects can be passed by value, pointer, reference, or by an array:

    %module example
    
    %{
    #include <sciprint.h>
    %}
    
    %inline %{
    
    class Foo {
    public:
      Foo(int _x) : x(_x) {}
      int x;
    };
    
    void spam1(Foo *f)  { sciprint("%d\n", f->x); }   // Pass by pointer
    void spam2(Foo &f)  { sciprint("%d\n", f.x); }    // Pass by reference
    void spam3(Foo f)   { sciprint("%d\n", f.x); }    // Pass by value
    void spam4(Foo f[]) { sciprint("%d\n", f[0].x); } // Array of objects
    
    %}
    

    In SWIG, there is no real distinction between these. So in Scilab, it is perfectly legal to do this:

    --> f = new_Foo()
    --> spam1(f)
    3
    --> spam2(f)
    3
    --> spam3(f)
    3
    --> spam4(f)
    3
    

    Similar behaviour occurs for return values. For example, if you had functions like this:

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    All these functions will return a pointer to an instance of Foo . As the function spam7 returns a value, new instance of Foo has to be allocated, and a pointer on this instance is returned.

    39.3.12 C++ templates

    As in other languages, function and class templates are supported in SWIG Scilab.

    You have to tell SWIG to create wrappers for a particular template instantiation. The %template directive is used for this purpose. For example:

    %module example
    
    template<class T1, class T2, class T3>
    struct triplet {
      T1 first;
      T2 second;
      T3 third;
      triplet(const T1& a, const T2& b, const T3& c) {
        third = a; second = b; third = c;
      }
    };
    
    %template(IntTriplet) triplet<int, int, int>;
    

    Then in Scilab:

    --> t = new_IntTriplet(3, 4, 1);
    
    --> IntTriplet_first_get(t)
     ans  =
    
        3.
    
    --> IntTriplet_second_get(t)
     ans  =
    
        4.
    
    --> IntTriplet_third_get(t)
     ans  =
    
        1.
    
    --> delete_IntTriplet(t);
    

    More details on template support can be found in the templates documentation.

    39.3.13 C++ operators

    C++ operators are partially supported. Operator overloading exists in Scilab, but a C++ operator is not (in this version) wrapped by SWIG as a Scilab operator, but as a function. It is not automatic, you have to rename each operator (with the instruction %rename) with the suitable wrapper name.

    Let's see it with an example of class with two operators + and double():

    %module example
    
    %rename(plus) operator +;
    %rename(toDouble) operator double();
    
    %inline %{
    
    class Complex {
    public:
      Complex(double re, double im) : real(re), imag(im) {};
    
      Complex operator+(const Complex& other) {
        double result_real = real + other.real;
        double result_imaginary = imag + other.imag;
        return Complex(result_real, result_imaginary);
      }
      operator double() { return real; }
    private:
      double real;
      double imag;
    };
    
    %}
    

    --> c1 = new_Complex(3, 7);
    
    --> c2 = Complex_plus(c, new_Complex(1, 1));
    
    --> Complex_toDouble(c2)
     ans  =
    
        4.
    

    39.3.14 C++ namespaces

    SWIG is aware of C++ namespaces, but does not use it for wrappers. The module is not broken into submodules, nor do namespace appear in functions names. All the namespaces are all flattened in the module. For example with one namespace Foo:

    %module example
    
    %inline %{
    
    namespace foo {
      int fact(int n) {
        if (n > 1)
          return n * fact(n-1);
        else
          return 1;
      }
    
      struct Vector {
        double x, y, z;
      };
    };
    
    %}
    
    

    In Scilab, there is no need to the specify the Foo namespace:

    --> fact(3)
     ans  =
    
       6.
    
    --> v = new_Vector();
    --> Vector_x_set(v, 3.4);
    --> Vector_y_get(v)
     ans  =
    
       0.
    

    If your program has more than one namespace, name conflicts can be resolved using %rename. For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    Note: the nspace feature is not supported.

    39.3.15 C++ exceptions

    Scilab does not natively support exceptions, but has errors. When an exception is thrown, SWIG catches it, and sets a Scilab error. An error message is displayed in Scilab. For example:

    %module example
    
    %inline %{
    void throw_exception() throw(char const *) {
      throw "Bye world !";
    }
    %}
    

    -->throw_exception()
      !--error 999
    SWIG/Scilab: Exception (char const *) occured: Bye world !
    

    Scilab has a try-catch mechanism (and a similar instruction execstr()) to handle exceptions. It can be used with the lasterror() function as following:

    --> execstr('throw_exception()', 'errcatch');
     ans  =
    
        999.
    
    --> lasterror()
     ans  =
    
        SWIG/Scilab: Exception (char const *) occured: Bye world !
    

    If the function has a throw exception specification, SWIG can automatically map the exception type and set an appropriate Scilab error message. It works for a few primitive types, and also for STL exceptions (the library std_except.i has to be included to get the STL exception support):

    %module example
    
    %include <std_except.i>
    
    %inline %{
    void throw_int() throw(int) {
      throw 12;
    }
    
    void throw_stl_invalid_arg(int i) throw(std::invalid_argument) {
      if (i < 0)
        throw std::invalid_argument("argument is negative.");
    }
    %}
    

    --> throw_int();
                !--error 999
    SWIG/Scilab: Exception (int) occured: 12
    
    -->throw_stl_invalid_arg(-1);
                              !--error 999
    SWIG/Scilab: ValueError: argument is negative.
    

    More complex or custom exception types require specific exception typemaps to be implemented in order to specifically handle a thrown type. See the SWIG C++ documentation for more details.

    39.3.16 C++ STL

    The Standard Template Library (STL) is partially supported. See STL for more details.

    39.4 Type mappings and libraries

    39.4.1 Default primitive type mappings

    The following table provides the equivalent Scilab type for C/C++ primitive types.

    C/C++ typeScilab type
    boolboolean
    charstring
    signed chardouble or int8
    unsigned chardouble or uint8
    shortdouble or int16
    unsigned shortdouble or uint16
    intdouble or int32
    unsigned intdouble or uint32
    longdouble or int32
    unsigned longdouble or uint32
    signed long longnot supported in Scilab 5.x
    unsigned long longnot supported in Scilab 5.x
    floatdouble
    doubledouble
    char * or char[]string

    Notes:

    • In Scilab the double type is far more used than any integer type. This is why integer values (int32, uint32, ...) are automatically converted to Scilab double values when marshalled from C into Scilab. Additionally on input to a C function, Scilab double values are converted into the related integer type.
    • When an integer is expected, if the input is a double, the value must be an integer, i.e. it must not have any decimal part, otherwise a SWIG value error occurs.
    • In SWIG for Scilab 5.x, the long long type is not supported, since Scilab 5.x does not have a 64-bit integer type. The default behaviour is for SWIG to generate code that will give a runtime error if long long type arguments are used from Scilab.

    39.4.2 Arrays

    Typemaps are available by default for arrays. Primitive type arrays are automatically converted to/from Scilab matrices. Typemaps are also provided to handle members of a struct or class that are arrays.

    In input, the matrix is usually one-dimensional (it can be either a row or column vector). But it can also be a two-dimensional matrix. Warning: in Scilab, the values are column-major ordered, unlike in C, which is row-major ordered.

    The type mappings used for arrays is the same for primitive types, described earlier. This means that, if needed, a Scilab double vector is converted in input into the related C integer array and this C integer array is automatically converted on output into a Scilab double vector. Note that unlike scalars, no control is done for arrays when a double is converted into an integer.

    The following example illustrates all this:

    %module example
    
    %#include <stdio.h>
    
    %inline %{
    
    void printArray(int values[], int len) {
      int i = 0;
      for (i = 0; i < len; i++) {
        printf("%s %d %s", i==0?"[":"", values[i], i==len-1?"]\n":"");
      }
    }
    %}
    

    --> printArray([0 1 2 3], 4)
    [ 0  1  2  3 ]
    
    --> printArray([0.2; -1.8; 2; 3.7], 4)
    [ 0  -1  2  3 ]
    
    --> printArray([0 1; 2 3], 4)
    [ 0  2  1  3 ]
    
    --> printArray([0; 1; 2; 3], 4)
    [ 0  1  2  3 ]
    

    39.4.3 Pointer-to-pointers

    There are no specific typemaps for pointer-to-pointers, they are are mapped as pointers in Scilab.

    Pointer-to-pointers are sometimes used to implement matrices in C. The following is a an example of this:

    %module example
    %inline %{
    
    // Returns the matrix [1 2; 3 4];
    double **create_matrix() {
      double **M;
      int i;
      M = (double **) malloc(2 * sizeof(double *));
      for (i = 0; i < 2; i++) {
        M[i] = (double *) malloc(2 * sizeof(double));
        M[i][0] = 2 * i + 1;
        M[i][1] = 2 * i + 2;
      }
      return M;
    }
    
    // Gets the item M(i, j) value
    double get_matrix(double **M, int i, int j) {
      return M[i][j];
    }
    
    // Sets the item M(i, j) value to be val
    void set_matrix(double **M, int i, int j, double val) {
      M[i][j] = val;
    }
    
    // Prints a matrix (2, 2) to console
    void print_matrix(double **M, int nbRows, int nbCols) {
      int i, j;
      for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
          printf("%3g ", M[i][j]);
        }
        printf("\n");
      }
    }
    
    %}
    

    These functions are used like this in Scilab:

    --> m = create_matrix();
    
    --> print_matrix(m);
       1.   2.
       3.   4.
    
    --> set_matrix(m, 1, 1, 5.);
    
    --> get_matrix(m, 1, 1)
     ans  =
    
        5.
    

    39.4.4 Matrices

    The matrix.i library provides a set of typemaps which can be useful when working with one-dimensional and two-dimensional matrices.

    In order to use this library, just include it in the interface file:

      %include <matrix.i>
    

    Several typemaps are available for the common Scilab matrix types:

    • double
    • int
    • char *
    • bool

    For example: for a matrix of int, we have the typemaps, for input:

    • (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT)
    • (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN)
    • (int *IN, int IN_SIZE)
    • (int IN_SIZE, int *IN)

    and output:

    • (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT)
    • (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT)
    • (int **OUT, int *OUT_SIZE)
    • (int *OUT_SIZE, int **OUT)

    They marshall a Scilab matrix type into the appropriate 2 or 3 C parameters. The following is an example using the typemaps in this library:

    %module example
    
    %include <matrix.i>
    
    %apply (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { (int *matrix, int matrixNbRow, int matrixNbCol) };
    %apply (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { (int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) };
    
    %inline %{
    
    void absolute(int *matrix, int matrixNbRow, int matrixNbCol,
      int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) {
      int i, j;
      *outMatrixNbRow = matrixNbRow;
      *outMatrixNbCol = matrixNbCol;
      *outMatrix = malloc(matrixNbRow * matrixNbCol * sizeof(int));
      for (i=0; i < matrixNbRow * matrixNbCol; i++) {
        (*outMatrix)[i] = matrix[i] > 0 ? matrix[i]:-matrix[i];
      }
    }
    
    %}
    

    --> absolute([-0 1 -2; 3 4 -5])
     ans  =
    
        0.    1.    2.
        3.    4.    5.
    

    The remarks made earlier for arrays also apply here:

    • The values of matrices in Scilab are column-major orderered,
    • There is no control while converting double values to integers, double values are truncated without any checking or warning.

    39.4.5 STL

    The STL library wraps some containers defined in the STL (Standard Template Library), so that they can be manipulated in Scilab. This library also provides the appropriate typemaps to use the containers in functions and variables.

    The list of wrapped sequence containers are:

    • std::vector
    • std::list
    • std::deque

    And associative containers are:

    • std::set
    • std::multiset

    Typemaps are available for the following container types:

    • double
    • float
    • int
    • string
    • bool
    • pointer

    Containers of other item types are not supported. Using them does not break compilation, but provokes a runtime error. Containers of enum are not supported yet.

    In order to use the STL, the library must first be included in the SWIG interface file:

    %include <stl.i>
    

    Then for each container used, the appropriate template must be instantiated, in the std namespace:

    namespace std {
        %template(IntVector)    vector<int>;
        %template(DoubleVector) vector<double>;
    }
    

    Additionally, the module initialization function has to be executed first in Scilab, so that all the types are known to Scilab. See the Module initialization section for more details.

    Because in Scilab matrices exist for basic types only, a sequence container of pointers is mapped to a Scilab list. For other item types (double, int, string...) the sequence container is mapped to a Scilab matrix.

    The first example below shows how to create a vector (of int ) in Scilab, add some values to the vector and pass it as an argument of a function. It also shows, thanks to the typemaps, that we can also pass a Scilab matrix of values directly into the function:

    %module example
    
    %include <stl.i>
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    %{
    #include <numeric>
    %}
    
    %inline %{
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
    }
    
    %}
    

    --> example_Init();
    
    --> v = new_IntVector();
    
    --> for i = 1:4
    -->     IntVector_push_back(v, i);
    --> end;
    
    --> average(v)
     ans  =
    
        2.5
    
    --> average([0 1 2 3])
     ans  =
    
        2.5
    
    --> delete_IntVector();
    

    In the second example, a set of struct (Person) is wrapped. A function performs a search in this set, and returns a subset. As one can see, the result in Scilab is a list of pointers:

    %module example
    
    %include <stl.i>
    
    %{
    #include <string>
    %}
    
    %inline %{
    
    struct Person {
      Person(std::string _name, int _age) : name(_name), age(_age) {};
      std::string name;
      int age;
    };
    typedef Person * PersonPtr;
    
    %}
    
    namespace std {
      %template(PersonPtrSet) set<PersonPtr>;
    }
    
    %inline %{
    
    std::set<PersonPtr> findPersonsByAge(std::set<PersonPtr> persons, int minAge, int maxAge) {
      std::set<PersonPtr> foundPersons;
      for (std::set<PersonPtr>::iterator it = persons.begin(); it != persons.end(); it++) {
        if (((*it)->age >= minAge) && ((*it)->age <= maxAge)) {
          foundPersons.insert(*it);
        }
      }
      return foundPersons;
    }
    
    %}
    

    --> example_Init();
    
    --> joe = new_Person("Joe", 25);
    --> susan = new_Person("Susan", 32);
    --> bill = new_Person("Bill", 50);
    
    --> p = new_PersonPtrSet();
    --> PersonPtrSet_insert(p, susan);
    --> PersonPtrSet_insert(p, joe);
    --> PersonPtrSet_insert(p, bill);
    
    --> l = findPersonsByAge(p, 20, 40);
    
    --> size(l)
     ans  =
    
        2.
    
    --> Person_name_get(l(1))
    ans  =
    
        Susan
    
    --> Person_name_get(l(2))
     ans  =
    
        Joe
    
    --> delete_PersonPtrSet(p);
    

    39.5 Module initialization

    The wrapped module contains an initialization function to:

    • initialize the SWIG runtime, needed for pointer type tracking or when working with the STL
    • initialize the module constants and enumerations declared with %scilabconst()

    This initialization function should be executed at the start of a script, before the wrapped library has to be used.

    The function has the name of the module suffixed by _Init. For example, to initialize the module example:

    --> example_Init();
    

    39.6 Building modes

    The mechanism to load an external module in Scilab is called Dynamic Link and works with dynamic modules (or shared libraries, .so files).

    To produce a dynamic module, when generating the wrapper, there are two possibilities, or build modes:

    • the nobuilder mode, this is the default mode in SWIG. The user is responsible of the build.
    • the builder mode. In this mode, Scilab is responsible of building.

    39.6.1 No-builder mode

    In this mode, used by default, SWIG generates the wrapper sources, which have to be manually compiled and linked. A loader script loader.sce is also produced, this one is executed further in Scilab to load the module.

    This mode is the best option to use when you have to integrate the module build into a larger build process.

    39.6.2 Builder mode

    In this mode, in addition to the wrapper sources, SWIG produces a builder Scilab script (builder.sce), which is executed in Scilab to build the module. In a few words, the Scilab ilib_build() command is used, which produces the shared library file, and the loader script loader.sce (and also a cleaner script cleaner.sce ).

    An advantage of this mode is that it hides all the complexity of the build and other platform issues. Also it allows the module to conform to a Scilab external module convention which is that an external module should be simply built by calling a builder script.

    The builder mode is activated with the -builder SWIG option. In this mode, the following SWIG options may be used to setup the build:

    • -buildersources: to add sources to the build (several files must be separated by a comma)
    • -buildercflags: to add flags to the builder compiler flags, for example to set library dependencies include paths
    • -builderldflags: to add flags to the linker flags, for example to set library dependency names and paths

    Let's give an example how to build a module example, composed of two sources, and using a library dependency:

    • the sources are baa1.c and baa2.c (and are stored in in the current directory)
    • the library is libfoo in /opt/foo (headers stored in /opt/foo/include, and shared library in /opt/foo/lib )

    The command is:

    $ swig -scilab -builder -buildercflags -I/opt/foo/include -builderldflags "-L/opt/foo/lib -lfoo" -buildersources baa1.cxx, baa2.cxx example.i
    

    39.7 Generated scripts

    In this part we give some details about the generated Scilab scripts.

    39.7.1 Builder script

    builder.sce is the name of the builder script generated by SWIG in builder mode. It contains code like this:

    ilib_name = "examplelib";
    files = ["example_wrap.c"];
    libs = [];
    table = ["fact", "_wrap_fact";"Foo_set", "_wrap_Foo_set";"Foo_get", "_wrap_Foo_get";];
    ilib_build(ilib_name, table, files, libs);
    

    ilib_build(lib_name, table, files, libs) is used to create shared libraries, and to generate a loader file used to dynamically load the shared library into Scilab.

    • ilib_name: a character string, the generic name of the library without path and extension.
    • files: string matrix containing objects files needed for shared library creation.
    • libs: string matrix containing extra libraries needed for shared library creation.
    • table: two column string matrix containing a table of pairs of 'scilab function name', 'C function name'.

    39.7.2 Loader script

    The loader script is used to load in Scilab all the module functions. When loaded, these functions can be used as other Scilab functions.

    The loader script loader.sce contains code similar to:

    // ------------------------------------------------------
    // generated by builder.sce: Please do not edit this file
    // ------------------------------------------------------
    
    libexamplelib_path = get_file_path('loader.sce');
    list_functions = [             'fact';
                'Foo_set';
                'Foo_get';
    ];
    addinter(libexamplelib_path+'/libexamplelib.so', 'libexamplelib', list_functions);
    // remove temp. variables on stack
    clear libexamplelib_path;
    clear list_functions;
    clear get_file_path;
    // ------------------------------------------------------
    

    addinter(files, spname, fcts) performs dynamic linking of a compiled C interface function.

    • files: a character string or a vector of character strings defining the object files (containing the C interface functions) to link with.
    • spname: a character string. Name of interface routine entry point.
    • fcts: vector of character strings. The name of new Scilab function.

    39.8 Other resources

    • Example use cases can be found in the Examples/scilab directory.
    • The test suite in the Examples/test-suite/scilab can be another source of useful use cases.
    • The Scilab API is used in the generated code and is a useful reference when examining the output.
    • This guide describes the Scilab external modules structure and files, in particular the files that are generated by SWIG for Scilab.

    40 SWIG and Tcl

    Caution: This chapter is under repair!

    This chapter discusses SWIG's support of Tcl. SWIG currently requires Tcl 8.0 or a later release. Earlier releases of SWIG supported Tcl 7.x, but this is no longer supported.

    40.1 Preliminaries

    To build a Tcl module, run SWIG using the -tcl option :

    $ swig -tcl example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -tcl example.i
    

    This creates a file example_wrap.c or example_wrap.cxx that contains all of the code needed to build a Tcl extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    40.1.1 Getting the right header files

    In order to compile the wrapper code, the compiler needs the tcl.h header file. This file is usually contained in the directory

    /usr/local/include
    

    Be aware that some Tcl versions install this header file with a version number attached to it. If this is the case, you should probably make a symbolic link so that tcl.h points to the correct header file.

    40.1.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -tcl example.i
    $ gcc -fPIC -c example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/local/include
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact commands for doing this vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/tcl directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the output file has to match the name of the module. If the name of your SWIG module is "example ", the name of the corresponding object file should be "example.so ". The name of the module is specified using the %module directive or the -module command line option.

    40.1.3 Static linking

    An alternative approach to dynamic linking is to rebuild the Tcl interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Tcl involves writing a special function Tcl_AppInit() and using it to initialize the interpreter and your module. With SWIG, the tclsh.i and wish.i library files can be used to rebuild the tclsh and wish interpreters respectively. For example:

    %module example
    
    %inline %{
    extern int fact(int);
    extern int mod(int, int);
    extern double My_variable;
    %}
    
    %include "tclsh.i"       // Include code for rebuilding tclsh
    
    

    The tclsh.i library file includes supporting code that contains everything needed to rebuild tclsh. To rebuild the interpreter, you simply do something like this:

    $ swig -tcl example.i
    $ gcc example.c example_wrap.c \
            -Xlinker -export-dynamic \
            -DHAVE_CONFIG_H -I/usr/local/include/ \
            -L/usr/local/lib -ltcl -lm -ldl \
            -o mytclsh
    
    

    You will need to supply the same libraries that were used to build Tcl the first time. This may include system libraries such as -lsocket, -lnsl, and -lpthread. If this actually works, the new version of Tcl should be identical to the default version except that your extension module will be a built-in part of the interpreter.

    Comment: In practice, you should probably try to avoid static linking if possible. Some programmers may be inclined to use static linking in the interest of getting better performance. However, the performance gained by static linking tends to be rather minimal in most situations (and quite frankly not worth the extra hassle in the opinion of this author).

    40.1.4 Using your module

    To use your module, simply use the Tcl load command. If all goes well, you will be able to this:

    $ tclsh
    % load ./example.so
    % fact 4
    24
    %
    

    A common error received by first-time users is the following:

    % load ./example.so
    couldn't find procedure Example_Init
    % 
    

    This error is almost always caused when the name of the shared object file doesn't match the name of the module supplied using the SWIG %module directive. Double-check the interface to make sure the module name and the shared object file match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

    Another common error is something similar to the following:

    % load ./example.so
    couldn't load file "./example.so": ./example.so: undefined symbol: fact
    % 
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following problem when you try to use your module:

    % load ./example.so
    couldn't load file "./example.so": libfoo.so: cannot open shared object file:
    No such file or directory
    %        
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To fix this problem, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Tcl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib tclsh
    

    Finally, you can use a command such as ldconfig to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    40.1.5 Compilation of C++ extensions

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Tcl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    % swig -c++ -tcl example.i
    % g++ -fPIC -c example.cxx
    % g++ -fPIC -c example_wrap.cxx -I/usr/local/include
    % g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -tcl example.i
    % CC -KPIC -c example.cxx
    % CC -KPIC -c example_wrap.cxx -I/usr/local/include
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o example.so -lCrun
    

    Of course, the extra libraries to use are completely non-portable---you will probably need to do some experimentation.

    Sometimes people have suggested that it is necessary to relink the Tcl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Tcl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    As a final complication, a major weakness of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Tcl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. If working with lots of software components, you might want to investigate using a more formal standard such as COM.

    40.1.6 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Tcl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    40.1.7 Setting a package prefix

    To avoid namespace problems, you can instruct SWIG to append a package prefix to all of your functions and variables. This is done using the -prefix option as follows :

    swig -tcl -prefix Foo example.i
    

    If you have a function "bar" in the SWIG file, the prefix option will append the prefix to the name when creating a command and call it "Foo_bar".

    40.1.8 Using namespaces

    Alternatively, you can have SWIG install your module into a Tcl namespace by specifying the -namespace option :

    swig -tcl -namespace example.i
    

    By default, the name of the namespace will be the same as the module name, but you can override it using the -prefix option.

    When the -namespace option is used, objects in the module are always accessed with the namespace name such as Foo::bar.

    40.2 Building Tcl/Tk Extensions under Windows 95/NT

    Building a SWIG extension to Tcl/Tk under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into tclsh or wish. This section covers the process of using SWIG with Microsoft Visual C++. although the procedure may be similar with other compilers.

    40.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -tcl -o $(ProjDir)\$(InputName)_wrap.c $(InputPath) " in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Tcl installation under "Additional include directories".
    • Finally, select the settings for the entire project and go to "Link Options". Add the Tcl library file to your link libraries. For example "tcl80.lib". Also, set the name of the output file to match the name of your Tcl module (ie. example.dll).
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Tcl extension, simply run tclsh or wish and use the load command. For example :

    MSDOS > tclsh80
    % load example.dll
    % fact 4
    24
    %
    

    40.2.2 Using NMAKE

    Alternatively, SWIG extensions can be built by writing a Makefile for NMAKE. To do this, make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for building various SWIG generated extensions
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib 
    winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO /
    MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS    = /Z7 /Od /c /nologo
    TCL_INCLUDES  = -Id:\tcl8.0a2\generic -Id:\tcl8.0a2\win
    TCLLIB        = d:\tcl8.0a2\win\tcl80.lib
    
    tcl:
            ..\..\swig -tcl -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(TCL_INCLUDES) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) $(TCLLIB) example.obj example_wrap.obj
    
    

    To build the extension, run NMAKE (you may need to run vcvars32 first). This is a pretty minimal Makefile, but hopefully its enough to get you started. With a little practice, you'll be making lots of Tcl extensions.

    40.3 A tour of basic C/C++ wrapping

    By default, SWIG tries to build a very natural Tcl interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped in an interface that mimics the style of Tk widgets and [incr Tcl] classes. This section briefly covers the essential aspects of this wrapping.

    40.3.1 Modules

    The SWIG %module directive specifies the name of the Tcl module. If you specify `%module example', then everything is compiled into an extension module example.so. When choosing a module name, make sure you don't use the same name as a built-in Tcl command.

    One pitfall to watch out for is module names involving numbers. If you specify a module name like %module md5, you'll find that the load command no longer seems to work:

    % load ./md5.so
    couldn't find procedure Md_Init
    

    To fix this, supply an extra argument to load like this:

    % load ./md5.so md5
    

    40.3.2 Functions

    Global functions are wrapped as new Tcl built-in commands. For example,

    %module example
    int fact(int n);
    

    creates a built-in function fact that works exactly like you think it does:

    % load ./example.so
    % fact 4
    24
    % set x [fact 6]
    %
    

    40.3.3 Global variables

    C/C++ global variables are wrapped by Tcl global variables. For example:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern double density;
    %}
    ...
    

    Now look at the Tcl interface:

    % puts $density          # Output value of C global variable
    1.0
    % set density 0.95       # Change value
    

    If you make an error in variable assignment, you will get an error message. For example:

    % set density "hello"
    can't set "density": Type error. expected a double.
    %
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    40.3.4 Constants and enums

    C/C++ constants are installed as global Tcl variables containing the appropriate value. To create a constant, use #define, enum , or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    enum Beverage { ALE, LAGER, STOUT, PILSNER };
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    For enums, make sure that the definition of the enumeration actually appears in a header file or in the wrapper file somehow---if you just stick an enum in a SWIG interface without also telling the C compiler about it, the wrapper code won't compile.

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using the cvar object described in the previous section. They are not wrapped as constants. For further discussion about this, see the SWIG Basics chapter.

    Constants are not guaranteed to remain constant in Tcl---the value of the constant could be accidentally reassigned.You will just have to be careful.

    A peculiarity of installing constants as variables is that it is necessary to use the Tcl global statement to access constants in procedure bodies. For example:

    proc blah {} {
      global FOO
      bar $FOO
    }
    

    If a program relies on a lot of constants, this can be extremely annoying. To fix the problem, consider using the following typemap rule:

    %apply int CONSTANT { int x };
    #define FOO 42
    ...
    void bar(int x);
    

    When applied to an input argument, the CONSTANT rule allows a constant to be passed to a function using its actual value or a symbolic identifier name. For example:

    proc blah {} {
      bar FOO
    }
    

    When an identifier name is given, it is used to perform an implicit hash-table lookup of the value during argument conversion. This allows the global statement to be omitted.

    40.3.5 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Tcl. For example:

    % load ./example.so
    % set f [fopen junk w]
    % fputs "Hello World\n" $f
    % fclose $f
    

    If this makes you uneasy, rest assured that there is no deep magic involved. Underneath the covers, pointers to C/C++ objects are simply represented as opaque values--normally an encoded character string like this:

    % puts $f
    _c0671108_p_FILE
    % 
    

    This pointer value can be freely passed around to different C functions that expect to receive an object of type FILE *. The only thing you can't do is dereference the pointer from Tcl.

    The NULL pointer is represented by the string NULL.

    As much as you might be inclined to modify a pointer value directly from Tcl, don't. The hexadecimal encoding is not necessarily the same as the logical memory address of the underlying object. Instead it is the raw byte encoding of the pointer value. The encoding will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Similarly, don't try to manually cast a pointer to a new type by simply replacing the type-string. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
        return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return None if the conversion can't be performed.

    40.3.6 Structures

    If you wrap a C structure, it is wrapped by a Tcl interface that somewhat resembles a Tk widget. This provides a very natural interface. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    % Vector v
    % v configure -x 3.5 -y 7.2
    % puts "[v cget -x] [v cget -y] [v cget -z]"
    3.5 7.2 0.0
    % 
    

    Similar access is provided for unions and the data members of C++ classes.

    In the above example, v is a name that's used for the object. However, underneath the covers, there's a pointer to a raw C structure. This can be obtained by looking at the -this attribute. For example:

    % puts [v cget -this]
    _88e31408_p_Vector
    

    Further details about the relationship between the Tcl and the underlying C structure are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
        int  x[16];
    };
    

    If accessed in Tcl, you will see behavior like this:

    % Bar b
    % puts [b cget -x]
    _801861a4_p_int
    % 
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    % Bar c
    % c configure -x [b cget -x]   # Copy contents of b.x to c.x
    

    For array assignment, SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f attribute of Bar like this:

    % Bar b
    % set x [b cget -f]
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    However, one peculiarity of accessing a substructure like this is that the returned value does work quite like you might expect. For example:

    % Bar b
    % set x [b cget -f]
    % x cget -a
    invalid command name "x"
    

    This is because the returned value was not created in a normal way from the interpreter (x is not a command object). To make it function normally, just evaluate the variable like this:

    % Bar b
    % set x [b cget -f]
    % $x cget -a
    0
    %
    

    In this example, x points inside the original structure. This means that modifications work just like you would expect. For example:

    
    % Bar b
    % set x [b cget -f]
    % $x configure -a 3            # Modifies contents of f (inside b)
    % [b cget -f] -configure -a 3  # Same thing
    

    In many of these structure examples, a simple name like "v" or "b" has been given to wrapped structures. If necessary, this name can be passed to functions that expect to receive an object. For example, if you have a function like this,

    void blah(Foo *f);
    

    you can call the function in Tcl as follows:

    % Foo x            # Create a Foo object 
    % blah x           # Pass the object to a function
    

    It is also possible to call the function using the raw pointer value. For instance:

    % blah [x cget -this]   # Pass object to a function
    

    It is also possible to create and use objects using variables. For example:

    % set b [Bar]            # Create a Bar
    % $b cget -f             # Member access
    % puts $b
    _108fea88_p_Bar
    %
    

    Finally, to destroy objects created from Tcl, you can either let the object name go out of scope or you can explicitly delete the object. For example:

    % Foo f                 # Create object f
    % rename f ""
    

    or

    % Foo f                 # Create object f
    % f -delete
    

    Note: Tcl only destroys the underlying object if it has ownership. See the memory management section that appears shortly.

    40.3.7 C++ classes

    C++ classes are wrapped as an extension of structure wrapping. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Tcl like this:

    % List x
    % x insert Ale
    % x insert Stout
    % x insert Lager
    % x get 1
    Stout
    % puts [x cget -length]
    3
    %
    

    Class data members are accessed in the same manner as C structures.

    Static class members are accessed as global functions or variables. To illustrate, suppose you have a class like this:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    In Tcl, the static member is accessed as follows:

    % Spam_foo        # Spam::foo()
    % puts $Spam_bar  # Spam::bar
    

    40.3.8 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    An object of type Bar can be used where a Foo is expected. For example, if you have this function:

    void spam(Foo *f);
    

    then the function spam() accepts a Foo * or a pointer to any class derived from Foo. For instance:

    % Foo f      # Create a Foo
    % Bar b      # Create a Bar
    % spam f     # OK
    % spam b     # OK
    

    It is safe to use multiple inheritance with SWIG.

    40.3.9 Pointers, references, values, and arrays

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Tcl, there is no detailed distinction like this. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this:

    % Foo f             # Create a Foo
    % spam1 f           # Ok. Pointer
    % spam2 f           # Ok. Reference
    % spam3 f           # Ok. Value.
    % spam4 f           # Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Tcl will release this memory when the return value is garbage collected).

    40.3.10 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);
    

    You can use them in Tcl in a straightforward manner:

    % foo 3            # foo(int)
    % foo Hello        # foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
        Foo();
        Foo(const Foo &);
        ...
    };
    

    you can write Tcl code like this:

    % Foo f                # Create a Foo
    % Foo g f              # Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);
    

    or

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int);    
    void spam(short);   // Accessed as spam_short
    

    or

    %ignore spam(short);
    ...
    void spam(int);    
    void spam(short);   // Ignored
    

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    40.3.11 C++ operators

    Certain C++ overloaded operators can be handled automatically by SWIG. For example, consider a class like this:

    class Complex {
    private:
      double rpart, ipart;
    public:
      Complex(double r = 0, double i = 0) : rpart(r), ipart(i) { }
      Complex(const Complex &c) : rpart(c.rpart), ipart(c.ipart) { }
      Complex &operator=(const Complex &c);
      Complex operator+(const Complex &c) const;
      Complex operator-(const Complex &c) const;
      Complex operator*(const Complex &c) const;
      Complex operator-() const;
      
      double re() const { return rpart; }
      double im() const { return ipart; }
    };
    

    When wrapped, it works like this:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c + d]
    % $e re
    10.0
    % $e im
    12.0
    

    It should be stressed that operators in SWIG have no relationship to operators in Tcl. In fact, the only thing that's happening here is that an operator like operator + has been renamed to a method + . Therefore, the statement [c + d] is really just invoking the + method on c. When more than operator is defined (with different arguments), the standard method overloading facilities are used. Here is a rather odd looking example:

    % Complex c 3 4
    % Complex d 7 8
    % set e [c - d]       # operator-(const Complex &)
    % puts "[$e re] [$e im]"
    10.0 12.0
    % set f [c -]         # operator-()
    % puts "[$f re] [$f im]"
    -3.0 -4.0
    %
    

    One restriction with operator overloading support is that SWIG is not able to fully handle operators that aren't defined as part of the class. For example, if you had code like this

    class Complex {
    ...
    friend Complex operator+(double, const Complex &c);
    ...
    };
    

    then SWIG doesn't know what to do with the friend function--in fact, it simply ignores it and issues a warning. You can still wrap the operator, but you may have to encapsulate it in a special function. For example:

    %rename(Complex_add_dc) operator+(double, const Complex &);
    ...
    Complex operator+(double, const Complex &c);
    

    There are ways to make this operator appear as part of the class using the %extend directive. Keep reading.

    40.3.12 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Tcl as follows:

    % load ./example.so
    % fact 3
    6
    % Vector v
    % v configure -x 3.4
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
        int spam();
    }
    
    namespace Bar {
        int spam();
    }
    

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    40.3.13 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Tcl:

    % pairii p 3 4
    % p cget -first
    3
    % p cget -second
    4
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter. Some more complicated examples will appear later.

    40.3.14 C++ Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Tcl, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Tcl, everything should just "work":

    % set p [CreateFoo]                  # Create a smart-pointer somehow
    % $p configure -x 3                  # Foo::x
    % $p bar                             # Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    % set f [$p __deref__]    # Returns underlying Foo *
    

    40.4 Further details on the Tcl class interface

    In the previous section, a high-level view of Tcl wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Tcl class-like objects. This provides a very natural Tcl interface and allows SWIG to support a number of advanced features such as operator overloading. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work.

    40.4.1 Proxy classes

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a class like this

    class Foo {
    public:
      int x;
      int spam(int);
      ...
    

    then SWIG transforms it into a set of low-level procedural wrappers. For example:

    Foo *new_Foo() {
        return new Foo();
    }
    void delete_Foo(Foo *f) {
        delete f;
    }
    int Foo_x_get(Foo *f) {
        return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
        f->x = value;
    }
    int Foo_spam(Foo *f, int arg1) {
        return f->spam(arg1);
    }
    

    These wrappers are actually found in the Tcl extension module. For example, you can certainly do this:

    % load ./example.so
    % set f [new_Foo]
    % Foo_x_get $f
    0
    % Foo_spam $f 3
    1
    %
    

    However, in addition to this, the classname Foo is used as an object constructor function. This allows objects to be encapsulated objects that look a lot like Tk widgets as shown in the last section.

    40.4.2 Memory management

    Associated with each wrapped object, is an ownership flag thisown The value of this flag determines who is responsible for deleting the underlying C++ object. If set to 1, the Tcl interpreter destroys the C++ object when the proxy class is garbage collected. If set to 0 (or if the attribute is missing), then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Tcl automatically takes ownership of the result. For example:

    class Foo {
    public:
        Foo();
        Foo bar();
    };
    

    In Tcl:

    % Foo f
    % f cget -thisown
    1
    % set g [f bar]
    % $g cget -thisown
    1
    

    On the other hand, when pointers are returned to Tcl, there is often no way to know where they came from. Therefore, the ownership is set to zero. For example:

    class Foo {
    public:
        ...
        Foo *spam();
        ...
    };
    

    % Foo f
    % set s [f spam]
    % $s cget -thisown
    0
    % 
    

    This behavior is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Tcl to assume ownership and destroy it!

    Related to containers, ownership issues can arise whenever an object is assigned to a member or global variable. For example, consider this interface:

    %module example
    
    struct Foo {
        int  value;
        Foo  *next;
    };
    
    Foo *head = 0;
    

    When wrapped in Tcl, careful observation will reveal that ownership changes whenever an object is assigned to a global variable. For example:

    % Foo f
    % f cget -thisown
    1
    % set head f
    % f cget -thisown
    0
    

    In this case, C is now holding a reference to the object---you probably don't want Tcl to destroy it. Similarly, this occurs for members. For example:

    % Foo f
    % Foo g
    % f cget -thisown
    1
    % g cget -thisown
    1
    % f configure -next g
    % g cget -thisown 
    0
    %
    

    For the most part, memory management issues remain hidden. However, there are occasionally situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Node {
      Object *value;
    public:
      void set_value(Object *v) { value = v; }
      ...
    };
    

    Now, consider the following Tcl code:

    % Object v                 # Create an object
    % Node n                   # Create a node
    % n setvalue v             # Set value
    % v cget -thisown
    1
    % 
    

    In this case, the object n is holding a reference to v internally. However, SWIG has no way to know that this has occurred. Therefore, Tcl still thinks that it has ownership of the object. Should the proxy object be destroyed, then the C++ destructor will be invoked and n will be holding a stale-pointer. If you're lucky, you will only get a segmentation fault.

    To work around this, it is always possible to flip the ownership flag. For example,

    % v -disown              # Give ownership to C/C++
    % v -acquire             # Acquire ownership
    

    It is also possible to deal with situations like this using typemaps--an advanced topic discussed later.

    40.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Tcl, this allows you to pass simple values instead of pointer. For example:

    set a [add 3 4]
    puts $a
    7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT , use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Tcl, a mutated parameter shows up as a return value. For example:

    set a [negate 3]
    puts $a
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Tcl, the function will return multiple values as a list.

    set r [send_message "Hello World"]
    set bytes [lindex $r 0]
    set success [lindex $r 1]
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    set dim [get_dimensions $m]
    set r  [lindex $dim 0]
    set c  [lindex $dim 1]
    

    40.6 Exception handling

    The %exception directive can be used to create a user-definable exception handler in charge of converting exceptions in your C/C++ program into Tcl exceptions. The chapter on customization features contains more details, but suppose you extended the array example into a C++ class like the following :

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    The functions associated with this class can throw a C++ range exception for an out-of-bounds array access. We can catch this in our Tcl extension by specifying the following in an interface file :

    %exception {
      try {
        $action                // Gets substituted by actual function call
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        Tcl_SetResult(interp, (char *)"Array index out-of-bounds", TCL_STATIC);
        return TCL_ERROR;
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on " Customization Features" for more examples.

    40.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Tcl C API as well as the material in the "Typemaps " chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Tcl interface.

    40.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Tcl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
        if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
          return TCL_ERROR;
        printf("Received an integer : %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object of type Tcl_Obj *.

    When this example is compiled into a Tcl module, it operates as follows:

    % load ./example.so
    % fact 6
    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    extern int fact(int n);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int n.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      if (Tcl_GetIntFromObj(interp, $input, &$1) == TCL_ERROR)
        return TCL_ERROR;
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
        $1 = Tcl_GetStringFromObj($input, &$2);
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Tcl object. This allows the function to be used like this (notice how the length parameter is omitted):

    % count e "Hello World"
    1
    

    40.7.2 Tcl typemaps

    The previous section illustrated an "in" typemap for converting Tcl objects to C. A variety of different typemap methods are defined by the Tcl module. For example, to convert a C integer back into a Tcl object, you might define an "out" typemap like this:

    %typemap(out) int {
        Tcl_SetObjResult(interp, Tcl_NewIntObj($1));
    }
    

    The following list details all of the typemap methods that can be used by the Tcl module:

    %typemap(in)

    Converts Tcl objects to input function arguments

    %typemap(out)

    Converts return value of a C function to a Tcl object

    %typemap(varin)

    Assigns a C global variable from a Tcl object

    %typemap(varout)

    Returns a C global variable as a Tcl object

    %typemap(freearg)

    Cleans up a function argument (if necessary)

    %typemap(argout)

    Output argument processing

    %typemap(ret)

    Cleanup of function return values

    %typemap(consttab)

    Creation of Tcl constants (constant table)

    %typemap(constcode)

    Creation of Tcl constants (init function)

    %typemap(memberin)

    Setting of structure/class member data

    %typemap(globalin)

    Setting of C global variables

    %typemap(check)

    Checks function input values.

    %typemap(default)

    Set a default value for an argument (making it optional).

    %typemap(arginit)

    Initialize an argument to a value before any conversions occur.

    Examples of these methods will appear shortly.

    40.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the " Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Tcl.

    $input

    A Tcl_Obj * holding a raw Tcl object with an argument or variable value.

    $result

    A Tcl_Obj * that holds the result to be returned to Tcl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Tcl name of the wrapper function being created.

    40.7.4 Converting a Tcl list to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Tcl list to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      Tcl_Obj **listobjv;
      int       nitems;
      int       i;
      if (Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) {
        return TCL_ERROR;
      }
      $1 = (char **) malloc((nitems+1)*sizeof(char *));
      for (i = 0; i < nitems; i++) {
        $1[i] = Tcl_GetStringFromObj(listobjv[i], 0);
      }
      $1[i] = 0;
    }
    
    // This gives SWIG some cleanup code that will get called after the function call
    %typemap(freearg) char ** {
      if ($1) {
        free($1);
      }
    }
    
    // Now a test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    %}
    %include "tclsh.i"
    
    

    In Tcl:

    % print_args {John Guido Larry}
    argv[0] = John
    argv[1] = Guido
    argv[2] = Larry
    3
    

    40.7.5 Returning values in arguments

    The "argout" typemap can be used to return a value originating from a function argument. For example :

    // A typemap defining how to return an argument by appending it to the result
    %typemap(argout) double *outvalue {
      Tcl_Obj *o = Tcl_NewDoubleObj($1);
      Tcl_ListObjAppendElement(interp, $result, o);
    }
    
    // A typemap telling SWIG to ignore an argument for input
    // However, we still need to pass a pointer to the C function
    %typemap(in, numinputs=0) double *outvalue (double temp) {
      $1 = &temp;
    }
    
    // Now a function returning two values
    int mypow(double a, double b, double *outvalue) {
      if ((a < 0) || (b < 0)) return -1;
      *outvalue = pow(a, b);
      return 0;
    };
    

    When wrapped, SWIG matches the argout typemap to the " double *outvalue" argument. The numinputs=0 specification tells SWIG to simply ignore this argument when generating wrapper code. As a result, a Tcl function using these typemaps will work like this :

    % mypow 2 3     # Returns two values, a status value and the result
    0 8
    %
    

    40.7.6 Useful functions

    The following tables provide some functions that may be useful in writing Tcl typemaps.

    Integers

    Tcl_Obj   *Tcl_NewIntObj(int Value);
    void       Tcl_SetIntObj(Tcl_Obj *obj, int Value);
    int        Tcl_GetIntFromObj(Tcl_Interp *, Tcl_Obj *obj, int *ip);
    

    Floating Point

    Tcl_Obj  *Tcl_NewDoubleObj(double Value);
    void      Tcl_SetDoubleObj(Tcl_Obj *obj, double value);
    int       Tcl_GetDoubleFromObj(Tcl_Interp *, Tcl_Obj *o, double *dp);
    

    Strings

    Tcl_Obj  *Tcl_NewStringObj(char *str, int len);
    char     *Tcl_GetStringFromObj(Tcl_Obj *obj, int *len);
    void      Tcl_AppendToObj(Tcl_Obj *obj, char *str, int len);
    

    Lists

    Tcl_Obj  *Tcl_NewListObj(int objc, Tcl_Obj *objv);
    int       Tcl_ListObjAppendList(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *elemListPtr);
    int       Tcl_ListObjAppendElement(Tcl_Interp *, Tcl_Obj *listPtr, Tcl_Obj *element);
    int       Tcl_ListObjGetElements(Tcl_Interp *, Tcl_Obj *listPtr, int *objcPtr,
                                     Tcl_Obj ***objvPtr);
    int       Tcl_ListObjLength(Tcl_Interp *, Tcl_Obj *listPtr, int *intPtr);
    int       Tcl_ListObjIndex(Tcl_Interp *, Tcl_Obj *listPtr, int index,
                               Tcl_Obj_Obj **objptr);
    int       Tcl_ListObjReplace(Tcl_Interp *, Tcl_Obj *listPtr, int first, int count,
                                 int objc, Tcl_Obj *objv);
    

    Objects

    Tcl_Obj *Tcl_DuplicateObj(Tcl_Obj *obj);
    void     Tcl_IncrRefCount(Tcl_Obj *obj);
    void     Tcl_DecrRefCount(Tcl_Obj *obj);
    int      Tcl_IsShared(Tcl_Obj *obj);
    

    40.7.7 Standard typemaps

    The following typemaps show how to convert a few common kinds of objects between Tcl and C (and to give a better idea of how typemaps work)

    Integer conversion

    %typemap(in) int, short, long {
      int temp;
      if (Tcl_GetIntFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) int, short, long {
      Tcl_SetIntObj($result, (int) $1);
    }
    

    Floating point conversion

    %typemap(in) float, double {
      double temp;
      if (Tcl_GetDoubleFromObj(interp, $input, &temp) == TCL_ERROR)
        return TCL_ERROR;
      $1 = ($1_ltype) temp;
    }
    

    %typemap(out) float, double {
      Tcl_SetDoubleObj($result, $1);
    }
    

    String Conversion

    %typemap(in) char * {
      int len;
      $1 = Tcl_GetStringFromObj(interp, &len);
    }
    

    %typemap(out, noblock=1, fragment="SWIG_FromCharPtr") char *, const char * {
      Tcl_SetObjResult(interp, SWIG_FromCharPtr((const char *)$1));
    }
    
    

    40.7.8 Pointer handling

    SWIG pointers are mapped into Tcl strings containing the hexadecimal value and type. The following functions can be used to create and read pointer values.

    int SWIG_ConvertPtr(Tcl_Obj *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Tcl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. It is currently reserved for future expansion. Returns 0 on success and -1 on error.

    Tcl_Obj *SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int flags)

    Creates a new Tcl pointer object. ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag reserved for future expansion.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    Tcl_Obj *;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    40.8 Turning a SWIG module into a Tcl Package.

    Tcl 7.4 introduced the idea of an extension package. By default, SWIG generates all of the code necessary to create a package. To set the package version, simply use the -pkgversion option. For example:

    % swig -tcl -pkgversion 2.3 example.i
    

    After building the SWIG generated module, you need to execute the " pkg_mkIndex" command inside tclsh. For example :

    unix > tclsh
    % pkg_mkIndex . example.so
    % exit
    

    This creates a file "pkgIndex.tcl" with information about the package. To use your package, you now need to move it to its own subdirectory which has the same name as the package. For example :

    ./example/
               pkgIndex.tcl           # The file created by pkg_mkIndex
               example.so             # The SWIG generated module
    

    Finally, assuming that you're not entirely confused at this point, make sure that the example subdirectory is visible from the directories contained in either the tcl_library or auto_path variables. At this point you're ready to use the package as follows :

    unix > tclsh
    % package require example
    % fact 4
    24
    %
    

    If you're working with an example in the current directory and this doesn't work, do this instead :

    unix > tclsh
    % lappend auto_path .
    % package require example
    % fact 4
    24
    

    As a final note, most SWIG examples do not yet use the package commands. For simple extensions it may be easier just to use the load command instead.

    40.9 Building new kinds of Tcl interfaces (in Tcl)

    One of the most interesting aspects of Tcl and SWIG is that you can create entirely new kinds of Tcl interfaces in Tcl using the low-level SWIG accessor functions. For example, suppose you had a library of helper functions to access arrays :

    /* File : array.i */
    %module array
    
    %inline %{
    double *new_double(int size) {
            return (double *) malloc(size*sizeof(double));
    }
    void delete_double(double *a) {
            free(a);
    }
    double get_double(double *a, int index) {
            return a[index];
    }
    void set_double(double *a, int index, double val) {
            a[index] = val;
    }
    int *new_int(int size) {
            return (int *) malloc(size*sizeof(int));
    }
    void delete_int(int *a) {
            free(a);
    }
    int get_int(int *a, int index) {
            return a[index];
    }
    int set_int(int *a, int index, int val) {
            a[index] = val;
    }
    %}
    
    

    While these could be called directly, we could also write a Tcl script like this :

    proc Array {type size} {
        set ptr [new_$type $size]
        set code {
            set method [lindex $args 0]
            set parms [concat $ptr [lrange $args 1 end]]
            switch $method {
                get {return [eval "get_$type $parms"]}
                set {return [eval "set_$type $parms"]}
                delete {eval "delete_$type $ptr; rename $ptr {}"}
            }
        }
        # Create a procedure
        uplevel "proc $ptr args {set ptr $ptr; set type $type;$code}"
        return $ptr
    }
    

    Our script allows easy array access as follows :

    set a [Array double 100]                   ;# Create a double [100]
    for {set i 0} {$i < 100} {incr i 1} {      ;# Clear the array
            $a set $i 0.0
    }
    $a set 3 3.1455                            ;# Set an individual element
    set b [$a get 10]                          ;# Retrieve an element
    
    set ia [Array int 50]                      ;# Create an int[50]
    for {set i 0} {$i < 50} {incr i 1} {       ;# Clear it
            $ia set $i 0
    }
    $ia set 3 7                                ;# Set an individual element
    set ib [$ia get 10]                        ;# Get an individual element
    
    $a delete                                  ;# Destroy a
    $ia delete                                 ;# Destroy ia
    

    The cool thing about this approach is that it makes a common interface for two different types of arrays. In fact, if we were to add more C datatypes to our wrapper file, the Tcl code would work with those as well--without modification. If an unsupported datatype was requested, the Tcl code would simply return with an error so there is very little danger of blowing something up (although it is easily accomplished with an out of bounds array access).

    40.9.1 Proxy classes

    A similar approach can be applied to proxy classes (also known as shadow classes). The following example is provided by Erik Bierwagen and Paul Saxe. To use it, run SWIG with the -noobject option (which disables the builtin object oriented interface). When running Tcl, simply source this file. Now, objects can be used in a more or less natural fashion.

    # swig_c++.tcl
    # Provides a simple object oriented interface using
    # SWIG's low level interface.
    #
    
    proc new {objectType handle_r args} {
        # Creates a new SWIG object of the given type,
        # returning a handle in the variable "handle_r".
        #
        # Also creates a procedure for the object and a trace on
        # the handle variable that deletes the object when the
        # handle variable is overwritten or unset
        upvar $handle_r handle
        #
        # Create the new object
        #
        eval set handle \[new_$objectType $args\]
        #
        # Set up the object procedure
        #
        proc $handle {cmd args} "eval ${objectType}_\$cmd $handle \$args"
        #
        # And the trace ...
        #
        uplevel trace variable $handle_r uw "{deleteObject $objectType $handle}"
        #
        # Return the handle so that 'new' can be used as an argument to a procedure
        #
        return $handle
    }
    
    proc deleteObject {objectType handle name element op} {
        #
        # Check that the object handle has a reasonable form
        #
        if {![regexp {_[0-9a-f]*_(.+)_p} $handle]} {
            error "deleteObject: not a valid object handle: $handle"
        }
        #
        # Remove the object procedure
        #
        catch {rename $handle {}}
        #
        # Delete the object
        #
        delete_$objectType $handle
    }
    
    proc delete {handle_r} {
        #
        # A synonym for unset that is more familiar to C++ programmers
        #
        uplevel unset $handle_r
    }
    

    To use this file, we simply source it and execute commands such as "new" and "delete" to manipulate objects. For example :

    // list.i
    %module List
    %{
    #include "list.h"
    %}
    
    // Very simple C++ example
    
    class List {
    public:
      List();  // Create a new list
      ~List(); // Destroy a list
      int  search(char *value);
      void insert(char *);  // Insert a new item into the list
      void remove(char *);  // Remove item from list
      char *get(int n);     // Get the nth item in the list
      int  length;          // The current length of the list
    static void print(List *l);  // Print out the contents of the list
    };
    

    Now a Tcl script using the interface...

    load ./list.so list       ; # Load the module
    source swig_c++.tcl       ; # Source the object file
    
    new List l
    $l insert Dave
    $l insert John
    $l insert Guido
    $l remove Dave
    puts $l length_get
    
    delete l
    

    The cool thing about this example is that it works with any C++ object wrapped by SWIG and requires no special compilation. Proof that a short, but clever Tcl script can be combined with SWIG to do many interesting things.

    40.10 Tcl/Tk Stubs

    For background information about the Tcl Stubs feature, see http://www.tcl.tk/doc/howto/stubs.html.

    As of SWIG 1.3.10, the generated C/C++ wrapper will use the Tcl Stubs feature if compiled with -DUSE_TCL_STUBS.

    As of SWIG 1.3.40, the generated C/C++ wrapper will use the Tk Stubs feature if compiled with -DUSE_TK_STUBS. Also, you can override the minimum version to support which is passed to Tcl_InitStubs() and Tk_InitStubs() with -DSWIG_TCL_STUBS_VERSION="8.3" or the version being compiled with using -DSWIG_TCL_STUBS_VERSION=TCL_VERSION.


    41 Extending SWIG to support new languages

    41.1 Introduction

    This chapter describes SWIG's internal organization and the process by which new target languages can be developed. First, a brief word of warning---SWIG is continually evolving. The information in this chapter is mostly up to date, but changes are ongoing. Expect a few inconsistencies.

    Also, this chapter is not meant to be a hand-holding tutorial. As a starting point, you should probably look at one of SWIG's existing modules.

    41.2 Prerequisites

    In order to extend SWIG, it is useful to have the following background:

    • An understanding of the C API for the target language.
    • A good grasp of the C++ type system.
    • An understanding of typemaps and some of SWIG's advanced features.
    • Some familiarity with writing C++ (language modules are currently written in C++).

    Since SWIG is essentially a specialized C++ compiler, it may be useful to have some prior experience with compiler design (perhaps even a compilers course) to better understand certain parts of the system. A number of books will also be useful. For example, "The C Programming Language" by Kernighan and Ritchie (a.k.a, "K&R") and the C++ standard, "ISO/IEC 14882 Programming Languages - C++" will be of great use.

    Also, it is useful to keep in mind that SWIG primarily operates as an extension of the C++ type system. At first glance, this might not be obvious, but almost all SWIG directives as well as the low-level generation of wrapper code are driven by C++ datatypes.

    41.3 The Big Picture

    SWIG is a special purpose compiler that parses C++ declarations to generate wrapper code. To make this conversion possible, SWIG makes three fundamental extensions to the C++ language:

    • Typemaps. Typemaps are used to define the conversion/marshalling behavior of specific C++ datatypes. All type conversion in SWIG is based on typemaps. Furthermore, the association of typemaps to datatypes utilizes an advanced pattern matching mechanism that is fully integrated with the C++ type system.
    • Declaration Annotation. To customize wrapper code generation, most declarations can be annotated with special features. For example, you can make a variable read-only, you can ignore a declaration, you can rename a member function, you can add exception handling, and so forth. Virtually all of these customizations are built on top of a low-level declaration annotator that can attach arbitrary attributes to any declaration. Code generation modules can look for these attributes to guide the wrapping process.
    • Class extension. SWIG allows classes and structures to be extended with new methods and attributes (the %extend directive). This has the effect of altering the API in the target language and can be used to generate OO interfaces to C libraries.

    It is important to emphasize that virtually all SWIG features reduce to one of these three fundamental concepts. The type system and pattern matching rules also play a critical role in making the system work. For example, both typemaps and declaration annotation are based on pattern matching and interact heavily with the underlying type system.

    41.4 Execution Model

    When you run SWIG on an interface, processing is handled in stages by a series of system components:

    • An integrated C preprocessor reads a collection of configuration files and the specified interface file into memory. The preprocessor performs the usual functions including macro expansion and file inclusion. However, the preprocessor also performs some transformations of the interface. For instance, #define statements are sometimes transformed into %constant declarations. In addition, information related to file/line number tracking is inserted.
    • A C/C++ parser reads the preprocessed input and generates a full parse tree of all of the SWIG directives and C declarations found. The parser is responsible for many aspects of the system including renaming, declaration annotation, and template expansion. However, the parser does not produce any output nor does it interact with the target language module as it runs. SWIG is not a one-pass compiler.
    • A type-checking pass is made. This adjusts all of the C++ typenames to properly handle namespaces, typedefs, nested classes, and other issues related to type scoping.
    • A semantic pass is made on the parse tree to collect information related to properties of the C++ interface. For example, this pass would determine whether or not a class allows a default constructor.
    • A code generation pass is made using a specific target language module. This phase is responsible for generating the actual wrapper code. All of SWIG's user-defined modules are invoked during this latter stage of compilation.

    The next few sections briefly describe some of these stages.

    41.4.1 Preprocessing

    The preprocessor plays a critical role in the SWIG implementation. This is because a lot of SWIG's processing and internal configuration is managed not by code written in C, but by configuration files in the SWIG library. In fact, when you run SWIG, parsing starts with a small interface file like this (note: this explains the cryptic error messages that new users sometimes get when SWIG is misconfigured or installed incorrectly):

    %include "swig.swg"             // Global SWIG configuration
    %include "langconfig.swg"       // Language specific configuration
    %include "yourinterface.i"      // Your interface file
    

    The swig.swg file contains global configuration information. In addition, this file defines many of SWIG's standard directives as macros. For instance, part of of swig.swg looks like this:

    ...
    /* Code insertion directives such as %wrapper %{ ... %} */
    
    #define %begin       %insert("begin")
    #define %runtime     %insert("runtime")
    #define %header      %insert("header")
    #define %wrapper     %insert("wrapper")
    #define %init        %insert("init")
    
    /* Access control directives */
    
    #define %immutable   %feature("immutable", "1")
    #define %mutable     %feature("immutable")
    
    /* Directives for callback functions */
    
    #define %callback(x) %feature("callback") `x`;
    #define %nocallback  %feature("callback");
    
    /* %ignore directive */
    
    #define %ignore         %rename($ignore)
    #define %ignorewarn(x)  %rename("$ignore:" x)
    ...
    

    The fact that most of the standard SWIG directives are macros is intended to simplify the implementation of the internals. For instance, rather than having to support dozens of special directives, it is easier to have a few basic primitives such as %feature or %insert.

    The langconfig.swg file is supplied by the target language. This file contains language-specific configuration information. More often than not, this file provides run-time wrapper support code (e.g., the type-checker) as well as a collection of typemaps that define the default wrapping behavior. Note: the name of this file depends on the target language and is usually something like python.swg or perl5.swg.

    As a debugging aide, the text that SWIG feeds to its C++ parser can be obtained by running swig -E interface.i. This output probably isn't too useful in general, but it will show how macros have been expanded as well as everything else that goes into the low-level construction of the wrapper code.

    41.4.2 Parsing

    The current C++ parser handles a subset of C++. Most incompatibilities with C are due to subtle aspects of how SWIG parses declarations. Specifically, SWIG expects all C/C++ declarations to follow this general form:

    storage type declarator initializer;
    

    storage is a keyword such as extern, static, typedef, or virtual. type is a primitive datatype such as int or void. type may be optionally qualified with a qualifier such as const or volatile. declarator is a name with additional type-construction modifiers attached to it (pointers, arrays, references, functions, etc.). Examples of declarators include *x, **x, x[20], and (*x)(int, double). The initializer may be a value assigned using = or body of code enclosed in braces { ... }.

    This declaration format covers most common C++ declarations. However, the C++ standard is somewhat more flexible in the placement of the parts. For example, it is technically legal, although uncommon to write something like int typedef const a in your program. SWIG simply doesn't bother to deal with this case.

    The other significant difference between C++ and SWIG is in the treatment of typenames. In C++, if you have a declaration like this,

    int blah(Foo *x, Bar *y);
    

    it won't parse correctly unless Foo and Bar have been previously defined as types either using a class definition or a typedef. The reasons for this are subtle, but this treatment of typenames is normally integrated at the level of the C tokenizer---when a typename appears, a different token is returned to the parser instead of an identifier.

    SWIG does not operate in this manner--any legal identifier can be used as a type name. The reason for this is primarily motivated by the use of SWIG with partially defined data. Specifically, SWIG is supposed to be easy to use on interfaces with missing type information.

    Because of the different treatment of typenames, the most serious limitation of the SWIG parser is that it can't process type declarations where an extra (and unnecessary) grouping operator is used. For example:

    int (x);         /* A variable x */
    int (y)(int);    /* A function y */
    

    The placing of extra parentheses in type declarations like this is already recognized by the C++ community as a potential source of strange programming errors. For example, Scott Meyers "Effective STL" discusses this problem in a section on avoiding C++'s "most vexing parse."

    The parser is also unable to handle declarations with no return type or bare argument names. For example, in an old C program, you might see things like this:

    foo(a, b) {
    ...
    }
    

    In this case, the return type as well as the types of the arguments are taken by the C compiler to be an int. However, SWIG interprets the above code as an abstract declarator for a function returning a foo and taking types a and b as arguments).

    41.4.3 Parse Trees

    The SWIG parser produces a complete parse tree of the input file before any wrapper code is actually generated. Each item in the tree is known as a "Node". Each node is identified by a symbolic tag. Furthermore, a node may have an arbitrary number of children. The parse tree structure and tag names of an interface can be displayed using swig -debug-tags. For example:

    $ swig -c++ -python -debug-tags example.i
     . top (example.i:1)
     . top . include (example.i:1)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include (example.i:4)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:7)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:8)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/python/python.swg:19)
    ...
     . top . include (example.i:6)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:6)
     . top . include . include (example.i:9)
     . top . include . include . class (example.h:3)
     . top . include . include . class . access (example.h:4)
     . top . include . include . class . constructor (example.h:7)
     . top . include . include . class . destructor (example.h:10)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:12)
     . top . include . include . class . cdecl (example.h:13)
     . top . include . include . class . cdecl (example.h:14)
     . top . include . include . class . cdecl (example.h:15)
     . top . include . include . class (example.h:18)
     . top . include . include . class . access (example.h:19)
     . top . include . include . class . cdecl (example.h:20)
     . top . include . include . class . access (example.h:21)
     . top . include . include . class . constructor (example.h:22)
     . top . include . include . class . cdecl (example.h:23)
     . top . include . include . class . cdecl (example.h:24)
     . top . include . include . class (example.h:27)
     . top . include . include . class . access (example.h:28)
     . top . include . include . class . cdecl (example.h:29)
     . top . include . include . class . access (example.h:30)
     . top . include . include . class . constructor (example.h:31)
     . top . include . include . class . cdecl (example.h:32)
     . top . include . include . class . cdecl (example.h:33)
    

    Even for the most simple interface, the parse tree structure is larger than you might expect. For example, in the above output, a substantial number of nodes are actually generated by the python.swg configuration file which defines typemaps and other directives. The contents of the user-supplied input file don't appear until the end of the output.

    The contents of each parse tree node consist of a collection of attribute/value pairs. Internally, the nodes are simply represented by hash tables. A display of the entire parse-tree structure can be obtained using swig -debug-top <n>, where n is the stage being processed. There are a number of other parse tree display options, for example, swig -debug-module <n> will avoid displaying system parse information and only display the parse tree pertaining to the user's module at stage n of processing.

    $ swig -c++ -python -debug-module 4 example.i
          +++ include ----------------------------------------
          | name         - "example.i"
    
                +++ module ----------------------------------------
                | name         - "example"
                |
                +++ insert ----------------------------------------
                | code         - "\n#include \"example.h\"\n"
                |
                +++ include ----------------------------------------
                | name         - "example.h"
    
                      +++ class ----------------------------------------
                      | abstract     - "1"
                      | sym:name     - "Shape"
                      | name         - "Shape"
                      | kind         - "class"
                      | symtab       - 0x40194140
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Shape"
                            | name         - "Shape"
                            | decl         - "f()."
                            | code         - "{\n    nshapes++;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ destructor ----------------------------------------
                            | sym:name     - "~Shape"
                            | name         - "~Shape"
                            | storage      - "virtual"
                            | code         - "{\n    nshapes--;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "x"
                            | name         - "x"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "y"
                            | name         - "y"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "move"
                            | name         - "move"
                            | decl         - "f(double, double)."
                            | parms        - double, double
                            | type         - "void"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "nshapes"
                            | name         - "nshapes"
                            | decl         - ""
                            | storage      - "static"
                            | type         - "int"
                            | sym:symtab   - 0x40194140
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Circle"
                      | name         - "Circle"
                      | kind         - "class"
                      | bases        - 0x40194510
                      | symtab       - 0x40194538
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "radius"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Circle"
                            | name         - "Circle"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Square"
                      | name         - "Square"
                      | kind         - "class"
                      | bases        - 0x40194760
                      | symtab       - 0x40194788
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "width"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Square"
                            | name         - "Square"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
    

    41.4.4 Attribute namespaces

    Attributes of parse tree nodes are often prepended with a namespace qualifier. For example, the attributes sym:name and sym:symtab are attributes related to symbol table management and are prefixed with sym:. As a general rule, only those attributes which are directly related to the raw declaration appear without a prefix (type, name, declarator, etc.).

    Target language modules may add additional attributes to nodes to assist the generation of wrapper code. The convention for doing this is to place these attributes in a namespace that matches the name of the target language. For example, python:foo or perl:foo.

    41.4.5 Symbol Tables

    During parsing, all symbols are managed in the space of the target language. The sym:name attribute of each node contains the symbol name selected by the parser. Normally, sym:name and name are the same. However, the %rename directive can be used to change the value of sym:name. You can see the effect of %rename by trying it on a simple interface and dumping the parse tree. For example:

    %rename(foo_i) foo(int);
    %rename(foo_d) foo(double);
    
    void foo(int);
    void foo(double);
    void foo(Bar *b);
    

    There are various debug- options that can be useful for debugging and analysing the parse tree. For example, the debug-top <n> or debug-module <n> options will dump the entire/top of the parse tree or the module subtree at one of the four n stages of processing. The parse tree can be viewed after the final stage of processing by running SWIG:

    $ swig -debug-top 4 example.i
    ...
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_i"
                | name         - "foo"
                | decl         - "f(int)."
                | parms        - int
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_d"
                | name         - "foo"
                | decl         - "f(double)."
                | parms        - double
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo"
                | name         - "foo"
                | decl         - "f(p.Bar)."
                | parms        - Bar *
                | type         - "void"
                | sym:symtab   - 0x40165078
    

    All symbol-related conflicts and complaints about overloading are based on sym:name values. For instance, the following example uses %rename in reverse to generate a name clash.

    %rename(foo) foo_i(int);
    %rename(foo) foo_d(double;
    
    void foo_i(int);
    void foo_d(double);
    void foo(Bar *b);
    

    When you run SWIG on this you now get:

    $ ./swig example.i
    example.i:6. Overloaded declaration ignored.  foo_d(double )
    example.i:5. Previous declaration is foo_i(int )
    example.i:7. Overloaded declaration ignored.  foo(Bar *)
    example.i:5. Previous declaration is foo_i(int )
    

    41.4.6 The %feature directive

    A number of SWIG directives such as %exception are implemented using the low-level %feature directive. For example:

    %feature("except") getitem(int) {
      try {
         $action
      } catch (badindex) {
         ...
      }
    }
    
    ...
    class Foo {
    public:
      Object *getitem(int index) throws(badindex);
      ...
    };
    

    The behavior of %feature is very easy to describe--it simply attaches a new attribute to any parse tree node that matches the given prototype. When a feature is added, it shows up as an attribute in the feature: namespace. You can see this when running with the -debug-top 4 option. For example:

     +++ cdecl ----------------------------------------
     | sym:name     - "getitem"
     | name         - "getitem"
     | decl         - "f(int).p."
     | parms        - int
     | type         - "Object"
     | feature:except - "{\n    try {\n       $action\n    } catc..."
     | sym:symtab   - 0x40168ac8
     |
    

    Feature names are completely arbitrary and a target language module can be programmed to respond to any feature name that it wants to recognize. The data stored in a feature attribute is usually just a raw unparsed string. For example, the exception code above is simply stored without any modifications.

    41.4.7 Code Generation

    Language modules work by defining handler functions that know how to respond to different types of parse-tree nodes. These handlers simply look at the attributes of each node in order to produce low-level code.

    In reality, the generation of code is somewhat more subtle than simply invoking handler functions. This is because parse-tree nodes might be transformed. For example, suppose you are wrapping a class like this:

    class Foo {
    public:
      virtual int *bar(int x);
    };
    

    When the parser constructs a node for the member bar, it creates a raw "cdecl" node with the following attributes:

    nodeType    : cdecl
    name        : bar
    type        : int
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    To produce wrapper code, this "cdecl" node undergoes a number of transformations. First, the node is recognized as a function declaration. This adjusts some of the type information--specifically, the declarator is joined with the base datatype to produce this:

    nodeType    : cdecl
    name        : bar
    type        : p.int        <-- Notice change in return type
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    Next, the context of the node indicates that the node is really a member function. This produces a transformation to a low-level accessor function like this:

    nodeType    : cdecl
    name        : bar
    type        : int.p
    decl        : f(int).p
    parms       : Foo *self, int x            <-- Added parameter
    storage     : virtual
    wrap:action : result = (arg1)->bar(arg2)  <-- Action code added
    sym:name    : Foo_bar                     <-- Symbol name changed
    

    In this transformation, notice how an additional parameter was added to the parameter list and how the symbol name of the node has suddenly changed into an accessor using the naming scheme described in the "SWIG Basics" chapter. A small fragment of "action" code has also been generated--notice how the wrap:action attribute defines the access to the underlying method. The data in this transformed node is then used to generate a wrapper.

    Language modules work by registering handler functions for dealing with various types of nodes at different stages of transformation. This is done by inheriting from a special Language class and defining a collection of virtual methods. For example, the Python module defines a class as follows:

    class PYTHON : public Language {
    protected:
    public :
      virtual void main(int, char *argv[]);
      virtual int  top(Node *);
      virtual int  functionWrapper(Node *);
      virtual int  constantWrapper(Node *);
      virtual int  variableWrapper(Node *);
      virtual int  nativeWrapper(Node *);
      virtual int  membervariableHandler(Node *);
      virtual int  memberconstantHandler(Node *);
      virtual int  memberfunctionHandler(Node *);
      virtual int  constructorHandler(Node *);
      virtual int  destructorHandler(Node *);
      virtual int  classHandler(Node *);
      virtual int  classforwardDeclaration(Node *);
      virtual int  insertDirective(Node *);
      virtual int  importDirective(Node *);
    };
    

    The role of these functions is described shortly.

    41.4.8 SWIG and XML

    Much of SWIG's current parser design was originally motivated by interest in using XML to represent SWIG parse trees. Although XML is not currently used in any direct manner, the parse tree structure, use of node tags, attributes, and attribute namespaces are all influenced by aspects of XML parsing. Therefore, in trying to understand SWIG's internal data structures, it may be useful to keep XML in the back of your mind as a model.

    41.5 Primitive Data Structures

    Most of SWIG is constructed using three basic data structures: strings, hashes, and lists. These data structures are dynamic in same way as similar structures found in many scripting languages. For instance, you can have containers (lists and hash tables) of mixed types and certain operations are polymorphic.

    This section briefly describes the basic structures so that later sections of this chapter make more sense.

    When describing the low-level API, the following type name conventions are used:

    • String. A string object.
    • Hash. A hash object.
    • List. A list object.
    • String_or_char. A string object or a char *.
    • Object_or_char. An object or a char *.
    • Object. Any object (string, hash, list, etc.)

    In most cases, other typenames in the source are aliases for one of these primitive types. Specifically:

    typedef String SwigType;
    typedef Hash   Parm;
    typedef Hash   ParmList;
    typedef Hash   Node;
    typedef Hash   Symtab;
    typedef Hash   Typetab;
    

    41.5.1 Strings

    String *NewString(const String_or_char *val)

    Creates a new string with initial value val . val may be a char * or another String object. If you want to create an empty string, use "" for val.

    String *NewStringf(const char *fmt, ...)

    Creates a new string whose initial value is set according to a C printf style format string in fmt. Additional arguments follow depending on fmt.

    String *Copy(String *s)

    Make a copy of the string s.

    void Delete(String *s)

    Deletes s.

    int Len(const String_or_char *s)

    Returns the length of the string.

    char *Char(const String_or_char *s)

    Returns a pointer to the first character in a string.

    void Append(String *s, const String_or_char *t)

    Appends t to the end of string s.

    void Insert(String *s, int pos, const String_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the string (appending).

    int Strcmp(const String_or_char *s, const String_or_char *t)

    Compare strings s and t. Same as the C strcmp() function.

    int Strncmp(const String_or_char *s, const String_or_char *t, int len)

    Compare the first len characters of strings s and t. Same as the C strncmp() function.

    char *Strstr(const String_or_char *s, const String_or_char *pat)

    Returns a pointer to the first occurrence of pat in s. Same as the C strstr() function.

    char *Strchr(const String_or_char *s, char ch)

    Returns a pointer to the first occurrence of character ch in s. Same as the C strchr() function.

    void Chop(String *s)

    Chops trailing whitespace off the end of s .

    int Replace(String *s, const String_or_char *pat, const String_or_char *rep, int flags)

    Replaces the pattern pat with rep in string s . flags is a combination of the following flags:

    DOH_REPLACE_ANY       - Replace all occurrences
    DOH_REPLACE_ID        - Valid C identifiers only
    DOH_REPLACE_NOQUOTE   - Don't replace in quoted strings
    DOH_REPLACE_FIRST     - Replace first occurrence only.
    

    Returns the number of replacements made (if any).

    41.5.2 Hashes

    Hash *NewHash()

    Creates a new empty hash table.

    Hash *Copy(Hash *h)

    Make a shallow copy of the hash h.

    void Delete(Hash *h)

    Deletes h.

    int Len(Hash *h)

    Returns the number of items in h.

    Object *Getattr(Hash *h, const String_or_char *key)

    Gets an object from h. key may be a string or a simple char * string. Returns NULL if not found.

    int Setattr(Hash *h, const String_or_char *key, const Object_or_char *val)

    Stores val in h. key may be a string or a simple char *. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the hash. If val is NULL, the object is deleted. Increases the reference count of val. Returns 1 if this operation replaced an existing hash entry, 0 otherwise.

    int Delattr(Hash *h, const String_or_char *key)

    Deletes the hash item referenced by key. Decreases the reference count on the corresponding object (if any). Returns 1 if an object was removed, 0 otherwise.

    List *Keys(Hash *h)

    Returns the list of hash table keys.

    41.5.3 Lists

    List *NewList()

    Creates a new empty list.

    List *Copy(List *x)

    Make a shallow copy of the List x.

    void Delete(List *x)

    Deletes x.

    int Len(List *x)

    Returns the number of items in x.

    Object *Getitem(List *x, int n)

    Returns an object from x with index n . If n is beyond the end of the list, the last item is returned. If n is negative, the first item is returned.

    int *Setitem(List *x, int n, const Object_or_char *val)

    Stores val in x. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the list. n must be in range. Otherwise, an assertion will be raised.

    int *Delitem(List *x, int n)

    Deletes item n from the list, shifting items down if necessary. To delete the last item in the list, use the special value DOH_END for n.

    void Append(List *x, const Object_or_char *t)

    Appends t to the end of x. If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    void Insert(String *s, int pos, const Object_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the list (appending). If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    41.5.4 Common operations

    The following operations are applicable to all datatypes.

    Object *Copy(Object *x)

    Make a copy of the object x.

    void Delete(Object *x)

    Deletes x.

    void Setfile(Object *x, String_or_char *f)

    Sets the filename associated with x. Used to track objects and report errors.

    String *Getfile(Object *x)

    Gets the filename associated with x.

    void Setline(Object *x, int n)

    Sets the line number associated with x. Used to track objects and report errors.

    int Getline(Object *x)

    Gets the line number associated with x.

    41.5.5 Iterating over Lists and Hashes

    To iterate over the elements of a list or a hash table, the following functions are used:

    Iterator First(Object *x)

    Returns an iterator object that points to the first item in a list or hash table. The item attribute of the Iterator object is a pointer to the item. For hash tables, the key attribute of the Iterator object additionally points to the corresponding Hash table key. The item and key attributes are NULL if the object contains no items or if there are no more items.

    Iterator Next(Iterator i)

    Returns an iterator that points to the next item in a list or hash table. Here are two examples of iteration:

    List *l = (some list);
    Iterator i;
    
    for (i = First(l); i.item; i = Next(i)) {
      Printf(stdout, "%s\n", i.item);
    }
    
    Hash *h = (some hash);
    Iterator j;
    
    for (j = First(j); j.item; j= Next(j)) {
      Printf(stdout, "%s : %s\n", j.key, j.item);
    }
    

    41.5.6 I/O

    Special I/O functions are used for all internal I/O. These operations work on C FILE * objects, String objects, and special File objects (which are merely a wrapper around FILE *).

    int Printf(String_or_FILE *f, const char *fmt, ...)

    Formatted I/O. Same as the C fprintf() function except that output can also be directed to a string object. Note: the %s format specifier works with both strings and char *. All other format operators have the same meaning.

    int Printv(String_or_FILE *f, String_or_char *arg1, ..., NULL)

    Prints a variable number of strings arguments to the output. The last argument to this function must be NULL. The other arguments can either be char * or string objects.

    int Putc(int ch, String_or_FILE *f)

    Same as the C fputc() function.

    int Write(String_or_FILE *f, void *buf, int len)

    Same as the C write() function.

    int Read(String_or_FILE *f, void *buf, int maxlen)

    Same as the C read() function.

    int Getc(String_or_FILE *f)

    Same as the C fgetc() function.

    int Ungetc(int ch, String_or_FILE *f)

    Same as the C ungetc() function.

    int Seek(String_or_FILE *f, int offset, int whence)

    Same as the C seek() function. offset is the number of bytes. whence is one of SEEK_SET, SEEK_CUR, or SEEK_END..

    long Tell(String_or_FILE *f)

    Same as the C tell() function.

    File *NewFile(const char *filename, const char *mode, List *newfiles)

    Create a File object using the fopen() library call. This file differs from FILE * in that it can be placed in the standard SWIG containers (lists, hashes, etc.). The filename is added to the newfiles list if newfiles is non-zero and the file was created successfully.

    File *NewFileFromFile(FILE *f)

    Create a File object wrapper around an existing FILE * object.

    There's no explicit function to close a file, just call Delete(f) - this decreases the reference count, and the file will be closed when the reference count reaches zero.

    The use of the above I/O functions and strings play a critical role in SWIG. It is common to see small code fragments of code generated using code like this:

    /* Print into a string */
    String *s = NewString("");
    Printf(s, "Hello\n");
    for (i = 0; i < 10; i++) {
      Printf(s, "%d\n", i);
    }
    ...
    /* Print string into a file */
    Printf(f, "%s\n", s);
    

    Similarly, the preprocessor and parser all operate on string-files.

    41.6 Navigating and manipulating parse trees

    Parse trees are built as collections of hash tables. Each node is a hash table in which arbitrary attributes can be stored. Certain attributes in the hash table provide links to other parse tree nodes. The following macros can be used to move around the parse tree.

    String *nodeType(Node *n)

    Returns the node type tag as a string. The returned string indicates the type of parse tree node.

    Node *nextSibling(Node *n)

    Returns the next node in the parse tree. For example, the next C declaration.

    Node *previousSibling(Node *n)

    Returns the previous node in the parse tree. For example, the previous C declaration.

    Node *firstChild(Node *n)

    Returns the first child node. For example, if n was a C++ class node, this would return the node for the first class member.

    Node *lastChild(Node *n)

    Returns the last child node. You might use this if you wanted to append a new node to the of a class.

    Node *parentNode(Node *n)

    Returns the parent of node n. Use this to move up the pass tree.

    The following macros can be used to change all of the above attributes. Normally, these functions are only used by the parser. Changing them without knowing what you are doing is likely to be dangerous.

    void set_nodeType(Node *n, const String_or_char)

    Change the node type. tree node.

    void set_nextSibling(Node *n, Node *s)

    Set the next sibling.

    void set_previousSibling(Node *n, Node *s)

    Set the previous sibling.

    void set_firstChild(Node *n, Node *c)

    Set the first child node.

    void set_lastChild(Node *n, Node *c)

    Set the last child node.

    void set_parentNode(Node *n, Node *p)

    Set the parent node.

    The following utility functions are used to alter the parse tree (at your own risk)

    void appendChild(Node *parent, Node *child)

    Append a child to parent. The appended node becomes the last child.

    void deleteNode(Node *node)

    Deletes a node from the parse tree. Deletion reconnects siblings and properly updates the parent so that sibling nodes are unaffected.

    41.7 Working with attributes

    Since parse tree nodes are just hash tables, attributes are accessed using the Getattr(), Setattr(), and Delattr() operations. For example:

    int functionHandler(Node *n) {
      String *name    = Getattr(n, "name");
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
    }
    

    New attributes can be freely attached to a node as needed. However, when new attributes are attached during code generation, they should be prepended with a namespace prefix. For example:

    ...
    Setattr(n, "python:docstring", doc);     /* Store docstring */
    ...
    

    A quick way to check the value of an attribute is to use the checkAttribute() function like this:

    if (checkAttribute(n, "storage", "virtual")) {
      /* n is virtual */
      ...
    }
    

    Changing the values of existing attributes is allowed and is sometimes done to implement node transformations. However, if a function/method modifies a node, it is required to restore modified attributes to their original values. To simplify the task of saving/restoring attributes, the following functions are used:

    int Swig_save(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    Saves a copy of attributes name1, name2, etc. from node n. Copies of the attributes are actually resaved in the node in a different namespace which is set by the ns argument. For example, if you call Swig_save("foo", n, "type", NIL), then the "type" attribute will be copied and saved as "foo:type". The namespace name itself is stored in the "view" attribute of the node. If necessary, this can be examined to find out where previous values of attributes might have been saved.

    int Swig_restore(Node *n)

    Restores the attributes saved by the previous call to Swig_save(). Those attributes that were supplied to Swig_save() will be restored to their original values.

    The Swig_save() and Swig_restore() functions must always be used as a pair. That is, every call to Swig_save() must have a matching call to Swig_restore(). Calls can be nested if necessary. Here is an example that shows how the functions might be used:

    int variableHandler(Node *n) {
      Swig_save("variableHandler", n, "type", "sym:name", NIL);
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
      Append(symname, "_global");        // Change symbol name
      SwigType_add_pointer(type);        // Add pointer
      ...
      generate wrappers
      ...
      Swig_restore(n);                  // Restore original values
      return SWIG_OK;
    }
    

    int Swig_require(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    This is an enhanced version of Swig_save() that adds error checking. If an attribute name is not present in n , a failed assertion results and SWIG terminates with a fatal error. Optionally, if an attribute name is specified as "*name", a copy of the attribute is saved as with Swig_save(). If an attribute is specified as "?name", the attribute is optional. Swig_restore() must always be called after using this function.

    41.8 Type system

    SWIG implements the complete C++ type system including typedef, inheritance, pointers, references, and pointers to members. A detailed discussion of type theory is impossible here. However, let's cover the highlights.

    41.8.1 String encoding of types

    All types in SWIG consist of a base datatype and a collection of type operators that are applied to the base. A base datatype is almost always some kind of primitive type such as int or double . The operators consist of things like pointers, references, arrays, and so forth. Internally, types are represented as strings that are constructed in a very precise manner. Here are some examples:

    C datatype                     SWIG encoding (strings)
    -----------------------------  --------------------------
    int                            "int"
    int *                          "p.int"
    const int *                    "p.q(const).int"
    int (*x)(int, double)          "p.f(int, double).int"
    int [20][30]                   "a(20).a(30).int"
    int (F::*)(int)                "m(F).f(int).int"
    vector<int> *                  "p.vector<(int)>"
    

    Reading the SWIG encoding is often easier than figuring out the C code---just read it from left to right. For a type of "p.f(int, double).int" is a "pointer to a function(int, double) that returns int".

    The following operator encodings are used in type strings:

    Operator              Meaning
    -------------------   -------------------------------
    p.                    Pointer to
    a(n).                 Array of dimension n
    r.                    C++ reference
    m(class).             Member pointer to class
    f(args).              Function.
    q(qlist).             Qualifiers
    

    In addition, type names may be parameterized by templates. This is represented by enclosing the template parameters in <( ... )>. Variable length arguments are represented by the special base type of v(...).

    If you want to experiment with type encodings, the raw type strings can be inserted into an interface file using backticks `` wherever a type is expected. For instance, here is an extremely perverted example:

    `p.a(10).p.f(int, p.f(int).int)` foo(int, int (*x)(int));
    

    This corresponds to the immediately obvious C declaration:

    (*(*foo(int, int (*)(int)))[10])(int, int (*)(int));
    

    Aside from the potential use of this declaration on a C programming quiz, it motivates the use of the special SWIG encoding of types. The SWIG encoding is much easier to work with because types can be easily examined, modified, and constructed using simple string operations (comparison, substrings, concatenation, etc.). For example, in the parser, a declaration like this

    int *a[30];
    

    is processed in a few pieces. In this case, you have the base type " int" and the declarator of type "a(30).p.". To make the final type, the two parts are just joined together using string concatenation.

    41.8.2 Type construction

    The following functions are used to construct types. You should use these functions instead of trying to build the type strings yourself.

    void SwigType_add_pointer(SwigType *ty)

    Adds a pointer to ty.

    void SwigType_del_pointer(SwigType *ty)

    Removes a single pointer from ty.

    void SwigType_add_reference(SwigType *ty)

    Adds a reference to ty.

    void SwigType_add_array(SwigType *ty, const String_or_char *size)

    Adds an array with dimension dim to ty .

    void SwigType_del_array(SwigType *ty)

    Removes a single array dimension from ty.

    int SwigType_array_ndim(SwigType *ty)

    Returns number of array dimensions of ty.

    String* SwigType_array_getdim(SwigType *ty, int n)

    Returns nth array dimension of ty .

    void SwigType_array_setdim(SwigType *ty, int n, const String_or_char *rep)

    Sets nth array dimensions of ty to rep.

    void SwigType_add_qualifier(SwigType *ty, const String_or_char *q)

    Adds a type qualifier q to ty. q is typically "const" or "volatile".

    void SwigType_add_memberpointer(SwigType *ty, const String_or_char *cls)

    Adds a pointer to a member of class cls to ty.

    void SwigType_add_function(SwigType *ty, ParmList *p)

    Adds a function to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    void SwigType_add_template(SwigType *ty, ParmList *p)

    Adds a template to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    SwigType *SwigType_pop(SwigType *ty)

    Removes the last type constructor from ty and returns it. ty is modified.

    void SwigType_push(SwigType *ty, SwigType *op)

    Pushes the type operators in op onto type ty. The opposite of SwigType_pop().

    SwigType *SwigType_pop_arrays(SwigType *ty)

    Removes all leading array operators from ty and returns them. ty is modified. For example, if ty is "a(20).a(10).p.int", then this function would return "a(20).a(10)." and modify ty so that it has the value "p.int".

    SwigType *SwigType_pop_function(SwigType *ty)

    Removes a function operator from ty including any qualification. ty is modified. For example, if ty is "f(int).int", then this function would return "f(int)." and modify ty so that it has the value "int" .

    SwigType *SwigType_base(SwigType *ty)

    Returns the base type of a type. For example, if ty is "p.a(20).int", this function would return "int" . ty is unmodified.

    SwigType *SwigType_prefix(SwigType *ty)

    Returns the prefix of a type. For example, if ty is "p.a(20).int", this function would return "p.a(20).". ty is unmodified.

    41.8.3 Type tests

    The following functions can be used to test properties of a datatype.

    int SwigType_ispointer(SwigType *ty)

    Checks if ty is a standard pointer.

    int SwigType_ismemberpointer(SwigType *ty)

    Checks if ty is a member pointer.

    int SwigType_isreference(SwigType *ty)

    Checks if ty is a C++ reference.

    int SwigType_isarray(SwigType *ty)

    Checks if ty is an array.

    int SwigType_isfunction(SwigType *ty)

    Checks if ty is a function.

    int SwigType_isqualifier(SwigType *ty)

    Checks if ty is a qualifier.

    int SwigType_issimple(SwigType *ty)

    Checks if ty is a simple type. No operators applied.

    int SwigType_isconst(SwigType *ty)

    Checks if ty is a const type.

    int SwigType_isvarargs(SwigType *ty)

    Checks if ty is a varargs type.

    int SwigType_istemplate(SwigType *ty)

    Checks if ty is a templatized type.

    41.8.4 Typedef and inheritance

    The behavior of typedef declaration is to introduce a type alias. For instance, typedef int Integer makes the identifier Integer an alias for int. The treatment of typedef in SWIG is somewhat complicated due to the pattern matching rules that get applied in typemaps and the fact that SWIG prefers to generate wrapper code that closely matches the input to simplify debugging (a user will see the typedef names used in their program instead of the low-level primitive C datatypes).

    To handle typedef, SWIG builds a collection of trees containing typedef relations. For example,

    typedef int Integer;
    typedef Integer *IntegerPtr;
    typedef int Number;
    typedef int Size;
    

    produces two trees like this:

                     int               p.Integer
                   ^  ^  ^                 ^
                  /   |   \                |
                 /    |    \               |
            Integer  Size   Number    IntegerPtr
    

    To resolve a single typedef relationship, the following function is used:

    SwigType *SwigType_typedef_resolve(SwigType *ty)

    Checks if ty can be reduced to a new type via typedef. If so, returns the new type. If not, returns NULL.

    Typedefs are only resolved in simple typenames that appear in a type. For example, the type base name and in function parameters. When resolving types, the process starts in the leaf nodes and moves up the tree towards the root. Here are a few examples that show how it works:

    Original type            After typedef_resolve()
    ------------------------ -----------------------
    Integer                  int
    a(30).Integer            int
    p.IntegerPtr             p.p.Integer
    p.p.Integer              p.p.int
    

    For complicated types, the process can be quite involved. Here is the reduction of a function pointer:

    p.f(Integer, p.IntegerPtr, Size).Integer          : Start
    p.f(Integer, p.IntegerPtr, Size).int
    p.f(int, p.IntegerPtr, Size).int
    p.f(int, p.p.Integer, Size).int
    p.f(int, p.p.int, Size).int
    p.f(int, p.p.int, int).int                        : End
    

    Two types are equivalent if their full type reductions are the same. The following function will fully reduce a datatype:

    SwigType *SwigType_typedef_resolve_all(SwigType *ty)

    Fully reduces ty according to typedef rules. Resulting datatype will consist only of primitive typenames.

    41.8.5 Lvalues

    When generating wrapper code, it is necessary to emit datatypes that can be used on the left-hand side of an assignment operator (an lvalue). However, not all C datatypes can be used in this way---especially arrays and const-qualified types. To generate a type that can be used as an lvalue, use the following function:

    SwigType *SwigType_ltype(SwigType *ty)

    Converts type ty to a type that can be used as an lvalue in assignment. The resulting type is stripped of qualifiers and arrays are converted to a pointers.

    The creation of lvalues is fully aware of typedef and other aspects of the type system. Therefore, the creation of an lvalue may result in unexpected results. Here are a few examples:

    typedef double Matrix4[4][4];
    Matrix4 x;    // type = 'Matrix4', ltype='p.a(4).double'
    
    typedef const char * Literal;
    Literal y;    // type = 'Literal', ltype='p.char'
    

    41.8.6 Output functions

    The following functions produce strings that are suitable for output.

    String *SwigType_str(SwigType *ty, const String_or_char *id = 0)

    Generates a C string for a datatype. id is an optional declarator. For example, if ty is "p.f(int).int" and id is "foo", then this function produces "int (*foo)(int)". This function is used to convert string-encoded types back into a form that is valid C syntax.

    String *SwigType_lstr(SwigType *ty, const String_or_char *id = 0)

    This is the same as SwigType_str() except that the result is generated from the type's lvalue (as generated from SwigType_ltype).

    String *SwigType_lcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from type ty to its lvalue. id is an optional name to include in the cast. For example, if ty is " q(const).p.char" and id is "foo", this function produces the string "(char *) foo".

    String *SwigType_rcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from a type's lvalue to a type equivalent to ty. id is an optional name to include in the cast. For example, if ty is " q(const).p.char" and id is "foo", this function produces the string "(const char *) foo".

    String *SwigType_manglestr(SwigType *ty)

    Generates a mangled string encoding of type ty . The mangled string only contains characters that are part of a valid C identifier. The resulting string is used in various parts of SWIG, but is most commonly associated with type-descriptor objects that appear in wrappers (e.g., SWIGTYPE_p_double).

    41.9 Parameters

    Several type-related functions involve parameter lists. These include functions and templates. Parameter list are represented as a list of nodes with the following attributes:

    "type"        -  Parameter type  (required)
    "name"        -  Parameter name  (optional)
    "value"       -  Initializer     (optional)
    

    Typically parameters are denoted in the source by using a typename of Parm * or ParmList *. To walk a parameter list, simply use code like this:

    Parm *parms;
    Parm *p;
    for (p = parms; p; p = nextSibling(p)) {
      SwigType *type  = Getattr(p, "type");
      String   *name  = Getattr(p, "name");
      String   *value = Getattr(p, "value");
      ...
    }
    

    Note: this code is exactly the same as what you would use to walk parse tree nodes.

    An empty list of parameters is denoted by a NULL pointer.

    Since parameter lists are fairly common, the following utility functions are provided to manipulate them:

    Parm *CopyParm(Parm *p);

    Copies a single parameter.

    ParmList *CopyParmList(ParmList *p);

    Copies an entire list of parameters.

    int ParmList_len(ParmList *p);

    Returns the number of parameters in a parameter list.

    String *ParmList_str(ParmList *p);

    Converts a parameter list into a C string. For example, produces a string like "(int *p, int n, double x);".

    String *ParmList_protostr(ParmList *p);

    The same as ParmList_str() except that parameter names are not included. Used to emit prototypes.

    int ParmList_numrequired(ParmList *p);

    Returns the number of required (non-optional) arguments in p.

    41.10 Writing a Language Module

    One of the easiest routes to supporting a new language module is to copy an already supported language module implementation and modify it. Be sure to choose a language that is similar in nature to the new language. All language modules follow a similar structure and this section briefly outlines the steps needed to create a bare-bones language module from scratch. Since the code is relatively easy to read, this section describes the creation of a minimal Python module. You should be able to extrapolate this to other languages.

    41.10.1 Execution model

    Code generation modules are defined by inheriting from the Language class, currently defined in the Source/Modules directory of SWIG. Starting from the parsing of command line options, all aspects of code generation are controlled by different methods of the Language that must be defined by your module.

    41.10.2 Starting out

    To define a new language module, first create a minimal implementation using this example as a guide:

    #include "swigmod.h"
    
    class PYTHON : public Language {
    public:
    
      virtual void main(int argc, char *argv[]) {
        printf("I'm the Python module.\n");
      }
    
      virtual int top(Node *n) {
        printf("Generating code.\n");
        return SWIG_OK;
      }
    
    };
    
    extern "C" Language *
    swig_python(void) {
      return new PYTHON();
    }
    

    The "swigmod.h" header file contains, among other things, the declaration of the Language base class and so you should include it at the top of your language module's source file. Similarly, the "swigconfig.h" header file contains some other useful definitions that you may need. Note that you should not include any header files that are installed with the target language. That is to say, the implementation of the SWIG Python module shouldn't have any dependencies on the Python header files. The wrapper code generated by SWIG will almost always depend on some language-specific C/C++ header files, but SWIG itself does not.

    Give your language class a reasonable name, usually the same as the target language. By convention, these class names are all uppercase (e.g. "PYTHON" for the Python language module) but this is not a requirement. This class will ultimately consist of a number of overrides of the virtual functions declared in the Language base class, in addition to any language-specific member functions and data you need. For now, just use the dummy implementations shown above.

    The language module ends with a factory function, swig_python() , that simply returns a new instance of the language class. As shown, it should be declared with the extern "C" storage qualifier so that it can be called from C code. It should also return a pointer to the base class (Language) so that only the interface (and not the implementation) of your language module is exposed to the rest of SWIG.

    Save the code for your language module in a file named " python.cxx" and place this file in the Source/Modules directory of the SWIG distribution. To ensure that your module is compiled into SWIG along with the other language modules, modify the file Source/Makefile.am to include the additional source files. In addition, modify the file Source/Modules/swigmain.cxx with an additional command line option that activates the module. Read the source---it's straightforward.

    Next, at the top level of the SWIG distribution, re-run the autogen.sh script to regenerate the various build files:

    $ ./autogen.sh
    

    Next re-run configure to regenerate all of the Makefiles:

    $ ./configure
    

    Finally, rebuild SWIG with your module added:

    $ make
    

    Once it finishes compiling, try running SWIG with the command-line option that activates your module. For example, swig -python foo.i . The messages from your new module should appear.

    41.10.3 Command line options

    When SWIG starts, the command line options are passed to your language module. This occurs before any other processing occurs (preprocessing, parsing, etc.). To capture the command line options, simply use code similar to this:

    void Language::main(int argc, char *argv[]) {
      for (int i = 1; i < argc; i++) {
          if (argv[i]) {
              if (strcmp(argv[i], "-interface") == 0) {
                if (argv[i+1]) {
                  interface = NewString(argv[i+1]);
                  Swig_mark_arg(i);
                  Swig_mark_arg(i+1);
                  i++;
                } else {
                  Swig_arg_error();
                }
              } else if (strcmp(argv[i], "-globals") == 0) {
                if (argv[i+1]) {
                  global_name = NewString(argv[i+1]);
                  Swig_mark_arg(i);
                  Swig_mark_arg(i+1);
                  i++;
                } else {
                  Swig_arg_error();
                }
              } else if ((strcmp(argv[i], "-proxy") == 0)) {
                proxy_flag = 1;
                Swig_mark_arg(i);
              } else if (strcmp(argv[i], "-keyword") == 0) {
                use_kw = 1;
                Swig_mark_arg(i);
              } else if (strcmp(argv[i], "-help") == 0) {
                fputs(usage, stderr);
              }
              ...
          }
      }
    }
    

    The exact set of options depends on what you want to do in your module. Generally, you would use the options to change code generation modes or to print diagnostic information.

    If a module recognizes an option, it should always call Swig_mark_arg() to mark the option as valid. If you forget to do this, SWIG will terminate with an unrecognized command line option error.

    41.10.4 Configuration and preprocessing

    In addition to looking at command line options, the main() method is responsible for some initial configuration of the SWIG library and preprocessor. To do this, insert some code like this:

    void main(int argc, char *argv[]) {
      ... command line options ...
    
      /* Set language-specific subdirectory in SWIG library */
      SWIG_library_directory("python");
    
      /* Set language-specific preprocessing symbol */
      Preprocessor_define("SWIGPYTHON 1", 0);
    
      /* Set language-specific configuration file */
      SWIG_config_file("python.swg");
    
      /* Set typemap language (historical) */
      SWIG_typemap_lang("python");
    }
    

    The above code does several things--it registers the name of the language module with the core, it supplies some preprocessor macro definitions for use in input files (so that they can determine the target language), and it registers a start-up file. In this case, the file python.swg will be parsed before any part of the user-supplied input file.

    Before proceeding any further, create a directory for your module in the SWIG library (The Lib directory). Now, create a configuration file in the directory. For example, python.swg.

    Just to review, your language module should now consist of two files-- an implementation file python.cxx and a configuration file python.swg.

    41.10.5 Entry point to code generation

    SWIG is a multi-pass compiler. Once the main() method has been invoked, the language module does not execute again until preprocessing, parsing, and a variety of semantic analysis passes have been performed. When the core is ready to start generating wrappers, it invokes the top() method of your language class. The argument to top is a single parse tree node that corresponds to the top of the entire parse tree.

    To get the code generation process started, the top() procedure needs to do several things:

    • Initialize the wrapper code output.
    • Set the module name.
    • Emit common initialization code.
    • Emit code for all of the child nodes.
    • Finalize the wrapper module and cleanup.

    An outline of top() might be as follows:

    int Python::top(Node *n) {
    
      /* Get the module name */
      String *module = Getattr(n, "name");
    
      /* Get the output file name */
      String *outfile = Getattr(n, "outfile");
    
      /* Initialize I/O (see next section) */
      ...
    
      /* Output module initialization code */
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Cleanup files */
      ...
    
      return SWIG_OK;
    }
    

    41.10.6 Module I/O and wrapper skeleton

    Within SWIG wrappers, there are five main sections. These are (in order)

    • begin: This section is a placeholder for users to put code at the beginning of the C/C++ wrapper file.
    • runtime: This section has most of the common SWIG runtime code.
    • header: This section holds declarations and inclusions from the .i file.
    • wrapper: This section holds all the wrapper code.
    • init: This section holds the module initialisation function (the entry point for the interpreter).

    Different parts of the SWIG code will fill different sections, then upon completion of the wrappering all the sections will be saved to the wrapper file.

    To perform this will require several additions to the code in various places, such as:

    class PYTHON : public Language {
    protected:
      /* General DOH objects used for holding the strings */
      File *f_begin;
      File *f_runtime;
      File *f_header;
      File *f_wrappers;
      File *f_init;
    
    public:
      ...
    
    };
    
    int Python::top(Node *n) {
    
      ...
    
      /* Initialize I/O */
      f_begin = NewFile(outfile, "w", SWIG_output_files());
      if (!f_begin) {
        FileErrorDisplay(outfile);
        SWIG_exit(EXIT_FAILURE);
      }
      f_runtime = NewString("");
      f_init = NewString("");
      f_header = NewString("");
      f_wrappers = NewString("");
    
      /* Register file targets with the SWIG file handler */
      Swig_register_filebyname("begin", f_begin);
      Swig_register_filebyname("header", f_header);
      Swig_register_filebyname("wrapper", f_wrappers);
      Swig_register_filebyname("runtime", f_runtime);
      Swig_register_filebyname("init", f_init);
    
      /* Output module initialization code */
      Swig_banner(f_begin);
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Write all to the file */
      Dump(f_runtime, f_begin);
      Dump(f_header, f_begin);
      Dump(f_wrappers, f_begin);
      Wrapper_pretty_print(f_init, f_begin);
    
      /* Cleanup files */
      Delete(f_runtime);
      Delete(f_header);
      Delete(f_wrappers);
      Delete(f_init);
      Delete(f_begin);
    
      return SWIG_OK;
    }
    

    Using this to process a file will generate a wrapper file, however the wrapper will only consist of the common SWIG code as well as any inline code which was written in the .i file. It does not contain any wrappers for any of the functions or classes.

    The code to generate the wrappers are the various member functions, which currently have not been touched. We will look at functionWrapper() as this is the most commonly used function. In fact many of the other wrapper routines will call this to do their work.

    A simple modification to write some basic details to the wrapper looks like this:

    int Python::functionWrapper(Node *n) {
      /* Get some useful attributes of this function */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      String   *parmstr= ParmList_str_defaultargs(parms); // to string
      String   *func   = SwigType_str(type, NewStringf("%s(%s)", name, parmstr));
      String   *action = Getattr(n, "wrap:action");
    
      Printf(f_wrappers, "functionWrapper   : %s\n", func);
      Printf(f_wrappers, "           action : %s\n", action);
      return SWIG_OK;
    }
    

    This will now produce some useful information within your wrapper file.

    functionWrapper   : void delete_Shape(Shape *self)
               action : delete arg1;
    
    functionWrapper   : void Shape_x_set(Shape *self, double x)
               action : if (arg1) (arg1)->x = arg2;
    
    functionWrapper   : double Shape_x_get(Shape *self)
               action : result = (double) ((arg1)->x);
    
    functionWrapper   : void Shape_y_set(Shape *self, double y)
               action : if (arg1) (arg1)->y = arg2;
    ...
    

    41.10.7 Low-level code generators

    As ingenious as SWIG is, and despite all its capabilities and the power of its parser, the Low-level code generation takes a lot of work to write properly. Mainly because every language insists on its own manner of interfacing to C/C++. To write the code generators you will need a good understanding of how to manually write an interface to your chosen language, so make sure you have your documentation handy.

    At this point it is also probably a good idea to take a very simple file (just one function), and try letting SWIG generate wrappers for many different languages. Take a look at all of the wrappers generated, and decide which one looks closest to the language you are trying to wrap. This may help you to decide which code to look at.

    In general most language wrappers look a little like this:

    /* wrapper for TYPE3 some_function(TYPE1, TYPE2); */
    RETURN_TYPE _wrap_some_function(ARGS){
      TYPE1 arg1;
      TYPE2 arg2;
      TYPE3 result;
    
      if(ARG1 is not of TYPE1) goto fail;
      arg1=(convert ARG1);
      if(ARG2 is not of TYPE2) goto fail;
      arg2=(convert ARG2);
    
      result=some_function(arg1, arg2);
    
      convert 'result' to whatever the language wants;
    
      do any tidy up;
    
      return ALL_OK;
    
      fail:
      do any tidy up;
      return ERROR;
    }
    

    Yes, it is rather vague and not very clear. But each language works differently so this will have to do for now.

    Tackling this problem will be done in two stages:

    • The skeleton: the function wrapper, and call, but without the conversion
    • The conversion: converting the arguments to-from what the language wants

    The first step will be done in the code, the second will be done in typemaps.

    Our first step will be to write the code for functionWrapper() . What is shown below is NOT the solution, merely a step in the right direction. There are a lot of issues to address.

    • Variable length and default parameters
    • Typechecking and number of argument checks
    • Overloaded functions
    • Inout and Output only arguments
    virtual int functionWrapper(Node *n) {
      /* get useful attributes */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      ...
    
      /* create the wrapper object */
      Wrapper *wrapper = NewWrapper();
    
      /* create the functions wrappered name */
      String *wname = Swig_name_wrapper(iname);
    
      /* deal with overloading */
      ....
    
      /* write the wrapper function definition */
      Printv(wrapper->def, "RETURN_TYPE ", wname, "(ARGS) {", NIL);
    
      /* if any additional local variable needed, add them now */
      ...
    
      /* write the list of locals/arguments required */
      emit_args(type, parms, wrapper);
    
      /* check arguments */
      ...
    
      /* write typemaps(in) */
      ....
    
      /* write constraints */
      ....
    
      /* Emit the function call */
      emit_action(n, wrapper);
    
      /* return value if necessary  */
      ....
    
      /* write typemaps(out) */
      ....
    
      /* add cleanup code */
      ....
    
      /* Close the function(ok) */
      Printv(wrapper->code, "return ALL_OK;\n", NIL);
    
      /* add the failure cleanup code */
      ...
    
      /* Close the function(error) */
      Printv(wrapper->code, "return ERROR;\n", "}\n", NIL);
    
      /* final substititions if applicable */
      ...
    
      /* Dump the function out */
      Wrapper_print(wrapper, f_wrappers);
    
      /* tidy up */
      Delete(wname);
      DelWrapper(wrapper);
    
      return SWIG_OK;
    }
    

    Executing this code will produce wrappers which have our basic skeleton but without the typemaps, there is still work to do.

    41.10.8 Configuration files

    At the time of this writing, SWIG supports nearly twenty languages, which means that for continued sanity in maintaining the configuration files, the language modules need to follow some conventions. These are outlined here along with the admission that, yes it is ok to violate these conventions in minor ways, as long as you know where to apply the proper kludge to keep the overall system regular and running. Engineering is the art of compromise, see...

    Much of the maintenance regularity depends on choosing a suitable nickname for your language module (and then using it in a controlled way). Nicknames should be all lower case letters with an optional numeric suffix (no underscores, no dashes, no spaces). Some examples are: foo, bar, qux99.

    The numeric suffix variant, as in the last example, is somewhat tricky to work with because sometimes people expect to refer to the language without this number but sometimes that number is extremely relevant (especially when it corresponds to language implementation versions with incompatible interfaces). New language modules that unavoidably require a numeric suffix in their nickname should include that number in all uses, or be prepared to kludge.

    The nickname is used in four places:

    usagetransform
    "skip" tag(none)
    Examples/ subdir name(none)
    Examples/test-suite/ subdir name(none)

    As you can see, most usages are direct.

    configure.ac
    This file is processed by

    autoconf to generate the configure script. This is where you need to add shell script fragments and autoconf macros to detect the presence of whatever development support your language module requires, typically directories where headers and libraries can be found, and/or utility programs useful for integrating the generated wrapper code.

    Use the AC_ARG_WITH, AC_MSG_CHECKING, AC_SUBST macros and so forth (see other languages for examples). Avoid using the [ and ] character in shell script fragments. The variable names passed to AC_SUBST should begin with the nickname, entirely upcased.

    At the end of the new section is the place to put the aforementioned nickname kludges (should they be needed). See Perl5 for examples of what to do. [If this is still unclear after you've read the code, ping me and I'll expand on this further. --ttn]

    Makefile.in

    Some of the variables AC_SUBSTituted are essential to the support of your language module. Fashion these into a shell script "test" clause and assign that to a skip tag using "-z" and "-o":

    skip-qux99 = [ -z "@QUX99INCLUDE@" -o -z "@QUX99LIBS" ]

    This means if those vars should ever be empty, qux99 support should be considered absent and so it would be a good idea to skip actions that might rely on it.

    Here is where you may also define an alias (but then you'll need to kludge --- don't do this):

    skip-qux = $(skip-qux99)

    Lastly, you need to modify each of check-aliveness, check-examples, check-test-suite and lib-languages (var). Use the nickname for these, not the alias. Note that you can do this even before you have any tests or examples set up; the Makefile rules do some sanity checking and skip around these kinds of problems.

    Examples/Makefile.in
    Nothing special here; see comments at top the of this file and look to the existing languages for examples.
    Examples/qux99/check.list
    Do cp ../python/check.list . and modify to taste. One subdir per line.
    Lib/qux99/extra-install.list
    If you add your language to the top-level Makefile.in var lib-languages, then make install will install all *.i and *.swg files from the language-specific subdirectory of Lib. Use (optional) file extra-install.list in that directory to name additional files to install (see ruby for example).
    Source/Modules/Makefile.am
    Add appropriate files to this Automake file. That's it!

    When you have modified these files, please make sure that the new language module is completely ignored if it is not installed and detected on a box, that is, make check-examples and make check-test-suite politely displays the ignoring language message.

    41.10.9 Runtime support

    Discuss the kinds of functions typically needed for SWIG runtime support (e.g. SWIG_ConvertPtr() and SWIG_NewPointerObj() ) and the names of the SWIG files that implement those functions.

    41.10.10 Standard library files

    The standard library files that most languages supply keeps growing as SWIG matures. The following are the minimum that are usually supported:

    • typemaps.i
    • std_string.i
    • std_vector.i
    • stl.i

    Please copy these and modify for any new language.

    41.10.11 User examples

    Each of the language modules provides one or more examples. These examples are used to demonstrate different features of the language module to SWIG end-users, but you'll find that they're useful during development and testing of your language module as well. You can use examples from the existing SWIG language modules for inspiration.

    Each example is self-contained and consists of (at least) a Makefile, a SWIG interface file for the example module, and a 'runme' script that demonstrates the functionality for that module. All of these files are stored in the same subdirectory under the Examples/[lang] directory. There are two classic examples which should be the first to convert to a new language module. These are the "simple" C example and the "class" C++ example. These can be found, for example for Python, in Examples/python/simple and Examples/python/class.

    By default, all of the examples are built and run when the user types make check. To ensure that your examples are automatically run during this process, see the section on configuration files.

    41.10.12 Test driven development and the test-suite

    A test driven development approach is central to the improvement and development of SWIG. Most modifications to SWIG are accompanied by additional regression tests and checking all tests to ensure that no regressions have been introduced.

    The regression testing is carried out by the SWIG test-suite. The test-suite consists of numerous testcase interface files in the Examples/test-suite directory as well as target language specific runtime tests in the Examples/test-suite/[lang] directory. When a testcase is run, it will execute the following steps for each testcase:

    1. Execute SWIG passing it the testcase interface file.
    2. Compile the resulting generated C/C++ code with either the C or C++ compiler into object files.
    3. Link the object files into a dynamic library (dll/shared object).
    4. Compile any generated and any runtime test target language code with the target language compiler, if the target language supports compilation. This step thus does not apply to the interpreted languages.
    5. Execute a runtime test if one exists.

    For example, the ret_by_value testcase consists of two components. The first component is the Examples/test-suite/ret_by_value.i interface file. The name of the SWIG module must always be the name of the testcase, so the ret_by_value.i interface file thus begins with:

    %module ret_by_value
    

    The testcase code will then follow the module declaration, usually within a %inline %{ ... %} section for the majority of the tests.

    The second component is the optional runtime tests. Any runtime tests are named using the following convention: [testcase]_runme.[ext], where [testcase] is the testcase name and [ext] is the normal extension for the target language file. In this case, the Java and Python target languages implement a runtime test, so their files are respectively, Examples/test-suite/java/ret_by_value_runme.java and Examples/test-suite/python/ret_by_value_runme.py.

    The goal of the test-suite is to test as much as possible in a silent manner. This way any SWIG or compiler errors or warnings are easily visible. Should there be any warnings, changes must be made to either fix them (preferably) or suppress them. Compilation or runtime errors result in a testcase failure and will be immediately visible. It is therefore essential that the runtime tests are written in a manner that displays nothing to stdout/stderr on success but error/exception out with an error message on stderr on failure.

    41.10.12.1 Running the test-suite

    In order for the test-suite to work for a particular target language, the language must be correctly detected and configured during the configure stage so that the correct Makefiles are generated. Most development occurs on Linux, so usually it is a matter of installing the development packages for the target language and simply configuring as outlined earlier.

    If when running the test-suite commands that follow, you get a message that the test was skipped, it indicates that the configure stage is missing information in order to compile and run everything for that language.

    The test-suite can be run in a number of ways. The first group of commands are for running multiple testcases in one run and should be executed in the top level directory. To run the entire test-suite (can take a long time):

    make -k check-test-suite
    

    To run the test-suite just for target language [lang], replace [lang] with one of csharp, java, perl5, python, ruby, tcl etc:

    make check-[lang]-test-suite
    

    Note that if a runtime test is available, a message "(with run test)" is displayed when run. For example:

    $ make check-python-test-suite
    checking python test-suite
    checking python testcase argcargvtest (with run test)
    checking python testcase python_autodoc
    checking python testcase python_append (with run test)
    checking python testcase callback (with run test)
    

    The files generated on a previous run can be deleted using the clean targets, either the whole test-suite or for a particular language:

    make clean-test-suite
    make clean-[lang]-test-suite
    

    The test-suite can be run in a partialcheck mode where just SWIG is executed, that is, the compile, link and running of the testcases is not performed. Note that the partialcheck does not require the target language to be correctly configured and detected and unlike the other test-suite make targets, is never skipped. Once again, either all the languages can be executed or just a chosen language:

    make partialcheck-test-suite
    make partialcheck-[lang]-test-suite
    

    If your computer has more than one CPU, you are strongly advised to use parallel make to speed up the execution speed. This can be done with any of the make targets that execute more than one testcase. For example, a dual core processor can efficiently use 2 parallel jobs:

    make -j2 check-test-suite
    make -j2 check-python-test-suite
    make -j2 partialcheck-java-test-suite
    

    The second group of commands are for running individual testcases and should be executed in the appropriate target language directory, Examples/test-suite/[lang]. Testcases can contain either C or C++ code and when one is written, a decision must be made as to which of these input languages is to be used. Replace [testcase] in the commands below with the name of the testcase.

    For a C language testcase, add the testcase under the C_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].ctest
    

    For a C++ language testcase, add the testcase under the CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].cpptest
    

    A third category of tests are C++ language testcases testing multiple modules (the %import directive). These require more than one shared library (dll/shared object) to be built and so are separated out from the normal C++ testcases. Add the testcase under the MULTI_CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].multicpptest
    

    To delete the generated files, execute:

    make -s [testcase].clean
    

    If you would like to see the exact commands being executed, drop the -s option:

    make [testcase].ctest
    make [testcase].cpptest
    make [testcase].multicpptest
    

    Some real examples of each:

    make -s ret_by_value.clean
    make -s ret_by_value.ctest
    make -s bools.cpptest
    make -s imports.multicpptest
    

    Advanced usage of the test-suite facilitates running tools on some of the five stages. The make variables SWIGTOOL and RUNTOOL are used to specify a tool to respectively, invoke SWIG and the execution of the runtime test. You are advised to view the Examples/test-suite/common.mk file for details but for a short summary, the classic usage is to use Valgrind for memory checking. For example, checking for memory leaks when running the runtime test in the target language interpreter:

    make ret_by_value.ctest RUNTOOL="valgrind --leak-check=full"
    

    This will probably make more sense if you look at the output of the above as it will show the exact commands being executed. SWIG can be analyzed for bad memory accesses using:

    make ret_by_value.ctest SWIGTOOL="valgrind --tool=memcheck --trace-children=yes"
    

    A debugger can also be invoked easily on an individual test, for example gdb:

    make ret_by_value.ctest RUNTOOL="gdb --args"
    

    SWIG reads the SWIG_FEATURES environment variable to obtain options in addition to those passed on the command line. This is particularly useful as the entire test-suite or a particular testcase can be run customized by using additional arguments, for example the -O optimization flag can be added in, as shown below for the bash shell:

    env SWIG_FEATURES=-O make check-python-test-suite
    

    The syntax for setting environment variables varies from one shell to the next, but it also works as shown in the example below, where some typemap debugging is added in:

    make ret_by_value.ctest SWIG_FEATURES="-debug-tmsearch"
    

    There is also a special 'errors' test-suite which is a set of regression tests checking SWIG warning and error messages. It can be run in the same way as the other language test-suites, replacing [lang] with errors, such as make check-errors-test-suite. The test cases used and the way it works is described in Examples/test-suite/errors/Makefile.in.

    41.10.13 Documentation

    Don't forget to write end-user documentation for your language module. Currently, each language module has a dedicated chapter You shouldn't rehash things that are already covered in sufficient detail in the SWIG Basics and SWIG and C++ chapters. There is no fixed format for what, exactly, you should document about your language module, but you'll obviously want to cover issues that are unique to your language.

    Some topics that you'll want to be sure to address include:

    • Command line options unique to your language module.
    • Non-obvious mappings between C/C++ and target language concepts. For example, if your target language provides a single floating point type, it should be no big surprise to find that C/C++ float and double types are mapped to it. On the other hand, if your target language doesn't provide support for "classes" or something similar, you'd want to discuss how C++ classes are handled.
    • How to compile the SWIG-generated wrapper code into shared libraries that can actually be used. For some languages, there are well-defined procedures for doing this, but for others it's an ad hoc process. Provide as much detail as appropriate, and links to other resources if available.

    41.10.14 Prerequisites for adding a new language module to the SWIG distribution

    If you wish for a new language module to be distributed with SWIG, which we encourage for all popular languages, there are a few requirements. While we appreciate that getting all aspects of a new language working won't happen at the outset, there are a set of minimum requirements before a module can be committed into the official Github repository for distribution with future versions of SWIG. The following are really a summary of this whole section with details being outlined earlier on.

    1. Demonstrate basic C code working by porting the "simple" example including a runtime test, see for example Examples/python/simple .
    2. Demonstrate basic C++ code working by porting the "class" example including a runtime test, see for example Examples/python/class .
    3. Modify configure.ac, Makefile.in and Examples/Makefile.in to run these examples. Please make sure that if the new language is not installed properly on a box, make -k check should still work by skipping the tests and examples for the new language module.
    4. Get the test-suite running for the new language (make check-[lang]-test-suite). While the test-suite tests many corner cases, we'd expect the majority of it to work by compiling the generated code correctly as most of the corner cases are covered in the SWIG core. Get at least one C and one C++ runtime test running in the test-suite.
    5. Provide a chapter in the html documentation on the basics of using the language module.
    6. Ensure your source code is formatted according to the coding style guidelines.
    7. Finally, email the SWIG developers with a patch and a demonstration of commitment to maintaining the language module, certainly in the short term and ideally long term.

    Once accepted into the official Git repository, development efforts should concentrate on getting the entire test-suite to work with plenty of runtime tests. Runtime tests should be for existing testcases and new test cases should be added should there be an area not already covered by the existing tests.

    41.10.15 Coding style guidelines

    The coding guidelines for the C/C++ source code are pretty much K&R C style. The style can be inferred from the existing code base and is largely dictated by the indent code beautifier tool set to K&R style. The code can formatted using the make targets in the Source directory. Below is an example of how to format the emit.cxx file:

    $ cd Source
    $ make beautify-file INDENTFILE=Modules/emit.cxx
    

    Of particular note is indentation is set to 2 spaces and a tab is used instead of 8 spaces. The generated C/C++ code should also follow this style as close as possible. However, tabs should be avoided as unlike the SWIG developers, users will never have consistent tab settings.

    41.11 Debugging Options

    There are various command line options which can aid debugging a SWIG interface as well as debugging the development of a language module. These are as follows:

    -debug-classes    - Display information about the classes found in the interface
    -debug-module <n> - Display module parse tree at stages 1-4, <n> is a csv list of stages
    -debug-symtabs    - Display symbol tables information
    -debug-symbols    - Display target language symbols in the symbol tables
    -debug-csymbols   - Display C symbols in the symbol tables
    -debug-lsymbols   - Display target language layer symbols
    -debug-tags       - Display information about the tags found in the interface
    -debug-template   - Display information for debugging templates
    -debug-top <n>    - Display entire parse tree at stages 1-4, <n> is a csv list of stages
    -debug-typedef    - Display information about the types and typedefs in the interface
    -debug-typemap    - Display information for debugging typemaps
    -debug-tmsearch   - Display typemap search debugging information
    -debug-tmused     - Display typemaps used debugging information
    

    The complete list of command line options for SWIG are available by running swig -help.

    41.12 Guide to parse tree nodes

    This section describes the different parse tree nodes and their attributes.

    cdecl

    Describes general C declarations including variables, functions, and typedefs. A declaration is parsed as "storage T D" where storage is a storage class, T is a base type, and D is a declarator.

    "name"          - Declarator name
    "type"          - Base type T
    "decl"          - Declarator type (abstract)
    "storage"       - Storage class (static, extern, typedef, etc.)
    "parms"         - Function parameters (if a function)
    "code"          - Function body code (if supplied)
    "value"         - Default value (if supplied)
    

    constructor

    C++ constructor declaration.

    "name"          - Name of constructor
    "parms"         - Parameters
    "decl"          - Declarator (function with parameters)
    "code"          - Function body code (if any)
    "feature:new"   - Set to indicate return of new object.
    

    destructor

    C++ destructor declaration.

    "name"          - Name of destructor
    "code"          - Function body code (if any)
    "storage"       - Storage class (set if virtual)
    "value"         - Default value (set if pure virtual).
    

    access

    C++ access change.

    "kind"          - public, protected, private
    

    constant

    Constant created by %constant or #define.

    "name"          - Name of constant.
    "type"          - Base type.
    "value"         - Value.
    "storage"       - Set to %constant
    "feature:immutable" - Set to indicate read-only
    

    class

    C++ class definition or C structure definition.

    "name"          - Name of the class.
    "kind"          - Class kind ("struct", "union", "class")
    "symtab"        - Enclosing symbol table.
    "tdname"        - Typedef name. Use for typedef struct { ... } A.
    "abstract"      - Set if class has pure virtual methods.
    "baselist"      - List of base class names.
    "storage"       - Storage class (if any)
    "unnamed"       - Set if class is unnamed.
    

    enum

    Enumeration.

    "name"          - Name of the enum (if supplied).
    "storage"       - Storage class (if any)
    "tdname"        - Typedef name (typedef enum { ... } name).
    "unnamed"       - Set if enum is unnamed.
    

    enumitem

    Enumeration value.

    "name"          - Name of the enum value.
    "type"          - Type (integer or char)
    "value"         - Enum value (if given)
    "feature:immutable" - Set to indicate read-only
    

    namespace

    C++ namespace.

    "name"          - Name of the namespace.
    "symtab"        - Symbol table for enclosed scope.
    "unnamed"       - Set if unnamed namespace
    "alias"         - Alias name. Set for namespace A = B;
    

    using

    C++ using directive.

    "name"          - Name of the object being referred to.
    "uname"         - Qualified name actually given to using.
    "node"          - Node being referenced.
    "namespace"     - Namespace name being reference (using namespace name)
    

    classforward

    A forward C++ class declaration.

    "name"          - Name of the class.
    "kind"          - Class kind ("union", "struct", "class")
    

    insert

    Code insertion directive. For example, %{ ... %} or %insert(section).

    "code"          - Inserted code
    "section"       - Section name ("header", "wrapper", etc.)
    

    top

    Top of the parse tree.

    "module"        - Module name
    

    extend

    %extend directive.

    "name"          - Module name
    "symtab"        - Symbol table of enclosed scope.
    

    apply

    %apply pattern { patternlist }.

    "pattern"       - Source pattern.
    "symtab"        - Symbol table of enclosed scope.
    

    clear

    %clear patternlist;

    "firstChild"    - Patterns to clear
    

    include

    %include directive.

    "name"         - Filename
    "firstChild"   - Children
    

    import

    %import directive.

    "name"         - Filename
    "firstChild"   - Children
    

    module

    %module directive.

    "name"         - Name of the module
    

    typemap

    %typemap directive.

    "method"       - Typemap method name.
    "code"         - Typemap code.
    "kwargs"       - Keyword arguments (if any)
    "firstChild"   - Typemap patterns
    

    typemapcopy

    %typemap directive with copy.

    "method"       - Typemap method name.
    "pattern"      - Typemap source pattern.
    "firstChild"   - Typemap patterns
    

    typemapitem

    %typemap pattern. Used with %apply, %clear, %typemap.

    "pattern"      - Typemap pattern (a parameter list)
    "parms"        - Typemap parameters.
    

    types

    %types directive.

    "parms"        - List of parameter types.
    "convcode"     - Code which replaces the default casting / conversion code
    

    extern

    extern "X" { ... } declaration.

    "name"       - Name "C", "Fortran", etc.
    

    41.13 Further Development Information

    There is further documentation available on the internals of SWIG, API documentation and debugging information. This is shipped with SWIG in the Doc/Devel directory.

    swig-3.0.12/Doc/Manual/Introduction.html0000664000175000017500000004232613042756671017741 0ustar williamwilliam Introduction

    2 Introduction

    2.1 What is SWIG?

    SWIG is a software development tool that simplifies the task of interfacing different languages to C and C++ programs. In a nutshell, SWIG is a compiler that takes C/C++ declarations and creates the wrappers needed to access those declarations from other languages including Perl, Python, Tcl, Ruby, Guile, and Java. SWIG normally requires no modifications to existing code and can often be used to build a usable interface in only a few minutes. Possible applications of SWIG include:

    • Building interpreted interfaces to existing C programs.
    • Rapid prototyping and application development.
    • Interactive debugging.
    • Reengineering or refactoring of legacy software into scripting language components.
    • Making a graphical user interface (using Tk for example).
    • Testing of C libraries and programs (using scripts).
    • Building high performance C modules for scripting languages.
    • Making C programming more enjoyable (or tolerable depending on your point of view).
    • Impressing your friends.
    • Obtaining vast sums of research funding (although obviously not applicable to the author).

    SWIG was originally designed to make it extremely easy for scientists and engineers to build extensible scientific software without having to get a degree in software engineering. Because of this, the use of SWIG tends to be somewhat informal and ad-hoc (e.g., SWIG does not require users to provide formal interface specifications as you would find in a dedicated IDL compiler). Although this style of development isn't appropriate for every project, it is particularly well suited to software development in the small; especially the research and development work that is commonly found in scientific and engineering projects. However, nowadays SWIG is known to be used in many large open source and commercial projects.

    2.2 Why use SWIG?

    As stated in the previous section, the primary purpose of SWIG is to simplify the task of integrating C/C++ with other programming languages. However, why would anyone want to do that? To answer that question, it is useful to list a few strengths of C/C++ programming:

    • Excellent support for writing programming libraries.
    • High performance (number crunching, data processing, graphics, etc.).
    • Systems programming and systems integration.
    • Large user community and software base.

    Next, let's list a few problems with C/C++ programming

    • Writing a user interface is rather painful (i.e., consider programming with MFC, X11, GTK, or any number of other libraries).
    • Testing is time consuming (the compile/debug cycle).
    • Not easy to reconfigure or customize without recompilation.
    • Modularization can be tricky.
    • Security concerns (buffer overflows for instance).

    To address these limitations, many programmers have arrived at the conclusion that it is much easier to use different programming languages for different tasks. For instance, writing a graphical user interface may be significantly easier in a scripting language like Python or Tcl (consider the reasons why millions of programmers have used languages like Visual Basic if you need more proof). An interactive interpreter might also serve as a useful debugging and testing tool. Other languages like Java might greatly simplify the task of writing distributed computing software. The key point is that different programming languages offer different strengths and weaknesses. Moreover, it is extremely unlikely that any programming is ever going to be perfect. Therefore, by combining languages together, you can utilize the best features of each language and greatly simplify certain aspects of software development.

    From the standpoint of C/C++, a lot of people use SWIG because they want to break out of the traditional monolithic C programming model which usually results in programs that resemble this:

    • A collection of functions and variables that do something useful.
    • A main() program that starts everything.
    • A horrible collection of hacks that form some kind of user interface (but which no-one really wants to touch).

    Instead of going down that route, incorporating C/C++ into a higher level language often results in a more modular design, less code, better flexibility, and increased programmer productivity.

    SWIG tries to make the problem of C/C++ integration as painless as possible. This allows you to focus on the underlying C program and using the high-level language interface, but not the tedious and complex chore of making the two languages talk to each other. At the same time, SWIG recognizes that all applications are different. Therefore, it provides a wide variety of customization features that let you change almost every aspect of the language bindings. This is the main reason why SWIG has such a large user manual ;-).

    2.3 A SWIG example

    The best way to illustrate SWIG is with a simple example. Consider the following C code:

    /* File : example.c */
    
    double  My_variable  = 3.0;
    
    /* Compute factorial of n */
    int fact(int n) {
      if (n <= 1)
        return 1;
      else
        return n*fact(n-1);
    }
    
    /* Compute n mod m */
    int my_mod(int n, int m) {
      return(n % m);
    }
    

    Suppose that you wanted to access these functions and the global variable My_variable from Tcl. You start by making a SWIG interface file as shown below (by convention, these files carry a .i suffix) :

    2.3.1 SWIG interface file

    /* File : example.i */
    %module example
    %{
    /* Put headers and other declarations here */
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    %}
    
    extern double My_variable;
    extern int    fact(int);
    extern int    my_mod(int n, int m);
    

    The interface file contains ANSI C function prototypes and variable declarations. The %module directive defines the name of the module that will be created by SWIG. The %{ %} block provides a location for inserting additional code, such as C header files or additional C declarations, into the generated C wrapper code.

    2.3.2 The swig command

    SWIG is invoked using the swig command. We can use this to build a Tcl module (under Linux) as follows :

    unix > swig -tcl example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include
    unix > gcc -shared example.o example_wrap.o -o example.so
    unix > tclsh
    % load ./example.so
    % fact 4
    24
    % my_mod 23 7
    2
    % expr $My_variable + 4.5
    7.5
    %
    

    The swig command produced a new file called example_wrap.c that should be compiled along with the example.c file. Most operating systems and scripting languages now support dynamic loading of modules. In our example, our Tcl module has been compiled into a shared library that can be loaded into Tcl. When loaded, Tcl can now access the functions and variables declared in the SWIG interface. A look at the file example_wrap.c reveals a hideous mess. However, you almost never need to worry about it.

    2.3.3 Building a Perl5 module

    Now, let's turn these functions into a Perl5 module. Without making any changes type the following (shown for Solaris):

    unix > swig -perl5 example.i
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so # This is for Solaris
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    unix >
    

    2.3.4 Building a Python module

    Finally, let's build a module for Python (shown for Irix).

    unix > swig -python example.i
    unix > gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.0
    unix > gcc -shared example.o example_wrap.o -o _example.so
    unix > python
    Python 2.0 (#6, Feb 21 2001, 13:29:45)
    [GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
    Type "copyright", "credits" or "license" for more information.     
    >>> import example
    >>> example.fact(4)
    24
    >>> example.my_mod(23, 7)
    2
    >>> example.cvar.My_variable + 4.5
    7.5
    

    2.3.5 Shortcuts

    To the truly lazy programmer, one may wonder why we needed the extra interface file at all. As it turns out, you can often do without it. For example, you could also build a Perl5 module by just running SWIG on the C header file and specifying a module name as follows

    unix > swig -perl5 -module example example.h
    unix > gcc -c example.c example_wrap.c \
            -I/usr/local/lib/perl5/sun4-solaris/5.003/CORE
    unix > ld -G example.o example_wrap.o -o example.so
    unix > perl5.003
    use example;
    print example::fact(4), "\n";
    print example::my_mod(23, 7), "\n";
    print $example::My_variable + 4.5, "\n";
    <ctrl-d>
    24
    2
    7.5
    

    2.4 Supported C/C++ language features

    A primary goal of the SWIG project is to make the language binding process extremely easy. Although a few simple examples have been shown, SWIG is quite capable in supporting most of C++. Some of the major features include:

    • Full C99 preprocessing.
    • All ANSI C and C++ datatypes.
    • Functions, variables, and constants.
    • Classes.
    • Single and multiple inheritance.
    • Overloaded functions and methods.
    • Overloaded operators.
    • C++ templates (including member templates, specialization, and partial specialization).
    • Namespaces.
    • Variable length arguments.
    • C++ smart pointers.

    Most of C++11 is also supported. Details are in the C++11 section.

    It is important to stress that SWIG is not a simplistic C++ lexing tool like several apparently similar wrapper generation tools. SWIG not only parses C++, it implements the full C++ type system and it is able to understand C++ semantics. SWIG generates its wrappers with full knowledge of this information. As a result, you will find SWIG to be just as capable of dealing with nasty corner cases as it is in wrapping simple C++ code. In fact, SWIG is able to handle C++ code that stresses the very limits of many C++ compilers.

    2.5 Non-intrusive interface building

    When used as intended, SWIG requires minimal (if any) modification to existing C or C++ code. This makes SWIG extremely easy to use with existing packages and promotes software reuse and modularity. By making the C/C++ code independent of the high level interface, you can change the interface and reuse the code in other applications. It is also possible to support different types of interfaces depending on the application.

    2.6 Incorporating SWIG into a build system

    SWIG is a command line tool and as such can be incorporated into any build system that supports invoking external tools/compilers. SWIG is most commonly invoked from within a Makefile, but is also known to be invoked from popular IDEs such as Microsoft Visual Studio.

    If you are using the GNU Autotools (Autoconf/ Automake/ Libtool) to configure SWIG use in your project, the SWIG Autoconf macros can be used. The primary macro is ax_pkg_swig, see http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig. The ax_python_devel macro is also helpful for generating Python extensions. See the Autoconf Archive for further information on this and other Autoconf macros.

    There is growing support for SWIG in some build tools, for example CMake is a cross-platform, open-source build manager with built in support for SWIG. CMake can detect the SWIG executable and many of the target language libraries for linking against. CMake knows how to build shared libraries and loadable modules on many different operating systems. This allows easy cross platform SWIG development. It can also generate the custom commands necessary for driving SWIG from IDEs and makefiles. All of this can be done from a single cross platform input file. The following example is a CMake input file for creating a python wrapper for the SWIG interface file, example.i:

    
    # This is a CMake example for Python
    
    FIND_PACKAGE(SWIG REQUIRED)
    INCLUDE(${SWIG_USE_FILE})
    
    FIND_PACKAGE(PythonLibs)
    INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
    
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
    
    SET(CMAKE_SWIG_FLAGS "")
    
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES CPLUSPLUS ON)
    SET_SOURCE_FILES_PROPERTIES(example.i PROPERTIES SWIG_FLAGS "-includeall")
    SWIG_ADD_MODULE(example python example.i example.cxx)
    SWIG_LINK_LIBRARIES(example ${PYTHON_LIBRARIES})
    
    

    The above example will generate native build files such as makefiles, nmake files and Visual Studio projects which will invoke SWIG and compile the generated C++ files into _example.so (UNIX) or _example.pyd (Windows). For other target languages on Windows a dll, instead of a .pyd file, is usually generated.

    2.7 Hands off code generation

    SWIG is designed to produce working code that needs no hand-modification (in fact, if you look at the output, you probably won't want to modify it). You should think of your target language interface being defined entirely by the input to SWIG, not the resulting output file. While this approach may limit flexibility for hard-core hackers, it allows others to forget about the low-level implementation details.

    2.8 SWIG and freedom

    No, this isn't a special section on the sorry state of world politics. However, it may be useful to know that SWIG was written with a certain "philosophy" about programming---namely that programmers are smart and that tools should just stay out of their way. Because of that, you will find that SWIG is extremely permissive in what it lets you get away with. In fact, you can use SWIG to go well beyond "shooting yourself in the foot" if dangerous programming is your goal. On the other hand, this kind of freedom may be exactly what is needed to work with complicated and unusual C/C++ applications.

    Ironically, the freedom that SWIG provides is countered by an extremely conservative approach to code generation. At its core, SWIG tries to distill even the most advanced C++ code down to a small well-defined set of interface building techniques based on ANSI C programming. Because of this, you will find that SWIG interfaces can be easily compiled by virtually every C/C++ compiler and that they can be used on any platform. Again, this is an important part of staying out of the programmer's way----the last thing any developer wants to do is to spend their time debugging the output of a tool that relies on non-portable or unreliable programming features. Dependencies are often a source of incompatibilities and problems and so additional third party libraries are not used in the generated code. SWIG will also generally avoid generating code that introduces a dependency on the C++ Standard Template Library (STL). SWIG will generate code that depends on the C libraries though.

    swig-3.0.12/Doc/Manual/SWIG.html0000664000175000017500000032402213042756671016025 0ustar williamwilliam SWIG Basics

    5 SWIG Basics

    This chapter describes the basic operation of SWIG, the structure of its input files, and how it handles standard ANSI C declarations. C++ support is described in the next chapter. However, C++ programmers should still read this chapter to understand the basics. Specific details about each target language are described in later chapters.

    5.1 Running SWIG

    To run SWIG, use the swig command with options and a filename like this:

    swig [ options ] filename
    

    where filename is a SWIG interface file or a C/C++ header file. Below is a subset of options that can be used. Additional options are also defined for each target language. A full list can be obtained by typing swig -help or swig -<lang> -help for language <lang> specific options.

    -allegrocl            Generate ALLEGROCL wrappers
    -chicken              Generate CHICKEN wrappers
    -clisp                Generate CLISP wrappers
    -cffi                 Generate CFFI wrappers
    -csharp               Generate C# wrappers
    -d                    Generate D wrappers
    -go                   Generate Go wrappers
    -guile                Generate Guile wrappers
    -java                 Generate Java wrappers
    -javascript           Generate Javascript wrappers
    -lua                  Generate Lua wrappers
    -modula3              Generate Modula 3 wrappers
    -mzscheme             Generate Mzscheme wrappers
    -ocaml                Generate Ocaml wrappers
    -octave               Generate Octave wrappers
    -perl                 Generate Perl wrappers
    -php5                 Generate PHP5 wrappers
    -php7                 Generate PHP7 wrappers
    -pike                 Generate Pike wrappers
    -python               Generate Python wrappers
    -r                    Generate R (aka GNU S) wrappers
    -ruby                 Generate Ruby wrappers
    -scilab               Generate Scilab wrappers
    -sexp                 Generate Lisp S-Expressions wrappers
    -tcl                  Generate Tcl wrappers
    -uffi                 Generate Common Lisp / UFFI wrappers
    -xml                  Generate XML wrappers
    
    -c++                  Enable C++ processing
    -cppext ext           Change file extension of C++ generated files to ext
                          (default is cxx, except for PHP5 which uses cpp)
    -Dsymbol              Define a preprocessor symbol
    -Fmicrosoft           Display error/warning messages in Microsoft format
    -Fstandard            Display error/warning messages in commonly used format
    -help                 Display all options
    -Idir                 Add a directory to the file include path
    -lifile               Include SWIG library file <ifile>
    -module name          Set the name of the SWIG module
    -o outfile            Set name of C/C++ output file to <outfile>
    -oh headfile          Set name of C++ output header file for directors to <headfile>
    -outcurrentdir        Set default output dir to current dir instead of input file's path
    -outdir dir           Set language specific files output directory
    -pcreversion          Display PCRE version information
    -swiglib              Report location of SWIG library and exit
    -version              Display SWIG version number
    
    

    5.1.1 Input format

    As input, SWIG expects a file containing ANSI C/C++ declarations and special SWIG directives. More often than not, this is a special SWIG interface file which is usually denoted with a special .i or .swg suffix. In certain cases, SWIG can be used directly on raw header files or source files. However, this is not the most typical case and there are several reasons why you might not want to do this (described later).

    The most common format of a SWIG interface is as follows:

    %module mymodule 
    %{
    #include "myheader.h"
    %}
    // Now list ANSI C/C++ declarations
    int foo;
    int bar(int x);
    ...
    

    The module name is supplied using the special %module directive. Modules are described further in the Modules Introduction section.

    Everything in the %{ ... %} block is simply copied verbatim to the resulting wrapper file created by SWIG. This section is almost always used to include header files and other declarations that are required to make the generated wrapper code compile. It is important to emphasize that just because you include a declaration in a SWIG input file, that declaration does not automatically appear in the generated wrapper code---therefore you need to make sure you include the proper header files in the %{ ... %} section. It should be noted that the text enclosed in %{ ... %} is not parsed or interpreted by SWIG. The %{...%} syntax and semantics in SWIG is analogous to that of the declarations section used in input files to parser generation tools such as yacc or bison.

    5.1.2 SWIG Output

    The output of SWIG is a C/C++ file that contains all of the wrapper code needed to build an extension module. SWIG may generate some additional files depending on the target language. By default, an input file with the name file.i is transformed into a file file_wrap.c or file_wrap.cxx (depending on whether or not the -c++ option has been used). The name of the output C/C++ file can be changed using the -o option. In certain cases, file suffixes are used by the compiler to determine the source language (C, C++, etc.). Therefore, you have to use the -o option to change the suffix of the SWIG-generated wrapper file if you want something different than the default. For example:

    $ swig -c++ -python -o example_wrap.cpp example.i
    

    The C/C++ output file created by SWIG often contains everything that is needed to construct an extension module for the target scripting language. SWIG is not a stub compiler nor is it usually necessary to edit the output file (and if you look at the output, you probably won't want to). To build the final extension module, the SWIG output file is compiled and linked with the rest of your C/C++ program to create a shared library.

    For many target languages SWIG will also generate proxy class files in the target language. The default output directory for these language specific files is the same directory as the generated C/C++ file. This can be modified using the -outdir option. For example:

    $ swig -c++ -python -outdir pyfiles -o cppfiles/example_wrap.cpp example.i
    

    If the directories cppfiles and pyfiles exist, the following will be generated:

    cppfiles/example_wrap.cpp
    pyfiles/example.py
    

    If the -outcurrentdir option is used (without -o) then SWIG behaves like a typical C/C++ compiler and the default output directory is then the current directory. Without this option the default output directory is the path to the input file. If -o and -outcurrentdir are used together, -outcurrentdir is effectively ignored as the output directory for the language files is the same directory as the generated C/C++ file if not overridden with -outdir.

    5.1.3 Comments

    C and C++ style comments may appear anywhere in interface files. In previous versions of SWIG, comments were used to generate documentation files. However, this feature is currently under repair and will reappear in a later SWIG release.

    5.1.4 C Preprocessor

    Like C, SWIG preprocesses all input files through an enhanced version of the C preprocessor. All standard preprocessor features are supported including file inclusion, conditional compilation and macros. However, #include statements are ignored unless the -includeall command line option has been supplied. The reason for disabling includes is that SWIG is sometimes used to process raw C header files. In this case, you usually only want the extension module to include functions in the supplied header file rather than everything that might be included by that header file (i.e., system headers, C library functions, etc.).

    It should also be noted that the SWIG preprocessor skips all text enclosed inside a %{...%} block. In addition, the preprocessor includes a number of macro handling enhancements that make it more powerful than the normal C preprocessor. These extensions are described in the "Preprocessor" chapter.

    5.1.5 SWIG Directives

    Most of SWIG's operation is controlled by special directives that are always preceded by a "%" to distinguish them from normal C declarations. These directives are used to give SWIG hints or to alter SWIG's parsing behavior in some manner.

    Since SWIG directives are not legal C syntax, it is generally not possible to include them in header files. However, SWIG directives can be included in C header files using conditional compilation like this:

    /* header.h  --- Some header file */
    
    /* SWIG directives -- only seen if SWIG is running */ 
    #ifdef SWIG
    %module foo
    #endif
    

    SWIG is a special preprocessing symbol defined by SWIG when it is parsing an input file.

    5.1.6 Parser Limitations

    Although SWIG can parse most C/C++ declarations, it does not provide a complete C/C++ parser implementation. Most of these limitations pertain to very complicated type declarations and certain advanced C++ features. Specifically, the following features are not currently supported:

    • Non-conventional type declarations. For example, SWIG does not support declarations such as the following (even though this is legal C):

      /* Non-conventional placement of storage specifier (extern) */
      const int extern Number;
      
      /* Extra declarator grouping */
      Matrix (foo);    // A global variable
      
      /* Extra declarator grouping in parameters */
      void bar(Spam (Grok)(Doh));
      
      

      In practice, few (if any) C programmers actually write code like this since this style is never featured in programming books. However, if you're feeling particularly obfuscated, you can certainly break SWIG (although why would you want to?).

    • Running SWIG on C++ source files (the code in a .C, .cpp or .cxx file) is not recommended. The usual approach is to feed SWIG header files for parsing C++ definitions and declarations. The main reason is if SWIG parses a scoped definition or declaration (as is normal for C++ source files), it is ignored, unless a declaration for the symbol was parsed earlier. For example

      /* bar not wrapped unless foo has been defined and 
         the declaration of bar within foo has already been parsed */
      int foo::bar(int) {
          ... whatever ...
      }
      
    • Certain advanced features of C++ such as nested classes are not yet fully supported. Please see the C++ Nested classes section for more information.

    In the event of a parsing error, conditional compilation can be used to skip offending code. For example:

    #ifndef SWIG
    ... some bad declarations ...
    #endif
    

    Alternatively, you can just delete the offending code from the interface file.

    One of the reasons why SWIG does not provide a full C++ parser implementation is that it has been designed to work with incomplete specifications and to be very permissive in its handling of C/C++ datatypes (e.g., SWIG can generate interfaces even when there are missing class declarations or opaque datatypes). Unfortunately, this approach makes it extremely difficult to implement certain parts of a C/C++ parser as most compilers use type information to assist in the parsing of more complex declarations (for the truly curious, the primary complication in the implementation is that the SWIG parser does not utilize a separate typedef-name terminal symbol as described on p. 234 of K&R).

    5.2 Wrapping Simple C Declarations

    SWIG wraps simple C declarations by creating an interface that closely matches the way in which the declarations would be used in a C program. For example, consider the following interface file:

    %module example
    
    %inline %{
    extern double sin(double x);
    extern int strcmp(const char *, const char *);
    extern int Foo;
    %}
    #define STATUS 50
    #define VERSION "1.1"
    

    In this file, there are two functions sin() and strcmp(), a global variable Foo, and two constants STATUS and VERSION. When SWIG creates an extension module, these declarations are accessible as scripting language functions, variables, and constants respectively. For example, in Tcl:

    % sin 3
    5.2335956
    % strcmp Dave Mike
    -1
    % puts $Foo
    42
    % puts $STATUS
    50
    % puts $VERSION
    1.1
    

    Or in Python:

    >>> example.sin(3)
    5.2335956
    >>> example.strcmp('Dave', 'Mike')
    -1
    >>> print example.cvar.Foo
    42
    >>> print example.STATUS
    50
    >>> print example.VERSION
    1.1
    

    Whenever possible, SWIG creates an interface that closely matches the underlying C/C++ code. However, due to subtle differences between languages, run-time environments, and semantics, it is not always possible to do so. The next few sections describe various aspects of this mapping.

    5.2.1 Basic Type Handling

    In order to build an interface, SWIG has to convert C/C++ datatypes to equivalent types in the target language. Generally, scripting languages provide a more limited set of primitive types than C. Therefore, this conversion process involves a certain amount of type coercion.

    Most scripting languages provide a single integer type that is implemented using the int or long datatype in C. The following list shows all of the C datatypes that SWIG will convert to and from integers in the target language:

    int
    short
    long
    unsigned
    signed
    unsigned short
    unsigned long
    unsigned char
    signed char
    bool
    

    When an integral value is converted from C, a cast is used to convert it to the representation in the target language. Thus, a 16 bit short in C may be promoted to a 32 bit integer. When integers are converted in the other direction, the value is cast back into the original C type. If the value is too large to fit, it is silently truncated.

    unsigned char and signed char are special cases that are handled as small 8-bit integers. Normally, the char datatype is mapped as a one-character ASCII string.

    The bool datatype is cast to and from an integer value of 0 and 1 unless the target language provides a special boolean type.

    Some care is required when working with large integer values. Most scripting languages use 32-bit integers so mapping a 64-bit long integer may lead to truncation errors. Similar problems may arise with 32 bit unsigned integers (which may appear as large negative numbers). As a rule of thumb, the int datatype and all variations of char and short datatypes are safe to use. For unsigned int and long datatypes, you will need to carefully check the correct operation of your program after it has been wrapped with SWIG.

    Although the SWIG parser supports the long long datatype, not all language modules support it. This is because long long usually exceeds the integer precision available in the target language. In certain modules such as Tcl and Perl5, long long integers are encoded as strings. This allows the full range of these numbers to be represented. However, it does not allow long long values to be used in arithmetic expressions. It should also be noted that although long long is part of the ISO C99 standard, it is not universally supported by all C compilers. Make sure you are using a compiler that supports long long before trying to use this type with SWIG.

    SWIG recognizes the following floating point types :

    float
    double
    

    Floating point numbers are mapped to and from the natural representation of floats in the target language. This is almost always a C double. The rarely used datatype of long double is not supported by SWIG.

    The char datatype is mapped into a NULL terminated ASCII string with a single character. When used in a scripting language it shows up as a tiny string containing the character value. When converting the value back into C, SWIG takes a character string from the scripting language and strips off the first character as the char value. Thus if the value "foo" is assigned to a char datatype, it gets the value `f'.

    The char * datatype is handled as a NULL-terminated ASCII string. SWIG maps this into a 8-bit character string in the target scripting language. SWIG converts character strings in the target language to NULL terminated strings before passing them into C/C++. The default handling of these strings does not allow them to have embedded NULL bytes. Therefore, the char * datatype is not generally suitable for passing binary data. However, it is possible to change this behavior by defining a SWIG typemap. See the chapter on Typemaps for details about this.

    At this time, SWIG provides limited support for Unicode and wide-character strings (the C wchar_t type). Some languages provide typemaps for wchar_t, but bear in mind these might not be portable across different operating systems. This is a delicate topic that is poorly understood by many programmers and not implemented in a consistent manner across languages. For those scripting languages that provide Unicode support, Unicode strings are often available in an 8-bit representation such as UTF-8 that can be mapped to the char * type (in which case the SWIG interface will probably work). If the program you are wrapping uses Unicode, there is no guarantee that Unicode characters in the target language will use the same internal representation (e.g., UCS-2 vs. UCS-4). You may need to write some special conversion functions.

    5.2.2 Global Variables

    Whenever possible, SWIG maps C/C++ global variables into scripting language variables. For example,

    %module example
    double foo;
    
    

    results in a scripting language variable like this:

    # Tcl
    set foo [3.5]                   ;# Set foo to 3.5
    puts $foo                       ;# Print the value of foo
    
    # Python
    cvar.foo = 3.5                  # Set foo to 3.5
    print cvar.foo                  # Print value of foo
    
    # Perl
    $foo = 3.5;                     # Set foo to 3.5
    print $foo, "\n";               # Print value of foo
    
    # Ruby
    Module.foo = 3.5               # Set foo to 3.5
    print Module.foo, "\n"         # Print value of foo
    

    Whenever the scripting language variable is used, the underlying C global variable is accessed. Although SWIG makes every attempt to make global variables work like scripting language variables, it is not always possible to do so. For instance, in Python, all global variables must be accessed through a special variable object known as cvar (shown above). In Ruby, variables are accessed as attributes of the module. Other languages may convert variables to a pair of accessor functions. For example, the Java module generates a pair of functions double get_foo() and set_foo(double val) that are used to manipulate the value.

    Finally, if a global variable has been declared as const, it only supports read-only access. Note: this behavior is new to SWIG-1.3. Earlier versions of SWIG incorrectly handled const and created constants instead.

    5.2.3 Constants

    Constants can be created using #define, enumerations, or a special %constant directive. The following interface file shows a few valid constant declarations :

    #define I_CONST       5               // An integer constant
    #define PI            3.14159         // A Floating point constant
    #define S_CONST       "hello world"   // A string constant
    #define NEWLINE       '\n'            // Character constant
    
    enum boolean {NO=0, YES=1};
    enum months {JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG,
                 SEP, OCT, NOV, DEC};
    %constant double BLAH = 42.37;
    #define PI_4 PI/4
    #define FLAGS 0x04 | 0x08 | 0x40
    
    

    In #define declarations, the type of a constant is inferred by syntax. For example, a number with a decimal point is assumed to be floating point. In addition, SWIG must be able to fully resolve all of the symbols used in a #define in order for a constant to actually be created. This restriction is necessary because #define is also used to define preprocessor macros that are definitely not meant to be part of the scripting language interface. For example:

    #define EXTERN extern
    
    EXTERN void foo();
    

    In this case, you probably don't want to create a constant called EXTERN (what would the value be?). In general, SWIG will not create constants for macros unless the value can be completely determined by the preprocessor. For instance, in the above example, the declaration

    #define PI_4  PI/4
    

    defines a constant because PI was already defined as a constant and the value is known. However, for the same conservative reasons even a constant with a simple cast will be ignored, such as

    #define F_CONST (double) 5            // A floating point constant with cast
    

    The use of constant expressions is allowed, but SWIG does not evaluate them. Rather, it passes them through to the output file and lets the C compiler perform the final evaluation (SWIG does perform a limited form of type-checking however).

    For enumerations, it is critical that the original enum definition be included somewhere in the interface file (either in a header file or in the %{ %} block). SWIG only translates the enumeration into code needed to add the constants to a scripting language. It needs the original enumeration declaration in order to get the correct enum values as assigned by the C compiler.

    The %constant directive is used to more precisely create constants corresponding to different C datatypes. Although it is not usually needed for simple values, it is more useful when working with pointers and other more complex datatypes. Typically, %constant is only used when you want to add constants to the scripting language interface that are not defined in the original header file.

    5.2.4 A brief word about const

    A common confusion with C programming is the semantic meaning of the const qualifier in declarations--especially when it is mixed with pointers and other type modifiers. In fact, previous versions of SWIG handled const incorrectly--a situation that SWIG-1.3.7 and newer releases have fixed.

    Starting with SWIG-1.3, all variable declarations, regardless of any use of const, are wrapped as global variables. If a declaration happens to be declared as const, it is wrapped as a read-only variable. To tell if a variable is const or not, you need to look at the right-most occurrence of the const qualifier (that appears before the variable name). If the right-most const occurs after all other type modifiers (such as pointers), then the variable is const. Otherwise, it is not.

    Here are some examples of const declarations.

    const char a;           // A constant character
    char const b;           // A constant character (the same)
    char *const c;          // A constant pointer to a character
    const char *const d;    // A constant pointer to a constant character
    

    Here is an example of a declaration that is not const:

    const char *e;          // A pointer to a constant character.  The pointer
                            // may be modified.
    

    In this case, the pointer e can change---it's only the value being pointed to that is read-only.

    Please note that for const parameters or return types used in a function, SWIG pretty much ignores the fact that these are const, see the section on const-correctness for more information.

    Compatibility Note: One reason for changing SWIG to handle const declarations as read-only variables is that there are many situations where the value of a const variable might change. For example, a library might export a symbol as const in its public API to discourage modification, but still allow the value to change through some other kind of internal mechanism. Furthermore, programmers often overlook the fact that with a constant declaration like char *const, the underlying data being pointed to can be modified--it's only the pointer itself that is constant. In an embedded system, a const declaration might refer to a read-only memory address such as the location of a memory-mapped I/O device port (where the value changes, but writing to the port is not supported by the hardware). Rather than trying to build a bunch of special cases into the const qualifier, the new interpretation of const as "read-only" is simple and exactly matches the actual semantics of const in C/C++. If you really want to create a constant as in older versions of SWIG, use the %constant directive instead. For example:

    %constant double PI = 3.14159;
    

    or

    #ifdef SWIG
    #define const %constant
    #endif
    const double foo = 3.4;
    const double bar = 23.4;
    const int    spam = 42;
    #ifdef SWIG
    #undef const
    #endif
    ...
    
    

    5.2.5 A cautionary tale of char *

    Before going any further, there is one bit of caution involving char * that must now be mentioned. When strings are passed from a scripting language to a C char *, the pointer usually points to string data stored inside the interpreter. It is almost always a really bad idea to modify this data. Furthermore, some languages may explicitly disallow it. For instance, in Python, strings are supposed to be immutable. If you violate this, you will probably receive a vast amount of wrath when you unleash your module on the world.

    The primary source of problems are functions that might modify string data in place. A classic example would be a function like this:

    char *strcat(char *s, const char *t)
    

    Although SWIG will certainly generate a wrapper for this, its behavior will be undefined. In fact, it will probably cause your application to crash with a segmentation fault or other memory related problem. This is because s refers to some internal data in the target language---data that you shouldn't be touching.

    The bottom line: don't rely on char * for anything other than read-only input values. However, it must be noted that you could change the behavior of SWIG using typemaps.

    5.3 Pointers and complex objects

    Most C programs manipulate arrays, structures, and other types of objects. This section discusses the handling of these datatypes.

    5.3.1 Simple pointers

    Pointers to primitive C datatypes such as

    int *
    double ***
    char **
    

    are fully supported by SWIG. Rather than trying to convert the data being pointed to into a scripting representation, SWIG simply encodes the pointer itself into a representation that contains the actual value of the pointer and a type-tag. Thus, the SWIG representation of the above pointers (in Tcl), might look like this:

    _10081012_p_int
    _1008e124_ppp_double
    _f8ac_pp_char
    

    A NULL pointer is represented by the string "NULL" or the value 0 encoded with type information.

    All pointers are treated as opaque objects by SWIG. Thus, a pointer may be returned by a function and passed around to other C functions as needed. For all practical purposes, the scripting language interface works in exactly the same way as you would use the pointer in a C program. The only difference is that there is no mechanism for dereferencing the pointer since this would require the target language to understand the memory layout of the underlying object.

    The scripting language representation of a pointer value should never be manipulated directly. Even though the values shown look like hexadecimal addresses, the numbers used may differ from the actual machine address (e.g., on little-endian machines, the digits may appear in reverse order). Furthermore, SWIG does not normally map pointers into high-level objects such as associative arrays or lists (for example, converting an int * into an list of integers). There are several reasons why SWIG does not do this:

    • There is not enough information in a C declaration to properly map pointers into higher level constructs. For example, an int * may indeed be an array of integers, but if it contains ten million elements, converting it into a list object is probably a bad idea.
    • The underlying semantics associated with a pointer is not known by SWIG. For instance, an int * might not be an array at all--perhaps it is an output value!
    • By handling all pointers in a consistent manner, the implementation of SWIG is greatly simplified and less prone to error.

    5.3.2 Run time pointer type checking

    By allowing pointers to be manipulated from a scripting language, extension modules effectively bypass compile-time type checking in the C/C++ compiler. To prevent errors, a type signature is encoded into all pointer values and is used to perform run-time type checking. This type-checking process is an integral part of SWIG and can not be disabled or modified without using typemaps (described in later chapters).

    Like C, void * matches any kind of pointer. Furthermore, NULL pointers can be passed to any function that expects to receive a pointer. Although this has the potential to cause a crash, NULL pointers are also sometimes used as sentinel values or to denote a missing/empty value. Therefore, SWIG leaves NULL pointer checking up to the application.

    5.3.3 Derived types, structs, and classes

    For everything else (structs, classes, arrays, etc...) SWIG applies a very simple rule :

    Everything else is a pointer

    In other words, SWIG manipulates everything else by reference. This model makes sense because most C/C++ programs make heavy use of pointers and SWIG can use the type-checked pointer mechanism already present for handling pointers to basic datatypes.

    Although this probably sounds complicated, it's really quite simple. Suppose you have an interface file like this :

    %module fileio
    FILE *fopen(char *, char *);
    int fclose(FILE *);
    unsigned fread(void *ptr, unsigned size, unsigned nobj, FILE *);
    unsigned fwrite(void *ptr, unsigned size, unsigned nobj, FILE *);
    void *malloc(int nbytes);
    void free(void *);
    
    

    In this file, SWIG doesn't know what a FILE is, but since it's used as a pointer, so it doesn't really matter what it is. If you wrapped this module into Python, you can use the functions just like you expect :

    # Copy a file 
    def filecopy(source, target):
      f1 = fopen(source, "r")
      f2 = fopen(target, "w")
      buffer = malloc(8192)
      nbytes = fread(buffer, 8192, 1, f1)
      while (nbytes > 0):
        fwrite(buffer, 8192, 1, f2)
              nbytes = fread(buffer, 8192, 1, f1)
      free(buffer)
    

    In this case f1, f2, and buffer are all opaque objects containing C pointers. It doesn't matter what value they contain--our program works just fine without this knowledge.

    5.3.4 Undefined datatypes

    When SWIG encounters an undeclared datatype, it automatically assumes that it is a structure or class. For example, suppose the following function appeared in a SWIG input file:

    void matrix_multiply(Matrix *a, Matrix *b, Matrix *c);
    

    SWIG has no idea what a "Matrix" is. However, it is obviously a pointer to something so SWIG generates a wrapper using its generic pointer handling code.

    Unlike C or C++, SWIG does not actually care whether Matrix has been previously defined in the interface file or not. This allows SWIG to generate interfaces from only partial or limited information. In some cases, you may not care what a Matrix really is as long as you can pass an opaque reference to one around in the scripting language interface.

    An important detail to mention is that SWIG will gladly generate wrappers for an interface when there are unspecified type names. However, all unspecified types are internally handled as pointers to structures or classes! For example, consider the following declaration:

    void foo(size_t num);
    

    If size_t is undeclared, SWIG generates wrappers that expect to receive a type of size_t * (this mapping is described shortly). As a result, the scripting interface might behave strangely. For example:

    foo(40);
    TypeError: expected a _p_size_t.
    

    The only way to fix this problem is to make sure you properly declare type names using typedef.

    5.3.5 Typedef

    Like C, typedef can be used to define new type names in SWIG. For example:

    typedef unsigned int size_t;
    

    typedef definitions appearing in a SWIG interface are not propagated to the generated wrapper code. Therefore, they either need to be defined in an included header file or placed in the declarations section like this:

    %{
    /* Include in the generated wrapper file */
    typedef unsigned int size_t;
    %}
    /* Tell SWIG about it */
    typedef unsigned int size_t;
    

    or

    %inline %{
    typedef unsigned int size_t;
    %}
    

    In certain cases, you might be able to include other header files to collect type information. For example:

    %module example
    %import "sys/types.h"
    

    In this case, you might run SWIG as follows:

    $ swig -I/usr/include -includeall example.i
    

    It should be noted that your mileage will vary greatly here. System headers are notoriously complicated and may rely upon a variety of non-standard C coding extensions (e.g., such as special directives to GCC). Unless you exactly specify the right include directories and preprocessor symbols, this may not work correctly (you will have to experiment).

    SWIG tracks typedef declarations and uses this information for run-time type checking. For instance, if you use the above typedef and had the following function declaration:

    void foo(unsigned int *ptr);
    

    The corresponding wrapper function will accept arguments of type unsigned int * or size_t *.

    5.4 Other Practicalities

    So far, this chapter has presented almost everything you need to know to use SWIG for simple interfaces. However, some C programs use idioms that are somewhat more difficult to map to a scripting language interface. This section describes some of these issues.

    5.4.1 Passing structures by value

    Sometimes a C function takes structure parameters that are passed by value. For example, consider the following function:

    double dot_product(Vector a, Vector b);
    

    To deal with this, SWIG transforms the function to use pointers by creating a wrapper equivalent to the following:

    double wrap_dot_product(Vector *a, Vector *b) {
        Vector x = *a;
        Vector y = *b;
        return dot_product(x, y);
    }
    

    In the target language, the dot_product() function now accepts pointers to Vectors instead of Vectors. For the most part, this transformation is transparent so you might not notice.

    5.4.2 Return by value

    C functions that return structures or classes datatypes by value are more difficult to handle. Consider the following function:

    Vector cross_product(Vector v1, Vector v2);
    

    This function wants to return Vector, but SWIG only really supports pointers. As a result, SWIG creates a wrapper like this:

    Vector *wrap_cross_product(Vector *v1, Vector *v2) {
            Vector x = *v1;
            Vector y = *v2;
            Vector *result;
            result = (Vector *) malloc(sizeof(Vector));
            *(result) = cross(x, y);
            return result;
    }
    

    or if SWIG was run with the -c++ option:

    Vector *wrap_cross(Vector *v1, Vector *v2) {
            Vector x = *v1;
            Vector y = *v2;
            Vector *result = new Vector(cross(x, y)); // Uses default copy constructor
            return result;
    }
    

    In both cases, SWIG allocates a new object and returns a reference to it. It is up to the user to delete the returned object when it is no longer in use. Clearly, this will leak memory if you are unaware of the implicit memory allocation and don't take steps to free the result. That said, it should be noted that some language modules can now automatically track newly created objects and reclaim memory for you. Consult the documentation for each language module for more details.

    It should also be noted that the handling of pass/return by value in C++ has some special cases. For example, the above code fragments don't work correctly if Vector doesn't define a default constructor. The section on SWIG and C++ has more information about this case.

    5.4.3 Linking to structure variables

    When global variables or class members involving structures are encountered, SWIG handles them as pointers. For example, a global variable like this

    Vector unit_i;
    

    gets mapped to an underlying pair of set/get functions like this :

    Vector *unit_i_get() {
      return &unit_i;
    }
    void unit_i_set(Vector *value) {
      unit_i = *value;
    }
    

    Again some caution is in order. A global variable created in this manner will show up as a pointer in the target scripting language. It would be an extremely bad idea to free or destroy such a pointer. Also, C++ classes must supply a properly defined copy constructor in order for assignment to work correctly.

    5.4.4 Linking to char *

    When a global variable of type char * appears, SWIG uses malloc() or new to allocate memory for the new value. Specifically, if you have a variable like this

    char *foo;
    

    SWIG generates the following code:

    /* C mode */
    void foo_set(char *value) {
      if (foo) free(foo);
      foo = (char *) malloc(strlen(value)+1);
      strcpy(foo, value);
    }
    
    /* C++ mode.  When -c++ option is used */
    void foo_set(char *value) {
      if (foo) delete [] foo;
      foo = new char[strlen(value)+1];
      strcpy(foo, value);
    }
    

    If this is not the behavior that you want, consider making the variable read-only using the %immutable directive. Alternatively, you might write a short assist-function to set the value exactly like you want. For example:

    %inline %{
      void set_foo(char *value) {
        strncpy(foo, value, 50);
      }
    %}
    

    Note: If you write an assist function like this, you will have to call it as a function from the target scripting language (it does not work like a variable). For example, in Python you will have to write:

    >>> set_foo("Hello World")
    

    A common mistake with char * variables is to link to a variable declared like this:

    char *VERSION = "1.0";
    

    In this case, the variable will be readable, but any attempt to change the value results in a segmentation or general protection fault. This is due to the fact that SWIG is trying to release the old value using free or delete when the string literal value currently assigned to the variable wasn't allocated using malloc() or new. To fix this behavior, you can either mark the variable as read-only, write a typemap (as described in Chapter 6), or write a special set function as shown. Another alternative is to declare the variable as an array:

    char VERSION[64] = "1.0";
    

    When variables of type const char * are declared, SWIG still generates functions for setting and getting the value. However, the default behavior does not release the previous contents (resulting in a possible memory leak). In fact, you may get a warning message such as this when wrapping such a variable:

    example.i:20. Typemap warning. Setting const char * variable may leak memory
    

    The reason for this behavior is that const char * variables are often used to point to string literals. For example:

    const char *foo = "Hello World\n";
    

    Therefore, it's a really bad idea to call free() on such a pointer. On the other hand, it is legal to change the pointer to point to some other value. When setting a variable of this type, SWIG allocates a new string (using malloc or new) and changes the pointer to point to the new value. However, repeated modifications of the value will result in a memory leak since the old value is not released.

    5.4.5 Arrays

    Arrays are fully supported by SWIG, but they are always handled as pointers instead of mapping them to a special array object or list in the target language. Thus, the following declarations :

    int foobar(int a[40]);
    void grok(char *argv[]);
    void transpose(double a[20][20]);
    

    are processed as if they were really declared like this:

    int foobar(int *a);
    void grok(char **argv);
    void transpose(double (*a)[20]);
    

    Like C, SWIG does not perform array bounds checking. It is up to the user to make sure the pointer points to a suitably allocated region of memory.

    Multi-dimensional arrays are transformed into a pointer to an array of one less dimension. For example:

    int [10];         // Maps to int *
    int [10][20];     // Maps to int (*)[20]
    int [10][20][30]; // Maps to int (*)[20][30]
    

    It is important to note that in the C type system, a multidimensional array a[][] is NOT equivalent to a single pointer *a or a double pointer such as **a. Instead, a pointer to an array is used (as shown above) where the actual value of the pointer is the starting memory location of the array. The reader is strongly advised to dust off their C book and re-read the section on arrays before using them with SWIG.

    Array variables are supported, but are read-only by default. For example:

    int   a[100][200];
    

    In this case, reading the variable 'a' returns a pointer of type int (*)[200] that points to the first element of the array &a[0][0]. Trying to modify 'a' results in an error. This is because SWIG does not know how to copy data from the target language into the array. To work around this limitation, you may want to write a few simple assist functions like this:

    %inline %{
    void a_set(int i, int j, int val) {
      a[i][j] = val;
    }
    int a_get(int i, int j) {
      return a[i][j];
    }
    %}
    

    To dynamically create arrays of various sizes and shapes, it may be useful to write some helper functions in your interface. For example:

    // Some array helpers
    %inline %{
      /* Create any sort of [size] array */
      int *int_array(int size) {
        return (int *) malloc(size*sizeof(int));
      }
      /* Create a two-dimension array [size][10] */
      int (*int_array_10(int size))[10] {
        return (int (*)[10]) malloc(size*10*sizeof(int));
      }
    %}
    

    Arrays of char are handled as a special case by SWIG. In this case, strings in the target language can be stored in the array. For example, if you have a declaration like this,

    char pathname[256];
    

    SWIG generates functions for both getting and setting the value that are equivalent to the following code:

    char *pathname_get() {
      return pathname;
    }
    void pathname_set(char *value) {
      strncpy(pathname, value, 256);
    }
    

    In the target language, the value can be set like a normal variable.

    5.4.6 Creating read-only variables

    A read-only variable can be created by using the %immutable directive as shown :

    // File : interface.i
    
    int a;       // Can read/write
    %immutable;
    int b, c, d;   // Read only variables
    %mutable;
    double x, y;  // read/write
    

    The %immutable directive enables read-only mode until it is explicitly disabled using the %mutable directive. As an alternative to turning read-only mode off and on like this, individual declarations can also be tagged as immutable. For example:

    %immutable x;                   // Make x read-only
    ...
    double x;                       // Read-only (from earlier %immutable directive)
    double y;                       // Read-write
    ...
    

    The %mutable and %immutable directives are actually %feature directives defined like this:

    #define %immutable   %feature("immutable")
    #define %mutable     %feature("immutable", "")
    

    If you wanted to make all wrapped variables read-only, barring one or two, it might be easier to take this approach:

    %immutable;                     // Make all variables read-only
    %feature("immutable", "0") x;   // except, make x read/write
    ...
    double x;
    double y;
    double z;
    ...
    

    Read-only variables are also created when declarations are declared as const. For example:

    const int foo;               /* Read only variable */
    char * const version="1.0";  /* Read only variable */
    

    Compatibility note: Read-only access used to be controlled by a pair of directives %readonly and %readwrite. Although these directives still work, they generate a warning message. Simply change the directives to %immutable; and %mutable; to silence the warning. Don't forget the extra semicolon!

    5.4.7 Renaming and ignoring declarations

    5.4.7.1 Simple renaming of specific identifiers

    Normally, the name of a C declaration is used when that declaration is wrapped into the target language. However, this may generate a conflict with a keyword or already existing function in the scripting language. To resolve a name conflict, you can use the %rename directive as shown :

    // interface.i
    
    %rename(my_print) print;
    extern void print(const char *);
    
    %rename(foo) a_really_long_and_annoying_name;
    extern int a_really_long_and_annoying_name;
    
    

    SWIG still calls the correct C function, but in this case the function print() will really be called "my_print()" in the target language.

    The placement of the %rename directive is arbitrary as long as it appears before the declarations to be renamed. A common technique is to write code for wrapping a header file like this:

    // interface.i
    
    %rename(my_print) print;
    %rename(foo) a_really_long_and_annoying_name;
    
    %include "header.h"
    

    %rename applies a renaming operation to all future occurrences of a name. The renaming applies to functions, variables, class and structure names, member functions, and member data. For example, if you had two-dozen C++ classes, all with a member function named `print' (which is a keyword in Python), you could rename them all to `output' by specifying :

    %rename(output) print; // Rename all `print' functions to `output'
    

    SWIG does not normally perform any checks to see if the functions it wraps are already defined in the target scripting language. However, if you are careful about namespaces and your use of modules, you can usually avoid these problems.

    Closely related to %rename is the %ignore directive. %ignore instructs SWIG to ignore declarations that match a given identifier. For example:

    %ignore print;         // Ignore all declarations named print
    %ignore MYMACRO;       // Ignore a macro
    ...
    #define MYMACRO 123
    void print(const char *);
    ...
    

    Any function, variable etc which matches %ignore will not be wrapped and therefore will not be available from the target language. A common usage of %ignore is to selectively remove certain declarations from a header file without having to add conditional compilation to the header. However, it should be stressed that this only works for simple declarations. If you need to remove a whole section of problematic code, the SWIG preprocessor should be used instead.

    Compatibility note: Older versions of SWIG provided a special %name directive for renaming declarations. For example:

    %name(output) extern void print(const char *);
    

    This directive is still supported, but it is deprecated and should probably be avoided. The %rename directive is more powerful and better supports wrapping of raw header file information.

    5.4.7.2 Advanced renaming support

    While writing %rename for specific declarations is simple enough, sometimes the same renaming rule needs to be applied to many, maybe all, identifiers in the SWIG input. For example, it may be necessary to apply some transformation to all the names in the target language to better follow its naming conventions, like adding a specific prefix to all wrapped functions. Doing it individually for each function is impractical so SWIG supports applying a renaming rule to all declarations if the name of the identifier to be renamed is not specified:

    %rename("myprefix_%s") ""; // print -> myprefix_print
    

    This also shows that the argument of %rename doesn't have to be a literal string but can be a printf()-like format string. In the simplest form, "%s" is replaced with the name of the original declaration, as shown above. However this is not always enough and SWIG provides extensions to the usual format string syntax to allow applying a (SWIG-defined) function to the argument. For example, to wrap all C functions do_something_long() as more Java-like doSomethingLong() you can use the "lowercamelcase" extended format specifier like this:

    %rename("%(lowercamelcase)s") ""; // foo_bar -> fooBar; FooBar -> fooBar
    

    Some functions can be parametrized, for example the "strip" one strips the provided prefix from its argument. The prefix is specified as part of the format string, following a colon after the function name:

    %rename("%(strip:[wx])s") ""; // wxHello -> Hello; FooBar -> FooBar
    

    Below is the table summarizing all currently defined functions with an example of applying each one. Note that some of them have two names, a shorter one and a more descriptive one, but the two functions are otherwise equivalent:

    FunctionReturnsExample (in/out)
    uppercase or upper Upper case version of the string. PrintPRINT
    lowercase or lower Lower case version of the string. Printprint
    title String with first letter capitalized and the rest in lower case. printPrint
    firstuppercase String with the first letter capitalized and the rest unchanged. printItPrintIt
    firstlowercase String with the first letter in lower case and the rest unchanged. PrintItprintIt
    camelcase or ctitle String with capitalized first letter and any letter following an underscore (which are removed in the process) and rest in lower case. print_itPrintIt
    lowercamelcase or lctitle String with every letter following an underscore (which is removed in the process) capitalized and rest, including the first letter, in lower case. print_itprintIt
    undercase or utitle Lower case string with underscores inserted before every upper case letter in the original string and any number not at the end of string. Logically, this is the reverse of camelcase. PrintItprint_it
    schemify String with all underscores replaced with dashes, resulting in more Lispers/Schemers-pleasing name. print_itprint-it
    strip:[prefix] String without the given prefix or the original string if it doesn't start with this prefix. Note that square brackets should be used literally, e.g. %rename("strip:[wx]") wxPrintPrint
    rstrip:[suffix] String without the given suffix or the original string if it doesn't end with this suffix. Note that square brackets should be used literally, e.g. %rename("rstrip:[Cls]") PrintClsPrint
    regex:/pattern/subst/ String after (Perl-like) regex substitution operation. This function allows to apply arbitrary regular expressions to the identifier names. The pattern part is a regular expression in Perl syntax (as supported by the Perl Compatible Regular Expressions (PCRE)) library and the subst string can contain back-references of the form \N where N is a digit from 0 to 9, or one of the following escape sequences: \l, \L, \u, \U or \E. The back-references are replaced with the contents of the corresponding capture group while the escape sequences perform the case conversion in the substitution string: \l and \L convert to the lower case, while \u and \U convert to the upper case. The difference between the elements of each pair is that \l and \u change the case of the next character only, while \L and \U do it for all the remaining characters or until \E is encountered. Finally please notice that backslashes need to be escaped in C strings, so in practice "\\" must be used in all these escape sequences. For example, to remove any alphabetic prefix before an underscore and capitalize the remaining part you could use the following directive: %rename("regex:/(\\w+)_(.*)/\\u\\2/") prefix_printPrint
    command:cmd Output of an external command cmd with the string passed to it as input. Notice that this function is extremely slow compared to all the other ones as it involves spawning a separate process and using it for many declarations is not recommended. The cmd is not enclosed in square brackets but must be terminated with a triple '<' sign, e.g. %rename("command:tr -d aeiou <<<") (nonsensical example removing all vowels) PrintPrnt

    The most general function of all of the above ones (not counting command which is even more powerful in principle but which should generally be avoided because of performance considerations) is the regex one. Here are some more examples of its use:

    // Strip the wx prefix from all identifiers except those starting with wxEVT
    %rename("%(regex:/wx(?!EVT)(.*)/\\1/)s") ""; // wxSomeWidget -> SomeWidget
                                                 // wxEVT_PAINT -> wxEVT_PAINT
    
    // Apply a rule for renaming the enum elements to avoid the common prefixes
    // which are redundant in C#/Java
    %rename("%(regex:/^([A-Z][a-z]+)+_(.*)/\\2/)s", %$isenumitem) ""; // Colour_Red -> Red
    
    // Remove all "Set/Get" prefixes.
    %rename("%(regex:/^(Set|Get)(.*)/\\2/)s") ""; // SetValue -> Value
                                                  // GetValue -> Value
    

    As before, everything that was said above about %rename also applies to %ignore. In fact, the latter is just a special case of the former and ignoring an identifier is the same as renaming it to the special "$ignore" value. So the following snippets

    %ignore print;
    

    and

    %rename("$ignore") print;
    

    are exactly equivalent and %rename can be used to selectively ignore multiple declarations using the previously described matching possibilities.

    5.4.7.3 Limiting global renaming rules

    As explained in the previous sections, it is possible to either rename individual declarations or apply a rename rule to all of them at once. In practice, the latter is however rarely appropriate as there are always some exceptions to the general rules. To deal with them, the scope of an unnamed %rename can be limited using subsequent match parameters. They can be applied to any of the attributes associated by SWIG with the declarations appearing in its input. For example:

    %rename("foo", match$name="bar") "";
    

    can be used to achieve the same effect as the simpler

    %rename("foo") bar;
    

    and so is not very interesting on its own. However match can also be applied to the declaration type, for example match="class" restricts the match to class declarations only (in C++) and match="enumitem" restricts it to the enum elements. SWIG also provides convenience macros for such match expressions, for example

    %rename("%(title)s", %$isenumitem) "";
    

    will capitalize the names of all the enum elements but not change the case of the other declarations. Similarly, %$isclass, %$isfunction, %$isconstructor, %$isunion, %$istemplate, and %$isvariable can be used. Many other checks are possible and this documentation is not exhaustive, see the "%rename predicates" section in swig.swg for the full list of supported match expressions.

    In addition to literally matching some string with match you can also use regexmatch or notregexmatch to match a string against a regular expression. For example, to ignore all functions having "Old" as a suffix you could use

    %rename("$ignore", regexmatch$name="Old$") "";
    

    For simple cases like this, specifying the regular expression for the declaration name directly can be preferable and can also be done using regextarget:

    %rename("$ignore", regextarget=1) "Old$";
    

    Notice that the check is done only against the name of the declaration itself, if you need to match the full name of a C++ declaration you must use fullname attribute:

    %rename("$ignore", regextarget=1, fullname=1) "NameSpace::ClassName::.*Old$";
    

    As for notregexmatch, it restricts the match only to the strings not matching the specified regular expression. So to rename all declarations to lower case except those consisting of capital letters only:

    %rename("$(lower)s", notregexmatch$name="^[A-Z]+$") "";
    

    Finally, variants of %rename and %ignore directives can be used to help wrap C++ overloaded functions and methods or C++ methods which use default arguments. This is described in the Ambiguity resolution and renaming section in the C++ chapter.

    5.4.7.4 Ignoring everything then wrapping a few selected symbols

    Using the techniques described above it is possible to ignore everything in a header and then selectively wrap a few chosen methods or classes. For example, consider a header, myheader.h which has many classes in it and just the one class called Star is wanted within this header, the following approach could be taken:

    %ignore ""; // Ignore everything
    
    // Unignore chosen class 'Star'
    %rename("%s") Star;
    
    // As the ignore everything will include the constructor, destructor, methods etc
    // in the class, these have to be explicitly unignored too:
    %rename("%s") Star::Star;
    %rename("%s") Star::~Star;
    %rename("%s") Star::shine; // named method
    
    %include "myheader.h"
    

    Another approach which might be more suitable as it does not require naming all the methods in the chosen class is to begin by ignoring just the classes. This does not add an explicit ignore to any members of the class, so when the chosen class is unignored, all of its methods will be wrapped.

    %rename($ignore, %$isclass) ""; // Only ignore all classes
    %rename("%s") Star; // Unignore 'Star'
    %include "myheader.h"
    

    5.4.8 Default/optional arguments

    SWIG supports default arguments in both C and C++ code. For example:

    int plot(double x, double y, int color=WHITE);
    

    In this case, SWIG generates wrapper code where the default arguments are optional in the target language. For example, this function could be used in Tcl as follows :

    % plot -3.4 7.5    # Use default value
    % plot -3.4 7.5 10 # set color to 10 instead
    
    

    Although the ANSI C standard does not allow default arguments, default arguments specified in a SWIG interface work with both C and C++.

    Note: There is a subtle semantic issue concerning the use of default arguments and the SWIG generated wrapper code. When default arguments are used in C code, the default values are emitted into the wrappers and the function is invoked with a full set of arguments. This is different to when wrapping C++ where an overloaded wrapper method is generated for each defaulted argument. Please refer to the section on default arguments in the C++ chapter for further details.

    5.4.9 Pointers to functions and callbacks

    Occasionally, a C library may include functions that expect to receive pointers to functions--possibly to serve as callbacks. SWIG provides full support for function pointers provided that the callback functions are defined in C and not in the target language. For example, consider a function like this:

    int binary_op(int a, int b, int (*op)(int, int));
    

    When you first wrap something like this into an extension module, you may find the function to be impossible to use. For instance, in Python:

    >>> def add(x, y):
    ...     return x+y
    ...
    >>> binary_op(3, 4, add)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: Type error. Expected _p_f_int_int__int
    >>>
    

    The reason for this error is that SWIG doesn't know how to map a scripting language function into a C callback. However, existing C functions can be used as arguments provided you install them as constants. One way to do this is to use the %constant directive like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %constant int add(int, int);
    %constant int sub(int, int);
    %constant int mul(int, int);
    

    In this case, add, sub, and mul become function pointer constants in the target scripting language. This allows you to use them as follows:

    >>> binary_op(3, 4, add)
    7
    >>> binary_op(3, 4, mul)
    12
    >>>
    

    Unfortunately, by declaring the callback functions as constants, they are no longer accessible as functions. For example:

    >>> add(3, 4)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: object is not callable: '_ff020efc_p_f_int_int__int'
    >>>
    

    If you want to make a function available as both a callback function and a function, you can use the %callback and %nocallback directives like this:

    /* Function with a callback */
    int binary_op(int a, int b, int (*op)(int, int));
    
    /* Some callback functions */
    %callback("%s_cb");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    The argument to %callback is a printf-style format string that specifies the naming convention for the callback constants (%s gets replaced by the function name). The callback mode remains in effect until it is explicitly disabled using %nocallback. When you do this, the interface now works as follows:

    >>> binary_op(3, 4, add_cb)
    7
    >>> binary_op(3, 4, mul_cb)
    12
    >>> add(3, 4)
    7
    >>> mul(3, 4)
    12
    

    Notice that when the function is used as a callback, special names such as add_cb are used instead. To call the function normally, just use the original function name such as add().

    SWIG provides a number of extensions to standard C printf formatting that may be useful in this context. For instance, the following variation installs the callbacks as all upper case constants such as ADD, SUB, and MUL:

    /* Some callback functions */
    %callback("%(uppercase)s");
    int add(int, int);
    int sub(int, int);
    int mul(int, int);
    %nocallback;
    

    A format string of "%(lowercase)s" converts all characters to lower case. A string of "%(title)s" capitalizes the first character and converts the rest to lower case.

    And now, a final note about function pointer support. Although SWIG does not normally allow callback functions to be written in the target language, this can be accomplished with the use of typemaps and other advanced SWIG features. See the Typemaps chapter for more about typemaps and individual target language chapters for more on callbacks and the 'director' feature.

    5.5 Structures and unions

    This section describes the behavior of SWIG when processing ANSI C structures and union declarations. Extensions to handle C++ are described in the next section.

    If SWIG encounters the definition of a structure or union, it creates a set of accessor functions. Although SWIG does not need structure definitions to build an interface, providing definitions makes it possible to access structure members. The accessor functions generated by SWIG simply take a pointer to an object and allow access to an individual member. For example, the declaration :

    struct Vector {
      double x, y, z;
    }
    
    

    gets transformed into the following set of accessor functions :

    double Vector_x_get(struct Vector *obj) {
      return obj->x;
    }
    double Vector_y_get(struct Vector *obj) { 
      return obj->y;
    }
    double Vector_z_get(struct Vector *obj) { 
      return obj->z;
    }
    void Vector_x_set(struct Vector *obj, double value) {
      obj->x = value;
    }
    void Vector_y_set(struct Vector *obj, double value) {
      obj->y = value;
    }
    void Vector_z_set(struct Vector *obj, double value) {
      obj->z = value;
    }
    

    In addition, SWIG creates default constructor and destructor functions if none are defined in the interface. For example:

    struct Vector *new_Vector() {
        return (Vector *) calloc(1, sizeof(struct Vector));
    }
    void delete_Vector(struct Vector *obj) {
        free(obj);
    }
    

    Using these low-level accessor functions, an object can be minimally manipulated from the target language using code like this:

    v = new_Vector()
    Vector_x_set(v, 2)
    Vector_y_set(v, 10)
    Vector_z_set(v, -5)
    ...
    delete_Vector(v)
    

    However, most of SWIG's language modules also provide a high-level interface that is more convenient. Keep reading.

    5.5.1 Typedef and structures

    SWIG supports the following construct which is quite common in C programs :

    typedef struct {
      double x, y, z;
    } Vector;
    
    

    When encountered, SWIG assumes that the name of the object is `Vector' and creates accessor functions like before. The only difference is that the use of typedef allows SWIG to drop the struct keyword on its generated code. For example:

    double Vector_x_get(Vector *obj) {
      return obj->x;
    }
    

    If two different names are used like this :

    typedef struct vector_struct {
      double x, y, z;
    } Vector;
    
    

    the name Vector is used instead of vector_struct since this is more typical C programming style. If declarations defined later in the interface use the type struct vector_struct, SWIG knows that this is the same as Vector and it generates the appropriate type-checking code.

    5.5.2 Character strings and structures

    Structures involving character strings require some care. SWIG assumes that all members of type char * have been dynamically allocated using malloc() and that they are NULL-terminated ASCII strings. When such a member is modified, the previous contents will be released, and the new contents allocated. For example :

    %module mymodule
    ...
    struct Foo {
      char *name;
      ...
    }
    
    

    This results in the following accessor functions :

    char *Foo_name_get(Foo *obj) {
      return Foo->name;
    }
    
    char *Foo_name_set(Foo *obj, char *c) {
      if (obj->name)
        free(obj->name);
      obj->name = (char *) malloc(strlen(c)+1);
      strcpy(obj->name, c);
      return obj->name;
    }
    

    If this behavior differs from what you need in your applications, the SWIG "memberin" typemap can be used to change it. See the typemaps chapter for further details.

    Note: If the -c++ option is used, new and delete are used to perform memory allocation.

    5.5.3 Array members

    Arrays may appear as the members of structures, but they will be read-only. SWIG will write an accessor function that returns the pointer to the first element of the array, but will not write a function to change the contents of the array itself. When this situation is detected, SWIG may generate a warning message such as the following :

    interface.i:116. Warning. Array member will be read-only
    

    To eliminate the warning message, typemaps can be used, but this is discussed in a later chapter. In many cases, the warning message is harmless.

    5.5.4 Structure data members

    Occasionally, a structure will contain data members that are themselves structures. For example:

    typedef struct Foo {
      int x;
    } Foo;
    
    typedef struct Bar {
      int y;
      Foo f;           /* struct member */
    } Bar;
    

    When a structure member is wrapped, it is handled as a pointer, unless the %naturalvar directive is used where it is handled more like a C++ reference (see C++ Member data). The accessors to the member variable as a pointer are effectively wrapped as follows:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    void Bar_f_set(Bar *b, Foo *value) {
      b->f = *value;
    }
    

    The reasons for this are somewhat subtle but have to do with the problem of modifying and accessing data inside the data member. For example, suppose you wanted to modify the value of f.x of a Bar object like this:

    Bar *b;
    b->f.x = 37;
    

    Translating this assignment to function calls (as would be used inside the scripting language interface) results in the following code:

    Bar *b;
    Foo_x_set(Bar_f_get(b), 37);
    

    In this code, if the Bar_f_get() function were to return a Foo instead of a Foo *, then the resulting modification would be applied to a copy of f and not the data member f itself. Clearly that's not what you want!

    It should be noted that this transformation to pointers only occurs if SWIG knows that a data member is a structure or class. For instance, if you had a structure like this,

    struct Foo {
      WORD   w;
    };
    

    and nothing was known about WORD, then SWIG will generate more normal accessor functions like this:

    WORD Foo_w_get(Foo *f) {
        return f->w;
    }
    void Foo_w_set(FOO *f, WORD value) {
        f->w = value;
    }
    

    Compatibility Note: SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes to pointers. Starting in SWIG-1.3.12, this transformation only occurs if a datatype is known to be a structure, class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared datatype is really a struct, simply use a forward struct declaration such as "struct Foo;".

    5.5.5 C constructors and destructors

    When wrapping structures, it is generally useful to have a mechanism for creating and destroying objects. If you don't do anything, SWIG will automatically generate functions for creating and destroying objects using malloc() and free(). Note: the use of malloc() only applies when SWIG is used on C code (i.e., when the -c++ option is not supplied on the command line). C++ is handled differently.

    If you don't want SWIG to generate default constructors for your interfaces, you can use the %nodefaultctor directive or the -nodefaultctor command line option. For example:

    swig -nodefaultctor example.i 
    

    or

    %module foo
    ...
    %nodefaultctor;        // Don't create default constructors
    ... declarations ...
    %clearnodefaultctor;   // Re-enable default constructors
    

    If you need more precise control, %nodefaultctor can selectively target individual structure definitions. For example:

    %nodefaultctor Foo;      // No default constructor for Foo
    ...
    struct Foo {             // No default constructor generated.
    };
    
    struct Bar {             // Default constructor generated.
    };
    

    Since ignoring the implicit or default destructors most of the time produces memory leaks, SWIG will always try to generate them. If needed, however, you can selectively disable the generation of the default/implicit destructor by using %nodefaultdtor

    %nodefaultdtor Foo; // No default/implicit destructor for Foo
    ...
    struct Foo {              // No default destructor is generated.
    };
    
    struct Bar {              // Default destructor generated.
    };
    

    Compatibility note: Prior to SWIG-1.3.7, SWIG did not generate default constructors or destructors unless you explicitly turned them on using -make_default. However, it appears that most users want to have constructor and destructor functions so it has now been enabled as the default behavior.

    Note: There are also the -nodefault option and %nodefault directive, which disable both the default or implicit destructor generation. This could lead to memory leaks across the target languages, and it is highly recommended you don't use them.

    5.5.6 Adding member functions to C structures

    Most languages provide a mechanism for creating classes and supporting object oriented programming. From a C standpoint, object oriented programming really just boils down to the process of attaching functions to structures. These functions normally operate on an instance of the structure (or object). Although there is a natural mapping of C++ to such a scheme, there is no direct mechanism for utilizing it with C code. However, SWIG provides a special %extend directive that makes it possible to attach methods to C structures for purposes of building an object oriented interface. Suppose you have a C header file with the following declaration :

    /* file : vector.h */
    ...
    typedef struct Vector {
      double x, y, z;
    } Vector;
    
    

    You can make a Vector look a lot like a class by writing a SWIG interface like this:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    %include "vector.h"          // Just grab original C header file
    %extend Vector {             // Attach these functions to struct Vector
      Vector(double x, double y, double z) {
        Vector *v;
        v = (Vector *) malloc(sizeof(Vector));
        v->x = x;
        v->y = y;
        v->z = z;
        return v;
      }
      ~Vector() {
        free($self);
      }
      double magnitude() {
        return sqrt($self->x*$self->x+$self->y*$self->y+$self->z*$self->z);
      }
      void print() {
        printf("Vector [%g, %g, %g]\n", $self->x, $self->y, $self->z);
      }
    };
    
    

    Note the usage of the $self special variable. Its usage is identical to a C++ 'this' pointer and should be used whenever access to the struct instance is required. Also note that C++ constructor and destructor syntax has been used to simulate a constructor and destructor, even for C code. There is one subtle difference to a normal C++ constructor implementation though and that is although the constructor declaration is as per a normal C++ constructor, the newly constructed object must be returned as if the constructor declaration had a return value, a Vector * in this case.

    Now, when used with proxy classes in Python, you can do things like this :

    >>> v = Vector(3, 4, 0)                 # Create a new vector
    >>> print v.magnitude()                # Print magnitude
    5.0
    >>> v.print()                  # Print it out
    [ 3, 4, 0 ]
    >>> del v                      # Destroy it
    

    The %extend directive can also be used inside the definition of the Vector structure. For example:

    // file : vector.i
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(double x, double y, double z) { ... }
        ~Vector() { ... }
        ...
      }
    } Vector;
    

    Note that %extend can be used to access externally written functions provided they follow the naming convention used in this example :

    /* File : vector.c */
    /* Vector methods */
    #include "vector.h"
    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = (Vector *) malloc(sizeof(Vector));
      v->x = x;
      v->y = y;
      v->z = z;
      return v;
    }
    void delete_Vector(Vector *v) {
      free(v);
    }
    
    double Vector_magnitude(Vector *v) {
      return sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    
    // File : vector.i
    // Interface file
    %module mymodule
    %{
    #include "vector.h"
    %}
    
    typedef struct Vector {
      double x, y, z;
      %extend {
        Vector(int, int, int); // This calls new_Vector()
        ~Vector();           // This calls delete_Vector()
        double magnitude();  // This will call Vector_magnitude()
        ...
      }
    } Vector;
    

    The name used for %extend should be the name of the struct and not the name of any typedef to the struct. For example:

    typedef struct Integer {
      int value;
    } Int;
    %extend Integer { ...  } /* Correct name */
    %extend Int { ...  } /* Incorrect name */
    
    struct Float {
      float value;
    };
    typedef struct Float FloatValue;
    %extend Float { ...  } /* Correct name */
    %extend FloatValue { ...  } /* Incorrect name */
    

    There is one exception to this rule and that is when the struct is anonymously named such as:

    typedef struct {
      double value;
    } Double;
    %extend Double { ...  } /* Okay */
    

    A little known feature of the %extend directive is that it can also be used to add synthesized attributes or to modify the behavior of existing data attributes. For example, suppose you wanted to make magnitude a read-only attribute of Vector instead of a method. To do this, you might write some code like this:

    // Add a new attribute to Vector
    %extend Vector {
        const double magnitude;
    }
    // Now supply the implementation of the Vector_magnitude_get function
    %{
    const double Vector_magnitude_get(Vector *v) {
      return (const double) sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
    }
    %}
    
    

    Now, for all practical purposes, magnitude will appear like an attribute of the object.

    A similar technique can also be used to work with data members that you want to process. For example, consider this interface:

    typedef struct Person {
      char name[50];
      ...
    } Person;
    

    Say you wanted to ensure name was always upper case, you can rewrite the interface as follows to ensure this occurs whenever a name is read or written to:

    typedef struct Person {
      %extend {
        char name[50];
      }
      ...
    } Person;
    
    %{
    #include <string.h>
    #include <ctype.h>
    
    void make_upper(char *name) {
      char *c;
      for (c = name; *c; ++c)
        *c = (char)toupper((int)*c);
    }
    
    /* Specific implementation of set/get functions forcing capitalization */
    
    char *Person_name_get(Person *p) {
      make_upper(p->name);
      return p->name;
    }
    
    void Person_name_set(Person *p, char *val) {
      strncpy(p->name, val, 50);
      make_upper(p->name);
    }
    %}
    

    Finally, it should be stressed that even though %extend can be used to add new data members, these new members can not require the allocation of additional storage in the object (e.g., their values must be entirely synthesized from existing attributes of the structure or obtained elsewhere).

    Compatibility note: The %extend directive is a new name for the %addmethods directive. Since %addmethods could be used to extend a structure with more than just methods, a more suitable directive name has been chosen.

    5.5.7 Nested structures

    Occasionally, a C program will involve structures like this :

    typedef struct Object {
      int objtype;
      union {
        int ivalue;
        double dvalue;
        char *strvalue;
        void *ptrvalue;
      } intRep;
    } Object;
    
    

    When SWIG encounters this, it performs a structure splitting operation that transforms the declaration into the equivalent of the following:

    typedef union {
      int ivalue;
      double dvalue;
      char *strvalue;
      void *ptrvalue;
    } Object_intRep;
    
    typedef struct Object {
      int objType;
      Object_intRep intRep;
    } Object;
    
    

    SWIG will then create an Object_intRep structure for use inside the interface file. Accessor functions will be created for both structures. In this case, functions like this would be created :

    Object_intRep *Object_intRep_get(Object *o) {
      return (Object_intRep *) &o->intRep;
    }
    int Object_intRep_ivalue_get(Object_intRep *o) {
      return o->ivalue;
    }
    int Object_intRep_ivalue_set(Object_intRep *o, int value) {
      return (o->ivalue = value);
    }
    double Object_intRep_dvalue_get(Object_intRep *o) {
      return o->dvalue;
    }
    ... etc ...
    
    

    Although this process is a little hairy, it works like you would expect in the target scripting language--especially when proxy classes are used. For instance, in Perl:

    # Perl5 script for accessing nested member
    $o = CreateObject();                    # Create an object somehow
    $o->{intRep}->{ivalue} = 7              # Change value of o.intRep.ivalue
    

    If you have a lot of nested structure declarations, it is advisable to double-check them after running SWIG. Although, there is a good chance that they will work, you may have to modify the interface file in certain cases.

    Finally, note that nesting is handled differently in C++ mode, see Nested classes.

    5.5.8 Other things to note about structure wrapping

    SWIG doesn't care if the declaration of a structure in a .i file exactly matches that used in the underlying C code (except in the case of nested structures). For this reason, there are no problems omitting problematic members or simply omitting the structure definition altogether. If you are happy passing pointers around, this can be done without ever giving SWIG a structure definition.

    Starting with SWIG1.3, a number of improvements have been made to SWIG's code generator. Specifically, even though structure access has been described in terms of high-level accessor functions such as this,

    double Vector_x_get(Vector *v) {
      return v->x;
    }
    

    most of the generated code is actually inlined directly into wrapper functions. Therefore, no function Vector_x_get() actually exists in the generated wrapper file. For example, when creating a Tcl module, the following function is generated instead:

    static int
    _wrap_Vector_x_get(ClientData clientData, Tcl_Interp *interp, 
                       int objc, Tcl_Obj *CONST objv[]) {
      struct Vector *arg1 ;
      double result ;
    
      if (SWIG_GetArgs(interp, objc, objv, "p:Vector_x_get self ", &arg0,
                       SWIGTYPE_p_Vector) == TCL_ERROR)
        return TCL_ERROR;
      result = (double ) (arg1->x);
      Tcl_SetObjResult(interp, Tcl_NewDoubleObj((double) result));
      return TCL_OK;
    }
    

    The only exception to this rule are methods defined with %extend. In this case, the added code is contained in a separate function.

    Finally, it is important to note that most language modules may choose to build a more advanced interface. Although you may never use the low-level interface described here, most of SWIG's language modules use it in some way or another.

    5.6 Code Insertion

    Sometimes it is necessary to insert special code into the resulting wrapper file generated by SWIG. For example, you may want to include additional C code to perform initialization or other operations. There are four common ways to insert code, but it's useful to know how the output of SWIG is structured first.

    5.6.1 The output of SWIG

    When SWIG creates its output C/C++ file, it is broken up into five sections corresponding to runtime code, headers, wrapper functions, and module initialization code (in that order).

    • Begin section.
      A placeholder for users to put code at the beginning of the C/C++ wrapper file. This is most often used to define preprocessor macros that are used in later sections.
    • Runtime code.
      This code is internal to SWIG and is used to include type-checking and other support functions that are used by the rest of the module.
    • Header section.
      This is user-defined support code that has been included by the %{ ... %} directive. Usually this consists of header files and other helper functions.
    • Wrapper code.
      These are the wrappers generated automatically by SWIG.
    • Module initialization.
      The function generated by SWIG to initialize the module upon loading.

    5.6.2 Code insertion blocks

    The %insert directive enables inserting blocks of code into a given section of the generated code. It can be used in one of two ways:

    %insert("section") "filename"
    %insert("section") %{ ... %}
    

    The first will dump the contents of the file in the given filename into the named section. The second inserts the code between the braces into the named section. For example, the following adds code into the runtime section:

    %insert("runtime") %{
      ... code in runtime section ...
    %}
    

    There are the 5 sections, however, some target languages add in additional sections and some of these result in code being generated into a target language file instead of the C/C++ wrapper file. These are documented when available in the target language chapters. Macros named after the code sections are available as additional directives and these macro directives are normally used instead of %insert. For example, %runtime is used instead of %insert("runtime"). The valid sections and order of the sections in the generated C/C++ wrapper file is as shown:

    %begin %{
      ... code in begin section ...
    %}
    
    %runtime %{
      ... code in runtime section ...
    %}
    
    %header %{
      ... code in header section ...
    %}
    
    %wrapper %{
      ... code in wrapper section ...
    %}
    
    %init %{
      ... code in init section ...
    %}
    

    The bare %{ ... %} directive is a shortcut that is the same as %header %{ ... %}.

    The %begin section is effectively empty as it just contains the SWIG banner by default. This section is provided as a way for users to insert code at the top of the wrapper file before any other code is generated. Everything in a code insertion block is copied verbatim into the output file and is not parsed by SWIG. Most SWIG input files have at least one such block to include header files and support C code. Additional code blocks may be placed anywhere in a SWIG file as needed.

    %module mymodule
    %{
    #include "my_header.h"
    %}
    ... Declare functions here
    %{
    
    void some_extra_function() {
      ...
    }
    %}
    

    A common use for code blocks is to write "helper" functions. These are functions that are used specifically for the purpose of building an interface, but which are generally not visible to the normal C program. For example :

    %{
    /* Create a new vector */
    static Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    
    %}
    // Now wrap it 
    Vector *new_Vector();
    

    5.6.3 Inlined code blocks

    Since the process of writing helper functions is fairly common, there is a special inlined form of code block that is used as follows :

    %inline %{
    /* Create a new vector */
    Vector *new_Vector() {
      return (Vector *) malloc(sizeof(Vector));
    }
    %}
    
    

    The %inline directive inserts all of the code that follows verbatim into the header portion of an interface file. The code is then parsed by both the SWIG preprocessor and parser. Thus, the above example creates a new command new_Vector using only one declaration. Since the code inside an %inline %{ ... %} block is given to both the C compiler and SWIG, it is illegal to include any SWIG directives inside a %{ ... %} block.

    5.6.4 Initialization blocks

    When code is included in the %init section, it is copied directly into the module initialization function. For example, if you needed to perform some extra initialization on module loading, you could write this:

    %init %{
      init_variables();
    %}
    

    5.7 An Interface Building Strategy

    This section describes the general approach for building interfaces with SWIG. The specifics related to a particular scripting language are found in later chapters.

    5.7.1 Preparing a C program for SWIG

    SWIG doesn't require modifications to your C code, but if you feed it a collection of raw C header files or source code, the results might not be what you expect---in fact, they might be awful. Here's a series of steps you can follow to make an interface for a C program :

    • Identify the functions that you want to wrap. It's probably not necessary to access every single function of a C program--thus, a little forethought can dramatically simplify the resulting scripting language interface. C header files are a particularly good source for finding things to wrap.
    • Create a new interface file to describe the scripting language interface to your program.
    • Copy the appropriate declarations into the interface file or use SWIG's %include directive to process an entire C source/header file.
    • Make sure everything in the interface file uses ANSI C/C++ syntax.
    • Make sure all necessary `typedef' declarations and type-information is available in the interface file. In particular, ensure that the type information is specified in the correct order as required by a C/C++ compiler. Most importantly, define a type before it is used! A C compiler will tell you if the full type information is not available if it is needed, whereas SWIG will usually not warn or error out as it is designed to work without full type information. However, if type information is not specified correctly, the wrappers can be sub-optimal and even result in uncompilable C/C++ code.
    • If your program has a main() function, you may need to rename it (read on).
    • Run SWIG and compile.

    Although this may sound complicated, the process turns out to be fairly easy once you get the hang of it.

    In the process of building an interface, SWIG may encounter syntax errors or other problems. The best way to deal with this is to simply copy the offending code into a separate interface file and edit it. However, the SWIG developers have worked very hard to improve the SWIG parser--you should report parsing errors to the swig-devel mailing list or to the SWIG bug tracker.

    5.7.2 The SWIG interface file

    The preferred method of using SWIG is to generate a separate interface file. Suppose you have the following C header file :

    /* File : header.h */
    
    #include <stdio.h>
    #include <math.h>
    
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    A typical SWIG interface file for this header file would look like the following :

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    extern int foo(double);
    extern double bar(int, int);
    extern void dump(FILE *f);
    
    

    Of course, in this case, our header file is pretty simple so we could use a simpler approach and use an interface file like this:

    /* File : interface.i */
    %module mymodule
    %{
    #include "header.h"
    %}
    %include "header.h"
    

    The main advantage of this approach is minimal maintenance of an interface file for when the header file changes in the future. In more complex projects, an interface file containing numerous %include and #include statements like this is one of the most common approaches to interface file design due to lower maintenance overhead.

    5.7.3 Why use separate interface files?

    Although SWIG can parse many header files, it is more common to write a special .i file defining the interface to a package. There are several reasons why you might want to do this:

    • It is rarely necessary to access every single function in a large package. Many C functions might have little or no use in a scripted environment. Therefore, why wrap them?
    • Separate interface files provide an opportunity to provide more precise rules about how an interface is to be constructed.
    • Interface files can provide more structure and organization.
    • SWIG can't parse certain definitions that appear in header files. Having a separate file allows you to eliminate or work around these problems.
    • Interface files provide a more precise definition of what the interface is. Users wanting to extend the system can go to the interface file and immediately see what is available without having to dig it out of header files.

    5.7.4 Getting the right header files

    Sometimes, it is necessary to use certain header files in order for the code generated by SWIG to compile properly. Make sure you include certain header files by using a %{ %} block like this:

    %module graphics
    %{
    #include <GL/gl.h>
    #include <GL/glu.h>
    %}
    
    // Put the rest of the declarations here
    ...
    

    5.7.5 What to do with main()

    If your program defines a main() function, you may need to get rid of it or rename it in order to use a scripting language. Most scripting languages define their own main() procedure that is called instead. main() also makes no sense when working with dynamic loading. There are a few approaches to solving the main() conflict :

    • Get rid of main() entirely.
    • Rename main() to something else. You can do this by compiling your C program with an option like -Dmain=oldmain.
    • Use conditional compilation to only include main() when not using a scripting language.

    Getting rid of main() may cause potential initialization problems of a program. To handle this problem, you may consider writing a special function called program_init() that initializes your program upon startup. This function could then be called either from the scripting language as the first operation, or when the SWIG generated module is loaded.

    As a general note, many C programs only use the main() function to parse command line options and to set parameters. However, by using a scripting language, you are probably trying to create a program that is more interactive. In many cases, the old main() program can be completely replaced by a Perl, Python, or Tcl script.

    Note: In some cases, you might be inclined to create a scripting language wrapper for main(). If you do this, the compilation will probably work and your module might even load correctly. The only trouble is that when you call your main() wrapper, you will find that it actually invokes the main() of the scripting language interpreter itself! This behavior is a side effect of the symbol binding mechanism used in the dynamic linker. The bottom line: don't do this.

    swig-3.0.12/Doc/Manual/SWIGDocumentation.pdf0000664000175000017500002345731613042756703020402 0ustar williamwilliam%PDF-1.4 1 0 obj << /Title (þÿSWIG-3.0 Documentation) /Creator (þÿwkhtmltopdf 0.12.3) /Producer (þÿQt 4.8.7) /CreationDate (D:20170127235435Z) >> endobj 3 0 obj << /Type /ExtGState /SA true /SM 0.02 /ca 1.0 /CA 1.0 /AIS false /SMask /None>> endobj 4 0 obj [/Pattern /DeviceRGB] endobj 6 0 obj << /Type /XObject /Subtype /Image /Width 167 /Height 85 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 7 0 R /Filter /FlateDecode >> stream xœí?hWׯË)Ö00… ¸pcH#ìÊMЍPT7®Ò5†HÔ ÁàJÀ*W5UÁ0¤ ¸ PBã"ìûûæùöpæœ;£u,íÈÖžbÍÎܹ÷>ç<çϽ³šN—²”¥,e)‹–;wî|ùå—_}õÕØ}YÊyÉñññƒnß¾}óæÍ3¹víÚõë×ÇîÚRÎRö÷÷ïß¿ÐÂ÷‹/¾Ð§èswwwìž.å£D¼nf¢cûäÛµµµ±{½”–íííG}óÍ7P7t}­•«W¯z¬N†c]†g{K9]^¿~ ÊE_o%uº®óI®÷±´”²¼|ù ¡î[·n hc@Ÿ}èëöW¯^=¾¥ü¿¼}ûöÙ³gwïÞÊÞ–Žög¶tA<™L8à³hòÆØc½ÔrxxHnEúl¼-=?o×­p½€6Äñ¿keeeìq_:yþü9¶¦[(ãgû ökÇSn>ð×É=—BÈ­îÝ»§x±ÉZ>ºÏxýÁ•+WŠˆÏë^{âÞÞÞØSòy ýí·ß®®®Z6ÀÕv`æ¬Ø«Apܼ½?éU%X=‰ÀØÓóùQ7@r hfêžÇGÏÃÒWUe¦õǺÌ.ÎAݲû‘²½½­R‰•łΡWÑ–3‡Yºø©¡LŠ*ái„kÆž¶OOlÝʨ»/{ @gî |n‰ZÈ S;ðŸÃZ!mmm=‹Ÿ€DcѺˆrŸ-x¸Ì02…lÕJ w#ü ý•VÔ‚®4í²ž,—Y‹òîÝ;Ì!T¹ûPî×su°>á¾õ ÷·x>÷-ø6íÛà÷ÕÉ¥[7yûö­–3Ì¢3Й«Í]fêgLf†á+™¶§qÃKº—ûP»ø-hN¸¬žùþùgìùMNNN¬ÐíëŸÅ"vp—è@Ô‹`¶vÞSwø4ãåAèáÆÆqão¿ývttDJøÃ?ÀÒÊã²[ fjc<¿¹¹9öÜ/T~ÿýw|ôýû÷uûúg®p3ôáOÅÏEWëq Ÿ¦žÌÕ8Ý#|ñâEq,èCÀºïÏÚù KâÖŸ>} u¯¬¬øZ·£½iÖ)Ö äìƒÁú ÔÎíÛ·íJ±{·3BüÔ¡¡½A }™.óRóùfëР8Ð,Ú/S^m¥èµ³ý§¨t>" ¾¶¶¬¾Nî;X:ýÌöG=|øðÉ“'ýõ—„ö›¶(g~$8—¢±/s”÷ïß4“¬`,-‡÷¥]~Òø9 –½³·ßŒiŽÖ|;ºE…½mh?þø#.‰OøàÁƒ¯¿þ/OðÉWœ©»1üpæ.ÜQ•ñ€úXùù矵tåw(*kf;Ftl{‡2ÖuJ¥ÃìõYq>¼î –Š-vž>{3k¬'æîÕÕÕ{÷î¡ëëë>œøô<¯‘ÒΈ¨ýÙßßG½-ÄÁ¨ýö°,Û(½qyP°GÐwÞÛ²7doøùÓ²nKg˜³»Ý ŠM@â ¸µ"Ï$ðgà–"ô«Ç~n I¯ü®3jƒÕ"poà>&Û€iTݨ,ã•A ül¬BoÑY£ƒ1F‹Ø·¶¶°qÎ4©ÖÇpì|ÕõÝ![7Ðý½$€£BZ–ããc€Ví¶ B0¸i³ë`àö§EkMªŽfú5ë.ZtQÔàãÇ_¿~1òÜ¢™I@6ˆQË_¿|ù3‡Þid⊱MÚYQôJ6.m°i\ªŽ|÷Ýwc#üBPjõOruûõnzxgBƺqÏÉöY=ÝCcÑ¿ÿþ‹÷ÔSú€öj¦§3^ÅçD,»»»ð[ˆÄ4'èþ´NÑÏÝÔÛ0ÀÚEïͨ»§¹Z¨–iû%iíáΰÿôƒõyw“ªjU7eö¬;€uøVN™ Kä€>g¸C²æOrûÉÉ ÷þòË/X:aªõŠ>“b|ø™hŸ9 fÞÉkf 4#‚ýTèÖûVÞ–=¸ñ©Ûɸá3èù@É¥*•F‹ÊЧ\ƒ14Ì|Ú¦T{”û‚@‰F-¢ÀÀgýÄ´ŽŽú&vss3ã>5WÂ}1ˬäV»Ö•LÔkï”û Ù3ùÀ•Þ3ÖN,CÆè™Ág^}Âé­€ÛÙÙÁ6‹Ôѧ3<èÙ³gÓvˆ(¡óÌÆpÙógb‡Kñ=e1‰Šê}´Áê?û{Ç&q»¿Ò{´IÚYjSáç'„CtàðAx¢.¦í|j¤ö™Œ¡êM›Ue>/>[ÊF‡×ÖÊß!Ib4Š+™U]LÌ-x÷# Æ.7´Ð‰-w.úhoÝEXÚŽÍû‡¯2«7]W¢37pm)¸ÛLö™ªœ2ÁOÛXÐi$]´wëªáâà®Ç5mz¾¾¾Nƒœn|Ç­‹QBˆSÞ|: Xf¥W¾`2wœQž¸e/»qX1ôëóx3gJÍB¶P÷@UÇM»¨(ӫħ:Ó™¦]NÕ¿ÿþû'OžàMàä;­@>4‹Kïïÿè^Õ¥÷`ï$Åç :Âp†áú? ¦|×Þ¢ ÓsâžáÃSúÓO?MÛ7 ™g&¹ô˺] ¯ ·›”w¼½3?ø™ <õFzu&Ó2Je: è™Ï‹Ì¦ å€A"¶$Àêñõš,Ý&¡î:‚ wøD`E¦KEG~(WÊþ{÷«gVC%ãÈ¥i²# 7¿àQ.ÞXÍb9[W…ÃñÝ4èMØFÄ(ÀZWr S¶âÐ<¥œ«ÞôYzÓeu‚1¯*M—±çióùóçꌰð1|Õ­g2Õr ºnç–Scx¾’êå´,‚[ŸtWßÂɺ-Æê¡0<1&™QS÷P ]‰rúË*W‡ïóìð¿RËs&< L»éÖÊ2ôÙ~­<µÞ $¬¢tq.†¨ÕUÕ»2û逮Št=÷2±M7–+ÆðRlŽèa¾¬O4:%nè ¶ î´`“¦5&\™¹@‡‹Lo‹«xÙØ°Ìúþý{{«+Cß”¼pæg»EDýæÍ›ð”ƒƒ(%k—4Äœ V-›Tš3iZþ´H 24ЫR ï73¨®(ƒ+¤]UÊÖHÞÂrÕß~ýõWz¢B_1 Î|ê¢8•ú=ŸÐU·¾äYq1ÙºV}ÁF0=¯Œ]áqŸ0Õy¹Y¨ –àÆ\Ü65@·Õm&Ü–?lÖb9|úôé´]!U06)¥êÅF4F¸]÷?ÿü“’,2'£è¿HåèÝ×á/f™•á÷9\oõÁî‚zä®â80[½’ããc±Jˆ÷üö3èQ;Žì‰š €XL,]ÞÙfquUnÛ§í†LÔÃÚpçUö$f×Aè¡ê½9xSS! $Ÿ©òÌess3Ó»÷æ“n”³v…Êik­k­(âÂ*‹L‡¯?~ìUÅ>½·…6¹X‹|ËyÓ¾¢YÜ„Nã¾.—éÝ[ºžk­½ÖÞÒû¬Þ šC—†×¾¸6NÜÚÇפc_‘Ðü̳ó#¦²íLÙ„3Ûî­]d ¬Læîî.ÀáÔ´ÏcwpôÜ^w£€³~±7iÁ7J–moø‚> +$ ð]n]‹ãÚÛVw³¼c·©¨ñ¼½[â¦NYƒÔ¥Ý5‹Yf•±dŸX½½qæ´Uò½½=½® GŽrðÀþq|k)*1<àj[N؃ !ˆL!_iÅ;w¯š[ÁƒäÖÍyè>Qƒ«ƒþ(§à…d2ÏÊÁ›‡¯¼W]èô?{`õ¢™[1ði»…‘bãÊÑlG(Q.5´c>B|6óº”ÂË!ž«¨†c¹´u¸vÙG3{1‡–®â,lKUØéÛ©Ý‹œfì1ˆcì¾¹`ÚtŇ¢h$£ì7EÕÓzeì¡x`ÙâŸþd¶_‰‡~ 5¯¥ÁØP}ôè‘ÿõ³àbügX®g»GÔönïŒcÜj…ûÕŽ`éfì€bÑ>à¢DÈÿý·çHÓ¿§mqLk9.N¸Ü:½¢Ái[„W<0§ÌCâ]‰×_p¶¹]@âvtt$ŸëÍ<¸ò*í7°|ؤÜ1UÌ_« fä³$4Æðöîw˜cÑô +†Ò‰ ¯µ¿§JS/^¼Põ{ÚsT~/Fqa¶%Ú< \³xàcÐìkaødvîÞ§/Æ­[¥´)Õgªn-Ñ›¼\@øÖ@Gµ /ÊjÑÅÖ¾Wô«ñ¹`M€DÜEÌ:«««0p,É¡ÈT!¯Þس‡µ²mÒT‘ÞÏCB¾æ»——–„ÍyƒnËmq}0óÊù÷•Væü9k,—+17kГ†Êéºô9å}wïÞåóøøx§•i«?¶æ’g8Û”¤nsL•OœopÃgŠ’£‹Êñ|16Æ.À­£üÞÒ±{Ü«v6mÅcÜØØ8<<~$usenß|®®$,eHÉ )ÌßšâX¥ûföÎ`6íPˆLæì#%gú6‡k 5¯å2ç'Vɉ•‡Ø&Ê®Ìö C³('Ðë]6h­M% #R•2¨ºJZi¨UÐ~u|: ûŸT%`è>F “Ü·ŒòP›ó‚Ðo&!¶ð•QܼyS³‰)!]€h…ô*¨bÆ=Ø)=§ÛWz×ÏËI%ÔzÆ«‚F°;}Jat¥ÒUí—àítâOº8ªêšR ô3zžkL ƒi׳•A1-¿S>²x±W±rE.s{ŽÌ)k,(°t©¯:¼üõÉɉ¶³6n³=H‚mEè4‹þuÓ²l9(eópvg"9_ȉ­€fhŒd fÑ×îM«lã9’ø9·8\¬e¢ÁZFƶ¯ø–'³e5•\¬cäæ\‰0Qð÷ÚïЦ~ôcN\úÔ`~õ¸2'³boÆŽfBwôÿ¢½¨¨­SÖ[}ÎÐsùKq¸¯éÙ¨µ»°ŒáŶ¸Ò@½Þn+w Øôs¾Øˆ¨ƒ¨žx^kµ§‚b¹á©WÎSŽ«ºŽ;Çc,T;]‹îhã¤HïÁOù)åLEKÕ>ÕÞ¨^uo&3*ÔX ¾ÝeÛ¢ðwÚ‰¤”´ÙÉ:9ÏÙYI(¢†3|H?™É\¦¸˜¢­SÁ†îKÐÜ ƒI«IÆÁhDãh‚~zKâ@o©xÕ2E²t€k s•hÐ{÷P+8áõ–SážS² …,À»i0 _ºoOÅmƒÏ¹›?«n_¹è]à¶´}Èo"òš¯ŒÛ‹¦*píÝ:¾‡&T·BÕ}N)>º¯?FÝX4z¨%ÅOh/¶uª˜ª‡@Î;ô:½ŠÕçȘ.®äAú}€œ[ù¤Àûˆ9k)óØø@fm´veökZëeôÞÞÞg´ˆ7ÄrÁ­PüŸ2áöIÙ@P5¯B!V´“á ¬y –ó$o“ Ór§6´ ³ŠÀ¥Hþöº[Ì?ë¢IÛJ¡,¦[ïÄ]ÀjÉ(^¹8cŸÙºýlÛW6½kÇŠ0U—7ÖÙ‰„'zGŒÚkiíV4r«Ð}‘«%£VYLÙÜŽ`hþ«œU¢ð&Ÿý{P`à™·ƒE+ä†j¹?•jÉ(Âäh¹mâ^W ±J¡o íª¡YZí/+ƇáÛ¾63ܲhåV–D_æßÏÿPцÏÚ|¶ž!¶ó9- ¥¶*Qth$/WyÈÔ­ÂÔMRЗ*ä>[Ñr[ÑÌ:}“%­I©Œï£XðÁ˜m/Q}iCî³ýþ’É$-·¸‹n:Ä{™%|Sk´ Éûô:óç]-Eˆo›ôþZÕõ¿ž±ûl<`Ê*yó[©ðNö§ÖFÜ[rIäÍ›7á‡÷Mú²õŒ¯g€`¼boÎÍlËj;K ,ú=Û\Þ¶JQÜÄÕëÌG‡Þ¢·[L@/“è±Ä»›´#:ZÁ‰{¬ÃeÕ?õò>Iôè‹ !– –î£/û¯|xV\‰þ­’¥,^H…¼[Ÿ¤ÿlXu“è>ê&å×{ÜÚ[²,‹]dÿD¾:WdûD«ZòðáÃeµäÓ[yñ ߤŸ Ð7nÜÀA[Ylì¾/å?ŠvD7Ýÿ›f¿ƒ*s&ä&‰ÞÙÙYæVŸ‡ºÿ[~«˜Ö­–!÷ç'¤ÌöŽ!÷ÖÖÖ2» ¢½ŒÄ–²” +ÿ­/›Ä endstream endobj 7 0 obj 5043 endobj 10 0 obj [0 /XYZ 32.1599999 734.419999 0] endobj 11 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 12 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 13 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 14 0 obj [0 /XYZ 32.1599999 683.539999 0] endobj 15 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 16 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 17 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 18 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 19 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 20 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 21 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 22 0 obj [0 /XYZ 238.559999 683.539999 0] endobj 23 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 24 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 25 0 obj [0 /XYZ 28.3200000 785.299999 0] endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [28.3200000 785.299999 28.3200000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CONTENTS >> endobj 27 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 630.740000 117.599999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 614.419999 92.6400000 622.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_Sections >> endobj 29 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 605.779999 186.719999 613.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_core_docs >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 597.139999 206.879999 604.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_language_modules >> endobj 31 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 588.500000 182.879999 596.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_developers_docs >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 572.179999 61.9199999 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface >> endobj 33 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 555.860000 115.680000 563.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 547.220000 127.199999 554.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 >> endobj 35 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 538.580000 123.359999 546.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license >> endobj 36 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 529.940000 128.159999 537.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 >> endobj 37 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 521.300000 117.599999 528.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 512.659999 163.680000 520.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 504.019999 180.959999 511.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 >> endobj 40 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 495.379999 155.039999 503.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 486.739999 120.479999 494.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 42 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 478.099999 104.159999 485.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 >> endobj 43 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 469.459999 117.599999 477.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 >> endobj 44 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 460.819999 116.640000 468.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 452.179999 187.680000 459.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation >> endobj 46 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 443.539999 173.280000 451.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 434.899999 209.759999 442.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation >> endobj 48 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 426.259999 145.439999 433.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 417.619999 152.159999 425.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples >> endobj 50 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 401.299999 79.1999999 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 384.979999 127.199999 392.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 >> endobj 52 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 376.339999 130.079999 384.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 367.699999 132.959999 375.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 >> endobj 54 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 359.059999 179.039999 366.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 350.419999 179.039999 358.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 >> endobj 56 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 341.779999 193.439999 349.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 333.139999 199.199999 340.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 >> endobj 58 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 324.499999 147.360000 332.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 315.859999 188.639999 323.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 >> endobj 60 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 307.219999 177.120000 314.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 >> endobj 61 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 298.579999 201.120000 306.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system >> endobj 62 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 289.939999 158.879999 297.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 >> endobj 63 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 281.299999 137.759999 288.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 >> endobj 64 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 264.979999 130.079999 272.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 65 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 248.659999 153.120000 256.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation >> endobj 66 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 240.019999 183.840000 247.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable >> endobj 67 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 231.379999 160.800000 239.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 68 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 222.739999 286.560000 230.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio >> endobj 69 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 214.099999 167.520000 221.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp >> endobj 70 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 205.459999 172.319999 213.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java >> endobj 71 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 196.819999 171.360000 204.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl >> endobj 72 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 188.180000 180 195.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python >> endobj 73 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 179.540000 173.280000 187.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl >> endobj 74 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 170.899999 163.680000 178.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r >> endobj 75 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 162.259999 175.199999 169.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby >> endobj 76 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 153.619999 292.319999 161.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers >> endobj 77 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 144.979999 174.240000 152.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 136.339999 214.560000 144.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 79 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 127.699999 296.159999 135.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys >> endobj 80 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 119.060000 259.680000 126.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin >> endobj 81 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 110.420000 252 118.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives >> endobj 82 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 101.780000 273.120000 109.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 83 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 93.1399999 226.079999 100.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file >> endobj 84 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 76.8199999 105.119999 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 85 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 60.4999999 189.599999 68.1799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn2 >> endobj 5 0 obj << /Type /Page /Parent 2 0 R /Contents 87 0 R /Resources 89 0 R /Annots 90 0 R /MediaBox [0 0 595 842] >> endobj 89 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << /Im6 6 0 R >> >> endobj 90 0 obj [ 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R ] endobj 87 0 obj << /Length 88 0 R /Filter /FlateDecode >> stream xœí]K¯Ü:rÞ÷¯èõÓW$‹‚®}ì Y0l`Aç…ÁxÏ,ò÷#’êÓU|H¤¤nµï=Ç€Ï!)–(±¾"ù±Xúé_?ÿ÷ùÏÿ<ÿôþóÿž¿N¿ß> —Á ñçìÿý–fHwQ2þi¾Hô?ç¯ßNßÏßOŸNŸÆÿýïï'aBåé×xÁõ6Qè?¿þýôSlÀ)æ|~ÿã_ÿw–çS=ÿç¿þ0Éô|;94þ¿Å?„Ò ú—/üËé÷¿9ÿ}l‚ rÝæ|­*Â?Z5»Kxh!ÇÿôøìÿøãéO£„×[_ô ƶ[Õ¿g¥»³@/€±™w.î"\ÜSøØò;¼1þ¤Â¿¿^~½X¹ çTÉ:o,Œ`sÚKÔ£¬óOÿöÍœÏ/ÿã10¯Î"SgÁÔYÞÔùûLÅw_N?}ŸFž¿üi, 퉿¾|;)'Ç”Òç/8ÿˈñ»ó—¿ž„½X4ÎêpU,‘¡d”òš£âµòZ I¯…P"áâp0¬DÇ:ÃÅh_@JL,1·rÜ-Ãe—`zÉÏñÎê"T¬ýï²Êïc\ä´ÿ¥ú>Dù&oÿÇš41Ô¤ Q{B¦­¹6öƒ»¾ì¹gžÚòá˨{7…¹}ôz!”õ:Œ ßNV9šñ·Óç.Ó[ÕÕ¡]WalÂo%Èë³LZ&. |WϾ=]íS}{ÕÍÕ.ѶªèieáÚuv.í¬™xÓ û«ñ‘ 0v¿’‚›ªRÇeÝ?™*s‘Â?&½^˜JJ¢ÊèqfäDÉT‘î ©¥ri§“+¢¡â¢!11ïÒºÑNÙKÔÚ—ê+ˆvJ¨këSm(H›´¡ m҆«˜æZ.}×=óÄÍVÊ[ y³QšÑj£ ‚ ž•n’CZ\œì8s0vúk¼¿VgsµŠCH~=}¥s"–« Tôxñ˜œ*œiUpLô˜¯&·öåÈ*#ý—Ó»ßÜ ¤Xé˜PZ·¢´¤ÖªZUÒÕ’ Z³yEƒºù&c¢P@3¼¾Íj•€±W#B^UC¨×?•õÉ×K}òëx?{íêXnxmC¥ûË}ÆkZÛ&}LúËow÷å¡m·Ú¼í^¹>?\·„g«ÊªeåŠöVè«¥†·dÖßUMòûÔz¿¼VðK3mûP½_Ùý>V›–ݯ ž«}ÏùÂØWoZž*$E]ÈŽ0^F­Weá†:¥Íhƒ­3 l-ÁÖ!Ö˜ä° å†×6Tú[§K°——L:$°õå¡mšÁ–J?¶x¹M3¼ØÊ²§Eï¦Ù6ip ²ºP¼®$à:—¬k¨È2²&Úªº¿‡Ç$sHeYF“q€¸q€AŒ –Â×'™qˆå†×6Tz40¨‚q€Aré’‡PÚ¦¨q`Ò30à²6×ñœ-·ê—Ö—¡5[å×u¶>È¿¡ug´‚ ë²qµG3®h½ õpwŠŸ—–÷â]uˆ«¯æë+sÛ¼þž! >6/ªˆ=$½mM V²55XUXSƒÕtáë“lMÊU*:¬©ÁŠÂšìÀE|MÊ‘UF.ú°55X[S¿IÛˆúe š™¡ú2¨Ý,̘½þ¹ÐcVýM‹|°tîÍØä¤`‰Td¤’Or` •he ¢#\‰TÇH%Ÿä˜TÞQR‰‰>¨Ûð~Gq⥂3´8õ)1ÛbÄÉÊX†fl‹‹°í“7öIáA+À¢[‹Ÿ†Š K(GV¹èÃÀ¢Eu²’ƒåÃó‚¥J̨w} é˜ ×q%Û±¡]"Ҍ؆cCÚ6$2–˜`׫ TtĆÔ%lHà¢!Á†/GV¹èã°¡D;6>>-6V1Ëuµ^ž Õï·qCŒV’1H36ˆ®tBZ—`–é:ØF¾Xe ¢#Œ@•`’‹– Œ|9²ÊÈE#ÀfÉL™Rm–u­Ñóud¶—5º>欙†Õ—5û †n`Í¢Qcø2^›Ò2^¶Œ÷IŽ–ñ´2PÑ5¦´Œ×f࢓e|(GV¹èãPcÚ—ñR-¢ªÃEùÎIÇ´¨ªÍRWÙ«‡‡s#tZEšvº¶ÚDÙþnf¬C6á­¹={c[a´ˆ¦® ÒIš±Ñ 8N‹hW¢E´c´ˆOrƒâ-B+ Š-Ñ"Ú2ZÄ'¹A±Ñ„XJ‹0ÑÇ×N‹Èl£$3(X5(Šê.lí(Êáœ!¢cÛ'V…dÆGî2½žik{Ó–·º7Y©Ž­îg¶EÔCã°ë„ ë„%ÖÉ ŒuòIf‹B9°Ê@EG[„EÖ 9ë„)ë„‘uBÆ:á3°NfhgdÅÏ•\19èç^V3úW]ŠÊ—fû5#¾>«ÊÞ>èϬŸ³Uy“™_ù®ó.™‘„uÛZßc_±’Íû–†d9/G„‘ŒmVÁηQâÛŒ`|›Or« ßF+¬‚%¾Íࢾ-”#«Œ\ôqVA¶ómj‘(P¢fVy}¬Ë¹á&¯­l`Î ÈùÃ\çQÒŒ`QœU3ªÄªÅX5Ÿä`QU£•ŠŽ`Q%VÍ(ÉE'¬Z(GV¹èãÀ¢ÚYµì Uqiò\^3ßí˜ÕÖµ¹GgrZÚÑŒ:«9§et‰Ó2šqZ>ÉuVN‹V*:ê¬.qZF\tÂi…rd•‘‹>Ngõ×”e_•™y`¶¸X^*­Qó̰Ã˽×Ì#ÅÒŒzo9õ2¾â’Þ[F½ø$×{¨Z¨è¨÷¦D½èŸäzo¢¦J½0ÑÇé½íðHÉ®XvQéðѪOIV8uÖ§K3%Oâ"êÁbéY 4£ÉŸÛ¸äŒ–q¥3ZÙ-ŸdþܱÜðÚ†JþÜãâ³àÏm;£å“ÌŸ;”‡¶±3ZLúaþÜ;ÜO‘±Æ¿±¾÷ÞA¼eZØÁv,ÿÛ[ô†sê nêbM@·CrªË¥S]v`§º|’=–^ÛPéèv(ê²péÉ©®PÚÆNu1é‡Ý7ðž@_$•ª"°}ƒN-Oß0º£VÐÃUƒ¢m•Éá*+K‡«¬d‡«|’cTÆÃU¬¶¡Ò'ŒÊÒá*+%—ž® å¡mìp“~FåJ¡£‹î£õ3“kˆü(vì;VQ›o¡uxaÔ½š2C¦«BÞ÷àMÑãQƒ¥ÛGÕôÌ߈èÙ›µ\a-“ÎòGQ]©÷æ­%ÈÄZ‚*YKÐÌžN¬e(7¼¶¡Ò'k ¢d-aàÒ‡ÄZúòÐ6Á¬%Èg°–°…ÌZ¶–‹Å*jPÉç}Í–Ä®x 4Z  nB4£M‡Íè°%6Ši™Q‰‡rÃk*}Òa%ÖŽI×.Ña=)-©ÍÛ~¤›=‰©Þ¼ÊÖt8›jÏó޽î5Zù× Ô†¬¥Fšq×SÇ_'o©CT¬ælUl¯úQâ,`ׇê4§¢¬*þÑ1ÄÜ@íÍ8 “Œm亓ܗÈÉ’/‘SÌ—È'¹ÊU*:ëN–|‰œd¾D>ÉÈõPެ2rч‘ëN©fƒ´…̦÷«æƒ|A1ø £Eªc'Êѽ}Ü“dl p%ÌÅÆ'9X ¸ØÐÊ@EG°@ÉÅÆpщ‹M(GV¹èãÀ¢E;X–7žÚÁ"§³ù)š]ÜgžÔ…@ I36BÃp‡gJ5Î0‡ŸäÐ0Á¡†V*:BÔjœ‘\tâPÊ‘UF.ú8hl‡Æ"•¥êþñÏs0´ £ƒ&ßm衎R ÍhZ6:—PΕ¨çõá“lÙË ¯m¨ô¸laQX6Ž5¸ô„úå¡mŒú`Ò[6:g×Ceͤì0„ìB!¯ð¯Ÿ<[Å„·—3GÞÖøq·âÚ«•£ÞJÍh6 „C‰ÂñA>É€Ë ¯m¨ô ØXâƒ2>È'9°qB22>ˆI? Ø8è=½¼)[¥0·œGšÙ¢©»aÔµ{yÏw—c»¢2xÃÁp¼‘Œ6¼‰Äý EÉý %sòIŽ79L0÷'"=â EÉý sòI†·PÚÆÜŸ˜ôãð&;¸‹e¼-ÎJ;Pé“…¿¢çžG±éÄÂÇ8ö´>réZxÕÎ6o ýÙ¿SÙ¤»âôöDðíØÅÍß,³c¥Û±þ¨1nK¼QåÍŽ[E3¶Ún#®!ö¹àñùC:±1B?­Túd#®Qö¹à!úC:±1H?­\ú6Ú™éåœÇ}f‹ ê`–ÖP?œaÅo¤f×øýfiÆ] ‰Á©ªÈÎ Mg¡ dõïÖü¬8 4sÖ)›XeßmÄÚh5Ó’ì»+N6ͼœúÙªìÝWA5ÕO1*Á¦7\olÚ¶‰C+M7°#YBE36=BH6ô¡ Cl›(¤ùЮV¨ô8ôŒ?…¡Gˆ!‘žlÅ+ÕG.ý¸¡G›¨E}èÙ÷‹•¿’˜sokE•' ™Õ6 qã¥4£Éça„ãm42¦ýêó0æ2¯âf^Ó† 0ôÑíaå´ëqfÕ¥ã7‰gq¼"´ð&€?Ážc+ôz”ÿÂ#»uƒŸ™_îá{Q7H9ÿµWÒ¨7~GI [‡fà{J{Bó½ŸN†f= Æ@÷nÒ§¡J{øÞ€O'C3ĽR¹ô‡f­ÚAû¼ßÒý…Ú‚ç‰F`M¦ÞÖÒŒÆؘd¾Â‡Àùi0 NC.`è ®#ðÁ|6ÜÒØÀ4äÞð'8t¶b=˜Ÿo&ÞãŸðoƯ"³g8¦Gµ-‡éŸõS­Ó{[+žqÇ8v  ~ £Ý¤”+ÎÉõt}Ç·îWÄGéÿ”XS¤–úä¥Ýe°Çá¦õ,ŸJQ ý¹Ž‚•“h9øaÏÁqü÷?žÞ=|ä’ã‚`š{Ýœ¸Çȵfl«;ä~hì7Ö:H¸zþ–±µßä(ãà~“C³·G¿-Ÿ8þXµíß­ëÛÐÅ’x¨)?o¼elîbÿ™¿ƒ»XvÐ:{tñò!×{þlíkâ«"ýIÿ[Ææ¾&G÷5l`Öôõò¹Æ‡ž÷kU⌠„¥›•@ÃáJ`\ãC_„[¥§MËÖ5d1Hš±¹Gíá³+i;»Zv"VÍ®‡¡w™C9E36÷?‡ÂÇΡ–ë_ÖÌÖ;Ù¦AóWZcÏ":YšÑF*‘lÞ)QÚ¼S‚oÞù4§ã† 0ôu¨†ÒæøæOsê0\Z8°Í;zƒã¨C%våýI³7ê°.õWD*a8ux˸7uxÔu¸‰:ìørµãå>eßm¯ïqZwòT ­E ˜ [õJò­z%K[õŠG@i¾U¯b tZ¨ô¸U¯di«^ñ è!Í·êU ƒNë#—~ÜV½R‹óE席úiÕU^FdÃÐ*sµ¼Ÿ±§zý«X=M¬÷@³m¡6Â÷Uß^¾‚d/_Ai/_ßËWîåÇ+ `è ®r(íå+€äé^~¸"¶íåÓ8!×,Ì^µ?t±;Í^gG`íž ¿dWÝ8ׄfsH3¶9ÊN³)ÓA³=ÄEö Ô‡ƒú¨Õöc&%ÃÓºB ²7þbÀý޲ÕàêoÄàú Ù\uÊ Õ#PC+Qž¼<¿|Ãômn²¯îp¢\¹¢|ûºÈb¾Ù×_­}=hMÚjV#fUҌ͆wI¡c³bCðËŽ»þ#‚F<À@6PÒŒ;n äʺÆKu×èv¹rìz<µ'â_3-Í{k4gÆ”ºož•rHtÊÀ+üK!ÍY)˜¾eÁzƒ‰•‚ëç(+üc!ÍY)˜>gAð'8’•¹ƒ^ãÍÙî‰/^²ŒgÝÍ\e„½ÂfF«‘?IØi­iÆ=÷s5ÓügáÜZ:àmvœírj®FZ ©mØåÅCÙ*…²ÅCÙJCÙ…+€Õ*=îr‚*…²‰ô4”]¸Y}äÒÛåèØ÷Xþæì¬¾ß_ŸXuD»kn×ó™éŽ9õš)e‡Óc|£våìò1iÛ’ ¾É–fÜqÐoDÁø# z2‹ÃÕ¾Ÿ‰ þRVÖ†1‡wÚ¸„rß^œ‹Ùöºþ¼ž¥¸=Aû«îReV/©Æ »öP!n؃ã¼M®ê¥FM‹ZnóR½4“šÕ­€ë‡–¸aø¨H·ŒS=ðHœz(EâÔÄéÓ|Š®V¨ô8ÅÑC)§d"=Ä®@V¹ôã¦8zÀZç¯Øã½Ó'Vë`ÝD/ïýÈŸ¡ÉÙ­ú(R²T{¢ ?ˆèéúÛlþ¸­ŸirðCyÂí–á ܧӧó÷§!Œåpž~}ýÖdù†ü–ŸÌwT«Goã¿Qf…¹Äu‹wÆcƒôhÿL:Š]‰p©¬i¤½ØòÃJ¢z+u‘Xìm­/&*M ÖÒ}\µVëD}³ò"å‹n%ïªÒ¢ÒÒœ—êµÓ ³ð„ku&cS*µç˜ìQ_©Çzž}j[ЭsþSÊÊÏ\üé4} ÞI>óiOl?þL™ã endstream endobj 88 0 obj 5631 endobj 92 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 777.620000 204.960000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 176.159999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 >> endobj 94 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 168.480000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 >> endobj 95 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 148.319999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 >> endobj 96 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 743.060000 185.759999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn7 >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 159.840000 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 >> endobj 98 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 725.779999 198.239999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 >> endobj 99 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 232.799999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 >> endobj 100 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 708.500000 206.879999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 >> endobj 101 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 158.879999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 >> endobj 102 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 683.539999 81.1200000 691.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 103 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 667.220000 126.239999 674.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 >> endobj 104 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 658.580000 156.960000 666.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 >> endobj 105 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 649.940000 160.800000 657.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 106 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 641.300000 151.199999 648.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 >> endobj 107 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 632.659999 165.599999 640.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 108 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 624.019999 171.360000 631.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 >> endobj 109 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 615.379999 175.199999 623.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 >> endobj 110 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 606.740000 180 614.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 >> endobj 111 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 598.100000 183.840000 605.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 >> endobj 112 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 589.460000 170.400000 597.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 >> endobj 113 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 580.820000 148.319999 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 >> endobj 114 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 572.179999 195.360000 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 >> endobj 115 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 563.540000 200.159999 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 >> endobj 116 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 554.899999 167.519999 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 >> endobj 117 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 546.259999 166.560000 553.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 >> endobj 118 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 537.620000 215.519999 545.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn17 >> endobj 119 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 528.980000 223.199999 536.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 >> endobj 120 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 520.340000 181.920000 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 >> endobj 121 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 511.699999 143.519999 519.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 >> endobj 122 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 503.059999 136.800000 510.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 >> endobj 123 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 494.419999 202.079999 502.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 124 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 485.779999 167.519999 493.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 >> endobj 125 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 477.139999 208.800000 484.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 >> endobj 126 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 468.499999 171.360000 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 >> endobj 127 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 459.859999 139.680000 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 >> endobj 128 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 451.219999 205.920000 458.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 129 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 442.579999 229.919999 450.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 130 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 433.939999 277.919999 441.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 >> endobj 131 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 425.299999 245.280000 432.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 132 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 416.659999 253.920000 424.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming >> endobj 133 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 408.019999 338.399999 415.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore >> endobj 134 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 399.379999 203.039999 407.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 135 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 390.739999 225.120000 398.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 136 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 382.099999 144.479999 389.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 >> endobj 137 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 373.459999 188.639999 381.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 >> endobj 138 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 364.819999 215.519999 372.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 >> endobj 139 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 356.179999 166.560000 363.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 >> endobj 140 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 347.539999 191.519999 355.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 141 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 338.899999 211.680000 346.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 >> endobj 142 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 330.259999 245.280000 337.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 143 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 321.619999 171.360000 329.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs >> endobj 144 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 312.979999 257.759999 320.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 >> endobj 145 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 304.339999 123.359999 312.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 >> endobj 146 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 295.699999 181.920000 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 >> endobj 147 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 287.059999 185.759999 294.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 148 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 278.419999 178.079999 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 >> endobj 149 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 269.779999 180 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 >> endobj 150 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 261.139999 173.280000 268.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 >> endobj 151 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 252.499999 221.280000 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 >> endobj 152 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 243.859999 192.480000 251.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 >> endobj 153 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 235.219999 219.360000 242.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 >> endobj 154 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 226.579999 206.879999 234.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 >> endobj 155 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 217.939999 190.560000 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 >> endobj 156 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 201.619999 89.7599999 209.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 157 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 185.300000 169.439999 192.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 >> endobj 158 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 176.660000 108 184.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 >> endobj 159 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 168.019999 152.159999 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 >> endobj 160 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 159.379999 199.199999 167.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 >> endobj 161 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 150.739999 119.519999 158.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 >> endobj 162 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 142.099999 208.800000 149.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 >> endobj 163 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 133.459999 220.319999 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 >> endobj 164 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 124.819999 196.319999 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 >> endobj 165 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 116.180000 146.399999 123.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 >> endobj 166 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 107.540000 205.920000 115.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 >> endobj 167 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 98.8999999 313.439999 106.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 >> endobj 168 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 90.2599999 246.240000 97.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 >> endobj 169 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 81.6199999 174.240000 89.2999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 >> endobj 170 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 72.9799999 175.199999 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 >> endobj 171 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 64.3399999 165.599999 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 >> endobj 91 0 obj << /Type /Page /Parent 2 0 R /Contents 172 0 R /Resources 174 0 R /Annots 175 0 R /MediaBox [0 0 595 842] >> endobj 174 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 175 0 obj [ 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R ] endobj 172 0 obj << /Length 173 0 R /Filter /FlateDecode >> stream xœí]M丑½×¯¨³×ˆß `±ÀtÏÌ{X ÑìÁØÃ¢ýcÚpÛ‡ýûKŠRgDL‘”2•]]x¦È¤"(‰ñH=#~øÿûü—=ÿðþã?ž?-ÿ}ÿñiz™ì”þ÷ÿù=®þEÉô§óæEBüßó§ÏO_ž¿<}xúþýåIØùÂå?áÇUEø¯Oú!)J5ßÿWøëÿžåó†Òßžÿð?á?\äÅŸŸ<ØøÇoé!…ô¡€ÿŠ?þõé¿÷ü÷Ð?Ëÿþ}j±§_¾^*æð¥eU¡_&ܾrùëŸzús¼Ÿ]y×,éÒ¼˜ù…|^ÊöÅûɉgëÒÂÇZÿlmj8M©üéÉš!@z/–š\¯±ôÐz.ëtÉ3½V1é*¶'úC וþ×§w¿#ÏAdÏAW$/ÏáË• ßýúôÃ/ã¯?Í#:ýç×0ªbÁ¨ð÷ŸÿmšÄ/ÿþüëßæ7´T¼›+ô¥â=k1½g-$ÌB¼m½3Ó¥©e×Ê«M¹TÁ¯Í„Mr®p/(g’ñ.¿øùû"…g¿djêBxÓ+RUUÈÏó/&`ˆÒà_Lÿ¢Ó%—_ðÕµ¦u!“ã/Vo½Gáª=ª?¤M5bâUay;^Nõ]ÑW½aùÓÖúòN²qš®ýù׆£.€›@¢ÄWpS†TüöôñF aT˜Òí‹éÅ:AÌTùÆ{a}:¬/ÝLé…Ž0«ÕWK…^°Z(XÀ6Ö†™GùŽSùÓ“Pnìµ…¥,VÛÏrkz¹` Ä|îBøWêáWô"à¼;Þ‡'¾ZíÇ?oñã¦u,S‚Y®¯Ø)Ä!ë@Qàl³Õ®q Ë`ïÊ 0Þ„dúZí0¾ÿðúáb‡“Çvh³C+KvLØLB™ÙáÜÂR+XíÐN%;4@„2³ÃØ"õp"vˆœh‡Öi‡›K3ñSm½ueJY²T¥ÉŸù]T'ÝŽÙþŠöQ>Éw¯¦Zí/|¬æ#T4ÚŸf~*ÙŸ—Ô¶óy°ºj†øÒçÆÀZ7_Ÿ—úæù—FàŠÆ± Žmð…±mãxCCÏ.cõ28S KX¬`Û`Kc Û¡ÌÆvl‘zhÉØF ÎÛv’GŽm.#Û"µxñ0Y:OÔ‡V}õ—-±VT¹ú\vcò ›0*_…ºá†‡>ÌëwQÿeKZ#$ØéòÕ¦¤Çm`…¡`…-ABäÙ0$Ï!ana©‹,`….@‚Š)P 橇CVp"$Ȫ9@‚̬+û‚ªCBݹa(ÎÉm(z=¦#/ZÒi\ñF¬¹U£Le]`Ím0ÌkÇ2eÍçš\¯±ôÄš[% ¬¹U‚IŒ5Ÿ[¹¨ôóXs«:H”Í¥¡|_[æ³Xý»«>¼³ùæHªø d*¼Ú4ƒÖ+³ãK¢>îÁpùHÁe4®h\qFpYS"¸¬¡W,³‡Y.,ÀbëŠÃ”.«)ÁËlÅ¡‚  wpêŠÃt\54@4WW23ÇÆ«n ›ëùŽ*cËFèò }¼Ï¡¬E¾ lÃ" !×;oy$õ™¬ãUó»¸ÒÇý3vë"Ó\--®hDKËèHëJt¤u”ŽŒe†–n¡#±‹¬hiKt¤µ”ŽŒe†–v¡#‘z§¢¥ë #·Ñr{; ixq§[‘á´ùµeqÝC¤®¦ºŠÉ&Ž•ìÛrèÒŠMîBý(§pE#6yF'[_¤“ÑÉÑɰÐÉX€Å Vlò%:ÙzJ'Ç2Ã&¿ÐÉH½ƒS± :èämlÚÞ* “¯ á‘ïÄC&üGÜ´ «¤pÅ~§"_ãLÂßN®Ÿ2C~hé5ÏÞµäUÕ÷ÆJ+=®P¦Ç]b`$ÜPÓ·L©¥wö¾ ýÐúiûž ‚³ˆ—Š„ 3ÔÖ™’­3Ô6–)!8·Ðäz¥'BЙ’­3ŠIçn´s ו~!èìס”1;ýŸ²JT‡ã¶ûQVq(ÛW·ÌºŸ×Õ5Ä»bÇ!Ç#9i\ѶpŽy:Wò tŽzÆ2]¤– °XÁ²p®äAèœ` ¸áÜ"õxbç-œóãc}„Ø©ŸlgÔWíN€9eY_ZWé†ÍKãŒîCœÑõžáé Dx: „g,3»€…ðÄ,V°Ú”Oç)áËÌ.üBx"ôNµ °GÚÅæ'üM°¸å<Ʋ€+¹¶›[³©¶šò’ÑóìRÑf~bL–%&+<62Jc™šAja©‹,fà§“.  &ÎdÍ-R— “…œg^è#ÍàHǺ+`\g…ïïGçö£s¸¢q(KF|xY">¼¢ÄG,³¡¬â °XÁ:”e‰øð’±Ì†²\ˆ$€ÞÁ©CYÉ#‡ò¶óJ}(â_Ó~¬¢ÃIç Wr¬_MeÑÕjTÈéEz‹+J3O4¯Kžh^SO´XfF¥O4,Àb«Qé’'š×Š)àžhs‹ÔC≆œhTfǧò€'Úiˤé—jÓú'ùˆ—ꡎ„çô :ß#¿ €+ вïwoKßïÞÒï÷Xfh—ïw,Àb«ÚÒ÷»·‚)àßïs‹ÔCòýŽœh€öÈïw©¶ °>U í;8^¶ŸüÙr)¸×NÆÁç½Åç-®ØIB{Á‡T–Ú{MhâX¦$ôÜB“ë5–žHèðK„ö¨tŒ„ž[¹¨ôóHhï;ˆmzáÞwïÄS˜qÞù#N.v¬ö¯,%–C.­#Îç╟ááò%¬„Ë`¬L%V&Ê Å2]t¤– °XÁºè€"+Œ‚Œ‚•Ê Á#°B0u°B„¸âS?òUz„§€²µ¥EæÏØÕ =ϧÌCÜú\`Bþ?‘'ºT´Ù.Fƒ(Ñ` ) ËÌvåBƒa+XlD‰Ai°X¦¶;·H=$4Vp¢íÊì€PõoìïÚ<ÚÀ@ðŸWE¡kÍQgq–¹T4¢bÔ¨uŠRg±Ì Q-Ô`±‚ÕU‰:¥˜NÍ-R u†œhˆºƒ:{‹YÐ4¶5b¥bÌ‚KEãØ6Œ•Sb¥ÀPV*–ÙØ6 +…X¬`Û¦ÄJLg¥æ©‡„• NÛ¦ƒ•: fª‡*ÌVTížÔ#^ÑWüL:\â;\R¶ÝÍÛgŸ|u‡ÇÍ•Åô~¼iƒ®xÀîRÑ޹Ӏ+¹Ó€£î4±ÌÁ-î4X€Å V@p%w°Ô&– ØÅ  wp* ¸lÖÀ>Q \¡Vê‹Ì»ØÁŽŒ,C¢*R³‡#Ë–õí`YKÇœçáú´è‡˜©©îR±“HA°¹ SH„êŽeJ¤Ï-4¹^cé‰Hï D:xG¥{Ljô¹ëJ?Hè «¶Ã;Ô¹èç<‡Îëìªé¨Çyëz>ˆ°EüÕk9ðNFvï{(päMW4-hdx¯dA* 4š 3^oÌe² YZX*ÀbiA* 4Z¨5TÁÄh´Ô"õÓhDÁi špû4ÚM"<ÎXNt?$¶Mçáåb÷2ÀV& ³2YàÈB­§F =·2é³’–X™4ÌÊd# µŠ)PÜʤZÌJjbeò829} ]~ˆ•m’Õ»Îju„’ñ>yvØþÝGëø|™Ýïvä7X ½®h„&z?T(ÎPk)rðÐûK KX¬`…¦RèýP+˜Á¡i ½Ð;8štÅyÄ9ú¯‘‘ͪv—ц/‚ÛXwõûF+ÞŽwgE·Ýs;o‘jË(‰#èÉáŠF”d‰BE÷ µš‚OŒ°´°T€Å V”,%FMŒ0—J.‰°z§¢¤íà}·Qr{#HUQrÛF6u:R{Bµ‡;Öù˜n5Y”KAÉ W4š,Ë¥ §R.…P+©Eñ\ K KX¬`5ÙR.…P먞K!µH]öÄd!—B¸ë|éÈVÍM<éú­»uœâ¼i˜anœê—:ôœÊ>§ú¥¿#2~.ª?µÐäz¥ÏT(ۜ굆HŸæd XÿÜÈõ@¥ŸFõ‡;ï å6ç’úÉøžÀt‡d°8zíÍi5²}:â:Ò·ýs“ŸM ÑÒ኶©I°¼¡¢D š÷`.Ó©I,yˆ‹,S“(å=µŠ)àt Xò`ôΜšÄ×¼ö=âw>rØmä³çN1Ü¿—ü-Ù^Þ¶SDF{Œ W~Ÿ²gi!P’eIE#Î(Æí Uâöf?# Šs{©…¥,V°âŒ*q{B ¦€s{s‹ÔCÂí õÜžPÜÞ™–ëÛWÌákÛÜÄøVM %ˆû䨢єXâ€PQ"€M0—™)-‰ˆ‹¬¦TJ M0—™)-‰°z§š’é €H¿ò „ÂîO1ýLî;@ä[?’lQ_ÎáŠF°bqû¥(Åíµ”úåÄX'9•X'9QÖ)–éøL-,`±‚e|Ê©Ä:ÉI1œuš[¤Ö +8o|Jq$ë´béÊAÍ‘h€ÇFô˜Aít¶¯£~ªŠß>_S]ÚÕ¾rmW ÄäR±?1Cm´FEx´~'Khö|ãz*=ð °”Œ:“²DII©³Xf`)ê °XÁ –²D…Ž3œ:›[¤ê +8,å‘ԙ̜Ñ¡Înœ`n /é¡n\u“Í:’ñí'x­h*ñ)^…+nˆ¦AÎß}°.ö’b6‰¿µAG‰¸ HÏ&üóÏ?=½»;Î\CÉkf8÷JO Qƒ‡Ö»Î1W ÜϺ:M[Ï 8âÃØíÊëÎŽÃ'ÇÞè-”EÀÿ¿EF \± ; í‘Äino©Öçe¾´ßIÙˆ—ß°‚{0Y‡ºll”íX˜¶¨J†i/,™6 Wì6LgN7L(·ºm˜7Ù =6&÷±_n¼ÅéQ ¿eðhµY!k´žpÅí>£"lPÛê7å¿Øu‚?‘](êlSÓW“¹ŠmÇPªæy4Žõ¹nÓiB:OuxÉßg˺Ç;¿â׈PjºðÑZ\qC„ Šˆ±Ô >~Ðÿ+‹ðŽÜžõ=Šú³éð¹:6^ÚȹŒ=_ÕûÊ^U'ý†’õGÑ<ÅQ úüdµ+™Ôõ-%Ø¥-%èO,Ó-žÔÂR+X¶x”(mñ(!˜¾Å3·H=$[¨CBGPÇ+#·jêÇæåŽŸw"Ù*}d{"û4Êð%ê Ãí2Å’—ŠF|QÌe\©’˸RÔe<–¾¨Åe °XÁŠ/ªä2®$ue†/rqG蜊/êÈ­µéöÊB:îñؼ›Ûñ¯Ž=Vº'FôYQRFιÔ]ÚÙ¡žÀT}˜¨.»ZL¸bçaw¥I\[©L!®m¨%qmç2=ì>·Ðäz¥§ÃîJâÚ†ZG¥k×6µr=PéçvW¦}ÏeWbÕoû`ÉI(Ñ€—wJ› ŽX¡pEãÂÆ2GweKŽîÑ;wtO-,`±‚uacKŽîÊRG÷Xf »8º#ôN]ظö͘l®Y¥)Uë¡Sôk=%×7y» ß?)PE£Ý{v€@ùÒåé‚Xfvï—X€Å V»÷¥Ê+¦€ ˜[¤’XÁ‰víV}H²×ê‚CÎ]Yæ(²‡ü.û¬¯’7È‹,: òôÄ8b=•8b=QŽ8–)䥖 °XÁyz*qÄzLçˆç©‡„#Æ Îƒ<=µsÄG¤å8ïL_fÕœfÏöÊ̓ßë …ÎHc±Õ’ñ Z–xP-)Ë̆äƒb+XmH–xP-(Ë̆ă"ôNµ!Ù΃ïîÕR÷ަúú A¢É@úThÅTh] P¡5 PË ô  °XÁ ª "·H=$8Vpâ\àw,KGÂB¼¯òAÇ.’nâû˜hšk¼@sÇ& œ²…"e Œ²…Œ²…•²JÙ§l¡HÙ£l!£la¥lR¶ð”-IÙn»õ>Nz…{T¹Ó"aû¼ÑÈf\û§lÑ€ fê=únP³o…(¸Š\qÃóEAÁ‰‡?_Ôp´„>¼xz2{š;Ü ŠK–ÊëNv34BGÄX¦nŽs M®×Xzrs4bÝÆ ×N@¥OÀÜç@®*ý<7G#:vAöÄVÜæ:âÜT‡ö|:ŽÌm~Þ¶yØ2\Ѷ~3’í UÚ0Šî Ä2]¿¥– °XÁ²~3²´7`$݈eº~›[¤.“½¬à¼õ›Q{ÜPŽõ.ìX¥mÆVêX+ä3ÈžuÆž OõÔ…£4ë£hŒw=+£ý-'\ÑhšÑßF—èoc(ýËÌÍBc+XíQ—èo£)ýËÌõB#ôNµGÓAoÛ㯿c§¶Ž#P;µ]û,í^›I¿Õ9c+¯ô¸¢Ñ¨-ã1-ñ˜ÆR3–™QÛ…ÇÄ,V°µ-ñ˜Æ*¦€ó˜s‹ÔCÂcb'µë @¶z;ë{ûBr(©â‘IŠ;<öÐc¨Ã¿®h4PÏXLãK,¦ñ”ÅŒef ~a1±‹¬êK,¦ñ‚)à,æÜ"õ°˜XÁ‰ê;XÌmݨçÀ×ÀÔvlvUiªÒîdøÛ°w‚‹+v2Fv¢Œ‘JŒ‘(cË”1š[hr½ÆÒcd§"cŒ1‚Œ1‚Ä¡ëJ?1²Sc´½“X÷,ߺ=àp虑ð'#¡Lsc}_ûÉ¿ÅëÐV?-S¿ƒ G€³ê¼÷ËI„6’ÎNÈw’¸¢myb#é¬,‘tVR’.–éò$µ°T€Å –å‰%’Î JÒÅ2]žÌ-R— I‡œ·<±²ƒ¤; (üHæø+ƒ0#ØÍ(sÛ(qÎSùÎSýn²O›¬Ï#{auÂŽàw¶Ä`}—ݸ‰T4‚•b ¦U%ÓjÊ`Æ2+½0˜X€Å V°R%Ó*Ê`Æ2+µ0˜H½ƒSÁJw0˜GÄl¿ÍŽÂ-†rSÜȳ‚E·úH½°)³54¢Hc”“KE#jF‘†AXB C)ÒXf¨aŠ °XÁЦD‘Z£˜N‘Î-R EŠœˆv:5¶)Òªg¨Ñpz7ûJÙÃ8$‚ìk­c¿AÞî6×勬ºx*kq@À¨è/m]‰—¶ŽòÒ±ÌPÑ-¼4`±‚]‰—¶N0œ—ž[¤^+8]/}D€úú:eî”*öÇߎ„í™ó´»’tt¾#ñí!®ÏwƳVÔrˆ]w W4¢°J!(,бÌP –X€Å VÔ‚R ëiŠXf¨å—H½ƒSQ vPé#çÍÛ×rCK›#ýìsƒÜ¯[w˜ØÌa¥ý ê•§×èZ×ÀC›.sÄN++ö;³ûÚVQÞN1DÏÚi„ô,ƒ¶Ô¬ŸQ({\áòŠroƼëGR•â@R}m.à ^DÅö¶žÃ#EÈ+IÅÎQghÄ`gKƒ¥ƒc™nŒÎ-4¹^céicÔ™RÄ`ghÄàX¦£s ו~ÞÆ¨»di<Àÿ·Çß°ŽCwÉÐtäªß3¡þԻŖ&Á˜Ìú/“á·s¼ÆÏ&ˆâƒÆ{!Á9 Η !t‚­Ÿ8$Äš\¯±ôœ-A‚3Tº3b ו~"$\òCà‚|%ÇöèëØb „ßs¦Åag<ëpÅÞ †ŽX°¥ žŽ)ð|ÄÆš\¯±ôeÄ‚.XPLºâ#6¶r=PéçX?Mí#v›<®®êî’£ö舷Fò¬ …Ö»k‚hð9ÝIãqÅNƒ÷(éX*ë‚Áû0à±Iú9ç6Ú¹…&×k,=¼ÿš/Œ^+˜tÁ ~näz ÒO4øKº±#üuo»j=6ÀÛm=úÎÞÝ'CÙãeòé íËè+~wq²nÄBœ-|Í¢Š½X¨¨k³W%×f¯¨k³Wܵyn¡ÉõK_°P•\›½¤®Í^r׿¹ëJ? /©Ñ6±p›mräcKUS‡ìnÈBêè1²wßµlÀŽf@*Úö)¼fnµÞ”Üj½¡nµÞp·ÚÔÂR+Xö)¼.¹ÕzMÝj½ænµs‹ÔeâVëõ#¸ÕzÓÎl‘Y§cñM»=ò¼Îžƒó{Xïˆæ-œ×”s¸¢‰xŽ/_ÌñåYŽ/ŸåøòkŽ/Os|yžãËs|y–ãËg9¾üšãËÓ_þ!r|y×N¨‘ëG‰* Ôíèuƒ<¿ê˜/«öS4#yÙ™ØãKwSؼґ£À ù”Å46¨¢¬xb2_LLæYb2Ÿ%&ókb2O“yž˜Ì“y–˜Ìg‰Éüš˜ÌÓÄdþ!“ùKb²#Àj“mIKÁÁ¿Çº·ÓŠaÿN¼É¯€dýlö€Ö={ÒŒdCñ#냜ôË\±“°€‰’·0•ÈÛðñL(˜8y;·Ðäz¥'¦y “`Ò9y;·r=Péç0µ“· Ñûê„E}”µ3wCŽ÷Þƒy17ý<ŒQ–1mqEÛx–1(f–e ²,c°fše x–1(f–e ²,c°fše "ËÈJñ¾nCßuò–'èÑpã²pR3'pE#ñ¤fPLj,©dIÍ`Mj4©ÙEÁŠ@ŤfÀ’šA–Ô Ö¤fH½ƒSHw·GJü¥:…d2¿2¹fß%õõEOð–g-ë½Vü!íÙêåK ÜŠ38™¸âv¡Ú£"lYo£æîÎ7þ"ùô @÷¶šØ²rfÔŸŸLtrέ|c5Á³B1ë °¬ƒe„5ë ЬƒÀ³B1ë °¬ƒe„5ë ЬƒðYÁvlÀáAÚ~d­gãàmÚ¯>Š»S ãù•wÎ:#n¯Ù!½ô¤åKêGè·.pp’½ÉãŠ梙<1ö+ƒp$ÐÙ±±ûlããdO/æ,ԥǹ1“ðœ…PÌY,g!d9 aÍY4g!ðœ…PÌY,g!d9 aÍY4g!B€[GÞ°"} ½Žòd¿KÖæ–8›¹ÕìP 65Y\Ñdvjt?(TöƒB-ÙšËÄì–– °XA2»PQØRჀ*˜Ø~Pj‘zˆ÷ƒˆ‚ÓÌ.ôâÈý ]{º#Þ#C¹ÃWâ3»÷˜Yx»–Az‡+¢™}xúðü%Œ 9–Åô¼üçÓç&'Š)×ùÆŽK¯]˜{„Ù1t»D~‚°és'ÜŸ¦ãÌÚ[öÁ “ledH÷âÊç7]á—4Δz ÷Ò*Θ›Þ/ÇÎ’_½ª×¤ïc'_ä¤âO—_ÞU¥¥‘Žk~ª¶]†má©]³LO¥_Dí>+ï»fyc=÷¾ôm¶ £ÎC0%A,TÆ,ˆt]1‹ÿp¤m=xúÒ¦ð endstream endobj 173 0 obj 7855 endobj 177 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 158.879999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 178 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 768.980000 134.879999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 179 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 760.340000 109.919999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 >> endobj 180 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 751.700000 142.560000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 >> endobj 181 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 743.060000 105.120000 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 >> endobj 182 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 734.419999 156 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 >> endobj 183 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 725.779999 156.959999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 >> endobj 184 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 717.139999 116.640000 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 >> endobj 185 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 708.500000 298.079999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 >> endobj 186 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 699.860000 224.159999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 187 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 210.719999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 >> endobj 188 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 682.580000 203.039999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 189 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 673.940000 231.840000 681.620000 ] /Border [0 0 0] /Dest /#ba.Z#5c#b2#94#fenk#bc#ad#80p#bc#16#01#e7#ed#93#b5 >> endobj 190 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 665.300000 203.039999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 >> endobj 191 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 656.659999 179.039999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 >> endobj 192 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 648.019999 130.079999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 193 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 639.379999 113.759999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 194 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 630.740000 120.479999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces >> endobj 195 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 622.100000 229.919999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 196 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 613.460000 209.759999 621.139999 ] /Border [0 0 0] /Dest /#bf#13#c9#df#1c#ca#ec#e6#da#b1Q#e57#f2#3c4P#a79P >> endobj 197 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 604.820000 156.959999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 198 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 596.179999 187.680000 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 199 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 587.540000 145.439999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 >> endobj 200 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 578.899999 179.039999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 201 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 570.259999 231.840000 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 202 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 561.620000 187.680000 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 >> endobj 203 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 552.980000 126.239999 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 204 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 544.340000 192.479999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 205 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 535.700000 186.719999 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 >> endobj 206 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 519.379999 97.4399999 527.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 207 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 503.059999 115.680000 510.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_introduction >> endobj 208 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 494.419999 149.280000 502.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes >> endobj 209 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 485.779999 234.719999 493.459999 ] /Border [0 0 0] /Dest /#1e#b4#c5E#b1#24#fdC#8b#a92#a2#b0#80#7b#fa#83#8cO#8e >> endobj 210 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 477.139999 220.319999 484.819999 ] /Border [0 0 0] /Dest /qn#ce#ea#a3#1b#20#99#7c#3dW#9e#17#f0Q#2c#a3#dd#8b#b8 >> endobj 211 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 468.499999 167.519999 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template >> endobj 212 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 459.859999 162.719999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists >> endobj 213 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 451.219999 185.759999 458.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization >> endobj 214 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 442.579999 164.639999 450.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference >> endobj 215 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 433.939999 184.800000 441.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop >> endobj 216 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 425.299999 224.159999 432.979999 ] /Border [0 0 0] /Dest /#aa#ee#c1B#109#3f#bfP#3e#c8#d9#c7#92#bd#b4K#60#3cp >> endobj 217 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 416.659999 196.319999 424.339999 ] /Border [0 0 0] /Dest /K.#0f#0f#9a#5c#9b#14#17#17#1f#8b#13#a0M#f9i7#b0t >> endobj 218 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 408.019999 225.120000 415.699999 ] /Border [0 0 0] /Dest /#17#09#2f#d9#d95Z#bbEQ#90#b5#f5#ad#14#d2#b1V#e99 >> endobj 219 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 399.379999 205.920000 407.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final >> endobj 220 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 390.739999 186.719999 398.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant >> endobj 221 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 382.099999 210.719999 389.779999 ] /Border [0 0 0] /Dest /sB#f86K#a9#a9#cav#88#ea#2a#5c#b7U#c8#b3#16#15#ee >> endobj 222 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 373.459999 190.560000 381.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets >> endobj 223 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 364.819999 212.639999 372.499999 ] /Border [0 0 0] /Dest /#f2#ff#e5#0eb#fa#0b#ddl!#fc#2a#de#8fn#0d#f3#b2#ebt >> endobj 224 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 356.179999 214.560000 363.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates >> endobj 225 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 347.539999 182.879999 355.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions >> endobj 226 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 338.899999 180 346.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates >> endobj 227 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 330.259999 179.039999 337.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals >> endobj 228 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 321.619999 184.800000 329.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals >> endobj 229 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 312.979999 185.759999 320.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage >> endobj 230 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 304.339999 280.799999 312.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted >> endobj 231 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 295.699999 179.039999 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int >> endobj 232 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 287.059999 171.360000 294.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions >> endobj 233 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 278.419999 338.399999 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof >> endobj 234 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 269.779999 240.479999 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept >> endobj 235 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 261.139999 230.879999 268.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment >> endobj 236 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 252.499999 153.120000 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes >> endobj 237 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 243.859999 154.079999 251.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes >> endobj 238 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 235.219999 178.079999 242.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities >> endobj 239 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 226.579999 154.079999 234.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types >> endobj 240 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 217.939999 154.079999 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables >> endobj 241 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 209.300000 180.959999 216.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions >> endobj 242 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 200.660000 215.519999 208.340000 ] /Border [0 0 0] /Dest /#2f#2c#3d#c9#9b_1#2c#e9#87#bb#dcr#fa#0d#bf#f8q8#b2 >> endobj 243 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 192.019999 225.120000 199.699999 ] /Border [0 0 0] /Dest /5#8b#0d#3c#a7#dd#24#fe#9b#97#1a#1b#0b8u#df#d6#c0#7fg >> endobj 244 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 183.379999 175.199999 191.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference >> endobj 245 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 174.739999 250.079999 182.419999 ] /Border [0 0 0] /Dest /#40Yb#22#8em#c1Y#cd#fa#a6#8d#83#f1#aa#2b#db#de#b6#c8 >> endobj 246 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 166.099999 221.280000 173.779999 ] /Border [0 0 0] /Dest /#86#25#f6#d7#8e#8eQLKiwmH#f6#de#e8#dd!#01#bd >> endobj 247 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 157.459999 314.399999 165.139999 ] /Border [0 0 0] /Dest /m#ff#1c#e5#de#dcd#0ev#197#b6#1c#dc#5c#96p#8f#8f#0e >> endobj 248 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 141.139999 84 148.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 249 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 124.819999 120.479999 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 >> endobj 250 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 116.180000 115.680000 123.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 251 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 107.540000 155.039999 115.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 252 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 98.8999999 132.959999 106.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 >> endobj 253 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 90.2599999 122.400000 97.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 >> endobj 254 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 81.6199999 157.920000 89.2999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 >> endobj 255 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 72.9799999 166.560000 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 256 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 64.3399999 264.480000 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 >> endobj 176 0 obj << /Type /Page /Parent 2 0 R /Contents 257 0 R /Resources 259 0 R /Annots 260 0 R /MediaBox [0 0 595 842] >> endobj 259 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 260 0 obj [ 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R ] endobj 257 0 obj << /Length 258 0 R /Filter /FlateDecode >> stream xœí]Ïå6r¾÷_ÑçÜæo²€ €glÈ!ÀÀrXäÌfc,<‹8{È¿Q”úUÉ'’’Z¯Ç^k‹Mõ¤ªÔWŪoÿå§ÿ|þï<ûñ§ÿyþ¼üûãOOâE8‘þ÷ÿù7¨ð¢UúOì‹‚ø¿çÏ_ž~{þíéÓÓ§éÿ{’n¸ükúã:EøÏú6Mþ”Z~úøoÓýß³zþ×éêoÏþé_YäÅ_ž¸ø¿¦ÿJª0]àÿŠüåéßÿôü÷éÂ,7þÿ7Ê(ëvÝÅo¯CåüZžJ_UˆH]íd¯A*2qvŽÿκT“Æ®w&ø˜~ž”üöKê<½‡é5øWuV^ã†_™nÔLµ ÚÁ$È«äùÚ‰EÍ_t4ª±SÏÎ-Z,Òõç'g=—KCÆ,}ê=_‡EÇÉXë©ôézêç=€Œ*ý—§zs "šÈôÃŽ3ñcRæÉø‹Р»ÊÕt·®™Rð{õ5U­+qnö% ¿“ìÖª~Çž=Òõ_M1Ìšoo–¨4nØk‰ÞSKô¡d‰ÓM[ ‚[bìaÈxƒ¥/–è]ɽ¥Ò§kf‰±ñ@¥_h‰Aµ[â‡-KTI릇¸Ù¶µ‚/ w´®®ºº9¶ú—ì–|º}ÛGyÒ°WÝÁRuWRwT!§k¦î±‡!ã –¾¨;˜’ºƒfÒ5W÷ØÈx Ò¯Sw)Úw^šcj¦î:©¼xg™ºs(íè„­nÝέÙ d:-£uªØCh¹ç­íÜ.DRܾpÔô vZ¦”šX¦œvã¹eÊI3±íÄkj™sCÆ,=YæôÑW°L9}Qé’YæÜÈx Ò/´Ìé[-S~Çzhµ¥ÜƬLõbÝui¬¼}jHGöj¬–Tcµ*i¬6T§´á{2Þ`鋯jQÒXTº®±±ñ@¥_¨±ºý;?ÓØ¬!_\–B¼8/wÕ }Åwt}í¨ ¹h“À{dCê†ß±2<ñ.lЈàp7ìÅC iKGdYˆõZNpÌ= o°ôL‰à†ñšaƒITú…Ø`Û Ž>Žgݱ”º¹]µáAžúv2Û®×ÅgVœ=`΂ª7a…óTwˆ¤*o”ÿˆVÎsF‹ˆpÃ^Dp”h‘®D´Ä¯]b³ž-sCÆ,}AW"Z¤£DK¼fˆàтƕ~!"øv¢%G„Œ”Ïlé»feW™ö¬Tõ%ò¾­ýD£AxDŃöD TŒ %*FJÅÄkf!Q1h¼ÁÒƒ%*Fͤs*fîdSG8<Áö©T)ìSIö¯iØçÜ#Ý! ûÄ\ö©ÔwP¶lé ƒøŠÌ׊íïÙ‚e«G=Bïñ°*‘lqìø0Y G^Î ñOsä­R7²XÏ[<åû Iƒ$#JdE £8$Í=àð+$éP‚$íéÚsHŠ=Ò-I’Ì/T$mú©ê$\OzˆÙ ƒá¶]==Ÿð_Ǧø„OÛæF£kgqC#TXϠ†TÄ=Ø’àP1÷pT€Ã¬Pa] *¬¥XË¡"öHwèTXÿPáv¸§ bÓõUAE«ö»ý¢fNÃéó¿ ÷=ä…¯›e(Óáë~£½Ùå1 Ù4ç´Î€d¦ƒÓ¥2%¥Ü€do${W‚d(búÀ!yîᨇ'X!Ù›${Í&Ð’ct‡†@²·ÉáfNäímNb¸Kˆ™•×}qor©…%:Â=ù»Ü£Éöhá(÷0÷ÝÀܹ`q?q?s?@ÑýÌý™û÷÷<„ûö¸ø¯Ëý𮌷Ûëpïwv8Me”²{=&ÒYÁÒÒ↤%=¡eé„–ôD¼¦4÷0d¼ÁÒiY:¡=¯)Í=€Œ*ý:Òrí½}¶»º¹óaqn tÝšt†I#ް“N°j‰NH…öÚ›¢' &Õ.Ù›¦' â5³7N ñK_ìM•NLÛ{*]ñ“s ãJ¿ÐÞôNwó·NŠS:Ò:ð‘Ú)7´Þlz£ºkôÁê7ìUwCÃæµ)…ÍkKÃæã5Sw›ÂæÑxƒ¥/ênJaóÚаùxÍÔݤ°y4¨ô ÕÝîà%Np§†ë8ÂÉ ,<=~ÖñCv†`Q¸<(ÜÐFýhǨíJÔv”ú‰×”úI=àð õ£]‰úÑN³ 8õ3÷HwH¨<ÁuÔö;¨ŸLëb êË@Oìd¶sjßÚœmíÑwÖ½“O©r÷Ÿd›¯ë÷†‰3ý¥ýíÑ(öt(Ñ_:Pú+^³ÝAHôo°ôewJôWŒÏ Ò9ý5÷2¨ô w¡ƒþâÑ µ¤ke@1*ó7R8?ž3N„õHŽ€‹¼OCçÞÕ7Çe:¨‹+¬ÔÊ¿<éù[1DEA©H#JT¤”ŠŒ×t5˜{2Þ`éi50¢HE£"!£"!Q‘ho°ôÏt‰Ó7šrúñšá™Nœ>Tú…xf:8ý Ï6#‰ï$!~gñ{¾ŽO9Ëxvi€.+6(@Úܰ׊-Íßcl)±4O¼fVlSþ4Þ`é‹ÛRþc5“Îó÷Ì=€Œ*ýB+vb‡oŸÖSÜÕ©Ÿ}ìÈÔÿs{œþÞh¼g[ö¸áÄÓ ÚÝ|—ÁqúûÚ_ ,{õ Ú©USc_{IK¬}k{ ×Sw‡ñ%w‡ñÔݯäúäî@ã –¾@®/¹;Œ—L:wwÌ=€Œ*ýBÈõ;Ü ÉFª±vúCMíê9ä¨ÌûJh¼#£~Ùös\Y6¾É3j`¡9ß¾„Õñ±oòˆËW7œ˜UMIbÉÇZ…þ®öxìXû|? i¸¨vÄ@ËÕeÏÊÌõE×0×d®X\?@\?À\?Prý˜@]?ñš­ŒaqýqýÀC¸~`‡ëgûŒN=J¼ÜHpv?1Øq`äs7â¿8åHSü¹'|gi/×NðŒ_…ƒüEVP‘•%‘•Ô_¯)Î= o°ô†V”üEVPQ¼¦`8÷2¨ôëÀÐÊþ¢í#9õ˜é¡•s¶µÇ‚àȱ¡cüV¢”þÂà†½v¦¨ê’ÃjêLj×ÌÎtòc ñK_ìL•üVQ?F¼fv¦’*ýB;Ó;ü GqÞcó¡ýBǧnûRŸ?“íoîöyߺXÞOÞŽ;©kÅg2ò‘ßíî­ƒn#€êë¨Â {ÔPÒd¥%5Ô…¯€šäBBã –¾¨)¹¬ÑL:w!Í=€Œ*ýBµÕO°†ðíɓ٨w{|¸ÙÇáæsŽƒÜ‰êíÚñÐ:>¼ŽøÁC~Å7¯.l-òÏh‰ö“–¡f­ÑXÃëWEö‰üÕÕC0Ò£œ¦aËH}5,)ŸPò³ëÚ^pÿP½·Lj¨íÀÔ3'+ÐRøK­dÃ{ŸÞrÀ'+ nعŒ9VºÖK×:VºÖe¥kÝRºÖ‘ÒµŽ•®uÅÒµŽ•®uYéZ·”®u¤t­{ˆÒµîVº6«7ƹ½’×ôi/·žÇ:f ëWw¸ nиa¯°‚¸®X×±‚¸.+ˆë–‚¸ŽÄu¬ ®+Äu¬ ®Ë ⺥ ®#qÝCÄu·‚¸Ûv°–Ü‘}îíÆ1´Éä票ê¬VGÎð7§Ãub…Ä 'ÆáI4¢#xÏã>€uc(ÑÐ¥gv?‚3,…¹³¥æÎÒæÎò橇£ž`É„àL)…¹34…¹3<…ùÜ#Ý2IaîÌ#¤0w¶ºëlˆ2l]}‚;4*ÓËáÙªÏ8Ès¨Ÿù=µmÓÛï.ÂçØÊ3íØ=© ³·4à³ú6îØ®œ§ë8ߨé-J¦»èŽ%šw®”hÞyšhÞyžh>õpT€Ã¬€îJ‰æ£‰æã‰æçéI¢y<Á…€~«ƒ| W¶‘­€NêÜp: ¿>ñ¡Æ2\V4f丛²ýxºÇ‘{ŽŸå/UGÊÈ<>ýØüüçÔõíÃbdufÞmgV·Å¥s¡”fÌšfÌžf,õpT€Ã¬XJiÆ\Ðlžflî‘î¤sáÒŒ¹[ î#°x»ÆGÇIãcÇlg7y‡9hZ9]ª@à†6só¨JìÒ` ææ…#Öàç2±Ø^RG8<ÁbnþµÒ+.Ù’™ÛÜ#Ý¡ÂææI­Ø«ÌÍ‹žxÛܶÐu0ÉA‡wŠí\¾±èqkŽí gëÊ:çq¹Ø pC£Ñò²ž¾XÖÓ³²ž>+ëéײžž–õô¼¬§/–õô¬¬§ÏÊzúµ¬§§e=ýC”õôj©õØ>„u'Ô¼ÝhOö‡÷}dyh¨ŒÇ 'òÏÆ“—×s2÷]bá£Ä(°7<…Ò+ß@/^Ô+€zVÔg@ýZÔÓ  žWõÅ  žUõYP¿Võ´¨ˆ  ÞIŸ7”©ç Þ“áðœÐ ‹ùåVøDa†*ÜÐhK¼D¦/–Èô¬D¦ÏJdúµD¦§%2=/‘é‹%2=+‘é³™~-‘éi‰Lÿ%2½;’¹l8gQwôœâ!­‡g¡ÔCG%ºYÀVÁU4½Å 'î/¦‰ˆJ±ãª¿ŽªSµŒ K7}xqéö¥§¹7¼ü£/–ô¬ü£ÏÊ?úµü£§å=/ÿè‹å=+ÿè³ò~-ÿèiùGÿå}¨BÅÜl7‘º¶t$úÍ!£½:Z§ù£ò„sŽ(Þ ÍÌ4yEUóo8wÿ&áupö'Èú‰d¨Ú%µÝÀYà¬,YY`¬,d¬,¬¬,PV8+ EV+ + ++ ”•…‡`eáHV¶¡äP½Ðy}‘?×rpí­>øFµ••¸áDø¶’¾ù÷ßíñ§ôüHRžÄañCeV:ŠQ5{.©¶ÄúNEõÙMü-Á”¼-ÁRoK°ÜÛ’z8*Àá VÐ4%oK0ÔÛ ÷¶Ì=ÒoK0àm öÐ8ñ 4·Ë¢ÔKggúêÑ}uô|OÙÅûØbLÀ gúcQšÇoñÇú4ç|ùÓÜ$^“9k2V“9d5™ÃZ“9КÌ×dÅšÌÕdYMæ°Öd´&sxˆšÌáV“ù@ÚŒž¾“Tãˆ< g™«`–M}ˆJì*kqÙ{6KÞê9Å9÷¸Eò7’-<#_•–ѵegf©’ÄšÄ%ÙÂÀ&!”&!P‡IÜa’z8*Àá V %‡IÌô@'à“¹GºCâ0 á&!Æžáv\ûµÙvŠ¿Ü/]ß¡s ¸Ur±„€cÉn8^§‰ˆ®´§¨©ï«¾oÿÎݢϞbÜ™Aé±Þ$̳¢äÙA= ¸g#õpT€Ã,€¢èÙæÙ€Ì³‹g  ¿àJ@qªg£!fÿwį.k%n8›_»½ç=_wÇPqçDlVgyÕ«:¶u’êÓôm[Ò§ •ÌKªä¥E½ ¸—"õpT€Ã¬(*K^ ÔK’{)æé–‰—ä#x)@ê¥x˜³ÇÈŠ„>7‹Ì£ü¾ÖWêÇ ÎwØÄ‰°Ê¿Çãß{râ°¡7”žüôjæë]òu€¡¾0Üבz8*Àá VèÕ%_hêëÍ}st‡Ä×'¸zÍ©¾Ž†£&‡NÄa.GöÅViÅ5\»Øn8Ó DŸÂß„À£¿?â¯*= ¸±Ì“¶äÉK=`¹'#õpT€Ã¬pcKž °šMÀ=st‡Ä“ö<àªÈpÜl5ù¾7CœGÎ^wøVë ò5$‘Ù•YoÆ9R0Øá†F³öŒ—_âåÁS^<çåSG8<ÁjÖ¾Ä˃—lÎËÏ=Ò^ü#ðòàOååN6 SßUÇtä­×øyäJú.z!(n„,áS+!Âçk‚^KG8 ÓîDЏ:”Õ¼x MÆëÓ74oÌxCËŸZ µ­`¸ñ³XkPÄxƒdÆ \¾è¸ñzX¬5b¼á¸üé.Nåò‚ëò¥u¬XÇ8 -^‘ÝcÝCЂ°½!¯?Šv6*?ˆ³Ô¾?rα#7éÁ'ú¾±ÎÒpÃyߨq"lÚ»4®NïŽÄ«»ÆµßQþÊ)'ê·«¬·—“ëI6pdÖ멼m0y›\rÛÆÍlùËS¬³\0î] 0Ÿž%ŸžÔ§¯é.&õpT€Ã¬»(úô€ùô óéÁêÓêÓƒGðéIqªO¯ápKGé»ÂÄ9ypuîÑ:c"†‚&‘_Oܸ‘1¸áD¶š›gþ¨Ú©íS-©ú¥ÏlÚeUzˆ÷_Jæ3•²ä3•ŠúLã5C|µøL±‡'X_Ê’ÏTJê3×ñçé‰ÏOp!â«S}¦ÛgjÄäž—oiÀ‡#úôä;4ŸÏË·ºß[Û®Ú‹¶‚»cT¤B^V ¸áDÜ&ÂFrð©Ñ ‰35zÓ|¸ì±NЬté9o@³f^¹ >KЬ©W.^3hÖ‹W px‚šuÉ+'µfp¯ÜÜ#Ý!ñÊá .„fSEÑC yóüQR¼cÓ‡ž1ÈÓuÐÇÜ™^ʺænø•é†Èt£j).ZÊY˜®W·—ó‹ŽF5¶îÙ¹E‹Eºþüäì¢çréaÈxƒ¥O½çëÕçEÇJ&=:ÍèüS ãJÿåéßÞÜF‚ˆ&b;\f§dܳ%9Å×ä2R/õ¬SÝ›’m ³J"× Ûö Maýº“R«£LÌŽ²ƒíQòôEÐÒ¥g¶±ˆ{放䔞úã5[ÄýâÄž`]Ä}É/(õ Æk¶ˆ»Å/ˆÐ_pé"î;ü‚Ùj·yÚðƒâßìäàôŒq®­€Î̵èëkaô>ãSsÑwËtéål QàÜ>¹}`Ü>dÜ>¬Ü>nÿ6ÁŠD¡ÄíË@¹ýxÍ(,Ü>@Á¥HÜþ6mÃW‘(æîð uT¿>%SqçÇX¶CÏ©ã9•(ñœJRž3^SíO=àð‹ö+Qâ9• ÷HwHÅñÚ®ÙÁzå%Ï+¡¥­ZaÐö<=ÝóÙ™8~âCmµíq“¼Q¾ƒ;§Å³}pönêw²]i$2°#’¥ž¡ëØàú÷Tª`©åL ¢dJëi7m±Jë(i¯Àº…´Ãž`XW"픥¤]¼fkÒ  ¿àR€uG’vµ¨·V€už¬;ŸÝZöõ9ôÄåXPGäW‡³ðaIJ ’ù‚êŽþìŽvÔ;:&¦¿ãˆòsŸ Ô Î@%3ÜgÏxLJÍ“;Ò*¥5÷0d¼ÁÒÓ /óZuÕDºžË–ãùç@Æ•~Ý /s+ZÎÕoàt„ñ5}r:u¬ #‰¢²ÅáÀx±¶SZ*ƒÂ {U®ž¯_ëN#RŠÑ\¸šQìaÈxƒ¥/FôZtšŒ•žJŸ«V“ùc ãJ¿Ðˆn5«·h3°ÿ¨c_ܳSß¿¿˜-‡,Ç‚†ÔÞc¨°pº%Ë0‚êî\W˜hwìaÈxƒ¥/–ñZ˜ŒÕ–JŸ‹ “ùc ãJ¿Ð2n%…·-cûñŽ\&=ççNÙΟZef¶þ“™7¨ô+çÄI·×ÜñŠz@eøÞ&™VKt‹¡ïF¹ìÝìÁ(T8]»FÙ@Qd.FLp&ö0d¼ÁÒŒz-$LÇj&]sŒŠ=€Œ*ýBŒºÕ!ÞÆ¨íJ-I…¤Y·†- Yÿoç×­–sn(áέ0 ÃU³v¹ƒ2†O3†_Êb<Íb<Ï2÷0d¼ÁÒcò¥Œ!ÆK&g ™{Tú…Æt«þ»iLÛI·ïd ©G}W5™ú)†Ç±â®/yö0bŠÄ 0b2bb±ŒX±b%VLàÄÊÜÈx Ò/4h'V¶ó¶Ö·UY ÀväÀ¡iöêFU¯Ã}Ç]¶'aíUñœ­—ºõ7ì´j+(Óce‰é±’2=Vr¦gîaÈxƒ¥'«¶¢ÄôXA™+8Ó3÷2¨ôë¬ÚÊv¦g;ôùN\åHî˜Á#)j>M;Pêñj× 0hoU:º ƒ,)X ¸¡-´Åòš«¶XsÕ²š«6«¹jך«–Ö\µ¼æª-Ö\µ¬æªÍj®Úµæª¥5WíCÔ\µº@k~ÙôàüII&ݳÔëÓºýå»eše7xïK&Ó͆žùÐ|#æc³®ß//ËêYIÑ9ðÀ¢øº9@ϾAáØ8¶ÛC^ÀÖùc+”>\ SOOŸž›Þõô*gYé_Ÿ¿4í²E>ç'¦7Cï L‘.îYN·]Ê¢ 1â~6?}+aÞÔ´×våt`^*'b¦•Ï—}u¾ð—ôާǪ X®ËÚ—Þ/ÃÒ<¡:ªc4T/JhOËÇiIZ²Üò}µïâ˜*üÂkc–ˆÒ_díw,‹GߘåõüöåÞf Ú¡u¤Ñq›05*+=}í³øOGÚÖó§§ÿõÄØ“ endstream endobj 258 0 obj 8804 endobj 262 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 226.079999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 >> endobj 263 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 768.980000 164.639999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters >> endobj 264 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 760.340000 167.519999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 >> endobj 265 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 751.700000 189.599999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error >> endobj 266 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 735.379999 84 743.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 267 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 719.060000 222.239999 726.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 >> endobj 268 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 710.419999 146.399999 718.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 >> endobj 269 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 701.779999 147.360000 709.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 >> endobj 270 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 693.139999 144.479999 700.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 271 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 684.500000 146.400000 692.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 >> endobj 272 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 675.860000 138.719999 683.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 >> endobj 273 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 667.220000 134.879999 674.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 >> endobj 274 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 658.580000 189.599999 666.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 >> endobj 275 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 649.940000 178.079999 657.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 276 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 641.300000 234.719999 648.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 >> endobj 277 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 632.659999 143.519999 640.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 >> endobj 278 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 624.019999 132.959999 631.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library >> endobj 279 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 615.379999 149.280000 623.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string >> endobj 280 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 606.740000 150.240000 614.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector >> endobj 281 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 598.100000 166.560000 605.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions >> endobj 282 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 589.460000 193.439999 597.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 283 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 580.820000 186.719999 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr >> endobj 284 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 572.179999 128.159999 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 >> endobj 285 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 563.540000 152.159999 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 >> endobj 286 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 547.220000 108 554.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments >> endobj 287 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 530.899999 152.159999 538.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 >> endobj 288 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 522.259999 159.840000 529.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 >> endobj 289 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 513.620000 174.240000 521.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 >> endobj 290 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 504.979999 179.039999 512.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 >> endobj 291 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 496.339999 197.280000 504.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 >> endobj 292 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 487.699999 190.560000 495.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 >> endobj 293 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 479.059999 192.479999 486.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 >> endobj 294 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 470.419999 204 478.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 >> endobj 295 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 461.779999 181.920000 469.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 >> endobj 296 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 453.139999 239.520000 460.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 >> endobj 297 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 436.819999 75.3599999 444.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 298 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 420.499999 119.519999 428.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 >> endobj 299 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 411.859999 173.280000 419.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 >> endobj 300 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 403.219999 154.079999 410.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 >> endobj 301 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 394.579999 174.240000 402.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 >> endobj 302 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 385.939999 178.079999 393.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 >> endobj 303 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 377.299999 227.039999 384.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 >> endobj 304 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 368.659999 230.879999 376.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 >> endobj 305 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 360.019999 261.600000 367.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects >> endobj 306 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 351.379999 192.480000 359.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 >> endobj 307 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 342.739999 155.039999 350.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 >> endobj 308 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 334.099999 182.879999 341.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 309 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 325.459999 170.400000 333.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 >> endobj 310 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 316.819999 181.920000 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 >> endobj 311 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 308.179999 181.920000 315.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 >> endobj 312 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 299.539999 193.439999 307.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 >> endobj 313 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 290.899999 151.199999 298.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 314 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 282.259999 186.719999 289.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 >> endobj 315 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 273.619999 212.639999 281.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 316 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 264.979999 221.280000 272.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 317 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 256.339999 204.959999 264.019999 ] /Border [0 0 0] /Dest /E#8fL#e0#d7#7c#a9#8b#26F#8bDn#b9#fd#5d#f5#1a#b6#0f >> endobj 318 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 247.699999 255.840000 255.379999 ] /Border [0 0 0] /Dest /#8d#8c#eeX#e9#f0#7c#d1#8f#a1#13#23#ca#b2#e3#b4U#0d#ad#29 >> endobj 319 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 239.060000 238.560000 246.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 320 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 230.420000 149.280000 238.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 >> endobj 321 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 221.779999 140.639999 229.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 >> endobj 322 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 213.139999 213.599999 220.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 >> endobj 323 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 204.499999 174.240000 212.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 324 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 195.859999 195.360000 203.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros >> endobj 325 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 187.219999 215.519999 194.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor >> endobj 326 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 178.579999 258.720000 186.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 327 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 169.939999 246.240000 177.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes >> endobj 328 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 161.300000 296.159999 168.980000 ] /Border [0 0 0] /Dest /#7fF#f5#5d!G7L#bf#8c#f00#e5#f5B2#28#a1#a3#7e >> endobj 329 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 152.660000 166.560000 160.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 >> endobj 330 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 144.019999 162.719999 151.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 331 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 135.379999 187.680000 143.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 >> endobj 332 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 126.739999 166.560000 134.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 >> endobj 333 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 118.099999 177.120000 125.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 >> endobj 334 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 109.459999 178.079999 117.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 >> endobj 335 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 100.819999 174.240000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 >> endobj 336 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 92.1800000 176.159999 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 >> endobj 337 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 83.5400000 178.079999 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 >> endobj 338 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 74.8999999 181.920000 82.5799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 >> endobj 339 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 66.2599999 168.480000 73.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret >> endobj 261 0 obj << /Type /Page /Parent 2 0 R /Contents 340 0 R /Resources 342 0 R /Annots 343 0 R /MediaBox [0 0 595 842] >> endobj 342 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 343 0 obj [ 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R ] endobj 340 0 obj << /Length 341 0 R /Filter /FlateDecode >> stream xœí]MÞ¸‘¾÷¯ès€ôˆ_EX,0¶Ç ìacØC°‡…“lÄÁ:9ìß_R¤ÜUEòEI­×îÎq“/UEI|ŠäÃRÕOÿöë?þÏ?zÿëÿ>~Îÿ¾ÿõazš`Jÿ{ŒÿýWH÷¤dúÓ:ó$}üßãç/_¿>|zøþÿ냀ùÂüOøqQ‘þóóß~JÊRͯïÿ#üõòñßC靸¯ðϳ¼Øà˃óÿø[úCH!](à¿âyøÏß=þ=tÁÍrãÿÿ^rzW/¾~»TÌÿáK몦Gm´{B†šð þñ§‡?Çûi¶_: Ê-‚8cŸÌüÜ¿,îɹɆ)Ÿþеñá(—šN©üùA(û$„—Î--€ ¬ ¶Ÿ+ ]ôH.7†*åxêBl‘zøM½ƒÏá=ýJ^‡(^‡ ¯C>?¯7.|÷ÛÃO}x¿ý9ü4ÞôÏoá©ùøûpûòñ·?>þË4ÉwÿúøÛ_çב*DªÐß*¤[k!Þ³Ó{.C¤OÎO ÍŒ©Üô—ùåýEοاÉ+k&ô‹ð\_[ð¦ª%µ­oJOž¤pÝ¿˜ôžt†~±üyêµÇ'Ú]+„7̅音0°©Ó7ôozµ¢T÷nEÝ/¿ƒð<ØkÐc6 Yõ úJ;\ñ·€£sÐa´”O·=Hms4‡†H0rù©g8éæ/íQÓÆ‹ë|'ì|yÐBòwÒ3ÕTDƒ‚¬ù&9•!›i°ÙÆFýÖ=d+<¥òç0ÙN‹ÜB“ë5–ZÏem4½V1é*¶'úC O®÷Tú_ÞýîÅm¼›â uߌﺉç-Þ xEq»'Øëuº8$ø9ÈoçŨ/•nÁ?Y0tlÈün‹ß#M[Ø~º¥ø^sÆ^¸IgøÓÜcμ¢æÌëš9ó@ N(3s[hr½ÆÒ³9ó²fμ`Ò7g±…'×{*ýBsæ]·9SÓê‚êC\áõjˆÀï™h›ÃNþ< m`¸Áj¾ZÓ[\+ŠÁÐ\0Ϧum§qöþÙœxR±Óœ€Äœ@°’¥9¡ àc™š“¹…&×k,=™SÅœÀä©ôP¦ædnáÉõžJ¿Îœ@ü­ÓœˆŸY %× zcJ丿Bê/ý×¶³ï/ºâ¹qŸm{Co»óÅ+Øo¥û,ˆgúJZƒ+N\®ExÀ—Ï¿}ûÌI¢½Smïˆ9ù´:Ót¬õè“»|e}®ezâ‹0lT£{ó|2kïºÒc˜ÉeòÜkÓ©n² \aµ¡š¿˜V'3/X[…p ÚnšísÀÂ;4Ïó¢ÏUìq­§3®›j3®“tN e6ãÆš\¯±ô<ãZW›q­¥ÒC™Í¸±…'×{*ýÂ×éÖò|}Æ}¡ V'"ÔbðF¦ˆ¶lS‚ÅBsÑXÎÅ?ª?uÑ1Â×ÊbAÖ|ž# •‚>)w;í=T{8²dj¾ón›Dî™æUpʼn¤~P„íQ¹ík?¡æÏÏ¡ƒ8§·ùåAOšß÷ž‰Ê[:QyW™¨løO%6M=h²™[hr½ÆÒóDå¡6QyC'*oøD[xr½§Ò¯›¨ì´œötLT«'ŸSfš¦åüëÆœæ[»œ‘Ý\{—f¥mEN5¹76La…ºæ@ÌÍ0z¦y¥\±˜³Ûþ V<Û…\ÿ†0’ˆûA,Sÿ†Ô¨À ²ƒºâß`…b óo˜[¤jì߀\çß`å4Žáåè5_Á·ÞÍÐ.ÏîMçXŸä­D§%ÚãŠÎÁ®ìJ×{¦d,*àƒ}nT`Ë`W²6Ø•` ì±Eê¡$ƒ]©{ìÊ9Ø×§´ö`?”ûbûìÓö]¯±ô´}¶®¶}¶ŽnŸc™nŸçž\ï©ô ·Ï~ÃöyÝ ÷oŸo–´—ÍíeÉ‘ž²¹³ß³Ÿa,[ïÜß"7&)%®è›(ÜÄö·nªíoÝD÷·±L'ŠÔ¨À òDá¦ÚþÖMŠ)àûÛ¹Eê!Ùßb×MNlØßrìo?6©©ö"¶/ìËsöoƒzK~¹e(.ùn Â<;䉤f¼‰m$€“Œp²F8II€XfAf ¬`±²F8)˜NÌ-R €\hä`Ý"ìø¢çÆ¾ú;šò¼nƒôSðŽ\g÷BV>oÖ”P¸¢²šQN×( §)¥Ë ²:SX` duÒpŠR±Ì «2¥Ð;¸²z¥±ÙÕµ´RÍIüeàwý¢ßiㆳ5ÇRw-›ws¬»C±i7]=%òòn¯Fü¼ JK×þ¶mà ¾ªÙ÷ZGýLh5áŠNëhæ Æ…9 \X,3ë™ Ã+X¬£©qaÎP.,–™u4™ Cè\ja¶nwpa÷³}ØI›9@´™žpÅNÚÌYJ›9[£Í„؊eJ›Í-4¹^cé‰6s¶F›…wC¥[N›Í-<¹ÞSé×ÑfÎm ÍÖssuÞvœÌ¾•_ÔÏÍ!Û¤çÔ»,m\Zó—rÎhvéjŸ¼>¾Ì9Ä—%läË<çË|•/óŒ/ó_æ¾ÌS¾Ìs¾ÌWù2Ïø2_ðe~áË<åËü=ðe~šÆÑ5— LÅVPÿÒjÚþå깪s&òò¡}Àð‚ÑF^Ôh#/(mË©P€d`xQ£¼L§æ©‡„6 .†Ø@­cÝwä*`lñ3Ùñ5ö#½xÈÍÄ\щÅ8¯jœŒW”“‰e†•9,°‚ªÆÉxI9™Xfx™“Aè\е“YÇÃúùæ¡ µR|s«‚­ø¸»tnø¤„NAõúà&,)äÍ’†ô¶¼×lïMmï ÝÁÇ2Ã’É;x,°‚Kº¶ƒ÷šîàc™aIç<@ïàR,™ ;øu,íøfË)ÛÛVLPëqOFVcý7<â£vCq?Ñy/îν¶Â ï´Á¶X@Bµ€„ÞÒ€„±Ìl…Í ±À [µ€„h@ÂXf¶r@B$€ÞÁ¥¶Âî ?ÊxVë`ú]6,úÞpÿ½àÞ¢`‚jÂ;™Pïhà:ïjë¼£ëb™2¡s M®×XzbB½«®óN1éíÚñÜm¼˜®eVeˆ&5Wt.³œgË,_¡IC­¤« /ù2Ë˼®òYf9Ï–Y®B“†ZK8Ë—YÎæu•sd™åî€& w­„ûȺëçæ|¸agÞV²ôy.vq‡†˜j­ÙzWdÈ#†D}@åCE…#4BŽp.S ¤@V"¦ Gj U01Ž0µH=Ä!QpP„h®PÊúáu?PºC ‘k#“à sÀ3÷¢ ;3 òýP“Æ€”†RV¼ªŒŽâE:Hé2%@JÃ)+^U¡V1ŠRªŒ@© åxU¡šè:«§çR7·'Dý~ƒêv¨"·%4®è„ªf\žÐ5.OhÊåÅ2ƒªÎ\XÁU]ãò¢nª€sys‹ÔCÂåaBU»S¡º~8ÿ2sgÛUùÍVÜ»­@n7Ê(\Ñi+@0[¸P«)”As[:ÄV€`¶*>pFOÏm…ñÙ8ÀDlÜœ‰|à‰¶b×™Ý åÛë?¼nG9hÿ2„¥þ¸[¾KìwŒ2'Û àüWìä¤ÞnD-z{¨%ÑÛç2å¤EŠÞޝ×Xzâ¤E-z{¨µT:ÞžZxr½§Ò¯ã¤…ÛCR­î¬Û¡oËI²¨h±åùú‘FâIÕëÑzÐg7Ö ‡8Ýô‡Þõó†—sè2¬Èo;ƯèÀ!ÎwØAQáŠÎE‘ç䣯‘r¢ä£œ8ù˜ZXÁ²(òUòÑ3òÑä£_ÈGOÉG䣜öG„n‡7È'»ÁŠn9|5&q‡ïÊÈkûëê\sIä+¥¢€Ü±ÜH±¥H!©[ëˆ"Ó®”Í-MÓ­·í \xä¶ÅçWÖå)+ѧBÞãòNRRMÔQVM5GÙèà€iÃX¦¤äÜB“ë5–žHI5Õe¥§Ž²±LIɹ…'×{*ý:RRM̓Š7¿¸ŽÉlØ/ÎÍK^àŠ¾e¨ÌTÉšÿ¨’Ô4–é24µ*°‚¼ U¢æ?ªõeº [¤.ÿQ¬àºe¨’Mj~Ç:”ï™+\9n‰þ²vœ½íðqŸï©BžjjR¸¢dŠÑ¿JÕè_¥)ýË d:Ó¿X` ÈTþUŠÒ¿±Ì@¦2ý‹Ð;¸dí¯£Ùú Ù) ;òûŠÞ!<º$(\Ñ9¤ c•©1ŽÊPÆ1–Ù6™qÄ+X†´©1ŽÑG…*àŒãÜ"õ0ŽXÁ…CÚãóˆ!½î½9B¾½Î9Öu©‘Ö¸‡5êý†Ë'å ‹“ÁÈ´ŒXT¶F,Æ È8–‹©P€,È´5bQYÁpbqn‘zHˆE¬àBdÚ&±x2W5•híáoL%Åfåe|µîÿÃÃ^øYš—UtÂÏ3ÿGåkþÊSÿÇXfðóÙÿ ¬`Ÿ¯ù?*Gýc™ÁÏeÿG$€ÞÁ¥ðóGÒ þ™SfcíÉ`h®9$¡ëêY~ìº!Y@±mZ?è—~ƒ‰â²ú$îßDUŒ´Úf¼›‘Wô/=16H‹¤eƒb™¯Ô¨À ²ñÒS Òeƒb™¯¹Eê2aƒ°‚댗§²ARýÆK'óf;›_ü@OÞ Þ+2xù=i©pE§Á“Œ™Ó²ÆÌÅ4Ä)ÎÌ¥@V°ö*ÂÔå önV¦.Íx­k ¼Ö”e6uéÌÀc€,S—®1ðZ+¦€3ðs‹ÔCÂÀcN]¦=1uq›— 6òãˆk_¡¸HÙþsÃ’u¿a²ë'ü·¬nÏŽœÆ,:$ˆ$=Wìô‡Òðl–Ryáþ±?’ K±Lý¡æš\¯±ôä¥a!þ鵂IÌjnáÉõžJ¿Î*¬*vØ“ïúzCˆôCV}߃ß0#Ƶ™VÜ ª6ajÛ…vìÀB»Ú…vôÀ"–Ù:Âå ,°‚eájÚÒ‹Xfë›,z—®#Üž‹#¾MüØÜÙ´½ÑG€²ÿ,üÖ‰þwí´wöv(ÄÂÌZ¹4½g4}(T k&JÓÇ2…ljT` d}•¦÷Œ¦÷MïšÞSšÞßMo¦=4ýŸûý“ùŸÐÖ]t"ÇL( ¨\ч#ßkDï5’ò½±Ì#3ß‹V‘cDï5‚ò½±L‘3·H=$|/Vp!rä¾÷€¯î6|([Œ¹s¿­{˜‘ˆW”WtÂP1îʨweå®b™ÁPeî ¬`¡ªqWF)¦€sWs‹ÔCÂ]aÂPïá®Öa¸Pp`Í9äbd£õ†Ýv5ûpý¹¢»†ù— 5ìê_Ë »&û—b€,Ø55ÿÒ02Ü¿tn‘zHüK±‚ ±kŽä‰Ünx~rŽ$‰ù°'>Ì9ÔôåKõM>Æ WmpÅNîØ°¤3¦štư¤3¦H:crÒC’ΖtÆT“ΖtÆIgLN:cHÒsIgL;éÌÛ·ßÑ··VLíƒë"{ÛÈBi wlHöÀkž}ÆT³Ï–}ÆÙgÌ’}ÆÐì3†gŸ1Õì3†eŸ1Eö³dŸ14ûŒ¹‹ì3¦}f÷Üñ’:®ÜNßÀÖȧ%íUÂÜÏ„{šúQ¥®èÃ;ð$:PM¢,‰It`I¢4‰ð$:PM¢,‰It`I¢4‰ÜEh'Ñ9ïWÏÅÑæÈÁÓž,÷Å£Çåy›Oà¼;RãŠ}ú‚"2j¿ÛÜáŽGŸbŒrU}¬+¦‘§3‚j:#`錠HgK:# éŒ€§3‚j:#`錠HgK:# éŒà.ÒA;Ñ!¦qýdáÐcôÛø óÿŠãŽiŠ·Þé+<@©žôD*:ÍOõÕTOÀR=A‘ê –TO@S=OõÕTOÀR=A‘ê –TO@S=Á]¤z‚vª§CÌXãd¦w˜ ,?®8o‘“P(ô²$:Ø46A®>l·Ö7P^„/z2Í}ÄÇ=×ÏÝvŽŽ×1Ý×ðŠãiª š¦ Xš*(ÒTÁ’¦ hš*àiª š¦ Xš*(ÒTÁ’¦ hš*¸‹4UÐNSu„[?źaEî~Ñk­QJ& Wœg­£"üz_f™³ï£ÒõgC.‡CÓµ>Ü;(ÜtÓùI%ù§€ Êë´ÙÒµs³f !vÿÊ™a*¬œ­®leF±ì,\í,= ÇÏBR  +Xf[; KÏBÀò³¹Eê29 {g!ÐNrvÈŒ²;c„(ôF±X&“Âk ȵmòù·Ô„+Nä;ÕDGâ†Ùâí¼ü’–¾ú`£•ãca‡ë  ÈI©ì*®+6üŽKìl*±ûÉÜB“ë5–ž\Wà[n5|-xC¤Ãœœ ëŸ[xr½§Ò¯s]±íÔl‡d®ÞàïÝ Ub¦0¬vè‡&Ž>éê^ÙK7à %޶ßnLƒfy4[MƒfY4[¤A³K4KÓ YžÍVÓ Y–ÍiÐì’ÍÒ4hö.Ò Ùv´,›fñž5²(×TWtŽFžáËV3|Y–á˾ì’áËÒ _–gø²Õ _–eø²E†/»dø²4×½‹ _¶áëѸž”o`Cpãkò—Š 5°i80•î¸ár¾øÿ†øI†Gžx[Z¹=<ý$Ð’ü`Wtš/Ãrkj ¹5”!ef¾LfȱÀ óej ¹Õ”!ef¾tfÈ‘z—š/³‡!_7_ë m¯ïs£p¼av+f cÿ?Wtbimƒ´–r±Ì0k3‰V°`j¤ÊAÆ2Ã,d  wp)fír³ëÛÝ7Ì^‡ÙMü¤µ,9ÔsʼnüdPDFéÕ×ýqûsiÒG?=óüY òwrŠÇsþûÇŸÞ½¸Ñ³{¬õG2`î«;NÀ¢ ¬õˆ~™ù¾g±Läá·Gg Öi›7¡dÄþløWô¾©OëfON9ËѦwpб#¼ƒct]4 ×B׉6R_º«$DŒ;>ákå!W¸ AAWÏ´â+­M6Ò ì_K*γ‘Q£'½ùïàŒ³Ûf±wC,‹Ú˺½r’1¸NÖ\')ƒËt;•ZXAÞN9YcpLgp穇„ÁÅ ®ÛN9y*ƒÛ‘Ëé;ÜNuî?œDñ?µÅ'®Ú‚"òZ¿ï _¿ïá†l6{\/ŸÁ·ÜøÈd00Ö]¬Îu¤Ø 3ŠÑ5°­Ì(š‘êN×Hu§)©ËlFÑ™TÇ+Xf]#Õ¢¤z,³EeR  wp錢O%Õ;œàE[6£èp7O3Êók}-3Ê!ÞìeÒ³ Ñ›w8±¿xJ³«Ê¿Ñâù—¾(é̬ח‡s™³N£ER›Ë0UœFHâÖËÔitn¡ÉõKON£Î¸ŠÓ¨3–J7–9Î-<¹ÞSé×9:ØqÎÖ±íÛà4:’jÀÝò{Zò_ÍÕmru€Bƒ;+:—æ–Å6r¶Û(üKWÎŽÇ6J-€ ¬`YšÛZl£0N©ËcÍ-RIl#¬àÂ¥¹Ûq V`zÀyTÈ‹£æ‰¤kQR0m!wéÞu¾Ãç}Wt"Æ3wkçkîÖÎSwëXfˆñÙÝ ¬`AŒ¯¹[;¯˜în=·H=$îÖXÁuˆñS G fõléÆ`?eloù–hDȇ×f?¡°ÞJáŠ>0{ÁÎ:¼¨uxAÏ:b™‚9µ*°‚ f/jg^¦€ŸuÌ-RÉYVp!˜Å޳Ž0¯º{ÞìëAñš£ÿ5@Hxº‚|®è„bä®W5r×+JîÆ2ƒÊä.XÁ!U#w½¤än,3ÉLî"ô.…ÚAîv@hÕû²=Ø tLjµW U…¥Å„+:¡ª™£´75Gio¨£t,3¨šì(V°@U×¥½¦ŽÒ±Ì ª³£4@ïàR¨š# œŠçTF{røÆ×Uƒ|~©è„*0^ÆC—ñ–ò2±Ì j3/ƒV°@j¼ŒÊËÄ2ƒ*d^  wp)Tí©¼Ìú‘éÁþ¶<vùëÆO‰ž+:aç¹ã]ÜñŽ’;±Ì`ç2¹ƒV°ÀÎÕÈïSÀɹEê!!w°‚ açO%w$?S|ñÅìÛ¦ò&=âe&+ºpÓDy™PQáeB-áeæ2ÁanT` ‡¡¢ÂË„ZÁ0^&µH=ļ QpC/Nåeä»qÞÈ…0zðÆh?ï?>fÃPAŸÎ …+:1+ì¬A¡VSHIÍ1+u©”³R0ÌÊ ᾩá9f…Ï •Á¬¼"(ôâT"HíØ]*㥀ÿ0+#$'\щYåfu… µ’BJKŽY-3HõD0«<ìª0B¡ÖRÊrÌ*›AªÁ¬ºF(Üõ©ŒP!CÉ AÙ+^͆—‹œl¼ÂeŸ>=~ (ŒYVúçó—.'»©Ôù‰ Æ —ÞºpÅ.¬†C·k×ûô->¦G5-ƒ9û{<÷èMÏÖë§‚÷KŒD0D¶þE¯­ü’¥ž¤‡šËš1OÞ"Ÿ‹jz\óß¼&!ÌÊ'9Íùù—wMii€ãšͶù³r‡[×ä=eíѺ<æ·]“ߨ–{Ï}›´cÔ9/쓊„Ji„]ÄóøOGbëñÓÃÿMžOy endstream endobj 341 0 obj 7561 endobj 345 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 191.519999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 >> endobj 346 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 176.159999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 >> endobj 347 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 180 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 >> endobj 348 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 181.920000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23throws_typemap >> endobj 349 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 743.060000 157.920000 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 >> endobj 350 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 185.759999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 >> endobj 351 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 247.199999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 >> endobj 352 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 717.139999 204 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 >> endobj 353 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 708.500000 234.719999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 354 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 699.860000 161.759999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 355 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 691.220000 144.479999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings >> endobj 356 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 682.580000 147.360000 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments >> endobj 357 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 673.940000 214.560000 681.620000 ] /Border [0 0 0] /Dest /#90#b2#80K#dd#87#cf#7e#06#b9Y#8e#13#84#04#9f#28HWO >> endobj 358 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 665.300000 276 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization >> endobj 359 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 656.659999 166.560000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 360 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 648.019999 174.240000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 >> endobj 361 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 639.379999 145.439999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 362 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 630.740000 169.439999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 363 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 622.100000 182.879999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 >> endobj 364 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 613.460000 182.879999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 >> endobj 365 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 604.820000 142.560000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 >> endobj 366 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 596.179999 194.399999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 >> endobj 367 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 579.860000 119.519999 587.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 368 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 563.540000 195.359999 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 369 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 554.899999 216.479999 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 >> endobj 370 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 546.259999 229.919999 553.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 >> endobj 371 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 537.620000 201.120000 545.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 >> endobj 372 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 528.980000 222.240000 536.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept >> endobj 373 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 520.340000 237.599999 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 >> endobj 374 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 511.699999 223.199999 519.379999 ] /Border [0 0 0] /Dest /sq#b7#8b#aaX#cei#7fM#b1#1a#a1F#0d#2b#c2#fe#e9m >> endobj 375 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 503.059999 229.919999 510.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 >> endobj 376 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 494.419999 188.639999 502.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 377 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 485.779999 190.560000 493.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 378 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 477.139999 175.199999 484.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes >> endobj 379 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 468.499999 161.759999 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 380 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 459.859999 175.199999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 381 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 451.219999 218.399999 458.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 382 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 442.579999 173.280000 450.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example >> endobj 383 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 426.259999 74.3999999 433.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract >> endobj 384 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 409.939999 156 417.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 >> endobj 385 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 401.299999 149.280000 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 >> endobj 386 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 392.659999 220.319999 400.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 >> endobj 387 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 384.019999 99.3599999 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 >> endobj 388 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 367.699999 133.919999 375.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs >> endobj 389 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 351.379999 119.519999 359.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn2 >> endobj 390 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 342.739999 121.439999 350.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 >> endobj 391 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 334.099999 154.079999 341.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 >> endobj 392 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 325.459999 202.079999 333.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 >> endobj 393 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 316.819999 150.240000 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 >> endobj 394 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 308.179999 169.439999 315.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 >> endobj 395 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 299.539999 143.519999 307.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 >> endobj 396 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 290.899999 116.640000 298.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 >> endobj 397 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 282.259999 115.680000 289.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 >> endobj 398 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 265.939999 103.199999 273.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 399 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 249.619999 119.519999 257.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 >> endobj 400 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 240.979999 175.199999 248.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 401 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 232.339999 156.959999 240.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 402 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 223.699999 163.680000 231.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 403 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 215.060000 138.719999 222.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols >> endobj 404 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 206.420000 122.400000 214.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 >> endobj 405 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 197.779999 139.680000 205.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 >> endobj 406 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 189.139999 153.120000 196.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 >> endobj 407 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 180.499999 164.639999 188.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 >> endobj 408 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 171.859999 216.479999 179.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 >> endobj 409 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 163.219999 194.399999 170.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 >> endobj 410 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 154.579999 197.280000 162.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 >> endobj 411 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 145.939999 217.439999 153.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 >> endobj 412 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 137.300000 204.959999 144.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 >> endobj 413 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 128.660000 235.680000 136.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 >> endobj 414 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 120.019999 194.399999 127.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 >> endobj 415 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 111.379999 108.959999 119.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 >> endobj 416 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 95.0600000 117.599999 102.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 417 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 78.7399999 148.319999 86.4199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 418 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 70.0999999 102.239999 77.7799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 >> endobj 419 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 61.4599999 157.920000 69.1399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 344 0 obj << /Type /Page /Parent 2 0 R /Contents 420 0 R /Resources 422 0 R /Annots 423 0 R /MediaBox [0 0 595 842] >> endobj 422 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 423 0 obj [ 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R ] endobj 420 0 obj << /Length 421 0 R /Filter /FlateDecode >> stream xœí]]¯$·q}¿¿â>ðU“,~ð®¤y°€<yÖq ÃkDñCþ~ºÉMU‘ì&ûczîjW€vÉ!‹==¬C²XUç»ùé?_ÿû¯ß}üé^?ÏüéexÜþ¼NÿýžVèðftú§öMãôçõó——_^yùôòiüÿ//ÊÅŽó_ㇷ!’À|þûËwið—TóÓÇÿõ¯úõ_ÇÒ__ÿøã_šåM ¾¼tÓ?þ–þ¡´Òa,ÐMþååß÷ú÷ñB”;ýÿ÷¬Ò»žâ—_»ªøíZjxuƒƒW¥ôø„v|ÿû_/ž¾OµýíTþ Ô(Λ7ßû—[¼…0øñ ¦ÅZ7–Cj:¤òçeü›R¨C¸µp\€£Líc…N^yw%P±}„±EzÂ_ðoðyü~b?‡Ê~Å~}¿,tüðóËw?â4ñ~þóøQœ½é¯ŸÇ·fõëïǧ¯?ÿéõŸ†AýáŸ_þkü9jbüZ¡‡µëB‡¢ |+Ü›5JÛ¤us_?Qú ŒgŸ :~âߟÔûèä“T… ©©u=ÄgºbÓÓߤ“O¼_ÿ^Ù+ &Uÿ(ß'6‹ú«Põ>Iü?ªzŸ†%¥gÓ8™ðW¥4iŽß*þ6Îð­F%´uI«¸Òe¡Õ±…ãà¦Õ8”´: `, ­žZ¤'˜V“.ÔjtÕê;´:Haßôp¯¢¿ëဴ¢MÕ€\• z8®çLM¦2×ÃÔÂqŽ0ë¡BAÕàùc™ëal‘9P=¤\§‡JÁcõ0[Ó­‡N ‘_¢®S¿ÅTÊÞSyZѨ˜Ú ÅO Å4×3HÅŒ-àè7ÅÔ®¤˜ÚòƲPÌ©EzBÇ“ p¡býXŔӲC1&»\Û:S§GTãv\ß›†ùI´ |²ÿ4ÔÜÏ•ãÉžVüMÌÖÚ™¹ Úk°‚»î§²›ÏùYk&Å‚ñnÖ«!•?¿8;kžš[ëTúØ:–aÖ:Þ×éfjÏÆ[ ë\ú_^>üîáZ†Iimû±2WZ³¦Cš\#âàVVµ 'ÑçW‘¥wSík yÛ°ðhò”¯îçë/84*z˜f¾½Ÿ4õ¤C÷ŠÆ•Ø ”r%”rÜ5•ÅJìfàè·•Ø• PÊ)1€4@Åé ™ŠpáJìö ¤R¯¯ÄÙÔ6I¹ñÍ;ËÕþz5¬®ÄٷЮyå_Ø$H©›ŽÕOêÒ²7ݬËiÑvÄV4*sv'Jv'¸Ýi* e³Ý‰ pt€›2‡’ÝIynwšÊB™ýlw"ø7¸T™Ã»Óº2¯š™†?T'ß¹‹Ï¦A¶}¯î:ì[J.ÈùK2Õ'ʰ"{Ä:$Õ~"t|á…;ð³~ª?IÇÁìcžb¿CK+nxv¼OQ ~æíiëê ^Þ—°N¾Í=G:Dv¤ÓÃP8ÒéA³C×TæGºØX Òç#†Ò‘=?Ò¡—Gº©²þÈ¥_w¤Óé´X~ÛÛõìíêß"³oÕÄ +Ö1‡½öÓô–Ml¾ˆÖ…Ô_AöÊ«_táW×÷üçªÏÂŽ¯ÕsšÖ±k;O+vB¬VžC¬ %ˆ,ubõ !vj¬?Pé bµrˆÕÊréÊ ˆ-õG.ýBˆÕ{LÝÖ VCmã”CÞ°Ø‚µu<Ù±VÖ¶ƒSÞe[Ç-ðµ­êûÜõSAûv:ßw¼ŠÖ]tÄ$M,ùÊЊ7Ñã@TåÖã ?Q~™ZŸ½»#O™ïTnÀÉT ýzya™Ì^€n= ð0žÌ §ÄžeÊðËmJ—;ÚðË©,–)“.wH ÒçeÊ”.w´1Bº¼Ü‰-õG.ýÂe ê«Òê2e²y‘M¿4ýÜöÛ Û§Cw»æû ݾ/ÍŸþdCT¹d™ÜîçAð4N_ƒC¼¼éÊ*È·¹½¬áèe¡„^“í„â‹u½¦Àú•>£—Õ%ô²JHW½¦Èú#—~!zÙ·XY £ß³a£}/¸ézéÐM×!×Þ­}zr“¸WìÕ?¯¸þy]Ò?\C‘¾¼˜„s}ìfìf(9°Åا2ØÔÂqŽ0¬JìfàìS™ll‘ž9°Ó®X£vXõ·tYðzßÛ~ÛsW—i[ŽEL؃¡'š°ÃçWý7jíéð >ïêÈþ®ý±¿­zYõ„Ú}y±“)Žë᎓¿ÑüÞÀèÒ½ÑüÞ`*ó“l¬?PééäotéÞÀh#¤Ë{ƒØYäÒ¯;ùsä±a}™[8ùwÜlfú\_"3•ÃÔo޽p¿<´¥ëîÁb-7H+N<dS²Ž°=“¥.äûv!?´nóù»¿S(¾¼•m>ˆè¥è<:f*‹m>ÌÑ1T€£ܶùPŠŽ™²PðdtLl‘žEÇÐ.ÜæÃ‘÷ ºm°£|­öϲáH -ã9”T4êŸ-Æ•ZŒã-SY蟛Z¨G¸éŸ+´ËZ¦²Ð?;´ü\ªîÐ{…uý[ߤՠ+n»ß!´už:joZ±wcì¹k½ %×z¸kýTã\ëI Òç±/¹ÖÏ]ë§²ØûäZOú#—~áÆ8j‚_Í,òÌWb5îµ2³zd [|€ê‹g6^ýeß}Þ¸ä.Vì…ä®áK®á0p×p¤kxl¬?Pé3D`É5<Qˆ@é[ ë\úuáFäuЪ^O K‡Ûu=à8ƒ³‰‹rSxRsenO¿´:6Í Þ·GÂZýëÕª›vüûO³!j¹:ªDëÎXßöŠÏ«Ï²WLAÜ/õ´âÄÀ-ë¹N´û ­¿oÐ5an¿µ“>ØÆ×+Þæ—ЪôzWX²‡Ú"{¨ì¡6cµ7öPËÙC­dµEöP+ØCmÆjoì¡–³‡Ú§`µ ì¡GðªÓáûÞ ž{½÷Um4[—2:E+‘A2Ú"© ¤6c µ7RËH­d µER+HmÆ@jo ¤–3Ú§` µ ¤G êÇÛ·­Ù.œÛr#yMFóVd@qQe3NÔ¶dã@LÎåºíðw=•`K¼ßq“6@é…/C±“$´®HBë ­ËHhÝ„ÖqZ'Ih]‘„Ö Z—‘к ­ã$´î)HhÝ íP¼ît9_Éu¹. D‡9éT/Ì…´Õ‡_øZÇú€t§–úêö]«ƒ£Ä¼Uœ¸:®žÏ¿¶7@o3ù“vÒ;IsìŠ4ÇNлŒæØÝhާ9v’æØiŽ 9vͱ»Ñ;Nsìž‚æØ-Ðý;8UŸ1OMdwj žVœx! žÿ¬_Æò:¤ßì}:Ÿ¯Ó½8WPÄ5–ƒÒ5–~å@^c¥Ž pt€JCéËÈk¬Ø"=!»Ærð ×Xn×ú”^§IÛSàнõII•ê„ÞUßìzz“ÙO²ô’¾êt }ÙÂQ(3áo!-ªö™P[—l+îœ=È«Ó9[å\)¶jüÃü.“±U±°þ@¥'¯NçJ±UÎ)!]ÆVÅÈú#—~W§[à? mJ¦,›¡õ«ÎM[ÔŽƒ·TÉ…;íCBHªàÞ嵞«ò!ùRCœð$ú*’•d4à'ìÈ­c³waKÙþ›-üðÙyÈômØRòþåÅ+=xü› ¥ø7xü› 2þ-¶Ö¨ô`C)þÍyÿ漌‹-õG.ýB€]àf_ØÕ›ø…ôÏ[<ÂwÄÁóØ„@GíûÜ:äl17_÷£ta=!õÖÑæøŠt ¶wEêˆEÞòB¶l*ê u%÷T´ó÷;A{(½ðkŠëÃuž_ LïÇñc™TÞ1¨Ä¢'<Ö‘?ÈòÀÖ-ñ¾õO6˜}sãnG2¬ýîâÍO)P}é§XƯĒW¥;$¯ù’×ò)µp\€£ÌxãUéÉ+~‡ä•¼CŠ-Ò²;$¯žáÉ/ð‡7{ˆEžoZ..hŽ;òµv¹GzB€¬§³ŠÏ8±W”Ê“¿7%“¿7Üäï4ù§Ž pt€›R™’Éß#&ÿØ"=!3ù{ó &¿Àv|„R­×ê¾Ç§dêÛçÇÓýñ®:}:KhÍàhE£ÎZìàm)ØÁ[ìà­ vH-àè7µ¥`o•@;Äé Y°ƒ·Ïìà8~ÐÙU—æ÷µ>#¡–§¾AÑŠ3­ŠÏžJôi—d+×&>ûŽßè‰Éê›O|.La½®49V€Ö‹ØïK±#ÞóØïeìHjá¸G¸­/ÅŽxÇcG¼“±#±EzB;âý3ÄŽø2ç€vÝaù}íïƒ9Ì¥œ y³XʩĂª¿2¬îH%ÖžXk!oW5ÑU–Gk¨7­‹ïȉÔÞ&x¼—wÞíÃSb(¥Ä ÀSbMe~·[ëTzºÛ ¦”+žk*󻽨YäÒ¯»Û P· `ñ=Ç=kKù¯¥ –Ðì>¯ã7rM¢RRæqG+ö‚„ålÁ–Ø>‚ãlSY€„Kl¤?Pé3HØÛG°œíc* °‰íƒôG.ýBpuCîfÚߌ:ê°1ã`ª‚ývª¨ùÄROÛ¹{Å^Í÷œe#øËFðœec* Í÷‰eƒô*}Ö|_bÙÞé’e#¶@Ö¹ô 5?T×úsmÉ»òˆm¡²ØöØÃEŸÙ£7,Û¹Ôçy¾ÎQ3g¾x u¯83—&2UØDÒôÄ3¡Ú2ÃòCX‰[²z"Ÿ ‘‰Ï…=ërŸü€%Ÿü€Ü'*‹u“O>éTú¼n`É'? Ò¥O~l¬?ré®X¿ñ8à>Ã|¬šN2x9Óß$BóNCZq®ñ ë!º7²ªû7’Æ'3ÔÞ`že½nª¦†Ï…تËU jBö<¼©n$êYÝëFµŒ÷©j3k‘bä«“vá gªPMl_'Øô 1ü!tžÂ¦Ð´µGǽúÑ•¼úÑq¯~tÒ«?¶Ö¨ôÑèJ^ýh¹W?ZéÕ[ ë\úu ÕÙü?’íý“úzfÞüŠäPk×öê'"q1ŒëøQô×(诱H‚þ3úkœé¯‘Ñ_£ ¿Æ"ý5 úkÌè¯q¦¿FFOA ô×늱žù÷“xž²C‡IÍ0¯z@8žUä;>ŠãÇ3–8ž}œž÷™êç™}ŸË©°þ@¥ÏzPäxFÁñŒÇ3ÎÏÈ8žñ8žÇo^·ú®ëÁºíçÐÜ^÷j9"}Ê!®1=ùô«Mó—´J*Ý“=¥ƒö}œvdÏè ­Ø ~à¤Ëc¹`k‡IºœZëTz„„±\0µFHæàÔYäÒ/„„ÒåuHX?ÖWs2?³«X¦e[ yí®1›î¨6xëœórò]ùcòÄ,ØlŸ Éa’²=;M+öÂ$g{ËëçXë8I¶çÔX Òg˜,±=µJHW&Û3í\ú…0¹Àö¼ “ëN†3Ke_êú§Ù„<*,þ=q·3†& ±´b¯6súç±\0”µÀõMÒ?§Àú•>ks‰þÙœþ9–…6'úgÚ¹ô µyþy]›W]¾om^È7³áNïùçà4h›RD·’äD,"þr-­Ø‹E9ù‚mr¬Õ-¼–XäuB?P,rȱÈl“c­çÒ—Xä|B(¹'°MŽßx‡mróü;ÐæÜœYׇæœÌ)bçÏšóR£ªzšu‚UìUÕ๪†¢ù…ù3ó)I9C ª#.Ùñ´æv<­¥/¶@Ö¹ô ‘`!Ìf V}žÎ6´º÷ø:4óýl©уFÙC+ö¢p+¨†’4f]¦ú Ò [ëTúŒP²‚j0Bº´‚ÆÈú#—~!zÔÚÖÑ£ ¹êöŸû¿TgyδÕA [WÄúÙ¾ýTð¨oѵXšiY${Õså’Ms.°Xê–¸Àh Ògu+qµJH—4¸ÀhäÒ/T·:Xƒº­“Ò¶ç«Xð!;×åöT2¼8ÿ5”9Z±wþsª¦±\2”iNÕËbþ'ª&Ú¨ôyþ—¨š¼æTM±,æ¢j¢ý‘K¿pþשšæÿÿëwu‡x vÄÒlùÂí¶óÕ£®R²£ñ C*öê*r“J&¦˜“h“¤‰)¶Ö¨ôYW±hbBabÂÌÄ„³‰ ™‰ ŸÁÄdêt< ººê 2g\Pp›Ì-S÷y ÅëwGõ0³wМB¾Å¡¼ËÌPú!Ç*vê¹QÜ€dTÉ€d47 - H±°þ@¥'=7ªd@2ŠŒ’¤ØYäÒ/Ôó: κž78Â<ñšœ=kÖ¥=X/?ßmùzGëm¡ ÙtW•ýk~`A¹|&¯9ÓÇåãàò+ \>Þp.ŸXféêçŽ pt€”®~¬(pùŒµF ¸|R‹ô„”ˇ pYºzoê\>a‹GȆüc®aëþv‡f°[ {ü?-ç€êfDN #]ÏòŠïÛ…Éï™U@k0ʤ$£Ž8Wd`%HŒÆŠ‰ÑXë8–H£¹…ãàV%£±V‰”«™Äˆ àßàR°ª“V«^:›RÜcˆl´ßäxÒaèÐù¦wé&ìhý§Ü:àiE£þ n±¢À­3ÖWOÉ­3·p\€£Üô¿Ä­ã çÖ‰e¡ÿ3·À¿Á¥ú_çÖ9Dÿw$‹6¨î Î’©CÒ¦³×–Lë‡ ‚|÷»!v4"P¶^ш"`OÜO» ¦°¨%" ž!†"„ŸøXëùÁKD~†€"„'à¿õf"¬ç ª§ÒÛ‘ýá[.‹Z.‹çù-v¡L&ìh”AÂ">EÁß+ÚPÎ">VXÄ=¨ÀTæ(“Z8.ÀÑf”¡À">ÖZ>À XÄS‹ô„”Eœ pÊ€:Ò|ºÅǦãÒ¿ 3Ç’ŽÛ’ŽD¡[ÜlCQGŠì7Ùƒ¹°ƒ‘ÔÝÀ0máIE#RhaN]2§‚ææÔ©,BÏæT*ÀÑnH¡KæTÐF Í©±EzBfN¥\ˆf8)ÖSù˜Ú~¤g£°žÐð”×·¤þÀ¾-‰ƒ{‚…:vsu[M=çÎZ"}îŽ À'=pvŸt8ø !`1†V4Ó,@É4 ÀM³SY̦Y*ÀÑnÀ%Ó,€HÓll‘ž™féœjš]÷ 33ýFáé\›Æ!ŒèWÜ{nšêjŸ+æµ_×ò½jÔ"ëhÅN_à¤c¹äÿ œÔ#–¹¯ $RÚ¨ôäk%RœÔ#–¹¯ $RÚ¹ôë|M Nê±!ƒ@6ërh=cóöÜWMÇ‹c|™òp¸@+ÎM 2=qí‡ZeϨäŒáÕ*3V?,Š®3MÕÇ;‚oi!sKö¶~¨J­ò-má­êIÔbšÛÇÑŠ0k5wݵ¦äºk wÝÊfc `ýJO0kuÉu×jîº;•9ÌÆÈú#—~ÌZS·|ËSâ·œ×ÝÅ:üà¿%•YX_,ñ”ÓVÑŠ½J Ü/×BÉ/×Zî—;•…Ûä—Kú•>+1”ür-p¿Ü©,”’_.é\ú…Jlë†åu%^wW™éþr³ñ¦ø“-†‡žHKݤ,Њ½3Õñ bëJAÄÖñ â©,fªKAĤ?PéóLu¥ bëŒ.ƒˆc dý‘K¿p¦úúfq}¦®'#9…‘¬š¼e¸¾˜|¨4Ú]ºó¥¢c‰ª*à¦xÎì¡ëZÜzÉÔ¨çÄJ{V1éù§—O¯¿ŒÓ5ž-†×ù¯Ï_š`ȇü$¦~G×¥Žé|å^ÕtŒÊµÆàDͧÖ=Êjž# ¸²) á­®Ú¿ù2§•/|’fŠ1o‹äÄÖ¾¹ô3ˉX'Tû`µOR#¯ßôx`bT°ªÒÒŒ¤5ßWÛÎRø†?Öú̺WúDվǼPöõ™±žï>?[T ³. òofB»±rÜíy¾â?©[¯Ÿ^þÑøI= endstream endobj 421 0 obj 7642 endobj 425 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 777.620000 174.240000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 426 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 768.980000 202.079999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 >> endobj 427 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 760.340000 115.680000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 >> endobj 428 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 751.700000 175.199999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 >> endobj 429 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 735.379999 208.799999 743.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache >> endobj 430 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 719.060000 104.159999 726.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn2 >> endobj 431 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 710.419999 118.560000 718.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 >> endobj 432 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 701.779999 132 709.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 >> endobj 433 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 693.139999 156 700.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 >> endobj 434 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 684.500000 114.719999 692.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 >> endobj 435 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 675.860000 137.759999 683.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 >> endobj 436 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 667.220000 141.599999 674.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 >> endobj 437 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 658.580000 182.879999 666.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 >> endobj 438 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 649.940000 182.879999 657.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 >> endobj 439 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 641.300000 167.519999 648.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 >> endobj 440 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 632.659999 142.560000 640.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 >> endobj 441 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 624.019999 193.439999 631.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 >> endobj 442 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 615.379999 155.039999 623.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 >> endobj 443 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 606.740000 118.560000 614.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 >> endobj 444 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 598.100000 227.039999 605.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 >> endobj 445 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 589.460000 117.599999 597.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 >> endobj 446 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 580.820000 117.599999 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 >> endobj 447 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 564.500000 152.159999 572.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl >> endobj 448 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 548.179999 102.239999 555.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn2 >> endobj 449 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 539.540000 170.400000 547.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn3 >> endobj 450 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 530.899999 196.319999 538.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn4 >> endobj 451 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 522.259999 241.439999 529.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn5 >> endobj 452 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 513.620000 144.479999 521.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn6 >> endobj 453 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 504.979999 181.920000 512.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn7 >> endobj 454 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 496.339999 178.079999 504.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn8 >> endobj 455 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 487.699999 164.639999 495.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn9 >> endobj 456 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 479.059999 196.319999 486.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn10 >> endobj 457 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 470.419999 181.920000 478.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn11 >> endobj 458 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 461.779999 250.079999 469.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn12 >> endobj 459 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 453.139999 175.199999 460.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn13 >> endobj 460 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 444.499999 135.840000 452.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn14 >> endobj 461 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 435.859999 160.800000 443.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn15 >> endobj 462 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 427.219999 152.159999 434.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn16 >> endobj 463 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 418.579999 151.199999 426.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn17 >> endobj 464 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 409.939999 164.639999 417.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn18 >> endobj 465 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 401.299999 143.519999 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn19 >> endobj 466 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 392.659999 247.199999 400.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn20 >> endobj 467 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 384.019999 221.280000 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn21 >> endobj 468 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 375.379999 218.400000 383.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn22 >> endobj 469 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 366.739999 251.039999 374.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn23 >> endobj 470 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 358.099999 339.360000 365.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn24 >> endobj 471 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 349.459999 154.079999 357.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn25 >> endobj 472 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 340.819999 281.759999 348.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn26 >> endobj 473 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 332.179999 257.759999 339.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn27 >> endobj 474 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 323.539999 250.079999 331.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn28 >> endobj 475 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 314.899999 238.560000 322.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn29 >> endobj 476 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 306.259999 253.919999 313.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn30 >> endobj 477 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 297.619999 264.480000 305.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn31 >> endobj 478 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 288.979999 150.240000 296.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn32 >> endobj 479 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 280.339999 176.159999 288.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn33 >> endobj 480 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 271.699999 225.120000 279.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn34 >> endobj 481 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 263.060000 113.759999 270.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn35 >> endobj 482 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 254.420000 238.560000 262.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn36 >> endobj 483 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 245.779999 201.120000 253.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn37 >> endobj 484 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 237.139999 208.800000 244.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn38 >> endobj 485 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 228.499999 217.439999 236.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn39 >> endobj 486 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 219.859999 226.079999 227.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn40 >> endobj 487 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 211.219999 205.920000 218.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn41 >> endobj 488 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 202.579999 213.599999 210.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn42 >> endobj 489 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 193.939999 223.199999 201.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn43 >> endobj 490 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 185.300000 228 192.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn44 >> endobj 491 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 176.660000 232.800000 184.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn45 >> endobj 492 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 168.019999 254.879999 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn46 >> endobj 493 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 159.379999 173.280000 167.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn47 >> endobj 494 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 150.739999 249.120000 158.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn48 >> endobj 495 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 142.099999 240.479999 149.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn49 >> endobj 496 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 133.459999 230.879999 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn50 >> endobj 497 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 124.819999 238.560000 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn51 >> endobj 498 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 116.180000 286.560000 123.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn52 >> endobj 499 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 107.540000 242.400000 115.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn53 >> endobj 500 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 98.8999999 295.199999 106.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn54 >> endobj 501 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 82.5799999 107.039999 90.2599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 502 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 66.2599999 111.840000 73.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview >> endobj 424 0 obj << /Type /Page /Parent 2 0 R /Contents 503 0 R /Resources 505 0 R /Annots 506 0 R /MediaBox [0 0 595 842] >> endobj 505 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 506 0 obj [ 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R ] endobj 503 0 obj << /Length 504 0 R /Filter /FlateDecode >> stream xœí]Íݸ‘¿÷_Ñçé¿YÀb±g¼À0l`ÁN²Aëä°ÿþŠ¢ž»ªÈ’(Jj½îñ›|dQO¯>,ú·Oÿýø?ÿ|üéý§ÿ}ü2ÿýþÓÃð4ø!ÿ÷˜þüwèødtþgˆîICúïñËׇoß>>|ÿÿíAùiâü×øám‰LðŸ_þþðS^ü!÷|zÿã¿þïQ?þûØúëãþküë3½4àëCŸþñ·ü¥•Žcÿ+}ø—‡ÿüÝãßÇGˆÝôÿßûÁÛ}OñíûT5ýÁSëKoÇÅñá”ÿçÆñ?=ü9}Ÿ¦ÊGóÖ'7ý _s†§‡ }ÈÿP1õêGïóÀôÛ¥ö—ïž”£šGX2ßbêãè©ó”G27J}lãñúiù@©ÿåáÝïÈ{PÅ{Pä'ÒÏïáÛÂÄwŸ~ú‰?ÿyühâèü×ç‘«ÆÆøíãç?>þË0¨Ÿÿõñó_§_(whÃ:Ô»©Ã>w|`#†÷l„ S<ï¼v“TÍŸX>7wØ'k‚›pþDOŸ„§òGÏŸü:}âF¹ŒŠx‘ˆ âÂüëÈDÓñ‰L-NŸø'­bó'üa^¨_ûÝ乚¿Ø…o‘©þúyýg®ˆrœ„Ò}eíîøÛç“D -„e@æ'5ð¯]¼ùu;饦O”¾}Äßêú»cïê냊—·CÃú! ë‡XѰ^ D¦6Õ°ÓKæ[L=kØÑ&T4¬¿¡>¶©†F™”úuÖ+ݯauÁv…†…ÌBêÉYŸT‚—SßòÌÅ;’M€HdÁpõ¼,Ù¤/I6®"ùòõÉÜØãÈßkÍ ·™2¯Ì³6öwìÕÆÚQm¬}M'ý‡õåØfÚ8°d¾ÅÔgm¬mMkè®Ó óR¿P›ï¬Ó¡ùˆRÏ}xòAQ+k Y=öp·<§Ðhýži£ õ]U4¸c¯ XCÁÚš XOYul3AH#,™o1õY¬® ‚UŒºâ‚F™”ú…‚`ãAˆgBáZ”VRæXY©‘`yžý4¹_öMÿZ¼£K{-+'9ª‘m~ûÛZðrdÇÁ­(´FµeESwìE£$”I&£*\â¬Ä^3gT^¥2âo8‹ÞS„7%èßdPÒÜùg˜ÀQ"Ѳ3[‹ù‚s”TûêòTcùñ‹oú~…Ÿå@¦P?•¡ OòA\¸xF'Jðkø:âÓË\ÝÅœ«¼0—M#ëÈâ gÍ;ÆóXù=ʨµ(›‘BX?´*ÂQíEÇ„€;vºoA)â¾…QÊK÷-(K¬Ô¦îÛ4Â’ùSÏî[½Ò} Pêc›ºoÓ óR¿Î} é³FSQâö|Jé¾½—DHÆ›T–eoù<'l°¾A=#ŽÊîØËušîSÛ- †î¥6ã:“w‹Ð|‹©Ï\§k»EAÓÝ¢Ôf\§ónš”ú…\gäÝ¢u®{¿êw‹Š*]æT-:DZ6Dò'?‹J^mánãPHqÇ^î¶©¶†Ô§×@øÏq¤~aÉ|‹©ÏÜmkH}°©OmÆÝ6#õh>Pêr·kw¿Kî.@Ë‚»?ˆ<,î’.ðã/R€½z‹<,KÄìÜÔžM¦&JžÙ²%ܳÿ¡Çß uì•OqÔàk8êèïPnöGFX2ßb곬øŽ¼aÔ9Ž:2(õ e%ˆÎDƒ¬¬æ ôèîS8µ†ÖÈ2ÙnÐŒÙîF-8X¢S&+ƒÙ¤6Šbxvص¸c¯(FŠä†XCrC¤Hnj3QŒÉEó-¦>‹b¬!¹!*F#¹Ó óR¿P£Œä®Šâúó+ÅFFÉbŠvìäá8Ðp6µp64œMmÊÃÓKæ[L=ópªá,°pŠpr8‹æ¥~ÇaG8»¾-'s]š—¹{!86Òù“­~SQBÖwì•"EÃó¨káyÔ4&²XÀ;… XªV (`•ÚTˆ¦–Ì·˜z"j€ °Jm*DÓ óR¿Nˆ@íÉ')„h5ÁDÞuëÑò Ðè7n0Š÷hÁe…Ò¡?äGÚ;±š—³ \û5Út(t×:ܱWçhŠæò\Ó9†¢y©ÍtŽÉhšo1õYçèšš¢y©ÍtŽÎhš”ú…:ÇìÉò)tÎzÚȆ "y,’u„žÚÊ¿°âjIƒ’‰¼Ã{EÒRä l 9K‘³Ôf"i3r†æ[L}I[CÎÀF#gÓ óR¿P$Ýä¬Éõì"™ µ&=^領pø€%àŽ½Lí)à¾ø€§€Oj3¦öðAó-¦>3µ¯>à£ÎŸiù@©_ÈÔþHÀg=O§ÇE²Abjù“³wY°M²éAqøëZø‚ûd2Lu &ÿê=»T ~Ç]Z{ÿš[eqÇ^Å)r±†œA¤ÈYj3Å3r†æ[L}VŒ±†œA ÈYj3Å2r†æ¥~¡bŒG"g É_™ò *¦CÍ.Ä›[,ˆèdT ¸c/SA²âø¯’©Ç^‚dMmÂÔy„%ó-¦>35T‘,`HHÌH$ îÉ¿ñ‘HVC.–¬'EŒ«‰Yua›Xw|=ް.ê8õH}Œì….?Ⱦáð xh8¥®å$žÌµóÐâ'òYí"ðRòyò"+ªxq´(ÊCUU/|‰Èoº|ŸF2 çËåÓêÍ¥)F©1hCБŽ} >P à+¸âø×@-@¸C¶ኈúdÆvW{¥î®˜G™”ú… ȸbÁlÛOd/$õ”í©í¶¡ôÓø6žñå,î¸)|‘•MÌ‘ÅÈ7XLLŸY"õŽÚßÄ™irûË(ðaf«ÛO x¼@?uÜ1:ݰÌ4?Â8"?áwô$¶üôâ\©œNl ²—±-{J ˆNvCMÕ¢ãÐ2Ok…^6ísÍe]<Òï2þ,è@xÜÑ&j0T>Ô`+ò¡OØ7µ©|äžðxY>Ô +ò¡ÅPL>¦ù 5–¼Àuò¡ÙAÖ‹È[ŽE=4±\ðÂ'íõ×K»ÊÈÑÁÜR2m­¦ÕéE_[mÞ$Ô %„§pG£PkÅ„ZëšPkKeN[.ÔÓO x¼ÀM¨õPjt\¨Óˆü„j­îA¨µ 1!Ô뛾²™X¬æ¤õðëƒí¦³4ÝÇ~‹öºÐ¥’,„zCÑÁ ZlGuýòýn(ÚÚñ:»ª?·—él®óŸ•$Ê`±*àŽó ý§…°Zx±²–­öƒ½‰ñ‰­ã¯fGx¯ x•­¼ÊR€7µix?°d¾ÅÔsxŸLGÞ†R7 àÍ#€ÌJýºð^Yà]7)ë^ qœSöHk°à¦@vú*ˆtTpŸ«ï¶¡ ¥ôhkpG£#çsä\¬9ré:'ìgù;rÓO x¼ÀÍ‘s¾æÈ9GpŽ;riD~BO9îÁ‘ó{@5.uè…œ&Ѐ^ÈNËËÜPqÿJ¥ÕgðøØ«Âòš¨B MT¢‰©Íä1Ìh"&àñ7y 54QÃàhâ4"?!AñÊcEçy\µ“²BtÖïÄ”S^W]<ó‹ÈvHè%cÅz£ÍØRSšsÇ K Nü&)רx¹qîh”rT£èB(Ù,tp½.dwÃâRëvÀ <Î…jœ ,Î…"Î…[œ 4ÎçB-Î5‘ƹ&ò8w‘ŸÆ¹pqîB]õ#vG¹(ÙÑè*ÁÐsbNžsêÆÙÂIyÙØÈB\(Ìû¢W±PB|C±‚=a‘ŠiE=Ê—)v¸·í)TJßj;NÜS"jAt£ àŒôf¬küÞìkŽ3ùÿG\! ‡Q]Û!<ºñÏ?þôðîÅ5®Öi»Ö.á?Cãv` :Y¬H°p-F{•ÐùÔØ&ïå~6! ño½L*1ÆÈÏA«4îØÍõÚ]Îõ eà_†ëw‹'sý†ê¥E9:]Û hTB~´¸c·@Xs¹@,aXå*Ë[PeúÝ•*z* ,<½r.äEñ®Þ—>!ÛŠ dyGÕõ­w¸c·¼{u¹¼/Ô§y_E[7¤ê–ðOA¬`†‚]6¤¥se®ì9†Ú!²ªX7÷œ§¹¥ž÷»Ù--+_/~Òg•€ëʇwœ‡È«üæ_Bµ¡†Ô¡ÕJd }GÈEq/„z˙֒¢)ó}ð6Ö¤a4·‘æ6Ö@s)hn#ÍóO x¼À šÛXÍm  ¹ 4ŸFä'$ ¹÷šÛ…+ްåëåèå:<ó'éÑk¥Í¶íYtCJšG»ýC¸t 7œÁS=° |}ÝÔ;Ô†½4.ùŠŠ8cß7¹…]o‘ü4Ôq¢[è#Ó®ZޝX³ýõÁiào~vêrÚésAêu¼RË׌Á[]tÀÉoÖ£ÙSâö²ä䎴Ð#ÃV­¯Ñ™ÐqG[øã K u¦–ê M Mmþäžðx9üq¦–êŒa ð´ÐiD~B’Џ.üqVôQ“Å…CíÊbO˜¾Á ’}k¸x«šNÔVë¯à…’¥J v“^ºÒŠ7%÷8‹v;&õfyÊîÉ=–Èï9‚ÔîRÒï|lÃ_Ä.—Ò]¾íãܹÛ>\uµp;캼lØ=ôB„v¬dÜžó1=¾ˆë4ìží¢[½*‡¶X àŽF¯*0PÙ…¨ì•S›yUa•1¸yU¡*;OAåÔf^•ŸAeD€~ƒK½ªp*¨lV¼îÚÛ¯©ãMh~ƒèõ¨¨ƒ™÷8˜ûÁÂìh”MPêוþõ~ÏÖÀz•­sÒ):¶ÌJò[Šçz‚·¸£Ñf†3úXÃ}¤8cj3›gœðx›Í5œÑŠ3¦6³ÙaÆú .µÙqÎXðÜ‘[ÚÇÞ_ÿFâ;¶Û6¤5nØÛÞðn^8º»[ÍzDˆ˜‰¸cov‡Ë¶Ã°fÚ®hzT‘˜°½p1áÝ[èÆä’0 ^ᎽÜÔå%<‚Ùà…¸o’·aäÂj ªo†/5BwFW uìæKsyÎa0{ “#ørý¶ÙZ‹,e‰ceDf¡€ð›áeó´˜Ñ$£Ž¶¨'8–À\-/8šÀ—Ú4êÉ#<%àñsÔ3~ÝJÔ,MàKmõL#ò’>¼ÀuQOpGFéçÞŒ°'ê)÷±~;òËKÇ-Pm¿’åú ”tsÓNLp({L‘ŽÝ¶Ú_~ì?„s¡’õ Ô×wÎeþMÇ6]qœ²Ÿ;vóe¼>²†s#ëu¾\5w=U9ÛQ h<ܱ—cãpy4Õ¹Ñø:Ç®F=ò ù“û#RÚÆÿQ¡“†évÓçŽÝü¯/ú£>7ê_çÿõl„Obáx¯ÌË?$c£dh¼ùpÇnÉ0p¹dØ— Ì;®íy)Éè©q¾p¥¼N{õóW+3ßÎpGîË6ˆ¾–m=Í6HmŠ»åžðxw‹®–mÍ6HmŠ»M#ò#“l¼Àu¸[ôç†Ð{꤯ãn" $g”•l‡^c!‹®¼.+)9Eb5So!Û®øZ²PÇ`6@ƒí'¿^¶ºn#t½£ÐÙsÇ™“¨PžSS÷e³ËØËKÇX ›;2$#: ›Û±’!9þƒä0¦6ÍœFX2ßbê9C2_É™”RŽeHN#€ÌJýº ÉÑaí·ëîÙBÕ½ )GTd;ö¾‹-ÕDw\»}ÈQÄSj´”1½Ãê[²bÇ d1¸£ÑOvn,BíÜXzn,µ™Ÿ ó¹1LÀãn~*ÔÎE0l~nl‘Ÿœà \ç§Âð£ÐQÇfÅvœD¸¼(³ìam(ÚV:…Ë.Þp‰ÆÝåËvՀݼ1Ýè¨Â€ó±wœç¨¦…°Tn°Ü[‚ Y´ÖífO©ÁËXÿ%Ø‹OÕø†Ú/±l-@±s jçAÑs©M­Eá)˜­¨Ú¹GPŠ-ÀÏ=N#ò’sx ­…Úç7X‹ÕíÕ-§~;4ÆK ¹¤ßõÜÍ/â:í¼"¾ÕÄ(”&Ilj&&RQ~“A{›£Ý°Åëݳƒúò$0;v:”qsÿCѽE·ðÐÅ“´õS› éßí\iܱ[Víå•àvl"«ë‰Ú?dõuËêÙÁsÿ¦`« pìXèsÇnà/O^…pänÀ)©€Cþ¹6¿®2ì¶•+õÖý!—›®[ƒ€.ÞñwœyÝš&’|½èÙÐ?.Êb/þ냛ÔvñK¬ s‘íå@¬íå@¤{9©Íй8ïå`/pCçbm/¢a ð½œiD~B²—ƒ¸12;ļ°ýز=q轚E&S¡Ã \dƒŠæÄÇ »0­à ý M:N—4åÄßžQ~•QÅ•]‹%ÄÍ×xnÑÀ0К±£²S3ö’š©MlÁ<ÂS/mÁØQÙ©{[€íÔäù ñN Yà2[0>Ź;5ëõ åìË#î˜\88\(çc1êW”¼º'Ø’;ºaƒmh›mÙmœø€;N´mãBD²6T íÑÉ×Þng 8˜÷ߊy§R6†zî`±‹R.m:+ƒgÅ.´ëßü^ÆuÙ(Û¢ZÞ _Pñ+fnbY©ÎüëŠm@VY,_ÐC~Æ k,QøFòVîI®=î-îØ—©ºì/·+µ|Ç^RËwj“Lõ<Â’ùSŸ2ÕÇv¥–ïøvR÷¬–od>Pê—eªO!n%Wôul/Ü»sÈ}0ßdâçVVžxõu¸#ñòÇ‡ßÆŸdÒ+Ããü×—¯ML>”K~d?K³Öäñ±kî(ÿ”Ž™ÁR]:²º¯{`ŸwE‡§P·X¡òIþ yÒàk™ýÎ=ùü#r«Z['Šs@œ“bÔz0é#® kÔ2çãž_ı³j®|ÃÒœYÑ×>QÒ÷˜Ñ¶9ó/¶å»ÏÏ6 Ю‹ Â“IÖjìÔN*äùGÊÖãLJÿä¤{r endstream endobj 504 0 obj 7287 endobj 508 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 777.620000 137.759999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples >> endobj 509 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 191.519999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 510 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 179.039999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_simple >> endobj 511 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 180.959999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class >> endobj 512 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 743.060000 170.400000 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other >> endobj 513 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 734.419999 110.879999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_stl >> endobj 514 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 718.100000 88.7999999 725.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 515 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 701.779999 119.519999 709.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction >> endobj 516 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 693.139999 192.480000 700.819999 ] /Border [0 0 0] /Dest /!.#09#d3#f3#3b#23#86#c8#c4n#25h#91#ed#c5#f3#9a#20#82 >> endobj 517 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 684.500000 225.120000 692.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline >> endobj 518 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 675.860000 177.120000 683.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java >> endobj 519 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 667.220000 124.319999 674.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers >> endobj 520 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 658.580000 113.759999 666.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays >> endobj 521 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 649.940000 205.920000 657.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library >> endobj 522 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 641.300000 299.039999 648.980000 ] /Border [0 0 0] /Dest /_#cc#213#a9#ff2#e1#cd#d85#ba#5e#f7#9d#d9T#7f#e76 >> endobj 523 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 632.659999 215.519999 640.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning >> endobj 524 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 624.019999 127.199999 631.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 525 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 615.379999 263.519999 623.059999 ] /Border [0 0 0] /Dest /#efjA#8d!u#87#8d#20#01#cb#c1#99#fa#12#ae#16#f1#0b#94 >> endobj 526 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 606.740000 247.199999 614.419999 ] /Border [0 0 0] /Dest /#f9#21#80#b3#d7#88#9c#e6#f0#10#d2S#f24#25H#a2md#03 >> endobj 527 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 598.100000 285.600000 605.779999 ] /Border [0 0 0] /Dest /#bf#9cM#b0M#beuU#ff#1bq#ee#fd#17#3f#86#e0#05#c0#e4 >> endobj 528 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 589.460000 253.919999 597.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception >> endobj 529 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 580.820000 121.439999 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 530 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 572.179999 178.079999 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example >> endobj 531 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 563.540000 200.159999 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 532 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 554.899999 172.319999 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats >> endobj 533 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 546.259999 135.840000 553.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules >> endobj 534 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 537.620000 152.159999 545.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 535 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 528.980000 336.480000 536.659999 ] /Border [0 0 0] /Dest /#83#7b#e8#c5#3d#c4#072ls#13K#b4t#b3#b4#85#8aT#bb >> endobj 536 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 520.340000 299.039999 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects >> endobj 537 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 511.699999 324 519.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 538 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 503.059999 305.759999 510.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 539 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 494.419999 365.279999 502.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 540 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 485.779999 256.799999 493.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes >> endobj 541 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 477.139999 272.159999 484.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class >> endobj 542 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 468.499999 204.959999 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type >> endobj 543 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 452.179999 106.079999 459.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken >> endobj 544 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 435.859999 122.400000 443.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn2 >> endobj 545 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 427.219999 204 434.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn3 >> endobj 546 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 418.579999 212.639999 426.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn4 >> endobj 547 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 409.939999 133.920000 417.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn5 >> endobj 548 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 401.299999 187.680000 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn6 >> endobj 549 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 392.659999 149.280000 400.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn7 >> endobj 550 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 384.019999 196.319999 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn8 >> endobj 551 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 375.379999 152.159999 383.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn9 >> endobj 552 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 366.739999 156 374.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn10 >> endobj 553 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 358.099999 115.680000 365.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn11 >> endobj 554 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 349.459999 107.039999 357.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn12 >> endobj 555 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 340.819999 284.639999 348.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn13 >> endobj 556 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 332.179999 232.799999 339.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn14 >> endobj 557 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 323.539999 275.039999 331.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn15 >> endobj 558 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 314.899999 113.759999 322.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn16 >> endobj 559 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 306.259999 107.039999 313.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn17 >> endobj 560 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 297.619999 180 305.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_collection >> endobj 561 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 288.979999 214.560000 296.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn18 >> endobj 562 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 280.339999 279.840000 288.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn19 >> endobj 563 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 264.019999 84.9599999 271.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D >> endobj 564 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 247.699999 119.519999 255.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction >> endobj 565 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 239.060000 161.759999 246.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation >> endobj 566 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 230.420000 113.759999 238.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps >> endobj 567 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 221.779999 208.800000 229.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 568 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 213.139999 184.800000 220.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype >> endobj 569 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 204.499999 212.639999 212.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout >> endobj 570 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 195.859999 228 203.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout >> endobj 571 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 187.219999 184.800000 194.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps >> endobj 572 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 178.579999 198.240000 186.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps >> endobj 573 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 169.939999 195.360000 177.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables >> endobj 574 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 161.300000 130.079999 168.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features >> endobj 575 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 152.660000 108 160.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas >> endobj 576 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 144.019999 123.359999 151.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions >> endobj 577 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 135.379999 117.599999 143.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors >> endobj 578 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 126.739999 125.280000 134.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features >> endobj 579 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 118.099999 239.520000 125.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace >> endobj 580 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 109.459999 191.519999 117.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support >> endobj 581 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 100.819999 187.680000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading >> endobj 582 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 92.1800000 189.599999 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite >> endobj 583 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 83.5400000 149.280000 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples >> endobj 584 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 74.8999999 204.960000 82.5799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features >> endobj 585 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 58.5799999 88.7999999 66.2599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go >> endobj 507 0 obj << /Type /Page /Parent 2 0 R /Contents 586 0 R /Resources 588 0 R /Annots 589 0 R /MediaBox [0 0 595 842] >> endobj 588 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 589 0 obj [ 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R ] endobj 586 0 obj << /Length 587 0 R /Filter /FlateDecode >> stream xœí]Íå8n¿¿¿âØë‹’€ ÀtÏt€4f€9³Ù,S‹Lö?–-?“”dKþ(¿ªé`»¬'“²-’ÒùÝ¿üôŸ÷ÿþÇý»Ï?ýÏý—øïçŸnÝKÝø¿{øï¸Aº%Ç?­3/Ò‡ÿÝy½ývÿíöõöµÿÿßn†ã?ý‹‘à?~ùûí»‘ùmlùéó¿õýß]Þÿµ¿úÛýOÿÑÿóçH/tx½9á_Ç?„Òõø¯ðã_oÿþ‡ûßû!¸nøÿ?ZiÁíÅo[Åð¾5Ϫ»ûÎÃ]ÙÐô/âÿëö—ð<;†&Ò¡¿{Ñ™3|×x /ÎuVÜÁŽZÝ`ìØw®¹yÂKçDì¡ÉýSï{×z¼åNïUŒº ý ÿ¾‡'÷{Jý¯·O ïA$ïAO$ç÷ðÛŸ~¾}÷Ňɸó_úŸ†=þós?«ú /Dÿ÷ŸïÿÔuâû¾ÿü·á ªc âÓРç†Ï¬G÷™õP~hâÅhpÖtsWË©'öãÐ`z¡sBšÝ›t5#ß­¬‰Â[¢Ê‡ØÉ¡Á¾t~¼y¼æC,vb|N9`þÅs"¶4ÖòH:7üòãϽÍ“!#.LÀð¶£PHéqï·Ÿ–…Jè0£¥zˆ :Š…P>ÎëÐÚ ¹rqæ×¿Ü„²Q6¦@ fú 2J½]0b¸¡ï1ŽðA€>A­ŸÞ\´„‘A¶úá'[iN4•¾qªù ˆ=ÝÔ†)û%‘Ô¢”'ʤÓÅ®õZ%Ñ‚µN«<€òS$ºÊVŠ}˜oýtó±U£ø6¹×‚ɽ–9¹×šŠeÍä~è”`“Üë.'÷ÊSý5“ûÐcaGä1¸Pî5œ*÷«V·EÖ½8ßQ¹_0”'‹y2ÆF~Ý XAWOo¡kRÛY …Æ •i<Hèr ’ÊKÍrè”`“@—Hc)ƒþš dè1ÙD .È~õ~¦@þ¸*ÅÉ®>EÝ n¢‹¿¤ä‹f¨<•Ë’²`‘lõ{•Y0Hfn¨”Yk™ÌZ—“Ù~¥NDÊu\f‡@ f0ɬ…œÌZCô×LfCq„@d1¸Pf‹y†ùòòò òYDÈ3DÈ'ˆˆ'ˆDHv{¡ËMaqé« ´ª]‘Ú$Y…&±ýø҇ ßE=1?ð—ìxƒ¯ßŒ"=àÕd5‘³òº¤C†Q¥{çtӜɌ-¡êJ:YÕn•{é“jÖ¢B ;µE´Ñ>€è‡pMµÏÐC“û5¦>j 2£}$F]0í3ôðä~O©_¨}à™q®’)ÕŽˆuß­îïBt ý¦¸¡nñÛ¿ºø•.‡ IG¤pM¿c 3ˆ‹_ér’´A ×tñ;ôGH$ÌàºÅ¯tp l‘“²½ˆ3MØÙúT\JsÆ%p«ra)ݼû’Fá†ýÖ¹ôÍ#üÍ ­D4¬ÊËkï ŠB& µ22XÞ”õPy‹ô¥ò{²Ï0m™ûž+É3Mu9MuB ×T#=€Ì`ÒH>¡IO!´pÍ4’"@ŸàJ¤:}ªFÚáINml½{øH[µ /ËR=¨×¢EÊ¿”Õɺg>ÑÚ[TDV’¼›ä pmy·mC9ŠNѢà ;÷JX²ÏPÂeöJvd'®é>cè¡ÉýS÷J@fŸ¡„¡Ô…aûŒ¡‡'÷{Jýº}†’xqƒ>[÷À})®xÊ&Jë§ò/›ðÅzÉ_ÐA‡8ôËBº¶s›X™/¥Á/èt޾,¨ÖÚŬĤ pÉkYPT:ŠdÃ^÷' {ÁI#ø›Ù£X…•ÊÁÇJQø8\3ŪFøݯ1õ¨XU>VJ1ê>zxr¿§Ô/T¬º¨%+ë*|±Ïœb=2(0]O4¬)¤-ê»%P¡Ù‘†½’b(Ô©LêT†BášIŠ¡Nt¿ÆÔ£¤˜Ô©Œ`Ô9Ô9ôðä~O©_()fÔ¹ê¿\p´¬JÙBØny^)ÛC™‹“z†“ú'õNê N:3˜T¡Ëá¤ÊQœ4\3Uè"NŠÐ'¸Tú=8éº*ÜçQ(:FxÀ ç [`D^Ì(RBOª£FN VUÖøû€§U¯hŒ‰K¹|oý¦%}I€\9Ôæû"›zÿ{«$[0™ÄÁÔÛöôÓ—¿M}[˜„ ÐGywø<³1É¿ÂÚ–63a“åÛ×Ê!Þ‰(Š–êÕ×›6°‰¢]¶Çºcaĺ˅·6—ášÚã±P€D{¬»\±îhq¸¦öxè1Ž„c×Ùc-öàüëöx°úfí>„µKÁ0i8C÷7ìÄû´¤È¸–9d\KŠŒ‡kŠ÷ =4¹_cê#Þ§e×R1êzxr¿§Ô¯Ãû´*®â×U‘L¦ý¡x_ýAá-.ÁgóÎðP+ŒŒn¨´Ðš’×:wJ^kzJ>\3 ­ã)yL0ƒÉBëÜ)y­cÀOÉ=Æ’Sò˜Á…Zï€Á±ØëØ,8µÊXϘŠ7œèÀíá—Úpxè™Eû]ž‰z–µ‹þ!²1jX¢uŸ¼8/á;ô…‘4x$Ëòdnùäks¼"8 ùëMK°DêW 0¯”†œWJõJ…kfX z¥0À &Ã9¯”6Ô+®™a1Ñ+…Ð'¸Ô°À¯T…aY;Ͱ€e†Þ Ê}4,—úͰ|3,:žÇSÓîËk|ºÙQ«è‘jcsR¸¢è-ó¹i—ó¹iG}náš)z}n˜`“¢·9Ÿ›¶Ôç®™¢·Ñç†Ð'¸TÑ»>· E¿SY;æs›Îö¹Í/f8ðžEù›¢?FÑÔ9P|{ [Š…Þë¿ð|å,?‡ <ò Õw¯7£² pÅNzî ó9_Xx‹ØŒ™ŽûÂÆ@ f0ÙIŸõ…yæ ó‰/ÌO¾0O}aþ|a¦Ûá «°“;BR[ôZý¡‘…à o¶W3:ÅaIÉ{5K¿÷ÂáÉÄL5Ø­w ª>ˆgãé/{&ˤAÛŽKÃÿ¤Ô?iDÎ?iõO†kêŸzhr¿ÆÔGÿ¤9ÿ¤ŠQçþÉ¡‡'÷{Jý:ÿ¤‘¯½Á<¨íÊ¿b ²á8å¦[’±4ä-oqP‰``¯qCݲÉ(æ 4*ç  K2²lRÜA9öJ0ƒ¸l2*ç 4J0ÜA9ôGH”˜Á…Ë&µÇAÉåb‹ƒòCÍþœ=Ô(”‚»Wõ¨¡Rf óý“óýC}?ášÉ¬‰¾L0ƒIfMÎ÷c4õý„k&³:ú~ú—ʬÙãûY—ÙS¼G™­ ƒó2yÜpf^&O¦ÂeÉÏö¡ ¹ŠßómöT5›<ýÒ*ÿ¥WT 0¯ˆ±9¯ˆ±Ô+®™ ´Ñ+‚ f0©@ÈyE P¯H¸f*¢W Op© ´{¼"ë*ðw³hoȶ^Ÿ#dAYl‘榼DÆ¢ç£ì”—È8š—ȸ\^"ãi^¢pÍ6á~ÌK„îטzÜ„»\^"ãh^¢pÍ6ánÌK„î÷”ú…›p¿£MfYÃi„CN,•-ì9î°7ÍN³·0—ñ –7ì”;`uð [X­sÜ{-…±Ÿð Fu„51¯7ÛÉœÍY^ÈYÁ7­ÈnZA7Ã5]È=€Ì .ä¬Èn.”ÜzŒ#$›˜Á… 9qjàæzârüôÓ„¹•ƒ·, Ösºìòi—?mpþë‘?긪èwˆúžND’†ãª³¸Sa¶½Ôí&ÄeË‘  ÐË{œÈb!5ŽÍ͹ƒ¥XH U¹@«hH`¸fKÅ@L0ƒÉ`©\H •4$0\3ƒ%cH "@ŸàRƒ¥N \?¤×’³jË2t}csnáœz81yÞg!¬B¡{Å gz,™Uï@eUmQÊk–òôi@êw…©ç¬aBŸ’¯íÓ¶'aVy+¶þ²jSÞ0 z½™ÎçDjÅlid×7g¶ ² ×Ìl™d‡ f0™- ²³šÙ…kf¶t ²Cè\j¶Ì©Avëg\•**„u‹³aÍY¥ÔJ¼$ºJ;ª5…«…²ÒsÃÙµ¸çÙÛ²pIŽð—ûêµ8}î~|áú‘/•Ρ‡×à` /“žPõ|b–ëÕï´çË DnνCÎP$z¥+`ŠÑÍŒ-¡êJzDP¨³šó¦©â¾ÍwW9‚AÁ%ÕAá†éœ iVœÈ¥Yq’¦Y ×4ÝÃÐC“û5¦>¦{p"—fÅ šf%\ÓtCOî÷”úuéœ,†%r¶á¬x¹4ö\}K¼É‚&l°…‡À<(#ƒÃ ¼Å u N§X„†S¹ §h„F¸¦ αP€Ä§S¹ §cÀ#4†ãI„fpÝ‚Óéî@Ú eÑT¥“?¡$ïÒ±,ÿ1 ÔLR0ÿò}Q¤>Ö ã=qûÅýæ¡y—Ú2ª:tÎYÅ •Òn˜Ï™œÏêÆ ×LÚMtãa€LÒnrnEoKüÅ›”Yì :x ú#j¨Pß±C‡¾Ë:ô‚: ×T@Ç@ f´_.eÔwôÐa¸¦:ôGHb× ¨{°¥uÝ“Rèɲâ×£@KI*'®d€Ž—9@gœgh^IèŒ=€Ì`š¸2èx©è =Æ@3¸pâª=€ÎúÄ]÷ZïPß[âç‚ÿÉTth¶ÚÍð{Λ7ê 㦌À •ºB38Èëä5…ƒÂ5Ó:ÂA˜`“®Ð98ÈkÁp8hè1ŽÀA˜Á…ºBïƒÖuÅêÉzmK K´å Â›-伯 {=n¨œãÀA=äA=Ð@ÐpÍæ8Ä@PL0ƒiŽC.Ô®Ù71 Opé‡#Ñ‹ GP?HñÒ¶Ùg€ÿܰÎóå\ ×®ËÀyÞI¸…k ç =4¹_cê#œç­ËÀyÞZJÝZç =<¹ßSê×ÁyÞív:h ÒØ¯rÑiUâ'uñ ˜™G•Ï…S¸aï\ö4ÄûLˆ: é&¦ù9ÏÈØG3ˆÓÙç‚@zN§³çA COî÷”úeÓ9<úžúzþÜâüj™ÏIXsBݪÉÞÆ¸°•4n¨Zvˆ<<Ćq—¡•ìÃDzð˜ú¥˜Ç¸ò ãNúÎîWœÛ‹Ç>qœ ú.>DX89·”-»5ߪayQ“D\%ÖåÜ0§õìÙ»ò0‘ÀhS¨Ù:ì°!-ý8[\^'H ’&&½¥¼À 'F=÷Œ¨‘T*1ožËqÏA”ú”5 hÕeå6f]KQ_zN'ßëÍ(›kfX)f†cÙvf†iÝ÷±›áXùÐÌãa†cåvf†ié÷±›áXüÓ Ïq­.W?Ä ¯zsäçâþ%6ˆÅ¹‡?ËâŸøÛ° hÐwQõy·9v»)ûò:Úò ö©1âѦ+?)A--n¨Õ¢F0-jdN‹Í4œÑ‰5zR›3 À<ZÔt9-ª=ã¡}¢EµŸÔæƒ}Žkµ¨Ù¥®kÑõ¤–§ìÅß*ê{¬Í{YTì³~žCôÕJÓØ‡ÒÔ 7œ· Œˆ‚øP(0{ý’^hþ^·ÃÀ=!x˜¹ñÚŽ> [É``+Ø^ LBc ®G·ÄÞ –1æ×ˆ}HxÊàÊ™ìwø4Ö“é-œlݱ‘Ü´ŸÚŸ(rœÒž»=|›ÛCtÌí!ºœÛCtÌíØNaì”`ÓNAt9·‡è瑸=†>qœÄíx\¸S¢l˜¿[ÜÅ•æ&l:‰‘;¢æ.˜uK]ƒcs¾žpDe\À 1#ùÂ↽æIHEÌ“:cž„j=B3OCMHhÌ š'!eÆ< )8ÁÍÓÐÇž2¸Ð< ¹N­HWŸƒ¨¼KK7ë Uœ}§ÞÚRô|‹ƒ§%eîäCC¦Sü&™IÍ•ò}yÝ‘ùðØêÒ!¹QɚИAÜ·É.ËŽä¡íÛ†>žð”Á…û6)Êù9 XaCÂUÇß³nœŽ3ÄènØ-’ÂîRæ`w©ì¸|¨»Ï$4f0ɇÌÁîR2Ø=4pùvŸIxÊàJùPeØý€#ý-™nÊ^¡-EV7L>"’µûlÂHYõEÖŸ(O˜n8R~¸GÃn…  Ur A;&¯Ú% !ôÑ„„Æ &… uN!hŨD!„>žð”Á• Á”åÿ€T Æ£,QœÝ8“M[¸³î,!î,…;‡†-}€ÒÌc–$äÂ%Î# wúÄq’pgÄãBlIBŸoŸ¶[V‚;ª^”÷¥ê‡ÒÒPûêk¹"pÚµ¡"ÈÚÁ£ý •í-ƒ;Ý~rŽ‚RpC­q Ÿ–.‡OKÇðéÐÀuˆ›ðiD0‡q9|z0焇Mðé¡O'Á§+uˆ+ãÓGèõÕò†½Û³©@ýuAü/kºÂß?jIž£ÀÔ¶ÿh¨•dï©$«®ËH²ê$•²ÐÀ$yì”`Iö.'ÉÞ2Iö6‘do'Ñ}РÏq©$«nê³.ÉëÁê÷vB¸ú”Km¨×Nl5‰õûÜpž!0¢ñ}×>r.¼óWQ;“+ŠeÓÙ8æÐÎLϽ«„ez7Ö”azWvLïÊ.Ñ»C 4ó˜ô®Š•e¨ÞUÂ0Âp½;ô‰ã¬w+õîByš#ôîzê’Á¼[„ïJÍã£Hqà$ñ¸Ô …ÚEjKÆ…†¥Ø¹©ü ë€ÀÙÁðåD> í° e;.K)”€3ºH¤!AÒ¹ïU›& S»ÇÆSë7ÔêJÏb×´ÏÅ®…—Eô˜é’ص±P€yqœ$v ñ¸PWš…¢ZGèÊÕèÿ-õé7¥ÍnÈØ±žræy²g>™V«Uf._¦t‡*Õ€áåËL¶|™áåËLZ¾Ì<Ê—Z¾Ìðòe&[¾Ìðòe&-_fåË -_fž¢|™Y(_v„X=:PÞ§´8M·Ô½8dS¾~xሄA Ñ„_à °¹,Bµ£R]! pn¨r^Éd‹#^ɤọ̋8’¡Å‘ /Žd²Å‘ /ŽdÒâHæQÉÐâHæ)Š#™…âHGùªSÅýBMq¤Äl6¤)ÛPùè0¤žê¦l›EjåóÒ «-yçÏ š¹ÌR7ìE#¡h¤194Ò†F“ ‘CMHhÌ ¢‘ÆäÐH£it‚F}> endobj 592 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 768.980000 111.840000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples >> endobj 593 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 760.340000 156.959999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig >> endobj 594 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 229.919999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline >> endobj 595 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 743.060000 199.199999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs >> endobj 596 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 734.419999 181.919999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour >> endobj 597 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 179.039999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package >> endobj 598 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 155.039999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names >> endobj 599 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 708.500000 163.680000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants >> endobj 600 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 176.159999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_enumerations >> endobj 601 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 156.960000 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes >> endobj 602 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 682.580000 260.639999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 603 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 673.940000 227.040000 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance >> endobj 604 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 665.300000 165.599999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates >> endobj 605 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 656.659999 183.840000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes >> endobj 606 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 648.019999 222.240000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code >> endobj 607 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 639.379999 232.800000 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable >> endobj 608 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 630.740000 244.319999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 609 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 622.100000 239.519999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 610 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 613.460000 218.400000 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods >> endobj 611 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 604.820000 236.639999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 612 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 596.179999 310.560000 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer >> endobj 613 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 587.540000 271.199999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 614 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 578.899999 233.759999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 615 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 570.259999 177.120000 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments >> endobj 616 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 561.620000 207.840000 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 617 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 552.980000 166.560000 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps >> endobj 618 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 536.659999 96.4799999 544.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile >> endobj 619 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 520.340000 161.759999 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 >> endobj 620 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 511.699999 149.280000 519.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 >> endobj 621 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 503.059999 139.680000 510.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 >> endobj 622 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 494.419999 107.039999 502.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 >> endobj 623 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 485.779999 170.400000 493.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 >> endobj 624 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 477.139999 172.319999 484.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 >> endobj 625 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 468.499999 214.560000 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 >> endobj 626 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 459.859999 251.039999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 >> endobj 627 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 451.219999 180 458.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 >> endobj 628 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 442.579999 143.519999 450.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 >> endobj 629 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 433.939999 113.759999 441.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 >> endobj 630 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 425.299999 192.479999 432.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 >> endobj 631 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 416.659999 143.519999 424.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 >> endobj 632 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 408.019999 181.920000 415.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 >> endobj 633 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 399.379999 148.319999 407.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 >> endobj 634 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 390.739999 143.519999 398.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 >> endobj 635 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 382.099999 164.639999 389.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 >> endobj 636 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 373.459999 156.959999 381.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 >> endobj 637 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 364.819999 156 372.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 >> endobj 638 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 356.179999 171.360000 363.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 >> endobj 639 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 347.539999 150.240000 355.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 >> endobj 640 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 331.219999 94.5600000 338.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 641 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 314.899999 111.840000 322.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview >> endobj 642 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 306.259999 122.400000 313.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries >> endobj 643 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 297.619999 170.400000 305.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig >> endobj 644 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 288.979999 227.039999 296.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline >> endobj 645 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 280.339999 210.719999 288.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers >> endobj 646 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 271.699999 213.599999 279.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 647 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 263.060000 180.959999 270.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module >> endobj 648 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 254.420000 204.959999 262.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 649 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 245.779999 268.319999 253.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp >> endobj 650 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 237.139999 189.599999 244.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows >> endobj 651 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 228.499999 271.199999 236.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio >> endobj 652 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 219.859999 210.719999 227.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake >> endobj 653 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 211.219999 181.919999 218.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 654 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 202.579999 264.480000 210.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 655 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 193.939999 152.159999 201.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions >> endobj 656 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 185.300000 173.280000 192.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables >> endobj 657 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 176.660000 152.159999 184.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 658 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 168.019999 164.639999 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 659 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 159.379999 222.240000 167.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 660 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 150.739999 212.639999 158.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums >> endobj 661 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 142.099999 220.319999 149.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums >> endobj 662 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 133.459999 222.240000 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums >> endobj 663 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 124.819999 205.920000 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums >> endobj 664 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 116.180000 147.360000 123.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers >> endobj 665 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 107.540000 153.120000 115.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures >> endobj 666 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 98.8999999 158.879999 106.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes >> endobj 667 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 90.2599999 172.319999 97.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance >> endobj 668 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 81.6199999 265.439999 89.2999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays >> endobj 669 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 72.9799999 206.879999 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers >> endobj 670 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 64.3399999 206.879999 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions >> endobj 590 0 obj << /Type /Page /Parent 2 0 R /Contents 671 0 R /Resources 673 0 R /Annots 674 0 R /MediaBox [0 0 595 842] >> endobj 673 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 674 0 obj [ 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R ] endobj 671 0 obj << /Length 672 0 R /Filter /FlateDecode >> stream xœí]ßä6r~Ÿ¿bž¸±ø«HAï® 6‡ Áž/‡Ãí!ë{È¿R¢$V‘”HJjõ8öž™j6‹­®*’‹õ}÷/?ý×ëÿãõ»?ýÏë—ðóãO/ÃÛÃôß«ÿ÷ÇXÀÍ›àÓ¯Ú¨7ný¯_¾¾|{ýöòùå³ûÿ·ãÃ÷â¬bêð_þþòݤüe’üôñßÜoÿûÊ_ÿÕýõ××ÿøO÷ãO¡?ßà닱àùÛô ãŒ÷Gü›ñ//ÿþ‡×¿»!˜±_ÿÿ?éÞrhß–·²ñ_üÖ¼*7®eŒ»_•{¿þòògÿŒ¥cëqö¦ü7òuþ›¿3èWÐãOÆÌ(•¯cCßv|yõÆ˜åÆ°¹D]ÈXk>ý=ŒozÅof–(p÷4߯¢.,Vð——@Oƒ%Oƒ¡oНOãÛÆ?üüòÝÖÛäÏv/†=ýøÙ—ÿýø§×öñŸ_þëøEÁTðaÈUð=i1|$-¸Ì}T F«a}¯¡ïå£@¿ Vh59bxeˆr^hWÃV'jÀ›œú*ºçÓ§øágg¨ë£Îž™,HφǴŠ{ùé˜I ‹MZ9“–œXœP“öm$êBÆ f“&gÒBN@MÚ·±¨ ‹ÜiÒR0iú–Ĥ…öMƒdBÒÞ‹6ÇØä|6ÔõK;Ñí&=˜&“–Š˜ô,8lÒJc“V&gÒnrÃCbÒ¾D]ÈXÁlÒ r&­QàÔ¤}‹º°XÁ& ü€IÓ©IkÞ@3¥ú^½+(‡`Ú”Q‡IF6L#s_¹°³ “Ÿ05[ÿúÊ÷¥ébøPšÒ‰ëûbÓòç“¥Wxò’Z4ù2ˆÙã8˜Xà}yÓc™}E¯Á `r8æ¢ûä/£Ôuî‚¿Z\Ê ¾¼0¡ƒß-m÷±ÿ†I 'Ÿ#ïT‡ß‚ÆáÚ„qÎ}àÏá÷§‡û-S|t\SœX:·c¶kWë{ŧ¢ßLÓ ¼ñ1:lÍVs’(¾Rô(Å!•½°¬'y8ŸJq/y8vù•ò³H"a¢¯<ë×Ç×/£a¡ž|ÅÅ0·14úùÒ±Ö.Y¼gyÇZö’³XPç¬ qÎÊ\œs[Uƒüޕű à> Ö±Ä9ËsqÎ2ªƒ%qη ãä(έ:îŒsÖ\çvWåq®Þ »¶ å÷”ý¤¼/Hü$ù åuOÇÓÝFC@/êK-uqW —î{B±ËŽ[( Žn|4Ãð”f9xJ3OyÙøŒm$êBÆ ÂÆG³<¥OyÙøŒm,êÂb7n|4;Oý¸»ñ±Õ‚ oNæîdÓTï)IgK dOžÈž£dVt/¬Ä÷ÅîËïù—QÄ¥øJˆټ ®Üái¶`*‚#AåÊGs‹W>Z ™•¯J¼€¬|¦6€û€XǼòÑÜdV>šk¢ƒkºòÛ„›xåé¸qå£Å´‘F¨kwx©Sá•ÐQ üSuüI‘Ÿú­ŠøXܪtà­Aqí’A‹LÅ‚ZxŸ49ïs {†ïÛîb‹÷IÈyŸTD‡T‰÷ù6aœ€¼Oêgð>uÝ÷¾#ûŽ]ï»Ä¯ŠµŠ D jM„¨!!j ¢P‡BŒú€XÇbâƒ5ª#Ç6aœBŒtÜiâºh§˜øîéÀo@ØJˆPnZ\‹7@n úFÑË^ jýÅ(J›¥ ¢¼€ú‹™¡¨¨ˆu,þbrP”6ŒêH ¨±M'‚¢"wú‹9EíûËî¦òДP<\Nw t—Ù55œ‹k=ÿÕf…n *Î ;xÆéÌ ±Cxqº© à> Ö1;†œÓYKœÎ§—§ómÂ8‡Øé"7:ÎÄi’7K¡uQ @¢cA­iHŒ&‰PÒ3@õ±ŽÅƒt 1šQ @2¶ ãDI¤ãNÒ—$<¹“qêÄùcñ½åù¤<õd+Ö'´œûß¿ 8ÍÝõ Íp ޝL½ej¯…:¨ûtìAßÅ•†œ‘3ò?6:ÉßIü¸qÅhFHpØìp?cÙµ ̾¸£Õ¤éTg˜yj\ïzÞÚHO+G–ŽÅhKN]›·Z¶)bÁqoå÷)V\ ¤ì{ëþóƒ‰7½+{°;¹2RjzŒÏö«ýZ¬¸b±à¸_Kq¿_«âtø ¿Þè/¾üß-¶¸DâN ÅÊC«Ÿá6–æå…H2螣‰†{¬ûkçÚÍcðZµÞë1“EpÜkÝïµðXì¥ç$½ŒDtdƒ©žs}¡ÁŸß›kÀŠ«X Ž»†¾W±æf\¥ú/§ËS·JŒ¹¼ºïl¿~BÛIò:¥ôiÕßlÙPwß¼ hV`G¨XpÜííÀsÑífÜ=:xæt”Sê<[:JÕÄýZ)•Nê¬xÅsü¥ÞU0Ÿ6žï@^r –½qÓ/Ç环 Ö2~œ “3礂ê 9sS›0Î8g.Öq_ÆäòÝ_µ÷cr9k§|üZ Ö±Do•É×tRFuÐ|Í©M'GÑ[=A¾¦Å¥gb÷D`ã/yoùx+±ðú÷¶“—7ÞÉ*î” ´W]+w_û ÷3mºáê /Ô™®¾’ñMo¸†6€û€XÇâ…:sÃÕV#:€ÞpÚ„qÈ õÜpõÕ ®ôÂ$©Sð=·,/»#ßZã\Ö_rÍüœCõä‘to€ƒ¯ëµ¦—”±àÂ呔خ’!K>ž†Î~Þ½Øf,‰m6SÃÌgà‘¸ci ³ÐpëXb›ÉÔ0óéíD‡¡5̦6aàÅ6ó5Ì|BÓCcÛÅ·¨/Y柲ªo]ØáÆÆ‚ãaÁ”ênzƒðôBá#Кnsɸõ3Yúü÷ŽFŽ$sÊy‡¹ÅUÈèT9¯ì2çô?Ç–|Œò>»Åå/g—+mÂ×n±à`ÅZÆ0U‡û;CÕÁ¡ê¸bíÔF¢.d¬`ªXëþÎPu8©" ªŽ©E]X¬à¾ŠµîÓ—OHΨöXŸ‚R)4d*_S̺æÓÝá¹…¢“%ݧâ„ÓsTÒS^÷¼Ifò̵ŒŸ¶±àp¨X)BÂß ÚOB°·û6u!cs¨˜©=È›U ’PáÛXÔ…Å î ä '”¦ìÊ•i:Nåù9PöZ~ Î¦ÄØr¨y»;𖣄âC C«õؕӂ+ {ìJvþ–9µ@jäºÀNçÛHÔ…ŒÌ;“T73ª€%ëÛXÔ…Å îôØ š‹*mn­åÓÜ“,o(ÿ43uö*W³Z(Ý·¼,²¹±à¨rL áy\3~È -Ä( ~È-DÔ…Œ?ä9ZÆ -Ä( ~È-DÔ…Å nôC¾A qBϰË]®ŸôN¨†^i¯|e`á[oCÓ8a`<Çà¤Mã #@h¸ˆuÌhÏ18)AÓxÂ0µ GhF÷ÁËhZ»qžºGìI1¸&qéý¸ØÅñ5!‰ûË7« ÖÇHÝ'ÈÔý÷ XbÿIÝÿÐpëX|,W÷ßIÑ‘ÔýŸÚ„qò±g¨ûïÁ”å„ÍUsFÏ¥“uÞ±÷­ %"xE[>!'”NË'ä„’`Pï›) â> Ö±x_Ž’ÀIÕ‘äò™’ êŽ{½oƒ’à ïÛ',î`ÎxLBÜ3î˜n‡AÞüYSiÄxÇÛ('Nˈã„âaÐø3S<Ä}@¬c‰?9Š'eTG’ÇgЇ¨ü9î?gÄŸ#•-5 = ¹rõ´Î^˜„†CžSqá߃èo'ˆ®9;r‚)Ú(;˜ ”NKh„²c *fÊŽ¸ˆuÌATä(;'”£€Ñ™²#êŽ[ƒ¨Ø ì8!ˆîÙ@Ÿ“Ó º"L ôTOâ|ùšÊ{w>±ƒ±à(¦-ØâÖÓß|È`Ú‚s 9{Á´Ç6u!cÓÌd0mÁ4QÀ4Å´Ç6ua±‚1m±Ámr‚· Q´íýÊrç¦@Ôç™vUÀ¶AKr‰íß¹$?ø ,*ôÊØÀ•Š—TjYò$¥“pñ-5(’#ZªF$—ð«+Døïr­íÇ]ø+ƒ‘FerH£gBBër/ ÿ±D]ÈXAXø+“C•TA‚4Žm,êÂb7.ü•-†–$µ»cÆ¿˜‰¹…¹Ì÷ÑT£GE &ZÅ‚£& FÄ`È!b0DÌ ˆIm$êBÆ ‚IÃCÄ``TA‚ˆm,êÂb7š4 ED¬Â¤`èÁŸzŽÎY÷ >ÞÕ¶…„5³ƒÕNAåò8ÉÿžËÿNò¿¼€,o§6€û€XǼ¼žËÿFò¿¼€,oÇ6aœ(ÿ+Òqãòxêp¥žc1‘»‚ÎòÚ‘å0ΉÕì ë+åM懦E3¬‰ÜB,¨uA9¤$AZ¼€º‰œ‘–¨ˆu,n"rH ‚´xu1#-køsÜë&²ˆ´œâ&»sÒEŒÏK„q׿)ÄÉ—$t4œmo,±”(Ó†`Áš#âó#AmìRÁ•C°‚ XSÀ}@¬c‰]*‡`"¨ÁÛ„q" Ô3 XP.JìÚ-©´Á¸qî1穳ùnC2jEcrâÔL¨^í¹CƒXp!YS„¬´áù¶ÔŽéÙ %‘¸|îÜÔájVEü-ùRCîkÛ ¸šÔ°«ašÔ°Ô°›ÚîbKÀÕ¹v Õ‘Ô°Û„q¢v Ÿ¡†”‹ïŸp8á)ï2ñÇÁí§¦§ô «Ö4¦œÿTOêzEù§ê©`Í»bAmL±äò(ØÜåQ°äò(ØäòèÔpëXbŠÍ]˨ŽäòèØ&Œ]û —G¡LpFL9T䥇‘¦ÝûS>’.øNœÐFD­6T:¡f,Õ,–jFÀRͰtj¸ˆuÌN¨Y,ÕKõ€¥c›0N–jö `©.sœâ„»õ[ÊUÄžy~;cupB¾Bò\k½P¯ 5b0±àÊ]‘!×P¼d÷Î~ÏždÃJêw+†Î½ F9%t–SBSN rJè…SBcN M9%t–SBSN rJè…SBcN ýœºÌ)qJPÛ-åó<»•Û‹ï<¿“—¯QTGÓ•îbªJ£)ÝńԂ˜úø?5àvëw´Ý~øm˜bSP±o£×kOU‰©}}QaJh;™Ð”jEg©V4¥ZÑ)ÕŠ^¨V4¦ZÑ”jEg©V4¥ZÑ)ÕŠ^¨V4¦ZÑOAµ¢ËT+§L=»õ+øÇ’ÉRââæÅÝʉ #Û½j»9ÚNuDÎâVÁT<>­BA¼*÷ï×_^><Üþ9—£ý—ÉN.±ÿßÓsöÒsjêsoÕ¯Ö6ZÉ¢°Ì]~žõWdkì»±7toç %AÅ‚ë–|^r± {)ßÔOVCD‡ÊgD‰_šhúŒŽ…:Ãîue^•…ºý«»îËsE†r^˜â¥WDmˆà½+¹†óǵ9én·YY7Âß¹»Ýf w»ÍÜíÛHÔ…Œ„|x3äîvkKîvk›ÜíÛXÔ…Å ṅ7e¾ çÚ§Dkàr®':rZs¤HqC‰È.¿¯Æ76¼ß»ïß$g^iÙó—¯èÔ×ñj9VÀ2) G‚ʾad6<2N@fÃyj¸ˆuÌ;}Ãr ³ad6,™Ç6aàd6ì@fSf éˆPû˜û9¶Š±D vaáU ?'0«®sæZ‹˜•èD¨!\ˆ1«XzÃSlH)íˆÃ=•*8,î1˽®#WM—ånï§Œ 1G·Oµ"gŸ{³“ 8´9ÚH‚C™àÐSÀ}@¬c™D‡6‚àÐF$8ôØ&ŒáÐF<mʬ;§ÌN»[Ï2TÊö’à¦ÝÔC(–Qõ jM]‘Üd£r¹ÉF‘Üd£’Üä© à> Ö±˜ºÊå&%¨Ž$7ylƉr“z†ÜdS¦å9ÅÔ\ÙXUíŸuŸqå¬erê¹ÇQ®OpÆÑ}«_Fä0Ôú%%‡1YrCÉaLJcrƒÉa %‡1YrCÉaLJcrƒÉaÌSØ29Ì)~yæÒ”P®Ó¶2k¸ÞÔhó÷Ì45rÏÊ=c²Ü3†rϘ”{Æ,Ü3sÏÊ=c²Ü3†rϘ”{Æ,Ü3sϘ§àž1eî™3l¾"§½XÆ>Ý‘žR#úܽÛq+Ñ 7*>œ²Îðï>œ²e–”K ±ç¾ŒÁ'ßíî·Ÿ’}6Ü~H¼ª¯jð·Z[žŽ³ìJ^"$8nË\ÝoËeæÙòþAë%,´)å…wùب—z «Ñ` Ž[µ¼?SÊ–é2dÕ»ÛSªK·Ø{ýqéÃ‘Ú§ðˆ•ØB,÷¸?¡Æ–Y!ä»[Ê‹â|ÛìC¤ÿ¿§†•›A*wmïw„2±ÁcaŸ¹‘zØQ2= >ƒœð9LuåÉœWA%@c ¿rüNг6FhBÀ}@¬chl–_ÀR~›ò Ø…_Àb~û üîƒ_»/޽Q¦zÔ™#”âžéZÞ_šXPgâ| åý sôËRÞPŸËûÇ}@¬#˜¸dŽ~TIyÿ©Mg|ôë¸ÓÄËåýO1ñýÛ¯ié8b2uœŸI»UíI°XPëB·™cb'5Äd=&m÷±ŽÅ-Dæ˜ØIÕA‰§6aœ¹…x‚cb>Èk÷Û»7ó.ÎsýMäÏ‘+£¯‹¶ j=G â9*së¤@¬ZуÜÐpëXhFÜPgΖTÑôl9´ÜÄ:7Ô™³e>€%:€ž-OmÂ8ä†ú ΖÝ(.EÎe`~¶½LW’zÏ"± dëYŒ6»ý)üÕ±C¯°‡0±àÂtuaˆŸô<ñŽ„†´RÙC¯ôݪèYàí^<Ûgm8„ÙX·¨ +’Õ±1úduI­ó~ìþw{òìc¯&%3Ź4›õw•Z2c“ã™g›²*f÷m¯7ƒ4•Ë46ø 9ø1¿yY¦Mm÷±Žy™Æ†üÆ¿yY¦mÂ8üé¸q™ÆØµ7/þÍ]׺zû”œøŸÂ’WŸ:JÉüƒ÷óÜ×¾f«0$¸pÁÈŕŸïøÒ yœs”CÏ÷óËç×oîAŽ ¦ÃkøñåkÕ\>¤:?“/¥á­[oœ^]øsÃÎ}Ÿ–ÁÛt•W,çTMxƒ<Þfå[áÆ>×ošÎ-Ów©3¯LߥoÜB.[^©7˜lƒ~©9=¦ø[|ÏÉÜþž¿´¾ò¡ØÛ䥱äS±m®™Oøcé=Áor¯°Òçñ¨í=ákùìal£°:c™~~bO,c÷ŸÏô­×Ï/ÿ8« endstream endobj 672 0 obj 7264 endobj 676 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 197.280000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments >> endobj 677 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 178.079999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 678 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 171.360000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates >> endobj 679 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 186.719999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers >> endobj 680 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 743.060000 256.800000 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr >> endobj 681 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 734.419999 237.599999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic >> endobj 682 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 725.779999 217.439999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details >> endobj 683 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 204.959999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass >> endobj 684 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 708.500000 273.120000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 685 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 191.519999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 686 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 691.220000 259.680000 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas >> endobj 687 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 682.580000 178.079999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 688 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 673.940000 229.920000 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management >> endobj 689 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 665.300000 197.280000 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring >> endobj 690 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 656.659999 275.039999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc >> endobj 691 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 648.019999 419.039999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 692 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 639.379999 303.840000 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries >> endobj 693 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 630.740000 187.680000 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 694 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 622.100000 163.680000 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes >> endobj 695 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 613.460000 232.800000 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 696 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 604.820000 240.480000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 697 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 596.179999 242.400000 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes >> endobj 698 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 587.540000 152.159999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 699 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 578.899999 223.199999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 700 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 570.259999 179.039999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors >> endobj 701 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 561.620000 170.400000 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes >> endobj 702 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 552.980000 198.240000 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead >> endobj 703 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 544.340000 200.159999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example >> endobj 704 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 535.700000 198.240000 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading >> endobj 705 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 527.060000 209.759999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance >> endobj 706 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 518.419999 216.479999 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 707 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 509.780000 174.240000 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected >> endobj 708 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 501.139999 181.919999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization >> endobj 709 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 492.499999 195.360000 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions >> endobj 710 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 483.859999 214.560000 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension >> endobj 711 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 475.219999 226.079999 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode >> endobj 712 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 466.579999 300 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 713 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 457.939999 256.799999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access >> endobj 714 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 449.299999 142.560000 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques >> endobj 715 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 440.659999 330.720000 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters >> endobj 716 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 432.019999 170.400000 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers >> endobj 717 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 423.379999 231.840000 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 718 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 414.739999 188.639999 422.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 719 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 406.099999 190.560000 413.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char >> endobj 720 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 397.459999 286.560000 405.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations >> endobj 721 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 388.819999 126.239999 396.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 722 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 380.179999 222.240000 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 723 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 371.539999 250.079999 379.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 724 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 362.899999 183.840000 370.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 >> endobj 725 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 354.259999 182.879999 361.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap >> endobj 726 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 345.619999 276 353.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 727 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 336.979999 194.399999 344.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 728 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 328.339999 188.639999 336.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 729 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 319.699999 254.879999 327.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 730 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 311.059999 182.879999 318.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 731 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 302.419999 208.800000 310.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 732 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 293.779999 146.399999 301.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples >> endobj 733 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 285.139999 279.840000 292.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 734 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 276.499999 304.799999 284.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 735 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 267.859999 300.960000 275.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 736 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 259.219999 250.079999 266.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays >> endobj 737 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 250.579999 270.240000 258.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object >> endobj 738 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 241.939999 237.599999 249.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments >> endobj 739 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 233.300000 285.600000 240.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts >> endobj 740 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 224.659999 262.560000 232.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method >> endobj 741 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 216.019999 263.519999 223.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers >> endobj 742 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 207.379999 203.039999 215.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer >> endobj 743 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 198.739999 344.159999 206.419999 ] /Border [0 0 0] /Dest /#e4#7e#c5l#1b#03F#14f#de#19#b5#895#b3a#ab#c37#b8 >> endobj 744 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 190.099999 306.720000 197.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 745 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 181.459999 338.399999 189.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 746 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 172.819999 167.519999 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq >> endobj 747 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 164.180000 131.039999 171.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends >> endobj 748 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 155.540000 185.759999 163.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments >> endobj 749 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 146.899999 255.840000 154.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface >> endobj 750 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 138.259999 219.360000 145.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions >> endobj 751 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 129.619999 224.159999 137.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance >> endobj 752 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 120.979999 159.840000 128.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging >> endobj 753 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 112.339999 131.039999 120.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples >> endobj 754 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 96.0199999 112.799999 103.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript >> endobj 755 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 79.6999999 111.840000 87.3799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview >> endobj 756 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 71.0600000 122.400000 78.7400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_preliminaries >> endobj 757 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 62.4200000 170.400000 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig >> endobj 675 0 obj << /Type /Page /Parent 2 0 R /Contents 758 0 R /Resources 760 0 R /Annots 761 0 R /MediaBox [0 0 595 842] >> endobj 760 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 761 0 obj [ 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R ] endobj 758 0 obj << /Length 759 0 R /Filter /FlateDecode >> stream xœí]K$7r¾×¯èóÛJ¾‚$`F’ $À‡…Ƭ׋…zayþûNæ“$‹Ì,V÷ŒÐLG³¬LƃñE¿û—_þóå¿ÿñòݧ_þçåËò÷§_nÃëÃüß‹ûóGŸÀÍ«àó?µQ¯Üºÿ^¾¼Ý~ùýöùöyüÿï7Ó—¿Æ_®,æ ÿñåï·ïfæ·™ò˧ÿõ/üå_ÇŸþöò§ÿÿúó2Ÿðv3Ü?~›ÿÁ8ãfüÁÿ—ûå_oÿþ‡—¿K0Ó¼îÿ´zàòÐ*~ß>ʦ?þGã¬Öu1ÆÇªñIüïÝþâ¾Pòë X¸&™›OèWåüÛF0¯Æ ú… ;ýƒMT9r£æ·4¾Üܧ³Ü˜m à9Àçá>0`úØ þ¼P„ÇHpñ×áÆ,ë\çÀßãËøº~Ao…o…¡·Â÷gòûþðëí»Ÿ­Û¿þeüÕ´‰ç¿~ŸâãOã#à/¿þù埆}úç—_ÿ6½•™ÀB`?L¹~ÊŽøžŽ \†Oä#à ¯ ™ÑjØ~#æÙíëÀp5”ü&˜ž]Ÿúu°B«Áû,Ÿ‡ªQÔ C³²ägXðÐô¼€W9ô–&“¿ ä7ü”\£¤+ –Ææ'Í×<“AÓÇ—þfúÍO¿ŽÒ¾ïá˜\[ÑíD±ÊµÀ„ßFñ(Q JÅ  ¦”!B;¨b˜Æž|›bP2¦” ¡Tê,#RgyLê¬$1¨ÔMcÏ>Mêì“:c ‘@¥ÎYÖ9 ©Ûyô”: •º`Ò‡KÝ,Aã!ÈxèÙjpJ+|^ž\Ò¸ð*9k…»Úòu*¥ÜnGW!˜OøìõÔ¹<25œÐñQJÕøg<_ÿðp©áãá}”šÑcï+5ù»LÀ"#ˆŒð`ë¤7H NIg/˜µIŠÒ–І¤ö<°ˆw$"½€O…ûÞí ·1¶“™˜LÄFX­Ûù{Ò1B{ò›ŠË«¸ü %ïïí&Ž_è1EÆUE&+˜46›?ÂF÷Irj‚9-û=½3Ó§Õ§õ?ŠUšØ£UFù„+UšÂ»óéôlj<ÆQ³MŸk£fë&’›ÎZ~^"{ —sɤ~¤yXÎ.ÃBørµœoØ:F¢)¤Ï`>ÿ¼„õȇeàBƒd㋦°˜Á_o?üááÚÑ ÓöSI¥T Ç²á©“š 8$5ˆyW—sš@…ôÒî賤ðÞA’.h¨|ƒÕ©¦6Âu—ÏáoËSPåbãznP*ܦÁqèçÔ®¹ 7åGš`%]„¦@]zϧs<„G¶ãh¨­ŠíÏL œsˆÎ9À¹#Þ<ðàóXCxbsŒòçÓ˜e(pîñèÂãp$pœšŸ&²ÐËkÁ¼B}“6d KâYg"­Îħäqéûb³ÿ`íUfä° bvÁžu:×¶ÿéÜ Î×Kö7Ùÿ&ûÝe?íÇG,Ì>H¥}Âuþ³c„%6ˆ>7¸¾afSKŒ¨T§’‡õvS³ûCŸ^λ³{wb"Þ8ö¼xwóÀs€ÏcóywVïn$PïÎYnw·óèè݉áÔ”·Ùpë5þÑǯ;Šªï@Ÿ×d:>í°Ô¥ÃŽ`ÉÁ'v©ëx~𨧧q©¾ Ü»ócßn|Â…~ 7DLÞ¡ƒÖø¥ =½Œ#ɲ"–e-ɲvêLj5ËÚ›|«#D,ËZAyYÖÓ˜e(ËÚãÑÓ‘IyŠâÍ&U?\– N •—ü!ð ´ÛY)¢B’ÄìpÜQ¬¿ ¢®×Öge„{wŽ`0¹¾å‚—\að;š,GEÁC9ìufQQ±K ìî0Ÿp\4 ÀSèkžyÑÈg¥gôÝžƒÀ§C¡-øz°¤\MñÎÔ{Æï¬ÅõY¿ÂôÏøöÚ0L~gfœ;9R_»çQ’Rc>²Ùá§%òlŠ3ÌVí!Ôî °³\ÛË3šårdØd bé=×DH3NãNiH?* Ísü.Sô]Ò±r蛓ìÚØ\^Çæ¡¶Kbs5GÅ–ÒÀ–½ŠÄŠ/úôj±Ä¬}lòRƒ ÙW³Ö'\hFFXAœ"14ºsN3ˆã¯âŽfhêqîöܤùÀ‹M¶"©#| Æ7ÉÕ:+ûkR›å™A¬4´BÔØÛÍ0IõÚ1犋þΕ؞K窠ò;}€­~ëgc‡U-–¨"¹¬:ç½Ø°‹=ìnáÊB/º9Ó_/0…å/Z*÷š ŽØþN¡Š'ÚÚåÅåéYïø /t1õ%5}D„”ŽŠPs–’TFH«Œ’TF8Áœç1€çŸÇŠ9K«Œ’QAeÄ4fY'ªŒðxtÄœ¥¼i;.Èw+(·N|Æ$bi¾-‡‚¬¢=ÅÑù,ÀZʽ Áeaì„R±ÒÓHB¬§‘ÒÓȨØÃÚÓÈ›|›ØC¬§‘T¤§‘#P±WkO£}ü=úŠ=\Š"æY¡SbÚçŠV•Y‚`C¹A„ã‡/Ý=”æRôðâö@GLÕ£<¸@6*\äj,>Q¯÷ Wž¨8ÞqBKÇç²_€>ÏcZÂöÇ¿Ôp)þuFïSr ®ñ'^Ðÿ F {sž)й.Ô03³ïÖ¡aðã5ŒôyÒ0Šõ+žõi˜|šöcŽÌ!¾]û\Å·©tE˜;áB”wàx“~ÅBŸS,{ž™$2¨D,2¨‰ : ÌcÏ>5D D,2¨£<‚Èà4fY'Š z<:†”¸42ÈENÍU¤Ÿ ¸·\õñ€füJìmÁ•õ G»á©½[Ñò3tÃSJâfuŽ@ºáMc$šBú –nxJ ‘nxJZÂ@ZÚ ocÑ3èØ O©Qµ#m¿+NçdJ´Ø–< <£K²ÖBŸ¨ÍƒX_¤¯‰#P Ö¾&ûø{ôõÀôø)ï &}à ÒžNÌ\»—úuHîâê=Œ>eæm„RÉ5ä"Eeb)*;©²ÁEŠóÀs€Ïc“\»HQr‘¢#PÉ5ëEŠûø{ô•\{ L}JøÙO‰¥;¼+)øÀx®²[´b꯵ EÒ|†Xó Hó G ";<ø‚‹]t)BrAåSK%YýÛ)Ö*|O»œbÆ¡T«H’v 2–v ’¤]:Õ*rM»ôæŸÇ¦Ud,íI»tªUÄšv¹Ï¿G_­"Ï ·„?ê¹ày*4ÎŒa´„}íqÖY¤&΋¬ ‚"C€Xà€ªX‡ÞàóØÔŒŠA‘À¡#P5£ÖÀá>þ}Õ \8,€n?¨š9%-ï”òíSz¼5Ö¥΢`L ã.q„ÁRPÓãyk®¦&Ob\±¶±G“SššÄlAÇb¶`HÌÖ¨Ò4kÌÖ›|›ÒÔ±˜-h³uª4õ³ÝçÀߣ¯Ò4—ÆlyÄyÞìÜàPÓ¢(jî¾²&¸XS™=Ox`>áBM52B[ïŽm¨H¯þ? ¾@áâê´9}ÃG¨ÀâëDÁÆ®K®u’@5‘h é3X¨ÀÆ®+(ƒà:ÑiŒESXÌ c•¶Ù ƒ³n©°I·4½QÛûêp¥S±ï½|šr)[äüÊÐrUò3AüÿÒ«§Ü&=ìÑþAú„£ªHï=z–ŸeDéQ ‘¦p¢Š¦1M!}‹*ÒŒGT‘sùFUÑ4Æ¢),fÐS±#@ÖÙ»“ËYnÎk’ó·ø¦¡õŠìÀr³~gñIUÈUrnES•ʨٞº½ìq{µoé¡}ÜRyÓ¯/fñ}»øyŽú”±œ9KkAp-b8‡çpr–žÇž|ëYZ‹Ρ9Á9œ¥§1Ë:Îáñèx–ÖâΜië3ÓêU|ŸúôgæØ×‘<ÈôoÂ,ƒŠŒt.Ó%uÁw ^òñ±G·b­C&´Ø‘ i|B©b™WS Š Ž@ƒZ‘ oðylŠAÆ - 2áT1È™ØçÀߣ¯bPG‰¼bÈ'F&…¼[ÛÑš8\ËÙ¬"bvf_Þ;·îëµ'å'ç¯5-Öí/ç×b¥¼(Æ'”ª( 8€† 5Áª(½âÞàóØTÄp pª¢`Åö9ð÷è«¢ô ¯¢²‰ ßTÔ×§¢.n¾}<¶X™é½;Èt1ÝF(Uf†dµkËj׆dµ;UffÍj÷æŸÇ¦ÌL,«]AyYíÓ˜e(«ÝãÑS™Ù¤ktŠ2Ë·÷L–½+1{˜;’÷þ ‚¸Çh»bEa½|wí®¬îÕX(ÎñßѾ=µ<#ýô$¯wTjRÞñË)©ÅÖX>@L>2†Ô ¤Ä ±z3zG †txðy¬†Ô ±z30Ê#¨™Æ,ëDõ Ž†Ô gÂA ™Û-÷ÍÖhï¼#X¡Kú£éÏmüÌàÁÚ'\hü¸Æ¹›ú>÷J¥†­\›V$HÝÁ×Ò[ìÊL²µÆ™º×ޤŽÛFke8iå$Õ`#ÑÒg°¤keiå$Õ`cÑ3è˜j`ø´ì‡ì,Ù.òN%aà=ÝÕ+-ÙH¡®(O÷æœ.þ‚r3 ÈÞé]XŸPêú ‚YìŒ$˜•#P×O®˜•7ø<6×OÄ0+#fåÔõ+fµÏ¿G_×OÁ¬¨x¶€ÙåÃJÒ`“¦êZA,kùÊNøVÅž™ÜÁ˜|•Yà@öÙ‡¿Ò²Âš<´5][ mCA~˩㟊!õí+žk¿mrª®jHXkêkÝ’wJ_yá`¥bˆ)ÅœC¢BmT ¡6@jG  ¬µ7ø<6‡DÅj£BíÔ!Q+B½Ï¿G_‡Ž Ôy‡$ŸDóz“<½Z+vI€4 Û¥Ò§ ¤jt R5š@ªŽ@¥O¯ª7ø<6éÓ1HÕhAyê4fY'‚T==¥Ï$åéËç‡,ULjÝsÇœÁüU†§v´H×=T˜ô´h5<0]âÙÂÊýj„{¿ƒbiö»#¸ò ¥:ÒR´ÌFÑ2KÑ2¢evCË,FË,EËl-³-³!Zf7´Ìb´Ì>Zf ey™O;I¹¤2Vÿå#ù#Å‘+ËUä‚ÖçOëÝþ*}B¡xZFÊs,‹•çXFÊsˆç<ðàóXÅÓ²XyŽHyŽ#ñœÆ,ëDå9ŽâiÙ™€C˜Í?%·x…³ÑÒ{'«9B°°¥®Â¡›Š´Üô9,}`icøyuúÀ²½*GŸPª8A8¬ˆ!V„è>+ÂáÍ>MðÂa9A8ê¾"ûø{ôÕâR„#ߘáâÞÇM¡Ûkû•Þ9b\­ñiZ6-!• t8ñýŠ5”ðŠr´O¸ò^bM¤±¥B´¼wõŠÿk_Û£»=úÔ|N¯u[¸aÉþ|»©Ù¤Šã?OI2voî¹ül"i>vTL( ÇHšÏ4F¢)¤Ï`Ió±"i>V*Â@*šæ3±h ‹tLó±ê@Ø^d}ꇷK‡±ÜBÛÒ×2•¬T˜ncÕ_”O(uFÄ×-ÄâëH|ݨ3 k|Ý›|›3 ±øºAyñõi̲N_÷xôtFõp¢˜´¤Û¤›×6 ¿w¶m°Ö´é>+½Åê-ŽÂ§váÂF4Ò÷úµ¤V\£"+º¡uƒ}Š»÷àMèî”±]™ÓÀ†Dï­‰Eï­!Ñ{G جÑ{oðylØÄ¢÷Ö0Ê#ˆÞOc–u¢è½Ç£§6¢÷øÈíeï_K4°¹¾Ø¢·÷úü¾[øzF#õ‚ÐL¶ÌRü˜Ü{ßLÝ!SWiGvÙ’Àc²uߎˆaÀ0ÓHˆÀL#ÃLÛ‘e à9Àç±Ø‘‘…™,…™l3ÙfòæÀߣ§Wqf*°#ùL™†<µŠ†&y0©BCÕtMÌ^`פ* ?¦ìó*Õ*„hÜ;;BÄ¥O(ef‰(óB4R9eN¢e à9À籉2‹ D#UŒ"Dó˜eá‰2{„hüâ¢QÎ_‡—Lz«iÅQ¾ù›n^ªÀcÞQ4MTJ.ß‘.|B©ä M$WD’ÅÅ "U’&‹/cÏ>MrE$Y|¤*ÂCÐdñy̲N@’+ž Y||gFr=Òå§Ýwv÷³ÆFnªN³ãîÚ¯ÔÖ'\“J‹7ö6û½ô8T”TŒ4$©¼Æ oÜ·›šüµ`'çÌ–RÄl© 4R 1)Š¢@ËÀs€Ïc3[*‚TAyPh³¬S"³¥žl¯ü³•¿+æCÁ9f²Â¯M«S3Ã+Û+*ÂOºõtÜ£{ ; >¡TehAT†ŽÀ#ˆ8k [,cÏ>Meèl1RåAa‹y̲NŽT†~Øb\Å¥°Å^à—¾é·ÂL¦Ë‡Óâ–LÀlâsS­QÃCÝÑ’¾X©*4.€Ø ¥ªÂÒÈ´F¦-LÛ02m·È´Å‘iK#Ó6™ƒ±„‡¡‘éy̲N™¶O™¶—F¦ôdêoí{ŠóYG*(³ÕUÅ"m½ð WÞl dûžÚöââ3qEòòfw,@K·üÇvzÅûÆ5èã±”± l Pc1¨ƒ1u8± óÀs€Ïcµ lˆAl P‡#Û0YŽ GGÛÀØ¥PÇ&ò¿à½pëœ9ƱJ–„ƒñÂÁA8 ¬XoðylËcãáp*°|E8ö9ð÷è+°âR„#H´dMþÚ»º^ûiœM­uÓ|ê=&vŒƒ)Ÿp¡£72B[û#hOòôÆo9­ÐãÍ›X›£<‚(ö4fY'Šb{Hç1 N.Útóó:®ïJ ‹M8–¿Ñ„ë¨@æL¸%ØbØöæÄ„ÏcÏ>Í„Û(öf)öfCìÍnØ›ÅØ›}ì°·ž-!ŸêMxú3_ËõÈé‚èJƒÉ‡jc஌½Þ‹D3f»”½§ô¢2œ×J4e-¶¼à´#TÞÅ¢i±ù%X`ñW@ˆÆ'ý×(íb˪÷ô­|Â…%­ˆüd/ÖN{ú¡íMëìr<'XQ˜:Ù^%ô. jïZx3ºˆtlwæ,ž¡¹6šKai.… s)ì–KaQ.ÅÆc³x&–KÁ É¥pjñÌšK±Ï¿G_‹g›KQÐôâY,^EÈ®"MŠ(xÌ-¹Ïig-ð‘üó£æÌîÉ®4gD8±*Þ³gKМ¦D‚ô~Mÿæ Dv”œº;*c‚Ä@òÄËŒä 81AóÀs€Ïc5Abˆå ˆä 81AÓ˜e(_ÀãÑÑ öØ||otçúPÚ+®†Íf UÌ^’h¯q9˜ÆÜpì5 IÒ¹Š“ÅÁ¬~ÁöŠö©·ÚF¸ÐŽŒ„=üŽÓ ‹^‹IxZ+U`qð«-Žbï>gq8I-<–Z0Ê1±œ©xòÍ…eò˜”OÔî”XÓ¢=±æRyáû­Lú„°ƒ$ AŠX‚$ ÁHØaxðy¬a)biR0Ê#HC˜Æ,ëDiŽa)ÎLCæh¸Õâj«•6Rîÿ£3cZ'=º¥Ø¯ŽàÖ'” ª"pT1¸N*×9TµÂuÞàóØUÅà:) \çTPå ×ísàïÑWPÕ™p] fíœ\¶^˜/+ò.é±zÊÅèÝR+ÓxÖ=×’™Q–“Š\´¼.¿hy—†÷t·KKB(ß ßY£þõcxg¹«˜Ul«åŒ°JêX5ßóì €UóÀs€Ïc3F«$°Ê¨1‚¬ÚçÀߣ¯1Òg‚UÆ(ß¾Oë%ïÔˆc^sÉ=¨èÄQîaßiÿ}f­ÅFCïXŽ0>áJ£að®½cPŸÎu©Ð”†<_}¾9MiH¥­4±JÛ¹¨Ê×b6¨´Çž|›¦4±J[iH¥­#PMiÖJÛ}ü=újJ{jÔ;¯)³^O—9êšÖô‰9#™î€ÃÛtŽ?gIæBƒ5={® Fؽšs°>¡P«©Tsª!VÍ©RÍéD«ÍcÏ>U«©!VÍ©Ay՜Әe¨šÓãÑQ«)–ÔH—hµ|£è;a½Š$ø`íAoÃÀ¬ö!K·¼b{ |:òl„£À’Ú»®/?˰¤8`Üǰ4‘h é3X€%ÅyXRœQŒKÓ‹¦°˜AG`IñScçù3΃ñÜw¥ºâ{aàtëËF8~ø0©½2mØÜÀéV ,°¥º-籌‰’n¡C(C–j˜ õþ”\U$¶¢ãJ$«éki'(¶Ó¿© ·¶ ‹|áÒ.&õ;V9¥(o„Ã:Ü2¬Ã-ép+‰Šµ2ÐánŒDSHŸÁªÃíÓáÆÆ:ܱh ‹ôÔá6 «Ð~ß `æ\€3.9ªÉWJ»AßW©Ð=ŽÍn‰Õçli,ÚÒÀ†È–ÆñŽs²¥§1M!}Ë–†ÁD¶4¸áˆÁ é–žÆX4…Å :ni`éàl~KçÓ[ÒÖ¨!—«%[þN^áŸZi{–ƒ{Î×|kìF(<ç'Ñ;à±è½srÎÇž|ë9x,z7nƒÑ»i̲N½óxt<ç‚HGïêE©%fÙêaEZA úÚ6i5°t“U«0ì¿Iƒ?TAxI—àœ˜|¾}~ù}|÷“[<¼,}y+²NCÈó3ÙG½÷ÁùÔ0®~\v´‘œKÖœžŸØo¼ŸúhŸ µZù¼Üy§Ž¥ãw$êÈoæ­2>ÕñùƲ¤”z…ùõÒMãc’Ÿ±ÉÏÌ{EóW>JWÁ^‰Í6oRŸòcrìrp‰|ßSŸYd.ö–ú‹©ûÌòÆj¾û²¶I‚ì:c™~N¤G"WLcÝ5MÿùLÙzù|ûŒ?;… endstream endobj 759 0 obj 8789 endobj 763 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 211.680000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples >> endobj 764 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 165.599999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues >> endobj 765 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 760.340000 115.680000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration >> endobj 766 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 207.840000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions >> endobj 767 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 743.060000 213.599999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting >> endobj 768 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 179.039999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit >> endobj 769 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 725.779999 195.360000 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx >> endobj 770 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 717.139999 178.079999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk >> endobj 771 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 708.500000 245.280000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit >> endobj 772 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 699.860000 111.840000 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 773 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 143.519999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example >> endobj 774 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 682.580000 138.719999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example >> endobj 775 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 673.940000 130.079999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation >> endobj 776 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 665.300000 161.759999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code >> endobj 777 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 656.659999 172.319999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates >> endobj 778 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 648.019999 145.439999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter >> endobj 779 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 639.379999 164.639999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states >> endobj 780 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 630.740000 242.400000 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions >> endobj 781 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 614.419999 125.279999 622.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp >> endobj 782 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 598.100000 151.199999 605.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn2 >> endobj 783 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 589.460000 216.479999 597.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn3 >> endobj 784 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 580.820000 227.039999 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn4 >> endobj 785 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 572.179999 203.039999 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn5 >> endobj 786 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 563.540000 246.240000 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn6 >> endobj 787 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 554.899999 241.439999 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn7 >> endobj 788 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 546.259999 103.199999 553.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn8 >> endobj 789 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 537.620000 227.039999 545.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn9 >> endobj 790 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 528.980000 204.959999 536.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn10 >> endobj 791 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 520.340000 98.4000000 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn11 >> endobj 792 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 504.019999 92.6399999 511.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua >> endobj 793 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 487.699999 122.400000 495.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn2 >> endobj 794 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 479.059999 130.079999 486.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 >> endobj 795 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 470.419999 225.120000 478.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline >> endobj 796 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 461.779999 241.439999 469.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 >> endobj 797 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 453.139999 213.599999 460.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 >> endobj 798 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 444.499999 180.959999 452.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 >> endobj 799 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 435.859999 181.919999 443.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 >> endobj 800 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 427.219999 149.280000 434.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 >> endobj 801 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 418.579999 152.159999 426.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 >> endobj 802 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 409.939999 173.280000 417.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 >> endobj 803 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 401.299999 187.680000 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 >> endobj 804 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 392.659999 282.720000 400.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 >> endobj 805 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 384.019999 147.360000 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 >> endobj 806 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 375.379999 153.120000 383.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures >> endobj 807 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 366.739999 158.879999 374.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 >> endobj 808 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 358.099999 172.319999 365.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 >> endobj 809 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 349.459999 241.439999 357.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 >> endobj 810 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 340.819999 206.879999 348.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 >> endobj 811 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 332.179999 170.400000 339.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 >> endobj 812 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 323.539999 218.399999 331.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 >> endobj 813 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 314.899999 242.400000 322.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 >> endobj 814 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 306.259999 171.360000 313.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 >> endobj 815 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 297.619999 186.719999 305.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 >> endobj 816 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 288.979999 176.159999 296.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 >> endobj 817 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 280.339999 164.639999 288.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces >> endobj 818 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 271.699999 226.079999 279.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 >> endobj 819 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 263.060000 187.680000 270.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 >> endobj 820 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 254.420000 201.120000 262.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 >> endobj 821 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 245.779999 113.759999 253.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 >> endobj 822 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 237.139999 182.879999 244.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 >> endobj 823 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 228.499999 171.360000 236.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 >> endobj 824 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 219.859999 187.680000 227.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays >> endobj 825 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 211.219999 245.280000 218.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions >> endobj 826 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 202.579999 136.800000 210.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps >> endobj 827 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 193.939999 198.240000 201.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write >> endobj 828 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 185.300000 181.920000 192.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn31 >> endobj 829 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 176.660000 180 184.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 >> endobj 830 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 168.019999 231.840000 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 >> endobj 831 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 159.379999 207.840000 167.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 >> endobj 832 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 150.739999 163.680000 158.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 >> endobj 833 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 142.099999 235.680000 149.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 >> endobj 834 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 133.459999 198.240000 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 >> endobj 835 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 124.819999 189.599999 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 >> endobj 836 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 108.499999 110.879999 116.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3 >> endobj 837 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 92.1800000 111.840000 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_modula3_overview >> endobj 838 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 83.5400000 156 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_motivation >> endobj 839 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 74.8999999 117.599999 82.5799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_conception >> endobj 840 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 66.2599999 194.399999 73.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_cinterface >> endobj 762 0 obj << /Type /Page /Parent 2 0 R /Contents 841 0 R /Resources 843 0 R /Annots 844 0 R /MediaBox [0 0 595 842] >> endobj 843 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 844 0 obj [ 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R ] endobj 841 0 obj << /Length 842 0 R /Filter /FlateDecode >> stream xœí]_¯å6n¿Ÿâ>/ë%EÌLR  ЇEŠÙl‹Ì¢É>ôëW’e›¢$[–íã3“$ÀÌ\^RÇ)òGJüöß~üï×ÿùçë·ïüß×Oñï÷?¾ o ã¯þÿo0›7ÁÇj£Þ¸õÿ½~úüòëë¯/_>º?}a>ÿr¿œDŒ ÿùé/ߎÂ_FÊïÿÃýëÿ^ùë¿»Ÿþþúçÿrý%òó>¿ þ¿Œÿ`œqã~Àÿò¿üÛËþéõn &ðõ~ÃË?4_ç²ð?þhE–›™)_ãîŸÊ=‹ß~~ù«ÿJõOLs`ù˜dž¡oÊ?ûÏ3A¾3h÷OþÁF*¸?M: ‘ðé… ýƘåÆÌc åX†ÿÀHàác¯äóŒÊ`á#É<ÜŸqžô{|roìÇä½°ì½°ä½ðå™üºòÁw?½|ûƒõK𧿺_…u<þõ“{vîãga^úËë¿ {ÿ¯¯?ý=¼–‘À!°w ýÈöˆá=!X °á 43Z ËgúY½IP#÷7)´ŠÊ[ÊäæÌ ì›vë„+ÌŒ‡ßè·ÁŽr–ߘðxãá»àßÈêÔ꟧ôýONa–UPÒ Åʲ“fp+0á·À®YF^PºŒêÏ&{°ù tíúúêrY\a|zôËo,e¢«/ië•o¿$òN>¿S|I[öO3bÿ4/Ù?-‰mrjÿÂHy–1Û?=”ìX"èýócâ<‡Äþ-2î´.µßo-q5.,憄ÄþåÖê ÿ®ý³Tî0~V9WưԺÕíQõ7¹­>®/Ѩi=5˜ð Y55o¦À:¬[0³&Ž?ÛaÔÐqù†5î,@\âC$|zÕ€McdÂBbnøø³ ý°ÑD€#¸O$“ðcl¦þöòîO×!3²ò€ m*ÈÊBÍy}­ï™ð}MÞÊÖV\÷H²ÝO7*†—¡š·Ã1¡qуN÷=˜Â>¢ÙÚxO ûÈ8R€eLûˆ °èAŽ@ö‘0&Îð>‚dܸhÆOT‚|Äw›jò¡æG×ôŠVœ»Ô÷;ßÛ›_î=Ö¿ }œ’_îŒk6‡©",ï™p3î%kq‡ÿÜc;ó—Tz»í`ÆuûÉ“íˆÎž|§ÇÀ‡`¨¸xUîÿß~~y÷pKù oWTÝÏK,M‡-Z‰œë¶(ÓoêRòlîýÑZa…òM‹“N´… ñ#÷N¤l‰Z÷}Ið3-Kø™–?óºïË ?C<˘÷}YÂÏ´dTF†Ÿ…1qž ~†dܹïË#øÙ¶6nãgU_Ç=2MZÙ:l»›øÎ00LMnàšMž bêÊתkq— VÃ&ßI”½'#ØÇþµÛ±“°ñU29Ùëå7u/ª¿¡ì¹¬(£ò¸hÆd Ë4Pí3à0Ç]BL8¾¨´¾Q™3Ñ€KRûÚ[¯;.¦k~ÉF-–C`Bë.mitnKѹHtn†,:Ç@ʰŒy—¶ÅèÜÒèÜæÑ¹£s›Fçö¢s3\oƒX_CtÞºmšaö0¹R˜paJ©ôE [Sò<ë³# TŠÕ]ç1°aSžíõ–UøMA]Šêˆ5ÍYùZ÷º•D>¿H%¨~Ii6o;ñg(¤4Œû3É8xIi„12a!±€˜Ò0Î3ËSÆmyD€ )0Æ&,l*àÆ”†áG0–úc¶/0­²†/I逹̈́FÇ‚JQB%Œ ¨„'PGL¨âXÆäïQB%Œ`TF†J„1qž *dÜéïˆ#¨]¿=ÙˆzøTµ¢g.èfWE,%3ñýí«Æ0ŠTcUªÆ0ŠTcx]·jªÆ@<˘׭*UcIª1<®[9Uc,<ÒïqïºUG‰íu»Výôú’[ñï¶*)š—©ZŠ Fë¤N*‚0A]*‚0šAxõt,‚XXH,`ò Ta€Axõ A,,l*àNA€=xV=Ó^q±Pg¿'-X žª¤Âéè¬e´™ ­›! 1EÐÆRÐÆæ @İŒy30%ÐÆÚxÝ ÌÚ,<Òïqïf`€6™JëÄl&+W`:<]W†xRkDݼ÷ØÍѵÂ*Õ ÷4 Za„V¬'­Ç@ʰŒI+ì ZaAeªaLœ§ÄZdܨ–M´â€‹tÌ9¥úþ”½°kK:«ÚÕ²%»?0LhU6NâhËKq´å$Žöªl|Š£À2feã¥8ÚrFedqtç™ÄÑHÆÊÆÄÑ Ê¶™7èÉî÷@·]Kûû}K›£P[bBëÒ–$Ô¶²j[IBmO K[N¡6âXƼ´e)Ô¶‚„Úž@—¶˜Bí…Gú=î]Úò@¨Ý°´€ O³´KÞ[¶vœøºw‹‘è@…Ä„V=\N0E %=Ntx¦‡a ¤<˘õP™’*Md(é¡'n=TöôÎ: ^O”8ÊוBí8£¹£À¹#îÊÜÆÛ3¶;žÞά½…¥dE1L¸°`Ý Jt@üP{+‰0C—M [_õ½ žÊرnÚéÍR‘† ùôÍ~~‘Î}Õ¦“†mgšf×9}‹±6´ މg(¾Îú®\r.¨À¸Žr”'ŸÁäÉæ–q55{ëÒ²ÎÄôÆ[~C™Ô'M-n8¥ì‡ØXꥂúÖEvr»D¤™ 3r೿6y†CbHf8Æ12a!±€1Ãá~†<ÃᨊàŠd8Æ16aaS÷e8Ü·¯Ã±™î83RwCêPMOB£ý¼gn€`aulªîl{YÁ´¨9D+žCýX·mUáQePÝŸÆ„Ã:,UªÃ²P×䨆¨˜¤uMã™°XÀ¤Ã²P×䨂  uMã›°°©€;uX tøThø1ê uuóÛí]•|ú˜™™sm¸ §î¾^±<ø”~ýåp¨ý¦ë„Hõ3RV¿`uÕ×ßèʺ¬>HÙzÎd4ÆKa’ÇLhƒyäi&Á ™GM3 Ân Àç $HÇ@ʰŒ)Hæ¶ðq˨Œ à câ<€ɸ1Hæ¶ðí×?¾€oGöîÁ_ž›{0â—?§ú¸E@߀ 6L0ô Vú#@Ÿ'6Ž”`“ ¬ô‰}ž@lXç™}HÆ6L°:Ðw† {ÐQ¦l©÷Àz§Ö5œjJzÎR1{®Y¿ùûÞvÆ)_G=gÕ.¿âÉiíŒHÃÒBh5¢œß Q*¾‚ßz5¢b*¾E<˘(/ß NŠo=Q>ß.<Òïq¯uó #z¤ëÉWjD³¡YËî Þá‘ö +íͰv¼Íýøì"¢“nhw‹x¹–Æ&´ÚI*O…,Už E*O=Ú5Už"€eÌ6E–*O…$•§ž@mŠœ*Oé÷¸×¦¨#ðå •§õÜIWóÙýÚŸkð‘Ë€¿%\*°³˜pøŸJÀ§O“&¸¤'à3Œ‘ ‰DàS@ ø ¨€ ø cl¦n>…®*Yƒ^nßCZ…tòM¿½pøˆ¢dÌVŠr7 ºn ;cÏ]9!ò]•ýµ§JVšgu`o7[»¢Ur€¥ÅRz%xBhõ ¥…)ÁÒcf¼«› –Ç@ʰŒÙs0%XZFed°´0,½ðH¿Ç½žƒ9KŸPwZï%{ÅÖz¼œ_,Å<<%4®_9HR%HR’ô²~Ç1ò,cZ¿r(B’–B’6‡$íI.<Òïqëú•ÃHò„ÚÃ/ê~ }K]ËÄÊbBëRg8’¼IN€#O KOÀâXƼÔY 8’ŒGž@–z'žGHÆKŽÎh—[=µ½bw3‡°ÝËÛ‘ëÛsÛlÏͱí J°I¾€/CBhÕKAÀ·‰•ôRðŨ^Ê |A<˘õR”À³"_˜8Ï|A2îÔKy|ÙÖËíc¿;.+Þq¸§@~GÆ¥½.þÜtÑf™{Y‡vj°\‘ 7| ¥Ä«rÿÿöóË»‡kw[”×8ö¸¦ê×¥3+¸Ä•ëýñÚ[ïç~E'Ð} ô¼Ž¥´ødGG€±þ;îÑx‹á Æ«ÐÃy&´z4š€BR—@!© (ä Ô£Ñ(„x–1{4º IͨŒ  câ<Pɸӣї‚B ÝOÚ{<žsyFO´°sËרіÁ„Ö%n)nd‹¸‘¥¸‘Íq#;ãF6Å,Ål 7’†àFž@—¸™q#›âFö)p#{)n”5 ÚSþû°üQ-ì‚1ÄFµPÁ˜+aLŠŒÉˆZŒc åXƤj(aLj “'µcâÄŒ ɸQ-»cÊÛÉ<ÍålOã?¶jŽbK_l-0¡Us8A/¡@JH‰ Ç@ʰŒYsx Rœ @Šg(Pç™ @Š? ¤V±œ¡9Y¢GkÎŽâá3në9r²'ÈÞj6Ь†K{ÕcW#n©¤"j( ¸Õ‘´w)À2f5”…FÜŽ*¨ Úˆ{ç)5”OЈ[ª•^*'¨¡øšB—Âî$UûÌtø„+E@=³?QËwmêÛgGjÅßÈÖØ5s=õÐIÏ{ì(\ÊËê²æ—ðïÔ±¥_Wº¨ýBíÅ~!@û…@Þ/æ~!ö Q´_ˆ*ö Q´_ˆÊû…¨¹_ˆJû…¨§è+ýB.ѱÁ†ãµ–äMï{¢¹Ug¶\9xÐÐäÐPVOqzh?øG/§ÕfÁÒŒCXÀ„F›´›qmÆy3˜›q@ÚŒh3(6ãÚŒòf07〴­u÷ÉÕjGlWìÁf©¯äjÙ 8ýv àÕÕ½g{Úqæ½^ËÕs´½Ýõ‹M³Åí2Zͨ x:ˆž‚àé 2<})À2f3*Jx:Aedxzç™àé žO‡•Þ—˜ÑÕÎç„W=½iÚ¯ÉèrO{¼™},Ý@üEuˆÐªu´»íy7˜»@Ú h7(vÚ òn 0w´wË,G\EBhµ–” [[*¶–” {µv*F<˘-¤-• [+¨Œ¬\8Œ‰óLÊ…‘Œû,d˜À•òšJüž»’lTÎ- -“Ó³¸ÊEíøÌ ÍÔÝGpÛ'ÈB›QKÁmG(€ÛŽš‚Û‘8R€eD#âpÛQ•AÁíqLœ'·±Œ;;nŸpôºG?μ'smj=W¡í@j2ÿîÜ[ *P³¢2ty™Æ„ãѦ„%©fÏÿ]’™×n©§V/Ÿ”™VÖ¹~¨Î66‹,`)áþ­÷uS‰î«ôÝÂA¨N &©Nv?ª“5­N„ªÇÈ„…ÄF¨Îý\¨NVƒ¶D€¦ÕÉã›°°©€û :7‹j" ëÂÖNËš³xNKžŒI=2ܺk» 0r ]) 0¡Õ“!M3+5ÍpÔ´â7ˆ'榘`³'Sjšá¨šx2YÓŒqLœ¸I<™ghšá¾xjîX¿+|Å“ÙqëTinïuwfΩÕ]`KÑ÷¥á á¨gKŸ†ø³)xƇÔþ²Ð¦!±ÑaŒLXH, x6õWH?Ìz4¤“ðcl¦n4ð¬Þ¡¡AA´ˆiHo<Ûí£[C…V0¡q `äò|G( bŽjÈ]žÇ@ʰŒi `¥ËóUPÇÄybD ˸s ¨_žß±Â{*µÚï;÷ ãʹÆ+®mJjÁÛÛ+Å{î–Ì’=}ÚzjïÎBÑØR%$`‚7<_>¾þê´)ĺÃküëÓç¦mxÈe~$š¹ã£k¡7{dçJ-¬¿$8Rböíb|ï6b(#ËV¾eO}\è\¿éòõôºð›ñ ñÆmñ Q¥Þ`|‹TÇKrLõ3¶ú™Ñ–hþÆ‘vzWå6j¦|¨ŽJPø†?Ô>±ÒoXí{D Ú÷™øÆö|÷8· AV1ÀÆù8"WL§h]éA"Õýx¦Ö½~|ù–O£. endstream endobj 842 0 obj 7388 endobj 846 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 203.039999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_cppinterface >> endobj 847 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 768.980000 122.400000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_preliminaries >> endobj 848 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 154.079999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_compilers >> endobj 849 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 227.039999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_commandline >> endobj 850 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 743.060000 143.519999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_typemaps >> endobj 851 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 179.039999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_inoutparam >> endobj 852 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 217.439999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_ordinals >> endobj 853 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 145.439999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_class >> endobj 854 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 708.500000 146.400000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_imports >> endobj 855 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 156 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_exceptions >> endobj 856 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 149.280000 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_typemap_example >> endobj 857 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 682.580000 165.599999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_hints >> endobj 858 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 673.940000 148.319999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_features >> endobj 859 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 665.300000 148.319999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_pragmas >> endobj 860 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 656.659999 108.959999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_remarks >> endobj 861 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 640.340000 139.680000 648.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme >> endobj 862 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 624.019999 160.800000 631.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 >> endobj 863 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 615.379999 131.039999 623.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple >> endobj 864 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 606.740000 155.039999 614.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs >> endobj 865 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 590.419999 100.319999 598.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml >> endobj 866 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 574.100000 122.400000 581.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn2 >> endobj 867 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 565.460000 170.400000 573.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 >> endobj 868 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 556.820000 182.879999 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 >> endobj 869 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 548.179999 183.840000 555.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 >> endobj 870 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 539.540000 180.959999 547.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 >> endobj 871 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 530.899999 268.319999 538.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 >> endobj 872 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 522.259999 182.879999 529.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 >> endobj 873 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 513.620000 190.560000 521.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 >> endobj 874 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 504.979999 143.519999 512.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 >> endobj 875 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 496.339999 232.800000 504.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 >> endobj 876 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 487.699999 143.519999 495.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 >> endobj 877 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 479.059999 259.680000 486.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 >> endobj 878 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 470.419999 260.639999 478.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 >> endobj 879 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 461.779999 210.719999 469.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 >> endobj 880 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 453.139999 327.840000 460.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 >> endobj 881 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 444.499999 160.800000 452.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 >> endobj 882 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 435.859999 258.720000 443.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 >> endobj 883 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 427.219999 224.159999 434.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 >> endobj 884 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 418.579999 234.719999 426.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 >> endobj 885 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 409.939999 210.719999 417.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 >> endobj 886 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 401.299999 172.319999 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 >> endobj 887 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 392.659999 228 400.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 >> endobj 888 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 384.019999 254.879999 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 >> endobj 889 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 375.379999 238.560000 383.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 >> endobj 890 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 366.739999 238.560000 374.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 >> endobj 891 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 358.099999 352.799999 365.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 >> endobj 892 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 349.459999 188.639999 357.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 >> endobj 893 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 340.819999 224.159999 348.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 >> endobj 894 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 332.179999 234.719999 339.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 >> endobj 895 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 323.539999 156 331.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 >> endobj 896 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 307.219999 102.239999 314.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave >> endobj 897 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 290.899999 122.400000 298.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 >> endobj 898 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 282.259999 130.079999 289.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 >> endobj 899 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 273.619999 192.480000 281.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 >> endobj 900 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 264.979999 213.599999 272.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 >> endobj 901 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 256.339999 180.959999 264.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 >> endobj 902 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 247.699999 181.919999 255.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 >> endobj 903 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 239.060000 149.280000 246.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 >> endobj 904 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 230.420000 152.159999 238.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 >> endobj 905 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 221.779999 173.280000 229.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 >> endobj 906 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 213.139999 187.680000 220.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 >> endobj 907 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 204.499999 147.360000 212.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 >> endobj 908 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 195.859999 204.959999 203.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 >> endobj 909 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 187.219999 172.319999 194.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 >> endobj 910 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 178.579999 203.039999 186.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 >> endobj 911 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 169.939999 166.560000 177.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 912 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 161.300000 218.399999 168.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 >> endobj 913 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 152.660000 171.360000 160.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 >> endobj 914 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 144.019999 186.719999 151.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 >> endobj 915 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 135.379999 256.800000 143.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr >> endobj 916 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 126.739999 237.599999 134.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic >> endobj 917 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 118.099999 254.879999 125.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 >> endobj 918 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 109.459999 151.199999 117.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 >> endobj 919 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 100.819999 193.439999 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 >> endobj 920 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 92.1800000 164.639999 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 >> endobj 921 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 83.5400000 178.079999 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 >> endobj 922 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 67.2199999 96.4799999 74.8999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 >> endobj 845 0 obj << /Type /Page /Parent 2 0 R /Contents 923 0 R /Resources 925 0 R /Annots 926 0 R /MediaBox [0 0 595 842] >> endobj 925 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 926 0 obj [ 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R ] endobj 923 0 obj << /Length 924 0 R /Filter /FlateDecode >> stream xœí]ͯݺߟ¿â¬ ô>ë‹’€Á/yɳ($@EEú…¢)šv1ÿþX²lS”d˲}|îm^€wï¥eQ¶IŠú‰"úŸÏ¸ÿåß÷ŸÞþçýkøùþó­{é þ»»¿Æn^~ÕF½pëþ»ývû~ÿ~ûtûÔÿÿû¿1üè/Ž,†ÿýõ·Ÿæ·òùýoúßþïÎïÿÛÿõ·ûï~ßÿøcèÏ5øv3Ü/~aœqÓÿsÿzûí¯îÿè‡`|¿îÿ¿ö-ö ãût+óÿð­^ýÈs#e|øõþ¯?Ýþì©|Ç8–ŽIæ{±/ʽûo#Aw/Ætú΄õ¿°Ê{‚ñM».¾Þ˜Ð/ŒYnÌÔâ>óp7 ão»Ç÷ƒ&Gß…%ß…Eß…ÏïäûÂï¾Ü~úh~ùsÉËñðãKÿîïÿê\Þ¿üñþ_]ÇÞÿ÷ýËßüg¢#öÎäL ·¬·èÞ“ÝÏž z•2Œ+¯oኦ÷ÊáÞ)´ ª®pE¿tv¸4_ùPêžCé +÷&ŠWÊ÷^83äJò.Ê«ïñO`Ý hÏhþŽÃG±/S=hùJÒ=ÓÅ¡©Òþºø1^yñž2ãÕñáKo‚f½ÊÙš^=œv¨ÑÖ˜ðw¢²%Sšé¬ëÈè±çð· è`;¼±Ý Ø—.¾Þ@ÄÆ62êBb}óáo¬O|³Q„AOèïˆáÚØ¨ 3øëíݯnÀLçíW?œvû•({Ά/ÆvDCÊrY”¾%bÃ/ÕÈ?µœO§^ff1ÍäVc‚Ó® W€w*vxW€w&ž¦¸CˆûÌctx'3®ïå!¨+àÛ„qJì ºœgíUJ[üÜ>…%Ó_Y+˜¥lʪUVÇ}Ù6µpÆFÙå 0¡Vø¹ ÂÏeNø9Áì Tø}ˆûÌc~ÎsÂÏåÁáwmÂ8y$ü3+…¿_@)ü«~°äÖ „HøY"ü‰3X6Õe²|OÒ}ýt² Rçh{ùJY…“ÇIø5ÌÓéj¥<€ÄËÅoŸX³S>èVÛŧ%¸döºÅ\²È-æ’gÜb.eìµ:q‹}u!1ƒàsÙeÜb.,aЈ[ìÛØ¨ 3¸Ð-æv˜³kÆŠ ²Æä¸¨]ÐÝ„ð/j[Y‡Å/Å•äªO_V!N'º¢U9ÄT­£ÝÅuhb™$/Ê`ËîÙQ-ºU“ *%Z0‚ªõsxF¢#¨š#‰Ú@Ü`£D –CÕc”G‚ªù6aœª†x\)Ñlª¶.Ñ« Õ²K¼ANf€2|˜ 3; 2`B­ FYðœ I„LÈD}ˆûÌcdÑå™[ƒÛD]›0Î.dÁžAÅ‘xJÒ‚'«‘zïJ$î]CÂsâŒḂ £™ µJ À!TàŠŽ@•@ê0I dà’Ž@•@ŽÇÜGü×*:ààâ@%XÝê ÿêaµ «ÉOæJ`Â^À\@G" G"4‰#q˜û62êBb0‹#@âH澺°1ƒ s¡wÀëæ{`ÞX’zò‰åݰquò·+”­ ÐïØdÛƒl`s, Q†Ê ¡§Å 7€ µó¥!ëyarëyaÈzÞè|iÆõ<ê0i¾4¹õ¼0‚òHÖó¾Mg´žG<®œ/íŽõ|bS6¤Þ.µˆm ¦·Ø°¾¡WúªÃ„JY—YéË.·Ò—Yé;‘õ¡ Ä}æ1ʺìr+}Ù1Ê#Yéû6aœÑJñ¸PÖe·c¥_!ë«0{K¤æ‚“˜ø“-&Û$Zvó’_1LØë$JGUHž‹ªœDU8q}u!1ƒà$Jž‹ªŒDU8q}uac:‰’ï@*–7AÆ2Q‡†,œ‰ø¥uÁn™w.Ãg#ëõö/cJ_Æ({P†,u7×¶`ü®[ÉyÀ²ô!†áˤûa™-ÂűÑ^E¬?øüU?%¡üèïK÷ˆò=W$މQä*î?—Üpl%.GßìÂcˆí”­BœìÃì  »Í¹±±9·]Μ;ÛY[ËsîÚȨ ‰ŒæÜ˜œ97š00:1箺°1ƒ+͹•Dͨ2ÎÞrväØMíõ äq6*iKìtýÒ~—(¤ì&«™†}ËÇ.‰†ÙwÞŒç0a¯ÁQ] 2ª.2*F@FG Ç·‘Q3Gu9Qudtbp|uacÅøƒ³#Ò¨åxÙv4¼JUË!½Ï á›A–gh)LØ­\\ÅÊÅ!§\ÜÙç&Q.×FF]HÌ`T..sÊÅe årmlÔ…\©\‚:Í[”k56fËì¡çÔÏ9}“†Û&„â¬wLø^ý¶Ãcâùj @çö&œ¼ÆUSxyø¢ouû¾8€âB/]£A)êÖwjŽóf®Sp”»5Ÿ‹ËÜŒ`l ÉŒàÚȨ ‰Œ3‚å¹Á2Ê€%3‚kc£.lÌàÊÁ"beiXßýÈ pbneçÈŸ`"Tnï#ñoÀrñoÀHü›#í¡ Ä}æ1nïËÅ¿AGâßlïø6aœQüâqáö08P•”­Œ§+íijØ Q‹”Í@8Ò"² 'µÞUjɰgl޳€ µjÂI„ˆ\„!çTMÄ!‡úÌcRž‹N"äª #äæ>âç¸VMDQÈ#B­žJr(dîP (r(ШžªñP ê0IOeîP Hr(ШžÊñPàÜGü×ê©*q‡èé:š%4ánÂÒÊçò”m=c@ÙU=2cÀVµTó8.1¡V-ÌäæHÀœ#Pµ„1`õ˜Ç¤– ˜”G0çÛ„qFsˆÇ•j©‹tˆZ®JiØÎì,/l19Ñ%(*½—Wi¯D õ´RÌbB­É&ɆDò9UB3Fò¡>ó˜”Ðä"ùÀ0Ê#‰äómÂ8£H>ÄãJ%4G¢& ±òÏãÃ>ü y¢°ÉS”•öžÙmÙ¿[°WeÙà´¿¢ÿ¹8ó4$wKÈ÷ÛLòa$uDØ¿ÉQ2?ŽQd~vd4^NòXßnªcô9÷`øº‹Cnu— ¹Õ ¹u‚áû62êBbÃ×].ä, ¹u‚áû66êÂÆ .Äðu·x\ϺxÊ:lÁf$Vº¨÷ )ÎZ y}xÕ†]ärˆG-EËQ¢ nD2§r8îYrÐWî°è9¨Kp •n·f:Ö<kN cG n÷Ðâ>óÝîþSfÜnÍtìÄíömÂÀ#èñ¸ÐíÖ|t¼^ˆa}‡åSøN]–-Òª;úœKj=Ç” a1¡V·›µÈÁÍZ¸Ù¨nËnF}æ1é¶ÈÁÍZ¸Ù¨n‹nžûˆŸãZÝ–{àæЬœ”›mÛù6-çJÙaÂgÛçíWZ‰»êÿýëO·wÿȼ·Üî#Ogó‘[Lü9bph‚ÝC· 7øu»¶ëJÄý…žO¹ÓˆˆPkÙ5KµÎ¥Z°Ô¨e×#XŠúÌc²ì:–jÍ(,õmÂ8#°ñ¸Ò²ë=`éºJ¯o$Ë,@… ÞSº1±ÑøkKŒ¿Þ´ãoìõÆß SœS]å5œ9%5û–´5 >S\¡§3F¢¬ë{wëø÷žµIKdçCmC˜Óì´Ø†cÂnÛàæ¤«mƒaç®ì(>sΖ[‹IHÓœº›´®‘?´ºQ« S³VG„ýZÍÕõZ-Î]Ó¯kõºoxu4ËU­˜‰’‚ºZºÅ9æáô‰°_ºåõ`†QeA|Œt¯Çj=[2ÐëÜcj%þlÙõݳrƒM¨@Å™–\óG†î´gMÓ/í·ÆÕMMÀ’rhúL8/äÃ1ŠŒÍ¯ßRoÚJR'²‡ú¡Ûw ×¿+ùŒßnèJÀÐ äC0tm î004 0Ê# }›0Î0D<. œ ®WD8·N|¹û¦0˲ŸZ¾rT>F3d©5&ìwñôõ¥1çB–G´+B–å`&JWR ¾!åT‹;qŽ—Ô0¹šëÐâÓ9ñÕî’A˜e‡ ûƒ½³´Ý¹˜åuõÞüDöf”Åv3èòÌ„ÝÊbÙõP åçBTv{ž35¯á\øëËQôŒOK5):LدgâzPÒÊ¢À?HÏÖWWåb¯ÏƒA¶”m™¿NHÁä\Î'Fý1—‰P‰iXE0 «r˜†UÓp‚i m î0Ó°*‡iXÅ(ÓðmÂ8#Lñ¸Ó°êTL£âÄè —Ûϵäã}ð*ð |УÀ«&0Et öOMp=˜bõ©`ÊÅ€Þ¬’”sim8¼U®zýÇcöžª'K=# 0a¿æ™'@*ÊIü¤yë¥‰Š¡ä[È†àž…õY"T‡Æ}”«6ìÍ¥K¹õì\">ßÞ;Z`Â^‡þu]­ñЕ³è?Hã×á–7:×¶D”m(²¶aûZ±Ð^zFc0a¿ròË1èÊYø¤œ;vÀ_e]ž-Sù+01Å}–«W+ö\ (6. °O±%»^±åcAžh!ƒÁåÁ•õéIa—¯ÛJ_ŸÔ~¼±'¯Ÿ*J¯¢Ú€I” Kc‰ =£Ø¸¼î¯µŽ Ù¼uIn9·”z?µ/¸"<6–ño7pÇÙc¡ß7k«Ëqièàb\z½êñÓ‰¨¶—0'Ðr¡Ö3a¿èèËUèÌÅÀ*OÀÑ·e÷LoH‹L6ök‘½¬dÝÅ`%÷¶µè±nÅ›VEÖÅác3¡.¬‹«!ô„L5ðigQÈ‹'Äa5¡ Ä}æÂjzB¦BO”­†0´ ãÄÕ0ëÂj€ñîTÓ±ê™m)yº–”´ $9çdæ¦@•þ­£úžέï L•ë{&çBÔ÷¤†±<5Ìc‰Ä}¬” oR*ø)1ag²p`&*øÙÿ)øÙSゟž' ÚȨ ‰ ÉÂû¿3?{*£ hÁÏ¡º°1ƒë’…÷£(cÔ¤OüQð󼂟ý·‹ ~΄½ÚÅãTüýß™Tü=5NÅï D»xHź˜AÐ.žKÅŒ¤â÷ª]!?êÂÆ .Ô.¾Šÿˆµ?*|fÔ‚ÏYÚ9ã˜Pé“s’¥x.K{O³´{ñÉù˜¥÷˜Çè“ó\–öžª $KûÐ& giÇ<.ôÉùB–ö‡¤ð=æ WÃZrýÜqSÁŠ ÑwN¸$¯â)—ei—ju›diï ™,íÀI–vO º=fiÇ}æ1év.K{OU„G’¥}hÆ ‘n?C–öþ”¡º#tû¢,Œ—ÒÜñ)±)iÂzo¶ÉY.㯢òC/Ä(/`B­MQÃã*‡áqE0ó˜Dç€#Á päTÔùÍ}ÄÏq­¨/”xH¢ÿ°¥;`¾¡q½—·¡BprÂýØÝÇ…\ÚÉãœ? T ‹µz) ø"d|’€/Ž@õRŽà ê0I/e|ñˆtÌ#_|›0Î|A<®ÔË…")Q°Ð-M ›’¶n©·±vì±æ¨Ú±Yj7tvVÒ^dfäFD„Z &ÙÒ{B&³XO¢]I¶ôÐâ>ó˜48—-½§2ʃfÚ„qòHƒŸ![z?Š#aš†#¥ !?;2¨[D~«ˆ£´æÒ`B­ˆ²Î&·Î†¬óЏ×ù¨À<&7¹u¾ÐdïTÄõ¸ÎŸûˆŸãZ_HÃ~„ˆ¯Ÿ¿*‹xCº¬C’am:¨úxìb#r¾a‰Vó­9õô–ìÑ-1³‡xðkG.jÕPÎÙÙEPmh’dM’,‡&INÐ$G jÈG4 õ˜Ç¨†’åÐ$ÉšäD }›0ÎMB<®TÃ…lòG¨áêyÀ³Õ0Ù,8" â!õÁ­Óúªª×m›¸åœg^ø(É·á\RœKŠÎåó(EÚ,œkhq€yLCäp.)å‘à\¾Mg„s!WZŒ…¼øX ±žûÑcCí÷–ƒÃ¦,ªV©9¥½ß˜ž µ*ERÚ÷„ð$IJ{O *5¦´Ç}æ1©T.¥}Oe”G<É1¥=ê#~ŽkUj!¥ý»ï‚U|Æ\ð;ê¤4!^ ñ#+·.Dô4xôéR"Ù¨‹‰Ñˆ\ö‚ƒSSm³PN ˜Pk³4A¥Î!‰R$ѨÍÒ#’ˆúÌc²Y:‡$J H¢#P›#’8÷?ǵ6k¡Á6kÏa¥cü‚™?$åo“ëpj&ç|þÜL¨Õ:CQ3›EÍ,EÍlŠšÙ 5³j6ñ˜´ÎäP3ijæTë̈šÍ}ÄÏq­Ö-Ô8Eë./ŒX.qÕr¬°ì@×gÜyƒ»trÎá/ÄÝi±ÔäðW 9ü¢5 ± é…÷œU-:µI¯MZT`ÉõìT-õs¶%¡U _3˜p^ZÇ(’É&nÝÄ­Pòý\1 tŸ!{‚zj¡ÞÁE†lÝA(†‹nYŒ»#¶á г(gµI› £0áL“¦bé|:û±ÇE"¯Ñ¥+Ô¹÷º²R’@¦Jæ Ó^IâEŠ#…ÐÐâ>óBJæ S%å‘@¦¾Mg™".„ÔBˆS,áL¦zDVÊb'-ÉÊÈc2G´ÔWk‰­Ø²½¡\džÌÏåøå‡¬îkW¥jΖLîù%"£È¼,|ûõ€Å+Uå› jì¥obmò‚}÷_&7ùÁ¾N>0bߨÀ<¦ÉrØ·Rûv:ù¨ûžûˆŸãÚÉg¡ÎÁ)“ÏêÙ-hÁ¡eÇJÅ0«uÐ9ZÀ„ZÉÖ_V&‡/+CðeG ’mF|õ˜Ç$Ù:‡/+MðeG ’­G|yî#~Žk%{¡ Ã’½~&¢¥ºë†<-emHSÉÔ§ƒÙâ}DÁÊ…Þ|H«Zs Ê'§0¡Vs- äT6È  ä„. äÚ@Ü`“æÚ\ §²$Ó¨æÚ1sî#~ŽK5J?œ¢¹;Žz”g+&JW6@Ùé½õ<'HÛÔæ2Ü?š •j´ÌdË-si™˜Ê@\æh™È–9ZæÒ20•9€¸Ì> endobj 929 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 768.980000 122.400000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 >> endobj 930 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 210.719999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 >> endobj 931 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 213.599999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 >> endobj 932 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 743.060000 262.560000 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 >> endobj 933 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 219.360000 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 >> endobj 934 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 177.120000 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 >> endobj 935 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 268.319999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 >> endobj 936 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 708.500000 217.439999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 >> endobj 937 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 699.860000 208.799999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 >> endobj 938 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 243.359999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 >> endobj 939 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 682.580000 190.560000 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 >> endobj 940 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 673.940000 153.120000 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 >> endobj 941 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 665.300000 152.159999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 >> endobj 942 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 656.659999 173.280000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 >> endobj 943 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 648.019999 152.159999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 >> endobj 944 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 639.379999 147.360000 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 >> endobj 945 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 630.740000 153.120000 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 >> endobj 946 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 622.100000 158.879999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 >> endobj 947 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 613.460000 217.439999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 >> endobj 948 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 604.820000 203.039999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 >> endobj 949 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 596.179999 152.159999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 >> endobj 950 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 587.540000 196.319999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 >> endobj 951 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 578.899999 168.479999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 >> endobj 952 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 570.259999 141.599999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 >> endobj 953 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 561.620000 194.399999 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 >> endobj 954 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 552.980000 206.879999 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 >> endobj 955 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 544.340000 169.439999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 >> endobj 956 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 535.700000 180.959999 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 >> endobj 957 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 527.060000 173.280000 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 >> endobj 958 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 518.419999 142.560000 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 >> endobj 959 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 509.780000 235.680000 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 >> endobj 960 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 501.139999 164.639999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 >> endobj 961 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 492.499999 225.120000 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 >> endobj 962 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 483.859999 230.879999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 >> endobj 963 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 475.219999 243.359999 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 >> endobj 964 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 466.579999 173.280000 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 >> endobj 965 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 457.939999 123.359999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 >> endobj 966 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 449.299999 162.719999 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 >> endobj 967 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 440.659999 210.719999 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 >> endobj 968 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 432.019999 178.079999 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 >> endobj 969 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 423.379999 168.480000 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 >> endobj 970 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 414.739999 172.319999 422.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 >> endobj 971 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 406.099999 156.960000 413.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 >> endobj 972 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 397.459999 213.599999 405.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 >> endobj 973 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 388.819999 172.319999 396.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 >> endobj 974 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 380.179999 179.039999 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors >> endobj 975 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 371.539999 182.879999 379.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 >> endobj 976 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 362.899999 174.240000 370.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 >> endobj 977 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 354.259999 228.959999 361.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 >> endobj 978 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 345.619999 187.680000 353.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 >> endobj 979 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 336.979999 202.079999 344.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 >> endobj 980 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 328.339999 157.920000 336.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 >> endobj 981 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 312.019999 94.5600000 319.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php >> endobj 982 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 295.699999 167.519999 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1 >> endobj 983 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 287.059999 213.599999 294.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 >> endobj 984 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 278.419999 191.519999 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 >> endobj 985 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 269.779999 143.519999 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 >> endobj 986 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 261.139999 152.159999 268.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 >> endobj 987 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 252.499999 174.240000 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 >> endobj 988 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 243.859999 152.159999 251.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 >> endobj 989 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 235.219999 160.800000 242.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 >> endobj 990 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 226.579999 196.319999 234.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 >> endobj 991 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 217.939999 204.959999 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 992 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 209.300000 210.719999 216.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 >> endobj 993 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 200.660000 252 208.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 >> endobj 994 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 192.019999 238.560000 199.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 >> endobj 995 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 183.379999 239.519999 191.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 >> endobj 996 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 174.739999 270.240000 182.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 >> endobj 997 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 166.099999 252.960000 173.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 >> endobj 998 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 157.459999 175.199999 165.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 >> endobj 999 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 148.819999 179.039999 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 >> endobj 1000 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 140.180000 170.400000 147.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 >> endobj 1001 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 131.540000 225.120000 139.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 >> endobj 1002 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 122.899999 183.840000 130.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 >> endobj 1003 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 114.259999 198.240000 121.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 >> endobj 1004 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 105.619999 154.079999 113.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 >> endobj 1005 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 96.9799999 166.560000 104.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 >> endobj 1006 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 80.6600000 93.5999999 88.3400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike >> endobj 1007 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 64.3399999 122.400000 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn2 >> endobj 927 0 obj << /Type /Page /Parent 2 0 R /Contents 1008 0 R /Resources 1010 0 R /Annots 1011 0 R /MediaBox [0 0 595 842] >> endobj 1010 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1011 0 obj [ 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R ] endobj 1008 0 obj << /Length 1009 0 R /Filter /FlateDecode >> stream xœí]MÜ8’½×¯¨óSÍÏ ,ÛÝ ìaà ìa°‡…ç ƒñ`ÿòoN&F…ÿúú÷§ŸFãO£äËÇÿòÿú¿gñüŸþÕ_Ÿÿ?þ¯?D}¡Á·'ë üãoã?¸àÂúé¿Â›yúïß<ÿÝwÁzÃÿË¥TÌêÆ÷ù£|ø“~´b+<>xæ\øjÿ]üóO t¤w<ï¸`Éÿ:ü(ߦ×ðb-3Ï`†¿9·ƒÔ> CÛQðõ ô çNX˧6 ©P©ß||­†=“Kj@†OàNø6©pØÀ_ž>ü}<û68ú­Äòm|_ùà‡_Ÿ~ú%ØzþõOþ­alýêÇWxàü‹?<ÿcüçþõ¯Ã/U|jüŽ´`I ¡ç/Z5š-Ÿµô³b˜æ¤Ñ£/ÆwÆŽh ÍÖ”è±/jÔÁÔ‹ñ)~þÕÔå«. <;üÀŽO þöôåÐ6L¢!m˜* iø Czh£ •ˆCÚ0QÒ†qj€Ó!=´qH…Ã.ÒÆG—ýCúãææc‹ë ÑX§õÁÇMuÀV‡2{ÀÅôVËð7ôÉw¸Ûïb¶Ç» s³w9“ ‚w­úWÃè‹{F]€KGð õ måQðõ‰K=anX¤6ÂF½ž;bà ÂGÒ~„6±Ÿ“üÁ•¾ÜÝ“¸ƒ+ 8Ñ•vÌìCmþXqª:Jëït8ŽÚìtÕŒ ÊVž"ÓºÃ-³¾æ¨%Yàkï|=¸p8aÚÏ»;¾›zä=Ì‚ÿ÷1S0’ãÜ: Z£™t$š)VŠfJHã4š më€ÔÆͼ¦B4“†ØðÍB›Øq‹¢ÙbãÊh¦ÔM£ÙæÒ}£{ñG3êõ9ž»æ5ïžÅÅŽx·²”ÈšÒç¿Píí •]ë ÙÞ׺úì×ÊŒ ¶¢MsLQz‰) ZcŠ6$¦h[Š)t@þ,‹)CÀ: µ1Ç ¥˜¢5±á4¦„6±Ÿ€bÊbãʘâ¦1…êȧ¾µ˜’Á="Ÿ¯ß#ǃEŽ–EŒ£´Ž®?pÇ26ûF­\½ˆaP¶, ŧöõåmÕÇ•gsH†¸Q1.ʾl4 ÉJ!ÙX.ÍBòаHmÌ!Ù¨RH6’ÚYHmb? ÉF?BH¶õ|FHÎâÎ’ãn&'l +ê÷lÎ;bòxóÊ×û˜ý\›Ñ3ûÈÊþ¶žÜ°›¾HhgôM:— Z#¡“$:UŠ„H”rE¡ `Ú˜#¡¥Hè8µÁ³HÚÄ~  |„HèÎD³"‹ft0JY]vìñ¤Gâtgèf°Hr– Ïr‚û`Pp>Ë vÄùÆ6€u@jcr>ËKعe;â|C›ØO„'6.t>ËoŠ ¹9öm:yÒïŸPó§¨OñÙÜ›ýX;6d+£;–fYd̾£ltÔ—N¯‹¼ÏF·5$[>cmÊ Á’Ï?Á ?õ8 Ç â^ü†¯ã;ÛÏIëÛ“f¼ôœ[S ‰+K‰+I¢#èÔ#§DG¢RóÔ#J‰+H¢#èÔ#¦DÇ¢?ǵS¼i¢Cd[©ÇzÎ .õmXo;’—t&Ïù©¦,›œöD¹íéòÜ©ý”¯qsFmŽÑrI¨8• ŽtY5GÅøÚ º¬÷To¤ kh£ •ˆ]VA¡ Ë*M (M º†6©pØÀ…]Vɱ¼í ÊMàž–!M\; k‡¬ÓõÈÓ¾¢½ôÖ±úÎÃö¢ûŒÚ6c®'-»RÖµl›S_8wUðY=#xÒ˜Tк’ ±PJ†X É  KA˜’!‰HmÌKA(%C,Hj#K† mb?Q2$±qåRÐÔCeìÜQÁ'y{tͼ3œŠ ÖCgÝå~WõÛz¥bÇ2²–XYÿdúKµkuÀ¢=]²2idΖô§DÈúYÏCe0lÇ4 } L3êJÙTÐ-IŠX[JŠXK’"A@#¢’"‰HmÌÑ–’"ÊÛÈ’"C›ØO”Il\í‘¤È ®OŠdCý”,I‡Ã>ö¸? ÜìþvIËH› Žî/ãhé˜(ì/Sxûd9´QH…J Äý¥c¬´¿tŽì/ÃI²¿ mRá° ÷—~Ö86ËA$ÔvJ‡rí³n}i_–v%9NY3dÁ¢=ôíÚhVý¼¾L[½ê‘­5™kG¡#<4®'€º%@Ý ¨Y3Œmë€ÔÆ´fp¼¨;Nõ k†¡Mì8Ô®œ8¨Ó±c¥Lm‰Û°‹ªÉÛd_ûæG'æý¾Ð.´uI Ú,´;E Úƒ€u5´': µ1uY*hw’´êr*h_tàç¸v¨«#`ëöPß>$SÝH÷LyYWÏ˜Š² îÜC´+µËgÔ ôú¥Z€<†­~© çt ÈsšyA@ýRO@^¢R³_êç´¤62 ohû‰€¼ÄÆ•~ u7<Ã/7Ó$9ݘ}O¥pǺ¯sÌ'sôA5ΨƙTã j‚€Žy3A5‰HmÌcÞ” g8µ‘A5C›ØOÕ$6®óæT³=æ·+ùëÈâ¬Þ¹Û”Þ!næP6´qGªD+U‰:GªDƒ€q7U‰&: µ1qWªu–T‰âvª]tàç¸vˆ»3±‡%Ú{Àó•rfoÇæ#W²ãb•^·ptÃíº6܆1¼á6þ1r·ðR¼áØ-bÀ: µÝ n/5Ä£î±MìxºáNm\çþÁoºá>R<½Y4Yx§ßUjU_^Õß9ÉsüOµìßÃÁÀEÐê9ÂÏ…ý»a’‘Q-éþ=¶¬R³çˆÂþÝK5±!èþ}lû ÈsÄìßýWpÓýû‘ÚÏÅsî_Ë_Ïße?h{¾ž¨ÿ=º’ì¤vwö³9xÉäp:´/¥IðRÃK- ,Š‚± `Ú˜ƒ—*€^*© rŒmb? ^ê@ÃôMAñáêà•¥·O¹³£çŒ‹¹¶ÒJêì•§+ü]Ž8‡¤ø"h IÄ€Dä¥@¼(DÛÖ©9b@"òRNmPˆhlû)PÄ€€ˆ|/n ÉÍýóÊ ·g»í::Ùq¥sðÃ|t´~ËÉà·ðÈK˜–‚G± `Ú˜¿-€G†Gl mb?üöÀ#ß‹›‚GYZZŠ-o¨_Ìs¯›.Z‚çG¦ÎXø®L×Y•ßiûy»\Z©Y*8X¯fØrAÁðš3–׫y©@ådƒ×«mR¡Rc½šmóz5/5Ø@àzµ±C*6p]½šèàX"\¯qÏü"õ™öŽS‡§n‰7£Ë þ|êSu†«€•c{V·Ì?ÙÑ™´0̦‹àhtáÜàè §-M §ÀÑEÐÓ–c…T¨Ô@Œ.œN[z©&8=m9¶qH…îŒ.‸ ¬÷œÜ*¦,ùC¶è¾Ï #ðu$šyœ½Õ/ż+áçEpØ/¥Æ~) L-^j‰ÛHÊÔ2¶QH…J L~) L-^*©ÊÔ2¶qH…îôKUwÃm¿Ü„íëçôöÜj³2aeóaû9Ž=×¶#`ç^ZxyïØÄÜûb×Û<ð)©s!¢O™TÐepMp<®K8×Ç eŒmë€ÔÆeø-ZÊàšSŽ7´‰ýD8^bãB(ƒë8^ÝöœSvUGê¸÷tgOÇe+=l!ì§Y_ë)Hß÷l„ú¿àV¨„ëåhŸA‚ÖbÊM å†À¡A@cˆ™àÐD¤6æbJp(‡!0Á¡‹üׯsmˆ!G¨ÁNMë5`8ìþ}p$7KaÞ¡Ÿ­>fIaw¥Â¼Ñ!Òñï²Â¼± `Ú˜}Ì– óütAlج0oh;Ž óWú˜;‚=nûØæ1„•Ó´—ìù¼Ë=jãnÚõÕ Fê+Õ Nꃀ8êØ°HmLŽ*X©P0RÄQ‡6±Ÿ¨0±q¡£ ~ÆÛvÔícï{®¹¨èöŠ’Ž}o¸NEðäøžLG=!0 'D ЂzA@½¡B*Tj zB”=!$5zC‡T8làB@OȺCn{èf)Ûkš(;’÷Ù%²õ?îr’PºTÐ:*/ U‚—„"ðRÐÙPMðR¢Ról¨Jð’PœÚÈॡMì'‚—WΆê¼D}m‘íÓ³çP×܇û¶ƒ>èqvË»–å;’õ9e]û¾=&G˜›Ú øw}7Ùõ%œh‚æÅŒš÷ðJÊTÐMmJ@›´¦0m‰HmÌÑJ@ÛP8‰lè hÚÄ~" -±qe4…#@Ûv4ݾBoG²òœó¦ÛT#í{þ•KYÎÚ¥ Xà4«SA«'§ [‚Ó„%pZPO²œ–è€ÔÆìI¦§ Cà´  žd&8mÑŸãZO²Gà´mOÚ†ÓÇ“N]†\ã…Mû;ßþ»«Þ0Ûue ËžºÃ[ÝÛâÝh†$T ?Ø££Ø£+a’ìQ² {ÛÖ©9ª¹"öè(öèrìÑÍØ£ÃØ£{ì1Üu˨¶=Ö“ùuÔnGµá®ãÃwÚnÝ{ç²ãЧWqHùãh*'ð¹ù@Þ=¾jÑRrrèYòÒ¡ç! „¢%Ï=më€ÔÆ-%/z–\RÙ¡ç¡Mì':ôœØ¸2ZŠzpø9®õ6wølð¶mò„·z›ïm/‹¸~öí8׹疈íC·wØâº¥"u\*¸>ØQ1;*V‚#°cX5¶¬RS¬R¬;*&© vÚÄ~"Ø1±qa¬R¼šÎˆUÛ¼ÛÕ›Ó2P\‰3éžúìŽ>ÖôÎÄj¨ÈÏh×W>®ËA_ŽDÈ|´:¨ ”% J ‚AuP1aP‰HmÌ*J”œÚÈ0¨¡Mì' W:¨8€A58èvõcuˆï™üv`O 7>`雕XîTt2´z"µJ•j•"µA@½NMµ‰HmÌ^§JµJ’ÚÆ  ^'§ÚÆE~Žk½N 0íÈÆ]A½]ŠAÿ›.W2ž Z]LLJA “R@0©  .&•è€ÔÆìbº„I)M0©  .¦'LjÑŸãZƒ›bR äí7žC€½ã*žú³ã¤³ÑO`A“À¦‚V?1MR¦„&)KФ  ~b'4)Ñ©ÙOL MR† IA@ýÄLhÒ¢?ǵ~boŠ&mß vä6ßú˜¯—Gä“Ô©´÷§°Üo— Üt–>÷¾ÏüÁ·×Ω×& IG3ªÊácÈÊ•Ž!+GŽ!ɨmR¡R1£ª\é²r’ÈŽ!mRá° 3ªa„îŽ2;®¯×ææ%JŽÔÎêÈM¼§Ð_WDW_ lÓ­K˜RÖl° 7z¹O!¾V…p£½§¡h$Ü mR¡R1Üh. áFû… 1Ài¸Ú8¤ÂaW†~„°ƒ†›C¯Û'êSR:»rI›a-?™s g@¥åÊì쾉ú"¦º$ëQ0^ÿÕxëÁä1Üð¥^ŒëTиaÒ’`wZ–°;- vdÃ4¶¬RÓ†IËv§Áî‚€l˜†6±Ÿ»Kl\¸aÒòÊflÙs«hõb“Ž)¾ç6¯›Þ¼¢}ONhx3j#-ŒP A«++‚j]µ&aPWÖF˜è€ÔÆìʪ„jE0  ®¬&ŒpÑŸãZWÖG€w¸òviÍ/µ}Ëër‹,~9«Nëå B¦SA«Á/5”ðKm~ԇ̈́_&: µ1û0”ðK ¿ êÃ0á—‹ü×ú°9BE¼Ã‡”œ¼žrŽ]ÆJS–ÓAVú€ç’û æh–“½Ü¥‚ÖhI‰¶¥;mI‰]Ðh§»D¤6æhK%vÚJj#+±ÚÄ~¢»ÄÆ•ÐÕãÝMàvIÏÛd_j¨Pè¸[¥¾ì¹àHšv ¢)‘ Ñ¥‘¢<`¥¢<`¤(/ˆKmë€ÔÆäÒÀJEyÀ8µ‘å mb?QQ^bãB—vSørO½P€øŒ{#;r£=äâÕó7çš.°ìÀeºi¨Zã°‚™ Zム$ˆ ‚@A@ヘ ÈD¤6æø J$pA|‚ ø9®â¾dáâßÝ·½±Ü]hx*˜†úþŸÕÖ’Và õ=½Ù”9Œ¶²®Þ0 \õÍJ)eB rš‚ŸVG…ÊΟ«}Ë´~¨£OÕ¡ð¡ñ÷œ?¹¢U"ÁÑÔ-XÌ; ®Ä; ŽðNƒËx§‡6 ©P©˜º[âö“31`3Þé¡C*6paêV¸_úÉäóYûC‚騅<•]ùN—f× 3DµXf¥˜ãȦoÏ!•êì¾»ïΫù¶£ó&<ÓHи,2”ÆÙh e£19™Ùh f£1”ÆÙh e£19™Ùh f£1ÁFcVØhúCÇžkâY¦¼ $Çêl¸¨R­£È¤c ÒAš{ÓÔFȇ‹X­«Y“ôXH­J¬ÖˆVkÁjȰڱ `Ú˜#”(aµFHj#Ãj‡6±Ÿ«5â°Z³ÂÆsF„Ú¾Ó~_Öû*äQW!ÑÉ—ú.9vyÒ¦Æ(\jT©Õ(RjTV:´QH…J ÄMQ¥zT£85Õ£mRá° 75f…hÛï·)aëëŽ=)ËúÈ­CžwöóË®#\!óÛ“îª;7Kñ—ý¼“ ÆP‚S$¨1” Æä5f&¨1˜ ÆP‚S$¨1” Æä5f&¨1˜ Æ<AY!¨éwê;Ó}í©Xè9-zÖÅ&¡’Ñ.´ŽyJ%cŠT2†RɘœJÆÌT2SÉJ%cŠT2†RɘœJÆÌT2Sɘ‡ ’1+T2gŒùíÉ*~×±)Í÷“gœ|⟪]{ÃŒÌÆ’rHÓÉŠb(+Š)²¢XF00Ë2 llX¤6f-²¢ÊŠbrV3³¢ÌŠb‚Å®°¢œá ›Õoø†»¹Œs‘í¤´°”ÒÂ)-,¥´°9¥…)-,¦´°”ÒÂ)-,¥´°9¥…)-,¦´°AiaW(-Îê›un7.й Êz»"2»Ôx© Õ=(»€-² XÊ.`sv;³ XÌ.`)»€-² XÊ.`sv;³ XÌ.`‚]À®° œà‡î˜zvŽ“µgíaD|Œ/ͱ#áDÐ,´ÆM  «KІÕÚ°:ƒ6Æ6€u@jcŽºmXE  «2hchû‰  «Ú°+gÄŽí˳ÞêÓÅ›:T$§’+ÆiƤúÎ[>Þgj 9dlJ-±3™"ØÀAaݳ–=¹Z¸=o¿rçeÄÃ?z¢etd·' ·›/‚ãŽ,øõ޼BDpGÞæÏ{wäsùM抢·.„ jvœ8Nò½Õ{ÿåÞºB`po݆ŸëÞÚÃKUewõtõÂù•s”g׎‰l×uÑgàú ÛƒöKø_Aà ‹ˆ…¤B3$hÄÙ%©pE’ GI*\NRáf’ ‡I*%©pE’ GI*\NRáf’ ‡I*ÜCT¸’Š3Âèæåû7.ÓÝC3ÓqµìžóáõÍ¿’4xÜxX_(µ'!î}]W}¼dʲºþT™Ý¬b¯ãæ´K.“ná6Q`SÁÑ“n!=‰¯má$†³ ”pç :L1´QH…J Ä“n"+Á6šOp'B‡T8là“n…îd;ânc=ï׬ï»Ü%4'a±´ZoŽÔ:Wª?tŽÔ:—ÕŽmë€ÔƼxs¥úCç$µ‘Õmb?Qý¡sPhCÎ %ï÷~¿ª ޻РüPIHoU*hó\Ë8.ô‚Bi¤—âÒÈA€=7¶¬RÑs½ P饜ڠ¥‘c›ØÏ´42µq¥ç®Ðƒœá¹ï×|¿ú: ?FÆ\“ Z]–°nxA¡"ÑKq§Œu#¶¬R³Ë–X7,#¬ƒ€ºìĺ‘èÀÏq­Ë®°nœá²ï·z¿ßêýêDnuSŒw°`P10u!ÖjËJÔ$^*H,ʨIbÀ: µ1Ç»5‰—b#£&ÛÄŽ[ïšÄ?ødx;Þ½_â]ýÈ+½ÄÛ™¥üS¨TÐêÁ„˜Ä 'qý_ŒxWFLÛÖ©ÙƒKÄ$^ª‰Œ˜dlû ȃ˜Ä÷òL¤ñýÎî÷;»;ÃÁBÓ!µN­á€ÐtxA-ôRK\5£éˆmë€ÔÆJ4^*© ŠŽmb? @ÓaÙ MÇáàǹ¢Û•ËAãpý"hÙœ°UxA Mã„­b‘Í'¶ŠT¤6¦‘ÍKl^Ê© Mã[E¢?Ç¥#›¯°Uœ1²7‹VJwädv­fw,{nSª7ͦlYÐç[|az˜(½nsý½åJÔžIdŽîú{.kÃ(ž–+©o==6üÌËM1\©ãÇDBÞßr3GëøZä• ^ªPaÁ À• c…T¨ÔÀX¹à_³¼rÁroG*Æ6©pØÀu• ¾U4Û ì¹»zG©Öž€¸‚QÖóô{æSO€œM°ã`^vÖC2aïúüôùù»CbÏñ¯¯ßšÜŽå&?“¡ÖñѵŽ1ÜÇßíÂ(•.\D4L¿’)˜½ãA9QãÔKåƒ0/¦\g ïŒ?¡”/ÂAéà¥Ö/0þˆtì”ìØêg\õ3£‡ùÈ$˜ o-ï|¨j0•|ª¶N_xÂ_jŸ‰“Ré^{Žè@}Ÿ‰¿XϳǾ t`ÔY |ì Í ÆÎJ†õbøó™^÷üùéÿOÎèÁ endstream endobj 1009 0 obj 7490 endobj 1013 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 170.400000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn3 >> endobj 1014 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 210.719999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn4 >> endobj 1015 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 180.959999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn5 >> endobj 1016 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 751.700000 152.159999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn6 >> endobj 1017 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 743.060000 149.280000 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn7 >> endobj 1018 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 152.159999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn8 >> endobj 1019 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 173.280000 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn9 >> endobj 1020 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 221.280000 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn10 >> endobj 1021 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 708.500000 211.680000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn11 >> endobj 1022 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 170.400000 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn12 >> endobj 1023 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 683.539999 102.239999 691.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 1024 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 667.220000 111.840000 674.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn2 >> endobj 1025 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 658.580000 122.400000 666.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 1026 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 649.940000 170.400000 657.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 >> endobj 1027 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 641.300000 166.560000 648.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 >> endobj 1028 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 632.659999 230.879999 640.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 >> endobj 1029 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 624.019999 162.719999 631.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 1030 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 615.379999 180.959999 623.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 >> endobj 1031 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 606.740000 219.360000 614.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 >> endobj 1032 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 598.100000 217.439999 605.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 >> endobj 1033 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 589.460000 258.720000 597.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 >> endobj 1034 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 580.820000 181.919999 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 >> endobj 1035 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 572.179999 149.280000 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 >> endobj 1036 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 563.540000 152.159999 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 >> endobj 1037 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 554.899999 173.280000 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 >> endobj 1038 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 546.259999 187.680000 553.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 >> endobj 1039 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 537.620000 147.360000 545.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 >> endobj 1040 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 528.980000 153.120000 536.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 >> endobj 1041 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 520.340000 158.879999 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 >> endobj 1042 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 511.699999 172.319999 519.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 >> endobj 1043 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 503.059999 241.439999 510.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 >> endobj 1044 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 494.419999 206.879999 502.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 >> endobj 1045 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 485.779999 170.400000 493.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 >> endobj 1046 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 477.139999 178.079999 484.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 >> endobj 1047 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 468.499999 171.360000 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 >> endobj 1048 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 459.859999 186.719999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 >> endobj 1049 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 451.219999 256.800000 458.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr >> endobj 1050 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 442.579999 237.599999 450.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic >> endobj 1051 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 433.939999 220.319999 441.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a >> endobj 1052 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 425.299999 216.479999 432.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 >> endobj 1053 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 416.659999 163.680000 424.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 >> endobj 1054 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 408.019999 166.560000 415.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 1055 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 399.379999 198.240000 407.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations >> endobj 1056 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 390.739999 289.439999 398.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads >> endobj 1057 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 382.099999 189.599999 389.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 >> endobj 1058 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 373.459999 213.599999 381.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn31 >> endobj 1059 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 364.819999 175.199999 372.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors >> endobj 1060 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 356.179999 179.039999 363.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 >> endobj 1061 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 347.539999 170.400000 355.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 >> endobj 1062 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 338.899999 225.120000 346.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 >> endobj 1063 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 330.259999 183.840000 337.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 >> endobj 1064 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 321.619999 198.240000 329.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 >> endobj 1065 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 312.979999 154.079999 320.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 >> endobj 1066 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 304.339999 166.560000 312.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 >> endobj 1067 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 295.699999 181.919999 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 >> endobj 1068 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 287.059999 195.360000 294.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 >> endobj 1069 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 278.419999 217.439999 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 1070 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 269.779999 214.560000 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 >> endobj 1071 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 261.139999 235.680000 268.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 >> endobj 1072 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 252.499999 142.560000 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 >> endobj 1073 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 243.859999 208.800000 251.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 >> endobj 1074 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 235.219999 170.400000 242.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 >> endobj 1075 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 226.579999 188.639999 234.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 >> endobj 1076 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 217.939999 169.439999 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 >> endobj 1077 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 209.300000 179.039999 216.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args >> endobj 1078 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 200.660000 113.759999 208.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 >> endobj 1079 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 192.019999 182.879999 199.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 >> endobj 1080 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 183.379999 175.199999 191.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 >> endobj 1081 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 174.739999 180.959999 182.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 >> endobj 1082 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 166.099999 198.240000 173.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 >> endobj 1083 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 157.459999 142.560000 165.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 >> endobj 1084 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 148.819999 229.919999 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 >> endobj 1085 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 140.180000 280.799999 147.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 >> endobj 1086 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 131.540000 233.759999 139.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 >> endobj 1087 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 122.899999 247.199999 130.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 >> endobj 1088 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 114.259999 218.399999 121.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 >> endobj 1089 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 105.619999 173.280000 113.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 >> endobj 1090 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 96.9799999 143.519999 104.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 >> endobj 1091 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 88.3399999 180.959999 96.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 >> endobj 1092 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 79.6999999 189.599999 87.3799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 >> endobj 1093 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 71.0600000 243.360000 78.7400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 >> endobj 1094 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 62.4200000 243.360000 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 >> endobj 1012 0 obj << /Type /Page /Parent 2 0 R /Contents 1095 0 R /Resources 1097 0 R /Annots 1098 0 R /MediaBox [0 0 595 842] >> endobj 1097 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1098 0 obj [ 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R ] endobj 1095 0 obj << /Length 1096 0 R /Filter /FlateDecode >> stream xœí]K7’¾÷¯èóÓN¾‚$°XÀ’ìö°€`{ìa¡ñÌ`` FžÃþýMæƒ ’ÅG²:«eY€¥ŽfE0³øÉÁˆïþã§ÿ}þ뿞¿{ÿÓ?Ÿ?m¿ÿéiz™`Zÿ{vþˆܼ¾þSõ­ûïùÓç§/Ï_ž>>}œÿÿå‰ÁòÁí¯ù—»‰Uá¿>ýãé»ÕøÓ*ùéýÍÿú¿gþüŸóOþÓÿÌýyÓç|~2Ü?~]ÿÁ8ãfþÿËýòoOÿý‡çÌ]0‹^÷ÿ?2©”€SÝøâ?Ê–?ø£[sÏ ³ü™1>ÿSÍïâ·_žþâ)ÿ‰½,]Ã'ö¢Ü»ÿìüŘI?3a—°U*gYšNÓ&øôÄ„~asŸŒñm Ô؆ûÀ*˜–=Ÿgóרp÷Ô¥ÍÖÏ]GøŸæoì§à{aÑ÷‚ï…ïä˾ûùé»­‚?ÿeþÕ2Ž×¿~žßâóOs/æßþùùߦ‰ýðïÏ?ÿ}ùZVŸˆ€½[ò|ßÜbzOZ¶Øôš­¦ã³Ôþ¤‹µj‘B« ¼™¦L–z6­=3/ÆNÀVf×>«—É.†Žß¬Ï«faXø™õÕüðó<øo45Êç/Æ}/zåÜü:–˜0K`§L8'0™&Ku¶áaÂL&œibc˜,m¶Ž›&‡+aÂå]aò¾8×°ÙgH`2ñå7z‹è72‹†üo†"(k†GÈÍ?E¤õ‡,Ʋúw ÿJh:Ïò¿ú7à¨kÐñntöÉó]2mÞŒ«Ý ð Ö› M¼ÙìOÞLNÄÓÈ)òfKu¶á½™€”7ŠØ˜Ô›¹6[?!ðf‡+½™äwõfTi<鋬7[¼ðe1p/ÏĤ-(ãÕG= Ù¶¦á{_o˜)Ú-³„Rx2‹¿’¡˜Û$TâHyxo?à ,Ð&à(ó °áfÚŸž@mØb{¨ØÀÜ|ýY®¨"Ô€pŸ;1·± øÛÓ»?¼:0ʹಪÀeq Áßg—Ú%G߆GQ?—ÈuI|ŸUŸÿÌúNìËÄT¸bÏÿ&ïú\Lî\3™[úíPA»÷*ÃÚ,cüvØ j§V-ÈÔªejjÕ@¦½Y@§Ö¥ „:ÛðS«æ©©U3jƒES«k³õ“SëaãÊ©U›îØOç‡ï=æžKCmñjǯ¥|MòA–òA6惬çƒlÈYÊÙÄ áƒœ€Ž_ãù òAö!ø {†*ßâ$%uŽu©àƒòOφ7Ú¡Eö‡º=8e± r¨‹‰p:‚¥8Á§ãd¨¯m ÔØÆ>ÔÅ”âtÄD8' C}i³u<àt ‡º`g8òP/î‚òœÎ ¿K%§fn¬RòZ£YÄTkí¢c²Úâǹÿ$ØÁNL —œ°ó«HáRv (.ÅÎN €mx\ò;!8a'œ€â’ïìÄ¡#|Žkq)ΰe\F[ÿúMIõ”Ú/e§ Øj`)ó†#p×Û‹YÊèe5(‹¾½®¢g‰Ô³³¯'¨oÐiù¥CvYínº}áÁf vøõ5“;ÎpMN<ç[xällý Y_ÙX|yošZ`RƒÛ‹W« "ê‡lß"­û¹ƒrîÀߥÉ/\äßE¤dªÎ™Í FïW•‚³‚Rx—¿ýÌ‚RÈð¼Î ÈàÒF*$6°J1%%·Ä·ô@pic64pá y6–úÙŽ³.sK—ˆÿéÚEJò9O}_;¢×t01ZaÁé!-m8¤Õ”Ò³Ë GœâÑvmd Bbû–&5¤¥&¤Ž†´kc64påVyÖµ<¤ËgÜy_™ŸP{Ó<·™'5΀‡Ò­؆]Gœ³ *WòQ:»ÄJ^jB”:Yɯm ÔØÆ¾’—"J%¢Ô ÈJ~i³õ3 J‘ WòRç‰Òv(}‹Ý»-ˆŠuÅíµ01„““&ÅÉIC89' 01;'‡t¶áabRœœ4‚Úˆ8¹¥ÍÖÏ€“C6®„‰Ísr#`Rœ“.vŒI¬¼öžó‹ì{òSmÛ~Wñ K¬Å!¨DŸšݤ¦ݤ&B79AßÚB€mìèSSŠnR£6"ºii³õ3 › ѧ¦<Ý4}ÅSvn³›œ¡4pžSŠÂ¬²+ưÁž¥i먿—½£8Ⱥ~™ÛµŠn õ2B[ñ=’‚Z×ÅI,œâ©X8ÅI,œP×Å÷X8¤° ïºx*N1 çÔu±=îÐ>ǵ®‹Ÿa_F"¼)¦|„CâNï ªÁvípð l‚Dã)™ŠÆS’Dã9›Ü£ñÀ6<ØD*O çlbÆ;t„Ïq-ØäH^¨ãäüòUúïñN’:¢OÖ;I^P BE%¥RŒ’Â(9!ìŒÒ؆¡J1JJFÉ (ÕÎ(:Â縄pWF©âl¸>|åΫèÁóh9ø&z™CÓ°ßùŠTžO‘—ë½k Lz½è}uD¡k° ÖUiÂê)bõ”&¬žPW¥wVélû*bõ”ÔFÄê-m¶~¬²q¥«2Y `ˆ«ŠÎ.×U]…ä½LC„X¤5úJèbG|È)‹ƒfòÏ[ŸÄ!¾²9t*òo¬Ù}—9BðÜ·CPë»,åDm’µ”µ1'j='jCNÔRNÔ&9QK9Qs¢Ös¢6äDíCp¢ö®œhZÔr<Úbô¬Î:W½sÕkš«^'sÕkš«^ǹêµÏU¯Ã\õú!rÕë¹êÀP|M[—Äì$…}C¥ª<)˜?ôîéý@”7Mêå—Ó@»ÞXoDcì>}=Ï"UûÈ£‚œ îÍ4 ýAÏPëˆ%ˆöª£˜Âw3?ƒ;kŒ_ViB¡Å#t²x„¦Å#t\ŸÐiû¬æ?¿ýòôîÕQù\Pc^—Ù‰PÓ“6ŒÄµÝ"8e{‘Ö.Õ³4²\e¬#:¦š®v#à Œƒ>Y§Cè“ñcÒ Æä7Wvqå/”|ŸŸ¤ú…žsdóÞÿjGf§Wæ—ÊŽ¬¼;ÎÞh9ÞWÐp!öQÀYëÒìtä¤3 îéÒT8:ΜY"‘×8{—‹2~¯…e„´,ÅZNX@' ¡µ „:ÛØ7B–¥X@Ë èd#´´Ùú°€ÈÆ…!Ë_—K5±¡é…öµÍÖq¬Œô\hŸüÁ¹’žkÙ*e »–Tå#k½µT’ë »ë‰»×5ùy¨ bØ j‘k5A®MÈZ6…²‹€ wm¡À61¿=± ±úÆ­¹FÕrÔŽlCØ4f’lš¥lšÙ4»³iH`~d››Æ aÓœ€Žl³³i‡Žð9®Ùö®lZ¹ZÎPžŽ3™®ÕlÇB°¥LG¾iù¶w#¶ìA{m|Ìåg˧àòóüsâò³uÁÑÁ³ì¥ THl`;ÁæSâòó,Ô½ü¼¶± ¸ð›³,iU·rE¶ú²¡7|Ñ뙛° q«õ|wÏ ®Ú×¾¯´ãíItÑÓé×­›·ˆsv„ r†• Î gÅyгâœpVN@ku¶±/8OqVœ3j#⬖6[?Î Ù¸p!ÀùΪLx&¡û÷YDÝ75MË.9¿TqÕåwTúa‰& Ô:I¨0.ST—„ sêäN…!€mxÇ ST„ sêÄN…:Âç¸Ö1È3TXÙ1ÏÛ…ÍRaeÞghÔK=ÖÒ‘»`®§j×ãFo þª½<˜7sj½"̇óÆ0oN@½ìÌÒ؆÷>*żqE˜7' ÞGíÌÛ¡#|Žk½œaÞÚæ5,K^9•¤#:¡>>ÝëI”“™¿Û®tìuò¡Î3v;Q¦°õ±˜Ø×P—½àÍgU»(@™P Ôº(M(T®S*7„Buê¢ÌN¡"€mx¥S*ׄBuê¢ôN¡:Âç¸ÖE™3ꀔw_éiKâöâiâ+F¿Möhƒ¢Ú”N œæ»-á»m’ï¶”ï¶1ßmw¾Û|·%|·MòÝ–òÝ6æ»íÎwÛ€ï¶Àw»zâý¾±xx”?m‰¦|ÕTçê.å¡ûŠúSN ¶¶×o®$}ÅtT]r´Ç!¨\ºFH_ÁR¤¯`„ôu²tYÛ@¨°}é"XŠôŒQé»´Ùú¾ÈÆ…KÁξQ¥ðÒwm‘b<#@E…Å¢AÚH|׀醞}ª†º†Y•ºJ\XýiÞ“¬ j½ L²)&YÂ$;õ6bg’‘À6¼·)&YpÂ$;õ6|g’ás\ëmÄ&¹ìmÊ7·ò¹U;Ræ5T:z{úñ ‹lèGŠÈå–Ô¢O&U¨“*aR€¢OíL*Ò؆GŸL1©B&Õ (úäΤ:Âç¸}ê “ZF_‘I"»7¦ã6ŠÁí(ŒÑ\1Åçkê«n «c6Ž`á©qI²æµðÂ" H±ˆBÑ (<õÎ""€mxxBŠE@XD' ð„EǵQœàì*bùòzÔß½[vz‹ïë8‹õ˜ÎîR¬›£ž‘S ¸c)Ö‰‚2¿–¹P hLìîWA†Éç'Å!5nJœ$Œ¹’)Æ\)˜;àÔΘ#€mø N¦ó¥–l`CFŒùÒfëgÀ˜#WNpêc^1Á‰êíIÐ>9=þaTUN‡Ëé®\mCRÁ•·'_µGÜfRuÜBæ j="£ ©£ äh ¨G„ýhélÃ{DHM(ÔFt4±´ÙúM WzDu^C¿4| ‹è_ÝA˜Puð@p6ŒŽëÏ|J„±ça”‰0–¥ THl` cfa,0/‡BLÓ0–¥ TØÐÀ…a,ÀOœ$Eç‚N˜-W#æ'Ì¡E0‡.3ò1io¾²Áü8>(fZxE‚Pä R9HB‘;RåN‘#€mø)U¤(r„"w2¥.m¶~9²qå”*OPäeävDÉܨyTLgÝr0Öprù”·ãdªçXIBȽ –Šð´ R<-(ÂÓ:…¥ÚyZ¤° K•âiA j#âi—6[?žÙ¸–0½.,‹±ùdªoª ”¹ÏÈR•X~QÅ>4ä£+çâ¯÷*ù¾JÕ{8"ÄWDÁùqWÅlÖ¤Ù³šÿüöËÓ»W‡Ÿ¤Fú¥5Fóß7 ½   º'‰¾Èìg£4Ï|)Œ Úoh¥´XpÏÆ^g{‚ºž¿Mœßð¬qx¶šàÙ"êëãÓÇç/3¨fÌ,ºÖ¿>}®úÛüHÚðÑ[\íÎ׿n'°-,›WùËNOL;´%\xôA‹•/ÑHY¿B®_túâƒNüfý>„xá6É$ÍÛX‡Ññµc²Ÿ±ÙϬƒGó>‰°JÁ»¬¶ulbɇlÛÍS&žðÇÜg6x¦~Ãrϱ½í3Û7Öòì[ßuÆÌ+Ý¥?³+¦Ã}sêE¢B4G¢îùãÓÿK'bä endstream endobj 1096 0 obj 7855 endobj 1100 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 777.620000 243.360000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 >> endobj 1101 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 768.980000 243.360000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 >> endobj 1102 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 760.340000 268.319999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 >> endobj 1103 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 193.439999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 >> endobj 1104 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 743.060000 137.759999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 >> endobj 1105 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 209.759999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage >> endobj 1106 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 217.439999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports >> endobj 1107 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 238.560000 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport >> endobj 1108 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 708.500000 210.719999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit >> endobj 1109 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 218.399999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 1110 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 230.879999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 1111 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 682.580000 273.120000 690.259999 ] /Border [0 0 0] /Dest /#e2#8c#17#89#edj#e9G#15#c9#8d7#c4#a7#a4l4#ac#405 >> endobj 1112 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 673.940000 208.800000 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 1113 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 665.300000 241.439999 672.980000 ] /Border [0 0 0] /Dest /mp#a4#0a#f14j#dc#df2#ec#22w#ea#cd#99#2b#98#5d#27 >> endobj 1114 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 656.659999 251.039999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static >> endobj 1115 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 648.019999 139.680000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support >> endobj 1116 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 639.379999 187.680000 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 >> endobj 1117 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 630.740000 175.199999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 >> endobj 1118 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 622.100000 190.560000 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 >> endobj 1119 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 613.460000 216.479999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 >> endobj 1120 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 604.820000 180.959999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode >> endobj 1121 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 588.500000 84.9599999 596.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R >> endobj 1122 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 572.179999 97.4399999 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 >> endobj 1123 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 563.540000 141.599999 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 >> endobj 1124 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 554.899999 162.719999 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 >> endobj 1125 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 546.259999 127.199999 553.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 >> endobj 1126 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 537.620000 151.199999 545.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions >> endobj 1127 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 528.980000 118.560000 536.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 >> endobj 1128 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 520.340000 124.319999 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 >> endobj 1129 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 504.019999 96.4799999 511.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby >> endobj 1130 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 487.699999 122.400000 495.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 >> endobj 1131 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 479.059999 170.400000 486.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 >> endobj 1132 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 470.419999 210.719999 478.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 >> endobj 1133 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 461.779999 213.599999 469.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 >> endobj 1134 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 453.139999 180.959999 460.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 >> endobj 1135 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 444.499999 162.719999 452.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 >> endobj 1136 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 435.859999 219.360000 443.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 >> endobj 1137 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 427.219999 235.679999 434.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 >> endobj 1138 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 418.579999 243.359999 426.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 >> endobj 1139 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 409.939999 174.240000 417.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 >> endobj 1140 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 401.299999 149.280000 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 >> endobj 1141 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 392.659999 152.159999 400.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 >> endobj 1142 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 384.019999 175.199999 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 >> endobj 1143 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 375.379999 152.159999 383.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 >> endobj 1144 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 366.739999 147.360000 374.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 >> endobj 1145 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 358.099999 153.120000 365.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 >> endobj 1146 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 349.459999 158.879999 357.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 >> endobj 1147 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 340.819999 172.319999 348.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 >> endobj 1148 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 332.179999 205.920000 339.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 >> endobj 1149 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 323.539999 172.319999 331.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 >> endobj 1150 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 314.899999 178.079999 322.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 >> endobj 1151 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 306.259999 171.360000 313.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 >> endobj 1152 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 297.619999 245.280000 305.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 1153 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 288.979999 183.840000 296.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors >> endobj 1154 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 280.339999 182.879999 288.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators >> endobj 1155 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 271.699999 186.719999 279.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 >> endobj 1156 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 263.060000 256.800000 270.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr >> endobj 1157 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 254.420000 237.599999 262.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic >> endobj 1158 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 245.779999 223.199999 253.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 >> endobj 1159 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 237.139999 228.959999 244.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 >> endobj 1160 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 228.499999 107.039999 236.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 >> endobj 1161 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 219.859999 174.240000 227.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 >> endobj 1162 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 211.219999 179.039999 218.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 >> endobj 1163 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 202.579999 167.519999 210.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 >> endobj 1164 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 193.939999 180 201.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 >> endobj 1165 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 185.300000 168.479999 192.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 >> endobj 1166 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 176.660000 141.599999 184.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 >> endobj 1167 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 168.019999 218.399999 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 >> endobj 1168 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 159.379999 192.480000 167.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 >> endobj 1169 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 150.739999 180 158.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 >> endobj 1170 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 142.099999 176.159999 149.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 >> endobj 1171 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 133.459999 113.759999 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 1172 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 124.819999 182.879999 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 >> endobj 1173 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 116.180000 170.400000 123.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope >> endobj 1174 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 107.540000 181.920000 115.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap >> endobj 1175 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 98.8999999 181.920000 106.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap >> endobj 1176 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 90.2599999 193.439999 97.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps >> endobj 1177 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 81.6199999 170.400000 89.2999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 >> endobj 1178 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 72.9799999 203.040000 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap >> endobj 1179 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 64.3399999 228 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap >> endobj 1099 0 obj << /Type /Page /Parent 2 0 R /Contents 1180 0 R /Resources 1182 0 R /Annots 1183 0 R /MediaBox [0 0 595 842] >> endobj 1182 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1183 0 obj [ 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R ] endobj 1180 0 obj << /Length 1181 0 R /Filter /FlateDecode >> stream xœí]Ë®»qŸ¯8c>—Ï" \I¾2 è²ðŒÈä÷Óì'«H6Ù¯Ý[²$@:§67‹Ý͵š\,ú·Oÿýú?ÿxýéý§ÿ}ý<þÿþÓ‹x †?¯áïocƒòoZ ?:o߆?¯Ÿ¿¼|}ýúòñåc÷ï× ýÇÿº'C…ÿøü·—Ÿç/ƒåÓûÿè~ú¿WõúïÝoyýýuÿýa¬/øòâÂ~J*ßýÿ>üóËþæõo]|_oø÷·Ò:s¨_ç¯ÊþoüÕ‚¯®eè„•Ru?Úî^üý/ —t¤u2m NÐIûþvNÞ‘šdR“$ש–š¾®|ñݯ/?ý‚á‘þú§î£¾_ ÿýúåE)Óý†N©×_ÿðú/BÈßýëë¯é/s0(Í ò]o0‹ágVB«êWÞWKðvˆ÷¬„ñ½Aê®[{©¬Xš ý'vú`ùD -soµ³"úD?fpüf†¢ïÞÆßmwlLé;æCÿ ¼YÝÐÒØ´IÅÖ àÏ€’B¯¢ØV£ÙsKdù:y7YqcûO~÷k‡Ò*9Ðu=>txýÖÿË‹1þúòé žµ¾Ϧˆ£»ðüË<ÿÀ3ïŒçáÙH†çÉpÏVÞgëŸ Ï*é˜?ðüχç-~¬UIßú@WžŸ-~ÇñÛh.#!‹ Y!cC ¡Uª‘¦/ïf› êÍ{á^¥Æþ9X;oÚ÷E… Ÿ;¤¹7)Qy?—ZÄ>ƒè¿öJ¿È|t†ð•¸¡ÌØÎ©zŸ»iݧ‡“¦´ª'M%ÍS–TQ¥ŠÐ9CßtÒµ±±áÀxúŸIhøÅp#r{xwXÑ-FÃç°#È©Œ!U˜ØAW|øÝا_öŽ9è Ý7H#B$U uðç—w¿y8}xѳšÙ#1$Ü äPâÍ£ÒaU2u*özÅ{pв¤D{CV§ˆ]õ߉2Ÿq´•hd„:Úüзí ¥|lh|/w=–¾—½ð™÷²—‚¾3ƒ½—‡2@ë€ØÇô^ö2ïe/,óÑØ{¹/3¶â÷räãÆ÷rÇÇW"«þ•¤Ë‹b—_é‚åWOù“¯ž´ÑX |OKC›‰ãRöi}£{9+ŠÚùØÐJ2Ê2’Q#™À`„:'™¾ Ð: ö1“Œ29’QšûÐ É„2c; !™ÅÇ$£‹ÃòkH†+&I‡ÖC‡–ÝÔÈ@Ç. J&åo" ¸ö¡~™—Úùa… …% O(lÇäcå‚÷pu‘‘¥ßJ¢ÍL¡%ûφ‰)ÎGEpDP±ráÃ@ªé£2%§´^~ åGÐ:–c7«»(4¹»WãY£Ï“ãYŒ;çÙ¾ Ð: ö1ó¬Q9ž þ©™ðl(3¶Sž]|ÜɳæLeºg«"‹ßX6˜ã µ¢ºlèÙeÝâÌá^™Ý¾¥×ÇÑÎFÒ6¸ ï 6\HÚ#±•[~_–ïkû«|×”¦¦ç50>½Ó_^ŒÆÜ­¯1>0YÝCNV÷Àdõ`àŒ“¬Õ±™ñ!'«{Ëdõ`àŒo'Y}©ƒ^ǽŒgÊê Œ_?—àÿpR9“ñWÞNå¦%_¼éê¿Ñ‰aÃå­-Þ½zÒÎÁã¨R4Ó:,:¼±¡•[2nñ"Ç-^1Ü{•pK_hû˜¹Åù·8Ç|8—pK(36Ünqø Üâ/ÝwD1œÂ-åQÖ®×çhmíøE1·®íG¤ è÷%ÁdEÅ+Ó]m1!3ª:Eƒ$u iÔ}°’¨ûÁ@–—¦2@ë€ØÇ°¼ iÔ}°jîƒEÝeÆvFQ÷ÄÇmËK*ô+ñ´CQ5®¹§¨)¯éî§ì@醽:)4&ÐÕ8aÕ]s¤nhÅ©jä 9ûÎÙ·#éîÎ_[)0åÖ¯øÛßÒKYóس=®Ü¤=m$œaåWûØÐÊg@¬ŠáT &’A8Ã"ã ›Fà«c>¬K8ú‰$¬'œaïÀ ~ªyB^Àòë~Üù”µóGg›I›VUµVùÉ$}ïvþ©Ïr¶l¬-ßÖòCºnb‘\ªcC+S9ǘʥ¡¬Õ Æ"^$LåÅDMΦrŽ1•KCYƒÕ2Î&LåìDMS¹ûCYÃ-¸T»Û±WàyÔ½z2]ˆmÙÉÓÎéRÅÆ™…_Â8%ƆãK¾$‡^&%”®I%D†œ&k±Í}žur3˯ܲw(“$u¢Ô‚ 4™¶ñZõ»Æg˜EÊ…ä$1[ôè*23ÿŽ¿C²è¬>^“ dÑc,cH&vÐ/z„ßM²è¬š;ÐtÑc,ƒ¤ ¤n[ôèZa‹¶¤KŸÚ.$#ž y½Â…Dj ‡»hÚÕÀäºë IW e ©ÂĦ®*×Õ@r2éj¡ ’*:¸³«AY<¬wµ#o±=ãÃír-K}ýâÄ9å˨°ØÉÏòIq'£hæ÷¡Îóm¥]l8Œ:/)ê¼Ê¡Î oÔ…2†Tabê¼È¡Î!sà0A](ƒ¤ ¤îD/ë~uÔÕËoOèÙ†Aä†Ýüå<#gé4¤k٣ÕåË û3pÔʢȞûyJúÎÐç¥Ñ}Öˆ‘N7­ÈN÷—òA00ÂéËR…‰L„ƒi®Ü`uŒpÐ%„ƒn¤ô1áàý¹rÃE—EÃ:áÔc ß_óÈ÷ÀnGa}K̆$L{æÞÍ0üЗ—þÂņ£àRÒQpÉ4F­³*ÁÀ¥D.%FpIkv0‚KÉ4F-X-s -W_IHÜ ®•³¹ªàª‹VrèH™ti[F¬I¸x2Õ;%÷À]:ô)ù°ê:ަעZÂ\”…Øp¹š -Jç„¥™Ð ¹zZ–*Lì`B®Î -Jkî Zú2Hª@êàN䮜ÂUGn=sB1rzìðMH†éò'ßçó€”(ªÄcl8ŒKu"es:Q€'íÈ6щú2†TabRlN'RVr‰NÔ—ARRw"eå|«:R"?4}qíÙ½'å^)K(E7µˆ ¯²¨9?]eI†Ïß÷*Kn–ó¡X½-}¢¶¬Ù(Œ"ful8JZQIO«œ¤§“ô‚d_Æ*Lì`$H­r’^X3¤d"éõeTÔÁ©UYÒ{Wa8|æÜí{Òÿn‘åöD’”«?iø¡Õ²"Š.64ÆhÍ"Ü´ÉE¸iÃ"܂Še€Ö±)nDë\„›Ö,Â-XÜH_fl8‰p‹|Ü7¢MY¬Ú¥`+ ² [R.ÍUvÓ²Òâ¡—å}…ZabYx•¶¹ð* ,¼*8L` ¯Šê€ØÇ › ¯Ò–…W‡‰Â«–:èuÜ (ËNgÀ¤žfêû}Ê´çí•´5mÀ†øööƯ}…°c;mžnÍjd³%‚DCPض1U;¶1U»ÜÆÔþ¬)Â4.Ù˜:”ZÄ>f6s¹©Úiî#Ù˜Ú—ÛI6¦F>îd3_–âÎ`³úvêršƒoz™{CJ™dfŸ,üµçwMÊ‹÷fšhæ”%>F{ˆ ­œ‚lg¬ÆÜÎØ>{Á;&;c‡2@ë€ØÇÌ)˜Û«QrÉÎØ¾ÌØN²36òq'§`Y´<ƒSªëâ·‡¿¥®oPi³?)—˜‘!}64‚ÐH¶ÇÕÈÜW#Ù×`` Ê­bÌíq5‚íq Â¾ÌØN²Ç5òq#'¦v×LÍXT€ÈpejRIiB']ŸôÏ¥»Z>¼LCã`N?Õ¹;Q’ ä„䮕lx ‰<”ZÄ>æ!0ä„dšûH„ä¾ÌØN"$G>î»&'¼D~¬×Vss÷A©â—bÓÊ‚u{´ù†Tëgž¨uPÒH· ã•VFGÚnкqll8<Òö4œ×ø\8¯ñ,œ7øHÛá¼K&v0´}.œ×xÉ$á¼}$U upçHÛQÆëYä 4œ<²È~êX(¢­<ÀåˆY©¤ÛÙÃKЊE§†Öþ+™2nUN·Š)ãÁÀû¯š”ñ¨ˆ}ÌýWæ”q+™2 ¬ÿöeƆe<òqgÿUG”ñzÿ­ªOßTžó]]‘ÃÈ#CkW×,0Ôê\`¨5,04xW7S`hTÄ>æ®®s¡V³ÀÐ`à]]O¡Kô:îíêæˆŒZïêÕáŸüPš~ÿ_®-M÷»‡ðÛwb?çâ¬5‹F×gûž ­¸´L™²6§LYË”©`ิ“2Õ±—6§LY«¹D™êËŒí$ÊTäãN\ÂeªŽËzšŽöÅÙ-Úúž(Š ¡ÎßE Ù»¶…àYÇBð¬Ë…àYÇBð‚÷y7…àEu@ìcîó.‚gä>’¼¾ÌØN‚ù¸³Ï»3…†SS¾¦}þ®#!¶vq·l6>6´vqä3cÌÎŒ‘ÏŒ1ã<3F:3F>3ÆÜÌØz63ÞÅý<3F:3Ƨ˜ã¥3㆘›jðÊøR;&[¢JO›pã2áa‚M¸Aæ&Ü Ù„;,†2@ë€ØÇ ¹ 76á‹¾ÌØp2áŽ|Ü —N¸ë9%~d_iEÈeþîtlhEŽbówP¹ù;h6Ž=Íߣ: ö1#GåæïÝSc>T2ïËŒí$ó÷ÈÇÈÑ—Îß“:Žœò’r2Y>#IàʸËY‡sަë26´Âаé:˜Üt ›®ƒI¦ëC u@ìc†¡ÉM×Áhî#™®÷eÆv’é:˜g˜®ÃJö`˜Ä.=†ÊUº3€Ù$qÆŽäzNîïX‡%Ѿv26´R0Õ §z0Õ Q=†2@ë€ØÇLS=$÷‘¨}™±DõxÕV²ê_±Xªy¾«'â’3 víåØp¢õF°A™ bC+Ø<Ó_ÀçôðLŸè/C u@ìc›Ïé/à˜þ.Ñ_ú2c;‰þþôXI¦Øê¡ WŸOÙ…¿c*šFí?±ö„Yë’u^KZaˆLïq"§÷8Áô'½g(´ˆ}Ì0Ĭރ\ïÁTïÁYïAª÷à3è=n%Åü%0¬ç'º†;Ö6ìyçr"ŸsLä j7‰|Qû˜Aír"Ÿ&ò5L"ßR½Ž{Aí+òݸOÔ+ó€=‹ãr ¡”Î-¢–±áÀNe%zÐy÷j»¿ÿãË»‡£F)Ó£«É%¨Ù“>á’½ÃeQ;©uŠÚ—¥ ×§+d;¢6›“·„ž:Æ’ kxE Sñ.ÈÞâ=í“?(®Nq IhèóûòbðzˆÈ¼°·Y÷DŸÈ®9áâx·öD¤OÎVJó2ÊçocÕ”fiï|:þ82Db·1¤·r¹ûZ™yÅdH¯r2¤WL† 6Ê­bÓDÈ«œ 长>²/3¶“È‘'B^ií&<g¿!¹Óžø÷rö•oúÈä R^çIV=6äj_‘høP5’—Y­V"7ÍÙ¼^²Kõ¢Ï†ãCè·ũåËêñ­ s¶ éCwm™!™Áyåø†ä»òØ•gO<¦yØdfÓô§%̆£¹Úü²{ü=w²¨v²h0°\m}Cª0±ƒ1W›‡ÜÉ¢Þ²“EƒåjëË ©©ƒsµy8"}ÖSÿó ž|¸Ï±t`–°¡ñio‹öóŽEûu?7 õ,Ú/ø0ÔOÑ~Qû˜‡¡.íç‹ö > uS´ßR½Ž{‡¡þˆ²˜ N¶¿rö¤øÜsݵY5Á·çˆÞ=ÛKÏ ô~‘…‰ ­Eè1ˆ‚¢H‡2@ë€ØÇ PÌzdÁÀŠS`àR½Ž[ŠâˆbVh=Ûþ¹'VoOʳ/~+g(Üá8ZUÓnD,ŠE1“664"%SvPæ””LÙ ŽX9);Qû˜‹2§ì ÔÜG¢ìôeÆve'òq'bÕe§ŽØjäîÊùT“o&jÉ(…"6´ÂD³ð.Ô¹ð.Ô,¼+8LôÞÕ±&:Þ…ZrIxW_fl' ïŠ|Ü }D©Ã¤vù¨c¯÷kûM' Šß•ÿ,÷¤î::>Òņ£‚Z*ˆ Í "h™  LéËR…‰Œ‚Úœ ‚† "ÁÀ‘¾ ’*:¸QA{@iˆÖlOO’n¼Hjo=8õs^ËÛeN½ª {Fw„†îÚàz½øÌK’2T±á0»,»Ò‡ßȱ‹S üN%ìÊR…‰Lì>Ç.à˜p »„2Hª@êàNvq”­zØèwºT²%Š®¾çî¡ë .ݲ­µr˜ ­ƒ|ÏÔ+ôYõ ¹z…©z…“zÕ±yïsêz¦^äûI½Zê ×qï ¨W§D¡Þ}rû–o»De†ÆK=½Ç*ù¦yi‹n¸'Eé©i¡Jy·š§.ÉèbC‰I!¨ ×2‚^g¥‚^o $6–ZÄ>Fë A¯³jîƒ zC™±± û¸Äd7n¾”Äê|yuéIÞÎk |é·+Zg{Þº2úÓC6‰]×Y¶”Z‘¬4C²ÊhŽÊ×Ç2@ë€ØÇŒd•Ñ;«ä>¸æ8”Û©’ÕhŽ]+hŽ H®¨WCÉ;BñÎÂ|CŠÈUT>\ ­È5’!×dövVÃPeø¾Ñ± Ð: ö1#×döJ¡‘ùÐ|ßèPfl§ È5O°o´kÅ­°ŽÜSOVb|¿ÙÏ».²ìJrRX"ÉII®³RI®7PIn(cH&v0HrÝïI®³:æÀrIn(ƒ¤ ¤î“事>"ÉU70¬ì8­ïÕÜ“®iš·ˆËÝ}Z¦ocCë»Ç9öîqK /Ø{Ásk,´ˆ}Ìï—±:«e>±†2c;¼{܈XÝ-8"b–_>Õ}‹\Û¾Ö³kĹalƒFv7põÆwÐr®¹V:6´"¹rƒYå¹rƒ©rƒ³rƒT¹A®Ü`V¹A®Ü`ªÜà¬Ü Unð”)Ž(7uäV•›g~%µ§VXÐ&¢Rá*Z$E¤±¡@R2ÁDÊœ`"%L‚h(´ˆ}L’2'˜t¸D0éËŒí$‚IäãNÉ#‚I@²Ö»^ªž©Š|Ëï·f4Ê(y–Œ ­hÔL‘:'‚HÍD`àhÔ“Õ±:'‚HÅD`àhT“²ÔA¯ã^4ê#"HõÉ›uvؼGüøá,„—#ÙGëMûíºW2ÛÌ~;¼QxY¾ßn,´ˆ}Ì6™ývÕ1†ï·ÊŒ ÷Âæ öÛu~¦rê9º»¿=RçžP¿ ©Tª!”+ÛŸö»×3är¼666´ò0MIBNS’ŽiJÁÀyÀMšRTÄ>f€œ¦$iJÁÀy&Mi©ƒ^ǽ<à.Õ”â/]–ÿŽp³#?NH]¤èÉRÒÍ­ôÝYJ:\\ªœÂg>Œº„Õ=[ï ®Tòô}·1H÷,—`°±ápWUâö„:2´äÞ®Z•ûVzÙ%j%piCpi{ôÓ?Š”ˆ鏨Pôñåãë×®+w=µ¯køïó—&x‰ÔçG‹ _]ûb'¯½žÉwØoÎîW’´`i\»Ñä—èѼ%<;ôåÞ\>¤Ë|2°¶ÖoÝ 5'éuSž"çóœ_ü¿3¼sœzSBÓèéwÅÚ†[>ËŽü”¹Â_JßG]¹Odé:Æ>¿í;ãÛrícÛzèu>äaêÛÓ•íÀ5VoŠŽaqüñLÔ½~|ùOE‹ endstream endobj 1181 0 obj 7341 endobj 1185 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 777.620000 206.879999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap >> endobj 1186 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 768.980000 217.439999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap >> endobj 1187 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 760.340000 218.400000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap >> endobj 1188 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 751.700000 214.560000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap >> endobj 1189 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 743.060000 216.480000 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ >> endobj 1190 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 734.419999 218.400000 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ >> endobj 1191 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 725.779999 222.240000 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap >> endobj 1192 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 717.139999 231.840000 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 1193 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 708.500000 216.480000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap >> endobj 1194 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 699.860000 220.319999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ >> endobj 1195 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 691.220000 222.240000 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap >> endobj 1196 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 682.580000 224.159999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap >> endobj 1197 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 673.940000 228 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap >> endobj 1198 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 665.300000 238.560000 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap >> endobj 1199 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 656.659999 203.040000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap >> endobj 1200 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 648.019999 219.360000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap >> endobj 1201 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 639.379999 180.959999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 >> endobj 1202 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 630.740000 175.199999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 >> endobj 1203 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 622.100000 252 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 >> endobj 1204 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 613.460000 252 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 >> endobj 1205 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 604.820000 224.159999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 >> endobj 1206 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 596.179999 196.319999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 >> endobj 1207 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 587.540000 187.680000 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 >> endobj 1208 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 578.899999 182.879999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 >> endobj 1209 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 570.259999 240.479999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 >> endobj 1210 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 561.620000 221.280000 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 >> endobj 1211 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 552.980000 177.120000 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 >> endobj 1212 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 544.340000 245.280000 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 >> endobj 1213 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 535.700000 239.520000 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 1214 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 527.060000 139.680000 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 >> endobj 1215 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 518.419999 177.120000 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 >> endobj 1216 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 509.780000 185.759999 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 >> endobj 1217 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 501.139999 239.519999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 >> endobj 1218 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 492.499999 239.519999 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 >> endobj 1219 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 483.859999 239.519999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 >> endobj 1220 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 475.219999 239.519999 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 >> endobj 1221 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 466.579999 264.480000 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 >> endobj 1222 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 457.939999 189.599999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 >> endobj 1223 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 449.299999 135.840000 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 >> endobj 1224 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 440.659999 187.680000 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 1225 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 432.019999 224.159999 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 >> endobj 1226 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 423.379999 204.959999 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 >> endobj 1227 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 414.739999 154.079999 422.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 >> endobj 1228 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 406.099999 236.639999 413.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 >> endobj 1229 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 397.459999 181.920000 405.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 >> endobj 1230 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 388.819999 176.159999 396.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 >> endobj 1231 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 380.179999 175.199999 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 >> endobj 1232 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 371.539999 171.360000 379.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 >> endobj 1233 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 362.899999 236.639999 370.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 >> endobj 1234 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 346.579999 99.3599999 354.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab >> endobj 1235 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 330.259999 122.400000 337.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries >> endobj 1236 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 321.619999 130.079999 329.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig >> endobj 1237 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 312.979999 192.480000 320.659999 ] /Border [0 0 0] /Dest /#83#bc#87#1d#ac#e98#ac#dens#88#b3#ab#a55#92#1c#83#7e >> endobj 1238 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 304.339999 185.759999 312.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module >> endobj 1239 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 295.699999 183.840000 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module >> endobj 1240 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 287.059999 177.120000 294.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module >> endobj 1241 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 278.419999 211.680000 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 1242 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 269.779999 181.919999 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 1243 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 261.139999 152.159999 268.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview >> endobj 1244 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 252.499999 154.079999 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers >> endobj 1245 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 243.859999 152.159999 251.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions >> endobj 1246 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 235.219999 218.400000 242.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 >> endobj 1247 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 226.579999 244.319999 234.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 >> endobj 1248 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 217.939999 173.280000 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables >> endobj 1249 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 209.300000 208.800000 216.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums >> endobj 1250 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 200.660000 192.480000 208.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants >> endobj 1251 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 192.019999 204.960000 199.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums >> endobj 1252 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 183.379999 147.360000 191.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 1253 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 174.739999 212.639999 182.419999 ] /Border [0 0 0] /Dest /#87#2c#98t#14.#c0#ab#bc#a1#a0#03#e4#d0#26#18v#7c#7f#5d >> endobj 1254 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 166.099999 204.960000 173.779999 ] /Border [0 0 0] /Dest /#23#c9#7f#eb#03#a9#ca#d9b#07#23Z#9e7#0f#cd#86#cc#2f#19 >> endobj 1255 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 157.459999 153.120000 165.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs >> endobj 1256 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 148.819999 158.879999 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes >> endobj 1257 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 140.180000 172.319999 147.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance >> endobj 1258 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 131.540000 178.079999 139.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading >> endobj 1259 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 122.899999 245.280000 130.579999 ] /Border [0 0 0] /Dest /g#08#7fK#d2_#3f#8f6e#aa#5bHz#83#c0#7e#97#1e#ed >> endobj 1260 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 114.259999 171.360000 121.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates >> endobj 1261 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 105.619999 170.400000 113.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators >> endobj 1262 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 96.9799999 178.079999 104.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces >> endobj 1263 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 88.3399999 174.240000 96.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions >> endobj 1264 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 79.6999999 155.039999 87.3799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl >> endobj 1265 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 71.0600000 169.439999 78.7400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 1266 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 62.4200000 222.240000 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 1184 0 obj << /Type /Page /Parent 2 0 R /Contents 1267 0 R /Resources 1269 0 R /Annots 1270 0 R /MediaBox [0 0 595 842] >> endobj 1269 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1270 0 obj [ 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R ] endobj 1267 0 obj << /Length 1268 0 R /Filter /FlateDecode >> stream xœí]M¯Ý8rÝß_q×ôk~I  mwÈ"€aY ²<™i ƃ8³Èß(QY$%’’.ï³_hûÕãeQº~þ×Oÿuÿë?ï?¿ÿô?÷/îï÷Ÿnä…™þ»Û??ù¦_8›þ©´|aÆþwÿòõöíþíöñöqøÿ·…ñƒî¯á—³Š©Ã~ùÇíçIùm’|zÿïÿþïÎîÿ6üô·ûŸþsøëÏ®?ÛàëM°ÿøûôÊ(ÓÃþ¿ì/¿ýÇîÿ† Ç~íÿ¢`”a‡†ñmù(ÿøÍè^eLÜ)eà åð.þ÷¿o±tdt4#Úªâô.‡?ƒ’wAO4ê‰ÏÉÖž¾m|ðÝçÛÏ¿û•~þËð«q^L}þz³Ïù“ƒ¾þóý_¡¿þñþùoãcNö è$k ½Û‚﵈Ԓ÷¨…ø0 àErÊä4Ã]SÀ½Ü™˜:{\Iâv£W<€|'ì7<ƒÀFz!fúðÚ”Ž¿¡lîvýMþ3S÷¿~fä:-Rløví—k^ÆÏ½qÅ}ÁßoŸÎ]aúÏ] ç.þú+ænþK&ÓÃÈÁhëñCëgÖ's3“¨ò¦?6F¤Z0bÁqŒ€ê%úb„E&¹#ؾçg ƒ,hò3ª7Œ$1¢äŠðÇ1¢eŒ {¹¾Á-jö@< ‰h È/9ùN> N~ˆùnø2ßµñ‡ç;'¼û|ç4»ù~Ð|Ç}<|ßôvpاt5øÜëè&Hg`-Èïtòذüù)sÐ~°°õ”m”/8Þÿ”ÍEçS6?p‚ˆÁùÄ/ÓL =üîáˆû!À"–ã¶ à8Xdÿã6‡ÎÇmú jÁÙ½Vv>´Ì!1½ +LãõCÀ –“¹`Ò‡“ê2çºóÉ<‚S$¨S4 7€æè¤¢O;ª›þGuAȳà}o¼Ý7!]wXÔF„ ýÏî‚ö¾°Žqä;?Ë¢“K9"òG¢ÝHÕ?ÞáCP>Áqh°þ'uÁ{߇GÐØ½ ¯øòû›–Ãvöb#?‰#8²ûŽPĽ#¼ñÇQ$úá…|¶#üþú+GÑÝw+¹å©òÇaýòB=ÛQ~ÿÖýuêûM©{ŸÅPÞ­;÷×LN«(˜œ¯Ð| —5˜®ñÛ;f>ô!&{Üêe>všl°ҙջÁá©*I†B’gc(öÝ "»¿á ± ø)7&J¾×ñ$%‰ç9`|Á¼âe§;–Ú“lAÒ,`/Zu§ÜŒÿ “T =6%Ä ¾Üèpn£Ô0­—6ö¾ûI@ÆÝÃÏSƒt û¶çÜGø_n¿#ðàúGà²kù“݃OÐ2/ $ F§‰¼e1®½ÌÊ÷››¼QÉIÕN ;3Ö ª}A)P×H'$TÁˆêØÂ>À×±uè)T®ŽA€jÛ¸ë¨«Žž@×R4»Ë%ŸÖà*‚½)v¡"B!ºtpëæ‹6¶{—Ø–“i~ά‘¾J8Š5€/8¾”ý©’Áö?tzïo ã-×t[DÉ ( jú[++Fv–µ|æÈâ¹çòmh €È ÐÜûŒÀ­ÑãE½3‘û ¢ÎkXL[¬E)âÝNVv”/8ŽxÕŸÝzùº;!~׫ãG¡W#ÿG³¤Åˆ×!^ŸF™' ‰Ìµ$Ñ>âw½Vè´¡£bF@ÉÔÉ­üú¯y®ù÷ѓț,§'OœÝó‡®ê aLxñ¾CH÷ ×Ò/ûØ]¦Ü–ú’£‹³<*X—¾§­iÚ]ÉI}ÁñiÇúû{,™Ð!ü’5]ù ÒrûÛr-Uag+ç_Oùœû‚BÒ ÖX£Y ¤ 9 Ĭ‘nSû_ÇLº€éB"ƒ‘nc7NðI7OGGÒ ä¥¬Ä~”ßkbÇ+Š 5ù¡á<€¹ºg0î Já¸Æ*ÍHÁ4‚Ê ÀpÛ@Øø:8‚HÁ8ÖÁ#8Ú6nœ"€ãª£'Õ¥”ACáÆIvwKÝ&5Ŷ얢‘D¹ètÚcI“¦·†Å$GŠ×Y‘ë¦éÝDW(õêÅ&S­†¥&sn›"e25 s6°ÉÛ@Øø:“©YÊdjŠuÐÈdÚ6nœ,0™«Žž&S_ʹ4ÄŠV˜Ìü ß´öŸ{Áwª-wN¯GÖããñ)”𦠋Xc÷²ƒg¥4”³jÚ£¡A¡USy-)’òZRy-Y²jSû_ÇlÕIy-A^KV€­š™½–Ö>ÂçèjÕ¹”6kfnÙŒ=âÝ@LN¥:!)jZn¬ëh),ñ|”ˆ/8LÓ)ÚŸ¦SìRšnš7xI\»ýå×Ñ㸫9·-Ù”S4ñÐ.@âD\*¶FrIî JHŽˆKÅSÄ¥ˆ¸´¼@Š™¸ôú_Dz@òq©8".­-c7΀¸ôtô\ Å¥ÄeC>€×ÀŠ_³Ÿ‰›]ïó”mþº´â6¶_ÄêëñýÊßX_BïVÄêÐ5Ù qÜ¡ 쥸ZãhÝÏŽ!åLÖhפ¾8³FœàË ¤3}tn#‚.„¯`h>ýìèaôaŽXŠ bhc‚.L¨à÷Û»?<Ünj2šMÈ´³¹ëB߽ĈɃ9 ÏòŒlûGÞýº)åj~ßÝ›µD–^éq&Ãr~gãÅì"(Ýß(Dk*•¢5•B´¦àýšiM¯ðu,û•¢5•¢XGDkŽmÜ8ZÓÓÑs£ŽÐš'8ƒçÅbs7œ¼‰ÍÜÜ=6¥xU÷U% g0 g’4œÁ4œ‰i8³Ðp&¤á ¦áLІSÑpV€Q¨΄4œy ΡáNpÐÓ¼¥|ž„kïy'Éç[Š„È}¦¥&@M¶Š][UaDòc²åfeõ˜ö‡Y=‹ÒÞ¬ž¦GX½zÔ4¬no¸z¸âø€Qž…1òm9¾¨© ¹‹à8|YÿHEÍPkgÀ÷mY|ƒodÃσ/G,Õ"8_Ñ?ìPËåv‚ï~êÜ7ø~÷ðÅÓä<øJŠà+ÏŠ!ÔÐ?†PõÄÏ>|÷ëß¾Á÷»‡o }|Á øÂYñŽZõwÔú±ŒQKiÞ7ø~÷ð}ÅTù6G¯ÉÍÇz2‹ U×eú2$•éË”éË «>µ°ðu̬º6©L_Ú L_V€Xõ±xéËÓÑ‘U7äZ~ðíüñf ™xC¼pdå Žz¬˜5ÀÞý¬+†‘Ð¡Ä ÇÊØF]_óX1+†J¤€Jì±2¶1A&TÐÑcŰldAüq>÷G´ÌW$ǬȽ—·+ûNfYO¼xRá)»g =J [x66–1\…«®á(¶ØðTl±á(¶Ø ðªËçØb¯ðuÌ«®á©ØbÃ9ÖÅmÜ8ƒØbOGÏUWdÈ 5ܹåÓÕx˜wËsùºíÚ‡¦§(Oѽq˜9‘Sé°bÄšö}t[¥ —ÈmÌȔۘ‘ÈmÌ 0Èåì6æõ¾Žä2å6f$Å:"·±±gà6æéè ry€=,ùîÍÜFðk÷ Ó§F´æÓ¥Uø¸5Œ•ÈZˆ§sÌˇ¶ä”cÊí\ôý•ÅH”•m”š5…üðŒJùá…üð¬›55ûáy}€¯c1k*å‡gùáY6k0ûá­}„ÏÑ׬©¬jYÛe òÑ05{—üÆ:kò„D%ò÷a³¢^ÄËw7s•C­>} }Áa&a ÍŸ~6$Å$Øc{pÐ7,blt!|3“ uŠIÐ )Ð*bltaB=™s€vlH´1ƒâÿ*Ž*I†Z²À–ÇÒW¬Ëg&÷(å%ÌB+0`¾ lmg„„‘¼ƒ ÉË3¬»£ \Û]û_‡[ÛA"’wJ¤ƒàHÞ©§Éëëè·¶¯àÁ·ËSC_ZÜDûÙšÔ0»I)*v*Äó8.‘¼ËékzÉ*ޝ;ySfM(ܳ ÐóÊKJ_Pj ™D–%ÚAª‘•b˜¡um ì|‹%d †vr¬3´S7NXBö -N*µ„ûIž°‚CÅó/ÚA´dÚ˽Ur*..èËWº•Q_PŠXÁbE‚n¤€Ð$0ÝêÚ@Øø:ÄŠÝ:H)ÖéÖ©' +ž€nFq€nmAì.Qñ»qmÙr»SÎ$^v 2L„5n×ò…« —@.!ÁR0˜/tm ì| .!Á2" Ò!1_8µqã$.á øÂaøÂ\^sâ>p¦ø~ _îÊ´ð¥XSaM'¼ù)C8ÐØ›Ïµ°ðu,XS o¾Aª…½ù¦6nà:Àšzo¾áÁ/¥ÕZœóYZZÒ¨”¿gÐé•43Æ”‚Î`Ò̤H3JiFIDšMm ì| èL’43˜431ifÒÌ„¤™yÒŒ’Ç’fQ}úŠôwyŠ7Ú’V8ÃÅLØGº^)ýø½|âΊCm9íÅß¹ï•PœÖ0û› R²)wéÞŽ¿Ô¨Q‚ø¯E0µvëÜ]Ô_>ïO#CÍ"zÚ”¿Ìé• ŠÑ«Ê»l§.^°B™’]ç~ÍŽ­â1Þg‘̳³væ‘7úRñq­ñ³¶‚ƒ×º¶ÔŽ­kKÐÄ׺6{pë: ÂkÝ©º¾‚éZ×–œŠ¯um.¬§4œÚ˜  *èw­kSbç–ÂS¼VóÓ´Å¡­!‡øÆiŸÑBpæ»?'é MB¾ Ë(_p]k‘÷³H¡Kšüc• ¶º¾‚]sqôaŠÐ]¶ º0¡‚žèÊ—W9Ã]´bãŸ`ÊYö¨å)ŸÓ<_Òñ],VF™/(À×±X™rgd’c‘;ãØÆ3pgdòÜY¾ÖÈ)d¿JÏ›ò™LžÕ><ïÑÀÙ¥Õi¬\° JÁ‡ê‡ ‚”g"CõCFß\?Äï| øRõCCõCFß\?Äë#|޾àË×9|ûNüYCäÆ!_¼j?ª3?’8ùÂlùßœyï{JõÑóv!^’ñæ”á:%çÏl«(˜ÙInúºÎ W3<‚fø]¹ä`k±÷3K\r0#Â;6Öz î)Æ6"èBø Ü%›‹´„Ö) ½„ƒ°mLÐ… t¼ä`ù2/goTë‹•ò(§¦=LÞà(~X“Ìn7‹ÎF¾ §•_²ƒ¿ÖÑe#ääÕԻؿDM (ÜÎq‚˜ÞaW˜ØÎqŠ˜^+@Û¹© „}€¯cÞÎq’bz9AL¯ íÜØÆ <`z=·s<_R§ÁB›¼ë”´WQ' ¾|¥{¾–qaÒø‚Ò)Îá8À×±Lq–"-ßê`á8¶qã GOGÏ)ž/;sÊßO]•½½¯ð5Íå&¨Ú‚n¬-.9{ŒÅ€Y §Œ‰VA)`â׸Hñk\ ~Í 0`Ä̯y}€¯cŒHñköúéˆøµ±gÀ¯y:z&_èåÀì§Qþ~ÃøZdÄ­ ga¼‘ÆóEF.™: Ž–ç#Ó'¦›) uwð-ç¹Ùê”ùà YI‹Ñ3“ŸU¦ƒñþe:Ï—éxv·#ÝROÆsöŒ$‘¬A>$QEµŽŠhœ'6,¥Ë—C¯WðBR_PºSC/˜H¼¤èô.¢‚® „}€¯cÙ©¥ ^0nðé=*x1µqOïÏPðbxðkOï»7¡©˜ÊóM×d`Ê÷Á±"«~C¤BÅõÐõI"‡‰°ú8‘@PˆKAå hŠr Q‚E”ÃÔÂ>À×1ãRÐå (¢(‡±g@9ú ”ƒÈ×–8——¤åÙÆr'šªj,5+öÖ¢”â "_‹¡åU›0Ä\èeH8*ÖúsvòÜ?ï|¾œÁ*ÀßÖ¡ã…àÝkð2‘¯µq‰ai‰)yŦ§t,¼âc¸‚g±8v[Ý}–å‹=À×±ì S˜@FÞμ>Âçè»3Ì8Z»éT6Âθ´oLõë¯Äš!Ÿ í Ž[c­ú[ã|zùK¦Lñš_l‚ ŠM8/úe±Ië»ÛðÙn¡2[œ&óNÛ»E’v™OÒ~Š¡ˆáÎÈ¥¶q,ŠÖ¥†eè”jÖ•»I¹fBg@}A),p&t™Ì„.q&tgB—K&tfB—8ºLfB—8ºŒ3¡Ë%º 3¡Ë§È„.ó™ÐONjùð †YX´„&5ùzœ†œ5W9SÜ”"ç*—É\åç*—q®r¹ä*—a®r‰s•Ëd®r‰s•Ë8W¹\r•Ë0W¹|Š\å2Ÿ«ü äì—@¿9å;°š¨Ø–¬u§Ó{•Ü‹aè§1'¾ †8¹L¦1—8¹ŒÓ˜Ë%¹ Ó˜KœÆ\&Ó˜KœÆ\ÆiÌå’Æ\†iÌåS¤1—ù4æ—DXì×¼—oõËÇù¾Ò”û‚Râ¼æ2™×òÈydLm ì| “yÍ%Îk.ã¼ærÉk.üæò)òšC>¯ù%(lçL§éki›(Ñ\È™¾ªWtW¢C86L‘¥j8Mn„дŒþÄýAÕq`ÿåTøÏmœT¢Mâ5c=5!BË÷Øp=³þÅÄyh¬/.O™ˆ(âø; ˆ¿³¼ÂЙ¿óú_ǼÂMñw@9Öñwc7΀¿ótô\aXv¹¸f…Ù;¼xŸ×`Ç7rš”4y\œEr[éA£}A)ê8¢§èAàˆ´Œ:>Óƒ^àëXPÇSô pŠuDôàØÆ3 ==Qǯ 8‹P·Ÿûçѧ«èªêQNLå…ãk1ÆW"qŒ[¥“ˆH™"A""Ñ 0ÆäL$z}€¯cÁ˜L‰ ‘hcb&×>Âçè‹1ymL[„±ý°“‹1V^ä¢É—0»Ó­‰êl?ÃPªÂX¥0D$‚J‰ ‘h†j&½>À×±ÀRD""­Ãf"qí#|޾0T%D™œÃìDæQ†Ì4<[R7:åErI_P :xCÐIÞÐ`ÞÐļ¡™yC¯ðu, Ó)Þ4â ­ƒNϼáÚGø}AgËî;ðv«¨—¯®í2jOqã¥{‘¾àhÞBEÂÒgФJŸ)‚JŸYÊ[8¶AÂWàò*’*}¦Ç ¢ÒgctaBó*z„ËØÏŸœI'Vsº)ÏgüØÌxEñM×Rš îÊq–Û–ÓcÇpŠzLð…+©bˆ©Q,ÅÔ(†˜+@+éÔÂ>À×1¯¤Š¥˜Å(Ö15c7΀©ñtt\I;ÂÔDv¡!0q꣪ØÕ†ß}Þ„œ’Ee7áOSÒ‚–Š-á7þu÷¢Š­álnÖ_ŸšÒpWDr|—ëW‰‡9 ¿,1že‚/ëãíãýÛð­ŒU…ÉÝýõåkÑÄ:?¢o¸â£[œŠ.æ{vjr{áeßä/ÙXÜ&zØBÚÙÒˆ—èíO›h¦^Æóô5¨Äo¦ï’óf k-å LsË)=:û“ýÌdv{a„Û_­¿y—ímšè¾äC¶­[+Oø[î3Χ~CsÏáU÷÷Õ<»Ûˆ ³Nk Óx!“T…ˆM)V«âg¢îþñöÿ¶ 5 endstream endobj 1268 0 obj 6485 endobj 1272 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 777.620000 143.519999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays >> endobj 1273 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 180 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers >> endobj 1274 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 149.280000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices >> endobj 1275 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 135.840000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 1276 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 743.060000 146.399999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 1277 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 734.419999 131.039999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 1278 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 175.199999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode >> endobj 1279 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 717.139999 164.639999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode >> endobj 1280 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 708.500000 135.840000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts >> endobj 1281 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 164.639999 707.539999 ] /Border [0 0 0] /Dest /#b6#18k#3d#d6#e2M#a2mW#b2!#d9#d2#97#e22#e0u#5d >> endobj 1282 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 162.719999 698.899999 ] /Border [0 0 0] /Dest /#23#d3#f1#ea#8f#db#96v#c0#c6vp#dd#28#9d#c5#05Z#80#f8 >> endobj 1283 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 682.580000 130.079999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources >> endobj 1284 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 666.259999 89.7599999 673.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl >> endobj 1285 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 649.940000 122.400000 657.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn2 >> endobj 1286 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 641.300000 210.719999 648.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 >> endobj 1287 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 632.659999 213.599999 640.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 >> endobj 1288 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 624.019999 162.719999 631.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 >> endobj 1289 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 615.379999 180.959999 623.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 >> endobj 1290 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 606.740000 219.360000 614.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 >> endobj 1291 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 598.100000 217.439999 605.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 >> endobj 1292 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 589.460000 196.319999 597.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 >> endobj 1293 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 580.820000 179.039999 588.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 >> endobj 1294 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 572.179999 239.519999 579.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 >> endobj 1295 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 563.540000 243.359999 571.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 >> endobj 1296 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 554.899999 170.400000 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 >> endobj 1297 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 546.259999 181.919999 553.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 >> endobj 1298 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 537.620000 149.280000 545.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 >> endobj 1299 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 528.980000 152.159999 536.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 >> endobj 1300 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 520.340000 173.280000 528.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 >> endobj 1301 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 511.699999 187.680000 519.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 >> endobj 1302 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 503.059999 147.360000 510.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 >> endobj 1303 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 494.419999 153.120000 502.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 >> endobj 1304 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 485.779999 158.879999 493.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 >> endobj 1305 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 477.139999 172.319999 484.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 >> endobj 1306 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 468.499999 241.439999 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 >> endobj 1307 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 459.859999 206.879999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 >> endobj 1308 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 451.219999 170.400000 458.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 >> endobj 1309 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 442.579999 178.079999 450.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn26 >> endobj 1310 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 433.939999 171.360000 441.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 >> endobj 1311 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 425.299999 186.719999 432.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 >> endobj 1312 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 416.659999 204.960000 424.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 >> endobj 1313 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 408.019999 163.680000 415.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 >> endobj 1314 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 399.379999 189.599999 407.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 >> endobj 1315 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 390.739999 168.479999 398.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 >> endobj 1316 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 382.099999 141.599999 389.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 >> endobj 1317 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 373.459999 113.759999 381.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 >> endobj 1318 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 364.819999 182.879999 372.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 >> endobj 1319 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 356.179999 163.680000 363.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 >> endobj 1320 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 347.539999 180.959999 355.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 >> endobj 1321 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 338.899999 223.199999 346.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 >> endobj 1322 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 330.259999 216.479999 337.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 >> endobj 1323 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 321.619999 173.280000 329.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 >> endobj 1324 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 312.979999 180.959999 320.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 >> endobj 1325 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 304.339999 173.280000 312.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 >> endobj 1326 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 295.699999 219.359999 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 >> endobj 1327 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 287.059999 219.359999 294.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 >> endobj 1328 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 278.419999 163.680000 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 >> endobj 1329 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 269.779999 126.239999 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 >> endobj 1330 0 obj << /Type /Annot /Subtype /Link /Rect [32.1599999 253.459999 183.840000 261.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending >> endobj 1331 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 237.139999 119.519999 244.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 >> endobj 1332 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 228.499999 121.439999 236.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 >> endobj 1333 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 219.859999 130.079999 227.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 >> endobj 1334 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 211.219999 134.879999 218.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 >> endobj 1335 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 202.579999 165.599999 210.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 >> endobj 1336 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 193.939999 145.439999 201.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn7 >> endobj 1337 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 185.300000 157.920000 192.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 >> endobj 1338 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 176.660000 188.639999 184.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 >> endobj 1339 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 168.019999 168.480000 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 >> endobj 1340 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 159.379999 192.480000 167.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 >> endobj 1341 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 150.739999 174.240000 158.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 >> endobj 1342 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 142.099999 174.240000 149.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn13 >> endobj 1343 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 133.459999 159.839999 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 >> endobj 1344 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 124.819999 143.519999 132.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 >> endobj 1345 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 116.180000 144.479999 123.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 >> endobj 1346 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 107.540000 136.800000 115.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 >> endobj 1347 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 98.8999999 184.800000 106.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 >> endobj 1348 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 90.2599999 217.439999 97.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 >> endobj 1349 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 81.6199999 132 89.2999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 >> endobj 1350 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 72.9799999 205.919999 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 >> endobj 1351 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 64.3399999 155.039999 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 >> endobj 1271 0 obj << /Type /Page /Parent 2 0 R /Contents 1352 0 R /Resources 1354 0 R /Annots 1355 0 R /MediaBox [0 0 595 842] >> endobj 1354 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1355 0 obj [ 1272 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R ] endobj 1352 0 obj << /Length 1353 0 R /Filter /FlateDecode >> stream xœí]_¯å6n¿Ÿâ>/ë¿2“¤@  ‹>³Ý.™EÓ}èׯlË6IIÇ’l_ŸÉ&dæòò²II?Qä·ÿòÓ¾þ÷ß_¿ýøÓÿ¼~Žüéexì0ÿ÷:þù¤Srþ§óæMÂøßëç//¿¾þúòéåSøÿ¯/ÂNŒ…_.*fÿü·—ogå/3å§ÿþõ¯òõ_ÃO}ýã„¿þå _^<Øñ¿ÌÿRH~Àÿù——ÿÃëßÂü$wüÿ7 džñëúQ1ýÁ-è ¯J:Æ'ÂÏ„wñ¿ÿõòçñ‘ÊŸXÆ Ò1-&ðfÆwÿe!˜áÍûÁ½ Ó?ÄL•à'Öaˆ„Ï/B¹7´y¿òX*Ãbãf‚Ÿ>öJ?¯ÓãGð8Fž8ðE}ŽÏáû‰|/"ù^ù^äöN~}ðÁ?¿|û#Œ&øóŸÃ¯&;žÿú9¼»ðìߌ®_þÓë? ƒøáŸ_þëôµÌ50‚ø0ôFøq—ã#ã>2Aˆ7£­ßÃÆ:ÈgóBš¡æ7BN¿qo(gôÉÇ:ø‰ðÃÏÁ·Wœ3»ð¦Æe³“zÀ„_·Wc·Ö1»µ>g·n`6å†Än'KeX¬cµ[ksvk ÓÜnGž8NKìvÓq§Ý:y©Ýr¡Ñn«­Å©õË‹ ‹µ\ðf‚"òf¤˜âÍÃ`©Yþxf~ozvÄê8«.²¯ì°êû¢“—õðÑ—…ࣚ'¯?Ô€¾¼(árµ¼añÇÛ\ü ‚Ɔ@àñgâ±T†Å:Öøãu.þxÅu¨$þŒìNûº¸`/.4å ötE]fÝwsn¶{¾õ@ß•Ù~¶ò GŽÇ(_2§Éšü².Y2¬ø ðo¨œ”5¿—)c˜¼ÃÜ7£‹pW'–ôKLG°8Gfl‰T]ZéF›,Od_ïøeúí @ÂÁ ªapP ?Û4¨ª'1o"Р:óh"BcsP ?ë4¨ªâ  ª3@ÜTÕ ×/–§v¨Äæ:öReGér=Ö0¿†#»ž°^Nì ß݆;€Ã„ºŠM¬ „LbU ÒΉ@7*‘ÇR눕@È$Vªà:xbÕÌlj«°Žû6*aþDWêp¶.ȱ ¢õdm´ŸuŸ³¸jXB•#k:€ò+I_ýàßgÓˆ†f;ÞMO TSšhpŸ5Qóܪš`X5Á¢™ÉÀ°ªY¤1†<–ʰXÇÍL†Uƒ¦Csvæ‰ãH43OÆQ¬0ì%Ñlv¾/.N“MqŽOQ?5·§>ˆ%îŸ^ª_¨t­ƒÊÛ¿3VÛ.«cÊ–ƒ¤¼Å„Ú˜bÅ—rU2wÊ<–ʰXÇSlÊ TÇtXåÎǽ“»9’'۾ݹ¿°o˜,QÇJ¨µ_Öq$rI±’u™Ü~—Ž#X†Å:VûÍu T–+“Ž#3O'IŠ•ÏÐq$¼‚#Èñ¾ýî.Nµ+í¥*¶ëå)éš ºFSßš[H˜PkꬹE ä)Éš[LnêKs ,Ãb«©çš[ªâ:dJ.Í- ú÷šúÖÜâSß¿lQDl†UÞ©É,’”:õ‚÷ƒVÉã¼Ã´õßP!Tú¥bý7!‡(Öc"0¿TKÿ ,Ãb‹_ª\ÿ@\G‚¨¥ÿ’AŸãV¿TÃ|dß/wïe4äY¶œyõ\ j¸`ÝpØV¯¯¢ºeƒ°dyyV¶¡ÚÚ™(Eµ,Y¶¡’¹lðÉ`Þ%“lÙÇRëX=Xæ² Ç[)T‡H² 'ž8N’m¨ä3d*y&LÓq©ãkè ×jâ’V¨Üµ&®Ø>_éÜ>_i¶ÏW:ÙçÏ<–ʰXÇjâ*·ÏWŠíó•JöùO8Ùç#wš¸¾tŸ_q ãÌé´•¸TÇVªè¨È3¿øZGŠXì^þÍižƒt(L¨õÖ°"rh„b +&÷œ¥a–a±ŽÕsr +Uq ¡–†H}Ž{=gkXq‰çìfW_í9 %N)Úqe«e#¶—f]í†&Ôº!pð²àpðRðVð(ø|€,ø|€|€| >ÀS€p)ødH~Í[—Ìì¤wû3j÷>8ôîý‰^Þ4©ï¿œØõÁz#±±kÆz&ŠÔ/wÔ§OM[+=VEß•ÑZ³V(š4k…2X´ÖK+,ÃbK´Ö¹V(aë΀&´B™yâ8 ФŸ¡JÅ¥@SrÚž}÷UTrd_Ÿ&ûÀ_hϨŹÊÿ«?Ö[÷å¡6„°î)J级*òtÒ=%òX*ÃbkÉuO Täé¤{ÊÌN€<ý ÝSƒ¿oÂNE•â÷!gäÄw/j(ïÑèc¨Wɔɫyc—=Ó Ô:‡ jÃPAmTpæ±T†Å:VÓ9Tp\gP:A'ž8N‚ jý ¨ 6×&%>v vî9>öûEñÉ ªµ§0¡Ö -ƒµÍAŒÚ2ˆq$p7´ ĈdX¬cuC›ƒµU\G1Nð­ü§¡ÙÄתV{¹G)OŽ^V3½¬f†Üe53°Ëj#]V›x4¡±‚xY-ü;sYM»¬6Øeµ‰ˆ  n¼¬f†#àÔ®·$ÊwøÐ5ûZªxôÓõÔ²¬Oœì©©{I÷žskØ-|PáH4;³ÿG­_º­×<뻳PM`¨&dQMà¨&¤¨&,¨&Tª 9TÓx†jŽî—~A5 šð¨&@5÷ïï<¨šœ¬öëóVz–Ò©ø¶¶}¢L¨ÜhÚa7Vä°+v3ØFsæ±T†Å:–¦rØv3ØFsâ‰'Ø ÒqãFÓŠØMb¶=½ç‹%][bvý‚ïAˆ>¥R@Ð}·ãª6ˆÈŠ­½T˜Pë¹’ADVæ "«D4¸çª"B2,Ö±z®ÌAD!„22ˆ&ž8N!wz®:Uxî~¹Ô‹[ž×q±U«¶¥žjG³t/«sé^V³t¯‘ÀG/é^H†Å:VÇѹt/«ב¤{MñZîºà•5ÛÓiDZjÕ² 1ksbÖ² ±‘ÀÕ.bH†Å:VGµ¹ 1kבdˆM³ôób +³‘À–~&"4V—~~°™¥Ÿ S0¾ô›x€ˆªàÆ¥_°ß~/ë¨[|n„/·õ~˜,½NÁØyÀIòíÚ®ux±å¸ŽOǾd“AhËâ߃ üÛ-WüJÒE1†þX4„¡¸7þ¡øµ÷•e>“Ähþ Ldvð†™a—ó©rp Wøàu%àXòY(àûÒcHÙþ›d$1ç½|T“{œdôů©l(1ñ&·KÄÛ95E¸j ¦øbS©ÉgËöµ!d [iá±U$"ž{-là]®°w¬°wIaƒ‰G+Xæ^—+làâ ’Â@Ü9÷–[1¥Õ;n‚Õ6èiå׿O®Eí ‹2)A`Âaÿzfä!wfäyHÎŒ&MDh¬`ñÈy\Arf4ñTÁþQî‘Tá»÷­ºöw§ö’¥¦ÆúË»·ŽŽd'ìøf§BÉ`0á¨S X?ˆÖ‚aý ¬âÑD„Æ ¢SÈaý00¬†ëŸx€ˆªàF§‚r+› §:rë@Êò ƒƒ]hÿA(»Ð»ô«­ô6ØrûäT÷ÄIK<Øz¿Ì?/m[¨¡+ÉœajýBfäÑD„Æ o[z¶ÐKÇL}_è F "€*¸ÓÛÊ]_*¼m*l©.Óq–ÑRêÌê2Šåí.:œZ7-µv™nçCckà­] ÛÚxkH[»ÀÚÚhkà­] ÛÚxkH[»ÀÚÚhkxŠÖ.PníÒáHïuÐvZ¿Ï:ùì±gy0] ºÀo1¡Ö·x¿ÈökÞ¯Ò~-°ökÚ¯x¿ÈökÞ¯Ò~-°ökÚ¯ž¢_ ”ûµœâ[vb]—6ï°hÔ EkL¨µhÞ ²½P€÷B´ ¬½P€öBÞ ²½P€÷B´ ¬½P€öB§è…å^(§Xôî6èÝ,ú”¼Å¸ã¬#bØ’&¤˜Pç9zèè@È܈Tz#z"Pω<–ʰXGôœ@È݈`7¢’ÑO'¾uÜç9aGà}ÏÙßÒÄ çÌÑMyóÑ_ç‚´RJÃ6¨!³ù÷Þ}r2ûí˜*l–¡ÖÿYï =äzOªdþŸôžˆ<–ʰXÇêÿ¹Þ꘎¤÷ÄÌî‰ÿ?Cï‰ðàg=帋3gz5°èiòEÃ-¥†»%ÏTm)|u¨­Â„ZOb-'!ƒX赜˜Ü“––X†Å:VOʵœTÃt$-'fž8NK<éZN„Wp)bQqsÿ(^ÏF)Ô2¥nRË©äå™íâ*'õÏÕr‹ Gß©GߥbXÕ¡5½Ð jC…1,T˜ ¨ž¹±áLä±T†Å:ÖPa2L *®ƒ03O§&¡Â<£‡r‡‹SBÅ~UúÂl-õ5囈 •nNm(ñ¾‰'Ñû,º­l0¡ÖûœbÞç2`Q Z掃E‘ÇRëX½ÏeÀ¢@\‹fž8NI¼Ï=XFq)X´yù¾ë¾g¶ Q¦¤·|œ“s«gëÚ  Ï»õ@»6„Ÿ3Ù%J³K&=ïžy4¡±‚ù¼;üœÉ.ÑëÚ0èy÷ÌDP÷w‡Q€ö7‡]‡påUTVéI¡j^­UM™?½êÜŽ¶g\‚x0Ÿ‘ zο%Ÿ-Øó–aã &TNÕ‚u×Ð"×]#P:%’î‘ÇRëX¦j‘뮨 Iw™'œ Sâºk„?€N%á¥'§úT¯8tQ½ [³ í° ¬ÙD äÀ!ÁšMLnÈK³ ,Ãb«!çšM*‡DÒlbæ‰ã$àx†fá‡* yÿȽxÌÒs•´Pj´[ÔëAB­Ý²^C*ëõ0¸Ý.½° ‹u¬v›ëõ¨ŠëH ±ôz@2èsÜk·å^§ØíîÁzÜ1äN±Ï-hÞh¦[§)&Ôš)ët¹-½`&7Ó¥Ó–a±ŽÕLsUpÉ–^, ú÷ši¹ÓÁ)fzf§ƒU+ú?ïæÔ¦zë kÞ ¬õ¯z¶rûjv˶rûZ°rûK.¬ÜþDàn¹”ÛÇ2,Ö±ºe®Ü¾¬ÜþDàn¹”ÛG2èsÜë–årûg¸å¡^ϧ–:Ù-:ªV%Þ~Jû”›gロÛ1ͯf•Œ‹ökL¨s¬h¿–¹¢ýÊ` ™í<–ʰXÇçrEû•ÃIÑþ™'œÂÏP´_ËrÑþSâÜîÑ9Ε+¦È¦ŒçðŒ  &Å⥠¥}ÂÏ™Ò>ZJZÚg"0,~âÑD„Æ "/E¦´O ¦@ðÒ>3@܈ÅËr­ú +ÜO/ùØÓY¨þúæísê©3KO­ú†úÄiŽg}uÞû_tC‚ê9ó•g•þׄpaÅDÍ\» v¾2«Ÿ½Š±ÈcònÍÊÐÙAeŠÏªgÁ[ñâ33&"4V°Ì*S|&PWÀ‹ÏÌ<@DUpçìPî”P1;ìg•3’ØX®Ìz¤Jîþõÿr¹ÞŽãßtqß0|Ý7šNTåÖªAÎþ…[5|zùôúk0í©|Úðÿúü¥*d ©ÊOÌM>úèƒs=û*°sQÂrpÎtQëV † aóè·Bµ éÞ\¯p™ßÌ_¿Rolz4æÍÎ_"÷žœ_ü ?3;–“orP$E8æ&å¤ÍÞ‚)ßy£gžðÇÒg¢¥ç~#J϶í3ñkyö8¶ÉX÷VÌã Di¦ŒDœb也Îôº×O/ÿ2†9 endstream endobj 1353 0 obj 7816 endobj 1357 0 obj [16 /XYZ 33.1199999 477.139999 0] endobj 1358 0 obj [16 /XYZ 40.7999999 453.139999 0] endobj 1359 0 obj [16 /XYZ 32.1599999 525.139999 0] endobj 1360 0 obj [16 /XYZ 40.7999999 278.419999 0] endobj 1361 0 obj [16 /XYZ 32.1599999 479.059999 0] endobj 1362 0 obj [16 /XYZ 40.7999999 453.139999 0] endobj 1363 0 obj [16 /XYZ 40.7999999 278.419999 0] endobj 1364 0 obj [16 /XYZ 32.1599999 525.139999 0] endobj 1365 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 777.620000 120.479999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 >> endobj 1366 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 768.980000 197.280000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 >> endobj 1367 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 760.340000 178.079999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 >> endobj 1368 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 751.700000 153.120000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 >> endobj 1369 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 743.060000 196.319999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 >> endobj 1370 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 734.419999 146.400000 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 >> endobj 1371 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 725.779999 174.240000 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 >> endobj 1372 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 717.139999 115.680000 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 >> endobj 1373 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 708.500000 173.280000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 >> endobj 1374 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 699.860000 178.079999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 >> endobj 1375 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 691.220000 161.759999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 1376 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 682.580000 196.319999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 >> endobj 1377 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 673.940000 227.039999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn35 >> endobj 1378 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 665.300000 219.360000 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 >> endobj 1379 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 656.659999 228.959999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 >> endobj 1380 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 648.019999 207.840000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 >> endobj 1381 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 639.379999 184.800000 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 1382 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 630.740000 177.120000 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 >> endobj 1383 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 622.100000 195.360000 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 >> endobj 1384 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 613.460000 175.199999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 >> endobj 1385 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 604.820000 259.680000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite >> endobj 1386 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 596.179999 237.599999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite >> endobj 1387 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 587.540000 177.120000 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 >> endobj 1388 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 578.899999 355.679999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites >> endobj 1389 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 570.259999 202.079999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 1390 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 561.620000 146.399999 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options >> endobj 1391 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 552.980000 163.680000 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 >> endobj 1392 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 544.340000 189.599999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info >> endobj 1393 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 426.259999 89.7599999 433.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface >> endobj 1394 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 417.619999 104.159999 425.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction >> endobj 1395 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 408.979999 153.120000 416.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 1396 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 400.339999 94.5600000 408.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 1397 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 391.699999 108 399.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 1398 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 383.059999 114.719999 390.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 1399 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 374.419999 122.400000 382.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 1400 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 365.779999 141.599999 373.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 1401 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 357.139999 122.400000 364.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 1402 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 348.499999 126.239999 356.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments >> endobj 1403 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 339.859999 98.4000000 347.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1404 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 331.219999 137.759999 338.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 1405 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 322.579999 95.5199999 330.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract >> endobj 1406 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 313.939999 148.319999 321.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs >> endobj 1407 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 305.299999 124.319999 312.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 1408 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 296.659999 137.759999 304.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 1409 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 288.019999 144.479999 295.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache >> endobj 1410 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 251.540000 160.800000 259.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl >> endobj 1411 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 242.899999 116.640000 250.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 1412 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 234.259999 100.319999 241.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 1413 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 225.619999 116.640000 233.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken >> endobj 1414 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 216.979999 97.4399999 224.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D >> endobj 1415 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 208.339999 101.280000 216.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go >> endobj 1416 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 199.699999 108.959999 207.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile >> endobj 1417 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 191.060000 105.120000 198.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 1418 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 182.420000 122.400000 190.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript >> endobj 1419 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 173.779999 135.840000 181.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp >> endobj 1420 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 165.139999 103.199999 172.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua >> endobj 1421 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 156.499999 119.519999 164.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3 >> endobj 1422 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 147.859999 149.280000 155.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme >> endobj 1423 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 139.219999 111.840000 146.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml >> endobj 1424 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 130.579999 112.799999 138.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave >> endobj 1425 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 121.939999 108 129.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 >> endobj 1426 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 113.300000 105.120000 120.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php >> endobj 1427 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 104.660000 105.120000 112.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike >> endobj 1428 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 96.0199999 112.799999 103.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 1429 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 87.3799999 96.4799999 95.0599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R >> endobj 1430 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 78.7399999 108 86.4199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby >> endobj 1431 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 70.0999999 110.879999 77.7799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab >> endobj 1432 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 61.4599999 101.280000 69.1399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl >> endobj 1356 0 obj << /Type /Page /Parent 2 0 R /Contents 1433 0 R /Resources 1435 0 R /Annots 1436 0 R /MediaBox [0 0 595 842] >> endobj 1435 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1436 0 obj [ 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R 1431 0 R 1432 0 R ] endobj 1433 0 obj << /Length 1434 0 R /Filter /FlateDecode >> stream xœí]M$9n½×¯¨ó›’HJŒ¦¿ ø` Ñø`ø`ôîz±˜Y¸wþûE„"DJŠïÌÈêí`ªŠ©$•‘$C|Òcüô¯_þûõþñúÓû/ÿûúuøùþËKsk¨éÿ½†ÿ~Ÿ ´»ÝÿjÞ´ÿ^¿þöòíõÛËç—Ïíÿ¿½(êÞ8üh_Œ&z…ÿøú·—Ÿzã/½äËûoû¿Wýúoí_}ýÏÿjüqÐüöâ<…_~íQZi×þ‘þ^üËËüîõoí\§7üÿ÷ÊCîÐ4¾oUÝé[+¶ÚKéU)ÝNÛkñ÷?½ü¹Õ5Nâ†j?‹uPý}…×Ú±6Øi øŒ¨»±0Ò~’»]+Õþ›3âhøWý}åÇð­ßóoýóÇW¹ã“NLØ^€&Äàð7Ýœkì+Ùî§R®“º×öŒi¢|}iß«T;Q§â`* 5Ðïÿ†îM¯âÍF0á|íÏTxnà//ï~Ç®†Ê®†bi@OWãÛÌßýòòÓ'2Þ/n_êÒfÿã—öËjÿhgaÛ?þøú/M£>ýáõ—¿vßÔ øY ÞuúѼ# u³„¤±ËÝÃ{3s^*ÓÀÞo,6É{33ëtÓÊñ¡™™úÐz­7èÍ5+f¢T÷ÊÇ_Z/Ÿ¾¦‚ÓºÎ9¬ŠN«¼I¿¾|™wz»93*Ðû¬2~p¹NÚF¹qƒ[‚¯/ÊØÁuÇ1ÄuPj#¼¡èÞmÅû•´¡º·°y´c†yFüsßÿòp×W¨;ßo?Èy¾ŸÈtänÛ{»9ßðè˜ñÅÝ+Ø.xœâïÁê{¬œ+,N­|RYcªCIÚ•‚sç,µkª^«ì½Õ ~(Q¹•é!xdpHÃÛ I+óƒiϦхü`ÂR&Ý ù¡C\¥6b~0MSÊíœç‡°"ù!ŒæÙ¤ù!±qa~0 Ý5?¼–»çú΃Ïí´šÂT³>·ÔÕ×sJåã¬OÓØ1>¬OåE|ꦟZ‹øl2>»1ÄuPjcŒOå ñi”6ZˆÏnÌ0qÇâs²qe|j¸k|~|–øÜ±0Ý—ÛîVF%˜&• ÖFƒ±"Z,D4ÂS¡É¢¡C\¥6Æh0TŠƒÂF+ÑÆ ó$ “+£ô]£!+¤ ù’±:tÃrO­_ÞæÈâsý"Vg÷ÏúDö,ô«±½áÏÜsõ¶fZΪT°6A ŠTJèDð¢ËD7†¸JmŒ ¡” Úõ¸°a²Æ ó– Ÿ!AЙPO>"[»eAgj B9©½žlÕų œU—Ë* 6¬ud+pcK¸±· éÈ6â6‰JmŒŽlK¸±JÚÈp›nÌ0O†Û$6®td{WÜF›%GÖ}šU­…åÕŒÖ3²¼nxo>£ê­/׺!ߟXce%ãêà³(¶&Á¯Â·î!?†õð·.ì!ⱇЦRÂñMaÁ8/ 8/÷º1ž©ðÜÀ…{ÆÀIÌâmCWQÒ™EMbXÂò•ŽN½æF²§4«/ìÖF†ëýp*ŸœIGÏTS PšûmˆÀèÆS©!0 q…À€0œh¬ ŒnŒg*<7pa`€:Pd#Œ^,Dú[ŠÂètk|nG1q*j?Äê99£ì9“"²O³aòýES!™ú-3+9ó)VWÁ«k4ׇ,N7W V®lA t Ã#0œ +Û~ q”Úˆ+[Ð% ´Àp‚@¬l»1Ã<†“ظpe 憳œ0vlQ[ 9³!ª+Ì-kÞ#KÎ,ë÷úå=Ë¥ÚtíÊÌ„(“ Ö| „|$dðAÄG”ÚƒJøH;wi#ÃGº1Ã<>’ظ2øð>²'ø÷ÿöœس&~Ð>­Jô¯ œpëSÁÚ"Ë•p Ë ЏL¢ƒRcQ —RÒF†Ëtc†y2\&±qeÑ\fO-nÐ5ú4ßÜÈ*Ôä¾X½#̼ræ.ÂÌ’n}nÙUÌ®@¶)ó ðPr&¦Ikc܉31àJgbÀ‰31A cÜÅ31‰JmŒ1îJgbÀŠ31A cÜÆ31“þ9®qwëÙã‹ÛŽb<ߎ«ïV=|¹~Ü>=jÝ{jÆÊF}…Q_3oP’Íhi§rÛÁˆú+›WA«³›Ëç%‚µÙÍ‹Eí…ì†8Q"»õcˆë ÔƘÝ|éDxq¢(dvóñDѤƒŽK³6wìvì™Öëï<Øw¸ËÇ/ù3¼v´f†.È8r"y¢·9ãÜÇcîkS6tè]*X™ºP èU :D- Ã ©KGè0ÑA©˜ºP• CT: ‘ºº1Ã<t˜Ø¸2uéÇB‡Ë»ä¼W•Ó^>òhT-ÈWçÝZ»Ž>®_üçÕÜr9²á» rE›8U*X|NB®¾¹z ¹úrõ#äêä:ڃϕ Wtr |.B®“þ9® >ÿXÈuϱÊsa,b»Ž5ßeYg;ì{îõÐçg½û û— VæjöIM û$%°Ï 9¤C\¥6b¡¦„}R#°Ï 9¤3Ì“aŸ‰ s©‹M®8Gij¥ÿ̶ã)\UIv€s5"¿“ß?úHMç&Jk£O HŽt ’#- ¹ ѧ#$—è ÔÆ}ºÉ‘6ÒFÉuc†y2H.±qeô™æâè;ÐHåä ÙMwÃ2¶~C[ç­8²á8ó)0ââ1³]ÅÇå¶iVg*3ÖéÐ0AÌTçGe0Ä¢r¦µÕ‘ãƒjJRGÆ7Ô›»HNk‰4â›m¿ŽÇ¾êl<Ýt÷ˆ6ÙcûßßÿôòîáI^kèÜ |¶w1Éï!³U2Á©GãOŒÑe ßiøJ'²;=? î—œ‚!æM?ÒH¼¦â;hÓˆ±¥/eimK&*AÃD¹¶¥ ':(µ1®m©  h8äÚ#4<éàŸãÚµ-=ø¸s¦t™ãð©ZY®?/›#´÷]”=×Q6" ‚µAg$L® “pÈ sNtPjc :[‚„É H8dÐÙ O:øç¸6èÜÅð2é Þ“bÏø=ïÑÙÇÚp·ÚsÒýÜõ wC ½¾ÔËA÷;´&^Ü'wí+FÁWbäE¬m¨ýÖ¯IgŽ1®ß x ÝÊïtØõÈúû@õ¤Yo\R=²Û¼[ïYbûÔ~ÆvÖîÚ aEõÁóÎo/Ôƒ2--„¼Ü×ò¥}-Ûˆ}-ÛdûZýâ:(µ1.„|q_ËË}-Ÿïkùq_Ëó}-ÿ ûZ¶¹x_k™Ÿ´…a}ßæÿ;7ïK»?ñ®½×ÛfܼÒÞ¦‚ûÝëƒ!îNˇúê»›û¡ÜÒ¾vÛP\è°ø1òÊé—f‘U¥‡µñÁÛ™è—Ö¦RC¿4«J#²ÊHÙȺ1ž©ðÜÀ…ýÒ¬®V`;òÝŠç¯Ô¡“ú‚vñÆW–¼ÎL|3ÍHŸ¬¡C×qÌꤗ.¥‚ÃQ8µSþ†R¶K$†²( c€©€Ô@ŒB£KQh”4 ²( cÅHêp„´-™˜wÕN§‚ÃÉyo`‹¥ÞÀEoà ɇÞÀ“ H Äd‚¥ÞÀDoà ɆÞÀ“ Ï \™LðÌ ”åݰ5ŒaoåøcýëïêpÎÚpÇ]èŸ83 îX;µ†˜Ï RøVëAí]íÇŠ‰ï¢-¯ºköålyÈqõkkò¯Í½†–©…ì¾4§ÇcÃE´7ë‹Öj%f¼àhÂw!/«†˜]äe 0H™Ü=uz~ÉVî½ÓisSý—­ž’7÷1ú.4bþªW¡w?Mùü?Õ´ µ M©ÚÕ\6™íÌXSKåùgæ2úê~‡ª«ë<Ê*>»m½¨O9RºL¦Ú@(Ù³«—Ýs?®žü£¶føôYýžÑóîq :!ùÞå–æSͶ<æ)s,9‘üBdø°œ*àYqV¶Eh¼»{åEf77Âo>™D¶~_{eÈFöæÐ6Äû˜ s/œî 13æsbõ”ë.Ai½Ò]ŸñÜR3æ×lÞC.öòÎgo¦BtkïCº“qÛ¾‹±Bm¯‚•ýÞ ¹sxK 7Èz}ª¾RÁ96Í ©ÏàCõJ~Œ¹«í5³Ž>’k|n¦W–EwéºÕßc†Ä£³;{ý[Hî¦GŠhï+¢½÷yÝà€Y'àEt?˜ H E´÷¶PD{/ ¿ Et7Æ3ž¸®ˆn'`bÂ=õÜÑÌS£vôòßôä‰ö0îk— B7Ø®R¯kÿ¶%¯S^xò™×…1ÀT@j ÷ºöo̽®•‚4Âëú1ž©ðÜÀ•^§Ï£kJÞ](äö2Ïò\èÞ•µ]}*8ìʸ+,¹²±ÂÓŒÍ\ÙDçU@j º²1%W6ZЙ+›è¼£ Ï \éÊÆó›Þ&¨mÆ¥ôà„uãÉÏØð|ÞÅFóË¥ÈL1¸áºfv×÷cÛ´ 4.ɇjžÐ”¢ˆOÄ,„1ÀT@j &T¥Ð^a É@ã™ Ï \™Ð.#õ{ÊÒî)›ï»Û‹÷~‰ãú[Ÿ û¥m¸_ZUòKk„ÛX“ùeL¤¢_’/ù%9a€\æ—aŒg*<7p¥_Z|02–Ÿ™ÀIŠÜdÖ}¹^Û’­—÷Šl*¸ç>Cõ¤&Yñ=®GþêtÔ™Ûí‘ñ†mͤÑÔ>hŠ Ê:Îñ¬ãŠx‚—x‚Ïñ¯†<ã|šuœãYÇð„VJ€“xB?Æ3ž¸2ëxsuÖ9µWvý²‰W[`‹Ç¾Û”tü„V tZ¡ŽV¨¦„V¨F A |ºL¤ŸVM ­P HZÑñL…ç.ôi¥ÔŸ®¾R;»Òý•šŽp–zvÍŽöâ—Ü_ „#¤ûëèð:E8FÑýu áPZKÂÑñL…ç®tŽz¯£·ÉÝú§yÈTåHÐÚ5XQ“àpˆÇ ”0ƒ¢0`“ H Ä…¡ ‘2 ¢ã™ Ï \¢`¿Ó}Ú΢kcœ¸½ÁI8‰"Ž“(*á$ŠN2vhÀI&ˆ±ƒ%œD¡ÀI‚@Æ8ɤÂsWÆÅúÚøª_Ö=h™þàtYœê|Ín²¨h¬Ztƒ©àpÄX^ã+[ªñCÆÚe5~7˜ H Ĉ±¥_YQãŒ;Ôø“ Ï \1.Öø3w›ìHþú§Bí9–œ«ß„ü)7á`SÁa§ó¢÷Å"ÜË"ÜçE¸E¸gE¸E¸/á^á>/Â},Â=+Âý3ẋðjùšïåï9»þñÝ3kÜŽ²^ÿà’ÐðÌ.ñRÌ9œ­ÖGÆrBwFÁÑ(ÖŠc Z•°­–"Š»1ÀT@j`ˆb­JX‚VZȰ„nŒg*<7peO‡kµ…MýæŽ~¤+nj—?™|[´Y˜*&Ÿ G›ã¸‡v%ÜC;{Œ67à“ H Ähs%ÜC;2Ü£ã™ Ï \m>⻞ótêYñËÎ>8ˆg*Âz›óõemKnmðú î îÛa†Šf|6Œ{TÖÙ%æâ§Ú{êÜÉ;um;¸ ™YÙ›×ʨó ?Öf=óy"r—ó-0X߃ qèÆP º1$ › 7Èn 0n†JСFÈ ›nŒg*<7pá ÒÐxö¡º;Óÿ{Ç+¿Sn8òs¤Ëm}_l}‹ðͪíGöÝÎ7æÞÜÃ]”cm*8ºR6ŽC9Æ• ã”2¸Ê™T@j &[‚rŒPNÈD`(gRá¹+[qcù´ì†XÞÐ2ò:ýTÄ)‡©à°Óóþ íß%0dÿÈû7Àп!Q©èô¥þ ­T€1&ëßÐñL…ç.tzû7Ìœê^~ÐÓ›ðFHú: JG½D_(öuÙ×ò¾û:ë뢯û:€ìëy_ˆ}€õu€§èëzùÆBX½rÎ@Ãݩވ÷'­ º\ gµ‚Ñ Š­ @¶‚€¼ÄVÀZA€hÅV [A@Þ b+`­ à)ZAÀÔ ¢Þuõ:$' v>цŠm@¶!€¼ Ä6ÀÚ€hCÅ6 Û@Þ†b`mà)ÚÀÔ† ¬~'ËRHš„'ŸL‚ÃÞ(š@±ùÈæ7€Ø|XóÍ Ø|dóÈ›@l>¬ù GxÝéë<Ø=ÍR7´0ÙÃ0?×­ÞNq×±Ï ›Wß]3íñ(kA´Ç"Ñ%Ñs¢=F¢=2¢= ¢=‰ö(‰ö˜í1í‘íñ)ˆö4íëÿÝs z¦Ô©£»oÓÉiâ¡+‹©à¨““à¡S‘‡N’‡N9"ŠOsÓ¾HëA¼QïgÓ+¶jÇUßã«ïé÷Ç­¾é¦k¥2½ò®ª­÷æTò¡:vÈÝ…Oø©öž!J¯¨ÚçîÛÞ3|c[>{Ú)æ€×…ßCëÿe«^¥ü[¸Ë'-½òþ”kà©~¦üb ­XJ†ýdøó™™çõóËÿñîÜ9 endstream endobj 1434 0 obj 6756 endobj 1439 0 obj [17 /XYZ 40.7999999 785.299999 0] endobj 1440 0 obj [17 /XYZ 32.1599999 284.179999 0] endobj 1441 0 obj [17 /XYZ 40.7999999 785.299999 0] endobj 1442 0 obj [17 /XYZ 33.1199999 533.779999 0] endobj 1443 0 obj [17 /XYZ 32.1599999 739.219999 0] endobj 1444 0 obj [17 /XYZ 33.1199999 421.459999 0] endobj 1445 0 obj [17 /XYZ 33.1199999 282.259999 0] endobj 1446 0 obj [17 /XYZ 32.1599999 535.699999 0] endobj 1447 0 obj [17 /XYZ 33.1199999 360.019999 0] endobj 1448 0 obj [17 /XYZ 32.1599999 739.219999 0] endobj 1449 0 obj [17 /XYZ 32.1599999 423.379999 0] endobj 1450 0 obj [17 /XYZ 32.1599999 361.939999 0] endobj 1451 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 758.419999 119.519999 766.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending >> endobj 1452 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 694.100000 106.079999 701.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 >> endobj 1453 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 685.460000 117.599999 693.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 >> endobj 1454 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 676.820000 113.759999 684.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license >> endobj 1455 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 668.179999 118.560000 675.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 >> endobj 1456 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 659.539999 108 667.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 >> endobj 1457 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 650.899999 154.079999 658.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 >> endobj 1458 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 642.259999 171.360000 649.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 >> endobj 1459 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 633.620000 145.439999 641.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 >> endobj 1460 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 624.980000 110.879999 632.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 1461 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 616.340000 90.7199999 624.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 >> endobj 1462 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 607.700000 104.159999 615.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 >> endobj 1463 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 599.060000 103.200000 606.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation >> endobj 1464 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 590.419999 168.479999 598.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation >> endobj 1465 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 581.779999 154.079999 589.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation >> endobj 1466 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 573.139999 190.560000 580.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation >> endobj 1467 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 564.500000 126.239999 572.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing >> endobj 1468 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 555.860000 132.959999 563.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples >> endobj 1469 0 obj << /Type /Annot /Subtype /Link /Rect [194.399999 319.699999 290.399999 327.379999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/legal.html) >> >> endobj 1470 0 obj << /Type /Annot /Subtype /Link /Rect [63.8399999 223.699999 151.199999 232.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org) >> >> endobj 1471 0 obj << /Type /Annot /Subtype /Link /Rect [63.8399999 156.500000 197.280000 165.139999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1472 0 obj << /Type /Annot /Subtype /Link /Rect [63.8399999 88.3400000 146.400000 96.9800000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1437 0 obj << /Type /Page /Parent 2 0 R /Contents 1473 0 R /Resources 1475 0 R /Annots 1476 0 R /MediaBox [0 0 595 842] >> endobj 1475 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 1476 0 obj [ 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1471 0 R 1472 0 R ] endobj 1473 0 obj << /Length 1474 0 R /Filter /FlateDecode >> stream xœí]Këܺßϧ˜uáÎÕË–¥ü“º(„º(]”ôq)MiÚE¿~åçX’­#Ù3É?n2²-Éòï·~þí§?_ÿþßëÏ/Ÿþ}ý2þýòéÂn¬eßk÷ßOËanR ÿÔ¦¹ Ûý¹~ùzùvývùxùèþÿíÂÛþÁñ/wqbèð¿_þuùyü2´|zù½û×ÿ®âú;÷ë×?þÉýõ—±¿î†¯cÛîÿþÁÆýXþ«»øË忺þËMÁôývÿÿI°–ë¶hßæGyÿßòQ`,·TÖâʹp“lÜZü篗¿¹¾æIÜÆÝ»h£À'ŒcÜ8Fµn¦ÜÄ„WD1ˆ{“jkÅÝŸx»˜DŽ~G¬X"V\Õ5Fm øå±B»þâåIíý?‹»©¼ì¾b\€q溘RÇ)>=Þš·Bs‚5»9gÍÝ,Äu1%ñ˜k^Œó•ïvü‚ÛþE¬[o;Nçñ{!½¸íä'§÷wñ/×_3ÆÞüæúù.oÝœ›Þ¢0^ùÐ_17%‚+ÒöW¬Û*g+ÄÞ3¼í¯4·n·Þ8o¡Þ„ææöäþ‘¤q^ +l˜µºé&œ5¼àÜ<Î;pÖï‡+ÍÍðä÷aPoœ÷WÚ›:[\Ь7ž‘øï3ÎíýçMB¹ã˜Ç–›¶à}çNZ‹›1L_[ÝÿÍyoêÚ¶Ó,Ɔ/—¶¹qîôFç{”×…Zàn~³þ¡«ÿ°£×àžð&ÑÝc½.¬?À/—·¿òVƒG«ÁÓ¨šÇTm;“Ý U›Ž§¸Y´…êñ›éðkJ5 íþyÕHJjl€‘¾1;\º_ÑA'#u/zmÀ^£g£ ¤¥î |¤cY€M;QÔ8Ǧ››±…xîQ{ÿ+Ø4Èô„Mnù²ÁÓ&ȹ·«ß¹ÿÌn——nd\m¸ ‹ÕÞ–;òUmÇZBNÉÕM°ž„Ühå ×7 q5òœåTöú/áZv ^ÓNßfü=êUóÉÚÆ^5[u×àÈÚ.H¿kjͲ‹ñW;óáw3½÷° èS0 w\vá¿ÁY|Cu€êô‡]ª Évƒo¼; ÙDÄ7Æ-e1Œ™<˜ùD|J§2ƒnß°­˜™A+— ©Ì„²V>”u³e­¤¹†ÊzïÔÅøKùPÖr ÊN”õÞ© ÿ Î…²¶57 Î#6íVüx+¼¡Â$cF‰m KPnÂ^SaoØ {Ó.Šao…{+×`o›•®!„½k€=u1þ>ì-_ƒ½eá,‚}w\vá¿Á¹°·útØKHäÜ*ÌÜÓeÏ (”[3£\ÛeC!Ê[ÆÙåî7QîZ¥¾ÁGyßÔšeã/¶Dyë¾uŒr×j‚\ƒòá¹ìƒ3QîfÑœò F #è¾ø—C;¶ï–»½³}»l(&a|‚v $ðêB‚pMä§.Æ_Æ'§´­„Ó—ý\CHÝ=rÙ…ÿç„”“© &ˆÄf<3ë¶° ï9BNŽÝ‡©îÒ¾^6ã_µ>þÕŠâêZmO*®}Ó€p¥—øW­µ¢¸ºV*®Ã=rÙ…ÿçâ¿™W¡@b92W1+v×ÚDoB;Kß4ð #—\ÅŸ«˜;‹keá¡e¸G.»ðßà\®b&;‹x™=!ƒÓ8I Ê&Þ%s¢îaI'"ÕôxCÏŒ´W˜º"·©,$Þ§sI!jÁ¼èŠ¾Í¬ö å5”Ò7g¾…‰³5 g…©kè»kjͲ‹ñW`a²«&Z˜lla²“…É.-L‹N¤oÎ& “ä}oì•0¶2ö×]»fʆ++¨®Gsv·#õ†sC1ì¹oGrpZƒ½ìH]C{1Ú‘æ.Æ_¾‰ó5;ç©k`ßß#—]øop.ìÅdGº/E°Ï"" CØÄÝh#Ù²¡lÒ7Úp¹f´á20Út !Øäh´™»ùF.׌6\ªp€ÈhÓß#—]øop.ØÔl´e¨HÄÞWrðŠ%1w„{¥¬ºÇ4vÙP ØÆ7%ðfÍ”À›À”Ð5„€m&ˆ6KSÂ<ÀØfÍ”À™ú{ä² ÿ ÎlË&…ÇÀ»7œ]=%ÏcnLEy{!hÚeC‡òM,sÕt÷ë;™Œ £þÉ•‘Ô·6׉€°éN…uy`&Íd˜`1‚ðý€Ä»1BšÝðiÃÑa'²;yådØrŒ™GˆfGŽ¡"ÑßÓø}4þgò9™äða×¢Rs ¯9Ð|ŸÉÐ’÷Pƒ.¯ýÞ -¥h©f Z]aï³+AKÍXº÷Á–cÌÐRr ZJ„cˆZjÆÒ½ÆãLh©É€È±Û`}—Y†w!Ù5b­¹; ¹]6ÔMvsÜdmÅy·à’Oªê”í&Bں眭Übƒ[ا{IÇT[y“ÊW…ǯ¤oÖ„Wî&LÕoÅ÷qÞ†Sáï¡þ'«ûʰÿ9É‘µQr<'æ$ÿ+Bt£Xÿï)fg…n+vO ö#“.ìц#óàᇉd?xíᨂt»zlhω=N£J°PE+@’ú˜ñZð§ÎRc¾a˜v°9á(9²{ºgF5É¢ UE,yz*È€ÃQH£†v¡Ts×h¿mÄŒ¢Ì‰Øˆ‚›"žîò_qM~ÏÈêãáz #´Ù!F€º!¨0±Âì^øý¢Í‘PÍÜ CÎ1®ìƒ‰Ž¦ˆà¤$æºGÞ®~±‚Xô€Ÿ âVÅÃ2(à›É©¢ã¡æ^‰W#¢ZDÙ‹ø9B6¼ÿ€Ð«Á(øµr©6X[ô¢Fj/#u«)ºsŠÇ“XŠD¿HåMp‡ ÷ˆ¨A„ Jî!÷4ÃB–ÔÎݳL9õDÒEÑXxˈUÞÇ\$4ŽD|ä¶"…ôÉ:K*̰Ù`Ę-v/|‘: ç˜/Øßƒé¡èк!Aål†1=2Zœ˜ÒrRôa‚@`ìȈa±#ÚOiKàS¯³L^ˆ; ^ÌÍQ7¤Ò’9¾dl±U’ê ±â.¥5„O*ð ÄYté|°²IÚø_ÍV•„3ĽZb–˜úúç½\ÆÎ¶áÕŒÌz'‡fm‰–ˆ”åt%˜OFĽ ¢œJ†M;u5+Uô5è—H­¢ lX6÷1î!j·ø=i,¦šOÁljì;ïKÌŠH¢ êÔ9ˆÞ“t Ü·çbÂήù„)8ÐðÒíòñ0u}¼ FÍÞÚTq#j­ 6"GCØ5KÌœ;„æV¦Á “SQe?-b¿S_™Ä²‘ 员_Kêùý°ÚA|æ@ÆŒàgFž^]ÑS÷bÈu$—Œpóý<Ęx)ÊY÷í×?vWyÖûÚ¤A¯˜ÐÅt”UNC0ÓÝx€,+Äû*:©z_Çò±o%­bµ¯ÕиùêXN)wišÐâ×hEp˜ªÑŠ5U.!໷“ज़HÕ9z®œ”„Ø¢M”ÂÍ0.E4oÍÀ´I„ãôz¦4_+ÝEº¯À’hQ¤z]0æðx‡BX+÷ÒÅ«é“óY"4îÑi¯ðnžà KÉþDÂꈟwôÒiâAYº˜”Ç‹-?:.96¸PƒH?=&g]OhVmë³û á¼DXi…G9Z"Ë’W‡Úu»T2þ¿Ú Àa¾ÌF’ܳ:"½|;B›%†©[ZØŠ\Þhpù‡“ˆOC®Z¤vLí1¹¾ ÎD–¢¾‚:ö—ãôE¤%äÄHaâ•„¤=‰í»Rnë#ÕÌÕ}3rk0âé®Ýnß@ú8 ~帼àð…k”$¬™©m´O¥\ôpƒzHÇ$‰®ˆ¤½ÐÙJ·whf«~Êñï¢[¢ãF¬¥0¼¼ˆ²%VŽ‚Ù7·¨ÒR8àXºë©—û­fjÏnx¯XhJ§:¬daÚØçîŽJ@Gh½´¹‰ˆñu0¥Ô@¨â6ð˜$þ“f^g¡hhÓÌêa#xr–¿˜´ŽNIˆÑ÷êEÊ9f<Ç¿Y#²º&ÛWÚçû³‹B‹ã;Bé2ª³ž<‰¨CMŽ&4„µl#6Þ‘• [±*+Q醨ù[ç~x/íѡܼ%žovv NÍÈD+ýâ<æó”[yxö³]s¶ÄÏHû™NÇü b›í|u‘"R C¥¯$ñ6Ë}C’˜àHk_†?ÂÒ o Ç(Þµá!øeÁû h_Ó¼mµOÅuÊŠdI®„uÇŸCÒ¢tàW2g¢‹gÔÍC­ll¡XqòÂØ¤ºkM(OESlLÉé‚â‹””Uó<&|ÎþJ»%¡G5åTNMÀÿXøëªgåSï‡q<Œb‘Pó Ì¥!õd<Œ±¾ö*ùîgy²z|ÙµfP)ü/öêåÊÚ¦²´¨ý*ñ%–*5²+)@ˆÀåœì©ƒË’ÜŠŒ]8.å0QŸåE§ lƈ|$ù•î%ÑqËýF5ëŒ2ˆ Ÿ Wa¡pb6¼œ·¨“*ô|"ц‰8V¯w-Âû~‘¢¬Ÿ]#ö¾£æ¨¨Ùö~Ðã~Ôìøµ*jV ðEl/ß FËnDØîEÀ®Mÿ #⵨ëoØ8& àÌ õÊ ‹-po$nMs£*¢2ñnîXQ1„£õ‰ÓŠ~>œS1úä1»rؾn—s mR┪êh6­ÏÌ‹Hɉ•@E}±"¢yÕcSÈu×®4¸Ž¾…,ÙôÒ 4À©sìtNåèýÂYu\¾úàÑéRHBįF|Ÿ¢ÒÍFly”Ø©¥8ò3bè¹ò vó뫵 ¬Ï‰A):A9Ý\rÚ~¼Éi;U2À¶Œ‡´ŽÄWúDΚaªÃwúÊBÂŽ^R‹+}ˆo¹Qf±úËååÞò-Iß…§©Zÿ»`DÄt¨ÞC·Â…Fà+T2®Ä l;Ë©”6/]í‰:ƒé4‹Þ© ßtP4IÝI¡CthqëŸÿzi”^6üóòiƒ‰Õá~ ¹ßAUœµž«8×1Ó?µL\;)GS"±¥=Û©rÁÂWGpò>DjF¡)«YGþ=æ(èc«&³—ÖçöçÙª¦oÖ¹Bût…@ddô‚¹>inB‰[,§„QÎÆT’ŒT;‹?–&Ïü©å$ÚösN=¡5gÖ1×=^)§fÚ…05µ 1¤¤°QÁ4Ã÷/"y.úܤ±µëלuÙÞv]_#¶´GD§ í9ai˜tÆ9^u¤çÇ5}gi]˜ÈŠóAjgª§{|²*£å¶ŠÌ@ îsƒ³$ÃJÔâx•2F`r:KÝC8|ÈZ"`Ò@Iޝ‚ÞŸ@Ox*P*¡zÚƒQˆbá‚G·œžöþÞHe€¢ÂßSÿJÚ„moc®ðÔrìs¢VBðv]gTQí‹tÇ A<{ÕäIéï&´ÕóÓ9(I±>b¡™”äh#鑬kR5Ki?"î£äx,’-9CÈ9rätÌ•IR;0'J"a_xèBMF5ÇsI“·T×ý~:¼i£¹6‚>¢ºq{ÅSk›cµÛ.'ra¸–àéE{#“N¯¨. †?Ï®klc\Xû¤ˆ<¨RÙÑ* I²œuV[E ±ÊæI¢”Ѳ†¡Ðó#'ÂvZ2ì£æî×ÜKt°™d‘žjµ×l.Ç÷jµg߫շ¢ïÀ+ï3ÞôCÆ›æ žuPqÓs¡™a“çB6rÙpšçBsY¹êâëÉy£°—œ$B“Ø+. 1Gv$ñ›!έ;¨XÎéÇГœ+šXD¡Xc¢Œ2ð‰9 4§fä‰ =JK£yÊø¥戌W'Ñþb{QAi¯¢ÄÜ{pÝмÃ*w”o†© DšE2¦fph_?ÊŠÎ[½Ï–) «Ñ:ÕK2?ž(ò&+=+'$G!x|›ükDX%\>¥0IsÐ!޼šl_Ÿï#Î0¢5U>´q¿€9&ÍÕôarvnŒ.þ*åŸ-å}bXh‚"Ïùn”Sí8ñ’Œ  ÜŽ%KÏuÊ  wÅ­ÁA' $tÊqÐ)ÇaGèÚá Klã ìKvÊŽ¯7…ÇçÓú{ó¶ÛI>'̸-wÑй>^>^¿9\õgޱëø×—¯(ÔbÈ›Áæ£ûiÐí•»i¯_°¼ê]%S¾|×¶·vݬ`Õ ° }Óë½re€±”7aWõµŸ™ÑÚ8|Æ‚Ï PÑâ&˜ä^²ò[°·¥-[Þ÷Žœyå ?@ÏŒìeí ‡Þcd/¸gÆ/†y÷qn= ®û·h¸öÉõµ7ž¿6ˆÑ¬5¢^¿÷à¬a Ex{ÈojLˇù¤~\¾H_üHÉI¯/ÿ*Q× endstream endobj 1474 0 obj 5923 endobj 1478 0 obj [18 /XYZ 32.1599999 785.299999 0] endobj 1479 0 obj [18 /XYZ 32.1599999 672.980000 0] endobj 1480 0 obj [18 /XYZ 32.1599999 333.139999 0] endobj 1481 0 obj [18 /XYZ 40.7999999 174.740000 0] endobj 1482 0 obj [18 /XYZ 32.1599999 611.539999 0] endobj 1483 0 obj [18 /XYZ 40.7999999 120.980000 0] endobj 1484 0 obj [18 /XYZ 32.1599999 271.699999 0] endobj 1485 0 obj [18 /XYZ 32.1599999 550.099999 0] endobj 1486 0 obj [18 /XYZ 32.1599999 201.620000 0] endobj 1487 0 obj [18 /XYZ 32.1599999 385.939999 0] endobj 1488 0 obj [18 /XYZ 40.7999999 174.740000 0] endobj 1489 0 obj [18 /XYZ 40.7999999 120.980000 0] endobj 1490 0 obj [18 /XYZ 33.1199999 384.019999 0] endobj 1491 0 obj [18 /XYZ 33.1199999 199.699999 0] endobj 1492 0 obj [18 /XYZ 33.1199999 331.219999 0] endobj 1493 0 obj [18 /XYZ 33.1199999 269.779999 0] endobj 1494 0 obj [18 /XYZ 33.1199999 783.379999 0] endobj 1495 0 obj [18 /XYZ 33.1199999 671.059999 0] endobj 1496 0 obj [18 /XYZ 33.1199999 609.619999 0] endobj 1497 0 obj [18 /XYZ 33.1199999 548.179999 0] endobj 1498 0 obj << /Type /Annot /Subtype /Link /Rect [472.799999 499.219999 512.159999 506.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes >> endobj 1499 0 obj << /Type /Annot /Subtype /Link /Rect [123.359999 147.859999 177.119999 155.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 1500 0 obj << /Type /Annot /Subtype /Link /Rect [119.520000 289.939999 177.120000 297.619999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/donate.html) >> >> endobj 1501 0 obj << /Type /Annot /Subtype /Link /Rect [181.919999 228.499999 252 236.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 1502 0 obj << /Type /Annot /Subtype /Link /Rect [320.159999 228.499999 375.839999 236.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 1503 0 obj << /Type /Annot /Subtype /Link /Rect [167.519999 85.4599999 212.639999 93.1399999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://swig.org/svn.html) >> >> endobj 1504 0 obj << /Type /Annot /Subtype /Link /Rect [91.6800000 69.1399999 127.200000 76.8199999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/make/) >> >> endobj 1477 0 obj << /Type /Page /Parent 2 0 R /Contents 1505 0 R /Resources 1507 0 R /Annots 1508 0 R /MediaBox [0 0 595 842] >> endobj 1507 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 1508 0 obj [ 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R ] endobj 1505 0 obj << /Length 1506 0 R /Filter /FlateDecode >> stream xœí]KÜÈ ¾Ï¯ès€íU•Þ@`=ã CÃrr¼Ù‹ÝEœò÷£n©{ZE±ªÈ"KROÛ€gÜjIõ`ñù‘üþŸÿ~øçß?þ÷áëôóùóSq,šbüs8ýýîöÛK;þÚvõÑö§?‡¯¿>};|{úôôiø÷Û“iÎ7N?†‹—WŒüï×ßž¾_þ4~òùùÏÃoÿ;ØÃŸ†ÿý|øë߆?NÏ;}á×§®oN¿ü2þb¬±ÝðŸÛßNÿõô—ß~†ÐŸ{ú÷;kº²¨’†ñíz«9ÿ½½y×°T­íºƒ1vd=¬ÅþñôÓð¬ë Ž]3ýAxO7¼§´vxÏð«ø’ºnô_Òt•þK:ƒ/W_Ó6U[Äîsk‡'ömyèÛæÐ×à‰€Ôbžc’ÓM+ð˜óhLÊœ†5n}ÏÛÒÎÔµ:Ýt¶Éð’²/õ_R—½ó’O<Ó¾ñÌož?|yúþuFuøòÓ@g3þø2ÐŒÞÞ–¦<|ùñðû¢0?üáðåç§áÈÓ'E{þ¤¹~`+ð•ÞùŠù0~¥:6ucë³d›®Ì³2îSá@ð×|<_©!_ñ6|$ø¾‚é¼\YPkfC*@ßóab"…q˜~¿Þ]G|q©UÑ÷zX~@ üÀÅÂQäþ§…˜±ÿ]rø‘™Î}Xü™¯GüàƒæˆÂ¶È ~¾‚ì²á=èà^|JúXq& ™¾À8§„ ØT<½P‹ûо†(¢œÄ«Iø>BÂÑà܇à1>4|ÛªÒ] u&ß–äŒÉÛQ°uÇ®/°ãxyõ÷ØÜE¥å cC§é¡aœá'ñChZe.3®­ÑÕaH/ÏnàŒ’#àÂ[)iˆ ‘ÂEá@r¸aÑ»KÑË÷Ú(ò¯²©ç ,|À *®‡ìÐ%µ6´sž•d¼/ÌYN­ù IÕ%Ȱæ¡)ð:Ž?  ”“²ì|Ž˜Ãïah·T⨰7~ÃÇý²9áá—×WŠØsüÄSüQø®×àg ¥ŸH0VYÚ‹€] tªÅMg}Ùs"8'0ÈíG¾tñ(&€º$"Üß›Bª,÷5X_\ÌŽ"á©’á€<*½¾ñÙ—a}§šóÎUÑò{ç ¾o;˜Ã%âE+GµÞ”ÏVýü R˜Š]K<—Â:ѧ÷Ž ”©/Ï»òJUPÐ DðrxÆ‚lp|6¸{]ô¸{)lGØ>ÚŽðh–"aJ”É…½íÁWœ9‚fÔ¨)®LŽäРÊé‘Àbˆ'h}ùÓ–å\þÜ#†àCQ±e¬ !À ¤8p‡Aÿ‡hÀÊC&èòE?¤ Œ”åž9„«n™VÆ$¨.„õ¹,ýI -D•àÄKCúµOwh)’›éë9½=b¤òô<œ”"†¾nD/· À3FB¨†@t*ê Ku`˜×œs‡c.¹`÷›–QMkˆ@¼aPŽŸcˆB²!8µáÄ‚Éó¤¯W×Àg… '%P†k7ÈÕ|½,çR®4 #SþÅÁ'!de 8QN—áØ™,q†„coÈÞÈ-ê`Ê*—„§–2h‚¹®®DT]3#2ÞIN›É(‘•˜¢‘B¹„Ç0NLž#( 3œ!3¼ô"A¾”œ$È ÀR6‰óý\¡g¡Áºò›";NĈ°¾$M —o€ªHèžÁ(¾ÿ Yg#"j¢hi‚èf9º‚%P•0º<´ÞG8z¡¯ê[­M‰ÎCðÌò{oÖ¨ËßæÙc g¤¬cÑsâƒÜæ§è«„ÌygJ„ÚÁ¨Tã0–Í èȲ¬þ‘¹á*Gž“'›’ LOpýdvp¦àtXü‘P9@õ¢¨LáøŠõeÊÎVF]Ç»î8dÏ÷± @D’kB­£lÞØwC¤‰?D%Ù”cMŠøÄe‹Æ%à›)!^‚DÄ(õÿ…™y&à@Ö·€»kÔ~ÃAlŒ;´éªé Þ宅ê¾"ßfN1ëWK è0~Ÿ"¢Š,”à©”ÈÈYà[dò+ Qa‰:ˆ,ß/§J'þ ØcB ËSksZÁœ' c ‰g=S”óÓ¿:lS¶ŽÑ­³rãñ?VèN$œöK£ˆ3‚´–Ê:ÆÚvõZHŽL%úÀÊà Š£Ê¢’’œHQlMüé[}\@B¦<¢ú>9ãÌ#¥,­D†+SÀAþlÏ]­›è§ì’ƒÓûÛåÔÕ¥´rL»œ|Åm—s)S×Úå˜W÷±ÓŠÝ~2.*©ÕÍäw\z#|>ÚâþI3J°P 7·Ø`S"t´¥¡¯ÞŽzZÒþòfÖ–yúÁ§d’4u1(}„9à;#ƒÉd$9 `JÚ!=X´\À®ƒ«Û‘cI¾ÍL)èIõwVËÍJ°à(©ç–Ç1Y%±[hGTµÍ\Š$y@\·hÇ)aEsÁã'.#¢Rx:ÿC7™3½dëTå‚@EÔÍVÑæX™±¡Làò¢“ïKwc¹8VÍ@iiBHi<”Ð~B¥FD¬l­L=Ùtä<Ú¡º)Üg宋$¢ð0[fÉ™“L’QávQ%z¾N}EJú¿ˆð%$¢Jª,„8ÓÉ+U7ç',F¬Ô="”ðŸ¨Ú¶š7B¬ÔP¼w¥^’ï/bmð LI¼¤y‰š,)•"¶EïLíH’<]kdz5ìÁ˜VÕHYf–¤â›««o™Ù6¸Ç"ŽØ$ (©Ñˆ°‚£o%ˆl—àLØ‘æ­gsv¤_qÁÓ",`G XÂNà‚öB»øcq°|,¼¦ŽØ·7A(޵˜0S¼bWðè =ƒÄÁ6ª#‚MÁ'ôŽ(­¹*7[RËèCÊaË- ¿ŒEJuàœ•pùÊt]ѽUp¢ÕË´âuiL îM!Øò¨@øPã{Á Ò†s)ðµ‰Ç³S”JB­}HmV¾aŸµHx"7¨S¯X¤AŠ¡_…Ý®u«–mR!Ò­k×+½«W}+±¼¸E}F¢Þ,¥ÖŒ™‚›-«µZpå˜FD‘®µ³ˆr*:ä(hYªmælcO˜.OÕÿ{E î!V(b8ªXŸ:Z€÷µE'.')R"_ŒbϤôË”ˆwSZ¼ëGèÚ¹pÒnEh –¹I:¥G‚ã9W)kÂáäpLŽëZ²_R~Øù¦ }#¹®ƒÉ©(SÖG¶‹‡ÊiÅé|=m)ä#ÔìŽ^÷YÅó¨Œsì„»^ìÓ—¢â1`ˆ‘`ŸqŒjS ˜r\©ü Z@và%ipÔ ¡X àÀ#Öb-:‘*6¦FŸßÓ Wð{бÙLymݵÖÑf6Úy(„¯Ð세D¼¹C‘­:>‚·5E/ÌdIG`V*”IÑŒEœy„¡í1j³¥F49zÓ9,]Âs cTIèê„!ËØ² ˆâæ !A"ê@Ù.ΦêBeª‘4‹”$§@x8«Æ{\Övy)ÕðL)•Áq¨† >ÝK.·7t"ZdÖ~,9ÿ&‘Qì #DS•8H›^]AM¾æâ±yÔ‡@½±cMçpÊ©âÂ8ÐB0ø÷Ø>X¡‰êê9ëTÒÓV+A&‚ˆ ¦KQÚÒ'ôþËÝð—³âuP„c¦¸L8ý@ŠÏfüJ”ÚÆøzŠÂÇpP犒‹PhÙ›•âî«ÄN;Ó:š8ެI(ÃÝß.B9©¹Äàw©>‰T“£+7úFkW¢D}ç¾,íÒ•*=Y©w„ü=QÆ왢èÝ¥Ày±?anÛgB=÷fs¨ç­ëðbñNJŠpZ=Ëð¾S€n&*0ãtmHq$ígNѯ•ÃïÒ!¢Éô;ãpý‡©™Ýå’p$¶ãóÙuoŽÍ—üY!! Ê_°¯–ãtjˆ\jxǦ5s9€O×;+tÏñòF$smØ€xÍ3ܹ®9ƒ·–„‡Ê™ˆxU¼?6Oya}®¬ÑaǯNRÔFÇ·µaý.q ªD´ ]|~''“Rm)Þ{Žc=ätšœNФU+¶·s&K©uÏý(5>FCNüE)Ê9·BBì%r»ájˆ¥u^H |cªØâûp³¸·€ÀÀª ]oì ß4Ž‘P%4¨è¶“IÊÌ$™<(l@.®8…¾$¹ªFßHoý|Ï7ÁA)¼)’ÿ â9I"‹x]tÃôÁ¥Ñ7çê’1}öýÄÅ(ž,OÉŠ×ÇDúœ>*ú‘<ÀZЇ¬³Taðxr÷5ÍÜMS9<† JIt#˜5Àÿ#ƒ–1$ý?ïærÆÈ‰#B5CÔ4 ø³<‹ƒŠËê£0UÙa˜Ñ“s¾Èv®J÷ÇL¡Ç®L:õÒ• ½R W zÅ¢WJôÊ3z彂Ïô#c>ø¨_±+º¢]7‹º¢–sO͸§a<­Îwd¬S9zi8-cá;ô¢W ºTø{ð§èq.ð#ÃÎ6 ü˜¡£¶è¡µ(KóŒ±Ö…èxÞƒ®Nt‹¯5Î óÁ)¾Èx4«*(Í<“÷Ÿ\H6j; º¢ï¦7z-èêI+‰QótÌì*¼9¨ƒŒC1·¿]¯É.ó~¶*á5™:OD¬x^L„jü¸œ3j¤Ÿ±üx+R‘a-Çìûk_ö'FP¡’t½' ôÀ¥a‹8ŠŸD?Æqæj.`ÞK´?Sg£ÎTŽ—ÔÛÙ~ÅmûSN+ ;¯×ƒãöBêxî±îP<½‰Ð§€áO.Ï…~@°kÞÓÇ3ì<¥Ÿ;Ó+«/¼t¿Z8Røœ×áåÐ8‹€ g+‹ÍŠ4ETkÞåfè¦Nâbë5â…>® ëˆÏÜó4tí=ŠzÀEv%jE¢çk–b[FdîfImW#umçrd½æP›óO%õ¿\ãH)w™ÕØg?ã”ú—¢õ…`ë‚°ŒW€Ën›DB™-N·¿–’J£†í•sR)4d±¥YŽ)FYñèOsS7mÑçž$w`Uí)û`o{boB!åuxO¤wÍ’5Aç½ËS÷I¼*õ|RúRÀöxÂBæFH;Ýâ=ñ'Bg¼'Ó¦Š>»ßp?gp€­_­(\®@—­ ®…¯tà;š¾C_Ó- ðHѸ¸ ‘¨ÉM½.Ã#R¹âNe‘û¬m¯fTOÀaÃSPƒ÷Rºâ„³;°5•eÈŽ3)Á©›ÐŒU W¶e—$"5)³ý.fi‡dÂVŠ ‰¯én«:—髸Ø9½Q! ¶cûõYCáv„8A0ô¥}ŠSJ“‹³Y=`ɉÛ sB9d‘¾u™õFÁÛJ‚¢Cñkg€s:ƒ¢–Ä¢Y´pB$³ïƒâ4%sC}»ÒäG]$œ¶‹O§ç'Îw ¨¨ú͹;'™Þ8ôö¯pˆ˜Ÿw]W/ÜÀè´§õï/ ŒJco?X£Ñis¢\hJÅ!B–TBŒ8S;eŽ’–âçE²¨e®ì> •ZUä9R®Wîã„9ÈEµ¥¦®æLŠRbŒáaIxú‹öRˆŠ`î¦8cvä% û-×b¬z„u3øN}•"N‰u ~}5$½ÓœSÍ.loeЋê2ªµÎ<¶ãÚCsèvÅ °¾•{†Ç0~3 …C¦è8ÿ¼ˆûŸ õ¬ª ä²¢õTTv§ŒÃYèɳEm¾ ÕßRkµºhqÙÍ<ÚíæÑn TR ?‰‹Ç㯡b‚ îí„Ù‚Út⬎U-;§Ø' «ºp“‹UŠ ›·O.lvoú|à:UpŽ+µ‚>}Èke¯UJQ©ãaä’3@Ê OÄ—“KÁò,pXE|{o ¬R¥x[.¿yn[JÆXSZyl§oiø”ãé&, ƒÖ"º¥ãŠÁS áˆPµeì\B°šLªNNeo‘›ì«¥K¼U@…,Á•®ìñSiî-áp8U¤—a«ÃˆU‘†y ¶ ž±&M¤ì¹3óè)Lð2HÄõ$¶4¢6ÒÊžv}óZ¤• ¥gå³ÒK8nLQÀ¢N@bµâé›Ã뉄œ<à$îŠp©órã›KÍQ8¾w‚mš¾Wcr’ö“Êñ £²Ods¢šö‚Ê®šööƒ5PÙ§!ÌIY4¨ò^õ­ã\†×½Cm;òŠ8†8íÑ)îG™FyÑi'f¼¨µÍÚ¼è4„u¤$“†=÷œÒ=²¾¿rJ] ]…L‘]F»l&€¿GeqvY9d…Îõ}ï ‰Æ=T5’™P€ ªŠNªyëûVš*HñaŒK-Ç7÷‹xmG’¯SÊ7¥ )'ˆÀà6² ¤¡XòLºš§ž :U0^Ž$0(RÒÉLJA?„hžº +ûfÎT)-×*Ö8‰AŠˆr·‡påU}@ÉO²ý²]w¢‰;s`…xMQÁ· Jù£ ¹I+*Š›nì?£Ã3ªßÉ h$X¥-Á ÆÊHön±üN¹­¾™ÛYT<ˆ‹S$ƒ>ÐIÚn z‚ÖH‰›†Ð8ÉJØD)e´#”Ôøaú¢ÈvÍüœqT…2¨:‹bâRàRê ½ÁtÏ{ãµOØ\]gò‘)?­.¯odå§½€›Ü„²âÒŠ«¿”§†6÷$‰Y0¸f:-°»~>#Ú½a!í­ÛOÓ/r­3ÓªÛv¾Yc­½9-_˜m[;Wð{¦zÚD$ ÷Lge˜¢³ÊõÑ‚&ÏýG°‹±+ÓÎ,ŒÉ^©qÌMÔØKDM\š;gÔè{&lŽåù4@z]Ú±~>t¦øZË¿ªÜ˜‹5‰–Øb©WÎC$’÷RŒ©¤n&¢‘5Icd¥ÊµÝœz=º=Á™ ¦HP»Š'6"TŸ#$ò¦ÃNë}Zîú­PmqûÁ:…jFq`n© LY¶ÎD®fZw R›6šˆ°²u×U¸äŸh&êvJ½„wiG¬\¶=(á\‚UŒ/b$šÈœä\F¿ \Cž£­0…ù5#@cŠý› )²½ëHP”EEå+ÜÄ„²*,îB†‡¾)\Úàòˆ¤‰±ê¼¥†gˆ¢Õ!¹"ˆl‚m.Ñç=âäs€—{^5O3ÂÔ[çLÆ+ œø=Gk–è;]ö‰¥˜ÖvyŽ,Ã̤]ÇWˆè§³Z¹ù…,å8<Í8ÝX}µ€—‚V. ÍRSDœûœ‚ªê©Z¢ˆz-asˆ–Ž'QgXœ¬N^ŒNj¤NÈH´lC„(ÚN˜wkÇË[ön}e5›éÕ&ÃSémŸ(àÏ-‘\ñI‘ ÌXRä ’\vñxE¨~&¬hžÀ²E½é=˜“!ˆó!ªš®¿¼q}D~ŠDš4­%\ŽDB1=åGúX¨bX¨S]I¨l m/d-ÜzsþûN(w8“ÝðR·ù¾7k‡Tâå¦3sV¦!î‹/Áa¡E TÎ×°еŠLUvX_ƒÚ8ôÔ]$}méJ^ù»bŸÑ+ø{Zôž’qÏ ýžÂ¢W>¢WЙzÞƒ¯›z¡êÖTs’H)€GI6cTÂ#$¬1dPDÏ¥„"×:ñôUR÷­C0k5V·(òŒÐ¤RGRêJJÜàX<¸‹]¢@¸/â$”õ󪦫*ÂÕĤÄÑ•A~36 eùÌ[¤°UDhýݧ¼i"¸šÆ9·{¯Šm{‡MúB·fÔ\$îâÀ;>Ã#…à½Â d§µ;-]sM ëêÛVI †0§Ð *T¦>¦„Ü—>LJ²{Œ1Þ,ñj…ä…:`} ŽÓ‘£ d‚´í%rWèòÐmLˆàÆ%Ôö’¨·j:siçÛvùŒ^)£ƒdsɈäáavÃäºâÂûmÑÜ~°ï? a¾âú ‘qÎÜ~\#È2Ùžã"—(»Ãß÷Ͻì‹Ãôã믤óss4?yÉÙ{k4ÒÌ0ÁÅÂɦ9ŽH‹²¨æËÙ4Çf™g÷ÕìÉÈòl{l—ËK¶ WF¢+Ë£í%]]›qß\r\zO‡ÞÓ£÷ŒDÐÚ£-Î —–ž6Rßí'/èw'Þ°0ÃW잉},]1Ø<¦óE»gÚ1ÊÜoñ TwúÝÖæZý©¢ïöÄH»m^1ºž°JK”ˆïã‹î-NCø>@‰žï¢tà™á³Ènw]cÆ·ÆnûœÏ òØÃ§§ÿ°`9 endstream endobj 1506 0 obj 6898 endobj 1510 0 obj [19 /XYZ 40.7999999 398.419999 0] endobj 1511 0 obj [19 /XYZ 40.7999999 286.099999 0] endobj 1512 0 obj [19 /XYZ 40.7999999 398.419999 0] endobj 1513 0 obj [19 /XYZ 40.7999999 286.099999 0] endobj 1514 0 obj << /Type /Annot /Subtype /Link /Rect [295.199999 458.899999 346.079999 466.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 1515 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 777.620000 66.7199999 785.299999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org/) >> >> endobj 1516 0 obj << /Type /Annot /Subtype /Link /Rect [203.039999 408.019999 267.360000 415.699999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1517 0 obj << /Type /Annot /Subtype /Link /Rect [177.119999 312.019999 298.079999 319.699999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-BCIHJBBF) >> >> endobj 1509 0 obj << /Type /Page /Parent 2 0 R /Contents 1518 0 R /Resources 1520 0 R /Annots 1521 0 R /MediaBox [0 0 595 842] >> endobj 1520 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1521 0 obj [ 1514 0 R 1515 0 R 1516 0 R 1517 0 R ] endobj 1518 0 obj << /Length 1519 0 R /Filter /FlateDecode >> stream xœí]K¯ÛJrÞëWh=Àè²»ù‚×Çv€,6Å ‹À“É`p=ˆ3‹üýP"u$²UÝ]¯nRW6às,Šd?ªë]_ýò/_ÿóøßÿ8þòöõŽßçŸo_Õ©j«éÏñü÷÷Øþäìôk×7';œÿ¿ÿ8ü<þ<|9|ÿýy0íåÆùÇxñúŠéÿøþ÷Ã/ÓËÓ'_ßþmüíÿŽöø¯ãÿþvüÓŒ?þ¡¿<÷üï­«jgYÃøù~«¹ü½¿x×y©úª>cÇA6ãZüïþ2>ë}§¾µ]ÝTCþžðžÎŽ/ªþ8tíqh¼·xSMyŽa=f¨*+ð˜Ëh gN¦ª»Ðsäv`¨:'±ïÏaî€i;‘G#°ðswÀvæ2å¦ãÍùúæÒ9+²çÑΜæŸ#¸ƒDvàúæÒ ]#ò˜q4;>Gl\eúV`nÏa-«l- ¦ÑðwÀΗ=Áxz‚Yè ö¦'ü ÜøáÛá—ÏÃY%úö—ñÒE¯š~|ûq¨Ïoï{Ó¿ýùøO£ô4ÿ|üö·CEWk›‹6]©>^®˜êÔv¦ïšÛgÀ+Ýåʧoã„oã7¾žS_t3œš³z7ª\‹ÿÿvøŠR À…©Ò¦_-Lõv™J}[inýí{ù ;Uƒëšê~éÀ+¦]?¤¿|Оìe%ïâ  ž>8ÕÓCï¾ê=u}¯ý”>xï½ ø^oIàÙ€ƒ7ðbuà=àÌÒ{õ¾áÍïmIßòdh]¿: Ÿ×cXÒTëoL›ÝŒæSo–gÚ›2¸aþ{ {Ø™‡ØëM™èÞ_,ºä'%˜­ÓÄ›ëšÜ®ü nÛ‡ésjêvÁpk·~1çô®ï5Ãzõ`®Ó¼}ðÐH7ëý ìe°Ñ%€‡x*8÷¼~O”MÙ|*Líu”À#ë* ¯”Y¡Ò§Ó4…5€OóYEˆ}x|Þ%RW™•fò©Ýy›KkÞ3ÖtØu-©¨Èék›6²Fég`æ· °Åt-5pœ¼íŠŠÑÀϦÏ6Ài‘$,´à§¥/_‚Â’ÎA} ï­xúÃ~o’P‘¥ÎF¸kã4ïLSƒ Á¹ýEwÒN—vè–KK±.)öL€äÓ¥EUFH¶Àö¯¥qÜ®°“ðÀ& P3lmFmŽèëuÞX‚ŒÀHãô@( þSÓ¹kÀðdAu&íƒ;‰h¾Äù(AZÞiù3Åñm=„’ ÛÎ?„ï ¡ AQî4¶_ O‘ó-žß»†…7öb€ÁV{t×(ŠÆ ’Éú¬×5újÀð½8àUµ ‹-üøºƒ†/¹@m ô c–á£h=ºN±ÍÆÐå©\³²tNؘäÔ·}›¯Z G ÒÕÈëzû p>ñ<+àÛÊë`õ‡Uêéö4íQæ=¹c—ä@„8qó„@bióSGõÄX ˆiÁ¬Š¢ÓÃÓñL†i²öº_òvŠˆ”ô·¤àµû†t¼9ÊrzxS$%tO¢ADCàÎðóx÷úš![ ³¡é_‡å)ÁƒY¡ÑWóúkÐØµ tÜl¨!º¯,º ç3Á‹Aºã#ÁhHžsÅP¥ãVK¢(çRâGQîX’bl¦v=”s±¼‡Ú,ww85€£ýÁ•ª¯4Ð;€÷|GЃWÀ{*ø=¿‚cƒŸöŽ@ÌÙ߬¶âlÖGðÊ'芫¶0ínØÚ´q#)¦ë ¾bñó©Àu›¯hëPCåÜuAïzBl)ÝT Äa%#=-“¿”IëØ¹²†pï*ш‘¹î~×á&MÊÀãÓ5 @’;…>¢>êÍäí*URñc=š¼ÜôKf¾/³KÎŒ°çãâ’“ +Jx5݉"èò+%¢dÖ‡¢t‹ó|s>=#S+“Në$ꤸ—Ó÷“º*)WuËèÚ†};<4,™õà•ÊWb¿3ªçéu·ÚñÌbD@N”ÆÎ’.Iͦjc—~¹·t“€êv¹ìq#N>cÉP8éÔ‹·JÂ^zx$ù\é޳€_®aÎÙA­Û®¥Ø£+°»¤ƒÙ.CÑìæ…g Dà(vóÂÎ\Ñ™Rh^î<¶À©‡i§ÏÇmÃaƒ; º ¦®·6íWÐt1Ã{âÊtyà›BSÇ´’$Ÿ›JÜÿɬ~^•D)­€A¦á}ð&kÍ’°w­.i"p Ãr¡ž‡ã/÷GÏ‘=„€º(XzS»zI ˜,GAÜÀ ñÂÏÉ'°Æ·jìjgŽà;q82>¬Îh“DÓT1ž±yŸóí©Í|dOsªnhDшd ˜™R'H Å«¤p&€Y´0áH¤hUå~ChŠ ¥¿À€Þ˘çRÓ¤O© ƒ@br¦êGÄà÷`HDk¤¼.DŠ¥Ú«[ùÖtÑÓ´½’[Ž@€fÊT+4ØæšO× ±*MAæpñ€L#\ Ã;°6u²˜KU/½^ÁIdk¬2•7§KO%¹Zõñ˜úÚçÒF8Ùò²¥¢"YÞ•ã/éaiíR"`ÍrEˆÀ .ä_‚†Ph6p==W{ŸÕ­á×”%ýJ˜PW;ÈÀÑQBf‚Ooz”cLãM‰ðað @½°ß^ÖG¼^FÎÐüs†ðáµlåJO¿Xzîæ5!KŠÄ ‰ÚL E5á…1ÃG5³e'sÒ¼ 3aE>æº~ÉÈ’D TÉCSä£7Jäb>‰“‚“™¸‡VR¢Ð!eOăc/Oüsyâ)ÙW9RMÛ•´ÍËÀ˜›EB.ÂïÔzY”’®9%tó—DLžŸ¾1:Ôñ•TrDü" ”À§ª’‘î%š3¤ä0}ëÆ6Íêdì<£A3,í¾O•[ ;NàVL{ (ŒCèÉópIM¡;ßg5-MåTã!ô‰t•M_¨tÆ,…Š™VÔÔ×ó•0#DëælU±pJÈ ‹\R\KÝàf·2H)§pb)ŠHÈߘ)œ»¢KÚ•v72A~ ƒÓ^•ɘ­Í;`,(—e²5Ò™Ž§ÐÅ?ôË%åô¨K?ãºåþ¼²[†˜VBnGûC¸Ôà°DûAJ¾&&—Œ O‘ +(~j•b¥Ü‰v”ÒFŽép‹P Èâö¼Ó¥QtHpMø|’’ ›Á®äŽ@A´û¡Ø x5I[›Ð!Ó“QÙý‘îQ£„9p¢bŽdº‡"0óRqúb9¥éîxÊÒ#\lˆªo‘TÙ´|xDpR¦WÌëä=R4-“sé˜×s¦o;ÿ;zqBA"¡]ÑdC»õPÝÖ[œìs$|Å©2·²„è&‡(ÓÀ ëŠ8ÑU4öÒ^&M®_×K¶¿'?VùꜺ½ö„(¦àŠ@ñj´ÝR ²ˆÖŒHÒ-ÎË©Ü_ƒLçÆíÙÊ•H®RJ™E ×ëîÛžDFYÛÕK™¡³ýJ€»¢©â¹•Ûô&Dá‹"¹uˆ°™wÀ£.øìy<"þE‘„~ÝX~‚K€SÜ?uÀ¾kÒÓ(~.D\”'±H~V=âÎ0Ù“¯|ëuÙ%H?“Ù,ÖþÝu &ø–,¯EòBÀœ«û9ÌB$*%8%B: 8S%z@Qñ‚µ«J2’±É#h€UH@09(ö%ñù\o–­¼^ŒØuD.¦<†hÝ8"‚³ŸZ¬ ©ÞÓ¢YÐâôIL¯µvEÄ`©Gq㎓ׂéWy1©¨ãA1¡H¶[Á˜iÍ’ˆrמ NSjG€ K‹]ûS^qþ”™KäçrÇ6îê§W®o¯ï ¤ûæéÔ£¡Ô´7Ëiúsêûª;¶Ýå§1ýåÓñƒöòÅów§¾Æï3ؾ7×ïÔ‹GÔ÷/¿>ýß]n:®n¶ëØóËAŒß–/øëáôpè¦íßÓ83cç®E)‡ÊH!æd’ɶîKÇXÁd°ÁÆÁTK(+ ßb  2ÕD³-9ê@èºnWlñêAtù›g)é„À½ü}ùÀn‚™Â÷m-¤™í›Û†0Š5dòÙʂ۴f-¸ ú¤}(U¯VŒ!îøðÕ.~Lá5RÉQIÈ@Ô`ƒG;Âͬæ¶&®t·–\œôüb.kÛµ–¾…$6/ˆRÈÆôéôm`êiúiñ$Ûú÷††›‡´ÖnòÀ*EÝSf%–&*zëâ_’RDµ¹[å½Äf”0’ †Ý&•°æÎ­qm½ÚåRrWááIãg¾ÇSiÜäŸí‡«Cx\…ûΩ4:{~ÑrcÜ Añù®¦7cðæ›;uè<„¥H \Œòðw^áÖv×7¾›šÕôgMkõ©kVWà{ÌGüÓnX²Þ=t›vÝt§Á.‘ŒŸö6³ÚCav3“°ë¤¢™¿›ê4]¸»bfÆë.lå¡“À[a¦s·f`Î@ï ¬Árª¯¹P·{O«ç™ºS·N\ÔiÒt+¢¤l¸¸ðVÁÄbZpðøiðÀ™ȨÒV°¦èfÛÖK‚ÚT’"kÁ jEkûa N[Nö§ú7j¼&øÜÖAá‚üx(I¢0ŸR»æ‡ƒîp„ÌðHÍPäÈ&=+Ö5ÐC8&¥¿±“q>óD¡Kg ÑChàšœ}X³ö=¹Aʘ¾ Gƒï¯ó¸"9Ê•ž¤FVÄ˪­†Éú”È2%i*àËñm“‘;"P›lõ:X·’D¢øÙ"ñOßÛDA‹”€C¤²ÉtGÈÞšÎÞd-§Í!Lv²u8ZW¼K]4¯Ž¥«§×ÇÉÂÿd‚ÐÞ ˆ2Œfߢ¸æ’ÒšÈÝŠ“ytP ¶#wËÛÝ‹öÕx&„D–0ŸI]Ç8§+ÎcÝ8Å€ˆ¶ëdÕ³3Ð.ªÖ‰@w¨¹hƒæî^úYr¢$¯hæÖ$D$âsè±;€iÖ"rÕMŠïÕラsŽ1&é—‚††È¥" þQ¼J”6ˆðQ”íM©ÛeáœáèòÉHK µ¯IK`ª†“d•·ò¢n¯Àz2ªñuEš>nã–’‘:€)^F”-pêSs5ÅÜLÁ ^°ëÛ®®Ž“Nj¹°z­þ®áob|Åò➢Æ¢¢Äw)­”`5N¤{p\ýAÄÖ÷q7fÉdsî0Âì@Á?‚u‰ò;íÞþd¯lÑ#’ýŠÂ1­¶ö$]GÇÔÁ"¼béÄX×R¼'„óЭ”! £Àˆ ŸÁ+ F ŒDbàÀ!ð{>‚OÑKH$?#€Ÿ’cï{[§î=Œ–ÀëCó&`|F¿[§Š–L/ð•þŽbÕ;f›‘ÿ-é¨n@FÑ;–V¤oC6„ž ¤ìo†S”ÒK3hŠ ϾJÇPÒÖˆ$6[!AòÊbr(K¢ vuHEÃK°7Ös”MzŽS^"2¯ÜxˆÅ0s' è¸ ‹¹Ôví«ÜÐfžÖìyÎéÐç¤Ó¥[e¤/µº aí&µ^……¨ø §>+½©Aà©ðÙ(•'7ÐÒƒ>w@¤<¨àgË”í®3ž£–2w)£ÈC0éߥ…¹ÓŸZm'”)™c®]ž„ܽ@H=‹Ò»Ù‚bŒ` +E¸ô6%ý¤'€§J€÷bLÕ86Doñ‚˜]!Ø#"Q*Ý”©ù¤”¡`|Š7ÙEçö)òö¶V¼‘=(› ™Î/ó4êØLi¦ï ¥{'Ìü†b}{•5õ´äö4í+Q±%˜‹¸ O§Tú¢»W¾Ò‹|Xß¶ìßÁøaŸ¯JWFLj5ÁEbC%»dN˜°·ý`81Úde·Î @ …ŠŒZTLü˜áïÐðè•A7fIÔˆx´Lé…¨S;aŒ’Z ED¼;èñ¹Å;Ü·ó¹ä|¼9wæì†êŠÞ\âß?(ÞL-î$S&ݤ·.J "PÿÂQàï:Éý .ÛÜ ­>y¹6°TNûʵ“‚?F¶*‹ ¡èsÔ†Á0 “…lÈŒ¢¹§F¢fRI0‘3ØìB&))þ”Ò˜t©rvZ´’“ÐÁʶbñbV²]$ž@(>ÁlŠDŒÓÂOް´DËqa o›ç‰EµvÚ¼n¶Œëk&Åœ­`*/§Ù]ÈGk¥?‚Wžì?1®_n¬Æc< 5­| ¡tJe{J\JûHçľ~Ààâ¾’#éØJÐs ðÉ*£j;(³_B-Ty«Î6ŒyÏa¬ä-`êsrœ(~Ĥ»m)Ñ4 +cÔ{xаh[å=ešÈäN ,e‚ä³÷ôµaµ™c `ž*[»×3ÀáàRlŒâ—ô…%pT5¥Kç–â㢷[ÂÕ»•Ða GQŽÖ)£†—ï -Q×ðˆxÖ´.¼¨G¸^Â3| úƒ®«ãTÁV"yaà…%Ü£ U$juÂzhƪ™=aû¥’aÝ:ØAø³XÄ ô _3^„ì£,P¤"¢ †‚´Ž`Á¢aÉLIxå#yÏ•ùŸÐwÞ»…R¼J!¼–(Ù^\‘o¹ ÃîŽqQÀ@( >¥™“°sƒ mи»ÝXà`”S* W¹=¿”޲œN°0þfŠ{<”ÂÞa—BžØ¢¦mP„®[‰„t¼c¤fWéþ…€u€¨0‰æå$øSrƒ®Á瘂@#BøŸ»/D\.'@4x@tØÍØ­ßÃì`¾_öZTå*) ºW4+&—Ÿ&ÐZ·¤k¥âÝⵓé›§Ã &“_.›6ÿ–¾ã"™¹¹„¾‡H¡r&(ÖtÎ qýÌ…®°ôe Ü~ Fl” ØÁz,à"Um×®!ïQÜ(puºaÛ…äc¤¸—(ˆ|wÝ’ÜLÞ+L9ÃõæKóxç«çLA½“Æ'ªÇƪo¦¶mtb’ÇMÓg–b•‰¨¯¹]Ú'å3|FqŒ•„òAãj@ ÙZŽºQ¾¶*~µ Žú |Ø$ÔYÑ÷¼Z›Žjˆ»¾qvý=ÈÔ‘@‡HÈJÉä• 1T@‹}æ)£î+âºãp{eô_Ý®¹ÞæäŠ;îÉmg@„²§˜­ÝkÊ!N’…’S”h"œfJ¢+ärQ-¬1K)²Álb¥¼¦íä(ã]À/Â(ßŽÐØ5d<‚”ëš ­8¾Tÿ8%°éR-‰r ]²~!M5,Ž€[Q(Ç\  ”ñ@j9 ÞƒIÎTqcÃPYDÜUÂ¥7pAHª*ñ$‘:5 ?Jǰ‘ÏÊyb“†P?! ±+_Ê’i¢Y%cë%³!À5üU"hÂé^ö¦d˜D'u`;5¹ûª_ $«$² ôn¯ZÎçŒg¶ ú y“ðrÒ)Y*°öƒ¸0ÃñïñçÈõF¦vþÂüãûôùguãŸ_‚4xk”õöíÑŒÓxÄ|ÓNLóèª÷æÑÓÒ´í©}|>‡ú¸umwêkÔ݃+©;w²ÃÃìЦ9µÓÆ­)ëÑ{zðž¼g¢àΞlåΗnW>€O›Hùþ“àwg¥þÁ ?C÷ÌGôÑÍc&sÜ=óŽaænîBn ª;ÿnÓ-Ï3j·gE µÛæ3D׿#H‰ð>î±àÞÂ4ï“ñ(1ð]3|Ùí¾oÍôÖÕ¶7àbÜå2}‘ä±Ç/‡ÿ­9’ì endstream endobj 1519 0 obj 7047 endobj 1523 0 obj [20 /XYZ 32.1599999 295.699999 0] endobj 1524 0 obj [20 /XYZ 32.1599999 679.699999 0] endobj 1525 0 obj [20 /XYZ 33.1199999 508.819999 0] endobj 1526 0 obj [20 /XYZ 40.7999999 759.379999 0] endobj 1527 0 obj [20 /XYZ 40.7999999 759.379999 0] endobj 1528 0 obj [20 /XYZ 33.1199999 293.779999 0] endobj 1529 0 obj [20 /XYZ 32.1599999 679.699999 0] endobj 1530 0 obj [20 /XYZ 32.1599999 510.739999 0] endobj 1531 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 634.580000 117.599999 642.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 >> endobj 1532 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 625.939999 120.479999 633.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 >> endobj 1533 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 617.300000 123.359999 624.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 >> endobj 1534 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 608.659999 163.679999 616.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 >> endobj 1535 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 600.019999 163.679999 607.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 >> endobj 1536 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 591.379999 178.079999 599.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 >> endobj 1537 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 582.740000 183.839999 590.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 >> endobj 1538 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 574.100000 132 581.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 >> endobj 1539 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 565.460000 179.039999 573.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 >> endobj 1540 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 556.820000 167.519999 564.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 >> endobj 1541 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 548.179999 191.519999 555.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system >> endobj 1542 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 539.540000 149.280000 547.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 >> endobj 1543 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 530.899999 128.159999 538.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 >> endobj 1522 0 obj << /Type /Page /Parent 2 0 R /Contents 1544 0 R /Resources 1546 0 R /Annots 1547 0 R /MediaBox [0 0 595 842] >> endobj 1546 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1547 0 obj [ 1531 0 R 1532 0 R 1533 0 R 1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R ] endobj 1544 0 obj << /Length 1545 0 R /Filter /FlateDecode >> stream xœí=IËí8vûïWÜuCß²&Ë‚xS²UE“ExNÑt5©ô"?ž¯%ùX:GG¾Ã÷½‚zïʶdKgø—Ÿÿóòßÿ¸üðåçÿ¹|Ÿÿþòó[smÚfúsþûãv@vW%§ÚÎ\¥þ\¾ÿööûå÷·ŸÞ~êÿÿû›hÇç¿ú‹ËÓ„ÿøþ÷·¦Åߦ‘Ÿ¿ü[ÿ¯ÿ»ÈË¿ö¿þzùÓôýyžo¸á··ÎµÃ?þ6ýCH!»þÇö_ÃÅ_ßþý—¿÷¯Ðóÿÿ£ÔÒ´e¯ñûú¨ÿÛ> ¬Õ\TÓïÔEˆá¦ß‹ÿý¯·¿ôs­/q5è¿ÅvüwÆ:]¿Ž]¿N£û?aQuwÆ"ý—TÛ+Ñÿ‰ù) “ÈÕo+·+/úCm ðGÛÓ#´ÜÙžÜ9úïoâi*o@sÛ9oÀø=Ậ¯4üøÛÛϸç{Ls§=לּl^I>èž—Âùι¿ánkÑï·›_çñ6{Ÿ øÃ‡.#Ã#W25p7ä:@¡Ïá+Eïø ÚÙæoV{Ñ!EÍ X˜Ÿ–ùöKÏb*qŒVù,Cˆ‰eÈå rP%üø46‹gAtƒOòàŒ)HÄAáXt°Ÿà; ;ùï“eÄ™G¯!ÍJ > AkY(8áüö¼qŒ*Ñù!N©d²hƒaÊ gøò(£F¯F¡M Ø žxeb•äY90+àé#,‹w õ9‘ÖçDÌ“_±¼5kK#¤¡0‘|΀&bÈ, i©&C2ÊR ­­.÷Lš²‘i–}arÛ'û¡ìf±ÀÏ\ðÐ]„ÛƒÙŽðàIJâÄ•Üu|ŬÑWk‚+ð3â+~6©ÁgôÌ|t= k­ðx©ú¾›×™žæ:ÁÁæÝ¦gDsŒ9‘°b®2´ó4³NpÕ3ôÜžqç`»–ݲU¬QÊB³ªH6†A–q\8 A˜DˆÏÄa{NŠ/äp›÷bPBˆë‘á¢|AÍ8¥H_È7ìÀoô”Y²1ƒ†×͇ÓXoÞYÌT¿sMÀÜÂ]æ=¹]zÍ$ÀºbMâ¬ÏDXµn¥£7 À¾5Ò`*ŸLÉoù*˜ˮ°6¾ ÁÓ|5Èwåvœ…›Á` ƒr’¯fXüa‚>8Hx†M;œ,þ^„€@{‚ÿáJ:Yü_²¾e«5>ç¨c8`ÌH´úJ™nçõ×$Œ ÔÍgP¬Ô'=LË  6$ëîÁÞ€[Ÿµ&:ݺúü‡>OñÇ!dÛ"÷",ÐÁ®ÂHÔË'¨ø ²høûòíÀ¤C‰vz~Ç&6k~žQ´!Š‚W2ä¶| GKÎR0%âö*ŸZC_±Š´à7K›„TV5zEûŒ Š T†`¯„p+&¥r„æ€æ(,¶ “ E¦Ã:.¼7Hf¸Fa«_‰˜ÌbJÚ„‚B’„CÑå ¥Ø‚Óg_Ó²]S]—vñ"lƒµ¾´„‰8þˆCÁ(HáL¶º,1º[4îA¬ä2Åp+ŠI.ߎ6C¾G‘Çfÿ”*Âã Ã<pÖÖ'H›©Ïó”±õCÈêù&Œ:N£»>gXš’{çÒ §bl(‰´·—‹“ZµƒÉ0ž†°Wë|†¼hÍ5’kçB}•?Û⊿½ŠøÍ¿Øov®€ó¼“EøšÛ å$cЏ\†UCv¬ìÆø¸ËoËowíºÆ^¬ÿbH?m•¸Øf ¤›¾¿µî*„“]'æ¡¶ÛN1ÿšèoŸ~Ûñ¡‹ÿ°lƒúïoþK ÷¨íþ|ûõíó¼ÝÑnˆà>ED‹Â Û´>^¬¹x!º/„Ûà )¼"‹ñžÆŸ£Ù®±à…v/lrþ¢ ñbºÇøs{â…\4mùeµ¤Ñ3O3€°äJ˜S*mÀàÉb0ˆLòh÷b§ã²rÕs”PÛ\Um€ Êî!¨rò(!èxOãÏÑl×XT™=U:\CG:Þcü9Œ¿Æ=T‹M‡&Þ?ð ø©WÅLI½ÈÅO£ü4f? pÇØ?ÍŠ·9ší+~µ‡ŸF†kÈ?ÍŠ·9Œ¿Æ=ñÓ,æ X³ËFŠ{á’LUU˾vUJ¤ðJÍkÖ®`=ÿV;æ5koýóÚ0ÔvÛ)æ_«!`þ-vÌkÖ6áMh^ïQÛ)ü/¸«yÍÚ´¥!&N‘*£FØ‚âUÁÝpJMå€ðgª‡†0ŽÀë‘êܑꙧ¿@×EDj¸Gm§ð¿à¾DÊ­ÖDéáu*±Ø:µž‘±øúžïÚ–û¨‰ ¹4ÉÝÌ^®Ù”Ò¤®ñcNºf/æ¤AÌÉ0Фah¤:ëó/?椿°C“º&ˆ9š4Þ£¶Sø_pWšÔ‰5æv·ägì!¦a‹¹òÂÃWnyäѳhÔ á鄾»XÌü%§8Œ‚½#‘I‡R<åyOïU°7½ä¨E¸YETZú!RÜ ‘êd"5 „TZÎ!Rëó/?Dª“{!RÔáQˆÔxÚNáÁ}©´ZÍ¡`ôHQÅ¥*ÙH˜ŒB„c‘é‘5„êˆp‹žÅ§Ý —&ªÕÖ$Ú£¹öƒÄ:½$Öé HlÑ\/ˆ­·Abë šë½ ±NËp(Hl¼Gm§ð¿à¾h®ÓVÕÊòkݶ@1‡ ìh@4@.¦˜›½·qÛ\L¡¥9ô,hÏä.Ø*€Ïß²Ô± fÙÿ)ºÅ·Ì»)7]fǺ*íCÖ ›éæý´W×÷F Í í’ªin¢·ß-þŽFÓNDWtQÚ„à£V¥k…ÿE¥AT)¬ŠH–: °Ë 4"p-©TÈÑÔÑ"v_Ô-wXTG.?/®R+ÄgQÌš,±Î„.?¤ŠÃiÿäbý”š¬q[‹‡®  8Á‹˜µYgÞK¬§ò¦rÐŒÒq ÿº®¶òÀ…ÔâC"˜ă*M‹ºïDËD牎öÙcùLŒÒ¶ jwU‘»t®{¯zKn@„¤¼Å@8Š4ã¥Þúj­uÉ׿éK†`A:…0]SŠ¢>¬…šäiàeî0u H|Ìíî£Õ¬˜ÓŸ,¤ƒQ$™tà&o¡¿¤4Âcµ. ­ã쇱†Þop @¸9«Øý>ˆ8Í„(x›®ºÊB15G_I¡¯È"¬²äx÷Šñœ¬³ò-Ó•ï•X–~38'rÀëݪ¦¥R £ ¶h¯2ZYƒº2K„\I—mVÑZýQ‘"•ßmñ¬†)ÎÝ¿XIAÆ¥ªŦÞªx>BÛà€*ÛÜ•—¦Z¼CÓ&Ò"{A’.³›&Õ+•¹'òkc‘L '°ŸpyŽ ±L‘s˜bÜIäz"ö—£Èa ëBEv`z•Ácçf œˆs:»ãê«„Ôùb|W—¢&©u3™¬°Á†>Z‚ •vNháÛ !¬Rsä‹8%ìì‰d»šêG¿wþQÒ;«†rY[9î·À¤OñÞõ·ÛfÓYZwé?ö–Î2ÿ^rQì-“¤íÚ[¶É8ðý­5·Œ”éíM¡· ô·O¿—tÿa.0¤³/1äÀxS81¥hth¬I+O]ªënb&.ŒÕíœ!ö¿¼høa2@`".ó‰cËÙG+}öѪ=öÑš€º·&bÃ=Ú›BoXØG+öØGÛ„ 4ûîqÞÎ_ >ûh©êÀ=“/÷0–´>_µò€hÏ–ÿy¼Õ)ñƹw¬›¼ûÌ06ÊÙ5>åìÄåìT@Ø:QÎáíM¡· ,”Óº=Êi»`ÛE”s¸ÇyS8ú”³[u2D >¯ìJ‘ÆHXR5 iCr˜ƒàÒQ>\xä:œÛÁ£^©÷Á|ðh¼G{Sèí 9»‡G® ðȵ ÷8o ç/PD³ì%J|gGFèW”€ÅV½Q$5z–âÉçU‚Ûöa]$5êÌoéocÚ·ñªuNªÈv°}”Ô˜ÕF*GMëBMÃuHÝŸ*2÷¤ì¶´rÃ’õ\Ýæ"DëI^JI) ¿b—–Ù`?zDDÏ@¼”H‰‚:uéîô>ǰ©I.Íð`Ô*¨5‘Qu*…ý5åù& ÓÏ_T©@KIÔh•þ=g‘_ñ#£¤$H$ó4™:9DzM¾¹Wµ@RÄsƒ%9JÒcN©[H+ìLim¢ùHÝúß' ¦g"Î!o"rêáY)µÿ ¹”E|š"^":×ôXÖ$ÃJt˜âåÐõI>QŠÊu¯ÖO™ávNe{•ä¡~˜hO…æ¼u_<¥®fW4%|fqP ‘ œ¬IÑï cv xKdLD@ ¢{f?n~ø‰i¡ónêk³íê‰z)’òìBLy-‰£â¨`€.©£Â&Äцé¡z:Kc4Bð ‚’Ñ|¤ŽáïA޲r9Õ¬^b5ÂM\WmáÀ}»á+ø¾§Yv¤|{·ˆ{LÎðI5ÝÂgÕWèƒ3ìüùÏA0#ü®!'LóÊ;4n¶B,ä^”-† Ãxÿca!‚AåŽ@gç÷ŸÃKŠÕóõÕ’.4Ï@¸_«øB}µI0ÇÄcl‡/Þ-«fG…ÙwÓ¥ƒ;0©v„PÒ|ŸzF Q=ŸKWNAç›J¶6DØ/î”8Ûa1ëG~Äôö{…0NªõÅÚc´ 6çÀj¡¸} X×ԃѿ…ÅY\qd‚3]ð”÷V…CíaŠR§Ï’×éFš‘¥$x£N ž…©!+3¹{‘.LélXGHÏÛA6-E`O)ÃjΙÆAåc¼ X(š,e!^Jb/:F®jÏ·Føìä@3`S-I¬!oJ®¯Ê;—~Ë’úÈOí¸þcŠÚµVqƒ $«‘¾bôƒR¹¦®åììÈ~N(¨H•µ=|Ñk•ŸÓÓ}…ž×Áá$͵Õ#›?˜|·ø;.8Cë®a”ŠçÈgºY[ÇÀRkÝh‰ÓÉÎÀÍR[ò¤X˜#ç¥xÑ—wKàb‰ Htœ±Á&£ ðûMac1°¢u«ª=_…ÏCH…šXzÕŒç:²rf%UJ;J¥nšK焳ºÔÍ$Ô'pø™Ï³L؈@òƒ¯`9DAuÙ}Ð÷–ZÄ0‰`éÿà RÓOцt:8%èê^æƒÇ‰dçp‚!*ÛcB«K¨¥¦8G£Dæ^E¨¿Âb[%…4¦¥R„ØR‹‰ÇSÎÞ®¢¿Ý˜HIgmüÎ:ÚìuÖÑ&è¬3 uÆ{´7…Þ.0wÖÑf¯³Ž6:\ ê¬3Þã¼)œ¿@õÎ:º]Rf”…d ¸H-ÁÿLÊ®©#å"zߤói€ˆá*i‡Ì‚¹wRsá÷FYd—8ŠbåíºV½§š¶Ú§üÖìQ~kÂÜ„”ß.´~BoX(¿U{”ßÊpQ~»Ðúu ç/PŸòÛÅdw`ÊÊï‘‘G‚¬"Ô?ª\*æ8AXò"B‘ߘ ‰0"šÕ§0™I%ÒeRG„“\pœŒ{'7ÍØqön#làmDó­ß]íF°IÕØáJQ=Íꇵ“>§vjS;0Ò~ äÔÃ=Ú›BoX8µ{œÚ5áMÄ©‡{œ7…ó¨Ï©ÝšŸ`²(žvŽ& ¢Üœ%B&K<éèôÐÌè´…r1Ðv¾hÝžØËj¾”Ö„bàpö¦ÐÛ1ÐÚ=1жÁý@(÷8o ç/P_ ìÖŽpºÆ{ÃX¸|©–Y™,9¬zéIqó¯ÆÑ ©$JìÀ£;³¢h»Y/Ü—¯u±tòÅô^¹KðA~' ÿ€ºŸ-õ‰iV¡ðºAõüìN–#(õ¥1Aèûħp³Â <s)áðn#¡g2Ö+Åa-¦ò€®â’XÌ»g‰½z¼M}ÿžq~ ¦q{1˜Æ1˜Ã@¨“¸9ó6…Þ.°è$n/Ó8.Å`Ž÷8o ç/P]'i›5ÎC9+›ÙZ91úâ«Hg ÌzÒodô'h~[°’rlL6#BlVÌãáh ÂÔ'ø­ðC/[±zÙŠ ôrþxö¦ÐÛf‚ߊ½ÐËVÈp(ôr¼ÇyS8ú_d81Jú«Rj‡#¢ 83³HέšM©&œNGgqѵÊoCò©ùlÀ­àȉæÑ‘Óµ­êö9~Žú¬q1­òƒ [µ\ت ¸py‘šƒ oSèí /R{Á…­j¢àÂñçMáüêó"µ–~­A1ä•Ô_`Õašrz‹^I.¨([RᘔèKˆžŽŠJÅ-¹pÝø1p­Ù‹kM7 „¸næ¸Ûz»À‚ëz/®ÕA Ü0⺞cànS8ú¸n–¸ƒ*v΄‡ªD€)ñW ü}ì°òžÖ>êÔâmJL½<-,aß`~«ŸQ‰S§(ÂYÎ[—üóì u(ÙØv«]¥tO,à ›7«NUIŽ2ªG ÉÊ[û¹DÆC§…éŒ/çí¬ð”^t 'BÐðü"Wî…pêÂ_A©èŒhŒWR¾Œ£pÜCµlÔ¶ó™G¹ñ@÷EØâXUÑÇixv=3D¶JAL^‹;ÉÝÏQ 0Cdb‰*M¤äæUtªÔzNîü؈­ó‰úkT >I}7˜W»lþ •ŽUbÛ,†üƒàÍ÷k²((…ý"ù [m…§íÚ)ù.ÑXvÒÇã÷—QC±‘d4æ.q™Q0"LËGÞf×,eâKz¢?—^TÐÙ AˆIÍ×)f¢H×8‰'=“üÍü ƒw´qµÎø\D"jFÄIe¡ „Ï/%R6ýÄÉ{uì³eám$²_²Óùb>ÔñæˆÔl&¤BØU|VÙi[õuW¹gzJÙ»¯*ž­hUp¸*Z†K뙺Å}ð¢Éf½¯¥¤xf0ۗϸåœ?g#3ë°¯E ’`Ó}Åb\J¦œ} ¶Ád‘%f†µnr~^r2Æé(Ï.¨HÉ5«·Ò§Âw3+‘ŒG”¼Ð‚ŽûmGwÞWâwÓ8ÊÌð „^0ÕPޏNlB‚8¹zT ?u³vcÙíÁ @Wd® v=¹{=DxK$UÁªÃYn\½ÔC’”"¦"ʇB… áêGèÕ =††ß]çdHÃ:.+ŠÕ6?—tpäMAn~‘é·r4MýPàÆùÔ¶¤dÕs†ŽäG~1·ŽÍ¯¢…I¾/0aÔɹǼ<«üóì3Ì, S°„´!8<%u%ÑŽukr=I×øN"õ»‰v}N7Ú»B©Òå¼Nëk¹kÛéwƒ’ÌBTcTã☶D×ùpw ³TÑXh`ÉŦ˜ŸS‰G)Êù€HY¥TDF¡æ‡ÉFdéLD¦ ±+%F”t+°ÊÆ·" ÐÉÙ²ùÿR¸f\®Ñ>:€]²˜aŒ-PEy½0œ µ»Ì³Æ0œeã p žtÓ’|¼XË€a:" ,4ï\ƒ­¯7Þz #jÕ"¾£®gõÍãElKha•Ò–,s’\ÉQ˜¸Ž£ à 9yR8ÉCËRA»ŠÝŒ'‰± ˜ÌSþ f ‚í•ûÔ H6"`å¼X)¡ u2aSBI¡„FŸD_ÃÑ\`Š)Å—_¸6ÆyJê"Ãÿ¤ØÆN,ŽØƒ5s¼+'EAÕ­s¡½W4A ‘¸{gñŒÒ¬,õJöl0†—¤ ¡»ÔI5JÖü?Û6 -RÁ(%ŽêìÁ»ƒp¨ö9I ¨R'Žb·fUW 0Ù:RÔ½¨„êŸuLrT!˜g†GИôÛt³+J ÄQ³äWƒÂÁ‡/´:0ZO Ü™Î2ÒØËOoÿ¬ö× endstream endobj 1545 0 obj 8120 endobj 1550 0 obj [21 /XYZ 32.1599999 682.579999 0] endobj 1551 0 obj [21 /XYZ 40.7999999 441.619999 0] endobj 1552 0 obj [21 /XYZ 33.1199999 680.659999 0] endobj 1553 0 obj [21 /XYZ 40.7999999 441.619999 0] endobj 1554 0 obj [21 /XYZ 40.7999999 260.179999 0] endobj 1555 0 obj [21 /XYZ 40.7999999 260.179999 0] endobj 1548 0 obj << /Type /Page /Parent 2 0 R /Contents 1556 0 R /Resources 1558 0 R /Annots 1559 0 R /MediaBox [0 0 595 842] >> endobj 1558 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 1559 0 obj [ ] endobj 1556 0 obj << /Length 1557 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø¼ÀjDŠ’( 0Ï9Ì99³Ù,™E&{ÈßlÉîéd•Š”ÜãY`»Û²ø(ëýxõ§Oÿ8þë÷ã«·Ÿþsü2ÿ|ûéPWuWOÿާÿ~|þ¶U£§_{ÛVz8ý;~ùzøvüvøxø8þÿÛAuççãÃËÓ€¿ùíðjšü0}òéí_ÆßþwÔÇ?ýzüÛßÇ?Íã¾ðõ`‡îôË¿§_”VÚŽ<ÿíôð—Ã_8þ6.ÁžÇ=ýÿGÝšÎÚUËøv}Uÿ{þ*˜«>6Ê6ÝQ)=.²añß~Ǻ.¢²Ýüþž0=ŽçaÍ8OmÆ…{“ F©¾3}ºð^#ªf8}wlŒ?¤¼”ÔºaŒ­%†9­F­ÚÔå>8àí ÏÔ(¤-^Z )ÛöÜV£Vmj8h¼.º7m=Xø{âj›ºnEá:Ð:è5º—Àúój$ÁèãJ«|JÛ 'ªiÚª=1˜¯—¿»ÊÚº?výù§Röü©=vÝù‹§ïN|9tm¥Ô ­U—ï˜Åæùã×§¿Íù¥£órãNМÞX.büΰbXNðËáÍ7¸‹~Úó·°Þ|>¼ú0œéçŸGÈŸ¹ñôãóHùÇ?ƹÚñŸŽ¨ëføãñ󯥪Ó1ôíùkç'õÛóóôAsþ ¯ê¡éÛ‰ÑÏOºó{ý@õÓ»•™¾Y'<©5Olàh-|â.¶îݼ»¯èéƒvk¬Òm€þªª£ )½q{þ «´²Î|î¶>-wTåÍë fÝWðèï!äáÆñhú}2âÐ3jøØ´5<>{°è£gØwËÕD;ôe%)ÀJ‡@“=`™(Šy— ï£Kú]PÀ7ç'ï?yjÇëš%ÇëÌ-Ž7òÝ%C?p9Þé;f1„y>Á…ãuúÇë”;ò8Þé;Ãbˆa9A~Ž×ÙTŽw>™ukQ¦±`9C·\Nýî<éPµ€ÔÝz2 '3%½ñ¤ià#µmtª5Φ½ë9¸×Óy y—¾‹‰j€–mMÄ” Âb xI‡!ì2ù“€kÔÜAÊð1¢mõ’hÛæѶ­CSÇ\¢}úŽY ažOp!ÚVÝ"Ú#Qt&¨=¢}úΰbXNŸhÛž®¦øçîÉ<ø 0¤Kò¡l‰([ ÷©ßñÕ¢Ò¼!›t¬§ð¾ÌÚ·?ï,D<®ë¬@5…"@o¼µ¦o<€?–‹•‰}F1ôäOYpcà¦=¢î7á’¾FÌ‹"£`z'©Q–ؼK§#Þ`®†ñËø ƒñùdúil^2²4$NÚÒßõQ;ÕL ‰Ã3‰9Ïu6gqÐê²ì×¹†Ní `h^ä)¾Þt¢&´¨1_±¯´VM00h?\šiܬáðéÚA@ìól.„w9G ‰Œ³ÙLÕU׫ª5¯á4ø‰X U­Ún±Qü$“„w–¤çtñƒ¸ÿ._ŠÍÉúaÉ8:/Á4Þ;(,žœgž%Êó4àµz·ˆ ©øG݈󆨈Ù:Á?##ºhÁŠ б F¯,óyÒÅE&¡0ûâ ǃ›N0½ƒs|ao3= ÖÅt0¢ g$ÿvr§=‘Oq縢e (”B4"¦›ªèW‚Iá]­;ánLò«šÍ *ª‹C8æÇ„ÈœýúeYöeûX³ó&Žþä˯w´˜§o.‹›ŽÔVv¨eköÿµ€==ÁVŸiýI¡è `æP±_ÛäyZÊÁ O6WÜ@§,Å/¶ÂŒ÷bMÅ´”¡‰îŽfqÜ(*F%XɶRVÀ$'7±jÉN œh䙹n@2nºù÷s)îD‰ÓfEžœékôÝzqL’ãRâ0 èG )ˆ2 Q …kG³(†ÌÞ2~‡{Òr¤sd¤ìƒÊN¸)¢§Ÿåʈºip$GÏH~uqˆ»zîÁÁòÒã¹â&>Ñ «xŒe°,÷œ¥*B:â"OÑü¾Œ” Qí’PØ8âii"æøtç˪Ðõ<¾Ý<¦¥ýóäÀ¨X_‰æî‰cIØ*9º£.¢‘ßÊšØÛt6$r“`?À¹4ÛpÈŒŒ¢ïŒÃ(pˆGaþXÚgLœg¸™—…üŒ=‘0ݵtwÇiAÂ&;ÂðžE©¹ÅÝ67Å:+¹z¼ŠñŠDt¥ëXJ Ȳ«O׌Ì™å®ûåÑQ õ¢pÉ ÌÊN bkì§é2q‚k¢´±B!²èÂÕvXµ_¢YY«ì"BBÛÈæpuç,Ú? Ñð„²œù¬­udN@!UÂÉš®J¯1‰PÈ!GV&ÄÝs(ÊæUU$">|þ-[tB”Eäñ…ß“¹/êYUzaÅcØîbeV ’Ó>8Œ"º3|QÄȯjëK9ˆbù ,½„D‚,½•Ââ w.=ëo!Ÿ’–'šÙ¶J¸)\¥†E<¬ 0¸t£e ¿ŠCfJ”·°Gmnš“Ô™:õíeÆ9òL»€ë\Âòü+ƒó=Eõ—-á¯ÎdB5Ucb0‡öÄúf+[¹ØŸp¢\§Ø:s&LO'ôÞÝØŒÏ·:g¨{^ïÓž5ÚÈ,§t—µÕîZ²s¥d­…q)ŽCr%jââkבãx"b1’Mw 8!7sýI×C)EÒ]ÁñYäy‘F/f‰•)±è¸FÀ^Sß^ÄÒ¾y”gì$S¨rºg)wrÈFQý™J'¼—B@éñ¾=£H¯— ¼Q|F‘[Æ zÒÀÑp¹òYʺ5OG_A Ÿàwð<σ ³ãbî°ü:5<KÃÃýàÓž1¤Zjå‡[Ëy·Ÿ4ˆ¢È¸ø°^ÃÑÞÂÑ`…ÿZÂÑW޶=Dg…Žöç2áž C¹‹aìò6JÑkˆ|øšq辚5>Fºày *cj‰×€Žè5 \&Ì™àÚ0t…¤fD룀Ǜ  åæÈ‡»¸Û)î0ÃábfÔ8RØnË €—q³ð1rî\é‹QB.#×((zXMÝ®8,ÖC ÄpÞÓÃópÈ->¬rJsr`ð„!NÖTbµàâÛ6ÍGWqŒ€Øº9? ¬“ÛéÜøžvËÏìñ,1©©𡾈ݬÀ~°P€5žg犀y2‡1¨8ÆÙÞµòÉ:K&/t¦;WyNÏ_¦´!¬@qL- ¤(ÈëM{m(ÆëÑ,­ºæXÃ(?²+š/J ¨ÏR±T¦OŸ@êDîÆT+ÊDgêg‚]­œþr"…óE¼êLèEN©Iž3kºPÝ¡ìY^´ !žÁ+yÅmÍIÑ;µ$é™sF±‚ÝuóòÝ©»ä3˜=ü¾’æ8„ªÖŽôAˆY"$”§×ÒļDd,ˆ35’ 8ù™Û7›†0'¤+î®J%–´lnÎî<Öa#/¾è%…øpzïH¤5‹¤VÅK®iJÈZ “æ×„›+i6!éDÒôÓ#P„4qÂM\¡$‘¹]KøKtpcqã<¥¼¯z² F ìÌI÷Íò²òHY¥°à^½ô œvè bã£^3܄ӤÖt×"#WÃg=ýs︩úÖ}ÒÑßQ¯á;œg–ûêÊËç›sÿ5ž˜5§,š‹Ÿ0³jæ#Ó®Ð?#Ï5ÍRjW5çCö*[™ŸÞy Ÿôh4¥!$áhxà`ètè‰\fÔX>N¼¼¤R>êGJÄR"nÂ}{¯;s‰«Â*YqÀI'Ú¿+rÀ]=à‚îâ뾃 › TRÁ5Cƒl฼S<6¸rÂ{ðÚðhœðÆ)°`ý˜R0N!ˆé(LjŽßÁpÃkÃô›þ9X%{r ê¿ æÚ×*ŽHˆŒØ?á¨Ú»Ì’|øÄBp+ÔëU²Øæè_,bQöÉæaí²pÛE¨[ß T.ŽÊ@ç ܾ›@ç’½½„3Ôår™-ýpM(½Kºó ä ô·ª½kô¿O¶û s rc¨ü äKá°,k¯âc–R»àÆ:2¥LW„±☠G›Ã…±Î]nÅNâà`¼¢Üå]¥Iv£¤´á@E7zŽÒg£¤©GªOR¥Ý'nB©ÌIá´Œ(Ý3®P‹ž3¼†Æ‘#ö–“3óªsĪ5Íe…{C3°œ"ß(¦r ™É¿o…ûRD³ôüy™¾ê;éú–3ªïŽ“Þ~ÐÃL¿ƒˆ@^ºž§g®DësJ?‚Ö"Ûy,K”±”]oêk5×B™‘/IhQÊ. 5¥¹c xâ`Ãõ®wð#г„lÁ@¯8/SXRñܨuyÖL+ç‹´Ò#Øž[h{ƒ¥7Û“±JÉ&ï—É™÷¥‚¦‘åÈEZfê-ϴݼƒ&Ak!Ø.ÓY1ÕDúdî1£˜L‰rÚl—Ê2^*-HÇó‡2€ç ÔOÄo·—bd”Â¥vMeA¹Ç6Æv*SJ0‚<,_²;q¨*À`®ô¹TU<ÎKŸóùµ‡C ®ÀÉæóð* è¹@SõnÖ>ÎŒÿ@ßi Ÿÿ mî›ÜV®¦<ÁÕÄ*UDÌEöÌußÝn)ª”g2ðŒâžÉbM¦ô@íÒ¹/s}Àè¦Uï "޲Â1‚8l3{!+ݶÎÖ0.\Q§/ÒÐDß s>¥óšË•Å?#C¼È‚rN¾Ðª%2ûfaè/ÒšR×y‹ˆ dnåAÄ¥òâfyl4ªG@àjîâ×û1 í¨…wú¢ËõÇnêkÓ vš†L'*%àZ F ­6£—Áµ#/p(=#Ç…³8 §X§ñ'm' ÅCR Ø|>E®Öµ)ÉãjÍWë ‘Àe`”a] ÑÑ,ú@lL*8k{iõ»b°…§€“ì)à[‚ûXaš†çÁ4“Ë…sÆ84„‘5X†›¨€aàSbÖ™8Cí/% uf¨Wˆì€¡bˆ`¢ˆƒ1Äô»a¬’±/ {f›¬SÀló»9Ó€ «ãX„ —" 43 +D„ 1fR⸕ŠW¤.ìÁ,—Ã’U58ä…ÓCöA’2àh/ª]G¯Ë XDe£Ôë,å4Õ^j‰7PÂ0ªÜrzµ+¤¸._Z\é) çáѰ,Å v¸ ÂDV飆z‰–%&Õõ°'ä{Z‹ÿàêCX•ÀG¢!µä\ ,²nl§†£iNIx|>¸A^[Œ/x½–CØèýÑÿ£Á@„ìДóoiã$YævÕ+_»›ŒÔnX®üÞbãTÝ;¸£Ø8ÙTÕxaF™1Ñ8*BÒC På Ÿq’Ž8KB§“—f4ç¾gwî:H‘äæ©ãØañªq‘¡üem#œ…ˈ¬éoLƒd×ÈS 1ÀS<6 JÈÖÐtJ zR§’ %šú~“zÓ¼š»%ųڕuó‹jœS+%«Ä³.æ` e*/;Í»È84˜@Ý=ò'‘Â)œÚÌHƒÂLËkÖÍ#§^[ÎZ¥ù•h°Ní.|¿> endobj 1571 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 1572 0 obj [ ] endobj 1569 0 obj << /Length 1570 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èóÛ’H àäÀ°‚o6‹E¼ˆ³‡üýèAµš¤>R,QjõŒlÀ3EYo–XÅwúüó¿~?¿{þüŸóWóóùó©¸UÑÿ9·¼}ÀÕEðþ×Z•®Û?ç¯ßNßÏßOŸNŸš¿ŸXÕu4?šÆD?àï_;½ëŸú'ŸŸÿÒüö¿3?ÿ¹ù߯ç¿ý½ùñ“¯}áÛIéªýåßý/Œ3®šÿÜþÖ6þrúëçßš)¨nÜößyU©f*K¦ñýÚ•uo»XÅYQò3c¼™dÙ<üï?O?7c]'qQ¯eYhŸ§æ Yñ³®«³hÈâ‚ñÖ:g ¶l˜ºb9†igÃ-в”‘ª”†rÙ²‡–aO²²ÎA„v6lÑ¢ ð@ùˆ y¥ºEsµ{Ã@ ‡)e–aÚÙ°E‹ê‰¨A¶ùŸF50ª¢U{ ùäSÌGü=ÐñéËéÝGÝŸ/?7Kí,XÿãË·“lþÓèåf-_~:ÿ¡(¸þãù˯'Æ.¥¬T]v¯u-EÕµ¨ëþ¾Ê»–úRhÑ¢™ÑWJŽ|Ü',:<îŽÎw-=Êc Š uÐ F7J·p Áñe*§s„Ñp×>¸ðæó+“Ó^Ó>(Ç@øÞnÜ«ÅjÄ#\\MEš ¸Ýu2=ëØ‡ùºÞ¼1ÅŸ°­_Îî㲤„Ë‚„«„À䣿=Ñ);dlAÈGÙ«cjAË&_r©+&…«.;…¥‡½!¿úê š1ÑbŒÐD˸ðFƒ-Æþã>9RJ¤ÂY£»-Œp>‡-¶Àuæ™j©`Ë ly±ˆgM c`Öpä1#ÊS-8€ë Ìíc„¦[ˆcÉä!Ž–8Ž Æn¡e´×& oŒ þ*¯Ï:+L€u]©5jLˆ8S¬ !û3Š²Ã¬Œáæ†})NÁÁÝ=¦ÀÜ0µ!‡˜ ÌT V·˜Úx¸¦äF±çsDÒüV¨T9\)naÐæ)Ç¡ÌqÌoï·óNË!ºux§Æ;½b$ ú²ú ó¯Íÿ‚PI¯ {öAITÀŠôÍÐ4àÕÇŒðºJ¾¬¤­ÓŽ+æXØGÜŸ~¡V%¹š„Ñæ1÷à8˜Ç0/Üzƒ·Mœš·í|\1rÿ½Í*^õ&¡ ¥£[­€~ÂZþ•Y-žíz”$UQG—@ÙGâs[^!Ü0@x=XãÝ/¦6^Ô;ÏÒT@Aç„8L`´ …‰—‡0íH˜ðܰ?ØâѰqÅA&Ì!Øo…3  ƒ38=&èRD™üþ‚ÎðÆäͨ–¢ð^$sކ¿ÆÂ#ø&žæ7BïrUÓ«šêšIOp)[Ò@DÎ@lw §R,Š*É6›N]öt6ʆ-¶Ä†L!·#VÝ´aÚKˆiõäÀZ›í­’Gƒåõ9’3'rœ€×S¡ºˆ>gÏ31S©yx4ˆƒ#mP%†3ŒÒŒŸ8 žpÞŸ’,³¡Ü¬Œ‡ÌJô²»ý|%ˆàÖr¦·Ý=©l£$ œÆç':-HH‹ç˜¼™¬—÷ðUBŠp³‰pžJ¾Q×L©ÁMÙk†ûlòõoÄÈcæ©>Ÿã "ák ~õÊÂÑ»È`itþ!¨– ŽyÐ ,Z8†+ž7“Yrd×ìûdcf)9Ch‰!”ORËH±À£Î?îÙÂßw£»6q*ø‘¥î8㱎û;#y3„°Ð½³y$EìÛu¸RD;IíݦKÓ$Š Žiºbd7Ï&ŒP ç¯$ÜsÌåX?ay&0fžÀQ|b—°µ¸Ďħk0‹á`Ý I`#`4pò‡2ΓÇ-Y1ŠGÃ9Øo œ”!Œ&¡üHˆ‘O]FÕ†ÎRI¬ùðD¡Èà–@Ô£€$äÔqèTP”f Ì–Ñ`ÜB X²+¼IÇx£lð†;2ØTcS@‰Bfu²›™¤d»sŸ²™ú€x¬ ±GLÚ@ò9Eœñ&«[¼Jz5Á8 ø|$ŒJ ØáŽ¥ãõP”%ÑÏ€¢60(©aELÁèVEÑ+ ‚F¢(ü¼Ø!Eð()”ÀÞ À-›J~ZBš×½£~LØkœð 0\@´{Ňþ² + ýø¬x]Ã5m µÿJ ›0i9äií!©Nuýø2s]Ãk“™£àBÈìE .l"@º²åy  Œ•/µã^Ôb™É[ïo;ª4cù#YJo³K¾(³Îz`&P)ëGì=NñÚÖƒBfûêW—ãáìC]r#;¨=tTþyC8Øså Ì„ îl‘b<™â1[ŽÊ‹¹+/bÑĉ¯ÜÝ£ Ì S›pmSà€#¥¬î“·àÞÙÄ‘´}Å—§Í §ÂàƒÈ˜ß¶Ë×åî®,º·wzÅ%Öbf0æ_›ÿuTŸÜ·zÿê“IÓ}ט”¢>.?q”|¿"~³¨èÞË&[B=dQ6=o' ¹ÝͪR²G¸ÄùAÉH¸ªùî'ZŽkŠ{aì¦ Ó‘‰âƒh&þ!èPÐ¥Ž2ùýáMÆ›QGR}Ú{Iª?T T5U¼ôŤlI‘8±ÙMR^/(ÝE•¦²¸C‘™òzMÓ½+Gp9]G¦›¥[9‚qwv•«to_ÑÎ+Cqý™H×6M´MšÔ2œa§bœµöü¶ìÉ»V¤¾håŽòöyÝ%‰cõp”t”¸^ W—Ê+*û˜ÏQ `÷:nñ§TAÀÜÃ[Vj¼–[rCNŒë÷†ØöPHæO/²QòF…@*qU«8wIÁ œ"@¨ÎHWÙðNÌ{‡²)égKr`7ÊBÙ6Ó'O]œ¨EÊÎÈ’c›ŽáÅ“)UK>,`U˜ŽRC'žäâ'›`‘õÄ}AbaJbŽGàåI=kZ%m3°DhIU7°T%ÈÛºuX¹x„ä£%¥©(Y¼%U>62g¹OFü1–¤[cc•/NÚŸ„Hò“rT(xȲ )Iy ™„*§É T¼š‘§Œe9*J>uû¢²k ©…mˆîæ¶fñM˜TZ"Zgý]ay­L(ä‹8Ö^Ž,*,¡TYBž¸gмuz¾SByLô¬YáóS½óÀX²†åÄðy§`NÑRÜ÷mÇsKr$ï/T@Ù{vêÉÅÖ¬¢…­Ù(®¥0_J͹OŠòÃÊoß=-8¿èˆ|©ŒÉ8ÒŸú#ý+}nˆ¨dW¼ùümøyQª¨ÏUÝýdLuO›ÕPåÙ<øzªÊ cš+ņw¤5„¼мÞÿ_tÎNgîàm{Í;ÚBÛ~9=ý°ϫޘ«á<®Ã–R,!Џ Ï{°(š8ß5Ùctc½7Fn±„Õ·$¬.Ä„„ÕEi @ûÀ‘°îi !o « 6!auó‚ p%¬{G[ChÀêVñ(Y /žáþ{5x·´ ’UÞªMY]Àx½P’'ôñ#o E¨ð%—ôó–~Φ¤Ÿ G8›®ô·ïHky `~¦§¤¿ch¸Òß¾£­!´ `}éOeÌ·¯ ¾ig/¹(^³Ô ”Q¾Ø"ž+‡ –¬<«r›_¶5¥5EQ%Tp__ûek¡§´dŽrh¸Ú§}GZCÈ[ƒöõ”ö• yàjŸöm ¡mëkyÍñ¶’ô1–â¹ÞÓf••Í5e=Å5¥vˆÚ×TNº)÷pÉ>dwõ?¡­„ –S¼ÒWºùÄI ¬u{CØ[gÓµMªë©hR];Ѥö«9êAWԷѤ+€AsÔSѤºæ./šÔ½£­!´ `}ÍQ_¯t–p¯›ð!•P«<åà^Î;„Ñ<{/5à%çCæµÊ¦/´Ó“±1íÆÆ´ÓClL[±1íÄÆôdlL»±1íÇÆôÓVlLoÓ×joM_øp‚<”KÁNbC¿ºü(fG—›Š.)æD—ÚŽütïHky ÀÈ*¦¢Kªp¢KíG~ºw´5„¶¬.?j¼”yÝX(åF¦,ǼH ãK©”ow£o¨ù P6å¤[ÂeN¯ûfÜ}z¯*Hy/ø¾ x. Õ |àM¹kžÅÓ•mÖå=h–'3êàïÌü]B1—«ÆíP¼âS¡x%œP|ûÀuÕ„ ÅCÈ[ƒ«Æ§BñŠ;¡øöëªqЇÐ6€õ]51„âñ×øÌ÷ØÌ©Ìw宿Kv<_É©x¾’N<¿}ಞ4ñüqy ``=9ÏWRº¼x~÷޶†Ð6€õY¯âùCÎ} ëíñ#íü„„| ßWN=%8xóÏh¤¨ÜŸo›¿çï O²ªc3óãë·Y]øý)ÈßÁ®ñbÕ™5˘<ò˪K·Ê³(䀀¿LWÓ_/µ¼xHë5dcXêigªžhé%Gˆ ×Î,F./UOI—ŽSpì£aŸþxWÍ/¼VA“ 35ZÏä·O>ÀwœO¬ð#êcØ}ª…¡u9Këc(–²v3·Np]û;/Ù5Ÿ¶L§6©ùRùá–þ> ŽÇt pÊK:ŒÎžàxSw?­O§T¡íâ¸%0· qd€¿¡´˜\¾)ì@jc8Ñ }+}"P› ã•BN Ìàf;¿@ú•ªX?ÓÙjà¦ò÷§œ6÷üéô§mÝS endstream endobj 1570 0 obj 4570 endobj 1574 0 obj [23 /XYZ 33.1199999 646.099999 0] endobj 1575 0 obj [23 /XYZ 32.1599999 709.459999 0] endobj 1576 0 obj [23 /XYZ 33.1199999 707.539999 0] endobj 1577 0 obj [23 /XYZ 33.1199999 292.819999 0] endobj 1578 0 obj [23 /XYZ 32.1599999 648.019999 0] endobj 1579 0 obj [23 /XYZ 33.1199999 231.379999 0] endobj 1580 0 obj [23 /XYZ 32.1599999 294.739999 0] endobj 1581 0 obj [23 /XYZ 32.1599999 85.4600000 0] endobj 1582 0 obj [23 /XYZ 32.1599999 233.299999 0] endobj 1583 0 obj [23 /XYZ 32.1599999 85.4600000 0] endobj 1584 0 obj << /Type /Annot /Subtype /Link /Rect [205.919999 761.299999 227.039999 768.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 >> endobj 1585 0 obj << /Type /Annot /Subtype /Link /Rect [161.759999 588.500000 192.479999 596.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf/) >> >> endobj 1586 0 obj << /Type /Annot /Subtype /Link /Rect [196.319999 588.500000 228 596.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/automake/) >> >> endobj 1587 0 obj << /Type /Annot /Subtype /Link /Rect [234.719999 588.500000 256.800000 596.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/libtool/) >> >> endobj 1588 0 obj << /Type /Annot /Subtype /Link /Rect [167.519999 579.860000 416.159999 587.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf-archive/ax_pkg_swig.html#ax_pkg_swig) >> >> endobj 1589 0 obj << /Type /Annot /Subtype /Link /Rect [200.159999 571.220000 255.840000 578.899999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf-archive/) >> >> endobj 1590 0 obj << /Type /Annot /Subtype /Link /Rect [260.639999 554.899999 282.719999 562.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://cmake.org) >> >> endobj 1573 0 obj << /Type /Page /Parent 2 0 R /Contents 1591 0 R /Resources 1593 0 R /Annots 1594 0 R /MediaBox [0 0 595 842] >> endobj 1593 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 1594 0 obj [ 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R ] endobj 1591 0 obj << /Length 1592 0 R /Filter /FlateDecode >> stream xœí]K¯ãº‘ÞŸ_áu€øŠõôs€YhtY³t&÷Ó“Eþ~dKö±H$«XEÉîÓ¸}úÈ–¨b±ÞõÕ/ÿñõ¿ÿûÃ/¾þßáûò÷‡¯/Õ±êªùÏáôßïoQǦžì‡öX§?‡ï¿½ü8üxùòòeúÿÓ¿¸ü5]¼H>Ä–xÈô&j´2Óÿ!_r³ñs7ž„lßOk«N:bù÷p†ª?týùo3êé·Ó)êºóOŸñý¥kÆŒõ0˜ËgìêööÓÇçwç/Ö_î[çÓ/¦o¬qú̸ºÅ¸~À__ÞÿîŽ2ª_ßùG€X�üòy<éÝo™è~VÞó_ߦMŸþqzÇúðíχ›÷ñßßþ6Éšc×›ieç¯4ïÏWÆceÚ®n«”+Õ‡óûú‹áü‹îXŸo~óQcæ×GÛ8Wêó•þXΕêÓùJ;ƒY?ØÎ¾Ü,°$3ž1¼~¢sÑ›õîGñs9o©5“üÓ·éôè0†=3Æxº8?q&‚±—Åè—MØï®uÉä}W”‰Í;g%Þ/ü`ŽÁ´ñrŒé·÷v‰p6+—î™I8Dœ³Š)àÞ~96ðzŸg¦0ÇÖv+¦M¸´€P‚{ÏÚ¶t®P‡À¹ž¬ó¾ ©U{ß­è,ÙnE—ñ “&óLºÌkz³zeÉUŠdÒœvZ×Õ¦±Óo~ñëËW’+¢ ¦_¯‰•.PÛßÐÏb€g=)ä2b1EÚ^—ðNÀhQ0I…1Aj +]å(ÃÀ]9?‡°‘é‚7@iagö˜Ü¡±r þ™=L{¹ÿëÌöï¡bÖa{¥É±q :8jöÿ$SÛ!žVeéæ•LéžËkùö‡âŽ™Ú°·Œp*DJç*4ž§LL&WŸã—Iä•<Œý3Bë§Sj§m”á¶wí|jÛK­Y6ªvw»{Ýmë}dt>²ÄdLyYÏyýò¥1ͱ±Ž%Ó.´çŠiŠu3gT w[6þÞÝ>\™ÓžÍ,mïÜm\˜Ó·áÚ.ÁèÂ}†OvI*ûÊøÁ˜ Óß#`í½&)á•[Èx_0™:xåãn˜èŸ Gc·&Ü_€¢i£n%œšž¥+^i‰Ï¨{ñ>ºg7aÒÖµKoðæÈšÐ鯅_8¡‰^ k!qpg Á̰÷l+`p&øœ÷dT6mÔ8 ©2Fã茜ÞS‘5ÙÖ>z–»$q‹’ÀØç#_mºe‰}ç,Q§È…#[)m}Ób3eL8v¢A*NWBV#5L©‘—Œ‹Åe 5ªºÚÑ7O¡3([P0{b)`JuâìvcãïN/ŒòƒoXP¥‡ô(M†"º!Þ*`±âƒŒ f•Q—8ZCE2Ê2]†/B©ÓælGÎ{MgQ3®~Ó9ÖiBŽDÄ$ÛuE‡­úµÌÓIj|„w<èWäÄé(î ¡{$§ƒ-û©PƒÁæ$ºÜ“¯qdut¤çz)=Á[¡¥ —ÁÔgEÏ⥰ØjÎ)Ð!wivNõUòìl®Ü‚¾‹W‰= üË45ƒ™ãÁ[‚`r0¶8ûÉkätˆï†´ εfËTÓ¯SH*§.gçvWî»C,ñxÇ#ûð*¶Bï+…¢S¦~òùÍ,‚ ÜÊCM KÂü1qåuÔ@wFd½U?­aRª®Ö ×'&ÔÕvÞGÜŠÈ…‚÷ªNq-.Åôkqág—ª®{÷'ÜÅ/ Tåòk/ƒ$4ðEæÅÕž“t‡Ü [šáè–?hîzÔöèWãŽÚìÞ4µÃï›×îút%۵ϸ¼›QS½hqu‡¹®íšËŸ®qP©óC¢ &!Ý(_ ä å ®‹ÒH7 ï‡èÒÎ…Bàt´ž7"ùã Ë"ãeŠ<µNm›S­ÖŠÂͤWë*20ûÁ´ÝOÓñfA)•Ž?¯ë`ÊD¤ i9ñ³t¶¡$´ OÔ¤‰4­o6cN§(§Ÿaf\2°ðô–it°Öuìí­˜p·F¡*±rlc¯Õ?ª(>Žë¡*‹6V¨9±¯¹M‚øÅŽÌ8ßì„í+ƒml3 Dû¶Yoôò–ã±õ‹®,µðw®\‹Ë½+M¿óŽñœ^éà•1²Õoãšì ª›c_%ÉÕâÁž§óõå}ù†•5Ž4»Ê~BÅ®,¾‚3Žœ+ž6ðC¥^0Õ‹¤{…P—ê>.àÝ?Ü~Á@ndwFdóî(‡Z„ôVêé6œ=ðªm´_ÖÇŒÞ#P©ËÖêùþîQ%H¼€£þWSòÜôuM%Šϡױ½ÄÜN#¾o~±EÌmž2~kk+¸ ª®UÀ¾l¿}YC+r¡È½+^y×-O¼jÓÃ+ÐZmðs°…«^…9º¦Üsú`ʵqê~|cº|Ô?yã4ƲŠÆ2°ê)8iPIÂmÿ; 5Cã0Œÿú1BšR¡Üô’Žý´¢Åó£Š( å †5ï>t /~#§/¥øáTëÐûšõ¶·¿Ø&ëm×LQHÔ&§±Qé ›D¨Æ2 5'ƒQRF™`à…n2ù€ÂZd·rì°f”K•l7¶¿ðˆHlD¤6Gä{†kú¶°:EÜûké/£¿÷Ø×@éùÎL,N£øFázú„NO&L÷yÁ«t¤‚ XÛm*„»Vx¨ˆdÏqBýïpv|ìpñ„&M~û‹-<¡ÓÖÄÚ1ö™HÅFÁ©Öô#ÁqQ”½¦„J“h¯,!D†ÉHQDwXbÊBY¥h÷ƒsžeP±!× q’"“"µ·_Æ!þ{³ÆE¬ñb.m×µXò´qN=8e'mÃh¥xÎÎ ÍŠÖzp˜–‹cl!à8 *3; ïá Ø|›êãì'¡à•%b¼Íáþѽƒ<ô-©ÙïÜáÔ=pÂJ É(”H ^?ØÌØ®q¤=EŒA0{Š Õ»1´d1ÑG$ç1ªHkÛc6ð9ƒU õ[`—šLàÅ›}‚Æ¥¾K9ÄSÅ¢Sá3¸@³jyXƒQÇQÈ,ÿyæãåÄœ÷V{›¤M6›Q]J©­ØªÚž æE,¦À0„_‚§¾UB,‰òPy°D¶sôÌf`=éVB;'Å òX…SZBhš,4zY'^û!:b¶éQHÚj^Œ$!E#HÌÈrÂz”°9²#~±A$ˆJ£ÙUÕõZÑÐU§ºëi+™„%ä©)Q³}+E]'3úÍsd;œ’å™áÎާ´UzPÂiÜ f]ÈüŽœ©‚"2CSA ££!f™ N½HÀ›£.ꨳªãâS^dÊÖDõ@YüVz\;ü¶Ñ$Ì­$6,³ß8ó­™íiìZ½<»ü(UoËÑoœ`y™T)”ƒµfDÌU-% ±»„br‘^^~†ê^^ÿ€èð碅l4o+ÙŠº§ÅFS·k¹ñoÃÂm°bÈa?Óp¼º˜dÂZx%ˆA¦1 ~ŽìÝ #þNév žƒAÀ1¨!^þ†–Äk[,bèä4•z:‰á(+ :‰ùîBaÍ" ­/b´iáràËÕT¿ÜLx ¿ƒ … ‹ïf +(jü|œ!S`ZÖ† ið},F¤ÅB¯š³È;-w0ìÁþ¶„DÄä &[ÖP*7ø9¥XÍóáµAêàçpÄ ÞÓÀþ@ñT’ɇ.ãµß¤è˜íÆŒ 1,6©h²ac» +wU›Á°ÛËëÀÁÀwU»`[øxxÕ˜:xçDõ\@Á»aê´X3Á»a è?Ç3Tgv¡ƒ;Û<ë6¾ ®b‚‹ˆ &x0X&5\[À¨Ç»Àà€¥Ê˜²p8°Xg¼)¦Ûö§q¢s0ñ-ÁaÕÅcw|̶÷ѱ‰•ËÃoŠ£ºXIà=-ÇÊýk\”•ŸMŠ• ϨÃ0[: »œ°|N€C Y5™ŽªpS‡‘Zúy8„“L 8„ /¯­ÔsF` ¤šj†øË½©©75µs!ô¦¦ÞÔ[D¿ùY,?«†+ð(V»¸ö ëaŒ  œz¸|e^hÛï†Éaœ¾aäqà& Òàs±uN‘À“©©@ñåž'W?Y‰¥¬±ðl4ÀŠ¿¾RRx÷—bžoF©` Iƒãä¢+0ØkÃö(¶«6O$>æÑÄ¢æç©èø‰¸·@"1Ü8Øk ¼J9×o,O‡Ÿ{ŽFoN¼¤Ë³¡¾й Å9|¹”ùö¸E9é(sê ÀÂN[3¬ÅïÓãV%ÌôŽ­.MáÈb£}¤ëÊ9V)¡O#¼z+I‡JO€Dõ° Ò!›lÍàΈ2ÂThdP Ø2òfV"ÄSñ`Ñž`m†v\k“íÐ¥%å• ˜­w|uvtàCÛB_¶Zß›í⃽¯Ñ’Ê8~.¾ò–‚ ÎKôLZ—è[9žþ”6†û´ºYßvާ;”ƒ@™àµdà£S6YC m ' z›>ŽE$š…¯$Œ÷{opÙS@Z ‡ÚÞubNÂb4Wè‹Åå«]:u¯»0xÝ,wŽnt!ØÍ—ž1ͱ±kõ±$ï]¹¤‰‘¡÷º”KØåæýBÿqpo ¯ø·]|‘É5¶gÓ+ô@ø—™ wîâ>p©¸¥:ü2&ià;ð…îl™lѰì{,•¶*œãc»y@OF§Ïœã qðEgº€LÐçÑ’œÜA|Ö® Z.6NÓ1‘õ¼80Ó2"·,åÍwÖJàßœ1k€¡UáõZÒQhuÅ–+ÚŒ‘8O1/sriÂ8øtÿ8•"xféN ’"ÇÉ øl¾iÜé!×â™H‚WIV:°øqZáˆZÆ@Ž8oˆlk†ú÷+ÅÒK)é~¨frº O°8\Ö²ó'êã¬Ûx¬Œ@™ 'qt,ÈÂz*aè8ýø¸åd ªdv‰ŸÈÀ´õ¨1䇈b™úbßGiO)ëq?×-9ÑNŽˆ}KÅl–ŠÑÏ7.Sÿ|³k£EE'^¥ûÍ,G4 #¢¤ñZ9Ë2ÿÞ–'¨`[|£Yx9æQ©¸(£zP‹ ºÁŠ»«G`3Î%'‡Ýä2ƒ·rWw<Ÿ3‚áY¼òVw¤jÂüCB€aq$´EqzkâIl¼xﱇËð4)ÑFÓyeˆÛ3å8ìÏ A‚ÉAœ©ïÉŽ-â]–»–ž d—XêÍ#>áýð'´ŸàEç4ëIœMÙº»â%¥„¥eÎ"³s•‚"9˜*~HV玿ò˜£.½=Ú^§©ZG3pl™’l¢HÄ"6ÏóRª&8oÁ1|°WX¦²°«^gÓ$TŽÞG¼º»…‰î”¶Í”«½Š—{U‚3ýïÔ'úuw"‹þmq"®,ÄÕ‚¸¬/É+È+d¥vÕp‰t:º¼&ð¸1UØseÝD%K(xHÏ»æé±Á5À„•EÔ œ¯è„¦ ý𨲯éžxÄÑ^¢r”“y•(ú¤ã©Êçn- }¡ÞÅrn~Q#'TŸ4&oa`·%|Ì!¥Â*±LJ*6£ñˆ“h¥$FDƒ^Ô)šô ðÞæõ×[õT°êÏ$~º‘s9ZLˆbtè×;öÖÑDΩ!Á›*ê«'”‹\x´m̺…ÊïMÉ z<å]‘§!ðë aª;·æuŠxNºÒ‹ 3ZP“-Œ&úq|•s…€?ʉ,æ•Ö±ÉIºiN>sË*Ÿ¦i×â!à¶0,qŽþRÆ+mˆLr‚+Å«Q² ^&Å£"P^4¬“ ~Eó• ™0§†VÂò‘Mâá’×Ü„ȉ¿ô„ç/°Õª0=µ£tåe™^½Í`iEêéw¨Ô±‚RˆiÂé$Ðpô]Çúš+'äâ°9Ïqòðær ErfäôƧ£sËœR‘ø;§z›e®ÙVÙ5;‹t—®’“°¨JÇe °rx È †b!†Ä‹Àt,×ÍÌ€œ¦{ïÄÆScœ«ˆù˜ž¦Œó^²]©ÚTV¯ep îž· ´çI¶É6½3ŽhÀZ$Ä2l!JA{úÖr>"`B>è[+ŽçFB¤û!£ÿ¢ £Ψ.NF\Ù±ÚtĪ´#ž§5*Y¨·ªZÜ^KoeÌY¨“ª8ÞrR|° ïìb9·ÿ2:‘q ?. Ïc?!œ(Pn$£¼hꋱ_+Œ¬JHÔÜmŠá’êÏÒ ¥å®*jÜìNÏPóîQxfÏxtÚ;xÝqk9H;`¾œ–œm»¿¦yqX.Ý­óßPtDfsÈZº"!ŒýZ?M^9+˜á¥qæ‘Ћ­Üñ™cDõœ,`cŽ‚gðÑó,šrÚZGP?Uñ‚Œ¹JÆ©Xp¸¬¡SŽðÐ0eYØeƆ<Äà® 4ž™op+ªr%ŠŠîâH¾“±¬Ý¢¨oƪuô G‰àí±wr²ÿé8ú¬"tÝrR™–n…Œ‰¾§:^‹Ó‡&ˆ´Æ…R ŒîЄ<‡n즔Žú´Xªª"qÃÈÍdˆÍn2S¯k©Ê©†Þ#ßsÜ–B=EoÓü°GÙìFE ‡ô.=¾[×Qê‰Àa¤Òb•ÓÑ âú{TÜ9ì``7"Ý(ÐWfÍðÓ•½µ1rä–HqÑ[“áÞš ÕýÅÚ\+AvØ«ø$&“D„.§«…^~¦ÈwfìÆÃ˜CR† M²j‚„ÇÔ¨$ùÒ“¶, .‰ê¬‰怪î¯Òè˜RÛÿœ°8„"›ùö4z§kǵÞ1ïU<_Í$xz1 ‡cef¨`1’‘xõ]KŠù¾»åAn ™‰™$”4Ó“àKÄ.[Vˆ@Í‹ÙÑwaëš'dd1Md#«-]ö­ªŒ³Û!1M8O² «8ÖÂs½X®»ŽY,:"\Ô2#´Š‰L+‹â?Ë4ÜrÝ Úy«¨¸¥Ï·ÃÕNkGï䔓ŠÌRu»•¡:Y5må•!-â)yß5òD_™|»(´ÀVƒÈs,9Je”Dòæ!.N“§¡Q$A“ÍѬ=®[G¢ÇžÜO Á ;澰℃ãûTh:bm¯#Oâí_…8¿4ñÓ8à €“íLÏŸ±šd3&°]F—’ WEME‘Òq]¥¡2ì‚g~Ž«Ò¥s}ô,•¨ÏB “(•-UX¬`"Úrç§9éaÙ•ÊG”’¡GE4{@[nDÊÜœ%Bù¹NéŠH”Û_åñ«†¦sƒnj.!ˆËN¾ðã4:oÕVªmÍÄYBæ¶PGQ$`}¶»A|„¾þœSiÌLp›ö7vW¹øž¥ÐÈÊ^s,†öz6tJcÏó²‘éæR‚Õ»ºBÃ/Ô^<®/Ò×AˆÆÝ{Ýæ B‚¢Lv-cŒxÜ }\£R^³ý³nÖJ&`(HARF-ýÀ›Ýn!iß¹$åÄðu+š)‰Ž¾×VÎ_üpZ E*d6¼˜¶…ïõf?¦ÕSÊÿ.ÝïOjm¦þ7¬C3KÿÍëÞîßHx‹ö‘H5À=!‡F ðáphê»!ä6m»^ôijކñ¼“Ú^´Ñë•%ûmuužåY/O¹ _iÒ[iúc?:%µŸ£Ë_$ÈÉj“Y»·5è¯ Ï'ôB>õß{KÔð¿<¿ÇÄ YDÆ«õWÏw©›£™»gÖžþ;ü˜xøüÅê°üõý·Sû§¡z= _‚ç!øÕøAêf"Ó=³Ñts Å¡©ìÚtëºcw?Â>Ú£'©æM©'ßOÍôw®Ìr¯i޵»)KV½=vÎ,æÞsø~g¶ûÚcï…-îÝm>F·¿ù?»(Ž;oø}gaâ{W zå°Ó¾³ìåÝ—µ@×~®[sͶôÝ^Ô8i·Ô!ÒnãÝÀÜ‹)ËÚÛð”@¾3â5-ã{’xÓVö§R£~O?wÎ2ãÝóðÞwðáýè %ás8Ô_üäܳ< ™)’z¨ŸfÑ¢‚ôðåå_ÄzèR endstream endobj 1592 0 obj 7528 endobj 1596 0 obj [24 /XYZ 32.1599999 454.099999 0] endobj 1597 0 obj [24 /XYZ 40.7999999 499.219999 0] endobj 1598 0 obj [24 /XYZ 40.7999999 367.699999 0] endobj 1599 0 obj [24 /XYZ 39.8400000 262.100000 0] endobj 1600 0 obj [24 /XYZ 40.7999999 367.699999 0] endobj 1601 0 obj [24 /XYZ 39.8400000 216.019999 0] endobj 1602 0 obj [24 /XYZ 39.8400000 216.019999 0] endobj 1603 0 obj [24 /XYZ 39.8400000 134.419999 0] endobj 1604 0 obj [24 /XYZ 39.8400000 134.419999 0] endobj 1605 0 obj [24 /XYZ 33.1199999 452.179999 0] endobj 1606 0 obj [24 /XYZ 39.8400000 262.100000 0] endobj 1607 0 obj [24 /XYZ 32.1599999 568.339999 0] endobj 1608 0 obj [24 /XYZ 33.1199999 566.419999 0] endobj 1609 0 obj [24 /XYZ 40.7999999 499.219999 0] endobj 1610 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 768.019999 143.519999 775.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation >> endobj 1611 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 759.379999 168.479999 767.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable >> endobj 1612 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 750.740000 151.199999 758.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 1613 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 742.100000 271.199999 749.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio >> endobj 1614 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 733.460000 146.399999 741.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp >> endobj 1615 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 724.820000 151.199999 732.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java >> endobj 1616 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 716.179999 150.239999 723.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl >> endobj 1617 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 707.539999 158.879999 715.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python >> endobj 1618 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 698.899999 152.159999 706.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl >> endobj 1619 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 690.259999 142.560000 697.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r >> endobj 1620 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 681.620000 154.079999 689.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby >> endobj 1621 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 672.980000 276.959999 680.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers >> endobj 1622 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 664.340000 164.639999 672.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw >> endobj 1623 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 655.700000 199.199999 663.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 1624 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 647.060000 275.039999 654.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys >> endobj 1625 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 638.419999 238.560000 646.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin >> endobj 1626 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 629.779999 230.879999 637.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives >> endobj 1627 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 621.139999 256.799999 628.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 1628 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 612.500000 216.480000 620.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file >> endobj 1629 0 obj << /Type /Annot /Subtype /Link /Rect [206.879999 508.819999 289.439999 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 1630 0 obj << /Type /Annot /Subtype /Link /Rect [178.079999 463.699999 275.039999 471.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe >> endobj 1631 0 obj << /Type /Annot /Subtype /Link /Rect [272.160000 393.619999 346.080000 401.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin >> endobj 1632 0 obj << /Type /Annot /Subtype /Link /Rect [206.879999 517.460000 252 525.139999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org) >> >> endobj 1595 0 obj << /Type /Page /Parent 2 0 R /Contents 1633 0 R /Resources 1635 0 R /Annots 1636 0 R /MediaBox [0 0 595 842] >> endobj 1635 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 1636 0 obj [ 1610 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R 1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R ] endobj 1633 0 obj << /Length 1634 0 R /Filter /FlateDecode >> stream xœí]I¯Ü:vÞß_Që^=q–€ €ïµo€,6EEàîN£7âîEþ~4P*‘Ôy8h¨«gàÙE ¤Hžé;ÿ—oÿuûïÜ~ûö¿·úï·o/Õ½’Õðß­ûóÛ¼ÖwF‡ªZÜiÓýwûñóå×í×Ë×—¯íÿ½Ù?¨ÿj/Ž] /üÇ¿½ü>tþ2´|{û·ö_ÿw£·mýõöÿÙþõGý¾î†Ÿ/u#»üÏðB ­Ûóuÿòòï¸ý­BÝ¿·ûÿo´!•¢IÃø5=Jú?óG¾ª“¬æ7Bh;HÑÎÅßÿôòçî“RFG磣7~sGè>ôWëÒöú„Ê}Mò'VO¤úu?â6ëT´+þm—yS2˼Y¯)6oJÎæ­û±×¼¥î·…¹/1iM?TÙÎY£;Üc–‰ëÈ{­ýoš9ý#÷äÝk©ÿÿ¸jÕ²rRñ…©ÍÖ‰"Ucu’4ñÄ•Nеß »‹N(ÿó{]Wê¦Hÿ7!uß*oªêoìî~¼ÈæNHCëšè&YÏ_¡éÚۇߴèf=LìHû„5ˆö6…ù?Z!þúc6ˆ3ÄÕô1¿V|ýþòû{Ó©%ßÿÜ^êu›á¯ïíbñÛoÝ(êÛ÷?Þþ©ȧ¾}ÿë‹hÕšPÑëBúŠê¯Ô†ºowJj%ªù­¼¿ÂïœõWí¯¨{Õ0ó¢Àgà+àÛàT¼"ít¾ømx6鑦o btÈÈì·§_»ëHÈ]pÙ-½l_¾·$ùØS Önng4#…QNæ w[¥PÂEw?#ã Æ:áLÓGßÚꌜjÒ ?ÚGˆ¦³éžÊ|G5ï£{`h¨3Ÿ§ÕGÛÐ=2G0ß!Ì>þbñõ-è”Ù*“ÛGKäoïy6ôÛÜ[LL…q{0I3uTöK"øýbÏ ÈvôýÔ-Z·fj"¡v;ÍBPüñÆ¢Z‚ZÒ©m°Å_Û4¸ñﱃQüñzIüqeuÐ6Øâ¯»‡Í_a~Á¾âOðqiɰ îuS™;u…Þ`‘ù ÏQÅBfr^‘÷ÃL·Ê·¯4XJ\â8)'ÄD¢BÍB¥œT–”“õ’”S•%TåH¹þžÊ|G5ïc’rR.I¹ÖÎ5ûhl)×ß#Ìw³=¥\kl¢ŽV_ ×»2?…tÍpz¤œ$§ðƒ·º3Á¢ïpBp:©3G0ùŸ˜gÁK¬q¨É,fµš7Œì,?év¤»"jàí‚X{g¿~Žèœqg÷ÇX®îÞ†Õ XeuFâµÍø÷µM~¾ˆÊÙ7‘š*%½Î[³›hÿüýO/¯›‹Jë~o6Ó¼è½RÝ¥"Æ^a_g¬{g÷Jò0Õ¼!yÆDEvŸ1Q¸{)&Œz™†B'WTì¡çkSCúä’fÿÉ¥£-Oa¶ XuQ¸Y¦óTðyCú,3µÿ,sîeú ¸rÐä‚§Ÿ?LÞ$žÒ§_ˆý§_Žú“scÂps)Ùc+ és©ö—_¢ž¤ÁÍKýR¬™7¤ÏKs)ÕÔæ¼,í$[‹rð>Í‚ç´y'Éæ $0.É0.‰Œw d0ÜS™ï¨æ}Œ$KÀ¸¬,`¼k° ƒáa¾C˜}ìH2ãdpAñA¨-ɤ61ZÍ ÚØmGÆ^ Tc¶+7† ܽže#…Ì ‡°‡†X%x²¢ÖþœPŒÝ"Ÿ/ùeQLŠLRÓ&Ù’L2ËÖ5X~°®IÖóW ¿¨é“tÉ&©åë,?X›¿Âü‚]ý`’í¨ÍÇ®sDIÇñC‘01ù]vΈ>2Ш!Â+Ðqï(“ìa­š ¡Z/·e’/9ʤ°e]ƒ­õŠÑQ6{G5ïcÒzù’£LrËQÖ5ØZ/e³w³=µ^1¡íoÁ–OŒxÀ`Îú¨"ÄЧÓyµûéò¡‚Á´Ò+Ž¥ÞO>5$ -'ÙHªºÈé(ä´—1¹¼]"ù½ÔP×ãø8²%¢‡ê/æ é|£Þ€”õ@^|ãÃòÌ`¬'™3£!›ý©ª’ îK‚¡;QUä” ‘Sní’¨pµAϜݑ5›Å ¾È+k-WËI(]Z? 9%ºV €¢Ô´Ï» î©ÌwTó>F  å €"Êêƒ(îæ;„ÙÇŽ€¢#h‡ð~º «ÓpTMó:ƒ÷ãÄøAzȪ¢°È4e‹âB¡®MºTG',´6׆+e¯MŠãF=R£ôïzÁq£ZnøUºËqÓ5õ®™éú—27ŠÉÇbÂê€ ÛqÓßÃæ¯0¿`WÇâ#…^À^HX{q˜L*;ƒ`E'ùGémˆàŠmB6²¢A;y¾½LŠ?âøúÀô©¡œ0 Cþƒ’Ž/[gÔî7ÜÔ…~^Þ­†ž¹j­¨í_eÄT%¸ _`ÞÇΨfŠãQÝ‘@‚ˆõpú[ÑVX¼6©Ãtœý£éÆÈpÊÀÍ<Ê÷^se[lë¶ü8JÆqe€ å9ƒ?S)— öÔ$– ÈŽ†™Âc?v‘U DÄ2_€Ñxå8€QYµÄ AE@Ê0O‡'ÖïÃ.dœ—£•½S¦æN­2ļ- .(]Y[Ò%‹Wîhõ’–FòZ\r÷V_M& ‹PµŠèÝ¥“â— •à€§>|ð.8l6BÇt‘ŽJ…Ë*Êøí5XCÁà°•„À,Ÿ3–îx ª`Iæ+‰É}£¢.Âmþ$ø*BæM´r›O:Ö·ÎǹB0¬Ï”£¯g”P{ëÉÇ >9·4Ö-Zóh@³’°;ã&ÁjÛié¢'¬©íg¨==…ò®!]gr—®¸o{dÐ[F&E¾Õ°¤‡‡ñS0Ê•ùÿvè Žê·¨q±ìU,®Ï5Õþ@ŒÕËcãûë àÌé¦Rq·Ñ[1}™ªaÇE¡1Kà¨FŽ/ ¡t#t¥Ý±íÝË”»3n]¸&. G`¦œÙ+[\+UcÊM§(Ì0 ZŠØø98NŠ9ˆñZ‡Þ1H«[,œµ" ±ŽYYÛÊ.ŒX.ÈšYqXb"2âö×Dv¦xLQ!DÀG–ˆ±÷ ŸUÆŒŒù”]ÕæQB@ÿ–:`SÍÂ-Vߤœ…dv ?^¤˜…mö÷pã|ÞA{ûð›ë˜OóafwÀº'ÌA´÷4Æ+³ƒ>泌˜ªK‡O+óÊ „¸rÔBX u8ÁsWÈT6[ª TGžë¸\À«â­?ˆfÃà…<phB/… ÔâåÁ¶òfŠZ¼`/Ô#FvöbB©}²3 ™Au1¨ ŸRѹ”ó†]‚R¥´V¶loXOî„á—)Z6B+DDLïU3ùŠØL¼’3è•4‹•ÆØ(“öšÑ¾q¶¿+a]ÑQ°¹ži g4y´2½…i>@mÁ9wVw'ìó t¥z…ÆD§PQe…îkêVwè7 ßÁ>¼8pqiV4ÈyçNòÀxå38DÓë¹§kl,Œ`L_Xx›„V¡z/M€}¬ª¦³Ê„MœÒ·ŠÁú²žý„0´Ùwy5§ðà_2'†&K|éyrIÏi²}˜¬ÔbRyïáŸ1õS†&.$~ã… ¯¤”%%!¯1«ýîPÆ›w®Œ0Gðqž¸è½«ñaê ˆéû)xeˆÏé‰dÎɱ½–¯ÁS<ä Ê›¹AÎ)Ŭ„çÆø;aÀچĚèÙ+o$N烥@[՜ɱ\06!0ekky££S0…(R<%L/<È]O§¨b >}fW#¡&U_gìN3'®ÚàØìÎ÷i÷Û…$Ÿ7ìâØ$Ü$‚Êd(RYS½Z&ã³s‹S¸AûÏJ.8%à’šS‘úî Ñ'¨±ôAö°GßÁ¬å‹Ý‘[ÄCk¤«x<EÁO‹„ŒÉW-£å=BhHqUŽð”fûŸxÆò¿Çõï†Ô¢Šñ¾ª1Z¦.óˆØ8WOÁ Úé…§ '•€ˆI%Lü †É²ΔĔó:tÝê¡ÔÅLvl„!fŵҲÚ9öø0Yô>°—H6é‡7`—˜CðˆgwªÌp¢и(ïS§¦ Cyì¹V°C6‚/moÇEm  =„Óú¡ÄÆËZÔÆeŠÙ’SÁOΡ/s„"ïÔŸ¾ñŒ.y:Eð—‡1á÷9ê1D Ÿ¬%åüzLµ iJŽË/ó>¬L˜Í³í§7ü®Ì¼“ËGl‘Úd¥W\Ë)ˆ6aûÈ BÓ÷c°Ì[—ÒYŠ»q°^¸Ÿ'a7+xäÌ"¢m&sÐ@BÌv~„€G³€¼ñJQÑ”'›×_VLÌh $T„†u'‡>‰²¼ÝXG0¦¨ÒYŽs+Rc¼téCâÙ‰Kgv¡i§ŠÈ Êuwö+¬Bmš¹Uš™h©6u„[(†¬‡üÀ¬'¢žL–ÒÖYÑ‘¬$U{È[v;¥γ›ÐãMum¦}gtó–,:)jK|]".½Mü?hJ@b¢°Dp Ã\ýeSP«Ãd_Ÿ"¯Þ§8”·•›±>ÂbĬOŒ¾“PD¯$0DÞt²\p;©Ìýpª’Á‡%àDNÇA«ƒ@"¦ŠOÕ°›þ v6жXé/뢻(GŒ†O[¸²qÀeYKLœ½.«¨j“ï¯?gÑÃ?÷'+v Þ­÷T…UJ:oØ#Y±‚© fKV\W?)›|•p¶BÝ@¨ ˆØÿÂUø³2ñ˜D߈G" É$hJ›2*çs±éÒçà ñÇØgÇõœùÄð’<7&S2"y¶º)AÊ[SÀ^>lïž;/Œ}ŠÐ-ü^vÁÛ·» àÐxÖÀIòfR”®å­¨"¦:ƒ«Ëý9♘ZÞ£šæÔÍ^©Ü ÖÚ^©g­h0Õ±+ð™•~ÀJäpUñ˜/…gTïÉ…±­ŒžxåàªâðúÄÔiÇï*x}W®¬ž­š H±ª1I6¦4<\²},û"î/š‰B N»¯˜ûYDlו’úðf‰Y^¸ Ìà/…É\Ÿ•¹†ÉüRxvVƆàehÅQV8¬!"Ÿ0åsä^œÓÓtÇúæI4e¡ H‚aóV¶‰*K’ïwÓïŽ@KˆZ^N"ôæ)+m””.4ÅË©Q;UÅsuIe¤ad AµœE Ì/ñ[n,iÑï ëU-z¶yÞÀo/~„`;4ëã³Æ’!ŽrЍ>üáR¤’ î ̬Å«,~ƒÐÆNqøÈ»ÊØÊÈ’|³ÞLŒr¨ ¸ªK1_ÆTSIÁŸl2D ä•(3ÿA+ø\)„­!—b£mžó\œ/ˆZ|ù2?žÔüðk”C22o­¢ÌâœóÁOQUŸ6YÞŒ}”¾Ô¼OÀ-iÅre®nÔ!31÷9r£1…Ï‹ çQ8õ±ŒC'ÇiŸeêc#ŠÒoÆŠSÊa´X•Gè•Í¡c;£8P–âá{¥ôÇÇ”<+GqKšDÌq”rnP/ÀЄ_÷G|$ˆÄÜk¿Çä·#ôŨÉ^ ¤ OÝü(Ûpøƒy8ÁNg+Á[O¶òbJÚÜ…^½ÂÈ’,çŸäÈXD`C+ë˜9gÊ>Ì"Kb(3¥ôüÖ˜­µ 5cÊÇ£Çåyy3z"ÊÈͨàñ,§Ë¦b8°â/áüd¹P÷ƵSg9û<Ëã:Sèqù¬‡š™"£t-x åíw“H)jcx(ÏÊç8TF7²ªÎ,le„^eñE&U,[nù9P.Ø·P+,¦¾Møé&Y„˜p‹ñ Ç“”LÑ Ü3àĹT”—Q‡oï¤ó[Ñ>1±Yº+çü2Ÿ¨®ôTܸå„{gÇå>Y”šðDÍ”X/„"S$Gý… >2¸QpÊþ !9`¥=ƒokf‹ÄAÇñµÅ„¯&謮®ý ¬´¼…ö(«ÿa8òáÊ[=GòËϸÆÈ@Dí§â2‰ÊÚ$RÌ1åį-.ãöUY_Ên'ŠE±€2‘ß ¬Üåtf#¹p{†ÐÉ£œËZò„âÊDY6|a6ˆÐ 9Ó9b\óœÏ—^¢3Š•>ý)W)Â&õùŽl6d«¼--–v›@ºœ~ÇŒDRkžüˆpd­0„½5[ÊzÖ̲uÙ‡yðºñŒiFÛNʽsÇ'üNÂÒ»ubvqJt:¶ L2\à <¼LÝÔ¤xÜÕ÷6òò­89à@¸j¶^6f%ÃIšÚ!)¨Ò)ªüÁg4Á6µŸ±!v——ààªâ+'ô‚ Ûß›5"fÛ Nƒ>»¯¼AË%8máÕQÐ^V×£?ùáÐE®Iû$u×6.uä߬’ ¯ª_2h¤±Hþ*-¢_œ(éò*-–·DJ “Gb!°Ö\/ç™4IøCNÞ[úˆó`%%£;†0Ã‡Äøx1<+&ÂF~^o" *m\4!K¾TD}Ž7G™ôƒ m XÏ\Ù¢žÉÈìÊvÞa»²àYšA€a²ˆà먀¤c®“v7wá8•xEâŸÑ qé ߦ +¼¢ç}éJ^ùöó©´&B˜ âÐ*ÿâÑ‚¸ñ¨[—rHqZBò(åyŽkI&M)ê³¢ò  ñt+§dY‚át±¯Øá_æØÅPÂÓ&2ƒ³ÃÈŒÉÐÃK“’¼œ(s¢.^~`^¤øé.Áp †åz5É`Á€(—\º kx<éVôRMá·°_ö8Á®)HNÐŽÛѰ/xU…®8毛¥n³N¯\Ë¡ pzóLe ¨8ð7Pqøñ |…BWh*( ÊA£–‚W8¬"†p*v¼÷¿M€³Ã`˜6ùÁ¥ jYÁШ¨Â£®À%ðÊÁ«ð>¯)ø=ü’­Òˆ—4Ç!MØÞˆ Ú‹dâH¶cˆ)ßV^Ç™•Øgv{qR¦Æ½äF©½ƒjÑx%Û9V^8A5 ’*…YÌ…9.Lª8½ hHa.Õh„ í§á©¸0ˆí1^Q“Œ³”=_ñj ¶®É[XÎÀo[‘@Å*#TšSxñÿóø”‹¼äÈ€gÚEßá‘DŒ>kÙ›B™{‡–ºÎúƒô1!«)‹œ§uò”xëtè, ×üÐc¢ž} ö»—¥Þ¨ù€¬3›-r»!à‘l™k^ذ®Çªs¬`4[{)Px:µ­ ëÏ \Âp^)¼`@\9i‡÷Á >_á0ò[+o[ñ]€s±0x»ø‚;ž€#€)x…êg’¶ýsûÕò¡–Çt7è¿~ü\aL.G«íë*O[}Ô<Ëi?c1¶ŒÈ¡œÛU7,µ”w¹]ßð»#R†CÕ]-a¦® b–±;m¬t­©‰»žM"KýÔà3 øÌ°q½ÓŠu—W^Á· Ä3où Þ«-‘…/|‡žÑzÊÒ}‡¸gôŠa¾]­'€„]×ý› ¢V[“"nµÁ=º2çÎjǬ‚¶<æ¾²ñšâf2ïÛ@®ÏÊŠ}GŽZ›ô |€¼eÙñu-ÉðÝæÖ×ã¥Ï˜…”~Í)gn__þš= endstream endobj 1634 0 obj 6457 endobj 1638 0 obj [25 /XYZ 39.8400000 512.659999 0] endobj 1639 0 obj [25 /XYZ 39.8400000 512.659999 0] endobj 1640 0 obj [25 /XYZ 40.7999999 432.979999 0] endobj 1641 0 obj [25 /XYZ 33.1199999 376.339999 0] endobj 1642 0 obj [25 /XYZ 40.7999999 432.979999 0] endobj 1643 0 obj [25 /XYZ 39.8400000 270.740000 0] endobj 1644 0 obj [25 /XYZ 32.1599999 378.259999 0] endobj 1645 0 obj [25 /XYZ 40.7999999 326.419999 0] endobj 1646 0 obj [25 /XYZ 39.8400000 684.500000 0] endobj 1647 0 obj [25 /XYZ 39.8400000 270.740000 0] endobj 1648 0 obj [25 /XYZ 40.7999999 326.419999 0] endobj 1649 0 obj [25 /XYZ 39.8400000 766.099999 0] endobj 1650 0 obj [25 /XYZ 39.8400000 766.099999 0] endobj 1651 0 obj [25 /XYZ 39.8400000 684.500000 0] endobj 1652 0 obj [25 /XYZ 39.8400000 602.899999 0] endobj 1653 0 obj [25 /XYZ 39.8400000 602.899999 0] endobj 1654 0 obj << /Type /Annot /Subtype /Link /Rect [179.039999 344.659999 203.039999 352.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.cygwin.com) >> >> endobj 1655 0 obj << /Type /Annot /Subtype /Link /Rect [213.599999 344.659999 238.560000 352.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 1656 0 obj << /Type /Annot /Subtype /Link /Rect [179.039999 228.499999 204 236.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 1657 0 obj << /Type /Annot /Subtype /Link /Rect [242.399999 194.899999 309.599999 202.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/svn.html) >> >> endobj 1658 0 obj << /Type /Annot /Subtype /Link /Rect [202.079999 162.259999 276 169.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org/download.shtml) >> >> endobj 1659 0 obj << /Type /Annot /Subtype /Link /Rect [286.560000 162.259999 401.759999 169.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://sourceforge.net/projects/mingw/files/) >> >> endobj 1637 0 obj << /Type /Page /Parent 2 0 R /Contents 1660 0 R /Resources 1662 0 R /Annots 1663 0 R /MediaBox [0 0 595 842] >> endobj 1662 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F1549 1549 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 1663 0 obj [ 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R ] endobj 1660 0 obj << /Length 1661 0 R /Filter /FlateDecode >> stream xœí]I‹Ü̾÷¯ès ý©I%/3ƆBÁÙùBœò÷#µJj©^=µ©JRÏÈÏX*Õúî[ýô›¯ºþí¿×Ÿ>}ý÷õ»þùé른UÑÿ¹v9}ÀÕMðþ×Z•7Þt®ß¾ü¸þ¸|¹|iÿýqaÕýCý£}9 ÑwøßïÿºüÔ~éŸ|ýô»ö·ÿ]ùõ·íÿþqýÃÛÖýu ~¾¨¦ê~ùgÿ ㌫ö?Óߺ—¿üþ×µSP÷~»)ŠnÆ«¦ñcü”ÝÿN?cWQ7í¯ŒñöŸ²Ý‹ÿüåò×¶¯q7Ué?ðwqÔU¨ZñvœB¶׃|I±ü±?,~üvùé•I¡ºÿö×v{îPÓÿøöóEv¨&¯ßþ|ýUQÈâ××oÿ¸4·²uÙCYÿ†5ðÍ z#|#`oŸÂ{c¾)Ñ›BÂoàù1¼·Ï ®§Àû†Ï§‚½Á-^Ãϧ¨Ñ¿Áo$ ‡ƒ˜Þð)à=( Ä ¸×xñ®ÎcÆFËJ1Î%… !i÷ZãéË·–¢®#ˆ:ry§Žå@‹~.Ê\ª|Ìé³³ÅW ÎÌÙÇ@‡êª¬x9ÅÆ·¬ï¬l%ÅfM…榚bÞIA:)Rí4+ecgEæAO|†o Âz[™a²‘ ÷Æáç†þ!Õ1¢3dµœ¢¦Еý É›ì'GHÍ£i´§qõ­|Ø«{ØTŸÇKØk@Õ3µH9}Æ£deÍ\ñÞ˜½22.^ç "#–ñDÄ)‘)ÁùkÂ]cñ•D¥ tÂ[ X“òXˆeñ H÷þ˜À!bÓ3 |çh¶)-}$;R£Sí®?5£Ã¬ÉÂ?fg@¢šoîÉ€ŽÌ€ãÛ¼øOǯáŽÀ ç/ÞÊBWƒ¹ZN.#Jg¨>dHxoµ61¡Ër¡éÒyÈ&ÅðzÄ)&¼¤‚’¿L“BÉq¢”ïoFðÓìPÖ&3"Ê­0ÏŸ¤æ[ŒK´€ÞâJf´….§î½D)ºŸ\Â1|¸[8yu AÍaWEUÓÆW‰ ©Ø0ŒM¹X„Ãß@!Çqo؆€ðX¼ÄfslÆÜß<Í¥îN{ƒ‚tw ìøL¡ÃòRìÚÁ§OC/^)V@60ÿºI€rûÇŽLÞšçì¡fR ö+¾Ÿ½~cÞ©VØØ;EdRâê[°âVÕwá×l(ÃÒ¹ûJcJ0ʤ^(lhÆ)ªxØŽØt_$5NãÄZl ßÐV1·l+Ò¹¿Wí$i‘$í)ÑÌB66:9Lˆ1±{J_S³èkº§!U%'QôÌ5Ë[]oØç¤ß4è›QùÄËT B{¯àqké¦õ q×)uT7i††?*Å™ãðË8ýzÊ'Õ>¢Ý‰Y)ÞQ­©-ÌÍ2¼;øäà¾YÎîŽe^á ŸÏC$§ýêØƒœ[7s”Õ–äV3'/ð9ܨþVÞzKÊ„Pr¸íd¸Q1વ7&nµÙ–˜ãÅ€ŒÑ")E!þÎ:ê´ñ^ÇÀ&œÉPÉn(«T3Ìòƒž?5"c[$1[#Éb ¦-·ãÕí-pßRäï& ¸4 š_H¾ öÌâ71Û¸r´´³9áe¢|:þÅqÜщÙjz†ý¾É‚ZˆÚƘr{áÃ*o!†äŽS s$+»#J–½^“J&9\{Ú€•ݲ-ýI›¶}{ÁL›Å(A½e¸éñ6'2†ú÷’ Pèo§;ÇÒ?Ô*ÀÓ˜(pÜÁFõ7b‚è²d³Z$³$Œ'iAiïû8sÖéê#â&ºÄš" 19¹k Í Pw2Ežb©ÍŸÑ2:‚ó^9õu1¯Çt’L'óÈÌ$Cж$ œMÎãq‘0Ô<Tƒ8ÅÝk¥U'b¨zDÕ1_%e¯0£¬×Ô7ù8mXkÙ“ŒÕ"ÊbÈD¶¦FØ*VQÃ_†œüÛÂJÇøùZh­[C€Eª¢j¯Å(IXUŠ{]ðŠ= ?…}=^Br|)’¹0§$˜Á8ký‚ƒ¦™ä#Æ|ìVÖ΢‡°èa\ŠÅz 3¿’ƇØúë`”'‚°ë0ì–¤ŸÁ¨“®Ò—ºv·„/e¶Ý»ó91nNª2§=mÒ˜M4ó7ѯÚÜ[N̦ ¬)ÈÔøÚÉ€Í9±NÁüx¸”¼¦ðEÚí«ùdˆØ _ë(‚j˜>Q5¼&ÇýW¦ck}ºÕኜß*yNY7k|R‘+5^ˆhI¯Ôâi9 ïã ŒŠ(pAûˆläÏ{-$Õ_‹I«y=ÄÍÈC̯n©À?Õ¶·äL‘’Ͳâ…Í,äÒi ó>ÒðH°ú%2½Äâ±Än¦ÝDÕ=äìÚ'‘NüóòÕBÒòÐBÇ:Ù=§qÄérÝ T5_vʇÈݘ˜7¾§ÞNlvêR4{Ÿºìí¢–SßßJ¸¦"21ºø›ÄÒx~v,f\–"aØÿ(i9í$Uüƒ`BBPü!e•¥))×_冥ԞµðÆ$˜±i)¤ÇÜñP1á+X#°¬¨?AE¿ˆ ddkñ ¬Ñ°OA|‚›…U@¬è8îp,a¼³/¿†<Þ“þ jÚš@5ŽïJ  ‚IŸá*ÜH³y§$¤LщÐK[›/ b8‘›7f1_<Á=%IS˜l‹ÂíaÉÐpG-½i_^³îÄàùãÙZÎe£䆅t’‚|ü`¦unvãÕŒ‰éÛFŠË#€y·²¥Fe »o^N"Á­8Ï4ùÇ1'nlÕ{’{ee0†UFkCþg™¤T;Í6Š–ÛH/ÞÄ3»äYq!gH(ÇÖÉŸÄ( æ5¦Í+~›†ÎT¸jÃd*C¤pþvaÿÉΟ玃Û‰òk”¼qnÆä§"Œäv€CbR”²OH]aâpAOn=5O)˜˜¤XË>ÊgÎÜgeмg2^­)ó` 7ƒ ºFYÅ”wK=H[¨¹#k®1ÃDo¦Ì¾ ‰3x¢à¼n³&3I°„Åßë–¨pÈX^±%ÆÔƒ¨XÎ çº6$ëw„”©LMJ“ãšt¯Öì´™å×øä˜BDk|*„Íd¹Ìk¿Â­O$(ÝHœ¤”àÖîeÛ®oT嘓-oÍlá¾þ¶0¯Bxhü¶åúwaº‚o^"z+à7DP0×¥IÞ’¬€ÔÏ„ŒGNëA¬ îØ”¬Ârp}yöSgÏ/¨1ã ÙóP,f•9•œ¸ÙTsäÔl„ª ;á:` ±-qîÛDiб*Jšj¸¡køaŠ˜{z¨ÿ¥Æ!ÉXDHo”¶ Ïûu'&Ü^" „v”£½þ]5×–”rÈþÖÿ/oJõµªï?S÷§íƒjÅÔ¾_ªòÆXÕbC9ëBNh›÷ÿ÷®ÆÇÜ€w_Ì'Ѷif]4óþ~ùø‹\Ö„žd–î»g’ TZëËã\’fÝZ–…ù0-ð,ßóEö¨¸íK£”s|:LMŒvb]&@ñ¨„¢¦ö©„¢ â“ßEWscȘê<1¢Ìá" ŽçùÎs1ÄFÅ8Þ'Ç£l‘;„㸮ºd‚hÍç‚h-–Ѻ4äÄö)ˆvmä¬ 9`Dk¶$ˆÖ…9@AÑ®M3뢙_­ﬡ”òFc´ý#óTÁߊPž*{Ò0¿Àóq},)›R#Á×…Ñå%˜ñ8!zKÚ (Ç?·ãrV1àõœE„GkJœø‡»%.qàÅÝ4àÿ©šÏMþ¦Ì+G4ºe®”Ö¦·Fý¨øåŠÄËîŽccîÎÖî¸(;óª.êcsSاxŠØ¹/R?~tæ: y!ìtùJÖìÿrNÁ·rD¥­¼¸æf‡÷Žè» øÇ¹Ï7¦PN W%“MQÃ4Ê¿aÈ_S:g¯Œ¬ÍÕ/<µ5ffÒà¯òõ'ã cå&m\_+M=¦ÃÝq×0s•ý»Õj2å†4#¤%éu꧘[O†³-Ãñ’Mã3…rÆ •jN„¶¾êÍ#Ì#¦0Ìzeí…­Cò¤¬ >²úkéºP£|*b¢‹æ´íÒís»ÍbŒ0,K9}ÐEæ9án Ù cO1- Ü7îõËk§¡js½[GTvS˜“«ìi‚ZJ«Ä|Ä¥½ÇiW Š^5|C2žp&|C“ðpØÇe>¼D`ºœÌž„͸qT‡Áá×þ?p¶4~™gŽ÷ )¶â s¬H³ 0ÊfÎÜp¢˜Ê¾¿õ«–¯2)ã¼4è|žBŒ8æ‘T„تþfÒ2F«XS]Úß:”¶®¶Û„’`æ¯?GC€],&$KÝœ«¿S8!VyÉŸ¨Vk‹B±5¾©¼*Cz|&?ÿîIŸ;R4¦Žpºü™”`\õ:P3V¢úqúLÆÉˆ€fÅÝùpˆýÄ0dºXæ0ÎȤþŒ$¢1¹Ür|v‚Ì:$zŸ\óŠDç8amÏ6åEñFãî̺#S£Ñ˜ÕÓ»Ymp޶ =¢&> BX|NÈ«µXüV$½œ´9”„šÓ†ºV{Ó†n ^‚íû‰‘Ú)ÐjÝVX‚tcì)Ã?-Ø£ªÆhúN‘ţ猤l é.“Ý+"ÛMro¢›öu¦Uv%š³2`§9°&Ó,QW‡v^Ž—y“H›é*foÖÔω)Í8d†$À–$_"i‚[Àm-)8èáP4«/¹6¨ìÖ•/Ü£þAÕ×Óòœàxáy«ÿzè²nö“¹Ò#ýÔL&»z`œjæð é‹Š1Ñèš`ÝSÁÚJ× Ó¾_˜¨um±±M5ŽÑ}Ð?è?»Î¿ç•1Fû ûd:®žçÐÇ|]q²íõcVÞ¥t.ư˜½LNâ3BFR8Iâ“yéi!ÌhKËpÎ΋©xCµ¬ ¨–õTËÆ€¸ö Õ÷6Õ¼j:ÆÕ²\‚j)Í1$ꮞg9ƒêÇ{Bu¹uÞ÷¨" êææËøŸÌ¦#Èøf]);?!Èü,˜YI3«r 3«ÚÀšª&˜Y¨øè£šŽ1bf%–0³âæœ`f5¢âØÇ|ûbf5øcå ª¤` –7`.æSrøÍÆè½!x+n€·Kà­JôTIÀûÞ¦š÷QMÇÁ[±%ðV…9FAÀ»k£çÉfà­øÀ[ FOî#4;#¹èþ*Ñh#6J?&;{ÿæ™Ø£ïèòÅQsì[ÀQˆ9dw ìéÛTó>ªé#ö4Íö4ÊÀžö‰=]›]Æ>æëØ{D1ØU23  û†„.ú—÷#ŽíökpŸ›«$ÎwcT¤ÕéJx‹†>Œ¤Ì°¶d1ܰtL$åƒÅ`ÒG5c@RÁ–,‚ƒî¤÷6zž3‹ÁdŒ=‘”‹·‰¤1E{hÔVˆœ¤pFæÄøc¢ï>ÖB2+)I`=q¯ëÇΫ²NC¥GS²ó: | n ÛZ¾ 3)†ãD?&¹¯èy2´¼¼?þÒíÖyMäDÛ‰Õ<.T{ÙˆÕ” ÚŽÍXÍÛ¿•ñôÀñ߃÷` âœÆœ’h!5 ‚ɲԈrç«x[õ¹Ó¤Ûûæïæ¼²† ƒo\Ç&q݇€Øí½ïïó#b“Cj2È‚1^Lî„ YTTÔatÌýt®¼Æ<ËÀáÎûUÓ´>ãcKZ¿&yÊq®Õ(ƒkÑ XrÈIjÍVhɯê=.µÃ+Ãî¯NæS”Î~òv5¦7·Yôæ6¦7·¡ÞÜfôæ6soncxs…Zòæ exs»¦£H ÞÜGóuìë(jo®å6Mô°ˆR)ü· 摞åg½Y¥¸¯n‚#îê}9”·(©: -!鑬ðɧÉÕ$Û™Y}YS–/O ç{çÎ o„B½il÷ef²0¢d±õ ™õÐ=0˜Yߦš÷QMǘ™,–¢daD=t fvo£ç9‹z˜Œ±#3“lˆz8™Ù{af¹vkŒ+‡15< ¸DÀ¤¶¯?Z:Ñ’®þñýç Š3¡Â_¬4Çú©»¤}K+Ûe,•ÖjXÕ×_¾ŠB{ÕÛvªêV-§6òFö·x}«MjÓŸp½ð¦ !n¼Y, R–·ª?´–ÆQð›~ÓÓÕšßxq'#&†,õÖãÁôÉgØV»¡VøŠ¾Ñ”fé Cëиö>±µë¹Ý`Ôu¿ó®×ŠÓÆßàÓÞ ®ñ \;´Íq WGçNžh b¡ÍûzÁ3[ Œbˆ G0„sQëÁ§Ì“à‚Rëûž#…æóK›¢¦\(!º~¹ü¹"- endstream endobj 1661 0 obj 5866 endobj 1665 0 obj [26 /XYZ 39.8400000 461.779999 0] endobj 1666 0 obj [26 /XYZ 40.7999999 353.299999 0] endobj 1667 0 obj [26 /XYZ 39.8400000 397.459999 0] endobj 1668 0 obj [26 /XYZ 39.8400000 461.779999 0] endobj 1669 0 obj [26 /XYZ 32.1599999 307.219999 0] endobj 1670 0 obj [26 /XYZ 39.8400000 397.459999 0] endobj 1671 0 obj [26 /XYZ 33.1199999 305.299999 0] endobj 1672 0 obj [26 /XYZ 40.7999999 353.299999 0] endobj 1673 0 obj << /Type /Annot /Subtype /Link /Rect [263.519999 662.419999 315.359999 670.099999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig) >> >> endobj 1674 0 obj << /Type /Annot /Subtype /Link /Rect [148.319999 653.779999 171.359999 661.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/archive/master.zip) >> >> endobj 1675 0 obj << /Type /Annot /Subtype /Link /Rect [480.479999 581.779999 499.679999 589.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org) >> >> endobj 1664 0 obj << /Type /Page /Parent 2 0 R /Contents 1676 0 R /Resources 1678 0 R /Annots 1679 0 R /MediaBox [0 0 595 842] >> endobj 1678 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1679 0 obj [ 1673 0 R 1674 0 R 1675 0 R ] endobj 1676 0 obj << /Length 1677 0 R /Filter /FlateDecode >> stream xœí]I¯Ü:vÞß_Që]O4ØwEòhd¸Ó ýqz‘¿©¤Ä£â9"%Uݲçz(òL<3ûçïÿqø¯¿~{ýþ?‡ŸÃ¿¯ß_ŠcQýŸC÷÷·ts4ºÿY7åQ»îÏáçï/¿¿^¾½|kÿûëEU§‡Ú›çOôþýçß^~ë?þÒ_ùþú¯í¯ÿ;èÿ´ÿ÷—Ãÿ½ýçOÃxÝ¿¿4®ê~üµÿ¡´ÒMû?·¿º›ÿýòoÿpø[;…æ4n÷ß?Ušö‘%ÓøuyUþÞ¾ ¾UŒ³-”Òí$Ëö×ÿþçËŸÛ±.“86•®mY¸þ޸޲¶ýRiÍ¡©uû5K¾C7ÒÂqª²J2N7µl]…*ƒ¥DDåzð¹r)ü\<ÔMŸ®ß’eõh€ã¤ÄBûÊiÑ5å:ÞªÏ-…ž3i°ÐÍG-ZV8NJ,¸³X,”\ab‹¢riÐÙÎ'‰PµþÀߟiÚE[ÛíB…m·5ò‘v‹Rueë"v[kg‹²¬®%žÒ`4ާaªR¥¦›ÍB gëÐ8Bh×¥ë—g̲^Z6Lã’€»›Z´¨Þd oX';kyŠjyʪNeÓÕ±ì´Ûß/êcÓ-J;ýPýÕö›¦9=ZÃ…Ÿ/ÊÔG¥œnšË3ÕxŒêöÝ ý…òôÚÁ{ßúß°§WFóhŸæyc¼ŽŸ­Nü¥ùê+L~^üúãå·×)ù?þÜÂÿd)ôÿühaWêðÎuøñ§Ã?…©þéðã//îX·Š¡.O¦EGœî4— Êy }ºP‹v-‹›w‹×Ó{½Pö޶òæÑÚ•¼kÑ»š¼?#Ý/¼lͦF^TþÂk4å?˜À;ü^J`é/§ JK[5íë`áÏ´ :™€O6œÅ,ÆhNª£VpH6 ")€ix£œR‡¿PÕ/TÙóôE øŠP^ô«ÊóÜðL¬…äùÖR«Z†·ïhŽæ „ãnVø¦©~÷í^–G@—µ h†ˆÁ"-@ñ>32”-¯`Y{G«Š¼¬;Ïÿ#7ŠªÆûâWŸ²²SIã-ºø¹w‡“HAÕ3­>?1YºÍàu} i•ŸRÃwÞ “}ñYÉ' £çž˜³¿± ô3ˆ{²}¯¤Ÿa|¨Òc(†ñÆ@  ú©Ë±u¹ŒBÞ:kúSOøÍ±qÅXÙªJðÌÊaÙ@ÄäÝæ‹î”ú¤ Ùnµ½©Ý\¬ê3xŠ•ôÀË·Ó/SÀìH%·ïÍ¡ŒtOŽLÇþ ØCÂØªѵö¯Qm¶}Ü— pGúàs_λ/çTîííw½óTå GsšÂ‹æ4j*šÓ/ÒÒ^ð£9§gªñÕí7.ÑœÚMEsêÆûF{ÁætÏôó¼Œ1^Ƕќ¦\‡Q¾xÂclŒx9ø{ú-š–¸rô×¹'ÔëÜ’- ïtŠï¾æSB$MÊ;̾®ñØ×¹ ö- 5f­î‚Ǿý3ÕxŒêööuõûºÊcßö‚ϾÝ3Ã<ëû^¿±!û–…yLöÅaDú¨¯â=.°ŠYŽÓþj Ù†IKåeL”j*c¢T^ÆDwÁgRuΘ¸£ºýÆ™IK5•1Q*ëƒdLœžæ9ʘ¸ùÆ–Lª˜HÁœe€%dN”âÀ`+…kó1Ðõæ1ÊÒœ¹Úä6/zßÔõ‹›ù¦®S8 ’’#¾ñh~–øý6 Y tnê›Ï|!Éd¡ŒÉ“Qã‰!éòÒDi!>9Z~Úf—ˆeMƒ¶O[ŸÄ@]9«G‘;–À[7uÇ¢;E¹â\9†éÔ|ÞáWþê4|Ç(ømØxð}ƒw8ƒ/‚wàJ1D5\O?ø¼R8ƒÁz˜‚hÅ_é ¡LÍr†Æ³†ï øNZŠÌ à cA¯'ªÖJyÊ€G•xoÂï(¸ ëN¼i ¼¹éÉ鳜nLˆH8C$-§cœ˜3 ýKx&-ghÈï`-îööƒÿÎöX@­o,ƒm|%U}q·5©x>ì+¹~q3_Éu ª¬%މ&þ]hϧ ² $I©øA®È’„;øéHÄe!Jb&TÁ€@ ªà{Çg}àÔ­B’¹pry;ÒpÑ®«À%HyCãÉ2Àep&ž%I^5'Ý*…‡ðV–ß kE¶6'å;¡û*æ·#IëáÑ1}3ê|¦ö¼“ E;;¨v@ÕçhgéÜí…¿n4ì¦0Æt^o3v3¶ ‰$ÐÉP5Èœi¸ŒÝ”QÀ±¤nW¢”0!¨€I‘Nb! Q+Ø(8µ]À)Šãº@ŠÂ&FÉGÅÊnk8íÙ;i%ûgÇ …ÁíFÌÄfÙŠÁ“·Y@¦ÞŒ‰yœH”$®Î;ª¤ãWkæ HXOÒÚ)FÇ2B/ ;#$ß‘Të’Ü_ѹ!M ?“WõU#c¬¤èÈǰ£9ä—´¸:© 4oɈàÙ%q^do]œ¿f¦k­Ï™®8o*7ˆ£õ8CkRÀ\Ã@FÎôÀÙ8§Q0ÚŸµm9þjÚŒå'ä1ä«KŽ%Î"Äܳg™Wx4˜Ù#Ê„ùUzYža*«5ø†¨ºRÒ6ÑzWž3ÇÌJg’_¿¸Y´þ:…@B%¿–B™f¨ù³ #,EÿF„oÉyí‚ñJ6ëZeóæ;¶w÷s„Ó³ fÝÓoÇç¥åLɾ·f,ý7“#kw”a¤ ìâD6wé.ô´x>—Åc»©ÏkÔxÝkÈëÀ}0NÚÙq¢ë8Yëä*I¥€*æìÓu oç;ö,80cOm»ù«¢Ë’Ý4$Ƥä™d áÃEúÚÂo•¢:Ƴè`ÿEÉP¹rL‡œƒ2GZª×¹Ív¹dJøPˆ1C´w<ÇdPK@]_jÕörÈfÄfþ†eû'ô±g«8‘oÒìïpÏÌùp‰Cºw®À8ŒÐ+>šŽ1#œÜS¥"ÎÌs_ýóhÔ±x¶Ê“ÏIZ\(­G|ãTŸm™ìœÄ×vˆxâ“X„Ð˼yå‰ÉîøÔ†àaœ¼|¹y*Sù•¢Y|0ãm†Ñ¶Œí%‡-É@¤¾ ÔGF Œ$"^=6ç0\«tzåÙOìÅKwÕ%§[-à[I6ücgÄoéüàºÚ=v ãÐkÂÃuv›ðË*ˆ0zl±>q‡ Xð†ËÚ’ÜtÚV‡Bcì˜lû#¦$¤=Î=Bê¬wÔ|Ç¡w4(s¬}Ï©= ñšà¿óÁ_Ï ª£9QÊíJúÎ@EÍÑ7ü~Ǽ£Y+ ×Ó¿ÓÙ=ß' ¡S!ˆâ¹ šM}4ÀÌŸZéW¸ˆ¹¤‘•ië³On˜l”[FrïpI çe!¸1ÛÁÑVc®­Tc"ß Àmn=ÙS«3;g9ÇûüQi’€ù xkŒ‹O…á$ìª#8Z2ÖèåФbžÔ¡iN‰S±°©Íª" |«}ïç+:÷\LC7|H0äÍ™±ÖÕã=„Q–ÉÙTâÝY»å0I=iw™L»Û ºìeQ„ñ°ÃeևάÏúÕÝ€lëdFŒŽ *6#\¥›«1r€çlV•ã†J% c ™Ï2› =ΊġDÈßg¯ã„É27“üåå$ Üò‹Ha T¸¨•Ç·nå„!“š‚Ø±L‚/ω[i}φ9:æ 2Õf,“2Ñß³¹aîøù³¹a‡?xsÃÇHjÈCÉwífO©Öv²>锉ÝNvLJû2¨º¢C‘Gœ÷ˆéתõ±²'r]‘ÖZ‘ðÚëe¯ðßwÎ’EûqX iWõÑ5v,Ë„OÜ!K=oJtrƒ‚zûA<,E]bdÆŸ$\jÈ‚ñ Ö‰öÝ¡°¥³…<«ÃbØbÂJ¾žfø'‰1r6e f7àms‰cuI‚¹àðVIädAn+Õ $­ÓâSöV:#b³L›©Ù‚Ð#ž$³J|Àe²›Žd™Ú¿JJ-% ˜‡8ì`yËrÂþô¢«|f„ö9`òxR戼•QÑ#=Ië:^½G1ÎG9]öçèÊœ·ž·k °K"cdÙ8ÊÊzKÎøkßZòºuP‡Ž„¿$‘ J=¶ñÊ!æ‰/w\Ög#aEt%IR/›RšrJTSÔø¬Ý |‰¡ÊyWÐ]$½—øó?«zµÿƉy[·³‹°ÁA6Õx߇qcíÐâÞÁmŒMÊ<n±Œgï`¼ñWh3 1‡›VÑ«œ¡ëjLz(Ó(/”]ÎÊ„Æ´à Ø˜|–þ²öiöõ ø(i`À ÑJ©ÉIì[ɹ ztìßšõL'ã"Ã! )¦Â*öJ²:ö× haí´ö ·w¼¹âÛ;Þ\ñ $'5d5ªv^qûn¢þB ­Èì¦|©Îmtïó´ª*ï(>“MÊzLŸ×D^PB ²HÕ(ÕFug›eç®}äìBù¥’$ï3¨’T*Ç—ˆRdð;dxFtÝ‚V¤‹ÎÑ`œÑºk^6…X€çÉ”ZRËŸ¤uDŽôî­Ç(×-£&\p‘d§|gÉöô‰G™C[׫äyæ'öÚÞÉ~€Ÿ« kÇKËa8‡RçðyíÜ%qˆU…P_óÆÛO/ä¶n]ÇáË6I†v³YæÐç06묘µÑ¹ñ¤ ŽÊà¥Í¶ÀLÓne¾ I]¹™ËŠj§Ç3Ÿ‚¸¡.½\KKVa2 ªF]ޡŻ>ŸBàÇþ?IE}d­xSÌ~ÿîXJžÝ?ÖìþÑØ‡ðø³HÌ~áö´ г‚Œ!º ÁVÍ“`××6V@}ØßÚô1@=ÉíIʳ8~xœ@"ýܯô á…Ç”¤/ë!„™ÓßZ*íßï–¾[òíÞþùù{€à)§WNùä•૳LÖTÕ®kÊAæTÕw¸8˜ÂŽù¾ªŽÕt„³GààÔõ±ž&äzâNycŽÚM¶)ËcÕãËÇÉÔwøŽƒïôR¥ÖG]˜î–¿OÖìí•7øìÀe+ü@ï Þ¬©; ­c nÞ;Æ8kævb€T×ýÖ¥ª`[áw ¶BØÀ‚`[½AªÅp£4Ÿô‹©5C\(ÒÙ ÜFÑŠˆZ)ääS…àñßò¯Âv°û¦¾ƒ¡ŽiÏ ÊnŒt0e iËÁ¥†sÂr8°BÉ¡åRé×4•êW5ƒC'­©é߸ý¾¥Ô9ß^þ(˜ endstream endobj 1677 0 obj 6329 endobj 1681 0 obj << /Type /XObject /Subtype /Image /Width 377 /Height 149 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 1682 0 R /Filter /FlateDecode >> stream xœíÙkrë6PíY­¦2Sñ(| AŠ ¾KŸSù!‘ л;¶ïû À1/fvvdv2òd³³› R‚ä R‚ä R‚ä R‚ä ÏH‰Ó»xÆö9XRâû¶èp1lÄöýÌ;#¯ˆ2=% æ¶ÍN?Õéœ ÓSB«y$'ÀÂô”(×Xÿ>ò¿íõ9fñ¹ÿÁv妎nùÄÒíêÂd˜žW¤™ž¯•ÅÝÆÈתŸ¼WÕ´þ¼ž°ñàç­Í§›Ú»Õ˜³éÆ ´WÙÛ{ù!WÍÃc„¤Äëß>/~ŽY_ܹùuýlãÁžÏíísb鞨ŽN«Õ0HZJ”iÿ€VóúðÍÒí¨Ö«´?oFuZZ^1Ýô”hÔ~OWÙ¼¸÷u¯{V?T‰› õÌhéþ6ÒžjDLÏ+ÒLO‰u]ì}]ß»ØYwß<Ø¿©Ÿ+í9O,ýskóÜú§Ú<ç/MÏ+ÒLO‰×JûîzØúbÏ„ë÷¾–A–;jÌóåÒ”S5–8çªyxŒG¦ÄˆM­ óÚùïYú¶]<2¯øÆ#SâòMmþ páü÷,}ç.™W|ã‘)qC«¹pòÛ–¾sÌ+¾ñ¼”¸öo£§½yéÛvñ¼¼âKR‚ä R‚ä R‚ä /fvvdv2òd³³ø³ùëpƒ¿{Å_ûO·:]Òjt íªV£Û Z p­FSo­ÆS o­ÆS#o­ÆS&o­ÆS)o­Æ{­ÌŽh­F[·š_X/Z Œ¶Ùj~[Éh50šJyk50ÞOüæJÑj`´ÏêøµÅ¢ÕÀ~m±h5p³§ÖËÞ_¿ÿß".j5Å*À=¸"¾l)~ìúÝÜmül¿Ù ÇoRÀ{äïSþh,\Þm4`ÓU?Þøa(}Ùp4 Ó¹n£É'j8ú ð²áh2À%öº&\nÑpô`²½h2ÀU4à6ú pMþÿ$ ä›ÝNZfŸ p™Ùí¤%?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüR~!çG”ò 9?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüR~!çG”ò 9?B ”_Èù¥üBÎ(år~„@)¿ó#Jù…œ!PÊ/äüÊÛ†üBÎðr‹ý^µýûOòû§¼ý{ým‰¿ßü^+ã7¿žX}=ù¹©N¯Þ¿åÍÍnn¡ÿ<Ç…}zæÏ¯nbŸ¿ßü÷lNgéz¤sõ;u®^Qû(.ßã¸CûsÓø*ù'ᦽ°µšrÌf«é<ÏÆ¢çZßUþÐ4¾Pþ äG¸Ö_h=ÿ[ß°žÿµïsLÀϰӻØ[½±Í½1ýƒºõ¹Jyhë9g½Žò£äÇ™áZóç€Í:m|m_ïdæ"'ÛŸ®´7Ò¿‹ö³1ýƒºµÕú(:ê†×±ø\nmºþ—8K~„k‡ ­]¤ý ùùÈf ýïÝ:½‹ö³1‡f[(oõDuâ îyå^ÒäG›áÚ¡Bki»jË]žÛßì¢ýlcLÿàÅ#‡n5¢:ÝNÏ|h•E&$Ë3?ÂMWiOáß“Ûßì¢||ónÿཧ:o5V9ÝNÏ|èu¼þQnmºü8ó#ܳ—rï#Eº¹—Æem^’Û=–¶‡ýQÿ཯·Kü\Yrû> endobj 1692 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 531.860000 194.399999 539.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 >> endobj 1693 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 523.220000 160.799999 530.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 >> endobj 1694 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 514.580000 153.120000 522.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 >> endobj 1695 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 505.939999 132.959999 513.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 >> endobj 1696 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 497.299999 170.399999 504.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn7 >> endobj 1697 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 488.659999 144.479999 496.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 >> endobj 1698 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 480.019999 188.639999 487.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 >> endobj 1699 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 471.379999 217.439999 479.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 >> endobj 1700 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 462.739999 191.519999 470.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 >> endobj 1701 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 454.099999 143.519999 461.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 >> endobj 1680 0 obj << /Type /Page /Parent 2 0 R /Contents 1702 0 R /Resources 1704 0 R /Annots 1705 0 R /MediaBox [0 0 595 842] >> endobj 1704 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << /Im1681 1681 0 R >> >> endobj 1705 0 obj [ 1691 0 R 1692 0 R 1693 0 R 1694 0 R 1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R ] endobj 1702 0 obj << /Length 1703 0 R /Filter /FlateDecode >> stream xœíɎݸñþ¾â™»( `»í 90l ‡ ‡ÀYƒxgùýh¡ÔK%±¸èéu?0ÝMIÅ­vVßüîó_¯ÿüõúæýçÿ\¿ºŸï?_XÅ þ]»ÿ~œ7[I1üZ[]‰¦ûwýúíòýúýòéò©ýÿ÷ 7ý‡îGûpìbøë×_.o†Î/CËç÷lûßU\ÿÐþõóõÏiüÍÁë^øv±é~ù×ð \ØöùoÝß.úáúK;ÛÃíþÿ£µÒ&iß§OyÿßüS¤/vU¬‘âʹh©Ûµøïß/ÿhaMƒ¨ÅymTÍBaÖÂmjs­!D0­8< g¬ÎfXª”9q¦ê-8q«Í™¶ýô¸LNâjsgÓÚÑð”9 «Ã‰\mÁä0=®Ò&8J#[²Í¦ Oš”[oP¥ocmú{@7¶›³ÐmLµ\ð€NàÊæìÄÑI;“bkÅÛ°“O»ŽØû³øsñ×âîŠÀ`¤í–G1ӃˌøíB0…€=/€p àFQ_gCª[…ãó ×Ü(‘cÍ=07Zs£äu6$yÒ5OÅó•};~Á›~"¶]ïÆ ç|‹½ÎîÇ?¬ºûãØ…¯¬qÿÐßñ·V ª9äêD´«ãu²¿i) ¹'žÍ½-¤|÷åòæ#WÒvÆí—´B¹·‡_ZuO_l£¯_þvýMk%ëß^¿ü|i*ÝÈZõÞ®Ð'{"Ðo˜DŸ¼CŸ¼GŸtlø7Ñ' öD¢3e5ú„÷O>|i1¢ô·ç¦ý]t ø6r|KÐ¥â6¢ÅP´Tèót¤À¡)†BÑŸ>jüIÄÎ t6ÐÝ9œhcF qh81á£FŸœ™=I•‹94gPíг–s,°µ®¬¿pÖŸ¡z^Àþ'8ôáU]Ia¹Ð»Ì úýò§rQ©ub\€ø¸ uèW@gƒ+á7ˆ§è{¡¢ÓSŽ3œ5¼ˆ±!]QV¾At'Ƚ:¿'‘cdh _(çŠÒ ÐmT¸îqbN|E_ÑCV4/Tå’¸Z£Þâ$sÛPÑùl°€Vƒî¾nøZã#ÀÅÖ¹¡ŒáØ‹+ò89Gì†D¨·ÇÄæµ“[¹ÜCÎ+­ŒmGó<³a§L%¸]Õ!Ö4& ªª=õ‹)TÉê&®Ä¥®ñ¿EÕ\*PD%:V|øŠãO@Çø×B߯¬'j€þ›ˆÚ{14pV™š/PÚ‘× ²KŽ}£|ó" ¶² 3Ë5y¾)8qáHÐ?…RÀ^øopæ7 &TŒÝ —$‚mX¢`:¸?ú’,Üð%'p‡ò7uƒ;à( ø†ÏÃ4‡…4Ëß›9œMØ_*=ž@HܨzŠÐÑÉáºVŒFUd³Yøúq20ûæX3õ nä>e½GÓÁžÄ¢.{•bmßm·í²®—JaܼØnë–×UÝx6˜SeU%ZUh@kO$¦… õßÕ_½ü‡æ†5hw§,°‚WrP"|Úœ}Lêè }Â…_Du&‹Câ8 ¯e¸!uÕãã·ñoSYËêkÍûŸ­V×·ÚkÍú»w‡†¯ÓTœ7ÂZƒp¹Úׇ¿UÿÑÕûXúÈö oí;rb9ƒ¯—Ÿ.ï~X¬«ÁÃÈ‹‡k¿Vuô¥`)µº)þƒ ¯Ä[ÌüÛ7š£ì¤]— 4Çp ¸c†"0Éq3?ìÃWl8Ê3ác§eëñSUÌR4qŒ“´$ÐQ9Iv>kXÄ‚Åð(-—ê»p-‰Iêfb’}FÌÔÐ1ÉMVؾڽ_O\vl'k!LjúVÕ6Ǭ\Ã×öîÚô[Â`ó>º†60³å÷¦ñúhºOæãèßÑKzÙÇOžx8‚!òVt±ž¡ôï°% 6ïc"k×ÅÖ^mƒO(ý;z C/û¸%¡4“[ð Ó¢ŽVp‘Š«ì –0æ¼$GÔ@r(„ÈÒ>˜@šÉp†Í D³zI šÙÑœ-‘·kðdx‡-a°y#hfVD3íõÑ6x2¼£—0ô²ˆæbWUf’kúj„²ÁãœÆ5Ÿ,2Á›yC(ò í!Ÿ0kÈ'¬‡ÂäëßaKlÞÇ„|B­!Ÿ~ _ÿŽ^ÂÐË>n‰|rÚGüÄß{\ÁZD„ÒDDjä1éqëø„£L¯˜xš=hÁ4+'ËA4‹†PšUÒ£Y¥ÖhVž”4ۿÖ0ؼ‰f•X£YÅý>8 Ùþ½„¡—}Ü’fÕäŒÁi6<¼Kú†ø~ÃKÂm5)ûB‰yCªïQ›‰jÜßbÅ÷¨Zº»Ï÷Ø5;áþš a÷7[ñ=jÝxèÆ÷=öïÈ9ˆå nê{Ôf´´ñh8()pë`Ïi¢‚oÑÌáxb‡"ú*àŽËIP§c’ó9Jz‡¢6“'å¢!Tª×žŸDÛ5?‰¶žŸ¤kð¥ºý$3lÞÇ$Õë5?‰®=?I×àKõzô“Ì`èe·”êSb5®‰ƒ¿(Ç NA §¾ †¾Ó%Æ-à Ïg€7 ª¾Ã!èø’à¢&!SucŒé"5X‘³“_@6jÞÊÎ߫լyµ ó¼Z†¯Öð[Â`ó>&vÖ¬zµß«Õ@¯V3yµš¥W«9ƒW˰ѫÅÇÔ*Õr¬{t+Ç?©Æ»!Äe„낟•Ç2Ã&…T|ÞÈ< ÷¼’†¯y% ÷¼’]ƒÏ<øè•œÁ`ó>FæaøšWÒpé÷¼’Ã;z C/û¸%óÓ>Fx%7p,ÆÊ"2Oydij_oÀzAŒ»ÊŸÎi¦,J4dŽD3|£ L™b}ç8ÇOÉë$DAB¹qp8AÄDÅrâ1Sò;q¹xO©OÖÙ$Æ«– ÓžÄ_ë¼êr–Ò)™5ø,ê1N5GÕj sÏ gŠ2Í~ žSŽ÷ìQü ÁÈ„JE¸ÍåRä³d µê˜éëtÔSªâ˜ ,ü½›å¤¾¯4þ+iÍÒVÇâ5$ÓŽ ­íƨÞ´–»…j¬DLù·Ž0Ÿ¼Û­qÔàü€ËÏ>}á<ÆTÝYGOè».ü:|]Ær?3p›vc ýá¢:I¹²5„]Ì‚$T3Ô!Ø œÈVf›uÕÏçÆh" EåÞ7”Itw¬÷å®Î¯"BöR¬É€¼p‘KQG ÞüX …¶ ×y]JúÓ*éH(ÉŒ7ΫN¨SwïÛ8Ɉܔ¨Ò‹¶‘âë"XE |«p©ø8‡„j}áóÜ8à@íWéCÏD¿O„>5¿Êþ CËÔö•:]¤¨¦ûNu·Â^ßüþ7–_¯Oÿ.¬6ÏÕñÚœû>:ŸÍ¢9œW(åo'Ô%øPr:VÖ>¬€{·^Ÿo6£‰TRÕÔjÉö2ÂÒžR‰"\º<¸Å'"ÁŸÐA0íîÉ ¥æOÍ¡•:zÞ­‹B ’Ѝ©ͪ¬!ÐwT&¦ÈST ÷~"ìI û=Í­=#?!{‹®qÙSµÛt¢ô‰h‡»ÏnoÂ\Ä] I‹€)@#§ë#>B/| "Š"Qt˜‡%w6K® ·B-Ù…zrÛ¯ûŠÒaÛ¨(Âí’™ˆSœ)èÆü% ž6‚õ‹]–³o>m WÂEDY¬¥<÷9e ü/{ô¸á¯Ž™EŒ³#ζà±O‰½Ù]I)ñ\G3¾â¢¶v) ÎÄç'ûÞöì?æ¨"@mÅWâæ¥ôG»iŸÅ G>]Ü{ŠrÈÑw@ñe‚¹˜##%¯:’(s,Zy9#úèãúe=3 x\ ¨´›&JI6Šð¹h¶·Ò¢¢²¸ÂeTæüz*áA^á˜y›¢tD¹n#êc[Ñ~‚&|TBi‚’§Ò¥±ÂSvR°Ç%À§¦B‘áÁ¦) K–#]wgw›Ýðîôdãl´~Îâ6.ÄFkàûˆ ŸNŒñ6•É$ PY~p¸›ÕÿU‘vo^åM>YïϬH´¢|Âvr'GꜫåÚ>üfQz ¬7!m)—Åge9Ô"ÊòØC}««Nèí ?¥„öC–+ËZûšA¾Då½ÂÐ-mjO†?bQ¹úzcshï‡tg©(–’‘b·äÈtõßóĺß÷ñPLäphJ"7ݳPÒŠi‰q)^”Û•b½„ÇÜ6FÀªl¥rv çz Š Ô±%` Îñïvá%÷@Á»*òê–Yì5à‡&X¹Y«d©ÌLðÄÄ f=¨L:Ncnî0S²Ça¸[_à,”ŒŽð’\_Jq&L¤@9ª'\Óá¸}WV®À ó#¬ZŠT‰I¹L9õ»#ýaßÃv”·ιoÌ&EˆÝszŒƒ*1UñúfɤÏÚ3b(Ùiêaë²ED%1¦ŸI”·:m³?Ã3"Æ7ébê‚%œûÜ®dÙ£`>Æpµ1&ÈúìÎà6Ÿ‚#£ìdí1¬{Ò³Ü*õÐÓ"ô´(¾h†pÏUN.LÉÝ?Ð#LoŸ^’" Ç*ÅÔCˆàŽ)1Öw2 áýòCØé‚<ß2ã)©' Ä)Jsõ–¬yk9Ó½îâüœK¸§·99«÷Ñ!æP7< acÅ ²¨{'NªÀŸ ÌZ`è!\4ÿT-=êëņà–8è ÁµpÐx\Ãâ^±H7×°nžq·¯¬]/úA/qzC³²› C±;Õ hïÑàOЫ{„ÀæŽ_©ƒC#Ýdôâ®LÚX1Ø:Y)Ql ï0ä†*‹ˆâ)ͤۿHØ}žpæI´ˆÑœvWP-ŠÈ“£Ô«‰™ß~NwVë-%«8æâÉ,iFeë@DÞ{ 4ç¸=$À%t“n-+/<~‰wt·×–î†_s•C¸ÜæüwèÜ^0uÉLeäðº/õöúòñHÜ,eS¡ÓÅóH¼¬q§—‰ÅíRÁ|w/ì&«µK¨^£:ŽIcÊö&¨ò=ªÎ— ZŒ¹18ŒóŠã,É<§¿v¸dÔ“Kn”t±ñ ­ßxPºÈᮨÃbC݉Iì8ÏqéIŠpܧ[÷µ”†”ŠeR–¬u¯¬Ç¹³$¥¦(£Ç„V'eä=êšQ4±óÔb W¯(œ-‡B‘3×xÊcOÊ[ÈRïïà~ù0±pöA989½Gã&7óš‡neŒ³ãõúÐ.ûV\׬×F°ûóÕâ»'¥›"F Ù¸ÝCС²ä®BZïàÊÊŠÞx€^„»d–SÉ:"É(ã³ý \áÖ(Ž›²ç¯Ùa”%娼,Ö–‡÷àó O²Iq`ž¯4ëyÜ«ƒŽ% =^"èt~f›¥ÀÙCÐÆˆŒ,qFïÙþ „„y¦ÔJÉš¯¹kÃpÞ2L8«í}Ô4¥Õ’Õ>\í@‘./èìx´Qã7¥\CLuÌc¢FpA!“}µ1ÇÉ9ÝÙãâÕ Üœ2$‹÷22ͬ}K[æ%ÅCc—òb©ÜHiË{N^ƒ¾ÐéÇ>™¡\CgqÁàC‹ÉÄ $Æe™w€®‡]8ó8Snè'7z-¹Wz bW…Û²T¡ÅGD‹'îÛ/zpÎoÞL5JðbWÒA©.’iúþPØ8gÇMN€Ã áÙ1*fÔu öê#Œòpà ‹õTÞ?ÑÔKJá;®H»'šxv:7ÛØ „ú©)E`Bà !Pöʂ§K…/ÿí®¹8Fí'êð‘›§ÞÉŸµ•'A¨w¸!¡‚zÖ4t‚sYDLÂgÛ0žpÊ›“Bî®h’\ wDå§§œ–LØàÍk|OJqR€'α÷“ 'µ§¤cd5q e ËDœ¼†H ¶ %Ù7GV?%T Æ]z´O9GᘘJ‘˜âõy-¡ò "¦>B%ÝžsPݤœ•Ô[ñ¾æ¾ë“q¤ãŠrÇÄú…^á着µ÷Ä•V§}óý¦Á¾qkÛNd‚2lª­”[:éWà%ÉY…+‡O\•îµ~ÐàópœÀTîÐoöÍ6‚±"ùÊØð5àX?®Äº®Ré~eÝð8J*¯þô¾Us?&áè2馨”S&‚)ÅÉXÙõC¼P_>!§y£¶ˆ‚/ãuÎQ#D}xf@í×ï-§á¦gîÇ×o¬ò,ö̳>mr­ÍO÷…²¹òv^kÅÙnª›K¦–\Ϙʬó¥FU`ÜuU¯Û>õÊ“aO¤¬D³1§ue,ð‘p­‹~Ó ß ÚA-*Áäòv•w(´+æ-Oè»Îǵ2ÃØ7ŽÎמplŽmѾq;F™» X×ý.ôsyÒˆÝvÎÝÖàw%‰á«—W…8mt ºO8VákîD ßÐ~œ¬XÙÁ |@±ËYÙk#@ñïgZÄŠ:!¯ZÃ^þÆêãÝñý&3²b` ž9ëj…oàÙL &ðk[šìçà1öí\g”Â×O—ÿÌÜ  endstream endobj 1703 0 obj 5320 endobj 1707 0 obj [28 /XYZ 40.7999999 345.619999 0] endobj 1708 0 obj [28 /XYZ 40.7999999 154.579999 0] endobj 1709 0 obj [28 /XYZ 40.7999999 345.619999 0] endobj 1710 0 obj [28 /XYZ 40.7999999 154.579999 0] endobj 1706 0 obj << /Type /Page /Parent 2 0 R /Contents 1711 0 R /Resources 1713 0 R /Annots 1714 0 R /MediaBox [0 0 595 842] >> endobj 1713 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1714 0 obj [ ] endobj 1711 0 obj << /Length 1712 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯èó–ÅEÆ[€<ø99žLƒxgùûQ·Ô‹D}«¸Hj· ø=·Z\ŠÅÚXõñíŸ>ÿãø¯ßoßþÏñËðóýçCY”uÙÿ9žþ¾¹ÿ@šBÉþׯT…lOŽ_¾¾¿^/ݿߢ>¿8üè^ºèüýËo‡·}ç‡þ“ÏïÿÒýö¿£<þ¹û߯ǿý½ûñÓÐÞé _¦­O¿ü»ÿEH!M÷ŸûßN9üõ‡ãoÝ̹ÝÓ¿o”j+£ƒ†ñíúª8ÿ½ôUµÔÚ…Ý «Žÿýçáç®­ë ŠV ÑÔº)}ÛläÐhÛÔ]›ÒjÒš—WCaÍTÝúGhæL« I‰R7Ά˜ouž 4UØ/ …QJ•Uƒà§Ñˆ I Ç ñ®„¬û *F©kCaÍÈ*ÆF9FMª'¸£!&ÁuÕÓ©c¬ ^Ú $T%dŒfN£!sÈ Û)L·ª‘•>QþDõÊÙýÞ¨áÿ”ë^44¶š ‘®Ž"bj…ãO£!sV¶Ãäw£z Ú† ôk;dj•ˆÑÌi4"dNµ§í¼Ä0§äÍœúæxñÝëáí'Ñád<¾þÜãlö?^»‰VÇ7Š7âøúÓñÚþñøúë¡-ªV5Uo±öO„AOJ ßÑðÉ;ØÚGôD±á(ßÉ5SØšÂïÀ'ª§ÛÇ׎‹3E×ïòäàyáÒ;¦ —“×ÑÚ{ÈbŒ–ÕÂgY,Ñ,k!EMß?ËÜcé‹Õæ[¬îyÀ’`ò~‚O0©ê|ÓîL¾'†h ÙlWŸ:FÅí’è\yŸv6äÐé‡X¶ G]žz¬Õu ~<÷XJqÖÅ×'=˜)÷éÛõôQcÂúj¿ôMQFš‘5€~õt¡û6JÇЦï <Åx‚[ëùµ.¤0ÞOü'*­Uª Müû“5\ÈrÚŸ5L$¼\xÐÖB.²%¼ƒµ¦Ýqþ@ÈËXœd­#^L5èÞ âôvÔD;îà—ûRY¬½ÕaäeAÞ!‘Èñ‹(úÙ?¼¾oùı!–­8&8˜Q¼Jºåçæ°ù!…bsG2'±l—c‹ž£XÒÓð+°†:ë ä. (HG´ÕXG´õœŽhÍD„wLuÄé;zÔ„¾ïà¢#Z=§#Z5í@Y:âôvÔD;î ¹ŽhÊeׂ³ð„Xk¢ÀÄC{JÁ»¤j´K¡gvIӱΈ‰OLvÉù;zÔ„¾ï`Ø%M'îí]Òõ3í@LwÉù;í¨‰vÜAú]"Ì2[-¯!à‹%8!\fcq”  E/[a1T=ôìuüJ0ËB²Ié „|ÿôw`j –êïÑyY$ßzÙ˜µÎB…¿ûH¼Eµ”¡ùÎúÉö=ÅæE´”y÷ÉES]bŽl?Òfpø®²hŽé†}O+ЋMØ4Ÿ$›_]2›ºªÇn~‚‰¾£ú>Íú4z;)ó¥ÍUV܉ŸõsÁã¾@‘+&27ƒzÜå®w#~h¥lX¦%Á;Û£j"„aÆßt:¶Ü ²áY,¿Ùñ`BëØE‰2'Qì=À ÆYtÅš>fÃý`2Ò×»˜òRï’«8¶ÄeX°h+±'á­õ•å°5\χ×R”³ršAÜ~ÇQ°‰iýÝPG1覣RÔ±ð®çH Ž<À»ÓRF–|QçÃáƒl’s<ž)”|˜G94pp¼ˆ9¿E¥›‚kªá4¦õ¶*Œ¬‡³Á©AǵÔXå`uˆ’|µÔFë=,V\)†%yFÂ×* á£Â¸äRxlFá=·q¡zÍ„ÌÒ±a‹Ë]-‡ |‡…ÂxGcÏ•³ X `>€#pp"ã¸â ¯6¦hFÑ–b™ˆOœ‡‹C:÷ƒÇ†$v†ðìäãDFæ“!Œ§gy *q-—¡Wà³ÂZx7bÇ3“Èq—1fǑ鳪Ô¹ïǪYÿD ›º ¶lBP1‹a£ÞAĸ®d¤l¨´Ogȵ9Ç*X—`» ‡^qkœPÿ–i½ QÓÖ‹D|:)L'2ű´êÒ«R\Î 2AyªÒ\áú%˜K!¤…a¬´z+ÿÅÊO³ÚðG… ÊãäÛã‘p« (Å%Ï´`µHp\+Ü‘uFÈ‹ÄÇBóðg±˜šqPYÓâ—á¦Ôµ«ŒgÝÓ££ÜÆMȶÄñꥯø¬÷¬<€º`%Rðð(@¤(‡!–=`?–¡©BXœPÁœ\ƒ´bât•fÆAQŽ H̨bf9 yjÖ¶"È’ûÇâVl€ë.ãÚqP»¾k«z IVÂïuYöØ¢¥,m›W¨îãÑþ&ÔT9ØÎ‹áe9L±á¸×¦-ëx5Ä;¨u\Ž›ÖÄ^¤¨ˆ¾i¶õJ…°Û7x¡—•ЬÃ:Ä+â@_Z±”¨ RÛDdnúx؉ȘôûኒàEå™à‰`œìϺîg]÷d#?EuIUÌvé1#!$r]7§.5j׳×™™·Ï ÜMï(Ñ„¤xæbXà'ņ‘“Œ[sŒ 'ìÀǜ߅“oà–Ùg>aÜü»\i»‘sö¾už )®w8ÊH–ð ®…`ð¨ÙÊø  §Ò—S¸=‰M È $Ä+)ž ñ>›öâ¥Ê/Í$ %ªKôoº—#û¿q÷)IwþGhËçqëXã¼(—ÛX JˆÌ®T¿@¹å=IF$å$$3nã\c»ƒ<@@K=ˆI|ð¤ùêr"Ñë¢Rç3 ûŸE¹š>Fy‡•=0¹ ´n÷@$:kÇF9côÏáIW°]ùéÞ¥äß›â (–³ò¦v¡ÝF¦¤$BÖ‡µC85¤Xв,{ ŸÜo6Élu‹î»Í Kí׌ ž·sq«dË ¥èÕÕXöÆuîâ\5ϨŒÎäƒ?†Ô_NSsÉs”º3Ž‹èŸ±ÏâOÿ‰R²øù¤˜°Q]í”< Ü@¿\sIøœÄYÿéDràYØÞN€íê]ošP‰˜> pS"B”ו¿„¹[ûlÙÀþÅ÷ð,åãUî¿$"ìDz¯W_¯‘#˜1–…U²Ë) ¸ƒŽ#w«u‚DÁ¬K‚(ä§8àË•„»K6“íõ,fOîô'©fY.Ú$અ HäÆâIl°«p?˘ öt°4#LçÒí6 Afãer,`ÜÑû;¢ñŽ ÌQ´³bý\S®Ìåf‚âlÙÿ™[M5y">D}§Eï¨Þ³ªè ‹¯gZòˆL¡åô5,œ†E­õlÕùaý+–1ÓÚ083Fã¶jÎåqÓ—÷f¸&Ü-*}¹#|¸FnngøçA9¼y¼½–S¯ %Gê”SÁ·õ$ò·ðÐVK眮2ÏüCV„h%³A‡‹0BÎóvìÿAeߤÈíržchð›òj´6c‘+MSW茶Ru½2Pb\!²˶€#ÈfAÆa­ad#ض¢ „õãŒáwðýÏE #BÁÕv epð¥p1æ“mÖ׋7ÀþQ7-GlT4$Î\rI6¹5Fƒ‹Ç†[øO|ð¹äŽa]_BŽê¼e7%àxÙFçˆRdäÄÖürñ–6› vaÛN`â¢Ôí€tØ(`ï–puNöû U®YsDRêÓŒƒ½`Œä]Ê¥:!ù?„#[È1ŽäÎYVŒØ×‘°>}^Æp›èµ(àh„µH“ÅèožP z= J†Ä…VNdú¾ ½$ËBr}-ŠŒ’·à}šfq#mPõ¥a?‚iÉlK.ùû1.S,ñ œ#cŽ#À8ˆ°|¢§š¦«é”ŽÊv,-Ûx˜xL9é ÉŽŠ&E³Çu> ø­OݼA`ã\à¼Tä:2Ç–Ãâ1bŠ¡Ë=• Äé³ñã®kŸ±ÀÕcQ8×#Ó* ”u¦À¶ œ*&)L@û0¥ i¦:ÄßÁ‰bÒ¯‹•ÜÉ8±²%§5VìÍÇ€Yö·¢àɱ¸ƒpBpD‚³1â às@3©FÛ·ˆH ðñ€„ú¦íD߬žõ³d¥M±l§ 8IŽeÂ'Kšµ)½­=FåPšSåĨè BâËå×îÈݵg¸fµÔr²¯ž§Uöž6–ü(­ŽS•/ø>ë´H®pÔtgЦ—¯VÂì¿‹3ÉýE9LÉd!"âbñ¥ˆ|&äûºÇ½;Ò qíkŸ>h¢`.xÜÆ\©“ ·¬á;4¶§þ <îM—N[sÀ¼¶ÕÕÔ|Œ´ºN°-­Aë·– ¤ÃˆK~ËŽZY9ÅRÎDC63n±›%*9—«`©’ÃX—Xqœà;|'Mñ’G«þæ }?DÕ¾×A Ñú„ú¸¨i4+YoIXë‰îHM$¬ % €sZN8,|V"mŽÎ4×âºz <‚«çqÌcÀŠ{PÀpšOâ<Á·†Ç†áq?ü'YØò†’øhl Üö#ñ¢‚pØ2 ‹qØ?[¶¥yT¶Ä„gÈQüD–ÛeË$öÌ–Ýßã·Žÿ:Þ:}aøñ嫃!mN.oœüâäeç«ËQ®ú(ºiÌæ´¢.ú ‘*¯W—¡™º¨çã­.,˧'lŠfç´™yÒËM¥ ÙÎTUQ÷–ÔíIû1ð¾ÓoùF²<Ç¡nOÞÁÖzóóþ“ð»ƒ>3ÃOè!d6÷D y f-íaÅ(sÆvÞ\wú]VWJ0V{-ŽÕ®¬w†û°jQ”ý£Ûư5¸N˜«0͇Ðß`?ƒ§9³‚~€Ü5FÎò7îÇу¢C}m厰}õ±„€ë2 νÃጨÈá³á¸bF;øìΫ Æt{ò<‡‰`¨à`ï Ä—˜Zøørø?Í3 endstream endobj 1712 0 obj 4522 endobj 1716 0 obj [29 /XYZ 40.7999999 759.379999 0] endobj 1717 0 obj [29 /XYZ 40.7999999 361.939999 0] endobj 1718 0 obj [29 /XYZ 40.7999999 759.379999 0] endobj 1719 0 obj [29 /XYZ 40.7999999 361.939999 0] endobj 1715 0 obj << /Type /Page /Parent 2 0 R /Contents 1720 0 R /Resources 1722 0 R /Annots 1723 0 R /MediaBox [0 0 595 842] >> endobj 1722 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1723 0 obj [ ] endobj 1720 0 obj << /Length 1721 0 R /Filter /FlateDecode >> stream xœí]KoܺÞϯ˜u(âC/ (;I. 1ÐEÑE‘ÛÛ⢹¨{ýûÕŒ43QÉsx¨ÑØr€ØZyÞ/~üã·¿ïÿùÛþãã·ÿì¿ß¿íÊ¢¬Ëákø÷áõº-Œ~lÚªÐÝákÿýÇîeÿ²{Ú=õÿ¿ìT}|püÖž^1LøÛ÷_w‡—ï†O¾=þ¹ÿé{½ÿSÿÛ/û¿þ­ÿöÓ8ßá~ìÚ®>üðïᥕnû_^ÿtü×î/¿ÛÿÚ/¡=Î{øÿƒ©T£tÒ2^Ϊã¿×‚w•{kºÚî•Òý"«ÿýÇîç~®ó"ŠÎ*ÕÔ¶)cçlôÞZÕª}×ÔýœÚ™ÒÙWÔDiÓ£%¦9¬F%mJ•¶ñNĸiÍqƒºì!5N”©ª“Á[¿•´©àx¢¢µF™FWöüà«¶ÕýÏ¿¢W[Û‘Êúg’¶}ž(mš¦±ÓV£’65"OĤú®ªeÄÌy¢¤i*U6?¬FDÌà‰ä¨¾ÿE —‰Ò¦1Z ÇÕH Á3‘ LÓ›¶e"ôN¥MÓÿ&‚Ë~5*iS#œ‰ž$ì/}±¿^<><ï>~í¦æóÏý*ŽöêðíùÇ®_Ò‡Þ ë×÷üÓþ÷eiê?ìŸÙuESWµ®Žöí0R#íåƒÇãöüRÇ”.¬iªòÕ³JGš¢ì&#úótVø§ÎûJÿÔYk3ý =~PZµ“gíðšÓ&bváN'ñ¼Ø'|Ÿj'ïó,­‚ÛièÕ_¦/†“`DZ3E¤ƒY>í@š±órØEÕûi­º&rñöÀ³Œ_tnCw÷rŠÿÊ\Ëÿ·šlM:IŠŒuâc2¬?C¼êÂÁÙý6Ëe ‘}?šP“tR=O:5ˆiÊšΖ›Zu»«¶ë&jfË›®Vbç÷6kÆÆ]Û”7 öÆŸéõd,òzcH7sǦÃag«•½&´™FJ¥†#hD?Àذ ¿g”Çs#ŸáH-¹‚îïڈÈ#ؘ0ï¼ö3ðbG{À¯tà+ØÓnC %Já…†*, DV‰;çÁgðª5<gû$:|fI¢èÎ/…œ%·¿Ùgê³õ¿¾¾Ì²ix?\$¾ÌÊ\жZ]Á3®¬˜ãfÁtËRAx‰ LŠ÷øFãböËbÂÚªS‹¡5›Am…cKÛxm+†ÛÊÍGkªÓK±¯Œ·[c¢`£ra–ŸüÝßšWÍ5˜z×Áf• ùš=®U“ ØáýÀgJè rÊÆ€kaÀK¿ˆ—c@ÌL¾3ìôÆ€Ë3 Ž`n ø¾°R*¸ÐÅ<½5£^Öœä„@6fò1#)sŸ*Ç“æZ…@1admEÜ<ÞÊ&P¸gºW!PlDÖ&PÄÍýM l…+Pp±ËÅ_wRëSÀÁ xŸKÒÇçó#Zà¤9¡×|ô¥¡¿õ™JS$:«ÞUqáôw–óÓ¢•a"r#ZÔIœO]QѾq`¹zšº9—4`eÕ“¬9ä)—ÇïÏØ­ÒÆcÄÙå<•º³ $¶f ®9úé±C!8l¦ñÚ .x¼©QæýßÍÉ Ä·QB[åÝr…UK¥È‹ÁàHv·¿-OÖ_‰; ¼_‘s[OŒÛ»§y.Zr,Â…Ñ ý-(—q:ìÄwè¢D¡}”ñ°<=»VÍ»¢gŒdåo]õJÌß*”é‚pp…Ъ'OW&Fo‘i\Íj\ò?¢‘ÿÂWQmÑòÅ:#‡/_&x$CÊQÚ„ó±úsТ!ÄeäÛsŠÀc+oOÕ^«Â}¼)×Â,Õ­LTöR®YÊÕÓ[_±õ÷Ëj%zª6×D²špQFÆÐÃ]‚¯6-Ö•©‡s7ûÊã…Sí¹ËÇØx¾ß~9|MÉÍM5¹ &þ™K>Ây¦ƒïy8kÈ7—‘5maGNžAçô=—:Ÿéˆ†ÏൕpêÄszÚœ]iôžQº5…q®ý‚#cDwn Õìtåy-Ÿ œ ­»¾Í‹Õ%Gôæñ7‹q¯Gž¶Ú®'Ü,À¬ˆÜŠ){ÔÝé,Rd2¶´¢ÝR‚Í@'`ˉâÜUÔ Í)÷U{-øßhN!©UÞÇï‘ ¥d&ò,Ncۈ˥±bå\ É༰b!/eJ¹¿JäfÍø¾i„¤w\õº] êq£LOŸeQr‘;¹¼mîð¸_°(à­Zðu}€çŒ9Å“†9–%¹¤­FÖmûøbJ»0@„û`‡¸$»gªsŒˆÑ ™e¤s"ÿØÁ…³9NÈ­ü=–ߎ·.öÊê}¥”û¯Ç¥ºËø’§ñ'[°Ì‰-B*ɳsç¤Â=X·»kÏ·~ ß‘ÂqPe/)ºOGx¹r{¾Ÿ™ƒz± +ƒ«_°)„‘•Ãݽ1JÎ7Ü®%¸€g!”X¼êQR·ëA ®‚ZŠKø.rý¿ýK¯‡?¿}ÿáA ‹ùò‚ù'/[Ö{Õoc†fL§êbèyñNGߪ®‹z¾á^g Ç8,7ÝÍüáºffd@1…îf­ª*êÁ¸¹Œ4ð=-|¦ƒÏ 2£Ñ….Íahª çfHêõ'Ÿáߎ­Lfvø=3º;s# íc´¨iÏŒ£ì}\Û‘¨îð³®Ô¹|›í‘å=Ø®œgÆ }­Šrš ·¹Ù ž0Ua˜"™Foð=£ šÁ ‡ uúsn¾ñ{<³1 :ú>UõÂù=ÐÇâe,€ž{†C¢È¡³Ñ˘‘Æ:{åø%ȃ¶íyò¸‡kÁàQ¯ŽO’Zxÿ´û?·eï endstream endobj 1721 0 obj 3796 endobj 1725 0 obj [30 /XYZ 40.7999999 312.019999 0] endobj 1726 0 obj [30 /XYZ 40.7999999 72.0199999 0] endobj 1727 0 obj [30 /XYZ 40.7999999 602.899999 0] endobj 1728 0 obj [30 /XYZ 32.1599999 663.379999 0] endobj 1729 0 obj [30 /XYZ 40.7999999 312.019999 0] endobj 1730 0 obj [30 /XYZ 40.7999999 72.0199999 0] endobj 1731 0 obj [30 /XYZ 33.1199999 661.459999 0] endobj 1732 0 obj [30 /XYZ 40.7999999 602.899999 0] endobj 1724 0 obj << /Type /Page /Parent 2 0 R /Contents 1733 0 R /Resources 1735 0 R /Annots 1736 0 R /MediaBox [0 0 595 842] >> endobj 1735 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1736 0 obj [ ] endobj 1733 0 obj << /Length 1734 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø¼ÀhDJ¢D °óè9Ì99³Ù,™E&{ÈßlQ¶%êã£X”e·z€i·)ñQ,Ö›UoÿôùÇý~|ûþóŽ_Íï÷ŸeQªrø9žþ½¹ýBvE%‡m×RŸ~Ž_¿¾¿>>õÿ?u~ÑüêÇ!†ÿúÛáí0øaøæóû¿ôŸþw”Ç?÷ýzüÛßû_?™þN|;tZ>ü{ø ¤]ÿÇí§Sã/‡¿þpü­ŸBwî÷ôÿ›JU]6ï—WÅùßí«`¬òX7u×ÏOÈþ¿¦‡Åÿyø¹ïë2‰¢«+Qµ²©ûÏZÕmÙtì?·•ù §•ý@UÛu«Ž¢ÿn>ŒµÖ ŽÒºiDËÑÍi6"iQ¢¬[gGŒ›Ð¨vºIžbÙ¥$ËVªèÖd¶öStÊüÀÏ£týíiˆ~¸þü. "Ûº)u?‡D7Õ×6²—Ž’ºQBrtsžHZ”ÙhÜßYSBäu"ô4Ç)QUÙ°ìe?‘´¨añUØ5m"ðxö ®9èæy6"eMf `?ŒÇ iôyɲÔi‹;J„]«8øþy6"iQf¬Ž>qˆ†ò*~w¼øîËáí‹>IÁ_~îgq¥‡__¾úQßôL±GÙ/?ÿPöÓýãñ˯‡®èt©ds½‡–²9·ÔE]µÊM‹yçò…ç/Ú¢Ôóזu‚[äˬûº½Nàýü‹ð¹ZïVêü….ZÕÌ PÅ/Ëê¾þxþâã—Ò¶TÔUvµmN»ªJ1ÎïƒYScÍ\¡©QK)aË;ØòΠF-U·¨älШ‰:@"ð8ˆxœáÜ([‘ÂØ›„ï8zã„î­¬3øÈÚ[ãÑq3 ¥«)NŠf¤Š×¹X¤²?UzþÄѦ¨d'¦dZÍ­êÙG±Ôc®Wg]RtÁ-”Þ,¨áN0øð;V÷厄åˆùv°÷Ê ÃI¢hju吆×ùæÐÞÌLB61 ¯b;;Lé$³ô áy'1ˆa"?Ì)Ïô(n±Ç‹ £é‚pNÖÑkdSÞÏqÊšñéÁgã9„ Í’0ºEèNsfeã;…y‡±h¹ã[S„úiyÌœ½$<¢³fæŸ@|c('Ö”Áe¡Z1!pÕpüΨU”b¦$ã– 3\£r9ÐÔ(1 üÁ&¬ ð0Œ~â“02²-ê)À‹7êÌ«…-Ì¢˜…sµÁÕ¶{$J6ã‹[“l…ðÎ_Êfµ¶Ìϵ¸.{FL‘’…Ü, bb²‡•v,ü+¶%  ZÖβZ’LäáÄÐW Xál’¤ÓÞ‘¡UÍŒ’‘,Aáä i±(Ùïl$^ÛÄ€A‚U¯Á8+äØäÀ»*‡‰P4ÂH›­QT½•´ÐˆÞU¯êÁ@žº£¬—ÈSO–NÔ©ÑãRG¬žo¿šƒçö={Äø „²¶¬*ªzê •9âÆ£zÓ¢`ËGBo%|çÅ» 1:×U=áb}vŠ_ßÁ-p’F˜]š¤0裻•–Œ¡/ç/G „1Áî×~ûÕZ~´úh ¡‹{q,b Þ+ã ªÎ-µ êWWŽZ8Ž{H1Æ:d•¼ñ$1ræ˜áò-k JŒcí^L}·²oÆÊãÍ"¨}~³EÍ·dlF~ÌI«jJŽSTkUd5žd²MGPRG¹e ³-vœ„%óYË´¢`(l/Æ‘Ó= ñ±ûŸ_g$™=)QMØì%bä…ÌÈvº¶Í¡°—e6;f‰!‹ S¤X7 01ü&¿&)ýæï¯@xX'Å­ƒÄá<(“Ïz7«\à ™?Ä""Ãq$"H ª¤'§[«”ÓsM#Žb8šùxD‚uÄPË÷`¯ó ,Œ¥DËyi‘­ÅDí [Ë·ŸäÄÊu8‡²uNL{,ìÀˆ@úçÐ9®y´AÙÀqbüžÍðh/AÈÈmÚ¦qˆ1Öv𪠄“`_³ã)ñR>)ÿ&~yËÜÜZiÅë£Ð¼I°m˜+–A!Gœ·9‚nHæX?‰£hÎØhe-+<,‡"ј9æ×d+íźÝ@H!›5fÄ)Ñ53¤ŠQXÉ-‹*ÌÌžÜsùRöJ^¶‰,É D@,Ψ=¡—Ȇ<ß•ìÚ11‹¼ä#(‡Ÿù~ÕEÛÌ[Tü;âGøŽ†ã¾_ó§ ¶‰Æ1Au]Q|»Žó‚ZÆhA{"Lteâ¦|}ZÖSnC‰¯q wâ‡}°ñ~êˆ}Š’Ûé¼Rn]]2…±Äè„«d1ÄÔoc¶t'Š>£S ëN3'äX8)%î §Ÿ[IÈØZœ¾%Ì&‹Ç1x—Ÿ—²R7 ë ÎÏš²RJæ^GþdÖôÔ†ÛǃaM€Žã,¬–:[õ´y'¡†Å-”ÄÈŽ­¯âÈ;7JoŽììÂUÂ,ðè`¢ŠI$B¯Z^Ò‰gͺ Ž3'á (ì³P 8ŽƒÜÂ8’ùã]Àãà¹á]€0pÌ ÎÃÚ!,°¥‘÷³SÒš ò›aá‘y6"„I€£.Å“Á`Ë„˜² ¯_Ïž: ŠÙ[ÄŽŸ¤)9.aWŠw¥˜JPR)®ñnSä,¥Õëçîr%eWpw—]µzLlY®Ú\YßÜU\Q^–pwöñ˜²ØcÈ]ùÞ6“Ø•ov¼^Aùv (ÑŒÆÄ”t–²†kÇ÷íáæ)áæ+Åto¸ÔAœÏt:<œ‹7 “#»•¿¾‹?.•5›WÞ7†øÛŒÌ )ë)7Ø^Z˜=Àær\'_×ÙdIþ”R­)&Z?‚:B, ¨èÉÁJ@B¹žƒ³ªÌ#ïý_Ô ÄÖ\‡¡¯”´ ,eⶃ¸+„µWÝ”íäù#Òý7X’ÊÅKù5ÂVz'GBôˆñ,ªDJ B%’ÒQHðNOr8¨{m&RtV&†”[ÌáÉd(¹7cªH`¶½ÚÕ%å%ý¶bQüûØuƒ£(ØŽ]*»Å0"Õu"9<òð/ô5:B.Äz R—:p¢kN§“ÓË.NTÕxßÉx7E3ÁëîF˜üwÇ"Š`s§u7™µ ÍÊ)Ûr—°œ…§0K*Õü·¥]Ä΄ìÆk¥Yg•O·æÖÉIaëfJb7è8rl.GfŠÁÝïÛ‰¸œbdà)Ë“%OÉ â…Ÿ´ê‚#nÙ`Ý! 1 ðSúM%îÉ{ÕŽs£$èÎ’§Š'/ÖƒÕçìt;cNw·¾Þ›­p&ˆË¯¸]Œò™ f)…ÊSø:BaJõ«tYi"¦a[Má-fLI–7“éýbhÜ*B`È 6 CÊäÃ(kÎRnZΈ e!¥Ü"hA“ÉvK°<@±·ÍV³ýÝ_¨ó¢K€ºžü-·çû^õI9Bl«‰½ˆd™ùc=»’øçȆ™Âü¤6Ba ç~)ŽpdÓåæ×û®ñ?Ó~RãÒC3†cNêKÌ vá7ÐQ[ö»œÁòjîýíw9ŸoOï™å,}¦êîF½Vé³ðXJûÑkŒs…”Rº©ªPKB!¨¸õ˜Þª¢ .If´fUTCÍ­›õÀòoŽÒZ°ŒÙ^LŽ¶Ò„brÙåóæZï{¥€ºGŒÚˈ:Ù°óé#›Rn4ÆeXÊBx‹?$]d±zß\1Î39ƹö ÇØk76;É,E!†œI)ib XŒm{ª–GàKØà'—wºÕ»ϼ?Ȥº[Z0€oÖ{ÙíLÕ¸w¸Qž’nñ„,¿zWéB,Èr·k-Ñ›1ú“¤#&A>åFDxÄKHÒ:1‰°O$Äñ䉾ô•3”N©ac9²­½>éç*^±W™Ç7r(á­>As¼æÕ|Hþÿ,¹¢8ÂAó\¢ˆISa…J0“܈Ð2EÙÞ­ ˆÑØœ‘Ï´Zçà3{LwLP£Ç3 ãn(-ŽÌ18}%n€Pÿ…’¦g¿gŽY/ÿˆ£E¡ÆË&,Αô†r8ŠÆ©`m[¼Á¡ ®áh¡„áƒA©ÔAAJå_ *<ƒõJ&©Ê"JŠ"ÚpJ%H«*J<&FE)žy‰c=”Šn„Úh”ãìˆÝƒBZeÖ8Êw½Ò2ªÖOzÌU…pp3¦äú;x ž¥znÁÉþ0qÀתÂR^)>fx·)r¡î”#à–‚Uë §67Œ‰°7¼ ÏÆŒp*Ä×ÅŒT—ÀŒ(-»L;Î’-¶×];s¦ûoF$ÜáúˆãÖƒ9º£SrÌ™0’ïòÛ.¿­(¿9¬_~êÀ‚¼ãØSÂYpÌšÂB1E"ާÌÀ¡…²žÇzð¬’/PêûRì°ŽõøÄ¢5D¶¼¤ê¦Ô—§TäÅDÏ +C¸|2$\²E6‚¤ê‡€|„%Ü·¥(„ &eÕÁÚî®I$ÜŽ‚›ƒØðÀ[< ¢ì%[ÒiÄ0 Üd§ˆ+”Sâ(œÁk~^‰8(9AMrÐx¼|ê±ÅK‘ÖçÉ(ŸW‘^E`º$·Ù‘â!âŽÇÙ¡c°¦.qìA{§õ;ö®‡½ÏÆôöS²Ÿ’ S² {¯í|JÖûZ²_lu7E|0<×@"â«YÒNl&Ξtí„å&fž|k—2ɘÿ¤÷e·—aÛ‘…’c!om(Žüà†·-U'†$×qŸàm¸îuÖŒ0õ”gDÜÖ)Òá¿qe1GN“çHî¿Áû«§‰P%‚t“*°5[²m—”)õL€Û%Æd©0ïÕLÁn6[IÇùœ’RþZo7˜Œi¦E0' ð,-…'aI¦è¿ ¿¹¼ÙuÕN´þ…—Ö`½y.´¶µÒÂfI,bë-÷VÁSJ¤° 5>ßkUç¨ÙË+'¦·´ÄÔ ßHÏŸLF´3B®¯¤ /O*9¾²ÝBmŽr„—æÉ¸¼ôùŒ\{®h' Ú•W´SúØãN­Î¹À߯¿Û¢ëÊö¨†ßBtçoõQ©1i¸ùâëA5…ZvŸ©']Ô·ô/g/×óêÓÓIôÏèIz:À/‡w?äê–ÝŒ7öŨØÜ/ºŠÑÝ’E>«‘0Å“£Ìuã)y÷RÒç’ÄF–„m›¯;ÆÏÊkËb¢b×jFŽ)‹—ÒKJ1b¼ æý2ð±ÈþT¬-žÏ¡°°ðë–Àš•0©2ÄÚŽøuê<Ç`½…Û~*BI¦¤`‹Ø“hý=§)w¨qÃgpNÁ‡ AÄ£xƒJ‚”Ì!Rb˜øm…¯!9¤ÃÝ&ʦž¢6.h(ز!¢s&Êv6CçóÁ(õméÃIˆ]” ¨ÙãäDÉ¢8*EÂ\1Á³‰ƒÓ;ɸQRΰ“µÐE^‹±oP|’âR–`¨˜â&YBh(6c¿I‹¢c誔B3W®”©FU Îå±u±lŽ×ß#€±x{²Ô½ÉacÏÈT+¦|aÃRý ØìˆÄùuóú¶mûç:mÚ‘¨IH…Oî›O˜4ÉP𢏆ÓúãNV߲å!]%Üca‰¿ÿUH€#¨Uæ÷­XVs~h5å"$?w„\–€p’œe±k‡ÛÁH4îîÁ,Ö»í…e*ïŒYDD¯kñ&¿™&ÂßN‘™ÈM©ÿLxÅï /3jŠn-™iÂ)º™“³&»l§| Â7E²dpIñ˯¥Êrª¥J±¤¥Êj¦Dö_̵ÔÓ3õ¤‹úv€QKzIK퇙Ð1×ROÏèIz:@~-õšËg;Ø®ŸjSlé¼Ã &Åv)7ÂMÙqpY/éËín¶ô ù²xÕòunÉæº©„œž±Þ¯qZƒ{Ã5D®Âƒxj_¼ÔÒ;8-^¬¥‰g€ë‰6ev­Q3ÊêðyŒ §Ó<³Û6t…e·oǼßïH íç±DœŒ[Þ #¡";öÙ´)‚EøåG`SÍ©ÛVÕ”wTÑVþ'ÁÎ16ß¿cõ[8, =|*Aöà}ɲJ ‰H4”b,Ʀ•Ïm‚- dp)“ž5j›W4 ÷°¨Ñ1éãoIšœØ¢,T+¦f ¿‘•˜ b5÷ ­†$—7„…7dŽrÀãÙ¦0éu‚ÜlªHɃ´-ûÝ9y0y‚Wx³öESEòÑ…^¼…4sºj*‡ëÑ„oA¥.ÚfÞ¢XßÑð1r€!¸Áb_ª09--`/Œãx§2x.­Ü?uEm0!`ÖB¡Þð8†¢,¬t4ý/À€Ð›x¹âWÿïø½G¤žÍœ0¿¾~ rK•¶[ê“)¯ú±YE¿Œ%v¨…*†­©ÊzŠ8Jj™%꺰ÎïNÙírê…v¡e )UUH­–D”¦)ÔpêçGdiœ¾£á;ƒ™®•…,Ïx}my{úö›ðYcÛXXá zÇ ßR‹@ë0Ç6î³c1k7æò¬;}–Í5Me·ñ;p·c~ ¯áb(cÔB‹qxDõ†wݘ’£V*lµ¾Ðés¬¹áÄ3Þ5;öŸÊ 0®Àq½A:à Zð“'h_HÈÆ":Áý§Ò—®SbXï”Ð`¢q[Iù'W?~:ü-3Ñû endstream endobj 1734 0 obj 5511 endobj 1740 0 obj [31 /XYZ 33.1199999 174.740000 0] endobj 1741 0 obj [31 /XYZ 32.1599999 724.819999 0] endobj 1742 0 obj [31 /XYZ 32.1599999 176.659999 0] endobj 1743 0 obj [31 /XYZ 32.1599999 724.819999 0] endobj 1744 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 679.700000 116.640000 687.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 >> endobj 1745 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 671.060000 141.599999 678.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 >> endobj 1746 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 662.419999 145.439999 670.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 1747 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 653.779999 135.839999 661.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 >> endobj 1748 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 645.139999 150.239999 652.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 >> endobj 1749 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 636.500000 156 644.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 >> endobj 1750 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 627.860000 159.839999 635.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 >> endobj 1751 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 619.220000 170.399999 626.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 >> endobj 1752 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 610.580000 168.479999 618.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 >> endobj 1753 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 601.939999 155.039999 609.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 >> endobj 1754 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 593.300000 132.959999 600.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 >> endobj 1755 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 584.659999 180 592.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 >> endobj 1756 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 576.019999 184.799999 583.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 >> endobj 1757 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 567.379999 157.920000 575.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 >> endobj 1758 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 558.740000 151.199999 566.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 >> endobj 1759 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 550.100000 200.159999 557.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn17 >> endobj 1760 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 541.460000 207.839999 549.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 >> endobj 1761 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 532.820000 166.560000 540.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 >> endobj 1762 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 524.179999 128.159999 531.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 >> endobj 1763 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 515.540000 127.199999 523.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 >> endobj 1764 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 506.899999 186.719999 514.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 1765 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 498.259999 152.159999 505.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 >> endobj 1766 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 489.619999 193.439999 497.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 >> endobj 1767 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 480.979999 156 488.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 >> endobj 1768 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 472.339999 124.319999 480.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 >> endobj 1769 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 463.699999 190.560000 471.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 1770 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 455.059999 214.560000 462.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 1771 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 446.419999 256.799999 454.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 >> endobj 1772 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 437.779999 224.159999 445.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 1773 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 429.139999 232.799999 436.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming >> endobj 1774 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 420.499999 318.240000 428.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore >> endobj 1775 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 411.859999 187.679999 419.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 1776 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 403.219999 209.759999 410.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 1777 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 394.579999 134.879999 402.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 >> endobj 1778 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 385.939999 173.279999 393.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 >> endobj 1779 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 377.299999 200.159999 384.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 >> endobj 1780 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 368.659999 151.199999 376.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 >> endobj 1781 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 360.019999 176.159999 367.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 1782 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 351.379999 196.319999 359.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 >> endobj 1783 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 342.739999 229.919999 350.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 1784 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 334.099999 156 341.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs >> endobj 1785 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 325.459999 242.399999 333.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 >> endobj 1786 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 316.819999 113.759999 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 >> endobj 1787 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 308.179999 166.560000 315.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 >> endobj 1788 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 299.539999 170.399999 307.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 1789 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 290.899999 162.719999 298.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 >> endobj 1790 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 282.259999 164.639999 289.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 >> endobj 1791 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 273.619999 163.680000 281.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 >> endobj 1792 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 264.979999 205.919999 272.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 >> endobj 1793 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 256.339999 177.120000 264.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 >> endobj 1794 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 247.699999 204 255.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 >> endobj 1795 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 239.060000 191.519999 246.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 >> endobj 1796 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 230.420000 175.199999 238.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 >> endobj 1737 0 obj << /Type /Page /Parent 2 0 R /Contents 1797 0 R /Resources 1799 0 R /Annots 1800 0 R /MediaBox [0 0 595 842] >> endobj 1799 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1738 1738 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 1800 0 obj [ 1744 0 R 1745 0 R 1746 0 R 1747 0 R 1748 0 R 1749 0 R 1750 0 R 1751 0 R 1752 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R 1758 0 R 1759 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R 1776 0 R 1777 0 R 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R 1791 0 R 1792 0 R 1793 0 R 1794 0 R 1795 0 R 1796 0 R ] endobj 1797 0 obj << /Length 1798 0 R /Filter /FlateDecode >> stream xœí]Kä8Ž¾ç¯ˆó­õ Ôs=,Pèö0ØÃ¢æÑL¦gû÷×òC–(É–d9™U•@eC&m™¤¨OõÓüü¿·¿üëöÓ‡Ÿÿqû6ÿþðó ¹I¦7ûó{ŸÀô³éO¥áÎŒýwûöëËo·ß^¾¼|þÿí…ÊñÂù×ðå"bbø¯oùiþ2Q~þð_Ã_ÿwc·ÿ>ýõö‡ÿ~ýqægüú¢´ümúƒ2ÊôðÁÿË~ùËËÿîö÷áôÈ×þÿ{®ÀH}è6~s—ÒñÇ¿4#‹Ü„4FÞ(eÃMÂÐÿüÓËŸ^î&î@èð,J‹ìßrôM(:¼ J‰nüBè©Bè#„ OrZ_Ñá_,äË®NVJ_5–ùËnâkm¬ð[Ý£í}ÇÝSÊcx~³9¹ÈÚlî€ù.ØÍ»%6øˆŸŸ¯Ï5U¼CŸc6×ôùpâæÝ’xÎ>?¬ç‰÷öø7ãƒð¡¿Í|;Ï×Ùi‡ðzu|vðc¯OÜñw-çÙ¿ õ—´dJZäþ.¢†GÐÄÍ(yÕüò>qpPÅF zÔ½z䙆~W >û ˆÃW¶†¯[ûþëËOŸÔ¿þy¸‰1ÜŸ~}ýõE „"Co}ýãí߆ßüûíë__(܉îjœÌßÀø¸‹‘î#rß05~£×¦¦¦+AygTp¥lüF-·XrÍÆÝó,7|³T5°Ç]À>â>)¿– D÷'¾gö‹“˜)Ù}IŸF ÓBMY ÙWÁ>íŠÉ>w¾Ÿ)¾ùø^+”1¯GjšWŸ|¯åŸÜà{lÑè]µ©Ðì cÛ½ò<³ø+^NyOltg^^ö=Æo«ÁPúÞÒÜ9Ÿ¾CÌI#†DC{7 ôBZë8{ÈÈv ”¨¥o£ÈÛ~þù"?UΕ¾ßóé|ânîJ‚ ^ÿW£ÍÑãå½`þòýšÿ&ºéhTÉ÷k…7Ê»Ãì7ñ@{ÀOQ½;jço1º¶åD7ŸÃÑ­ÑÉ!°åÞ6T¬!è;ðõˆb«‹ì#oJyÝk¾_óOQ16ž>tb¡ãˆË‰ßm~œÎz¶K–M”rÍŒ‚à8*.·ë–ùÁ§ÓcŒ)Ä`z×ùTøÿ¾/÷`y{bP?Lgº¸ÝÇ)õ%«èúMè^õ„çÐ[;ièöéDOÃA!Ws~ðcŠºÞÒîüFLf”šQ6€W]^èî¬ô$l°ßp úL=v¨˜)´èB„—¶t_þš‚Ùé1úÞì+p ¸PýúNd†.@ƒL¹çÙPó õ+ŠÙjPË<׊yPCð¯ÙäY¾“ÞŸmNóìP²¥MÎD6î¿b$ØuP‘^üX÷ÍjÇþ*|»é¢É]˜ìÃÚ{p晣€0á0pPÔc½¡™-HJÃIœh‰Gâ./×sÆvgå﯋Sˆ¹>(»¥ëùczð6¦o3©¼ËªÚãW*µ‘áà’w#Ê•7«ì+ìJ´ .] •.ì+òà^-có Êœ?ÇÕ aH_…l™@¶L#º$n?G4¤Îк+ƒ–Z¦!‡da"àöíâŽcâ® ‘Á7Xàœ2ÄèO½Œ{Ò»Û9H¤Ó­èE^¤TÜAטµûK¶ÑxǼâ7¡µ»ÝˆÝ¼?¦w­‰º©é7¥z¤ò›šÚ¶áÛ‹4wJ ÓšÎ$©}ó§YÀÐ|üL¦‹náÅD#áÛKx¶ ÷Y„Oðíå——÷¿ zƒF½AËÔ”VÌ4„ÕSFag%$w©h¸˜ùöK‹§Y=ËoËOê 9=:Èö\ôŒ†»#sSO©ÛžiÇ`&˜IͨೖX*§Íš4¾ —ÐYÛ\ò ¾ {ÁDP“¦…×3‰d {‰cy@(ã/ꃴ•Âp0Îëgí1ú_¾fyN Ý”) õÖv•í)±èãÊ'”*®Hq…J)®0H©Vܱ y_†S\)ÅË‘âŽm 䡌+è™Þ¬$Kc D«Õkø¥¶T¬§ÀœžNïk!”ê©HO%¤ôT*¤Cë©tйò ¾ §§’§ôT2,ƒEz*b®< ”q¥žJ³¼Ç¹x Kx d¼—À[¬kÊŒO(Õ5Í®ižÒ5 HÖµ± y_†Ó5MSº6L½‘ éÚØBʸR×´Ú׵ȋåÝgË,þ5l=ÌÄÅZ¯]Ê@ø„B­ç„„ZÏ Mh='<ÔHK@Z?µ!!âËpZoLJëmI‘@뎴~l!e\¨õœ,3®Ë"ò9Û4?okYYé û×o/-µN\¨kCPj!Mò8MMò8C“w«Ymà«VF‚O(µƒ“D` F`LŒÀ‡À˜1á:…ÀpKÀ–¢Æã¡Œ+-Å8¦ãî’ÁRáâ»Þܬà5>¡PùAà† )pCPnXR¾© y_Æ¢|‚¤À A¸a Hù¦6ò€PÆ…Ê'ènäwîïúè›âµ±¦]Qü bù{?w®ÜÔ¡(_Ý?)ݳ.°ÔM:8U>¡ÔbZº,µt/Zº·l±lYº÷x_†³X–ZºL`ÑÒýÔBʸÒb9­·Ø¦õ Å=0…~t¦À±H‰"×roV±°)>ê Ñ:GÀ݉3厦B83†`*„ ñLK@€©%Ií³˜?9ÀaþÌ€© `0ÛpŸEø—¦v/ð¬0yÌñÀž‰Î5š+ÊÛv­ôvJ ×ïïiÜw'8à¬á´¬„VAV4FQŸP4H„Æ™Bc„DhŒ%à A.hŒÇƒø2\Ð ShŒ­ôdDhÌÔBʸ2hy‹5D.öYÅC¦ô’]”O(5 ¡SP‹Ðj±lzZ<Ä—áÌ@¥ ¡Ôb Ø Ôµx< ”q¥è.Û *JF´,µ¿ C©ØMÙsA£¦GK=ãÕ›Š}‡vÓfÚ'”úƒ‘2“BÊ€ ¤Ìï˜Úñe8ßa’H™ÁH™‰‘2ã2"eæ2 n¯GËx˪Ay†Ù¡ó€Ž˜ß‘ZP-{.ó ^EµÌ† Ìûó )JS¾DKšo¯Õ& +|¨À'º1 >š‚"øÐ°£ |èñ ¾ŒÅMÁ‡@–Á‡Sy@(ãJ7Æ|ȳnl_a[ÀûŠPäÈ>÷hßÔTvï¸-¶)¶&MŠÉꉀ£D"à©D"à(‘ȰMqgDµ!!âËXt]’Ž ‰À2"aj!e\¨ë’.8BËFÃGŸŠpäܽ·:<°òן/éšË4Y­CP$CÊ ú)o‚b Ø›0ç>X€ 8Λ°‚"Ã2"ej!e\éM˜ùN¼És§øI¾âAcéG(5 Òv¤H¥íHÒv,›…XÒv<Ä—áÌB¤Òv¤ XF”¶3µ„2®4 ±€?¹¾ çcløâ(¬ô«Âƒ&ˆO(U ‰  )SЄ”š°¬@r&<Ä—áRЄMXV X  „2®T Y°·¨oñÇrÑ÷¦#€}£÷~B{6zé:Óz1˜ôÐ íJ}…Bè…T)ôBj„^XözA/<Ä—á|…J¡R!ô°¯P záñ€PÆ•¾BB/Êצ*3 çàtMÈÈÛTt#ûÇ…µl—k耊âýß{}ŽÙ#é5Wev ÇK1Ê,'#n0üüóO/ïnáŒUà)¨úú4YàM ÆÓy¡CûÁòÇHU¤–ä¦ü¹-I<åµMúœ7R‘¿Ü÷AÏÜ6`-Õª›E|Âa?¤†ÿ/÷CÔåËäËÏDi\¡q¤ µQ b‚·á ®=ì·Ø$˜ÃĘ©äÇM‚“ëM‚/HÏõuû¡ÑA’Wýy#f[¾ÄtêT~¶NîfâbÜîÇ­Sèë­Œ–-xü¼óÀ1%»œ›wîy}±CEÍ™ç¯Eº4¡Súö,x'Æ•"GXÀ»þÖhÖxàÌÒ¢ª) »cšœmKì‘À5Ja”¥žÍ *廢ttAªõë‹ÍŠIèÚP¬$Š•LÅÃÄ$q-ÅSò ¾Œ(V2+‰€bK@@ñÔBʸ(÷å=6ì„l9Aº&¤ÉZ Wxö9ºý@飚–-0ìþéîOuRή+EÌ'”:rÿ”Nåþ)rÿ,;½äþy<ˆ/Ã9ÊýSZ`QîßÔBʸÒ˜G~ce†ŽdöløµýŠ}·Àô<ÉûQÛš[2Šó íåÀAM©‡J§eÖC¥}Âѽuš„åÒ4I•K þÖ7K@{ëÜn:Çbþ–KÓ$U.M†DåÒÆ6Üg>Á¥{ë4q§ËåýØëNò½ÈÐ \ÞÃN]ÐëÙÌŒqŸPÁ¥ QF9$ºü(òŒ%²âìvªš T‹óï8É+ÌC2j…L”ñ ¥ˆF®Ñ)×h„àZŽ@´ 9t€à:.Ñ)×h†eDîÔBʸ2ч6TÄ»…*F»ØK)T È/HÍ@,]QbÓïëÆ ³&îMZgª@JMHR„H9PCr$„3·!!⢠f $@Jm[ ¤œÛ@ÈB×ÌpêÁƒCÅŽ§¶v TÔ\‹¸Ÿ•¶>¼æµ‚£ ¥VDz:–›*GÁ0Ø4·!!âËpVG`Ó@ÕHÅ`ÓÜBʸÒêØþÖóŠ„:„«æˆíâI-ˆ­P“¦>¡Ô‚¸FÄP“&‚"íjšÛñe8 â ¨i J$ƒc¨in!e\iA‚×[Pߺ)}båöèòz¯Ä Åšïf§b+á ð  ÀÃð9< Ôx !ð0’¤öYÌŸàaøœªÀ0ð0µá>‹ð ®4‘îTÊ|žçþ9ÜöÝ5Ÿ¼eO{KM²ØÞ>ä"ñxƘ÷Nù–§¦tÎvlñ}y¿Œï~Î .Ãz}öèd>¡4P…*õ ¿žÆzæ6$äA|.P ¬g 2,c=sy@(ãÊ@-XOËÑ…Zá4]ËuŸQß§"UDäŸsãi¢ø>ºç–e‹|6RyRPM:Ý3ašè5[OŸPêM ÂL331ffB Ì` Ì$0ƒ0aÆa&ÂÌSa¦`ëäø ]+ªwuU‰Žë⧆ú¿»¾ŠÍÚ¬)v³Þ×!m”"¤ÒÒF)BÚ,™õÔ†„<ˆ/c1kJRH%i³dÖSy@(ãB³¦vÍ,2ë‚íbQ Þ‚Uw)M×#ZéfÿpA縠ª¼C^‡¦Pºn‘µåùVB©ÛbÞ¤,oRŽàMKÀn‹/ð¦Çƒø2œÛb)x“2oZv[l7=ʸÒmqoæGú£}ÐAN]’ü*j<—äß@ù¢{ÅÍWKuò®‰SN±[ák?A}B©[¹‘Ø”

    ÷†Øy'çª#&ì‘w—Õ„ü5ô}ƒ^}ÎrËj)Íkö§ì7wäœD 7‰ÍÑ}Êb_j>í­È¸'‰Ôâ¤<ÛÖ¿ç=£»ázÍn„¥Iø»ìSœ›œðtúÎqrÂÒ·‚DšlÁ« ®å5èú$Ÿã^Ë3cü¾S:^aºO€žÓRI()¾/†û—ù×qÝ« ßßB%°½Ñ¿|NÚg×f>¹ØÏ8¨Az «qjzÆE¹0/Uø²O:$ð ­©ôéÛB »¬·tcþî{œÚ”çÒ³ØôIßÎÈã8&ûñ#/¤å±öcÓÒµå*[“R»ç@Ï„´Õ­©ä|KÆïóq81ëš.××™â{ݯp¶jâk;œ6Ýȹx$×ùÕËFæ9pÕÒAøÌƒ¥³eºÝZ¡Î=8«Âè¨Ã¹+[À%z†nÁÉ–T¥æ{®Á\H~ ¿j–7¤Ð%I9C¿“— ûÓÇ„óOjž ’)ÀVd“RrWE­&;6¿ÃϽ™÷§ ÖÙ“$(žU@¨¯p+È3Ã#~^ððsûmx­TŽojþõíתb^y²/›*²yé~²¼Ñá1Rq ¡ò>>å“”w™F¸gÞ+Sw•ÎÇU‰o¦—Äùa5 îrÒü¶Rrtö“½f²xÅîŒð0aú}–Û¤§qruªí<íH<áçÜ5³óM}CsÏ1ûçºkæ7Vóìó½p@ëìß ¨K¸Qõo{wªÞ6‡ìÛξÁ·‘ÿ&Û³ùkæ%º:í=ÃN¾[­%x‡/9oÒÔ«àø¥§G½}yù»´ endstream endobj 1798 0 obj 7117 endobj 1802 0 obj [32 /XYZ 40.7999999 338.899999 0] endobj 1803 0 obj [32 /XYZ 40.7999999 338.899999 0] endobj 1804 0 obj [32 /XYZ 40.7999999 100.819999 0] endobj 1805 0 obj [32 /XYZ 40.7999999 100.819999 0] endobj 1806 0 obj << /Type /Annot /Subtype /Link /Rect [371.039999 163.219999 437.279999 170.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 1801 0 obj << /Type /Page /Parent 2 0 R /Contents 1807 0 R /Resources 1809 0 R /Annots 1810 0 R /MediaBox [0 0 595 842] >> endobj 1809 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1738 1738 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 1810 0 obj [ 1806 0 R ] endobj 1807 0 obj << /Length 1808 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eöƒ/ àÛr`Ø@‹o6Áb½Èdùû¡DŽ4bëëG±ºÙ¢Ú<ã©!Õª¯]UýîÏ_þ±ÿ×ïûwÏ_þ³ÿ6}}þ²«USöÇ¿?¼ýìJŽß¶]}ýñÏþÛ÷ÝËþe÷y÷yø÷e'šÓƒÓ—øúã ÿöÛîÝøá»ñ'_žÿ:|÷¿½Üÿeøß/ûÿ>|ùizßñ¾ïº¾9~óëøBvÃÞ~w$þ{÷·?ì†ÐÞ{ü÷ÕuUß,ÆËùQqúûöQðYÕ^wµ{!ä0ÈzX‹ÿþs÷óð®ó ]#[]W}¿÷øœVNԷ;¾Î?Ƙ«Ï‹Ä¢×ôZ*†×Œë·hR¢Ò­õE‡^ Ñ6º­|7ö4ÁºkÇ öÕ²•:¿hÙkÚãæ/Íq4bѤÆ7_ô™C&åE&_,>}ݽû$´êŽôõça '¿|¦ZïxB×û¯?íÿXUòùOû¯¿ìúCÝ«¶ao¤T!åS8E4ð™÷‚Çö„(²'ŒM ‰¢Âw[t¡ð¨$Œ ÎTÃh8LG-+ g* _+(Y–±Á5¨x÷ÎSH2Îôã×…cƒj£ j')ðü6U±ŠæúPó8”‡U O5æ^8 Ø}b‰GP’ ZØêÄÏ@Á°,âúP( ©ö„4]ÀŽìšJ.;\LÁ0˜ÐJ;"Ø©:œbÁidH“b‰ý†m1ìúâåÅ R,»¼)Ò*)žÈð¤Ï ‡#ÚÕÙ¿Pò¦< ^DlÖrÿ{¥< tâÒýõe¡€ì:ᮆ d1JȺØ|™S Øe- ]0¨ÎÛH)É¢L®XvÛ£< ZŠíÉB4¤iˆê£èVP˽¾…ò`êRxe¡— ¸¤[kâXM¹É­P ¸ðµGسÔ.SºTì·õ­õ ßf‡UA¹5/õ¡ÜÕDת4¸(”‡R5†4ØiÈrr.2pµî{ìŠÔxƒ×¦BIGÁ¾ ¡Ï6>Øá½[Û°¼|M‰œRšÊ¤Š¶Zöô}:àêÝiô– +’[,;—±Í±T-\*QËëµ²è6|«lªèÄõH3µŒ)÷›p‚S ™— c¾ZŽW† Vyªã-‹:¢„1×W¢NÌÙ7¢\RH~HG£¸äÆÅUqu`«Û;Ñ£a#Díf„B);,c3+ÂŤþø”Ø4!ro‰µ2c0EQJf& É'ä½q ï6¦Êû²nC„MoÌU”Vè˜ðZSL!Vù¡¸ÜŠÏ@pª]å.iÒO ì•^_óÎü˜w(•Ñ)¢:S¨â2ïõuèãP46Ñ)6!rHj5B¹TŒ7‹õ>#»¬ÙR…ƒTðÀÛûwÙ“I´Dí®é–s~Š@`1 SX½´ÿc†[Þ4$Ò¥|”BkJ4½ø,sxl8„a0ÆqYÜn;") ¼:„H,)¢H1#°+Ž/ÿ{ìeuÒ-ÚÌ)O¢ª[w%£EUãÍ"\WaaXÌ–x¢*JQÕEUUª¶¨ÝÕk °œR¤‘7^Ë|¤¼A“ ÷¨N¥Ü@ê:7ÎRµJ1 ¢‰G@©AÅëF8ŠŒÒ IqÞ,l»ða¢ë é2\}R¹¤$òÑT³‘®Ž…BÄNŠëJ0kH½J "Ê¡é&L‚1FÒô,¾°·¬¬õó"y J‡K JZ嘔;íví*=®õã;/tj×óp,:Dðþà£Õ)4²–׳[_³Je+í¿KâMp²TWc9þO‡·¶€U¿¯¯)^¬CZ&ÔSÚã®FJä %Û¹ÁIÊ/ke9;À+â*ˆ‹¬*ûêz¨‰õ)”û±)µ©ÊÙ átˆ\£õ%[·õ|.›Dé4·i®[­'*}=RÒy f„;ôµZq½"À÷}R)­)K¯Ü~.UU8N¦'dÎY®ÝL•‡—*^Éçµøt¬û³E?°ó¸ OÛU#YY u=R6#f¸M©ñÉìJƒ›¢’ã©ä¢^­¨HÈ0¥„´I×®n¤ªáßÚA{âv9aX*YØži¦*ªYÒÒ|„–‘±(J ļ⼾QrŸ&ÎÖÚúÜ¥é‘JxÕÇâÎú»@)$¢Ì”WU§:D¢¬ÎÆ"p5æDŠÑx¯YyJzÜÏ*ŒI².k•oBþجùÍH×7³r¦¤Êv  Q*^-òÈZ‰j™)åN&Jœ€5%ÍÒßiuEERGÅDÏ ú$Óݹ ´»û•eY—Wñöö^½+ûãP¶V?‹ÛËâc2AIlMHí$ridÀ»nI`½qwJ²0f1Ø=C¥*Ehy}&BŸÖÄàÀd­S‚{dno¬4‹·{œeç(W ¹|™$jªswïÙš%T(ÅûȈ7's¸VšÐ~ÎbœºV‡TDío!ªlŽˆªës³„ójTãŸËXF£m=£ˆ÷¬Ïôè™IÆÚƒê«FÖ&ï‹êPŸovJ"Ê´S7(“¼4%NŸ±M øÖ3Oh¦bÜÝî ¥èÚ·ó™AÔ‡NH ±ÆÛØNñz }õ)qYŸïOSãjq¨usœÀ\v›Ã41ƒ£õåõ´¤zä}ƒyºË ûùªÙ¦ã°/›.øÑ–ˆi7º9wM»>ìF5 è…2rq}Prܨù®ßZãƒåÄÖ•ÚµøÙ³°˜¸HÛ&ðÏU6p‘àÞ‹ŽÑÿƒ-KÐÌ×qÎkx‘,3÷g実31O,‡S:è-.ÄÜŽyÚXà3„6­¸þà÷p~ø™W ¬D}=$L1ùÒØY‚„`î³lþG´l–g°$bþp³.‹lh|.›m‚ôM]Õ× ÏŒ1Á·Y€*cnæ.ÈÅÌš/uç¿“˜ž\Ú~*ú`Ø^ÆjQÖÄØüù[-Z¯š¿¸š€o•†¨/ùã7Œå\b£ùOÂÂã,ÆiS©\ÀEÔ<}=suBL;ŠøBˆÁ0aa+Ìw`µO±¯û"ãp ¦—Dw“k¡Ý£ ÃÕÅP1ÿUŠpcŠüäÒ!6øuߊlU&³ìV€òy0÷ÔGÖb&Q®Ì½ˆÒ-Û¹x;M=‹™dùzÿå£$w°¥¢%W²w-¹?b½FÑxf„ÎéyX,·uMÑì˜û"ǸüGoù<¬" Ïä¦,ŽsÉåG•±ÀäX¢Š3ŒN,1~<âsÆ#„Сŀ‰îµÕ MûóC§P m57& ¨lø(:ã­¦øâ¹+‡qAÔOâK#>‡ ³p@ìnÆF£`‹<½%+ ðFÝ/äëk-cÅg«»tÄ”r/Æ\[™$!‚²®ŸˆV¥ëf«’ÊØŒp¦ÆÍ蔓ÏóŠmÉ·<‘oÂØóð7 Ðê6{ÍßpÛ#ø‹-ˆ¹nÊE€ZáÔQxyC:hÎÂ탱"Ý~ˆ™] ÄµÆÐbD€k‚g„lŒpå{œ’ïÂzÌ¥k¸öO‰ì©s[õs¢nÛ̲r1.½àÀ?ù -dÐîXvý=bËX)¬º$McÉÏjQƇ;ÇŽÂ`oùó?å\6$‚ä):`U\|ýP…+dr¹”%¬€Ž×õÜÁL“0…êL¡Ø,÷pêóe]xç6vã«&𨅯3nÁm9‡£Öéšì4më–…é†3O†»µnbé9 ë-¥ÿT&”‰“ztbÉÂeâ¸vS#ÈùŠlSp”RÆ¿~;‡*]˜VÔÎ)0·é¥´ìÅ–æ^*¥/•¥q¯®ZO4ÜjBaJ ®ÏçIØXpQ¢Ç®º*›Ø•l4³‘YJ;ýkV,ƒOEIÙ6JàeÄc]#Èã,nsÔ_’¬$[­fP’T&&°Š²Æ?ÒB_d†™‘,u›¬Õ™‘Kl˜%ïbãg–ƒ€ÆÈi2KŽQb*´½…q7ãO¼pJ¤ÿ8uGÒR}QsJø„yaËžõÖÈbâ‡êÂÇm=îjwj-´ÿ¾ëßçÍ~Ý}±h¶8*ñ8„[ZxYÞXš7j‚â»úµ}¯zµ¶ 7%gÎLöbI"89áp4Ó\Ôõl{]gcaqzd#,t•àVmNÞÍy Ý•R'í–jó X˜#²`1Øq&¬Á£* ) ;}I$ƒ vaíòd ZÅ÷Cëf&+ 2K#…o(žU@ô ‹>Å@×k–ÔJ"»3˜x_¥vÛ—§ÅI<05Qú ;PrÞYÑecî§NA´$ &É9ŽÙ‡©š96”U b˜2¥UÏÜX¤•ü&J—LC¡‚ f|—¸9_PjÔÓ6µ¼'×–¦°A:–¥S¤ÍE””˜íˆD} -”aN}émqaÖþ¸ú„R•c†F,þ8õÿ†_P¨™ â4½Ë׫ ‰À|œr9ÿE/ê-P·gHÈòtÊ¡ô2KZm³!SÛÍ4!ÎXýmOˆ?˾-Š"`±U´„làõ4èßFiØÂáªFé‘‹‡Ð%¾3Ûö„ÑnÕ¡á< ÞXéö’‹’âk+)õ57§Š°vVãq}‹SzѸìŽtŒVAÿ¿k®ùw‚[Àkîí'è'f:#äD!.¼#^ÎbíO·¨Ý}™Ûp~lãÔË™mT¢8Å™òÆn €BY­×"Kc¤ÔþYÀ’ÀgzôÌä=ˆê0† t¦hð2Y=Ãg> 1M^^sP'^z+OÎÃõ¶øŽ{îÜ¥?·‡ƒ~Nc‘ÁŸab=‹“i|Þ™›V\ mºjãÖHð3¯á¯JÌ8 S2jÝ“Ú#õÏCd œ…x ‘{Á¸Ú‹çì¶ßQÎkLeÒ¶×Ú$Umtœ\Ï•ÒBÍÎ}þ–䇄„¡ýóB² @¹ÛªYû^¥µ¬Rö²»Vå‚)×uIkæiõ“«Ø{48sC:–Í8~”Ó’•c’‘}½úL`€¸SY;lsÆçâ¤à‘]p0 Óˆr0äÜSÓa>òŸ–[õÉ)>cúœzÆŸ÷)7ƒ³tìu—ƒ/2Ù¶R®¯zqk« ,^ Aó¹ð‘€,@®j³XÒ³j1ã Ë ž„+Z-—9ãÄ-¶K!a¥qÓ_O:Rî+áÚ™ Â©ce¨–å=l_R1€EiA0ò]§J¯#Îâ¾ C~߀‹ï¹…€"£J7÷òÈ·0ʱÃ\a”ÛŒt¹±ŒÞÿ¥?v©±2—ÖÄïÆs=-àðwÿ2¬Ô°Ç'¦/ß¾]Wöæ&´ÏÖU·>êNhöb˜×m;»9Œ×ç©ê|­øtÞÝšÛ¹C½>k5ò°líí²Êöe\y¥²Ÿ™Ö“¢«͸£ó=¹õ9|¦‡ÏŒÆ}+²:î_(Oðm#K›™·~w ûߘá'ôÌä‡Ý¢4Ɇ{fÚ±¹Oc; À®;~/kqî1Іïö$ŠA»­j¸Ûp-»)peñ3“›ƽ1ätéÞvƒºß}½É‘nÞ¢*#¢î?ïþ£L¤ endstream endobj 1808 0 obj 5196 endobj 1812 0 obj [33 /XYZ 40.7999999 525.139999 0] endobj 1813 0 obj [33 /XYZ 40.7999999 480.019999 0] endobj 1814 0 obj [33 /XYZ 40.7999999 391.699999 0] endobj 1815 0 obj [33 /XYZ 40.7999999 223.699999 0] endobj 1816 0 obj [33 /XYZ 40.7999999 480.019999 0] endobj 1817 0 obj [33 /XYZ 40.7999999 391.699999 0] endobj 1818 0 obj [33 /XYZ 40.7999999 525.139999 0] endobj 1819 0 obj [33 /XYZ 40.7999999 223.699999 0] endobj 1820 0 obj << /Type /Annot /Subtype /Link /Rect [426.719999 401.299999 466.079999 408.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor >> endobj 1811 0 obj << /Type /Page /Parent 2 0 R /Contents 1821 0 R /Resources 1823 0 R /Annots 1824 0 R /MediaBox [0 0 595 842] >> endobj 1823 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1824 0 obj [ 1820 0 R ] endobj 1821 0 obj << /Length 1822 0 R /Filter /FlateDecode >> stream xœí]K¯Üº‘ÞŸ_Ñëé+RÔ ðãÞf1€a³²œI‚ 7OùûQ·Ô‘ý‘¬"K¢ú´ ø·ZEë]_ýôŸ_ÿxøË??}úú‡ïóÏO_ߪcÕVÓŸÃéïoï?Ðý±ÖÓ¯]ßõpúsøþëÛ÷/o_Ƽ©ö|ãüc¼xyÄ4à?¿ÿãí§éáoÓ'_?ý÷øÛ¿úð_ãÿþvøýÆšÇ;}á×·~hO¿ü}úEi¥ûñ?÷¿.þõí~søÇ8…þ<îéßßšªÒÚ$MãÇõVuþ{+xVuhÆßûƒRzœd3®Åÿÿï۟DZ®“8ö­îLS =ü=â9¤ÆíºöÐtÎSœWG%Ó´Y†g£RÞIU¦ó“qôÐfÙË8‰KW7:Ç0§ÙäØ8NÆ0•9¿rçž4Ò;_ÆI\:Ó Y†g£RÞiÞ8Îq0Ju­éªXÎvž×0Ì«4ZÒ ^JF)ÓäXîÓlTÒKÍë¢/¸2f|ÃZ7‡~œ¤®þä#ñ×j§©ë,ãœæ£ÒÞk9ú’CÐ7Mà‡çÆßÞ~úe8)=ßþ<Îâ¬9M?¾ýúfÆÿŒú€Ñ‡o:üǨ=µ¿;|ûÛynóýÁ§óæúþpþ@©ccÚ¾kªÛç^}þ ;VC=~±º}µ2Ó¨G3]à òóùJ3j‚½ÒÍý{Òî{îufä ßfìço# È쨥ÙrK³,m¶y+S÷hê½ZN]OOŽ== + \\{­íã¤;5ÄÓN¯0N­ý …÷¾?_iZõ©ânÔŸã) _ N^Uö7ðác”½h¦A,@}´·ÑžQÝÎT×µM»¸—~È<œo’RÖê`=Ï^ÝÆsÅŒlÆw^œ­‡ÏuŽá^w"Ÿ§õ­Žm§R®þÁ÷|œÉåd’.Ö_‘ͨ3-ù/Þ~È‹T—ƒ°í5¤ó¶AáNñ3¢pRç«&zF»JâŠX”„§(yòeŒ®µ *ÕGéÓÖõºPe!,îª1O!>I,ͳ¸Æƒ²ØK|h”•8ådTs2Ôé.±ÍÃ’¼ ÏfXÑO2NóÄåËbÚ«Å´ ‘7í~ô„w@Ê2´?âÆe£®s)͸>*ýòõ×ò—bÞá Ï {R1gÅoga1­j‹†K ‹Éä;ålkë™+ư‘.MÈs]…iÔ-•kHšh½5 Á±†½ØYG1‹$Ÿ«Í*Šâí7¡V•¾Á)bŒ/7§—F) N™c<&'q‰‚R^ÜP(¥ YÁÒÞm©Ò*IPo‹æ}G¤"j·É çIi™š<Ìå ûæÉ[ë×4¯'£îtk¬ÎbzðÈ=Ë).ÆÊ-ËýýS<Õwš^²üUZ ¤ â#pBu)ð]°H2²ŸÞ#ú_„@äûëedme–ÜuK'Y«­É¬o¥méRz~Q;~vì ).Ò ÕCJrªpÄòFÑ ‚,ʳB‘RpQ^˜ì¹”z뽟kU™vm¦ªÆf&!XÞ÷aúãÌ£å5<°ÚIêçƒ'àpÔîK2ØÊ[ÛS/›ú…´ô ¨IbÿH ˆF[¢\Í Hˆ£,Už,_ùvé ¤Ñæl†êê49س: ‡1zÈAfÉ”‚Þ2<Öéš!í°då€"$1 í=Φ?îÀð0ú8™óýu®¥ ÕôǦysìëŠú@¿çV7ãÜ3ÀçL¬BÕljI?"g´‰3¨æ81†¨+³x?m=gV“G91±|G+jõ4˜c‰‰»$Æ ¥™pj›pV!£ÖÍíÈ"V³ä7rôhBûDBF.£ÕEŠ ìú&âmYaƒªwÞ‹Ý,¾y™¨sÒ½œÖ Øtbd¬°Z}—çzH‰¢o pš æï&V(í/5ñ)_”˜žs䳘2mArë(fÜJÅ)¨Ï%>=†Ø{‹q?™³)Âmé|Ÿ.LÁ¬¥HÏ¿5Û¥D*F¦ËwÆBÖŠi,ÏaLYäd^à¡áNÄs€(µY4}‚îPZ épFØ›Î[„=9ŒI–LÈ”æÆDÝ<+£T‰Ö‰·Kæš·7îæ~Ž¡lš•’Õ«PN%>‹‚8)ùœs(Á_<ÎÐöúÂDVŠ3hïáÄð=7±ÈjÆ{MÀq=íÔ£8 Ç@3˜YUw¬í„¯à(yoÕYMîÔµÌáfåô¿‘A™À±ex+f•Ç£—ЗåÙå4²Í\Â`à'/"J|Š'6×ãôdNÑŠÂ1BÔ)¤Ç}.ãL VzA†mz‹cì¡ÏꇗÉä$Äüß ×ÏèŒh¨ýny¸?#¹!Ūg5 »û_¤fûòEæÐœ ’•ªüMyÜüŽêví(D&šàüÁ®aÌÛœ%!¤ô3 ñ%´Ty{ôŠð¾önÈ(BYcû®gF"sRÿHŽ‹N&»!øáF`¡°'Kѳ‚œÑ%²0fÉXö–-.0àÀm©î “þqé¾§ï„åÇ¥ ¸ a>’²jÂn¾VÂÖ Gß)&ÝK¸d%óáH{^ÿà6%“Â-*ëÐyJŸÊçN´V'póI£O™¯“ÍNÍ«1°Ô)y–áêͰ=)rB–¡ ZJ §ŸEñÌ­ÇîÚ&ª¾p'r›äÏšÙCq †i9#úˆ$ SÝ-7Šb®3p&œÃ˜…Ù…=MÛûͲ„PWaiûÅ$BäY­x¦À²f80_œç×*©eÁ¤xaåa—عCŽ J‘¦k—R„ Ô=îY‘Ìîí3c$JF·+Âà4Bâp”p”­&ך&0? º#™ ‡1úH³JÚ’LG ‚…¿ê¶iç$¯Ê~³Æ`° @¢´ŠØ0¯*Ý,…JPc·g;ÞÍÍí‰x‰öùæ¨Í[6Ÿ‚”±6ðbq. °óíªl9Tva˜w!s>!Ï9K0ÙÕG²¨±±Ž"IÉÑÙ¢ceÿ‹GWˆJº‹N¨E 8àwä·‹`©ö‹Gèô+Ç‹ë»ÆÍÉ=vlúPYæÝóÂùwP±p)Š‘ÔÁJÐ(˜’àD¬ô†^´~°$«©¶Ãl9:Œìþž¬Já°_,¢¦ÐÀe\)xÛWW¬{ìŽ$øw0 f<\)½A<çΪþ¤ t‹g„b„2öø«»àŠ)CpJö±Þå,R9¥ßŒ“IqJË[®MkÉõÊžŒÏÑ_«„ŠáÍOñÔáyd³W›vXnx s:k ÏAøW<3ø,Mÿí”uGÿAÑN!nxBö'0&Xc›×råÅ $Ì—@ß 9±ï´uËõæ©5 êÿ¼YŠÝAÐÚ@2V.ö“·õµÌ#!ÔârÙ•Rb F®)¦.¬œ`'I0áŒ#À²Qʨ§¢ÒÛy?äŇ'8M³X yCÃ2Λ„:HÎ)¢¬ë –I–)Kµ8ðIó‹)„ΣQstBBÄŒì\M]o–¢©¼´7s特KµxË铨åQ±¶$·Æ>ÿwÆy¯D9­ºšW½º­úiñNkן±}§Îæþƒ¿¿}õ­ ½Ê¢÷™ºÚcSÛãKú¥ø™··(wß^kqÖåÆÏÛs„î$ö¼¶ã+:»ëBTOOVæ¢/ÄRòpE|Dyâ×eG„@˜Éí÷ä?´µ¥ÈÔâÈU­­;QÌ…0/,õ ¨rÓ„S 7}Èâ ¡äÇc” cÄ?oÏþsÑœ‚Ö@$'§` yTE9®ú'Wåíw­h–²Q;r‚;Yv²˜õ”Ú?žSÂYLo ÚñP£‹lÅ · óÆ£­ÂÖû+f.§xÖ¹Åÿ ¯ì\i’úåá£páñùÉ«®x¦Ð•Uþ–­‡3‡á3Ôˆ|9ž×>»‡”êÚ .ä_Î_(0K°ë÷] ön€U²:ã“(Àr³@ŽC˜} Sq¹Y†/ 'Ròò×$™¦±ød9I/;ÊLMÂó"LÄY'BBèE³RÀg%¥Õê-¼a¨O±øÐM[²GÃ@3A<éÀVÎZ×édGJ1xÆ|(GŽÛ[¥•È ÒW‡ìq³)œÑ¦õ"e%`ñ%®6LgáTOpú~„û’#sfn¬'„rää ¡¼Àäˆúßs9p•²1và•$4»wW;ºR>³»" ÝyäìNBu=IUP–4U³&W…Hö+YˆS ¸N¶™XÉQ°&¼éÂpäk³ìpÚò®Ü²`šfQˆ‰Yœæ¼åPRP~JfeÉ“Xx¬µAä¨eÏØx[ÞˆìÔVÂoÇB[»ß¢ã—'ùË^‚B'YTذ)J0›+I÷Š /½„ê,Ê0»%ÇôhCŒ¢í8Î{NQUB¹öÕ ‡¤Y¡E†ôÈR­¼U<Ï"eÁÂ%TDfqyŽÓµkÄÏY"¬çµf:O@ư2–VÙ®Dqtç0|C!ˆìû ˜†zY´Ã¡QuU]ZYÌÿWǾÅiÛ*ÕŸ?­m{‰´Í|k›£Rƒî{uùŽY aî0~ýô= 盋›õÐ/pú`¼ã~çï ‹!†åþúöñ7bÔs"žººÔBÔŸ § *ÔsÞG¤‘RµH°m u›—1¾ì¼Íí¼°j:¤†&á­ÅCyhMÖÓ½+,ˆRã|¢A´nɹ û/f”ât"l(¡ÝÅ8éFñ23¡['IZPÊn‰$bÉâåün e(@k,Yý¤¦A´» zƒ2“ÔkúåÖfªÝÖ H\@å©4ƦŒçp*§=5¡ŒÚmV4BðTïá*[Xç‹GÃ3Àûã©Eç@K0vU‹Î(DŵÎ Áõ–Ó§œ‘ó>¸Fœƒ}À(.öÜ“ú£æ¼)^QL£œYcþÆ¡Ùbä"§º.L/Þ™—opÏ)™Æ8:§þÊ‚s.ÆûÔÙê>´l”^¤>Upä I‡%šKnf•Ͼ6ð¬á <§ ëv¥`ž¬së ´Içá ¼[Œ³ÉÒ>ø$}¡ÆôÂxÎÌ;ƒè9®˜¼§ó'¼Ö  ;Ž}‡m\ïÄ<ŽæyÓÚÌ:Ü¡ÓAJzÉç—|~FùÌyË—”—£¼ö ?± ]h¸¤;y$ÇßÂà,ˆm:¬%aï4‡b1õq48<¯©á›zt;8ÃÑ.!r˜g!½ó|2Æ¿‡ãÉûô…ùÇ÷_£ÒÝ*7Ýí‹÷8yo £š´5¾ÆƒcXªš;êÊ,­míãÚ¹Á§•qHWwÇîqbA÷àÊÄhêú¨‡‡IjMsl§ÛíJŸÓÃ{xÏ$¤:}ÔÕÛÃ&©G£Máþ“Ïð»3¾Ôƒ7üÝ3³‡GWz9I»gÞ1Ê»Ïs;€ª;ý®uqªÎÌš´Û3s#ívÝÀ݆;èÙ |®,¾gÎY Q¯Ä9MÝÛ¾oÕ4ör“ñ‘¾·®¾ä䨇/oÿìéA6 endstream endobj 1822 0 obj 6134 endobj 1826 0 obj [34 /XYZ 32.1599999 501.139999 0] endobj 1827 0 obj [34 /XYZ 33.1199999 499.219999 0] endobj 1828 0 obj << /Type /Annot /Subtype /Link /Rect [386.399999 648.019999 430.559999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 1825 0 obj << /Type /Page /Parent 2 0 R /Contents 1829 0 R /Resources 1831 0 R /Annots 1832 0 R /MediaBox [0 0 595 842] >> endobj 1831 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1832 0 obj [ 1828 0 R ] endobj 1829 0 obj << /Length 1830 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`iö“$ðÌØr`Ø@A7›Åb½ˆ³‡üýP"%‹l}Í®êjŠË ” ½ÆvÃV£²65HðÚ^˜‹Âi <è™ZKp·ãjD!胄‚¡¿)_#/>}Ú½yßt©O?õ«8*dÃO=gìÿÓ«®ÝúqÿÇ^){û§ý§_v®×ÑZ¥ÝQŸ4Ç'í·žØóª›ãLé㓦ª;Ó¸úrŸØa¾Ê.ž8øW`Íl_ÁFµ‡@‚£ê°JUÎú¶†‡·7YRpLöó#ÖïgX—ÂtRˆ|¬„! •lgçx%sZŒ aç"Û €„¹P›N˜Hî#Ng·‘5≦C8IemC27}Ãádx7ÿFðù!_†È¯žµÈŠÄ`^,=ËRÒ… Š›®7 §âFBé 5”©ç4k‡oèj8Ù4Ž“ÎQ9¼(rÚ -ÑLÁÃÍÍÞ4\(Âm1ÐE ÃPUÆ 1c±9JtÈæ, #U(’°ÜưaÈB‚€K°¼édLÐû –1ÅšEéÈ „žcÉb“£Û`?I bHêA[µ]í§óÕ†ýö»µž h-oY3e‡Øóñ×)ÖÊ"úT8FºÍ¼›å@X^;æà‹:¶ÇÁk§pÌaÓÍÔ`ñ¦E À®¾Qµ=FŠ¿Z…qßb¬µ«ŽS~9ýßWm[7{ß*Õ?m÷ÞWƒ V|ÞyW)Õé¶U§ïØÉör‚þëÃÿíñ¥ýìe3ŸÀÞ˜.¢ÿN7¢›NðóîéE•&¯Îg6ÚG¡g5DÅ‹~ ºIµ2kŽhF ú§Í0oWÕÊMwŸP\7Ë KT /VÄò€ÈÀr"¥{†"!‚Ûœï7ËACp1¾ˆÛË*v8Ö—ë-p*-jº÷ް23gUÁåµ;׋¡ ß^‹î(Aº2nÝà º Ç·B fÙH_ "Ó™EðÕe¡ñ£øiüLüäðB‚g@$ŒHàt †àµfàϲ‘#CAé {i?ârÐáV:Ç#EæK’©¤Üu·‘¤,)GÈ‹x„%"Ækyý>G:Êš$Üç Å´äxì—M<‘ìše‘ž׈.-eà8ê‹€þfZ Vô$<è"zkd%éÞƒ„¥ñU”’ÎomfÜO"Î{3í¤´Ü’Ø—':jܶž¡w¾zé%ê*yˆ$‚‘ŇoåJÁfH<‚•^FÝ/¢ò–TÙ[?“Z??öD.û¡Yü· Qbh^å ú¥'Ê”7M­‡¸›žSÂÒ]Šh5±¸_/¶ƒXf½Ci¸œ÷K‘ŠœÔŽZ]ÆøaßÊnIð4s gFâe„œ8ó,:<ìHWlÔŠƒk bŸ¬¤üO–ø½+kZ€ÈÊÑÕ®›žbW9Ĺòd”ßWžœRÁ“ñH®=y¦Ï3fé_í >Ñôyj¼¸êÈN ý‰‚+PŒóÑ:ˆ¾§¯­Æ£Á'‘ÓÆgÊx9mÅ8SÆ~0•DN?á@ãžúc¬M¯ñùDV°4Ï*œ¸7ß—O‹ñs;Œå‘3Å$ ñóŽüˆ¼ƒ¡ƒ×Æà‘óÁ£18×Zr7"1ܘÈâ(ßüˆŒ†éŸ6w0Õ–ÝÉÈfÆá;+I=¬¡Zý:Ì4TËÑÊe鹯X±¿5ûD!jz„yZ“œ_>{Y- Sã Knrd¦8að$–†À‡è:8Ö¸D^¾ÍšSÕj;©Çjµ»RÕêfZ.uø`VuüŽ a/'ë±Zm®ÔcµZÏ'Ðóz¬ãwºÉÝt‚âõX­>{žp§«í•þR²¯¿ø¼¥¥|‘ÑL¨Î¼§†.”cPéOHºUa[¤Œ¼z™œ B¬‰Ñj)+¸!_äR §”I4I-- K¹9±×òucÊMå ¡©G™æ}”‚ åŠBŒK‚ò1ÁœQNN‹HE3å>kÅí‹ey]Ò˜ ô]•Fœ*8ë§Äi†ÅZs=dMðΙŸ*d¢ ßÞÔ'¥5Ýå¿î>®ß=Ùt3S@„\e[ o%%(R`+‘$—S|/²aVÅI‘Ub®.X¼1˜ÀÞœ–Ñ6¼ÈiŒ˜Ó„'Ä£¤4n­^’•ÐYZz7½%«!HB…àÊ¥#"ùý2MmŸ‘i~ó”Ø2üÓ"=èŠbI9ј™ ÈètÉþ šb´£·¨ÁŒ›Õ{!‡}0xn‘NG$×HûwRT 5GQ§ÎqF˜­‰¼rò€Dóí"‘Î>ÁY_8š(V/³|$æ–[-$ËI!~a£h'Mä‘¢M—ठm5È=“³‹ü•?…7·Ä-KÕº?ÇYÁ 8=YÆWº¥ÁQÍ –8!|qÏ]Ä­†°"XéN ŠÊǩ﹧©Œè¡åÓ¡ö—<ú¢}ÜÛ)ç¦äãˆ2ìH¨˜nØ^¯Õ¤°Õ§Y$…)Ù%¢ >eâvXzJ^1p»ÞQH<úF}z³:±zæÒŠE)œb³vŽÞ횑ݰgªõvʹ#XUÖ(ÒJš•¼R|¤lÏã€u³6\¤Ÿei)Fˆ e—^Ê'4CÊÉaÊi‘~wPDµ^¼˜*2 ÷²Z²ï3‚»+»JöÛ®ÝLvà”×ô¦–¨szr.3ÜLà²-˜³¸à¾åmLbŽí¿hàPP—‘æÆR 8‚†­ž)¢A´‚n±H!’÷ÁÊäJPl ·p‰wÖ.ÔÔ~FéÁAqªÑï„ òÌ@ä"¯ôd’ï‚o$$ôÝì*º"¡ ƒ­Õ–² ¾O9Á.“©œá*Í™FÆ9-‘ÿ_¤4± ¬hŒÉŠ›kZ¢‘ÈÕj]s첬ôÌÅ "ëùWƒŒí¿.5+í.梶jsÎJ2P*RVEiÊ â8^'‰"'7yònŠw}#§x/ô‹¨ƒ"÷¤çÉGFåd0B_9­ iU¬/ŽÏ5=bL9ќ™W¥¤ÁqŒµ;1‰Dí%\‘EkW Ê$_wS™´ã=äf7_¢ÔûKä2o§€•uÀJƒRÒ›æÑ•¡ˆHv™p, ‘Ô›þÄò¶p·Öå9[ Õ­Þºe3é*¡¹ôð.æxq|ð®î!cØÌ³0!U=ÝúŒ+ýÈ *‡¬ëë–U=n‰Ûs@ËÒG2r~Vg¥÷¥v[%OM¾o—Í–zùëepìfõN÷à)Y“U2“YÛ©Ô’­ú ôNÙ?Cxh]¤ ŒÕ_K­3B–9·}•²ËËy[0×5¨k_ 4øÕ)±¬L²)Þ^?¼küL¬ÁŒ­j?6ÁY+§»LÂÍÝð¼Í{œµ›aˆLq6¦¡¬-¡Âƒ®ê…üx±kzž¿2߃Z¶¸2m2ûŒ°ÝŒtÆ«ÖHj÷½Âq…©#~úy=?@ÿmQ/ÁWºÙWF ÒÁ‰voZlÀÀ¿ 7¦˜)S;Ukñ“±uœ¯üØ ÄεwÞ/oDÑ'iPuU×_JY¾‡£½G€ ;æ!«æ„H‘}½…_Åóá#„«—‚£èhN€L‚þS0 F€®4ÿ´1]û)>­oËEŠ^:nèb#åœR²ÂÅ®é5O¸B^#˜¹œÎòŒÊ¶ÂáÀ†ßË©.zýå8·ñàNè™`0J"N™ôMÙì B°Hªn·,–¨‘Täen—â ”Ž1Â? .Šú!aeZ­-G‹#@b·gH:á’×&ÈÐÅ'½¤<– +/%¼7Y%2Ã1°èx\N‡·bð,S}v]gܬÃ2é\ýÖyD„œ'VÛÁÀÉéPÅH5üî̉µÚß®w·ˆÖMsâ^ø¢xDäØ{_ãë*à 8×UD.‹À%àë0 {?k°Qnù€ñuø ÑÑX÷‘À±¸Ç2xÍÁ7MÈÈ•hàe\¶‚iSpäŠQÚŽ\†Ã@>)ø>¡ƒñÍà'b±Œe’qæ®I†Å-ñª9HGÃ;ÜÄm˜d"óˆÞvÄhdmðº1Î-Q‘@†bðZœý<`ƒõ&Ø`sJšx°Á¨šçèHŽŸ¬yÀZÖT_V[ŽUgXã[ÖDï}\ËÀ·HZøŽ…´€ßÑxÕøK¼,BW»ÇR[ݽV¤Àw_â`Œ³4Hõšƒ.ð|4fØ ßç)î:¶íù²hœ $2”( Z͸Ryåf;p&m”páCúA.÷›‹ø’o¾-+)ôÐî‚`Wò¾ŒjzÉÆÝÊ̶–‘o…"ÈeOÇX›|:v”?k«ÕPË<–µ›™âuAõDMÐVšÅ§±TÃYJÁvø9µeiÇ™nжfAÌu¾Ä\ÉkWr$p¡ŒNM:!\}[Qì»™(ÞŒé[²cº»{!Ý´3!}ÖiÁmÝL/çráúÙ{ ¶wŸÈje "Ý s`/Ò͘°NG6 šŠ»K\}ޤwi ûãš“}%óRý2Ή~šìr!öP؅٫ìµ? ž"i/ 7÷]«‡@˜f¾R5‡ð§ ¹,Ô„ ¿^§ óÒÄ ^¿ ‘zß®’Œ&²~‚WiÑÛ”³gŽÌ ÜÆ\é÷ÍŠ>å8YѼŒÚ²sZiãç·04Îkœ[NM_+8’F¶^®¾kìcH1}}='˜Á'x–óŽ[ˆ)ƒU7žE’Cpt: l1Δ‡00Øm¹Íyuî]…q=ìõf9i0‚½8§ cÆk·Ä©Ž7­-Þ‰ æ'¹œ‹ËñÝ+ŃײZ>ÆötGÕ&Ò=›z¹ÚóN±ê»¨-°>unÈÈ -ÌhÚóŒc¿HJ_9Ù¦70à6Û!ý+šY­1ÓÍ^;yÆ“».½&ÑÅZ Ø“K[FwRˆF(ˆzÐ\)š»¹!Ž)ØÁý¬e¢ãp*L#£•0øi+X‘'vgDÚ‚“ «OÆáZÜ%Bõ kˆ¾6·yæœÊéˆß¶«¦Óg£z ®šÎ6j|µÔø]¹«:rlÂ]ÕµîAY¯—².»ÉMOkS ’¦,\hýßý×~EÊg|þYb¸·úÛÞ>Dw}uùB¿Wý6®4vÊWÇ\™½9ƒfÌË÷¾ò×su;[ ðX7U3÷ ôÒ\y2€Ó˜ªç…× šœ«üM1?œkó´ð¾3T4ºÒµ™^­òGxÓå'/ð»cÊÙ•¾Guí‰Bû©ŽöÎxb”½_JÇ ¬;ü®:irc~ é´•cœöˆ½:ÀÞ‘;^ÁD Y W€Ÿ`˜ãSËþh;…9uˆ«‘z8Äo¼êѳ9ŒWP0ÞG„²8S„¯=¹HëÍ Ó¶õjXé”`1{V:$¥ãþÃîÿæþV< endstream endobj 1830 0 obj 4678 endobj 1834 0 obj [35 /XYZ 40.7999999 759.379999 0] endobj 1835 0 obj [35 /XYZ 40.7999999 175.699999 0] endobj 1836 0 obj [35 /XYZ 40.7999999 759.379999 0] endobj 1837 0 obj [35 /XYZ 40.7999999 175.699999 0] endobj 1838 0 obj << /Type /Annot /Subtype /Link /Rect [228.959999 245.779999 260.639999 253.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1833 0 obj << /Type /Page /Parent 2 0 R /Contents 1839 0 R /Resources 1841 0 R /Annots 1842 0 R /MediaBox [0 0 595 842] >> endobj 1841 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 1842 0 obj [ 1838 0 R ] endobj 1839 0 obj << /Length 1840 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€ízA?äÀ°‚o6Áb½ˆ“Cþ~Ô-õL‹ì"YÅ*RêiðŒ[-‰b=¿ªúñŸÿ~øç?¾ûüïÃ×åç»ÏOͱéšùÏáô÷‡ëôp4zþµÚ£O_¿=}?|úôôiú÷û“êÎ7.?¦‹—WÌüï×ßž~œ_þ4òùÝŸ§ßþwЇ?Mÿûåð׿M?~Zžwú·§aìN¿ü:ÿ¢´ÒÃôŸëßNÿõô—ß~›†0œŸ{ú÷«­ò†ñýùVuþ{}+ð®æÐšæ4R¥§Úi-þ󧟧g=â8Z¥úÎöMê3{==T·ãa컃ž¦í>Ò›WʃTÞcìÐq<æ4•5)ÕØ>ø â‚c{ž`ïo!j†—çd.Ô8 Ÿá1§Ñ¨œ9-Ë >‡¶ÚÖ6ó*MÍ™ßósò–ÉÚ‘ãœG£ræ4¯¶÷œO¬N¿°ºïß~yúñãxâê_~žq ó/ßžìôŸ‰áõöðå§Ãï'ñ0þáðå—'Õ›ÑôíY”ÌWt¾2<Ðèóýå›/_mÒ¿ª†ô§~8_i'A6(}=´æÝùŠ}yêè>µs?˜ßÛµœ×ÀWÚù5G;ìjm>8W=ôUx~Ö8³ð¦Õ¨ù5Çalºõ €ÛÖ¼Wíí|:¶¶;M5ðbCØxÏá-¶øe ì—GŠõ–Ü|ÿ^Ê,ÀuÔt%0x¿à{¼ƒÓðXiGÓ‰,pšç¦GðñúcŒ,Ô|$•¾Üœ·&à`¸oì@|ø2É!q2‰ÜµsðeŸz÷‚¼Á‘§ÓÀï¥h;ñ5 ¨[ H„¯ôJ„¾@‘¸éš‹¿éB9 ˜%—.£5kéBÕóø±wà‡ù¼œ°Û Š?,¢¢’мÉf$àуõeæ’ÊÅl«ŽO›>Ÿ‡å5Ì<å½&¶:IçÞ– ˆ 1µM±6ð†Â¬9çHÂïC˜<ðCÒeƒ¿HÞþ¥(Àê`e”+ðÓ|º¢ÕbŒ]s–]úXEŸä0Oýêýf¾e<öcšäØǤñ${ú!¢h¡匃û˜ …¥F%!Æ+‡0Õá§R<”éçcǸªF@¼†æŸ%OdqˆÂ†¢Çy‰!ø<|îÄeHߎvŠð|q¨ýÊÛKs3üZ —gXôá Æ[‹®ÏÞFeÔeeí"5ÎC½1Z{ì[çŠzO¸ç xÏÝ£ÛËþ¸ºen.„1íB3 c[¶îÆØô[hlzµjŽó®Þó?½¸/íE৬N@}¯tкÁ+xÏGi¶2Û¼ª.+‡óâ!,OÐÂn÷9«Bê«ÈžÜƒ°›(®?b†» Ycb”•#Ç÷žBIð_QÎ#Â1±½”C!¸À)÷x® Œ\3;hGvä/l¸ê Æœn+‘<".‹@?HÒMxd@7XüI:Aø/wŠ{ÁòŽ|ØÂ9D %ô†BžÿìRÜa©An? vÍí÷t0noÃÒãuˆ( ÆB˜ éN„±V*òª†..Œ)‘cJ( &;‘è%Fs@»%iÔ]j¥Óµ7pi!õŠÝ×Ä@£’þ‚ÇX÷ãúóDÙø©À‘@ó=š_¢°w¾¾ñOK'„ù8Å33†NÄÔò÷ÂS2`½ ±,1<²º“CÊ0jšfºÇË’ôBP>ΩÕZ†`8…ÊàÇgð-¾ÐdXeÖúùKøÏ½ [„ Í»4 ÷éèyµæ-Iéˆo 8N66‡¡Ž*ƒÐ¨˜ùG×°%9¸1kN±¸}„ x¥aå¾ úŒ5EŽ1ÂÁ@CÊš £vpÉh&‰ñØÙh7®È»ø:¥afÀGŠ,lçÏàò½%,ùñ%ïUdÉ÷ófd¢ýg2rI‹jì×d€pŽQ¢q˜ÄÙ2;Iþs˜B> Ö†ÃECÚ¿Bnˆ¤xjï„Å âÊçì>0c-•¼nÀŒxNQu=8 BrIF•”C«¬©¦^†ðŒÀÔ.ýe=ïEf?pð€­Õ·ç#þ’ÜTÕ†Ô(µ>*·†£À+ µ¸JåÉ™ç—nÔàOÁ^d…¦ ¾’eóÿÕWúrKõß~UÓú{ [W,aÔ{åU¶é^ß6î•+[ݾºÍÒðØà3÷!ræŠl–µ…¯²ðY^jÀ peøJ¡\âVõkòà®õ¼£ ZßÌb͈ɩ 0AsjGÞ–U$”]ÜÓ:ɳª¹!Ê*SK…‹›að9)![r¨.À“+F½á'S/'SYÆkI©sÀòQŽ"ö‡,âLx8¨)dOjV B°JÑ¥âÓUŒÝDõ ¯ˆ5J&÷®Y—!x!–‚iñ†Y¥sÀ߈Lb™¬Úœj£…2˜§¿—7zå¤Þ•<ÏûŠ7'ª(ãJØÃbñ¤îQ4Ey¤Gk×§hˆI+ÛžNšÎÃy2·£0=R}Jñ93„7A!áïÜ(ìRò‹@(j)5*.fŠz*$ÓÚÖáú­Ælz²5çðÅ#,q‚Vj«#¼ï„‘!No܈¡ødXüFœ¦X€²æÎ®ú¨2…«RFKêÉ[Ì­‰oGFw*’*Á¡ôóU€ –5|…X¶­Â; jW]»ÞªdaÊ›;g Ê)@9¦ÑtÊ¡»yRäO«Xø±¨á¼¶$½‹¤(UîÉ,œÍ'L9}ÁL)‘ÓÆCC$5ßáÈZ\4Š—™Ãí>_oü"°oñØôüAJê€\ˆ<(…¶·å„ Áo;ëhÓ;Ó@S}¥#yö™n/-”i˜V[Ha ¡q¸ø°@[iØóŽÐ@lR)6qK÷œ"eFPÔÀÕ`/6\¾‚ð‰ÜAÛh&ÙûLáÛ*ª„5#ßIbŠjúõî¤JÌ}_^û, ²«&°Gõà^FE+£oäÐÿb%wzœ$ã½…§b)­ÿ€èï¢Ï‹D–)C-cíÚwî{ô¢¨’w5GþIBgäþó[`ÍB8k“%šÄ¢£RZ¹rÑG””×3ÁR„¬ ö@ÅÃt³jä,ÝJª‹ü†R=ô÷Ù¯”é‹"ÚfY9¢âÑye;ŠmáJþS£yf€m^Sø«qËZ&ÄzØ( 7#Y¹viRCÔ ßD å±u8ùŽJ™´f^»‘!›XÞöw…|f­ÉA¡CDŸO NÀBgí”Ìk›°zÞüô8ÞfS²ØŠ&DY`Š?!t‹XÆ’ðå®_s»ÍTFH`¡”ŒOè¦ûrx3Çw \[ *Œß¼&éH¡ê& ùÅ"XŒÜí8ÖÇÎó°*H˜BÑYøn N1•‚‡Ù¶à¶º”¤ieÔZʰn2¾tM§½l™ž\9ävOØðqЎͶÉ&›jÚgœûCº‰[Þ½Òñyp4²™8ˆ  ÉÛ_Ú)€pÁ¢yp"ìÜWõ…Œö–(¢›q=ý%#k÷(ﯹ ¸;ÃÛÍóp1€•pB3lÚÁ,§LÝžBåQ/§]Žw©r{î%.~Å…ï³ø…p÷øÙ=wÅl6©Ø¶sí‰=K¬N»+½Ñ>N`¶¹„Éë‘KqÖwøy+à±m?OCb„-i Ý[¥ Kw„÷‘6˜(Æ‚.I)È-Fë²;™L D…`Jl™78jÙbø%ƒ™Ñ”—wÓ á줰è2Ñtžæ`i†å¤'¶'y¢9⸘¬ÿt=‘çS¨A´|Äþ±¶s Œéª¼…Ö§T>Qß] …pü+ !"ö*ÊD=î¹ i…ö8.H:+D„`À°+ÌÛÐ8oaéÖS'÷WØ[=ëã)bûßEiwÖY»ð>@>IQÑ:²Â×RJGA÷””Ž)óåi\Àò–\Ødà°X›òä2s<c­|jœ¹kÂE‡ö!ióäðÀ\I+úJgׇáÝ2¾[ð}Æ“°ÓÅ÷^½nÎÖàéò÷¤–BB׫LœI[c…@¦±¦=±ä#eñ£Õó u£vp1Å©Œ"F7å'0’û´‚²’8Æ .•aysb¥5씥p4X{swIÐßBYõƒsúV ’vsuþ«%ܼòIÉ\Á^Gc†Ù"¢é(DIÇê][J×0ÏêCRØíÅì'ö"p¬º¶‘, 6ä&fhæ ¹ŠâÆùÐÄK¬`v’£ Ã†3z ›’¹­^ï)f5ÒÏD@œ°8x(4Ä¢¾ JCèf8‡ÁnÓÝFj.ÔØW%D*Ko9‹Øò"é?Æeñ“ ÉQÛ¹mäÕfä zݶljç\4ÙÄ“éÇZJH¸P¢¥ö9ô¤á?i B&”S3vr#`à(°T˜M‰xÈ)›¥àæh"Ù^œ‡%ó–fWí +'íz$µpÕ‹Æ 4.a­qVõ^spâÔ` .o޹ž‘'SÌ Ã>aÁF®´DW»j÷ô{°øŸ³¨S"tîC Ùí<Í|«\4©I­yBB]S–Z…”*Ë¥¡yÛ1çäß¹ú`V½Q–ÐÜ8#Q;Pz5½ "R8î@@¶y û,å™ÎˆxC áP4Æ¥R´»†¨ªèÈ…ŸÀ:–æ¦eI0I¨&ªv‘‡yFÕ4—ˆA‡p¬&¹‰×òZlp«â·#ôd'Û®^§/ËÊ¥›<¢Ñ{•ºëYżêÔ¬(_m TE‰!¥C­læ<šxžô¥[ð5²1Nü¢›3P€µ‡, «K+sé,‚Å×Y`ÎR+Sóײ%ì…²ƒÏi¦'ÅuÅE™4É@Io6¥*>9Û¯É5¸†î3>±Tª ÎÓNoºPX¾øÁ˜Àް©Ò#™Ö­•ê¨òænÁú¢øazÝB¡‡“áP%Áäki½f ÷ Œ®ßó4§†i5Õ–¥ŒÍ#kfÌw5¿óÒI¤iz ;);cŒ°Ùi`YÑe8tŽl´ã‹¦eM±áÜÂçzè¯ÀÏÕu¯'ÍÊ08’»x†d 'È_Þ¾Ö u°‡› º˜0´Vµëe®I} Kkå,»¸LÓÚÝé7s(‹™»³žmÚÖ=† âV¸YÖ¸ùÞ:lª¦_O žQ¼OIÊbmÏ×Êâ^ÏqËzšò;ˆ2wø ÆíLñ¢À†3"€Bñ¼dPC —<,*`ðyG°5ÃÚNU£Ú˜ŒßAWÌSÖ4½>!É?JÁâðò–x:2¨¿aôŸ8½ì:AÒðÆRÐ{¼P°}G.xÎ$9ÑrîÉÂ$žÍRÉ-nºbŽ J¡h¥“{NJ\¹.oîöÏB½AY"Ɇ\®.ÓYõNô…êÕŽ*+,’nÎAóEžœä2Ê„ÌQ,^†+êE¥œ^¨ uq· l›'T%¨–AH˜,bæÕÉÚêUuܦhóÑ‘*2ŠÏÃàÝ®ÁËŠd.uXýFÄvÓ± Õ«&0%;+ $o<:>³Ú ŒÂ{Z :¬´³Ø›³<PŒ»;]ã¯Î̪]öý²Œ­9/@ÒÚDë”ÃO- ¯æ-d›Æ½½ä«PÛtkf³7,µv=ûÀÒTèüÞ*GÈóôF`ÉŒ©­TTg÷íˆ×ëí|Eç5ó%¼¸Â¨ô%Ý|oà—‘‹0DÚzY!I•S÷ëIß•ÑY0fD¼\.¼S¨sÝñ‡æ=¨Ú>€ˆ¯ˆØ‡QmÆ£ž¯­bP é`™¾•ÙK²ÓËÃ`Îå—Fa)m~WžÍÇÖÕÒIX4e¼MX,è*ÕŸò&°íâ4U儵ÁRO°< îìLäè¹ÔÇ ØKfs§K'{HÏ”ŒKÝšbªY •¢(vFFã@í‚  kÛ YVŒþ Y,‰éÇ5ý¾0É´+›€I )ß(Ó°WT»F;¤ŠèŽJÓ’1½ZŽª><¬zÏîLt#~‘PÛW–ùÅ ã„ÕUX´_p÷Ô>¡¬)ë)aYÎ8–˜`üpWt’©‰—Ò×™ÉÛ܃",“rL^Dw”tÉCéqÏá̬U»SLa{¥'r´mžª¯9˜xé9˜jõ W &‰E‘ÚéÌ ¯™Z1»ù“$.©\R k6ð®Ô¦jWfÌ«¡–Õh^Vã4©ÓœìñüÀi–C{ýÁ¯OŸREH íz¡KÙ,÷>kq·€rÆ‘Šá‹sϼð W„~, ä.•†¦ÕslûlfU0ª9LvpT$ÇóZ-ƒÑDÐ;éº)†K N/!šLÂUëøQFdÀ%ŒÒh5 >ÂGò6L©ÑŽXž@šà½œòâÚè kñ\!Ë¢ªÛ°›}K/ç£;b ‚WøºÕƒQ™Ñ8ËQÆç`[ð\ç8E O8òšmB­s´6¨IîÈ£†Áo‹(eÍAV´Ût¼OÜŽòC8€‘.o›S€”X“œ%,Yu½Jcl)ö8´?h„σ§‚ µ)Z¶_£µ4ôƒdФ‹BRH;î”%| ÈVØ#&}%üÀàÎ(Öf¡~pãD«xŠ× f‡…µÂeKDª4a°Þ”¯ðæ;æ@WüsGñÜÉã{G&!4Òb×F¥KV–$ïG©´ÍgÝdØ ’–Rk´ƒøÍž€#ÛC÷Ä£'÷±¾†_â;ˆ5A”=aQò…4Òû

    à>pB¥­¶œ0úè)+&®]E–·c£°(…¨ö4óbÕ6c3#JeF÷\²³…±kÉó¶¤`B°%à܃Ö5±ã-u³°pŽ?èó‚#)K~|H/õÀ&9©)¥¦åÚÊ9Û€ƒ&Xà„°Ìbù‹Û®¦Á“B0d#B_oÍ! H†±x‚$E6¸í£[o#¼Y\^æm„É…pŲ\Z“Àš(\“¥»v™ 0¦½Í]ê8w%Þ¹’¾CÚ…– E¥ +ûá…£Mß'Ö5q¦Ó–_¿¡úÀ\µ˜ùdƒÁ[ãÞÈî ¦iÜj«;ªî8;œLó\™dÖ¸ºîØÝ±Žöè-ÚÌ;tìo'žö7®Ì[`ÌQ7£Zm{ìæMwOê­÷ à=#xÏìJèõQ7F]»8±vëi3ÑùÃ[ß]NÕ~„îY8Í­+ šÇr®q÷,;†™û2¶óÈ ºÓïºU޲„ÚíÅÉŠÛí…zµG½‹{ü%Â+«ÁÀWà5‡w}‰2âf žàÀ®ƒ´˜i> ¤oxÔ ¾u)'w‚áyNfDNã­+WŽŸŒs: šGº>°0{VWÕ>qJÇç§ÿí-¢ endstream endobj 1840 0 obj 6624 endobj 1844 0 obj [36 /XYZ 40.7999999 544.339999 0] endobj 1845 0 obj [36 /XYZ 40.7999999 544.339999 0] endobj 1843 0 obj << /Type /Page /Parent 2 0 R /Contents 1846 0 R /Resources 1848 0 R /Annots 1849 0 R /MediaBox [0 0 595 842] >> endobj 1848 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1849 0 obj [ ] endobj 1846 0 obj << /Length 1847 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹Ô¬=v€k ‡ ‡À›M°È.âì!?Ý#uÏHìd«(µZ6<3¶(>êý|÷Çþ~øço‡w~øÏáëøýÃOűhŠáÏáü÷»·¿°Ý±´ÃmWmþsøúËӷ÷§ÏOŸO_¿=™æåÁñÛiðòŠaÂß¾þúônxùÓð›>üùôÓÿöð§Óÿ~>üõo§o?Žó?ðËS×7çþ=ü`¬±Ýé?o:þëé/¿;üzZB÷2ïùëwUÙ4E—´Œo×GÍËß·‚w‡ºªÛæ`Œ=-²>ÅÿñôÓi®ë"Ž}eLÛTm;gkÇIûӿҖΔξb&2iÓt}'1ÍËY%mÊUëˆwàµ9}=oÐ6îR¶x(í¤êªl%¦9¯Æ$mj8pÏD̯í°Á¾NÛáežÄƒj¬‘˜æ¼“²§ñ¸á<ÌÓnúa{u›xL½È1µ•Ì¥õç3HØÓxÚpæiw¦9íË<‰ÇÔµ¥È4¦9íù<Ÿ%8¹}åäß<¾ÿòôî“©Êî,·|ùé´Žágøöå´Ñúð]]5Eøòãá÷Ea¾ÿÃáËÏOý±î˶„¥q¤B#±=)>½Œ|ür: íÍ$©ñ¥Ü\jébÞÃÙ#žƒoáÁãýÀgªŽÀkôœÁ>²¹‘Ãl˜b[Øˆ×Æ™-ƒ³Õg—ɆÅÇ‹ “h|TŸ–¾ú}dYQ­ Q->À¼ˆBìÁzCgžÅ«þGITŒ³6uáÐ>}ËÂ$ºZ”-œbž+é²U[TA‰×ë¡‘‹kZ ‘Ul–§þûˆøÈ®Š<–*ÒÚ2¨Š,/ü<YßGîvdc Ç®DàvÝópg |ù<mw…ÅMTË ÛCÇò”oY÷È.Ô?˜Pß_<Ò«ê3‘õŠ+® Q¦Æ;…§ƒgÛÉúÊGv¡~ê5HtW¶ fàeá+)ᕌ,Û®›Ër £ôÀÙÁwй ƒ‰?ŽÂ±Ú»ì¢û£‰î]{ñú®Yt߉÷ºÕŠ®È]@ßôPáª8SáÞöÓ{7õ±óz¶éæ×Ý^>餘ŽÐ5ëõ±´±µ ÆÕë/†[¨ŽÕ0oάÃZ›£5Ýì£%cÑ5Z£éçk„ÛÁ“8w0Bf‡÷7r¬[+Š¿jç5£xÖELæ.1þr@ò¬™s'p6ûqþbxŒXË¡Ð9“ùÑ{žÅ—ÒÌ&¥ÃʳxôswãÀÞ|©b‚¯o4àv1—DǾây ¼Å±i_ngþQM.ÐVS6àb1êù¡»a Ϻãw~ã÷a†„GðlxIe”Œ<ets<Ç ¿Å Ïeˆ³"‡gÍñÁùá!†¸;v}ÑL¡ÊXÅ÷rߣp¡bx±±—Çùs<匇Oe±Ï¥ÇÁ"ÁÛÁGNåâÙ¨°Ù@%õu¹³$U–$–¯Ð-¯É£ßå sà#½¤ñj >k:èïjá®æÂÑ ¡„a ° 1Õ59èZ‘"•*«jJ¦8¼“6„8â Aòwhs¤™ÓG%(EÀq>|ijqºJ2–Ó¸%ÞÇ33 ¾9H„w•@°9zbQ *T*T.&%è~ÎB»âP Šœ¹K¾™¸ª>·i»~Æm°¢F°ÞÆstç)ÂÔ6ìMIöj ÎF$ωÇs7WXàÜ#[·IQô5æ¦F0嬶² ú‡/™@G9ÈY=ú "d æž0&SuÓ;SÉÝU„9Ó53 Óe?ƒó±(à-”†·–ätàÍe á7nW5ÚxXñ8 ‚Û+G©Ãu6:\ËÙ¯#mGÈ÷CÝÓ<¬}íXuWsö0àÐ…6G„g8—(–6‡6pšAм£1ý”w`Ê%ÌaA”ÚV‰z¼}é®lùÔçx;ƒÞcå dâãÅñ‡á°I6c§ëÌžg±M“`øM Ü«– €1\_‰îªàI†# Yª2†‡ Ùðq–òH@p(6 Ã!KE¤–ŸàmÅG>QˆÒÒ¢NØ5!’à ÎåÈøÊÊÅ=³ŽmÐÆ,†¾jôÜ\ù Nðà =œtuNR '© 'q²ea™pò!.UiËMUN/žBÂ) 9`·ãû_· ÛÜdq(¸O\”M~ÔÇ„s5 ?&ä,+ÏmoUI Ði5¯3ãs ãŠË¼ãÃZ ’ª°8˜®5h«µ§U\ê Ï:2sêïðZ)È£Ðâ›Ec³¾/»@ÄijG‹eNÝ£p²x“—E »á°Y†ñEüXÕq¨+q—/éKoˆ™§»a¨¥È­gBE8TÉ´™Ñi@U×ÐO× “ívë’à zŽÄãÈDáxމàvá oÆcAR–H)"pK»v¶s¥H’GJR>·jM´3õŒÈgJ©ÇÔh,¿õ˜æHj™3ŒÆãUÛÔM¬»ƒQ¿Äw"±%"!Œä4×P•|ê+Ü×µ”ì,Bl ¾lŽŽáuJ‘(Ú^ÐØÏ /[Äc`šn ÛÑ_¬if`¯Îɬaš€Ç(*NMTjgUFIY} ]ÉÑœtSzEÔ/9Ûô71`À¹þJN®N±bø3?•êØÖ³óL¦hà3=|Ïp ¦<¹·HÝ|¶Q…7ÅqáÞŒôã5”s¡`t¬4Çò7Ý«£½ÏÖç$Lyí­ˆkÙm§±i4Á6›’š{ß<€âgM/m£+9ÙÊL‘ÁS²—îÆÑ8n‚Q²y|fy•¢›G„ÇŒ 9–S"™+ÜPEO8µ‹Tн¨É;Ê~Æ<î0‘];ô°Q‰+ çUÓH¡KÁÊñŠPV·å ÊžQNp®lÒ=Õx[[„ýñÂlûcJp¼Çno¡Ä.`+·h™f‚:ljAÂ…q¨6èD.Ã'?ÐBÓ¡`M,«Iª. ’V๠ÏH8™ 6jºƒøš…„X}sCm/±XNa¨_Um‹kÞùúÕ:ZFx‰ÏK¨¸]©–ï»$:²·!\÷ÈHþH#žÛÆé1ƒñÚd;sáTN¢Þ)nPøàk˜åØk&ÆÆXnLçaF‹‡ûáôµØU†ñ dzG\ÙØH6–ƒ³ñ  0çÉâÄŒ˜sX£!¦§Õ¬(Mä4ÄÜÙaˆVwäX£Ìw LZƒçV@Öæ‘{1dNáÂ+ÀÐ aÇ“Ìñ'WæåÙ!‹tâ³ÎÄÚvöbÍÅj¸5öá!ëxØUxmðêY+XœpFj!œÆöx¶åwzŸ#²ì YXX–t'=ã!ëÓÞn¦“g,eA¼áBq1¢â™°90Šq.˳\Ä ³¬ÿ`†ËŒáý`©Ÿf‡p?žUC’VBØ)ÅbÂÈaúÕ ~†EÅ0­Â|Aük,¿AQ†äØjèr °œ`eó9ø¢Ã÷x<¢+àœ&Oœ`H´·E!‘³¬åÈÂ^ ±œ,$ú4¾Ñ}s# ¥“ XbI+6ØÞËYGJ3Xvá &fï¸_Ç¡HXºõˆE˜VÁÙ,ãÀÖ ?†ìª-Ãê‘kÕž¨°R 5ý9UsQdèÝ1uéFÝN×wtC³¬­f×µ'ÒÈfƒÃ¥ätzfÒ¢äjgj†¶ÍŒ3™j’ñY­œ“Éȉ¿ ¾†b5p–H¸œ­Wúßソ¯säÔÍu¡ëWähÙMð=5Î%`̆s©=‰‡ø=p§8ò]¸ ‹Xý0ðõÝ]_V‰“9àÏ)ÄÄ©¨‚q:8>ƒLý›kÃ…”Њ$%båôjdXB¤® ãXé“LŠÙÁw¸‰•°b檤ᘦáö8?OÞÇA¯ëÓ£ÖìLÚ}²,¯'h‰œŸ§¡ê¦„5B‚¦¥¦hfÜÎQ‹*„’˜äè=qýAÞâУ~Š9D¤™ËC =Öâ­Y£àyK¨t(Ç,l„Kb¤CâˉH\\*¶˜“"#ç™n·¾+9B‘t÷E=#Ýw)~Ä+7J1w »íô5ÙÖ@náðiNp>ÇÏú <–¥™ŸR Ÿ#DéZs»L)À¢.óS"Z#,ÀFçokæT4vJŒ”0~TaHâJ®/t+‹ŒK‰ÞSt ?ÞÆéRû„ä°»pr.TFæakûäðèµ{»Ð·#¢õ ﯒¡_jÛŽŽ’Ú‘¶"õ+¶é‡X]¢ÃR™¥Ö”Sø âŸ".ÙÒN#ã‰TÎ5:äCT÷T¦8amQù–2¨š}3ÑMÐCJé£ú´D‚hƪ³> p(ö§8wÔÆÇ:ö1~NÏ{ñÉ=H7#€T¬õ¹CÓ9ꪎ5–B™8:a<êr”DºuA³Y5¨„Ý…£áRã.”Ö¬n¸ >»PùH}ý·oÃgÍ)-)â RŽdÕ½~‘Ј$¯^š(ŽÀ(San/®‰!©:k¾Ìƒ®¾.gcvJOKDhĽ¦<}L±ÍŽx‚1ñ~p7]Âù+.Þéò}äîrD¶·§Ñ '?B•'s·õÆv~Ý)0=Àg ¡—• %ÚžíqјŠ1š¸ãF¬³ÆÐ›¡…º_ï‹‹ß’R‰Œ`ˆtnÕØ„nH tˆDbE©táÑ1µ g‰˜G隌›@è Ä«7Î\”ð ­»r͘öJŸ V6g‡r6£ˆýÜc WÞŸ-ŽMkb½Ã"Fÿ_«îSJ ÙAN]ðHz_| ®‹Tsæ6%å7ë8©Â ôXr`/Cq"DlÂpÕ7fÊ:„“"–N¦)žåΔd" ]„1B{GF¡+J(¦XÉÞZUX réivòdµmœÏ¿uÍcuh#!-Hgº)1ðàÃq,\M5¡ñ“ÎÕ)•àLh>\>Ã<¬Œ0l7¤N²ò¦»ÄõÄÉ…êcè³òúR„7w˔ΰ²5:Vز\¢ \2ŽÕL„sÒ¢§R´!‘2E™´Vid‡”®FÚN"‹§[dÃÞN™‡Nt!S›¢cÅ_D¦¡ó&ƒЍ±l:·”‰æm½(ùzL««žD$ZÂ@§Ú6Ô§gHdj÷£Ôºê i‚ïg*ÏZhšnŒq_ζ]Â`¿ áX<Û³ööm?»ÑpðE||Á`‘TèRðªo8hëh4©•£›%%º §pŠªpäŒÅ=wk¢Ñ)ó;—m[Îp’àb%Háh-ü¬„È£Üb1þ½K¥Ðßgœ¬…K¹>ŠÖ¾7ƒ¯Ñi6–T œ`wÕ!UË0oEVÒŽ^]x·›–ïZÈyØ’ƒB‚_‚CǺ“Ä4 4\úúj_2d(| ›:~±DŽ‘€L³Q¼í¦×½”Hy2åI8¥7Â%R¢¢b‹ƒïñÅBÞ¥L‘?Íé6Æ7J&™êš²›~¶r\âž“¬5Ép]O0B<IJQ.&(X8L:EU"•ZÙ¬…¹¾DmŸˆ@jY0á\C´ˆ`tÝ`ª²ÕŒ’lÝ6¹˜Þ€}Tª…}qòN7<&Ñ©ø•áxO¤ƒl|TJ™ˆxQÖu<0¨+u:!À¯ápXÝÖ#e•dàõDk¯ºzBWwSŽAž(¾Fmf¿:W§R å;¨þ¹Óјʡ¯¬W1k™‰Mv½BBÕòÄîÆ7…vQQ$L;Èh-®=Ñ˺ÉvYÊ#«†Ò4S„‹±— D—±F3ÚCÄK:ݹIÏzÚ¢:…äv•Ác¾¯(SÚ!AòDÙ¡Ê–uÛOÉÞnZ§rŽÖÔ3Q-C°N-´HÕ€îLó\"™³ßp®ø¥*•)]MŒìÖ-ÆY«Äé+¡M>ƒ=~¾F'~6CèÎKsö·×ÿp™·¹«Dp‚(“ò6ÈvâË)¤øÑW’ñ¹µÊ{îó$nëô÷ðíDpOôôüñÛ×_<Ø%ÝÅ+éþì%ÞÞGƒT¿kæ´›RMs|áï‡òµâõ`ßhšcs[Zï«#Ð¥m{lo'p´7F†Ë)Ë£íoÚ:ëúØ —0‡í[ïéà3=|fË[{´Eyzyg ïíožágÇÐÊ;ü„žEˆ[#ícD8Ú3ãQö>®í îü³­M;EEÒm›šqÛ#ôZzÍ3‚D|²®à3Ç·>ªŽ´B öÜ:„UÏN8„o¼ê‘ÃÜÂFã8Œ÷áÁ,̨`ã­‘7 Cžv]c†•N“çQ›9¤ w<|~ú?ƒ}`= endstream endobj 1847 0 obj 5410 endobj 1851 0 obj [37 /XYZ 40.7999999 785.299999 0] endobj 1852 0 obj [37 /XYZ 40.7999999 785.299999 0] endobj 1853 0 obj [37 /XYZ 40.7999999 256.339999 0] endobj 1854 0 obj [37 /XYZ 40.7999999 256.339999 0] endobj 1855 0 obj [37 /XYZ 33.1199999 88.3400000 0] endobj 1856 0 obj [37 /XYZ 32.1599999 90.2599999 0] endobj 1857 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 523.219999 514.080000 539.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 1858 0 obj << /Type /Annot /Subtype /Link /Rect [65.7599999 100.819999 94.5599999 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1850 0 obj << /Type /Page /Parent 2 0 R /Contents 1859 0 R /Resources 1861 0 R /Annots 1862 0 R /MediaBox [0 0 595 842] >> endobj 1861 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 1862 0 obj [ 1857 0 R 1858 0 R ] endobj 1859 0 obj << /Length 1860 0 R /Filter /FlateDecode >> stream xœí]Íܶ¿Ï_1癈%J@QÀöz ôPÀ°Š §iÄAÝúïW3ÒÎŽÈù‘|’fv vV+Š||ߟ?þñóß÷ÿüïþÇŸÿ½ÿ:ýùáó®:Tm5þ³?þûÃåtw¨õøWÛ5ÝÿÙý¶û¾ÿ¾û´û4ü÷ûNµ§§?†‡/Ÿüï×ßv?Žß?ùüáÏÃßþ·×û? ÿ÷Ëþ¯þøiZïø ßv]ßÿòëø¥•î†ÿ¹üÛñá¿vùÝþ·a ÝiÝã0¦³u›µïçWÕéßËWÁ·ª}ÓV½Þ+¥‡M6,þóÝÏÃZçMz£”m­R×´zX´VzßÛvXØxKzçJZ(o£‰eŽ»QY‡R•±Á…˜7Öžhý+¤jZ'PM#smÃnTΙ&pÃu˜Ðîôx¼ÆæïeL0u¶YF‘2ãL´á:Lh÷º?O›Lp¿,”'«¬39îFej‚7^ˆp[7zŸ×É„·ؤÀ2ÇÝ 7^çеÓ?ðï _醥‡3¡2ƒŸ>òIB]ЯêÂ÷À‹ï¿ì~|ÎØï¿ü<œô¤^|ù¶Óíþ‡¦UÕðð§ýï«J›?ì¿ü²ëÍ«:6>©ìé‰9ØÆy¢žèïhßéá;NOT}°ª;>MxG5ã;Õ¡iu3{2®ÖŒvVSõéÉ i¶ãK¯ßy†ïŒ'mƒ*Фž§‚çy ØõGtÒt4ü„Þ[õa­èЩàIЩàÆïØCÝWó;ööñË@”y4Ö­+4fª™vúb=îE©CcÚãÑÜ3›×ÔÓ¶«¾¶ókhGð¸çPú`œ_ÅO¼E&‚íDvä-¦Û‰°jÝ©ù%Tî»Ý„1Óå_|¦™0f:LÖiô;xø3=ÑqèI¤iÿꄱ‹}DÐóqÁ$¿;±€+÷ÉB( 56þ=`áÅ0vx‹n ‚Â_o€Oüaoð8ha’õß,>a÷¢èáb=f/E±B@r(Sw@x4Ú‘º‘~Þ~Þ£'ªƒïà'º´\LËùÑ|ö¬]¬påD€}Y:¥0c.Æ̰ ¬.*S”'öðŽ 'ÀÐ 7C¨°øW\®Cv\?¡=â'øÁïøÒšq 4ÇOô3_/¢ðǸ:ÄP²Ê¨ •¦öD¾%…Åd⮽ªÁ±°®ë“„×ÃøÀá¿ÄHGotÉ•EFùX—& ¶mâÛvY …1ˆÒ³xÒqk1!…Å{/2xwè\¯ÜäTÍ ´SHã=px¼;ƒÍ,5‚€1it=¿€û1&UnåØX''¦}³ãða‚žÏ±†”AðŠ14L‚­_ȪÌð±öê}o!ö¸üwî¹\Õe ;~C{‚´¸ ±u3g²Z|ºj°¹DÜF}Š#­Ž%GNSôµt•¹Œõ?ÑHq‹MW ¬3`Šr81Ý÷¿xÜî9q‚&êVŒ›P,Œb8Eµ'”Lïáh§Xžqdc +—°€$a°„VIkœåˆDþý¢æW38× ÁÂXÊΪn~ìû1¨›¶-Gœ°la‚Ð礷¸ÎI‚§:n#°4foûaÆå†'9ÁIô"y^œCwUïpè‡:“eofð,>†D”+yTtÛÚoQ]Ø?Úçêœw7zC×ÍO–`l& ähoÿ(^f×O p=‚„¯¨ ÈÉ¥ºm)®ÕíÄl¬W.w¥3ÒzD\S¬ô²:w/H Ém ËUkïU°6º™-!½ŒJòTÒô\5$âKÃ:Àðùp<(#°—#¹s4x‚Àw >õÊ»-.+%YÙïŒôË­„îËû 9Xº´XUG¯æä'U^D`¸e— kzÛ;Ê÷à¯zU>¬~iž»J6}ëYÒzÊ’vñöĆž²¤ÏG»…¼¹íTȱÌú¡âÚ¬Tô~m5ƒžö¦à“ðÉúðj5Ü^íñäL:¤'x5øÓõ1cUà;¦üN`ø¶!>*Ì:áI+Œ½œ½‰Š‚DñÍ1lç7'—9¦Ò›!Àõ/øÞÄ¡‚»^_>DÎCäܥȹ3ÜyW$\Ã!fÓ8ãf–1ËŒuÈIUº… ðBÆAÍ v–‘ï²L.|m¯2¤¥„WÉvø]3?šä5µe`}ñÍ1N×ÕÍ“-?YßtzƒbëiýðY…9ƒê Æ7ÙÀÚöi{ñ®ûŒËzŒtÉd EŠn¬µtoYíÐMz•nÀ5죧s2JûkÉiE«sв= oÓñ}͆—*9mÕ¹âNÂÚÀ`9ÑèF‘ÆZ" Ó8,]øgM$N?– ²*…eÕÕ ¢ìTHÂÖÀò9¶YN;BB€ÄXªqJç[cÆhë»ÇÃä=HzÀ‰È'ÈkÍ÷‘Y”F dEh}%Ú÷‰Ð0Ajs '1b'Ç %FòL™†Üj.¡ÿ•nS²°Æ”Àà8P[QÞtšË›BíI9`YXz1œH—÷syjvãO’nNúeYãÜÜÂÄ0YØg䨦#V¯G<îô¸ÑþpZùÛNUª¾üɯ»Ï…€4ÏuË€‘l~2‹0ë.ñ–P!eÏ—¤ôåŽw„yLætÜÂüú–1Ä)-Œùb¬ WW¶u—n‰€4 Ó.œ%,ç  Olíù‹´JÞ_ ª_ øz J½l×n¡†*—Çï´ð ~îM{°è*4:Žø3Õ3B7#V™£Â3fPX–é/ëfŒw]Øq*5• I­æ É_›N¯q$¿Ü¦ð»±í+ÝÞOŃéûKz •·½µHè½õ'ÜŸH8ü&}„7ÐʘeŠxFÀö’ž9ëØdb¤Y†°­Îeq»õ¥quõé eò²Š– «d#-t÷7¡±ëæ'»71Jð­T¶½[4×¢d:³Ñs,3Óþ¯XŸ9vø 4lˆ‡ð(]8ãI½XŽáƒG“dä,E4‰'îbô$$¾ID2ý*hÎA´¬Ðns¯R»­tDlç$ ±†ú,p×®xñ9µ«œR” TuAZÃ.J8Ÿ:àn•tªæ.9=°MÈ' Hét}''¼ZzÖ#§ˆk¥ÔIŸb¼{$ˆ`Nº8Ö$& Rõ,Z<²í­ù1U¼ˆÅVñ\¥…Œ°¬KÇ*g”×&(ÒZ-3‹mí‘Ãú)] F£Œ¢¾®õê¬Ó©‚Âr9èR„r9*OÀQŠý”j›²tQ8 m…™Ç¦ëçb€R•áñ:Ù‹–¤±h£Há™ðh{zÚ³§¹°°9]Uó!à „GÁHÂNõ¬œyÆçøÛÎj§-‚ƒñ‘US^¼ôµrÄ Ç=ïñšu“ÑúÆ‘™[nÉz?^UµÍTÞHÖ6J‡Y~ˆhÙ0…Y1佡mõâi/œ’ûGK›èi ·´)Ò^‹rYåÛ3i5§÷ ùÅ%²KmÁdøõÚ„NI‘ \2|\gÞMvͺEs(îËi7ZfÄ %y#[T+$_ J$ÛÖŽšžìŠ(2 /¿UÖ`ë´ñ~Œ¢nìm~?GZ=ߎÈQE!'_¦|•Ühˆ›6€·P Åqˆ¥V¨¦Q“h;ß)á~|¦&ÛýŠ ýá`¨d«0™ªÆ2Ö!Œ´™ä®õ6™‰v 8fqœò=ó ¼óÛJ5óêjü$'G”à•ñ½oñö8ùT²ÝMâ¾s–#9'ǬH­‡ð$‰Q³o¯tuiß]¼àkæJætÚÑø$*ìYý¡%Û4gyˇ‘>.1 ¶¨V\8½qúi= kW¤ÂæÀwŠëj½kÑ%$a]jÚö(¸Sã—­ !ä÷f´ ByÅÝ]¥£0ØP×e1¨„<Ä'—f×4÷͸H½ìÕ€Oªá“º…«AX+øÞµ©à; hÎ;ø¤¸ûEÏ;sީḷ©ËmqæÓWç¾Çåø_”Òûö…ªwð¶ ¥+Léð†¸ŒWô‰±âKÿÅú“Äß©(àe¸FÈ.9Œg}Á€÷v§âl„µÇÏF£ F1,]c|g‘c«•:ï¿%À«OÖW^°Š"§TĶNèrö@X¾#ÛŽ#Úà;·‹ÊÍJýH€çèU,’}€4šHþ´ ’Ю¶$ÂÚsiüÚZК²UßDÅG9•üíåXD¯D)½’;´T}XàÆžltØe5æ˜Ýcµzñ>è3NVã?î^ÌÁ6ÎõD'ð¾3ªNª>ŒÉ1)ïLêVw0Úyç•Qy;8gጠ5ÛkS®ªÇÜšƒn,œWŠu¿3±×kß{Sð<~C'p¼ƒžôí-p?:ísÛ¯–°Æ;˜ª@K»‹­6C~Ϋ•Hc/6ëYf4ÜLh䛞µ“ö…'lf®ÉRõG"ó¾E²øãI6°¬–¢©;ŒRQJ_ Ñ¢&åzY„<4BãžTŽQ¸Ò³îN½•1%¥Ó©¼õâЫ÷¤aÒÒtmXB(ŤwWÏE&R‘Áœ™D8›‘"Úrf2ZVdq¯t9)Ûâ$ÞHˆ•ÙÌ©ñ‰wÞÀÒ–0 “Ð-’aåiß8L—3Ô˜«~Áö2-µX팣Ÿ¡”°‹šÜ¨7é3OKè8£1Ú&fîFÅé»ù™×jþpKS,ª–H!iVç…à“â%+­žãpV­Ùv£hM@áÉU,PHxÜÚˆT `M€P&¶Poœ;íbÃÚRδ˜…~²Ø=¡Ã¶„ÏÙ#§|˜2fKIk­#_n¡¾Ûk„X„ÝRš•/dT,<$O¶M­Ï)«'äTÃm'È$2Æ PÏ7£ð…7ÅKU'›¸;ç~Ý’³‚@3Œ6;kL©™¢0çë Ôvê49]aÆ,Ö`Çbó\T*çÄFXà+P—œ9Åsé6%Œ©& ¬9£‰†}*|”&H¸h*Kà¼ÙOá ‚± ’ŽÛÎ*’=âEœñLˆ38ŽoF1šÜPë2Jb !Ý¥lË­ÂVÂX ÈtÎP…ô®”Ÿ§à¤{””`RËö¼ÁïéyC™Ð—>®+ÃXÒbPß± =fè)§7!Hn,nV×Õ¹W9c˜Ì4t>$š€$"¬¢HÀ’Ö K+㼄ˆt†ÓÓ×t%º~sro‹DΔ•n:JÊ•cExǹþ\¸mÝÙ„ NJ§{5y,4Ï©J 7‰Ù©Y#}EU4OÄüe3¶<¥´…àG*“2\¤]~á 󙻟ñˆl`Ñ^IÞØ9 ßonõ¬£ ç+!ÄÁš‘áá™5$…p½ç8œTuNüÇ;Æ ´ÍÑ z3cúmwÂMÉÈô<ùÛâõ´[q±F˜¶î϶’Ò.Ô¹ï pR|Ügö ºMˆÖ¸ãVú¸Hímý[ÀXeŠkš'_1ç–×P p׌8µ/$ã¦ÂZ£¶’a9™tÍ`Bä$ñ’¹D²þÊ")š˜¨Ã?!9A¢ðI¦ÓÊæÂ·¬+< ›™su‚õ@påäPj-.›esÅCOé™ñ¬ÁÞe»`ñta“ãsXˆ®7ƒž7™—!ÒêGbžV‰xkɦFÏYzެ—Mì^Ðü£# %0øHN‡Z¨4Ä´u:Ù乂ËöùY™9Ò‘’¡‘‘õDQÙ½w wä“h%RòU&7q©ÔÙ²Ëk­çlbÃÉ aííDXwü»¾D–qÛCàm«gˆ×øÄJœ{ Üú¢åã>!Æ¼Û ºñ÷„éÒ€nÐ;“† 7!'í"mÿp·B£fìɇS€?ˆÐV×µj\{Nd˜`Ô»K©&(ÑöŸvÿ ’Š© endstream endobj 1860 0 obj 6081 endobj 1864 0 obj [38 /XYZ 40.7999999 456.019999 0] endobj 1865 0 obj [38 /XYZ 40.7999999 367.699999 0] endobj 1866 0 obj [38 /XYZ 40.7999999 768.019999 0] endobj 1867 0 obj [38 /XYZ 40.7999999 456.019999 0] endobj 1868 0 obj [38 /XYZ 40.7999999 768.019999 0] endobj 1869 0 obj [38 /XYZ 40.7999999 367.699999 0] endobj 1863 0 obj << /Type /Page /Parent 2 0 R /Contents 1870 0 R /Resources 1872 0 R /Annots 1873 0 R /MediaBox [0 0 595 842] >> endobj 1872 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 1873 0 obj [ ] endobj 1870 0 obj << /Length 1871 0 R /Filter /FlateDecode >> stream xœí][ã:r~ï_áçÖG¼è¦{fä!Àà ‡ Ál6‹Ef‘É>äïG¶änKôG²ŠU’ìî9ÀénÓ¢x)Öõ«âoÿôûþëï‡ß^~ÿŸÃéçËïOÕ±jªñßáô߯?°ÝÑÙñ×¶«¶?ý;üøùôëðëéÛÓ·áÿ¿žLs~pú14^^1vø÷{úm|ùÓøÉï/ÿ2üö{øç᯿þí߇šú;}áçS×7§_þ{üÅXc»áëßNyú×?þ6 ¡;÷{úÿ}Su/Ư×GÍù¿ëGÁ»ªCÝŒ±Ã ëa-þ÷?Ÿþ<ôõ:ˆcïißV¹}¶vè´5Ý¡o›C_=ÓÊéÇ”uÓ+ÑÍi4¦dN¦òm¬Ÿcçq­­ýiåO«^w~oÝô/ÊÙK?…K×·µÈFvFd`?Ëø±¥jÎ-ÝÛÝùƒæòÍ«¯ús‹?zwn¸jy[Þ>ø<¾¯:6í¹üUÓ/ðåüA=¨ƒ˜‰ŽÕøìg=·´Çªwói3ŽÕ^敳Á,`'øÅU»}8X$S-?há³xxCñ3ÁÌñWñF2¶É~Í&Tï–äÐ'‡Èñ —›Q9ú’‡àåÃK^°&B5Ó8øœ¸ އ¢‚à÷- )ä@ŒõM¯€mƒÿò} Jò iç!Ý—ÅÞ2˜ƒîñ’šçɺqý±mêf¶¤!QAÞJÙSüUÙ5Áƒ ÎU0Ñà\p–Î"ä[¸ÎòvG„Å,{ ž-á“XJG6%è5ÐzÊyô*rv:I¸M†óŒŽ„˜Ø™—ïÃï—·Í™ÉVÒ4?±ÇóônД?¶õ²¥¡?c>ÁgzøžIa®Ž#ç¾êÍM´j—L}ÿ¦>ŽD|µcöÖÀÞ¦]>úÀ&‚£Æï©žÑàùL¬óÖ¨ÍDEnœhÎ¨Í léÕõ‹ÑÞì»Ë:™i,]_5qŽÀøXö V%$K8ûÛØFÅËÇP/LÇ”›ÿ±8;AO$˜Š¡¸%XlÔ‰7ÞuàзõéзõEÜLls`ŽØ¡–i¹o=ãQË´0«L®]hn·¦ð  [^ —°·¯pAà3ɥ⴬²¼]y)¤IQ¸Õò¶¼(,•ºøì¼KlŽS(0i 5@q+–ÐSWÀCÏgÀ±Œ×ˆ¡@¤}]ë$c°~Ô_tÜi$o-Ÿà´F>c̱öÍLòf¸P^õð¥ÔfÉ×µ}yÆ9E˃c ·ZÔŽ/Ð;#~§¤‰¢rÛ:žm-SßkÛ¶s¹pšÈjHÒaÏÕµâ2%GEdðiK`K1±,»2ØXŽOšÁØj Å–uLæ+ÖZàìψt®¤iPH˜áæÕÀõ“°ÕùR4äQ|W‚¢Pé™ %ỵȠè—ƒ‘Dh–ŸYUX齯ъ™ #”Ì'‚6_`y°–‘p"¶Ž&Gf!Š Üpä9ãÒúãô:º74¤œõ ^³y€üžå¥(RŒb©ÄuÜg8q3 lQl“a¨òvLJþ ¤?ì„Y* ˆ¶nç"‚C|p!XDß³È×¼‡FŸÏ'#èD¨ ø1*Í€c‚!<ù*vD› è%8½Ÿ“"™R {‘ë0^ÿEŠ}$Ú½ñ—5„!h[ÃÇhù,úøŒÃ@ 8Ó ¾'ò D²Ê;·› Æ€Î6zˆ³àl0§¿g7à›UH¬¶éÁÓ†ä‚á2|#»õ‘#£ÿÑö]vƒl½TŸm¦¸ôUçP‹¹,i ùà–»R- Nn‚ïA µ±J:nÑ LÑà´ÿ< ­v‹4ƒµÎ.AF¢¥ ®ŠbÂnã>¾â°öö«"uú¹@Ø<ÄœÁ >A™Åˆ‡¦ÑêJ¨ü‚øhÄ•ªX™ÿ*Ž;¹³„Úã_OT{8¸á»ÒX¥!tÁÜ,q‰Ù†h±ˆ¢èOAª}ˆÂîÜ¥°(‘<÷Uÿ`ðõbg„¨åž¹ØJæ+‘Á—i‚¤£%ÌD™2.ùJ¶ŠaG aBÆE¿]©†(\!_´ÈÂ(’¥„’ZÉýTÆâo^8(?ù®N…ˆÂº%nÙû¹$!°OÊ©ÊÿjZ;ñ-Ô“ Ü6,Ê:9¬]U_J@<©² ÈÈ)Á0Üd²H_d ÒJ¢hñ¤ÍÐažØÄ*Ø| ç QÅu&k‡D)‡5l‰4nú9ŒxYóE@®!8G WÐl@¢²Àö’쮕«²,Áô‚Tb0‹øÝÂפ­ B"ÙY„Ù¦%BÙB$Û#ydØ % e¥i‚…ûž­ê®]ÂZ¶†j'CIÒèfgìÆ"`Ã4z/‰.ú£H{ã$#b½•à’’HÚ­§MQnv˜k&%µ?1@Y ‡þ$ã”ER†¡›Ež!x ÓvãÌpœ<‹`'¹Å«?ÅüÕ½b+ˆÚZpUc.oTru|„´ö&h?讋B<xrG‰/˜æBþ¦`JirrßÍY9;)RÌXqún.‹ÌÃŽ3‡ ëÆž3¢+—Ìõ0û@–’%þ2N~ºRɃfJÜð’^ðˆƒ+"}€Â/š Ѫ™Ë ù - á0çÈ N‘q%YVÂÁ'1ú¥½þ•¼¯ÉÌ%L µD$¹QF“¡&¨d íF@€@&ù×÷VöVµêl7g,½Ÿp?Á–غI‹ ñ ÄÓY*óéR®(zFºC ‹g ;‡U+·$0ƒ5¡›è.NÛî4(›øeeïQXI È÷Ê’°r1õ‘«]½P`K’8®u_œR›PáE"Þ‡ËÍ–¤R²Íu±—"lüâ_t’ù" }“Õ¿âBÒ`SBô>Ý™hÝ$ÛHY# DÁ=E®6Lã¶Æ-rûŒú[ÚÿÕ`ŽRMŠ/ß~€wxqºZ™ÜP0Çq,Š (ºÇ€Ã–™O!w/(F‰õsŒtNÉS ŸÇ$Q4ÕR4ˆÄj$î”,RLw|³(NŒì«Ñ®¦Þ.ȉµÀ­gv]ÕšöüÓ˜îüéðAsþâé»ã?žšúhLo»Î\¾ãg]øë _ÿv燋‡íòöôÄ|ÃwúYýüyzþƒšÖsf }¿‰$]ŒAÔ3KPÌT¡ï¶ ÿn+âÄX)ÃßÇÂsJ@n}Iz†TRÿ‡pÕ…H2¡fôCQ{¬Ÿsÿ{ޝ¬n§‹F?d’¥ö()ðÏÉÞbEˆqp<Æ[Õ+~ 7îÞÜ›]ÝÏâã¸7ûª[LM?qÄØ…xQ›Qî%­Y_”ÇXâýÝ,@˜ëVõߟˆm`Ðëh*Ú^å$ï ˆ¬¨d#Iƒr #)Ñ8©ý2‘(Y’‘ÁbÕ“ï0US@Ìâ¤s4V†R$Rd¢þN¢Þ2Œdóh펃³›ÁÖT¼¼%¾¢PŒbµ'øj‰‹(ŸnC̨φ%áÚžTÂWqüÆ:3‹ßXgoÄo¬óóðÊéƒEüæü?ëÂ_¿`ŠßXW݈ßXÛ/^0|°ˆßœ¿ÓϺèç/PßXw ²ë”ãzôúmè€H½Ñ —Þ!ζÄH_ùªî-е¿0mXXºNßñ³.üõ .ãY¼`ø`é~8}§ŸuÑÏ_ ï~´ƒé°}0—fË%7&…e“8¾VÉü,VÜåž ÁunK¥€5u0G²®yßHU¦à}´Í®ÀæÔý”À8)G 7‚ðªº*Ú¹È(ÊÜ*ÙGFQÌ¿¦”•½¥s4ƒSÊœADoSçXô¾$Ó)çX4-©}Ylg)*„iawƒØ½:ÝÁô7køœ³Ï±¢~u‰Uã¿åâûc[/[ú3æ3|¦Gϸ‰Qºã¨ä_=óš03F#îF ~ÏÄ7š£;ïÆu‹›vÊ.Üӌܫ–‰·½]ŽŽ`º‹ðÖ¨ŸÑºá±á5À3Å£6/ôùà÷X8ŸÈ0V´‚£v†ñÜ›ƒkÍÙŸ¯ÚzјÉíü+]bI [¥„h™¨mýÆoI†ÑÇ}8úÚÚåÞ)>‹{î2”èuî¹C¾ M¦ßôs®OHë’q2qü^Œòëù…lCOn>c‘)°#‹²÷Upà³uK¬ÿ4Ø% ºf,ÁëKpCpò)Xþ9[Íq9ܰÉ¥¼†PP”qRB¨×Ji¥ènnÍMW/¬xá>ÁÕÀÏ\ŒÊÊ,L-Ür—'<é9b«Ô“&'«³iá2)_HP‚ŠÚÊX’ÂE± Vbч~À; ±ûü+¨vTGJš¾ÛI%±g¥|·ăf¶hãR,n?n¥`±÷{Y«hL&œºÎµ‰²E­8€JÝÚná„ µu–[ÿaù܃å#[¨˜–5QþýB èA„Þïˆd±ŒÏÐæ`îµ+ÐðKT³À¨¬ŒŽò’òúæp÷ZN{³bÒ¢Ú®7ZBÝÛ&%i–®3qÞÈ€pg¤R D]‰"ŵäjž‚Î~€{Ú)ßÉ;EÖŒ¨Ó[E/’)ˆ+qo¥PÅJÁyó“u‰Dë5< šøó¾^Èø|ÅœB«+ᒷϨkKÞ¼–÷WòV Ó~`·LlwR„rD’ä{;_‡3áŸa ΫoaˆÙó¦^  Ÿ3ZÅþË@O”étýŽH³c§øÇUÞ/Þ†áyÛο­ '‚¼Ð§ZTñwuŠ{í÷`ˆ€¤J<Eðde˜ØVQqùw:ð"‹.½û…’ç/ /D „u”¯æ.É…ã€#8¾xÁ»¬5+4~ap²ØMQI+T.©¢½|‹àɧÊg¿îMçR:å†GFx#±ß½z[ôñúl|×àßÀánª.Ïš!j×-vC¥%"RõŽÓQñý¯UÍ÷—ÒèkG‹<ƒ \M ÃÅÑ¥¼p±*×ñá÷LÅÑdаɖ ›E{tKaíñþàQÃÞ"EåpA5XÖ ‹¼Gv¦íB¤œƒ"3mFƆ÷¶$iG]¢×ÎÍwjµ[ÝE®ï ­‘8 d,ërËÒ̪æMÈŒ $—\ËùŠB0”ê'(ß"S²¢@ÇÀâO€QÂ;²™×ÖŸùF´¦œ©›¹ ¡Àtd„HÁÝ*ü%9ë"ïób.ˆµlÎáÄú5ÙáªK}þ­ÈŸ—ëdÐ’:È2&ë%âá¼ñL@€ýrsñtø¾-ì-xqd:¸û ›šßd=ÝbÁÁ¦pnd’NÔì¦2i™B¿EKÜMI4$”è¾Z¢‚l&ÖßKb‘jRfžˆ™—}'oœ–Uö•Y! »W î²È‹ïú¹)J[_0¸%%rm\‹Êá䄼Vjò·8ž¤üÜÖÍê°–’©Uƒ÷€€ES>‘Iè¹ ‡¢r è9¦šÅ‹½]°û Ô஌¤` ½_ß |KÈTÉ\T::W[>z¡ºÄïŽ> endobj 1881 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1882 0 obj [ ] endobj 1879 0 obj << /Length 1880 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀí&›ý‚{ ‡† ä°È!ðf,²‹8{ÈßOKÝ’Fd$«X¤Z3²<-²Éb±Þ÷úò÷ý?Û¿ÿðå?ûoËÏ_vuUwõügøûîå/ôP5zþØm¥Çßý·_vß÷ßwŸwŸ§¿ïTw¸ü˜ž^1OøÛ·_wïç—ïæß|ùð—éÓÿözÿçé?ïøÛôãÇe¾Ã~Ù cwøðïùƒÒJÓ^~:<ü×Ûÿ:-a8Î{ø÷é§Uê¤e|?UÇ¿/‡‚wÕûvTÚì•ÒÓ"Û ÿýÇî§i®ó"ªÁ4ªéuk¦Ïcgúº=}î›åOÌ{z½o‡±Ñû±ïöº©×8{™H%M3ªN Ls\JÚ”ªMï¨Rýø±{Ü`£ÛãÛ> P§yáÝ ð>®F¥ìi7ž‡ ívšJÚ§yÁÔ©FbšÃj$  çaB»æíõ.É¢iSß"‡6­F¥ìi6œ‡ íaÁíÓ<‰`È¡V#Ûp´')ætu[²Á¥M£:#1Ía5*iSGxû&b\«™ÁmÚOó$ª©G‰i«Q){ZÀ çaB»™DãtÒ}™'L¦‘9´ƒÀŸLº=óTC§{ÓÖã?GoyèÈùežDеF@žŸW“NÎÝy>Khjú¢©}÷ |úº{ÿI™f8è¥_šÖqøÆ»ùÇ×i£íþݤ¹LÏ¿þ¸ÿýD Íö_ÞÕ$Ïöí¬ Ÿ<¡'õ8¦£?iøŽÑpmxÕž'ð=x§Í ·ç¯Ó¹§ãÎÐÔÇ3œphYËol«FJ·/WÙŸ ö²ÍåójMeæm¼€¤3¶E_­‡ã“®ÒjXÓ‹÷ÍgÚWµkžx¦Çc>H‚ç2©é×W'1I·¹±B5íõbLcþL&Ñ:&ΓNÇÁäò Úb¡ÎíÊ à±¿ÞÓfˆaƃԭ…Ü”s{†ä1D>b¦W="‹øI~€5µ…ùµ¬j´·¨µýÕÚÆüxH: ÑÏÖ/Œ†pï|s8¶ålÇå¹pœÅ¼–À–‚e‚âÀÇã/T]uý(žaã Â&ð!qî5<Ø…ºyè¿G˜Âkt`ã€ÂùGÚ±¡fæYu5‘¹V5¹>}7=ñô²i/Vϧ£TÕšî ?q•µz8Cô¬>B- ò9¦ßŸ² *ˆÿô­¤l—‚6þá'.;u9«]RŠÇ:ïuh:ëÁ]H7Ð=G¸ýÑþj<+ÆÒ{xÖx ;xþã=Æï#P‰0âÆÃFÒzÝ`¢•‚è„>”ï[øã±ORàš4ÌqUÙ:Z5&T?íýl ¬kKÌ8í}‘?b@£3¢1‹µM5Õ,¯:Ô`eÛN_Cð=©FYmÏÖ/¤¤9Ò€—Oš…>ènž.bž÷àµAà1 Å_èBñ×öÃs14ØcÕ‘ƒ±AúkتötÝ8RV„±U-[ÆúUð<úÈd΋ ‹Ž—Ó\Îq+µ.ÅŠçŽ nËUïv ¾ jÊBVJ¶ÊQ8c½Ä„á¬aK.G\¢Øýr“`Yo”ámáØ3o `šÎ¢á,ÿ6Ù§ëQ‘8/N¤E "—CÄ#èÙŽó>Ž>‡Õaç3lȵ?ÁFN0&sÎÝ YM¡”Ã]4¶zÅ1…¸†æÁ¶4ÉYQØ&Ï÷¥ %󳈡®Y„Ç”ãphŽW/Þh ê´ÁÛŠÐ9~3¼ø°)— `…±-,BSLÙÕݦnOK¸™J@{çôì”.‹º?Ke0„¯iO!|ÍLÒ×â2p Þˆž,Û&.^ãµ'Ïð‰†O`h^µ†kSx6¸j7³­hû«®a€#~ÏÂShá’ðL7p>ð‰f¬ºOð{^tp<Ø:ÓøžàAÚ¨³·üVšbm X7‚þ5‚¨@°¾l Å#Kâ—f>*´2×(¸™‹Ÿ3¬´××›^@ÝUíâãâ hŠed!O1áí_;ž‰ã‡)dzO°.æ ¬[‹TãY] Ç+Є˜ºyžE¶÷o¨Š`@ÉâÝ9ž]ˆ„Î0"|ã·µÿ5!<†zň”c!lgˆ‡üs"Œm”HGBˆž(ÖsÒ ¹ÌÐY‚IéÀñ)ß5« HùÁxíP« ±:¥I,À0 íš“_f±\­‘2( ȺážWW|BL’뾦9Ù"ke…â'úÍ8yžÌ†ÁADU—ˆ(Š“˜‚-Õ@0±ÈÈÍ|¾×Öbj›¾[‹i‡ëM—ˆÓׯÌcÝt~â¥Ä¥²„ íÙ"â9BæÜœ¼~É(ÞŠD%jO ‡ØJ!羬À—  „­Èg`oç¤ä©ê"\`é¾¥Ž>‹¡Ý,¬&ÁÌy禵·Gþ eKš® ÓWBšr|†q8ˆ0Iºˆ/{âÙ#6’C#EYÇtâ96ŽEµŒ¤EóõЩR):alì>õ  H*1—Ù‘v³spLØþæÒ©°²%Q¸%Â:$i9»SS™hž¼¥¶³xö[0(uj°ˆ”ƒ~Iiklæº*HÝ¢ ˆ ò1¼a2¶<ÂÌ¢ztóŸlÒžh ývŠ 2(€G|”eZ„\,‰Ü¼ˆøžpú!NŒ,z‰ Í!¿.=´ÁÓI²ùâ[QŠúáz 8 O,eÏYX7×çÂJn„âê%˜áޜͫTDJ{¨‡5ËÏ8 ;ÌüÖ”ˆH)†1ŠÂÂSŠ›Ê–‹á8mD-â#ž’ÙÓ25ùK×¹Yr#?¡¼·ÇÉÂá7„(Ã3økpûd Q×á.­ z®„\Vg|íRL¦x¸Bq&y›(ÈL®v‚–÷Ÿ=Aæ*¥x˲ÔÜ ; X%¦v¬øÄ†Áæ÷“ª)S,x,£1×`9Õ©µqÂ1ÙàÔîµË`ϺD̯‘'2°òdDøt2:®ˆ¤Ÿ·aí蚀̸Ækà¼%VnG*·é¯oñ}²qžR|@XÃs„άøä0VA˜x6Šq¿Gâ9Ç䀠ڙ»¼Ögø_ñžc…чñ(åÁXjÀÂUÁ/Ø‘¢4²H Ü^·ç®C¶à!×>˜É0¨ áÈ\„ÃïsÆâb‚m<»`ìÜägìÍ5Â=ª‘^vNLiÛÃÈí¦—%ê@¤¸Ý^U9Ñœ½ ”u7X?¿tPgÁJ‘íx&<7¯éiÍx‚+Öx§8b WÇÃÍ«qdŒ¦ó@®ÚS‘V±¼}=»Î˜Ó*¡ûÆCD‹DN¶ÖB·‚89£Tcm:OPâ+å* ÷íÝ#¸±^—W®Œ'>'ÝW6á'hA".‰æ…‘’Çgˆ%‚{ ¡ÊX)G’£ëÜX,ôFåNäœ1þ}áëŠ')Ø=4J a$LE°„Buên˜ÈÑ÷êú)‚[¡ØdB–÷9\t¸Ÿ.+P3>’Ë´P® —…Àë<ýº8\’Ðþ›Î ¤#„öGˆ>"\ù ]C_Ü+‰ã¤Ú; ÅEQB“œx JÐFèrjNËǨ,4“í(˜+âaWñÌáÑyo½™zÕ]Hv{·Qè‰Æ] ؇àjN)Xk1°ån äѰp;&¬{á'øñFC¼Ü‡ÜÇ£bXsš‰1šy´f Ç2#“½@@×7ÖÕ{åtãjsºã úœotëù2¦ê[ûIGãyψÆ,8:],»Å%rÉžm ·Wu5Ë•/Þ³‡Ê,÷æòžgƘB"óp©suB{Gd.ݤ™»óÒŽQ_Ããm“ÕŽ8Ê £´%HádYÒT#ÄëÍ´ ˆ¨¡‰—†˜Þ¼8Eo®“ÆëֺŅ‚û6ýMØôGm-gËÜŒ$„Ç`C(ÃDZCèà÷›–q.Þ#ìjËä"¾Y {s?W&§X÷8n.ËpŠ÷§Ô-i%“Ͳt ì Wþ%o7kAóöâu2OÓëð甆ç,þ I5äʤÊfžäÕXóDÞw®Oâw‘â“6OïÌì‹ðqÖËM'è )… $.WD #U§LËZ–ù‰~1³VX3–œœp‘býÜŒi1oÒRå:9®i'ØŸ@&»ìâϬߎ§0bÂ=&Ô÷!wÙ•`®4‡7$RºšÊ-“ãôØ]V/9NB³d!yNsÈ$—uÞÈÅbŽnz×¹éÚ§Eøv®b6Æðrºön8-˜bíà¸j ö@Py¼㮨/À3؆™¬Uc žá]ñ$/0ú {qdWkH1x¬šXŒûÃÁ*LR„p wä-z8XVÄëK%Ïu“’|’9=¢ÇÇrËÑ:‹è3=„ÄC:ñ{jø³wŒ×˜V1²â Hw<å9·‘“3¸mf¤Œz0£3z0£(Sèt_Æ³Ö Ì~%n­6C²°Bt6Ž„¾ Ó‚îú Â=ˆâƒ(¾¢¾2C„qPLB÷ÓèÆXh¸æ‰ û08±S²½kS<0œLŽ=[¦ƒ‘ "yÕwTLŠà–©! Óµ]7x„G¶p`ÊÃMž·öDÖ~¸Æâ!„7NóYWé­ré⩃H§äHó#kmYkÓ}ÃbÜA±êá1-Šú¬XѰÃûCû)qÀFéðc}”³mNÅ;†i°%0Æ`_E)+‡gmØý ܲ«“æ’ ¢N®`VJ|#jžG 7cßLòëè Dén€[‹{Ñ'ápõDLF9fWlÆ‘<8Ö »½1ÓÄ;Åì³,†ywËQzøîs§ T6`aûÒ1MÜ)äÇlûs7f,ö˜ÐG„Ðî""‰2Á›”‰œ%ÕV²Zš@FHiáˆjœ ¹ñ¹Ó”Z¯ŒÖÃ,)Ç›Ý>‚“ŽNëtaÃéÉÀ¤*×ySzÃ&<,°»‹ç4Úà—ÎÚO^]sŠ y5Dº8ݼzÁüo¡&T4L¹“·ˆˆ•C€céÈÂÈ)mqòTU‡>& ‰+Ü9^&FÁÅ.ÁV=¸ÇÀ°ˆCºE“PÄÆCQ¯+…!Lòìo,‘?4JΉ˜ ^3V’oX‚‡u‰e ¦l­‘Ý„£ ^·½§0!ºL7O¿×xQÓ­ód#¢" ¡Ä>W¸Ëb<ö¬U¤+6VÒì-¢F5ÙÆÙŒØJCÂ; Öi›a_&Ѹ¨|J Ú®$¾ëĞϜH ñ“”—[Q!,È¥tåJêOÆé½+êY½£ÀÒ-Ò#‚gÐ~s¶v?4§xÉ*(…<ã«,ª² 8d?%ÊûuœðQh¯p}2ñq)ùÅ›æ±Ø¤×ÇroÄc‰.”ÇÓÕç–\ñJ³¹ QäÁ딲ÚÍœ[YÛ¨oT7ÑÊXHL”Ejõâ3å´³‰ñ‚jÓêÓßý÷ ¼ô_X~|ûÅo÷ êËA}ö•wh¸s]·WÓ6Ö4ÐQuÕ܆­©Ïu}føv]Õ­ÇQަ^ ÝWýzF¿òdtÓTz\¥æm[uóIÚç¸öžŽᘙ¢ôºÒusxtyòg›¯ž«¯}wVvø YèàÚ…ö±Ð#Ú˜åÄ({_Öv¼ Xwø¬[uÊR_(1í´1†ÀÓVŸ ^ãC(qÎÉsêÑ]P.¾áb<À«}fÜwMø¾À; [4f±3¬á&„à0·~¸Z ¡Ñ0ÖäÂÉs?ˆÜ­aèÔ<·uÉð…^r5A޶ÿ¼û?-®ì^ endstream endobj 1880 0 obj 4627 endobj 1884 0 obj [40 /XYZ 32.1599999 706.579999 0] endobj 1885 0 obj [40 /XYZ 40.7999999 654.740000 0] endobj 1886 0 obj [40 /XYZ 40.7999999 469.459999 0] endobj 1887 0 obj [40 /XYZ 33.1199999 704.659999 0] endobj 1888 0 obj [40 /XYZ 40.7999999 654.740000 0] endobj 1889 0 obj [40 /XYZ 40.7999999 469.459999 0] endobj 1890 0 obj [40 /XYZ 40.7999999 125.779999 0] endobj 1891 0 obj [40 /XYZ 40.7999999 125.779999 0] endobj 1883 0 obj << /Type /Page /Parent 2 0 R /Contents 1892 0 R /Resources 1894 0 R /Annots 1895 0 R /MediaBox [0 0 595 842] >> endobj 1894 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1895 0 obj [ ] endobj 1892 0 obj << /Length 1893 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"©'ðx<r`Ø@A7›`/2ÙCþ~Ô-öKÔGªJEJË<ãf‹"«Šõ®âû?~ùûñŸ¿ßüòŸã7ûóã—CžåUÞÿ9žþ¾»ÿ@7™Ñý¯uSfº=ý9~û~x=¾>>wÿ¾Tu~Ðþè/¯è'üíÛ¯‡÷ýËý'_>þ¹ûíG}üS÷¿_Žý[÷ã';ßé ßM[~ùwÿ‹ÒJ7Ýî; þëð—ßí–Мç=ýû®hJ¥ç-ãõú¨:ÿ½¼+?VyUtë;ý_•,þûÃÏÝ\×Edm¡T]u>uÎZŸ&mͱ­«cY;3:Ûš2š7M]´ÓœV£æìIåEí›'k*ûþ>á-M÷ŠÆ4Vó¢#!”¶M-‚ÒË<ópÑmM„2N«‘@)œ‡m•·E¿=cfÂé2Ѽi´®D°Ö­FÍÚToÏDL€›î_ò¾Î3PE'/¦9­F€¼ñóÔ?£²²¨šî¡ÛÈÇóHqû è?ÈŠóä÷“|BÓ+}©/+º{Æ ýÜoðöÕæüA•iÕ &é×øék‡®yÐWÅI=E€Òõý¦Ú¬t–þØíŽŒ¨ ŽÔŒgž¤ ‚èQuzÎ#8†„bWw‡@ØÍP›‡¦8tˆ©º„#Îk*ÉS–6œÕ¬3Y>}!ø½Ó¡§`pÞ‡'¾OWç9`ÄtÓ3[¥//\Ž¢ÄX4Åà`‹@ÐE!¶C¼C ˜gøÐ1r=gƒp^†Ç·Î×`qéPŠˆÌ~ÐT1üài¸øánŠê0s(kúš=,â“À¨1 1r ‚ÞŸç¤'q¨Ò¸{ ãH™9²dú¬kúS õ½q5Ѧл&zG›·!MTR·r¨Ïž,±$¶G¿†#Î$–ÊÆ¬G²üˆ©Ùô&tm‚` « ÖSïÛ­«»ŠO ˜m]žˆ¦ÖÕE÷l G}‚#-ƒ£ŽJ[1PhøŒÂ0À#9”Qø=,!êÁÞ”¹ø=® KcüËÆp W`Ú4L¶n®o¼`ª®ÊGŽ„ó°_‚å€GN׬ 20—‡Ï0·\-Ke w¶G1c§o›–É=ˆ¥€\ †qêâ–°FLŽŽOaH,çƒH¼ ‚OÒÑŠ§[ãQ½Gqõ£¢V W"© …v•—H Sw§Ç%»ªSÈWÌ !ëú¡ ÔºÖ‰Ú:/%çiŽº ž9B£ÛË& Ë£‡¸ºÁA9_i_1=àU“ I+ê¬mzþy{ÆNk23É{¾ªò¬*ξç!‚GFœ%YPªÂ]œÄŠÁûâïÂ)cå’}±sú&½ÙRùÈ,x~Öš0°Ù#ÍÕéãÉ›»þ°rÊPn&xúS‡U§G—†‚G»±¦/Žwv!j,Ê(§3ÏüaƒëÚÎû5—ñ ˆ77&r܆º@,Î% ‘(ñ Ä=c²öÒ<òv7|í@…º˜¿÷è¡Ò¥r#¥„`˜0’7\‡ö§@NH.•{,݃áâñ88ƒùº…D8wq¹þ­ “¡Ã—ER‡ž¯Úq­ü玢•8kuäÇ Œ7LЭ™a̼‚>á÷ÎtÀ\ˆàÈ'ÐP”LV”V™kqßÖkUš“ŒyX$ ôo޵N1`džyT|Fp‚ãÿÇB`hÌÑì©Á.]Aôà‚ULZ˜?|’–+¿%œØê!Æ´³Äši›|ëÊlXe¥¤'ˆ¸Ø8ªÎÒqmJ®Y"ŽâfíŠÔ±¤VýãÄŒ ¾ 7ç``3Ó±ø¶ªHKµcÌ´?¶æ ôkŒ/ïÿ ÏW‘Õå`ÄF½HϨð™>sóì ¼AJ£Ù¬È®33ô-yFŒ¥^íÄÃz¤v6®Ozaì¯@YŠ0çÓs?ÒSm“–XnïyFkËá3ø=x6Ï ^à{àN=Ð)Ñ n©ÓamZH!˜v*DX¿ÄVzë°­ê˧GYÌ>U)šHé §Ô¦Sö8u^n˜!²îÁ©¸w@Ï€´;‰ˆ[Áq̋֟UŽ£ëMúí¤QËP çD.ƒÁºÆX6õ£r"¬°üt…y±’\¸"ã8W[$Ô7!0D(: T¢ ù2{Éáí}áÔŒ é6éÊáT®(#•œá ñ«7ÎíxRuq cÕžô^œŒËºð38®CTãüy¸\¨žéXà¬Àƒ7Ož>Ló68ÓÎ&a€OÖâÅ‚*¯‹á*oü„°×tiÉѲDн(²7q2ðõçtœ›®šEî©Á–„Ò¶>ífé˜*€— ¸Hm†ò¹¨ðN0°‚‡ þŸ*/pF·XÅíÉ™ÒÃ8GÛÃÞ™Ê If´äøä$´iOý]v½1›6ÇïÁ¶&´<íÁ°õ±[Õ?Uíif³ÛÛèp,q]/–èfEF–ìÈ6QÏØ©–í&… ˜K'L.U¹“Ë4â>&‰ÈÅÑ’KS$&²°*…;­rˆ7ªÙCÂJæÊ¥ÚîôàaÒù¥fͶJîÃ×å5­»|E}Ü¥Ez’±Òж\©"Û¸dÙöeúܬèŽ|wþÊã¯&zûfcª§y[ñŒù½*bryÝÎÉ [NÎiï³ÅPͬØ3$&ÙB4BÚ`” €Xy՜԰£Fµ×¦ÐµXšiœ«C·½ÉÇï[KÛ¹ˆÂª±VÐMSx£$ Ý>6³ôs5ù=2'-N@9T‰ߢ¯/î~‘»¢0Åñþ¡Iê²@ƒêuªÉmO‚± •Qo~²Bçgø .VµI…&«§—ØŠ–òâBç½`—LJL©µ¼­šÔõ– ²¤žH9iXóx«å²3nœ ˜J²w‚‰sRü8Ž&¡KÆ3³î刌{’Ä5¥ijŒcŠ™ª~”3{Ÿ½öÙ£¸à=[œôà°SË£ŸìõÁo"yÓzfÂ\ê"¿æ~m3' ¯€œõ\M„€~˜Àñ6)_«KøÌ“ýŒ¡c0…,^‡\”—«RwÝ’!T¨QœôQýYUXksuDÎ{2’_ £‰xÌuÓ¥žÓsK¼jØ÷Ê£œ&$ئ]‰-ßñ"‚e¹ådËpèÂÀc£cœâ†}Š1ç±Ñál[m˜â±%Ž›üm’Þ x˜z9Êc˜¿yN#æ.Øi!š#ž¢z3¬®˜){ðiÕJIJ-º¸¶H|j¯×¼Ì¹tÅ)q&43Á=¦8Á!Æ3+®€”­‚vñÆ=Ž€$.–t)ß*ºÃׄHþ…f@€Ó„ƒ›`G³5÷³XM©µ'˜¹ñ7£³s‚ý-ëwRÓj˜Þáó -õ0—~®DZô„›8ȶ£Ìðl‚%i%z N¸ fzwCÖmï9—K+bÝ¢·Ý¬FÐbu‚¶9—c$f^î+ˆ)K«¥ E‘ wæaW„7QX뜳¬ž¶ ¨º0¥½j(¾¹­/a2N!Ë¢#ôba ÙíÒâ¼·ÂÆï“hŸ=¡ë˜DάÈÕ61úûËôNجÌ\‰EϹêne)³ð:R­™‚çèã ¼œNŒfKHBY1Ø–ÿL²éª¨¯ÈýF8¥¹ÿ†Îz݆©Ûb£… ³\Iö*PǦS­‡•rX÷&­Ý¸=‘QšÔC“ЂZæª' R<ýô«)&˜"Ö2¾‰3hH'ÌRÝ ÚœÀávÁ9›éç;2ɹ¸aè ã‰"M‡ž—l0 €×"¾åjÚ0 ˜Ï8 2÷›qÔ¯°W.xº‚ÑĈøRe5@¦&B'òéçIX³e P²x´K†á¾Â>‘¸ö,P¬¸ïò¦â "íD¡}Ùû®Ž-ùD®m—p6.`‰Tj â\k—ú†ÁYaó°„p“"G•~ÅÂâž©8g‡%°û×Öj+L¢×Å•ü4D±üE­œ| ŽTÅ8ÝŽß¶¬'$!oЃÃ1PÝc´ñžêjaÉ‹gçXÝ #Ç[G̸Ïõ$¶Oß.Z§§+Å¿EýN@³Á\*|r5mà‘Y‡–àrLì’öˆoÂ]NŒø?Kº­¯¶'œ0WX:©í‰bŽGçg83(i!pzÙì;‚–ŒÝ™ÁJ3‡§RÎ>A«GÆ”áÜáæK\÷Åg™4+$¢hj‹âQ4y</bØÑ? =¬GÔÙëѦæB©˜qËo­Ú^›Ø¬¥¥GLšn÷Ì9½%ŒÀŽ=Ü—  K³8» „{eæE(ìä[Kˆ’›ÎX­S<žZB’—Lš£lüS2lÀyd}eûœhîíäÔžws 5$Ë‘Ìüž`^R†b–jEËþâ×Ü °ýN?mÇ“w\_çæZ=ví¤“çé"Ò­2ucEæÖÏy¦…ï1Âwê =,z(«,Uu¬¸ãSpfS/ôý؃\eæ|ÀGµwÂl­¥"3”8ø=¶Ÿx“–(G8ÿp§9|Ƴ8›g/pÂàÖBo7¥áÞ¦<[ wZ¡ÙðN•X‡(oœTçUóÛíD´üÜu-M¯|rD‰ˆ¿˜1ñh Ÿ¶»È™Ës\˲™zŒ^äL=J ƒ€ BÜÕq?OïºÏŠÆ{×gkSâ¯"6GŒ’å˜l¿l|ŸÀÌ ±Œð%HœV7œLpFÑ×bwV%Êù‘&a:Jb¶Èiuâ׎L$8le)x'G 'S|å+ÑM£ö;°ÿk¿„V488§x]­‚B퀵ҫ‹GÒššsZ—3Vï[óÝwuîþ_;|u¸8}Áþøö݃@óù 󟽸÷>öVGÕmc,4Ôªª¡M~¹ÂÏjGU•Uãî̶È ïÙ´®³z< »éÏ‹1™nGó!Ê2«ú:”Ñcïià3-|¦×éjü¤úþ™'8[O8÷Ÿ<ÃïZ8²ÃôŒU¬ÇFÚ‡e´g,Æ({·k;€Twú]—êz—sMǶ±mjD‰JÖ>öŒÁgH×pmÖÉ> endobj 1901 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 1902 0 obj [ ] endobj 1899 0 obj << /Length 1900 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsUÄ‹( ( ìL’}($@Š>Ùn‹E³ètú÷+Y²g$úãåð’'@Æ1GÔ!yî7¾ûãç¿ÿùÛñÝóçÿ¿Î?Ÿ?êª6õôç8þýáí²«”œ>¶]SÉ~üsüúíðr|9|:|þ}9szpþ1 ž_1MøÛ×_聯¦o>?ÿyøô¿£<þiøß/Ç¿þmøñÓ<ßø ß]oÆÿž>)d7üçí§qð_‡¿üîøëBwšwü÷Ý·RwI`¼\§¿oïªFŠÆ…ͰÿýÇáça® U¯…hnëÐ9[9NÚ×Ǿ&n¤5¥µ® ‰Ò¦QZpL3B#’%jÝ:'"nxS7§6mÚ Ïó$nTcXö{„F¤¬iÞn8q·§åÉ®I[ày¢Ä}Ø Ç4#4"iQó~㉈Þ›yJ¥-ñ2QÒ4ªî;Ž ¡I‹š7OTuZ ÕÊF›?n|ÓurøÜªùOð¢…i9xÌežÄ3RqL3BÃÀcð<4”W²eáè—y·I)Ž~‚†c·á<ÄÝÖªcÙíó<‰Û¤{Í2Í ÇnÃyªÎÈV7#;DŸCamŒf9ó<‰[g$‡ây‚†ãÖó|â0ä«ùðâxðéËáÝÇ~´”¾ü<q2·¦_¾ôðŸAŸÈíËOÇß×µÐ8~ùåÛôE-O_´UÝ«¶™ìµydúU]éiàÍHw1•Ýê™çé™ËBœ¾ò<Ëë|±èW0Z_` …Yÿê"Dz¼Ïb˜ëÖûl½þõ#6ìøuN#Í`HwbПßl@‹–'?®§oàNX Yhc-Ï:4 <~/\–}ŒëÍ’&üYŒ¿jP?¢b[CêG±ZÀÇe!¬õ¾N ߇op8Ö*ð„¯OO¸ýáË Òx½8Éû«ì~P»v?ªÞó¦NÔW `”WFdFæÝ½6òGž!BÐÂøÑAëj<›ã™ãOæ;Š÷Z=•CK-½àà"6#’ã=Å0Ô <ú=£²êË!…ç—¾/÷Òî²R¼×C0 €ŒËÁìvŒŽg0-°²´{`|ûG>pîÎÞ…Dß'‰]†¿ç6Q¬œøP¢cn_Šjår™BT6£ú¿>¶DcØëRpXkË ûabL&h=:œ9–MšÇд`å°Ù’Ç‚ûlX?OkÖa|µq ±un9b>#¿cV ¢.œ¤° ž'žÍ^šƒ”Ðã}¤ø•R|¨)tQÄï’S 4j)(>n{Ÿ¬/(ømù „$Iâw¹â²OÙb h¯SÝDøð#œ•á”nCd‘W5È9Æ©^ˆ®9¼´þŸÇ!ïÀ —Ç„iaE•"„v0Cço¶Fa‘.HáÇæ×‚fgìµ÷yF¡ÒuýR¨8˜ ¥Û[;‰Ì+Ú-u'‚XS£ø5Ê:}|N݉`ÅY½ìÀ{“]—™LÚ>€ù„Û(Â1%ïøÐ F&…[v6‰D˜zX¬PÀÒ²¼˜Š°z(èl៺TŠùíЫÃ=&œ¨+ÓŠÅÕÙX‹Æ,6ÄøŸ(* Þ[J~KN”EW@ÇþÔ«Ñ—Déáœ-"]Œ'*É;„X'Kqå`Å»¯"$|ö˜Ü!‚ü‹Y1JI!Ûº°/9¿èhM¿BHQ·x¹?ÖŽ-Ų)˜•…U³·=ñYعy)Ì9E×'~„<lÑòî(úkÔ#ÍH¦MoÆ}FjjD㡦xû(ïÑ6Ê,!väÍã\áì¡Æx76K¥ )½Âz!äï÷]’"læ¤?°–Ń)­!üÙ˜l˜p¥Ñ…–t‰¶çŒ“‹sÁR8FÄ\{HñÜRh üÂ"–m†²P‹-"õæ*ØsXž3¼5k|çÉU¸s[Œ³Ð6¿× kŒØ—7Z¢2¡QçÊ„Ý}מÁuO„¾Â7V4½\îàFXD*!Gj/³^Q‘EŠPÖXfJ"4!U2&š¨+Ø:Àèf¹/qÜWâx\ñ]¸( ÃmM ߬ټæþ#1ú¼‰›+óŠ‹íË‹÷,šwPǹïRaÓ)?Âbî‚ o^6®`çÕ°+u@@è©á@—Í÷ `áq[§43a棬•å7Ê-),à&cX6:Ú[`I ¡v°#R²ciÖ`|ƒJð>˜^$w ?+"9˜f(Ð*(&K ò9äŽQ¹$òéËKËunjÛ³W­”}Š™ÙÞ¦­)ÆÁâŽPćCðøóÉaî‚E5棘[ZQ¬‡‰Mh¯D1ØIÝÒöà‘iûÖ/ ™‡G¦ àß…GfŒÎ'è£ßG†"Ñ †š£Á®!ÔšÐôn¯‘G?’«&É÷ìùIHÔ‹ƒ­Çûð¡ìÁ‡‚ÙFIrn´Ÿ0>”‡% òµçV©ö¥½<Û.8 †§8'Ë- <“x[бÚ&åÇ„·aJJ˜Œh¹š%gš”Ö”%í&Åtµ‚0$àæi•ÀÑÐ)¦àžÐ ÓN.eMÉb¤ÏœÜY©%{¾³¬cÞ¶¶òÎâ3¨øÃ¡”V/µxwŒÕEÇL¯ˆ­pœ«¿8lGÎj¬šCåSÑ39Û¨¹Rêü½ˆ(·¯±¶Òp0¥ð‚Ž jÚn¥A“:ºñvðeѧX΃³‰C¡sT†·ñ±™i„VŠSÎ òš§z3B^'4ðv¬/|ûJµn¢´+f¬ëKãˆ[ºô‘³š÷®ÎBÖ{éBÜü²OôÝ!#ú5;(9o#®¬¥A^œý;&ü}kç(ʵ»þ8¼ á}KwQwÕ_®=£˜GŽËÍXg£DñzÊ%&¨úrM%ȳ}–oö Îòa =²|î0ËGÕªM ¦í£¬˜¿=⯑œµÆ§@¸»\œWÕMJb\¹üzU·çä&‡Ü.cý*qéo«ž‘¹õéyAö"GÐ<¯Y°GïRJ³Öͽ=Í+nÀSÚΜ!RÆ™¼Ù=Š…ºaÅ{èrr-–ì¿TÛ´˜l£ÌŽìÏýMs'Ò¥^—]jïˆÝm[+·VúHkVΟÀr-]†<Ëœ­DZŠ™Bמ”VÀ¾›N—óM¤ËùâƒùÍ_Ýz—¼£XIB‡Ùµ¶y´µû‰NÐOÆDcbOnrA?%ë~_slF¾Ÿ8’Æm;jÂJY{;‘ÚiZµ9òOqÁ.Zè2ÒM^ÊîpeR{U,î"®#ð{ÓY†dLõD„«€Ò7B¾¹c©–K|ÚMl9# I³"¢;Så‹W&¨,{Îb,·e¦€¸ea“PKT½qÌôûRéŽ$g¥¢* 6ï9äôÆoZÈ™œ[Ffæ¾t¯{›»Ú$"‹–%–ÒÐ'¥Þ7¥žÈ»‰"弤áÑ0h9¤ò=ì×Ëp-w‚W±£û´ßxǗ3Œoü…ùÇ×oVióØú•Ç~rrYç£^öÜ™£–q½[ª™ZµU}I ™vјÊ\çY½®¬M›|K²­Ú댶½22ˆR•ì¯&¼5Me¦CXSèµ÷tð™>3Ù^­¬d­Æ¡×‘'8Û„¹o¿ywàWVø=3‹k#­c¦ˆ¸gæ‹Yû Û‰°nü,Ñ.I1ê´ÆxÚªE˜ˆwi¾ÐûÚ{𠾇x a›«å®Ðž Ÿº£$<°goœ­+³àùI0á]fÁÍ®3b‚g…¤áDóV*0J„ã§Ãÿ£sä endstream endobj 1900 0 obj 4385 endobj 1904 0 obj [42 /XYZ 40.7999999 715.219999 0] endobj 1905 0 obj [42 /XYZ 40.7999999 715.219999 0] endobj 1903 0 obj << /Type /Page /Parent 2 0 R /Contents 1906 0 R /Resources 1908 0 R /Annots 1909 0 R /MediaBox [0 0 595 842] >> endobj 1908 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1909 0 obj [ ] endobj 1906 0 obj << /Length 1907 0 R /Filter /FlateDecode >> stream xœí]KoܺÞϯ˜u("Eê')ÐE º(º(r{[\4uš‘fìç#y)=1M‹"Ïûñþßþ¾ÿçoû÷ßþ³ÿ>ø¶««º­§ûÃ×»—¿Ð}Õèéc×ÛJ‡ûï?vOû§Ý×Ý×ñÿ§jÎ߯ÁÓ+¦ ûþëîýôòÝô›o?ýo¯÷úeÿ׿ß~šç;üÁ]?´‡ÿž>(­t?þðòÓað_»¿ünÿ븄þ8ïáÿw¶š®MZÆÓùQuüzù(xW½o›¶Ó{¥ô¸H;Ââ¿ÿØý<Îu^D5¥ºÖtuìœãtÓ¤Ãø³íœmÅÌ£Ò¦éFè LsUÊžTm:ßno°iû;Í“&S×FÚ‡Õ¨”=ÍІóð mjk% }ž'ÚÊ "‡6®FÚx&´ucD }š'L%9®FÚp&´­%èöyžD0Ùº•˜æ°ºçaBÛ3Nu"œäîúFäÔ†R¦lj†7žˆ ð~&Ú$âw/BMlÝ‹\“þHR65OĸU2ôäÑÆ :ø „†›¢x ¸™hÄÖp¶®ú c„±S…ÏCž)^›‚gj1¬!^cX7ö~~ïÚuÀ]6õñ.ÛáôÆÓv­mµuñ¸_^Ç®ªÁ²Õ(«‹Ið3º…Ï´Ë3¦7ÍqÄ,ýÅ/ìô‹ÊL¾˜Õ 3-MWý4àP±¶Òª¿ŠoÏ/VŽÎ;ÇÓÏX|e_xDYÆrúóâ/< pN6þPÜgpßÚÅBçÙ¦ÌÌ/ ¯ûö’0x˜fŠ!à‘¦#&71lŒ¹Ü´{Æ8TÑyRU/Ÿ…ä_2ÉÉD”^ ˰\®7Lm­â;Éà@3{žÞ§TeM{82ÊaõRØgëD^ƒ™‰’å¬lsþt¹xV,Aûº¡³ºPñ ìr_¶vyÙ\R€YfD&žk‡8Snvš„Ë}R®a–˽aZ™ŸstÃBÿHÁ˜RÅr¬',Ÿ•[¥Oï¹IV2«Ái„Æ•œð$A~_Oh£ìéaä@Ϭ³ðH<Ž»ÄH•ù ]OÇÖaµ ½•ÁFÃ÷ÍcçHá7øÐã ž÷-µ~—Ô’-/qJÍê3RÍ\_õC}iÕ—¿þê#Tâµ2–æïo†É%"ä±fÅ“Wý!äžµâ3( ƒšƒ^ã24¼ QúeŠÕ07Bd‰—6DPÌØxé&A/Þ $Â;ȺQVå¹Yˆ›×¾dôŒ›ÔòÓ²pí©5³çûÚâ™ï/`¹aŠG˜9¯xáTVL “tï¨ûñÔ£SàK-+:â÷„=&.´©üúéÐf%J¥É‡K-0 Àº4ßy™vÁ .5ÏJLŒÀô!Ž@P0¤ÃN}–KóÕOAÖ/¡þxtŒµþ.µÇw)ÌTÖ&2Ö'œñ¦ê.n3,øG0½Eƒ²ƒL³)¹~¯†«‘$Ç@’¾9G‹ž£÷êéßLÕÙňVŒgð{øÌ„Gª©º ¦ÏpšFúÊèøV ?¢U(â¯ïôüÆë Åqx&ú“1*rÄGøò3AžH‰™£4Kå&B³Ç0Ê¢ä8ž”2ЇN× ä0F ëAxˆÎò^Ž8õ‰<B4B‰Å§ÃbßΚ“ôê’lÙ"J& kä8Œ8áÖaƒg‚³˜åÉ óIg“5ô(¼¢ör‚öƒ™w¼!Ò£«2böïÿÂØ¿dÅF3¨ ,'¸ =gÁQ›sZ­2²™aŠZ}f3™ì*pVžS\¥ñçâQ!¼¸®¢ë›âf"$Œ‚f9=¿<ˆ2'‚fI±Æ‡UpÌøœ°‘øä+Ÿ‰sœgu¯•ù,…ÌÁ¤ìÁ4§UÀÄgOê5#QX6‰ùLMD’²q.Y)èàU˜Bl`³†û1p? \›\rq-Û³µƒ£ >,œ[f[{2Á1ÂÂlxŒ|[®IÀy†(>múo•{µT†ÉsXð€Y%90…Å0€³q²‚1Üð 4‡ÿàb8ËY”/4ð´9|¡Ô{J\Z¯Œoê³ë1·Ü1÷àY ñ㱄kXÒ€c•È”“`‘âÄEŠ`Ò-ÔùØ ˜„Ü 3Ç”'®ˆa',§sšº?§YÝuÎ èœá~ ¢µQu·Ñú®%zi}ýq«Ûí ì]¼Q]ÐCD)ùÛÑøT†úiýŽw*“T7=«êª"HŸáNuZ-IÝŽ ¢}ÑoŸ®ÍÐDjNR¶ká„V¸îHÇYN`&à¡ÒC­t¯p‚÷3¢‚ ¾…"á„@é`¸ðf3tsr…A-Ø¡ÜÂê™ÛŒÀ¾$F¨W)bëz£UÕʯU¢šC©ÈIÕÕ™Ej=¥DßßTŸˆðdŽáÕ‰%J‰¹I˜Î⨇—ÙL>¯\–Ÿ_ñÒÊœÞ8³2•“'’¢ ±¨ùååxªÊ*µHˆK¸7ô½™œ?N10B|.Þhn¥3…À‹ˆ’Â-‰q™@’Ra¢ˆU!'WéšK¶’TN3,_“S”¯6ÖÝ$ ÚTfkõ5khJ=@¸ñ†PkäNBM ºîu{ò¸–rNc'„¶p„ã„ÀûÁa¯l¤†Å#7Çç‹]‚ØñÇqq2z…Ç(rû¶ðæJ]çb¾Ë “ûuÞÂuæxë ûäKšæÜýóNj¤ß£aI)’v'5wR³)¼În¹nž;mÆ™ÏÑìóT£˜§ ÕO &Êâœfyã$+Ífª¨#Ú( HèCðSÜ )¼uáà¾5Ûs6í‚ÄyÈG^çÜ+1^Þ¶ N ß\•‚áÌlpÇì‡ï6¶·ŠÒŒ.,zÀq6ã̱”㎼Œ^½Ó'Þ)¼šŸñnúàeÚ‚ŽnkÎg-¨m•R—'µBœA»yÏSÕöˆ˜Tâð‡ < ƽ]n tãJÕã`p0«6n8 !sÌ3¡-!·§1 ôSâa 5tèõS¸Yš/2œÜ²#'gÐ Öð†›‚È6N)\&Â÷^ùï6+ÿqnL8Ü›œ’xs$ZF¤ mî~l®2aÎìKÅã Ǽ'dŒÒ%ŠõQ’éœFòä‹_í=w$ô{ôYï`ÜßBí°_[©²F ©‚¦unؘÅ@3c³ #”“¾Á)ŠÃJà´‰2ØHÍÃq$ƯýÓˆ1#6þ`þöý‡…\Ü«Ÿqï«û¼Ѷo÷jÜÆ¬mÕN]4öMm.ºm«öº*5˜Ê¹} uWu×»-wWF¦#hšJW [[µõX¯kïéá3|fR»;]éº9 =|„³MWñåo>Á¿è+;ü‚ž™yñµ…ö1s Ú3ó‰Qö>¯íx°îðY[unÂÓÑO[a §Ýt1”´‚ïÁ'ø â5\›ú‚îž Ÿº‹£,> endobj 1910 0 obj << /Type /Page /Parent 2 0 R /Contents 1918 0 R /Resources 1920 0 R /Annots 1921 0 R /MediaBox [0 0 595 842] >> endobj 1920 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1921 0 obj [ 1917 0 R ] endobj 1918 0 obj << /Length 1919 0 R /Filter /FlateDecode >> stream xœí]I䶾ׯ¨skDR¤$ 0àé%@Ó@FÁ8v`xŒt|ÈߪÄRU‘ú¸<‘¬M3ÀtO±D=¾•|?ýåË?·¿ü±ýôôå?Û¯úçÓ—M]Õªÿlw¿;ý€w•àã¯m'+Þïþl¿~Û|l?6o›·áß SûõaððŠqÂ?¾þ¾ù4¾|3~òåéoÃoÿÛòí_‡ÿýºýñßô|»/|Ût½ÚýòÛø ãŒwÃNÛ þ{ó÷?m@èöóîþýNr&ëfÓ£lÿ÷ôQð®z«$ëº-c|R¸øï¿6?sM@T}ÃX«š¶³å»Ie½í[µ•­5£µ¬yزix­RL³ƒ†-Y«›Ö5Û|˜j¿<Éâé0ѲišºKBµ¶hQßx""Â¥ÐüÔ.\â4ѲiÚ4ü½ƒ†-Z”F8žˆˆð¶Õ b!¦Ú$˜êÓpx»ŸbÉ¢4ÂñDD„ïì×n­mâ¥R(pU ™„l;«¼dMÝp¶UÝ¥Ñ'lj–MÃe’ivФÐ'މˆZ~²÷4ÏBD‰N$™f€&{ãyˆØ–=Û/ó.Zàa¢…xjû$TÛAÃ-JãÛšè-Åဎ?¿o>½ö»sÐûÏûÃÔøãýÛ¦þ3ìŸD»}ÿiûçá@ž߾ÿºéª®¯-±?|é‘~?ÂdU÷¢=ùa?"‡3YÇΟù<>Ã*Ù¨nxè8ò´i¦X3¾øø ¾ÿ =¼îäÙ6ü«/4†Ÿ!iªf¨CÞÓíGTÅYgŒ˜ å ‚T›ë²*@K8¢¼ïK±,û5(ö¬/æ³ÖdpáÜZÍžÃø¥`Þ͆Ă5\˜…#s2]¯1”Æ«°ðÚ™€ÀgY‹°%7€ˆe‘tÖø¾—÷Áæd2!aC`bÉ@ü*ç&Â,º@†LÂ16ËG±±µa¡‰Pö¡Áh4'á?À}DR ƒÍ«µ, ó{ÍK* d耶r/ƒý„±q·ÖWÒZ ƒ#/pä h¤ÎŒhþš›M àñëÑ"÷žg8›‚#;zg5^©€x ˜>âs1¶uï8˜€Dþ™ðÈH¨ïŒÉE_Ž]xwxés¹—6‡í‹ÀżÕ-ƒjðqxÇ¡ ±d%U×lü†!x×oÙ¾ró¡ÔóÑ‹E†` ,†Ùî0+ß›rp6ó]^d(PC*4¦ŒÚ’¦º“ÉMµÛU݈Ã^Òávözþò‹ñ¬—Hï¤åïÂçñ£ šåhqxO—¥Å¢)MÇËû¡#"‚HÎôˆÒzŒÃ¹;xøó G¬ÜÂkx<ƒÖ•ñô‹8j Ÿ:<¯Ø%Š­&'Q\¢,Ùr°QýœÅàjo1ÚÃq’O&³ÿ˜DnªV#œžQð™=£iÉDÕŽvÉÞU 7Fô–ff„qfIU‰=œŽÍ"\I5˜du5œŒ¼Všv=/6ÍØ3+=žã­ÙðJ‡³aˆB€W ñæ žMƯÔAŸd[N÷îO2yŽÁÔJÔÉ¡ŸMõ¯w¾A‘ok#õ&õ™óÛÖþ·°çÁá ¤EI8ñÇø­•p”µeÅ»¾kìç=õ Ùjz°K{Iðˆ#l};ÐG!°s®Gs\N/ _ wÁ¤§-W˜Ñ)É I¸, æžô…¿j nDLß«Õ †Ô¥êÏé0'4pÄá ijaÅáÎ8Ç8Å™Žã\7»#ƃðXBu‡]ópúB9÷ªªÛ<ˆÇÆ6C@`¤Ë$gÉÁ%¥P’!0˜É1vBëPi>åPDÌø!Àøp۹ˆT#½èM«ß0ª(=lX(³ai,¥{ÓêD†qTW9Öƒ#»˜«pœgó¥TSôh!å wüE”ƒjüZyÕ°$vÂoë!ª0Ó"Ä¡a±dQô5ηIªaÓêÑuÏ—:ŒÐNµ*·VXçÊ\ª7 ´­jF®`Jž#×v—=Š_0¢„)w„(Ây§>˜>²¤) ìQ¬†™0<Å!KUrx#å´7MkhHa%ÕõáR„5 닸9B…BŠåÎIò†Uשw£"XðNå¡wmÝ=è®Cq‰½ŽôžðmA|âHFjw̰¤PJoÌI äÙ†f©y·•w8nÒjóuú`ÃjçÀ~¼”GA*/™(Zü-z.J³1!løj@"3ÜžÚÊ Õâíˆjß))#çr& ÖIœ­I)0JÛ¦«LÇ«< «$VÁ@ǧ‰f®w³KÇÂëÁNgI¼IXÒq=±ö¬¥,¸q¨ÒF³çL÷¿MÜb\xŒà7É54éé¦n(çÂOú»³T´uä¬F±,Ôe8þòÁa޽9’lŠ(â©Ï#Ù×7RЩ7ÑÝ%q¬š|¹Y‹Q*Á±°î³š°u£Rƒ°Gk!L°vë¤ Œëõ¼@JŸv`‡°{r4úÂØÁ‰â„xúØ\dëqì½v›[BŸëÈ:ò`[›Ë ö+»©›Ýe„îPc?uÀ»µäåÈ×” ùDäF#*Ç= yIÍÚ6˜Ö÷¹kͲm…?î4e,MÚýþ‘ŒDÊÇèO’Ÿ´GØ)Fί“? B%‹°œŸ£²™Úêi’áÆw˜$íá“s‘³ßb>IÛÈ"̾{GéÐM½om·ý¶‘ƒé<ùà·Í—â—éI`½3ê)=aDCÂSªekÜYªZ¹‚¾ŸÊz±ÏÌcG å† ‚kõq}œ„ŒQLm’ç<í;Øû‰›åã&<Ã;弯jØ(=žzºIv¹¼_tUO«zÚ¿‡ÐÏÏVB :Ý´ªž"gø¢ÇÜÊÓ¶ŽÙÞª{Ør3&cP‚Pè² Þ‹rËBžË#H—†S‰R&agG›,:ÁÝvòGë0á/¦²ñJ!(Ô”"J5ϽºÞ ÍÀ’ ì¹ÀÚÂ|ߢRºðFŽ"P,è&±m‡L8‹Jš(¾_JŠX*’Îb43ûÞbŒ´ß"bX›.‚ ÝZp9Ç¡bìaòs³­9`ëqäÞŠ(7§:d¯ô>;âÆáz-Ú"01]¿:ÈT—rr(÷§_¾&.qB2®—À8 ÔÍàëÏ!R8Ä!?k5ð]µŠö›95è»ê:aÅÚ/ÖñéÄ"Hìåm#ÑWñT‰œ5·Dß5XE(ÄUèwœ“wSŸWíø­+5Þamªñ›ˆ‘bijpÖj{nq´ûËkÀ›¾9‡ÔÑ4€â‰ó݉—³â áÖ¶‚WÐVP‰†]†×â…îytd FÖ8áu`w'ܹÞ[yQ:ÇQßçä,¢¼ÕFKI BÏ\±É¡tXr°2†-)8\©#v…½ò8DL‰wº,sUÞ«ò¾¼ò†g¼½û³9zºu«™LÜÏ󧜹®•ôæä<ÂÐQ‰ tRaNŸQp?aã.zã\w¨c™9-šÏâ×h6›;’e¯ÿamsÎöíVwê)§ô“À#çN„//â"¿ 6-JdÇxõ{D1̙єZ¨%sYÎÆ4y$¿‘̰ Î_Ëß„Ÿ¥ôzYp‰Ö£uŸ¹”×Xš†Ã‘£_*ÑçJóD‘*U{lïÕ7ÐS=»:.¸¹¤.xçj×D/rÂÐKƒÀð²SÊM v|Ø?¿ü.Ï}Ä„-×jŒfˆ¿J1s{xÌÏ*8 (aMÁ—zë˜=wª™2¼ìj爤ŽRI)r}Ò4¥¸Ðµ½ŽÒ椇Ոëã¯ûËÙž–wçl­cs¾Ê%‹á!y¿³"¢>7fË!ÇyLêjø`2g‰æ\LÖZ씉Õ8sÉ0º·w6”- 朕 æ×²å‚¬N ƒj‹wºÇ-›CñÔ—±qW¼‡ôgGj1 :)YCÆoðjd…0ëka;~Ãj1ŸpÐò°KDæ(%qø!Åœý•"¢A]áeG)R©ÒÁö³' µ×¤íA“KëÚ€Ã:´dœ°#<ÓÁgzôŒEŸ‰j òZ–±«nŒh׫«ñF‹«æ ÐÙ²ñä¡y”›9Þó¿R ›ã=/hÄñ¼5†àÛ°žy‚ôÉѬòbŒí)kŒÑYφŸaZOŠ‘ÃCâ /&UJ‚Ì»HöG?É f)Õó̼߰NÍæ7tnGÖ öÔà,RÌ&Â);vŠÐü*œ§Y™Ux]ŽŒ'<½åвpoå5µpGf¡¢G;L¦!b+‡À:8ÐZ ~ñKüd¢¤ÓQ–ŽaÃÈÏ~*]#Rúö‹§ðC Þ3'¹‚ªP˜Èž5ÜsL %$Íá‰xÍóÁ^ZéŠ7PÂZ¼ž8¢«îÕ¥+*;?ùV¶D4ÈZžÝŸ‘$ŒKíðcîMËÒ»y‘ñ"t„.í$‰ ßGqCæòøû kü/Û°c)ÀDS!Ón¥’XBÊuþÚ…KÀÉh†“•aÔ"à-åöHR¶B„E"ÜŸàOµŒI¦ ïÐo‰D’Œ½ &˸mÔ;橼Àä+E­(j–²éŒÏ sˆ³uÀ‰@_ü W(_:"~Hé~†¬]rNvÉy×z- ]pW;Ê)§µ¢!~ÅLÉþ ïÏç@tÄ>u‰«´sî¦w=W…%¸‘ÐálYÒÔ0…¯,«Ï\A& OÚ 2Gån/³ Ô|±öJ¼83Ì̽faG(äõLþâ6Ç1Æ«8 ¶ëS¼9§CTgœb ö…ŸŽÖ{P=n‚Àåªåztt¼;—o¯ÓÀùã¸%®Æï!TSX™rIË@]•;æe|CCbB¸TËÑõ k$L,Jç¯Ë³ „àš;ô]sÏC¬6NEsø»ýdp¯Ýô¯ßBiKs}”æ7§<;õg&ª-–1çé™+ ¶¢nÎI T¥æÏN}S'o«ÖÜÂŽèlgFÆÍŽïgÝÏRVjÜTš[€¹÷tð™>3Úµ–W¼giZDæf™íô“gø]¯6³ÂWôŒ>ÊÎ0´½{FS,fí¶½,àºÝï\²©xOm†9R[߸9ÉK:wî=˜‚ϯ!l:etFæðl˜ê6’øÀž¾Q»¯ffÁó“`ÂXJ›]§ØÁ¤áNÝo)-Âömó\¾{ endstream endobj 1919 0 obj 4086 endobj 1923 0 obj [44 /XYZ 39.8400000 303.379999 0] endobj 1924 0 obj [44 /XYZ 39.8400000 303.379999 0] endobj 1922 0 obj << /Type /Page /Parent 2 0 R /Contents 1925 0 R /Resources 1927 0 R /Annots 1928 0 R /MediaBox [0 0 595 842] >> endobj 1927 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1928 0 obj [ ] endobj 1925 0 obj << /Length 1926 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜sØÍ7°v¥9$ ‡ ‡@ޱŇüýÌ 9»Ãîùš]ÕUMrflÀZ‹Ëf?ªëùUÕû?~ùûíÞ?ùÏîÛøçó—§b_4ÅðÏîøï»Ë¿°Ý¾´ÃmWïmüg÷í—§ï»ïOŸŸ>þûýÉ4§Ç?ÏŸüíÛ¯Oï‡? óåùχŸþ·³»?þïçÝ_ÿvøãÇq¼ã/üòÔõÍñ‡?klwøŸËŸŽÿõô—ßí~=L¡;{üﻺ,›Ò&Mãûë«æôïå«à[Å®iÚ¢Úc“¬{ñß<ýtëuû¾2¦mª¶ˆ³µ‡AëÞìú¶ÙÙ¢ó†ôÖ3I¦í;‰a޳1I‹2EÕbnx_”Ãk›¶Ä×’†i‹º’ØðãlLÒ¢Æ Çñ6¼5•=-°nÓ6ꓸQM)²ßÇÙH7‡¹Û]ÙˆìöyœÄmêz‘KrœÄnÃqx»ÝõBÝ~'m›º¢–8´ÓlvÃÜmcEhûuœÄm2mŸf#±Ûî8Ÿ%Ìûf|¼øáëÓûO¦*»£ôõ§Ãy¡§,á;àwOÊ ~>Á+5pG9{ØQ|¦ð‰ý1kü¸£ áÌï5üŽi3}¯î>…¢Ï³£Ùnð°ž_ÜQ›ÙdñÜt,¾Î–q5Û`(œ£Ç³~0®ãz0®0®p­ª8r­ÎöçYšÓ»}×­ý½5õ¾¦éî`½/íA­ý34f_WMwxɽËÕÛ_ [Úì­éœ˜Hµ¯†Ý¹xR£'#ù’žøS¿ö¼à‹A,|Âù0^º7%¸v¾s¹ò•9Z4î¨áYã'x&øÃøÐ½ÙËû¦5a"³ š£)Ü…zûÉ™+$PcÝïU¥»No5WüEvOÕÛ‰ªÄŸ!ÜÆÅ O¸(‚×O“©›vÊÕ·D÷rÛPÖ«¶rä4ò±Ö)«+c7ÃèP$˜º2Îvx¼æ(É•…0C¬ÈŠgûiŽÿyŒXDö +x4ïJºs¬^2\Éõ94f–v×¼m»éæŽGÚìëòt«rЧ¶ë“Τ{Hú€†9Õ艚I¼ÆàxxwO¼©y A€ Å/kô”ë²Mu¾Sg£ºmê©!›B¦ww‡sX£Â8ØåÆž?3{o¡sÀ X…\»–9¦íªY„JñÙª™n‡Oÿž®€Yw.Ö?» a§rd…¯Kâ™à=Á¢ˆ3¥Y˜evÇ˳y£ÑEúFvYN/‹È&°N;þ8|ùåþǪ \õø•Œ¨€,"ø+—qû„x)ƒ/²ôwÐñõHx¾ýψÚçòØ“¨^çΨ]\Åc )* À“,+ÖuôŒã_ÙxµµîxîÓݾ}áªo"Îö”‹‡½†øZq$ J¬‹Â ã#MHDéÛÆ]™p,I:E¼)rQº¦wñÒ9°<`¢&ÐßNÑ:ð ˜í½$ÈOÝØ`%vyf¡]}ÙL'zÍz‡O²A®8@1ŒV…~ ‹ggAEE>„^ßnÈÙC #Ü\À„ˆ^~ÖI¹/o””ÈúâP ~çP½-€ê³k‹ÒÌ3;ÆöbE&pÍðÅÀd‰Ù-dB&$#Éj8³ÈS¬æÁY+UF}'BêêíHME¯€)ÚévˆÆ8vfÀ¬ º­Ç·+éñýVñ1…$ýŽÂй9y¿ÊU)r‰ò‘¸äÞîc*[/qI9Š<-CáWÊq¥ù0’ ¨ê6Øð&…eRpgKIØ<›fãÁˆX@ìÕÇ0/¿‡ ¯\Q˜t¶t„‰,°¾ˆþè1…Ù;ÂÊjÄ:™w¯×HRïÈ&š’î/GÂw(X’<ÝÖçˆÆÝ°dÉ;º4}D)‰žÇ0ÏWrVó«Æ}½’N€Ü© [ÛéÀ»_z™ŒÓ¦hrpøyz„æã Æë•Ç$fÜ€*î¨å dyÞ<+­†—ˆ`ZÆç£—g·qaó ?¡$ æR™tÄ´²Ï†‘ÀJÁ®$˜õ[@›Ò,ô3O ö—b&3â×;Ÿº‡çãyƒ9ÐËøT²j˜«Ý DTU…f‚o+5FÀçÎÿñîW<ÄΓãi°-çÅuB–®…e…|­„Àt狨Ôh½åUô% ÚØK¼ÅbO=68–ÖÎ󌥲 t²t3É¢°hÆ{«Ö9Ôç/–7·[¨ž9ÿ.Aîx*Ò|†#æú”h+æ ÏŸ´d8#°ú LmACäbˆ†1Bd)ƶrFÛ4º–6kQ¸¾Á(ªÅ)‘gåÀLñwjL‰‹ÓNQnø´7˜…5Ä·¿Ãçrjã¹áp(dÅÜr¤u•Û._‰uÞo*=˜·æåjæÖ/öîg®#'Ü)Ž by‡¡f\6œÜoÏË’*Ãò¥K«Y¨jÓFýÆYÊ´hŠSa½ ¢œè­\ ‰’ÕÌàÔ•E½àâ<»—«œtqŸ¾Sbµµ_ÌÛ8Bïfr$󺽔!‡?.’ã]nÌXñåè ¨bE4kÓT•#š¢+ÊB…Ufžña‚Ždr™¡U;»Thàù_ ÔApüùÊ™lt”#ç¾ð‰Þ»"íRÒjâ+ùàÊøP¬J7ôL «lùe 'ž”(Š‚ŽÃ† ìã+ç&!' µÄ¥ ‹¼Û,‘߸ç˜nòT#o;pž Ä„RªÞ2,…ºY2Ç"`ÔõK¹#È_§\k¼n§4±`·&RßVÎQàm§½mâé‡q­F›Y:ÔÔ Êëô¡úÉnúÉ[­v\!ÚÕWìƒÀ/¶£éù ºX*ϔ¤k:šÓÃ7ÑsJ&D§åC‡¢RPžä¶d´¯­…d, !{‚’üä]‘~. ”kDè°ÄqËsŠ໘5É·Š˜ëŠRpó¡Ë2í¼ýçÐÁ·öDíŒñ•k¦ÄLhgNÝLN½ÑÀzÅn׌5Ά”g`Á3ó·,¨Ž(†¿IaT®àJïÀ¹•xp¢žÁ °‡0 1®À;¥q:rØ“X$lžÕ´çfúÐsO²L´?'ÈLUœ2ߘÞBâ~x"^…<¤„œÂŠ9vg ©2¯žnÂD±~ÝåÚ‘à|¬LZg i&1<7XËž£­fOgðflËP•ÑÌ[•­‡‘UWM·æZt€ž®´¥ì–›/tïwä8½ Å2•(ZÎÝÏ·êr¤Ò¸—}ýF­*´²n‡HQ<‘j|É¿ª­Ý«éÆ¥4ÎÞl53'[ûZz%šO¡wßò- E’I¿$èœÍʬSH+÷LH®¿·ÔIÍÞ.S¿­äÅ€]“R”ë˜ñù5ó` J·ÄvFgåèGW]\ï@]ûѽmGnD¸N–ÜY œ;]„¥G@© Û4­rRAñ†qtB…†r”ÂAr+”2Ò„š;Q·‚/ß R‘¾()%Ce'–¸ºé3ƒ’bPÎËQœÜš¹ß¡†dÞZ+v; wEQR—ÍT–Pð*Þ&ˆàq8õ†–i'T‚l½µ‘„™a‹ ePÝMùF m­d]43,ïV+ðår.Ö¶W´ËÄÙ˜âL|TuÊÙ˜×åçeϤLÛ5wXäô£ TÙat³Ä£`±Œ7lðG6ø U­4<ðoš×¼ËóMj›z*rtâÈw£&ÊDÝ9Þ5åL6Bù H‚Z#Ñz ¢Ÿ‹ÍIéŒ$OÒ¹v"±ŽvÏÑÇW“(»lœBS.TõT0ȆD%’?#`Dyc“‘#¡LB‚ðÎp˜^±ŽÞq×-Uš¡•ÖÛv<ô¤4ñFHq©ß?«Èp@ÓœNñ”xú‰ÛuãIáKáJ†a1혂Í]ÿD4 J//|Æ–îÊ„] ìùzÓKÖ“1H !‘¸M6œÞ<Ü^ÿ2´}kß`© YΘÙßð4÷7Œ‡âwñ#ö]™±f镸I ZûæÙ•ØË3|P4BÏTKT'ÿ2Oµ4¥Àɬ(°óŒ†ŠºÙ«,Ó¶P=â§š^ÚÞLEgeÞB”HˆYH)r«Eet³„š ƒ8%ÌÑ7áoòË æ²\ûnž‚æK1‰æ÷.hxôýtSn6’(‘Á™£g­oI ÝRï¶-õ"Mªù ž‰*—ÒN»J(-ŸR×…¢™2®TJ]ºûP³V‰q%'›ÒîuS÷[š!À`yŒd·‘Å(’JQKw±`Æ–3r¹a³êÜäÆÊ0Z}×8h½YÝBíÌkmÌüQDL¾2t]ÓÝ@" ©,XûãïXü£Z`weÛp:g8Sx>xß8÷ðhïàÂq¸@]M²ærw‚np–” ¬ônîBæ3U·zzûÚ>wñ<Ž×)ÅÉ”Pî*QɬÉÞUOÞNåø¾ŽùE0KÒ-5]5Ê5”.nãúõ(EÞTVÍt;"RT ö,¾³^†à0ªÝ¿È»ˆIݵ—LϲÌ/NauYY" Yô˜v4…ÓºVÒ£-[T”SZs>f©Ikʵ+ëܹå¨Zc³¹Tï[ÔWb¾À)”‹*S²Bø¾>¢¹wÎc=,,¥ñíb¨øÖƒàh满˜`Ú}g¦´ðJñ}iº]ÝÛKŽ è»**;K„Jà¬-#ç/B‰½ uÒµå`«æ%èK‡ÌÖÎ%@Œ°˜ðT|‚l•0nøŠ˜ì‘l?Ÿç,‡!”Èè‰inV±;çÄ ¶9E®e’¦ð]€kÞ ZlŸ¥\ÁÜ‚5ëè×®üÉ[ ‚ÝFk9·*¾ Ë‹IÀýeB&¸˜•^ž{“—P—ÖëNZ¿Zßøl"t*OšÄG(ñ) LFÍ¢j³äõ¤J&¤Êßx¾DUÁë”Iô<ðñ‘Š$4“ðP’u´^¾íT¸õ Ö-"IòÖ¥SM,­&•ïR ºi÷ÙKY ìØû¦53Ýx¶ÄÙ2˜è!À»m§÷7Â4ŽÆ¡{N“nâ=Ð^·”æÀ `$,°8FÆiÅcq Âú¢wدŠ8O/AÍ}jœë6Pi•ä]7NÀÚÊ‚"ÑeQ£ÅÚöÓ™ÓîSq/|¨bpÜ­q[”S’ð5ÏŒõ(góüo"% ×Öm¸4Îu¤¤1gAãøÒâä!x5eöðJY3€×Ï@”S5ÕÌ¥ÍHi~cníM¥bϹ±²Ê±î|9ÐÝAÀOUÔ5çîå@ã•âÑB*ŸÂ¹ÖÌíÐhlbÆ“@f=¦L˜‡dÊöÞ|rŒ=àÐN‰g°øzîîLµ#ù]ѵç/⸨J?‘›ò²¯:‡4H—Êã”íôÉ€ÁØ~‡ùž ¦)uMÞ@ qËþ¢®ž²¹€¿ˆ‘ ÊÉ:Å9¬¼(µu¸¾¾œ©ç“óìV$3P”ÇøŽ¥›¯É;ïåZq„À¨„}Ųf [yÓp"JY&«”»/?E[·O¿ ×pÁ!Hhäªõ´…×Òáu»ÚóUsW~5q´ñêKÕÙo¨FXgRŽ(>Ý>+3ò š£î¦nSŽ¥Ìu2FM}UYÀÅÝŽWa¬Ü7\G¶‚s{DæBO£1N¡†XFNì–…NÎÅY~¥øïäV³êv‚5åt¯%¨pò¦RCe*`è”üa¤ û%:EB „¼wl§r,XÙY;K&… ‡V=Åo’D#š&4á\q^ð½DïóŸÓ”*m3+)¨ƒmƦœ[,Š»nJø6"Àó / ¡‚– ’A»4Œ Êjq×?!$ªÚ jY˜ûÏW…P.ø‰AýzE~qj-d$‹0²‚a"®pIÈŠh!9s‘B{øw÷ýpª‡C;Ž9þñí—À1ûôQ¼ÑÇç …_%­®Ù™Ãʯ!¶zÓ FveQ×=\™¦Ù7׳ûjïüp1l»o¯SK{åÉ ™Ëroû« ®÷Ípnî©]ûNßéá;jíÞåñÑÛ“p´*.ÿæþîh _Yá'ôΨÒ_{bÐ:F¤½3žeíãÜN êŽ?ÛÚœñ £2G:mƒ)žvÙ"JÄ»4:Ô®}Ÿà ¤k87ó Ý9<>uŸFYtà¿8j:WFÁã³æ„wýY„6»®1Ã|"…wÙ%ü³¤DØ}~ú?s÷# endstream endobj 1926 0 obj 5549 endobj 1930 0 obj << /Type /Annot /Subtype /Link /Rect [240.479999 490.579999 381.600000 498.259999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.pcre.org/) >> >> endobj 1929 0 obj << /Type /Page /Parent 2 0 R /Contents 1931 0 R /Resources 1933 0 R /Annots 1934 0 R /MediaBox [0 0 595 842] >> endobj 1933 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 1934 0 obj [ 1930 0 R ] endobj 1931 0 obj << /Length 1932 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯¨³©õAQ€a`¦»Ç€Ó€ ŒY¯EõÂí=øï;S 2(1CƒA¥2K3À4§¥dè?^0 þüÏ¿ÿÇëýýõçO¿ÿÏëðç§ß_ª·JWöŸ×ë¿?…Q›·¦¶ÅÞtoõpýçõï/?^¼|}ùzùï¥Ç—‡N„­ðïüíåg+üÅþÍïŸþõRú¿×úõ_.ÿ÷××?ýûå?C}×¾¿˜A_ ï¶ jU›Ëÿ„¥ëÃÿ~ù·xýÛåÌXïõ¿?um×ë¼ÏøáªÆß²ªWmêúò}êúŸî¢‹ÿýÏ—¿\êòñÖUê‚¥7-Yå\ÔþZ÷õEcÉŒºÐMí‹­}þîß¼ªã/<Õ×];\*'ËSyæµ×­½î´3-·f”i\q*4$È ê¾%Az~·E ¥•¨;K³mûZú òRjªöR_]]¤ø¢Ÿ¿û73•ÚÕ¯]m@^×h'$,ŽƒÈ½)‰Ï Áš¯%It^sßmñ6>+'ÐrÀºÒáX´5js‘㊗®ãDj”½kıF m”G ûweQ:múÊÇ¢(J¯Âï¶x¥•¨;¥6â»-Ú®Œ/*é硼L!¶-Ç-´QNXuìß•Eé´é+‹¢(½ ¿Ûâm”VN î܉§ëj7ñèÊ y_4ãówÿfþÄÚNž©¼ x}þîß”Äg…`Íã+ˆÎk&ÖÛø¬œ@ËÙSŽEh‹cv*€âu*‘Zeïq¬ÑBåE«aÿ®,J§M_¹c%QzÂÄz¥•¨;{ʱ(mq¬±§W4^¤œ=±Ú¶k´ÐF9AÑêØ¿+‹ÒiÓWnçXI”^…ßmñ6J+'PwÊ~¨\µE]¹YÛ•ë>þÝL”ƒrãr¬ÑBåE«cÿ®,JÐ&V>EQzIÞFiåêÎ%£œunj¿úðE3>÷o擤ª:'P]'43-wnE9 '¨ûZ”é\I¡´’ugóˆEi‹µ_†¸âu~WÞ@—ÀÙûÖ«p£¤i¹ó«öœCõ:ÅêDz(X¯I M «•è=›P,R[k´½+/ÒCΦMhÔ±J7Jš–;¿lhÔ9T¯S¬~,‹‚õšö¤°ZIÞ³™Å"µÅÚ/2]Q¹~äßàOhÔ±J7Jš–;í¸M QçPNƒêDz(X¯I Q «•è=—cT5ú¡hÜÜŽec_yÇ·Øôêû¡M‚¦e·8„¢$ÒÆ;òB9¢8QŽQ)¤VV¨öl¢¬®lÜìîË#€\-„·÷ këlj”5-ûÕ¢@ÓÆxôíMdÉâE}:r¥ðZY¡þ³9ðº²q=– ÊEìùkÛ×Öi1ZYÓ²_A ´oŒ·AßD–,^Ô§ãY ¯•ê?›~¯+7çû²òý ß— [Û¾¶N‹ÑÊš–ýªR }c¼ Û ~à^Q¼¨OG¹ÞÊT3ýgSÑõ?ŽŠÐýˆec_yÇ·H·3^h7  IÙøe¦-J"í¼“7”#ŠÕèH—Bje…jÏ'!‹Êè‰ôå‘@®ÂÛû†µuvÊš” .7ó›6ÆÛ¡ßw"K/êÓ‘.…×Ê õŸOB/”Ñ;‰eƒr{>éÚöµuZŒVÖ¤lpå™ß¾1Þ}ÁY²xQŸŽt)¼VV¨ÿ|²x¡ŒK_V¾_áû¤kÛ×Öi1ZY“²ÁEh~ûÆx;ôOdÉâE}:Ò¥ðZY¡þ³©èZP‘F/&–}åß ]Óz¡¦CA“rë£æFüQRƒNé@Ž(NT£#] ©•ª=Ÿ„,V(£Ó—¯dàäj!¼½oX[§éPÖ¤ÜâJ4¿ic¼ýÆY²xQŸŽt)¼VV¨ÿ|²x¡Œ.M,”‹ØóI×¶¯­Ób´²&åW¢ùíã5èBžÈ’Å‹út¤Káµ²Býç“Å eônú²òý ß— ]Û¾¶NÓ¡¬I¹Å•h~ûÆxMà¸eÉâE}:Ò¥ðZY¡þ³©Èôµ§¢ÀÏéËÆ¾òŽoç“n]{Ò­k¤ŸiÙ“!‘‚  rË¿’8Q@ºRª=Ÿ„,V(îMW‰¡÷á?"x{ß°6V³Fâ™–‘š6Âëu‹õ‹âE}éRxAV¨ÿ|²x¡¸7}Ù \ÄžMºÐ¾6~³Fâ™–‘Ú7Âëu‹õ‹âE}éRxAV¨ÿ|²x¡¸7]Yù~…ï .´ïX'`´1´“2¡@ûFxnƒú€Eñ¢>t)¼ +ÔöÑ…: "$],ûÊ;¾-@ºZ;Oo­å˜YÙG1AQ©TnùW'ªÑ‘.…´FÒ­óÏÛñ„$„¤ëË#1 ‰àí}ÃÚ:uï]¬Ó2F3 4mŒ×éëÅ‹út¤Ká­‘tÚˆ'$!$],”‹ØóI×¶¯­S;²1³26 ´oŒ×éëÅ‹út¤Ká­‘tÚˆ'$!$]_V¾_áû¤kÛ×Ö©{ïb–1ÆI }c¼ Û ~ `Q¼¨OGº^w²¿–Œ_tj<«‡ec_yÇ·óI·©}ˆpScôó´¬ÜbŠ‚HAPP¹å_Iœ¨F ] )È ÕžOBÚàŠSã±=_‰Áxw«ÞÞ7¬=œYc,ô´¬üJT i#¼^·X?°(^Ô'.…d…úÏ'!mpÅiëbp5æä"ölÒ…öµ6k ‹ž–•_‰ ´o„×ëëÅ‹úÒ¥ð‚¬Pÿù$dñBjú²òý ß ]hß±NÀ8Êš–•_‰ ´o„×é6¨X/êH— ²BýçRQS·•§¢ÖÏþX6ö•w|[€t5’®¨hRFÒ•q¤‡H5’n G'ªÑ‘.…ÔÊ ÕžMB€Õ•ý¤ïË#1´>šWoïÖÖ©š”ÒÚÞàÕ醲dñ¢>éRx­¬PÿÙ$x]ÙOúX6(±ç“®HW$4)¤+´‡=Á«Ò eÉâE}:Ò¥ðZY¡þ³I𺲟ô}Yù~…ïK®HW$4)¤+´‡=Á«Ò eÉâE}:Ò¥ðZY¡þ³©HT®HW#iÒm«Ú¹—ÛªñŽÖiÙó"‘‚  rË¿’8Q@ºRª=Ÿ„tHBéê€tu@Bx{ß°c€q”5-#) 4m„×ëëÅ‹úÒ¥ð‚¬Pÿù$¤C HW¤«’Àk*×¾c€q”5-#) ´o„×ëëÅ‹úÒ¥ð‚¬Pÿù$¤C HW¤«À{%6hß±NÀ8Êš–‘Ú7ÂëtÔ,Šõ ¤KáY¡þs©¨­|LSëÒŒ ‘>ã+ïø¶é¶Û^m[G9fVF^´EI¤VPP¹å_Iœ¨FGºÒ mV(!`…rçÝ˾<CëÝ­"x{ß°¶Î¶õûÇÓr@ŠùMãuºÅú€Eñ¢>éRx+4zÚˆš N  ðñr{>éÚöµu¶Žl̬b~ûÆxn±~ `Q¼¨OGºÞ öâÁ€&¨ˆ|œ\ÿ¾éÚöµu¶­ß?ž–RÌoß/è6¨X/êÓ‘.…·B£G }-ÿø¬Omër UAÙØWÞñí|ÒÕÚ¯tµÆ5ß´ìW PD ‚‚Ê-ÿJâD5éRHAV¨ö|j1ûÔ Ä€‘¼\-„·÷ ;Ö GYÓ2®>š6Âëu‹õ‹âE}éRxAV¨ÿ|j1Ô Ä€É‘¼\ÄžMºÐ¾c€q”5-ãêS }#¼^·X?°(^Ô'.…d…úÏ'!‹ÊÚŸõeåû¾/@ºÐ¾c€q”5-ãêS }#¼N·Aý@À¢xQŸ@º^ê?—Š´öë?­qöDz±¯¼ãÛù¤Û#éöýLËž {Ò öHº}Hî’8Q@ºRxõAíÙ$¤[[ûfbÀ•®—«…ðö¾aÇ:û€x¦e$B¦ðöéö‚Å‹úÒ¥ðêÀ½/о@<¸òƒ:p¥ëå"ölÒíÒíâ™–‘Ú7ÂÛ¤ÛO^/êH—«÷¾@ûñàÊOkœô}Yù~…ï nnÏ´ŒD(оÞ> Ý~Bð¢xQŸ@º^¸÷o¶ïÐ*Õ붯¶Þõsí CÝö¯C¯_¯ίú‰îÚR‘Ê«¦‰j®_£²@©êò㥊˜ ï.óþ`—©oWO¦¢t]ITsý•ƒ ÔMÖÃԶ¶]=™jêk‘Arý mÏëù*qYWýXøá¯ß^~þm¸Þ¶öí/—¯l³|ûþr±AÒ¦nÚ×o~ýǪRêŸ^¿ýõEÕomÓwöŠ7û¤Òãƒñeü‹î­©ª»ðÕz|Ò¿Uü’Oã“Öÿ…Šj¥kÆ'ú­Vfö¤!Ccg¿ÄáÄ'j˜RK½ºP‰ÙŽk®“XÓýæÊÚf^Ù¼öúˬ2UmÇ}*ùj½ý›SjýÅvOõÖµúÚ ”×T_ˆ5}<ÝÃcCÓ}=A´^ùôË·ËUfÆiÚn:åÄÚéT$ø…>D·Ý Ýš|µ®WÇäö™†îª'ñÑ("•“­Ó~‘ê;†è;ê²–¸ö¾wŠûm9¼]/cœvñÏö»ßÌP難=~-vKsŠœ;R§¿ÞnÔ‚úéšjªŸæW²¯ÿ–ŽuA§´æHmÏTÇ ®‹Á±Q¦Z±8.O/vÙD+MDŽó‘ óŠjœz¢A|©&ûÙ Õ0›=š.½ ÒÊo~ÙÜmZì)–j[Õ6Tó¶ãdÐTƒk€_a2è"e6éO Ñnýæõ¤Èß|!Ÿ˜•/(ÈŪé¦*Ü`‹ÒF…˜é°ÐæªÓwmô‚Q_VähMCMÞÑ%^³p¬Â¨ñI«wÁè”°”RVO4úKr,óòò fƒrþQôJf¯­Zz9ÄXŠGÚWíü/~ÝaÒ1z6M¶U:7T$7(’ IÊ¢†v+:E²L·8‘¬­m÷3ÚzjqÝR6Í$$+|$#Uø(F½}#ÁCSΖ‰WÀmÐŽÓZx\k¡žõõÓZ8†µà[ä)­ìoô2ëñеÐwS¡I~CÒPywÄЬóæ–tçQïÔp<ô S×ö¡y&Ù¾±ÆrÕÓÕÓOîÅü±Ç‚Ñ´¬­RNÝ‘º å¬n;.?ÑÈ *+8-t•žM eLÎV¤Ä8J˜—RÆà“šÖ»ÚGØåžÉ‚pö‘G÷TÖŸµÚÊL;Lš}DÃ^wË›rnúð,AlÄÓdýv;ûö%‡þ ÖÆICà´`úJ¾[ÜÅt/û2't0œ¢èhêÜÞÀ{ZyÑÛËJÚ£ÚÓ2DìlO#`M¶ê0Öä¹;˜J¥ÎšôxZ“…¹î´&3)É.¡’–h«gsà‡s:öæioÊÙ›~ }xëÊÙ›ÈÌÝ{Ó¸­k–­õ™aí‘Vå£Y{ †*|”X°Mþl›ýmïÏØ}t£¼èÆj¦ìÓ™¸ÐÜçê%Ë*5Ž*ƒ“–¼íòã©q¡Fæ+‰Kf­&9™&4(ci‘’¬3déCöErOÀùƒ¤#â1¿ÐÍ·}!Vž¤ú~˜’TFÚ€ —¡Îhè„& ¡ã\ ±FeܱUA«3‚GFŽ‹ƒ|Ò’çš ;†Î´Gðîê<2w j¿õ†œ]ÝJæNÇŽêVêj¿þ{ÌMÄíØ2ͬ·:¶vé[m“£ñgókuõyˆe7¿V lš¤%N`ž†ÓÃpzÊz6­B¶ç½nQ*ëèlþ>œ[:Ég9M»DC6Ò ÐþBÊyLw©ƒU7D’vÀ@ØÅ³¸ 8èžé"Lð_¢Fž x»nÂcN:V…>2Êxrh_dßúS§/’¶Á>ª/2aÞ^Ø>Œ/r>"N_äé‹ÜЉO_¤ä–g÷"gJ}:/¢ff9¶Q¯Ÿj<½ˆ[Zìô"’ 8½ˆ¨òäEôsËò">™ £¡‘ÒmJ"=¼çÑ»¢îF-Cóûø$參=|’ƒê3&¨Šl:ú7´§Ž¶@i“=E®ŠLÓ­7ºi< OjCg*Þ+Cq?ø®w\)m-¬ËæåYH‚Në‘c’¶œÊHúÍ‚;hûª$án+Ö½í—rßéjµÃ&Áý-€8ŽCNðÿ?]}´zZwEEëI‰“X,G¬ n%7÷GÇÕʸÜèYoýpðÂÑÕ}:…ðñè„L yXbÀ øVë%¬äSrBÑÙ£‰ãæàŒÔµ„…å-£ºÕI`©Wß)™®E53µlç]‘HbÎMY3Ó>óA¡Sz;4a_-ú°np(’QOötí‚a'jȹú†Û6³±­æšùwý²½o¬QíiÈÁW<1•Vsm¬žŒ(|ÒDæ8Çs¸ê¾XNݲ÷ñ$Œ'™¤ˆŸc³¯Ùp%2¶·%Ý)oŧ+•EF¤Æ†à ¡[ûätßX:!vØÕ¤+Ú¿ÙÔ‡U‚÷©m¦}x/gc¬Jë/TÕ›îÕr$ m|¥Ð,Ç2÷Væ÷ȶS$òã2[ã¶\#ƒôI˜mû,ÈòÜ“½î ´Êç×OÚyBÁ™m~àÒJU<ì£kúéǼ¥jI'm·U'­X|=½/ÜB'}½U'µXÎkR'ƒ:„N†a³NŠ÷=ÈY'ùw±Ç›ÍêSÅs“èn¦¾$÷Ù÷f³ÙéfÙÜE"@w;ÌnÌ¡ÊÃÝÚóù ß"®\™ÐÃGv4Ê\–%{5Ñz(ÇúÆVþ°¤ ö$N9"ËÈ„ó5"— EŠKð0­ôdùgi§›D„ÅîSŸî ¥¼ 1T=CÇôÖÿ.{@÷#VÌà>CéÛ¥ï#[þ~ …:Õy¨•3GïåqgïîõbïI_¼§wW7j60 Äq•ÞBÞ¬ÏòžamÖôyÿù_"‰í¾ç÷ 6XoOà6’ȠȱšLpÔï`ˆÖzUsû,šÊÎHM5ƒ{Ï}™¦n¦óx3|Óm×gñ¾é×ôyÎðY)Îgª™ «†YGÙi>ßw—ŒdÆÊh|ÀM¦œ\­ôèá˜9áè;û Yw’s2o¯„ÆÇÙîÝëìïкãé)'éz‚ ,’iýQ²€/™@M7m‰{: œ=Övâ* EšYO<¼Ñj6·XùE@[Ýn±-FkÊ YßļûvÖÝüþÇÛcßþÛ8CÂC¤g‰Þ%P8Éé†eždêùçv¦ôõæy´¼{·o׿ÑÃóRßoç¥òúVõ¹~ÿQ‚Ñ(r`én'yUƒp2Ðø†ÀH'A9î¼Ïañg!ºŒUr}nHÆËز^íþ¥o,ÐÓ!|ÏÀúNuÓ)´ðñ¾­ßÊ)XË™œ¢O[õ¼Â.·r唽}1+Eòö(r–‡Kdyµz)+ÎEÂ),éÚÁÈ0>IZ‘3) 1Rœ³ ·´‰¤äH¨5ãpDú¶\IßÛ°Ö1;œxCsd$ÐYÈøwܹ…£Ñë™hE€OØ”.A»óÄ!MßìFÛ© Ž˜_JÏI8ÄÝ^9&\Š™à08þ5‡ ÉîaÄ·àCø4ÖÚ¥¸}6\$—JŸêdë ƒ…^†K$%Ã:Ç—&±ÀÛ`䛉:c§BBÜ]†Ë?'mêÂ,8o¾„u¥HÄË*ŸdaÌ\L˜")š9÷¶¬§°Oh‘óweº7Õ›ríÇ1-r޼ˆ²Tñ [œÅP˲?çÐ'ŽíØËªs+Ͱî .Ÿæúv@F<~Êýû;âl^¸`<‹¬ÏìŒY"!Ň`DýQ Vn+Ô°à†ruy %;ÜÓn*'o_¸Ãœ¾_ýsºœ†¼Çv«qðÜÿÆz)ÇMX‘_Ý‘ßÖO©Qú««žÔù„þZoí@T°Pm Ý äWÓ½·Û\˜ $mPþ,5ÝŽœÙÔo5¤&º÷q¾šþ‚…9M̹Ð&ìú6i«'B×^wEåÁÕä‡Vtç! dá IG´B9AÑûšöv:e4T½šŽ²¦[Bò’x¥’øD2x?릑ˆ|ÎM"æ(k%F/Š9ËåcÄ^·}5ëé‡í˜C9øÌgMÞyœx‹? çÎÀ]c“„Cóe.uMh­ &Ùpÿ9”ž2‚Qz¯~-PyÃeX· 6-ËF‰&ì“ùN1Xd÷z–ˆ;‘a¬)>Ê2¦“ˆ÷þNÜññAëç`DÄHžE-C_„“wȾ@†Œn¨`–O1"‡{Â^GBHŠÈeöÛ'‡…y«ìîcÙÀ3‘é‘eí<¨*CaMÈ’.|‡È,³uÏ º=&zŸãÉ›\U®• 1n 1?tÄ ç´ì¨Í±¾×:}ÑÝÌt.±üsàI„Ñv.&Ä'ôoÆÒôä}N;!ùÇûÜÃî¤nw:ìì–!Q<‹UßÔ³ï.³"ï Ô;CÙÁ¬œô ÒÕs²Ëç AÁ¢'Ú⣹¼#‘5ºŸ¶e|b9cÏï‘Énþ- D’ÎÇï>¹”µ¨èn’Èa]¶;í]¬Áøìè *2X¤+N º63JHp&ÐÍ-ç]jÃ)z<ÌÍÄHœK*¹À©|þ®Àùl±A H·iDÿ†ü6º¶ÐÁ²Œö¡C.éo£g.Γ=B.鼫é`Ž·¶$]­¯r\ «ŽÏŽs *a#éÎêÞÿxí¡/B5àÒØmzuïq‡µ,¦…\ÝnâÜ-°ÐÁè41ÝÖ‡ âuŸ*Ù†Zg¢Ûtüúýµ¿Y«Ð­#Ûg!‘ezJJs‰}NzìÀ¤"Á×2A#‡Kêž’éA2 ÆNq&Y¨DÎzÙt¤‡°‚–Ö;=Ã`Õ[r…4Þ¥¨#Á ™¹º=‘ôÞQœ)Sĺ 5ºE’sD1/eoôL`ÝÎÙ'GbŠz¶ÜÅ‹½°‡’³tÿ±œÜö±2Y ã݈ÁDúVuN¸xVvÈ„Ùx{6Šô •òKEz#—!F*“7%g"q§©HP H  Ì©£Œ{tY;v©ÈŽH.¸#^³xïû¹mbÀz¾á»W2–’!1cVÝšÌB}=8Ö‡B´Lâ=‰ê’š³BHï½4zˆM«.éåÄç'œa°=vÉÎÕÛ©ÄÌ“”BˆÞ7Wôn#aa·ŸŒíXˆ7 ¿@¥Ïú ri»j;rz$ú -‡nm†¯‘]RÑÑLä“9ôN#É¢{/ýŒÖ^°è–£½·taŒÚO½ðÕôø!5*;‡,ôkZoœy‡ÓwèQB·6§'ÒßF[ÜŒv18³¿ìOk‡œßÚ=RòI0 Î8ü0áž4Ò…ì’™ã“Óaò‚Ò9>iÃŒßýéÀÉ´–;r^P†¾ðmä˜[ EMšéÚäÐý€Ó¯‹ÖäM/l8f+=[ÒfÃÐäÌ;³ˆ ¯äúát½½7ʬ+þ|r>9ŸœOv~rz5Né´át´wK/+h£‘®Ñ ²$~¶Â®«÷¦ÓE­Çý„\o×7NJÿ†îä´mI»…nº§,ÃiÎAº—¯f7wàN;½-ô*ƦÆÂJ‚ÑGYk&Ž“™±=°Pã8/Ý{gó„s z§Þ»[?Ý>œ~päíOzd‰e©^'þÞìÞÉŠ^Øé¢•Hw>ŽmÉØµbí¨qj£ÌœA»›giX;ž _È«@Ó;}©íh§{"gÂß/ü¦Üáîs¯íùöÚ::E­7r Ó+0zÁÞÑËer8Ó_@÷—ùú 8÷Ò¿y¶›9wý ï2ÖÛô¨¯é™683¢k3N€ göqvci“`a]B÷F¨–¡Ÿ0’WqV‡Â;«ü¯ÞÃ,j›ºHãÀæ,piÛ’µúØ)‚•žèxNøÀBËÑAC 9 xžÓÍ@2» ÚÎ](x®eεŒü´ÑÑŠè´ñl…X/|V¶Çӛݓ`ÁíÈÙEµG÷Eº ö`ŸOÎ'ç“óÉažÓ¡¨avÒáqép9õOWûm.:ƒÄöCö ùƒdnÒ£Oêç\òlN 妲*órmƽ‡ÛåŠ\"N§o“¹¬–¾H•®>!÷ÐQ»fÉMξW8ñO§f“ÍñýP%§^e¦ê(Ÿø¯­ë©HVzëíÉxR’éE9j’ÖÐ¥È\C›r¹—.vRýæqDï‚ÒKN¤åÚx-™Ø´³N½š' ÀoÊcÌs9*Ù·6˜. ¦Dãpnö¥Gý„“2¬Hê¼¶&¹jPäõ””•œÁü{ŠÞ ÓÌ(“‘~ôîÙFËŒÛÂéGE†«è ò9—ÿ¥,.%Wa« (¿ÔoÆr(!÷,=’òº.Dzۙ>Ê gÎW&÷¥ˆÉÌÉŠ¹Ý!sE.1ZK^Ö [Ç`Êu)Éë“;vÞg6[–|z6û.\mzüÕ½ë_’¿Z=<ÑÔ5w´±îˆlþŒ„Ìphʼ™¡Ò+FÙáÌDÖ] wºˆº·inÚîV_÷A-(šž„÷;cØ þ¶¿‡œDdã>3î–¤ƒ—ŠèÚ‡i¦¯–öèc}õ@îû[íȹmü!G“lÀß±Fàåß×—Þ|é©×à?¾/tïx\T8.¾.ŽŒÅŸ®)£_ÕÆ-«pPúmä«×Æ+°´~Ó·ýSCûqŒmœºëç¬n´¿ñÄò`Ó¼ÕÃŒ™ÁFèÞ´zæÏ-9†üÍ@þÆvо~««æúh>nÕf;[ø7ŸÉwa‹ôÂߨ߀ùw뉢pÀDöh±ìðmãÈèu×rÝù‹Á˜KjmE÷²µ›žê‰´– 8ç–º?“ýšü6õ5æèÚèVû(«ĵÁª¿Q ]?ë›h­雯he¿gÖIɧóú«$#¼~}ùÅp¯5 endstream endobj 1932 0 obj 9380 endobj 1936 0 obj [46 /XYZ 39.8400000 261.139999 0] endobj 1937 0 obj [46 /XYZ 39.8400000 261.139999 0] endobj 1938 0 obj [46 /XYZ 39.8400000 766.099999 0] endobj 1939 0 obj [46 /XYZ 39.8400000 766.099999 0] endobj 1940 0 obj << /Type /Annot /Subtype /Link /Rect [156 271.699999 265.439999 279.379999 ] /Border [0 0 0] /Dest /#ba.Z#5c#b2#94#fenk#bc#ad#80p#bc#16#01#e7#ed#93#b5 >> endobj 1935 0 obj << /Type /Page /Parent 2 0 R /Contents 1941 0 R /Resources 1943 0 R /Annots 1944 0 R /MediaBox [0 0 595 842] >> endobj 1943 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1944 0 obj [ 1940 0 R ] endobj 1941 0 obj << /Length 1942 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹Ô¬_r`Ø@A7›`±^ÄÉ!?ê–z¦›ÔG±ŠU”ºGk`=uSd±ÞÏ7üü÷Ã?ÿ{xóîó¿_§¿ß}~*ŽESŒÿN~¸þ…펥l»úhûÓ‡¯ßž¾¾?}zú4üÿû“iÎ_œþ^^1.øß¯¿=½_þ4þæó»??ýï`þõËá¯þúiZïôoO]ßœ~øuüÁXc»á×?þëé/¿;ü6l¡;¯{úÿuÝv]—´ïÏ_5ç?×_ï*Mß–ÍÁ;l²`ñŸ<ý<¬õ¼‰c_Ó6U[Ä®ÙÚaÑ®k}ÛêÖ[Ñ;VÌ:&m™¾*%–9íÆ¤œÉUZ‡ íá|"¦¶(êBäÒ†ÝH@®Ã‚v[˜²€öË:‰Ð6}-²Ì°›thÖaB»,;h_ÖIS)C"§ÝH@®Ã„vU5"¦º°Ëœv#m¸ÚukE }Y'L!‘Ón$  ×aB{»"¦¶á$§ÝH@®Ã„v?I7ÛøJ%逽ˆ˜\p÷gñ–r¨ ÞÞBŸ$ ûb||ñí—§7û“íóåçagjüëË·§jøÇ` JÜ—Ÿ¿/ cÿpøòËS{ö<üölpOŠç'õ`muÆÖ×OðwÞŸT-«ó“>©ŽÕøàå‰iÑûÑy1aÓÖº›.ÜÅj¸£.úÀxóзîN l¼@ï®jšyè}ø2àxÊšê¤ïÌb­5æmËñûc PpæÉ´õ¹'\í|ò~á=ADlÛî> C’!ܵ·ªýà~"žø”2½9ZÓ9ßÅ„°ïêàëõ0ÝSÙ¶Î=qÎÌa ŽIà\œÍF°]¼WVø¨ê]®„ô2æü c/[ÂØ¸%Äûøå Çñ€Ä@ ¼Ž*øl>xx‚ 0…aáyòÓCåxf½ÓîÞÅ(øŒ þ*àLa"Ç÷‰Ù'†Aj*jWHFu¥u,Ìô8Ä Aéc³$ùøî_?ƒÐýKÆÌór 7d`¾y+…oP•¯ÎèÖ?Èö+­Ó,~ÂãKî'üÛïÝ5FD5űiÏPyI !<^º)/ì â;yÍÉBü‰w»¾hn¿ã1D÷\Þ'&3wœ·îGkø^ÏÆ«z;zñò#dŒîNX—B°&…Ôæ–D{÷ïYìhaïSgûéåøFcŽuÕÜAQ£ø˜âõꀰ‹—SI–,á5»¹Œ% Ó[ÖŒN±NªÒ=]âE†ÓÚª—ˆ±Lw$Åp$Î-QH¤º!QÙö–¹³\0ž¦ ´S(·L°9¼k'8ÌðGy+L°»~R\?ob|,ÅW>ⵑÇéï01Þ\¯yØ=‡B ´ëmÀ6ÑØ("UJÀÂ%-DÓÇÕG4-s ¬úa8½]TÒ~„7·¨Ó´oÙPz€é2€¡Éê/á…a‚Ÿð•3‚®o£W-ºÇF¬ž³â f Ü8$Á1bUõ²‚Ø«§G¾‹µSih’›Ñaüp±jž‡C‹ÊÙZE?^Í'?ŽG"Šh¼w‘¥3xdººñ“âøÐÝ  9L¢–)EkW6`–Bx«¼$µMÝ„¥HŠ#AŒÝBÄ•–Ù`Ê«ý*Ц¶tD+›bYi!0ê39%)ÒJx_Ñõ¬“’Û5ý-¼î”ܾlz¸ƒ”\F"JA9¨„ø¨j~ž¾}Ý4Ë’Ü=¡ÙŒ fD ƒ`‘.2¦v€ Y@€mXôÄöð;FMLS:G[tÊFaXÖ“¬[LEÇ%¨Q9ëÛcê*ñ'N–¡F±Ke‹¸ÆµC,2üD"mÙ—j_rD(²ÔÚ6·,•åŒ÷? ŸL×eôn9‚X¦|\?épÊ4õe'/OpàkdåsþCøöTŒ´*œ”h Ã5Åᔜ"Ÿ”äNŽ¡EðÿÎé]A¼ˆXVáªòr~ަåß´Ž¢.Qó¨Â‘¨ ¬>H%`µg㬷ÏÇß¾‡hæIY¢'Õpµ·pŒ'ø=%<éÄ‚H0P1‘ç¾ñ ×Zxž¬áj½A¼¼Þ¾S¼Zà=™ª=ú¶ZVgö¦tH¦´R$C'æð)'£bô<²ÙyNª!än02Mr)Bí t»"¤¥1„¦¬@Ï#N,ê ]hFˆ(‚[K¥j,¢¥ Jd—¦t¬¡Êdsú0Ä9®†gcÙû“Û¡AÈWöλ襰¸„ykyÒºB®lš[þô8±ØÊTÎÑô«)Mç¼RÅxbåè%ˆŠ=²¹Zív @Úëš\XÎñ ؆ •§÷àwÎ"‰ÚÉÞZK 9ïÁö#>¶á“iošÁ“¢˜•¬‰ÅÊ%˜øãøkÖv¬×ßMTHÊʨ¥tu³Þ» fÑÈâb)µšUÅ` ï5sEG÷‚C“À›ifW^œk…qò"ñ“ªŽÖA¶ßIÜ%·ûÔ 8Þ`‹=®øÂÝ-ÀâüC¤[ÐýÖ‡õmë  £t ­gÞü}[·¶)t!ZC’43g¡çs]6År ÒÝuYì®Ë0 v×%ëîšÑoÒåk‹<'5ø=¸ó6ÜNÛ `/¦,<‰÷Ó˜1²âýp ƒû§Yøäõ„šº¿}ã\ˆa©ÑÚsdn¿—ëEçŠåú¶èo¯*ÅHqéËfžÊV¹sŠ =uò@·ãkT `%ßIÅ–·4¹¡ö ­»£HkÐÁaÙàæî¡ çõôˆ©áÍU0SÁïXø¤†ç© ¬kxÛ{/šÛw½hš“¨eê‹Áå‰Än“>–;·É!:‹xý׿ÞÔ·Xs:‚¦ÒWÚ[phà+aoÊèÝJÒ–â–e1{£ª¯¬n_¹ÁÆ "#B)|o{ÍDT†€‹úúá €4ö< Þk°Ÿ3±iñ}*…KÁh|àx¿+aX f=hçmØ…¹W¼ÿIpïúgNP>)Þ~]¢½'0b~IÉHH­‘,Ðaµ °ÌÐâ#¹wEµ¸í€DXÎ)à µ„Ù¹//&[Û8¤)Ò«4WÇŽjŠEŸD]¢kš³¶½ÅsúÄoÅ´¹ëC™›C¿‰‚†!@£q Ó±1åú?šÄçۜᔠ7òFÀ™ pÅ àNç?¿>žO4ª¼úůOŸ• _ºüV8¥É“îØ"TJÖËöm\-¥‰r_ÆJ ÙÜ×.Vbö§¤ôµƒ¯ñÙ–¹ü4²-GVj¡í ˆW²) ÙÙ×bCÊ GøìŽìªK‘¼#³®,³ø ϧ²¼F?;sú«+ã.l{&–õÖýè;x‘å’Tð—÷vâŸâ#z_é!ü(Þ´õÎg&•0ÃVçäœ@€¯X,tŠ)¤uH¤€š!F/ël ¼Ïœ?Qº)wkþ'Z¨RÀÃ@ò—ÄÑ@6 ¿SàÛÈØÁ‡”Œ9 GÀ“(0åe+/‹Ôñ\ÇdJ4èºK3‘)¥ŠVÕz51OðêÅûY¬K¾¾#£{L÷JŒ æ¿&%†¤S)+â@ó4‚œAË:3a¬&{.Í-ÐŒDdÔwH‰ÌÁbˆó–Ч•—ˆ‚t²^&©ºìXíiºÁ,™”2÷Ü©2`ÌÑ 'Áu#SµÌ"6¢Ö¬øì¥?)—@¶”£²0V[ª*Mÿ$”Ž3|ú"ã@§§/Ë©a‰ÚŒ_` 5+¿å°"oš%©•à5ÕÜwW;’ W™úÄ”*l²s’×€IÜNÂ{¾} |½I/”<‘F’Žc‚njҜ-¾.(©Ïf¼!Liz·Ì@hNß`úE$„ú¼á€ñ6cÓ–¾}Ž®o¿|7WóÒ{ Ø7? 4FÁ Іahª÷Æq].nЃñ:Ñs‘¦ب ŠY|%øØwÉ8}t{c 2†k×™F@à½ÕØ©aÓád!@ûú†ÆNÊi Æhz” ‘ä%-#RÓªprÜ ‹CÛÊáÊ÷)K^ŠC»S|RŽ4ýìX…OÊ‘´xì'J·>5`€OÊÐ)8Ý1¬»Æïap VoKN´v‡oˆ‡'2(˜#OYc 3*%]£¢”pñ¦Ù`&£‹E2¢Ða¸xo˜áI9ª :˜àÉŒŒÌæh2Ìi) ñ:€ñ!&†:P²îÓE…UQì <ku´(XÌ+XýzÜ&œ±­èÒ1¶Ú‘|Gò«'5Ö•ýŸ;ìè¿£ÿ‚É#ê ÜéúÁûLØËR'·â]ÉžºˆQDæ0ƬæÕ°`èh'[>?°écʨbJV¥DyØ$&®ß&™ÑÇÐKõ__Ž‘4žo^° EÔøh‰®¥„Þ+"=BDJ·d мëi³ãíUrÎ:£"šÉN=Ño¤Ò;¢c¥ª¼Ìuþàhí*‚í7RØtËÔÍ5ÆØbIŸHÏú”Ñ=„Æe•'àœ÷ÞˆÊáL-±$ù^žÂZEÙÒW¥#[23‹-W…oo|…€wF¦áÏáû€5Rœ>0ýõõ©ÃùUóôOA ~u¹Yns0Ã1æ:'ô¦9žAv(_Z¤R½iŽÍ< ôÕXw¶=¶.·É¡y2ÞgYmïØïSub}lÆKp9ÌÜ{:ø~g4l[{´EyÓÀur²Í­6bÔõoÞÃÏN<|æ„Ñw&¶7÷Ä sL„NûÎtc”³O{;@Ö~¶µ¹¤l_:SnÛ` ·]¶1”¦ÞçsïÁ7øâ5ÜÛÔùy†æðjøÖ}eá¿ |ãTO<³ ^Ÿµ' õw"¸Ùu÷ã )D¸ë6ÍŸ$%ÂáÓÓÿãW6à endstream endobj 1942 0 obj 5346 endobj 1946 0 obj [47 /XYZ 40.7999999 715.219999 0] endobj 1947 0 obj [47 /XYZ 40.7999999 715.219999 0] endobj 1948 0 obj [47 /XYZ 40.7999999 515.539999 0] endobj 1949 0 obj [47 /XYZ 40.7999999 515.539999 0] endobj 1950 0 obj << /Type /Annot /Subtype /Link /Rect [354.719999 525.139999 409.439999 532.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 1945 0 obj << /Type /Page /Parent 2 0 R /Contents 1951 0 R /Resources 1953 0 R /Annots 1954 0 R /MediaBox [0 0 595 842] >> endobj 1953 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1954 0 obj [ 1950 0 R ] endobj 1951 0 obj << /Length 1952 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•EJÔX°ç ‡È!È!ðf,Ö‹Lö¿©¥î‰úø()©­1ì7GY,ëñ±êß>ÿãü¯ßÏ>ÿçüuüþðù”gy•_çþÏï?MVÈáǺQ™lû¯ó×o§×óëéåôÒýûzÕåÁñ[×x}ÅÐáï_;}^~>ùüð—î§ÿåùÏÝÿ~9ÿíïÝ·ŸÆþú_øvjÚªÿá×á!…lºÿ¼ÿ©oü÷é¯8ÿÖ ¡¹ôÛÿûƒªó¼JÈ0^oŠËŸ÷‚wuôRɳ²¤ê>üï?O?w}Ý‘µ¥uUÖ¹kŸµì;mªs[w•Ö£6-—~DX7E“stÓF„ÌIäemê‡Hí²..ÓSuØü®ý’IÉ–£›~4"dN#µa?YS¢¨¥*{Ê÷TWM#»ŸëbürŸrÛ°ðûµŸ@ÒU­dYÈn4üû!ò{›×,ü~í'LmŲmúÑpð;ì‡ße.ÊaÊm4鷎º‘9Ç\F#‚&5¬¡#ËKyÍu(¥Xd¼,K–näE6‡Lj$8ëËN„]&Ý=F½kGaÝT’C~]F#‚&5.îˆqªz<"Ë0éÿÖQX7d‘`ýhDФÆEÐ:zá°4䛥ñjxðÓ—Ó‡ç¶7ª¾üÜâb™ ß¾|;•Ý:å·ê:ÿØYgõÏ_~¹Œmü šP^>(³²¨Õhë-CËí!/ÔYÞ¿ûÖ2ïUûÀ£3}ÌógsølQÎÒÎ?¨á|l)àXñ3îtňùtÖóéòêÌó¦3<ß¿S\<çÂÊgkgâòב8Ì?#ŸæïÃcÅdl.-U&Ec#ãœX²‚½º/ÔxÀ¶°O_: GàÝq3•8p¯àg`LlØRsRj´Å½ZÙ[~¸Kdª¬ú§IëbqŒËÿ®W¸8z¯%0ÑBæ¹:»xˆcNDn•ÜkK}팶oƒ€W ¸¬ò’r{¬'á òÙÃvÊ}¬XDx޾~O—ºi¦§‹Ï îA¸{ ¯)–óqÒ­€Ô¥gàLI4€3•øü¼Ú˜¢°¥€4ÀÔ)ášâ–οg¦^-¸7)jàD̘¯ñ|6¼K £Æü†yÓ¾gý½€©3>“äøèÚïóø0þ2«Õ¬E Â3-|¦EÏŒ‚JY=˜÷s>n²RÎZÆ5¬²âb³êVëÒÎy¦*¹´î*“ÕÐôÖ"Ð{Šè™7!:”pð=¢ðÏ(D—Þ©ƒi€WÎÐÛ\¹gÿõ÷²PÙà¢pâLLë–k_šc”¥*¦2¢Éš6_¤z7çÑ…2ß/KŽÁ#–¼<îaÍ{ëàíñpɲ8$µ÷Awö¢Ü[°#‚lpÁi!]mh߬æåXƒÚ Ñ]›î¡zÝŸ¬ì&Xªá„!-Òü5ö0?~oqݹ˜ [Üâ>rð¨cæÿ4Íü½e e–‡Á5Âß>XØ}ù”ÌhPù-¨L0 °­d°e¡wÀàäÁö"öB`Å¿4Væ± Œ`êHìª&¸·wJìñ!Ð Ç hÌ×”½G‰G G=$öVb~ƒ4À¾º"‘š¬*•—MÂ~0 :(Ø |Ù¡>k:ˆÃC¥¨É‚á=,hƒÄauM+ŠÞ ,Ñ‚'Û‘SRj*ªïÝÌ¥ÌχWµ-¨É< ||i¼ªY³t« èöʧü›ÎQ°§¶~ö-„WØ}Z‡w H!K¢ŠF”öMYO¥½ád³ƒ€±EÄ)Bî§±Ý/äÔÉJ0\—’üæt¨µHðîs³A,viÝXÙ_ç ÈXÄc{Ã]ƒIèŬ qe ì,•GÒà!žìYƒ¼Ã0£^ð{°‡•‚¿¢´ ˜ýDR<¬†Þ0WAÿ&öʸ—À£=HUéĆºMî›Â%EQÛÌð.ƒàÕÆÛ9Ñš’‚9”0 ]a¬åï3†N8Š{Ïá*f·ÌÍeøDÏ ¦Dñ•\ÐÀa‹4ˆA©¦ø•¬’OÊž”@û ¯¾GÜ+QºÈvÔŽÝüw‹5Cžµ˜‚»’SÉ}ðÁú|àƒbõ2Ü?Øs¶’?ÎÀ›A øÌÒ‡ÜNÙ«†a¹‘ï'‘¶Å§äCÁÚÞ’7âñÒŠvz¼ðb…ùr* GÍhØÜ®¶‡%>û´||, Œg´f#€-fºz:!°Fr< K’÷¹ßÑ·?6”!V fQ_(©ôX–Ø}™XÒf9D\)%Þ!1r+<"HŒ#\Ë+*¦¥$›©ä<,%Q³!ØábS¬ÖW¦Ø6x“¥îA|~QüN˸WÄ|¢2=#_ã¼ÆygªÑZ©L|RˆØ\$ÿ/‡ýAQºñ.°Þdô¹±%;±¬ÅTÆsß8 */Þ‘†r*PCÔà]pwØl„Árè8Hv–Üzk¹ó”S³2aÔ”õÁUÃS…qoªJ·Í*a=5±Â„•Ã’à ˆ7E1ÃÏJ2êà±a"Ý(f,\mlÂQèf8±èÄ«@™)¦žÖ„°ç¿‡²ú{¢Œ ‰Pmì穵%6 CÊâjûó” åȉHº¸éÉŠ”Ø45D€¥u¿þÄ®Ùpj†Õê÷i”f¹-ªES†^e6ü"H:dÆÖ1œ´Þ9; –  v蕦SÆWÕTÈ8‡8±À1yˆiaÛ»%sg¸Õ¡j—åö}MÕ!v ¨‡¬Å¤à¨ãà€—ð€Rt‘4"ÊÊ–QAõô<ؕȉ›µÅÁ`€¯%*rj5â”JÚDzù„Þ÷šU‚Ñ»,' ¤×À„ŒY¨bV±i«éft%˜|Iج*Ní†ÚSPÊÐ…ÙîgXÝ…×q”%õò@\‡µªš©4(`dÖbÁÁ ìŽ'„ ؤnXƒE•3]†Wj¶jÕ1™«ôý ÌŽ÷uí/!â½È«é@—¶8!6 l â¸Haºj5V-“*½¢,ëPcŒY“¤³„Þx«g®‘Í É„œ/ ]‰‹È@¢l§Ã\‰ZªžQ‹~~ǤVS¹Q‹µ B\ÒK)f¤§Ÿ1¡'j¾ŸBpvî°p,~˜¼™RcWˆÌ=•‹r?µv‰x:ʬ°”Y9.Èl炌Äçsg•®éÆ,Í"fê3úÕãv‡GJñ}ÂõÒƒIw˜W㟄ð&%›ë@LvG&;#E7žÉNÝrÓ–érV¨[†Ócÿûç2^_rÂýs˾jHò•ngU9V£ûŸ{Hù„[]®ÇðäQÁ¶¡ÕíAJBг5½×î4Ô\YöË>>űãbæÌXÊýç8¾…]ßàßw*–2Ðá¦]:îÖ(ô£fÒžeO:ˆ6Šìñöb7‰¬¼äã€d©j‹ùžPžd•o"»Hö$J’Ú\@:S-®ÀTr²J.©ŒÐt&`]܆s8Šüȳ;ŠÜÎÁ$Û¹l­9Š˜¤ÿQ À¸wR  ûs~íöS·Wú_¿}ýfØ`úÎÌßvæ‹qoµnê¦:‹nKÀ§VTCRÚsqóŽ×á«*«–¹m™izáp®É:«—}ŠõB˰ÔE‘Év1¢RY5è™o-5|OŸiá3Ãæ©e&ó¢ošŸ¹K½ bâý'ðwGƒla†Ïè™ÑZjh£Òï÷̸b>sÇvÙ\×ÿ,•¸†ÖFQéµÚs\í¢Fœˆ©4 Þ¥÷à|„| Ç&žÑžÃ½áU×y”Äz/ð£á²Ð îŸ4&LõÞlšJ ã™1)d8ñ®˜á ç‰p~9ý°f€0 endstream endobj 1952 0 obj 4413 endobj 1956 0 obj [48 /XYZ 32.1599999 308.179999 0] endobj 1957 0 obj [48 /XYZ 33.1199999 306.259999 0] endobj 1958 0 obj << /Type /Annot /Subtype /Link /Rect [305.759999 327.379999 362.399999 335.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 1955 0 obj << /Type /Page /Parent 2 0 R /Contents 1959 0 R /Resources 1961 0 R /Annots 1962 0 R /MediaBox [0 0 595 842] >> endobj 1961 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1962 0 obj [ 1958 0 R ] endobj 1959 0 obj << /Length 1960 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘ÅEâîv€4Ü@A'“`0¤3‡üý¨JªEd}ù¸HU-p—[%.ï=¾oùô§¯ÿØÿë·ý§§¯ÿÙ>}ÝÕU­êáÏþð÷‡ë_p] >|luSñîðgÿíûî}ÿ¾{ݽöÿ¾ï˜:¾8þ螦üíÛ¯»OÃä»á7_ŸþÒúßžïÿÜÿïçýßþÞÿøqïð…ï;ݩÇ_†Œ3®ûÿ\:<ü÷ÛÿÚ/AÇ=üûC£9“2jïçWÙñïõ«`®>¼UzÏïÙô°øï?w?õcQi)˜hy#ûÏ’mÝhÍûÏ­ÿøÌÓò~"Õê}ת=“­5µW¯â†Ñ\¦æ°µ)V÷/»ª:ÉX{¾/b‡ ö›;l×]$¤Æâ %jàú8D̦F€ãÒQ½`M3lº«ã w(n!S ḵ© ŽhT/¤¹CÃã¶x(nźÃVâ65Ti5þŸ=¦Ñým×ï·ŸocV;1B‘É88žŠFÖ=ü`õ°µ©«x À%«Åqƒ"’oЏìRü¸µ©àö@¯):~QèÞ/~~Û}ú¤Ðõõí§~!GxøñÖoµÙÿÐkv½Èzûqÿûº–òû·Ÿw]Õt¢myxÂÿˆžÔ=a >éàhO„'Ÿ ïÀ2øÏ#àN ‡ÇÐá„UãÑtøh ¾ãÀaÕ¼À'_Oàh§x4ŒS ½5-|Ò5ƒXÀO8<Áb¿ã8õxÛx§¾Cž¯ ŸLñ‹ÏSj#õ¾¼õ/³Ó5;d·³O,´«”õq•½3m¦M%¸f¼¹^‹BOFQ&/_¸¾|C¿`µù kŒa!ŒUM¯î÷`¹¼;൭j ã­9êÀÀd%‡o:Öìøª¹xë]6 ‰ñÓËkåÏæ¨x[Ö|þ_ÅX³Q`AOÀi0°0Zóùïs<õÚ$pE¬…O0Ú^̉á i:lTUœé9T›K³!ÑÆ#pa%H7„b\À'6.ðá’ìsøG(§ÀhõTb°c6ÏI“³Ia‘"“rî<˜°5/fI<"€ÍšWSšM ^@«”eè°ÿà iay:ýŲci#Ö¡³bÎ5+—C"á±ùž7·Ò#Ç, ¡i>‡²ÞÈvÊT¶k˜ÞfÕˆ)Øçµšñò5'’%i5åÅV[‘©hÒÙS›;%d6C3“&…ëß1ÔßÖPRqÞ!iá—~¨àl³µí$B™ûþ.CŠIàäL ¦OÉ5S‚"3¶dŽ3&Šu‘ ¤È™¤ˆiÃEE §ìp0xÝžÀËËMÊÕv·Óx½Ÿ¤{÷{å醀ÃôQðœ*Yøœ–Š /v ÒŽ>Eeä䢿¥)¤PlïRˆà¬ wq_õÓžf|ò··(cI Ì‘JØšJàÙÙ.E] IÒ™¢¾UTe³,á§÷}ßéáŽ[*>¾LQyt’Ê)2T3•LYGSHLÊÐpÝÑ0ed-ÞŒŒTÐ´ÒØtŠT’L•2l=MàÁ³ï`–Ï8"äÆãb¦ Ù¢nÿ4ÓÆ1ž½½I›žARIÌÊymb´ÂoMÀGbÂiÖVTUR0ìК¬ðˆ€ÐŠ×úÏu~3¾+ý¢¬ñÎ@@!×i:‡"-Ö¶Ó­ÚFvj–ü\Ys Q]é®6´tƒû\Œ÷8>Ñ!)ž–Rfe2aÞÀ›Ç—`± ÿ n»+EIÝIâ7I!7zŒî—"±ÐC»Ï›eÛ*”ó»üK¬®TËÒé¼iÛw‘#MÑÖÞܵ† )|i@j4 Âl³˜$ZvšØÿ¤×&I²brP â&@fÍûd 5©˜Üå¼>²,\ÂýâR‘Á+ ]5+ל²òÞ`O…ýºõÌ{œHd–³þE~Sž.ïû:µt@{fÏ¿­KXyvwÀ‚ŒÒ`+‰c÷Á [|tÿ àí”ÝHx©+aàœÌîx2– t£ÌÐRrº \PžãšÑÉJChuÂZwÔm, vÙ“€Ni z™½lŒlÌóT.{©9w|Þº&ÔëɃõÖ5a]DÃÏh|Ì’¨A·y”® Ž yBÂ~‚Š#ÍŠ‚9LÊsIAA£­¼ D#Îžë­ „c?[ö\šÒýñ¶.÷L.m[š\¶.wL.Ý)E|+?´†.ª1fô*¥²Âè‚ÕW`‰HÊr¨ RHk<8޿רçð˜ÆCNçb-§è]¬Ì:>^)nrçøß&"ÓÒå¤ aÉLÀ¦1h4"1M$Ã=Ýz¤mùK÷MrzKNÅYVÉIñùâw°Â}g­åŠ,ÑR  ÔÌ¥$ á3 äëm#CêŠC‘JsÆ@Öf¦¼zxí Ãô£i ™’*)9î)2Ogu°üÞ uŽÔü¨:]vª6ÏꈄQ»7*ú%‰8Ê’Wì‘OaÙþ°±s>æëq·Z}Ú´Ëf´”¿€yËoÇ„@zD»dkD¤‹`Þâ8@ât–-ãr>´p²pÖ69eõUõ“10Øúê‰äöRFÄ¿ó<…»?e2²cr<„DñõQÒ‚c*`JMQp‡äHÒh2»Ü醡Wrów‚Õ;Ëö˜ù.m6gÞ„á,_.‘ßò<×-&¹·ü]F韤ëÄ`ÃðèŽJɺ  Ð2|0S9³˜"/xŸ¦6+HÒ8­á“$cœ7þjz-Ì™¸9ƒ ”7˱ Íd‰§(#àŸ¥ÊXQšŠR¹l.‘Ô îуCÏ·LùÅ㩹>lr,†ßx'æžšVOÏ“£óqÑ$×xöèþÀ3KPÈFÖ0q@¯Žïß©N]ÿâ—ÝWÓÌÃmK˜PG~ßÖƒO¤PŒ)dÔõ;ó7¥(ƧÐý8¦¸cˆÝ›¢XöÒž Ÿ¿…ýùæK6ßÚd%¦4qRA~9ø†ÒRê¾=ýKñû,þ9ÌË«a/N³.—6PÌŸ‚ñ¾îÛˆL†£÷\Þä(ÇâVŸò(¹ŠI¼êAû+ñ•Ñ€e¢rêV[uÚ|2`êPûV­ÞËhÏh´¾ƒçÁ£9VðÎsŠ…¶±je¤¢+¸4rk)/pˬñ~ððbäj£¹|5üç€EJÔÂÃÎÏsçAq/M”$šï‚pr¼tÄkÀZCT]K+ª„mÌUÄb~Ý2)cº ~bJ¦TÚOXÂaoŽö¨˜0ªƒËØg6ÓS™‘6£, Îãb y-€¦¥¤¶4)J>Lá€-Ð×Se#KcÚšˆØ‚( [j¾Cvzø[ '§ò53 Ÿ„0º·(gH3 ‚ûÖuÓ¶í,Jèÿ.â0ù FÙÍ#}5\©\+­OX•»s!D„éÍ«5K]NdŠ…ógI²ØHñÙIûQDØÆ!MèÕÞ˜¿ ˆdÈjDxOSˆ1¿íʃQS4“¤×Å[8Rv@dI@‰Oë7Š8‹‘»´e&U²#G“-›±_®çbêçE…xxt¡TK[8®»Fç]Ás–Xv›¶3›˜”¯àŸ…!"#p±6ß)/­>ºfåÃzJQº„l…`‚ûÑà ˆÂJ‘l²Òýðæu~᤺ÆNÉ)ò€ÓºÇJ&NzïSSXµúˆ•k¼øN µG³T¸G;ºÍŒ(fFp™Ã'K0ø„`9”3q$kšÇxÂÁpt—Çóà.ÂxÕIÌñÄï`Ô—3dX+“2ó“vF¥úMè•zX€mBozkzøì‰3>úM¦‡ØKXNòK®râŸûÛnâ° 8ľçMnâp‡göti¼‰ÃrâÐëš«ÿ»ïqÌÔgão߃z\µ9xuÒ‹óÕùʬjÏúmÜjÓ15T´Ý‹údŽ! JUê¶;¿“Õ™«'GåmÕÞîªÚÞx2ø”…¨xgÜNŒÞí¦Rƒúò¤…óhøNߤJË+ÞѤëg8Ú@RvñØ[ßCnìð zgôßßzÂÐ>Æ[ްwFŒ…ì}\ÛñDPÝá3oØ© ð¨{aÛñÆ6¤k”ž!b¬[‚ÇÇ£8fÆ´cÓ&„†ƒf0¾ Žwˆç¡Ó&†J,Õj­Ø°;ƒ|!³º.»ôšRVì_wÿew= endstream endobj 1960 0 obj 4233 endobj 1964 0 obj [49 /XYZ 40.7999999 466.579999 0] endobj 1965 0 obj [49 /XYZ 40.7999999 466.579999 0] endobj 1966 0 obj [49 /XYZ 40.7999999 184.340000 0] endobj 1967 0 obj [49 /XYZ 40.7999999 184.340000 0] endobj 1963 0 obj << /Type /Page /Parent 2 0 R /Contents 1968 0 R /Resources 1970 0 R /Annots 1971 0 R /MediaBox [0 0 595 842] >> endobj 1970 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1971 0 obj [ ] endobj 1968 0 obj << /Length 1969 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e‘E XÏ#@ CCàÝM°ˆ™ì!?ê–ú%ê£TÅG³Ûò3íá°X,‹Åzñ㟾ü£øçïÅǧ/ÿ)¾Ž?Ÿ¾ìª²jªá_±ÿúpù Ù–JM«KÙíÿ_¿íÞ‹÷ÝçÝçþûûN4‡Žã¾ñ8Äð÷¯¿í>ƒï†ß|yúKÿé…,þÜÿï×âoïü4ÂÛÿÁ·]Û5ûÿ>)dÛÿçòÓ¾ñ_»¿þ¡ø­G¡=ÀÝÿ »Zé…Æû©«8|]vcõô©e[BÈIÝÓâ¿?ï~éa(»ZÓÔ¦Z ³ÿnjQ©¢3M¡ºÊiÍk á¦îd0{l„פDU' &Áu=ÒIK¿)žùiº:˜=6ÂkR#Á1 &Á{a~䦗8!Àì± Bp ˆGp]É‘1Eí5Å3 ?0B… øá5©à@L‚Ëj˜`§ýfx„ãI(ÕŸæÀì±>sÉ á0©­´ÃÞ'@~`ê&„?`„½1 &Á›º&h<§xä¦AÀì±^“ núBc•gõÝÑñÓÛî㫨U»×Ïß~é9(ù÷~ªºøÐ«®][¼ýTü±ªÔóÅÛ¯»—·Ëȃ*aŽƒ¶‡A»Rwª—¿‡›ÈÐR}‚-j¶Ô°å¶4¨EB *ɘÏĶH<ا‚´Æ3ÅóQŠ>Žƒ:x¦nœU¸S>€XKÈñxç£lyaP”^mŒuõJ_9ŒµC"A` ð|0n Scý)ðî•öÅ¥‡-aÙRb±û0°– ’#ué˜B먦ÞÔ?5âÇMØÔˆMØÔˆôjD§î[À¢sS#¸LQ ™^¨•ØÔ?5‹õMØÔˆMØÔˆhÂ[¯XúœÕ+ojÄS4]p5¢#ÖÕ~D-Úl5è…ºT²R_’s@íTÄÖgâ kÊ µÅ¿¨ô¬¬‡®ãÖ°÷±ÀO‘¯Õyk6ÕÀômÙvUsM‰„>NôÜ‚©7°œ¥®›¶ïäX!2޼>“¶8‹û û°)¥hgÜڱĪlм,UMYÊ08ˆ@ûE–rÐ#WÔšŸ5 ÞBsÐúÝlÍÜ^jfx2Æ”Øj"²»Çš¼Å³jxˆ]‚üÀÃà Û@,–QÄœIØ" IG‚:VkýÌ—78e«/d5é±8Œ8'!\aÎiæØ‡xQ>-©0µ*ŒÇÁ€1/[íŠ ‹A»òHósK·þ`‡àë—dÚº6G‡òf«qÎ4‘­Fp,sضq˘nØž˜¹=Dwz™aƒ¶8˜aÈÅ›Ö1fX¼$psfKÎvæ0¬c> k‘£…!¢ñÊI û0¬lŽÃâæ°æá½€miØ:¹¹;ÒX†à–t¶ÎFœ‚ Ò¹Lu¼;gà2Å}‚:i|ýÝ(?›tÉáDìLÍ[¡m´\^à°-œeÄ"/ Þf‰8å1eNA6‰\rFêkBÏ¹Ž°5u½ñKL6‘ìsW‚E›‚¦­1Àm†jã ÎÙç–¦ñö¶ÊŠŠÁ,ËØRȰ!:V·xØÃW±ì<&8Ïìíf±òË䵤ó)‹zëÝ£>¶æG‘ÐŽL±ÿÃ?u˜©Û·È×y"ÅÙ}e€`­$ÁÖüÅD-éÚc«[â×"tÐDUJ²ðòñ,ö§¿tsÒHüj]s4ìœ-jUUÍa[—£’s±i}İOûÔÇØqÅçè¶)´Ñ<-ªRT@ëNÕ–õ¸÷Ïã¼0ú˜Q¨ ­›DX:Ñ Üð8ÝȬjª2mëñ&83Óêbûàq04x‚Y9ouý§7K¼‡'—­P[ÎlK&N0|ìÒe£¸WCK±f„=P®é7r ÞEš¿µlŒO*ÄÄE=ǽ–U5$оèž!(¹>t]î{:¦g}Š`£‰÷ºÂ[ûo/F2CÓ…èJ7× LrÆU8_[®Vu|ÎÊTË8+#]®ŒWRì]VŽÃa,—Ü,h°OºŒ]u“Ä9Säì{JtãÍÉ\ïÝyù&ô%hËóAMœ„¸ÚŒ‹¬9Œ Œ”û~ˆµ‹—äÖÞ8ñÉëqeÑ3¨ã32NõàßàbJnÝ]‹nÝAÕÿ ƒ°”[oèqxµ£Vß{”Š’[R\ÆIq7O ¤‘Ìš¬²è;]£L£¯õž Ç‰-+rÊ@kõD'8úð :Ö6l¹FÂV Rµð{S)ÙUþJ`Ü;ûxãlõ5Â9Ûð"n|Q™ 9BD”…q3vÙÍü”]t¹¦,Áî¾÷PÄÝr°¢]°`.VèˆûN)µ°ïú—¥086Õz¦[q™ ê5 áz§„ù¶é'>NºñV¾8‡òÅZªîÑ;såìÉœe‹S-ƒf»eMÑ­ÞÜÂvÖíò–y°bÈ<ƒ•A:-ÍÑŽ’¨FV§§'ñ½&Œ… Z.ßxîʨD°ÂDv§1Ôy%„ahÅ›EUþæ–Ákª­¯é‘³áë{^cN¸½Ò|§´N§üÕ•Ï£ä÷yÿÛ—˜BN%˜ëuª@Áúô(Í=ÇAÅå5QÉkReÃ81ýXÍ”?â¤I§Ñw)¹%œ¨ ™¿þ1}±ýJí5KlªV®Þ°½¶4·{£i&C†(›º€D˜•», ‰4õ†ÚÎrF¢%«°9ï/Pa¸YyA ½¯È fœlöÚsJí,ºCƒØX)50[r k…ug' a]O­½À3<³™ªô‰êóSœùÛ³ÓË ¹ôT¤8ÍÄO"¬8Àƒi¤‹¢úô*b6Šøf_~ˆKBÏ –]ŽfÌÉž¼¹˜¼í®³dKœÐáŒô³¹ÜE:poÜìSVÆq “Umºë]ñ=˜nµ2“ƒ6n&'ù±âŒo´ó#òPÓL7Îú’™^–B_\J8ìâFP´ç"´aucJ±2ÆuÈVòÏ+Q¥S­OF$«tú ûàŠƒøª4“ —c(è\½L\M×å„}XµobªørmÛ6b˜Ýjöm/Ï‹€gEñy÷¨,KÏ endstream endobj 1969 0 obj 3409 endobj 1973 0 obj [50 /XYZ 40.7999999 583.699999 0] endobj 1974 0 obj [50 /XYZ 40.7999999 583.699999 0] endobj 1975 0 obj [50 /XYZ 40.7999999 478.099999 0] endobj 1976 0 obj [50 /XYZ 40.7999999 478.099999 0] endobj 1977 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 327.379999 104.159999 335.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 1972 0 obj << /Type /Page /Parent 2 0 R /Contents 1978 0 R /Resources 1980 0 R /Annots 1981 0 R /MediaBox [0 0 595 842] >> endobj 1980 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 1981 0 obj [ 1977 0 R ] endobj 1978 0 obj << /Length 1979 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯èskÅ·< C€Áƒ‘C°Ž^#ò÷£n©û£Äb‘­žé]`§§¹¢ŠUŪb½øé/_þ¹ýåí§Ç/ÿÙ~~>~ÙÔUmëþÏv÷÷»ó/dS)Ùt©d»û³ýúmó¶}Û¼l^ºß6Âî~tƒ‡Wôþñõ÷ͧþå›þ›/ë>ýo+·í~ûuûã?º? óíþ÷MÓÚ݇ßúB Ùt¿œÚ þ{ó÷?mï@höóîþýÎÖV×i`¼û¿ç‚wuø1M÷QÙýc:\ü÷_›Ÿ»¹Ž@T­ÂYíê¥s:ÙMju³mÝ '¼)½u-š(mšF°L³ƒF$-JÔÚ'""¼±í~²›> SÃDi˜²BºuЈ¤E ÇU•N›ºmà祋VJìmÒhpœ'‘ªq,Ó¨#&¬©'ž‡ÆòÖÝ/¯­Óxœ(mW+ŽivЈ¤E øÆîܰ@#1åX0ÕJºuЈ¤E ÇÞ¶ý¯—ãÕr ÊÕ<ªaHYÓ€n8 Ûng1`û8O"¶EË¡A÷Ð0`Û›ç…Ã~•'ûõ-ðàÃëæÓçvgª¿þܱ·÷û¯ß6ºû¥ÓïºÝ¾þ´ýs]+ûýöõ×M[uÐJ³?ô#ÒíGšãµÙ¡+­œŽÃH³±•Í~è4òØ?súâyÿ…鎽¯–ûWÕ­šL§õFá ŒšzŒ[Þ³ÓÓY¥…ø´‹qÀÚtùÃþ !*£í]Ü=‡,1 #Ö ŒLqàéåäòXÙç(¼>ÌÛ˜(Þ*¼÷-ߺÇÀók'èÒä–Ъ¢Ë™èjkyÀe;ˆ.ãáCÀ‘g8òˆFn½02lÜ #ÊÀ÷<Ä [CXéœÍÆCPÿ?Û°/áMÂ(¦x6Wª '*†M=”ÛfRÌ‚ƒG›‰À˜°1èee1 a“)JmgÕ–c$}|éS¹—ºæ®$Ö¤$ðn¼+‰’€ô À¶bŽÇ°­]¶.EÂe óaöçe¾U+0]Šô¶Þ ’IO¡Ø;X*c$Þ) wÊÙH¶Ó[)ÒåÃ+ r ±@‘£kV¡E‰q€ú3a†°âÇBs¤6Æ5†:Ào ï`ÊÌР]‡à2:Ep±8°i1± óꮹOë`X§Rö&ÝZˆa 2R{C𹵂1[+ôá2¸Ü/‘ÑÀ”p$GàW>Og…A9 8k¬ a;á= _ƒI ŽOb#P_Œ§÷¢Çýîò°äÀû`Œ8‚²˜¦÷¾ÏSêxÀ{ÁUo;DÄà17zl™@@Yf‹ãUµÓ×x_àü¼^Í&ñD–8·VSò=f—õÆL„}–´‘áÛTM[Ó~_¥0‡YN#Pí Æ¥¤/Sài@¶Qû9ÎÈŽ fMøL„º l’廯+FóNw¸·Ó(¨ˆØÙ>¬”]:/É"ˆãÉ)OÆaE˜"¨±¨™"-FÿÍ'MElwÌÈpƒÚ~‹„AyJ˜[óî›3é2êV‹‰Þá`b‰x[QäsB6d¦¤=<+ 7³åÙÍœ5íѯçá`¤L›§³„gÐÓÒKÔ#´|<ÄXÈ«\r*y½0B4cJüRÐ%‰ýî†-¾Œ8I7^€O ïx!MSÎCÖÃr'D»-ã -À|ÒL˜/à–ÅŽa››Åd3Çb1æ'0{óbZM·¹€Ñ¦ ¡?ì¶Ù馜¥ÓR_sƒg¬Û£„Å\ŒpŒòº8"`ô]‡î?޲¡õxûølÄNfµÅî~÷Ju´LŽVFÝÿ™§+g&#”gj Ÿiá{ûUU®ßÙ'<õ#M¥åò‰ 8Å:—Ã6°³0U3u©}FàgDÏ3¢®ú:Ç%³VÊi Ÿ4¤;d† ±ÍK' ,ò±ÐÂÁ7OTDØx/H’hšLä*‡¿!0IDQi?×Ýé8ñêN#±ø5X£àâÙB„2Ì?¥Ð)(àq÷!ZoeaØù}O)5&+éቜzÀб" °N@„N7ÚβÈ&öl+ˆcß·ž]È¢¼ßáSB”W{‚ƒà^ÿÆþÙÍ’›CRt,z4¡ÁÊÜàH54}*âI5øæïò¼5_yCuIöÒ­T0Ö(ÆnÄî!xeH®¤1=0âóŸš[••SHgG޳xaCÿj–ÏuÑÔÛ6«²k ©&{äÚ37™§•'å iáv˜¤Kè}©–ü>RLð±™?éÃó| uXðÑ32Jn+ÅĺÁÀP>½fŠ¥ñó$žpd°ž¡hÀô—øÉ2E{"Ôgtâd”Ø-cé-±SIŠ&B¦úsRŽ’?]Àqbf-o(a#ÆG³„•³Ì¼*—–Õc°ßi{ÛrýR­:¦rºP1Rçpõ:®x‡uà8{7nφ›DzpàÑáFÜ‘€·ë ¦6…C` ÊJ5îßBÁ\…»Öºè8>ƒ{/v†φ÷¡÷O Ïa¥Ì=8p#ܪsîÙ‡w ÄÛÀ‰ÙM-š)=¼–ÿ \f”€öc+2BÛæ5à3Åšî¶~[Áyù† @?^aöŠSÛX®CY¥£Q7b¬2"úßàÆ,Á:y*QÚ²DxxGT^%‘†qeÞ "ØŸ9O?‚äöf]¢¡l³§d ßm›²unD›´BµILtPvGI"ѰP%™6‡Þó¥*ÉN½gpµÖ@¿¾j ”­†ÎHg#°¾jð›\ªÖÂ5Yð=x¶¸Æ â@<Ã÷Àʸvà3÷š¹ §£ÕcÞ¿äÍ'd “ôtJ¥*kI.!—0²}·5WëI‰Ì’ÄEé̳À¤öbs¼MƒÞY­cá’Œ,Í#rJuéÆbå˜àÖÄ8¿C1KÍð{•·sÖv@]éø¡ª½0¬jzR (l|X‰è¥;×&¬D:Ñn NTpßÄ:þP®Õb¾‚pJ ٢Еk¸kÍ›rás– Î YÃu¦9¶ÁÉ …x§à²­T³”» ¡rBH`Fb½« ²ZÎ/ûúBß_Tp7Ú”«¢K)0¼&a=g¤Æy‘„̿۔|·™¸¾Ø”ÍqÙÛ…WåðI˰kÚ©I2vîš·» ÷6¼…Y*ß(…íÊÚ(%­yИR ¾¼J%%‰¥aŒÃ}½f®rg“ ÷ù¾ ¥rÖÞÚ(`%ÑŽ±ªpíå~Iì9 ÜËI¹GYQ .Pdn&–Ê|A5¥=oA5޽F„_ò”Ÿ—é¥qç"É@aÁÚ]qçï gåDqô±® u@ò‰¾IcN8Ç40Ûw;?‰âƒÈïΕãÐ!aiuÈ|'lÄI‘ÒhÓ‹¸j %sYž6Ç9÷‹÷÷ß,Ú6"úxnTNV9nû~1À_ŸàïÀØA¡÷)Ûo§Îÿmó%Óò/ÿø§+/Yp5GdÎ$£yÊŒ)±»¾©™’Kì<¢^ô·¨6“*(pQh¦Y7Õ˜ã|u­¶¦·àîò¬tRŽ>`ýëRæww Ë•«Ì>4b"e)ÆÉÌ»Ö98"‡ü–\ÎyvéŠá¿réM}ÈÝ*×Äšy³R]ð3¸kåJB…3š eæ`*à˜¶¢d‹”Ëj¤™‡¹M «K:p')„Úà|"uàâ]ضj6§õ1²ðTî¥ö`GÜÿ˜Ú8U‰ÒVlÍ’r£î{¸mÕÕÓéë¡„µp{, ÛÍ*–&%µ´” ž’¨ºfv)§rÚú*˧rÂ.íÖ˜)ã°zøxo£‹ñÖ%ÜïÄrïóÕ{Ge¾<‚cDÀšç"²å=Ÿ}'Žp¸ yïì‰h#’‘àçö]3 é ”tƒùÖÝ+K“™gv,ä}žk‰ÃŽ.t‰ÈjˆHW 8p=Ï'kש„¼”ÛŠ¹±b­p—‰˜ 1÷”ŠÞÛx”í:³ [íÆšâ&úÌW ,·ê“<‚Q²˜<ÓÅSÞ¶ª³Û ýYЯü£´dä/hÅšbX^Ý*($˜—§K‚ŽÞ!#BßD›ny½+RÙ1ƒnÁÿuîm(­ƒÉk_·^C¶nBºk=# ”´Ñ4˜ZZÆK>R:ǵ“«3»´Ê%&¸àt¶Ìñ)æŠvµ¶³àðFf%oþ(\©Æ¡Ã2¥áNÔ{ø÷³Pn1\~6enOÏyÖ_‘oÕíá¯Üà ¥#y„©ÎißöMâ„Æ¿¤”¾å\ˆëkxr±SQ%3γÉên™)à©×v,å?œ7‘r1 )Ù?â2Vw4E{ξ&âRîL7Gä­¨ ÊQ »amKJCŒkŒY–¥ŠF=W™"Ïj’.oÈ!Œ ‰Å´Ü󣉅;$æ1gQâc4>ø¾·ÌØ›,Ÿ /P²vIމ ˆÃ. )혤û׊_¹˜Gn'44‹ðñ¯,/) R…ðÈ]ž÷lÖ“lÍwå¤ Øv™³aSêú)°4ÅLïšWHh%ÆÜš`xåTwSY–)7Œ’P‘’jq»Áf£ù‡r„ÉÙp 0[©{[¯äX£»¥Ð•²Y’’ÀS®6Ì©×3î"×¶ã]t“ÁŽ„Î”T‘«åíI.vNÁ Xå&J\LÁ°2ò²!|öEöz¾Ö‰9#deYym+'GÀì–šè=ƒ%Öb _²yp„Þ‘~ÍïâÑá"K1@N & Z_µAÇŒtDäß•jòJž¦Á¬÷tÜ"³5 ¸[(©„ŽR§’г+óý³ºG¬¬z"¶œr¶téñâ ’ã‹¥bèBúäxéO dÀQÔíkÌÕZùI¼ÅbÏT_:ÐC¹¶ˆ#–¥½D ´î:‡u¦£ÞŠ[•F°Ö,Ò’²7;¡p;&L0·ð¬®u9Ñ ,aÒ~ó\*Ê…÷®ÒÒ½¾ðŠmf…;¥£çÕeyLU÷½Š<渓¥Aô‡¹Û/©–¥”Ô^BHÙnÅ¢—1F%µ·üo­´Ë91¢ýSJ+™w)aòÛfV¤Üf%ï™ÿ û»}ë0Õ!b÷†_¿E]rvõÊKëÁGgÉÕØí¾$çBx+lï²Úªúx^o'X[ÙË.ÇVW ê*]å.;:Ü…‘žJU²½¬4¦²=ѧ²ôÒ{øL Ÿé­R'+Y«ÝÐiäÎÖ3Ýù7OðÿvÕ…~FÏ úÒˆ@ëDXÜ3ÅbÖ~ÞÃ%ëvŸ¥n,%¢¨xSòuKOG1Õ=ÁóãYoƼãó&ÄF€g0>°ŽWˆßCçMŒ•T®m+úÕ-e_q–û©+¶/›ÿàç endstream endobj 1979 0 obj 4177 endobj 1983 0 obj [51 /XYZ 40.7999999 600.019999 0] endobj 1984 0 obj [51 /XYZ 40.7999999 123.860000 0] endobj 1985 0 obj [51 /XYZ 40.7999999 123.860000 0] endobj 1986 0 obj [51 /XYZ 40.7999999 600.019999 0] endobj 1982 0 obj << /Type /Page /Parent 2 0 R /Contents 1987 0 R /Resources 1989 0 R /Annots 1990 0 R /MediaBox [0 0 595 842] >> endobj 1989 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 1990 0 obj [ ] endobj 1987 0 obj << /Length 1988 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€•ERÔØžq€6CCàÍ&Xdqö¿ÍHÝÓõ‘¬bQ-õÈÆzzGMŠ,ÖûÅwüò÷Ó?;½ûøå?§oãÏ_Ê¢¬ËáÏéùï׿Ðmaôð±im¡»ç?§o¿<|?}øüð¹ÿ÷ûƒª_Ž?ú‡çW þöíׇwÈß|ùøçþÓÿNúô§þÿ~>ýõoýÇùž¿ðËCÛÕÏþ=|PZé¶ÿŸëOÏÿõð—ß~í—оÌûüïµjmÿ•”e|¿ U/¯‡‚wõðiL¥t¿HÛúï?~êçº,¢è*¥šºjÊØ9=NÚ5ýÖ™ÑÙVÌ<*mšJ•Ó¼€*eOª¬ßùŸ<¡'Tœ'e ß­ø¶9¿ô1ÿr:°–ª|^KU©3ЪhŠÒZóò¤}…o=ûÅHŸR:C†3ªŠjxÛá:c-úª»²*´2ýþåJ¶ªÛ~¾×±˪ ­ÚEÆt5ýã|AHà¹cç¯ÃkÖO¡÷ª2úHÆ÷æ%mêFæ`1)ª7“¦¨Ìœ,:!PA<}º¯ ÙmWÖÚ^øŒ²çi_Ÿ hi £[5ó"l<µa¢V ý‰K# €õ ÁÄÃ<0Uá1bô¹e‰Méó:=¬B!¸#’„ÀÀ†kÅÇ@Á¼ ÃxÂ+ø á0b¬!@QàœÞÆo,·]8ž“… pÅ4sE4¸¿êi5E´êìf´ya ŒØðŒyÇÀÙ°‘iÌJ0€°ñti œÍ0¬­Y«ªàr„MIˆ.¤À~ Ï{ 'ųì/Á>È6aN[cÎ/}\ï¥VŸ_ŠýYøL¡oJaÒÜ'ëÄ8ºëô0üD–uBA¹e÷š¯á{J¸6Ìß0l]ä4*|Œ²OVbÞôç¸ÎoH+ £îòR1a„Þ8xpëê¢ù €^r¶|X¶•9Û‚ó^pfñ•QA{Ò »GY8=SÃ'x \›v`ÑÍ ¼JGÿfÄàƒ²ª¤9wTSO1ãfÁ‘–Päý”fkTs¶û gŽù/(¾F”{›8.D†ƒãªt·ÁðçyË ööðƒ2 ÌtÍŒÀ°Œã2Ž÷†aŸžˆ?Õs˜Aêàøb ^ÚòünÔE˸À`ÄÌðžŽržå¼d5ã%ø‘ƒZœà gŒþ4±ƒ1bÏ™‡‰ÊY‘3$>ZÎ Más„p7Eáœ0^#'XAO2 œAvaÕÚv&¬îTùû8û…løÊ¡Pþ®ÕVô›”°ßãχªë³_·œ›»î²:¸1Û­¶ng«uPÍY-#víÆ…ÜŸÀ=hJ0äîCŸ È”ZBZÙ)"®œ—¢KQ´×ôóG8$ÉÈÌ Ð5Üh„xÅŒ[€¢é2kLH¨‰H›IH kÍæìñnj;Uä2©/“„–9¡OïðëÌì†ãwà ¿²3ÿÚ˜EiauƱ™8¸´’õ†9ª£I8§ŽO.HÎcÅÊ’$ˆL¼‚ÛbfC•Ðî\J g¯‡„x¿ nΖÀqÀÈ8Oo•N°¸YFeB¼‡#©âÉ_X∎:·<Mè‚ç­^‰16QVnömÓDH&¼hFLÇA©$Ð;àDDTÄAȪ­ÃXŸÛðóéö"bo횆HU«©äñÄ¢âOÙ5¢ ¶‚OΓŒf•ž¤‚% G=þ%Ap)sö}nÜ­M3ÓšÄRX{ìè¶/éa¾ÍÌåðgNËUÑØÙá1sNj4E3PRĘ=Û¢Òó1Ð F¾ Êbp¥9‚¾)Œ“²¨F"7/ öú ^Á#z^5~g?x6¸Ï)hÜžàNñ{ð˜Oôýìú|²Ûim¦ç±`ó‹V¡{œV ]ÅÕ¿OÔ)¸=]S$Š“;ᤵå *l¦Ü?“i.aê¿)®Ä”H¼Ï/)é1o~$Á‚ ¸#táY}~¬í¦REÄ¥@ ΈºØVŠ5‰Ö#P| ¢âÌO9MT;¯›‡VÇZf+ÇÝ“’ó ã)+Ê\´ ºtªáºhGž#ù#Þ›@..dÖé8¡6­|ËÈó»Ñ“ðÊóoÖï ³xB›3‡vÖÊxŞߊf~Ó²±ˆ<ö؇ëî[(ªÚ¡ªI-gé¥i§fÊ`’=¿‰ãðÄšªQ x=ØÕ–ÓðÁó„kòtÉ^–oK3T“9®hª™|çô­ÂGp [ž[§7íËÌþõàøFÈžÔû§hÅX¦Ãì:ù*.+™[º”g‹¢¦ q¶ˆr‡,™ká(‘pÛ ‚Ò måûèýœ©Z„Áh"2Éb“˜®†\Åõ™àùjzAA~“½;—‡ý‰h­/‰_v˜­E)‚¢2¯`RÆNÏÌÓÿ “«ì ªÌtaŠtÃû9“ l,oYº6sH© ïr*׳Ÿ§¶Mè<ã32×–ÙyÄC½›"I°ïšãÕf¸¸8‡›Ê"1zƒ²Ûœ5ïRÍJjñ“”ê?·Èž „ì·´‡ÓŽá&eTz¬HÑ+B%‚±#—ìW[}¹¡í­¦Yu,„æZÛ1ÑR:‘ÝWdñã£Ð~I@œxu€¼Yñ!Øxëà&‡¿…fÏÉãm7cò·jÈ¡ÙÛ•"í9œštÇûn<µÑS<6ø:ÆÅžë7pÐ ‡À`PÀsÝ  À29Ni§L.;3jêzÆŒô~–¦.šŠ“’šž”_³ªm5=pì¯<¨v«T«zíæÜSù­æª"a.w×fäaïZ5Y0gS¸]|o1&ÑÎ#˜—±ÆE3]y¾}ÈSÀ¯ØÂ¼ßuˆo:¸ynN» BGÃ1ž´œêM0Ü<—½ÁÓö\’—=ž50÷ÎÂ$Ór5Jo{Ú:žÓbЇ2<´É¸Ï,ØÄcÀë&Œ¤¡'«,´ªkxuNŒ›Æ¬vàZWÝâf;øÚM8¾ŒÒƒ‰{-&@F[!î0Ò™=Ò¯ÃGwI§¬S``È–\qøŽ`ÚQP°Ôˆ/³£²ð-1ibÀ3ÈÙch‰¢²‡yo\wiÏé(Xwá0‹+vìÝiO²º ¾bÛÞ8…PŒ;“ ÆxY«m—x}h·Ö6¼¾–V™³—c3ég+] àiÚDp—2wr"¨œä×,ДD–øzy@y%yÕ(më)ý> ýÅVM7g‚9Ó‰r2s=ß§^z»YJGžë¤X}Ý ¹"ý9Ã5!ã¯%7§IÒÛiðš%Ó™’Ó zùyJb󑺰…Ô…VuçûâUe ‰kÝ¥pû@ÖZn"]2°÷p¸?pÒ%Öåkˆ­.™oÛmh³]K.xÞÃá‰Ç“CÎrn#玿ü™µ™JJžV°0‰%š[s`,’Ñ,œÓ©3ÈÇhBÛÜÍ`QWóÞìÞ.œWÃhÏç¢E<.s„FJîÏ›ë½'"<ê\Ϋ3J„¶«göEž„äø¯FtN ZVƒBè°‘xómßò[ªÍ‘•£ šá\3,Šæ÷“±»Ò=?{4¢Ýþ7báäìÕßµSf°w€yÏ`»vð¼‡#†ç 2‚eßÑ}ŠV7Sú<²d½Q‡›ô#•9’3#- ~ódç#K«<Åá_Ñþvø=ž´lB ãäÞNþH„‘ÝIêtÕìGÔéãÉ!ѳ艇œã%›ápZ‡©kD[»©Dl«DìCÒîåÉ‘¢}ÈF¶l<¤YñQ­™ˆÖ2„·ërvlK9J9q eΉWŒÎd!kŒu9—Ù,SƤƒ…è”…Óã15|‚ÇÀµiÃA¹a•…|´ùXüš‘Ç-õ©¤ß3_M1à 6á”;NÚ{–ë¼Â ak%ŽD¾„èïç1ϺRNÞÃüzžß±áŒIJ¯«ðñ…k0BãœÉCjÎ^÷²rC¬ãêߘ¥­\±R‘Ì›§»4'e‚“ˆ@¸åY"w“Чm{Dô”Çœ¹ËCË•â…×MèrHH ݼYçÌHô¶ç­§5u/—þ^a„^ã­£e¨.W–â°?n¬2ã;(¶ÉiY;=pqÆè9ZRÊwT[ “ŠwáÈ#§zQÜ&£„ÅóY–¢Ÿ¿9·63œ]¹ì–"òž%§ôŽÒ†_Ò'BÀ®¤Üß®!Ïž"Z…¿]ûËA\ìdÚ_²WILh°ÖÕ%¤'EÜ„¶•QÜ4žé¬)5•Áâ N iDä­”‹à4 2ÕßíÑ5I@±$-…QbÉ· Ôž¯9¬4¤Õ}ÄÔšfº!çü/Ñ5µÆd(¤ rÕÅ­¦÷ÐQŠÜV©ïRªr†õžKï³ø)ko @×÷íxÖ)§°ò"ª•-¾…ö@T*¢öò-€¨”V ²·æm?Ñkªì./gÜIî¢Ë…«ZÆ'J„Arèð¸™îª#CÎ iYMùãÛõyí"¥(A3 ‡¹(VçŠÝ¿5ÅDx[DÛ/¦„ùÇ}fo»U7&ÈÿÞnWLŠÍ€Q6¾5ªH¶ÑÆ,qh)–zŠ€{¸pÖÃ\Ö¤“°E¸4–°­„f¯¢Ñ2™žâr… ­@»îà”Ë•e FG(b]–Ó_:|ä 2P"9Ò}KP驆oèbÀ&;I~¸MËY™°B·ÈÚ_|€:w—Ò—º·²œÁúLCã!\m•3¦†c:8f€¾2E3Ù+œÆê«²tÞ¨'f¤k=W”GTYó‰¾êse˜-öqõd$§¢Ò³ýà1c¹×ÂÚðlcáÒ{àªGŽYfXÀÕ˜G·®`Äý…÷àóyõ“ÎOÁsrÝH}øä¤±vFdxÓxkž£jYxÆ@px£D ÎÁ{ ¯#ÿJ×÷4—‹ñÎ$ZÎ*ó¤õÝ…¢ën+åÞŠø ?ÅWFP½%.² ¸å)i“ÿ||y‚§ÑqŠ/˜c²s2•9^;ÆU¸»;‡˜9®ÝDXòeÓM³¿f΃'`óJHå¤óÍ£\cÎPþÖû)a ‘Ô𔿉ä#¦Àò$ X8ÚPsÚÄ»@R$î«Yz±ç« 5,…÷E0ÂEp‰ÕD[c9£¤m;SÚ#SqÐrR.ƒNäü6fÝÉ’âçLÉÅ&ô-á$±ÒÝÆžâ…„Œu³ieÈZøNÆ„>„[oX6G:rÝ6Q ËIU5å ÷Zï•B›ÛËn¢´©`P«l‚‡]²0ïaÃ]¸0Šae*‡ÆBñ&:ÜîЬ¥+Ôlj=åé;0¯ËR*$„Lß«„p<5U¼þHðËoÆPYx(a‘[Ãp’àÃw׺îæ`S&rÀ,‘t/•¿Šh0¡[ ux†l"Ð*«Ês¯Ø*,$,Éç è¾4æ/ÕL-ÆOV²UR%¢^KD6ÀÉHO(ˆ»3¾aLì¡òH‡P»2Š«íL8<‡SéÊ(¾Ó¨é„]ÎŒé#t>BH“NH+]oÖ~{Io"é@e‡àfbÔéÞV ÷õµU3ûÄÓAö|xÍÄN©[kÄn†A©Ú]™kÙe`ת™ Ü "%ÑU"EgÉÙ-øçj÷F©(éÚ&Ò•7œÄ ÒbM+Kkx‹1`Ë%ÅWH@QwDÞô¹]øÐ Õªû0óL§f,ÔqÝš)üJ„ë&8]æçlœaÖR4ºÍJUn1Ps§Éá"»k–Óì‰Ì ÛþØj©¯I9¨`_©!¼dª{ÎÒpÇ«H¡DôÆñÕ¤4LJI@»µ…Yr%J''‰â $‹Õüf©Ö Ü•­ÜL›27ûäéõú¿§ï=¸{h>Ï9þøö‹þîÁ•¯÷Ù{tÞ¡á’þú¤ú/«ÒõÐäd.¼o”€u]ÔË2ª« šè¦h–ë›…'ÃÙSènÑËnmQg=?¤¥÷´pLÇ ´ÙèB—frßñèí^šmÀŠëß<ÂïŽêéÂ?¡1£è^z¢Ð>FÊ OŒ²÷qm/€uÏŸµUÍ”KNÛ3Ÿ6Äk”!ŽâSw0Ïgñ¼㎋›œÁøÄ€:Þ!~71TR±¶mk5ì.}Ç£¼”§Ïÿ¼kò endstream endobj 1988 0 obj 5192 endobj 1991 0 obj << /Type /Page /Parent 2 0 R /Contents 1992 0 R /Resources 1994 0 R /Annots 1995 0 R /MediaBox [0 0 595 842] >> endobj 1994 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 1995 0 obj [ ] endobj 1992 0 obj << /Length 1993 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Ñˆ/‰‚ëñL€c ‡ ‡`6›`‘YÄÙCþ~Ô-uÛ-öW‹–¼=ÆmÓ¢ê]Åb±øñ_ÿ¾ÿç¯ûŸ¾þgÿmúþéë®mÚ®ÿí_ÞþBÚFÉñcoM#ÝáßþÛ÷ÝËþe÷´{þÙ‰îøàôm<½bœð×o¿ì>Ž/ß¿ùúéÏçÿíåþOÃO?ïÿú·áÛÓ|‡?ø¾³®;|ø÷øAH!íðÃÛO‡Áíþò»ý/ö8ïáÿj;Ó%ñr~T¿Þ> Þu Ur/„€4-þûÝOÃ\g §…è;Ý·Kçìå4©ë»aNéMéáµh¢´iœU9¦9Ò* )ÑêžœˆGp×*sDИ4Ï%Ncl–iЈ$¤F‚5V+¡ziôøÂkåð¹WÓ¿ÅÐö²Ë"õ¯¥Mcû>Ç4hrH=1SêtGU«ÓPÎÙ½7L ¦Á61…&úÝñbúîxŠËbÞO»Š5Ú.%«[3 µ)Mœ V®¸î–QƈÖpª…‰à”áëW4š¶v~ôöÌâln Vœ"*1ñ6+vY YÖü ùc°TAI$Ž q²ûÛtÕY Á6Jƒ»¬=d32eªbÈf´º|iQºÑ]¦:q>a=JÄ’.S¬)ý,"ºrx °`Ç ÜÄoú–ר6()J’ °ìLz*[´’m®¤½DÍg)·œM¸ ìÞBH,nFãiˆÁHôÉat]"ú½ÍB@cDæÌð¸ƒÛa³µ¼­Õí £¹O…NTÂÌ´KˆçN"bb²0:Fè’‡hJ‡·1TmÓõâÂ=ŸT¶Â\öüÂ#Þôz„U6£ä,Òš<}§ð‹=jyÖÕ#ð­ºÅpÖk1L=ŸÁŽ DCÀ ž /™æ? "ì!C-ÿSÏ–7pºÚåèôo :"ÛÏ"Ó2ë ‚<˜ÿ¾n`^âéSz22Љéœ£ábBà£ðC2ÕäR]–1hŒ÷yF®ü¢gJ¨Ó†Â”~¸bE‰Ès!ìá‚~¬vÎî ,´jå‘/‡Æ—6`ÐUã­’9…Î]êWÌè}1Šˆe½þÐËcvÌ~å-µ½ˆ1BõÚ_Ni¼_'ªNYäá¾O b=Ã1á•Û³ß õª u×éߨ¡Öj.³žgY-±_’âv`$–¢¬ÒN\ŸôÝ,ð‹Y¨2Ö…VZaË–c¹íé‰ïxqÔÀØ€ð Úò$$mBèó²ºÌÊ<=^~m{>ò¸`­‰­2㞣à^BÉl˜›á~_ÖZçpbÛùk‡NŸeŸTc‹”"‰ðfÈ|uèÏQvg§vB*‡gg™ºsme¥5È^›VÏ öÝ¢2‚íÌסašÜÜ–Õç˜I"JŸ²d [uúû6@q± iQf÷wù³¸ º)± ãqF¼oÇ“’üöJzç)-ãßÄ¢ü’¸?÷kYžngñ6g+í—3~xúˆ¢ l\n ~eátÌÎso¢f9ç=« ½úÒ²)z7ì’Mg/:Ò.¹ÿmåÌàÜcù”}è°ÏŠ œ×cPÎ*ÂàA' Ç“7¾x^;1S¤Mž`–Žˆé‚^$¢:²ò]Ì1×»sÖî¡MÊâ‘gß2Nâ•TXm U…¯®Æ¶‘ çv°MŸïÕ_¡Åí"içx|N‰{ŽŒXŠ™aÛÆºvV à‘/!³î²@“¼÷ÓõyÌYXJ=ìrn¿DpÓ?Ý‘FÅYE\Vð¸Ü„•?hí¥…¯í+õç qØx¿7§f¢DÓÆÈío&YsXIôfÄAM:4ä«åGÖ.S÷‘•0îiÀ· ³zµâ~¨œ«kqK0Î=hœ– ØVs“{gÔŸZ×rF+èÇilˆ{xßûdßÑvG.G·ëÕàwªU\;5¯ÕØDã~ª öµÔÍP„_¸¹Ÿ»ÛëûÈ»´ñYïQçÜÁÒf;~6vçC…¸/‘?Ødnƒ€ ^cPkNAkyNLNô<Ìš¼ÜG xc‰gøÂgaëÏÀ'虊ö”ÏÉs0¸F&j,ºx9ã3Ümœ•¸Ä²|%£ê.É‘rv˜U¥Å©Äç#NùWÚñåÎHèRµö‡yz¾eéݺÑ#xª×—Z3qŒ?‚/Œž¼‡ÊVÒÂüòL¨®<å5~E[ݬ<¦7¡qÉ´œ½R¬”DÏå-½?Pö¬}ÅZ×nÂná­Öx„ö÷|e¾ž–±DYÍÎn\"¹^ÎÃÙSá3q‡Þaaìo9¶J·ãuÞj0-Ïz{4]!ÖW»¥Î,퉘?Œ|3¡Îí¼»èD6ßµMÃs ¦UI…Ó ÕnqÀé» ‹„SæXÞ82Š%[جy9¬s¹ÞfÉê ® Ö%]ŠcÛMq¶A†8óÕ…y/Ä×éÕŠí°@Jº4oýùݵj£P*E9#+6¸Àånw6Kƒ¬Ör£4`\™4OqÁ¦c„€­^ä-Œ ‹KÖƒk›4ªwáã ßkë…J—@Ä*q)ÈUäœlÝåKßOôTå²è‚Ýùâêåm6tqSá;“[5#âúWOEû|ÍdªRÑÈŠ8"6¨·}sdĵM3²¼õ«±TtÏE-\—nÄá èPIÿ¢Ä¥1À%'¾FÜiQ¦€&¥KòòN:~ý]Ž2­¬=ê‰Ê¨°F,¿÷‡£’í¤nÕD˜SÆ’Ô–&g ̤; êÔµ­°ó6åJ^8ÓÍ£º ”qÝ®‡m•è/z-èç¤Dp•ؽ®+sy†€È ãÜ©'|ª+"|kN–p*ˈ3L6X3é9Ã5©"6|í_YääðÓ·oß áò¥²}•Ê'R.ÉGÃÝл½иVµïD×½Ý^µú’]×t×ý»Óç%ÆHöM?CGB÷WFFr*ÕHw5fLÓ^gnM®½ÇÂg|f f{ÙÈÁ£Hã ÛµÙFyû›Gø·SÒä †_Ð3S¸umD <¦ c1¸O° A꟥9{ðI}£¸M<ƒ¹ åš Ò#”QÌuOBðüxâÍXv|Ù„Ô dKàgÕ1†ø=|ÙÄTI•Zk;1b·X|ßT/?åôû§ÝÿÀ× endstream endobj 1993 0 obj 3476 endobj 1996 0 obj << /Type /Page /Parent 2 0 R /Contents 1997 0 R /Resources 1999 0 R /Annots 2000 0 R /MediaBox [0 0 595 842] >> endobj 1999 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2000 0 obj [ ] endobj 1997 0 obj << /Length 1998 0 R /Filter /FlateDecode >> stream xœí]KÜ6¾÷¯Ð9€e¾EA€µg` <@ÁÎcÄAfsØ¿õHê™û£È"ÅVkdžö°ÅG½«XUzÿýçÿT¿þU½ÿøùÏêËðóãç«™aýŸêø÷Ýë_[KÑl¬®E{üS}ùzxªž‡‡îß§7Ï?ºÁq‰~¿¾üqxß/~èóù㿺Oÿ¯DõÏî¿U?þ»ûñÓ0ßñ _¶5Ç¿÷¸àÂvÿyýé8øßÃßTt[°Ïóÿ}g”h¬JÚÆÓéQþü÷õ£`­îL*[q.ºMêÿûùðK7×iu«8oŒjXèœè&Ýç¶1UÙ3¥s®‰xÚ4m+sLsÜ O:gªñNDx7m'a\Æñ4Q¤¸dmŽiŽ»áI‡êpÙ1øó¹J„Ô8QÚ4ªÉAáÏ»áI‡Ž'"\ÞMŸtD‡Â›6 ÞtO˜ ‡îLôCÈ óäyðÃãáý'®¤=êÓÇ_º<+åþÇcwT]½ëTÕãOÕ·Œñ|W=þvhkÝÊF÷J¼a-áø ûŸù×iàˆ# (xR σ×ñœTÀxRöŽ@0>sÒûÇŽò–&$ËGPÝ­ˆ˜(&1Q0L–xo+†›”ñ¬‰×ÁŒ.1D¡Ø ˆGä}ül7 ,ß àI%>)¦ÅÄ­b(Á#+5õ¶lË¡„· (ñ˜ ðžu°$ßQ°À ”X"yF°L„Řcv°éŽ%ŸÇªÁ:–ä7Io˜v<#EM7¾„¨ úØ”Ê+¸<&[AÀëf=€‡ö[fÀc;± à³ÀÌcà±qZð­N¼G£c-A…ýÏ:»jæ¤æj\ô®Ü¢RÎÂÀ£Oq GW¥‡vÞ!¦7G¹µ(ΊwÙ!\·_¯µ˜g ² ⢂xÏçÛ¢Xo¹\„5·æUïùHåØÖÄ:¶G)7jº¾ºb¹MO|ÏB\‹2’IéÓQƒ•ÑÜH€hžp¸‚7Cm3Yt3Â!_`ºTÝ,gâT04ž¹1ÚýúÌ=åÙéQ›š©)Õ¾<Ë᳼׋\Ôê2hCÖãlº×^ú™Zp:ë€~‹—ý7t-…ågÀbγ÷ð«ÓYU¿W.Çïìu“¯Öë¡F(ÑÁÒ,0\]r™Næ iPö€Šûê„°º%šwàë¡ÎBÀL‡©ò‰ËÓîOïHЬÜ0Kó³;[RÔ[y.ëwºÀ¾ø4‹} Îé³¼ †¯Kuð«YÞ%Ù7+,†\…7­†×¶e&›¡æ)¼åÖ»x'ê¾”yÏYÓœoç’A¾'~•Kü*•§Žc”Üö$¡pÖ¦dÿäMK T€PvžPKÈâœyA¤àAV^(ylyòø7–S¶QñT*²˜)¶Ia&|Áâé°‹w€MJ®>¡Ž:³Ú¥HeBl“R\?`®ˆàÒó…V»àÚJ~BÁGìB膅P;^ݦ ç©L'ôõ ž.žJ Qð‰ä©U¾>ß’ 'ÄØ$ +‰’ÛQ{¡â.ìnfoYÛ–¯]R˜S{™9+ ¤ÝáØ#»ó „ìx ° ¡íi³] æƒ{Üå­ˆN’ªT'šÌ’¤Š2"²Vú³_JÀù,³LnYÄŽ"rDqN N+q2—pv†Íü¯•°”ŸáiI”Ô›…sÃåY7<3 ćp çµVæøe’@H Âe¾åÄÒ’zAÙsÅÁ ó2ÈÍÚÄ骳¹íLX¤œ.›k›’ÿA‡.óDH8¸‚в•ç°Ü#¾×ø–»BR<©jð&ËÑßÔå’’“×¾DJaoóê. D}Ztc!¯5#xE±Ü¡(Ü—ÅËDÒ[8¯†Ñ§ö÷ƒ¹àu¹ös±gÝ\²“ßws®[sÐy¯ÒS¶…-s‚ëíZäY"`+);]V a&´¿~=¶ $­<‡ËðŽëˆùœB†” ÜÁJZô&KÄp=A·k(w¾Ô9UA,Çzƒ íq¹hk‚B,R¢ëp:Q±”~N0ÌAtm‚á yFh8[NHŒN{Î5%\—)]FR.Æ"ЍSH:"Юç°a”Ô[à–’à–Oì‚Ù¡é\}qÕAB)¦mÄ5,Å‚ Üº:vv2kÅ‘üŽ,7™•yKô˜X> d<™_¯U…œqÄ-–»#'!ÂÁ ÁdsHGEÌ_9†ß’ǘÓòGÆÎ’ª4J]ÄÀ€sƒHWŽ`´|m¶]¦dÓL@¡¿Â“„(Q?‡Ã†XyPkBÇ.HÈHجO7—åo-'ü½š¾¦ r¤¶íEŽ\rÉ!ôù²d¸ÁM²çsHƒRMó"i‚œh)êübּƹÄvókç¢ÎÛº9 IZqŒ}ê¸ç _{®Û#>çi{‰o@æcTL¸¸7}ËñG¹¤@ýÒ¶0ï+%p1 ¶ ¹Ø (öÂ4ÂÞõÌÜ-bš6Û¥å.-ý»Æ/Ò\5…ªp *~Qð*MRÏYJ'" ‘{Ö!˜ ˜,wU@S"ÇÐÑXÜbÁEB˜iîÝ ‡¥ˆ¼;ЄâyÒ ú(¸ƒb0À¶¥`w0ûÖú"*gڻȢ§.Øï#ÛvüùÊVœz8ôؽ”8^Òd³iê(…kžû{gz'“7™*T˜I)L9qD‰ôByßÑ™= g +sÎ@õÙ–Ì–bˆl&œN•…ãÃÛ<Ƽ±–Òró:yGKjÙž£}™’å7ŸU½xwFgGSH(A88ýuÄË[Kú”Þà…R7MJ#År/‡Ø!qDcÃðF!f.G²èÞHa5ì홨îøYh>VO 2< Ûžg0¶!]{ ticÝ¡> endobj 2006 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2007 0 obj [ ] endobj 2004 0 obj << /Length 2005 0 R /Filter /FlateDecode >> stream xœí]KÜ6¾÷¯Ð9€eñ!R lfì9x€‚{³‹`ì$‡üý¨›ìž–Ø%)¶ºG6à7›T±øÕƒÅbéýwŸ~©þógõþáÓÿ«Ïîçç]S7ª±ªýßwçð®Üþª»¶æfÿ§úüu÷R½ìžvOý¿/;¦ݾñø;àŸŸß½·ßÙO>=üÐÿöWÅ«ïûÿýVýôsÿã‹oÿ…¯»Î¨ý/ÿ³¿0Îx×ÿçü·}ãw?~SýÞ“ÐÆÝÿûNµÒ0žDÆË©+;ü=ï žÕÀ:%+ÆxOdÛóâï~íÇ:QɘVR7sÇÔÜ j´ê–ÞÞ¼f ”6ŒÑ:Ç0^%MŠ5R¢1œ7Ü&Øv&iЧÒ8ÅËÁð5,iR–ሠïzaÙO÷‚4Åã@iœ9¾§†%MÊ1Dc¸hŒÕ\ùZ*ŽS&‡J¢Í!(jXÒ¤,ÃýžrXþja^¿}Þ½ÿȤèööôùמƒQ¶?žû©¶Õ»^ë]=©þÑfþÏêù·©[#tk¸máÿB-@-LÁMèó-l‘¶¶À™6n⟃©–M˜jaGûðÜ#|aÀš}ã9¸%°X ¶|ˆg|€6¼$ø9ñ PÌ$Z[$ä›0å–^´ Kß@†L¶™\+Å«}“j#B à ìÿÓû“M7”å®îL£x{N¥Uɺn<ì´}Æì‘o¨Ñ¬™ÚRÆêVª®§`e„g£ZÈZÚozç lL«GZ`Ôé¾Ä[œ¨š³nD¢Ç=«ÛZô®ë`Ï{( ±¼GÚp‹(õ†K5’˜,@…Kë qîáRHòe6‚Æ1™™ú €KŒeO˜ä …õ°ó$¦„®ñ–Tö‚°Ká—§–¼U (ŒÐÀh-T»5¡Õ¹Ç‚ˆQ1Ñ9ŒæW¨%°Ö3΢õ0õ¾`A5ˆ[¼AxœOô]ù4ÁÀh`£Ç, K¬Ð"XK“1ÿ«Î[Êl6º¸MêôØ&¹pxìf…ñ#¼2+äˆä*0¯iíà}cþj3µó5í\ÌשòC.ðN… x¿WÎm‹o±àhªËÅ‚ûm8›$'@èÇxör 1¼Àʘ½X0ÖÀxÖL““·e Üßnàž3fRäô±¡¢K tÝ' œµzÈÑ»1F%¡lŽgPØ|TÄœOvÌ  À ¨[8mì‘Ü<¬(¨"¸y¾5x° €Œ³r@bÒª íŒÖ}ô¼A“€Dð{±“…3A°fŒ°!ÄKO¤@`×ðêŽ3ÇkZÈ¥¯³ 7·½3 Œi+貉&e÷ÃMýF`"E‚KB7“FÊ|è‹zNKh P Ëœ§ì\Iz‡°$y{}£‡ K`ãÇ+v#p i›¹ƒ9JR;íÅ]Š<´;Æ)Ü©Wœc†õtœ)H È)Fa[AÑHx´À†K á°b\)2Ð|¸æNÖÓ¤ÀhYÏ«€y% ‡(Ï¡8§ %VSõ)ä “4!HÚÏa9%Xg’>€Z, {ñh+Ö;Ø6:©/aÄ%Ó ¸ú&Í'C8fWj·‹)Èk$°ƒ¾êõ¡ Þ¤¬;Î'%Ÿ$g s‡ÀØ…âXžT×LÜŸJ•’E°%-€A“¨¾M¸Ewzh¹ EËŽAÌëŸ*®Új®Ù«ÉºÅÞ¼š¾®Üm d›°ñ\¹Ï× =IN©¼uRäJ¸}¹;/ €™AN €’-¼ ´mS*¼lÛ¤;ÀUÀRŸ2 zÄæT+‡lä„ë«(yôÎÝ… õU".†SJ@ŠCŒKLW7 ]ô×+ý»³“ÅŸ¼LéÂì´ëüøŽ(æå6~¡~EJIoq·‡#ÀåÊsÂíQ æäèŒ%uDï'tÌ ÜÎ[TãÊ!;òT‰Yniqµ–ÑDRô”_þ °Ú˜®xq~!ók*îÃ{$z„tßdµ…³ç à>1ø!ǘá6d©¨Cn)xÜÒr-ªCœöd7ÂK T–âSv<àÍ–.—sÅB,†±¡¹É»Ëˆ(âCr(ñzžÆ¬W WŸÊjÅ(Ûª„‰O®ðòcuª¡MÙHͯ‚˜êØ‹_¨˜[¡òrtÇVDrH3¥Ü|å-e¼2uН–÷RnÅhxÊb¼·%é\Ïže)3 ý’˜­Ä:T0‚‹¡†I ód)1œÕψèń޼¾óç—lj‡Lâ--aÇ0íxQ[j ŠÔÛ=nNI£b‚KòÎÄ‘îW~¹ø|cƒg¦.Í]@D¶pxÜGÁÜÒÆ=^˜±5jñc\ É%Èd»‹ŽtÓrˆ O.Åñ¬E«v8Å«‘‚oxÐù¼íã(>¹´1a Šõ¤ìÝ!1§±‹TZŽ8=Éä_r£jÆ)\;¢¶~Ì»8Ööh,©Í\…“³‰ò8q™ÐÈ^ÅéÉ„ªpN$Ä}ÛµoT3z1K_xàk¸böô·w,+pʈMàÊ œ6æ¢À-ùv‡f´ÒL®6Çïrgb¢Š9^Ë0=›?í­Ä­^&áä—:£Õ|†·á(.’9‘’¢‚ODsu¥¥ %%®z‹“Õ'{-#\–×ã«Ä¼i‹ Ñ—1z§8±@wê_OG–ÞQG¨§ˆ—Eø0){pÙ¦U )9ÓcVÎ@¼¹(ØV®ÛcuÛ×pccÿŒ‰“µnG-¤>ìcPg˜¨µåékwV_K>jqoWÕµð‚öÌ-8Hñ¼ÑÜÙCSÛÐóª)¸{(pû¶KÀ>™ÂÑLñzy7̨!ò.¹‘”#fMÒÈt¸ôåµ˜É )Ê _`Tï…Æé#Þ’Ç8?…²!åü&äKúæ>â=¯)®Â½nF#ŽXð‚âtœÇ–Gìmr!|/d'ÍQÕ ¶÷B6™ß ÉðUp|…_â§Tg¦Tk/Wt¥SI¯qËZМRÚ˜²Œ¥D³`Å…®K©C©€\ªºlAYèw. L\µüà²ÿY‹ï€´)1¼-¼Àã?B=r¬ì(5ó)T¿-¸HY.k®E—×|[@R¢0®_”R¾qÒº”²Ø”wgöPpv6m¸_1Æ‹æ5u‰ÀÄ5ïBó11ΖCH±ö*ëŒL¥ŸpJ$À½gàR Í*†9UAbˆNÈŽŠ¹ˆºp!‘eãy…ÊÓù}ײ¤V"ûËäÍßk|þD½Å§ÄÄIWaÓoé.Z’LŒt·§–rHÍõ À”®~H‘«³‚¯û¯F?-s%ÚÏp"d+oÜ7RR’—¹ã¾H¯,uXòÔYk™%/ ¨ÑŽ B+e)EFÊËž4Ç厙ãz¸Žws̼EÙ–I…ý·c¥’Á!¦’Ž•¶#¢^ú.åˆh;î¹KPð&å¸g;º¹OPðãÑͽ ^p·–^MOî6½õ-)ô“B×fš‰×ß}dM •ØÞhR¨à&%·wÕRr“&g˲˜¬`ǰֽùHçLìÿV/=·zNì¿à~|þ`ŸÏ÷æ•ïOAλN_¨Uë§q±ŠSµ½)šÓñ »ƒ©juù:°‘µåŒ‡<®k=þÚ¥ÖZl˜Vˆš›Q×…’ÛZÙÈök‹†Ïé`ûX£ yÝïöõ9Yº4šÕZçŸ<Âﺻßføõq —Zš‡;øˆëãV,fƒ$ nÿ;oOjÂù¹Q«èƒWâ:À¥GˆQ¼êBðøx”À“1v|lBn0ƒøÀu> endobj 2008 0 obj << /Type /Page /Parent 2 0 R /Contents 2016 0 R /Resources 2018 0 R /Annots 2019 0 R /MediaBox [0 0 595 842] >> endobj 2018 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2019 0 obj [ 2015 0 R ] endobj 2016 0 obj << /Length 2017 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðsUD‘¢$ (ä$úP H€>,úPd»-›EÓ}è߯lÉ>¶¨Ô ‡”|I€œËâe8œûåÍŸ?ÿcÿ¯ß÷oÞþÏþëøóýç]Y”¶þì¸ü j ] ¿6m]TÝáÏþë·Ý÷ý÷ݧݧþßï;e/Ž?ú‡§)†ÿúÛîÍ0ùnøäóû¿ö¿ýo_íÿÒÿï—ýïü4ŽwøÂ·]ÛÙÃ/¿¿¨JUmÿŸËßÿ½ûÛö¿õKhãþýÁÚ¦4qËø~~Uÿ^¾ æê?кí×§ªþŸº‡Åÿ¹û¹뼈¢3J5Ö4åÒ1›ªÔh½ï»×¥q†töµd 7L£­Ä0‡Õ¨¨M©Ò4ÞŠÖh¥›ª6à_·mÕÿÞèñÏâÕ¶e}ÜtWÇíú4N$ðÚþJ Ó¯FÅìi<8å²´ÏãÄÉTVI sX´ñ8Lhk=l¯j#Á}(NVIÜ‘ãjTÔ¦FxãŠÖŽàï ¦iû9šºßo?_ÏŠÆI>I0µê•©}÷¼øîËîÍÇîÀ¿¿üÜoõ( ?¾|Ûõ³þг¶Îì¿ü´ÿc/¨?í¿ü²k‹¶+mU…†ñIw|¢ê¢ìtsõäíñIÝË­º~çÝðŽ*jcÛþ¥×'ïOÌùƒê-üj=|µ0Çi/†W ý‰3qiÐW«aöõ«Õñƒæ‹Q¯:Óhøî>8ŸÂ+Ûñ¬~ºXÏð`£¾ô8‡¢Êè`iUÚk4U³vE=] ¶ð‰BO|§êГšs£½‡ïÀÑT˘ç}?# œ"(zzMQœ›0ìÕ•jã.¼#ªœ"$¾hpxwÆtIš…ƒØåó9wÓY+†gh­ ñÀ=ÁHÆ]š‚w„yÒå%ÜQ æmˆ2ï¼ê·Œyàª5^Á–Ï”££I|nÕp4<~—صup9øI ‰ƒ.¢gx™<à½M´¼MRøLœ+SCÂ…¯f!ZÁ3Ý2¬GóX²Q—'ÝZ¿ä›´ÒiNãÛ“ä=àª5^5\[ Os¼Ÿ§Àt‡˜øHb^mª‡ór1þõÉSNÆoÕ Œ¿MDPžŒÿÉø¹ŒS¤'ãß6&Ê2~¼6Ì™2Q±õïÏÖÅ¢®{8±“šÇ˜<$àήYFÑЪ6¿hhus‚ƒxcXcæŠOŽƒoOöžOÐIJþ ~Z˜îÉÂdk\ν‰R²Ó–ÉSN1¢9y¤sН±¢øj2žxî¯1±Ã8ÊßOò8ÈÆ6×ø5Pç %$ý…£òÌä·¼^Сꦣâ¸='ž.W!]†°sBŽ##òÔ±ˆã· .n8çO<Å«ÇC'Ãñ;¨p"¢c=‹w·~ì:LoV)NIÚuwMÛ1 õ”èº$Ž“Ú¶S)É|™Ò 1Åaä :\ͳÔðMäĘã\08y u`²œ|2èiÜ[‹Ãá—Û(#ÏÀ?a%‰ÜL|ÔŒ„@—/§¶¢å!bD6‡8†wåÉ“â 4Gþ㌖>!°›¨ZJ)´!‘Ìï°îpNŸr¦ÌKDö§LŠ?‡¯2ÞB9}<™7—|¯p¡û‡·>c:Uÿ÷´lɆæ SÂw°[‹¡QÌ0¬¸8ÄcãfX²±…™Ú„£³)†4Mbèx \ø´±q?áx Øë1*söƒOû•¦Éò…±jøöopòTŸ„‚ |1„ p Ç?‚}DÚ°{;5ƒ´ëü|òHOÓ7˜Áªe½¢ëS Ž0ç‹8ŒÌáyl>vØœÜøvÈq{k¼í Çvhxô¹`° Œþ¢b‘áh9Ï'Ûf‡˜ 2˜'FnËñ¼æŠõzÎhžà SeΪ3Ÿvrcb§'·‚TK4o{yœÃˆC,ß©L˜ÈòÒ†®%yú.ή±›ãJIR{ënË':XA¨6,ëjÃÐâ8ì“ùË<”8`Ìõª9‡±<ŸS±/"p,i]ïvÂ;ð‰é…{‚,CLžˆx[)î~<ˆ;–$XH 2³ªN£p.€‡%‰–+wA@àLµôxŸ\ÝQb œo& z Œ“àçÙƒT SÂüšm§'´~9uL¬ƒK,I) îÆ„Ÿ¥®ŒŸ$4;WÝìδÄt­³S÷ m]7J>ÃrD˜<áz(X,\LKýlÕEWÖTHtÙ]ßø¨P}l±Â eL²zÙîÁnéé{{ªRç‰d%HþiƒÊHÂA\¤¯_v!)±©RT·i÷!»'Nk,†Í…è1ûUÔ–³ß˜$(¢;ȸª,l£®峯¾Tõ5iÂOdE°˜Xw_X$\þë>ÆÃ'‹8†"p «®Y†3§ÚlÇ“²ý3“ŽLGV¾ÙòÀëâøþ·]]ëË~Ý}ÎÞðø°„+lYÚ½êf»×š×š²:ÕC­Î^örø3¥6¦hêÉÖ;|§CïœîFÿÈIÓ”ÙB‰÷å;êDbv1ÏHy 3¢×ëhïѼ6Î ”™Ne'”vTûçÞùˆà6fé5…ö_Òª_c*–Ÿ^5ͳx>žTpžš¾¶Wîéœ^5^<<šáÚJøŽgÕx§x¡óIHµ´m&dkD=]4‹/3F–1¼oøIÄeN­‘š²>Û29‰ÞT–|ãøu†Q«¢ïßQHÄT‘ÖÓC ÁIb…|•ÈJüq¸£éá™6í@wՄІb8S}¥&‹Iy£êë)3ÛðÍ‚¯ºuzDËòÄØx8N<Ïå‰"TGËl¹MS˜âÊ*…CŒ(lšQpÁÅdQ+7´VR|a–G·‰¡³5‡Ìpüv”¢Q[ÅÛ”Á?vÊáryŸÁò·-sâÀð®~­ŠE‚•YÓ›š&âXX—4¨°ÝRgjËB؇/YõM$Þã]\± [¥õ߯[´x¯lµÈíž¶°³‚{›± J,ŠBÐÊbXžkïø§¸q×-Q¨è½JmÉ©º5ꚪ´FŽ©‹’ ”Ç˜Í 3$„o‹ÔpÊÂâüf2Î …” ‡„O?X`ätÆ J+-LL–/“ôµ\ºce¯õuÛîTØ–ef ’^ŠdÈð«Gœ /ÑLNŠÙS$Ci¹Œì,²ó·›øûôaËÆIܤܘ)‰Æ¨ª £7'…‰‘%z[S“ÔÕʼǔ‹«1esa1Baœ£pª$6͈º†$Ì,!o9‹äXÅ("q’„¦˜$e vDHhŒo›ž{’èwv1Õ%[ž€Q‚©5O4ņ"b)áÞ—[b $näÄͺa® ^º(<’¤•éÃ(d_«w*%pE¿nWOôŽ\l_$B´c!açQ”éUIsvÕ‹b#âd”‚©4LMqÙA–7Ÿ O,¯û´iºán÷TÚ ätMRZ•À ¼5Ìö#øI‡.;›¡÷…©ÊÉÍ¢õ¾`´=ÁuÄ9µá£ §‰ «O|RáýÀw8õþ9í£6 QÜcb/®ueyú$ˆY´ÃWSuaôÇm0è‚/ºgF%|Xœ3øši±´ºð1ž{ŽBSr¶êÎA–—Üa©Ã¢Fì4IP·`KR]GÔ˜˜ºª°„±$w?uŠ£k-çmžRi,›Sæ X™pª Ô<ÞWGÅE8S2•¦ºæ*÷¡€.¨L”ši‘–Äù>®I°Ẹ̆'ÝRä(ò`Ûv"ŒmY±ºIUuTàR¦WÚwŸBMJ¶jAB.-«ÎXAÆï`Àc//6<ÍÒf 8Ž…ð 2Ž’`\ZƒOsqg{ì¹Ç¸ó0ÐÑ ¸QˆzèÜ¢ž›…ï)¦bŒx&‘|?A<ÈÁ¦LYÁû|rO„/ž‡4¨qŒ\õ¦‰*|‡VX~àÚÆ¾sïÀ'¢¹0Ç”ƒ±jÛAƒæÜä„E8j–ÉqÜ0C_¸Ñ`Ž„‚eK†.SÕ „ÍÙ‹1Üì&ƒÖY±¹82£%V ×,'R4mRx*϶±öÙ!fÕð[ ~‡aÁ0˜º0èFX Ñ›ÖÍnLÔÍ%d±ÄpŒUwnS>ذE“#'zæÁ,”A•1†pð­Æø&+‹…¨KæÚ5A€<ŸÜá“Lâ Öø $¯ ‹ƒñMº½86‡ çò1>>SlG2˜IàSÀ§É:~‚YvÅä3´×‡‡YIÀm&…>òåS±k]çF¤Õ-ÊçQÿoÒöIJ_c¥+“©R8û{ 6®º60›£ fRÖí…iïêDèql\¹0Ñã|Ä0€O<‘=ëoÑ[â‰K»IÖÆa`[W<ÌhlªÑAð>¦Âí!БóèÏ9›¹*×Xc§4#*÷>XŸ†P©cAU Bfkâ.Ï¢™$xšp‚!ßH"a…P —“`•»ç«z>äáA„\¡Ü½LÒd ¶ÕHK£Mi'$“!La™£rxxmúê½¾‡‹ ­üdÓþE(]¦ökå”2ä”ç¾ ªÖJ¨‹åÁŸ<Ô9¦ú†L—1Ba‰Õ³\o:m9Wƒ0۞¢=%.¹ã«÷èà4rKCƒDzOª‹pè¡( ¨ö.£&qá ˜EzZI’ª²ž;µüÈR”R[Žú.¢Âå) BQáMÅV()fLwMÓ)ýÂpb(Õpª¸l›QjAØ$H¸…‘{g¦½D(lc•g9ìØ#rŠFÔÖs@1E‹±c ôs [p–¤Õ'VHtÖ¡4³v6Χ™)›t);ái,…«n¡¡Ò}²ô:gwîßqç]Û—Ã^Ðùù–ú\ÜR¯Ú§êC†×ìP©m3!B‚L;Ÿ!*¦«s¦oêr×a”HQ^—¢à,·?‰Ðt9ón»¯Ìš«cuñæÜ´sthªj ;¥Õ—_é&_å'Õœ¶äÐÛ×—Ç(T¥ m&T{8vUÖI=žð’‰lö3ßÓ\±HsOÔx¼];G7lŒÄñ£Ì#[5ÝY¦ÇìTäþ3ܬyDŠÓç¶ýhD¦ÆªÜòã©1˨ Ø€áI(œ_½tu—½dÓ©4F –vyG^ŽO VwJ>c'Œfs*âzE˶–x¸ÊáŽýdɤø?Û|Dµùجٟ£y®ù@à•Œæ.ÿ!óõ”~‡ª¹fQ±Œi?&"KD"¼5³Q×¼r-á-„ÌÉUÖ¶<[â$X½HH¦s£EQ–…ØïQÃÑDmœ<›Þ›Ù°^€’g?“[ì›Á—PO)XÚ´'J?)G#à,õ`‰Žàz Çœˆ8¼{·k%.(á>S-DÆù+á1$d#P̘øÊ—à½\·³ "b0I[`BþÐtöš?, Ó8ŒßÑócîÎ j$òÍpâ\–gO‹4·fu4 ßoNv1^ Ž’noÕÍö.œ9•IÍã-Ë ½?Õ‘8”™ôŽz ßéà;'—¼c ‹Ö¨²p<Ë£PS˜ì æy-Mã¬íÍ3Jo¶ÐÇS¿„Nׯ³ê‘ÒFÃ÷Ó¹WX;ôM¬fÀ$ÒÖ×;š¡¨²Í•W#éëwu^-ô€0üfÄh¿ Í ‚ß9]ñRM,øÉjž¼[Ê=uƒ˜ñerAG ˆ +®*ãX¿VŠ&`¡ !i$½¾™² Ž1!w7î450vËFw„Ó³¯ÁmEoÄe¦"è4„‹'ü·»!³Œ ¡qŒ|;ìâ¾"u¶Wµ#æp(y#àr§tÝëæšÛ¬ŸCòtÄ&Áæ#õ÷ß{lQöˆã¯ß<èãâ]ùŠwŸ¼˜ç}5l ²{ÕïkÎ=×);ú÷º<U]k ;/&u¦p`5ÜÞª)šyŸK3ód€¼ÖEÕMˆíHÑêÂ'9=‚¹yZøNßÈ}SU©ç’5æFnÕå'/𻣖1³ÃèñêÏ=Qh#ÞÓÞOŒ²÷ˬ;ü^Õª¹¦¤ÓVŒÓEÒi):sóÀôà¼%žSwñ ãÎ ºQ›Äƒ¶µjXÏR„}¤À‚Ôwÿi÷GbÀ endstream endobj 2017 0 obj 5089 endobj 2021 0 obj [56 /XYZ 40.7999999 665.299999 0] endobj 2022 0 obj [56 /XYZ 40.7999999 665.299999 0] endobj 2020 0 obj << /Type /Page /Parent 2 0 R /Contents 2023 0 R /Resources 2025 0 R /Annots 2026 0 R /MediaBox [0 0 595 842] >> endobj 2025 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2026 0 obj [ ] endobj 2023 0 obj << /Length 2024 0 R /Filter /FlateDecode >> stream xœíɎܸõ^_QçF‘"p»Ûr`Ø@A'“Á Ä™C~?*‰U]$õ(>n’ª5¦»E‰ëÛ7¾ûÓçœÿõûù݇Ïÿ9Õ??|>µM+Úé¿óåß÷hß0:ý*û®¡êòßùë·Ó÷ó÷Ó§Ó§áÿßODŒêCãuˆ©Ãß¿þvz7 ~šž|þð—á·ÿéùÏÃ_¿žÿö÷áÇOº¿Ë ßN½—_þ=ýB(¡ýðÇýo—Æ_NýáüÛ0…~ì÷òÿ…TDôIÓø~û”Œÿî?ÆðaªgBè0ÉnØ‹ÿþóôóÐ×mâ„HÁeÚ§¤ç¾£”ž•géöè,+¤’Ø’YºfCRÖDZ.}ýDî6~¿,Ouië»ö“¸M\d9´ËlHÊšônƒýDîv§w‰ 4%i]žíVBä覷)eQz¿áŽâ6\vÂ^:tŸ²Ä[Gi;%XÇrts™ IZÔ´ánGŸrðúÊ[¾{>|úrz÷Q]Øè—Ÿ‡YŒ¼xúñåÛ‰ô\‘áŸÎø1ûãù˯'Ù´ŠÉnâݺEŒ-ýí±´üöÃØÂo8tƒÐÚÝ¿ÚM¯6|êã®EÚãÙ½¶ú–Úßx®`'îxμ@ËÂlØ ïÀîŸÆ–—/^ }!âŠ'B ¢†bª'óMÿÍÛ¦ïèrüIH?>¥g!Æ/ïN¾žD×¢hß“ë;Üè‚ß0¼>ýÝÍ™´ _“¸¼£Œ.”9À/§§ѦЦŸÐ†ó+|M'CÚFHÒçùzš¡s&m˜dä‘vzµéU+LtQL’éhè86d&°çæH@ˆ'Û>Ùëj_³ #Ò:Ü^bÁ9h$«iD6!Í n™ aÓ}fw;&AH€ÉL¹Áo²èyx&9(š³T€¯†[wƒ[ûÛÄ’˜UÀ½…³(w}Ë`â, Á»ê0ú<|6œ¯#¦F_‚¿%Ü~!¥8¿uÇ]A<Tg[Ûgˆ²÷àÂáo&B®š–t&çƒ[ÊÓú®å&±§ïAb‹„0¸9ˆn?(MkA…ù{füú€ }–RXgéB"Œ=*œ£-zíÅCÊá^´ ÏùÁ½Â€³¨^eá¢.3ÉÊ"ÃYU ô»{„à„ØN<8[! zNnIÔ@œŠ|›³„÷¹É ÀšÜ¤¶ÃÓIŒ®F7,GQ W ‘}) LZ íSöÚƒQðšáÝwNÎ9pŽÙìZŠ™v-ÅçìZJXf§ám׺¼Ã.øýW»–¢sv-Eìˆc׺¼£Œ.”9@y»–êM!{N®Dö“l¬Š²&MCØõ£×ØžeÅ`—k¬zf¯Ç+jÆêÌí_ˌյ—ÆuDó:v‰Òj„³7ñÌbŽù†‹…-§àÝm´´»Îíµå=¸>˜ì dg“RD„^¸}5 ¸ >zd&{’0†J¸™„=ƒ°.cƒ;y§š¡æÀ’–.ÂL~ßœ7²˜$ÃõMäéÀð²Q¡ø†+g°Â%4áÈ[[_ÝWÿ:®ã³ph`-+̦ն‚ÖÙ „Ø9`—ÊÄÛ×S•䮥FðGײ™àá©ü1>0•äéntÁäáï™àá©´ vðÇôŽ2ºP楕äai·àgààjü’Þ9× ¬Öa!}º§æI­§Ow·°]ººÊÆOÀÂøvü9ÂìöeÉZƕʲ¦×p Gć¤xU7¬‹o^Í@· gŸç½´h÷GM»;Çœðµh}¦Eo¦xϬŸKs¿N2s <ö0>ÄèY5`Ò‡ãÎrÐË4µ9#'‚“D~á–¼Ø[Ù€±FÄL †Är´Wyô@Eí¨Ý¬‘d‘5ÝNYR+PÊ¢‹k[B1ÐS–ÊqŠ{²€f³ÒhÛÈÍJ£ #–•fh3(ÃÛJsy‡]ðû®Vý‘e¥Ú¬¸c¥¹¼£Œ.”9@y+$&(ŽÙäúD`û†m¡úk[²Ømv¹Ð›»½ž¥¥WWù ai‰á8Y’ rø ¥Gì!¤!8¾S„Î1µ¼qƒËš¸gëYBŽ(&7†±Â–Ê NŒE£RìK. ‚´Ô HËf$Òv&ƒ¿<°$ˆñntÁïÐiÉŒA†¬Z[‚ßQFÊ ¸qÉÝ× …‚§‰àÅpܤ±#<Ò1&‡ØóM„ŸÇõlë‚;ÑXä8Û‡/êRQÆ€¦Õ$¤a“²JH»V×Þš˜°aö¶Z„#üjŒ‰8&ìMוÀ¹œÞHØË²—:À« „‚D˜÷I…=kwö ù a¥÷‚f²h¥f¹¡÷@ÜBhnÞ«V‹ƒÖly#;«… ü7äüFßLJ&aÍ”›îв™Þ´üGÚfb¬Ž,×7œÚ½Á3`ššR›OkŸGþl` š™¶K͵LÈ.6Ró ¹yvœµg:p¥?ƒ\éÕ+îhIÒ0Êg´½ÑrÊge]åBY3}Îú„ç<Ø=ø ØBøÍ°…–>G„¹oÆëíÊ7Úe ­…}‡á1o!¡%_4³ŸáUÜÌ–:~ñõ3É~õ]Í|¬.pGŒ<*ç²6œ…H,ÇÄí!i}™ nÌ(ƒùË‘[ëFŽX\DèJRÐêët %‚¢—AXØoºBœ‘à&ñ‡gç¿!<[}²1VIèhw3co_Ù˜ ¾eP ŸsnÜxnð¾µp 387x= Z†Ã™áÞ87Ïz@ØwÔ;/`Ë3~½Ò*È$ùLo™ŽŒ,Gltƒ€p±²5ÊP”#ñÚ#×DÄx#ÊÒxà(%ÇT)=>%m!Kñε³ %ÖJ4Ȫ´TRîKÚfÊ !Lq“ªîZ”+É}$17ª®™²8ÙDÔ5ƒÃж‰²ÀÝM"öÝ™m_ð,‚ÓY\ÏTlyÌ‹|=¯e¬–ß©HE§Þjþ¤’:Öña,³1ÆÅ2Å *ݼãRÈ[Îüà£h>Z¸ú¤hsižÝåš—¸qc;–¹&×@0·›P¡ßSRÓ #Œ:ÄUXðL8›ß›’áý-³Àµ¶þ‹¸¹+<Ú#Æè‚ˆkuYðžjKï€uÀ¬x9{#&¸,‚ÿì2^¤¢k”ï)3—7‡FxY¢Äƒx_-oNà£Ë]ß…ä‘ apÇ ŒðJ#ÐÓÛ.Áß³žíKûµàº Ò²[ÕŒÕ}«\±ëˆYì~YÊ{ﲂ‡#°íQnò›jž¯¨BÁu„; ¾Ë}qòˆöòÑàñÅ@?&öQÅ?æž¶å|GDUEIJr« ÐÓ]Õ%IzÇLšž´Ô¬™Ú›˜\îÇ¢±%ê*®HâVhÉQN,ïݘ\|DvCJ¼ÌörY™•S´X*1yH%+"Qî2ËNUÿŠ«²! ­ ozJ¦ÖêìÒéU_µÓ6b*ÆqkaïÁ½¿¹šxZbÙà–}ÖÉ\+޶VlW¼XU°V˜D ôtB‡'ï#bêóD¡§Ô012Ë¥à @žƒÉ(\cû±í‡8UXœB\r‹àU™/¹^*¥ïá*×jQ¼q*YÅ]à9¢£QJF¶ i ë„Ó‡P’ˆ6—ï•Yôfl‰evÆÀ¯»+¯èRµ¼éiߨRn+r2"y(TÅx6cɺ^!‹˜r@qõÅX'e®ÇØ`¨›K 'ž2fRÑD—L0)õ¨9ê]ç­k™…½Y첌ð:(.'D$ú)ŒVÆx§JxjU-b*â6JÉÈ’cSV°F%ó6”ÿÜÿ¸ÁÛÂWª‹—ÇTV¹”©»! ÍV-¯«w¤è.é{IΨ C¢³`¢  ¤3Å,À‡È_ýÂà™¯´¾CýKk᯦\G†Ïrœ‹ðÎy#MJpŒoulZM.Ê©4ajȆ_@Ÿ ¤ÌìÓ†'¢ŠeAe„á%Æ` »=S ­|-^^EÐt¡,ܙ « yë÷d¡ ËñˆkœCÊk#H 4¶ÐZ–ä”0w ¯c¦ÕU¡*o` Þ'] ÇoÌ•"耴¢Á~Ò¦,f¦¨k´bŽaùZB³„u9`~ Ív¤àJ[8ú®ëíx¶RnG LÑÔ]ÙÝ6w+²{ÂË–Î,±°áà*iýÀR4PŽ™ì€)PœzÌ«NÖº˜¹iG wÄý îSÄÔËjNÌutðy–ñm/ºò\í˜åºŽJ6ÑÕB…6h¨sY•h{ %<¹B䃨­'¿ê‰ù«>Ť¤ÂµªZpQi¬à¬)P½••V9ú. ˜_EH”·jY‹GzRyÁe{ê©eMµöÜU½®_±á¬OÎ 8k½oUÀ2$/¶Z½A‰XÞ·¬YHÆ…˜ôy˜ËÀ5VàŒ¯œ#àzbª(®_(ÀSÞ o™²¥S¨þ, †a=žEå­Ö|>°s³<…áÀ3ƒ˜zžØHáYÃXQÉ3·Ãzøþ#Qܦ&ʨ•êRÖX»]²^Q$`lY…«TpE°þZc 6ƒ&a“ ƒ¦Ê“lP'1âÍš_ ±XvÜÅ„§GYøÃO‰?ë•wl÷n§ž;Øhœ#bž#c\ ÷•Ö¾ý*oZ`ŒcrÍ*(²7Cá µdV¯Tø”jÝ ã$‚’ÁPž}ŒÅÜCªJ4TÊܪ·&§’,‡EäûRn“tÅ.gyŽ9Là>qS^ 8ÿQ”šü'O(|L6@DY‚_yÌûéâY÷â|©Â> >> endobj 2039 0 obj << /Type /Annot /Subtype /Link /Rect [158.879999 183.379999 214.560000 191.059999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 2027 0 obj << /Type /Page /Parent 2 0 R /Contents 2040 0 R /Resources 2042 0 R /Annots 2043 0 R /MediaBox [0 0 595 842] >> endobj 2042 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2043 0 obj [ 2038 0 R 2039 0 R ] endobj 2040 0 obj << /Length 2041 0 R /Filter /FlateDecode >> stream xœí]‹Üºõ}~Å<îÄ’eÙ‚RH6›B !>”>”ÜÞ^JSšö¡¿öXžK>²ÎÑ‘lïNÙÍx¬Ïóýùî÷_þzþûÏïž¾üûüÍþ|úrª.•®Æ?çáïO÷ÈîRËñ×¶k.Ò Îß¾Ÿ~œœ>Ÿ>÷ÿþ8 }}ÑþèNSŒþ÷Û¿NïÆÉOã'_žþØÿö¿³<ÿ¡ÿß?ÎþKÿãg;Þð…ï§Îèá—Ž¿)d×ÿçþ·áᯧ?ýæü¯~ ÝuÜáߟ´Òè¤eü¸½*®ï_æê?ÐJȳ²_dÓŸÅþvú¥불‹QB´ZµU옭´ƒšVŸee¼!½}Å $Ò†Ñýþ†¹žUÒ¦D¥Úà@ÄoE=n°MÜâm ´aºŽe˜a5"iSöÀáhÞVº»nÐ4I;¼“vP­Ðxr]HÙÓxÜð8—Ç?àï³tý²§V¢Ÿ®'„LWÚj1-©ÒNq(ñ2L§8†V#’6e/Õè3“/<ìGàÅ_Oï> UwÇþúK¿+Û|í·ÚœêéªjÎ_>ÿ¶ªêO¿;ýÇÉ\S·Í(&Ø'®Ož¿öëϽ­ì¤U-G¶Ð¡À-¼‡žTOàh|ç|"ñ£Á«†çßa?„µÕ„y¤ÁŸ[õpsàªaرðVÈ{Vo'1p à«Àƒ‡¯$b_×Õ3£ ¼¶Ÿ[]ƒO`8€‰C9ŽÑTr`a K¡þàÁK ÀÂÀ/xY{1 jR€¯Ï @:Aá'ð<øDá› °˜xÃò ½àªøä˜ðÃNà‰)G¸¤˜&ýXnÒÆ¬‹û—Óv«â>ü$@P* QtÍ@° !ÍàÉŽVä‚M{JñË |¶‡<³yR§=Æm-ÕøçegãíªKÛ8O¤Æ¿SÁïðñÛKm*-›ûÛI˜¨.ÍõwïÍEêÆy§Ÿ€£Yù¦»()ºvöÎ3ø¼Ÿ'h´ørO'0¸6x¢ÁŸ¼6x?ö—æaƒpÐVU]!ÜÜÌ®²s¡È2OuQ#zpÜù XDcéÉx<êåÍ'½ùâGµ'z÷î³½ÊZvb¾aͱ­‘¶ë‹½ô¨'ÞQ¸+‘\´û®Í•B\¥‡‰bv_5x)ð°<² ,:þ†E Íë_5|KðQxKÞÆÞx€(çêÁ§7Äàiâ œ |ôðÄà¥Àw.?­VàÜó#-rš'âÉú¥¨Ú]ÑSv"¯Z‡Ê³ÐViTžîÐåÍŽŠ!0 Û×C3æ´<" Š`äð¢=8'>ŽÀ˜#'“ÄoññÀglQ—/|È«4/ݨ³¨–‘¹4v˜K!D{;ÁM,iË;V)JhäÌÀtUâÆ9¿¹«w"1 6•(\èÆ˜i§¥ ÝH¾Ã[è.g#,Y¨¯t1î ­šRPg¢…²9ð<„UÊæÀ%}ÅqÚJšùi,ðs†8=™ãò0àÂre„Š„X|NÝ7¯$ kŒ™m‰kŽ©Œ*ÛÎÁÐøz¥_zE˜]jÐÚoWÁ#qVªoæ@µC=+ÉCyäðmDå%ïÚ|f‚8NÖºj$›8šlÀÑ ûc]rmÝ™¬ì+ 梄Ã#r¥ð9LÅC®‚¡ØW—Ô½¤‚ ‚y(Òp±g©µX¼bX|ðo`T§ˆÇÑÀ]¬ÅÍäׇ•SiýÁú²±>Â+û“FQLÊ]BLà:'Ú%é1ÞA@„6µÉ:¥Š 牌#(ÂåŠåµ¢Z¯‘‘ÅPs¤.{Tr}¡”†̇—ˆçK£ÖŽvKÔAÄ‚áÁýlÛßaê’Ílº³T‹qkWò.«©Ñ‰õ é²6ýBÜ:ï+ÆýÊ0¢h²ËD}©ÕÜŸá rk(éà ƒXI¤½˜Î~<ä!ÄK]•`W–ž´ÐhVh¸?pxfÿܬ‡ëî>‚[­-ãЀ7léÉ3a4ø°?­‚ TAÝTà>¼S'Ý··lY&§µ•ÍÍ"ÜYlèðIDQâw(™{°Þæ·²„å±[{>ÂAÌšDƒ8 âÙRº)•4Öƒ“Y¬I?žH‰1åTnß`ñ”-‹=énÎMº1AŽÂ/~ºY¡˜­:vP*ðæAp J;%“€ì™Ý†ÊRƒ";ÁaLGºH)9Ëdz2]ÀHÇ·:Kñi<áßô¾I9³¥rø¢–ãª>o,^)â‡ÁÍxÉ!e3/æ¬eÎ[in§B 8ïðïˆ÷à;p¨ó‹LäÈQ [†ûJk7Yh†Ã½Áy(}ZÅ'€k ¼cm“õ¥î¹8ø¬áÀvp§…wú<ÉÓ#"E5ØúúUÃ;…“"tn–2ôhèÑ&/¢bkç¶½Õ²¯{És,./¶wU^:{e1´œC!°ˆD2T°tvL‰C(¥”ïà0CFdý‚¢Mžüüxô‹ˆÞX·ÒqÄÍ JŒ²h²Äæ·•ÎÖ;êϑ׀©£‡€GÖ‚›»o’Z ¼ ˜2„ñôdÇÅÛKÕëNiÏc[Já%,5Ð6b*™ªÝPd-XqGp²4n…<ê]«š|kÄ?§Lh‡Gy«‹/¡Q)R`’š©™ ƒÈ‚IKañæ€Û³Ñ[ x¶ú$¿:¬šU¬IJ“b=ÉB”r=‘q#âÃÍÑ ‘_Wý¸¶Ôð’ìÆêÔØFòTÑæm|FÈfÞ2P¡–.­IQ àPœÊé¿.E1q ån†Æê£'|÷k€æ,Íû–"ŸÊD½aˆl¼6Ÿ3è¹æ)¡ñ¹¢÷ù?0~¡ÜÂRîê…rksîÉo«®Ÿó÷éÿÍ¥ëªö¬ÛëO!ºë§ýzò Ù¾tsÂÈ®ÓwÔlu?Aÿõñÿõõ¥³ó²t'ÃóEôß1³!Ì|‚_O~“+_zdVí-]ôù`Ì9¤'}#Joäiix úy±w£ïÂ<ÃÆ¾‰/!‰¾ÞVöãÂÊ'‹ÎÀxmXÕ!#HGº*«g§uè5‚žêèF‰ÈK!éIá®ð™”êoÊãio¼~ÒYÚ±T88æt ¾9Å€bFÆ2œÍKT åwã0Ja–*ã×¢ B©¯¬×ñà´h'XÂrÓ¨ šÉ%ç«|¬8ÎF8RŠ=0å) w ezþxÖdÐW™4”Óo¢‡ú9-éÕ[Ä#Ìx³<ñfYRÞÉ¡Q‹M‘ |z²š‘Ï·ßBNYV©×{I¹뙘¬ÒK¾õy åQ±'ûÕõ5Ìô}ú¿Xð)*QÏ]~ÃŽOñú5BÝO`}Šª2 >EUuÎýŽOñú3ÂÌ'ÈîSTâ ” ¼©Æ)–6D"fäµKŽÛ‰X¬>…c×é*¤ä¿J%øÐ•3²:'¥Cøß)Ûo6éŽ}=lò™ìæò™4KòY-ñ©ÿÀ•φï¨Ùê~‚I>“í’|&µ3Aÿ+Ÿ ß1³!Ì|‚üòY]¯Ëg«½¦¶2—*™ˆx—ÐEGbEH"”Ö€+ÉŽóýÜ•ëí1Ôítƒ”0îøè‚Måµ±ÍÅ#(T$&!¸0o‘ú¦næ'ÂÛBÂÀy$Ü4¼ŸèÜ £…t@g+mÞÌ1@1‘u¬F„Ñd³Å¤D¡¼9,þ/LÝÝ8_ê÷ òFßjÖ¢G+%>°©°ª«°ª[Ra{˜œk˜Må©°ÃwÔlu?Á¤Â*½¤ÂªÆ™ ÿÀUa‡ï˜Ùf>A~¶‘ÓùÛ"jÂĘNI–DD"ñФÒAá…ü‹) ÎCåze*Ú/ÈÔ`ý…ú zP‘`E(^€ÙxàICè©à|IðAóiC<ÜÃê—¥áâ =#›qО-pPíúÐuçqÐá;j6„ºŸ`â Z-qPíFèÚã ÃwÌl3Ÿ ?moçÿÊ9(oxJ,À±óðšÍåØÅû:á¦ò=ôäÖJÑXqÕ¦²ô${#µº2óãÐÞïÆm¿A]×±wÄZÀ"¯‹Èˆ²o »xa8s“ùí;†st( 0%W­ l˜Ò#™>“õÐ뎭×%¤XïAóæR äœ!ñ²[”¿¢ìö¥Mc…Ë×d"GY8y Õ{ó <{¢µêÌ|ƃô^Dx‰ ÄW9«Rì„(•<é‘4Þ°«ìÁÐÙg{<Ù<"çÃï½UÑ‚ ¾€³ƸUA6ºúˆM©O~1LJ ‹ÏƽŸŒQÅ'ž>²$ˆfÊI+#G"Rr×øAˆîHãœ#±Ø8<¦à75x ñ.Ô¤°ªC“}Lz3Åt‡pJQjÄsLÌR,ž£Üæ…€3ßc4QÏ®Ì6UD³¹‡@ä÷]‘V3¿þ‡OE 8:3f3ø(8ℽ¯F´ïÌÅÛA'ÁÊq·­Z0o& ÄSLÎ{ž¢¬íç(åéa¸Ä—Æt ¤¬‘¦²a:€V#𬋡,ýpYÒQ Óž‚&ñ áü&¯§úT<0û¡T˜µ€1†~OÁyx?C¸•?FÑjrªýhnˆh¨–7íeƒÈ ¡Úù9å6s<ð‡v«ÙGÔ¿²‚#yìY]T™¬™™«o" ¾Råi2Š®­—‘‰4Ú8L$^¯ö6ˆö^¯†D©µ@ ê›Cz?wÚí:3Ùa/ÎÈ­¤æL…=~Å­ÈÇŽºAØ{™<›z^審—ªü5Ê©ò7|à$x^¿£fC¨û l‚gS/Uùkj§Êßð“àyýŽ™ aædOðlÔ­BhJF(o¶F¥ˆàr–ü3ï«å(žˆ+ŸjâÁå@ýú"ÜO Q ¤®îç‹ïŽÓÊJ’qâq,€¹GkªfNÉaÔäõmFÄ:VÄ‚Mhô\hÚ%y 1»î?påá;j6„ºŸ`’šfIh”;òäá;f6„™O_Ðb$DFÐæÝø¶yÕ½Ýh!qbt@Q# ˜É¸ÇxRË<7S,e,ÎÓÂÓZÊ4k6ôþ0BzXÖú!-…¸ÿàŸ§/Q±×¬ºàØ£÷’YJ)²àÑi„l¥s´›•[ ¢ˆ`qðURÌr ‘ ÓÅð9˜!^Ý™­oX :øÂ›º³0‹©‡ÛJMG=^©™Ò$<’ª.mã<‘þñ|ǀ降­xIµ·L‰Ñ—z7š•Ì/Ê«ßÎSÁ£p×¥´µ‡¿vµjòðÆìpªë,]§°ÅÎ…5Yf«/õÑ¢ö.žÀ'-4šEÜ¥G£œ~`ðéhè‰]Av9¶U·¬,Ž}ŒEö¼SÜm¬Z" _”4Á”\| "TSþUùÜJ¬Ø<\‹Í¯”ÙÍøf=­9)¶s’ýð寡L&AJå+$ë…«=yʦˆrd•î¦àŸ¥Ø(¡ÌÊ$ãû N“­Ï»YX†rTí,}æÛke…Áo4ÛÓR›ùz"ô¤G³bÒÒ“Oà<¿‚ |xGàW`jéøÜàÑžÀ'àhUƒ;…ïÔÂA àëj9-ô=\DnŽbòç5¾`p?•į-€fàN) &E9piÄ\\‹¢H0 Á¼w ¸u•ƒWÂÆ,‰†A,ÀrX5Ìô`¬'<©kEGƒ‘©†o ,Ô0š™bkªîлç ÐQ‚üŸ þ¼è\òe!‚‡2ýßó7z¸¾`|ûŽòóݹ?ñ,øêº¿NŸE¿%'¡ú2:Sê›ÛÎ29­/zÙÎaÔÅSõFðí¥]ŽÈjžŒbw]_¤Y ”mš‹UG—5/ÍÓïðQ¨jåEVW‘‹ØK£(rÿÉGð»Ö/¾°ÃOÐ;Öü³ôD@û°fÜ;öÆ0{·k»"@Ô ¿ËFÜâ6[üm[k]à¶…÷ެ!¸†Ï<; ÄSn0!,±, Ð Î ïÝ’È% â oÖè´ðD<ãGƒOßZq· ÒÂf7FÁSø~àýÔ> endobj 2053 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2054 0 obj [ ] endobj 2051 0 obj << /Length 2052 0 R /Filter /FlateDecode >> stream xœíÉŽì¶ñ>_Ñgn‹‹AÏ[äàÁÈ!È!xŽc±‘òûQ·Ô‹HÉ*V±ÕÓíxfD‰k±öå»?ýðÝ¿~ß}÷î‡ÿì¾Ì?ßýðÒì›®™þÛþ}{ý@{£§_û¡Ýkwøo÷å×—¯»¯/Ÿ^>ÿÿú¢ºã‡ó±ñ4ÄÔáï_~{ùnüezòû¿Œ¿ýo§wÿúe÷·¿?~œû;¼ðëËàºÃ/ÿž~QZéaüãú·CãÏ/ýf÷Û8…áØïáÿßö±ÚMãëùSuüwý)0Öø wãÌ”Òã$Ûq/þûÏ—ŸÆ¾Î“Ø;«TßÙ¾Éí³×c§}§v®ïvz|æw¬+§#UÖ,G7‡Ù¨¢E©ÆöÑŽh>4¦6¼qEKKmwߎXØêÝçwhÕýq÷ù—·oéÛ‰ˆO-ÚB-†ZàÞšwà7ØÎÀ€ß4¯`‹Çéñ3€¿Ñð Þƒ-\)ÜÒ‚sÏÇÂ{ ï¸Þ7p |¦Ó >|ïKø;öíøÇH€T»Q©}k»aœ­öò`š¶ÝÛiÖW›ðñØ2ø;yyдзó±÷û8µ–ì-˜´šf²qd§Ûð.¨öÔÿ¥åûcK;òíƒZ~óš¿[ðŠ{sÀmÀ-h>@sÔÔo(|‘ø+††÷"r’,wþVƒÛ†÷à᳞M·×jH­"膸%X0‚6t²ßƒ÷Í_¨jüàÂMòÇL>øÖ ßôngØkj%‰Hë–TsWDîuä°ó2mùÈ|f"Ço?pOŠÇšnX®ÇÁÀ| ØÌa6ñ3<ƒæJáo`þæ¥yù|˜/þž‘=ŸÕÀ>øä"=F-¼RE@O ²£ÌF·4Îz^i@²6 ×ïëM§3ɽ޲BŒ™¼Ã Œ- -°r ¾ po0>0ð)¨Y V`‡ûÖànù€#¼?­Ãûƒ?ïu60É©„P6qet£îúÊ<O£Õè¡{»„ðEODåè‡ayR7ѽ cPqf?µcÄ­õàƒÐ®•œãS½ŸVð²ÀKhk„WO 6Áå[=ÃõÁ«€7v’L•>5Á å9xŽI3IDa~Kë„ñÐ} ¦.²"è‚€¦Â^YÎöfð—–"h0˜ GN°Š‡ÈqJÅh{€”f žÞ µˆdkq5~¯¢õÓè~9Qœ(ó´~>­ŸQ©hý46mÛŒM–Oëgâè»6yô­Ÿf8±ÕOëgó´~ÒÉ6& ×õ¬ŸVëätžpý„븎Ùög:}ZYßµKÇó—ȈtwR üE¨"ç+%Xçˈ‘ Ž–'pýDèý+ëÃïZ ³ Ðc@›¢ñâˆ@‘¾²õJ ‚B\UeJÉýë­$±~o—hÿ©Ëâ ‡ýÀ6 Ýfµª"¶äidDØ“ƒÝÂ(íÜÂö]ÉNÏqÉB£ÌÄ!ìæ0X¾ú vŽÛL3º0@&7´z:¥=J„°zÊÚüL2$ª„qµš€$ཉ2lÒHz’$‹¼`êÎÖð'‡r{Ò"‘˜E"D4†Ÿn0z¥0iǬÍ•U)êÎ./Ý]ë‘“±ÊÃNâ„ÒØv9$ƒ«†,4™^{3¾gË‹$©³nš²<¢(ø–@I˜A˜jµ·åX"£{Ì ÔÛS;sØÂ…®N‘Ó<,” &]_%Ø·}.}Ù ŸE‹ÃCÒÕñ)T“N0z>Š#q 6¤•0i¾žƒÜ¤¡'iL Å…þV#ºŸF¨Œðß‚MÂ#"*xÅæà5 n]d=BL{ò‚¹D6ÓþiØ}ßz-zÀÓtà7üfÚ¸q!§'f†ïf?9[¬I*ˆþßC½Íºß› à ´·3ŽÌ‡Ò›ÖàÜ4´Rõê-òšQ¾9ÂwéJÍ|_´ï 3£øµõfYiõïAöFÚxðîtPKd@¨²ªÝÜé^‚éE#$!é¤ã·|.$Ãgåf)C)‘¯i¦*2(W–€# â¯/uù4‚Ùª"lBÎöûb´ÉnO9Q"Èú:uKä}àã @WåàØP CÑÀšîU(kgh';Ã倓T‚ÐÖ:åMæ'”9 ÛjEôȧ¶+R/!` Á½Áj^ßjÃâU9d "…a2ð]É,Q̉«fIå‡>‹§ ÅߢN³Xˆ„üùžÀBI𠺊 ç]sÊ N‰«È§ó¥x‡Yb‡xqv2ñÿ-3)äTQRa¾ÎíF€0ýQõµûõô÷°†¦ßuýñ§RÃáé=]wґ;¼tí^)§‡AÞ±‹.ìõãëÓßÝñ£ÝòcÓzŒÆ/“8¼ã]¸å?¿¼~#E|¦ës.ÑùT”)Ø›„’AŒŸ‘ A)ü¼[°œGá7Ó •a á=©´[áBe™ôji‰I86)4i#Œ›0hÁ &hD†FvÊÅćKrZ>­¸C1îê &xPv˜yôö«k׫¸¥ä®®—l 3/Cžï“Áñž§” {¥Ãn~ù ¥#¨Ž  !ó&²‰?Ý.ûÈ]{X>™ªj%ìúµ÷íO#Ig¦ƒW„FF댨‡Pb5FdnãÈìàÂGTf ð›Å”èÎYÊgvzamn‰W¢N ù R™L}E%}aÖF$ŒÅA `“¬à r Q£¤? ñE”'kö0¬Dˆä%bk¡Û!“Ãï™&[YÇyÛ`Î ¡ÀoájQüîí½ô+ã–KKC"ø‘ —%Éè†ËÛ_gûƒÓþè"6¸! Ys²Þµ‚ÁrRü¦g :üM™yäµ–w`˰ŀ- lqà€-ÍPíèêsQT•队¢à“÷M „½— Ã( ×5 $*Þ,¸ÒÕàî|ëá‚p Äk¶¢³ipiÛ'¸l\"h}ã€Ôgpjl¼Uj:nd_Óç¶À°cÂÉiü8ð7ði“È;|ÀÞø.PV ßzc_kß(‰‚#¬…ý‚wž| 0€-‘“#œOz« £Ò(:Õ"íbãwÃZ.6ð8°‹Í ãBÎ4v÷€Ý0Ž ‘o^ñëˆ8‚zÓ³ÛÙ÷ù4çø\æõ´ûI3—u 7&Ó‚³f»ÐQÅ›Sú$ÎÁÖ!Œ{!Aýž¯1-2Å@JQ‚ü`—ê™,Ä·U‚ê¦÷`Ö!ÁDŸ ¾Pš£Äï¡>F]^/:ßP°½ZVi/ ]Ä: ß2Ö”ÖþMùÎ[Ÿ `|-þy”Nø|J%ãÖIÀF1w#â?(nœµ}3·ïïµ=WÉ;/¶Æj³¥ÔM—w ü3àKV§ˆfj”î 1ÇÇÉ<áo3ð‡‘¶#ºÈDß§Ê"ÊKÝöì]…ȦPKa¥Ÿö&ü"™2þ)qj"(ua9ïÉÚù‘ Âv$%rÛzÇOH\BJ­Z"U"ð-oÐÊ¥FŽ`0àÜ@aÆ )FÉx CNZ¢èlÞv%q~éÛE‘Ü÷Ž#]†JûMËdøåä¾¥wˆÓ™®³Ë; ÌPgÉ¢‚·fMγÚçH:”!7m·p8OfkQD‚ƒÑ2GmÇŒ ë!R›'u7k|\>y°—7Jüm§,s7óvÝÉ­óx»™µ»¬YœR©F{CÔñŒ˜3 $§Õסéãríuúøñï.L?>ÙÝ–éã§wì¢ {=À”>~üÛ†éãǧÆÀxéã§wÜ¢ ·@:}¼ÓÍù@àøã·d}”E…>r¹«€ uc½EçgæÉgLà×ðÝŘI+»ÀLúàÛ`&­–e<Ìt|Ç.º°×̘I+³‚™´WèñøÀÃLÇwÜ¢ ·@3©S‚¶‹÷`79#RàJÄJ/ŒLL·ÜˆG@&#)ô}+îž5×&º” ðê ès°JŽÎ*# „L²òJXŽsdAËNF#ê•f¼‹¸Ì1¬*LQwée¯Ñ®{ö¬®£÷%¥sÏÈûË⪂/—S'×°+‚ÕK¬ Áx( G'Vâc4{FIeTI¬GÒI¬ï—‡È&á³”pŒ]“pF¾v)€Œ| çðŽ]ta¯8I8F¯I8Fù¨@Â9¼ã]¸åòŽ9gðà-NTó-£:Fåªc$ùv³Þ‘|vX‹¶•ˆOéÓ*©$ò9ßbN2“-ú‚AÞ·Z{‹¾‘·E†GÊ ýº§òòWÛ´ÙmÏЇ-ºžó•Õˆ{UëÞ,Yl.{R¥2‡a¥2Ê;« 4jÆ —EWŠh¥8.ËD­xAád-xZ}ÇTK$½›Œ'UIš’Ñb -áz)Ü`þBI$°ÀèK‘÷Ž,°7…=wm&/òò`’+ 7AÙ=Xrû"¡†„<2÷ †á3ÎÇãW¦¤ù'È_S/¾®£Îµµ„öËÊSï~¹ VŽX:ïì=²Æ²Q ‘kä³9!¾Ê—„‹¸ Ù|W,–1aÓÑS;•[JNyØi{4çéƒ}F „øë¢"MÂÑhÖKV¹Ð:í]†P.t­Çp•¨ðéHX¨ôæ2®×U܉r­­wž™N3Ð0e9ùá=š=…ŠŠz-Ñã¸ÅU*Öœ Šn.þàæBÃQI¾ý’ ùç– „ÉJcŠ •`ŸÄÖb ‘/0Ÿñ¦±&8¤KÒ.C~mïƒZå·8ßj¡ùw’â$&ÕYëa½Gꦢ®W‹§.]Ó-‡¼mEmòÍRd<§—u71„ÿ?/w‚ÐN–µÈEÈ Â"¢:Ôm²?ÈÒ §»Ç£nð e’¿­‘o®[>¥/»š/­~ýøo÷uœÇ8Ìá‹ùÇ—_³*VVtU±êStMÑOÓVón7®°ätûã Ü™æì(6Iä]·ïÖM¯Îît1 î÷ýzÖ²~¥eB>Æìµ[Uò´í¾›®²–ÖÆÀoøÍDb{½×94]Z^ÁÞ&½~ò|w“VVøúf¦ k- ZÇL6pßÌ'†Yû<·ã(€ºÃﺽØzüiÏ|\ä´Uð6\Ã{â)'‡÷Ð-ѯxxX^pdxí3YYÃà]€ám¦+-ê¾7x÷g†wÊ .ŒÜ,ðÄ(÷>x=†çžC7ᛚ {íéõ‰“:î>½ü)Ómu endstream endobj 2052 0 obj 5719 endobj 2056 0 obj [59 /XYZ 33.1199999 294.739999 0] endobj 2057 0 obj [59 /XYZ 33.1199999 131.539999 0] endobj 2058 0 obj [59 /XYZ 32.1599999 758.419999 0] endobj 2059 0 obj [59 /XYZ 32.1599999 758.419999 0] endobj 2060 0 obj [59 /XYZ 32.1599999 296.659999 0] endobj 2061 0 obj [59 /XYZ 32.1599999 133.459999 0] endobj 2062 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 713.300000 159.840000 720.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 >> endobj 2063 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 704.659999 98.4000000 712.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 >> endobj 2064 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 696.019999 142.560000 703.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 >> endobj 2065 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 687.379999 189.599999 695.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 >> endobj 2066 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 678.740000 109.920000 686.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 >> endobj 2067 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 670.100000 193.439999 677.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 >> endobj 2068 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 661.460000 204.959999 669.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 >> endobj 2069 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 652.820000 180.959999 660.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 >> endobj 2070 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 644.179999 136.800000 651.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 >> endobj 2071 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 635.540000 190.560000 643.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 >> endobj 2072 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 626.899999 298.079999 634.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 >> endobj 2073 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 618.259999 230.879999 625.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 >> endobj 2074 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 609.620000 158.879999 617.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 >> endobj 2075 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 600.980000 159.839999 608.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 >> endobj 2076 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 592.340000 150.239999 600.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 >> endobj 2077 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 583.700000 143.519999 591.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data >> endobj 2078 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 575.060000 125.280000 582.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 2079 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 566.419999 100.319999 574.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 >> endobj 2080 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 557.779999 132.959999 565.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 >> endobj 2081 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 549.139999 91.6800000 556.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 >> endobj 2082 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 540.500000 142.560000 548.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 >> endobj 2083 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 531.860000 143.519999 539.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 >> endobj 2084 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 523.220000 103.200000 530.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 >> endobj 2085 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 514.580000 284.639999 522.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 >> endobj 2086 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 505.939999 210.719999 513.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 2087 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 497.299999 191.519999 504.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 >> endobj 2088 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 488.659999 183.839999 496.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 >> endobj 2089 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 480.019999 212.639999 487.699999 ] /Border [0 0 0] /Dest /#ba.Z#5c#b2#94#fenk#bc#ad#80p#bc#16#01#e7#ed#93#b5 >> endobj 2090 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 471.379999 183.839999 479.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 >> endobj 2091 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 462.739999 165.599999 470.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 >> endobj 2092 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 454.099999 116.640000 461.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension >> endobj 2093 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 445.459999 100.319999 453.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 2094 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 436.819999 107.039999 444.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces >> endobj 2095 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 428.179999 210.719999 435.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 2096 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 419.539999 197.279999 427.219999 ] /Border [0 0 0] /Dest /#bf#13#c9#df#1c#ca#ec#e6#da#b1Q#e57#f2#3c4P#a79P >> endobj 2097 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 410.899999 143.519999 418.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 2098 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 402.259999 174.240000 409.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 2099 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 393.619999 132 401.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 >> endobj 2100 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 384.979999 166.560000 392.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers >> endobj 2101 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 376.339999 218.399999 384.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 2102 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 367.699999 174.240000 375.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 >> endobj 2103 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 359.059999 112.799999 366.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes >> endobj 2104 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 350.419999 179.039999 358.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const >> endobj 2105 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 341.779999 173.280000 349.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 >> endobj 2106 0 obj << /Type /Annot /Subtype /Link /Rect [385.439999 315.859999 426.720000 323.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 2055 0 obj << /Type /Page /Parent 2 0 R /Contents 2107 0 R /Resources 2109 0 R /Annots 2110 0 R /MediaBox [0 0 595 842] >> endobj 2109 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2110 0 obj [ 2062 0 R 2063 0 R 2064 0 R 2065 0 R 2066 0 R 2067 0 R 2068 0 R 2069 0 R 2070 0 R 2071 0 R 2072 0 R 2073 0 R 2074 0 R 2075 0 R 2076 0 R 2077 0 R 2078 0 R 2079 0 R 2080 0 R 2081 0 R 2082 0 R 2083 0 R 2084 0 R 2085 0 R 2086 0 R 2087 0 R 2088 0 R 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R 2097 0 R 2098 0 R 2099 0 R 2100 0 R 2101 0 R 2102 0 R 2103 0 R 2104 0 R 2105 0 R 2106 0 R ] endobj 2107 0 obj << /Length 2108 0 R /Filter /FlateDecode >> stream xœí]ËÎÜ8vÞÿOQë¦Z¼“@ m·d Ñ²²<™ ñ Yäõ#êVä¡(òð"Uý¶h»X*R¢Îõ;þôO¿ýÇí¿þ~ûéãoÿsûºüýñ··á>Èaþs³ÿýÑ úÎèüO¥ÅûçöõÛÛï·ßß~}ûuüÿïoDN?\þ¿\—˜'üû׿½ý4/þ6üöñ_ÆýßÞþyüô×Û¿ýûø×Ÿ–ùìßÞ´‘öÿ=ÿƒPBõøÁý—ýò/oÿú‡Û߯[ÐÓ¼öÿTDA«nã÷í§dúÏýid­qÀpÎo„Ðñ&ŸÿûŸoçÚnâ.2>‹Ò<úïŒu´]Géq7~Â"¤ë"æŒEÆ'é¶Wdü.òk’&‘«?(–ºKoüRmHðÛ#„ç ·'wŽñù‡pšÎ0<6€.0ß…´Âc½%ieÄoO·çf`ºÁžÓ\²çã]˜mÏçϸçõt¾óÞÎßp3‘5÷Û,·ó|›½/^—Æg?ïúôáì¿k¹ü‰þ;“~¹‘QË¡Ù"š)°Hú¥DZhôa¡å‡/o?}6ÖýòçQ#Oíü×—oo|ü0êj¡o_þtû‡ÑªÕÿxûò×7y§D+1[ÀË7lúFÝÃÀ7¿L߈Ñ0Ö„ ÷1}Ãï|þÉãb¦oôãR»4>É À$„ÃY?ο}\¡¢wD£Ï—\† p :Yx‹ñuáÍ#vâ`;ãëEßcø¶â¯<>}Ó[ÂlN|á8µÇ_`”‚¨ŒÝ¬`ÙÁæIÌ]I!½KiðŽãO.¸ý%›ƒ8 r¯2Ÿ¶ï<?X/>k\ÒÏ—Zï—/£~è$î)ò>þ¶£ÔÿæàÑâÚ#ÎÁöí<¸“à·ÑeB¾jAô3d2 ºÞÁ ÂçŒËœ ~F¨Ï€T›ªÞè” B…ʱ@lÜ}ð Ð(R3Á»¨±Îá†àž&É&¾ñ ?x\Ê䂈}¥Ÿò7+n\}€/§Æ&¸P¹hœ‰´`;þñoéˆ`Ío=¾Çü—l9òw0×åóô> ‘2š±n°(‘¬Z¦¾1ºK˜–,VÃYn.ðo’Rwe¤½_øòÇ…€Ð±ä'˜em¸q”ßGÖÞ7pÁE:÷´h‘[ ¿Do.˜vÞuÊîd&Vøêˆ¾SÆ÷¾™ÞGA€‘bÒú>½èoëgs×zP7E¦¿ ™@HCnj¸Ï=,_ߤ¹b¨Öd’Úbù´,0^>VÓnþµ Œ_ßü›°×0w ÿ ¾¾ýåíÃ¼Ý Án<º%Ê'Â5l}½³º!Ã]*â¿ø|™Xd†!à…|Ç+-ñŸDw€}Xtä@€ŽŒN?óëä¨ï¸pc fÐöõ&%IŒ÷F¢±4ÃWÞ£Êð@Ú®–ƒô¸Zj‡«å`|¦³€«íÔîË'éqµÄWËÃ8äêéæNá?Á¥\- Yés!:rú4ű’@"”;Y™D'G™²áʨ&:Ê}¢£bè¨41@¢£+™­S,Ÿ¸OtVc†DG)\€DGW2[§ðŸàZ¢£Æ7pôj™8D`Ùi*D@x p†+ÜW-”^ìÝ‚8(Ù5ŠgÙ°) ¦ÝjžåÔçYÎöx– ÀRãäÙqhæÊuŠåõy–“=žå\`xÖ^ÃÜ)ü'¸–gGQzŠù‡ €%9²³£¶%ÛÓj“8~.-äÛ£EqÓ†;ž+Îøæs2¦Üjq&_œI²'Î$Òf€âlšÖ:ÅòiðÅ™0{âLh°À8Å™½†¹SøOp­8“bÕªQaÕ2v!ç|Ö)"ò¸(@ý‘Ê[n¾Qƒ;`©ý¦É¨SÇë•~XìóÀ°EÕN™>r$=²(Ùè´ÅhÈ¢-µÞ®ü9w ûƒy`ÁXüß+ ÖPrú‰{Ó5ŸCøküðù”=ië £Qâò4ŽN&eI ¶FA¶ âÖø¿ß«¤°Äiisó ÙÌ2šãD…‘@Tµ'*Œll«#€¨˜®ü9wMT±'* ‡kð@TL×á¯q¡¨PÆþ¨¨(¡¤ÀøC¸”qÉ€7q/ZdÏõƹ[†ã›Êµƒi%MÔ°ùöLw Sš(Â}i¢ˆØ‘&Š(ŸÓí&ó5ƒ?Çà®±JEØŽ4Q„Â5(”&ó5ŸCøk\)MÈ ë¶€ZA¦À+¤·ÆCÄ”$šEùâÀi’j‚ÈŒcƒñß8íX~§›óˈqjÝjÅ|”P±=”P1€ÚàVÛ!©Ý)–O>J¨ØJ¨ØPÂéæNá?Á¥nµbJw«ã„’ЂÓ;ãõ?ÏÓ‡µ ã*¶ùç”Jw WÏŠèYAöô¬`@ èÙéšÁŸcpרô,7{z–k°מ®þÂ_ãJ=+D’€_ÓÁGð.¼1Jô=lp¶j›_ΘqrE„ ’{ R´PD¨tæÜ56!÷0@%h ˆ+èÌ!ü5®jÃ?G•PAÍÅz Œó¸†Fx³ùñ¥ïFÀq7©&*ˆ8òû}'=”N¶èUˆÁ™vVÑÛ^ÌØ…|1ÓÙ¨/q€K*1èûÑûö6ºA{D—Ò÷ùJïùJ ß@}¯W ß™cpרô½Þòm°FäÏ×á¯q¥¾7+ÏÆé¤Ãg߯¸ÜÍ/)So¢¹JÒ»T5hš#™LÍÖÞfC9¥î@¦ Õˆaèa/†18BÎAúœÎƒ»Æ*Hõ°ÃÐ…k1ŒùáÏ!ü5.¤zØR“iŽ?ŒènÀ‚&Ìà èÞrùƒRÀ”íñ€v©øcºfðçÜ56þ d?l B!àéáÏ!ü5®äºüd6¯ _É0G6"š´hÆrdTpÙÙJH¾ L~*­Úrù‚L^ó=L^s€ÉÛÈ|Åä9w/Ø&¯Àäíä ¶bòÎÂ_ãJ¾à&|•DUKh .ÈNéÍÄH>à›I…prù@àY‹=àYK<ÛÈrž9wÄð¬žíä±ÏÎÂ_ãJ>ì…ôC€î•KQÁÊGM,'î@mƒV~M¬V{5±ZšX;’ìÔîË'¿&v|­;I Zq¸@P;]ÃÜ)ü'¸4‰Á>ÆòÒ_:xRâÉg$]R¸Ÿ™™ õfÜÓ¹ÕÌdüZ_möj}Gwк j}íÐÌ.Æ­õÝX™ÉìÕújCáA­¯ÞØÇ¸µ¾ÎW2“Yê&…6EÝO±ä3)Ö ³[ î@-Åâç°²—ÃfÈa³€bíÔîË'?‡Í½6C¸@Ã6]ÃÜ)ü'¸”b Y]\6¿Ù4Ö0ˆ‡“Ï_«ÙrÂtÂk¤ y8ÅS‚è6PÍ\̯»4l¯îÒ0Pwi s±¥îr›bùä×]ºWw9þ  AÝåt s§ðŸàZæb«ŸÌU:(©)Hs ŽÆØ#pɨ;PMcÜïTeø^§*#@§*;iL,ª¶)–O~§*Ã÷:U:UÙHc|éTµMá?Áµ4&V´¤ª©¨­l‹ÈXQáÓUiéÞ+W5 Gr³xxãL»ÕÜ,}oÜÈ=oÜHàÛÈÍrñÆ·)–O¾7näž7n$‡ Þøt s§ðŸàZnV«7w W»ö5Úö¬ÇV&“:-Ç :¬€ñbåà!r!µ™‡Õ˜ÐÕm š‡µ½ @;yX¯\«]`[`åa½Má0]ÃÜ)ü'¸–‡õUÿ9›<1ùJ%cÇ%¥³sIØ8¨€têHØØqHØ~Q;ê¡ó€GÂóÔîË'°ŸCTÀL³‚*°\ÃÜ)ü'¸„í]l¨@´QbFü¦® ¦eÂ>+8{Ók¾àðгû{ÄS–›õùǵ)sDt’2w¯#z¤f"K<[æôóÚè—boòäÎóû\EÅ*mëxøà D^m>”Ša ø$Áy*{!{ŒCÊ®2<èà4DLí(veáAÙbjPâtð "¦vTƒˆ ¢Sƒ×ð ×#¦ö.¶Ì¢§o ~ä[ò˜ÕÒU·Ž+ÊüD±OZÅñí§Í=Œc!¹z’>’±ŒvúéI»Ç&m΂,&ÌA%q'À†Ä"<1épãõÌK‡³a:Ü8ʽt¸yÀK‡[¯ü9w9΄épvT‚5H‡[¯þÂ_ã²t8»uØ%‡ÕDnÁI „óÒ™ÕS#ºCµpˆž¥7±%JK“NFâäŠ!ˆaé¦5€}… D„0«LÊB!ÂÒM;Êá<‚¯2AODˆëK7Ç»'p òbãàB2µ¯ÄqÏ(uªèHøšVcoma]ùhxH…;˺ŠÖUa± U€­” XWm¼ª„ǺŠÖUa± ¥p °®ÚxU1uÕõÅ‚ö.Ì{dÝljÔÒ<µXF"´ߣʔŒ4ÈHŒÚQä—Œ4bІy2ÒP #MX0jG¸ÆÈH3¬BÑOFšë Fí]œtnÌ+<çwiÄ ŒÓr&ćœ Ùƒœ ³³’ÚbùäCÎd؃œÉ g; çéæNá?Á¥3!ïr~)v«9v.}èÔY E‡6“'ä,kåTË ª}™Aäëq”ÀÒŒ2ƒ‘EJPãÊ ª}™Aäk;*ÁT2ƒÊEJPåÊ z}Òµ}úô©3§WpHtúðØ‚’À8"žÒ§®Ìîÿó÷ª9„KŸCx˜ÈlG `náfá ®\áÒç&2ÛQà‡p¾ð.‡ðë™Ç»Ð7¿ê½º²W ‘4Ô¶ÓR„‹‡[%ˆ;PM ’û*Ã,];ªýH¨\IR —@%÷ T†Yºv”Âh@ r%IÉ\•×géÚ»Øà¬Q8«íA7M\åu3¹¤«Ù¹ÒÈ„ˆÑ{ÑR°R˜¯ü9wR zR z€kÂ|ðçþB #­$)&+°òÕyo2}í# w_ѳ ùÂ2j†Uˆ~À*zpjõ+|X…{°Ší¿á©?;ô«’Úbù`³ ««˜V1+¬b\XÅYàBýJ‡V):mïؽ :4éL:<’„7Ð/8dòö¹¨ëóÚ—å=#<ìŠ ÿ.Ç0A!ÇT pâc\”ìa\”ŒË@NŒk›bùäc\”ìa\”ŒË>]ÃÜ)ü'¸V€Ó­±@´3L(PNÈ£=c˹>&ÁÜžùÿNg<'#° ‹¼Ù¹G!xÕU¢ˆù`"e{`"eL´P±LܦX>ù`"e{`"e.€‰Ó5Ì‚kE'ïQ9¾b¾QÎ{):X¦ Æ%~DIzVrøÌÕ„­B©—äiRÜ(d:¨–@ÂG‹©ØC‹©h±€H¬2G¸hñ¶À*ÄZL… hñt s§ðŸàZ $2;¾@…*— §E¹Ð³ôÓžùN>r:‰tªùNù(¨ÚkDAhDa ß©¥Å6ÅòÉoDAÕ^# ª¸@Јbº†¹SøOp-ß©ôËF !Z¿bzçÛWÌÎaŸbßp³˜›ÁùלG#P"H=šxjíT‹ €l³ dd›È6+m< Ûø@6Õ{@¶}*ÙÓ5Ì‚kEI@Ýäõ’¨Ókõo¬9º5]hÙk:ë@3…ÓÁ]Rš/Òã ‚§Â¹=+Ü຦lÁ~Žío…µeÐ× wçÔã3Ÿ^˜Q^j”|PŸ { >#Ô·@™Ù¡I]mS,Ÿ|PŸ { >¨o€2›®aîþ\ªÌÙ@}…oJò9ñøæ°á8ÀS”¼¸tщ¤—•þõHËTwŒp†ÛªÅõŒî;Å]ÛË'?Àè^ €QÓ5Ì‚kÅÛÑ¤ÍÆg–רŽmÅVIm@#€š±GJ§’î@5gp f| fÔvr_y»õ¶ÀÊ| fœÂ€zº†¹SøOp-gðtuþwl-ÒÉ0_†{’vE›œåÝåXšOq'qª(J|_tä-.&sEžxTÖo ZäI?6Àä^l€I°PäÉ%6°M±|òcLîŘàAl`º†¹SøOp­È“[l Z¸ÛÆ|E Z5á´ÀeJþ¤OŽùAÞ!bÖ>-›[ßPáÍÆÓ*ƒŽ÷é&‘˜o'öì)[/Ðà¢iô|€ÓA”¸Õ¶‘˜[‘¾Ÿí]¡IªDE ŠøCî :È¥=Ã|Ñ“Ñ-9ÿ8Ž46U”á]’n‚ð ( ÓtQFTSOû:vÊ${ÎöÝç¾T:ËtÈ}Û;´7øðÒµqúžíBÞÞÐ1W„Ôndƒ&`“F'¸kgû,ö|Zké¯Áîˆúñ¤B80箲ÏÏ691I1Q{î –ß¶øæä®‹ÚÓœM@f’ôÎ]ŸÎ¹{W°p1fÂóH¾O|Éd{ú\:?ô ¹ô}¹Ñg@†¨hC„íÚ"·MSYJÎnRTw ? #`Á¤¨)±Œg¬ «¦SC:!ï6õ«˜¸)(‡ð¡Ë£4ÐBzÿ½Ý¨o”ï¶"˜§­÷ØÂ„Bb‘›ú9¸ÄÀK–^–ð~~Xxûñ»²PÜ8 ´Iâß„÷6uÛÇè6Qø t»óño[øy‰ f½†Ï½9}v…Kc+E‰ÈqYÐB;6=ñ¹8o©Å}Ðâpè°'D—3Ÿ®2©›4#,ê…õOöz×è•´šH·ÿ¨1¾óí»84î÷ÓäÜøz¨¶§2‘Ò×&+½CK¼m B’œÜö¥±²*pÒšµDI5ÉZFœÓÉ¥MÔD[!ªJ '’nm(°ŒXˆKç\¯I“Ë£¤-%DJú<›8"Ö$í®»ÑóaÞŽù^Ó’iREÉ{¡YUây!,”Ÿ¬Üníï3oµEÏ[¢ŽbítòWQùÛ‚­2 å¶=•óev†n:óͲ“´Ì¦Àˆ«¦vzK£ª£Ø°-<¹Ñ¸Laƒ=¯ú8+ùCè­pÜ@LÃÝà b[©ƒ@O* Ò0ç£Àû;¨µºÜóîœ2óÊYmtÒÙØhg½Ò¤â¯¥J?$ÈØè©$«*6mÙ^’m’2„k¾ûŸQ—‘OeñF}^LwD8­mak<2lŸÈÞ“¸B8èÖ¦¬šŠì‚ý õN“$¶ º€¥ž&BŒ¨Ú ؾe_(DÙPOP_‡¼”¥*¯¦.ãG¢Eâ,ÿT[KS*n³ xâ¡…¾+á=æ'·”$Öä¦3œ÷>mš€5$ !ˆž5’ù|õJ GÕòÚˆB_´å@4ÉÖ‰³b±øu0íÞ{ªÅ2½±|D¢Ì+Y`×༚‹ú (©+ŠÓ`ìzþV@éØôAnPÙZTWVÂèW… O®ck‹Ã¤“ š¾Šp=P’º´¿'ILô9^à¢s»Áw|dn»qô:^˜Œ´ ¢†c^}öÀ=<¯G{Y¤%n6bt"þüúç±åJ¢™ùi-!½XN} ÐÚTÀ•ôp»0{Z´LM­ÿÿ÷*ÿ÷´8ƒØŽ>Ê?!áôVØ5é‰qÂì ¹œLJþgHÎK„C${t°spEÚô=ûô)“>9¥Sž_œJò3†0’¡ôÔšú ¡ª,­Eeî;Qò‚ú ©ò‚1ŸÊ-±¾'ó¼& 4í WൠN**(8uª¦ì«¦Bâl„9ð¤¢Qx|}Ö©‘€AGb¸òuH‹îðE,Ò¢­¨ÁzŸDð¸ÄŽÞ}8+Z,ö÷>I?aʼn’mßm›N!ù€¦ü5Ÿ â‡ßA¾ù1 LƒÊ|[ý@ðÆUOCÓFÖtiVÕÌ‘cœo&·ì‡Ð³"—3_ uŠuW@°?Ò¶[¦m÷2rFg—ÜNÝáÏniPa4ñ?D¿éžy{ŽmQh¢D€4a£¶­áJn© ÿÃY=WSUfýsÎ+¨ê¥œó*k°„îÒ™"ˆM»ëQ½é>±©üÞ¤]˜îšZ-}~B¤À×´Épzº`ñ|V’«ÛDf¶Ð=a´¥EzUMqÖõ^ÏÙTQ6òK^u}Ób·ŠN ¹([4,²k›êšbÕ®9ÏÀÒz¢vìç”ñ'Q识ä¯Èˆ0¤c„MåkÒ¡IÀºmª"ůBö”¼ûü ç&Gg¶9_²2XÒ«*Ã#.@ñ»¸;ÿèÜ ´´¿Ã-iLå]yJž0þÍõ©WÄ$f¥ýššçˆÆ-m­Ñ¾§48 å¼Bì°£d¦AaxE¼«ÚóâÞ¦¯sEÌûÊmoÙ©§ˆ´/ãã |.N=…Jî1#Ïa%–Ãú•0E‹¤ùƒ˜eK˹÷¹}Šv+ î¶Íí*ø 8&£R+®£[œfVÂB.JIå[º¾÷¤äü íÙñYˆ\áÝÆºûpVäW¿‚|oŠ¡—¤böê®2/Õ—5D™ök’Žë¦4õëz3付ÀùB7†ÄW‹ `A¶íY'`W˜bEhS_}Ws>fÚѯI')9²¢©ýz`ß5iîpQ “ žÿú2J­æ·•Ó:}IÉn%a–Ës´ð>ÆÑ«=“¹ðUJUûÒï£iÑ¡Ýi£úFùn‰êTࣩöo›P(—äã¦>—p w¨õéßÌFØÍO›ñ Yfî’Ou…?À[Y^¢{sÑ_3Ò›rgWN«Õ ÇçðŸVÅÐ)Ë®*Þis¸H磅3ÚIMåZ†?TS:ƒp JäªZ$ÕœwÜ<™KœMòvŸ&s­&>‰IOohMw _‡ ’õ‹:Jµ°R/;±ì™ÕÌ+°íÉú #1K¼µ¶UÔÏÒ!è•R%›´ºŠË{ö1Êq>róA87j cÒ²ý'ËÛau *j_½BeuU"TÔ_{©*Ò‘ÞÅ CØpþQÐÂäùÀ£¾QN®ÝÉ2¹ˆ ¤ «"t>:gÇTØUEïõûÛ3f8§·?Äƃ/Zž?TUy'!„I‡èÐSS€hÙÙ·R¨i}~Hëìs|îü+œ޼šž¯yp'÷)Ðîq4OÏX¶hMǶŠÂÐt¥êE~@V´þ}ð—õç/ ¹1d—E-(Kªv»;$(ݽÝQÆt‘0§à²L¡Š UÛ$¼ÅÝ✀$öl-4PŸì^:a¬E*DæI˜JÍZ ñ³4zkuMùÔ Åú´}¯:dôäó°ÛT/v©ß*IÑͯ=`¥t¹ð…úAr ô¢®¼Eè9¥ÑϵÔ6?ÛÓ:é´LÄ{¼ª°å¤È7è1¨ÝUÝX3¬ó«šgäB—dh4LcïïŒR™¤®w1fÓtðü¢<* [¦Yfd*?6ûý€ú/ä:4IEŠ÷J<r%x@Ûëù´ì0¦±Û{W0O—^ÚSiêËûï'µB¨ºÕ¯X$8J œÜC£ pø„e÷5¾G‹=:[>Ï W˜FLm›N´PléXÓÙµÂãß$UzÏb"€_ôÞ†¶5fÏשÈ<ΨÁ7‡)2 ¶ZBI}êûÎÊ>ùaåt.nj’ç]“ÁÛ´ãZI½Õ}î˜à¾ *í‹:ôt9rêùÚÃò-‘+.}ývÀÈ¡à×CpøÓt÷-y#ãcì¶Ë$ò>Qí Û d³‘ò.÷ Úð{ÄÆ§ê®ö3ÕÎ73e1v§f·Ÿw9¿(wöÖÑÑߘèofÒRôNæ5 [B{³ÍôéŽ|Š^»’;Oø9ö›E¾ì}Cbϱ;î7ËÃ<ûroTPý7Dù"õ¶“õ¶­†{Ûñ7xÖ» é-NÏ©7×h¿èü¡ïÌøMíâßÜõ"Uh U–^;"NñËéŨoâ¼ß·E-Õò‚Ö’Ì;’ÍÚÕB 5Ðí×·ÿfÄ4> endstream endobj 2108 0 obj 8717 endobj 2112 0 obj [60 /XYZ 32.1599999 263.059999 0] endobj 2113 0 obj [60 /XYZ 32.1599999 683.539999 0] endobj 2114 0 obj [60 /XYZ 40.7999999 201.620000 0] endobj 2115 0 obj [60 /XYZ 32.1599999 445.459999 0] endobj 2116 0 obj [60 /XYZ 33.1199999 681.620000 0] endobj 2117 0 obj [60 /XYZ 33.1199999 443.539999 0] endobj 2118 0 obj [60 /XYZ 33.1199999 261.139999 0] endobj 2119 0 obj [60 /XYZ 40.7999999 201.620000 0] endobj 2111 0 obj << /Type /Page /Parent 2 0 R /Contents 2120 0 R /Resources 2122 0 R /Annots 2123 0 R /MediaBox [0 0 595 842] >> endobj 2122 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2123 0 obj [ ] endobj 2120 0 obj << /Length 2121 0 R /Filter /FlateDecode >> stream xœí]I»‘¾÷¯¨³×K.¹ ð¤n 0ÂàÃ`y<†12Fãƒÿ¾s­ª$3HF0"³ªº%@ÝÊ…d’ÁX>ÆòË¿ýö_§ÿùûé—Ï¿ýßéûüóóo/Õ¹jªéÏiøûûÛ º;=ýÚvõY»áÏéû—Ÿ§Ÿ/__¾öÿþ|QÍøâü£¿¹t15ø÷ï{ùeêüeºòÛç?ô¿ýã¤OÿÞÿﯧÿøÏþÇŸæö†~¼t®~ùß饕îúÿÜþ6ÜüËËwú[?„nlwø÷÷­n›®l?/¯ªñïí«@_ÕÉUãH•îÿ©û¹øÿÿ~ùsßÖeç®™ÿ€¿gôÓ\ßCÛ÷SÙ~àr´•‰t¢[[W®Ïè¤Õ}/é'®mN®z -§U֌Ӗ£™a4ªä›úyocí°-³®:x™Uªml[ån‚áãµ®ç¥hËfñÚPY3V³43ŒF}Ô´¨‘†ˆnû¦†´ý*–ÍÔÜPáLu-Ç&G£Š>jžð ¡¯C_ÆÏÈ‹Ÿ¾½üòÅ ²ñÛŸûQŒvúñíÇ‹íÿÓ‹~¾¾ýéô/U¥ô¿ž¾ýõ¥=Wδõ$§;ÕÛx§î¥q§z º¹ÓŒwºËUyªÖÂ¥ú<^°× vºp¶Ó8®Ýi¿± ³ß*ed„Q-8ø/~ó5ôh84›œ´×ñ‚ªÎM«º¾½Ëói¼ãΕª›ÕXá;sóoßzr•¡>­º5ù¤¤ß¼ Vƒó/”ï€T¦>Iü¸õTUuËX~78Ê`rêÆ;ÍY”AkD©‰ÀôrëzÇùÄl$˜À«¯iÀ“?šæKàˆs°°ÈwÂË®’®ÁÖòY%‚GFX”iúºsç*MÓ§ê¥ýëxËLÛW©sm›'D|(ü]ú5_Jäï»È<æ‹)XE(Èg»$)H! Âg„2U\pYm<æ ‹˜`¥ÎSeÖ;ŽÝ K¿yŒö•ÏÍ3Ä`“m^Av‘¯…E& ^“@í$pu™™dS(ÈŠ?A ÕyVq-¡_›×¿‚b†À3Ö¢ÀZ˜5Z™¬£Dp¸ÛVB¯M³Œ”¾"(S\Õz2¡ü‚Û AmðLü ƼBïý™GÊäIù¸V3Y¤º!HEŠ@ClòU9BÖÁ @ð÷QTò >2Æ|áÎ#BbƒrÒš¤¼‚é3ßî|Ùc3&íAì'c?Šl–`ÇÁ Ã~;I8šë&›ùPšÏ°-ïïÄž¤Æ³Ø¬gTâf9°äi¾Ä‹ÁÄÁ•…૘™’~fò²¨i:O±ÃNL"R-ijVa0oDâqNŒ·lHÀ–(A?,gK,C×Eå ‡ãá4zæÂêG@Ÿ‡N{Œçë†FŸ¼iÚè´žšm(|QRœk¥êÜɾ›H’•Çá ñlR”™c!p“6¤­ÀÉJsJv G=CÒF€¤0™ÂÆlZ‰/þè<Á%:â=!iu­Ö¼ÂXH稔“zQ_Và9 C áÁ3½S´oGW.U§f¶®YÇòÕ“ˆÀ²æ( … <·‹/Ô~g®ñ¤Idó"N¬DÏá…$Ã6„2KÂŽ˜E„¼1ÞÉŠ+iÇ'xÐ>Qa¬£|.Ò.Ej´Çöö)ÊN­êóô q¬¸‘ްËÖ)½²Øáññò¾Öm·æ~W%ÞãxaᬹiÖ‹%¾7>%X›†åBîÀáp‹P1V4å“â<€˜zÊaw‰¿¨ƒf‹‚h‡Ì#IH¨ŒS被ôZB6A…p'Àäqàp·ÁD0À@"·Ë9g™ HÄI>|¶Iâ ùþüˆ€òˆ‚öd`H6D½¬Š ¥7$ÅTOÒ²¤ì˜‚n„Çý&‘ÛݳCà°°Ý I68«„ÿbܱðiÇ7nY ÙP(.k,‰Ò™å_ˆ ^iÅ‹¥ûZC*)¼<ùå)y$ÝŠ´'m(´lhäñ›¡D=Ábî„«ú!ùGâò‚›OkïõP¤´ÁöÓ+ð{J‰Èçdˆm$ãñïoN|Ú×öx÷/eLMk¡ìòr„·rd›Á0JÖl$FUÓ Cš°zÌ•˜¤`Ö\ûZÌ &‚ŒøM è<¶œö ÌGÒŸ=§ ÄAŠ¿)±ùôl¸ ßÁfwÒv;_Á¸i/ 3*í{ãäí#ÎdÞ­æl¦Y¾Þy…îh¿³„2_‡¢¦åðq;žÌú¤=»Îoå øÎسÿɳôUíBÇþ¶éñ!{øNØ|K½fžp]àô줥̈́fh›q /œq 3nŠæ‹n Ë+IX–Γ/㉃ƒ7³@IáO'/Šfƒ¡\–C1Žˆùˆ\‘Ü^4A²Á"œq¡`²ìÛU0äÔ—V³È¨®"£73zÆßöãºþ±ü_Ÿ»®jOM;þTª¯ÚSÓŒÏN¾¿4õ¹×xtשå»jÂÞvÐ?>ý¿_:­_î;_wÐ_èßX bxÆ­špëþòòéwbᣘl/e”@u7(S9mtnM®Ú¢a!VK×_ðicxÆ®š°·,´Ñu[´Ñµ^ýŸ6†gܪ ·î@ž6\:cyQÝP–•”l¦]ƒ¥.®¨îSLpñÖ6U»ÚÚ¦ê6¶¶QÕzç ¼­=>cWMØÛæ­mªfck›ªö:è/x[{|Æ­špëÄ·¶Q€W‚0§8É#PÄÁ|t•„fI„]ìqQº®×”®›-J×GˆýŸÒ‡gìª {ÛÁBéÚnQº6~& ôá·j­;§ts¡hz@ =.°rÞMµ(k £@›0%›.U([Ü)Ûš‰Ñ[³fôÖn1zÛx|¸¿à3úá»jÂÞv°0z«·½U~*`ôÃ3nÕ„[w Ïèí%Ò|÷:åËgýïRƒiÖi¶ ÓxÍpÁ'ìf†h®MØÛÂn¶ S{ÍpÁ'ìz†h®M¸uò„Ý,m³5˜ãiEÖ<¦œù—$`I»qÈøÜ䣲ˆ ®xý¥|Ë·käÍt[È›é<äm¸àoùnFÞ®MØÛ–-ßn!o¦õ·á‚¿åÛy»6áÖÈoùnAÞ`ÿQ–Üò$±WâuòÔ»dw'–´Z2•©JØ=É#ˆÀ¡aq©\΃GÝãVM¸uò¦—ù‡ s’²)rd<'E—䟓½`/â…<”2”“°5]ƒ­í}¸I ¿ƒ @@¨Ï¬ ËïYpA§Ö¬¡Sk¶ Sk<èt¸àK#3C§×&ìm‹42[Щ5Êï €NÇgܪ ·î@^™‹w~òªÃ¯w|?àÒÕê5þjë-üÕÖþ:\ðwG=ã¯×&ìmËðWk=üu¸àï;ã¯×&ܺùÝQ/ø«™ýÝ7ÀI‚*•€4š5ÚgÛ-´Ï¶Ú7\ð ¬Ñ¾kö¶ƒ…Àš-´Ï6Ú7\𠬙ѾknÝ<µ?»/Q¬ÍQ²œ,§Ë-ñF™²bþ‡òßn ÆØnŒq>ãB0ÆÍ`̵ {ÛÁ²=º-0Æv3\ð·G7ƒ1×&ܺùíáÒ‘<$ ”`BÈ({°ž$iUë‹|±Œð†€ é$>,9"X«"|Ft™Àüã=®x£º^ßu½|×µ|>cWMØÛfa^×[Àw]¿ƒøŸq«&ܺqa^7ò‚O¶ïøL¸$I(ÇgQÒîÅè°¦§˜¤¬ ù‹’­<ðùqá¹ G±Œ2ˆÝFqU&HŒ:”þ`½ÀOšu ˆ‹*ñ—X?¸¶–L`~(ÚáåÌ1™LóÓØpÕ–Ó®»K¨b›kioNE½$]ØN)Æ)BSR8ß|~æUŒ5Åšá¬9ña%å„ëÖ‚‚§¤I:w,®ÀDO³‚ÙiÙ \aßïU+©Ñ‘:¬b,R$1×Gñ»ÃÀ™’i=3È=À]eƒ7 2[M` ”(žÉZ$•©º…˜QÕêvÍI)ž}¤ò÷“'•#×[DN¢ßEFŦ|<œ511&ªUøh)ß*â…›H¹±(.AÉ<ëFtgŸð‡ràÚiȃ24NðJßç(…¸¬èjãÉŠ’º$™±3½Ã&K—’ÚÈ™fX…2IôÔ`„}Ÿ[3XÞ µMšþa®÷&—È!eZwÊ0Óð!ø°„(QóŠ|ÈÓÔKÖª·ízC”Hž²Ý0Ì'{ ^”ç)Ñ áU³@1™ ·´îª4t8£Z€VÁ#ù©óÃüþ3*·¤°Ï¸³‘G[Ùîÿ›™Hg?È›F xìN¦VWf®gü‡¹QUž¯ipncûó%³ \ŸA=‘„&€ðS9×A\kj/±b0D×ÒPÌ*)Aièüœ|1%ÀòÄ2 Š)"¢ÚFf€5e %×K†ÛÝ‹çåYR§ò®L¹>’ʇ8ÁxÐÚp¶3k±R³ãš¡^»u¯úóÌtëÀBtÐÚ&îN[=]? rÄMpd9±É@îD²ÒÃ\Ój‹«‡LíÌãþÉé8É“dCÆÃý‘ÕÑÓ ëqâ' \C ”ÔÙ$;Êæ¾@ ã3k‘·bë69l LJg'ÊÖ±Ý;’²H‚æö"Tò´þ1d8æ•åø’¿,¨ýAÚŒ ·0³š}a¤­@ivÐ{÷IºV¤ Ǽç{j:lÄ<Ï_! PàÆÁ[Xƒt5º¯í±ü›Ê®wô£Yþ5KB8ßü……:ï7:‚±‘p@qÁÓÖ™F¶ 7`±œ)˜ Â,B¸±È" ‘9AÈkÂqRI®xïdRF/öäè<@jˆ .àg™<éÚkaÊçûñ$¥xØ3ž€ .‡ªºìõ@$OkŠ÷“ñõÜYC/ŠâëŽÊUGIbùP¡Ü{ÅÖv*­j³ºç`vD~&rÒäïäÑNH-Ï1æÜ`Õ,ENyT„ë¡Rª:íí›öHi Ê,§/(áéHhÁ¶Æ“%"I@„¸Ñýè†Â’b¥'ñh¸úhQEÀ”õšuÊÊQã$ÂÉnR…–íÉ0ÝÖã®lÌBé_fÊ 0f¢ÏóæÛºÓ€w@”{†dQ#AÓ™F0/0jla8×^¹7ðÎ+xÇF ÓA› ]È¿Óä<‰©OÐ[ï€divÚ€ÏFÊ f0ùÃïÀßÜLð*À3 ßá‹•NnMW©ØšËM°ÈÒ"« ÎG ày«A Qà; »5¼:av“F#k;¡ž®®×ôµ…È€KIn„1K¼R3¼$­@A93”×A:#É-©„}Ë)yá|Ã;\s™r"gDJH@‰w½lÉT–C’Ï,j•]()ãsðù±$åAc×ã_ÄâöyúôœãØ„¹èä‚b¬pŽ(7Œ3ÂÔÝ©ŒcÀLO6Õ”t w7<Ê.êu¨=FüÎ,äÕìYR@RÜ`f}}¤Ä›/Iî‰ðP'DSG,z–øî PV€?SŽôrÙ)™qðy î.EA­¡$FgÕZb  ƒÐ%á Z²‡öŽÁ~zAÄÅï~Ò@Ë{çÍp}9Q'¸ç= ;zÇVhZùY%0TÿÜZ‚à¶Ó­Kì»çÒCÌ0óƒŸ0%¯>”eà9•Ø•¨ðÞ}ï!£%k>ªzÍãß"¬™$ܦ`ýî•»¤½¿$ ­*O0/ßmÜT7ü®kåÕþÁ­6L!ðjÃt ® ®ñw"ó÷ Q<¼NJyÃÏÁÌ7(~Æ‚ênñûɸéçá{T ¯<ב|f¡ï®kÔ4Ò\BW7pÛWN©rúúòOŠ0È endstream endobj 2121 0 obj 6374 endobj 2125 0 obj [61 /XYZ 40.7999999 381.139999 0] endobj 2126 0 obj [61 /XYZ 40.7999999 381.139999 0] endobj 2124 0 obj << /Type /Page /Parent 2 0 R /Contents 2127 0 R /Resources 2129 0 R /Annots 2130 0 R /MediaBox [0 0 595 842] >> endobj 2129 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2130 0 obj [ ] endobj 2127 0 obj << /Length 2128 0 R /Filter /FlateDecode >> stream xœí][Ûº~÷¯ðs(âM (ì&úP H€>}(rzZ4Ýž‡þýÊ–l¯I}”8$Ç´W uÌ5œ;‡3Ã÷üú÷ý?Û¿úúŸý÷éçÓ×]]ÕM=þÙþ¾{ý…ì*%Çmg*Ùþì¿ÿؽì_v_v_†_v¢9>8ýO¯'üíû¯»÷ãËwã7_Ÿþ<|úß^îÿ4üï—ý_ÿ6üøišïð ?v]ß>ü{ü ¤ÝðŸ×ŸƒÿÚýåwû_ºã¼‡ßµªïê. Œ—ó£âø÷õ£à]õ¾—ºmöBÈH3àâ¿ÿØý<Ìu¢êµm£Ûz휭Á‘.|Dh4¢ œícøˆ®á3Oá³Iµü@XéøžOß^ÉLzS÷‹àà‘ZYLavÁ,&!Ô |Fó¡wpCé襌¤•.¨eKИÀPW ¸RÕó1Å`rȜċ#  Ë©ÇH0JVÓܵdÝÞþ(ÈHŠ‚F›58´¼¤'É)“âò(Ulñz(PÃY9­0QX™Qá7µæÖUÏ|‹öó¼‹3w6]ˆŠn´,F{F ×IRÑøÂ&åöª“Íó.BE7âUtÇîüÀ-v0&ŽÄÆ–ôå÷Ûž÷Ü<ðé1,\ÂÄeX ÔiÑLµ‚=žÈg¦Z+ÙLa®ÂÒXヂ®ºÛDk¸ã|›aImXJfÿ7µËi[îÈ)§ùèÙ£lØH`ùÁ&G#Ò ÇS$ëæÆµpÓÖ îÈéí½ .VÞv,d&WÜ‘`F“ÓqýÒ¬¸î,º>ÀÒ׿š#„¨Œnºš ¯ŒÜj*5(i\ÇR_¾…¡­j‡±ÇIº )jë‹)\0÷šQšJŠnV,gÞ§• š «€ÏN6UWzx…ŠIx6ùÙ^(^Ž £|¶Ÿ…¯Á#¢·'qÈfЂëvéY!F”ÈÓÔY…Í.ˆÒÄ™ ãNó>MœY1còøÔ¥’Û“E¸|árôz=€aö ÌzQòpc€Œk˜C…×S„u¢{ÊV Ct&¦ ÄÅ(3$¶øN†•÷P­YòÈæ¶úlÖVðS„«Ë¨P4w]*› c2.° ¾ÙÎ#e{Û<Þ®€©û(Ķè¥ïeº‡Í Øö2¸—‘õ=tƒ,y¤è]ÁƒUx°+¸gÛÈ¢Pä£fMÜv/ã-_U²=í §‚Ù¹ÊÌqe«ê×—gDÕzh4¢GV–Õ˜òíŠf\¥[@ýKH­\N@ùR’ÒLèõeD¸ ©8ÅdÃ¥Ζ¥¡àzÙ€š\š9UÙÏ•óм&~U­\@}.Æ .©Ç#iKiƒËörê}Õ^+~ÜÀí0àp"Æ æ|¬ÖKé”8¥:5D°î ùK?BˆåÎò“­I–ËÛó(»7W£O˜m¹þxÚÞsš–Dœõ¿`êW8dŒc§Ã–‚”ÐíAתk{TŠ<Êž" ž,:F;­ð ¾|L©¬Ç9Eöœ%Ù]$iŠà¢ÑñN›ìŽÑ¸!¾èÝQS ×&ã–S„>9ê4¡Ê+ðyve™½HŠ¡!õY ðr@o‘`…™QŽådÐ΂<ÿˆºjZq½±=…Dka®;‚à‘eÿéœ=Þ6Ö³Iº”×x#¤) ÅgvT¦ÃT†Åuw(m(º&¦™Ï¢m'­b}°(ÀíébgsåŠ ñú¶F”pËyâŽý°f‹½)í[RÐ&æüv¢U¶p`H¥X/Õâ´‰d½œ»½ègMü¡kžRÊ\#®¯Žëœa4]µÆ¹‹¯F<ÃgzôÌäIUÎÇ«g¦h¥¥52i¶RN¸‚³—3:¯f{Bï©ñ„ ¯tâ"aª‘‰&zbÅ9¨ñ3Ÿ!0Ô60lbâ}5N¶;BM2&m¯¿Ï6å…QòÎ%9ÁÁ5„z‘{³oÕÕ¹:Ÿ]8ËX“j™Å‡£øþXé::= X€›²Žà]Û˜5NŸ;¸¾!wÈéÅ]ˆ8 ËtÞ‚7ž„,YŠiFâ”&é÷J@RTrˆœ®r@ Ý™=HrZ®ßjß`?`¤eU\LÚG<Ã@IGÀDŽ9̓ѯ¨ãvY Τˆ0Æ(0h¬ßC'I±‰ÙˆœðŒº£b=3ð5eUZž7Žo¦)«ç=lW/)­õ5¥){º²`bA{HÏ—ô¬›˜îVÌ-çFØn4Rº‹éÅd ªÞMÓÍf»^œ¶ž²ï SÇ·|¦ð ‘UêÔÁƒãæ±epÎíÏKvd¦ÐÔÜlX4)Õœ%¸8ærœ´¹8„4üMšoîJy´¬ø* ØOq5wÑ"¹ð&$͹5îͯÁTm}²DoZ_ÌC ð¼G[7æ…ä³ðÄ}nŸâ™¢J†ý,†ãc°0 Ûæ¼lŠ­§l}o¸½ÙÝF†Ü–ó|†Ô6‘ІË3a߈! ô"ݦ“CNYWÛG žtÓ&Si…lŠ«hÅ•ENYTZß-’oËo]I¬n)½ó¶6•æ3ÜpŒÒŽú抋›‡{ñz(ï8À¡qŠShšV¶I§p„KaImˆ1Ô›ùèÄ9@IgŠŠ~43µ0š¬ˆo~ÏɰRÒšCâzk¦Eݪó18“ºÕ°]k*`yçÌŽkž+Z_)µ¢íÈrçÇåö#å­%nÖá4WÂålp9I«×¶ªâ¸ç©*¾Y³‚òÙ.W\—W'ÌÓØ0gu¶0ׯ„”™´RLÏì–yLf¥¼ ÔÝßò bè;l ×~=»xºøãÎÿÍäïA±tÞÏh]zÓ¯µ.%§F'íM›æV‚ß8©ýüSÙ..(M£ÇÓ“¢!°£ÿ¢:[š,Zu»æ#Ê{ijB¹€Òâ,CŸØ›³gFm¥šÆRWEþ˜Že™Û-^|•$`â/>D(.…¹"4ô²XÒýw sÐâܳãZ;cÊ‹‹ò:%™/u{­wÓ5¶†=ÉõJ†6è°VYD×v]ºÎBR²4Rˆ¤Þ~%÷E1wàŠv&Ù<¥¸¤qÙIܲ: k$¦IŠû@rÄ_óïêu³LtŠïK‘ –Sº¼ÚVÔf­s™ ¥äµgd2ÑJ YB8i¯Ês]‰Çϸ`dý­9:ðÕ”¬€Óž#\eD8erÑ—ÂÖGÝDÈÜ ð$Ë+ýÎ;žÖ­¾VLùw+ºÓ³º0ë+;ë•I´-ÁS¹úƒÉuÎÜ=+"l{ó«µÊ9Ò¿«û#);HžkJÒœN¾•Lš´ š÷~Ø/Zˆð¬Sø­‚«Ó¶…6ýNÛ4G¿LQƒ™ƒüwzõÀ™¸S{C?bÉ!iÌm?Î 1)B®!É„÷Q.û$­+Ï™mðîçvV—r(vËTgÙhKLÂy]f Jy…|ŽØÀPÊ90ã§7¤89XÎûJQc“&.s¨‡bᲸÞ+`b®§,§Û6÷>l;ÿYÚ.Ëmý“Ι:)¯Ñ^N¹ÛcS°guœÑ‘¦ì(>Ý6ÿV¸;ßCòF“Ê3'LÆãŒæ:;a…´_™}Ã&”ÅLìWXD0¯»GHâüeÑ å!8·¤0ÕrîCxeD&/;s2y1±G=5fIN襥!ß´so¦rSÛF½RY+8m$ ½®âÿbª6WbeÉUNÛwñ‹« ¨üL“ˆ—„âÜ»Å‚Í ÞÊä8xyÅ ø-À±‚¤Í!õpC|î\Y–(à’¿õ­ÃVôìh“N5Žxþî_„ ë=<1ýøþÃ!µõµ_¼Èõ>ºH•®Ù‹a]s%¿½hª£NØ«úLš‘U›¦jæ{EôºrXh$§l«ÖfÈ‘íÚ™‘‘U•ªd?[šbLÕŒT±ÕüÜ{:øLŸõ|++Y«ÃÐeä#œmä¨×ß<Ãß”çÌ ?£g&nŸh‡=3Q,dílGˆàºÃgiÎ%L9LmÌ!˜Ú˜¯!¥ ñàïq<¦“‡S>…ã`R3?Š™®R}ݬñ¼ç#a=.Ɣøö@𔄿»®#¤k]˜×–%¡UÙÙýºW endstream endobj 2128 0 obj 3774 endobj 2132 0 obj [62 /XYZ 40.7999999 206.419999 0] endobj 2133 0 obj [62 /XYZ 40.7999999 206.419999 0] endobj 2134 0 obj [62 /XYZ 32.1599999 161.299999 0] endobj 2135 0 obj [62 /XYZ 33.1199999 159.379999 0] endobj 2131 0 obj << /Type /Page /Parent 2 0 R /Contents 2136 0 R /Resources 2138 0 R /Annots 2139 0 R /MediaBox [0 0 595 842] >> endobj 2138 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2139 0 obj [ ] endobj 2136 0 obj << /Length 2137 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èó+‹O‰@ÀÛr`Ø@A7›Å"^ÄÙCþ~Ô-©§Eê£Èâ£Õ3mžq«ÅG±ê«'É7úüã¿~?¾yúüŸã×éçÓçCÛ´ºÿO¼þ€÷àã¯]¯nNŽ_¿¾¿>> ÿ~?0}~qú1<œ»üýëo‡7cç‡ñ“ÏO~ûß‘ÿ<üï×ãßþ>üøijïô…o‡ÞèÓ/ÿaœñ~øÏõo§‡¿þúÃñ·aý¹ÝÓ¿?vŠ¡“†ñýò*;ÿ½~ôÕ0†ãà Õ@‹ÿþóðóÐÖe‘ŒuZvmh›?ï ß7>ö¬sštæÒKkÆô:G3ìL†”I±VvÞ†š^OàïÝôG£måÀ)yVU‰žŸ©(ŒÛd / ¥-‡ê:‘£™ÓhXÒ¤ÆUuú”CÈù³÷¼øîËáÍGs³/?£8ƒâøãË·ƒþcdÛ:þ¡mù‡?¿üzÛøAËÏtMkD§FTÝ|ÒÙ|À³ ŠÁX€!“á‰b(€µqÌ#<Îtð M#bù‚O8fï¶@©}<Ö$lÇÇríÀ†Æ¾ÁK€âd ,Rë6"l™õ°;?a|¤‡ÂaóÛš°ŒQà!0æ1ü::R ¤zÜF<®78*ƒ6aRô@¡ô̲®'”)¨Ãznwé‰``cöˆ|ÏB†c_ŒÊŠŒÃ7nEº’²m+:&8^G»1ü õd§cVbav¨·¥IÊÊýàõKË’|WZðY«ÖûL1z Žw S(Áô›ôÚÞ÷çYI‚VKÅåHçñ(hG Ú`ßplÓy3Q4ð(#,2ù0Ek²Ø%ÅqŸ¸s{, êÔÓÛ‚u»‘SW‚uÊ¡àeÔ) +ç& +WÄ*!ônØò¥©œ¼ìÏ![ l`Ü|åH«>ñÐ j3 l`¤x”7 “gÔØãÇü†ùo À+Gp/”`<6Ýx=èTª²`ˆ÷õ&×ÉÊ“SßÖíN¬[#*3Ef›`©âźO£„Âb™÷Òáw(jêæv|µ ÙüÉRÓ;Wzƒû^«pèuëI‚¨2Ó®eû3œº øsXœ±å€a¢$ ‘| ¬ iŠõDÙp-a?زcõ¼©Me‘ËÛH·¿³{ç^mÙ×Î"<"sÄÈf±z†™jkg*fŠ×ŽRßTq4kt…ß!Œšƒ¼[¸U²v4ï·…!UØE׎քÛ^,;½-­5ŸÝòG¤žQ­˜wK»—1î€^S=¬–÷Àk[µJ 3<°Š˜Ÿ«TßK©Èݹ}­»ÚáŒû¬ró,pE‹ËÔ&<›Ä‘:–j©è¤tB-;½1ݺ{جŰrÅùm<6HøÛ+ñ](½Î$mãÚwrøt›Ò˜ 7ç7lÌy‚ÌXæp*¶PÕ3øAJýÎ݆…{QÆÞñH=¥òÞ÷Çý<¢_Õ<ÊZ ÙS&÷¡=”ðí¡¸¯—IA¥z¶¯S‚ ·ÏíîZæ(²@QüÐÃ{7‹úêû\ŠrB[MQBŠR@•Cºq\¼½IPOñ›v?õU”Åzi¨5—ž§Ô=U´ùŒL©¸Ùy,Íèš7Þ£ÛTû|†¼Çr^ÎSG³Ü]°ŸY Ÿ—1ϲ—:QnÎÓ|ÄqÀøn%|ÌhÄRg9ŠR+ÏéöâP$2æº3ÂÝ×G5bD|†R6Aiû ¥Ú@”º97ümþ×ô}Ûõø“±þü©9êñ‹§ïŽ|=hÕ0fxß³ù;rÑ„¼î`øúøÿñ¥£õ²´;§7–ƒ¾cM˜e¿ÞýPê¢ÊQ}¨9-$fÍs ,œ€K^ÝÁõŽàFœ›~OOÌ)øÑGÌË€9‹“#ð²²ÛÖL¡Š³Êi ¿K¸<žtƒóË<Û;à8ùG½®A-Á}G·7e§,w–nžÓ¾y0wž;Žv|{|€yÌÐ]þy—`t{õVø*_Šçq•*Ir ´\ºƒÅ¾âèβ܇l×@ÏÎÀ¥ yÝÁìh±æhnwÀ×@ÏÎÀ¥ ³ì ¼kp9!âšÊ‡ÙašðÆbœû‡ê‹ xPnÎÍjd潇·’êÁÐEXH£sÄOInîf¬×½î$ÇÝ€µ¢¤/Ú„(è_¨áã…†x)ùŒ”ž/”^¬)½²lˆáÛH9}G.š×ÌFJÏÖŒ”Á°:h#åô³hÂ,;(o¤\J[*))Š.¥óI&3QJ$gh,)aPâ^˜ÀWã†gt ß@¸#‹¸ ®Sä!KÚ+h+7Àä!ÜU“À%㕃"Z€¹Çî¢$Sˆ¯c2%¸#Žô#²ä¯-M¶-îmÜŽˆ–)+y¬ZDcûBÚy»ëtÎ îÍœœKÀ_›—™Ëßam»ðwXËVüÖŠ¥;rúÀòwÎß‘‹&äu³¿cÌš¿czËß>°ýÓwÌ¢ ³ì ¸¿ÃÚ¹4éŠkбù‹ýJ‰áQÒÝ_?AG½ /cŸ{PձС#âê|J5|$ÛEr"tÓ›v«þ¯cŠkK @Œ×McÊÅ­Â6Žj§øô.{n  d¸¶í-ÝQVŒIdø=ñ)nvÞj®2¾Ã¸q†ñ¹ÙyÂwg‰¤]¶Õ[xõGLõæ~ÍCÓ'AŽy:ÂEQ^¹\Ö/]fÖ\Î,døÀvANß‘‹&äu“ ÂX·â‚°½— X.Èù;fÑ„YvPÞá—{ÅFar^4ŠY“AŽ¡¿P© ß””eƒŠ»Õ)b ² HB ÍÑ`ʇ§Š„1E"BÕæÀ§ [Ù–ÂtØÜó®á’¹“N. U!]ÓõÖÚDÀ=Ÿ²Ü¤ZeéeÞ×QÒ‰4l•ÏÒ—j{Û-FÑl‡­øwc3Õ/fÍÞÀ`‘TØ]¥£G16.9{ãthxö¦ô&לîráb¼Ñ†ˆHg@–v£orÔ£’-ÜþÞíGH#žårlØïŸ1t °-{ð¬4–Îð BBáõÕ"d),(RÊS©â˜;8ÄÍgÝMìYÚ„=”õÛ~F„ìz±ÝRtâC鎎‚(o˜…ò¯Æ¬Éª‰²0¢‡ôµÄn>»oŠ3¬9ˆ±ë²x´m˜f5.<:)‡J(IÜø9©²"ïáGüÄÔ’\Ïè#ŽÄJ1¤³wÆtWA´†/áê®2Oᡯ{këþ^%/)TïÇwÎã­ãx‹ºgƒ0¾…oDÇ'ãùP6ÉózK"äæ’ˆŠ¢.[Û߯S€7—ã•üƒùÂ;Ï´WÅ]î /“ŸF]…):¾Í£WW¬߇~™>·3ýøú-謢Ö=«è“wÞW·}T}dÃ4V+™nƤ¾hår=ôà߬ççŒl@L†wM·~€h·òdÔðB4ܬn’PªÑ£ú±¹h­Ÿ¾cà;#u¼á­X¸“XkmÔßן¼‡ßÒ+3üˆÞ™\ȵ' ÍcRÖqïL+3÷ilgHàºÓï\=ßmW®¶ç¼Ú¯=´€+ÈÁdT¯µWzr WxtÒ7ªŸ«“žxúùˆúab¾óP>Á«€e‚¿Í‘}¯ÙH‘`ÖÔ׺ £8~:ü¸øIÎ endstream endobj 2137 0 obj 4618 endobj 2141 0 obj [63 /XYZ 40.7999999 632.659999 0] endobj 2142 0 obj [63 /XYZ 40.7999999 632.659999 0] endobj 2143 0 obj [63 /XYZ 40.7999999 506.899999 0] endobj 2144 0 obj [63 /XYZ 40.7999999 506.899999 0] endobj 2145 0 obj << /Type /Annot /Subtype /Link /Rect [288.479999 294.739999 323.039999 302.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2140 0 obj << /Type /Page /Parent 2 0 R /Contents 2146 0 R /Resources 2148 0 R /Annots 2149 0 R /MediaBox [0 0 595 842] >> endobj 2148 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2149 0 obj [ 2145 0 R ] endobj 2146 0 obj << /Length 2147 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès€‘ÅE €ígÈ!€a99žLƒñ Îò÷#µ¤~MR%IIÝMð{%.ÅbíU|óçÏÿ<ÿû÷ó›÷Ÿÿsþ:þ|ÿùTe]Îýßnð¶|øµi«‚«þÏùë·Ó÷ó÷Ó§Ó§îßï'V_>tÓC‡¿ýíôfü4<ùüþ¯Ýoÿ;óó_ºÿýrþû?º?Žýõ/|;µªîùuø…qÆÛî?·¿õ?Ÿþö‡óoÝÚK¿ý¿?4µ,k4ï×OÙåïí§`¬ò¬ªªlÏŒñn’U‹ÿþëôS××u…’Œu4åÚ>Þu*Úîߦ> Å­.­u­éˆ…uÓ4"F7ýlXТX)gGD€«×/ l—xí(¨›ºlbts™ ZÔpÜ àu]ò(í(¬›¦‰ÒM?›wtDxËåe¼TaKœ: ƒTSŠ(ïgÂ5ÜêèS Ã_9ÌwLJワÞ|dR´=?ýòS7‘ S~|é–ZèX çç/?žÿØ1æêOç/¿œTQ)ÑT_ja¶¼À–Žóµð·þ3([Ø¢` œu)`ËGÿ•âY ¸Ò ~ƒ[ûçÆ1D?nì·@|s`œ5Æ*1Q”4ÛÌÚq~ø¥åÃ—Žž¥&Oõ-ñDñâ0ÂâÅÁ ^I!5Kàõ#ï¶Û’F-žmÏœÀÔŸ€£¤ÛDµËäiwÜp³Æ*µkÖ±‚Jï^Q€—ÂÚ(TŒ"Ì9ÄILý± ‰‘‚ùo=¥7ʬ1Ü8Þ9<H¢1ÁÇûsŒƒQUhé"–:ña¢Hv”£I9Lù(4ñÐãhÙÈûFK¼%ۉÅI*g´¤£¥hydð–ØÂ„–@ù6¥°ÍáˆÔ0€HG)Æ+<7ˆ|xÖytÃm,@grœmü ÁphF‰)–¸¢¢?¦Uû›µôÀcзê:(”jâMG¹È²ŸK[N²äÕøÖÔUÍ«[p-­‰}ÒܤÖÜϦ(­½iÖ¿:€ª¼eÚŒþf˜‰,äÐ`¡ØÜ7ærFcE%ë¶ß®)1e¬Øz@Áx–ꂳvi95ìÄÚY<žÙ+†4·¶¸‚›²~#1œpƒºwà ¶HaNÉšãÀwÛ¢U¥q††=gÕ4“¿ÏüDC-ư§à>^,p÷ø¨˜øÈJ• 8‘’y õzz²?êz,Qû”¬¨‘:/r,~=l­…8€ [»ŒưŇтº…oÖÊÍODÀbØxÁV¯ŽÒË3$ÀsO×0G÷†9²²¨¶röòÇ?®F6Âá8ûâRHÜ ;`Lµ ¾u¶>w‚<*>"\ŸÝ‰¾¸q"îV‘¿¨Òä/–áM^/¬ØøðÁ¤¥&•ØH±5Œ檄©Û­XÄþò¡7-L¦SÿÕòú‚†r²“ó«9°þ˜‡DMe´P¾aoá7 ~3À‰‰bà›–Z2ÓÛx¬:f;X,¸)„©16àámË€Vm!¹9ƒ4N ¿Áã8Öƒ{ƒëq@”àö®ƒ¿ù连»ÞŸôæ³v… 9Í¿d†a ·„¨9> –˜°¡ËC%÷P2cº<Ä„É2ó¶ß p¨§pZù’d ^Hb ÁÒ¼Œu½ÀZŽ· çQË”d^Î?¨êê8ëÉQ‚º·‘ÖÃKB2$®·«yÐÛñf.K~ˆuDýšJLŠÍ‘Ô°G˜Žè€.ú„oÚ€Ýí‡ÈVQUP %Œn’vŒCHGŠŒäû§®l·¡š) iôl2¨ÚúÐ:pCÈÜ¢œGÝÉí‘Ù!%VêÄ»î`@¼Ê„ÈÒíÈ`]ò)¥1tZÌkVN j›YÌ_à7Ðî:òÌY̱ݵµÛº ­ÅغÊ&†›!|ë*^¶ïf€c=bU\XsŽ`Àá7y·cïvð"(”ЉàfŽ$ÈÉh‘cU1˜JÖ ¥ƒ8áqð†Ào(¤.»Ì6s™Õìêþ å\´ì=[ÜÅ&ö/®wG‘"ÛvV‡;<ž"Ƨ&óD¬Z9!œËñG”õóú…³÷7­÷¥;¤ä•ÒYÄ~ ^AbRë±ØÆŒõûï r7Ú9ÖEÛr bÜxB› B€nO%ò"J†Ö2Çñ˜QŒDå$ Ÿí€a¢ìtÒGÁk®ÖŽ/I.I£¼+ƒyÀ•Y1Íõ‚ˆŸ‡ô7V;FÒ_PPTøÉK¯×, ð£$F @# ˆ#°Š¬†Ñ-š‹ja—ÕT<Ì!.L&³Þ'é.IžÐm$Óš’ØÌ¾t¡VgUs./v±ó·éÿUѶes®›ËOÆÚËÓîA=ÐÆ_OuU0¦xÛ²é©u!oè^þ/.¹9ï¿Ð'ѽ£´.”>ÀϧwH„Æí9W‹hì“xz‹×ñh¯Í £X!ˆqw*j„ØŒV¤½Ýµ¼™M‹¯œæÀ…>¶µK%”’*&uþ’-_‘”¿ÃˆŒQŠ1yH wQ·i#W€-îVC ´%×m)æmYrp÷À´ûw¤Ö…¼`´%›´;}Ì ´íþ¥u¡ôÒ Úr*rŸí,h?± åj¼œÚYjßXjO*¢{IªVçYQÍŠj˜<UÇ·4÷R¢³Eye‡ n!3(ŠÑU,]fF>'#Žjǧê¸IŠfýò°²â…F Ïݽ>ŸO sÜ‘õå}Œ ÖÁ0+Á;ÎÃz YC<g+¸ÒÌB”3f!Œ0Øþa渼#µ.äí£™£[ÉŒ™C˜¼bäÕ&Ñ¿£´.”>@r3‡׋Ø0· P™(áõ>T5ÇRĨ(iw1­)PÈíaª''²ЄG‘¢n­µMQóÕH7ÝyˆQŠ¡§·n´Lg™¨¾b¥Ì‹‡È#éÖ2¢ÄI0÷ÈÐ[u Nø']ü“íœøWÁ™ýSüëß‘Zòv€Iü“õœøg†—Š!¼T›DÿŽÒºPúéÅ¿k)â±âÔúfáîÈtè8×hDu¯Ýµ¹wÅmiì£û †QjqmÍJ-›¸uˆ£8]=ì&x<\¹Á¢¬ô¤ê¤1¤ç!‰»mÔ¬Rkfw—Ècù­-ÛZ[œ¢H1B´þbMÇq‹%‚¿µÒq0JÙŽ’æVçmÙufAØ'Ô€œe•ÌÞàÅ0s@'ùl Æp=­/÷ 0ÚÝBE!SÝríÍ>âÒ¨=7!¢–Oe˶¹O(ýö"óqeÃh«Vè«VάÚÚ°'uLƒUÿŽÔº·L«–Ϭº˜e°êßQZJ ½Áª½Þ’ý•²z&­ì¯\1¥ãÓò•¡‘ã˜Òú=©-S–sWžÚ(Ú¹G…âåøRJ°£ºP•µÎp<ô™áÜÉ%ÊÉRϰ“å\†, »þ!Ê]Þ‘Zòv€Q”“å\†PF†]ÿÀåÔ˜a÷Ú…ÒH.ÊÉëÍBÙ÷xŸç&ŽïÑ?þQoUyšT´uZß·V°McÒÜ;nð•ý¥ïÝ º;ç¸Þï’¦´:ÊÔ’Íâ ×ëøzfÇeÜ` ,ú1"cÂ#Ù”­Žpzâˆ¹Š°¸šÊÒfDªçâ¸æ¹I½é-«–6b® ˆ$®©hJ!/u¥³9¥ C)ì˜JaÿŽÔº·LJ!S3J¡ì†ÑèJáå¥u¡ôÒ+…üz}EV ŸX¶ÏJaV Iˆ“•»R ×^w‘ÔÐßêœç D¡¦údP.Ÿpó ñ åb,ŒQqùLö?Ý7ç‹fþ4òÂV}úۡǹìU oÔŠ¶õ‡u…8àaïó¸/×»ï:/,„eeš~WÔiEµÅ|!CJn𴠂ɶá×Ç9×O#däjŒQ˜×UÜ'#F[#èsËËqnŠV·@/>)Vézvó϶}0‰qésÚ† ÕN„wÜ+à’Pn÷™%ÉǃÂĵÞ-åe¦×G›ëíK‹ÊŸƒ[¥UÜVˆ¿[_jSö(¬¢C;–•9Rü)Ë*ˆ”|íŽ FEñ+¦00$¤ABÖ:: hwÀ»9"—å_VáŸCçSOSŸËzò°u Ž­LÎAõØ Á…üï!;Þ£øÉre Hì\©>e$ép±Ê ߉rc[Hav ƒˆ¤!«õè½»#‘Râ, ^Å!s¨úQæêcºô8òi¤` íb,ÐòôZµª’B4J˜L›—‡á3ê]÷åŒxÐG‹ïÆZ®# ér/ UbTƒ º°Ë¢ª†í!H‘Bª,¨YáÑÛ ^~^/´x wôi}§w¼)e(¥¬RñÉÝ#¦4¯¦6ïý]ö_e6—Íl-´¼W+Ü2ù[ÚLM.”q>އÁÎyÄi³0SsÜh¿ÜJœ÷ Ós9þ®ç}RrEÙªéÝ Ð71…Ý1-öµz2®žõ1ñ°í,Zé¿ÌJÿeë&Ã<&#¹>ʧá'MW‡ÞO0¡ŽBäÊ¾î¡ØQ¼¦_³êöÁ¯§Ï«»c¢Y=¤ÆÏ£Yª! 6é#1Q¶?jž¾7ÄÃI ZŽ  ñ¹åÕÃä¼â%†sB®Ý$’oœ{ö’´ƒ•G=vËtˆ&Hˆ›§0V¤S[Jooí2ÆÜµòÑ-S[‡wÄ ºË'>èÎò¨ÉâÖ'G¦EIj<$ ¤¹ƒä(léO‘á—’ØKiPû§õÞlt%Ü»‚Wð¯ +èxâI\Èî±Ïiê­yÞ8A`ãx÷”_+÷?HÌÐf®Ûvº}NŽ€›‰ì©ãAø00Ò&¶Èh׳¹ê¸^ ­µ˜‚ª²S&‘spn¥µˆŠ0lp=x¸¥Äsƒ-¸7‰×ƒwPÝY@|ÃâÀQ Œ!,æ8÷y²ðzgSŒ¸ï<§ûS ÇžFDZRŒ¸Ö:aç¶¢–e´ÂßËl·’O^Ç8„ož§%.ÛåeÌËÌ(3#ªÈæèí-«ð8X„+ ¸,Äë”8ŽG)˜HuãòÊù!‰áQ1‘Bß"st|7¸ÁdYi„.=a¹jg‰KMv¥±NõÜiT›M§aì@†E Âfð ¤èšYÌËb^ó6ó0¬ñÉrô†/iÃBÁx|3Ý» C«Å•}™F^Óh6dÜκ¶æîZy–q£›$$x‹´+6\Ôx³GÙÃwwé¼ú&n”ªA*¤²¾¢mÜÔ<×Åêá¤X&ïp”ù¡Ê@ù2îB%.tÐ’V-Þª2´þʯ(iìxA‘ÚIªŸo®ÑVSu·LÌ·Sˆ(a9X‚¨€ì5Î7Š¥šb÷Îþ¶lˆqÎ`\Ï&Œ¥©—·»=:$Äf,9 “'*yÊvb'Våp€ŸŸ; }-|l+ºbSæ!”iÐ%‡XõRnc5™`¦×åÓ7"m†…ì\T|pKÆÄ¨ 4Gn‰l¯Âãäd˜¬pd…ãŽJð†Æ’¸ŸÕŠGT+”º"ì¤õ¦ÛþiPkÊþ<xç²ðáü€Œ@a÷÷öm•½ŠÙ«˜¥èEÙ’‚oø,@YÙñÍ»0ñîïù{Ç­;NÜ¿0þøúÍ«&õM¹ëONÎïütQdhë3ë–1ŸÅêâltådsÉ^]õ|½\%‹27-ƒù‚7E3q_3Ó2°! ®f‹WUQQR¯- §…ß(øÍ€ /xy‰ä2Qw®·uoŸ¼ÀwǸ´™~DߌµÝæZZÇSæ÷͸c>kçv9X×ÿÎ+ÖèÇÊk·ßà݆xí€ÜÁñ¾Ä™ŒE¯æzƒ»Žg=F¨ÏàèH’«¶C ª-Žq>¢qØ :§ïÐ-xð™ào£`dÛÖl€ÈZÔ¼Mþø“œ?þSiœ[ endstream endobj 2147 0 obj 4781 endobj 2151 0 obj [64 /XYZ 40.7999999 140.179999 0] endobj 2152 0 obj [64 /XYZ 40.7999999 598.099999 0] endobj 2153 0 obj [64 /XYZ 40.7999999 598.099999 0] endobj 2154 0 obj [64 /XYZ 40.7999999 140.179999 0] endobj 2155 0 obj << /Type /Annot /Subtype /Link /Rect [222.239999 149.779999 293.279999 157.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2150 0 obj << /Type /Page /Parent 2 0 R /Contents 2156 0 R /Resources 2158 0 R /Annots 2159 0 R /MediaBox [0 0 595 842] >> endobj 2158 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2159 0 obj [ 2155 0 R ] endobj 2156 0 obj << /Length 2157 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðsUDRW (ä$úP H€>,úPd»-›EÓ}è߯lÑ:¶¨—á’l'@ΉiQäp83œùføæÏŸÿqü×ïÇ7ï?ÿçøUÿ|ÿùPeSŽާ¿?\ »BÉñ×¶« ÙŸþ¿~;|?~?|:|þý~ÍùAých¼¼bìð÷¯¿ÞŒ/?ŒŸ|~ÿ×á·ÿåñ/Ãÿ~9þø÷áÇOº¿Ó¾º¾9ýòëø‹Bvî;5þûð·?†Ðû=ýûCÛ6¢—QÃø>=*ίï*}[Êê(„Y´øï??}Mƒ(úJˆ¶©ÚÒ·ÏVû¦:íÛæ(ËÞèÒ˜—OG"ª›¶T’¡›óhDÔ¤DYµÖŽhoE©'(ª8JMÅu#EÍÑÍi4"jR#Á- ^Wå8ÁZÆMqê(®›¦ÝœF#¢&¥ Ž;"¼­FÆ”ƒ$šâ¥£HJõMÏÑÍi4"jRšà¸£¢kd[ÕeßÁß=GÛ•ª;Oºn£f=õG¼®ì9´Ãy4"fNãà~h,߉J Ñ6r‚SGqÝ(¡~ˆš”¦7îˆHðªÑB´®ã¦8u×MÃCðÓhDÔ¤4ÁŽ>qX±òÕŠýnyðݗÛýÉ`ÿòó0гÕ?þøòí0h›3¯QÇ/?ÿX–ªùÓñË/‡¾h›º‘õù”0¶ÈöÜÒM”òüA[”½jëòê«åûsKõú‚_mæ½~8P'‘NÜ ÀÒ‚GÒ[šBŠî¶Eôó#™OXߨÇyÕøÚÒòl5v¤Ñ‡//Ä-­¨NâsquESÍ–÷£^ÞzN)Ñ¡–ò|¦…- l½éõ]h‘ø8ÍA£ÆÏ`ð­#Ú¢r°3nÑØ^!ŒIÙDx÷Vð=pšÑ˜åˆÀrkÞ«ü@‘(çÏB‰ƒ{5×Ϙ8&4x6!CVƒ¥vÃ!ü‡2$±>z/uÀK¤1šÎ”󌉿 w­…ï {Ó­M2Α ”0™–À˜æ,8VLWcÇ[¸/“ŒAm<‹e­8·yiÂæe˜]°bÀÏøÓ$`!-R¿o*C¨S4 ÿŠVj¾¢þKìÜn AWÍAˆH Іþ_ÕÖ¥…’rü@”EÓžy…$b°Dy;v/Šºjnº·Hj‚MæfS„’ŽÕBñë-†ßý5ƒS¦´„ÆÓs' `"Åœ«Ô–Û¥`šÀü½+Ô–±âgü¥ºü˜—Œòeþ¾Fò÷d$µâR£»Îw³RDuˆá`áMê®0†fÊÌnþÓòн}¸Â1ù˼mÉb°òÈt^¡ð‘€ (=|¤k‰}ÇL”¬ã`†Çñì¹½ïPºm¸zK¨ˆÚJÝ*"’Ž6* ylX 1g·¡@ñÞRv-ö1:UT¥gQt}yÿŠòÐÀ±*C7ŒÒgÖ‘¸ßjëë U_¦ÿŒG¥‰G-½§B-ª&¼¶¨>|”–¶àÞ*áã–•õOa PšýÕÇ_÷ПYƒÚ(õe^¯-oáÐÞA»-=˜Z´3cüí|¡æÑka$ÆÌ¿!ç+莀‡v,‚Ôp#>Ì A€Ç„`- ¹ 8«³­ ØXZØ5¿ä€lÙTNæ2g˜¦Ø~c{¦E61‰²Œâ“ûRbŒ©©)QиÝ!1ɯÉiÑ ø$ýc­Àc±G@bC`­[¯NP‰æ– –p£×BÞ—7åt[9&«Çdõ+‡#O& d²¦V‹L–ô•³õLœû’g“7`¬Ç˜gFÕ›$n©á§¢)„=yY€‰’’ÂOp–yŸà|T„%£xòú{˜r‘Œ]‡'ìÞ±NvÐéäÝT,f!>«c±ÜlîLÄ …ìšâUíMµ]ºîŸáJŠoŒ'Fˆ­¾€cv’(MHÉ‘Ìå±Ö«8fQ"™Ãb$Æm,&éè’Üb™_€„­p÷þòך&3ì×çÑ´òv»X®0æâF!í͉SN™p­ú9ü…«÷!?1h´-Vû(r Ê?FÆ×ëf‘ R¾²™¯%›µFC”Mpö ¨»L™9¥‰f9 ê/Áª\eiÒTå (iã²%“»T9Û`­yÁX§ÑKÅx–üë¶$v™Ä8Fb\i¤ÁS¤op|7eÀ_U·àqý ý8`á$%ËXün,0c$Ø{èŽQYâëè¼%G¡V¸„ÓÂŒª.ž)T”ÉŠKÞO¨ogЇâr§”»‹B‹%.¤HH‹ˆ;’°vY?i`y!`^ÖR„(ÐÜ…8cîØÎxsçœô'Vé1Jéy~ [ ¡ÄírÜ™/*9@¨b¥Ä5ž_Ä©Å{)Ã¥–=Iº*‚–Ç rÑ¢ÇqöhfDYK¡óû¼„cµÊç16!Å»Ÿ^áÔšéÿ$ ’¼noJ%Mö=âCI:Àn 0¼Ý:‹Åˆãà¾!ŠOLEÜ'ˆ¯ohnÒ'ý7;ÈìéŽ-¥:d¶¯lHsº{ Ášå`¢Öq×ÞØ—Xº.1†Oñ™1I0l‹IàñÙÙ«oƒ”R¿ªoÅþ¾7ÚjB/@’Œˆb#ã{)qAJuVÒÕahFdìë^{Öa`Ÿ×r&È8= ׸rj뙸bZ7;D·X²¨,®ºw\Ô°×rVSìÝ× nÛÛ EUª[7!GˆÙâ<%,#µlŒr¯·hj@kZÞ•íŒwŸt‹W7˼›ò•óõ\«HL€±¥W¼M §ô€\nTŽrw ÔÍ£ä$Œù…„|!¡ÝI¶!¢»µ2çÊï'ïøY+ã^¼æÛHY†G3%gJ&³ÏêyyÁ>Ø:¦LÖÚ_Eñ#ÔÃu¿oÙ³ÓeUh:K= 벘iœʊà¶lx÷³,éät¬_J/€·¬Ê+=j^%‰rW­ÞLîI€úbQ Ç¥œ°Èaeò;÷ËåOû®Râö´ÐçÙ,ðIU´õ¬…òL‰Ÿéá3Ú'ÞOŸ(M¹²]ÈWßÕ›´¨ôòÎaéüæ÷¨·Wר|ø=Ú†m eTÏš'ÕYl\·à¼ÀùÀgð{,óÁ#€tÓ·& U´óà±I4}5åÂLq‹…ðàúà™âQ[èFàѪתEΣ&–5弉tQЍz&F,¬G!&.ž4î-Ó=6U3!DýqÓµÖÃ} ú‰u¿Ï㨿ZV‡Û€d-ÌÉRV,Ä„¦à96FT¾ä}%‹8eDJ=3Æ_%é‹@Ó×ÊQÍ>W& %IõQRC×Èš®sæy¦r%<˜{Z9a¬¼5Q›Põ²›u8Jhò8ºYòߢïþ‘…˜‘¶|æÂe";ýÙ»kÜ»ƒ` 'FĤ“ð*N,¡üïlÐË;’¢´Ðu@,…õnoÊX™C¦@zqÈ䮘V^ô´·oT¬ƒóô³x0ž~–§ŸeßHâí Ò0óõ¬õÊü«fä?¶·Z$¤ ¯ë‡ÕèóÒ ˜°eCÈ’˜”p¼JÀ„u†w/"k2÷-šng²9=”€f¥Ö0Z×*r RH)´|n掂'ïBÊš'­_zœ¤˜)«=8Ë-²<Ÿ½~Ü0÷&Ýè;Ôðp%¾-¸ÑÛ¾ºµbÝ™Ô åæƒLòt|ß_ËÓ)o5Iœò\kšIúcIÑYxláµ&ä Pâ¦Ýè§ytvQ˜ˆxÚ˜ˆ –¢¹˜-qikÊ|ð°2"lM [b‚i€C#Xíf¢VïU@ëÏ”-<äÞfõj#ZåNw‰&nú( zQÐŒ°ìFŠñ³á3ÆúŠ?㱯/»,IÆc_/ÛÍÖßõσçZžGE«e·úQ‘BQÒ±šEê` ¯|…¢”£"^mü ¦¦5希{£¬é¾7}6s¡õ²˜Õ%÷xuä]wz§&¾1Ö¸«ðrà`V‹XÄÚY’¾(vCôrÙ®wÃ!-÷œp0A’ªöŸV æŠ,â !d¢“à|¬'?nö_x]«*î Z»þÎ0TÌ,(øêõ¯}Ž@CYúî›Ì(Å^®J¡H–1ÔL\½RŒd4sÁžN„McÃ$*ÅvWJ|]YÏ6ë'.$®@ÎÛ ¸©ŒU}ÌMNôê×ru¥˜ª6§Uø0È®’bŠßyÔ<£lÒ€³>KFÒ.5‹!¼–ááa^øò+=Uª[A²Å4VBNÇ=É-_£Ô]âÌBŽZ‰$S!¢²éžá!™H¬ö€;Ý:[ÎCW¶î‰Ç³\ph ‡|Þ†@bˆ‹€ï!@)`E<6 ÞÒÀxÃ3å Kâ0~ i[ £”°1ªgŠt íçXý}‰ËÂF˜ÞgŒÄ÷‚°7Lå•äŽ-ÛkW°`áŠ;9To±šGnG¿‹8I#hÝL±è#N[ „e Ž'egŠˆˆJ,êÎ éd­t×ü¸òɽŠêx+¤"­©›ñ-Ú©Ô>ºà#>Ô0ª–c>*Ã`¤c…ë”ü4NwŸèUL7J¾sÛl n›ˆ«'¸å*YýLc³®é¦ÓØ:©ê,I¾4¶NÖ•›r‰´]&‘ñ&]á„=JJÅ\¡¤V±Ö¦·Ð€`”<á”´" H5=po”X 6AáØ(-¼æäã¤IåK8êdS®jÛuÌ;9Ýñ±~6•š2»´%ªËÁw¾Ë™ l†Ü[Ìá4³Ô¤àñèÝÙ1.{#†føZ2x-,.úî–¯víÀHy­ë( ^ Å%s2[Œ÷3`#RŠo/ÍåjÇ\/³¸Yæñ/þ!òyΣ²eÑ´â6ràoõ÷›S`β&°l!ká]J9{˜+F2‰Ÿ‘½„f¯ò•½N\rb’¶8?ÿíP×êúƒ_Ÿ-*d; *Ù* ›ÁD^”?›¿gP•ý¢hÎdšîõ–“Ö+Ç?s¶žµžð™=£ÏLBíÜ:|‡zÓ¥Û5‚Þ—4²ÿ4uEeا°7½F ™§-Ô-¤Å^S¨3?\·à¼ ÷àQã÷Xæƒ{Ët^¨äå`†q €ã}¡·smB|^îkécÌZ‹€ƒ×î=7?ÑE'9þÇ“[!à6hŸ¿@)à>9¹è›)&gŠ!Ü6ßN*–YÚ!À7C€û’v~†CAD%¥YH|Ø¢öŽˆãV)’â„8…\ä?­Pj3C S–ï%ã}9U¬84:V6¡ îT?Ôþ¹oÔ&áœnV°b-¯‘Ä44h$?:9ça ÏðM”þ¬[M—ÅS𲬃¶ƒ~߸—ÏÍQt&ò¤Œ8É[?¥‡YãQ,2ֈІÛ|«ô#•QC$ò®ý‹ñ_˜¶¦&wÇ?>bÜIüoOЍ¦Ký¶Œð®($P_›@*×Óµ‚O¤òH¨Ëµ(-¹øm¸çó߇•Véôýãë· 0øU„ý“•+¬º#ÃÍQ ÓX*Ô‹¦C|ªœî2Õ!æh–S“ûª0$÷¸l²-Úåcx»Ð2ê¥ ÙÏ*hYͨyæVÊÒ{:øLŸýO­,dy޾¶¼ƒ½šïú“ø]}4Z˜áGôŒÖèK-ÍC«ô°gôŠ…Ì]í¼"¸îô»¬Åtg^9¸Ú–gðjC¾¶Ð® Æ -Œ@xK½ÁUÇ£ÖæÓjMTwtG‹å=Ñ{Ä Ú§˜ï,Ô-xðžÐu>b9²ë1RÄ—5Åû§8~:üõ0* endstream endobj 2157 0 obj 5116 endobj 2161 0 obj [65 /XYZ 40.7999999 321.619999 0] endobj 2162 0 obj [65 /XYZ 40.7999999 171.860000 0] endobj 2163 0 obj [65 /XYZ 40.7999999 125.779999 0] endobj 2164 0 obj [65 /XYZ 40.7999999 321.619999 0] endobj 2165 0 obj [65 /XYZ 40.7999999 171.860000 0] endobj 2166 0 obj [65 /XYZ 40.7999999 125.779999 0] endobj 2167 0 obj << /Type /Annot /Subtype /Link /Rect [328.799999 559.700000 363.359999 567.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2160 0 obj << /Type /Page /Parent 2 0 R /Contents 2168 0 R /Resources 2170 0 R /Annots 2171 0 R /MediaBox [0 0 595 842] >> endobj 2170 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2171 0 obj [ 2167 0 R ] endobj 2168 0 obj << /Length 2169 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË")‘"XÛ3r0°9Þl‚Åz‘Éò÷#µÔ=ÝdY|HjkðŒ[#²X,Ö»ŠïÿüùÇý~|ÿñóŽ_§Ÿ?ꪖõøu¾ß]À»JðñWÕµ×Ã×ñë·Ãëñõðrxéÿ}=0yzqúÑ?Jàò|Åj#Vª±r¸¼¢·?éŸJ‡J ½‰ãÜ{ç‰`¦ÀÑZœÇñÎs†óS‚Õ(ÖÅX ›d5˜©îLhOÒ²šBÖsv›2¶‘Rg;­þém®åGuh¬Ø¾hü!Áö…¥;c]Ößh°@³©‘a¾DÊ)˜-I$Òä.!~À")Ų)­l)S\ä—PJuÆ”KÈO×6èöî6Pœ3ñ8¸ o%ý‡Y=9E¨²?Ÿ0’4ËâÜMÊíWv%hCJPwN^q.2°E=ÛáãæŽP:e'3•Q,„”ÁÄ4ü?Á¶ÉûB¡—<ù ª6ÙNÆÏ.·/! '9‚![¾ o®U|a¡4/¨ÃÕ\”„)ÿD’‚Š! ð‡lqŒëÖ_ž:Œ@øŽã¨ ¦Ù üÉ<ÍêJ*vK—γC„±ÿyÀ@G%ÿ-%Õ­ºeìØc´ÍŽ$Øl‘œ†\mŠÚÉÎK“G m#È`k¨ÖÝíšç] !u1À˜Èœô Ä2ûˆ“ Ín²o)ü¼1Þ\‹N(iðY-׌;ǵÁvv+vy(Bc/•ÍÄ’åõÎÈC}žñQòõâ{—£’3…PUûÖ[wÌÄ€Øò唂JÏìpH¹m ·ɧ"SfwŽ–+ù“§”Ú U;¼mBŒ‰‹„dgϾ‘Šé©×¹’RÄrn8«×@’ 8B¡¤£½CD¬9À©žØïHIÊžOŒÑ$ ÉJ•>Ì»mŹØIÉöVKRêAt„ì\GŒ'Gô8§žÜÊžciä8è°t?šR”¸‹Í'Êdâ&‰n:´Ž<¡¶ïW MRAþ?è†ÍËÇ)ØtÏè³êß…"ÀP$!§ù’[WÄ´Û¼…y7a‘˜_ë+‰Ú´ß*ÆN QY2 #ú¦­=?ÚíOç-‡,Õ f­WD Q"¹0DÉÕ”×cÞÞµ4~â F»F05IöŠu ’„б¹@ð@0#ª0¢ŸÙ·…XØÓÓð~oæöÿ^}ðëás¶Kœ ¥]›êï¬î—§wFˆÃ‘V⤄×kä5`ö¼|ØSxÓ¬s}„Šõ÷Ѭö@/n'ûàRú–Güº‡iÆôü)Á]£pç,BWpQ$ bÏ#Dt³ûóhû­æ‚º"Üž‹¿¿mKsÆn·ú^ªKÞZŽmÛ¸{n†Æw?hÿ«¹î½!¿å%YJÖþ[3,”e©ùå²ÃÉùî“e9í6çí~#ŽŒDffåáTM& Soáðø Ÿàw lÜÂ…6Ùo íämd«²SsŸ+ÊHWÝBô Ü’’óîÒ~E!p¬¬³H¤i )‘ôNž€ûfÂó9ów! ÛCXP¡|\;=]´æ¨ifÖ!Ö_Xc|œ{% ·˜GºÅŒ)éTVÎ炸Ÿ|Š\Rœ1‚{4„ÚeÌ22&gË@­ !°Éþévó|;&‘a=8¡Íš}_“E~¹Š)²¦³šß=(\Èmu)»çÆP!)Ž·¿Š­jí¡à5„‚Å¥Cëš#…¢…£áP0nL²†x †œûÞãâÒ" T<0-UEDýŠ WÅÜ^…óD]~0s€ñ@|C”½…næNL.+&Ø5w{*% fÛ-|œµ˜]BâËè`ÿŸÙ'%Ò°KNÛâÙ¼töÊ¢ÃÚ†!þaÝiJòc«ÖZ_Š…€²K[§$DàÄ}Ë>£¸l åç–ÿjÅW%hüâE/IÃ)²’„ÖJŠ w<üŸ¼œ:ûÕõWL=©÷™ÒxöáÝÐKµßKZ6•ä ´¥;Éï”EH!ÎÛˆ’K‡òp>¬Ø GÝ¿²aouÎÞµB•°%BZøŽ~HE1>úØS>¯ûmQ”ß´ìšYÌÚÜÇ"瀴€MPæÉ"`ÍË–’vÀÙU‹ÌªEšVy„[ŽfݬÝ 6Ϝį¤ÁGq<Ùà P7¦˜‹jå¼’¨fÆV­®µ^šAòpbìÅÉ+”Ò\¡£¶ù[ü!ý¸šÁn1ë2i-¾{À‰ó¶ü’kuá¢õøe‚ÝTª5žÞià;½#¦nðªÒܸZi2h«fB¡¹—¬­Æ­¼Âí¸c¬®F®ä3Ú9ÍùÎ<ê‰Ðe%F®Þù„ ˜ô¤{°A&>qgž©Ú©­¸É€ßdŒ¹ V(`×ÊsEœ€½çÒSœð7SŠ‚LŠŠŽ]æ¿Ì7Ä„´Šµ'¹ hr= †Òuó`DvEv;à"ÏoêKŸð-)|IyO€Éåß½1äôfJlòT\6;ʼn–Ø h¼™%q&iRµÕÝ¥©|±Újü¬Rž…÷ê}q]1Gój‘ µÕ¸º{ùŠðRuÒ·{x/©„Ò ŒÂý1WÙb„iSbu=U×¥Œ÷óXu‡5Céfž/’@0UìúÛ”Ž›š³^ÄÉ 6¿ÁVÐ+¨ÇÉÜþ»xQO„ßü;¾Åk)o|Ú6­»j¶)Õ¬Hú‹2ÅLðpÔn$mã°Ñv0•¥DZJÝ»øšk~XóylÌÇܬ˜N@Û—e“ßts‹†R¬Æ- ð“1mŽ1ñNç,>_>gaKm‚»§W¼$›’–)“(-ÐâL²Å¢|çÑ:±>¡yH‘ ^F·ÑRxj*kÍ«±ËìÄÏ )äKÑʤÔUV…Ò³8fŠçˆ?V{™$×B%Q"òô†Oâ]]W™®à·ìw…W¡dÍå©vÄ­¹çÓ|tGqi¤ÌWÝbºÙÃyM×ÐÆqIˆO±%±Žh]ŠDa9½âÞWæ å,Ë•¦pÚ@ðm¹VÕlëâ ú~zUC!®½uà_–…ýðþØ5œ‡Ò’w£¾Þ´=±×ÜÁy8› ›…go᜼;ÁйÃu3äþûøÚ“YOBÃL?¾~sÐM°õÁ¾8IÖùê¼sW{z¾’ÐLV£×NÔÍ-¤¬äý›$uSYòudh\Uê~³@uçɨ% Qq}·P¶m+9Êë·' ÎÓÁw4|g$Å+^Ÿ\©æA¸7ÚHÔן|‚;y3ï¬ð½3Ù<÷ž0´ŽIy {gÚ±µO°@Õ ¿ó–©Ûã´ÛŽwðnCºvàî o“•uo4¸ëêIߡѩмí*1šOó<£yØ'tN1Ý9°Ÿà]Àgb ÆRd×I6bÄ—4ÙU»•—”ràørø?¥½ endstream endobj 2169 0 obj 4260 endobj 2173 0 obj << /Type /Annot /Subtype /Link /Rect [288.479999 706.580000 323.039999 714.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2174 0 obj << /Type /Annot /Subtype /Link /Rect [266.399999 274.579999 339.359999 282.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 2172 0 obj << /Type /Page /Parent 2 0 R /Contents 2175 0 R /Resources 2177 0 R /Annots 2178 0 R /MediaBox [0 0 595 842] >> endobj 2177 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2178 0 obj [ 2173 0 R 2174 0 R ] endobj 2175 0 obj << /Length 2176 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âC”¦§§ä Ñ ä°È!˜Í&Xì,ÒÙCþ~$KvÛ¤?>ŠÉmÍÓž–E‹Åz±Ÿþüòý¿~ßúòòŸý·ùç——]]ÕªžþìÇ¿?œÿ‚w•àÓǶk*Þöß¾ïÞöo»çÝóðïÛŽ©Ã‹óááqŠiÀß¿ý¶û4M¾›~óòå¯Ã§ÿíùþ/Ãÿ~Ùÿø÷áÇOóxã¾ïº^~>0Îx7üçüÓøðß»¿ýaÿÛBwwü÷‡®®¥ì¢Àx;½ÊÏ_s HjÔž1>|ndü÷Ÿ»Ÿ‡ÁNPT½d¬U²­}mù~@w×ïûVí‡m0†4æ3‹fX%ëºøq&pXÔªX-[ë@$Œ+äͼÂ> åç#EŽ#Ç•&g„‡E­ë€tëHT¬Ë~ÆU­> Ö•J´{ýWë:bDÅz;ÆqLF®ò4Rä8]×$g„‡E­ëˆu<뽘ÏsÃ#Wy)nV§àê3<,j]G¬ã‘ˆXgœ'ÂúûH‘ãˆ6 Öð$Áºe$*Ö¥¨'¦1u¢°UGŠÅ–JÃað°¨u±nŒôœB©åïJí›åŇ×ݧ§„nTá_9ØÓ×a±ÍðŸA»6þõ§ýëZ<þiÿúËîëëföYínšµî³öU3p†f2W¦'¬COjß‘è‰Ä£Aj _à;OðEÀÁçpØjF€B€¡Æ±øþ@ á-í®â@@\‹¯á°•:%¡ÆtÍ!Þ0í›ê‡rœkP©œðXö1)%qxj9|gÕ\ŸÍÛ¤å¾ ]^]BJ¢pyŒ+ËÄ‚Oõ"Á’ŒQC`õ‡(-™Ôí¬e4ƒ^Œ=¯õoLGUœu À B隯†»åÚ‹¼¼IˆFçÁZùÇð'!ƒU(°úåT˜r²aÁ4ìš$갽祩¸?…Üõn7¢¿¾Û‡9Ïe†‹ˆùAà‘Bƒ†«2ÛäºQaJ1=Ö ,j‰¼¤† ÿ̼wÑ8b‘×Õ8ç÷Ð}ö‹_w/Ù¼hkG0¡eš“ë*¥Éް¥Ö<°®!˜Í¹Ëti®“¢œ9sÕõµr¨°Ê„Hè ‡…®¡ÆÊzoeC"… 7ü344üϺ«:Æ m#Ëüj„}aY¸¢Á -ÌiÉ鼚Z¿sâ|ˆáá?_J™¦î'1×ð‚¦ foBTDÃ4áÙuÜY.ˆ.ïÞ¸•z`5vÐà@¾‘'ï"à„g Ê 77/˜’Ü%§“$¹²\©Y6Òˆ 3„qsxr Ó¸V½)~sDIÆLþËÒ¾ÑLU–ó˜ÔlσSèÐ;u‹à<ù[Õ\ Îy’„òÒEa?!IºÊ`2(ì(IYCJžó_N=›n!té®TÚBL™LVÆõ–QÐôsŽ3A³Iþ­9‚e0O¡¡¬yÓòè Fv€ ðOñÏä Këø&ÈÅ<úZ¦ú+q¬s?s¸ªå¸K8¬¹Æ)SÄÙˆš(¯tSOcZ¬ðÈ/7MóR‚šEª#á(èNÉPk¯8˜ ‡2á«ÂUQv§ä®-ayÆÈ`§¸v(í“åÃv-óàÑðÞã`@uɰóNñÂ;¼l@—Ãv뙺M¹Å¢(E1vIL•¹›)D=v.ÔN]Yæ›ÓÆ©•¾¶[¸íKrÀü«§ÑDA9ågÚ6—Œ0}`5zÊyæˆÚêí^óêÌ íOä–W¼q/¯ÄÆ&î›¶¸êo gÔ$íéVʰ·tn£t¯ÃyMØ`_yײþÔo±˜iv“¥œ)Yˆ’H=Ýç5Ý ££áÒª,3ë©¿š¥ë¦Rœ3 yW1‡émʰB}IïH†ú’®ZÓ[¾;ີV˘lZ’V°IQÒ¥ÿéªOFI}AiYÕÙ]ÿŒ½79šÄ“G¿Å;B\IÂRuÿL’´J®%Ì#…ÆßÝhº7Ý"yzÓP‚ˆ×ßô3¤ï„hß®…i fJ[*“'1’‚t0b±Ã>ᆄ_.ë¤ng·HKF9åÒŸ‰ ¡Ê5D –îÞX¼BÆ ïÓ´{FØrr$“‘JÞ[N|àì‹´œltͨ@ËÉFêsR®Ï’ö‘ôÈñ/”úÎXs ÈJ“¿¶xZPÞøWSu ¨ “´…èÑç¥æQ )Qù<á¶I!o*˜gé,òăçÍdI“¸šd›ü{ÔZ`Ì¥2U:™NðŠcQ>DŠ´yíÓ“‘9á= A;M®«ÓÛ’¤÷J€ H Ú+%úJ;XI]‹œ¹ê¼ÓdLJæEÍTA+Y° ËòlO6 5½!$-ò\¤ðHc!ÏzÂ+±”ÐwiV½V»>!N#; ´©^Þtº¯fþ ñ©Jë× iE)ŒáñH*E”¢–ŠÛÍu¸×_¡š±¢zÍk}©”»LbžÓ£ŠÂÍ›’Þä¿,*IýÀ™ŠT$)H:£$j»^—D÷æK›ršÙéTHM+U`r+Xœµ`q»ù”Ås“gsÿ¸pÚm_œéäñõe—`¬ïuJôßÃs”dAô‡„“QÚùDèà1K•oÈ—œÅÊ¢ð‹ÌW…ÂC(ª]’&V‹½FÓ$qœ2†—Ñ×rFè±V'J%\îÚ¯¸*wïnƒìmÂü_1I»­p‹° °y3›K”å‚ÖBÍ„Îßo ¾$üz(¿éÏOmËo[³ q‰»UÝÕÅ‹%Q'=cô(’†•4o"IÉGw#¿$)i7oK›ø‚Öry]¾"žè”Æýî/®?wÛ°›Î&ÉÌ*󜽀ìhŠ_Æ¿*o”ã²\eAÆÕi-e{GßX-\½l«UoUí+ýxUo·ª‡^PoU™VRÛ÷KÔ6l«m¸*IµÕ6\AmÃM×$êšËW—[¹^"ÄVwqUœ8iÝÅÐAE4Å«+Êú¨Ö§Œ‹Í‹-Õë ãÓE¡Ÿ¤6…NITŸÿr¦Òw¼»+‹Y¼b‡ëR× ‹‡à‘¢;1¶ü«£ä©•¯~·ÕŽ—”•{Ký,â»&®#̸Xõ?#¤ØN‘Ûm¢µðd61%{_ZäA3)%Á,º´†%öß›DÂÎlmåÌ››úßQe©`­{ 0‰HŠÎHcSåK:XÑ]*nø]ð¦TªSQ6ìÛƒO,þ&Ì™pCj,9Vì×JË5-PÃÑ(Í¿-—r„G£´‘'ÐEF> endobj 2183 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 209.300000 521.759999 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 2184 0 obj << /Type /Annot /Subtype /Link /Rect [91.6800000 184.339999 187.680000 192.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 2185 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 174.739999 515.039999 192.019999 ] /Border [0 0 0] /Dest /#ba.Z#5c#b2#94#fenk#bc#ad#80p#bc#16#01#e7#ed#93#b5 >> endobj 2186 0 obj << /Type /Annot /Subtype /Link /Rect [379.680000 166.099999 463.199999 173.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 2187 0 obj << /Type /Annot /Subtype /Link /Rect [502.560000 122.899999 537.120000 130.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 2179 0 obj << /Type /Page /Parent 2 0 R /Contents 2188 0 R /Resources 2190 0 R /Annots 2191 0 R /MediaBox [0 0 595 842] >> endobj 2190 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2191 0 obj [ 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R ] endobj 2188 0 obj << /Length 2189 0 R /Filter /FlateDecode >> stream xœí]Kä6’¾×¯¨ó“I=Áîn÷{X Ñ ìa°‡…= ìÁôÎaÿþ(KRV©dƒ””%p·K%Š`¼ã‹þøõŸÿú¯ç>~ýçóÏóŸ¿>U—ª­¦ž¯ÿþîþº¿=ýµë›‹®ÿ<ÿüÛÓ÷çïO_ž¾Œÿýþ¤Ú—ç?ƇË'¦ÿõó?ž~˜>þ4ýäëÇÿÿöÿÏúù?ÇÿûûóŸþgüã—y¼ë/üöÔíõ/¿NQZé~üŸû¿]þíé¿ÿãùãú—q¯ÿý]¯tÓµIÓø~{U½ü{ÿ*øÖ8³J5~VJoÆÍø¿??ýeì6‹ËP+ÕµuWÅz®Rµ©ž‡ñºqÇtV5’J§í‘q®óQIëRUÝùGbîºVª~YãФ-ò6Pâfi]õ"ã\ç£R–5ï9èÒ·ó?ðïŸé¯ß0füÆøÁñŽJ¬é‡iÇé§íäm¤ÄqšJ‹ŒsJZ×r´x$î®7šÖظ'IÜ­e¤Äq:-³ë×ù¨¤u-»ŽGâîúÐÍk4&q•·‘ÒÆ1×»,±ë×ù¨¤u-»îŒôEBŸÐ¯úÄwÏ‹¾=ýðy”^ýU{úö—q"/*ØôÇ·q±Íø?£bÑOyþ}5Jº?<ûûÓpiÓ5“ÎzR÷èI5À'øMŸAõ =Ñ?n=k3öÓ·ñàsŸc[5ËWáŽOm–ýiàÎÁ'ŠûGûLâ¡y|ÞèïhEˆ Áë‚ähF9Óô%gÌG(ª ‰…{Käq¿2Êr’#áÔ Ž©Ð…#!ã”&ÛKJÜŸçtùíæº^ëÂ-ÑCO>-`DwšNQ'«Ý«Ý£.Ŭ:n;”69íüL®¯n™Í?Â*«¥Ä’$ }»…OÂÅuÎÙ ç¦;ÚG˜H(„E¤ð-U7” èƒ‹Q'K3Û`êŽ.Ûa³G OŸ+‘î˜:ãü9ÄÊ¢³ÒQžyŒ³¿ñ;Îð†A°aS²”wSC‚}Æ 'jZptðB†rµñ NE¦¨g1>1ˆR¿ zÍi×8W—P‚G€;H¬tÍ#Eú¾·¥ÈyjD‚NM8Alv.`¢êp€JVH„s qN Lè™c l‚†ðþH‘ë“Í‘_j|TSƨںüûÑU­2ˆËV?Cû[¦ä$OÄžZÀKð’r$8åA*tèE²@ÚY¯i¹¦`Vç+¨ÉÊ–ÕP"éy9kHÚÆ@„`—ç9$ºß|)a1J/&Ä1ª$$PD ãn°#¸IÔææ‹‘Zëàâ3›†Ž…qNc’ÐJ‘Tz°íræC Ê¢¡ˆÛȹb»Ïz'›c±9´ÚñÒ줎;oAoÝÖ#8 zK0à¦s„ø#dpä„xÐÚÚ±ÍP° Á"R[ÄmŠE°uF̓ernîpd5³•£3*,Sè•Sß¡T°Ô¥“‚#ˆ@¤¶€Qݪ°¤8€[ïdm¸S%®ˆX#aKœw§H–ª.m§Þšy Hwòx›Õh¢ÁÝ[,[¸!ýä§z¿…Nñ2))7“ Ñ·Îøaé• ™ )À2•h±–h™o–ÜžýY!¬x-£”OÀ¹œ“Ù7Åí |D¤.goޱ¦ª­ÁmDOǘ<’çë¾gJAg¤‡Õ@VχíÉ™€m(dêçÁ·II¨ßÜ’œÑ–ž×¾×ö•܈ìfÛ1sHdb@ƒºå€ãŽÂ¸[+îÛ1?ŽÉÀN²wŸ}oâjmÖx=°/º©sß4]+‹ö’Ð. °Â"©å‡}>¢­3Up“» eîÜ07­ŒaT¬vÜ…˜‡…Õ°ÅÉÜ|»“Ÿ…5CkQ%¡’)w÷âCÂfR—OÏ Ã3#ç†i£õð–f×nχuL™…4mõ§¿ôCÕ®ùÇzÍ•n y7pxüN ŸàwàÜ´³PÜ9:ûˆ?3sôJ¬³sZÕÕi8MWµ˜3MrëqÑ£ ÑóÐb”„ØGÖÎdέIÆ{I÷†qÒiS0Â"Ü 2óÙÁès͘OPþ¸®Ü GKr~㣭XÙ’(Â&ÔWä‰ '$}Q0ðä µÒ”h.ƒ &QñÍJ c4é„“9ÝU$¼CHÖD’ËéÊoÛœØ].sR6QBÛ:™VäU“?½lhû0Aìñ)G2cî†Ú½µñžð6L gÖó~÷ž÷hí܇ûº± ê]Jšk4¬ðwDgà1wá^{v”q¦ ãƒO[Ìã ·6;Ÿuøîçð?åSMcË©¤6ÇÐs è<¸@"]«ã1¯8MN:¤ˆ“ÇõnħöDô1.œ¯ü`Êú5>+5kª–-ŽXý†ÇÎ\“ØJO)\Vè:%fE$œõÝ©BØ*DÎøYÝÚû~ ìŽR‘g]iýö°Îȳwnï'ò|Gnäy;n&'hè‡ ûù2µöÀ¾´BNø(,ÎŒ8삃FÈc,Ûà+«sD‡ÇýÌHÆ.k‚Ìq‡œÙ9KäZ[3Ëe—ÚÁæ#; <ôñ˜jÙB»©Ñú=—.ßí½ûˆa©ŠG`¦ø"_ŸmðGd„ˆ¸¾$êOÞ­DŠJ çÌQ¢¦€àzöäÂØN¬ˆ¸²]–jl­«ú«´›N«,Lö+-Œ€"ê÷äxEÇt²lÓSÅ]{2P1’“EDoâ"S Í¶/a:ä&Á(_hÃÔÖ=ñ¨ùX•Æeöð‰§¬G0 Ñ`°iÀ)Író§Æ‘»Ç3›NÅÓÎIëfvÓ­ÓAV÷„}nIÝV1óc(ö;j èv¬I†ñ*æ‹e09ø/ÓoèËD q"˜PÏo±åi…–)Ï&>¥+wCN ›"Œ B'LŽQ(ß-}‘ϼCï<# —Ña“ô@5RÚéŒa×z¦`$ÉtµØ!â>ÁòÝ z=ucóm'õrƒñ ï9%®‘|KqËÖ¶>ÌÁ¦W—ª|ÏÓrûä¥é‚ozøÖÉ:õ’ŠLSÒ·D}ÿûMzMéÉVwP Ó^Ö þÁÖëP‘¯„4CHÊrca¬g B/…X–Z €:ÔÁ;À2Þ Ø.…‘{8XÚ®•ÇWª´Ëëï&íRÕ)#l\è2÷]3ʤ DÚÅyž\½P‰p™3iÛà|X…ãpç5Îtƒ…óÙçèY#(‚s.åÂ%çØßÚÁÐRþðÍÌüµ £µ0ZT… L–HWA3#(6µ }ü"ô™P4!3N£i-’Ü ÏÊ™î3òÝ­ºP‚^R§Cõ„Û»Q±?½V)§d˜ƒì¯Éqx±àî8}ÖV±yRpE`Ë)L HNͰ[ö͋əÅÒÙ,?"µ‡ªÈžk›³ËÜ È*µ+à“Ó#éÜ„Cw.¥ä<”‚r¢í¥´ãx`ñÄ{MKõ*Öº¹°AöC fb5Yv+½tEðf9hÒˆ‰hnÁ –PÔ:-ΪY'i'­Ïw6ÜðìÀyÚtöòWåÔÊúf ¾D)ø ‰ÀX)u+³+M¢Ð…"ßã3s)(ŽücL€óŽhâ]…Ó‹¡tE£°1˜J1]ᦜNÐŒN0Áà&öœV–œ'¼RÅuø¥fÍéûÍù†TÞóî0æÆÙZÁÝÁTU[¡îµpØ 1Ë‘næØH ¶ðl%l÷Ó¢{ýÁV]8‰ ¢‘éÚðlpÛ3€v–„6,Ïê’è-vϺ¾)ÍèÂi³"IÖñÄËI 7Ì;„„H‡ü;–0IÂ.È«ýȤü1hŒ:Þ¬TJÿ¯Rúå.‘aæ…²õýí@Þ f:öÌŽ™xC°Qáë±_O±áD‚¸"eË ˹ÁœfXº¡ÐÒY_‚4ääAÈÜ¥ìÒÈÔÚb:mÙ¥…? I]ÑJöf!Cpëæb;ŠÁ—©ûMAÅ—)û9¢RÀj“’àTÞÕÍjwìŸPJÌIg8"x¹£ˆ´;Né]”ÒU3žë²ò0 88eTÀýô^+™©ÓVK'3S§l¦N«o¡Ö3SgÚ‘ZOèÌÔ¹1¦3S§@¦Î®g³ï"³åÚúü¼Ïç}ÞÕ}ÞÇÍèóÐÿy3vq3öAcÃŽò »ÆØdÚ·yX‚SWBp?% Ž¸1jhEáLÒžU\GB®A&'3öÙs`d$ÅÅC¥'¦$“L8Øœ²cnþû*<éfrEÛÜÏ3"%ï3ñü>¡P¹™æ9åD:í‰ Ù¥h7…ÐÐ(씆T‚òóEܳxõ†ÅO?‰’ *^6ô}cËÌöŸ™4“kŒñÀ‰/7Ý`:5Ÿõzþ×c|9ÅúrïIX÷÷?ùõék& Z,ÓnqRbT†#•ùçÅÖSÓœU½|8Ióó•”5ïËéê…°†7?¸ÒVKóè³×)¼%9 va¡,üˆ."»CnNbãÏŠ`…PlÊW2†ÐÊÓÂh³Š›ëèÁ°Ð"Z qz`‡@òþ«5ÞaQvi¨wFÏÈ4Õ”vyj{ØëÈjÂWm\W´²ýî ÐD┎|›×¤”dŠt¬K` »“.‚·ý>—Ç”R2~²H VËÉìòCDÖ³ 0]÷öUØœ‹îÆôœx·f±íý-\ãíœûÏ‘žéžAÃ=4¡Œ±Ž×£ìrq«¶ ™]Ë{S¬ÝlûЯ”üBÈKtƼýÁNtãÜ®C:Ñ U9SšÔ‰„ôモ" öØê%Aò@¯Pªäw/äÉBnúÚº§¦)\ªÇI‡Éܸœ'šÛ¡ì Í×[âh¥ñ~ómJjW G+\®ÃÒ\D UŠDiõ`KF=…F20ÅÎä(lØÉÍT¹Yw«{³‹‹V9ç¶_­1©ÝÖ™Rx…t[’žnÇí Zn}ÜeÃq™nNZk—RðÞ¨ûä‹^?dÝÒ#õ5É#³¶þ·§¡êì³($»Na•¬“·2 i¾®H#Ãt¦.ÇI¹FÞ’w‡Çï´ð ~ÎM;{1)¾b›ÛïâÏÌ |…¼êìUìjn/öJî-ÿi…Kå¤HIæ¹'aŒn…ÃDAæ"l£DGÈýÀäÎPþkLæGû2Ú^7å î8¿ñÑþ GLd÷lÖµ±në~Î"V¬~í'hGðÞx¶/¾øÁ5;³ô øç0iq,‘$}‘=IIóÚ1@<»)OöuŒUÎä¸FïVÈ”`o·•£ÄÃÂÁ­ò{—c¤CpåR¯±ck,øTÇ&qGX]½K÷\ ÞJQ$[h93öÚ®ÈÕ›ýÿªº´zk .þòJY9øÉ1ñÝ$tý#>þüX2'g$k×úGW4ç7¤½¹NV Ç’ÃÌB.ϲÓIïje žÌ°ð¥›í=¼×‰ ±ºÆA–Pà²ÖÚå&:V—‚Oøp¡¶o:7÷Y ÎfI–Û”•i½›×þ¢øúâM5 g}å…œ´Eg¥T˜ÝôXÜmï¢íŠqvÓ¯o{#koµ‘G÷>º6º“99k¢êÁ ‰íɰ(”êOp[ç p8§œ. uÄdð^)[q>“ÁÏdpT“4ÃZÝñ²-FûÞ¦Ý3ÝæR¸¥ýKk㡹õ¤­Zuÿ“M "«ÖfLrÉÚ~Ø½ÔÆ˜Q,‚÷Èðàk…ç!×±œ"áà"tÚsOµÝOLàü~?1œ;wtFª.Ãkt¦rLIxu#>)užï”äòõ-Gò$|»=ÇÀúôœ½X)JÄŽ´:xB²O Éç—âXºáYã=ÀÒ ®Gã•ÂõàÑŠÍcÝâw8ßÁšÑžw‡17ÎîÔäkEeeCšúåý|ÆŸ¿½þÂüÇÏ¿‘ì™;[é‹wÞWÃ%¤íhtU«5؃j//þªçQf-d4UÛ^ÚuÔ‚¡¾8®¬‰9éîÒÙfêt¼ÝÊ“Iðsу姟íÕæÒNÖçë“~§‡ï ð‰5tú¢+ó¦vk£M úþ'ŸàïÎŽÅ•~FïÌ€µ' ­c¶ÕiïÌ'FY»ºÃK ºëßu£º· tÚs´Kê´áiÌJiÏ1=Ì"beÏñ9áõxNýºY³0$ͺ¡®¾oÕ4v,™Í¥¤3_äéÏ_žþ Ë\c" endstream endobj 2189 0 obj 6589 endobj 2193 0 obj [68 /XYZ 33.1199999 575.059999 0] endobj 2194 0 obj [68 /XYZ 33.1199999 487.699999 0] endobj 2195 0 obj [68 /XYZ 33.1199999 258.259999 0] endobj 2196 0 obj [68 /XYZ 32.1599999 576.980000 0] endobj 2197 0 obj [68 /XYZ 32.1599999 489.619999 0] endobj 2198 0 obj [68 /XYZ 32.1599999 260.179999 0] endobj 2199 0 obj << /Type /Annot /Subtype /Link /Rect [300.959999 613.460000 395.039999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 2192 0 obj << /Type /Page /Parent 2 0 R /Contents 2200 0 R /Resources 2202 0 R /Annots 2203 0 R /MediaBox [0 0 595 842] >> endobj 2202 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2203 0 obj [ 2199 0 R ] endobj 2200 0 obj << /Length 2201 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`ÛÍG¿€ €=ž C€ ä°È!ðf,Ö‹Lö¿Ÿ–º%ÍúHYdwkdž±¨f‹õb½øáÏ_þ±ÿ×ïû_þ³ÿ6ÿ|ø²««º­§?ûÃß^ ûJÉé×®o*9þì¿}ß½ì_vÏ»çñß—hÎ?ÆÁÓ+¦ ÿöÛîÃôòÝôÉ—‡¿Ž¿ýo/÷ÿ÷ËþÇ¿?~šç;|áû®ÚÃ/¿N¿)d?þçõo‡Áïþö‡ýo#ýqÞÿ?ôRwµNãåü¨8þ}ý(x×Y­ê¾ß !Çß›ÿýçîçq²3Õ …èÚñ‰ÐI;9Î*‡ñÇе{¡”5§µ²°™ÒæQbüÃìÀûMßËñ÷NÍë¦8Ï”6²ãÙÑžÀ3ñq™–£Zäå2-»Y*6öœ´=9Ï”8–,Üz„G$­kÞ[ÇL±X×Ý,IÚ>[‹LÒ­fÚ½‘´®Ö­™ž9 Uy1T_~úºûð4lò¯?P ûéÇ×ï;}øÏ¨¾U³ÿúÓþu­Ú?í¿þ²ª®mZÙOÓˆìŽ#ýùƒº9~ +­ºf>4Ì#ýq¤­¤èC—‘‡éÞI„6A{<~ÐŒG–Q¯¼^E-#]Uêí¬ŽÔÂhB"[øâ6F I1Ë1ß'jŒ7Å$õð{6Eá-°fÅÔ— œžðb¯Ž-/ƒ ùñøU£Û2è»Ì6?p€†én—V&’¬õ=z)9œA3Q#d%¢ûà÷%ˆ¦Ç¯£²É¤;šÞP¹5Bø6[ÒÏ¿§X-š±^CИÃu‡üì“Ç™TTi)ßÅ,˜æb8»ƒ°Áù” GÍg "Ûf‹•ðj0¦½f‚%Ãè´LŒÖõ«ü,Ár²‰ÝB'‹Ü™¸\ÔUÛ‰7¢B™Ê’€µk€82*•¡¶N$Op_Âu+þj€ýå2åH”B2~efΡ§oÈjBYäaÆ¢²1“Óü˜ ¥Q+¶ŒQ^\Ç( Wb#Þ/TÅDºòAˆ µècŪóÒÛbKzÍ/¤ÔÇ•‚_Ÿ­˜Q(9˜² Âccl:Þ¡ òȧÅ\§Ah¬ÇeÛÆ‹¡ ,ÞMÊY|˜,ð˜s“M¹¬Çk²¼†°C³4P¸O³C¿XªMð¬Ü¤¡’Q9u'7ÙE9fè˜-£9N.µÝÏ&©Øî`LÖ1nO^S‹"#xñÃÝr1þ%[çco#kôb@YBK2(lrñ æ'ÒNx1³…¶‰Âj°F‰gV^“R?rí»Ðª‡Bþ¸õRêèÃ,$ 3OpäŽôô‘™7¯Œ¨Îö‰>âxϧ‚˜×gíªààÜ-…1wKB\µð]W­ôîqÐ"\w ®ðž`ÞÂP;øSv×9öc¯‡÷=x6Ì3xç>Cž Òr/¼kp‡æG,¥#è²$w«ÚO ™iëL¿]xO0-BÉ®0eâ:‰W ׳¼¬˜´gÖ,“ð.Dh“(½‰­.8âxàÔg äÓ(=ƒ9ËÌÁ5+XFcKâÚ!Å þxb$„k=Œk –£JŠ› spŒr¹¬Å.Ú¦÷Ç·Mj£¨ó%Æ(„C=c§Œf¿0¯®€OÄ}PÃɹWº”ËN·ÃÑE+¤•R­Ä„°ßgá`¯Š á4BlôÆ ŒÂPüÄGÁ•oŸ)% Äün=ñ$<§›Ce‰`’“[sêÞTŽj“þ¬…¡"ðHñôŽ,EðÆÁýõ5ëËŒvTÂD¤hð”{¤9Aä)ÎÉ“®`ü Em…ë\‡²H1¯ÊdESÊ|X%ÑM[ÝWýPòz® hNó_F>B`?A‹/X§Mýµi PZrÌLŸÿ¤©ÅUX!M’Rcá ¿›8šmZMh ÑЄìö…š²ðÔ”0ryÎB²®7DÛŠO å¹A’ ï²÷lC13WW  Èél‰­>«OùÄœEyâí`€~Op¶þ4€Œt.µ4¨å^J1)­°QŠw×B‡²ù„£˜ßùj€æÔ5mcJlWH‚Ç%Óá%Ý‚>nÃk< «I§Û ¾AMÛ›Bzô‹ƒÅ”aYw¢ aß3pØàãþ6Õ¼ƒ õæƒ_w_2‘ÖáEoIkËõÝ~Lˆý¾ÍiÓ¥{ðv–üõ× ;ܽájžåÈB/Hâ 5ô¡ó#$kT…8ÁêÄ“àuù Þ­Ü€‘ÙÊ-à{hýý*’Ìæ5ÚÂCøÚïýŽ(§Ýå»d[q±Áh$Y:ótZݰéuû´?iazá±–p¯ è²ÎÔš g "‡÷8H ¯+ÁOÃÙ4;£újNîÔ‹þÂhg9—³¤ê¼)-Êó¦An*ªÐ'›¡töìûiÕ?eY ½Òܲžf1CÖ£®ýMéÉü‘7¸{:ž»®Üƒ»NØÞwpW(ƒZnìH;¸{w³-íf»±`2 ,äô&v¦Êh$R·w—Li—LæÚ-B&ó¦í᫱”ûÂ5Ñr%b—4ðÜCOÌÞ69#7ª5&y.ºƒèX¨¡uרù}¶ëËŸTí·„è¡üÑËÃÎðÃT {e„Óv´­µXÍ÷¹ÅëÕ,ݧ"¥Ra…­õú­2ÕΖ÷«¦3¥ÅörR†¥î//üR &Âó5Ne1–d‚l·!ÊrÏh€”ÊÓZ`;¹´An,?ÓSE„­ýÙË+¼+¥R£I‘ÝŒ­È®ß®å°¥¿“ð×ý[êÒÄq{ÁÓ`}e0¾2.te–ꉇ³®Ÿe¼]¦e\W ½6LÀ'8 œÏ&Ô¼W3°N˜êRÖû¥÷ÃR6rfC€’dƒ…EŒ³¿˜`û¯°Íz/TÌíd]ºP:%[jSw™åIVÉ‘–”SDkeÊèð3ë„ !²Pn”ßlyƒ° 4¿pE=ÝiGñc|’1âƒã¾Ùõ AJ5%¯†ç½â/ëÍÓ”®A4žç¸œ¥'k©K¹—mÒÏÍÝ.ÊÑ"…[…Ç\‚ô1·b¤4£_&`îŠ1 YÓˆ ª9 ÖÏdþZoBH’#A=&“hÖÑùÆ­^0-,$EºXMè÷R0’Ò‘’5Cpm†3:sÌt+ g’jÓ˜|•à.ŽÂOŒÔN!Íseé¶‹‹UÁ§8Æ Y’ÒïÌi-lN’RÞ¶ ˆ­YÑ!5á”<Ž‚aûð¤à¨=Y¨ÐzŒ5J:È‚ ¨«;CåΩŒ9 ļ‡O÷õÚçd«°Ÿ%ýy™Þ¶QìÊ#޲䗝ū±q‹y–­"Pz7˜KG-òk0Ñ EÊqâßáž„žY•ryADê_@Vø Á,ú8©f–¢…Mfø%Y@Xa0i.£d9t°X°¡Ý8rö£™oH}e+xãF÷0 X2gø‘òYJÅ‹²1Eº† ›”úÞLÅ÷øí×"Á¥bä1¥)°Ò«°æ™¯ „õeŒX×n/Np+æf¿#*_Ë.”¡ÿ¾Y ý/ï–y?T^×ÙÝGZ4gÃw:Û}:o]бV%+, Nªçˆwå•¢7éÆ}ÇåZxDæf ){cmÅ+ò^Lè䛕DuÖ 6Æ=û*£SZ]l°íSN]ÓZʆµºÄ{³CLÿG–ö‹·»u_{©Òx-ë“÷& 4^Ø¥ñ½õ‰YJ>‹•Ñ3ë¢,2Ÿýíé‘W({‚ÏDÔ½—*ײ9w…Áù\N~JÒx„ÀYÜØÜf);KNÞvÕVˆ×¿ZL×›ÂJ䥹î§9ArÁ÷¬ÂDƒ²YšqMÕ–J¡L¹óKçèQG)\#wjË©C†ÎP"<·Óæé>®DJFBU}Jì\s²­jàl8)»#ÖR«•To©èšÇð=¥Ôj¥¥w‡ðHÝE”Y]+V'0ÃHã¶ûˆôc±èà',ðz0Ô1Äð –j¾òp)Ù%1v°Áx+˜)¡úúß.ß§Û(–OÖº9+–DâùŒy·kh ­Fäf½Q™tq÷~ÄtÙaiIÄâë ´Ñg¹l/gÁÿCe?EΫs* iI\î+Í•XþŽK ¢ªXɽíx.ƒ(„šìM߆àÞÌroé½TÈA@w _Òþo.‘Ä»‡­¨‡­‘í[²}÷¶æÜZ!Êuƒ§óæÜØ ìt>þÝ¿Œ/>ö¸¯÷óoߨK¨/Kxv.Âù¨?š݋q׺] ¢®_Ù_³s«m«özørЕ%Y'Æ’]Õ]¿N´»22‰¥*9\í=Ø4U;É}“$®½§‡Ï ð™I¯v²’µWºø_›mÒš¯?ù ¿;‡l¯¬ð =3›Í×FZǬ%iÏÌ;FYû Û‘¨îð»lĹ, ïÜí9Ó†´ÛsBöºŸ!%b\@Ìâ½µig•ûÓ÷­˜à ݨ×éXÏœRqÿ¼û?[Zƒ endstream endobj 2201 0 obj 4440 endobj 2205 0 obj [69 /XYZ 33.1199999 588.500000 0] endobj 2206 0 obj [69 /XYZ 32.1599999 590.419999 0] endobj 2204 0 obj << /Type /Page /Parent 2 0 R /Contents 2207 0 R /Resources 2209 0 R /Annots 2210 0 R /MediaBox [0 0 595 842] >> endobj 2209 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2210 0 obj [ ] endobj 2207 0 obj << /Length 2208 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhħH 0~È!€1rrf³ ™Eœ=äïG²¤n7©‹[íi÷4¥R±ªX¬'õù_ÿ^ýó·êóý×ÿT߯¿÷_MÝèfø©úßOï¿à¦|øØUsÛÿTß¾^«×Ãóá¹û÷õÀôÛãŸnpzÄð·o¿>? ß|½ÿs÷é¯þÔýï—ê¯ëþü4Âë/ø~0V÷þ=|`œqÓýçý§~ð_‡¿ü®úµCÁ¼Áíÿýd„6‚'¡ñz¼•½ý¾¿<«Ã¬‘º‘c¼û¬:bü÷‡Ÿ;`G,j+kµl›µ@[ÞC•­¬l«;ú¦7³uáhɲÀéñaIóꀴaHTªkËßæÈµÏÉHjR©eU›‡{>,i^Õ1¤Úèñ~^ñÓ=D5Ru‹ª[Y<oëÔÙ%™L£å R"ÎD8=>,i^#o¨TçzÐ>V¥KgQcJ(“‡yºW> ÓšhQI.ù0ÃNs¤Mq”J*iò°®Ç‡¥Lk"9T)˜h¹’=ù{Ò+cx÷¹ãÏzl;IËÆ P*ù”Ͳ¿á“… Uòµä™TüR"œVåá]O!Q©n‰êGH‰p,³Yàôøä¡:†D¥º56z™%K÷&[æuødQ/. ç.#?¹Œ¯ï^ŸŸ˜¦w_~îðè¯ø4üy馪ºÿt¶43ÕËOÕï›F˜?T/¿l­¬hÕà–#ͱh„µpD¢¡ásžàÈ#að9Ž( àž)ÇÔЦæ¼'aäñ¥ä4¹´@(e3e·ϦÆX­¤6:'²ß¿ÈMéQµà†qåËÈÜÈÀoYËaªïFøÛH[7¿Þ™Y´ó…‡š†.Ðȸ¢fpeœyà i‚©åMÐ%’M|"aŒͤkÎŒ3â  èbäßû0ÈZSë–Éš˜eÔ>##Yžp×õfÍåc„/ŒïÁîË+'º§×O<«Aœ¹woFxá°a d|Beýƒ·TòÒ:Z> ]PúÂdéÄå_Ð6Ã2¼z"ؼðäÝU0»²hêí·¿cà!»¼EÄðÜ»/dFO‹JÝÛ‘"¤1bz‹´ èE3OÖ JoÙãj¥œŒìÕ@‹¾ù­sŠÿv¡A_Œä¿a/ bÐÀçà‘›™äA–‘×%óä!^büÈGŒÇÞöÅ×Là9wå8lø2>ÉÆº²†1ïáH€Š…VwQn ›À-¼‚8ÖC- ¥" /ÙâU+¨¨LI”‡;ÀâHŠ´maŠà/`eP´9Ö”¨÷-î~³š–W“Õ7ýrFËTÂì´#KrÕ yŽÏö¹kŽUÖGŽ`%]á…ýbâ€8Š‘]òh³ê6Ñ>RØ7“ø0¾®àõÐ{Ý ÒS¢qŠøy1Ò#”áˆÏûEº’9s£’¤K¥×GUY6ßÉT\ÎiRÆzMª:»é\90îJŸ°úâ^â3Zu§›F7µO—†YŸ«”~?2J`[[3PqÍ=÷h$pÏæe¢îs(Ð&ƒÖ×™.QFñyOIˆ {„Hº`9‡—Þy Y]ë!黆*£RÎÄ–ÍH › ª1G4³¦Ç}uHȨ6å¼Yº¹•˜´ÖÆ9FœJvs7+¬«ó'‡z_‘¢òL /#µ~c½YSÛè9ÅÄÔ„ôiä ¤À46"*(;«'ÁP²Xº4"EœÃ:`²,8„l2X2†cjK¢Ë_¶ÜZãl +”A–¹f-XíÀ‘-\ó)¾œ…p pJE¯©±+’ÿðówXœQºêѧ f |Œ¯Q¶)'ÊQ#si¡Åà™bBLs¹¥ K¦ Sü|áþèé?ÅZ¶È¡À¨C*æ¥ïåKprè:©£`¡¦Î.RMŠÙãS %%?ÖÄETñåq¨#vhw»Ç¡ã‘psÁ*CåŠQæR Mpt#oÜ;»ˆüsÛžSóÊ4Of‹kìBúÿòŦÀe:ÍBP”°îÃö,¥#¯$q¸š8–¾B«6/ïKÚ?BL…%ÅìaìùDç"Ä›˜;8YD6 p=‡ Cê$ÁtL‰‹á0³gËPz)×›©1e=^àÑËÿ`.ET $ËOï{(,꘵äÅU·è‹ÛV± )5ˆš`ˉË×X…4¨°Ì™Ûö™a•ûÌ[öz[.#ô6ÂÙ õ‚cÜ„ø„_¾œ¡¤&(÷x œ1û|D" DðU3W¯ ã/¨£ú¯ÎñDÅÆôR®¹ÐÜЃ ´“ ±5» qÛh@[ Îwà{°—¶9[%WÒxMÚ; r±Yï&壟ûÃby‡ßËîiiWÃS¼¿üh›sH(nžÎúŠ,i/PŽ-eàVRBX[×TR¨|Ð[k´1þ"›©)&ÇùN¢¸ÈÁ<¬á5bºzà_>¢*àÜÊre9ãš+-•zª|¸|#kÀÒ"ŒbÛe£'qº”©¾ã(~øþ‚¦WÇ®QR,`“S¬(QlR Z‚MG:]ÓÛ:××bgIaöJXÉ3M#Âõ9b*•ù$ñX_ߨz j(}´SJ)~œ¤-uÆÅm$4‚OGÃE Avà†I)T¥”VPN®Ê\Ø ±æ.ŒG<>Ã¥/¬”K©ùT#}ÿzF›tg‘Ú.r4ˆR'é1øe÷1ÂXùð‰ÂÒͬ”“XqÈk“sF¶=çúc,Œ=~·o­ÔÌÙ4®!ð {ÂÞý ÝN1=7Â1\Æ}­'*m§¾•[#Ü@‘–‰eI¸x³d 9+ëYÁø´â@»Ã.Š [q|O“ò|©ÖèsfÏ…¤®éЪ<µÜ)æ×n[¼V |°t]A[átÚóåÛª2[¸øìâ:½”íS¬…mçMZi§qïÀ !¼—K9¶@v&!%Ì)éê‹7Ä]^;ìÃâK;¯$±P^‹ŸCðI¯s•Šã¹ãÅš!­r\Ú9k?"W¥ø§+Î#¼¦Ê¸[þgu˜{ÛõÇÑjˆ3>vÙ³ÇqæöæÉ¶l¨Û²÷±uywëÙ»õì­×kйzmŸ={JXÏËô“)Ùºôú0={jì£^¦ñûÉV¼Àp>rÞ’_Ôâ¶i#¦'°{³Ü6Ý2e‡²ãðwáŠä˜úŽ‹·RfÍíäy/ø6>ÕR–³EùI膶‹sÞQKúà[6,Žç?œhzU±–žÖ,×…¨›cáÜ­7/Ö.vfçÅ;ýtÓ_Ïu±W¼íØðÝv׎9ŽpàBÊ+¯nI1œ"Œfï/&µx¢FL±Œ<ºÏ)…<*J< [ŽÒ‘ ØaêzFú4Ù¾êIGS_õ©–7sͽWä`æ=Ù0œ×°Yç{íê‚]ÇØ™'h×-:_7_qJú–?ͽlýB×z“œ s(¡†aÙ,çBNݦ襥A­mgóJ–õ1r’áˆWþú·°çY‘kƒc[n'Š»ûÉ6® ¡=3Ë‹G—ãã{¹­¿²#Þ‰é¹É&OIÕ¦DecÀÛˆWªâšÙˇŸ¦ã¹ÑRºÆÍ8¦ªp„Þ/U-)ÝP»eíS¦¶(gY¶ÒKboxná…'¾dÎEˆQ&ðÆ÷^ q˜ˆ“齉7©î~«×N|;éì/ÿ|ûg!4§…ð\ Á[×Ñë¦1ÿr =lž•hŽ­î­´®õ¼âö¶¤®ÿÌ;¶#aÎAnJA¶>Ž2^ƆÀ99€|[~æ¤ óöJü³õá– endstream endobj 2208 0 obj 3102 endobj 2212 0 obj [70 /XYZ 32.1599999 743.059999 0] endobj 2213 0 obj [70 /XYZ 33.1199999 183.379999 0] endobj 2214 0 obj [70 /XYZ 33.1199999 741.139999 0] endobj 2215 0 obj [70 /XYZ 32.1599999 185.299999 0] endobj 2211 0 obj << /Type /Page /Parent 2 0 R /Contents 2216 0 R /Resources 2218 0 R /Annots 2219 0 R /MediaBox [0 0 595 842] >> endobj 2218 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2219 0 obj [ ] endobj 2216 0 obj << /Length 2217 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷Љؙ٠C€…È!È!XÇ Œ¬‘ùûén©Cv‘¬b¥î‘ x×£ÅG½?üñÇ¿oÿùÛöÃóÿÙ~þ|þqÓìš®ÿÙþýáúºß=þÕõíN‡¶_¿m¾o¿o>o>ïÿû}£ºã‹Óû‡§OŒþöõ×͇ñã›ñ'?>ÿyÿ·ÿmõöOûÿûeû׿íÿøiïð ß6ýÐþòïñ/J+Ýïÿçúo‡‡ÿÚüåwÛ_÷SèãþûCo¯”LãûùUuü÷úUà[û™5Òû?Žÿi÷›ñßl~ÞvžÅ®ï¦À¿g|¨?|H[³ÿPc÷S¾2X¥\g]“;u§CývpݶuÁÁöe ¤ Ç1­eç0U²¬ý>»è@Ô-·M7®° ·ÆóH…ã´ûÕqŒs˜*Z×iÓᑨ»Þuši×Ï#ŽÓ+Ã2Îa><»DÝõáÄÍCS¸ÊG.8eyvý0U´®Ó®Ã#ñ©g›ÖSŸ9ô§¾èÏ¾l>¼SáËÏûµíñ/ß6öð?{-jìöËOÛßïó‡í—_6n× Æµ£2=ùt|Òî­“^éöê‰Òà;ýñI·ÓªûD»ã“þ2ÈÓñŸ¾ì7§l­}b­]?}ÒŽóVj×Úî0¿Ë¼ŸüÙ)hñÍ+´xk¹VžsÞŠšçã'íy¦;þ`ع®íÞÌ;8€>ETøXÕ?*Liíø½äPšrÐ;áì-ø« ‰Ãˈ?ø‰š”>=ÊÙ®à¼àeø+Ö¸®ÎÞ‚` »™ ¼rÂwÂÝ‚© ½04ì°ÿnÈ3ð‚a΀I |'2iø;=VlÊ?3XO*·IìIxG¿úFHBÁ‡‰!úyÙÖî¶|6® ˆ.`˜Ÿ‚‰ä«áÏ#Ä:‡Ú§¨Gxö]ÎJtîBh_xÅ6ûT("(2û€‚å&ÃGÐ6&è“ÐØœ‡–uQo_Á„‘óç°lB©°ÂËxÍ®sêÍù›Ñ7vò\ ø †¼<ÈêPxçs¶wÛNŽhß1¬,",á5ƒ$S]î€ÂÙ¼@t@yBQ ôeá'ÆŹ…gB!”yT`Ê‘f['ùÈ»IICFÒÓ2ù2+”¨'T¦ϰßõCãi*0,¦ øäɾ$ØÆáÇÁJ”‘ÅDàÙÃBþp~ cRå;Vô‰p ò©°%‰jOSº<ùnãtæ°òSý½ñIY}JþF0ÆóíWXøÚÞBJe>'+& UÚ?ŽÎŸ÷Õ¯¨—à¥ÁiÚd» „€†&¦·|~0¶bvƾ¥é¬n< ‡}>ñöH{—_}…žLŠÏí†Þþœøxád[èWõSòÄÌl`¸¥Ý$¦CÍYÙ´Oò΀v'·Q[ˆÃ#V&Å ‡rA/lÕZ“R‘Wöq‹"ˆ¡¢HL…#ÜC9Ðô&‘6ߨá5[)‘(8íÐäÓKÚê€%Å]a‰®úû©}«cJÈã¼"X(Âv%Âöç9Ú’*¢sžŽ@Ä #ÇÐWxZˆ@pœ%©_²‰°(jÀáoSrì"§Æâþ¦#à” Sí'.¡§¬ ¶\{{ƨÓL_&ã«\øOô=™väÖ“'ðÉ38K˜8Zd=þ‰‚¿c8ç6 €[{¾C9Îú>)dâ³[+ŸÀ£Ýçpn~g7½FïÜôíii`d..MàpF Yªý"FÓÜ¥ <5PpÚÏ7´„r°áhøw%Œ,vdÊþUòzrn.,¶ù%™OÓ­·ê´Q+‘€ˆ%Ô*˜f©Lºa’zÄøT^½†R_ýPî)%àMrù(6DLD¤¢$ÏŽ08H1ã nH©Mʼ®‚]Zk†¥);œK :z 8ëˆC :9°{ »´«»½ºÛdê]ñÈîP\ôˆÃÏV/’!oÛ>}ZvŽ„•jpnÌÜĸÉ8{çÞßÙœûì#²¢æÙÝ»;{½PÎ~µ³ªÙY°,§Ø%°t¨jOsm«Ú4oRèöMÀ3O8ò˜báõÀïÀ³ŸÜ§Lƒé?òÎ2(ö\’îûê.vN%×°vÇ4Ë}Æî·»Ø ç¯Öê.îí¹¡¹rþ†Ty9´Ç€ÍÅäÙ) ¸ðVÀצPn‹F`C"Oà²i?ñB¸Øh)Í‹¾"}&h™~NlI•ÑOg_êßt˜.ÿÜ’XùND!rÈ,…—_€‡)Óá¬Èš¿ô-£%fùMI ÇkSÂ`»ë¦$y53L׿^©N‹ˆ`þcŠrXú{K$J°a ×'&.‹mŸ¢ï ît§Á-EiŽ‚9Äe«÷h3cÌŽ@Hä7…÷¬°Ô.‚ˆ;…*õ|ÚqJz7RF:IöSô­Çh£’!*™,"ïZp޳G‹ÒÂGf"°ˆa-5¯lˆbö(š[ôèç†í±¯D×tørÒá’- o>±4FA, ¹ã¯cAÓ÷2¥]#JS=ëÅ`á—ßÊ>Ç}víˆ PÔíN«àFö*¹_KDC Â+7°²­ h‹¡ª\I& Øð"nŸi;Ã+|ZØ@äpCŒ“.8”0YŠð ¬ ^dÂjà­ÃùÆ©®éÙQ$!GH€?Ìfj!"Iá:+k-LÚŽBÄ”ôÒÜ`m °¢d‘ìÒw/`ª`1˜ûW 5d!Ø ’¢Û¾ì~PøDŠ¢p`VÇGFXj!ÒÆ©¶2?¼’U K6DR…¥¶“jG(òÚ–"€‚ü^ÌEfEÒ¦hZŠk’ @«^I8Ô®õ4BFÅcƒŸˆT‘Ø”3ôGaq>Ê(C”Á*&ìø´k²¹À“¿zîŽ7`ºMÒm‘ÔoÜ“ &â,ÜWw7VJSFÒ®KISâvÔJËjí|J^¶n9–^Í—Ãs#(,AcŽâGž~)D­Qô&C%¬°ÜÖv܈¶\¸Áuö÷'ì;gø…=íƒû‘Ä¢P§Ú?–ä5k7ˆæ¨ ³9ôn•õ«¬_¢¬GZX¬)%<¥žÔàZ·?ò½À³ EΞÁC?“:{uAÉX%Ü*­!­T»ÎèLšïax²Œ‹²‹I¸ß¹åw_4ÈKq Ÿ,XÉ©¦ Œîü$2 bKRgçõù¼ÁëJ¼–Î)w2 "5f•ÑLïõAˆs´ÿf”É 2°ä9 iTÖöLÈG n½ÚÝ"˜þ)B—Ï#bjø–NN$©)Ÿ”TÆùš ö¥D麀Dò'‚)"Y€XôÍ ¥+nXì!JÑ ‹)CjMËï–ªÄT¤U0tè`êŒgÌ õFû¢ûÝ24K¯= ë±èD¡Ë+u±B¡w¢‚×<œÃVù8œ¤BT؈AÃ8„¼ö4¥çcv(êªýB’õrʧë{hèÍhüÈoÞXŽéF ÖH-+®CÔ™°ˆ¿t_¦1Š€ùÎÓ¬ÎÁ1óÝ¥‘¦N ˆY}!¸9m6ù„j5è$šŸ%ë;å)§’Ó]ƒ‹Ìኢ|8iã³ Fþ±¤F "æ…XÓm¬$]ËÕæ ¤" §Åçåýòƒ“y+ð8^¡µZñBç¼Ížð_/•ã±=J²Æ¼4ùv/|$ÙL±ö*8"ãÛ1»žBYáðˆƒ•Ñ'þîA¦¤¹¤µ/ôJPAEâ[¤DJ¥”T%?øú7Êž>óG³šMÁò9cq)C1Ö1rØ_,¹÷P §KJqF¹[«àJ£Q̘WìÇVòk=SÛ–j/¦,~~ì‹ *ć.Ws̅›!Kà0T > .U¦\ÿC©1©“N½À“8¯¨N:&Añ×ò!B¥«ÖXK¡°VM‰ sFR—¬]³»~ê£Ï;~ŠMµ1Áocø?X(h|«»¯d ð"¯“7!ƒ ⬶¢KAà>„Í#Ó•6›ùG±à)V%²Mx§¨&}ÑMþýÑó–<‚Eå•›¯3J:ÐE ’Ûû‚?¿fƒí¨L¦ðc…/OgÜ=¦ êó<ù€‰Qé⻪p\`o³ÿÝ{Éwç²1ßISµdwNÛf3ã}˜¢û¶å£‰foXLüø ÑÄËŠŠ¢‰îå…­—tš"΀ÁIˆËØ*AÄ 8$xó|÷Óø“¥×é!Ñ"¨Þ“‹˜ò V6#WÒœ´œZø‚X ãÑüæ|ŒŸJuJƒÊ¼ø÷Z½{cªE5»Î©·I˜Fj£<³~rOí¢µ°’A?ÝùíÃ7»¤"ð,‘¶·¶[ý·æbvNiÝeVƒ_ _¼—ÎHÕ›©ÌÎØ·Y£ '“Ëuàk{Lò\F{Ÿ˜i›'?(0ËÝnè½ïLJåjaðlðËÓlåCzÖž?9[ qñx9„š# eÕBðâS®«œ»±ãò?FÜš¡ü"g0€Mp:p)ÂÓ’u%*ˆBê‚X®eÚ ÊÓ"‘xKx.FEÜ3Ž5«üM—+°ôMR®…@”R*(f ÈÌ'ëÆ_d@,I|Á‚Ï„ˆPl‹´~ *|žùËb½||΀î`íb<‘èHo'(æ1'ò‚Õtüضg—Œm²˜¨˜J³‚®ŸZb•µ2µzÿ¢/9ߢ,ªÿ†O‰ ŸK²‰!V&oq°¬¯*{E œ«¾·eçɺ5œ±$s±àÇÈ•Tà–#¢,²@‚3X)S9“\\T –“’KšÀD3å¢}­¯‰*u†!"Z•-˹X¿¶=7?ûJ„(*x¨®KRæ; Ðîáwwš_}—Ä ,õ˜ 69å{&ºÁãÁÚÅ€syC<Õ„Ö>R=«‡!ÒoPͧ–‰–ååSù*ôG{?_^⃻LHCrxÊÕ{oê˜X¤ÉS|µ:h%*ldj5(.`HA,Îh ”8“(ÅJj}m‘X¡xV.)ªA"ÍkMIz°¢«Ì(·ñæ·ã…!Y †%¥„ ~‡ wkUÞ¥#”;¸,wÕ #Måß}N ÛÇ‹iMº÷5Oå†üÈ1Sœ’\Ae šÙ‘ªýºãŒ›DD<DÃK Gd«Ò­ !W‚Œ$Ò5î/ö GåÚÂÛÿ»ý¾ ª;òúôÇ×oIŠ˜æ"b>G…LôÕ4Òb·UûuÝìøUÝxñÃÖ4g¸ÿqç»n×ÝN vxÏÚíÜm> endobj 2220 0 obj << /Type /Page /Parent 2 0 R /Contents 2222 0 R /Resources 2224 0 R /Annots 2225 0 R /MediaBox [0 0 595 842] >> endobj 2224 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2225 0 obj [ 2221 0 R ] endobj 2222 0 obj << /Length 2223 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹( ŒÝv€6CCàÉ$ŒqrÈߪ%Uu“õqy\Š*ËÜåb‹"ßÊ·òÍ?ýýøÏÿß¼ûôïã—åç»O‡îÔ©nþs<ÿýáå\ŸŸ?º?ññüçøåëáÛñÛáãáãôï·SÏ.?¦Áõó„ÿýòÛáÍüòÃüͧwž>ýïÈšþ÷Ëñ¯›~ü´Ìwþ…¯=ªó‡_çŒ3®§ÿ¼ütü×á/¿;þ6-A?Ï{þ÷­X§uÒ2¾]eÏ_> Þ5­¬”PGÆøô¹Ÿ€ñŸ~ž&»¬â4JÆ%‡.tÒ¯³Žƒ:ö=³æ´v4Sâ<šé,óÌðJÚëäàžé¤¥`bà½}Äò'|ß\ ÏûL„à:S*&zÙe™ç¼–´¯Ž™NZñAöݨáçàõên†_?$n|(€Z‰<ótgð%lkÅœˆ(†ÆnïxÚ/3%ÂjäÎ2O÷ ª”}-@·gú˜C7ñ«núæxðíçÛL }ÖÄŸžò¬Î矧ÍöÓ&Q©Æã矎¿Ÿtzÿ‡ãç_ã©ÅÐÏúß7Â$|FÃGÞÃW +àÈø<òþó„ªâŸP?¿U|€ëy‚#o!Dàî8|¦ƒ+ÀðÝî«àq˜¸Ü‡Gñ¶âz¸Záó£‡ÎoÁâŽÃg0õ`ŠÃTJ¡8‰wÚ -ÆÉ!¸¶e§u(Iö~Ê~ª¸-hÑUŒ!8‚i‘u÷¦8¼¶šrHOçß°|˜Ÿ0†!U8èEV„g~êÁ#XZ@(æ…/…â8¦EHóŽÙ œOnZ` ïKL¥ïà'œö°´Á¸0ºtÀÂÚ¡ãálÊ>A ±íx¯ &ÏôãÎ3[çÊéccZ½Ž÷`Î ¬mçÚ…kí§e ×b>Ö)¶)§)ˆÃ Ð%æ |ÂÅÒs–\pmÞÄ=„æ¦mÊÁ¼gÚŸÄ1tjJ®ñ╃ڤæzF¦üœzwß… x ±¥ì”t.¡Èò†}»oÉËM¢ßkú–Æ^¦œÔæûG;=8,"|zðE,ãlY|RkBwƒH åF«·Iåàdä 8Ù(§6ì#¬ˆ{ݱï/n±ûºš¡>qyk –œîäêÉnْÖBW@ò~$ánÉí–Ü…›”Þ+ZrºÓƒŸz6É÷gÉ¢’ÛxnMèaÖ©ºÄVÙ6)¶œð>'åºÝ*›q/S<~Åýn•µB}jõÑåËÁ+e÷üJΆ׈cý©›ap%Ñ™¬µ‰•aýͰ·~uF†¼N6û ;õRééiSjô'ÁÏ2ø%®áûØh¼Ïú¯u¡ ÇZ—y’ó£®}Jø«Þ×ðÙ8Ñ'=vêÕÆù‡àרH²Þkþ†æ~#…IÀ‚¢€H £DcÂâ ØÐÃÔ9£ñ)PD /À»X4ÔàkU„3Ì¢\Üg->Ê4‡YoËËd‹=£Nœé›x,)ãµ6„¼”Tà:ý’ÅA~>î–•ºŠ°b.Š˜k7®ñô­¨*$'PÝ8Fðl˜ñH¸îÀ“È=#ß×;‘òÁÀo./2ŽãüIìÃõåOÖ•_sÉ­}Fð%ØZ'ŽüaBÖÿ^É$ð&I–Cª¸¿Ç~çÚz\»ÍÈ ‡‘(GÍUM~–ÊË›™ùŸ³¾sL}›>Eq`ËúÌQwv÷ÈZËçÁª2@­q],­$†"Æ ¤X ŸÁ³qh¹aI*±äÂû!̆¡ƒwZmÊAǪyEêÓkdy×@[Õ@ äîz¦y=#»KG­]Ïìz¦²ž‘|­)ÚõÌ®gQÏ´ì)«ªgäZAFñ¾àL—”Ùö‘ê#u¨O¥h“¼ò]–eùÞ{)s復u¡’ÀÑ8J§Qlíµ¡Q‡êûÙù{’·{¥EÛ²¦¬×¼ ŠWe?£o|¤ õ,CKù¤~X ÙnñÞJ”õfÇäãDr_¶þ‹÷Áœaa&Ÿ;ê—`íˆ]ÙDH÷Wø,ª‚u'5°ÐZœÎŒK}«Iú¶ üÅ]8•›“™5 Ž…`ØDTLYµï/r8qú;®| ç‹ËT^›`¿Æ…ãÙ„ò2°&….²·>6g333¹"2ä5P6ÅàC«|ùÓØúWÊÙeH‰PاdáXé Ë,'TÎÚÂÀ’~OÁ ûñµF$¾†(±O# ‹/MØe_–èÁG¸VãYKÿìB*œààèòñ²„CtîÙ——Ù ª¬Q ½¸b£¡›ôÒ<¶™TÜý[^(¢†5^‘ú¥‹¸UQ.Å΀çÔºH)9Æ Åà}qA2½)^HV2†‡ežc•œÃÒm︹Þ²/³x©N·þñ ;ÂÙ•Ò‹" °ŽÕÐ7£ì¡F)|ªi 6¸±³ËЦP/®H £›rèuE8V–…c}~¼Ý,[ÏeOK]Z†.טµBÊáN‹Ð61mi0H#N8án¥€µfiÅáå÷ó&¥›†xDŒ’ ´Ã'Ë#Â(†²( €I¿]D8,†`ÛíZ¶´,½¥Šïܾ¬¤ü率¥1Yx“ÉOZá \;’o ïÐü2´VïÌ‹=G{Ö÷ òäåCÊl)͉ÃûúÆäJ¥„8sè±)ÁÝÕ‰^Â?‰êŸ±Â™(Ï„X|K؉M)Y;ñy6r¡^;© I¬ Æ©\ëÑcDD÷:ÁbDb¡“5^–»ß¢¶„,¹IN-ƒJ,¡™1:ç”õ~ nqÿ^í—¹Ú/_½ˆ×¾¼b±Œ£¬Ò²M ÁgIèÒ9ìn pŒ~d©5.Û…Ùæ„Ù°Z7¦0+úÎÁ¤ê¬ Tþ« "¢ ­ŠÝ+ˆÍÝ…Ææ„ëz“ƒN/5®ÈXÍkµ6ÜÚhÒìΛc .™A{¶2ñ'ßÂT‡ß=!‚nlj×â´âN(l¼K,[ö³ø.Aâ%Hoi¯mG|Ã#\Ž\*J×½|vÊTCÃJÎ’&[Ç ÒL*Œ/d‰QÍä:&…Ú‰\1 :)~¼´ð*…˜Þ] "®öÆðŠ(¹Ÿ$GI w 'U¶ÝßK|¿è­~ðæ9“|Jú!¸2ðQ;bìÀ!Hv;îa‘!ÛëÎ.L΄ÉNå­tn¾³D5oa¸­È+Ü~,7e¾³vÚæ£'V6iKçº+ê[v|pØ;ÕáÄ€‘гä®.„Î<¡ 3^áÀu§f²:ØîI3J˜*ñ>4£Vú6hËŒï@Î ÊŒÐ-Ó/%|ÓÆzD–”òïù´Jdè.4¶Ét—ïûxÊi`±zñ_zrXQï„2àѰ×¹¬®ç,9¸¸2.•¡´ £XÁ:F¸„¨toÄࣈhptßl )MIÓôYî»Ö ½M\Õj3ˆµ¨SÌ€i{Hrµ?F—Š,*8GqŒ&„–N9Ж£;gÌB"Úä`¬Q*p)ÑêJ Fí1;šš&Ýj°·i²}ÌU5l1 bo“©˜¨ wZiJá)UV±xJ»ÿZÕÕ›ÆAIæI )ršÜöéŽt³CJ콸¾;eè›ýÀúPÖ Vl¿–áí'àëð=±Ö…t¬Â#-v,ÛÕ|ÙCÚC&œ•¼SbɼУÊçÜ'cx2Ÿ“Õ³Õë•·KáÍ-ÍòÖ܃”òN–Ï{Œeè6TÓTDÂÅœ(5k[ºb& v×-w(õë~®#ø6å·7rÀÑ.érazÒršµQýiÇ«)‹Îaèl«—í=®?„†׆àMºš)¼ ÓáȉÈFHÈH韙rõUžËÇ`‡Wšâ‡O¨ÿtÜRÖÝF)”/Óž#Gö é²Ù¬}Ö³Tá‡w3 ¥°½k„d…C“G «¸6ÑšÚ„rE^ÄØIçyË˽¶–²0- e•ßäȰz‚#0W‰’«»°S\1ÜïáÞÎþÂ#”œ5Ü£ Ö`8žÁ™ip?î‡ClcXS Êq~ aüT‚¨€ûq¼ïg5âš× ̧¸Ÿ?¸ù.pÌTWã DB-emŽUõõPZ Ì?p¿Ëk‡´Ä|Š9‹Â%”.¾–êQ¾G”YV¢•Õwí½)“RáMéjØ+Ò²/–â/ÜînÓË,—¾N)ÉÒ ÎašR1¢­YYaj få„DH#lqC¾¸kÖ«‚bˆ~ÓTŒïnK™Ï[èfšÕYyßÊÁa©Q¾Š·¼–Ãî+~Þ×ÜÝání"§–’›]nȸn¶EÎ)j<í­pC°Uµn•.#»\ C—]%[NÆ2³¤¸Xª…Ô>×Â冱,fBì˜Ë„³ä!R˜×_npÇÞ²\p“FsÞ+u7Ń]^ì8®üöªýÄ«¦©V#BoBH5xÉÝý¹æsxݳ4š¡hÝÊoó™×„–óoðÓŒ™˜kÉC7™Œ”R‘—³6pãNævõ鮋¥ý*„‡ðä]¦ôû/¡¶$š(K“¬¼h¿vùPþ(¸‚IÌÚnÖë½³™Äe•2¦pFDÐ3"®ƒŸÅQ—ÒI0gpa;6˜`Òàh³¿pÆ%‹–ßT^À‰%iû…„ó›yKÚ²Fþ"<Ô×f) 1‘fÊaÌr:Eˆ¨JgZB‚érï¶’í$Ýù–%FS\7é2SJëDþ©ÂðÔ®Þ^¦HáSo¤Ó.¾³|ÑN¹’à{“L#¢{…W9Ѝ3äø‘R»²x†(%e²£*»RœÏí°®àHè/«ìžÞv<½þ`’ÑþHýQrxuò …,}„ƒïB.™bЫe‰á…û‡²Þ 3Éb|=›´<ª¸ƒFeK›ö…佱Θ”" mÁ#ü¸q´k0•µÏL¡žuS¤ŠFúG“'½»N†ä>Z° HJ¿Ä#{…Çù› `ÖìšLØ7v·G‹ð;Øÿq8o/9JÔÈ×§yÆ?[ðß]ñFã3ùé¼ð¯­äË/~=|rˆˆ2²E/MW]ú¶V£ÏQ«×‡ÁÍ7ú¼î¨Ê!o q]ß àë_IW“ᦠø™âgI&µÇå€áFgB7¬èÜï(Mü³ÛVÏ­þxÛv,z]¥E¯)-f‹¨ý€K s˜#u’ØJ†×¹%ñîo¤f»[u5\«ÕÈœ"™"¢5ŽêzmáÆîÒ®åvFµJ{E6]ù~|­ãšÞe+BXé _ëõ[ë­‡± »Ú¤ó¼ïò7i°ñ^UJº\æÔ²ôc[”&’¸Ý¡#æ&ÜîÏѺ[‚1·Mú÷j§8Ú©4ÒaˆÂÇ{0DqûOJÃÁ¼<÷Ý´—tdzÕ=Ý=k‰éïñÛ¤&Qþ…åÇ—¯QN¾þÃNÕâ|ÔïšSG6mãfä©9‘ä(ºKß—YL(uR·®Qž,ÃbÉ|8 ¦54£`¸12£@ˆo^«Þ÷'5*&ÃÝz†ÏŒð™ùÀ6ðŸ„#·]‘·f›•ÜËožàï.–ÿ~@Ï,ž[# íc±ãžY0³÷emÏ @uçϼg—ësÛ cßZcO‹è¿AñÈZt`ãx#žãÿ=agOÇ0BšÁ”Žßƒ÷ƒWÍáNU6Ë“…!õ%öy‹0wÈ Z+6¯Ý`‹ÑCâ‹ʨƒŽÿjã[ endstream endobj 2223 0 obj 4509 endobj 2227 0 obj [72 /XYZ 32.1599999 581.779999 0] endobj 2228 0 obj [72 /XYZ 33.1199999 579.859999 0] endobj 2226 0 obj << /Type /Page /Parent 2 0 R /Contents 2229 0 R /Resources 2231 0 R /Annots 2232 0 R /MediaBox [0 0 595 842] >> endobj 2231 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2232 0 obj [ ] endobj 2229 0 obj << /Length 2230 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹¤DI@ÀãG€6CCàÍ&Xdqö¿õHÝ=Cê#YÅ"¥· xÆÍEëýâ›?~þû៿Þ¼ûüŸÃ×åç»Ïͱ±ÍüçpúûÃóôp4zþµº£O_yøvøöðéáÓôï·eŸ\~LƒçWÌþöõׇ7óËæO>¿ûóôÛÿúð§é?þú·éÇË|§/üò0ŒöôË¿ç_”Vz˜þóü·Óà¿þò»Ã¯Ó†§yOÿþ0ôFOKÉYÆ·Ë£êéïóGÁ»¦•5£êôA)=ýÞMŸþ÷?M“]Vq[¥zÛöMꤽ>ÍÚ4ýaìíA7Ú›ÓÛYÒL*sÝ "óœÖ£²ö¥š¶ÏÄ…ºžÐîi}6´Î3eÎÓ™yNëQYû:CÏtìòþžðžáô«¦—LoxIœÅÂgÞëɧëmE´‡+˜°bR ³A'YG[2c/‡‡„Bœ ápDåíÀ¯e5t”õã$8£8‹ÝȨâ$P&ÙÊ@aõ÷.φ_eàmEÂ[Û;òĦy²”Óà#Ã}OÝøÚÜiî€8zAíðKzúˆ8 09…†D%–F;­†•˜}œ¡Æ39·¯y&ØÚé•÷¾ÍT¤+ E¢¼Öª¡9ùT¢zá`½zÙ@þìëŸÔç—A]<’àOtM®%>NËÐdxÅnf¨Âò9^º3ŒUv&غ¤xéG¾ˆ¤|ÈÄ«%ÏÓÒUB=‘ÇîÓ#1”jï"y›‘üæžNB-6á”K# AN« oñ„€]`!E4ÀA=Eà!;é\21lpm†[bS²ãÂÅË”p$ÁaÜzžU‚Sà>ç †°5Q ïè^èå6Ê¢qo$N@#«¹Yeóå¦#óÔ#V_À¤k;”¸uqád•LÇ”¬‹Œ:Yb¤Œ¡³!±yå EçbC¶br+~¥n)Dt…—íj|Å5¾,7ÄMqÓG¼6¼œÌ ÷ƒŸÙMï×òzNß_6½8üS®M¯Êå¤FRbk›é=.½H<¡« vßK0E9L]òb]™þ˜"%[—Qž;Ž‹8ºddd†éŠ/ªñÃfQ{zó†„á=©ÇíhöÏéÀ*{θ­’•¦IhÞA¸ä8§$¼Ì=eü¨û5€Kø•’µˆ“ãÝ—èeà)Ê <Iª pN"IÔP¨ZMËúa(ª–Éت—1¶S20Õ="yÒ`´b(Ó´°&D‘­ü´’eÚË]Ïè·¬*%R»ej]p>èKõ:nÙϧÝMÅrN°1CD·@ ²ˆ )Cû.ø{)N»¬%OÝD•=µeäd\_R@tÆ‘;vË쨅TFö¥HÓãío«ªTC°»ø™ß á1¢@@âÞ)á^že‡‚Í¥ôFÂq¿Uh%['4+n¨,ëöǸ#IôªÉzží,ƒè$Ìé¶0ÀQѸY„}Vu "¬_¶¢s醬…ÈHA|aRCÙ¬E½”^ 6ÐÍ÷Ÿ„Iv ¬´hDec]ïïŽbV[3 Ûæ…{„]$ßÂ%Ö•‚`é l»s£D¸?¿·lNc½“œì&ì"dTÑ£*Ñ’­ªµ®¢&Þ”f "4°ZJh ,r5ÕV‚ÍýŽœ&ëñ¥‰µŒYný¹ž˜¢ðädzB¦ÌéYuø¬4õVjåWoЍ72 Ú­6Dš÷”‰ ãý4°œˆÑ®.YoG‡Ëçðc‘Xr–g5ýNÁ„@8!-`ÌJdë&´°NÇÐý]àWØF%÷âR­@ã=ª5–ËD_H¸˜s™`žkÑFBÚ mL¤’“¡=”æY[•7ÝN»› ¦èxéRVÎKäÈK” PnbŽ Õ"mTî­BäZ…Œí¹U§IEàÎ7Áƒ#8×ÂÖø#æ­J€¢í^b<éæ¼‹“‹yxZs»)6"C=!<ˆåb¼Òô÷hŒ=bw0Ä`¥NHóR‰Þz=­ºž°\é²Sž0AÑ6wžð"ýx <¶~ªJƒã°+ž Ì-è ¸mW¯8¸¸cŠæhQžÏkƒÁÞ¥†êº}ÑýÕþ­Äº>‡q¯:Àáà~m+0¶8–†ù˜/W¬I'Zé8­cÞ…¡ˆ9<ûÀèø= éh˜‰[Oª}Û>Úœm…ßÕy«£t+ËÕrçÎÕXRs5¬eìž«]c|?\ Ÿ‹«íÂz3M/ÎÕ‚Šé•öÂHg°­eŒyÉl0¹L´Ï%ñ‡2 ‰Z˜¬þ é b¬†éç(›‰W'œS½Ö£ÊEdeÑÊeßC U?:»–ËQŽsùV]lu†ß ë/¿†æè¤XZc}Žp¼rX#ÄšZM9ÞšvoÔDòÄÉâKà´v ŽÎ)°*öuß>ûØH•ö:~ª•"·²8÷Fé¾’Ÿ’CØ+îD¶Œª6Íp´”»¯«Í{ÁnŽf"ŽîrËh­†‰"Å@Elæ¸{¦Ä½eùâ)ôùòœïÂ7ÁD*Ù¯¹÷(¯@§òÂŽ‘F9{¸‹§m±ªUv«J¾S»˜Ì©‰K(ôც*ÊT'qj«8-^D‘~< }Ë\Ùˆ¯H`ÕUj©V².¾,S¶ž¨Ïð dvp×é×`µèÀüNœæ=9m ^ia\ÛAƒ’¹’¥‹vPDãkT q;ÌE%Ä$„wãA\Ò–asE"´~4€³eúsH\š`>ü–÷yõñb)*Xv²Ûs,ˆUR/R±C×A$´“Šçˆö.)µO‡ âõÛßi=:h-’¯ fõNLoºâC tAÇ3¡Ž¬…oàÀ•q1¹Dï«í½²7ÙáJD'•!ñ5]&¿o¹ë]n×ï Ñ Þ;‹sõîéVï\½RûQ ²Éº“æîº97Po[[7Pɶ¿½ûέ.#¼É+ õßۺ㥯¶ò—ñ™¸ïmçYõqþ"…Y”¼ÛÇITät%Ïï°³ußžäþH¼ ƒ¡ÃZô¾rJ›/‘n|Ø"zC¦l‡tB7,‰Øœ¬,¹â•`ÊTÒã¼zë&Ú…n¨r§a…r+ó»_›XH¡¡[eUýS¶ëË£/¯êwûÎI³ïºóÉæ¯¢3ì=:ýld³»í+ßx`(„îí±‹0Šz\öÀr®C‰¿—ˆ¬¼"x°ò*{ÕUG<Ã+Â:ÑtÛSôN‘;‚Eøm‰žÔåmÛèèžwÔÛºZûß 2—vcœ†#÷‘`z"n_r ŒÔ:³ù~Yø¢ Å[ŒÆœý)}âÓß÷‰Nlîô…åÇ×_¼ÑgªÍ•©~ ²Õà£Q~<Øƒš¶±æ•ƒÓ\Âųœ±öh×u¾±=zbe>Ýûõû‚ú•‘Y3æ¨ÇUt×í,¦®#=|ÏŸá33º÷ú¨sºŽ<ÂÙf”zþÉ{øÝEÑ^ÙáGôÌb¯(´Eg =³œeïÏÃXwú]wêÜ«Jᓃ§½ïÚ1î,x ¼Ùô Ûøqg1¢ÖVðáuæ–B¯5ì…kSxmpÊÇk¦ûO¯|ÂÇ8UÃÙ8° Ð0„Æâ£Xƒ2ƒuGƧÖ`Ü€§°tÄ[{æp ú`ñ>Œ;>fÃÕ.=fH8ƒO,€é èc¨° ïA…³wÎy`~xÜ»iÜ}΃A'>öp¨ÀŸÅètŽ Ègñ = v‘“ްá†ìsíXP3>|zø?i¿1 endstream endobj 2230 0 obj 4875 endobj 2234 0 obj [73 /XYZ 32.1599999 539.539999 0] endobj 2235 0 obj [73 /XYZ 33.1199999 537.620000 0] endobj 2236 0 obj [73 /XYZ 40.7999999 133.459999 0] endobj 2237 0 obj [73 /XYZ 40.7999999 133.459999 0] endobj 2233 0 obj << /Type /Page /Parent 2 0 R /Contents 2238 0 R /Resources 2240 0 R /Annots 2241 0 R /MediaBox [0 0 595 842] >> endobj 2240 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2241 0 obj [ ] endobj 2238 0 obj << /Length 2239 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âC" ÌLwÈ!@cÈ!È!˜ÝM°È,ÒÙCþ~dK²Ý¤>Š,>$M»h»M‹,VëÅbñß¾üãøÏß>ùÏñëøúùË¡®ê¶~ާßn?àº|x«tSñîôsüúíðz|=<žû¿¯Öž_úÆiˆ¡Ãß¿þvø0 ~>ùòù/ý»ÿùñÏý¿ÿö÷þå§±¿Ó¾tמÞü{xÃ8ãºÿçöÝ©ñ_‡¿þáø[‚>÷{úûƒÖ2 Œ×Ë£ìü{û(«‡ŒÕm«ûÞ¿ozdü÷çÃ/}g×®êªã¬iuËUÿ^×bø×§{ÅÏýs~ìT{d’™½Ûsôë)²Õ¦é狚«¥r÷Tu’1ÕJUûu€­kÔ0G;ËKOqýô,–¤Ÿ3<,j^ÖqO•nÇøÞcœÓºê—~sKö 6m{Y¢L6vŸa4¹ôÙ]’~Nð°¨y´uôTi)˜P¼‘' œ°ßhÍû÷JŒ?óîêaÞýC‘œzŠì'‘Œ<Ãâæ5Q÷DåÿV‰4²íÚSd?=K¥¡^OÙæè)%ÿëNóf2ƒSOqýôf_mu‚‡EÍk¢„ÕÓs Ó_M¿WǃŸ^žzñ¬O†îË/'{î4æðòÒO¶éÿéíž^~:þ±®™üñøòë¡«šN¨f0¯ï-Ë-M·6¸E~^‚Œ>¾ô &7ÿ«šmfÞûlÁüÏ!÷Ý[\-¥$Š(4>Ó„÷ÆG”(|;ksŸ-[Ö¨¾\¿¥¨FÝfæý½µ¬¯›öÙA…k¦ FÖÂéÄÛ °ºjÓ=8`j~nQUm‚Y ÔÂà3¬>·èk'úüA[ñó°µ×À°òúAkôʇšJpÍxã|v@¶¬ä0Š¥Ôo`mÐW³°ÆÃ_…`|bðèÍ‰Ž xý@ sæ´ Z_íLÈLò€Š‘æàŸGîÈÃYO&Â-”,¡3¯BŒB|$[Åå˜&œ6·±A²ñ‰ ,kÑǦ-^wÖb¤\\w%Øê® Ü2í=5¦ ,³4€¿äà2V5²}£¥lYíu›¸Xü`iÐI€²€lfËL‹™Lj‘"A¼2 4ÉhO+XÑ䕌-oUA‰tæ—Œmc¹¬ÛõbfÔ*KàÐC1Q«j ÎOKæïä²- (äK.ÅZGF^NTjK6Ç*Ì$Œäþ:bäCC%D—ù+([L[àqu2yp ÚÌ3GÇ„ÉlQ„ñy„däá7á’ëuìT[LàÆÀ¥àÏØV±9-Äígó›ºC8¤wvW„o“SƒfQ ®o¬é B ìˆúlÁ›phM{…3eÌz´W ¬(©&D·#To™¾á§×Íâ§=…ãƒ>>Ã8 K˜I„( !vl2‰Á†c°eWÁI$9|BlÃ^¡1Aô&_2 ¶ü™ Ô".´m±fQjCØ"Û2[üÈ!˜Ú¶›Ò¢²iúh|€ÝHÊV›C,%Btr’h&œŸ°ðŠ%'&yÀÊó'¹cMúÇÏHê“â,z'™âÔI¤Ñ"¬I̽åð´µd=öƒëJwõÛ¥4z ¬™ ¹¶|„œõ ªïì[·Ì”Ø»RÔ¦¬ã,»c‰£e„X)l¿˜Í•¸†•`¶‘Ü’Š/àß¶ÍâìLˆïÊa±`-½àV–1K£,‘•âÿd08ÖñŠ^WÚX®R$»Øõ_i6ó$u:²¸ßŽüÓ@²cÂAðe‰æ‹¶ sxý˜ÐÐZ— d›b!ÕnJrvØœ!úý…+¤qc’®,UR ÓÄ"ßâF…Í“]IÆ^„¤!M4©‰Œ±fQ ³g„xÌ´”¶+téþyNiÜXâ˜bÍxU) G<*@²T¶wœd=x8iÓï“Ø¿¾ýöTðvÝÏåC Ib»1an‡eWhŠ%”1×ÏuN¯S†ÐÜfò¬æœås#µhL °’ʬ~ÓZSÖº‰9 Ar°ˆNbD'ÙÙÏœA‡>sRW-„±P¶yX‰Õ­ h¸%“?ÀÐ1UfÔCòÏÜQÓw/3ÒîÙ¯qí'f2Óž¶–BX#ïöiàBÖÀâ0vœ8Ex,àÈFÈÙB¦¿ÿ!P›Ç­0·l«`‹;¯UÒŒFÉU¾‡Tó¦c¦ØÏ®jš®1ÆÜpL"íQØ,Ùï!['ËÑò$gô"vhHiFIx`¥óÑÑ_Û úYœÙÒÊ(·­–óX»#‹&*aGÝnKï6šÊ$XpÑÅ”›io½%)”tÃ4Ï"Ç>4e‹1Éökʳ! Ng{IàeG% G¼,–Ї3WèÌÏ»=y SIÇåJ]7 žk!Ôå<ü}EÖ¢–¶8ªàBìàú¸÷V®Ö'ë]ãiÔ­øÕsãà*ÃIùÅA­ cs’£7[Qî㛋êqiÛýΗÛçËk½… ã×!)¿î|¹}¾lÛ·fá—ZÊ@ª›eªb!ð"§P•0ŽCæãÈó¶`ì`^ÄxÃTÀëCàX÷iueÒ5LÑãÛ°ÒOw^Mâ¡aMu_M¥oWI´š0l%V“;æËXsÙRÅu–+(øgTQ"ɤÈ!e~9µûÝe»çÙz @–#G.f÷+I~mL”d³ór(•% XY[SÖŽ9Œ ‡$me9ç^j‰rÞ“-à$hÌ$|lMÚdßghßi‚pÑG.g·ÀÏ\Œ×“Ç>nC1n’¿½BõÑüÊèÔÞ>Ôdæ7Ôð}Ê —çí&o?•PîÑÂĈÖ1uú¦¥†Ï<-Nd¼ÌéÊLÉžŽÇÜ<ü§ˆ'ß"°§:QÜ(öˆ¦æ€?“ÌÜEüÇ»ÖdÀNiáw:J0C6HÐã™+µÓÞŒ3CÌJ“óeË&“¥fȈ»]"Ö §ŽKŽ[swðÄŠ`p`+HVÊ:Mj/Ƣ짇g#ì[+o·²…‡ãX¶’_[ÆN ÈLâ{Y‡’)N¥ @w Û[;.—÷ 8ñàŸ[•ò¨zÖz¿Ò¶1¥¡å}íñRò¨" ´\Z.q@m¹l„|$%Q8ð‹" ø¤g". !å›ãÕ`q…¡äHÄV© ~}§57|‚dE®éÉYÌ¢ã¦^H©sCª½oÆàËrIC?ªÕ±îª}»ª=$]Ë!ë¨HžÂu„½«‚ùåLp6©—ÕóÅpVØ‚wî×χ¢ìö‹ds®Ô"ä%Ô0£$1M\!a¾ %¯Í‘Ÿ‚OD`Ú?…¯³cB€q ËðÉœ.Ñ\N^<Um'ã¾”Äudx1Ø9KÒI¨ýJéN-Sø.¥‹Iég÷AùÇÁ½Ý%ûÒÊlÚrM'ÙœI©.ÍrAè®\·<ÅSÊÜ™“ßrq›Ì5s4”¦²ÔÐîO²±†C\Ž’ÿÖqû{LÇ” =>]pÏ¡ùIiÙ€¡ Δ.ƒ_9ÝϽ¾QÆ“•²ñ˜w˾S¾Âæ#và°9Œ[ ÔÓ¶$Ïë=8"ëS«)x¶¹”§ŽXù]‡¶oYgÎÊØð†Tʪ®™ŠþÔ‘*dþŠä:Vð3”ôË€{0S$‘&¹k·Ð•(Nºçm%G(§ÊС3ޯ˸µ¬#ÇaÓ»X7“‡³òO[³ÉŠX„êz[ÜØªÅ[Rxûƒ²Ý ïS¼ºmlV)n\0>gqcÏ”â@ ;h_ÐcTR.R¨l½H¢jÅpåà+BQ‡L¡ +$Sš¥h 椰È%Ê‚q@(æ‚KŽ:0Šy‡Rîgu~éX–“Êý`Œ–¸e’BšGpßúé>-JH¶Ùg‚eI­¥kvç—8½¹zz–Дęõ‹Çmdeð˨ùáYˆ¿ku©íG8®"ÄaZ«„K@±¦¤—Õ•I²Ùó‰" ¤ã—‹QVßJN\±xuÇ5­S±Ó‚»ápx°Ê¥˜˜«7Càq²ðhé /aÌÕ¥®v]Ì|ÜDÒS×6…iRª\Jb;ά//×oI+± …¨6/IµŒX›ß›$ÝišEÃC9˜Ngô¬×Í<×äµ¼¤}]PX?&KÈJ5FËU˜Ï\£b)z#3όꇉJ ®áµ·ÁšŠ›'`Æ}U 3Ya*vYWVIKŽ`=í¶ç=}›ùu%¹ÛTëÏÏtôVçÆy€P×pžÆèuÁXØÁà™>A>x‚Pãqð3jG`'{t‰×—Äà<Ã(ù‚IÒoH©pþa­Ò·:Úˆ5 H"º”Ùà©Ä•2'÷”2š&M Õÿh#Æ NH»[µt}§ ÍPü0(á.c¶–Ó.SÄÿ׺öÛšžwDJØrrðÜÚ'vC£¤±œÂ¸Á@c;Ì*¬KÑoágivUz;¢çϘ;3dͦȾcFÝÑIeꎋ Ú~ø/“óS3ó:ز\Ú3@ýR„ÝÉòövÀ¢¶Q7°{oÅ&÷d÷FйKzPÎö¥±Œ(cj¯v_&F@6ÌŠ…h™!cBîF Xï1D±D³Ü}–övÄ€,¬góžfÝ` ¥ô¥ˆSœ ȳK*´G'ãN,+¶Ì黓µ!'+u|.Lk—àÏ|9eŒ¯°‡“÷Èm!©æòÝíE¸c(ÉÊŒ-ø{ìR‚òÜõðá=Êf±ô½ZÕûü »´W½…ˆ‹ï)R›q‘rÍýWiÒ à‰¹XúnemÇÊÚÞRœEp„”z"¬²˜Û¦–W6è(wdÇ\Üæàñ€ ³è³4nz-’´nZ‚ë·2*)Å-%•´V”„.äC%å¦4Žý^‹·¥Uu¿ë亞¨‹L¶Á òû½þí¦Zÿ{|í9 'ðé ãË×o–°y©¾òÒ³“›œ.wh¬ŸÆÜþTÇÚjHóõå¬ý˜ÎÝVíüÁòNV €ÁU¥æ.5Ó2@ˆŠw³’¦iªv ºÉsãhøLŸdâ¯Ï¹ë×–O°·én?y€ßƒ)33|BÏŒ ~®…¡yŒb/왑b!s¿MÍàºÓ{Þ°ËI˜rÚ£Ù3£"ðÁÈ×Üâkö€xãœ7á-˜˜FM4S¡Ðjå®B¬ŒŠ,Œ«0÷>ÂbØð3+CK˪zhòXÛ˜.¶„Ȳ çZlÙçìÀ:[F_ã¹Î90¾ ÔìÆSŒgZ÷œs†ÔløÆÄ|NiEŸÿÅâ¹ endstream endobj 2239 0 obj 4096 endobj 2243 0 obj [74 /XYZ 40.7999999 127.699999 0] endobj 2244 0 obj [74 /XYZ 40.7999999 127.699999 0] endobj 2242 0 obj << /Type /Page /Parent 2 0 R /Contents 2245 0 R /Resources 2247 0 R /Annots 2248 0 R /MediaBox [0 0 595 842] >> endobj 2247 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2248 0 obj [ ] endobj 2245 0 obj << /Length 2246 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5|‰E€~È!À`Èa‘C0›M°È,ÒÙCþ~ä¦d»I|‰¤d[ÓÀ´»Ù¢Šõ.V±øéO_þ¾ÿçïûOO_þ³ÿ6~ú²# ‘DÿÛ¾~8ÿëÎôÇ®o¦ÿöß¾ïÞöo»Ï»ÏÃÿo;*ß¿ ƒÓ+ô„¿ûm÷I¿|§óåé/çÿíÙþÏÃO¿îúÛðíçq¾Ã|ßõJ>ü[ Œ²~øáüÓað_»¿þaÿÛBÿ>ïáÿzÕ‰ŽÍãíø(}ÿ:¼k€l­‡oÃçv@Æÿ±ûe˜ìE£¥ tøœUurßÙSZ šˆÎœ‡µ*Ë<ïèš³,JD皈Îh+{ɺásO¸þ1hrñNL!ú}€W‘t8©æN$y—g¢DtÞÒmÝ3¥²}ǘæ²Ð3ÍœGQšež½óZÉR6šµ ¸`¢eR6C¬[`}1,AP<+žä9x[b,T(“JB0Æ{5_“…^1óáI²H„6dsL‚Uæöu‚±„‰>.°¤é¸ih0¦L~vŽûXÉt±×øJ1òZÓ+"Ý+Šá5,eoR$¥¯á[ÁDBóYKåÍÒŸ êÒ2j¶ƒh>ëPc_7Ñiá—BÖè¤íôÂÓÈdåGä7Ù6Qáàú„•×ò¨®ˆM„fzÖhT%ºX)Î^ê-C$µ¤–—ÌPó6T}Ãaã¬÷Eh²ð°Çæ,Ô÷’#dı,ȼúÑUpèE®ñªšN¶>Ëy: ÷×f­p$æñïE.˜ ödcü¾21X¹gil÷+Åñ ¥EAý¯ˆ0ôÿ5YùÕ9ƒâ1Áð”c› )êÊáÍFì®ÄhBlJ-ó”²ò¢XãÚ„5Ös)*ÊÂgÎÝÜ$¼.¾Q¹tf+ÛðMjö’Aø]#‡ËPÜ¢q¥LE!Ϙ¸ {ÀÎËý&),.ö‡YÄ ëº,ÎëŒ:‡E*Â¥¸Æ˜éóº s˜ Áö_µ-^ñ¨Ã"¤dBÒ ¼åéEkXÌ×ÜRâ)Yÿ²ŽxJ>$ƒQÜÕº¦=ߟVˆMå,$ëÎùR>JJøl¾fñ˜ÃA¾ìaë‡GæRåÜôtØ‘J~jù@‰t†ÔFìô&)|K¿Ãʳ¼´ÄäÙ+ó!O0°'äC^• b{TðO™éˆNrãøZïÓ¤¸Ž$¯»™€ê*x{²3ø×Î)ÈÐY6r5«SÒÈŽ~˜žO'‡ó#.ñˆ¿È#%å”tÚ¦Hr¯¶›9ûkä,÷)brŽ™/ï÷Ò”°Ž`’ß—pš¥VÛ{:/‰‹ñ²r¤Hb•ˆ•›Ù¢¤šåP‡ 4ð‹úÍ‘œ¡pJñÊæd3îl‡‚jZŹ¿`Nñî‰eIOˆ2q¶šeGë *Fo´§•Ò¥h„ÀþTÂÜ{cÉ<"¤î0)‡{Ü8¨{°àg`/u„æ ­#@ÛÈFR„fy¨+Tª¼–F¼Æk2ŠuBB¯¬åuöuŽ0ì ,îÂÕbûˆû¹aovzËJ+ ŸœÜåÛ©m‚–™a¸Q+1Y;õx¤¸+]J';èb¹s<M°-OâåGÔdu™¬;6†l!!¡ËàÐq¸ñ&d̤†˜e!êqH¤³³6“ÌÌd¦u™LµÞè²V×m$»_ú¼ &“ôX|‹]N¬{°˪•6£˜Èd>M¶`À„ƒ‘@W+_ˆÏñéú)ûK»TC^©Î0Kê&¥çÜ–Ì5ô\½dîœÞ6·tnÑUrEÇ “;EÀºtƒ­¤Ì ¦j[jªù­š{«æ^Qƒ”?Ë2çÊ‚ë:q2I‹_,±¦ÖN‡‹Ù>ªìÍ ±¿eÝÑj­è;2õUÁÝŽÊ4r´²Å¶Ô_®œý½†LiŽ `UͬÆÍ–ŠDÞþÐÊrôlÈ|-ˆ’ZØx.Û[(Kæ,AP–#)1ÍOðû,œxû²á£0­5S]dôŠÞ—Ò*½L¸z«MÂulÒ²R\%¬õ²v—o»bKïŠwÄ™§Yü·=ví”o]¾<©Öm6<ÃïÁõ.°×ȬãЮwÇyË6VBGÅ'Uºáw´,ðÝÑ~%˜çôî0¿‚”¡t;ÊûjA ‹|V 5„mÍP{‹b–Öíñ­›vØ´Ã jÇ3)ïY»<Ëé$ÝýÈóš#èZÚáJq€uÍ:¤©_Ïq¹Mš*JÓâQ»ÃÛ­ ž¬¾)Yý,) º7ÏÔkHQhPööÞ€j›¸/ãªoŠ©aNè:µ•¡bá®r…uÑ^àÌÐá1™i¿$À¥Í¹¯Ð=q8ó?£­WgFT@Æ7ËRª¸•v`ÑO/‰M!êkfâÕñä³ã€)ö¬a´ÄIµ5pr¶ŽdHé—Œ-’Ü<Êô(× õ²U¾îj Θ¥ü³Vk$5©›Ñq  KÙb€fn×X½áHî§ÔãdérX©CZ™Š–œ9Æ„2ŽˆD©9-º˜”‹<·úŽÐ6 ÂÐúÛ‘Jm}.³—?aÿˆ¨èlLM™Ü[¬àÔŸwÜ*Š`ž?æïgkñÝ›ud ¸ðç·:€k®àÒŸº£:€ï\¯„_ú€LÇV!°íçþx{û¹÷U! H@ææn|ñ5[†-§Y7V¬õKÆýÄJ›d\+VQ;#„ðKÓcnå z”k†zÕBÛ}Ó+"S3½Iéð”v@úçßü‡s­ìeD6)%%™’ ]ú ¯rK8èj—5¤ &ðü×­]SLJ9L?‹ÒW™e¸&&‚ ñ¬e.’ŠÖb%-…ì S1ë"”­­¥¶þë¹¼nñ·K‘PŸbWL-uÑ^™¹º—ˆ®è:½$ƒP„(ˆÇK^ßGD°Ú·¥5¼š,I--%59z­¯ä´Ö€¼åÇÎS WÙRám‘$ô_°FS©¢Lˆ ²Ü¥¶ü áÖÐêØŠÞ?a’‡—G4 s0ÒŒ‹WWZ—Yû……/<åºsþŒÖ™2B´/qicJ[ÚNH9@õ2î%_"dÄÒgD™ßìÛ+Ù Þ_.©þ[aèÿ9Îz_åÃ#nÂj!œY\—ŠþA¿§êƒ0©ùãØ.éTÔA¹®hFm~†ÚôÌ)I1Û3|F¡gÆoÊ}}¨¥úU¥9åì=š0”4ú`ÞÙÙ‹™göè+„í9a6:j3®A;[Ïc<ï!6<1*¦ƒ‹§a\#˜AúG$‚š@PG^¨±3R»¼{.ɱç=€±.ÂÅÞœ¥…S™ÒÁéù¨0ñÈu'æ;Ý7z[ýÖo<„" ·ø'!9‘usôȨ׫œK¹Ýpj9å+Wq®Böäþhë–ñl®€U å¸bøÚ¿ äH{øƒñÛ·ï~°‰œ鳓•œúw«äž˸À‚\Q©ó {N¦²ë1”²‘—½K%KjR³®é.‡ Ý…mQ8o˜º˜‹hÛFjµlÚšKïéá3 >£§c #ï›F&^šMÛ²óß<ÿà +|EÏŒÎþ¥ŠÖ1ÚȸgFŠÅ¬ž5¶˜Áu‡Ï¬¥ÝGÁŽ¢ö(Ø—`ìø`äkfñõ¸{zG1ÎǶQ#˜˜F_-j¥¼CÒ8fâÃxbeôW㸠sï \!† ?ƒ±¢G$mˆ mL[C‘ÂK#¶n‚kv`ÏŸ‚[š !¾…`|A¨éÙ¶Â }Ö÷ç¼Cj(6åQR£'‘Ñ‹ØÞýC®ÙÌ endstream endobj 2246 0 obj 3645 endobj 2250 0 obj [75 /XYZ 40.7999999 291.859999 0] endobj 2251 0 obj [75 /XYZ 40.7999999 291.859999 0] endobj 2252 0 obj << /Type /Annot /Subtype /Link /Rect [348.959999 413.779999 437.279999 421.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/bugs.html) >> >> endobj 2249 0 obj << /Type /Page /Parent 2 0 R /Contents 2253 0 R /Resources 2255 0 R /Annots 2256 0 R /MediaBox [0 0 595 842] >> endobj 2255 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2256 0 obj [ 2252 0 R ] endobj 2253 0 obj << /Length 2254 0 R /Filter /FlateDecode >> stream xœí]I¯äºuÞׯ¨µ×)j èÛC€,4º,Œ,‚vlÃpéx‘¿©¤DÖÇáðRÕÕ뇾·K%Žgæ9û×oÿuüË?¿}üö?ÇóÏßÕ©j«é¿ãøç÷÷ÈþTËé×®oNRÿü<ü:þ:|=|þþuíùÅùÇððÒÅÔà?üãðÛÔùaúäÛÇ~û¿£<þÛð¯¿ÿøŸÃ?Íí_øyèu;þò÷é!…ì‡Üÿ6>üëá?~wüÇ0„þÜîø÷ïu5¼‘6Œ_×WÅùÏý« ¯ad¢îªñ‡þj†Åøßÿ>üyhì:Š“VBt­êªÐF;9¶ÚÖ]{ìì&­‰5$Û骚¥q<"eZ¢R³¡SßÊN5•îáïá³Ö‚g. ¥._ß¶<Û©Ï6À†8·A‹î‘ÓqjT» Ôª5 ?À¯â¡õ [@þ˜½¬Š×ÕîÓ6¦(8-P2~¬$;«’ëv¶»Ö°3 XEhޯƱ…cÅÂM±É®2ú¾7U§”HâcÝ…•K„¬ƒƒ¶L{±,è ÿæDhS«1¯\¶•Œùʼ"9­œÙ\tdRxÏÔguNåЙ&9VC%Ü,àõÕŸÀh´YÄOæPÎãÍ °¿0Ãû "ü.& ˯‰63²±ì[“Å´êò2¾U·ÌÐpêŠp¬mQI¡L'¹¸>1—Û¡¶2¤,…Å‹¦!œÎòª¼$¿ÆÀÀ$¾"<òÙš #9¿ <“­øž$4#ÁJv(“ð}SŠKÍU÷@Ót¢15ÍÔ­>5ÖBkôdæGïÈܺ²k”1ƒÉ~ɼ ½¹ Õ¸¢o„]ø{zY{wbÂø G–ã ¯f·4mŒ¨Ì#€¡\r('¸1ÊÐr))î 6Õ(Öc‚§è#¼åæš‹»Þ‰¹Ë÷≯¶Bcqc"” ¢¢š˜¬?õºZîá¬@EsiÖÐÖô :BÆxJ hårƒöƒˆ"¢¥'(&„­æq_“ŽæÃ]²ùŸÔð ôÝñØæÝ‹ŠºTp>JÄ¿ƒã>·†×í#l G)(ñ¥ñóQpç$|¢ðÎQVRH gê ¸Ö”(ÞSiÍñæFÈsŽ5ð ¦^I#ŒZà%<© Ò%!2øhºÆt€Ç†Ÿ`IŽe"¦ø‰çà.H‚DrÈxÜÞSLoX*8¸.©ßU½ëwÓªÞõûFõ»cݰ¬¡H(íH­QƆwŽ@UXÖ8d–\¬VIåF‹Y ô3Û(›`–oùÏJzÝ-7ž@(–ÀQ`Þ / /×À&ó݈RBuÄk„NbÒ¶²Ä ë/hhŽ™‡gI• é&À¡x7¦ã"šŽ |>ÙCC{h¨¨±·áÐÐâðê©Vïzê6Ó=ıi=%1®¾:¯æ\3§dÆæàzJ0‡-X UûÞÏé„0Ú.£]2šWnP4w©€”ªÔ%ã=&y—ñƒ\É“ˆ¹á*/R=|x"-Ô $SD  #Øc >!h÷T áù˜ŽÄ2BÌ•·&%"]Büø kÞ§#øi.n ,U§ -â8šÀ'ßbÕ°C¨q0o̓CþQ˜/¡®8æ´+O©5%cþzxû].©I%Ž—0zÝ­ £Ì¥œ qðäJrø)Þ(É|V‡YÁš3Ÿ’uÎc[[ÑXç,ñ¼Yu-LÞ$j`Ýš¢&#D•k½ÚÞ\¯'Cþœ¶r+ !”1ˆÍc>*eq ¥–Ž›Ÿ»T¯Í¹…+ɘ kd2á˜e÷Q|’Ü6¬ç"‚{;üue–<IŠ­¯p{‹e‰8àæ,.JH¼º¦¹ŽJ.]GU?rUcºuÃ'–ë8~K-ZQ÷}\]G%¹Žª²ú¨l×qü–^´¢—}pÕ¥†O,£µ¹š©—Vô²FkÛ^¸§¤å±ûò´3h~2"ʵ¼çùU)YÜvìí$¥xñ֖À"è(;˜Ý±RÜ^6ëÖ¸¼šPtì( Ì^ØXwʘÛó™ôªZkšü'.ØÔy_-Õy/©ó¾6Uíð‰¥ÎÇo©E+꾫:ïô#uÞõfÃ'–:¿¥­èeÔyßìêÒžµ™\=~biÏñ[zÑŠ^öQ@{Þà›`­%%OÂ!í-]Œez~—åE¤3øÓý¥–áØLZE œŒ?’/aËïVÑÓXEµ® ±óœ û”;k yÏ ÔïuÞ-nêÎØbœÇ^³ ©¹¦iM=÷tæ`Ó›+º3Mq¦‰ªÏpØ„~ð} ùù§Óâ1íåG8“]·ÜÐÑ묥tŒ„wŸ„m}Ð.Œµ,˜-Bo(.5†€qghæ2žÂW|Pø>Ðz„Ãáʬ‹„B”©"8ö=E&aœ³À‡mkÞݽ”ƒ 4)+¾<«æá¹"=:lñ"`ÉÏi»¾Ê('ú‹¶ \†ˆ;ÊüÈýøòÏD¥ox[I?p†uãgÖr{‡L,¨ååjãB€â×Þ°bþ$L|¿1p{7˜:,f;KxåîŸ,áŒÜy‘k«<ÛiµxË"íüúŒO{“à«]wƒsÂrR®TH~Äõ`B±- pòÀÒ„cê8r7Ã#—Iò— ›qé½ï|x~=ßÙo(wœ¸áww¾cf¼n†Ùq†I9÷ü?G¥,LSTðÜ“´¢BjÂmðÈkVTEŒH¹©Þ±:O™PSè÷ƒgJÉO€ý`ôF‡|ÃOè°ìÙ©Š—(ÉðÅt eE1íÀÖ$”½x>”8ÖJr‡[««µ5æŸ(ıÖXo—H¾›­9U‰ éX_ÌgxÞJ"I.üA ‘8@I${÷Ú·¾L[_r­¿­‡½Ü¯Õè“vž4ObOâ~°¥Yå/šN6Ts>*r|Èñ8?-¥J‚kŠ æn÷”2Sº  ¼¬‡'lúL¨×ë¿:¢^‹%/ÑêÏÁËt¸¬xþ­!\ŸêX3!Žï?*´oĶ…"ŽœXr¼ÖFà§|’Òaã‹G_ì`7 ž6bnd­?Á%)Ïz½6UyÔN{)gš_S›š‚ñʦ+`,M¨ž (¶HkŠ0¦8äs‚[–3ý È  xª] i‰r'‘e†Rö4á ìgÊ+•æÏaŸ"¨Št}™‘Wä :tc–É“Gn¹/ÔÅRJ”%¨’T´ëåZ$–˜Z¦pmPR+”æâaT„sqž;™2Å+ çtqXÒ,o ÀßH°9cŸd˜° ÃD˜¬á²¾mµ!ëWƒÝͼ—;|%Ø–¬³2â¢o×Ê¥" šÝ§:5ÃÙîêÝ?| ÊËâ1wV‘„º¶øå‘á~UÌ\ ®þPcö@¦m4Ø"Ÿ'«…t ÁE`[„Q³âù‰˜/¿»[(Îó%ÞRê€Z/BÅI Ý®…¾_¬ü²‘w˜2^¨´b1ן:Ÿb;µ;¢&%üÇânåÉ߈8U%ÆE@¤EIsmº~)™Jx‹‰pQ îg/}q¾ƒW‡Ð#ɯ¡pËñ.Žb½3€’ìHçßÒÄñž’ø?Áå 8íRøˆwaõ’.ÇZÃÖpiHå-ºàƒA Ð9ºË²'Ì:S,gæ ?c=E‘vŽÂ‚Üõ»þ ìÂ.‰ËX”íøtû²sÓn¯ïöúÖåín¯¿#-!pl-‚Ëšq1ႆR;Wj>/©«ë& -ï~MKì~ÎÆõîîç¼?ÇsjÚöWÐZÂ1ó^%Méo¯’Þ«¤ñˆbÈ“µ¨1Ä•…ƒ0²jÞË%sßø”êV™r{Uù…*¸Ÿ©Üþ ˆóTøkjžè–ŠÕÊêüÔýWSQ`¦ý­¦d#Sª©¬ ’óäQ Zšî€-ÚÃÓí^­\¸0 “œ#¥ ~½„õ®º^BNÙ6EØ‹”û9ש‰fXýþ(ôÃbÞ E¨S—ÃÊx5ýgŽNºÆx"> wn(êá­Ux½3#‘ŠúÔM»iò–hNkÝzÚQ&µw÷¤žùQšñvÀií¡51“`= ín>ož5ÈH¢« šÓêö'%ÍÕý‚žÌ  ;ÕVœ›hÑJ9V®!^wÇ*Ô¦=!ã[Ÿ ýPvŽÚÁ1˜’q?_J)þZ¬ÇQÀ±ßc'½Ö[y!Bb "pëRÜf¿ó† Œ%e /c„êƒG0l?:ì¿›“DÑÖmnS«òÔÏZ,„€ó/çÓþ›¦p…ÌEGO-³‚wn’tcY6,žp¸+‚ø0gófP9,ŸruÄõÎY b"ò™Ä /R¼”ü9bœ½¦öØnŒ3kk^Ûüx—)ÜÝg†"ú+à»%£1ì8å‰céòæûøÃa,˜Õ[·†¹ó—\ eÕ85z+%<9­©…Éi~7€bk:žŒˆ@$™›)½ð“aJLž%=°äÅÖýí¦­í³b\õ@© }Be)åZO|-[ÍvÀ@/úâË:êwðúâjJíãSÖ`lcµïo·Â©q«³á'®¯…OýàúµõõL©ªmL£øJW¼?x>ì!Ç“Rá(Ý^2ŒJå g>[ŠH¡\ BKµ‡ði·ëÉsoß`ÜŒ—6rm[Öú²ÎÐ +)ôÃÛÄ¥L_ QÂÔªXÅSŒ&lœQàJ²ÇãÚª7iiSm!LÕT²z rJvmXÝbEð@—ƒâ\á^ìJo œ°úºm"”Ô ½(oãÀÕSà¦Õ× (Ït—ÚÅw~}½0zSéöýíãöõÞ&ƒå¥Âè ®(†¨ÃObLè^ Å;ì ÜÜ»±·1o„Ðl†ÿߟìÜŠ•³I9¸ËÎ]vnÄS* !ÝGh¯nõ UpÉ9é(ð5‘,¥4ÇjEîYV@,¼ È¡–Í'ˆlÂß©4,||š¹„ÓÞO«$,.!¯  ÜÊ{|êØi<"ŽBf4ø¬G‘ÂÜŽ"ÿÁsx9ÿÎñ)œMªÈ¾µâÔͤøù¿s1w*adà'öÌ?…ïŸYÜâØÐðsÏB„›‚™—/Sh÷ÚbäaœöEÉkË 'C•ô̾œšª5ÕMBj›cƒ,u^“„!l­¬ʾ0¦ëpû.…9.R/ œ7ò(¦Ÿ»e}‚ª§ŒT&.¡Ø™e@½Î»§²jÃ÷t+i÷Tvõã=ÍÚggôùªu«¹Ã=)nKJíBx¦;%ä—©VÂ{%ú€q¯A)£–eÅ)œNì10¥¸ªxÒ{'×RbâPž!VÍ™ݘ5Æ#Â%”k›x1ã²\â71@R ›úA„9àEB2/!°Vƒ‰‰QñÈ‚xÐ…5pq05z/€JÁãIº½%ÝüÊ>}£y™¬²‘PZ yÌË ·¨Œ9ï÷P½ø=T{íÕÈMßã¯m®¿0ÿøñÓÁG6V7üêdAç«þDÚ£¦ñuN‹vÿ>Ö•º,À|UG{j0Z€)-»S÷øÀîÁ“‰sëú$õÃ㟦9µÓ&˜Ìö¨Ÿ¾£á;“§ÚÉ“¬Î÷’Üž¼ÁÖ&ʽÿäüî,ÃÌð zg–’ž4™#âÞ™w,fîóØÎ @uãï²W?ïÜíY³>cG ƒ™®¥E×â¢Q¼æ²‰‚wÓÃg‰šiÝ!nœ¥Ãh®Ê¬ý㨠Sïg8C<6ü^•éI+NÕô(€·ñ¾Ø" >zbË&8gǪãö)k+2®—px½à¨Åyœ Ïú~ œóH Á¦aÇý½%ÁhE¿þo_Ü endstream endobj 2254 0 obj 5874 endobj 2257 0 obj << /Type /Page /Parent 2 0 R /Contents 2258 0 R /Resources 2260 0 R /Annots 2261 0 R /MediaBox [0 0 595 842] >> endobj 2260 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2261 0 obj [ ] endobj 2258 0 obj << /Length 2259 0 R /Filter /FlateDecode >> stream xœí]KÜ6¾÷¯ès€Èâ› Äö8Àx€‚öfÁ:ØÙöïGÝ”zzÄþ(ñ!65¢ xÚÃV©XüªX,V‘ï~üüã¿þ8¾ûðù¿Ç/ÃÏŸmÓÊÖü9žþ~ý ªFÍG¥EC»ÓŸã—o‡çãóáñðØÿû| òüàð£o_aþñå÷Ã;óòƒùÍçï?ýÿHëÿ÷Ûñç_ú_z§/|;èNž>üÇ| ”PÝÿçúÓ©ñ߇Ÿ¾;þÞ³ ÏtOÿ~ßQ¢ú¯Ä°ñ|y”œÿ^? ÞÕsFíE@í?‹þÓÿþyøµ'vá¢é8!JrÕ.%ªèHµS² aÑ´z¶ˆ‰¤#z8¤ s–WT¿HË•›R¨Ô… ¦„ÇJk¤IGJžfôÄÕý¥Ž)…J]1ÓG®b±>RŠ”–¤­N"õ?$ª_£Ô1¥@©K*>3Êb¥%“X)4M3z§É#ª_ƒÔ”B¥.µA–P‘ Å Kñ4*sâ‡Ätk”ù”ÐcŠ™ž¾ÌôÏŽß?Þ}"œé“_óôkÏÇÙ92?žú®Šþ?ýÄûãÓ×ã_zIüõøôÛ¡kDÇ”0Þ”i¡ µŽZ¤Ö¾‡-`‹„-þÔH@Ô oDpý¶tïùÁ¿§éÀžRÈ[û)åÈ9ž¡þrÃHtH¶`‰býtîá©7 «kºÔ£nâ1¹;Êñ{ƒÏ`‹ÐB0ú ’Ö&Ü’”k, »µ ÷”á÷ðŒ(ת¢< åØþ—ŒrÌ5¦Fñ{°¿QåÓ9É¢¬•c°¬æZòpJÅ(¬u=Øø}»³ÒµÅå©yµ8ÞƒŸ ñ±1f W`ͺ»o&rZ.Îwg¹¸$)×~!ë+ÌÛ~,dbËÕúÏFx´)ŒO”l…ïÁ¨Âžkˆ¥€².9‚åxÏÜš#õÖtÞ¦…ij’F“ˆ½ËÑÂX~ŸoLxKf{—v‡ga*2¢”Ó˜Ù`?~I]QÕõLéžDéëκŒíÇÖl:úXmÍÎm FoV[#t Æ isuÙ—‚¸J·Ðfx{fF°‹Smà¢aT*®UF¢–a!É_¾j¬’~ù†œübX³hLÃzdœ+æ¼áFl­ãý‡¦›„4‚KÝ?þBÕx|ªi:®¨rÄ€ÝøUjQÅ XTà,ïî01á:BG®§fúVÏ-ò|v¤±- LŸu0ßM±~Ÿux¶_ÃàW1 È´ƒ¥å#mso&?ÙP¢o&n½Ï²ÓaÃ=çlÊ@&54œ´Tä•1aãäÛ;)òÕXà–üšF_YV?óH¥±d˜i‹5¨êöD„5«Âì\5?½ùH Ë¡Ç Å´œ£¯òô>G‹Xüb KŸùÛò Âl ÃOZ*ÞÏ™4>ôªÑ];1$‹YdÓù<Äð˜‹æþ!Ÿ·.ôe·f‘+Ù´Ô8s -‰c?8þ…e ŸÁ»ÏÝEÝ.8Æ'€5œÓs[BÆ×i8ö)CâÇoX³0×P¢AñV¢¸Ž‹Àç²P )ÛßÖ5–ó®‡]gg]Èœ¤²áF«ic5P‰­a›/hÄævþêMÉã|ÂCÉB°`-CðŠn]qæé9˜za1…že,I&ñ€?‡ÅŒ¸¶ÀzÅLï¦ÆÎƒ/ ¤úŽåØ-C ì²[XÊåƒ+®NO;l«z.dór¥­Õ’Ëšïf‚N;ð¸ÉzyÑ#.Oœ¿ÂÛÁ@–ØÓ¡ßw솲‰<Ò„g–Ïí1/ÙîyHQñ¼á?­Iz©}ÐúÙZÔ0{¬¹íEÆú05ÑN¡Iö¢Ç 2Æo/ÐeÃ@ÝÀ_Î=ç‹'ÌÙ©-îä"Y¾PãÉ/çê’T²ÏÀ/mb“…îo5‡$×Ä¿’Jpb –|†þП‚5øþ V¹ÐëÌA@šŽ#¡rí †GK[eœ~PlRî2Ú!ÒqØø»Ã\§-õϽ+Ñ» §/ ?¾|sø¶SÒ¾8%N·Äùè¬?£å‘ôݸµÝiö“ެ«ŽZãWKÙÈÛ[ÇË»4Ð¥ªQ·ÏûT7Z̤ÀXC»Ic&EÚ²SÓÔ Þ¢fÔêú7áw‡uÈ~BÏ ËÅ[-õcpËýžF̧ïogˆ@Ýé3D½6 ^£=˜‰[<ª ¸¦®ÉG„Q,s*ü[ðh`< .WO™BÚH?Z¸Æ…R–·~¨Âè}€=ļág°TL‹$Mkšè6ÛB¬¢…·ZlÛûì:¦"[`¡¼(`yA®ÉU 0žiÝ#çÌéİuðÅW Ç)½ˆããáOÔ&ñ endstream endobj 2259 0 obj 2946 endobj 2263 0 obj << /Type /Annot /Subtype /Link /Rect [158.879999 754.580000 229.919999 762.259999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 2262 0 obj << /Type /Page /Parent 2 0 R /Contents 2264 0 R /Resources 2266 0 R /Annots 2267 0 R /MediaBox [0 0 595 842] >> endobj 2266 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2267 0 obj [ 2263 0 R ] endobj 2264 0 obj << /Length 2265 0 R /Filter /FlateDecode >> stream xœíÉ®ä¶ñÞ_ÑgîW‘@À³È!À`ÈÁÈ!Ç1 ‘‰ùýhëž©¢Èb‘êÖ“ð{O”¸kcm|õ—ÿ<ÿûó«7ÿsþ<ý|óñÔ\ÝŒÿûßß?àæ"øøkkÔ…Ûþ¿óç/§¯ç¯§§Ýÿ¿ž˜>œ~t×!ÆÿøüûéÕ8øi|òñÍߺßþwæç¿výzþñÝŸ¦þú¾œŒÕý/¿¿0θéþ¸ÿ­oüåô÷ïοwS0C¿ýÿ¿·B¥³¦ñõö)þÝ ŒÕÍŒéVðîï~W0þû¯ÓÏ]g·Y\¬d¬Õ²mb;mûî´6æl[}V­×¥·°¨ŽXf?­”$ýôóa9ËblƒaAn¤WÈdæo=eöc5'é§ŸËZ×èpOéPgFuŸô¤cúy¶øeº]åvÄ-QG_È[ZÃT¸'4ä…dÃ*­Ê]æµ§lxI¡h:êgIJV6Áì ve5د=eCKSá{?#°ƒ¡ÁÞ’a{K…í† Û[*l;BƒÝZ>®QñÜUÞºÊìÈ0)hàÞψå-m<Üò†Y9¬2Gך÷” x®høÌ0£L-r€»×ÑŠsÿv®øøðõ§Ó«÷¶?B}ú¹›Äp|úr’ýÚݪó§ŸÎjñæÏçO¿ž»(©M«†÷†–F-æÛ9<)º÷Æ3ÞÔ‡–öÒØ±éÖ"ßߌˈîyëÎoêõݧäyì¨Ù@dp 8ÍÐ^”7!¹ÒB0Uh³Yw†œÏÓºè gf>=þÞº· à†1p„t;ñf¤@ŒçêwâÍÕCf÷ ñvx .‚Öq”¨qðfîÔß¾ƒæèuâƒd\k.ºe3B¯'혗žõ ·HávïŽÇß¹ËjâùIIÞð­W9_Æm½_sz…_¥Dà‚¼@6Ìál\#ã׉F€0­Iv×'ÛU4KØÿÀj¼a~Å$¸Ý¬[¼e Äs˜A<=&¿Ã0®¡º¡• â¥IÖûRÓ=¼Õ0¾`V‘!-áñ0LÃç»ÂÜ™ÅwCØc'žLJ¡YjQFÒÁ‚ÆCË·ËhYPà¥\åÓ… נʕê$¼/ˆ³Ì–# ñ”Hø<,û ^,8׺`g”€l>øFQ}m¤+ÓsðwFh õp ¡õ®ƒÈœqDô‡AHìÀV#tZR­žÜtO…̳³±8òeñäË[áÐoÀÒ‚9[¸vØ|‘‚èñŒ#ªa`¼>äÏŸ4f˜5CÑM^ŒÇü€‘o´Q—~;9ÀÙýƒßNëÛŒ9sp™½®$þ 7Wü¶‘`4&Ÿ‹¬Ÿ \”ñû(£Ë'œS=JÇô ŸO=æð Oiõ€åk Jl­;.¬oÀl Ãô0ã€Ø¿nŠ¨Ä ª¬€¥ÉºF‹e]?B+—1`^rð¼Z¦å.µ°·w`ËÛ•qJòéÉÅô LÙB;cbŽÓ)šl†á¢Œç¦±Â¦»€Ñ9Þ”VØ(8òÏ•þƒ &~Œ*˵’ñЂ-? 8àk°eÓäFí¤ßq£×îzð‰ô/Æ6zEð&Ø:â½î.‘€Õ«ñ eQ´d´áσ¡K-`èƒÇA´Ž‡µ€½qxp¥ ¸?0tîi¢/¦e:J$µÆáÏH?]æ0ŽtºN§U8¾mØ^9~ŽbæÄ¸®XËî}püט°†±„܇yÌß`ª‡w1·"©Ž”à7^sH‰g•Ϭ =¤Ô;¤Ä£a=¤ÞSK=aw*õ2’¯ðtrêz‡ÔÛ£Ô«e“|é ’‡+qeÖŠù&2uõU¹b%Ê?¿©TÆ{¦Ê µÉÜÍ GoQ¤ÕJ¼‚¢ÅËê| Ñù†óO dÜZ—äÆÁþy8 m«ø—Õ˜§‚`Z;`OLlH|ÐwàUD†SD@bBfÂ*Ö£~iLrÖEËæ<˜„ö²$$EvŽ:Êî‡ÃþŽ`§äì°ÂöîÊ·'÷ð¦,°LãI¥Ã‡ò 'õ‚šŠÕë "m9„PtLÔ3"I%%—“õË+ÐöxÖo» äS‘|˜ÔÜ ÔÝÂÝ´;åGõó€‡ÚF.½è˜Æ…eJ{餞}Ežéô8ÅÃSósa™U%ÐzRåÉX…äÙ’¥s¯‰bÙ^FT ^/oøn¼_9/uù€7^žWÝoå¤êo¿©ž,8àÄo¼2W`DtïÍÚë50w9° Wq³Þ0÷¶ay§ôÄTOX(ÌÐ znõT—áúw{1¦9ëáG˘ŸÚ³^V==ù|ÒêÂ˜åÆ°Û[rÖ‹¼£{ú{øìì~-½1dÿ3“î-;ëÅÎÇøåôú»RÀ&¢7× ü†»œ "Ìêezž§ø°4X_v:gÊE³‰V+„ͦ¤ÕÖ¥3h ŽTªý@jnß|ïËTcCGRø3¿ìRIm×H—=äøÚâ±Ø;9¥ÔN.#ã0þÏ„csFxLVçxWM`Šˆç˜06¯}N\Ôf> -S6G&5GÀ^-¢¦b0u÷` Yuߌۭvn ,‘V²Ì±Ž|ÁTþòë3“„)P0|?~Àc{¤eàü°@L¡:1e+ÿ02'ÙÊ 5Ü%'Ü _13m×sî ¨\¥®Ç—¯ è@ ×°ÖjD¸ÌI x& CV­í‡>‰±*ÿ=ÉçpF˜¼íˆ{ƒµ“ˆ’–ñ*qÂYޤy-¥+5xÄêm[˜ŒÉv¤>šGŽÁu)ÀÀ8¼DR$—¬è­cJJ( ,4ŽW6µ§%Á ‹,}LÊW`npD&µ t…ÒÞ`”…wÆ|CD’ÁøH „1þ1L2~ ñ[Ud)œÝóñ=qiŒ´U“`Q “—[+Ì“ÿ “SFÎ}%4ç$4 9ÌçÍŸ š&šJ¤¡ÛuÒ@p L®~@ücTÀLB©Ž¤ U@Ùƒ‘œõ´Òüè1ÁæÑc‚-E æFõOÜè±á-9ëEÞql)zL07z¬âF oÙY/v>Fùè1Á™Ë9"\E$~ЄkDãs,}³ùíiÎ*•šÂþßú:Ù^´¨èË„,Ô¾"+DâÁîè‰"?ÌÕJ–Àꮡ±× Âb3?LÂŽ )Úëåz{;]4~xàJQ…º¶Oµ>ÊæíÎv^­¤8lEôFKÕŠãÁ‡M„õD©=ئ8ØÃ¸[hH½+Ê‚wGäò¢2¦°É!*qFÅ—Sý¤’H>Då!*kŠÊ¨ïº9w٥ؓ,â:ÃCì¡ÄÞC—ʳã!ö*н½ L„Ù,?Ë(5›9¥æ Î@©]G]ÿÄuoÉY/ò~Œ«3PêfÁ(•ëp쟸ÎÀá-;ëÅÎÇ(ï ”Z_™âÈþ² çm`²»!ö k*%ý-6¯ * Q$jóšº$å¡sêäx ’(PéRñ.·76ì§õ<Ãã<efà M†8I-ÚÕØJ)~ЂKÅZWâXHâì,¤#‚ÖΕ„9–ØA¶¨êŽ5J>i#dÜ©™¶ A·cQç;’DôÀY­d/‹1žK§Œ^Á7®n™¢úl‚b,wiÈÓv0)Ù$ucÊV*¤ŸäðÓ¶øvOF£@IáÎÿÚR»°-Ü*w_RÚp.—ç¹ÍÝ_>šC|ÉfV(ÓÀÝ}Û·à•:¤2T.Ëfú]YD×]3¥Æ€*K ðÂ;gì Ü9}u©Ã;GÉoK®¤Õk‚â`éKOg †»Ìí1IÙ(—”#ŠNÆ›rýDÒbߨƒi ÒÀùTQPÜÖ¶ãt>^Þ*¡ Ín†·nFùDX¥n§ËTůY沤œ3lKñU$'Žäm´»ó_¤d„u+xDd4»M«!nÔKQF´= -&˜n7g4b® Œ+!}õbÂÕÄÞ’…x[—‹gMÓÎ34£|¢«õ«×µa’)’¸Á£/˜]"§Õ‹m1÷*¦84â«8KB ì"ô2¬4PÏöÇ“ÚÔ ][©XHF!ýíNìñ’oƒÐ Ë$þX’p9ÁºÍš†8IØEQH›¨à+m5„`¨›{a&M» EL‡),F@DˆQÊB)¢Þ|!ÃRXõþ½ÛÛ鶯ŽY¤že%´f§hñ¤wsîÓ»¸½›`sB‹¹ñ) MÀ•l1hqMÙ°¢Þ¶·›¨R´qǵóAºm÷{ïÔA·OH·1({Üÿr¨ú>Z˜ÝÞp¨úÎýv¤ê¯èMæV>1¦|8H6wvüx¹£"îÜ<ˆeEèó9© $iºñHˆŽˆ–À̈¢:=íqlë0¶2yyÔW>’ÄhG \ØB׈˜z÷ÐjLlÀ?ÉÇI/Å&®EMÇ\hïǸ{ÎUžˆ;á7O"¢‰KAD-mS®¯eÌ¡º'8딬êÞ— ½˜(PŠB}x-c²äY£u±áäM$ÐævÃ9äè0N#F°¯@jkÅLqögJa7[´Ùx­„aÃnõEŽ´`ÒS[\â|¯eªÍ`g¥¶—c÷¼«ûwþÚaz‡Åý ÓÏ_¢ ôo ÿ¤šà§«äfô™uËX 61D[ö«<‹ÛíÅÍxÄ×ú¢—}V^So/ír¶l»Ð2²!.Ü.Þ’¬ÔE¬ÌåAKãð ~3Ú[~áè›\õc©·¥îŸ¼ßL‹ +|}3‘àR ƒÖ11þ´o¦KYû4·2°®ÿ+v» Þ9p·'¶4Ç^s¯Ù[Ga˜O—k&µÀ»ãÃd1OZ©h!jœ¬.q8 Be²Á¥aŒ½ïÀÂsƒ¿¡2¶hviƦÚ†÷ÅçE¨p©ÅçMàšP‡ûÇÀ–!x /ÎÀÀðgÍîlûü̘s†™:ŒÍ‚ÿp¯Ijç§ÿÄù6 endstream endobj 2265 0 obj 4781 endobj 2269 0 obj << /Type /Annot /Subtype /Link /Rect [318.240000 320.659999 374.879999 328.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 2268 0 obj << /Type /Page /Parent 2 0 R /Contents 2270 0 R /Resources 2272 0 R /Annots 2273 0 R /MediaBox [0 0 595 842] >> endobj 2272 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2273 0 obj [ 2269 0 R ] endobj 2270 0 obj << /Length 2271 0 R /Filter /FlateDecode >> stream xœí]I¯ä¶¾÷¯è³Ñˆ‹(Ì ‡ƒ #‡`Ç0äïGjI½ýQbqi©Ÿ<€ß{ÍU,‹µ|,¾þËçÿýÇñõ»Ïÿ9~¾û|¨«ZÕÃÇþ߫븮~muSqÓÿwüúíðýøýðéð©ûÿ÷S§Ç]ãôŠ¡Ã?¾þ~x=¼ü0|òùÝߺßþwäÇ¿výzüñÝŸÆþú/|;h£ú_~~aœqÝýqý[ßøËáï?ïHЧ~ûÿ¿2²1ZF‘ñýü(;ý»~¼«£Œi.u÷ƒw¿73þû¯ÃÏ]gg**#k•lë¥2)ûn™‘GÝòcÓ:}:#[Ö‹íˆ7ušŽzŠXÔÈjÖx;"³]Ô<Û§ž¢¹%¨£š§a;ìˆÌvY›aŒmô(Ï]ÅvÔ´‰:ê)bqC{"s^‰aQ·®î æÔS4¿ÚºIÓQO‹ÙÈwØ™ím×Y=3õÍ--)¬ž¢$zvDf»©ÙiŒ\E‹ûÔU,» S‰&°§ˆÅ md<î‰Êyߨ˰sW± †ó'ŠXÜÐÎ{z"s^6‰T͹§h~5,ª9Q”BÕàŽÈlW£~ˆg»J¥iTGKšŽNú!ÛaGd¶·rÑÎ3ˆäÔS4·´HcHž(bQ#Ùnwô)…7Í/Þôwσo¿^4}ààËÏ}ó«áÇ—oÝÿÑyšš¿ütüS]ó7>~ùõÀXÕH¥Ûæô½SKÝœZd%E÷ñÈZXÞR¿Z. _Õ—”ý\Üã§Úª6Ãw/-ÆêÕýÒÌ?Ú-o­O-ªâL[-'à8¹Ã#ü¾§–¦ÝÜòæº?ãP§³Ø4jš ?z³v7†ñL’™_®}=JÈye?w枢º)ûj3[ˆ9â‡g,·c1åÌÎX’ËÞD‚(ÍVÙ_–s®hªO)1m;Ì™D‡¡¨퓈|N¡¥¡ù¾4â(Àä}i¼¼|Aþd+¦€hÍ £…mylRŽ&q¸‡¡fAV$ˆ˜ã¥9(½Y';Mœ„)ŽÁbo4Ä‘$x3™¦Xpƒt¾j@’³³Ñ˜Îû 0&>P‘ÖûÆŽìüüCs†)kní IÒE²˜ o-Ú=†(Þäß6yœ¨ž3xsÎåXªâj—OQ- D:gµ˜qHQê`uJ¤7‹~Û£üžØÕ¼UšpÅät(4³tÍ“ÖW HÅ•* ‘'ÛpÚ1DËÆ˜ïôldWº™ê_x\éñ~3À6:î‰Ê[8 Oîø¬KñyìNÎl(BÊ(ݼѶxgßK¸âÖ;“b<~KŒ÷ïcg.X'lé|ž‚u¢Ò¹¤<˜‹ý‹ÀaMBêú\Òeýîž³xI9‹q`p9}ªØQ©êd×õôÉ׃jªþVŠ>à3}KÞô"¯ßÑ}ü»í;ZO7Ê~G÷I÷Ì-%ý·ÌM/æö¿Þþ×½×gÜ®ÔRü,oɤ¨*2áÕÐI£ÁÞX@xÐáxž ]–‚tN™âÔDY=OJ¡©ˆÁ‰öAHDÄÒW 9"1æÎIÒHôâE–³dž±uyf´~ÚOic^i+û'ч-°[.§dƒËƳ­±€ØÃ·äM/òú#»û›¹@ìîÓÚyGm±‡o™›^Ìí;²±»wͨ,‰ºÒ×'<Ë“²*‚' ³¼6@,ð°‹žçˆ<÷c{X0)°´’]Ò(«, Ò\ XhL™šÜ÷›à(1$i>wKÈÐ  >ãÊÚ_0„"í4©Aç:4V´Îê¯ôx܅佯ÔéÙ·ŠÇo Pe#iî©ARÁKz%¤E8¾Â+eýZ$ãÆÃºy^¼óä©Ê¸:’,n8kæ%x‹ª(‰ªMS&.ùq"ÕÊwÖ<¼˜²gÙÎ("Hr±“Hý˺9/'ÌZ[ ®~¦YÖ³J!ä Ð7/ɱÌ<7ŒÊ«M÷Zž˜ÏfË‘-DUKKÇfÐ=wvlÎ+•Á€}оs¦¦ˆ£®?øíð9‡õDÏNß2öÛ¡åÂæô’¬MJuÛ“`IyŠËKŸ5— Y˜Mm'[CÙ_ä@+¯^-¹˜x'¡˜héJ%ûyµMÖ„SÒÅ'XrWqæÈp5!“׌K{az®ÛÙá½0Äš¨Õ¼”`,Äï̶o"†÷x@^©’‘¥zÖ>š Çã¹…•P>Ïží´Ú‚TlRíá(–ÜÛÊon5BÆ`oׯÉT¦/Ž ™ÄƒdyñkOe¸g–¶±§dýçsÞ»!¹Åõ”–ÙKžEõMZ%)&}U™8¦&kÄDÎMË쵘'eˆÅ-E”˜TÒ™;J”cv‹ )•–²zÐS¥(·„á¡¥ü(¬,ðýþåRt·|)nÎò£ÂX[ÒêpcÏ=-àž^îŠÞ¤û07¡tå¸'Eè=ÚŠ(šé’zÁ=~k <Ågo1ºG~OÚP>åÄù~/ážè¸ìM{¢c…‰Ž˦¹œìÏspÞ &&¨™õ>ܲ¾1–“McÍûx!€'EcPÍ8 pË\¡ {trhED'÷P8 n¬=#àĽ‡§.6B¸Û1±GM)½PKav|“C¹M@Tjnõñ¨œ? ¸Œ‡¤/tŽˆö@Ë”#ÙBz ÒdMÌzÂ7¦µw‡U‡;°S?Q" 6ùeŠÏÒáræ<¹Ï´5´h3‡ÇÒ5:žN³Ï%gÜâá|&¿Ä]€žiçãÞÍO{öÉÌV5óçÕÆCK®óØ”I*þ@1˨n +uc¯“µÕCÈ»ê$·År79jÚÌ)N7Z: Èž¦¼}0O-qéÛ‹wéKÕ=9Hq{Q®Y½]AغÇïݸ»aõ_|ýt]ÞÕM|Ÿ¼<ô>:Ë|­Ž¬Æ=ö¦†kᎢž s#ôR©JÝ·x¬4?o«ÖV¥ÃÜ´wZ†•.DÅÍÝSƒMS©a®íEzï=>cà3ƒ·ØòŠ×¢oº´¼…½ kâú“÷ð»£{sg„Ñ3£B¼×ÂÐ8ÆÕöÌ8c!ci;-€©ëçÍ¥2.ž98Ûcøâ-AF¹æŽ\³÷HF1ÏÇ*zA-x6°<Œ)— ‘Š­FþÞ‘k,£+c %Lª°ô~€#Ä´ág0W†ŪzhZ°¶ñ¼¸"Ë*¼×âê&8f×qÿÞ2‚„üâ R€ù©fWöM„>Óº“œ¥–b3ðÅW×~JiE?þÊfÂß endstream endobj 2271 0 obj 4193 endobj 2275 0 obj [79 /XYZ 40.7999999 697.939999 0] endobj 2276 0 obj [79 /XYZ 33.1199999 608.659999 0] endobj 2277 0 obj [79 /XYZ 40.7999999 697.939999 0] endobj 2278 0 obj [79 /XYZ 32.1599999 610.579999 0] endobj 2274 0 obj << /Type /Page /Parent 2 0 R /Contents 2279 0 R /Resources 2281 0 R /Annots 2282 0 R /MediaBox [0 0 595 842] >> endobj 2281 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2282 0 obj [ ] endobj 2279 0 obj << /Length 2280 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€‘ÅEh»»äÀ°‚O&Á 3ˆ3‡üý¨Zªêj²>’ïq‘T¥6à^X¢È·oäûðÇ/?üó·Ã‡O_þsø6ÿô塮궞¾Ç?\þAö•’Ó]ßTr8~¾ýòðýðýáóÃçñÿï¢}}pþ6ž^1MøÛ·_>L/˜þòåÓŸÇŸþw‡?¿ý|øë߯o?Îó?ðËC?´Çþ=ý ¤ýøËåOÇÁ=üåw‡_Ç%ô¯óÿÿahz!dÔ2¾Ÿ¯ÿ.ïW&†®Õã79þÜŒÀøï?~';¯¢´ãGº:tR¡õë´º=ô< ÚšÓÚYØL"v¢^ i&:®HDí¬s¢ªoç/øsÀkú‘òjѪñUµ)&¹GèÉZŠþ0ÒÍ¡iø |?Sì<]›fžãzDÔ¾FHwPä õ.r“§‰b5ô:Í<òTüm`'b‚\ÔͼC¥âöø6Sä<¢o“Ìs\ˆÚ× tÇLU¯•P?0bàý¦ïåøs§æ¯ðõJÕMû•zÜÎÏ3EΣTL×#¢öu„5ÓçF†|32¾;üøõáËЪ?šT_òj—Mß¾Ug7þ6ª¼®?|ýñðûºV/8|ýùa¨šAuÍdÉM#õ'4"Z8ÒÃÙžáÈý=JÁøŒcx§pDÉ”ï©á„¨ÒpÕiGj¸6ˆ¶k¸<’Û˜ªêAñB0¬ñ{Üs|ÏG4"áˆÖP†8$cÕ˜âշ篣´Í/<‡nžQÂS6e„g1¹ Ïu ÏuŽþ8¼ ŽÁuƒ:P£áµa-ˆu&Y–ÚG¶ÏöõIJÝyâõ•}Õu+›Ë­MÚLWzZå§g„< …<ÓÁ‘‰Àºª`o*%{ñnmx69rþƒžð M”i“"®MÖ“Õx­Ö¬ð£3þû€8 @XIk¼o¬AÛb À~œ^˜Å+±?jîÓA–xÜ[Û²V4Áµ­¤è}8QpŸx­ÖŠÌYås½âÅcœ`À/†;w°+á¤L6pð,föÒ æ):õgT†®˜•wÁC€Yð±!˜lkãµiLMè0^¡Ž}4‡ñŠ0Ÿ‘œÛ­èLlLõN„ƒÙêæ=Є¨Ý)ÊšÅDB¸è›%²hfÑzAzj7¾ÓãgZ8‚Ÿk“,SÖШ3ŸÅ¯™]‚+ÂHëÜÔ(…6HÃÉgk½k›÷{¤[myEœýä·ÍlÀOΈ\åG®­î°>ahÓÅl‚aaÛ /Áo³Ú:ÃfMÖ‰nLå‘Ç#x(²¥;kø&5Æ¿µhŽ?gšaöÒ8þŠÃý9Çþðô®mòˆ7^uÄ ¸Ç&øœYc=‹ÃD“ñ!šÓÚÞF¡Xúˆì<õ¡õhBë£I/¦÷kâ“ù Ëa&°R8%gŠ0AÔ;ä ‡‡Ã·ÃŠ„1Ÿ 2ª¢A˜ö]&|‡K0BÉ–`Id &oO>"éÀ ‡ŠÁܰùº¸Ï ¤Žaœ…¢šÌaÖºg‹g)ˆ B|߼ǔ4Ú6\ C´“diÕ{–ªWØ\¤®ºÆè©é³IŸà 桪º‰VÞžùg{>Ù¨¶ƒFæ¤@¥¥ñž™D]M'ËÈi+5Mfi¡®RÀ~¾²S¼¼Îlj€pÃ0øGN‚Všq9Ç~$y†°Vè=ü¼äVßúøËëù°Ó¦¡ãd‹p¿¥BH%…+$¬)ïÛ³Î[¶Ï’¨f!q·øÅ)Œ-[§¤Š=ÖbÏafÙ­GÖžãB¦ÔgÄAlñÏfvXÑ0Ì ùyOFp!ðG-¡À€'–²”8 AÆY‰õšð Û*áTÿ„+ #û©{bስùa§D鎈ا"gùrÎ(X˜Åd‰©Þ«Št•2ÙH΋nû`UdóÃ⢔+2â$9ªw ¸¢§Áþ¤pR„!J‘Úø5„¼kD|×QP›¶ò¼´nÖDå@𳙩°¿´ˆ Ï{å©v€cVpœ3"Cæ>û4gÙ L1»w;ÆÆ° xFàbjc¶ÁÆbŠ:÷}_]ʈ Ωÿü¡ð$©$ñK;L›ãósÒxØsIáÏRwqL‹Ý EWÖäÊô²3¥<ꜜ¬E«e U½Cð~“V5ÆÔ÷0ÒþV¸?iEàÄeܧÞ¬:ï_>ו4VF`+wiÎ.Ÿ‚å~ºRâÞNycˆ`Øs<ÁpÙæpï6pÚ{KÙ€%²²rb ŽÕçÉ<åIPpÎ 0Ø<*¾s ³¥ LtÖ{è½Çö8sªŒ¾1uFAÉÉ$¤âQªœ@£WtR2«„m2½´•U,TÖÁ°÷ÓTºMV%>£hSÇmа‹(¸s›*gV¸nMáN(Y¨,•sü3 BIÈyÀ]ø_ã sÂÑ‘]ëÏŽbß{¹cª/&°¥hØ9r%­‘"Ÿl”€µ$Y¨$Aü¼'³‘531Z ƒŸ—ôp⌛Β„‚(Æ—UšL¨¸)Ñ’¤!JjË´h²$©pHqN3ÉYö' ™5c®^|Iõ#¥c'C•ú;ÑÙ"“£·ŠÄ ¶­^•¸å FNŠL…”­=k’^œIøÂÂELži`ƒ×šBz-Î(ùuÓ ´¡›2›n,”aS"œ¬üm˜9ÍÜ0ñ€Ž¾­ uÌÉï÷çc¸ºDHBwÆ[o-Yï--ʈR¡õuœ¶U£„ôˆˆèDÒÝp·´#³«ÙµÁ´ƒ¬ÅœË„±<Ü'8Æ”³ÃA˜ ,[Ël“ÈŠc`Û‡ÐZk:‚™´^qE7£] `YA×Û 9:ú8b?žÃ‘VÜOOX=!Ôo¡‹yw¸ˆ˜¸9¨MÂU@JeT=è Õã)O’À¯xÜ!•áÙÊ“ÈñûRá%‹àï…³8G7,ÖN˜À, j¤Œ15’ _˜9–¢±â7&¦)u÷§§÷Êj‚—µ„€¶váÃVèÀùÚ–¤á¤R1( Vü–bÙ˜ÐM029¶Mžtm™˜Â MÐÜML!<êì´Ÿ¡K‰G‘mÀ •!¢µ•I/[ ™ë«®ˆB<’Æ«NRÃã Þ'ÑV%È7×ê÷\1$ðkü³FeBJIììÚ¨iSä2¢U"Ùy0ŸÔÖP¨ØJ>I Ç–¼"‚Y嵈uIbx¬xNR£×A€ˆ²2†^uåïÞr¾˜Ébäžf–»þVy'RHjËÒõ™ŠúºÎ”ØŒx„ƒ±9!’#v›…ëábWk¸F{v§ Y&±Ú ¹> !Ř™7NsQü˜§v#U0¤ &[¸_¶%KT76å«¥ •t¯e´µ~@„å·hXR`Ž%U=8‡õ¦¥Ó–¦¤ÈP?O¶Tñt’’‘$“¤ub³8.IN²$Ñ, N˜ñŠeò{NukŠÐz$¹s%E0_©G°hÂn]ðÂõ¡=…m6`i®»xÕŒŠ%|˜c„±Î%]Û¼¤´æŒÜX徊½ÔeU¢盳§ÍRHr»Šàô‘³çNrœo£ÚzÔí&3PeJV[¼¼@9L—×bP²3$ÆTlFª¦Âê xòÿ8ÂF¶ÑI×üN]‚#‰½0^â%@=I&("_pcyå>醎ɔÄ8Õ7šÿ,DÊ« ¯ÝºQ¸®J)Lô­YÍr"l‘–"¥¼Ô­pëInrð—?uò±Õ©3¶£à‰“Ѹé—âé…›`”$%µq)JÌ­ÒI‡FN€u±Eu‘äzŸˆ#_AØYÛ±J¦¬c)ù]Íéá Aâ°Y“œÔJ’ÕIyMýbÁ¸Òä<1O›K9¾‡UUì¥Ù<"¼`¢JÔýùj[Jêg¤–¶™ŠáÄñVá#%Y]Q0Na’“•Æ+×ÿQˆ:¦›’£ç/cÄñyN·Ç{ QEˆ–¡ÙÄÐ £“–PŽAœHøÌ%ŽW,û ö½Ç‹‚‘pevתLów/™‚òíNâ2]­JÅé÷ó’þoû¼dL¹0$Œc<ɾ¤w^ÄÜ>d¹®„Fl’«¦ÓV­¤Hk?‚¯žèM5`ERœ¨"Dæ—Íì¡V¿q¬•sYEмÖ~fÁ7ÙQ„Ý2ÆÇ%wt`¸þÛ Øa'Ob‡šQ 1§.nÖÿ¾d6’Ðñó·o¿8èÎ&Øú`?;IÖù¨—Öûö Æm\-çítµãAÕç4Ë€¶­Úë~ЕŲrdWuׯWꮌLfR•®Þ™Ñ4U;‰S¢_{OŸà3sûMYÉúõâR“®Í6ÉÍË¿<ÁÏÎæÜ•¾ gfƒëÚˆ@û˜å1í™c”½Ïk{e€ª{õ­›·k÷1æ ¶gö½¶FÌt--ºOˆF1ÌeCÁØÀô0û@´BÜÎÅ0…P™E1ª0õ>Ãâµág8Pã@‡Ã§¸á÷\xF|Ú÷­˜Öc0,&¼‹ãˆŸSjÇÃç‡ÿY]3 endstream endobj 2280 0 obj 4755 endobj 2284 0 obj [80 /XYZ 33.1199999 184.340000 0] endobj 2285 0 obj [80 /XYZ 32.1599999 186.259999 0] endobj 2283 0 obj << /Type /Page /Parent 2 0 R /Contents 2286 0 R /Resources 2288 0 R /Annots 2289 0 R /MediaBox [0 0 595 842] >> endobj 2288 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2289 0 obj [ ] endobj 2286 0 obj << /Length 2287 0 R /Filter /FlateDecode >> stream xœí]K¯·ÞëWh òð1( ÄŽ] ‹† tQtQ8Mƒ êfÑ¿ßÍHW"õñqx8z\9@î½ Ÿ‡ç}>¾ùÓ§lÿõûöÍ»OÿÙ~Y~¾û´évéæÛé¿ïO?v§äüë`ûtÓ¿í—¯›oÛo››ãÿ¿m„Ù¿¸üº˜üýËo›7sç›ù“Oïþ2þö¿­Üþyüë×íßþ>þøiioúÂ×ufúåßó/B iÇ?N›þ²ùëwÛ߯!Ø}»Óÿ¿wC'uÝ0¾_ûÿN_}-#9þ¯ã¿ÿÜü<6vÅÎj%Ô {=þÞZ9þ>¨å_NGƒÜ÷¤†­ÌVŒã÷Ì6¯¥Êv”2,íLãUóâ-íœb˜v w{—9Z»Ÿc?Ô.ÖÒPíbi­y6o¨™ÖaÍaCœÄ¯]¿Ÿõø£rù–†j—¯·Žg;Çñˆši¶6D¥|3þ±Ÿa/+çxl©²Á –v¦ñˆªy·T¾êãÉžštÒmí4Îñx‡ç5UÙìŒ`ih?"Q7µNôñ–¨+?îf¿Ÿe OéÖ¡¾Ž°'=|Â{šžOÆ';DÞÁt`áþÀ'˜ ©®œ£t°ŸÈ|Þ•?‰Ðõ@xBAäÌAîY7¸§ä.xç–™2ðN§îfÆi†Ã`fBîwJZ!ûÓaÎ ¥wzåÉ“yqõË=üêLWf'…õV!¿1/¥‡G/Ofvl_1þïËç·Ôa×[7øÍ,þj0èà]< 8V<‹…Ì.îìášàÕÊ_é/ld8–<è/2 ÂÚ7:!Á Â)˜0Q°:EŸ‘Š©0hH±¹?úâ NÈ ˜Gý´½ödEãC#ÞúôîoÔQ[LoÎZ-ÛÊE ”^Xoñ´ó:¬«`íë…PÃJê7 ‰©·½¯x<$`føxPX2ä!‚U[Joë süD~H*Áf©¢õiX¿üÑo$_’F´‹à«þNóêU!ÕçËÖÍèþЈrÛ;Ÿ;ˆdÂú¤E ¶‹¤Ç7P,‚“,v—Ú~9Dˆ]¯ÍD×9|$_/l£½SÔ]ý~¹¼8µ÷#–‹Ü¼¼EpEÜãpÔ Á•qÊà±Á~°[U¹æ:øì®Ñ#ÙòkÀu >ÈO‹ÈE‚êE0O#šÖ ñš`aè5+Í/¿1’$€KeaDÃÂK^ •a¡wÇ_ÇðÈä»–"b9ߪ°Á<)®º ÕW)ã{iÓ2ñ2Žèë„Õ0 ²fȸ×G‡Ì3‘à™Hp  c+rõµqfÝï#>÷×¼¯¬œZ¼sØ–Äg“—B^íE§Þööš‘Ç.R)~Û´›¶À9Å-ˆr,‚p$ùZè•c¾6‚q›¶ ´Êj†Ê÷ÙCJ»ŸkÒ Ö†'‹2l¬ƒäñ+ ÁL8è¯`c+h bæg*X4Ö¸[:.•<º-Ù¿ÿ'‘5žAúÄUd.TÅ k’›ª.È©À§ˆ’@T=†ÝŸÉØ’^hvg]g<€`á„•ïø¢Ó ÈdMÿÉá‘´ö:l3RrI±¤ó(t”'fÏ`O"øžOhOõ¢è %­ÿ–yÉg…i”P>€=m? >§xE c»»Ž uòAe¨Ä>´§œzʩ瓧 ½ºV,âduªtqy8ˆŒ¼Á»”‡O v \õùä^Ÿ<å!MFrœ)²ólÑáÖ0@a‘wØÊ¾3$˜vi v—™ï$88j‰áðF@ɨ¹ïÄ¥Öžvu'1¤´’u¸ƒ9äÌ>¹CÔ"Ã4†åó“;<¹•;àl·TuÒMê·Ÿ, § h}‘±¥ ƒÚçZyt»7©÷ŠäR’×ò«fÂ$ ‚D~kåG² »ÜAþF h!¿5Ì&£oJGŽhºè>’¹X€µÓ¶ð² $*FoA$!ônóŸyr+ ãm­™ ß›÷cªŠM{„¿†·ŠLrKeÁù©÷50dax°VÞ6òv-…·?bŒá‚™6«ÁZ‡ÿX™ÌU8×V§)„á,XAFX]°÷-ºª`-­½ OhDÈPŸ§X¼ˆ15-9µÙ¬ºÄ¼ÁÒˆ£–j)V}±hµ±$_Kóùõ^ã,ß‚-€ õ)ÇjÓ›?oBM­U 6L~)«¢@ÑáÓàiåQÎu)"¼Ò¸éÎ)kÍn:_;k»­Ùÿ„°ó§nkö_ÜsùäËÆô;!œ´£quø–>kEŸö1~ù{ÿÚÖ[}èéo$ã·ÜY+î¼_6o¿k츨÷î6›Ok3íŠngqÆaÔÁ‚î„ç%ÇO2$ÅSÔD×#ÁlÐs«”>\çh/X5/Pj+,ÖÊu¯dÃÀ¡Q$(m?ùÕãíé“_­q½Ól­ÊµTœ_rÏ-É6ýÁŒ{y‚CªóÖ¥d°\Ë]XÌw_e\ÌzÓU ü.î½­|’ZyDx3V@Ó§:á½`w^w0o¬I˜³&Ò:Þ¥~,Éy%éÆBíC±§t͑Ş–[ü=Ôs«r7‘6ÖÐÊY}ÇZÊ×(ŒL 'ýaß7–Ǽõ•-³!^Ñ:6¼Ï9(b¥ÏˆÓLli˜€™ìh•OZy;íϱÉ1¿Áˆ½ÖH¥(©"Äó¡ Ìž%uîhDà$c¥­¾MG6?Õ³Ñ/ŽP¢¤ ìá;%´Sás#YŒ·t uíŠæu³"Ò‡‹Á#^ Æ§RìÇŠ’F™)©ˆ$8‚#ÇSŠTcŠ_kGJ’°ÆBð{¤oµbamò`WGºÇ¬ìtÞfxüý¦À{ø£“ Ö˜^×é }D¶÷„GòDIQkáâµÁ1Ú”‡­áW’ã\L¡ÈŸ’{>ï(©ó™“åë Â=*¶-ï½ð6’ãxËIxOï2-ᙈóLÄÙÏôU&âÔ`7H©‡Sì†ñob7ÈQ®žã*ì?ñ°æoé³Vôi vÃø· ±ÆO{¿ñ»aþ–;kÅ÷Ñ»aœ§soïv2Ê_› ÎJ8ÂÁvb³‰UŠtûÚ^ÛËÄñ¦¯G˜’B¥±ž‰ÒÌ£/] ùÕ c,ÖŠlš!¡¨ª€,ðŠ>:ÓKë• ¼æŸt+-Pº ð:! ÍKö÷F?aA®ªJÆIs‚ ü ¦ˆH¨IËf ¶Ã¯V¥)ók†P”ÔIÍ5rÅ!Âë€í°û3ßpi¦ðâ3…ÝàTx -åJ´H¸Šp5}äºC8Á:ð¼§¼W$b§:\ƒS¶âð)á ÈàÀ9‚÷`ŠÐ(\ O ^·ÈeƒpÔ‘3Gá|¬¨E·&§ ÈP¨*Ò!0‡/;¬¦ˆ´:”Ö(t€wŸzBEr„#¨ûU!H5¨³¤ô…¤Œœ>ñCûoé³Vôi‡¤ä…¤ ¿„ ÷ßrg­¸ó>Ú‡ ÕpÌÜ9lëu¨O‡C>nc”á“£é"I£)‚ñV·êv„?{ãû€ñqõP~Ì–áP„Ò7»íj±àf£Dñ NXOÀ·9¼ý¾¬HÆAùÍ%—µ½bã®Pà 9 kÝ´ÈzONIð²m¶8éºÙ|@ó{×Á8a%*$š‚Yz°FºÖåíA¤/‚Â(…zD‚³ ƒ9Æz—ƧhzTn€Sl|kf~\ Í…OöŠRÁc‰Æ¦/ˆ¹=†»zŰ˜œë 4ÑÔÁ[²”>'ÁƒÞxY“Ї;Æ‘Pž~#™ü鑨¹ú4½z”Rêšš\Ž"ä{=Þ]‚€S`UdßT¹ó0iç—·_™qÞ1,¹”ÅîzZtSºÏ?Ï·Ip$ÂgATKɶ!k­O8ÀS’p" üâÐÄ)<„ðO$0ß•·†Ç†“G®|¥Òbñéé鼊8±‹R´’š]YB¦Â“ÈØpú ¥ÞëÕ¬Ûò¤¥Å!|J¾ ·Ö„„ÛЈ®°K2Š=@R)ç¼å`|àÀ>+‡‹È½T)_Yâ[j¦- »Þ—·YK¡^Úaåò¯vŒ–™|9Â*bF`£8UÃª× º¶4åàŸeJÐo¥ò"гz î©q³Õ\ñ^¿ÜØ^èQðÌÇã‹÷ö"%hyÒïÚÁûJΩWeÚGdµ:â}·¹ åêq”æ‚oµþR²”{V€Pàsªt ²,šàNG墠´®Iðg ³“0ñk —W½·CçôªXáŸ\áy€Dùž°%ø lM¨Ö LKÒ¼€5±‹7KìÆˆ¬ïÔe"kÝíàwûö²•òÜkíO¶z›ïë,É[;SêÚªÆ]ïߓ/¡&m#ô~ÐZK‚jEÙ-\N_å!Çü–¾Á¦—æBjå»1Ã,!J©‰Ý^£òœÀ4—äÙáTšÕ\ ½j¡ßQ`sY„TdI j9’¼¯¬/gAnQv‰C6¬¥ÚºnÃÕáºižSœ½Ù4û[ú¬Oš¥ûP8 ŸÀmjŸîÉ—Òi°ôœEÒô:–$ Ž‹3V  "h¬ Lƒ£è½jOX*:)îó‚*¼›ÈîÁЬ¯É2— ¶]Ü*,…&7zS ÷‚pbú깡 ]§¬ Q"¦çêFgW°?8Ç7 /¬ &@J?'iúUqc£gq}'. ÄMqŠsô¶é!nÿ-}ÖŠ>í〧»€§õú˜>ñâößrg­¸ó>Ú#ÄM™©‹òÜ!ŽRhL0ðJŠÒ(%„mbö Vx¯F…5†Ïy,Ûm%¿FÆ5(¥Ê”“IÈ8f-ÒndËÔ”û(zí…öd‰£à£×ŠçŽO[…¢ÝN7 \HÚ›S^ú£e·H#!ýÉ›—QýàEÚà%ç¿´|eìˆÅ 5»E¯6ä¤Yq(è‰> †²À;OrHïkÆ^¤Íû C±ì³3½d´²ÐÂd2yïD†¯Ð",é*§cêZŸl½(Ç‚eõš1Xöäß rýìXŽ|Ô«CÔ„Ô@@ÔøU8²rH¬ït“ü'Þ –nK1ˆU’êÞg!¬÷zSê÷"7†6÷Åh!½õh¯ŸME.ç}–ä`S¼{¬)hÙÙ7®x/X¢YºÒb¥Ž×„’KqŽà~j’Q9 ¼àLœI°8òòW#ú*!HžvQ”½?› “‘^ÓûC•/Ò®¯©±Ä{šèµº8kc·†ü×Þ\5/ 0w”GO‚L¤0¤´+¸=—–8 [mƒ²mÛìêÌ/­/¥÷À’JBÍ%‹\ê_t‰P2 Ú$1®rƒì0ÛÙÆ¸Ã‚àËëðe°ó ‚5à )×(R.ð‹ø ¸?I(‹uöÑÚä>®‚[¸Œg莾Œ I¸Þ6²CpÞ‘+=1–â4œéÍÐbÒ Ä]fº%I“¦l6ÃŒñ]A‹°Ö aá¢Öµ(îÊȪ‡}´Ç¤T|É5œ‚«H¹6²òúeEÆÿ¶ßÆ© ³ŸÊòãË׬ì¶.Ìnû]Æè«é¸±ÙŠq±"…Ùí5Эêô9«1fg.[æNïjÞ69ì†Ë JÃ…'³æ®ÔNº‹WôýÎÌšÏ /õcá;¾3³ÎAîd§ÎóbßÂÖæ£túÉð»K@ð ? wãöÒ汨Ëeï,;V2÷Ó uÕí-ý^•¼sp·¶uiŒ®œ?ß:XœV)²æ…„ŸDhRÆHËÚ]}…ã¾XkÄ<+X~€ŸqgFμý¸ù?©%TÉ endstream endobj 2287 0 obj 5081 endobj 2291 0 obj [81 /XYZ 32.1599999 233.299999 0] endobj 2292 0 obj [81 /XYZ 33.1199999 231.379999 0] endobj 2293 0 obj << /Type /Annot /Subtype /Link /Rect [132 293.779999 183.840000 301.459999 ] /Border [0 0 0] /Dest /sq#b7#8b#aaX#cei#7fM#b1#1a#a1F#0d#2b#c2#fe#e9m >> endobj 2294 0 obj << /Type /Annot /Subtype /Link /Rect [377.759999 277.459999 504.480000 285.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 2290 0 obj << /Type /Page /Parent 2 0 R /Contents 2295 0 R /Resources 2297 0 R /Annots 2298 0 R /MediaBox [0 0 595 842] >> endobj 2297 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2298 0 obj [ 2293 0 R 2294 0 R ] endobj 2295 0 obj << /Length 2296 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès€‘ÅE x CÃrr<™ƒñ Îò÷#µØýú‘ýq).’üd~ÏÍUd­¬*V½úÓ§œÿõûùÕÛOÿ9Ñ?ß~:µMÛ·ËŸóü÷‡û¸j_~T×ðqþsþòõôíüíôñôqú÷Û‰õ—õiðúŠeÂß¿üvzµ¼ü´|òéí_¦ßþwæç?Oÿûåü·¿O?~ÒóÍ_øzRc?ÿòëò ㌫é?÷¿Íƒÿ>ýõçß&ÔeÞùßFÅE¯’Àøv{”]þÞ? Þ5CƇ±?3Ƨ߻i3þûÏÓÏÓd7(šQ26ôrhC'ø½úÀ¤P³9õùç Ž‹M¶üø<-µ›þùbÓÿ~:ÿضLþñüù—ÓØt£ºÅˆóŽ h¤}ƒF8=œí„>ƒ¡æpD¼'Ìö:ëlð1^FޞȨ8Uð1…*ÞÅc‹÷<žÆÚ·pÁTQsç¥JØù®;pR'ý€“ËHÂ~–žXâ2EÀ=#ì†à•B‰ÛaΠ`ŽÀ3΀ûæØL!sE(±Ÿ©>ÏÁFÀ–Æ£ÃâÀ8¡ðó›z;?¶]о'ŒPäK m#¬[`œàÙàæG‡D ¼P´èF¨ËÊÔGÒã cŠÅÏ@ÎÀ<³e>£HR¬y[Håò³€H<´¤%ÜÑš6é(Åf8ƒÄ3pç1aÎÀš×A}Øa«DËÏ„V1æ Š5Õfõwlù=޽†”ˆ±@òa¨±­Iñ¢aoäFõGfÿÚ>÷à —/s~±ç›Ñ”Šm.‚û‚ï!ø:HÿëÛƒ?³ ÛN±Ê4&ÞU[˜ß»HÙøü­EébÀÈvf¸ü7GïÐw=ïî {!yõÄË)F6rÛÒ}Ùz(¤ÉbCÓZÌ×ïcæšÙ=k¾†Á¯Z³Ú¯ _ ~þjYÒb3йoSAêžf쇱ÅÀ`üJÅ!Ô%áÛ<â§.‹#àìÖdö³ÖëZó‘ÅlêÁ{Æß¬©=Î@t0æ¢pþâ=„ÞÚ›ð…²1üY/>íÇ P“Ž´Î²P_R5Hn “pyëÀ)&o¼ëé%C^ƒ•D…P8?c ¸}ìà-Çkñ“‰Wø8¸5\èÙ"5‚ -ˆÞH7¿34FÎ4 Ö×p³¼;¯OɪQckm‚éǯ»,@´‡Ûµ*HórÒ†,ÚîÚ²Â×ÞÆšNöó.E¨s‡&ï-¨1”‚5†p8b³3Þ9 í¹EœQ,²Í®åÕ‘¬ÚksGˆL[8Ií}qƒHŸ•Gî]3EY®¥š’X%«a–‘R Ÿ³{iBåˆcÑ337×VáœÞ?ÞÏ ·T莑pεxõ’W“פ5G Ä7RÒ¾K‡4ÎYKp8ÎKP…’›¡ œ†ŠCÊy))Ÿ‰âßyÞŠ=ìdX¥d¼ Òt„S,âZÁ0vˆä¬ï±U(A<ŽY¶‰^Ã2pfhïÇ2×M6,ÔpŽ‹9u„ˤõeÿš Æˆ}¬‹1¹gòª¶a¡Îê\¦õšÊN#¤fñîA‘rH ¦ † ø;Š´¬Þ-E`–Ì+¯ï·c: ቊò™S¢•^¤ÆÜ‹±zÏ9¶¤l¥a Õ¹œ˜’ñs»5å¶B”ËRþ¸Ä‘ÊZEøñ(ÉÛ޵1¹eGÖ*ñ79u ’G¼½ó±dÌ“1Өؓ…Z7´bæqÆSh?.Û6âÙwÚ\m'[Oþ*>ĬܟX6uW™Ot*yhi»Á<µ„štåä²U/‹s ß0nc[wРè‰]û±' S¶úKDh9O¬ååæo§G³ØŽ„ª kH6¨,„0Ù¸Œ#<<¥(Ë%‹¼×!¶Ww/¥ºéL‘rîëÌ’¸>vüU·’ ÓDdã‡ù,‡ù<÷Ê(¹ÜD åÈÇ Q’”A-•š—r”d¦e]Ä;‘ XºZVsbɺ)—$û¡¤B_Sá ÎCLpx3Yþ{:?¼<[eß¹?ò}.¦ô—DÊ€'SýuÜ“ƒR¤ÊQ& ö4st|#dn¢« cJkGÁŒ\PbËÑãû)ëÁà28„B1[î¦ëèø–·ç?ïÞ):–Ò±¼rGí:;"Rú…×ìpÓu)—×ç ŠŒttC‡r¨fAÆnèžSÂÚðŒ×‘û´z$ß”ÒpŽb§ØR¢èQŠ,}Q–_ÏĦ8¨·eÛ¿hÞªJ¥]J—¿ã|rœO¶aƒmý|ÒeN!ß[·ÞZ6¶_#»äM ÏÌÏxw0æàˆc6ܵ¹Í)…`ÌaüPfÃt€u(\ÏÁs;ç¹:ÚH¥x¥_Ž6Zß瓷Ⱦƒ. Ë#‡6Ú«6zq2Üš{å{«'ùGµ·…Io5îû×+'“ F¹‚–53z­»m͹‹–gN«ŒQæVM|Ý–¢wfCvËeû™¸âŽB¢…î½øSÃ¥»£#ø;ã«:S/DvÞb5”Äe¼iþë6D8_Ù¼Væ€h{ËJ)„Œ%øæÖsË’¡K€(¢tÅ.[iÁ%o‰t!tm,Gèø,õD)]Wj¥y—åÁ Õ¼*œ­n©Š©F¶£ÛVhVtO{ìí-Ÿ- 'Z΃jµ‹P5jl{w °ã[æ{R ¾™Æwû„ïm¬Í ø×“àýý¿ž>9ÄXù7ƒ`RDÁD )U*QÈÆoÙbÒŠ0ž²Ü³Š¸ËŸ¥&°U#G“ŒÌuysÒC¯ˆÝÖ'Þâ ®<å7èwKVu”ÜK‡wm ‡‹#U0Ћts.*Ò­î@ß~’wÉ2`¢7ö# HÖy­’”ÚÈеåÑä©q½º*Œ–u‘Dd°OÓdá{H1²V,¼)3„Nž eëb•iY:F^•6按÷Ÿ/¬í#~{’¬¥Pýn*Ž}:®tµ’õ»{e­ÂŸQŸ¬â"¸e|ŽˆûíÊ^ õÈ¿.Ž»j—R©1Å!̓=½3÷]˜OhOï8ÊûÖðôÎ xŽ_»ôôÆ{$+x+ž:+FL‘Y´QDÛ¯6æ8ü ¡WR òãh¤Žíµü†>b=2¤ßm-±î ÁÓî7óÉBöÚ”K¦ÿÑÿà#¶„Rй†h,ýˆ–¢E)ó¼µ™‚å1ÎÆ•.b%¹ø6wI[Oå=6#—~´ìÛy¹v8°zVc8¬)=w$G…´Šb8W l¸_Rÿ¤Õ);1#z÷<®y²_®_ûP!Ÿ˜8 J‡1ÙÐ}~#¬ŠŒY$>pû.9Eãp¤i/ ã&TýT¯Í¯èbÖ÷æC ¡³§O´·{ŽÂÊË™Ëd166£ºÐÞÓ‹–½›còùIRspßhß´%Kî€Ó”=\§o`bÙªé¸Í7Ù²[9èo§dD´´"]]ÈbÍXWï"âk‹º—`zÎjÜ‘Ãj¡:|IÙü ÷b­ub[>O„8ËíÞµH:K‡Æ„ú1™Mœ"e’ʨ¬Ð‹xqûßÉý˜¥Qä1ä G†ïYB?”‹„ ÕRïð?pJ*‚åʪvG‘zMæ&ÓêZ vý’ø¸¤«8B)ÚëÈ@ 4‰q@ Ëe B» Jé}G‘h\ûïqÙTÃX½ÑžmÅ›e«ÔfxSà.ÖŠ©7˜ÀÑ0BYZLµøŒBÿ.æpß#Y9gbÕàÏɼ÷y ]Êzm‡x–K„Yï+Q‚_›|Ãw$E#ŠÜ>-s 0é–­ßk~CWGŽKjÏyú§0µu‡ÉN" 0hÄ94áÚ %)§ð)©‚?@†ZqÀI¹»K¡"JáíLUxN#Ü9_IQâø,•;42:*PŒ¯¤/Ç"“·7¯Ù…GŠ˜C×Òá=☪#˜—s”^¡èì(¥©6g¿É嫼Y^÷Õîz"l™qÃÏ”•©ø½rôÀZáôÚøæëÞRû{‘ÚÉ%-[Î[Áþ0~ž˜®ÿ8»bZ¦Â5»6ÉýéhX¯tYÆVFZ•ÚuhdOʶô**§€\1•ˆ5‡ìÌG }1tÎÄuýGœîˆÓý¸ó8]ñ†‘ÇHMpämY¯¦äâÌ=¤ê ’ªç,AÌÉCÞ#‡T ‘ªÝµˆÜ!U_”TÅÙ°„Qlùb:Jö¬¶ƒÓ Ò¢s°.X_íSªò– ŹÂXpü,‘ð!gœT¯x¥;ÕO…nŠ4˜¯uß+¼I!)Ý‘r!²LüÇ( ¶(þÿp£?ØBp¸f­~CºOåÍÌãÇöîU ŽmD çkØqÞé,×m™áÇED‘pʲ‰Åà¤\ _Þ© J~x@Ä/Ÿ³ÜÝ÷ƒX§ŒRÙg7ö&:ñQãu¼©ä5nâž)Þt®ï…±«ð"€ 'âî,ûóp eeiØZ¦^nË/¢þaø‚ï±Óßó·‰.¥gÚ³þñåkTÛŠ»ŽÌè|Ô_¦§?³ië3³~ÉB8‹öVàoÑÆ}ßôÓ0GÙX¸Y6œÍðØ8Œ,˜¢áãÃDÙ®kú &?z‚ÏŒð™ET¼á­xÖ|@Ÿ]ͶÐÚý'ïàwu σ~@ÏhkéÑCëÐR*µkØ. @u—Ótdžçr¶µõ÷Æ×>:è¬Ù´G±k›vxÞ„ã ãV{ú<£OPöœ‚A ½Í‚'¥z¶¼Õ@ÜbÝTCKÈŒÒñüñô\…ž endstream endobj 2296 0 obj 4455 endobj 2299 0 obj << /Type /Page /Parent 2 0 R /Contents 2300 0 R /Resources 2302 0 R /Annots 2303 0 R /MediaBox [0 0 595 842] >> endobj 2302 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2303 0 obj [ ] endobj 2300 0 obj << /Length 2301 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹II@À3¶ä``99Þl‚Ev‘Éò÷£n©gzH}¤X,RRÖÀú¡EëͪþøõïÇþvüðøõ?Çïãï_Õ©2Õðßñüë‡Ûí©–Ã›VŸdwþïøý—Ãóñùðtxêÿÿ|æòâø[ÿðú‰aÀß¾ÿzø0|ü0üË×Ç?÷úßQÿÔÿíçã_ÿÖÿöã8Þù~9´9ÿáßIJíÿrû§óÃþò»ã¯ýÚ˸çÿÿÐuJu&iÏ/¯ŠË¯ÛWÁ·Î3SµG!dÿgÝã¿ÿ8üÔö2‹S§„hŒjª¹ƒ6ò:jטcãé,lÖ@"uœ¶áçL®”e‰J5Þ¨$×­¸¬P×2qבi¥ÓÞç#’Öu%:‰Hu-ºö²FÙêTj#¥R]µ,T¿ÌG$­k¤ºg$*ÕMe.kìR‰~(•XMol8Æ9ÏG¤,ëJs8•äM3¬°KÔè/¥’ª5šgë.”HXÖ•äö@O6^¾Úøgϋ߾ˆÞÊ=šo?õó¸¸EÃoßú¥êþ/½ÑQúøíÇãï{ßHþáøíçCwÒ]ÝèÁžÈèIU£'ÂÀ' áøDÁ¹uð¾i€¿#ð;”ï@Tp<ï<¢'õ@Ïßz¦ÌÎcF]¿Š)wس˜“ðnáïžÔÿñJñnI¸RÌ/žY㽇OxeFŠøý‘pO%|§þÿmîÏ6u 3À¹Õx·Ù´]Tª.ªN‰ö- õ©–mï ÜjXZkSN½þðuRÃ:²Ü¼«ÑVG˜“íäNÝ|oPcÍ© 7ñÄ3<|GÕö‡ X¡s*ãíÞìÂ_\ø3ŠžìÝ Kög‘È×£âií­š(jXèG?gJ|áT%xÒΨjxåb`!¯S!}/Ç&…èèë#©½ºL©ú.tYG3£ŽÑª³è>Ž-{ý‡úJÿÆhóÆH½Ñý⤕9³àë~F‡G(m!‰‘ø=wÒþ¨±¿5¯€£§7:Ĩr3q#låÃ]Єbó„ŸÄh\l1ñ“ù -J„àñ/Xìo™@LÓÖˆv¾·ƒ'ŽÙ æP »L¥>]_'3¡öÔvÕ[uï™&…r˜a1Ú”¶ÇÊ¢ b˜Ý.L¾Ad…¾Réõ ޱÐìëOÐJ~´‰d›xñ9ôÒ– òÎñ¥=2}i× cávDÕÉ4â-9¯–®–“ƒŸDxõEÎAü¦ä5ǹ!X9Òì ® I¯8 tä³K”bÂðÅ\‹ùjŠE¥R‡L4kÉ3F81Çù¼uŽóÏ×ʪòG„ºjîKQç·q]gS.³!¤SYÊ”IUÐeÔŒRñî¦[êL”/ÓÚï³Å-{U‰6ªZ*‹îËì]K[[@ ¼/ž'p4O÷:nü…½ð˜›$î@ÂM¼_2g”nÊñ œÄØvÃ0ÝG/j蚦”ÉRrÄáB1û'’ŽÃi‡Ý°§öˆÃž–mÜ+îD#щõ ´l7ÊÖ_»¯QÂn´º¶U6#,DÖŠfÛ9q³;:еI(Óáëá~Džb~'+¥`~FÊ/âݼf‰Tç°‚D‰4K™µ„ƒÏ"šY8JI½#Ú(Bl)™¨paž“öÃ\±,ìÒp5Fô,ÉVZ"ÈqÖ²Å~ÈžbRÿÚ]%²÷h4ûiV’Õd©9Ž\ œ5г–SÄAÊYS-Ûç{ï©…¦µ)¤¯&Q‘3ÚÑ#oh˜R4š’×\¾D³ô>‹ „´æÚ2‚C…°¯Èë-Çt'cîâ¥I)zL8ì Á5®~L—œ_>EŠ»":,Ët³o;ü(ÞÊDðtSÅ–I ßSa„zKÄ8ìOð ÄüÄ'îžzÂÜð©ŽÇ]£Ì ;™Ø•„¨ý ß@¹Q`Í+Å£áY³ÞbS³¹73䬮ÒA8‡ôÜ.Ã*MRï ZiÜ;Þ'Xê(·uxj—{‚ß)yŸ‘y*´'Åî²¢è!^[ gPt‡»<û¸ü{(k ³¾G®hª—ö)h·xë.1}=ÞLAëÔȶ°œ”ò”0Nÿ6%ßµŸð\%W–“HO y3O‹Õª{t1¾‹“ÕsT˜¢¬ü¯pÔPÒ‚³^Þ¤È+߯R’+Z½ž½7ž#/'1[ë‚Ü×Vª0'ØBeV'ë«Óz½¾ëÚ½ÀV•Îvñz Eè­£hBЧ…}£å=ᢚДÎëÕÐj]w[Z‚–¿ÞÃ¥8ò‡O<òˆý8k¬¿)–ç.B|^Ï×VoAº®0/3g{ányè‹ùr“‘œ§þÝD'k—³N”Îü.ïÝñz6Ø[³Ôj÷roÌ18¯¥+èõß^ÿ¯"nïtéLiÑÕ5¥3~ÅN­q®g-Ç£q±Do6/Òu¥st$Ã~!ÇOÒ=ß!x›k¶¶m®DéLiA««z utXßQ$hù<ÚÊ5®®té\à;Ò¸+ްVQ' «æŽ}{]½À—ÈûÛít?Ý+ûÃÛLg QÚbp'†w÷ðÞ3ÉqÕçތ僂¤SsµV²Â ²Ü ÑJð¢4øÃ'øê$Ï¥J‹ëSÚY9D1E§ŽfÌdž,ˆ ‚ªÚáÆ<‘LLðÞF’†Â"Æ!§<ƵÐ=…N¿ê0ª< ?HÜ¥¬Õº6=a0^<«¥`-sßšE¸º±Ì-{3îV$¸ °ká ”2Û«º±©«¤¥þï½ÑŸá2ѼÁk×kKÆ _ÖKMìofò¯„ì.9êÇäÀAq~´þŽ͵²a¬™2ƒ)+иzáÂö"Á¯xê¾°¢"$/Ï5·Ø[ ½R`âEœÆßy/9¦o4Í«X%ä¿2e{’ôùzs:ës4x¯¦ïÖv¬sGbðÂDê¨hŠÅ[6&ÈkÍ›Çg‰[ºâ- dE± ÆV%EenÞphyàÏ Æ¤  –õ ”(†!”xŠDð><êõÀÖ*`)Ö˜I)#*5·²?á#ÿUÚŠs`#0~âù Y\N=4 `~Sšö<ï@xÊ(清•µ)˜TâMhX¦È6¥­Íó¦[pýцê~ÙDW`%ÖQ*M n‡0iÕ–n,UÞü®`OumßGy7û¸·€Œ;,K7ÝmLñq…º6+î°§#ELév¼å¡£¶)©8ãRT‚Ú„lm{¢ªÒ ;è‘oÖ+Ð<…€’Šr¹¼×« î h (W¨<{¿®Ø¨Ër’^Q+§~A0ˆ¸d½Ä¶:šÎžúúOj3E-”7dº‡¥Õ6ϵö õF¼Cy(Ÿ§Tè^+R×R•ÓÂH[O§” &Õ£GLF¼Ë[±Ë¡äbj89J“Iõè”RÉ Šö°T™*È—ÖŒ$ȃˆ¶ÒˆþaŠ. ÞSì´?zö>bYöäÇNµ)baŽrärç÷¦É¸ Ái›Æ28žÆ'Gñ;äÀTûkal…ùÛÏì‘; C`ý¯ãcw}Cì4!T_³‹•°BR¾º•P|ü‚w·®(”X·Î|¾Ï€'ítuÄt“0v¢{º9<šPX?C]¬%(æ`) ëƒ={j+KT!RKak^< ²¡ V¨ŽÌÈkIÀ=ÄyCíŠ+‡&$óÑÁžÕ‘ËÓO‰ÐXCÒ˜^÷˜0ûC±°«5›­H£kËŠÜ;¨M1Ðýr±¬I0‚NؤE(g‚ĸŒˆì#¤­LŸö¦»¢· FS,éÁ—Ë1ê)ɘ2†Òu|˜6lÜá'çE&^ö _Õ¶&öœäóV‰ã*J_Zhn™ƶfï÷ôŸ¿Ö1ø¯y@˜³Öl ÉlGrŠòz,n„?´$èg[k[ý݉w¶¾h7œšõRÚç•FX7&õ|¸žÑ…Ëì[®U{mDÛ]«XÝ"¤±h˜)Á¼bì¹U»¬j›üø¨2å2¬;°†pü:8åj Ï¥¸þ‹Aîí×Ý,ðŠȸÄ»;;¤ËxÍrô—¢„=Çx€-3Ú£•e_<´ura¤UÌ!A?zlÙŸ¢åèåp˜cx›9ôd)ÛåPe,f…’†/ {iêp&ØïîÁÍxØ'€yQà~xAÙx!¥xaû0`œ'Ž#ÌÍÔD³#Íš·­ÐdŠ (³öp<æDL7V˜<Ïw(p”„Öp^Í ä4¢Vеò¨ÉËØ}¬»Ó<Ó‚­î;Ôò@4KB˜¦Ù¥iŽ¿-/¸žõ.›>Ù\óΕô@bóz×cOCZ4?£O™GØ¥7äÕÑB;»·+é«‚Êy¤E÷Mõ{”îX_IÏOΫñ¾ï†ØËƒ<Ê1墷å[Ù µç—í®\Nû¹gaÁ6±ˆ£ÚÕGß,­ÚÁ­ ß gM ”¶]˜êîÞ;í&¥œT,Ñ I(qy'ázÇ'õóY%FãD\ôQWÁ[sI¸lyùÂàOP LÖ¼¬’âöPj€psV-”šóHh %m/­¹fˆÂ¢Ž­Íàó (Œàö¨gQ/k,ydÉ 81µ}gjJuVžkíw\Î5Ç)IÀ®”Æ B­ó -;ŸÇXÐ@²6+ÍZ–-Ì1à,ø ù«#í|í~óŒô‰_™è€JQâ¨c,Y­ØV3 ßßÍÑË^mÂ>·wUmrΗ½QxSk=¹Ì´ÿu|î§ÔîüãoßñÌÑ]\õº¸'ïò¼¯éÒš£è—1u®Ô sºÄǺºÞZ7–'s2Ó ÜN€O%›S3ÝsÖL<ÌS]Ÿd7‰t¦õÉ Ê×Þ‚©ï´ð¾3Äè<ɪ>?z}òGæö_>ÁŸ{)&Vø½3f¯§ž´ŽÑƽ3îXÌÚǹ] ëwK4oÕIÔnŠsjŽC| ÑFƒ£«S5<š±OxoG¨à‰wF/w‚æ”ôðÐ#Ë>µ­ÃW­ Ã$¾éT~âԎǧÃÿû(Ô endstream endobj 2301 0 obj 4335 endobj 2304 0 obj << /Type /Page /Parent 2 0 R /Contents 2305 0 R /Resources 2307 0 R /Annots 2308 0 R /MediaBox [0 0 595 842] >> endobj 2307 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2308 0 obj [ ] endobj 2305 0 obj << /Length 2306 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÕˆEJ@`Ç3 ‡ÆÈ!È!˜Í&Xdqö¿uKݶÉþ(²X¤Ô²ÆÀ¸mZUÅz|Uüðǯ?þó·ã‡‡¯ÿ9~›¾?|=ÔU­ëñßñôõÃë_È®jäøÑtm%ûÓ¿ã·ï‡çãóáñð8üÿ|úüàômh¼¼bìð·o¿>Œ/?Œ¿ùúðçáÓÿŽòø§á§_ŽýÛðí§©¿Ó|?t½>}ø÷øAH!»á‡×ŸNÿ:üåwÇ_‡!tç~Oÿÿ êZk©’Æñ|}Tœ¿^?Š^v[Û ƒBŸÛa9þûÃÏCo×aT½Âheêà^? ²!Ó{ÀæªÙ|0x§ ŒdÔU]_kÙº›(ÚªÇùÒ2 €¶jd'Þ>32¦U«t7<ôÒ2²…²e…¹ôþj}$j©GYÑá^ñ³“œQ•šÔ•õ>=û>eÿEÄàñŸ~F ìY營±§3‰ö[ûG’è­;¿ ,g»œéh؉³³ø}ὊÚîÕÙsHõžýka‹3‹Y¡‰e„—‡<; ¹Œ™rÉÀÝü,^i{a]ÆEÓŸæó­±åT,kp –()DñâzèK!¨={ʪ«RtÏ{(çÖÊ¡¼¥xÌ=Ô G}öGÙ)Û •ctkú:«FÊe¢h}Ìöâ½I)ÃJ휑‰’K²0"\y9DôësûÎúx'üHˆ_ÛT3ž8]ßY' ÷!Î9Uߘ³"€=f¯¯ÒÙ‚BŸÞD‚ ÈA©´lEÂûà ÁÃàa ™ªQ*$.ñnã¸ÛžxÍ ÿ5óö,X½ˆÄ—/àaœk)3Ҩ䭒)©7î‹Hñ‚ýXù–”0²bɱ bÔŠî-õ ƒÝ¥TÐ.¹å³v‡G½KHÚ9EI¶+´§÷)½ïOBΚæ¢`sòJvÝÛCߦdω€m[k 8žBñ³B~&éH‹4®%ÂíÆœGÂC"1èž”ZDE%ÅJ€• rã¨/¾µ@)'G l4ô½CZ}|:_ú“oD¤,b»X4ó ˜ù•À^âÛ¤ yqL"F8º>’'5ÍsR ßÍ¡šrÂ:i«Xš$Z(È Ü.esÀ X´m;»pï>¡êK:ÕF æCBŪŒœV罹|É«’fç¦â4¶|Õ–wÇMÛq·ãýÁk[ Uá]7OEË»”;”ú‹ž±Q*gâPÜS uô̇R³¯Þ9Ö;pø€V3ʽêÄE86¶³Âb|@yËÚ °”ÜÈ<‹Rε­úÐ#,sgЮʄËJ(~êˆ|J†T„$ÈãRƾÉ|Ùâ8¿V[§‡ÇAžÿÆ!‰°ˆTÜ=…ù1YQ„h^WwŒHÞz¬$où¤õ…Fî<|1QœË›<"ŠÆ8!5Žìx<-g¯{þ#§¯ûÈ J:$éÉ´¦T!@¯æY\Ž¿u¥x+¢)„Îr@ÃîQµÍ µHe×W&c·¿Üû䆩Ã-K—a8xËË=u ˜«ßê.Åèœø¹€ {_Çr Þc¥Åœµ¡TkI¡ù–æ&ÈÊr÷@‹€žDò,×rÎ LÂåq|,{’ÅX ¨ºB1mò²r„ñ‘©oö0‚ƳK{ÓJKÚÇZÎÔ²¶XMÖö¥Ê¾U>BÌ­—…=½:„ò“àX è”P‡ËíŸfGÇpÂJl„ã2å5¬ 3 hw÷[ÔçâÁf5²±y¼T%" íÀÏdyMoË<ÏGbAÑËÞ)©­åX£˜‚Ì0 8s cV€r*¢K”²…«–b(¼?+9¨O*&yí(Vbß\LB2ZüB™[&b|r›‚¹äÌ“2öqžÉŠÍc8¬æŸÒåÕŠë°‡[9»¶÷E…×f ¹o8¤ôbu|×£Ô²‹!!´;Ì"ô ß,™â*,™P¨ëýzêW½½›„½¶ÚZ’µTó#]‹Ÿ+.¦P%lŸ¡¼Ë4œ DHù)JcêêK]y æf%”G¦`Š£¤íá÷ZJUô,%‹ï“ëHõçqz >_qK©ËÚÐo—p¿¬=À$*sYûËÞìÌ_œùs^G>]øŠ÷òä~rÔÅ!ÈSYËÈ)Í ‰½²L©f²,‹Q™QÆ´ª·Ö= ykœã-„Š“¨2Ÿ'ý::P•¹Du#ìe&Ü:µâÙ§ËOŠ¥xDJDîÆò…x eÀÝ_*Sf_€é-)}VuNÛinYÓí“r*‘”{q–uòKÂ]ÐI"?â¤Î“Ù<ŸD–xŸÖÆRv,ᆠ¢À/æ@Ĩ(+¬v­  ·WdVΔpŸc.o¾¶j¡-•ÉmºË…“÷B´—”ŽùË«ÞkN ÷‘³›*§PLÈ,]3É« Ë®±Xw£ÐñœnŸéÜ—5\Â÷dŒ-ƒÃiÅò¤ÄÆJ]rˆ=óõ3n稗'¯m…N žó‰ Ïø%DYôr\Ì*GlçGhùdµ¸J]=LIA$Œ™ƒ¼…Û]z9ÃôÊ>’Rꦺú¥¨>£–ÊEåæ¾1¡FMD…W¦ÎŸÅ¢ˆË_æÌ†ü¦tW_n³+ä® ¤]ØK#a"Ù"iN¶D÷j²:s©&¸Q+/*Uëý$¿»;ËpSßÝ ß÷âršx€m~Ä{‡Aw85÷FVt‡çSŠOÎÃ-8äÌnÈÀ%°å98™Kx–ˆ½ÉàC'&|E }æ­L2¸Ã–N„¼ ±yø)<|ÅÃOY_àfÎH—ܸ”eÍEàÏðÚè+ÃZå6Ñ[‹Vv=–Ýña󛃬˜¶™¡y“GbTM–Ä–ÿYEóMà`ÄvåÍ"Ñ%ljž”öœØQ®žº©»KýZO¥2ÁaSV¸„–C30X… Ýq–jxlxEqÅ,ÂíygðÖMâÀm¿§žÀz {Ã5kðžâý)´¢ œç=x¦¸N:Ä€iÔr‡cÃ| ¸`ÍàÒõÖTnÏþ@ΫC‘¸Þ‡)œ…¥2á>ƒÙ™Ñ D-v`× î^'h0ÀÅ7—à³ÍÃéXâR'%óø” Œš$T d¾×…pêaª¢œ¡ž“Ÿ<¾ë+ÜúЧ7Ì%‹Ëë÷“.QBËš‰Ìˆ+–“¹Û‹„Ü{^øjP<µû"R\±'8„³x|xçª\\U&pSíu xOâ”ò&I ²á5Úx ®UsqË•$‹s+ Â0áêòýÊîJ`.¢‹‚¼ÕÎ]:a¹“;üù¤ê/wÉšx˜ñDëkehï¸(IA €¬»·ãÙŒ¹Hk*‚Kê>â vúœ×«ÈD6R^kÛ¬;«ØHu½ ±@VqÀxºùëåw9´Ë!þ™ ,‡(ؽþ³dÇüÃK£%ω¦nîäœhä(vN _ÇçáÅC§§?˜¾}ûî‰;…úe ÞIx}§b˜Æ­’ýÐÕÙ(:6õõ`‰JëJß¶±zU9JþÈÀÒTƶLFB47ZFöišJöš²´ÛJFƒM·ÞÓÁgzøÌœ2²’usj²ÙôVo#›¾þÍ'ø·“sáÆ ¿ g&×à­æ1YpqÏL;3÷ilgH ºsŒ°½´xçànOâíÖœ£ƒÖém*0×ÖU=6ìÞÛ åsã™ÉƒtcÍ);è¡¡–}ê:-Æ·Z—øu¥öGNéx|<üIýƒÇ endstream endobj 2306 0 obj 4140 endobj 2309 0 obj << /Type /Page /Parent 2 0 R /Contents 2310 0 R /Resources 2312 0 R /Annots 2313 0 R /MediaBox [0 0 595 842] >> endobj 2312 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2313 0 obj [ ] endobj 2310 0 obj << /Length 2311 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âK”€`™žž9hL99³» ™E:{ÈßlÉînÑ)‹”lk˜~ТŠÅz³ªøáO_ÿ±ÿçïû_ÿ³ÿ6~øº««º©‡ûÃ×oÿ ÛJÉáGÛšJv‡ûoßw/û—ÝÓî©ÿÿe'šãƒã·~ðôŠaÂß¿ý¶û0¼|7üåëÃ_úŸþ·—û?÷¿ýºÿÛßûo?ó>ð}×vÍá‡?)dÛÿòö§Ãà¿výÃþ·„ö8ïáÿD-Zkd/çGÅñëí£èeجÒz/„ì6=:þûóî—~¶3U§…°¶õìY­÷ ;?w͉’ðn(¶þ G+½`S¸Ãé °„Ä4G¦X,x!ÀTΊ7) ]9ÎÐÂlœñúŒ§‰) c®ÔõÝðÙšwa%\kTûTÖ„&XS$IºÙÁÎðHb‚>SÛÃvÍVu~îÝìM ç±³–x=g(z“‚û²O;±qÆUXF÷ÃgkÞ…\Û–Õõ‘e6Ó¥ÙÆ4Ò¼s@a;å[Õ`‡ôÔàl§»k*%[ñî5Âù(~ œÄ` 3]éaÇfh*ybûW'à yzé¦Ë™ŠZÃ÷aœ8»'qׇQÑç¼OAÐ"èeÀg[µ]ýž G…)Ìi–ב# QÝV†_,êér0Nðr"H îN»El†53õafÂÓfsùÍÑAßô"Ìø™ÉÃ]ÖCv]Ñteá 7,˦ðºÏäü¨Ö/±Ï—à.S8{¾0u$‰»àÕ ƒ˜×àÆïc‘(úÅ](šB–´Áu9ÀΠíPˆ ñ ‚Òe.(H:ÃQ:„5ùÚ2qd‹´t7ó’#®#Ìò욨“r¢‰´&ð¢³Ë@§¾ÙåÇÙ–I½Ìß Lð$2[¹‚óD“ÝÀáæ|Rm~yH%F=­F˜XO&›ÙÖ!I]8&K(û)-#¯“Óµäøiº@gÅ_ ‘]6=|BV<1zFùÑ#a"@<ŒAñpÄ1ÕgôQ<‚ ÜïŽpLRÇ€p"+»:F‡–Éœ]: IQa¾r¶@« /ªÃRÉÝØ 1z„lPtÇÐ-‡ƒMŠEhM;…äG8ås´ŒÒÞžÂagiÏ ÄÞ/¶3æ“⨠ ˜ÓÝ)1_jÈÜØÅv§ abֱ𘟠KZ‹ª°Ù71úw¤ÈTØ£ˆFʾ®G?z6ÔqÙ„4ßàÚb$´É|;•dD¨yºïS›´j¢N" k')猒̪‰5?ÄûÂÏ%)r «1§AóOirscLdŽS>Ïœ‘êB¡yÍ‚ÒΈ¾a³¤H®OÎÓ!%'šb¹KÚY0œÁ¢ö]a‹Üë,ÄœùÐæ\/çá¾Åâ0Á§"J\a×tË/c¢øÛ°Û\EÈr®—¸§‹ÙœÇAýŸ'òÇÙLGì`Ë!‹uµxÔ)"ß6BÉ9¨ ‘„¬5–èšgt í¼Ò=l+⚀0^)[‘—ñgiâÇ,<¬yyòÓ ‘r¨;hY9|Œ˜Hô[Qö›…—r44C¤Žîr ƼE£ÖžºÑªÑŒrIÔjêêÆD«¦ÏHµœw¥¡d[y y–“¸xŠöŒrÒì¦È†‹VÓ N#Çwy, žÆšöžcÞs S÷–­» Ov{ºÑ`Øp¯ ^~ÄÛuV¡+L!„Þ6˯ÇSUOX)† ¯'ØG‘ £˜ƒ žîEâ9Ü1ƒÐƒÊçl–JXKØzëYéX ›\ßäz¹^ª[ŠmÎ €‡Ä…k'"¢eK¼˜÷RÊ’tïq•òœg#ØñJŠ<ïË›7ƒ¤ÛH5Ís^Ërøµ@P_Åä¯Rý~èyþáJL‚”ŒÏ¬§Íñ>j¹_bbF3"ÊÙãz* )§èœm8"ôèr…A‰I*¢åRÑxõœƒàû &·âT1ˆÃ”¶Ñ” Bpðˆ–ÕØ¥Ä«áJ5lm®!Ô:éØvù¡* Ãí ®ÔÓr`¨YiGâp)!è€÷§ÆáÂH0,UF¨­}øuв'Lö‘0Rꪎ_â‘ÄøÚU´6oÍÖÚ|ãÚw#wÓBýйÖ2Xe m»°g€9ÛòØ› ûE0ÒI¦¿Í·àö-x¯$xÌ´ì;Ýl[œb×|d}kGðE¹©17•ç&|© %A‡"Ë¡-Ná&Ï¥u×ëÙA(U†›Z½qSqnÂÏR×ðJW̵¤Dw^‹’r!ÖÂø=xÛÛ¬tà¹n’ì¿b¹^ìúÄr2ºíßv‚tÑh…? ²­}On³š\çm°‘R­œ©²:%­.øiN'¥×é™pFÆRÙ+lSÂBã)™Yó;;Ìè Æ‘û\¦ÉKbÇj<}–|,’ÈÉ ËXÝ/Œ›ªŠLÌq–F9•’ã¾´ ¹ª)] Y%æúv˜9õ<"Íõ Òúb²Z³^ÁÚÄ1¾kiF)ß¶f"å“Z•òŸY:W–º¡­»sIž»¶kvzª&¦ž€àÁÄôûá0Gè9BV!Ò–º™ÐöH…Îu_I;NFDFÞ”¶›. pklÂ-ð1 F˜<Øš&TGzD1–çÎV¸±ò‚sj %&”˜©(c=帄.â3:®­æZ»Õ\S‘T-µ|ékD!4ÞûÏ †U‘¾¤E΄ž4úŠÊÿXu¶2<­Â§;¤¼Êz-½<õ2x6 5嬕÷üpúæ©X(—‰ÚŠ×k¡ yïW ㊕3ê‚g˜¢•Á½ãá¥EJ'W€°ø™‚™ó­¬Åî£g6BÓ(’®Ä¦Jî°Ì³Ëï°ó·p=ÑQ…:Õ¡`]Ç›mì©ñ˜/¨Ñ¤i óI1û®PH)NÅ5tE9ÈÚÂôb`àò”´’=éšÂ{â±í)½:°í‰y‹Ð€ÕÓš•µöp’‡ ÃT(Kta*W¯×MÝšEÇZ‹3‘=^Þû•Ë>unísTk°ºbk϶J2çîUÐn+ÕŠ·Õ5oja8‡k©ì Êý-”ûáVxåË%º9¢íçïR²4s^:§‡ò´t6æoŽK.îõˆi]wÑx£'E9µKg¦êš愉°šqóu(e;XæQ²eò¤iÖ”4ÿ𵜅Úï³Hû—Œ+<…s„X.˜'dÓzsS˜)X¸XÑ€£‹ÃjRqÕmzèœIîÝT©RÚc{¤B8c”Å$*cS’øãÓ x—² ®hˬ%eÖ²ÜX›TnM) ÛmYj7Yïá‰0-]¡à ,—D䱈>ån‡ø»Ú3J%Õû|ïÅ’§4%,Ï) Ò˜I¨™T`a…Q.°K@'Ë=cO¤KÆlDȉàܹ“Dd‘Sî³™¯\;0\dI€ˆ@.a«TYhŒcæÍœZY5œ7v9#ÂpU¦[~OFˆ©m»ØE82”"IXÃ_1Ôa°Î/*Ì$¢— VwVM¨‘ÒX_â£|B* %­f+ÞA|+j3uJ‹T \am‚ä¹´ŸÞ²gƒ¹FY·ÁNðÖ@I‡I±ðlNl4Sêài²aÜG*&øõñ7fm?%hÎÑs`±ØK `…fÛUFÜn<ˆ„ADn>Ž(׎®˜:8»%fÔ@M­&h1ÁA ›á÷jp†±Uª!’nÏ ž()ÆDñòè>ûí7BÚTòU‚Å$³-Î<ñ,«îÈt›Aä²GçÔ8VLTÎ54±\_]¡<’µNŠ¿wל7…IäQ› ÉY¤ŒÉ]‘§Ì`kIOõµU§¦Ë ®qDÉ¿˜ŸCSš]g«"#ÖIÙœ‚ ¬ŒRï!å:[sÓ·57pÃM¦¶VuÌH\ÃökoHgŒ sàÖnÀ•-ÝÈŒt]ú]5—3]Ì/ß’`k.7ìpSw7ºÃ[s¹ª§Vj[s¹#ºt³°å[‚]'§®£KÓ”nd¶5— îI[ºíÖÖ\Îõ $Ï 6—³õͶÛšËÑ©BªÂTAñ®·Fq…©BŸâS+hg»ÅËV˜®qqr°"6)iÿ¦Ž™ZQΔ ÉuÛýr‰äÀ™ÈZ*tU‰€’¿Œ£ 6zæ¥çMñS@ÔUc…¿¦<æB– \dþXÎjju÷R®ØïvJÏ}Jcb Âv¥ç÷ØŸ5é¼(¸Ûžh fÄ=ò¯²ûãÛÈíÔ˜âሇFñY–£¨YsaH½ °žÃ(Ö «±ŽSÿµéM£Þì9|`üöí»ÇVr¬úÕÈzòšYÞGƒöYÛìE¿ŒKÍ×:ÑTG³s¯ÎAð1–Ô4Us¹»_§+à£K[ÙË®–½02°ˆR•ì.vb2¦jƒöuÄÂ÷´ð™>3®••¬Õahªä.Í60‚qóÒgÇøÒ…~AÏŒa³K#­côˆâžw,fí#lGH º£ÇjÄ9=ïÜíQ´\‚ñcˆŒ3Û(ÆM]ÕÃÐŒ}Â{;Šþ ÏŒõ<pNÙA =°ìSÛ6bxëdà Šß¶ªy┎û§Ýÿ)¢e¡ endstream endobj 2311 0 obj 3860 endobj 2314 0 obj << /Type /Page /Parent 2 0 R /Contents 2315 0 R /Resources 2317 0 R /Annots 2318 0 R /MediaBox [0 0 595 842] >> endobj 2317 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2318 0 obj [ ] endobj 2315 0 obj << /Length 2316 0 R /Filter /FlateDecode >> stream xœíËnä¸ñÞ_Ñç«áK¢,x<ž9Œ9³Ù‹Ì"Îòû‘ZRÛ&»(V‘”ØÝã[%²ÞU,?üéëßÿüýøáñëŽßæï_¬a›þǯÞþAôÓºoaÆÇoß/Ǘ××áÿ—ïNÎ߆ÁåÀß¿ývø0½ü0ýåëã_†ŸþwÇ?¿ýzüéo÷Ÿgxã¾zÓ?ü{ú .úá—·?ƒÿ:üõÇ߆)ô'¸ãÿ?p&YßÇÍãåü(?}½}zÙ8·¾'ËÅð_; ã¿ÿ8ü2@;O£1ŠsÝ)Í‚¡jq;3º;rÆ ÎÚAÅ2©3âqKãLi?(2êM§OËlu4ÂfH±3LÈD$fÄ£V¶ „DÅ»aZiÚhtÍ¢ñλ>‡ñ¨•Íx‡!‘ñ.äÌ¥RÆ.ó *ìL@ãŒxÜÒÌàȨW‚OËÔÑ =ƒŠÔšD€Æñ¸¥-¨‡A‘Qß)qZ¦œ‹È…. ¢1Ö§âúqF>|æJöcxõüË0‘SŒ6}{Û¿ Žïà<ÿ|üqÔÄÏ¿LÓ©Û)¨›Fx°OàˆG>ƒ#Oàanò„¦êÈýŒ“”G{ü<7Ù‚Ð>âG`YàMÀï5ˆQX‚=”g-AúÀÐȦ)¬‘³¦h$ RÁó ¨¯%Œƒ¤‘ÁŽxV Ú RNRÖr¯€WJ± },9°Â±ˆP†Ç™ŽXÌËÊi"Œm#\ÍBð´!­‡áœÉä2¤ÙƒÐæ}KжücÒ@y ›‡€áfÙ#¸n@vŸÖ°¦È8Žõ d›\{Fa:g)ò³-¾ž EPËu)`=¿jIê„Så`~¢gM§ù»©·Loß{ûðH~‹cdkG%°ºuˆ®7<ªš¢Q@Ùß2ÿÉÙ²{´UþsÿÜ_ÍXÂËaä=[쟱,9ÿYëj–Ó¯k–3S½Î6æQtÕ<†@K*-Dٹ٣ۘnÓY,[Íc5Õh}³ðÈ~µÈ CœÙRs‰fÂDfÃgBñ ö«óETËÀ"¯kÝgIáS8i+Ñv´Sã)ä÷vÊõFÖ«œ“ž³íƒ½!Œ_~šczDv?b J׫Øp¸4‰uM|ê8eøˆ8yÀÃIêÔmÙÁ((Ø“[ Œ”-hŒuõ½J®áS@ ûÇŠ®ð .7ͨë¤6–²£D*[gànÅ¥GHØ ÛzÁe¸$…ëŽRsᬖá—\OÈhlY{,ôyêwÓ’mµÙ6˜ïÏÙ$x %iÏ Òþ +$ëW)äÙr«M4 TOSCJ{@xn°Üß`ý…g0ïÊàÍRožJxÖIÛDzfnSúQšA2¸“a$¢éä6RÄ ‰ÀÕ6«S݆Ø^ÉÒ(æ¨g§2àØ}Lwµð¼õúQÇL;V·/­'Ë]mTõQuóU6ëFU²Y2Þ ‘ô’ÎvFhLë†ÏlB7Ó.Y¢’ó ·è·½DŸ5c9cÄDÔÝšOP3–5cé[ÍX²»ÊXÊq_8FCw“£b+ Ûª¿Ìõgï»ÆÌ›å³H:.©'Ë`Yß=f¾½|–Ôo[å,'ÁÞY•³š›"æ‚‘mÏí¾àv×·l$©QKÓU›Ð" (»¬Ö= Y¿‚íÛŒ ¸#ë5À0óRîVIz9NTmz¡\¿Qóžðû_êúÚ)¯ÄK.ñWí–å4“§†ÁH-hEƒ¯­²)*'¦ ÔÝHŸHpÛÛ cx¹íÙáuÚy/¦•2â.G>R3ÜÆ|ýŒE83z^ƒhoMèç L<^3*ÎqÇÛRœÇøòèÌëSÜý [º^\kAãù4Éw ¥âS°þÁtÞ'D)ÛzNo"Nòæ ÊÙÞ¤n©…æ6-çÖO ™VƒÒ™l||v=©ÅZ[¯Ö@ kš ·px¿é*Kxp:îèxC“BAÆ\ù·ªvS(-!¦ïz‡é¹­ìÕ1®0ÅŸ@ÈÜ‚­¹­K×ôàJ– üy%w×d¢<‡÷V\Å”Ms0±T1W òO[ÅÉâµb+ŸmÏ…~†ž™eçÒ‡Ö1 -î™™b˜µÏs; @×:èµüÜ·¦HíYå\šãô´9‰Ü²†MCt‚i+Z虹€àÎ)ôðÐc:õ}ǧ·ZQ<“rÖ µãñËáÿ¾|ðÛ endstream endobj 2316 0 obj 3249 endobj 2319 0 obj << /Type /Page /Parent 2 0 R /Contents 2320 0 R /Resources 2322 0 R /Annots 2323 0 R /MediaBox [0 0 595 842] >> endobj 2322 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2323 0 obj [ ] endobj 2320 0 obj << /Length 2321 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsuDR¢$ X 3I ô¡À ô¡èC‘Ým±hîCÿ~eKö̈þx9<¤i› q†Ež;ÏþôõÛþ¾ýðøõ?ÛoËÏǯ›f×èfþ³Ýÿýáí/ä°SrþØÝNŽû?Ûoß7/Û—ÍÓæiú÷e#ôáÁåÇ4x|Å<áïß~Û|˜_¾™óõñ/Ó§ÿmåöÏÓÿ~ÝþíïÓŸ–ùö_ø¾F½ÿðïùƒBÓÞ~Úþkó×?l›–0æÝÿûƒhZÕ4CÔ:^NŠÃß·¢—MkSêõV9}î&pü÷çÍ/Ól§eìÆVˆ^·}ã=k/÷Ó¶ÓžÇij¥…1©±7¿©¢'ꦉö+q[›>öö©È úvÞæØÄnô4UäD¢ÑŠôû‰¸­A§¢‚^%Û»X€gІ¼”šg¢ýŠDÔÎÀã™ÈpŸ¶9K›¦ÝæqªhxiÑñL´_‘ˆÛÚòx*2èµ^èK©hˆi&RíGAX‘ˆÛÚôÆTO,F€|5^,>|÷Ïó/Ó2VÓüãùû¦Ýÿg"Цß>ÿ´ýãd:?nŸ݈n׌ªïfÖ<"ûÃÈpúE#¿èß|ýjc|õñð‹öô Ѭ¿1~¡wR «Éàk„v½F~œw#v]«÷ó¾~µ›¿ºkçIߌ´hÄ„€±-1¿OöÙ|F~ö‡øüÕn2€!ߢ ¶U«ÕÛ ^Ú<ëçç‰ìãˆX´jt,§‘÷„¬¾^;î:cA,uî™OpDÁ¼‚Ïäµ1€É%Ûµ00èÛà8ÌF˜"1©(8)¯@ ¡4êÃÈN"¿8ÅQC³q ýj\¡[Œ«å‰–‚ÃAn¡3·PÐSÆBX$ f‰KQ <%,Éܤ Ò’°±GăKÛÉ Ô7Þh•ïÃ@‚ȰˆÙvEd&g@ Âïs Sƒ¸)X Ñ+„àWÕÀÕ,¢¯¤ýœÁ”ë»Y-iñžôÎYKpd!Ê3#ícø3÷n1z`k¸ XQ^}Áµ¶!|ÄBåpDŠðÙJÞ©ÂÒá!|Äòž‡ŒÜ4ŽNú—p óÆİ÷m>ˆtbpbÈ"¿/¯A „£HEŒaËlU怒KÕÇÐå5Ã÷ftåâ‹fÒ•XóZt Æ6†„µ‚t€wjÑýxÕpmX[Vð®€k‚î_üDL#–µa‰?f”iŽ‘itXåÙÝô³$hk¡’X)[twXƒ`^Ç—À–÷àbŽÆr[PÕ†+ÚÆX4|ÞTòˆ-¸;¼R ŸöÍËg·xjÖp®Ç²Òیه¼v(ö)ì6^™°jÌ ø‘ÕÆè=´håŒlœ%vÉœW5¯—Ò¢kËà³áè·]ÎYÞÚËS¾ë BÁs·…²)´H±†°m…¥4¶l–½eûÝ,±Ÿ‡²ŠçŒ`+òžaì¡£`îšõYYÓ}CÕ*à>E1Ûˬk»/{¹×]¥òD”Älûf¢ò{·}õ#ƒ8¾bFˆhÉpk4(Uœ’fl”–X2ÝÖé¾e)©‹îB 3Ûѽ2ŽZKò-šñbеí‘MJföOȤP¥»v($ÔHæ HqÇɪ[rÜ»Y?b¡’BJ÷+I¡:RáŒzµN“ßÈÝ•?žR5Èn­ ¬Žóf¦6˜€µ|Ƀé2`×ÂR]»Fp¶ø¶UÙrYëF¹4@#µ—sZµI1g±ñ/‰¹QÒ1g ÊÄ\À³ÉÕÈÑ.ïÚ÷GsÖ¡­–i•âz,ëà –jq¥ìBï[­%ô¯c)¤³¬ÑyF  ,§&– Ì(C ê n¦ØMÆ¢)åyGÙ€÷¥7­õZ¼‡Èl£nÓS2XCŠ Èe—t0¡™·Èù:!J±7,e-Ú¾5Ýf¡·ª (øÏ¨?Ä´ßýQ½Qxb$|æ~¼QÌÞ¨j1•̧¹x!½‘¬Æ|­ÑÄ´©ýQGêH¹æ‘û9YZj]~?õÜFÂ\Ñ;½ÅÓf»zë¹õd*ÍxJO="»×Ýû$³p†¥[¾¢óÕ”Z·4Õi®!àèÊoIÃc½;&êúÊJ(w£ÅÛÁɦëcJºk¦ìÒ¸á\Ö¼¬ùÉb–ºg²Û=j/ Øù©EƒþEнû§VøŽÓƒo5o¾œáàk¯|”’Xç¡zÜæD¸­Ç“ì. $I[ÂGIêÊ£ê’ ÷ YØpgcŒŠÏT‘uûÞ8HO¨U†¶÷6ë)µ4—n§CH)‡« "+…Ún2£5˜þt+Ä)°{•'¬õ’œvq­i SîƒÿuZd×®øêV-õËß–Éb‚îôÆöîÌQkäJ¨‘£mÞu¶Ë¿«Z"!†˜ê‰Ú21½ri/ž!”«v“·>RáF§Ï`Î(཈ˆÐ¦Ú"½y›k³¶·h<Î\€«Æ´ÉGÈ%¤ÄÙ-–Â<º’+)rÕ1;¦gÑü²9Ö2 »SË 9 ²¶™ èljÄ)r TH±âØä iJ Ú¨.åBaI³À§Æ`x*v;Å=âr”B.…»•ªéãÄAÓ¼Îÿ¼³R|)bÂ)•F»fðD]Óx²oÔ“)"dÆQÚ0’öÅÑ\®½%¢cÙg@F€mDðßïän&IqñG„suÁr<]ã »àZèW^°ÜU€™Ñ?Ò\ÜwŸøPƒä>Ó×ÌN^Ë‚5HË›Ÿž•™R™ kmv#…œø(ª"w½Iíq[xü^:2G€°¯×Wc„”Ù°?×U¶„˜'Ž'Y"g„µ)ÞÆOŠPn:õ ¬Öµ±fXža½^õòY¼¯’ªÔoïêW¡NÝ+׿£rKækuþå¹¶ä‹d)2 äý”!QÚS&^«ZÁ| ŸQ®y»¼M[óªn5«)Œv(Иsæ£å‘¯ýXÊÏϹ2]{?rum7:×Sëʶ·¯Óª¾N¿Ÿ*„\õ -ÁcZ­K«ÕWŠu™GëõÑ73äÌ»×Ó „O®ó¼ykgGJŒ‹b½óJ‘ëŒUë!cƒö“ódÝ©ZžÊÞ.Ùë{?^ì2Ný]W»xÑe=õW)Ä.…ðª)iD,-l§õÔ_Oý©,ÒÛò/±3`Ô ׿Ÿ&3¶;à/•ý®?_zߟ™¾R;9®Ì•å¬ßíôŒ·5Öνg€ÏŒð™™z¹“Ú½Ž<ÀÙf2yû›Oð» ÙáôÌb|œh •‡=³`,dïËÚ Auûϲ'ï ÆÄöâ8·Æ.:èŒÙ–Œì®Ù5óž0ne‡žY|Xg`NÁ …†Yð4 ZÌo]! ‚X¼IZ|┎ۧÍÿ¬ãÀð endstream endobj 2321 0 obj 3622 endobj 2324 0 obj << /Type /Page /Parent 2 0 R /Contents 2325 0 R /Resources 2327 0 R /Annots 2328 0 R /MediaBox [0 0 595 842] >> endobj 2327 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2328 0 obj [ ] endobj 2325 0 obj << /Length 2326 0 R /Filter /FlateDecode >> stream xœí]MoÜ6½ï¯Ð¹@ñ[‚±ãè¡€==iÓ¢hŠº=ôïWZi×6¹Z)®¬UÄs5"g†3ÃáòÍ·®~û·zsûñïêÓøóö㮩Ý ªþï×ÏÁÛZðá£iUÍmÿ§úôe÷X=îîw÷Ý¿;¦÷Ž?ºÆÃ+‚ÿ~úk÷fxùnøÍÇÛï»OÿU¼ú®ûßÕ?u?~éõ_ø²k­î?ü9|`œñ¶ûÏóO}ã﻾ªþêºÐîéöÿ~Í¥˜ÐIýx<>ÊöŸ?Š^ÖõM°ÖòŠ1Þ}V;þùu÷¹£vìFm%cFKÓœMÕðž¬åº²FWBr¨7¶óH±DBœk“…оG,mh¬‘&LŠÊz.ßS²6•cRɬ7Úæ!Ô÷ˆ¥ md}€™õ­l†ašäI% ËChß#–6´ë1)*ëE£GUe2™c:Ö fT&ê^U“†6²>@ŠÌz®Ù`pDª­?’J昶™dØ÷ˆ¥ íÀzÔ}–8€?Åovo>Ø>æyøÜuc8 ?¾ìdÿŸÎ5]ë/ÕÛ.zRßTìd-…Qc¤5¶˜}Kûô ±ÿ…©;|÷ØÂ "‡Ó.U©z_½^øÍݾEuAc˸zÞ;€ÜH8`È þaj81²ðž…= 0˜í[?<ôÔb]±a cöº4Žëî¡›3óÌÎ3"T’k¨E²Ã_ÅÃÏx½÷Þ×î¡kÎZGÌ7®¹j%GbuÛñë倽÷âæ)+d°®âÍ«½¸'ò.—&2)Z Œ]ܰ×Ee_ÊÙÖÊ›°…IÔ"05 [>À÷èø4°%ð ìA ×-lá°ÅÀVPö¦ì)æ|ó¶ï⹈û&nQ 'h_ oXö°kŸ„-œÅS[ôH1µ¬ó,`Ÿn Î3k&û°IØVLµ”o˜žœ÷üÊÛ‚-è¼,È¡ä-ð¸¡U øGÝÖ>’†qN@“0±ï†Z.‚MÂãï <“UËIþû~ÜkB~ «¥PÞ’¡À¼&d‹±8ÌN<ÁÞŽ3«Œ­iSrŽÅlÍÂc~þ´S[ˆ#â}ÁÑñ¤Ë©—M@ ÆdÂ<ÛlÀfVi ¤ÒÓ«´BêpâÚJ×ðQºœyÎP¶òöàâ›JÅ6žnðŽ©cË‘y,ëqº¯ÏÏzåì1[YKç¾ sx:as%»3'—bàÓçfŒ`¿Ôå$ 9¥ÿü#A ¸ùoò{æ,(˜xþž.Þ,µ Õþ‘'Y.s(G d|#[„±ÉrÄD:€t¼‡'?oó‘bC#¤”À”í”yNªÉrtaœ‹KÛ·œAܬ[ž#X™I[°E™Ú+°X”ÇÎ,æZùBµí6ùˆÍHÒº6Þ;Ä…K9œIÔ“RZ¸Ä-w¦ÿ+¨¤šÑ e]s˜#p‰ êf÷ôÂ*wŒë€Å¬+™H{lÙÙv{¸¾+›²3@Ù×Å·\PΧì³e½c9зBw9ç½7pV=¾7„•ÓX!ÎØŸ¤p$+5’^Â,úâxÐ’± ëâÅËÚñm¯$­()ûãGÛ]D#G’î"ZN‚äS1Fû ŒÇ Ü€Žy€‹‰)7NáÅöÛý­;ÕìÔ®ÿÂøãÓ—€®úJÞ<)ù}P̓NÎVW¬ÆÉEÓõ>¦¯Ds„-ÃÔºÖ§³ìVÖ^<ˆš›ÚœN·™-ÃBSˆº/Ú5~âX©ZaµÖœzO Ÿ±ð™Au ¯y#ú¦§–Hm˜"ÊS¿Sßsd'Fø=3fmOµ04Žq÷Ì(±˜±}ÛO€­ë?sÅÌË)%íqúžêã»)=Pµ8¦šºšÎ–-Wè™q1|‚ç tè6‹œÚV³á­ŽÀ ‹Ç–ÑBf´ŽÕýîâ2 endstream endobj 2326 0 obj 2877 endobj 2330 0 obj [88 /XYZ 32.1599999 76.8199999 0] endobj 2331 0 obj [88 /XYZ 33.1199999 74.8999999 0] endobj 2329 0 obj << /Type /Page /Parent 2 0 R /Contents 2332 0 R /Resources 2334 0 R /Annots 2335 0 R /MediaBox [0 0 595 842] >> endobj 2334 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2335 0 obj [ ] endobj 2332 0 obj << /Length 2333 0 R /Filter /FlateDecode >> stream xœí][Û¸~Ÿ_áç눤DIÀ¢Àd’èC úPô¡Èv[,º‹¦}è߯lQ¶‡ÔÇËÑ!%{”gdñrî7ò¼û׿þñßû—/ÿ>|3?_¾ýùw‡ß†%tçqOÿþ *ÝJ]/ZÇ÷Ë«âü÷öU4Ù°6¥êª;!‡ÏÍŽÿüýéça´Ë2Ž}-D«ë¶Šµ•§a¥‡¾Õ‡ZIgPgoqC‰¥é^ò tZ‘X¶5QÕ­(2èû™gÐ÷õÒNC-…X] ÅúӊIJ­M ÇCQA_7Ù¦X úëPKÒZó tZ‘X¶5zÏPdз¢åýe¨¥uЉ}N+b=êØió~Ž™¨;ÍÒ‹“V©êÃE®}fÑyòªó¾{^|ÿõéÝ'Q«î¤â¿þö°˜}•ÛéÃä»±j‰ùŒÂÏØ6ÃÞ(Ü‘ËùeÚê\»åÈŒ„O(ñ ÞèG )¤‚âÙ^uAÏK‹%qÎ’>™VbY›Ë^±ìz4û[Ü»u÷–¬;ŠÅò`ñ… ¯z÷v.ùÑí ä’0í(‘²…P²f0®ƒíí¢ö¾DÂwý¾K®·%¹vý¾ë÷KÈú}ËÕ%´kTk]Uk+•½µV7Z6·ËAØÙXm ìúúîhZqljÝ _¶É¶9*Ù‰Wó 8¼lþ^šACg¯5¯sª ç»Î RV)‡˜ŒU6‡Üqáõ±Ä“‘Zú(Eý$¾¸$¼XøÄ…E¾šÂ®ÎWýÙßð0gGžÝ`†¾Žjò[3"Æy7eñXpaô9ó%È©ø¯Ö Ü0›°ƒ ¥‘¶¤Õ›¥†àÌ/•²²‹Â2dç» t‚¹ëy‡ƒº–HyikpÔ°ˆÃ áÝÐ_’ÓZ‚ÇÜ£m¹q|¤18l€Ù¶<Ó„]H¼x•Ì#U8dºËºXb'Ä-¡óü ¡«{K!D &ÁçJà<*‡€NgÛŒÁÚ^6¶¶ÃŽkÝ$õõ7 ¨FüçL8y˜3:1ÒO”{¸g¾*z>Áv5=ïÄ…\`àÛ³ù—‡c7Êñɱ œ‰Ò»Äרœ8B(f=·ˆ:ŒœWŽÀ'lÔƒ ád8+_U˜“ñFñh §?0¾÷ÅÙ—LËluZˆMe×[|J!_Rº gâa¹Yw¹M¥má—:J¨9ù¬úI–W¡ê… ‡à\ëÞ±á²D_\ûÏ™fIŠàz(Þß𤒠P›\RöŸ·Lñåñ N03?A%ØõËîµÆ6¿Ñ1…˜‡ïZ0Ê$B(É¡C²Ù£h­[]{ˆ!­ˆ|&GÕˆg.KÇ/Á}þÔj'»0¾‡”YJ¢ˆ·œ‡p(ƒ”šˆ-ÈZ>V[ää!„$‹´Á‘t£hêY2  !®Še1Ë9ƒªÌœ#ÕQ·â•W¢¦’ÜJØU†ðÉ-”’| œO!%«V·×²ÄÒYb÷¸BõOf3{CT˜Õ!IQI®6²lB=¥ƒ¢çÓ]åíœMi” …À#âm,tM¡±<ÙÍpàdA1¯Z*>뉵¬Æƒô"^–`äv‚ÊÁPOï·ž®=wKÃõ”˜¨X‰—§p´´5i5¢â‹W^$7(‡iœ~ö£„wÓ”&[>ÇŸ Šd/ ‘½|OîiÕӆyOüOõð7òõ1/Õ˨¢Ñ[0d¹P"œv*ê—”­S‚½a÷‹E äàê9ä¤d—Ùô2žmÿà×çLÚKmÁp‰Ä\=ýüPú9ç“Mk»YV¥Í{! óQÑ•$|Š ³ÀSÚ q—r©GØ.3˜‰g.I¬À%:·bQ¨žåªsÉW‘Î}£^¯ç>rÒíñø.m‰;QV/?$t­ öòLmË;pžê…tàéy—¼ p_ÛÕ±­ðª›è Þ÷SÇ7‡˜Û7|Báç ó3AÚy®IÇ´LéD¹8v—O$ù´>?“:–``,°^¢¼>Ü<½t)}­’ÂsÅ4æ9ˆ9ÿúüz.¹ÆÓ í&xeïÛ±© Ëëš¿®®‡çY5ÿúúc·o¹åº§?ÓêØ^:÷i-˜ìJšþÀ±Ü‹ w)>¿§¡•¯võðÅ–Úõ;³~§pÅ#,ªßå%ÅÆªß=Ô‡˜àø¾ýîiΆé’W¢°F*Ì?‡ o4ùŸz±. x޼r96·Û†>è$³ŠãþñȬ0DÛ‚š²žç¾™æéO¾:×îþ;»Úýwtð“Ý÷Ì£Øî£ŽÞº ëZÞ'«óÌ.!¹eÀáô>Ù#œy"œE$¤õ´Þ‚'‹1Üਦ$J–’Ÿ…è¡Kªyck¤¨3% ¥§¥1†A³xvJˆœ`ߨÆt€WÀ«C7\ï„¡£(VoœlÃÖÜ®ßO¿gÉS–±êKÍüƒÕ…ì|v¯p#Õ,¦õ3ë¤h})딀mO„®Ú#0t0 äf†Ùö Üm…ñCÊSSjš)'ï)¶~‚G£Ü$°KåT2¨>“Ú+v]½ ¸y$äƒÕUl™ö“ Ütí9 º:×o9žM¹³mÝH·¿ÏO=üyĹ&Zãœf BMÝ®ð!7ÓñÁÐÕM[…”s½JLÓ¤™Ž ¿£áü\›t`1bê¦é…Œ†#žÆÈœMŠZa€éYÓÌõ¢”ZݼÆÃ’AžNG¸}¥«L½Q ¢Üã‰ý%WϲHp;°AÑ„æÇ&%ª£nÅë8°3XBèªnÄÇ=Øœé@V®¹Ü£W·Ð6^PMÈõåÙà•/²È M§ÛŠž;- W '“)ç‚I÷ÜÃy(·¼S|Úœ÷Î>|:»äÍ¡ºj‚èÁ ëm–”[@ï“Æ<”´‰..úÒŸ¸Ômé[¤;4)·HQVõ E7QzÃyî8Å·–Aèxt§„;'My*¿ôÕ,q·EÀôÔýåŠøÂ^y‚·èØ[B@|/'@b{§åY+Ô2V¼‡xâwNt¸ŽÂñØxD»ò!C˜‹9À³õ\ÛZXr;…g⹦T¯P¼•*’Ò±gRî Lùâž q°ÇûJXÜÃÌÓþ÷xßF(öxß=ÇûZÝ9p÷=m#®Øv¥»=îqÅ=®x~§`\±«Jv{ Ä;-^£tÎÄ%\J:\Æç‚ÞKÊKbrñnǨ†à]£˜çú¤÷þPnit‡ç€<åj˜µK~<{B .ž((l/¸FJd‡õPúc\ËÀy¦è”à9S2Æ4ûª 9!mhë몞í¯Hç7Æ¢º¾4±iHî·/›ÃJý±ïÎ ¿>ÒéÖšú¬ÒlÑÑÏœÿ1ã«£ñç›ùœùŒ¤áïáû€ ¡Ï6?¾ýêA‹×êŠ×Ï^Ìz_ “„>ˆsGz¡gR<¨êR:J­z>Ôß×G‡sG)&Ûc;ŸCjgžŒr@©£ìg¯ hš£yÈ&ѹy:øNß©¹•GY©W¤j,á¹ÑF¹ýÍø]“~Ùá'ôŽ4sOÚ‡!ï´w ÆRönÖvf€Twú,1YÒcbÛØtskĘƒt _`È’pëЎѬsßÅ3»šq)ƺÁÕ¡f¡î9€#+åäáóÓÿ¯_q endstream endobj 2333 0 obj 4543 endobj 2337 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 768.980000 91.6799999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 2336 0 obj << /Type /Page /Parent 2 0 R /Contents 2338 0 R /Resources 2340 0 R /Annots 2341 0 R /MediaBox [0 0 595 842] >> endobj 2340 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2341 0 obj [ 2337 0 R ] endobj 2338 0 obj << /Length 2339 0 R /Filter /FlateDecode >> stream xœí]Énä6¾×Sè j‘I HÛÝr`Ø@ÁÝ“ ‚8Oóú‘JªM¬".%¹ÔÚe±Äåß7’~xþWñÛ_҇çÿ_ÆßÏ»ª¬T5ü+úŸoÏð¦|ø¨Yò¶ÿW|yݽo»§ÝS÷ÿÛŽ©ý‹ã¯®ñ0ÄÐá__þÜ}ß Ož~ê>ý¿àÅÝ_¿¿ü³ûõuì¯ÿÂë®iUÿááãŒ7ÝçŸúÆÿì~þ¦ø³›B³ï·ÿÿ[VéV´M5ån†œvÆ?O;›¾Â NÅp†ìna!CVi¸÷u’°æN„–9zcúÓK§d©ŒVLt†É Sìòï(°RÖêB¸â¥yÐ;fßyN° Õ] X¦fŒéÍ"˜áúXí$wBÇ”h™£¡à¦S3™ãÞcY1t‡Ç²|jÈT¬fæ‡1$æì+zõ0”ÜIÛ‚Oƒ•¦Ì탂™bê›»1Ð’+„VN‚e±Kq"Lí‚Ux ᎬÅ=^ÎÏ ¯¹aŒù{}Rù¨yÈÕÉÛà JP‚>š_²Ô€ f&Dê!·!uÙ¿þºc‚Ÿ?øc÷œÝáï§p‰û˜Ì @À¢ð1½a\B¶7¼šíB²¨°4£XŠg-a1-at } 𫸓yƒÉÆ+i­„;6SrÇ‘°º7|Y÷–b=;ÈŒ(Àò¶Hüħ‡mDG[BU¤*1k Í3%„‚0ˆ)ªP÷‘8ºäAx˜³ãò| wÀƈ`bajÚ †¶Ä w_§ÊÅqŠ’D¸-Ø ˆ#27Ûb1¶Åhú¦Œ‰þŒ®”òmiB¢#Q¸ÎC¢P‚ÖØÂÂòÐmM3-¯2su«üINØ¡P¦1ÿ{¢Z„M¤Ñx`‡D!Á.Y‰$+9Õ_Ø<‹Ž7ð,šãR8<©!I£¡ ‡Š†£$!®RA±e‚x0)~6s/Z(:=*¢š¯V§Ð(Åßp¯ãˆRÈŒ»wˆOl^EÜ$VöRq‚«“I+J!½“PŸh­&úÄ'TM(17-òÙ\ueiöayè‘€P¼Cê¯&IT¦Añ‚üm‰zœ«¹E~“;‰²Ãà,…!Šú‹³'+XX-$¥ä%.­Œ¶”@÷]kyD-£Ì¾öGøÏ€·þ3p¯õX`Àa óŸˆVjà€û†ÏÎÇÒ¢áº?BlÁéåsT cêÔßb— ©¯ÍG}¬bwG}XZáYcŠÝ¨/€úD@}À±0\üiì)•†j&Z#Í)R&.=ò&„=2$AC+:pMš3éc C ݨ°7"^Âs^Ðm"Æ0ÆDŒš|£$>Ä.Âç!z¢æfÒdÝ ‰s¸¦;ù`qà³³Õ{K`BÁÝ4SsÿÝš§yî©ð©ȳl›Qê¦]ê‚Ò$!àPv)QX#­·²êc_—' |¨>Í]Þ)Oàr",ùkw;)ÎwàÉ}ºp4²²DekÝL)‹°É„’ÜS_)äj²¶xgôκe-nÑw“L_g&g2EªãæÌ-e¾Ò”ù:©ußȉơŽÅqÚÚ°œ[”ºQÉÏ:ß±Ê÷É QMsÉÂ+‹†dÛ@³mR!Ó˜>í¢_%m·-â–‹›f||­æKìI÷ÒQŠ ¢Ü²”¹êy>r°emWá,F=§—tj½»SšÓhØñt Íd¯V‚«Ü_Ólk„¸d©•™m¹\LcÛnøÌ+·Ôþê¨Ü´¹-‹p[ÚJ]"þZýå~ ÂYU1®Ç0-W)Fõ’òŽk:&`mûÜüMÙáŠ7ú[/( Èß{m;^Ìã¶1ßÇÌ“ÅÙZi©k&\¬pPJaÎùDš{°¶G—r»ëü ‰‚?íi‰($½½¥d¯“÷¼ÑÊcñûC©j\¸ˆ»Zr·À¢oœÀ>:ö^°Ÿ¶ lµ!'û/âvUë^ÆùäUn‘ݳBéwF:W•t¾aØ»Y†Û [Þ(ºj+[4ÅbK)§vb,äþ·œ‰n°ÄªqÔ—¾ÃgM‰|ç²£ŽcA&k<+§Öí-¸®9Zà›Ì¶Ù‘8Œ¥eC"!çŒÇÉI¿œË’NÚÙž·âuȽa‹¶=3ñðíõð}éG®B|è%Gö,4†g@ˆÃbº\çí™÷c‡.DgÝdŸÓªÇ[Ï—#Ç{°-‡ða{ÊbÑmÊbRìŠ\$§´Ç[ÂÂÃÇû“æ:Âá'–ˆÆ7®¥¤ÔyBšÇ•™8ºy{»˜R1‰ù„r£úæ5Ð4Æ–Ø ÀÏ*cµ¤êᨰÞüñ%pÖ?"_••ª™œ§¤ûiY2ϼ3ig±¥Ò.®]¿É'[öÔm/K÷S¼u"ª?ýÆ__^-2ËvÕIØ=YÅõÕY9Ù¨‚u˸v€yËT¹¯‚-DuÝ[C•*Õõm]9kÄ×¥¾~”»¾Ò2¡%o¯^Z%e©†¢àS‹†ã4ð¾3®æ%¯Dß4%÷k½ .Êù“GøÝqÁ•~FïŒá’k- ­cß~ïŒóYû8·=P]ÿ™K6I{a{dùksĘƒtÀ`È’pkÐθEöÚwñÈ&Îб¦Ql€ÚuØÍ¹¬Œ('‹§Ýß!ŽõA endstream endobj 2339 0 obj 3113 endobj 2342 0 obj << /Type /Page /Parent 2 0 R /Contents 2343 0 R /Resources 2345 0 R /Annots 2346 0 R /MediaBox [0 0 595 842] >> endobj 2345 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2346 0 obj [ ] endobj 2343 0 obj << /Length 2344 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹Ôƒ°ÇÞ90l ‡ ‡À›M°ˆqö¿uKÝÓ&û£XÅ"%ÍÈ<ía‹"«ŠõfÕ›?~úûñŸ¿ß<}úÏñËôóéÓ¡:U]5þ9žÿþpÿ mOµ?Ûžtþsüòõðíøíðñðqø÷ÛAu—§Ãàõã„¿}ùõðf|ùaüͧ§?ŸþwÔÇ? ÿûåø×¿ ?~šæ;áëÁöÝùÿÇJ+m‡ÿÜ:þëð—ß–`/óžÿýAU½juÚ:¾ÝU—¿÷¢— k«»¦~¨áªÀñß~f»-ãÔ7J™®1Uô¬FÓ¶½î޽éŽm­½I½½ÅM¥'êšÖˆLtY‘JÛšªžŠ ú®SÍe›z »Dˆ]§J½m”ÌDç©´­M LŽ©Úi›m*Õ?O•:‘®´ÌDç©´­M Lu²6M[õ~&l½­/[7>c£qš)ˆõ@n2hV¤’vvEœ‰} j[›ì«dx]§J¨íz! Ú 8R¶v…<žŠ úÎL»®S7z›*u"[ÉðËŠTÚÖ® ÇS±Aß«‘cë>™ù_§J…˜cþç©´­]AïMõQDÖÏêð·Àƒï>ÞüØŸUÿÏ?˸ØãÏ_Íù?ƒ¢híñóOÇßFÄ»??ÿrPêÔ65íå{ãH{iNÍÀ[&SdQö2bŸ¿ª/¿0§ª¿û³>ÿ¢A¯ÑÞ³ø5wŸíÜ_Œ›èNZYg2<A¢?¸Ócè4‚Ÿ éÇ9ëqçí`5Z¥ÛûY=˜|€_õФ*wÖ¡ÍÇð<1 ÀÅSèC€A>€Ý 7µ WÐ ¢hÆ÷êÓ¸Ò¸]xtã®Uq@ïA þüûЋ‡R#[Óסˆ]¨&ú ûl-ž5ùDïîS¿…Éà“€Áˆiް8˜·s<=>XîŽ}rÆÚ; м&á}…„~Ö' Ç f*tAôFpy+MY”I<+K$z<O2GÚA¯¬#°âJ8­ÞGÐø«ïfõ*(U :~‡à{"d"Ðñѳٵ‰ÑÜl«®,k$<0DÔ¿x…›‚S,äñJRÀ‡ _¾`9ÊK…’#‹Ùq\ ŒÙæ™›î¡j@06ò*þÈôÍÈŽêÚºühÖB§è lñH9üWañ›< E3~’À¾°üÂ#²PŠ÷Aržeä©tAM0NùZq“QKØ ³µ§ø¾^‰ï•dyO vÚº”²ÜÜ3nÀžl_9N¬I¾·×<¼…øÀ‘žøo­aábÞÄ;j"ü„0&D‚Êë¯\ìøæˆÉÌB~Þ9Lj§dZ~‡ÝÈKE‚ZêbJ¨.þ¼û¼‚#„9'„ ÌkDùã6¶s¥Çò }JHq¦¬8ú¬;²3?Â? 9ÁªôO·fO½'ä0|M¡‚¥´žL™(ØóèåŒxÈ!øYÊÐmž|Jh‹‘WCw>NrŽ8AŽ{dqÓ7}´¸¡èßk¿Çíâm“-S|cµ½E aM;eD²Yzu ûÄùžJÌÁe¼qø­'­€’ޏ´0 ¶ÀHÉ@¨kãò˜”T­yÍ—ã´ SñS¿f1ãk#X'˜=Äb‚—Üß–RZ(é{tâgEJ^t:»a(‘£ ,†L33ÆeòÅõI†B° Î0ŸÎ WJ”Dì<%}3@çFW±æ# {`fö,°HM7‹å—™ ¼Mµf^‰¨G®ÐŸLçÄFé¹®˜ˆ3RæùŽê÷¤É9ÿ”+Y’NE2r2J‚óQ$ K˜„€‹„üAN´—ÞeË›/bÍå•+¢W4Eä…ˆh·E/©g4]Óº:‡4 ÉW›rwPÅïoKšÜTÍ«É)†4\‘—É˺ìÉDlR⚥3PR<%E3& ˜·}3tŒ8/Z°¤´²ÎŽ$/5>X·jj‹ü™£îs=ñãèO­á÷pä™þ`DÃg*¸ÕÁ‘Žà÷Ì”|×}Ï ­ç'V~OM_Á2Y[¤÷Ô%1lÛù}ã•blaˆ`œÀóX¦$L—Op6LcxÕ¾ï§/‡{S5›Æ½,¯ÀÜ SÅJð¨ëë[ß|k§vÙ‰­C6!WÌ8Áz$Æ–Ú,è{qþ0cYY£vHJ¼x±‹Œ+È"Þˆˆ‹Ÿ¯'dÆ úl±”Ë&³y ÷ýcƸRÁ³D`9À/ëÉ‹ò̽J™“ ÈɘUçì-c͘Œݸb-j|Ö¥:úk»#@e«Lüq)«qeDe;iUw¼Öèèžhµ\¢Õb ©Ï %…ZÙ|%­3¡­v%9åºK¼ÊF0YRRC’ŽþRÙF"·©(0I¸>ô"R² ˜õ½‚'qœ8åBçËwEp&‘Êi‰jyŽünòEæOe™dÍ9Ž^b€ŒÊ!Z<Á؈蒒rr~›)•AEŠ sj#Ío‹“}çåÒêÌ‹Ef„F¯¯!fÊåƒÌ|Wävþj|YÊ¢eë7$0mV94 ù•”HȰ3ßÏ›£E¹×0ï‹&TàÈLz)6AJÔ)ÈR¤2'cÖÙ_„ý³ê+)­%ËZ_õ¬Ž%seyE&V—~_ª¢«(++Ub5*a—S@sñ5'½`]";ÆîDÑRµï„Ë"¤øDR*)âÅ( “”’“§ÒKÞ›³ù6ìå¦f…×v{E·ÅUƒ¼…ô¶q]W›z?=E´‘M€‹ÝZ%èà G3¥~ jË×éM`”,-=wA¨Êõ|8N6S7ÞcM`yJçÒ 9+ëéÞ‘.²Ý|ò ®GD7{£ðÅ…vNˆƒˆh£„ˆ!tÁÉhä_n(`ÞnÚjaÈh°ŒË- ÷Æú,(ÉdFQ6žBD¢reB_»YR…\¢ž7‘DÜ‹£%½V³$Å’`Ù óÕƒfÝECT¢°eDq­‰Þ9«ÿh‚¨óî犰Fðõä”'<ë«øÄ+Êðz-Ò;ÏÉ“ ˆìýû<Á¾ÕÂo9qÈ.·4¹šæZ6‚Å D—vSÚ^³j¤¦HºÈÒ9'ÛfÈû ܾô²oàꪆo­G¸ž$âOˆHIVøÎZA9b«&G´dKÑÒ¥wûM²¢××ü9¢m!Ò@0ß_$¹¾´Ú` Ï)¸Þ]™+Jù (ÈÚ+»u¤È‹=ÉK»ºLÝÆi­ Ni~¹â2‚ƒ…ÙÅž\F;Ì„ˆWvÊ0U}õëÈb“@1BY"7«v ¥ø•¼muÈŒ÷ “Ê\˜òTÏB`¤ÓL¾,¹Š™.¬ÃýyŠ%æ~PÙ3\1x\ÍÕͯ“kãNô$•b‰ýaP€,ËTSü»„KJt ø€%\„ WƈÏoš¤s”Œ÷àTçÚƒ#üàHΫÏ}ãH—yÅí?HÑÎlsSÙ[Ÿ½ KÕ<ÑŸ)ØRŨªž]Ïš[ªÈ¶@{Uí¶ŒÒ·2éåÚ4ÕìmšîFÚ•ó‡.b;¬ φ›zrÚ`ê[ ·1¥›>]×ßÕƒ`ÉbI§yï¹lÓôgÅa‘ø T³Ý„CÉ\YóoyØ$‹ÏƒÏ”­—rr8NÀøÚ2סeoØK½ ݰÏɺëÚåÝ/0'•(>d‘»^bæVé½ÚÞvCýDㆺ ;  Ó3t§ ëuPO­°¾-ÂÚx­¯ ú##XSÆÏ0VÝâgDµøÀ{0%bˆB'0¤^l–Aª ¬šqJ&u…F‰ÖØZæØ† ø=¢tXž c¶šãx*Œ9<¢~€99„0æ0¬39 쯚Ѧ0àWƒ«ð U1x"æä˜8|tV (¢1ÕU;»ž]cºù/„t¦¢ó€€Ç Ÿ@ †Ÿ£{p$2öy³Ú¨ŠJ DY²φGÖ¢ëæ÷µÖíͽ ›*ͧ Ûúñ™…”ëÔ‹{}—ò•múf“dR|^E@·Ê=R˜Ë2¤S–¸kFS]ïà!›¶H(mÃñæ2¡ãëmr¨’!³¶|òš§b ¡Ù4Ž)qòàVÓ/@µ{ÎÜ*ræu vl€Ó?²wp^ÎoÁû‘ÍÙ`ä­àUcKï§`ÎFS_3ÄVýÜH™•¶{VÙïZyÖic"ÎàžUö"³N+Ÿ6ÿÖ¶²;ˆ‘Ê«à­6;ˆÑ®¶œuJƒh¡‘ k~Œ3£0æQBV¦ÁŠ­á(.à _Ø:)Ã;›kÆU±<뮺m”ÑÕFÖ!ïVF.ð¼¨U•uðàxŽ×s$ægÉÙfd¢õ;Âi!Ú÷6K"o¿s‚:¢@¨DIœÝ};ï¾ÍË{®<¾¾¦¥pÒX†ìÛÜlÄZgk;ù‘ZnÍC«pçKBŽ„x?A€DT…g”%bÕÒÉsAk©> ›.5³DE¨±_è=Ï[é•Ò°ˆ8Œ¿ðH`ÝóaPœÓD âˆ•¼õWï-Ç"8èR%R·Tg…lDÊnÆö:HGy](g¡kݺڲh²&…¨Ê”“ÕórJ®.¾öZÕiŠDÅ4£ ¨"ŠyJ¢ªˆZ*QVy71‹´+S#BÖZ9”<)wDñÖ=‰5D°Xv\oÓ¹ë]È£­“åÌ®jy ?.Uö>SÃK $¯b3Á`K(  QŽ%µXQ¿8~–ÃDqÿ¯×P„N‘ÂD²”-‰\Æ&î‹*a$o©XN‡kFib<­6zNppJh@ö‚+ɘÊ|OJ¯:ƒoí¾Fw³ëádùà$'¬ $FuÙª!œj ?Ãy>œêbKf›æê½*™}lº›÷¤lðœF=;_ ðÕ¢Tjo÷Á^O.ó&y†®ÑRâÆŒ;×Ö·n…KEÏ|µv6üð'g)®¸l…ÌP>hÛ;hÜÀéÉé+ÕKÖYšÃeò9ŠVIdšƒI^ú®uíàËeÖÜW}ZårùG.F13§¸&È­ wްIŽÐ¶Ö¥Y¾M‘Î[k\É\*DoÍ­Ë:Z¯¯¡a JHBvOÊ=Š«Y¢v@«Ò{¾‹ …a„ë)%۵EˆöP² e$C”šÃÇÞÇË#¡3ß´iµËÈ5¿š¥hØ„ŠÎ9åom&Õ{ãd8r.ZàÄ씺”ûHÐóÏJ“”zž2¥ýð ’ ©‘ õpÏžhœÝ0·½qæÞî}ãÖQŽªŽÌ×^ÍîìuV‡ì›½£²GÝBñȸl™áïñÛ€ÊMç/L?¾| àÖ'Šê™(>É"øè,=Ùm<òª÷ª;]Xѱ®œ$ø®;u5°¾9¯«6'ã2êœæÁÈ(Dêú¤û‡×FÚöÔÇÌeÐÞcá3=|f´£>éª>¹äñh¶‘sÞÿæ=üî¤?Øáè™I!~4¢Ð>&žG{fÂeïÓÚ. êΟu«œä=¶§Cúhsô¢ Yn=ÚÑ-ü.~³OsoLص¡æ “JsÏ+ùäñãáÿñs endstream endobj 2344 0 obj 4396 endobj 2347 0 obj << /Type /Page /Parent 2 0 R /Contents 2348 0 R /Resources 2350 0 R /Annots 2351 0 R /MediaBox [0 0 595 842] >> endobj 2350 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2351 0 obj [ ] endobj 2348 0 obj << /Length 2349 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`=")J"˜g€4¦‚‚Ùl‚Ev‘Îò÷#·d›ÔÇG±HÛ²¦iw«ÅGU±^¬Ç»?~ýûþŸ¿íß}üúŸý·ùûǯ»æÐtÍôoüúáòr8(9}ì}æøoÿí—ÝËþe÷´{ÿÙ‰îõÅùÛøð4Å4àoß~ݽ›&ßM¿ùúñÏã§ÿíåþOãO?ïÿú·ñÛóxÇ?øe7˜îøáßÓ!…Æ.?þk÷—ßí—0¼Ž{üÿ!ÕµCÖ:^ίŠ×¯ËWÑdãÚTot·BŽŸõŽÿþc÷Ó8ÚyÓ ÑwmßDÚË×a…Ø›¾ÛK#A½Å %2d#Yz]‘ÈÛšhÚÞ?ôƒ’Ýë6UÓæBì4T6è;ix:®Hämm½g(2è{1LÛÔ¹Tÿ}¨Ü†Ž ôlj¼­@‡¢‚Þ43…)©27z*bFiÎõº"‘·µôž¡È oåÌë›lП†Ê†X7ne ãŠDÞÖN w†zbÑäw=àÅóâ‡çÝ»/¢UÃQíyþi\É«î4}{·«ÇF4¢ÿùÇýï›F´Ø?ÿ¼3mT¯'e«Ä“FÂw:øÎ'øDÁ'_à“ÏœkSÓG“ïÓ÷ƒW ÂN!D=ó@œ¶ð‰œ£y¨ S„„£)ˆÒÚà | …©—2Ú à)ñœz|~à <óÀSBÁ~‡Bñ?øMx‡²Ÿ†—Þ a´él~%hqy8˜ú³ìÔ¹<†)~J LÇk£ÑKÓòÕ Þi!Dl·àö!ø ¡ ÖùçœzV!Jñ4±zÎ(þ1Þò郎ŒFÅ+ xƒð;ÿÆOÈ·ZGŠw9>e‡¼ÏÆ‚7áiÕCާµ¦¯¡;ßäÕ𸮻s­óœÔƒê‡•âüo8š?å¦ß|WªyšƒLZc|L‹çмH9ÖBÙÅ AÐñ!Õ0(q  />Xý‹71ŒwÃE ­7m-©ÁŠF9ê˜é8¯xø —“‡tY1¾´Ø9NíáW¿O¸ºàì›n#ëÏjá(´ÄSiàþ‚ìKƲžìš3E^=Ž¿t¡ Èí´y˜Ö‡Ô"šK¡¢guÎÓ3v*Èçæ4•2·x dŠK¨ëqýBO[½i¥U6‘P²²n£ì£~3þ,VÖr{•±yDx8êßá,Þ̰xfNòì%çAÅà Båsè%¤6m{ûÔ?¶aÙ9 ONG˜¬ÜAxÐÜdԒ⿤/´ ìÛí‘Jé1–Ðö&Ç„à(ëÞR„¹[Náè"®ˆ­DÌ]Õl.‘ë\Á\6w•Ð\1 µ×[ŠAÔ“-Å`¢—>ò÷|I’d´¥l)üйÛƒ~¨žbpu.¿6êÛ’*Rï}&9@MQ5pžŠ ÇC³…Hç­ºfˆô ï%Dzhk†H£ÅÌ&­iÎæâDHKÁ1vCËÙp]rS|Ö([Áèvì­ÝN¼í.p8B8w× ç­%\Æó¥¸ccÆ(ûh¹ÆÌ{{S&@i˜Ùd¦A{çá¹ÆLÜå¯ÿ0éG/!y5C;*šcož¤ÂÜ6ƒI’tŒ„Ì` [w‰(~)í`ØÂ=Kð»•Ä” JX0LÉíd-DqkÝ[Kvà…/ ßP-ÅÒŽ×v<¾”ø¤—ÝätÒIïÇ’ë™Â)GƒÐl'«'•âɨÁØûÆfJëñì÷­ 1Ü͵ÅÔà2ACÍI³¾ò=mI^8ĺv—VDnˆ£|ðZ‡•ëU…k¤$‘P•¯ þ5„7pÏN¦Béôazçðü¤ä5qÞÎÃDsèzñ†žMÄFX “øIÝÛ½ ñT½<©Òk‰§:ï(j )â"ÕbJïßšR&¨R)K÷²L½ÈGèoí‹À:E)ÏØæ€KeSjè‚|êÝq=ho›µb’ŒpÖÑ(m872N%cÝË W½£OIOp¾fÝ1…«ÊQœ6”žï¬×B…{CçxbVZˆ«Âµ¹2ÖyÞ¼’YEw²âx+U7¼ë„#®XcDpg×}8ëÌs£IôÉ)ÿx-ý"%¨…À²Ým1¸-™\3g2^œÛ’A0£ŽªIÌRà‹R-|1âx›Y¢ó8J¶ç„L3G „}ô÷Ñ”Q%Œ%'‡ã|¸lŽ)aUæ\À3Öè+yí [¸¬•ë—UÅRté{JS[»‘”Э¶³)áæ>™ÆŠ[¢¦i"²º¬%Ò§œð fP±ä1Të특êÁzv”Ú\”Šp7‚«âP.=ûá+Æð®ò¹Òûª*ðM¬pÍOXMÈC¥x|êà p;d NxkòÝDeC#DNeĊ<Á8¡pBÖZ´¸R)‰‹ÀJhõ.oóžº^µ2#TN¼ ˆÔÙî¯Óþ\®BÄAx=R´e47<¥âñ=ëgL'ßó¯ êžý@^JªÈNØ)Ö%Hº=Eÿ H[B[¦…õb^Œ€’fNõÊôÝšÒM*õpð},{Bê‡ ­ß^„éj³×6{-Æ^ãÒôõÙ%EׄøÑ:„Rh”¤QâUëŠÅdaøÆíiÕdù·nÂVr`ŸÕŸ5hÔ°²¬Á‹¹÷~0‡?ån¹jroYº­ ³;h¢V2¼P´!ZmT@BIBwiŽÈŸu§¼”LPœš\’óJš*U³}ܰàÒ-Â}¶ºc¡ò" Ñ¿…îx›DD«Ç7}N ŸÚU¶PèrÉŒÃVØÆÄ¼ÞøÊQq{ñ¥ó®×û8,‰(M¸KDŽW*å[)’ÔõüÓò|åÃ=Û†’xHŠ3=Vñ_´º}K/Û­Oå[Ÿñkÿ2¢rDÓñæoß~ñàÖ%Šæ;QÁ¿óRvø½3K“¥'íc'iïÌKÙû¼¶×AuÇÏR‹s3OŒ9ˆíù.­cÒüˆèC–„[‡v¤†‹gv)04c.Ɔ¡Ô,ÔaR¹¸oyâä“û§ÝÿàÚœ® endstream endobj 2349 0 obj 3987 endobj 2353 0 obj [92 /XYZ 40.7999999 234.259999 0] endobj 2354 0 obj [92 /XYZ 40.7999999 234.259999 0] endobj 2355 0 obj << /Type /Annot /Subtype /Link /Rect [221.279999 207.379999 242.399999 215.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 2352 0 obj << /Type /Page /Parent 2 0 R /Contents 2356 0 R /Resources 2358 0 R /Annots 2359 0 R /MediaBox [0 0 595 842] >> endobj 2358 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 2359 0 obj [ 2355 0 R ] endobj 2356 0 obj << /Length 2357 0 R /Filter /FlateDecode >> stream xœí]Io¹¾÷¯ès€)—Ú€ €,Ër Ø@ƒO&Á`<ˆ2‡üýT«ª‘ýqy|dU·Ê,Y¥f‘ooùðç/ÿØÿë÷ý‡Ç/ÿÙ›¿>~ÙÕUÝÖÓŸýáï—?}¥äôm×7•öß¾ï^ö/»çÝóøïËN´¯œ¿Œ¯˜üýÛo»ÓËwÓO¾<þuüî{¹ÿËø¿_ö?þ}üòÓ¼Þá¾ïú¡=|óëôBöã.¿;<ü÷îoØÿ6n¡]÷ðïBˆ¦ëÚ¤}¼œ>*^ÿ^~½lÜ›t'÷BÈñûfÇÿ¹ûy\í´jÐBt­îêàUëËJ±ÆÈZY‹Zg [J¤.ÔJųÐaG"íh¢Ö{)2è»n˜A?¤ô¸T2þãYè°#‘v´#èñRDÐëºVýë1›.íœç•6.4h¦…Ɖ¤“M€w¬D†»Ð Ü+%ƒKÖ,RkÚÜáJd¸ËFN¢F'þ¸T2¼ôÀÄ9‡‰´£!—"ƒ¾kÛ×c*ekíȃ—J…˜\4Ø‘H;ÚôÖRÏ,Æ—<_/Ž~üºûðYèƒÀk÷_wòj°N_¾ŽÇmÆÿŒV@?>ýiÿÇzäÑ?í¿þ²ªfP]3Y¸¾'r@OêÏðÉ|ÒÇ?Á{S-a„÷||}òôuÄonl5u“€-Ê“ZAÜ$@S¤$é‚—º0ä)O„¯€8‘÷2~59µ[9oiµ<2ó0ä Œ-î)—¢ |”I¥NŠyFá'CAZnåj¨ÏA/ŸV«^ÜüÚÚØÃ[ðJ]O¯lŽ qVúÒ.Ødù½Ék]UËKŸAuV>=þ~ý«Ö{'±#äñ8!›€€óèF4½Åå…·b3çéÊñÇíšè¯„ÊÙi+)zíBrPõ`†ùƒªÆjd'Z¿*§ÅšJÉ^Èær‹µù‹3T<{9°eËz_ >S6).‡‰’÷ZHãú~5ቀ^7³OyO!áÇ Ñû‹ÇK$ôQ~0D<Ïò>”׳Ȩ;m3 µ‰pmSM׎NGcãùBàr¨ÖÔ0Ð{B›wØ–6pkqè ðŸœÑGÈȃ2ÕõÌ©fYLòÉü,¶àðª(M€9V¥ø2 l /‚9 o–-Öí˜Ùsí‡ù•zÚŒU£ÛÃiMÕÚ› ¼ÆºŸÑ‰t~‰Ý'²åó€Žè ¹wÖ”ÂÙk¼ ñ ñ"¡E!U8¶„µ'~‚W W~ïJtVȪœ[ÜE Rå׫j0E/‰Î,¹`)gKú`Ú ‡œV>+8©L­¯ú¡~k[ÏÞˆhŽ«œŸ<@ñð*;KúDPUÄù0Sˆ6A*È ÂS"winQÖ8 qû5^+Ö¡Æ(¸ïÃ÷á«äaHl9ðZ(ïÆ"Ê®yúã ÙÙDç#ìÄjÑYž‹M±ˆe!Hƒ›´ÛÂwd3´ìžáìëvuç5ùq$ì"úÜxžaµiðœØä!..³‹hó™Ÿi!räg±PKÙæ†eÝøbe9omðUŠ:¡¸á9D oß^ø7¯H¾²X)÷%°ƒ=‚”ˆJÛl›WÔl\·×Ýgp £Îh[E×1¹m¥.P:}̘¼— ”ó‰l&µ¥ÔÞRQ¬\ð‹-Ë/H$QÀ¡mxïíà Ú+…7Q% ’# êpͬcaB þ€EÁCèæ a°˜ˆ%ØÍšM²†B©¬¥Â„„sò²º%8Ø–$©Ãºx€<"Ã;"@®´(åŽå!m$gÀ÷)ë6–rW€¯Ç¡–L±1üÊߟóâpº#k„C×ÎYoZ´©ŠÂ}Jt:%QÄ¥ž½’kHõ[~3ÛáÌš’:Á’‚ܚÍñ~OJó¨I!„‰t!NIâ<«=Pürä.,¿€Ñ3H®d÷¤BêÙamXÞáŠÙé9ÐDcˆ GÅ’þ c”Ëò°ìo¶­ßz‰¨«qŸRB ™¬„,¹,Т(“OeÔ2Á‚ÔO\Lê¯gu"®®ÂUi°&ßQG†ßƒ»MÀàž5ŽÎ)¸ûoµå*º­ô*¥ëÂûé;U²‹DßÐâMâ„—»òe¼Õ xܺ„%@¾ïKCWSûžÈpºô.¬qõ=¦E(™òÖ};öFé<È«i|Y°vZew)…4ñOXx Ø`P)JL£XïayIØ5…±U»f=.!¬%ìú‘…ƒËHo™Òö.õ™NéÀºŽnqC«ßî'wx^d‡Iò C8 šc²m"Z;òlî`²äáð^`f ñ;ЇÕ„¾/e)•àÀRLà>âþƒ’¼PŸ¹”rJE/é.ž¥¡A‚ôЏ ò&;åûº3ä~Ä}‹ƒhy»nàz¥ð.S5‹%ñ” ÝïŽ]ÜŒÜáì‹ó^8šKÜzÞÐ=vÄK]P –rÚH{Û‚E¥ƒEùQboÎF¼³a[wyÚr&Ç9@n9Ù—îYZ'P Oî»ïÇVa³UØ”-—´¡!VX_»Xª?kä*%t+½IØü½•Þ¬ !mÝ)~½yµ›W{¦ËÍ«-çÕrpz£Ý¥´—¬>Û†q çìAK¶[8×f0%Ùû‰HuÌ'VÓ‚FB¬ß_‚œt‡5+‡ÙÃÚ舧WÃzZ¶Ý©ñÆâ†®·Î3©%kp-"¼x Œ,£}¢i UAºNòúM¥ºÖ-%¹íŒ‘âí#8ºöfjf¡×¼UüèEb²?];m1‚-Fpæ²-F°Ý|ÇSïâOxË$jŒJá ûˆOйÓ¤QÇI1ŸxÁQØ&Êé6UŸRÆ7ݶé¶M·­D·-O·©]ïM·Ý¥Î‘ª°–Øš€”lT0bXKÿ¹o²áÄ­6qÒÞkc–勇‹òV_Ü_Üš€LŠ·_YuÑ´®µ(ÞeóÞŸP†–Uñ†6kçî&¥IÄZ"Œgèš·ûÉ=EG×<©‰É0 ™¢3s”PÇëdzìv²ÂÊ'€£xÄ|i|å´ËãÏ´ð þ Ü›´`1ÑÇEGÝ[ŸF$ºÖ û&÷<ãzÝ#’ RÊnezQz ¤dm%tY&+Xwæf†€ßxô½–’Ô˜j‘3QHi“I#ò˜J[HÌJɉHöáHåäM!bIhÄ)DþVà˜h­ôBM¥g럷<K6–¾)ƒZn;÷1 ?Ná9E”‘}y¦Á³ 2ž´r¼i”© ËOñJ$¼Ï¢Ñ€’KÝGM'TìÇÈœ²3y µðêÌü•3> ­(·ç]$s'<·ø ,ËÌíqÙß×ÜÞËÙVOáÖ/ÙD¡4ë|5ý÷ÚÆ„eŽ{B´ÄlÊÄÌz¬½†—åm„h„Ìz„ˆ °ìߋ僗'ÂYšµ1yÀÜr|Ã]´T?ç0ßNâ(âÞ*s©¿?š~ƒfIHã‚Ú „Fš²4e"CžqÞl$)v+òшÖÒ 4ÈÓ¬#Ül° 31› —¿p^Xõçt˜:eh™Ì#ã1­b•Åyu4\ƒ‚œ2[uÌà—§lïzúc’š®ºÆx"Ðg$|BYí˜zå3úHÛm'Þ˜j¦úºš®‰.V›%o¥g|‡¼§F«ÍÐUÊÌVœ3®}F“>½QvÝÍ„­^ /h5¼·YŽ\[íwkæQˆž.-Õ ­t+GMáV‹vïN¢} ãMí.^À•¹v²GÖÖkWrkš¦ÙÌy£A*h©šÅ“=b RÝTD›/ Úgpêc§ãí!S‹“˜¦ u FåJžb"¤Ü«†g™8<Õˆ¹ó…R ¢KÍõ.>ÝØ2½ÍcPŸ¬¬ímC0ßDÈô‰ .þÆöÝ©z nÄ#$#1(cÅ(ƒ/#õ\m- ÁQ»¦ ˆTp4„ÄÐð¤Ì9ÆØá±”ñ#x5’†Àà±Cxx¼§Ìá°]rXG'äi+æôk»Æ{ÃÜ„1‡Ÿ`Ìa Á|vË\7Žˆutê½q°CPFÂ]óŽ‚u ÎÃÜH.JV†mC Um¶î øÇkë–±#΃˶Ã7j{¬cØj.Æ£ŒþÛ¨ï•Ðå)•°Ô°Ê5€^ÞÞ^U B¦Šµ0TÊ úÛ{:4)ÃÞùF¥ì´KÂæaï.â&KÇ¿û—‘Gâ:üÂüåÛ÷¨¾ -!žÄìü¨¿[»ã1®6ùm5udRõ©:`î³ÕVíõŒ¿AWd,äÈ®ê®çÉtWžLa¥*9\mrß4U;]r™ÂûÚ{zø™~f"‚NV²Vo¦ÏJøÚjQ_þäüÝùzùÊ ?£ÏÌÎמtŽùÆ1î33ÆbÎ>ï함îð½lD÷–I£°=3éµ=bÌA:ˆ0dI¸µhG6ðwñ›m ô½1c}ߊ jê0°/ªÏŸ9åäþy÷;ôOF endstream endobj 2357 0 obj 4079 endobj 2361 0 obj [93 /XYZ 32.1599999 423.379999 0] endobj 2362 0 obj [93 /XYZ 33.1199999 421.459999 0] endobj 2360 0 obj << /Type /Page /Parent 2 0 R /Contents 2363 0 R /Resources 2365 0 R /Annots 2366 0 R /MediaBox [0 0 595 842] >> endobj 2365 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2366 0 obj [ ] endobj 2363 0 obj << /Length 2364 0 R /Filter /FlateDecode >> stream xœí]ßoã¸~÷_áç爒€¢À%›-ЇÁèCчb¯×âÐ=4½‡þû•,Ù‰I¤8Q²ÃØxM›"g†3ÙáÇOüú÷ý?ÛzüúŸý·éïã×]u¨L5þì‡ßÞ¿!Ûƒ’ã˦­²~öß¾ï^÷¯»çÝsÿïëN˜ã§?}ãéc‡¿}ûu÷i|øn|çëãŸûWÿÛËýŸúÿý²ÿëßú??Mý ø¾k;3¼ø÷øBH!Ûþ?ï_ ÿÚýåwû_û!´Ç~‡B6]¥“Æñzþª8þ¾ÿ*zX?6]um»ïßë_×=9þûÝÏ}oça:-DctSÍC·1û®1{¥ÜN¹ÍëJ$v$D%X::ŽH¤MMTºñwuhltÝ3¾Ž˜z3N½I对§dnHÍÅÖfÍ”™MÌÀ=Z­„jd­‡%1,‡ºmeÿºQÓOÄx•0L¼8õ”LBÕ11u/`OT•$´'){uœ8ÍSWÉô2½öeéh‘H›Ú‰ò¸«^õL?ðõœµÃSšaÖý#{SÆÆá¶׃ì'’HÏSW©Œ‘BI#iS;qwE%½”“m•mJ1Éd¦¥îÇÂÒÑ0"‘6µ‰ônWÏ,¾ |ó_=_|xÙ}ú"´j×÷åç~$GÿyüóÒO·îÿ£EUÉýËOûßW•ÐØ¿ü²ëu§šzt¸—h‘j©¾À–'ØÒƷ౩ao„Qãï<Æ6ööôÒËÑâR!Ef©¨rKŠèeæíá÷gØÒeœwÝ¥Ï!ÏH›–ý©x¤®Ž þ$Š#KD}¨F¼ i}lÑ=Òæ]‹F-rìöí£ÆzCTö'`g“®Ñ¤çÊãÍiVN¯ËrvˆU\ÒYÔ}¥âÍ 6RÂ,-\¢dKºlÊqõAÉVÈ qƒ˜—P \1{а3zaK³gPž§â'ŠG0Iܬ51~Ô¤hC$€È§àÚ‘³öÒcçX᪮-YWØÂN“-X+`—Þå×~¿k­}­lž:ÚáK¼ùpú=a!µ6ƒ4Gt&¸˜ñs†ž/Ü똼YZØ¡& lq:ñð+P{~.ç³ÞcB°qÌ9V’}€j:B’)¦„2¿ù¹ŠBÎ7ëØrE,2gq'¬-Wøñb»]·ÕmþòF 4emg›v—QÐSóèKŠû…[8œ9×eýr*L ÇEôP {¾8¤ðhÐE íd2ìýësˆ,B›²ÌÛ<Çí£)—'òçv‘<[K‚/±ŒsHÒ5ÁÕêúxµÎŸ–fïp@MVúÒm¿'Á]ÂþÊ©&Í8Æ)8ŸC ûâÀ]®§…h Œº†]?q‚ÇæI:`.’GX®%…’0jÂú‘séÅ´Æ‘LkÅ\ÀÏa•Ïpo˜s‚0üÌ9B<Ì£G±Á:Ò€™s˜Öxlx>ŠzfŠGMHt{"™pÔ½ƒ©C‘*‚NÄ:ËEýƒ<¾”TÅ—zó¥ðØ>Œ/¥«øç`þ(¬0uàL=ëŒ`)Þs‘«£P”äGàÞpË-ûîËmdÓ\2q±‚ÛI‹Ê¦Õ‡(º¨[[Bî«è"w|/"œE¬¥‘ƒï'Õ¢„£Þî4ÕBÊ@gЧ3­±8ãY8îõKg­%ç n cÄdŸq¼=ü˜eTNRI›hŽÆ_æá %õAWgÂã^PTÓˆ ÉRN‚Òù®“ÏÀÓÂ9%JÉ…#À”º>ʃlØ4™Ê¬¯­Ôù®ALqlq ºœEš$§px|!¬3¢5Ñ‚Š¹q³G¼Â…-”ú¬îuD©h®ôœå,¤È#_¬U?'N4×ŽŽ£T€Ó ŸÕ«­Ž"œŽ_/¥ö-h 3Ä:žH5XÄÍþhÎz¥OG‰ŽðãìÌ‘"¶8N8ˆ†çÛ!óÌÇ$ñð^vñBR®é&¹°eZKBÖ“”{&ä‹vÙ¶\oY»(¶VXÞ2ÇU¦½S)÷Œ’½ÃéÜB¨ÂÕ[–r å­Z [¦u±¡E»Ü£vY׆våÃÛé‘ãfÅFp”m‘,%k|˲±xó!*ÚÚšõU¸Q}ç –0a,%æ,PB¦5%“’>9ì‡ùŠ3ž ö qzI› ”­x"N|‘t…˜Ä$)ƒåÈ*þ("˜4f]F.O©RA AaòÖ_DTÊ|”ä8ů§™Ú®2³§e"•sJ”@éˆã9HD‘Ù˜ÿaçñNaYð2ró±Pvf Ká‰G˜B«Ò8»ˆêŽ >0J—; ›”ó˜NH²2줵Ž»@l: âk#˜• ±-Å”=/‹ç”`%fT1ž¢¿©/]—cu*¿o$Ãûãù…Z)+/F=åñÍcö¹ã;8”øy„Ídx7+2beëN_$.•›\?úGÛ@]¯… އ’,Òç¥Á†Ke6"—*÷¤d)!^c¹$@gPÆæ‘ø¬Is–"Õuî;"< p!‚5ð” ¤(úÒ#xоn½Ü­n’ä%ãíu›rOF±Ý÷W¢³ Ûmª6E.‹í¾KÛmd“Y*Šíþh¶Ûh“"/m·15ûSÑ#§äI#ºKÅs- ?. 'j'Ô)Œö&?Óño7-œƒá£@] (N)á+ñÃv¿c` þ›th1J²sÛÁ:âÇL;ñkùrÍ%øÚ'c‰FR,?¡üc=´†û*€$]¤q탈gLKÏJþEàÛ‡sŒ”º¡üpZ9‹?åô»@úÚ{÷#¤úc\)!mÆØ‰J妹Ÿ`±ÎR_ÕÁbä‚i.ט6õÍÛ¨>;iw:ëKÓP4Ž)ŸLЀ\ Ì³e{0ÿú’w“:yÿÀÉUè]{ü°m}Ía2!³úÿ&´$+šÊâÅd¶›Ó”æÐ Óar™®ÍÖ@ 9t¦ŒI<¡';b‚»Ÿ¢wCÁò å´ïp½3‚ܸ°ˆ0e>v»O~„âzòòeW­8…Ý=øTNDDùÄ27"Eί5áAXK©§Ÿï]̸Ð:’)Ø/n5t{^#¶QZ­6j™‚Jí¿S”·Èi¦˜/’BiÊéGÂ>ãnJÒuÝYªúþ¹º9ô0Oâ"·_Rê=ݧÓq?¡œ?K9¹5Å×f] »t]„Â-L9ht§·Ü‰²^ós (¢f=Å[\Ü&uÊÞ>ðT{GènÈÃøë=¯YG‚€»®x »Ú/t˰Ÿ”]X´)§[)VÓ3$Ž#•¤y¥œ^Û‘òXp´säÂõgñ/\B°­)é(–­óB4a;` $-y!ÃiovV{1'R#àB‚©*Ê!»¤31øíìrXRχ^g¹¿<Âu)„ !á÷žo*€;ö'¨:ßœ}g>hå‹Êæƒ*ÜÛMR§†r­áú©¡\K¬…6ì»ÎåÛ¥ÖGÑâÑÒfêñ~ðpœ øº)¾n°Î z\ZJKi)-¥åÖ[˜½ÓÕ£5ëÖ}̰Õ]œÝºeõ}è&.3‘ý0Ö°g…w~Xư¼Öc®=»‚û;{Ëxi„¬Tʈ¤«üð>¯-мƆcŠ” fð|Öncžâü9Ž)z$„rÍ䎖xt !ŽÂ©Þˆ.¯s_*¹þD÷Vs’`gòÈX“rEåF,b·åD5£bïÞ¬-^O¬ú—××+ùÚ’¯å—*ì[ñé>ÿa")Ìi+à9¨9’cÖÕD°ÞÞ=ã¼UÈs^#\f|œT 墅èçœ~9Ï gwHg—9+Äq½3X þlÌ8¤” ³:ŒÅG@‰ˆA2\ÂcÑ›´­ËW;dÄ I}‰Q7}3Ky!æKÄ;–|óA]3ì:[–Í÷¿Rì/„*„!þ–=¬Ír•àB`>X u –Ú-"<…ý79¾1\ƒÙˆK[³,öS†ûŒ¶5VBàÈ3“„+:SF7µ“p—¾¸1Ì<)ˆÆ‰ÅxI9íBL,Ø&F€\&ÀŠÞëgñ7¤T纩RM·üÎ6*0dRkuo§h×Gr)˜(Üõ)¥´P[ÊyTßš+çQi3-+^/  ¬Î/laEÊ&¥¢÷ÞüÉõQYJ½œ¯¥à›ÎåÜqÒGÑâOÒfZðMЧÉïinüt¸”]Ò¹ž;ó4=²Lh)žæ¶ý•Ûô4oÓg[? Y"—^ ËëÍåõh³XJ%ÎRžñô¨Òm˜w%ß¼±åÌ7+“‚¿WÐ[¶Þ¢Z“b·îí> endobj 2373 0 obj << /Type /Annot /Subtype /Link /Rect [193.439999 298.579999 306.720000 306.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 2374 0 obj << /Type /Annot /Subtype /Link /Rect [64.7999999 227.540000 123.359999 235.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23throws_typemap >> endobj 2367 0 obj << /Type /Page /Parent 2 0 R /Contents 2375 0 R /Resources 2377 0 R /Annots 2378 0 R /MediaBox [0 0 595 842] >> endobj 2377 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2378 0 obj [ 2372 0 R 2373 0 R 2374 0 R ] endobj 2375 0 obj << /Length 2376 0 R /Filter /FlateDecode >> stream xœí]I㸾ûWø`Üâ"‘‚][€º9=™ƒéA*sÈßlÉK‘þ¸<.’]êºÜf‰"ßηñÓŸ¿ücû¯ß·Ÿ¿ügûmúùøeÓìš®ÿl÷¸ü‚ëàãG¥Ûï÷¶ß¾oÞ¶o›×ÍëðïÛ†u‡§Ãàñã„¿ûmói|ùfüæËã_‡OÿÛòí_†ÿý²ýñïߦùö¿ð}£ûnÿá×ñãŒëá?—ŸöƒÿÞüíÛ߆%èüû`L6àIëx;=Ê/E/Ö&yÛÈ-c|øÜàøï?7?³–±ë%cª“ª žUñô­ÚöªÛŠŽY“Z{ ›*y¢žešh¿"–¶5ÖHåžj§»éüò"}ع°7¼r ›\ ïFhöM"<ÏS¥NÄY›g¢ýŠXÚÖ& ;¦Úi)˜P¼•{4ìQÐj͇ÏJLb¶®å¸õá©T(§JH²\xVÄÒ¶vDž*#ɶçÙNq6ŠÔÖ–Ó‘ðÓÛ¯?mÿ8,ãñOÛ¯¿lÛµ²Óª=üÞa¤é#úü…<|!wÃÛÉö™FøaDíš~:ŒÓË€I¸2ÞÇð¬x%ãûž¿0Oƒà€G €Èa@‘kïw­¹TïH†¥"d³ÆÞ¯ÓB³l}± #ÝŽ3íú‰Ûâ²ÖÌF’åÇßM£ž±Ò^IØ„s„χ‘v8zh6˜Ô4Þl!²¢Úû†+Æ=…NY.r ™x\ÃÅp²48œB»&î&¡u…DXÎјÎ,Zñò ïà†­É0l,ÎŽ  8kf2¦¨ßð;ÄЋ 8Yt„–|ð‹”,B5œÖ,êw0 ±m/€›¯±Þ‹i¾󣃹0㤠-…#,KŠa·XøsìZ ê Í•©3¤cáXA.†¼Êè Š`vP ¥y°$É«+fbFü«Bú^¡3Œœ`ް‡Òìz<± u„ʸ¨~§º¶{G™eT[Œ ˆUŒ9 ÿ<2À¿F‡}“@’ˆ«,³Æp$UÃp 7Å’^S\ñ®7XBŽ[câH½!b<ÂÜÌkÇ[膚3F¼¥Û®ÓENÌ*œ"7"áÂÇZšƒ Ã¥Is{ÏGùÔ”Ã-ªÚ‘-ûÓ[õ¤©,ßçÄ–×FžÐëà3ø="~¼_Á¤ˆ®4Ë]›¨H]Óûa…Wú¿og›8)ŠÆ~¸ùŸi! >/Ã\'`8/U4¾ ç•Vò½ÀÏPFuì”0‚w*)kƒ\‹w*°¼¬D£ó4P¢àÇlX CX7˜O±\Ç+€<ç QH;X£6Œ ‘°6z h£¼X€ï¡ìÔS¼S,{ñ~°$ÇkÖA/l.lôO^«B˜³v\Þw¤Ž%#•wðTq¥]·ZÕ…¬jg›ýL×`,À‘ÂZB:h¡®åíXó4¢Ûõ4ðl£'Hé;¬ü\ïܵžF\]O#´:,W¼¨ù+XÏ)蜒à«bã¨F®6N’“·c6ÎmZ ó{OW«“OóÚum©:2š‹y[Ñ—¤$Ÿã­º¶6X³–Ÿ- ú”lçc¹ˆi Ó Á¦¬¥‡”ÌÎ&*úØ5KÉ øšÚó…^kþf‡~ÃçWlïÎn‹;¼÷˜Ÿ)¼|®„XÀþ‡¬!X@÷˜¤EJ4d5QìU¬+ ‘¨{Ë£IÐ3uh¬MŠƒ.C#ªvÈõG’÷soÚóSVù›×Ö£pçüç Jdkã»FjÅñóÉ>½åòjvA}wtY%VyvDt¸ÈÑ"…ÔÆ¡…˜-R§M*ý³P\¦ D—æ†ï¤! Õ¥}Ý&'TP9fJÃzŸ«’¢»å¦ìŽèË”·¡–>YûoET¾ßY'’,ã²4©ŠhccwÀP‹ØpB—%[¼cÜ—Q'^Å4ËÊÄþ&dÑ w1 4 Øh…ÔåƒÏ,Ó#;Ý7]bW¡’}Ÿzaê—hŽ"ŸsÁÅë M{Œ:/9‚ÌðÚpàˆ!£Gî}M¯n÷g–a(;É#\‹‚£LØ·Š±E¨_™”KˆˆÚµK ŒqzGê@¤­žé<{ ™DÙXa??îG‘5ºìÈÚ§h'J¶÷ìšÓ›]‡›TJNê]Ê—ÞÈ}-Š!óžË“BüŒŽ yNÞþÓì]x'¥ù¢Íê"‰‰¦.æ€Xæ@ãW-Xw'©4ËÀÃD!@r»ºË!´!uäÅ-`µÝëB¶ÆjÄ1'Ó²&nÊžºÝ¸dP!!ÍÂh’#Çîï³eU>—Oþ€Æž < §ˆF«ÙåsD4öK0Œ ]Q¦ˆLTÊ…ŒÉΜ=ß7åð—”Äþ¬- )æ&Ë›" ”“-V?I.Ê„ŒuJÛ%‡£5Ü ÍšŠ7¼ÖJ…cò©Yù-[kµ<SÊ,§åˆ6ØðV‚]p`;JŒ¬R†xB-_òŠû¦ZÑêcA*í¦Zë›sSíņ\ Ÿ–=Ñ-Ûq±,~Ï‹g|zXYçcÇ !Ô1x¬Oõ‘Ü:$^v‹gq,’^µKo;~gÎªåø™Ã‹àÖŽå ð6&$/ò®Ì~³a8/Õv¯®÷sTÈ,ÓÂPë©.%OÜ$¤u;ÄÁíER†÷*Ô·/!ßr°ŽÉìÄ’+<œ¿êÄùubBa_…D4.MåqOjwõt¦ÂQ7_¦®¤ÔoFd)Ͱž%ÝÆÑdŽ1e@UÀþ‰Ž{aqO4ØCÌ1ìÆèèÈWœüX/Mú‹P‘XÌQ¤–b DüF,ÎÌÒ¯dÆ»¿¸ê d’²LÃKÓ )nà†¼ÍÎÊbÔ›"> &/"mkü¼gÁ”Ú¿Õ2\-CµG$l/µk^áÖ¿SÕÏj•ù¹nôj•sI[F‘•åšž‰•kœ9½u–.RUÓô Z8Wp5œ/0ÁªŸÐgh™Ý¤”26½v“ ØônRØy«1PÔÛKõýå³´—ê{“Yx›dœ.§Ø³²Ð,t)÷z|[o$}™\AÞ6­!—n2š}¼¸"®²çN™fãzþ¦¦4mÍÛ>µÇt°Š0",ž„úy ñÜ`¤Y:<‹¦OXGÊ„Z¿{¥ÈÊø¼¢¥‚7âTw³¼·êø”ÌÚ·@çÉú«Ä3³ŸØ³tÆ_È¥ö%ä0nÈ‚Z*2à*ñ¹¼.”¼LJi‹­†#. ‰ "Üû’ÂjYR²$Yã5&ÄÙ«‰0ºXf!+ÈIV"ÐQ¼¡ÆrôXDoa,ÏüɪX®Õo^ª:mh«Bë¹÷–¿µ<±tÃnÐò'CÕ0¿ø^cCÀï…~ –ÉYl±êŠ«ÛÞÿŽÛ¬VÄ S; =Ë-CÍeÙ' ÷?/çÖã2G™¼ÖøwÝÑZÔR#þ/"&›Ý£i™Z”#aD‡ãÞ[‘KÞ»’°ÇüÕI€Q‘Ù ¼×b¶pGsá{&WÔµ8ká{p ÂÇ“ñڄ㌠7ˆGL®ÍïÇûi!æÇœpã¯?óä™­§+á…Õmrºƒþñ¦¼SLËpÕ ÞÏÇ‘iË ÿž¯ôŸDÿ‚°ê•þ—Bÿš±•þÓä?^Vú_ ý ?DVúw=#q¶íJÿ˧ÿNßzËyÛQç¸ùyŸ„è’e¶)ûiTÎ|jwð&–(:x„ ¦xÌs?tŸF)¤O ¼W)TÏÓuoœiÇ7ˆí¥óLÏ[?-S ‚í`Lc•èÅkÕ¼"Äç?»­gÑeïû—os?Ø_&ׇ¿Û·A€nJk¶Óoߣš]´zu*ç£þ[åº-¶q­¨­gÝî’¶ÍÉœAÓu»îzçœ^îFÈ\ŒŒ¢…«ºÞ°X]Y^ˆï¯&ö¶í®LãéÚ{4|¦‡ÏŒåŠïx#Þß,þgIêò›'ø»S] g¦¼Ík# ícÊ‹{fÂXÌÞ§µ êöŸùùq†1±=9'®­QÆÓøŒ(žK Û6þ!.9^e ¼Dí™YûÀ«Å;´¡×?FãölÏ_—Ö¯> endobj 2386 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2387 0 obj [ ] endobj 2384 0 obj << /Length 2385 0 R /Filter /FlateDecode >> stream xœí]I¹¾ëWè`äâV p/C€† ääx2 ™A:sÈßOIª’ºI}\©*µlÀÝU,òñí?ýñëß·ÿümûéñë¶ß§Ÿ_7Í®i›ãŸíþïo?ýNÉã¯]ovrØÿÙ~ÿeóº}ݼl^Æ_7¢=<8ýçW'üíû¯›OÇ—oŽŸ|}üóøÛÿ¶rû§ñ?oÿú·ñÇÓ|û/ü²é‡vÿË¿¿)d?þçíoûÁmþò»í¯ãúüûÂHÑæ­ãõô¨8ü}û(zÙ¸6­9þûÌŽÿþcóÓ8Ûi»A ѵºk¢gíä8­ê¤Ø]»UÆÔÙ[ÜT"s"ÝŒ“pLtX‘ÈÛšhtçŸj×·Óø{Ì‹úýÎe§ÆCnôˆ7\'¬ÕˆÕ{h&÷\晲XKÉ3Ñ~E"kgÓùâ™v½Vb<~£÷g°‡¿é{9þÞ©éOÂzVLg1Ï” ÂVu<íWÄsp&NR뺎Ôúv8ÀrÄ‘\hÎSå‹1¢ìW$ò¶6°3Õ ‹ •gAûêyðáÛæÓ—‘¥÷{½âÛOãJÊÉñÇ·q»füÏ(…”Þ~ûqûû¦úÛo?o†TgŽÚL‰‘¦#<aX"FMoUOh=jàZÏ£›ÃbDÓM¯ÔGô»~hZiÞ§=Žœ?x>|`FÕ³ï¿úxÑçŽÇ¤wú¸ÃóWegÏ*t»Æ9Ç §3ØQbËaã+Q-|æŽ<ÂÙÑ¥±Mô­]S„8| äŒ*1ˆ‘€]6 û­lܵ—(?—(vF·ýøFÏë ZY£ÐnÜIj‚Ï £ð¬ PÄ”oƒË=úøÅË/öŠÏÄþê$]R£™¹0óþÎ#Ÿ!8Ð+)Zc«ç,!LE—>âb†}^ O {0âYPneÒ/~q'q¾‘@ƒçô(á šþ0Òî¤èð”m4; ê,eµ‹¶M‰!]„{F°âŸ‘¦4'éä`k™€Ö¼Gë|iÐW²8ô›§HÞ\x/lmÑ#€àx@Q“,WBà÷±vÉÈ^«ÖP_x°¡ü@›èÉœ…¨Ùѵ¦U\B8PÁÉ ÛÅ¡÷šðïjê7°«_9@êôqÏÙ/ÜÓ„HB*Í@¢±¡mJî¦@ ß«{ c^ü¿4l²0ÇÍàPøºIC‘e’T Â5EW‚¯ñL‚MÿWC<ÔÁ>ÀÇvö$;4ÊR¸j¥MáKNVƒÜÇÃc ¿¸fÛ¨Yp_\^ÐŒ¾{ÒÎŒY]'i§š·Çµ’ð.*9ð¬vޤk@,3íC[K°é+Aý&L=w[ðØSpo®ÕCF„ jC΀c„ôÇBÒâ¼`ðˆ§]”UYgÛXNž„:³‚z©§ éêûQÐ._ç~$´(‚û)‹Ë²[2kQZ<ïk{­]Ö&‡Ð%$ÁíŒÅ%Gˆ(§î‡ÇM¹^W£6ƒ…wWãeHÕZº1W#^‰ë„tlÑx:S«–ñÇÖNBŠÏ³ ÛNÙX…·”áà%9 Ü"î’2Ö±Cé¤ò Œ¢äÝá%…l§ÊõLƒ´É+ G°Øí"´ KæJ9 ¼–g…ÓÊÇÌ¥˜ÓöÖí]/k»§›½™õ˜ï#š]Û‰w¤¡f£räïãPxäø?ï¹íÅw}¹í%µ,N}ÏT[|¦Z¿•úbbÐQ‘íœu8iáBÚ«jÏ«zr¾â>4ØMñ|½³“ðçHÿùa¡&-túªcØ µSGpžGÄtVCoLY{I¡‰ çgáȬeºØél ¿ØÙ˜óðäÉ–ÒY^õDb˜ßx^ŠAÐÉ€Ay•O5§0(N!a$jMO«îN­”3µs»$?_æ`od©c9Ûß¶~Ê|$ɪu†–LÐ7‚j1b¡%˜ÀAÕUžýû8± ”ÝtÏ~p¢ð«.{?ËàÃ0¿•’Ó‰u|ÈqÚ‰ËñÙf['¾Ü9±ãÒh tî¼sÙû!Ü$ üÀ|þ(”Å«ÉT»ÙHŸ¯Y‚E( g—™ˆö]eBw9¶n©„H“ãNˆ0dT\ßHŒ¥Èm?)уÚ1Ìœð*ks_BÌÛÅ9JàœB±†‰ƒ7îUL壩í`ñöBY´×êÙR¨©C||ß=TJ‰!<Q…I(K¹„l}Ù¬Qæà½wî)M ý_X[RK»r&ËÉr¸~YÒƒiR†Û/^1_{hÛhYR­-¬îæ˜?%¥%Åtg¼ R»EK+)Íi(²ˆ¤:Û!dåóôæŠ/LH`í"‹RŠg2ÚnÃ2¸˜J@Z¸/kh“¬X¶ÊOÑ)lïH[,°µyñ¾¶µ_ÛèTÁgdìˆêO¥e³½ Ž„îƒá^”Üøئ$•ü²9!ÖóLy/¥Æ.ç€Êÿ*™ã¶Ì}.,yë9þ"ý4-À(ñ¾2ó’’­7Aƒƒ&.Mnfs ‡6ÊÖÌ¥†zFE WHñAF‰Q’¡”¦‚!ÜÏÉ'7Òš4Â¥´òÂÏ:¡-€òçnäÉ=í)œ3,UÖh±êt«*Nâ´Ýò"%W«„Œ—~µ*„×DSÎZãÕwO„(Ù±E~˜…çßW4J«-^îi˜h(½/9î àaB‹é´NÁk­ç0X¯"tpC‘e¢i”¦ì+MM7·,’0‘2‚³'=õ ¸·8äÍô¦T áêº' y¯M‰üç:Ø7˜ù­¸v WàŒcB>¶†ÏhˆåžŠGxöxmëñÔmCxN{ÁÔžUS°?³àû›[õò÷S…·âÔ”÷µí©1ιdͰçè^EÊæ&¯eô'<›ÒÏ%ÁKJ1Šp.‡¹”kä8”þd èx«)î•ú,³¬1Ë×vm¥—ð”Æ‘Þù‰S¡Sd`FLŸ§/düµ.,¡U<‚JbŠs£œ´ Š%LR©âÅ˪ ¤¸U wDdõÚ&$õÔ¾ƒ*:¼d*Í ,9“PœÃs!S˜x‚ø"hÕR ºF΋©Tî§Ç-wÇ-¹d‘AÜ»:3(è•S^ QŠYâ7œ’êIÐtR )X)ŠÍ‹§ÏÉ9¬~¤”†°?‘­ø¢„†àœ^ÁÒTó+µ†‚˜ Ò¯«+oF·Kâ,E'ÁLm¢u.^}W·¤è,¥Ý#PË R©ìl2õh~á'AÔΙ¹ZõÀDZôÊ$¬ÆGÚHÝü®Eàs\ÐÐ’õ2–¥›×ÿ³D[ºL.‹Ç’±˜¬lƒv0–H‘°çBù>ݬ>¯&¬¾°è$$bÉP¤R  !Ÿã§`PŽ»â/‹ÈÉðX Ÿmy<–g_,ì±+Íf£XÏ=9z”bN‡Åœk¥As-¤à±ÝYçR=´ßFGóXc3K=íüB¹C†àäé]SÖ©]³Cäp®•…Ýñˆ§×bgÃ}q¯EÜ…ösÃz¨§?#¾÷š·G%î†;–á[Îq·;Ø}Ìk¼Ÿ¾"^J‘EÖÞœXÖ¦°}T÷“pLcì#t‰]òN¯Ï¹4^|†Â7[¾q=ëȳŽ`Œõà%î ¹`™áá5lɽ'l† ¬x;hbøzø [(4"]_çow)ܵ¹u+Â{Ê3ëä/xÕ¬U¸Ï2†(>mˆgml×TFp”¡[·ŸŒ;l%ŠÆîYÖØC±Ž$šÉ ŒØgÑVƾZ#ícö<0 s웓õtRÓ(S“*JÓ]›Nè2µD:õþ®ŒBœ¼X¼ÞUlQn< ð‚Õ0…¿Òt‰Ûóm¡®´»4N†1KÊ}(X#ã½ai:”Ðw/‰‘¶¶—¤Ö}cøV±ª2¨¯m3* EŒq”æC˜GRøÞEϦø0Ýä0Å­‰±²©mg.]¯•r¶c–¡×Êöt™÷=k`Ö6%ú×ðúÕžàà~êàr/ÃX-Êî<?Cð€_Ÿš˜£AxäÆlJN/ jJuîÀÉ*M¦ZŠ¿—5 È×±d¨Dµëô8“2`è4S‡2ÔP„º='LÀ1¹<åÎVf>¶Úh›2Õý"«Œ‚ݵœÛÓr0Õz0ã(A ߬I>ŸExƒT7û/kÆVµ˜=.¼:©æ•ÖÏ$Ä+ —o “ô>B„ÐãÇÀÞfÂ~îû]càjÎɸ~ÔÀñ'HªÃk<²²’†½}K·ZFy]ÛjÁã2/‡#XŸbŽ{"ÍÉ p$ò ƒßá†wª  ¤P%ס_„î«;Y™šxáû±âÖz˜³ýjZ*Fž2ŠjyÏ Ù”¼ ’–Nñ¸/8JÑûîöˆwm¼QtŠöy,–ðËÏMƒáLÀ)ð{(ôƒÏ”`yVM8mŠÝDÊÇ#ÀïÔ@nÉk¹™7¹_ãßíë(ÈE{ÌÓï¿x$»«4g•àÅ«x _ÑÔnŸ Ê„D»;ôèÙªF¿'ž¶Ýµ—ï!ôî‡!Ên×]n|Ú]9ŽR;9\¼æÒ˜]{l“séà{zøÌŸ9¢a'w²QâÝOp¶#a¿ýä ~wê¬wa‡_Ð3S`ëÒˆ@û˜Â iÏL'–²÷imÈÀºýïÒˆS‚2>9xÚÂÀg0î@<˜ k.a<†„å=øð„¨D¸˜ˆwˆßŒ1ΦD:^cZ˜úO^z†•\íûV÷m!+Fˆ7µD/œ’aû²ù?†C$< endstream endobj 2385 0 obj 4523 endobj 2388 0 obj << /Type /Page /Parent 2 0 R /Contents 2389 0 R /Resources 2391 0 R /Annots 2392 0 R /MediaBox [0 0 595 842] >> endobj 2391 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2392 0 obj [ ] endobj 2389 0 obj << /Length 2390 0 R /Filter /FlateDecode >> stream xœíÉŽä¶õ^_¡³kÄîYä`0ää´íFÆHLJü~¤ÒÒUd=Š›TÕš¦•¸<>¾}y÷ç/ÿlþõGóîý—ÿ4ÏÓ÷÷_N]ÛÉnü× _ß_þê–ÑñG¥EKÍð¯yþvzi^NŸOŸûÿ_NDž_œ¾õç)Æÿxþýônœü4þåËû¿ö?ý¯¡Í_úß~kþþþÛOÓxþ´‘Ãÿ ”PÝÿrùÓðð×Óß¾k~ï— ÏãÿOˆäTë¤u¼,¯’ó×å«ÐdýÚ¸L6„Ðþgуã¿?Ÿ~éG[–ÑNˆ’\uÁ£*Ú˵4Q²Qpuö6IHŲ t^IÛé¸ò z!ù¸Må'`óHÉWDçhXIÚÙxx¤h¸«å“á®ra¼æ<ÓŽhšîàHÑp7Œž7I;“ºÍy¨TxI»<€VDÒ¶6CªÕœ¦¨àÃ1 G ´¦ýÏŠMÿ[§3Îõo%B‘fB_ÉúA² 4¬ˆ¤mm:ÏP7 ƒq)úÑt¿RÚKñ ¼+fÓHª—‡òŒ4¬‰$î®#Â?T,!’Ã9"ªRñl*aéòpÞóŠHÚÖfÌw†úœE¦¯òð‹çŧ¯§wŸgzÿ¿þÒ¯ä¬CŒß¾öÛý/½°(úß~jþÔuìÓÍ×ßN¦í)¨£Ò1>é(ô„Hðà>Wð1çÚ¸&ÀyžðO×?é" Cç=n^ø<ƒŸd…5ç!ðª³â(%àNÍùÉǯ=H»Ï¸Ì¼;_fÙñë) iEOˆúåØGÅ_×=BAÛǬÚÎÙâ'û£Î`ã¥-£šPá"ÏQ ø¤¯ oùøÀ¹&+ùˆŸØY}'­Q=ÛqÞ×J•½V}´Óç'²¥D¯¬†1Ö|Î<À²!à9¢‰³aX9 €€x й¸ýÑÆŽÕë@lpzîŒj0°˜å€„ß^|*å‘:˜Ð¥ò{{ĘáEˆžµóPø )ÎzÍÖ‚n¶C…çtNA Ãi3¡GèÖhÿuöêñPq°E: 'ŽHa‘þ#qdãÄmëgÁNDå2;ÂUƒ€úΈaY\¬™iÖÉOÞúEˆtᘢ9üU„FÛªšÕa†(d†È+] rj7ŒÚe„Ûd!A̬^u ^k ª$ÔØ.\ÓûžºÆ JÂ"ÈDaË\¼5 N'ÂÎÂN` gDT££µº (S£0Üô _íÌ-°É ,ËZ«H¸¤téë•Å’™䜵Þ6B ­]ª£v‘’»²m–£F€Ú‘ç1íÃïÄ$Ú#|B)òöxJ¤k¥"Wª›m±ˆü¤nšTI’M©E³$˹öš„²«æ”h²u¡¬N ÖÀp-EI¶?Q1IER¥®w‹ pŸx‚‘b·"‚"cúú2°G/lßö„Ïåíz\Á"€/FVÆOÏ`سP)¸;¦ärņ ’‘9Öku!㻡)ð9Ü_Ó‰È –ùòz7ïÔõE=Š@£$•G/$5"ÒÑYxÝÄw\Ö¸Üq­º‡¨^4ªP[ôþ.ñ›u×®ùÕ/Èþh`ŽÀí+1VÛUcjNð®Ç nG¡¥±Éûž])ekµï^f-«€CmÕî1£HË‚qV麕mËÕùâ/ËLéT°½á?¦·sù2E†”n—{‘”Љ¦ÎÂCž´Àƒ³oÌÙ£ˆƾcÌØ*¡uÑÉ(*áÑïá䈔 0ze ;ÎfY8ŠsÕÂZRÎQ¶ ãêéá™Æú‹ˆ5J “ÎS˜ÙZ¹k^XÑP‘^1Lؽb`/0h$d;lþÛò»jµîyþ¦Ñã_M#Ï<ï`úËóIŠ–Cµ&˧øÕ(ürŽþóÓïç×ûmîÌÁ‡w¬•ôŸ2W£˜ë9~==}Wʺ0©BrI‚—ðù„BˆqåËèÿ(⋃á5ª£$­,™»WLªq»ýx"Òw+ß•Wv=Ñj?ÎXHº.(ƒ *,FÀ昷ée‚t¶ƒ8e]aÎR¸È5DÕ„;»H·ñ¼|.‹ð®!^=p=üa@Û/s¾Ì™KÓQLw­£rKG1ÌÖú¿8:Êð)~5 ¿œcÑQ´¹¥£hmÏÑÿÅÑQ†O™«QÌõt³tzÊ6j~µ'Aç.ÃÏ|´V÷Ö²LªPw¥£/ZVæ(–µÞ½ sâ "MTI‹" ½*D>mq†ím«8ûvì\[•É­#Œ)sÞùj9¶6*ÛsY…ìè™#ŸSl0ƒED‹lc¦:, ÑÊ1FFA˜–·Ž ÀA(W;j•‚°ÕÝS¥ƒ˜ºEEÊ%`Jr¥4vÝM ²šd=Á­„«±åÝ æiÃí‰<ñ¾pnwLcÀJMiª4‹Y@¯Å5¶ ú?yR¦áãØsø5R¦gÈ.¥éeT£ÌJÕ 6n¹˜Zý#7_ÐâIÜ3ý!0ý‰¨O°ú#uwÐ $ƼUúS|§EžÔA ERúºEõ‚Û¼ ߃¦Œ¡Š°ì¶OÝ‚˜ÌjTWtA+:²2KÓŠ{6î'°a£ËY- ,êÒ©àû+¶ä®:˜Õ®1Ç’oŠÚw䮲º*¨‘IïÁQ&´uZå1„I{Îûw!‡fÑš³6ÝÀ—-œ/Îm>˜@ÙŠV2Ö:+‡^f¼ª"„ÍÊS!×ùÎî©JJá²G*™M”·’¹“’Ù¤©V_ýš®™#3ÆçT¦pŒÓ=¡`@ávÕÂW½ñI=ÒnÕõ؉mÇŽ ”=¥ì0òw/ËŠ áÆ&ê[a„§«cÖø˜”XŠêä=«`@¼JfˆBX¶}vacaåòƒå,Ep2˜Jú%&£«Ž)3†AðýL™êÁG:”ŽTAæ:ÁÍò›ÞJ}¯®^ç¼›£CpÔ 1=ú«ƒÇðÇ<×mJP¡]ö+5@¤g`í^RwÀR³¸’hY펓hû¯æ¥G¦Q†Lßž¿•VžÑò¢´òg/bz_]Åh-Òoã–ãÎÙŽRØRädòKJÙÊÛš¦á­#|पU·M4êÆ“ñ"0ÖRsÓ+D+Gaþõ‰çÑà;|gd銶´c׊ë8Úˆl—ù~vòWÜØá'èIñ¿õ„@û˜„Ü;Ó‰aö>­í|°nø™ ²´†O<í‰ÑÞzÆÈ'ãaX€ð‹9A>|€n q1Þ!<3ŒéàhŒàñ¾ “WïÖ;ñPIÅQ­%÷m!+ŒWÜ!#gh>ŸþC= endstream endobj 2390 0 obj 3904 endobj 2394 0 obj [97 /XYZ 32.1599999 602.899999 0] endobj 2395 0 obj [97 /XYZ 33.1199999 600.980000 0] endobj 2393 0 obj << /Type /Page /Parent 2 0 R /Contents 2396 0 R /Resources 2398 0 R /Annots 2399 0 R /MediaBox [0 0 595 842] >> endobj 2398 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2399 0 obj [ ] endobj 2396 0 obj << /Length 2397 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯ÐyhÄ7,xü°‡Œ1°‡ ‡Å$ÙEÄ™Cþ~Ô-ªÛ&õQR‘bwÛ²»m6Éb±ê«‹­?|úoõ¿oÕ‡ÛOTŸÝïÛO»¦ntÓUûïï^þƒÛZðþ¥±ªæíþ«úüe÷\=ïwÝÏçÓ‡ŽîW×8LÑøíó×݇~ò]ÿŸO·ÿî^ýUñê_Ý_¿U?þÔýúÙ·×mõþÅïý Æ·Ý/_íÿ¿ûÏ?ª¯ ö0îþçwŒ-;ZRèx>ve‡ï—]ÑdmÒ4ŠWŒñîµêþûç/»_»ÑŽdÔ­Šïˆ#ò©ˆf±óñ“ß@;JØ•Ð'ž/!’/°T Æ'‡3¹ 8PÀu ‡fÂÓe6Ò“‘“‚û0h8(TŸÓ<˜À`»µẼt2TÛ¶ÑñX|õÖ\šòE +ŒðcººÌOãQ‚Xy_@Û\Öœs;-ÐðL€C¿ ÷IÈLQgm[KÁ–BŸJÎjà¨`*w±È÷'eO`–ƪ,¢mÒÀ•Ai¦£»¬ˆ‚‘ ŸLn®ÅDH ¢`tÀ-xçðéùå£C.Éû@ôŽpô½e•ÖÏj‹† .èÉjŸV„0b£ÕT3ì%¤@p|Áï3D…Îþ#ëÃQ¥ŠRïÊ}ÆòCÓE îy‹r‚ü—¿ç‘óƒù=aq΂2Hütúxɱkôq¬tB))H‡ªØõÀ¦š`$ð¬Y“Àù8r®:§öç\U_P~ÛO¦B#|^¹•6°pïÍ!º°<ªn|Í)›G•þ>lIN—’ØcüÕ`û²0 'S)i/lmaX u²••Oh²*ÞJ€vZQˆb ac©È"tk¯( ˆf¾s>ã´|•jt|æŸå„Tg…×…'^ @ó«”MW,,Ëùzˆ ÍcãG´ç‘8þÆçïX± c¼#ÿ?’³x”Ë1Ìc¬Ç’9£kÛ\C„EòdÏ.qJOJ_‹IKÈ`b©ØâÂܾk^¯6'@Žâ–-7tÙ{J¡º(ž>QöüŸjQJ– ^1é4‹pjF9)é_Ze/G*ÞXDt™kRrwu´)O†y?²¸y‘—Ñ·,%3YR·Z!_ÏznεlZÊÎ^ & ŸI…/)_gÕYA×6ìÈÅí´®çO‰°ü^8²ÚF¦ø²Åj<Ÿ›÷Sd‹î‰¼Ï‹°!–ñ«¨(&Ôµ–ÄÜî« L$–¢œa YRâìñþÆfŸáMRduca^‰‹ÈÅîPx@‘y|Âu=bêô£ŒŒ±ÒyPÌEÊóœ? /¦Î(Êì£Hñé FË–›”LT¤¦Œ€wW¬·mJväüz{õ—¡ë‚¥TZ•Ôu!ÄëYÏìc sô1KU.RžZA mŒ+³'m *•òX)´‘žt£`áÎhWÉ^­nƒŠÙº¬7i1GÏ D‰ª"çµ­àés%ÏïÍ\g²µÐtE°,¸O±Sj<á–{Þ?~s؉£Ô’Ø)“j]š}.œ¹Å¼ºNŸ‹’¡ äKÙ‚ ;7ì,‰×2•ÄN’¿,u‚‚*«=+U>)ËF+˜ù¶t·”åÆ{²YîÜ–{³Â›.Á`­/h…USú¶ùuÞÅ¡`ôûÉ%]'v^ÀÙ)áœ$çãzά>A¤nôüŸA–RõÖìÔeD‹Š_ÉçRX¥S>—⢵‚IØã7Öq³¨›EÝ,êfQg`â ‹Ú}WÏAbú``ܯÏ_"*4mÍÉ´=F[´ëô“ tźeŒ? Jׇg'Tâjºd‚Öµ¢I+ëž3/Zz!à¦6ãQ4#-=£…¨y«Çý T­ûœZ œÇÂ>-ìÓ_4¼æ`#A­Ä—ÿ¹ƒïuOäYáêãžX2ÖÂÐ:ÜÓ–õq;¶d펶ƒ$HÝþ5W̼VìE»íR•c4šårà’¿#rà LÙZ´¯ŸÒ…[ð<îˆcåÁâ˜ôb"̃ånDâá(] GÁ:5Š¢‘5ßÖ©æp4çÂŒéædÀ¯ˆ.‡¼ÅôcÔ-$·ÜBÚ(ûžW§0FPô€ËL­4—­Õ¬§Çhln^zD½¡êq÷7¡;ã endstream endobj 2397 0 obj 2849 endobj 2401 0 obj [98 /XYZ 33.1199999 188.179999 0] endobj 2402 0 obj [98 /XYZ 32.1599999 190.100000 0] endobj 2403 0 obj << /Type /Annot /Subtype /Link /Rect [381.599999 718.100000 405.599999 725.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 2404 0 obj << /Type /Annot /Subtype /Link /Rect [60.9600000 340.819999 121.439999 348.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 2400 0 obj << /Type /Page /Parent 2 0 R /Contents 2405 0 R /Resources 2407 0 R /Annots 2408 0 R /MediaBox [0 0 595 842] >> endobj 2407 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2408 0 obj [ 2403 0 R 2404 0 R ] endobj 2405 0 obj << /Length 2406 0 R /Filter /FlateDecode >> stream xœí]_ܸ ŸO1Ïnbɲ-E$»)ЇAôáЇ"×kq¸º½‡~ýÚc{gÖòOiJ¶wÙÉj,S$ERÿ¼ûó—œÿõûùÝÇ/ÿ9ë~ürÊ.Y™uÎíßî¡í%×ÝÇÊ]·Îß¾ŸžÎO§Ï§ÏÍ¿O'U^ì4ƒÃ+º ÿöÛé]÷òS÷›/ÿÚ|úßYŸÿÒüï—óo~üÔÏ×~áûÉÖeûá×îƒÒJÛæ?÷ŸÚÁŸþö‡óo ö:oûïJY[³ާçGÕõïý£èe lÆ¥=+¥›ÏEƒŽÿþóôs3Û3—Ú(U•¦Ê‚g­t3mUhu®«²™:3άÎâçZ8‘-µ™è ‘Z¸¶æájf..ömÕLÝ.TgõRœ S-F~]2µ©eKëqï™êbM®òJ¦%CK‚ÂZÝ|®òþO8Äuó¬9ž§ZŠÅZ—¥ÌD-D2äðLÅÝ užw\W¹²¸Îa¦Å3*“™¨…H-ZÙ€x8ï…©{ù¿TüߦZ:QYj™‰ZˆÔ²¥ ˜ÇS‰J J¡m0Ì´‰•"k ‘Ì6€3]lÙÿŸCÞcÛ—4dí´½–Ûm¶îp™‹é;Lµ,EÖ2®}[ˆÔ²¥ v¦ú,b‰ë›%þäyðÃ×Ó»OÊä¶=x|ý¹äzzé~|m–[4ÿi,òf—ýéüÇ,SæO篿œêKQçUÑwæF²G4¢?ÂG>@,„¾G•p¾'ÏáÄA^ÓñöÚF²‚>‚g+*:¿ágð{Öç7Îΰ)<ÏÀõdŸÏhÞëÁ;XÃ}šAú°8®4cì,='‘¿6z%¶–(35¼õAê­5x¥ÉºW6'ømﯯ,.¹¶J÷íÄŽw§£Ü\L‡½;Ä:Ïvt«.Øó&à«=Qn³*øUÕéA¥Øn#õx’ ­‚4†D?ŽQQްÁÈ2ùYihb:˜õÅv“: Z©KaÊv4àèÒc<ëðY^´²Á#Hä xVH ôÎô9"ÄPˆ±ŽrNœ÷=B©…7bI†óIÆÔÚŽU†ÓYÙx΢!ëãE«ñk\º¿áHW£Ò/®b^ë÷H2º’oš; Aª†3¯G` ;¨pt A³:Lù‡£É£ð©ÁP¢¸HÂ\†Ós@Â`TëO³|‰UAéJhE†£è>üUgŸ³IæåˆšÇf¤y(òÛ·PÞzf#hñD§ŸÍh8÷b%á@¯Þ‡+‚Tu6ɬˆ¦Àü1æÞ•à_å³ÀÈœÍDLûp%ÎÒFá'èyÆðœ0hŽ ýˆ«%\MUޏFUc¶ÉÔŽÁùZ•E9µî)lf3†ÈÔ39døŒ‹ßr†¦FTDk£GˆVSOe—²RSzénUc—³îYËojÝŽEæþ UŒAüÄ 8&–˜›Ñ#7ù˜ñ Î-I‰ª Â%A“cöpîÄr:®WÖ#t vž„AÉ6õzåï!™æ½;²þ79³p¸NNfµUY5`¸˜sµí¼Œã³ÀŽt¼Óœw´[g# {S³Þ|ÁL Z²Ÿ<‡„ð3ý®TBÜs’çŽM„¥8.˜×yðØÀ-g6 ßçjJðm^ý”v¤Ž«Çؼqîb³]ú?ô ùu,ÛxzÞ×ߛڞÅÀUÜïvåıª01¡ÂÅD•W#1Á‘£{ÌÅ?GÛ—r´CrSîÚu^—i/íÌÍ­½ÿů§/Ñbˆ!îíXD÷glÁG ŠG‘MŽIêY×xlÿyVθK%D•EŽb›µÿâFJÖ•ŸŸa˜¬l1_Íál9 ÂÇxhÅîæœº”S³qù¡¬FcvX?ý-°²zD‘€PU¾RŸCŽYØèñ„GÍÌ«{ÓoÅ gœ³'1¦÷}mˆ˜>8¿²ÏëÇç¾õqúXœÔOr $ŒÄ`’ÅìzÒP¸®_*·)HçF’@jóyëÇ“…Ó‡0Uaº‡KÊ'™÷i”4~NNN„TÈ!l òË´€°aìh,qª„ Ã& 4Ö8ɰ[NlíqF¢óôÛ‘(ë„¥Ð!Q’I”õygÇR¨6ó66.€éˆiÏq0’¹9ü¹‚“dÍÙµk>“’_j•ürü²y:æzÒ'¯¿hm#‰Z9 "N€!! €Xã\38N DQ,QظàÙãž³¾ÍÝÂåˆlö"<$vË“Cǹ¾ ¤gÇ”û}ÎÀMð¼âœk—Ì©³’ ¡íYF€uI–ˆVÿ*á‡pñB©~«gCo8À.Nâë´:œe¹ ø»ÄySbþZwÁíc¤­]cÔY5Ò‰ÉBa)Fœ»ˆq±È¶æ”6à¤Å Œ£¢oë(ij„„gÇ ¨²K…³ƒê_GèDèM‚—Û˜!¶V’Õõ£HáT±V!ÅHùŽ$ ϵ=ªîùV|äE­}lsј¾b•éŠzÜ lB:Þëí  —MÃ!bX‹2šË9‚81³c)ÁJí%½oC6] oÕê%I„Â2<ÕÇñu3#0„råY„_7sPä ÍSX©yšwnÀ}0W`jáàQš¬ßñ"ÙƒÃÏdp‡ÁašBúx¸J4llBðz0pŸ,!a7›ÉÝ¢AÍzô̆8°ÎÁA Êqz•x‚E9cpçÈÇ We„‘¾¡~-°ßQÂ~-µÒõ,¤²#XÖ`ŒÈZ cž!^íÁ°#p~52Çݰµðv$WgK*¹ŒM¼3R©ˆ˜¼îX\2ãéEë¸QÄC2ÆÉéó°¡B§õ’„5ƒéçéYj¾ãˆ§•¯D2!§*‹C¦€Äþí51öôùz°´$ôpäʃôu5v¤{6T0<£W9 %KßlÉÒd¶÷¨íf4/B®ŠyâåýK¨÷r¸$Ò¸$"n­íhÄ®ÍÅ)n2ï°Øµòé#¾‚Š6oF ì«n5ú5G)°0Ç:EäÂ÷݆,«Õ_RŠÒÕ¬7¦® Fn–Q{”E9ÖXèèYT†gdµíÞ^Q«pZzä¡,ÓöÎ{% ÷¥‰àŠSV¨ÊË!{÷hÖÇ{Ï–Ûz<¥kÉTçöh1Á>BâÙ6©ƒcYVo™¢âŒ̘¡p!å~fså5=GðÃkœaÍ}œº8áFv€‹N´`,_EMêµ\o¬ãTÒ†+Gs£UÜæVcÅpôO _ÖÚý“d£r¡6ÛÑG‡õDY8$ß» !¢D&º'œçi†uI‰£5Þš©u9R3©Œ‰µ[Óì³Yª¸ SÔ 2DHâ.e»î ¬—•©‡4ðç²@U9 ¬¦Sý ÷=`ê`Ýo‚V¤dõhE¦£«ÊóЈsXÙšÒØÃ-Í3GwôW=ý³ý2^©h.íãßOª.ïñë鋇åãì•„—¬%Ù3)fÄ‘*F€SÌ4N+7ÇÔ"ôgŽ›ÃD°ÛD±"²ãfD "Š~géJ| „g|›œ®M³Ç ·9æq²VO‚•ðA`!2oÒSšn-`z™,Žøñ?]¯ê{%ä ØV¹û!Ðkç°<¥$ºhãÄžˆM¢Ús3öj@È<¼©“uIH„¿/òæÎ{-ÂÃ]§5¤g@¬³hÇg†»†ã½¦lÿuã‰ãŸì ¥èX1(³}vvðf‚ý…o¹!zã§µsjÉÅ™5 ŒFÂü'd€SNÝQ4l>e€‡¿¯‹`Rz˜vNVt@™Bñ•ÑV’:„ ¹CíAQH¼=\G%•]ÊJ½Ð<ùªì”ÍÁ#ņy˜æN`!ð¿oþl ‘pJáøÄ%"#Ö§Åòx‹˜A ™I¢g©¬¬H*‚GO2þ/Ë#˜9‚ððÞ~JpN~n ëÁÂöÝ%KL“=Yé;¸ ó\(Œ=®®Ôgßz‚æ0VæÎíí¾ÏîžN°ëαKU÷Bïó¤’ðX™©Y,zrÊ`&Ü«£‰hO˜\,Ò,€Âzž×ÖQV*²$ƒ_’îû|0Àúª¯ñm¾2^Ôc4lõá7Ðw-×"ÒX™r„)Êyg–þlà !ÁNø|GHKƒ>nBÙŸ€[]FmxzØïy­ªê[91Å•—F™iS½èñ;Eã9XÕ™±7P^K£³þ=©h !™4ñDůð…"ç’ìÅó¹ Á"³Ú¬N ³îÒ”Ž–ÊT/‘J;.‹m·Le´X\¿QŸli¤õ›îá¢IžÂQŒ#9‡ã=ŽšÃñú–Ú½m¢IpU–ótÄü4 ÞöÈÑð÷hø›ÐŽX¿,ãú|}4üõjÊ£á¯ð9éhø»[ 0AÃ_{Öfò ¥‹Ú¶¹€éH¥ômIÝæ*o+yeâ¡zôP¿U9%:Ô@4×oÙ!¦¼ô7vŽŠk ~tnžÛȧYPÔ#z¸—²mÀ¨¹VóéÄHÏÛS@ê1( Ïâ~·“Õ¥¶ã%B´ %Lu¢ Ú]„¹Àái1riäíÏŸ$Úy°Ž!ÀØ' sM&ôè»éîÀm5”¥÷„B`Yǰ²èW¿ÖŽ–¶¤ „ç~ŽSF‚•éB™pIˉT'Ü€†çýqn08èc½‡€ÐD çKîŠÂßKÉ/ç\]Š+pzq2U—Ó êÅ´IFÙ+A7°Y´¾ˆhVá‚„8Ž­Ñì¹ÞžÍ£2½b™¨³¿ (€Ð±×#©pp‘“èĨð™òB¸Î‡È{Ï1;ˆIŽƒÕsUŒKÎ%XÂhåºP/w0ÉM€/Ë<Ô‚öÐ>áuP]ÍShýÖÑDôBŠE{¼S¡S»¼Rá_þm#¶¼¶£ØòUá)Úp§HsÅüa¹l“Ió¢­¡Hó—)‹yNX_Ì1œ÷:r®žÖ×ûÄÛR}Òü=?5›C•Wfï|ûN*}WŒú³w£y¿|)ϪYÆÄÍkUv­>Îyf^2AY^Êéã]m.Φc]]ªñ¹«Cg51Ò ÿ<¿èz²àyQ\ÊîHt©à{,|¦†Ït~âJ_t–¿¬ÛþÎÖ©Ÿûß<Àïö€‰~BÏô­©…ÖÑŸOiÏô£¬½‡íºp]ûYj0P¦¤vo8LÁÈàƒÞ<˜àåPã S®!&ÁÔ_dM=yÇåÍÞ[5-æ™´/óÙÔˆ»û01´x~ŒuüG(:u=tÁpd„zBöÝÝ#.Ö–ªƒp$0‹ÜYôŸ%õðùóéÿïYg endstream endobj 2406 0 obj 4485 endobj 2409 0 obj << /Type /Page /Parent 2 0 R /Contents 2410 0 R /Resources 2412 0 R /Annots 2413 0 R /MediaBox [0 0 595 842] >> endobj 2412 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2413 0 obj [ ] endobj 2410 0 obj << /Length 2411 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ÐÙ€µ,’¢( 0à}È!À`È!È!Û1Œ¬‘‰ùû‘Fêž²?J|ˆ¢z5L÷4›T±^,«ŠïþüåŸÕ¿þ¨Þ}øòŸêizýðåÄj¦ØøS ¿ß_Àu-øø¶ÕMÍ»á§zúzz®žO§‡þïó‰ÔKÇé¥o“z°Dé!y1gÇ—ÇžÛšþŸÞDëtõøSõ'ÆÄǪÇßN]Ýt¢mFûwjé^Z>=ö3Xjz*ï<ì3lù[´ Iˆ‘ŽöÞ¿…ðhx>ü¡f°ÅÑG ç#Tå µ1䢀T¸7¼åâDñ>£FišÐd’Í<iå<'lÞ‚iâÐå˜çqŸ·Ö/X/ã– ¾Ä2L3kMóðr'ŠáØ}òrZ¿^Ηœx1ÜçàK¼A,¦µx»9W`«cÛòû Æï‹rK:nÉ)›‚2îy;Œd#0úbžŽÊ»©×Ä›kòŒ¨Ö&½¤©\e-ÇyXdºêÛ ¯NªjNú&\=odÙ¶f€Ä¯Ï#øU9•ø”זΤ…@Ãá¥0ŽÁ|Ì4꺜K­É-™MŠ¡ç6SLB‘ZNÙ òfÑIeÞIGÈUѳ&h1àrátÈšôexuà<¹BøÄ-H u},Äbr%“l¼Áú“ .¢ž=æ•<h æ îšJÙQD;–%ëyx\®Üì¯æX|šV\º½m.’ùl*Ág—%¨hÌäÁÞò_A°.:ZðhXèþ)¹gá¡s°æ´PŽI\¸5‰øZSc®9ÖÆ¤®‡¦gðÄæ]Óû¹m…œÈ]ëŽ)7{9ð¹Ë-×§ ËÑ´‹¢;Ï—§±ØBø4*£—D4zçÍñš¾¹íÀ!³þ©"½¸¹Z– Øâx¤¶`ð9Xfðs°w:=v‡`Ù„PæøÍcOŠ>¯äÈ‚|n/±@«¶í7§U±ÔʹýÝ7 ‰­Z‚Vý†NÁ¡ÌäLŸ´‘S˜¦YutwŽA½7-a|Í!gjÜ1ŠaÛ~-8tt :ºä}þ>5þá›”!Že&nD6:n¹G`¨9{ê^[p¬ÉHx¢º‘jp}š(\â‘t¸G]±ÄÍtÂâêÍt‰=ÊxLrbÃ>óÅgC«D98PÝÑøy˜ŸMH,¬ýˆäÀ‡ æ·0‚‚¥XÔ1<°IcŸI˜¤ŽÈ{´³æÑvæ"±‡Ó£ù€½€À"›G-Ù·}-½˜™Ï·ïÄji>(ÁcM\®{l@³Ç&pDÌ…HÞ°ÒEÁ&³$ñ°º| ,Ë•¡x¸œK%‡¶£%ÁxÔ¹ø?¹kX1yV®¸.t\ëÂÊÊ0‚Ä‚x¬i†C€É›3î¡açŒ7ìi iqx¿ðNæOà\[‡¯{WüØ÷„óSþƒ™Îù¹óð ç™ù{;–û¤°—'·dÿfŽHܼ,©^vÐq{¿nçhŠ¡ÉA-Ô³‘y(Üv…Px×ç®ërÒtœ¡ÄŪ½›ÄF­©yqYeø # ôì®ÕJvññy¸5b’,0¥#4,ç—Õ쓤•œ•õØiÍA†²‹9Ö :ì ÐIÏŽ„ 2‚zq9“õÛ)YD‰½–©·BèçÜÃóÆN!ìúÁ´Í›q›Õòf–Þ‰“&X8Ü~Eje¹ð»ýÖ·N*ƒÇÔÙ0*£Ð²fWjÁ«åQÙ%AÛ—F.ÃþÐ|4Éi1èKrüQâ´„”ÙY;guúì3Q`ûêÿt”»b+C]óZ(âÐ5èš”?tͦ”;4פ¹.Å (ܽV%>#´UÙ¼J°wö°­ã†cÂÎseÛMy£OHËJ)m1¸©W9Ê:Êûaä`í‘òP¼œœ³˳ÂÅC·ÆêaÓ¹R ©B+뀒y‹æVYu©æ Õu'íóEsc.÷3E¢ӡңŠÁ§­ž¾QDRP ×åøói€ŽEfÞdŒ17“n4YéS|ä•¨ï ¢ãr>1ôÐ\^ÆèŽëw;,Û Uæ±'Û¼@v’,+/[>ùí–ýÙ?&æÖc‘ˆ ÏMÈäk†Î3Ó <ŠÔGÅûÄZÇ8ð ÙqK<½m‡]5&î^3캵œLŠw³ò‡í7«®Öô+tɉ!vÄ‹—»?­=_ÑÌ–'3:Iá­®Ê\Ð/H&E‘ŽjÓ1Õ¦ÓÔ>Á¡bëæ4§)«]~­r0ž¶<~!u¬…·m.»¹êaÇSiåøó±DàÕšs?ñç²ÖÓ#rAâŒG\ý*Ù;*tµŠ]ć'MÙtõÏfÉ è™vÞõaîRÅ´_÷ê«,±¾$Ç4uÙug¦øv‚}· Š<£¾!£hÍêÞÝb£"/(í,ŽÀ†Œ3ÝÖYva‹FE°Å>OU¶g²’ñV c¶gK™·ÿ­žû'÷£_˜^ž¾.òy2Ûçùàœ…³ë¼ÓXUÔOãV逎ÔhpW‚É·¦T­nÛ¿¬åÈÛº½]ù©½Ñ2šBÔ¼»¹[hšZ6ÕkK Ÿ£aŸö÷+-¯9C“)·F ÑëO>ÂïNΑ3üŒúLÛ‘[-„æ1¸~}&ŠùÌ}‚íE"¸nxϺ˜rÚSLï-ø`2oðYÔÆxÔ›öÅ^0Ñ'ØòŽÍ›Óþð´˜g>"¹ÌÌg·ZléÃÄÐâñ1ÖñsB8‚ü©ë  † Dg@¨oè¾ÏI4‚ÖLÕ4T…6Tƒ„ `1¿ âzH¹BW§ÿGø.H endstream endobj 2411 0 obj 3604 endobj 2415 0 obj [100 /XYZ 32.1599999 569.299999 0] endobj 2416 0 obj [100 /XYZ 32.1599999 240.980000 0] endobj 2417 0 obj [100 /XYZ 33.1199999 239.059999 0] endobj 2418 0 obj [100 /XYZ 33.1199999 567.379999 0] endobj 2419 0 obj << /Type /Annot /Subtype /Link /Rect [311.519999 387.859999 343.199999 395.539999 ] /Border [0 0 0] /Dest /#f2#ac#82#04o#d2B#b3p#f0#bfR#26#d8#c8#0a#fc#cc#16#fa >> endobj 2414 0 obj << /Type /Page /Parent 2 0 R /Contents 2420 0 R /Resources 2422 0 R /Annots 2423 0 R /MediaBox [0 0 595 842] >> endobj 2422 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2423 0 obj [ 2419 0 R ] endobj 2420 0 obj << /Length 2421 0 R /Filter /FlateDecode >> stream xœí]K¯Üº‘Þ÷¯èu€ô)J¢€ Àµ=À,0l`Á,Î ÷q²˜¿?ê–Ô²?ŠU,êÑG6àÓ>lQdU±ÞUüé?¾þïñoÿ>þôñë?߇Ÿ¿ŠSQýŸãùïïï¡í©ÔýÇÆV'Ýžÿ¿ÿvøqüqørøÒýûã ê˃Ãnp|E?á¿¿ÿãðSÿòCÿ›¯ÿ«ûôG}üÏî¿ÿô?Ý?ó¿ðÛÁ¶õùïý¥•¶Ýî?ÿ~øïßÿÑ-Á^æ=ÿûûË7Š´uü¸>ª.ïE/ëÖV©pG¥tÿùø¯¿þÚÍv]Æ©5J5µiŠèY•1ç¹L]m£ÚXoVos‘s©ä™U Ít^“JÜ]¡ªðT|ð7uÕƒ¿ö‘JÚ0W2ÐtQRˆìÖ¤w7€Ou²õð~Žy‘½lÝvëV…鎮–Ï0¬´ÖͱmêóG>œ©R'*+3ÑyE*mk¸›ðT&ucª¢µðsüŠ«Ê\¶^5©{gJb­ ™‰Î+RI;‘g’ÑOpÄÒG”#céï)ð ð3%ÑÐHY3` ñƒ1‡W]bˆÂUã‘À{úg>}ëÈ??1—å2ÙL é¤ýäé‚#Xó©?óóÒŒO>a æW ¾‡q¾eG k8x„N€Bà3šA;˜F‹7:ŸP”A…–”³Q"„jèБeÅ >Sb¸µs²âF¥A[…D¶fR’ÝéZß^_ 9Ìý‚bLå{@Ïö^¥š²›½8{c‡ÿ›Îz´Å±nÎ?¥lÿ[}¬ëóÏÆß|?ÔÕI©V[«®ß2³˜ûwtßþoÏ§ËÆ}G÷›î™Ç•œ¿Õ>ÌÒ>¾ãKDR 0d‹ ‚3BeO³ª8u'Öv(r©¬9€i×'}yâ~¤?OÖ唿dú9<ò¾}u®O¾Z4î¬Æ}¶=æö ¸x5lXï¹qèOÑ+ò ŠøÝ4¢?Om‹#ÿY70Æ{ÐT§R[¥+_>[‘÷>Œ÷«²´1ŽW4 պ߀0Âp¥ ÀC0¤#­|ñkJ¸V|”9tƒŸÁûÂTámЃæY.´t ‰Qì;$ºá}’1ùJ‡Ëû¬ ƒ_òè8(>”ÞÁò‹Ñ€i‡À|<‚p¡‡¸C^íª.+­óz,2’lmKgoêƒKK.ZÌ@'Ûuø4(Æ#YH(¥'ôJ†GÝ §7ŸfTæ›ÖŽÀ6v?C +@nØÂ‚æDÀ †¶×\ÖŸÂŽüì~f8±]¸»ƒÖùâø™Õn·ª%ËŠãc/ͱeý¨ïÑ[U“8Ú]ˆÒ;] +jL ògâÛ«&‹µÈ.Üf ËAX/¯±âðR:8ÄÆ}¯©ÏĺÚ11#.ú‘}Am9ÆâÖ¬ÖíiO<ì)Êmµ¤Ìª(·u› W÷´§ÐÈûI{Ú¢BÚÚž5» :ó´6åЬ8lͳM¸i ÑUxMtQŒÜ9L{ÔæéjT¿˜fôß u¥oxéñ_߀þæ~E[ï¡ÖyÈô,D5c\ÏÅû9­É\‚ƒ·¬ÊOIèé¸9µ¶ÅÅÌÖŸ UžJ÷w±ƒ4x6IžúTW—8æÝˆvaX>™FÆÀ®¹$œésšÛƒø$È»ð‚´8‡ÊKüÀ™ñ³²2\¼ìNÊ‹—ÊÃÉ™LÜðÒסm¶<Ã$^œõ_äz…Ü ±ým²Ã‹¥%a¥ˆ¡Kz>‚ˆ ¹‹@Öð©ueE6¿“-aÝDhK+ÊÜ"ÐeF¤‘P “KiU•…´·­`L{¾ïÞ%Lî¥sU¢6%4‚ñ¨ïf&étªQvÒžÁŠˆ×ÏNÄ""ÒÏøYгz)b‰Ï&!62[lÓ¶転Ÿ‹™ÃÑß/1%ÅÇçÖ3ùX°ò-«NjÃYÞ—‘+”Úc –žæÍ±A ô-’*—‡àRr£9A‚Q Ú‡ryFLȪÊ,Ð$ëž]¶K,–<×Þb“.P ““°å¢KFô•¢ÌÆËZ¼c¬£O§\Ë<›ÚI8§óÀŒ²¨©ÊxY”W®¶ „ÆÌÃržFÞ” 6!(FØgÂA‹pZOÚ¤yÜ'ŠàYãâÛÊÙÕL¶ˆVY”D3b—^•5'a†#¾(‡iAƯLåà+y+Ð Vã7áh !ûd=IëIî“°³X)žîÞÙ÷­.¡–r,¦óªªudOn,¯Æ¿–‰DD+"6Àw>«K!OLÌ ÔÇßTå¼D²`§M3øBIÕ ­d‰±,÷âÒ r÷¶±.w¿›.%1œ¢ÅÏq)M3XXõøÖmÞIh͇[æÉöG†#²=W97ÏÈî”ÕõUs´OF3:×Üë{æÎÔÏF–mÍ>bëz·Öš±5WgöYúˆ/¯W±:"¿÷Öã#¯·±:¯˜æw5`øz Ó뙎˜B´‹(Å ºgù ýÓÙµ¹¶ FB¬q-nÄá>Þ’ɇ›NÞLñeøfäÞÎÔ^o’¿åäØJ»,›Ãý$ʧXÁQEÜÝœ¶-ß|^®³bnþRá¢mñùMWм*sâÕÀbãƒIé„ Ê-[{¦ÆBš… Êvf$c"¥ëi…)‹LÊkaF­¾véÄ^FpŒu—Çï2µ¶œwºv`˜”-’»tâaÃ~¨0%éA´`'¡I¯$Xs–¬K»»šQÒBF?­;µzí¾9™HK RÔèÍ„À'} f4¶[‰=xá÷‡]=öþ7Q\BòúZåj ° j[¦Š}d°=èÔºâº3.°§óf;Ô•½ÿů‡¯œ‡wŸ—0¡w°jò-¯µWþÙ ¸N鸵~4öž±ïÏu¬gu'=íɶEýÌv·E…x•*!¡WpzüL Gð3pmÚƒEë×xõañkuÿY¾¡XªîMí†/gÂC@§!‰ÕˆVxƒ*Sð¿à‹5> ¼ã;”—ÎêjY¥wl&¿1—C0o#u™8 £ßUÀ­Ïé®Möœä ý”¥{²÷è9%´¹ºŒVÙG(ŽvT§Á‚àéÌ\xˆ±ÂÉŸÙA,“uàÙ·ñÁ_íÉXÏ6N:ûçœ`5Ëz•ÈΜáœ!í&‹4öy>GÆI£³ wÝÊd†ÜBöxaêõ3eµ2ÊáNËÔîcWñ6­â­Ðëšå²ÇÊ ×-,X XֵïDD§/lDA+áH0„Q„JŹ’@4™§¸Y" u.ÿÇ8 DÒ·1fNºz·Ç¯PÂ..¾ÖÚ §µU”Žl `,¾õ,á¢ÊiË)¹É‹d%Cž¢1»MR.eeUÍdš¼$;žÁ"¾'ïü}Cü=*! óM©­[ N¥uãÐ9E­^¿‘€Û*.Í»¢\¬ôµ Nu¢!ÉÖ©¤VVïC ¯Ú(’í¨.rë‡ø¾R,·‘:ѱ@WõÊb%D8•㥗;ͺQ6iØ\Œj¿€#’òDñgV·ÞmGïü6j¥êI ¯P¡š–ÌÜPÁ×YK󬃡C±B÷ õû ZO¶: œõ \ò òœ2{,¡É7qFé&)¾´=»}šÙJ˜N›’oùÅKÕ4®¥Ï¥N2¡“O¡ˆQF¥ÙŠòr¥¢Ó­® ÅÓõs„ ÝEÚ+%øD÷TJЃ ÿ ‡J!µ‡ H_MßÇ2íÈoÆ8ƒ•45W>rU†¦Að Šø9 ¡Š·è…´œttÂÕŒ kó‚„Ê^Û[ÃA··f\vÀi*h^ÔÀ‘©Æ×ÏvŠW͹ž@1àöΆÛVÞù™¾ []fÑ“ƒÛc3 j0%BXs.×Àp P"†5„N`m˜®ñ pÃqHUe!I£x¸Ý}ÖÌá÷`¸1Z–áýN0ƒ\ŒsA†(†æ×ŒZùóÇáæW¿j£èf¥þûëPx[Nmz·±¶×O:¢¤c32)'dæžï¾Ò3ÑÈ=tcL&Š';Þë1Gë0qŠûD¢€:K¯4é‹§¥î7pf=ü0¢WBBnSDþÐâ‘Ûˆ"F9ïQ^º"nOpÞœ·¯l‡Ò¸;‘¯Îø•i mre“d ¾S–LÄ0‰×xÙ ¬S¤ô:AÎ`W-$UFµ_ F${OîJJîš'8º =<¡áEÊUx[µ¶J­\~‘å úMÐN–âHÿ´fÉà ¤5²ò }ç$¼Æ5ŸïΊÝ@É7ëv%Ìoümêädd÷n]vÏ¡ˆÉP‚¯âÓ¹?%3%™1ëý9û `|Cô»ª ¹[%¦ Ô¶³|ÂÏ.l]Ít‚r¥²W–9{šã˜Ãg•Ó²M$ÔýýS܃œPO<»Ìzµgy”7çrlÉyãG{¢Y±žD³œUHÚ“D¯É%_æé»µ)·PгX¶le…­YD ð9$„LqGŽüÍ5•u¥LüåŠà ]¯gm®.‘ÌŸÕ*Œ72§ŽÇ÷j:wLf³D¥'‰‰ÀL|»œÑE ¥ûÈ~뮸ølr9mš:á”Äk))¶s„!7³Ýpe³¬—PTUÌ”L½P½ƒî·}rim^æÐo9ÂC4LòžamžVw÷)M퀣ã8ÄêÛªÞܯŒwƒÝ=Ô:éA26~½¯×ŸIÁ<ºžÕ0IqªÍÅ_})*úqÞMÿ>Ó i­óIøÅÚÝúp‚ž-_ſПBet»ßAÿM` ܳÿÂÀžÇ7Ÿ¸ñR*8BYÆž ~3Þ†J€(1¼Ú™”r[Œp2l’·ëïØMÀˆËrªœâÅ}¦B¡„ä¦Lýoæé2!ÙñŽÞ®ç¬QÉÑ/Þ1ÖÇÈ'Í-òÅðœŒH~PŠ…á¥g…>×O…œ /y‘i+GD$å9WO’Wb 9t)ZäžVk]ŠçˆëÁrrZ–cÑ2I+œ†€Ê_¯öštáêg° 5 5¯Æå^B/'ÔÁ'$¼|bÌ ú'H·g㼆ïJíë&Ý&p¹³¹ÙEc$˜å„LÁ-RãlÕ¶[ÆÊöŽ˜F®oèyõŠÓfþL ¾0ôÎõä~†!×$å5’åµ”þˆø¼‰ÞaÈ’Žo2»kx÷nîÒˆÆa.¯ãÓ2ªrö&[²Ì@ò’Y^¦òÀAØýR­‡(×iã³åòŽ”K³1)>|NÊåTr{®²¡ïbØEɦË`(£xOç4Ê–N$Ø>,Àè*ÛãÙÖ¸z§^ï€Àãã Iº°„èÇÊqñËvÈžòoÌ`Ò6×Ëᶘ™q áRV¯/Õ ¥‡¶)Z†ÄéJ–Ðô– $EŸœ(ªú"3gû®œ^pS:Ü!w…G½J霰)´%ßL‰êÞÏ Kº÷Ö¬)¢ÐrlÆÑÔN’®oÄW4E(6·LÂí†S2s&ÌÙÚRIÎB§>kËëJ¶¥q•ú—q%[«]l¿Vzd„Ð3»Ýƒj4ã rô ·ŽHm°û E‹¬òÍ`¨·Õ¤ýÁÑ"bÏi³­dŸŽ@ØzóO^Â:HY:åM+Uf˜ì‰W$!ÁÓŸ×^™“â‹h†^¡ø½Äm†û•Ø·÷M·^š©XŠ9+Zß8çEÛ­±Ëh£´ báÜWÔa\½€cÕö°ä\èn GJxIn WPŠÕ·GP_}ÍÙÃô‚÷/g@S§(†ü«Ñò*(©ìØ÷#·~¶ï©‘yVª¯%„øz8 ßŸÑHŸÁ#JàÈ |Åb©7cÙÀª¹ ä>ùGV-–Ì­ZO®gÜ|yy=ÅiúÇ‹ÈòX…y¤N·ðÀ3‹Ÿ…t°|Åpƒœ8 g8«ÆkÃý×ee࢞û~kÇ›]7í„F×ý=þè^¬êËDÃï¿Vâo¡¸máKpÁG§ÛîÕGÕmãY2E«êÓÅt,o½zqZ×§úy*DkNž“ gݺ95ÏošižŒô,¨,O%ô¬STUêÞsqià{,|¦…ÏôJc£Oº(Û~€³õ‡ìþ7oð»CäÉ?£ggî³…ö1x,iÏ £ì}XÛå$PÝù³®TóÈHØú>[cK§ƒ¡-ä3:ÀxòèÃ:0Ë'Õzo\ŸOp  ý>eOí>•¬-ê“:; ’0,XÔ]¸ë‹$g>~9ü?ô]ÍC endstream endobj 2421 0 obj 5401 endobj 2425 0 obj [101 /XYZ 40.7999999 96.9800000 0] endobj 2426 0 obj [101 /XYZ 32.1599999 673.939999 0] endobj 2427 0 obj [101 /XYZ 33.1199999 672.019999 0] endobj 2428 0 obj [101 /XYZ 32.1599999 611.539999 0] endobj 2429 0 obj [101 /XYZ 32.1599999 200.659999 0] endobj 2430 0 obj [101 /XYZ 33.1199999 198.740000 0] endobj 2431 0 obj [101 /XYZ 32.1599999 122.899999 0] endobj 2432 0 obj [101 /XYZ 40.7999999 96.9800000 0] endobj 2433 0 obj [101 /XYZ 33.1199999 120.980000 0] endobj 2434 0 obj [101 /XYZ 32.1599999 611.539999 0] endobj 2435 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 566.419999 106.079999 574.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_introduction >> endobj 2436 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 557.779999 139.680000 565.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes >> endobj 2437 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 549.139999 219.359999 556.819999 ] /Border [0 0 0] /Dest /#1e#b4#c5E#b1#24#fdC#8b#a92#a2#b0#80#7b#fa#83#8cO#8e >> endobj 2438 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 540.500000 204.959999 548.179999 ] /Border [0 0 0] /Dest /qn#ce#ea#a3#1b#20#99#7c#3dW#9e#17#f0Q#2c#a3#dd#8b#b8 >> endobj 2439 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 531.860000 152.159999 539.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template >> endobj 2440 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 523.220000 147.359999 530.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists >> endobj 2441 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 514.580000 170.399999 522.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization >> endobj 2442 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 505.939999 149.279999 513.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference >> endobj 2443 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 497.299999 169.439999 504.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop >> endobj 2444 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 488.659999 208.799999 496.339999 ] /Border [0 0 0] /Dest /#aa#ee#c1B#109#3f#bfP#3e#c8#d9#c7#92#bd#b4K#60#3cp >> endobj 2445 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 480.019999 180.959999 487.699999 ] /Border [0 0 0] /Dest /K.#0f#0f#9a#5c#9b#14#17#17#1f#8b#13#a0M#f9i7#b0t >> endobj 2446 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 471.379999 205.919999 479.059999 ] /Border [0 0 0] /Dest /#17#09#2f#d9#d95Z#bbEQ#90#b5#f5#ad#14#d2#b1V#e99 >> endobj 2447 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 462.739999 186.719999 470.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final >> endobj 2448 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 454.099999 167.519999 461.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant >> endobj 2449 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 445.459999 191.519999 453.139999 ] /Border [0 0 0] /Dest /sB#f86K#a9#a9#cav#88#ea#2a#5c#b7U#c8#b3#16#15#ee >> endobj 2450 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 436.819999 171.359999 444.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets >> endobj 2451 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 428.179999 193.439999 435.859999 ] /Border [0 0 0] /Dest /#f2#ff#e5#0eb#fa#0b#ddl!#fc#2a#de#8fn#0d#f3#b2#ebt >> endobj 2452 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 419.539999 195.359999 427.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates >> endobj 2453 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 410.899999 163.679999 418.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions >> endobj 2454 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 402.259999 160.799999 409.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates >> endobj 2455 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 393.619999 158.879999 401.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals >> endobj 2456 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 384.979999 165.599999 392.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals >> endobj 2457 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 376.339999 166.560000 384.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage >> endobj 2458 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 367.699999 261.600000 375.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted >> endobj 2459 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 359.059999 159.839999 366.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int >> endobj 2460 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 350.419999 152.159999 358.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions >> endobj 2461 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 341.779999 319.199999 349.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof >> endobj 2462 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 333.139999 221.279999 340.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept >> endobj 2463 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 324.499999 211.679999 332.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment >> endobj 2464 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 315.859999 133.919999 323.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes >> endobj 2465 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 307.219999 144.480000 314.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes >> endobj 2466 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 298.579999 162.719999 306.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities >> endobj 2467 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 289.939999 138.719999 297.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types >> endobj 2468 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 281.299999 138.719999 288.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables >> endobj 2469 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 272.659999 165.599999 280.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions >> endobj 2470 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 264.019999 200.159999 271.699999 ] /Border [0 0 0] /Dest /#2f#2c#3d#c9#9b_1#2c#e9#87#bb#dcr#fa#0d#bf#f8q8#b2 >> endobj 2471 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 255.379999 209.759999 263.059999 ] /Border [0 0 0] /Dest /5#8b#0d#3c#a7#dd#24#fe#9b#97#1a#1b#0b8u#df#d6#c0#7fg >> endobj 2472 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 246.739999 159.839999 254.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference >> endobj 2473 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 238.099999 234.719999 245.779999 ] /Border [0 0 0] /Dest /#40Yb#22#8em#c1Y#cd#fa#a6#8d#83#f1#aa#2b#db#de#b6#c8 >> endobj 2474 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 229.459999 205.919999 237.139999 ] /Border [0 0 0] /Dest /#86#25#f6#d7#8e#8eQLKiwmH#f6#de#e8#dd!#01#bd >> endobj 2475 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 220.819999 295.199999 228.500000 ] /Border [0 0 0] /Dest /m#ff#1c#e5#de#dcd#0ev#197#b6#1c#dc#5c#96p#8f#8f#0e >> endobj 2424 0 obj << /Type /Page /Parent 2 0 R /Contents 2476 0 R /Resources 2478 0 R /Annots 2479 0 R /MediaBox [0 0 595 842] >> endobj 2478 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2479 0 obj [ 2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R 2456 0 R 2457 0 R 2458 0 R 2459 0 R 2460 0 R 2461 0 R 2462 0 R 2463 0 R 2464 0 R 2465 0 R 2466 0 R 2467 0 R 2468 0 R 2469 0 R 2470 0 R 2471 0 R 2472 0 R 2473 0 R 2474 0 R 2475 0 R ] endobj 2476 0 obj << /Length 2477 0 R /Filter /FlateDecode >> stream xœí]O¯ä8n¿¿OQç¶F- LwOÈ!À`È!È!èÍf±H/2ÙC¾~ì²,Y¤hK²\®×Ó=À¼÷h›´%’¢~¢¨þé—ÿ¸ý×ßo?|üån_üÏ¿¼±;Øüï6ý÷Ç5AØ»ó¯Æê»pÓ¿Û—¯o¿Ý~{ûùíçñÿ¿½ñáñ ÿ1^\DÌ ÿþåoo?ÌÂßfÊ/ÿeüíÿnâöÏã_½ýÛ¿?þäùM7|}³n˜~ùïù.¸°ãëߦ‹yû×?Üþ6¾‚}ðþÿG.„rã=GÞã·ð(ü·~”6¾›–|lÎÅôûøÛÿþçÛŸGná5îVI.ÐjüÝ Ê0m­7Òÿ+’dÄC”f7g†›ÁrÐç–qâG ¡û0šÞˆú2ΔÙät·ƒÿGþ^"ÇNB¤•c¯35*£5ØXEþ^,Féá©bp7öcž#fÒÇÓZŒÿ2b~Þ÷I•/=–X{,qS7ìµÊíäÑFZš‘#n£rk;2ÃèìV`±„o…å=ìmýVÓˆñË+6ý4tizÈ誦ßCÝÖo¥^µék}®/hw7Œ›Ý-oô‚mNøˆw­ñÞùÏïÿzrûwŒc”,`t£%#Å8Ź™"ãâ¸û1ªÁ‡ž"vkVÊêh«¬êW?Þˆû4cVfƒ„àÙ“ˆ³§-ßðá×·>»i¦øëŸÇ×xL7ç¿~}SÓcÄ>jǯºýcòã?Þ~ýëhW÷ñ½­ÑûWØð¸bAüHݪä㊊Ï~„„ùsgNŽO² 1Ì@‚}†»à<«g1w53W8â*ÈøéqE“pË…^_A_¡(y½4-r??‹ÄpòVn!W²±p”7 ­5M‚n-C¿ëFÛ8ØŒ@¿+Ö,¤%tC£ï$ ÷ Cn=>3»[dž¤Äçâ7Âý¹o¹èçábaO3CíÌ$²ñȦQ³¶üôëè“yX®ÆOÞÉ=;Y+Óöww ºá WÔ9PW¼•ä®|$¹Iò >Ü®Ðr$ý¥äºu¾¹+?6<ó™lQV¯;Þ+?ÅšgZS‡o؉¹„–¦vÔ`¶áÒøeì9 ív=w|zü£#¹ŠA´‚ u¶Œ.ƒrðÈ{`€?ìѯ¸ñtÜReî+š‚ ÇêìÓlºì>ž˜®\Æ7ÆucÑWj^ªKEÈ*?‘­FÚVOÚìhe m‰ ÷ç’J@*Ÿ„¯"HGÞÒ¿Ñ™CÆ`À˜qŽ:c%¢g~ÈᴵɧÒô®ÈTÌñiå…­§f®â>ßX¦çÈŽiyô;öh¤#Ê ¢f~^.TèøsÜý„°;_=B uƒ}í±½!û⢈âDOm-Œî+ Î“;³fÐ+<Ž˜^Sÿð5˜Ñ¾QRþñ SG£ö' ‹½VÙЋyîíÀ(E­¸³÷aÞƒSÍܵ “‹CF¢ÈÌzá¯üH¶çÒŠ‘`zz4~߯ܧaÄiOƒ¤ÐMœ2¬°Å˦šÞ˜>Ü `:^c ~±àéÁû‰ý5¥ò°cãå+p»Ž dàU‡ìÏþ+zàu@ÓýVUÁN–ŽïÑ­]¹%é ð¶Ìç÷úíÄÁH F¥ÈîmiËW#6¦ôÒ/ ìl89ºö½mEjF—ä”ò(©Å8jF/؇² ޵ ¾ 3ëˆtžz•/7)MªË‡³Ý“ŸÖJf»ÆdûvCÐýRˆÔ`Ø´áU Ý#g—¨âÉøÎ³£&ô¶¸ã §—§+p«.cGK;–15£Ê9«< s£r…=)ÑðÜŒÕ3ÖƒÎ2´cFMzÄ;ZæÜXÝ>¦[‘xÙ„Ô¼ Vx¤«•h‹éÕºµhϹ‹^ E5EMnLÅUÅŒ¾a’\íæû¯X¡ý4Ô»?+í±dU£õ¡ŽÀh¯¿UãÄÈÉ@Hï¾¾a[£2åQMðûˆ"–'&VįÞ+>a2+–€Å ºI{ìéþ+ÞrŽ/¡•ªB‰&6—ϯk&RÏŽøz¤,uY?gH=%8•X+਎¤W·„eÓ•wÅ÷ƒIíM¨\q>wXXÄñýÃÔè!¾Õ'xË{®rà!ß0bµHîmVÞ¥³´¹ã§ xõ˜ÚEÑ©+ô3èU¼³0wg¡à»ßáw7­o)xÈ”KÜøDÔ¦³Ær·ðmc[ÑrÒ{q¡¯:†QÙéÛÉOõ>rÍ…ì_úý3ïžÕ)¾Dû4:q®×ÜÈGï±¶þôÕ]ÃË–eyºÕ*öLULýž½…¨Û)ŸyÇi^§©1-:3êÓ®˜Ý¬Úú‹§îœ ã®0øiÉïbhõÉ; -y:â³Nï;Æ:|IjZ>’M~®C]BaÌ~#åžV‚¾9Ÿ¨›he¯€fGÂÕ2šµxAì7²Vh Ù_­Ü·]i(+kÊë’‹PÑÀû†A/ÂцX>Ñ® ‚älç VËÎ\@ó‚Wý:…ÎÙ Ò²9ée=å&—2,ìg½Tä »‡³K2î~˜Ù4·ë_ÉEŶ¹š5Í#e?èÁè@:Ó¡ªOÊûØ@E.ž‰Ÿ‰à+üÆëm†ì‰ŠK‘Ýqýh–áÅÜ|½¢/óÑÜËz(¹Â‡eðžsÐ ?Z¨E¹i î9Àþȼÿ‰|9ÄvþT!ï|6"8ls{R^ñõÃÖ/¹ªçUR™”ãsŒ|ëÆMgL,›û´SÞðé‡á|.=¸›™*ôÎì)_ÞwçÜ kùBìšËò×,c¼ßÿ­§Çnði…d¨ñø&ã]rÍ%ýŽ/oyûð‡¤M8j^¦ê¼¢¸À¼b§ ßw•xEˆ¿ó·ä¿UWtî„Sz76Õ£¥„×;>È5!©ݤÑV¥muN£­Ú6RF4¯³žËò—J5ÚÊœF[d¬ÑÓ]rÍ%ýŽ‹5ÚºÝ1¸f8ê2ÙZvÙOzùW[gŽŽy£R® “9nWzº`Áž‚| WÒkûL/*ámb¡|âÞrâ],eÃÖb¦'<áñà 2`HÌüPú2Ó]:e£S1îè¦7ƫۘYbYÙD;[À»úm ûz5}Äãì¢XL¯ ‹bõo¾IPÚ|ßÜÑyËç>:YS ºbÃl5⦠Î.{>é^*õ¼À ÆY£³9 Ùu½‚×+xÎõ }âHA®÷qKÙ°µ˜èz¹Ë¹Þ)ªIÅŒäzwé”NÅ\êz…ÞE6jlº¥ mËn:»Z×{Ê3”;1„¨Â¬ ':i`>9³ù¤üƒòÚq5)™}“®Ôÿ+öš©&^sp9ÕÚõšÒ¯)]Îk*ÝÙHA^óqKÙ°µ˜è5¥ÉyM9@1#yÍÇ]:e£S1—zMµœ£@/ØâR‡ ©} äZS˜Ñ¥ÓÞ+•{\µ€BÛ5¡Ø,ôÌB›œYhõU;l»Xʆ­ÅD³Ð:gZ!1 ›Åã.²Ñ©˜KÍbhA[JÒË\—5{ úfnìíî-7®aÁ8„²kB±qŒËèœqµÞl\»Xʆ­ÅDã22g\Óqj@ŒÀÆõ¸K§lt*æRã2 @éO§)JšÛÛ…xlSMð.ûý^Ø#<§t¹ Ûtº„PlÃ. t:tº Ðé"ÐéR ÓA ÓeN‡€N—:]:] tº—:]:é­®åPË­îuqÀrwƒÕbM(ÕyÃÂ4êUFç ‡ÓD:?ßÅR6l-&è¼a9„É0ˆ0M¨óó]:e£S1Wê¼á @±4DZÆtºÖÙ,(ÜÞcô¥¿¯& ‹ØqPlt†ìË©5¡Øè(ŒÈFB€b¢ £“ ˆlØZL4:‘(Œ€ÅDAF'@ÙèTÌ¥F'€‚/GâŒòRŸn+jF†)>k‰ * ùjjW lç-rURÿwÈÖC¶©ž~}“Æäw×#*€M•挂ØÔDAQl*²ak1Ñ#ª6eĦ& òˆ*`S‘NÅ\êõ‚Mõ=ë² vÛwÚ¡Bê—;±ÚQB¬Ê›gÆ•ª9u¢Gñ$©J=RÚ&£Gâ.×H»i€ÞMä<Ò½‰‚<ҽȆ­ÅD4ä=3@@o¢ 4@/²Ñ©˜K=Ò°za¼õ´‚µfhÜÄäšpfú“íøôÚ^§]ãF{êÈÓ.Oê¹;¬$I¦ ;NXs »ë-ÀGÍá£ÆB|t¢ —h>Ù°µ˜èm5⣹DðÑÈF§b.u‰6à£åëê5¶¤¹u9:íHþ mt …cjö³;:ØÌµ&œ¤) R]ç¼-'>W„ý¼tµ´çèÍ$Ë5ðž7³ ß–åoË ò=Q 7›ïb)¶½™Ë"ß!ß.ƒ|»ˆ|»ùŽb®ôf–äû#9å¬8V¡¼ølÁFÊÕ]ûÔã}ù´Åb7gY„ÂÙšPl…@á–ç p+ >QŠ…G6l-&X¡å9(Ür…Oh…ó]:e£S1—Z¡X°Ü“‹ìÉ*? ©¦>ÆãÙÏVÄ<<½&œ8²k ;öH  –ÉGC.û©AœöδsŸçºk×CIM[™ƒ¦­„ÐôDAJh:²ak1ÑCÉ4m%„¦' òP2@Ó‘NÅ\ê¡TÀ?SqÂ~©£.§ÂZ(*ww‡NLk1¾Šjƒ-\™_iUÀ¬[Š­P8Öêk5„c' ²BàØÈ†­ÅD+Ô98ÖjÇNd…:À±‘NÅ\j…:äW~ ØC¹2¹õ5œŽÜú2â±ÉLú@)ç¬ïã@É}}£ŽŠZåëß<Õ(é |¨ƒV­Ъ59huì(èw †Vç»Xʆ­ÅD÷frЪ5Z(Ƚ™­F6:s©{3ON=í›wÝ” wîfñWù¾rOo kÍšp¢§·hß{Ü•vhó{ÚÔ“O´¹¶ßõ‰´. Ð:к @ë"@ëR€Ö€ÖÚ@k-h' ò‰6´‘NÅ\ê]h+¶ÔôÍXkAžZ"ÉSê\¤=ÜXü› ð«kB©9àWÇrð«ã~(ÐÆæ»Xʆ­Ås,¿:á׉ml¾K§lt*æJsú»Xʆ­ÅD›’ðq¤ $þ.²Ñ©˜KmJð±¡ÂE…ï³LзèꑜȸÑåXÇþ‰ç ™†-û*ê>uα<~àc¹ïR!;Ñé5á¼iæ$(µÐ p®e¹·ïàSÞMê߀`˜uÿ¬·ò-Ø5ûþzV¸º“*°®§”Ù7Q`‘_ß6äLt7¼Ð„:³P2R5÷5Z(ñw±” [‹‰á…Î,”ŒT†Ä …—NÙèTÌ¥á…n¨ÍÐrÆž?©B }rmŬ¼Ár›–_Vw¾²|˜×1áV­ 'óJKÁUžjK®8mµé„x‘kÆ]WlpÅ&³X6R%ô‘-–ù»Xʆ­ÅDWiçäÆ7]!øŽ~“ýª×-é0ëÄtU‡¾©žï©Þw¥›,U¤íšPêfÀ…à9àBp\Lèfæ»Xʆ­Å7#x¸x Ä`àb¾K§lt*æR7Ãjc6éQEvAÅ@û ­\oE˜àO`W$œ¸{MÐ;MÈíþâ+®+Ž}?P€»OÒé·Qy `KXª}ÓñF6§Ž»nT¼IÈÞ$$Ä›& r£2àM‘ [‹‰nTæð¦Ç´ˆÁxÓ|—NÙèTÌ¥nT†Ä ?“׋F ´PÐÔ£ª,¶å†YÍû?U~ìµxx‘^ŠMIPLè(&4Å& 2%@±È†­ÅDSR9PL(ŠMdJ*€b‘NÅ\jJ:€bôÂmy²Yé!®¢ˆ4C ¹õØ•¶‘…ÿ:ΤbSí2*jV¿ëýß/œuV;ÓakºdkB±ó2+†2+ Df' rž& ³‘ [‹‰ÎsÈ!³b€ÈìDAÎsÈld£S1—:Oóä­éMG¨Òì[Öx{UÑ/¦v¹5á̉žývŽlÊèlX#:t®,‚ZÆ8¨£› :Q¢d²æR•’†åTj×IZ­ ›ƒÖ……ÐúDANÒh=²ak1ÑIÚ´.,„Ö' r’6@ë‘NÅ\ê$](¥ZQ¼e“OE@Y¼ôµå‚­™GŽL=à³*NŽ©)º\‘4Ü3ªiêK{àòµ“‚ôœ •ã;¿¿ÇøWÇøn uJ(Mvßuß »o{*ë¾çÔ]Ž–Ö[=ì‹!jÇènñíèHÕâò.U åycîÎÂ+¾87»êZD9à«ðŸ(þËæ¯Ì’ÿÆ;I!û™Àæ;±TCÚ»‘…{t£*)¢UªTT è‘ñ]³•¹B‹zy¢âÔ´ ì%ûï—p¨Ø'xàpÈ–$ßš"2è;{œJ‡™´|Ey¹žŠ´¾®µ9jÏŠP‚F†éå—É.§lÊ«Ùu9÷£¥€Oý–Ìó뮕ÆH'3šÃqæœJR‡Ô˜Üã-?ø1‘q˜ŒA^ñ±Ž¥ ]J}_¾5Ž€_?ëÙ¶ðs“Âiòë¹Î𨭥6}C"GŸâWÕ”«ÈÜÏ7<Àí›,í=Â&-1Íã23¢[a?Ó~2i‹{ª0ßs†Ñògk \vœ+úÏ´zÄq8‰ó”yq‡Ð¯Pž°bÜ©H¡¬¨øÝc±êЂaKa™–—~)Iñ:ò“•Ž/Æð§+k×|¿.çWŒ’n¯OÕð‡n´—}ÖêÎïcSÝód@á÷#u­IO>R—ž‹ tâÄÑÃ)4z¼‡$ô«óFë'#O˜`†äç“&5ä´u£N†¤®<·ÖE‰¦(Eª÷~ž@E¶NÅÝAöj¿zey²LŸeÇǶ8%óþõ`¦MªÒiáþ+Gp©>ÑÉA@oTž‰Ô§ŠÝÿºØÁ÷—‚YÏIe{Ö|]\ºÀåߣ˜ö(æBHõ÷2HYù©©†sí)F'Ž@Vr0møÅ®ˆNK™UÔ>]ªÃ½LbDÙQÊÐwK/xGüy¬2ì.¶Ò÷ Ã.íÔ#8Ûp|-Åô{Äo}vÕí»ür…ßYPl´› ¹[ º¿zOU!€~—Ï©ûäövÝ"rÎXP±$Ü’¢ó¤¶ùÆ”ãÇ$wÊ4ï\4§ÂC7œÕJ8wá¦RÂe­º®¤¿'÷U³²½ËO“£‹Ç¤C‰¤t§˜þœ„Qô@Ê6‚•Š ¶ë¾¾95»ì­PÂû[._„9ÒýòVwöLj±ìx/Ù3ù Ý÷LzáfùZô±«…ôŽÈÏä$pð¶0z‰·0æ¶m~F_Fn´ÌðÅOï}À‰=+˜]Ko ]ªt}eMë‘ßÏ;~ÿT3óýs΃lªÙn9¶ ycu7\ñª^÷Ìä3§ôàÀG{Ðnì­ç[õ¹£^Ó÷yîÊâ"Zé€"ÚBì§ýw%ÀøæÈ5áGò’›þ‡»|xײgZä0òK¸m´Ý ä,Æ3ïFÊñCôTâ˜g7gÞ€Ö¦/u>|h4¥¹‘oÝÔnœÒŸÛ’Óx²·ûù¶Øv`aùý²Ý&°  ¶D¥ Õ-*Š@ž´…¯L¿|÷Lùõ–jNïý¶ËÒ}ñËí Rs{Š»õŽ=^ññ&†j6®ÐÜvóºNÂ&*òÖÏÍP.¯Xˆc8äœãlŽ$ˆ6äŸ7œÆ†r|iC^Å>¸®XF `Üé:G‘*ª8×àY]—ZÖÌèÁ¸<Ë¥fõ¸bG`×]-Ï龦%‚ä7j’së·ºI 7>~q.[ÜñaŽçn’©¥Eü”{¸ù©SwbænòÅLæÊl“RÞ…Ë&8j}æž„v•“cÉgùÌÜÕFÜ“9,<ÇmÖÂ5åy¯WÐÌ~¦žñƒEî §¾Ã^Ý3¾Çj¾}]að€ÖM¿ Í—oœî9²·¹&ß‘î9ZH½öçXä¸Ñ=ø‰ÔkòúÝèÜÐQ’›wn¹gZ¸}¨·Ö¡û‡¶£9-½@Z m¯[‡lƒwfýÖ²áΧ5àÙ-¤ƒðnÀÈGãÛÏoÿBÏwå endstream endobj 2477 0 obj 7515 endobj 2481 0 obj [102 /XYZ 40.7999999 350.419999 0] endobj 2482 0 obj [102 /XYZ 40.7999999 555.859999 0] endobj 2483 0 obj [102 /XYZ 40.7999999 555.859999 0] endobj 2484 0 obj [102 /XYZ 40.7999999 450.259999 0] endobj 2485 0 obj [102 /XYZ 40.7999999 350.419999 0] endobj 2486 0 obj [102 /XYZ 40.7999999 450.259999 0] endobj 2480 0 obj << /Type /Page /Parent 2 0 R /Contents 2487 0 R /Resources 2489 0 R /Annots 2490 0 R /MediaBox [0 0 595 842] >> endobj 2489 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2490 0 obj [ ] endobj 2487 0 obj << /Length 2488 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðsUDŠºEÍ9I> EŠl·Å¢Y4݇þýÊ–dûþHÍpH[¶ Ç9´(r8œ¿¾ûãç¿ïÿùÛþÝËçÿì¿N?_>ïÊ¢lÊñÏþð÷‡Ë_讨ôø±íêB÷‡?û¯ßvß÷ßwŸvŸ†¿ïTs|pú14ί;üí믻wãËwão>¿üyøô¿½Þÿiøß/û¿þmøñÓÔßá ßv]ß>ü{ü ´ÒÝðŸËO‡Æíþò»ý¯Ãºc¿‡Pºj˺‰Ç÷Ó£êø÷òQô²alµi*½WJ>äøï?v?½†QôF©¶1m¹¸×V»Õõ¾o›½¾Ò©3·e]©ØŽ:SÊtt‘Š›š*MëïŠMú^Ó¬ÛØyÎ=E¬o¡ŽÔ13› {*ºF·¦.û~^<Þº¬j™µ8õKÂaJ¨£ª–Y ÜwÔº¬Ž“lc¥Ï©§hré¶êh‘ŠšÙLwØ›îf’Õ};K#$õëZõ2™£¨Ž™ÙLwØ“¨ìi*%${枢IØt­PG•’=°'öh[3N²/c§yê*¶£¾’b‡©¸©Í”Ç]qIß”j²:Ë>r¢§®b)Öh-CúãˆTÜÔ&Ò»]}ñHôÙ#ùîyðý—Ý»ÊTÝÁûòó0’£7þø2L·þ3˜Æfhýiÿû²Ôýö_~ÙõEÝWm=º}cKù¶|€-½EÔRµ¨EÿŸ-w0Ÿ÷Ç–_žH¾ÂM=R1Ø’g¤ R·xVHÃÞð¼ñ{ðªbNh ÿâ]G]¾‡-/pl°¥„#P ŠjE_9ügú g iWÓ sUÕçÛíàCLã©è´ÂñHBÈŽ5)¢u„¬X§>©àÚ¯s>x}j86Ü⑊X’biÅGk1žY©¼„Ü{{Í©ƒ¹Š£í=4¸9÷bp¥ü†¥?Gc`>xͨõŒz:­ÇÑy‹9îM_bˆÚõö¶Y g-䌴ÍKD¶e•zÏïÍ{Žbl¶ÐSÙB9£mŸY¢`Zyè‹c[ ýŒùÅ#7ð~fð?ŽäÜIl«ïblÚŒÖw§Ú·oMJ¹ Æ”ã`Ú٨ƥWeÑ´ª†c3_wþÅÈ?mQb 36\´”V'%ìdÚƶë¢ÒÒµËÉW:Ñ ýÎ{&1¯ ~w2R¸)ô‘ò>Z`Ú³Fïtß,_&<èr±»wȇyËš=xÏš;Ïbb9Ü÷Š6ÆÉ›/gÇ—à·{ƒˆå!Å´Wõüй¥·'º|æ,Ö‚KšÛmÆ ³‡ç½Ágo;w8#Âlò’\W Jâ­²pTG¨êAª;J/!C8ÝcõåÊš1& Tq8q¾” z¹Hs—= ¢$'fo»W,•8ünc2–® äVš#\ ˆ; my³€q)Ôš»?0‹¦9X½·Iï¬Å{´ë(›Œ³l“¶„%Ÿû g·9’!¹èueé,Ããõ.(¯Œ†ÏæòýeÑlO‚ÅOÐ?“ÄÎàfv§˜c9`Ò†¨‘Ö]oŒ5ôŠs)ñáÑrDMê•T•²èá ­‹9OÆU#øµ¶_Ä2èoX˦ÙÚn¯0.Á20)Èê=!ÓêÞÞÄf"aÑõe##€„ª£J«÷8*°{S­«ÇÔr®0ÀŽŠcµÝå;.ìí°¬l½:Fî~ù ›ôóNïÍ j]~~  ò¾Ê™nÐ_KŽÃâ€×Ñ÷§“¶yûµî‰Ò#ËÕ2! CPË„H:E®ß¿]°iðÄœÀYŽ×· ®¿ü”ѽdž4!®/ZÆ_Îs„ã OdÚù*×¥”ÓUc j‘ƒ%–ŸÞÐCØx‚γ£»æ†ŽJEÕóŒÏ-?ÂîaX<RŸRú–„p9GÕ1.g×,ß¶nPjù´\ã€q…e:ö÷§ ™ÃÞÄØmM0‹’Ú±T„èPnËZÙåØžóÆY—äèSžm•ÆVEylÌm›®q›&w^ëCÝàŒDb¬·öîÀS6#ìb,W2Gâw ‹IyžÔ¶öæ|ä Å:À<cG'9è!œ2³LÇäP~@Œ_ÃR#Æšñä§.›SÊ.ŒƒO#pì§®ád3£÷¤áPq”k3­a ž'M §aŠ2›X…©Ü—ÂÁ-xM9ÉGøäRÓ f¤}yRßd“Öqr<>{Âóy°$|N 0¦Ž§786ÏÎâÈ7Ñ3HÖÙ:Cú{ÞÃXïxzÃ’‚QhÎCÆ‚ENo>À«€G€÷6~†Ÿ>.`K †TÕ9¿ÔJÏ1/}"T9þ±cж¶ZÔ«è3bà4馷&=éleft€Íí]a&é<ÑASe1â =ó[4"‡š=mT…Zæh‰ûÏØ>ÀùôhK8Ÿ³sæé6ÿÚ¢²OÄ&‹³)ª£ã²Œnø=°7ÏL!ݪh“ξ6L7¼>˜:¸rHÄú¤|ªf®ßšë4;ZüþRcq ˜N8 €ïó„lÒ¦'Š@½.~Ö‰i’«ë´²rÙ_Ó1âµ8Ç3.†Úl(š> ª>±È”uÞJÎ3ønWãÞŸï€7kxî*ÁÏà|¢\·¿àIpcl¬;^r•v¨{=OED@™ŒÃeNA÷Éu¥a .Ùók(˜-‘q±¡ƒÏ¨ì†¯ÜÝjW&‚6æÎ¦uàÔÀKŠ@I}¹ý}_?2”?«ž\"†“C˪‹f´¤¹k w-ì˜+Ù¤dÁ«„³”£Ø^DØ XD‘¨’R1`Ï5¨ö×N™5|/|®Ò·¹y&_T†.uÅA£r´o¨·ôŽx£°ýÊɃ•DÇÍð} : TÙ­—#CÕÊZñÛI°ÂÊœ# N ˜Àák¤ Š0Æ\í”yWµ¶y/}®WÝØïĒƶf Bâîòç.LpBî0ÇFæ8’”w•¼HȸxtÓï ÃÚ¢)_ ¯*h@,©díñ$j^PÝÏi¢!}Õvµ­¯–Ë‘€§´-KDâ®Ëw+Þ”ôÂ2Ï&dðsøévE£ÃŽ»H`ïÖ¥ásÞ2Ôœî½e!œ±[#Š-ô¸5ØQÄ. ÆŒcàp2ó žÊCQFN Ëñ…hXÏ-+p>:Ëc×8å /Wéâß3žÝƒZ¿9na¨|<º‚0Ö%é£á­êÞ2òK[ÿNˆîa8å1Gä1H–#$YôÑ0Y„#ùå|êâku$%n퉩2»BöL©ˆñJœâ,V÷o–Ðsâž/Ex™æ¡AÆ+Ñ:sºI_3)_áyËôÏX\¼;'1Ò.ž‡7¼éäÖɤ]/[v|ã^÷ê›s/ëº)ŽôçèL78‚$— äÑÕ]µéê(]}¾I_ê˜uäÄ©0å¡%â‘Ø ÛÙ³»ñåx…1W@îÃû¾‚_`Nº½ìÖ¨Œ÷ÔP¢ÜÉ>Ó*bŸyJ „ZòÌΜh ‹-ÈQ;p&Ú÷æí+¯•Nyl°4éqA>–ó §à€Å”êu²T1Þ5 ÔÀБ”>^[Ú”$zs´ð­*ù/@ûEŒŒPÑŸ²|Ï{ßùø9¥ÆèZKe$:7tDÉÍËb;ØêroÂý 15Ã2KÎ,(’2"äyá*œœlíqºÚ6¼oq7W¦¼~aª÷|¦{FìSSš9×—ƒ}ÂÞ?çŒÇz<1%* GÀE9Þmº¾¦Å"ð …ÊȱMÁcã!qMÙYYB$ùò€8ŒF•up…6þ]mD~³Í|kzs|ÄjÏ8¥7üVœÜ¸ýÞÜ0^‹åæ˜Û˧ ¿µVîÝð[Þ5}&üV3|cÓÕQºz™Í5üÝlXŒÃ¦_¿yVÐ]úò¼ôŸ¼‹ï}4È5ƒ#¬†i\«tÔ«f,¬³¯ÊSwTMS4×/éM1Ræ¢e$§n‹özÏöJ˨ªªÐ½Ubo:5¨‹fŒ|Ÿ[Zøž>ÓÃgFvou¡ËêÐd³ûµÞF–ºüÍ+üîò¿2Ãè™é0öZ‹Bó˜Î hÏL+F™û4¶ãˆàºÃg]«öíÆ&­¶ªáñÊa>€|=™K×zÃ+ø ù>ƒÇ†WÐã°·©¬åµg8½½§ÍC¼>xqÞÃY¸[ð~¦¤ÁÊvוM¡Zu„h\Š— ˆæR# jãý§ÝÿÐ3 endstream endobj 2488 0 obj 4648 endobj 2492 0 obj [103 /XYZ 40.7999999 128.659999 0] endobj 2493 0 obj [103 /XYZ 40.7999999 128.659999 0] endobj 2491 0 obj << /Type /Page /Parent 2 0 R /Contents 2494 0 R /Resources 2496 0 R /Annots 2497 0 R /MediaBox [0 0 595 842] >> endobj 2496 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2497 0 obj [ ] endobj 2494 0 obj << /Length 2495 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õð%Q‚Æã™90Æ@AÁìn‚EfgùûQ[jw›ì"‹©»iãËâ£ÞU¬*~øÓ×ìÿùûþç¯ÿÙ›~úºc ëØôµ?|ÿpþ Ñ7RLuß6b8|í¿}ß½ì_vO»§ñß—ï^_œŒSLþþí·Ý‡iòÝô›¯Ÿþ2~úß^ìÿ<þï×ýßþ>þøiïðßwýÐ>ü{úÀýøŸóO‡‡ÿÚýõû߯%ô¯ãþý 5ð^E­ãåíUþú}þ*šl\[ÛqÕï9‡Ï#8þûóî—q´·e4ƒâ\wJ3ïQµ8 Ëx»t·l°µöæ7H™f ÃŠxÜÖ8SÚ=TÓ+É¥­: á€‚¶ïÅøYËù+dëz‚a«£¨aCJž­ú˜‘G"³1vؤ¢Ùà8T4¼tÏap\ÛÚòx(2èû™¾H >©j&‡4 ?¬(‘ÂCQA¯¹ê&Њ/bÇ¡¢A/uáÿº"·µôŽ¡È o‡‰TG(v£Ç¡¢!6ð4çuEëyŸ1È‹OŠìnô†0}Ìí,F±i1£;ónJΛVuý¸8ý öñ 61¼:ýbÂŽjÔ´±3þ3› X7 Å5Dïr8ê,8/, ?‰Ú_ G˜ºkïûo”Y¸°€§»˜¥qÛHÑsÑž‰™Ãã¥áá­EÃù,Pˆþ)ÄœOº‹‹ãÚó}1×j fÄ7F˜‚ÈQþÌ…‘c®ÑÁ1þ¼k-Í‚šƒeý·¥¤ àú ¦ÊœòYšoZZ°Å „„Ïs,#Àâ^L‹ï›~`Ý;|ØL  %¨Ç®’è»R%i5sñšþX³™ÕÚaš4ZûÌò¨FA”þ–Z8‘§Dy^·¤?ú%'MCñ6±o…=5B¬„Âó‡«vD^²køaôrßÃ]}.€îÛ’õïµê%ˆž`¿ãÇñ!º!atƒáÁ´#V”8¦k†£i0Ê…¡£ ŸŠÎwêÀ„e4¡CMAêU­ïü±ù~f‘ft˜Œ)[Ë5$8©޽Kcõþ9? ÖmóÅÚ :X·ƒ¶ ƸàµíRR$[ªþñ3‹Û)äê`cû"–‹nþoË¢(§6}sЄ|©BŽëÔZËŠ‚í«„Á¢æ.›-ÏÄIŸ`Ý$ ×bë°Á]+ÏlCŸµb(LÿÝ„q‚ý&ŠÄ k‹bKõŸOnˬ´Ó+ÌÚ±˜(=Ãþ4¥Ø™@çÕpYMŽÒÝ@Ça¥¯Ç#ù ”8~㇠NÆ¥Ä10ÅSdÅâX=–¹ ›§SÇó Ê髃Æû*ñ·ÃíN ŸÊáQ$¦Ë‚þtÕ¸â~è·ê䪓oX'q=ƒeWøIâBwC½8^XŠz)ñ’R¸ÁlµèvYWk¶Œ“ª«·¾¨yL<¶6åÛÂyÄú²¯6å[ä3IßzS>ÝÑ÷¬Ð^(ôî97YSw­Ññ(¢J/ hÚ®LŽ(¼p4Ÿ èÒB©.Ô¯i3Õ¾Žº t޲[IYh ¨¾ Xbb ÔÖßq)½a×r ^H]~p9\NAmIêâõ´H%4Úð(dMÁXê_]²$®ï– ŒjIœÓ|®%qEKâú¾üyíç®þVþ ˆˆzðçC¿WZýPrË:lý¹ë ª ÊpB/A„p XeMM2XxgÃÇ´5É &\/õÖ$'N·’d¦5 ¥ž(Ž€:«d‘áÐFÐW{e+¶ªŽ*¥ª‰5Ñ"½Uqƒ‰à#øl㉚žN0-háXÏt‚§™®^áuØÕ…½ÂŒ§ÇBq“ö²dG𰧏 nùæÇùrÒv­0+ñ€€¶Àôõ¤ÌRÝ· y\źˆ‹prÉ™ÀÑõ †¤¢Ô¶÷¦$§±z–†õŒrß`šËbò׃sbs%ŽËSäÉ… 2…bS‚/ ¿ÿ¢C´ÕdÕrÖtš¿ƒ´ö"JÝô™û)îîö¸é6YÒ‚×ÊÙ[æJ@•&åðÌÓþŠ*ïÅ™áú8#Z¸ì ¼ÜÚ•Œ1%ÑØð%ˆOÛ"°\,ûš$B=S€ô¦Œ”$a·lÈX 8àû€]”>ÍËÒ&à¦h‡é•"}dMÝÔqeè¦VOÓ« t§”E1O‘mË!‚Õ²“’tJòè΃徕²@責Ù1‰…Ä©"e(cR¸±¡4ì6‹8(Ê9mr›¤‹T,(§ê1ÕR袀k*ºpôȹ¢P¥‘PDˆøžG ÛuW d¯TKé§­µ¾£D8râ§þ¡GÖ‡åã% €XHyd›jw×smU“z“„ 6¦Ó\îép\¢K¹–…9ò:pélÒ;z)·ª×Œ'æî-#çU­Þldmå4b ÌnuIhqB¹Û^âpK.Låx÷Iç¸éXÒy¤ØÄóà‚y<ϺåË3Ͼ­±ZÈ£XÛ‚:÷sOmAµhw ×¶ 3D´ZÄP¥ßÚª¯ZÏ×l=×V}×J½µUŸ§[iÕWFWr'UWo¾M–\Äà±¶©«mêÒkÔÛkS§¥Œ¹ò`ëmêdûÓÕïÔŠ©÷S^Ê d)QÎð('ÂgwIz² ’99Éÿ¨Ý>69·¿¢ãsG>D@%>`©ÞMq*\Ûa¶•"Št©Ü¦+§TÇ °zŽmT¸ðÌÆ¨6}”íùç•S²¸£*ÅLPdì£è°˜:Ù›VJ=½¿ƒÐœÚ¤0(Ì£FêÔ˜Mý™‘”J–âúÝUZ!Ä Üd}¼Gu§)¶¶×‚åªë€Ò@ aQXY¼s 9âo"iCKª,¾] m9eyòo-+›Aym¸µ!,éO÷–°ÅåN£&{¡‘Œ*Yg°hÞNTD ¦Se‹_ ðßETGçkêœz "©X³\J ç²u°¹>œ×T‚v =Drv†SÒö7ÚKÍ£OQJÎKÅÎê;e’@ÍéÛtVÔíô¨å¬k â›Íç.¨ﱓÆg+^¾µ“Ü䢄º~ØrÅÞ„ÿð¥îÙ© ²(:wu?*IC‰ÍzXõt݇(b.›ÀAJ¦H@Šç臞¬ÚiI¹ë·[Lñ9èw›íœ<·fI— P|˜B¬à/¸Ò€buù îrŸù“V,UýCVýÃÜrJó¶7i¯@ —0æô¸ï"IŸ"߆쑧êá™­i5)§ÝØü ð\˨Nl¿“ºqgElÚÌ¿ YJHÀËÜ"4à¢Ò$Çþ$¾œÒBj¼sʲaËkÅxÕ MõµZ–tLÞ„ƒŠ)·(ÏÝ‘¤0½þêÐ.Ò+A$îÉœ" òFUkºÈÆè‡ ý°)-§•ÇTNñf˜³éË\®jtk<ááïßÐ;ó>—ÍtɶEÅœ5Sä÷쉜1%Ì ð,çºF¾bð|hm³Ô7J+˜)‚·ÍDÖ~2"‘Ïçí',:vMGr¼# ;øíè+ØpwÌCXµó¬Ðnõ±Â6ÓyŽ£ZÆ)¦'½$’Ð ß‘ýè›) êã<|g %õ€žd ÜÅõƒ/ž¸tëýàIñx¼Óð„£Ì7þ9"õ‰yR} ¶m»%¼.§ZÑÜÐ+Þ„g0æ³þífhÌáh÷Ì›==ù!÷€,î’í¯;a”/m²M’£ÍnFiµIhªÈa“—-ídsÌN-·—*ÕZF`ˆœy(ã÷þeÜú¸­ÃÌ?¾}wÀÂ";ñÉ Fç«ËþP·çã6.•› ¼k&›Kžªg‡ kºË±ÖA5 ë@èF_ÿú“‰1¥lÄp19 m›n’–¦¿4Oßà;³M*Á^½Sô^mbÌóß<¿5È…~AïÌÂâÒŽö1›.aïÌ Ùû¹sAu‡Ï¢}ëÍÌ1æ ¶g¡~is˜ ]Ï}-/†1øé¾ƒ×†1è Q8ÚÄ»ôe´‡ðµ9 ƒñƒùˆ2 [0¿&†„Á•qß³®áWß ¢ ˆó#‚§”Úxÿ´û?‘ endstream endobj 2495 0 obj 3837 endobj 2499 0 obj [104 /XYZ 40.7999999 420.499999 0] endobj 2500 0 obj [104 /XYZ 40.7999999 420.499999 0] endobj 2501 0 obj [104 /XYZ 40.7999999 384.019999 0] endobj 2502 0 obj [104 /XYZ 40.7999999 200.659999 0] endobj 2503 0 obj [104 /XYZ 40.7999999 200.659999 0] endobj 2504 0 obj [104 /XYZ 40.7999999 570.259999 0] endobj 2505 0 obj [104 /XYZ 40.7999999 570.259999 0] endobj 2506 0 obj [104 /XYZ 40.7999999 384.019999 0] endobj 2498 0 obj << /Type /Page /Parent 2 0 R /Contents 2507 0 R /Resources 2509 0 R /Annots 2510 0 R /MediaBox [0 0 595 842] >> endobj 2509 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2510 0 obj [ ] endobj 2507 0 obj << /Length 2508 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õð%Š‚3cO€ Æ@AÁl6Á"»ˆ³‡üýH-J¶I}”X¤Ø· Œ{,³X¬*Ö‹ÅÒ‡?~ûûñŸ¿?|þöŸãw÷óó·k˜fã×qøþáõ/„i¤?v¦m„¾Žß9<Ÿ__ûŸ\ŸºýÃiŠàoß=|'?Œ¿ùöùÏý§ÿÅñOýÿ~>þõoý¼á~9«‡ÿ?pÁ…éÿóúÓðð_‡¿üîøk‚9Áþý Í%Yx<ÏCùéûõP4Y[Ûi­Žœ‹ásOŽÿþãðSmF£±ŠóN«Žm†Ú‰lkùÑvúØó"¬m(ž ÈrVЀÏ[gª‹ƒjŒ’\v¢U´Æˆþs'ÝWÊÒµ£a?*—Šº ; ³²_õIæs–6±ƒ¢î#X{Zfî®D‚M²)/L™pˆg­ÌC"Ó]J^ˆî¤lr)¦Ë0*Cw‰L÷^§iÛÜUN²É¥µ-hÀˆg­l¢;„D¦{×ê´írW9AÊ&—…è>`ijV6ÑB"Óݶº¼OrÉeY[H¿•‘w‰J÷Þ™sZ¹S¹ôšAå=.E ñ¼¥9ʇ ¾‰>ÄKôñøééðá WÒ ÁÖÓO=&§ˆmüñÔ/·íÿÓG!9>ýxü=c\ýáøôóÁ6­•];†xîI‡ž°O艀O¤†Ð¾@ àŒµø1°§'O=Gv§¯í¦Y.Ÿnxúšruf•íÄc¹/à“ÏéR&lú‰@ƒØ ¨­"šëXˆÞ?‘?ë‰Pï9^Rc_g<†y ÷ÃQAF#\ ÐÚT´FfÊU½Ÿº–e‰èhìµá1Ë¢ ÞÀ–[£²–…gµFÙÁܾ1[@ѪvÁ–%b%>—Ò·([ÅNÊÖª)#’‹×' Ì eþB!Õ"B§¶3ÅG ²r¸Eî¤ìYHÁöU`¨‘-„UP=×X½§ÜÓâXûDÈà“=X} £E$Ñ¥,fjsŠ ÄH Çë„Ï­[„ùN°tG\Mc,ÓoµÞ—ÍZ6Üœ«ÆD=–ÚëQ£µêíj—|4“ˆ?LÉ«ÝOýIçÈ8#*Êæ=á<8nÅñq$¢ÅóàõÔ;{3ŒË‹ÙM*®½Õ¡•[¥´>-¿Þ­ÑÕ¡Uwq;¿ÀºûEÛ¥E }Z4vBfNްñË_€jºÖ{ÂÒǼ$ð‚1Σ&KwüM>âÅèøÐœyå¬iO~N`*M£\Tµé\J¡Û·n“3¢ ó8_O7òä„nÂÀ ünx Ä€­AÛ=©d¸žª;ô<Ùy;ù¾/O>BO~düRŠ*p—qÄ2¿îÿ"%ØÀÑàZ2d_…×?òxƒk;pÖ6âÕ|QlðYÆ {å<'$øBZ_òƒ ì#^Bf2ŒÆ¶ï€”äÍö•’÷ŒLL Iõ\)Ö1Ÿ|fÜÁŠq{ æi虆=­‚T¾ê1>â„%9/KPl{Z›´®„=G8…ˆ¬Ø—øˆÊÂû@6dùV3K$D|‹Ðòbù”dbàWPd ~²‹’«-ìEˆ.Ð?ܾ¥Â¤q ¦pÝh©­ätüŽöÆã;cWñß jv98K8cÙÛ¨dx>!±ðÙl°,p¢]!P6mUHìHK¶ïiñàýz'?FÈ©z½Ö®h9_Ïq Ù²/ØN¨f)ªîªÞŸ ŸSK@ÀÙÓ¼2ž'#è7DŒ*FÚwÌCJ MQY ãÂúR*ü2 Xð4aä#ä ƒ}_!I¦­g( :¡b/¢å+:oROe;㼂Vë®Ên™ù"øÝåd-…[7–l•½äRøb%”ÿHéå²,>‰”á'øâ+.ÃÃO*\ðX)öPj®NªUìç¥îö—Mç:-R„ñb€Ë@Zçb…îNüÒ<7ël· 2¥¸¤ãÍÊ©x$,¼3ž´D Y`ùM¤SwJ?E6xüDÔÊÜ©nª¡š›Ztþˆ»ÀÛýhÊEÊÉxÉ9Ä)A‚0ßNq•‹‚ æA¥Û.„’Š"§¤R‘!Y¥ën)t˜:òãë"æÀ "a’!§üdçº<,¸A̽~Þ[6ù¶Œo¸g¸FT©y²öw¹ÛvîÞ{6ëµ½¨€”£-zÓ<ÁaØÉÃÆ¦¶Hm%vEf`¨×ð)i„ž”*¦Ðõ eJT…qe@J[…:%Žg?ˆº™"=¥¹¯Õ¯¡H¯âјfæ-Ÿ’î_SºîB†{º–½¢áx÷A‹uÀ€Èq>ØZ;4H:8!õ\$t/¤¬÷ #«®½i#M.¡3¯Ñ¢[Ýgµt@ä@"/g×·öÖ‚jX}ÏÀûÑ·˜Û¸`õíAרÓÔ|-ã®Óî:íušÀý’(ÝUj•˜Ý5ñMiâ•tjÇæ)*Jô¸'§^ž\Óý[„m• bo¢§iäžî\Š©¶~¹l’¿R7ÏŒîzøz‡tsó$áºÔ;x´Œ{6ãC(oKVì¤PàòºTÚ¬”ÛUÛOóÊÔ,n×hJÔbÂÅôœËb7±Aïa‚C¨ÚíN¾Œ·£u±JùÖ嵈ϴbgêß¾Úÿ¬B+ç74ßk!öÕ.YWý3B¹È:×ÇbêQ‚YÊO°ï¥)%PÚð¢B/¼„™Y‘áÅ”×QºóÒìûs¾EKßš:À·„˰. çoˆš¥v/?DMqö=ßìÝOw9àÜq7é`7%ä$S\óõŽ•#€²ZŠ\rÜÞ³fƒÊÃŽÐÅgÙ÷ì©/ïûÈÝw˜:WïÊwã2gíUÂ[™!]E*¶×o´œýâi¨¤‹™óõš+î¡æ WºPZ¹Ük®ÞSÍÕ½zé"ª—à^ˆ¼E‹ £‘wÒã1µ*«ŒžÉ>2ž³àn:é°€’eL8›½‚ˆ_¿[µÙ ý.7D>9É¿í=z#n¥+øÎîlÉŽŸ Ç+¤#³·Å?¤tã¡ÄZ­Æ"ÆVáG87qÊ{¡'ìY†›bP^ÿiº€\0¨Ð¦¤eço­MI¤ lÄ_dá<^” YìÖòŠçcåÙ_ü˜pØNyƆDÃå¹Q G³û¤?·”s¼ï'Éç3ƽ?á}_ÊÿEEGÉò—Â’»£tw”r$i.² 9Jg?õ¿»PwŠêB]g§•šŽï¦÷¶lsüúïãs?qtø÷ãû/LÂ%°—%|.":týLAy¿Œ…ÅKËu3¦û%› ­KëF/Ÿ|YÕNʸ™E×tËYÕnáɨФl„]|_kÛ6zô©|ghiÇX8fÜJh;ø z Ú¸a^ÿæþ­ó‰Vøq†|é GëphÚDZ”µ;ÜN Cê†Ï¢åÝ[ÕÄm÷–%1ç°@¹vJp æà”k8ã†9‘QÍ¥1hŸÒq‹Póï#Ê<.ÀÝ‚÷kaê@\ÙîJi>ªžP-PA¸4¿³È­ññëáÿR¨z endstream endobj 2508 0 obj 3302 endobj 2512 0 obj [105 /XYZ 40.7999999 610.579999 0] endobj 2513 0 obj [105 /XYZ 40.7999999 610.579999 0] endobj 2514 0 obj [105 /XYZ 40.7999999 192.019999 0] endobj 2515 0 obj [105 /XYZ 40.7999999 192.019999 0] endobj 2511 0 obj << /Type /Page /Parent 2 0 R /Contents 2516 0 R /Resources 2518 0 R /Annots 2519 0 R /MediaBox [0 0 595 842] >> endobj 2518 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2519 0 obj [ ] endobj 2516 0 obj << /Length 2517 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õˆo °Çž90Æ@AÁìn‚Efgùû‘ZR»MöGŠEŠRÛòãžQ«X¬*²Šõâ§?}ýÇñŸ¿?}þúŸã·ñ÷篇ºªu=üû??\þo*Á‡¦QoûŸã·ï‡—ãËáéðÔýýr`úôâø«{8 1üýÛo‡OÃà‡á¾~þK÷éG~üs÷¯_û{÷ë§^ÿ…Õý‡g¼éþqù©ø¯Ã_ÿpü­C¡9Áíÿþq#¤LÃãåü*;ý¹| Öá¦ZÖt¿ï?wäøïχ_:hg4ªV2f´4õl¨†ŸÀÖìØ}dF:@¹Í• ˆw¸dÔcÄÒ¦Æjiü ªF & W²gCÏÕ4¼ûlÄø±àê4õV¥Î}‚”LDÉÚ<€zŒXÒÌ&f@HäeпÑOR™dr’É¥¸ÎÄÀ5Rf6ÑB"Ó]ÂÅe2áu.9mt¦•ÓcÄÒ¦6Qƒ"“¾Õ#éë6u¢¨DŠéš“‡ô=F,mjé1("éuÍ;CcPºÉ;ƒJ$ÚL€zŒXÚÔÒû@‘I/[>H}gN%Nt•L1c²NF,mjéPOYlaþj ¿x^¼>|ú¤hzÓÿù—“ÓùaøõÜMWuÿ茲VŸ:þ±®™üñøüëáñ¹ÃséQ9ã¨õãiÔ¶êL£†cÎð„ߣ'5‡Oà;ãì®=©ã¡Õš&Œƒçó9ž:¼%Œ©ƒŸkâ±æ˜nPv(üBƒ¸áù`ZcIä˜Öp¦Z1¬ï ÖxÍahXâÙvi î ÷4LH_¼20E<{4Rž²2ð;Š"}X–Û‚Vlõ!ר-RÖ§!E­¦!'10Zi®.‰cNO[.LUîK[ù]¼;H®8k,î@¨#ßHÔƒ¶’•¾yñUgZλ½›B S`Ôxª¼ao˜C8°Ë6CÀѦ‰ƒš# yX%Ê%=$#ÏõÃøD‹9¤ˆºì—GÊ‚„4ÁKalcÂ5䎶ç‡éÌb$ù¤AkKgÑ]kIUa¤¥+F“¬©š¶¶tŽ¡u¸lC>–SÆB5A”òÄc¢Œ}N0Z÷ƒ¯ïÐ' ºC„1›‘±q±}è?Ç3ÅòBXµrÒ×êà¼GL—?ˆHuf)T.㩞©Iƒ¾>¹ƒöÀ ¢ŒUJêÞÀñØwð«P{ el8Ö6¶;0l7:jÔÏùF€‚ZÂÆØ †²mž8æÛ2FšÇ´%œù<ï8´ð«ó'ºa¾Ìq†B5|"wÜüJb>WyΩóŸ1 %$Kjmlu²ˆ˜yv?¬+ð©™° z¸Šý F¤@Çü\ÿp¸|½òD'ÒÑŠc~¼(O£ˆxXŽ8ñÒ†ùœeÑ[e>ÛÜn Ëç4´ÂR+$EÄnñâÌò ¨ÐV8öRÖ\()aA•6£‚iÏSɺÿ|`$¥*:‹Yš·vr‘jWüñúË’:œMMxC²6Öîé© Ã¾Š?ânqÅ ”5·šWµÖ˜1u´Ø”¦´rÃÛKᬰ¼é«Y¶ú@ò$ÃÌŠ¦A„*èQ¼E……Û1gôŸ³²)VþBm"N²·Š2iéæhó «Ðn² *jZi«¢…˔½sÂÄ´sÉÒ}'ÇÆ•wHÑ !±.pR—m™¤ý5Ââ"œHbŽÁá.^ çq§óFXê2[˜×ÑÞÛ9¡·ó‚k“n-Î[j=ã„1úõ¯8—ÃbvÍor‰Á¯†Ýëw~΀T–Ò˜rå-ýýŸ·PÞÂ`j2OSÜbeu”+×Ñ}‡œ·:úZ²Å*×é("gHé.¿[HãÃãÀÔ Ý<ª i¹åÊ^:YVç¦%’fàÓšðZ_}ÿ•~ã&uXJaÝãædëï”´ò-k}—ߊ•ÂXJùÞ–e¬¤eÃDJ!\áí¾#÷XÏîûa¨CIþ®1uàR{ÜV>Ù­—‚²Sè›ÞÚ$d Ü Æ­cÔȵññéðçlé endstream endobj 2517 0 obj 3206 endobj 2521 0 obj [106 /XYZ 40.7999999 740.179999 0] endobj 2522 0 obj [106 /XYZ 40.7999999 281.299999 0] endobj 2523 0 obj [106 /XYZ 40.7999999 703.699999 0] endobj 2524 0 obj [106 /XYZ 40.7999999 281.299999 0] endobj 2525 0 obj [106 /XYZ 40.7999999 210.259999 0] endobj 2526 0 obj [106 /XYZ 40.7999999 740.179999 0] endobj 2527 0 obj [106 /XYZ 40.7999999 210.259999 0] endobj 2528 0 obj [106 /XYZ 40.7999999 703.699999 0] endobj 2520 0 obj << /Type /Page /Parent 2 0 R /Contents 2529 0 R /Resources 2531 0 R /Annots 2532 0 R /MediaBox [0 0 595 842] >> endobj 2531 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2532 0 obj [ ] endobj 2529 0 obj << /Length 2530 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õˆ/Q‚ãW€c ‡ ‡`6›`‘YÄÙCþ~Ô-v»Mêã£øèö¬l`ÜZT±ÞU,?ýñËß÷ÿüuÿéþËö_ÍÏû/»¾ë‡~ùÚ¾¸ü>v‚/õ¨:>¾ö_¿í^÷¯»çÝóüïëŽ ÇÍyðôŠeÂ_¿þ²û´¼|·üÏ—û?ÏŸþ·çû?Í¿ý¼ÿëßæ?šùðm7NÃáÿ—Œ3>ο\~: þk÷—ßí™AóþýaWj³àx=?ÊŽß—¢—ÐÓ°gŒÏŸÕŒŽÿþc÷Ó<ÛŒn’ŒéAê>zVÍÓʉï'=ÌäèIµÅMÅr'Òš•™èË[ë¥öOEFý$|)»ÎÓLÙ›¦±ÐDò€®œ•g¢â}žx:.Rô2s™ç©rñÅ„*CÁ#D,oi󞩺Q &4Wò@† Ô8òù³æ+b)¦2bpž)‰rR…&S1À3uãÀµTý,¹ès<¼J…hqš)…C_H2•¡œ©¨\ Æ æÓb(dO™æºQ5+D 8Ù<Œ³Uï§™²Ñ5êBÂt€¨ ÞáLd¼OÚà}P¹ËóGžŠ®CWÊt:l€#!à¦ø=ž•b¼¥¦¦ƨ‡ñ…Ú±Ìöø2ë†ê’ΧMÒÏ#J¡ ! qÄ…c=<Ö§ãC©À1µá{Êê§Mdè9žÞúPž˜i >{}bª3áÞ²ÐÕ Be§•5ÂÏ|FÏxf›Ðlrax&:=;þêò™e6ÖwjvMWØ@u|X†"F0œ£÷¼ ‰³R!è!Ôì82t‚Õ;v’[8`÷h¤¯Î`sÐcqX¡Á˜ÂøXV ;1õ!¦'¼‡•ÂÔô‚ìDIy’þ“žÒ6{ðE¬F[á뮪³®J& tì„zœ è:xF 9 šÚŠ”db°ðaÞ)mÀ×6Ø´uˆ=Æ6òsñ¬4êI.“:,¿ö>gz8‰» ÿÃhOb$‹ñÓ,TPV®Ñ²§w@냴€ÀË2*kô¬óÑÁGöÞÝ…Yígùbâë”ôŠX^…ƒ5Ÿ£Lì-=¸ù g¸©i=$·u¤rºù¸ ê 'ñ0‚#q•¡øz+WüL¼ÂòÈD¼`94ð,'A—&(gY˜~ænðP¢OŠ 0– J{æyVCXía<â÷àÙKãp”7Œþp[î¨vt!‡)=U©¨ÍõhÆ5HŒÒAM¿|Ùʤz* à Ä{áÖ²!é|&8|Oƒ] ‹òSNO'&á3˜¾x6Hœ2*™©nÑÈQïÜâI,`ÞƒI ŒtHý4ÅÄÙ{»ÑÎÀ"ÎÈ5vàm»ÎwѾ¢Çw·ã¶ˆà¡D –â%BYHÁ¤IâÇ8Öá¸ØZØÏ&DiaçÄãW8ëuX§q#É-ÃÞeNÎ'#ˆpÁ)d—‰Çªº. èñm]wW*e©dÏ®%%1 ÷§ŒR©»<Õ kyžOœ)Æ[Öx;½ºŸ¯³­i¼¡põt|¢‹±° E]ãÉ Ä[d,€u¡¿ d;H™­²)Áç©B·Vª¼ŽÛ3"[ïºbrQ’ ©øÇ:ÝÔ@LóÏ«X¬´jšF%­â Ö²ðÏp6B…`YŒö„Š" §®‘R‡ñV¶ c‡RÁ‰ëºÅý¬?—.zâþ-‚½S”b»îúl xüÂþEx˵Ÿ„à3‚Ž NU< Œäû²R¸Þ sü–#)Y_ãBr}q”à–HÐ]ÝEkPM …­í[WØììá¼eéh#œ©‰/tq QC—™õ#»=W/3÷¸²ÐñòëÁ8~®Ô[±=Ö0YÏ‚ðŽ&máÒi[1 ‚;. <|‰\]2(¸Þ‚¼vAÞh.!eG ÔR¨%ðl,gXšð{0í1Çb½AXÄÇô°N£ÔçSô …>øö0ï¬+ jxðcÔ£;Ëbk!¬;¡ÌQt´çp!e=ÐÇñÀF°»ùá u´È:`Üà@bÄÔ»†6ðhÓÍc÷b‡ À–óï‡ô±›zwÓÐØ»ûî|‘ïÌWÌð¾›p,g*ƒûnÃÖq%2ÖÐc?Žxìn_%{‹˜GðJ)­Ö l“*¾ ÷ižÁ}×÷l$æXBãßY_Á§¬|÷Õ³F·I‚:–ìÙ²>Éf?šð²ÈkÔw‡8ïì¶€'PT$Æ“ûS¦çI‰J–Ê…2N©é}ñ'JRêbâ9` Ý¬*:HeϪŽ)­:p}·S–_bå¤BœpažS¹† –•À° l<²à)/ù>KÐÃlÍj“Ѷ&eú98:ÀÁO‚À…ÏbÈðnÍðX…›sª PÌ)î!B!9VO9%ÆeÛtQªeƒz1¥@®ŠÕŒèÁU×»º©ˆ¨ÛÍèÁ•B$º²¬¨ÔGÍm¥N9MLè9”s\;Ü<ÌìÆ­ Z‚L&T’Ä(ìD¤¸o%â7#I(v”Ypý€W¾UÖí~˜b•°ŒP×ÌS-jüV"O7Éœeq™§=ÅÔòIZb»µo¹Ão }‹\þ‚w ³ÑFç©rbã²Gʈß:y΄àÜ¡cú™º¬ä@‰³‹9í:r¢17Š?»XÉ '8‹õmÉÁu+Ùö’þV¥> a±Âº€Î ClF̧Âá®4“­4 Èa“ø.FÔЌ:džå±A<ÊN»ÁvupC‚óöÂhÚN ‡ÔrÍ;-FaqJ¨_V“Jy®nóÜB¹`ªì ¾ëWáóÛyÚÒ5y¸.ëêgoo˜·s"ï×b-Î10Ň÷Œœ¶«™Ð »*EÚZ7ðeÃ&_é³; M¾‡‰ æ;£¸>s ¢lyåÖË<ˆ£œ‹V>ôFÕÕÀU¾ulKU•´QiòŒ†z9·^eá¨A±ãhéöÜ*Ú)<«`•b‡ÊÞɵéÛã›Í;¹Y¨t&JE7®Ã"7v¹323“rÌ ®åå!Îð”‹Å‡"-%¸%ë›Äß*ĉЅ×| 0ÝË÷<¶^ã\%ssÓ¸¿î‡…»­z,xÞsõO'¼€OGÈüâ¶KâÅ(檹Ü4ùÁ°a*Pú‘íQBêˆeŽpÆ]Qú@aì}†Û Hɶ'¶iŠMSlš"CSl}’6òquˆg¤úé|XÂÎá”ágRõË—MÞµ{îÏ|FÏpgÃw§›½1Ñéè{îñÝé¦ÓÚ¼çßªŽ¡öܪŽïA‚ÏÐa«È`lœ,ó`÷Á‰1ÕÃgŒ(®¼ãÃs›}«–Qcój÷ÏÇÀzöÊv¿À%26!~×€Ç_¾Œ· œ3j •å 'O`Vï唼Ž,ï bÊi÷’ç—Z÷þòì•8‡R»LB;!‡ ø–¼ëOÑaªõƒmWpS%\Ò”s¼ÄÙ-#ìu'ìUä+åÞó‚=âÔÓí¶ûs),*#5Šoù‚§8†•q^¯Œu©C>JÛº¸”h̒Щ‰Tl¤pBeIáÓª¼–áÕ¬§è…mfâiK:€Hi×°¹ø¨¬æ`k ,¼µrøÊœŒ"\-H¹b•’ü”´è†7ÞŠKp¸•‡G<ׂÀ4/.¡\û†×#1l0Ñì)o \Ô,5<±Ó)ãH K8L²š.ðsô9,¹á·‘Gøž…ðI `sWÁZú§5á38Ù e+mÊãàô:Na‹ R'f1'c¨…%õP„µgóΆùˆ´R¼]€¹¯4„Ñú©îIž[.l©nÛ“ØRÝ…`' —дÙS$jÙ­º×Ò2»‰Ý\g‹« ëèqkCoEm$³ÕQ£f`2Qç”dý<¸9ðq!¨å_Ñ› RŒ^BvpèÌÝ ô3¯Ã¼W lmã3ÁgfÓ¼ãý1{ý6rg[âžËÿy€k ûVVø„ž1QéÚCë0ñTÚ3†b)k7° ƒëŸ¹:q†)©mêø×`Ä”Ã|ùÚì¯Í†)øù>ƒaÃôð(œÍ¤ Öž¡Ìv—›;˜>XŽ(ï¡PJ –×ÂØ8ø`Ò?ŽýбÃv¸¥$$ T—»…Ï%­ñþy÷­Ä·e endstream endobj 2530 0 obj 3589 endobj 2534 0 obj [107 /XYZ 40.7999999 245.779999 0] endobj 2535 0 obj [107 /XYZ 40.7999999 587.539999 0] endobj 2536 0 obj [107 /XYZ 40.7999999 245.779999 0] endobj 2537 0 obj [107 /XYZ 40.7999999 587.539999 0] endobj 2538 0 obj << /Type /Annot /Subtype /Link /Rect [277.920000 255.379999 309.600000 263.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 2533 0 obj << /Type /Page /Parent 2 0 R /Contents 2539 0 R /Resources 2541 0 R /Annots 2542 0 R /MediaBox [0 0 595 842] >> endobj 2541 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2542 0 obj [ 2538 0 R ] endobj 2539 0 obj << /Length 2540 0 R /Filter /FlateDecode >> stream xœí]_ã¶÷§ðsèDR$% ÛÝ+Ї‹] AŠK“"ÈÝæ¡_¿’%{mÑ?ŠiÙë;àvÏ´¨ápþs8óé//ÿÜþòÇöÓÃ˶_§Ÿ/›ºªM=þÙ¿;þ@¶•’㯶Օì†?Û¯ß6oÛ·Íóæ¹ÿ÷m#ÌîÁéG?¸Å8á_ß|_¾?yyø[ÿÛÿ¶rû×þ¿nüGÿã§i¾á ß6mg†_~RȶÿÏñoÃà¿7ÿÓö÷„v7ïðïwBvÖt& Ž·Ã£b÷÷øQô²²‡n+„ì×=:þû¯ÍÏýl0ª®šÆÖÁ³Ú~>#ºþ‰þ£­6Ú™ÔY[ØT"q"©UÃ2Ñ"‘¶4Q7Ö?õÒtíˆz›Š°ýLɘ·šó;ˆDÒÊ&Äã™ÈxokÍ„÷ýLÉèj`š¨‡ˆïp&2Þ»^‚ ‹”u—ºÌýT©øRƒ@eAü‘H[Úóx**ê•°#¾¬«9bf™0/ûÅòláð#ieâñLd¼7²Û-RédÄï§JÆ—mydü"‘¶´=橞Y,/ùny½yüüºùôE4ª Íן{HvÖêøãµ_®îÿÓ[`²ýiûçÞdUßo_Ýt•î”Õ£y;ŽÈÏhD4R#|©›ÝÈÓkÃìiôôVÑ xðH­ #xÝpî3æñˆŒÇŽç=ÆD ©ŽL—ñëÁ8À°Õ?\;5Á+…ØÁ2À5~œm‚  §›&Óü ¦>ž(HIN"@€ù kÌ+¦r ›†¸Æ²Æƒk¸?Š@o ck#ˆ‰éu¥µ%XXÞbì<–“ª–…-Ï{ ¬‘‚»íp׎ËT.E•º¼ÛýJ¡Ÿ²f~¾Ûk°ð{Voè.Å x•ZöH”® ®l{ºC†§&Ar”².¯u0¯Sb¶EyW†*TéØßÝ‚ZyTó +ÔªÂÞ¶Ç(+ÅZ}åžJ£Sâx‡Ï®š’ât†¿`ûâbÙ¯Ù#*ª…­JágŠæÆ4†) ûTZ&hßCñÐz³¨ÅÞ¥D]Kú…ZˆÓ·fÅ\€iê³7iBÑÝ~L°£sÞÎiÛV5 à&à«r|Ÿ®”lÅéûàˆçÅ ŽŒ›ÞTÍ8àÖÌê$|¡“¬ŸUtó,Qü`üL*ðôs$ÕyŒ¢ÂTR´Á{ñ„0-êùô”­v€†ïó@?G’Àä8ljpX$>‡L<Ô±‡Ÿ)Œ,GŠx@‹Ø ëà•ÃÏ{–„aN!.æRܳUNÊÚ&ƒ$h7ù€8\±xDsù:L E ºœŒ!šïhùeQ’@üâ&1#aamŽI<M‘¦óÍð,4\×’vÅ‘¦Ž•1×›x²˜eEìŸÃ‡‹–C3~CVãÜ4tF(GŠÅX¶YDƯgb7"ä”Uè¦ÖعnJ±) :û˜ˆ"$JŠ“m¼‡·î-Äð ÅÅë ud xáí!¤Å¢ôƸ‚¨+cw_~·&ö1¡ZÌœ|<2Å‘Êû®{û?š‹æž %bÔà’…ž‘¥53”cz•nÌ)9³ a‘¬"–ܰ:ïDc–´DÞ˜ª²Ý\‚^ó]NU£çtîbÇb«k9ÒEˆQ¸zƒbc–Xt§"ì—Ÿ#\[ç«áŠa°[ÏFÄ€0öàû<†6ÞØUêÓê9/²Ðw„ŸÎ )ú*†D8¢t¬‡-|Tõ¾Š,aÏ–‡‹–˜-æyB¬J>Í_L¦3‡#±Ël@ :’JÄ—ó;½æýžE¢¥±Îlé+½Úõ2FãË4û³ÿ÷»‘õøgNhM5Å@Hâ‘ðÌèiàlœ­ÙïÔÜÓÏjqÞ3«1°à×mÕLœDï{ó@΄‚#x¶n¢<ÕÕ§Ï`«ÄÄÎúq“a5ã˜IJ˜JíDZMØÕÕ(C¨ÒƒCŒ)l¢TŽy¿\1¾ò\´ Ân™@ÆDÁ"ÌŠ7Ã=ŦqÂ.CŠòzëJ–c7–lŒÆæ‰‹Õ—Ó ­:˜8”pm·˜IS£/Ã4„«ø£'¯cã ^mô@€Kjà‹’„Ù0lx¥¼åž<ÉÃx=„‹Ÿ¼—¯$¤^OB8árï%PÏ• ÌY„8þí¹àGà,Å$–H¬—%[á±ζútigL8WÿÒN«8Ì#OZ¸œ[—Ή6ÿXbåyLž„e¦L#'‚C{Ë lX×à æñ["âØØ”,i¶ª=…4JJR.üy$8~†`Ñ]§uÆkïÞm=ßþ”²q‘…Zxr1ãšÕž"É%:Èo5µ‡;y.·ED <Êk='LBIö!d6d€-›˜wéA­˜ŒÚ{*"¨•‚¬5FPYcÛÅ-i¯u‡²Òžë÷Xçò‚&hðèvB†b6+¥ˆ.fGÐíØ†Ð"Q¶;F}U¸Ô£… ´ybøQPrÊd{ò^ • ôø‹ëš@—~æå³U”béÞóïí!Œ¨:©ø3Ex$.ÎW®0‹ª“ S¤9¥ðSQŒ4‡·®¡Ø¥ªír¬ðn{Þ-¥Õتîì¢vYAŽC)[€5òŽíÍRtIÉÙ¸5ûK.£ÎžÃïÁ™&o©”WÖ`;b§T±5%´8ݪ¶jAf­ÐûxÔ\‹'Ž$”Ö‰ëK8õBœ¸›s^qq•£ô‚s‘Ä åî‡Éxå<,`­¶ÜÜh,ÛÃ÷‹å$Î8¡b)ÂåË$÷}E*¢o<æTVÍ5ÂU_ªtr´(¥Áî§b× I8 +R,åu'‡þº§l¨pdâšc#E™må\”-W‚ò˜R‚R6<‰”§fäÙY Ö ,çÖÚÙ6»Öx„hçPY<°W²>ξM‘qÎQÆŒ ¿œ(ÈÛ!‚Ò§àÆp}k¡®bÝE®.< Uå>™à.UiÒá~è@“5¥¸vahy8ïm&?úLšb¡S.²C¯Õ º&9ž)ÕÛY˜²Üá€n$¶é²aDä·GÕ;æR‹±¼ÒÕOSJpå.’—]Ÿw\ ª­Û™‚q°н"Ïm×{ˆ¦ _Ö²2æ©ÏÇQ`;å`!…^¯[õÆ0Îeþ!”PHb— •ðq^ÅŠ\®ž~Ï0؞Ψ z¤ÌD&iÏÁyù 7! 8žù¸&yB#ŠŒœê É ig»vÉbr9R(5Ã{RrK„ŸL8{M)×CêU¸ìx16̸ËJ™¹L,½º'¤YÌËÖ`LÕ ¦d]qZŸ×)RJW?eÙê‘@i·JhúI ¤$YÒ)éÄ‹%á³Æ¥r¦c™¹^IrŽÃ Ä<[(Ø}? H²¤nDO_ê¢G ±­™ßÑWBÆ5äVWÃPÒ+)ÆC–€xá‹cIELyÃï´Ð0š…Ë|"Îl0eDtJtt)¡_)ô„;ÅÜÆˆØó]33C_•"N¸ƒF:Xa1 hÆý±P'Bqü$HšŠpiªå\óâàÃ5ÍA¨êêwÔ Ø!À íy¶=JZ{üÁo›ªÊ£ãôtiâÈʳÉrþ5ÆrG&fÖˆÐhDG/kžL¿pE™¹©MéS°€>¤Ë„[:¹ =3"çq¼ÐÁîÚ5* lidïô¨”>”E¼|§G ì18s UÙyß:ÜËða2ÒÜ>|K]ðÎôÄ=õð{p—Ã?CéÝGèÚ8wŸÃÆ(^ì·é™­Ô Õ]¼Ð V~nBdöš+íʼX¼•P'¦êFBŽ»6Š8*&ØP,eYšFÅ´~$Ü?¨E°Ö cN1Ý´39ÍÒà(†³0§”ÃH‡À×.!ƒtª]GQ"NæbüÏsS1!âp F.uíq=yøš'0u%©­c}ßjƒ¢pA™bµÅÈcLL… ¥¸*Ii?J2ÚÒÊï©6u·lfàí(”ZW*+Ž""¢øs R˜ ½JdöòYÂ’%³#O7$겆§|¡5¥çZ ¥ó(k— ‚]_TÓ¦tô¸<y î(Üßæ±Üž âî6÷¤XŸ-¼Ãkî‹:Qh¹&<ƒñ&p±%\† ïëþ`¼‘ fÝ…•HÑ-Bºú§P_)z)X8Oú½¯£§”¶‡ë'¸ìF(=±}H*b‡ùR^çz4Á%äJu>Ç=ë=öÆÅ.!\Ç´C¹¤NêìEpÓ(+UyÞÃ*å)×p¹WR),C°¤ t#½¼/Ë˸D¦‡Þ0ŸbØØjÖè©N/bÞ³÷¬”ä)êJè\2"`D³Ï lÅUôC5J%à [,˜âx;ðR$.Ö:E1¯Szó^>FBMa ÙŠk'¬Ô‡;tzJá÷²y„Zc‹K8¡XâÀ8Ü÷‡¶?ðÈtdSFBÚ¤È>«ÜhúŒ¤›Öóå}˜Uk#‚ÏŒŸ!y¬±?,Ÿî>¦—Þ>&o[ ÅSpPÈô¼‡2Þ%ÂÑ5Â.P ðx@%5e@Ë>ËÙtŒØ:弈4ÂÿĘׄÆ9¤Ó׋ët õ{ðýßí[OL=¡ _˜~|ýuñþèNÿ³—0½.ßß4[Ñ/ã\iÎN˜j¼ï§ê}`k2ߌ©Ìù{ú]S˜q6TÚÊž¿¤eÏŒŒ¦²R•ìζHÕº2cÖØ\ð{O Ÿéà3#¹[YÉzw%rN†çfùñ'ð»SJß™~AÏLIpçFZÇxˆ{fÚ±˜µO°í ê†ß¥ö”}£v{êZxF¼s˜ ]OçfÃ;øé>ƒaÃ;è¡Q8Ût¸îÊlŸãaó`ïæ#Ê{(»¹ó+3v ®ŒûÛ¶6•®ÚÏÄ@· ˆ)ãbÒÈŒÚxû¼ù?ßD¦ endstream endobj 2540 0 obj 3833 endobj 2544 0 obj [108 /XYZ 40.7999999 749.779999 0] endobj 2545 0 obj [108 /XYZ 40.7999999 289.939999 0] endobj 2546 0 obj [108 /XYZ 40.7999999 749.779999 0] endobj 2547 0 obj [108 /XYZ 40.7999999 289.939999 0] endobj 2548 0 obj [108 /XYZ 40.7999999 503.059999 0] endobj 2549 0 obj [108 /XYZ 40.7999999 503.059999 0] endobj 2543 0 obj << /Type /Page /Parent 2 0 R /Contents 2550 0 R /Resources 2552 0 R /Annots 2553 0 R /MediaBox [0 0 595 842] >> endobj 2552 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2553 0 obj [ ] endobj 2550 0 obj << /Length 2551 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€µâK¤€ÀÀÎ+@;@AÁÚN`x }ðߺõèQ%–(JÝÍ]`§wØ*‹ÅªÅbñÓß¾ü'ûïÙ§Ç/¿e_ÛŸ_E^”Eó';þýîòÜä‚7µQ9¯Ž²¯ßïÙûáõðZÿû~`åéÁöGÝØ½¢!øÇ×_Ÿš—šß|yüGýéÏŒg¯ÿ÷sö¯×?~hé¿ðí`ªòøá—æ㌛ú?—ŸŽÿ;üó/Ù¯5 æD÷øïwL•árïý£ìô÷òQô²£„®™cŒ×ŸU-Žß<üTSëÙÈ+ɘ.¥.fSÕüHVò*«t™ eµú6[JH†Ð‘#¶¬k¬ÚMŠ,zS©¦›L.íhOj!!Y&Œè±e]ëDIQE/k3têfMy©ÀZJ‹%ÏT¥?qÄõ¬<¦D–;/ÊS'•^ÚËŽÒbqñ’"T‰,éY'wH‰,wQ5ZÊÍb…ïH-–W©)ü‘#¶¬kä1)²è.©|Gi±À*h4B¨<¤D–{¥õ©“z)®é)-—*T Ssäˆ-êY'wH‰*wÅ ÕœI-%ÄY…?qÕØ¤^ƒ,6øy±ñîxðáíðé…IaŽk«·ŸjNN ´æÇ[Ý]Uÿ§Fâ’go?d- &¿ÏÞ~>T¹ª„VÍŠnªE¾Õ‹ÓB ®`ïªP½«»Vu­6ÓÇ®Þ3c:fÎËê¶úÔ"s­-ì‰ðÌgô ¯ µ QÅ©…‰\3sl=¿‡#jìñÔbrɇÏ4C¥r^ª’ϤöÜpPäÍ#s¨ÜSÆN-e.Øé5ϼ@j-o*7ì#oœC®K‚ ¼±`*^Ù+‹FÅkÏß2ÃZfLU ¤êU4SñÜò¹‡à Ï-Í3,W²<öm8¼òü ÓʧÂ…ý5C±8~Q”Ã_a0(ÖǶx0<œàü÷ÙzrëÕzŸ‡ÇNÊÄÂhÖ0yÔ¶ªšøøBÂ")ö+Z»vö›XäPa¤š¦Ý”©ÌÀMñf52¶æ Œ•mg烸¾r¢H¥‡:ˆÍÎǦ„û°ã  dƒå}ãt9”Ôü¹aïîz”}ˆ³œÎ…^è3HYYÓ06P¯»?³Ê®u±$mu~Ñ?J¾‘GÊÕæùàl $«x–5á7«†j¾‚µÎ#àï’ .Ö‚ („³—&øT%o:øà±6öHŸ?Ž"«cyaÌPW#לó©7ˆ‰Kft× —BtrÚA­pØ‚+h˶æµ]+W©æ°¾¸£RwÕŽª°Âƒ°N6©&yËÛH ïé8ê~c(u¿qOq}qÌ[,Ü&tßµTEœ`è)ÕÙÕO Z4h¹ å<Û¥í˜\=ÊyFªi·ß1¹JÏgJȰ¨ÇáãݩɊÞEbà^(%PÞ›!êÝÅYÉÅGYÊøÀ1:GÔ“R˜Œ’Ó6®GÉ!”†"åîážâH)æÍDÔËþª+¬×9ö·ÖâÐ$B\›²+ƒ[$9‰GÆÂ‚3wn̦a¹…Û˜aúëåö¼—êà ë!p{Àñ>"Þ]#Ì ŠuÀ¹€Fý±–slQðNÄOŸÜ¤\›˜ìÆ”Ý03ææÝØ |ÞZbÄOÉx%Ø ,JQß°¨[”Ø Ê˜&‹B·(Õ5duE³(ØÛc®#YF§ä݇µ(„uJ4‹BÓdQÈE‰¾yЈ#¬ÓSDÎÅÁ}Eä”êŠÂ'O·‡57 Uãg(ï ê÷Üâð ˜Î6ÄùØ”U?ád«£Ì>äË€’Ý혧„ ×à–ëô‡8ÿ'Xè|5bò9;°ƒ¤uÆ‘"À¤8>xf(¨U”–É#¡7ãsöìYÂú[óXÃÎ…Ioä'ë°µM°Dc]ÎG¹¦…°àÁŽ¢Ïðü•ìúò?®µ…pŠuûÌ={þøwЧļ(v[Š ™; \&ˆâ§JÖŸðJ+Ô=ø ա儙+G)ù©kõSÛç%–]çBö<¸žÍ®sY§˜ãtát«ÜãŒúD°\øöRƒ"ßåàíþN‚&Û7ÒoðZ1†@?>HÓÃaªëÔ÷½³¤rŽ®ÝyЉúõZ›NbÕ¯ÇÏ``…ö6"òå€Ðöø…=À`=À‡ñÜ&ÀGYxŠ ÂÍÊA 84Ãñ>ã-y£ä’7"{#|\–bQ(z€ýÇöVûÌS|Í"î鞦ª0}ìÒãHÒt†î^Œ)ò&ײLt×ç$ôÐCB ÐC …G …ï¹ÖøíøXn‚P‡Ÿàø=Ø*‡-öDÈbr”Â…t"Í,ǘî">ÁTŠ?!Œ„0¸3„S¢aXW9'¼’ðJÂ+׎WtwÅSÂ+ ¯$¼roxå~Jú'$“LB27Œdªtœ"!™„d’YÉl~CB2 É$$³’©ÿfï5d©áÈñ í¯ßÆ?Åü¼:áóÑéÒOeÆênŒÀ&Q±²)‡š‰B~tYæåx ˜Jæd,ØÀu®ÇKãë‘–fÑ'DΫÑJÉJåe“^tnÑð=>SÁgs¤y΋S᪡+£Ö¨ÔåožàwÛZ‹#=|AÏ´ `¬…¡~´ÉX~Ï´#æÓ÷–·ÓX uÇÏ\±îXÃ#G›)È#9¬P¯9ƒÔð>A½†Ï`Þð:tRkÁèØ3jþ¼9¤ƒÇÏ#Ê{(£g ž¯¥epe³ß˜¢Ì™nê^š ‡ˆË2)¯!½qözø?Á;rE endstream endobj 2551 0 obj 3719 endobj 2555 0 obj [109 /XYZ 40.7999999 180.500000 0] endobj 2556 0 obj [109 /XYZ 40.7999999 143.059999 0] endobj 2557 0 obj [109 /XYZ 40.7999999 435.859999 0] endobj 2558 0 obj [109 /XYZ 40.7999999 560.659999 0] endobj 2559 0 obj [109 /XYZ 40.7999999 435.859999 0] endobj 2560 0 obj [109 /XYZ 40.7999999 560.659999 0] endobj 2561 0 obj [109 /XYZ 40.7999999 180.500000 0] endobj 2562 0 obj [109 /XYZ 40.7999999 143.059999 0] endobj 2554 0 obj << /Type /Page /Parent 2 0 R /Contents 2563 0 R /Resources 2565 0 R /Annots 2566 0 R /MediaBox [0 0 595 842] >> endobj 2565 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2566 0 obj [ ] endobj 2563 0 obj << /Length 2564 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ŇD ðx<r`Ø@Aw7Á"^ÄÙCþ~Ô-©{†ì"‹E¶4#ð´‡-ªX,Ö»ŠïþôùÇþ~|÷áóŽ_§Ÿ>êªnëñÏñô÷‡ç¿]¥äøÑtM%ûÓŸã×o‡ïÇï‡O‡Oÿߢ=?8ýçWŒþþõ·Ã»ñå‡ñ7Ÿ?üeøô¿£<þyøß¯Ç¿ý}øñÓ4ßé ß]ßž>ü{ü ¤ÝðŸçŸNƒÿ:üõÇߺó¼§Jо‘Ip|¿<*Ο?Š^vB@#µ> !‡ÏÍ€Žÿþ|øe˜íFÕµÒè¦î;ø9äMFž_eºcoÚccœ÷8Ë ›I¤N¤”æ™è‘HZ™¨µñÎTõZÓjSïð´È®aÂûI@;ïã¬U×׈Í<ÿuä=\èÃøŒ¨Ýž–Š_ìì›g9ÄâÙà3ZÙÈq€?)ò=Bi¡Îa‚ÇÛùªÐö³àÉÂ)×} œUtágÖYxøžÈö³ó¨ƒÙÙôÞ_q‰¹7­ÅÝ=ôŽ0Œ1ž}!çÕf¢.ñ:AÄÉ[$üˆ÷ 竲X¶ð«yP!Ö"vËY–Ã68¸>…æ\NãΖë\ LhÕfš3 SB¼£¯‡;k42¡êÖÈ#Qpä `ئÃwk¤‡#p=J¢ GðlF?ÀÙºxxžy¿ ÷Tâ¼§Œ*5Æ(ÆAƒ© Ò†­Æ+…{ꡈQ g=„÷ð®Ÿ, > ˜F!…àÏ Æ+…œOâ÷`ìภšÀf%á1 ’ïÔŒà »Är´ãeeS¯DoDìæw3¿r²øƒîSÛv—£—K7ȤþÈëFT òvyÎ/Á¤ê¬cÃÒ‡ù/¥-§F ÂÍ*º¬iSTQŠ9ùvóXzuf¡†Ly&„jU-ÁÑå(‚Gän8 ¹tóøSî)̳åXËäí¢›]~µ½¶äåîXVcçjaóf×_—ÈÜ&qWÒ˜Ä2¼EBÍѸZX` ”×7m#áö$qœöq§\lˆ/Òô¬¶(ò´gÁóüÌÎGI\N´SF÷Pf™úv~Kâ5» }}{ºËÐr2t¡ìº‡÷dx/…#ñBÀËýKù¥x¯º_‰ÆÔ´ gs—®4iÍ2´p>Ü.]÷‘}dÍáž<Ì•=ü€ÐP?ã‘âø¦KŠÐ ˜ÒSµæõXzÑR¬H’NiB½ë­Þ÷¼F½ÕÌé%š×/$‡ÉË]Šžj­õôDdi;“•±çK†Àš%_r=;X{&]ž¾éI›¢ «p¯¾6Zm?¨œ2£1–ÐØRË©€ò™]²ŠÀ½ w—–i—¦Dtõ‰¸î‘ã.˜]nߣ“]/„m¶ìªAëÜ Ü.` ë9GÍŽçRª½]Ç.Ý×(ÝsVöEY¾ Í™I…Äô}225ˆ§—…rŒîvÃQÃá~¢6}µKû©,ŠÎ^˜é²”»w6 h€+ 9šÒu‚ LÉÇ’G4Ò¥2ŠÓ [¬„{žcNz„7ˆÒð<Æå‚ô+4Ob¹++OjÛñÐf¾"QÎðì.7£mºÓ+5®^Eë#ƒÄ¯ÁÞGG¥ <™[åEÜRÊb>§\õƒñËÒÓ¡+*ţ襁¨§H±œÜ$kKmI‘R·K–jpÆiOï„öŽ6žŽ6œ}c«ë¹%Á”$‹Ñ¹å̯¬-(mA°‰}Ïàƒ)tivéö¬,ÑK—-’Ï‚bUFОžÃ`@8²œ#“$‚Þ“##²ÖsðÌjó‚˜t;Ö¤%Æ…gíö¨ì#Ïá%d¾“ÀQb¼×+.|?_<ŸÊ[¼¢¥¶É%¿{TÙïLI˸˜‹ó’-/U£^’Ø*K´˜Kìñ{X›ë”l+©Œ\„Ç)^7.ŽÃeè”2ZÜ*7 Ã¥v˜úð{ µÂxÃmøJõ(©oŽ’<8šÛWnU„bµ¸¼õþÅ®ºÕ6Cq|cìõcˆc’ˆ«žvb”FM¶Å¼8"Š«âæ;%x “{¥qº ±²³V÷z¨'ß7-h²º³;LšÚXR$É—A¼'G¸'Çò>î°½Èꆚ¥È*“Æá0/”4'—z̬GæšâƒLð‚G(«Ë‚Ý¡£­”«NNÓ‘ûìœ|û 8sä3$d–ª½e±ÀÉJ,á½Å´¹vo'YQÉ’ñÈZ˜Tòê(™áSb?XwÊÓ"‡31–9 ¶‹gFñœ³lµ6¿xÀz£®j Ò_w¤DQŠýΘa̼Ã=ƒÎûÔ:s,­T®ß†N/W¾$hxìb˜bÕ‡˜îof™´gZjäLKò´©Ç?öâuekD<²>Ó‘ΦgZµýé× ¥=Û6u5ºÓŸ½g¢™JOôÁ|䤱¨!Ó¼x"ààþ(ç=¢’Ý4—$•{yÈcŠk0Ÿ.Ô…ƒUe/UÏšGÉ (jfÉ<½{òfø³žÿ"z×”JÿìP:Ÿ{(ýÚs@ÓšèÆX4›7'ËŸÕšf9]Þc—Páöb@q‹-¡ñ/7mÄ‚$Åâ§Ä™6ðÎ/Rœ­<™÷Jyˆ‰I9+/f”\ÒŠïo”Hgƒêð¤gb¥·­ÔùDºüã–ªŽŸj÷´ïq† † ŸˆFÙz3Á¦”€°‘VJ1qJåµµª}I»éñ¦M·®½K­ísA)  ÜYM¸ JÀB „Û|H÷vËìVBÛÛ{µwôŠ:¡nY¯è¬-ÛÓ©÷têr¶Å ; ã§t[NIÍÉÜ2s"¡“Ç4.XVÝdO„l kr4Kº!“‘ÃñÑh±JF¹ÒuŽÚŽu’D^Mm);m¹íçrÅGk˜³w‹§¬Ýmûe¥ŸùªPìæ'$”*XµdD]cŠWê ›7×h\ ÊP^¦>S_B'›ì 0U.ëŰ)Øi`ŒìáñþvçEŠó"®ÚƱWê‡l7Y#e¥z~›»€e†§{†Ë&œ<@éð@áë£X~RH¡¿† Ë)¼ ëèb®·™u^þ¿/&=}aúñõ›w õu Ÿ¼‹ð>ºØmbXÆÍ¤ÑŽN‚ã)‡çÅ&¶mÕÞ¶™{]9æÇxÌ¥©ŒmÖÛknŒŒÆŒR•ì-ãi²À›ªí¸ëˆïéà3=|f$J#+YŸ£›ö±¸5ÛȺŸÿæ~wʺ¿±Â'ôÌäc¸5"Ð:&«7î™iÇbÖ>Áv> Twú,a^2§¨Ý „ï¦Hדùrk6¼ƒ®á36¼ƒ…³M†ç­g(³=ÄÃæÁÞ|Ž(ï¡ì<-ø¼2câ`c§¿ë„®Ä)0d±ÉƒeÜk¸aÝs‰Ì(Ÿÿ\„¨K endstream endobj 2564 0 obj 4687 endobj 2568 0 obj [110 /XYZ 40.7999999 771.859999 0] endobj 2569 0 obj [110 /XYZ 40.7999999 496.339999 0] endobj 2570 0 obj [110 /XYZ 40.7999999 602.899999 0] endobj 2571 0 obj [110 /XYZ 33.1199999 192.980000 0] endobj 2572 0 obj [110 /XYZ 40.7999999 86.4199999 0] endobj 2573 0 obj [110 /XYZ 40.7999999 496.339999 0] endobj 2574 0 obj [110 /XYZ 40.7999999 122.899999 0] endobj 2575 0 obj [110 /XYZ 40.7999999 168.019999 0] endobj 2576 0 obj [110 /XYZ 40.7999999 285.139999 0] endobj 2577 0 obj [110 /XYZ 40.7999999 122.899999 0] endobj 2578 0 obj [110 /XYZ 32.1599999 194.899999 0] endobj 2579 0 obj [110 /XYZ 40.7999999 285.139999 0] endobj 2580 0 obj [110 /XYZ 40.7999999 602.899999 0] endobj 2581 0 obj [110 /XYZ 40.7999999 86.4199999 0] endobj 2582 0 obj [110 /XYZ 40.7999999 771.859999 0] endobj 2583 0 obj [110 /XYZ 40.7999999 168.019999 0] endobj 2567 0 obj << /Type /Page /Parent 2 0 R /Contents 2584 0 R /Resources 2586 0 R /Annots 2587 0 R /MediaBox [0 0 595 842] >> endobj 2586 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2587 0 obj [ ] endobj 2584 0 obj << /Length 2585 0 R /Filter /FlateDecode >> stream xœí]Io举ׯ¨s€Q‹‹D èö ‡6CCÐ3“`Ä™Cþ~¤«Ê&õqy|TU¹míjÓ$߯Gòmüð§/ÿØÿó÷ý‡»/ÿÙµ?ï¾ìÚ¦íÛåk?ÿðòrh”\>š¡kä8í¿~Û=ïŸwŸwŸ§Ÿw¢?t´?¦ÆãË€¿ým÷a™|·üæËÝ_¦OÿÛËýŸ§ÿýºÿÛß§?Ùñæ?ø¶Æ~þðïåƒBÓ^~šÿµûëö¿M ‡qçJév(ƒãùÔU¾_vE“ÍèÍ ¬Ó?ÝDŽÿþ¼ûeíF3j!L¯M›<ª‘ó°}gö£é§¡µ7¨‡[âP¥™ –fˆDj¢Õ&<™ôC¯4•*Eô4Té@ãØñ 4C$ÊP;’Õ Z ed§g6Ì,è†ANŸ²_é›V÷Ô¿ºòp?TJD3©$žfˆDf–x$ê2˜¸·¬öIò ±<ŽTL.¥5Ï@3D¢³#ÝáHdºën‘ÒI±by©˜\<͉"ÌŽt‡#‘éÞõšiÇ=U:дå2qp‚ˆgÇ E&½™x<"©˜`f`bá ÈÑÈt¬x•«øKPGôµÎñ¨x8R3ôö ~N™gâj?´²›ÖT«§›‰æ3Ë%Gž/9ÏŽŸžv'@ÆýÓ/²‡[áòãéÛNöÓ¦ó^ÛïŸ~Úÿ±måðãþé×ÝØtçkäÒÒšC‹nLç´ˆ{Î>RÃÑF4š¼;´Õ1Ì­çyúCËtÛí»^¦µ´Ÿ l-šÃ&–Ó¨±u Pùph-Ýya „Z,\è%d—HQ!`8O€?˜nê;„©Zè&Úf![ yZÂh D× ÂéƒùûˆBGÃÔÁòfñyxšPu¢:éè^©l1ÖxK^™˜†˜#1ºg­ ¬ðÊTÊ^³÷¨O@`­iMYeÖêjh ñÁi7HÚ êÝÃy°Âø.Ý0ζãÝ ÛE5huFX`°`&UÙŽê5-Ù•\´¨KB!šN÷3n.Òúü eWªݓߕ{’ð¨vý)ƒ=@,ËTËŸ-x4?måL/ùbuxXdŒšÞW~LçF¸ƒXthŒNï@/{Ä­aKùæáåΠÛ]Ñre-€8&°'Áƒx‡aŽ[ê@Oa›'YÎ/´„H`˜¡ŽÂb‚ñŸ\ ],´ÊØ# Ö^wÕ73º»$¡ÒÉ Ùî~B‰ÐêX"áðú‹.B«Æt eÆþµ8L‡  &×ZîP‹ü[Æüy„F-B€û¨OÛÑw]ÜÒBZ ·óÜÃ>}~ûFƒ|Tl×Ðn)}œc·%A{ Éj H¼!pÓJb,½’!Èu€§XSP œX¬µ"ï\òj1Ø·H¸¶%ÆÊ[@Bó¹ÐBý&! ¾#ÎAMa[ª›ÝÌ$#Gr`Zô®+¡ÉÎ3Qä¡¢—î /P¦®˜¯°]c¡eãcÐ6´‡#Þ÷\³†]ÕFtæ8åå]Õ= šúí=DȦ_|>çèÔÀf{lê8B ƒ"àauŸbW†šäÔÀNè|$9ƒ°Ûk#ZSœgxˆp»¦sY(Gd;< NÅ*ë¯þž/Æ£ñãìåõ”ΑP­pÄ·ˆÎöìý"Ã8/ÜÍßûEÀoàý©gœ‡N¤" «-_Ï¢ð`¢y¾#ìPH÷Öåx¤0ÐØå½uSܼ˜xNWŸ?˜×÷zÄ£œ$U• pµà»ô’X•á>-‘ëtUíëý­ÈX%ƒI†ûÛ»ÅCq´ª0PüÒ¬ª“0ÂâÞõ- ð48T&:j¾ÿ½:Dñ#LÆ‘"ã”…÷b0bH7ž¡ÓÎÆSVö6¶{­\´2â†ð¼6F_Õ±èZ‚zô \–Rv=׿nJ!û)‘79ço%dpÌ,Aÿ½‰% »X€nü’a$ ÛâÅš.H>Œ±ƒtÅ5ª„v)‹yƒ¯ß ( u/ðŠ?Fk–ÕŒ›V ˜[Þ†½ÐH6ƒµ3ï“ùZ×W Ù˸úd„ã³KÑ1{ãdŽSD¬àÂ0 ¤ßŽ(—¡­.µU2R¼@ô¨©¸™^$o@UsŸŽR‘C€Ó—–>y5EqbNÔÂÉ?x\[vÛt¬µÄGØÖ‚¤Ô!•8ëúë âê5æ08+3 „j–çÄþt £Tº®²úþ-Ž9‚VŸ®™Wë§³^;’¶\—[ lïl…µ CG —Q»jN¶¯« ŸÇ3Ê•àžÄÖýŒ˜FPcQ;L¼$_”5É–7·ŠâJX ¼?éjXR8isäKâMrö€÷‚Z 69ñeвnø%·¯ "ǃ¨$ï$àŠ‡4cPT}än¾em”yJ ’ª„U1‘Êbg§‘ÖLœó5wFØ%!Ê'gê-[Jì@°/ø§ñD‡Àé‰3š˜%ú%˜s2¦ïýœ‚ˆ«Û–¹@ÞÆV±“Zõù¤ lOÞÂ=‡ÄQŒ¾hÇÄDÊM ~«C–¬ŽúÛ’•kJþïFñŒuCú‹*½' $,ñ‚Ä–ão¦tzaž,Éïl3O:/f\Óci)û ‹® Ty¹dÞ[¯:g÷x#×ÍJ¦çŒ|Žx0ŽN•…߸¿e~0â☾?%þ”DýÛtwzéŠÓÜQÙÇ=: _Á ÀT·‹Õ»ô¸íª'sÎËÿ[9ïóÂyžËŒ g9BÿNK7+TÝW¥` âYâYÀKàPõs¶ã¶þc‘·ù]Q®hï“Å"´e>\7š×HUϵà}gòŽ$Y‡r|™Ñ8Ž’%@x‰kÃ÷9M/ú8¿ü.¥87á^°4³=ËÎzðtú®hÊ[Xz™G:”ü•€é„×´ÅÊ9Œ)%Ó9°SÁçÁ²÷J KÕM¾kz›«DCŠnfX2íðš¸kQÿFÞäœÚBUO®¯@QQÒAATd v&"¿^#KM£xͯx1æK—?­c‹C0_·¼>Îå@-gðv·^¼]SŠ™PŽßÍÅRãkæ’—Hªò OÂ{ùTåŽÓZäüTå@Ú1!!9ú ÓgqÒo §~nuzº„O¼ûá‚W (Ç£nH¸ <µÄKÜ󄯗¼ ÍrýNâçKžYà)'y­~Ò¹>§IIèfBÎ×¶¡ó5wŒA;[†ïRÁ(¹eÎ\ª$¥ä >G}y¿fhzqÖ€XgÜžq`÷†Î‚Q”Ü(†l~ æ(Å#)®7ìBÂæDB)Ê­o’n’„a›qÞm)ÜÞÒå3ê¡@*(Q’<6Cž\|x|s'ȉXưSGŠâyXåòª âbG«|kÏ,„¢ÀœEú¤^=äí)šÁZ¾„t‚½»r^þÉèþ‰€RZN‹g {Þ·EºÃ |­Œò[üQÎï*èÃû’ £x‰cõ·Þ3_)ØÒA 1Hà[i÷ùPQ^¤4ŽÀ´>…… ‡Õ–zµÚ^½^/YVßóÖ“Þçì¾ðúàRڒί%Ž$ô„—¡ÄÖX\>Ž ØqY?XX°~ÑDÑçíV¼f9‡ô„Äô ”`ÄV}ØçòÖöA´Îr7£Ïnñ˜ÒYß¶Ç/rd”P£Øb3lDuŠñqáÔ‚ó §تgk®üÒ~} ÃÝ#ø51 Û58NÆSvú»ã$ã4\—éGìbuA ŽíÁO jëØÕ@\ËÀžpôÑé²l-Út´ QîÝÇ»RŒ`ýŠc3ó4'BUñþÖ¹Ðä¸!3’ñ9|õ• r,Ѭ® –C;1¡PË65êf΋ìõb#U*¤¤8 Q³óà=BQ$ËÈšn¼±sx…bzêÊŒnÕ»ÌøóÀа@\ 'œârYW)µé¯Bj»¥Æ»Ô&Jm _Õ–ÓŽW!3F˜w™¹FMw•R;*iñOˆEºVNﹺ YßͳÁÑ;ÕA¾§ïýó$È¢?Ȧýñõ[@²ý%Ñž—Äçà¢v†úý!|yí¼+úåõϽjP‚¾oúuÑu|=Ò4fÝ–nVZB+ÕÈqÕêÝuM¿ðËeÁÚ<ì3Â>‹ÑÁÈF¶k»¡¬¶È‹ײö·V@W0|D}¬Ñt­E <ìÉëc9–ƒ»…í° ¤nþ,;q*—6¸%sÊ5‰²˜O°vÖ cj`+¼Å\—j ÕzësÌ[kRh 9eŽk´ÅëóŽe ÃÄ1GÈ9‹ÁîÈÆŸ8Öb÷%Æ=iÿy÷Ctø endstream endobj 2585 0 obj 4236 endobj 2589 0 obj [111 /XYZ 40.7999999 676.819999 0] endobj 2590 0 obj [111 /XYZ 40.7999999 722.899999 0] endobj 2591 0 obj [111 /XYZ 40.7999999 640.339999 0] endobj 2592 0 obj [111 /XYZ 40.7999999 640.339999 0] endobj 2593 0 obj [111 /XYZ 40.7999999 371.539999 0] endobj 2594 0 obj [111 /XYZ 40.7999999 586.579999 0] endobj 2595 0 obj [111 /XYZ 40.7999999 371.539999 0] endobj 2596 0 obj [111 /XYZ 40.7999999 586.579999 0] endobj 2597 0 obj [111 /XYZ 40.7999999 768.019999 0] endobj 2598 0 obj [111 /XYZ 40.7999999 768.019999 0] endobj 2599 0 obj [111 /XYZ 40.7999999 722.899999 0] endobj 2600 0 obj [111 /XYZ 40.7999999 676.819999 0] endobj 2601 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 686.419999 539.039999 703.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 2588 0 obj << /Type /Page /Parent 2 0 R /Contents 2602 0 R /Resources 2604 0 R /Annots 2605 0 R /MediaBox [0 0 595 842] >> endobj 2604 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2605 0 obj [ 2601 0 R ] endobj 2602 0 obj << /Length 2603 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsuDR7EìdR ‚èCч"Ûm±Ø,šö¡¿¶%{<¤?RütDI%@fbZyHžËÇsy÷ÇÏßÿó¿ûwOŸÿ½ÿÚÿ|ú¼+E]tö§¿?Ü~ ÛƒÑݯM[´=ýÙý¶û¾ÿ¾û´ûtü÷ûNÕçûÇÆË+ºÿûõ·Ý»îå»î“ÏO>þö¿½Þÿéø¿_öýÛñÇO}§/|Ûµ¶>ýòk÷‹ÒJ·ÇÿÜþvjü×î/¿ÛÿvB{î÷ôïÊ”µ.ÚQãø~}TÿÞ>Š^v"@«›z¯”>þ^ÉñŸì~>övÆÁ–J5uÙƒ{mô©Û¦-÷öص.¬×©7·a]©±Y«e::H›š*Ê&ÜÕ¡-2®ÊÓ2œ– j[}ü½1ýŸá#¶EÙѰñ—8mîמÆÑ*ee::HšY¿¸'öØãÙ?OÒ´ÅØi^ºM¯Ê*™ŽN#Rã¦v¡<îŠ&}m[¡-éi4ÁšÆÈtt‘Ì–w{ú$"šô‹húxðÇ/»wíI ùù8г,ï~|ù¶+Oÿ9Ê'{üßOûߺúÃþË/»öÐÚ¢ÖÕYø÷-öÜ¢ªCaMóªåý¹¥:ê­zýÌÝ3êP•G6\½´”æÜR¾|õÉù@?w#¹~  烢ì9”çñܾ×í¬¨àW·W÷YeÝo<Ãù&¼¦#@s¡æN¼‘¨¾OÃî=Ú´çêƒVíë¯joÐulMðˆ”ûl|ÅS&¿ªp'pâ%€óÓïÏïùËñ¼Oszõ‘¯8Ǽ;ØJ_šdwî>°ˆÞö¿8}[¡•*ìïu¯z|Oo8ßPelðø5þyN8`_ù|óGÜ"²K¼ACifºu´‡¦®^·(ƒZhâ1Ê„YV‚xÁà5€üPý(ÅÊŽŠ½ËÊê3'3Ú^öjÛ/Cõ‚B¼škyh*·¥NF+øŒEϘ^­1‡¦£ÔË3=k9”ÚiQá{>t½‡n¿y̦:ho“jÔ›zB#ÀóÁ£6Ïè=ZÃQã`êØ~»÷ Z ¢N¯vÞ£NGm§–Ö½®mê:ªQûŒšPHR˜{&­ U5Stzo íðÅñ2|Mô{HE8Öeħ€¨Äð§S&pà}™táÏVÉëõÊçëNl¸òÄ åp2Ü¢Þ» ê~à€Ð¾Á¬u5|™BwÍ&lŠˆ( aæSÛ0“˜óù½ D8¶@oFƒ ¦†½u¼RU‡ŽI ¢(^…(ŠÇFQ“øÙo¹À̲¾s.qP^‚½…C>ÇÈE¬\a‰™0z|ÛÌè_ fŒG6oÝ.шûè-2Á6ñ--o+3ŠNúå²$Œ+ÀžTiZÀ¡L]º,êªüÜáNKOÖ{Ï”D ‚-Ï°å ŽºNŸ‚½&nÓ[ÈUѺë;ý;•vß9±l"° 3eYïáVøÅqWÊLÃiE„·‡GįߨgÂÄWîã-™Ø‹êÐB0ÿÅÏËâ[[9{¢‡LBnÃСÜ>1#llKO(2㔸ÚH—agºÜN\yðjÅTÅl=˜b)b„µ]–\ºÒ1Å¥ôùõ^ë(§ü°¶ÎóW'$cŠZ8jÎ7Ÿüºû<í/ Bc£¤óe|!Ës¨aÙ—uÔÕí§eÌ^r‚³Â“³@¥­óNÆ4öc§+ü̽—áÛb®4¢Ž%qiŒÝ¬Wéwáè¨[†ð=(C~T„/ÁA‚‰T`næýP@Þ/iJtè‚8^%ÏzÌïªmîëbs¢¥ØÄÅÐ4¥Mñ(fqsA!]­j3\”Ïä{J³¸ý¦!x¤ðØ,j©àN ¼ïø•íÑÖç'žpôt`Â1›M¥²G¦ágrùмLÚ|¸¨{^ð £|bZI`ª‚½a¿ƃ…ñüÁ3}F-Øç{ÊF}œ QÀ#Òšñ` ŒºA» ÓºÀëƒ÷¾ÄÏÀ¯ÅøTL«ª‹ÃpŠí-a”]_Ç,?!Þ\"„çÒKqµ+!üc¼v7hbÂâf,ò0ÜÄ×ì~Á"«\‰¨¤ùqÖ8Ê™œòeivvd†?ˆiÜã8jB’ŒA‰ÄÈ* ]ÏÄ?DC‹×F쵄ÀŸL^ÎùÌZ[]ö_.³¿'(é½ðí ‹ ûò¼üem&5 ´w¨±1/±Þ¦·jj£ãçl9i1$‚)%’_ Ë9 Ù/ë3“¢J¹ñdï±D› ¸r!ñ˜kÝ”ûäi•íœM”?u’C›!ÉËÜHÈ4åÊÏÎëÑð{““@'Ù[nQï É;ù©­ c)˜F,ÝÅìÞ¢¬ÕjÀm^§Ìè·Àº»2ài¥ú$ñ7›rvO+*¬ðš¢Þ©£¡¯å·EŒ:(ˆ½À`K”n“rJëîÊýxhõl îw⺪«ñûþäq™jàØ™‘TÀ8]Ü´ê{žD”c ;&é3!?#6S[ïè?hjC<­x`'‘«!¥I‚ö‰! ¬IìëíÖfAhòÄ·6)¸‚h°“ &‘Á®¬m|9œT„ýòùæÒ ¦ Bîó0¼¬Ø¨âfÛæ4~S ¥Ïdª2m÷¡Âì!t®lÞ^MÑ^¨‘ËÛËÂg°—Ô‹¹íšè8ç*ŒÖÐLÌ ~ô…Â>dF¡–@ +»L÷\~Y²%{˲ÿ1@ÌÊQïÁ™– ?:7$[ä,àa‰{ƒq]e ©ƒcèäÊfÜ”gØùðÃå]}HD€ùvV‚ôOP”ÑUV:ÉÓ‘ˆíK(¶ªƒÅ-NJáš1‘R Él$‚7G\%O3eY!’÷v@bK覑ZOî#¡ŽôJ‰RNGþdê°-®öÀ€rèi7&õ‡˜ì5ø™Ø&u,ݵÊàšØºï$®|è–>Ê )*g³Ð,Ös•^kê.ª¬»Ç$ÁÅ{šÓð+íÜ¥BWu~erC|àé˜`729"&.'<¹à0Êå ²ñä®RBjY—ÕºUMÿVój$¢¨ÿÏéï1Ø3¶49ÓEá{¨‚;„ÍœŸÀ…Y5¤[àlãF,﹃“`úâýÂàóË<“SjÊø9Á#•-†õM ‡¤0Ž;bx9±c5¤[`Msrß%k<«Æ~…Î6æ;JG|ê£4ÈÉ­¹ÌêfFÌ '>kÔ…rXK!Nj€Úÿv6Öû°®ˆO7ÖîìÔ1x@ŸŠ Ïî[P¤ô£­=ÞåÓë2˜6Y.]f~½ëË0<6¬7:†^°ÝÄh`L˦µ‘ZÞ;x`4 󌻶£-¼õì'Am }U[/ìÞËäUoÜ$K\gåº}^žŸøŸ´Í`y¡‰kræ¬V‚C&Ž˜õÞ|g‚ aÄŠä^ð\ ?Æ”b¡Kuu#¢®,}ø¤ø­a´„t¼k,Ó‘à½í¹F¯…›âǞÅ·îJéÝìÉ T(êÂÛØÒY«ŒîD¶hšø>X§Ù»XÊC_ëUÆ›˜¾ E44ðØÈPH \-àŠå0δ‚Ïà– š ®Üê.ÔÂY6¬ª²×TzŸÁ¹ Ê‹¹ã¦žÁ3˜ÌÓ+VªrèÈ%@dÂ`ê½.9«E ï ÎßgJd ŒÏôc: 1 p…c¼p-çL²¬²—ìô2YÔó$V*‡Ã%TaP&5ê‚ó]àéŒ).#š§my¸tæœk‘É—_,êô r& ¾.!rÎÂ/‘4$”A "£&YO³{-pRÊñ ¿bc¢ie-™œš“D&HÝ*rùÉbL-ú‰Ë–.ˆ;L暉ªŒ/G,&ä0á'\Úøêsš=µ ¸|–âÄqhS_ó?lþ²Eì Ä<~.Ú.DŒQÀ;‡õðšæó¤µº½^z‰z´a¿Â­0åE#;žY8“Öñ9Ã-ëŒe -Ä2®Ä÷¿)t|'­Ò31­°àˆ=Åø#3Ñ«Œ>¥ò4àsFD R’Ç$ãœKˆµF«øŽ}3¾Î GaôÓÀ¨ñ©%.<±s…ìÿ:i€À‰Eu”@ÕÈÙ£neX‡åÞØ†9?x¦Ž·&Μ쾌M4ªÈ0v¤µÆ{G´%ðb09nx“«…ࣉAp—>Æ;ŽS:oÅsÈ3ž¦î*ÆŽp? HnÆõŠˆxݰŠÐI}cX…à~ü`–ÅfÛWa•¶=s/À¬O€¯»*'îPª::ž wx<›{Ã6Ü!2ê wÈv~˜=ºáÙ! ÇJS½~+žCžñ4Óx((Ì IÇÈ †c8éì¶p?%üŠ…º¿Eð|4`ÐF·c2è29Ï™œ·ØþȤsÉÖ@ 08æ4>G¢2mèó pB¯FœraË?X'¶À0ûƒñÆ¥¼d‰‹\šC®ìƒ²œ"—3ƒ¼äª¬‘óf¤´›ç )±`ÜoÃ>3bŸ¹PÄ7cÝåò’*qvîÙ½¤°ï6ƒŠæ¼o«Ô(?_Q\J3¼fÁV3êÍï&ȉs¡„u†Q.†R˜Þ;ŒÅ@`%Ùä.Þ£x–°0uD×4×ÅòpÑ{K3¦b%Qsþ»‡€ ÇT-᫉äÑdÌ€µÏ¤Éè+ª{t|æþDTËF[f׿|ãÁâºsâWUiÇœÚUzHlþ®œÕ”+9Å! ZçÒ|)$îD¼¦Œƒ1sókåÄ ÆVàÛ9Á²3]´Ÿ±(ÖΠã9ý,«úw)çmɈ\ëëµ-,×Ô/©ª.©Þ\¶s/#`·uî•<òrê ÏŒÈÞŠ[˜ˆÝvÎ@è%×ÃCÃÓ!2¯Š¤5ž&/v k¡D¡A*éc¼æJÅÉ$Ï $ö¬`o ýF$à.Ká7³•ðÁ‘:>zò§”0u劆„8l´Œ\‡yO%”è“HÁŠùy|Ço¹ÒsåJ—Í:=‰$ PÏ[oˆL¡‡ÌœRk¬•0¢€¬ä.™—·V¹¼|yµòR'×,á3Re¢¸„‘5Iš÷ vñ5%S ëýˆbÌ[9©7W9Ѫ¿ö ¯À}ã3ŸIª¸¬¤‹¶sŽò"^‡j®?óÉ ò08—¯­KÔï Ìû¨!ák¢Xè%L k¾QË·ìÇ|̳oàXG’iÁ˜€·§EpÒÙÐrBëkL6l@&2ÀúŒ¨SÓ×9½aü »6a%(ócŒµ‰×áÕ"R13 ì“ÏCþ°ˆ}Tì9¡ê™q2++vèW¨¶ªso°¿Æš#T'äª(µCÄ^œf0¸+ÝÒ)Ú)#¶D,EïJ«[6}辸ûHµCöLFhÂêÎkYxjJwÏ>˜ÜÛñ•©\Ý8tpMï+t³÷¦©wêª ×ID™b|¢£€Þ¨‹Ë'˜÷pœgWëŒz ßU0| `3 ¦¬¨\gß?Æíþ£ØÑËp+á˜7ÊHœ¦º(~ >êŠ`ó5ÉäkB²„•õ>ÀÞqtPJ èê‘ÑŸç¼6”k»zr¾']ûùZ³Gäš/}§8óŒÐò2œ9ÿž ÜîTFÜ©Ls£˜pûÉ8“¤¨‰¢¬Cð§QÎRœj†s±¸G âú³¸ê]Ý®_æ^heÆÜ¹d {Pt?):N‰fX\tn?"'ÃÊ|˜ Ýdb.'ÁWgŽÓ,^Øà§ # >å m½WÇiÜ»½²ªî.Â÷¦(/DëPׇú>>a˃g7tìH7‡æ~àNs§¥³BŒ9h{÷ ªu§Þ¾´4ð=-|ÆÂg:³Ñ]˜S“» ïõÖ«ÛO>Àïö†È~DÏô–н…æÑÛ iÏô+–2÷~lç0b×~וº”îíVÚjã‚Wîkвxža îí: ¸7<Ó¨¹³¶xÕ551Sx篘wÖzæœF[¸R=Àt¶ø|>‰œ¶UåA5ªmœÃЃ6ÿ⩺•K‚2iÿi÷–ç¾õ endstream endobj 2603 0 obj 5104 endobj 2607 0 obj [112 /XYZ 32.1599999 201.620000 0] endobj 2608 0 obj [112 /XYZ 40.7999999 705.620000 0] endobj 2609 0 obj [112 /XYZ 40.7999999 705.620000 0] endobj 2610 0 obj [112 /XYZ 32.1599999 201.620000 0] endobj 2611 0 obj << /Type /Annot /Subtype /Link /Rect [377.759999 308.179999 484.319999 315.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 >> endobj 2612 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 156.499999 110.879999 164.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 >> endobj 2613 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 147.859999 106.079999 155.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 >> endobj 2614 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 139.219999 145.439999 146.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 2615 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 130.579999 123.359999 138.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 >> endobj 2616 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 121.939999 112.799999 129.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 >> endobj 2617 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 113.300000 148.319999 120.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 >> endobj 2618 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 104.660000 156.959999 112.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 2619 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 96.0199999 249.119999 103.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 >> endobj 2620 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 87.3799999 210.719999 95.0599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 >> endobj 2621 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 78.7399999 155.039999 86.4199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters >> endobj 2622 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 70.0999999 157.920000 77.7799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 >> endobj 2623 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 61.4599999 176.159999 69.1399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error >> endobj 2606 0 obj << /Type /Page /Parent 2 0 R /Contents 2624 0 R /Resources 2626 0 R /Annots 2627 0 R /MediaBox [0 0 595 842] >> endobj 2626 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2627 0 obj [ 2611 0 R 2612 0 R 2613 0 R 2614 0 R 2615 0 R 2616 0 R 2617 0 R 2618 0 R 2619 0 R 2620 0 R 2621 0 R 2622 0 R 2623 0 R ] endobj 2624 0 obj << /Length 2625 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø¼Àjø~‹3Ý3rИrrf³,¶™ì!?’EÚ©¢È%ÙnÏÛ6eñQ¬çÇ"ùîÏŸÿyü÷ÇwOŸÿsüêþ>}>†(Òÿ;vÿý8,`¦á¬ÿ¨l˜íþ¿¾¾¿^/íÿ¿¨:½èþ´}}…|ýýð®oüЗ|~úkûéGvüKûí×ãßÿÑþùÙÕ×ýàõ`¬ê>üÖ Œ2Ó~~ê~;üí‡ãïmÌ©Þîÿ?R. çjQ?¾Ÿ_¥§ÿ†¯Bu°Ú²#¥¬ý,[rü÷_‡_ÚÚÎÝhŒà”k&EûÙ*¡‰4†µŸ5wÿ²ZÒ¬kÊ0}´ZµÍ‰¨¡h¼™U-­È R§¢®GtÙÐ(:]Uc¥º›†ìIîz§ %ö4LE̲^ªZH1MtËoU*êzD— ­'}ªªŠ’ ‰q\§c‰+»©Ã¿šX*ëTÔõˆ.™Ÿ °¦FÚ*Ymø9§s·é­Jݤ™˜¾u›ÑÛ4Ó1Êj£í¿‰f^æÍfa.F• *;ŠclXó¸£%J·5Æ4ʃv"'*Z› äBæ¨àûaŽÃ^uNÍç«$=g´郊v#=gì8ì»ZÒ/æú© Üî¶ŒmÉn}®æ€Ž¸iŽï•¿#¾ÿ¶:ýK"/v‰¼R“öáËáÝ'ÛE™_~iíØ)Tíÿ|y=ˆîKëë“öéÏÇŸáêOÇ/¿l£•TLžbÛþ Ó§'æ\@Ø©@7Är-Éà§$úéÓ©@\ D_ЈþU\3a­ü)µA­Qùx*mÜnèhàD-xWBã„û Ó¦)4Ø%Ž+9f SMé©€2ÿÛqp| Ø’}Ä3¦G‰¹ŸÀ]¢ÑtEãSÙLž˜êm„™˜Sj5Á8IPkˆHº»!ŠY5².©6·TpL¯"4ô>9AFbЪÀwžÁ'|÷à#ºo+Šˆ2: ä°v›K¬"¬ëz3ðˆ#cT@‚›Wàòå{& Rä+ŸD%`§c­‹·u+Ê‚Q¡,$¼ |®Fy 7,Ÿr‚‡s¸Ào]ÆØø°YlôlmcIíE–³ÀPΊ¯ø¸áÒ²ç3ŒvÂ`ž8¦™zbkÚ-[Îà“§ìãTß@ ÍÀ'ìLÑDmbCNÒÖ÷Gnت5þ½[þuªñjyÞRí[eµZm›´SM²>ŽìÖ Œ'éÿ…d–áUþ}¾÷ÀBµ¹é¡¼Ñ½Jš[<áΫc!ìêœ#Õð“·7)>aßè“3ë‚=pâCeÓ;9ãI¼ó jÇù˽æ¢Ab<ÁwÀ^W¦Lø°˜¢Œ#}y¤u‚«`NüTÎñ º!8$1R°x<‰^ƒ=`àÌ%æi‚w`N„¹Ãñ0EaºÁ´Fð[b¤ˆ™KÔ&¡Ú„©Ï†¶–™L®ÙéŽÚ¡‡µhÍ.Šcóße½ý¤´‘Bu„ k]×U¡$¤ÈÅlx‰ 'F@¿.ñô`H(Øk{Ê,ö®Áv臵ٚqÎbÁB‚q’|¥¶…A· 2*È•–¬–Œs›5ée¯UúÖߘXQ`ê­dcÖ†……F¾Åb ¤´`ƒ…ÀcŒtI’G´ /~t>_³¬#” ÿ‡Iö€Å'žA§!±zº`=7–Åùeýh±³`suš31±ˆ£X§ÂÕ/ð’숚 ryK†h}Óaiäàm3Û%ª¼È™ˆW|ÇÙ¬ãÿW…+µ¨ö½ßáûõÓMg‡9z$–­ë€ËRjÀÞS´Â܇5Æ¡G9ê³@Õ‡íÍ{&‰ŒNpÀ±g &êôŠ¬É •_•3zØ:õ!‚ë’Œ$Ø0!òë:Çùi-ÉöÙÆi¹Þ2FÇlã¬Î«jŒSé_ÎVm–x¼‘ÂBô¨ª»žÀ¦ó™=‡æe> L­JLß{pXÀQ ¡]zgýLÁSæñÈÉGZÖJú Dè7v$k‚‚]¾5oƒåIIA¢#v笱B±n”oC:<¢üäH¯sQ’‰pW7{Œ™”/ñªÁÞ›£êîÒEqó¾0Lùù4ø„gVsgjÂeËïÑV€QAˆZe>óA—ê•r ÄE¨´IJ[ݽÇó(W•Ƙ¥Á2¸kî÷“*TákÄu³\0¡D ¤X ¬œÐÎÃ9y8d·ç¹Õ5L¼¿3öI0BXãHý³ß2P¯*ê`‘Œ&£ÿªîs^`N7Æõüä– 50HR•r çL‚=¨bÕj Ö·tØÊMAfWr¤J¥ó`öZþDƘçW­ÞÈ‚ÈÀJÕ>¯Ýã-bé¹)£]²þ}†só#\dÛdœt¶Äݬ²0WR`ý1ÚaŽ— >oBË¥p­§}ì®ðH笓8­lÈa׿ÓåÚ¶”md ÍÆÃÓyËžN=Ttî¼M¨ð¹R‰SÁó}(l¹ªÖ[!ø x<|KúªóŠl+aˆ3—`» {(ÊÃÞ؃Dß04-6Lë„7s9|º< tCî3«ú0µ8 ¦<|æìÿ"x,qæ8¨SÂ`ê ¸/áÃç‡Á’ÖÆaI‡9äšçOµÃX2dÓz÷/a©ž·ëãz–ãú<•A&øìl 06¬nLž°•ú"LªÙþ$("ËŸ$Æ ×†9åæ1˜ca/1»‡ñá0ãÁœY×OJpÃIÔvŸ8Ö6Ú¡ý»@;ÜòIþE1ÌfžôFV££ëFk˜3‡1öÖðx01æ›ÓO;{ÒÌŠ«ñkÆ«@ø( ® qF5ÆGOø(O¾ 4 B{'ôFÕñÀµ1¸¶‡?xÛúv­ÊÏÇ.=üÁ”?øð^n\šŠf;! ׌àÞN›¸9![bpür6btu5ñcå§6Çî? [Æ]ü²[Á—´ö›ŽAýÙ¤UAüMwz7f‘ ÂèùGÎäÃzxCxohK+DÆMÀ3<}¸þÅèr ¯öÃú³â‹°Z·Ikó2ƇÛË%Y„Ga¬5ì³#r0hh"“ c ë ~ÙÒ¶HvÎ_ÞЗjžGnÔK‡QƺÙ*°UÇÈIÕ•jÔ­WLxM2±¢[æ/Ëó Êo'ëâÙ&GºQd[Y£€œXW6a› G‚W³#²LJ0v#Yˆù¹j)íTU¯$öU•, µ•OPW¶1Ù;uuÈ•ÄÖÌÏýÅ•y¹næ‚“¶ŒõûZ¶ŒŸÇ<7í³ý¹»X±jððëqŠ^·?vokxìFû«XÃSÖ£ï°ýH``˜½õ˜I˜+0ºæÎ8 µ/€Ñ ¼6Ò:±;ž9«Þξô„vÀäñ^ózk56sú’ç° ïfÖoUÎåÞøDÞÄQDðaRˆ#]·:靸ðÜu $Õ4d¨ûŒ°Ö¼ÂHꀆ‹n3CÜ{’q“Ï^çcõ̸Œ£Ö½ºTvMcÀBá-9esîuÁ±²Uô»bÓu'pìvV "œ‰¯ó·èÀÑ;QU¯YÈ¿váPn-æ<î|†º#guKf-ÙìƒUvÑë`RçÇî7•È|A%7à±e‰_|ͺ–Ü•ÏHY,óÈ”zdJý”ÂÚn SjE3ÂÝeÂ)[Ýtu{¢Çm.0±¸`¥ŠÖÏw¡Ýt¿—…ÚújXÁÀZ €Å¸rß{A$¡¡\ËZÅŠ²/¥ G½W§ .íɽ“h].SBô~ Õ¥<«y䉮n#5çí ¢[{o¼¯{>÷_2ªáª¹sü²Ø2_%¸ì€ ÖÙœØMøœ‘ŒäûÔk`9w·®³ ^%XÚÂù…8…º³ «$€ÁºAH([ 2Àzà9¬dSv]‘©pnî4ÿoM|CÒ¿ ð?l_gÞÎX¨UTânú<Ÿh‹Cn@ç­o%¤f¡CqËÎi«¿f¢V˜°(À×(æ+ƒ5®ü<1àÃèˆÃú’,Ö¤Á¹Í/¬ '‹Eƒ.#&¤Ãäx.ÏٺѲŠÃ\ŒôõIG’ GvŒuâ+Õt„{=K‡¿>¯ÄÒ]C÷ä“»™'y@á׃mÕ€ä°[Çôu]OF½ƒàgÂwÃÎ1‹_ˆb–(ó#Á50¯uÜËD§ÃñÕIË/¸q¤ZÜhxb´ :¨™ý5_{4k =2ŸÓÍ JG7›ïž;?ù œ%V|Þ5ËÏîKÀ{ùf,µM ¸jZ|‹ÃÓ&¶H»ràœÑ~(œ ƒyòØRNp›ôá$¡kÞ²‰9F^8$ØÜaãÛÈŒ=N Îã‚Ñ­ïýÙóÉÍ ¿"ß¼Á+@Ž È¼À¾¢ÖDWY»›]UüÖÿKL~ñfI¢+láçñxY0š…ðÈ:FIP1ßìΰáÕ§|·7¿d'HvŸcxý}Œ­¢+ì‚Ô´ªáÖæY›‘l.Ñ80 „wÛ„† P `I«Jš<[ðDÊG]4xQ°‰Pþ~ʺ{ìØ÷Í%µ Öåûº¾¡:зo!YÛ¸¸f`eÖßרmHé+NÅ(Z87H[” ²Ñî”ìä°ºlƒ‚Dº›r1v~#Û¹n=j#Õ<ì~e§1n9¹fÐtß;·á=—rš†—i—Õ?sìn °³](áþpm—ÌÙöøL¢h…Öad£8ÊÑ™Š†Þqe8kOÜxªm³kûuѲ³w]$%³Ÿô2‡:k05ŽO—IÌI!˜JáÇn–¬ONðßuc 9jÚýÑ”š¾Ô5iNZ‰_òõ lC©eÆP_¦Ì°ÿ­o£ý½û.»×ŽáÛ"jC´ï„=iҵŒÇñõðíðá‡ÍÓ¶ÌiK¥Ä_c+44©‰0²FšB‰)˜ç*‘`a3RjÄñDf昖j6,ÈͨŶ2=Jå„8Ð6d³jWŠCW¦Ì°ÿMŒÄR>!”²¨ ‰ÃéW|XËx;‹µ×+%'Z `°—6Öó8#žÇ,çqÎÆ<Îùsò_[ñx[æ¸ØÕ⿱1s:ÅãœDm˜Ç»_ña-ãqìÌãü|HR¿Š@I£4YŠ˜ÏëDÀÇKBÌâOvî©ãhnÎ=*X/õ´k=I% ¡Ä¶ Zç''˜Œ6Ñì,Ó7’Œõ¤SúFòP´%‘¾iËœFqµøod¬o„Ò7„m´%‘¾é~ҵŒÇ±³¾‘çÄ]yŽBz×+‡µ04f‘„’|Þ(ò+Ø-¶‡«)}|D­, eÆbÑòê„Xh²l[‰E[æßÕâ¿™±X(=%J…m´%‘Xt¿âÃZÆãØY,Î9…»®¼Ÿ<z–Zœ£'=,XÎÒf &´d˜bi‚ ]IÄÒÆƒ ¾ÿm &P3&P‚ ]IÄÒÆƒ ¾–ñ8vfiëÁØiáa8¬±Ûh^â_…àÒMsDªÀ° 6´­iaðòi}|Æ$,–OFÆè#Sè#!ºÑ•„òÙ•)3¬Å£ŒL¡Œ„èFWÊçéW|XËxûÊ'#ÝHlÑÄŽ·àäÜÊço³¢ªF*XžLD¶Ô±ã÷ÚæjF}ôÅ”ø¨ÔTÈÓïÙlõ=ÒCwÂÚ—¶s"íK¾¶/Q'ø—_‘q5dØL÷†+èÁž°5Ó¿4îL÷+9®FŽ›ùhÓ-4G<ôªƒé‡ê¸:Õ!ú>Sî©uyòÞ5ãü¯T¦ÿΔtäCvGÜn›œžâÙMV¿2¹úðæšË­ZA:É‘¡¹¬)v Eøaqk{†d® ©Û?91·ð¬3¸×pßãqyAy3ÉšCRÊh Δs¦h ËçShýZÑÐü „ÁÙ@7,ÀÎIx©i“Ž/‡ÿ‰§ˆ¾ endstream endobj 2625 0 obj 5185 endobj 2629 0 obj [113 /XYZ 32.1599999 464.659999 0] endobj 2630 0 obj [113 /XYZ 33.1199999 462.739999 0] endobj 2631 0 obj [113 /XYZ 33.1199999 742.099999 0] endobj 2632 0 obj [113 /XYZ 33.1199999 611.539999 0] endobj 2633 0 obj [113 /XYZ 32.1599999 744.019999 0] endobj 2634 0 obj [113 /XYZ 32.1599999 613.459999 0] endobj 2635 0 obj << /Type /Annot /Subtype /Link /Rect [82.0799999 500.179999 153.120000 507.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 2628 0 obj << /Type /Page /Parent 2 0 R /Contents 2636 0 R /Resources 2638 0 R /Annots 2639 0 R /MediaBox [0 0 595 842] >> endobj 2638 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2639 0 obj [ 2635 0 R ] endobj 2636 0 obj << /Length 2637 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň$ ø1CÃrXäx³ ëEœ=äïGÝbO÷ú(±DRêé²ϸ«E‹äWÅbUñÍŸ?ÿãø¯ßoÞþÏñ«ýùþó¡®ê¶ÿO¸ý@šJÉñ×Î4•ìOŽ_¿¾¿>> ÿ~?ˆöü ý1/¯üýëo‡7ãËã'ŸßÿuøíGyüËð¿_Ž?þ}øñ“mïô…oÓ·§_~RH3üçö·ñ߇¿ýáøÛÀ‚9·{ú÷¡ºZ·zߟç¿·¢— ¼uBÕæ(„~oqü÷Ÿ‡ŸO½ZÅ ¼ePõÑgҽМ˜¬ÛnhQ^Ø‹oEQO4´¾ŸõµŸÒöóò&s¼}ïi |ÞH|JŠ4âsÊ(>%åñö½rCñ­ž}SƒEvýÈn?ˆ®¿¼s¹õ¶ó™7ü¹ ðò¿Ô2¬LkÿÀßÏ)-Oà]ë W½¢kuW/Ö<·iô±ïÚcÓÑGíeKbmC®Ó4tâH¬êÙ ì.ØRÊáí#&õðvM›hx/-­#dš†N¥^ØRÂᕵH>¼²¶k®ÕíJi>7µvXd'û4 ÕçE·ªkv€M‘Eß‹Rƒ1½Vb& àIÓ'ý‰#±®kÑ{M­Sæ—í¼n‡BË»/‡7ûÓÖïËÏõùç_¾ôé?ƒÊoÔñËOÇ?›Hñ§ã—_¦2}ÝÊæ¼á´”þLMU÷ª{Ay{¦4Ã>t@¶”wã3¢jtk†‡®”÷gо~ÐŒTúÜøm#ÝÈÒõuþ »0rýªèP#¢v­ÛªD­ÖæLi+)ŒC‰è…†”ˆæ]¦å[(`Oj^c¸Ãî³Òý@,fÀ—ya–ßœžXòx=ÖæíZ 9òž…ÓÆ“€¼V?ŒÓ¦®ÚN„×¥èÝ×`qâñŒhÄ“/aþS¼CÅ;Wž®ÔÔØX_umóFã‡íéË 02Á¿‘þóp/Y”°U_͸¢ðeÁH’Q0ð}JÄSgñ²×*<ûçg¿/F¬, â ˆOÈAŒ°| ­™¹~c£É-ä…û%¯ÁBŠ˜lÙõK¯„»¿€]Rz:#ŒÎB–ÆOÀ­ eFZ $§i`w†¸h»ÿ›ØjDìJ0j¦0赚3ÌsÈ\o){c W®|JЛ¤ Ì«×jÀÀë oß±п`=o„ø{ÞyãiñbºšÑ„ iË…OîpÇ€A„SØ^°´›^¼j#v2p~Ç ¬g­ãÉ›ÃÓø)æñˆù1:Ë7$ÐÙŸ— wxy/XMǨétf°9J=¥4Ĩ3´è3Xºü¶W®Þz_é¯ÈãWtåB¥P¶³–àaõ¥¶­ÕU«Ï§6øÅæGëV¨Jiç|ç=j>ÀÒÔšÜ~bÏy»œ#I—Ûü Ý^¶®X½¡õ}œn­0uýŽ'ÒåÚ”l¤øšÅ 8ïŠàèNn“ÚVxðIŽ3øÌ¯‚»þ’Ø)=õ €RheV*c\°ühÁ²ñêÅî±&(>SÃ÷Èwð=¤´ÙµJÛ8’*°ñm{ç¯Ö…ï-LŒõØXþ@_Ì’%lõSÅÜ3´ÝkXËS(ú-äMA ä";×¢úcgáJófeß²nžýpJAcÃsää]ÐHÕç]q½t"ð<ÜÿŠË8s„ÕdWIm3`¢ëÜ)|Ï™qÄd£IÝÕÞ8Â݉=Ì;É·ö³ó÷×Q‚X ÿ;4aÿÚ8 'ŒT` g°#Ü5¡™y]ϵà85KD۞؊€Dÿ°‡àªÒ>Ï’ä´¸„.ok}±.GC×úÊÚ]«\Û8B}SÌJ`énÄty,³NP¤S]á¾%eíD4aE&UÙÃV(ºìY)ÉXpÂíº/àéLª­÷Fê„/’×{M’èý$iyÀ¶ÊéÄhw”ùènÉÔHŠQÅ"¨ÛS`ÉØék…“u7q “"Û˜pu8(Ú»9ѪwF}²ÀÃ7|üRR™L#¼ëvõÍ+ŠâÍ ØÇió»p1ÁñžÚÍ@+<§à\àè(tôNÁvÏ Ê®®¤ÎÔÌœAïP’ˆÖ¥šÿ.TЂˆ„hók«¤a™'ÉNNR½ÉŸü„± åÖïX|[UÅYî«ö*Çtð3 Ï,3ªŠÖFJÜX1¥"˜¶ÏÏm{·LM(?÷ƒ÷•;Èϵ“MôUo΃sev™©Ì]?oçò ;¾¶yÏîÉo€wªÙÚ ^S¼Í7Àð2˲áåÌÝÄ™») ËB¥È&¥WàáJíÂ(%’ÕVnH•‡wòGSµ«VòvÂyçk]˜óç6ºƒJ|Í1FDIÂV̯:IP:%ót;ÓßÏjO”+0Êž³dž¯?³æÔŸïžƒÝ@󵬓ÔÁˆ®ì•96L whö¿òr:©mfÝU¥âV`5émã(¹wiõs÷”½żƣ½üÙ$‘¤‚ÚyuòÛ›¢sÖ^@„®Œå®ê{r:p ý¢µ@ÏßÞƒgÍÕýÛÏ ÍnDŸÛ53 ³\¥’¦?VœË3œ(æÅÇIFKG±øgöÈ¿}Vm|B„f›kÉŠâoÅ’èË«9e%q¬§ý%?WC¥À½•léz‹g7h‘pï">)Mt«+„É×IgéqYˆ˜qÇ¥"`ÛÏóv¿±Mu6Õ{¸ ½Ï’Pñ1PY’R2"rÓ9òÀeBbŒ ˆìCÊ…P)J`%áß–ª.þØZ8.yL‰0²HpDÉͬJ²$J\TËü=fbT0‚Ï(gÆÜÌ’¥&ùš8Í|pûIj•Pªä•¬½L ƒÛ gE ¶òÖÚä¹&øµûÁ‹••1æ¹\a¸€œÚ­wøÎtiÆÞ‚„tÇ롃Dç΃<Á¤<èˆ$þˆìúå±fIî‚Ï“¢Š·p1(³·²0©']›{U½ÃÝøeI >»š:ñîàÓò€Ó4Ùôy’¤‘$iä¾c³’Þ¿æÎÒ¤ÙÓ.Ónƒ÷œÆ+¤'-&*H”·ô]¦ä°cj6 .÷…å`ªeT½Ô®ŠX®}›poÞÔë4Ó-ÉyåV÷\'(ñßÐ×¥q=Iµ±²¾§ó0ÜÊY¼óøÉ¢›\»é¿ŽP`÷²|Ïç_d–2Ü©Lbåó²¥.¬Ôë«ÔOÂ;Ën`dhð”_ÐÜ~ðëás¦a;½ÈYXcÏ…¾`ÓFfʼÔ! i…+5 7ypêÄ‚³ –Ûþ§†1•*)[ØR>Ý^]Šî̧º>§wX§tÝ> qŸe[…½-ø*ÝÇÍû'íC)}Ù=–í‹8+&‰Ïsi`³"…Ï~6(÷Íç³BùžTAÏaYâÒwiK´%9U)ì„ÝÏ¡Ô=¹Û6Š, „C•û DKDlj–ÏÆ·wŠúÈÅËûF«ë¬‰]ÊÅá$\”À$¹ñ9SHþLJþ¥?½ ×Om˜%Ã|ë‚­6þÍsö>§§É+Ø_Âñ=^ìúîiS’¯«åñ2t7/µ+‡W]6_j×® P©]»÷Ý¥·×¯úÕkÇõ7QéVjÙ\O1e”À a½Ëz7ÜÚöI¨¦]S­Ì–5ž½º„æï]Õÿe!CÍó‘X)èýP¾ØHÁ&O ?˜kœå‰[Û\ 3e”Ï¥’¢4ÎŽ@^3íÕ°ÜD EPAÕ¹†ˆ„ÝT¸îF@Öi# î}ÎEY§8ÇkdÈ5ž‰‡ÖskÒÜÁ3žR…²² ÒÛoŽa#°ó¥ÌUò(®ÓóãȦ0e†‚Ñk°€þ˜Û€Çi ‚+HB¼ÅVpà™†ð ¶qpkB±h)ú= ?°…A9†"ø0G¤§u»aë‡r°QÈöì+àL¬¡¬ñŒ £÷#¡wÅî¶Ü€’¥Ë 4°µ€U}cg6G¦<…uÁ#éŒb8.ççÔs`”.S] ñaû.¡Š÷د´9 1…Ÿÿn?ª§ü¡ŠŸÁ5£’Ôs™áí+|°ž¢I‡ÔŸÍÑûµQX±6zÅÚ(n•à‘#d²ò(„Fcõ>,oaóvÕ´•frÿ«Œ’ŒxŸÛj ÞŒê˜â5b§Fi¹<-J@®X6xxÍ{ÝÂbŒ` 2€×½/oØð³Oˆix½ÓD]µx1ŽÖ0%FüÌE­Ô¢y‰˜bYÊ ÝÚ8ØmÍn!/["e/]á¤Ñ£¬ŒxÎÃÞ9H ìàž%­€­ oÛÛªLy$ ö—,l\Ëà+ØÞ„Êsà´»&,kÊÝn0—Ç8ÍÖÚ;#ñð÷ø}€ÜNO_°?¾~ `°Þõ¼?á;øè,î›ö(†nLÀ¾êE[õÍQÕ—rÖjoÛª6­z]yšÔ²«:WÓÚMPF{P©JöŽ¥h­¦jGêZCSï1ð™>3.ÒNV²V'Ò•ò¶6N‚Æ›dSßU·™èáGôŒu NQê‡U¯qÏØ‹é»åí¼V̺Óï²χ[oãGÛÂDÔh«‘ÒŠªI daÍþ))ÁÄà÷àQ÷ç[€'8…×ʆãoŒÐ•8휉`·Gÿb8Ü·ÙÄŸRâññÓáÿÙ” ö endstream endobj 2637 0 obj 5123 endobj 2641 0 obj [114 /XYZ 32.1599999 714.259999 0] endobj 2642 0 obj [114 /XYZ 32.1599999 406.099999 0] endobj 2643 0 obj [114 /XYZ 32.1599999 102.740000 0] endobj 2644 0 obj [114 /XYZ 33.1199999 712.339999 0] endobj 2645 0 obj [114 /XYZ 33.1199999 404.179999 0] endobj 2646 0 obj [114 /XYZ 33.1199999 100.819999 0] endobj 2640 0 obj << /Type /Page /Parent 2 0 R /Contents 2647 0 R /Resources 2649 0 R /Annots 2650 0 R /MediaBox [0 0 595 842] >> endobj 2649 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2650 0 obj [ ] endobj 2647 0 obj << /Length 2648 0 R /Filter /FlateDecode >> stream xœí]Yܸ~ï_ÑÏ ¬,^:€ €gƇ† ä!ÈCàÍf±ˆqö!?ÒˆêƒìGñf¦=€§§)ñªbU±Îwúüã¿~?¾{üüŸãWýûñó¡mÚ®]þçŸ/¿àC#øò±TÃÇùßñë·Ã÷ã÷ççéÿïÖ=¿¨MëK‡¿ýíðnü°|óùñ/Ó§ÿùñÏÓ_¿ÿö÷é×Oº¿ùo‡aìæÿ^>0Îø0ýqùinüåð׎¿MSžûÿÿ‘‰«‘'ÍãûéUöüsù*lš[Ï.Œñ鳚¶ã¿ÿ<ü<õvšF3JÆúNömp¯=Ÿ»í‡ö8öÝqîÙìÔZ[`W© "déhžK[keïîª:ý~h˜Fm;­zr›\í &÷óÜUjGly:j°¤,MCØÑyëy¯YÙðŒ\è©«ÔŽ¤ÈÃyF,miëÖã®r®NÙW?u7輦HVâ~®]¥F²–çð<#–¶´¸«Œ–|`¹!,…èžwS¦áSOÉ}Ÿ©#1w’²2 _«§OY$'~–œ¾;^|ørx÷‘I1̂◟§‰…rµv½’Z/ïTõÞ²÷Œ×ŠB \˜Ö8Æéã׃)q‹WŠ{£¬Î÷Æ1ÅÇ”ó/"qH-1ÅÒ©—¿×áÓE†N£ÐñœÛ!½`þ\iœíéÓ½eß-¯ŽÀÞZ–óÆ€gÀ tGÁÞp‹c0|0ÝÁ|SKŒ;”}£Ð7îdàF#`E²}fE£8Msa€ª|`\].`™ÌpþbÙÙÈeÚú¦’Äîy‡ZîMÀü΂Ù2`àV¡jÀÄ-}A€®álðL ¯Ë±xÌ^“îÌwÍ/ø“·w<3Œ'ÖÂá£ÜZe£Ã±wÂ?3a Mf|õùѾ}uÀ$][sL9vx&°Å±.LFLèDà˜} ¦…Ÿ'U³“ ­/sb‹ó™^Œ†/Œ†±FÉn|ÀÎ’l?}Ä3²·Ž!1çØûnÌÂ_ßv¬8‚tF½ˆów‹Ä%á;ÌO°¬'àÔ²JÌ1Ø„ kFK¯C3Œmw=ùE¾gjݤs hÐy·—c-#Þ`ÊyÀ0ÀÂéCT §ŽŽ½ˆ`N¬‰“µM׳[Ð)È­F)Ík†%ÒY¸‚ÏhsÄz7ì;uñoU ®p–'o …ØRÜ=éZà'Êá˜I¹G0H?ã*MnäÄœ"w½ ¹…¤£7'YÄ]/ ’!Gƒæl&ãh·ƒ(’f‹lÉ^{„]P"”wE$ߤ¾95g¤Æ\øí°vª µ ¶ŠM¶Ø¼¹¢ô!UCg¬@.›Î›4¹¹’V!Ë=Ù>M– ¢_k³Á¤ võBØõödŸ­x^Œ$I²Í¿òÚ ß’ ŠR¹°v8ry k[v\} µ]˜q›º3Š0ë‘ÑxD,ÛÀyÓÉgT0ÀåË'‰Ù|¶¬¸áš‚Ä/¾ù`¾ÄõdD#ä5ZÚÓÔÜîÖ³«QÚ†ŸÐ”Yßú] Ðý¿‹V²uC V‚"ÝÇ(×ê°ÖE¹‡[<Ì¢AL'Ö²*YåRk¥(G#6gkã»-·G\ÄÛðÕ¤Ø Rä‚Í8ø«·{aó¸W{ÌÏ|ÐÔ)mi „ÁO_‚•8‹n6BÐÝ‘çK6عîó}o‚Ÿ`çÇºŽ™ѹ[ŒEû¡ùÁ`Ϭ ÅöئÎYŒóµí#•ølŠ~7Á%*ÆW©¾‚dPIp"¬¦O1Ç'¨샖—^Dœãa#©šÀ»óØ`÷RøVމcj–¬fRKUí¢ßd¯“þ®†£Ð€ݨmp¸Æc9Z—ñÍbHq¶ E÷=CÁ“1ë£Q)l@f3oy#cÂ+Ò;„pJ$MÖ ‚#vŒ’Ýç9À-p…ž8šHU„½à^Øïæ:w‡}^Ø«ÓÕÇûZêÌ´oýXJ‰„$ÄËç3²yä1>›àÈ\3‡>à á,q‰*,ZãEx:nâŽ;Ú+¿>F@ÖÆà2!5¾¹–¥gb1 _œíݰ©’îŽÝh¬:ÆK΂¶¥Jqœ!ÜëL µÍ¶å(ÊÄŸºõà#F±éâkU„iN?Gž=<\)'dHĽ9²åf À>áw{!éÈ7ׄ¿€\µu ¬Z/„_(}û[+ó¦À¹ÛpŽQ8·Ÿ@¸o¢V¦ð½¬´Î™éFÿ™Á”*«¼Yóê¬nü«»S„7Dð¬kž:Ùö §î…ZÃdçCJ¹ñF¸“á›RD®ÅJJk{ò–Ö´VΆˆ»ðÖŠ'Ç…Úº6‡ï')v!§®h;MâæÚ¹Ê±…ƒ/U&!¥¡˜]Tsºf‚8¶Í¼ßN³fÚc×Ï¿zƆå[qìºæyþm»~óõЩ†±‘s1ý”¼êE^Ž1=¿ü=ŒókGãíIN2Ƙ¾™Þ¹žÉüÔxÕËx=Æ/‡‡Ê1ÏAó‘Qy™'ÏÆÌaª±Ñ˜LúeýŠ,‡8õ?v6Â퓉;¢iFj©r-#s•ž²rëêF{ƽò'Œw¾gÍtYÖ–B±‡S¤Ãw<£ð3c÷ê4ª‘êË%˜x×`BJ÷QÞuDß/!÷‚ÇÚ ŠCC81ÇÉÈä“îD vò†áGÃ2§$IeŠWR™âã ©lš™!1ÍߘRÙóSòªy9Æ*•)ÞßÊïÌ1¦oL©ìù©ñª—ñzŒ*R™k69ÔYX ‚[° v¶bPè(21«®'þ©ÕŠš"þ‘nÝÒ‘%è>e pÓI¦uÅI%/Yœ´óDsæÁ²€:Äë*þÀ|0Ž%¦åé’½1›||qaEg¾¸°!“/NÏš¾±øâü”¼êE^Žqâ‹Ëk&_œÍ1¤Íç§Æ«^Æë1êðÅ~Õz+h4£Š+çY;ó¬ÇÉÆÓI……¼ØeO÷¨Œ™–¿ö²Ö³v’Žûý×Á‰ï÷ßP¬ÙürêOáß+á¼Á,•² ¯Ö’  Èá-hY9”d|%d H"‚Ý©#(P¥:QoD+Z'GYÑ£S½qض4wu}gÎ&kb¡ÂiMʈE~V`>¡sÇyLì>^£äUAXw…Í2–f‰10ùaŒHÉ™\)øèÄêY’a\Z˜é½5Üo¤ãÖ{Ê-Ÿ¢ º5dØÐX°·Oiβ•õð¸âuƒØú4¥d̶}pˆqDÆÁ,LÂ/È…¿›R›–6œP²¶¯Å€a»þaŸ5+p•’ŒRõÃ{Á¯^ÐñÅd8£4È›ÀÙ4öâö_’ÚwÌ$÷åu2ÆÜG’ZÚÈ‘‡£MV¯ü$,Y6K·ÑÆ¥8{íuuïAäû"Ÿ~^mòZÁ[8ì·àÞ$Ü7GºC¸¸zÃëq„›Á5ŽƒÊ`orCû5ÁÝqÉ=æV1x­W÷RÎŒ#˜´Ò ÄëÙ˜nÀþöª2f;<é0%%ì|‹g€i_%ŸÁZ'•xN9M8Qeà H Aà¾eö­yjGéß_œVã?ÞEL°,ãKÅ’ cwL¹(˜äÀXL0?Ã-ØG ž@ç™c)c"Ngƒ“ÉlŽ;(\oÏRÔ(®éàp*E muF=%ÁB”ÆLE·OL(ôßA/ߌœµ=}¡ð&<·½Ë?é)EbÁ;Ÿ+vBWOªÒÕaÜÍ©Ùþ†–™’!Q¸Á«£„=\­4ISEpÄÈÞùÄØþ“ñÊîÉx’’°«&I|ã¬È÷F~²÷Tä{£<鸷¿O¼¾GÑ)ßùÞïQwgs Ø‘SÉÞ»g Ñ3&+÷'ù¿`JF˜†œ#±4nÁÅ4 ÷¯èg#Û~¼ãþ;Òac;+¶XfµÞPN.ͱýz^ÓÙtGOIvJúU&‘yLhvz¦Dêàp{Ú Ë‘8<úÝ^pD!»ˆx]+ƒû¶ÉeØ’]æŸöïÒ\4á+7ö£LˆwR~„Ý%ŒHz%¯qÌL^B½Ë-ˆ'±Ê%æG”7H8äÏÙ°Œ{+¸Ð Öª’d#*Ý!I #h¯ÏšÎÄ™ÂÜÃYcÎ!0Øq®pKBÐÓ H@" J…Š2 .!GU@gYKUSP«Œ/”Ì{Ò&G ä¡dMHÄ”7—oxè#… øÝIü)«*òë]«pA>§¨cbÒ˜E ¨Uƒ‚³)u„ÂWĤû ö¢UçHkèêÈ7Ɖþq -Gr­Œ),ö ¥g?|0Oò«¯÷µuº/{ƒëh4Êœ PÊ F²7!œ\(KVá²iœö¡ëp(>UgR—·aó†É5yoRÛúÉ};¡ŒIà„&1§ l`Ç=&Bÿþ ñ1ëós£ˆ<ç)W ý)^²TéËrë´î„ç“Ëš&>%)uVý ƒ"‡j”4G‚¹±B:7Í5Ï•:" œPâÀ2!:R²ÜªLX{ÆÝù)Šü¬9ÁmÆ–¢œß,Ïí à¨eJ°—Ñý9f”RW`Œ±¦Ô¡«àJò¢‘ùNC ›o.of’^’ÃÚ p Q–z„ITŠž+:wiïåΠ oÛ«màÂ]sTÒÉk{-]£Þ—V·ü­‰·§ˆÞ"N»oPÀ¼§äèµHå¡ΜàPÁ/k!-À„òþ’$/µ”ò Ô.àœt±®¼Ytò%Ü‚Jrˆ¡7XÄŽ\©),;¾h)…ug03’”Yý,Ø«4ÀËËë„PÇ”"XÕ†üD(À•ä#¹L‰7 ¶æfÅv=“o^£É +ÌRÞ4‡â`ud°B3G|„%ãR¸,¥Èjaå0ÚeªÃÅQ0j…r.á¼)¥ ÅÒ³T¦ŽÀŠV!‹{lŽå8fîáZËo#‹f?Ūsk™¡2Á-1W‚Q¸è¥ÝG„0 FÙûâ®&8oaÿìZf%ïWGµ³õˆYïUKr¬_×t~ù½ù²ýÝ7ѰºQÁV'·¸UÛÖ*ƒ ØJŽæ¯ +7Z좷š\|óÁZÓgcÌÙ~¼oúÛT¶¿Ñ²2!>|S+UÓ-@0Ùò­qøÎßY8wÏÞŠkÑôö¶`îå7OðY-æÜXáGôŽæy·ZZ‡>qïhˆÅ¬]Ïíù$`Ýü™+¶¦V×¢^´ÆmÁ4ðþÙÐfOk1Îà9½GgM'õ½¼* ŒMöʶÈa`²a³ÞÇ@ -¢õöÀN©¿¤Ò)ôñÓáÿ­"7 endstream endobj 2648 0 obj 4525 endobj 2652 0 obj [115 /XYZ 40.7999999 357.139999 0] endobj 2653 0 obj [115 /XYZ 33.1199999 542.419999 0] endobj 2654 0 obj [115 /XYZ 40.7999999 500.179999 0] endobj 2655 0 obj [115 /XYZ 40.7999999 357.139999 0] endobj 2656 0 obj [115 /XYZ 32.1599999 544.339999 0] endobj 2657 0 obj [115 /XYZ 32.1599999 89.2999999 0] endobj 2658 0 obj [115 /XYZ 40.7999999 500.179999 0] endobj 2659 0 obj [115 /XYZ 33.1199999 87.3799999 0] endobj 2651 0 obj << /Type /Page /Parent 2 0 R /Contents 2660 0 R /Resources 2662 0 R /Annots 2663 0 R /MediaBox [0 0 595 842] >> endobj 2662 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2663 0 obj [ ] endobj 2660 0 obj << /Length 2661 0 R /Filter /FlateDecode >> stream xœí]Y‹ä¸¯OáçÀz¬[†%0}ò¦!KÂl6aÉ,éìC¾~\e¹ªZòO¶Î:ÚÝ0]S²uüõ¿éÓŸ¾þ½ùçïͧǯÿi¾™¿_w]ÛÉnüiö¿?œAuËèøQiÑÒ~ÿÓ|û¾{kÞv_v_†ßvD^4†Æiˆ±Ãß¿ý¶û4¾¿ùúø—áÓÿÚüyøß¯ÍOþülúÛ?ð}§{¹ÿðïñ¡„êá?çŸöÿÚýõÍoÃô¡ßý¿?ÖsEÓæñv|•~Ï_Eƒ sSœñá¾ bÇÿ±ûeèí8¶ç„(ÉU·ºWEÝ2ÙôJ6œ:}:K[×IîH©L±}')+#WÞž¢á.¼ß/R¨ÔUN=%ƒKˆL¸ŸIZÙwØS4Üe§3Á}ê)\RòL 3ÊwØS4Ü™à>õ” .¥H¦Ž†å;ì©ÕÒüÀÏkÆÑûAôÀ_É0b“ tjˆA¥BóÔUjGDeê¨;PCÒÒÌ{ºŠ=£"è]¥vÄûLíg” ô¸«hÐ )sþØUjG*“v˜Q&Ðã®2ò5¡÷üޝ}É¢¿Ó“þþæyñáu÷é…p¦÷æÊë/Â6Ïøçu€ªþ3¨’‚7¯?7?vùüÇæõ×]ߊží9Ãá¹±EÁ [PK×ÃwtÄ8µp8‚g P Åsc¨…ÁÞ|Ç·'ØBá8ÏápëànÇ´08žAT †„u÷˜Gñ.à¹a<èbƉ S `K V]¯ \§ÎGôæy¯sŠ.çJ >¿R*Mæô@àðî pø r¾#2"ÚnœÍ‰ÙŽˆ¬mLPÓ“ç9{t\"·átöÄHZ²¥DÏ"ÜÌ0†€Npf ㎻~ÎôeixffãÎÞ¿à-Ÿ<wÄ2Ñ2ª =¸g®ËÂÝÛstö„è4먭Ç+Ç[î@wbã€y7Íxô4ªº‰ÐÉ›ö½=ϨãÙ~§ûÞF*…¶Ò3[Ö3©Dª$^¾ÂQ³a5”TبéÓÙTÏÄñÖAðcDÀÈã"ž¶/Ñ#æHŸWc|ýöp1Amî°©cÇ–‚¤&™MjF÷(.l2”òŽº\óµõ7Šq÷‹\’ŽŽBZÁåþmÏ»\éÓz­2`ž¬Ý 7È] Ò„vxQ7jŸºÕ}÷ã±Ò}†œün¯ƒúPíÒP°pq;€†Õ>Ûg¸¬ØÓ~µâëáxY6•Ç 6ò«–dûZÛ|?@ÙÎa…/Ææy”ÿ [3À\7 …(— ^ú+vÊ{lµ<Ì'ƱgÂy(eŸ½+r-G8/»M!ª¹™õ" OÑÅŽõ˜å¡Ôë/@³H ­qGëžØüÿ Ùa°¹š‡q¹A•†c|;¸ê,oQÏáæ•³ PB£RÇ?‡ còðl`YÎ@ŒM£ÞdƇysÆ}–½>ž7<7œ—Å0¬³flQñ´`ˆn™a7šv£ô±ÒEš+/†„>º—a”oÙ-âjX)ÀM€Š]ËÊ}‚k,§»™A¶`–¬½: Z’[¤åɤÿ\šÎ©fÖl\Ðb…Ò™îÀ²²Þ´šºªädy¯%:·UKTÈ*ߪ%âptÓ‰#÷§VµÄ’ ËTwp§)}˜¶Ëëø²ï ¨ÛÈ_HIé q¾:þ1'æà.Ͼ‚pe°…Á–'8Y<¥€(sŽŠ‹åƒ¸æ"V8±mtY|%œä«,æÍ¹Ýœ Šó®7ƒa3NĦ\b)V|¯Ù0ÙÌÕcw4ÅpË«ü*ɧ”/äu뎾GÊ95úa^ð6IÞ5-/P¬vHâ;—´SÜh!„Yr• l’@Å•"¶£b©™;þIG5 odÉ{ÅújDÎ ÖžVT¤C6F'‹2œüÖÅíò¤µn6Êå+pÎ8†£mV¸H°žDÃÓ½Kzs„#9rÄÄpø3$O-g’}žâøêô€"ëùËxæî,Fx\À8sﻚ sˆYZ–>ú¢È7×C©.¾f-[¡í\âT˜°,•­2cvQÖ—VºÌ+¡èð¾ªôŠ„rÊÇ¢4‘N1,Ëåc*Død©˜ /Z©}˜R€ÊïB/ /E<%(¡1öQRRTÝÐlAJgDÛ¤Ž…B@h©vc@¡KG)S‰^ý$™ãI×JEÞ‡máê|‘´ml"›hÓ åóËßåÚ›,!jósy­vé­GÌÄ oí„l“S²‡:?0‹S'/¨…ŽÚ;ˆù{.âéíÁ™dÄÈÇðŸkUãf„¨Yºã”˜[ÇË2H©ýˆ§»gÔâv‹ÅP‘p…pí““¿o{}h ¼ˆ! óʪ¹Á]&µêz2™2!§•Qg0kIЉ¢üFXµ È•JðŸ§(¬Qòm½.m*sÔ$ˆ|> GW”¤?™ FèÂŒÖ?šÕàúȬP`Œp'z)'…ÅÔ Ä„2»¡RNMê!ôxüy­¿€S Ö;Ñrjb¤Ÿ/½…‡˜ª2è1¤ì%òV «å”z´þS2—óNß9Ùhý¬F¦[Nm{A-“~׵ހ{{€³Ž˜‘†ªeN:na9©£ãvp=/°¦èÏ8Ϩc8ì€ÇoÍÚ¹£Á^0žEµ„Ìö)|¶&}’ˆVÛr¿sÔ=;µ.T 2#&z‹Ŭڃ…˜%¤*HoÜE#þŒ‚³jn³Ô³-ôd¨—±-.We±5+NŠrÞ]¯¥^*Uì&ö$Á¨IŠ·f©žOI΋I| ÈŠªŸO‰¬qÜÖ8èQZ!Ä+¿žÐܸP›ÝIÑYþ"‹ÝŸ÷¬†¬Ç`ÎyZ‘Naå»~8‡=:dµ\ñD†"²U£Ü(UÙÆýoÁr±ÅÅj5Ñ·À‡Ï³l^ó‘ÇMŵ¸úW¨e­¸óq† Èñ¬a‹§â—£Ã9kbp½è*î½ê—w8¦î Âs¨®S‚‡—á:²˜*»ªôØëÅù9*¥Êê9žöTqT&yœ‡+áºY Ó%ŽYgÝb:¥Â#k²íƒßE$hwd6eŽ|[¯úäɤ.s“•¥W?‰¤N,*CµØ`˜`¸ YQáÐÕr LÓ»pÞlˆ‘ãxù°yà*#¸l›.¹áJòw¢,D HNÍéÞÌ›zºBÄd-ç+#AÐÌMí FÑ5\„x_#|ÈnùJÎz¿,Gx…Ü™»Å®bbW÷^3ƒ¯€©•M$(ŸDEµl¢'øÎ–Mô‘²‰®9wh)S¨(aÚ”¹eÉäwèÉuS§†bëÆS·çÄ×| øÜ}G© ¸©Ž½)]1UÚIæR‘l¡,Ÿn›÷ ¦¬×’PW‹]$Åwã7#ç½wbá…ëÞ^xyGoùaN¸YÏ%£Nóˆ1cÆÉrl@F`Ž‹}CXNÌe‰—ºý†Ž^¹¸~S˜ÂTò|#­l^}¯Ž°E„ó kޤí;#àÇU½|JãeCåíkÖ‰Õàªʈ ZE¶]Fp —&Ž…P07§Ql‚àd»¬‰Kž\˜æˆSÇ-בlÇ”Zœg¦852æêˆ˜=Á锇»ßnÒ$ëeÂ>FµÜd²tå Eªì='¢öÞÇ$æÞ䥸nfÇØ%/¶ðÀ-æªJüR`XãÄÿøÛâëPãWÃIï1%› –¢qTLšçŠfuÁ~tãôt\šuâŠsÀ×;cN§9Â_²ìR¾T„8&—5KºÚÅN>Ïâ q{ßLž>U6anzo½ž<ÖןíHH0 û¼bðúR'Ö#_WÑ‹bz[BÝGàòZj飂>•/¨ˆÉƒÊ"ºRŽe9p4@„Õ9g )ä™5åj}•‘ÏMí©t•Ì…ŠQb×(“³uÉ0mO˨R@iYvdQ›c–ã¦õÝBpr0ýsî>3>r]Î…nž(lARna¿‰‹–¬Œfö˜w€QÅ·è—kö·÷µDF%I9Nf‹p_Í>²”L…¨½ÇÔ½ù¯$ö-Eõ¼‡-ö½Å¾¼ÏØ·Tµ3Ibxì=FÅeŸ’uP3*®Ë>ê‚ã@ÉIôÀ˜pD,+¦’Òõ¦T:r'Kíj„C´ŽñßI ƒ+ÿijðÁ1ÉúYÂ~[=ûý–g±ž[X|·þМ,\üdÑ+¼DWhbç,ø.ÑuÙ.Ñõì™eÑ«r â eÔB£{“3> endobj 2672 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 122.899999 212.639999 130.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 >> endobj 2673 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 114.259999 136.800000 121.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 >> endobj 2674 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 105.619999 132 113.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 >> endobj 2675 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 96.9799999 129.119999 104.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 2676 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 88.3399999 131.039999 96.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 >> endobj 2677 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 79.6999999 123.359999 87.3799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 >> endobj 2678 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 71.0600000 125.280000 78.7400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 >> endobj 2679 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 62.4200000 174.239999 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 >> endobj 2664 0 obj << /Type /Page /Parent 2 0 R /Contents 2680 0 R /Resources 2682 0 R /Annots 2683 0 R /MediaBox [0 0 595 842] >> endobj 2682 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2683 0 obj [ 2671 0 R 2672 0 R 2673 0 R 2674 0 R 2675 0 R 2676 0 R 2677 0 R 2678 0 R 2679 0 R ] endobj 2680 0 obj << /Length 2681 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9ÀÊ|‹‚ž± ‡È!È!˜Íf±X/âì!?zPÝ©)J­öÈ ìÌPY,Ö›Åâ»?þgñïß‹wÏŸÿS¼šŸÏŸ/¤$ŠôÿŠö¿Æ L—œõ¿VZ–¬nÿ¯_/ߊo——ËKóÿoªºÍæá0Dßáﯿ]Þõƒ_ú–ÏÏm~û_ÁŠ¿4ýRüýÍMí _/ºVí/¿ö¿PF™nþÿÖ>üùò·?¿5 è®ßöÿ?PA”zß®ŸÒî¿ñ§h°¶Jj© JYó»lÐñß]~jz»‚QÖ‚ÒJ‰Š,îµbm·5©‹ºREåöéLmYOtuGZdꨈ®š%¢òö”ŠwE¸ì&YË•³¼ö´]в< ØADWÍÌà÷”ŒwªIz¿ö´]LæZ@MòÐ;î)n’²Z;Ë¡§ÕèâŠeꈴ¬™Ù€wØS2Þå™è}èi5º„Ö™:j ÊCï°§d¼K^g¢÷¡§Õè’u&9ÓB”‡ÞaO¥Væü}É8ºD‰ffÄÆÛr˜ªÒp˜T*Ò2÷=­^üšeâÞ¢<Ü {JÆ{]›IR±_u|U”ÒL+Ø@D×MmÀ<„6þUÕØòè÷¥œUu^à¬-†q1œwºÏ0-Ño†1Ú’£;ÌKØcŽàæO³±?Í Q¸>õr îpÄH º‹£å|Ð,äLG[cܰÀ 8X1†Š¿^>õ²1³ Þêèn¨—º.ÆPÕ‡EýjªŸ[À;à½î'ô×DÄ9MñFø÷ÈþÚÿc”QçS: º²[Ðõ›çç/—wŸê6Àüå§æé0Øýøòõ"Ú?ši5æã—‹?ÂÕŸŠ/¿\ê²ñ\“]X»Â>uOôµÖVa]CU’šW’Œ¾¥´{BY)ì'ø§{Ý5|üÒÐà Ô A‹>š\Ѳ…¿5åªqÃdÒ¼-QÏd9ž[¦ˆ&ÏÝl„==U2ª-Læ]\)»ác× KÎ4¬+= ÃÒŒžØ âÅŠ™Ír²!>‘hAU9&б…Ÿ`ÜÃi°öÛDà/b™ †SðèÁ0îÍ¡Ôç)›§3#\~ä‡2åGªà“ҞГ«°t¿ùß«á8$J|âb È'ö¾—áªåéÛ“j9GcVˆ ZHù1ؽŠ÷æUUõ"Ë#ž¢Üáž–ç°HŠŒÃ*güM’ðÁk•EEªphÛ–¶tã f<›åRPð­Ò[²Ô†bJÕÊÛ'o,á€,bס÷YLIlôÁî] 9«õâ¸>îtÄr.É¡-“ Ôhl´ö˜Úé`ÂÃl¢Ù=eC#N‚*ÞãKƒÙl(:O_×Á™1…È?Irâ"ô¦¿Û! ucbÃ¥£¬²×O:«*óË]³|A¢"ÆìZ.¼\9îØíÌ0’w³# ž¸Ï8ôó¤|x÷öd¹ãéäôKRdËa­ñ¬j0ƒC¡¨-äj›Þ8$•zsõY)<¿ØZsha%"‰´'Ae˜EÒqLq[¤º½ïCÿnà9Á+ŠéÄa"Ì€xXá'˵˂8•Áx©k¢ó‹ÐüpÂÜ&+‡w•œ ’„È´ø˜‹'=èªçÊZ°Ò÷Æip¢ÀfsO`šÂh3Ñf ÷Œ#àŸPø„Á'>y†3ýŸ|DOp,žàqð>„šÃÕpŒQWãõÁßj†÷WèšÀ™2Ì?Ù,¢Ò¡± Fð¼!Ï0¸ZxÞ˜ÓS¸ ƒi,eS¨Ü#k0½ào0-ã}?¸¦LÂ' œ’87½a:À”Èñ.ï‡Í˜.¨•A Êã–‡íùˆm€Ç‰›ï!éQ:ÌÇ!³¤ºZiÊ~Á’ê¾Ùzé%õ^ØáÙB-a£D­á†½ä)U–©µŽŒG®éýÖ‹Q~z±oÐvº¿?xz±äè^¬b|ˆq^¬×‹…xäÓñ³W£,-ýqúø§žJÔSoÈÇgZMþôñ½@ï¨9¯Ã||zÁoÄ ð1¯y˜¬,&µ5 q4§Ï÷†téý½§Óç#‡÷ù„¶NŸïaw.áÊíæïœ’øVöj0…ìåïH:Õ8¿ W织ÒO7g"úeŦ˜y07ç::YÏ™˜=]Óå+%,Rfó«² “ñ+µõЉzÒÊ9aaHA•æTØA½¥¤l QãoXBo†€Û3½ ¸=ùßðÅÜÇÏHø)½=9@&ŒL:uå'|âŽìÒFÜ Øàä©áµ¶ž`„{Û^×*-l©æœpôT6ù°\ù9:6¡Ž£lçycNÊ,ÏAO9f—÷ÔR¸¨é§3—ío¤¢@±Õî$OÐ{€êGYÞïQ̆ÕÚâK†ƒ›.9µ¡Ùˆ¿rÈ‚f}ÂÉÅû>x4Ô¥nL²"gžûŸ@ŠÙ„±æü¯óFÂñˆsB˜¨è“mÎsÝYOÁ gâ+Ž«zªDœÄÛ”çñÀãÄfA†š ‡­OäQÆzð'¡Œ5·¡Ù^Îk.í1!-z‚u)gü!-8sœ£ÂȽjÝÍlOY¿¤ú‘ÉŨ¶w‡+rÝ¢œð"˜Ó§öPJÂüø€Y=犳“³ÔX(¤ïZSÖëXj1SÊâ´¤‚v!,ˆ¶xL鼕mN›ú^6µ+ D hT£Ù­²ä‘}ùåÒ5oAÀ,æè½SãëênZ<–ÚöZs‹ìµÁqYâÒkXÓÎ ƒ#%â‡×$XÍ!s×vÏY50oHZ/£(ÅóŽŸøF¡Ï‡6ÿRgÙòµC®* É$íž`c*Â"Û>þ$¬¹ÆsŒˆšR€4¼/òI·O©Ô5·.œCÝÔí´ØIFŽÐQúŒ¡Ï™˜ëáæàTÎÈ8Q¦xĤ¨D$ŠÊŒv>Bl„çìÉrAÀXÀÀåÌ@Úš9S9c´z攄„—p†€»LJÚ^³èké‡3…$É&¸{Éß„D‹°öZu§Â&›)ûdäTÌâ |8Žà+ 9ОìÛ”ŒÝ÷[‹.j[~là;m|™˜¶e ç($^mœŸ¹½C:×ó+·å˜Âá«3ÂŽ0ÇÄWS<ë”>pɉn¤¸ô\Îr¯ŒÕ_ÿq*“ x¨ˆ*““™‘r¥hSoÌ&uggÍ-[){KË«<&Ëé9is2b¿í^Aïjskʘ­×ºlîb̵o¨]CK`Ä­ ²ïɤaƒ¢æ ®½øn<&f@Œn·Ô©¦O è;·€¼ÊœlNb]M¤ˆTú¬®}DmF¼&n©5[âËRmœT¢ÄbyòÚqÓ¤:/ƒ6SÚcbÊÂg:~×CžB3 ¸Ì…§&%®/™Rà9EybÁ$½»myð•ô+r½±\Q‘Åb·Ìí©mûzȃŸÉH9¿•#‹ © GŽÍ¯ˆ<ëÕdF ÕÔVÃ# ëší€Ç UmÞIjG+¿Ý¸žÚŽj¸çy•ë·å ‰L›¹ÛœkIÙ#ÃÇXî˜RH‡°Ñ• R* x\Œ¬œÖHV$°Çœà½×Îá×sÜ)w+àÛðE]¸B?ü&ñ…`žCÊ…`øÚ¯”™âÞ°G˜pUOÀx.fMؼ$)×%Üu õ&lÑ佺7å'Oß&‚!xÌ«ö°Lĉ ˜ÒXÊ&kÂj{bT ã`)ö˜)XÏݸ— °˜ oãé>˜ 8ãÔ^n‚ã¯q߇›Ôªk•³ÚÄ ÒrŠKº¸2!iî´oOû6¿}{Ú§ÝyÚ‡²;µcñ´;O»óqíNž‹›tÑœœ)Ðq½Þq;d¶.‚tÒLü¹*«ÚJ~ë'™½¼m¬ZòIÍ>cº01œéÃ;;îé?C¥sO$r(|'JFølAµà]6*Z‰Q[3jÖŒÜÖ¬âEƒzÆIÙþõú7-µ&EÕý¨(Õ}+/ªîÅößÐòzQuIiÍ´¦C›Òã^†¿ú1š÷û¿Y÷Ya}Í´=FÓòz± ißâã^¦óx½ü|yúÃ'ÔÁ ]FÇ4¢¤E—eØ@1œ¸È™p}ÛÀ¦(wjPÆ$ñà]|l×)ý·"õõÍìßýEwW<åœB¾²/e'=%…(úʪ«R£H@6<ݱ´2’K5nøõòy#aÒ4•&1õ”C™á‰[m+ó {æë”ŽÐS¥#ê9¥#©­šGé4mF­˜^†¿ôTéˆjNéeÑ´8J§}‹{™ÎãÎJG^Ë(™K­I©*ê¯,€³þRΟÇܲɽ añÉp ‡uQ®'ýâ¬Å¢I ÃFŒ©qà š R!»÷ÕÀá׆ªc¡Æù5ôß·6(˜á’¡åµùˆ^º½E¦Ýñ0í¦Av\dw œaD÷јö-9íFN‡ùÙP{0#„vEƒ:iA™ä{‘ ›’,Ò$5Z£bQÒjܰ˜(µ°ˆRË9¢Ô•M-M‹C”Ý[dÚ s#JÍçˆR3gæe÷–œv#§ÃÜ•(u&ʬI²h„õÄX“+1ÒqÃRbä„M‰‘>CŒœH‹JÚ›û·È´2æJŒœÐbämßÖ0Ä!Æþ-9íFN‡¹'1rR…‰1å4fJÑ©å%ìV#'úJŒrܰ˜±ˆ‘Ñ9bdܦÆ]bìÞ"ÓnÈx˜1ÒzŽ[Ûx: Õ.1voÉi7r:Ì]‰‘ÉðÊ;çvòVZMXìjÆÕzܰÚQã|ê¨q>ç¨qa;jm‹í¨µm½+6ô2ü5uÔ8ŸsÔ8·µ¶ÅvÔº·ø¸—é<îë¨q‘à¨yjÏaÃ+ìœõY>9vT,d¡Þ“ââêI6nX,š¥åIq9çIqi{Rm‹#šåÕ“ºuCÆÃÜD³œó¤¸´=©¶ÅÍòêIݺ‘Óaî*šÕÕ“úƒ)÷I.¯™t2"zwŽ8yy0ÆtŸ tNĸ¡åÜ—ËKñ­!ÄnKæÇë×EJ‘¸c¾x7:½Ÿ†wH›é4`Ï…ƒkªÊŽrŠv޵ T©æëµ(d÷«Êjþî¥jæI¿tœ—ÌÞm5 &KÕ‹½¨sãhøM ¿é·„+æl‚𤒹ÞzB·|€ïš=’™~BßA1÷„¢yÖŠûƬXÌÜ l­ ºöw&éઙt•¨Õ¦x}àjó~å”pèÚƒ ¸N&Ö0C;¸7¼¶ ãÎǤîέÓÈYx>)½Åp ¦xç]·ÅC“:Ì÷nÈ˘“0悽­å¤Æƒ%mí|‹¥Œö¯ÜitáKNÍV¼\þÅžô endstream endobj 2681 0 obj 4309 endobj 2685 0 obj [117 /XYZ 32.1599999 604.819999 0] endobj 2686 0 obj [117 /XYZ 32.1599999 448.339999 0] endobj 2687 0 obj [117 /XYZ 33.1199999 602.899999 0] endobj 2688 0 obj [117 /XYZ 33.1199999 446.419999 0] endobj 2689 0 obj [117 /XYZ 40.7999999 386.899999 0] endobj 2690 0 obj [117 /XYZ 40.7999999 386.899999 0] endobj 2691 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 777.620000 162.719999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 2692 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 219.359999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 >> endobj 2693 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 128.159999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 >> endobj 2694 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 751.700000 123.359999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library >> endobj 2695 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 133.919999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string >> endobj 2696 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 134.879999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector >> endobj 2697 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 151.199999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions >> endobj 2698 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 178.079999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 2699 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 708.500000 171.359999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr >> endobj 2700 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 699.860000 118.560000 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 >> endobj 2701 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 136.799999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 >> endobj 2684 0 obj << /Type /Page /Parent 2 0 R /Contents 2702 0 R /Resources 2704 0 R /Annots 2705 0 R /MediaBox [0 0 595 842] >> endobj 2704 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 2705 0 obj [ 2691 0 R 2692 0 R 2693 0 R 2694 0 R 2695 0 R 2696 0 R 2697 0 R 2698 0 R 2699 0 R 2700 0 R 2701 0 R ] endobj 2702 0 obj << /Length 2703 0 R /Filter /FlateDecode >> stream xœí]É®å¸yÞß§8k>ÍQ" @× *À‹ ‹ Ç0ÒF*^øõ-IG©"‘nŸj ï½”ÄñŸ'þôo_ÿëö?¿ýôñëÿݾ÷??~}cwV±îß­ýï÷ÓaîRt¿ÖFß…mÿݾÿúöãöãí—·_šÿÿxãÕãÃþGóp¢ëðïßÿööS7ø[×òõãšßþq·oþúëí?þ³ùñ§¾¿ö…_ߌ­Ú_þ·û… .LóÇô·öá_Þþø»Ûßš)˜G¿íÿÏ7¶®6ÍãÇóSþøoú)¬™[]ËZÜ8ÍïºÙŽÿÿï·?·«Ú4A1 ¸©›?Iÿs4 i')ozÃôÒ{ᜳ…޶¯“ëý:‡‘Äm:®hÿëAۧɳ}NG·O{›ŽkܾÍзtEöÎvÓ•ÍÖÙaÌCö àÛÉ!¯ù7nàðWî=¼›ªÿ†©ÚȆx3µ°Ã‡1œY8ŒUœ×•ªY4Ûá²j;5BÞŒjú·fx8}míɲ†féé1'¾mu¶=Þ…ž0ô È})+ýàø†ß5kE–gƒ¸Ó ’íϺƒ{iTÓ"ÚW[aªoùÞ|Äïœ[aÌø›wæô_ô ¬ýðætP[w˜¦¥ýh6™Ç[zÞžóI¹‡¤|&?‰qg~>üðíí§/¶•¿ý¹yô8»ßšÔUóW;‹æñŸnÿ˜àÿzûö×7s7–UB?DÔî 'õYYk6yÂÌãIuÜD?Ñ'ꮺÎ&OênãÀÊi`»oŸ â³ûFBïxY]¯ºÈ Ÿm…ø²6#^Å£Ð\ûo>k0f<ÿ%ÌÐUKuÍ„§ -ýB-k稥[@-ÕHƒs˜o[\ÔêÞbónØt˜µ¬YB-[»¨Õ´x¨õxKÏ»ÑóaŽD-Õðî8¥|'o^U-:ì&ª†Ë¢qg ‚«ø®Â…y-•€«Áè!ÓÇ[yàUwÒþ· àIó:}¡$úŠ¿ñ(RGعæ3%ü·mkÄ2šŠ)¦{"Ôàó´!–Š)^;TŒ›%*Ö æTL0ŸŠ‰'Ù»aÓažTLñjŠ)®Ýaš—Šuoéy7z>Ì¡TLˆu|Ä`ŠÑ#×ÊÇ?¸8¬aPÈ“23mˆÕ¤º®å£#9@÷ðwõªš÷ÐÐ 'Í­f=̰¡åû[e{ÈâC[e¦½ éd†¿Õ¢Ü¯¥7†l¾qgÒ¼%§½Ì×Ñ‚å‡ßí—ØþKõ|l«rl€±BŠ(>Ew⇻Ä[|4ÄA-™fNâ6âÖ>ÁyñBªíÉr ðcÆP="àõº¾–C- lE2§ÄÅQ¥Xó¶À³U’íÏ’šÀWÑ7E#ÇÀìÛBÄâéGÊ\sœ@‚1Æ#˜ g=º‘d‰BD¥0@ ¢úR¼»9XNs³D!ž†¬ä7Vr—ß$°Ã,Òöj8z ¾—pB áÃ>â&‡—zR>ÃeŽ’ÉýûOp‘"0†&„F$È ‚ÕºUëñ4o5xásŠ»ä4ÆØ·ó–/  &8£h›S,-H¥á=ô5Ë-O("L[r=H"[Va®Å…¢’n Ô«ê> õR¤ J”`<ꥤ÷aÓË:(Ã`óÈ]|¸y‚ÜÏgÒÚàÑ+®‘Ñ­³YCm+WTÆVÝxšâø¢óäÄ@ :B€ˆg ÖKV¼%å³ OÂB_‚-Ë;)åi¶ŸE Þ"œÏ°Aü=!sEjeAøãV:x¼å±— 2¬Ú¬`uXÔ’ÁéÃò‘/ÝZqI :p7n²†Ýão*øç&¼½°.R14Goñ0ì ‚UœóZ9 á›v‚•”@“,BY‚9÷Z&âd'¥ø„¡ G{6#X߯ƒ?3J”b[ú’"XÅ]”ß‘+NèmŒšÒw%{!ÞÐà‹½ñ±r${yΪGgI°HâQëÑ‚$+ÿ|,+3i‚•Ò{#‹Ú~ É6Ò¸$;kÕßÎ@pÉ¥+ŠØN{…«áãDP¶¯Œ5è]EÏl$C[¢C@ÐXy[VÍKwŠÐš`_&øI̵Œ„N¿SÜ ázqPüí–˜PJšzBºBü /ˆ"¢²ŽHU‚‡ïÏ>&û”(¬êEd í”+æù4{ÓDŠ)³<%X'K˜Ûôç¼>ï+¸V¢Dðx˜&Q2õN©‡TJF“óóÅýĈ²Ñ’ë$2P]ý|ƒIM‘À½œ111þø¬t¬Á)¶?ø$"…³Åx«u޲ÃÃV7Åœxë]óåí H‹ju2ïD(ÊéòjѱÛ9yêz¨38$Ñ —AVã¬üW¬ûJï [d/÷È»TŽã±C²6ZT=¸îVu# ¯ºKuïã =:³4àG4`à ½ !­~oüs†…áN „Ë Œ—Î{ð´&zƒÆ&HKîÇøÄ{ìu 0°“Œ÷ËŸ>|· "L×`aØÇÆ)àƒ ¦-M}”1.ùð(üÕBí×TžnæÐu¦2S—tp—v\:@%A”ÌéÏ)[fÀIÞ^\ ÉÆÁKù¥ÇKíMÈ¢'½ùhቀß08ŽøÇ©á“â´TÚÙ©ßL1²³”d\º» ñRpjÝ­DQ6)$8Þ’÷ê¾"ñPÇóňX˜bg–v–"NˆU[lGjü”±;% 5Å|˜R:h;µ*ñåé! 8˜%ú^MÊ?ï]±³ê¯å°¢âÁ<ƒ|9¹¿0aÜeç©Ïtú|Ø`»ksÅé]iG!S͇­,ï'6îÇ!Ósƒ½-‰œ” XŸ…çѤlÅ{GXñùJ»^ÈÖRKuÄÇžùö Q…ug“ÀÐ"³¤Ê”IÃÞTFÏÛ’%äepcvóçÒ@90¸qÈãœ;‡²Ä¡¿Ddµ’%Ë)´¶² >ÁvØŸ! ‚Ô Ûnñ8²:’-³ÃÒ¾ìÉ“!ƒäqÇU×<_àÉ–ˆ¨”4uBù3’…&aË=&“7ß%ëYdoJ`åé ÍxøP°ÌK€QÉJ»Te/~¤Ð,Gï5·­± PÖåÈMRt.+,ãƒJ¸b'@z±¶âåäSüW{`¨®­‹¡P–ľöæ`lÃ2+Æ8ƒ@ìÀgÂ8yšf€uzLq—õ‚ç£1žá!×Ä31‡í¥9<‡TÛCîl  ¢RÊñ½„µ°Î%¡*ƒåCAµà«Ä Ë”ÄZÜý:¶^:J+Ÿ™~%‡ÁVrìi’M–¬[ TWFJG;âšY‚l¶°‰ƒÂ÷ªÚ—pH®½S~‚²«_uâËIñ”ª» 1` ò”'´¸7_›së®[»,"¾Ø½_ièÒ4<ÂÁ_’9`2!k½üÉB¹%•lÓíZñÃnZŠ¿+< ™J‰$ò|^"æÀ Ër'ß—œO³¸†?òîý;¡à•>[kBö†ì^_qÃj €O°ç šÒľœ›¯ú Ýü=ãîÃ\ÍÇ,yO/3‘ûãÔ lóñÐEC¶Z[ Kƒ)sòvV yœè 1x܈99I 7Î_sFcÉÑæ× ðákÅáãqÊ—˜ÕÒAµ÷®Ž¯™ŸåËm&è xB`ÅWìq9ôÄLyb¹yÕ^RÚ#æBö{“@dü€žÒŸï•"h\! Vãî)B ŽtÀ’eë+îð“+É]yèžwòg)×´.ŽQd¬¥Ïóš4( ñ´;‚CÑ³ŠÆâø;A(¢w"" 5Á;¸n3Ã%®jþ2“HØw ÝËÖ"^7À˜çAÆé¸]tñuÕ1„xÂí³Ê0ëþ¹³S÷Z;Oú „´oð8}ÓC‡¹«¤FlëØÝʽ(î8}$¿¾ ×Ã0Dòû½õ<¼ºË~LÇù‚æÆá¬»#KãAoºèDF‡KY'Ze©j3Ãê,$ïÅÇMÈ^Ã×:±â¹¼»¥x²»'t¢m°“Ê+fÑã³ø0(é!Þæœ7‘ûåó<ƒ¾Û_h7¡§Ý…ÉA%ȹ øœ7>3Á–WÖ‘RͰ£ Á˜—^È?%µð¨Ê¸éI:w#½JÆå\&¡¤¤NÎ]e$Ï]Yî5Ž{ƒç#1TQö[Î?¥ÏM¿¿±w9J¥çdkɸsB™8‹±;AóI(t—õ2ŒÃ+Hm©ò°é>Ìøžwbøª¸´í,ÊñûHlÙC ÖŒ»üŠ;K¢)ÂÆI£Z[gÕêó›=ðjÃζ×Iªf@$Ç3€bU@¥Å ÅðÜ$Ü7Y¼Z—](”âz¾‚%7 !†û¢W¼ŒðOž8ád§ºZ[Œr»˜³„pa½•+i誘»‚¢Á¤¬, À[gÞ“ŒuÒXÍ=¶AðJDä»á;×õJÈÈöʹKÈâx¥Äéí$:DT)}GwPÔÒ:øˆÆÂ,ô ž`ßœÁ‘°ñ(ÙQTI;ǸýƒŸS½ËÔÆÝ3ºJV2†ÕkâRž8š"q¢=a«Š¿ÒÎO©øhöÛÀ¹áõœÙ$püùj·8 öXvg?³ˆy™E"&ð2‹¼³ˆ¹¼YļÌ"90ÿeÙj1eÍ"ÒBz»®€$]ÞHSBE4ã¯ü¸=ŒÛ;B’ÌÏÈ<–ºžo‘~âR¿÷œ.s&D:$$báì]l:Ö%.;Kâ%­0}î帶³Ù†K.Þ—k¼ÌÏ©ÜA×ÓL­/ép]ï·eÇB;gó²c‡ovwêeÇ^ÏoQîžÒŽ-­t)TF±´dz÷€òò¦r-í|‚§4•®ÄÈz5 ¥Ð˼N;SÌ’pr—„é1ûÑu­æ–”BÊi8̈NÈv8~]¶0µ«Ù°sV°'S«ØÀÔŽ¿™i/&€ÙP`<7ük,Ø {{±®æ ÎÉ…s;~w~K~óêymÀUA©˜Ž½ ž}"ÙWV–ÒrË­Ù ]‹¥÷³€qQ“IíœÈ®,·>y<Ë=q|1ÖD{ßl6KUç ¦(ã 9Þ¹}D}¼Z×½¡¥&ìÀcÆäã1+…7jõd0½ ¦ Aëz«]O4d,[6±p ëc¼$Bž.f[Uå® Ç™®GÕl*Á‰á=%M{Wª²6ã'$}‹V)×˰\tLëîF—&°!¢-Pz¯| Êç˜ç¾q‘®ŽÈÙ›¨ºSþ.¥ˆ)®J–P8á¾CJñ£U™Ë¯±Ô*…í/Ú•g®Æ†HЀ> endobj 2709 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2710 0 obj [ ] endobj 2707 0 obj << /Length 2708 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Å—DA€ŒÇ ‡†Èa‘CàÍ&XÄ‹Lö¿©EõÌýQbñ!©­1ày°E‘UŪb=?üéËßÏÿüíüáã—ÿœ¿šï¿œêªnêñë<üûáí¸®lµªx7|¿~;½œ_NŸOŸûÿ_N¬¹ðí¤»føáßãŒ3®û_Þþ4 þëô×ßí— /óÿÿÀ¤`¬–Qëx¹>Ê.ÿÞ>Š^Ö¯­Õý×™1Þÿ¬zpü÷§Ÿûٮ˨:ÉXÛȶ^<+Íe^.ÎZöswÚ™ÕÙÜÒ¹bgêê~£Ifº¬‰Åí®ÓÂ?S¥û‹–+9`bÀ‚ê?ÝÿÜ ó´÷–{W<ŽÓ\Ñ3qÎSá¶½~ÌîFŒxf"Ÿ‡NÔú²O^wÑ;抇ÙpæÓÌ4¬‰ÅíÎ@ÏD‡~+¥áFuôN¯sEÏÔ‰T|mX‹Û>ž)-7ê´bÿX4uŒèš%;ÚXÜî FðLÔó k®ÔeŸªÙ4U<ðûßÍ4¬‰Emî{w¢ÏI47þª¹½x|x>}xê_¡Eõùç~!mwüöQ|묭PTolrÅǩԗpûõ`»ÔA]ß©ñ—W0Êuª˜r~(±”}+Úq!Q)yaQyo"¬Ô%õQ®¡bŽ2V6-öÖ•˜®1{ÀÔ{ŸvæBŒ°™®ý#$2ÂB:6Öò=[ÂAó ÌŠ1û¾7I`„’QŠ>†Ù]â÷XdYCˆ¾‚¾¨RÙu/â¥ÕÏFYåv½a+ËN¹l)^šƒBR°%‘SFÖŽÂÕtM•8_\ðî°–õ<‚ñˆ¡ˆÃð™ÁÊ4>›ø=˜c‰ù¶xàÙ°‡cïx0‡¡ƒ9>\›ñ°å÷HrݾGƒûd«¢Ù5[ÅÕ<— оŒ+/lõÙÄH1Ï@ÒóCá.žò‹‡ù†”?L1QrŽñM‡Q‚à-,Í ‰q¥b%†ƒàêÃ(¦”Y?†ÃSírhU”÷ɺ¶lÄ8-¥Î~¯òŽó»“šÁ=ø!P¼gmø,PîµIk©¦åUžP’1…P¤½HJ!ßÊy0#ÇÈ1²ù‘´~*`!ÙMÅ ”AÅŠ¡*9Ÿzèæ‰à\…Ù‚¦¬¶?AÈÞr^cÈΗl$ÑdyÒ`LÚ/ãÓ,¯#”lœáhçd z´y‰›smÓÓF­0'±iìdIôñ ’’ÉÚó¼ L€ø=1€xÖÙgC²0) ¢øüÚéΞ„©€5bþdzvó­ç^“5áPÚÇÆaΘB CÒq1ø!vùã ô°OÅÙmqLQ}2b[©ÚZç:âF)[Üx¬ØC)e‘ÆMm ¢%æv9W!/~aÓ³À—‰¹B¶9aÝØôŒr¶—”äßPÝ‹$‰Ç#B9ç5E9÷gš}’"XIr’¬“(u̓ÔŠ\”ö’„Š)ú¶³¿ù®Ëך;)9†Y‰´ïÉÑ\c»r¸J3r'Æjk!v€KÈrârªºä)lc0µHÉ'p¶$ gÊÆe’êA‚_Wp],’Ⱥµù…{{ÞãðJ§‰RÊæM!'<¸ˆÐ›?²ÜÞiE¸F=ÌMQ·/@gš×Õ’TÚU ´Œ6 x±”–&I®)6på£Ù´êZt9(v¼¶Þ’yÞ£ Q ëWi 5÷ð§½Ú,g¯˜NæA² imÐé`Ãuyâ‚uŽâà`â©Á’n¶dŒ?uÖQÀÍ­Õ,åÛ‡b©  cNÚæ¼¸riÃ%‹xÚ°"˜ÎÂ1C{ ›ª™H¼ Ú•Q )ÄEü¸á{ärG_ˆ Û9å6¯õèåÛrï~€ ! º å…Ý£¤8@›¿²¸¨hÂyÍòH‡á/°¬®TS¨dÿ0÷OaÿØF wþ &ÿ½š…A°%•âñHÉ\χC´IjDç‘ÚÊ,!'S¤–*y…vuß*R9<¯{O‹Öâ‡âl?:üÖ3xdÏ 9ƒ’•fëJ¸a‰ka¼µ„a¹Ûd;5Ê·É$*¾+—f%¥G˜Ï+1¶Ú˜KOž¨—`Ø"dåQ"Ö¿Ó=DJ™’vsÚuˆ7rùIñÜgòß+ÛÖf÷Îµ×æ˜¦lØQ èµñÑÇÅ<çGîڥ-÷Š’HïšfDq&pJl¼w&¡ÄSÍG aU4€ú(:Úrím-#(…­)yºZY’çNø`€E%IÜ^öèãéFØa.¡A ¡0 å1$Å®Ð-Ÿj”»JP¨|š|‚$™ÄyøÕZæÙ]³×*g°«øËLÚjf}¡dŸÊ¶½æIb9®®‡ º¸ì0!_–R!T3‹ìãq Ìí§Š»fÅ¥ÇKE/a¥Ϫwé ª!ÜðÚdÉÂlZLJ.Þ䩊Ï7,qœ¶Ê §°œm§uW'fO-Oe\J©k kB­GŠË5mƒ+J{Ì<S¡Æ,^e6Ñ 1Bu-¿öÝD#¬Ïî<¥”“ÂM„AÚ`Ú™-Ì\èt,‹&€›Qjúî3L&m“RkÌ1ëÂûÁlˆƒC>n_>vìÊ•6Ü1Ô3.Œ_HyPŒ%Àêr˳jHÌ›^5>N”†XèP Ïaý¥€Ž0ãéšÉR F@Ýr,/:´ÀïQbcs“yÜ%áù°rœ}‘#¿‹àHšF–­z€Ä{²½ÅN#f›¸W¶ÊX÷á3˜æÚõ²ÁP\ñûDñ­gVþÄ6‚uaýNÅF×®}6žÚçUšr-ö8#â(qsÁ¤='g[8…íg+·œB¢òÚY²”¨¼;VÈØÂáÚ(æ 1G™ «?w'^ÓŠJBƒ[JëÛ]û 1Âk¾õï ˜ÙxlËRò 3›C“>FˆŒPè¢av—ø=YÖrí™'“)•^3¸î±5Ötpö½á²mž¢ù*—«•Z£„¯üºÎ¢…#fÈ«ÒÑc†2h!„…ÅLic'™Û“è|4¢No¦Âo8hù‘ŸM@Ïš~Ïl’YÞõÇõÕÙÍ2BÊ3S<$].ÏÇOÚL D<ájN¿”þSJ9»ã>¾™.•[NÆy‹³ùëb’œm£¬(‚,5Óôœ¨˜Dh–©xgBy“= þ-ÿß%å—n“FºP ÍE‡¸¾6-+ÒÖWÿvµB@E»L&f"QM1šOL¡;Bb3I­ˆéü±¹ƒØÖ¬¢9Æ!×ËCÁxá·™«ÖIŽÊ©Q ›'ŽË‹ñÅ/?Ç鄃çâ&5·`å1“Rª™Êu’ÉH!ÊôóòjÖÝQªa[EÔ*(lLðÁ]mQübÿïüÒ¿¶Ÿuø€ùöõ›gîê× |önÁû輚ڜY¿›¾~ÖTrµ|ö¦©šÛRµ“•ñFe·U{;줽12ZˆŠw7åRU3J>›3Þz†Ïtð™QDµ¼âµ†^Gàl#¿ýË#ü¬Qvnìð =c”œ[# íÃèaÏŒ…ìݬír"¨nø™«k¥c†a ±m˜‰ÛÊyÆËVÕãÐ+›ap6ˆ'LU¨Fº²}Ïæë.½}ñæ %²O)wˆgóìðžv¼gïz6ªjìžñÃ'C¾c׳CŒuÏ~à3&Ly¼\>‰ya-7Î>ÅÚŠ°&Hƒf±üQk&+6D>[ŒÒ\2ZwI¾×Yê+çϧÿ(´f÷ endstream endobj 2708 0 obj 4227 endobj 2712 0 obj [119 /XYZ 40.7999999 768.019999 0] endobj 2713 0 obj [119 /XYZ 40.7999999 768.019999 0] endobj 2711 0 obj << /Type /Page /Parent 2 0 R /Contents 2714 0 R /Resources 2716 0 R /Annots 2717 0 R /MediaBox [0 0 595 842] >> endobj 2716 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1549 1549 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2717 0 obj [ ] endobj 2714 0 obj << /Length 2715 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Å—DA€µÇ ‡†È!È!ðf,âEœ=äïGÝb÷ÌýñQ|H=– xÚÃEëñU±X|÷ÇÏ?þó·ã»Ÿÿsüb~~ø|è»~è—?ÇÓß^þ‚ëNðåã¨Uǧӟ㗯‡oÇo‡O‡Oó¿ßl8?h~Ì—W,þöå×ûåå‡å7Ÿ?üyþô¿#?þiþß/Ç¿þmþñ“éïô…¯= §ÿ^>0θžÿóòÓ©ñ_‡¿üîøë<}î÷ôïLJÁÏÇ·ë£ìü÷å£èeóØt/{ydŒÏŸÕLŽÿþãðóÜÛuÝ$9öѽ21œú}ÔRÏÝr§Wgr±}åöÄ›Êôt˛ݤ…¿'2õç§úRÔî+»'ÁY©u\H’O}OOtê‹‘/ó"Ÿf—¾²{R³¤ZÇyL,ov†ú¸':õÕ´ð+ï§|šM¥xœJé°Ó˜XÞì õqOtêO½0¼Ÿ?Ók_¹=ñ^êé<&–7;C}§§OE`†ß<¾:¼{Ô'ôôó<Œ3ŽZ~<}=ÈÓflÀôñé§ãïû^ò?Ÿ~90Ö)9èQ¿wnéߟ[ôõŒ¡f¦Wý‹¯>ž[Æ®ŸÄÜÅ‹)Ï-ŸfäÍh3GkFý‡ó+åóè¦eŠê2¼k ­)öM¤w¾j¿†ÿ)9ØÏ~D”äöWÕòšN.òŒˆÉŒ!â×HÔâRÏ¡¼>ÿbè8Ó9áû —1~izn™ì pÐxí1:½º«¿˜XžAfÀ䓦´Cz¼l6 À±z?ãt¹Â™…€½fHª³Â|€K@YP0€ŠJPJ[ òñªÍ‰>~Åð²;bÏ¢®†¥K‘ÝÓÑîN"ŠPVìAÂûH‹D‘tŠÖÅcKPÎBÆ+.La"Áü‰-‚³´Ž•~_JÌoº¥ ø°è5¾6ûSwë U%»QY-ì¡è3zƬ²î¤a{anôÆð3„Þø{øžÉ°†˜úáµXbˆêºÞ@øIšWŠÁL`Ôëaº 3n¼&(6G:¦¥ †‹WÓSŸó(Š.žŒ•ñP‚ýKQ¹ñàŸ¤G𔵠nl Ã$xbKåzFŽe,éF&àW2B°æŽsã~1R¬ï†‘½¦|˜®,Ý}—Þg±Mè‘ ,.‹À1¬æq³Slo×a5 ›à%؇hÎkŒÉøˆñA„͆ù˜‡ö¶úÁÈѪ««ë¸0Àqâaï=¹ Áàl Õ,Ê—4œ60ùzo±=’Z’ð=XÅ@•‰ßÓã`ã€U3VeP‘à± H7“O66l !­I}$#^S Eñ¨ÛE F6½æ°[N6%õaƒˆ ^ £oÍߪ«¬ù¬¥_óžgCë#,¿ÝR_â„ä¶ÄÕñÌjZñþB®–Ê^ßMÛùbüî!‰b“E’5‘ºúþ° ŒÕv`t+؉/Þݧˆ$Þ®£ˆ1žé£çAÃÞðØZm§RÞC1(Ž ¡“¡/W0dè)CJâG|2E£N'ûžRw(°îf¿€ ëŠ—•hŒÖ—§úFHmQ·%*ÐüZekBìÈáõÁ«°eT@‰mï¨`G[Gê¬Î;DØÇä8㇖š¡)­®hÊTs¼²-Z"ÄÝ­NFSu-›˜Ešïv¤©Z‚jj,b5aÔ ,n)£iúúz0½Q%Ö¶é+4Ÿ©n!®Ê¤VÚBáÚæ§;K:äÃ`Ï ÄšFŸÎ©Z´FI͜ע‡s+oœô£Å U¼»µ¬^®úÎɦ—#_o£’ 9_%ä8ö‰T½!~w(åäÂQjÂiv1-RÄ&£Î_¥£ð„“Ìžœ Ø)åH(BÆ\nu³xyðˆØè¯bT6ž¹70NA<ƒµ®+¥ì*Zq˜K*m^´z]J¹ B¢%ï,¢Xez铬*ðE¡iüb¥èîÕ…pñ²'&à"ª¼oðº€í™áµJ³zðSÿøS0 ˶ŠMMòZ$Ç•‹VÒk}4­hmLÒ}U®íI?x[98Å‹¡>FˆÓ{Z`o8æ9ñ€­áè5„­ž£v”maÂ<Ö̋֓Å-¹Æ‹„éNÛ·Q¸89\ì4áR€óà€¬pÙ§ô’«ûŠ3ÛÄÜSÝ„Ù8·Ù•ˆqÙL‘Åp¹o‹VœÅœÍÔ»¨–Õ³ˆðþ‡ÇÄ”Í!˜²V†Oõ4‚É8‰p³éM8?Ìa9©ƒ7äÎgÃÛî-2ü®ÂÉÃÚr’”(–‚C,1eËsäró¥pXÑÄ,)‚0ʨnÉ/;ŸÁ-Û×0Jç E+­oä±éÃF„‹†½ll°›eᜩÂï«€éV6í—Ò€àP`F[û8ŽA’xæ¡åP§¡økýÑVÆ”ƒ{³Â»>•/†I ÐB5\Ô­D¬Ä³}Ÿ×ìºÓ é0„¥ Ý{ó}Æ xÙÓó˜\¡‡K±ï‡qxQ¿”’ôMÉð¡Ð|-±dá%& 3Oä’ŸNÈÞ÷”.Ã¥ã)¥ù…†H`$ócK&" éêÞ7¥î5þHq ¶<Iáø²qèm¸3|ºD.ö‹}㢼 ÝçÆE9 øËB]®Ù3ÑÜ[Ž–“}²ˆJã9v)× àdÊñ4ìë:¾}•‹ï:÷}T쑊|  {õšœÕƒëÍ.;Ú°ùÜN…†•´—Øh{lo™[°ŽŽJÖz@3½¸gÒ{<:„…¬!sÔ÷µÌU« JJ©îî°(¯‘P0Ó£<±Š¤˜×¢ª¸oQE÷ʘR§W¸e·÷¤훫 ©³~R…ÀuO[…QWxnަ§ 7T*F­—ÀÒU¥¹7õ°>´ß[Þ^ A­J|I<–,¦%¥H¦gÛ4ä~6R‘ú’˜±é+-ö¸Õ®Ø÷ºŠ$T½õ¨H¬î0÷bi$Ìç£SJÂroç›[™—à”Ç a=ˆµ*aµpxÌìp¥ñ örñšà÷À޹Û6îýa}‹W§< Sg‚â¤ÃÇR¼ØÎWÃôzáoÂ-“Â^¤pˆóÕpµ âl¾<›”Í«×7±¢šõn•°g“qB©âžP¤2'¡_ÝNI!²7gxn‹²K–’^ܨpWQ­ÐªLVÅò‘)fI>QU§øø›_Õæ…ºâ;ñ3'5 ë\Ð%>¥p#éG¯TÈ9ÃÊ!‚ \í´ñƒäa’¬N,R‰¢E?H9n”È#…•(‚†Ï½„’­·qÚ[J®€ÑOœ`ÏW{[Á2° &S˜•V7-»"Ü[ö–­ÒöP«­ßïLåë,¶X=ÚJIÞt~äê…ß¿›ä¶”Uù £o‚œzêé`„‚òkèƒFŠ}Ê))ººo-ñýûQìûµß9×~W7ˆ…{«C÷«ŠG–S¨v}ÑÀ§_H…Åênìì-o±¥Y\¾¨4Rtå`åh´ÇL`êP 4ÖñŒ›È)ÍLÊ+ lá%Æ&lý­rŠIö$’åI%`)"E atgêñÏ6 ³îäì›Î´zÁÍNäÇ36,Y)¡Ô>©¢ùQ54νeoÙ[¶ßR8XG¹›0 x§@@ʉÍíÃÓF¦e¼”x×¢Uå]ÍÃGõR®ŽWÏuJ¨N;JÕV.BšP–tzŸ´Ï0 :·•¯çÚæ§FPà¾a°gPå`Œg))Gf [“ÊýR._Î91‡{Í¿ò:ª 7>P‰å×¹t0*R$Ù.KížO^ñöo©¤-6 ›ãjÙ ÇW›\Ø]W}š;Ô]sL>5ïzW}PI:’:Í^™´£MZOX‡€(U"ª/ÇÀ¦ÛsóU¹_dNwzêC7®Væ È9SG…í‘óÔH/çPæËÑXlã3µEl mxµ1É2¾E¸˜ù9ÌÏè c­};~…+V*ð˜ši¶:®±/YQ]°YæCÞ£|{Y]󙇼¤z9õAê”H1K J)³šL!´EÊ2uh0ò¸B¶;E /­­R)†ÁóG ;—!½C+AS$—£yñ‹F1Í7Z[¬D¸«ò%æ p, ‹Ô¬¹«jZY7å…ô[Í8Äè˜$Š3”ìÌ@ ͦŒ.ª+$e½‹x5„Ù8l^RfAàü †­mº†iä)æXgÕ(±~¬ œ‰e+!¶BŠ8ïƒ{÷0Åɧ1a·¨HêŽP+VŸ+äêëÕ mPb‘À›k*Cåy` ¸t shü¸#ξÌêHŒFŒ@oÕGÝØ™ÌKAÉÇ]ýz°õó‹ƒGójîÊV®›IŒià•0aÏ~{^ AÏ”C8fXtC!³(|J€ÞžY#XÒ0CÌnmBd' ’7Šdȼ¬«;ÿ=~›år»ÓÌ/_=‚êJxÿ,៼2î}4¨ôpdó4n™¸‰ Ý™ÁŽ¢¿\õa.³†n¸Í{“ìÀÆ)»Ñ^éeùÆ-‹ø ÑñÉp†“U7,‹`k¢[ïÑð™ >³XÓ‘w¼§¦ç–÷°·…s_þæ~×hÅ3|DÏY½ÕÂÐ<ŒD¤=cV,eîflgÈàºÓg®ØõL(¦5\m“]ëYmå> endobj 2723 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 2724 0 obj [ ] endobj 2721 0 obj << /Length 2722 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õð- ìŒ=r`Œ‚‚Ùl‚EfgùûQ·Ø/²?R,‘ji,`{¬f‰,ë]Åüò÷ý?Ûøôå?û¯îç§/;Ö0Ưýáß×¶‘bøµµºÝákÿõÛîmÿ¶{Ù½ôßßvܺýÃÓ+€¿}ýu÷axùnøË—Oîûß^ìÿÔÿï—ý_ÿÖÿøÉÁ;|àÛÎvæðË¿‡_¸àÂöÿ¹þíðð_»¿ünÿk?{„{øþWZK3moç¡üøïz(zY?7Ë;Ñÿà‡oºGÇÿ±û¹‡vžFÓ)Î[£Z6*—æ—ɽUvÏ% ‹ k*$Ád!HÇ9ñi«ë¬ŒC"c_0«öåtœ`M†$z +´ýœø´Õ Ø@¢c_™aº¼Ð¨é(ÓB‚t˜Ÿ´8‡{ˆŽzcD)ÔŸ@MGXËm!H‡9A=DG½•])ÔŸ@MG˜ít)HýœŠ "£^2© ¡þ j2Â$ëx)HýœJ ¢£¾U õ'PÓ&d!ÖuœSÔC@Ô·âQj¾ïz¨B‡zëèÙÝ‚š€¯a¦  ÃŒø´¥q¦Ú» ^Š˜âb~¼E~|Ý}øÌ•´këõç~&G“møñz ³®ÿ_¯Kµýiÿ{Æäç?ì_Ùuîd«#oxžà“è oÑÇ08nà•?FÀ1와I^ÏókOõ·XËôwpª¢ŽÁ Ç› †²ùêG¬ñæ"<Мƒ¸f;xçf"²ž&‰ìáæ…˜#ëÁ ŸHÈGðÑÀü4 …ÿJˆƒg^ðz…‹Ò¨„x“Ý|Z0~~-&f,ʱ<Á|‹e,b1ê ‰|Æñx¦¶NÆw«g +•>ØQBæ8‚8½=?£n_Éy£•±ýtüíUf9æ 6Äútu¼U¦ÜÞ¥_uòÙƒ¼†3ÿ> ¦FÏ9˃O$‡à׉Ö«áÌ ŠÔ󌼺7ä“\dÀ`þŽ9æ¡›©–ÜHi’úh„q~Ÿ¨Ï2‡–,ò [Â] P,&#ô†Ÿ`« ‹clJC¼E¨ Ó5>YÏÔ’i´†Š5óÔú´<,·-b—˜4Å.‰@#°‡ˆýƒ v`–‚ÁiP–A9ío&ÂlUryeŸ`íŸïˆ#q&]DÂ1‚0ë¹p½=)-Õ#zÁ¯1‰ðܬ8â&Ãz%P‚当©u29¡uš›·‘hBüi `Ps15FØS»‹èŠÞ"aü”éU€Ù N£Ø‘Ñurn©a÷\•îÜüøÝHa¹Ð!¯hìP1úv[oEWòl̵F››y‡^IqÜâ1KuÀ '¯çå "á“g¸§v¼Û™âö Ð Á~èÆDðˆŒNÞFMà^Äð¤ñÊÇÓ“ßœ5¦å·‡4Ø> “ |‚¡…щñ$ñý[Œ¡B !gœÐÔG+r2ÅV†i3 c Á(ÄçGÁ’œ„rJ’¢ÆÐ >„˜ôƒàÆ#ž}ÂŒ…Ž¡›Îx)âTΫ8§Ïœ“Pá÷—ÆE°Hˆ@RD_×}N ©ÆKÈâ2¦ é8g0'ÈxnÏ}+JúnŠÅœ!PŽ‚B³ºP±ÚøB%ÈVÀkÌþ^¢µª2”œ™$çqž©;ËÌ@@‰¤ œ’ÞºrV†La~4Òª*WÃ10:¹ +É=ŽXië ëÁعÕã ½" {ÂÔ¡ˆ~¸\mºâ‰JzGâq¶cRÌJ“ó[åÙÕ >œaÁ9¸ÄaÌx_ŽÈ™pö‚ý#ÑZ†œè€ëe8!(>L&K씓·ënËú¼ç•c‘°œåÞ[×Y†ƒ3w"QJ…Ž…à1„PÊ}duZݧQ’õ„ÔÆº/¬þ.(~É…gõ)Qñ®·„ïÒçbì«’Ñ©Ðy—¡“d˜HØbHûqñ Vy2Ô e3pgØYÍl‡V].j¤/ "üˆ“ùkÅÓl\ÁTD–å;b+#½óP¤çåk¶Õõbí«¨E­‹î®’08”¥ìnN6|ù¬W5­öžð§ü1ÌÀ13l›m”ã#þVsÝ äz57ÞÃOŒEøÁ+üä¢á³ÆsÃx“Õ%ù`<ÊöT5•±+RÃI2¡ž0AqÈÜã=¦Ñ“áo(!×kÁÖ„8_D"øî%TbŠ8‹¸ b(Q»,Ÿ ö§ÌÙ÷c–“‘s’“)…ù žÉxÞ„iíQ`åº W§Ä$2¨ˆ’š1Ãð K‡ÈÆ3tÞ)‚0eò)^ZY©fÒ#›H%¡ #òû,qFü}.Æúj ‹WÞ1k½yzs½ƒëµÙEìXÛg¬l™õ;ØK«»‘{¹"g¼í”/³)…Ö¸–žP~\+;h*Å<\«„Õ«Î º"¥EXJÙ"En©šÄ{dzÜÝS††{DÀ’rÃãB‹ô{À»€w®GáÂÅ™0ª°ñsu!9F¥ô- ïÙW„´Âe3ΑŒÌ•¹½ E²ñ(@J¤¡Ï¥>1kŸ*7½ÈÔ䭩G 'ø·2‰µüMwÖô¹œÏ AL©Êé.X%H\°!`›lΠ.ÁPÜk289j–®†.ƒî²ˆdØ2Oz8ŸååD¦a¤O PC¤¶¥âÏuiA2î-˨Â=8p÷œI…;¡`#„ÐZŽÒýÒ‰ÒT›u‘õ`òÃmïŠE—#gH3±~~ªO:èå á®ï|¬Ï×UL¨‚«ìîjý™âÎeøàcJ*Ör¡ºÇ™¿‚‚%Ǖե¼¹WiP_ûÖ§ô´ ¸Œ-ò “‡R_çú=Þ?¡´†âlˆxHaù²:³œ8é,± ½.Fªš\Æ+òÈ1Ez‘Ô-áÓuàÿÂS£8?óKØË4Ϙƒ¼5g£É›Ò·°¾8×ʦHõ½pÂXÖwàÔ‚N´U¿DœQ ‘Á6&\—‘_RUíˆ÷QÅ奈Ø*å/E•ºU'™æ4M¨SÝS§b=£Š¦æOãg”±'Aê,©ÁDªAÈ ^‰óý†eº•dÔíÏÄ®2D« ó穾Æýài«X=Í òÖz$PövŠº~¹–­·j‡lÓhéU!-d£„K­»Ú¨ß´B jÕßv©LÁm')ÿ8?`ª/3&â.wóÁ!|ú·D¼-¯8Fˆg¿Eá–ˆWÏâÚñF&â]¨r+6‰'â]ß-oKÄ»&ˆ-ol"žéÎÙ¬ëK9%â]A²YÌggMÄ»¢…õ&â]±äD<ŒFlÃKˆ`JR¾®’rùå\¥‰[ÊaÙ”CûH#|ɱè”ÃVÓ;žrx5Ó•¦^­`u)‡—¹¯5åð²‚-åpK9\~Êá·H©&5]"&Õ­niŒÿÎ÷žm8K4§µç¤l¨]q¬]aÙ»Åy¶8OqŒ. Îc¹½Eáç¡Êö-Î3Yq8Åy®¨rkQ•«z¸¶É·Ð;iŸÕo ± {I]Ÿï²#R#­VÉç‰ ¹ŽŠÖO/^Ulˆso³xÊ¥ð_»Â&µÏ&H' "xyðT.9BF¸ì+°9ˆk_ÉèÄù*„OP×ÈÈ):ªZ$m**?™«Tðä@Mõs¯,«]Ö ¬Sî>ôb<×û‚ùÂ$߇g!0M2âBEÃ$–6¢^Ó¯›Q'\÷Ból?w³èåH<î¶–ñãȃ£@>”âbL “êÐ3®êÁ…5ع\R”QãX¢˜}•1àü[þª£lÆíE”Û®3jùÓ &\Œ=é:£ Φt§å¦ÚØŽ™œ!*/.è:_¿„‹–Am/!¡!‡Sc;¥œ'"r/†3¾üÖÅ+Ó¼ñ%Åe­ûHæ0Öý)ù§Ð•&à{ð“ù®åèhZúƺ®Ï¢«•u’ù›Sý~K©‚wfè8iõy9LR@ªöy“’G\úqÇwFâÁÞXé'^˜dPlä ³*¬ΘèÕµçTXœèU6 >ÙR³b:Ó–š•ËÓ…TöÇõ…[jVtÅw ¾ƒÔ¬+ª|—ĉÎúgqK¦z×ÉTBùÇ`K¦JÅ6‡d*ÉÌ)­JV^&ÂLÌkž<$©=¯0É%S]SÉyHÂú¯]cÒLuµˆä!ÍO“´%§¶'‘ön˜ð!F>`Цˆp 8·Í¶ŒÑØf[æê/ζäÚÜ¢pí¶åã¯Ákðäq.A‰–óêt‚‹êa4+ÒC+#XC$Ĭð)-Üåá^ßge×ÅV®Èo…¯ZS_-bëÆS”JT«|*YŸn¯¹ð9í"4kaÎ=¦1ê^6™Öö°žŽI²’Mƒî¦ÁÓ4xѵ·ì÷ž+uM ÜÊþ*¢CËï{/"9ð3&óºýëdV•‹ÞÐÄPJb¢½’3ÕL0Ë¥‘$4)½nây,”’O]åv¨œK¶Iõ•s|3®YNbò‚³ñ(Ü=L: 8¯¨(TbüØZ“€+±ŠÇ•—ÁÙÏâm‡¬´ç<ìÂWãTFÜø»Œ°d.×&6åqø`ÂEÊ%ŠõÌMSÅ!IÙI0\ò aì^Ãmû1®Š^v†ÇLI„[˜#¡éÔzæÙa!Ò;L8A‘Ð ·è…²÷ 'DãYã~xvás88ÒXÿoÿÖSO(‡¸_¿E¨+$Kv!Ë—(aF‡&)Úš=ï—q/(ÑqÓ%è^²³0„Œ1¹¯tª ¸áÈŠ¶i}Ù=T{çÉ ¥lDw·í‰Ö´Ûî½ÇÂ13lh+ÁŽ7&ú$uÚ ²®ÿò?ë\wVøqÂÿÞŽÖá„Þ·c9kws;€ Twø]h~rirŒk¸ÛŽQEv[c\Êð† .l‚ChpŸ0UI×îÆ6~‘0Æ9ÞõÞœ©poç %òç’+ÄÐ"+|‚§Ï X;…ž]û¡©kÆg ŸXŒuø¼»‘âý€X¬Žqq¢qø ù$æy„¹Ü9øclkœ ºLåÖ2ÓðC‚–Ç(!ÓãxWU/%õ•ýËîÿ}D‚  endstream endobj 2722 0 obj 3971 endobj 2726 0 obj [121 /XYZ 40.7999999 497.299999 0] endobj 2727 0 obj [121 /XYZ 40.7999999 497.299999 0] endobj 2725 0 obj << /Type /Page /Parent 2 0 R /Contents 2728 0 R /Resources 2730 0 R /Annots 2731 0 R /MediaBox [0 0 595 842] >> endobj 2730 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 2731 0 obj [ ] endobj 2728 0 obj << /Length 2729 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘ÅU$°Ýí9h¸‚O&Á 3HgùûQ•TK“õ‘âIIå²w¹Ô"ß¾ñ‘üðǯßÿó·ý‡Ï_ÿ³ÿ6þüüu×6­n‡?ûÃß®¿à¦|øØÕp{ø³ÿöËîmÿ¶{Ù½ôÿ¾í˜>¾8þ螦üíÛ¯»Ãä»á›¯ŸÿÜúßžïÿÔÿïçý_ÿÖÿøqïð ¿ìŒÕ‡ÿ>0θéÿsýéðð_»¿ünÿk‚9Ž{ø÷&u'™ÇÛùUvü{ý*š¬‡Í)ôž1ÞV=9þûÝOýhg0+ë´ìÚÉ£vü0¬Plo;½çÊÔÃmÚPlî@ºÕy:@Äæ¡ÆZÙ…‡jŒLt\É,PÆðþs'Æ?)¨«îˆºÐó©85w Ù²<!bóP;±EÕ)NôR|.ÅD.Ò«ÖäHé5 µ‘ô¡rj‚TʆIÏ5Lç¡fSÑp™‰¯=Dlj'v࡚ÀNÆH+žÇvßÏ@‡ïýPst~ÉØ\#õ0±YÈY#n ô’%^à—xá-ðâ§×݇/L s^ê9ÆXÃ×^ÒTÿŸ>nÐvÿúãþ÷m+¾üaÿúóÎ6ÊŠN AÙð¤}‚Ožá<~ò =á=Žßa¾Ãá<>æy~íù[œ[½¸Ä¸Å ÛÏðþäû¢¼âú¡'¸Å ·xaƒÔÁ£å…º…ÔY‰ôIõÝéýC’ŠHRšDíØâÖ*¦kªXÞ§~W~ØHþðÃõ-a¬^W‡÷šUæ}ÀoeõФ:òâzÕud(Ë’à3ªJ¹™#Ë3¤¼vöTŸZA$@È¡±”J\kŕ۬^}ÍúX3F°¬v}ª–Ÿ D’ÛƒpUÇ>QžÔôTö¼PúýÄâ•XÜUUS^Tíj`í¯R¶€ !àx­ K”>¬Mÿ:ÛkÂOgµj íÁ´·Àäú¦lÕ©¨76¿ôÀ´ÃŸ q‘M§œ'ì)ý ÒÞ;½3*ºiäØör`P&Ö6Jó÷"ÆÑl²ªª/0 et$·H´\P!¸²ŽFäK}™%dÉþ 86 TÄò¤P®x˜‡™³2Å>xúõ_> 1,ͦ׾ânrN†Œçž¥¦h7Á½¤äM•kµK) ¹®Ï“d |-JŠ Ä‚NJ[×I•ÉAµ„ ƒ¥ 5=÷ñ 3% ™^cóŽfÓ)î;ˆ+.2F @Bž=Ýa‰BÙåœî¿+䬼ƒ˜}iМ2tÑÕYî0(ÁR$HZB¶P(©\)›ø&Ô´‚ïVBÆØ'Góƒ’1}×ÉÒºq»ì ´8À®×lx_ î0ÃÜ{€ ÷ßáÞ@L¼g¶“:1>x_ƇB7B æœh R…eïíÁ£}„PgÕ¬s~ÜÕŒ!€ø`º>¼ ìF/hOm“¾†ÅÛCbN¨l{Ò¡V`Ü&˱`q‹Ë’q’õ$$çâ@í”´ZCº¸n]:ãVxìpË/=•‡„8¿LÑzÓõ‚u¸€p‰®Û„pÉVG…‹Òé-U$”æô³MÈÉãõ«,ÚE/!WI£8ŠW+äƃ}9~o-Æ1x!$†˜Ä<Òvç–Ob¸–ï•lJã\l_sìU,Ñà5"Ü/¶TOÝc¯Å“E àÁœÃºŠS<Ÿä7çBùCq4–ÃRÊÞë-Q×LÑ­2Ê·9ënšP°Ù< ·Ò0©U¦sеœKíSX³"ì~ˆëúœ]~$_7g‹ÑêûÀã'ÆÃ=ndHÄ*mE7З[>TíÔ(HAÁ…CAlìSÜ?Þà#³lôLhíÃKQ”voÂ± Ì—­ÔÓTå9 |çÖ–”v%sñÇRnŠ>ÖBø`ØVÍ9 ®bá¬çÊš!#­kýî­?²øÂžÊ¡aÝb٠ܢ-i7ßYð°°'{,ZNOË'¾¢åïe8­/å&ï*œä1íâ]¾=”»sÆ—HeÊâ¥×“Ÿ/Xmä­tyž5ÃØøÞô™Sõ“åÊ,Goyãq`1"¡ò‹å†rz¡r±þÕȲ~IµÊõÅý’bÞœk=±$Æs‚®¼Cü4ª{[SÖ—r.¦osÁiúZ}ÊÒu¶víH¯¶¸\*"!õ縰„C&|Ëâ’9°ØÒ"E•}ZޱбzYB¾‹ƒïó𨢠ŽÚ±Âëé@ëÆâÕ-Q8Íbar¤2¾Ë(sbÑô¼RkI9Å8ø\!Û³„uD!­(Ž/<ƒ«¸,W7^yÁ×Tå½ ¯ÖàE„k:wÅÔ»>JÊËYuøBEB¯K`ÓŠp¡\@.ñÊ0–$¼’Ši€;Ñ×pA˜”ÜÄ9LРÀ…ÐpÌ{,/ÞK¼ÂO¹Æ¶ƒŸ`½ÇýØZÅnuÂ4¨#c²{ÈØ˾–[À––£âò²¸>.ù&Èe¬÷¸×{¬ÑÀ×yVŠÇ$…ÛYå@@LEñV„±ä¨„s<„iŒmu¤Ñ:¡j/f=ò«°MS–¿gQR/éê`‚n’®t¿7}ÎzmzÅë©¥f¬²Œ2[ÊEçË*—Ñ2UÀX3 —Xú(6€.å·0­)ÿbB„Kxÿ¬O°$IJÄNЙö¿‡eü¬¼Ÿ\™—ŠËg…œ¿C°/óg^T›ed¬væT‹QP®”\żÃOó<æÙð<0NÚ(>w6€£mŸ»›FVÅçÎæã´*QI×êMÓêÞæ‘w†Ï½Íƒ·ÁnŸ{›G>buÏûu6ŠÏŠçÁµ¨±Q'Âà§ž‚ZU@Eï±þv—ëo”•el§–¥qÊ2¥ÒŒk÷U¥BÇÏ]Ê,¸’55o—4Á*â5.¼b +®=u†¿‡§Ê¬¦Í°¦_¾ɨó E°)eƒ1Þ‹—°Ç¤öý xÿ¼ÊΆ®•Ësžq¼ mú~Ê©Àx÷tÊQä ’{[ £lðžz(fi…I¸Æ™tåKI–>§>`Ö¦ï®ÜȹßRwŽg ¨`ƒøàé‡8™®$;O£wÇsêgøÀ_2èË"ì« œ/ŠOhÌzf ŸS”p^*®á×¢¨ÄY@­;Ð,?Ñ÷ º…é§Î~É{ìZBüôpçÓÝù¦N™Á“”sx6u´]NaH¹Ra=tÌ`uÊáõ åÇØa’™)wB( ¬v]6˜ÞQÓO¾º>xªÿ»ëAî!:üÂøãÛ/|äÛ ò/Aôƒ¯Æ±×{Ö£që®Ëtsô>{Ñž¯\ò!­}ûü&+O5Eç]ÓÝ>É£»ñd7!n0ª†jôÀWºnÍcà;¾3x¤Ž7¼‡G—'Ÿàhƒ8_ów¼qå†_Ð;£“ºõ„!a©cñÇ4nÝÓsÝ—·ÑqÜâ”DöœC> endobj 2743 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1738 1738 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2744 0 obj [ ] endobj 2741 0 obj << /Length 2742 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň^@ÀöxäÀ°‚o6Á"»ˆ³‡üý¨[Tw©"‹E¶úažö¨EV‹õbUñÝ¿ü}ÿÏßöï>~ùÏþ›ùùñË®®ê¶žþì¸ü…ì+%§]ßTr8üÙûe÷}ÿ}÷y÷yü÷ûN´ÇÍñá<Å4àoß~ݽ›&ßM¿ùòñÏã§ÿíåþOãÿ~ÞÿõoãÍx‡/ü²ë‡öðáßÓ!…ìÇÿ\~:<ü×î/¿Ûÿ:‚ÐÇ=üûƒÐÝÐŽ°¤Àñýôª8þ½|M6ÂÖë¡‘{!äø¹ûßì~G;Q Zˆ®Õ]<ªPíq\­ö½î÷ºsup J¤Ô\#0‰$ä†^yªúÖüŸC¦‘í›qÇE®õÈ7 +ÜÉØJéýеû&oGJX3ÐP3 4B$’0‰ÝyG"Ó]·5Ýç‘’Éu, â¡;‰L÷N)&ºÏ#%“«ÅÏ@J1ÑŽD¦{¯ÅÉ¡IÅr)™\ƒjx:@$’0›éG"Ó}è§MݹVA,¹zñÐÖ-×ö‡AR0›éG¢Ò½•u?!9î¤Dz†JHiMq„H¤¡f(ïŠLz-'F†D<ç‘’ ÖHÛè‘HÂl&¼=ÒgoFž½™ïž?|ݽ{ZõçíëO# Gpúñõ`žãÿF³z4¿þ¸ÿ}]Ëáû¯?ï†jÛ]3ùŒÓ“ZÀ'Ÿà“è‰Ðè‰ìà›€ïx`“ñïˆ ŸO_ÇeL\”.Šl´µ(uAýA][.$0gÉAZH(¿ò=|Ž&ÚxÎÂ܈çñðäz…9 C€¹¾‡ Ïã Ë<\…ú>(]€e»#Ç6µÜEð ¨-¬ ÷ê3“ôÑ•ž sÀk+)úÅ-p1ˆFƒ˜]ÙÛ$ìªl¬‹QíwEmÿbƒBΟçý>ïôÕ¦R²²ñBÔZ£Ê6ü]LhH= 4Æžv‰®ÛËá…2+c,WÇ`\šçui¶e_Ù±Yð‹—=}‚OZ6¡œpòŠ„îf—a€²<\É»jÚ01ÖͪWžbŽ;šŸ$§16ŽG•fŒo¶Jnް_ì¯bíí‹N°!D‚‘àR/\5óúwâ„X OØŽ#dáƒzÐÁ{êö8*§XîzK.ßi%‚ê >ÂqLq Æ–î Ü$ü"BÉéãÙGáÆ@ÌBŠ6³œídv1“ éÂ4ïáj_k[¾m%Ó$£Tï[iaGx²¼ZêûÎFÀx”­·‡VkôÙ²Éa\Q¨F±ê"Nl""¡„ho|°´€|N±b9¬f‰ae>üt[ ”ˆ z‡öá†_„Jäµb¯quÛ>:[$s¢IéÛKoÍ(Û”²…›zAË@yB:ÈI %FxT«çaIÇ}á_U‘eÒ`žˆ9ÕÔÉÝÀO<«Ä+Ó°Íáy°ú»ç¦XrÒŸXãU¡Xž4Á­ì?W9Fd«¤XÑgè9󸄣—±Ä²­R²C®}ž.& =o_ÒæÁ@gIŒXw_ŸaÝgX÷ZaÝu߬óNiå•!pU€(Å£:[ž×í[㪜…%£n{Ë™5 %rHќإ WKY…ÙÊ‘^”SX¬l8 ЛLŒõ}La4Jªlaý¾¾™R<˜±çaO˘£²Oìà„ûµŸpH!rë2ª¦–úpÏnl.*¯Æ9¤lYŸ+v–ÃÌ,?÷yÈf*²â² âkXì ’ Ãò» Æ)%ž÷”¡ ÁzÞZqX µ…uéIOÊ«†Õ¨›ìêHNg` n‘®œJBVI &­G™Ø™Ùv}Õõ[]gÒþE3Ox~‚Ói>@Dó´@XåªL§Ûe ó×í3å»Ö3¥áA¸QÁE yèñgU,^7s†xD3†Õƒ†Lt8ÕÜÀXx°™´²+ At¶UQH^±jJ6]飙5&(àòŽ–;Ò4”M@ |ÞòaÞÕ$pL-%¨xg'‚¬é&™KAÖêër:°¢µÄÃ-œ<²v?–ÃYºîízÕ‹DtÕ5ö“6þçà<†×TÕÙ¹FšTÚÎ1Û­­ÔqÁ\ž^‚àĨNIö,“¤“|'Ð<#,ºJÙŽ*ÍTÆ/aª l5Äç5~”€£AŠz øD 5Óüˆz&!ŒC¸JÁQë p,ÅŽ^u2Ü1"LˆˆPBZmD!÷-™f×//ìa¥8+1™œYz6êý“»f’9íæÊ%—Þ]¨qjü7ŠÞ2 V›/= ©®Ñ¤˜§Ìì oá‘Ë᥃5<„Nibæq]ѳ6¼¯cIRãZ-ÜUÏ(­ÄnÚÂÈÜÔ; 1!ÅÊ]ÛÜyu²®¥%Mó÷g×™3ÿñ± ©\Ì™ÒõÊK2óDg¯ÏfŒ”œÙyʶ+®^BÉE)•È+8óܤp­jyžsŠ*ý,ÝEh+™"9»ÔÔá ‹Ô‹*<{;¦‚r^´Êo®¯„÷SDRz†¶E¾Z‚ÌÝX²ôÌtà”ò BWz¸@BкtsèœÉÊ$ø–DBðfvRo#zlÀP–§Â ˆ¶dÆ­!µ¶ökYË¥ÑDÄ>ÂŒÉÝ1Ë_$¨¯‡¹e»:Ò†{w¼Ávu”0n8é‹WDsÖèC›Æ$ûœÁå8ykÏ1HIq‚!ÃYÖˆ·Ê¢"òš¬Û âenyIi=bkÆXïã`îþé˜ìá‘Õ²^m^;¨ml«äÎ]:a›².š$UeàŒéð›·YÕË7„爌¥q$Kþß³“곓jv=Bf" §¾ž¤†r1Ñ,[.¦7¬møÜ4™RaM`¼À,ÒÏaj–+쯨ۤj,ÆÏæxë®–r†C2Rº+„÷Q¹%1µ™_Œ=MÈ©.Öשּׂ)Â:óyrÞáúª%dkdžßgs¸-×XÝ{åÅ /¬›Ú€¸`ÁP²H.Mãi½„.cµgî|íÎR(7lŒ}~ÆšE›X©” ]ÂÉl©á2©Þ[N.rä—ݤ~ú“z5­”¼ÖÅ]06onß¾kžÖ-àÒÕÁ†f°m‰Œ×9^¾qÔ¹É8H‡Œá†ˆ' J)Ó)ÔtŠ€[(]ÓbB§^‚)­I·®‹J÷Ï(lx©;N0¸™a­[SŒ—ûdÍ W¿G:=¢ ›-«=‹XR#o²:qƒ‰M ' ¾MB Ç¥œ,ª,Ç[ˆPsŽ¥Ãäø"†”ÀRLXÞR:–æÐIÅ£‡U3ª¢¶,UtK‘Û€EH\©Ï?Keª›Q1 oBúµOaží&UnSòÀ8솤Žëtý-à«.3¯YoÑêp®•+œ×vP¤Ï”Ø ¤ÄkØÝv§;áK5ì~ïà×ç2«tÀÓ*7ÅÆO µ¾ž/›_¦Á´uš|˨q‹m n@. é­NÌõïØôÈÑåÄ'Ž7×êúN 2U¶ÀAœ‹wc.ë¤1"íÑ\‘’=6ºs&:lÌ\ÃÌ ó{pï 3j ß9A5l‚MÉ=˜bØÎ懳§î¬A7¦†@aÁkz›œˆ{Ô`p3ôÇ¡„ S‡²O=ïà×tÍê…²|–§±BBQæÞñ¥N9œžõï’¦_ꬴ@MœïJq“uæè§ê|(À«:³çï鯖À‹ Ço/ð [D&@ëzVטÇÖžtò¶9îùʾmpâ3òÿŒü³ê™•Èÿp:´Å)n-¤’ª‘¯ÔÏåY‘0kEúv™b¢7‰E›K;ÙPêöµ mËÜ¡”S’ëÁå÷úkës4j)O(Ǧv É. v 0lØ€OHó4S8çZ#LVhe…ßÁ¼/¸›Æ/ÞM7éZc@q©ðÚ8_®§…äÛE»44‹ý9±'&û8âúÒÊ¿ZEwD®¡äìN»ëSÊsyê‚êãRª’šilµFþ”¡ ™^ªã]´N Ø’ ÅîwŸßÉ{·Cmä»ÑªÖNºÍÓ–»ËÔ Dóï3·"këHiûÙu×0•\_ê.œ°ÇÒ±*>\j¿ýÐü£b]^;O3æp‰#UÚÀ)MÃëž=œIñ p#)Ž+#Xþ"×D4 ½zm6âŽÌE2ƒ¶6ùfìž¼ˆ«é Ó ÄȨºÉÄŽÇ6ÑšNYüZª)N+šÓ)ÔÇólÇb–@¨ª³š»\¿Á9Ø©¼>¾ÉZjRS# kؾ·Ö1Ç] ­h05l ƒÛxèàw(íx lÑ¢õ÷¼Ch±ä¡(ÄÇhNÑT“4~sÈZS¤F?ŸE>[aˆnè˜éê-‰(Ž›Ç±q¦dœQb¯®*¥É"Gûè€ÆFEҪʕ;–k¤ÔJ}2½¶t†…\5á v@ŠÌʬV»‡¾^aÏh8o úks.ê%xŒ”\¼Í„?¢Ö‡²3jXÚF)`ð<«)êÉÇ¢ÀEÑ­`y_+»auµ<ë¸í’ÀV} vɃ#lXòàyYÀ[–—%9[‰¹Ç¸9cËïLª.à¸*"ûàZ¥H“NYº×xZ¿ÑÉ7£œŸà„ÎsÇh;“̱Ö#ª–Xî°ÉÛ:ü6sLó^¤Î“#¸¹ÉmºÀ4|&k;Ç8r‹ÀUr³ To…-ÖY/‹¹Ì+œ.ùŠ…kÛn3—8üîEWîâÐNJ¦0Kö,ëåzÛÍ_w«Åm^07)ÇE)Á쬹Ǚ,@‡Åñv\1âS–4ðˆA ´‰…Wƒ­]°4tø}ýª9‚ªÊxùÍŠç¤ëf¶`ÞvÀÝJø '`®‹’ï(\ ßñ´en‘£´¶¨ÐèÛ&—€õL<ÂÅå“çëñ7Ý Ê¼QñZæÌ‹ëøwÿ}\Êq™_0?¾ýâY[—)ê3S|ö²…÷Õõ<Àv/F4–¶ë ÚjÊRõÜׄ(Û¶j— +gM»NvU·èžL»N©J‹í¨š¦j§mv~ÒÁyzøÎß™œçNV²>&«ÙL°4Ú$Ï.ó¿kü¢ _Ñ;F?/=c ĽcV,wÛq$pÝá³lNGÓ¯6æ¸ÚÆYZmÌ!p/x(û‚øÓ¯º ðDaj’Ç0õp æ»O¶âCÇ4•»ú¾n+qH¥µØLCHâöRâ3JûýçÝÿµžóâ endstream endobj 2742 0 obj 4602 endobj 2747 0 obj [123 /XYZ 40.7999999 723.859999 0] endobj 2748 0 obj [123 /XYZ 40.7999999 723.859999 0] endobj 2749 0 obj << /Type /Annot /Subtype /Link /Rect [372.959999 733.460000 479.519999 741.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 2745 0 obj << /Type /Page /Parent 2 0 R /Contents 2750 0 R /Resources 2752 0 R /Annots 2753 0 R /MediaBox [0 0 595 842] >> endobj 2752 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1738 1738 0 R /F2746 2746 0 R /F86 86 0 R >> /XObject << >> >> endobj 2753 0 obj [ 2749 0 R ] endobj 2750 0 obj << /Length 2751 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷Š/Q‚»óC€Å.ƒ‘C°Ž^#ò÷£nI=ݤ>JU*ªÕ3²aïxhñQo’U?üùË?öÿú}ÿááËöߺ?¾ìŠCQí_ûãß?\þBW£Û}åº>þµÿö}÷²Ù}Þ}nþý²SåéÃ¢íð÷o¿í>´ƒïÚß|yøkóÓÿözÿ—æ¿~Ùÿø÷柺þŽÿÃ÷]U—Ç~mPZéªùËŸŽÿÞýíûßš)T§~ÿþAÙZykgÍãåü©:ý}ù)¬™[UÚ²Ú+¥›Ÿ]CŽÿþs÷sÓÛy‡Ú*åKë‹É½z}êV—ûÚ7ÿÔQŸÑÒ¦õ¤ævä´•éè8#5keª°>Ù›îeUŸ©Ë˜™Äeö]ͦW턜‘š·´žò¸+é•iWyÕp³²Õ¾v3æwÝÕ ’u=éFµezR­°ÎX\]™dG‡Êe¼nä¥aÑ®ªtó³7Ý_¤•{%ÅŽ¾«ùD4¥“b¬W2ì€ñ5Ái-Eú¾«ù+•”Nç$BzØ‘¬&”¥—bGßÕ|"6übl3'vÀŽøšP÷æ·Ð³×YK™òªÐR´?ÎIÍ[]Gü¨§Ï"Q²~’_~úºûð¬¬©Ž›‚¯?739í,Ú?¾6ˆkþ£ Ø%üúÓþÍöÂÿiÿõ—]}pµñ®ÝŠLlyúÚ¬-÷L]¡ºQu ç£`Ëly@-Ê¢ )¢>Áq-ÆÀ87SKñ¤ ±EËçú!Ën2¾t¥v1¡ª×µºÓ/ìÁ¶Ó¾ Buj)úèG8d_{ýxú…R×ìöšÿyB÷ÊÓ[¢;)rÍŽ¼RW -ô©ÅŠH"p÷øØ’ þ&Z†ESŠùEè•A¼U3IÐ.'ž#”]ÂÙ/C>ÌsU‡¤‘ }9ã[¬LxY˜ò™.£3㓘2]’öwŠG4µXê±T–õÝ%è:ð Í—ïPŠB+a ¾(Á j2/Yn ö¦Ÿ¦›N<ûO!µ"òµÁVu¨êâÚë-ÿ”ë»}mùùö úôˆäsÌ_È”é#¡ãxåÍy,ì<ìcÇ gN3J˜_Ü+Ž0q'þ-‰eDêy”XpZõVºï–#lù=OU›Àó$8Dp#bOìlëæ×ÁÜײµÍȱÚÛ0Vˆ$ÛÓˆ…3 ,ËÍ7è lÍi1Gó ™ž<á×}îȣК±h+¦°Ä©Èô5᪠¥'L>†(²7qˆÃðGH3j ®] ‚„°ƒ 1;4n3WQKˆÐ˜w·¸³„2EìÜ"ÐõG v ùÈáaB€döy„ daAâgÎùC/-÷¥iVÑu™šfÓÕt›îUØtm¡v†‡/VÓ£ÂH¦slG$¡¬nÆõ—r¼:êøl;geúåȚꘋHÇ9¼iUAÅù•G‰> ´;YØlʬ¾üů»/Ù.¥á¾°™B9-c»Eö;”Ã:BĹ a&Úyˆ¹Ú7B71·‡ ¥2×úTNsÐp{ð.l)éßh¿©á8S³¥BËå&tw|•‡.ŽºhÁ½™NÐtx¥Þ…¹ª8´ -Ïttãä?’(]?$%[`+­Äù\YSOÏU°EÃx–‹:[Zã²ÜÖË\&1¢ú¥Oš6&b5gû"’A†YŒ»gä204S$…-ΡbÜóÅŠiCP™6qèMH$†æ™±Ò.â_†N¸Lqû3á&ëq”^4ýÛ»ÒÚˆFü3›6ÛÍΕî‰Èü„dÜæ1Á¡½-‹<~3Ó•ˆ°.7ñäMDÎÍ^dO$6Ís¶T„Dfºç!l3Z c]`6î*œ'œçãóŽq6ÝŧSyjsò&Pq<\ž‡Ö£Açt*‹4fNË'dÑe6²™ýkƒ8ƒoöIÊÊŽ—²zÝÝ|œËEñå.K…ù¾øÚ@•ðx¥¡ð•,eMä/㫘 KfW“[Mº>Â…¾x#vg;A–­OBú½÷f †6aY†òŸ¸„Ë¥ËØ3ƒ÷pÖÒ­'Z°u`hF¢Òš5,Ö ÙÁ´†3`µà`;¥ŠÃ…„…\—ãkH¬k-öM²WôØÖ0 >ƒÁ{ ãƒ5¯ZoNo‰¹1VŠ-dÂ3¬Ž…pœ–ð¸7l…poØOa€í“(0­±Ä<ݸ° XÌëíûÓ%ó¸à¨uuí©h R z·Jù,Q±âDÅŒ¨ ·ÀèÃa]Ç4Àã0ügœx!ÑcgÌ™µÁ§xnœh K"NkĽa?¾ å©LÙSqÁýxu®ªæÄÈ·?#YêœÈB›¯¡ÕŽ ÎÀâ@Z/é•«×RqΞjí>µ6sV÷nÎF›Á*"ÑZé7,óµéOdåâì‘|“ºêŽmÉ6”ÄK&áe³(ß#F.™ÌEêôû°î~jRÙ"Ð3o½ý¬*†(Y‹AùÄí¥Ä#ÿ·L(G!d#pVï) „P…Â)8z Ç[MJGNø•œ®£4ï ÔQÐaÇ‹Àç¤ë°@w& så47£þKÕH6K™c†§'º°ê£†\&8­¥ëY’8! G#"u*œ,Nñ ž’HNð"€w ióÑ¥™[45]?'h¡v¡·Š¼Æ¸S(!ð‰l̰mqÀ3ƒ?ÖAï%v4šÞ¢úBoŸñî¡ò–UÀÊ©o'@æLÃÜ:‡š Çd„wDð EÞÁ D!˜$~Ó,ÐC>;§ÈlÜHûx(Œ±Ç"˜ô…Ó±oŠ'PÛÀe̪Z16âœ2/ÊØÓÉ`;`ÔËÑÓ”L¯ç06P¬ŒÑ£X–ªçÝ7ÉD[xŽ„PZ²¨8qp-ˆó0œ²ªÐŒì¬Û@¸†9/oNüEaø’û$×ߘwY·§7ůè‹×:d½”qÜ›ÔéEŒ)«BйH…ú¶Ë>ºËG8 žÀìþ.~Íž2GHò¾r`ŽŒÞ ÜÕãqTTÊ ¥ ³Žج]îÎ…Å©‡-ëÀ·ÑLT–‰eÊeZ­2¿‹ 2Z+¯[•®üõAå2wÎÕ!ؽՕÅZâÝ=T¥Ær2ɹ/*·dêQûrs€æœ’3V œC8ÊHœÿL/ª_j{˜ù¢‘¿@×ÂÓƒ!e~81Ñ áQIÎÃGYÏ礘ö×¹]Nç@‹ês:cg[pš¬›ä@´ÈœIÎ`¾ì&‹2çhOWäÙ»òáò%¢¨fiíW¸ÆS7ŽsÄqä…+jÅðI T¡ɦ”Éö¬lBŽ|Ï8×UMô|qwœýEÈnŸªŠrtñë™[0H™V'•;g/@{sŸઘD>´Æ Œ\e‰Q“pÅ$þ†Qã˜À÷ÀüÁ8GŒÞî5i©ª%ŠÁRU„7®¨:(¿ú2ûóTëóq膾¶¡¯-Itu$ÆÒN]‹ëú=S  r:B3ë `zíåt`<GµÓ—µh„jŠóÛ˜Pþ9-›í<Û…©û€ ç „)ƒaÄph΀÷ÒF ø„!K0EB†]ªÁ?x¥uâÀa`ÙÁ- 3V,¤h¶G!˜a1óG ¦.¯%dRÄp«:*‘òê[å€&Šö8É£ùg2àì÷T$ž¹N"š\ŸðûWyž`¼ýÕèj$c,0 =ÀÈ'œ7 íKÎJ‰.éÂG0²8×>Qy".1”} &ÏΗSeRf~cNÚ#n88{‰:8Æ•=%y‘‘Â’»z›pÈ!2“,šÇ0ÛDòEV—•×íf‡’…ñÈ-Ÿ¬ªU!àyD*ÆÖSËLØi¬7ŽÍfÈ¿åµÊŠRœÉœ4¬—srùóäÇeÙŸÜõÎsE,¿¿ÅG4Ìúlb™Å\¼)9g¡0É".FÛ½ñ×”×£œY,çÒ¾Ôê­.®×#.·ætæ¤ùû8ó¥ÃVU4ZUĂ߹K%]¦I$†æ²ÀöÌô§øÌ=qCA€Öà€2æyÀ|=Â{sƒ@D—úZû@6cLƒ&ÞÑeˆübypâ6š8ÄNˆ0(à ö ¢K`¢m™#q9äH¨}³á[Aš¦DŠ#§WŒ%RŠpÚŽXº5’*SÕcê€áXt$fPBÐ*Å#ž “dºXëV"‡ÎÚ9À7F‡C¨-ãÐ*w(È4˜°Ñ0Bw N£„I A f7Ê¥ rBš°Ì”ô–ØkaŠM§%VFlâ) ÅPÂÀ±hL·e ]€N?`ž®Y‘–˜èN•1Lb9XØÂ™`[±»Ÿü3[öÕAo ÿ Ï>¡ ´.}55»9ß4š+Ôõ4Ú´óµC£½2ö^¡Ñ.V°A£M_Õ­§Þ4Ú…®…§+¾ÄȌŒ(bµ#‰˜¢‹ð •ÆÛˆœâTÛ3Ê .Ù»3§RG0oR4£dBÆô÷../±pr†fÎØ4RƒL/w@“8ΠøÑâw¶•Ò «Õ“¾Ö¹þM¶÷ŽÅSá€cáJò èêlPV PÃAàgpÀ±,œÅppPK,F–€4°8xÃÔ4pŒ¬¸ËùsŽÚÚ»šÑ{ mÀ]kÐüÍ–JSôöa¥õ×"¾„¥Þ¦Zo_œE`[^TÌŸßKsÐ0;¸Y l!±,Fl‡ãpæ¦`(bá9$kHQ‹VÎ8ðLt=ÓÂëtÃàr*§ áà8³Nȵ(upoX®e¹ 1dé&:ÖŒá¬ Ä ë)”QÖJ¡k¶o @GY_‚q¹eínqKî³t³#µü;_÷ɱ”u‘Ó{ÎëÃøF ßJÌA! õ,cDHNÁõUœôéÐy3Y9L­GÏÊkL‡ðs¡æïævg{ú$ÉþPF¯äŒ ä5ö‹æ†%’ñâ§2¶ƒÓo)P)‚%Æ~y᜙§ôYtëÁ <ëÉ)ÖÞ’ô$ŸM´&°s[’#¼©u’Qì@‚&špÌíAÇüûÔJõi|]‰O¢gÊŠ±:h/óJ€eÞ Zÿ.Ü-~ü*võ©´©'²ßGžkN$_VèN€IŽÈ¾ÁÄ7`’a&€I¬W!ß50‰k²uØ€I6`’ùÞ30‰/C£¼“lÀ$IÞ€Id€I*Û¿tðÖ€IBJ°àxO°{,Nð›Ã›cüHl¡ qâ‹5VŒn¿&`¢×+Þ.IUCn¸$ùŽ—Ä%yeì½â’\¬`}¸$„Lv¾›‰ ‘ØïÚà-r¢Œ¸PªDJ9âZŽ™!‡ÞêfŸÀÜ E¤>Ÿ‘'"¢ØðNÞ§ ¡y@›£®úÂØb¡‰ îˆ\GdybSöÛ¿ü{Ó@y«ÊFQœHÒN>Œ™T"‡7¡ëÅW8±WS­4)fGô-‰÷ݧKˆF8 ì£ëúZ7ðº5‚×%ºÏ—{7ºE(;[4¸Eƒï8dEiœÊ¡<Ñ7 ®\aC#ò®ƒ+×硼:äì†ÜyŽùîã·e*HkwFjÚj¶îµf —)sj¶pq5¦”¼ÒûĤJPTT8X}Ðà‚y ‚°<¼ÚŸk#fâá5ï_š9ò4Š}÷Ç·ï‰IÆ«+^W÷9¹¾ä§ã¹'å^5ËLÃUåáäKö¦°×S–‡r¸ú»¶‡ÈµÒ¢ýÁÇë~ ¥•=cº@~»zAw([÷²`hœ ~SÃoZOàõAf(çx¨·VÿâL¡ÿ·Ûi ¬ð}Óm ‡ZZGšÐ¾é8FY{7·“̺ãÏÚ©ŠNaZcnc Üî,ô·±„@]HPöÉ5¦9æzWUHZiç Vš,wOpn%\¥s¥«ªŠò ¼:½pq)f.ÐÁ–‹” Ï’Ö~ÿy÷$9É endstream endobj 2751 0 obj 4748 endobj 2754 0 obj << /Type /Page /Parent 2 0 R /Contents 2755 0 R /Resources 2757 0 R /Annots 2758 0 R /MediaBox [0 0 595 842] >> endobj 2757 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F2746 2746 0 R /F1549 1549 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 2758 0 obj [ ] endobj 2755 0 obj << /Length 2756 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å—$A€õx ‡† ääx³ ÙEœ=äïGÝ’Æc²?Š,%u7mÀ3MSd±^d=¾·üô÷ã?;¾}úôŸã—éëÓ§CsjÚfüs<ÿ}óú²?)9~Ûõæ$íùÏñË/‡¯Ç¯‡‡Ã¿_¢½|pú2<œ_1øÛ—_oÇ—ÆŸ|zúóðÝÿŽòø§á?ÿú·áËÓxç_øåÐÛöüÍ¿Ço„²þóú»óÃþò»ã¯Ãú˸çßÓ¨¾“YóøúòQqùûú£èeÃÜúÎöú(„¾79þûÃOÃh/Ó8Y-D×ꮉU¨ö2î0d¯û£h¤7ª·¸Ø±rGê)xFºÌIä­Îö*<Ò©×J¨N}Þ‰ó.˜¾—Ã÷šþ$­}øßyíÖä“q*CDÛrmíð?‘µ¸q?ð@daèU׫ìò×ù2VöHFstž“È[ÝD|<¯0˜Á(\Ö>|,›ŽóXÙ#uŠI=]æ$òV7í‰.V.U4•M2Û®m<ωEÁX…Á6]ô/Cåo‡h5ׯ^4;ð@dI°Jõ\¤Ÿ‡Ê'˜VLæý2'ÒÃx%AoÍç±²Gj×Hç9‰¼ÕMâô‘åP#¿j¾>øîóáí¡ÏLÑ?ÿ4Ìär¿|>/×ÿ|kÛ?ÿxü}3LæÇÏ?ìÉXÕ™ñè8>iÞÁ'=|¢áhïá“gôD5ð=-|ò„žH¼R•þÏ 3Pp4 i݈tºáàý‘pOtÃ\% ÔsS#už?b–'4HÌ ªo·#çiþpy¥9)Ù i^/`$Tï®HûÁ¸}Òã:<"÷.ºSè3ªÀƒ<£ULŒ5øboŽ“bH›£Koj¢qKX–~æbªeMÜ‹ÆÌ,å™ò¤ê[š¾Õ?¤ëÛÀ >ž@êöÏÓRÏ ÛwL·I{¯$NRO¯5pª334¶4üD`2˜ÉðhPl³†l1Ñm¥íÒ*_û•·þÂvë­#Á,ûÆ›:lkáùÁ^+×ËÈqf $ÅÈ¡íI§’°›3‰†ó(1.„"Pº]tãX–CÙ?HÒx&ñ^fTå¹b”=ÀŽk<£®ådCz6oWü‹„]b¶²:\7®rTÐDN±¬'ÅÀÍ~ô\°«þözñÜ÷)ØïÆŸÁt#Ì:°?ø6ci´‚¶¼•ÊáWñnÉÆ½ìsךö;+‘¥Kr]# fZw&˜U¦¼í’žZ3Ò©ŸS¦üýKë—E™‚‚ÐÎ]µ³§Ï 8Š\ÓZ˜Ùñì=]e)ÀÑ”A/hÿc¯Á $Á²A ¬Ïµ¦, 3fCÈR¾e„à µrË%ž ×nJŠï_y%q¥CxÍ#‹?qt¸î¥ÎÆŽZ„:0Q¼"F ë® L¢Èâ]VÂeLá{E?•ßÎpTlT+™b\®b)]ö¯Í(j&ži7K(ß(H±;]­F‹ªeáÆ²Y”ž&K`Bõ„Ž3Sµ5>_skà“@HšÕ!ìN£²z/ÞæG(‹hò|JºµÖsƒÆeršXRH«OÌá[a\¦ÀýkpׂM Là0§°E–΋: yF)f!””Ä•%ú^&ýÃSñF<Ř.‰`NŠLÑŽÖe¼ø’qŠ˜‡Ü›’BL™ %?— éÆÞÜb*–ü9)Ññ{°yÿæGŠÃéêÓ&!GÆ›b|“ Ì.YœU¦Tqíò¹ø¶,ÅÛK}´(Y¡ßöŽ5Y©þ>å°ÞŸÔû“x;[ïOv}Âm»Â©ÎÌÍzIqJQI™r¼U]¾‚û"Œq6f»:ÉZ0±[ê¯3¡b£H_ˆJœ„Öo ×  œ«|À—õÑÏS‹—„•‡é‡û)“z§áÌ„.øK\í8šÛçcÄI9*WJ”­¡ˆ˜ª¶3…*¢Ä®;œWùÞ|÷×:µšËõÄ)0^q‚ëÁ³&uá‡3Àýìñh¸o>æ^g éf Çã¹íDA™æ¥ÅËÞ#g •8 X¾±ttE÷43àË¡uõ½¹3«éßí²L7ûÿ +âÅþå]Ⱥ®×[5#¯U€¬fÇÇ šÛî²Z3ßÐV€¬Èj»GÒ~Õw]ÍwÅ:! ‚U—îF—ö³Ï‹uéž×2®m*c®kºfN?Ù5xb×Î|J6ç}!£YyMé€|UfXh¤´.7>LÈåîÐêî,„Äç´ U¬»Þáþ¬®eÒC—.Ë ÒÇLulßè“Ph¶$™BYü^Ž©—=˜P^MÉ ‡6¹0rBŠ%å}¾ß@Xh™Ø6¯ÚÛò„ŒÜ]ôØ 8A}+\3@¸ëæ=Μ-XžpA°É.^®aM·dd5lôÇÛ:ˆ¢h³¶Â´œt¢Ø\è2æY§„9R¢‹,Ðøº‚e¸'?š¹\ýÌYÝG*1I¢KhhÇÑ¡¶Ü2`KùC‘V­£/k!VVë2E4ò( r³20ãæM1–å©€”ÓLBåxN…-ÁúÌÍšIZŠú-½ÿÝÖ¸¶%qé=ý\¡s)v BçfihNèÜvŽÙWÞµ!xム¤CaO²î‚wVx£ 5”Žpî¹›CEžP…ïQ¸^,=îÅÒHÀt³=׊\‘€)zò‘€í„6ûÊ£+‚L‚NüPzõÓY³ÝòŠ0Æ ~‚#Øq@¢mùö Ÿ$ÀÜÒy暨²UØÂÔUѻ쀄ŒYc³b°ÝxØQA·}ç}«) å»:4àrRJ¦3Nå¡€ƒãBÓâ"§µri˜¡úH¨¨.WåÈ/nø2(¯†M°G·¦Úm>«pßW<” ÷}Ëpß1†·Ât‡`º{3g”ÞL·çй±Î¤Œ–%î ¡oú ÕS*H’'»‚x,xù O~5 ï¾o¿åÖÀò,'!­p+ D?Á‰IÚÏ-[ÀY¾QÎ!ïÝ·c_ gm9tSY/&×éÞ:š›¶Œ#ûYžS" É¡²5j¦k]Âï¥ÃcIè3¥U— ÿ%į(„õIÉLMÀûŠ/xJÈžösrÄêAÀ¢£xŒ®KæS÷#ƒ~ntB¿¯‹@†o•…ÏyçL~ÉJ‚(rVX­*Õ6fyšùý99¯)y Þ{ã'r“PáÕNRÌ[÷¾e³6®ï'ÅjëœÂB—A¬yÏw/›`8+í5%·ržýT@¬Š h_0U§?¥ _`=*ƒ0¥ _ é3ÎÂ…» qŸÜ{rÂyZ”vÝp= '’”`~c…eðÛZÝ“í"’÷ädíK¬t{ '¬Íq£1Š.]‹«ö«Úïδ_ø^m8Ž;Â\©B/®ÀT‘vÊŠFÍ,°4ËãX#X qm8½¤ŸVb9gqàBp96ÃØÂÈ£˜aà p;t ” >¼Qš«K\,×£!” µ#À„†"ÐØ­À;‡¹ ó~‚ûòâ÷\Å5ÁT¬Ðs­=ƒ©Xa+—Hº¿¨|¡ÂqªÀ]AÊâ PÂDÌY&,÷òxÓsZ8bÚ'´Ô»ë„Í »Ô%ÓVî•Ìa« _ œÃJ ±´(ÛMœk¹a…S~B¬Œ(òMBÛDä‰ÀØtFÞWTnÿ~“¢–Ö~v8E3î zוJ%P„v NÅŽ*ô¾u°£Êh¥PË»Káˆx—›ÐŒ0¢Qtª+8Q¤9µøÞ nÕmŒçtÌ›’€_A¹Ô(ÓG”Ó÷»y¤FÕGoìØƒ¹×Ž|¾z÷Åý/ý·.'k™îò“Ú ï962±RÏiHµ‘ÉúLÖjVT›žÔ¦'gaÁ¥yÜXÕ}_%Ô¦')ä­MOjÓ“›hzòJsצ'k6=yMø½äc—ozòjÕûiz²ŒŠÇraCW³e²“ÆÝš•Ý˳]×å°]™{HÖJf†ö!%Û¬÷x’˜OIFÀÙ>eC@ËÝLv†ÏPÖ×Õ÷£F†T E>ï¤WÓJöŽ#AŒ5ÃeûNñ0j „P aóo»KF‚¤pĶöõ‰4ÖÜ™å€ôT„x--«Zy™¯)g¹Ü\qÕ>”üŽÕýνSè¾éÖõßx££ µªøæz1!=ySú@e\×&@®z3ò“ªX!7kÛKü«·ÔöÒ*Ñ/O³¶½äÈšyx÷¸ 7˶wØùÁ:kî0êw÷ò-庭\îGÑJvà†œwßGdéu™‘E_¸œnÍ6•û_r›j›Ê}·©Ä4ðþšÙÔ–M …n¾Gj)?³çnw¬ÍÝV£õ.Z[Ze;vm»hmiucg =LkËÕ¸±êŪF/.ܪév®Ž«M/#^|7M/‡¿Ç¯÷\ʪšãôåË/vòù°ùƇƒœüèr©X{Ã2®Eö­hO—Œ£jô÷ººmOíõ[l«OÞ¾Ž6Av§î:ÀDwåÉxLVê$­7˜Â!æÔŽ›ànýµ÷ôð3~fÙNžd£¾+Ý™|ƒk£üú'ïáïN7WVø}fbÝkOZÇÄÝiŸ™v,eíÓÜ.Áuçï¥s¢À´Æ»9îö¤J¯í6æ( ʾG|iŽw}ª HZéäƒ\Yi€S0ß=ùµp=ô•ærWß7íIœ[28l¦á |òêÌò‘SÛ?þPeTh endstream endobj 2756 0 obj 4313 endobj 2759 0 obj << /Type /Page /Parent 2 0 R /Contents 2760 0 R /Resources 2762 0 R /Annots 2763 0 R /MediaBox [0 0 595 842] >> endobj 2762 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 2763 0 obj [ ] endobj 2760 0 obj << /Length 2761 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀjøEA€x<C€ÁÈa‘C0›M°È,âì!?’Eu÷ú(‘,©Õ¶l`Ü6Gd½«X¬¢>üéËß«þV}øøå?ÕW÷óã—«™fÃWÕÿpýaj)†­ijaû¯êë·ÓKõrú|úÜýûrâúõA÷£—&üí믧Ãâ§á/_>þ¥ûô¿JTî~û¥úñoÝŸÜ|ýøv2V÷þ=|à‚ Óýrý©ü×鯿«~í@0¯óöÿþÀÞƒ_ÇËùQþú}ý(Z¬ƒÍئû̹èþéªÿþãôs7ÛŒÚ(Ée+Õ}¶Zµ¬1FtŸ[é¾­Ä¥î×RFVF™ŠK¬ ¼t®â™4§š©‡‰—agû)b3ÕVqÞöœXÌg]Û8<¹*Æôž)ŸúJ+*Á§*'YÓ*6v0‘>œˆÖif©Ø1NUNÄ–Ñx÷&vÀ‰ò5¡moÚr‚µTÆÃ*MèaâEÈ9ÒÉòIoZ2©§*'˜m©¤¾‡‰Dêý‰>“lÅeãøyðáùôá‰+iú}òóÏ ìuÑ×Ï=²¶û­ÛAvqòóOÕïüÕó/'[7V¶Í°=Ïá °?Âg4|FÀg>‘Îö)}üŒ”: ÏH‚´–­?=w"¶¾Àt.rX¶ù ’$‚8P`ÄcúˆÂ³e@í¨³Sº(óÐâC‹— LË ´X@æ HàÈœm[²%šâF@µÎ.ëÁÔjtØrT´V7Z4×À t3¹dXÕjûJ#Ì눮7ž® :©.ª8 ÈÅ8Ëed÷¶fÂI82ÈCSKaøwÐ3íCïCBƒ:XÏêʉÄàzN8¯¥û0##@+H“åŒ I¹´œ|Üú³úË` D– ¹°`b„3Ÿžírª‹ Ð"’„e:`J ÞÀ†$qÏ®kcg¾ñz‚–ÔBïm2<>Œ,\‡ãupÔƒ×y€˜Â‘>8Nɘ CáöLQÉÒ#2ºH ùZ-¹'¯üÁW±À> ÌÕ¨Û ‰%OÛøËÀ¦ë.÷VÄ1¬0–ˆ¬í;™§'íz!«3¸ ìl Y/àõ|Ô–ƒÖ¬«sûŠEn™ÌÕ!»a¥ïç"¨a…PÂ:Ù§Ïi^'°äg¬çK¸ê,ó;/=f¾”“ÊÚX¦ãf$„¬ ·o9\7ÈWrÖ.ß $ì¡AÀ;L¬¤±ö*f-‚Ö<ˆF!ÜÈ.ß…òš°¿KÈ2²iB4Íä¸Ö”B~¶¢eS‚y¦-+•ƒ ì·7ŽÔ²òËщL¿Ü†ÏGNA@°ñ庑än‹õü³Ì$q6o“%ƒçT?9³IÖMñ´Üx¦„Á“6| ƒÏpâ#r„“2«¦ñ鱺9o]nΗÇÞ¡ÏHr'D)t=ÌG:·gÍκEû²3e%,rØŽ.S4ųÉ9›3±Ëð͘§ÿp2´虜Ùl)„)RÀ‘QLé`=+{B“È&ZáÂF§•\ŽóŸGÜžóÊ5XßÑáY!:Ââgt BDè¨W7†Ã®½•âû%óÒLtƒŸ-ˆu#›×ùg÷í'!çìÖKÂîå,Oˆ>i¦sNTvï%mI·dd’S¬ã¼ìkC#FzÞ#,bHÈ¥:˜‘œÝëÛìǨ–¸•™MHóR’µË‘RaÊFÙ ‡ªßÓ-ó DNÅDNê×ä \ÊIVH‰ ¦‘­o0g+&ð1ZÊÕê¾À´ÜC Ëž r'º„àºOhÁX;Û=×Náú$\‰%kÇëdŒDêÂ÷¯ïI5tSŽH²LÝ!3¬™g~±0I"³á’:L¬»¥±ÈÉü3XÁ¥•¢˜ ¸7i¶icjÄn©B¨F¤®ºÐÖÕbuʱÌ9Ö &¦›Â+°ª5ÒEªnc°Ä܆°aßÝ`nCþ`ZïEÕxæ&×?[RÛ]Ü5.™ÚN8¸~;ÿýd^·îc“À’³Þu³üé¿—gåð‡‰Ì¨s'#|t4rág’Ê>‰«<uÝô4JPØå·IßHF\"ŽJ¡Û‰<ƒÝ(v½d»u˜Ñ¶Ö£G‚¥LɾáL(‘‘”!–â³·jåêJåkïåÐ*ËÑÜQÿÔ­\^N—“pÌŠC’åeÍ<¯Rž…T*Ý.%DT;È'¤„IèÉËÊEâ©ùC—É!j OÑ›•ƒóÕdÜ.Ñr=‹ü;=¶°ÚŽ8ÚÑwÝŽ~û¼qÎuC8ÙwŸg[%V#GxHë,.``Ko Ã)Ê}$/­ áfñÜÈ Ú~µ‘BÇQó½Ú„ ¤>ub¤Ç МÍ«ê]eËŸÕpJÑJŸRª›Óî?›!Oé]ŽÖ†1¥e|ó U·²B^PØ‘qÁ5£Ç)+õ)ë†.v,¦¸´tí&AË÷ÏG“àÑ$*åÄ$!X g]æ-©oÏ݉ÑÛ}´TNÄÎByK-•™è-•GK%Ô˜£¥rG§ÓGK%MKåµ÷8Z*ooToÔR‘Y¬hó%$o¾û2ÁѼӾLë[™;Hž¯YÔ¢™G5LÛº<5–û8Ðö˜ÌqnÕƒ­ï7í›U>}Žê1?)ìùeÇIã~ŒåêÕ—$|ð[”vÞ¾k™är^ÌöÝ£}7JÑ7ؾ۩ÆåÒŒTÛZ¥Ébʦ¤oxéDDÖÁÖ"£l4§,1«G ÐŽä@ ñ‰zŽÃΰ¿øE…ž®ñþÊT£]€˜½Js.þÞ¦aÛ2ué?¶1û9ס8,¹«¿ä]‘´NAâ6åÝD Z%/Z÷M·é^–š{ãw/ ãÑcƒ+é[í£Aúh^d`é Y;¤iË~Žîå[u/¯~éµSzã Ò1«sœX B1niÕåB°£ŸùègŽs›´Ÿ9‚)æ6„-’>:ªßÜ™f¤¹ ËÛÑo~¿ýæ–5—;Iöž&näxëôQrXÌ7i1oßßœÏbŽnü ÝøK­·V=Æ»´Ñ›vãëóm‘n|hü"/õ…†YAC¦ð6®“f$.jÉZRTÁÙ²ÖÅdÎ:V}ãƒkÞ ¦øÆ‰7£ø–ÿ ¨#rMJ<–kZ.ÌZº‘®ƒu¬q(ñÄz e4 ÓŒJJZ|°õ§õ%’T³°}Ã#›Þ«¢MIdCw¯ÊLÌßÊs{ÅÆ·¬|ZY´ÙÀø ŸÙåœ8’ô–§÷ĦœTSO|ê EjåÃÉ„Fõ¢µ·y…ÄþªÙvWü¸fUà V®å£ma ÖT¦;‘oF.#8»õÕv¶ÏšPΊfÀ‹@óf«Å" #“ï$1V!ˆqõÖ/,%óõ¹û½¦¤ì8"XËëÊ®ß(ñ?)%&Ád$QÞò&ì’+QRh´ÊJN[ªUÛç}BaÇrÞªøÏP@È2¶s;«óÅšEØra"³R(E¤Ä8ç—ÙêDÚwüQXK¹öEU Öu¾˜<§t;¡Ò>AÄî(¤8.Ù• ê´Ì·ºåÕ[Çã·H’dé6=¾¼Jþö¥.Y¥!¸PgÛ3ÊTWé^N:æÞAÎ[+¶1ÍXl£ŒÒMB¬–`w_r3'Et˜’3Z¾÷Þs”vG¡PB!TÄ)?.(ß²S´| `n_銯‰\Â{Þ»¼}8“U¹›Qe¹ÛË(.ƒ\¸ÓÚá‚–Ü-geÉ-N÷)˜´u½yñühÎË’]f/ï©3Ì/Þ/c‰Œàצà—á—,Á7«¨«ü|÷]½t$z}׫ܯß"4 ‰Í.Äþ%wôÑy>éªcÆä-2–ëúËJž¹å­k=}Ù€Uu¡Ú$ÚºõóVÑÚ‰‘!Þ•²vrsÙ4µXziá:>cá3ƒMkE-˜ü^¤àlƒåºþË#ü¿®zdÃ'ôŒÙ©Žðp›·´gÇRpw°½*@ÔõŸEÃÇVtŽi¹%rÛyñ)nc º¡ì#’kLsÌu·IÂÔ…¤˜F$ËÝ'›†øäcZ*]Æ0]ó¶3Þž˜)ˆ`G̵Å'´öÕçÓÿ8å å endstream endobj 2761 0 obj 3312 endobj 2765 0 obj [126 /XYZ 40.7999999 501.139999 0] endobj 2766 0 obj [126 /XYZ 32.1599999 731.539999 0] endobj 2767 0 obj [126 /XYZ 33.1199999 729.620000 0] endobj 2768 0 obj [126 /XYZ 40.7999999 501.139999 0] endobj 2764 0 obj << /Type /Page /Parent 2 0 R /Contents 2769 0 R /Resources 2771 0 R /Annots 2772 0 R /MediaBox [0 0 595 842] >> endobj 2771 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2772 0 obj [ ] endobj 2769 0 obj << /Length 2770 0 R /Filter /FlateDecode >> stream xœí]I¯ä¸‘¾¿_‘gÎqj`º€9>åiF=cj|ðß·$®"’H†”™¯²èb¥$cáÁàöËþúçË_ÿyùåïÿwùfÿþðëKwíDgþ\Æÿ~ÿ@Õ•QS”ª¿R=þ¹|{}ùqùñòååËðÿ/DLÚ¿†‡Ž„©ðŸßþñò‹!þb~ùõÃ¥]è忆ýýòÇ? ýÅÖ7¾ðú¢´ ßMPBÕð¸4>üÛËÿüîò¡ jªwüÿïIOÕøNK;~øOÉô_ü)Dlh›&Ý BèPî‡ÒÿÿïËoCm¾W%ì°¼‡’)AJŸ‘é;2HM*–c2ƒ‚/´£|º)2:ˆ–I—•yå{x{”þoQ"iÏõ@,ωª 'RX¢œ(îÍËÃ+ßÃÛ)Ñ&N!:£ƒÌ§ã«)Cœ:²‘Ø›èòÁ2:®F²S±ù#dbЖ™0¯|o7Ê·§J ¯c”wžÐ¬l¬Ê½Ë©!U>Qù b|µeˆSC+{ «„8V^]yª“Êt„mG7°ÞÆïh”F±¦Nã¡5+Oïcóëd+Z¸üy¾Ú2į¡Ë¿…_J‰püÚòT'“,*ï7ò;ðäôkê´HFÊ”'™‡÷±ùu²¥ -\~ƒ<_mâ×ÂF$ÿf¨¢†ìTÜ£ƒ+O­1švo#€27No¬‘Ûn3š•ÿqoãrÊGtPù bt  qJ#_hÄÞRÔ:ƒ©<ÕiÔ pXºõvP6Š5urÛaFZ³2å(ÛU›óË# Žiáòäé@â—FN±]¿˜Œ30eÁ=(¸r°áð>(ýš:m'’Q‡2eÊ=P¶ë7ç—G@ÓÂå7ÈÓ2Ä/œb»~ >…ø‘GèàÊSkBÉq"eA<> ÐV&Â¥)br*GtPù bt  qÊ£H™#EÊ<Šy <Š”y9bð;ŸQ¬©SÐàfe"$?ÌGèé\Ú‘Ã8dsÿW¥º‹ã_’e~U!Ƨì/ß^D%Cc•"þ->«…Ç4†÷í¿ùøÙ%ýše4ØøMÒ’á-=«EÏiüíåýïŽ1¢ó+"{ÿõå—Ïz<²éëoƒ¦sŸÌ____Ôøþõ—Ë Í$¸|ýû‹º*Ý ÚOE™'¤3OÂzë‡N¤?|š~è¯lÔu\{ǧ'üÊ™ìíUöÉóÄÿ@XI½´V¸T¦µÒéyí´y7­õÓ×Á¸ÛF8S€ÎÈà"æJ£FðúÚg Rà >ù>é˜Î;ð‰Ü ƒ FÈî©P©á§ALO ÔYlf$û!ë+4ï-câ0øÛ¼+ÂdRóÎÉåŠ+%j£‰yÌ:Ï‘oO­®D Â÷·d È´j>x£¹UÃv·"†Ì Rîsó† q¿äÈûT‡©R™ùkÏÅhŠ+v·ßŸ¬4–ÜŸ3K=ª…9Ò;Ê)h.ù­÷ îÀ pƒ:H[²âÓá'û}8@ÐÏ› ŠânªîÁZ÷«|Å¢Àêé§Ýœ×À|¦G Id· J8ŸJx¿4(FJÉ€aø%”ŒoñY-<¦á%œ- J8ÍhÐ|P2¾¥gµè9%\;Ü·HÖ]…$sЫÀnؼ`›É % Ë:V‰SÎ »‚ámW¿᭠Dzo+z+}·ÛáuA3ÙÇ+ˆ £l‹€ œ$ ì3Þ¨1>Øç×D×cƒ<0Ê|o ;Û­¡«¯Rôó±d Tþ˜G}õGy”Jœö ëvDãÒ –eµtþýF[¢TÐhWžd–xËÖà(¤¼sÜ:¨-ð7(âÂÑÏ2ȹ ³£v‹±À —ØéýG1Óü: -Xê€ 0(1 †ïO#YŒ;PÚnh(dK@Š%‡·ýxGi*Ò,sUÑsñ2ª›g YÊ@¨lÊR±<1¾Ågµð˜†Ï@H½”ÙÔ«Tyb|KÏjÑs'd T¿ég †¿¹AÀ€ ´6£½¦B³÷6&èHÀO8ÛŠ4žIÇ=‘†Ýl éØIkªdÒ¥à)c" 'Öãè`ØðsÒõ FSÛS©gÈz\v•Èœj_‘õçŠoÀEð76#¶ð„ƒ­æ‡/àŒ/ÛÁ¡4UBó˜¥.+ìv ¢À¨Ã‹Íš†›r„=Òæ2ˆíAøé!æ,ÓÐ eeÎÀYŽý n0RQ}†· 9T—AøGÐq}*wƒ+OÞCOà•zŒOøá£êa`v¶³S­$H¹÷¸Jš6T4¼ˆr%ŸÜÒ8´LÃx9 ­g9 Òu 9 Ò¥+Æ_ÒœÄôŸÕÂc>'¡ÕRNBg+/´Ìsã[zV‹žÓ8>'1ÞkU®Š¨ fp&\jA÷/ˆhKj…sðY |ÿò8äÀro(vðhÞŽ0ƒ1®,A'NFOp´HO>³®O¸Þ±dVeÍ|:œÐÇX¶¸"ç‘ãæÊÑ’á'ÜS3Ïáê–ë®Yfûg^rª¢•Ì$ n4z,˜A[™9)Øk«b­`ÉÚðûY†vlÓrKªA²‚¥àÔ²i Î'Õ°ÈYR£bØì÷OYň6Do\Ü#g´¤gÎ_ØYsšŠC—B²WtòŠe»2>_ˆc;‰ªcé/ì•·]U}m4A¤³¹ÔÏ Ó ~’5;o a`SzÅ~¼Á§]ªúHrð»M÷ 7¶%íÖମ|y½GÚÔ2}öº¿šôh… l™rx„l¯\=Øõ¶,ÑÍR 5<Ü€†-¼%<îk=è!z™¸ˆšP¨i³NÍ&äí•?¨«wÞ†Ç+ñ"5Ñ|æ 2@£²c6˃3¯pèDød{jûV[¢²eÏe7§ïw¤#çÒ¨JÏöJ‘ ŽExá9h™86 ;Ú@9¥_?˜¥¤Çì;ÖªÃdP¶`²»¬&X‚(™úlà„²]¤Å7À\ì×JâäþΤ9Þ%0“þH9šü\„ H N 9Ùïe¤»k„…›º8{v°a;Ë#u‡œ›í1{f. GY,ªiòC·ªæÐ  ퟭ„¶ è1¤Ô©ÇxÈÄLAØA^Ù.[3‘[o]»NO„³•™+ˆTQ6v¬hùœôÛÙGG•ŠQ ¬‚Ȭ¤d†­WOKvßÁÒ'wìqAw˜Pm 5Ûw <Þ\˜‹&¼GXÉ•4Ä}Y¼Yµ€ãÏ;šŽ(˜›ª /àè tÏUîo|ÑÌJ0›;Êù4ôœ{Æ\Ö-\0X­ÔUá(L_I ]ð wÙD ìLá (óóðíF¸8Wbn©å¦,J¬‡üåŸI|Õ®¸Tp£mçZêp£A°ûbÔ*u1‹×êŠ ·kS£E¼ ²G‹ŒK©Æ¬g€•¸˜hA›ÄèÏ ža €•–ÚÜa¹‘À=þiÙx+Ó&Ã'…,Éš…iipÀ?A¯ÂOVÂó‚)ž¬%™ÏÌ[»K”¾óAü·>*åÈ+p,ˆbÛZ¦á{5¤%PÈVšôgõx¦PµPÓã÷gÙwŸuxFgõ’{0|DV}Ö3ËRo¾]ßôæ}õ\ëã—•ùÎãE÷høÞƒ¬ü¬÷!—]‹Oë>JܼûTœß—<Øì$^@÷ÙNß™u…zî³$٠윓¦þ‰b综¶9ÁðƒÄJBõšœxÅ‚‹óFH؆³9ti°Š»ÔŒ‡¨Þ¸ÇUM¯Ÿ~íÐ Ûé{²" îÁ©8>ë†ßß|ë#eÎè5MR~f}×C6©‚®wòD7ì¶êö „‚åØ5çF™ç3z«îÛãÑwRdÊ"ÄÛHɾ»}š¢f1eͧ‡m\ç B=™·•åVœƒôPבwi/Kà‡Û¶lãÞ? w°voˆ wÔŽ‹—œ~\±N»"çpóî{Tö€’Û³(ó§=äºhó6ŒèØj¶õâØícgMºsäL¶îxÇfÈí]À(·8¡œmqÎaU+è+vIô(Ç5?OÊxä}ûw¸­øLô#Q_¥°_ °|j²ÿNõØ¿7xÇ9«(§$Tlg<ûp–Gî’9 œÙvÌ}ƒ(×|ÞßCn¹Þ>ŽÂ§ÓU¸µ*Žoè<4%‰ó(¹°3ó[@õH›&aWãí¶ÃªÃãÖ(¹Éî‘ó>|‡×+8νàÛŠ+qp}zèÑÐãôô#3¢OzÜ^˜Ör¡5êp½,ÂI‚‚º #{v—WfÆÏ¯²OžPRþ éhðmÅÏ€½°âÊ&‰ÆOŒ´IwM¯¦±9ò…oà'U-ø`ã5n©ð„YK Y˜ÛA­&Ço5nLwÙfRöØ‹$…NšnþÒzB$ø¼G²†|+eÞ~I`:ïÀ' ?Ýñ{O5òÀ®ì®ïºÁ¸X&w@ûo=DÙÎQ2-rÌÀ¬á¦Í’äZMÂè.®ñ…—Id=ýˆ#|Žõ\ÉCH^7¼òä^\ËÆ3Üryê&õœVŒ kú“®ðÂL·¯€eã‚ñéý³o¢½¿ f-jn ƒC¡‚„à ¯¿V=]á%Âý·&ãT°Œõ‚êJEmÏOpÛ²…óZ3°E,c¼&FÅX/ÂÑ–6®Ä(Òä¼$ñ÷Ñ~÷GðÉ{è ¼Pð›là0à¿¡pô©B¬šŸs4Ì͆+Â9 ~ó ë~%[R¡{g1ž™œíL,Ñs,VòC´õÐæ2ìƒ1¶â Ž-`h9Áö¢}Š–"Ì7¬¸ßÃ’È' ÄØZ9l/+>ö °Nkе§?±fÁ€ßÀqÖ¸±1/¥¸œ3½4zxŽ×Á6>Ò`óÌ•î¶ÍîL´¸îÆÙߥk{>Y}R\‚!vÉ츯éþn§¸õq’g,%\ñÜ´gIxæç΀ÖëTîŒw¬í0âçÝÌ\||&WÏNS2vÛ:›áÈ#7e p-7Ïä>§`¡ îf‰‚(õB«í+Ó7lÖ¿m9iÉM‹›5*ÿ¯¬­Ñ#ÊÖŒã²q/s-9ÿ¼FÔ[:>ôàÎÔïmï”j‰ôW·¯YÀ Ϭœ{Vo•U¡ìëÙ?E×$’‚¡ìpì&ÒÞÕŸºÛ%þÐÖl œµ¿f{pvŽïÖ™ 9qæ—iœ`xÄK'N»)íý¦pë 26-I–•{S d,ìH?Ø÷7í‰=âz…•x¶fÛFÕ˜Y‚«æôþ›ãصè-7Ôíýå-»m޼¼öàtB/7ñL'tgÜÆ!X*÷ítxÁV1Œ12x¼ýƒhØ­ÔTŸBÅ›$¿ c‹)g[0\³Q2¿è·@XûggP¢Q0¬¨9\# Ù n*;>¡E `Ý*ã¤þìªÝ×È‡Ô R`Œk¸3þ¤›xjzÚzØ­o_Ã!ê°e†g?7¢ßÇúë¾óç®=7¢¿Éè½ßèö܈Þ!Îè׃if7¾`ÿúöºb«¹‘wÁÈ¿¬šùê§Û›‹ ØX\†AÄÕ\¸Í:¿×^Ó-®b9˜Óüš¹*¯r9A"žÿÎØ•êdìgpÆ1¤j[¢£Ào4øQ¨¤WÚMw’§ ¾T›1Ðø—à»6¾Àágèy-=!ÖK—}c5V»mÛÔ¬n,ÓÞ_ÎF`YƒÚ&°…ÀÚíÚnäÚ™ÂPOTAtìpiÁª¬»èÕ•™xnǘ¸m°níÍÒ7¡Þ¸b]à7 ÇR”êÄ•Œ¹ûÄd8ؤ|íêú‚‰Ü—//ÿ  2 endstream endobj 2770 0 obj 6573 endobj 2774 0 obj [127 /XYZ 40.7999999 721.939999 0] endobj 2775 0 obj [127 /XYZ 40.7999999 721.939999 0] endobj 2773 0 obj << /Type /Page /Parent 2 0 R /Contents 2776 0 R /Resources 2778 0 R /Annots 2779 0 R /MediaBox [0 0 595 842] >> endobj 2778 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 2779 0 obj [ ] endobj 2776 0 obj << /Length 2777 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âS$ȼä`0ääÌf³Xd™ì!?’%¹-R%–Ûš¶»M“,ëÍbñÍŸ>ÿãü¯ßÎoÞ}þÏùëðóÝçS]Õºîÿ»ÿ~¸ý€›Jðþׯ¨ŠÛîßùë·Ó÷ó÷Ó§Ó§öÿßOL_:?ÚÆqŠ~Àß¾þzzÓO~ê?ùüî/íoÿ;óóŸÛ¿~9ÿíïí‡ñº/|;«»_þÝÿÂ8ã¦ýãö·®ñçÓ_wþµÁ\ÆíþÿS²æJGÁñýÚ•]þ»íŠ&ka³\ ~fŒ·¿«ÿýçé§v´+••Œ5Z6õêQÞ Ûõ°>·½A½µ­*v -UštÄ,Õ² EF}£Ì€úè…^‡ŠÈòDu±¸¥¨ÇCQQ/XÓ/SªXª¿‹1¡…H3P‹[Ú€úÀPdÔk#/˵ŒÆØ0T4Ƭiía ‹[Úˆz’0ÚØòަ +Û!à;ŒƒlŽÖ ÑÃöáKK•Ùi¬•KKrHó,Âuú@ú/µ'5ž')õ»»ós½_¨Kr†®Å¦Š¥–2r>âãk¼C˜S1õày-Kö‡ä- µ€š †uÆh`=yùRC­°¦ƒP 8šÀPc¼j©Õö–Rº–a:xL®/dYa«:`‰$lZ:À»PÜÞ€‚Ü‚a£xɬ…ÖT°s¦×½©`˜GzuÿÏ5]dÕ(§…³í}Ø{ØÇÂ>}KS [k®n[zt%WÓ>ýö²ºR—./-R¢>¸åEt{P÷o*É™inaÍL †úEQ»ó B0IX`=ÊúB 3ã¢Gúl´š¢÷Ûk\vnªˆÛ¼†¯¶è¥6°1sÌ4,±±ŒÕvF’¹Mˆ–˜‘îŽôpJݲ’=tžÅ1ÓÂ?¸t× *Á ›JL‘°ÿèïmWPk竃aV¬“¹}üeY22䊯Ö¹Áëôîˆ1!áN» r½ù¼…C¶ ²›QßF7„¾H…‘[kæNÜRDNÊAíç””¨ØnDhFqØî/ˆÃÁ´œ!<,(2K… òʧÚc›B,Ç“ʸ† ¶U˜€-oÝáÝù†xc•’zÂâ4®ÇÚàœ$B#žwý–?¤RÞ‚qO{Zs›×7‰RÎÂ(žB@TÀtGrÑ4®ÏáíGÀ"ȉʼzØ2æúZ8~€õ0%òC‰`àHÉliÇÚfÑÅðlF,)°5‰Iªì€Å‹mþõâeP\b¢éÓ"M˜X™xv¿'ä=¹ìI4ý709F­G2륌ï¢,äòt)Ôúv˜sƬtˆk‹¡‰ ×°:¼á)Œ‹‡Ç£mPåë…Ö•-J0É}6 Ô[èû ƒF±Ë= o :Õ60yM 1ªÉQþ·TÊ•1j£ºŠÓÔöRHâ0¦aA¤09†C³9«(‹ˆŒ²=R¸„Ë!9,ÏÑD±„H¸1ŒùáØñ}˜i¦+^~( ·¯ÆŽç¶Ç;8†v)Çøð:ÐA”£ü¤Žp:§vy‡ «—w˜°Ðäp¼÷¤ä]¸§¿ç¹Ëç¹£e(VšEê;®)Ÿ%‹­ØaÝ,€ôu†8çV !ص|óà”ÖÀnïx¥"m (Nçd‚‚ŒÑ×¾Z® \{® $¤Ày°M+0õ<}È[WGäÀtð,œ*Ye§â–©Ñ›~AÛ†hÙb2J ³!Â’7®å!/m1Åý|Lñ¡°³Ìr³o±ëðDžÀãˆÍ¥ÅDË{¹´P<ø™S”¯]œ@A‘Ï´KßIRÚ–SéÖóƆ#ŒyÑë9á6`¼¦ªó+Ni{)ëclwaäümüÛÖ•1õY7݆1ÓÊÏZ7KÆO¾ž´ªØÅM`×oÉÉ(òvŽöûÃߦëvvz›Æ£ý¤í3…¤û–Œb§sü|zû»\9gƒbÇB8µå!’t‹œÌÑNb–ï P²ï[™%ïÿ&ç’#‡ÙÏÃ-ÔUÚ!‰53ßI#¥µûóÚ)†βöta Æ'I¸E5í[Kxc7,Ëœ[çÌ8`ÒU4îSæåÒ-æºg-m0Zóä dMÑܳh[aê»›#9aJ^3ÜH)æY/Óý þ>‚<¡§F‘ >S{ Fëí¡X¤–Ëw£ö#ÍvxAniœ#†ÜÇÅ@'±Ë›Œ7qÅ­ì sýh_ÑQ¼™{»{V´H€"ñ>W¨déìÀõ×JÒÞÊX§èÔ˜„É»KËÛKJ1Ñ-QsuÝjÿÖ~t«ýÔL#O—OœèVÿ-9EÞÎ1D·Ú¿¥Ýj?ÞÂnõß²“QìtŽìÑ-Q‹ëáЀg\yÁMO;¤HUŽIYµ­Ùn¹övÌòÝØ7 Ä7„3"œª”÷%òžKrÃ&8Î%·Ê¡ƒCäd¾¾ÔhŽÝT¹Ì\ªEÈç âMùI*Y>3 ÛIWƒ.»Þ[ ùîÛˆIõi@{ä¢W“„––Ðy² ˆÐašØßå®cAÿÆwTã$R;È„@B”*PÈÅUÓ+7Ø­”`ù}PË]‘{ˆµbÕ‚¹.ðú8?æ¡å($:+û“q]âxÌ¡\„†ˆÊÇ£œ‹¤¨Ò“¤¸%sÏÇ„ñ¹9“q søéH÷x„tt¡fͧ¡f-æBÍZ¹aàö/ÔÜ}KNF‘·s\C͚ͅšuíÍQû¡æî[v2ŠÎQ Ô¬—k„­È«Z.¾™æYâÖYrùŽt–´5.w¼Nó?g ÚH‡ËŠ Ç]w/¶KÊÏK:Èyí£áÎÖeªsëšã”´_]$I>ß]–ñŽÓ2Ÿ³Æ\Zˆ îÊR) vø¯eý×ç½K3ç±v‘çô_ ›ú¯†Ïù¯­]åø–í'žÿÚ}KNF‘·s\ýWSÏù¯uçh?ñü×æê±Ž£Øéü×ky”<§[$‹dCŠ£Z©²a}ëM°À¨i¯~ïµÔïcÖ‰]q÷ ËjpuUÊ #QW·)õ¦“ÞœÍlÅÄ\˜Jûrî“ðL&gþP­µRâ\>”ûôÐ+Díì º{…}Š÷ï)ô¤Ñ+}½¥E‰áûÈJaƒ%óX]OüV³Õî×_¸|KNF‘·s\ýkçüë]ß°Æ÷ºoÙÉ(v:G~½”R‹9ïZo P”¥o@ä1–#Jé,GÏ(EØ78.t˜$•Cz÷¶“RY1TûtdÜ‚GÃ-°–h íÖ+Ïÿü™¬KÏv<œN 2;Uƒ|¦~Vû)wÕ ÷êgõß’“Qäí£lQƒŒ5îÌ«ŸÕËNF±Ó9 ¨A>Þ.Þe˜{¥ŒJaó"%+ÂØMâÈ‚cIìÚ»W½Èª³iHÖ‹Cß‹(gUE%iMÛ4 !FXFŠü€(@93%H:å´Qú—otE‚›r«î <’Œyî0mf>Öžò0]zåE¯_<ø=üýbÚ’åQ7ÆL D.ŽdŒtÉà ¬±ÿ É¹\÷=êúø;äà˜÷¡)ÎÏ–.w9Ä{6½¤à: ]0cìPøïB¹—ê…0ã;6ÃKõEf•|?Rþ1­©=ûÛ,3"øó8¦ùqÏ%Ú.y&.QØ_}…¾vžƒ3ÎX ƒ¤Ì>l3yÍz pÖJ È ¬QÓêMÌ3X^x3ùÆÔ—4¶E™‡ãx ¦ 5‚@ä’×°ÿ,Þ~} CPâI¬Q 5ÍâêÒ¶`z‘˜^ ~%e·p¦kÖé”II duÌ>>fÜËŠ‚˜WìZö¢`\F©ñœ!SÃû€9¢S“F(Vz ®AßF#ä RÎ&ŽÓÎÔ‡õl‘ÕðExöyÐrÚº+˜“ú˜øô8…­S‹»ö|œà œ^PƒŒX.å‚[Z™8¡Ð éðrm<é¨@h0ZZmv¥ƒ|ýóY¡ä;îá„ãÌÐýedZÁ›„uS¨/€«¤i¥‚èû8þ6:&ñ>`3½2©ˆÃ¼$½‰ûx¦X¢ …BvléÝ¿LAɺ11 No­|B¢K±Ò+‡ÜØÜxÐ#Ì‚RÈÖרvÁ(•×»îî3ï92D)çGš‡0Z n@IP \r $:–*vKH¢!í)¥† K8JtÆmÂS‡$m@sŞŒ—\FvêåˆýóDÈ 24×ç®§BáÄÙÒÈÔ°š;´_¾¿âQœ&q<ýqÿL‘õoJmxùØ{”nKMÿ,¯–z S~ {”æÝѵÏMÐ0N!zÌ\Þ‚Ó¾ÉHéÏ ösÜñç{ò%Ås?æUúyŽ@#¼É¶þmÕ€´Å¯ º\Cy6ò6 ¯ýïü½¥ß–<»/ ?¾~[õ:õÈ 7¯S òB°ë"}fí2fØHX¦« œE=ÚÛƒm¦u¥çß¼²²òÖsoªÆ%ñ~ûš™–ž€…¨¸5»”ªt¿ .!ÍÍc` ûôÖ\Ã+^‹®é¥å-­§ÜÛOÞÃï6ÅÌ ?¢>ƒm6×ÂÐ:ŽØÖgر-k`»0@Õu¿suÍ3e×p·¦¼Û®‡Ø»fUÝwziûÄ šg‡3T5øžÊT¢·+Zðz0lxo+w®Ï{Äê‚}DJ1¦ÖkZ5挄 )ØrãX~J)¹ÏŸNÿ@7 endstream endobj 2777 0 obj 4349 endobj 2781 0 obj [128 /XYZ 40.7999999 283.219999 0] endobj 2782 0 obj [128 /XYZ 40.7999999 283.219999 0] endobj 2780 0 obj << /Type /Page /Parent 2 0 R /Contents 2783 0 R /Resources 2785 0 R /Annots 2786 0 R /MediaBox [0 0 595 842] >> endobj 2785 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2786 0 obj [ ] endobj 2783 0 obj << /Length 2784 0 R /Filter /FlateDecode >> stream xœí]Mܸ½÷¯ès€•Å/}ÁöŒ ‡†È!È!ðî&XÄ‹Lö¿õˆê‹z¤X,²Õ=š<íÑH"YU¯ªXä»?}ùÇñŸ¿ß=|ùÏñ«ýùðåPWuS_ÇÓ÷¯!»JÉñcÛ™Jö§¯ã×o‡çãóáóáóðïóA4/7ÚÃÅéãÿúÛáÝøòÃø›/>ýï(þ÷ëño~üdŸwúƒo‡®oNþ=~RÈnøÏëO§‹ÿ:üõÇ߆&t/Ï=ýûƒ0FªN'µãù|«xù~}+zÙж^׺; !‡ÏfŽÿþ|øexÚ¹U§•P­4zøÜ7º­M×Éás«ìת7µòåUª;ömslTë¼ÈéïºG‰Ô5­æyЩE"­k¢Ö­ÿQU¯…hObX-ä±u­»)ULìèô¨äë[Áó S‹DZצ¡Ç¢½‘RÝ42±£—G¥>H1iýK‹DZ×ìÐ{EzÝŽ(!EŸÚÑéQÉ#Öô σN-i]›†ÞyÔg%/êÙs㇧ûOBŸ@¯9>ý2´äÅ©?ž†îšá?*6òøôÓñu-Åǧ_}ezÕš1  _^ù€®Ôð ¾ç‘ЂöÞSŒoA­à•OñmÃý©{Ö¶Qä#ã[-Û—+Ÿ»È®å(¬åX&ª#Œa|¾¶À#GlgØš°^Â÷P´OA]ÖPr ÛÛ¹ò>þïÁòÁâAU¬‰„„ïÁ¶à|Ïõmc4l,&AoQ§`4sŒB ÅKî!è²Ç§l¦Æˆ-£·„Wnì)ÅÔº –‰‚}k ÛC¸²?Ã%i<ðiš`g”˜Ë¶ Œ¾ P8¦…VGñˆäáÅŠöíqãÆ¯ðÆ´XaïÉí±e²+OÜmG/¢`6.L;¡‰÷gZliÛ웄±Ø[óFwX“(OSжHmƒã†ã’7ägn±±ÍQ2} Ràþà„2ý2¨Ú›Á)tiüǾ› Ùxƒ„Ø;ÆîW ¢¼©ËØiÞøqY*Dµ;{¤‡[P*Ö$AÁ9FiJWûyý%¬ÏÓÕ~<¸^Äœ…í>½˜?XpU kUW7Ú‰?¡Y+I$-'T“ñ{Œ1…ã,GVÆ›†èëá?P4–PkÄ–ã'O e žˆ‡ Þ¨‚—ñ`šrv¦ê©¦ý¦Äs™ÐÏxd‚-[…w‹ï! J±Ñ!p‚‹…Á¥ía2ÆÂ^óHÒSBÞ幇Õà÷à+[æbkôøCø‰ç ±ÍQ¢…;½ âËÒ¬,“RLsM`KÓŠûä­—ÑeÝ–Öåw»ón/1d-o&ŽÏÛáÝòz“‘k5©;óöêʪ®Plæî¸¬õ;+_Äju]šãóv¢Še”ôýZNŒ‡Ý÷{1¶ÐªÂmøñA-Òµ¢LK›óºv/GdRê.œ]lƒó©ûiÎ>iT¤¥Ft --9¦FŸI`Íc0¯ks© çב½™òë;²sGø#ƒ;R6f6­ ŽÈÎÙ¹#TùìÜkg½¾S;»Íý×<®¤À1¸;«…Rز=S˜ØÖê³2k<û„zZÓ¡Â2)TÏòh9a¥Ø®I^¶FHŒªññˆb¶ ¡Ca2’vÁó ”z…€ÇûP‚wÅþÐS]»ÉhÁ“•âY™GE«€±^yC¨L‰¿Ê¢r™¨DMõÊž¹”#×mò÷·ÌffÎ%x¥ÛF@|Òœ/Žu)û%”e5–Aðw8CK{ÐL]¿4³­§iÙ³ãoÓHãÛÝe„ÇÜ\Wzl¶ƒÌM%E·(c=7‰¥‡ÀÇË󖌿0•’ø®Ñ“Ûª:µpü4¼ÓèQ.BNm»üi3»W8¿¨ç¿À#€?o‹,ì’ù¥a\ßh|eŸÂÛØ_ˆÊèæÔ$ Ç ì\~xÜ{Ç€KÔUÓŠï­&x¬ÅÌÊð÷ñsƒÄCáQX<Pql˜±æÅ6/ZºByñ‡ù8còZõz¹¹Š4bW•¿ÀvÒÆœøßè™°µ[Ó<,\ áh>”+@.`„mt=]bF¬Íؾ%xL¿ÏïëÉ Ž rxtðh¥£.ÐÈ<>Øq׎¾FŒ/‹j¯wõ®w™ÿÂ#FG÷B™xÜƹ îI?ºNÌpÝ“ùáŠÂÏ}ŸÛgõ²Ÿõm>G@+Ö÷¹å»Ú…µz½FD*îS1°P°âà±ED¡°@J,'…evvU××nbÔ vÞÎ^¦ùvE i¦þXªìLIÛN,_ÅÊGðÌâJSh§û¸êåRj‰-Ͻz83xe(›÷ kl'LPû(µDO¿×Y9ОÙ[^ÅÕ6°BÂ*‰E‡qŒµzÇ»º•Ò6Oýýíœ#yg•¯Âg.µ àª½Îœw¯~,øÖþ\*›Eiéîݸ½[IÍîÅ äÝ'¯k’y]É·eüöØó–½hIËÐ]PŽž>`|¡¬ì§ìê@8ŸeË{ýˆÃ³B¯ÙÆè@Ùµ5FH<¬k%·ŒžUWзy$‡¯°á§qúqxéD+Ôã@-Õ6Çz5Ç7jöÒô㘠.Íñ±q%Ñ„jÛÎzäÌ…'mŽ¿“»h16ŒÄ& ¡1µyÌ#óˆB§£ZóF{ ëËÄ15)gèGµ\*}Œ@(ÌôØËHÁ±xµ„dë©hžîÊ´<ue%ð4st½:·`}ļÔQõ(GUŒTôÇ”U“Å<ó”ª ¾È}|„ÇYr)C²E}‰"8—Â(U{'Á%%±x[O°b^´pyŽ!ädÂæä»b!Ûfæ€cF,"(äƒéáÊR"a¶„ØÏÇ1µÄ],M¾ÍÌëÇ8ÌNcx¬¥9Ów♨Ñ,X‡ç.°œŠ+-<+¶mt²~gÊ"ÊCM̈AªQsÊŠ.dú¯qsFœKãD¤¤)éPÄkJ°MíhÍNë Óú2Úq#º™D´ò_Zzˆ‘âXp²~±Of^vÄâÎ2ÞÐ3ƒ1wšÝ´-@‚…0ÂõŽÅ‘[–Å;ž£Ìb¡Rn'þe’V;'„t)édñå~,Z&S ŸU}|»#ŠII N"$ ßZžP1½ØwSL?÷h/¦çÙ ƒgÁ^™ÄÇÓ€„j”¹ó˜šÀµjˤ O:“µôŒ5“,1Õ2×sÃ"ŽèVô~9½«’3€”0‹ ¬ó2MX*+ÄMÙ "%®L˜gâWŒ÷ Å·_Á;}æÛÍÕß“v‹pÒ¹j;{‚Qê»}]?+$±_ÃÞ‹3Xw˜B KaZÕ’œÕêzž?Ät¬s€1™ðÖ»"œVq}áœ5Kì—Ä,GN‚gN™3^_s)ëª5³+—Uëï©xOï±>¼®ÆìÎñÿƒwŸ—¥í9c W<ï±r¨´E }„­~@÷à§ÙSË–ú#,l© y}EYí‘ó÷R˜·ÍzŒ¥÷”¢0=MùˆF„®æÃáŒÃû)&±®óÌäB爧-„BWÊp[H$ÊØŒØv3†ö…wÆVºÓ@áYfú#óyy)–lŒýá‡8Sðœü4Ö”‚BTJ˜¡ÊéºvæbPvý®wB¤nzN*!EAù°6ç™X¡ ÌzýÁªÞǃž“±’Ö*9BÉãßÖ3×Ãuú˜]³¯5±²>e‹XIJÑ•ÍzÞ¯ëCœ-ã¯9­ Ä<àƒÇ:šf=ET9ˆ$ç‚•‰2ïËv¬u( lÚàÈmgÈLÕUVæašsdÂ|°×€¹Šó¯7tHHNº3ü¸‰éŽÌ À²à…°)¸'ø L ¤,Ÿa¯eæ^\u§iJôÒ‡ëqvI]¡­F®•W—õ¬TWÏÔnÐÛ1è˜íN¬æG¤\ŠMDYÁʺj-H^»ó¦ç ÁÌ~úK>A ÕÌ$µÏ—Bíkl’8œéF쥹~z‡²© TÕk¼S3ç]snüm ¶ô–dY׿¯É÷IóJ¥¦tÍjs?Ï(Ç5Ǹc»]A ›²•KþXÖ*l}ŽW &¶1W†¬÷F’ñËPèG+Oc9ç+Ÿ©„‚·ÃmŒˆ®·»?l8Úä,p<Š‘¦™ú‘ÇÒŽÐô‚[@9Ìɳ>ˆpÔå`>Á6‘»B­ Kx?ru²Ç}o6߈–ÑØ^‡5Žï1g»ÇXfÂX% 2òHká`>Ê¡—×?¶ Çá¶ÆÚsÜ~¾‚š¢I@Õ‚‡òQ¯ ¶Ç£}&þ å¸.Òž,LJr±Æ?”ã4=ñî)ëh=ÀØI°&>"×"›ÓNÖ¤¦Eï¾5ÊLßî‡d×ÅÖã=Œû6}ÿ–£ïë€Éw¼a` U×çÔ³ôB£Ò¥›7BX,UYgÙ¨¦ð +ê¤yˆC·0¥›˜ÍgNÎI‚›{²é¬ ˆüóÈ#¡}}îp!˜å!Ѭb-mýJúÌgÀ‘¶ç]¿àήÝÙµ·Ä®Í¹øÇô3x¿Aoäç¼õ?ÞéšÕûÅäÃr¦3a†h3©MÄ ÉëFðÏ£«@Þlº°9„Œ°dž¹© XP„}ây´›¥ GsW¬YMÙ°/åHµímdGYÇ3Z[ʯ”Ýxõ$)¾z;»ï9ê\rˆ+¸\ofÁ&$7¸VÀè7›>’¹ÛÃ÷ñyüa`O`|ý摆+Æú"ÆÏ^Azo ŸæÔÅÐ%˜²‘j> endobj 2787 0 obj << /Type /Page /Parent 2 0 R /Contents 2791 0 R /Resources 2793 0 R /Annots 2794 0 R /MediaBox [0 0 595 842] >> endobj 2793 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2794 0 obj [ 2790 0 R ] endobj 2791 0 obj << /Length 2792 0 R /Filter /FlateDecode >> stream xœí]I‹$¹¾×¯È³a²CR¬` ½|04ÝàƒñÁôxl†™Ámü÷™¹””Ÿ¤÷ô¤ˆÌŒjèʪ¨ÐòôôöåÍ¿ü}÷ÏÿîÞ¼ÿòïÝ·ùûû//Õ¾j«ékwø÷Ãõ/t¿7zúØõÍ^‡¯Ý·__¾ï¾¿|~ù<þÿýEµÇçoãÃÓÓ€ÿýöÛË›iò—é7_Þÿyüô¿ÞýiüéçÝ_ÿ6~ûqïð¿¾ôC{øðËôAi¥ûñ‡ëO‡‡ÿzùËïv¿KèãþÿA5mÝ(´ŽïçWÕñßõ«h²qmC3þ¸SJŸ›ÿùÇËOãhçeì‡Z©®­»*zÔN†­»~7tíN«ÁÔÙ[ÜP*u vhe:¬H¥mMUuçŠ ú~ÞfӥØÐh™+RI;;ŽÄ…ûHêã&;÷Ñvy)\mÕ B+RI;›áŽGbÃ]%ƒïç‘’Á¥úNh £dðĆ»îšã&kÕ§nó4T2¼ÚA†ÐW¤Ò¶v‚<jß×F™N7õáGÐô½?wfþ"¬¸73±VuêæÏC¥4ÔBôç°"•¶µÓqࡸ7¡«º™^7©7á2Tê@Zˆ–W¤Ò¶6ƒÞ곈 ¬/‚ðwϋᄒ¼ù¤jÓäþ¯?+9*Ó·¯ãv›ñ‡Q %²¯?î~_UªþÃîëÏ/þL×LÚFèI¥á“÷è‰~KŸÇ¼;>ùøu„avˆ ]D8Oô'Åðq&øwpÕ}9È·‡§l(š Ècˆ@ÈcøzFSŒýÆ<¡s¼õ~wꡜÑ:øžcH áÆÀ¥öMÝö#läë/7ÿ“õ‹ùÔ¶„Rïë œWTÃlFÆfot¯tã¢öÕ¼o£—è®hº ý¾ªöÕ4ætƒº¶yýäL/'îðÓÅéö¸WK3èOñ 3=ë#\5ð‰ Oján÷Zõ7 ]sp³¬Kz’„Zža|Ñã³ßUΑCWxTšèÎSYKâœEøÞ;GàÙŸó§6zz_ÇüÁ÷ƒpðõÃKKY´C áIÏïædCcñŒ«žMÛévü‘¹WϹœñ÷Øs9îϽ5bªå(q ·ÎP·Ó¶'«ÓÅ2YM_6Œë}×XO´}g@ïÌܯÛ‡wO£©j?1è[Z=Ϭëôûz>ˆË >¡'³tcž¦Bóh צfL0G܉[:3–ªf?!itðªñÚ0 .:•³3ß-íÈc¢ž3ÍO('»¯Nb=B?ïHéÑã"˜MyÈ&mmŃ`þèÐc,ˆd{i®¼ƒa[ù8^šÍ%,Q¯È…€­C¸J…#‡`Ý,þ€=¢ a¾¥$MIÑCFu‰G Œ0äãÅÖÚÖ(jkèèsÒ鯨„šž‹‚ÝUSš"EÖun‹#¹;+â¨Ga%Ó:È,YO`^aJP7Pópëw6øìÅc×KŽð.âYâv~¤] ñg@B< çXø0Ý´-m»O’™''ŸÎȶ†JÙl‹a°J’›8t)Lç'çǨæµzeZ6'¥±RÅÂOÔ[{Ñö/* Æ*×^Ì1Áw¦נá)¯ ë¤ëjõzÖƒa<+à¸F x?ØáÎ GÈNkT_[ç–/ª·û™8–V ?ÄD/ê}ˆ—×.fP›b"b—UŒ26ªðO*/Ñ2f…T‹VÜltst³ÑÚÆ°O³Œ)MDˆ^ _Üç}ŸB7d8|¼í oZgZû¦AoËƒÛÆóØ™Y?Î.òV„îCˆ%!q5©v„:JÔ)~‰¼ÝD„EE] 'Š›þUœ€j”¨GµfÊÅÿ„BºS^‰GYÛKãy!ˆ0¼°F.Â;Šh«Êtö¡-¯­nŒ@޾õÊ:ßÚÜ£WëªðÙZNf¡LØë9ígÃQZ‘X*ä5­C·ò‡ttö]ºK§ŽG?dH-y‚ŠÂñ!9*ÈžSò0(ÆvÁŽïì“ í:±S Ðà9ÏlÐÃIûÄÕp&-$§žÜ|8'‹MLhq‡=ll¨4º…!ª24ôçôKBd!-̱)2lôsfè­wîÒ]Dqšã;/¼Åisó=êfêÆÆ°ø[Â%”MS´šS–ˆÄÞœ¾îíóY\6\fÁ;ÅJí&ä÷‹f€r¢© aÛã}ºþŸü~dVѺ!«¬²é'¾µ-i&Œ#¥æ!Ÿ] —973™‡4Ò´•9—âÄ¥î8&<À0ùpL1+(jWÐÀ'5£D.CVc³œ§ÆkðÆkc@Gc<€ª©f@Ô`¼Æ8Šçá¬ß9¼‚Ê~ZӜʀláMàZ•Àµ A¸U꼘-:æ5Ò®6:æêжÐÊ»  9Ͳ•}‘*¢ÆèÕaüÆí’¸]ÎL¤ª±™ÚCä=o!2[ˆŒ¼F¤ÚSÑèM#ÚøÊÝó•%µ¨‘<ž.ð\¿ñ†/\cªŒ?=\#{ñ<5ÆšS V–%@BIÿÁŠ4–†•oB嬔CyŽò€2%6Ü+&LK.46‰]¬\™' _´ÄýzäϾè$Šùz6ʨ".ì“5*’–š©]'næiy’'ŠŠ åJ%¬?Ò‘Îy2ò†^;¼!¾Ä«³ÞZC¼ WƒÅóæéb#Q¹‚B7ÒåàE'Zm"¼¼›6íiu†ã,æ.O9+ðuµuŠë l {U𤨆üÀÖ¼L·ƒu6uv|Ð=§dÙœ z{áY¢×ÃŒIÄÝN±‰F±ßSéj|Àa›ACÂÑóÚž&¾?KH‘ QÒéƒR‚¨6ƒ¶éÄ&œxœ4X8ÉoêïTgÕuc˹Yòx³R³ÌÞÍÞQ~A¥ì9ïÚ–àòΠBŠs¶))á#§~+ž'¾OUDóÜn8ÞƒÁ‰[êS$'ì;­É0Ô]À¯ÛœKë‚:0®¦t'føXŸHÉùÂÂZɰSŒÓø„肃cp@ +i ¾£q(/–=1 °´ÚO™¾4Œß£¶À¨•kKËFEܦz3ÉǬ ›ä=‰¡œÛ„é2†(‡>AXË9"°¯ÏäŠ!R*ÅïLj•V÷>7fÃ)ܯ,Ç++\?k£±>^‰a€WŸ”ä¯uÒØÉ“œ ñÒs71×ÁZǃq7Ý(I—ÛÈc­ŽÃgoðh¥d±¤´ˆ3醄3y´{‚åÝå±Ïpî ãà?<Y踶ÙsPæýëY¦MŒßónŒ#ølà})tSY–IŽ|!Ê’yVLc=ûÁóà3•=íãtx§ Ö™á~¨ošvñ™q¸(C¯Ä°òxNð<ØJá5Pã\ï/É麳® ¿o•ÞøëÆ_óQvXvÏãýdØÔ<ÜËïËÛ"·ÒPÂñ&i\ •AwÖ.µF×ó<’‘Æ–gˆÏ%3µÍyÖ’2Sîœ%·ž@^§ÏýŠ&t‰)¬Â nKHpÉ’¿Ÿš|JwöÙl[`Ç…ç¬v©{ ÷ÜØSBƧÜ'N6ñŠžSb1Lea̽¬§NhW(âédŽ «,–-˜’µS¸Ò!'kA{‹×ë*ÁV[eãíòüyë[Û’¥n»¾ 2»,uK(¢€i $n¨°IÎ"5½­ÊP2âœÚlN‚Î#B„:}y ¬¦_]Já¯pB~aðоkƲø„>J?‰v¾žAâ ZDÔ}Yo‡C°D+»JV``u)Pâ¥ÑÖÙÏõŠî¹+ *‘»è™±qðž-J9Zos´ˆô}ÁÊ™ËÈÌ¥I.»Û,²%x@«íûWbNû¬W$;ß‘b!«‹hƲ ®Ø™Â SêuÅk2‚¬3*Á³TÆ8æÌm·ùµ c*ŰèC»§2} íÍUs²{µNêv«‚Gé‚–Q1&©¿GB)·"!Ü'¥|Áí’GIP8—ÖÓ„BR®H—{pÅDL~¬ši1©•7~Eœ^„ŽsAî–“ÚÏVrÿ ˜ÿ4ÜVàŽ£­ž¸s¼zç” KÂFRŒÏ+ÁSê#Kt«ÊÜõÆ)è({8yöI°X0n{væ2¸º„HAG\¯6([\¬i¸­Iw®±™oÛ˜Ö†nJD‡¬c–@ÝR´Ü”‹ÎbË Ÿ…Ò¬,†ÆfׯºN.gRÛDM6+A]Lò1¼UáFe¬ö„£,‘s¹ûnÒƒ23B™ÎŽœÆ‘[Œ$ñ*N[i[hËÒ%=©çz5ß$‡AJ)Èë0‚¯+~Ÿžl  I Ë^ãŽÍsÙ5çVE8ã{ SR—È¡|W¿`ØÞ8"¬`BgÚ¬_õÊú« ­S‚^JÛç¶’nY4L”'oË^:r \aQ…ãâ Ì'aÖáô%sDOmÞ`¡ŒJ%*?bw¼ó®£/9²ÞmÜ*‹Qòj$ºQ˶‹ XŒ « ‚NXKñÄñâýJÄEHi‹gleö—¯¦7¢¨ã<¢ýf8² §xCMd9¥T„m¯Nõ¶ï2Ô|•½î•j,زôcmƒÃ¡]x÷Yba<·àÓÀòáÒö!V>)Ô?Žß8x}ÜhP Öëyeû~¨Z?vPüÇpE 5ßå™$Ì+âú„‚H„sü"“TÙJÓt6[ɳ‹Y’ãJ í/£Ð,ÎÅæÄcš†oá'Ø?Âñš¾–â݃%›S÷çâ­w] €Vb–ŽÇå‚ñhÃmf4ö¬;}´3õ´§m, ܆óÔ¸ 4. ^°Ðsß÷A\^uã=xZÂ÷ŒÓ¦¢lƒzR™À­í†4Ýàð‚uЀ¡êîš`º¼Ñ€dWÜz玩nƒðÕ¸i‡>á;ƒÏÞÅM«qad|›ð<øì1&‰ÒuÂ8ÆhöZJl-qjˆ‰²ïpÖVŠ»– ¯ÚП§,œ™‚ÿ”âß“pÕáh[ì!Ä=VMo‚GÄ "T+Kq.J4z÷¼p!©¤ŒÈÉ sËÇ6];Õœöuyò‚âÂÏzZ‰ÞOÆ$Ráp|!95\à¡d¬R YDÛX<"ºàZT¼^|ÍNö ¡Lʃ¼sBPEbô¼Øt.êºL¿‰Â3EˆˆTÚ³-Î=%kb:!5ŸPu9¡ pïÄøþ¨9Vêú¿¼|Étć‰,R²Ö ®0-¨ðÎ#&¹yhu7»Ü/^,ûa“ëï@®w¥Ú<gÂòßuœ|JXOåj…L— Q¬,2€Q ‚C?ÈUÅsÆßVÂZCY‘°FÈAÊR |“ß’2ÓV+…^$¡jM8ÀŽ£9‰Ö YI¹¨'.þyw b`$­ÑƒXEjC³$š'ÑÄ—BüDs–œ"Tò6‡rS2¥Õ4dÛ9蘇WÅëæ£eJq‘švw­&U8^0Wpè•ÅŠ()Ê„„.|[–²hïUЗ–] 瘝NþO(õ˜’X¼ !Ù&\gœÁ„-).ܵuHÔÆX¾uH,AðlÊRªñÕœëé(õôÍR6Mo©F [ã‡õÙמÄ噑îwÝ_QÑj»ÁÖŒOÃм x7ÚVª˜åúîa„É P¤}W™æÉ¥§¬…¬ZÈ"5C±4¾|ÈúÊUQjt8¿yëØ¢v=”)¡çˆˆ–Gi@ é±YONÒãµ2ü@ûBzb-ª„Ð Š"@ö‘i°il²_‰±s8gkóóùL”9Ê$sâ“›ë29ŽÊT0ÔöRØ=¡õðT"DPh‰&(¼{òÂèmdô'B”ŸDjeJŸ–VÂXLï a'Ç1fuÂw¶ž“ÀËŸ-À§€’߆º"“‚Á¯E$`¿\–@õÌÄ*©eœD)Ù*L÷!ÐöÖíÛ"Jp#ÓÕÜKÌiŸõb[=q™f‡ Þ Bú‹MƈF^—)0½Âî«+]¯m~ ]vöÒ›Öfi„˜y¹ã Ã¥ïÑ8Y€Œy® ¦ÿvßÇ£!}øƒùÛ·_IÅ®ê.|ö«÷Õ°µ·Ý©q·ŽAµS ¡©êײbÛîÛÛ÷i¨÷À+¥»}w;µ»ñd:cöz¸i#jš};Z·æéá;|gBáNïue^·ßÁÑ&\v á·þv&b7vø ½3s‰[OÚÇ|ihïÌ'FÙû¼¶ãHÀºÃgݨS]a…a O[a Á§ ñz®?Ùª}Õ½vrxNºGó̤óVÍm›~o&™9â Þ^>Û™­Þzçºì‚ïLéûªÝ«N-ƒ×(SÃãLjÑ_SoAʽûüò,ä¾- endstream endobj 2792 0 obj 5028 endobj 2796 0 obj [130 /XYZ 40.7999999 244.819999 0] endobj 2797 0 obj [130 /XYZ 40.7999999 244.819999 0] endobj 2795 0 obj << /Type /Page /Parent 2 0 R /Contents 2798 0 R /Resources 2800 0 R /Annots 2801 0 R /MediaBox [0 0 595 842] >> endobj 2800 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2801 0 obj [ ] endobj 2798 0 obj << /Length 2799 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õð- ¬Çã90Æ@AÁl6Á"³ˆ³‡üý¨[TÛõQd‘b«mÙ€»ÝlRd±^¬*V}úã׿ÿùÛñÓç¯ÿ9~s¯Ÿ¿Xà ~ާß^ l#Å𶵺Ýéçøíûáùø|x<<öŸÜœ;º—¾q|Ä0àoß~=|~>ùúùÏý»ÿÅñOý¿ÿú·þå'7Þé ß¶3§7ÿÞpÁ…íÿyýîÔø¯Ã_~wüµŸ‚={úû×­1*oÏ—®üüûº+zX?·®e¶á¢ÿ£{pü÷‡ŸûÑ.Óh:ÅykTË¢GmÅyØV»Öô£ZoPom‘Cå$$/3ÐiF÷<€ø&•êÜòå©§²µi†s¹L3pð-:Z+„"œ¼«ß^Yä<Æx% |8¡¸s„-p¼? ¶à>:U)]óeÈït¶iLšIø-ÞŸÊÚÇÎ…ŠáÎmî©„Ï‘÷¹jI/!çZl©³:Û½…é´»zóÌ.kÏÅv¿“Ql˜ŒoAÀy£•±ýt¦"P½|0Кi·ºöÕNPÛ0@–º‘Âr¡}4ÓÇßËðêaú¼nò㚪QÃXQð<}®0ñ}á<`á…{£zôÅëÔhjN:Ä ïÏ〄}[8¼ˆ|–„)á{Ûåê}ÃÛ£‰L|ÉÀŽ)g2`z\ìX…÷ÕÁÐÈÅøœ0&Pêt®hákrpm',cW «!ðåJLÏ# Z'¬òÇVŸçÆðÂs… ,@`9d‹A±ÌWA<*EçàÓ½ ° Ÿ Qä›§Byh境 aYJN<]p5Óè#zêN@Üø™¬¤.$ÓÔŠÒĶSi†3giùir9µ2®Í2Â-êK©,Ÿ°$×ãSw‹ß¬6«¶P` Ÿ#VBЧŒ`°ãèp4à¯Ç-¶À• lƒÂVŠÖ))Õ"&mÚO @w€ÏØRŠ×ƒñ{K |Ó3e=Ÿ:†ɧ¾a¾QV¶m„;h¹¸†-sãÏvî°s‡4_FØSB$$†Á{âO ¾,ÅÚqƒ!tÆÎs%ÇÍÊÌÙNÖ¿‡æ–„ø¥*lУ<þ88j`þ[LÚEþ€Gõƒ<‰ã¹šÜ8 |©„¸LqòeNdÅ%ø=Kp¼HÖñ[c¸ÂqEÙd;=‘MU2BóÈQÖ™Ñb¬M ÅS‚Y ûŽwÌc昡i9@W8[ 3Ρ¨[8‹`1þy4JaUx/=,^V£)Â7ለ™ôÝ’Ž¤Z¨#e0””P),â±"@¾a27rú‘LM(;á LR;‚aãY¢¯ÀdðWCâµÍš.ª½\i(z8`d§˜Å î„@˜Ä¨Eb‡œ[ …â¾Â–ËfoMr+au»]‡šºå 9û>Cd°›«, ´¹ ǹ–fÇötøj½8Ó@ ”-ïMŠJLÝW—¢ †ÓíÜ7(E1 ð `‹à©¶UË´‰Ln2Ù Ç{B‹ ðrˆ/[–ÖÛH3Ò?ƒ¬AkCQ¹·eºß†ÔiU–]q—:©s}jz²¥596µÈ»œ0»ZŠ<+ǼµãdKD–n'‚¶H².J.n)V‚Ã)—~0š$$ÌñÂÞ¼`¬„XCBenYcwÃfà€æ‰8P·vîÝÁ Óã³ÆÇZŠ3rDz±,ÁŒÃŒÜ¿l¦ ñš|CÑ]øà‰Ü©”û#07,0ý”ÍøCÉmW±j@Ǻřîšs(Þ®9oAs¾Ñì’ïL¿¾©{×uw]w×uw]w×u?š®»àÞêÌÅ×+@y©1ü\E]+ÝË´î ‡›nºóû½Ç 7îÅx´¼À}Cùã}Ï×KS…ý€ðÁ^âˆÚI¡*zûlÌe‚~g÷´7ÁV±†“„£ÓXse{ßÇP†éÝû¸õÄ–].ÎïXNÃòÇqìrÍ{Ç1Ž]ß~¼ Lâ—«¤Uǯh[Ã:i/)Ú*ÿ1 ®Zá¡Ä`¿²ÜŒjš+º5w0½›œäÜ9{î(9ÐÆ\æ?UjEÈ@ж“y‡Õ þ´f’H³z…ß"õðW* àXøøzȤ àør¯ËHÙ 9©’òÞzy—#ÏK¸—,å°®¼’rÊvÕ§$è¡S£?´ÏòÐ5ŸéI¢[HüžàÁ¡È J}òŒÔÁ΀Y"çû—§Jӛė„¢ã)þí¥N(ÿ/ÈN©ÀR¢|3D)8”ò4%v‡’Ã{ùzU]÷òªÙ»©X‰çÙÑ)œ’DÀ  ãwˆ‚Æ)5NJ(û)ÜÜËkï©Ú l–RÒ¢X.…p˜‰åv´3 X_‰’ŸT-§úž Fïtð9•ýR dć x¢%Åj°®³ý&Ï´Ó û¨DΚ‘)¶›iYÁºj™¿¥Æ_l®ˆVDªŠ‘@V7Ä>(6¿µ£‚T´GÞÍRÜ`¦B½Ýö®9ÏqfEªiõ¤EpBût¨°Ï¥Ô`ŽööÎ4òŒ¯ûÜ¡Ñ4C-®{ÒsœéÊ6ÊíoÌJ;‡WÒ«k4`8×Í€à1ÐÁ3@Î ÃCÔE`èFLýNþ¥íÜ\ÏúF¶A†¿ÔL1ÎU‚¢qV±[9].%þ {çiä°É9J ›‚q|à™œ³Ó½ZÅY–bKÏnõ"ž9µ¨‹–+t…B,þ ¢>ܺNÏœªz$<¥$Iªx ”ž\'d»f­ØÕ˦Ý 2ñú^*º y6öJYÝg¬¢$ï÷½V9ò«™ŠøöP Œb[ Ũm\QªtLDK’àtWð®®{”é”’¢g™Àyá–O,”3Îß–À·)÷|;H@À*±Q§z›Ï)…¬~% Ï)¼7ÁZž°(ä0/Psœo·K G±t!_L“¾êí­„Ü•‘17…À)†Ž"Ñ^ 4B8–xLÓ³• ~O³dRö±RôUmGñ:,ünú/ æÜðÓ`/32’Šp§xõ=åÔž ^“ñh]…Ö;a¦»B|Î&Zë‰Ä•î¸x”O¥·µ¥ymÏÎoµ©:'ùåŠ6–EA½(ïñãW%x8áÔ°ªxZ[`Bˆ‹ÁŒR‹‡!dð¯r5Xš±¦ÞÇI~#) fv¤pR†UË‹¸OøÎö$z'—¬” X»±÷""U %qeÑÑH| Wy«WëÑ*u ÆÜp’éëãü&*sZõ’EòÌïÉáÔÀ—šüÁŠÅ $ùÀ‰üaK›(µz))P(‰¡q–€®GÑ)ñJq H ö ™œ‡°Ò²Å0Ü0w0#C Le·)‰»‹¦ëÌ’rª,&V’t5¹·f|"…ë©¥M¼[eg½µ‡81¶\_o˜wb='¾«$ðhø\Z¸|†PÃ= É`xUÍS‚º]Ñ^âbP”ÝaçÄ;'ò4ŠÅ‡Qº_:4¬æ·ÛHЪe·¸ÃÉp_q¦m›1ÓZ>p®%HN)ÆT1mv!pB$ØDH2pIËùºÄ*,k7ÀI çÕ×ü©ÿ=>÷Œ¨g2§/¸—oßœÉgiì…¥=™Z°ër säý2æƒ;nšá.¿d£ûÃxŒiÌ|B§š2žò$Ú¦¶igZ#±”èfã´nÌîðÒÒÂçXاƒ}öÚŠF°sºƒ)™m@êןÜÃﺈˆ™> >.$c®…£u¸h˜´>nÇRÖîæv&€ ¬;½úR­ˆcXÃÝæCðnC¼vbÉð† ^Zà> ‹žã‚kg°Ê ,mÇ#-x=xnxo]ŒÎ\Ÿ{Dì‚}dL±–™†ŸnîOPFÁ퇈Á_YsKrîããáÿͦ)5 endstream endobj 2799 0 obj 3624 endobj 2803 0 obj [131 /XYZ 33.1199999 649.939999 0] endobj 2804 0 obj [131 /XYZ 40.7999999 625.939999 0] endobj 2805 0 obj [131 /XYZ 40.7999999 625.939999 0] endobj 2806 0 obj [131 /XYZ 32.1599999 283.219999 0] endobj 2807 0 obj [131 /XYZ 32.1599999 97.9399999 0] endobj 2808 0 obj [131 /XYZ 32.1599999 283.219999 0] endobj 2809 0 obj [131 /XYZ 33.1199999 96.0199999 0] endobj 2810 0 obj [131 /XYZ 32.1599999 651.859999 0] endobj 2811 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 238.099999 138.719999 245.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 >> endobj 2812 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 229.459999 140.639999 237.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 >> endobj 2813 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 220.819999 155.039999 228.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 >> endobj 2814 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 212.180000 159.839999 219.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 >> endobj 2815 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 203.540000 178.079999 211.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 >> endobj 2816 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 194.899999 171.359999 202.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 >> endobj 2817 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 186.259999 179.039999 193.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 >> endobj 2818 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 177.619999 184.799999 185.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 >> endobj 2819 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 168.979999 162.719999 176.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 >> endobj 2820 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 160.339999 220.319999 168.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 >> endobj 2802 0 obj << /Type /Page /Parent 2 0 R /Contents 2821 0 R /Resources 2823 0 R /Annots 2824 0 R /MediaBox [0 0 595 842] >> endobj 2823 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 2824 0 obj [ 2811 0 R 2812 0 R 2813 0 R 2814 0 R 2815 0 R 2816 0 R 2817 0 R 2818 0 R 2819 0 R 2820 0 R ] endobj 2821 0 obj << /Length 2822 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9Àjù”H °Ûr`Ø@AÁl6‹ÅzgùûуRK¤>J,Qêî™înJ,’Åz±X,~ÿçÏÿ,þý{ñýÓçÿÏîóé󅕬bý_ÑþûnZ L)Eÿµ6º¶ý+ž¿^¾ß.Ÿ.Ÿšÿ¿]xÕUtÍá‰àïÏ¿]¾ï¿ô%ŸŸþÚ|û_!Š¿4¿~)þþæãG¯}áëÅØªýòkÿ… .Lócú­}øóåo(~kº`:¸íÿßqmL]™]ýø6VåÝ¿iUÔXÓ7k´­ ÎEó]7èøï¿.?5ÐÆn”Vq^Wªf›¡Ö¢+¥.l]Òªh0¶m ø^@u3Yµ=âû†Æ™ªã J£$—µÐª†v šÚ¢ù^K÷—2ôÚvC¯Ã)NE¢ƒ´‰¦XžimzÄwl˜ ©4•ûƒß·´cÚF,k>šÎÀm\6´–3[e Ñ8 sX;&ÆA’ÍGHmŸø¾Ñ5¼‡D•uV ÑS²e;iù j/ Šó<€Úñ}CsìUjÆ­Y¿oå/[µº ð×Í„ÎÛ ?§™–èÃoþšù´n%vàj%‰©•$ U„–Òv îpT³¶ë!޶óA3‘ €ŽÆ»bA8, ýÅ´W¢±O?ß%ê-·yPïºê­`Ô·¿îõ»©~io€wÛF6h·Cîç@F<4Å;áß#øu.þ³ð­k¡’ž±©Á¼…ëyq]ÏÇ(çÝ—Ë÷¹’¦u_|ù©Ñ§¬k´ûøÒ˜mºùaM%lñåÇâM埊/¿\l©­¬uï4qOžà‹žHë|€OzÂ+XGuO>|i°{8®š5Šë‚=…OÔ;Âè²b·ÃkøÏ ža\ç=*>¢'‚€Q‰©b”4RH$ÎÈ‹õ2J8ÛÒõ`RÈô0 ¶#ߟ(;«z‡ì<‹7”bí‰óhª9õܸ?5ÓC«§ùèÜ‚Î(ÖwFÆ”&«®t%ôt‚{Uk|:­K´¿ò J—R>ƒÒ»*Uÿ`BPÌï ¿½ÓŽLMdþâƒW êsdœ2¬gݪܬ¡‚ç¸KÖ|¨ÁȈ!œ><š=³å"2Þ¤†Á;#u <|">®NA‰³ƒ5λ.†Dð ‘´K2`Ôc xÔöž`æ Ïßv ºV„€¶KIÁO‡ëã+‘Û¾óq Åãö„ßkaÎʪîÔU?òÿÃyD3¡U¼8…¦EÄÄÃf!^ c#ž¥×øö8`Ð!€u qq­duCáE£Ð×°¼Ì;Ó´6’Ÿ¼üºýR*/7a®ÅTÎ •Ghù!ngP¹)„Z"qÎ{·ƒ®?8EæOQu½ ^±Þ+nH¼T§¯(ëÒš^S^ŸHg¶»•b€Ô¥'¸lÇM^¬û¢Ë«- õrËRúz½bÕ ÂïBä]ز£Ï¥:é†Û%ºUG7VUsºiˆ˜õ>ý¨²ÖÞ¡ÒëpÜŽEu¢L©ÜŠÐ·¸– =¡:šÍ„j¬JÙÙ‘!ëRøöõÍ™ú íDð&·Û{³½sÈÍèû9VÑWÖë:ã+Fl`……wa *ÃFÃj‰`f²lBQ wÖï ke¦Ñ“ЙDp²à:ë®'~79ƒ…¤ñëÂq†>+<ší¾JÙ‘á|ßKSöu;ÆCH@IÂÄ’tÍu¤PÜãgì[ =¡ÁH(Žl<—N×ÒØ1à ¾}ï"Â4xX˜±È:`£B!2¾Õ)0)aÊ#>¹„á`‰` l‚˜8‡¶¨ãÍsÿ oÝñbŸSÐáúÆ4zƳÛÑ\Üܤ™ƒ}öì9ž´uÌð†9I–q‡¯¬mÓÒÐd¯ÙLi,óœ½>ázÀÓõÉP·:‡/µªfR/c96¸4ƇÍ6Ì“X]z ~]~ãX®ëkÕ€0OŒÏ€"$•¼+Y²¯Á„Q>kc\QHs»Ó"aùŒ"År œ%qDXýDhšü ³•e±}eI1/²°z‚fÉ2 ¾@W• ø¶‚X˲‚IñB$0f°”ÔŒvÿ*©–•§’Â)#Œž-IÂÿv/E…NŸ»— ])vè®çºWZÓ)ª}»Äºé™Ð`í$œ;öÞk8ø klAÑÛÉ-² ¸ç]®1s­Ö†­š‚ûÁ ‡kâ ?¼#ÍÑø…÷·#a”üÂ{âp¤”3¥÷·ƒû†ŸÀÐËH.בÀ¼}Ã8Àô–o8:çâX4‹cJp¨#æŒüŸÉÆç aœÑr¤a+zQg†ÃëÒ­»Ã@üÌ;±‡e¬oؽ «ämóµyüØh@©¬')ph_$ä§’¨ŽuÒÔÞŽÙtÜÀ´ ÌØÊk»G.4ó1xˆÄHˆ1¢ûLYœã1œØû®³øÿ±†Û¾¸Ýµ†¦(‰„0?Øð)§ ¹ì…'W£ûÙƒ¶e$Û^áÌk¢8ÍŠÆ«PØ3Ö ‘'k};iò+~7“Ïw½ÌI1ì~&z>"#ÂËÈY œá{^$YŒGÿî€,IÖVíì¤C}¯?á”Á†˜þ„èÓŒ»~‡nWÖžàÚ“ƒ$ËÁ1e[ç®D5ª1„ý˜4Ô)8&d)8(9MÆ“q{6ïi<–Eûnãታ Î%Ë™¦,Á‡õg>"›U?P$Ó[ú¡” [Í\Åþ |<ë íÉçÙÝу¥¬{ò-m§§c%íÓé<ûyy¾­Òë…PòGb$)Î7®n$›7!—ð«Kôˆñv]Öj•._ÏlE®f¢ø9ñÜ.:£lÊE¤Æ(!ÐŽ2ž¼™Æ#t×½vÑÙ9\kåj"´Œ±H ¥¼ Œh.v`„òDn¤ ñ#]ƒùñž ñ5nÌcŒnÕˆ@Ãûnx¤¬X)z Û]Mè¤ô²Ç}Ãíà„°7b‚m\‡2RŒkÊJ”'çÝ6fueWùlÕŠ=§§×L ÙZ5…‹©ž»«z\[¹ «ë MŽW§%¾kVô,#dÉ{¬/6¸*“óûª>`ÝýuYÛŽ21ÞÕt}òÂg¿¦§ð¡ë»$Ôà:÷5Ùô&+ÜàøÄùßCϼӮKOp;“T˜®tı+Õ²hÈ¡–¬½©ø:þæ¥1¬¨»šsÓ—Ê¢fÃ-JCÉó¥²%çVDzÊL¡ ¿ú6š÷ûߢ«Vxµ…ñÛhJž/^OÚ·äÊ|Ï—Ÿ/ïþ0à p·ñß¾oærÐÖrÜ8æÒîí ëv/)á!ø„]+¼‘÷8ɲGA̓54Ñ‘DåLH6-øõò9Π\éî}e€±ÀvÌÕhÇ]©n>”pü3”<7•¸ã²ë[l†M›ik¸‚ºã/€ªüfš’¶Ò¬3Ý[zFÏ›ù¹ÿÙlÊuŸ˜³sµERº'ìË'ÜMµYwÊ=ëäÛâªC•éWO 6ÓoUyô[ÕKô[YŸ°š’€~»·Ø ›6s¥ßJ/Ño¥‚fTH¿Ý[zFÏ›¹)ýÖ<~ÃmöA!0Jv¦¼ù¼¸U`;ŸÔbà“JM 6ó‰QŸ½Ä'¦ö ¸) ø¤{‹ÍÁ°i3W>1r‰OŒš!Ÿtoé9=oæ¦|bÆ;yÝmºat^¼qСd‡¥ˆ¨Õ´`+&æd˜\à ôGÚm‰ÏAý[l†M›9È0¾ÀA¦…í5ÃêßÒs0zÞÌ-9¨é蹚'†~cá»gaƵJ{rR°™…óXXð%Òç-!CîÞbs0lÚÌ•…¹]báÖç0o†›…»·ôŒž7sS£SB":ëÌígØðá‡È±ˆ¼—M$f«nòry*_ŠÑ aÍ´àW.“ý‡F?ü¶ þC£¸çÛkK|ÿa[Ö{(ïÁg0ü®ü‡FV~² ü‡Ý[r e>ŽÛú/~·PÙJg{øtx´)ëaÖ“s=f¾8G~ȬW-¥LNV³fûmW‘óCAöK³Þ£j” =-ØldhÏ#eô’GÊhß#Õ–F†=RW0lÚÌÕÈÐK)£}T[zôH]Áèy3752Æt•‘‹5)8sœ yÅ’êîòl·aªau/Ŭ`3Ûמƒ­™¾%¶¯}[[°}=:Ø®`Ø´™+Û×K6Sû¶¶$`ûzt°]Áèy37eûzp° [úáM/¥ò.ÓÃíáÕ-¤äÕ€mÎt6‰Ž6ë;Ú좣ÍŽ6»àh³WG›;Ú¬ïh³‹Ž68Úì‚£Í^mvîh³wáh³ƒ£íÍô¿gî?Éôß$É;°ê~¡ä¤¡ÔÙ’,Ýìà‘Pƒ40I¾Ž²¨XMد ‰ªØ„Óì)îsÜÊýhœõ‹Ç#+'õÐ¥ëŒ×wˆ?Üý_¢ì99;—ŸtÅ+Éþس„Ø‘§&L‹D¹Ø+ÇÅ$, 3_v”ëYš’Ñ%ZÖl zvÜŠ}h2–ÊÓ)iepÇ1“¡{f—„[Àr«ùLö¨Ë,»³¤˜;œ~q{ê+Jg×UëÁéÖòæ³ üÐ7”N± p<ôöˆÏÐ æO\±.Fú¦/!#Îñ—V7Tï÷óUz,®ÛmCOQàse„sãŸE[Ë3sàÌYÆwÌ\Žä²YN¤ÔX÷¬ùŽÏjë †FB22ÊDaÙ»nÈîÉ»LpœÝ\O½Ý¼y9oæ7ÃËs¹õdÁÙ‰ SlÇ„LÀYÒì¤!ƒ’“˜²€xDOÀÑvAŽüД}¬.aœ™/³'ïRŽ3y!¬–Ì7:vCP´Æ0%ùyò¸ÔVµž¶"É–d¨`vÌwVoÈrYl½„}£,9öa{8™x‚5"”à ðÂ61ÖýÁÆF„»Rx_üX«Ñqê +í1yÌ®E!k;Å_ž'0ãpeÀ™ò»Ç—CÉ_qÚíM{"sÜ ;ËY®&ɲG†{BQó9.Êk/oßrØãÐHÍ#}œu{DVÂŽ°,—í¥˜X' îˆ9PÑhYùŠæ­¹·;Iö¸ÓÂàz~ „øs¼µîã(\ÄmWÛ¤¸š=h'û½òøxÖ·ò11&ܘF‰³8äŒÕNî‹Ù Ù !µW0KëLvÂr†i±˜ìÉ9x)+ÚNTë"cû_8ÇÈ&ÐÞ9f†²T0ÎS2Ð¥„¦dÓÌrdŽåÑé‘öš%´.”ɾ¿ÕŬk=:R ‹Ê“Ã$bMdÜηB¬šÄ9¨*ËõߘòVáD9e¾k§M!Ô¢½Â{:ÔÃMvC–ráwoZÒm’ ;¬dýW\6±k‰t²B–Ry~&—zœ••šçÁrGŠm.—^9é“#ì´]‚q;4à+¢MðÇ«1Ð2e2 éˆÁiÞØØ+ô*Â5ìãÂA8Rü®8å¢ô–bí˜Éÿlc…²1z²‰÷Š•û2"Qä‚Y’#÷¬Á[´ð­H”#7šPîf[»¿õÈÈv>Çîã$»?Óc!uå!ŠâÙ§¸°pLHäêùí1îÿ^¥¬/ž2>`¼í`@À xyTfQÄÇ8ÞîØ)yBàdíë´y`²_‘B:¶z(;T6ÿŠo κ•#+ÜÇóפÜ"“´%Ÿ¢øV]_eWoº¤e-¯úˆB²a­íb0ªf¶,þ­*Áº¨Ëz™Óë…'ýTHY ÿú/Ç“º¬úI÷çd©ëXX§·_k\&æ"G– õü4-yßufÙÂ?¢:N>,=áhN0¥Õq3–2v×·ŽvP]û]h^ÏÙ*i¶½“4ÛîÆÝ…Ù¦`Éé…'¸nG²€ªð80íàÞ~€uÞ#.ŒP®ƒ© ÷ú) Uê’·)‘<òRT ˜qþ('é3JùâÓåÿNj© endstream endobj 2822 0 obj 4880 endobj 2826 0 obj [132 /XYZ 40.7999999 785.299999 0] endobj 2827 0 obj [132 /XYZ 40.7999999 785.299999 0] endobj 2825 0 obj << /Type /Page /Parent 2 0 R /Contents 2828 0 R /Resources 2830 0 R /Annots 2831 0 R /MediaBox [0 0 595 842] >> endobj 2830 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2831 0 obj [ ] endobj 2828 0 obj << /Length 2829 0 R /Filter /FlateDecode >> stream xœí]I¹¾ëWèÀ2÷ª‚îÅrа‚O&Á ¤3‡üý”TUj5©,>.ª’Ë »åfs{|+ßÂüò÷ý?Û|üòŸý·ñûã—;0Æ?ûãׇˈö Åð±iõAtÇ?ûoßw¯û×ÝËî¥ÿ÷uÇÍ©ãø­oœ¦üíÛ¯»Ãä»á'_ÿÜúß^ìÿÔÿï—ý_ÿÖûiïø ßwmgŽþ=|à‚‹¶ÿÏå§cã¿vùÝþ×~ íiÜã¿x¿ø¾SÒ:^Ï]ùéë²+š¬cœ‹}ÿ·_§îÁñßì~îG;/ãÐ)Σ6{ÔFœ†m;kú¿ÚÓÙÚ¼‘xê@¢ey:®ˆ'íŒ3ÕxG"Ã]¶zØdÇR·y*u ݨ<WÄÓ¶6Auh•ä²ZáxºmEÿ¹‘㟈›®¶ÎUêæÏC¥Ôržg ãŠxÚÖ¦ãÀC‘)¡ãú ã²µÈNC¥BŒó\,è¸"ž¶µ ôx(*èùq°Ó6{ZI„Øy¨Ôd&ò9­ˆ§mm½g¨œLˆ+Õ [×"uóç¡RêÿŸg ãŠxÚÖ¦ãp†zÉ¢§‰7=íÕÓñáëîãçž vû¯?÷Ë8)¶Ã·¯ßwÂì?õÑ·þ´ÿ}ÿéÓö_Ùuý¦ -¬…-Í©EmµxF£ôéP&O-ÍAvÌ}9;µpvЧ†‹~j1ÉO -§–ö o›ËÑØZFó°'Øçñ¬mØio€ý~§žµ 0xþÚ#^uGÓæ )6 QÏwÆÅðqk-8öí]èÌØ?hGðŒp»‚u²¹luþøšÆYª;Fcwósgö`¸¯ó«o8eš|Úù`ÿ A|¹³3ñì‡ÐÇýaMÁ ÌºŠø¢›iÖ§Jj³ä|R¤6‡pEsÕÖA÷æbRM<ú+²*.Ö‘ÅY…tÁÝ,BãæDØÀÐÊsÄÒð ÎÒÈÃi”´§qæÅ§†µþˆA0ÄçCÀc×s Xè™/ŽE°~ÕFaj•äåBYÌܳ (5s2׈»ÞÎÆsL¥.šEðÅù/JNeÕm„…O›UÃÊhй‚é›+8ôäÜ䔇±6H‘O”µ=„41€€óƒVæýu¦ÍÅ'ø«6Ç¢ìéM‘§uìH‰`ŠY”SxÁ?^r=òÖò ʲxª¹8r¾î£z:Ps¦‰PâàŠ¤-™I„qöÅ9Þ„³ò.tMñBƒ£—€˜•̵ã%+9 ü¯ÈõäÍWûf¬Èñ'wåR·±' Ò»6Áv¢ºj(bg‡9\ÄÍGÂv–K9­F—;bð”;êZGi¡$ŸQÓžd)w7‹ã8L¹+ˆ€Eºô]9* 6C›q ÛÊp³ž»Ѷ)c_›ø„ZŽSÀ÷O°záð<ø¶„á[™l¾6¨1´Ê†n–¸GnKpÄBK ©m‰m) Š«$æ~8¬ÑDðoÊm7å²*åN9ëå˜Ç:Æ£-×»¸Eðå‹DP¼}¿Òkܶx¢]X€÷ÇÉ%,}²úpAˆ\¹ý~<þ ,µqT&îõOÄÏšµ:´)ÏQBØ»„wÏûø(þ­;¥³:'¬Mø„ ô(0…óà³÷ÄOÎ^aê^3G Ø?:u°¯Saì£@„@uø„œlŽ¡qLa:ƒe´`œõ}r‹‰2‰;9ÈkÆBk.‹È@¬£‘òMà jæ&h)R´.ŒW³15`øb(n™e‹æŠ[fÙ–Y¶^éˆ3˪Ê@=ßydF­L!ô:]`iÎ4ÓÙK_ŠESð¼¸h¬]ÏðšãûhBšVÞй˜ÚO4%s;"œã·Š^­>”£È)o*ÂCä„Ý(pF\Æ×`“˜­òže%,öS|Ò™[¹…ž0Ê<ä¡@ûb¶“Pô Sœ¨ÒÀNÑžAeH±Ò‰‡³Zrªho£ªlº¦O÷¶¾yo†Ïb.tKæimâˆ<æ ÇÂbeNkŒ­ßJP¨<¹èEm! ÑÅË+D„}SùœT |Ô@¤T°âÅ9ðq1·Œù9F¢ÉÌœO .¾Éï ë8$ó ÎS¾$\˜o¾6[^²mlº [¹NŽå6¿ïòŠ%xȪHE¡xÄH»hp¬—qRäJDÐoNTÔ8-\¯‚5®Úd(È®t«mHeµ%³hƒ•÷r‚¢~ܰü“Z.µÈe!%»<œ‘QèR”r‰_‰¦$õ:â‘¢ú$É€ù´OB>J­«„M©…-ùù*rüu¾/mš’©FI‚§4z°¯¬·Ü¬0W +XðJ†‘‰B‹K»n­ín‘1Õ#cJÎBZç‹/ˆ«ÕO0Í9í úâcÄwÕš€‰—7øBžæ‘Xæ`¼Ä;Å8†W°N^³`J¯øLï§žf½y€†"…ÒIxI t<š p.Õz*//ܲRÝa|ðöp[>'.ªYÜSJtï·¶ç\štUƒsVên^° Ë£akôÅ,Ç&¡Ìñ*uªi-¥~wI ¡´%"R¼¼YÞ{™Q¶¨ó†ReÉWÓ¢Ú©ÜFµ'½³ä{4=¬7R,‚éÑvïÍŽÌj§Ô¼«ÐŒ×Æÿ%?i_¯˜ ×âÌï0|!¬Æ–:+•݆#6Ç­y=yHN\Ž4M:ŽœVÚí_û%õÓaüöí»gîæØÛæ^¼Ûóv Â¥5ûS+×uÜNzÍ^2õuŒ9˜ëÚ_§Žš4¢hmù (Ú\i”.)¢³´ÿÑÆÖ3¨yo- œ§…}:ØgPqL›ÞZàhi_þä þ_ÙágÔgTƯµp´ÑL‹ë3žXÌÞǵ 뎟…æ)r kxÚ£ZuÚ£CÿÊiS 4²º+-¸žG2«ð>0îàÕ>Ã>Oˆ =X…û`¬Â«~Ì‚UmËÌßD¶ÐKATÁlæBÃzÉÉå÷/»ÿúQM endstream endobj 2829 0 obj 3590 endobj 2833 0 obj [133 /XYZ 40.7999999 608.659999 0] endobj 2834 0 obj [133 /XYZ 40.7999999 608.659999 0] endobj 2835 0 obj [133 /XYZ 40.7999999 237.139999 0] endobj 2836 0 obj [133 /XYZ 40.7999999 237.139999 0] endobj 2832 0 obj << /Type /Page /Parent 2 0 R /Contents 2837 0 R /Resources 2839 0 R /Annots 2840 0 R /MediaBox [0 0 595 842] >> endobj 2839 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2840 0 obj [ ] endobj 2837 0 obj << /Length 2838 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`5âS$,0ý˜9hL99³» ™E:{Èßž¶›ÔGŠÉR[Ý@Ûmš%²^,V‹ŸþôõÅ?/>=~ýOñmx}üzªÊJVýOÑþþpýU%£ýÛZ‰’êö§øöýôV¼^N/Íß·‘]Çá¥iÑüýÛo§OýÃOý'_ÿÒ¼û_A‹?7ÿýZüíïÍËO¼ö ßOJËöÍ¿û7„ªš®ßµÿ:ýõÅoÍT·ýû‘„U”'ãíÜ•t¿×]ÑÃdUD6ƒ#„6ã :þûóé—Úy¥æ„Ô’×Õl¨5íÀ*RèZDWPkn3A¥RÍ,²jGDÒ¦F*^»AE£^SÚMSÔ©ó!%#L×* fD$if#â!¤X¼ÓªÎÅòP©€¨ÌÃò݈ò°¼T4êéñ¥Eê%mŒOqýUZw-êòUi|@*óƒ=—˜}­Ú}P—•fï‚¡âÁ[cµžGŸÍoÀØHó¢ÆAØ 6fgJEÈ~”ÎPü;JGô'l,ËéC¦ŠùˆŠÃ‰€ Ëg njùž©Œgn0÷+g^ú¥ÒY&iÝ¿ÜqR׊I@Zˆ­é¿»v)9p€Ç†“"’:°cœaç3¦ÏÍ[2'·a·gLÒæDPÈêÊvðæø™ØÆX²pˡ߶£ß2¬®ÍÒª§–VÚm-šÅu̯%gæ¯úŸ‰©Y-£áP £Å ÷y‚}4ês¶£™i€ &!©Ê~s~EŠZ‘h¬)Y²Îv›56üBÑLÉã`PòÁpÑgP'D”½ai1Ø4<Üm¥h ­ÄŒhMð.þj‚~Öæou°9mqÈê3Û®¿&$´àsˆ‚œsËPªÈ NöÞQ=À¿´à2 “¶[YÂþªÅn˜€x\iTì!ÂytäÏBŸEá`èKjù¾^Ä•šŸáƒ p9ýÌá@KÑáyŽÒ Àr YJ/@âMdß[Ø‚3Š’ê|"-æ$Îè‹ÉíÁ[Y˜§“Á³~){/XSX$°%bc{ÐÄK“K1¼eÅçs²žË»3ÌŸÏ;Î?aüFœ¢tÐ$ÆÝ“ñ{èÕ%8IU÷ÇIÇ ²îÓúþ¸ïX+Wå±FÅy©µÏ€Ä‡¤;ŸŒŠ à>8¸vçZÚã[§úœoý!¾uM©E’vf$ÆTßÉQ”.O` À‰µ²f¥ÒŒI‰b–›+o-Ñ”\ï…Ã1NéðóŽÚžœý¾Êq+å.êk¯Mµ¿‡´C¿vŸ_.D®pîíüã$!Á¥eK¸¾gœ{ËšËì§ÒšÞ~Æù{nÝÙžâ8=™vœ«w`Çqâ>"ùuÅN”Iæ§–¦˜Ä@¼OŒIÂŒHár‘—+Ö«C™:׬ËVçųsæLŽì 7µm›¿Ã;lœelœÛ%\Ýjã°êbN¦m"ÿ‚«1’pTuiðÝVmøÔ_Ãë¨:º×ã*¯:J­ý#õµ¬3R.½r²¦m-¤ðrÙ–kÝís—vìð#÷°Ç>~5;©P£m5;©¬˜Û‡;ôØ6dxå<„C“n• 7¯¥Ie=¤+eä,å´ÏXXˆ¯i{wÀ¦Ô]„ôŽybÂF\óe§>ÄpGøA`GšÏ|1œq¯f kˆ‹œfËëFµ©Sñ+ëÍr[r¥æRs>*Å.àâ¾ùy:ô)^äðül¨÷xù­©~?˰MÕJ§æbDŸµ¶A4kÑ|Ó°léËžJ6µ:gÿß¼’M%aX-f ó±¢É¥ODUš£Æs>[®q£è¹ÚáQãf¾i»å7óK‡ä¹R=K~ÞÛIÆX»ú͆³Üq,´3÷ÖvÜÚ^ÛdÑD|mèýÕÏíd=Õñ1mþsüÔœ]Ê/‘þ+Pü>Bo¨’k„ØÜ­¶i`©µù'lf”[DÇÜT1ÃßsIÀÚºø )7Öl5ç à{HòÚ+™ú7+ìÚø˜4ðÁV5lsoæTê g¸?–`…\²ƒ5UÔݘͻ8‹¾Èw j&L•“7ecƒŸ/Fèv•U" J™ A©V™ ‡låBÖU0¯‰x/‘SøÝr1®û¢;7Ýrñªû¢‰8[–÷S:íÐÒëòXMïÇŽõhû|©ï°üí±ònƒûX³òÒq§éê÷EÇsÙNKM~ j¹Ý¨ŒTÔ’¤ä—ˆØXˆÏ.Ëíè–c$áÞ’¾?J°½«yCœxØK¸ Ù‘æ”rhÃN‰þDxßqº˜èO–´•.ü@u#‰¡©÷€þ”óÉ/9’$ÒÐ’î}_»úÒ9ïXÖÄ¢·§ª-ÆW$šßâ­µF’Z˜ÃË·ïÙ³…¶ºí‹Sl]ýéõ² Í̧âMšÈ²O†f—˯†äjYÊéU\óÒÂfOZ—µ)H=mꉖž6Œ•TOžÒ¢”=­M"M=GÁ>öéöš–­Ö{—˜ÿ¡õ\a'ñO}w0®&føõä`ª… y j$¬Ï@±¹cë ëÚ÷Tã’€ j Eµ‡‚9ÔŽÁÒ É&ZpüVY\…çyööyBRèà*Üsõc®Rª’%i ƒ½8d¨f®k¢½äÔòÅËéÿôz³ endstream endobj 2838 0 obj 2940 endobj 2842 0 obj [134 /XYZ 40.7999999 497.299999 0] endobj 2843 0 obj [134 /XYZ 40.7999999 497.299999 0] endobj 2841 0 obj << /Type /Page /Parent 2 0 R /Contents 2844 0 R /Resources 2846 0 R /Annots 2847 0 R /MediaBox [0 0 595 842] >> endobj 2846 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2847 0 obj [ ] endobj 2844 0 obj << /Length 2845 0 R /Filter /FlateDecode >> stream xœí]KoܺÞϯк@ñ) ( Ä袀]]¹½-.š‹ºwÑ¿_ÍHÛ¤>R<¤8š± vFÃ#ž÷ƒ‡äç?~û{õÏߪÏ÷ßþS}Þ;4u£›áOuüûéíÜÔ‚¿¶FÕ¼;þ©¾ÿ8¼T/‡§ÃSÿïËéÓÀñGÿpzÅð·ï¿>/? Ÿ|»ÿsÿÛÿ*^ý©ÿß/Õ_ÿÖÿøi„wüƒéôñ—¿0θéÿóö·ãÃþò»ê×~ æ÷øï'¦¹bŠ'Íãå<”þ¾Š^Ö«LÊŠ1ÞÏSõäøï??÷ÐÎÓ¨;ÉX«eÛ,†Úò l×êªSLµeX* .L@'’%aÆÙz!‘éÎM7 Ù¦Ók• HªL€Ž3bi¨M”ǠȤWšŸÐTm*ž¤d‚i–Iä3bI˜M„‡j#-Wòȃ#ý•1¼ÿ½ãŸÄu—‰¤dö˜ebªî2ñB"뀎7]*š&“ìʆë<„?Έ¥¡6Qƒ¢’^6m; Éd2Å&P©€X×dâa?#–†ÚHz(2é¹dš=º‰ˆžA¥’"é3bi¨M¤Ç r) ËcüÏ’‰¨D&:Î(‹ñw =eIJøkRòâx÷|øü•É>"çŸû‰œ¹áÇs¬ª>ãã^WŸª~ßôóÕó/‡®VhÕù Oš;ø¤COX ŸHí‘ >"~ Æ”Ã'BCh_á à u¦„v4Àïù84àpÖj£À4À´0}|îíÖêV¨Óane¥ˆÏ©›Š"Ë]9Ês¦¦·>äzk^)›á•}NôQÆj%µé‰ðJÐûÓùú;}`jÓ5½ßt}Su3òõÉ—ÓU nØû1wË_¬†j9péÍW±3¯HøÕA¦ÚiŠŽäÌÌ‘kô„ah>ÁclŒñ‹1-FS‡ºýb6ð˜ñ Ê’K‹ <‚+Î0Ú†jÀìoD@‡è¹P—“#îÒ ùêš3xŸ|,g¶ç“ εyˆwï8$ÀŽ?¯{Çc8ÁýxhÃã >e8Üg²Ac÷“`¼1ï=‰ ÷ò œ J8ƒ ªbyÁ2†% §”8ô†ü©SFúô‚™†ž”™iÛ­¢'X(ÐHÉœAÉÔDt&Å2ãdëà=¾˜Š{YgÓéü^ÖÙË:obò¹18.º-qŒÑ䄆 K%‹’‹ØØg”*oÈî, ¸þà$`—NÞpåÀSmÀàá)ì;3qRmaœHó¯!ºz°q&‚Ñ[^rêY*%Xc#å‡uô±.9 "w'A‰,‹pž™`;è`ðŽ.còÙ,kÌÈéâ‰dM/˜mäìû¡N‚O‘YL9‡ã,Æò$%liV.ô—ìUzö•õîú¶Ûî"<Ù;tn¯;eïÐÙ;tÈù´–ͪV«÷ÑćM…)¶'‡ÃΆó¢ˆS+œBmwîÆ¶•ŒñÚæ\¬Ã;;pT†}ÞABØ „£²ÌþsØæÝr[*få˜n B£p[`Ù‘¹ô¬W²n~ÙaP2=mÆbçíFÍðgFŒœ'“uk•õÄ Žá ŽéИ³—vc´ç¬©‡€ÄÊ™'ã&©™'cIB×âäòÞ²jZIàvä#•er Š’Þ“wÖ˜¢ø=Œ#þ°SSËÑc,3†LÕCᘠ9h<Ï­T˜Üžwá-í1arJc›óUg±Ñ ·.µO>¦o›R£uVH³|9€¸}VË[OÕø¤F‡ˆ ¬­vËç¼ º•&¡‹7Ùç¨Q¯ÓjуpÑå"Ãm_¸)À奆Ñ"S¨ ЖL×QQÖ–7Jnô| £¦€½Ô‚§:ŠÏ.€•΄Šjú¶–ÌQ‘Á'8C…ùûΓ OÌTföT'ðI˜ð„òå»sS¢ç¤L_üWô0O(gPPN5Øíê’ÄÛ'I»ÙŠôIýñ¤o÷•eeL« ·®´ â¹eä4SÊZƒOSûàVÚ_$—:õqxìyéC·ÌÿÕ«î%ɳ-¢0™¥ú–câ:gP\ü@Ú¤ÔË÷˺̳ð"¾¸·ÊP™dì,\üP@Jx‹ƒK’;Å-­7ÖÀì9ŸÐ6º‰$ã]XƲR$oû‡iº§)+ Ð'™œ „¥Žá“œ3[Íœ¦ã=£„5¢oãlº­õ¶Ú´ì}9±ÚÜ.g—x„«96o)×£F˜à¥¾ÒqÅ{fó?e³ærÆ£(Ë×Â([—¯gm:‹aÁA ës\2./ÌbùY^®²z½Ì#&>òÒ§õÆwˬèL´ní(jy\¿òþ™<7L¯¢ᾘ­‡¸JÑñõ@ßr ˤ®•ÙrW|{ Dx;W–ºi\êf: .ÏÍh„$,OÙ>aõ­Ø eqívVl™n—_±ÝÎu §KŸPå¸xdœ%à‹i(_ÎòˆfûíäK1&"ËArÏ·zŠ£·Mg–…Bt‰Õ–bK ‘Ԕˆ•M|:V,J5}͆•սȥíïVû|Í”•~‡Ÿ²@`ÁfŽ™ÚŽ'Ê—±¡àÊØ¤¥Ms†ån^¨˜˜¤ê•`Lmœ‹)¹Í(}«€dQ<£á<Î;´èl«Ô 9:tįÛÛçdÆ~_\ª5–¬¸çüe¼}ݤ—3f þÍ$½\u!F•Nz³¬"®±àœçPj·+%¸ûÏÀ•_Î­Ú 9床+¹²§ªâÕokWÍêÄÖ"¨ž)•oJO a)…RL‰¸î6K–DiÝKj)Κ0AÀ‹”›/ü²7)½&”¥LÇXbSH’؈ަ„Fó˜µJ*.on­OÍæßþcËTf¹#¢žâ)R»ÜÜ9¾ cÉ–™¤óŠ—/öæ!4¥UŠÒ¿ë¨ø›ì»ÿ[½ô‚Ü äqÄøãûd»*ѼªÄ“W)¼Cù¾®X׌>‰Žé¡ ¨Íù´…Á’i]ëyAîdíPqà oëÖæã@ùvæÉ ºBÔ¼›=£G©Z\±}ïÜ{ ÓÁ1ƒ£iyÍñ®`1zÇ9hƒø¿ýä~wT³ ¿¢1£&Î=aQîãÆŒ‹Á½‰…¤îø;W¬}¯VQÜ=Y·ÇC#g¸M¡Ò¸Í<Ácð{DãHÆËží#ó€´Ð#Ux –*<ëû,ReL£kvŒG-ñ’PT ™aoÎ;}Êiå«§Ãÿ†Gíõ endstream endobj 2845 0 obj 3363 endobj 2849 0 obj [135 /XYZ 40.7999999 331.219999 0] endobj 2850 0 obj [135 /XYZ 40.7999999 204.500000 0] endobj 2851 0 obj [135 /XYZ 40.7999999 785.299999 0] endobj 2852 0 obj [135 /XYZ 32.1599999 562.579999 0] endobj 2853 0 obj [135 /XYZ 40.7999999 509.779999 0] endobj 2854 0 obj [135 /XYZ 40.7999999 785.299999 0] endobj 2855 0 obj [135 /XYZ 33.1199999 560.659999 0] endobj 2856 0 obj [135 /XYZ 40.7999999 331.219999 0] endobj 2857 0 obj [135 /XYZ 40.7999999 509.779999 0] endobj 2858 0 obj [135 /XYZ 40.7999999 204.500000 0] endobj 2848 0 obj << /Type /Page /Parent 2 0 R /Contents 2859 0 R /Resources 2861 0 R /Annots 2862 0 R /MediaBox [0 0 595 842] >> endobj 2861 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 2862 0 obj [ ] endobj 2859 0 obj << /Length 2860 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË")Qð¼ä`àrr¼Ù‹x‘Éò÷#µ¨î6©‹–zdžö°U*V«Šd=>ÿñëßÿüíøùñëŽßôÏǯ‡²(e9ü9ö?]ÿ‚«Bðác£ê‚·ýŸã·ï‡÷ãûáõðÚýû~`òô þÑ Ž¯þöí×Ãçáå‡á7_ÿÜ}úß‘ÿÔýï—ã_ÿÖýøIÃë¿ðý ZÙø÷ðqÆU÷ŸëOýà¿ùÝñ×u‚Ûÿû‰IÑp†ÇûùQvú{ý(zYG¬²’=²ŒwÿÔ9þûÃÏ´3E[1ÖȪ)Cmx¶õ±md÷±µ€Zs[Š…j+P ›ë ¸A‘Iß¶½›¾kãP¾.»IÄaaÛ“+df#á!¤BIý~^òÕÏ›Õm·¸Êª[¯±Ø[‹NVN+«Ó*lAó·2 #65Í`(2é¥bÃ4›à‰žA…Ru$@=F,lj#é1(2éÛJ«¢Ú^Jž=ƒ $Ë6’Ô÷±°©¤Ç ¨¤—LÓ”M(ÁFHÁ”ç‚ÇÔcÄ‚f¦ oAzâãñ‹÷îxðáíðùEY{|û¹Ãâä?Þ¾¸<~꽦9¾ýtü}Y²/8¾ýrh‹úâE#¥‚#Íi¤*šÚq@ƒÏð >Ó¢gÄð EÃT?zÁ`x¦)DÛ‰Æ#â4ÒmdmŒ”´²®F^üqcÏÆ` Ž,;=²d¤pSEÅM<¢Ç3˜ b€i€¡qHQM·ºPìÇgX<¿uK,lÁ´ýpbÁTåiÁ4¬Eox%cE]ÉsÁÈBcy520¤2ñVæäën¿:Ìþ2µ@—­ø*S&Zó£¾yD_Õ R g ‚Ê_L æ<1TޘϚ(ò/Ðæ³•0ßk!RÁIXˆ@‚k¨¤UBãecJÜY Y=ÃAïѬH¸Ì:hÌÚ^3¦€8İš4]¦F ì` ìµ9'UÕLbI± •?Ó1òÐueñoù"µ”C¼¥?¯ ‰ÄÔ·Ô¹ý‹%ºÝU)Sw]̽¥SJ4RÁ®à3Ujy¨…©¡ÕIKãº&±Þž£×f¨/K¶úWZk¹¶Dº)-+¥–KûS2L™êÓG¯™:Ñö—±.¶+Œ`ȃ ~ΕOH¹¦6¸¿]$yM\"¯ 8 ų잹Çj‡˜°jn[„¥)Í,lÍDtjx—÷0§N+Z¡Ì“[ 1ï­ C\…ÅÊš_îˆaLªç Æ Ñî…T?.Ô©aЬ‹Æ)°Í‘þ0ŒÁ´`pD@ ð6–‚5ÇX?ú¿§„Ïϧ„Þžæ6ƒ¸9 8‡±ÆGh޵gê8PÁ^ÄMËA½¡ÆýÕ}hí°šM™ßÊÀ²üa8·M½.žàH´;’y-¤x}¯Þ æ ¶&x71Þ;d¹jíãúÜv!`mV«»PJ//QWSæÃìô–{×ik±›Šß©Ýtx9Xb±ôô–$NXg$-Dß%g‘¾¶dÛ¶ +–±Ì7:‘lÆš)ŠWm]>'Ö6g'kT–ì7iãˆ!_SnF|®W,ìñ}‹u½B9¿£`/&+SlðÚ‡–‡r2âÐçÉo89çÆ¬?p°ž—G8i’ø¬Œ×^ugÙÖ¶ü¶Rû!h¶CÐŒ³ºOèØ´\~˜-¾À‡“›Ü88ÜÜLÎlÍ.ûBèÌÞ>TkÞu ¸Ø1%Åág°¼Z×!n—žàà[?RBå¬M’éâð5­¬µ3¿‰ÄÍG z8°+Žâ\Ž+†ÊŸ–«“åˉ…IÙè¤Ï­PÜ00޹a5d-™òˆÀ•Öç± ‰µrç09Ì¥ªÇ´ðWÓØÂð,£ÔbãJ¼@íÈBšéQĆâ7Ì“"Íy'ÅV9„jl›ËWéžåxS)in$Ö²‹NhÝÚª2f½ïQ&$ò!Ô‘W“‡ël`C}~¥Î(笔õ]oá‚ç“õ•Öø ØËš‘ª—‘¨Lb Ñ‚-²fí}Œv…Š®(1ñݱÃü—Ù iyee!«S®ÇeÄF¿h\Ѷ¬1-k­2ŸoÖò:yüfˆ­E Ä&ý0k,,å“ÿL-”Æ’ÜEl(•­¸§˜™í«=_1}¶Öetì9­=ˆ‡Ç¿w¹3â“mëqÀ³Ô‘IîĆÌ×ìÝF¥DȶмÓ$&)Hãs‡jÍÊ´Þë‘rºœF_ÍB€p¾´ &‚¢†"^V§Tõµ2t=…AÇ¥óç>:Á™Úf-—8Ûå4ó›:[öPO!t½UÍ™å—>·O˜”}i”³Ô=#>I e‘Ybé_³*å±k 3c/£y¯Æò+a•;Ÿb_&3n‘+Ö$æíµ«SCÍë3?âvjx"<ƒ1€Jmµ|º!àNãEè4 ¡Áî¬q…DGÏÜ“öVÀ=pR‡ BwLÑK†…¡ïC·3lÌUKð|cTÿ0'°>Ùë5IQv;>û ó—#MIŸð¹Š+ „#‡ù=ŒÅŒ¼5üy;ËC‹Ê£%Ë*BQ¡ÊÖ¡€}³c+Ì2ÒñÁ¢°s¦‘‹*M¥¸i´Ž°eœâ‹S¨á^ïðI1QC·麘n¼÷gþìg&g¬ó¬g¹ 2¬úãà N»&”* ­&ø NüvpÓ€Pƒ+cUÊZ¨ržÃù¥¤“8êtâú^ÞW°PÀ®_œX FTÑZ×ÍËrÅÔ¬¼¬¹ I'Aý"àÈ6©ã(È‘¡TÇéͦéK)Æ‚K®Ü›ôá:¸Z$ÃÏ@íë¨#‰÷3Ðû`P/Ï®?Íug#qw¯¶éxÍQV#eÕSüš¸Õc±‡ŒgŠq£ìDñ*Á­ ´Î\ÕþÆ{Ǫ–›ÖøXÆjB‰8G9½;³”¤ºÊ¸J?††í¤(ÖÄ»ÝÍg1O)Öˆã3[‚öÆ­CGï–Å¡-3ûyl[3öYÚ¦Ž&øÄ#»sÍŒ¼Z¼É²÷º÷}½ÕÊ}¸d½×òsfاMÁ¯¦dùì £ô¶$ôÕ ¨ž·޳žäç"é·¯'„Ÿµg´zb¢höÊ<up-\³¿GÀÚMZ?ÏÐ:½‹-å‚¶Å{Õ{¶šîÈ·Ü£J6“åÔJs§åÓ^†r‚ï…½÷fY»6šå{Kô»}¸Í>²îœãS"$ú9 áð!(ñ8œTÞ‡wQÊÔà€x²‡Ÿ¡Nb‚±ÎR¬/ òèu!ÆÙÝY"ÙíõÆ>²î‘]¯;õ-Åìz}-zý\–{O7Þ­ÄÇÙõ:Í_çÝ)2ê´f<7«Óö}dí#»N£ùª«×iíÏjÅIõ·_ûÈVG"'†Þ<á5º3‹æRe;ËÇ5'‡ß^þ÷‘­Žì)í®™Þ>¥rڸ͙®&yŠÖƒ&–š‰&Tê\súæÑ„—ê³Ö30^N«†‰hBÜ{ŽÒ•Žãx9Jdà‹ÿL÷ކ.¬ñ¦8 ÒÍ bã3µ‘šŠxQ‰–¹Ð]ƒ¯Ö9ŽïÄ\Ä!<ƒ×^™Žè×\Q©í9ðzï¹÷‹ KÉôI ´ÚÊÏçÑáXÔüLTEÂ#!Ǣ⤚¨)÷>éYùžFý(Sâ ‰ÉNȤË>«ì‚´nnLܶ¯8B§›Ü¹–°çç‘æ¹Š¸Îcenú¡¸Å . K9ß¹aaBÅLï{¾JD¥V(k›è]þ/åԪʴ 1êÞaGÆC#®´=pÛ¨—ë”´Æm°”b½øFâ{;|þ¾·¡tQcM¸Õ¤ðÇI€Ï¸ EÑçü”â똧XÞ ´€f ytM{®…»;énÍ‘J'ÖPP"(n®7(:ÚA,où¯ÊRŒÅ‚v¯b÷*¶ëUló†žBQ,ñ˜}YÖ«Û£G²ÂÛ”¤{‹À#ùØ{Ámã)Íp)‚0çmzrxîËbÉxÚFŽ[À(¥õñõ¡z¢Ï5`žsáVÕ“~M-Œ]:ËbâàÝ£D½OM_xx‰qL[c¿WgÕ-:“d–j¤z¬þµU£´R¹sð»ìkêÀÅM7’ÞórCÿÛ«(J» JT¬î“*…Q'·Zñó ;HäÖ3wÉé C›¸¼yÚæ@QBsBÀÛgB¿ñÙ‹¹ ÛÚJB³…bn¥Ø·àé{58é×qÝßã{'=pô ôoßâdËay‘ÃW§$:O…GÖMt*¢e²²Dy޹Ñy ²ÓÄk«xÒ¼)šé(éfbdN! ÞNve¬ëBl2åhê= >ÓÂg†ƒà†¼s׸@€ÔõŸyÍÎù7¤æ)”VÏɳžÑå;&$žChމ(+JSv0°èë ?I·¥vŽËS#‡|=¡ÕíV5Øs†ôÁPšC£pË-Ô/¬!nüÉâ!ä–d‡ÎÚíÊ' ÐJ•²`}¶Çb5Í »ê‘öÓš_ÿ½ö¥Ê endstream endobj 2860 0 obj 4187 endobj 2864 0 obj [136 /XYZ 32.1599999 743.059999 0] endobj 2865 0 obj [136 /XYZ 32.1599999 743.059999 0] endobj 2866 0 obj [136 /XYZ 33.1199999 132.500000 0] endobj 2867 0 obj [136 /XYZ 32.1599999 134.419999 0] endobj 2868 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 697.940000 106.079999 705.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 >> endobj 2869 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 689.300000 154.079999 696.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 >> endobj 2870 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 680.659999 134.879999 688.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 >> endobj 2871 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 672.019999 155.039999 679.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 >> endobj 2872 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 663.379999 158.879999 671.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 >> endobj 2873 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 654.740000 207.839999 662.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 >> endobj 2874 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 646.100000 211.679999 653.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 >> endobj 2875 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 637.460000 242.399999 645.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects >> endobj 2876 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 628.820000 173.279999 636.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 >> endobj 2877 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 620.179999 141.599999 627.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 >> endobj 2878 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 611.540000 163.679999 619.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 2879 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 602.899999 151.199999 610.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 >> endobj 2880 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 594.259999 162.719999 601.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 >> endobj 2881 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 585.620000 162.719999 593.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 >> endobj 2882 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 576.980000 174.239999 584.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 >> endobj 2883 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 568.340000 137.759999 576.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 2884 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 559.700000 167.519999 567.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 >> endobj 2885 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 551.060000 193.439999 558.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 2886 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 542.419999 202.079999 550.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 >> endobj 2887 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 533.779999 185.759999 541.459999 ] /Border [0 0 0] /Dest /E#8fL#e0#d7#7c#a9#8b#26F#8bDn#b9#fd#5d#f5#1a#b6#0f >> endobj 2888 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 525.139999 235.679999 532.819999 ] /Border [0 0 0] /Dest /#8d#8c#eeX#e9#f0#7c#d1#8f#a1#13#23#ca#b2#e3#b4U#0d#ad#29 >> endobj 2889 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 516.500000 219.359999 524.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 2890 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 507.859999 135.840000 515.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 >> endobj 2891 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 499.219999 121.439999 506.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 >> endobj 2892 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 490.579999 194.399999 498.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 >> endobj 2893 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 481.939999 155.039999 489.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 2894 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 473.299999 176.159999 480.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros >> endobj 2895 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 464.659999 190.560000 472.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor >> endobj 2896 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 456.019999 233.759999 463.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 2897 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 447.379999 227.039999 455.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes >> endobj 2898 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 438.739999 276.959999 446.419999 ] /Border [0 0 0] /Dest /#7fF#f5#5d!G7L#bf#8c#f00#e5#f5B2#28#a1#a3#7e >> endobj 2899 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 430.099999 153.120000 437.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 >> endobj 2900 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 421.459999 143.519999 429.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 2901 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 412.819999 168.479999 420.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 >> endobj 2902 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 404.179999 147.359999 411.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 >> endobj 2903 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 395.539999 157.919999 403.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 >> endobj 2904 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 386.899999 158.879999 394.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 >> endobj 2905 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 378.259999 155.039999 385.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 >> endobj 2906 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 369.619999 156.959999 377.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 >> endobj 2907 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 360.979999 158.879999 368.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 >> endobj 2908 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 352.339999 162.719999 360.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 >> endobj 2909 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 343.699999 145.439999 351.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret >> endobj 2910 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 335.059999 168.479999 342.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 >> endobj 2911 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 326.419999 153.120000 334.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 >> endobj 2912 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 317.779999 156.959999 325.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 >> endobj 2913 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 309.139999 158.879999 316.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23throws_typemap >> endobj 2914 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 300.499999 144.480000 308.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 >> endobj 2915 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 291.859999 166.560000 299.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 >> endobj 2916 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 283.219999 228 290.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 >> endobj 2917 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 274.579999 190.560000 282.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 >> endobj 2918 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 265.939999 221.279999 273.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 2919 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 257.300000 148.319999 264.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 2920 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 248.659999 127.199999 256.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings >> endobj 2921 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 240.019999 130.079999 247.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments >> endobj 2922 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 231.379999 191.519999 239.059999 ] /Border [0 0 0] /Dest /#90#b2#80K#dd#87#cf#7e#06#b9Y#8e#13#84#04#9f#28HWO >> endobj 2923 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 222.739999 252.959999 230.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization >> endobj 2924 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 214.099999 150.240000 221.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 2925 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 205.459999 151.199999 213.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 >> endobj 2926 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 196.819999 122.399999 204.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 2927 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 188.180000 152.159999 195.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 2928 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 179.540000 165.599999 187.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 >> endobj 2929 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 170.899999 165.599999 178.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 >> endobj 2930 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 162.259999 125.280000 169.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 >> endobj 2931 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 153.619999 177.120000 161.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 >> endobj 2863 0 obj << /Type /Page /Parent 2 0 R /Contents 2932 0 R /Resources 2934 0 R /Annots 2935 0 R /MediaBox [0 0 595 842] >> endobj 2934 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2935 0 obj [ 2868 0 R 2869 0 R 2870 0 R 2871 0 R 2872 0 R 2873 0 R 2874 0 R 2875 0 R 2876 0 R 2877 0 R 2878 0 R 2879 0 R 2880 0 R 2881 0 R 2882 0 R 2883 0 R 2884 0 R 2885 0 R 2886 0 R 2887 0 R 2888 0 R 2889 0 R 2890 0 R 2891 0 R 2892 0 R 2893 0 R 2894 0 R 2895 0 R 2896 0 R 2897 0 R 2898 0 R 2899 0 R 2900 0 R 2901 0 R 2902 0 R 2903 0 R 2904 0 R 2905 0 R 2906 0 R 2907 0 R 2908 0 R 2909 0 R 2910 0 R 2911 0 R 2912 0 R 2913 0 R 2914 0 R 2915 0 R 2916 0 R 2917 0 R 2918 0 R 2919 0 R 2920 0 R 2921 0 R 2922 0 R 2923 0 R 2924 0 R 2925 0 R 2926 0 R 2927 0 R 2928 0 R 2929 0 R 2930 0 R 2931 0 R ] endobj 2932 0 obj << /Length 2933 0 R /Filter /FlateDecode >> stream xœí][¯ä¸q~?¿¢Ÿ l/ï à™Ý ‡‹] F‚±ÃðYû!?¤$ÞŠ¤DRR«{ÎÙvFÕT•DV«>©ïÿí—ÿ¾ýÏ?oßþåo_–¿?ÿò†îH ù¿›ýó]L êNÉüO©øhûßíË×·ßn¿½ýüö³ùÿooXL7.™ˆ™á?¿üýíûYøÛLùåó˜ýßÜþÝ\ýõö‡ÿ2ýqág|}SZØümþ&˜(sÿËþø—·ÿüÝíïæÔÄ×þÿ;,˜fHízŽßü­xúßZf: ,Å cbž“›îøÇŸÞþl¸ùǸk†M &Q3WI&¶BÜ´a-dÆ3{µ6Nx/#BÉ1Œìá]o†“«œîa£FR±ê¿[ä¨é½™:#Ñ(ÍCÄäý{¬ò1VßOë1lþ+ˆùyÛ1t>@p$väÆn¹ëhWà©(1æPè£v30Y`tv/ Ð dé÷ô?5û—gìzÉñ1]]Õõæ9¢®Ÿ®ž´ë÷k}i/èw=¿ 3Ý®Ý=aŸW|ÄKküâüçÎ_®Üÿw%–ÿªÿn×eÀ¤FC§fã–¸$¸kšóé×·ïÂŒ*Ïÿúg3ŸNIÁüׯ&hã·ïl¬¥ÍÕoÿ‚ýé_o¿þõMß¹¦’ÏYÄü ѵ_Põ,ª÷üXýås•«þRå6ôõ÷©>ªöVµ_è|Ï¿8{„ Ò¯=Â?ô?ÁÊûê/ŸŽ|j"Ï{u3¹[aàÕ<§üý$qÊëk”E‹|5‚ï”Mo^í¼™ÌŠå]j¡Lc¨>˜Ý ¢˜ðLIˆ¸ .HÌ“vþ8êÌ'Šs”@ÒiÖáønâ«¿&w¥ÐMbû—ÄxŽr8»I;Õ,¨ÊLùò&ôcM”ÂŽ&TÌÅ]Í2LûåÙÛnàn¦¡ CùòžÄ¶¢1—ô=¾¼ýåíÓï’>ÁYŸà6ÕùêéŠÏ1³ïwÓS7̳¦ñ;% 'ÃŒ$Ð84k»Ïú–;”Õ6# (†NyG™×€Wò–×òækzgºjê)¹è4&Ø gUo1ãS{£= ƒ…`”Çꜙ…™©ÄPÈ¢VŽòÅÜ„å ­PÊÅbì AMjØ 'c(ö¦äa¦VÆó\NœBÁy¿tOÆ^ujš¦NÓ ­šÆO5!QÐ4›Î¥*0%x@ÓæV(eƒb1^ÓbMcˆfbh¦is+ž²á©˜+5a¯O³N£Ó¨ öMÖõ_F…¹ÆÈŒ Í>…€‰À,%ó) ŠÅŸÂKã°”̧p6<s©Oì•} ›­ÞÌ r‡'ùðCïË —áREcB³’Œa²Æ0ÁKÉüPäxdÆ81ÁÉÃ$c,%óCÒƒ1 OÅ\ꇔcP5E®ë|]ÃVî‘Õ_F’ç{\¹§þõT¦Ý˜sï]–îJާú=°ðÈÊDæYõG†©#€]òyâs§×Rf \Å絎·M+(µÍ:|Õ³p•%ÒÕ{Wæ‡úœ2à ÆQ$0_ßl’VÍ9ECØUaWÁ®º»ê»êvÕvÕEØUg°«.À®:À®:…]õ3À®ö wVøwDg+:?â¿;BghRDTŸ¤#Äë@];f¡v”·'G¾›=.G¢ˆÆ„¿î.ÁàØy wÍ %v?FZa)°ÃÒ„Š¹¸+äºkR(ÁàÆ’¡ œ•`L­hÌ%}kK08VÛf~yú’ÙÅÉqTÕvW|EÝÞGrõkL€ì¹è„ccSZçeNŽÍi ÇæâØ–çå¹JÙ XŒŸ—9-áØœ@ÛRà¼<·â)žŠ¹t^¦Çþ©ÂWõjH÷/(®-‹v„ ϰ´Ï†ÔdFM¡Ù’@o9/¡·œCôÖR2Kâ½ lP,&X+¡·œAôÖR2Kb½ lx*æRKâç–o=zê먫½E»Bs_“•šZ‹ È%„-%Sh4X$0 Z”`@. h)™B 6<s©BKÎÅð¥…ÿMUÈTþÃÝw»{éëÈ–LAö\@ƒ« Á4,%³åÀÅb‚u¨ Á4,%³åÀ†§b.µ¿…i$pªÞ+ ÆHÿaRe“Ò˜”î«4Tš Tª4VšY 4©¹JÙ XŒ7)J•fÁJ3K&5·â)žŠ¹Ò¤ràÁJiæÈJQ=’PÂc'#^ov® äŠxLØó ’nµ¤´ÕJ¸ÕÊR ÎgiBÅ\ÜUºÕJÒV+áV+K8ŸðȞ㒾ǵ8Ÿ bÛT?ª¨ƒ!ž z¬,ÚÁòÛ¡À£çÄ£Dń湕tB°:!D',%›[™G'‹ s+-¡‚BtÂR²¹•zt"°á©˜KçVæÐ ò¹–Ì­¨üHÑv}Öý°Â3­ÐM¥Ìc*Ç„f3äS1™WÉ ÄT,%3CìŽ'˜ŠÌ—0Á!¦b)™r©6<s©Š“÷¹e‹6#Øý‹ëϲ%ºiçÉ ;¤v |Ñc1¡ÙH€" YB‘„„(’¥dþ@z)°A±˜àd E¢H–’ùéQ¤À†§b.õjŠT7á•­c.êH_Ÿ8}aã~¡hCùAbB³wÑPÓE@Mg€š.j:j:Ô4ÔtPÓ ¦ €š€šN5ý€šv€žUÏžˆ3O~ûƒªfÓú]ÔŠjC³ÈŸþdÜn+†h7í«a„Œ çÕ[A©Z<³Ûnu@ ûŒZPÝW]$1¨.’¸T]$1¬.²è€æV(eƒb1ÞI\ª.’VY t@s+ž²á©˜+ÄbÛ}LºÇ{‰=—Nô.Ù˜÷TÔ]FvDÜܽ䘭;õ êÎý3–‘¦ÿõ_zmÄ9g==²Ö6à7»z¨ÜŒÒ’roºzfIK³¤`¶”ÌÕS06(\=)Ì’@€ÙR2WO<ÀØðTÌ¥®žúÍË#™,Üö›ûÓ,ô˼õ{9?$Kh;\äÅ+oíõƒ©Ž 'n±3‚RM~!¤ aw\Úæ}uÖ±»VØ¥?SÂ]«Â »õéê·¥ÀvK›×ÐwåP|w- +ìÒ8F ƒñl…}jEc.é{\»Â.ùHõe;üŸ{‘Ì'v$Ì#¹ü£w«<+‚6¯šK LÍAð¼%x^ Ï[JÔÏ6(‚Q‚祀ð¼¥dAðð|`ÃS1—5Òf}·õëä¥ô…æ1¡YI@Y¥*¡¬RA”ÕR2%Qe lP,&(‰*¡¬RA”ÕR2%Qe lx*æR%QNˆ|W¶ó=êPŒè¸}X96'›ê^6óî› WØgOO7>¶ÇëÜò<èk7Ryètþš#´z…tªP :UB§–½ÊÜ ¥lP,Æ{…ŠÐ©Î S]€Nµw# OÅ\éUò0Z½ÂòÜÝɦÔmJF½üª ͦ„4¥H šRBS–’™ñÐT`ƒb1Á”p šRBS–MinÅS6<s©)öaJ×›Ò!uõ¾o?ô¨Û¨‰‡LŠ ; ‚§* EùÍþùÇŸÞ>=Ü>lyödÌA  TÓÁ'†âëZ3T‡ÒqÔ&òÇ(ÌÙZx§qÂWtqÎ<äŽe8iì_`Á¤ÙA€Ñùúƈ. ×fä)4¤d RBC–’EžÒCC ŠÅ„ÈS– !%!4d)Yä)=4ØðTÌ¥‘§ôÐÐGäyuw@Y’¡hOÇ„3‹ö4P¥Ž#¹÷T·\>¹öœL0â¥u»LáÜú—T錫Ǽ¤…›®^C¼Nñ:áuº€×é€×é¯Ó¯Ó%¼N)ˆ×YJæêUðí:ÅëôSàuú¯û¦\½–ÀÕëÓ+(«×‡VPæŸTè8›oGáäÃ?˜pÕ)žv÷Šà0ë¯ogv¾«Jû³L–kŒ õPP«d)°ÊÒ„Š¹,WÈìîZê¡4’P’Y=ÔÔŠÆ\Ò÷¸¶JcâwÔCœL?PIôJAôÕÀTg]”Æás½8&´»š€c ŒY‚]Má1–ƒÝ¹JÙ XŒv5)c  <ÆÀR`°;·â)žŠ¹2ØÕÔ­°–I—ÓÉ17MòÖUgòô¦ÖPjê üŽ ÍŠÌ@Ÿf¥?Í`Ÿ¥dŠÌ|_`ƒb1A‘Y©ÀO3Xàg)™"3_àØðTÌ¥ŠÌtð•ë©aòû´1îuÔ4&4Û˜ ¸%\ ‚[JfcÂƒà ŠÅ%\ ‚[Jfcƒà OÅ\jcBmëàöi1U¥|š-<òÌtLhÖl0?­J˜ŸVó³”L³•Çü‹ š­J˜Ÿ–ó³”L³ePe•`~AÌ¥š­Ä¦rÌÁ1_Sxç¤< 'QLh¶ –æIó4¹*(Í›(À‚–V(eƒb1Á‚t©4OkXšg)™i_šØðTÌ…dÞm[Ðgš| Ò{° 3X>—$&4ZDX Â…T\"‚ ‘,_Z¡” ŠÅ8 2„B*n¨ŠÁY*¾´â)žŠ¹Ô‚HC*þ‘kœ` Äçó‚Ç„fk X-ä󆪠šÒ,Ÿ_Z¡” ŠÅk …|ÞPi&&Ëç—VŽ ÍÖÀ@®Y)×Ç æú–’Yó¹~`ƒb1ÁX)×7W™˜<ן[ñ” OÅ\j l;×?Æ> ° ó`é®1Oh6òw,Jù;0·”Ì<„Ïß‹ æ!Jù;æ0·”ÌìD„zö–âK,“R|‰U¡ßPA)þD¥øM¨˜Ër%“R|s](Å7T eȬnEc.é{\ZŠoÞ{û<ŽRüŽ]%O§Ûk›ª÷Òì(ësOk?êŒR3ðQ 1¡y"ÓQÐ%D ˆ(”# s+”²A±˜0‘é"¢ 3DA" ú‚Nþ¤à_siùöÞ ÞÝ~œOÏÞñ:“³‹³žî|Þ9uËPŒGbÂ~#Si1S¥b<¦`1ž¥dF¦\1žãâ®Òb<¦JÅxLÁbRzÄúA®ôÛ›‘¶¿}ýà­£çäLæÈ ?¬`síœþµ l!jDhõL›Vˆr+4ž€qW›E:àÑži%[jíH9öøýÓ9ÂEœ²ÄÜá*†vo[jû 1TEµ¶>q2ÑT€É¤ç\ªöŒÔZD¥Žå282Ð ='ï´×Ž]»N¤X~ëQªŽ‚€¯Z¯mn÷„‡,]V«0²hñ$+u;—Bެ‰8q¨¾oGuyí%Îô}˜ç7ÒOu­;–“ìH†¿5£ÙÔÚ*‚í ¾u$³™Õ (ݲ´PÂ2ÛýUÇž¡CÆ`¤>{eÖ„ý¸­tCS~ý³CGä”#éû.·Ó£™Þ,P:q>Q„Ã`º>3n[òÝ߃¼×•g nrÈGrÚТ]­ñPßÚ4|Hìzná4Üu^¾ìïXõêù¶ÝK  €ÓKCÃב[ÉGÃCNµ½pþ#Lãx´Ëí“¶!äöhqÈS×È‘Q®û‰Cò›:ûck4:‚Þ=Kc¯´bÔ±®u¯ˆ;²æ°ñãD÷®³ÿ»1KÑ?×´"Ó‘ˆoΛý[ÃNœ¤$†ÜÉ“Ô6’pHñ®]v‰Ê×üð¹Uý¹¥œ«Ö±Z’mŽ<d9©rjO-׃&Ö\ð¹›hÈÜœúO<¬àO•¯Böåw#‡¼d0 ˜0OŸ&0â°/·»CN­:dÍ÷Ø3èv„ܹŒ‰xÃÀ{Ò‘Ž«C}a|Gp÷­DrHŒò4!ÿ r¾-àõ°¤Õ9„QèøðfÄOÊAÚ™Sð1Ÿi)ˆ)o¤¬ ök 5ºûB‘m„}hå߃bß]s¹›]Ùmrõ«ÅŠL;òŽ>bíü 7 ãJx|òö³3“àSK¤œUŽ­P)>diþ¶ÔuäõÅÌöé«Ù…=PðòÛµ¥ãì öùcûìèsÊcÏÝ+¶æîrÖ;f÷ Û9•kg¬£Ø»¤®“Ï1n¿ç‚Åä/–¿¾|í:¥&:ÿæçUGµzëö7â†Ík”|œÆb®î¸QÄR“â.ÊÅøšÝ+(8‘wY†Mdá—Ù­Qz'º¸°Ïù]Ì# g—’U½GWï™$w‚hzèê§*·YscÊÕ¶‹Þð§Ú=‹¦–~Áµ÷Xô¾ïžeÄzÞ=Ýwhý7áX¦s%“¹<Ö¯+÷Ôõ ª½C£ñCU¯ë=ûcõ©ëÚ•iâS޶RHܱ]Ö.{éŪæ¿DÓ‹>ÐûÞ~~ûvñŠ endstream endobj 2933 0 obj 7415 endobj 2937 0 obj [137 /XYZ 40.7999999 785.299999 0] endobj 2938 0 obj [137 /XYZ 40.7999999 288.019999 0] endobj 2939 0 obj [137 /XYZ 40.7999999 785.299999 0] endobj 2940 0 obj [137 /XYZ 40.7999999 288.019999 0] endobj 2936 0 obj << /Type /Page /Parent 2 0 R /Contents 2941 0 R /Resources 2943 0 R /Annots 2944 0 R /MediaBox [0 0 595 842] >> endobj 2943 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 2944 0 obj [ ] endobj 2941 0 obj << /Length 2942 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès·EŠzA€±ÇCÃrr¼Ù‹xgùûQ·Ô=c²?’U,RRlÀ3n¶(²X¬÷ãí?ÿýðÏßoßþÏáëüóýç‡êXµÕôçpúûæåº?Özúµë›£N_¿=|?|øôðiü÷ûƒjÏÎ?ÆÁË+¦ ûúëÃÛéåÓ'Ÿßÿyüí}øÓø¿_ýÛøã§y¾Ó¾=ôC{úåßÓ/J+ÝÿyùÛið_ùÝá×q ýyÞÓ¿oTÛª¦n“Öñýú¨:ÿ}ù(zÙ¬ªk}PJëlFpü÷?³]—qŒR]kº*zÖNŸ¦ísºöÐtΜÎÖâfR© ª’™è´"•´3U™Î;îC«Î›ìܳ¤‚kž)\}5þGæÛ,Rvv;œ‰ ÷^™ ¹t› øëTÉ€7U#3ÑiE*mk3ä=S±AošVå¯3%¬©…îÎiE"(gbýéµÜ/3%ƒ«I©ÌŽ+’;œ‰ ÷^OÈ¥«!u›—©Rá5TzüiE*mkÈ;S}»ô³ØõÝóà»/o?ö5¾ü<.ã,§N?¾|{ÐíáÍȆºqm_~:ü¾ªÔã_~yŽÍ³`©ºóˆ9vMÞgøŒ9(}l;ÕÃ×ýͦõôLulZÝüðžç‘þhôy²˜Tïá3pªB+¨¸6W ¦Ùºc=Tç=Ôç‘Q;i›G‚«þðeDã4¤NzÏ ¤9ó)M{9ªùxÕ±1íÇ;£Qÿüž÷Z u×Ü8!óüAk=«ÛµîÕÐpž53"˜é-/Ð*aEJ]ÐØØ_µ×ZõçÚã|ØUÄÒÜ]4è«x%32õž¥}€`„KSH<ã÷ç®/ÍA†Öªƒï…‹÷(>¿øSrac?«áÍ ÀgáÀÓ0>G zgÃ5œÄ>%å á¶™øg —šWJã³wvDÏdl¤|9yÈP[L„€U(U/çÈ¢§L Çñ ȃ¼Œ ;¨â¡9ìzr<Åt‰€¤˜à' à<£?&Pêxbà0IϬx­˜GáÙ¤ZR*pÑ…ÃFñ-Ãò‚$J{îT<\×ÌŠAÔ¥&°^ˆê}S³s•¡mm®2XìÝŠpã0k‚Çî¡BUà{dé¯C}L}û¨LÌv?+ €¶&,áKH¼\&ô4†Ê1pÔð´ñ3å¾R–ÚG¼ƒß,J´ ;ŒÖ˜<̦$Õ\û<ò¯Â;È) ’œM¦eL x‡‡b&ÏÏÕ-© K›Tü–Ô”Mÿv3‚ç5ñ 1 ì•U•÷(^/p¸"kÑ¡’PYöM2O,¶þ—º#KiXíÂÆqX»6Pã ,+v PL’…ljÞÄšúók¤} ÷†ŒØÈP3±ÃÅ1o9ût̳!!1ã©Æ>1YQuNZ¬¿W5<ÁÔKËá {y8NiË6 Yc¿ä]æq™É.ê_â(›ñÌÅUÊ<â «Ä%Ÿ…Æâ@}qrÔÓ†cçäÍ$ ŽÿV&š£PèB„`Œ=2¾…£I3ñ͵9„%£1hItåÂ9 „>ÄJl>¬2¾®¥î,d&y7T^¼D yÓ·0D\rò…n°+U’pY_Š¥,Á¦¿|ª­D “$Á†FÈÓ]M|uØcg:H2•ñZkÇâÉ ó“PmKªDÃpÍUƒ¢=V.<ü#| ã¦B#φŽr•%ƒÕ(øƒW Q¬z± ŠU¼Ž(8|†£æbÜ™%#¬9û ª’4•uñ‘™‘ *{ƒ=F x œûãÁx·=#ã1†0h¢¯›b\¢¯T½S”Mð©Þg!ŸÖËÛ–—W4¾é;—¦ƒ…hôF9X.á7p÷U{ñ­`wJ\*«n §¦V¼ `S¦®,¡b»M)Õ6¥<Ý„ÈÏ`´ŽLFŽ ‡qÂdj–vÌ,™¼gLmÑòÕx-6in ‡5š¾Vë%©¡H›¼:i« K³¨ïYÛØ÷,lÏ#U±"ÛR8jBŽ]¨ªrÖô0ƾ—¯Dn£„,”öÀ--ÏPÂ2ËÔ’%bcµ hÞýµßÁ.­Ý…´V*3¡?µÍûAèIÌÅÁàe åQèàKnI8ЍÝ+Á©«äD ˜rJ±åA~‘ü• áÞZ¤íÒY99Fï°Œ»I éU·û·ûEó!ã”èÁÅ^ì=mfÇÄÔ´6 kŒU5<9áhÅ{;Œñøþ`?:#Ëe ¦DEðA×㉮(• ·âYLÒ0^E.á/ŒZ©+Ò°K˜þCèhÌí± B´(&Õ)PÜ9•OÒãìg%ôÅ ;V¤aÅŠé‹pÞBI¼¼–Yæ{Ø™¥@¨_5¢š—'?ˆ!¿xòàÚXC¿2øžaügDqãxtfåªöâ¸q4ãkx¥¸0#2_X …§í¹%ø=œ˜pLÅ‹x¤$g©«6¸ïyDb= =µÏÙá{e3œ7qÞ`‹ï ë°=ËY8KK,8“ ?ÃàgžUã»…©"–i!HË1hHËu‰ÌË}ÔMФ·béÛCW÷2`¼2`¥,|Š}EÜ cboFNõ¼Œ=XnÃ:<¦Ò¯07¥ž¯‡WzôL­0…Y¿+à¯+ÆÞ•ðäöËPŒ'/®ë¬Y’Ø®¯¾6詟¤ÞH5õE¡ª/×ÌÉw‘ìNÉJ:Ilä4õ¸¯Rÿ™kvs;üœ`ñ »¯n>w ZºO»'0=Çe³`V•£VÕ×^;y¿ž›Qj§8_ÁCqÔ™,g)Äw—§¯ã¦Ô‹¶ïíã­ºëF¯pü)ØqÄ©BKX=¡–'†Šá€_SËÕ:hŇ‚x¶®ŸËˆ}ÈUE _À“cpÌTž8‘ZÏwvJ™€T$+'[iµÅWXUŸ1ù —²oT'ò#Aa+Œ7S2Ä4û½”ʰë+ŠÎˆµ[ªŽ>…8‘‘+–'h8X¤D¶íH¡]2¹ËÙ¡wˆ=¡‰GøÅ@ާJ{L£W ~oD}‰Æýà་üju÷\-!E>‰o(A¡• êËÔvæIh F:'{Ý8 ΈD‘wÙBx™Œ2(Xv.¥ûÚ¾“˜@„ !ÃtâTBCȤfXñùœ2‘F aÚ§ów(Ü~‘¥¿K‹¡@éÛÁ ‚"]AĈ°=Ž!ÁN·Ôš@E]™ (Ez\²³Î´ K½ÁõFÙO¦Œ×7fï)énFØGœŠcåY̵İKx(6ÁN"üäF2‹T ´0 Äe±ZûýA 7åÕ™Ö˜kÁ±«s»šþ\›NËíxëµí.[­[¶Úfm«UË}«­†öš³þzd+x޲ôûuI]CRûf‡ÆENoÒózä¾R¥ÊÖ,+®¼yàP]#jK5^ªÖÚè-8!î–ãèãdÇ/É—ˆ3çD Év_‰Á*˜ÃiÇ Rÿá„[é¼{²Y¼ž<N´…dµJú0' *œïôºhLèAA"é~8䊜 Á‹#ÈÄ9ˆTW!v²‘õ úZ"YFÊãÃsî"¼òîQ‹æP0¨_J$K¦&FKÉ6ybÔ9ÉÜé kYâ©ÌÓ à¦¶R!ìÅ3Ɇ΂—@i³ÖVé,Þ”'dC–¶-^´‰À*¢¬½4tŽO„cP€æ v×#)_“S¿·+.“ÙkÖ,%İ‚ŠSYù8`=޸蛷4k^³˜®UW´ËMñrSî8ÔW+Ô¤täÍĬãµyK8OcÅqá¸hÎê'SE‚Ü%£N¸h2Uª-¥¬Ãö–ÇZµ8»ÉÄTDr8û“ðàp”=‚¹¬YôM) ‡ׂeœ~eª·¯Ýr¥TgƒŸ •ˆf€²²ª™Ÿ‹KIÂ鬯vTÙò«¼‘€ä›¬ºr•¼3”åä’Ns‰%‹a8YL»l':¡RxJž-|M}‰t¬”…‘xd}±Y”³…l±à°”Z9÷Îð¶-á‹ùך÷2¯N€È¯p*uI»5‚È{xÈ„(®kØ¥£“9“8<èõqú"oç _y<›+Ûdé–'"{PJ¤$4gz‚·;¾¤ÝŒ±t0FNfÕ÷·ò BPîv¡À‰Ç—°í箉¹c~Ì_‘:Èj7G –rɯØHèy¹´/sctÔ z°Á®ãG, AÇ/à hºõµ\Ѧ9ÌRHY‰5ø=y;²r[JûM±Ýõæ$ ÔêÍHHjÕZ”Ä¥ ñù(†m‚»#%ÈkƒÅY/œæys}¹ÕIç0rKè^–䬡¥ vM°å- µ<~Õ­ ì8"LÅéÓæ_¿yÎÆ=ÔêùP?yÕûhúö ÆmÜÒ¨GqfJá?ÔÕ%Ck®wÖ¶Çö¶›u0GœQÖݱ»mlïnŒL€®ë£nvhšc;}kn½§‡Ï ð™IéôQWçŠÚÏ#ïàlN¿üä ~wûoìð#zf¶ÜQhó]¡=3ŸeïóÚÎ ëN¿ëFY}QMç¾ÏÐñÀó Æˆ½¬Óx‚x!û®c—ƒ‰«<í¾¯Ú£:©ó7ýÖÆàõW/)° õ=|zø?Fê³9 endstream endobj 2942 0 obj 5085 endobj 2946 0 obj [138 /XYZ 40.7999999 397.459999 0] endobj 2947 0 obj [138 /XYZ 40.7999999 397.459999 0] endobj 2945 0 obj << /Type /Page /Parent 2 0 R /Contents 2948 0 R /Resources 2950 0 R /Annots 2951 0 R /MediaBox [0 0 595 842] >> endobj 2950 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2951 0 obj [ ] endobj 2948 0 obj << /Length 2949 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWô9À¶I6Ùì‚k ‡CCàÍ&XÄ‹Lö¿Ÿ–º%I}|¢dÙ€g,ªÙÅb=Éz¼ûãç¿wÿü­{÷áóº/ÛÏŸw¬g#[ÿtû¿?¼ý@Lý Ö_õ¤z1ïÿt_¾î^»×Ýóîyù÷uÇÇÃÛeðøŠuÂß¾üº{·¾|·~òùß—ßþ׉îOËÿ~éþú·åÇOÛ|û/|ÝMó¸ÿåßë/\p1-ÿyûÛ~ð_»¿ü®ûua:Ì»ÿ÷>êae¯§GùáïÛGÑËd±Y°©ã\,pªÿýÇîçe¶ý,9×£Ô,xV-ÓJÑÍzì”¶æ´–6Ožhž2M´@Ä“VÆ™ÔΙÈxä¼â}b©ËŒL篎æ¨Åj˜¸Požer}M/‡Ã¤.ÄáÝ/‚å[i¼Ã¯r¾.X_x™ÍI4 NoßÇšž›Ë±Ž5Ç‚á*Ä“ù¾ðcÐìU@ `Z³×±xC1$Óp¤4áDpWľ eËqì –¿7A²`ü=+FˆsñÉ'­83¿aÍñ#›„…{wéãË¢C i¥ •àXÞ:L–T5?pðž)0,Á˜" 0ÉØûoI.È,y×i1´õ¾¢¬a©.?æ¢s.‡ ºÞ(}ù¹Á³’âÜ+‹j'4²áìÒ3>ó#F†¾§Òz>°S j¸ ^Ï\\þ®ù æx‹¼º¤¦è¶»»Œ{,²¹H„¸·ž5?°Å~¸Ò   ¼ó& –—æð€N‹ƒðú ^m+ñ¡‚³©àa:›’Å‹kþ ŠëŽp8|+g’ú A6¸4-ƒædzU2P»}âÀ(ØÄÁæ3g2Åûãä,ÿàÝÆF'†zx_OFKƽð\ߨϻ[B•w0/üë¾7Ì‚ª˜æ[À<įCƒ@Ô Xë`¨«î–švë¡ë–ß°õ@XO#ÒSëU4DHöy|PEU4¬u2SlEºTƒ,cq@Œ8¼ è·«¬½Äö!Árħ6’íJðÛ%æ3LÿøzŸ`*Ç;G\x„UºüÂPSÎ;öÛkYF CíÐÜX†P¤E³@Øœ…߃ys0–|p6I©ª´ð®Û±Ê±Uá°¹0•ül‡´ÃëÁ4†açŸz ¾‡tŸ÷ s \)ÆNæ H£$›XeãM%Q„À‘7g?Ÿá™ïäØ éȦHI#X²cŸK¨øÅVÖýjl½cù‚©K_¬û1®ñ3 Ù5æG,á°— é@Bm‚é@@;Xd Ø à31&ðŒÌ©×®Øg;<슇]q¿vö•Z·+ÆS,Nëv…f…¬‡Jv…#þæaW|Gv¦ƒ6ì ÍSì÷šv…V)·:-ßh8´FË µ¢q®n‹ÎF+žäéù&,nÈ3nÂ÷a‹ßÝ);Öý¼a-ŠílI4n¿OüVì÷i¨m¿;¬tÌÝ8C€c0°¼ÌjS~?„CÊcˈ —ð:¦Þ6<•IÞŠ§2MÕ=•«ëî–ý«Û›Ù1}}xÊõVOrò¬æoÏ¥lOoîlíÂ0Žda+W×J¢…i™›:u)ÉQ_ÄQŒ'Œúw#ÏQPÃ[Ê‘>B-YrhÍ]‹È~§d+ÛÓס_ÿ®9(,œù6«&¢Š¯C"~JÙ2¼å Í¿¤¥)Á#0†×è-XP†}o©v„¿šÕŸL*&QIc8ä®~€ÍO6 1SŽÓ:.¹AÙjzå¥ÓÍ‘R7XúVai$R•¾ ®W-œ\³ Ü̸¡2jéòˆòžVYšð÷FØJþº<)*2sÈò!VpO™—ù“ÕÖr *Â̹3eÑh„ Â5GsˆÄ<Ö:Fl‚TÈ^½mÅÃÀMùp_vüéÄPjü¶*m™ƒ­,“ªÑRLÄ” kµ™ÒïäÈ9$XL¡Ûpû-†`ý†Õ-¾AÎÙNÙ/0 ÉB¸üAQ’9êß#Ð *½Õ©>+/†×ÍÏrŒßàñdDÅl8½-Q(õó &$?·Ô9O¯tÀjƒˆ‹ŽBkËQ5?oû”þ¾>…"L&ë°p,-õŽžõ¬¼ I1‰ìºú[Iéô·ˆoý{>˜sC®ÞmÞ§8ƽÚ“ÄY?jÚ®ƒp¡bc¢Õº°†.rUsJ~ vb¸¸õ‡ÄˆÏkØ2ã†à)å<-¨Š”ž‚m„€ Ø,ÜI­r9ï í¶)²ºöñ—ãb½„û–˜9üšðíK¹ðqtZº?Ç• ÉÙÉ¡ Æ#n­Ë* ž-‰eêø|IÈŠq‘±|}|å)Ÿ­ÎÀÀv¤­2Áu©¥Bj«á‚FœÆ`G(Á;¶›&b龬€b í£ˆsï,Gºß½Š8Úu¨ü¦nébiÒÒÐŽ5FôO!@Ÿ*ulÝ-è¹JÇ×yx#áÆ0¯Ï’!6¾‚<Í~ÄB“.R1á‡ûX)~’CዱвćP”lz$GˆäŒ0ùHa•ìãâšL¨ÙàÁ íˆèVÿ‰HDl!Án¡Ü¡ä nëì§™Ù¬‹˜T.Љšã~±^¿k¾ø*þ]”Êz¡²®äB©xä¨(â׃«K9ÞC© MèôFÂëAÁÙ#¸êv®\ñÎÏMãéZƒPù§éºŽ¸V¡6½·SÙ]‚1c»ö•ˆ+KXB̨-ôà^à™d&æV\£Ò‡"Ï¡4uèü\«Æ©[3~¡^m •‚›öy¾zbþ·ŠAËàQÕ«…#¤§ãµú{;¬ ¨S(]`–¶hð{õx7¾-­‡fs#›ÕCÃd€ê ‚Þ¯)W„V•ù¦H•û²´É•0‘Õ*mò‰ :lL¾Êå…eŸoßBNáøÆ} Ú§nµdCzP`sؤ6Üyн‚äÇc­Bè9ÐôJñÎ]WF RšLÓªŒô`€êÐ΄“‡© ×<—‹Ã©øxL˜ˆ‘ºõÁh5?¬ œJWmW}©wç±µ«9"È#®»Š¤p•)ÓÚN͘kÞEKÅ ‘MÉ;²î.#B9²TW½šFðß#§4pϲóñ‚“’)nHáÎŒˆu*SÎN̶B1(QYBùÚ¯¡î¯ìS[GGlpº½Y4"WëŽ Y!šÚÆ ”üZ,¯²ÖÂÌ*¦ò„Iû‚„+x•ãX”ÌîLH3Éê¢Qê!%„W[Z°`QFgè„E·•BoðÙ—ã™lÁð†aÒ>ÙYˆY™›r­"à1åû²}û­ý¤¦þ0û,Ö[DFO„Õ†ãü)Y}yËü)wõ(~Sa_Å4vm‰9?åm¯Žþ]ú,Å€±^´Hód*¿ï7¿àÊ"ý“9„½ßú,ÙݨzEHJj¤xª#% ×5S[¤0 º„¤¶8ß“5µ…ãkvB3dìË=X¼<3œB® ,í'°œ·«Ù@œcËÔ6X¤šür©áX¦ZRŒ!ÀÜ!x‡é0tŠ=õ—©™#gã  ’k‰˜ RÅ•w'›9çK¨•ÞƒŸ¡¼kvllÞš<¨Îev1F°u‚mc¼n‚Œ£$c9(–â9FÚ° ”ì‚{“<·)HVÁ£Å>hórLË~ xuáyu]—UvUMÉ{ƒ¬V½¾cJÞTRJ^v÷(æÊ´‰å %©.mžÅé´¥ !ëvSk…O>¶ŒÎ7(¹Ù4ÉñbX+e:«ÝëÐáU¸cäqý‡‡¼áòð> âð £a]› Gm¢Ó¤Ÿk'^2“ ôS‰~$·X— ·H ÕL|‹QRFLáûá< M<®ÕΤåPê2M<( „¤™˜äµ{*]]?kÇ¢-eEÆéœ¥…“D >Ž‹ô±PÑ$ÔÁTYb¦²jИ?(µRëkE´D^{#•åú ѯs‡É牊Y³tÿÌ‘p_ºˆÅµ-‹,yä¶²$¥:xeMý+Û #¢ù9ɲ—gåµÊ̸©UŠ/¤,Ì®Vðì-µË’ýêŒ2JcB e¯¦©àX ¸Ý¤Óˆlÿ” F«ú»”þ°udUG¨Ï#øààܾ×PÞÛýâ…gðHRËîfJvnìS©SÌ]4¬UûF ÜPÿÁ”2TvY¯ð4ž,z{ \~}OòÑR Ï´Ó™°P°™®‚e:6–Ñ&v-%ŠÌ ˜”’Q·6ÌgQÛ§h¿Å p%ðâ-u²ŒiÃqÁO\“·!¦ºüZ+å<À¡üó:¥ê+|ß6è2fùÛ½.Âd‘û/l?¾|uH[,±³Xzv &ç£^‰6_–q)DaæãzfÜ ìTzÕoãØ—ú,{ ˜…îõeÏX_Y7vz1_´•êÇuÌݺôž >3ÃgÖ Õ¢ìp@yyg[ èí'Oð»›6¼°ÂOè™Í¿4ÂÑ:6F{fÛ±˜µo° êö¿ ʼnQ›ç#µý>OŽg0@ê%íÆ¤kŒÙjL]%6¹ÛÓÄÆžïËM_ÜöK ƒìÿ¶ÞÖsNéÛ=ïþ禬¯ endstream endobj 2949 0 obj 3942 endobj 2953 0 obj [139 /XYZ 40.7999999 448.339999 0] endobj 2954 0 obj [139 /XYZ 40.7999999 120.980000 0] endobj 2955 0 obj [139 /XYZ 40.7999999 448.339999 0] endobj 2956 0 obj [139 /XYZ 40.7999999 120.980000 0] endobj 2952 0 obj << /Type /Page /Parent 2 0 R /Contents 2957 0 R /Resources 2959 0 R /Annots 2960 0 R /MediaBox [0 0 595 842] >> endobj 2959 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2960 0 obj [ ] endobj 2957 0 obj << /Length 2958 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âK`ytÈ!@cÈ!È!˜ÝM°È,ÒÙCþ~d‹²»I}¤X|Xv{˜î1-ªX,VëùáO_ÿ±ÿçïûŸ¿þgÿÍüüüu×6m×Nö‡¿?¼þ€àÓ¯ý ®öß¾ï^ö/»§ÝÓøïËŽuÇÍqp~Å4áïß~Û}˜^¾›>ùúù/ãoÿÛóýŸÇÿýºÿÛßÇ?™ù_ø¾twøåßÓ/Œ3>ŒÿyýÛað_»¿þaÿÛÂpœ÷ðï¬T¯y/§GÙñïëGÑËFd±¶çrÏáT#:þûóî—q¶–ŒõìÛÕ³öü0íÀØ^÷Ý^HîLê¬mÝT,q"ÆÏ2Ñ"–¶4ÖÊÞ?õã^Ši™*õç©R'Jæ™èK[šA½g*2êÓÇeöîIŠ\çXßp($ö™Ñ 6`ä*ÖL‹Ò²Å?¢ƒ¢…ƒˆ¥‘žð̧Ò)”¶ðQþ3‹íÅŒÎ|3`Ó•‡7IßsöðQÃÏ8Ó÷¼&x (Ü# zþe=ÖÆ-髸J "…½¾: ®­NPÞ‡þª³ÜCšÃ@ÇË$Ï–;ûßC§XÔÂCFBœ«|¾¤È¤-3X'…z=ïì3EzÙ¬ÓZ„ ‰O ^ßz ·sJ<÷Œ-üž`áë쨭y“dQÄ-ÁÙ²bÒh’a( Í Û.ß­B$Ö*°)×ÃwáôaEÁ—á››ƒ LÑÁÉðªV\ö&…ž±FÉîpð×l#Eq¢‚"I«ÞI1|qÃZ Ãë(j…siàÅUs«Ô,Œc‡gbÚêþC®y̽:.jræ`y,Ù$*Ù1Ú/pä!þ=Ž´Â6ÀÙ$|FfÛ-%CÖ½óvaP=F7n1FV‹7¾‡dªÂÏÀlp# {ZÁïDÆY¶²Ç[Œ²Ã"¸p‘Í.·‚ßt"áGqLrx6HôøÙÆóBak1ÏýDà…x=´%&zÈ`$† Žp8"°<€ØÁÌs}L;yà9ø;p°tºâÙxÂÙô`bÄÓûHáÒ¿‡o`ƒ€·šÜW·,a‡)#~ɰʹÞG<aó記ÇÂÙð3žõPx–@bóîÇg¯ïå>€¹æBXõÌJ‰™Ÿp¥ž3‡•_Œ7 5œÍ#éàÎypéš §aŸNX³®rvœo?">î.u•\’a›†€`q«Ic#•]õžœŠGáÄ‚ÀUïœØ Š¡Æ©§êCn{$/'&í%õâ˜ÆFVŒn„ëS€L½h&Øœ^¹õh!Xeš¥„zº°Õ ™è™à»½ánoðØ¤´†’¸;N÷ª6ƃz»Û¤r±…‹åñxÜ:ar–ª})µ_)~‚Í„O¸.>Ûé,9ayØùZ:p9x¨Ã»ÞvVç)®áÁŒ@ >ÂÕ—âxž”jÖ6]ÏÞÖè+$!¤ÅÓßï÷²Üwê­ï· º¯ðÅ B»±MœÈ$±ž ÆÔä^×K‰Ö+RÞÞ>‚ À‘PÎ7Ö—’ÈÕѦ# k¤”w4š„#\Pv }oß²”1ÎÚÕŸÚˆøã¼= R4i‡µ9Ì ^ÏW#ºìmžµ²³(,è`/Hï¬í”ŽÌgÃh0×nÙÊ Dñâ¾S—šWÀ$Ýw÷’ˆ])¦v½8Ì×Àg$ ½5y®Zz²¿µÓŸ30p¤YF¯2Èë³}ÂÖFãÙ[jÈâ˜qï¼Í9R+ïI)IWÕ;/¢-‘ƒh,;DoÞË"AýŠ0;F¬scð´'˜Y1IioN.ÚþIØ2Ä"«‘;‹(Ë$)¾Ôh2¯p/Ô:Hœ0 ±®]Óa2•Uºœ=¾•÷+ëÍÅ”šFï饾 NJ ž§¢5%°•P5Ýó %ÀŽ(ž5¸·HðsÖ³û9+tÎ<).—J…‘¸êŸ'èœ2Bà”àj©'„Úã¤Ä)Jê ¥‡ÇURoÞ´ÊMÓ[ÖT§ „¢w\½}åÒõy}Óùë~„áÚ¹dDÜ(vêÁOY\ L_¨r“cÅrYÃr\ó#¶bET]Ö`î’±‚¥3…z›ƒ`e– JzFpS¶J´˜m*kÕ|<¦hÐù. RBðóær”©£v7æDLsÉìz>—÷K&Iµ¯¥nÖ¬ÛÔé!O­ÊS!›ÔàФŃ|¥!ÔAÈL}7%¾Ÿ&¡Û¨Fѳ>å¤o¼–D®”W±ÖF¯VhÁ·&m •2(U~Þ—vå•äÆ=˜Ê í¨Iòñ.m}´Œ¡®Õä|ëòñT­éåãpª US>ª ‡òÔ0-aYÊ¥×b;ð{(Ž@<vÙàvÝ”d7ÆW¯S»ó”£P…Þ*¹pqõÍë½É Ý _]Ûû–õ÷w@—r‡ÊµR«dtk.¶Fÿ%ã´kÑ1Žù¬–)iŒ”^{1.!ùõw"öV0{™m5Zw[<؃·2D:IáE ÜÜHŠTDµJ¢^•Tꂤ)ºÎ"Í{žóŠvi—>F—J.v³[#ªµòíÊœtR=¤¬%Éœodaá$^†*SªN¬É+¦dG›ÐU‘ƒŽŽR+™™[²Zk+ò1Œ¯àp*D0L©Ca‰5‚î’¥ƒiLMBT-å<%ºÊ¡hR˜‹p¿øÕò‘çZò066óÚI t’a‰î ¢˜‚JÖóÂÞÊ”2Ò„ŠqNeá Œƒ¢÷`©â’Y«ÎWÉ/ÄVú9¸ÉÓ[!‚ž OuySPKó¨%e‹”„럕‘À•m©V»A ÆÃ“Q"÷³„ pñUQJ¥0ݦ-2§µª$'—Êfå×—oÁŠ›XÖ ¯Ê;G¢ó[ø2Ðr›L+…€à^džgŠ+`]§-|„nÒœžf°+ 'ÙÏ!qm§AÈŠ”r¤%l‰,.>ׯ¤qq¾…¬‘#YÒûj³ŸBx{îè¸}®³É  -øÔªÿÀÛsë‘,V¸p‚;ƒß Pó´ç|“7uï×­ u èIë5›ð½Ã | ^,=Eo·«ï^ ˜wÊ>8t~UÒ§¥ çm^jËÄ ¸ë²-»Ï*×xÒÇ S[èùÂá aÏ›?íÈéTãyì¼ã鯣à3¸Wžíλõx &@ÀÍlnÿ#OÇ"¸?x·o´cÑB§'É*Ý@XwòŒFô‘Ò‰h„ŠkQ"o·Öì&}ô4b*›-M‚Ÿ™ÈQm«á‘°x¡;噋ÅógÑ&³”/¾²”¬A)‹«{"íE/‰²Øõ`’rR oWò†õ‹ÖEI¡„y8ȉÜ…¹€„«p0“ÄØpÀµu0’ò€Ñ®ÒtE—Ô¢«%Q˜,!4_%c‰ÎÙ\Ã=ãa_B˜ÃúCuÁýl kbFÝyä1$ýÜÙ Í,탶è7„àj« _}€#”˜Žà÷<ž÷}ü»7xÜ¿ÃÌoß=;î’J{&•'/±x SY·gã2–Ð5ë&Ö^´3­™(…®kºes›–Ã&tò¾é—ó ú…‘I’ Ñp½è3Tªé&²³u…¥÷ ð Ÿ™.$=o!EoÈþœm:o¯?ù¿ksa…èC~K# ­Ãœ•¸g̎ŬÝÀv< Twø+»¯ìÝ÷Éx:ð<ƒéR/i7¾@ºÆ˜}€Pcêr(q“»= mװõ~qÛ—^Œÿ«7O9¹ïþi÷%¤¨R endstream endobj 2958 0 obj 4001 endobj 2962 0 obj [140 /XYZ 40.7999999 264.980000 0] endobj 2963 0 obj [140 /XYZ 40.7999999 264.980000 0] endobj 2964 0 obj << /Type /Annot /Subtype /Link /Rect [285.599999 168.019999 357.599999 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2961 0 obj << /Type /Page /Parent 2 0 R /Contents 2965 0 R /Resources 2967 0 R /Annots 2968 0 R /MediaBox [0 0 595 842] >> endobj 2967 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1549 1549 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2968 0 obj [ 2964 0 R ] endobj 2965 0 obj << /Length 2966 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WÔ:€kÄ—HA·ÝEò²<™ ãAœYä÷#•¤ªâãPâ©*wËLwëqI^R‡÷ÍþüéŸÇÿ~üáݧÿ¿Œ?ß}:4§¦m†Çþ¿7·¸9 >üª:qÛÿ;~ùzøvüvøxøØýÿÛµçÇÝÍ©‰àï_~;ü04~®|z÷×î·ÿùñ/Ý_¿ÿþîÇ#½þ¯cÛþ—_‡_gÜtÜþÖßüùð·?ëº`Îtûÿ¿a­Õ–¯ëÇ·Ë«ìüßí«¨±ŽYŒsÙu‘u˜êØñß~ê¨]ºq²’1ÝJÝ,¦ªù™¬G«Û£”Í`hË(±Õ„´.D¨ë[52ÖH¤Dæ{ÿF?H¥×Žr¢´š]Š·e ÜX3²‰ï™ïÝ+…ø>QZÍ.݈2„ú•á;¤Dæ»6¦ß'J«Ùed!Àê{T†ï™ïv\¥V­¥-´ÞE#Y¾Ûó*]3²‰ï•ï‚`ºšïJ«ùÎy™âÜ£"|Ç”È|Yg.”V³K*U†Pߣ"8ƒ)‘ù®t)¾O”V³«…øÞ÷¨ ß!¥“‘‚ Í•ìç ç¿2†w¿k1þ˸i ÍÅDi5 µä…&Õ´…æÂ§ô±ˆ²Ç¯ÊÞ·Ä‹OŸ?|`R˜^·ýüSבæÜèùÇçn°êø¦×;ºõðùÇã;-Ùþéøù—ƒ=)+´4êá3èNÃá;Þy‚Ôw„8ßyþÜqw%¯”´€WLqŸYOÃAà;Š0ð&ŸžHÖÂ;‡“—Ró–Ð뢕Â:Î\¬ã<†u\ú8Ô] °®J:Täm¬ãM ëú+nÝ•ë®è6Q±n`]§¦ïXWëª|yʃÎcª˜È{ŸÈr˜ æ$è$€O‰¤ì" ¿;eY`^”øT^Óv²:Qœ©¡SMMŠ'(~˜áBleŒÆ«“±MëíÝœ ¾3F,_'UàÍý -üZ`×ð@Ã08¾ 'pXìÞ½gÞÁí|(µšQøcÆ‚j„‹á” üº!Ö¬‘^W7N‡ÈŠÉ/›ÞÁq0ùs>µÄDBpÌyÿögF`À, 8ÎK`ðl'‘Ë€{€g® ’ ”âŽ&£”ˆh2*pTªÁQéè"秤CEÞ¶1i2J±ˆ&£”ïpí¯øšÌù)ëP±nõ5¥ô$hˆæHŠXzÞÆDK’qèK†Þ0Ûµv“îù{Ê&¥—5‹árà¹TƒçÒEÖþ)éP‘·m\p¹µ1\n}l%Àåþ)ëP±nàr'Ý:‚?kN­f Íç¯ÚvûÑ뵕Ýów4_ŠæÆ¸hnl ÍG¥•.÷OI‡Š¼mã‚æFÇÐÜø×þJ€æýSÖ¡bÝ66@s;)þ$4ßëñ«RÖØò8¾Ñ¨ ò‡{m€O~¥Ä¾<á /:R”Ïš¼5ÿ þìc)Ïo—¤×uÖYR[ùj^Ó.¼nÇ™q³´|²ëˆ÷hÇþŠo §;*ƪ/1³ôÕ`—ÂhÅ]âËØ=$K=$í5ÒöÑ=$×®î’ÝCBåÁKóàvðzKŒŽ'ñýÀ9ݤàšTÖƒŽK}á’bï KÐøs‚=HPÃw}#ƒ#ì ijð(|«»£µ£ê]²x@5wÓæµˆ¥Íká§Í÷W|ÛÌù)éP‘·mL¶Ícióšûióýß6s~Ê:T¬ÛF}ÛŒ—´y 5êÇÏóõY¬²ïbaúX¦\ß ÉCî‰`X£T¨Ýmäs†z{‘ $‰T)<³x|e /køˆÙöäs¸ˆý#£¶e_4•ì&ŒB& Ý—O±á ËÀ’0Œh‘yS%Ä…âðSl7ˆàÎã¾â(Z[j ç†3‚ª×HfPøMˆ„ð¿)µJ63^„‰FA˜ ÂD¢ Ì% Â8QÆ‹‚0Ñ(DA˜H„¹DA' Âla®QP6K˜Ï qG¡ ˆb[çȬì{{ðh´Ü«¸NH©á+¢K7!}=î4ha¦2Oö"¿dt÷¢"L4*ÂQ&a.QƉŠ0^T„‰FE˜ *ÂD¢"Ì%*Â8Qfè³**"§vgIE{ÇÔS(ˆ{ qd«jŒöêôúÍÔÔñ+pÊÝ0¹LL#¸j_  ûÒw2óP"{u`<¯Øß…ýž "ÁÃ+çùà;‰vŠ}h æÄÚÙþŒwêÚ¬ôúsÿ³˜$^#x-B „,ÇÅDÆ(“]Ù(¶ûÀE·O­Bm)'™hZ§fj÷w¤fªh´—Âw¾â‰êÃSÒ¡"oÛEõîïHÍÔîªòÛhƒš©ÃSÖ¡bÝ6ª‹êÝ8¹; »!&ϳüäDîNFb Öüi%R Ñ”8wxG¼…ÅÔ0spA@œ'DúæDç—ˆÁ§Hü¢F:‚£Ž¢öx-iJ«x‡ÔÖƒñ]‘L(’‚5S}¯Ñ8Ûî–‡*CŒ¹¼qŒtFÌ2.Šã«š8Â;¡¯b0ècÁïMO¦.Z >ÃáoØŸˆõ:BT1%¢ëœ Gîâ;8ÒµÝp¶ôEM€=MhîX£ÆVнG,ßì€f|r-ŽŒ¦Dmú&a”³ÀÁ±*¶ÌêùoζO%B™ç¬Cyü…3, ç&Sbùq;‰Õ‡-@ø›}#eaÀ‰ßÁ˜†y@ÈØÀÄÂeë˜X¸Ô —^½×óßÄr~J:Täm“‰…K1±p)ƒ6d`b9?e*Öm£¾‰…+æ~Ü1o(A_¼{ùüU‘É+jQ Þ|RÎÖ!¶ÏeþÂôî ¯ëŠŒþâÚòö2 ¼ïÎëÕÆ™ÿÍëH90iØøŽƒ3–+X…û”í,ãt¬¢}ÍH0 Ø¾KXýïþe¬œZAY°ÁQ9á‚J™šŠkJŸÀ¹˜?Z:Ñ#Œ@ËëÑÌË'ØÿH-|RÄ;Pÿ•ð7Ji&Ê͆U)®¿Ù8Ìð¬ŠU£rœi³BRι5” Dñ­ J~2&g9èåÄWQƒ‹„뾌 =C@"+Vä‡gò¬Èô®¿UØF{[Eˆ9ÁD,6-þD2€Œ’"O±îÌ[?`ôUUý2$å« 1aß‘Åê¸Ìè¹âz^GÅ)? …‘àmF ÀãI ¼ƒg`@Æø*'Áö y±*ßÂPñSä£{rÑ·øI•в®1Ôb CÜ X7¶Éy{¡‚7%HµLÕ—ebïoͼ÷¦šò2>‡¢é£Ù®¸Š°ßZîÃ>v5¯)äSç$æïÙ®ôBŠE-53J~o|üìÝ#!êˆ'‰#¶3ò ŠÀþòNgè(÷wm;·Q¼€YNñù×päføwí ¼ÓLCÓªÀ;ׄÄà‹Þ'±ãeã¿Tvª“!'bŒ(XÔò°ÀÌI޳·¤õMÚq!óVEcí³ú6ÐFÚ=ý‘^'¨=CjOù#¥ô`¬½ËÄIû¼ù|Ã+$ÁHCŒáÅy<y­NÆÏE‚« ·3îôú$|ãâƼñM_Ò{§Ï[ûSõ=)ü¤²–AfÖÀ ~2ãB£H§k‚Â}š ²Àï¿&)ôqlŠAׂõ“aYɾ ²ÉÈø¸ŽµŒo8Ã'±Àvºbá&jãÔáõ«FhÝsÄë²9Ü8'xkí«ˆï¡Š#qÎÒlV¥ºY¯Ýï™àMŽkCv–ü !t¾Y@#Ã^²†ÄUìÆZ‡ xŽø{º”V9¦¤\øÂ|R§—b8öJ'“ùp2>&‘¤ “-ËòàþÇqajËp©ª¿Ks)L±>P­ðþÏ#-’Tw'Å—Ô£Ù <ÎpübÅ-ßBÙì ÍδʺH͇Ãn¾—(7ʪp(üù –qÑãás\iËmYéªU£”Ïäýxê¤[³e=ÎñÔË3Ä+…ßU‰H Uõå_x%­~›¯Uæò uûÙ«áÏñ¶Ê” q(Z®0ã B0Z31…µ¾~BðæÄr.ŪU4[: eZ„Ž’™—bêZ¾o–!¢5ËõJ‰HëJ|Ð ƒTIq)üéÜu°¤ƒq£ýù –äÜGYbjz(î÷°X M²ÙÖoø8‚ý¥ât ôj׿»FÊã&MVd.0뮉I¢è)ËëlPBÙ·ÖÁ)…hr$–ÝÊGTIÜD@iµô±Š?¯²O’ù{ܸX*n%šûê,ô,@eJ¢ %P«<8“b¾.ާ-’@A ·Ì0º­ˆ)r^H¸Ö û)ëÖ£TÕ!dl%¦ºè’ZuJN ·å6.g×hN˜örsÂ<…—ˆ‚}|q¡KLHo†H½åÅ!sÂF§Dï§¥²«|4Ý^ù‹WÀÇZ`c 6í`ƒG¢ð=.ú^ì hð°Âã¶ýæ›BÙ'·I¹¿¯Š1÷î¾5ÇËÇ/©®G°àȶì{fË¿g%´¿÷c̾÷Ïç·'²(N«Êçèyh†Ž´è—Éy•¨éL cn/üzø´è´Œ¢•<º.xKw¹®•éà`]Ÿy§ˆW='Ö}y¨C‘“|íÛ@BÆ bŽ«lN$ÚL/U/+a›T+í°'ˆß+N¾ìÑD˜%kk>À,Ü«¨@E†•(ì_w›ÙÈ••Ó׌¬ÂŒù{¤"ž²µÞA ›/ˆVùœõ5‡UíiË!4#Xø{N,Ω‹,WJ |Q¹ù…¥ç>—BÃùôÜ–]Òsq¬å|f|4ŽÏ#„ Ü?ÞrâiâÜexFoÂ5€Íü„$éHÜmÛ)0¾¤>ŽVSD3ÉA£ïH×]¥Ne”Ê*k’«â(]¥pÕ ‹{Y²òš0"©“¤`IBâW ôÌþ.kîÖß (à^¦â@•mÃ_§®ÙÅ,±‘,ßBjPMÄ­À(˜ÄØkÜ7’° {EÝ„’òzîÀYH¼ƒçÏTºë ª< EY¥¨c äh"† ¦&ÆCPco=üÝÇo¬uÕ?0þøò5Ësð1 ‘ÉWç‹Ä·GÖ #–ÃeY;¨kGÑ\<ÿc1ìöÔÆ5.+OÁ1€(×'ϫґ;Æ#ĉÛh“R§vØâü6ÖŽïXøÎ°Ø4?ñæ\ùÛÞµaéª`ùÅž]t‘~@ïŒBLìCã帼wÆËûØ·ó°bÕõ¿sÅ´ R‡íÉüux¯¸zI³ñ®kÌÙgØk¼º‚•ø³mLÓžXþöXÃðó¿Í€úX}ÿ´½¼ endstream endobj 2966 0 obj 4837 endobj 2970 0 obj [141 /XYZ 33.1199999 484.819999 0] endobj 2971 0 obj [141 /XYZ 40.7999999 442.579999 0] endobj 2972 0 obj [141 /XYZ 40.7999999 442.579999 0] endobj 2973 0 obj [141 /XYZ 40.7999999 687.379999 0] endobj 2974 0 obj [141 /XYZ 40.7999999 687.379999 0] endobj 2975 0 obj [141 /XYZ 40.7999999 575.059999 0] endobj 2976 0 obj [141 /XYZ 40.7999999 575.059999 0] endobj 2977 0 obj [141 /XYZ 32.1599999 486.739999 0] endobj 2978 0 obj << /Type /Annot /Subtype /Link /Rect [285.599999 593.300000 313.439999 600.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 2979 0 obj << /Type /Annot /Subtype /Link /Rect [403.680000 112.339999 490.079999 120.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 2980 0 obj << /Type /Annot /Subtype /Link /Rect [116.639999 660.500000 261.600000 668.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://en.wikipedia.org/wiki/Aspect-oriented_programming) >> >> endobj 2981 0 obj << /Type /Annot /Subtype /Link /Rect [279.839999 660.500000 334.559999 668.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://en.wikipedia.org/wiki/Aspect-oriented_programming#Terminology) >> >> endobj 2969 0 obj << /Type /Page /Parent 2 0 R /Contents 2982 0 R /Resources 2984 0 R /Annots 2985 0 R /MediaBox [0 0 595 842] >> endobj 2984 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 2985 0 obj [ 2978 0 R 2979 0 R 2980 0 R 2981 0 R ] endobj 2982 0 obj << /Length 2983 0 R /Filter /FlateDecode >> stream xœí]I云¾ç¯È³ç)jºªº ø0@£˜ƒáà½ÁxmLó÷GJQ¹úHFp‘²œý€WU©—`0"ËÇ_~ÿõ¿û×ñ—ׯÿsü®¾~=T§ª­æÇé¿ßÞ~ ûS-ç_»¾9ÉaúwüþãðóøóðåðeüÿσhÏ/êãÃ¥‹¹Á}ÿçá—¹óÃüÉ××ÿû¿£<þaüëÇ?þiüñgÝÞô…‡~h§_~RÈ~üãö·éáßÿõ›ã?Ç!ôçv§ÿÿVt¢ªT5ŽŸ—WÅù¿ÛWQg#±DÝ5íQ9޳Éñ¿9üulí2ŒÓ „èZÕUÁ­vòÜìP‡nlº‘V£ÖÜ›ŠmhœKš†¦‰¸©‰Juî¦N}«ÿÁßC:êÇ^”õ¸È•:®tÃ\aÕ¨öLͦ‹$祥ØuQm%Ó44HDÍL¯/lIL”—¢iûVvÓ¢Võü'a”]3$ÚcצbDšÍzQš=†›J°MUÏBeh"g|i)–tMš†¦‰¨™é%À-qÅO#užd'U4½tSÑôD—hlj¸©-”·šú’ÄøWãã§ãÅ—o‡_Þ‡ÉÐúö×i»{<ÿøöã Æ?&8®ý·?ÿc4Ù>ýîøí‡f´àú‘‰ÏæÝüD¶èIõz~¢®_}?Ð_¿ÑˆÊü†ÕÆ<!N£üî»æÚç'Ý©FÓ©ºHg¶ªæVOjþ¦cÌŽ¯šƒ·ß­Ñˆ¤9"Âà…2ûÅï†ÏÆ¥U8O<-Ñ¡‘à'UŸø‰>h{a­ÖûpbxOÏ;¢jQ{’¢÷­–Ùa;ØÔÚ¨°U{“[³Ák“…zª6i.vªÏzxDxáö®Åço£FɤºÚPùáØúCø¾ÂddN´wk¸ÌsÈ¿9D·¥µ_|ÛG鱞ú¡jïWË"IøÂâÁצøwÌFÌ;[.ÄÁÜèÐL°yõ9Õ^ªîÁvìšónìe½Ì¶´†SdÃʽ¬kOzØÚgøäÞO]Ãw^`?Œ'š;ÖúO*8jLQuðLñú¤¥ÁP/•ôóåÀྤ­9øržOýR¾­XzÅ´Â<‚iÕ=÷ –IÒ­Œ™âù@ZK¸>䃎À±¦œ½)óÁûŒ!±‹îÀÞ?Ç“R‹iÅá Ìc¸Ÿ’Zg–^ßÊõ:ˆÞ¯’g̰6Ù΃éºe?-ƒ©æ×†OªÅÜíšïȾ3 w´ Õ©9ŸnFPëS‚lã@1³²hNóñ!äÑÂ'ÒíUi”>n…ô#ô ­ž‡4ŸwØÏ µu¨‚Å#¸ ”ðõ‘3 D}ê‚Ç&%ZS<Ó ÓÏŽºÖ£ÍÄŽZSÇúT{ñ¨qkŸ!Ý’ U$Nêº6åÉÌ-“?l–n4Ä&Þ» îL,X²¯â{*º»Ã0jTÂ÷qÍ2,S«ŒÁ¡›êºˆ¦SÓò¡á®hÛÃÂð÷%Ž10Z£8ßÉá¤3{Ýò°â"ŒñD8㉾18O[nk¼gOqçrü¬“*8FŽ“>IL'Ü‹jó Þ섎øq"©˜Ž„pá;\&L­ðˆ›cŸZŽkKþ@gpn°üâ Ñï7Ìå2ŒjîUÕ,1„®8müó¾o&½zUPßß~ðëákùd„q÷ÂÈp¨7Tgêsz { ÜÈp ÌáŠfâ(e¼‘-k¿¶¶’ï[`¢üÝhëaë-0 Á° jFÚÞ%¿pTÁnL…¨´ž­ŒpÇr™™Uz: ø«y‚ ÌÈòÇÉågªX¿9†XÆÃ(tì¿0☕ñ\:´ÊG4\ˆÄ»ƒÚ.·¡ø¾¢ÚY¨zQ úouš"m7ý脘M&ÕÛvqO,Ÿ|?´ÍIˆAö½¸|Kݵ¢nû¿¯ÿ–ÓkGómaõ!¦wŒ‘ŒßîZîûøûáå7ñ¾£U^éµCõ÷»míÜñ ™ýe]¾aM²¶/È£¸ã7$ëµØÄ¶ÏÚ“²~û±’f‡uã7ˆl°G#ïP|ÁwÓIæ¬DÂIÖÁqzã‡Ø)Ï A¹¦ØŠ²tøð‰Ž4­5µ°•‡m%N\ÙT]Ç»/GDÞmn¯JÂÔîœ.ív0õ>*Z¦ƒ·^Àa\pȹX6 #¶PÆhD~wžú€GJÀåDXlK­G¬‹ç Õ†|Œ3+\áÌéÙÒ1…6Wàm^Uàð:³o4cà±LŽZáð5«ÈЦ›4=ý—aÛæ™4\2‚ØÜ¾:-¹„­àkøqsEý‰®n¼º…Õ+ÕPú®øY6³—¥mÓﶈŠVÊ]™N;b0„v(‰êÔÎ9s!lßYRª*a¸+ðq“çí†{7h_­¹A{iº(ÇO,7èô-u׊ºíãâíú57h×™}ŒŸXnÐé[Ã]+Ã}Ü ýÅcþŠ +é·â<«-“:½þ¼Œ\/dgLv{ÜŽ!þP–×pšŒñ¡q”X’ºÕˆYØÒžà°ØæÐTõK Vxy,'ÚNñ“# %Âò16v¦j©$ú4›Á+®åúïvÍàïø‰eðNßRw­¨Û>ƒWµbð Q[}Ô–Á{þÖp×ÊpßGƒW^¶>v–ÂtÏå°´’ë3±}[ÀŠAnfM±bwXžùÁÍJŠð‡ÚÇöõÏL³‡>vee>`:ho= î$¡n‡‘ãæ$&‡»øÌ—x$ã<‰ÕQ’Æ©Ýʬ“E2L4d‰h6‡,ÉSgÈÊÆüæ•ãϺF‚ø-Ý*…Àô0lÝ1=ŽüðgÉûíΈ¾§< öpV²‹éwïCg°Îƒþ»DH Å?tÙâ• JÊÖËdC˜cbsÁ"¡ï8¯QŸo~Íâk†æöƒ-à5¦!i¿ñÄ©?‡ ´Fq’ØØÀ…ã*„Á ÈC†c¨] [Ã0Øfƒ6cè`mÏd-þ0¥\ig`iþYûeøÚïØ‘?Tþú®ÅÐÕ~b‡¯X’ºÎ4åâ).oÊ9ΤjjsuKgì>Êš Ï]i Ë(Nuc(|¶ÀÏZ5™ç2)Ž^±¥T™]ÔM“üŤ˘…Ó­ø‹f ¸"™kß}©„’â’†¼ý¥|_ ÑR¥]M ¯›p\M€ûy…ï0®tà\tàÜïè­á`º9`õ—WT¢ŽHD|ëz†ünÒÙ®–êr­MžJÉ´î¥2.}ÊÑ(IñNŠ›)&AŠ1 BIDªå¼B8AZMZ®ÊBíI™­J€VåàqožE–d~ÌŽçé¿€Áâf24¥ÕŸyÀ¹"â.„«‡×s’裤,ìvKz]Cýý¿i铎‘â(±Âà ‰aE³«†¾¯ ÕÁ¢9FXžÙ­¼Iþ½˜‘¤Ínxè“hÛù÷XŠ«²wrÞÀ¶k3ƒ’$˜Ç"Ùßm(Oh=Ö´²k¥º–†à(„ýí°|½¦©ã -Â¥$Iü7)âŒlžšZŸ†ž›»"ŸG™;Õî‡Æ`Ej9»:çÊfTE]ßš6læÜ|•Þ•œrÆ2£¤yziðð8> ƒc {ÄëDˬ«+á7í ¾¼gø»=‹Ãp¢°„dÿ¹Äw«Ow3ŠófÓeÂ.`Ô+qº„EJšÔ•Ä|35‡L-êq¶#CV!˜‚¬{µ©*Âs®íT[Ʊ+ 5O2m¡íÖ‚¬ºBz=çö¢­aíüŽ|›×Jkz–/g©#®K³ë”#¬G".Cb²’}ð;)|{Åoo x Aö†¢ISþžâ`½ÇŒ´B{ó¼ÎÂj'(l|¥wÝÔчb±ÒKAŒ%uø¡¬Xpô –þKâSˆ KÄ3Q gˆ€-s"ò[âi¯Te¹Ks„ÃrJEkH¥ŸÛ´6æ72ž% u#éb/xÁÚ;ø‰Ì½”ª2ˆjÐRìé¤.> Çfø$4!T\pΣáq!æb&š$õ0¢‹‰Ëæóèl:š‡q¹-xË £qÎШ¦ÉË ùvexŽRæë°c’+(ï²7}ºäLÄ£ßùkKb. OàŽsxW"²Êüb#U‚…»É¸MÃ8B×Ë}ë™ žw‡º…]”Ä& øx~P™NBÇ1“€Xs„ïK½éuitqøu#å)dž’©J(ôµ”1çê&l00œòèÜ­Åþò®1Gùõ‰Ÿ×IW# 4ì¥6)ƒD“׺¿¢GX{Œ“áI@Åäx¬R‚•‘fUGÛZª#ožÉSÈ>…,¥*Eæ¥P!…sE='HD\„4:‹)"âsQ ý B´ÀI«i½Ä§¸m“ä `öK\&ÕêùbÖªº {ë³µ¼ÂúD/_{ýÊ›õ•ÁüІ»~"_Ì—Ø©úTÏô¼6÷~Ñ\ê,FLâ‰á4ôç—Lö kßîe±½?œA¾¢'ZQ´§ÖBÚê4¿èy…¼ãèÇ"†Ö„´ö­%Ó{e…š‚ù·´R‹}S*ã2crsðü8ÈÝ8nMðÆ„ŽRïynˉrÝÉ­„™cæÂ ðš|I€üßW8®)xƒO>{úÉ™LÑw¥ $p ÂèÓ–H˜ù9fpR‰K)È#„Ì8×1b£·F®ê/ëž#÷ñî#­~Z,ž.»bÊ:P`«Å–# ÇâwÞé3Åø°$\ w1Ú¬[X›ýÍ©7œ^TÛüi#›Eñhƒœâbþèw¥+B/+2Üú H¦!¸³ÊÀÊï͸“]gî±§qRG•A©¨³ FÀH XO%åÔµÅÂYâ〫$ÞJN2{ÈcG”g«#q’·ŸÛ5FkšË‘Ã9—“ŒFT 4.žÈ=Kp䥨~"6S¶\D¾lóâ‘IYñr…¡­ìâïöŒ^ƒ¥lî‚qoÖ\&á-õ1Ÿ ØÞÝ|pÓ]®YydÓ{åIÌ(¤¢Ðy9W2js%Ñ$4û¬½ûé&î8º‰Áœ8¼ XÁIÔ$ºµ¼«'›.|õ|ô^{’D4ôw0ÿ`Ò§ÉvÅhTmQÁºÆ“¤ÄŠ×4†êØ{] :ö8•¾ÕËêqp¬«R`ç]#ÕXÝâ2Yή,¡^Õ`‰¸Ìu²ìŠ‘ªwv[/Ú.Y$ –t”æâæƒìia:zbñ&!©$Å=1PC1€ú‰+·FÂz,HÜ$îðk6Ò`½™t$<ü§q²Û¯@ÆÚq`/‹€¤¤€%ÍQÞop0¦D9M7A¿…Ç-“`à|P-Æý±ää¶ÚNÔ†0SøtŒX£[ˉòÐs›`ÿtúPDIˆý#á|$ÍOã¾2U^r 9ó5ïúôúΞ õÁ‡üWøäìöP™œœöÞK‚„µÎCáÅ>ð†InÉÙz¬Ž²•hË$¸0¤­ÆeǬ}ÚJz{AIÏéôïÞ<¹e"®}u€ÍûŒUì¤ÉmMúlù@n®ÜTã¶`г•#ê8z6â¶Øâù§ûlÀá’vÚ—só(«´×Úi] ឣÍÒ2žP ª`3}ýÄ à”,î†%ÿ¤Xq0.OÆÕa¾ Iµ”iŸ8jC9­•Z_U­Z¯L±Ä!â,¥ÉÏU ®Â“¢» (F`e”ièÔuZ™Ìî¥WÎdCÙb~Ï9B„¸®ˆÌg7Œp^–2¤„g³×“Vƒh3 1<ĉ£%¼­Rpc¾œL±´µ¯œEÁYû l-k€“I1IȶfÎÒú}³+?–9ËR”~,N‘0|'Ì1@€³pkv] çÜ¿›‹z 'ÂÛHžèn…7sqнírâTÂÐ+›UÄØVD ‚‡ÔÁEeî_ÅœáGäÜ‚FÀ1.Y9 õ=ɰ!y3KY'K.Ç›É.aA?*Ni`‚&A¯î?ŽÙæûó±î×å`ÌÕPƒí¾tEÔ>Áa•¬MŠË‹?Ád.IÎ"|ünÊ(ìƒ9 çDbH+†Ï°¸4ˆ‘¿~M´?ì¥4pÊ[!#ao…?*®¬b‚IŠKõÍ«kcÅd$ÚóGý,Û=-2ÖH¦P`ŒÒ¦B–P A‹RÀ»’Ù÷&³GûšÑ6DñºÑ¹0 ÔeðwænöÈæGÆLY&©È~0¶m&!Í`"ú `¬ Ð#Ú¯G)P²c@”W 憱ÙøHSµj™..üÁ(ú¸ ‡S²¸ã'œíÓmsHt@Â<Ö×»YÇ=?á”â›4¶ç±t7iøyLTr7ë¸ç'«a±è®%u!õF4ËÝ õ+4Y,[‚“ ù‘`7iK,pJ#ÖZpÂØŸE?¬o–&•ê’Ô§YÈ×’9Ëwwq0­¿»ÅU|£Ù_Г‘ÙùÚÎáJ¹ä‘«ì8Âq H8´ˆàMÚX­?Ùë‘¿,s’Lv<,t"’ö(.Ò¼éÛQ¥ŒÏ}ÏZ|<’ ¸ç­Üwr{þ$Hà B2c/ /ç•éOýP)2O1˜AP}ÂN‚+ÓcæD¡9±ºrâÄPg~êNÓ~†öîƒ__ÆI«f‚aÕx#BÚc‹¯µ¦ ›$Á‘½Ý³Yàß)ïíQŠ"³=«æ÷×:TsDþØör*PVt&k>Tº?'‚œ¥b1:)»û¹¬Á2<¤ú$HÄ0wNzb9QÂb‰x¦ùȉ¡:bµØ‘jÈӿđ1´$Lï½ÊìZuqþã5yH^v@jâèRRLN?,Òtµ…~~iïx<yLBáhA+µ æeûá¬#”c K8ØÂ#àÈ1H¼›ðš²ø÷çƒiwííÅãÇŸãæú‚þñýéx}srÿâÜhÎW½;´obœÆÚe}ƒhOs˜£®.õ|hÛS»î_Ô ¶²;uë)œÝÊ“yûÖõI«à¦9µ³9|}ÒÁ~zøÎßÑa y’U==27ÂZkó†»ýä ~WG(VføŽÞѦëÚæ¡… í½b”¹ë±7@×M¿Ëñw/xUg÷§è| 4Ö;ZPïTó£ë“Ê\m‰Û‡kŠù¯œ£ÈÏÂâMÖh­V0¯hKã/»ý²ü»öä5 g÷}ÕžÄ9^eñµŽ¡¨7ý—”šæøåðÿï6ªL endstream endobj 2983 0 obj 6255 endobj 2987 0 obj [142 /XYZ 40.7999999 450.259999 0] endobj 2988 0 obj [142 /XYZ 40.7999999 450.259999 0] endobj 2989 0 obj [142 /XYZ 40.7999999 90.2599999 0] endobj 2990 0 obj [142 /XYZ 40.7999999 90.2599999 0] endobj 2986 0 obj << /Type /Page /Parent 2 0 R /Contents 2991 0 R /Resources 2993 0 R /Annots 2994 0 R /MediaBox [0 0 595 842] >> endobj 2993 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 2994 0 obj [ ] endobj 2991 0 obj << /Length 2992 0 R /Filter /FlateDecode >> stream xœí]MÛ6½ûWè\ ¿DR@Q ÙM ôP`‘z(z(’¦EÐÝöп_Ù’e¯¨G‰#Š–½L€ìÆ4ÉápæÍp8$_ÿðþ·â‹×wïÿ.>t?ïÞïXÉ4kÿû¿¯Î?¶”¢ýÕØªõþOñáËî©xÚ=욟v\*v?šÂcmƒÿ~øº{Ýv¾k?y÷SóÛ…(~lþ÷¹øå׿ÇÇ®½ý¾ìl­÷¿üÕþ¶ùÏùoûÂ?w?S|mH°‡v÷ÿ¾âFnô":žúªüð÷¼*ê¬a¯„碡³jØñÏï»OMk=e­xómeØìV›öšfy­ŠºùÀå4êŒm^S|iC57qÚSÄ— 3eüMQY¯™jù%ÙRÖ÷M-嘖*ëñeCëXïiŠÌz%õa˜B»ª8ÐcS‹9fÓО"¾lhGÖ;M=DADqBÄ'OÅ7»×︒vo?5”¬Hûã±nU¼Ú#£mJ?ß2&ï¿+?ïÞ>6t®Ý«dÕ±×w‡^벪¥©Zc×–0JÄ÷°ŽD%\Ã:÷°ämx?–°Òfak Ö%”~0¯q? ΂€s*ªð~…6.;÷CáÛ¤ –0ØÂ¼!P y€¥Ï)IÞp?p<˜×XK$¤ KoW' 6.QÆÁëÆAO}ŒÆõy$¬ã±hôôx»`? H†ìXo£¢§§5 n™£‰üåmx)ÏQ°ëðR$eÕûë+¬Ïž•J\ª±$FÒLú/¸NÝ”×=ä0zèñ6q?r´mŒU}´-¡YÕ[É¿Ì15ŸÄQbjž‘bŒÄž Ö:¬A¸æao`ëžšf9ž4ËS#x‰…r) mØVâïÈ-B<‰¢Mžü‹ûË×™=ƒñ Ë›'zNðØ=¸Ž[‹»Ò¹M.Lú€ZcŒÙ#îáa Fˆ7R<lÁ(5àÖðH);ÛñɃq#ž¾Aé½¹˜øí_ñZB÷™çy-9êëñ^°âh,AgHÒG‘H)ê›Èû'aAB:¤Ñg[MŽ;—ÐJ®SŸ%Î…£x/¸„àmpk8ރǹ#î#Öïñ&ÌË1âºw¯H¹ï°)Ï”"󘶨™ô[éÆÒh­“šAÑZIÐÀ¬µ>­õP×Rem¢k“æÇ^î®›ú¸S˜ã¹ÛÞ]ßô‰•«ŒçF£”èc\î\o\Òòc.ŽKFÏqÀ;Ë„Húå-¼g§KžŸ ç+xtg§P8u~(µdQ Þb] HUÊè°•f’#¹$—l£äòÙÿ/o/ÎëÄHœo«~w=a¼Ýš%{€—·WØ{O%# #C¶î÷d¢E†jÐ¥b‡.keŸ”ó²Rº‘‡¡öôAÕà¢TãëBu,8+Q„’vŽMÉÀŸ‘dP#Ÿ¾ªÚ¹V§nî†F¡ZŠDiÛgM¢KÁíèjý¬c3 • Çéa–ÓüªpºŒvZõ̽C+xÀ(ZŸ¸*¥°\Tó¤#@nàW»°ø `æ‰#§®0@®áQt&Îz&?–„†³„u Ïl ÁáÑãùó°À™ ¿Š…îÍ8ଉî¢À»€ðîèm2û*£)pÞg ó:˜VE… ƒ4;uC`07œI—†iŶê .®ëÊþªƒåÃYóØŒå“Âá8æ6üÆböa8œÏÇH’Xà_È'ìbÈ=&CC´…^³n¨Ç`^èåmËë×K¬ýs"–°#;:Çõ¬Î}Ô:5¬£Žó­ &¾§˜Ç°µn5ÉYYi1¿°¥êg8U¼*Û™r¦7¬<žºY3=†Íc´ÑGºú*Q³þZän z ib¸J.ú:¦;ìt¾t(™öV< `£‡ë× aš!zL£Ó|”%’i Xc´êÔ%ŸG,)¶2ÊšÌQ*<£óe:ŠC±?wEL•u=Õ£x5$ß…Àšå p‰ÏŸæµc󣘿üF„Ó8ˆ{Õ‡ÒªO[²x‰b·ëˤ2ó‘ *aºâ¯ë +†FƒV¢ø‰P}á‰ß. cM‡ ט““6Cuã,­³Z] ê˜"gKÂc0î;sAàJ—o¥™™¾O—ÜÚ ¸"]þ°fu¾×àŒ¶ ßf»‰»ã5çý=çÛ¾^s?_dF¯F$ž}Ï=Pk<çð wŒE¾ËŒp+Øås0sÉJ²÷Ö{àõñ´f²søv+L¾óãâç*ð©Å-ßùå?£wF»[E;!¦O‰¿Îw÷S¤á¼Ê§\ç`y^¥vò¢ûxÒÆW©Âöñ—„«ÔÓKÞÉü6¼â$œ~¦Ü%C¹e ¯ysIöÛ¶í=LdçIÓ'ùdçìuœ.¡p¶ÿ×Ù‹œŸá6–(¥þŠR2<[»‰Þ¹õÎnìäÉ&Ov“sR€r¶kþævÀly¶X Ç¿VJ¡Üˆæ¬ëHîßê~¯xe÷Î.ÊÓ<šG­Õ~,ÉÖ¾ÕDÆûydµÒYVÏù¡å¤¬z&9Ø BVÖt6ÞÀ%)ÅÔ@…v}úÜ;ÎŒÄGÝVOÂ3Æ ¤*^*¿!ä,M\Nãñ-Èn ɤ£œ†ŸïúRrBÎGoù¬å²’å®A‚€@}Œ ‹–Çœ9'+I@…MX ;x±Ã@O`Éá¿¥V”®õ@x¶r+¯/ÒŸt O©_w³ßÎy./{#k>ÔÖÉãMgÐ<Îüýщá%`pŒÃ% Ö=‹{C3$‘•2C‰¼¦pöfbÅ©·®­®/å¸}”ÉHt¿• :³pÆ ÆjBFE ×Ù¯Û` ²¦¥Ä,ñ}›‹zvECV;0d>¸½ÆñÎõŠëÉ¡¾Ìc¢Jp=˜p‚(NS‰úعÄé=ø¨áô” •ÊÚIz<)JO¬X¿n†IN ¯ºÖ•:²ÌéÎ9Ýy†¼huý:håsLÒ«|RÓ61{ñVH«iz6 ùK)¾ |$qÓ‡7œÐžÓ¯½ãòFñŸ)ëQPȃª¸5\‚ŸòÌ)½q‰ŠK5‘(O|bî`Ú*Å=€äi-ꃮ¤‹:ðã¹X’衚â-$òJ<c|ÀOÍB離'ÇKrIRï‡à{¼Š5¢Äî0v< ¦á‡ºq?Œ¦X Ì‹Fyô[Êìe% éÓ¡±Yÿ["ÚÈí¼%rrqœ:øívJ¹,M„6ðû#¼U¹ªºÒc ##­ñw„ñBu)ÛgNæŒ'ñ{*ëï1£žëέ]ŠåÓJ‡u—Ü<>LÚ›¾È=$û<æãȹøÞg‡‡VÊ‹YïKæK¤ge4‹§¹`Ú¡ûñá‹Ê\ d' |𢠷ê´  Þ c<·X·ÏØ’õ·èt6E—z> endobj 3002 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3003 0 obj [ ] endobj 3000 0 obj << /Length 3001 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯ÐyÑð%‘b{¼À0ÆÀ‚=,&›ÁN°Nùû«nIÝ=¤>J,Rl©-{Ìæ«Þ,V?þíó¿‹Ÿÿ(>>~þ_ñ¥ÿùøùÀJV³î«8~¸þƒ0¥ݯÚT¥hŽ_Å—¯‡·âíðrxiÿ};ðúÔ±ÿÑ6Stþñå·ÃÇnòC÷—Ïÿhû³ÅßÛÿýZüð¯öÇýxÇ|=˜¦>þòßî.¸0í®;6þrøç_ŠßÚ%˜Ó¸Ç?p-•d*joç®üô}ÝMÖ‹×Ú˜‚sÑ®³jÁñû?µ£—Q6Šs]+ÍfªÅ0l£ë¢ÒΘÎÖæÄc2J¥è²¨q¦´w$2ÜMS%‚û0R4¸šŠ'B`»¢4p‡#Qá®Ý&¹ŠÜæe¨Ø8OƒÁÓŠxÜÖzÈ{†"ƒ¾e£Ó6µ+¾BÖ 0¡R¡°]ÚÙx8î¢Q‰à>Œ .Y7‰Ø®( ÜáHd¸«º#®V†Eîr)\UU§è¸"µ³îp$2ÜkfÑû0R4¸j# ÄL"z‡#‘ánDÇÔÒ°ØmCÅÂˈT<®ˆÇmm€¼3ÔK’c†¸3Þ<^Ÿ¹’æxªzý©]ÉéhÖýxm·[Ž–—àÅëÅ_“Ï߯¿š²j¤®º³\×ÂjßÃ>µðöy‚-ŸÂç‘°…5pmަ`Üá†çÁ°öÀ bÁÓç1|?¯ ö¡ÀÃ@v£}zmy)Ž3ÀŠulѲG¿˜„ƦŪ”ÂpQ¹0U—?t`Q¥êöqJmZ¡²NuÙŠ¹o¡¡>¥‚Æ´œh„ÙåÄ.'®w aí‘ ¶<„c[ÂUçÚOZé&àª%Æ6܇Bv ß 4#l2ÒuU#Ðų%¥yc‹ín#ºdΡØvÔǃ`]ƒû8ZÈÖ`= –g>G•9ûã§?p1 ;gçö¨ø£=iÎA w”¹½VñÉ–M!èsP!áGí•qP[&J¬)„NÑ<ÆúBŽÂ¤*–Þ÷ÔÈ`ŠÃÞ0¬s8l¹}qÏ<ا=‚I³(¶ÔNUÞ–MÐð̃Gƒ+x?¸P…z3Y‰ï!zlj‚wÆ£ß úÇ#‘(÷œ8—ê9ÊÍ EŽz jRÙ­áÑŒz§;—¼bCº8?ƒƒu_— À68nte÷y ï#8ìÓ >=¹,uç4µ Ì”JX-|pž '—÷éÖV—òä;»n‘h´Þ³ÌYÙ5\µ<‡ïôâXèW}!q{´¾¾ÐȪ1tzöãUÙ¹笺ŸgùkE¥ÎYw n—-‘&ae~~S@ížé*;!7­Žó™$å™p»HY!Ï ,“Ä/>#-m> <—I¸¼P@qD§L”}‰0#*i’_uî70«¸QÍ^ÕfŽEyûŒæÝ‹¾î–l®„óé—4¶r͒ƒm|^Å-”˜Gº¤È¢%*þë8mSKPü§ØGŠ×±MZžû£ ¼™KïîZb«’bÓZb—©%E½+ï"¶óèÝ{‹óÚôisy×weΫ 3j–•)uc/Gªà{Ç%ìŠñÅ…¶vSaT=iõù^6ÑrDðuÁKIz¸!E6Gšêo+¾†ºM¶ ©¢š{ã„r§_TX}·¨ÏU[òi¿÷ÈaY×júé¿ÌZð–gÁ-[{{ËM[Òz´8!îÐs2Å1ÅØo…ç¡øºrÕ Éå À`þ±<:§>Sß®sîÏc²bêÝÁ:ÙC‰ˆe{?>_|ª>zs$ÄñÁ¶}94ËŸ¡í»¸çJkkGîÓG@¸vwx*ðJúHÓjŦþ1¨? Ô©Nrв;h=)=‡®€2Ø¡„êø1=kuÎøÏ(f ïEß>Ž3sí\¨èý’ÙØrñönÒ”!¿ޅηð½’r8è¦1Äéµ6S§Œök§¸Ž ÈÕp: !#ÕòËÊN ÒŒa6mÏ„óßeñ ×Öø¤tžé'cœÅ§­Ñp•åX4ŽBqŸâÎгÄ駇VcB®ðU$ÊcD¹Â7ô9®j¡WÀÖkb¦<+!Xpa$•Càý˜7èz©USuWi鼚se?Æ-[¦O÷‰ýòØ·ð(áÎxÆûÈóÅ “󌦵´Ú„àVÜËʬ#¼ÚÔçÒ`{ââFe2·Â z1|r=ˆà ¶©–,»kئOgm?0IôòÝAÁÁžr¥p8–TȔ„gårrMS鮡„{è×6O)íŠSö)'Hæ=ša]G`x×½ÉuïŠér%2é\P0[Òºµ¿a—Ø ç³ »”É9«l¿5k$ŽÓÜ’&ÙdäUÚi™‹Ó3ú'¥¦=õî¼™7×aÿpã?¹Ç³ ¯£ü O ÜTßκ¨ðÇù!Ï·¹0?5$à éߊ£”ø°€µ.[©,äî–ò¬I@4OÊ,€;‰˜Žù ¹æ½ù÷tØ%!$žˆwéÆÙ/Ã]ËGïTÊ–÷„Oê@Ú*’áé_¤’”I²jc Rú,”³½LÅ0bXÏâ©Í'Ó¾ÊÈâû",cD8?é2„a²¤gÓªr$)ý‰ƒ…*Ôg:ÄJà׿ÂauEFöÝ =š™TI­L°UÒ† ~’5À`vÆ2‘âóÃ)y<™k`ê€{Ž4ÉiebI?ÛM1Å aŠMKà4Eé jci­”Tj§¨"•àuÌ÷¶ßÅ[˦-‡è|ùêá[—áÙ…á_¼,ïí:%Z¼Ý舴 ¯»Zj…dç*+}Ž`]Öã•U:èÀ*t©Ç³«õHK‡O)KÑŒšUUÖšl®›ÇÀ> ìÓY3Z”‚"/-p´Ž¢®ÿò?Û›‡#;|F}zA3ÖÂÑ>zÙÖ§ÇXÈÞûµ ‚ꎿ‹Š[¾|¥ÝùT8ôq:¨œ>ýýWÛ‡uM—fc[àñ!N1`ÌyæôÌÚ$­ÖÓJ F_îøyéw¬å1 eÃê’SuFI|lb(êú–^Û$Ô4ÅËáÿÊ\Ù3 endstream endobj 3001 0 obj 3223 endobj 3005 0 obj [144 /XYZ 40.7999999 447.379999 0] endobj 3006 0 obj [144 /XYZ 33.1199999 497.299999 0] endobj 3007 0 obj [144 /XYZ 32.1599999 499.219999 0] endobj 3008 0 obj [144 /XYZ 40.7999999 447.379999 0] endobj 3004 0 obj << /Type /Page /Parent 2 0 R /Contents 3009 0 R /Resources 3011 0 R /Annots 3012 0 R /MediaBox [0 0 595 842] >> endobj 3011 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3012 0 obj [ ] endobj 3009 0 obj << /Length 3010 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨ó–ÅE Æn;@ È!È!ðd2ă8sÈßT¢T%RŸÄ]UÕòÓÝ¢Äåñm|ßþéó?Îÿúýüöýçÿœ¿êŸï?ŸêªõðïÜÿ÷æö•£Ã¯­l*ªúç¯ßNßÏßOŸNŸºÿ?qùPÿèÇ!†ÿúÛéí0øixòùý_ºßþw¦ç?wýzþÛß»?éþú¾¤ý/ÿ~!”PÙýqû[ßøËé¯?œë¦ /ýöÿCZ.8£Qóø>}J.ÿÝ~Šë€E$«ù™ÚͳéÀñßž~îz›¦Q)NH+x[;÷ÚÒ±[ÕŠ®Wjuj­Í±«ØŽxÓ¤é賸¥‘š·ë]ƒ¾©ÛË2©lb:v ±V‘4õ3"qKA»ª¤Ðÿàï.É~Åzúêv9Ý+^Ë 4›6œSO±û¢º?uÔ͈D­Lï/ì‰ô§¤RжßÔš z̲畗å»à©«ØŽUi:êgDâ–6îî*ù…ÒÈÏëhˆ©$ØOkÊÒðÉËŒHÜÒFÐ[]}J¢uЫÖñ}åÃw_No?Îd¯d}ù¹'ºË —_ºå6ç7½øë÷å§óêšÈ?ž¿üzRU£XÛ ªÝÐR€-/¨…ø ‡ùÏ€*ÿ07 {kýÇaï.-¾t8‘}‡±9Ü‚á[ À _Ø’v·ê÷°cçG¸Ãªàw?Ãw˜á}„P¤pݘ†W8ä"+˜Ça˜‹ì0 €è=ãåð$Å#06¤¥†\z³¥D8a14üRp¦Ê’zT†ìt§Ëraus’W|€€Et¢ê»K¤ÅM®ÒTŒJB›>Ûª¶`[Z4%ÜBž+ñ5·”S£.C«5»wU£áÚäá\í½àÎ0"Ê$„\Z»uÙG«{s®+€¶v £˜¬MÚ®z˜¼|†ÕÕ'UËk,$î_¤ge¶Â€;ygb•‰f¼T =ßÅ$Aêeúʹ"n®H«K¨½9ßFo‘¿Å:,&ŠùŒ zå¹ ›¿CH`1B_²039þ¡œöÔ›ƒ6Iý°·<°½¥iT„&Ø[îßÞÒ´2æ¬vØ[{Ë•'e·|sb¸‡û Kl‰uÆã¼Š74À£±Øí=ëY™#ÜüŽÃ «zîÖ’$¨e!ìvH>#øÍòô^&~Ü’ÙØp<üÍ讉ÁPqK‰¨(f0~‹Û… |È7…â_2¡&>5Z¢‹HAëŽMÜOعmfÍ£‚-±Î翉Òþá!e„T!#lÿµ5ßEoª{¥*[`Œ‹Ì"ðcZÚM€ÇY=+pâ”SÉ…§2“ûø¤MàÛ<Ìr$Y«J ‘íp§<'ïZÜ ¿÷P³žË`ëô m¢D-›Ý{òV5̰S¾j=ü»N¶Ôã^¶Ù"ü¿YG¡oh3ªKæyŽP¸¥÷™¡pÚ ÙTÔTé4ÂÉŠk¬q˜ÛhNmªgœæF4r²á—ŒfÕº²Œ§p=£Yuá›þ»@0t^à8Âú#ê­”µÃ‹±lÌŠ–¿‡—â‡êÝ-zæ^úŒ-ÜÃ÷ÛûfHh [^á(G¸åHçèP»Â%êSjè9y{K æ^Eìs9Ö‰‰þ 9Â[Gë÷LÌÍd¦µâãz˜…䆈Lˆ»Ÿ÷|ªzï#”©q˜wÇa@Ž®¿}‚ãRpa؇ñ/ .Ê®F¶­0YMŒÛˈͥêŽD„†#ŸÌœx¥-gœrÍL ¹›ùn.¸˜’+Ûí~Hp šë´‡0ò±gmñ€Çe™¢fG’ÜŸ¤GˆÝε{yƒ¶ó„ªCä=Ž~–õ¡`uœ; ¥+='Iñ°´„ÙÈ]®Í%PõPBõ×ó’^yèFú6ýM+)ë³hû-!rxÊÏBŒVÑñÉדh*B•’LoñY/üvŒî}ýwÝv6¾®•9F÷¤ûf>“þ-5ëEÍÇøåôî‡\Îæã“©îøsHK×NH’”⨎*µ›™·H"Š6]Q;˹7'û&&q>^u!Ɖ±†G;û³V+H'©X=—TŒ,I*ÆL)Ò=±$UÿŸõÂoǘ$UK’ŠJsŒî‰%©ú·Ô¬5£€¤ºÞ;qHªCR=•¤šPûa%Õ´c‰…Þî’Žs5çÀM½ÄjrÇî‰Åû·ø¬~;ÆÄ¹\âÀ¼5ÇèžX¸KÍzQó1 pàf¼ãW¦Øt„奨!‚öf¦FPd¨]t ëÝkåHµqª–·ŠGÚt¤>⇾ë›;“ ƒz?ö ®tÀù‚Àr+'̰ߓäfœîÀ’uʘ„OraoUæúz‚ºË›²è™³¾µôžÇ<.ïg•DIŠÈ%ލJ›fŽ/‚ß)z¢PHfš a!Þ½€<Ší ÿ(àœÙx¶&žG£;8ÖÁ±ÂNjþ1þh˜“´1]íûT1g.©Ë>´;±Ê`ßM„X®—¥ˆŒG`ÿ°D ¦E‹žÚ¶8=¸Øò΄)mÓžv„Á¤¶üO¾žkµ}ðú–˜w#n‡é¿Ð.†Å³Ù·†á—æ“éÞg«»™¯¦·0~v2º&µ‡5ú„¥Æ»ƒï‹L:¼?wïýaœ¨îÊ(è¯iÌ10²@6Æ-²€Sf¬`9O‹Z7sCk± bh- Þß?1EÌð–˜w#n‡™D ­ù‚ˆ¡5³†a–ˆ¹¼5Ζߊ˜ë0{ŠJ&Ü8DÌ!bžIÄ\Q»œˆ¹ŽY.$ »Ω”O1÷êþnc¦æþVÌuLÞNH9w+E+IA+Á€šÃXã†Þ ¸Ë5$Ý*‰]k%ÍÞý~8ŸÒF8cyÓI`çúzØ£Bä6¢ç¹”$©¬³’žpJxÌÔB”ˆŒbÊCE žö´Ä¸§"Tž4•XR\8ïãfÂàLRg#OªGú.^EÊŠ6+5 =.¬|ByÀbFR7G2aH¢£H±ËƤp§m ó©'SÚЉSHêt—ÅL‚o®,Óµ/¯^ìV>€å¬è.6ì%@‰±ö"¼ÒCFêéÖœ|Ž#Ôë;Bí_ÓÄÁZ"nñÝêKH¡ðU+¦jR‘‚§æ:í Ü-›u2 FKô8r[Ô½›!èsì›ó‹-!Äk[>÷ª$åOO!éß•Œç;d}„›Üˤ+3nž C.ûM©½–ê¦O°r ÖÆ·;¿ XCÀ•Ɇpž[Î|p. ¸§<"䜸hL„Ù]Rqáï%)rü-Άs5¿4ëWÀ˜à›!gÚEn1cʙ¸“ÓÌ•±¶b±kŒÈ4w»véƒÆ®Ý€ºtå–˜Ke°T H°DAš÷Tù¡3 ´¼Ø˜9¨"m¬œCÌM -—ŽUq9«Æ¸Z¨ÆbÔ'럘5Ð.oñY/üvŒ±ãíB 4ÖrŒ1º'f ´Ë[jÖ‹š‘¿k¦ å¦Ûú̲XNñ KOŠ‹hÓ^-ewo¡sÚ@1°ß2÷¤ÞÝŒK_9<á$¹•Ä:¬‚eW´¨ÆÚò†wyÈ[!°’ó³Ä)ÆD#Úê†Ý…(”!Wlç/]¦S¥®Hµ›²\* &E>b¹¬Uø¤°’Xá‘,”Öž˜6.Î!xÁ#aÛ éáóÎRP$I¼M›Û÷¿X}x\N™òÒ#,X¶ï¬ IÃMz òv[²6O¥š€3âr ™Ä:_;XÐ8Ÿj;2hBÇÆuÜÂTGww9®˜ñÜlå=ë€Ê¸ØùWÊpmÞRW´sµ}¯Ã#Þ9wÇJ[¡3Hž€¿‡¼¹Ì™__'q¥¨ƒaF1̬YÁ­±Wúù—¥`¬–¤‘ôÚÝ}\2 C¼fĬWÇ+ìAW†X¼sÒ“=¿:ÛþÒü.N W‡ÐI!tüN^GËHK°†ßà=]Á|[ ^ý~Ï¿DÌ®ÓÁµñ.`:Åôó’t¥°·•àýÙâe¸ªÛó9¸ê W½þô˜-W}m¼F¶@χ–ô|-8Ò÷Ð’\Kòšöü4X²`^ ^Zñ˜áqð7pBxbˆÎ†ÇÁ³Æ”DsJX²RÄÛ²MÔ"c]õhy`Ùvpüƒã?Ç߈)ÂXô‚g¬Ð T>šÒqpÛé0)«ÖÞ³ ¥tIIüÉRÅ(ª`Ëv²GHa;ÊRîñ“Nõ”wQìïc-[I!''Ò`å{_ÕæãÞ µu¨ï9m8äÊu«¢îíñ½wgÛiÊZý] 7È\ƒwïÜñ*Ú´ãX8sÚ°G$‹ÇÅ21Ãx”DZ('I¹ï ¶s–sÐEgoÎy„¹©yÕx Ï©{¬:꛼´ÀᲕ›ÓÜÎ IpñQ| †~µlº››Y ¹lƒŒ]plž I­ÁÉ+& ý+gÌš%Ë uÀ¾f{>+ðŎ怖ýCÒâÿ ¾4wXŒ¡¥ºÀp‘Qe=†C\íù¸šïêþ;ï©C”þýãë7¯;Šoêî|ZEÌÕO71ZŠ3é–±|¨.*×™ÕS¡ÙAa¢ËçeÅ+ KÒ¶j—¯¥hZFÁXE•qÜÐÊ}S‰AŸ1ìÒ8~£à7)¶´¢5ë›®-ï`oƒFzû侫ø…~Dßh…z©… uhmÓï½c>k×s»@Öõ¿Ó†´s‚ã­=ÀŒ;ÈG„ñA…-+»þ‚hãà ^C¼ Yñ”À^ Váuhè·c^˜µÉ` ãñ¾¼O‚ñRÖ¢"}1°EÔ_¢1¹©Fú)¥::ý¸Õ¯ñ endstream endobj 3010 0 obj 4484 endobj 3014 0 obj [145 /XYZ 40.7999999 559.699999 0] endobj 3015 0 obj [145 /XYZ 40.7999999 559.699999 0] endobj 3013 0 obj << /Type /Page /Parent 2 0 R /Contents 3016 0 R /Resources 3018 0 R /Annots 3019 0 R /MediaBox [0 0 595 842] >> endobj 3018 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3019 0 obj [ ] endobj 3016 0 obj << /Length 3017 0 R /Filter /FlateDecode >> stream xœí]Iݸ¾¿_¡sË"%‘°»Ýr`¸‚O&Á ¤3‡üýHO”úµø>J,.ZZnÀ½ðq+¿ZXE~üã·¿gÿü-ûøðí?ÙwýýáÛ¥È Qôÿ²îëÃí¸ÊKÞÿ(Uó¦û—}ÿqyÉ^._/_Ûÿ_.L\+êomáÐEßàoß½|ì;¿ôùöðçö§ÿe<ûSûÛ/Ù_ÿÖ~ûI·×}àÇE5¢ûáßýŒ3®Ú_nê ÿuùËï²_Û!¨k»Ýÿ˜¬U-üÆñ2Veׯ۪¨³–X¬Q¼"ëþ«[rü÷—ŸÛÖÆaäMŘ•,·*y׬hTÖH‘ÕUa4jÌmYS̯!^ðR†h¨ó›+*ioŠHz^”Š÷Ó¬¹/ÅÆ¦|ªË2LC݈˜ßÔzÒ[šbñ9«…\¶?«¢ìu™°ª¯–æžr%nÉ›t¢ý%Ìb¶#b^3–µb$ãV`hÉ›pR ~DaV¶D†Ÿö·ë$¹ð&üД/½ZùÆÂ¾ó›Ú@yÜ•ôŒóê:ͦö%ØÐ’7åKFx_Gļf¦ o´ô5ˆ6Æ_µ±KÅÏÏ—O¬*U§|>ÿÜ!ݵÓë·çv²uö¡ÓÊÊ*{þ)û}Q°êÙó/—&¯›RÖ½Ê;WRÈ%–~8*áŸ`ö#`GXò…МOÙÏçËsËÑW¸.‡^öÚ°¡×§c­j KŠŽMÁÖ»ŽÃ~ŠÏî#(p \ËN%ЀÒ‡(ÂášZöãçt;£aóã974âr‘p…y³â6Bžˆ qS¡ZwjÅ` Û6ðN‰ï’ãæ—+ÜùÀëäx×öZzí‰wÇû¸r¬ù`ÛÙò²à'F¦ÇÈ2á «ÑNˆ‘Œš(Þ·Ðf´ {ðŽ‹w­IŒ¸„€6û,)j÷’õ¥eµ-£Æ’ ï,(©0*®¿Ú”ËÞ>˜4áã5R¤Aüö[A|†)²ećÜw"þñÿÄõñ©ˆ_Âù$Eüzôû®Žø%ÆNHßó4kÛöÇÑÿÔñOÄß¹Ž/‡•õ¿‚ýœˆ:~aŸˆ®vèh•õ¥Ñ;B|8‚¤ˆßŒ'¬«#>ƒ­mÀ«“(²âhž }êø©¢eÖÇÛõKÞâcÞI‰øœ qùë#~¹e?>°DZÍB(Ù²ü8â¯/t4)ñŽGâC|÷UÑýPo7 cy] Õg ÷jJVæ%WŒß|”÷+¤rÕ¢-¸¡Ÿ4ÂzqWmÜ|´'K•W=UnJjØ<®#` ®ÇÆ Zô;¶z­[ 1tÄÝèý)óÂà™`œÑÎ`²š°†F˜×9 α'«‡‘¿–|‚“ýŒ8O‡¬Ý㑇)-?OÆX 7û sž5âÆxS·‚ý'.¦C4þPL»)chp¼Sb´jγßû"çLMZ¥L RM›ð ÿÁâWmÓ‚ƒçÆòAêéV#n¸ŠÉɆãïNù€áÕ–‚¶ÚÙä´–ŠaÎÀ|f¬Á´ÎKæÉߘÂÓNûëcéÏ¡‘åŒnÙ‹=†3>-™ùB‘p,xa2nÄ ŸZÎ/†u´Á¹Û`;Èì!_(heÁ1ƒéÞ+\FJÝý -ÐAÚ3š³`ù7­íÕÜ£-WÒ–Å@ÅFóµèÿ½–ãÊzZ"Üë°GX§uªA‚ÉÞèí¯Ž‡ikz«²"¯¯âÁ0yT^ée}íç ¡ŽÔ57ôd¿ljµ4ûœ¶ÅÙ ³¾ùrð IÇì’º9[v¼oÆâŠ&¸„]_‚ßœ„¸°Î-ŽÞ4²æ÷CR4}Èž²êcÄhí>» ïÕÙcvEr^ðEnpIpŽT_BíüùÐÒŠÉçÅi;½8-åådÕyEx4ŽM5M³Â+\Þö:^žjí,Áï¸NR\®Céó<\K|Ý[°³­y«Ç˶7Fi…å0Æœ¦‚wÆ.ù…’ü1›`߯ªE5]xdðÙtsJŒ ÁUöîM!½,q¡5rÂ`Ý×÷(WÕ„†›;ÓºaÍOð£A½7aÀ‡F·<÷]ú„+C¤ìÉ'ìçAáÚi#”í6®cuá¶ ?“`êíÐOùD¡b)÷CÅøZµ:øž8öÑŒƒBÄŽbüè?˜4ò;ˆˆ™  8|ŒÎ‘â^ââhYN‘c@ê&ŽðÍÐIÅy5 OLV1È‘SÎ9ã²Î¸¬Hë¸=»6\Ö¼–+«áL:ñÅAif7ÚíÉN†V/±¥°âŠr‹Ïñe¥plåTü<­¦Ùjt*”Üqªâ’r4EeVÁ6LÆ©V¸ìçZ)öÑÅÖÁ×`Ÿö<õ–¢úâÝèÁ`!T‹5K¸=bÁ x ÖÖLƒ¤‘lø¬'ð ¾ñ/9¨Ÿ€û.ëAÓx|ð)L®•C^§G¼p¤“,ŠÑä“Gž:f‡^Žó¦»O7WÁaÀ4WË##HdøŽ$Äfƒi`®U-¦r'ÈMƒ¿ E©¦8åÁ)VË­^­Á@&È0ö†6hC¹C&{eî¼05BÔéð0îq›1/ËÊR¼³>×}.Œ± `¹”£\¶ëó$ŠUTLSP¥l0 [c®‚B^‰²sD±Ê©+‰Â.‘Y¨!R<]²2—ß´ÀºÃÚ$åRŠÊu&¨î-AU©æíü“†ûÁIHøõJBQØw%,´ÞðL·üFWØwY*øö‰%é DãÃQ¸OqœGâÑ­ð[„l¸ŒÂ/ç±´ÇšTã«¼çµ ¯UØÌîvuÊKQÏSqýK(±„ð'ÌåGã1•K×jÌ‚Nwµk{;åã„ ·½`MøpçØ)CËÇ}Úa›œ¬¨ØìxNÉIã¾ÓÊÜÂnÚ¸ŽÀ 1R$¥Ž ›}¯*aY¤ÎÁ$ˆÇÕ@nˆp–œ:¶Óù XknT#ÄhWãÕ‚‰F˜Ç,ºüÁ(z"ä‰iTL ç7° 2V•ü‹ G$¿XaOME ÁZƒ3ƒ9ÂmmOæ¸lÜȱõ‰¯ñyÌ7äãÖQ¯ôh¦O`•8ïg»$uìú’¯Çó %¼ÓBŠU÷ˆésÉãp͆ˆP÷ÉŒe äê1Ä‹ƒÌ˜}›”kËoiuÈÉ>Ä ²Qߪ'")ñ#µ>Ñî«3bÐë](‘Ì•ïå,9{Ö¶W’;%™ß!k9Øô Sñb¼‚ ¿}ÿaáb“ý‹WöÿjÝÖª³;G‰ŒµÓ¸÷ºEÃD~Õ6³r´,ôí¥Bäâþ9cSåÀ9Ãe.§Ê]ONy§¤_¶²Ìys÷âºÎE¯WN´{ý(X§uzè–<çEÙMY÷^k=»ßþå~V;(ïÌð ÕÑþ’{% ÍC‹:·:zÅ\æ®ÇvÝ\×ýÌk6¾L¥Í iöWøóäö„8žDYXbYõG´0?Xøòe>&Çë›öïµ¹ ÏC«—n+é…w£6@ïq<^—‡ ¯T!rÖ¹î²þ½Ž!kíUK¡€(ûzù?ãlà$ endstream endobj 3017 0 obj 3226 endobj 3021 0 obj [146 /XYZ 40.7999999 179.539999 0] endobj 3022 0 obj [146 /XYZ 40.7999999 179.539999 0] endobj 3020 0 obj << /Type /Page /Parent 2 0 R /Contents 3023 0 R /Resources 3025 0 R /Annots 3026 0 R /MediaBox [0 0 595 842] >> endobj 3025 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3026 0 obj [ ] endobj 3023 0 obj << /Length 3024 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ERO XÀ3öÈ!€a99ÞÝ‹xgùûQ·ØÝ3¤>R,)©[6à7[Y¬‹_ßýéó?ŽÿüýøîùóŽ_õÏçχ²(›rüs<ýýáõ²+”m»ºýéÏñë·Ã÷ã÷ççáßïÑœÔ?†ÆË+ÆÿúÛáÝøòÃøÉçç¿ ¿ýï(þ÷ëño~ü¤û;}áÛ¡ë›Ó/ÿRÈnøÏëßNÿ:üõÇ߆!tç~Oÿþ Ú¶lº.j߯Šóß×¢— Ä’B©æ(„ÆYäøïχ_†Þ®Ã(úJˆ¶©Úrv¯­¬‡ÿýtücYªæÇã—_}Ñ6u#ë³­[ʱ¥»}ð|þ º~ ÇoÔƒ+Љ·ÏÖãW‹Jµµö tKkô*¼¯òüA[”ýØ›ã«âü—Ï餂cUèiÎ"„6Ö„?¯š½â±Ú#òQíã—/ã¸LTªŒ&zipšø¨9­¶ô[ÔR Ô"*ØÛ3çÊŽ­E-²†- öÖs-R J´ÆZ…È ä^½¯D½4?€âêà^‹Ñ¡LTÊKžÆtE×—†ö©.êËn-Ž\$DQWM7<äPïáWMõ`S­EFº4!ïTmgòN€ÖÄ«Œ;ùàS½œJ’¤Ð [¬N`\M´»7¡JÜBж„š¶)†-Ž¡ýŸu ÚZP‹Hæ¬kb{Vä‹×3Œ"^ÈALø¡3ÕäzšÕÇ Þ[[Ÿ•z5ìwçmÎیՒj5«µa*Vr5T\žç+8YÂg^V±ŽXÍ:Þ%}ûþ2ï÷áÁk" åÖ)peOxaÔ¹8Ib~Á-„÷h'fªj‘?ƒuæü œ©CÎ rÊL-ºMÓwÍ–*¯Ø"'©öN9i_a½Âus§+¼¼®Hâu-?‚<|9ü¼O¾Üù%¿4â•xœ}ÂIF®]G‰WÁG·<¼¬düH7f+Ëëjj‘y…wÊkÊ· Z`c²µûüÒõ«‘Ô}Ñ:zpˆm¥ÞNm ‰— A7`|†„_âÅJÀSvm=¦zÃóñž;°5&ðÀÆHàùa†µ¢AƒIaA†æŸóS–Ë °øC…x9(B“OåXsrÄÉQȇ_ìEä„à_æs»ƒÇºù¤÷ŽÕ¡Ç”oÀ14'MeØŒ¨±‘CâêXn8^·”·xòJ6„¿Úòä‡ÀY¬‚ù<viáÙüÀ/« cñ¬æ3Vì@³$3CpˆéÖ-º¶m$„œ`¿¶oÞÎj3Ž% IPµŽgàÖe©ø7ÿàƒ· K –NX‹Ö¥‰\‘êàηñ–ƲŽCô¸%5©qÕ“‘~²éJc.ì€ ñ”C|”$¼Ñwžƒ,¤,²QLä¥,[ÐÕ†Õs8i•AQMi’>§75]×[ •b¡cp#!Ç4¡` &¦|×–Cß$öaUå‰Üâ5™qJå7öÅóYÅ".–@›E}²’!Ðw±b´@„ðDWðBÔ;E—Ýç¥Úò¤g;u½t'x çþ-„E¸€SÆÈU  "S |‡·D9“å½#"ÿ4#.DqP“{X´_ˆ=Ðdóï ñƒ wæ8îÊT•C’|ÓǽHñ¯Ã4,àge"­°|ä ˜‰XF:e°Š>e|E°gH°8G}5q]ߨߣ¹wj  GU/ vy!©kË}Hƒ+šK¥¿-³¬^3Þp)+©Þ.ÞòÜV°b-24j…³÷asJ‹Îœja»)~]oQudÒÃÊZ¤˜nop<×äÞ¸oÍ£®p}÷sHViº%Ò¿„Ó——Š%Ô/x«ß£` ¥j‡Âü¿KÆ t'¶"ã]ÕíŽf¿DXë,³«¯·ÂjO Ï[ëæòVìSî|vp&^!,X›c©Y±~pÐ`ýaŸ ýÍgmFî§Á3gFn„}­g9þ¹‘¶”—Ýi[›- ë3=|F‡šUÑŽò[‹Þ•4Z´5…:ïŠ_·H8‚Q¹ˆ²KÒZ&£.¤Y­VÇÂ&ރ烟¹±ž96] `bl˜Z`D]Œ¡94p¼¯á=º=£ù(×GÁõ)á3/áœ(àØ(¼ãà^6Õà9^kjùVȦP½Kר¶8¬ioŽ`WL`µ~—#Ì‘ݼ©„/|P1?Ò‘îruÀlFÏ’È’â™åX,æÜ‡“=ßð€¼RZˆF™&"S5 ŒW§n À·ø‰PæËURà˜fÙ~–Ü•ù'ÊÚ³ö¡ØY 8 ˆ8qò×vÚònS•8ξgì”Yʇ䀲,ÎcTàJZ—¯6Tvˆ{5Qa× €ØÄŠ"ÎSs§qDãð~ërÊÐ,÷Ì.}ê¹H7'àÈŒu£”~Œ¹|Œâ.tð´éCÙ‹9—c«‰ÏHw.Z¾ƒ”ðŒ Tðj_·nÇŒ{¾9p»II6ý€<—:FAîÕWH\ÛŽâåRÎdóæ‡ª8fcmÂW0×§#T­©tæ'¸…ÀÔ4ïò'ð‰K¶ä.)€Á¬+ïM1Ø6|újaÚÒ[›˜××øßÙDóôýãë7‡0ÛZ ¼iON=à|Ô)VsÃ4¦“ašbŒm«²º@_HÔÍ´wÖW8¦‘mÑN'½µ-ã(UÈÞàm­ê¢Ý乩÷tð™>3JW+ Yžo_ºµ<ÁÞF¦{ýÉø]mâ&fø‚žÑæiªE yh%öŒ^±¹ë± ‚ëN¿ËZ´—^µÔ¶öû*`Þ| /Àšàxea‹cÕ? YÀüààkÈw”ùØ/ìrž‡¶qa+é…¥Q;S×å™…ã»®l qŠ¡N²þÔ‹!¿>}ýÄiŽŸÿ5lj@ endstream endobj 3024 0 obj 4240 endobj 3028 0 obj [147 /XYZ 40.7999999 138.259999 0] endobj 3029 0 obj [147 /XYZ 40.7999999 138.259999 0] endobj 3030 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 389.779999 545.759999 407.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 >> endobj 3031 0 obj << /Type /Annot /Subtype /Link /Rect [280.800000 172.819999 395.040000 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search >> endobj 3027 0 obj << /Type /Page /Parent 2 0 R /Contents 3032 0 R /Resources 3034 0 R /Annots 3035 0 R /MediaBox [0 0 595 842] >> endobj 3034 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3035 0 obj [ 3030 0 R 3031 0 R ] endobj 3032 0 obj << /Length 3033 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘EŠÚ€ Àôâ90l ‡ ‡À“I0âä¿UKµ‘ú(¾ÇER5Ý€»»Ø¢ÈÇ·ó-þøùïÇþ÷øáùó¿_§ïÏŸeQ6åøïxúúáöÙ•l»ºýéßñë·Ã÷ã÷ççáÿïѼ=8}ϯ'üï×߯—ÆO>?ÿyøéGyüÓðÛ/Ç¿þmøöÓ4ß龺¾9ýðëøƒBvÃ/·?ÿuøË KèÞæ=ýÿƒh;Ù kñYÇ÷Ë£âíëöQô²XRvµ< !‡uÖçÿùÇáça¶Ë2Š^ Ñ6ª-gmåyÚ¾mŽ¢/I½9Nå9QU*d¢f~[¥jíSqA_‰¦zÛæ0¹/ÄÎSyƒ¾6d¢ÓŠ„ßÖ&Ð[¦bƒ^5ã6ëÖwŸç™¼v¢ê V$¼vv<œ‰ ÷ºiÁý<“7¸ˆtN+ w8îmßâòש|'ê»@'xZQ.o™Š z%[5ryeJmÚF/SùBLÕ¢3ÑiEÂokèÍ©>Q¾äUùúnyðéËáÃG¡ªî¤k~ùyXÉ›Â:~û2l·>þpÒºúøå§ãï˲úø‡ã—_}Q÷U[î8RJ4"„ÏThD4ð™8òJOGÊ®­ƒ³)ø á¼Ã¿'”¥Â˜Ø†Á+ð´Ë'¾Á ý<‡Ä*üŒe?«ÓBØÓÆXUûyý2põØ<º/UæÑ±x4Æ>AÇÿ°øh#™GoœGo˜’¯†zæëqøºÀx‰aŸÁ0È|=óõóõ-ÓÂCòu%ýw—f¥È(’ Ë“,º‡êYã5Ä,6.‘/w—·fn÷ž¸Ý†íZ‡ÌÜ.s;n×÷™Û½Cn·ek/s»Ìí¢p»j¸ÿËTå¸ÌöâU®èú²‘õíbê·U¨q•Æ2;G¶E ðbndÄ%uý@¡÷ÉÚûD¯/¾FŒûò<íu?cL¯¯•3+ÞŸ4 í~(áYv!GB¯‹Jvâþì}²½“LÂ\ˆ¢VM7üµ.zšBŠnM,ÇÆYãsÞpŠÀÒ¨.‘Â#°˜ÁÏ<ÅfB•:<ŒSÖqÇÂH õXÏöŠh‚EÙ˜\ ¤iBU:ë †ÅPnTºà°€C߉Á¿MÞé߀< Ë1ï3Xf…iäå5§ç`¦ñ>ŒªæBÚR¤»î`41Ë]Ô˜j¬£)4†žåp¼g2 B£eHì—¯db슥)” !°*ãY¬A{ŠEò(1º¦Õ…<²…/3D¸å™Ô&ñ>¼hC×qÔÐôÍÙS¨¹}—ÕÜ9[»÷›ž³0¯æ5nJÀa“‹cY„íØ—€"ÝÄÿE{!Nø®‡h£oV„eÄÒ."Rˆ¬D²µoÄ•‰g†ç mŽÀêü°…žøjËÍû8&þ¢§Ìä0z†—ÀZ1ž2Y Àâ€ÃB¸Ý(V½‡ÈÂK .ì']ço;†âµXz_D‘Ôêí’H2àC@3ÌÚ8àA¿&;\vª$9e§ÅãIŽ\S+t°£‰µÅÓb ‚Cï“¡ª9ÜZ‘Ýà<·ò:jw|óS”=‚õ²‰S½@" !Ÿ-’ Þ|Üqœ—KL"â!‹ºÖNy5'Cj ÑË©a¸yö±ƒœ$(>7 ê>µHÁr™ÂÇ‘µV†'mWÖÈc†ÍX4Ë$FyDqRw½&N(lÈÐD ÿ–@„xkZŠÌÀxÖ†Û‘Ä Aù Vd53ó 3ód÷BË;Èqó¢,šVÜ›ÝÞ'؈À ð.8+Y=Ðl-ï5Cae™…™™1}0óY¼B7?à‡í̉Ûße`Lö¯zÿoø¾ÑÇ—krC‚d šO_)d7Š€P/ ëê²€e™dÏ:¯‘<Æ!äÉ] 3‘߈½ ¡"ºÔk(V·œ'úfzkÎ6.C×2+á¬_ p^(ÜÂ9¸ðL^†ÎêõbÞÏHÅ©™(¯Ú#z˜DÛ’“ÏÉ«†YÚœýp²Á-ï g·[fÃ0ÀUàùàµa ±œ§¶ƒï$£’<’G¸ÜjB)k3H‘{LdÝÐW7”™wfÝp¿º!æxa«trôɬçe=/<äÈFtÃ*÷¶Éºa<ÝpÓ•7<’uìruÃ-Ó\Ö[ƒScy¸‘è†uî•uÃGÖ ÷yßuì>¤n˜ïï³~œõã}膗Z‡Y7̺¡]7T¸wäľDz6†vúh#[Ö e O.lWUˆÏÆ©±Š!Š%%^–ï=s>ÜË`=sr¬•lYûÉzQÙíÈFtÃ>w5κ¡›nˆwjѳž÷xº!§“Æ7,‘±ÖÈðýl@äh§«ë†›Ö³ž—Gpdºa%.oͺahÝs{å!„NÖNod˺áÃÝ)¿Çr x„q«½>çÃ]Å-²žÅÂÒŒc¥d4lG7”çâ»Y7 ­n9îg}îý~ôVNÄcÖ ³n¸_Ý0s>+¾å˜Ë¬»ïA7T]Ö #é†ïGûÁ°® †(k½h()1¥cÙé™…Ùo¸mÝðÁrQ,ú ƒ÷VøLså|CGbpÿmè†M›uìzê†yä=醜ø< mc:…ØËñT<œF›u©¬K呇I¡.tTòœˆ2‘ìLs4B_:³×bïB#J'ÑèYf]~Ö½‹¥OK2J»¿Q´tE×—Íý¹Žè'êó,:cŸÃ…'tlj„,Ææ\¦ŠáÔÑqmþ¼NÖ N—=F§2LíÆ¸w.æt:·ôé"t $t5z|vtàNÐäîx1EG¯Ëޏl?nÿ´Õ0s¹i¥BŒÁ')x¤½¬Ï¬‘»4Çä‘}Jhtú~\UFEä‚Ýw ºOó¬øúAõìÌã8òáSj@ŒÛ¾ìuëdúÃUÔ͵XM`óªµdG˜Þö†*…Ÿ]ÉÖå¿å}î–³¹÷†Ü–¥Ô!|šÜ³[¿ƒ½»(ó訑UgâÂŽL¢4>0šicߊ;¾í\;˜Oî:Eû!8="‹ìHØV[õ¹úÍÚrhA-ØÄH-(shýrhA-È#9‚C ¦gâ»Yju‰9=³Ç¶©ï/šM½;„‡ds>-›‘dÃ!Ü”ë à0!ÆË«ó)aë“àYåxÔ('KpE¦‡]¼¥qøÜø"¡5xÖ§d!DLø†{“° ÷ÎñãšF48†€‚è‹^*Á! ˜8–=Z!œQ¼6Y&ž~ž{_öíMö É[ olâ!®r–ï¡§ÂÑs‘>÷š„¢Z@õº<‡ûK!ë.ï :¡Üg¯ÐMÞå+o'Ü®[ø3æ iÈR30‘,^ö˜'Ä •/L H2øcÊk‹¦Ô€8炎8ì¢Ã9Ö©œ‘–Lwì$ĵ˱s?ƒ]ϸÓ)†5v Ãýà«ÁÈ¨ç¬ l…&ì­°«ãÎ.a€) _­%Ë£ij¥/ÓÁÙ•@ÀZ8aÓkKß ^D8Å(‚äTpBs0ÕÔ?—qï×ÒAC>¬1ÄQ5NK¸ÇKUÃ3Šn?Ž -/SÂtY4­¸èxŒê þ•[âZ*¢’Ú‘dKeRrÊY¿B*ND Ç—¸L,”K†ÊŠ™6#ÕÕXkäðB‡Ú^ê¸IÃ'uþ²zÖ&¼q VÃÖ õ‚û¬Üï"ÓÆŽº8KaõùHEA‚^7œÍán~í§lT'DVùÜ‚»Nƒ”ÏITts;EE”O÷Òq `XÀþLVȨ•Í2˧×Í0å•1‡CjhbÆñr˜«!Q9 Œg‚ÆûLÜm®À2!mk>eW°áž`d¾fE»B¶½F"^nˆ< Kœ!š M¹^Š̰ÆÝ,§¢y¸Áý•¶Ø“+žƒ£wI]ÄDê~÷KàËZN£h%¦ä´c7î—´˜`\Ú‰”G“5©Ûs¢ ®­jÑlè;]ÍâÄq2îÓ)~%ìQƒuãhÛÀ—k!J »`Ÿ2®ì®uâÀ†³?†‡É¡®(9ÏÅO¶~ùÈ؇J-®›2ŽåaÐâ±{Œ€Jw7Þž»|_üh¦XeèAš´øÐ'Ë?EˆÉ"?>¥!vp1Bp…¹a‹“`LØŸ»Ìº± øºBvêyŒ‹‘°·UqA‚ôCY£BΔgp#4Üy›ƒ*·Ú]Fâ+îmR¸áßA ®8¼•àV ’ ¹™Zå{:%B4é¾%¨ýî D”@øbÒ%¶{P©Cß=Ÿ0ä(Ûc•Ô R±Z!rŸ”ý87h FN iAmX?GÊpDnQÉÆ]ˆe%š$@ßHĤ(ÓËi¬„53Ù¼ÏÓb½‹jÙüõ©ÛêS™Ã½¬)yÑÞpÞ—(û]•í…Š£xêSg³að)æíU…ÀNHF'Ø¡kg‹ï³uÜ£ëú1[yÅÊ ÞÓÝšb³¦¾š``•ÊâÔÅv—¾%W·k›¤ª8é¡V±JH`Šc”X¥h§AJÔp¦_ôfRº=Fáü<ê*R¤ç’ºj+ еËÕÅé꼃s+åÓÍuEñÒËÖY¼„)W³£Þ씲J‹%ŪÍ$u'°e/©:«ÕÑá8~L™q넟q°n=ð€ epxe˜FTîïUó}U}Þ+«Z£ ÂtŒ Ý₎gÃA·?Æf$•:'1šÄ»Y°a%•¶0KD5-ãØ§í‘òsövìJ„P¬/KXHŸRç)ˆJ‡ˆ³8–-'Nhëq ~îYVÇa‚ÅI¸Þ“!½N¼^Ô û†{?vd#‘ÐÈt ø\ z\—Q:1lC÷ÂÓaŠ+s|„~åá§eÉ GŒ¸î¹“Žo[‹k;YLµËXE,æ;fJ/\¼D¬GF—[¢W:šå«hªÙ®wÈæŠs¹ÅPô÷ßíå,¹ŒœÂÐ|ìÝnN8¢ìhd•Fv„>¤Lbœ#ЂwŒ4/F3*BŽ¡i.„ÌOtØU²xÛF¹ÔM˜eëJ^dÃqÎb74£ä™„Îæø- {)txˆ/«¨¬Õ¦‹£ ³¸U|C£¬¤vÌ©î%“Åt‹K{M5¡ÅÌ=8=%Ž‚ÈNl¶â$Øgºs¤@²ÕÚƒvEsW‹Xái2WY‚*Nø]‚R*µ&Âô÷rg „° à7k·@w@?q‚¶p‡v=…4^¡Mñ2.Öd1ïB Š}/=5ÂRLGY^òt"oÒ'võíÐÔÝí¿>GÂ…fìp~‹ „ØúD~,f¹ÁµŒ Úá;´M£cf´q8ôi ‡^ö¤ô°Nt8ï’8H³pŸË[N\JX²£»™ŒÈ t6í æü'}¹ãVEuÞë•®GðÌØ°è9í²‚'VÃéñ3 ÁÏÀµI½Žo%Z£Güš©˜ì š) 3 §¤UjP’zòíÖÔ¦]J÷]˜¥‰«ùÄ4U§‹ÔBKÊ 'mÎçVÊ'Ó)Q.ÑT²}ŸŸçÕ‚FlHÕÅ¿ Ä¸_QZS\8‡Ph°“Oá+J¿6æ(x­Ab+ƒ(«xõÀtqê™oH(î4Ô¼ë+]?tÏæ· G0n? hlW”EÓŠ{†|î×0Ø÷ŒLd–Aʉæ P GuçC†v‚KÓ¶ƒ;JT ƒUh… + Õ±c'ì걆XÃÙ8Xä]³IñæSPŸV?›ï<úV¥8GxˆK(R9þ».Ž”çM·µ>ÒП‘>,° £í4pL¶€h‹^Þ‹¼«0åšacÕ…Ô]=94Eõ†F¦cmæ™ “çž‘ð¨&+¨PJ]G>BàÂýœ}—u1bÿÍÈGøžBàŸ(¤Öã ²àÙ®­ÍôN×¹Âý`àSÀ7IjY«{ÎàA ìZ~_"dë—@ˆ|_sõ#ÌG÷Þ°Ót3¹©«)t‘tÙ! aŸ˜:K¤ž‘+‘8`EŒS«ìt‘çâ9çŸ-»”Om¯\'Ç‘ìPb#H©­8¨¼X.Çèî“üWd–îŽë:Ã+Q¯¡˜ìb?_UåŽò·k ÚQ¯ÀRé+h=/KZ¬çUÁóÁ]¸gãÜOa`é¦Î8mŒñ–÷@úát> endobj 3041 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3042 0 obj [ ] endobj 3039 0 obj << /Length 3040 0 R /Filter /FlateDecode >> stream xœí]͎ܸ¾÷Sô9€e‘¢H xmO€ <@A7›`‘]d²‡¼~Ô-©g†ÔG‰¥"%õиÇf‹*ëŸÅªüö÷ó?;üüí?çïÃçço§²(uÙÿ9_~>¼þÙ•ì5M]Èöòçüý—Óóùùôxzìþ~> }}pøèÇWôþöý×ÓÇþå§þ¾}þs÷ÛÿÎòü§î_?Ÿÿú·îãÇa¾Ë~95­¾üòïþ!…lº¼þí2ø¯Ó_~wþµ¡¹Î{ùûƒ0­j•ZÇóíQqýyý(zY‡,©*Ýœ…œu‡ŽÿþãôS7Û Œ¢UB­L¹xV#/ÓJ£Î­Ñg©ÜIµ-›J¬¨-ÏDˆÄº¥‰RÿTdÔ›ª¾.Ó¬Æü8Ój„5¢ä™è‘Xµ²ñp&2Þ-®‹¬Íjt 3­FW+ Óê .Ö¬lÄ;œ‰Œ÷V÷lÝÖ«Ñ¥yD]êŠi;ˆÄª•x‡3Qñ^ ¡xäÌm¦Õx Ó^ b‘3x&2Þ¥b’3·™V£K¶Ò$x}˜úð{ ®)ì<˜ KhØÅ†ÑaÀ6sž]ц¢¨•¾ìŠuØz ¬¾›A1µ‡6–ú`Aÿ<æb‹!‚Tõìd¬œ[ ö„òW¯QEYh#Þ­­ =X£às¹šÄbÝ!UÍ.8ïk‚,ÅX£HsòߟEäA¬CìLà‘ž!jÚ¾»ÇÅc%Y̾óÞ®[Øv¢H¢Ð%&¶€×yês¢´8*œà<«µôHœpïžsöãc®M/9xO7^öX¤½ᚆAÖÄðÝóW'¢“8ÊbÄ—Y,LÞãyJ¨l…ð@'ë1ºdm)ž[ò¡±}³HŠ[óYT¬Ûí™­‰n ~¤–áö˜Ë˜n±pªHÁmâ½Üa2Åß3Òáÿò='9¿,y»G2awgŒ…P… âuc FŠpc Ã0;µS‚Ãð¼x^X³8ú”@!%OûÝ8/8a ÀWÁ†ï®àl¢š`¡¥ñtxÅ6oFÍìj\Or}lDÑojm‹þù³ûžË=ÙøÉÆƒñ³ˆŸ³e’Ê2ñðêrŽFøûÍ}Ú$1#V­¹lõðZ=|éj3ÔoDܬ‰Cªx¥àúDROè¢|ùgëwy"îŠ#ÀªDÏH[eàlõrÕzvO¤3Ý#œ0²Üa8! Ð ÓoEœÛIÕ_ýœ(uÉjÀô²aÊ|] KåÜ—Áu7¡¹lÌE1æÎx@&Ž(½SÙÒ;ˉȡî€Kò)= Û¦±ÝIÞ¢â”b¤„¢uõ§Ø|$J­mFrÔÁ×[6•4· ŒžR~”¢Ú¸D=¥È6OBX*.U1rÕb@\Sp€ùSÂâ{žÂ€^Ãûp‰=„À¡®!ÔÛ—Z¼·‘ KpüÌæen17â’µ¼eG+ÈõÛͺZ¢1ó|–µDÖïJK` ¡`ôvqÔ 9¦–ÀÅ‚ïIKÌœ$6JØè`½¾À™U°îнý³æìã¡‘€Ó–#ÆcŸ°\Î:B]ÒÍﳇÔtæ(Âé®âŠûæËÂk>ÅÔ"FXj„r¾™2rÖ´c×BLÕ†#•M—G¼Å#°¥oû %´’£DLâ[¯­ºÕñÛ_fôŽ‹'sÖiˆ\ËsG©"®ª“ª²ØãÐñ‹˜·$¥°0•3 æî•Ú¢÷îÝæÔ Íá´ñŽØ1ÍaÜ l7âë˜êØ­ vR™ÃlG §ág9:âåç͹6K¯s‰9#•{‹¬ï‘ŸÕmï3?ïšgö<‚¹Iá>¼‰øCp<~ö‡«êò{XvIí6ÆÙo¾’ð5Qºjð„fXÊ}cHÖ”ë;â}ÜC^=]Ð îc­q\ëÄ‘βbì”ÐŒw¤k[.LÉ€c*ˆ¦¶4ÄÝÝYOÔjÌ{­p>j¢lPO-ÎÅF μÅg{„l,yŒ¿Ž`s»p¥ø,CÁÝV6V3wÏ#”,M^ªšÍ„L#´ÎÒ!K‡hÒá˜!÷!ft)çÍ¢Uu£‹6ÀÉæ-Q‡Ï[³óÙùL’"EчÀ1Jea*’÷à«æÜm~f¢_Vöþ¿¯ôðE¶>óö¹4·HÚœêøöE§çQóUs¾*7._õ5{ÙX9¦·ÓÄêë ½Úß#ÙëTðWum!,õ‰*)ƒö ]ÙDêÓtÀÜíû¿X{Èþ¤)ϯªæÖ¸#§Q3ê§yÌ«R¤ÆüæøÍ{?ìýKàÝì}2ÏWBê[ìÆÄ˳V’碽[ Qdk'â>Œ wÜBa¾ƒZ€ˆ`i&ÐÜ›p ¸ÏÛ§ªïjúJpV[N$ÌGª¼Ò5N+™ÙtSG@:s,È'ŽBÀ÷ÑE ùa&E‰`ˆ™Úé\ƒøõ«ëòkŒÓ×"÷ =¢]p8=ß"#6è1šf¥pÈ&N–ò %º¨­hòSä­ÍY*ž¢¦g1D+- q÷%_Öd`Ýk¨f3_¾WH¶.G.Ï$%[ vi¸‰Ã$(I’ ü »•¤{ˆ –9CCRÎBFi;Ž) ðVÌ>ÔCÂí+uÛt.°-)½ã¢l1#÷«—í! ؘ‚ŠNQIlçés~­Ô³HÞOL„ÕöŽ$Æ©) ca×#å­RæÙXO¨Ý*QÛbçNý^#*@T±ßÆÅª1u¢cä®ð,Ç®; ŒdAè„wµH™¦Y›ö-<\Wÿs{½Ü^Ï‹ÑíÛëáë1Û:ÉNï«…ÝIÜævØY -ÃN®‰ëƒmûj¹Ç”Ĺ™h'†u=Þ[ÊýNÂ;IÆû;§âLh‰TLb?éäÉÛ‘ö1ûû”Êß“øJI× c)ƒ¦¬m,moä/®áþ$ë„I€àx0pºïÄ“Ópù]K!ÌgÉš| ¸KNWÕ±9}s~ÎRˆ¨QSµÿ"@p—œ®ÇˆJæô}óÌ1G0Ÿ%k F€ qc°0ÎÂ>ñà ¤àÀ6>š‚#xHGF„c}¤À#ø¨ ãÎ&álžã9Ê¡-¥çN®ÀØ\zj&ì߈[ª#¾S˜¦ñÜ!¯Øn~í=yø€éí\öWê=Nåˆ8Äp§Ç !W‰ðõ7úý™ à Òá•Ñ–ŽðTŰÊÝâËuEnäè!ZL!gdËëˆåN’øÙÜæH”ùàH£ÇüëÜÈ6’¹í!³}&óܺŸós':¿|aøøþ‹G.¸¥|(^‘â}tV5ú,ºeL]÷k….® â|i$õF¨k]èis¿U…£*zF¦0ÓwLÍÄH¯‚«ªíd)ݺ.t¯=ìm›zOŸiá3½5²eu²UÑÔl½|ý?_àw“pb…è™A@M´ŽA@…=3ìXÈÚØ® °‚ê.¿ËZ˜· §Œû>E L;Ä¢xfáˆg׿ ^Àôà¡kHw”õ¸?˜VS³@ªÂëL™°ƒøÂÜ8¦(ïËgŠošRâRd’ô§^ ÉøuIÅGN t~<ýÈjÕ endstream endobj 3040 0 obj 3685 endobj 3044 0 obj [149 /XYZ 40.7999999 506.899999 0] endobj 3045 0 obj [149 /XYZ 40.7999999 506.899999 0] endobj 3046 0 obj << /Type /Annot /Subtype /Link /Rect [206.879999 420.499999 266.399999 428.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions >> endobj 3043 0 obj << /Type /Page /Parent 2 0 R /Contents 3047 0 R /Resources 3049 0 R /Annots 3050 0 R /MediaBox [0 0 595 842] >> endobj 3049 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3050 0 obj [ 3046 0 R ] endobj 3047 0 obj << /Length 3048 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ!J‚ñŒ'@ È!È!ðf,v™ì!?jIÝÓCöG‰d‘RwÓ<ía‹*Ö›UEÖÇ?}ýGõ¯ßªO_ÿS}Ÿ>}=4u£šéOuüûáò¼¯Ÿ>v}[s}üS}ÿåðZ½¾¾ ÿ¾˜œ ƒ§WLþöý×ÃÇéå‡é7_Ÿþ2|ú_Å«?ÿû©úÛ߇?Ìó¿ðË¡×êøáçéãŒ÷Ã.?ÿ}øëïª_úqÞã¿XßtMÇ£àx=?ÊÆ¿—¢— ÈâmßËŠ1>ÀÙèøï??³Á¨µd¬S²kVÏ:ü{œV¨Jwªêí9­¥­›‰ÅN¤9£™è‹Zkdçœ)ïZ7Ó"™ŒÆ×iªÈ‰kõˆŽ˜¥0§ E½b­—ÙŲüy¦hÌs®‰H8@Ä¢V6#ÏŒwÞS±üÛT± MÃò#D4,ï˜*õJñq™º]çi¦h„u-¹!bQ+;!ÎT÷Šw²mt?¯‡wøÿ¸ð¶^úiªØ‰:ÑÒL4BÄâ–v¢†5ÕoŒ¿yc¯Ž?};||aRôGçóÛ$£;ýø6,·­>ƒôß~¨~ß4âåÕ·ŸºnµèÚÉåFŽFøá30Ÿy†#Ÿýß#àHÓQŽ W G Ÿéý©€ßÃá{šOÀÖBÁPo?"0v0MI¹ÊÛ$%Ÿ¿ ú$N;h d3ªÝòÓ+O"Û©Vñö’Á¦ô&'tuc­õi‘¦è^ûª2felüãµ4ñ¤Í¯b&%ÒÛöž½[EÓN f·X^Õœõ 06*ÌóÏë‘%D³Êe¬n¥:´f6<²´ýÅ…ÏzÑÌzBÆœ>Ó:HXˆ`˜/æûLnÄës°4~Æš³§¹ ‡\˜ô³©dq2&Îzà ¯6MàÂ=HàP@P!8ˆƒy ÎÆ[‘EÔIiziXãa]jñ™\/®ëÍ ‰EpÊmˆ6w<ƒ­Õz¤~,üa ¦]ñze†§·ô–eóÀòP¬÷RÛÖÆø†-ƭê™T¨¤0_ìaòÖSZòõ¬†g%ñ6bˆ²ì­.M–оhÖšö%‰ÏeKv¦±àÐØ¬àý9˜:26Ïdâ·à]C†}m‡]©²‰ÙŽÈÏT$\ \ª†‹Ó¢2ÓæPVžÕIžyu†¢vD̃yÅrc~süÚϴ£ýmèCFf—ÎkÄ1[H² K æaÉ4ȼaÞ àDþŸÁ)¸!À¸æø™€D§ƒn29ZR“”–ŽáPLÈ÷‹¾¶ß4·"!yž?«vl0,¶Wqijá.É'8“4å‘uô n½ó ’OÒÈ#Äå°X+ 0hëι·–vâãR”“­(gfök#ØÖ®TB$¤¶Ä°a{½¹Ç]ŠrRhÞ¨¢²k‡ÌQÆ]JàžGC;,ì4¸Záez¤u2epŠ>·¿KQ½RÅTµhAo9Ú5ÇŽ–€àEIÃr)Ž”Ñì'×Q –¦˜Ã®–±¸ÂC¡¥L¥§´R›Æbë˜iqj ­à2›xï¥*¥žâ¨ Û¨žb—»‰{)¹Ï’ûŸ)¹ÏýÄxòèuQ*É6Â|[*Éö[VÚŸkŒ‡öãÏoªxSÅ›º?oj!»"ù©Ž‹æBŠ´GPâ æÜXâ„ÇiB³6ÉîâS¢$/Ýâq@v=ÝbB‚$YD@ŠÃevʇG„ÎC®,XNÝ,Z’sz:( >É¢ZÃf§…Ir ˜Ê“@Hlñ]<5ïH’¦= ¿¿l¾‡¥ήì(ÓE™(w\jâq™$s˜Ø7 ¸ƒÆqÑDÈÿÄ··ä¿éG7Ú0[>jÁ‚7à´€Ç]SöûHörT†ý²\¾Îã¶K«nÀŸ#^Ôî+¦¯Q›«‰Úý)ÝÁÎáªfúó iN‹ïZsDù?Ãñ3¾g>p'ênR o#³§RKnŒ°‰0¬©§0ÐÅ3Ïh„½@ìà1+6nÆ›f›îõŒƒYæT-Fõy‰ÑOh6Î! ÞfEÍÚzÒÓ–Àú½®?ƒßƒq€GòG åæõ$YÁ˜!³!qà®Z0H‘pOoÊZv¾&ûaB¿ØñÃG“7é$'JI®]ÏÅ,°VìÓH®?Ù²ú—Ô’¸&1iÛ)Çî†(¦bw½ôY§ð¤ ÝtÚ\I‘æ Üe¨jÓÔiåÙpÒ ÎŽÃfPFPà?mÅM«MM[2 àˆ£0&ì1l8õíHØãò œþÇI~ÛbQIBÁîDkÐ7Åñ‘ÄUaJ=,: àÞ; ù­×|‘ßÈb*KÛŽV˜&hÁ‘–ו6@VuÌ™4è»ï}ë3á$÷o­8£J‘VÙ ‘neÁL•\öyÒòAwŽ…ÄÆ<öéñÙip”EùØx Íæ(z‰¸$¦ ‡F.vÚq2M¶Gloª²å6îWèçÒ¿ KáÑ’c=$aíÑüæ>«¡ló‚Qb m‰´‡b^Â@†gÇ—©ñ“ÇuÌÔÓ.FóÞ²“ˆ­†Ì¦¹ðcs/uã2È„@eª€$×Ó:Ä7¸óõ8@äQ®”9´\f’D(E§¬Ç+Kߨ§ëæMå>ð¸~ÆÁã-¬ËÿŸ×ó\þ"ñ®3 D"ßÉ2;–Ä(jŸŠ ŠÃçsm8ÕO•]n”³K’¬±@ë·(ùŸúìâ–)ILKšàÙý·˜g!m½±ž©é˜Ý˜¿ÝI¶!×1ªœ¤9ïàñ®/áL“‡ÈÕ Èƒ¡H¬ÄF±6G]:>»~cf“ é% ‰lVÀæuE³{Ç|1³xFB{ DoÚƒõD&ájb‡ôQâUÊh‡ipÒçv É¿w…dŸ ŽMËã!ÁÄe lcY×y˜¤÷Мý± JAôFÕœ«uwèÀ§¯9hM,xxë3âËÉ­nñ¿WÛT¼ÒõåâFP(†5¯Ø—ñ0=‰¯¯"ÝÛfNQ8 ·VÐ ËÆzDiú!¡°Ëg(5s¶¨¹:_¸#gê^7*C´OX•IiïõÁ¬¬¤i鄎¡pŠ ¬<®ˆ©šñ¸´4Q ‡Ç $HR,NÛ=yaô¥bïÔÐô›Uú‹y”œuÂP`ŽÒ¯ÝÝÉb®ìj82”w_œ­ÔDe6S¹y£ò‘X#­ÄñJ j°>º»üÅχ¯;–È ¼g ’cD;®pvØÆv\Ϩ+ÒZŠ™"Ñæ!e9;ê)ݾ0ygÚŽÛwv`ø™÷à3ظs ~žÎd×·-óXÇäòØmÒÞ±|Îß[!°—„ôq<å9+/‹óe„: s,¦~OÀˆÀr–‰+º߀¾ó%‡=³8Ä›ƒcáJéxy! ÓõÝûW^K zoJ¹À-¯[9Æ Œ,úFtP¡¹L ¢ ˆ#ƒNYgáq"ÃÑ-ç¥äóL¤V·üzp¶c’ ·<2CÅîø$WÎÍf/—M°Ãlã ¥šz:.Õ iWˆgƒíC`+—‘íed~Ž7Æ(va1Ô;\…ñy‡î.÷: ÕËð,ä´ëï•Þ笓ð{BÚ7û•û ÀaH[éí{@PãÍñ nuÜpX¶Z!²àhÌ»¤½øÏö8-•iù:H»”€ULÀ*uÕÝ2ሠ¾âÐ'´F·i ŠÌܧÌèãh‘™"3÷ÀË¢-¼\xyWú_â}$ä w#Y¥©•EšŠ4Ý;—w¢pùž¸üÎÊŸ¶·@´e&eVyäYóe+ò\ä9Pž‹œrÖ5Œ9+rvÇv3‰O»=y´ƒXÁ±E;í@n…‹ÔFH­ÔËœT¤6›Ôæ:n¶½­}0ßYõEÎPÎ ÿÏüß—:GäÿííLñÃ¥–5¥R䥶HSiâ¥VeOÒä8=€3åXš°×†iŠùÆéS¬ð}ê YªrŠÞØBoyN"ϪÔy.~ÀFz#§¤÷¥2©Hz±ÜÛI oJÍR‘À-$ãá÷i…óÈ3_ÁcEž‹`/ˆãƒ0 GTF²€ùÁÁ×ïBÖcs> endobj 3051 0 obj << /Type /Page /Parent 2 0 R /Contents 3053 0 R /Resources 3055 0 R /Annots 3056 0 R /MediaBox [0 0 595 842] >> endobj 3055 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3056 0 obj [ 3052 0 R ] endobj 3053 0 obj << /Length 3054 0 R /Filter /FlateDecode >> stream xœí]Mܶ¾Ï¯˜s€ŒEŠ¢( (P{í=0l ‡ ‡ÂiqP7‡þýJ#ÍìŽ8)>¤(iG^À;+Žøñ~“|?ÞüåÓ?ÿþãøæÝ§ÿ¿ ¿ß}:§Bý¿c÷óýËÒœJÙ¬Mu’M÷ïøåëáÛñÛáãácûÿ·ƒÐç‡_mãeˆ¾Ã?¾ü~xÓ~èŸ|z÷·öÓÿŽòø×ö¯_?þ£ýõÓÐ_÷…¯ÓèîÃoý!…4í/?u¿þþÝñ÷v æÜo÷ÿ÷ˆ¦rÔ<¾]_矗¯¢ÁZ`ÉZµŸ…íU ŽÿþëðsÛÛu§F QkU“{­e×mÕ ©õQ4…Õ©µ¶‰]ÅvT«&MGÝŒDÜÒD¡jwW4èÛ¿ÏË”¦Š]襫XˆQ”i@ßÍHÄ-ízÜÕÉè–1ª¢1ðsÀÒÛ_ç¥W2Š—®b;*etœg$â–6 ÃÑURt¨r&e»økW±U:^»‰¸¥]лb“Ñ¢§:ÕDƒþÒU,ÄQTi@ßÍHÄ-íz««Iìùl/|s¼øöóá͇¦³>ÿÜNãl`õ¿>=¨öÎhêøù§ã­•eþtüüëAŸ¤0uÕ[dC‹>·˜ëQŒïϪÖ`3BV/ß-Ï-õ©hÊQ¯¶¼;·¨çUÿà¤úo¾øj=ž OÔ¨k9b¼à€ 5~×ZBÉãΚqghBœ[„¼tû܂߱ºÏ÷ê@^Ÿ…-‹²ÆT9†^pÚÀ_µHÀ"Ÿ¾³÷Ÿ[þŸ‡›K©ÆìlÖZ<œƒÜ­¥Y‹ÇÔÐÆi@¯ …Æë]/HB&2îLj(Y!`FX ¬wí_cÂuìÞGŒ{Lt€ÃÕ”ñ¬w¡òddºƒ«!VÔûgù4Åö¹…nÎGªj}ª.ç<ý“/]Dk#®ßR7½¨—c´ßþ–ÝkÇñÛÂCtïŒfÒ~«¹é¥¹ã—ÃÛï"e¶P¥bÛ F˜2²éqÔœ*À˜÷ZÔ"ð;†- ö[ʰ7‰Z$žA g á;O°å}ø8%lÁã8æaPØòŽSÃY˜Ë…<bÌù°@’iy+ÉtyO’éj,eÚ'–$ë¾¥nzQ/ǸJ2-îI2]Xc¶$ë¾ÕÜôÒÜŽ‘G’éz—d»$Û%Y*I4 a°<ÜJbn¹ :Ì-Ö0âVkyOk5–èíKktßR7½¨—c\µ†)îiºÑ>±´F}Õ—^šÛ1òh £_«Ö d¶£ŽƒyuçüÔs+±F[ÖËCÔ·§g)'QvöwÞ ¸„KÁ“b²´dn™ˆvK Ybòi:ެ‰ô2ÈœLSÜZiÃÖNT—^& k8pº'°-daÙŽa@¦óÜÐ&“ ®¹1c!ún0¥m‹¿™[¤7Åx6ó«‘FÈñ˜ yT¤Õ/®MЮ ¸‘ÇJÊ–”ñì’ao©0ö±j ðÀÂX˜c\ëð^–püð»ALÐ~É6•M×o<'ðçšäð‚G1å~å“äÀaí* q¯l”})|0{¨ZÛsB¬¦ÁÝúQ-ÞO!¯fÙc«þòÔÏkÒ¾,À7’òd#DZBƦvŠI€µ%wès¿ˆQ’#ŽéGàJ…[AÖ.–q÷ q]PÕU5ÒD¸Q§“~ƒ`|<ì x Ê€å±H$Ä-É.]'hÊRD¬Û!ÓGZ,U+ ßÅõ!îÍaàÝ ÜW;öÈIí]òV~'•W1ÜMµ,O—÷Ë1ÌϘ’­…5aC:`€µ ¶^ðÜ ×bÞ\ž¶D; Ÿ©8zÃ-Œõ²¼$ì'…-_b_àÐÈ+ýtXcøÔ~Âï8vgØÆÇ˜Ã°Î“: Ô ZÒý¡c¿Ë2%=à šÇ’ÑMnKfoy Jv&åtÌ›Œ Àëad§Cëm2ptz7 :` ã=ÕÁÍ£?ŒñâÑæ»ðꢎX¦E|gžö‡º=Xœƒ”wd¹îVq–ZK}Ë'ó‡,ÔæºÐ€pø€Ì¨V Z€Ë!ÉÇiÇÄ0L÷Ë Î~Lÿ|ƒHQÈÕq2çk™3”@©Ñç¾ÜTc–\¯’xå™éf2ÉK˜Ÿ!ÆsL‚Ê™3Ply¿»Ÿ)SÚä!Ï”‘BÐ)„€m«†É¹åÓGzšˆÃ×€\I’+Åç΋3=€©®A¹œŽñÕ3œñv„kÃkd<ŽÃM‡Óc§ìú/Ì1¬±k>v¯fx±+.¾~gÂ.‰””Ó>Ñ‚v:È')píÌÁøǬ!ܤL8tK¤;Qc7&db^HÒ°óOj'"e L}ͤ‹aåkÉ3ÓÆ9L÷´-ÙÜ$© êŒî~MбÍ3;îÜË‹õÚå]£bœ¥·I=ËÝîIrœö.‘R[i-ŸðÆ‘ºIløÚR÷aX|Šqê¨ÇpÃÒ’HÄØTjB×îésíªuĺ÷ô9®Þ¶™>‡I¼ºöÝ}cª*ßÓç8)iOŸ³§Ïq÷¶Éô9”Üël4±NÚ;»=­ Go›MkcÚÑr[{˵8R“@=µ§ŽYƒfÉuO‚ ?` Áç¸X„£À´ ½íimzý!K/†WžÖÆ*ªhAZ»dñT8¹øÞ‘ŒÛ„a¸{Í)w¨ý]¾“YSèx¤˜â9‡O¦´AF”sÛQŸ}±ê¶)bÇ牎p¸åOPd ˔݂#b¬ðyköp¡ijNn)Šb:ÑQŒ,á/\¡63†qà¤?#ODðÕ„Þ´I+’PÇü9‚t=ü o8Ð ÞSF»ïù²E–T«L¿8âÇó[N“ïÏu]‡J•‚WîÍ™3ì¢î¥1¡­é„ NQ£:oøýŒ §)Åx§áÍ6â  ¶ÓßÝ`àtöXr¯Nΰ%½F¯&§ð—7ëŸLZ‘NWã%ÝJ;ä FcмQ»±•ÈØ ÈÞÁÄÇÖHøví*zþÿÏüÓ²Á™ ÊSý¯yûà·Ã'‡È˜GÖH›5DaSq–#,*kS@Î!œë(_~#‹ê–W{¢+åu—Mx2%¢^„8Nû-a(b¿%|/„‹rà¤õÅã·%ŽØb æ6‹¸G§ü°°ßA£Žw˜Â>D7žŽ.b¸„ñ`è÷¶¼ˆC"19A2Ñ5#](®'¤ ùés–Ãë·ø¢ óhWã롘~¯ˆ#&7)ñwÎØ4gè"œ¹Æ¡Ÿ‰²T˜3$“aê•y]ïšÛÉ›8rƒß.½[4ÂE,û0õá–¤º‰ÑåâåìÒÒZ?F*{êíú™Ê“AEåÊêÃìW}ô–EÚ•Å:ä²ç:ª¬Ô˜D“VL|°ïõ©š¶Ú:T(Kãí•Éusúõ¨]çÈ[ÃöTJZÓƒ¿“˜¹®c-FÜ‚MxGø*NúC¨‡ÙO¤DÂf‚cDº&1»`+›z„«k+Bž\ã/JßPTÕ`!•{¦—˜s\Þae¹wÜ)Ï㩲b‡Á€‹[˯ˆÐÓ3W‰KR·l-Ê~îëvë«‹y§¨Îã/eAÙ•³ÌÕ1“¤\ßfÎ*ŠÍØZ™»¦Ã–kÄXÝ=Ž-G%`ŸÃu ÃÆ¶.ç,¥’xK1õ‡ýÂ$ zhBuÁ×a>2άáAó,ë1'`h[ö >ƒÁ-I-‹Å‹d†ø%õ4·´±—1¶+µIQˆ0m½uEœ¢Q–~ÀvaúÔØÉZ>ܵýË‹3gaÀË¡ÍU¸¿­»¡C[ڃƀJëL`ÇtK3 ´ª N&C³ÙŸ§²X-à i|Š¢ æò[a,_Ù\Û@ꤥrçxmù÷ÛJ,eA;Ø‘q‰0ÚÎÞòx&n!‰K⫬í¸X‹|Õӌҗ«‰£6ˆ¬ 6ì°‘FD; U&î ÷F@çq üYÜÍÃ"9_[.›ŒÙè•‘¯ŠI31±¤¸òðš#F—Ïá#ð¬ñ88—®ÇˆéKHbXæªí“«Î ¼Gi¯ ¯®;WÂɨw«Bxil×»»ÞÝõîÃéÝLŒÉ¾Áô†3‘íÖBrka§ÝÆùáz\œÇ’‘0¼[2»%³[2fÉ8°qŠO†“º‹àÓñÝ*Im•<<Ž…±’S”²ÙmÝöX•íQ2y¼12÷¡ÌJq†Jæ ƒÈ ‹µÞ®‘Skäåñ3 —ÌïÐÖŽ|YÀà6{ǯuº ì„@ƈԚT˜G€ÃáÒ5WT‡*SRÍ€RnL/œÀƒqL‚HL¨LÓŒEÁ´Ò~µ‚Å=VÇI‹!0E„6`jçÁ°Q^ —Ý9ë⪛7A©¨¼Æ©ÐñJ1ÅAl9R»c×L&½=QFÂánK¤iÏ•z'اLC§”qŠË*=eägyqÍtÈ—œóÑ·QÚæEçš kH| ‰å2~Kø.LƒK°á¯ÉÛuãU$é±P…ù ã^cEHö<8iLN(<â+?ƆKZ¸ŠÙO8®m˜ëU¦œ,!/©R`X£f*ט Û˜êÍ›FÔ|–Óê2¥^bÔZye nq`?m°Ædç¸6¼ž¶¥ƒ;‰£üÄ%¿)½ËUrœ´øÁe¬¦ÈDŒCQ±îO[>Òd”·Ï÷J˜b‰-s†Šwê»ã y¢EpÆ~z¸ŠÓC¢ÔæŽ9r¿Ih~‡õƒõqrç°qV|71mÓþ¿µJ¬UP݆__¾:´š­‹guøÑ©¯z5©ÑGÑ.ãnA¡Og7‡cY¨[Tk}Ò÷Ü4êÔCÆR™²>Õ÷³ÕwZú­PYždsפªNº¿Ž~n©á8¾ÓÀwz¥]Ë“,Ê®iÌ"÷zëI÷å“'øÝ!/Î~@ï FÁ½Ö1aï  Yû0·3DP]÷YVãÃUÛã)‚0í@:ÑïP<YØâÀúâLº†tǬǦx)`/ªð:Ó9 c^˜‡™{ñò. ÅSè“è2EÞ%ý{×°E½ÔB 5Ðñãáÿì§} endstream endobj 3054 0 obj 4657 endobj 3058 0 obj [151 /XYZ 33.1199999 507.859999 0] endobj 3059 0 obj [151 /XYZ 40.7999999 465.619999 0] endobj 3060 0 obj [151 /XYZ 32.1599999 509.779999 0] endobj 3061 0 obj [151 /XYZ 40.7999999 465.619999 0] endobj 3057 0 obj << /Type /Page /Parent 2 0 R /Contents 3062 0 R /Resources 3064 0 R /Annots 3065 0 R /MediaBox [0 0 595 842] >> endobj 3064 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3065 0 obj [ ] endobj 3062 0 obj << /Length 3063 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨ó–ÅE Æ[€4Ü@A'“Á Ä™Cþ~¤’jõQâãRR™mÀ]]”¸<¾oãÛ?}þÇñ_¿ß¾ÿüŸã—ñ÷ûχºªU=üûon¿àº|øØê¦â¦ÿ9~ùzøvüvx9¼tÿ;0uzqüÕ5ž‡:üýËo‡·Ãà‡á›ÏïÿÒ}úß‘ÿÜýõëñoï~ý4ö×?ðõ ê?ü{øÀ8ãºûãöSßøËá¯?릠Oýöÿ¿aZ0Ñ=2o—WÙéßí«h°X\›ŒñnžM÷é¿ÿ<üÜõv™Fe$c­’m½º×–÷Ý*&ަUGi„Õ©µ¶u]±ÀŽ «›(fÄ–ÆjÙº»ª´â­lj£ág¥7jXzÅsW¡ ©£~F,liãv8ºêÀ>þÀÏkÒý( o:š«eGƱΨq[L NkƒÛ¦ŽÓ‘:íJÈÊÎû {"Ã]×lX¤©C—yé*´#c"¾Ÿ [Úò¸+"èE]K‡©ÝtÚg‘:êg…©¹º"ƒ^09‚>ÝÜtÚ‘Ô:NGýŒXØÒΠ·ºz‰¢úñ«ê÷Íñâ»×ÃÛOL Ýkº¯?w39©Ëï×n¹ÍñM¯Js|ýéø‡ºŸþx|ýõ`ªÆˆŽ{Ÿô롥樅ÿߨ…)øÎØòÑ[¸½1ÿYãÞD [$¶8fýö¦á;¸î6in¢Ž=}Çiýç&ðJñ -8`ðdpã{„Žã<7ø‡;' -b€õÇ׎'窺ýî¸*/k¼RHž†© ÂZÀYcÊpÌrb÷cì"s0âM‘Sç·¹ä”x—šºVËÔ„w ˈ±q峄ü ·d”3¦ÄyÔGUbg!­;8;j0pHDŒ ¢ãR'ÇœΚtž)7ÇŲ2G0€0e}"L&.ìvت¶ª­ €ÒSŒÓS ËëÃÊd%‡¾,¨ë)ŠÌkõ:—ÕÓÎà¸ÌÐßµ&b.‚\wĶëòc>ÆÌôÙ˜ã bÌ1©Baç |¬ôS1¸7HC˜µC8a–FXü9f@©Ñí0©aq3>æâ#+VŸ1&•Ö?^ëç†â\ °„£-îÍqÀ|cÃ&b€[0‡|¸¸S£¤…l&g3êh›ÂŠq÷ùð ðªì¼*ÆÄÛEj*SÑ˜ŠÆôr¡XA¶m@_!P …¿aªwÐ*Àá:«à¬1¯’ØÆ„ç†ñ€€×‹î¼Â]ž‰»dtæqyñ½¨èEE/*œ+^”É"²ÏàÞ¢Ím®hsOÊsjsêV´¹¢Ím®p®4Ú\Ѳ\{ºeª¶=-­¦òe|w}µ{‡-üñ(Á`õn-o}$FxŽÂñünJA¡õDR8j8€3~^-eÝ[°ž$‡§¶žÂ=$ æÿñ¶ÙqrnL;Ùéï§DéøC©Ý³d¢JHÉ­ä“ý• B¸ÛR.k*ö2û²eNÕïu[õ½ü­+­ë£jû_-c§JñÂtߨêD~u}þæËA5c†kÍ.OÉ»^äíÝóãߪí8y[7Ó1ºoºwîgÒ?eîz1÷cürx÷C¢Ò£RnxR¥ÜÁg0‡Åü¿ã¡µZËñPİ ê4–XpLJ,1”FiÄÚXáq@š¾;’x"Ë5¢|ô÷ˆ‚r§Èµfû 4íÌVßλË;¿åµm'5D‡t Ýâþ8Þ…E:¦f€¶K‡läT„íÙ™5•`H-[™|@P _¿¹y=ï)Õf6ÕÊŠ)Oz…Ò°­1ÔŹEŸ b*@)†“ì>¯ä¾1s}1²§²ˆzÍ<ÆÃ|˜" žÉz{¡r¬cÜõš˜Œ!±pÄ”Œí@AÆl{yBrygž¼™1OHÞNLý7SóÄé)y׋¼ãlž\̘'$çÖÜ2Oœž2w½˜û1Ò›'$¿Ü£”Æ<±aŒ´X¶k[G‚õòÝ!")Æj,Ecxõ(Ö¤¸î™ÍÚGظìbÞÖ Ûq,­œð…'½5&¥¡BMyk㈲ömßÜÌãX¶èkέ&Sø«ÍD<Œ…+÷P­7,ÃãéŽRÜëŽRÎéŽRMõºîKw쟒w½ÈÛ1.º£äsº£dÖÌÖû§Ì]/æ~Œ º£<sO¤;Æ8£;ìðKJHZIËd;…âw`€ãu3Yµ‡Æç¸X%ªuààôtŒ‡ý S°)Ícëƒ2m%{j´ 1†bõ¡xÄ=Í$q^Û`ÜqÄcRŸ˜²‡Íé}qe}%l#Äû¼þ©QÛr’å×J›ZÅóûc}VÕ¤µ„ô¦s!7|U‡bVqC*Ý8rÛ¶’ñ•PÒ˜î6«ˆ¦³™œâ„íÐÞê#U= A0„økFËñv'õÂ6á‘È“jżyr)1vq£D|ú”9®Èih™ÒuE#gf6²h86æ{I<­‡Ÿëd`K}–um3iáÌÿÇ8½3¾:ÑÒ&‡Ò•YÞµåg ƒžë-Úæ ¨ê~Ѭ9£‰‰„x’v-ÇÓä¥b³0%Ò{ý>.sOŠÁØF‹‚ 1H·UxÂn¹`²Ò—¬®=gìû• Íu9aŠ}ND“˜ËøÒÖzq>K"ð€©ã^¼ƒKÜ;Šùãq(ûíŸ×6#\ˆC²ãKð¥Z˜oP𵤯ˆfV[A3üRm7y¢÷¨JµzE¢÷æ"ŠY£˜5(ñip|—gr¬‹ÛEÚ,Ø<ܦnMãx̺Þ>çÀõåÀŸlÙW9`íóÈäY_‡ÅǹP÷.$oTræ¨iÙœ¿> NÌ¡SZŸ6a3n|}Pe¡]2ßLšå¶Ò5 ™“ÿŠgžÉ/Ÿ0´÷p÷Š»!]ž„{Ã3 D ás4®8N©êY°…‰raLF[nÄâ|Ö+|ÙRKžÕµ¬†@é©‹ïF­wfóp{4a¡+Rs=j D½¦Å‡¥DÉ‹Hr…RUÆ"{Â^PîòÝ“ö³¾ª‰y\ßàîÍ[,eqžÚL…ÈÊŽeóGtiÏþˆU=ªÛ‚°ÇÎa Ö¦#Q;3AÞ BuyŠÎ1‚gËËc1^f²;o¹{{(Eü°(îž’è™R‘€×™ ÿùù°%4Ú]Ëœ‹± Ï%¦g +¼[Ç>Mì„ûˆ}(Œ"Ó!ïÌæ]ÁþcL˜j!`¢_M\í…$Á0t°Ã¥Q ™&ÈJ ¬§Á:q.=‚À« 7Š's1Ì ⎄pÛv,P'sDH\INaøøºƒÎð8xïc˜ aî€[°Ü…ïäóÁwØ×„`R>|7S-ðøüF‡„¸Ý€díÈ{J΃cZGÇì…H.ÏG>€z®"v#„¸ã=ìûò_Õ£²dñ)]¿Xrå’ôˈôdîØ(©ŸµÂbž´NJ’ MÉË%›0ó8E1•b0X!81KƒÇ¹áÁ£|>!U53“-q}As2+F _v·|±'^¯šè¹B§J,W7Q V¤>ÝÆ|ÇÓ§*&)¦o}‘X’"éK¶iúèœj;¼"nÈV3™7Ô2;/eAw™Ï½ëbA×(>š$·¬Ãlíò2¢šMèøñï)Ã_qDÀQŸû¾ÍT‹*\dðá Ñ|wK"ÔœC)±åÖ!k9l¤¢KËÑ¿„|K¨‚êÔ<\¤|o…düoÜ[ÅT=”@ `Âýmº±‚m¿åâºÅ²hkfâÀ5‚‘Ä!£èi˜˜¬³þ#ÍËZN%NŒÄ"‡DÆ”\®ßD‡—œý’DZÓêàWpyx´J©íBŒ>~ÎjÜ^Ø›3bG¨óÍ$…î•âˇ+tS¸oá¾[ä¾Yð_ÖË™Á9ã}%‹ó)œ–³âÀlB:JÆ.ÎT˜÷áÝ&TºÛ€Ü»‘nݿ㷎l˜:‘ÁøëËWÙX_ ðÅI‚ÎW—oïSGÖ-cÎ+e˜ª†{íÄ…ŒAìJUjÞ dde²ámÕÎ{óÛ™– „¨ú˳Z»{ÓTj8´_[Z8ކïøÎÀtZ^ñZÌÝó=×Û Ní[ªçž³3+ü„Þm•s- ­cT%üÞwÌgíãÜN€uýgÞ°öžàdk'ýñ€aÜx0z&½ð`Lšî­c?ú÷†1ÅñÎDs™qÈ :xÖ˜öF‹ëÜÜ0tÞGÁo­kU±¾:æ,¢Ï Ü–›lú—˜òæørø?àZö‚ endstream endobj 3063 0 obj 4051 endobj 3067 0 obj [152 /XYZ 40.7999999 724.819999 0] endobj 3068 0 obj [152 /XYZ 40.7999999 724.819999 0] endobj 3066 0 obj << /Type /Page /Parent 2 0 R /Contents 3069 0 R /Resources 3071 0 R /Annots 3072 0 R /MediaBox [0 0 595 842] >> endobj 3071 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 3072 0 obj [ ] endobj 3069 0 obj << /Length 3070 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâC<È!ÀÀrr¼Ù‹x‘Éò÷#µ¤yˆýñQ,²ÕmÍžñ°E‹õ®bñã¿üýøÏߎï¿üçømþyÿåPWu[O_ÇñûÃÛ?HS)9ýÚ™¦’ýøuüöýð||><ž†Ÿ¢==8ÿ—WLþöí×ÃÇéå‡é/_îÿ<üö¿£<þiøß/Ç¿þmøñÓ<ßøïÓ·ã/ÿž~RH3üçíoãà¿ùÝñ×sšwü÷ƒ0Zé¦M‚ãùåQqú~û(zÙ€,Uk%BÈÎf@Çÿqøy˜íŒª×Bt­îêàY;9N«„>ö]{]cMj­-pªÔ‰´1<‰´¥‰Zwî©È¨oqZfÓ¥®s™)a]ÝñL4B$’V¶ ÎT Ÿª“÷`ÄcŒ~ïÔü³ðÆ0íÅ2S2 ;ñìœ‰ÌÆ,â'_†_¢n˜?B$Ò–¶`OEE½u{Z¦lmu‰±eªdÔ«ŽG iK›QŒzÝt<Òæe¦d„5BñL4BÄ"mðLd¼7ƒ~Ù¶T*¾æ©Rñ%%âGˆDÚÒÌ[S=±ÂòÕ~vZ ’†aaaLëXõQ Ç#áÜ&îÖЯ—cI³ Ô¾)AzoÅuS¯úµn¢˜ÕØY±Y†ÑA AD;VAÙf“Ý™-Õ$:v‘Ö²Þ‚ñíØy³©Ö³ë?ØÚ5ÂIÔ>ȰbtxßÖ¶Eèìp»¶gnc’ü;kû¬-ðë¶{¸fw–X‰O¬÷ùqËÈ(Д1k‰–Ç¹Ž˜ÓfR¿KcIìu§QJ$kŠŒq” =}¸ÉÁÏsV û¶ÝÆi ˆC>ûLBîø ëZȲlüµAcÏž]A˜Å±É­ &R5•éë÷>ïœÜÍ2ËëÈ'ˆÛ;hexÉŒ"lc& 5%ø@!¾¼CÞq‘•9ޱMV²¨ª[öâ%!\O_¯ÀÀ‘z±¤ºf5"Eü3â>Ó£gf ªê&t¿ŽÌb»Òr=rFÄb’ÈuÜçµ0ÀžMÁÙ&A#êjx3ò9x6ŒYC¼á÷@ì¼ XPcì`Œâ÷@ØTgãÝ9<[÷¯î`+ZðDRZ¡ü ং[ŒŸ³¤È#âŽQ¸©eë3kYÖ'!—»¤"Âx 7¼!°”8!øA–¿FB=æsŒ­ˆâ†cRpe…L)℞pÈ©`µÒ0Ò'H☸•?•Z¸¢¥P"zƒA·ˆ|7%BÎ!ø÷,EÚpd)úp-i‰Po’+ À.±;Ï’pÜ·Ó-Þœ¢Y©JéI@Ä/\í[Æ ñ™ÿ÷Ë¢ d¾K|E[ ¯^‰á1\çņßô†À#”c Éf©{HrU)õóX;CA“$‹pÒ)¾ÁQ (ùÀT^¥#PvÃoTqTêÈÿk±–LAe~Öˆ°@¦¾¨«vŠ+¿šMKˆ¸« (¹j7&šƒO&XÕX¥+>Ø*úü‡çZ£—·RŽŽˆ |Ð0‚NâC¨;ø \c„A©RöºÅÇ~1à{JõX|Ý@éÑ&QÀ·Ýzƒ²5s© gj€×'Jª¤ÚŽÕÈYþ^º@Œâ ØàÈ3ReÞͱoÌåËŠà)Æ,_º¥Û6\„“н”4y¸P÷;nzž, t æè5Ë!H ÛFøp­|XK‘qkPH Ê ÿ*~X«$E™\µ#›b¨9Rká’¸Œ¯5›!Vª#s‚F?r-Éïèwý*ÖuÎõÃN;k—¨R! Ýßö©-„wbÂ#¸KÆŽ `‡ l8Øñ¶Gßè—vOðÄ8¥JŽU+Q„A­OJ®—§§÷ÊjZÍoÒ‰…™~چÄ —ˆ’ÆRvë5Å:X_N;5¯ ŒZ Ï=<^§„Ç3깦6뽊 Þki8޶q.i¸³ZÈ9¿ô±Þs»Ä”³„¬í:’”1…~‹c$¸Bö Î&èû[¢fŠ*æ0® xÑ­~Ï'›4Ò­]'h‰Ñ‘HÑœ„ƒ7~æa-{àá•òÙ?9¤¿’÷†ÝþÛ€… 9Nº$Ñ{žÚ€Í(¶”Þ–·©$õÇå8¸`l¯áõ¥L—í·_ʨ)ZÝ­4Eœ§b7¬¸%FŠM¨‰T¼Å¡ ¯¹¦üÂIè^,ý´N™Bï_!„¯µq¤sàÈcü{uè„ÈN³âÀôq©™ëÝçg88£Ñð,’Ò+Ö˜üpe^D–„ €GHàÍÇlK!Lxdž  E<ÌfS^QÚÔÝŠ`0m+¶–v²]µ^x\H¹N @Ùáp6¬C0™:ät¡sVŽÂ¼¬‘ ^èÖ7M %á½Ç ‹\¨Ÿ(°my„tî«$Ut:aux Ì¥°°PáK&q1"TBWza$ä³brÌWÀ¸IÞ,5‚M(¯•|nb“<la]@ѨWéß8Li¬õðzìÐ,MAýÑ«ÎÀôB‰0àhe·.n!SNáïºàöFxõåÂîb>!Eƒƒ”’;—Þ¢2Å·ÁGž Åòú 4Úá]¦í#l|ÊA:ŠíMˆÐ`¹îð]!gQ, ÒJyõ¶Ì0JE(wM™CS¾4µ›ï’Ï^L*jÓ¼g¹ —醛x’ÐÏ•Kå¥!­½ÉÁ ‰K4f½‚”f¿wֲ܀ÂsSð~ER×îíµºº¾k r*)Ö¼Ÿë,­nö›®ºÙÎÅzm…q^쾃‚ÕB¨þ=Vã¼=BÕžÀÙýB-j(•~«zÄh„ùàÙk¹sv?NLPA\KÖG–Ç ®ye\}A‰`Q2´6BƒFñlW½q”‚(„Ro„ëÓïÁßÔ¿Õ±n,ñ}#EV7*MXoNG7|:‚T­‰¹ã Çè7µ•*¥º±¤E(›”:š›”]Jnz¯FrÚ,{5RÉ*k!_ÚÄîÜ=aD‰$ÿ†-©ìoy´aÇ©'¯©kù^@‰f‰­Í‡”~(Ì^)W®á¸j‘\¥’k|_[®²³(†õªˆ”ax¢Îqs‰Eey®\ð‘«W%KAhK’åø™’5¸EintñÞ—qì= r÷&z@š¶x?ÓBù=‡Þãq_œk‹Ò‹I‰~—ìÙ×)TZÒïEŠç½[ãYöD¥xª»5~ÛÖøð}|Èl ¡ñóoßtglýJ°ON’u>ê¥õÁÕ£(´I]õ¢­NÕcGUë÷ m«öüñ¤^Wf,¥%»ª;ß«;32©3¥*ÙŸ-lšªŠé^G:øŸéá3#t²’õØêþÍÈœmuoÿò?;ŸYágôÌ\jynD uÌÕ˜qÏÌ;³ö¶$PÝø»lÄ*T¦;û}:ž¦H³*Š¢ñß÷ÖÁ§øÙ0¥8žy@> endobj 3078 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3079 0 obj [ ] endobj 3076 0 obj << /Length 3077 0 R /Filter /FlateDecode >> stream xœí=ɮ丑÷÷y ³¹i!00е 0‡ ]À Œö´F=cÊ>ø÷'%n‘d†$’Aeæ{êº"KƒŒ• ’?ÿǯ>ýõŸ§Ÿ?þú§ßìß}agÖ3óßiúóü1ž¥0à0vg¡§ÿN¿½¾ü8ýxùúòõòÿ/¼Ÿ?´]:¦Áþö÷—Ÿ òó/¿~ü¯ ô¯“8ýçå×ßNüÓ寿Øö¦^_FÝOÀwpÁÅxù¡éáÿ¾ü÷¿þ~éÂ8·;ýÿ'>v]7ªª~üðŸòùüCva–äZ'ÎÅ¥ŸÝ…ÿøŸ—ß/­ùnœµâ|èÕÀ6·:ˆ©Ùn'=ô§^Š¤Ñ„¶mMñʆ„à’¤¡¹G¼Ž4ÎÔ°ÜT)ë…d†LÝÕ2̵TÍy©¢†.=âU”YÆã-ó½“Ê9T“雪mh`D M=âu¤9ÎãM;Æ/Æs¸¼ÁÑÅΟz-û‹ñ5 R“ù”ÉÃʾò=¼=áßR>ˆNé ¾Fz±—L^ºb°^`-ªøÇ¨fÄ£‡¯1W‘ëpÁæ'˜–ÜÀÍWãôZlÿUŒ¾´ÐO®ôÕ“å¼<9˜é•ïáíJwâ4LþÚ øLÒŒèž]º›”R‹4>´t6¾£Ôâ‚l¯!•s-­g¡ac€9À« ½bŠÍÀÎmZg\×ðÌñð>1½Ž· ý&¦7ðóÕÀ½ä­(ü"®N”ƒôxx–°NXa¶`µÒNöÎ"•Â[‡fN¯ HI© à!¥3°Ñ)-F©ÁÙ^-Ä–V ¡ñ0xµ ¡wV3°¦MC£Áu 3¯TõC›Ò+Q€¸hé ütJ‹ÑkpAþW‹²œ]¼ô8x–°Ù§û· ”¶ã^:¬ÃÌ…S&RRÚMxHé ltJ‹QjpA¶× ±¡ÕÂ@hÌ^-Hèà ¬iÓÐhp]Á3ÇÃûÔôv@Q!.Zz?ÒbôJ›’0’ñ5òk²ÒãàYÂL0éÞ&PÚ)§´H¬ÃÌ”S&RR:MxHé ltJ‹QÚÙP9°½^ˆ ­Bã`ðjABï¬f`M›†Fƒë ž9Þ§¦wŠ qÑÒøé”£·³¡2#_#¿!½€ô L0éÞ&PÚQ{ýÑ,XO¯|oÓRªƒ¦<¤t6:¥Å(ı½^ˆ[@hw9¼ZÐ;+†XÓ¦¡Ñà‚°áxxŸš^ ⢥7ðÓ)-Fï ÆˆÿÕ¢¬Cz©ôhtiá&h,X«´#þŒL{ëp .í´ !¥h|VZR:­Òb”Z\íõB¬An©Ðhk9¼ZÐ;)†عMKãŒë}ÎI0´ ½Ž· }£´´ô~Z¥Å赸 ÿkEyä>½yOƹ› ±`µÒŠ ´ˆò”V(-¤T¥xHé ltJ‹QʹˆØ^-Ä–V ¡ñ0xµ ¡wV”V!¾‚ÒÖmJ¯J qÑÒøé”£—sñ¿Z”ee ”V¥•A˜%ÒNkVé´”å]ÁÒ¥¤¤Ô Ï )Ni1J%PZ¢ÙTK«…ÒJ ´1½³b˜5m ®+Xúœ“`hSz-oAû¦¥7ðÓ)-F¯JK³2ö]ïE¹÷Qž%¬s4¬VÚQ¸‰¨q”~Jæ.í´ %¥cÐT€‡”ÎÀF§´¥d{½Z-Üû‰(s€W zgÅ0kÚ44\W°ð9'ÁЦôŽ@Q!.Zz?Òbô\ÿÕ¢<*©Ž@zb{½÷ ·ìÐô ïrxµ ¡wV 3°¦ÍAq!ç¬Ú”Þ(*ÄEKoà§SZŒÞž÷ÿ«Ey éå¤ÇÁ“TÌMÐX°Zi§mq©ƒu¸‚Ÿv’R4à!¥3°Ñ)-FéÈÆˆíõB<‚ÜrBã`ðjABï¬f`M›†Fƒë BÎY?´)½(*ÄEKoà§SZŒÞ‘ÿkE™Ï[ì_=ìå'ü˜öÎo}_Ôk.g¼=f>ôÙõÞ埦¥™{­½ÆEK1àé«ûÓ̋ǡZ°Õþ‡¥ðƒCäZÐP>iŒlÛª!Öâ»þÑû„”b¸oQ΃"Gøˆ)Ì}u?pÊcñ€Ô :÷y(g •ûadO /êüFÂR¢Ü²*&{`I¢Ì+œ$ÙuM³ qÑR xê•§™kˆó˜ºV­,‰ªäZÐPnGö@¿dŒIôƒe«î[”K¨ÏWøˆ)ÌõÊSεˆäyáiRØ#9ªO ñ-Õž1!¥æ4 M="9%$ié+ÉÉ="œÜócáÃß^~þ•§ƒŠ¾ý~éÈ|Ú‘ùëÛ…ØîôÓt‚O/NßþrúwƸúÃéÛß^ô¹ÓrèÌñH-ž°¡øÉço6çÈÈ÷æˆ@¿éÑo>¡O$öD¢x8ÿ}2<Ñè“_P ­I”R¼¥ga|¾äÏB¯Q®¶%‚Ù¡­á½.ÙH†š|»A‘˜ðz!·*0wvᩱ·e¤±sVvëûä*öPí¤Á÷U´¶Lã xÉÎΧÝ!¿5b¯ÝJ¸ÍæxÉ[:}IR'þÀKÒ›>’$b=+§¬¶,Úþ’1ž, $Ç7rt(šŒµ |ò&áZAàBóolBk»H+…ö>»ðˆx•"± é(èÿz«%î$LXךN²ô±gx”òð >©“ÌõÊ;»öÖB^›úU’þ‚2Å?¾¡rn½ø1[ÞßZØ!E«åwÒ:Ú*±'Þ2Ô²æÄn7ö¹b!=§¨wö%ëÑëküÛ½p:Êëç±ÌãZý…X-£ a²oc‡tTõëœ|&;¿]dó÷‘m2•M|RF§>ÙtrÐ" ]hä‰âƒÕ˜”@¿Ðea«_£ïŒ@ƒÜ·]æ-#ó ÷²?_ËNvóÎõ¦H~×u-£DŸ‘ÀëýHgÖ«¾òKÝžB×26‡ÕÌj,ôu{‰gQêF± j§Å}Іd² 0ªÆ“6â@…Ü•“%ÒŸqLÍ6³’íIkJK¢yìD’’9¼ª{ÝU“×mª1ÐMÓÔo Þe]rªë2XÊ*êʪ…­iÏU.8­ò¨úbÄU_EçţЦö.Ï£P4 »UŸ—Tµ¢E} å~¸¼1ôÔkvd[u6xñ±oBw‘ŸB9‚G ‡…| YtÏiaÉÉ긌.Ä_%[üpÏ‚\ÉIæ½^¨¿\;‘~ûÔ3WKl—û°\Ë|Ãå×™›¶À´%RµÅâxð'%÷bÐínY·ÂOÞ‘VÌïYùÝû[,–c†å°ÿ-ìÿ‘Û¿½Üþ˜O;tî}Âýun¯ù4‰G5x¬Š~×'¾åÈκØúû¼5¾½ odv’ ʳÚ)3ÿÖŸ0·L;tÑÁó¿a=úF¿±Åìl®©=Ø;¥2ž•-kˆñÆn”±;‹ø>¬°Ë=á[}ƒÓ#5Úއ¶×Æ·zPŽr²‹ëVj ‡a¸fîZCš{ƒšU·Pð°½’ä‘kþjêÌš?g NF±e‰èBU{FM¾k¥ ÎèýÔB‘\HHri"újzÎR­ZsL×öñ°½ž-]ÅûŠœk.Iv‚R4’Èꆽ~ëÛ„·—ÁÕýfœÄXSõžq|BÛ[,ŠNöÏ(R-$Š=©$¬ö>µ„d»jÑXoѳ»¾“WÑ ²2LRËö–võy„Œ3]SïWRb_SgLrãÝÆ²cíê7ð4$'âi³–"òÝpè¾ë`ï jή˜†htUÅ3¹¶öw¯éXóîfhK.'^À³=æÎ‰ ”Äϧ`´ßÞÝ›¥‚Qúf‚-Ã>¢ “+Ú1£|ëÂÜe2Ù  kǾØû·è^ö”X†‹s ÿ†Œ ¨ƒ¶Òѹc:F…’= \FXYóÈyÇ#œ gy%6Ƭ’rvî¾üê±±³Õ5Gáä”ÄxŽs=gÊHÚ fß+ÎÔ"X½ik45Ø®¾¶F›ÈöÆJ‰Ä@>~þÈˉmÌXuÀuŠ6Fl·{Íùû;9ºíÙNÎÌeB’èîáþ=­ îÿáÏ\XYÉèQέÆ8KVÏL e4åéŸS¾%–L/Üÿ¾±g²Ñ÷<ì¥ë#ëP(Í@µ™{§g«–e ðiû@3·|Ïü?`mR÷—’ÙS“ÜÛîG–ºGßn<ƒ~#ñíãkÇ5w¬ò2¶û;V€u/Ç P¦Ž5ãØm|fŸ´-)PɨéCÌL{¿-/D;Ç7ƒ‘Þ/ð&Gj“/Ùš„GÛoiZ˜©I¡(B§¼Ð¤½?*ðð!–ìû¸Ëw±†˜oû†Xeû|ßtüc·öÂ!Á|FÉ §b åÖ7ž(ô…¨ð¾áG½ƒx®7¹K–b=åîÔx–xí’¹”ÍW¨Ì<^™Qκnn÷ªåà ÝãJص‰-årR®öØzá¦ÂÍÏígºt„ò9«^GÕ˱’MWõ•ñnU/°íg©øáÜ=\­XΙþ]ß³x¯ #d-Ù‹žú´½Î;>n<8”÷õÁÃ~Zî|°GùÖʯiGùÕåWPz÷wZB©¸wŸa¨÷(MKHÆXK§õ\NKG%ÂwrZzÇša¡|?µ‡€è£öð½zZ-b•»[í!ìÄ}éšu àX³>¦ÿ ׬2ÞoÍtb·5ë€óðÁ;ùઠ\ÑŸöx ØžþÔwc?êQ¾¹õç@Ú±þ¼Çú3Þû­?ƒN¼ m‡õg %‡ºŸÒå}ÞOcò(ßÑZr úXK~¯^Ó®%•»ßZ2èÄ›]KNlÛ‘¶=»×¯ÀÚÑk†nìæ5Êc]˜Ê)žëÂ#u¬ ?ïº0°d?¹uaÐåû­ ƒN¼Y‡#¸yˆàFÞá$[€u·÷Ê$–Iï*ñ-—÷ˆK<„‘ù ·Ä|Ùé ÂË069ãMqÉb}ÎÕ§lœ3NiÊd†ª¥ƒ‡XEÜ«ŒËÓñÁ¥½X¼íÑFïÉHÎmmwðÛfžI ƒë½²èÆ]Û$öæ‰.Gm|} ’qOâ®íCñNÇ"Ð<ˆâý㤨˜\0;K›[ý¶Û°œŸg µç8ž;Ö:”zÓÖ2²Ð2ÖÛ¾¶ôªOÑ1gÙ7[&AÈq„q‘/’ŠÄr%eãI¤˜ÌgX¿‚0·(õª±zk‡ë¶=Ez0Ó[2ÜXˆáÌУ¢íäÔÜ£ß|BŸ|ÎÇ#Ñ' ?xzD[C¾æè“<8¯q¡ïÚÙÞ~Á¾±fïÖŽÑaÍ@Þ7vÄrhç`Z¹Bê&XtÜÍY¬†ŸÊ—ŽË*Ö:dÉÿŒâAÇv¡¿ä·†KÊÂ7Ÿ0ÛY†²¸ƒ÷×=‹ÜêÎ$ò=ެ?ó©fᦠßB< OÀ’ÊWJsúúòÿ{Ž endstream endobj 3077 0 obj 6258 endobj 3080 0 obj << /Type /Page /Parent 2 0 R /Contents 3081 0 R /Resources 3083 0 R /Annots 3084 0 R /MediaBox [0 0 595 842] >> endobj 3083 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3084 0 obj [ ] endobj 3081 0 obj << /Length 3082 0 R /Filter /FlateDecode >> stream xœíˎܸñÞ_Ñçn‹o Ø3v€ ‡ ‡À›M°ˆ™ì!¿uë13¤Š‹EJjË<ía‹*‹õ®âû?~ýûùŸ¿ß?|ýÏùÛðóá멹4ºéÿœ¯ß½þ·Áûƪ o¯Îß¾ŸžÏϧ/§/Ý¿Ï'¦o?ºÁñý„¿}ûõô¾ù©ÿÍׇ?wŸþwæç?uÿûåü׿u?~æ»~áûɶúúáßýÆ·Ý^ºþëô—ßí@°·y¯ÿ¾cVÃxÏÓ£ìö÷õ£ÐË:d !µ<3Æ;8U‡Žÿþãôs7ÛÆ¥•Œ-M³xVÃÇi[£Ï­òæô–¶l&–;‘R–f¢ʲVÆi‚3¡ñ®5'Âû8S6ºŒÒ4]!¢Á;4»bž3¥­æ¦ûlÑÿ7J«Y¿\“½àiªÌ‰d#h&ºAÄò–6î<–ø%Óm¿L&s16M•;·4ÇèË[Ú€úÀThÔ EÄw¦™²&% ß¹ADÂwà™Ðx—m/Ô”ÉFWK#¥R4ûËZÙˆwp&4Þµ¨´ÛÑÌeNSåNdZA3Ñ"–·´óðThÔ[©¨P?M•;QÛñš+DD¨÷¦úBbvð³ã9ðàǧÓûÏL {µ²ž~¾ªV·—Þ~=u<¨4G¹º1bð(Þ“ØHÕ 5âô‘ê­-ðJÙô¯´í¸Ðmò"{ x¤l]na. €­W_íIZN¿Pó ö!öÈp`ÔEp˸òÙÖ \§?xOÈô…3;{d_ ¢±Ñó -KZLZw£÷, žΕ‹)wsÙrÂgÀn‡NÂÃq ž!¸³¿•µ„Â˳.Gß RRÀu†Ò[|02E%"T5—oéÈ^lÛè7‰¹§Ÿr|Ôà“¥ÀðÔôÞ‘ö4Î`sÌ€ëƒÙ¼Pø=Q¾žÎ÷–<Ë?»Ò¢]®•-G=©„óÑÚÆÇ•×ZL7ƒÿ±‹’úú‚³y»”c@PƒÇ.@õàˆ¿M𩎪óƒÊ¸h‹aX=D±ç|ÂüÅ¥é]’é, 4Ñ­+NHl´„3/ÒY§·™Šði†ÄÛ2/-GE‚QbÅ£QIa{ õ¢ ÷ ú¼Ý´2 ¯BŒN]£Õ[%Ê/ÌÊÔŠI|ž?‹°ÝüS¶ü,ÁDGêé XµCýþôËÏT@LKgVÑ1žQPδÜ:rf=¾‘ÀÁN ñ!0}¡×òë^C³ÃEl!晬£ ƒkaƲö­,XÝóö„H¸GcË•üDECñˆ„n§ˆÄÁ%Žà<ç¤zLü´ß{F?‚#°S‘j˜FAØ©w±PÃdqW\!fCćàˆ‚ ¦±Õ9†;È&6ï&²bT¸†C0¤gCU(~ ¿æƒ0·ƒO Y dGb|k-=ÕXóvKç´´¨•â#ñ€ Êm«zb^ .œ2ÀݽÙ5C.HĬ5.q&¡bËm ”8#B; 0ñ˸¡Û|†õJï’‚¤ûµsIü·Û ŠB•^ØqÇ‘€òJ‡å£slÐü˜ÁCq†´9ÿv­H‰\Ää D I¢¤Ì•–SƒßŒ5mØi+>€Ë‚Ÿ­›†9Á8xä^E§»Š@ÆA¥­NÊ:aGKð1þ¢ Êá÷ é*/»NŠqƲv¡âÆAgÔ.,¸¹éà óÉl…1j–cTðâm£-¬Zo'/tüÐäãð%nŒc3¬F…Aó³nZã{Â@tÁÏ“m¬{žH”^ø«°`¢I/°2×NùY=¡åŽgÁ ”/稺Ë!Á5™ÀÒ0 [Ts§«òŒ¹$+j`(%`¶€0¢™gR΢¤ÃürÜ6^ 7ííòbеÖ!MT ³1.‹ò S’œ[ØîÙò”dÉ(µŠgÏqX¹ÃðW’ZƒÂÓ'”‡Àœ\í1“0Eé,ãëÚaQ[m ^gÍDPÛÊ·OšÂ$µ#È„ÓÝedÄ)¶ec23QÖYï÷9²þÎ#ÓHó,œ =Ušëê´|ŒdíiêS£qhƒId¦m¹tœŒû¤>ÓÔ÷"uÀ®BëSÒúå^Q¼Õ¡Øêíæ½¦À’5¸æúT±å‘;¤XÙ1Ã]Sl`6Ðÿqè¿ÖžÊÏÀý‹¿2ö´x(S6z2È2J·Ï‹iˆ·Vé{zuçs™´ííf°ÔNÁ¾ÓÔèÚ^Cýù+àIº°bzõi·[’Í áòy ƤQçäÅSH–‡2ý·¢!ö,¡˜P4å­Sß’‘l/kAÅüÉ…ò})òŠªü´[³€b$LYCaâ!wïø'} ¤ ºV5£lÚéNŒGHêÞW™Ë¢‚'¯ÿbNº­–ä0¥€ H|·¦‰ÃFÀÛFmfÂÔþÊ…¸–‹wv7ü»-$ËØm’LDŠþ¯É *ÜÅ\†äðgL::¦p,£5‚‚w„…¸š¢’éïª Ö‹io“°kž½\[ôSÔãµ$ËëP Ùy鋨³†ê¦¹£©ÞB½Mò¼N.æ4+оeÍn;ÖSA|xáMNt•¬ÒÕÃî 'žWêdÓ˜ÊÛÖŒ©(0ÇMNGãVƒ!I¸È…´:«ðEFä¶ÉæAI+ßjçÜúl-áò’â¿ Ó$F[®uòÇŒ×ÔîǸ]¡·áÖëÇ<¾¿ákÁ<éŒ –Ã'Á¨¥{´Ï6ê`…d‡‘•›¡âjÁ$&§¼]0~Rú› ® Z cÚ`TRO,eY@¤ùXû¾*õ0ª0ŠG™C˜©åöW–®\©tQ^ÑÌ-í0ó”80uaø"½ã¿†IÔ[9âô`NÀq…Ù&®0“¼Ó+ÌBÕ˜Kж\ñ‡º^jûIiûãC£0%"h§âUi’s…g},Ò^¯v\ „ú¸@¬Ä9“qºÜò•„pŠd5NZs·ÔhÔºîMŠ©)Sʥˆ$%mqŸ¤zj¹a@ZC⃨åIYîÙð}ÑŒž” Èatg‘KìæT¸içõ©Mu.É,)C w„êV3o±ò&§0íú)q†µ¶”àú%)–?øS Êq¿“ œÍ%»,ܤ׿3m¡èk1³Õò¿v(j{u×75¯ï•+yÍB£¬³Y ²b罂É>õ]M1K½.ý7ø¥?&˘ÝJ騆 Þ¬ æ>R—õ#¹ 2a×`õ¶HéÔ.šJl ßM0÷€£R°é¢¼dØ·þLÐ=Š{(Ýh»Ìë<2™ "½² M——H h®²gJ’évñ˜Š°còð‘m²×l¸ë&lCqDUø=¦Ò^®5s0d#£ðdž»v#‘fɧ°o­H³4!]2ò§ Ýç¹=g}íÛ îÂM¸¬qIng¾)Ε»ŠQ̽¤u9^‘,ã=£è êl®Â±•˜î)¾³Îéµt«ýÉñˆDU/¦MBîIrUÙIPl >á ¾ˆå\0¡ƒ8Œßk°Ü…¯Âc¥%ü ¸ @‘(DB~‚³ Cž"Œ·Æº³üKXùõaˆøÉmãY÷Ä»‚•Ï¿RÊ´ á1a Ö`»Œ"0³#”m•ÁþRbXùM|êGe1\(îO@uò(C1¢åë%Éÿ ´´"ÍOí_34Ú8ª¶—ø’… UF},)-;(OR%Ç(™v5ä2½’.µ,m¸-UŽšàBLÖÍÊ›ºQ¸wéÍI—<9’ V{dÅöïõ%¢#IW´ÊÚ°#˜]ƒ“3ÈK&3)ép‹2jév´P«¹HkÿÕ/ñKp®2Ïs,’2Ý–hó»Ht(x«xëö‹7îòò ìÃ3¢ÇB >„èÚBwã3ØæÑhW¯,ßZÒºº,­^HÑ¦ÍÆ!XG^ùåe…mÆœ«ZZýÒz³)þW¿c6=¯§‚ËùÛW.‚.Áò¤´»~àüíŠé´9r…=…ñÈÞh>KÍ\aÝæä oF‹½‹¬ øn™—BiÌI…q©³º©<E‹yo¹î(þ½zçJ˜ã¼Å¿%—Æt½ã±ÞI³ÑŽ4°Eðe¸»d€ª…u&”Ô‚50˜SÀ=15)y¦*rb•ÕÅuërÆL”P«FÆrùö ÏK2®£¤É$Lp{`Îå_'‰·àxp0Å‹‰b¤WÓøÈíÝ`–pÝÓÛ}bõa!·4¡Çµ,c—Ü8l–V³°Îk ¤P†PPº©!“ìïGß¶w?¼Á›ð[cÇõ¯n±Þà®op]o°mMžZ#v-s7é»·3SÓó~mUŠ?[÷ˆ´Bå¬nuú=üćŸ8òžÃO\‚o¨œèñæ¹¢™ë¥Ôý=?wÓw^¿>üøö=ð>ÐæÐ/APƒF×hõ™uÈ›ËâïZ_›S»°¡.P닞÷µò8D¹¹˜ù®¤ff¤'Q!.¼uU*uѽ‰ènüÜ{,øL >Ó«v†_xÇîùëg>‚³õªêëß<‚ß\3+ü =3x!æF´ŽÁ^O{fر”µ°Ý@Õ]?sÅ#Cÿ}2L;  l4‰Ø'ð=àÞ ø>L)g¡3W™†’°C Ÿ½!1Œú¶¶ÑfnmÊf}îÅ&22ÈBysþrú?¥t¶œ endstream endobj 3082 0 obj 3773 endobj 3086 0 obj [155 /XYZ 40.7999999 276.500000 0] endobj 3087 0 obj [155 /XYZ 39.8400000 713.299999 0] endobj 3088 0 obj [155 /XYZ 39.8400000 648.980000 0] endobj 3089 0 obj [155 /XYZ 40.7999999 136.340000 0] endobj 3090 0 obj [155 /XYZ 40.7999999 768.979999 0] endobj 3091 0 obj [155 /XYZ 40.7999999 768.979999 0] endobj 3092 0 obj [155 /XYZ 39.8400000 713.299999 0] endobj 3093 0 obj [155 /XYZ 40.7999999 136.340000 0] endobj 3094 0 obj [155 /XYZ 40.7999999 276.500000 0] endobj 3095 0 obj [155 /XYZ 39.8400000 648.980000 0] endobj 3096 0 obj << /Type /Annot /Subtype /Link /Rect [178.079999 659.539999 267.360000 667.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage >> endobj 3097 0 obj << /Type /Annot /Subtype /Link /Rect [109.919999 622.100000 178.079999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching >> endobj 3098 0 obj << /Type /Annot /Subtype /Link /Rect [108 604.820000 168.479999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining >> endobj 3085 0 obj << /Type /Page /Parent 2 0 R /Contents 3099 0 R /Resources 3101 0 R /Annots 3102 0 R /MediaBox [0 0 595 842] >> endobj 3101 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3102 0 obj [ 3096 0 R 3097 0 R 3098 0 R ] endobj 3099 0 obj << /Length 3100 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘ÅEhor`Ø@ƒO&Á`<ˆ3‡üý¨JTU5©"IÝÜíb‰"ßηñÍŸ?ÿãü¯ßÏoÞ}þÏù«úùîó©®ê¶žþ;_þüðøï+Á§_»¾©øpùïüõÛéûùûéÓéÓø÷÷k¯ªãàüŠiÂß¿þvz3½ü4}òùÝ_Çßþwæç¿ŒÿúåüãßÇ?©ù._øvê‡öò˯Ó/Œ3Þÿxüí2øïÓßþpþm\B÷ò÷¬ï†^†­ãûíQvýóø(zÙ,!‡~\"ãã_ÍŽÿþóôó8ÛmÕ ëZÙÕγvü2m/›óеã¬Ü˜ÔØ›ãT¡ Cg¢ËŠXØÖX-;ûTTÐ7²®ÛäãÂ6z›*bMÇãàðº"¶5zËTdÐw] ôóT¡kkÎ#áð:IÐ㩨 o™œHµ …üm¦`Èó:Ñ_WÄ‚v¦g"ÓÅûÂ!ÜZô Þàlø=qWÝ ¸Yöƒ!:íçבô2ã%צ4UÏ´À][0Gê·†Ñv=\‰ »…ÆuÓíðœúªj ÕÓbúûº'(tU=ˆî9g8Ò(ЕӀÓ…gX‡žQЖ÷¯öÚñ¬ »Íx̞дFþA1^4^’±%•ø<‹Ë¾0ìñŽ[µÛJѪm{€Ã¢‰¿w§Ôý€\_ oѳ¬ÖŸíôðФ?<͵ïs§ËkŒYgáâ¹þ¬[ïÃ$Æ?Ò·e8Þ4žR‹´\W#ë$ãΓæd˜­ÜùÙgVµº“·¡PM¾v'UŠfrmèá÷˜Æ»p|:<0V5²½|ÙŠP,š“äÖsî1l°¥ TB˜,ŠœÜ±*Æ‹ LíÁ(庙½Õw“\ Ljú@L˪N?óEÕ¤kÑ€“þ©QSÚ¢Ît}·5#‰'–#·†8€  b-Tå¡ógˆ-CeRxiÅ_‘É_A”1)z ÍDÃ5q¦Ô@B *Zýéu¦h[]lL04-$èñàecꥋî®Êñ ™s÷ÄôÁÂQÉ\<ÆcÁÅ+³n!ävš&ƒûaŠB¸>f.d)Ö(8‘©päS\zÔ*XSzx½þÞuÞð`ýÕS\ˆŸÑ0ŠB\·AÊ,†æ÷™Ä€"–x˜&ðˆ»œt˜\=\þk4ŸþàÎê6 ¹³›Š•pæ0•q€5$îa$[%°fžå>ò7üUÉ%3ë0<ôÆ!EQ­bû|,BÅ DlµR Ÿ~±Ë…b†Fõ aÐb&‡„´Ã¹"†7$"Aò¡n^HŠ+ÓŠ_jk¿Ô®Ayâ‹ •R+™®”0åySTqžˆœ6#šäD’¢î¡0“²CþA²n#“(jM ÇÉs]ä[>…f™læW>é;Ò?˜S­ïlÅ¿a¾%fŠï²‡£Ö¶Þ}ëà™á#¤Äa…)—žÁ#‘“JD_ÊÌe+§–ÞáÅ¢A“àé¹>=^#†Ÿ2+3œ«{I°dcøÀvœÈã5iDw†²Ìªû}Îë~PŠ[ŽBaØ<3¶ãT3ÂÉÙ|1<^„Ü·Y’s±O:¬;;8¿§««¶cÏŽÒ'~f.ƒ©™&”ñH†ÔæžkÊ#‹oæ@ d „¤¤ú¤M8iã·r/ã|ù„FäFXr{§ºÁ³îܳx¾Ýƒ'ÆqÛ’—â‘%¡{HÊn뢘öFZèZ|”`[b€’ù;8Ò­°Æ;õp|® ÆÏ@¶ÅBà^¿™ß ×÷.¬2¼sÐßYœÝ;rvïïlà¡ÒkGå àµðGéôÐMgqJ>†Ïl딾Cƃ¼[ùc¼ó^°M•W¹²ÅïÌšºVv5to9¹ûå,ˆ×–.}ÌÂUKx­ùèƒÙ$Uš>é®çy /Q6LI’ ©˜=¿§Q…¤ÜucúäZ¤“ÂY‹cÕË" âc!>q#‚‚KÃð STúnZÏÅlÚsö›Å ±8"ð{àNñ 0D·y¸Œ â€SF€è½‘È~YzbAÉ‚”%Œª‚äÎm2Jks™íQÊK² HqJ±êQŽOI¤D»¼‘k£¸‘w"~¯Bá‘ëŸ_;0}â$.˜ÇWu ¿Ë që¯'4®÷)ï!Ô ‚óØ*fêщ“`úDü<’gÝM(ñ~ÓqÑ2óv¬ í]I]:ÅŸGÝ5ôüzúœìú¨>‡^ããˆbâ')ÐÎVvÅ»¹#æVeWg Ú7Ì¢¨´õ?ó5 bž_g"—éqõžÞRÒw,pS £Ô Ö’I)éKßæÛ-è/-V-Õj:VñJ,…mw¸´®†Ô“+éL°þù+_¡£%NwQz²£Ûœ¬cñøD(°¾Œ{LX«Õ€fÍe{×Ý Ê¬álxüàbÖ¤ìåE`)\‚áèaäFu׸׻T¯¯cVCäåô$uÌæ6X…jM~ÇùËL &園¼y„:šÄél:(fŸx“©@ŠS*o\гʀI®'¡ŸO×óÖnáŽ<º‘YêröT—³ œÔ̓2Ý<Ú zhô½º» )Š‘btì79Eçà ®Ñî´qk¥( •pKX¢ûµ¢4â~- %öÓÆû¥M}û}.é£0æ¶}æDÛÉû^éŸ"œáóYqLSª›nÐw¡éŽÐßE¾ÒÒ*§üÄ(eŠë†·½´·å¤ð¼¤•2­Š¨?Ð>.¡·ò+;ú@f8'¯çŸ'¿|¡¯å²œ‹ö¶µd1WtÀhRº;Kïø·€ÁÝˆÙæÂÝ´âl0ÌËi² :h¶Y]´úÕµs}Ó¬RÙl„;Qs]¶±Þ6ÉêZɲúˆiqo‘43ƽ¹ 0Ðr"F¬]‘ÖÎ9ƒxü`‹Èùe %½îTÏ5AÞG½ü|?þ¼Üóº™;q°m'Ê­„§ò9qR¸NwÐ)!};ïx°Ö]ü®+B¼m$õ›)‚UDÍEMšµ:\åóÒàâöß± â2$8ò&'¥tOŠNÓûÉ'‹œ#8H¡ÜEwЭ é³Ó1SÖóuí~“(„r'ô­vЉ§FIL{%'‹5JõÖþŒÎ—Uc·¯@ÊfƒêþÙ»ü+]x‚Í( qú•ì®{N¦ë’JË1ŠU¶[aW85?§¦×3]gè™Ì—£¤ö÷R¤Bܘ~¦£_PxˆS'äŒ$™eØëb œ@ÏÁb5ÊlR 5fU û¼ FQ1[ûwÓë+ÖITL(à£Çuf[ÙV{¹t8žn̦>dž(V†Gµ.v£ô 2 ’Χjjìx ÖʓٟôÊçÎÙ@ EÝïŠÜ˜6¤Zÿˆ[!E ?dKP”MâED¢´$é‰ðè´äÞDÈ€O"ŠÅS°¬7 –W…Æ5r7(Ä_õ¸Gpë“M)X£K6tu6¬Ñƒ ãì»Ëݸàe…Bd­{:”oFµršI‰úÍÝ<ì1 äÍuÁb±v¬)Œ]`»"SƯA•AN<âÞx3Š‘i!$ÃÔq€˜— {;C¾b×éºd«ŠŸDe¦kÙi못IU7ŒÏ8>rYµ×å´–Û)—¬F…À7â+[qw¼<‚¡wŠßƒwj¹Eî´Æ4JÞ ” W€q÷~Iµ‚<²FÌ7ðYSdM‘5k+sx§Yƒg³Ü™‹GðmÇ9eMsÛ]‘5´<³Ö30¹¬a n°˜À8Å‚ßCvN‡+9Ïí°Ž¼ Š-CØŒ"­àˆ…ÏŠDÙƒõwZ¬—=X/J„#-a‘;-Á¡ÎQô–G÷ýê¾ËH‘ÄEIì ! çÈí%±€Ô›S·÷êøÍ¥ÝžGŠ$>ª$¶ì´ÈèƒÊèí¥7_£Ñ<Ò›·«û.#EzWz[Fo/;%¼ÇG­-ì”Íê¾-Éè·n[™Y^Ö82G,ïÜ`¡l¼6Š>×=T”Ü…ŒQö!4ÿ>ßJ»z=o+ÞzV ºæv7GšB J©ûmÓ–”Ì̽xÒä¼zó"z¤*Gmg•§Ï4%ëef }}+Ë+fýÌú’fµ³¾¤t&‘5|TYSdM‘5«G„’ÒI—5rÅYcãÀ’ÒiåôW•ÒÙ·!W”Ò™É6{]il}âB~=#¹´õëJÝêÜac޼4êÛGêÁÀCB ¯gä¥iÞ}oÉp’ÓBZ–™âJðÖÆ'Ç Þ}̼†õM¼õŒ‹ïã¾^ìÞÖÍ­Öävœ®§ÿî`ƒ#õìm„3Â3>3 gÁ²ºš"γq4¢Œ”¾’*¨§ ö…6›Šë¡mÆ!ÜZôL=¤F/›î7zÀ¯à:ñâ£A±@ âJEu»J õ"t¨Å²¶®í¤#üž‰*ÛJ\#½ªµ5ÕÚwÙ©å=¸ÁZF(TiçÞêÎÀ\Á*U%Ïšië¡yΘ½ÝBz­1pÒH_*SBWíKÓ¿EÛQJm©i±Ñ'M¿BK9,ßàÆå‡î\JéG†GÑ‚(ÆhlKI$"e0¹ÃÞ2‰{oÅ­R™ú˜â¬9îøøªB÷½U´¥”Ô³ uÕ›5!ŒÓH2Êe¯ƒ¬@qlœïç–Ù /Wl.Æo'ïÙocd*ïørÎò‰.µJÓÁ8Ï-·¹î¢ØI²ñ¡Ú•Ëi¼êÕÑoÏà µÌújÌmÒ.Í»e|RÓ«Ó$öfF„å M¸’T6p¶$·zZÄnÔËQÓ¬>QxŠ ”FfîÎï`^`´zlj± ™/ÐÞ²¾t0Ï¿SJ­:aZ’ð~Ö –žÂa§Ò1˜`I?Í„Kjx)°ÑhÔ¤“†P"P¨7fYÁŠ?`ü]½{X+Ø•cD/ ãÞýRe’W+ÊYQol/ÅΚ4 Eƒ2\øf±Â¸4Nz¡b*¡0¢Ñ¥Ñn"D1ŽjH¤¥LɘN™ÅŒY7cRÞ©RÎîÉyPäÃe67pÊAqçÅ")Bz”cçK:v,l܇c%ƒ[ÈÛ½-Ûgp·ð™’Áí‰Þ9ƒûŽß’ÁmÃo 3«-YÒx?:0SܲSB9WïUçŽ9˜ñ, —Y²¾!~À™ ûyiücáB]€?žË–G/ú›×¦±—4Ã¥–bûdJm³mÆÉ“äñYÂÿëK¤ø¦=¼ò!%#¸d¯gK}Ñ)ÕI+5}’¨›q!ý#h)Ò¾v—Pl*‰}â®ò<°qÀ#˜lä±å&ŠLvÁþÒ¿(ª¢ M\ìÇâH^•ü¶˜pïPÓA¨ñP–<¬m׫“¼k,Ž‘E©1g„_vsϵá¯m1¸\±ÿóÍm<ÊãŸó÷‘ÙGF¾|AýøúÍÂý¦Ø¨ïbã“UpX]̵g6nc)co`íTTx·6£ÊýܶU»l¬²2TÈÄV¼«:]ÍMíF&…$DŇvÉlhšªd¶®ª–ÞÓÃgøÌ„ÐŽW¼¾šî#oál“:{üä=ü®Ò… ;üˆžQg§¥†ö¡4œß3 c>{Wk»2@Õ]~ç Ón¤–ù>éO Ó¤eàyÑŠ„.½âÖ²‚'ÿÙ0¥Xžyx.3 yA¯óž2¼—Ö†¡ó. }÷}ÝVìb/úÒ‹;8Ò?꜈úæüéô€AM] endstream endobj 3100 0 obj 4766 endobj 3104 0 obj [156 /XYZ 33.1199999 635.539999 0] endobj 3105 0 obj [156 /XYZ 40.7999999 593.299999 0] endobj 3106 0 obj [156 /XYZ 40.7999999 279.379999 0] endobj 3107 0 obj [156 /XYZ 32.1599999 637.459999 0] endobj 3108 0 obj [156 /XYZ 40.7999999 130.579999 0] endobj 3109 0 obj [156 /XYZ 40.7999999 593.299999 0] endobj 3110 0 obj [156 /XYZ 40.7999999 279.379999 0] endobj 3111 0 obj [156 /XYZ 40.7999999 130.579999 0] endobj 3112 0 obj << /Type /Annot /Subtype /Link /Rect [250.079999 313.939999 329.759999 321.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps >> endobj 3113 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 140.180000 184.800000 147.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 3103 0 obj << /Type /Page /Parent 2 0 R /Contents 3114 0 R /Resources 3116 0 R /Annots 3117 0 R /MediaBox [0 0 595 842] >> endobj 3116 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3117 0 obj [ 3112 0 R 3113 0 R ] endobj 3114 0 obj << /Length 3115 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň(¬=v€6CCàÍ&X¬qrÈßÔ¢ºÛ¤>J,>¤îÑØ™mµÈbU±Xo¾ùã§¿Ÿÿùßó›wŸþ}þb~¿ûtª«ZÕãÏyø÷Ãý¼«ÿl»¦âzø9ùzúvþvúxúØÿ÷Û‰©Ë‹æWÿpšbð¿_~;½'?Ÿ|z÷çþ¯ÿùùOýÿýrþëßú_?™ñ†/|=uZ ü:þÁ8ã]ÿ?÷ ÿuúËïοõ t—q‡ÿþÀ:Í´ê¢àøv}•]þÝ¿Š&ë‘%”ÔêÌïálztüç§ŸûÑ®`TZ2Ö*ÙÖ«GmùeXYŸu«ÎZ:c:K[7‹¨"Í@D,je¬–­w$2Þ›N^Ùº´ E—)]ªÑ‰ØCÄ¢V6áŽDÆ{ËêDxŸFŠFW/þ ÄêDx‡#U2?ðï5ótÃ$нD«e/$“‘W·Fœ5±ÈœFŠ¥J[«DûS_°³²‰¼p$*Þ[Æš4Ûê:R4Þ™NDÀ¢$Û DÆ;x}X$‹=¿oCÅ$º4çÈ"·´ óx(2ê•iDÍu¤h„µ¢M3ÐQQƒG"ã] ™ïÓH±èêêÞpH‚÷¢4x·Gú˜Ä”á7Sæ›çÅ·ŸOo>0)ºÁrûüsÈÅü}îÛœ´»^ËøüÓù÷u->üáüù—“®-Úf´Ç'5GOøðž0ßyOÞ‡Ï#à®áhÝÖ8p¥LÂyÞBØàÏzà WÊÞyPÞÁ”ã-|ÒÀyÞÁõlÎ!âó5~ǃQ¸çæüó„σ±Ã µ=rÂæY)¤vƒ×C Ü!‘‰ôðéýç^gŒÓ5Pÿd=ªJN `—)»ªÓµâÍýFëlü´U °0÷d¤¬äøànx8š‘I3ïÔ#U¥-pº£šÝ×T‚wì»…R`äïí‰1ФzUqÖYOœ…RÖ…ß±‡Ç_5ÌÚa¶ð€ÖÚ_U«YÊýª 3Wáõ ÓB®gÇT8ë³_ñÐÓù*ÞLÚz9{ª¶qäl÷Õ`¦XÚ†9å1w2Æ·ÑQÛèÀ’l½ $I2‡!ÖoÏWmúË÷©è±ì!Q¬DàæáS6™¥im2’å…}NIaK§#¯B2`O2àð’¼SwŽóƒ&£Ÿë¾ésø\ùv쟌ò-¿Wi‹«©ƼŽUŽ} Ðaä’ÇO´<ÍV>Êõ^Úº2Z)3fO¢úPuWFÒÃb… Pü{’éÊ(»3ÙùLfâÃIÕîÌåœHeì"R;qÓ¨àüŒ?1ЦºáC:_ÑÖWÌòY;Å«mQpÿò(P˜®twQ?×8ÄI°°-i×,‡.“Œ”s²" ÆN q¨’…ã|æ:„x ÷ƒ—áááÀCÞséê|à€HÉúX‘'ëg™ž)’üÜMþÖÞZù“}”-……2ã»sEtóy¶W@¾ÄœóˆÊ(æ‘í7ãmŒÙ:ÁØmº( ê 0„ãÜe†E1µ£ ÙõœLóé ù褮?´“HL%J–a:ÏxwfzNsuÚMnqv5Zëñç&|RO hë —áïxæÑèyµWlÅ„!·•ûɾëß¹%¤$ <¶ÿ°Eõ_œÊ‰q éãѳñJ1Ø<\E°0<–;¶\0_jJWæSS_Ï qåñŒ@/‡g7aþÇ£8éõ<¡œ`úJÑdzŸ R¿CIħœmž}Š÷ú(Tð@M8w)E”S¢ÔY]S΂—âGfÉN‰/ çÌ&Õ /KŠPxšxºãÓXZt Ò¶ërU¦^wë3t“ô ÉôƱ¦ WX >–€†’¤v‘IùûË«q[1Ü’RdÜ„¯[( ¦^ aA+ë¨!Ù#f@a¿gÞ¨yîÜ  ÒzL{ÖW¸Ôgû$7ŒÏ˜3üI`_R(›)lgtò¹ÅG䯹åEV(²9é[­ɺ$þÉËMÑÁ'ª,ÖWë3DCÎõ€|µ˜JÚÍå4ÁÇONá+”%}Ÿ=»8FÁ‹Ñ_7˯ •Çèb6kÊ4œ¼á%Z{7`Ÿ/Ž3â\ÎÍ£þ† 3J”– [Ÿ ÈaÁ›?!äó¸~9Çn!Èï-/ihµ­F{j\Òæoaõ‡ P“x#EbUˆVEð@IÿûHεþžŠAÁ4JŠ¥ã–'‰oÓvéÂ+ä¢ôÕ¢‰ ©ç%Ó'ú]9í±£°Ä—nCè/ø¤ ÙÜh˜C0}v\ªƒ¯HLÛ3Ò“T”{Ii‹„”0÷&僒¥TB¶‹ðì¹” w,Fá‚EÁ#‹²ˆž‡i»Vý9dm¦,Ô¸‰/eÃÃ;ÀQSŽý&ë+/C g³ø9]> ˆÉf¹‘-M*öjIÍ­c€d¨ëË·ëE\á¹0 bDÁ¥ê'¦“\ác.Ã?‰¸Ìäu½:–&™$s±ÌreHÀ»IK#S\ÊLQØ<Ã'æ覱O éh{¬UÅó22\-UÀBåbqe¯óŠ*u͘zE×Z‡7K4š¨áÂ¥Gx¥f«'‚št…áš. žkZ ®¦) sĵ„”“pK 5æ*¸š¤£I|)æ7¼ƒ!loj}ð;pÏíù¬’2)Ý,Â³ç ™ðnÂç‡GPèwÞgÅΜ:€5ŒÍS({³Á§æ7Ö”]²‹Ë¼Z6e>»Ì«½Fb3Ýqû!§˜¤¨­nHiŸœÝiæéÛæíëâq&C—_È ]yzÏ$­&L™YNëWKéJP’DÐí¦)SàVk+;¾ÌjY Æœ|ÎUYîü±Ü€³q9Æ™µ§ÒŠê¡#"É“¨ÀŽÐw’B3Ï~|E‰ÏºvD|@i?Þ4”ryJÊ^?¸äFJ˜.žá ØÃZ\â!P"Ò:‘¼q•ÿØà¶7Øz%(‰Jç¹1‡Â¬Ilî­%½c¤¤+Y´Ýí>Q˜Ap–¸î'ëÑ‘Éö)%eÇh˜ÍST9³Qä¨^Sf¿-‡·Ê3Åv è”ÓÀÍñX`­‰R–™¥âbS—]-lj¿’ò‡çݯ¸9#Ásÿ`@Ïš˜+Ð=\ƒ÷Ìò|û=éCb9ë ™´·c¯ýIÙ.ðÕ—Gf‰«÷Õv^‰¸‚!É!rõ&ÁÝ{·÷0:<@±F±Eàä_îDQú>×Módµu¿ž6–Δ½Õ lÇ… +öS@÷ü  V%‹FÑajÅ´šL”WÔ‰V*–ªa|Æúb}ÍÈJ[_Léài})LàÿWTá +h1}ð>Ã;]b¨áhž•B¼Qê¥q1–ë~»úÖö®î·ÿwþÖß¿:|Ýüúò5È{xç˜üèÕûê²?MY¼Ù>éLU£gFÔ“²kÒž”ªÔ¼m¬eå»#áy[µófe;ód$¼×–ʨÛM¥ÆcÜV¬ææéà;¾32rË+^‹ïîü0Ûbn´qcÞò¿kh3+ü€Þ1Šá܆ÖaÄUØ;†b!k7°]6@× ó†]½¸FoÝùd8Õ0ˆŒ Ƙ¶øÉfƒ Æ´5 -îk÷8>äD¼Ìožyð.¤ì¸vÎ ûïá“wI8¾ëjU±Á”Ÿeý¹‰!³»³ïcÊèüñô½V§ endstream endobj 3115 0 obj 4596 endobj 3119 0 obj [157 /XYZ 40.7999999 576.019999 0] endobj 3120 0 obj [157 /XYZ 40.7999999 408.979999 0] endobj 3121 0 obj [157 /XYZ 40.7999999 292.819999 0] endobj 3122 0 obj [157 /XYZ 40.7999999 683.539999 0] endobj 3123 0 obj [157 /XYZ 40.7999999 683.539999 0] endobj 3124 0 obj [157 /XYZ 40.7999999 576.019999 0] endobj 3125 0 obj [157 /XYZ 40.7999999 408.979999 0] endobj 3126 0 obj [157 /XYZ 40.7999999 292.819999 0] endobj 3127 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 693.139999 516.960000 709.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal >> endobj 3128 0 obj << /Type /Annot /Subtype /Link /Rect [408.479999 427.219999 491.999999 434.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 3118 0 obj << /Type /Page /Parent 2 0 R /Contents 3129 0 R /Resources 3131 0 R /Annots 3132 0 R /MediaBox [0 0 595 842] >> endobj 3131 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3132 0 obj [ 3127 0 R 3128 0 R ] endobj 3129 0 obj << /Length 3130 0 R /Filter /FlateDecode >> stream xœí]Y¹ ~ï_Ñ϶­«. `ÇòÀ°<,òx³ ëEœ}ÈßOêÃR*‰b©ª1à™iM±(Š")^zóçOÿØÿë÷ý›—OÿÙ±ß_>íÄAÔbúÚÿ~¸ü@µ­¦›¶:¨nøÚùºû¶ÿ¶û¸ûØÿÿm'ëñAû­<¾bøû—ßvo¦—ï¦O>½üµÿé{µÿKÿÛ/ûÿÞûÉÂþàë®íêá‡_§¤’ªí¹üiü÷îoØÿ֣Ўp‡ÿ0¢«³ðøvzTŽÿ.E/뉥[!Õ^JÕãYõäøï?w?÷ÐNh:#eS›FDCmT¶é´ÙwM½ï*¦7µ8H2P+úeà4b$³f&…i‚¨toEÓ“lüµL%—…”MwYq-`‘Ìš™¥;†D¦»–Í4Iir§y• ÈhÁhÀHæMíHy ŠLúJéišZçNô*P]U<€ŒdÞÔŽ¤Ç È¤ï¿¸H• ¨ЉëŒ˜HAQIßI-Çi*ÑåRì*›ôZó¨Œ#™75Kz JÄW²ªÛZ5ýÏ­ÐÓ¯)î•s‚”M:ÓòhÛ#+ǃô‘ÅüUgó÷[àÁwŸwo>tƒ©ÿùçaÍÇ7Žß>Ý™þ—Á¨ºýçŸöB×ÚþeךºªU50¦ÕŒ#í顯šƒètS‰‹?/ãˆ9?;A­ú“I+¿ƒ*jªœ^cf*"F< êíø”‡ÊÔmÿ×ç?­ w~Ò¸v§%Úñƒú dû=dO, G ®B ÉÅ^¶î„1ޝpý8ª×è5 ÒÞŸ(e^ñÌXŒ c:â ±,…å»qäõs/¯ò¤4º¨©FÔÀ¨°¨„¿2"køL‹FÔ;ø Æ@A Ìs(¼rÚë-®¶€ïÑk-Ógª:V¬); ¾'@kü¸r+ÓÒf ±Æ+G‚¹Ó@¼å\…Ö˜ãñžƒëƒ±ð¦…MA=Õ¦fõ–Bpvâ=ò˜ŠÞM«k‰õG(zJ‰µ×' ¹2 ?ƒ÷3æQŠžøÖ°fZ…ÖP‹°&h0lG°†¥Èõ'b °ÖûD§ÌZ ZbÆ—"ÛÊ]*V_Š™Ø¶>Tz<²zä¿8õ ÷5ÓÒ]9 z^ÄêÄ âÝ rÚ?RÁžGð3øK˜Ý¥oÀ}iÄã·ðøÇ›¸Ç Þl0ŠØGæQÀsš±x¦ðÄ1Òx„à¼ò(ñ[‰Å/JñúD8,¡¯‘²n$§’ÇA/‹ËeÕ8‚9E„rl’lƒÄÅØ[ÛÍ`HQIX Ä‹0 уÀ^ß >x¯‰ßâ¥9ŠBq’¼ÍP9š fžKYrH#^wºP¢É¼)í½d3vó—r\zAN§d¼h•t€š¦t%>¸Ay¿–äò͉{”r[] á¨q £;ç̉¥Ÿ²:påÈ”½"Cþ¬ìOã—Ÿüºû´Ð†°'U%ô¼Ú¤ˆ=ÏVÆà¬Žôø¼gÅ{Ôœ xÀ0ö "™ÂŒ)ÉJ˜#OTÍåK”NPp¸%þ”MJ{Xæ`ÊÍn÷²»F(UOt2ÇP¶<¹ÐÄôuFŽˆ#S5•3¢ á ŸéÐ3fÚ#RøºQÁùLÑŒå€óÈøŒ¶BA¹G»} j瀃Ÿ‘–í™(f>˜ÚÙ îÎG)„µ ¸]¡ŽŒ²:´îQÒZ).FžSͲIas,Åzð´A‚É‹ÿôá¦,‡'OÿDÄ¡+Šùg)* ¿oÉ3íG`éí䦛V$WLÀ±”à¡HpêzÈ{ËVØ**à}­•£MX¤»¾Á±„c+$²~PÃ#ÞñcÂãâäÈYõh2fJðGøf¹+(žƒ€0gõÄ»R\ä"˜œ8|“pä&ð§‹ï4Òàó€·8 6À<0,ïX=ˆxmîB'\…â=Ä{ƒ²)¸f-žÛ$YafO¦bBž^õ7g<Hß8ªv $ ÁÐO°àRÜö1˜™9¿¤éâàVKžp~G•.Gæ¤ oÿÂ,(é #0[ÌZ Æ;´¨3Ãû Š­¥#k0«hï¸Bqã$°o^¹è2Ÿ¯+‡•’Òq)É0Åš¹0‚µh#Pþ@IÿƉº”™²–Áàx±6„Þ¤hœèŽi@)”¢ð[ ¡ž–HÂ'$ÔkB©V`ÿ`¾fÅšR>é!ðŽ¥A]Ÿ‚:„ÂÇ@!%ËAJQ€Æå¬rTLA(ƒÑ„&ný¡pá  ¬¡Œ2  –­ë¶·^0áT+IQÖ±æÖ]¹51âhŸ[Ïüò)¦®¤^?å?CIùx=D'5Xp%y'5XUp-åãè‹y¦|,ïG«N9^ÅS>âUÞ9|ÊNðÛ=S>Ãô^R>–IXå¬Ú»ÉÐx–£;c=R2nAºHŨ*GÊß$¿•õ(›äÓÝ[UG«÷q\ Ž G#Ä·_Õ–] êúÜ6·rAWBÕTó´Ú°+Á`§,ä$ q3Ð1GrL`ŠÂ÷pÃïÁá,Q  ¦¤Ó¤êÌñ­lN“ù·ÖòTR„݆s#e0ÕÇ¢ž ÈEÂHÀ9^ÊeŒ¥,ÁÉ[ k¨O¶Œõú:[|RmÆ—U·'ót_–ïX¡4I&xt2—qÓ°V¤Tʰ¤ø>šg.ËeFh`ÁSúÄÑÇ%%_¾¸õº rè* ªÍÔ2Ê£³Í¤ÎʃEÝgI ¡\ÔÌ$&Ôa’—´¾Áv«sÁæå¢8úÖ¬2©Ýg@Õ¼Ï0QOù6u#¿Û ¦‚8fÔ|òtôàèÌpSr•åX›p J £·9瓬ŵۓ4**G Ük—ç ›ƒïæ«}x6Á©‘B×xybCúI¥Ñ)×-Ûj7í–(G¬ádðnjˆ—ÐW#«8¾ 9§Âêη•z-¨LšV¹Êd{>“€ŽÊH"%´}F)Ö7Ì÷Ü“­Qà„ªÔ<‡$Dó[†DÉäøŽ)]¦–k;· §|JÜž<¥a‹ñuŽç[’¦Ë4KÙg‹Ô/,Ôe¥R’‡«ñ˜?&-¢À—º¶ËYêÞäÂlØE˜ÐÓ’Ä"^JNˆo•¶™“à@K0UîB9?Zg´ª²—|^+,¢èÓ%}«Ü´Ótʪ6áôÚ¦Üoê·ÑÂæéh/|ø…W¦ <7²\cïLéêæòƒ5îLPpöKúuºƒ“Tº`«Dœ;67f»”ïÒé«ñéD,MÂIçe¸k íêûÍèpÕmU7)òo9幨ýRí©hn͆jø ¡Ù]ÿ+Ms´<=ßhCÓÚ³qQ ·§Ö¯Å/½OÈ” V^’ݳ P@ëÜ@ μ±œÌ‰õoC*¼qxë‰ ]ëK8HäÏwÑ(ãîû0ïô."ÞûvX<’wªÂ¶ÁähoÑhè°­kG X÷Yß^ßãiÔW8M½´¨k…k£ÞÉqyŽ«—¤©í‹r¦i¡W¡D†õÕ½¢)Ek¤wÊ+p–¬ÛÙ©>fǽ¡öÐÎÿa:î.¯éXch÷áÚp÷Ô×ggÞBOrR5‡æ:s4WF&µ­õAuNª˜eµêPO‹à.ßµ÷´ð™>37:(1šqç‘wÚħ—Ÿ¼‡k“®ÌðzÆ ‹k#ÍÃn•´g슥ÌÝâ6n€ ®~V•t2IMã¿Ï¤óÃI|`5uàµÅ#s”M¯­½ØéŠÍ ¾r"žæ·À{ð.¤ì8w%!˜ú¯pä……ãÛVÔ9ô£¼Êú×^ ÙØ6ä·ZˆQí?îþbíž endstream endobj 3130 0 obj 4256 endobj 3134 0 obj [158 /XYZ 40.7999999 751.699999 0] endobj 3135 0 obj [158 /XYZ 40.7999999 573.139999 0] endobj 3136 0 obj [158 /XYZ 40.7999999 751.699999 0] endobj 3137 0 obj [158 /XYZ 40.7999999 384.979999 0] endobj 3138 0 obj [158 /XYZ 40.7999999 384.979999 0] endobj 3139 0 obj [158 /XYZ 40.7999999 573.139999 0] endobj 3140 0 obj [158 /XYZ 40.7999999 153.620000 0] endobj 3141 0 obj [158 /XYZ 40.7999999 153.620000 0] endobj 3142 0 obj << /Type /Annot /Subtype /Link /Rect [60 394.579999 166.560000 402.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 3133 0 obj << /Type /Page /Parent 2 0 R /Contents 3143 0 R /Resources 3145 0 R /Annots 3146 0 R /MediaBox [0 0 595 842] >> endobj 3145 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3146 0 obj [ 3142 0 R ] endobj 3143 0 obj << /Length 3144 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`å&›ý‚;ãq€6CCàÍ&X¬qrÈßOKݒƤ>’U,RÔHÀ3#_ÅbU±XõñÝ?ý}ûÏÿnß=ú÷öËúýùÓ¦Ù5}³üÛî¿~xýw­^~Æn§§ý¿í—¯›oÛo››óÿß6ª?T\¿Í…Ç.–ÿûå·Í»¥óÍòɧç?Ï?ýo«·šûeû׿Íß~ZÛÛÿÁ×Í8õû~]~PZéqþåõOûÂmþò»íoóÆC»ûÿP“êµ6Iãøvªª_¯«¢ÎfbµS7N)=³›ÉñŸl~ž[; c7¥†Þ Mt«ƒÞ7ÛOj; ýV7“Ó¨3·¸¦TjCãÌ" íG¤Ò¦¦3ø›b’Þ4MoÒÏ=$MôÜT"ÅLÓªF¦¡ýˆTÚÔÒûšb“ÞL­ ן›J¦ØÐˆlŸeD"\ïkŠMú©íÓœºÔy[J%˜jZ!¦ßH%ÍìHx»¥"šHŸ5Ñ7Oŧϛw¦½Öýüó<Šƒê^¾}þº1ó/{udôöóOÛßÏúÛüaûù—Ù™vèV]¿–ô‡’ñüÁóò§ç^t³)0*ݽ®«%Ãn&Å¡Ùs ìO5v¸ù!445Z¡àˆÔ?"<-‡66õtgãÔ…4ÒÎÄãG„àÎÓ馥¯gÓÅs–ÝŸz:|ðòyÞ:y7Â,8Ö1¨e »qjúXf&ðƒàš E™v”™M%‹2Ëx¦]gGÿˆJV†¹P¢zXç=,y¡÷ÓŒ°d€%Sn¶Sã`S×]Pá¥_¢e'„¸Žþ’·é홨„Ts¥ Ö'În…hM¼bY$ŠÒÇ žK&»)ïwzfªï›“ž³Œ˜.±±î\Ü«#«“$8» B%ÍqÒCg•hè3Á:ªc¾VÍ®3ýžˆö‚ô»öÀ)¯çó¼ê ³ÒýÜÏz‰Òn°õÕÁóÁ4X¹ôÂLõêGëS?UEƒe÷©n·l¾¬ýä7ú®=îï£zúî{3 Åö2ïW"w­5yüâX×X1ľ²ežÅÞ±•‰# =³À"×qšwÆŠ-U(c]µíѸ.køÌ•r^ƒVÀ’ –àø Î¨Ÿ`\‚[ƒ£VœQãõñ3ž:ÏŠ–ársº0Åk“qC-Ž(bpE‹÷s)îƒýèP”—ãõóÁ£nÅ‚["¸¼×Áñ\=­U¼Žš1Sƒû£öPK!8¶5J”$74C;zFûšÏ˧V,2bŸ*aŸaúj†ÅáKY!+ËYˆ£Q1—ãȱÒÍCk†ÔØÚÅrak–â¼Ú˜CjÖuȧ±9õú¾`¯ûØÛ 'É·ÏýŠK°|aèWV?eÏ¥e¸bþƒ{;ya¹*˱žQãS7¤èãìÇ“ùuœýÆnH°IKq,çÔ­âJ´í)7JNÛ‚7¦ö4ÑÇ}½ÍÞoí2†ßL¸RæDád¹”‰ùËr%H¸ÃŽˆ¬/ÅúùÁj ‘_¦µ×1"À`«£Ñ()„8ñøØV™lXÂ~ÆëŽâÃÀCsâKðmpž,–z /$CD<*®°~Ð)¹jyô#ÉŠ`qx€ÿOɸ šaþ‰Ÿ–lü«È—Hî>¹f΀²ÕŒLV*#êÞçö®Ã‘9Ié%+?Ap©R “ƒ F±1Ñq:‡» š<ê‘1FW òIò:F”1Ö’{¼;Øëp<¢Ø鹇nsï ­•½9®=ÇñYDîÔ”ðÖ66–BC ÈôpBºˆÉIªØEoadJùI…Ž_ ÏN8y®žÞ—'ÿX"á:ÚŒ±?(>šþÉ(ícëX—gnŽà’q­0¬XWB—Â\›ÆÕ¯¹†ûá`®5§’hT1½Öiwƒ’VÁí¹F•‡ó«ÙßC¯]–¾s%èuSèâöþî\ëÃ\K9e$ÜP.šª3ÚŒ|XYiï#.+=98ž˜ã<è1¯J|Àœ-Š\X³ÄåHÂ’{«×êÁË^¾yë¡èžé¦X-a £³Án!¢¦g§WŒÂ鱓®Š†Á±Ãx[³|yì ßʵX.׌8´'`ÖÍÕc ÷lág•SÞ;ã%ˆdöE<‰“\yu•ˆŠº Q|<º"䡎z +MoÑý Ȧ3Ö DÓ#O€e¹¥À(ù‡×Ú·”M(AàQéYß{¤@l¦ÛÑ £¶5h5»œ©žÃhͺ@z騭>]>ŠG‚q-k,_ òYÞRÅèï Tw‰mÜ\¢ÄÒ0h,YΗ7‘T9tdž ÏsAâ1Â1p„4#B~ÇuPȼ $¦H BÝBè‹·–‹šXÇK\xLÎ(ÌZ Š…ZQ(g2êsMâõ¨øÖ³â«¾kÁf†Q2#^Ì ½mPà­ux0„“¡s–¸ÜO‰ ÏüL¸±BxL×s{ìOa0¿¹íãÍmü5ëõêîÔOô[ØøÕoÕ®;MÛ~±uS^èçñê7WŽNÇüÃÒ‰V²Ê™’BÈIrŸo~›eZ&%)é©Âå‘M4†î朂X–Q¡å¿½’9jha,Ùñ¸r;k$ð«¥ù1hø„«Lª-dÅHo§y‡Þú%¨jÌhQuå@ìnñÅ <$ç¥ÝŠÉŠw)&¸C_gÅ îÖžŸs5€‡h÷ë¡ dµ{ߥ„R¦¸Ý$" ‚Lå§b¸¥òÄ|Wh …'<é…8L2°Dm%ßÞÍé4tŒÿ0ÙDŸ±d¡ŒDãaoON°ìõÎRYÂ2Ö…Ì.žT93óí^5€¬‚£›sÕÊw$zTÙ¿ú$fy†¡®¦SáÃ~8cÑžÖDFX°Ë Ü—0/Æ©<6 ‚UÚxÇàx<”å>O ŽbÄ( %ÃýìÀò‰ÃËx>zö1æƒù¡zà! 4#î CËzä­¨¬ñáÕ©fûøØë+íùkûmn~®ºÿóõÛ—¯žþÜ6ç~ôÕ[5|5ÛoçY\ôÏøn¹Hk›#Êøêëû]Ù0œÌœãõ°.û)† %‹8iÛž.âtÝ®_Œ©sÉûa ÖYÌAïts¸a²7Ì¥ÖUÿú“÷ðo×3Þ…~@uV'Á¥…æ±Z¶´:ëŠQ澎í°¸nÿ³îÔq[­"Õ n†Î«NâƒU@Óø¯-. Q–4j¼¶+®Þëö¶9Ïó›§¼ 9»Î]+8LýXò,ÂñãØô;5¨ýÁÖ¿Ô1dã×!;%5ÐöãæÿÐ?÷ƒ endstream endobj 3144 0 obj 4318 endobj 3148 0 obj [159 /XYZ 40.7999999 350.419999 0] endobj 3149 0 obj [159 /XYZ 40.7999999 350.419999 0] endobj 3150 0 obj [159 /XYZ 40.7999999 768.019999 0] endobj 3151 0 obj [159 /XYZ 40.7999999 722.899999 0] endobj 3152 0 obj [159 /XYZ 40.7999999 768.019999 0] endobj 3153 0 obj [159 /XYZ 33.1199999 391.699999 0] endobj 3154 0 obj [159 /XYZ 40.7999999 722.899999 0] endobj 3155 0 obj [159 /XYZ 40.7999999 677.779999 0] endobj 3156 0 obj [159 /XYZ 40.7999999 677.779999 0] endobj 3157 0 obj [159 /XYZ 32.1599999 393.619999 0] endobj 3158 0 obj << /Type /Annot /Subtype /Link /Rect [111.840000 404.179999 225.120000 411.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 3147 0 obj << /Type /Page /Parent 2 0 R /Contents 3159 0 R /Resources 3161 0 R /Annots 3162 0 R /MediaBox [0 0 595 842] >> endobj 3161 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3162 0 obj [ 3158 0 R ] endobj 3159 0 obj << /Length 3160 0 R /Filter /FlateDecode >> stream xœí]ÝÛ¸÷_áç爢$àP »›èC úPô¡ÈõZ.‡nï¡ÿ~e‹²½¢¤8R²£ÈnL“’Ãùøq8|÷§ÏÿØÿë÷ý»çÏÿÙµ?Ÿ?ïªCeªáÏþø÷‡ëd{PrøµiëƒìŽö_¿í^÷¯»O»Oý¿¯;aNí¾pìbhð÷¯¿íÞ ï†O>?ÿ¥ÿí{¹ÿsÿ¿_öû{ÿã'ÛÞñ ßvmgŽ¿ü:ü"¤mÿŸëߎ…ÿÞýõûßzÚS»ÇlU-“èx=W§¿×UQgýdiQi½BötÖýtü÷Ÿ»ŸûÖÎd:-DctSÍnµ‘ÇfU×ì»Æì…RN£ÎØf6•ÚP-;ž†Ž‰´¡õóÞø›"O}ÝV§aʪKž1ÛTòŒ5mË´†íq:’†6N=nêÐûþ>§£öØKÛ÷W¥û-˵²ªF®›Äé<·”º.Rˆš§¡#E"idv}qKäyfDÚ¤î¬sSÉóeÓÄ)iCgÞiê‹Â“…÷ê©øôe÷îcwTî_~îÉ8YÃ/ßvºÿÏQëÕíþËOû{3áý÷_~ÙÕ½ÕÐ YŸL [¢O%ú US[cÖ<%—jøÕöTbR´§"O#%BžJšCÕ©I#°Nëˆ+?žJZÍô˜4Kp<[°„293Šß„êÊ¥„8ÔÚ©³\˜ƒ0%xäS’ô‹¾Zú½š>1+Çöçp¬#?ÌçÊ\LÙ+bEnÝìQà©À|é6™[½ I¢”T±í¡í*ó¶d IÔ#µ—,Ÿ ›OçÞ3P‘D.™îZ$>|éµU&ÝÓê‰òq9z:ÑNëÂmã ž$ç/ªûÕùH¯E5ÌUJÝ³é§ ê¡„ S<ëæ(f8PϺáÉÁ"ÙYZ‡G?Â%vÃû!‚q#“ËpËh5e)‡ÇðvÃkÁ¡8…f…gê~ƒÖ“ËXqGX£!FÊ(÷ÛNLGMí&- V¶¸13a»ú‰k^Ú½ènÍ‹4ôtÍØå`kt‡oˆ%Õ(`›zR"u|/°µµ¦Q!*ÇBRìGÂ’gk½i»V—e™[šú­]g5ã‘óÖ>Æ´áñXÅdÖØ¾šë'Dµ”ˆ‚ê#ݬ½5ÚN½8;¶ŸœæÛ¥ÇE4–˜f:í1‚)ÂU›Z|$•÷Ý9WYÀÇäôÔï”°Âu´Ù\ç‚Âj¶ö(ÄF ÚÀ‹D1#„•\§\ù#\ìs)Ênú×Öô¿h“$ÖUŽëN¸&êJÎ2WÅÆ^úPJ„™³7H1R9‘O†]*´jÁFmŒœš}GÔO:Tb'üV‰$´&P‰0°N›[¤µª›ÌTL$ÒôÀ óãK°Wè¢Ò,%€EuÂ*bÿe>ÓÌÚº´)ÆFƒ2 ø¸úҳݘ^ïi3Ïßù1)ÁsöP_&x>eÀî¾Æ š~ЖqÇ+ÑN¶üÃ;“YÌT’æNàȘ°açñj(Gø”#í…,…ñ© ûda“Ýxxmþ™ziøœ÷|A7¥1A«pù bœ×Àb8…åÈà»;#Ùb]!üþ`Ý=–VL¹Z¾T˜-k¾¥¤KÇÑu3r¨¬šE²·@ãuþ° Á´<{1Ã: Ä™$—-1¯¥DSÌŠÆæ#åPƒt¡‰ÖÄ?^Ú9£ÌT­Ø®gAÑY° K®ˆ€ý<±U™îv2?n¸‹ •°—#.ýPfNÉÉŠ¯Îh½Žüí¦AœÊ“Í(K<¤Gý°žùð0qJêã¿¥íþº–›ÌW Nb¹¥?píp_HÙú©Õyü0¢ÌöÖQ¨ÄöKpäìGÁ<ÓféVÉ, ÅÁÝ¢ZÃyƒ%ž=H›€`Úð¼‘hÃsW®‚‡‚&¾Þ |h÷Œ½©» ¥¸DWñ»VàÕÂü×—@Ú<ÒslͳÓñxàxö œQ,…x×Gv g}à”‰‚WóÔ˜Cx¹×#×açÍ#Ÿp$w¯%lN°2òÉ´ÁÑyJ° À‘åX`{s9^a¬0aQrMÚÑióè°—rôÔÕxW]aù€×Ë.ŠVǺ…`q`ÉN±á–·I=óGºYž4˳„ü ;µ™tu÷:" &}‹yYpþá §‘Z1&¨ÏGÏt5%âœ×%E,§„éÎÜŠ PN`ܘ4O0ÌsÆ£c‹Ýr¿kŽâ9¢,µ[7z"æôH¬Ôý¸¿L€ì‡W¼wÌ#.†OÑçËRO¿/œJdþQéù.»¬owlI†æ½x Mþ,‚ÚÑ7 !ò$M­WÄ7B½%ð–s*)C©’o'9Ê ö€ÖØÙ-¹µÒ³fè¨$ˆhšs¯¡BÓŽÇ]˧0!A^¥`¥5ƒn–Å#…{‹¤–”)M•r²ÐÒ4Ív@»Ðú¥ï-¯ä*©ÇÙ„G·Ж]“sòî’¶UcÆÄ×Ëz!C©VŒ& z†¾úü;;<ÙY’¬Ò>:ø—s·,|C#"ÀøŽrä¸uÃ'AA‚V˜3'ËÕí»Æÿ·ô¬Lç(Ž,¡‹¹¬o_‰‰¦(”1ˆ"aJ£Øºå18¿ÞSožxVåk[`µ°záÛ”ì&ó£6XɺË3]Ï¡ÒB÷²‚×sž]5Sï#"…'å"Îß– ²‚Û¨€C§ÄÅã4òj¢ g¨-ÞØÅœÇù'ºfñ†I†Ofq—˜Ï]ÂÂöR#xád1¼+Sg©è&Î`‘ÒQ›E¨QÍÌXÏõ3ÅY6»GØÝS]vÏqœö@{|ˆlßË\!¯?øu÷Ù#½3‰}!'“G¶QÞaN؇œJ}S‚Y7vú a?üÄÒi.›Ã8_é&_±Ðqw艟óäT¶OÞu‡®=}ùRr~¨Ïè“Õ‡;´¶e3¶qµ•Çwùn‡;„DZÙ8¯}gž`‡öÌèzeœŽ0Q˜+ŸÍÁ€G oÐ"J]éä‰/ýJîÈÖ|°¤ †y³_€Õ>½ÏŒœšuå(^åäг ”sU¼QÎb׬ù1¬"ÿª”]\æ’-gk†uTB'¬IÁ<¯R)•@i)fóZ|;H¤4Åf¢<9úhþ æ^ìsKÚq¦µ{Tª–Az6jó¨6êA=*Ì£xM1„ç§=ˆ?žkÌña}[çÙ÷HËïÆ¯ÅšÒ3;Xö½M9a"Ù_X’Ã:k÷kU“ò–Úæ×úø²è:v)kRÒ¯ÕU—Â=xíú•âñzl3lÿPÞ_Ñ" (T+¼y¼#VªkìíÝ퉗–)§ýÅü3,ïð]Ö3ZÞ× =/-²îç )óêdJü^l©±Æ)Ý)†F9oZôÒ Ù©“ÞÇ{0„]â:˜_0—ãýŒ÷ ‘[sŒÖ÷a£MéÒ>[<²ïtJ|/ÅvXsL0…Ë)2MÕKÔs·Q_Œ  endstream endobj 3160 0 obj 4127 endobj 3163 0 obj << /Type /Page /Parent 2 0 R /Contents 3164 0 R /Resources 3166 0 R /Annots 3167 0 R /MediaBox [0 0 595 842] >> endobj 3166 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3167 0 obj [ ] endobj 3164 0 obj << /Length 3165 0 R /Filter /FlateDecode >> stream xœí]KoÜȾϯà9€iö›Œ±$È!€`99Þl‚E¼ˆ²‡üýCR’Ùó5ÙÕ!Gmš±8ýªª®÷T}üã׿Wÿü­úx÷õ?Õ·éõîë©©ÝŒÿªáçÃÛ?ð¶||kZUónøW}û~z®žO§Çþ÷ó‰éóÀé¥8/1NøÛ·_OÇÅOã_¾Þý¹÷¿ŠWêÿ÷Kõ׿õ/?Mó ø~j;=¼ù÷ø†qÆÛþ?oß ÿuúËïª_û-´çy‡ßX'Ù†íãùe(;ÿ¼Šë%¹6ËxÿKõàøï?N?÷³½l£î$cFKÓlžÕðaZ¦MÕ]IÝY“ZgÛ6 H g¢aG,ìh¬‘Æ=UÝJÁ„áJhP Ú–÷ï˜þyìØpv>º2¡gŸg ¢1‘Ð:ìˆlFœ‰| Úþ꟯üÚ´ç'ºæ¬]`ÇZoD¾© ]r±ƒeìü„ñy+¯Oºå$nN/ÅrÓ!PƒËX³²v3šˆrˆ%<ˆµé8i¯çzIü)¸IÂÛ;褋Xt€ âÅ1½¤H§ÇÈ…ï ˆí\Á±°uõମ »Ç×>q\Ó/—¹yJYÃ,jµÈ)ªŒñ „ñ³¦ÖæL šÁ[s Þ~¿ä£Ÿ×$‰˜™”ÑJÿ@A°Á_Ò%1ñ2¤ fMŸ†:V‰ÐÞÈ’mÝ¡Ù,¯Æ9sëo׿u›v²<9³xÖ*u8fÇÀÂO¢ ãÓØvz±{réÒj±”.iëåEÞ@!:ÇìÁ¦fŒKkkK»(Dr 7¿ #,÷D…ϹªGLÂ3½%m6ïadLÍgL$‹,X8Ç:SÃÈvðjK*B¡o¯7~´­Û®Yè2ý{ÜóUB¹–½~$-+±MÉGcµ’úG”F—ÙŽ%Ç-°h=1(¢2ý$Äg/cƒ3½5jØ‚aIžÙ°%8b($*b!fÝnÔF™¤Á¥ á‰#œÐÂ1؈†wè‰ ¬Ã;ÿ4Ÿá¼7ÁëL|Ê+¤‚O*ü1'ÿ¤¢ì@`,À½Ip¢À êlø<ãï Rï«I¯š·M;#¹V%Ò]ÀÒC-ÀÖP¾{x$(^¡u…ß߸—K2 8c™ â°ôØÂ¥DÑç߉•D@Û×õˆÒ®ûÓì9µ7ÓÃ*òÖÀ“Y}é|%lßfz8¾=¬ #&Dõߎî"Ê ½%ÿ·yÞv/³Ã&$.B(™%9m¬VÏæ¯€É\¹ô~G*Ô_)[ØŽº(ƒv™ ¤Ç1l}aXã1„Ä9l:ÖÁé~p×ÛØb“Ð6å ÷†-t0õî§¹’!1æH ¡Û ®ƒo0>¶ZWmS?Ú‰jÚÀ½Û \Ó ’èÃ7cZmÛui`…y¿(L¥÷a)ÌàÌäI.) û3³a¯%ÖD°˜àk¢§˜+’n ^Ëxk1‡Û;ïëX»ºŸ¸OH7K*HËø‰CVnºƒ—ÃÙ±| •Cˆâ{?Ç ðy0~(¶MT};.%’"K”˜FTÌQ¬RJÜÍBœ SHÜHæž%?¦‡˨]ökg–FŽ5L±øf`žF±kñm‚Ü.+•ÀIίnvýëþí™bµ¸n$piŠÎäÐÚ ¯¸5{S/¶¹)_I>¦l÷Ö^ò•úbí9µÕbíkoïÖ¦QŒS¼ 7¬1aœbXcЧPŽÃâ@ù޳ÜòÝØÜÇ”âÌa¹OJ‰’ôV,eà˜ûDoPgÖWŠ? ÀIF€h ¡Œ;‚ì§x zcÔ’Qˆ°Ê®nÇ”Gq!ª°Ô(¦hL"i׮ż‹'jÜ’wÂ1•|œ^S¼ŸN.DÉÅXÀZdÔ¼¸ƒúE)1DB^\Vݬ É躵¨ ÎuÐ ¦r|Ÿñ!x2÷œ·…¥Äa³¦krgM‘îÙÕ3™ñM§ä“St‡=ç S¨œÂÓ´m²eÛãØ-ö–c¯ÁÊÆÜóhŠO/2̨0ž;÷F`ÿgT,%‹k'rF†äÑìÚ.1ÞãýTb¼T«’ã=¨çãÝDã(Qs‡UõÛgKÖ9L!W·²“DKw)·§'y4’g[¢¿Ny¸óè/ksgæŒó&$G!ëNyH¾´)J‚É¢S‚»‚›àÝÌŠK›¢×'GnSäèÀâQh_%40òiÖRš,­6Y2rquÉ’“ É–¬Ì£7C¦ãѯ" ×*9™Rlpµ$>JAmΗ©¹…ÂØ­i¢ðÆý4w¹ñ²ë¡Ø¸.“ó`î1†!9ày ?ø}ð”n~«<ÐRVr¨$°M4 ‘@©~ë¸ ¸¡Ûv†¿¡:óööi$’.2Ci††¯Íö¦>t¥Rõ*¯žRR.4¾±U´:¡+v·`rõÌ;²eó•OBÏ©¥|ª+8rkåSã~}“hÇÁìëV½þŽ™Vw}òû)ízГ¶ˆ­mHªþ;å‰#샱…M°<¤4šÂR‚ÂQ¢¶Š[ÖŽ”¾„pÂQ ªÊrgd3›¯Ù‚oRÍß¶ñ7Q6iQm@¶4Gâ¸W¯åªÙŸ‹ÑÑ™b(¯;`ý@[ŽåaER¹£cÔöŒ¹z-ÅhaJò)âãDñ]y@‹Òs,€õP:F 1%mÇÄb„‚ Ê}å÷«WÀ£‡v̾»>žX•ðá1Ù¤»…TŠM˜õÇÀ®76wº-:]õI¿¤)­Ö>ö]Ûiný çìûDsöÛj=—p¾BîÇÐâGycm‚rF<æZ)tGîIŸÁj5&€n}¢¹ÛsG§ bWFÅ`'1{š6µc°ŒI%^$_‰ê½£¨^iЏ—˜€’‰šµÝ^c;¡tHI—ÒØn_>d¤]<;l‰&Õæ.gRÊ`¸Æ”2Nü”2¥±Ý§ØŽ1¥±]VíR7Ù 9•R)ðÈCÊXäü²¿–!Eö\¢õýX-¥±K&—Æv.}á]5¶ZçnS¬='ß(Ö^±örZ{¥±+–VÛ•ÆvnÌÝX)ÍÝûÚRlÅà¢Ëœx4MH»¸œþÃC¨çúÅÿŽùSÜ<‹bQ‘´ t‘O‚?`ϲÒÑö Kª¨º¦ã‘¸•ÄŽo %–œ•—‹ FX¥õgiý •ÖŸ«·VånÅUZ:eST^SâCN.TZ–ÖŸ!¼ÓäΑÛs\¹´þŒÙz‹­?Mw„–lm·´ñlJO·´/m²–Ò„„Pðœ“ë÷TßÞdÈn§¥«5ÆùöS8Ê„T¾NéOÒ6jÁ:1Äì»n$n÷ ÿ®0l£t¤ð) ÀKãvK"±0Wùñþ§zî)­'¤aÄôòí»ƒôlšm^iöÑIµÎ¡«äÞ+H¬?×%Ý©cº>#¼ÍKç‘_i]ëË º“µÅ[ÜÔæ2g1žŒ´.DÍ»‹]A”ªõˆ•%Ý\Z§…c:8fTÆ ¯y#†G¯O>ÃÙFB}û—{øÙéª\8á4fâ+—ž0tŽéFø™0æsöioç @uÃ{®ØÂ(½žô§F¡Lñ˜¸Å;Àxš2×ßÌ2ùõ.ÍW†»Å´ãXCî`ÊçÙ´2Þ-ÞÓ$©/Ñ3¾kwQè¹m]3ÓK΋„}iaH¤Ó˜IÆD”/ÕãéÿŒÆu endstream endobj 3165 0 obj 3329 endobj 3169 0 obj [161 /XYZ 40.7999999 120.980000 0] endobj 3170 0 obj [161 /XYZ 40.7999999 120.980000 0] endobj 3168 0 obj << /Type /Page /Parent 2 0 R /Contents 3171 0 R /Resources 3173 0 R /Annots 3174 0 R /MediaBox [0 0 595 842] >> endobj 3173 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3174 0 obj [ ] endobj 3171 0 obj << /Length 3172 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ù”( XÀ3ž CÃääxw,âE&{ÈߺÅîž!õQbñÑê¶lÀÓ¶¨b±ÞU,~øÓ—ìÿùûþÃã—ÿì¿ÚŸ_v¬a-ÿìxû a)ÆÑèö_¿í^÷¯»Ï»Ïÿ¯;Þ´?†ÁÓ+Æ ÿúÛîÃøòÝø›/>ýo/öþ÷ëþo~üdç;|áÛÎôíáÿÇ\pa†ÿ¼ýtü×î¯Øÿ6€`Žóþý÷Z´Ì$Áñz~”ÿ¾}½l@–R¬k÷œ‹N= ã¿?ï~f;ƒÑôŠó®U[Íyê÷Ñãã> WÃ=@"èbÂão5þò<@ðz1Z]ñ¾µ1ÛÓË Z )оs4E€Þñ>àÅz’ w8½? Fûrrh‚XO9T!æ°—=î|FÞG_Ï'ˆ´yácC!ŠØ{x(1±H ÊÞãg<ûóžd¹‹!e¬ü?BƒÏ‚yý¹|‹ýÙ1ÕgåêMãÂè“pqeÑ ã(‹ëiÆ,¦Ý,U±O#³¦íø;*VrN û0{v›'˜—»B”¢Æ÷ŠfĔϾ%í‹Ñåƒl˵<Åq1¨>ÙI´<Û" âãlr+w]ÞAóºúq=îåfŽ^ÍEFgAy!Yï ö"×ßZÁÈÅ#.«ÕQ^´-¡¨dòÃ×HW ú!lØc ŽÙ?Cp-È©ˆ ¥»ò³ã&¸CQc#—±ÍRÈ2K{5Jr> ì²Ó³61VPÚwB¸Ò>B€P‚ÇBN?/í GJs$j+¤œÖé÷cT¢øTBõûr’0QO¹ WÒ ™¢G‘Òò÷ðôñ¦©‘G4"àHÿëN08„ÀF+¦fkáÈ3‘ðÉãß“;ò¡"%™»…GðnAÌvø)+aübžÁÀõ`žÁôb-˜©H} Ò˜-¨C/}Ÿ€y×=;ReuƒP?áJ›|Øž +ŠNœP`ë[ôIË4WB–qhWCŒ‘/¦r$Þ‹#Ì—åa‘–,ÁöíDœ š­Å™ ^/ ©¸bÞ.¦¤ã2?yƒ)!E’ÔlcQ¿¬\•½tdV¾³æUI‘k}õ72·|uŠhwÞP”üM4†-–óN7¥2.)ÀJžÏÒ{¹°Ì:ÀªˆÍ‹ðнX‰‡Š!Jê2µ‰Ø®-v‘ÍÆ–ƒØ{ǸqöÝ ú`Ø;ÿ€Ñk˜L=߈Ò@O{Ð+WŠw2ÞìAC ã {ݶ€'YÑO–Jß7§F0Ïh8‚¡¦P,æŒQÈϘ›0ÏdM 1*±D!`T`‰Bˆ¢á¨+…FZãËN‚Î ð%îK‰Kbm„ùôúûƒw²?×½ åe=kŽƒç5ç‹ÆÎD?å9Ð|&Ê®ÕïÃ’1ÑŽ,iåÍ¿*ä_)ª‰8A*E¦ÔÑ'8v$HVã÷7#"6A ~}~÷<öÙÙـٓ¤ÉrT¼PÄ[D%[ñˆª¶QÜ‹îØ‚ø\Zm”«’WÄo¹t·?â-Ö „òT?¯–­¦cÆnRRÍÚMó´OÁ“WÃX=Šy;§–ÊU¦”zg©TŒè…@)rØœ8.qvj}i¸«7Ëy«ëw·Ø2.ÙbÑÊt'£•b(ø5ŽzÀ÷H=&T‹âgp\,0!2‡cªòΪ3Q)\ «†\Žd­£þV³v~qä“’‡ ì~OÍÚS-t®Ü€GpnS–IZ„ÝÂ95I€€µ$à Wàì!Çï¡ä/¡ü¯…Q ŸÁ#ÍPUÂ)5Ï›W¡PÖax‡)úˆ$°†§è \Ù‚e'„:/Þªj V&И=SPR#²¿u&òÔÊ“)“'cw=$’ºïÜó¥d–>£óGmWòßNßWGDÃ#ŽÚà…ÎæJ)©ßYb+©ºÖQ µóÜ1³æè`O¸$¢ÕÀ|D?†'R2Ëeù•Ç0(tÔImÞ/ÓÍ…$&°:)sÐgS#GzT¼ôY‘!IVìø 1nD±Ê)Ž-;…«f(ÉY‚чRÍe}»^g½«qó î2¤´»Í•;Ü#Ñ[Á©Öç˜7¶0< Cà‚ˆÌ¹§­IÕ¯„ì¾gÉdi—âÄã’¹ ·ËŸä;±ºbª|½êÏO½bI¢è•ËÇUœ»Ü¢‘ŽˆhÆ·œTæM¢˜ècaµ±¾@^ï"§Tòa&bRòY¢žëa÷õ7½×¨gµêßÖœKŸ+õŒÊq™¡Š â”Ø>_Aè µÀX+Ã4„0b€i(ªsÙ׬F#®—¹³;ºRº«•¡ök RzO¿ô¾Æ¢×¤ Wy$\ÞXfÛUíEJã3ÜU´5¸éž#Ë X%c•‹¸/×^¥Q‘õ,üòÊ“,Ù¡š‡;:u*ô°e„Ô%k ãÖ$Ι¸+tµù-ð#!æ”Å]`ø¬'(”Ñ¿/y<ïgÍ´6"õ!‡H®™»6æ|ŽíêyÅ-w}Ÿ¹ëžéÕÐØ–»á`Ë]'P¹Pµ©·9ÌÚø”Ô®’ÎuvK Üì”@q¬[××ãV°÷`ªÀm„q{Ǻ­mëPE[´’¯xRÎé;ÆÇvõö«Örõ@ üO)§x# Õ÷1'æ1Žëdî¢Ô}K ®¢h[³ö|“Î÷Ó‘ª_JÙ­>»Ç~øš3¿[?ü#®8ëph…Ín,E ~ÜM}™Ã!ƒ°ŒU„[¡)†šÀ÷ýÁá@ì4ÞfG~,Çjò¦H¹×c»«b»«¢glwUÌq­Jºa†0BÑ@kNúxS9áÎ÷ZÚ^B~®æ3@¹€ [ éGEÐFØêÃ4Š1Ši4dľ0«­'«%_ëîš•Ø\m훆nÓÀÅ ÿ¿§zñ3”; ~Êš=YJ:w Ì†eÚ:øÙÜÈmKZ°Ú·-i¡Ïɶ‘ȧò7Ëû­ÜùIÒ½ï„cv˳ŒYn9¹…JÖÀBq]5¡â:P ÑV)GËW뛄£lú´pm{ÍL™d§LÙõË÷¶Ñ»,Õƒ [ m%¢!l%¢ T®ºÚT¾•ˆÒw«mgù‘B‹§^›SÑÆ[¿N ‡à§œ¥×¾±ÀåÉw5ÀD=÷¬TŽlz.¡ ¦áôø™Žàg lÂÃEïXö;É<âרÏ”5\¼¼–·i¾! ßâçhð=«ãÆøGcnE¡÷”n¬×ê„—ÔFay‚˜d) ‹p·Ûåõ§G‘p“×lè¦h­sØé¶úsoU̳UÌÖM ‰V‘£ÃL¥Î‹x}yú¦añ„¡¥HÊ9õx%Ðì õlZwÚ+墤õözÉ¢C¯EÐf2g+¢5{ÞO¶=³1Šî|&å\ÅÆ?`à;‘j§ÑÆ?Ã?ÁgzôÌYÈI/bclº1!Øgͨž{ê¨äµ™×–ê·p³‚K™$Qà1^–b…oÕ‡5¢¾¡Žu›®P‚C°µ°¬q@A›ó…Ùøð;n-‰[¾àã„ã÷cqøh¥!&>"Á/{2üÝ¿È{ø‚ýñõ[`7ümd—müÜÈà£óÉœvχeL¥szÞ6cžE2õ~™mÛ´Ó&q¯Ô]ÓM纉‘Q4JÙˆ~²²Së¦Õ;Sï1ð™>3šŸh“ïÎZX¢žšm”&Ú#²©ïÚHÀÄ ŸÑ3VOœB˜â1öC€÷I2—Þì™§©ùñ›!´˜vïÁ˜„Øôç¢7ch1LÖ°›¢gÌkYèÙÖ6üÚŸ$ì©C"µ§°¬ŽÉ¨_öŸwÿjÅŽb endstream endobj 3172 0 obj 4138 endobj 3176 0 obj [162 /XYZ 33.1199999 517.460000 0] endobj 3177 0 obj [162 /XYZ 32.1599999 519.379999 0] endobj 3178 0 obj [162 /XYZ 33.1199999 324.500000 0] endobj 3179 0 obj [162 /XYZ 32.1599999 326.419999 0] endobj 3180 0 obj << /Type /Annot /Subtype /Link /Rect [223.199999 370.579999 299.039999 378.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation >> endobj 3175 0 obj << /Type /Page /Parent 2 0 R /Contents 3181 0 R /Resources 3183 0 R /Annots 3184 0 R /MediaBox [0 0 595 842] >> endobj 3183 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3184 0 obj [ 3180 0 R ] endobj 3181 0 obj << /Length 3182 0 R /Filter /FlateDecode >> stream xœí]Ë®¹Ýë+´0r“ì'¿dÀ°,‚,O&Á`<ˆ“E~?-5õ0Ù‡d‹TëZ6à+_ªÙd±^,ž*¾úãÇ¿ïÿùßý«7ÿ½ÿl¾ù¸kMß,öÇ¿?ÜþB£—ÃØôtü³ÿüe÷uÿu÷a÷aþ÷ëNõ§í¹ñüŠ¥Ãÿ~þm÷jyùnùÍÇ7ž?ýo¯÷šÿ÷Ëþ¯›üdû;~áËnœúã‡_—J+=Îÿ¹ýtlü×î/¿Ûÿ6a<õ{ü÷5õí`ú¬q|½<ªNoE/›‰Õvݤ÷JéyœÝLŽÿüc÷óÜÛe‡©Uj˜Ÿh’{ô©ÛNï§¡Ÿ?N^§ÞÜÒºR¹3Oˆtt‘Ê›šjÚ!Ü›ôSc–iÙ½t•ÙQß 2F¤ò¦v&=îê0ööüœò¢ñ8s5Îë7¿rY©îu'µÂ×®r;jµPGÇɬp +ÉîF#¾ÂCÛž¨Ù6~§Dzž»Ê]˜AµÌ G¤ò¦v^a¯«"¦U_Më×Àƒ¯?í^½W­žÄ§Ÿç‘œÜ‘åǧyºÝþ‡YÑÌ|¸ÿôÓþ÷McÞÿaÿé—Ýtè&3t‹ÿ²´4µèá3µ¨>ó¶¼£¿ÇÀ=ÁÞ}Ô¸7ÓÀ–¾· pÔ¯áØ`‹Á«ùÓ¯u3¾,˜eï>Í ¸<ÏJ'ÊIxµ /+HÅÀ¼±BúêŽñž7ôg4Ö ºU]áÞd¬0§% /!åÒ uy@_ÂÕj¡RpÔš¡­8úÛÍ€œAÝ×à™âù@Z×ÒØx¦êlzÓÛ ì£`kðx ü`¾ÆúÉLµÐ¨34Šy[o¤C£îñV3×û,±–:#íÆ‡ö®°îéð®Û-¨•° zPº}7žy 9!k›“F¹Súãæû– Çë\_¸=´Ë°½uèZ«œÝºnÐM¯‹Tt£GõÍšÞùª5)#Rî³V†C˜(ið¸÷«¸×@'Š·¨ÅîeÆÀÐ €¿äx¬¸“·ÑÀÁ{Kî=ëOÏã’&üÞ7G©C×öÇuK诧Çë>ócúÝáy¤ð.c`‘0WzËç¾ÏîÛÛsüˆfƒç™%¨éÏíºtïJ0~ƒXTÜ+nÁÜÕu9z2` ŠØõGRB­‰)!‚þÐ Ó‡qj¾u 8b‰õ2^Ÿ÷&j…eùcM °‰¡‚¯)ä–Ñ‘úu8¥‘¾ä@FóaX–€×‡}UÜ‚ÇÆ­b¨×ÖA«ÓT:°,ØßÆü‚uæe?Ú†J•2‚œQ IY±×£v„ð¡cµ•é]uE& v vì_rŽÓärãèí~`¢âwýªÍÚ\±Nv“ºÒrq€¼ã^Ü’`6sh?°nÖšM/«gXîÀÑá 6Ž&l0DÐ’¯;úÚaÐV³®‘¼Î96ÀaÇ8–æeøsÅõý¨«ïãºFdÅ8èw¼RL,9é6r@Né$Mà lñ®IBSLBÖÁr:OS0bGÁ± ³6Ñ9Ç·ov/„b‰„$äÖÃNqNó³ @îÜ‘$$ÜÕB‡WrëCmŽEÿÙx™Ù,VToIú5ý}¢pÉ€Èg ^³p†…sÇDåÙõw9—ow$Òªkå¹LUÔ¾RÌE0®¢øæÅ9P͡Է±Žákð3çP_£œXn)o2ú©sLƆS~äRŽe6×È¡ÔBá|¤ìiŒ¾Âûe­þÊ–£÷•ÉùŠ¥”ºyèµû7)s0­öxá²ö+q ®¦Ã4žr žÔÿRá/¹7‘Á®£}Ÿ¹!Ý8l·[<³„­Œº·ºÔ=–Z¤@®< |O`]<ºá!y …é¦Þ{œ‡€ßèSÒ\éä¯ß/ej•*ÂôZ] ¯r˜[ì„{º–`Zk'"ñOÅ5ö„:!›BØÜ|5‘š éù9~à‰ã¶æøøœ¬¦¨KF™VzÆ£?øtQ¢Ô¦Éq†Ó¥ñƒ_>½¸Ö"'Ð Dƒ/_²åF•s”fŠucÿ™Àï„s˜Gc‚:&(Îx5*BÐ=òevè¬Üq‰(öCšñœ²[Œá€pK„MH%O]—´Ð[5Lt`Ñ/‚˜ñ=1ÆÐâÕ/Rh(G"xwC¨Ã WØCçY|ž†pľ @ãE8 ¤2r(NF`–s¸Ç:‹!J‡Ž®¸R”s´ŒV@$âõYsŠœH”íðøžõ p}ƒ;©ö­]ØÎ('МîÌ:y$ÿƒ3ÏàÆ»•©(;x7¶÷!=ÝÁÁébÔù:³ }Z娇µÌ)ŠÍ‰¶ s¼©ze_z=žË¾(œ<.ZÜ'Ì’lEÓ£9ɼû.*%µâäqœ¨¯`R+N_·îAî3MNÑ•ï§P‡Ë9EW„‹ pŠ4T*pS­ø.ˆqwîeŸÂ¥¬°¾Å«€ïc¬‹{ñ{%,¢…°,ÔÑ·ú’ŠƒËØ0nzz[ð°µÇnÔ\-.nQÓChsŠ”<=„§‡ ï!p I¬7ð0Âàâ`O‹ZD?õ—â;²5f›êÌnTQi´`MŠ)¸¥2À‹•næBãè>Î|wBc-ÿÖñ¡=Ê*òÜ6qÙ Œ”sßilgPUÐvçMOl¹H¥þÂU(€¹Œk7 Í@ÀôÀÉø‡`á\ŒA¸5ç~ˆ¢2¸þtt‹ä„«:㉣eR9Èjì¤~oõ«úF¿.¿IRÌŠ¢˜{G3ãô΄K] øÆ"iô2µcÒ)@@e°J[V©s±û {)Ë^Í•½Ž\rb’îpÐ/»®ïnñëîcÀ3(ãR‡àp®ˆyÞÜ=È…Òð”D8Â÷a ñ;ã%Þ˜A˜Î¸Y‰N‚…øJÂæg’pÌ‘8çƒ^%ëªwB±†šJÀàçÜæÇñÓS“J.ª°­ΑG,|¬kú2²Ž®]+/Ì)ôÃ*šãMËC÷‰d ÆËdo/¼)*‰Tïµ#+¡,ËT%]sŽÐŽ¿^gŽc͉…;®Â°ÌhìkÉâYεؙ ÕÁîñ3=lÁÏÀ±iܼ³û,~=Z΋À#ÉQCë°†lÎf¥šÄ¸¥ €öDÞ7NÏ,µ»kMJÔ±*â>'K©¤;Ù)×|w ÃÜ:÷O¤|$÷HBÈJÔ` ˆ¯èÖÒóà=iHWéYªŠw¾‘§8Ç꣞ÝùЈÂVf²G>ž?YòÊÛÞ,ÇÅ ãbÇ µªŠÄ]!ž_°V@3œwÖúR×ð‘ Š zjà¨1 8·Ã>aÒO˜ô‰nO˜´ Ln-ÇÖÑ‚Õ*Mwƒ“éD¬4=y_qkùžolÞ ¹­¹»R—Q/™Ry:PAÙ+kFûõ¥ß¡ Q 3SêÃÚÇgp1gŸNœuðÉ‚GéNÞj"5xÁòsM ÒTc/.(_f˜\Üĩ™KYãÆ¥²ár’Êk{¼Ü¡‡ýjó¾âðt I!},µËŸ<÷jtÝ6Q”P ²N4,¨çû2ëõˆ g 9ÀãZâ¼Ò~œ´Àå“=á"€Fê,NNÍYŠò*,daÏ’¦cÛ±AèŠT‘Ž„«tÛ›LÇ-Œ ^þÅl„S‘¬.ÆYYÂ¥XŒË’YédgÇL‚§Yº Î>!|OË(¶">+a$Ž¢gE“k+8e}ã{F®çº;V’âC(Ïéj»J〓é BÈç`åñ"2 Ëìá8PЏäe`Ѳò“ (‰ËkYÞRNVi‘kÎj•if(ùä2»õ—±7nÜ(0͇üuLO­ËôʦªÖ¾PšB¤¨G\f› k9ø®Œ[¸â™‡ôÊûàÁÀË{ÛÁ‘h‹W¿²#|G×ù>rwïQÓÚk8Ñ>%(0-w›åaFæfÐ’P‹¶ìü=Rpb.ÞDÅjsÁ7V¹®Pß#xgu’!YI‰œ°W¬!I‰â‰ºHE\æ¬ïŠ'wwÜ×\÷xð8ã[VôF4è™pÏ.#Ԩߦó½`„“ƹ;«|ʰá Ä~sŽ…¶sv+ª_½p»eo5Ãnqö„@9ýöBÐ2 Á¼U“ˆÔ1‚‰g‹TI T§IÔ gNœ}sZZIç¨`&”ÊHß§‹dúÅlYІô“r,B¢LzÒ‹ Œ*#Þ,\DNd›’Zü¬‚=^Î/aQQ‚à:ŠÖR·2JmÃ®Ò C÷s¢ÐUJ8¿ªTŽä1C^µKm¤‡YrÎrX¤¨€“ì\ÛA0åŒØ E-ñ£öw`¸2p‰Óu—^e†‚˜(½ØP:z•ŒÚóâeæW¦„!nÁÂìY«œýg½O¦äéÛ4¹a;îoÆÞ‘sCv–ÙþV¨üVu¸–e©…C—°Bsñ¡)Ù§¸·®‰MàûœÚÉ"5›2ŠÛÙªn(U2nÒ9©äSIT¤6®fÙŠH©ÿ—‘ây7t·›‹ä›¤ŸœfìÆ…-³ÍibÅsŒø•sâ )TtÜ)ÏÓÅÖšp+>—ÜxýDd!ŽúÀ±œí9Žub«/³òörà9UGEvô’ËI©¹œ4[YTád4}B‰ëàu#¸£Œ4>þÝ,XB+l´5 ‘'ÊâÕ8Œ5ãâ¾û1UqÛ¦úÖ]nl§âQ¦²½ÊQ5ßµá(x dÛ‡‹g­ Á‡ô¼ w¾ …*•·ï¤d4~-ö0 gÕûýTé…UFeë.e‡ÕY­U#ÕzUp¦¸Ök W»Åcõ^q Vø#†EKàò©¯ ®æ‹%ã ƒËa]Ü÷1dS¶¢1®æ˜)láÐ:P»®‡n²: k¡@µe(gXsª-‹VÝ~iëƒgÚáêë¢Ô‰Ö¯®¢!G¯Öoo«3žÎÄýNíqÑÞ8|µ ‹8^¯…ÄòÄ H@waÙÀZ ÖÄgQë!†ÆåèU–¿€}_è/Ûäÿ:œ4©¸ÿ‚iÅ‘aȱÿ…C_Žw‡­–&ÿ³<|+EEë4驈ÔaŽ è1†×ÔÁQã–€«h'¦vŒË–è¼3cÛìÅ1¬'rÀ±T¸…sSN­õÁ#¨Eƒ€¾Äuöeð3™Vô«§~ˆÓª’<׺) ¿ç©Q¶­Qî¯7“Áû@,MO›³i›ó”’§eyË2ÌëWÙ²p8)àYa]ÃÁàØ.ŽïaÇÆàX|ÞúÔBO[ý}Ùê—&õOÙ~z5= Ö "ÆRpìƒ4¦C“Nk±¿¿uoî‚–fys]ò<Ù¶=¼ÿÊ=õíft@kâ´=ÝgyIŠ´B%# 7d‘7X£p %´jŽíuDz¸ü!ýá%ƒ“*¢u†fT+\SãªÆyk„róßý×ùÅs§Ç/ØŸ¿FâO¡¹NáCpÁG£³ûýiz+õI&ÕNi‡{Ó\’ôì}Aý¡_ÏÿŸÚÃB™›–…õpÖ/òVZ‡Ç˜ƒžúµ¬É®;ôKÕµe€ïá3|fqx}ÐÍé:ÜkËkØÛ¢nó~׿[¯Ìð=zÆ&­µ(4›D{Æ®eîvl'ÈàºãgÝ)~ÒþûZ:ØÔ¤tÞ3VÁÎÏ4KÓµ¥qWÛÂ÷×ú‡kŠù¯~ò9r¸5kk¼Wù-”K,I˜Ó¡tØäØäp-¦~O`ÅàLYR)jSXHÜ„GàLk> endobj 3185 0 obj << /Type /Page /Parent 2 0 R /Contents 3187 0 R /Resources 3189 0 R /Annots 3190 0 R /MediaBox [0 0 595 842] >> endobj 3189 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3190 0 obj [ 3186 0 R ] endobj 3187 0 obj << /Length 3188 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâC$<ãq€6Ã"‡À›M°Ø]ÄÙCþ~¤–ÔÓMöG‰Å‡Ô=²ϸ٢Ȫb½«øþÏ_þqü×ïÇ÷Ï_þsü6þ|þr¨«ZÕßcÿ÷ÝåÜT‚¿jÓT¼íÿ¿ýzø~ü~ø|øÜýûýÀÔéÁñG78½b˜ð÷o¿Þ/? Ÿ|yþk÷ÛÿŽüø—î?ø{÷ãÇq¾þ ¿L«ú_~~aœqÓýçò·~ð߇¿ýáø[·sš·ÿ÷kµ2JF­ãûùQvú{ù(zY,©YmŽŒñnMŽÿþóðS7ÛyU+ÓJêzñ¬šwÓ*-å±ûì(kîLêìmÙT,r"Íd“d¢ÓŠXÜÖX-µªÊHÁ„æìÑУ 1†w¿k1þ Ø:gãÖu4ÏSÅN$L¢‰ú±¸­èðLE= Z¶ì´Í¶‰Ýç4S4ÀšTïWÄ¢v6Δô(¡N×.§ Üù4S45K„Ô~E,jg.àLä3 6ÙÖÑ𚦊¨m¾_‹ÛÚy<ô¦®Gxu%n£¯SÅNÄD‰~Z‹ÛÚzÏTdÐ & Ýשb'êþ¦™¨_Q¡ë™*%ó7¤¯£OÂ4U4µÐi&êWÄâ¶6¡Ã™êss…¿š+ß=>}=¼ÿĤ0½uöõ§n%'oøñµÛns|×ëòœ¿þxüc]‹O:~ýùÐVM+t3Ø„ãÈÇÓÈË×nqëiÁbd=,¦ÃàøJ5.F«Fñæb1\ŸFÌùƒšŸ>ÐUm¯»~>Èór؈ªÁøõW•5+«í×Èa²Jo©—Ìj/OÂ?Ù hÓãÓ´¯#øgzg­fÜgæúY6ôø‡aE¬j¤êŸ~ýªó¬óÞÁ¯(ÐôÃì}âgùðÕ¦ܰ+öàĦ9¦!(àþîšæ0Ô«_àW ”Õ•ÒìŠÅËìŠ %‡Ò<ÑãÝàY!b]æ…§w–†ŸýU&oo+£ h:iz-)\ÞcãTr¸# [õöä¬Ñ9Š.ï16ôñ9ƒlÃ% <É“M¢ÍÇ™5ÓÃyŽ…Óðé©Z.x¯ #HG$ôay°œë»œ4Ù©õ©›¢{}pƒôM<2î*h„·ð™g4Â|æŽððÙ„€#27+5ºµYi€8ÆÅѤáùÔRÜfOÖÊÆX-3ÆqT¬€góhâfircl2+Û&\¿$qá;BP¾”`Ç)si"¸q îµ`JgÙ߯î̙٠Åu}§êÀ°MeÚú:IÜcí€<ï J¦ys8ÀOBpe¦õìeæå÷˜#&Ç0‰)Ewõä4zUck¡ ÆÍÿvh%©çÓ¡^в[*G}uÆ€6Œ{ €S %µ^qG=ÄÅS'¦Ì&4Â>RÌ^²€+|!¨ÿ¶ÐòLï@ÓYÚ\ÀûÙvñŠêt©oð“A݈kt;އEÚ > ªsêï-Œ8P%,ÉÝè,žÇ$­["zò»z°žÝoË”²ñî°ˆÙ’޽©ŸX¹±í` ×|(ã6u!VŠl<¢:¤6ÕÈIÍçK@ ,ɘ!ø“Cô€$ù:YîæØ ½ÑúçŒH1aK ‚+žv(ÄãM¯)S™/.„~š•âü÷DÄå=I$ür‡Jˆ,DpŸôeŽõ†»Ÿqêgˆù¼.rÚ5k,ÖýêZ°µfoNíÜ`¹4ððmJÜœK€–ÿ‹}xNóÂfkÉºËæ\y„».áÄ8«nH•€áNÚà xp×>q\=ˆkáÚpµ¥‚ÒSóˆ$)…t€ë$%¤+…ð3 Ctä ·FÁ Ÿ ®@B¸I¼6ˆ9¼SOw´§‚|ã\éæÁ N鿆’Ò Ó=ç™Àí<û!<ƒë,=;…#Xã³É (pK+%<)×wYûhø‰¨ÑM<Û˜óY†Cª õ³T RÁ“öÊ*Õ­nõd…µ}U!iì•€nÌ>EajÚá[mlDªÅ\ždPÛRÒrUªäÊvÛQæÜéÑz-h9 Æ4I Û‹XnÖͺGÅ—ü/OŸt݈¥³QŠ©“JàôÂQ–K’$ÚD” 9 ª”´ñÆ}ÄzyuÍ»ï»ò`AýK ¦—1%!Aí_„öú¨2q-³d?S”3•D®–´\ô¹ l©¨Ž3`KÁµ€þ,£J8nâ‰t`?+öë㈊_'íwF×á(í‚3“¾8›ˆp‡çðNÎçW·½‘“x'cÚ±ÇdàÄXüähQ$¹½66Ž…äv¥¬]çÐÙrn eËEE¨Í'7®·’VX&'á•ZÖÔߤä·YÎ.IîY’4Mc¡u÷©®ëSUÚÑ&³ &¥¥-Y“¦EH¹$<$/#òLB¼)27JGÜîÕLØÛêímõ6PäìQ( ðÁ‰X|rêB0vú2•iëë–ž4Klm=!†þ|*̳¨™—ùd#–¬ÓÖ²tÞþ ;|8þXo~LB~!j¹¹|ÍíÕmÀº¸ÔÃAÇ! Bb¥›¸Šeu’äÚ5ó>&çéYf$Ir Q÷Šø8š³©;…\Zéä²â(}’¢®¤å§ª dÓÆðe,!fÝþRCåµPbDÈuõóIxµ—ÛkN¨4vÉ$¥  á@‹qG‡L‚|ÎdŒ)œ±DÅ»ÍiÂd­TÈ̇&Iy¾GŒn,àV@`§õß&mkU†ðï²VîÍöá˜WjpÝdHç<%ÃË+¡WÈ»Í-ÜUa(`~`{?VЀðOÈþ.áÓì ÓÃ'‹H„È­-oÔ`bÂÙ‚-9) ”%qÉ¡cw>eÙÂú„=$N€UO§}Š¿üà—ÃÏ9Ìs€û%Xø>ªmÍl=Åa)Ô÷‰pc9¾[¨%X±Zœ¤áE@!ؼaºýΤ*6I¥w ½•¼…L(5Ocòߎ·‰;Ö„if×ã¹c ×q@ºòÐïFÅÛ<ûnø#î> ˆwG8žÙàí9÷yƒi6x'…ïrÏwó˜GNP¤AA®ØÍDpEä=µr„“! <Â#žbºÄ§ ?C¹û ±ÆQnžs†!е¡‚÷‹õ\W’®Ì[ÕùV3 …R÷5¬¹&å’›“¤VîQž¨Bu„WRœÏ‰,Y{ªI[¾à8Þòy¢³´´[í²œÕ+J)Ü‚R ºò!‰Œ§âŒÝ˜‹.öPfËé…Ô+*à0Í®µdè£Qæš9z<æ,tz=„à‹Ç<Ç. lc—#ÞÁg6ϱ“;âð3w¾„û‘¢ø D¤Êeïv,âìµb5“Cï‡àøõ8ó1íà<zÓ®:±ËsXŒ,1(2 ¯šÅ;XÒR\äœb,`ŠÇ篚À]˜•™Uû1zv=oGû{£e—Õ»ö“¢”nY²¤ z ¶ñ9õœFŠÃï¡ð cë8ù“oðž c®§ ¤ÁxN0E"SBíÛ: hè³ÚB*Чèá°S¦I·ÇŠhYªVóty—¶)uŒâ©˜Ó Nxìþ¿wëÑaüñí× *¤‹§Ï^ä{¥£Ž¬ÛÆ­Ä–©êä?ŠsÎá(Š”ªÔíA+«2Iq]iÛ[;MßT`!*Þª[Å?MS©Á/ü:¢á{ |¦…Ï ìDóŠ×⺚î Î6°†ËO>ÂïŽÁÓ;ü„žƒ·FÚÇèE{fÄXÈÞǵ@Õõ¿ó†éëc%µû>Nc¦ƒ‡ç™Ñ-Ö=SëëªJQÛØ ·[óCœb:À˜Ãïa.B €[´±üžK|’0¥ÃÓ1»nP …j1¼ð{<ƒ;%BÑÑ( ¢&¼`XãUCNäY5͇Ò)0¸HŸˆàDÆÔªb}ééM–tëÅPÌ\jyŸSjÇχÿ‹\= endstream endobj 3188 0 obj 4347 endobj 3192 0 obj [164 /XYZ 33.1199999 616.339999 0] endobj 3193 0 obj [164 /XYZ 32.1599999 618.259999 0] endobj 3191 0 obj << /Type /Page /Parent 2 0 R /Contents 3194 0 R /Resources 3196 0 R /Annots 3197 0 R /MediaBox [0 0 595 842] >> endobj 3196 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3197 0 obj [ ] endobj 3194 0 obj << /Length 3195 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨sË⢅À Àxé90l ‡A'“`Ò™Cþ~T-©«š¬")É-p—[%.oç[ÞþéóßÏÿüýüöýçÿœ¿N?ß>ÕUÝÖãŸóåï›Û_ȾRrüØõM%ÍåÏùë·Óãùñôéôiø÷ñ$Ú§§ÃÃyŠqÀß¿þvz;N~óùý_†Oÿ;ËóŸ‡ÿýzþéoß§ñ._øvêM{ùðïñƒBöÃn?]þëô×?œ–Ð?{ù÷0}oŒLZÇãó«âéïí«h²Xºo¥> !‡u68þûÓ/ÃhÏ˨z­„êd£‡Ï¦Õ]Ýô½>wjú4S'/S5ª9›®=ËZ99û J¤Ô©Žg ËŠDÚÖD­;ÿP¬ÇÑkù´õÎ=öȽÏ#%ѦӸ¬H$íl> 8RÕ·Óø9dž~˜ÄÔõ°çaÆ®iŒ¢»u0]?ÀÔf„eÓ%óy¤ÔS1¢Q<]V$’v6/‰“ÔŒŽ–ç,æ‘’A(!Å3а"ž³€#‘i@õr‚{ºÍy¨dx™Fð tY‘HÛÚ y<ôÍ I”¿Ž”°a ¦g¨–,(ïŽô‰E3”WÍðÑóâ»/§·B«þ¢ùeXÈ“6=þø2l¶9¿¹hˆÃ¾ü|þá²Ø?ž¿üz2UcT׌ê÷ôä=z"DO„FOÔ»§'¿ ðȾ»øKëÁOð¾E ßé!¬ÞÁwàx&xÕ’ðNWŸÔnxm†Ö pƒ£)Ÿ`\6qy`nÓ¬X!O€¢g4_ÏhfÆKü„@¤Ñ:NšÁ+ §í¡&x>ÉÀzrþ„å ¦gÇ/*›L“ ›(4ã‘@ÊPcã'žb¼ÄÔ„ß\ˆÂí(’a}¸yè Cj"%%]'ôKIÇ0«Sêzœ²}VƒGVÓTJöâ¢ÄÛ,ZWz„£¼h[j´•½Eƒ#ì{‰¯¿µý‹Í+ìw…Èö7F,ïªh`7›Pè«xExx'þ!î, WÏ|ç>_`ñÒÜãr°£Ïq î4f±à Äç"Dc 8äˆiÛƒü‹„ê ž/'ºæä¹RZL—Â&™ècœ£ ä Ý;€âà.ò–á41o¬_ȇÅ5‡î‚c5†"ƇHñÒ")B0xžG®Ã'ZÙ¯."øUxÄË»-}Ê)m‹?ú4áVX,RBÕ\6¹v×;Zrv!ÑõÚžâ“Cþ®À§°ŒÙð—Q†_äž‚ÍO±`õµš×0 Ó¾êMݾ$3L* ÂQ™0St$U—„À÷pžB2jïÓ‘Ù êBå ®Š²¨Í‹óåeÂRK‹ÖdÂr 7$é+¼R“U#t ‡Vœi–µIÌh༬ªTŒA‘ß¾0ä%¦x¨?ÜÛDe ¡¸ŽVÓ¶YLïµl¿én^ˆªÑíeù´! bdϲ› ]WŽDÐ~Ý+И.(ØÈêÖ¢èáNÁIAõYxAÍÙ–ëó ?¾=$BÁÜ¥Õ_ðô¶UN7nŒï²¸€³\t‘$!…à0—X¤/Ï=Ö2GÃì˜bëE 562Ç3Í<~ÈF‹YÉR¦7~B1ç"µŒzs—DâE¨`tÖtݳèÙŽBE¸åJ5¿Ô“}gq| ¤[ð tǾ$‹Upå å>…°â·åÁbìúûŒ€ú#V-‡Ã Çò’D…zž`©':ÀH\8ˆ ‡Oá Ô&~4O`%„ pá0Rª‰ß!„Ýk¸ !ª1Pß ð†Æ{°Š¯™ƒ­ñNñB(­n8d÷H`NðœæÊxa)!¿˜Tâáb” V|ÚCxñ‡Õz¤ '’`½Dõe4£÷ðz4,w}e ú –‡Ì©2{ Ú‚g?nGI Å;Åòƒ”šBÑÌð<{1Ü( Ÿ²HRiÕ…Ò<ɈXûtêáñjÄü ã’® .h£Ÿ'Oùo íÐñ8±ç™ã&%@+æÂÈqF¸¢±_ÌöFéqTY_$®•p Dñ3º÷_^kÇí–ù.3bì>Å>p{;®K.`µfqåäCpܱÄë`<ÝF •ÇrÑBØüuÅ@­ln_ šLi{NŽ0Ê¥UžË„âW")Y:˜r3';%DwåD0ú,IŒ|õ—’o÷Èhæ#æ¹"ÍDòºç7ÓµÕÜ|ÅX_™.H¤¬ZýDqýê¨Ú U©Î6¤ÚªmžÂ.´ê*ÓÛï(ôÎD{÷ޑΞÇóµ³Zñàl® ÂÌS^Ÿ<Àñk ¸çš- ¡‰œ9üOàj&ëBSíŸ{‚pÀ°sO /Ø ã7tL­Å¼p,”pšÇœ9RE°Uá¼KÉM ¤—” )Ùý1öŽŸ/“íNˆ²ÎTŠ!÷L)‹Õ¶E -¦ªåäÆº³ØqŒ¶Eðu°Få6>",Š„m±ØæË!…#G„îáø¿Å˜fÝ…KüïË¥ a¤äÚrøtIÙ6„À¾õh»T³¢­çœ)´ÕòE99]àn)Ê; Šý»À»ï¤ÐN‚so‚@Cµ1‹zÚ²KåÚd ~›„TuŠÐõPz4õäLžÐÒ¢–õ ûŽ'¬-›ž,‰L&\£’P¸Åc'ã w‘*&pª&)Å6"ÊìäQo×OÅ#¸;ÊUR­E¨°Ì’{˜Ÿÿ·­Ãÿ_½9N@1I¶ëÌÛ—Ã%†jV¯'\¦.BD¹×!ò¦»F;ÑóH¦ög7ß c^s5QW€b8•K¨5B=¯‡’Ì@^8šð'œ•Ú%¥Ëãä>ç!%_ò¦Èàà4!V¸)x¦®@cXã´¿R±¢×/êÎMk~-W&st#J°ÀÚ%Ÿ\½V~ïcä L1€ó–º[ÝDÝ·9<švuãÉ:¡\b¼Â,YRgŠüQ&°ÆïÖ(±+”ºä¬6 k†$S-ƒ•·¸Oi~_Òö‘j¶ %Ô†)OÖ·}<:/N¥$XÃÔQ<ÅŽñ¬„aMUÆ6I±¬VÞ„d¼¶EK*¿½$ÍtóœYßMÙJV@–li†¸œ\É` ±Ö¦ ¸›N)/á^ÉãÉHˆº:Ô¯RêW<šäUm”i,vXؘ9Y+{{Ûw0f~°¥_€¼pfRRPËÜâåÄßD~‰ïÛ±MäÍ9ïúz#g…16¤XJ5‡ÂsOˆÆ"5i‹ÖÄò÷¹»9»ÜõÒ±KF\ß§dJÚ\šµñ+/"´ÎQ±R2È Å-lOßˆŠ¹C\T\´ªœßœWëѬÖ$%¾¬p¸Õ.SÛyël²Å«YNŠ—¾’”žxè”ð Â>YrJ[€á¬$?%gƒR?pQT¸Ì#­("ž!%aLŒ+zFGÊ4”( õîoÇù—Y³t©Rº´M„~íAôåx¤¥ÛD!6R ØÊ;èÄn”žC`=·Ʋž6/&zж`ÍZ„rr Æ£ÓbZ`ÅxŠ-ày‡ (²ÚS¦@‰ÉùqÍ´,$?<<ë(˜Gc\Æ\S-æB+ &•<ÇF¤œÉäå/³RiVºØp>n4‚}µOËÀ£Ë` ‚ù*”ßþ_’†uŸ…2Ë)”á9û {ÄðŠíGòôbÊÀOpa7lµ<Ê~ÛàS€ï`X{|™®JáiÖX“Ø'-Pü E9dÛ-ø&¾¤ÛVN,1¥V@Yµ¢à%×ðîs.üdë¦o [x$Ö^°®ÉêӦܵPdÓax­vŠŸ{ ð;„»úÚ6ïØªQ–yZ[7‹{à}²ÏÉ-ß`ìóóÁýÞ!¶2%®¡ØŠŽŽïX=XØÃ²~©S¢16­77ËÇÍòÇÍ2UÓó´t(e%t.^½žb«áÑ<::+t°]ìÁQ¼Js‘B ¯më·ëm[::븑÷ñõ¢gߗެ(y‹ßÕ¥±”¢}ã(tŒ=8>}}ÏÝ–õFLݯKÞ ï”Ù;P'u"%ö¦(Q¥c!¶Ì+ïóÊœIÓ­ æõåñ•òu1gƒ™„G&!w^U&a/2e²ÞEñú»Ï~LR³g¿¤Lî»çÞZ02s&¢óøŽÇGðÕz0޲ÓR±hãRb(þPÊýˆGºaG8Okml™ZDSâx=YMK…7ãÊ£4¹y>­Õ-ЦV*fa}ÿ®Æ^0xrØ?†oÚ<ÜŽu4¹áCÇ#1^ãRNï¯ >Á£a<8¬Êê<¬Êyhê#³2HÇ?j®l!.™€£ !²‚½5…~6á£7r¾7áó,T}6½|¹Ñ£Óî Ún›äéÊK8{Jy:9:²íªÏOžöâ6Nù\è?q ®.6p·™^×;O ÚœlØáÃûäd­©(uÝ#3¥ñ+¡mbÒ{„¥·Mê>úR½ V-É\^W†öz\^q¸ƒ¡CxR"„Ñksöæ%ù‰fæ½ÌÊÊŽÚþm°px’ˆ6kõWr:TôTÜ:.¼y©Çï’Þ˜WG‘F[”»èÏÈF”PÖjRå…Š’"*Š­3-„ŠÃ]—I-¦gù^ÄjV¯ò“A¡V< –2Åüõ,šÂ¾8›¤zÄÁù¾,¢s­‚Y¤û²™/(HýÓ;Ùf‡«ãB ÷áRÜõ)>c·æ„„‹O7j޾ºIÍ€ó·5®;KÌÄÐU¸ŸÉaSøº ?Á-Ô#Ð9æÊ,bT3(K»åc‹¹z‰x—`/x§ÀEŠGÝ(6dˆa[=\:‹ºQnêpæ7&‹AÔ=µ):+Ž w&SêÞö1Iʸw¦‹Ùû´¶'HÀºËgÙ«îÜùt<|r¦2è÷Î ží¤¿Þ æ> endobj 3198 0 obj << /Type /Page /Parent 2 0 R /Contents 3200 0 R /Resources 3202 0 R /Annots 3203 0 R /MediaBox [0 0 595 842] >> endobj 3202 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3203 0 obj [ 3199 0 R ] endobj 3200 0 obj << /Length 3201 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Å—@°ÀzlÈ!€árXäx³,Ö‹Lö¿©¥îéû+‘%’’zhžq³E‹õb½øî/_þyüåã»§/ÿ9~>}9”EY•ßcÿ÷»ëdS(9üZ7¦mÿçøõÛáåørø|øÜýûrÕéÁñG7x~Å0á_?¼^~>ùòô·î·ÿåñ¯Ýÿ~=þøîÇOã|ý¾š¶êùmøEH!›î?׿õƒÿ>üýOÇß;šÓ¼ý¿ßuà !—ÁñryTœþ^?Š^Ö!Ë”Bw öÓ¡ã¿ÿ:üÜÍv£hµu¥ëÒyÖZž¦må±­«£¨…5©µ6Ç©–N¤ª@õ‰eK¥®é©Ø¨×J ËzéB/S-Èhf¢"±ligÔã©Ø¨7mŠê/S-¨®MÔCˆêñTlÔ7MŠê/S-œH”e ÓCˆêñT\Ô‹rÄW-ÚÅ …ú¦¬íá _‹–6¢Þžês;@¾Ú/ăïŸï>µ½ÍóüsÆÉp~<;èþõ62úøüÓñÏ æûãó¯¡ )šÚœ,­q¤<4¯Ô§t¡UÿÅ«¯–Ž4¢>œFLgÅ5BÞ¼XžFê¢l‡‡^gûŸÑS`-èŰPyåuVü¾z2 ±Ð§aÄá«òÓ´vú^Æš=}sú :o9± bVH ò‡FQ]õ/p˜Í‰ŒrºKÐ3¦mTXh„ÔH̪àºrÚ"XÆûlRžàƒFŒ$ë5xË¡!øaº]„øò@ÅŽ¹úãs§ˆâ¨#ÔT¯¸Ó¨MßÖü4EÓ–Õ- Xæüž×‘ á½Gòi—âσÎ03Ê bËÚ¬„±ŠõXfS ‹’¦V dqÂda00aK@¡m©:!Ši™#½=`„Ò{~Åûéú¦ VU´E]™[Ù`ÂY'æÙ,ƒ§×jnå¶Ð°ôôÔ¶ç€ÂŠÐ¹C Þ®‚Ú¦žª iÄ®ôqÑçã\w„õ&JÖ6N'áЃضÈô£óV.: `˜ÝYZ µëB«l|mN/¥9‹ÁO£4Àп32nÞ½g|æùèÿGF“ïl œMÃgàç=×Ä{0vžàÜ9‰¡fà ä‘GQï|Z‡!Þ³Ky×#Ívq=žèÒèj}6L³®­«ÃB°e-®à{„³Žµ@ë! À\o hŒëÕõTɺ:¥®VÉ÷ˆººRYWg]uõ~tõƒáË‚W·~²®N§«%¦ÕqRW«R$ÖRyÉÉúp¯2zÓúófŽ䑞¡_\‚%!t(~æÍèw,{ÀA‡ÊÔ:Gaü2¤jÖ¡[ˆdK¼ÛYå‘É:tÛ:tŒ=§Ñ¡ªM­sðlXbüÂ=ÉÚ5ŸPOØÉÛzl·leeºqZ…Ò¡3Yìª=]‰Ú­L§D}X c'êÏNÉò³ÕkÉë>å<œºTüNAÑ|E„Þ#߃ˆ­\æžËÜq5›G«Oõ¨Uœì~­uL®õDˆ{`Î"\V¹¨Ï¦ ÷2&ý·u¬Û²kø³àäqçÔ˜…ÂÚ9"ø‡¹0ÞæÂ5ÖÍTeà{xW~˜“R¬^¿:+çì%ÊÙ‹œ]—6A; kCÉ ƒÂ•<$mFiû¹+×w?å²£Ç+;â;õÓp­nfá Ü`q}>ËnÞìæ ÎÏ*¥®­ê·ÇµÙ‰Ø.¼™†›êöøÕ;O]^\üð~Hå|òhbÑÞ$a¶_²ýË~Ù/d« [\ŠO©Ÿõ¥ÈhUý<®ÛóÁbT´N^þ©sXßÅઽ^ˆ»Û8̱SWläKQ€&u@ˆwøüÅÛ8 îQ”» pÙ'BΈW&O»j,¸ßûÄÆ×|*nøtøÄ‰Á…G”¹1Sßp/…( ÑMó÷™(qç'‡ªÊ=•û7·ªnà1rBùÊ =AŸè¹)ú};˜R\ðÛá ¡ ãhÑ„[&›/×}ëI?Æ´œ­_þÄJ­gÌ¦ÊØv]e,±²s‘¤(2âZ{ØíZ㨠ŸY؃v#¯ê*ìÍöŒútŸV7“Ìê¬í> ÖìŒöàg‚vîšÛÇIêá„äL¸*çŸÀÜQ¹0½•v'2ÒÄ8‹ çF†ËS‡EÛf*äö×R@5bº¼?¸ÎGrq¶)|Ïš{ªu3·§D$ײ'87ý„p_q. D>#g.Œo£`¼•r–æuÝñ3Œ›¬4r<‚E.sgô dõº\½äC ±ÒÆ8ÀЧù'L#o«ä˜_Ý\JµR‚Ó1Ôœ¢™Õ;Ô%p·ÜmBÚqFF«{á†% 5£ü‘ÓI=©L«“ßd½áƒD–v ¥ÞŸ,í²´ îtßß¾òžÓ9n mªvÚL]N¬Ã!ÇgI_ˆô‰œ†'Խḗ–zXׂ2œ‰>×sr<’MJ„ˆ©(†FºWš"èÕ®¶“S$(h± '¹Õb=+qÃ=_Ü!lmÅÛÜ (c§ ÞâÜ#LìBŽÆàZ•c§.”ô†b§¹‘QŽÒt0>£Ì<<;ÅTÁid”£9Úyæ¦*G;¯Fr´3G;i½™£o)Ú™è\Ìi{H¬”a-o=Bªš!u’vêr/R-ãDH7HtÎàDú4ÃC’£v‰¹[/‰Ú¥:›‡åMÅðÄ˹»O6{^Ô•^°Ãù¼HÊË|^ÌçÅŸñn°q®caœ q …ØŸ;ÇŸÍW?és.ÒÙú‰U7j~Oò‰uó'VSÊ{’òÄj¤XiÎéåEÇ9;+¯Ÿ>ñîo€µhÐsÓ6d±Ñ«ðc}¹]2hþ›`d;œ3Ž_[tŒØò²µî0$a¥3d¶Å » Ë$L!8›hÃQâÄʰ‘9×ýšŽ‘;Ið6‡ƒ9×®/w8Pc ÁPÏeK¦Ñ9í9¾ò†²7ò‰Ó«)¬_þÑìàœ%Já:g‰¦STbIô–åÓ†»epLÓ2>Ÿa0áÙàùƒÝŠ®åœDYåB\c©J¼Ÿ)þÜca—ÂÂgX¶w¶ñ·`ã'â`–Ub굇ì‡}îðf²,¢k‰-ëœõëCÖ¯¢Å3—‹moF¼6UæÀRyÛý=¾t‚µšýÆ_¿’ÖÑ嫈þL iòÑYéÞTGÑ-ãŽpW­¨ŠSò£*õ-¹WUQÝ¿U¬ÕÅ€ˈuQO›áˆ®ïŒ èTªíÝ ¦Œ)ª¡!ûëH ßÓÀgZøÌÀòµ,d©ú¡)IÝ›m ©ëO>ÀÈÜYá'ôÌè¾7"Ð:F¶õ{fÜ1Ÿµ°`Õõ¿w&Å$YZ×öû´?¼s”€û÷v¼kçþX8‡¼@ìíôÌx ¸‡ƒÕiï~fT™×+4pZ¼BŒcüñ„𦬠Q‹¦¾Ë÷^ Ý82ê§€ºéøùð ‚~ endstream endobj 3201 0 obj 3908 endobj 3205 0 obj [166 /XYZ 33.1199999 217.939999 0] endobj 3206 0 obj [166 /XYZ 33.1199999 270.740000 0] endobj 3207 0 obj [166 /XYZ 32.1599999 219.860000 0] endobj 3208 0 obj [166 /XYZ 32.1599999 272.659999 0] endobj 3209 0 obj << /Type /Annot /Subtype /Link /Rect [472.799999 238.099999 524.639999 245.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 3204 0 obj << /Type /Page /Parent 2 0 R /Contents 3210 0 R /Resources 3212 0 R /Annots 3213 0 R /MediaBox [0 0 595 842] >> endobj 3212 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3213 0 obj [ 3209 0 R ] endobj 3210 0 obj << /Length 3211 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWð`iöƒl¬Çv€ l ‡E7›`±»Èdùû¡DJ£aó«î®~ˆ”ež±(ö£ÞU]UýîÏŸÿQýë÷êÝÓçÿT_çŸOŸMÝtÍô§:þýîúÙ×JN¿š¾­åpüS}ýõðR½žÏã¿/Ñ^œŒÏSLþþõ·Ã»iòÃôÉç§¿Ž¿ý¯’Õ_Æÿý\ýð÷ñÇóxÇ/üzè‡îøË/Ó/B Ùÿ¹þíøð߇¿ý¡úm\B÷øïw²Jê>j/—WÅéïõ«h²X­èÚ®BŽë¯þûÏÃOãh—eÔƒÂtÚ4Þ£y¶é‡j0]eÄ` jíÍo(;Pߘ4W$â¶&mè¡ê^+¡Œlõ G´}/Çßšÿ¬xâ´u%UìæÏCÅBQÊqIÐq\‘ˆÛÚx(.'HÕÈÓ6[ °óHÑWmŸh qE"jg3àñHl¸ëf²‰•@—¡¢áÕ‰4è´"·µ3äñPußÍàï>õÇYL;Î2N9j®œÓôž†KHà'¤™h´]†ŠH‰.Í@§‰¸­ Éê9‰™#_ÍœâÅ÷_ï> ­ú£U÷å§q%'ÓpúñeÜn;®`4qFôù±úcÓý§êËχ¡neÚÉ–Ìòä=zÒ<Áwºð'J¡'ò|ÒÂÑà~ÔpzòñˈßìØ­£²ØÒ „Õ÷p´!Ãîñ¸6L„x„¸'ViùC!èôákÜ‘ÛR•„ï؆˜ŸÓšÀ6|grÃ4}a¹Á‘å˜7%Gg@ÎÀ«–˜þáhšñ¤(À£úPp¥º‹X)Öê,Z„¸#h¯Ë.¼Æ;,ù ßÁ«&d$–ìXSáµa¹ZJ[o:š#û c§Xü¹]ŽWV7’±ºöááÝò½N®y0¥nNSöêlê m­d/d{¸Ilô¯t˦wu­'èYÄnêÆ`á;¡è¥ôZšõ.\š´Þ…kµFð«³T$€5ËgÖ¼ø«3÷KâôDÈ3L^Ÿ ËA ±j¹è§,$GK÷-AïÀ&ÌÈßrÐ x±ÅVÂâø8U²]ßÃ]cNõj}×Yç\rA¡4dX,OÂ^ˆºÕ]?>$ÔŽEÑÖ7Z8M‡vŸûãÀÄÒ?X‹Z]êº pÔGCÌÙÕRô«ÖcaÝÑv€ãîZÎtR¸4¦ŒÂB‡ã“S±5ñdš‹¦îŒx+ŸœâˆàR$Î;³és5ñÒ°sB:#á™Î2MüI„ 1XÇÃPã 'K$mNiàüäfáL±f£à0nyZD\‘]ƒsTq–8ÌHSxբБÅOdáŒoˆê‚¼Ù©Ò¼yo<à xâÌB8æL±œ F± WP”b{9ÏÚBXiL}÷8¿¹XõZ¡'MGÐ?~‚󨣵xÕ8#ãK.<æÀ›ã´àƒB§'åFœKË¡·Y†”\rÜïC×>tí~t­lä‚ORÉ\‘‚ñˆ­ohI'ÖØÏ`T@Ý^þ—Ò÷&…p…1‡Þ°v$j°°¬Á’ ®šÐÏ…žÕÂêÜçà¡…SÓ?‘”ƒ£*X3ª³ý\Ro¶—D)UpVc S6Q]ûÐ ;³ñOÆ"Êɰ—ïˆî"X÷c>ÅÅ5«Ð>%zOàUc «Óئz`>ÅØÆ–œÛ€>ÅÞ«†>!ö…ñ“¢:}8wyØL­‡ßatµ úž0ìFlɰâ:8"Áé+†­j†½MXsxŒ® í$ñoâU qîjAtHV˜à±U<çâ!­îNZa« BÀ€Ñ5-ñhœŽ> Ìñm8ÚŽe_{É!ÁÖ]Á8ˆ0ç ‡ì»¿!ûJÒü%›µd„OŠúŸd¯‘²»4šši-áßJxµ²u­*6˜ŸRî…‰Ýõm8³ÛJƹôÖ¶pf1£ÎqníµV Ä©5r—ÂæiM’§+.üŽ5¼³Ò >g-%§ œeÄ’ððî.;I{Ͱ E’V›q ,y†94-´¶YBÒ ½Rºœ*¤Á ;¡>,¦ÀøÆ, ƒ80a“Õ5k'NÁ!ÁZx4õË‚RDsÌbl@9ý±È×M2ú~Hˆ¨4ä´gËSÐîQ™·!^'Ä r7 póCp‚Œ:hPK߆>þ•α÷ü{¿´$Ó3bê~h:®Þâ(–˜Ró¥låK-Kž2tÔ.*5nï©pÚ> „¹†ÕäF¶¢ è„ãoÇtŽ話§~kZãª~! •æ„îø¨RçSXÖmœº8Îù>?Äð`Ô›8-À70îIâœzâs"ƒ—‘5‰Û*FV‘i‰3žðª1~ð ¾Ãƒs‚YŠ8·ã0ÎP· âäŒÑÊ’h‰yïCgÿ%»ŸÄa «Ëõ“¥®ãHÒ|šÓ&‹‘þVŒUNãä,‡IÇ™ÛXtô²0Í9“³pa™”–£?¹Vö NFÜm»A›œrZ‹¥ Þnÿ×$}ÖcÂO<{qƒ.ƲéZW0È}7JÒV±ÇóÆ2݃§îöùÛk¥z¤Ç$MÉ(öû©}ãµØßSÎ#–¶Žnw,Mës@R1î%âUŒ WV wPÁ¹¥Œ(ö‰›¯ѯGôëÕDxD¿6ý"88Yg}IÜ çzˆ•2ú¦&>`ôÃ’Káú \…Á©ËâH;Ü!ªÜ=ÏR÷î=¤­‘bõôàØX3l˜ÊîƒÆÑXöm˜›8÷©³´žC¯Úu.Fñ…žà¾{Xr•âSbÕI-ÅÄz ¯S"‡ƒ1Dq½-údé¶¶œkEÿ ÿ}Ð?ö¥9ºk<†–Þ lóܤL7aýŒ«½·l)âÎÒ]¦õŸ´LĬ°ÏQ «ÃƒúÚ. õ)ŽçvsêÃ]»G‰öK/¦ÍB/’c Ýœ^pÿ·MGÔöK}Ã¥uA©"NŸ]|þž'{m»)>¬óhxoCÏœ³ RR\6u«f@÷ ë€ÔÚ #;1ïÂ6öœ©&6aç¹PؽïíÝs_"'ñm³™ç”ìF,DûóÁ¢2Z±¬]²^”¥È“µe]€ÆÈ’aˆ/ËN“HÄÉÃrÉÌÓ’VjGíĺ€¼gQž;‘Qâ¶Sþ¥ÙI2v1 ¢î8Hq‡Ôè†|Ò„ÅÒm„­¢œÝD¿P‰/A.t…vŒ¥Wü¢ó,e,>E§ÇWÀSí:÷bRvfhu@ òh‚SWõcH)›(8î…ެ‹¹>>»Þ½ZpÞ®­€PTÖòE¼&Rd~« ¶aäî[ѼʶÂÜx Pþœ(h€ø­ù£!ýI9-­ J”FèfÛƒÃXæCF©oä°´·ªÌ°‚ˆ),émH-mX&0®lP × ×ëÖ÷ÐÈ4€úm¤ˆÕ°ÌLj~Ÿá, 8½†Ibùu¾DŒåëá«°E±eâ!Ñ/æÐWü?Šw“ï}æž8îúît÷&ÀOÑ0•ðÇ!}·íï,{.FÙ²šíû·êæÈŒ˜¦–sR”hêΈ·>Î÷p%øsòU#Ù=øI~ñÞf)Þw)K!åµþ|ÒÄ4EÈ%à¬<À3wwQõˆFí(h‚5Ë•p£S¸P÷Ð×+n„A°Ú³~]@~×Í4—ÞÂ÷%ÛÓ6ôãêÃ0î“FQḭ̂ãèœ+Jvy˜‘M\¬)'2ÒȈ߾’z5t2eá0O9ÃGVø“yõ•ÞúdX¾4AH¼~2×~\½4§¶ U« ޝÃMᆣ£OK<Š¡úÓKK!é7þr¹r’œéƒvnŸ¾²¸Y®¬L8åtõ\XáõÎ'kæRÍÍ¥ e†”hÏí¡”^ (#q›>¥CBIëü¥kL¤:©d¾“ð`DNgñäB˜áŒù’h_þjG‹<’lRt4fA«´óÎi^Hæ¯(ú…f`9]œ¬˜„%7ÙÓ ó¦ìçqáv%ç“d`•)BtŸâá–•¢9•9O£øý¨1Eœ9‘s’ûׂ]¼ìÓ'^A””H³ô2gC¦ “nY™/Ê)&Ô‰uÍ+êŽ8! ­‹ýýFµ×ŸürøLèû¬ä YZú@¡X(¦ï.S¦ Ŭ¼´óPÌÍ4çQ¯†Å;HcOðrñ‰àŒ€«,¤šK«€¾! Ëøâ4àhï˜J«*ÉR#ØÒ°6Pà`@Å\=„¿Êð­í“µí¤%¹-&ØÅ8R¶]ÿd…$% 1w5»Ã›ާ‰~í=uU«a!©YTàc' £ydó§pœ 5nÚ`ì¢ ç9ü`Ý4Wæà"ªàú¾Ôhîžx%w$Z&[@‚[[#XÞä¼ïÊX:£˜(}¶µ¹3Ù˜&AvNÚR(ÄÜK£9®ĤÇóºmQXлŸhS§e•Û‚ÑÛ˜Söά9»tˆv‰‡Í ÝÚB·s? |ÞÚ ¾Ù‰G™ËB¢!þinvq€ èobìº> endobj 3216 0 obj << /Type /Annot /Subtype /Link /Rect [244.319999 459.859999 320.159999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters >> endobj 3214 0 obj << /Type /Page /Parent 2 0 R /Contents 3217 0 R /Resources 3219 0 R /Annots 3220 0 R /MediaBox [0 0 595 842] >> endobj 3219 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3220 0 obj [ 3215 0 R 3216 0 R ] endobj 3217 0 obj << /Length 3218 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹µAw»;@ ÈaCàÉ$ŒéÌ!?R‰¥ª&õqy\$UÉÜíR‰ËãÛùøñß¿üãø¯ßž¿üçøMþ|þr(NE]ŒŽÃßn?àí©äã¯M[x7ü9~û~x;¾>>÷ÿ¾X}~Qþè^ºüýÛo‡cç‡ñ“/Ïíûß‘ÿÒÿï—ãïü$Û¾ðýÐvõð˯ã/Œ3Þöÿ¹ýmxøïÃßþpü­B{nwø÷^ðªlê q¼M¯²óßÛWQg=±ª’5üÈïÇYõäøï??÷­MÃ8u‚±¦MáÜjß^ÿ;çâØõ”5ÓÕææÖTpCU©¡aD,lj¬¹)2éI¯® g‹ò-kã4ÔœÉ2³ áaKº3!†&;Îm?Ϊ Þû¦B8L¶Ô´±ZâC+A“+Xel‰L{Qðî¼vƒ×ùõç~g×uüñõûA Ý÷îXÛ?ýéøÇÞ:~ýå N=ÏTÒןðæü¤>(øùƒæTtãw¯OžÇF®´çêgíû¯2Øcç'Œ_†Bé7‚;.^ÎOªÞ£o¯nŸÀihÄ1Ì«AÆOŠ >Ñ:ê2i‹Q™×jcê>kŽÇ ɨ7¢€×pq ç­ñ´6Ì x…;gª¸0}¹<ÅN ¼lxD­;AJSdI=Vl¯*×{¬A¿èÍCŠRÅ8­—¯½ IdªN5 XyêL jÑ­‡¦ª1g¸ë ñI~µŸÿUwÎÇ õp€& $ ´ø,4ƒGDPÛ„õ¡6$ܱfà4†Ý„ÐÓ0a<-H ödíoTKí©íŠú=FåêK³×'!ÕÆþ;õ¾ì q| M bNŠ¡y¶yœ)ƒÛãÁýÉGÛVªñ ¸>i¬ö/T—YÓ ¤XD+õ^%y1¼\έº4®ih“»>c0Ì ‘Ve¬ØÍ£ÞB &ÉM„Œˆm-tUƒƒÂè}+BÌïá=e5q Źìåø½<óu¼x µ©Eѳ!áwe¤³Ž‡A‹Ë'Jx$a^»^Žu§¦®j‹Ãæ¡üBƒïâ¡a¢.[oÒŠv{ã±öWÜCº=$4J”@I®inñ]zÁ -P#*Õ£ô`ÿã-pñ0È[ ¥±³‹yT#…=˜ÜwrE/±d‘‰²Eâ(¥±j.FúUé ø™'’ sO^à“ðÉ'8‚>iak=)KôDÀ± ޤcËbàJûÁ|€wa°œeôÇD{Ɉåôr*~Éj<Ž—Còó± ï>Óî3í>Óî3ÝjUÁwŸi÷™vŸ)µœÕ—Ìf<ŸÉr ¥fÕûE˜9³çSn·Pyâ¹vÄëy¸mÞÝÔq"÷’Ò˜o 8GŠ3q¦ôFYqªöî«¡ä’RLëNyÔÛnàПVBêpt,¢K©åkMÍ»WÖúTÕG)ÍOƒØ’ÇÝÛ©|. nÕxÀ©+l¾¤Ó6‡%€aF¶¤Å},w „$¥>Üì‡ÔBN”fö4=Zõ9 K0ÏVîHhq:¦Y¢ ¡3ºÿ¡bÏiÜM”ó… "¨ a¤ZM¸õõ;™d?;êNƵºXÍ¡èöPSB#”BQòSômÑ·¿çØÍôÌ"!Ð&ip(QˆÇHì2i ÙØŠ©|{§éû„²_ªcÅÅ"…˜ZÇ*@ËŽdâ¢m=² éă 4*¿¥Ió`¦¥¤yTÂÃañHPç‚t—«8‰ø(ð&*3Ø!¹v4)ˆJ†hµâVòDNsz¤¶ þ.‹V b£Ü¹=µã ­0ã¯ë=;Œ±Æ»”pRw‘< Ó(C JCÅ@ò_<À[…\M«èÿMByÀM÷mcùÍ”ï ˆR7™„_ß Pê;Î6–œ › Ë­ú½Õ¯L»Z‹¹)fæ…_ E1ãâ„ÅDâ`c—i8ÅÙpµÀ§yÚL¦{ä¦_ƒ;,ôy›Ó@+o?øõð%û½nÃæËTqÃÀê0¦1’Ë$€L, ¹R"Í<6¤´nwù=Ê»ð½GÚøÕ±il5“”]Si,/K•ówîuHiI ŠW²ãž¶-Ôê9¸±¯P=@òamnÐóqÄ—>Å¥¹n1 Å໣”hüÞÅuCNÔîfGí¾ÕM„±ð èfº¨³#pG?‰Q‹)h’™B £ÎˆUÒLˆâ»®ÙuÍ®k¬R»f’SoLXã»ÞØõÆ®7è4X^oȱ¥Ïï¶â:»Â=LJÞ-`£”çײâ¸8ÓY ÷`;JJX€V|J^ðhÄ}›Äk„‹})e$¸¬Ã}?*Êýz©kCB²Ü™N0$ߺÈ] *UÝs\ê°‹«]\%ál/@XkପuÑÞ~°DÂ0„÷ì¾É-鋞æö™¢ÊlbD+ÌQî7ÈFAÐÊî1„‡ #¶j¨£•úãˆ%Vü>5Ñ‹ãÛylëyËq†Ð·nìäÙB±5FƒºÙ!Ío‚ÏDîŠéR¦ä)ºU»ö3¥²Q§m€»÷šÿ`,f^'û óõßÛî¿« 5¤€ÑžŸ „²å\y˜“šóíÔ…š`¸ja6æâµïÀ£Ý×´ѹÒpS8 1,—^J§é@ð; ¤…Ý nÛèÜ'ÖU–ºG&qsºj**ÀŠà ›¢†âÂÃÅI÷©Ô½F@)*xºMiWB„x†˜cOQL÷È&R€[8áúeBÅZ æÎçÀª–©×ΩæÎ‚'ÁRvØ; äruba€•Œ6]õæêq4ö"uú•Dþóa¸$Û@B !‡ž"é*6ìñ`0Ÿ€råL¢Þ2뀒T;æ™+&ªæ(´žºí¿±š +6B…-åZCmt¦€-nUîê…šM‡3 õââÞÔ!§Üz #¯f‰`ÊvÇ%¶ÑÆ+·ðmŸ›Oy–gó’â}íl¾6Ç+·6çL„°ùÚW¯>òsër¹N™Œ"%ŸœK“­E&ôñô·<ËTqYLm8aê±i¯1ˆQÍ'­¥ä7J‰“O[ß7¥T–R`aÒ$ØW¼¿¿º{Pó·pöÆ'¤ ÍCÊsÿ©¦otf´¤=>¶¥õ™Ò»fJŸë(ï7-MÛ*C–sJ2ujŸ›»ÜTéVªÂhI+Ýêyá]Q-Ñzv¥ƒðåVsoŒƒó“ D9i  T&NY½àQQŠi¯,9YëVír©£*7cxà£*ÐquЩpá‹h‡]Çf;¨ñMÜ+ýβX”“ÜèçÆA;"HVIzÕ^µj_r‹/¦"*a©›¯IÄ¢ <'ÁÂÞäR§ÑS‰n] W©a´@F _%ò ÊüQ,àà ŒM Z¢®äª%Z ……Àˆn9ƃÖjÖ­¡ Ù è‹ iu9Ç"äÌf°ÊàKðœK-¥ì:ylÚásv·†p£‡îÅD¸ã×ýF[ÊyöÙ›öÙwœd îfü½h°c+o“@ƒÔãš}Ìo„#-†w0E)¥`¡Ö]!ãO*¿dI¦—µ pÚÜíÖn·v»µÛ­Gµ[¸ˆw{vËþVøæÝ¸¨f{^üNÒ|iöïJ:ã½Ô¸pý1h„‹¦ `öÝúI™4wá•a!ÇOb 1¯½š ÅDQd†ìœz¸»öÝxÅÇFbÀ=#¡ÔºÁ÷w@¸PƒN}B,ŽVxDA{‚ï*Ÿì¯¬È]ð‡+¢Ø÷“Ër@Y\ ý­I'“I7ÑE¸Õj‰´ÉºKðÆí{L”ØÜ“ûá8·å2"“G›®”r(Dy†Vʽ†${-¡Grî¸ÅCñ…ìîzµÛ÷ªúr>Ö(A_§3}ʆ1EÒ]®°øáa|‹µŒ§²W}göHQtêâü²xÈáž°“›]^ëg×z$ƒ€ƒ!q®¦U훃)%‡øº^«ƒd(”ÛB`¶`jÛrÅH­èÄGÙ²‘{kaJ 7²ê Úó3ÉïŻĮS©¶ø‰ž£ Ê´?ã~#‚JvHi.v^Ðc…CÀF’€Ùcÿsµ ¥¸\cÝŽ{X%ujw¶7ü‰{ŒcKñB”ywIÏ*é´{7Ûö'Ô¡:G#îÜo°‘X˜ 5l-TþVÚxòi!Œ’ª™ “ƒIŒ’›.Ã(¹Žaã®&^iuÊÐ<2áQ*…ìG=h}c’5¡„L$vN‚5[´¤¶ª§›ÈX´½W‹¶ºér1muÃ#*%)<ŒRŒš¤!dK37VNÐåꙫ›Iþà YÈþb”Â¥M¡Ïyµ^]ïgËoHÏfá™ê¥ðLIg™0 ðI"|Û |²ŸÞKtz/“¨]­gPx!×_0èGƒGSgÆìÿßzì¹kø‚üñí»WV\yù³‘›¯ZÅ ­ç+gv:VŸÎ^ȱ¼–Ó¬ëS=ïwâ¤îÑzðæÔ¨ÞÆÈ8ÍÌ“Ñ,Ëïfë@«êTŽ€ºlsý´ð¾3 iÃO¼(‡G×'O°µ‘Ý+eç¾+óÌ33|EïÈàhî Có^™ß;rÅ|æ.Çv€®~çS®?ÞŸðçÃ;V©´Ö¤WÔ¿SŒ®O •dvz®}¸Ú˜Cðšúœ.·f8ÝÀ;Ÿ|xr~Gîεö…ßÚ¶¨O¬éíYƛ벊´ëÒDÔÿÇχÿatƒÕ endstream endobj 3218 0 obj 4077 endobj 3222 0 obj [168 /XYZ 40.7999999 290.899999 0] endobj 3223 0 obj [168 /XYZ 40.7999999 75.8600000 0] endobj 3224 0 obj [168 /XYZ 40.7999999 290.899999 0] endobj 3225 0 obj [168 /XYZ 40.7999999 75.8600000 0] endobj 3221 0 obj << /Type /Page /Parent 2 0 R /Contents 3226 0 R /Resources 3228 0 R /Annots 3229 0 R /MediaBox [0 0 595 842] >> endobj 3228 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3229 0 obj [ ] endobj 3226 0 obj << /Length 3227 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀjćD ¿äÀ99³» ™Eœ=äïGjQÝ=¤>J,‘lu[c`l7­b±XoVQŸþôåÅ?/>=~ùOñÕ|ür¨Êª©†EÿõÃå\—‚?*]—¼íÿ_¿Þ‹÷ÃëáµûÿýÀšãƒæ[78N1üýëo‡OÃä‡á“/é~ú_Á‹?w¿ýZüíïÝ·Ÿ ¼þ¾tÛô?ü{øqÆu÷ËåOýà¿ýCñ[‡‚>ÂíÿÿWBÕ•\…ÇûéQvüº|MÖ«–Öc¼Ã³îÈñߟ¿tÐNh”­dL5RU‹¡2)py[hÅ Ù¶¡:‹[‹­…Ôý¢ã@:âÄV®®bµ™ü5â¸ÐZ­¦Ùj=õ™Žµ=NlÝââcHtÚ VÅ¢ýj=ÅDÓĂĪH´‡è´—LÅ¢ýj=ŤŠ%A=Nqh!Ñi_×:íGPë)Ö0 RSÚCHÚwKë ªV­j åšðÅØ}i½@ºÑqõ±U+c•T^Hdº·ÑîÉ;oå2GPkéÕ1¼ŠCø#¶ni#åP¯Q\`~vß=>¼>½0)tïñ¿ýÒar †oo½€«…NMW¼xû©øcU‰§‹·_Ïo¢é§­ÛqÚ—ã´mY·==ŽñÍ0ÂÐHõGžáÈg8ò1hàˆ†Ð8Hˆ›Ä+……F8œG`êÀýñÐSŽ`8“áÐ*¾Ûx¥ ÒÚ îi\Ü›üp8â¡^)æë6|¥žg Ö)\…¹—Ãu0ïÀñÓL(=ÏæÕ›T„x=®ç㘠­Â×à Öª.A0 œ (|PA•OYÏöÕC«V¨‡]¥øXIày0np=2¦ÇGÀXS„*ÑfdY-êÌ,ëq&#žy0Ã`G”â:b °{†Y–`9±F Š#êqŸ±­Ã¢­[Bà“™{3 ´¹³Þ.Š­ƒc×jxpƒbëyŠF ]GìX3‘Ãg°÷ÀpÔ qópHnïI;Auy桘# ~û8yOØùmó!„nù,B×Ù¼lˉa×CÃ9Y,Å}µ ÞnÅv8ø–y[¶×áíLËkÖäXïsÇuî¼C=: ûŒ„“’WtõQÎÜM7qs#B]W¼Ž>m æÔÕ0¥Õ¤qe)8R¬m~”ç$z–;Ïâi¾lJÎô$ÿ_Ì7¹ª¬@H61âŸ‘ÂžØÆÄ$+û åîiÏÊ1jQ Œ§±¡Ê'C’Z0>%¡ËÂddÃÎ29q|±q&fUÙ(öx4N,”´³p/ÝÝâAÕ¥àúø·¶¾œÁÈUs¦B7ÆÇ%“ò‡ËJQ¯/OŒ±Ç#ƒÆ"μ“P³xö2µ‡äö*Ì| M‚ÔÚ¶ xõõ1-]Ö·?ðp<ž/€k“hÑÉíÖ{• /câpӼɱñèÁk›«zôß:#Ô|¯ˆ±èa>«Â°Á|°-MÙ¢u}ûÅ.r/©*n‘Bl™±ñ°È¤õêàF[S:L’Þh{Ùoð¾˜-N 1«Z9÷P@Óõ¥ãy|¦–¬L`=ª–ÌZ·ù]óì¸Ý¡‘mÄ1#óçNQTkîÐ*Šy_Žü+„ΧðÊM™£gB‹QKf™ L9áŸK:úÊãçáìÎs,º,Èí±fLCî½3Þêvœ9ǧì¸|êÎ(º÷Ûìý6~¡ôÛ䢇'ûžÞ꞊LºjßÓŒr W·+ÍÓA‹ç‰vv<“þàÜràdt=Ny@Â8OmhöìNŒ³‰  n-wR%Üp¸,Çù¶Unf—’äT§9þ € ×纲ÍË«03‰rÛ8Å9\udBÅ瑟Éü¨æp†2;7Ÿf Ì.ÈØcIŸ;w‡º„F»¬/×h‰ýÀ{;0$8_qµBH×I@. {Ä_9½íh•´m%uæœd”;éPn…ê¤t°RŽX´K®æÃö„ ¼b£MpCôÜÿ¬]#Bžz0ñ]g¸ÆW¹ÂÎ OE>å¢^|3ážR\g»Wo¼¢ß5¹áõí[Æ:Wõ¶Àë‰zyy¶»°ÄéÅ!·:a# Ý1Hæò£*|"6¢vG:)c™¦[y”™ÕŠËúÄ˻߭xt+¾÷Ìú(º[=¯ÕëßfnõÖœp%é† ¸™‘R©³Àdïí[§6S&ñ{h¾[“èÁ¨9[íäó–_´ŠˆúT4Çuj-g*"ÎS^¯"⌃4|Sê¶jÈ¥¸¿; b.ÓùSš ¶¢\›³áÓâ½.oÅ9Ém[¿•G^Ôíž=.?£Otµ1ཤM©ÊÒú‰Î„*c”Žæ>ÿJÚ!¥MŽdwH=“Ž~Ä1¾t.gæ«nÇ7 í·ží*E)œl÷Ä4²ž•Æ[:5¹q‰>BŒ,Ö·=ê«ÜˆÄUkª(Ö8Æ…›q„ˆ1×»C²^Ûºä,+c"­Éà%¸p?é ŽjÛv\Œ°¼î%JãÑ‚Î;Ëc.Vâ\;8G.”‚&‚‡¹Æïq((iý´íš ´m\÷+ÆQÙªœlïÀňrË…ã¤õ;ÃË1R¶ 0i€¶k’. ?Vñ™’ÄI’]‰Û÷¶+œ{³]h£2ŧ¢dRgv<–G_k w/&·“û~É ß·3Fóà6ïOæõMg]³Á’9ž*™‚×ó›“«)¤ ¡¼å+i(½¢nq!åèùIP¼ ±.X;Åμ9r³ã·Øéü°þ‘#ÕHJU/~&.4Ã×ÏšöÜkqüxqw)í\8ãëˆÁó(YÚ.´}ó šœUåðÆZ‡å›ÒTí:+MÈL ›' 6üÑÃôfL¬ Óï¢gU [£‘æÁ;/ŒlòÆ~92æ‰>¡Š$ˆ÷à.ày*¸?,ùëyS®ÔØ–í©ä½ï5 ›¦P¼ì4Fu’hY-¬m4ÞÅ¢Àòi&Ør,éÔŸ:ó)¸Ë¡© ºä¦²_XqRX!>ƒØc$ ¹¹£÷¼Í Þ0.)G½ÝÁí^±£¶½f2bͤ§4ß_{Ay\äˆçÁ+%¬gåj¾ZüLÜæZÝ0™ô=ZêI|@Á:*òq®ˆ+ 9Ö‚¾Àꪨw«·q«‡w!“†p=»EÞ-rN‹¼[×ûÓʹ¬k»;“ÆÔmû½À¬¼ú…^–ÖÇÐÂZnÍ‘p¿gö r'tœùàÝ­â3Ä?3*‘ŠYi7<’ë¤v6gÈFÎpr†žŒ©S“¥Âãê'Òiš¦ö£”kTË [éä~7 :¢s_½¢(s¯è½4€î}˜„®ƒœ'm-¾Ç',Â’âËEñ5ª8² àæñÑalÃñ… ¬qƒcBœë€#æ7¿Ø/q‹Ï0åa$êÙBÄ+!³–<ô=]ºBŠ>÷ü«/'H8ƒñpλò:”œ-æe¬áfµÈž³Í—³Í¡QšÎ›^¡Q(#¹²p5†¶aIÇX{(Š5$!#íY)Á¶{FÇR‹­%O{gV/‰ÌåÑB¼ß­-œf7U£Ö`º¿$bI„· Wåmٞݨçºu¯M7ó’q“^ÉËÇQ;¥?C€†3ž,kœU!P”äU_½fc÷ƒ}:šYÜ›u%åvëÙºÞnœÂªz^f6§0.g÷!ÞEÊþ~í†éS›Ö–ûµŸà3¦_w.{ºñz0Ïh$}Ç8gµÍ•p约€žwØÅŒw1r5ä=Ï.æêš'ÐÀ3ÏÞƒ•üî«xïD°³Aý˜o_¿½w¬: ó«Wœ½Îë¦`Ý2¦nÇiYSħw%šx©iÊfºš¨•å`H/FrrUªékÔÄÈP$DÉÛÉ{iëºl†êÛxMÍ£á3-|f0’Š—¼:rˆÍSÐA¸üä þ­aÙ‰¾ g “M0´#aϘ Yû¥¬àºþg^3+,•;Ÿ çÏ3³R;ÐL~·{¦†Î#•ÍæEðSðáncÁ{ê™rºqÓ&8ÝÃ;OH>=< ¹ ?c²#SУð›ÖUS²¾,{’ñ¦&†¬ryÅÓkLý_¼þ»þ endstream endobj 3227 0 obj 3638 endobj 3231 0 obj [169 /XYZ 40.7999999 362.899999 0] endobj 3232 0 obj [169 /XYZ 33.1199999 497.299999 0] endobj 3233 0 obj [169 /XYZ 40.7999999 362.899999 0] endobj 3234 0 obj [169 /XYZ 32.1599999 499.219999 0] endobj 3230 0 obj << /Type /Page /Parent 2 0 R /Contents 3235 0 R /Resources 3237 0 R /Annots 3238 0 R /MediaBox [0 0 595 842] >> endobj 3237 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3238 0 obj [ ] endobj 3235 0 obj << /Length 3236 0 R /Filter /FlateDecode >> stream xœíɎݸñþ¾âY\ÄØn;@ È!È!ðd2ă8sÈïGzZú‰TQ¬É'uk Lw‹—bí¬*¾ùÓç\ÿõûõÍûÏÿ¹~~¾ÿ|©«ZÕý×îß÷¸©ïÕ¦©¸íþ»~ývù~ý~ùtùÔþÿû…©Û‡Ã¶q¢ïð÷¯¿]Þôƒ_ú'Ÿßÿ¥ýíW~ýsûׯ׿ý½ýñÓÐ_÷·‹±ªûåßý/Œ3nÚ?îë¹üõ‡ëoíÌ­ßîÿ?òZZ%ø¦y|Ÿ>e·÷ŸBƒµÀjTû÷•1ÞγiÁñß^~n{›¦QYɘVR×ѽj~ëV˜«Õê*…ö:õÖ×ÛÚ‘Ò2MG݌ض¥±ZêpW•QÃàï1™n#ºMnwš»Ã°n9k_Q\w×¢ÿ3šË~ƒš­[=õ´u‡´¨ÓlõmFlÓʆ†{¢Ò˜–ÝÙ-v+¼†®6ÃKÙD€ïfĶ-m„¼×Õ§$ü—?óßïß}¹¼ùh;YóåçŽÜºû_¾]d7|˘¹~ùéú‡Vj±?^¿üz1•±µâÍM -Í­EV-³hÙ7´èþ›çâö@Wµíß}ná`Ëû¾ûéW·M+N ›ÏäÔÂÀî™tæÈú…2>®'fŽÞB%skQU Ú•…ÂЂ—ãÏÄß÷xÐÃËâ]0Ú Ã€0Âô ㈰4Ñà†‚½ñíL9 ”ÂbS/§°Œ§h0Ê©˜:“á¿È×uÓ³uÍF:êÑÊV‡ï –2K-À–·`Ë8¶°7µµHxn?~SƒP xÖÞSàYvÞp·ØÛ@š¸cxˆÂë¡ìL%W Ã`Øí2|îÏ'ÐòpìƒçF¡tóAOƒg ã2‰£€³~üþxt ò[š8kî‚ ðÇ'`"w†5e={ç5¢¶[x ¡¥†!¿ÖR"ÜlXÝ yËÌTêGŒjšS«Ñ^˜VK‘NXÃ38u×뮲–§î¡Sw-ÆN õÔPGŽÂÅ©¡Î!"ùA4T©Ø#Fµ£M3¸Œ—ö l @æ~ 7p%˜Ë‚Üî­9f@ž€³HNpœ–‚0¥fà²0DaéSA£ è/íþ&  P,SŽ6›é¨;`=>òqNî˜;t=X7JºÒU ¨ e½ŽI‡Ü{x‡)´Iñ¼4[^?ªw€ýQí»Ô¬÷a»5Úb©À”Ó&È;9Œ±(Âxz‚§Ÿ°Æ¶£tXNò¸[6õtŽSÐ6oìèèÿYÀEº5Q"]ÞÊiAä± ž°ZoÍîÇ2áX±3‘˜´’ä¦ëQd$I¥YOzI3Œbì…äñò^(5"•b-?/é3ÉœM{=¶áø~2 ¢In—(=òA'…äEIQ«W‹’…Ãgr ±È”“.²<¹ÙKê7”±ª‘ªËçy~λSeI4)óJóä]®§z!N¡¬Î<:F^ö©¤p ïô(•–õ™œ6zM¢'Àü¼8j˜9q´Œðψ‰¶á«˜˜9§Ô3¼ÂILMk7Vå” C,¶ib(*r‘ÂsIœâOIãEÈâ2ÛbL:lŸPL oß=# ™oÓ\»„…3±þ€ÄðñÈ{HHbüyÞ“až*ð {ò>²îG=ÈØó“!yˆ‰JH‡{µ“Õ•’7² tû|õ ê~°­–ë²[ã~ÃÀ1 é`yÒ’Ùñ#ÒÁ‡d¿;  {ˆfD:®¤ƒu5¸i$œ€{øÞX~ïTÏŒšœS=Ö19rºÏ Ø¦§G†`ñ<Ü#ãoÂͲÅ1]èZŸøOâ¥Aäó™LJxåÞaš;£!ž~ ÀPì»´îGºJ™“í+æðý“ÒJSZ&_XŠ;ïBË<?áêÅ-¾ 6Ñ·¹1[±¯-Á)vߣã´Ö3Jv³õ˜ËÕ࣠÷à!:–] ØZºb žÒÆ,¿P<pæTËÑLn<„hGX[r”çFXÒ™ÅbÌ£²dñác¢¹’0mÀ‚„â^Þ•… ­›+ð!⦾%[€Ç Â8|éP˜Ý„¤À˜A:£@œ˜¯ž‹gr`mÝTàÄ‹7Yé[‹"-1àD¨ïâ §/ňE¬<o„”í¬ âÊUróHBHˆª3 ß¶¸ñù€0g·0×<§!ö»Åò2…W±ä,˧Zƒ¯+¥Y¤¥1“ËÀâ)Öå£ÞJe( 4ç?§ ±âþþn˜Nž Œ V?˜²×ŽLšºêvîÛô7«Œ©¯Jw?4c¦*®JU·y·/O¾^TS1f¹1lzKÎz‘÷c´ï÷KÛ}vu¾–Æ£}Ò~3ŸI÷–õbçcüry÷C®èîµ4S” ,AS(h™´æ×âæ+ååMÊk²ˆ$O! Ô<ÁH¢$^ÚÓ̂ɛJÝÁèé¶%‰WßSŒt3œËÝñÄ 5ÌJ)üŸp.oÈzeŽ!J aÒ™Õw§ºúßzxù(Wö½%¸M…Uf®Â*»¤Âj檗íO…íÞ’³^äý“ Ûv¾ Â*åŽÑ>ñTØî-;ëÅÎÇ( Âêñ6QX…õÐ;sYŸÓ¿\Z­8äAnÀU²ê<ô)JJTå¡m,ͨ9K3z‰¥ë²›ö‰ÇÒº·ä¬y?ÆÄÒL³ÄÒŒôÆ>KëÞ²³^ì|Œ,ÍŽ?D²Di )nºIÅÏN’§ž·ŠZ0‚ë§HÔ_d#éË)b+}ÂIK'[θã£gÒ&vb‚Oâ‹çfU‹ržÃhíòeS@¬dÝ’Âqå;‘°×íß ûöïÆöíS=Ä·'ްïß’³^äýƒ°oÿ¾°oŸro î ûþ-;ëÅÎÇÈ.ìÛ±¦Ò‹R?ýSÐxÛ·ì} ‰«¦e‘Þ·ž˜Œ·º;,ã î^ÿ‰ …{(FQ³†ÒóâÍ2D1©Â¡üG¨(Þ‚sÜß9u§<³ŽD(Vé¿Pñ‘ÝD¡€”Lâ|® q±¤ ñÆÕSÚ'ž.Ô½%g½Èû1&]ˆ³%]ˆ×Þµ¯ uoÙY/v>F]ˆOU¹àp„Ý!ªµ%>Š/nŠÐlÇŸ[ªº’–•¢ØtÀ‹íU£Ü’7þ­´§=Bm¡hˆô.B÷¼”²ôJ&Ã)eEGß‘ã¹# I«`P¨„rÅJ–ÐÄÊØ¡+ü¼Â3.]Ëz®êÉ…ÈÓö©pÕ0éEžöoÉY/ò~ŒIÕ ‘§íSãŽ!¼ÈÓþ-;ëÅÎÇ( êÉ)òh(]çµc\HñÑUPäuYwdR PÂG Ÿ&Àâ˜P#60΃bg°P´_ø¸q‹à_yD Çäí'o™Ë·f!,M׊¹²Gyaiý[rÖ‹¼c’oÍBXZûT¹c4^XZÿ–õbçcoj K;c8ÒÞHî‰ÓÝEyPJÊc®£yQq½;tõ§,MÝ2ŸÅ*Á7&Áj>مؑµÝMl©GÄ×Mô7ì)eoCrõÂ7#€ÿ–5UOwûÍGCÀ­-ÍF‚ân9Ì¡´±©¤Ç\ÁqàoÆZÙ 3`ꉾ31.ÁþF€ëyöV§BÊpº±f‚rd øj·>ŒM¦Ðo n«AäJèzLOI‰ˆ¢ ‚«±šµ-½š ×릭S”Ô4º!¨TÍÙO‰Wf’ñDµ@³u¸}À\=DˆH΂¹FžŠ0,™n7µÉ›¸¿ËO=âµèǺ$¡ÚdNCÜ.ÚsÖ†æÒ•@„E/o´åžuBçÃU½¹jxƒ´Ñ麼]‘§ Á–øtj7Áìy$ç–ë#©o˜câø»#Ö/«$Åÿå¯îìññ¼1ñEŠ2—zc+„çCx”ÿÒïgKºŸ`aοS2ˆ»JòHÜ—Ê—“^õ@Ißr7T "…`è3Ê(eL-)“90)MŠ(~œ´Úb)%t½æÉCøâ_¶;;°PŒK+mÕqtø]ƒW7ëûÿðÆ)Ò¹_†¨.U \óçÌP¦1[¸n¤í·è^¦KÓµ-©tñL¥ozó$«µKNØ-Ê{»q—Ê¿QRŒ×ÏHËF+SÖOíSÈŸ-E.6 KÖ2CÜåòëþî¤Y ™ü³.¿õS¸Ójà[" ’H¾e DxQv,ú(ÍÖý«Rƒ z‹²®OÄWÏËœ3ŸTùÙD¨iÕ^&ó ~H“¾“;h?D‚é1) 4ÃF83ýžÚªñàõß2X -<»ÍÏÚA\ð§(±àY¶¾nï˜JXÀ:æf“\–„šI¸Å†»å2•CÄ}m1å÷LeãPºéQÐLB߃,d]\€-OP SP‹„Ç{ Œ®§g ³}çç#BŒîW¸"gšó¬Â`>ÏŒíÚi„9ùÈ"S±]ó‘·» [­vÅG{…úH!®TS¨aÇ<¥Ôþp^Ü^¢|TâÔ³ˆ4‡Ð³AŒ+*4NÏnÿ]¿··v/ ?¾~‹º—j\ÂݽTŸ‚‹~º~g‹º²v‹‡„Lõeo®¢òV¯T¥–½‰VVž“£'9®+½|* Zz&$DÅíbhaÓTªwš<·hp~cÁozÕLóŠ×·+M\!±Ô[ÏïŸ<ï¡Y +ü}38L—Z´ŽÁƒ…ûfØ1ÌÚïolÙ€uÝï¼aŽò.µ?žÄãüÍ ôÒx½‰JŠUußô̶ظ·0&·-ш]0¦À”EÂV Î@Ô.eqxÇ#û”KÚC¯Á=ŽS÷S 2¦Vë"ÏIii` .è®êõ§”íúéò7» ž endstream endobj 3236 0 obj 4671 endobj 3239 0 obj << /Type /Page /Parent 2 0 R /Contents 3240 0 R /Resources 3242 0 R /Annots 3243 0 R /MediaBox [0 0 595 842] >> endobj 3242 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3243 0 obj [ ] endobj 3240 0 obj << /Length 3241 0 R /Filter /FlateDecode >> stream xœí]K$7r¾÷¯¨³-%™Ì`,0šðÁÀ@ø`ø`hwm,¬…Ç{ðßwUWU?ÈþHF0‚ɬJ ÐŒšLf0ÞÏŸþé×ÿ8üçß?}þõ¿]ÿüüëSwìÆîòÏáüïÞþÀÎÇÞ^þ:ÍÃÑ.ç¿ýþôãðãéÛÓ·Ó<™ñùÁë§ÅÛ+.þý·¿=ýtyùÓå'¿~þ—Óßþï`ÿ|ú¿¿þíßOüéºßù~š—ñü—ÿ¾üÅXcçÓÿ¼ýÛyñ¿žþõ;a~Þ÷üß?Øn4ÓXvŽ/šçß>Š^vÖ0MötDsþÏpÇÿþùé/§Ý^÷ꎋ5Ã8v:ý}îúËÿfí?Ùç Ãa™Æƒ™Œ¿}ø•™[•n´X¡Î'2eŸf:7Å·:.Μ~ÛM]öÕ>ŸnîÆñù3—¡ð;_v*ØlNÿ#²ÑùD¦èË®€Ç;±áÞOîù#{gK?ó¶U1¼&#ƒòÏ'2eŸvƒ<ÞŠ ú¥ëççÏ´C)οlU ±Å.Vf£ó‰LÙ§]AnõMD&ÙW™ô#òàÏߟ~úe9Ëßï9 ™ó/|ÿýÉ_⇽;|ÿÓáO’|ùãáû_ŸÌpì–~ž¥þeÅNÏ+óË:ûüƒéö›¯¿Ú¿úùùîõîòƒ£»<Ê{M°k~ÕLè}o??¯ŒGkæì•Ë‘¾~?ÝqÙwÆš/Í8ãÝZ?<¿v9ÁGüL_1x·¯pEìêš“jéájpÿºåä½ÙdôðòÑÃI×}KÆy¿A¦­áYí7Û›àÐØ$©Õ˜ S°·‡sN„ŸÉ°ýÅûU×ûŸEøNÈsŒ$<|=øšv.§ïÒ¢ï}¬ÌÇKÀO‘Wx“FbG„ç#9»Õ©cç£vLU$Á±·))HBHl(ÃzôaݦÆ1.%°ÎgöÓETšãàÆó/çˆWL°pEòôŠ`ŸÆì™^¨ñ…¤u%³9š‚®nf¿æK¨µaЛŸSê›»ø8/Ýø~×|µ1¼aø}¾ ¡fLƒp{÷µë† iÍsk–ãG»9´bá3‘CϰT:Ûìp ŠWzѳEÞ³ª.˜¦ç¹›  ø8+²Ø‡W:üž>c¼¦ˆÖÁr;6ƒI-¯`,_Ÿÿose›Rk]«:ƒžÝÐ Í´¼rwRëS#­ƒå£k“Z^Ù¥–’Ôªƒåsß &µ¼rw¼j÷ÈË—Î6ƒI-¯ì¼¼]^žH[†ñýaLw'“–ŠD˜±_½{^ÉJq 囋¾ã¨†MSrVN$*ü ?BÄ "n*gaíŸLZþUÎá­Ø/Ù’‘´†ñ2¸?Á1ò†ÑÇŒ5Aþ¢)Üà‰{ç !.¼wII¤R]µs°½w²ñÚ~„ÏÈÆk'm\;ããj3!$prSDØÌ4žÇÓ$òÁ"‰&%Š"ÙE1Í~WXgW«ÇTðš£E´,ßþ‰˜J„ܾY`×Ð4Û²¤i…|Ÿ‡ÏÉ3Ç•$ê‰Ã7ó~ºÅÜ^dÿ4ï3íBK ¬DEBÊ>Áªl2Ë”¤ˆÜ[Kè(,žW2d\pè€ÂSW$A;#™²XÒc6J`Î%º0VIñu¬—± Kí"ðí É ÍÜ«’f7ÅÁÅ8‘r6vQý$ãª)œ¹À$$‘¥TKd3‹bµlò ä"< $ ©ÃJóÙ  ]+%Cl8h²^GÁ0iÎOvåä¤àö §r%hÈcûYÎݲ܎Žpp×JÜ©©G+\¹ÊÄVpJÜy¿×aÁÝ:˜Òd~A+î :ëà‡=†"ÝK!tp*˜Átðl¸Ï†ƒpÃÏà÷àûáTöðæ,|OÏè‚OÝLBi¥çôÏÀØË¨ËìànV“rn®Õ;x‡¹>Æ QG’­ÜeÜO„N152V"´]¯'îlÌœÆØÕq9"Å!'Æ]_-Æe,§°”À2¾‡#]#0À”ù >ä-k2˜Ûá>ŠþñóÁˆdÁ+øæ0‡dð4‡aÀè€é§µàeaú¸¡†¾2àg0Õã;…÷ƒµFá¡`H§ø{Xú ƒÃr( se‡ôïcôUÅ'æ.X'Õ‹0?ˆh2õ:Φ¿uê¿ÖÈèGµÌbÞ#ˆzN¥H¿*ï7 z(ì¼´ñys»©¤d*i–o“OO:ÚT¢{ S(ŠR:ªt•ÐÖÇï/“2 l݉’nñů𬭈‡~ñQ%™HEé7³³µvØšHß™öf•´™¡Œgl¸H¡<…B3ãԟňä´àoÄùmA–“ÒÊ4¨ÝÊjÃÑY½\D:8E¼’™Ðú>kÒ_ªnétµÓakµ+É'VVY´hEºNmÐ5¯^Õ0x´Â∘ËHt@¿÷šQ‚æÆéXÂÑ;DËì0÷µIf‹M ‰.!J-vt´2?ÎWU"-Jòó9)š³ < æ3ÙÉf­f'µÁùÜ eŠ4„gäóRìbÕ3dœ\ª酟[2ÃWïܽɯ_fÒñ 4Ru Å—â’ªAR1fׄM9u´©¶JÑhØÍ,Þ=Húå•Ãènöqhõ켽Πš±ï´ñ¹7ÆÃ BMVƒ t2 Ö*Ì“ ¥¼ƒŒ*T‘r¸{@>͸±|j­À`˜B”~š"1Ñ-[/¡÷ÊסpßP冯­ø˜Ë°qwËLêb8V Ì‹Ë眞:ܹÿS`Úeitü®`â»[Š»L¨P'sVD¯ÞNÊ xÓ̓K»kU™éŽãdÞµléoÞƒÎx^¼R!„½L>‰·«šÖMIÕu}õÓò1o]³@Y£Íˆ¦x†!ér,G¥)èTJAM¼I`Ò®^ŸÂI‡ɶL·M_= 'ØUJu˜˜/XÕ4Ò`X»rÔç[ ðþ½9…Ns Eò<½1%ÿ81Ò4ÿ¤ÔlIœˆÕM± éŸÎ0]VR|ʾ®`ý#e4#‹w:BnNæÅ5U)^¸û¸±°!wÚ¬½ ÚÁzÆâH BÈh.¯ƒùd/[´¸zÍG¥AÂb¹þ‰j¶•/¦‚E:»$Œ•‡Ð±Æà÷ Y÷«ÄÔ¢@É_íTÑn!LÅÜ ¦{¬Vþ_iÒOåœB:k†S Q\¾xUg NT»ÊQD§ÓÁŽzƒ™;C4e85ò¹™òȪ¦úV¸ÑyðÙbûžƒmç£eà¹2ô¹-Δä¨ì¬ðâJ¨&¡GV¢Ð5l<ýó{³^¼’êvíéùn·Û«­©ÈìÒ-¾xá\¤óŽHªjyIu,¾Ö€Å˜ É“,= h ß~LC_…bCQšß’‰¢£´˜­–L%_‰yjgBÕŠgé(£šžgŒ¹P-<À'¨Ä‰#•ÅR3(Ð iM„QÎᤚa OoÇ’K{ÀŸ€1Á¾Ç¸Ì¸í}%Ê;EµŽ6Æ™,ßÁ†>,ŠáV ãYºG¾c)޹ æH]u×!/ltiìÛ%˜°“Õow9ÕŠ°ƒ8ñ‰J½ÈÙ¾›È 0•ÀgzüŽDnXîÊz©v‰¼‰<÷%\hu¦g|Y錣-0Ú™a~‹¹C¤Ù¾S ·Jй7=B8¢ÄÀkYù锃oÕhŽ!Ûdiný8KDÇÁRK0ŽtÅúCxy9“ºVǺ‹Ðiã:ÁÐY`¦Dt‚õµ’õ£)ÿ·©•ÈêãæzÜØXÔ›ŒmdŽEÇ¢íJÞdYËQÖªey!eý ¢^¡õõIÍ çHí^”V4&k ¤žDÑ×1ö1x4Kî2øzä†9´ÉðåFhûïÌSÑòJ5I42‰’`LÄ6'bŽOÍ෪ǴÀàUOÒú2§ßi^깉£P [Ü“¿x•`u°bšßã¢/ßk,¢_zo5òê’eãrôuÑH¶?Xþu†—J8þñ0‘žßáÔÀp¸r¥Œ‘Zþ–Wg»‘žeJBd¯éÙ£Pòt¶¾NÜFMÏhÆäyZƗDZ¡X¼¼tve=ŸbdL*Ç[Ïá ­¼šM¹¾ ¶z T6Ɔa0ÀSGìx¶H C‡“ÿ.…Ý#ªwQû’Zçõõ¢¦=4²’¥á,÷ǹŽ(쟯›¬Ìi “‰!õ8’eý<—mêî=¢)>”Ô{ï>j64BEg c˜F8:%ºFÆ`yΉD&²ê /gC˜ † 3ð—?øRS²ôýJÌ‹Lô²>pƒ™OùÃê"sÈþ)#- fLeÌûª"Ýsn‹È¡‚.3ZyØPÆ@Æà‚}ŒËbìLÃj—?÷¥Y(2÷ÙúÌ=¥8D&þŠŒ‰ ¨†ÃüD—œH™6½öÔ]Œ³‘y¼X;ïŒ.`\* ^øÁy…,øqH^Ƕ§o¦‡-³”¶ôu!)c§ªyZ«¢Ø”ͳeMB?ú´¡Ã’óÇUg [þÜìl1 Ï1!>ä{!Å›1øHÉáe‡!‹˜²;–4‡%JƒÑƒïÄϘKJã¨+ S V–XÛ+Z>ã¼x2Ë…ÀÎAY°P´cBÜ©ù~ƒBÂÛµü¹3êÝõÙã¼tcbÄxpøËf¦;Ž“y§ïEt‚=y^„ò8¸’Vµ)² 9ÇAÂ1? œb¬3ŠBƒn²\ñ¥‚]ú:Ô¥ySDH’nC»x¤8#XË›P /bÝTLµ1Å<–À:õ>£ÂÕd¸g6ãÌRÜÕç©6ܿ‰vjî!Üz§-¼–@xm›-æ§ŠõÀeèø¡$L™Œ¿~LÞÁJ"8•|Öi?¢ˆ¥ÅòºŒfü"²'j_ÔqÖ ô°º0Rȯ×ÔL?%JPAØ’dU}îßÖéê–„  &“­·rº¹&ïŽî' gèÆI‹ZME\€ƒÌù.Jê©H‹ §ŒN]¯KµöB‹od¸@õ«½†â”ÁmEpõ>’eœE}4Èâ=‡;…è®<A§?‰HÅnOï2xEI6ˆ+ØV?£„ ´r«j!æè±} …ãûçxÝ ”—È•¡#ìÎà8<ÉM"Ê\¡Ó"+㜨 ‘¹Ë¸ÛÃ,¥°N³–o‹“é4[)F¾ÖQXÒkÐ:Îþ3\óÒêdR.Îãçëç}ïµnT©l:;ûט+Fl¶‚ñè¦$•U‹¨¢•b”,=*í jW‰È0+K< $$†il:1¶VèGߣ?œ†s—%Q€ ^Ae%ÁISTÎ7Ødº4Ô–Ñôð’@õ©–›KülõHPÔ¦ºO¿èÍú‚¢vÇL¥„ãö„ x{Ñ„ºàC‹&Wבˆõz/cÇð*ަ‹ŽxJ“mRB¼ 8’0በ;aL ðLp­64ÐP@ÏÒ´^®-g–Œñ²EJÇEY2æùEdÎ…áŽiÌ „¦8 —p¡´70‘•­ÈQxEcÚlΘ–®£4UJIhÎ)§/o¦aôåÍâwítŠéA}$µ›=°RŠò›¯3‚ÝÊýð ràu2"ßKhdâË Ò—ñ¡2¹ Ñ»HŠ+A¥Î't™l!Nã_ýB»Áy·Û`“ÒP8oIÔ4Ò®D¹ŽköñÈá˜Ö+¼:\\R)Q†“ŒyL®é&Ñ/ý¤.®Í_ož’ó˜EJ0®mâhuªSyDü)µ­¥ÚöÓâ£Yç„pýA‰ûªYZ|Ý¿¸RÔe9ñò›(‚ ¡:™pí)¦j¿“Bkg)¬~I{BCd‰ª‚ç†å@IóÉŒ'J QRAèWR¡$ê2hä §¨I Kω¥gÇD—šÌû“âºxR-=î×Ì™šlaî}¤‡<®2À™üð‘*ÜO¿‡1»Ú0n!kFNïýH‡QXw__ !¹9Øœuj:¬#pÃ3ðmcjLMx¯Ãí– ªåp;Æ$‹çÂíï ÿqõÞÁ;#øÏÀòÈ{ðÙ0 R”!k÷¾3‰Œ±7â:ÆÓ8'À°†TáªðN{ˆ×‘³ág0&Êj%˜óq`ÍÀÞˆË#õ Wfé“ éÁx'çÐvWQ¾›nQ‘ï)Á/GpôuQ:cÙ,»4âéµ8ñê :²xy´¬ÝƹmŽ,À+˜~à3K Â-±wÃ=!dõ<|s, CŒS³(Û}8E`¨(Å_›\Ôê‚o ?S˃VIê±N]«cLËÞº]fH7׋…·3¨ö¥°6â'kÇî³+M«àH†Jp‹ø:0ܘ¸ÍÙèÃ8ÊYÁ>pŽn'k#CLŒØ9œ„MŽ7CTÖj’Õdv~]_·¬O²pTÖ®®äk¿·¨\#Và8–ÈCYÍ¡@ìSÁþ<ˆf×qö•Íê“zÐ"< òN\ÌÃÑ¥ÖÆÔ²“v¹»ËÝ ¹;É“nS#mÚšic¶€"Òˆ¯¶ ž&«™ ûqpvÃÞZ>ŒZ9†ƒNYÙF²Ö¨±Ç¸¥£Åãn]˲Kž´i}e÷¾6-“…«Ý£&s‡¦µ¬Ç‰–mw„åîÕ¬Èfð s±MúÖÏnDDZ}ò¤-ë8‘»ÇÈÑUïLÇÙ&ÜÖ—S»Ž³ë8»ŽÓŠŽS‹‹±ðs§»ÆT¬1þ=ü8©F'µçü ×?~û=¢+…JV÷ªd}‹ªYÑG“úÙ<Ìé3>š:±˜ñx™ÄÜ¿¸¡®¡Ùq<ŽßXÜñ™@¥·Óqò#]=}°rgßíòáËa8Ž—.?¯+|Ï ŸYà3â™ìÑvýyÉ$ívA÷?ù÷:»òƒ/ü=sm—óÑŠAßqíšF{æzc”o¿ží™ °îüw;¯HÀMáûð3×éã ‚Ýú ”Fsì.K¯lÂÀÝàÝbL4_ -@옂)‹… ,Ž|)<Á5ððÆøÆo)—u‡Á.½ 8¦î/"4ÏÝx4çQ]’ÒG/^àŠ{+Õ%ÚáÛÓÿkQ endstream endobj 3241 0 obj 6927 endobj 3245 0 obj [171 /XYZ 40.7999999 705.620000 0] endobj 3246 0 obj [171 /XYZ 32.1599999 233.299999 0] endobj 3247 0 obj [171 /XYZ 33.1199999 231.379999 0] endobj 3248 0 obj [171 /XYZ 40.7999999 705.620000 0] endobj 3249 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 670.100000 165.599999 677.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 3244 0 obj << /Type /Page /Parent 2 0 R /Contents 3250 0 R /Resources 3252 0 R /Annots 3253 0 R /MediaBox [0 0 595 842] >> endobj 3252 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3253 0 obj [ 3249 0 R ] endobj 3250 0 obj << /Length 3251 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹õ‚^ ‡† ääx³ ëEœò÷£n©§Çd$«X¤¤ÙÀz¶5MñQ/Öã«7üô÷ã?ÿ{|óîÓ¿_æß}:T§ª­¦?Çóß^~ ûS­§»¾9éáüçøåëáÛñÛáãáãøßoÕ^¾8ÿ3>¼¾bð¿_~;¼™^~˜>ùôîÏãOÿ;êãŸÆÿûåø×¿ÿü4wþ…¯‡~hÏ?ü:ý ´Òýø?/:?ü×á/¿;þ6N¡¿Œ{þïºêê¾ï“æñíù«êò÷åWÑËÆÍj]·G¥ô8ÏfÜŽÿüãðó8Úó4NƒQªkMWEÚéó°U݇®lœAµÅ ¥RÒƒ–è<#•¶4U™Î?{ë=ïW]§.ôy¨ÔÚ‘%D:ÏH¥-íºõx(öÖ÷ã9^¨¾Rz*qÇF¹ØÖ2[ž‘J[ÚuëñPÌ­o+]™Ë2›.uî#%ï¼–!úiF*ieÓÆ{F:õíüþóžþüsÖ&ãG-%v¼R—½ÕÉm¤äS‡’è<#•´²ëñ‘N½©UÝéÆœÏà¼ÿMßëñ箞ÿPÞ´“”SUòÎC%ïaß ÆyF*mi×Óp†ú(b÷é›Ý÷ÍóÅ?Þ|Pæl_´ÇÏ?3¹ØÊÓ?ŸÇå6ã F£¨ÿï§ãï«J™??ÿrNÍPwÍd\‡žÔ=zRýŸ ð=}~GÃ÷TskἚ¾Òê=}4ü¯‡qÚûé'UC§k<šÁ”)ÄC½oáÜ0ocê…£y8 ïžuMGR`þaÈ7üÏJŸèKÏÉA™È9ŸRò£fž{ÿyÔÇÙµk;\%1Ý©"ñΓ™IúÛ¯N{jn£ªËJŸÌ}ìí“zñAe0½Î\ÇrxÿÞäíÍLÑž´ê­_5px{j³DiNµîÕwÛè™ ~±³kxðŽãïâIÃ'x4ý!4g×t 'à¬b°GwŽ §åì>XÎfÅŸ#…¢ÞÐ*µ2–E1âïlô}Ê¡ÉQ,glY•Þd5bÚQnYájY‚¶s&â(U¨¡õûø÷â–Ô ž=²µ‘«@$Nœ¢tR¿†@K›^³Œ4ž-™¦ØŸú¡úÞEúñöÝY;(ujL{Þ ¿¤˜SË’a[»;+S2ª~h,5°8•Qx”À`»²oX$Ñ[¼Ü2ÎV°#áªllÓÀ£#“v,Wßci·û˜½'"½£=rínyÉÊ™Rq|¤èwáÎ\Å5/ؤ ç .xžpyÎRö쥭„€‡ýšMåÞQ3¬#-"Q=èfšqÂC¡»Ù³BœY¹(Áæøkºæì;~=è¾}ùÁ¯‡OÙpè`IMßZ2b“-9p@–6UäSUs]#‹'Ñ›‡ÀñX,A:"þÌ,VaÖˆß&ÁhÎø=0ë†óHägù ïÎò{PcYƒéó3Þ7,Ÿ"î›ÁïÜ7ÍA)gà"{ò|ázj"/^éªQäáŽþh0¦6L—x¦OgZwâo „-ÛA¶(8¤GˆUÚÎ<ÁßÍ® ‡}YzÂ†Š”¾ì±¸õnc¦ò•”•Ýy­­³Ú£—,Æmÿ–Õv™ç&ºLYFë"_iÖ€jmK°é&ÓŸz³:îJ:KçìON ÝããH'Ès]'€¶0zä²Úö„ÁvÂô]ÆwíÒ(pÿlM˜0 X˜Oó¯6õåDc$pD^Œ„í¨Ï\×g$8Á8po¹µb?º3æ ±¶6rdRú‚`¼¬f)´BýòZT¬ÏÊW6–©uf \ëÄû‹¡ãó^qœâµ ¶œÍ÷”²µ•ˆì Úñ‘—'"å‘Ý"Tœ$Õ{a{$g_YmS̬,÷jEjÞh «€"¾“¦l?“b½ûº^£±.§›1ñr6›Tµµ·‹Á#{šÏÈÖ%ônÊ,pÕm¡~ã)6kŽáØ·l»BžYíz¥-t­ÕÄÅsÊv/ZzÙ¯‰üžûšs†„†Z y §æ ނՒ™p‹ÂíÂË›ëÕµ½ÔŒJtÏ0f4’aEARš_ä0ÃQXÙœ0œ¹mg¸’ž€€BÐ)6xJ68Ã!Êr0‹Üì6Tn¾øÍ<ñåìN•S>ÏI7½æ/A`‰MvìI2ÅOÆ.ìÙËÑ>™W´ÄeÐ27ëXªëÏžä¸t’cÎÔ¾ÎÖ*¬¸' šO…ú@DTg_s`âü«K‚'X—‚ro Ü|ë&LÎ)þ _*%¿†£ÅBŠãð 'ÇA¸ÈËA+!\â …ŸÖtÇе±XaÛI¥L¤¥²á÷ân­·¸;OÎ A„F„§¬gUÚNŠ5¶˜ª¾¶š²{ ©J8Ž¿xdOO~eÁ†‘}…®ßFV{ÃÈ,46T]p>{ÃÈjoé݃½aäÞ0Òr{ÃÈjoéçÓå=}{Ãȵ Ûà|„Ÿ`; Û˜ÊrÓËZÆôR°)Ö`šÂç¸[Š»¥¸[Š»¥¸[Š hQër·½vq{Åc]îömÈ.ºAÖ”²o9O×â{uŸÝº7Q—Ž>ìMÔ½w«½‰úÞDÝ+{÷&êL¹³xü#«JyÓÖÞú}èë–Y¹vñí™ ¯ŽqÀ£aK„ãOX<žiþñ<È#õiµ>1òoõæQ¯®×H™ÎáR2Nþ ,Žplk%æój[‹vOšo¯¡º¢ÖƒEy€F ]R „‹•›§#fçõµÍèk.d'QÌÀ„BmVb4¡”Z¤xg=Œ‹"÷¬©¸›P²–7GÜÉV/^@@î„ßðX­Q¸eƒ(ú]ÌŒºi¨´¥›X5ß"ôÏ{”÷‰Ò ‡XˆYy°%Ñ”Êó_¯Ï`ž|²vlE7–C¢ñV nšÁy’¹>/ :“côÇ€Q 0䔂i‰2GJ'Kòá䬜îîŒ/šeAÆ«éóõÕ×tzʱ €eY@ RÚú–bpFñúPm7 t´fÿ˃2…®]l@s­[õÈ­°`áÀp3ÀeU"–tIAdÛR›Ì™-©‰^²L–ƒ¯“…àÒe W¹-` ×6ÄsNÑö¶Ž ‹ˆX:XìØ*[%¬M0ÇÛÎ"°ä™ý©+Æ5–ìcü ˜È)6\ÏyNøÔ¦¶…mØF²ÃãÞdøô’p9vUB’1š zõS›ês}ìʺx{ê«ZcM}ÐØ}îóRZÛÝXp<Ô¢I­õ/Y}[éº[ÃѪ 9ÈŒ uO}8믔ƒÒÂA>,¶RLU Ô&¦ˆìz<èPŒ•zÐ9?9\Ō׃ñ'kÌõ¸ŽšßÂÂÏÃWfz¸‚+`G@Io^ÅÑkk-«Q9-5÷³”zçiͶæt¾mçÊItÜÞ³è$:›e•Þ­Íü»û9B –¯‘È£¸Cœ@µÙd‰EÈJ·DÒÙâÃîÍœP+"‚cÀÉÍ` ZŒH¶cJþܺ<—0K®vìÂW’ÿ‘á¸ÅŠÕ ÕÏÝp°’sQ0…bù‰V6±äX¼wSÊÂq*BREžÊKØ !y–ã›Áç(¯Æb‰rx¬é­ëë÷N¸‚D¤§†Ã©¯öM7XšÂÝçL…J¿3f¢KÉé#Ä4ñ¯†S3%ò³=¸!„œÔ0Zž+Ág·¡L׈ä¡yòwÀDwGJhŸ¡† #ID¨ÌÊ×JÙÁBÎêÖ[—dI¦bÉžøãv…<Á„%šãµÉ€ÿWàFižQ£KU2IÚj¬Õ¹‡yžÈ0ÆþÇïÁ£aLlŒ„™8ÒíÉ^ÀuÎzÞæ&^] Öù®ÖÖ_C$“ÑàÜê8K2xNLtclšY1D´„[Šã·ḭå-½ÕmÖ¶³"\:9mëì~™[ò^"s:guWgÛÄ‹]"ɪ5Ë$„¾µQ´'vhb•è¸pâ78³ç9o¦BÄýütH«t{­•áô«É”’¥t0áÚÏ2ã¶§:eÑ¥kZ°‹Âj˜Ùqט<èçZ ®\ƒƒP,¾x>!GÀ )ù)—–ÅR*c úŒ@È„Û!dŽ' >GÏí/‘ššçîΫõhñ캤ëooºdñ ÚÌ”¬DrB'’xžw£»bé}ýQ›»¦Ãd9õÜâv¦=}›„óɼúÖ÷+­óÉ`iÚuûd ¼øÒÜ8YÕ§ÚX²|¢½sÜÙ\€Mj8 ýåKö!E¯®¡—´œ…8ÃÎJñÞ°ïá‚ìa+g7梼—› wA½ƒOÚ™ófÏ‚«µoipªFãz¶ãCny6_‘LsÅÍ)îYáh¢Ò}µÂù²"¥SáÚˆˆù„{lR맃°xœ¢T#áS²÷SnOw|á–2ÒÖºŸS4­­> Õ{6—ÐÓ&+J&îåU;]yèWë)“r,a ‡3Áã³XŠâê⸋_ÿdúÅPGÃÀéœJ­À[Bb÷¤—‘àQêš/V)ËÇO­|†ÚX:e«¬rkÍ{ùˆéž#5œº–„š}w7 5ÿ(¬œDÚ%˸ç7tHjV=žÖí4ÍšRª-9Bðœä)±ÞYQ–7Ù‰’˜gd{Òˆê>³'î 7„À£HS¼ÖûC™%¯Ý ½MCRÔF`pB¾f¦@KB¥í+ÞN³L‚Ÿ ‰º·Ïgd&‚Ûš’!ÎÑÛë †Òï9s=ëÆ:ÃÇËû)3÷)`ßÜ AÁ{ ÀOVm± @fGœð-;ïÁNx£ëk§—^?(½h a€ÛFàÜ€¯ïiÞÁiQJöA致 hëgÊ9©0¢«sØlÏPÇåTƒc«JŒ=!@ó ÆiJ$Œrç çGŠâ£SܪYÚ¼{nVñlOØâù—‹5HöHÊ»I÷Å £)•“¢ÕÂø=%¯Žm?\7‚ÑWjÖÉ´æ6ÐDáôýRbmoÂ{ÕU}ic^M°iæ1Ñ÷',*ߦ³c¦2œ¡»ÕpF˜3p´›ÖÍkvå3ÓÞyƒõ8ÔÖž&u¸M£s$žÇÝRL:¬˜ÏÖì\[Þ…ö’ÓÇ¿Ço#K_ª™«ãüÏ—¯w…Cu½âÁûÕp-x{Tã2=]®¬Çº2ßuÛžÚû¬ƒ99ל‰¤twêîg%uwžLW¾º>éá®C¯iNítm²•û½÷ôð;üÎÄŠ>éªVßÕ”ÿG›ˆúå'OðwçZ…;+ü€¾3»Éî=Qh³†öùÄ(kŸçva€ª;ÿ¬Õ}Ͼ¦sßgètàù¦ª™Bg´YTŽß©¦G·'•MºãÃÓÆ‚Ï¿G¹´ ißC3˜ß3x RÓ¼ãŠ'$+拎ñÚá 1¿àýÒoEø¥ï«ö¤Îé˜wçÞdø¤y©Ãõ×ñãáÿ´1š endstream endobj 3251 0 obj 5724 endobj 3255 0 obj << /Type /Annot /Subtype /Link /Rect [215.519999 160.339999 263.519999 168.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 3254 0 obj << /Type /Page /Parent 2 0 R /Contents 3256 0 R /Resources 3258 0 R /Annots 3259 0 R /MediaBox [0 0 595 842] >> endobj 3258 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3259 0 obj [ 3255 0 R ] endobj 3256 0 obj << /Length 3257 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€µ$ER˜g f€Œ‚uœÀðûà¿©¥~¬Ø%)6{–»ÀNosD‹U_‹¥â§¿¿þ«úÏÕ§‡×ÿUŸ§Ÿ¯;V3ÍÆ?Õð÷»ó/„©1~lªE7ü©>Ù½Wï»—ÝKÿïûŽëýƒÓ¾ñ0ÄØáŸÛ}ßß¼>üÐú³Õ÷ýÿ~©~ügÿã§©¿á¾ìL§‡¿Ž¸àÂôÿ9ÿ44þw÷¿T¿õ$˜}¿Ã¿ß f4ëi ¡ãýø(ßÿ= Ö3K³V‰ŠsÑÓ©úoÿ÷îç¾·#µ‘ oZ¡dÿ¹Ó²eÊÑn›éϪ‘Z1 ¥•®ºVW‚3k k¾ëºâ¡­ât4PÄæƙlÝ]Õä¼–aõ"ÔuÜO³ŸpèD]…rŒ+Éã°~ ˆ‡MíÀzÜ•õ\ub?ÍFŠ`ŽM]³¾ëõ6Îöñ°©M¬Ç]ñù‚+m´hHbÍøßõtö<Ékcœß”]…òN´½]ŠÒÑ@›Ú´vW/QL•8™ªwǃ÷o»OÏ\6f°Ìo?+? :þxë§«z z“eTõöSõWÆøÝߪ·_v]­º¦U£?0µHÔ"a‹èP {Þ·<½õüØzv†ÉÃî!=„Ì¡ýŸ)-΂\Æ]í¦Ï@)ç>#à82¡fˆ&Í`-ÄÈù äòú-k‡kŠ{x,;ÏøLR=ë}°´zƸ?G0-ÚnTŸ3Ö3‡Ÿå€=Á–®CMoà8éÍÔ¢v@Í%Õ¼Ós¨jµÒB“9¶˜9·åé 5~QËqg““‹CÓ©¥›õ:!ï…N&>µ5³x »ÇÏLVûl:lMtΊiqÍšqG©Ru# ÿŠÁŽ™[ãaVX«ÅâÀ$Ö§/&¼“NŒœ7µéØL\Æ…åê@ã©åq`BÎk%µéÂ[´ú¬4eqð3Xnð3£¼èZpsÂäš­ÅÀ½by±ôïúÌ™ÏKÜA± dÏxþE>l¢5$Ídz´!ðë¹ Öx[ÛꙡÁü±é]Ïu‡ ãE…Ü€Q7j <~ÕB!Š……²jóÕš–õÅý’)’-4E›T3·@Ž¥ØÖýYa¦=–b=.ã ‹§ÅöГ›†Öõ–Þaæ,îÍç‰Åéö†`ß)3{ÛÄb \†k‘ñšFqž,6Co}û bÇ%aå,)C¦5w,ÇâyÑFaè„tг¤PìäS¬µ]óuºýšÒKa Øâ‡à Õ8Â;ø æ8æƒ)€áL“ÂÏ8”Fg¢:ô™£ÀR‘H’0‘àpisäB¢ †…±$‘B¢QiÃz&ñ1ž!œÞrn‰‹øåèzíxÏÖÕŠ:ïTZ+ $5]BÎ y œÇÛ@Hö1G£XOR®–lBV {PK-if§EÈìi§ãØ” Ù ¶4˜j,¿LES±Öáƒu‚·šÊ»£xPØ'¥øVIQÄð=Ë‹ãêf2¿-•_‘…ôõÎ^jéƒkï><Žj’ª»á†ØãF&šÁ»Ã¨ GU‡8g‰49ѳDšJ¤)zËmFšJ*ø„­‘ŠŒ¹xý}vRËÛÝDü1g*áj ³Ì< &š _‰‚9¢`’`“Ù­ëÚB›TPL9cÄ-±®üc]¢Mi-±®ër{jyhFw5a¬«æ°%ÖÅ,#%ÖUb]Ñ[n3ÖU^Ç^aMÒ ·l¤/çuüˆ1µF‡ÄFSÅÔ®cqXᔫeJ4ЯN¸Z’}ä¨%ºŠjJ ó—l½ÇHX" [h“Ì'«ÛºÕ¦·º¾žÁ•Ë^Ïtɪ]åW´“†«Gª;ˆ<4Ãí¶Ê)È­Z“Œ1-Íèâgüº«VpÕÜÁf\žKµUÖøÁ–+ðx”q³ žØ¥/¬²”Òˆ¸&®§²H+¥Ò…O :\¤' Š×MZ_uÓ§Ê %ë·TNђ„µS¸Çhâ7sÎZÎL]Ö;ñ™i)—½;O8÷½¾ôQv‰”ý#%ç+yÑ!qíœe ï\5 >ÚnçêH9F»6™¸v2 ¼Éèŷ㵕šc±ñ)ÈJËB¢ñ”–”y¬­HŽc{å­žâ/¬Ð™¦K¬3Å_ø¦ü…R9â–ýe–¥üvý…6$s:)¥ÝFYÃ%¦æš)áœ4«nxHÞrÎ2FŠ©•ìÎ ¾,dwúàâ‹Ñƒ®Ð´R_­„SœCi]ªh%.„^¾âÖqso¢{GK‚tIÆãm’ í uñòdÒ½ì„{€IœÞRe·Ä禙tÐï—šz< /nú»½†£yä¬Ö-ÿêm—c™%ÆgV ·|,4°®¦v¬Eo—ÑÀŸf‰Ø;˜¿Ña߯K¹ÆØ¢5 ²Ìí·­d„EšœÄ ¼¡´x¼À…'J‘5ûŠâÈ&%Žø:{Kÿ± ­ϾMþІÇtíÜðx+TW‡SmáÖy‚F/V™q½l3–nžc´AKÐSæ7ž‘ǾÏcÅBö}#­¦6›9£²pu`ÿ©åv?º&^Þ•#I¢§Ûµbwòæ¹p;à Ñÿe—ÄǴð>6Úá[kã‡ÌšÂ6·ðºlÔ=t • Ð-oûâ¼%ïá:à¨!æWÿ§€5j‡I²Õmû˜T3twÌž•q(Ç|†f¿FV°94 ž6'÷siS益bé^€KiC´·¼]o[º¸;pÄ3lŠ®Gqpo}`ÕKý7õa»FñpÙ–>äàÀ¡õØžâ+”²óÞ>ТÛÚOuÆ.az3Êié‡PN,DÛMŸGxŠ`¾Ýc—kÉ%ØÅóO=Üöx@9ØÔ¥>"ˆºÏ½ÍSš(»Š5ò.™¨]L¡5@Åû6Tð†™™†ÛÇ’!¢eé×ïø²ŠS¬ñ<ð<äd‚¢ÀeMË#Ð~íÝ Åæ9^\‹ Þc\¼¯> g™Óå£èl=¶8+hõØâ„;LWˆEµžûhë#·¤.¸%FðÚçüy=¸;ô8jê! ëFŽíƒ‡\/&ûÄÜ¢8…„Ä5‡Uñ0MÐHÚæÓ¸èS;ôÂc²Dκ/Q-ëi-ÎúéYϦʎìtá4!]5Ê1D*ß×ê‹AÞ­–ÿ}膫͕ž-·%ûšr2>§Äv<øV¨d´×çSvÉîyð5Æâx¤®-Gœ·uL·‰ZÉ3¼=W1þ•Šß¬ÒMîIèæPœ*÷jã­=…ýˆ„#·ùÄmvâöÀ´=Ïšzx¾·g?ÿâ×Ý«+72©= ³…r¦kÕìÉ¥Ø1ÆQq!§ÐX`·Il&ÁáœGNbŒëü©5W *¤Îr¿Jý®[PÂE¤79÷"eßaê#¡WOuÍÜšà͇Ë>HÙtûËw‚Mo»LŒ#ØoeQvÎ[‡õŸì«m’4=re‰‘ßÔ½|î|S\’½zÀÙrňWÆíå·›£¢•üÄ øË— ^m«O:rÂBå¼{ýÙ‰ú(y„!¥Ù¼räsÒ“ky›-í@«g†`£¬¶€3¤Èï aÍ^v!oTl¬¦¸|–QÄg>è„·W ®ŽÕÒaM9k4ÂÊqŽ›E(wêi¤zâ¸z®wgŠ+^¿6liI×"±TÁÚXvrå Ömv> endobj 3263 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3264 0 obj [ ] endobj 3261 0 obj << /Length 3262 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`5|‰”€ Àôcä 1 ääÌf,2‹tö¿¹%»½¢?J*ÉTÙ®i`ÚÝl‘EVÕW©Oüú÷⟿Ÿ¿þ§øÖüºS¥òªûWì¿~8ý…©Kkº¡®JÓìÿß¾ïÞŠ·ÝËî¥ýÿm§ýûƒý·¶ñ0D×á¯ß~Ù}êßu¿ùúøçöÓÿ Sü©ýéçâ¯k¿ýØ÷·ÿƒï»ºñûÿî>h£MÝþpúißø¯Ý_~WüÒ’P¿÷»ÿÿ£šZ;·ˆŽ·ã£úýëôQ4X»XÞ_Z›–Ϊ]Žÿþc÷SÛÛG_ªlŒ®|íMh?×Êv?Nê?˜ýÚ¸¢ ¾ð!ê>žå´®ôÒŽB+«t´§H/›šV.¤»*§uð.¨É¬í¨kªê}šµK'zèjéŠÙô:K¿§H/›Úa飮^VQPó¡ o‰^wŸ¾hgë=½þ´Wºý Ý·×vºUKA«¨µ)^,~¯”V(^Þ5eÕØPu(Ø·hØb`‹…-¨Å9Øò¶`ªÔb?£–jÕÞÜÓü5À+j mxÝ ¦>#-k·XÈS‡µ¤ëíùµEKc€UZ0€˜::Tðز½6]g‹ñ°…˜ã¨‚ 0@4ýöZ00ñl#À²ùP.±çº½6]g‹ƒúÃĨjÁF š~{-˜ø!0€\~ްÄn¯M×Ù‚5‰ÐxÁF š~{-xøNW‚Œ0`û}%ÈN#àZóðœu‚Œ0@4ýöZÞ ¨¬`ÀÍb¦:ÁüÌóÖÚt-ó”©ä„Û %àÕ!¬õö:sk-سb‚Ô rÂ÷0_Ó9 ¢`?`smºÎǼN°ÒÇQ`î c€ óW‡‚~fs=ãÜ‚³2˜ ƒ‘ BN耭=Î`.PfŠ# ɬŽÌ÷*'µ…·‹˜§‰ÆBŽ3!›kíöèØÑá^ª9¡ƒXûÛkIxÜóµÔ#rB±ö·×’8%ÊüÔ’WR©È ð©b¸‰ÝIœGÄ\ x"°%±?Šç³¹>3ÈJ2¯lòFªYáF®Û7Xã÷“¼“ŠÈÆ Êm)‚( pƒû +ÞKå ãåvÁ ¸ÁýF_Kååíâé4¶àÜ`~‚;¨ã¨‚7‡+ŸÞDɇÌó¢AK''Ü`pÚKÐnp?!¬Txr Ö'ÄQòùÌ«»B%µŸœp#[í§`ܸڪФ*”n°® ¬É†ÛÖ‹64œzÚ„²*­©µ©NÕâ|ÁWþ7-¦;<]¡:) ¥ÎHu^±/®-ø™NzÜPuOÆ{FD'zµ°>£ýô‰FkB/žy׫+]÷—“ˆ®'èó-¢O‡Â¦¨ûé<èMõ¹ñ*8Ñé²S2¤uÎ0\Ó„º+¥*èç(h9´œ Þ¯@¢àó¥qÑ7F;dî ÁŸ¡ÇPdÌódÔ£¨ ùr1‰„Æ'²>¥`b¬©.ûPS‹ ;é“ ¦ìÀ“¬sмZ½£z2ÑéH;…‘ô"y›¢O‰I`a˜ÎrŠúô®Ú$×<'4F;$-æ4^éÓŠˆï<^mÔ‘=!j1‰-‡º¥´ö»"µ6ú×(èrÏkÍhüZS׿¥ôÜ‘XŽÝàƒa—ÃãR ÇQø€8áå}˜‚Õø@,‰OVÂåúø >äˆÍAþàxEñQ‚ÄZÃcfòTáhøøA°Ä«ÕJOGuÓ¶–è"º‰bmš‘XùUñYÈû\Z»½nZH5~U©%¬uâÐU ¯NRðð.î-Áˆ5 û× k nÁGtK<… x,½w¤Á]À놥Š@uÂ_ÁV?ƒ_ÎH À@ Yù˜X~w5¶Ç:ƒ©–K38\š±ê¥ ‰ ·0ð3om¾k^¬òÇ×ô¬ê%"2È’Âã"ó„7¶.Õ; YãÚ|ù«> ¯(Ö2oÜB¸Z ‘•¡xŒuæŽÖú*ÑáŽøsƒ8¨•7Ibó‘â‰'ât|y¢h.äÑ&£—hS&|ÙžÑ \Øž‚¬ºéÆçMB«uågU2ùèxœj]}æ¼¢›{âÂ88ºÖy«jF)½Nß‘MŒÙ¡ÊŽX#‘·»Š?˜ØÝPRz²¼=‡·§@Kë.å:v6a”ÒD ¥ {<¸S©"&[ÝKFÞíðÞâ*JJ½(\Å[Cù\ë6Šx‰JÝn©Æ-ëž^ï]ÙƒyË&o$I¤œú#à(åt~y™m2Z£p¨aìï³Ï2ªÕ‡©©—šú4^n_SÏùÅ×9+çíñmS¤xœ'$b \ŵje*Î aÚ°ÝKÄW„ÓÔ9ãqënuÿx{¹”ü2o=ã‘­°þ°“”3[aë%9Ø[ËVXHu6¬ˆS2i/_òf"UD©’¼ÙíÉ›äÍ.á9uØŸÌ™7sî°w$y3É›¥ñrû¼…6‡o¶»=bŠd:9˜ˆL2FqÎ/º©àÆ¢8Œ‰[/qÅóºw4ŠgÄÁÇÈE¨¦éMR )08ljsâw#£G)‹‘\"‹Ì‘E}¸M#gdQ™ã\%²È‚yd¹¸Ë[Ây˜s×Pî®ÎÁTvÑþóæÌýxz§dŒSÄ›Ãê¸kžÓ›jŽÙáͽ)¹7|u|‘{ÃW¾7\¼j^ub>¸j*×}Ó8ûO©ê$ìsSjʵkÜId|Ù›û9·z½Q×Õ8·0¥)OøÁ”û9á3 Ú)â¥dIYø´Þò¹Á>1Á¯!½ŒRm¼¹¿‘ˆ’ •VX›kM¸Ã £/E7¯4N'ø‰:þL8H:/@Éša­'ÄHïÃÏPÖšp;‰ „LsVkT]wmÉö¶÷–°‡ØC†‘_"w³ª­–LæEô,l±/ôq®›g2dþd_X2Xɵ^ðö³Y˜DÚOÄ÷XázªU5‹tó óM0×½3}QX“À㬛ñaá}wn³ý*ÞÚîÛG÷Þûö=1^L¨ú ô%IjòÑÑ9Ö¾Ðí♢m´/ëýÚVR^½©÷¾ôõyaqeÇHôL(C­M»ƒáLK§~Ö–¦y飥¾ª*½zgýGK€ãÔð™>Óy0¥iaØœ>ó{ëLãéožàßv©>3Ã/è™ÞÍ9×¢Ñt J“yЍÅZñ„°Âx‚ã¹Ãb}Áëe>¯¢/u­|©ƒ®ÃYÅ9Gl[ü© [Ñ~/»ÿÍ»¼ý endstream endobj 3262 0 obj 3245 endobj 3266 0 obj [174 /XYZ 32.1599999 336.979999 0] endobj 3267 0 obj [174 /XYZ 33.1199999 335.059999 0] endobj 3268 0 obj << /Type /Annot /Subtype /Link /Rect [318.240000 466.579999 343.199999 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings >> endobj 3269 0 obj << /Type /Annot /Subtype /Link /Rect [234.719999 346.579999 284.639999 354.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 3265 0 obj << /Type /Page /Parent 2 0 R /Contents 3270 0 R /Resources 3272 0 R /Annots 3273 0 R /MediaBox [0 0 595 842] >> endobj 3272 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3273 0 obj [ 3268 0 R 3269 0 R ] endobj 3270 0 obj << /Length 3271 0 R /Filter /FlateDecode >> stream xœí]Iä8v¾Ç¯ˆs£-Œº–6àƒBàÃÀ£Æ3ÁÔÀå9øï[ I‘!RE>>2ÑîÌÔBRäÛןÿõ·ÿ:ÿõŸçŸ?þö?çoóÏ¿êªnëéŸóøïn/ȾRrúµë›JšñŸó·ï§ç§/§/ÃÿœD{yqþ1Ü\¦˜üç·œ~ž&?MW~ûøïÃoÿw–çþúÛùOÿ9üøó<ÞøÀ÷SoÚñ—¿O¿)d?üqûÛxó÷Óütþǰ„þ2îøÿ?H!jÙɤuü¸¾*.ÿÞ¾Š&6«U]¯ÏBÈaͰÿûß§¿ £]—Q-D×ê®uøÿ0¬1òlºö,‡o·u¾-l(‘8–° tY‘Hû4QëÎ?uëµ’Ó~™&uÖ‘’w^ Å2и"‘ôeóÆã‘ª¾•njÓÃß#>¼í.ÞtÉ[8”¼…TL‡:¬H$}Ùrp¤aÏçàï!óôã$]£BWëv²¡Z/g¸nÜA#wó:Tê@¦c”qE"íÓ–ÆCQ·¾GfÁ¬ëH©Öˆš³.+bÁ,<yߥ™àTÕ©Œý:Tò~µ\?®H¤}Ú²óÎP_X„>ù&ôýð¼øáëéç_Í(à~ý˰Œ‹”<ýøúý¤ÇéÉoàd_ÿ|þ—ATþåç¯;5ƒäÜ Ù\Äêù޾ÜÑ•V]3 ÜóÓë!.„\ž}{´AƒˆiøþzAvÖ…ˆàG…¼ÜéªÚXK“Ÿìùà£î‡?*?ÛÓÀ-‰ùàÖÞ½ž£ó®‚‹·G­#În †a¬áEŽž%áÞýP­ì]Û=XQç`-ðWõ—;m%E¿•0 œ½Š~{ñžc _¼‡Üàá?CüÀ€ ¡QþjïÉ´ÆÏ_ZŸ‰r+m“nç`à7:ÄÖsáð&8ÞSgÑá´ÕCà^Ê¥ ‚„$˜*`Tw¾ob‰¢®Úî2ÁõŽúp¹cªZ4íj“ð˜í³ñÉá žý„{²OÃÝi0™pèbŒ($t?<0à,‘B(#æÃÌÁòwט‘Úö¢·©màUŸ ¼A´¡5xGúÅÄaâ67)$^às8[KaD”  ‹³á@.ð»°é²Ë9“†Úwsr•.†kö8æ´#Ä8Â|î—Û<$¬9zäC)pk®DfÞ¸ª7µ%ÏDPHVÖó}BèQ=÷éžC" Œ €‘Tûù%‹Ðî ¢«FÁ~!Ö»dƒ`Bp7ʱE5Žšõ4— D¿;YjÉÌ´Ñ¢YûvÛj':)DÕèv¥¸¹ÀàlY8Œ5œè—“´Æb»€#ÃR ùž!§hNbMΨá¦'йÛ5B©?¿AFˆ3E¸4ÃÉß™j\÷÷åï¾®†ÿÎm7þè„è§«òܶÕe¹u½\ùvj›J#û^\ŸÒ«QôíÃóóßýøÚÙz»ëì9†+Ã;때O™Õ(f=Çï§?åRg©©×ˉi¼®™„""„£‘¾9­0$ÓJ)ÜW“#ìå¬VñÆìÁ}<1þ®wJ¸Ì³Нkpk/ò%ä–`]ÞaKÆ]§&ÄXMóH–roH 9Åš^[”šB \÷Q8¨Ä(á°Zrc!Hãÿ¦[óÓoð3<±æÍfâç+~yJ¯FÑ·s\ù¿i·ø¿ilþ?\qøÿø”YbÖsäçÿ¦–Ë1Lˆ"ôrBf‡$A;b­…È7F ŠáYùÆ;#‡¥e?ØÞG¡w ÏåäòFÚôøå¢ ‡.ŠSØÓÑ©{G€°I‡F4+éЈvK:~XÒápÅ‘ǧôj};Ç"šAšr¥C#”3‡r¤ÃËSf5ŠYÏQ@:”Ë1¨ ÎMÕµVŒPÒ±—Ž(ÍžØüŽ3üÓI¼Î5LÒ²IîÚ”6ç‚ÃøXxr‚_õå« Yk‚¯2¿xÚHm1„×åèÂãÑ2±Š¼ä÷þ‚]„Ðî¼,e9‰ÈÁ¤”WŸJÈüñ€I„.†)‚ešÅDã"&W ßçu é+1nN'ZdZ™¬&\¢Á…ǪÉê›'ÅdíbzDàn’¿ìäòkøSì­ö‘Q,ù‘Ir²‡ô@²-¬ÿø„ïa²ìªŸ yƒ¥ï“Oš±ãòØGÅ®LP!á èÜÝ•BåH ‘‰ÉÃp~æàAxoŠäôKî/–°äÄF°>Ö¼9$:e¤Eª1RX:KqjÎañÁxô›sL€sËy"Á—–©”Ë YHyæ GQÀž7`ô}ßVs9\]OÕ‡/P`âM åPIl§;‹Ä¾ä‚wb®È‰ÂbΣâ 4%†›¥´Î¬ò1à¯ÐªG(ÜŒ¬kÙ¬ÆT³«ðÎŒw4¼3 8[ó(8O ßùï|&ÌW->ÀÑðñóàUãwÜѾƒïxÖÖÃ;2~æû­ày~)ˆz±W©_ã¿ûÈP®àÊ™¨B4SÒ­wð<LJå8Lg  €ÿVíSE¼¿xG ½ô|7„X]Çc €ïàìá<˜ÊÏuL¢(Š„«Vpwð)HL!)»ƒçÁ¼ž¦OÊU{™€”;ø%A”˜–¿8‰:¼èàð¥xpž#éóPÕÙ _„vŠZ$ÐAåmÏhXzÇçˆ!Žv Þ$dÀŽðÞ8,°üƒyÖ°֎¥)Ì1¦bxÁú¦VplŸðètxwî~ ¥,Kï(æ øÁJ¤¶ ÷àÀr …ªbœ£œ6ÆS܉aJ¤ø|Â7•Iç›eVÚô÷˜µë¸`µ—{´{L9°DGÀ4 Ø(óðÒoF²—x4c ·†4…r ¥ü˜ÞQÎÇcí&¬M¨tOa^–¡Of©ÙÿD^‹§¡(/_K9É“b½<2Mã“"ýAàZ^Ëw{jÎpöêrcÐ(™›œ€ä‘yãA>ÃAœð–£¤mç®w\*s‡5 Œ1açÁ³ZRbºê€cZ@:T÷6ÕèÒG©ñ*?^o—1iŒ–ñƒÞ9ú‡¦”ÛŠèôé>š†ÿùhŘjB¡ã³Ìû×BÌÙP:g†pÓÊ(Yó]âå” W»XÂ=,iÉÿùAœ@ó"$‚QªZ™V×RÛ‡Q{ÈBŸ/¹û‘4ä¬zpŒM‹¥âW–Ì'®£OH‹PððúcxgÆ]Ù­€uâ†U<@`£ÆKË\–Uàb!GœUÞXªnx Cìš" <¸LD!bE·AÓ{ßã­š%ƒõåñ~o_FYy| „ˆJO4.%R˜LŠü¾pÊ <¾ðÇkHp¶ ŽúõdY³Ž¦qî†7LàÚð¾áU{οqã)ÆmR %b„ýQ2ÿBuzw=GÎó#å«áy(çøÊ´-–†á !Ä®R`G§yæÁ’YÁˆ|e–<|¾8÷êÖÝzÛ²wŽz¤Úyj…{CRÚ\¤X‡Ÿ×Q´0 †-%°(aRªeñ¶ Ó̳i®§ ƒÑ%'užýäoäùyQòn¦ñ¼›]rì´QNUx"ðÚº±R¥Ö›Ea-ùŠv6‘>âò ýÒE¶én/üýô[PZNŒ—` \yJÛR ¯NA'JZ†ÇSÝÕΕøRñgOUsm*8«\[–ÚiÛÉ-CÔDpäöV®å*Ä~´eš2£!ªéÕb™šÿÖUß×ç¶tBôÓÕöܶãƒã?Ë•o§¶©„0²ïÅõ)½EßÎ1Ùå)\DŠÑ{(Ò)¦5lïCo¦«L¸Ñék®Ç¬É·E8WfØl=Há¼d¬—Ô´!RV­¾`ƒ@7kx+Æd?û+¼cO8ãí°³Ì£*¥-ìv–°`—ûì¬,u•éíQì%èi£¤Cn·N¢‰ð™8´ÕüróŽû!ûRÉ>ÃÛÿÖž"^?>ßeç§Ÿ¤æî­ æ‘‚/,G³«Ãp^êq\3¤*„à%( Î%iêÑaÑ<Ú”š"ù‡¤\„„h¸±ÂQT"T)øÁÇ¯Š—“r«Î&ݹ€¬ ¤ s–<×Wͼ€š5ØA)Ã’·O1Øà‰ËPñ‡tN½b~“b~SäÉps°û5ÎGÅ=ȦvÔ‰}›4 m —%v, ¾IfÙ=¥ ð½RGéîÌüzn­ar®ÈR?3k}zêž!×2É­˜¹²xÁ6«}c!7”èΑ›üð¶ÓS¸U&¡í˜§YÞJc ¸žÀÓö4iÄ‚χЎ’·9’§Én°±DÂhÜž¶Ü¢ŒVªµ$©Á'~‡BX¡ÊöOf¥·×@NÝÀp‰¡¶3öŒF8ÇSüR'l ž–YZ»«Oåf5âZÁüyx2¡½8n`Š›õQøÞ‹SäTi±QM-®!ÅÅw(u)m”=PŽç!´@Å[=øŒá7ã¥4¢¥´.§´£'4ŸUö2P~í²ÉÇÃü&áS÷;$ÆQJ‹¤hõ,ŽIBŒ.%Qàî±–ÞœöJ)籃±žZxL0su7ŽÊŽïÞ·pbê99D',Ážœ¹hŠóçXµå=‚CÓ9lë¡-Ðsˆ¿ä†ÌVöÖW?o ߇È'Íã«‹¨ZdoR€ð’±H)/·×5g‘Œ)îŸ,dE¤’ã#‹! þä (T:)‹b‘Ò)ž¥“_ªÌž-»ó+Ìó,å9RvÃëò¸?EGcU¤éíÑK˜¸šº¿‚ïQÕ—³ œ³àÁöš×Ô<%4†÷$^ïɱºyƒsAUkRZ¬4Rt·-V†¿{·ÅJ#e½nr¹bµX™žÒ«Qôís‹•áïÖm±2\mì9†+V‹•é)³ŬçÈÞbeøN¹C C˜ 1Qº‡ —$ ŒXfnà 2-˜»Õª¦œÇ)Ÿ7ÀØíúõRWÃÏÑžöUŸ#¶/.­¥·àÉ ¥ÅM"›’ìx Y¼›„d×B±”­žÞ¾„©- {×ÛxÍ[V9‚þq4eN)ÅLræ© zGÓ°©• »(x–啾ŒfJiÖ†\=I©ÚµÂ¬º-…Y[™UÆU˜Ç§ôj};ÇUaV͖¬´3‡væñ)³Ŭç( 0k±îËG¡…®g©ãò>ľÛY{Ù C/„U )žÝ™‹÷•Í <«nwZ«ªv°‘°“œÃ{LØ—và/óPü7õ©ð³ïë¶Ý kl"êÖÄÞ¹é‚ö…“_ž¿œþFH(P endstream endobj 3271 0 obj 6124 endobj 3275 0 obj [175 /XYZ 33.1199999 364.819999 0] endobj 3276 0 obj [175 /XYZ 33.1199999 568.339999 0] endobj 3277 0 obj [175 /XYZ 32.1599999 570.259999 0] endobj 3278 0 obj [175 /XYZ 32.1599999 366.739999 0] endobj 3274 0 obj << /Type /Page /Parent 2 0 R /Contents 3279 0 R /Resources 3281 0 R /Annots 3282 0 R /MediaBox [0 0 595 842] >> endobj 3281 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3282 0 obj [ ] endobj 3279 0 obj << /Length 3280 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹( Ävw€6à ‡À“I0ˆéÌ!?ª–T]&õqy|¤TÝeîr«Äííoy÷§Ï?þó·ã»Ÿÿsü:ÿüðùМÓLŽç¿?\ÿBö'%§]ßžäpþsüúíðt|:|:|ÿ}:óüâüc|¸L1 øÛ×_ï¦ÉÓo>øËøéGyüóø¿_Ž?þmüñÓ<Þù ßý`Îþ=}RÈ~üÏõ§óÃþú»ã¯ãúçqÏÿþ0~Aê&oO—WÅóßëWÑdãa™VŸ…ã?íxÿýÇáçq´Ë2Nƒ¢3ºk¢GíäyX9˜ãЙ£jzgPgoqC‰ÜL£x:¯HämM4ºóE>zÓMÛl»ì똬“lj¬-G:õfþ?ÇÌÓ?ï»'gé• ¼}§ŸÏR6Cîi.Cå‚Å4½äïyE"ok €ñPŒ6²é¸!lTßM§Ùeæ2Tî@mË4ÐyE"ok3„=C‘ÞÈy›­ ÏÄ^†Ê¨ëzžÎ+y[[ŽÞê‹J#_Tš'Ï‹ï¿Þ= ­ú³÷åçq%Ïjàôã˸Ýv\Á¨Ú}üòÓñ÷M£ÿpüòËa8µƒêÚIoœž4=‘„ï(ôDøÎGøä!}Ÿ4\[GÓðø„2>k<ìà;r z¢á W­ §Ã ʹyÞ¡à(ÆDÊé¼~òðeäÅy€RÁõlŠü§ÀÒ å‰gÈ!=§CØÂ”y'äøò}úª=¸Gk>À'øˆ; Á²Âk Žâs#ñ'VUCEŽ2*=tŽ‚¡%Û:Ü¡ÅzM-™QZ£u0Ïú±Þ¬z´:ßšæ)!·iDúªñh êp·©ÇbT@Üø¸6‹÷ƒå>·]è}Zö9zÞÖÖÆ ^9¡ .B‘ òf­­» ¬ =Á”й"† æÿ‹!ŒñËlóÂý`:Ã:²ÇOg{(P¤0¯ ƒÏ[*¾£àN1ýhlcÂý`¼¦èO½† / ŠM875bÈa‡pølÏ“,p8šÇb…Ô¨ð 0çƒßB(´w°'Ò–»5m-mLeéŠOžâòà žã2–®/4áIUØ÷mkÚæm£·˜U/^£ ÏW•š‹Çû.žÏ¬ç`é¿c‹~Ï7Sµž(‚¼=äH·§;¾PXÏ©(Úþ2ë£Ü}„wŽrç(^Ž2v¢›gvbÔ¢ÀÍ ý©#Ûë㘜¤ú¤§U:ªTos‘îÔLX{ò¡÷ìííî†{„±ÃòtÖÚFÛ+:¿À€›HËœ¤èWAú2‹(Î4"™3˜ýîLýQkž€Ûž”ìÅwX>ƒCˆÓh{Ÿ÷ñއ2ðvB„àÙ¨g%λø«p³Œ¹:ØíBà]ÐY€ŽÞƤùr§÷lvõô1ÅÈŽAÏ8…³6®%€Ð6w€83ë?1˜AáZÙ s`Y:¬%‡À¸À}†ñsŒÞØŒÑÍÙ Sð >~'ž™Ë‡hð9ÆÇèJLŠ9L–Â.8êÐ% Z%‰­°Q¬âõ:Ïݶû°çk‰Å9w×½®äœƒ´ætUGL ¾ƒõ‚ÀMPç¨G6PZó1ypuEv²e…\³ÔÛ!ž§{$V©±J•À mýÁÑé)§æÙN5GE«‚QXK0ž±îb 'xW0‚š‚g ÇN+Î;„6f@Ð%PGî@H‘ ‹ç â™çØ!g ¼“ÅM€}ù…žñ{Å㘣“Ç[û¶†Ya¼¯D?ÔЧ £®YIv£Pܯ*\;ð]!ôG©WðÄ»îbÌù²<ç7³P3ž¯Ì!‡×/ öKÓ}ùÿ÷:€tÖ°€ÏÕð5K’yxGÇê¤&‚yò^ö|Ù]¶˜¹ÇпëNÔ¢‰f$ÍÉèg®1ái!ºå "FóÌOÐÝ^Ò{kdú–gZÃ2çŒñøÕtà^,ys¶èšÃÏY^¶TäZ*'F(Å͸£Ø]¸dŒK)¬õÌQ;kÈî.X²êfÍ¥‚mÜê0´ËøF(V+;,j)¤uÈy£9F>%ÒÒ9AÇ¡ìØ„Ž %øœr™‰7ÜäÖÖ7öû¹vµYJÒ‡ËÊ^Û&w+Ï>r k7<Ÿrâ9JŒ‚ø¥ðc/sÖL® ti{-Â#œ¼àÑíîaí8¬=è¦b‘ÉøZ.8˜Çív?„Už\$¨¢5Ó†f©öüvªð¿þO÷K¾µÕ¬ª>Èœº¯·Ùc©öQ`ï©%‰«ßá3 Ð LšÒ¸¢8¡Â-¥J<îZåéÓ°ãKû¨ý<èœú¿÷®H•¡e6¨lÆ£|{ú!±s(Ìïx9Çžõ¾]è<¦‘"¸f i÷,P¬·˜S” õ\)œ}ÏÚ‚Ò·{äöT-)êÑÔX91sב=èpf$•;nß} LÓ^z2²é<þ ^#„ú‘HÑ~7q9LHk©!XÇÆGÄo€• ¼²@Í2u5nL" ˆG²ÄvÖ¹#«—ÜH ñï÷Ð,÷ÐáKÌ‹ÔÙvR0„=Ó»9I»´ÌÈõÄùaæÎR‘’Ô…ã^9JÔ×´‰‰OUã)~R¢ªBAqÒëÖ'û‰SÃqÀN@®‘‘X#/£óJØ:n-'G[ï†nêï9úf›¬qZw9²4€D3À¹æ 99‡º¼b<-WÉ õº<¡hTzØzéòe4ŠEмÀç&K¦q¤>άd‰[L°å"ú³ä$*õ´B¥ õP(®ð;,a—M±&z8…ºjYpdI÷b©È´#UQù‚Ññ]¿±0!õz£˜Ø”¤mÖ¢!›™ƒ,•˜vwùEÊ6wV âííÊ sŽǽ|ḧ‰hl—¡ä§d½Å'×ç\ÂD8Ãq¢õ6UŒ‹Úª³ä O{ÕÇÒ+_Œâ6‚ßt:J%ºJ Q»áe~ïªÊ ƒ§)KŸ›´â_E5Œ¤ç… è•o¾ÊOI®o‹í×J´çHÈ¥”˜ÍÑÜ q̇y«-ì®*ƒë`µ*[¬¿¿U”ÃR—™«U”q^rzMÛ^i^4£¼P'Ó‰ïÔzüÄ^?._UB®Áh¥yÑœI°ÖJ÷‚½ªð œÅzz$9ý”H-°à–=í *„‘=#ŸÔ—Œ)hÏ•îΚÃdwÜö”â,´„2ÿwóV­R_‡ÚŸTFq‰ˆvýxá=7WKTw#¬(Gü„3¦&*pàONéšÄrO¸`3uÜÍÈæ÷·P(‘ÕÑï¡Òp´)ïM/¡hyar-\E¸²Y‘c—zJií“sÒ”ré¨lÓZéeYQ„4GjÙßÀD˜»§Q˜T¨{ÉàP),iåÑŒ±ÀçåañŽ}R‘îð­D0:y-ßP+d»ªÆšu-\#ÀE%f€Dæ9Tåjáëîýƒ¥½AFRÔÒ˜|E9$Âh6CÑâm!$(Šä,®=â¡E5,:ß±ø¶"úwlä;HPY÷ì¤au‰ÔŽÛ/Ûwë÷®‹…ƒ‰…+ûò"_Báæ4|½ï€ßNh[¼Ê¸šÂ…jzuãÊt/m½ P Vc>\Ú€Ãk À.(q;vS ðqOÁŽîx»K]*ìó§ÄÜ8X\Ö˜Š(S½äb„Eo6sÒCøŠ6!Ư’۽̥?æ2ÄhR½HàãH§äÍžÜW„½G9Q²³èÖ”eZ{·lóákß{8£0•Íá7Ú"ű,dJGÓ~;™·]°NzdŠŸ0¤}ÅÓ¤ë÷øj@m¶–:®Ä¥£WNÍք̇„Úi¡{9ήn¿ÏU-EÄIŽÚXû’²±óÆ´/©…½ƒ›Ö¾¬¹ ƒ–Òd5·‘Q7’¥h))¦)Y• – 7®”TNßÙ¦î[;u~¾æ4°F¶§ì¬ß]^i[GáT) ܯKÈ´›´M NÉIf­¯V»?ÍVñqÕ³%YsñÊFìíMÆc÷­eÛtry¿Ù6Ìë’qÉ’9kžH!¬í§ DNÞx|ˆ)Ìró6f[Wó„8†ëÙÆïsÇ¥Ž6©Ÿp ˜ærCIî/[¨v­û{)é<[,´­’ÎÑYøÌÛršÔÕ>˰/ˆµAÚvœ–Z6ݾV‹BµW®Ô8„5x8E‹`IèÌH‚OÑM(‡”Ð`¸ŽòW=ÚÝqÌcÄ%¨ÌœÊEA™dZaëX”N³ Š{‚uƒO,Üß}¹Û쌥Qe]ÝB†DŽ»’ý³•Ð÷|ÕÙŽSµ0l=ÆW¿,­2³:7 ÕWJU×ÌÊ1ÆÚvZ$Åæ9žXý £[n7À¼T©­Ÿùvâ­ï¹nU>¦ùž{°kZ¸çøhû ÑiMeÈÊ‘»ç+Üó¼X~ÏW E>ß󼫾ç+Üóf Ö‰ÚÙs·™ãP&*'‡¤fVB×¶9+ݱïDÂy$¶gz9¥ª ¥® æP ž¦-O^AǨe§7¸¦ áI þ¶é›K»­ ÁÖ¼ô޳œÞ¸y¨3KÙ2B­àŒZé9ÙD÷Š’>dx•¾UÓZ4}kõ“•Vöö•Ïr*_|–”Òµû’â0¨r}• †ÞoøpøÅì^CôŒ#ñO|0tV/i,PÂb?=8²piøœNG”`sÞhÞðÉ­Ry<™)±î ´„u\‚(Ú2մ%Q¸vñF9„; ð¥»ÉìÿÕ/ˆ8þ=>7"Ôy]ó¯ß<(èân󂻟¼Øë}5ˆö½9ŠñôVs¬…9=cÄQ5—†¬Œ9™õHôAŸ€ò#»S·ßÚ­<™¸„R'9¬Êâ¶=™ +l^º6Oßà;Õuò$u~ôòä=m›ëß|„ßQje‡èëÖž´™¤½3C,eïóÚž ëΟek»øuçΧÓñ¿3Ëž$ ˆ> endobj 3293 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 633.620000 197.279999 641.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 >> endobj 3294 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 624.980000 210.719999 632.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 >> endobj 3295 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 616.340000 181.919999 624.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 >> endobj 3296 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 607.700000 203.039999 615.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept >> endobj 3297 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 599.060000 218.399999 606.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 >> endobj 3298 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 590.419999 204 598.099999 ] /Border [0 0 0] /Dest /sq#b7#8b#aaX#cei#7fM#b1#1a#a1F#0d#2b#c2#fe#e9m >> endobj 3299 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 581.779999 210.719999 589.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 >> endobj 3300 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 573.139999 176.159999 580.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 3301 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 564.500000 177.120000 572.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 3302 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 555.860000 156 563.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes >> endobj 3303 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 547.220000 142.560000 554.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 3304 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 538.580000 156 546.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 3305 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 529.940000 199.199999 537.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args >> endobj 3306 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 521.300000 154.079999 528.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example >> endobj 3307 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 184.340000 535.200000 201.620000 ] /Border [0 0 0] /Dest /sq#b7#8b#aaX#cei#7fM#b1#1a#a1F#0d#2b#c2#fe#e9m >> endobj 3283 0 obj << /Type /Page /Parent 2 0 R /Contents 3308 0 R /Resources 3310 0 R /Annots 3311 0 R /MediaBox [0 0 595 842] >> endobj 3310 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3311 0 obj [ 3292 0 R 3293 0 R 3294 0 R 3295 0 R 3296 0 R 3297 0 R 3298 0 R 3299 0 R 3300 0 R 3301 0 R 3302 0 R 3303 0 R 3304 0 R 3305 0 R 3306 0 R 3307 0 R ] endobj 3308 0 obj << /Length 3309 0 R /Filter /FlateDecode >> stream xœí=ÉŠ$9–÷ø ?7”—V“MCÅ60‡$æÐÌaÈ^Š¢²éì>Ìï-²MÒ3“ž$3wÏÈ‚Š™™–§·émúù?>ÿïåïÿ¾üüòùŸ—¯öçËç'r% þ]ºÿ~Z60}åløUiye¦ûwùúíéûåûÓ§§Oíÿ¿?ѦÿÐþhŽC þûë?ž~Z>¿üWûÛÿ]Øå?Û¿~»üùÚ±ýu/|{Ò¦é~ù}ø…2ÊtûÇò·îá¯Oÿý‡Ë?Ú)è¾ßîÿ?1Ê…lßÉ™Ç÷éSÚÿ·ü¬VÓ蔲vž²ýí_}ú[ÛÛ4«nì?ð÷˜‘t?’ÖíHD´“÷†‘„¶PSZ€¿Gc̱ÃÐÊØc†iWSb´ýæÓ>$N`¦¶¤vŸR|"Û‚‘"Ê´=ú0Šî¥ tT d†³P°óÐßšf¥;þôù&Aϵ*z§£Ó@Ï[^¸œ•¾YÐgc}hO€»pœ¶`7ãŒnæ¸kŒ˜¿þø×±ð/¨Ç(I¨`A©j„"ÑJ˜b}Ÿ¾Õjb†à·Üé*·#%U™ŽºѼ¥µàVÛ]¡A¯É/FLîBÇ®r!¦I«Š}7#š·´ôpWXÐkJd¿ÌÑ26ö” yÚÐBµ3¢Y+³€‡{BóZ‚ø'¾ÄeŽ]eÃKqR¦£nF4oi#ä½®"¤§7ˆpgóÁ}KExþòôó»éŒ_þÖN£{üÓðãË·'Ñ ßž©[¨}ùËå„Pñ§Ë—ßúÙ Dö â*¸’ÖVb_ÕoPWb†wç'ë͕Qí_µØÆ›ˆ§J¥@ÖW¼‰ÀúC|ã!±Îø©ÁëÛ@$|ðì½)ÚOŒê“_É-gVJÓ«V>/MC` °<¤÷J é»Û™ËL`ôÄ`‡ßýÞy¬¦”ÎO ‡=—ûn%pÛ6`“€&ººÚiµÎfEBÅ`)±òL8¢àžÍcˆw”cNœûRPØà‡€bŒñ:ˆÏr2ÌÙûÊP]ŸÊÓ\‡=—0Ý¢a$Ç_™à©]ºO¸Œ„Ê0Æ%õ÷Iw#¡úICܹ]×]ZÊ ¸Ò¼Î •"€Õé‡Í oU"Îà|ôÁáÃO_VvÆ;|íÓ#íÆ™œâv¤ÀìîXáà¸Ý#ßîñô€ÓšÒ%gŠšV7bÎÑ)?¹•À(/Ôc¨ÁˆGÏ®öP6ÇšYªq¹^N@B(üê¾ÚP∘F˜a:ư²x¢¬sâÝcˆd•ýø ”É7>3·ŒýãŽÔ÷£|E¨‡ÚøÓɆì¸9§IÕl«šþC&artVN·0p ùk<³ÝIódÆ'ûÙ0š%Ø[Ñûž¤")ëœ騣"Eä4¢µ¿-’’_Ýâ-zXãW:,n~Õ~¬®Ê¬ÍyrL%§«$t mruÅĘÖã¥h³Æ{׿"lVïreˆ32óÎîߟå˜ëìCÁ¥•ÔøöÏ÷ÓÞØ¨ÿ‘q"1ub¨_àUñ®%úÚMóÛô·¹jM.Šv?¥}}²®ÀšêʦõÿÆ–¯O¹Rj˜Ötlkô²—ñ¯aŒö}û·ê>»8_“Æ£mùúä̤{‹/{Y¯ãëÓ¯OÏXÁ„z0¡qÔLS¢jzr¦tJlC|<•Ëc˜Äï”3IIÛBQÙ‹ ®A$]lx6–Oè|3‰ \‹#=ŠKpLÈeCW¹°rv­±Sغ&|T?0bûæðv wÅjHh@¦Im­Ü:˜TÏð¨à–[ ­í–fyÚØòµýˆZÎ7¿EÖÝå0ݶAö<Ïí@xÈþ£õdº·äº¹æ×eõ̃X'•Í€| ž5ÁÞ·¹gÂù¸s ¨¯“º¤èvºxB!Ö°Ï:\ìQ‘üAòeC4ÂáB†øƒP.á¶-èß"ënÈr˜™?´Ýøƒ`Þ0Ìçý[rÝ\s*cq¯Ýêf¸Ý1º.Òqw5‚A%ØÄÐkÀ#d"בdä:öDd¢¹NîÓð×i¤ËÚëôo‘u7d9ÌÌuâ:Ý•%Î0Äç:ý[rÝ\s*×iÔCh%  åcj(¡.3Ÿ<¶ÒO°žŽtÙM°š8«iˆ`5w)©mñ¶‹¬»!Ëaf‚U&D°J»Ã´-ÁöoÉu7r=Ì©«å‡šP‚ýÜ+;ž`õxlçdÕPÏöÒ ´FË”øDA»Úñ3±<Òp ‰F„@¾Ë#vx¤1Éu˜W×âòÈá-²î†,‡™y¤Q!i—GšÆç‘ý[rÝ\s&dd*¦ôêï•SJj7 1JðäQy,vFÑ÷ѳîO¤E‹F&Ó²Y5Äò;FÓ2£!Ó2£®i¹kñøLËs7d9ÌÄï ™–uMË]‹Ë亹æT~Ǧ\w01%!º{ƒ´by7¦"÷ØxþgD-*º–ÚÖ~õæ¼`ÌÖ3·ÆØN] ¢ð.ûäŽåñåq×òÞµxì“O–÷¹²ffŸ/ ²óP vü ”¾„ó[FÖuYƒœÏ.a•Ëã"UÓ74 xlÀÕÛ‚C°#6<ŒÉɧ@ô²!Ÿï(²æ;™»|§}èðÅ}¾Ó¶YÎb{ÿ"k¾3|æòö¡3F£}¾Ó½Å—½¬×q2ßQ£=W(PyÀ$VÁÉQ É·%Î7eË5V)²³ Œ1ï¼MI‹ ej´1¹j¨xÌ—.Ö§TÀ€¤hª t;iıT: 甄@¾{,ÕŽƒé Ãx^ ðb˜É‹1wC–ÃÌÇRòb0íz1ºïXª'/ÆÜ\sê±ÔLáÌwÅ‚‹ÔWƒŸ Œj¾é,á~®|Wáxä2Sd¼µý˜4Ó9'Žéœ“éœ×tÞµ¸D6¼EÖÝå0‘q2sâšÎ»—Ȇ·äº¹æL"ã”>‘m5A¤zû†ªD\çt2Õs³lˆÆuæØ99 Ù99síœ]‹‡ël²sÎÝå03®³³»óׯ·soÉu7r=Ì©¸ÎF;'.‡q*”õ€`¢tïJN%%N&±±jˆ&%á„Ír ›å ›íZ¾Ý*y56BãïŠÙPY‚† „Æå¸¡‹Äœ§øÝ‹”¸¸GãÂäÌ¥ý{0[<’9ù.ª“Ä2ŸËŒŠéÜwêÀ¦›ºeÊ7®GØO¬•Š[[Èpƈ·´q5ÈŒ†Œ%{~8m<ô\/fŠØ¶?øÉ¬^ÀÝúåÆ!2Ç@ó„Ô`%_Îßêi2òRg@ÑZ™©R9û ï¸ßð®nôFPù"…ç>¹¹È³)¼RÛl<qþ†cðòHÞešƒyQ%ŸlŒâ2û(<7„f²7Xÿ8c«ìÜ!¸¬¨ÌÀË#¥â¢ø¨;6y¥GQ ßþ›r‚8æÈô v˜"®ìÓ9E‹Á¥Xö³‡Ò JFlg¡:‚Q¢òÛÆL⳿Q%+v- ~õKâ—a4«qqoÞp‡ƒ?ˆÍ¼ªÊ7Ð%PÜ.=iÀÒâÀukGÝd_Ѐ¥Õ‡ËÃßc oîÅ€eè‡+fÖ¬cy—áG°Aðù¢ûHá'àÜ6ôÎàÞ0RæÅš©¶ìþ t0x`X#LÍñ8 Ì;ašwƒU…! ëŠ t 7Xê!vÂ3€÷æˆõ Lêà70ÀrŠ F2Çzs|X‚¹¬ Á< ÆeX‚¹x28t•ÈØ“Cõòé긣\ šÌQÜàâ9Å7ìÍ$¢¢Zkñ15§Rv Qè¸HðnÄ•­ˆË\æŽðM•)°\§JóQE‹ºžNÏ'I©OW§–õñ%zE£]™Q§Ä`‰°ØJ ÷h|’Ðn~Ɖ7”(R·Q}·4dÙÌ­œê©GUX¹™úŒ„¢eºdPöÉc®Œ©«ÊkÊ&ùcøG ¡Ñ]´æê‚JkáŽYD«Úç75KR¢ò1¥Ev#Åú­;ú;£™³©bغ.ÇÞ©XpÏ¡fûÉuè1Þ¯HIÁâÔRï*ËÑjÐ4»äó!ÏªË³Ø 9ûk-ÛMSÓušÍ²áŒ‹»)8˜” *yAfûªoBX3lNdN6z‘2ôˆSuBäYá›”vÁ‡J¦L8êÖ4Ö¼ÿ@k‡&Q_~¬÷m¤%޽·\Jz¿жïWRE@¯H4.¦˜á>í Øò»¶”¨ €Éa(&‹)W™>\Ô»à›½ÞË^¬•ÐVÔ<ƒs/LàEÃOJTgô©SÀ?AÕƒi¿¬W)çÖ(Ì6Á˜îÚY…Yç¾IÎvÛçz`¨ Ç‰Ó3ÑRêý`Ž%˜KꋸSKz²1AS JYñøá¾N„©Ûwb4Æ•C6˜ƒc%ßBBYBrâ&o Lrüê)ªÆt{7;TŽÉ)Å]ÒWâém¸p#AÑÛL0B¤ˆyè€¬Ö ·§l„ø$Éš7=4®švÀíÞŽž’I½UæYÓxœƒÓRà}ýÀÓDœQ¦ ã鉶÷ý¤òcâq?Š¢n8._S>¦éþp NĨžÚb‰;éÉF ‚gcj{m¤SÂß J&`R1…6ð N WÊa™ŠÀÑ4:xpO1ÐÁ¤n$La’áq¬j^9b÷Ö²I [/-¤y<‡Åk ²l¼W×—ÑVx.!…d´ÍÌ ™?$Ø=üM>¿çÆ$cÆ%…ød.?{^ ¦Îz‘à³¢‘òá,0ý&œŠ:½çŸ<B´1Õ:ŠÕ,m DðÁÏÝY†í“¿ ÿæÉ¼BOȸ4%ÝoÀÞPßè6ÌŠñDâ"xh=öžxrõnƒŸŒèÄ܃5Q‡žÀã¼§¯ÔÚ›õUX&2#çØÛ ô ÜÛxï{`ÖÔr1ÞT f-/aŒ% ˜mbÆæ§ûvÏæBÛe„ŠDÚ\ 'S–µm5×&ÌrŒ¸z@‘©« `S'Ås~e&xݱ”×fØW †ÆÑà7üfPZ»2Â×5'ŸÁÞÌ]¶¼‚ïZ•2°Âwè+«CO(´KiߨKY»[OX×ýΤ{mPþx"ào,HÃãmPq¨7xo_AŒ¿çïíö‚½Y>ô ¦·çô¹m@Þ˜Â0ã`v¤#˜’ C„ÁÁ|!´ÒElfÇК4Wڙ⃬#‰Øéâ¶¢O%%øåÓÓÿocö“ endstream endobj 3309 0 obj 6213 endobj 3313 0 obj [177 /XYZ 40.7999999 329.299999 0] endobj 3314 0 obj [177 /XYZ 40.7999999 329.299999 0] endobj 3312 0 obj << /Type /Page /Parent 2 0 R /Contents 3315 0 R /Resources 3317 0 R /Annots 3318 0 R /MediaBox [0 0 595 842] >> endobj 3317 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3318 0 obj [ ] endobj 3315 0 obj << /Length 3316 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€µâ[;¯9ì99k;á5<öÁ?êÕ=+öG‰EŠ#õjØ™6‹d½YU$?üíÓªÿþQ}¸ÿô[õÙý¼ÿthêF7ýWuüþîíx[ ÞÿjZUs{üª>9¼V¯‡çÃs÷ïëéSG÷£k†èþñù×Ç~ðCÿ—O÷ÿè~û³âÕß»ÿý\ýëßݼã¾Z«¿üÒÿÂ8ãm÷Ÿ·¿ÿwøç_ª_»)´'¸Ç¿ãLj­tÒ<^Ï]ÙéûmW4X‡,Ý Á+Æx7OÕ¡ã÷?uÐÎÓ¨­dÌhišÙP ?媲FW²ñzk›Š¥2¢Éè8#–¶4ÖHEF½iy¿LÛ$cl• È–‰†ÝŒXÚÒÔcPTÔÛ†çBýT* Îò þ4£<¨€"£^¨¶W8F¥.t•Œ±Nºó:Έ¥-m@½ê9‹1âcôèx÷røðĤh¶÷å§n&'Þÿxé–«ºtZQv­?Tí¬¸ú¾zùù`ke…Q½Åï[¸A-L¢¡5¶<Áqtü Ø‚ûàq8ìÃáz0´FÀ[ 3À³†Ð<¾tüº8÷µrµ%`ä‘Ð⊄EÌËŒ0ëûœ‹¡ZîsÃгÆ|€[0F?ÆÏ@BÉ«$”g õ „¼#l9 ”Ø´bhŒ°žÊY!Êq«¶g›ô„઼H˜A^Ÿ뀢öÙØI_µd|;žæ±’œdÛaÔ‡r£*1ÄäÞß¿ Ø#B´ŽäÙìþeÀޝÝëRJíºxëºx»ne†XqQ]lŤæxÿení‰#“Í®¥oQKkÆSöƘZ‹xÝÛܳ®Ø8î+ÃI‚%p‰ûš‡„_B4g£žÍ6ã/}­’xcž.¸nYùf¤›C?‰Ch’ÐR”çÛü± †”ÍiH£Ï‰¶ØF+ÍÕ[Âõ-혒òB¦fü‰Ÿºæ¬½Ê9¦n\ ºò"YËþ“ž›ÞΚc&¼Ç€ªoÙW¸ñWîMMÀaàú\еÞxpÁ.Ü,o}>#á °~WÇøÐti±£™¸ ß5>}š’Œ5Ù‡[ÜÀ˪1!ÆJeÏ7[Ø5/ig¬óD6VÄcšñ˜XM·€’ë$æÃ} ‚XÅ|[ï©X¸ï#²[ø£ÞL¼¾Øü`L{F² ¬§Çst±š€v•‘mÝÚfÊ ‹@œ¢“ÿvwd1ˆ|*Ë9Þ-S_O=Jñâ- lCI…ø„Mœø „7‰lÎ×4n…œœÏû1~14…¡åMŸ ̶J$Pë ÝàƒK8ý†h|¨j¥R­IIü,È\¯¾³ÅSûuÕT Ó’Pž(öÂë¡ô!à ˜ps.a¥$ÌàJ1åÖQÂjÙ2忬õ*J“,OI‹•,g²²tÇvD« B'sD Bó“7Ë$~¢ `ŽŒ£ ˤ=f$q¼¤ƒ‡òâ^Yxa’®Î\1V+©™˜ËGq0 ãjáhèj²HßûŒãÚçs¡…¥ z*غ¤’×c-9Ñ—ì5@rDîu]ŽÕ¾²£dKÇ@š+";䉠ó–pYã>#&?-yó‘à½Z¼–æ ˆ` ÿ>w®nÎ æls>Â!‘ï[‹¬"e“{_óQ†¼…±w¶±)öý Ý¤›r„£$±¤ƒGå!¿ør š”ÁbÒ!…R™ËRa2Ü¢mUmµÁ²´ãy­5%ÿµ/æòRÚa%v/éàIÁ»eÅIX.ϱ—p™5®Ã ±J—p^bFL† b¢@)«½¶O áÄ)<$G 19ŠàsÅƬ•Ü~qyB¥zJA|DΤT ¯@žë±%x/…1]F.†Ø—Ðn‘„m`<¼>/NN‘#k)b:Â÷Ôl €>bY) °•IQÞàs&"xõ2©^–r¾Ô•–”² Ò™Š(åLqÅ$ܱ†˜>JX NÖOJꂆ§5íZ øïµlºî Æ¡JØ‹L{vJÃØŒëôYÍî#¾ÌaÙ Še#$´-ÈLØ1ƒxRIÑñ´õü‰iû^´²cAìs9æ,¬]zqíl±aÙâàÌØ«Kë÷~¢9y.noú¯ËdPK3l@Œ÷Ð}ð8õqáÒŽùµa_±Ëå^kÚ½³Òñç¥å µ¸¤kê~÷é¹Xº'Ûñ¶E8»Â½Êå;ˆëÀƒsãñã°GØ¢ÑzðJã<ÅSÛ?1Q›}3€ôÁxÃ3À8 Ðã@j4kg˜ª{geºwÕ®á Û=`ŽfFr6íX—*è͹s]¦&žrÍOÀ/ÞIx–7G±¼Oo")qí”ðÉà çc›iIX^ÒeiYùw3[ÉäX n…¥ª¸8¿#‚KQðup·'_ÐÆ(662±rÌ‘¾b¡¤Ý`ïTÓtÄml¯íŽ(´ˆÀeŽˆBD 4°©`Q1QŒ9¯kóùôZøü)1?Ô9ØOˆŸÎ79¤¹.|—|¬+)IŠ0dIð-J²8ß ‹ÉÞEìk"ò„}T€&¾úüÈ}ÉÃIâ|)Ëþ~ùÊ œ§^/)Â/r¡‹5ö™ /6P^(¦\DáËÀ+b„2þÀEQ„#LyߣÎ{<0pl¯4@9<–tŠæ‚—ë¨M¹ˆSkb¬ñ)ïT`NÄ\…sY¯œ¤¼ 6lQ8Ž@8ˆCâ*Ê[ˆ„÷UIº— Û¤ß(WbÊ©‚ù|%Ã&Бbs0æ)V/ köˆáœ¤Í"ëÆ —ßeµö«öëóúO¥pMñ…VqÍ€lõ$æÖ°³Ø¹/¤—Wð¾_AîS|¸xd·¬\2Özí¾¢’ç+Vv_q÷S8IóXQ‚÷@ºlj÷poÎÇØ=\'›-Û´lî~y9™Ùýò^f4;_‚ã—¿$kl•ä—c:B® <=°æk½vy^ƒ<ç½(mÍÞûΣ›õÓ²^â†ùz³¡Y-¦óMÛ´”(EC.r X=JvÆ^(¼üþ••ò0v}{~Eß."set´2¹·¦£ßÿI¿5ëhJ}¥’g÷–ËiâU{Ë„*Ê kU3TÜšVÍ; yBB,j_µ¶L}ƒt¼9MJÙßeÍE“<×UÔuÎêÞš†Ã: Û0J3žå&.ŠçJx¨¢Øµÿ%yÙ°åå›{[:H9÷yºø±¼ /ÛæFy™êù~\шÏGQ,<Þåô2ÉÃÍ«—ßx¸ÝwõÚ1mÇǸŸ¿¸ØgÿæÂþÏAv¾ÒOW¬[ÆÁ–麿M4g—Ú]€¦k}ýù +ë3žCËMmÆç¶{tš+-½B¢ævt7‰»4MÕº?f~i1pœö±°OÏR†×¼9Ýt6fÐkÐz}û—øYwÌ•>¡>îj¤k- ­Ã]×ÇQ,fíìÍõ¥ \wü+f¾8iüñd<à>εŒãÈñ®Œô4LÛÈñ°ž¦m€{!4§^¯õ¡@»‹Ÿ[;˜>XÂ(ãP¨åKrfì@Ö ×VúÆýKÐmÛ蚯M¹ª:¢„Ýù†ÎŠg´àÕóáÿ[0‹´ endstream endobj 3316 0 obj 2948 endobj 3320 0 obj [178 /XYZ 40.7999999 204.500000 0] endobj 3321 0 obj [178 /XYZ 40.7999999 464.659999 0] endobj 3322 0 obj [178 /XYZ 40.7999999 464.659999 0] endobj 3323 0 obj [178 /XYZ 40.7999999 204.500000 0] endobj 3319 0 obj << /Type /Page /Parent 2 0 R /Contents 3324 0 R /Resources 3326 0 R /Annots 3327 0 R /MediaBox [0 0 595 842] >> endobj 3326 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3327 0 obj [ ] endobj 3324 0 obj << /Length 3325 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5|‰”€ Àöcä 1 ääÌf,2‹tö¿Ù’lé"‹-Ùš¦{L“,ëÍ*òÓ¿ü}ÿÏßöŸž¿ügÿuøùüeÇ*¦YÿgøûÃ墩¤è5M]‰öðgÿõÛîcÿ±{Û½uÿ~ì¸>v~tãý€¿}ýu÷©Ÿ|×òåùÏÝoÿÛ‹ýŸºÿý²ÿëߺ? ã¾ðm×´úðË¿û_¸à¢éþsùÛ¡ñ_»¿ünÿkBs÷ðï‚×iT§®üø÷²+š¬C–nÕì9œu‡Žÿþc÷s7Ú ŒªUœ­ Õˆã°Ø·Fï¹áΠÎÚ‡JÈ0Vg¨‡ˆ§-3eüCQogò¸L©“16•<Ò™:@ÄÓ–Ö£Þ7õuË{Ô3•ºÐq¨dŒ5­Ê3Ð"ž¶´õx(2ê[U—ÙÖ©ëGJEXG_mÌ âI+G¢â aúEJ™Š¯ÓP©É:âñ´¥ ˜w‡zËbˆ³ðáéøô¾ûô¹=<ï?w`­¦þÇû·:Lß©"-öï?íϘ|þÃþý—çU­tcêã÷Ž-L[šÓâGôU%-êÜ÷Ùú÷euÿÕJÉîãÞÎZjÆÍ3ˆóU4.Ž˜Šµ}güUöÒ¯‚UÚðïWáŒÚÚó¾?¨;“µá¢fDsÜÏy«q³[ŸmÙZ™„a„Oo– ˆ™ H…“‚ÐáÛi¸%‚ù"hß%,{Yª§´×÷Nf¥I ®d„©B¨åõ÷xh«ÚÁûj°Ej8ÚgÔÂaŸg×FkaŸ†[$m•ذEÂ<š|*H—RMÂC¢ ¸'žuCª˜Äo\Õ2W$ü>ÇSé ×£øÄ3äa7ÔpÈÝî=ƒ£y¨¢-HF¤ì=AB1¼'ºàº;_·07@Êf<ž²±>apO°„Rx4(#±~Ä}ðÞ{ú`YŒ) sݨ¥~!P9a°N-Ç÷æàŒ³¾äšÕëÉvS6£Rƒµ[5-Óß[ä2ö§V¼ãGM»^Ø[ ðt Ëåq>ñ‚±3„a w bÜnw¶'n^£œ[~„+~‚ž”31„Q:žÆ=ư#ÀˆÅ$ìŤíø½¹ã€{|X<*$ǤH&rBŒ)‚”·ƒm©,"Â`—zäWh9–ó,;xêSÄZ ”¨‚Àv\7ö|p¼Pp¥x4ìÅà•zì)ìGaëÇ\ ]=¬´ %5MÙÙl°ix“ð,z¿óz ˆcu{"S¼Q® ‚ý …`¤ž†'o‹À‹W‚4Ÿƒ~Ë`^· X”Ø‹&HŒyOœõ'¢!€-XÚ0‚†åx=8ú@‰Á>Ë>è(¶iJË Êž`ÌCJ’,žb=VÜíiãúæTŽñ¶Œˆdf“ËçÝÚ"Ö ˆX/CþK¡8ãqäÿÝñ ¦>ì¿üµcV>[¼RuÏÜ›â„x† †sQ$!úÇà.Pl&ÌM‹×:%sèqtFf*Ç1,,ÿ ¹X˜ÊoÏ‹—òMJžEÊ㦜°x4Žða*_xœT±¤ü­‡‘c[‘8ÏBà¡>B^ÅÂ}œš¥ËK%RÎnJžü)•Ö‰œ/Õž?ë—(™C®Âµ>vZÃÉ94ºþ>G)¦X©§W]‰cu‘o><.üqò(¹;xxOn‹ƒ¸¤¬³œÉQyvgrÞˆ¤Áñ[nÑ¦Ž„r¬€GLô„ (·† o0šPš·à¤37+‚© ù~”|Ûè9õŒ‘–¢ñP^sà–'{wÃõË4Ûx4„H¼Ð‰ˆ”n‘çé,’—» gš×ðubà) ’_Ÿ«úoˆª—l‰¢ÓÝòap#åá1\ì9ƒAŠÆYºIz<œORPrûDð:¢hëhڛׇj…² =ínF…x(ó´àœ®ÌÇ;‡¯À²(«q1“/)’g Þu”Ô^Û!¡TŸk—OÆ,ÿ‚Z؈þAG\ô£á>çØ”Ó§E}…ÍÕhçØ›ym=½®ã¬ê-£‹–WØ2Šma›S\Â<Ïçø•±).«þ*Ç~ïæéé9¤Ï3D¡›J kù ¡~F}ðhB@ìð-dt®Ï1½ˆÝΟ›ˆ?Õf Î ÁÏ+FêLš4g%¾ÍFŽØgÜÚÜr¯Ås9Brƒb<ü´E]*æh›Üøu„×ÈyœDèi’Œ‡›'}{Oårø*Rør‹T–`rÉb@-¦K¦çlÍZ¥¤Üc‰’ÖÅÞ·¥óM†#×\I·OD¼}YÇÍ‹7–žnhØ<áÞÒt@Ë[‰ÊùV:z±[÷Vn±•(Ñ9Cn%ª!rìîxf+Q*«ê­Höê­DiÅ%JÆle­A>ÃV¢ô`%J¦Ý Q/úà Ð-K—Š ß 7C8u+xZëyÏÒ¥o#3ˆ–´ÙgH8iŨšbÊŒ"².ï#U#¢DÂÎÍuA¤ä®0+:&ÿ})Ÿ)hô̱åyŠ'Æ-Y–‘7 —™ÀÜ›yF Td1§0ï4Ë÷ÒÜ•:‘R+ØÌ^ª 1áòÿ:ð¤1EHªð +Oö¡P1Bð–L›jÍxÈ@¹eÜãÈbãŸbÈßþˆ÷湓®tTØ¢¤ñß¶f4vwÇH >z]--sÆõ hy;ÄIJ½õù‹¿83îó"¬ÿs^Z¡â/ÁaXª4  · åÎJ•<8à¶Bpoâz0~L%Á ]×¨Ê \{0Šw»“µ—ɉ÷ ãâÑê¬û[¨€ŽóÓk1ây\€ÍòÓh„S‡=5Ïh_¡àqÝÂËõó>0èߨ@S]ì½b ‡‡²¨(¯•å¹é"¼ÍƒD”sMEæ5f…Ö§>\ÑÔŒbPjaa7àaД"Ï,ÐË[çÔ(Ü&TŠðDòG”ã-GpS"ðA[|ñžs–M!ÙiÚtÞ¡¤ìRÂã™ßMyÏ®¼)7Å9•ȇ¹S—¹.k›ç2ÐÜ.›ÈrÄ}j=£iDm©Çš‹yJ×á'ú5‡÷/¦mʳ¸OLÊC„n¸Ó݉9»7Û(œž:¥Üg’ùž0lnt½ºÎ«Å x누h-H2•ð:Û\#sóÜ¿MÈRô¬œ"9"nêJðç"i"ì7’EvYlž€¬ÏˆT¢,Éf“\Ü»Éy)ܽŠû¬ékøæ<¤Uf”ÿº–üÇ·ºž ¦UL‘ᡪ”K®çÙ ÊÕ†I° °^a³‘×£À¡f–›Ó£* ÇHúÑj4èµ üMÕNÂïÚᦵG,ŒÎk­5ÇØQó&BÏôʺm yôJDp!«=š·6&åð>ükÞç\b|þˆ8î»m*‚l…%¶T„Œ ­il¶Žƒÿš ð˜÷¼¬·(ÂãFJy‚óÔ Ïy6›§¢¿Rµ‚ÄgtÏj†‰]Y߀Èh@ÏüT’äÁf@Þ׺I—‘l†ѳ֧rSBNå$7‹%`ñ?C}žã©âÎ&—ày^×Ql<OKèxúªÀ§z+Ž{K^[t´ç,ç6—®ZÄÈ Ç,qæð›Â‹·cj4œ|šÔ¤C€“9yÖ_Ä1gnDëP5Οر,B3‡áRÆ_ŸW°ëñŠ•M°ÏÀf¼b ö‡·~·<Ú\B'å)‚”‚6ÂÔ$Õyã¯vLP<1rĤ®”Cþè’á™±úøˆ`ã´Ûùù=)9Þ(k×í½Ä7ŒŋýÕ‘p;Ž;_–ˆ\|è;"±(?„áÁ¯›¾ãïRñmwÊ „ó¶€ö”Ç…Êdóßüš§¤ÛüjQç©p%mÅ8¿Õå‹÷æäLÝSäÍ¡OôfŸ.à±H‰¡.ô<êÖBkaðMÜâ-o."áÒ»6x4œÙHspVY58Ae$±Ùªk–$‰=¯Qá·p ½.Ä0Ÿá÷sà«?ž×xðJñz *¥Û6Iìņ:ëËwž×ÿpLñPx$–˜ /ÍyäæF¼Rgy$~žËÞ©ÃÐ"úPò€ÃYÊ3ö›ÝtèCéÐÒ‡”–MSnšrÝšRNŸ1ošrÙšr‹û-¡eÓ”4M¹þè^÷wÿÑ ãNо0üøúÍ#]±ÎÎbýÍ+ؽ]§ŸIÕ{Þ-ãê…}\÷Wí%S#†—uu¥¯ ¶ªê1ãDa*sýF~s¥¥g)+Ñ^Í©ëJ÷Ç`ççi`Ÿöé7ÔˆJ°cí£Ml×Fëîò“øÝáÜïÊ ?£>ÃaúµŽÖ1œ<Æõv,fílGH ºÃï¢>¹ëƒ˜PÆOÅÓî3$#ÆQ¤øáÕìk£á½}û`ØðÞz¨Ž6·k}(£=ÅÃæÁÞÌa”y(»ùsrfì@– ×Vz‘:› 1š†éŠÞ¸*:¢˜ý2[â-§ß¿íþ§çj endstream endobj 3325 0 obj 3673 endobj 3329 0 obj [179 /XYZ 40.7999999 785.299999 0] endobj 3330 0 obj [179 /XYZ 40.7999999 785.299999 0] endobj 3331 0 obj << /Type /Annot /Subtype /Link /Rect [300 476.179999 409.439999 483.859999 ] /Border [0 0 0] /Dest /#ba.Z#5c#b2#94#fenk#bc#ad#80p#bc#16#01#e7#ed#93#b5 >> endobj 3328 0 obj << /Type /Page /Parent 2 0 R /Contents 3332 0 R /Resources 3334 0 R /Annots 3335 0 R /MediaBox [0 0 595 842] >> endobj 3334 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3335 0 obj [ 3331 0 R ] endobj 3332 0 obj << /Length 3333 0 R /Filter /FlateDecode >> stream xœí]Io举ׯÐ9À¨ÅM”€ @{é90l ‡AAO&Á`<ˆ3‡üýH%Õb±>R|\¬r± ´Ë¦¹=¾ý=>~ùóó?ªý^}¹þOõ}þ~ÿ¼kê¦m¦ÕøõÃù/xW >}Ôªy?þ«¾¿îÞª·ÝÓîiøÿmÇÚ}ÇùÛÐx˜bð÷ï¿í¾L“ï¦ß<ßÿuøô¿ŠW~ú¥úñï÷ŸæñÆ?xÝu};~øuúÀ8ãÝðÃù§±ñß»¿ý¡úmXB·wüÿÎtÓ3´Ž·cW¶ÿ:ïŠ&€¥™heÅÖ©pü÷Ÿ»Ÿ‡ÑŽË¨{ɘn¥nVªù8¬öÜë¶b}c jìmåP¡ _qWĶÆ©íC‘A¯Ûh ?:P¯"~\Q$Ð㡨 çT‘@*t .dœÆÅ½e(2è…ˆ…õ§¡BR<ÖïW ôx(2èUßî·©T0èC…BL°Xä3®ˆ…mízc¨§(z?éo–Žw/»/߆³ï«—Ÿ‡eì§éÛË뎷Ãôƒ2бêå§êMþþ©zùe××ê¤iÍ-¨¥ÑûYkµìGÃ}¸„}zÔ§™æa¢Ö¬-ßö-]-ù¢…M+hkÁ¸z¿j±o”ÈVµü]Ÿfš§©§†À>ßüwÊ +À;…-¸Ý£K W€OÎ#!D «æÜÕøš;HY:3 _–‘†Ö,8€`p×Ü|m!¤¸Ç¢AªÍà ’ $ëèqØZ;qâÌXbŸ\nþì/&Øêºé…~'~€“à{O×°Ï|§áÙÝÊé/Ï€-Q‹‹E»À}¹^½¿yÔ'Çä¨ã\<<&úÅé‰#ó5€×¢–“h2ZzÿÑ[8lóœØ‹±‚.5ip¡Ð]ð bä#Bx  Øq¯`†˜öÊ5+!ì “¸e_¸O7‹­™{Z¶a™Ø m°¯Ë¾Z&ýrÂ7>‚m¥”(B,EÊrÇ`P˜…çãQ1Ž0óá³ô@ë¥`´ôÅhàÎr,³M¼[q‹¼‡GmAcѳÅj%Ûwú ^£eIK*5É6Z´#㨠*4Vp”õxš›¸<–„kËA,¸æA÷pìÎ¥º `˜ÂGñQ» ¡ÀéZ¾ÔÓ¢hð…- {_?Ÿ£²YñT жõèhRúK¤¡d°Ñ…vãÖþg?4Yd5Hµ^Å¢n P=r)¦ë±™¦„Á à9RìÈPx›eõ¬Ói«y ´eÃ+y—rÁù‚=dgÁ1ñ{…¹^®Ð–£¸K0ËÁ”@ÇŸÛ'‘Ÿ/Ç0Õ,rSÓ“ÎS"½EKÄÇHÑ ÉB8i“<(*<¦Øá‡b.¡,Ñ\ªši9 É¢Ìíá68Êzùê&l÷B‡#®>>&ˆGŒ³]§ìpjÐŒJ¥Z\ S'Äp÷™“†{Jk½­u;ê”q×F/PóšÜ᳓6åvýA‚ñÚÈ9 ‰é@ ˜’?„µ¼îSÑ4X»9ë5‚0rf½'^0 M #RDæfò,6›qnnŒòˆTx[ŠüQBÊWœZuÌb8qÙ’ZM„)Þ/ {3©Uî îŒ4k‚¸Q8Û =q}ô%b%Œd ¸õ>(÷V8½>*\%-ÁLJçHNÍ™‰)S ÔR*#)@Æ}jªGˆÁdqd× “:-VM¿Ÿ›ËËë®o\FÛcj¼žMJÕtÎÆŸË§D‹EÔS¸jInM ¼Ô÷#¢y?VœIç^n™ÅI¤<ÿêy[f6ⵂ‚—Ã'[ ó` !pÊ™`oÚìfóC¾YÛS¨‚˜M a‰qž*Ã4Œi cž‡@Ãã,ôH aË ÕY(S†5äIz´¬:‡k(¼¯Àñh$L¤p߸;ŧ±Š@·#…I8 χ$7)ÜËM•Q‚©¶ØÇíúû È÷²èk¨›pŽRjÑQŠŽ² ÅbÓ` ðh„µ½f Òˆ‚×9´ ‡SW˃Q̦)™¬jAIÒG|∔Ð%(˜$!Ø'éÐ#æqÄèåòJ¹nb,~+×·—œfáŒÁðÍv¾‚ÛÃ;Ïù(&ba3±4'bq~òz|kºzÝé¾=ÿů»g‹ØH#oÆ%¼§Ã¼é”¤@ÍÇå:ºƒX”Äã\±.ï“uOp¦¦ˆN¤4Æ/)`3OØù3×äanÞpå\w ­†p™(ŽÐ4OòÞÌ=ŽÈ¡MÂ37yŠÜS4 C•6m+Êç„7/HTÓT)§¼^ïÂoôÑÏk®[¿ÔL÷#5‹H©è8•±\ə̛>$•ý^áŒeO•.@&È‹+IÅåLÉó.@ÊÜ\M‹Ü\­\)@¬°ÞÄÎz~%RgPM¢ÏêðŒñöè›cYê`mžŽÞÃùjÙž?#My°DïF¹±pE™gåvÎͺ£àzÈëb›KªÌ~’š-eGBó¨fˆq'j.ƒIœî+^Ê‘•›OWŒµÅˆSŸÚ Ê%9G|â^'»…ÔZXK¬7ä Žçyð=H_¦ C®ý~øÕÊ+¼È”ÁŽî„û8ÜÖâ¾µ9jñÞ¡êC¬„Ýø¼d| Œ¢—æð4Ϩ.Ø!¢xsñù W«NÐÍT?ÛB,Ù“–é6å xW ðxrØ`¾n£Òƒù®OcòpÅ^ã³Io<é±;ÜÇhŠQHó„ÇT‹Æ—Ô÷Ç š„·– ›(>Í….ŧÏZJ.啿RâLÊë‚x[Ïòý \¾©lNÙ”rÞ)ìÔçWRΛKYÊy¯’Ð%›s+\­-å¼Ï4æ’ÍY²9”Ñ]ËÕä.çÍÕñ… \™äs<Ã÷I’ð<23œÓו~R®K„Ai“&Ý5gÍÝnCwò¡DÈŠœŠM¥WÌœl1]²†£—ÀCr4£VGŽâž·<§ÿÚò^Æú\šˆ.©>óúò]qC»™£ÀÉKYz[áJÛ~¢èp[3]Ç—b泪‰FÔŽ’~†Ï.àAkœÒç]ØuââO8¿d—ç2¹õÁSW"Ú9¼*-?Ä{,E— ¾2ýåO"!¦nñZâð”‚Ж8¼k?yNXºë?åôÅ·í1z}£”(´ÅãNðjcü¥à"ö78ªŽé„âï&dW`j @Ç÷€£áUÏ̓±»0}NO¸æOø,ä/A¶X°SÆyŒ¥¦Ð–K±l ì´É$ƒ>[.¦aËÉáy0¯ hžDÉzô@ˆ)Z ŠeÄRÆDÕ[ðC” g(z€EïÃBÈV‰Ksñnã­9òp!¯d¾–ÌW5•Ì×ÍgDé6¤Š×gÌ|Õ €HÉ|¥C¾kB ˜ÓòêXHvtÉ|¥iÂ%ó5cEHVyÉ|-™¯TÚÜzæk§Bn1œKá«z–4L7þÁüíû«×K^g„=Y·gíê„K×Vl·.a÷¬­÷×JSmgQÒ¶u{9'¤—õ™³–‰ü¸®õå ¯¾Ð2¹+…¨yñI{¥êv ”Z4œ§ƒ}zØgBWÍk>dü¼Ïm"‹óß<À¿³z.ìðê3çÐ\jahsÔÒ¯Ï|b>{Ÿ×¶'€¬?sŤ(µ9ŸôÇÜgVü0b> endobj 3343 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3344 0 obj [ ] endobj 3341 0 obj << /Length 3342 0 R /Filter /FlateDecode >> stream xœí]Io¹¾÷¯ès€)s« X– ‡‚ääx2 ™Aœ9ä狀‹½˜¬E>.UÕ* d³¹½ý=¾G~øã—¿ÿùÛñç/ÿ9~Õ¿?}9°Š5lü:ž¾¸ÿÑURŒ¶]]‰þôuüúËáÛñÛáõð:üüvà͹£þ54^¦üí믇ãä‡ñ¾|úóð×ÿŽâø§á_?ÿú·á×z¼Ó~9t}súãßã\pÑ ÿ¸ÿëÔø¯Ã_~wüuXBw÷ôóÁ;ÉTÜ:¾]»òó÷}W4Ù¬VtݰD.†õŽÿþãðÓ0ÚuU¯8oÕ2ïQ[q¶î›cß6ǺfÖ ÖÞü†â‘I®ê$WÄã¶Æ™jÝCQA/.ÏÛ”],è¯CEƒ¾ïEšN+âq[Ó w E½bJ·)†â6z*bJô,Í@§ñ¸­iÐÛC½&‘ˆâ&¿9:>½>|æJv'ðöÓ°’³½ Û­‡ ’±WÇ·¿gL>ÿáøöóáåmXgîY{).³~>ÏÚWu/ÛzTvc oP‹P°¥IØ"` œ‡=Át°î‡CèH¸É ÅûÁ0€«v´|$à‡‚ØÇ1Ïs8~äSAž©ù<½`Èc(~‚T±µˆ´”´E@~d/Iy‹._Ê@¾ë# XPÓHƺ|c<@|c¬:FÃ2Cê-Ž×[°v¢ÈlŽw ¥£Ò<î#)tYNvI&ÚÒ²‹‚ yHI’…S¬Â4†59¶§Ú”6¥C§Bè 7¼Â<·àÑ0¶ IŒm̵²/È›ªÙŠvkê%fí.>#ƒœ6ÛRd¥œÉˬ5\lq`s ö/p,¯0ãÑ’r>Ã:ÏCð@IÐÁ£Á:pŠe6ÖœsÑ‹2T.æ£)xX¶;,8Ö|íDšW* Ö›ywA"“n†T4î¢F\§ÅÊ;`"’°EÁyà 4ÄÊR/nc’.@:ús'tZ¸{ ”qŸ–M%x7 :åªpqrU4PÁ0sTkš¤dÅ,0çàÇèṙáùÙ\‰Å¯&½8ˆÎÜ–Í>˜Ó,`Xµ0ýb|b~›yH.dWp&𥃗1G @=kn¯åyñ>£ê“×ÀîϱÆò0IË^^ëhïqqÖ‡ÿ-ùýd®5»&ê¤0¨„à& nËœÑC›r—,±hª‡ že4Цpès>Ƕ,l­†±c4/Ën$_<í¾žßH¸ªKÃ^Tü•¾ƒb¬Q­aÄÍ÷Í¢Áñ¨ Å-F ¨eKP,xËâ4—fK)ÌšÛÊ®œÄÅMºò—Å#°`'%Âò:…¨™bSb°Ü&<|̆#tý<*°W j7ík†ìÓ’ó ªÆh ‚£ã±á¹°âŸ%äŒâ¹i…!ž±=Nqt-ñ@Íb‚éX½¿P°Ñ%é|€ÆŸ%ì¾ÑÙþ X‘eJXLƒQ °Œ…ku ïÏ+r„y(¦ 6W)Öi¼ï5…Zä¸c®é™ ó€“O%çv1ÃÍï— .!~ò‚§@àÊÚ"å%iÄe>4YÂÛÏEì–íëïà’–ýÊj gréüûÄò”Nþ°3:$Ê÷ÎŽ¥½4Œ¿×å¡[î­¿¥ž_þ×:ûã¦BÜ(Œ)Šg‰­®d•Ý‘÷Ó!² õ%5‘_öØøu[Ì3ja1ÚÖf8î#اG}tºgÕxæt7š@-:‘ª«”¦r“ú&Zt^X] ópëVaÁ­A}X²dy„^®¸_ÙÃu⤅G0â€Ä•Öm%­œ:H-Zí7•>ì½ëó(†aƒ÷`]¥8gHâ,k#å¿Yp4 ˆ£¬Ñ>pÄ‹Nq‚1jKGB¨ê^K#ÙýÕ CÁ,–k×J È¢à!€Î²`8 f"`Ã*Áv 1Œ(Š;àD=Ovñl4=½@?¹“×’žHr„Ò¨Ÿ3`-“¹ŸQþ÷L™òßÿhÃ!ÿ±­@Ð&¥Id7é ™tùgÉÚyø„Ÿ`„¨_JÞ$}òXÉIN­2÷ìü»4ÿFúð«ôˆ$« ɱ©â˜‡’„!)ôþ2Ôö•ÿzr½V“ ›zI"#”DXJLE@ùä³gM#†4¢ÞRBó„¤lêKu>$‘¢oùX£§­pŽ 3TlÛØM¢Ó^[<2k)ä‰ÍŒ ªº”ý×\j®-û/ä‰9)Q–k2W©KœUMË¿³øåGˆqÜç’Á¸±FÜŸµŠÜ †lcÇ?x>Ÿ>A3‰BŽö cŠùŸÝåÎn[þ¤ î­ ±+82 ±w/1l^ËS£¹Ô¿4ºx} ᶤ±Swê2¬ú²ú[ËGR²KñË”¶ìš¿»*3nW ÌnðÉ$̲*1QBX fÖ•”»ÙÂó V(—>ûz/Ê0¥ù\ @v(yäk@.1)¯tX<üæ‘Ûu¹Ú’í–¶ÏóbÒ R¤ÍŸØÂÉêï¤yb”« ¹ºøt” n=Rê·Ìbyj*cè¶@Æœê߇D/HQ×g6-g$37nÍ+¹½GšçÌ{×ç­ ,óm8ëQH!aèÂÞ€ãhßßEL’¤Zò62՛Ÿmú|`qZ ˆýd*ÀŒIÄÂ.à6|ÿ›âЇO )i¡á7¤ZQ%ÂKa2|6l›Š”žRyªÆy¢ oš+aÿÕys>Äx¦a;BÎ$Ó-†¹×—ˆ±_¶˜öjäÔý)ý(ãM¤¬/˜’Ëœ2:¹kñbŽù;–/{è›Ü ˜G-L£ÌllÍúÊüÆÏn}íÖ×n}½/ëëöÆðn}mÐú I ¢°ï|¼¢Ìí-»}¶ }ÖÃ4ó¤ Ò}Ó*'BÝÓÖŽrû¼Ùò+" ÿ[ΊÑÊÒG@ø¸2IfTÀi½%ètXÞgšL¯ø,i—ñÞàÎÅí²bY8µ¸L¹ëRËã–vÝH£ôëÆûÓ¢¤míÖ@¸5óJ©Þä£ÝàØÁ±¢„ëÖÀxob]_n?+]Í»_Þ÷è—÷ÑB½)Þ¬Ýd!^QŠ{µ×ó²eÌ5¥¤¤å Éý®¯.k¹ þR7y­G…”ÜX–¼¿yž¹R1ihžç: =Æ‘û.µž\®Opyù{i¥Ê|U!†@€ª^I¥KüÁ_ÖW„©L’<¶9˜L[?cÿƒY»8t6ûn–g xŠm¡ƒçsŽÒ>ÌFˆá­ˆ{mßn}¹–¥K\š²è2¯*äˤy¸'¢¨)Ï“7YxΰlÛ›,6_ÅG [ãÀmžçr"ÊâäpGDÔÁãò‧ÂI–üˆaÒˆ€|ÔÝd[zñ•¢ù |™évƒ%-žá=Œ»»¸;ñãJçK1qâo%ú/dXfN³_& RÀùê%Át}ÐJõ’ ê\É^gî7êZ ôY“a ø}¢E(ØÒ‡¦ñ9Õ"` œçöÚ½µ‚¶Àýhe´jÜðªqË l˜cp?Ž Q-ö°qÊáƒqªo)¶L–žàÁM=O}[÷["Ò²‚}0½ÜÓ Æ#¦ õ`-0¬7 ŒS‰9£/ÈÚ6gÀy$Ö@˜b?-M/‰yæÁ ³vnj™Ü67pïÀ0¶Ú¶ÉMÕs“›æ&Þ†ãÄáµ< •—Zõê©OñmSœGààU/N/‰©üÁ ³znjæ±åà&Ç€š{…ëˆI´mJ‹Ã²v…ƒsÄ Ë@þV±K€¢Ä––*·‡Ž·1”@‰€B|;FƒQF|¡®“YŠíb‡¦È ìàÂÚ°œ_‡¼ëdA±Åd$[›$<ë ÙzP²;¬ÈÏ=Œå7nÁ£Q<úRüŒWM8Ùý°¹QÇœÝhm]f¥­ZbÖë±>Žé:xS3¦¿Å½^N¤§±I±†V޹ã@Ì‘$.nx?Xâ¬Cõ\DЋCáHÁ÷z´ìŠuØ®½Œ‰®@.¿›|“]g¤Öxm+‘ËuŒ¿·óæx“4Å];-7—˜0Ž2¦[;_X1qq,Ä(P¦^w{oukË×Jn¨^ªÐ¥\™*ñ>úï3 Övu×><è‹Äé*Œb[qiˆÊÕæYíM®÷šÿ«¿Nei¹,FtU׳Æ÷ž%‚D)XË£Xsîº|VÐ6³è)¹?wáSÆÇÔ,AÔ» /M±>æ${2àÁªHÒ¯·@‰Âqž ŽR`)„Ï Ø^Ïp¾ñ ¼ËýOË3Å CàÍ]Û¯[Ûï’¸°$–Û®ø\s½Á6¥Ð~ƒFWpj»æ3mȧX®^vÖÛ®ï}´ª'ŠŒ^þÄ×»–صÄk‰6ªnýñjïcò'Iy]8׈À[˜ïEN‹ãK„]’î2¶ ŒMË%®z[ð(Y³†Š`%DL=ù^씤{EpŠU1uø{uï^Ý›Þ*N[Ý»{úNÌ=˜}º[¡ïÍÓML6`º*ña™ýÔ2Es^¦ׄ¥+@Ùøu[æ3ja—Ä˶6ûÀÑpÑÁ>=꣑Íe5–ŸXFV[I3ÅTêÖ•0_ÁÔB™³jl˜R´þkÓèåÂ~€£y´èí*%ŒýàymdÆ å2-À¹º<ê33\­|ðúwGÓÏ»MáeÜ{SÉsJ°–oÏ¢tˆ–HM˜Îj¸[’‚µjØGzç]ÉæzÓDÂwÞó ê¦7–þ~Z`øˆì%„\+ÈÜCž8õ­Œô ìãñL1.” ¼ó.®Ã˜/èòE”ôÞ•Õæü+­âaHø×åeªLÄ/qQÞ„JûFÎ ÞþU–f!½*4»“·p-(”RÆ<ð^$ø9àåÚ}0@¢ùcÚ5––™}•/Dä¬ C‘¢<¡up.ÊäÉ„… l·Î¿™ò^g‘±3ÿ )¥Ð?ÉSËÈ‚ÊùÐc×™:ÄZoÄãØ1¯£ª×öÒÜ?~eŽ ¥äåás‰ÙÌÀÌûÚÞèÄ÷³îî`^wP5Ü5k4U­c:»®]£®]ÊÿQåv £iÎâËù¢¼èLY´eßAxþDd3£…KLÅy|‚"×ÈÔµI ‹¸½ÅèH/J–¾…„@Ãzó1·>‘Dþ1«S8ümøÄžWæÕ)qhŠZ*pš‚hµmMãÙ!Œ-ý„½K|O’¯tör|)¡X¬C“D¤|#°>‡&[îQBJÖ(8óóð}ü60îÀ—§!ô¯¯¿88Ùì&^BÀÙu>¥9òa£SoÏ›j<º–ìRƒ®Óš¦j¦E]¯* x#qˆ¶j§|Ú‰–RV¢7®ÓÖh]5#I™Hšš§ƒ}zØgL–iE%ØÙç5–©ÑFª¸ÿŸgøY­a'vøõÑŒ?ÕÂÑ>4a†õÑ Ù»^Û™"¨îô·¨ÍײTkϧÂé÷ÑÂ(ŒB Å뺠©Ñ0nŸ!ÅÃ>xm·ê…£éÌÜ©>”ÑžÂ׿€Ææ0Ê<,@>œœ:…åÂÔNïTf„Äè:ÖTü”Ì7):¦–Éù¾è5¥?¾þäÃF endstream endobj 3342 0 obj 4569 endobj 3346 0 obj [181 /XYZ 32.1599999 408.979999 0] endobj 3347 0 obj [181 /XYZ 33.1199999 407.059999 0] endobj 3345 0 obj << /Type /Page /Parent 2 0 R /Contents 3348 0 R /Resources 3350 0 R /Annots 3351 0 R /MediaBox [0 0 595 842] >> endobj 3350 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3351 0 obj [ ] endobj 3348 0 obj << /Length 3349 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðsUÄ‹( (Hr’}($@Š>ÙÝ‹fÑÓ}è߯lÓ—þ(ÎðbÙVä8æEÎ}†3Ã7úüí?ß¾yÿù?Û¯öçûÏ›¶iM{ø³Ýýýáò 94J>öC×Èq÷gûõÛæuûºù´ù4ýûºfÿ ý1 _q˜ð÷¯¿mÞ^¾9|óùý_¦OÿÛÊퟧÿýºýÛß§?Ùùv¿ðm3Œf÷á߇B 9Lÿ¹ü´ü׿¯Øþ6-aØÏ»û÷)ÆN˜!i¯§GÅþïå£èe°z­F³BN뜾Þþ÷çÍ/Ól§e4£¢7ºo£gíånZ­ÚíØ›­2›ÔÛ[ÜTÉõc¦‰v+i[­îƒS‰ð¥èÌ`d?}Zuø/aƒ–û Ë¡KÝòqªTØuBš1ýï§íÛVŒ?n¿üº_Ýá‹Ö¸_|ØÑMÆÝ d··üìˆÞèF«¾³6¡UîGú¦C§ùÁ™^ôh’NÒ¾?|™¢ yKÕ;ô­?äz§Ðj¯í»Ã['%`wÚíß:68"4Ñœíœ ?óÈwô÷àÙ„¡ï´éû±”HZA««Îº‚~$nø=>#1¬pëÆ8m!½`iGääŒÓö#nÙ$_„äQòÕrø Ó †–(,žYéÿh¤ÐpŠá¶”‘*œÑÉv–3ž‡’0NÔ»Š8Qcõ`õb [,Ë€H7TæA‰õÔœmP‚~ë@¾ï ¨^ÇÁ7„o`6h)l ãdõ:úïrw`{7ðÅ¡ƒš²b4µõu G ìÑ`êƒ8y àÍÛcJ»€äâø K–XâX–ƒ·—·˜ëok 7,£ÕXOÑ­¶Ã[Ãð= Ó2^çޝ£¶Ø›è0NçâD¤U/ÝF1J¯6Êj£Ü «ª(…²ÚB‡9,‰±¤`Ä©$ÆBVl/ÞëÔ,¬žÇ ¿+p ‰cçX:pÎh±‡Éð07-Þ~êe-¯öÓj?q±°d®½}D"sô'¯ŒÆ'f˜Fñžc]V¢ÅÛ(£Xm”ó38¯1²tÞ‹ùõ¬:}Õé°€Oô9ÙHˆ2tÆ£i{‰#˜ª0í`üàrò\×ü»Å[½Lɧ²VE•ê!û[gÊ^)¾G‰M§Í0áLÔ›FŠáªp¸¨:áÔ‡xÕ­û,ÂTVx¥+°4ïO+gU²–…2n $ŸFœaSEeKÌ…Å:£Ë•~U§ÂìÅåÌ6YxÝã½øÚ¬@I©ƒð´9 bÈ+ Œ/dzt}íWÝÅ o7ñ¯ÑJY2¶J*«ð.較ҙ ÈqŸ«c8¨»hª"@ÛG÷c2K‰ciGµœ"ðàˆW‚É'žÚ}ëh¶œöt€Ú›îûrZI¨ç—`ž½Æ"­–.Áõ„9þ=ê•þ)ˆ³Y™qk¾/¨<ÆÖSetxY·‡¢Õ+VlO[]ŒÓq§1¡º‘¹:T1êÅPE`6œ‡ñ€8…ZNÖúR¨BÉåPž-kç‚zH wË jüƒ§¬N#ˆÇ¾]-»x)yáu(iCIØÃôÂ/ÎÍÂ5•,;ÿñ$ÏôÞa9ôWÈtäXŽØB}&ë¡ke¿Ü?[Åt k³ 3¸;`#àµ1rk÷f9Ñ;a…¥4£{QÀBÅ#'ƒü¹¤È°œˆßZuQ÷¢]NdQb Âñp„˜Q'¨áx4Œ³NŠÕýQl8‡±ÝѤÍyò]–ÓÌè,ýöœ¶¦øUIñ“ÊÁ¼wÜ+ »–ÄåeZxdóÌpžÎFñÎýçŽpšHBS ©w]Çç÷³é^O~Jç}Ix!)„Œ¹:Iœ+üéqN¶ˆê°•újâµØ³¦lOô[»£ó"^Üo,´MèWFçWÔ!bh\=e×B5êÄÓˆ6†ãàŒX£F´Ñûû\Ä_±¸º6›»X+a/öcm2Ñ%”KûW–)ð"Rß„J ÷XÍg޽ m ׿nÙÒë%ÞáÆ¬áˆ§-H°r”ÅÚbé‰#J0‚}b¨L±åÍÉÝK-•á’˜”ün,&qŠ,]û’5>½/Ë•4ÝdÕeñjž•‚L0EfÓB`ÄàTel½ø„ÈÀkY•9®0¢¤ƒ'dege?J’*¡ÒÅãò·P¼å¸÷ cÚwÆ!ä}P*t­qô€9è¡E@Ý•­ZÒe+ËÍ›³¬×º®LJ@YªŸ"R1KêÃå9ñð®ãL©Ÿ$¸ÚñR0P¡\¯4 S§c…/sÃá`F3%‰ÛÙàð"ãêN{ž…7Ôé”Li’w{ sšoIÎEqœ´4FÃø¼åÐeŦÒ)­¼8‡d¶\Œ_VËŒ­š7§·Vj"Òiq̰w,\1 &³_«é9HžáÍ}܈„¥NQómin2ŽÅ-Æ(yfØõή#¼=6Õ쎔qÜ{ ûFDB=zx„€’Gn dŠàD+rWRä”ÔÊ%^VM4®ù't˜÷‡hLaGÒ_ˆ²N ï‹'¬RSÚ.°Œ}x³óFÏSÎëŒè R¸œŽD ôëÀô¡a‹˜| E†s‘‚úeè:W¿Ä‡•9¬ž%ˆË‰\ÆŸ{ÒˆB„£PÆ]„FH99›÷±À$ŸW𬕚Ç>ç>þÔ&aœäB³Bï0 6¹»™Ó“Ål+tÄiÉosÔ†7}–ô‹èÎzÙVµÃ·@†ÇòM°ì)ø œ(¼lŽ6â¨îååÃz6öÇ‚'£×"EÆ6| 0ü pYüâ!ê”$ŽÁÁèŒe2ÅÔJtªÊDœÈ„‚Úª×ÆÑV ’‡ñ':…Ì•a 1¨·pt ·BÎW¥1ç™ùª¿ˆB,ó¡Ôô£µ“~fcS9ŽP Ur¥x÷žš%I.ÁÅHIiä4ަdé(Ðb=žÔ#NèÊ(û:­ö)ÝÄs¤S³$ú’ú6k­ÁM©”Ì™›¿°“Ó@¾Ã1ýBÙáYÙ©gð…+Õqm9®ì.d5­t ÄÀ„Èq2²&éâ8kÊ å¿bNuw¾ëÙ›–=[+Í«b¦f§Oo½y¶õbÒèn…ëUv§F÷OÇ­½Ñ„]ÂY¥9&€rh&V:NJöT•j¦²œ'ˆf½¼Ý³l®tÉ3D9Ì1Ë2A8UÝ/N³ïTIOÚ¦<¡;oÎÒæƒZ eq ã½†,ÊÁç„Ç °râDœSE¸zŸŠ'E1èqîEÙ£ó¼ ^”fŒ ÕH0GTxÓ d ɲ:ÍpZWLÊΖÞN ¥çe¾¼ó:ýq²Yxª£]‡ã%-«våÉÛ¯ú>5@>1.]RøÊ ŒSx‰i÷ïá@ÓA-»èÑ´ëJ×÷J×e@ô$yýÞ·O›C@¢ œÂÑ®µá(Q°\}äu¤¦~WØ;ËJ×ýp.ÆÆ–3”;ßw ­¤Á8¾+Ç« H1Ž-…­ŽþÉ–Ø¡Cå)6µÄÜHù#„¾ï¿'·+ &()7iª8Hg/Og¶”L}ì—RÊ4!ô€*sO ¡zt6½&ËÕ)é“”|ïˆÐ8á’Ý—jõƒ"U×í‚R´Š­wø™“šÀJZ˜/tËѬ4¥l“ÒÕ)¥IË_\ÚáV™Go“qëÆ¬=2a×,5þµ¥fé S†,oß”—,,Kæ2Úèg”tY-¥°x(°Ì7NN#ƒšÃ-–$¡F—/y×.æ0«]Ñf/>©p„WÞzꄬW,53xý¹ó峸™ô>ü”nÝ)&.¡=¡!ZžÛ½uQò‰câĤ7ù&e›JæíÂÅ #tµ$\ã9_$‘£’•Òè'kŸ‹¤ÆhôVÙ…Ü#N•vô ¢-^ÈßuD 7v&ô½ºC”lñhŸÅþíÆ•ÚÈsº Çß%N()ôeŽ7AÚWŠñáÀ–GÞóÛãÄ•î·iר ‡çÖµìÎæ®¤™JÑ¢k=V=—y"ˆ¶1½ˆìy›Eª%YŽY-ÕêFÝ"êº{ÑÞBx&ŠU¬å¼ãQ¹,wó»ápJÁ³Åâ IŽéF°\ÁAØÇVõÓ+².ÝлÐÒ%Zýbi¦S{‰ð±8 ÖG¤ÕŽu/ÞÆÑY¥Ž3IçOY©t)/âWöŒ¶Öe–IJãÖ÷(<"hziÙ%½{é(šå%„:¬Õ>¤›?W+Ã`„kã8iX’xç9â’Œün3ÌÚ&ŸD¦œ;•¹?‹rÄÎHAÍê ûÒF;ˆ^}錾´qÙ¨Âùº‡QÊiEš~¥dœP¼ÙÊÕ%zæVÀ„ü'ìènïͪߗï’q:²îJsájsé®Åäg«lñ5ÎÕPyoÈYà-ôxúªw™”<¬®¹·Æ„Óßíë€i»_°?¾~ @Äe{å§ 0ƒÎba0[1mãZ÷òQ˜fOd[uêå`ë–iÌu)8꘲oúë.aeäÀÇJ5r¼š–×u9 Áåðkïà3#|æ`q÷²‘í>üyyg;0Çå7/ðw­ se‡Ñ3V„\h–#hÏXŒQön×¶g€ªÛ}–8••iø¾ŽNg ¨Ѩ5B¯Ìfˆkðƒ¸õiã'@µ?Öä¹BϘª”ø‚øSxûÎéL20 tÌ7‡аU|CãêQ$1^¸¬Cy©¼< ­iÄ.S"š©ßΰ»Õ¯uëöÓæÿõ?¬® endstream endobj 3349 0 obj 4037 endobj 3353 0 obj [182 /XYZ 32.1599999 261.139999 0] endobj 3354 0 obj [182 /XYZ 33.1199999 259.220000 0] endobj 3355 0 obj << /Type /Annot /Subtype /Link /Rect [324 425.299999 418.079999 432.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref >> endobj 3352 0 obj << /Type /Page /Parent 2 0 R /Contents 3356 0 R /Resources 3358 0 R /Annots 3359 0 R /MediaBox [0 0 595 842] >> endobj 3358 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3359 0 obj [ 3355 0 R ] endobj 3356 0 obj << /Length 3357 0 R /Filter /FlateDecode >> stream xœí][oã¸~÷¯ðsÕˆ¤DI@Q`&—}(L€>,úPÌv[,vM÷¡¿rDÙ©"i+qL<–D‘‡ç~ã§?ýÇþ_¿ï?Ý}ýÏþ›ù{÷uWWµ®§Ÿýá÷‡ó/d_)9}ìú¶’Ãágÿíûîeÿ²{Ú=ÿ¾ì„~}Ðü/ί˜üýÛo»OÓËwÓ7_ïþ:~úß^îÿ2þï—ýÿüdÆ;Üð}×úðá×éƒBöãÎ?.þ{÷·?ì§Ð¿Ž{ø÷)ëN:i/ÇGÅëïù£èe#°ºvr/„çÙŽàøï?w?£§Q nº:xÔNÎÃÞ ¥œAµ•8®›†e  fiKuÓù‡¢‚^ Ý1þ4Tê@#ò t˜è=C‘A¯Úúu™²R:• ±¶íy:ÌH¤-m=Š úNMÄÝv©ëœGJX70máaF"ie3àáHd¸÷ã‹ì\á¹Êy¤dp ­à¨$ee3ÜáHU¯Íüòž~|IW«aåu3j\ÛÛ 1ƒu˜4h‡JÝ–‡yö÷uF"mifƒÝ¡žXtsÿ|E5ðxEpn‚k¼<ƒ.þ™bU1XCÜ‘Jd¿s î†yæáyä'Ù¹ƒnføÂ}\½Rf¦½Zåc¼t_C\T¯ ÕáxhòeL[5„ÍC[pï%¦ṮËa¶g¸ ÌÖµàæWW˜›cˆÂ÷`.BÁ6e7^骬c ™LSOÓÍ*m= ѶR²²u ¸·áÓœ¾˜ÒTÍ´,g϶èV']IÑ/îÇÙû&$íªÚÙ ‰®x†‡Ï4Ê~qÊÊñÔœQà^Ö'jk&†c,í\Ž;Gm*5œt¨á 8pQb”$•mØ]x°ßy/£%ž½½rÃBi `åDÀ‚£z åB²F9%„ì-ù† «ûï²'8XäŒõëcÝ“fÐWýPk*6{øzeŸ›¤ý8`wµÑ‡@v‘×12(aƒw“Þc+gDD1BÆUñ䢙ήËkhÞnÉv‰Ñ_1­­CA–á·®kŒG_u§Û·c oî æ´êD$~d‚‹BTm£¢rPø,ö•àed—!Ri ¿=ÂÖfÃŽ^çÁ™Édr6D­q†ß€½ oUŽõF– 7bñh`M–cŽvÒ(0áõ~ƈ´Â,Þ7 ñFE.÷øRHv²  ˆ×_ÞFÎKó”mwyh„ߺªÿsræ¼&‚´a-- §n2H ºë®’ÎN‹1®PÃkÚ7OWp¼ð äOú¼¦„ ÛŒv︳î0†çé‹€;"ܦãFÈï€omº$Å=WuHwiea»ü¯5.’ þ‡Sô0—ÃÉ¢€ÿiÙÙX¼êÃô舛•5¶k$ O ªé ãpÔoÑ| ð—Ã-ˆˆ¢ÐûÙ1Œpäˆa˜Ð¹ƒÔМþúÞ¦g’V!œs åU–­§jpla€½€¹Å{@I)H#:ÑŽF^CaÔ}v5ÌØßM¯k­‡‰®ÿ"\çÌù.­ûÓ8tK̶rÚ ‰IŒe”ùæ¡€ÚmR¶e}TN>š×+Å™PÎãI~ÆsÃÅAx8L¸R²èAŠa/ß§5…—$°¦ `¸á’Ëw‰±êha_y™Žlg]JÁB@ ´)å7¾vsiÌîôüVÌ9ðºá{x×ßqcÒÅ)y¥—/ÞR ›wÞ„ô“ˆ(2oÈÞñ7°ä ]Þ“`ìô*h½©Rò›–ÌÌýj\²þÎäVI-£ )Çx‰5?Bt)Lò¼‡-±)òÍq¦¸üœ@÷žÝ‚;ìÙ{¶ôˆ´Ãêyöî¦%Ó¸ ÁZ¥ üpÃ’?C±F±ÔÁûƒÛ/`:à à3ê¾ m³÷s+^â5`ügõ*”äc‡¦¸t>Öâ6Q¬RðÚý­jßâù¥æc ϶ÿ°¾ñœh¦ŠåÝ$[5Hë†é±ú ‚‚Ke¤F˜ó¤‹K·B!¥ÖQP)“Þ)Ã-Õ.\àæ¾Q²$!ù€L’è䬹ËÒæeyÊ߯ÎcçIÖÃ9¥¸±JxS„—è–’ÂIb=o‡7u‹£ É}®gWÛeé 6Ô)¢B6€ñ…7IA”“QÜ BØâfuE<º „g‘s_¨Š1¦¡¡”9¦ %]rmòÇhu}LÊÁš7‹¹@Ð;(ÝËxÛd°ôSÉÜÐ=€¤ê±tQI¡õ«¯<õb;ö@Ÿ‚làhÐÛ îà3ÙÅ’Í\nýNÞ™»äê ÛM:pJ›„ ¨íi_ÌZ1•RyÉ¢3{”>L9¬šj8 À#´-tFÑÑé>\tÜŒù+6æ9{Œo¼okâhr(`DÊ9ŠÞL».«‰×x½.³ÈqÇb«Ò†žrE]L`ŽÃh¬ãJšˆþ=R 3Îð®uÅ:™²Ç¼2OCÍLvlt/ïÌ]»„´¡ùÑêgsví2½€OÐ-ݪ>–c PØŽxÅœ‰µCEž¸lŒ.ÀÑóÓÃRXˆœÇXd=Ä1­(×Ïü)£P–r0pŸåB1¢¡¥MMV { ºs<~{ ôôMˆˆÞiBÛ0劺ÒxÃÅŽÙæµ°t)|Å&ái¬ >­à0‘×yŒÜs|~œY3œñëîk.Œ/²@ðA+^S¸^ ™^mC(ŒÓoQøûnÜe§s5›«9J}L ²PÄ€"ØLÉ•Dt=Ï&ë¡zg·ƒ5„-ÔLÙ'¤ ¸!4B܉[,)¶ N´pxüŒ†Wð3pnNk\ßtç…ÄkûYü]Ê-ËŒK×X¨áš8¹œ¢Ã8*R8åĸ*½’E5#¤=xžb"1G¤]ªH ¦#hJ\5œ÷Ç8 ±0ÀñŠ›¢„¬i”EíY¼`9Ü^¬ñ«ÛYâ£."",íz!`R V•rá.È÷á“/Aе)~P‡tg8A·PG€¶}2RÎöÔõ`[áy 1Án Û¢5\Ù-ßušËǤbD áDpÖÜZR€"Ýhf=- 0·M`vLÜ_„ŸžÓÒMé#‹µ<ݳYÎaŽÈ[`ɲÅQ²Y.?sWŽfÃäi÷ö7»´ äó[ë³1¢©l61käu¥›W—³çsˆC?ë4Š™¥ª”uÅøðÆ÷¼y– ȯ}“¬áTÐwX¸R£e- ×ã ßLÛ,í| ´W¸A5› C”¡&IwNp÷LLFϸ¸6ø †.žQ Îi󱌒ÐÕÝœ &OK²ªT#*±/a!œ­Åca+‡ z¬6|ʶèZxÖÚ,aA7Gµ|^‘µ Ç›‰!rè0„bE¤¨ƒ—Jc-T_·óÊ)S„!$DˆiÎÇqÞCBï|ÇþÁXOfci¤…cžÕ°á…ë\¶pŽWI}_½óÜX@JölÊQæáܶ¹7·¶J¼ÕË)H(¸Aï$ךqÃ+vs©p1gþ²°^Ù6ʦ6¤t2vÞN±¨.–nÃÒîn ßɲkæó  aCilÑà ïd“S´Õ«ëŠqZBJ˜™ç€È¼m&)QúÑGD‡6vÔ¡ìz‹~/Ö¦ƒÄ ð{n‰m’Êw¯Pã`a.,vøûâ]1êÊeûÚ_¬‘ˆ°ªÇÊ½ÙØŠ3: ?Ý“#ƒ³@²g—š\X¢'»¸Óðª®~”ìÒLUÂð@̆ìDÐHáúù@T Øo,êˆgsØp®œ€»]8ÞµtÎÚsã\©ç ÄDÏzá†wN±%2p­×1 ï !“VbÚ¼ˆômD(W$ÆRˆq$ª»hVÃ:äeÝ$@‘ÏÓ0S©Rö›•ÃP²²=PÄ9ë0÷Ú#ïã1ŽÄ90 àhž+„¹Q$tI®&™€±ÌXN<¤ U³ê‡{tWB-…‡ãâ+x4Hg—§MŠVËW™@Z$`yQ©Ó_â­JÌÕ^7û‘;'ÑC:ñh&!'»Íé©Ï"X|”Z8lwcUª¬SÝ,„=}ô·tÒõfœâB(kn‰éœÇ=6~o/1Ý¡Ñ[b:c(¥W1äÆAVCÁYåŽ öÜéÿ”€™Û)Éq)å¾1½0g]ÎÑçIÆJȹ&),áÙn<íyP8´Ñ*â´«PüÉlÖ]¸\¼~30g㨾± uæ÷/ãàB¿Þoþ|ûuHâÙù‹OÞ‰z]¯òÕ{1‚n±‘£ÐSC§½:zëŸYëJ/g Må`÷Dß²«ºåìÒnáÊD+JUrXìFÕ¶•žø…MEKïéá3|f2Û:YÉZ½9ûÐ(qK£M(yþÍ=¼×$ /¬ð=c2¢–®´Ãwãž1;³v3·WHÀºÃgÙŠ9Á0Â¥÷µ<À¸ñÀx ´¨êî혞}"ÀcŠé3±D x.&Âzf‹ñí!’xíæ˜É¥Ñà =;fÊ¡úÊÎ52Âd úW¼—ˆÂ]ÀLšƒMÞaÊÔÜ7¦òŒ¾¯u%ý‚™Çg¸Ô3Ýá‰S†ïŸvÿ¿h÷ endstream endobj 3357 0 obj 4078 endobj 3361 0 obj [183 /XYZ 40.7999999 244.819999 0] endobj 3362 0 obj [183 /XYZ 40.7999999 493.459999 0] endobj 3363 0 obj [183 /XYZ 40.7999999 244.819999 0] endobj 3364 0 obj [183 /XYZ 40.7999999 493.459999 0] endobj 3365 0 obj << /Type /Annot /Subtype /Link /Rect [173.280000 733.460000 282.720000 741.139999 ] /Border [0 0 0] /Dest /#ba.Z#5c#b2#94#fenk#bc#ad#80p#bc#16#01#e7#ed#93#b5 >> endobj 3366 0 obj << /Type /Annot /Subtype /Link /Rect [172.319999 254.420000 246.240000 262.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 3367 0 obj << /Type /Annot /Subtype /Link /Rect [194.399999 111.379999 247.199999 119.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 3368 0 obj << /Type /Annot /Subtype /Link /Rect [392.159999 111.379999 479.519999 119.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 3360 0 obj << /Type /Page /Parent 2 0 R /Contents 3369 0 R /Resources 3371 0 R /Annots 3372 0 R /MediaBox [0 0 595 842] >> endobj 3371 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3372 0 obj [ 3365 0 R 3366 0 R 3367 0 R 3368 0 R ] endobj 3369 0 obj << /Length 3370 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘ÅE°Ûv€6à ‡À“I0âÌ!?RIU]Mêãò¸Hª¦ ¸ÛÅE>¾oyóçÏÿ8ÿë÷ó›§Ïÿ9]~>}>ÕUÝÖóŸóô÷‡ûx_ >ÿÚõMŇéÏùë·Ó÷ó÷Ó§Ó§ñßï'Ö^\~Œƒ×WÌþþõ·Ó›ùå§ù“ÏOûß™Ÿÿ2þï—óü´Ì7}áÛ©Úé—_ç_g¼ÿsÿÛ4øïÓßþpþm\B™wú÷ÎÙ ¹ ZÇ÷Û£ìò÷þQô²X]'ÇÅ1ÆÇu6#8þûÏÓÏãl·eTƒd¬keW;ÏÚñë´Cמ;}Nmkn3±Ð‰šZę負±ZvÆ™ÈpoY}Ù$¯‡Ðm^§ †WÏ"à´"¶µ+äñTdÐ÷Ý/&ƒ!ÖEýÐGÂù~GÈÖ® ÇSQAß3 ôÏS…NÄeÐ_Vô†©È ‚ÏÛì‚7z›*t¢¦Ž4Ñ´"¶µ+èñTdзr˜·)DèFoS…N4âXœ‰¦±°­]A§"ƒ¾ïæmŽªfèF¯S…Bl`C$Î5­ˆ…mí zmªOQT_þ¬ú~7<øîËéÍG&E?iú_~Wr1æ_Æí6ã F-¬eç/?ÿX×ìíŸÎ_~9 U3ˆQ_¼ØËHGZ8òÔ|¦'¼G¢ñÑ6gãxÕp¶ZÀîBÔ7 tð{ðN?øï”c yò_€°–¯wŒxÕb^Û‡/#?IÎúÛî^w ¼§Æ#p§ã2#`,æÇ w0r‡¨x` g|>x6ÞlÉQÀNd}a'*òwmÓòæ~3;éUéª`‚|þ@}–ÁgÙLcŒWr']Þ‡'Á/®g`Ëë#š˜XyF‡I'Ñ@ Õg5¨ÍØT‚÷ìÅY°Z¬ƒïŞ騭8ëmçתïS€¡gXš;°ð.˜º4}ñ¯Ñž…Ûò'‡ ßÓ)Ó æFàÌÀEÍU ŸcU#ÛéਆpÆs ­uTÁç¡ý‘N,$ Ðb±)v®a±5 œLc5v¡@/ S÷f˜7i8 Ó/ž&œ¿ |SM;ùvj»ÿà×Óçd†=¢Ãi /éP?Œø  hÚ Ù žŸöE2Dg6VJ1l³¼Ñ§—8ÄflÛA•G6#ªÃlmTªóRŒ«¦• SÉIIä³ „TOèp£VÂ[¨äÆRrÕ.ýö½;ýRŒplP(ûývT:4¯—J=Œwy(¹»r‹gµ‘^BŒ`u«š9 ÷Èà;i„…ªª µ0tF¬+EØ1}«OÁ°€\–I¦œgÑ’Ö!5¢·)»ŠÆ¯Xü|.Ps竇"D#hrÁ#¹* \ŒBìVÕ$s\˜‡»‰òbmz¾Ïî%4XÊiC¶ yPI”œÖÙ_‰ë®ãÛËí\²CÏ6ðŠ[äï¶;Þ4•ÒC$iÏz˜KÚÊÜMn’E±ÒR^ìpåàíFL(‰úNîÅ1ˆ@ŒVø=vÛž°zƒ³– xHÊIˆÞÃ×M9&ëý½ä<Ôý«‹‘ÁšïøU¸ã{Rmuì3 >Ľ”Ð8Ÿ*>dÂ2ûmLáÛ¤ô/t­B‹Q¼œº!Å#«BÛN, ±®Ù Öjþ4ÍäHì&Ü¡}›Ä]nP¬ðJ0®Ù ³€ëê ó˹’T¾€ ¯¸ÇHQè"Ò*o)oýk¦È’ ÇGF±>£F@ÚHŒ›•N@øv*|k¦®ðÜÝ;‹ ¶öŒ€8û>52õL5$ŠÒº››Òm')®KSư{0 ð&·‹#)­fÞ¬ Öþ°7E;%g’Êž}.6°{ÎÝGŸ‰•ø0 ë- éškdû¹o;²n/—Ù«~¨[j¨ŠÎÜÜÉâQñ¹¡‚ÓËÑô5kŽi+ÅËs^ PÁ9¦8GŽ<³}^*ß1<3ûjÀIÈK5„á&¸ê=g_çʯa¦¯ð{ •Îà ‡~áóÁ+h2r”öv¹räкRåÀ7k=ÚíŽõ̺Ýcα‚ãÞDºÚçGáXºAJ¥ÔIy φ(Šh¾*‡•Ž_ ,]l#yv×t[ÀthÂáã‡1X¢´#Eâ:(Gð ðÆEBmÃ~ü ËŠ6W¯­)ï¦4lñÓõrPQíŽQØÿI¹óRiÃ'Í—àìþŒº¯¸sSJ ‘Rlìò1f>Z꫇4\Üøœ« p/M¤1uÒ_ Ïy0Ô‘ [v¾æ<íí‹cÖØ„Á#¶j~+À—˜(æ<Á0>€ëâ[2òA^.. ,|p#>ˆO¡pHtöÁ;%³®´ðÎÂ; ïLÁ; ˜øj8¤¯sòÁÖα Ü9ŒÛàtV¤ÄQ¥D…l–áp» 8X ïýÒì¿KÈ{©×ÈK soG—¸´nœ¢îzh^p倲\s…øtVsï8˜º`7¡°E;Ô‹•xô/Œ¢Ô{»ÊRŠ%)U–•Ææ ” ŒÒ kÜøÅ!•¯ÓTkò!S÷ÚÖ”î!úô6¿ÆÅ e aUbzŽQ;,­ßˆGKئ±S Â[w˜>”²ŠU+TŽ}¨:÷[Õ8}õY-•8MoS3†ö(J;‡ý]æFé„wðÁðP2¦õ¬-éGš;Âo?„p”\áO‚²ˆ† ™vJªû@¨7„ù(õ?ð ÁT¸ !¨Nâ>ܤÆ\O.nX®@‚«ea^e¨|ˆÏæ úíY_ÇŽ.Á _/|½ðõýóuJ"õö:è.’ôz^?Äåv‘S¯‚ß9UäÔCÊ)B¢û$ؾÐ{Îí+-²­È¶}ðè"ÛŠl{DÙvÐ{€\Ѽ»ÅþÈGŸÛÇ$Ùv!A$y$%Œr·=N‘Œ‡Ž¶ ÊÐËT}Õ;ôHëHˆ‚ô‰°v¥ÌÖ¸Ô+Ròÿ¶S!÷•á¾U|Ùb…ùÅB{¤Lj…ã¨5*Ñ>ÐbcdD E ÆîÑQ›µ:Ü<è0øXpz ñb dH&¸nÝX'K³ý«kÁ R}¯f±ØóIÔàÁ%¬p–ó¼š!=ßr§!+J"¤âÔʲjbK·ö5 e­á˜P†ŒªÈGMö;€ƒCŠuŒLlÒ²FA Æ:[Csn{0n¹cïT)]cm=[S9K!#ƒ•³Qެ“–¶e7ýU°`<)$óè×IY…Óþ4ø49ÄAº}Tù`$âEö׆³Ä_жyÉyŠó|§šSä˜Í½8Ž#ÅR=yGzrò(ËÒ˜„HÁy[ æ‘`½´ã …Bngà(6Xeˆ¼5†¦@„2r€fIy kEK"ÎÈ1@C„¢áÙ0÷ÄûÁrrÊE‚d¥Ç[“Í\ô¾$ì£Hœ?Báß„f/ÛkÅ”,+–­x×Z1>¹ã\%WÇÀ]vl çjNÀGóH–Öá3´¶rXi7Xµœlù\¸*Èrq?VýP+Ý=<*5ænQäÞª‹Rƒ“Òíç€eM·IÚdQÁè‘\çÐD ße¸{Ò —rɃ)îI™½ åù'ÀÜy€¨U&=¦Í£ümâ. Q;ld¤ê7d”<+pUv(32±™êgdšpâ‚rj'uEÓÜðëé³Aä$’UM£ài”ľ¸]xìh’­A[ÓÝ|/Û7hÃïy= Ú:´vYzK5¼Ÿp$—ÖØÖWk{¬î®1n¼5‘%©.ÆF3µq ·ð‘ð«zòI”ŒÎPøBó¥4 ‰'a2EÞbãÉ=š´ØCwL@ñåI›—±"5)5vSâƒbƒ…ä!z˜„>ïiêxÈxlL™w—ÚߪòCö¥lVÆ{R!e<6¨NÓ7ƒº$Ñ»‡õúº{ê ’L[ZŒ¤m‡äD­Îî*ñ‘SüÜïE²ÔUhGް,°IM¼úÊbWn#0™êá‹Ô‡Ï¤úÎôÒ‚ÉN}gHþø-ü"³æ–´¥¿ÒáwºƒŠä™b&9RúÖx„óEÁCõjÌùB†ýìŸæ²pâ®t:üNwÀ‰£v˜ÍU‘¿pâ‰wĉK¿›Ãïôá81¥/Èæü¶p≃8±xˆ ²Â‰‰Nîqbœs…óÁ >2n®w…Gu§Æ£É‰sñhCE ïÄ‚³î ¿üÖ’ßÐßJ6.‰¸k…õÙCz %Ž8Tw†p˜lóp"íæ=súq¦ž”‹Ø+õÑ#åU¡ø5©êö‘buJÀ„C“ 'ˆ8eáyÙ¨ w77Rã™<Ⱥ=¿RöÛ#ãŸÏ³gìôŠ(i”ý¹k,¨Ù@rÜv/$bHÿq/†l½;¯Øœ }¨c`p@­ÄÝ*:¦ÈôaÓãË”wæ"‚î aŠÝ¼È® æ)<ÿÚÔÅ Öº¸…takýРL¤ êý“€CAÿ޲¿ž‘ú¢Ã¹PÊæŽKžÝ3ÉéÞ {ÂDfµÅA,Rªí³¤—lÕº¹i;ö‚'f£òˆ(ëV¿ì›_ëVÕÍýSݪ4 Ÿ^ôäÇ’-½#„€NÎ’V…pþÊ`*º§èdÔeÊÅ„ªààj¼ø¶ Þ âÃí ¼ÑIE2í´×dYHj…ô¢ ÓÄj÷‡AVâíÄè#ä?ó¨@úpe>§ÐW€¤«Sœ…Qí¨‹Ö°i)Óìt•¦->ä²Ö£°*ÀRß ¹êz¾Ð+Yo­W škáG,ŸŽÉÝ5T<«‡ß›§Ö ®ÇßÜ^‰oU(§r9±cgâru§@±„.Öª¨S°¨{÷ì¼0B‰«=×ö?@ X3$¨V EA^JRé™Ç¾ÂHiÏ/‘òÏ$¿Y¡N™£RײݡiúXFÊHya ÅJÑ:¤FKI ¤&P3éÔN7œ#4Ü%µ™ÄX…ÛØâgðµE4SÞARraÅCФ@ePð7wūޜw–‘×4WRÀ»qáOãßó÷‘LfúÂòãë7/ïôãû“‘©µwˆjÏlÜÆšgd`m5w.7ÓaééÛ¶U»î d¥Ù°³‡ƒwU·ÞΣ[™ÑCˆŠ« "MSµ³åõ<ÒÁ÷ôð™>3 ÐŽW¼¾´czyg›Ùx£¡ìÚwÍÊ?¢g{m„¡},vªß3ˉùì}YÛ…°nú7¬{É ÖÞ×ðãăE˜¶¬ªç!—s"ÀcÊÒmð tL„;4¬ãÛHâ½sgƒ;4œØ ¯¾¯Ô¦1‹˜XƒþŽÏÒQx ˜‚I+а‰Â;ø{ '?Fá}_·›œ™Ç[8òBŽG”áçO§ÿæ@àþ endstream endobj 3370 0 obj 4542 endobj 3374 0 obj [184 /XYZ 40.7999999 314.899999 0] endobj 3375 0 obj [184 /XYZ 40.7999999 314.899999 0] endobj 3373 0 obj << /Type /Page /Parent 2 0 R /Contents 3376 0 R /Resources 3378 0 R /Annots 3379 0 R /MediaBox [0 0 595 842] >> endobj 3378 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3379 0 obj [ ] endobj 3376 0 obj << /Length 3377 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õõ °0;@c ‡EÁl6Á"³ˆ³‡üý¨[jÛCöG‘ÅGSjÚÀ¸Ç´¨b=?’Uä»?}ùûñŸ¿ß}üòŸã×åçÇ/Ö°žÍ_ÇÓ÷o!ƦóÇaì¡N_ǯßÏÇçÃçÃçéßçïÏ.?¦ÆË+æÿúÛáÝüòÃü›/ÿ2}úßQÿ<ýï×ãO›~ü¼ôwúƒo‡Qõ§ÿž?pÁÅ8ýçí§Sã¿ýÃñ·‰„ñÜïéß„hy׉ :ž_åçï·¢—MÌF%å‘s1ÑÙMìøï?¿L½½Ñ(ÉùÐË9÷:ˆS·ãÀjè“,ŒN±¹uÅ;R\±()âaCãLö®¨¬W¢Só0‡`޽tÚ‘‘::QÄÆ¶°ÞÒ™õRça ¦‚9¶ṯõ‘d8QÄÆva=îŠÌúaÎÃT]0Öž‚Íq(âA#»0öDäûÈX;s«ãcØ0_» ä×ȺNÆéèDÚÌù+]}ŽÄ+x¶<øáéðî‘ËvfÕø‡§ÉÛ&÷ª_õ–qC`Ñ ‚‡ÄüµÐµÏâo«w¨-eøÎ}Fñ>MMá¿âÁ½k’ÄñZ îM¤°MDZñàÔ2,kHQ±®ÍŒÁY4‰ c¬"ÅÚRºW-?VçñOŠWÔWQ_:Ôm³¢>ko”µоq‚mckÄ|ôQV¶ ÍQVÐ,þmo¨üžViçë~=ò*-Ö B£H«dY[¶ÚRWi‹ñir¬x}ïštC¼¾7TžË§ ¬‰i[¬cbˆ ,<ˆ:/ØZ.ßæ‰9ý%S,ަøNÌÅš¹P[Êh©kØþþIç$ÙÙ9 ñ²€=;KΛNöãDÎ+™31ãë/fžÊFÎdü|±tèD Úû8îS¢¿OÌ£èšVŒ\tNDS^̙έÿ/h¤oWøh¡‘òb£{Cød9$Ó(tYþºeÒh_x\{Ä쪸¡&–»+¹E £ZeŸA,—[t뫇…êBòñ&ðO—‰×›+wÎc]o!iøì3 HOSF†Nh¡Á"wWÉÒ-´c„"K÷ØÛ†e¨$f…>`“˜Y°W}“˜"ܰ%¨èvl‘ ÁZ±S7‰Æše؇.zî¡( À$»L×#âbZ”žÂ °64Ôãƒ.bI/³‰¡ïúïÕÒÃW%"ãØiAÄ#2|Z–GhÈÀÝ8Ióìý¢x.B÷Q¦Ë æØŒŠ}¯gË*ï.ý¿¶¼‡Ä~HŽZ–ùl« 7ÁŠ@™(áBð > î.Ã%—õÚ”> 2tf^Qá¬éþýûŒ?Åì3Œß=,¬»O!K,ë!Ä{¬P ÚŸMÖ)ržÇô2}ˆi¹ÐL¾D§HŒ½¥ȯÏ$sâ©­\ìÒØqo³ âU˜`qgPò!V8Yß°J\\WMªIB?–ÔOIÙ.æÐƒ,öÜòZ¤Síyö\Jz|«m×56rù…‹°P»&GÕ–2ZjÚTÿ$_–ê!VÕÛÕ–RüÓ>ñmŸÖ«\¬Ç­”`3µ¥ì–й’ø§1w)M1sî"µ¼¶lµ¥b®R|šd¹C®åµe-sEO§”½Af„¼ãÛ'¦XDŒä$#Y§X$ÒG×Ó,ãV|˜&8¹Ä#õ§¹ԤɎòH[­% ^9˜€´)U„LZÓîsÉ»b&¥Ûï¹æ÷-†ìáa%i.OQÍpÍC†”Oïµ !I(ÀQÊGOÖKjÄÙRÄI}BŒ AŠNëñ2³Ÿ^-SM¥”´(åaPvkÚVéáÓ° ±Ï¦TÑ'¨2Í0Æõ1-Ýã/Ž¥¥L[cVfY*úwR 2ƒð¨è÷'pÄéA¢Ó`î¥N%eÅâ tOVx)L×ÖÔyc®¸·m./”œ:Ÿ3=½ëXµŒjé,#ê}™‹òX`¯ªV ܼn 6=õn†jÏÛ·çÌéUYl³gÙok1fmÙaKMRKâŸDî$ÚZŒY[öØR Šñi²ËìÓ60-ÒfjKÙ-s%ñO½Ì¹j1fmÙaKÅ\Åø´±ÍìÓj1fmÙcKÅ\Ñ`‡ö²¿s`‰ž‘—ö¦”|Å´iµ1+TÒ†)>p]ð,»âO;ý qwý°KÉ„¡;Q.IÜÔýîÔSJ”–xA«MM’JŸç┡F*ÍÒâÞìò>K ‰\FôÁ;QN) \K©Kˆrs”‚SwÝ2ï@r‡/x|æ56Yïê«Z± ­ð)%rVR¸Çé(ã–ÕãÐj!Èr5%j¸×Ã]&™²”<í,Cu:fxÍ #y<ÿÀëø0ƒ‹DÁûäpi™™w—ô~I24\¾¬‹RzŸY¿cyËuÇ‘ç÷©OPŠyS´%ÖÌJrÈSa NëG©[i…P[‚P›:L Ë„€bL'àá@"ÆŠ´x£›~­è&ë<,;ƒ˜6¸âš~½³Bãû¶—sVÆüÅí¬Z)‰¹Gyû}MÌòÚ"m8ãj)2%ÔrEÎ÷Â;Kزp¦ÅÎì”RU¸Í‘æòHÛ<õ‚’ FòÊQå·†¯YÆS¾-äA2Âá,aÌÅòù{×è§"™Šdʰ¹Šd6‹drRÉà]&¼gU1Ζ1Ž\?[F`ÙS¤…¹ˆ9R¾´6†˜*Æ©§ +©g«'.’É…qnÍ*^Axe%›H1¡Ȩé0g¶›üøY÷«•<ÓœMOJ^¢dyÄL÷ÙÔV¬OQŒYŸ{–p¯Xa<²l“\ïb¢G> õ‡X.mš©ë%U³K“—säùK4eó×+1ŸP »˜ëÐé-}ÔgzfÁ4¼mæëe Ñu0>—\šF ýyð>Ó¢÷,ºÉY37¼iy$ŒtXÔ·=›zèx8ìí¤òÀBA´³0×bóËÕ –Üm{nÛ Ù~f†Y”H±ž})‚Ò¡Èt#ŸÍ Az`SR¶=8íÝbv8gÞΆL¹ŠÀLÁzV~ðÕ°8¤öïÛ_&­ÉÕcOËÚ’~­ßîå`P¸YW„õ[À},;æ,0Geže?¥g­Žƒ¶¼P›2¹z4¬ön.v¿¬—T͵¯õÙ²?¥FÈ (Þµp) k[¥i¤\øtåZìÂȆùƒ«e<`ÞëhÅ®œe¬]­Rö‡Ò ÿÚÔ°JÏêSÊ0¥42£"ùcÌ ÎCœN¦¢Pp+»G('•Á¦¯ î¥n%îŒ ª¿ß€žE ÷¬²¸B:Rk ¤>äÅ É ¿šÛ´§ê~–ÃáxÂ"zÃï–†}–¢ï6ÅY¦rË%˺ÿw? ÄÁ®)¸f}Ï ÍFt!' Y„2©Œ‚«¶:,g ‹¡”ù5vÝ«ó 63ØiUÂ]==‡<ŽhܹƒN½¡>ž\Ϊ%8W\?8` 5!×94¶[|"^ ÖÝ‹é«<6»ÏSo3%tÓ¿E‰˜K·5–Kcl§¶ó8z6æ†iÈ9gâ&ÿZ2ŽtV 8“0DtRè!‚¢´ÐJ個-Θ£œ@ñ‘¸7Ñ,ãÁ~G4BKñªïrÛ#–#>ûÇG|Z‹F@øvwHåüK|/ ¶p¤|·TÄMC)m´:cKe¸ÿÏB©`í-Þúr¦@ßß“Ýnz¦ì'S¬U”ù'æa͆²šC9“Ф!”õ1B…‰Eã±&âñî¾ËuE>xÅ‘D5ž3ìLÚ‘çg Ž—üåÅûÄRWõŠŽâqWõövØj Ž,XÚ¥¯(ˆA­Òs_kžB…¬“¸5¾Z"/ŸZVÑ(s¦%­ÿ”¿ŠÉÇæ\“hyÝ 0䘇ómÝ pñ÷µÐvu7À)ÔÝ€º°íÈ;le7 U·Ø íËn@Ô@:¯û‡¸È$j®e•‘°&fyåÆÀ¸3Ì7,9ÊmX«°_;“ .®Ç%­jcM¤XyÞ~¥i›«Ú$iÓ=ù9æLßÇç)¸Lãô˯ß,ÑÆ Sì5L}¶*ë£ëè÷G> ãJ€kïçZ©cËä÷Âéû¦¿~¸ƒ’ÍÌd‰¡ôŠ‘YÕ–y½m¡´RÃ¥ð¥kú¹"DÁµ÷ŒðŸ™Ù ÁΧÈëjx­·Ùí½ýÍ'ø·ËA²WFøˆžYŠq®µp4Ž¥~Æï™Eb>c_h;@€Ö>‹N_î¹ö¾Ž Xw ,`»ç ››\äDà9֔傊k¶€)05ŽÐB-Ö·Nâ± {ƒ#´Hlæ×86ú9ËFÛ5î,K G¡°“(0´‰â;Ä'C'£øŒqd}ÃO7¤8;÷°å»81†?þ0Ê endstream endobj 3377 0 obj 3760 endobj 3381 0 obj [185 /XYZ 40.7999999 446.419999 0] endobj 3382 0 obj [185 /XYZ 40.7999999 446.419999 0] endobj 3383 0 obj << /Type /Annot /Subtype /Link /Rect [341.279999 419.539999 396 427.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3384 0 obj << /Type /Annot /Subtype /Link /Rect [54.2399999 90.2599999 113.759999 97.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3380 0 obj << /Type /Page /Parent 2 0 R /Contents 3385 0 R /Resources 3387 0 R /Annots 3388 0 R /MediaBox [0 0 595 842] >> endobj 3387 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3388 0 obj [ 3383 0 R 3384 0 R ] endobj 3385 0 obj << /Length 3386 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"%‘°gÆr0ð9,r¼Ù‹ÝEœ=äïGI==dY|4ÕMðŒ[-²X¬7«ŠÿüõÇý~üøðõ?ÇoËχ¯‡ºªE=ÿ9N?œÀûªáó¯²ï*>LŽß~=|?~?<žÇ¿˜x}qù1>\§˜üýÛo‡óä‡ù“¯ûß‘ÿ2þïçãü¸Œ7}á×C?ˆé—_æ_g¼ÿsþÛôð߇¿ýáøÛBÿ:îôïÎÛFô~p|?½Ê^ÿž¿Š&›U·°Œÿt#:þûÏÃOãh'0ª¡eLŠVÖÖ£J> [7ò8HqìX¯ ª­Ín(æ;P×µaš b~Kcu+ÍC‘Q/ûæu™RßNÇu®#y#¬ïú0M1¯•­ˆ‡#‘ñ>ÔC ¼¯#y£kèQüQ¼Ã‘¨xgõÂÖCç¹ÊÓH¾èb¬ Cï¯1¯•-xÇ#‘ñΆÞO#y£«‘,Ì@DAèDÆ{Ëy z_GòF×d:h‚( ½Ã‘Èxï„ DïëHÞèm¨ 2½Ã‘ÈxÃl…tÒ]C{†É6Œ‚~…ˆy­lÅ;‰Œ÷Ñ8 DïëHÞèêeh ºDïêHÏA|;þæÛ}7¼øùåðñ k›~re_~™¾ñaþñ2.¶!}<Ù_~<þqtŠ»?_~> U74²›è­'¬EOøGûGð'øäÁ¶šÃ'Ì6Ã< j8OÓÃÑ0®?ÃýOj<Ü9þÉ;Lp¡†8`p=†y0lx=6]C5ìÜU=½Œ2(ºDµÍB±˜ÓóÇÕ%„üÜbú‡£q‚ì4`ˈ uqéf˜sÆäÍKâ z KUЬÁT…±Ó éø¹kغnŒyŠ$¥HyƒÜÀò Sa‡1æÁ4†Ÿ„¥rŒ7ŒkŒ v@àõ@]@Ñ9kÌ@½ŒÖ˜1l›8c©jÀÎcHÆØ1¬KKÊnÓ¥rý1åÑÖ³òè»uÊÙèªfŠ|v:0½Ê­ª¾Ûª×¡½ºS²ª—¿ÊàWù“:ªP>XH’4ï²É¢âSÐâÝW8^Å^Ö"Í.mA‡¬­¼mÔå¤Ù-ˆÚ¨ø«4üÆçÂÇ—FsØsŒ ¬6¼ºK\À­ÖÞ…DgXŸ:Ÿ¾|8‹PÆ×y¼p£Ó˜Æ»ðxsTX—@cU׊éË6Ñè@@{±¨ ƒ<¥ô&¬1•I×+Úäú4ã!Ÿt塎y’".쥻ÎǼeV<¢ñÆ&Ò3pTŠbÕy1„¸7p©ƒ ‚ÆjkKÂaY‹»j°šÕ얢ﰧï#¦d{:Å_eƒýnaS Âh`¼.<ÿáÝ!£F'öbßmmmDÍ3Ô\õc(æÿ¤nk)hïbÒHb»Ø{Cù[ïñÝsQ7>d}'^À¶ [â]—Ümo±IÕ!Ú¹6•ãNá•L|Òˆ ÇûFḌ >·×#%”$ Óã%t°äu¬ÁwÍp'„u39ŽëéyÝÐØ`­9˜Dm‹¾Já%/¾×ÌõŽævÔI÷¬6õݶ³Æ¼(|Ä€mD­"¹Tí8{ðtY`Oú ëóíڷŪž΃"[§Íù.‘¿ a 8‡Šš´¡Sm:¯ ³aìcÕ.G ”ú‘ EœAO»ˆ ‘ÆÍ@kÆOÖࢊJì«‚4©’ œn»Æx”y8„†0öù£òÕö)V¶¯¼é§§³Ž-ùÿ{Íÿ§dßçŸ/ï´ž†pUe¥5ÜüÄ@® šP®ÿÃëO(üà W(òBØ‹‡(œÕà]À<·Kìxî1¡žjJQøîõT) ÏZ»†»jqÃïûaE”– àÑÂÓÅÛ Q1žªl,¥?0´¼ÈÙ½ËÙâ øÅ¸a`kSÑS»ÕS9û»Ô‡©,xV³ÓÏ|Ôvé(x¹)¦[TÕxé$â34©µ³D‡4‡íV{Ø`·Ï2pÉ»¦¤eáÜ'û•‡¹äÐãÿF3Î}ªÍr<,‰›}xzÜÅf¬±v}™BÛ‰OîW GÍ?TäÐ?òÝZt>É“.y=5‰C¦Dæ•u¦Æ±-WIÚ[5¶m±Å‡}|ì•S ø›Y%Ó˜U“a}©sîäEPF^iÚ„Hlª~ƒ$ª¸ÑÍbÂ…»‰N©·Ÿ}ÿ3êÕS:¯ßNg[°Æ½Òg;1ŸÄi/¥C1îxtshñ›µ_U†ž^çÐ,$d7¹B³wSæFÊ»%˜ü†úˆ?ÔŠ#數C«ˆ…Œ«´ Ý%Ë…@åBž„ ñíÁ h^§CPÝåo9úÄÂÂT£Ù·ßÙî6ì2MêÔ²8uçQ$Wû¸,«k^ç·á§Ô­ 0îZ'L du/WÐq" ˆâƒnC2%µ σÍq IƉ©Òz®ÿ¤¤øäM‰›©7Iä«×RÆ;’Oø˜‰À×§¤}Ê´"Ÿò¦ª\•FBòÓÁÙÝHHJ"'‰7 |v}ÎH–^$dÖtM’v98 Ááâ!Œ˜…` °€©ç?oK{DOê5Š%;õ‰p‡3øÎß™YiŠZÍ8TZ_µ ýðÒJgDµÄEÎF;ÝV?pÏÞy@ó ˜×#«¤‰_X©êÂö„žÔÁrã±~P) Cƒ1%ÑŽ`|öjfq5oØyÊŽ@š`_Ü¡^<ëª^ ×a¼aš€+e©ê%8?5ã¾V½„áŽrDI´ Q‘ßѤÞy°FI…1døÙ÷0ÓLçŠj]5Ð(d¢!8Á†¨ "eÀ8¤@R²rƒ4ß®¿¢m èr¿’s—טڣçŠúØ“`ŒtC å¬ ¿6?|_çTÉÞQåü‰93{rFÎûÑe'6Ÿñ¼Ôox™–÷º:>ÙºÇ)§£>ÿà—Ã×Hˆ&R»c}»i±#„T1EnY= ˜ú!ô;åÆŸ‹-R»hï&ì‡oˆv÷Pvb×áǘ››f“f)JÕ^Äî¿NT¸‰Sš :Ñž€JâËÆL£äÊŠvdaÜ·œªsžbu?Úþº‹’}Ÿ BJ­Ë}Ðqzô;¤~“Rû¶ƒW×N¤È@š›è"ª™Ž EÏ\¯’ƒIâvÏÀ±B¢Áý¶úŸÄ–vÅÈÈÐÈ{µœƒ3¯×%P¼{ µcýB–;-Ñ@•˜n}7¨Ú jš";Õõ%ð·»¾Èà 28äeNE n31êI{ëІ„^#zEêíj»3 ^ås—wÿ=ƒ»Ã]6Ÿà1oI-Èò ¹÷ñº:h+” 6ÆM[cöü«…¢x&zšB/ô’Óµkãè’†¨ÒYIá½¾’>hñNI¼‹–ý¢> ûrúWNÿ²0H20`‹ÓWNØ|¤*;åT×#kN/'lå„mÃ9r#ì°jc§&p>%×ÊCÏ·ÛHò›îÊiá´.¥)ùš²[̼ÍbºdaRÈÞBÃÞD!¥ŸeQ‘Ó5ª†¾)‡p;Q YÚö/ôbA/(±át›¦Ç¡íUºŒwº|¨¦ÉY‡Ê¯ …æ{8~Óð×¶Ç÷¸¯»(—߬¯Ï?¸F‹ï …´ŸXó'{kÆ¿KrD)Ã[© R,QnCÑå[lÖbÊZ!¤ Pb‡$jÖŠe–À{€JJú65ä—,¢‡C¶Y÷ªé¾ñ4¸˜ßƒe_߈AÓ77ž;瓦åÐ^{ßOAŽ0‚ʧ8gF†uBQ†!ÑT.¥ FœëÂZnO@xTu²y€¸çPh‚0o·Itkûc6zï0÷ÝH3Â5þA¡¿u£ßzÞöÊ?_–ñ¬YñòÆ*ó/tZ¦©äK¸m °èàðøŸàw l\ÃÅ ÊËÁ¨áO³Ä-/å)Gï†Ìd«†~רŠ•êõÕwì5;t«´÷*uõ†{ö÷͹˜q›ºÖ¡hh_fê^»4\»Ïtü{ü>RúHÈÓ–ß~u:Ó=;-~6rñÕmÏVÙ¸ŒKW LT¯¢ðØÔí{ž¢—Ï-‡¶Q8.+©îÚŒNyáÉ,zš¦âƒb,Z´«Ä¼*E_š§‡ï ð™É$¯xݼsÏIqi´™^Î?y„ß]Øü ¿ w¹é CëXÁíeÇ\Ö¾ÀöÊT7ýÎ;¶6UX¬ŽKóu:À´é`IJ¬ªåû0aŸ8Ç”Â!/`tJ„+4@‹éíÉ“xíœÁÑà ;6ã«ï+Õ.XâN—°Ÿñ^0 ws0 š(²ƒ?j4ù%ˆÌèûZTLŽv»µðøŸœ¥p=‡ÔáÇçÃÿ<Æ, endstream endobj 3386 0 obj 4233 endobj 3390 0 obj [186 /XYZ 40.7999999 768.019999 0] endobj 3391 0 obj [186 /XYZ 32.1599999 505.939999 0] endobj 3392 0 obj [186 /XYZ 40.7999999 768.019999 0] endobj 3393 0 obj [186 /XYZ 32.1599999 505.939999 0] endobj 3394 0 obj [186 /XYZ 33.1199999 345.619999 0] endobj 3395 0 obj [186 /XYZ 32.1599999 347.539999 0] endobj 3396 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 460.819999 142.560000 468.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 >> endobj 3397 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 452.179999 135.840000 459.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 >> endobj 3398 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 443.539999 206.879999 451.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 >> endobj 3399 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 434.899999 85.9200000 442.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 >> endobj 3389 0 obj << /Type /Page /Parent 2 0 R /Contents 3400 0 R /Resources 3402 0 R /Annots 3403 0 R /MediaBox [0 0 595 842] >> endobj 3402 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3403 0 obj [ 3396 0 R 3397 0 R 3398 0 R 3399 0 R ] endobj 3400 0 obj << /Length 3401 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx=À(âCr“›] ‹¢‹"Óé`Ð šÎ¢¿’EÙ2©#’²ß¹×’E‘‡çÍóxó§Oÿ8þë÷ã›wŸþsü¢¿ût¨«º­§ŸãøïÇå®*Á§?;ÕT¼Ž_¾¾¿>>ÿ;°öô þ5Üœ_1 øû—ßo¦—¦+ŸÞýeøëG~üóðé×ãßþ>üúI7~áëAõíøÇ¿§?g\ –79üõ‡ãoÃÔiÜñÿ9oU«Móøv~”þ-E/Åú®=2Ƈy68þûÏÃÏÃhçiT½d¬keWÚñaØaÍò8-Zf j­-l¨ÍI•h qFlÛÒX-;÷PUS³“ºaÒèï©ñ-7¹–ÞyMîÕte^3¢J6ˆ±ágå5ý¼!rÎÁ—œƒåÑæá|‚QË,^Q8 ¹2Pn(Ô(p …y긜Õȹ?Ý$è;žôÆ@»¾ãKÐwüvA¿ë×6p¸÷Óbúìý<£„9àwñšùOÀŸ?•…¥ZýÿÆåžs¨`PUȾëNê¯û­ Û<ÔVÍO0Õ¤Q!DZmK›UH<Ô°“¼“MÝ+øwøÒGõ´t¥¶Bñ<ÔÖ©Ò 4Έm[šÞ{¨öb½Ä¶öøÅÚsñЗχ7úѲýüó0“y<ýúüõ Ç×&_?|úéø‡ºæoÿxüüëÀªF¶ªkNß;Ý©_OwšÁ˜VŒ7õåã§;]U÷bxby§?ÝQøBÝœ.ÈJN.Þ×™ÏJóÙwÓ³—o°iò|íòU8ÅZ¢ psukÎȼP«Ó…¶âL¯1çê4IÄ\-ØXs… á-a§k6]ü*ô¤_?’ß¹Âã%9ÞÄD{õL´ö*ž9V>|- Yô¾r›Ô1âYDù’ ‰ÔqÐÅÖ¨qˆ×¼Ÿ_9Á¸¯š‹RßyîÔ3}ty§†KøLŸùpÆŒ ¨—g¦;ª’Ì=\[)Ó8#N´²m‚tÔ–_ïÝ;ô<¼üŒx…³†ëÑÔÏšj"þÜ8\ÏÌ8y;Ý2ç–‘³M’œ×ƒŽ®ÝCÁ="ˆ8bÔ×`òŽa—o‚3ò‹v‡xö¿3+аÁ‚+ „÷Ha.ÃZW„ú'`®:b„l W„ì¯ZZ•)øT¬€YxŠ÷3ëö%`dL x™è,föaæÓÖ½À;-ºS¿Â;Ýáð=$x9¹þ`a^C*¿-f¼Ó¦LÓ_1ÎAÓÁà ˜Ê«¥_êÄ+ð1õn[þCi¤ÕI³tØ•XÆÁu ËF€Ë²ô Êû"LŸ©€1Ø2l°M‰WÞTQÙrÉï ˜ÈY¬M U;f¿Aî’6%/7(Ó1:{v¤úÆA)1¿¾A®1,Û‚¾×>Á!áÏ®4hN5ñj¸¡!'YZ¥Yâ {‹#ümÊ_0:æŠÅü+4‰u†åÇî‚9õ™ÉR6¥ÒB3²6Ñöos¨ ÖùÅêÁêÞ:Œ!ø=áÒ/É) åÎÆ3ŠHðž?Ø<˜éD,+B'ö²Ý˜8‚ªý,÷ Ãá¼A‰ñMEøÂÂÍJÇNcn{'18SxbÜ­eÀ|£ªT__ŸšØÌ|Ãa=Z^N3¥nM­wo÷“±¬!{gÃÐ68¡bÄABµ#¯Ó{̹F–§Ó{R¬©qEêùmÝ1øÑ+˜p!‹dyEh'–òŠgb² K¬Z¼]¼—n4ÛL8òp±QÔOÌ’|r=g¨ëM4Æ–‚ß)fIB ÂXÇ–a;ܵÑP”‡Tê#NwõlÅ2ΖBñ'ÉU×ÌÚ¢£Y¸ŠQ}9Â=Ào7ÔXIRæú† SŠ ’N;’ Ab8¾ß }ÏýÚJb¸9æDˆb×QP+Ig­$ÕþJ×ßãèJ?q ¤ª»)úÓ¤>)íQ´fâ•ÛäI « ”¿övª(ä‡I©ûgB“LÇœv®9¾º¥¾m–3J³Í$¾ÆxV»lâšè;ȇÂ¥UÏ™!­îR m¢UbßË¡cTÇ &U„³‰R'Ú´»óYÇ]çßÊÉžµ/J}ÇðñpgLàBÒo Œ’b·u’Š5°ˆb‚2º›>°»²­ä äÊàiüŽ^ÕÃF™ mæ2K<ŸÔR® ñõÙcú XŒÆÚÅ]î³É,f0IºåÌ 5(‹8)õúIÖ=¥ÉÝîG¦ û{f]cŠô¾ZÜ/ 5¥<þ£p’¤So%qfoøN鎯¦KÄQ#…."ZÛG“As´÷·JsØ")ú.´+í-÷`ƘM;щT9Sìjf¢PÄâ-ü°4dLâ”°L}“šàI„ㆴ¹˜ŽæÐÀrœ6ím7&Y…Ì9Ê y5}1ÿ†¦Ðv"òJíT«d¹P饸9Ô(âH(‰3?Eÿs[Hå8)y”\á˜Ý uBkæñ/wÞÂÙ¿ öà ìˆÉbÇ£•²è Šx ²pŠmÓŽÄÕ“œ¼Üw*̆ƒy =J²¾TÌ=™¶;Ü\*Ô Sõº"Ô;§ÅˆL²BŽ,k/ÂeR‹Í ¥CʸCùlS2×Þ—RŠF"$¶Ï>VfÎ8%Ý|w!Š’TJâEaˆ? èsƒ«˜ñÜ{8²çB»16ZÚ´b af9Ç èŒKá剅µà !f1§­8ŸÑó"!‹šá bФ&ĨoŠ7ßùå6’É…(lÂ_*o%²ýCÈʤ…d®dp|_®…B“üŒSú–ó,¯ME U²'ijš'ª)"ÃoJ%­q´O¥†œ1E2™}DÚ4%WÍï6„þ£¤aš[¹Yìž´³›ÀÈ“0ãX²7Åþ!¸býÖ'%t¥˜ÑÙÄþ$=í‹8ðLë¾Ï\ÆmgR™ûqÈ€!ÉùvJœ†ÿDÔ©MQ:¿4gJ;“<ÝÒ¸hýç!R‰`óåÉæ½á´ËBçu›a6mw5gäöM'6p{ŠÓ9Ââõ IÊhs¹*§óûž[_éÃGnîÖòÊ„&‹ÚØöC½ù•iù‹‚×BÓ¨„¼¶st1‰Zž<ÚxX9½™[šÑÚÃ/æ,çšÞö4‘vU¯Ì;pü¹¦7˜ ߆Ü+œ¤Ðò[Gù…LÒ[Âdñ æjgÜ|s~M¾o’TûÜ?Þ!É)eŠ®ˆHû-‘²9N+ƒ–÷ã˺u/Á…É\v—"{™&1¥/W?@5Æ;ï)·lùø¼8¯ûf,vâA=]9ã Z@A„`/;#¿Rô‰räh%))•â  Ú %£-<ü-B‘IS¡eÇàTU[¶Cž`¸çÉwÒbqÚMD  £ð˜¬ª£’ ¥½Ñ†¾Q 4õ†¾8Ç>˜š9Ð9E RšsvBù¬‚Y™&ÂQJÜ—Î ÜckËþð6•‡7d¯Å4U T÷O>7IXΚ2i,¤$ßG2v§ô¤%çÇÚФåÍ:¤‚â™n‡=ȰP W7 7î€Â…N1ƒÍܽvƒfã),Aw*絟/Åf×YÏñyÊ{»rÇGß“K;Ï1å¼Ób„`QT8¼dÌsß3CD84&ÓÍÓ”½´Q7ž΀F(6 &' àÚ{Öî]wé1Ê‚ÝNy¥G2ßk 6ð}ĈâStn²Å'÷­ùÎû±CŒ×§‘ö4Ò¾_#Íqž¶õa– -OãÌK(9Ëþõ––~?öMºÓb÷N¥OÛ& ¦,ÅW…ëÁZ÷5¦.` wç’77céÜ[Qƒ´ÅÜn¶øhÖî¢ÒÞn³¼±2‡J{ÙTp<a?®§Ñå7ºJ¯fC3®qœìP½mzSܤÐfXw8®’¢Í7te±«ÊDH` ô(õ¶60ÊRmŠ…¨Ïåùn¤AfOÉ‹»[RQ‘?J“иÐÑ48I¸Ä^•¬*Ûã×`,ÌÛd'¼÷réX–$ª^Ÿ•·Ai-%zF6p´[s¼tjoŠ~N©Òõ¦XñjÀÖ7ti” °`þΪK§:ú {cn£‚‡{§0±ôêOu–bšöWMˆ;݆¶iÔ -§8¶\xMDž¤Ñœφ»Ùlag6DØ€¿É^-}Ý<>I^4ËåŒ!ÉæÙIH‡ºIR鼬NŒr™§ÎÎ>ð N­Q—D¤‡w÷‹þûEJå 8‰HÈÓ,h˱çãŸʶ3„GZ×cL‡Ä$]†üÅÄ6m’~Ï.ì·Qå\ôsÀ–£V+Ꭳ^-ŒšÆuqí'Ý‘fí¬«F©{騭º8üLÁZÅòÜòŠ7ñP”Çàhø <‡{/!ä%Í1üÂ3¸&²$¬GC§ ¾ˆ¹Nð“óÜ+çáp´áIͬÐI¼ÃI+:*'ã&¼GÔñø÷ÑË8/ŠPÝÑQu›eEÙJMJGEz\ÚS äî€á†GÃ3 À×ý.ÙAv\ã?ÖKð>&­-¯»k®Í s! Æb™içFBYëXÄ>.fMêÖƒõ9Êz(³†£5í…ΆÇoAº¿ÖGýëËW…Ù¤Y_Hó£“8ú;å¶G6,c-Ÿ´gítzwõ9ohB¶¶­Úõàß^V–)= 6ÞUÝzpA·rgÚj!*Þ¯ž5MÕN¦¹©Š­½GÁgzøÌD<¯x-®{(¾ÀÑ&6±¼ò~W{WVø=£};kwZ‡ö“Ä=£w,fízn'Ø€uãß¼aÝ5Á­Á€ŽÑ44Ö3Z-kYUw×½45ã] î Æ7“¡Te9Ôl¬òíBÜn¿G´†qÇž¯Y÷z^›-Ä@<[Ô#f‹ß¬¸í7nÅy¥ê¶bcËæPä×È×î,ú¼|L)ƒŽÿ-¯1Ü endstream endobj 3401 0 obj 5151 endobj 3405 0 obj [187 /XYZ 33.1199999 746.899999 0] endobj 3406 0 obj [187 /XYZ 33.1199999 184.340000 0] endobj 3407 0 obj [187 /XYZ 32.1599999 748.819999 0] endobj 3408 0 obj [187 /XYZ 32.1599999 186.259999 0] endobj 3404 0 obj << /Type /Page /Parent 2 0 R /Contents 3409 0 R /Resources 3411 0 R /Annots 3412 0 R /MediaBox [0 0 595 842] >> endobj 3411 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3412 0 obj [ ] endobj 3409 0 obj << /Length 3410 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€µ|?€ @æ ‡ƒ Ãc'0²FÆ>øïGjQݳ¤>J¤(µº[3ÀN¯Ø,Ö‹Åb±Xúô·Ï?Vÿþ½úôøùÕ÷÷ñóÔD‘î§j¿ûø€™š³î£6²f¶ý©¾|=¼Wï‡×ÃkóïûªcG÷§iì‡èþþå×çnðC÷äóã?šOT¬ú{ó¿_ªïhþüäàµ_øz0VµþÛ} Œ2Óüçã§¶ñ?‡þ©úµAÁá¶ÿ~ǘҖ«Yx¼ŸºÒãïÇ®h°–Y\XVQÊiZªþL}þKõöËÁÖÒr-;w²ka¨…ÔBl±°å Ž£` †ö˜Ñ)ô7ØÂÿšŽA¯1ÖXÚ˜£pœ¥k<–ÂK:=Yš˜#… =ÀòÁ/3æi„Ò ²4žgHk/œ?L [ †0ˆ5ï(}~k¬úâ6šÉqÆZ `ÚxbMJ;4-ïÕ eg©à‰>>QgÝy ¾b½¯ˆnƒ…§"”ÔJÅd0…?€£¤{Âk.Ž<:·t,Òµ5~ „OY€.þ.„‚ ýŒZ°Ü:ɨZÉö9‰QxZl93”}ƒ lq&{hd[J1-˜?‚SqÝÏÚÞ¦iGíy–têhüeCט¥e§¾²>êpé‹,ØÛw&”>•Òã¡£àl>œòz·|ˆº›P!r@ñ¦pØ"à8'³0¡H0%öÁ¾TCúŒ³7Œo¼@þxì9Ÿ\­5|€©Áú‚Ç¥3¢ã}±¤!ÀÒÂ-Åì#šÙÜjof»–²ž¸)*¹.>ÛCޱcŠ&3n‚ª`ô ¨Â8c„fÐù)f j úÍ.Äž>øLò¹&+jcÉ·~@ , `ÝnÁLЬÉ)f ‚Ïëí[”¥·í¼¤í€áÎ4ïÀ-8¦€1À;úŒ=xdGù–#9ÌQ†)…ôDb1ka c<'®ò°Þ|Öt\+® nµ¯˜•]ŽfGúÀP¤ŽoÛœOà•0£²‹ÌAØÑ«­kÒ3´§¬¿I3ý©ZoTÓ†Owh;þPQ .ïaÉmݳ0‚êåîY8^)6cmÀ:r‹vÞ˜ÓtE;oiïûE,fÎIv†´–ý݆±¼÷$ Ô?l"~–”pDö+Z +gy’W¹BâÕnMÛÓ¦£Í°Ó+ù ׺||g#:fûÌsçÊá?fDX_© ³8ýsY%´–Bµ!ÿ³!öâíñ Þèù'Æ(¤IB kdPi}qÞænuÁÁ„ôx˜¢w%Ž7x¨]‚à"Gl9“˜[LLÂAsBJ>ÿÌ8\\#Ý ®Á’•°$Û—5¹ÂÐÉ&—bÚãÊáÔ×üàù‚ª"¥3¬·šÓ5žÕàv…Ép^ >6nBBËc9'¡%'m¥¬¤g¡&ÓÇ ¤.¢_ÜÀ"üY‹/ßOÉšŠpÂ1§ü"^Od¼™FUÍ™ÌZ[‹dš®›8e›1ÌYì7o5?v…½¿2ã²ÄV »Ý“?Á»[8wzh!Å#Åf‡©˜Á› 'Ý"giÉ=?×ÞTسLWˆ Êú3¾-Ÿ¶9¯kZÎÍH|S:#"Ògçhwu²)¨¸™¬x²)Ú8õè¬ÛÏ×nõ|-Íúm!ؾÀ–È8P¦‘€>)ÉX›®ú'×:×8àš£ñ‘q0n˜žœLÉŒLß äjîvtŽ]gEÖýÎgÙŒ÷i’®XÈÐÞjÎ çñÝiÎv÷~]$ìÓ3vÇr‚‘áÞ5#Š’À*½Šó„ã×EJì%rÂÀA—„Ù½ñcuœT`¼u`? )[z á*V4¼rŠ~4öúÛˆ,3sÊ®½Í È}xÑØà–ëlüÆ àDŒJx¿1èxÅø¨ìöZŽW¢wW¼1Ø´ŸhÝWšÕÎJïg ºüzrƒõpD[¼_ƒ¦ñJP3>ï3tä× q.úºâ$ô©Êô†óhn1·CØ“/»çv9"éuÏíØ¶/pùÜŽ[ËีØÌý䪸¸û:V•{{Û û9ROàÜÅ=Ž=s·´'q_Þ4ö d²¦w§Èœ½àîÝíÞÝîÝݦw©Nˆù–“7{7æõ¤×Y§˜‡[Ô_ÉgU§R–Î\SÙgGœÙ–€5žúŠow&ä˜$¤K©”0ž¾6žey7Éœ÷V“jBÖñ2¥šf¨ÉåÓÊR~索GzÑÀ%ˆ~¹:­ ™™âɉLrúíësŒº{“j¬ØLÑbL.pZ„®7 ÊVʸۑs³a‹…ý„0=aÚ¬“;OýÄÖ2•+r„Hxz‰®¾†ÏIëÆËõ8£3 ¢æÔÓq®ûÇë>Pˆ?¢–þm¶-ËWÑ2Êß \NXfË^€šaÛÆÓÝçÜà›u÷¥Ä<ŽTŸš¾B¥oVØwZ/|½{±·âÅ.S›n™-Ô~y«Äå­%ßÉKùn/v{±{±ß8\ÈÖ”)Œ‰/ &ìzªâŽ×Äd_]Ö_]f:àÍèeñ]_~™Ñ2Xf®áÖjÑÀs‘(}FíΔc—EÊô—©}5ÕæEû‚ˆK`Z³ê·&c•ÐR앱÷/t[]Mõ·¬ºµü€í2eÊãá…ý%iTÒ£qV5š`s0½¼qÙÝPúK( 0ÙTíۘܽ E«ÓÛó\üŒùŒúø¤³J*öë}ÅQMuo:Ï_}ð;;¥¼æ÷|)ÚûK­ñû°øJHPöeÂë&µÇZ"ç^PË”plL>wjíÞR’Çø)äc®>€]PÁ9'ž†‹NÃY°Þo^”®$Á„Øq ¥áG ñ¥×ç.ê-ð-2šŽ„øœ7Ùd¤¤dL7Ek–î2êt—Ør1èœ" p·³k•L`-WÔ ÃîN+NæÇ¥3ØJšÄWLó·„ÞVP|Ñ_•ƒ¡/ µB”µk{­`äî´Bàq nørZYÙG°¦+j…<•¸ÇW¡r$œq‰-VÆ×‰34 _]„É1ðx¬Ëp¥ÂÁpŽË?Á>eËØ1(ÓË_ÒÍyEJÙâcYÅ2Š^Y¼9)ä\Î̸p)ì€gãØ¥ð£õn~«÷ÆLSu4»îÏ—¯»|r6ø¯Q“í:ÞUmÈ ðZªêc<¢úP¥¶3GJÕj8)ÑŠ:عw†—éZûÑ…Žz ¥[Ž9¯™Ì6–²VÝÖüÜ¢á8ö±°Oç.iV3‡ÎU† uäã“'ø]wæ6@á ê㪡ŠèpŽpZ'±ÚnÇ 0CëÚÏLžO°ä_†P™®îâ…1uP£>”öwÒ¤ð„æ–iˆ†iŽè ¦ã9cŽغ­Ñ€æEp i%ƒçÔc½5†¨š¶Ç&SØíÇp‹[K ®#Õëáÿüý3 endstream endobj 3410 0 obj 2948 endobj 3414 0 obj [188 /XYZ 32.1599999 289.939999 0] endobj 3415 0 obj [188 /XYZ 33.1199999 87.3799999 0] endobj 3416 0 obj [188 /XYZ 33.1199999 341.779999 0] endobj 3417 0 obj [188 /XYZ 32.1599999 343.699999 0] endobj 3418 0 obj [188 /XYZ 32.1599999 289.939999 0] endobj 3419 0 obj [188 /XYZ 32.1599999 89.2999999 0] endobj 3420 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 244.819999 106.079999 252.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn2 >> endobj 3421 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 236.180000 108 243.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 >> endobj 3422 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 227.540000 140.639999 235.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 >> endobj 3423 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 218.899999 188.639999 226.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 >> endobj 3424 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 210.259999 136.800000 217.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 >> endobj 3425 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 201.619999 156 209.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 >> endobj 3426 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 192.979999 130.079999 200.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 >> endobj 3427 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 184.339999 103.200000 192.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 >> endobj 3428 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 175.699999 102.240000 183.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 >> endobj 3413 0 obj << /Type /Page /Parent 2 0 R /Contents 3429 0 R /Resources 3431 0 R /Annots 3432 0 R /MediaBox [0 0 595 842] >> endobj 3431 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3432 0 obj [ 3420 0 R 3421 0 R 3422 0 R 3423 0 R 3424 0 R 3425 0 R 3426 0 R 3427 0 R 3428 0 R ] endobj 3429 0 obj << /Length 3430 0 R /Filter /FlateDecode >> stream xœí]ܸí}~…ŸÈÄú´  d7Ù}(°H€>}(öz=.‡¦÷п_{,ÍØ¢)K”ìñf½23²LQERE½ÿóçVÿþ£zÿøù?Õ‹ý|ü|ªÏµ®‡¿ªÿ÷n\ÀÍYðákcÔ™·ý_õòõô­úvz>=wÿ;1}yÑ~t]À?^~?½? %ŸÿÚ}û_Å«¿t¿~­þþîã' ¯¯ðõdZÝùmøÂ8ã¦û1þÖ?üåô·ªß;Ìnÿÿ;ÎM]k™…Ç·ë«ìòoü*ÖXO,UצbŒwxªŽÿý×éçÚs+k´lêh¨ ¿€íhÐ6ºR € º‰åb]ÿŠê1bY=cµl‚Ètgº)Dw)›\œ‹BØaT†î($2Ýy#/ì¾fÓ˂ʦ—R¦Ðv±¼®9Êã È¤×u;^Cù•ØQ*›b¦Ôö±¼®9Òã ÎFÛ?ô{LC¦o¥Õ¼Ó'µìThFÕ¬Ó‘è÷ØftÍšM›Y¶³M3½Ø[b¬û›iæyÙÚIDàf ñ±-Ä+YA{(~¢ 4j»ÅO·n g­M…úFn©àðh«1Vmg…~Þ%éy)ÒóžOHÏwLúl®ŸÀ;нíÑ`u¿kF;¤9"#^5Ç[á?ßýÚ–þí-[ߎ‰ *7¸jç·U{ˆs¾œÞ?µ½‡âËÏ2í¿>¾|=ɾùnõÈyõå§êǺæòOÕ—_;ªŸ•Ô¦Q—z—'usybnüRМëVtëQÕÇËy+ Ê³jÞªrUaULúïúíò'¿†öaÔK0(ÂF¨Ì`7QŠÀN|À†„á#Ñ^ ªO=H,Pcñ•À€›Ë}æÌ,1>èð±vWxÞ è…@«ÔÀã¸âãùéòD7Œ«:гâçg Ï-÷/G¦, Á§/L^I å‰X8Gp’¢èÎDøxठ˜Wf"0`@ãíà='àVVbâò EÌPŨœ€ªÂ} ⥚¨ÆÏ†D•°Ì¹ ½ðqÍ gÔ\ Ÿ:>¿ø¸Š¡7í¹ÑJOGéçŠ:ɘe´l·Åëßßá2@,‘´$§9›¶öH:ðS®ÁÛ“è{ˆŸF€½qA Ö>Ï,W0ÎL‘Íê¶]mʈÙOè+\íUÔ@PYÔ@$Ç3"ÀDÝa½#Výu.\’lµ¨a'› ôLYIà@|kMJŒ&R°9‹ˆßõ•àÌ“Kp/ÊVÐ6N¨•€Ké,[¼ˆ[ íŸüTj ™ÆÆš­p–Γµt"æž| ((4kµ$QG µò}—ÔÁGÎ ‡$ºQx4@”Ö ÒÇ”4r(4‰s"¡‰÷•; å^7” çD…BCÛ¡àÆðwpù†J …Ò-€5þ¤ÝháÁdãšD—ãE4oÊ&ÅIðs,/ŽÖ›?UÂöÀÊËÙåÁN1fÞâ à”†Ý¾÷N@Ž×´äöN”ƒ5~‰a'ó&v5¯×±Îlç6ØFVz€ö¬É¹’éš<óG¿Ž³(eÇk‘IÚ½<_Y‘ ¢Œ±+”ã&¹‚K졦(T‚}²R°Î^vfWš0»Ù–,âà$Åïêb[§kêeèJ¤ÌrðXŠäôœ²AH ¢$ù”!&Jì'.I¤,È‹Æ#–:¤ðOF¸†´Ý™‰-ˆ_'Bz¢ýæ %þ ÞáßÝpÓHÔWܱitlýxlQyt‹cÓèµnÌìy«kWS„ž’jQOf a6f-*pmD‘øØ×Ó{*p~Ae®sÊå88ÖŒŽ¶À±.ªsHŽ[TçPfúVîæCS–\vâ툇 ¥ª–ã¨pi‡Ë€¢œdWžÛÐʈåtXÈûž÷¸>{;4Ø…='kwîE|ܰÕk 3C= 8'¬‚¼ÃG(ÐEòVx”vÊ>ájC®Pí›ãŠ­Öãe¹Bð ¹¢1oŽ+îï !É ½!W´Í›ãŠ­ØÁ(Pô;ν8uðu(aÖžà›xè;$‹ß`Ggp`ã‚°•úvä(Në}Øë sÁ8[† 6J;ʽ™`#\p‘+õæ¸â\äŠV¾9®¸¿§kïႆ‰7ÇG¸à"W(æú}„ á‚aiu„ îzåôÝÂ. lëk¤·Ú¨ÏºaÓ«2â¯U!Eøàq<è“ÀEv~\Ùп•ƒ«Š\‚—6 ½|gÎ è@Ê>ÊE”4ox4Y‰;rW¾.*>¤1p™MÁtÕs©Vò˜.Ø¥¤.¤d›ÝŽÞU“Y¶žn\£DÉ ¹ç›!›8!Dw7 W—ƒMíî“îeŠ Ê ωè.r“i‚æYéFÚ¢÷j”½Â0­Xx„©¸œ“$l¸­Už×ˆq_ëŒKÂèÛÀ3P¥õªÈ¡“¬7 ºK8o/[Ñœ[3þV÷éjËKܶ¯z7°Ç¯çq­K`Î ™R3.‰†QâÀðIˆ¢G‘bñ¥Û{§HÀüÚ‰ñ3µaAãwô.Î °^…dž2_á—p®jÆ™¬­ vlÂíŸ3+ Ö@zÕÃO¤K£pQAIK¿¾5nZO3$œJK9WöÖ°uÏntO· ΘӖ|Jûv:Ž(PãÑ«a÷wÁ+E,4ÁgïmïyK×ÚËÄ õ¥}ð48g6PÝgªÑ˶Óýj¥Ó;¡6¨3P”³÷šÖSÕe'¬eÐ!> ÂÙY &â ú5ŠÒ@ÿækõôóÂB(ÉG”ê8*ÎÌœip``®’$" ]ÛÖ8ߨŸYö¯oì߈ªãbÆ›søëõwǦ®Ö4Œ™K©èJêóEät•mÉËI·gÆZn seÚŒ¡¸_C]}û[÷¯UÞÛ\ùmt%/'“¾–C™öãåôËéᇠM  ‹ ,^áy‘ L¸£ÉYbáÁ ,Ú7¹ûã*vÆw©.”–ï˜ã‚ßNŸ39Zª)GK=ÇÑÒøÜÖ•ŽîÊ,ÏZ(î—šr´”s-hC@Žîk‰1”i?îÌÑjÙϺ ·Jâ™?aÿjqÅÍÀŠ]¸ä3°SÖr޵ö™«+ Ü•YµPÜ/1e`ÍçX3Ѓ Ü×c(Ó~Ü™µñ4ðŒCžpÃnž)uL†w䯊¿D0Å}s_Vô\îØ~˜q\¨qAþ\6l:— Ÿ›ËÞ<ëJÀ\îÊìlµPÜ/6˦ž›ËMë·Ñ•€¹Ü\g¯…2íÇç²q±øxž¦×t&ÉIïÝ$y§ïæÍI­ïYv¶ÙÐU&À¶ÈîDp´|3n‘'Ĥ _¾µíD¾ñºž‘o¼æžìéK|ùÖ—i3†bå™mã*ßZ3'ßÚÆ—o] o}-1†2íÇ}寯ç>bòíÞ<·}²®Ýç/‹†¼v+SΛqAö4älêÅé†hnrߋӗ€iÈÝÄsPܯ©‡³9/g¾§/ñ§á¥–C™öãÎÓóïb"8Fè%ÕðÖáS”k|áN,º\\Üu‹"ÜyøàwpùBDLg\Ì9θðg} "Â9Î÷kê8ãbÎqÆ…ï8ëK€Îqæ Lûqg!r½f$°½¶ÿi˜s¯{‚½,*_ãŠôè9&ݪ3>.ÈŸcjêÛãjηǕïÛëKÀSη砸_SßWs¾=®|ß^_æ˜r¾=eÚ;Ï1uõí¡_Âç©™¿mˆ>³ßÍÁy.Þ÷µã͸Ê-Ǻ. ò·™:²x3çÈâïÈêKã6Α堸_SGoæY\ûެ¾0®¾²j3vdÝÚ¸+ã6ΑpJSäž ;Á›Bñ³dnò¦¹2î¤ –qiñ¡°R-ÄUR aÌ>±ý¾‰Fh€ª˜ôkXSbä¬zrЇ ‡9‰ˆo¹=¡rÈo8äÁWå(S¢O€2\ß.)pöÅ „ƒ³õízÑ” ä"õâ¥ø|ÊÞö°œžF»÷qLâW¹$”Ö9º|Üï>QQ§ü2–V¯Ûµ“p( ðÂ&QL´ÍîxŽ&Ðo/p† œ™L˜[KUW èž6)²8IPâ°|Êi¸Œ3š):áônŽç§„§{óíù\^B ÷'œÃH9·CXÎ ‘r\§DªˆÂyŠnj¬£¶)‚ aƒ©D^„U-ÃUR«üNàôi1l‰ÅZ­|„ðœÌxfß²y‰ðüaøírí¡sKS#™rc%áFÄΜåÂwaq—;ÙµÀ’¹cƒ›û,Òÿ$¬Ñâ3ø”éEüÖGÆŽyZGñwJØŽ9; bÀ˜',zJ˜p9ÑY¹™(ö> endobj 3438 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3439 0 obj [ ] endobj 3436 0 obj << /Length 3437 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`="õ ,l?&@3@AÁl6Á"³È$‡üýÈ–ìî&ý‘¬b‘’ÜÞÁîô¶lŠ,ÖûùáŸÿ¶ÿÇ÷?ÿ{ÿuþûñó®:T]5ý³?þùáõ/t¨õô£éÛƒŽÿì¿~Û}ßß}Ú}ÿû}§ºÓç¿Æ‡çWL þ÷ëo»ÓËwÓo>?þiüé{½ÿãø¿îÿò×ñ¯ŸçõŽø¶ë‡îøÃ¿¦”VºÿçõOLJÿÜýùwû߯-ô§uÿýAëA«A'íãûå«êôçõWÑËŽÀêZÝì•Òã>Ûÿùûî—qµË6C£”éSE¯jôiYÓí‡ã¿­³¦s´¸•TêBÝx‘…ÚÓ")'SUc¼+±ánêátÈÖ¤žò¼R2¸Ìx>™…Æ©¤“áWbÃ}¨çCÖuê1/K%.dªÎÈþ¸#•v´3äñR\ÐUÏÇlu*Ä.K¥.¤û^f¡ãŽTÚÑfÐ{–bƒ¾n&–ª;Wtz^*b]%D>Ç©´£A—:Œriúþó¢þtòväjã+÷‚7ÜÏ‘,O.+%ßK?ÔB B@ž8+}Qðô‹‚÷ÝóŇ/»‡£2ûå—q'xúëË·]s|ý¨hÔýþËÏûGµXý~ÿå×]自ÓíI…žŸtÓ“Ë/ÔôQ¥MmÚêõGõé‰9Tƒýäñô¤yùÅÓ´HuèŒêÇã*¼ª±·fï•ðÞúáôd8Tª} üÄÝë`oàùô‹v´>z€ký] Ïåô§'ÝAŸÎí=\¿X ‚¾~q^ÔsU ÏgÐ"ª "C³Ø"¬×Åjlâ»w´@'t”[[Ì6ÏR§š‘Ã]§93)Ý]5œ÷5i áu„SžÌWsí; üN Ÿ<Â'²{{@Oj¸7 wPÁÕ<{…¨go >y¦ß‚g†ë™“`PÃ]{ð îód¶5ÊЦî Ó¦ç¶6Iµu WƒïiàÞ>ƒ28¸|çBw.ôŠ ]{2äO)­;àÕ6ÉŸÖL3ÖwÎuç\kæ\7ƒ©ÔÛW^1ß<6 ÁpulNljo›~aë[Æp–ðszL\‚/6Á?íÆ·$Baa? Ç9äqÂ' á:€YqWŽ‹Ç鱃Ã"xb×û…Aà@‹•! ðøœ8áX·x0Ãôa½‡pé yÝRœž5¬Ü* èn¿7Ë8ç¨mË“úÑÂì°»VÑqvå™Îš%†ŸÔO²D­Ne¬«ö±g1¥ó›Ãƒj¡LÈ1Û¢)6p=´ Gu à( ¹Që©d–mq6¥$¬d—=õœ¦üÂ56¥ôN©,Þ%› ]ñI°¤_s¾ƒC¦áþ¼î î{rÏðps xž{çñ‚wÊxÏ\¾ví=pÇûhÓÁ£{“~º;5ãe¾•{´&˜ÿCjÀ2Ã¥¸eæVPš`ÙÄ¢­¶àm5ͦeryŠç=KãÕ8|h›{Ó˜Ã]ËîMWð †ãÉò xL5\Tï„<‡AØQÁq¤g-›Þf‘£H™ö=:µÂèc`sŠcÐ_ƒ5K:Þ÷%D¹‰0øªJ@›i@õkáA˜_KhßB(‘ÝôÐÏí2˜Üb½R 8ÊÈû¤tî`„p#Ú©äi~_¨ä‰0HäB²Î‚EÚ¹mÇÞf@ŒÑ°£«ì V­ôª³OM(ÌsÊÒ8©×œJøü :DGx:Èhá„ ''¼6ç"š3KA4¥/©†A$qõöc~7‚R&ˆ«ˆá&evNmiîæÑ(8s­[6˜ç¹ÑøT­ feè…“”x‚’ËIÀÎÛLeÅ&}Á„ £Ìe?¥FŸ/®ßé·—±<özf>à†›h˜êÓ Œê‡ôÓÙ©Öq{O3ðð˵' è¦ Òºç ›”•8\îáwŒ'²ay…ñKDøžß6|N ð„ÿájëฺ»¤Ka¬x7ø_cÇÐÇV€ÿPÔQ ÿñI[¬÷‰B§Æ¡÷Ö`<À”ÎIOÂx 5‘â~²‚ô¤ú2ôÓ²”¨ãã8µPï[V1ÂÁx£s3nÊÕž6Pj}.ò”æx‹Ïmp@©ét«aÒj‹ÿËLÉ(“Ò±íd¤ˆÙŽb`”¯Dâ#% *%¡t‰|@_‡Ù©1Ñ+‚­q?Çw[¨Ìã[„zò<Ï<#;4ƒ­—ÍñË™¼£mÄÙB£‚’Á¼ÚÔç·bÂÁ&Ù@ v'C2¬¡ÓÀãÔaÔÉÂàhô1P–S;êVüÂ;¨ÅƳFð€A÷ãÙ)Æ1 ùÅ)Ðs÷cqznA—z£TÂm-ÏåeŸà°eÑ;©Sΰö`tÓ ëá \d)ñ ÙÍâé´hÍo¾\:î°¨ɰ–Á¨Ççt5ðÜ=ãNÖ!ý›Kïåy¶‡ß1hK6à‹²XQ’RÛª+|÷¬T†–!,uDÝ@ËK»•ɳ2WBµ—D,}ì©àN_úï,®9ãù^^uuÂmy( kt?hœÆ…ßÑ-ë€|¯Å©³ßëæêôÜÓ´>ÓµàÌõFú(Êþͬ˜u/}r>2Ø™@«^~SÏëÖ‡zr‡¿|yRÓAÍæPð,;a†jN?ðG¸Èƒ½[Õ¢­ÌØÚ—Ú¤˜Ç>²tŒ„½=eò !HÈŠúrb¬ôdœ žXޱqŠúòŽÅH·xšÓ}Pë.V\k¸é¼ŒpÛNb')H°aSNñÒ–|!0—zâq•Ò_žPgœÒÙ·>"HŒð FIÉAŒ\(œ ™Â\³ô¡Â318Má³ç]¬·Ï1;’ÜG`iÎVTNŒ•„v-½ ](†4‚ž$!ïV•â4Tƶ n5•_Ԉؒ6SªÑŽQ:xLýfDóü=ßÁ´‘Ý~· î©[K¡nü¦9'3éÞb6™§°ºW–Òy­Òa29•X¶¼ÃY24d¯âqöœ™âÃõ(F²Â9 „ÍÁ9z|¥d!³]Ï*ç)TÃȨ2æWæ¬aéj[ƒ•à=Ít4}˜8+Ó\ßh‚soS¢piç0U—X^8Îpá¥øAö³úðrnG°3oÛ»C=a>s”º–2Wù¶,4ÊùŠ._Ñ®Ì`!:”®ñÁ„•Ûu½8ˆH˜8ó>ºnßZ+)øŽfo0"•"¡6Ïí‰U„dRwŽ)l2–&ÑÃ\dæBDÄ /†ŸÄ÷ðq '[Ÿ ´)î¸^߯{í§¸ð6˜(’µ«’-4<`·%5b%:Î4½¶%àúËÜ3^nÛ òœŸÒ(Ó¤Ûe%X?Ü%Ø›<¹Ö–`Þ1{nòc ‡…jÆ:3=Æ-k"^±·þ\ã˜Û=@¯I` 5ä$Á‰¦Ëg±­n"£.çX¶ª¶Ðùž´W|jz‚?Œ’ÿ´x¦Ð=öqåys—~‚·/«¯eH„“]ÕA¤”¤tŽN|±‡c- Ôô—霗3Æ®ŽOruʦlኦgŠÄrÞ=V§Ì(%^×D€ÃPˆˆNfÑ›ñ)<*o8—«pLiK»@`¥S“/6á„À 5½o¼L'ŒS(Û=?ÆÇ¿¢Ööá¨QÞÊàÂs]›óC0ïRêȪçtàÁ}M£„§Æ)úÖbî~i%‘Ù[¬QG ÑÌfGÉ ½±nÖæTvŠ:lûÇ™·Ú2†ƒxâZø c¶sWÃpƒí(= ÿ»f5_Ä-#áy<ï£`ð ]Ï2v͉brn·m1•ày¸²3c|sø~d÷ÆÂªm@>¼A7oQOµg9ä‘- uÔ™²"7`²Q´c¼|ÐÇäê":iž¼WŽ’6æ$bì.ƒ!23o½™Ôã\s·Ò(¥Þ§ç>fήʹ7©;Ïr/gæ°jlH-îz—p”±²¹Rê© æºHöØó:Rܵ¿[Þ¬ ø.å¿í]Ô/™îÜw6—Í£ÝßT«ßãd”ó•Ê·šs‚¢‡P3»†3ëÄ"„Æ)­!ì$¥Þ®h“Œ¨l|ìÑoú`…™„Ñaj˜ô[MÍ=Í|]ž!m=ÈâÚwêÜlCçŒù“©ûÚzgD‹AÑ꼄T'‘†ïI-ÚƒÉW-Y¬[ŠllRN1¹{ e2Ëä§2ä¶L;÷©t¢ªHF–„ E¡ÿx$X Í–©;[8¥$©âðƒÂSêÇ3…w‰ÑKûÞYya"&Z0©-¥mÙbNÃyŒa®B Å‡aq dXT-62d§w*,(eU ‰VM.Óáx >E²8ò4‹ès±`fâhˆZ˜±Xr]Êæþie®ƒæý³!54¤ŠÕÄ Ãy¶½§z2!¡5";–Ó5‚㧂﹉tûÌyø’]))MœåÃî ÂIRuæ^[áè"ÁÛ†|B j# ºµçf…nÂÜ¡`ÇnѪÚTw-â:¤G¤íhNøˆãº/ã¹áò–ñÏþûˆãÕ?0ÿõõ›Y\,«^°ì“ϼ_ "hßíÕxŒkSÍÕMµúûººä`LR«ëÝuõghÐ&„Òæ`®g™+O¦+¨ëƒ®Öù·í¡›.ÝÆõkïéáwøI€}ÐU}|ôòä®6!Ýëß<ÁÏζó•~Dß™Yµ' c8´ïÌ7F9û¼·$`ÝñgÝ^Jgvuí} > endobj 3447 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3448 0 obj [ ] endobj 3445 0 obj << /Length 3446 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹Ô¬gì90l ‡ ‡À›M°ˆqö¿õˆšé!õ‘¬b‘R÷´ xÆ­–T$ë]‹ïþøùïÇþv|÷ðù?ǯæçÃçCuªºjþs<ÿýáò=œj=ÿÚíIç?ǯßßߟŸ¦¿T÷t£ù1]\^1?𷯿ÞÍ/?ÌŸ|~øóôÛÿŽúø§é¿ÿú·éÇOæyç/|; cwþåßó/J+=Lÿ¹üí|ñ_‡¿üîøëDÂðôÜó¿?èºj&š“èøþ|«zú{y+zÙy²†ª™HTÓª¦ã¿ÿ8ü<=í™ŒÓØ(ÕwM_E?µ×ËcǾ;ª±rêŒ-òQ©Òz”yÐÓœ¥ MUMïÔièÌø{Ì‹†ó[Ú®¹j&¾[ᮞf³íS§syRòºtc#ô ‰"•4²e}á“ØóÞ7­Ð¼/OJž®¡R2:S$3ïðIìyZ-4ïË“’§k¬„çL‘̼Ã'†¦Vu¯Ûæ¼çùo'<ýÞ׿eà}ÿ4ð±MžBó¤Ô)«^HΩ¤‘-kŸ$¹£2æ¹w½â*!C?j%£Øž(RI#3kŸ$hæÇºª¥ÍüX÷ƒŒ¨=?)yUš^F>Q$"jΓ>‰xøúÅÃÿî¹ñý—ûª9{ÝñËÏ!OQÑüãË4Øv¢`2Ò}}üòÓñ÷Sh4þáøå—Ãxj'ÂÛ9Œš¯¨]©4¼§÷tðʼò^©!øið²³ó]©!mRPÁ§yh]Smб¦p<ôô¹®ésPCª=iã\©á{0õ<¾L:(»Fu¥˜/ñÌc©ýH—gYÉàh®z,·ZJ©ý¬cæ9ZÄ#ÝØ2pÖ‘¡+„µ^¹’CŠ\·gëôL£ã™‘¾ˆÀ™pÔ1Î<`®Ç±s¼‹.ÊdV(YPJž"O‚ü¥D…eÕp`’@Ó–­À€Å ŒîLnž´™'þpRÀV|¨ìfåñ('TÞÚ"PX‚×P¦¬~„«N2ífùðÜlæÛÜV^*sꓬ+sÂ_ ˆëÅ0ÜzVÎc;0JÑ.¸Å€³©)n¶Ï48ÕÁà=“VÀÁ˜’c×( ˆù?HK°ˆfHS L<¢\„ë²8áäðÄ––ÛÃ) bc$ŸQ OAÑÉpq,rHr¢lúÎÖSÛ=¶ORŠ*ÛBn!~ª½$”+KQ9"!ÃHàé 1¾{õõî.dròl``Î÷…É¡-»s/LnW˜±gü +Òiüpè6 N›°$ì0 ¹åk ?Ÿ;c`]B`%Qæ.eòÚfŠTuêzp¯`k^0i˜‘gµn-¦ÝO™ónÔ`B­°aÆS- »™Œò©l澡¿7•O&™£põ 59·´·­¯o×;„QNÎzqRñ7–‹.„±¶ÔqpÌ"©³›@6‹Hÿ®ˆc"ÙuÁð:gÁË@8.´ƒÑeûñ‰ô9 úêo¦/Eé¶‘[Åm"%QŸS´5N\sx«A;Št&‘œ4ÜæU›òÊJž;Ée2KWb9ƒ ¿°œöñ0«ñBž‰5 ã}"ÄúgÂ(°¦"lgã7Q–œ\a.hë$w@"iš»Î.‰ÚGœhé ‹}_þÖtŸZ"ôVJ‰ÚwR­ÉYF3¾é,qrà¦á\»¨&‰¨m'´cíÙ$  8E²”Ý•÷†`y‚ªD2¾w^̸;àBµEÉí«o©Ÿo_ ¶­($”,îýÂV+œsULüFªˆ3Z6o3™÷”N|ájAB2‘¡&´*¬†EP›…Ru"K ¶@´\áåˆoÿMéø¸eÖÌ|±íÁñМBQ!JŒØœq§;ì¾-Z´áØZϦ²m*œ¾ A;0€íûŒ§†P¶r´xgámŒn¶ÏH 2>>€|·Œº¾UméD¡Ö2»QâÃÊp¹Ö“%u8¤ü­®O™j`» -FÔR‚Ò•w‚ià$äD<,‘=dJâ•IŠ¡‰°èó{‡Ó0VVÌ–¸ýªbÉÜ/ÓQ/!Çu èô+u6rîþÌz0dg[ˆ<‘»-E¬ðBB‘·œ„%Mï·]c8”UóL¨fY%ŒHôB½‘œåm*LŽØg*êöà< Ž;Æá— ÏV[Í·32„ýù€ñà3VkÑ=ªXN|¼jŸÁƒÁr|ñ°C Qª¤¸5"9€pV@k¼.È|,kJÏޙзå"L±«¨¤V½­ n«DtM0ã7³Ih«ì_“r¦§5xRcª½¾Â§nݳ¥³YA £e’šÍBnk7àUÜeÑ“?á0HÿE º' n_Ýf•’|iZ¸:ñu¦Ýæ/Û*¥3 ÄQªMþ^¢œ<›)É 0†tŒ¯ës|·ŸNù†«ºÖ–H´šî{\'ÇÂgvÈKÛA`ú‡£nÖ{å̳ßvË+ÆÐ/\¢ìO á-——_í¯˜çöË4¿\™¹ðŒlžb[ßô§qh^‡5¤ÚÃñ6Ε¾Ç òû#½nœÍÝìU§ì$Üt”`…EŠ8(2ì"é¡Px ¥ DØmQ–œ›Ú—á(Bç3Þ„é…D7Ê9i}¿Dyw'íî¤Ý´'m{i¨ÃLD™:<]Q@©òUªÓoJš…óc$gS¶ŠfbËÝxßÿ ;é§ãEU­Þ û'x£9 A=Z–àîð¾vx‡¡}½úww“ènrÜ3ƒ²]›·RÀÈzé ^³Ó0®ìÀÙ'QõJšaJØ›²ÙwÇÑ%™h¨ˆ³¥,esgOFl…Úb`YÔ<§OJ8—-$DÐZ…Šü’Í¥n0—TÚ[¦â¥Ï ¥3ý vc¥9ŸÍÏÊÚa¿-‚…'ˆP¸–>ú ›iHüšâ©GÛ@Hôˆ8‚“Ì —s×Pô ‚xmvâÊØö’žUñž,×T7(Pɶq9L0#rÄMð°"Î ÚÂÍÜ;ÉÔÎFwuo«%‡áó88Mo3wC)µ¯‚SЉçQNFf3Ì¿HÁ“ÓsŠ`¬vHù)’Sè lÿî­@J•W7,„öCkÛÆFÎ)!Á÷RZ&hØ÷ÓU ] MØ ‹ÇIš_ÏÃZa‘qåŽô”S”n`¹…%aÏ|d\ÁXK¸Ú c 16¯¤ £qñ¼™w9Óã]Îîr–MÎjü4÷Ⱥ[Ê»¥¼[ÊXÊ+µ¡ K‰»¢yàߨºöRº3ÔÍr(smÒ©+‰þ2µàˆâ»`'Þþ/Îè„ú%![‚]„VÎø ï/uöø¨ÇæµlÓÎ_ùŠ}*¶6¨/÷ìqÊ1ÜømÃj\·­ÉÚó+ô4©ä˜|üb|¨·ç tíLãÍ›M“çlxx^º9ÿmm20I.ÏØ¤c¨/Ž­Ûþdùü¦¬®@·±Åkzô6±Q¢'äº)ëÝ¥y›Ý›´‡Ü[û9“•ÐA=å|yÎÖ{Ù³4 0 Vó BçšüX̶·ôÿu·Þú¸õ=æ\€½óÉÛ¼‡bzS-kEÔå„l–ƒ\f×c°–ˆø¹a’'CÏÙvΨpyîÁ™ó!·L*Õ[3[cmÍðœd;ˆÑsVd.³oˆÈŒ¨lÝ’4åP{äœçD‚V%›/ ÷GÛ¬KälÃ0™Œ"(‹F©[°'$¼‚0b×ñ1¥¡*±þH3¨ö`uwO¥·ÍÁ#Å«-V’ˆ™Ú²]œÌ@J›±4Ï—ZïûqË,<>nÙƒ=Ã`ħYÕöÜë9Œã¡ð¼qìgÞrd.³jß@A¸­–í29uœqÓ¶#Ÿá#T.Eª‚"§ãm\î™þ¿OÌ¢º§õ7?¾~ópËvÕ Û}ò2ž÷Ö0L©;ªikqبºÓÓ(çì•bìºS·ŽÍÉ™´Y5ëþÔ¯cÔú•+óÔõI«-«ÚöÔͼesÖÚ{xÏ\¯Oºª_Á§Œš]{ÚÌt—Ÿ<Âïš´ÀÊ?¢{Œ¯]QhFzi÷˜£ŒÝÐö$ \wþ]·ê9ôoàû8|€ïáð\'´&­æSâYY ¼‚x<¦ë¼‹¦Z›ãG$…œ{LÕníWn ý+ßÅ3×Ò¯x8φáýa¨º“:c£…{Q§ý$i‹ŽŸÿÖ¡ü endstream endobj 3446 0 obj 4937 endobj 3450 0 obj [191 /XYZ 32.1599999 301.459999 0] endobj 3451 0 obj [191 /XYZ 33.1199999 299.539999 0] endobj 3452 0 obj << /Type /Annot /Subtype /Link /Rect [98.4000000 559.700000 153.120000 567.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3453 0 obj << /Type /Annot /Subtype /Link /Rect [161.759999 443.539999 226.079999 451.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 >> endobj 3449 0 obj << /Type /Page /Parent 2 0 R /Contents 3454 0 R /Resources 3456 0 R /Annots 3457 0 R /MediaBox [0 0 595 842] >> endobj 3456 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3457 0 obj [ 3452 0 R 3453 0 R ] endobj 3454 0 obj << /Length 3455 0 R /Filter /FlateDecode >> stream xœí]K¹¾Ï¯Ð9Àj›d? ÀîØCÃrr¼Ù‹õ"Nùûi©»% ©d‹ìÖLÛ€g¬Vó]ïªßÿñÓßÿüïáûçOÿ>|™>zªŽU[M§¿ßÝ~ û£ÑÓ¯]ßõpúsøòõéÛáÛÓǧã¿ßžT{~qþ1>\º˜üï—ßž¾Ÿ:š>ùôüçñ·ÿôáOãÿ~9üõoãŸæöN_øúÔíé—_§_”VºÿsûÛé῞þò»Ãoãús»§¿ÓFµuÝ'ãÛåUuþ{û*êì´XCÓ´¥ô8Îf\Žÿüãéç±µË0ŽC­T×Ö]Ýj§—f‡®=4Ó¦3µ¸–TjC­Ò2 —,ifªª;oKìuo{sžäÐ$/×ÜRòru]'´ãˆTÒÌ–u‡-±×½iü1°µ–>6[Óp¦xlž5]ÏØ|ò>yfŒ £ïgp ð| lÍsªV?½ ŸëŒuû~Þ6½nï+ O¢‡àsÍ¡Fxâ |ÇL+úþóÈïÓ¸÷Xw]Yw[›—‡¥9Ý+ÝÜ.î´„½ÍêëÓDêc=ÍÃa7ï6è«ó™lZõw9ÐMÓ’vÇÊÙžxš‡ïÔÆîøYj_±ëûžnUŸ(Ãûε?Ùö¹õé†1¶-û‡¶Ag𙳼å'o‡Î ‡fv: ÐÙ úÍœå-?y;t†£AJgë{†î’ª²,n×6íKÏJ–Ê'O¸5›öÄ{ƒ*O¿Œ;7ï¢H]U£­Ý{L—„'è˜/)Yוʓ¬@È¡yè¬ÇâÿÌŸJH´w9à)‰È9¥FmlÆãTD3Y)k’^ÿvóÀpQ`¸äàâI‰(I–cæåp"ånYP|Q­lzd2D©ØëÕÜs 1Ãa¹¤Ò°"UÃ9 ±æòõ5KDQS+áݰY.LHRõì\B)eôƒŽq/N~-@·Ýg–"®U (‰‹9ü&ÅI@³!L\ЮÉëݬ•}Œ8i.ˆ5FBg8ÀÀlÃóÁcã@íáð˃•’6}ŸÑE)é˜Lf2A×ôt¼=T¾ÑqßÛÞÖŒj›ó$N»C“À‹ »pò˜Á 'B+^7¤@ÞÃx »%¿×yb1E '[Õ#Zpž®Ù„‚·†dý.úI»½W€&ðaÉ—ÚëÃ÷úpö2_jç!î T·ŒgÓõáãHÍ‚s±×síõ\8é^Ïõúöt¯—ž.Iš'-á]çdcò´<мla r5ö9‰@|ŠddâíJˆ—¸±=|^ÓŠOþ¦x=ãCHîê9î°øp.@!˜üBÙñµ.fX'¸•–(æBÌsîÕ Dºóçüö%RP )±[‚§8-÷sîAo„ó-qF’>HauÜUp{Û¾¶Už‡´±_ëÇ_,C ö´W§Ôð.ýÑ93gç0æ w%T¬aÙÂWª3NvPƒMheŽ É9鲌‚—µN‘'UÛN½ÜªlÞͨŒÆ›ßÕÕf|¹œ‡>IžGC/¬±²Ò —ÅqîL{ÈŒÖø‹;gs´D lDŠ69gmÍϨÞâ.»æ·k~ÜlŸeýmÎÄ?ÓØ4›3e2³éÙØ hOxòŽmû OYï»S¶2\àŽ=›Üd ~E=Ô+¥½Ê(ñk•¤?´éDn`0kõ’´WØË“RM•W$ÎõוÙUò]%/£ZŽÇÎ:{.× êš™j¬3ßË(…ÛL cK&É$¡Ê…p*<üމыzèÖÊÁÏÁy o l «”»ŒYa"luæζ ¥‘¬êfdˆ=é!âóËXâgÔù¬£Ä ”z”wLÀñ×ÅàýÛºÖ½ Ɇ,s–pú7ö)Ï-`ùÖ]pª+•ùJÇÕ\?¥EDqê­†êëd¸[Ç ½‹‚v%©•a®füCûažÑœ}wž¨Å[ᘦøÉú‘ïB˜{y 2ùp ÂA7çè~¢C”í¬¿5K‡™X4ï¦Û³y}¯Í\ƒyeÁ{8Ò;¶7ŽìêÞVåÖ@Þ|¢Ý“AÑNXEDíLqå¼2;¨ˆ]MÏzmNÈ09ÛY`5Ã""lM8Å/¼Öµ}­“ç©ÚÞ>0ƒÍ#Ó±^ÃAªÀÈxXwÀóÁè^&7áé®¶Ö}M0eÝÙ§ žèD'æ±GO#ÖÙ†§‘ÖÍÂfü÷惂pž59udí&sûÂÅœZÚðå8¬P~‚ù)AÍsÌÁÖ>Öi8Aäjûx”˜> Á"¦p,‚pGH¤0 O–iÜö’ÎrÅ©•Áè qÞs(xÎíþfáÑû¡jïéý7ý=ý´¿:š2Ë®O>ĽAãw²û¬›¡µ‹ _ªîК¾*°T¬ü3ú2ÿFuwãùǶ}7'S’”«¹é,Û‚@‰Æ„á—wUo©Ù–âvÕ;¤p‡& ²ìÑ0ÕÂÙy4,Ÿ151*8Î-ߨ]r—œÕ¾NŒ%§:e~R†£tÌl†˜9J›ÚA|w`æ}O3Ø6;0óȆëæÒ%LM ¤ËgI°HÀÊ ®ŒµŠY‘œiÒµ²g§#ĵHˆÐ_2l¦œ]€6£Àéu݆ƒŠ¬U#`lÓ g›Pü•áÙØ% J_·µ-&Ù›3v$P ×thÙɦÃ-Ä+AžÙÁúÒ½MfißîÈ&[Ä­á¨i±pv!;ºË Ûûü.gŸÆ6ÚVÃybÝRU€ª.%) †S›9¥iñÙ×ÅŠªëv¯Á Ö§f*] ײ0ÒIÁ;ù¬¯Ãd¢˜=¿ ¡U¢\JáåfŠ8²©¹†™1d®l#\¢T¢)ì Ú|æS¯³ƒè)NIUx%$j¬<•F U<¼ʹñ0ÌÚ蘜[d‹«»29pÍÁ'9\î—®bå¬ðî»h½ÒÃËá¶ãÖ\þŸBrÝb’40BBù• —6áH ^µîð@÷ÀäŽQV½EvYrCs)+Gµœ]¹ùপç. FðÛ°ò!á¸!”ëxÔÌ4dƒ¶)‹#‚ ‚M ‘ˆÄºû–½Kxû3£­&xüXºw^48X@ާ¶2’¥8<Å%Yâ(pcIœL«_ÛÉ1ç) “¯ÜœçÌb::–I<oîâ)²¨6„å|œ Ú}pûíéoŒ!ä 8Ï÷I_E’~ä9¿sx‹YuZ/¼[u—v«ŽÀh“@ä%”×-ßmSÏÜÃYâ•—£IzqË)r2L5X“pdw¨ç „æ©P¹×šÅS9ÜÖ±œ cdàf¹*qŠÿ!Âíù9â3ïð‹H¸^5/Å[s¬-&æ)Åéõ²…ʰÔ'KçOkíµÍîQÒ|Ö[‚;[æL{åì/ÛÌe¹Î5Ö—N(™ÂÊgmÂÑŽ9_ ŸúT”TaW[ÉñJuJJÌL6È”'=m­ä‘–ºé-JK‰¯Š\ñàÑlã·¹®á  · K\H˜}'ì²#R*¾2>û¸n ·s€ö]ßÍ¥™Ê4›þ’I3 M}¯²?™ÙI{ýJí|e°¾b&Æ­:–w¦æ›—çìkUÛú¬ßñ¾ûÁù#lâÖ×Ñ<s4Ó–^Ÿ¼GOÜfÕ|‚‡Þúê v»î6ûÍy?–<Âí«Rp#­1K—ï®Æ ’0DGž;uX„Mˆ”2è‡ô¡Hä[Q‚E“æse;=н •³ÌI#+l§”E•Ïš2ÕXbå!€ëÅ xÃ0‹m¿À,î³>?-Õ3‚B0qž±‰á3ÖUMp<²Of¶Hzâé‡s–±_ï‰,@h­a@ êâ¹ï§5¼:˜ aL=Véµ(äfšµ:x à;,ž†G :SÌ(î_9 1‹àƒº®¯0Ü8ÈsW/zÙ|õ|™^ûÅ»ë<åtžÔØ;|ùç:¸[5Þ†¶ÚWyxq)mÕÀ•¾x ÒŒ.Z¹¾åÙÓíË2Ô¤.\‰Iø@ ¡ï¥BãÜ}B‚¬.F· ßcJðí‹d²sJ”Þ~B•lYp «®‘³+"iYêà–[Z¯3wœÁçñqKVŸªD2Àëwób5æ<²˜FR¢3žþKfr €FY€•DS8œ 'ƒÇ$¡Ð ¦$JTšm1 ®h·ê­\8†‘8Û¶µ‰s¥Ë«eëÝú°BÏ) ø˜s`VVŒðž¬õX–Ï‚àâÌZDÀÊp¼Ù!k\¬ܲ xûê×˾‡Áfß™ê¨9b\¢Ô®»KËw_ÌÌ­† ¼'j†}ùØ‹òKYþ¼ÍµB צàFËŸ 0(<â2úrX•/éçZ|A#Ñ34‚ôŽ ˆ ÞRÎ,úçF‹ì8ÄRÚÞ%„g›Â{ËTkëus¹+€ï–â *„*ï‰Í ÄÍ2¯"q[b®,1SÜÉ…]û#h_(¿3M¿g“ªŒ²õÔ¢~šÆ·I:ë JBAÔÆOqà¨Ï(O üÅ ç¥ê¿k›—ò/sþŒË%!ûÍ…íKç„0ãõ¶ès‰\ðBôï›Ù©MÐ$¸¬W³Xp! ¹ÀÑ~æs]Fò7mÚäH~ÃÑb9à䨖ØJb„YW°LMð P:ì§Æ#À´¹á™zlJÌ…8#Àýà--Ls¢Z°¬ä/u)ƒÊÐ7t'‘Ç¿‡o£èUíY”Î?¾|õÈbWˆWW!þÑ+ƽ¯†oFljœÆ=ÿö Úã9q0Õʼn:9~ÚöØÞO»êã´2Ñݱ»dwçÉ´œÆõp̶iŽíU¸>é`?=|g€ïL´ÓG]™76΂þ^kÓqoœ#{ï»sò~@ïÌâèÞ…æ1Ç`hïÌ;F™û<¶3$œºÓïºQ–³é^Œs0«[¤s`æ=íïYÙwèôrÞ™±{ï¸ç ÎÃÓ3>Uïéë…OÕ|êíÌØ>¤L7x†¸õ,rjû¾jªS}}|1!½$‚Räðñéÿ«í»ì endstream endobj 3455 0 obj 5336 endobj 3458 0 obj << /Type /Page /Parent 2 0 R /Contents 3459 0 R /Resources 3461 0 R /Annots 3462 0 R /MediaBox [0 0 595 842] >> endobj 3461 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3462 0 obj [ ] endobj 3459 0 obj << /Length 3460 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€í)Š’€ ÀÚã CcÈ!È!˜Í&Xdqö¿µ¥¶=d$«øÕÖ.°ãYT±Xï*V}øãç¿ÿùÛñÃýçÿ¿.Þ>4§F7ó?Çó¿?¼ý 9œZ9ÿØÝIŽçŽ_¿žŽO‡ÇÃãôß§ƒÐÏ/.L/Ÿ˜üí믇óÇóß|¾ÿóôÓÿŽòø§éÿ~9þõoÓ?-ëáÛaõù‡Ï?)ä0ýÏÛŸÎÿuøËN ÏëžÿûƒlåÐõ: ާ—WÅó¿o_E›5Ц—G!äg7¡ã¿ÿ8ü<­öÆiTBôZõMðªÓzrlÆ¡;ŽÓ_ÝZ‹Z{ \*r!!TŸd¡gˆDÜÖD3ã\Š‹z![ý¼M9}!c—¥¢Q¯™f¡3D"nk êK±Q¯Gõ¼ÍAD£þ²T,Æd'š4¨?C$â¶vA½µÔc‰(_%â“ãÅ»/‡Ÿ„j‡³øòóɳ™ÿø2m·› ˜$ã0=ýéøû¦i?þáøå—ÃxêÆ¶ïfµ³<ŸŸ<|™vÑtËW›Áã}RR©._ü$¥š!¹|0ó¬hÌW‰q·âì²bÊcfÔCךš"Üwà‡ u9Lj¡ß:ܤê-|7ky ¹å%Ö!~N °¤µ Kø©ì¶ÓâL="6Kˆ+ÉàlÝdg»Ë:AЖ _ÕOBb¶HÈ¿X¸sæø.ÆDV©]á8ü+©ƒÅZöÄaBúÅAG_ 2£\i¥6 ̱uæµVwß(Bž8ìS'D0\yì¨ÆÖdEœ…É/ÏÈp7Ép~Óv¢»|‡E[Ó8ˆt?tÀRëø<¬óÇ ‡Ã%“m[ØæØ–ΖMnXKc3¥·š‹è¥Š'€å#!Ñ2X#稺§Néó‡ÀŠÏÓr¬`-7F‰q¨(¸ÁÙ-?æ÷Á¥Ð^`léd¹ë¯“NFø{iÀO ’[êÄ$}KÄäö8™I£á¤˜¹¼@=°š—)©Çï‘Vº„ m  .ðj›,žÂE3ØSoï žð0xáÙfùç; ̂˞VÁâʶé#N«šTöÓjq]ÉÓ’:â´J¥²`ÜŠõ„Zbêõ'uœ°V1X,$¡üÈ —,•BkŸãÐVsŽXv¥=G‡ÍR±žàØSªß§ à;Xò$¶C1lð; C¿SóN¡úB<‡)¾…š®…¶o‰z¿´SŒ‘v•_ëQRܨe“VþoÓŸ.æÕq®Û”òaê"*ʃ¨]Št—È×r­2,¸#´ÉåZ0ÛŠsÒ]ŒÊ;ànÅ2­¨4ÉÓ‹†)A՛ȧ)ÈgÜ/ØTáe%åË7’ÔNZ„ȹÂPiEÈú8(§H×ÒéXÚÉ®—켘7 GIªúsz8¹ê'Â…YBÒšSù’,ãSþê¥<-IÕ¾…Òðw)— ¶xÕ™rÿ•Q±C¹ÍĸþÃ|É»ö‡M#BÍ)á{á&„u{’ óòTÄÛ¥„š!¿(µ¬r\l¡•€+½†ß«ªòv0$´Ãr4•.A=±jò,y诜ýu:§²—Ar®œ0pŠÔ–š¸›û™z…0äáýsYv4Žü%lþjà LŠ eô–¹ë¯¦$¨¾$÷ãŠV·‡¬šF𣜗ŒUk( –üóÖS*ñ ˜‹0àl +ÜLb⥠MD›7Zì&o§»òáM¼ÈJ@BxãÕ^Ç•¦ç w§¹€2ˆá4ŒÍ÷ñ |)ËÑ­í"§>¡”ÄY^QKµWæE^7olŽíàa’$„§9V&Æ–_Ú1BI¬ìPŠ´TTræ‡ä‡Nh?Eø^DÈ(Ó½¾ÂñĘ$ž­z8ÍÉ’Ü¢æ»À9/Žu£i³F4‰³ 8zÝq„Fd…­¼ cI;Îm'öœ&“RÆð8Í‚ù ¹NPœ Íœ´„P~©T°/‰h£R²8In®®ØX½1Ø6ò!„vü7­37ãL`©fnû5*ƒƒo§×P«¤±7—V_U:ÙŽHeÍ5›´¥ W–Aa˜jl$ÿ&ú¼¤ˆå©|dõ¾â”öXxLcOˆ“(Oâ[ûÓf„Âzûš@’EkX¸[µ05Àû½½ÅóîÀÉÇô´ôzú“a§¡IüãV{ŠmæŒ~Ù¯qÔ‡ŠK«§˜zª"‰šŒ &ukpXîñ…fx¯´±ÒFœéUI„ á'-Ì`SŠª.”^,¤xU~Ó kÕ}îIÅ׉O¼eíª ¥B)Lj˜+åJxOZÂ0  ¼ó0kL¸ˆÐé•ð.#B‘¦¼!G\ëŒMTL{>¸ ÀÁµø|810¨±®uèͤ”Èñ¡8éðp]l‰8`cèNôÓµƒKY—;p§ªbD1X£”ë°QtÍâx‚å:¶°\ÇÑ{,¹0½`ºd”C=Ç~Œ8“tã ‡êÙc`UÇÀ Gmá Xܬ 71¾6«¨Ù›ÀÒ“1Ê›UÎÊáM}ÄyLÇH:Î|¨9u?'Ûñ†-Bü£ªàæâsœAÞŒÜtI llc2М'5WFà³çÄ[n1?3v—,<®g˜·’F‡±”W6FdGl–Ø_ÄgãLx5¸Ÿ¿ƒ-J/¼‰iS¬#¦‡ßÁV~§ì“2ØGUcìr9 9©6)*åǘ,|ÍyÃ.iÖBÂvÄcq¦Ó2ƤXŽŸÑbZNÊ›-ĵ#‚µºê°ØëŽªÈÉè(ÌÏ{^שö¼îž×u?Y=¯Ë99έ–‡OëCFôßñNRÛ.-Wž½•“Š­FçìßÂgß•>Ç‚YbÙè˜|6ËoZÝ/]?ssk^˜ÂzÇçp-æ \Šc¡›´\«öKJß!ªŠ…#Ÿ*–5‰aÃwZùãÄ^ætLÿœ\0–ÄI¥Ý;’BicÈŒVIùtnºYV>±¸ çܰƶŽ’b°ÇŠWƒ2`£[’.å¥J‚“õvÈKÜË>lQúè¿ ®TÌ=ý÷“;ªY‡í¢÷–!ºtUÁž!rÚØK‡=C´gˆ¸'·gˆjààÚ3Db(]´gˆ\Ò®äÙ˦t­JÉ ‘”¥sŸ5G`ßß´G9«ðÂJÊ1õòÕ¤1#|ZزñFHÊ`¤+ß;¾•Ó Ey«ÉcÕ÷cLFCbÿFóÓÒë'¶J1e3¼2G‡ãŠ%BI>i…^æÛ—ñAï§ç¹Ãö4Öñx?I©t›]×눘·ÃRö›°Î(É~v¿ Ãc¦N¥·×=_*wÚûWUÝ¿êõp/¨áUÀiŸ²"‹uæaøGØçM £7(£3gÚ8OL¥6ÒQ*}‰í±Ö#CŸüÐPÄyz¤ì^/LwmþžxîLPIfY¿®ªæ#–§yÜÛ_ ÅéXdCÓýü+óžÇGµŽgJã9˜7x®¡5q03žã2czÝÙîrT†Ø@›¿Œb±Õ”‹„É„¹ÕŽîq´ö…‡5åÖâûÒ~3Ö;ÛÆ]fз¢p3»:“ȇ¿ÚZÈ‚8&Ö'Ì‹—7a´ OeÆß# a&È‹•0xUü$b¤úrÿøˆ.… L³ÈZf k7þN¸°äJ~µ2ˆpµ# –XþpÆF‡S{h; a^¯Ç!I,íåÏQ£ªƒbðÎç/¼Ôhõº3°£<êu¡2©Ï>7[]u wF %•¤ia@8d–ƒ‡…(Á"±,K¯Žu`CÄÐK_!÷Q¯èÑH9šLîú;¸Åd,Ç“X43ÓO^Y”/‹Á΀­Ê“zNÖcDˆüMÝä ÿ(ÙŒ³µ€ÒÉú…l+Ò¼RŒ¶"–äkûŒÒ –rHëgã±ÅíáÇ`?¬áü9d‰¶8Ñ[ ñÔõ LÉFr`Æa„r‡Ã¥ŠƒðÃàmF€ê2dl4X*¹š¢ýœÁ£ÁV¶b¸…„á¢Ç‘DKC0LŽ7d‡e¼q·¼ù¯Íl€/Ñ—™ª…+õ³²—±µ˜påÒNBˆS§ô™¦0-wQ®ý*VÄ&ã;hòCZ s–¹°¡›;ë¶ WDÚà‰ñ5ß!#€ŽÏâ*Õe³m}ÃÉ»…—Gp´åRìwå´O ÃÚ`eç#h¹ÙéÀ–?‰H°Þ’ø=þ<'A¨Dµ?áiê ûã#!ÉZ‡UneNVÌqôBšº#OzŠl[ØYŸaˆP™ÓSòÛ/Ü㱎}­l:®]vèUŽ»–VÈ›Œ}%Øï:±:µ(ˆ Ä@ù泜šþ=>Mi’7ç%–?¾~sH([´5¯¢íÑ)Üœ¯z¥âd8‹i£×«YõLYǶ¹ô0XúÚj}Ò׫âFuöŸìOýõ þÊ“YxµíIŽWåM×ô|¢æy^ûÎßá;³Äëåé<¢I¾}ç®6“ÉÛ¿ùw‰L]Ùá'ôÎBuמ´…þiï,'FÙûÛ3DPÝùgÙ £O̵ï1è`‘$:Xn vƒEñÌ~DÔËygѽ×Þ±é îÃñeLUt|aªZºX¿ÝYׇ<€ùïGÜ'¡ÚahôIô“Ú&_,DÞ„GSj‘ããáÿ©ÊÌ endstream endobj 3460 0 obj 4414 endobj 3464 0 obj [193 /XYZ 32.1599999 643.220000 0] endobj 3465 0 obj [193 /XYZ 33.1199999 641.299999 0] endobj 3466 0 obj << /Type /Annot /Subtype /Link /Rect [255.839999 576.019999 361.439999 583.699999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.sourceware.org/libffi/) >> >> endobj 3463 0 obj << /Type /Page /Parent 2 0 R /Contents 3467 0 R /Resources 3469 0 R /Annots 3470 0 R /MediaBox [0 0 595 842] >> endobj 3469 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3470 0 obj [ 3466 0 R ] endobj 3467 0 obj << /Length 3468 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹$ xë90Ü@ƒO&Á`<ˆ3‡üý¨JªÅ¤>Š||¤XÝeîv±$=>¾}Ó›?þÇþ_¿ïß¼ÿüŸý—ùçûÏ»æÐtÍôgüûÃíÒ”œ~íM{ÃñÏþË×Ý·ý·Ý§Ý§ñßo;Ñ.œŒ‹çGL7üýËo»7ÓÃwÓ'Ÿßÿuüí{¹ÿËø¿_ö?þ}üñÓ|¿ã¾îÌÐùuúEH!ÍøŸÛߎ‹ÿÞýíûßFÌé¾ÇJ7}£“àøv¹TœþÞ^Š6"k­1{!äg;¢ã¿ÿÜý<ÞíÆaÐBôî›à»öòxÛNËýÐw{Ñ ç¦ÎÞo•z##˜nt„H¤mM4º÷ßê`ºùü=äAæø”Ayü@²°jƦ:¡×{%ÞHkݲÜè‘HÜÛ|Æ ÷úÄ"äU|ó\øîy÷æi8 »çŸG8Nsúñüu§ɰ‘ûçŸöl!þ´þe'äA«¾Dì´ÒÈÓJhkÅsMwZ1×>ž>hG!=²c{óUùdõýé}}  Ÿ¾z~~ÈŠ š‚·‡n4¼=Öy°½Ñ¦…wí—¯ýø<ÒT }k‘Þ´tÀس7­'´Èƒ™nÚPÐṉƒd¼ ›Å¼-Ì êµoßb¢Ø…sæ´Ò¤0+§„™Äá'—ÎÉV¡Ãˆ \(ÁŠ‹ |×ÕkåÇ„Ã!J’„NÀ †Dvèü(§„©!‰U׃AÞ ­ ùm'l«`BÚphtj´â¹f@+Í\Q¹]'[Ñ9\iG4ö:gŠ%'¦;,–³L­÷Å;Fhu¦Ä¾k»ï™t]ØÊ™$å!Ö\Öw0Ž1a”–kv³XöW]]ì Úæ óZ­´»‡X>uîá€ÎréÊ;£èúÞ}X¯aÍúv²}Å¡ÕÝQ„hILBmœ®s3bùìkK¬4blhl—B)ëò +GcX7×…eÜ÷€±¦åÄüý˜š²US(hΊ>ÊÔœ¹biEBó>gF † £ôPÊùõ‚RÚY7`º%¨^Á¢Ÿ=¦)|žüÃ` äè˜ù)¾^^XQ ­è·ñP{Ü`¸Ÿ_ƒ1jâ¡VØ­§8üeƒQP«w9cÐëX„+ŒÏ`úÇôñ+ R¶ó|Žg?Ï<ôiìNχ@‰¼''±¼Êñf/ToR´ ¦XÖ²@Ëú¯YÊcÞd¦ØBŸSŠ›Õ gJ€g‡#À”¨Á}F<Ï!DÎ1בâ0G1®)ù¼’|yœ)íLy#N”˜†°RBþ¯Tõ}ãjÃ<%ùÅ+ñí#êHUð’ð.…€\PA(Ïàípˆ¡ñðBŠû®Ñ'SÒY8xåèÜ‹©r‰¸kDE…ÄÖˆ/§Êè…¥3<¥³”NùÜãzÍül¾„@ä>¯”_/wä*OzZÃùÊóÕ„XŒ#e+"×(ÀMó}¨[•¯²4µ¤4ÒZ"zÆÂë”3‰Jç[„^_¯€/+õ9zIr6j(ekçĉ ”pc*E“{¨šBn{y$[N­€_Ú‰x¸==>6W`u™R}Ó„µîa¦ÏkŸPZ"c:.×}ËèH Ìú)Z ÞÕó<ŒzŒàUwŽgÅA’£á×§4Û"Ë3gg‰î-ñ„µRD@„ÇD_—(Æ—5Ìa–²&«cÞGÜ,€Y°D£˜øšˆÎ½¼¼K¥T¬ O á\èÂÜî$û!Bkó6G»’dî}ÛÚ¶g¸…#Ó#‚Ös¶êçéÄÕ…G†bT$+áç ¡ ¶ö-³—zqÚ¬šs…˜-y=Ka2ÃÙ]¿Ò9_¬¯¨‰FE–¶,¾¹XLg%šC§›ŽüÝ'ç»ç¬µ+Œlp%7¸¹E¨ƒšN?`E¨™.ç«#\—®q¶³!ü@1“û`¬*@q<[K·ÇnáN{’g%ût¥91´—49L0æ±ú³Y„¶ëS¬2'..;SlÚ˜Ôe8bxº‚%Ÿ\jÈå„ ƒ’¦Æg©)¡'Œ’ƒ.›hÛÌÐtKŠS´gØ®+05—¯…„èË” äÔ ±TƒNŽ"WGä2QÇÃ$ ·¬Q|‹É¸&L¹Û,QÏ*¡fX¯Çìãåq)@>1SÍ\5ŒŒ%a!RF5ÇxDàWÕâ1g’»Ñ¶Bˆ˜ÁÆš ö !¡¶Ê£÷×yBµñR€’qïŠÇQ­Vnqf« ¸µ½@Ðåñ,˜§íÆ«cw oø´õ”ÑæIaÓB™VžÑËXÀ¤Ä²\œ˜<%!§QƀΙÓn:Kà\¯—Œ`ŽSgeW3º”—ÆÄäy";6©TղΩ$¥MY2\)óx³°: ­Åœý]w~D¸ )ùHŒNG¡S˜:ÜŽ¤¨\žòäüùo5ØŠ`+ÕYˆz=ÇL©aHQcÁjš›4O±eWk0§Å¼¦'¢þ:Å|áÂMò2È·¦?¥ =áMh/2@’ó={¦³È€ÙÈ$\æáhÕ*Ý(<¢´§SjÝ jJ¦‚¢7#"Û¯¥Õó¶€²m¥ëëK·–×ó¶GRG¸ίŠ:Ç"á)2àl­#½£È Äb¨+KˆœòöOJ :¡±{›,ÕÉyBÒ°?î8<‰µÕÆ¡Å5«<»Ÿ£yé]ÖPm'dyxR—œìPܲµ]½ù…˜âT–"©pqcòc#¼‹IØ:´]wë%H,gAy£V¸¢¢¦Ø>" ›RþF/_Í)°§i7›å I=àX>9½7£n7.¾ÛøôIÆDÌd'mal½ôÜ#5±cï¼÷#úªz¿â)%¬¸®~„åQN˜*BrŠ)U$ Â}`ÇÊÃçV!{ÎÀ^¤ÔÄsbæ¹æÊsGÖ9qŽ>ïŒlw‘#8Ã鯹Eâ¡Á¢Ì<ÒÄŸˆejb„^jæ–jôúÜÞÃ}ÌS°“’SÛh`Š›r8<áÎ1ý¾Î®¶¬[‘]º}2a¨ÞªÉ‘k¥16Û²v…ñVg±4ñ´± ņÇ`IM‘ áÍF1‘Á„ÇäIÃÆ$êX¦ëe?OЭ¸ß+B–¹ž kB,ÏØŠ»ôÐ(¥S@Ie-n-ÍSðQ±³Nfy'ÓÝ©f°¸x¥D\ŽR b„g9«yˆÄzInî)á¶ï4Ъ|6¬%?«Ï> †?gæK¦»Í$¶´uƒ=Wÿ l³RŒÂÆ›|!ø|Úx?ž“ƒ° ¼B‰F`XÏ”—FH”3õð)¤vXùÔÃõù†ãHžØ„ G²H’ßr .Ù^öR8KZ}MYõ®Ñ벆°Â+í0’d….¡|¢HlÉÌÖO‘³—òì¼(,+ ~±æÆ2É£Q¡,÷p!†N9{E øì +$ØØjRhìR~H‘"žÌŠà”ÒNõð0«ý£0]ϱKÒ¬–¯¦*fÇB=Ç~x}çXæ•èï€=’pŽFR°õ€#6Oày<¬'à~0Iìƒ@<5˜Ï(ÂJUØÆVJQT]5ˆÏ‘—1%ݧmE±wI¾öˆð ”OÝ%ætVYCñÔ0íx®ÁçSH#·j˜)ñÈÛ:$qÛ®ž£gÛx…@I¤(«ô–Ø @@ZQ2eý&&`>Ã+µG_TŸ'ºËkñ ¨QqnNAmBªÓ¥ð&Žÿ"Üïª9·…ÄY/o83€¯!ħ_œ¯FÉøb]‡½q­üß<æDÉaká IãøÆæy6,7¦rV-ë‚<–"ö¡îÖªÐ× ÝBÜÄì%` D¨*å!zò@UÈX­R2}UÛ§Øn$Ô}P¢Ë$û§bYŽy†÷|p-œ'‚χ5Žˆímb¥DJ´„bjÖ“£T—ÓJ´Q[Îñ¬`‰-WL±˜3°LÃ2Ë4B¿sѳïRj(+Š­›6`wÆ”öe Ù±GÔ ÅéŠ+j¶À°DМ³®x§Ì¾yA9Ö6)C%eR+¢fù"±|Áû!¬¥_’啨s‚yïRµ3žÈ>¶§0%ü æ ™X±ÜvçÜgIIØ5—†pÖ>VA©ì!ô/R:BI½aØ. Äì)Q`Oü÷—Rúeñ5H½¬Un”'·L¨r#Ù»˜1p&S"¡šŽTM´ÖA–Ý+œWÊHU}Á<®8 ÄS=œûÞXóJžH8ÎjúwKÉ'J\·Ë½Ôœ¾:r±]ûúúyŠu4¶}ëèÿêú¤è!¯vÃSA0§²ÖÕ0÷¤`+zöCJ<©ÔÙ—ê8'=¥¸T}^w/R"ÛÇU¶_!uEQ*MY+*¡>•qܼwiû•íçTBI}JÅ0Å Ü>_YuoÀ£óúŽ;¯û!¥bx{ Š$IY3N¯Çú~t…{¥A>‘z‹±„¤Ä¤ï²—ýÁsõw’‘ÒuP³ßô¨exHü‡Ä/+ñkæ…ê%±J±–KùCÌÑ’ÇD¦ êÍ<’«$ýw)™5æj1ÞNBÖ¸”NZJ/”ar=ij« (9›Ú˜¤i™›GŒp­9žéTªÖ¼ÅUr/ÍãźB˜«e\[RŸ M¦Lîæžõ}ò&³Í„g–¤1œ¯-N™—ö°áhzÂC¿¬Uˆ/í½DµÛpC—’C¯Ú†ƒœ¾½žxØpîÂ&%ï~§6\żÉÜg a+Hcº‘VÁÃfòá€Ð7Älñ¾­íÕDÑîöÝoz \û˜À^ÃvRö‰ÞŸÄ´Ó8g]7mñ™L{GØ.Á'¼ý–‡GåÕÜjâô>©‡îÕxa/M”ªOáQU”3†¤|ÑÍŒžñïþÛÒø¸ãæ_¾z`t7×\7÷É»=參x1Ý^ŒÛX@‹Dw0Ç]îUsN+ÌE ]wè̲HÔ‡ 3ŽP–ý¡7B¶·+:û…•É•Pê ‡Ó“®+›·í¡kN‡p]éás ¼f€×LÄß˃lÔqÉV%Kw›Xéö“ð»Cš…>¡kæðÀÒŠ@û˜Ç­Æ]3ŸXÌÞgØN @uÇßek¿jtéy::˜Ý—Ö8ïÁìD½”kfãié—Þà>æqt ôLvRF­`ªÂt÷NÚ)†ò‚:øÁ\<¼„ƒ‰çdë>çÝ §r£1Mw½0}0[bÑÝjHFí¸ÿ´û?•Md endstream endobj 3468 0 obj 4540 endobj 3471 0 obj << /Type /Page /Parent 2 0 R /Contents 3472 0 R /Resources 3474 0 R /Annots 3475 0 R /MediaBox [0 0 595 842] >> endobj 3474 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3475 0 obj [ ] endobj 3472 0 obj << /Length 3473 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âK¢€ @zr0˜rXäÌf,2‹tö¿¹%w÷ŠþÊÒ'ºD¯= L?hQÅzW±X|÷§/ßÿó—ý»÷_þ³ÿ:~ÿeWWuSÿö‡¯ïÞþÁÆÊÙáÇ6†Êv‡û¯ßvOû§ÝçÝçþÿ§iž¿õƒÇW þòõçÝ»áå»á/_Þÿ¥ÿé{»ÿsÿÛOûïÿÖûaœïðo»Ø5‡þ=ü`¬±±ÿåíO‡Áíþú»ýÏ=ñyÞÃÿßYltvO/šç¯·¢—õÈ꼩ýÞÛÃztü÷»ûÙ^À¨ú˜¶ñm={ÖÖöÓ:ÓÿÒµÍÞ8ã“Y“ÅÍœkåDÞûe¢gˆÌʵõˆoÏÌÅb߇¦Úù”¦ ‘ö2×ʉš`2‘ñ‘Y¹¶û'æúœE8í«p> ><îÞ}2ÞŃ.zü±åY¡ ßû‡‚Äýãûß×µñØ?þ´ëªÐ¹6 ðÜHÝÁg–Ïæ1`{ŸÔðÓ,Ÿ C`!Ô ®1FÕ øHðAX>bìr\{ÌUp¥iá3xK#^æQoåàz0W8›…’5Âöñ±×©×®]¡!ï#×:‚5¤š5‚²i!l‚ÍÒ$X#f=Pàõ0ºF ;5\#¸Êb¨±ÛÜRšOÐæ|ȉ÷ ¨×C£­k”ô†àÁA9«!…ñÈ•z—jì½Ô }Úœ°Y8–3a¥ø†¯¡î´Ì3˜C0â•‚¹—бOŒ¹ ¯TÉ_g4^O^ëê:E+Ñç5¾ƒÖ‘‘&+ ¯¯ +Üùb¬0#Ýxkß’=WMÙ²ÆÝíï÷,W8{s\!Ðg°!(ƒÂÁ(SØ×Ë5.Î 4Áü‚G l‚ ãΆŸÖÃdy F1ÿ祎:pl!Ðʦ }‰Æu½H¬…²r¯ÿÂg˜xÄcjÁPCØÎi(`¢½Û Ya<‚5$¤½å$ve[n"¡JÇØ­lU uõš…¼»{¼7ÐÑ®ÚIÝœŽ÷Øí,…ýª=•Í)|[q˜k޹MMmîëcÖ§†{”x·Cð y¢öa²°B¤€½â=Xê˜øFÀ(ù0Á;Lt!hi8‚½~¡b®g”©µö,µ˜¨÷Jwñ>m^^ΊQ6ÌÿŒ¶cx™±É„†d²wš’4ÍëMáZ'¦z CMŒhøsPоtûâzE©mBcCj˜"þƒý0ýÄ€u_ùaa 6âÙqJeÿú‰ÁÛªNPëák¦“àÚ)Dðƒ6•5ñ$k¾yÚMŒ×7:ÆAy馓´h8½wS §«°ŸÎ‘~̲IäË€¥ïMð‹I)-0Ò  Bål4¿fþ,–JP‚èASß$<›HPò fÉj Œê¬IÚÇ*võD© lÂÈ©.?5ýDÒ|èÈ0ŹP…—41NíV$ G`V\ æ§ˆš¡°NůÁœiHˆÚ: jW`tÉè:ÎÒ‰Å[c-sPKÚ ƒ“@´@e'žÌÝæà˜hèš,Ñ $€@á^À>Éj¶ö#¡˜jÔ”}ç3‹À¾Xgb|‚ *ûÎte_žÛ!JHwÞ da»d™˜ÛÎâÌŸ°ÕÀ ©Ÿ©ñ½”Îz ’`…ð¶—ø¸˜?°öÃ/Îâs$Ð'ü?ß¾&Œ1Z0¶*Ø¡ÀÞ(6gúRþÎAbA­&AîôŒÊ³és”‘;¦nÒœÁ—K\§qÚü÷åI¤$LpÖ ê4¦JPù‚RÆK[ 86·±9“qãÉͦ îù-õŒu–{ÌJÁË‚g/;ŠY‚¥8—² {9+¥cNV»P>-‡!Ú<½œ„kLn“z&!Û9 /¨þÛ¶ªèðÌÈ`× s"&æYå~ JûVlˆrD v>þƤÆû6`?ƒíhJ ëÇ).’,Î|þ\ôa”'á|nh ç&2…9Ê^ZùŒñô¡‹¯N—È¢=K0&µ}Õ6ß’euØWx^äÓÄ «,Í–äõszP Ò˜Ú‚–%YˆÍÓâ(u]Ö±yDü ¸7ÙNߟÓw/ÅÚc‘Ê)â.pd$ëæoeQ¸ J8˜àI ?^èE ß¬%ë~µq=u ðûWxÆÆX–œ`–ÝĵMó7µò°²ÒN«r&•š„IÛÏbaú Ã|ÃÄô”Ÿºly}pí#DâÌ5ùD?awñ]ÏÆø ¦F¥¬rþ¡©'Š7ש%¢âŸ/8×bc~cΠëÎý1'1Þ®Y²–Õäc¼a¨³öú¨€ÏÛà®Ûø\[Þžš…ŸÂjÜñ$¼Ã=»·5¡ý52iż]l°40§ÙÊzþSM+2ýS ÷á®§jú…9IFœÖhJp|æ³R˜rL/!¦›ÆA°­Íê£ä=ˆ;I0P36ºxëØ®é>¡ÖmkÆËÁëa¤VɆ–Ñ{¶éÖôöÍ|_RÖSÁZ¼¬Ù­¤5Ú‚©þ~JWSNZ§Þ§·`ÙÒ‚zûnSªÒÔ»þ2#ØÏ!ºèଆ_1‘$î[p[<Öj÷¦:+n~ e+‰Î.7Æ}:'·O䥉&~c¡Ÿi.\ýýïhWua%²KTëœÇ¼ jøæ~NÜ“ØÂ|7~Óõ(ïz„Ž‹XKãXß¬ŠŸÁÞóöØÁ]«±w—•C0vpO{FCªj!ÜqvÀ»™ÆΣÖÿRˆÙýºä‘6uä½ËbæŽ|Â> æ¼·¶*õÝ+#sÖÕkr–Ûû—Ûw}Ä8д:]“½ÒÌdÞiì©iÒѯÉ2^)ËÀ|\µ†¬ÕEønl¦²†òº˜=½¬û¹ZÕ8eTtÝšÜÅÑ,¾eÏFОº­à›à„¨™¨r)y¥B CÔÁ à÷µSEÜOj·æ¾ Ì©Œ–'x Ϧµ[HÍFHu¿É½~²t[ê°ª O)êØÞ>ã¼­À}8'ÇH-q'-Ö\gƒ´îZcN?\Uø-l¡n×Ô5jåoòJ ÅIgјÌ&‰b/µÀjwîaý„­#QÍÉh;ao‚9¸9_ Ú® =Ø­ªV:Eí³eÕóµcÎ­éæ§3á ÀgðHá»\Áíúp*†ë°†#nÌ{F°ZD=Ó=¶©¥ûß±åÆxÃ\Ã) ­,†'úxì!àÙ¶ÏU0• %×OkZ†¶ɸ™É{–EÍ‚Ïpn hùLå>Y@ÕU”‡ ©¹âšÊ­“XBD…å™éìs•ž¸PïFäø©ª¶»÷^ˆ÷nëU§øîžÈÝ{'½÷¢O *ZTk×TµÝ%°ìX ä^ÛÇ%{"Tü@ìkõƒ¹Þ˜Ãú5„÷˜£„˜£äšü{4RL4Òhw`¼ûB’ÞP4r•Ý9T­pÔî·y—MÅ=‹‚»²P®Ôi/oý÷íøi·sJ´ôXÍÕÚµŸ×«izÕÎ^E/ݼ÷¨0y­N5eHª¿†º-ʆa? Óóq*’ª¾J{”—>{Fx=˜>YÏ¿QžkVNdÎ1uÕŸŠÁ6è¦GÕþž‘€Q¢&ÿ~›“¸R¥\æÑB¬kSŽ ¨ExV™oÂc΃c›CTöáU~i7ª«ÓY]·¦ÊHRoÖTcàNŽ9ëwÏnéÕÔÞ5[ð|{Ììgî‘ÅôD`î;dNØ2ûëL‡ª¬7½271çÕî‰$úž1Jî7ckߌ­åïêèÎî˜ïÆýþÌcmGԲ彉ZÈùàHB½½b"FA6q"oN[0¦¦Kq×!˜Ûë­9:Ïz› öp‹èÅ‚[µ‘׺á{±NÊZ}IEŸYaS¥}X…%Úo_'Çx]‚?¦uQ±uhVݸyödû†Ç¶¯+„ûâª èæ½Kæ>µUoø¥ÿÚ?õŒÑýðñÛ×o§¤,V¿²Øg‘ÉÄGÏrglö¦_Æ ætiªxXåÞ½\M5&³š¦jâifóÕ€™„¥l[µÑØðvd h{bdH8WÙîùM¯#†P5õ3^GZøžŸéà3´¶²µ; M•ú©Ù–zû—ð³cÆ+ü„žË@N´Ž±}Ù3#Å–¬}„íYVpÝág¦-§ÞGð!ø`l7bÂñf? îež•õ©gR~ƒë·ŸNð3íx™Í¢ÌU˜¯ñÚ©•b ,XC@ÐÀ÷@Æ&ѧp0Èœ é{ÎHðZiŒ±n*ÓšØÎK¬ Ú·2£uÜÞý°Òù› endstream endobj 3473 0 obj 3377 endobj 3477 0 obj [195 /XYZ 32.1599999 157.459999 0] endobj 3478 0 obj [195 /XYZ 33.1199999 155.539999 0] endobj 3476 0 obj << /Type /Page /Parent 2 0 R /Contents 3479 0 R /Resources 3481 0 R /Annots 3482 0 R /MediaBox [0 0 595 842] >> endobj 3481 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3482 0 obj [ ] endobj 3479 0 obj << /Length 3480 0 R /Filter /FlateDecode >> stream xœí][oãÆ~ׯÐsp9ù@Q ¶×òÀX}(úPlšA7¨“‡üýR"% }s9s8"eîk­)gÎýÎOýòÏý¿ßzüò¿ý×ñçã—]]Õ¦þì¿»ü…l«Fm«+Ùþì¿~Û½íßv/»—þß·0ÇÇýÅÓ#†ÿúëîÓððÝð›/?öŸþØËýýÿ~ÙÿýýŸÆõ_ø¶k;søðßáƒB¶ý.?.þg÷·?íí·Ð×=üûlŒ:Ü“³·ó­âø÷òVô°X6²ß¢8ü£{püö¯ÝÏýjçmTÂeëèU­ì—UÚØ}gÍ^tÊ]Õ9\äZ™ -$ËBlj̳‰ZÙÀZU«ÑX©Õ,è¶•ýgÛŒRošáðBeÃñ´TîB¦_„³ýŽDÞÑF|x–bE‡•QÛ\ö8¯” ĶæaãŽDÖÉNÈ€+U­ÿÀÏ1ÏiéïŸØKU.ùgkÑa©m&0Ï+åbÅÖV3-ÔïHdlD¯³Ò ‹b”ïŠñÍsãÃëîÓ³PM{°^î7r4&†¯ýau¿ƒ^A6jÿúÓþÏu-Ô_ö¯¿ìºJwÕƒõºÒ´èŠìÒW“2ýUÃÕ¾‡÷à< +u¯<Ã]xå^ç©!Dåçô4ð<§5|N ÏCºb®†{k0pûüÚóßìܤ› nª!ýcZÆt‰q¡HÙ5…k1õ Èø æ Ìg¥`í›M¿‚©ÜCUOÞ„2Ísâë"È'ü± Óañƒ9‹WzcXc.ÙxŽÆY Ñ,½q:‡F‘ØJâÕ9¼šÅ •CJÚ$þ&ñ—.ñ—Ì ‹—Äȱñ ùC”½-@¯ÒB(…íB§$ý[ÙåÐ?”¾òžçÀh‰G’h™ò쯆57aמ˜o$îš„|ŽšQ4·.È3ªÍᙛDž¶\ásT¡°†0¸;¿ïs:å¤ýLáÚ¢ZËØ \²ÿ¼NÞ䵌<>]Akk½YFY–‘GÃ8ƒd3tÆfù°°tÛ¬•9p%¯ìXìM{ô8«,ÇÚ¤!쀲ë†7Bì÷<8‰¯Pb ÍCAžQ9yn’vÄRK+ˆÅŽïÞ,íÃ6 †¶k¼Z!Ogñôor²q¤,Ʀ1¬“ ‘Qm \Oå©s”-WüœZÄ}›ÿ/&/—3‚žÖˆ9¶Å™h8Å;ðx{¬Ñ¤’^{W/‡kï.ugœ~oö/UyìFìkÝœ®‹Ê‘“;-&k(8|Äc-½¢8irrs›-ß߃¹s*>Ô ߃!ZÐ3ètNŽió îÏ^ø8ž®ôT‰âÊELU„n«¢ÚÄšÅpúæM,[:lÞ„ªðs°¬¹=]•5]N½ÁæMÌ€Óbó&ޥśÀ•+X÷³f°7!0DËù¦nJg_7?cÙ–ÄÇñ3¶J× tÐ¥sÓ›²V¹±y >ªòä3x§§¬Õ1µ]C-Äó@ºâÇž:ÖðX[Cøzª0CyYÒbõò~Ê&ô¥{4®ûÀrs7A‹2÷sÖ™â T N5¥sîsºÆZ” })¤~l}òžêe¬û±·‡a@¡J,ˆuâCÁns˜V¼y»‹…÷¤e0¬Jgá›§‚§39ùÅ¢;m³º!1ýúð0û Ç­(σkw±F#ÀCG˜w€§(a:À}Âð Î-*¢p%$®{Â8Å|…’“Á4J€ s¥f€}.'!e]:W¸]Y•-S°“„ knŸ¹¤ô?âÌiz[!M‰sú V,¼;ÔHY_;Ýk±œÇ ‹™¹F‹züVÚlS!*­ÌáAž{!M˧ Ô †¥‰æ &À Ïy.«‚ʺ;Er$Ô¦”+”¾ΤÌ!ÔÆR*+pÆ€ò6'ÏICs‹Ð‹º0½¬òiÖ×*=Ov…rlé& Ô”4¥Š·§SUÈw¾†!t“êÉq´SöD(Ô‹s#ðŠÆÏÁýU8ËÆš·Ä=fž~_B5óy ŒW¬ž/å9˜Þ0bï÷˜yVüÀÊÛMÁ~lÓœs3«Ô¥øŒ¹.‰Bÿ Öx×Ûl˜7±Õˆs;ÏyFŸÂ\vôüÑ8[Ÿ 6FcûJ8 ÁOÇqº¬À!ðz‚þ¹SÄñ¼i|O|eyøpH†5F¡t%eKPB”„ñÖðAñƒ 1Ž Hp#tÉ– "&0|Ê1RœU ¼S2þfM´´ßâ)"žâéÔ"xI¤É„Õîmo”øP)?ÇFJz}Öž{m(]˜þ)딚y,Ón^=sûÙ©¤>stx'DbàAƒQæ&òñfÀgkÏ/‹6®¥p§Æ–c8E8Ha .Ç§ÂÆm‚éê¬êì·¾£'wÎâ”ખRç8ÐÃOñÒgö§ã«>FN¼ þnú úøÚ‡â.]A"5X~Ž~žg'¬Ž) 5>Î.Ò3‘é”G*pøË)«xÙíY$Lùñ¼O:0ŽjP´ÆÎCHÑ` ïaàÒFeÅžá‚Ë1hÑVmW›@9UÆVÃTâ¬ÁB·Ž¤Tÿ…7ïj^ åäšX™T/› ú“ ÂCÛʉbðÄ£,S"þœÖ§ö²ð" •ãñ.ʘÿôe³8øÊ£mŠºb|Z-Âà! ¹”%7#S4MŽ…D(Œöˆâ©Àum œA¤xTÊ/ËÁˆ4pú¿3²¢´b‹$L9F—£Æ£0ÁšwŒ’x}éPŠ»E‚ÕbSâx!×6Ñ=è !–– ãbžÆ•_ì¶FOüš£&¨m0í…ÛSRüJí¡L$…-8Ú~ps#Uâ6Q_Ì®'lÓMm6ŽX~ØãzväVFKÉX„"ž·”'¢0sÅv%ðŠ 0K4'Ëa$„—ƒÞuÏÑtAÂcáŠæLH»,Ï¢[DãK¡¯Dz,±ù–°rJ*+:–%8 K ýßÜù+UCP&K0“9÷ê‘( ;'¡öyKïtm'’Š4WŽÐ‹•1ÃlFÉ­­šJîÙµ…¶íä™Ni É:%P£{!…¡8]Õy¬"ñBIܹ_6áð¦åEI=çäÅ’ÇÁBO®ú26,M0ã(™ ϱÂÑ;J‡].ÙzECþkÛ¢Ýy”‰ÃŠNõ'K g¡Ç:Ek0œœ°£”|n|1ž's’ì„ÏîRÊB)}ÁÃ㶘nÄÉyÓf,= ©Å˜Su´vª;nˆ(˜ˆV%¨(—Is¢d9žQaÕH9ã sZ ëj1y‘UŠÖB-ü3%:âc&žœGUeXCaw‡·E+#B1£2éd7Q&ó uH‰”ÅÛ =®?G©_N0Ùræ÷a{¶Éa‹œXÍŠò©ËKRò%S:Xª;ÖTô&Ø^¨ÜšþÊz;}žâ7fåT^üfdóþ•ÖùJ7ùÊfy‰5¢®Œ:ªÖ)x/÷0þ¦©š|WÆy„¦]KGÛ\»ç9|‡éWFÌÚªk'Ë97ŸZö¤ç¬ºv¾càIðOó\ÛµÔü¸®; OgT[Û©˜Ð¸D0#ÜJ³í]´/ÜYN“´HИ©Ä~Á.gB‘ Gok"'‰¦ÀŠ(¹a¨''½š¢9å³ê¦:@rÆx&Pۼ鈭•îäˆè¤tµ'Äk UD§8Å]K)±HŠ £ˆáÂÞ?O»öTr¥T敨˜³íÔ¥TÌá·;{f«áih¡iusÎ PvÿœsZO6ÁY)¾²Ùå†ÍÚZË qò¾ÓÃl«Ûº½(Ó»<Ðõæ/Ê\ØO:s¡—‚\»RèõžVœSžá” M¡Øºç0šxBq4r°ö¯é奿€†íe'0_SásÐSVeGNƒú¼Q ÷ÜUtaNéoÍDü—iRãšõQé"Þ¯|ØäÁå<²L_H¨o$X²Ô'nZ,"Õíüc«tr!#Õµ> endobj 3490 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3491 0 obj [ ] endobj 3488 0 obj << /Length 3489 0 R /Filter /FlateDecode >> stream xœí][¯·~ׯÐsÈËËr¹@Q >± ô¡€a}(úP8M‹ êæ¡¿’v%’3œáîÊŠøø¬ÄåeîüfæÍ?þ}ÿÏ_÷o^>þgÿyþûåã®;t®›þÛŸþ|÷úÚŒž~|Ðãé¿ýç/»¯û¯»»ÇÿÝ)wþâü×ñáåÓ€¿~þe÷fzùnúÍÇ—?úß^ïÿtü×Ïû¿þíø×óx§|ÙùÑ~ø÷ôƒÒJûã?^ÿtzø¯Ý_~·ÿå8÷ôÿï´†Îûªy|½~Uÿ¼þ*ô²ãfƒ2n¯”>γ?nÇÿ±ûé8Úu‡Ñ*58;tÅ£ú4¬¶z?no| ­­l(U;ÓŠg ÓŒTÝÒTg‡ôPïæÿÀŸK^äÏ+úã!wöH7l'<Øñ¼›ú¸Êý¼ U}0ãØó tš‘ª[Úå„ᡨ[ﵞ—iLåBoCÕdúg ÓŒTÝÒæ­O ÅÈ\Þ:ÃÍ\ÞY3íæQwUîçu¨Ú¼åŸç©º¥]N8ê‹jÕ7Õú5ñÅ·ŸvoÞ'3âÓOÇiœm‘é¯O_vöôú£~íÿúqÿû£Abÿ°ÿôóάúÙx™žèáüÄ_Ñéó/†C7NŸ½=y™¹þBuáwÃÁ”+ýÝùI4¡¼Òý«'j'ÿ>¾‡>Oꠧ —×h® \©\†fuçB¢ýÜpõv"8}˜ö«l/£ƒx""cp*)æ’Äé‚üO©\$Þ‡Øp2¡³[¯ž§XHl “(k<À'f4Ÿ˜‰²ÇCÐÄ'êüÎ{ðÉ>g ¥å†u‘² OLO‚D©Co݉ùaêŠTZB G”½·œ›”¯PÃðGÃ Ä 3¯Óa¹Y>E ‹k§4Ý<∰<*d1ª./|ʑšêò=â5Ôf«HR˜Í²Ì÷Ù>‚›Ýæ\HG–þ k<6ä¢M{G—»0+5…¾<‚í’Ÿ˜}´0Á/Î ‡p?ó'A·0…QhS#ð™À t)Š—š¶'}'Úi„›6É*ÕÜ îÉFQ«Ó’šBÆ õsäqx‚ÑY ¡Y‚LY‘±PYÃA"14ŠNr¢™D¿·Dë¬Ö†gTε1Á‡ ê x6\À»IHwxÛXbDå¬SÅ)”Ã/7 1x$`)œ¹ [;ª!TI®ØBÇèŒ Ø Püú•ÕùŸ1ÚÏ„5€à4„T•³M®©î̆ìÚMeœl+‹VÎD‘ˆEð ‹#Î*q¾÷ñð6&d’ˆÛáCØâ¬¡›fuໂ›l” 7y‹á[™xåÆ8!® ARÞ[£+øæHWNËJgëýS:¿Ú¾ïsÒ9¡zÑnXGï‹¢£ùÐ9Ç=?ùM—¥’·{.¤ú„@@¨Ü©Ý©Á2¤|çòŽ‹q3 ®w¿½»A‡¡dåÏàBkÈ€Ø †!!™(ßù|â¥iÖÇΕȽ|¥×(ìƒ0à!‚Y,ãw’¬|ŠéF¹!mªÄ{Á844ZhUðù;jÒÆÁÇñbƒAnX-ƒ4XïSòÀrÉÊË<¬WÅå¶VlmÈbø¬ñ”0ÛãÃíÛ-ç3ZǬŸµøe÷f ÎMÃHQp´ÄÜX÷:17ÅiO&f0à÷zÆ: öÀÀè_ %®KŒZOâä@ê5ðîŒí¤Q^Ó çÓ«Gðâžr¬ƒ9(Á© „Óà™Â’g£µ¥|®o…¥4Lް#0õg¿æÚžý“gVÏ3¶óyž¡¬›u´o–Í*2FƒÌª† ˜âöåi4e¢L/øI4üU¾ÄPÿä’¹nfB^„´|JK³{½ ÅF±°Ô ‚]PýJ bîì)QxQÛ]^YÀ\¤P§ô-ü$FQ’tÀï`ò+8’ÐV”A'  Jlü„%{¹¢– Kîo"߆"†DÎÓμf'Ãvx©%©üh„Mb1iÔñ¹[/çÛb‰„& ¢j ”æ‚ [“›kë Rê&¥î ^^Ë ¡6³GŒÏ),ab\ p0VY¶bÍк¸ Ë ™#øÌ³>ªö„ãX6ÒÙ`ê›ÆÑ ž±²*<äš"b ŽÕEÔvæMÿ]ø‘©êÞÆ[­d¢Bç­ÇÈReº<D±— Øö&0²tà¨LG*JÀZÊÿpútd jSF¯!;ŒsTeL¹em‡Þ—«íKùèŸ&B;=5¨1Øm;óÇÁ]pÙQQYr ¥ì»ì>_á^g¹}®˜ƒÑ{ð +ÀnÕÀrV8™îÀ'àÉYÂ|¸¡tÆåˆIV´¼–lêT¨]C¯ &Ñl4çHØÃ'Ö¦VD¾¸‹Æqh'§‡90gùík‰šaìSDÔ Mõ3Þh8‚9Üqõjª É”©‘–‹f¯÷0˜o©ïHo¸l;çín¡,DD lB]8v³T‘¥oWÄ»†¶j„“ÇûQ #Ô–ë^"(jޝ WЦNI«Z ²†øzëÍJ&­Ð̃–´%Ñ(ÂUæµãEfÏÌHÉsX÷D1 „Ì—Cy¬ûÏå/÷ ˜Œh?cêhæt_ úc$°HÈVX] kaqÕ£¢Ã\ö"næET ºZáD%LmÄ݌ĢˆŽšíc-áÇ[dú±œ6º g/[bHXC·fLE?6ÈáK-ÂMUâ=ÑUIÚûP)dfÁíf¹þ"Ý)²47AP°‘Jp™jÜÄ­B@‘d4å º¥HˆÙš›œ-P=‹;—Å3C£6@ë»ý•"ÝPwJ•º&›lZ<XíàåKF_"¦Æë‡:¡«yÝ8úÊ_¡-àóÛ í“Jˆ/w¹WÂì¡ 9gòžh;±6:ƒ„""à˜X9¥¸¯ªe‘˜"-Èb±K©Ø Ç=¢›Ž@')XƒàälxXžÞ:‡Â‡„PhL†Ó^`/œ NôVl°ôØ¡ž!¬sAíÄM*sC ɹtœ¢\ƒˆ4³Fu¾Á þÞ±K|«­0²¯YoUxÅ9âÐkê0p y,—£ê²˜·_m¹â¶ÜqŠ™Uc!ER#¯­äÁÒÚÂ#Ái!Ý-“’iö]“ü¼:I^“V¿Ig$æÓÝy Šô þÅD˜!„<Ÿ|=b&­’™¬0øÐvüVvýA-5L„ ‚G…·‚PR¡Ö«Ú.ä¯TdÚ5pûk9XðÆÑ(hjÚle/$’Ø ‚pqŽû>´Þ† -Œ‡ªÈšŒ>Z¶…R32ð×à¾Å$©qxÙN•l#ú0óºåMn1`¦È6¹Mÿƪ!ÐÔ÷Òrs3Z~O ‰Q¼Ë°^…ê`Òý÷’Þg{¡¿,áö¾| &jó/áàcž¯Ià…s)ÌÏaïo§ë¸³:$¾%Ž;YS›o ])áv ·—µ•ÃÜòY4ð2+Èã)´eæÖ!ZÞôáv|£ÊY¡Ú<ò7(QXŽbÝ<¥³j.¦A3›Æl#¼€R‚rÅ’5¹­cÜþòã«J~k?Z‘[ãÈ9 çK´ve;Ì ”;Jø¤–Ƈ’¢ð2]QY`Hˆ&V™*ƒ:-Ï2aí„Å‹û®É^+OY¯Áª %{Ò¯H”͵a1Yk4>ëž$`Xù+coÝ„)1¼TæL¹M–¸°}¦®ÊàíjŠò´ªÆm;—Ÿ (¬L1žxëÝT1i9'PZ”2E²9ð=,áƒDYRÊ‹£ÛL¡‡'A×^,^SĈ â]a¤Dë±g‘:)µË—„ä÷ÚÞEML  Û_ÓQg©¢o¦ÂßÌót‘(zõ‘1øÈ|©¢†Ë¾ßifò‹äG2iOõDÇö J‰(ÜÌ´á£%ž€s»ÄÜuH> ,’kaoLƒÙ¢]«/V,²XjŒAÚ&\)L(HðGøËѦ•#{eä¶L%gJl1æ­rf+(6Ö8õ„§æ.¥GÖû{ÈöG¢9d.P›,³¾Úe,uŠÆ1§¬cñK(7ßÍë Ö$\#HŒ#‘dùD™Å£àšÊ·K'!=ÿH²¸êœZ¢L(õ©Hò8 J•hÄj(½)ÀŠ‚@%:MEÞíoÕwy± o¥F_rŠm›± ç”ÍŒ;W8]Ä€ mð–¬+Ÿt®Õr@}Á[Kš5 )tÁ¾`ƒÖãá'´˜™xq´å‘e”œå†lMsêkZJ…X8ÚK—­‘û >vAµ° _ŽÃý7Ã'ÓsÐã]ôMßÜtè!§Ü{¿3‚ß™œàAtg~Sõu®Ÿzo´‰èâš®÷>;Gî¬ð=ôYÂÜ{¢ uÌlŒûÎ|b˜µ¿®![Au§Ÿu¯‚¥÷ÞG ƒ¹B0Šfép‡f„Xïfüm%_øI‚Þ@.QUÅ¿IÐLM/,'æ}çêT“»øè`"zÕÕñ§ÝØý§#²z endstream endobj 3489 0 obj 5225 endobj 3493 0 obj [197 /XYZ 32.1599999 123.860000 0] endobj 3494 0 obj [197 /XYZ 32.1599999 439.699999 0] endobj 3495 0 obj [197 /XYZ 33.1199999 121.939999 0] endobj 3496 0 obj [197 /XYZ 33.1199999 235.220000 0] endobj 3497 0 obj [197 /XYZ 32.1599999 439.699999 0] endobj 3498 0 obj [197 /XYZ 32.1599999 237.139999 0] endobj 3499 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 394.579999 106.079999 402.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 >> endobj 3500 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 385.939999 161.759999 393.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression >> endobj 3501 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 377.299999 143.519999 384.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 >> endobj 3502 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 368.659999 150.240000 376.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 >> endobj 3503 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 360.019999 125.280000 367.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols >> endobj 3504 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 351.379999 108.960000 359.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 >> endobj 3505 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 342.739999 126.239999 350.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 >> endobj 3506 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 334.099999 139.680000 341.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 >> endobj 3507 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 325.459999 151.199999 333.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 >> endobj 3508 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 316.819999 197.279999 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 >> endobj 3509 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 308.179999 175.199999 315.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 >> endobj 3510 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 299.539999 178.079999 307.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 >> endobj 3511 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 290.899999 198.239999 298.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 >> endobj 3512 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 282.259999 185.759999 289.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 >> endobj 3513 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 273.619999 216.479999 281.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 >> endobj 3514 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 264.979999 175.199999 272.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 >> endobj 3515 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 256.339999 91.6800000 264.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 >> endobj 3492 0 obj << /Type /Page /Parent 2 0 R /Contents 3516 0 R /Resources 3518 0 R /Annots 3519 0 R /MediaBox [0 0 595 842] >> endobj 3518 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3519 0 obj [ 3499 0 R 3500 0 R 3501 0 R 3502 0 R 3503 0 R 3504 0 R 3505 0 R 3506 0 R 3507 0 R 3508 0 R 3509 0 R 3510 0 R 3511 0 R 3512 0 R 3513 0 R 3514 0 R 3515 0 R ] endobj 3516 0 obj << /Length 3517 0 R /Filter /FlateDecode >> stream xœíÛŠå¸ñý|ÅyÄ««%AÌ­y 3‡‡Ð›d ™%“}ÈïÇ>¾[rÉR©dŸîíYØî–m]JuWUé‡?|ùÛõŸ¿\øðå?×çñç‡/Ö°– ÿ®ý¿]6ÛH1üj¬n„ëÿ]Ÿ¿]¾_¿_>_>wÿÿ~áííÃñG÷pbèð—çŸ/? ƒ_†–/þÔýö¿«¸þ±ûë_׿üµûñãØ_ÿ·‹umÿË¿‡_¸àÂv,ëþtùóo®?wS°·~ûÿÿVHëD7—’y|Ÿ?å·ÿ–ŸBƒuÀr¶ÕâÊ¹èæ©»Öÿþýò®·ySœ›V–Ü«·n•¼:Ó^y|¿Ó`m‰]•vd§é¨Ÿ/[gÊÄ»BƒÞu=÷ËÚ.têªbŽEú~F¼lièá®ÍxGÄÆ*ð÷”l¿r©\G_Lu${È0!„I‡ÑìaúÕÔƒïþm óyŸ-gNàδŒi‹«º†Œ;ƒo0R²ãß0J§ƒn#7:ª v‡‚¡0̓_—³â¸üò 7FÑ€Þëè4У¯ËYé‡}1Öomà pwÃbDv7Íèaðˆñ#ó€?ýu,üÛŽÿÀß“qÙ XÁ°­0J3gÁßÓU¸N}¾©p&´’±`ÝS±V鴣騟/ZÙ¨TÂ=‘m¹ìLÛV{[ž@GÁRB‹RÜ-ʳxÿõòÃWÒöô×të½YáïLu7ׯëúõÇëï“O¿¿~ý×Å5ÚI£³}xÂôD¼¿‘ÐÞ‚ß|Ÿ|ÊG‚O„{{ÎÚ‚ßÀO@¸q…˜G@çbü„Ndç@HpÖðÜ87Ì ŽÏ@0øôµ£æê´iõî|ªÀêÕ™Ž5Ž0ýxà¨Bîò;Ï#¼ ¦A˜{ÂôÓ-8˜ß)˜Kƒ³Žð!p=Œ”¯Â³ÆÐmdÖ ¬1Љ`¸?‘Àã`¤¼ Á™ßµü ~çÜ´Vøð>ÀXbf„§€¼æ‘ž5Hƒìé ¡õ fêw©ƒF[Œè„ˆÝFÁ ^F†Á»ð&[ˆe f˜ÞPv,3ôqÜÛr»«­b øÈœ8¢­Ä£™GtpÖ#D 0ÖèªØ€®F¬'cëX+tHŒ¦aÛz2ÊúP°>(ï jèLù U ÃqxŠÃ.ëF Ë—%ZèÎüU ËRúb1ûÚFp› FpöÁL˜g¢Á'þ¦ˆ'¿W£ÿóF«¶_GÂ00rÀ‡ØÈ‘Ú”Wá's÷@èc,¼‘ãEˆ8£W=¸KðÀ_¸˜ºM}Ð=LCÁ*Ò±>DŸ7E08ø6c\µMmu¥¥Çúa?TïmE©¦÷ÅZÀÀÒ)1ƒ}„è` 3ˆ·§R88 “‚I4€ äa¹ÎØÂ©ùßêÊþ'Q™ƒÇHƒˆøW!>ùz¨QÁO"@ª2Lj®…@¾PT¾ßUoß ö¾"'µ­ö8iD+Æ ²&؈¾¯êÒa÷§†¿Í _xj0=Á»tO;ÀÌu¼dë@‘–¡ÿbHT‚Õ0BÀä³Oz O‰~ƒ!‰³äp†S"„÷`ØìúvrösÏ¢«È$×w •d¡·ád€Ÿ$Âa†rÖÀ½–ô®$'«iõÚ™C¿éŽ‚P³§ðw†{ï‹ ŒÒŠ0÷`¿ Æ’z†GæhïB#yghŸd¨–°¯-%‚ƒ@0¾ÀÛuŽñ_Qò­|½´à(Ó®—ä'Å^‚' ÃÐŒ,Fg I0Œlî¼tyqh˜Aˆs ñ1]1É—àù4Tß vÌíîÂK°KR÷µ^5Îuãø=™+n?×ÚÛÿS¦m؆ÊPEal;Ip6Âræ?/щŽñäDvÔß5ÌQ4ËH•öÄíÛ[¯.ƒ°Ò6Ô°öµ¥]†ÙŠtÞ†Ò0ZàÅË0—1º ‰î« ûl%Ô w=9¦=¬ŠùêF¨Cì‘cÍó{k|õ¢Ä †6¿WŒo‹ö|9Øm˜µfÌ(ý0ã':+„!Âtá}$g]ež–ïaU ’ô&Tä…yúYCÑŠr@˜71Œ5M†nµ¾Í3°9ès‡,©ŸÚ¢ìqa„P‘V*Óã,‹¼"ˆc"õ‰jçösFœ×gRÀ9#´Yˆ¬ çþ0ð ¼0“BÁãÀùB`¥D<ádþµ¬˜ó@ßòÞc³~uyï/23ðÀ¬sÇæ»W˜uDùYçŽé©ª,ƒ"RæÌ0L÷$Ú1ë6zwÝo²·{Ê ÎMcfòù—×u3WÇy“×oòúM^Ï”ÁùTÁéÑe/—sNܲ—ë9þôÉ޸Ǡ6 ÞÈÑw†Ó¸nhmÂ91I2ipù¾ÿuÿ0è[ÑÄVæÀÑ%±¿EGÏ^B%ÀMÊðÉ“„àb’0sÙÇð5ù'çÍ ŸÞ=´ßV”ÉQû€Ù¡‚´ L¸gBt E8k¥G_ aÂZQß'»Ñžg+“ÜšÃïÙ.áLÒ\„ØÕ(‚ƒIއähAˆåNWÍWž¼ yImžt‚ËÙÜŒÚÜ]Ê8壊–<^¤¹sù眘 —nGD&‘Ë¿šWœcÈ`U à  Æ¨ãwtQâDÝIت™Ô-}¾¡'Lczº7m­ RÆ©ö8P%×ÓÜîOàú4ïA¢(ˆà/IME¥,¤»ôdÀ!Áö¡õpÊľ» Nûq^h=¶;‡3¬Šz•½Þ9"-#Qεrpz0ÞàÙâ¬i s© '˜kÀ0þ%Xk€ž}eà ±@R_õÃN…^fx/22ä2B«JÇ=¤BHÕú£Ú+GWݪäÌ&5 ôV×uä”ñàŒ1T'û¯bof¸õ3XMΑNÆ‘á«8, ,£–´ÃSñ§¨èY†Z »P2*Ç_>Èi뉙…•„µE”‰Ãl¹9”WÀ¶\°xX’’hŠà6ОR0†×~2’sؼK•~ÞOrH GÌIL¥(u[¹„äùŽ„Ç+‰=€Ou®É†…ñø0 íi3àãè~qQP2ЧT!ƒ“uB³ÃÝŒWó Š+k3Ã¬ÏØ,Ú𹂨²TÇœ»—óä¹$­¬û|5‡´òåÁ›»ƒÄÝAá1ȉ2!àœ¨»û‚­/¸C¥Æz°i¤ I¾£xuÕ¹¤f[N wZGÙ1ŒÎ®#]‘œ„Ö>=ýêŒÆ ³ÞîŒh>’’z$Î\’»R)ù¨àÌ!>¬ö`¢´¶ê@#ùÁN%alú‚˜GE)Òš@+{Aü ¡àdœ"¡Ê 8}¿]S*þ˜-q{ž~Û4ÉaZÂÈQªzÁ½–4WOPððüPöú¦°äÜíT¥¢¦l°Þ,Qj ‹|úñ"*û¯Jí‚JÖÐãž~«ã¤µ¼AþÞÌñEà¶öÅüËÁvguyÀ¬ôHqât,8OÜXÒd-@½Ã£ÒÏ8÷˹”„©•$´$lw-«èÚFf0ö2ý¥×¬Â©-Vád0† YEÿ–\ö²^ǹ¬¢ŸÁ¨C ìÓê6Nö4‰oÇ$³†… ’;§j ­²BRr* kÆ'V|ÙPLšË ëNYIXwˆ»&¯¾Å'á¾­µË^¦¿äŠ„u'WBÖÙçÁ¾½%—½¬×q2 Ï—mFôWÇ©´$õr”˜d²ç“qÙ§d-ÊÉ^ò5ÙK±EöRù$Ùµdßµ„=ö2ýÅ×d/ÙÙ çѵd/fB{Y¯ãd²—Ó}°p©èÀ©÷øËI Ãökº}Ô*2Å£œLVÁIJ¡œNÔÚ½£õ–{Gkß½Ó·t¢'÷ÎÔËø—Z»w´Úrïhå»wú–€NÔäÞ™zY¯ãd:ѳ{./œq'BÝʉ6ÒG2âê»Ç.Ê·]{qt»åÅÑÆ÷âô-âšUÛ¥gcFÜvË‹£[ߋӷˆÛN^œ©—õ:NF\ó¼8$Ìÿ# ÎÈ‘Û uL&23û?ت¡œÈìÚÿ¡í–ÿC[ßÿÑ·Df'ÿÇÔËô×Úÿ¡í–ÿC[ßÿÑ·Df'ÿÇÔËz'™›Ñs ‚þÜfÀ‡ÑÜQÑI™¡?2#+²<´/+jh7Ø ™@ÝìÝbÙPL -[{7Z¶åÝh™ïÝè[|íÛZ»ìeúkíÝhÙ–w£e¾w£oñ ôö–\ö²^ǹÚ²Ù»ñÀR0 Çà“ô T9q“UáHQS" ‚Ësf´ìîÌh— =•Gi™«›ó£›˜wWr$¢¡Uu-b$µ©å¹ûˆy‹­»aËaú/ƆÁãàupkY ÃÝí£Õdnoéu7z=ÌO—;‚¢y·7’³çâ òìåfb0“ú‹HÁ( …Ǥ½?ÌÝgJÂý7é× À+¯ÃÎüu J'²>² 1YµR‹eC2‘Îã!Šmñ%|âV"ä!··Øº¶æÎC¤Ýâ!ÒøÃHòÛ[zÝ^s*Q“WGÀåa‚.°‚9µ/¸YµŒ#ÑŒ¤Æ€Ä3<Û ±˜x½ƒÊ>,+ à°3zv“ñÚ§F-R Øpσfø–Íp߃ַø<¼ÅÖݰå03¾åA3Ì÷ õ->oéu7z=Ì™løäAª6¤wŽXÝ¿/¡Ê¡U$–"?U¦r5ëÝ‘ª7\áG~±‹"~ô¾:?2|öÆ9¹lHæGÂóƹå3Ò÷Æõ-?’³7îÞ [sçGbËg„ïë[~$foܽ½æT~$'oœprË£_×^ÎPOP´–qÅ®‘ScH/Ô¸O|åÔ(ïN¸UCñ)ºQëX2£¶bÉz[Ÿp÷-þ)zß6œ“O½L­cɌڊ%3Ê%ë[üSôÛ[rÙËz瞢=ùå"7¯bê*Àêtº“:3~ÑèÙ""7¦†TœÃeÛ µÉ‡²VÌÔ?&+Ü3ç§tû{ËÈLYäÁGc°Ã"­|Rô ’‚\6Ryq|äQÎúO>ÌvŸºùBïã¼÷§2º7úŸ¬Ç'`ÿ‘9ÉËFM6:§£®w²÷äpð¬:çh•4È$½J]ÆÅ¨ú'ÛÛ W3ç‚`Q$} .fBRu¿žçKp ¤=øGLÅÍ„ OµâÞ²ÝjÅÌfS¬Ybšûò®Ç^rÞŸ‘)XKr-"+ñÙYÍ*ð4\/ç¸Y›iù°c=¿õä#øD‚Ož 'ðܘŸ8𠸡¡' |÷Æá'Ñ`o6‘oÞå¯G{*à'´qG‚+`kGÙûü=å öÂs‹|C1Ž€é†{#ßmƒ»c< ·È80•À”cLÛ<€ybCÀ'¦ÄnKDÖÂM€O"³FHéåÒT•Èsû›DŽJdxÖoù$²b”Ü–âYó †oÒ•\º"z;JN¡(„5dÙqÜ: àˆ8|§½,˜cÂÅ o¤£=H%e¾ÃóbR¤#q؆H°ë£D‰À·caÛ0 PÞ«œSós'TÝ¢öE7.^kRS"´­'r¨“´8¸A9#¹Í¦Î4/ú˜ªèJsÌ=pûu€I2ÿ3މ b¼O»Qƒ–wS”¶M8 |˜£ûȱLþ _%¼u‘jý»¹ôdGþ‹BÌäDew¶„‡(Yrlòͬ•­KÙ¯ÈîÎ?<`% !‡a«eà`·~ñzöØ¢‚Ý>¯Án`D1² ƒCÌà€80Ä,òÍÓþtÇ97µÝŸ<“œÜ*¡Â? N1˜6<Ø'Dþ“H°!-x.€PöÍüq!g†ôæõ9ßë“q7^Î5Áás%…ÈPÖI)èc,–Ãï8¤¸¸0R&{W…Œè…û¾žŒÔ˜—ê'RÎcÙo<õ°ú¥ës79l´Ã^éý»¶Á#¦ÐàzGtÃ5If*'‘žQþv;Êù< òUõ6ùFÃAª^¥š³€:¶„ïá Ð:Ï…Ÿq›ãöfæý(Ìñ® —ƒ ÕðÂî@óߕʑŒ ˜©a꽨šàBOõi¢Jv> endobj 3520 0 obj << /Type /Page /Parent 2 0 R /Contents 3524 0 R /Resources 3526 0 R /Annots 3527 0 R /MediaBox [0 0 595 842] >> endobj 3526 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3527 0 obj [ 3523 0 R ] endobj 3524 0 obj << /Length 3525 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`4âC vú` 4º‚‚Ùl‚ÅÎ"½{ؿɢl7©‹”,;êÚnÓ"‹Åb±êc±øù¯¯ÿ,þý{ñùáõ¿ÅWûúðz¨ÊJUýOÑý~ºü€ëRðþm£ë’›î§øúíð^¼^/íß÷SÇíK[84ÑWøû×_ŸûÆý'¯?´ïþ(xñ}ûßÏÅßÿѾühëë¾ðí êÞüÒ¿aœqÝþsù®+üÏáo*~mIÐÇz»¿Ÿ¸¬˜2‰Ž÷Ó£ìø{ù(j¬*DU1¥ ÆxKgݲã·~jk;‘QjÅYWFÃ÷sZjøÐ”iTÑøíxÝWK­ˆK‘§¢#“zÆ*Ùk*d¬Q²©f°í¤‘ÇNš:™]¶¦dv k[ŠXRϾÚÈ|—²ê;)Dj7OU¥VT·/Y*ê(bi]8«"³^ɾ›¢’©ªJ昑užŠ:ŠXZ×ÖãªÈ¬7Fõݬy2džª+b¬ímž14]%I]X«jWûßÏiHw=çµh—÷v|G›É¶¶3Á{×MêX 5%ºÐyÖö#E,©gvÌqMYÇBÖ<ÓX 5%³°®ò¬÷GŠòŒ¬‰ªùX]›L|jJf—byÖœ#Eyøk"ó½SˆG¾§ú§š’ÙÕp–iUWIJϾ»5½dqBùÙ }<øåíðù™I¡;Ÿûí§–îŸú—·¶³uñ©³Á+V¼ýXü¹užÿR¼ý|0emDS÷ž~_Â$*©4,Q°ÄÀ’ïâ)à°6ŸíT–0XòR ¹Cêä¨Ä=Å%u8X5ÆØLÂöù)Ýg{–¨’3íàöÂJþ³p/i8Þ ‡9ƒå9Üe\ÚåùR9U¦ #ÎSTGVO›Ùë<ÈØP4Âôâ@ñ+<°Ä äóüOŸe ŽÀR¢QSN3Þä!ò„àÚ-v/ƒ°ÆÑ Y”rJ8"Ø™ôE˜tÓÈEÊ9â”óøya¥ÓÈç^V„†4Á —ÂçvöÏ="28 {D䌈Èu4W“$}?óÐèÓ™R°æ:¡OYÁ¶lãJÊö1Î{*0m„hနR${öëî$ÌÀSÖ¶-ðšÞ‰>gÛm×»ôN´–ûÏXAvïd÷NvïdKÞ‰9‡<Ý¡wbN;àkx'MÝ¥Z„ÕÃnâ™ÕWN¸å´s·æ’rWÂÚq“Ó1’ˆG@ÝvLáÒ‹œÂ‘¶ôj7[leÔMW¨Ü¥"")-!Æj[ÝD-Vñ=5ߪ÷@4¸"Â*u ü–Gk@.«ôä~ä«’€\º³¼Ièi/¹Õ’¼ ¡Ä“x¦îî]ëvæµì,ì¯{!¬7‚fêéfãu­—uV0~º÷ê€(cv…¤¤`Y°¡)é}¨+þ® \'=Ì~Ì0ïµ?>“z'b PÛVñ¢Wº#oðLdâyAÂàGÜ^Jix^ÛX:D|ní¨ì]šV—¦ô<ËZ¸pB¸ˆãÜ×>¿Lº$š2Ä“ 6¾½R²ÌÉžäXA³œç/Û¤Œ}é<â>+¿éÜÚHg¡¡¤êœÞ=Ea9¼°FÀDC’9½³Öà…RªÝAPr¸óU‹v`-Œ¯/8¤¦Ï•wÙéœÉ(Ú ÛÎÞ”‡k¡‡½Š×'¼tôNv°“Œ_ÏL;ÐÛ1pv?k+–ñ‚šëÒiFg1 èÊkV”…[ÍIo<€†"Í8‰¶ ³íyꢃ?GRÎ÷«2—§(~Ë'~æœt?±S.·/¿bœ¯XCœ)wx»$ò#æcåë¢:kŒ}WÙ™aA„‹KpËÏ“±8«J%(Ö¹‹OÙÌʉÑnC¨¿ó ÜÒßxé1G8‡Â\ÈÂ9¶˜ÎµcRΉØÊ’_ïî ºû¼—½ú™bhG¤ ‹0*2dÚ^O²"¦CБdµ¥díœÎz½¸™Û±ÊYM˜==oiò’cÓ1█;„Û0Ê1L€USTyÌ"6í°ãÅŒÂ,Â5:kmÆQ²Uß’MuÓ'IJ亟/ 9ˆåµ¾ÜÑú>7ð¨ç´Ï³_ãÆ°@@•±€Ð™gG¹QâÆq”>"#1×B¼EÕ Á^)¢i?Ò´#MBúOö „Kâð\J8+ÿÜþtÎÔŸÀñnŒ©†ÜÁ”ð\¯ —šaîP2_Žz¬…JvІönJ¬'%úãÚWåD;ãlö2f&Ùv$­RþRà•[rqî6¾öU )^_ŒGr€Eo¶ÕŽê¾‹ ÊÛ󈇹¯vþ"MI’Z&Ò%Ë™ w†2Š`ç Ü*G é% 5YÜλi)`{Bô¶|´,©û¸•/—¤bŽŒŸÉzdj‘ÃF‹Æç*g%º%;ÎÄÛ€…3!v&\_¾lµ‚/yºxc‡¿,g,ü%õôÕU· a j\kpFœ‡Â8˜ a)œW@P’ìî°M•ÔÂ|0 •“¹)»É1§öaÀ1~É2Xþ*!$þå*ËVmN7iaì«ÂŽE ¥ V~„ýœÛ:°ŸƒœýS@I²R2{z§‹úò š:_„²ÏÛßâ½mìx( *ìË×oÖ}²«3Ù/AƒN PkY9Òga˜*ºµÕàÚ­@¥J5®v,=ÙoÊfü¬r3RÒë_!Jnœc-v ªKÕ«UwÑkGÃg |¦Wb /y%>F°S{¬¶~š^~ò¿kÏ‘>£g¬Â+a¨VáÅ=cG,¦ï–¶ãHºî=¯ÙrbUïX{ A°ì@9ß!‰Œä¹…ÆJâ9 L…pâ$ÊõsæÉÎ#š¹˜+˜&kÀÌ€\c ðˆeå1{È2´®TÉšÖÀ=)ðô¼8r÷’sm*^ÿ5•|Ì endstream endobj 3525 0 obj 3350 endobj 3529 0 obj [199 /XYZ 32.1599999 628.819999 0] endobj 3530 0 obj [199 /XYZ 32.1599999 341.779999 0] endobj 3531 0 obj [199 /XYZ 32.1599999 72.9800000 0] endobj 3532 0 obj [199 /XYZ 32.1599999 150.740000 0] endobj 3533 0 obj [199 /XYZ 33.1199999 339.859999 0] endobj 3534 0 obj [199 /XYZ 33.1199999 626.899999 0] endobj 3535 0 obj [199 /XYZ 33.1199999 148.819999 0] endobj 3536 0 obj [199 /XYZ 33.1199999 71.0599999 0] endobj 3537 0 obj << /Type /Annot /Subtype /Link /Rect [343.199999 396.499999 394.079999 404.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 3528 0 obj << /Type /Page /Parent 2 0 R /Contents 3538 0 R /Resources 3540 0 R /Annots 3541 0 R /MediaBox [0 0 595 842] >> endobj 3540 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3541 0 obj [ 3537 0 R ] endobj 3538 0 obj << /Length 3539 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès·ÅE¼½90l ‡A'“`03ˆ3‡üýHOê~ݤ>.Å"{y²¿çV‹K±ªXüjáÛ?ùÇþ_¿ïß~øòŸý·åç‡/»æÐtÍüg?ý}sþ4%ç_{Óä0ýÙûu÷}ÿ}÷y÷yü÷ûNtÏ/.?ƇÇ.æÿöÛîíÜùnþäˇ¿Ž¿ýo/÷ÿ÷óþ‡¿?~\Ú›¾ðëÎ ÝôË/ó/B iÆÿœÿ6=ü÷îoØÿ6Á<·;ýûFj¡t/³Æñýôªxþ{þ*ê¬Ù«FtFï…ã8Û‘ÿýçî§±µÓ0ƒ¢ïtßD·:þ;5Ûuû¡ïö­Û¦3µ¸–DnC½< M#Y3î½-L'{Ý6ƒ¿Ç×4ý¼}îÌ-e“ÐtŠ©¡qD"kfǵ€-4_þÀßcú1c'²Ñ“´5z`.Q“bTu,Ë{j)wU¤hydöyD,Ë‹["Ó]v\t?¶”M.%˜è>ˆ‡î°%2ÝUgž'9´ÙäZZÊ&—î$ÓŽ#Y3;ҶŵÈVÌz¼ÏÝæO-e“°5L‹:HdÍ츰%έ¥Ó’}ké}’¯âz.ÍÔ÷L¢6ˆGÅÁ–Èt7R3ÑýØR6¹ŒaÚ£¦ñжD¦û Ý-e“k0<&÷óˆxè[bTgªÑª3Ænd£¬n>³ÎåËáü»çÅ÷_woŸ„VfÂ"¾þ4’uúÆ›ùÇ×qéÚý›éœ8nÊ_Üÿ±iÔÓŸö_Þ ‡vP};# 󓦃O>Á'Ðaà“÷°µ>Á£–°<8j¥Ð“V£'ö#ak¾£ ­ñ´€Oछ‚ýü¯)ቚùàÓ×Q–ò$cb¡›g±è[yìrf !­îÌ8[,ÌË3ôAÏÃvx±?4Î:|‚ïÌë—fÁéR˜UV_i^ôéCj|‚'Ø¢'‹¸›˜Žã¯öV«~U~²¿Šigáö§íi9ƒ·ÙcQíAI#d뛸|‡˜ÏsÑÅkÍۃϚ'æÂøYxYL:³øÀ¥ <Û¤ÂVÛ>ÉHz¨‡EoѽBŸÒ^kG†S´–Gü«Qg³ÁÇK¨G›ØÒ&ŸB ÏQEëèFGIS¶4ŽÓ³Çv?^}ê,ÞMp‘f‹PÈãXcxϳ«Š1iœIÄïÜ9¦ž§§¿sús(×5ßÊ(»çõf°ô „»Ô‚µ²iìÑ„M-†­A@£ìS„x bØ4𘸟ÖJ.á`oæ‹ Sá gúãI«‰>È…Õ(>#%l©¬GÏ©-<=,.”4ÞÊðìå¸cGد~l,KŠƒç1Î "änÙñ6 #b}à¡Åg!É]ÁDåÏpmoé}ÅÂåhÁM5¦¿§¿d3%F§)çØ…—Åë8B³a¿…ѧùCd£Ò ÄV<ÆV Ñ…G€-j1{ŒÇH†hžq8’3´HØŽ`éôÿÁú ·ro‡19,ô”mì*?¢iÕº®.Ûïr„ºÔ÷ œ”n±„QªÒ±åfâvRÄ +ž›óÈ„Mk‚æK1ϯ¸g©Æ‘ÿ»ô\QZK°ôjÅ ú˜± û+”K èeÝò„Óó˜.a™#ÄKg¡m›R6ß H¿g˜<•–É®ïm«-|$t¶6J|Ð9³X¬þçôy—޽y\šŠ4­²PÉ>—ä²³>¯Ä¥×ÙÅ.ý„hegZwãf%ùÌ<¼€íÚÇ0óLq3o±òº>}µ=ä©ë³Œ5©×í…ª³¹ŽÅ%çz4‘^ÖÞHç ‰'–¤½\€AΉ“ Ü` ÂYï¿)ºñnI|¨¥Ô“àçøÁ°‘½Ä²ŠöØi¯¾ŠCRKÅ µoÓêÖ½i`Öµ° 5UÇ/¸ÊmoS)ñX¿NÞãð²¸,* ¥h³øøÜ[> $ä_Ý0Ë “fœ?òônx¬Gn™-‹÷àç¹F¹x.yÅÞœrÎ|9t ñ[4Ó-½n•®ª0 î,ºD|q­¶ÆqEKÒò3›ôc“À<iàÎ;Æœ^BÖJ²©Þâ#† à®ÊH‹×,£¤—˜ø”e©ë"e˜¼ÙK½2<Í]6ª½TmãÖâm²Œ³{ùŠp¾2X_9)F×ï2¤?YÔŸP¥/A«Eùt‡Åeì(¹µwž‚Ã_´ï+KÀ­èÃõ¼¼ÄâŠæÐ馻ø.e™™-F ‡Á<¿mÛ kƒ$,Ù ÜÁ•‡Õš™ßûá’+ðçõOJΑ’oE8ÂxÌ|gŒ,AûEj†¹>…W3Z?­æœ…<(NBjæ¤ \"+ß—NÂDòL‡£,3Æv«e6iõ·2JS„ùŠ˜‰:{ɈQNñðÖÝ(\ÎkÊŠ ìføìŒ*ÃF%ÃJ;ÇŽz5Ì[&V¢Lu ¼Í'HðŒöœÇ)½'…:f(Þ@Œ¯¾ "΄ÆÙÓøIƒG€£áp”†µ 4àmMb˜‚—Úxµñ|0¿a®Â+¡Ä_-¾Æ+çy®O‹«¼+n+Î[¨8Õc]îpZsÚ>zzçkA:H”Î)JW §fò‰ˆÖäpîSŽên¢A’cŸiíY«¯ D0ÆÚ²rÚY<ÃaÄ·R ¢°ŠMÙ8"Ik¬Qƒ„5IpZ'dV„ÿÖc9‘„›rÊŒ¤828DŠEê=4Z–Ó®<Ì“LAšÕ:ÿà—Ýb-£‘§!X¬ô&HŠ;ÃqMä(›2JŽåš­œ‹qÂå„X“bë…C ÑÀ›çŒŒŒZâ’å×pЇ{Á°G âRdc- ÆèF.ñØéVË«ûÔ<µ)+yÎ<#Ø|j›OÍ?¶Í§¶ùÔüÔaõ©Ý§ÿų¦„ùð숰dº68ÒÍ’_Á’¾Y2›%³Y2›%³Y2›%óÀ–Œ'>‰B·Z—=v§k*h—=º_qî\p-÷BÂ…0ç/ÃûE‹ZiœVæ^»^›¸¨˜•û ÝëᵆW˜P­ Ò®?ÝLpoÅë^†î‘^¬ÙÕ¢Û±uO™iñÜ/a´½" }Ù;ón¨UB”YBì áN'ÞP‚»ÊÎ7­µ +˜@ï O|G7Q£‡°<T!lèò•ѸaC Å«/g¼³:kéX¥3%p®H M OO7 ë§ '¼‡Š!°ÆYÖ ¾J¯;^UŽUzýKöŽç¨‹á‹P©›’5ÚT2àâôÊòŽézk‚@D*+„û!¤÷zàó>Á0 æ7œD…G@)Iuo5ºÇ&)‘¹_áh?t—Jç¦ã˜®žÙs½ê Ч#%Tù¤]n¦ÊÏ\*(òr0–Ì{&ÍqINͰÃ^‡‹Îã"†—«sŽâz©¶£ÃÖ4Þiáî,ñ¨akø:hìÂÖ¸¼>¸\#\9<9p 'cWa¦ž±A(\ÎRÇÃ!xÔø æÈ£”` ƒ’nã‘z¬w詼mhšp~B8ÊêüÖXÜtä¦#XG–¼¤fAu΄ýV°ØÃF (¿gh9ƒN®¯+Ä’eí@(ºßjsâÖ)H*EOÚ0Kcpì1­€2¹ )§xÂZD”UcAqXì º—°$ö/(ìô ï['8\Â;vÙèŒG(Väž°ª^5olÚ•Å$ÉqË䯘R¶+<£¯””öê²ëY´Å7 ¥l}ñ !µŠž+qòkÐBµó§èù<}éœÆ£Â¡=áÖ°€¹ç'§gXÁÜ9w‡ÿ²' Ï>Y©‹Ž[9‹úÿî¿<#ºg6X~|û5é¦Õ³K\?{ùÏûj˜q»½)º&õƒèϳWÍ)Âaünä‡õCÜ À~—ý¡_‡¹û•'³jVê ‡ÕÀ£¶=t³¤Ûb³Öï ðYP{y“yì²ÅZk3{œò~w±‘Wfø„ÞYDní‰@óXä)íeÅRæ~žœ˜ÁuÓï²§”n ûëÓù@`ÞÁ|¹W8«í~‚×Ó¯òrœN?^üÎr$Yá}7}DëáÚJ4 ÉZÄêbjxFùÄ"'Æ4ÝAL®FK`ZØ1V‚g¥K?sî[ûÏ»ÿ7§H[ endstream endobj 3539 0 obj 4763 endobj 3543 0 obj [200 /XYZ 33.1199999 621.139999 0] endobj 3544 0 obj [200 /XYZ 40.7999999 289.939999 0] endobj 3545 0 obj [200 /XYZ 32.1599999 746.899999 0] endobj 3546 0 obj [200 /XYZ 40.7999999 597.139999 0] endobj 3547 0 obj [200 /XYZ 40.7999999 369.619999 0] endobj 3548 0 obj [200 /XYZ 32.1599999 623.059999 0] endobj 3549 0 obj [200 /XYZ 40.7999999 289.939999 0] endobj 3550 0 obj [200 /XYZ 40.7999999 597.139999 0] endobj 3551 0 obj [200 /XYZ 33.1199999 744.979999 0] endobj 3552 0 obj [200 /XYZ 40.7999999 369.619999 0] endobj 3542 0 obj << /Type /Page /Parent 2 0 R /Contents 3553 0 R /Resources 3555 0 R /Annots 3556 0 R /MediaBox [0 0 595 842] >> endobj 3555 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3556 0 obj [ ] endobj 3553 0 obj << /Length 3554 0 R /Filter /FlateDecode >> stream xœí]K¯å8nÞß_qÖÌiK¢dt½d Ð ddôd2¤©Ì"?~êX¤h[òãœ[å* ê^Y&e=>IäGé§úå?nÿõ÷ÛOùŸÛoÃÿy«î•«ú?·öï§ Úß½klÿÜ~ûýíÛíÛÛ×·¯Í¿ßÞ”ë^þkŽ*zÿíoo?õÊßú”_>þKóÓÿÝôퟛßþzû·oþûÓ ¯Íðû›G×þðßýJ+í›_¦?µÿòö¯¸ý­)‚ïä¶ÿþQƒ¶Mù7•ã[xUu§¯Jʪ›©Úºº)¥›lSÿûŸon¤…bܽþˆ?¯Ñä{M¦ÑTASø#Õ3jt ¶B/þ¼FM­[=PÙÖ®ÑLk½•¢¶ ²Êï#¨-‘ÚöiMÔó¢öluÛ”;nõ¯» 2ýdßf^üðëÛO_°”_ÿÜ|m‡Jý¿þþÍ/mÿ7þöëŸnÿÐ@þãí׿¾){¯ÐÔ¶ƒ±þ‰ÒÝ“z|ðxR}îžØݼÒÓwªº{â ¶K€;ô2f²* ïú.Áݵò¤{©#•uæ+XY©Tý™æ…±wÙç­/ˆr4¡kQ”Ê„°"Δ(£æKz‰ü„Zκ¾Œ¬õ—ź©ÖwÆ-]œU'HÂX‡Z쌟m€gŒ(h€"$¦ÔJt¯ï–õE%>qÒ“J”6óäÃÂ;;T‰ˆ¬ÊRh=A'R"²¡54ŠÒc_[ódˆñ1&£Úú!•ɼ GßL‰Øw²šø@ BKfÆQP;ë"”ã£^.H þÜ7°º[pmæâåÖšiÇ=æé(Îè }÷wU\åòЍúYœŒ>ˆºáyOZ?Ù6³ÈýD.Àý$gËX‘°ª`ÂÇ!—!v$Þçd\•Ÿ”¬¯Ä'ÚIvq@8%y:%Üis¦@Ög2: XV¹¥¶txy,>£¶¾n†þ}äšhØáÚz¹MY%dt†L˜ÜeKlýFoXoìPÇþ¦!UÇJuul*;ª:§~tW )C¹GdYd1ýWk}wÐMÓ¬ýNUìɰªÃPÊO4-Šú 'jdÅ—“—?õ)æn€˜YÔаèÉ­¥wJ¤±B³D*++¾ú(~{ßcŽbæêT4ø `ÁÊzËN‚¡8øÙ¦#ã]>)ÈSÍzKJÑvïä2®°Í1a¢¯<Ù®ßæíº[†¾×3—ìUK¬½3+—‚eÈroØsP9ÔtBÈ1-•Ô®2ì–€ë3ÔÓw÷Üê¾mVÞµW–§¡c–XFý©|x–lØÏXÝKöÛÇ4Á ¯ñ!:Ó ·l¢J¼©‹æÙœÉê˜ÊzÖòi_îÉ.½£LV0$ *XZþˆÿ®öÿßÃü» çhÏ Ãd×s=  ÈÈ”AÏÈh“ VE¦æPãáwÅ2_æ\e¸J˜^6È É=Ès9€Y²æØ>W°õзœ‚±N×´©ÜU3fÃõ+“ôýœ°6·²@Úûš%ž>KœµÚÛÅ¢øz¾Z¶¨dî¡}—ñòf} Qq™eû¬Ø–+6!£ï› 7=˜4–¹;ÒtN9†;”±vžl¹#2r¡>ïUÛ31\u²®/ÃôÀµ@z2t¡Ô9¸ Å'?ç—@< 'õލgh“Ô1ŒMüá¨ÀžNâ ŽõáUΆð´ÙÙA3îp9H*‡µ+x_¾ÿÇ™£òHZÏlØf6“òÖ¿`{¡ÒÑÖ‘úx|õ~ÂzbÄô0šmèéTŒžN§Ð³=‚lM CÏ6DR`ª# §«Rèi‘êhRzÚ€—£Œuœ€žÎIØÈÑóã…ž/†ž¡õdô4²)A6¸í¶£ñN×ä .¼ËÆ;_ÅxçU AXÔ¤0¼ksA$¦:Þ՘»ÚSM û6FR0ÖqÞy»ï(Sð»gã]h=ïdƒï¢ô ¼{¡/¼ËÅ;ÄïêªJà]]i‚Em Å».DR`ª#àúÞaMñ®Iax׿ÂH Æ:ŽÇ»º‚õxGîÞ=ï­7³;.!<¬ ¼o.عϔZÆïÝ\Ù"J£%õ~¡t.J×ÊÇ(­0…ÒZQ”nRJ·¹ ’S#JתN tÝ42ÑѤP”îra$c' ´&þÌ”Ö, èBé'£th½挫ÿÇÆboIí^XœÅ¦Ž±Øø3_OÝûzb4…€¾£˜êXl\ ‹ õYµ) ‹Û\IÁXÇ X z=› ‹_ ‹Cë­˜—ðn'Ú®ŒÒƒ“ùH\uŽÔÔ…«Ù¸j]Œ«¶Ná*óÕ½(FÆ6DR`ª#વ)\µÔ›Õ¦0\msa$c'àªSëq•¶é…«ÏÆÕÐz3–×êðLÅÒJöHŒn.||õ…‘ÙYÛ#k—ÂHæ9ª{ÏQŒrm.ˆ¤ÀTGÀÈRYSX›Â0²Í…‘Œuœ€‘>4Ã2F~¸0òÅ02´Þ F–ø­äµç’ÿûFéÑZëÅ¡ôJ#Ä(6…ÒÌßU÷þ®gÛ\I©Ž€ÒhR(Ìo‡š£t› #)ë8¥1œ¿ˆÒæ²Ö¾J‡Ö›Ai9ÔMÆbùWXɆ¯¾02#½2Fz ŒôÌÛä{oS„r].ˆ¤ÀTLj‘Mõ&0Ò+ê5kS(Fv¹0’‚±Žã1Ò«ñÀ ι_&"\ù\Œ|´^Én†¯_‚žå–׬¨šºp5WMíäM*ÚÉ3Ï‘7<Ú©Ë‘˜ê¸jRÑNÞPX›ÂpÕŒÑNA Æ:NÀU#F;­H¸põɸj–£d\•ù«3|€¥ Á£Þ/”ÎFiGUy›ŠªòÌå-ªêrA$¦:JÛTT•êOkSJCÀe;ªzè8¥­UÅ®¨ªWCéÐzÏGé ós‡ Ñ†´â…ùÙ˜_Ç‘e¾NE–yæWó5,ërA$¦:æ»Td™wÔ?ئ0ÌwcdY‚±Ž0¿#ËxÂYöj˜_¯ˆ,“C–)–¹fâ¡v3'ì{¬¤\¶óVæõWŒÒ>Ž‡ó˜Š‡ó̯æ‘ÇÃu¹ ’S¥}*®½C™èð<®Ë…‘Œuœ€Ò(ÆÃñ„+îÕP—ãáfNq‘qµÙßïw8¤õQ‡âæ".VqlV©Ø6d^:T<¶­Ë‘˜ê«TlVÔÛØ¦PÄíra$cÇ#.*1¶%\±m¯†¸Ö{Ä-9¸À®q+cˆm{Ôî…ÅÙX¬ãضSXÌ<{hxl[— ")0Õ°X§bÛPSe›Â°X±mA Æ:NÀb#ƶq,¾bÛ^ ‹ÍŠØ¶‚³eÛï ~Ëï–ÎpVâ£>.ôÌFOˆ#ØRlȽ&ÆC .Ãç«Á§ß&ö>á³èFÍ‚K Æ'ÂçcÜîŸÐ ŸÍ&•øtºŸ}.ˆ¤ÀTÇŸÍ&U1,‚¬Ï…‘ŒuŸ.9‚ŒRf¯²õð +JRÑw‡Û¤”K°æ‰ü95¿XVU‹5 ït©š™FauÃj€µ}ÁΗIåE¤º˜ù$v>±[*ºÎà(ÙЋ}@®q0K#tæûX¡Y½¾‡°bw›w´ŠçˆÝhRÎ šÅnô¹ ’SaÞÑ‰Ø ¨RŠÅnô¹0’‚±Žæ-Çn°P+Âîµ–í“Ö+±ò–\A}[ÀÔäÛ.ûo6B#!$"šTCQ XDCŸ ")0ÕÐ$"šTOuÑÐçÂH Æ:N@B#(°BS=Ü…ü¶aá½Ôf†ê{]Ùr°ï¡î>Üvº3"Ž÷O'æ€õ ý‰Ö¸ü9ògËÜÅåûš™§£]>ö”ÌNü+J@MÝ2¦Êýe©¿Ói ÝÛ`jþVl¨<¡ôãoÅþ$¾#ßûü! A_© esîc.º/ûƒXê]o„ž¹+Z,ÁL©Kî—–Ûgßû¥E=ϼ_”ŠX?Íï Ö(¶WSб~ú\I©Žq¤T‚õÓ¤Ò=g›BWA].Œ¤`¬ãøUÒŠtÅG»0³cþ~p°Æ§ÖlæÁW³xRÙ\–1ßÉÓÀ¢½nf¦_o¯Ûok¥j#î®* í<ÄRNæì*“ÐIÚ€­1»V¬?i±·|>|ê {íΔ—L½ܤÖ3 s/÷¹ ’S—L½ܤj¦ƒ¹—û\IÁXÇ ¸dp=.œ1òi\G¸ZÍïQØj[FŸN‰eÛ® KL˜¼\eüL9«ü5ìÃw]Rg|ÎàsW”ìämü$Ûùq,¼›ÞÃpað.ò0ŸËÛªI…›£ñ×GþnøkuŒ¿6q_“j)6Zv_Ÿ ")0Õð×&NâkR+¦ƒÄ×çÂH Æ:NÀ_Nâ[Æßüó>ôÇÕø+c 7¤eØ4Ø»²%!!3Ì%ˆ,¯{™!fO÷t‰gCôzãߌéëiµ¶‡‰-£{ì²ÃȰgÁçõ•ÄÌ%Ó%ë…tŽÿqó~_|ÐUó{Ê-¤èAW] ›øÆƒ®R`ª#L|©ƒ®šTêRü «>FR0ÖqÂÄ÷8èjyâ+8BEÜxèJýÝSó¡ü„Û[èT,;cŠ°Ž ´ |™#ŸNXBk…¤áìM-N˜ÅˆЗá³fYws.ÈÇ¥hòÑC]7ct0÷GÞÇpäç‹€BÊálS¡Èã޼áÈ'ÎiR)µMapäÝ@¾žÂ‘?í|‘æ;Íj8*9_äd8šY,É ³Þ¿+g}°QèI³ÎlÏEl™A6E¾q×F“O:Jt»zt•rõ芺zÚ %].ˆ¤ÀTÇ%ºJ¹zZ;ÕÁ]=].Œ¤`¬ãx(Ñj½«§„ð²ÞÕ³ÉÒ·/k Á|½‰±Yf¾‚UVû¢d;Ybº•Y˜^ÂÕHzxEWæ3& Lehv]M.Á‡…Š>ÔìjiÕýˆìËm•»@ái*bTùt Ïã”1öŽLáéëT™{MH*æç¡½5%9Êï VÛfÉéÉê@~RD/Òҗʤ› LÚ•Â3Ó>»Rxd=O¥ðh»j´O¹jÚæÈšËsWM— ")0ÕÖu>åªÑžºjÚ¶®ó£«&HÁXÇ ë:\5t»UNá98žAiRô™ N,Ÿ¹øð³¿•£Í½_ë—ƒš.dvaW¯ˆHÌ0ògxwáœëÅ ’AØ•m‘á~Xof1#5´Rd•ŸðÆ’ãó›%é±×fÝTqœž©Rqz†m¤MÅãôº\I©ŽÔM•ŠÓÓÈ Èãôº\IÁXÇñ nª§· êü§qá¶2¶ª ö"Gç;S8ƒ~©jOšóÅYÊòfÄ¿”ìþ^Ø%ž¬>³ení ÑÝ93íñá×Fa ë:qAG“J)§m ƒu­G ×ÕÖư®t4©”:Û¦PXïra$c'ÀºÑ<˰¾–VuÎZýQô}Ïç]<©<ï$ËÝX—2¤#©÷ÄóÉ eȦ ô³[eÆZI€ Ì¿Ù•¶å¤š¢2–КŸ²82ž¤—^†¥‘/¯–ö›vMÌ¢0&Å¢0@Ym ›vadQ)0Õ¦]“bQ´”m¢ÃpE— #)ë8aÚ…À¢XžvóI]9®Oq rþ!u}C©=錭¿fý7g/Ê&œC¢erNu¸6ÂÙ˜ÜalŠÜa,µå´) áìHîR`ª# œM‘; ½÷»KagGrG‚±ŽÎrÇ"ÂðÄäx™±rÁÇÏ€:·mŠ”‚šÙ jnÛå‚H Luø¨Sᶦf¶š‡Ûv¹0’‚±Žà£QwËð‘Ï ;ÇÖª,ù–™-4ãe„­—ÐRJbì—˜¡‡9€ÔeŽx—“„2B|׳ŽaÞâ#̈sÜ£‚7M¾•Ũ3óônSÆtƒ):‰AJ'iSØT€#$H©Ž0`ŠNbÒIÚ6àH' R0ÖqÂT€ëé$%÷@‰®ðŒÕÙ e8ô  9ËÂ=ŒÀ3KÉõÇRäºÀôÉ–’¼hç_+òsWäÛÁTm *m ŠF›¶)l»\I©Žl¡JE›BE£MÛ ¶].Œ¤`¬ãx°¢M—Á6ÿ*3lÛs¢?‹«lÕdFÌ"xFˆ}ÁHŸ“%^–§l~ôÀ5t¨×ö¥h§Hys6{òúv>R"ã4Ü-^ÛŒÓ~K&‰edAñ³ ü9+†=”8eh‚µth²3š^z¬Bz¬î°fб3tÊ™ †:3Û¶f0£33H©Ž°fÐ)g&hêÌlSØšAÎÌ c'¬ÌzgfÁÍköƒ¸Ð&Ûï7Í]Wf‰´’ñ}γVíG±ôìVûÌ<²¾]œ7{¬$_o§¶›Y âëÑ›ßSV ×£w) uÇëÑR`ª# nêzô&•:X_ÞçÂH Æ:N@]+:Xù}—ŒS²áºˆ™²þðµ""Ùð{ËI½ö‚J+ å͹e¢äD§=ΘÙô” [Æ…"ÌY·¾NfÌ–ëo¦È8„bEdÝ»±)}¯=¬`pg «CÙ¢š–æ‡´ »˜.ÅÆGÙm [k¸‘¤ÀTGXk¸ec´)l­áF6F‚±ŽÖNdc¬¸µoWºêú[JìÆ%¦—ÀçÉä×§Ñö÷ x–¿/㪒aÖ»þäš^^4|_Tìw8¹Ir$v$pD‰9H’‰;H‰@8H¢ƒDàăD@>H„O;ùg¾çL;ûž#Å )Ëý^ŽW·¢š-sÉ´©"KÜ^‹”É8¬ï9gýgžþÚ;3Dœ=Ê+Ÿ­yÍó3B#4šl•¢§ØŠÒSÚ:#t¹ ’SaFÀ$==ô ôœÒS:ŽŸl%ÒSøŒ7w*-üñ--|+-üQ—§ÓÂõÓDeh—a{ù<:0žq¼»a}þõÏ ÛéUL*°*E*°š’ Ú†ôz$)0Õ1"½U)RU”TЦP¤ïra$c' ½I é âe"â¦ûžöäñ±¸ô™˧\ÈÚ¿|ùz«Î9lD‹¤W]snñ@yR—'2aM̰&ۆ2Ú¡fd)0Õ Ô¤ÖP†@›Â ÔŒ c'@(¬g”œ¯?Ø×·Ò¬÷d–øc²W†¢‡•ÁãÝ §YæDÅl¹·íû;}\ØØÉgmÊÉg-uòµ) .ìèä R`ª#À…M9ù¬¥N¾6…Á…|A Æ:N€ »ÞÉWg'Þҳϕ1%²¹µ°²¯ï3Œ²å |”Z£Žæ0ŸDé%}qÇÆå•%ÃñÅM–ÂÇËÁ:ö¦Ù:åM³5õ¦µ) ßëÑ›¤ÀTGÀ÷:åM³5õ¦µ) ßëÑ›¤`¬ã|¯×{Ó Bûäœ_訜’ÀºwÞÞn¹«É’áñâx«èp~’É;«SqÒz—·.-۟į‘n|8”J[,çX–+Žï“6aùcdë› ÔÀ28lìwV³o|•[U®ðìààûŽòÃÁÞ¡Y öï>nÏ"¡°`’‚ŒÂ‚  FŒ),Ö§(,ÖS K›Â¶a~¤°)ë8a†ë),ÑÒ9ŽÍŒH ÙîVÚº µ|ý/ûÚŸvA‡‹=lîË[Ócndà«•ô—Œðés£#6:GÀä½áQYúÇïÃ*$:/Fj4»*æ)¹*ÅSrŠò”Ú:w¹ ’SãtîªOÉU”§Ô¦Ðé¼Ë…‘Œu?;%ó”oµ_1÷+†¿|3}‰{«dBÌ áúN-•×~vy?;gü~9´ÝSuL\r:E\rš—Ú†©z$.)0Õ0U§ˆKNSâR›Â0UÄ¥ c'`ª‘‰K,ºX¸@ú`åIIùúë"“ú­Ü=Ï Ÿ9Üxß Snªõ»ÜFoÁ|Ì Ë&€‚›±å.Yp6ô ßdË)÷(°Û<1£ÍAŠÑæ€2ÚÚ6ÀÈh R`ª#Ì#b´9 Œ¶6…Í#02Ú‚Œuœ0€ÌhcóHÁ±%Øe×åâå’ÇÜtðeÉgÝ{ùüµì"Ç9„Ôdt¼¶©Èèš”÷‚™s1Á̹ÁÌ9J0kSܺ‘`¤ÀTG€[—"˜9G fm ƒ[7Ì‚Œuœ·N&˜1t-8®¡n÷92F^®íb€Ï¸$ãH‰ G\§¯¾CXyÃQøâ°n)jœë>vX;ŸrX;OÖm ƒu?:¬ƒ˜ê°^§Ö®¦ë6…Áz=:¬ƒŒuœë^vX3X/¸«ø¤+AÞ÷Ñn—Ýü²›?ïà½÷|0ÝŠ»„ÅÈ´œóöÏâÁl?bàPÊ)Ð9cÓ…‹È8CâdãàéGi?‰@43Ž7„e's¢ÌA9ƒñ„ñ)ÆG]QÆG›B×Ã].ˆ¤ÀTGXc’ñŒñ ÆÆFŒ<ñQWëûžLsîrô`ªu¤6™uædËŒEÔ—£ç<å=ý’ëäëäÞ¶ýX M/nûñ6=dÕ‰Tç˱ŽÖÍøÍßÛ·¦"šïl3 ÿýöûª¥@Å—_g+uöÕÅÖðÏHµ*×[úÚ <žš…€K3½îC×÷:=¢ëÄ“¾¢¹kLFIX{w}{Ñ>ÒãÅwP|§µï{<ù J.P›¤|ók“Ä~‘Þð5õDIß1ÀHÞ;C‹å|ûP¶nlèuíÏÚª:è)}u~?¸hYý`ðjåµë‰±]´\JQãL?–{«Ø7åž1,ùv’&—z8ß"ë{Ô'3ı¶8:¶öçfoäîªõ‡’Ž-W¤Vj²TùºçürûúöÿÇpHT endstream endobj 3554 0 obj 7689 endobj 3558 0 obj [201 /XYZ 40.7999999 370.579999 0] endobj 3559 0 obj [201 /XYZ 40.7999999 144.019999 0] endobj 3560 0 obj [201 /XYZ 40.7999999 370.579999 0] endobj 3561 0 obj [201 /XYZ 40.7999999 144.019999 0] endobj 3557 0 obj << /Type /Page /Parent 2 0 R /Contents 3562 0 R /Resources 3564 0 R /Annots 3565 0 R /MediaBox [0 0 595 842] >> endobj 3564 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3565 0 obj [ ] endobj 3562 0 obj << /Length 3563 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯¨ó›#¾€a`º{Ú€3€†Ƭ׋…gáöü÷-êÁR¼2%¥¤®,å40UÅd2ôà ~ ~üáŸ~ù×ÿúûëŸùŸ×߆ŸŸyi.Mlúÿ^Ë¿?N l¾8Ûÿšr¸X(ÿ½þöûË·×o/?¿üÜþÿÛ‹‰Ý‡퇣‰¾Á¿ÿö·—zã/}É/Ÿÿ¥ýíÿ^íë?·ýõõßþ½ýñ§¡½Rá÷— ±üòßý/Æ›Û?¦¿•ÿòò¯xý[{ ¹k·üÿÖ»”Ú:÷\Ç·úUÓý›~U3Ö¼ºÆ§ö!cÛë íoÿûŸ/.wu×~:[6\BSÖøw¼äܼÆT~$cr_š_c,»·8”üöÃŰ9›ZË£VüÔF[øÛ—¯½Òo;fÕï+ikj°¿¼|úƒðjìÛ»òÈ>ýúòÃW(Ýð×?·ï¬ëËý_ÛþÔþQl¹ö¯?½þCÓ˜Ÿþñõ׿vïe(øL ¬£5>u¾4ŸiÁ×®À˜Kð1§Ð¼}b»OÒ¥—Bµ¡U fšþÊB‹¼llhæ4Ò8µyý;¾¿ú‹ï?˜u±‘^,}>÷À—?£Uçi«+.­IôuݼVþýÆM[v¼¤9WD홆^Qÿ°âÅš<·Õ۷徨ˆ=õA[úl†+úé×֟݇Q“œS(NC.Ùõyµ×°göu«›Qï$[z'ß»ûùxÀôíHBî›=üåû–ÜæO{¿'Ý­÷4<7{é1zO* 9žècaÞÁ$­?ßö–oïÏM]+{Vú¬Äî¹hZÃÆ휷u¥Õ¯´C±PcÁ“P«.yÑã¥Êã% #“îà†·»šû&+ÞáÉŠ÷ÒdÅG:‘hKØd¥Ôò¨?µQ'+ÞJ“o˜ Ã'+¥ VÛ8`²â³6Y±ÔE;»|²Â ùîAŸ£¬šo0¼èS ›.劣úQÝü±É°¹ÊÍ}Í„Žùßí Fb´[”´% ‰¥–G­ø©ŠÄØHH @m´% ‰¡bol°ãl$æëO‚Ä!ƒÙ^¹Ñ5œÀ™pã:7®Ûi)Á\[Âp]jyÔŠŸÚ¨¸NYÂuJÔF[Âp]jj°pý|\S~ðƒâÚõ·—Æ„xcìýÀh‚„ÑY@Snkàžž{t ØOç@“ïïBZC?š Áä4ù %J ESWË£VüÔÆˆ&h$òJ>”Ц® VÛØM`æ“î$ó¦ÐSyîbw^*,f!ÀJ,XÊB”†&;²µ?µQÑd%,e!J C“YˆÚ ` Éê,&%‘# U/±_e:)šíq–¬5Ã×3€,=×LˆX#"ÖPB¤”PvµUr–”‘çÌíÎ2æNl–¸›)wRJÎòÈÔVüÔFÅY–¸“öi0œ;éjj°p–uî„_gIyÎÏ®ãÌ5˜!qĸ†2$¥„⬫åQ+~jcÄ™kD†CC#²j+€mì3×è OŸ2òTuëú§Á<ˆ³â,åAJ ÙyÚŠŸÚ¨83â åAJ ÅYW P+€m€3«ó gÏ”‘§Þ[é3ó ÎI<ˆó”)% g¾"ËMyÑFÅ™“xç(RJÎÜȃÔVÛ8g^çAÎN’2¢ï´~8ÔõÏ€y$Äʃ”†³0ò µ?µQq$Äʃ”†³0ò µÀ6ÀYÔy†³“¤Œè;­ŸGuý3aÄ%‰q‰ò ¥„á,©Ÿ|~â¬í3³>J¬‡”õ(% gqd=j+~j£â,J¬‡”õ(% gqd=j+€m€³¨² VgÉþxh®ž]¢>:ú‚Ù%^yÐêµZÊAëAÀvÈϘªñY¢j|¦TM)aÈÏ#US[ñSùY¢j|¢TM)aÈOëyJÕ¼Ù8ùY¥jø€z’|”‡^=8'òsEíïòCC¹¢RB‘ßÕò¨?µQ‘"WŒ++‚ÊâŠà8®(4*WÄ‘’ ™G$\O ø`0iŒDZKI«RÂoGˆ×VüÔÆø`$Ò*JZ• ø® VÛ8ðV%­8àO’ªóÐ ¦çD¾Ã4Zp¥ÑJ C¾i´ÚŠŸÚ¨Èw¥ÑJ C¾i´Ú ` ß«¸æÈ?Iò¿ Zõl?* >æ4Õì}’s×Ñ09×vM ½’s¥„¡7Œä\mÅOmTô‰œk‡^fƒ“s]-@­¶qzÃ|rî,)Iì.øà¨÷î¤^Àš‹V¿s_p_¿Ï¯-ž„~ocßïÛIò`²÷·Àµ›­×>iÆ·œýŽÚÚ•ïõ; }gxAml“A£„ý¤ÞOÿLsaG…ãòÅÛ®±‰Þƒ†ÕúµYí †HQ¸‚ÁûHצÛéŸ[¼ôÛJš½žÁгM¸ô{ÎêvÖ‘©øDAÅ'VŸˆT|â*>ñM҆ã|ùm9+ï>kñ+2ÔϲáFªød“]ôí—Å£›•óï²ðAõiÌÅã%6·Öƒ6¼»åQÊ•Ð*¾ap³>a$Bö’wå5êQƒÇ>Æ«¨ßÑ ÏbTÑw&Ýç?‰:SÕ™"SgŠ‚:S¬êL©3E¢ÎEu¦ÈÔ™¢ Î«:SDêLñ@u¦ø¦ÎtÛ._Û°ŸÇÈFv«°©çé.Ö¸‹“¨7º`xÓ_<Ô;gÓð£æ­Ûy.¢wE½«Èô®¢ w«ÞUmÅOmTÏ%ê]E¦w½«Xõ®"Ò»z³q€çzÓ»ºí¹V,Ò|Q=×Ó\ õæçó3<`ž'ò(tþ ±$¶Õ_›~­k8@ÝAªv¶sKD,Šò`‘ɃEA,Vy°ˆäÁ"‘‹¢c!f˜ÿÏzª_ÔA;Úàñ6¸õN¢¥w²À!oâÕç3®·wö¬Yl¹âÌo³ [Œ^Œ¨a÷¹f̯uÿå¦DTX“¨Âš˜ kTXSUaMH…5Ö$ª°&¦ÂšÖTUXRaMª°¦¤/71½ÈùÏgÁ­‰07YÒ¹éXÞÿ˜˜éÏ:&–óyÈÜ“ õxã۾ťt³£° cŽÏªnm÷þáM¼Õ?¶Q‰$s%™“dN‚$sª’Ì I2'"ÉœDIæÄ$™“ Éœª$sB’Ìé@IæúRQWðÄsD]5€. ?ÖÂß‘¡“E7”»†éa‡òq¢þæ¶òÌ™hvgQ³;3Íî,hvçªÙ‘fw&šÝYÔìÎL³; šÝ¹jvg¤ÙÔìÎF_ÁcžyùÂÉGõÌköèÜ‘ž÷tÕäª EÖújo¨ØÌUÙ÷,ʾg&ûžÙ÷\eß3’}ÏDö=‹²ï™É¾gAö=WÙ÷Œdßó²ïÙékÜÌU/×ÑYàªõÀ”ó¤7W¥—l€Ü'÷ùàœ»)ûDóW6Û0ºcÿ}Z™(ÓgQ™>3eú,(ÓçªLŸ‘2}&ÊôYT¦ÏL™> Êô¹*Óg¤LŸT¦ÏA:s+Dy>hÔ¶$ƒ•Ue©ûÞÍ; flp¤Ã=j0c³§ÐÙ̃Íÿ,jþg¦ùŸÍÿ\5ÿ3ÒüÏDó?‹šÿ™iþgAó?WÍÿŒ4ÿóšÿ9Î_c[qHÛiƒ™6S|÷2[ÒŸÕA:ã(27säh„,ÙÑY8!×£2:!“£²x4BfG#dáh„\FÈèh„|àÑ9Ï_2Yq˜Þ ]'8È)ïWhtð³@j·›•|¿ÖÛñ¼Žu–HýÓK–+¨-º:uþI«®Zަi•ÍfÏYO ô!ßÖʯ¶`‘í‡=Mÿ42%áföLjH–"aþæÌ5¢|Ûߦ[[õÁ‚m‹ÐqÉ9:· ‹³÷ÕXâЉ+ìm³ÕtÁ6:½ù-S¾vr Gô‘6-Ðñ¸CŠÛ æ!³râšc’ ],PÄvÑm0$fx`°³@80 êY€ÌÊäÀ¬,˜•ÙYY80+׳2:0+x`4ó5Vú|Ï.Ç5[¹?Ô!>_jw‰*ãyÊw¼Cò ¯~Ešˆžk‚*ö ŽÙ›ôîéMo ñ>ûÓ›w -@Žfñh6`G³p4Ô£ÙÍäh6fv4G³A=š ÐÑlpàÑl`ç'–¬8çü® ô÷ø }c>k±`XÚääš¾_w@ÛNA79)çÝMÑž#ôòzï1Æ7ôÞÇr ˆ‡;„C¡è@ ‡‚x °CA8ê!€€„„·CÙCÉ¡5b}Ï…KŠ‹ý-™hl‘»­Ke®rÏ›ä ®ÑH¾'ñö¦I}Ñeß\ d ŸÒ²â!ÍXºƒA÷îV¯ß)sU›pÏ â´÷³Å{Ó3„hBÌ ǃsx÷_Ã ÃÆÜ7÷¿$ÈY#hº…ß,ñÈ£ 8 ìÀQ…zà( G8 â£ÀáÀQ¨Ž:pÔÙÕ“›¾c¿Ë.80ã mÙ 2_n^Ñ& u«(àùiIë¯àÖyxºàØoçÝ@Rf4Çû,qlŠš{Î~¤U˜-tQ÷y' ]®P;ówU\!:9¯f µ¼e>ÿ]gn1‰¾ç°µóüãû‚îºf…`“!äqø=³2Û TlÁ˜OÊû#–s!°H—…÷úÖ'%2ßc7“$T“P%¡‚„ 5 ¦I¨£:ÝÍR*dš„ZJØt7I¨µÀ6˜î‚ž„J§»+t'ôéî’-"kÆ&›•¶W þ[7Ûíì»Æ‰ŽËA ¦~À©Lô¦p†pÂóC‡$3$nO§ö\ãÙs2;¼MzæãÄc'$\¾?Cøä:T\ìËul•’Û75 {Û¿…ùØ>F’v%$ìíkyÔŠŸÚÂÞöo!A¾- ÔFÃäûZ€Zlc÷°·½O=Až…½ËÅŠ©†;3”Öøå5ÞWw‚ay¸{Ô@ ˆMé±5òôö†Y»PUÿd‰£~È.µ&pổ¯¸¤U¯t3çmvÞVÈiÆñ,úµµ+ßÑí€ö!ƒÝ¸K¢ KŸ´Ö†c%Lsé·îL¾3€õâYú“~_Õ«V[ÂÃEW0S$|bÕ;5ƒsx¦Ÿ¸X–î_ºòÜô«VŸŽ Ú\yÛyÅ'+ìè}TÿÄm”üMƒ’Û¿…äǶ”$?v%4²êjyÔŠŸÚ#+Óɱ ‘°äǾ VÛØ?²2͸ÂÇhv¾…oy¦þÇ”¨Ü&¸²´¤/ ŵoªñîr̦“¹ý›Ðb»Jî¹y Pg1ùf[34d4\ó™·˜ßA—Gû/×ôi"ÓGùôKÖ(òÈ ýf™€Üà‚ŒÜ ¢-8Ú²BîM[ji´eYîM_Ë£VüÔF¶Œ{Ó–&jðܛ¾ VÛ8 Ú²ã"íŒhkùª§‹¶Ž>öiþíÑ[ÖÎdYЬGuÕ.r'Ï kuôQ>ƒ¬÷d…‚Üà¢ŒÜ ‚,‡3=Œ“2=Œ§™¥„Y¾†Unšé1Ú¨A–“2=Œ£™¥„YnÌô¨­¶q@åÇLAÖòã‡%Ó\bÏÏA4ã¹Ý£…¾,·É™¼Å+~j¾X²I¤šŽYwYnoÇd}"Ïr¸òm°U özX°`ixÍBú|e˜5ê;ï[_º…þÔù°ý£9Kýú6êf Ríõä¦5«ùk‚ÅÍŠ€³L²L ÙG¥„aÌ>ª­ø©P)ûÈš}TJX@Æì£Ú `±¾îÛÅrŸ´IÜ Æ5,ÃâIÄÞZ"@3Ÿ° cK‘·¶í9Ì6™ÞÀüÍAK&Î BãÝjðŽqécËIÏõŽœñ÷@ÙÝ7Ì$‡‡™$ˆ&¶¥‘‰‰&öµöñ«¹½ `Ab쯨xôøné5št bÜùÓ¯%)Ïz«kTGôÇwǪÒvNHþˆùgÀòÏ@È?ƒš(ÿ HþHùg&Óü³Rœ^®nPþ˜óóÏÖlË:-Y·É!ò›x²že•âÑžšƨ^lã‰~­óc³ …|0Ù„±Û$²Øo`° N•±FJ•±†¦Ê”:0tµºý|µk^ýêíMvñÕ´·!%J•SûíZŽiÙŽmQVya£÷Q6]’Ü¡’ðIÿ »X£¾.±_´Hv²úP¿Ó{˜d/¶évf½}òIm­ïÛÓ’/jÝ!–îð«öÞÒ'F»Á1.ûÎðÆ–ÜûpmîèuåwLÂ@—ì¥åý`ØYµ¨8³â=±~ ”¨ïÅêW©Z¼ÒõÞªöM½g *µ¦_õp,÷¢û˜WÉg¨X»‰Ž{ûsîÇ‹)¤éØúƒT•™*ÿó–ãËëÏ/ÿóP0¯ endstream endobj 3563 0 obj 7631 endobj 3567 0 obj [202 /XYZ 40.7999999 250.579999 0] endobj 3568 0 obj [202 /XYZ 33.1199999 212.179999 0] endobj 3569 0 obj [202 /XYZ 40.7999999 629.779999 0] endobj 3570 0 obj [202 /XYZ 32.1599999 160.340000 0] endobj 3571 0 obj [202 /XYZ 40.7999999 250.579999 0] endobj 3572 0 obj [202 /XYZ 32.1599999 214.100000 0] endobj 3573 0 obj [202 /XYZ 32.1599999 160.340000 0] endobj 3574 0 obj [202 /XYZ 40.7999999 629.779999 0] endobj 3575 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 115.219999 134.879999 122.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction >> endobj 3576 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 106.579999 88.7999999 114.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 >> endobj 3577 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 97.9399999 144.480000 105.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 3578 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 89.3000000 160.800000 96.9800000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time >> endobj 3579 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 80.6600000 188.639999 88.3400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 >> endobj 3580 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 72.0199999 102.240000 79.6999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 >> endobj 3581 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 63.3799999 161.759999 71.0599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 >> endobj 3566 0 obj << /Type /Page /Parent 2 0 R /Contents 3582 0 R /Resources 3584 0 R /Annots 3585 0 R /MediaBox [0 0 595 842] >> endobj 3584 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3585 0 obj [ 3575 0 R 3576 0 R 3577 0 R 3578 0 R 3579 0 R 3580 0 R 3581 0 R ] endobj 3582 0 obj << /Length 3583 0 R /Filter /FlateDecode >> stream xœí=KÏä¸q÷ïWôÙ€{Å7 v^r0Ør0rÆq Ã6²ñ!?bKd‹U¬–HQêÖ÷iØ™¦¤*>ë]ÅŸþå—ÿ¼ü÷?.?}þå.?Æ¿?ÿòÖ];Ý .þ¿ßO¸½ >üÓXuåÎÿ¹üøÛÛo—ßÞ¾¿}ïÿÿÛÓ·Ç¿ú‡Åð?þþöÓ€ümhùåó¿õÿú¿ ¿ükÿë/—?üGÿ×Gxþ…¿½Y§ý?þ:üƒqÆmÿcú/ÿðÏoÿþ»Ëßû.Ø\ÿÿßs)UzU?~‹Ÿ²ÛÓO)dÝEtš ~aŒ÷ýTýtüï½ý©‡»qµzüCþ{ &Ûc2R™S'ûÎ#4ªcý¬+É/F£ß ÛØM?šífŒõ2h¾ÏŸƒÂÜO Ÿž~‘|Rð!{aÞÝ0ÕO» =zÁ9'hÄ¡w| þ·É¿6Ÿÿ%¢â”v7©H²¯ëÂo~µ¶»hãÿ2ŒÙ¡U^´ö/ÞäͱåÇ›VWÆ·–Å·dENqôï¿;ÿÙ|-ÄÑ·ôߤ=ño¹ŠKqüùíÓï2B$¿üÑvýôëÛOßœ˜ýSÏÁoR÷ðׯý ïÜpõOÿxù§®ãÝ?_~ýËmŸ ‚ƒþ 4°¡AƆî3løvk`ý€¤¶Fu÷'tsíœ0jÐ Æ'‚zÂÌþ*‡“'4´¯·'ªW0,ãjÙ7’ÂÓ)ò‰“ÓØ€&~Â5ÕWô­^ýúkOÖmfµGxêÓM‚Gù3Üœ\ñ¯­ºLö·ïgÚßqšú<,׃íì­A_9³évàp%éÃÐü 5þ™œ²¨¯Íyšt€œ‚Ohhô2ÑOÈò¯po‘«ò KŸ·>YRÁ“Å,\rŒVf–$2·|§·Ý›h’àÅê‰zï®S:}"ÉoùḎ[<[d§éy,XY¼\Pˆ8‰Ú^"Â.aŒÚr4sÌͦ#ç É‚ÜPðÕª5‚Bo×lZÉ9uP§¥–Qâ¾õf®¤\ª+é.§+iõ˜¾éJþ-™@‘SQWR6§+õ:%ÀÑ· ]É¿å(.űƒ®Ôc©®$àóº—”dˆ)r -£ DÅ äÛ‚WÁgÀyèÒ’ñ‘gIéxX»èLý“t³t ®üI2WHÁ œdÄ9É-D³ÐúwrQ1—'>Ïí/49t䬌²\0.  dÛl{ÅH[¸éƒBoˆå T P?ߢ±‚9 ÅxÜÕÛRoeNê½9õÖ Rïvb­1©XklN¬õ-©Èi;,ÖÞÙENqD±ÖèœXkÄÑ· ±Ö¿å(.űƒXk9%Ö2¸Ãœ;/ÖÊ‘Ö\­ëRÈÆ1·]sG Ñ´yCò{lÇ@l°)߯0 ìä°`¼¸@ ÐßÀËIEíè¢S)]t:G…4«oAtÑ¿%(rŠ#ÒE'stÑ „C`ºèßr —âØž.Š.Ò‰Yºˆæ]£ƒÕ˜uWmXªî/§qv÷ra³Äh»Ü”Ï¿,VeÂò@¤\~Î jÌ( Ù«2k zB/ßràÁ4V()ØÀ2ï½yŸ†«CÉ äviÆ\ sLf˜‹è‰mJø} d.··dENqæ"úã…™‹` á`ˆ¹ÜÞr —âØ¹ô]YÌ\>3—Ó–¼d|G±%ß7ËiØÌ–<™ä×W ˜K „:z9NÆ‹æj~àtüÄf¹‚ñÍŠÆ[Ú‹­»í]R.%øI¹¶ÞKšAY¢ÄÐä¼Ðë F!Òøo!rñßBÀøoß‚äPâ¿#9ÅåP‘‹ÿÆû$‡ò(yŠiü÷Çr¨ 㿱Šbdä@œ«@ß+t¬ÀºB«ö]BqƒMÂ.K,´ç½@~š—ÐÊ8B+øô¼ÞREuéF®°6ˆŸIÄmÃ.+©Ûñ ™Æ¿ •‹ Æ¿ùÄ+Tˆ‹PäGä2ÿ&$Œó-ˆWÈÿ¡¸Ç¼B‘ño˜W@é®ÝÊéÔÅ+tÎÅ+ tñú´r&®•žºxޏr:çâºx} Z9\¼ŠKqì°rf¹‹¿Ñlålê„6ç„:¡| Z9œPŠœâˆ+gsN(a¡Ê· •³Á ¡¸Ç+çèuA+'Šå³ÓN¸d|¯®mG;aÜ,§¶½Ð‘›ë´‚ñn»í%ùm¿5Z´ÎõÖ,êXýáz‡¦,Ù¥.UÙå\ª²ƒ.UßE¥Û[2"§8‚¨$»œKUvÐ¥ê[ ¨t{Ë%P\Šc{QIvË]ªJ7íVާFHÉsFHɡҷ •ãÁ¡È)ޏr-„fZQ*w­·¥%G¡À\_ÀFžîû¦ýò¨áx”¾²ƒ~4g’ÜUMã36Ê»¯°ÜïˆÒÎÞ¥Rw¼T9w¼ÔÐï[½KG —šºãŽhïR9w¼TÐï[½Kw|„âR;Ø»tAÆuy!!9lU&ÂÜH”ÂQc5”°¢K5Åó úí¦ÂØF©·Ÿý¤1©™ÝŸ´hr¨]ø*±–úõÒÍJ<²ÎŒIw:»QÈZˆö9†×I& “&& ó-HŠ0!4,B‘SQŠ0¹Ð0i`h˜oAR„ ¡aŠKqì EØH*Œ]ªn˶‚uôù:x¨‹yÚ±†ÜÜ´µ”Ö™HƒÂƒ3J/šÐ~"Ï5‰§kf9'WÆ9¸2¯§ð>©äd`jšæ»—~²¾ÖÎsÜ~c•àû–Táyõ[„sTí½í˜í}Nœ¯Ø1MŒ6óòoAùÆ Ðí¡ÆÞ4Z{>žä~Vã _^;hU•Ÿ‚âô6DÚmÔt’J’Q:šµëD®Loºf†HB&]6dÒ¡I— ™t1dÒ%!“„LºlȤC!“.2ébȤKB&ÝŽ!“Ž™DEg*Jœý\NjjÜF¸&WEÕäU÷Q¼^çš¼Ù–Â…u 72Î|yí‚•A‹Xu¬Ž^§R±4zZ±\ô´b0zÚ·@"~{K&PäG âŠå¢§U£§} $â··\Å¥8¶'âþ èÅD¼¼”˜äéhžµBÝ+ˆÖ(1€7í^éc0«%vØÑy?Û¯ÍÆ„‘ ¿mô÷ù*Ø´¯›\R¸d‹€è'ăɱþd—´0…”$\·¸p®*4¸&’¡<;vïX²“zoàµüN”ùË H å÷›¼ 2㕟GaAfL!^‚Úé+<-#¤D®Œ¯†t ËÝÞ’ 9Åõž+#¤8,#ä[¾ÂC¡Å¥8vÐW]F©'å%çN}eÁ“Ó–ö^ÜNê GùµyƒÐô÷TOZºQ7½`O‚¥;Õ“hÖ¨''±Þ‹XŸÚÈbmDBáñµ9Ž1j1Çi‹i/½DŸu“ 1" æÊ}a²ñ$õ¤ ûË(ø íÁ7šüƑ߈pæˆjÒhã1aÝuˆ/<ùFöà ù ‡†6Ï\åxÊŒtÜ L]’5yò‰ìÁWª×Æ”ŽÂo+z=²[s0”s²o4žÏÔ“17Ók"ãÄ0mK¾¡ñÐ#ŠÂ3ÆÊåöAÍ£¾¡O#ýD´ ä×]ȯ»\ ¿î` ¿o‘Û[2"§8‚ADw¹@~ÝÁ@~ß "··\Å¥8¶7ˆø{ƂŭpÜ~E]€–ŒfíÐ7Ál­ù’Y%övzJšªM„}`>-pŸàzkÀ–m1NŒqÉ÷þÒb{º e—Ü»‚Ήd¨P˜ìò.6`"µˆk™³ˆk -â¾1,⊜∠@ä,âZ@‹¸oA @‹x„âR;0€XïW7lp7]$dUà$E)¨ùW`·@÷,¿‰¤&¼ƒ_a ©)«TpÙÌš‹I)F·¹¿ô@á™4Ëú2ÃV· ÒdáH hø·QŠÇôb£ µt9„¨:¨ò¡³U>4ªò¡3U>t¬ò¡“*TùÐÙ*UùЙ*:VùÐI•½c•}¯ò1KÕ+Äú¨ú&”ùd”„°Vb8ŽäC1P Ag 4hT Ag 4èX A'4(Р³4*Р3t,Р“ zÇ ú^ ažTæoÃ*G·Ä wòŠÁ+˜Çæ°¼b¼‹{2’Å+lal.ÂXá[¯°!"B‘S‘WØ\„±0· ^aCD„âR;ð »<¿qh^±Â/q²†Â:NÉqY<ïŠ5Ø.õuÙ.çë²ôuùÈnoÉŠœâ¬ÁvY_—C¾.—ñu¹À "—âØž5Øn¹¯«â’Üf ˜PÑäo¯¤ô7þÉØNÆ6ÇØ”gü°ŒÍAjõ±KC,Ï…XC| bl<„D(rŠ#26– ° †øÈØno¹ŠKqìÀØ8 ³€^&Ûÿdl§uïätœnŒC¾úãr: Gò¡8H£¬ÈEX £| ât2ò618"§¹è+`ô€oAœN„èÅ¥8vàt’ŽXz½`ƒ•S©ϪœÏ*èÃó-håTðáE(rŠ#®œÊùð¬‚><ß‚VN^„âR;¬œî–¯\yêò½ %,j…™lIµB'- ÷/àî5Ò ’€äŒ‚T½}3W¡…ðrè\>È5=?ƒÅ_ DjTû~ÍÍÓ5gmAÝíyôgRk{‰ÇæYtj,}gϦlÛJëj¼l`2Þ}r<¢hŽæçCé&õð[“óð[=ü¾I’&xø#9Å%I“óð[=ü¾I’&xø#—âØA’4´‡¿ÅmO¯kízo·ü&¬jÂR œäÚ°¬†#ùPìË(—Bp( Áe¢\ŒBpI‚Q.…`-ŒBð-ˆ}ÙȰ\…àvŒBptb_DÆmU‡ªºô“–{è“ð€ÿLµm®Ÿ¢9\•1˜m®ŸZ¡ÿÜ·vœrÈŒ"Ç+µî$y”C¶Fë ÚcH;ªÓ°ãIÚq]šâX.4Å1šâ[ ´s{K&PäGv\— Mq Mñ-PÚ¹½å(.ű½´ãØòДŠ*ò˸©”·šœ{­Ñô ]UŒ‚žò’Û©éIª°F<¨Ëì?6Ë+w<ð¼®Ð= lk#â¸FG²}5Âñ”;Nú\žVÉèÛ ë »œãihU/8å$5C«| ’ÔD”Íø4´*àˆ’Ï…V9C«| ’Ôx­ŠP\ŠcIM,­ª)Ìnç5ð¶Ô5‹|Dj(Úò®=PvéS´±Ç{ç"¢¸ks—ë‚\æÙÌS®¦ ÷ÜOÖQ¡@Çé;*›Äª¬ŠžY3/¾¬¨µà_ÁâzqàÔ†BjÈ#¶!ç³P¢åÒc‚º†R-•K|ËÕÑÕÉæK5 ³,˜ z4H¨®ˆ†+™×ѪK× M¼a-÷E¢ž7$òÖAq¥„‘çùAjMÜý“‚¡ ÜÆ·Ô³f¢ëœB¨ •,Írjô½§›oŸvqR‡%}ÿé/³M ê⦙Ÿú8$惛R pzÛ¬ÓÛ"§·Í8½mtzÛÄém€ÓÛdÞ9½MÆém¢ÓÛ$No³£ÓÛÒNoèܹCG伌u¾gl$ñgá°î]¡áH–3:/Y@J°1wÀ/æ2~1ãç;!´·@̇·dENqDbî²~1‡üb.ãsÑ/濘ÛÍ/Ö“ö‹¡è¢äÀþÄü¼sû$óûÔšfà”–ÌKGrP2o:–Ô'égê“ô­’y†ê“ oÉŠœâÉ|ÿ;SŸ¤oªO2¼å(.ű™çñˆÍ“ùòú${“ù^Ø“œ  åÅ4œŸÃ2%àHË„H€È”è[5$Εޒ 9ŀȔè[ÂÊ o¹ŠKqìÀ]V1€ò²ãÍê=G÷úÊUR•©¥káÕh s ,.¢²Ë•ö¹'hFÈIV¼9M㚃™“bn§âœ‰oßa_ðÁcýp_lR\gŸÝ¶é%lÎÜöNŸ¡pé'®ƒhÔ|xI ¯àšüzšBÇÑÑòŒñ&!M|£$°¯&-›Žp.𮶈ÜnûüÞ㡞äi/³×øm_LœW,çU¦ÌJß*¡¨­P™•á-™@‘SQœW™2+¦“â¨ÌÊð–K ¸Ç⼢ˬ B”Yi°rÚ¥+g2Þó¾•ÃY5È{>¼%(rŠ#®œÎxÏûVqhä=Þr —âØaåÌrïyEÊøî–¸£Ö-Z  ³¢U .yøh¶õž |‚cyX_P†ÍÑù¦³&å+6ëÈwÈ‘ï2Ž|9‰µS¾bMÊWlƑ߷*ˆÃ"Gþð–K ¸Ç|Å-wä×$¸îÍW`ŸçSˆäøœDýcu¦À™8,Q—Žä¨Du©Ûžu9·=ë ÛÞ·@¢~{K&PäG ê¬Ë¹íYÝö¾õÛ[.âRÛuÆâ›'ê(°úåˆúy#ØIÌˉy'ÁY8,1 LGrXbÎS<ã9<ãÐï[1çÁ¡È)ŽHÌyÎÏ8tÁûDÌypÁG(.ű1çË]ðø×#æg Ú“vϺ°5Øú‡¥ÝÜÀ‘–vËÔßÂdÎßÂ$ô·øD»eð·D(rŠ#Òn™ó·0ý-¾Ñn©µœú[î8v Ýr¹¿EVû+§R Ó9 ÓÐßâ[ÐÊéào‰PäG\9•ó·0ý-¾­œ þ–Å¥8vX9Mû[ ¯¡²¬œI-šÌä,šÌB‹¦oA+w_+3µhqåL뢃 ´hú´r&X4#—âØaå,mÑDRÂV·¡æ€ÙÂeÍ™-\Ælá¢ÙÂ%f Ì.k¶pÈlá2f Í.1[¸ý̼£åX´råÙçm¨[UPÏ›M#Œ÷s³)3€´?›Jm|³ép‰Ût¼çͦӛMšŸ£êÜ¥¶LÎr¶LΠ-Ó·@ ïö–L È)Ž áq–³erm™¾Jx··\Å¥8vðmËD‚À¾·”VÙ2ßW‘ÿÓÞúAí­!Ëÿ~<ko5Žä°üE¤öV.röV. ½Õ· þ"‚½5B‘S‘¿ˆœ½•shoõ-ˆ¿ðÈQÄÔÞzDZ´½Q¬òkD 6þ–¤He©É×)¹:“&råw ª6Ž lϺ¸\I} ßÍN8]¿fá' ÉM¶mË:î«n~}¹Ñ¼óÛà¶4- è&4ÿÉw·)ia‡¶”¢rL€NªG6±õúè­Ïô‹÷“'Éeêýí±ääH½¿¾É‘*x#9ÅåH™óþr ½¿¾É‘2x#—âØAŽT˽¿5Ùvb1ÿ¯ÙÌ%‰rŸ_å"—UV—š|ú£@A¡ø®É€œu,bW³›av|›­‚Ǹ£}Kd ¢‘gæü'êüJ¤ÚÐNg²KHµ¨ñ>c†IOA›«WÁuÔ³›ÄðFæò­wª`?Ë;YÂxæyÆ“ÊN*ÚïŠ*!!³‹¶¢¦Î–òpˆ|IèȦ¤è½ÿ ¤@U µÆ·­xU X60n~­•á†ÏùЩ÷£Ð‹.u ‰.çòùo©²í[ B{K&PäGPèE—u 9ärÇ *|„âRÛ+ô¢#C(¶âò™³Žéú:¦÷%:똖Õ1½Ïœüº\BüLÑ´—­lÚŒÙrV6ÍùÑpæ¶7ÂHzÏʦgeÓsrV6= â&¤¤Žb¼ô7kt€=A2\‚=”–zùÏyùü½@)àØËw{K&PäGT XÎË'ôòù¨ÜÞr —âØA)गWÅ©¸Äl¹—¯*)¢Àú9Ï^›–Å\`CFTŠvd,w^Î:K7.[ $ØW8•Ð$‹A$rEÏ…{l)ÝuŒõµ‰ëºY°—ž@e5°a´HÉ„ äo2I=é‚`gü†„öàK~ã¨oF#4W…\7>Ü|£§ó*‘`ü™zB÷`LöèµÑÁw·OP¨ÄmÙ§Oĸ%8tŽòSºoôŒ*ªoÖ”^9úIžš'BoMPäÀ“ePfü¹%šÉœÅb‘‚€h’ÂIÆS|L zHgFËjl½¯X“95¨Öl”9~c¾Ð`A¬q˨ï’ÈÅí™Õl£MœŽ-™¸—U2èÁª(eH™8ãyOZ‚5ïÞOôѸϧ-|ÄGÇ’½"FäB ™Î¸¾.#ï°qiœ• ”éì »›å³ßûÔlÂçH},NÛ†Ô/?3˜œU¤Õט¶ÖÔš^•º"0²À]]ZHÃ×ó˜U…`ÑLŽ6îµÓ-ªÖ |Mšm ´Ü°ú`†WDŒ-0Ÿê-ÉïX“CÂ2ç›GÇÒ¹kóæµùrQ#ª‰,!xÖ²x›Y‹Ç©`Âò5l鈰5ÁÑ”j86ï—ênºß}’G³£¹Nµ –9¨Å™o¾ÍvwL€àâʆM²!‹â ÖeTWâ1PCth2óõ•û…»&Å7jöGélAßoלýð[ÜLñ†MÍè}·.¦›Û}Ë7í¦&yߦíJøÅƒAüÍFS|úu‡pøo`Oú·ÄJ:ŽÑ ?†æ„-;¬ÀÔ?˜d57aH‡î|Ðp‰Ë·IH0Mc·‘ßæõßš²"ÅÚ_$ÐŒ:#V{ËŽg„s1møëÛ/+OŸìÒÓ'YîôIO†øôõmãù¡„_]zú„Ë>a!añéóo‰)”tO>}R^Ñ6ê¨Â~1B[¼Å¤7‚¯7?iX¿Å”M·˜r¹-¦\~ÍðëÛÆM4B ¿lºÅ”Ém1¥!¥ñóo‰)”tOÞbѳ1a/¹ ª'&ÎL6xÔ(»dæ,> Z ù´aý5:= Æä¨qðð‡hß6ÁJø¥ÓjTpH|@ý[b %Ç“h?”ñ€$êÕTžXn%ªº@´ Ž>5qk¥¶æÅm²o^¾-&<6(hܘiÃzÂãdJxœÊg Qpž¾m$-#”ðK¦„ljáqáà˜ðø·ÄJ:Ž'çy!CK*ð.§\`D>BÚfÚ¤*@A&UÓ$æWLÓËÞ*ŒÆœ4¥G“Tsi5š¾Š8ºªðí9>µ”Œš.hÚþž³IÃj2jXjA3,gA3 ZÐ| $£¾MÛ)”ð+µ õP3dÔ0hAó-ŒÞÞS(é8žKF 4q·ÝÂ’5%Wk¶åÆ…;˜Ež)5mX¿ƒEj…2"g…2Z¡| ÚÁ"X¡”ð+µBž³B­P¾í`¬PJ:Ž'ï`¡VìàU¶Ñ¦µ6Ã<5‘ÙóY)5Ǿ…‡¹MU…Ir6~1½:*nÚàéÍ÷·ï—ßú£rs}u—ñ¯[Dˆ:ŒòûC_èÃOç¨úÂúnç¢ËÓ×Á;ã3ÔœÖWìÕ Büâæjò¹N&ódX(!®º Çý¦®x:ÇsœÃcÉoùÍp §›9hÃÅŽÍÜ»£Ô˜á7ꛑÜåž0j#(ûf\±’±}» »Îÿ›«(猤8‡Ï”ïZÍëNdv= ízÌõêtˆ6«ÐËúÊ<_Ë¡*&p¶þ½%U¼|ûíz# endstream endobj 3583 0 obj 8342 endobj 3587 0 obj [203 /XYZ 32.1599999 504.979999 0] endobj 3588 0 obj [203 /XYZ 33.1199999 503.059999 0] endobj 3589 0 obj [203 /XYZ 32.1599999 770.899999 0] endobj 3590 0 obj [203 /XYZ 33.1199999 768.979999 0] endobj 3586 0 obj << /Type /Page /Parent 2 0 R /Contents 3591 0 R /Resources 3593 0 R /Annots 3594 0 R /MediaBox [0 0 595 842] >> endobj 3593 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3594 0 obj [ ] endobj 3591 0 obj << /Length 3592 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯Ð9€{ER) `{Ær`Ø@A7›`‘]ÄÙCþ~Ô#i¦‡ìb‘’fÚ<ãV‹b½YþøåïÍ?k~øøå?Í·åçÇ/wí©ÚùOsþûîòiNJοjÓŸäxþÓ|ûåî{óýîóÝçéßïwbx|qù1=\§˜üíÛ¯w?Ì“ßÍŸ|ùøçé·ÿ5²ùÓô¿Ÿ›¿þmúñã2Þù ¿Ü™q8ÿòïù!…4Ó.;?ü×Ý_~×ü:-Á<Ž{þ÷ì1š.kߟ^/_E“µjµîL#„œÖÙOàøï?î~:ï*kòr²éw‘îëhBs^d?ªiD¹./}!D{e ü}¶Ïû”Ë>×™ºærÞn:ü/O÷š|Ö@Á§{Ó\Îk6_6ö];„"°çåöèÆuÎMàèmç˜7ýyàú?nžÌ°ü¿Gã”rbÞmw§±Bn£å–ç1GÝ5£šiÛäS{9’ÈÈ´ªeèqE"kg°µw$*ÜMkÜŸFʆ»Pšéà;‰‘¬Œ47Y™n”3,•Ê…æÓP¹ ’‰@Ï+y[[EýЩy›:bëP¹M´Åt†ÓŠDÞÖVÐã¡È 7jFUÙesµu¨\ˆ“Ød:CuFÕ¬­­ ÇCMüKê®oGߺ0ýãÖ''ˆëHÙ§!õÈ3ÐyE"kgËa8#å)›«¹.ŸÍuŸFýáëÝŸÌ„ Íן¦Uœ¿›|=ë¤Í»³ÚתæëÍïÛV¼ÿCóõç»I l—Oä`ÒêÇO†§Ü—ÚÑúŠ’Hyºv}ûüÕöËâaþDT§tß^|÷=ó*‡ÓПG¿|çÓüNëÌ,æEŽ'%'½÷Å<öò[…¾*Z¸$ñøDŸ¦³µž|DKâF Ç÷¬IAºkš÷üðuÂä<¼Ï.³+xÙµ3^Nô³à^@/ë{^Œ\¶ÔŽ;jíC»òDΣbÝóýüÁiÓå¨ö»Â؃ öp!žÅwpxiÎÄá}Ú¯,äÞ_! çÝ™ÌÉŒíp~D¿îëùÉ{8ü‚fâÔwƒÑ½oâ8„§”ö±µ6l0\ óµf¡')ŒõÄÞŽ œ¯Š…×EâƒÎö†…†Ž_‘Kð]ÏâæÃtá`¿ý®|°¿‘0/<ÏEŒD F>Ab„Ågà`Å{£öÎÕ€X¯ËFCð,)2FmÉŒ±x0$=9Œ¿w¬„½&”NybÍÖ0˜¢k8 ïè'ì‘€&î|]ÊAv$σ pÏãg¶ï*gT ’ø}zA¾ŽZPTŒÜ›¨ˆÃÐr—byˆnG~*.Ô;pè×)Wƒk%8œ—d[åpzaKO œ‰Ç*q Ö¼w|l7õC}ó˜)λXÏq+—˜`†…8ß‚Iò'e8Á»¹_öRÝŸC®^²û#q°êôï†%YA ÍQk(;'x‡‚¦[!gùú †¡Q½)j.æ)FþÖ"¦ÎÀ² N"E’‘4‘xc+ÀiDv½E$ Š’G%Z è…õ"Š8ÄGF` ¡“á¶c^£s´§¾‡¤ñ!̰¹sì«p¬V8 ˆ·<4Dq±p¹ÝêéÇt”C¯lQ=²ž“Šw¾ñ‰x”,ä~ä ~Wè&x3|)ìˆÀÝIQ.ûjsICÀ™Æ6™(òÔ]‘_Ha²™ïn‡UyVï¡âo†¹ÈPùàþm§¼<¶"ÌHðæ1»w€M-áüi ”½Au1‘Åž` -áæíiÐâ…Âà9HüÎl8§VØÑ ðIÊ€mz¤è#!k¯E«ÕÌ|¹kÛéU\à 0v Ô¶=gÂ4œ“.ÁÙr®órò0;ÁÆRFè‹Gór¼ó9¨",„tH±ô‚~8ÂeÒÃKŠ#-y°Ã4„ðU’ç`âO×Cƒ„á#2ÀÊ„lu~¦(‚‹NäšêF[çù´0¬ÞÙÞ=|ò==‘ð®`…i^O[4ŽöàM]c5¡ÝôÈœ èYÆ<ùJ!]!¬EÛhì¹óH¸»O¸(â­&9ß<[Ç8'˜0î G‚@®„L#`T°Üû®¬þbJŠÄaO¶lœU­(­ ©”{BÇËËu›Ç‘“oÖ—Œ«1}­ßÔ’Â0ÝC«E?¢€™Hò8FË•'J¥¯­ÅïHød$ÀÀ@ôð \A÷ÂγÐN¬ñùàSÀûñ¬®m(;Sç9æ™âý0Ÿ)ä”' ÎãYÁŽùÆ7Àý”wþÌV„i‡õF?!q–7u ’¹¹ýMä!sz±+%#æ€ä•ˆW÷Ã÷¼eìohŽë¨r˜QŠß+HR•/gyR¦FÝÐ!Ú6oß —x¢s°Œr¸õ†=г‡Ð;ÎpÞ²P9n®pT>%BÀ KÒI8Ô(¢¾Ø‘¹>ö·¿¸–H¦ºJÖ´’Â/(òPÓW'Äê®=¦¯ŽbKèkØÍNË[Ób0aÑV$¦‡Ä ÃêL¥˜CÖ û“9>¶ËcóàkÈ‘ãËÊ;5Žß“ß´´ Ö¾öœ,ÙáE ÉÓejDme_Ýê¯m̪†q8«ºéæñ¡½Í Þ)Ü<„'ËgOí Ìh ­›ÞÈ“àsè<; Ò*ÑF îâ9¯B= k%, U.\õ°®C)A_½”%“oÿõbK–—n…MÐûóÍ”ážNnC]PYUºkë\àæ.j+ÏßJu­:FJ¹.vüK¡“p…ýe§ÔÀ±Q÷ñ˜H(”ZÛUZ©1dD=IŽªÀ,ê ë··F9!B!$$A–ã# ÔÖ¦DKrRu°8aQájl@é®·Éá¦ØÜqšZÈ“;LÉ« ;Ë ‚3å°°jd£+¢ÒÆ_G+ý’ãvm£ß\ît‚—ÁVŠFµiKή[ÌâHNÐèJ‡e¸kÕL0²{ZÃkL&èíñ’#¬t-Äót¡ÊãÅb­8PŸ·™GB"¥*v¥‚„¯¢àEÊ"/oI¹–Ÿ:Dñü:œ,'J”¥óC™jǼ÷…,^(ŽKÀ¹£¡vž“½G©ÛÍÒ1„³*éÞ—Rhx›Jõ>Ë>˜3åa‰âηåUªó”Œ’ƒ%€²„ &Û„Œð„v'eRà3¶ÅÒØ‚kB!liuvLyR»Þ­', ‡Ãg„×3g{S¤¯Sº­¼)×;i[P²ºÞ0ØdÄŠš…ì…­ܰF/fv*º•cÔ$E¹ #¬¹?Uß6Åk-wá”{mÊ sÍH<å ÆÐÊi•^FãÚmsÎ’ý-´„Æû¾å›Jž:w9¦ge¡áê\ BÉÌI8ë¥zæÔ 0uæ§ ªaB‘$^"Û¼‘‘ãzo_»sG‚ƒ*%<€•ÛæÄy@A sÄΘÛpëÜœûYï…Sî“XÛj!r‹)\P">ŽJ±þTÁ•á°(ÇÌK¨¬D¨jRZ¡ÇgÔ/¤CØÕÙIønÂüæÅ傞´üÙ_Æ»Ãb/Ñ)»ïÊ"¬8ó•A*™ÄÞ;ü…àibé9pˆJmž‘C*¦‡L¿rõ4œ5i“z˜ö·—ˆ•.9j’GH &W'Ԙ²7lö¨;m1ó·[Ö ‚48ky¤ $o­Y=\Ës²ñ©þ0¡ˆÞ2ª†ØD¥¹³FcóôÅη Æ­zéYXr¤D‚”"hÝO¸ëVÜ'@ž¬6?Ï Øœ0g2¨—Ò5©%«VøáÙ{°‚íN!"FO?Á»Keú<·É%;|ÞœïàNwc©àU×Á -ÂXz_q=c\Ï K_–úõS#ŸZTÔOÍðö¼7¬n±´‡ûQ­¯mÿúÆnµ]cVÖkÓvo¸|dÝy|êhMÑ<°‚~!— Ÿ Áϵ½¬?ŽQøåÆzô8”Ñ[)~g<Éo° ëuÔ«—rÏw-•:ØûO¹1Øñ½Ë¼c»¸%Gs€ÓªxK6Nä¦îÍoÉHX ùËÎoÉÆi»ë¬nÉ"ÖÓ‡ïø|eþ„ƒQ´£NUÎWV\¿Pý‹C¦ôçôíàXQB‹ˆä§–å"r4åT]Ü¿Y’ý*ib­< Q;=؛Ω'áÒÆ{˜t|r¸ÒQVe§}µ§ð0¢~ì‘ Áiý”ìhªT÷\Ï[j£víBJj*KUê„"Ef³¦®¥{£8¼£óxz^bÉûamó±¬Vx»O_Ù‘ÂÑëªH¯–B^-[Ÿ]Íô§è…ÛMV–6qLCdw7Yˆ—ÊAXøšB{#AÈÕí¬Z²Î¨,(—µ…Xò­)]ä²ê›–Õl#tÀžGŽå#Û”RÚü£BŽ¢³¾ r³jeK‹èý)=ø(¦kÕò#e1sèÌñ4±’åQE6ŠÎ9Ús²T ¥tìÌAío/K0¦u«B°*4ò¥M¾¼ZÊT¥ Vºä©lˆ•œà˜ûàfè{u!)ÂÍ)…<*Oói^ÐJ-'Ò±£BÀA§ƒ¨Cj_]\ú ÎŽ\_wsߟ§)ê­¬XNY1èæpyh‚2®"_ÁÙÓìP†PÍ#i)õ7/Þ/PY*TgUæÚœels{YÒà´%T*ug*] v׿)…)¾•Ú×× …Ã÷PÉs¢Èi U ÇYä¥`t¸¢3އHhãþO¨ÊËr¹N¯¹^¾ÑéM¾°ÓžÇ`JŸêjJ? ©†ÊBTiVˆ‡Må)ݯ l­ '*Ül…pÍô¢\ÈÔCBo ޼ RåøÇ-¡vm¥ŠÞûº€Q Úij©­ ÈÚæ7Ë­-^ eø" ‡"z‡Ç»5+Ö['(¼D°[ZÍN£ÙpV¹Ä;¥Ô3‚µ«(Ù²žL^Jö/ŒžôD\ÂýHœÅëMQ ŠG«”%¿çê=¤…Z±x”ÜuŽb¸b^xkVH<~óQ¸SÕ²BÀ€‰{–î‚ᆩî”´Jr¾m_×ÑÌð˜?€ëGu±:Z£ÒáÝ.ö/bßýPäì<< c6†"~‚¡ˆ!O cÞΦ¡Àí¼œ¹"ÁnóðrxržÊQ¼Ò„µÖ«çX¥–G[†”…WíÑäñ)ÀýH‚=U‹óm¯×x8~²9ÜÞçÛÖȉH£9Š_Š`¡z¸>9Vâ¢ã?jÓßæû¤Nªßù Ëo¿xôEWÑlŸÍÏ^UÓûjPG5C#¦m\»Å0ßÎ6ªí^¢û0œ†ë·Ïcwš!ã ¡Ô'}=r^_y2»¸”:Éñj„wߟ†ÙómÁµy |g„ïÌ¢LË“lÕù‘M<×F›Q÷ò“{øÝåÊÿÊ?¡w–KœkOÚÇr#“öÎrb){_ÖöHXwþ]övÈkóá3…x€GÃx <' ‹8ć%âçÌ1>¸ø†ñR! «î!}²BÅ¥¨]b­1ípZm¡o7Ñ÷²nÓgN)Ò|¾û?ÿ{Ôå endstream endobj 3592 0 obj 5029 endobj 3596 0 obj [204 /XYZ 32.1599999 566.419999 0] endobj 3597 0 obj [204 /XYZ 33.1199999 564.500000 0] endobj 3598 0 obj [204 /XYZ 32.1599999 268.819999 0] endobj 3599 0 obj [204 /XYZ 33.1199999 266.899999 0] endobj 3600 0 obj << /Type /Annot /Subtype /Link /Rect [96.4799999 235.219999 177.120000 242.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 3595 0 obj << /Type /Page /Parent 2 0 R /Contents 3601 0 R /Resources 3603 0 R /Annots 3604 0 R /MediaBox [0 0 595 842] >> endobj 3603 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3604 0 obj [ 3600 0 R ] endobj 3601 0 obj << /Length 3602 0 R /Filter /FlateDecode >> stream xœí]M¯Ü:rÝß_ÑëÓO¤¨/ ðl_˜Å† d1È"x“I0â™Åüýt·ÔÝ×d—È*V©¾zž¯¯º%Š,Öç©Ã_þýëþç‡_>~ý¿ÃoËß¿¾4Ǧoæÿç?¿{û ;[;ÿ8ŒÝÑNçÿ¿}ùqøñòååËéÿ?^Lùâò×éâõó ÿñÛß^~™þ2ÿæëÇ?œ~úçÁ~ú×_üÏÓ_ZîwþÀ÷—qêÏ?üuþÁXcÇÓ?Þþt¾ø¿/ÿñ/‡¿†0^î{þÿ﬜16k?n_5—?o¿ =¬9´Íd{w8ýû4Îî4ÿï—?ŸîvÆqìíàºfÁŸSž4Øó£Ìئ¡?L]ðœàuÓîdrod‡‰çF癬73VïtœNz74É+<­í‡ËKÚ“f¾æõVÙóÕMŽçF發W»Î<|«“¸/ÿ?§9ˆç­ :š¤Ð½~;™&!Cs²~ž¥U0pxV –Ú•uhÁ+ˆ\j» ä+TÀÖwäØ>ð³X{]0¤YÓHÖìµsì\vR–^‹`Ò·ªqþ/>ø3ïÞ-÷8ŽSÓÿ<„™|ñ6"l6Ó] »†Ð‰: ïËɂӂh2£o|ñZQÐJ³]s‹p%s¤¸~Ë.é-Ñ·A+;C'‡öÃú_iÒMe à jOŠ _¼‰kcæ‰ôæÁûÁÛv>G— !.{²!9Ù ¸ãí4x[ž2¹!x«Y\‘Òg³ýàûP|yØÒÁnE‹ä–)ײ&ð4wSÛn`µéÓ™‘ÎÆw7,óÍú<ÌR êØW„}„V1Fìs}*èiñ'‚ÓîíÍÀÏú(Å$õX*¦,½„é0=7OvìÚKÆîÍó‚1kˆ `Lp³W<ÌHK¯Œœ ¡¶w™Æ´ÒÓ¾'÷ÂÑðÇÛYïJ¯ ¿ŠM°Èœd(:IS1ÏVTÇ[_¥¶/ ¤B×M¾Ù®?Ï,(š½í}Ѭ} {çyOù•.ì€hõ!Ð|"&b¥¼+Ûý¡mà ½Æ¾KWŸµ”C$1­ÍVŸ*ÐíÞ¹¨Ú©:¹«^¤hšÉù+Ï–IŒåD†[õr§ÎÍD‰ß`?>@ÉëP¡!rÌ1:íÚQ6Kêl¥9‘G¡àÑEiž¡E3Éw$ð„3Ž˜z—º¤Rw“§ÕsPϬ°à#ÂÛïI`To?¥o+ÿ=Û_ ÁL°6ýé9¡7l/  oLH¸ + Þ“[$Œ¯Hi@H; Ÿ•™òQÞâ{w×û߯À|Î@[(ÏÅÖ´ž M'b/].°H²°lŠßsÿ¡ál«_*î™ì#ŒBd:]a¼ˆâ§LÌÃÚÖÌ¥ €øÖ„•6~µø’)ãÁº‡ œ9u>¸kjÑ,Šõ·Ø›ß,ãìý7yû‘ÉûȲëÍý7í²9Úcë<Ó1gÁLsìÝÅÞÀ·mà›Ì+cƒ¾Â ä‘2ãÑo‚ßã#8¶OÐP)}tÅ,â3þ•v‘ùeD¯f¦ë—Hó¿Æ-Íkd¡äUê0ÞÌõ¬?Œ»*ƒõAq*›œì‘’·äæ!Ù㬹³TÂü—˜Ì¥/6ÎÄ °.G¼Â5GÜ•#M²ß,0œt¨‹¼älÞ&ßÀ×…•æ#Á™ã`/Cøw6Ø~à†”±$¹CÓyf% h Q+‡ñ­ÀNu³I‡®Ä÷¤ÒiKÓ¾ËÃÁCç¾zí'\jĤ( ¹”Ñ(i¼bJ„LqÞdN¨‰{ZHÉî&H•½݉±l©l³ò1éØ\Ó|+¥Ê`KQh¶)ðùô4†.NLjïÐ衇0q òR‹Hl̨•³…·€¯<Ò†ðVBxäeàe‚º®¬¯ì( #XAfl[LY Cq±ÄjYUFpOº>&½0ÅÅ'nçpþoHË…ešEìºå¥DÒûÁüä„´WHtc¼¾’@n #ƒY ^½Ý(*HÐfŒ6°éA©S:^ÚUîx%IŠ %(q ü,!5 â—æõ:õ+…8óÖöóu°„ݺ!ÇniMÃu½§[÷ødaNò’Á:*t ‚ÔþnÜða)à'A¡'gAtÅŠ-¨Vê¥x¢Œ3@cÍ!ˆY|óx-Æ{Ï¡açÈle5žøÝ/ªwK±…ÊHNˆËB= D ¤q‚ø‚…¤i›`¹{¹² [D~ o&Hzk§^¬+âxÞæ4&GmjÛÛaR›à,{/&;ݦ’Ø×Ó=;Yê­zH .ÜÝòHqg<ý!«wsÕ,v†¥ù¦üqÚT§YZ„—Ém‘ìÓÎ…H5e¨G+–iŒ/yÜ4W‹‘¨Èvi@É{ߨ°è+Ìd5ŽÐ¶ÏhŠ[R¾€ÒÝ$âäó&\L ZãdÚ¸¤()¤ŒVÍ•°‰R/‹opaVz"‚[šÌ_z+‰Oï:o`Rœ²}ÍÚŠ7ÒeqÚYnBÐFÂçïÕƒaÄTý8Êr9°hÞæTÞð ‚AIÀr0ðÄ,&¡¾° V<)t°QB°RPåí†ÈáröœTäó¼[O±Âáy*ÑÀB¦µGý²Á˜<¼ÛÔ‚ÅÖdìf.9‘ÒÂU ]‚ÚÎ’ÀöÎù‹gº«D9E ÚÌêJ—o‚ž‹?^bIR ¤ןúàç ÈÌIˆ`ü¤œVU™v¼ •R³ˆù…};V¦«ÝûKÀn1âcM )˜!u®óô–xÚtÁÅ3å»zÂM—%FÄDðïY'i"œ Ö‚q'„BÆÁÎÌDìéI t%hI¸Èà{û¥éá’älK\Ñ263$½†FrË7’Oã- ¿ßö€Ê%ˆíu‚ò^mŽ#$Sykª+.x·-Á“êÆ^ôÖß`»ÓÊê´nûÔ÷êB· =`DƘâh±DAˆ ¡ÚŒ1½-‰˜,æFõqßN»>†uåý0¡ô4:/D¬BDZtÉɜǽ<’§ƒ¥»ØíçEà6:H"‡’£êWæ„¡·÷j÷VyÞË*–]”wjôì Ͼª/úØBÝWÖªä\Ü«/ ‘Ua'@”)½q;N¡ÄÖ>{D眅¸–_a™amV]±Q±ý!I;Õú(„'ÌîŠçJhd%7(®ã8á¾ ¡o›À!%Ü=oFThñö,,ıÒ1e$ºW–/Ý9OœÉ"K ž%í’Ü=Ô˜HRõÆSF[JãéÝOñ!srˆ<~¶Ì‘·ÕeçG%°Þw t ¶À»¥?>&ÊÎÓö íÝ´àÝÀ!1x’øÀK ò'“£çÓÉp³6ŽžH7ÕÖú¯—ÁРÂ@< Kª‰}…€­k¡éYÑçè'‚7:‡ÂC$3†In ØaÒgGd3‚=NII ß5ÕQø,àÊQ ˜(çè²öêÀΞìlšÀK’æ5l(­?õÁ/âp„z¬x&0øÊ6Ìè´O ¢N—ÎP\ó„(f¯õT+|Æܾ°búX×-Wf2Øâ%øæéÑ‘³„ÍH)„ 7 m å—ÅÛ¡ hðµkOI‰­è¤öŸ„ônÁ°hHÈôä§ÔÕ4qv•œ"!§Í ¸ÜT¥¸žØG$B±î.Šº‹‚©yrôYW•ŠvÝè©ÎÝ/Ë;«“ 1x0šõ0†îàî¹¥0_±#Í«ˆîÀЙ‰¦g6¡x‚)AlCDisìÔœ¬I¶MÅàð5þW… ζÑÉŽHƒXí„( §ò¶ÇAÉqdq®±žtíäm„g{™'RÑîbÉ1+1 · ©8bÛL*‡Ë’Ç™fÈáüî"ò£˜q2Be'œŸ•ÞšÄC²Å°ÞͶÇyK³í9û±°ÚUˆ ÄßW'‰WqþpKQ…Sømd¨Åxð³ŽZD¡xýoKdì,'\Æ—@6“\ÚWÖG 7p¹çhU—€ÔÓ “®åô’Ô|P'ˆ{çÖ›Õ´ñì6åD†;'½F¾2Ó !8ñZ.˜@ŽÖcE#gVHŒ*q¤fiÍ"ù+z¬ŸøšCR…3P*Ë&èiÄ6+;@1ʆ=ɘåÃØóûL%ÛÝ'ßT` êõs!:6Ø{I' ·B GOƒ}ÑëÓ ¡éï˜Åù”ü¢!ÁÈ ¥—,ëØ¦¹)ðe„‹´B¤eïÚ¥ûRP..ç)uêPí8°H_”ð 3óeEðÖ½ÊMÈœØÂHÀ™7Ÿõ…ßÒ§J”æwæiTb="”Å!¤À`ðDÑc>›)Ý}e•ÍÞgÄž«Ìî¯ñ‡½£\&S>ö³&ÞÛŽAH!@õ¼é›tN™ò6UÉ´"âI>#ˆéy'ÉŽ‡að6ØÊ+Q2Ý…ô”ï1Á”j{ô1BX#L@uù—‡mž‰$ˆ G°…!#G“ꎺÍAm/ý=û‘Ž9}ƒ,¥ª’æfh]²¹ úày¡þZ‚-aÖo ò p!`–2ÝÞŽy¿"ÑŽ©þÙ‰Á´Q¤ ¡„´Hdßáù¤û~Ýä.Yz–ú±h-øwfÌ/âœâÍxj}¶¿Õ^AóCbÆál$xAÅŽB­÷ð6°ûi<¡ëf 7¬m¡›´Á+ #ÖÌjÜuõ}w/Å5ŸÀ!7_}e5`Ô;˜[‚§+AÃúÑ>SßW'¨ß»Æ$+ø•R£¯KÚ_Áw„ÝJ{sÈ8 .ÌÆÊš¥H¦t­Jªf—F¡‡ùÁ dŠ:aˆBøÊì!ŽÃÌéyòUŠg‚uOß"á~TïL~l“K’BŽÎ·2Gñªqvš1‚ñ¦Ôgy»™8h* Ÿý%ÞÀœ^F£dÜ0)1B#bèÔØqx@¯§ `P!ñòPN³:qYôR,¹QÚ–—sJ(€!7„5_™LtKÉÕ'ô§²T¹Ó)ìÃÚU0DIGkAVÿ K‹dUB’WD­>ã8˜Œm!©ÛûÖSî”éÏÉ%ó>Àr¤¹*r_8Ê;o}áèŽdáh±ó"p–¥ +–­ÜÉ{ßY_Þn+þ†&Ià€Oà3C`"dÎâEœRÑMIÕ“¸åx"*O%ƒG” ¾ÍY1ß~ï ˜DY**IÑs”ßlS†ãM6RQK‹ä›{…hÜ]±{Åú㟢Êý¤•À*³¤¯<9uqÓf'çïN0-Z±ã)½*QóZí&0ÀÁH‡ñ@¨êwâp¤Èg±°B³Ò8'—Û4‹ §¶ý)Yw½on´É™dÔ…ÎáCY5ÚŠ•¡Q,†aÕÉZØŒ¨†8Ò ¡äúÿn(©2zI1‰FÄIwe릷ž,X!Ö ,ˆÆdƨÁX8¸âÚà7]Ái¨ONFý-á#“n‡%m@úå!Ø£ó B1%²çò«’!Í j8^ø¹Bý Ó sb!ÙÎŽR„Ť~˜@¾)`mØ‹‚’E±¿B\=š¸SËIù·@¹•'ŽV-ø$™Ê6–EanÀ: Yq³a»ÞÛE›4{qa·Aú]¨3T2B#’s¦ÿ ˜îyÁí™ñ7ïëÝuàÍâg~†¼)J¦ sJºìÉã˜T“‹’°¿~òLÄ&qê¥bù‡B) Š(sš¿+l„Ä, âøÆÀ/‰‡Ù >øEð¤ %t)…#B#Lðq8ûÁÂêiо¤tGw W9;ÞŒ°æ È á('Ý[}‘MÎùØÚÄ£$=”Î(G†_a=ôaK«qvß„ òއ)äÏŠÖÅ}GÚ¶qhYT SúÚ1"©”&{·\5<Á ‚ß²ÂíŠ[t ÂÌA,KG<\B4¨¥CïY¼®®ñ ¿EçbI¦VëÛ–sÕEºÅøPŠ1„¸'ô#¬xèT˜|´<˜ëÙÚoéB»PZ¼³¨ùÑCú‰_Ìç¤å8(,ndýeiLŽ$©jk¼½/\õf¦bÊ8£0âŸÞ@h ÉW+Óæƒ@ÜîÉ íjóÊ ƒ£‡çbå,èt;‰ˆåxðC颤Ÿ—dií:ßÛܱæxWÍW.ý—®Ö9˜( )Rˆåº+Î…ó”­gÿK1°ªWÔ6äp­Øk]§x3- {x¶ÁÁ¶x·ô¯|ÏSmšc?˜ŸÑ‰-x7pHYýÌJHD“Óæ>&H.ø(ݵ$vÅvžÑ:¡ž,+ˆ…µWL§y³â„îý„p½-òÅ[†Ÿ¾]±ùNO47æô ž½a9þXˆÿ½£"Áþ†2ݽæû•R^s)ömˆ±ð±Û$¢I%\ !"Í_C@oY„Ïß² ")EƵH*èÉzZšYŠ gNçð¬„$¡F¹r…"f1òý‹ðœþ~œ¤ä$ç,ýö}ElBykîòöeUâV¿Õ±?œ<®‡@ÉôÇË[·ÉüäQôý±¬&wâ>;‡Çe÷áÁ•YæÚöh§‡ò®;öóÂùÒøè9#ø üάB{´M{¾äûAî6KìÛß|?»˜öoøú΢²]1Ð{,›÷eÅ0フí²2¤îü³íî•B>^SX`ÙYä  ¾ÓÎsÑ›c3_º+JÞ \ÁyÓÚYàÌ'pÏRL’HXº{beFÃÝKïkd-såz›þhÎñ…'àø`PÀq±5Œvæðååÿ0ÉŠ endstream endobj 3602 0 obj 7699 endobj 3606 0 obj [205 /XYZ 33.1199999 783.379999 0] endobj 3607 0 obj [205 /XYZ 32.1599999 355.219999 0] endobj 3608 0 obj [205 /XYZ 33.1199999 713.299999 0] endobj 3609 0 obj [205 /XYZ 32.1599999 785.299999 0] endobj 3610 0 obj [205 /XYZ 33.1199999 660.500000 0] endobj 3611 0 obj [205 /XYZ 32.1599999 662.419999 0] endobj 3612 0 obj [205 /XYZ 32.1599999 715.219999 0] endobj 3613 0 obj [205 /XYZ 32.1599999 355.219999 0] endobj 3614 0 obj [205 /XYZ 33.1199999 150.740000 0] endobj 3615 0 obj [205 /XYZ 32.1599999 152.659999 0] endobj 3616 0 obj [205 /XYZ 33.1199999 106.579999 0] endobj 3617 0 obj [205 /XYZ 32.1599999 108.500000 0] endobj 3618 0 obj << /Type /Annot /Subtype /Link /Rect [420 384.019999 474.720000 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 3619 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 310.099999 90.7199999 317.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn2 >> endobj 3620 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 301.459999 105.120000 309.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 >> endobj 3621 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 292.819999 118.560000 300.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 >> endobj 3622 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 284.179999 142.560000 291.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 >> endobj 3623 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 275.539999 101.280000 283.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 >> endobj 3624 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 266.899999 124.319999 274.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 >> endobj 3625 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 258.259999 128.159999 265.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 >> endobj 3626 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 249.619999 169.439999 257.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 >> endobj 3627 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 240.979999 169.439999 248.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 >> endobj 3628 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 232.339999 150.240000 240.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 >> endobj 3629 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 223.699999 125.280000 231.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 >> endobj 3630 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 215.060000 176.159999 222.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 >> endobj 3631 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 206.420000 137.759999 214.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 >> endobj 3632 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 197.779999 101.280000 205.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 >> endobj 3633 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 189.139999 209.759999 196.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 >> endobj 3634 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 180.499999 100.319999 188.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 >> endobj 3635 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 171.859999 100.319999 179.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 >> endobj 3605 0 obj << /Type /Page /Parent 2 0 R /Contents 3636 0 R /Resources 3638 0 R /Annots 3639 0 R /MediaBox [0 0 595 842] >> endobj 3638 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3639 0 obj [ 3618 0 R 3619 0 R 3620 0 R 3621 0 R 3622 0 R 3623 0 R 3624 0 R 3625 0 R 3626 0 R 3627 0 R 3628 0 R 3629 0 R 3630 0 R 3631 0 R 3632 0 R 3633 0 R 3634 0 R 3635 0 R ] endobj 3636 0 obj << /Length 3637 0 R /Filter /FlateDecode >> stream xœí]I¯Üº•Þׯ¨u€WOœI _ûÈ¢Ãzô¢á—A^Ðî,úï·T"«$Š£TåÔ5à{EIÏø‘<úù_þûü×~ûò?çoö÷Û—Ópä0ÿœ§?- ¨¾0:ÿ©´¸P3ýœ¿ýzú~þ~ú|ú<þÿýDäõEûk¼éš˜+ü×·ž~ž?Í%_ÞþcüëÿÎôüÇñêïç?ý×øë[ßôÀ¯'mäôÇ?æ?%TË¿¦›;ýçoÎÿ» ¯õNÿÿD¹–”×õãûíUrý·|kl832(=v‘Ðñ?1’ãÿ|úËXÛ­-íúwJKzjI>¶4ð±ó=›1’ìÐÌH8¼à Q’«!y*ê¤Zœ’g:P)`ˆ´ªHmEܰ6M="uCÉ­âU]Ä@FñSš£'ϰ áÍ@ ·m†ïÓ ›¦¦Wdü 4óy[¡fvà®néRÝÒ3?C•›ÎÁW)6ñ¤QºŒ¨¨7†;¨¥‚ë‡8/{%FC÷åIOÇÆšÞ¯è(Òý0çe¯Ì£’¾žëCxÝÍ<9’ݸ= ÍñÔo•ÿL|{µ3ýº”0ÜÁhØ ¥Âk&aî{ÀøƒÞãƒ~øzúù}d~þú—Ñf_¶ù××iÏ?M¡Á Î_9ÿvÈïwþú÷¡Óýk •~É ®%òþÿ‘·ù5F‡šP1DÐG?øí[íp‘|Ëgɧù»0Δ" ªG¨.Fo¾Œ÷€ª|ÄúDÖ asƒ)¦Ú‡(5†ä1Ãξ *ìÂ\`Ü4'Qv»„rèœÁNJ¬¼zœ’v…ßÅö޾3ìÓ×QùÔ©3Á6U2*°«*áfMK".ƒY“Îâ¥ïý¦ví“‹Gg²ð{eVc‘‹àR«ådJÿÝY'Èqô£ÿè<‡ü2Ï`¬G„Wto†cw õüö¬Lê^ö5Ä¢ó*¿x§-—%UO¹?œa޾hsej ®~MµÓfÉH§#`- 2(“B[I§D¯ïpæ 0Ý»Ï&›]„”GÛ‡LXA@<Ø” J<(Ó,ǰGñöpí’Óð&]#r™N5Xë[oû ó ä?”Ýr(ˆWRÀD%Zg¨ap¥€VO?%›µ"fÅÇU §È‡-=ŪÝÓí7ä´¯Ì7×8‘"v´…¡ÛÖá&ɤha€ºM—«Ý¿¾Ä¼­˜C®hfg1ÚH?J˜ûa.ôÝ`w˜ÄîXuª­äŽBï|êm.òÍeŽ´qÝô°Zh‰6]…n2îbY©·e wsK"¼á•Ø`3–¯dXžWà°NGƒïÙËîÕÚ“Îg0¯ ÎîR¨‡”h/!i! Eê@x土â½G*IWP3ãäÛf? ) ë_¤@Z 4ƒýñaþo#Ë—¡ 3£'ÐsU“Ü“-Út43ŠQß Lwb‹,\â „%SÍN6X§·Q£[¨ì"XDÀðd(Û•ä@#5—¡¸JÔ°j%zJ`¸ðEÏxcä³uì sk¬•ï´kîw<ÝÇié~Äõ;„ÓZn!ÓÈ BS¤¤È­ën®‘‹Ö°¶ÅG?W¬üm›ˆX¥;_p™xÈmA›U,”@ÿw%ECá=i±\𶽂¾Ï8DoS_º®YnÉ@ÿðo:`¯Ý= ]làõ\™×¾é*zŠ‹HÁÚZ¤$hÛ™ŽØ; PÒUxd׊¯%š kÇc}¯L›@MÈWá%uR±;2"ÒS>c3Q:€ñÊ*tJ‹Ñ?~3Ï—¦¶ûå¶åë1Ò.;ªšÀ/ÑC!FP×dÑ¡øˆ¿¹žÙÝÀI|#;~4ßᅢŸ¥(©m¯í÷ÆH¯3Œ¨ÊŒ%—$¸Ë¢HÎúBßý|ÐŽ•hó®ëR¯pªÆ3|ٲƶ¬/PûCƒéi2´o3ž:L¬Àå“e|º}•NÆzM:JX³}êa NÛ«óé3±²Ÿ³¼ÆIw2V÷Û(– ­¸í-@ï¯d3R‹™†}-°¢ç§íI-@iœpÞÞÞ×ðŽ’¸} GûCdžß„Ìd l̈%c #=Rà3Áèe&d™CÂ?ÚG#Áóß¡Ölv/aÚžþU÷•Œ¶h›¤X{[’â ÑgÏPÆv¦m?¤´,RšMbsÜ%«‰2kvBÜÈ ë7 i‚¸á™TÐ4 ‘¬(xÚ q#ï›ÃÓ€0‚vrFNšœ””b]Á€:(h™4óIÝ"9^Іm„ã«ýMÒ(‰Ž{æn†Ð¨ç¸û!@Œ§Xˆ>‰lˆ÷=ÆK÷å¤à¯5¡; ½ƒÖ}Cït?/Ê(ñè8 8µõ´Jd¿â ›íö% ¨¹ Ì›÷ ýV’Á ÓêWF§·7ãŽ5°(5»7»œ‰¬Úm¼ik¼j³“Ót89Ç5[Núà¯H§9?ßÔi‚mIرy AÐRúŽ ê¨ÞÈY ÊHT± ËÁk=²ÏX†Ã}ÿ’SÛ–¯ÅÌF[p~~3†Ú!§./qŸÃLU‹­F(Ãg-Ù­ÑâPQÂúzŸ¼d‰ÏŸ¥C›t•–Ã¥úH=¥HåKQŸ´Ï ’©MŠ» ¾kã=Œ?ÿ2Ôuû 2ò(´uÎ2£sõ5˜ pæûdÀÎV8ÍŠ4Ü3+%gòŠ2OàŒÐ$wB<×â©36mÕXºŒØçÀš´½-öQCbáÝäêt¾¡À ÀOêwU:EÚöeÀwX rñ4g¼šÊs¸½5ºÿE^1ö £O6ûš$t}׆ڞÕh‘:¸†®POmaÛ¦w.À\K|((%Îû.‡_ãšR©õl‡¬ÚÅÐÐ>„é3íüòv–Ù=aìÉvbÀtãÉ7z&ž´O±þëîv’Œ‹@vOøR­§Z[ìßj’N¸Ó‘ä¶k̯èegR¼c÷j)îÞû;kNÞ¥«”œSêÛ˜Æà!=óI?Ù¢VEn½²?¿TéÞª´jX†F*9Ü"KÇ/W¡aží(ª36ˆf,8d`öé¹3ŒH›:G Ï}þ•LFö—Vì<É!ÏÃLÔ^¸gM¶‚t³Øäû2MäÔ/+´ßqË9yÖÝ1{Zø®7:­ÅvA1‡-’"ìóE´È‘þÃ?¦Z‚Dfd»Ë9Ú‘O}_hâ0­õñ6]WéÛmJwyÍŠñCedk1)$q6HX«êïWål¯)*_ R¯)\{¶ õ8hÅ>áS ·r$!'a d4gel€Ý^]ÙÒž]S«rÏ ää¸+ø$œ©’=ÙGÚ›ù)FŸù¯9¾mSj ©ÈF‚î  ¯IºÎ è ÏªO:ÌQd5 -Y.X&ÍHÙäLNÉY3ÌgA^Ôš¬‡Í5N¶ôxøñ÷O­ N$)“º~Å‹0rûöè¬ðŒHYY”(šy‰âžÐv¬X„î´¶Oèt¤Dæ÷€5 éf‹©mŠà=ÅgŸ“­«xN2œ“"ÒDòǃ÷š¡YÑNÑfžIàe!+xy@ǽygŸÑ©¶ƒòÈžÔæ·åŸçÔó—\ÒpÝ…ö ×)ÛP¢9 xþßËÖqF+ôÃËÖ½lÝãØ:.Èl븺Ñt[·±¨"¨û>{Còô}%‹}>-üÜXÖî <žÒ¯ØÝg\l•Ud¬>®ù¬4*~SßD8«O†äòæžÚ]hO½¿Ö°#ÓýZîX¥ÌIú["œÇ$62Ûø(ËÝÿƹi²‰¾Ñ†Ö¾ xNP‡~"w%øîš‚Qo‚Ûm—ÜŠoé~0j„: h‚ômhæ|ΰߣ·wä*6Wm›O7>9lúª>§¿Êã’¾vbZÒ^ËôËNüHv‚KêÍï3„E‰D[t©æEɑޢNפ&@I^c#ÒùmH@¸ÛÆâQ{u^7øóièŽM)Öh]Û~›MÜ„‡ÙØÀÛM¾2¢àÎF*új1:Þ?üÓþŒ—cˆBø3²×qKaÜÆLnE |N9Ä·ïZDéy‡)ñ¼¢hà =-Êß];³"’jç˜ü¥!íõ «>2 èÄÁ.á“ Q+€wÌ>>bçÌ4ãȺ²¥R{r²Û)[IŽ:eû\Y”÷9οû'Ž>[úc}Ññ)ÇÞwÒi›Iͺ|Ÿy|èO߉Ax¦âÇ`™6‰i8¥œÝÆ™)#{Vzrš&šËÉ?”!œ]¾ìÜæSmø6^II¾ñ®Û?°W®*f©CÈJ‡Ì%Iʇ¤+M”¯|^¶¯€ÝLË<»ÄÎîpŸÝi’®s$/Ó~=F—ÿ8}‰Ÿ>VËØíwÆIPÕ%q d$Ñ(QGo”{Ün‡°™±íé.Iç”´Ó6÷ÁΟˆj ~Ngñ¦ëÊ)j¸.€}Rí— ~h`OhQv!3Éî0·‰lÚtt!¸m%¢.ʬa‹”źbaíÀËVìF2xZ1Ð9;Ï”»Þá Ò;>BÛÉáâ;v ï>©ÝåÆ/tðzÞ±œ½$ úl¤+ïhËHÐésŒí>ÎØE ›á- µqB‘g«D%¬—C ô‡$Öeö=ì©cWÀ—SlòÜ”dÖ•s×£¼êá¬ÈôK¢çRyVÃeÆËWòí$Í…Cµ&®Lêe-îjnc|Þ^Óéµ³ÿ6mñ¿'ãSlYËzßN;}øÍþÑ˼“CI—Fß?k€îØ…ÓI†f#vÇ[4Ät>ÃØI%Œ, Rýsœ]4Y³‹¦!v»áMåXØe,³ akqWdÍ.z±‹2~c `uc[Ëz³‹v¹?¬É ¨5> Œ„²åè´¼‘Ÿ<¶Ôʱ¥–õliÌŠ-õ0ØRÔc™©ÄgË©Lêe-– m7¶4:Ä–Fùl9–¶œžbËZÖã8–-õÀ=«`>·_àjFBÓô1‚ÝÁ™geó‹Ô†Š {Ëbr=ÇäZ/ ª™\µfr¢CLNŸÉ陜:¶vµ¸+µbrMd€É5~c‰Ïäקز–õ8frJ+´e -]à ¼³,ßãˆø"¨ÿ‚K±5bÉ2DSJ™YÔËkb2$CLûü=–ˬ”ØZÜ•XËã!b ´Á  MO±e-ëq,C¼ÆãØY†’™;—º,¨g>±Žµ´ÅZZø±ÖT˜O¸XËÕâ®Ö±–¡XK ?ÖšJó k¹ZÖã8˜ù„Þd—ÅŠ³e$rcØ;øˆ=ÔΕ¦Ž3ÅŽZ­cG­B±£V~ì8•öW.vtµ¸«uì¨U(vÔÒ§ÀþòÆðj;ÞÛ8”ý•‹qWÜ`9,†qœaáŠÑd”ºÉƒYÔ˃ö‚V Z ZM h5· Õ,ƒVׯMt(hÕÚZ§ Ú­®–õ8–÷åe òeܸ ’R–›à_Öx"ÂÖ Ñ¡—xúr¡µÑ7¬¶ˆõÜÂ’åÛ¸ˆ€±,¨–o3¬ãu3„âuCüx}*ñå{*›%ØÕâ®Öñú¨Tòm?^ŸJ|ù¾>Å–µ¬Çq¬|ââõŒ„[(ôŠ39Îbé±7.‚ð6Þ’0½`iž`É¢R–*Ö†°µX»‚z±¦kÁЄ0Êž/rBS™\º„\7±¦!ÁPB˜J€XS!¸ZÖã8X¬Y:|˜XãÕ£çúˆë‹ûÜ%0{2j>æ‚<*VõrÇ×è‰á!ôÄp=™J€Üq‡ž¸ZÜÕ=1<„žî£'S ;îÐWËzË×›’‚3…ÝA„ÛÞ‘!Ü!L÷Qñö"Œ‹ • bCÃïX [Ô3»\c%F†°#}¬d*Ì.VâjqWk¬ÄÈVb„•L%€ÙŽå+¹·q(³ËV‚.…”hÍÈ€úK9/{@‹ˆ ~œã]‚ £+Ñ›Ûò°¦­ÙHÖ ÒElÆ\A½nPkÜÈènd´M%@7h‡¹Zì•ZãFF…p#£|Üh*ºA9ÜÈÕ²ÇÁºAóMv‰ˆN[ˆ¤…>É€iwV0É¢£o 5Ë‚zÑ1$c xyÅÖ×Ot®eV8Ì ’1$c‚ŒŒ @2æɘ$c’)@·ySí\âíåí=å "ز –ùè.™o¼c©ö™ààZ&õ²wµÆëp0–2Ðæ§Ø²–õ8f>Zãp…1~'‚ZÄï]kå4ÀWú‘,hàpÇah >ë%Ë ;þÖs :2¥—õ Œ±µcf,•¾ra¹–YÅøR1¶V`,€ÀLGL@™ŸbËZÖã8X1½ÍH%À`:ŒÄCYˆÈ8¨ÛÉA–õÌ'ÈšùDK¹Ï "×2Ë^‚.™O5ó‰"Bnü68@Dæ§Ø²–õ8f¾ÛWG# Š•”Dô›®[2‹ å±˜È ¬ËŽ~NÉø¹ö®K)¹§ê·'Ëî'$ÝÙÏÅ™ÉYvç»ÀKg¹?ÂoÇÅ@Ƹ7ì›ß¡ô"ùú&ó°Œ^ǧ)¹ˆŠ¤¿(ɰ•þ]qüŒº¥BÖÜŠRjo~Í>Ò“š±dÅ(ÊÜž3-ç›TéÉ“J2jçd Û…A›Pj)JnŸš.ÒR7µ”;9Î.Œ¯áaûe¹€–Â5› ‘4kÍ„V;3¡õS X³&.ÒK`UV¨¾cÐwföP¦4ø€Ö63ŒøCÏÚ´–¾cïØ|¡;‡Õyï0ç:¦,€Ö ®›þ¦‚¨µºµ‡Ï)Ê.—1μCgZÈr<Ê;ö#Y¼cík€ãmÖæ<îEÛ±ßj½ƒ×øç*œã»ð[Uð^SœÆ¸´Œ4Ò7Hã½dj-œ³%V ^?NÛÏã#ÄßÁGˆkÔ…Ù®ÐZZO{¦'ÎS_eT}‘E:¾Ï-½ˆóçÓÿƒ¡ðÓ endstream endobj 3637 0 obj 5618 endobj 3641 0 obj [206 /XYZ 32.1599999 698.899999 0] endobj 3642 0 obj [206 /XYZ 32.1599999 555.859999 0] endobj 3643 0 obj [206 /XYZ 32.1599999 260.179999 0] endobj 3644 0 obj [206 /XYZ 33.1199999 749.779999 0] endobj 3645 0 obj [206 /XYZ 33.1199999 696.980000 0] endobj 3646 0 obj [206 /XYZ 33.1199999 553.939999 0] endobj 3647 0 obj [206 /XYZ 32.1599999 751.699999 0] endobj 3648 0 obj [206 /XYZ 33.1199999 258.259999 0] endobj 3640 0 obj << /Type /Page /Parent 2 0 R /Contents 3649 0 R /Resources 3651 0 R /Annots 3652 0 R /MediaBox [0 0 595 842] >> endobj 3651 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3652 0 obj [ ] endobj 3649 0 obj << /Length 3650 0 R /Filter /FlateDecode >> stream xœí][oܸ~Ÿ_1ÏV/ºÅ±èC#úPô¡Èî¶X4‹ºûп_y¤ÉùHË$› ;ÃuHžûþôåÇþ~üpÿå?ÇoóÏû/‡ºªÛzús|þûÃõ²¯”œ~íú¦’ÃóŸã·ï‡§ãÓáñð8þûtíéÁùÇ8x~Å4áïß~;|˜^~˜>ùrÿ—ñ·ÿåñÏãÿ~=þíïãŸæùž¿ðýÐíó/ÿž~RÈ~üÏõoσÿ:üõÇßFúÓ¼Ïÿþ õЫ¶‚ãéò¨8ý½~½¬>*!åÐ…#œÍ¸ÿýùðË8ÛŒªoç?ð÷%oêŸß¤ë0Qëø”¯iD–×ôõá5JËÆxÍcä‘/ÈóäxðîëáÃÃðL(_±êDmÓ¯ßzüϸJŒÿûéøÇ‘äÔǯ¿ºªT×Läé’þŒìN#ýËWá$êÓi¤™B?âÆõôýi¤­¤èé?žF„¨Ý>½<ÓœFt¥§×\-C› ÝO_½|ÐLߪZ4íkHð¶µÆ¬BL É3/#ƒ †µC#xëÏhõ×emÁ<Œé˜D]µxµåR£ÃÓ…>ŸàË3Ó.õU?ÔHBÍËèZcªƒ#Am-/«Zôb¼ üu±BÐLÏ|þ:r´«9!‡Qº1XŒÃÀ",ÉÚÛLÆÈ.YJZ}sƒ Þu,”anù]IvDðe$u(“oÅrl à´ulxoàˆ¥óa¡±Àq@ØàC…/Ñʈ®t5³K–rl›åh=K„ôa½¦ ëIa}Å ëáàW¦àÚ­€ ÚQIøU¥Ñôjz±”U«OŠÃ‚ygƒqK­RSÑlËÂë æZZ¡”=2GЫ±ß0vkÇ'Ò¸¦Ù6Gš˜ Á‚Â5• ¦Æ“YB«0¤~âGÃðšmU<å7F„.#e„7‚±jVnÜÁ‘6*Ž|f<3D…Î&ïáìŽÄ§ð‰1‚wr¤™Ëæ`­è½ RÂ%¬Ofed¯#¬‚Ì“ f…A^Þ“…¡¨ÎÏP  ë£eÙëˆCžbæÀÑâÐAšp6Ç3PƒÄ¬“ÛƒEãÝáh\ÑW~ÆÕ\\W‘ætÄM¢ÙëH.Ä ÒÁì°’‹ m™ArLEõ´áù8žïÉixvŸÝ6ôÃRɱüÁè²:s(#ù}b³·‚¥ŒÔÌO½0ŠNÅ¥¶º&M@"‹tÐ &¹LU ¿W&ù÷30—ËÏšsÑ•}Í7Ç ÷[¸oKo/>£Uiª«½4¥ê\4Õ_úÒ¾Û˜ÉvèÐN0Ž›ŒõNeK;Y° Ü¤MºxÈRHùz›VÉŒ™ÉRèË+á=Ïœ‚²¹:Yn¨ò„q]Z¦«ÜYz%!Á(îî1”î·l§qâ›p ‰vV.AšŒ"u1Dœl +¦·ë®5þfÍM—Ÿ®¾á"^+}>袾$܇Ãß·“n·ÝTnÅÆr6EÑLý€p\–Ÿ"ã.ø ÔÄ(qÔØc”bëå%kæ­ Ê20Þº¦µœ¢²Ñ úã˜èâ}J4½m¼å°3¬14à jj|¸XãÆõÆ‘Œ8E XÓ Ñì9»µ’¾ÿ.Žu÷/Í™H×z“”ßÙ)%‰½# uã$ä=+ÇMÑŽqòv¬»(·;c@HÁŒ2¤2Ú’€ŒîX…!¸„­'dšÆ(Öf••ø£BY|9)UhÝ¢ƒ€ç„T(|Úk9°¶cÔ¤ EµR÷Ò™/W*è.¥’QÌcŽÅFˆu¯ÞNç­“SÞxJ±œ›Â‘»+ÈA¥Ÿ—µáãø¡bTLǵê²%œIalò­¥E»¹Ø#y¤¼ܹ2[V/AŽ¢VÄM™ßŒ,ÒÊ„$F* E#·ôðú³|U«•þù}¯¹2\ÖÏè•­?uPžïü°SÖcçšs/}1/Ö$¡¬&ìóq¿œ‡²Šp:Èû<žÇÄŒ‡Žv>Ó_v!·ÿŽÓCs»¥/MTY<‘0¢t:[71y‘ZP2¾>M-Ó¡õ&„R…7nþçíL“Ý7µ4ø½¥Ì±pÕ²£˜±i£Æ¹z½ȈáT²()ãxoöTE¹YqšŽË©[Ë„¤ ¤54 ¡N‡ç–МpE±2Haˆ•=$3„¤ïÏÖÜ •+H ó“&åp©•…**ÝCŸÜ†+*Qb•(ͱEÔQ²0¶‡ZQ²x‚”ÞSùU¯ ¶ÄÙþ8¬Œ@ÈËÛpø³” æÂ•ÑÛ™ßá™ð!¬Ö~„à1àxÁ81¡ž”à;Ä“åN02z .Âù²Ù«g• b®HˆRþHˆšv寽~¹"!0B#!³cøÖQÂHH¶x‡j.k-ñŽ÷ïØŒ‡*W™ß Õ5”ÔŒK«8P?½Zá]nsÆ=â“´_¼ÉªíÜ‘åÍtª¹)ìì3å¤?㎼ÞôNUà†¼8‰{QpתOä¸-Õqí-Y@L=!¿ŽC‰™ìecÍP (j‚YèóQ¤AÎFBºUã6eP@h“gpk](Cp²8¢DxYQÌu²Ë.ƒUÖ^üroBÔ¯†Åž¦fý”‘ýºSúõ;eò♆çS<Ó/³íÐ3ýFM¢˜w©oq 1å¨hѾÞk!_ÖØ›ŸÌ„Õšgyý•ÁøÊ,dû¸õl t–¾žI@UJ¿öÛÏú¸áÍ2#ËõwíOàÓö›ðJÎí+ûÊT\tòä’9r¢Û¸ZTŒ¢°ÔWbáÅ™¿î(w@;$i/Fþ¥9ÂvSÎ÷à±ÇÏ2ºÁÅ!f £bܸɩ9±Ã`1ZÒjlö¢™>Ì0HCšÄÙ—(€®Ùã\AH!=‹•;ø¦×1EI"ô²J$8·ÿqlÙM)Ñ Œ7æYPj)­cãZ,o•ΚÞËùO` ôÊ©4¾úâ7] ævWQø£É Òö„ævâut'¥hC$öLÄѯ£äŒ´ñM«¼ØÙ÷1¸R>¥¢ÕE©H¢T$ ¦¯ã r™r›“Ïþº)ʶFqñÖµ2‘ E¹<9ç> íž<¡ji5]ÜŠîõ.U4þ#r@#—b”(³9Þó™ñŒ€°µp¶{8[Gàl5†í#}ßf»õj¼RøžúŽ@8gêx„M1NAàÝiò‘¦jHo^œƒ4è_vC[Øma·o {ñÉyñ: ónšÂ¼ úæ]˜wÁ^ÂÉ5ðäæ‘,Ì»Ó^D*Ì» aÞ…yì]G¿TaÑÉ ‹.,º`o‹Ñ‚Ó‚ÐOS{*•èæïxŸ¡Z¾3mÜpuÙESº†èÄIÝ\.s+…¬‰áJhz»¾müxHÐÈ9ÇÂi‘°RÃÅ8 Bׯ¨™ØI®,ÏV&Ò ÃYú‡¢ÓBU†bÕ¨åŠÕÃrH¼= )Àç)f'ôm¥pL¬MøER:_pñÝÚû[úââã ±É2!r®†Àyå)™~« ®ÏrÎ&![‡úM0´ãšüq/– P;¶IH3.‹•q:j8üá‹zmŒO#ŽŸnú©óoßHoSKýB-Nzq>ê¿Í©=Šq7»Š¶šnsUõ9»n~·mÕÞ&”AW@È®ênû·º#ª)UÉá¦Õ4U;œ‰„·ÞÓÃgøÌÄ3;YÉZ½¾KêÎ6¡òõ'ŸàwgL½±ÂôÌÌ·n´Ž™ Òž™OŒ²ö¶`Ýóï²1Ko½o`àÆÌ>æ[´©dV#nÍÖ@|ƒô#Ð{ÔôL+ªºëΦ:Dò>ÊÙö}ÝV¢Y§qÈ <H¸â*qí1&¯=>þJ>â6 endstream endobj 3650 0 obj 4449 endobj 3654 0 obj [207 /XYZ 33.1199999 783.379999 0] endobj 3655 0 obj [207 /XYZ 33.1199999 688.339999 0] endobj 3656 0 obj [207 /XYZ 32.1599999 785.299999 0] endobj 3657 0 obj [207 /XYZ 32.1599999 690.259999 0] endobj 3653 0 obj << /Type /Page /Parent 2 0 R /Contents 3658 0 R /Resources 3660 0 R /Annots 3661 0 R /MediaBox [0 0 595 842] >> endobj 3660 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3661 0 obj [ ] endobj 3658 0 obj << /Length 3659 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès·EQO °o€,¼@A'0b#ò÷Ó3RÏÌ’ý‘¬b%öjðŽGÝÅG=¾ªúêÛ?~ÿ÷Ó?;}ûîûÿœ~Xÿ}÷ýCsn†fùszüûÍë_´ÓÙ¶ËãÔŸÛùñÏé‡_>Ÿ>?||øxùïç3<}qýçrñúˆå†¿ýðë÷ËÖß|ÿîÏ—ŸþwjOºüßϧ¿þíòÏëý?ðËÃ4?ü{ùÁ´¦.ÿóú§Ç‹ÿzøËïN¿^†0=Ý÷ñ¿ß´½iºyÈÇç篚§¿¯¿ŠÖœ¬±“iOÆ´—qö—éøï?~ºÜíyçiXÿÀŸSž4==©.OjºËàÓ5]ç<æ£Èt·/Óý9ðÅ·Ÿ¾ý0Úîôé§Ë:<íÏåŸO¿<súæq&ìxúôãé÷McÞüáôéç‡Ë4ëoÚÉýM3>ýf}dv>bß/yùM×,¿/Çã²æ}ó|Åtîgí[ôÙöºâaýètúáòÉW\oßùW¼¡4öé7óõyMÂý»Ò<]ùîÓeOä­ðü(›m‚×óJkâ¿N¬•©ëÔWRƒu•ÔQ–Mó¢[ÕÉJéuøpòÞ·²úm7¥%9©Ë’uYi“‡±U±¥¨LÓÏŽBPÑå€i„KPQ¦ à8ÈŒ3|ÇÅ1÷•¼T'÷Ý=a“ª [«62å* Â\£]cûë#Y\£³÷‘®Ñe‰opZÈB ú„l¤ P»\iÛóÐ5ÃWïqƒ¨Ô›øª˜D¿*ž|·¶wÙZ÷7þK—âHíš±&®‡ÒqeŠ ñ„‹‡$Bý@1Ï22€) b5%[ 9Ì«,O £®Ï{-V˜PðnÞf`ÙZ"aZÚ*Ýôm¥Ë!áSœôX²’o²x0º>#êkUñ.P™¡$ÿ‰0ïr”—®V‘@¢qÁOB‰äF£Ìk™ºYÙtŸÍS¦%Ò¶vLh+BÈ@uDR 22BÐU9x Ó^AŸ9è™s­Ì[M±Ë€¯\2ÒwÞ#Õda¤½÷$5Þ3m<«ÎÄ2­sj㌴Y0$ÎH€Wì ' ~§…ß±Ëèoä¯wžzø íkà .Ô¹PéÉÂO{LðEY]ÄPM¯*g!"ýnÀ©ÂÖ‚¢¶èÛÉQ”^$Øtˆæè°6•Ù±$öJVƒŸx -æéÊHÈØªÀ­ ÇG%+¼{¿~´·Oo0±ÕÖvÐZ_Ã'Ýu( –ž}“¾=ö§Wð„–s½†çpeM®×5xÃÇÀÞÇ]ô;®³}cíÛÅ›”™Ôjrñ°°Ç7Á§]ïtžæÆÙ‡+ÉëáJ®äáJÒf«:WrtÕ’hq+‘V…w˜#â«bÅ{1–ðã*æQÝE‡VépeMV§¬5˜p¡ÃE©^ÚQMg²%}W®mLÛÿNœ.JÝ aó¤çCét"Ï*J,ÁI³ke¶½=æÛŒ²Ufx–vŸ‡¤éÆ4]Í"¹JQg’¦´êÙœr‰ƒ](ÊŽiFæäö23K â}‚AFp|3UÊy?]5†æ@Ÿ„j‘÷i63GW;é•v½ÜT’baÍÖVÖ¼Ö Þ°'ÞA¡ß¡+«ýx+¬ ƒ—¼×ÞÛW_¸öÔ¡ÅBÑId@œdþÍûL×d¶‹>ŠFš·èJ·NÛ $n)<üGøöî÷"G3nð‘Ê‚FT?¸š&ðnÓQzO÷xe‚7é<: ´9éõG"”x,B–BuŒ¯ìçÌxñ%Ò¶eés8ýŒDy­ö××@à*óÈ&$ðöªñÉfp½‘Öô)l SQÀ;M|ðBš'!KåtÂ[m]¼£vÀâ‰2½ä©tEÄLHöXv“>öd›*±§+Ö 7Ãпra‘,ÿ/†=ÙöÀž$ìÆº°§÷ô›ài€Û#YxçØÓ=ØÓ=aOƒ£i(Ôôb’ÀÛãmL§UJØ^Œ¤¥¸ùšSI Û祔F½³ªq‚·ã)+owpä”ú·ßnŠ,äŽÂŠ¥ P¢PmŠHí†`Þ…*Àd\×f#l(Y˜NŸ°{îuK(Tò,BPÂBuD!oÑÓ•‘×)R¦tU§ÍM…°©±Jl 4†)"ÚbhÒ|¹×vÓšl³Î ¢ÖxV#h3«&ä W\á!ì,ü„(KOpŽÓ”žþåó¦S¦qÀ«âÝßÊTÎmM)¡‰õÖÑr@ ÇÔ3ïþF~*¥¼È¢wwª”œœhFÂ?ž=?:'Š~¥ºCÎÝ];ˆºŒÈ@¼(^rQº«VùÀ^ßöŽb-ýÓ¥QÙ³„Ù úH¨Äƒd`$9üîävs3hN-•¤iC S'$hÜpús ô%*;*Ð]œô=z¿fÖä4:ÚE„M“AXÕRîqßÍ_*Î:ÜcN“e̘ƒ_sRí€õ¼Æ/§c{½N橃éÎXª œ3º/È¿à0ɘ ý#Ê1‘öÊ%< TKTúâ!jr0õRiÊp?#¶TÌ1YLµ\ÖÃTeöz`°°ì;p¥T¾ùØìq:òÍSä÷ç^¶#ß˵;;8ò’Õ圓µ©R?o@‘ØSU23Ò߀xqT\«žlÿè3`OvÞÙ÷zú¬uËT´çe`i.9FþÒG‚¼9S Ë€ë–ÐÁ´ƒ÷š··Ó]GV7/ŽàÑä[Umšb]‹]–x™SÁ6s§æ‹6ý ˆÌÄSÀÝìLt#”\zZÅOÉhAø,ìžÜ¾î¨TÖEߌU÷s8€ ¿FÑ7_õvévƒ2¢O¶Kp=±V¡¢Õ2[6ÝWÏé6®M€x_Ô@ Lˆ"`FÖ>!!L¤e¢RÛç-ÁÅÙ8*B$ž°8ãp7T²TútÞÀªÎ`qo$\û祡m‰ ra²zìhG6”H¶©(kæÖ_3¥b)™y­X°œðvQÜdå`Õ[5÷éM[eÉ‚…¤Q¸,®/Vd`:Q„H36ÙZºývK¦¨äõPðÍ1Õݨ1Ѫ8aR†>Ž¿Œà¸0ìÄéǼëà{¥û.9dR¬Ì“ZÙ&šÉQ'%vÞÊÙéÑÙnE*RªžžFÀâÛËHŠX 9H:ì2É꥛œÂ¡,b‘|>ý¹Êègæ%Œ«HU)ªIß¹GW¥ÇttÒÒeCøy"à1çqxŽ¢b—ZS!á’I,Ü©œã…nŸáõì ÏÒÖ®ýfU¾ùËIÓãðò”î¹lÄÎÀUm4:âU©öΣ§sƒ5+ mK´RÛ>l£y¥Ë°·2œKƒ ÅSÛ·Ï{4s•¡ÛÐà»a*Ì6eKYì­Ù,ÜÃkÄýHs„ÏU¢-͸AP (ƒh+£82¼PŸh5ùÁÂÙúFÿh ÍB¹˜~žŠY;ŒÜ)w‚R´A¢$PÌ2ÚðŠ Ò 'ÿù³W8ØBÑHûõ²tÊa˘ÀšFýÜ;:C¤z1«TA9¥[2E¦—0)dËQ–PkãûAÂR ØHž•‘™êm?‰£•?‰37ñš@rãEá`ûÁ•:Iº„V$Ñ•o…ÀrAÈÞ•JU{„‹RêðƒI'§…i÷!Ç2R!´¸hÖ—xŸ¬ñœÓ½›¢Â~Óš­üJݲms¸J…+…l¶€CÚúì—ª)»OsU#ƒKq£<¢küBàM•uÏç“P¥±t5àžPú…ä“M ‡]>¥˜+%ªojìÞ¹cËá^e‡¶˜/_&C)ŠŠg茫xJ—!ܧÂéiQš š“ü!RpDØ;޽e„…kè¶)ÊÆ“Ã_å(™-à»3’­žäö&[_™+Ìö<Ì͈7÷ŸƒV·±w`“úšÇ]G“ Á+ŒWíÎ+£±Í5øPU f@Ã-ÓqáËzòn5R¶…”¨mŸ½« ¿ÒÅì*d’G›õ£Íú«ÑK´YÇÔð¼wë.ðëþºÞm+›¡‚T‰Â]ËU;²·ŽÖÐáÿW’Ñøà¾sŠ¿óv=žqŽ'¾’àÅ¥›“,òy jŸR¼_:uIûw†EÊV£öÌ[fikÜä,Ô=Z¢OE`s" ÖíÌk÷ÀW®ÇVÀXNŽfÑ|™§å¸ü=}¾ÌûeZ¿±þóÃ/…ðW°yYÁÁ5 ~5îþ'sy¯[Ùî³–f§'Ût××\œ•a8·×hîÎÞ|îƒÕä¼±ã;xV7o0çf¹ÝË•íªvýNãŸ,<¶ó>6|NñsV€ïÖ)1"ûaššálMzgcôp)áa7o^ËhAù|úøð¸ ‚? endstream endobj 3659 0 obj 6298 endobj 3663 0 obj [208 /XYZ 33.1199999 535.699999 0] endobj 3664 0 obj [208 /XYZ 33.1199999 474.259999 0] endobj 3665 0 obj [208 /XYZ 32.1599999 253.459999 0] endobj 3666 0 obj [208 /XYZ 33.1199999 329.299999 0] endobj 3667 0 obj [208 /XYZ 33.1199999 251.539999 0] endobj 3668 0 obj [208 /XYZ 32.1599999 115.220000 0] endobj 3669 0 obj [208 /XYZ 33.1199999 113.299999 0] endobj 3670 0 obj [208 /XYZ 32.1599999 606.740000 0] endobj 3671 0 obj [208 /XYZ 32.1599999 537.620000 0] endobj 3672 0 obj [208 /XYZ 32.1599999 476.179999 0] endobj 3673 0 obj [208 /XYZ 33.1199999 604.819999 0] endobj 3674 0 obj [208 /XYZ 32.1599999 331.219999 0] endobj 3675 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 72.0199999 165.599999 79.6999999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.erikyyy.de/compilercache/) >> >> endobj 3662 0 obj << /Type /Page /Parent 2 0 R /Contents 3676 0 R /Resources 3678 0 R /Annots 3679 0 R /MediaBox [0 0 595 842] >> endobj 3678 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3679 0 obj [ 3675 0 R ] endobj 3676 0 obj << /Length 3677 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘ç&[¤¨ 0 ÔÖ|0Ðè|ø`ÔxÜL\žƒÿ¾¥Le¾CA2‚””•]@¿÷´—X¿ˆøé_~ýÏÓÿãôÓ§_ÿçômþùé×·ê\µÕõ¿Óôïl®íõ×®oÎv˜þ;}ûýíûéûÛ/o¿ŒÿÿþfÚË‹óñæ­‹kƒÿøö÷·Ÿ®¿]¯üúé߯ßþïdOÿ:þõ×ÓŸþcüñç¹½éßßú¡~ùÛõcíÇ?›nþööï8ý}Biwúÿmcmk]Ö8¾ß_5—¯bU§Ú4õ88cì8ÎfœŽÿý¯·¿Œ­Ý‡qîÛù?ô÷”žú©§®nÆž*7^³›¾ t3î·®D7uUäk\gJtÓ5þ×ü"rìûQøxñã×·Ÿ~¦cÿõ/ã¹ÐŽë¯ãÇ?¦óàìéëŸOÿ4úŸO_ÿúÖ«¡îš+±™ï´—;ýý‚1— Æž÷¨¼G«ærÁÝž|x´ÃîT‰ùx}çýÑOÞ…ú:ÖáܵMk›‡wmç í´j*ÿ]Ðúö:¢f¤Ó½YŒ'0´/hkþ Í÷—;íÙš>òåø£õó÷‹ýpÝ/æÜ¸vjFøC:÷þ2¼?°¢`¤ïؘ?%øç~.ðµð‡F™tíA#®ŽÌÀžss}÷Ëב\ê?7Ò\úáÃÃçÝw;ø¡ ãb;’°ñeˆAúé1}úð“vè=,„±V Ðÿ³§ÿ,œ'¢­Ù/~Ç ö ?'†³HúÖ"×À ñ=Æ8ª"3 Ö5Fp‡Å… GÂþ8+ò‡g poq‹05üùUd8}Ý{ ‡C¹(Ò ª‹ˆO„ ôN côŸ5’¨ 58áÿÌÿŠ€ÀT:cKçŸáƪŸÁYãmE¨h\Â'œ\T`ìûâ꺤H‹«Š”ãœqéTCqËÚ¶ñ÷l:¹#œ`ì4æÉt€¨|: ÄRB¡ ‚Rü(Jp840{*ÝPd ŽvYHÜeÐÖ@óºvœí- qåögÿѸµöFí)ì”°û‹ˆºŠ ¡|!Ò)Î)e씫\jªsÛ™åÒ¡wê]nô‹¾S_½bêwþN¬k´|~ÀN¶›gëÜ•×q…¶–NˆÄÈs˜ñq,Ñ™z¡„†:óüêQ×3$’­‚„MpB1LFpéÔi¿éœ¿B/œGƒe>:F$IC´FçøÀ³U—­ ¯£“wtDü‰¢F4ÝÃL¢›œâåyQWÕ/‚ŸÄñŒâ¾©Ýa‚8†Ž„›`—)#¯ÿÀ ¨tûÁ2˜10 À%H·üá %…"¹ˆGvÇNJ7=_, è ím0Àh€ëh*¯¯ë} ÁÂE1„ãäFÖqGF$¼qf ¨ €¢tˆv¬{4çã£g°{Â’ç¸63ò¤ï \{dõ(Jº…]Ä9&Gt–°Ïò·ï1´î•a¹ÚãBk«ŒÞ±¨¦xç3¶B5ªð7>aÄÅÕíyaÖlxkk­ºn´…>ý+«z3,ÀOw¥€:ÎõÞ`RÜ„…põ7è1p8ëbàš7‡“tB7ÅdƶÐÙºè ÇaÏ8½J¯þ}´¬˜3}"ˆI{Ó±=MÕxìCÄsEM ­"K–/uÀÞFd‹ °w甆?‹akóHhLÇÖÏÐr6(Ç’«íÙñ#œV3|–»1ÑZà/åûï¤û)¶z‰WÇùúRàSŽƒ¨_ ç×/¦è8?\ü  ù>¢ìEæÍë°"šÏ¨¯"5õ]Ã%û²dfGÒˆè%S 8’Å'X»€A?§¸]€À;E`N8Än ¹œD4hÉu>?ᘵ9„HQe(>®“vÞní]¥r5\€M¨ð8À±(Y|2`¢lØ¿J”øffè]ÚÆvðˆ=eG2 9¢d‚J »²CçYÓܸ:Ï#>u–w›ÛZr&Rþô¬r g;]¨o|e|ñ½ódÆ$Šém?)Þâf‰½ù7vÈè@Mä[í<º§NÂ1渄#bqQIŶ¿`z‘3Bˆg"TQ èÞ¸y Èéë辤!†½ŠÒ<ʶ7ß@„¯À½n;n†#øð8ZžTB&¤–pî2TSW8?Ꭶ:Tùs`=Óð h`4ñ­åsš4ÈXÊiÑqÆoS1¢€¦ÖÝ*Q9‡“aDz¤f×`C#lŒBVJ3ÈŽãò›Œ±YD°*“;˜’ºƒúHĦ»=®¢­î†·çÀU̳})k¿Ø×8ÁÒ§«S9ï˜ôû1TøºàÖ:ÔI\áHS‘ ã‡1Êѹ‘HFU¥HY0VѤûé¡Ýôôª2,݋۹9P Jãçd·Ñ<±š˜3ø|€ô‰¡<Äéâp(ÂÎgÏJýB é0“ç“)K/ å³a( G† +–É3I/°£™½²µÏ‹”aÒ1þ^@ÿºWX§€‰R¤Hª´ØÇ ªYGH%ÁLŽª¶}þÿ,ðQ‘ºwåí[ÕýQ h#§ÔÓDE4OK%‹âÍ£{¿c>Ew¼ˆ‰œ‘»-«’©,é"˜·$ÄcÃNÀ¹èðéÍì£q‡[N®Èï“OÞ–š@g=famt2o|7!›`ÔÀ›DÌ·èwÆO—@ ¨]->“é‘À/1ƒ¥±ää£,—HI‚|“IR¼ô0/ØLOÂÀ3Ò—ž¢ÉàDµeNˆþ†<ÉÕ­G•(xT‡lú測EÍ3ò{•6&ˆz _á!6°Y𢨅:n$j,º)rdÄøÎÎÐ3D/29_9vò ]"}ßøŒa#øÔKYM rJ•â©\*SSÛÝk“(3¿ d›¤õmíX'Ž‘}:§@…§=‚‘C­§“Èâù}'µé½“‡ããj°‡Òé9¡ª/+EÂVæl|¶$ò b­ üeé:{ÊÏDÓ¾o­Þ¿2®wº/Í3ôþÈ 2ߊwƒÙÃ;wfCTéºæ;->”y]'âë¼Õ»R©®^ÓúÍ&tT_÷šµçÖ]vPÂ7ßjSæi¦\I³ >‹Å¨ÇÌ]çþŠíQ²†ëfÙ´‰z!½eØz”æ8P…I‡„0ƒp¿JÔåHƒ¬Ä¼›"‘»90UÛ6hó"‰ž¢rïí=*¤L†ª"áiÚóú—Áfä(Ë6Y0¹Ýd…ë{d®hNúE‰0”'±„f„ÙäxíÇ_,“µÇ5 S85…6Óæò]áRæéY,NKœ¡æðŒœ¤E[ç È",„@§tËh|Â’|íÕ·KÞ‚„& òª±‡ÆWIâV¡RÑ[U–´Â!_Å€[ý»÷“Ü‚/Uð¥C¹ðfëOh³(j^5ãà;Ñ~à qxx†‡St­ƒqÞúþ8,F±ÜøAÈÐEðJß™"Do^† Þää¤áåXÍ83©a³µC;» bÐB<憅]Ûyœ†¢æäkyrEè $Çõpr¼ÐõdD5C‹£è(Ž0Yšºyܸdmæ;#ÇVŠ@ë5[]ïSy‚£ î9ŽÉt´¯N¦_ÓŒ²HN1wmXÔ馜Ö6z D|*q-!7BBw‘ s€g$вü"j•<²!? ² ¦có1›û õ±\ G‡£ÈÙ,×ÄH¦mÿq”Æçˆ˜Á!K›dê@JÈVÏÔFks\•©ÖEnÒuÆç&¯z;7OØJ$c }¶ÁS™Ö.ôéEð;` >éãÕ* >6èôª¦P1ÀÁ0Ü‚„+ßË€ Þñyª,°X‚Ò©+N÷™ä“È€öˆ=Ð4èøM™ÐV÷$æ:ÅCàöæH óAæ§ÔV pWksš‘€¯ä ž8¹sâ3ô ø¯vtÉ~*銺Ósop]%Ë_á¨NÙ*¡%ByÊÆMI]ቈæ„dE¿m‡«”ƒR'_¦H’`‚ªç ¿R…ÙµÏ ÉHŸV*l³<‚ UÆ@¯ÙÐúÈÖ/ ˜ÞÖ'dP$¸D`Ë¢yñ Ê´D¾Í„œ)én÷å};àëý¾Q̼Qª÷Ò§i¹ûá<5üûíï¡:÷}uj»éGgL½jOm{¾Ìùøð|åÛ[Ûœlß›ûSnÑŠ{ìc|~þ»Ÿ^;yo÷ßÇxe|g9’é©aÑʰìã··PÍu?~ÝIµ_a,×êÉk9l%Q¨aúŒS’Zâ$|ØžÐæ^€ÉGæ)UÜ —¼ Œë„¸‹©ºw1U¿Â]Œ©<Ê?]ñ¹Ëå)·hÅ=öqã.¦jW¸‹©¿ñŠÏ].O ‹V†eúÜÅeï³nmeYŠ„±4§ÀGÙTÎ6ËgÛµg{ÿ0ŒWÀ›žr‹VÜc÷gÝÚ³5裆nzjX´2,û(pàje6% EÝ>:±$Ø ž"o#!„Y$?´08|óü|×€Ýuõ’î:·Fw]ëÓÄñ  »ÓSnÑŠ{ìãNw]£»Î€> ¤»ÓSâ•aÙGºëzú1J0ñ3ÂûeR"PE}öjÅ 枥î"¼X߯lzYð“HÆU]˜‰’ 9ãhlVßÞà$D«s J#Á1²°ºÑ9ÒÙ-®IfP²‚íÂq¶ ôœjRnW{¤[Û×'Éõe#; Ñð6™H¿B>MÑp(‘tc²Y6T¢çžÞ +âno¥@¿$d§Íq2oˆc*ë1–Ÿ¾ßŽ„A=BÂ=™ý-›¥¯³Ú*agÄwµ;OzÊÉX9Xv4e,çn˜NÕ¥²FFÅ#9~ºw&q;€H6™€¨Ž­j yí x&ÎŽÅÜñ]{‚Õ¤8àë)S¢à嵋Ž{?–ˆ¦·‘F”£ãr¦‘!’—§Û rªz‘·€•\EÅ‘U½ŸO£k@Ð520Ï¥*½"vã {¸ˆÝ¾Oç8/%#ÉPÜ~.Ú À3¢¸XœbP9%dðë;표C.Ø‘¦$È”¨æGç(Mãµ±I§¨ü¸ÈBà ‚UÎK/Ò‘I[S/ ( MBÝ( „V)¸Ú*‘MIJ/k’+#Þ…àæAÚ&ÀËdÏÃëq?QY4_Ån„ÙÍ¡Œ,_!8‚_·Tµ2fãs‰xo%íXRIÜÏΗQã8Ú ¾~"†7ܹ•aÅ-žš°ÇT<Ö;–-²¢çb;T²¥A².“TI+ï³¢šŒ +R½míÚ=,¦H·ŒtT"Ë ‘½YxHÕ\ˆH¯uˈ‡­ d\Ø!‰´,]u §év°Æ§ûãRäb´„8¥¬ÍæîË#0´2ƒö4q ¯PbI”CÒk.b¿Ñ-ÿ^,Œ Ú¹K^yâ$ÛÑ¡Ë ¿˜‡2óÈ¡ š¶þ¾ö»ž¯Ä'Hö6ðñÁRÌ£ˆ ¨¯Î9³c‹ˆò$’#B¤:'»"ƒ=”õì9 fˆ/:–¶ìx#mŒ­Ñ¤Ã¶óñkÝK'8ŠÅW¸»ÃK(¾bÞ¡ø ŠÇàÁ õGìŽrL>$Bø†J†¾¬ÙTw×®¦ÅÃö ˜uº'?FJ(¨AUZÜ@' Õ” ‰ÎÉ#›ž¼N¶þÔŽ‹ØïH9#d¾# •U‘Àôr†Ëšæ4*Aˆ4xgûÙʼn¯TÎÖô€'°GãΙj4QbÀÙð…TäLÈ(˜]&+L«PjDK3³’²|'9ž5†GžRk-ݱ…˦©U–4¡s“fdôÔtGÔ¾²¢œ~xs¦“s?‚j‚¥U£ìQ}ÚºèjËž[+9¥êRœy„”¯’¶•´¥±<_ùöÖ6gcÛ÷æþ”[´âûŸŸÿî§×NÞÛ}ç÷1^ßYŽdzjX´2,ûøííã”öl?ïÙáîµ­QR²cºFùR‘P&Ä(uà ߧ}ÀùÖ0ˆè[héÏØ4ÔhÒ‚ÈF8ÿ©±•©Õ“†Ù®õgù•·ã)óv¨†ÈúR8A …?Ÿw¶U·àmÕ¯ðÎÖT_›®ø¼óò”[´âû¸ñζjWxg[5~ãŸw^ž­ Ë>ôygkîžœw"Òè~²ir;g¼‰:6·ÃÁ‡t‹ù]Ù¸·½Æ†„sÕ[œ0l­i´Iemüñâ·Gæ·ìÄ6KvbÛ5vb{ŸÔW;™žr‹VÜcwvbÝ;±5裆ìdzjX´2,û(ÀNêûÍIµÜ혧¬rº¢EÊÔJ˜-•ªåI–fà›',?R¾;\ÎÂL`°hö¼e¦/ÆvdÆ– –.lmšÎã µõÏ„Á|ò.Èú[D"6Q™7©Ð_åÚHϺ¸CJRóœüüœ/ުȃl’çC‹~¡ZGqi÷>ÃÑM…õ˜=.OãtõRãtnMãt­¯ ŽW€Æ9=å­¸Ç>î§³k§3 5Îé©aÑʰ죀Æéú¨øü$çn êÉdoذ;}ú(žã@^%2u‰¤½ èj9›Sµ…E¿6ÈÓ'8n7´1¢RMm}~ò\ùÌ`î^‡žhÉ(Òl+.>Ç+Ûp‚ÍujÞü0L8'}li\–2æ=áLmV¹»A·¿˜Ôš¥ÔÚ5%hÔ^<e¼” é)·hÅ=öqW‚ÚjM j¿ñ P‚š»ÚskeXöQ@ jï)×^J(7)MZ8þ7hÝ jäõ¦QÄâ® ;¢kÚÜùШv"¢hpšðͦöÈûvþÑlÈ"Ô@´Ì6+£Øs¥pÜcÞQ· !žY$QŽãܼˆn´™£t+°Ù£ŸEi¤dOŸÀ4ªs‘I›ñ”„—\¡ÄØ$L©UùÒܳ–ÚߢPÜçy9šú²¶,a%+[p”ÎΘ÷á<ªÔ-×¨Õ Ø&f%%¦_a°Û‘ ’ÕÏhÇx1_´h0<ØhzÉ€ ϲEp¿ùë‡ï—À‰!D6§çC…¤-&³hêAsõ¼w’ù-aód-&ä^.$§è"#å,¿ƒ¿7¬Åïu•¿×U0~ïò”[´âû¸[~‡Õø½Äï +ñ{Ã=~oXÄï åâ÷ºê®„"Á£Ö1Íð¹ ŒóÐásxˆZý •ÅÐ!áï̈hÓÜÍ?n+üÓÃ?0°kŒ6Y·ƒó÷F‚ø¬NÕ<§J†Ž™KѼ˔}®i¼¿|éâÙ2‰³uÐb…` Ô}éÌuÅA§`qâvÝŒŒè9þlˆª GIÄÔP,G`¬²G*ç²X™ö‰úÍ]Ê”i·¼ꛣeÆñÂêxi÷Y¡7ïíßdÍ•2æhI÷Y ÐO;×½'¨9Qd•ØÔñlãäŠý}ÿm¶·´§O'Ë÷Š/Ánv=ÅW§«`Χ¬=Á±(’Fw7c,‘‰UAM^Ô53bÐ0ܽÁ™SÍÔÝ0ΫŒšÎˆ'@]?”ýÇJdTÐbÕ•Èáæ bD¼xA€hЫfÝÖö¨!ú.¬±ÄˆµgñS*“!²MF3ÝÖ>SI§Jð.ÿ€Åq,,’LÍßžI›9CV û{B>ŠOËûÛtNݽòhý~'P~q.ª(l" ÞÄ/€!jAàÓøÒÙXÚÕ<¡wrf0‡»»8µ{sË7aûîñÂßÞ~Mrå‹zç¬=ž€s{xD:RÖÜõƒíùª\2 M;ÔQÉ@MÕôÙ½¿%÷g  Øpƒ §”a¼ÂŠDX¡¾S)Ëþ"“%ÀÒ„¨ABõ>Šogis§øܵîuòõå¨ö"ø‹1µ¯ •Þ™¸ö8C½!T-`ªC¡j>Þñßéû8i/fuš|û$›>H½¿ øjܣܞ&¬ãZfùÁ´W1íTWn9m{n×·ÙàΈRd»s·~|»•;×ÍP×g;¬šæÜ^×Í'÷kýôè;úÎutöl«zá]ž7ÁZk×Ý# Öžmô+_ø3öÎ|ê×îì;fºG{g^1Ê·Ïc»€Œ]7ýnÓ-¹ýZ}|åÐ}0“˜•}0—ŠX9 ø;õôÎôdá{?è™›‘À­9W]Ÿ=‚9leefç}FqJþ>¶ºÙß}?ÕÌ™ÐÌÞFoЭ‰¯%Ïä7§_ÞþÌò’ì endstream endobj 3677 0 obj 7485 endobj 3681 0 obj [209 /XYZ 32.1599999 577.939999 0] endobj 3682 0 obj [209 /XYZ 32.1599999 491.539999 0] endobj 3683 0 obj [209 /XYZ 32.1599999 491.539999 0] endobj 3684 0 obj [209 /XYZ 33.1199999 766.099999 0] endobj 3685 0 obj [209 /XYZ 32.1599999 768.019999 0] endobj 3686 0 obj [209 /XYZ 33.1199999 653.779999 0] endobj 3687 0 obj [209 /XYZ 33.1199999 576.019999 0] endobj 3688 0 obj [209 /XYZ 32.1599999 655.699999 0] endobj 3689 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 446.419999 88.7999999 454.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn2 >> endobj 3690 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 437.779999 151.199999 445.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn3 >> endobj 3691 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 429.139999 177.120000 436.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn4 >> endobj 3692 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 420.499999 222.239999 428.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn5 >> endobj 3693 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 411.859999 131.039999 419.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn6 >> endobj 3694 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 403.219999 162.719999 410.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn7 >> endobj 3695 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 394.579999 158.879999 402.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn8 >> endobj 3696 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 385.939999 145.439999 393.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn9 >> endobj 3697 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 377.299999 177.120000 384.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn10 >> endobj 3698 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 368.659999 162.719999 376.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn11 >> endobj 3699 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 360.019999 230.879999 367.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn12 >> endobj 3700 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 351.379999 156 359.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn13 >> endobj 3701 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 342.739999 122.400000 350.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn14 >> endobj 3702 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 334.099999 141.599999 341.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn15 >> endobj 3703 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 325.459999 132.959999 333.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn16 >> endobj 3704 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 316.819999 132 324.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn17 >> endobj 3705 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 308.179999 145.439999 315.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn18 >> endobj 3706 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 299.539999 124.319999 307.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn19 >> endobj 3707 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 290.899999 228 298.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn20 >> endobj 3708 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 282.259999 196.319999 289.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn21 >> endobj 3709 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 273.619999 193.439999 281.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn22 >> endobj 3710 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 264.979999 226.079999 272.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn23 >> endobj 3711 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 256.339999 314.399999 264.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn24 >> endobj 3712 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 247.699999 134.879999 255.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn25 >> endobj 3713 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 239.060000 256.799999 246.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn26 >> endobj 3714 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 230.420000 232.799999 238.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn27 >> endobj 3715 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 221.779999 230.879999 229.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn28 >> endobj 3716 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 213.139999 213.599999 220.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn29 >> endobj 3717 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 204.499999 235.679999 212.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn30 >> endobj 3718 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 195.859999 241.439999 203.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn31 >> endobj 3719 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 187.219999 127.199999 194.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn32 >> endobj 3720 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 178.579999 153.120000 186.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn33 >> endobj 3721 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 169.939999 202.079999 177.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn34 >> endobj 3722 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 161.300000 100.319999 168.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn35 >> endobj 3723 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 152.660000 219.359999 160.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn36 >> endobj 3724 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 144.019999 176.159999 151.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn37 >> endobj 3725 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 135.379999 183.839999 143.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn38 >> endobj 3726 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 126.739999 192.479999 134.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn39 >> endobj 3727 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 118.099999 206.879999 125.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn40 >> endobj 3728 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 109.459999 180.959999 117.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn41 >> endobj 3729 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 100.819999 188.639999 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn42 >> endobj 3730 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 92.1800000 198.239999 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn43 >> endobj 3731 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 83.5400000 203.039999 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn44 >> endobj 3732 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 74.8999999 207.839999 82.5799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn45 >> endobj 3733 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 66.2599999 235.679999 73.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn46 >> endobj 3734 0 obj << /Type /Annot /Subtype /Link /Rect [170.399999 543.379999 246.239999 551.059999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://samba.org/~tridge/) >> >> endobj 3735 0 obj << /Type /Annot /Subtype /Link /Rect [442.079999 527.060000 537.120000 534.740000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 3680 0 obj << /Type /Page /Parent 2 0 R /Contents 3736 0 R /Resources 3738 0 R /Annots 3739 0 R /MediaBox [0 0 595 842] >> endobj 3738 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3739 0 obj [ 3689 0 R 3690 0 R 3691 0 R 3692 0 R 3693 0 R 3694 0 R 3695 0 R 3696 0 R 3697 0 R 3698 0 R 3699 0 R 3700 0 R 3701 0 R 3702 0 R 3703 0 R 3704 0 R 3705 0 R 3706 0 R 3707 0 R 3708 0 R 3709 0 R 3710 0 R 3711 0 R 3712 0 R 3713 0 R 3714 0 R 3715 0 R 3716 0 R 3717 0 R 3718 0 R 3719 0 R 3720 0 R 3721 0 R 3722 0 R 3723 0 R 3724 0 R 3725 0 R 3726 0 R 3727 0 R 3728 0 R 3729 0 R 3730 0 R 3731 0 R 3732 0 R 3733 0 R 3734 0 R 3735 0 R ] endobj 3736 0 obj << /Length 3737 0 R /Filter /FlateDecode >> stream xœí]ͯä8n¿¿¿¢Î l¾?€ ÀtOw€4¦‚‚ÞÝ éEf÷?VÙ–%Q´%Y¶«ÞÌk ß+–LÚ2E‘?QÔÿòóÝþû·>þü¿·oÓï?¿‘;Qdü¹¹ ÌÜ9ÿÔFÞ™u?·oßß~½ýúöåíËðÿ¯oT=.œ~ _Î"F†ÿøö··Fáo#åçÿ6üõ7vû×áÓ_oÿñŸÃ¯?Mü\ƒïoÆ*÷ÇÿŒPF™>„¹/yû÷?Üþ6Ü‚yðuÿÿ‘I.´d»îãW)}ü /Å„‘§Êq£” ÷)‡îøûŸßþ2pó·q7júAÿ.‘dœ$Kå ‰ˆá棩°gˆá”¢b$¡ƒh#п‹Å.NC#Ïã$ÖctøÉˆù²=ª+o`ó,óì&npÜC“±ÚGr,ÓGÅ\†N FG÷YzM½0߇º…w¥kûó3v½‘Œuéú”ÑU]?Ü¿…wÅŸµë÷k}î^Ðïv|=t»ïè û±/­ñ“ñ;út|ÿ×8†lq ×^Ú‡¯o?|¶Î þú—a{xÒ㯯ßßÄðÁy‡ÒܾþéöOƒ;ýã?ß¾þõMÞµ¡L>\ïé›o„'°±)¥w)”Ñ2hú e¢ߘ… F®wÁ$lÊßè;±ãWøŽ6E¿¡8{ô¦Ó»/¿Gö©üÚ†›¦$eougÔ$ì+:¶‡6¬ô4èÏm @¥ÀSà\7¯¥¢üµáb×=z#Q17@Ç·Åæ¶+]‚æ EBµ‘ÚòÞ£i 8`Ê{0cªxœl¾úO_‡ùî k/yjîqË : Uø Q¥ºÁÜã X>œmî+Œ^òþæÍp‹ª°qÔ´¿é•‰¶|ÕÈÛa|ðW°K×ñA¼+æ·ÝÆ•—ÔtþΟõu8­XBÓi퟊ÇÕ ÿ†ÿ„v.þÊð9·:¸bƒÉ°Â+«0Cø­áºCãé‡^ZdnLä´ˆŽJd‰šENS[”Ǥ”é>ÕrŸð".²ÉEÓüJõÜ›©nXØÍìóx¸+© ¿™´“.’ùL2l+ÖvÒ›".d2¼üÎG5À»eåAðÛušxÍxûŒÝ• *êäTðÊó4°ŸT7ó+o—ƒ7Uñîðûg®ù }æŸF|ÈJ/RM]¦ÚwGpûšä5:n+Œ4°•è½âSýŠÐbò+\{|²ké¶=(îÜàÀb6» ½i®1nq¦áºÈã»f÷±óÚ:öÅõ§‰Ë_ Ü "©dNxø}E^ƒYŸ–^.Y²¡0—GÙG²Œ¶w'òûüÙ»1䦴û¥)Sj »)u­™)ßÞ”¼Sj™1Ô·ÊÚOŸ»ì–\­u*c  ×ÄwâZÙˆ‹eüòöáiž™œ#^HñV‚®Šiµe©­e e5ns~]¹“ík'ç—Ü•¦Ñ“ ž6-ï5øBñ[¬ÐŠòU\ ûÐÅ/ë³htõªî5¯ÜZ‹Ïßc-BˆžÞP V1î`uìZõRÀ‘e鼂¾ú©¯÷Ò pÜ_´«œ‰~%&z íZ‰ˆ‹eL&zø, ‰¨È੉[Ùˆ‹eœ`¢Yª<‰®ðáÔ¹Âioq¢ûZä–ø¿Á¾ïI Úžk«ÿˆ¾Œ–<-¼+Z’ÒM/sÇylî¸È™;®RS4P€¹s­DÄE„2¼¹ã,gî82(4w®•¸ØXÆ æŽd ?¹;È#ÝŒF3Nì3'\·tNÜVžeҔ勤`w°z’ÆVO²œÕ“"µHX=×JD\D(Ã[=IrVOØTÆ@VOx;7s±±Œ¬žTÛCái4ÿ«÷ Ï÷t1YQR÷Ž…ðÇ,Â8W,ãʇƒ%iWÀy»K†[Ë›òŸ]kv8¢ÿ!}[ŒYæ\1DëÀ…?IL±¹oZ`î²r_°uY!Z…ÊŠí ]2ŸfJªÈ„XÀvïH5©Pð†kzâ÷böOÊ1ê¦Ù':­Èi¢l èL®á@e©—®A®áØJD\D(ÃG*“k8Pu*C\ñ•¸ØXÆ ‘€~©\ÃC"ops©É¹~ó‹ç#àv¸Â?­0»-fiÛµ<$ò©Ù ûÞƒÀŠ´Žý—;L&FÇ“‰É¦wXÞa3éÖOÆ„“‰Ññdb2éU¦2 Hï[Ùˆ‹eœ0™ØWJïXÁBß_¾%½ŠÐ¤âæ71{`þAÊr—©ê´\ß®Õ6ð›°[V;+^ô—#VJßo¯©ðÐi¿½Uìï®Øß²krlà~øÃ÷PkêÓË+öP×h ×£ÈT`,É[q ËCŠ>‰Ì=wQÔT;Ût»LP]ãßvQ ¼ç{ÀP>,Z6†£bñæ¤bE‡8 çÌÑûcFã!Fs BŒ¦ BŽ’Æ4V"â"BsLÃh.AˆÑ4AÈQÒ˜æÑÊF\l,ãø˜fЩyV;¶Š¬ÚPQ‰=-IÃïønûé-»SÊWŽÙëöâ8ÑÓD3Wogê`ÍyœøÄx.ñ‰ñ4ñÉQ€5çsâ“ç"BÞšó\âciâ“£kμýæaâÓ"ãkÎ}ñµ9„Öµ7_yí뛞Ÿ2¬¯-,5»Ý_ÉÌ÷X¨hÞèßu+ý1UX+vyãûÛÑú™{6‘w.:V^p÷}¥å]PA201œ´,°üÿ˜2kØ×؇—´«}ÇHÄy øÈ9F2ÍqàÉ9Äs¡ ï‰\iˆ£ÇHÌy ž‹eœàɼeãDcîÆU¸¾SSËܹ©9ò£!G±Ë*Ô1žÑ¡ §E2À =»*é9x`ßS Žq{ʽ֚*³{ö‹UX{<Iñ¯š­IÕÎêñˌܗ¶èµÌ/õ«ÑbËS§\f°@¸R~/FÝ­ZúÆ¢"¯´S©iïÄo¥J"°NÛ·èo›ç†èp¥ƒËÑù&”p»,Ù~ ðµ)ðµiÙȦå#›Y m8äTÌJS ÛLS¼þÍŠ¯Ô°Q.•n¥Ç7­c-ŸON\gS_d NÖôéîý¬C±8ЩØCÃæNWÓ9 DG\‚yé  m,+¨}Á¦µß缕4©¢ÂËóÖ²êÔ‚_¿ÓóH[FjÚÔ€ ßºÂš§–ã Ôá#V›Ï*"i ›(~5ÅOTÎw½|ƒoþPì6ø·+wÔ°†ÓtL]K•P Zc]^ VÏãïÚ GͶÊT¬ÿA Ù^¤é2¾*ޝë:ɵLe`î®0q‡Ô~ß³RØeFÅÐ<…®)È·gWÄ;E®”Ý­ì[Aâp·JH›Úô†·òÔ-i'åÈ\å#Õ¤à”ߨØQ³?¡åÒ›ÃÎ.ßÞ% ZÉ«9û•wYL½:…ªILÃlµ}ÈP“ñ.2ëgÏFñÄà¿ð¼rlFÃ7s<Ö.œ„^Ÿ5ÆÁãThÐÊ=êØ×Aqm§Áž3¿é0}‡”K€í14ô¥*Éô(%ÖÎ^îY¤"Ða{µµKÑc<Ô=ó2ßðb—vÅû­ˆÈº¯Ëv¢•l¿=õ#z”^Æwh4±¯x=`ïšÚ-FO”æ=ÏN&3ÎÊ„Ýw! Œ›k¹+#íò)á§ÿÂ’ }·7‚ÇAÏpeuÑQuPPŸÉj°ŽYUì;KœmÆ+–_Zs« r—dWβ!ôhxOa™bÄ ›Ô¦ ·)Òwm³g©&¸ Iò¸ÎØÝLÌ#8õpO“s“¹ú ½¹”í”~ËøŽ/hMÆÖ£ßq-Š;#ñ“ÒÏàö?bmçá¾Òý“g’¹íÌÅco02€W¾\ðÞ†}:¾oFï\ÄøóäæúÔb:ÂöWÎЈ[ 1EÜógùØ ¤i¸‘G }Ó$Üî#Çí>6ÜähÊ„\æObÞR4}æÓf øjd¸mKé ­xÈ%~ŽiKÑéœxØ)l<„r›Zœöc­ °—Ç>/)É ½0ò²ªHTÈG{Åf3?”€ >½Á‘* ›ÞóLù6\D'mXZ‘˜ Ÿ+&ÂãÂ[Ê€1ãEñ͸V2f#c1¿$ÈÓêD§”J©ôìUl&þB×£ NYrÛÖZ:&¾Je&­c1¡Xm IÔÖМÚžê“áPm­H̆„bµÕ6§¶Ú¤b´jûh%c62s©Ú¹@ÔÔèr@Ô68ØËì‰êÐê‚’ÂEcͨi¨ðyP¨º±fM2֬͌5Eh2%kc+³!¡˜e¬YkV¥cÍ*8Ö­dÌFÆb®kŠðm£Ú%‚lIFëºrÜ%‹÷úƒ5ÁtÅ‚MÅ"î¶u«H;Ä?f‹ÂiY¥ÑTd°‘!¡tE ÝUQ覨΄nÊ…HQXå(ièæhÊ„\æO* Ý•™ÐMQdº=ZñKü׆nŠÑm·µeÉj»èHO#¹âTôX·L 4²ÒÝncdªØX2*CB©Û¡¸ˆÝÅeÎíà:u;¸†nÇ£‰ÙPŒw;ç·CqÄ0àvŒ­dÌFÆb.u;øŒtT쑨8-ð¬4ä§ëå˜Y6YeQà(™8Jæ%SÇQÀ0‘ÀYØPÌ2LdÀQ2p 霅ŒÅ\:L¤Þ&5kP-ë-`Îx¾QÑžAP><¤Š4 ÅÃC'@‘Ò9 Hé(r0<´Š6$³ •Š”J"GÃCy ha#c1—-7‡ÇÊÀÁÞß„FëÙÿgó;­ƒc”Iàe²pŒpŒÍÀ1ÖÃ1 ŠY4ÚäàeR8ÆQ€FÇ,ld,æR¶3³’¹°é§¬ìùÐC·¾bŸIEŒ¾§âÀg´÷𸅠<ÑÚÁg瘂SJŸ&*|šèÌàÓÄ&£ÂQÒÁ7¶"1ŠñƒO™|š F€Á7¶’1‹¹rð¹Û<' þ}¼TŽMYÌ„âñÂ’ ^³\¯YÄ; /Ìñ ŠYÆ Ëñš¥A¼£€ñÂ|¿°‘±˜KÇ ›ƒxÜ?ª©®ÞcS:,õ¸£¼sß3…v¡ÕT£ì²¥¿aÙ35ˆ+Ü[Êb•¿é£OnؽӷÊ9¯5š|9c!¡ØhŠÒÑ"éh‘B:ŽŒ¦ðΆ„b£)rŽ)¤ã(Àh é,ld,æR£)fHg%:UmÁT»½<ð=àÔÂ#8J‡„Ý+iZÍãlþL3+iZñd•ËQÒ•4GS&ä2š—é³´™•4-M*C°’öhÅC.ñs\»’¦•|åëìQŸœ)_º‚¦•5Çú‘3¡xÑ R¤u)Ò&EŠÌ#Æ#E ŠYæCІÛOÅhˆ­dÌFÆb.GÌ6RÔTĬÁeéRø¼_΄6s¬çN/ ÅújSpÅfÁ À›Wì®Ø\±)¸b³àŠàŠÍ€+vWl ®ØgW ñ åIODUê !KÖ ¥:hhXš, M GIuplEb6$ãuÐÐ`1̲@ ,ÆV2f#c1—ê  úS½Í|ÆðµV+™_ä§:$k%O"BÃs¡áiDè(@+¹6$³h%ÏE„†§¡£­ä>"\ØÈXÌ¥ZÉý. ü$]à€‚r~-3zßôËsÉ ÷ÁÜü*ë–ãL–ãÌ-Ç™.Ç; Pdé—ã6$³(²È-Ç‘.Ç; Pdá—ã62s©"Ë9r[9Ÿ7¢ ÊëÄÖê‘ô‹àóë­ mŒJB£r¡Ñihã(@´m6$³è‘Ê…6F¥¡£=R>´YØÈXÌ¥z¤ýžÔUlªlÑõ˜´ËNÓÂ7Ì5HQs¨ï–s|zW¬T#ªØ³ØóÜ4!Pó*o—ŸÁIIížä˜\!+-¢öhDØ“2úX~0FÜäðïï~ûpþé:l¬Ñ`ìvŠoåÃ1û•aÙ㸪çÁ5‘c Ÿaãeç‚Kö+˜%ìz³Ä^­`[ùjê u=K­•Ù ‹uÏÒÙëç£Ã3:è#O {l%éøJ\%”qÒ*xÁÇruÙ!Ù²ç®é¸70Ã_ä¯ìʘ:{¯Ki$5-f¼ßÀCB‡¡ÅÍ -±½, ŒiÁI7 ßÁ›©Hì)?w½i“Hƒ â£r»ož9§¢ÖÝt&¬½F9{Zl曚cé_*®Ø„¿ßk-7^b†ä¸Ëz&Ì0P»âÅv¥O™Á“¶xá…*Óa]³¹eê[òþ†~¶*÷B·p=+\ÏÊ®gUŠë9JŠë­H̆„b<®ge׳2Åõ%ÅõÆV2f#c1WâzVù”üà–£fÊOéé\ö¶m¶Ê'&0:øHú °k<¶ò|Å¿O*3s:¸óBµjŽ)¤ÛTæ…É쳘GZ‡„ÆÄ>Žf=ކÂY]^cSuÌÄ ._¼“YpOIªËò¹Rvz-¥ÃÜ WøM*$z²†Ð8eg dRvj’²ó $žìÔŠÄlH(födB&eg  ¤ìL­dÌFÆb.ôd‡»Ð›cxO T1ÉâsêöfïÅ¡Fd» NZš‡`×6î· &Vw{ŒšVÆ?ðññ#þñ„Ý.‹!ìzŒØ¾]¸.¸_±\ѵ@fÅ.ÉŠ“žñ‰¶¥./*§jßY•ÏÚÜ׺5:$ÏÚÂ$³¶ÈàO†HšN§àOS+³!¡˜eÖüi ªTŒøÓÔJÆld,æÒY[ÎøÓk{¥.; ÔÊÑŸø‘Q}Ï‹kÉ©îz|ÖžswVV›ñ'iå¸ZtÄÓÊ=é³Ó8 ÅvU©Ä®ªÌÖ®jSƒ§ÀÖ®©‰ÙPÌbWUfk×@@ ØÚ5µ’1‹¹Ô®ê‚º9=p˦°a²øÒ‰z}3WÞ׋}ßSh¹5ÕBžì‰®Ú¤hˆ‰55™MŠU§f΀MŠS+³!¡˜ÅššÌ&ÅÊ€°Iqj%c62s©55ÇlRlºX™Úˆßú ‡D‡„R £$A/)É¡—”¤è¥£¤6¶"1ŠñFI½¤$E/)èåØJÆld,æJ £dF/NZÂ÷3r X y[ÏyÎÍнK¡Šuž‘DçYfoâ@å©22°7qjEb6$³è<ÍìM4®hL"†‚½‰S+³‘±˜Kužù4«–à±G† H¢.È€,/®¶¶HeR€—W”ú¸¨ÓZ’ãV2Z¢öS÷6Ìf‡yÈQ±°·¾•¡~³õüÙÂúVf°qí©%©oõ )r™?ÍáüYÃúVU¥2¸Jë[­xÈ%~ŽKë[ =°·kí°V‡ì«*D ÏäãICBñ”'X†Ê,Ce Ë8 ˜ò¤‡e6$³Ly2ËP™Â2ަ<éa™…ŒÅ\:婆Š;»Ž"{'I |EÆKŲԎÓ!ÞŽðl"”O“þœanMHØ¿MõõisÃMl§Í­œ-pNâÀŽ9ªx –ú“y9±!¡Ã‹¶×ïõ4®ã8‹HXIýyG*àŒåL†„ý*ÀÈ䛸í6Í=úöÁ”‘W*T½µaþdL.xH(õfK’7Ë%o0ž&o8JêÍŽ­H̆„b¼7ËX.yƒ±4yÃQRovl%c62s¥7ËøvQ ®ÞìKœxû,NlÓáçåõd¯_™=þ@®AÃý™@š…„³•¸~w˜a’nkËoÛgeþ Mþ¨ë T@=Ap”ÝTß½YL9ü ’œËÐA9Ì4ÌlvÚršãïp½ªù£¹”!¡ƒªÙ'œ8‘›vh¥ˆ¾ÍW›ß•°V 9Y´dHد„|Pë•ñ“•°¥ ÝJ)_\Ny©ºVO¶¸ë2$”¢œ'k^œçÖ¼8O×¼%E ÆV$fCB1%¼‡ JÀyºæå()J0¶’1‹¹%àÂÇx¼m”Yñ<˜—еê&>¢ð•Üvà u›ù+9åG=ÂtÛ £b³Ä©Õ¦Ž®ŽtîÂþJp à<$8+÷åíËí×aÐcòÁküõí{ÑìL Ì/‰¨¸tí‡åp·±ÜRuM'"pJÝU¾šw )ã$Êô]§š9*„Î|3êçwf³Ç|KyWãkM52'Ç ×XôšÑLhvg„»¯R3‘ã6j|Hù m;YÌ~Æ®™nîŠ=Ç4ê®™ÞXͳO÷öA;´Îýͤ¯#0•œ<[¯+ÜtW A5~r½“ñ«’o~ÄÆ—Øà×°Ø5ÓDUÅmÅ ý¶ò¤øóhÌRpŠŽ#ôVž´AýŒö®èoyÛøó0ŽêÞŸ6ô`ïüfu§.ÔJ»D‡':pÉûKÏ9÷öåíÿÓ7‘š endstream endobj 3737 0 obj 6695 endobj 3741 0 obj [210 /XYZ 32.1599999 554.899999 0] endobj 3742 0 obj [210 /XYZ 40.7999999 528.019999 0] endobj 3743 0 obj [210 /XYZ 33.1199999 552.980000 0] endobj 3744 0 obj [210 /XYZ 40.7999999 528.019999 0] endobj 3745 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 777.620000 159.840000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn47 >> endobj 3746 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 229.919999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn48 >> endobj 3747 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 220.319999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn49 >> endobj 3748 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 751.700000 205.919999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn50 >> endobj 3749 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 743.060000 213.599999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn51 >> endobj 3750 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 734.419999 261.599999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn52 >> endobj 3751 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 223.199999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn53 >> endobj 3752 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 276 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn54 >> endobj 3740 0 obj << /Type /Page /Parent 2 0 R /Contents 3753 0 R /Resources 3755 0 R /Annots 3756 0 R /MediaBox [0 0 595 842] >> endobj 3755 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3756 0 obj [ 3745 0 R 3746 0 R 3747 0 R 3748 0 R 3749 0 R 3750 0 R 3751 0 R 3752 0 R ] endobj 3753 0 obj << /Length 3754 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯èón‹‹$ øy C€ ääx2 âAœ9äïGj±7²‹d‹”Ô¯mÀïY Å¥Ö¯ŠÅ·úüý¿~ß¿}ÿù?û¯öçûÏ»æÐtÍüg?ý}s}Ašƒ’ó¯½ir˜þì¿~Û}ßßý¸ûqü÷ûNtÇíñæésƒ¿ým÷vþøn¾òùý_Æßþ·—û?ÿûuÿ·¿?~²íM|Û™¡›~ù÷ü‹Bšñ?׿M7Ùýõ‡ýoc̱Ýéß7²Õ1yýø~~Uÿ^¿ }¬Ù+aÔÔY!ÇÚq:þûÏÝÏÓ¨²:(¯;(÷zïwÒú ;Ù·¢[”§îá[B4wÊgs§´ã<}©Û_·ÿó2ÓgZ)Y¦Ïm¨Üô_Rûëïªå¦/Ÿúî-B‘¹æîöãÔ §o.2o¿­œòÆ?— ´ÿcŸÃƒéìð÷dš2}; ïFß™áà…è;Ý7Éú —c›ƒÕåÐw£>ÈX6§©Ü†TÛð44õHä mœî>Üyêu#ŽÃì»ÜqžZÊž0=6ÂÓP3ÍEÎÈN¶t0Z Õ¯Lk0ÍkŒï•ýƒèo+ûãÀµÉfƒSS™s8Yµ†g1¦‰¼¡VÃk*O4 ߸íÕl§‡¶™ mûÿ~\ï±Ý^L?z!Ì|UîÇ­u앯»ñe!iŒ8]ëÌu+ööãóöÿfzmï¼Ýõî7Æ+_wNO¦§Ôu+·ãø:º/?Ü̉ðæDÜüò2'ß/¾|Ù½ý4LÎÍ—ŸÇ[Óoæ_Fµ¡÷oŽãÖû/?íÿ0àÝ÷_~ݵ£×d„l.Õ|GtÇ;æ|¡‘Ç ý¡Tß6W6½û¨>^Ð=?yõh Ý‘Ôø@—>‚­½Ÿ[»\øp¼ šC׋Q¥^=êM;PaÒ' î<[ãƒ'V4±ñ5 ìa‰ãóÙÌóùñË(G.pG*Œ„|¤ãÖJ9šBW&‹-(U„žŸ7½mà|Á%‚Ðʲóñê0]‘–éOW¾Ž/ +.O5·Í4ן™Þ°º£Pp0­û™ñÊôÒMgŽOµ·Í´·ŸùűXkÈÑv³pdœ³`òI^ÀÌ@¡E•µK‹ž ˜‰³;Èã`®e×'·11\ž>|yô£û—)Döì€ß×ôûï‚Ó)½wá5q[ î+8`1DG‘®®|)÷&ܸ²‰¯ZãrbÇ#7*+á´l®/¤ŠHÝ´·"R7Ý©GãôVvMW\9?ÕÜ6Ó\æ,"u£ïˆHÝ(ï3Ê‘óSím3ííg–‘Zœ–SÍë;ú®ínèIyòˆÀ&µ$#ØØ£Z‘êøØdzš“k5'­°ÔBœ„e#®/¤"€wš–B[’bߎG7ù¥ºÜ‘ÒÌrgüùäØ ql Ó^O\îƒ .{'ÎÝÉæ¾¨¾¹¾ÀÀjX[èîÉÁ¥½ ÂzYç0Ûô “Ýûë ÜÖö+à¶î >Î33éXÝÝâ ¹Ì9HV}½¤ÀëCS¼-.ð`?®†|’?ÝÉá×Vþt8PU÷¨ªû{ ª6.¨:]ñƒ+ˆ ¿UOŸ¹ ý=PU÷.¨:]ñƒþ ª^šio?³(b`Π*«ÐÄà„œˆÇã>ãzÞ$B.¹Éwà¤ÅáÐW'ç7iF[KGÌ2mn.$ ÀÁ…L‡»éàA¦ÃÈt¸@¦Ã-d:¸ép2<Èt¸™Èt¸…L‡5@¦Sìr‚!kHõá€Qö|‰Ä gp×Ù0ÕâÐÜ¢ÇÍ칈öÔ·}Âô½€B’Óðó§^%Dx ñ¨ëÕÞ¥"x…AzÁ€7tÃ=Y¶Í ‚¹WNŸÏ§9|þÔ»¯Dï:Döm7åË;T‡ÙÒc“N£F=’c{+Ô<Ñw"u~Tœ©K÷F½ïÀ*Âp&<0±Ã=™×ƒ(]ZJóêyBåaî±³0ÀééO7zä-1EhÄ=6Xæºïªš½hž=†HÉÈ:„á¯@FIòxWAŽ:/î 8FIÞ)Wˆ?©– ‘–.HF6"M€2õ°©¬©…| þp|ña+ ïQH˜1[ çÆ”IáÔ8e2$_J(¯Ì  @r¬£ÈŒ/ÓªA!< 3,Ì>A‚HK瞨”(i=X°—qšOOt ПGC,ΔÇÓ°èH§?|ã}:Déás0„`‚û û¦¼ðüŒDw !r7—²!x,×8õWSª“ެ èOH»,@0Òí ¿gˆ¼Ñ`4h‘³•†‚\Q¼BÄ$®—¸k>Ü;0”\=Øvð²†^*Y]sJ•sï’Ò 8¬>DDÒwLÖÇéE8¯ŒÁ•ã¸Ç…î¦Ê qϵ}÷äÐ.ð÷`9é­R”€à¾®v“¼°EbãˆpLv k,’ØL±É}ZÑЇa* ð8º„®båàëâºP«Ø”Š-Æ!ÜŒOÏ'ÄzIØå;àlÅDꜵZ˜C˜,k–}ù)vE!éÞõàädŠ|€†šz~~çÅŠæF¸;ØÁ;¬ðŒ•ü<©Á9æÝ›¹”dCXL¼ OâÅU%MÉàM'³ø(0˳Ò+ŽŠ Òe .WFà{.¶×¶°lÅð0U)‰·Ê‘FˆäPDÎÉVÌ0yÀÛ:î5fÆì›þ E¹ˆ§ˆSzìx1˜-gÓbÕH¼.Ýt÷,ÁU: ¹­°£‘«JÀþú娞™Ï7Ò\Xá£2á‰5»ËE"QµÉKF*¸”ZFׇ×]ãݘ‘C¹%{oƒ5϶Ÿ#uçðI{#¸>n»ƒs›ð²1¢ÂÁâ 4ë1*6mM#à¥"SR:G 1>XlYÍ… JêN·Ž¤†cÊÕ`iå ˜ÆòCº£Û9ª!Y¯Þ¨™ J}«ºV)f %ŸÆÁ ë~¸µqC2••·ª«ü" ¡^bl q—`|r@€Ðˆº€•v >DâRíŒÎèžä+~–#€ã8Zƪf}s‰eí3–MÊy’¶îÂæ¤ra¶r"Ä%}‚/WÈ®•Ž(´qñ.'p%A/!›aC†×¦0ÓŒ:F¥k«. û¢ñŽ, QÛ:(Sý0ËD]K:hAM4(WmI”RÜNX ˜”¼Ó˜­àwçjÞZRÒJ(Ö eœµÁóÚxGéLøœ8I¥@ 1áã¹øéÄìG”¬Dd‚°a´GZ´ìƒpäU­ÄRÚÅá‰Û¥JbpÕN 7Ç#|ê©&lWä@Å(ú”]Á‘¼‘ã8=²DÃI€å8þqü"cÏäZ³"Ñæj$†=s¶Aä íe6„¤›m<%aQ ¢¼ÏÚ ‰g%«Çƒé9ÅÖ€ÔëYw"ê&Ÿ%R ñW—%d§ë j…%¸hpe„€°.26&—É»âÙ žƒL¯M/ó$~!2Ö}±_$¢Nå—’)Áž ˆRBª‰¿sa,\‘2$ãàce¢›Ã1__lÓ Õ¶÷•-žPÞŠRŒRP‚¢ú*#äqëƒ2>ÏtŠƒ¯,UP¢«TÁIV0 ÖFáãËñaǧǑŸèç±è§Bz- ‰#á«2eD "n(Dš×W-gIõÃCËç £:ªoâa=„: CB:e•ü>³ò †z·¸lk±üH)ª¥-¶ j¼²¶Ï&<ºwU´¨®t¥|:T©%8§ˆdmxaé¤<ø€rŽâ<ØCPÁAÕ&> ¿å1÷V¯|]&´Ž(M¯=…*r*.½Q¸Ú.ôÞœÃÈDžýÌeÂs•Ž Ä„Ö8ê ~ÂpZOÖÚ¦ÌùÊ… jŸ_þ<¿´ð¨ùˆÎü‹+»Îæ±§Ê"µ”ü¼œe*y#ê€EõM ƒƒb,yË—sŠøÓ &X2 èMM,âMLHöÉ»»J@¦ue>"9]×c@`ɶ-ÙW 9Sïsúþ*ŒŠm»+ï°š&G¯Öª7ÃðxXœ#ÍnñÍF…±¿Bb½h NˆKn#è•ÃN$Ôv(ÇXRd7Gæ}hD9GÔÛ·@±æËF„˜óX¢¬€,2a®eX˜-~Å3­h^uÉ Ãàj§¸=_€ëº+%¼§ˆ'˜[ü™>ÃE6‹"öÏò%Ê*Ücááìd_t¡Ï𬎣dÜ*8¥Â€cö”lN‰3ÄVÊth‚ÂX¦XÁ¥Z;kùRÖ_íˆWÞth(+2ÏZ©$J˜"uÑÓ sP©ו’…É’û\d×FÙ¨¦AI@ÈÇÔJº:M宅ÐñQC§P äÊ)µ¬Â"±n? \´ÄEíò%šýtÀñ{h.¿iºSQha—T^Ögp¯XÎí.ýô^²Å$/Èyø¢sWæê%+І;BJYš´iûMNþ«>:@nk,“'†»ðúœd3u;ÃḌ7ü7@wš“é[çÜézÇVßê0#WïœÁwÚ­üÂÝQVHwóEàOøñX—øNkV”Ž«éYãʃ2tiåcÝÊ¡=DO0u†=«+jÜêù y0v.Sl„V¢ÔC@”Ù©S™Eƒ& `øåÃìKáØÍ“SQªÐvÄ"&ù6Kî1ÐÏj v–ÆZ8ÒøÁ g{øøO‘`DVA¿ø¢ :‚ù¦‡V làr+`úÀ4ZÛöއÊêeÆ·;<¦¯ž`Ðd䉳ä«Â£:_t—vëý,Ñ—2»È¶"D1BÌ xT•î2aêt³è…Zõw€0eŸ¶‹o÷é n©fø$±ÃÝ­·ÄFÂŒtö.»Š[ŽT q× âÒt¿Qü¿gÞ-ž©×.tºT6µÿQHl¡#ÛjÕ”Æ ;õa1 ‘ÛDz?¼p¢¸WII`¥¨P8¹Ú›ÇJÅ£3ÌûÚBv}»·”‹ÿ(ò±: J™TF á”ÇßqÕJN²EF½Wž*‹ý©tBLíøaÖjQ2Ï(.º7t‹gÕÓì8ÁŸuÇhí €K• \¬"é8ØâZdžYÊ9Áä©Pl.Öm‡˜p Lq9G)У‚«+ÄWFx='§Ÿç\aŽˆ#æd—œ µJ‹GX²Ø GäYK!&D}½b¹Q!r@)bˆÐ«•ì`/Q:îm()ááBU$E‡7 ®V)WpÁ”Q¦4&ï±"…]üÍ$£0íÜâ(ÄRëàÉôD ÌYxE5(µËy9õ©ü↠î<¤ÒåŸËT!Âd¸®)²3˜tMñÄ/øEG¿ístOŽ“øêÒ³ XQ D•H¦>Öĺ×#¹¢œ±4Ïèv ôÿDÔ6Œ¨™NGgñõ jcF jEÓ± R{-x„ÏÆ¿ûï#CÌ2=`|ýà0Ÿ5› kþdÎà«Q®6Ý^ŒÃ¸{&¼èÇ<нjNŒmÁ¹®;t÷Ë\ ú0ÏÌÕ™ydèï—QêïÜ™“T•:ÈánÉͶ=tsZìåN~Ç€ï à;3Q÷ò 5ݺÜy[›‰úúÊðY[äÎ?AïXsêÞÚS¸wìŠaÆnûvd€ ª›~—­p ü{ß{‡§¸5˜,cß¡øÀÌzt˜QÿÙ÷,3iŒÐ1KãLi vÛ&‘÷Ð+Ý%ÛþÇÝÿáOu endstream endobj 3754 0 obj 6059 endobj 3757 0 obj << /Type /Page /Parent 2 0 R /Contents 3758 0 R /Resources 3760 0 R /Annots 3761 0 R /MediaBox [0 0 595 842] >> endobj 3760 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3761 0 obj [ ] endobj 3758 0 obj << /Length 3759 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ¥°g<r`Ø@A7›`/2ÙCþ~Ô#uO›ìâCTOÛ€§=lQÅb½«X|ÿÇ/oþù[óþáËšoëχ/‡®íúnùÓÿ¾»ü[Á—èZ>ÿ4ß¾ž›çÃçÃçùßçë_\̃§W,þöí×Ãûåå‡å7_þ<ú_Û?Íÿû¥ùëßæ?­ó¿ðý0Nýñÿ—Œ3>Îÿ¹ütü×á/¿k~A_æ=þûŽ+5uÝÇóùQöò÷òQô²®l‡¾aŒÏpªÿýÇáçy¶3í(Wrþ<õrèÔ8òùó Ö?^oøñUŠÍ4¿NÎ3è/2Öë7‹›èH(cЉˆXÜÒX'ûTíØóAªnágÿ¥3ѽ,] ±H<ͽlìM4CÄ¢V¶l†e¦¤{ÁŘh/N3E£O2ÑD3DiöÎÔN’±á(ž¼…ß›ââe‘C'b—yš*_Œs•ñGˆXÜÒN˜ÇS%ÔóÒ‡…ÿeÅ!(a}ª‰øË$QK[·Ãœês‹‚¿ZÏ–?~=¼bòÈŒ}óõç’+lùñu^®jÞ-‹iþßOÍﻎÉ?4_9L­šÄ ³Í5"éà3Ý|OŸáh„$¼g„ÏL„g>Â6ˆ7 lËȧ¯3½æ¦¾©›"¨X°HÀ¦¤´ô‚aã!è g`رð&Æúð3Eérv³Hŧ”²aapÆ߃éåÆ 7q Ä›„8X›@¨Å@€ µD²|¶z²ð –¤˜g°TÄô‚1%)!IlLÿPnX$ Þ…7ÃéNÎØšgFµú‡rÌò 5^)¦ lÿc0-lŠä’Ø3À^ Äe¥;(¶3ÞlÓbéw›Eì` ®-¼@€€´?©št¥Î"¬sWuJü ˆ{9ÿç˜Ç'wWœ5ôªçêri‹°õ}ÚìªÔQéõlÀk²R­à#ûV†ŸY ‘­\ ²ºòÌJ<#^ï$Bï[•W$Æ‹W)ví«Ðb!*,èƒË1§_«o9É«À`ôY¦'5„ ‰@Ž˜ìé)è3—±¶jWÆZ%ûã˜Ù¢À`& `!‚) àóÕu±±fUL˜’Üì ·m5I¤¾Îœz¦ï5E³Úû>TÀœ&í` æ•O–éÄ{ÀB)ô ÁóNoY(–1nA|cz%¯ P¸ AôÅHH$—^‘Æ:M™õ‘‰( ¸€+:jÙ"W ò ’QmMLêj+‰m!¹Œg˜3F¿\ªjHt3~ú®ÇºøãuÄpÇÕ¾AI”¹ÉŸ†Õ½A™ÏâíOêÊ›¨H¡ÚB„þja/ÀD…¡ ñ³þ vû{yh\LHÔ æc}þ ’_Í0hE®8mÇ©ûÑ„Â#ØWó0Ùüí÷$ M y`B×a”µàÒ:µg8­iâ‚5× $¨2¸fÍ,\€÷Éì!|dMÄ\`®ƒ¼_lLÒ=¢IVÍœQðônʸE@Fײ‹î¾Ÿt"4økôç/œ+ÁbÑx_@Š$©…Dn[ üC1©z˜Ô ؄Ȓ¾ ±_g!ú¶ØúÝ­*8ÿ7¯·‹êøòKxP¤c—ß`ÀÌIZÌš¼¼:^ÓÐÀcÆ~‚Q—ûæ&4‹VwO0÷:‚M!k¹Ã˜dÜ’*©&Ê ’¢6`µóKÖ%É7ú+èQïŸwŽ %ï»ö&Äfð7Mê)Ù°äËðl˜åS„þÝ$µ£Øš5œ Ŭâ.c¤;2n-RÄíñç/Z¤®D —BíÜ\»÷¼‚tE $>Æ‚KŠqÑ9† —‰ãBè§ÜЯe[à´Lï*K.*ºPTñÉ›ÞiXZÈO˜æåϼ«½8)tÂa­RÇ0oŽÓÃÓA¨9å Æ#I{¨Øu¤+¿ÏÈ™–õ¹TQƒN÷Ò1¦Ú§„ú²†äB·wg+® ú-â$I:¦ù-x¤¥ï‘& \k‰©ßˆ6–)“ÛØ£.Ã(ç½T*ÈŸMºÎïèq¡¿s+«¶ ùÇv7ÿ⌕ŠÍ¿,|7@K ‚Ÿ›/À@kH]gŠxå8…©ƒ±‡ð2œi\—›4Þh%DÜÜGÛƒ¢Âçf€%¦Ê)Ov”pxÀ£€òMTh«ž£é‡‘!‚ëšòšNRIMDßš–Û2ܬ”®ë)‡ ßX Þ£ ¥â.µ¦Å¤R¹¦£ê_»RÔ´?k$£à{¦ ®[qzœüIá¼Xä}ÒsÖõÛ\™ ›UóJ¹k»ÆÒÙ‘Ò'¯CM°¬0Fyöx+›¤¶óyŽ_d>—wë6’O9ÏŽ2¡SÆ[±ópÊí|MÞ4EHÒãLR’²å­»X¸ÅDbs‰¢Þ ¶«±ÆK§äɱ|/ÔQ)/ÓRâZQGlâcŒõÉ ”®O§F.‚Û´Ú;þøð©èAnR)#‰A`½ÒÇ6cl ,%(¢3À1¯wûÜ~¹å¨Ü6¦DŒê¹Òõ6:x–iϘÓë䃶1!NX!Sƒ‚TþäxYÛ§±WœgvKÕ<´S ^³=\ÊÀwHÑF^-hžŠi¡ÐÃßÁ€ÑÅ’âÌÕ’nÊœ—w*­œùã‘ëZ%&÷„ûéB#Ê£¼%EïW’Çp˜6…£ž¸1nÅuò›uÁ;á/ÔÓty—AлÇá¿Õ9=Žݺrˆè[]¦gWÏxdN: iù‹-†BÖ VÚÝ7 ì¶p)V£i>PB˜Þj’CÔo·ß´G0õZ<ÐZîdöCòŸë”&B÷ímFâ£úØe±dJ™µ›snbÏÔÔ:IÉÑm•ÕS óÅ­ ‚Ù9«•ÐmwÃŽsGòSx°!^¡ÊËd`w}Fvˆ-`§h¸šÄJtÅ~ ¸¹Ó¹=ØbH®h]~„IqŽ’àÆ©¥õ¹;C‰SûË…4ç"cz¹ôô!¤µK/8ÊÓ¤ä50o]ÿUË!© Z3<(ˆq#\jü¢žcÉXþ'èéU Úð*˜wáÞê9‡zsÎŒ!æ=ÂÀ7¥Ä7Ýz´æÇAy-Ë=õ¶°\%œ"˜™ùÞj3›¤ø<àDTù ÚÇAhêÅr`DAÖíKÛ'WòUMïÁÝnùo—µ¿ÚŽ pŸ _|’ûYŠÌÊsÇÝë*ˑŠ‹DUž$íÑF²ã"0½Á¹3>õtž,~ŽÙ™&'írž¶?”÷tà#¿áóÙÅvIÏó$[)í·÷ß34*ÂÃÌ¡°PÓ(€»c85&æàúøe)üN·ÈyˆYLº2©.r»Ù-‰I@Dþ´j±9qRGA·ÎX'iâ"äT!Gé!Ý ßf¶]¡ÌÆý” 8ºýäÞ)·µ”Bq¤)F)pAê˜KjGSd…Eç×z÷¹¢åÀ)@9róö¢œõŸöνîV'1gEü¥œûÐ>éêÕR…Fª;_B—§ {Yò}Î7?îD´¬0by¾çÞ?¹Êº »>-À÷0<‚1ÚÁGàz¤1Ëzàí ß„Š! ðŒå=”ûN){J§Þ"¼Ù³óÙ|Ç)\·Ä4†å%ļ¤H‡´4ß#! x£­Äô‚)–2‚åĵåÎ:Œ l¥¤„€$—€ÏXð×c‘5oø~,7°ä"@€oj^ë®áÀÁ¢ EÙ c‰’5–}Äô‚µ#„c¹! ¬‡žÁ˜v0Å’äFA«º?—SQh¹j9VHZ•¢ØšqM‘ØÕsÆàám/å+–å%wkèÆ˜ÝÚ¥¬¨ÀR+¹Ã|ˆÙacÁ6?ÄHvè ûŒ°X±´¹5˱”?nYéæþ^Qù2ÊÒÜt÷Ъ^iIê;Qšú(˜‡¸²`žW¿5ž)JI<&:%`V“ÀSÁÏ%éñ¤ÁÚc–£Œ‰ó¼ù²½Ý‡ã"E¥H³÷«)é0mðÖIœ}¯{Æóžñ´cgŸOB«”ô¬:&V¹%0©¨:ªí÷±b;ÿÖbPµçh¦!&fSŒ–7Ï.Ý“)&’qÏ›Ý-Ö‰¿p{ʾçÍœ;¬b<¹Ì›±îÜ¢êXÈÝf¹ç͈žFIùº˜¼ü=ovÏ›EQßE Äæqí}òLQJ’1q‘{ÞŒ6Ry´Œ±¾xUÈ.åËöv_y3ÆÆ˜èGÁ ãOþV{Ë)ÆUÿã–\k_ânïåßÀl¬¢)NÚ>›÷ŽZçoÜÄÎ`?@â7^C@ôö=fðnùOÐmw¾ 4öMÓÏ¿8àYÿ›=.׋Øâœ¢gšŠ¸ßDÕ„0Á¥Š´ÖLöIzs]À „Y€üTΈ]L(»ò¶LÈShÑâ^`'»KØUÆaXº%88–Ùaeìú XFd 1àô nRDp -ákYÆFµc¸Þìúã`!Ä`9~ŒZ+áý‘˜b %ƒ,àÒH\y/šÜkÑ$…F±~&¤åqòkŠ\ǰa ÁÁH‹¦$ÐŽEö í%LX)¥Ô™P~Ñ»óßæyV°³ò<~aýñí»E㚪º{UÕŸ­ÊÚú¨SË}Ãæe\QòbbýrOX#ºS$UX}ßö×ïÑšdk8" óð¡®7ú®Œ,ˆ¢åÓÕ8Rm¿¸¯#|ÏŸ™à3 y ¼å8éŒpm¶…@/ó¿»¶m¾²Â'ôÌ*¤¯0´ŽUH‡=³îXÈÚWØ^ ‚ꎟ¹bZ]ĵ÷}§<¦ƒ•±¯P¼³X0j~÷! &DZë[vôã5”*6F¶º”n %[óùð’CíÍ endstream endobj 3759 0 obj 3898 endobj 3763 0 obj [212 /XYZ 32.1599999 107.539999 0] endobj 3764 0 obj [212 /XYZ 40.7999999 581.779999 0] endobj 3765 0 obj [212 /XYZ 40.7999999 581.779999 0] endobj 3766 0 obj [212 /XYZ 40.7999999 329.299999 0] endobj 3767 0 obj [212 /XYZ 33.1199999 105.620000 0] endobj 3768 0 obj [212 /XYZ 40.7999999 329.299999 0] endobj 3769 0 obj << /Type /Annot /Subtype /Link /Rect [60 338.899999 190.560000 346.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn47 >> endobj 3770 0 obj << /Type /Annot /Subtype /Link /Rect [182.879999 72.9799999 224.159999 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 3771 0 obj << /Type /Annot /Subtype /Link /Rect [243.359999 72.9799999 291.360000 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 3762 0 obj << /Type /Page /Parent 2 0 R /Contents 3772 0 R /Resources 3774 0 R /Annots 3775 0 R /MediaBox [0 0 595 842] >> endobj 3774 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3775 0 obj [ 3769 0 R 3770 0 R 3771 0 R ] endobj 3772 0 obj << /Length 3773 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5")Q˜~È!À`È!È!˜Íf±ØYd²‡üýÈív“þ(ñIÉmÍ`·{L‹*ë]Åâ‡?þçþß¿ï?<~þÏþ«ùùøyW¥.‡?ûÃß.?m¡äðkÓÖ…ìö_¿í¾ï¿ï>í>õÿÿ¾úø ùÑž^1Løû×ßv†—ï†O>?þµÿí{¹ÿKÿ¯_öÿGÿãG3ßá ßvm§¿ü:ü"¤mÿË߃?ïþö‡ýo=íqÞÃÿu#„Ò³àø~~Tÿ^>Š^V“{!dgÝ£ã¿ÿÚýÔÏv£h+%T#ëªÿ½ÓUSÖm+ûßeþLzS#¯’ÞwýU)œ9ë6Õì‰t¬‰äq’YKeÕø§*Z-›ª.»þ>â¶Ç¥«ž?f.þ4Õ\,JÙvq¶ã‘˜·´Óv੊®¢9pÅdž–YõütX¦,ç¢þ<ÕlÔk-ãLt€HÌ[šA½gªžâÍøû”µ‡·´ªëE`YõRÕ¼æS-_ôwσ_v^D¥Úƒ>úòS¿à£R~|é±Zïèɰ*ûÑ÷,KQýiÿå—]WÔjêA Ž(>R•päBð ßÓ  !ð=e G$°ág„†Ï<…?#¨ñžÊÎöGàlFñþ@Ø<8ø“®%¤7<ÆŽׂ 7ˆ7ÅðöØÈó—^¢%—O²N"Ÿ<‹¥æZHËòx¦åÅé߃76B>e¥¾ªšA}ŒDX³¼Ä°IGÂAÎÀ°)8âáMŒ‚úð3YéR«4RjxFöŵ´Ô•ÃÆX‡„æÅÜä±O!Þ6Ûy ¶óJ,£V¦‘#óXÊcúÇ‹5¡4¦>ìé` ‰wán$×(g,Ì3µ¼ úÇ>&–cØÏ ¤¢Gbc¿s-á3{âGØŸÁ8€ôï‘°æ†Ï`Í­ð3ØÆTÅŒdÂ(ÛâRUÖ1)ÄãâèöÕðz° !`óhd¿chÇ#{ ¨ýa´+±R¼Ûžh.¤Ñ¬zWuIlÕÛÌ20Ô9*7V‡íL±D¼†âͼQÉ¥ù¬nÓø„[´|‹–S_ÓÌ ¾-Z¾EËÑe—¦Æa‹–¯!æt›Ñr×®B–k‘(ï¾|tm‹.ß(§¯=º¬ku ôå˜ç=j¼R"·ÇÔCÅõ$ß[Üy‹*nQEv¥Î"Vê©©‹Q.$ñ; î«ò(î›òäî1\J¶BÖ—ˆ„mkï]e@UTÃ:.Ðâ<[£¯šýÐ…íUZ¹xß° MQ£àʈgzøL¥ìÏY9Í™#É™àyß3Új©Ñˆ±p3VlXn¶ êYƒÐÒÅ30 E]éÃ4¶Uåc@€gVHdÎf¨'ˆG4ˆ$m v‘'P¦ <€ñl] m|bXݽÀ4†—5^<„j¯s|YžÉ“+œVÙg=DK(%ÑÙègD ”!êR`nº6&¯G_ª“9ÖèZ¿U=I,g—<ÈrÄD;¢1‡÷§+€[Âa!ãf‡éÂé4g¢>-†Èc[`žÂ vvÉÁ\–›õE¬¤WA¬,Äìw%Œ‹ÆvÅ8ïÃë›.±ÆíŠ¡êð<ÃÈÊ+ð‡ä&ñ±ÏÇÿTíGöcã1€¥° wÌ#f°ê$tÌK7ŠBƲ£/Ô1E’¨°q!ä‘ÖKv< ab`Õ‘B ­+¡héÅŠ%[âÖ0IŽûÌÏÓYn†1n4NÐWš%SĈNæ6ŽC¨¿ó$¯"0J‹Öª¶­³‰÷”ðv|Zsl¥-Ú®ÔW]wÄ`ùÚb´DÝ`Ÿ+/¶×å<« öaÅ«ÐÓa•öÏŸxÁâÅ^ßG8ÉÚbF¼rû«FéuÚÑ)ˆ…DÀl†Ùó„üÓhmñÞDÏ HúR1ÏAÊc8k”®jÿÖJùœ™út bVÂ0 Ú`ÉO„Î1tùßs¢Í‹²ÐxãWª“à*…%¸ðÈý´Æó¼ÒÖìRg&«% `˜Î‰Åt\t28ŠÊd8]5=ŒÌø™h)…}--iï!7¸1®GÈäã±tpx2À­ ˆXâHœC"pÊI­àíÆé5'åH¸L•5X"¶Ë…ÑÉ Bí ÉÅÚh‚ÑÔŒ^Q…Q¼ñ8£LÖÈtµ-ŸF…ûêB&” 0="%xCR3¥»Òv–6‰aNQÑù¨Qä4ÆÒV8˜=õlìÿ Þs3žyI—`Õ6±ú€Ò¶qSÏÝí( 6=¢’Pwâ¨sŠü e1Ëß³³#[m3çúÔ¶G²óµ;º2Û|%J\ÒscÒxÑ?&‚é©õ(&PbuOdVJ cjq#K1Š笓9½Ek»¨ l³¸®b0êÝ©z  bü‡)›ã|µþ0÷Ýkpå#EjxûœsdÓ½ë7‚o+°”/'Ý lŽ—,xJwÜ·°i,Øñ–O'¥‰¦-HN ˆœ‹[ÊFšU4 QOÓcBQø= I1™JtnÕÓ©•¶çMÚgP’;@¹õšÑŒ’v/º«áÄ·­:_»tnES^i¾C#å ·MmàÙ<Ï<Ág:øÌ`ü U ¸½xæÎf ZëbØË)#¯m¼ìÙŒ4é·wØÃ‹‘g4‚×cZrõzK]H‡X ¦Tµ-*icB LiBu¢ÊWØ$\©0.ˆÐ6j¼?ŒF+±ÕÛFDµÕ£œ}K;}ˆÎcÞ÷Þ½pBʇTô”ØYa2ØxÀï ðŸ¦;ž‘¹OÿQ°tP‘ç(fõK¨Ž÷m<œmCêÉ»3zúüãÞnqû‰=û=}çp¿>âÞOG_æö]Ü÷®$ºå1}™>zî×GôSô¬‡ ÏJ1õŽÝO•Gè9·éQüŒ÷‘¹ÿ‹é„! è…éÃúî:áGíEë‘v)ø,’¬ñtÆü;€2w2x:3Z1ÿ=‰=ýQ™=%¤ žMaêetskGT+ ÷Ö•…äêϽé…÷§0½‰Œýé»VŒòæ6²l#)F(Kfq«„¹ÁϳFªF½#ž¹‹¸Ä7ÿDndóÒªÂÚ5‡ÓMg«° 5ˆÆZ„¡¬Ú_–»Y¸l#÷5Ra™ õ5s£]ÞÝ:Qñ湓–°s(ûƒ×Ê÷`Ñq&Ï WÐDðDÇ0…àÌ\›Qó‹9·¯o#ÛÈ62cKæ¶óå#X¦E½?’ÊÄcˆ;dW°sqïœgrQoÊô@Ó¯®ÓÜzOå@âZco2Ù_Ož›áZ†Æ rU¡Ãܬz›V9|OܬÄ4W‹gŠÍÆÍ|zt¦F0Ïu“й9“´dnMf,À;Šð`¼1SN_¼ÑëñLnrdy®]³L£´aea7¾ù9$Þ[”—‰›GÍ0QMf¬F¦4[VÐÈ…ð»G¿¿ö%Y\SÞè®ÍelHBvæŠØbý^ÃgðÈjl‚,|&D•„ú<ñ+,ÿ™Óo7©D´ÅcG™FB€3ÄŒFõÄ z‹œ—¸›‚lщ¸¸^<ö¹¼ÇMQHÔ©\š5Z< o8¦ßƒ)„дL9ðŒónyl¥Öc•ßÏH®z  ø™É`zx3nLž±ÌpD0W„†°[·h%GUŒÎÁ:Ô“aflBQñ+"NFK½q»ÒUgT'j…>G^?e´0ê4]O¶Žg~ÎV1µ–„Òmk^)®Öc¢ƒø=¸—SW•«û`em„ù‡é»¹®Š‰¦eŠ> ¼?ØBÇÌÄ©q”‹8™Åd=™,®Ä»½âÈ¥‡B˜8NÜx8ïWä±¥º4ÖÓ)ˆ‰ QuQ+ƒ©Œsz6nÔ˜-ò UB:xd‰j·zèšÈ Æ­ :®á^_Ä.ÄíèEÙ†‹{öÙΓÕ‡¨·jïl½p©Š8¦"(î9¤¸R,£#Ëí$yþ‘ÈÃ]ÀH uMœÃ£´8Îày ©ÈåÙçêú;kL+kªº³„M¶†±8H„;§q©bƨ¤$E‚ÑJNÖN‘+ÊË1So‡Qo-Å ÛÕèÑw:’vLõv#“HãÄ‹¨{™Î¯E>ƒ„-Âßaº_S™L1-5ÌD=™ô¨8HrÊ9¹Þ¡,õQŒ_–óÄÙA¶­L#ÝÁH®ª=ª"dÅÝ'qÍ5•1Z¾7çòU¯Db6¿eñûônó¤R®sð÷SaœË·¦*‰Œ+>Ÿ¨òÝœ)¥ÞºÙ,0’ë„ #72U‰2ÒÊ‚¼·¦1²“«nŸ? n£êÒ˜ pÔªäí&·|ž5ßð™£>±CÉ´ò¨¨•´Œš¶h»Òºøß >v_øq—Š7ŸLZš˜¾4ÝÄX¾~ ÜÈ÷š;¬‹Ö7dk}`XõõYŽMj¼žk÷Ç;N¿¦žÁˆÔ1HÏp6xcG7IØ[@A„±Å¯ï,)v†ÊWvê¹âÈ¢8<þm'›îòƒ_wŸ±£®èºàG¼÷¡`‡Öróe;¿>¿í”rŒeu!Á…6;xøÐÁÍt&3Õ×BžPNÍ:¦].Þ ½ ™ü $ c°]#­pt!E{ÕÄŠ Ü{/¼»ÊrzØöú\÷pŽ ”ß×ýïÐHyZZS[#x6üÌk\Ïy¦ƒÏœx]ÙzÛÈ Qõqàb¤CϘO[TfG^Ÿy„#Âl¢:’æåˆ2d+u=¶OyVê?ó€Öcú¾\Æ! p wCíïÆ5„¢D qWŠßƒ÷§K-œ”)ã»N ÁexVmmc^Uw bƒÛc®8&+¶_ ’q'±U¤Gó3ê¨Cã~ƒq¾ð3X·|](FŸc¦lõtK%Ž}b89F—c¬ã- ­ž —0hÊÍœN¨.$3ÜÍ9{²š9ä Ÿ•Üm¹¬)ÄpgÉaÌé.OÇvs<’…qS1«ãua!GÆe› Ûra"BPxœÃ®QøˆQ+8&WM¯—ÐÏNÓÑ\v-€;#HaU6•{Ø ‹€Îž„ÀZ¥ÆpcþBu¥˜¥Dò¨õfúV\¬Æ‘›¹¸ 9ÿ\Qä«UP[7¶+pöäu#Þl”:y¤¥°|÷„07¶ƒ“û`êjÜX S·Ìù–I©Ž$”š³›œ•t™Qa”æÀMHö?j•&E•DØòöêß{Ñ\ÒÌŒ­;˜ô¼§âÌÉ_ß]5Mž:@çü7:õxíÀêñød#¥9Oyú·*Úžoàn"t}ÁÊšh]ƒq’ôÈÅç;ÎIÞèHéÐÖŽŒgš1,çÀtÎf8-¤Ò/@¾gŠÏ8ÕÄ|ns"J4„Øž{ˆëBŽD1è§Ç—C<$!÷8ÞSPŒ»Jr# ­mšXqIUˆ—¼´KÖ•…ÃD]<óÒ#¢ÖW)6ëpz€‚(w¥B@\ã[¼ýRæ’×a*›?Þ[Áóm–`¨ß[)ô:õ†îj‹/bv”ÕõpÍñ•­:£Æ8^òU°tö'±úŸOÎW:ë+†ä…„6ÆfYèêxŠÃ–Ý—0˜OT¡I8aÄô Ó…vúÁ•ð™—Ñ…œlä¶°C)Q/p‰pñî,x!x~Óþ7½óÐ6•…˜+Î6Tðï̦Bì®9EyO.M²‡¢¤fªN;{δA˜^q1¡'М½'P™´d›õ^XÒ`1B—¯’Õj­âaæ¼%&ã©m¢X;"­69²C¯²‹–h}j—v±“N¦Ñæ+ÇtWEÆUÕ®…Œ# ðbƒøvCãT|@Ú*®«Å©øÂÛœÐ<+M1f@ÈÑy cᬦzj¶²x#¿ô§ÙKÛp¾‰’ÐL½ØÆ³>wWŒ9ËäŒÚgî2ÑÿÝï¹@èAÉ?¾~ õZä“—£¼Ž?ô^ô˸f·vBCcpUZ:_÷÷u±ÛU°eS4×ãÀÍ•‘”•*dw5ÛV×…èÃ&òkïiá3|f°TYÈòØoݶT®Í6ÐØå'Oð»&3ve…/èãó]h†Þ1;²vqU™Au‡ße-¬+¹¯½ïc8ˆš C×Ò¡kÙ»B£çB€Gðn`z;p¥ªAÜhò­ÓhbÅÅCgp~“ÞšKgm[êB¿Epx )–gú?Å”ûûO»ÿËóe¶ endstream endobj 3773 0 obj 5393 endobj 3777 0 obj [213 /XYZ 40.7999999 785.299999 0] endobj 3778 0 obj [213 /XYZ 40.7999999 407.059999 0] endobj 3779 0 obj [213 /XYZ 40.7999999 353.299999 0] endobj 3780 0 obj [213 /XYZ 40.7999999 785.299999 0] endobj 3781 0 obj [213 /XYZ 40.7999999 407.059999 0] endobj 3782 0 obj [213 /XYZ 40.7999999 353.299999 0] endobj 3776 0 obj << /Type /Page /Parent 2 0 R /Contents 3783 0 R /Resources 3785 0 R /Annots 3786 0 R /MediaBox [0 0 595 842] >> endobj 3785 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3786 0 obj [ ] endobj 3783 0 obj << /Length 3784 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Ñð%Š‚?ä`0rrf³ ™Eœ=äïGÝR»m±¿¢X¢ØR›60îqYT±ªøÕƒ%êó¿ý}ÿÏßöŸï¿ýgÿ}øyÿm'*aEÿµ?|zû å*­ú«+Õ¾ößì^ö/»¯»¯Ý¿/;i?:âéý€¿}ÿu÷¹¿ù®ÿÍ·û?wŸþ·Wû?uÿûeÿ׿u?~Æ;üÁkíáÿûRIåºÿ¼ýt þk÷—ßííXpÇqÿ~RµÓÊšY|¼¼^*ßo/E7{­T+Ü^JÕñYwâøï?v?w£ÇU«dmUM÷Ù ÝÿwÒøên E#ömc÷¶»Ñhx–Ó†’s²M“f GrÞÔ¤0 =TÕ)kŽ0Mµ=w­Çi*WÏèi¨¹3²ã%‰èÉyS;‰U9£¥nTmj8¨ vNuŸ=|EL½³»ãÔœ«Ž×¡æJ±uš%uäHΛڠ¨¯IðRñò…¸ðËóîóS‡‰íþùçîØÿxþ±Svÿ險Þ?ÿ´ÿ½òîûç_vmUŸ=ROQ-¢ˆæH1US(òq ä@´èõt¤HYÕ­>PÏ×ôHQÕVÕïî#EÜ)®2Jºw£Iy¤ØJËã%o(úHé´í‡;ö͇àÎT¨þšö< æVA]*tgLÁ3Äó½^Ÿ;“ŸgÀí!¸¹`ÀFôlÕ{ÑɺcSx& •“ïUTâ6ºy¯Va _Ó›¶;KÁŒ~1˜9ÿEølqPû©·¡û‰^—ÍIFoFµcæÇ¿,ðÒµÞm ô”'#<*V'FW,=l ˜,5È#Öì€Y”–"LÌ‹B=L×#´,Ee‘Pp˜gŽ8 ‘xº÷î7}ZI¬1Âú#Ö–¸/ŽCû(æÍâ~q´7j÷›2À œàëêŸý¦[/áèà >¶á?ÅÃOw„‚U3¼%æhlÊC*Õi¢,0<`¤ôÂÈ ¡¥/ã™{¢8ÇóÆX˜…ÌÄ5ž}Âéøp‚…á#<7რì‚ðîj3Žæñ¤¡õƬ_CC$aÅx-x^cކpÄq‡1Ú ³ÊÐDè|‚Ä×beÈŸÝ',¾Z)…Ñ!gà)la€g¡=ý¤…'N<:Y°c³ŽÂÎn mF1|GjÑæ¸àTVÖàêˆÊa6 ÔwAø}ìÒ<¥pr‹E–x.¿È±Â9Óò"Ï1²ñˆ¢(NÆŒp2Þ\凈䣷÷¶•ãXŒ#›“˘S¦I¹«B$=Œ ß®=T ƒÐµ ~¾q}…±p%—¥iÎò3¸‰ƒY‹Ê9¥äˆjT L3d³­ O>îDì˜a[ò0a>Â-(@)åd FØoD’³‡Ë©ÀF 0'Y]Ž&PüzúïÖ¤ ¹ÁÂ>Ö_”«‘šï'õ¸!\¤µÐZv’ìÜÀAb~Ff¦½€c«ÓÓÔ$} aŸÊɘ(ê.»¥¹ÂÜ:…Ô¼¨Ý‡\çŽh›Ñªã±ÉÓ@EÊL5e5eIä¶v Ý®ƒeVF±úòVöј† ÈÑ„Ò Æô$’ϼÿ­ õ3n…wkYŸ™s”4}Éá%ôúìmäûªT {‰P[¸À;<Ýq©‚æE2¸Ø¶¸j¥{ ÛáT"ÒˈýGt»7.j9¡&v"Œ‡1"jÈ÷²ØšF,ÿ´Æ19ÝÛµŠˆ43é®Fðto!mÕŒgš³ÉQ¤Ÿ°,¼Á³pE—‘xb›Þü½ª¦-Æø±J"ë|ˆ¨>.û(Ÿ0¤h²!Âl©ô.v@õM}Ô¼ú4)3@M ŠÉ[£ÜÊ"”JNýúZ ¤ƒwÌ8‚QˆµÉéLÅ÷að– í>L/)+³À5Ì5³…+‰®x/Ï'×ÞˆÎø,§vÛî¸+» k äÚe(h—ípìA Þ‹f`§æÄ8ÉŽG c§7Û±ºIJÎý£¶Ýzk¼ÿ@Äs…R(Û äÁ4³í¾Ô²s´ Êõµýq(××ömÚu¼µ7ÛáyuÞ>¥h¡Hô)¬³‹Ê~þi??—æòxJ·íNßë#ŠÁ5uNÑHH'íî–Õ«ƒeãFŸ k4cÏz-nöäÞµT4>¥ø÷b×·HaÙuyR7µçOóáôsº…BóÉãùÕ­>­VjQÙkQ…R(%6LÚïJ<û€¯ÁøÆxbƒuv§CvÏ3eÔ˜8ϳ xÇ#›ÙrZÊA—«æEX,'—À²þhµµu®’¼9¦ÕÛ~î¸äùHþÚî'ú¯³pZDŽn6US(ò!é5-ºFõ“”'^0ÄñhC é*£¤{͢Ⱦ¼RWÊÖV½£<Áûˆž7Qõ—L™Ï`¢ÎÂÜž¾÷4¦Ð1…˜;æ YËR ÖŒ½™¾¾+å5 mÆŠP½a¹±,›J€°ÔVÄ<ù_º¦—‚cÆÁôŒ= 3F­ºÒÊIuAe†Déð/Öàýˆ‰Ž§ƒY#†Ÿ.-bøÍt™DXC]Ãñʦ2=aŠL†”Ç&õ8ú‹ÞˆK†z¬«\+Þ¯‡dd}âäL¹ƒ ýmÚÓ…78qeëAŒ×C%u1ž žE8ñ”9ò³Ì§/1VVHÖ1¼Ö#' b¬vkÆš¬!ųbï~žá{HY†¦|©NÌN± %qX„P‚ö`0ÉÒcÁ¼Ç+” ±Â<Ü0”v+„ù3¬â0!F¼f#"°NŸ°RD€ùñp Äm#ßyZì’Œ@ÞYÁ(@7h´åß95þe#^51ñvÒX`¸¦$fÕDä>Ñ`—!G´§kn‚î~¨RÍL»8‘H<2ÅD"Xë¢ÐüÂy ¾Ö0±F±«ñ¬:”ømÊAT±à:V­-äM8§\BàiÚ²LD6•¢!¥¨2ÅT}83g]ü`(œ´HŠâ’Ê&‹é Y,¼ð’$I ]Ðç4ºù¿ø0ö„áÕ„”<Úñ¾Q%^¶ÞµŒúL*DÄr„•Áæ)‰`:E=5Iq'ŒOþ` ‡ƒå™Fj¥âÆÚü‰.4gÈ‹E<wXK=MÚ6}qÃðøÆ™äé™ ¿¶wØô= ¤wvÒê±E¬·gj¸dÃÁðÀ€_\åDf¾Õbˆ×Ó×»ŽÊfN.×2g3Ç/P2â§L›Ê °ß¾DUöLÛì)w–oàs굃ýê |çSw½k |Dkß ¨4èy)uSƒCgUpÝån¬ÛD©âõ¦Aˆ)æz¦ÍcDù>IºŽ%Œ=®gc]ûIk51µÝ…ƒ\ò8[šQb»ztpíºí’~¥Q#Ç2g€°b\ia¬£ì•±9Ö»H³ §­ËïNf«Ñ!ð•㥿XÐKzÿe²‡hðé`|Âç$sΙàéNä†[5^È:¡'/ z&m=Žé4Jضd¿_—]MÆþˆ­#,Bh-õ m-Ò¼7«Ø Ùð`2bh˜“„†}Í,—݈öŒ1x_çfO‹Ç{(»Ók‹bš1œ?ˆgf“…í0D›KD*®árþqjé?!ÅéGñĉÀ=‹’fdfDíÞ›R°ƒð#ñÏìÅ ñúƒX“‹Tf¹Ç9å¹$qYŒ6ô¤[º=‹ð!­tïïzýÔå…sDc²£&H±>Þ€SCü’Îk8/¹â¼Àq5V‘G­ êq5¹t4>|”ór/ÆÑ.Äá°Œùà£èˆÃGß$><JTAŠÒ!$Še­ßGããë :ZÀ¯9|X!Ç3àÑ ¶9‡Ýr´G#4Ç98ŠóŠ6|øb¾Wf™.`+]0º`ôÄ•ÎA;N ™øðQ¬9|ð9‡7¸Yèñ–!ƒ´ŸØª0Žb|Ã(†W Κà5 χao‰_fŠí:é+0ö1ΊãÖ¡ÇPÖYãã‚Ëyõr¶Ø¿x‰ó¢mNü•TªN‰ƒÛ”†£áµ™uÍØ¦¬™ÙKÚ5Ãy© å9¬}eHqzÌG‡„½p^{—Ë'Ã5sý™*\eÊõ’CF|JäÒë°e£ƒë1"à| ƒBXù:trnËp(:ÝÌbÔëÛ¸ˆóp·ôxÑ•ìt¶°ŽÕënåšë¤xÏ—@ ŒÆùvƒr.¸Ú‰yc¯Šç å«’Ö‡‰Ñ’Ö(´`X®Î2ö½Y8ÑÆ´²°1ÎË” äµ@¢ŠkŽ8²`ôcp,‰ØOHš÷\ãk Žàñ5ŒÝ#%©ÜX@ä’xßçêŒ|@qì ×ù1ï aoçÃÀhb·eË/ºM¥Ÿ¼¯lŠÃÄP•%5s^:HDxBtÀ¨*¡5Ž“ÖpõUã Åèq‘LÚ.ƾ7ý¬¸ÖËÁÎësìä×Ã¥Šs¡^Ï [ÆX^С ÃÐáÚ¸átS:öÏéðÂñ§«%Ó L,·L{Ë9­ÏˆÉõûDˆ«œSeº~8!Qu¶Šî{ÿÒ©¿Síá†ßöà’8ÒWÒ”ÈKÃçàÙ½ì¦qÁu+mÕŸŸ¦Å)xÊlÖVöò“ò­©zɼ¡ô‹Y5Usù….ÍJÔh]©öâÃu]Ù~CæLià}¼¦…×ô°Õ¨J } à¥Ñz3|û›ø·Ã®fø„®ÊQ—(Íc(GÅ]3h,fîoÇ0ÃêŸU-›÷ îÒýîâí@Ö ;ìZyv=œåxÁF±ÌäS°6°=(,8Ó!Ÿ°‡gÿ§Ù(”Š? agpü·g/̰3ç„­äáã‘Áa5`S´o±?!îï¿îþÁ/Dz endstream endobj 3784 0 obj 4415 endobj 3788 0 obj [214 /XYZ 40.7999999 432.019999 0] endobj 3789 0 obj [214 /XYZ 40.7999999 377.299999 0] endobj 3790 0 obj [214 /XYZ 40.7999999 313.939999 0] endobj 3791 0 obj [214 /XYZ 40.7999999 259.220000 0] endobj 3792 0 obj [214 /XYZ 40.7999999 259.220000 0] endobj 3793 0 obj [214 /XYZ 33.1199999 177.620000 0] endobj 3794 0 obj [214 /XYZ 40.7999999 136.340000 0] endobj 3795 0 obj [214 /XYZ 32.1599999 179.539999 0] endobj 3796 0 obj [214 /XYZ 40.7999999 432.019999 0] endobj 3797 0 obj [214 /XYZ 40.7999999 136.340000 0] endobj 3798 0 obj [214 /XYZ 40.7999999 377.299999 0] endobj 3799 0 obj [214 /XYZ 40.7999999 313.939999 0] endobj 3787 0 obj << /Type /Page /Parent 2 0 R /Contents 3800 0 R /Resources 3802 0 R /Annots 3803 0 R /MediaBox [0 0 595 842] >> endobj 3802 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3803 0 obj [ ] endobj 3800 0 obj << /Length 3801 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€•ERO `Ï#@ È!È!ðf,²‹8{ÈßO÷ˆÝ3CöG±ŠEJê‘ ¬gMKâ£ÞõUñÿüýðÏßî¿üçðÍþyÿ宮ꮞ~N¿xýz¨Œž~쇶Òãé×áÛ/wßßï>ß}>þ÷ûêž´ÏŸ˜^øÛ·_ï>L¿›þæËýŸ?ýï :þßχ¿þíøÇö}§ðËÝ0v§þ=ý ´ÒÃñ^ÿtü×Ý_~wøõ8…áù½§ÿþ Û±5£NšÇ÷Ë£êù÷ëGÑÇêƒÑM£›ƒRú8Ïö¸ÿýÇÝOÇ·]¦Q Q¦×msüyìš¾n‡Aîýõ¥^Ÿ>¥Mwûî0¨Öû·Þ¸W©Äµu[‹¼èyF*miªnú𫪱Qª?Cô!Ÿ—©ž—Ùöé¦dv^Õ½Ôžö"eevãñ›ª¡³¿àÏ1ßNéO¼vü⑇ŎwÆç½4m*g]^•z,nŒÌùžf¤Ò–v>`ïUŸE$±~‘Äß~úz÷áI5f8)ž¯?gò¬½¦?¾—Û~8Iäã?øúãá÷u­š?¾þ|7VíhúvRwü‘ pDÑ{82¹áï|¤ÏMÃh8ƒú}nލޱ;pGgŠ÷ ¯ô ®gúÎã×#õg§å£0åS¬1ôÕ΄±óxxDÕpDÁ<7üLc º„¨ñ à¾5p8gmzÆÜðw  Ðí Ï,ÍMGuºsÓÆ¹ ÒØ ¸ ÏÁMžÂJ¸ilópÖÖ˜›°Ç”Ä8“€ìãXS˜3 D È| ·&õæö€¯kW+QZc¶  üÇÚËúAÒv¨!-<7¼†ônàŽö€1ø¶à3Ø0øì×bÚገîk‹ËN,í8tˆäÀYkaÁëÁò€1·€íÁˆÊ¬,]DãB¬óáèPÆJñid✽^F‡¶:‹Uø7«À»àl¯s¢Æ²`Ft‚ãö?ƒù™áÈÎåg]T:ô*A:°ìÁÇ^0?cY^J:Þ†m|Žv„Ïp,NF‡ÃÏ¥v‡uÚ7v>+‰ ŒyäS@?cª`xæØF|§… ¼oœ¹­\ovõ˜Eo²$œhÔ˜ç xT žaɱ9¾ Uèi3·iä™U MºfGš¼ÙfNhGš¬ÄZ=!ZwnÚ87ÝÒ„íX 7 ;Ò$ÑšÚ‘&;ÒD\niÒëm#MßÁ³Æ+eä38ñOÙèð61(;ö`ÇpWàÆJ6>ß\Z®7zvuk–ë!‡e¥ªÁûÆà™÷ƒì“Ý·"û8Z|×®«Ö®E%~—‚h¹5¼[À›õ81[Ž6✜fàÙ1oâœRÀcÀœ¶Ÿf3àKsàçwd†ô¾•¢åu`6ú±4fƒE—œŒ¶pì§°"9xnŒXjÀfb¬4P„bUO‚ùËŽ «Üð3R’0n!ÿ<#Ŷ<Ë)ˆL ždÇFíØ¨°v,iI íŽæx5²Í,æa£¶éé¯ÃcúO’¨v<‰°Z{fm4{f-FÂÉfÖ4®aŒ¼ŸÌšì¾í™µzϬ…õá fÖÆ6OfmùøtÑ]ì#¬œ=;R,;R*oXª>"~[!Œ¹{”⦰RS?³’º\ b¾­ŒÔI¸ßUZ W7·qí¦j¦yväànX_ÕàÈ^½µsŸu_f½škß}rŸuß®¼·Ã™éí‘‚ÏØGÌ\ñîù“Ü·â ÀïyS£œ $ 5Æ¿ÕÀ‘(<ü žøÞBñ[=’.ŠÑ}ïr®lÚ‹R,ü°ÅƧ1.ýã˜ó YížU¼Äô¥žyÁùjw¾nó¦÷ÿ)fs‚ÀÉ¢ZlØYéók±pÄ[P XÖÇ‹kZ‡d”{csŸµáh¥ª¶éN¢̘ñú>ðaL&¢ÔW1o8ºvT@vàÕà½ÁëœS)0ŸÑ‚´Êén×·ZEÄä¦f’äÆÑÍ#´Á%¶Â<ЧDÑߘšàÆúûèî4ž4fh–—Gši t5qmGÛè‘» üñªßMÜÒ_¸åbw×õÛi¾ØÐîH}^´]Ù«<ÐŸÑ >3¢gšé¨”©úi_žù„Þfu¦ª«¶Ó×­«Ì3©D½ÍàݱAªÑÎÜl(ëÚÈ™“t7M.f=Ž<•â¹ágà)XçÚ)àïôp¯Ð ðÉ©R¡,­ÎøÅKyïEQb¥Np/8Ö„D& ˜±ménÞ a DÂkž1íäœÄnðeèEä@±¡BÂz“žraçÚŸŠ„÷(ûŠ_òÓÌKñ©9lïÍÈCÎ¥˜ûØ[#sPN™Þ¹BÝÚ C5Œõ[&eí66$9»Œ7UÖ,¬_8±Ó„Ï¼à ¨(ïYQ¯"%#É‹\,µOs2.¥·}žZñ^†§È0ƒdv@Ê QD0rD¥XØ‘û¢kãŒÊiT®r*žŽ…„И9k7 ç½  8‚j"è7Ï%‰Ï¦Kæ^ x¯—[~×CKó\˜’:I1°)±_Fâ‚"’Er›˜% ö ò€ÚT¸hpVÄ~ci§X_1£P0µr¤ÇÅ „z(VîGa ³)!h°m2NA6‰¦t ÆCàD½—pÜØãÈÏ3<²¬Ø•¼è²vè\ÁÃh©`w1£€ìTëγLL“ã#ùVlù€Zg“ð/¶í,Ɋåų@"ÒeÞ¡ó¨˜C zÉÃ+Üq”ØiÓ@ÃQó4·ÃÜûVÏÓÛûJµeÜt¥Gg×9j;Âi‰7î¼oó6-T‡…’ÜÞp„—ˆù?¯¯–.‘ 輬x(p’&“À$Á5ΡlBã†ÏCt½„©H)aFØ0H ¥ŽLHzáÕL;”ûÊýN5îܱ£Ïè”ß²êZí®`{!€ü8b=^l åqÄ |"XÍt¨ª9./#;¾÷=á{ß.šefªPçX¡³¤$ªgkJCR!qž·&6e§¦ä.âkYYØì¶åŽ3ÌQßeß4þÒ<QT¬ˆ¿ޏu”Gc7ÊÇHŸC+pÇ"89o¸µP—–5«“Åá®)B;ÄŸ·”¼@®,f~=µR¯m}B53H´Kñ{4NˆzÆçÊÏq{V¬°q<uK­e „eRt%£%Ap€›sFœeUëJê"Íз­£2Aͪ‰(Ù ‘]ç„ôÞ<£/Y)ªeq cÓ¸\PèNHVC[Æåuö⊳¿Ùuó¼¸4ŽbyHäjûDåØöC" /IDæÌöÕø™ã(J”0&)qs¬ÁaŒ2ý=×çËty¡>lX'õ³e´0žvاØD°zõ\FϦöj36[˜ ¡ž¦wÔM’&ä–Ïr Êœ¾aKƒD8¼ÈiP¼i»§ò(ž¨=.QÀ’$% ñšW2 ‘Ö&6"¶7ò+à¡^.‚Û’i7(Ìà´raÜ•ù˜|If@ÝM@ßöÒ½†´L iNÍÐôV {™ê{-S]­Oª!\3lk5¤½Üì5¤~ i£ÏÛ³‚Ò>ƒ«$§==®ñbÉØý¿Rψk:•Uk~Ý$üràm-š®7 Ôg2æVÃZXÎ =–:ûÊxýùáÜ»ƒ¿#{ ø;Œj\\‘˜®H6Öpñ*’9T¨o†•µXm/0¦] × W<‚« 1½Â‘Fe7_'Útê-I]»ž“Ðs”‘cäF(–K™š4™ÐvS‚í}[¥Í2·l,Vœ)@Üæ¼Ú3Æ›äÄ`j»Íƒ5x±-œ«r¿ëýE(F¯=°¨J =ÝüÝ…[”"_³•(”¦ „€ÞR˜ƒm÷HZþžì½]’¥‰8cèߊîz¶fk¶ø#ç]ÒÊ5Y7]ÆwJáÜ> r·‹8XÔBÜamȘ]¾Ä-\7WÀ‘îÇùý¡×‰È-…tD.$¼àóÕ_À–kÅKz €ÛC;‰;¯-1@5¯IRð)”Ô1í= °CZ*o"͘ƕVçºÿn•Žà.M‚Ϩ¹$œ°#:¾“Fæi‰íEòÒÎ%TðB;øLqªµÏÈRâ=cnx¿ Î-Pô÷‘N£x=Ó5.úƒo ̾Íà=€iz»o9±ü£žã¹Ì—ÙRl÷¥¢5IMGzR’™:ò1.õ`噲À´ ´83£ËÑ·åeî9FÖ{µ_ñ(ö­\îqx«6·£X(Íphòô–}¼¼¶åWŒ#ksó}¼¬W·Îª 4O«Çë;M‹xpš(¥ÀŒãå\R!Ê;w¯‹š×ï 'Á^zòf®u-Ç—a”1œ‹5h”„Žêküî.]£H¾5¥²r()—=ÍCb–º†Jh‘§úN¢Ö²UÎÊó¢-¥(ŒE­rrcTR¢d„&e„2†<¾v ö«OŽ_ßï/"`Hè3(ÙÃoq)€%Êc$ÔD¶‘à?—ío•©L4Nˆ°Z9Ócëj Fº‘ROW¦[&Q<Ò< ¬¿žÓìî݉%¹°ÌŒ'ÜÕçî G­÷æ gÎrl²/6«”@±¢)o‘¼N–‹C(F=Žºœ/ð¡ ’g5β7…Â=!×P5´ƒ£VP½ºFT2ŽÂâôÖ†AR;]Ѻ@É"¡Š#O%§—U‚#‘”]1Ÿ—BH ²­PÕp³íÅ(/š…ÒØ@| :þÎÆ…¼¥~¹{û.OµË—ÑvºŸ?Cv2ß6P¨É !PÍñxyCLx—¦ ½ûz[»V¦ sF>Ö}ï0²làt“‘͈´ÕR]öç–ÆNÀ÷ñ×X*ÕøŒcºKtè§HÈÒNYBï/áh<§ä©^¡4ÉZ¯DXÒ«éíšë¹³!O%i–ÛV¬%S`&IYáÌé—Õ´M\Í ŸË¥ëË\0¥9ÛYÙÆa/RˆàÔ°ªÞe `ì‹vܓȯfNÒÎWq¸„g¹­-àƒŠbj)ùC–'æ…kÍâíCBtÜ6ïÑÕD¦<^q˜!©‹àÔä¼4!çÝ×mëj¥Ì¿ÀÁp4N¢Óápº°öÊÝ!S¦«Wçë©l/0¥_;ºcw·sÉãõ?Ý2-R¿R&÷µ©ßöïÒÞìߘÊL1bã]Õy]­jøÌÓüBìõçÃy‚ Rö„ÇÁý ·ÔÀ´;8"vïñŒÿxâÁ7Û…xIqxDlN lù)m°.›¼Ox¶†=¨I ÿ0ª,—/¾£$k²„ ÁG8û̆½ùë¡Vj–µJY¹JBÖg?^›d)u.Ô¸7s¿ŸbMiû±ykˆ 5¥­;ú3x¸½ks1Gûèf®–T[M¬àY”×ZÃŽ–$›h 4€Å3€-hggßæÌåêÜÌš†½á$ ì&êE.­r¢²$»>Õ0y/Ùÿg;ãjî‡x$ÜFÒ{æãY¬Û)½Œ`ßùòVJÝáã­Ï(þúúµO8ZŸt§]s«*a=Uò–¨¤ˆÐ<À‘ÒÒ¯°•“¥1ÙÊÊFwc ztDˆw—Öp߀oÚ·f-y{ê0v®HÍd«]Ça…Ý2u§Lé–±&SÇMrNßkü¸ìì)·IÀ5qO³àÁ˜^â*­Ì¥¼‹cËo£ÑF2mçòÄ­Úò« ïÜüEÞ·l¹6½§Dðm«ðV×z„#ÑÖݲ÷ÊÖŽ<¹Áõ˜šþ6¼ùm„N5îùzüK€Gcó•£Åã+Ò 4é\FØ /JæÓ =| /âÆÌƒa–ÒÝó:€U#”Ò¢“ÀÀ½"…‰L˜H%ßÌ(à v#Zë­X¾Ùu:+Í.¢ñþüb)"1‹¶Xª• ¥™ƒV}ºcH3Ûª ¯ÕÝO˜öãÞΛ¯œh@ õæeÝÇ߇ïǪîyÂöo¿VìoUý²UŸƒ›|tYÔÔq×êÎFÕME#SŸñE6qÛuUw];MåËÄüº¯úëñ’þÊÈÄžÆTzt¨Ö¬l«n">÷Ø®}g€ÏŒð™Éëèu¥kó±þ ¾mâØ×óÿ­5‰®¬ð =c çk# ­ÃJÚ3öÄ(k·s{f€ª;ý¬[uî@i£kßûÈ L;˜,]k®í•íWhï¹né#ø40=h¼;ŠÇÉ¡;¸ë2^[é½u CÝUêd;d†7`ÿZâ JûÃç»ÿíRÆZ endstream endobj 3801 0 obj 5412 endobj 3805 0 obj [215 /XYZ 40.7999999 330.259999 0] endobj 3806 0 obj [215 /XYZ 40.7999999 330.259999 0] endobj 3804 0 obj << /Type /Page /Parent 2 0 R /Contents 3807 0 R /Resources 3809 0 R /Annots 3810 0 R /MediaBox [0 0 595 842] >> endobj 3809 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3810 0 obj [ ] endobj 3807 0 obj << /Length 3808 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň( x=ë90l ‡ ‡À›M°È.âì!?ꑺ=CöÇG±HImÙ€§=lQd±ª¾ªb±øæÿ~þçoç7ï>þçüyùùîã©mZÓÎΗ¿ß½ü…%çýÐ5r¼ü9þåôåüåôáôaú÷ËI˜ç—Sãõs‡¿}þõôf~ùiþÍÇwž>ýï,Ïšþ÷óù¯›~ü¸ôwùÂ/§a4—ÿž?)ä0ýçå§Kã¿NùÝù×iÃs¿—¿“¦í;™7Ž/·GÅóß—¢—µg%»QOCÓ/D7‘ã¿ÿ8ý4õvF3j!z£û6º×^^º†ñ<ö欺ÎéÔ™[\W"³##µbéèyD"oj¢Õ½¿«fÐJ¨^vú² —%˜¾,§Ï½Zþ¤L}ÔórL²KÅ¥«ìå0£dZ×iD"ojËrxº¢JBߪ™^²Í%ý­«\ŠõRóþyD"oj é=]‘I¯±~È赫lŠMBÌÓÑeD"ojWÒ;]}`(ù ¾xüþÓéÍ{¡ÕpÁãO?M#yõùǧiºÝù» PMŠðÓçß·­zÿ‡ó§ŸOcÓªïf+`niŸ`Ë÷¨Eô¨EÂgZ8a`‹†-ø=¡–>MkUœò“¢Q^Õi…¸Rî-¤Ï©=Àõ†ÏàõÆ<‚ùŠÂ#Î4ƒ{îµÀQ·"0¶:k¯Ú0/>UÂZéàŇäEÑšà:¶?¤c^“¿G¥ó…+<‹ið.ý=5‘FÈ.ŒÞ°Åÿ¡–:³Ó:cvÏOŸdºÎ÷ð<‘£r8‰"[LÅ«å–TŒ¶p…=¼ŒQ"3˜/!r’( -…e³ÖÊÁÞ–™±¢Ì 2ƒÿkÚ¸²k¼U–ÑK ÃF0ÝÎèõká¢é´¦áØŒÝ7-0†˜¯Îh×5J“Åòr®ø™™ ºÑsCÔf‰2Ã]LÓÝË„yÙ½Jƒ&Ú«×Eoßnq:‘oáºu°{~ ¿ b)HgZö/0õDEüW_#2•<À \gÞúêb¼#ùÞ˜"¬6¯j 6<öþ)ô^£¢F™ßÐcaÏû¬kâ‘:‚ýJŠÖ㈶º ‘9Š×I¡¨ç=غǣƲÉ*žÊ{àL%…q\K#›MÖº½úÊ[i}³û±¶ªÄ¿Xº|¥á ŽâóFrñ{6"&“.?¸œÈå”}´õãÊ›—ÚñºïºuíTØG\_¿ö¨qo‡~9ôË®õK×uÁµ__jy­Oþeÿ‘ 3Çnm·W;hHQ…ŸÁ{cÎÁ|°º¶Ãcó´²@’­¡…!à¨Þ“ÆB, mI‰7ÂQKl-àùTŠøSÉ£](ú€0‚ªöJŸ“Ë…±ÚƒâPf0~¨×Þé#HÅ^!IS¥\–ØÄcN–eÇ‹„ÂXÃa¤#p3jñÒ­._Vá>#rò¥˜÷æ0‚°FX0¿à±ao‘²{ëA7ž³‡:îÃÏTåK%2¸Ï#Ý„3f$&`ÿúö2ÅCôDX{úû´¶aI˜.Gco:"GÈ™ ilÌÿ8Ûk¼ ߌ¤%cm™1cû§Z>t/¯îƒº co:ó*7';';Ëì^¼ÚþÞ„\`RÖ5ÌîÆéО¼oœkÌ’‡ iáI»Nx1NÈvV´µ3Â¤êø mLigžôù&íi–Z>Ewâf¯sHHäw~¡•½8œ½/(·ôXdÃ÷ôêœ,|[R•wÒÒå&¶Û=V¿X‡Ãî ”qÉçð¹k  …q€0aÞsF_» éBC`È9o´ÜPð5Z;¬wHËEDç5˜+)¢ëPÀy_ŠÙ¹`mÿ‚böeá]¨×‚Ø1 ÆÂ—E°oD9"9;¨B^9#†ê "Áy0á\‹rHP¾YþN¾Ê©à—ÞŽ9¶L–-³aßDkh‘ [åt5¨À‘}÷zÜ ¯DÑ%ÝÙ¯ìJϲS÷_ƒu·8¹:R7B.@c1+ Ã¥´ ‹ªKNñkaŽÛ~–t¬’J«†§,à xÔhFø‚T‘¡2/`°c˜àRÜhKë®FË”˜ÅbÉQvxЄèmŽ ÿ”Ñ1ž~¼’²ñßGrtœ´5º÷žøÂ,®0%ì(a&gÝ/ÂÝŭ$ÍÛã¯âYàuˉ $l£Pê%hJ³á—g#|lmÇ¡rž{Ax;aÏÍaQ§<VU–£—ÑËñ ÅB 2„¸T–~MÞzñ‡ñV¹î-š†kW”Ó2ˆÜݶ|¥Mƒœ;Dü‚|?ÑËfü Ã<%رÁ*•b ÞfkÖPw„»Gâ„„°Ë‘"Yù#Xl P†µE¤ï˜жR6mŠäuQØCÞK"Ȇ˜¼ \q¼O0,\”•à}å$%èZ(´Z§.®«…ÙLÇôŠ×º–ù>ÈÛ4óŒb˜j› $£eOÛX ®Ížrñè»ce£R‹ù7pè[+ÚWP·©ÁVn.EØ w,™½è¼Ÿ1ã¿ÂNà J–ÙIšõªhÓ‹Wàƒ³uÅl?}%YD î ÃÞ ¹QsL<±°%‡¨ÆÖ:Ï[ÂÑ£·Å“ÓA .‡;àpÒxÊ14–&GLÂU2¬¾W„cêð)eÏïúÚæËÁ±œ\O¨ ó %xʱ%˜¢ÊëG`ÇÎ6ߪ§Do/:…'i8Cc+uò:u6'œ(iˆåä^`z­ǶÃ⋈îÚKŒ%‚oš:Ž-g\0ÍZjiKÉhs­´…Ã@®…-n¯ä¯'Ô²Ä÷îñ—Ó=üªÂŒý.Ûý{h”­uðLö{ÛbxAàd•£ûàWÖ{‘;¡®óÁÓYªÑ¤±a¢‹’¿§¹íÑ{(lKÇ"Þ÷«¢;N¬Šíö0—£²9psž ð{Šl“â)–|Â6 orm‡!!BÄ™"II²å­³°â¹Ó^:*d*çeÌ Š9jQÈMØtËʲ©üû@ŒÙp…ó9¥¹LI#™/ó¤ÿÂ…ÓaRp‘BðE³C—|áJ-¿’L… ¹^†ãš áHg ±î l‚Æ«ú Ò*ÉÒ&rVc™úUEb¶žŠ?2éH…g“ˆø?[øÙº1I“ {Y‡SÖÅUeFK,qSæ+QàyŒb¤gl]ú{D\üŒ„¸ÊWn;çµV|Y[ŒwCƒ³Ù5¶·WÞÒ,ÚùÏö°[Ú«Fê;»Å¤?#žà3#|f–2¡šÞÚ ÿjÚ½- @´ÍÖptbß(œ4zÖ„n¬ í=¸7¶XdÀ&õíB`¸%¡v ,DÊædV²zB°*á$vnquÖÔé=U›àHIOéÄ! ofC|å°”Ì']a3•¼X¢º¤ÜÔpt5çˆFÝ Ó²¶¡îµ… iç½¾ƒt¹ ´Aƒ×Ê”,'e Co4V+¡rDÂr”VIQTìuŠÅk×Â… +i!=ÏB6Ãbp“,¤„ð8æ Žð©˜î>þÅEóâ¢X*á¼<åâ ){ÒÆ®œ‚Ô)VÇß|VæWü˜Iò^t‘(&žÈk¼.ÜÖ¶tolÄy¬ä¬Â‰ŒEìý‡7]w¬Rh—µb=~KŠ7i}s7Í>¦ú,ˆ@£´}ž÷<ž™*Gwxb +ó+xºF@²ÄS¿æåtZÄòÁœÅ4;P®Fašç˜éYµWÇw)Ì`LcîoÄŽº™)ó¢ef)Ù7ýý4ÒþN˼lJ5r¼[ ªë3Ç.¾¶ôð=|f„Ï̬ÛËF¶êÒd3è½Þf}ù›'øÝ%ätg†ïÑ3K\ä^‹@óX é´g–K™û2¶gÈàºËgÙ‰þµÞ{ß[`ÞÁ|°ðµtøZfÀá¥ÆgÔöç§ÿ£„— endstream endobj 3808 0 obj 4431 endobj 3812 0 obj [216 /XYZ 40.7999999 114.259999 0] endobj 3813 0 obj [216 /XYZ 40.7999999 696.019999 0] endobj 3814 0 obj [216 /XYZ 40.7999999 114.259999 0] endobj 3815 0 obj [216 /XYZ 40.7999999 696.019999 0] endobj 3811 0 obj << /Type /Page /Parent 2 0 R /Contents 3816 0 R /Resources 3818 0 R /Annots 3819 0 R /MediaBox [0 0 595 842] >> endobj 3818 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3819 0 obj [ ] endobj 3816 0 obj << /Length 3817 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÑˆOQ@`Æž Cc ääÌf,2‹8{ÈßÚR·Û¢>Š,•Ø’M{Ìæ«XoV?þñÛßÿüíøñîێ߇ŸwßuUÛºÿ:ž¾?\ÿAºJÉþׯ™J¶§¯ã÷‡§ãÓááðÐýûtö¹ãð£kŽ0F-úkziÒûØ‚û(IX>܇7Ê~´Hï³Ï ON` ¤H 5ºgý"ARg;¶SA_ëm¸e‘¯­ÌkI¾ã*Þ/â#ǸÆsØ ZÝaû$øS„àe“‹·Ÿ ïÜÔóéÔˆ¹g纻¾5+š6‰ÉlYÓfÕ6s£–À×v¬w‘±@•`­F öá¼ô È@Š[>þ¦}e‹vE!Õj1¶@(hy…ö 혛IT·ºº2˜¢ÚÍÖÕO7XÙ¡ íO¶³vçU®Žø¨òì,‚ýá#"‡ã5ÁªI1!šDD*,‘ ·¹Î×0¢è`~øÑìÅk‚ø½Y‘±(eGœ¥ˆn“ɶ¸µiÈ仄å¡OsÜJ²„cDxÂ(&Û̓Ù<íóá×;‡_+…•pp ¦SÔ"ß¾QMÚ¾q2Ãóà´%¸ŠFIî ¤ RZp:DFÌvªß7l¡¤URÒ›nŸÈ€L£ªaR ^µÂ”é —‡œ‡—QRIå3Øâº"(ø”HE&`EàL6Œ±û¶ ^ŒÅr\â亜XÞœ‹ Ádyf½Dµì45­5#´Lryíòîi¥‡/ù°®u\¿¹Ðh¾fƒˆë˜Ý". @Ñ2£±Ú ¦0 'Þ³–; $ø³Z2xžM”vµ;ÀræÒ»ˆÇŠ]D+±(J†WûàÓ&$ý‘Zð<˜GÜ!A'àWÃV aÅÀÅ7ð p%¸l=Qh®Æ-¸ôÆQ¼‚|¬BHÛÍ*ßí›1 à>„´è€ %V(6K<Á(x±Æ˜Ÿ#ųÍZP+·L^÷¬Ø×.ò¶R¸'¥œ«Ðrv-ï æpi@òRÏÑ΂—B4 °oÓö&Æ lUR° cã–mxD£÷pÂÅ£ðæî­ŠGaÛ…-ãN:i_< oÏ£ÀŠûõ(ˆV­¢õ¤ÄÌ£q9[Eˆ:(¼3ˆ±¬¶ç–÷³ [ ¹ oÔ^}¡ÛðSI%àeñS?ÕJxi–`_€îñ=(Å2`Õ™no3¢Å°'‡ðÐLÑ·­7nD›²+ÝíÝÞǹK/vàÞ O£ÇElFûȳo+Þ0ë}ïn[‡5*?ã¶K‹3W-߬:©»Ìš“K·íλp«-À­p«mçåäV8ßÐ,xC)ÏJUóî(•™ÃñV™ÃQÅ…ûî»w×ãåý¹œüߨå{ȳҗØÁwÃ+І[xìæ±yøF{¾#Ú:‡sbÌH>¯i·vjC˜k.)t$¯û¯€¶¨¥>‡€6fÜbÓû¼°N¯O‹ú O° YÙF¼J¿BˆE]+_£Î=lé C˜ªôÈÌUzˆ\íT‹Dû"Úm¥úi®Zzä5•´ýâ&ÈÙ îT°=‹;“²ÖÖ#_ÖTæ|ôäå`Ƈ}ÆáÍß× L'%'ð¾P» ªÝã8’èGïsdñd1Í#úQå)yñ™¹mžS2+q6!ÓkÑÆs$ufǵ1jÜ€§k²rãñòÂß_\;ý’mèO¯ "i(>CÃGr/K‹Â» Ë’xÍšMT$ìí%¬‡Þès…V”&ÎyÒ„Pq ‚1¯[²bê)9¹ ©›x‰7›êãai ‰„óiñ %„b ¹Õõªd31KÔª„„Ï1$ªL žÈ_ÒÃ&ªŽö-9_3ÞF§äÜú˜šÉ'0Ï» œ]êÚ7L?Võ˜ZNg*nʤ\ò›g7ãE¯ÃZVò%¨ƒ5ŸHä/'yB1ÔpË’ôxÎÊë”IÉÅæ—(‰~Њ½]`59¾ŽZ.†0†Íl¡EE#Û‘¨Ð_Tó€ÛcVõ ¦Š‘QŠ7±ÃŽ%Œ×³š~¿=†)!<=›‡btåáSVöà Vgû d‘Pð‰-'aÎB½”w¯û-N™pý s†ÜK ¾øý ¹“„j83Þ]¦§é¸8g.xE4VŽ!å¡íU%¢îûøÔÍÖ v`øñýG`zÝõ˺‚+v‚±GÑÁrÊàk…­ú¸ uIMðßÚÊNKËVWàŠC6U3m-5-=Ñ+UÉv²¾¯1•í mÌ ¦æq°O ûôßÈJÖÏÁ(cª­ÇŠë¿ÜÃÏ^¼‰~E}Ž;Õ"Ð>&™Ög8±”½k{&€Xwú]qñ1h8ß'`ÜÁx0àµôðZÜ#Å0—&½ŸÆ‰¡CÁxŒ‘¼ƒûô”©Þ±`—sµ­Ä)`a„fø¯BÈ8¹ýñáðïŸ} endstream endobj 3817 0 obj 3551 endobj 3821 0 obj [217 /XYZ 40.7999999 254.419999 0] endobj 3822 0 obj [217 /XYZ 40.7999999 254.419999 0] endobj 3820 0 obj << /Type /Page /Parent 2 0 R /Contents 3823 0 R /Resources 3825 0 R /Annots 3826 0 R /MediaBox [0 0 595 842] >> endobj 3825 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3826 0 obj [ ] endobj 3823 0 obj << /Length 3824 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ù%Áž‡äÀ°‚ïn‚E¼ÈdùûQ·Ô=3,}¤X¢ØênÚ€gÜlñQ¯¯ªH–>üéË?öÿü}ÿáñËö߯Ÿ_v¢V ö‡¿?¼ý@µ•VïM[Wª;üÙû¾{Ù¿ì>ï>÷ÿ¾ì¤=>8þèOC þþí·Ý‡aðÝðÉ—Ç¿ô¿ýo¯öîÿ÷ëþoïü4öwøÂ÷]ÛÙÃ/ÿ~‘Jª¶ÿÏÛßÿÚýõûßú)´Ç~ÿþ ¬–McÍãåü¨<þ}û(Lìµj»Fí¥Tý<ëžÿýy÷KßÛyUg¤l¬iÄì^ûþ´êDgö]ÿ”†tJÖ6³«¥)Ѥéè0#¹liR˜ÆßUÕ-u£js`ÃuÛªþ÷Fb–^·Ç¥«~Ô¥T»ZLÅZ¤âk?#¹li'và®ØšP×õ°ÌN,¦Ø©«¥5&é3’Ë–v"=î*©&4Ý@Ce©µ‹¥b—„Zô蕈¯Ý†‹–vb Z¨º;.ÓÔ ÐkW‹IßÈD<<ÌH.[Ú@ú‰®>'ñÔ«¿ðâyðáëîçîà}ý¥ŸÆÑÁ~|ý¾3ýNCÛ·þ´ÿ£ºùqÿõ×]W5¶¶ª>zdC‹ZÚóR¸ÈãRUF7µxûìã±Å¼~µuŸUÇšJtγrל:xv"†ñl¥dšîäùØR÷i+ßÓ?ѽûUõ쮯F¤¶¸½z¾Š×‡Öh9êiþì9$ ì|æcâ(Wüñ¤Õ'÷«dH5Ï*ÈÂò2_Ö<Ì!ãr¤>ÃQ|Ü›ªáŠñ86DXjh°Dͧ£4Áqç ’¹ç¯=Ú¬„Ö$VÝ#*AF‰ÁæHQÙæÈ™s‹þÇÃÏ<ŒX(¤ƒ…¸…N ’@»ü—»>à`Ñä-!9‘âwÁ„á*‚& 3‡Z¿a)«ÚØ÷_e,jîW Ò«~šO,ŒŘ6PÄ<ºKät>¾‘Ic§ÑÓ2ß.› Ì1I”)KHAèÊÀÓ°ÆÒX¸„–·"Þt$X!жD0<ìàé*FÁÓ« ûT†®{¶×ô*ŽLîú5/ñ•1Ô¥ˆŒFš±;ç23ŒFX3l€°ˆ·6Etwóñ‰G˜×Az6í—XUÚY„xD˜L†ÃîøtΊ¦RÛÚ±•”ü8Ia!ÿç;o”CØþAjǤ<æ§¹<ë#«ÀÂ3?£™d¼ˆèÑC5„ƒšU¿¢ôo8HÕ“&òÞ”hØêÎw!b\×ÌéËGèùŒPnÏ"Ð$yT8‰Èć#úPg+¢K«¤ƒ.1ùå”iÐ?cWÒŒg“hƶfwدŠHÁÏ´q°`yià•!¯T<³…ÀJ…åDˆiU#¥„²ø’v³㈋[14¹MŸÉ#tÀ›ZQ%”n\$_Ö§™³\ C|áj¦=GòU"ÐĽ.òAL:ÅžÅËi*La„a$õÂ9ü>b#”[·«SÒ+½Äù; Ôü®’Û‹qÒBÁåŠFÝšÖ5ê˜SI’äÄñ%.yD¨Î)tЂ݄±‹ öÞîÄ+kï‹Dd`°—Í0i“×3ÎÏDs™rOó±‰j(ñ¶9H뚈µUu¹S•!45[qxÖ„§ÎYkÚ}°ˆsÀƸÅãè –ÑšbL‡ò¶e-a¡0N.âYsü'ά±Ö_¥ÅDz£ÒëñÆ.îÅâ¹Ýšíåp§GqoY}Û\µ+>ArŸ ÓæTAþ‚üY‘ÿÆ|Ýâ-\«U¾EoÁˆ:(±—·%#~ƒñ¤[ì%#>ê³:mØß‘>ßÎ\^›0j±råœE9uÆè¢3Egê >€V"æÔºP"ækłߞí½É¸Øª Ä^ÞŸ`Û>>ø]|‚â\¯OË×->ÁµÚÞ›ô Z\ÃÍ]†©õyƒm‹/òƒï±”"¥º–"¥èƒ ·²˜ˆºQïU Êœ²nÆbׂãÂ@À@ȹ¤0„À3 ­hÞ Ú”Ó¯gÀ£g RÞp ôâî„Ç Jº¹æq†¡”ãË8ž 8g)Á¯4vûñ 8-IÔ²f€µV‘X°£g€·ŸÒÞ¨O\o#ãýo«lp¦Å;xÅvðâÇ ‹íôÚ΋ó'«½5up¦ÅÞ{{Åö6W ­bU7PÉ,«í´&8Ÿb;‹í¼^Û™­ž\±¨ê—Õv¶:¨ÅvÛYlçØæO±[¨ù™Ñv6B5£ØÎb;‹í׃wÆ‹íÜ@M⬶SÝᑪæµbkô{Ó²p¥•¹O±\oIÙÖÜa¹r~ èKIÙ5ôÙžN<Ü>k¼|Ïí*ËûágJlàm)çÈ<@b«zq4º» ,y0§½¿"LÀœ‹Ÿ,*8UÎùl+ØvËØÖ‰û+H¶lÛp1à‚`Ì–rr²àTÁ©µpÊÜaÁŸ’ÇßB¿Â]CŸíigù~ôùò~ç–K¿“×RN¿³ø«áT{µàÔ•âTÚrx§¶€S÷s¿àTÁ©8ÕÝß«¶o §Ò–#.8µœºŸÛ§ N…pJÔ8Hùë»QÒ/º›Z´²Ã¢»s™¶³ðŠáÏ„P¹-ãå S5µÛbãŸy-àIžéà3ƒ9ºjä¡V,1meÔüið€Zd²KOÞË?º·‰ú=¡æÔSö·%U}OŒ‰¨3<Úv©NM3žÁõŒ×@&¥¤ƒEŸ# *ÓgácêR»½âÒÙ˜]Fâ2ɤ,3¬µLéJH1ÜÖ’¢²ƒVR\olmß÷JÊ@ÛùÀsÅ”Æ2MHáòO?Áñ°|r:‰©C= §­F{åSb¬.ÕH©õÑ…k ’Ñ®0D(ÙüuFhǪ U¬iåuÍ<.„Î0®Ô ùﱺóåÎC~X5>Âøxd”|ÕUl¢“3„®†¶§ Î1SX%pËHLaj0Ë Å)ƒb!•êy;D´“Ãj+ñjÂÏÂÅ€ ÖB(G›g08¡Ÿ´¢9nkå˜cÊKŽ[ñ‘K+8éÌã’íYòêÆëS8¯ Ë*e9C<Žúåß”—1Ç!¼­ÏÇ®N¹$P ‘Ä—LÒIJÜŠxOØ­ã(Çô»Ê f(GŸñ›¡È¤z¬ž¦ÍÅŠª¡Œvtƒz%Da9üàx™j4_òWÒEŽ÷“”ZS¿Ä— ;žWfq2Kd<Œ‡‹0ˆÛÍE8ðR`ËHlnœƒ%¤Zƒ!šG<Ö ÀiâëalzÏz;žõ¢ŒCÊ7?z¢yØbžãIU¸‚süCŒ›Q „ãXqò†NbÃÆ¥úÔ-ˆ-ÙQ‹p 9<N %3„ºöt".Æ rœ#lì8·óÁ•Ò:Ä]yèFs^T-ÂûDñoqNçż²¸ÍqÖ9ˆð‚ Èn+'iÌÈàxðdªQqY²y<©­ÚN8  Ç§ˆ4ÀäÔ+Q Æf,ËáYr&…ã)1Œ€¤%ÑÊ™[`qW ºÑ|ŠÉ•‡>wrÅE òí@a R7—.Yv\1fÃ<"Wá,¾ùJ1tÅégÎñ#FŠ.—¼döe2D<½î9ˆs1/å‚ÁtÛ„ÅòÒžùjXÝib|Áñ<ÏO¢;|¬+É©–U|†%g³pPçW–œn-ÐÒ"ÌÏ‘z¬À¥ãð4‚˜âdå¢4'Çpñ'#NbšOÏ•~Cª…±°œ‘ø­I^Љ9—ŠE;éy½wFX9µù—GÆ+ÀSàgN÷¶„tÎ’á– gý»ÆA„ôn)èM}ñIñEfp•(j†¸p7E,È—ùœfIð:¾mDX³à<؆ÏMe¿o·:t€ Þåàl!mØTç½Ü›!œÔÔ ÛÈêR#r@Éò áZª±ï¹UoÈÓ{óÔ>ÕqÆÍÜ,Ñòìjãj0Ik@q* sªÁàêC¸š~«8ç-žÊHœš­¸’¬SÃ÷ÃzÞV€«èà•Â:>žJŽ9¥ÜtAóXLE\… ƒ«½a+‚¹ÅÑŒ¤õ²<ãd´ìÚ¶Áùx*G%­Êî£~÷2®¦‡¥Ë2æ#®¯–´jŸ§9~g5¶<¸äi¾÷±÷rÙ.ªž…Q”!/nYfɲÝ ,¿„ç—lCŸ:¿Yô)ã¨Ö©¶…T [ÌŒêIß’îñ+pÅÄÇgcÓ¾o{Ï Ëò¸tÛÀ»<“Ò ÛåÄtËô9ÎÜ £b/æ6îÍ£Ûœ“Ámyš–ÛžZËØòa?˜¡ Úë·ØÿÝ¿ô°ÓCÊá ãoß=8DL¼Øg/„y ×aµ{Ù/cút'm5Ô!ÕçWžŽ©1k+;}²3Õ@™7-ƒ¨¦j¦·Iš‰–A±µ®Tçl(Žûue‡TækKÇiá3|f¶FUJèCÓkËìm¶·Ÿ<ÁïŽg-&Vø =3ºzS-­ctãž9³öqnGX u‡ßU- mj¼ 9À²ƒå`”kEäZ>!Å4ЍÌ , S‡#ñX"9r×3&¦Vú˜DºÚVØJÎâ8b†‰ÀÑâ'´öûÏ»ÿ—•l endstream endobj 3824 0 obj 3955 endobj 3827 0 obj << /Type /Page /Parent 2 0 R /Contents 3828 0 R /Resources 3830 0 R /Annots 3831 0 R /MediaBox [0 0 595 842] >> endobj 3830 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3831 0 obj [ ] endobj 3828 0 obj << /Length 3829 0 R /Filter /FlateDecode >> stream xœí]Ënã6Ýû+´.0Šø¦€¢À$™è¢@] º(2ƒÎ é,úû•,yâÆ>”}EQ”|“ vB“âãÜïáãêLJߊ?¾W7OýëÍæ*+[u_EûýfÿÒ—Jvo7¥¬Û¯âéóæ¹xÞÜoî›ßÏa·û—&q÷ˆ®À¯O_6WÝÃ7Ýn~nÞý[Èâ§æ¯OÅû_›—}yí>o|mÛ7uo„Ò7ì¿kÿÜüò]ñ¥©‚ß–Ûþ~#­Vu¥GÕãù[V±ýÞÏŠVJUÚûBÙÔÓ4ÝñÏï›MiߪQÖZgµ«N.ÕɶXiê¢v¶ÐÆzжӊc rÂÄ)¨­‘×4Qi.ªôZ å¤Ñí0´C`¼—Í{§ú¯sšnm×tïõènÜ•5² æïXkÛBƵm7 ‡eÝG‘Vù"­ÏŒ×›«;¡•o•ÓãǦ*[ ×½<6 6Å›¦–¦’Åã‡âûªþ‡âñÓ¦.M­œéTb—R½ƒ)·(EX˜?G_YŸ_¡aŠA)úæuÃÏQ×Û”w &&a)†Û SpÿV‚€Ü‹°Õ[˜rS®aÏc\âZÃçØE‘&Xš„µÖÖ¦`,XkÜR,3–¦`žÀs*˜"a{°~Âz"ÑPäkXU'Ôú­ˆS œQd3 p„Yo„ô††:šõFl½å÷5ÖŸ‡Þh¦t½ð±¿å{®Ž ©ÖØÂÚ"–µQÛÁùk»¼½$…Ø6'©-¨Ý[€1†µACl|ŽÄÚVÆÚNÀ<(˜"!þó@¬mS±©‹çÂØ>C¿FCÛŒìqiô\⾸¯°Åþ!â¹:,CyÎËì¯Ó³Nížz›ð©µ–{zJ„6Ô ºÚ6ÀéÐO……(¶¾©ÎkÃíÊê@9t"ãOùh§aL©¤Ò¢ñXž®t©»„“ªÔÉ-¥ð¯pú..œWÿo÷yÑœ‚Y@ýÀ±7iºK×W^øäbö“àoJÜ‹QYVõl`챟Bál)cS1>#Ä,ã­Ž×áhfÀ‡Âþl)®uªÕxäT4«q‚ÔšáHíìH ĸ±œa¼¬Loà‘Óð9OKöíñsp­S¢¼ye”_Ê㮂ÊåµP @9û€4”g‚1%€±¸š4ð¬} ly`¥iÔµi‚¥À¼31ütìì1á€Á K"î%©0»u¸—£âÆÜ)ø§ð𶇂eœ{S¦€s'ð´hÚlÛØ¶] mó»lÛÚ6Æ‘l °'Ï,K4¦l§ØN]œMsÙN%·Sš o1l<ÓbÛ–µmËlÙ^ =”»Ý‚lÓÙÃd{Oض%³m©Æ”íÛ© ´Sv «_y]`H22_(Dµ„µ§‘×®L'‘¼1ÞmKÛmK°Ü3¶°vÀ»»¡÷’ToÈ%¬'fÛD³M¼ÿ¨G¹î«ùQÙ:l`\ŒñIrÁS[߈«7(ñFUU”~ ì{Á¾*Grɉ‹ƒBpiXJRún̹³?çÁ:ïVÞoçQûĽHÚ¿‡å‘²Opæp Aó¢Q0Ÿw‘Íî¹óú !Ê¥s.)©)Ѩ¨ó瀟E˜sÇÕaMJ±:¤S²³`¤súh@ûⓃ ·Šã ”S€HˆMÁ{SÁzK¶Z”6–¹W£—âMQâõ]C±«9,sXð9k”–tIÎS$è’'DKpÊ`Ôxn»[_ ÛÊñä ">‘ãÉOŽŽª@¿Qæ`O^_<9*–On¼‚Á^ŒÑcÍÔ\©âѳŸLyN9û}›‰×Y‡,æÍOj”3ë’5ç—O¢ÌíË< ó$áÒNÄõn> ô"Å;œvDòŒpœ ×€°Ö…=äl|?Ñ ’ù㯋Œ½Fáb4JîüƒÖ¼£ðT,s×F&³š1¶ZŒñ-=Ê=3¹§È 3¹Ñ÷pÀZ/“É«7˜É*fr™É¨3¹[ŸÀTÌäf¥¹˜É¥Ìugܳâð½ÉŸ†–ˆã5–×·t¹\²‘Ì%ïåa.9.Ùè1úŸ¹dæ’'Â¥a.y/eeÌsÉ¡Å>z&¾Œc.y¤e`.ù¸d«–À%3²>k‚gíÌ€0UÌ€02P7f@:ŸÀèÁ^d$¡æbduíYÝÞï'wg¥àÑÀx¸w(ˆÇˆ¤à¶§_òu¬¥7QÐå}eKá„w¯`†;ðz_ãGÔöÅýæ?D7µ endstream endobj 3829 0 obj 2321 endobj 3833 0 obj [219 /XYZ 40.7999999 466.579999 0] endobj 3834 0 obj [219 /XYZ 39.8400000 446.419999 0] endobj 3835 0 obj [219 /XYZ 39.8400000 382.099999 0] endobj 3836 0 obj [219 /XYZ 39.8400000 327.379999 0] endobj 3837 0 obj [219 /XYZ 39.8400000 264.019999 0] endobj 3838 0 obj [219 /XYZ 40.7999999 193.939999 0] endobj 3839 0 obj [219 /XYZ 39.8400000 172.819999 0] endobj 3840 0 obj [219 /XYZ 39.8400000 126.740000 0] endobj 3841 0 obj [219 /XYZ 40.7999999 81.6200000 0] endobj 3842 0 obj [219 /XYZ 39.8400000 327.379999 0] endobj 3843 0 obj [219 /XYZ 39.8400000 264.019999 0] endobj 3844 0 obj [219 /XYZ 40.7999999 193.939999 0] endobj 3845 0 obj [219 /XYZ 39.8400000 172.819999 0] endobj 3846 0 obj [219 /XYZ 39.8400000 126.740000 0] endobj 3847 0 obj [219 /XYZ 40.7999999 466.579999 0] endobj 3848 0 obj [219 /XYZ 40.7999999 81.6200000 0] endobj 3849 0 obj [219 /XYZ 39.8400000 446.419999 0] endobj 3850 0 obj [219 /XYZ 39.8400000 382.099999 0] endobj 3851 0 obj << /Type /Annot /Subtype /Link /Rect [341.279999 138.259999 382.559999 145.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 3832 0 obj << /Type /Page /Parent 2 0 R /Contents 3852 0 R /Resources 3854 0 R /Annots 3855 0 R /MediaBox [0 0 595 842] >> endobj 3854 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3855 0 obj [ 3851 0 R ] endobj 3852 0 obj << /Length 3853 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ERO °äÀ°‚o6Áb½ˆ“Cþ~ºGìžRÅ*)©[c`g¶Ù¢Šd½_|÷ÇÏ?þó¿ÇwOŸÿ}üj?}>”EÙ”ÃÏñüï‡ÛtW=üÙvu¡ûóÏñë·Ã÷ã÷ççÓ¿Tóò ýu¼¼b˜ð¿_;¼^~>ùüôçÓ_ÿ;êãŸNÿ÷Ëñ¯;ýúÉÎwþ·C×7ç?~þPZéîô?·ÿuøË@è^æ=ÿ÷ÝÔMiô,8¾_U/ÿnE/+æ¼UÕQ)}‚³>mÇþqøù4ÛŒ¢«Œ2­®«Óß}SµeÝuúôwkìOÔ›Z}zUÙ6ͱo›£êºÊ{“·àȹfN¤›ª™è"5smª¬Úñ¹>‰ Œ~E™ïß9¼û¨*Ó)äËÏ'P^Èløõå´àúøÃuTwüòÓñ÷e©ª?¿ür苺7m=ÐåÔˆ1h¤ìàHGz8ò#ÑOê÷ô<›Æ°=Ñô‘À)”pDÁ GàÉ)¸•âgðÉA Æ·©‘ç/'*KN3§ßÀÿŽ@”© ®”Ã7*¸ÒÔ uùŽÿŸ)ƒ2*ÎÀÅÏTx=ø|¦ßj: î[à=xäa0$À£ñÉa¾ƒ¥ç—SX²p(«Ä#j ßSâõ`ìåÀ&Š Á³a*É)«û*‰~‹Gˆ ÉZ —9z'C‹ÅTË¢@¨Ía<ÐÞku!ÀgŠ%2ž Žh( °Áõ`í?€o«°”2¹i†¡%äæOø=Ë9”Á Mξx'Þ¼lƒ­/ž—²zI@ûÀ¼\“0l,¿ÃbÆØÇѳ8Ò?“/k•†_b¿Ç:’Õ·›rù÷gú0ºóJô’6‘.¿¼÷s÷þo”;¬Ýû¯u»üß½ÿë– Ø[¾{ÿwïCvïÿîýŸ€m÷þ²ºj’è·äýÇ\h÷þoÔûüÐ2ÁR|÷ñ[^ÓÔ¹)c÷ñï>þi¼ìæDÀwÿîãOƒ—¦LÝ}ü+ðâ=jÈëÐKN -ïãÜ}üåk÷ñ›¶ßþï>þuKH›»÷ñ‡1d÷ñï>þ Øvÿ «û4¬äãçøÆÇoëÁ¾÷ê“kÖ‚YþÁL>8Ô 2–zXT8Öƒw[µG99À•–#~†mÀvÅZ=Ô~8°í‘½µx*ÕNŸÖÙÛ#{¹ñÒÌÉnÙ#{{d/^Ö‰2!öÈÞ |÷Ù›¢¦¥é¬MÓÛ`y›nìm•;¬=²Wµüß#{• {doì…1$À£ô³Göî0²'ŠÛìÕu„fµIÿQÖ]lúÌ»¸{/y>Íñ7îÑÉUkò{trN†GÖœ³Ë#Ûº9¹?{d€¤Á˦L1†v-–ÂÛtðLrɳÍ`ïÆr Ã>«±¤cx§1G <ÃÑ|EõšÀ^c ÁØË±¡8Õò ^Ñwwr˜æ0-ÀÖJ9:ñáÊáZ{t§Ñi2b”ØN èÇpüeÝ5uâŠTåð3rØîˆ5‘«¢­Ý‘†þŒÆÏôèËv”)ZÕG]¢¯‹óµWú͈Fï±ÅÛÂô¥ó ±ÈÛ•v!ÀÏàõ`صJ•Űœ›‘g4‚ßS*8Û0ÒF½ ÜŒ<¡•Z5q øLà=+Þ7Ë\Æð ¿Ç L|Û¨»cj´×1ľ'!s2Mçp'+VT]tê-4®À:nFVmÁŒÊ]½, Õ{í\®úúÁ…1º<4ð =ù ïµ$ñ8¨*êª9£ôëìæ‚Í€ì¯û7PµÒEåŠreé½CØù:}‰^lM[”ž\Ôî.jô>0t#=²\ˆGÇxHˉ÷–ŸÖãïtr©RëÚ+œ$†^;CÊFeMJŽnÅ•¥¢‰³ÒõýzH;möÄØ¤íHá¥"êA°®Y_%ÄK1$ŽlzzB¦Ô×Y‘z‚ê2é㚈H)¹ê;ã wò¹”º>GÃ΋ùZv#X]šô$f”tBdÌ y³)½0_.¿`¢”¤«¯­'*%ñ´åÕ”’X]aìx`E‡ÁÓ„¸„ SpM‰BXí³``Køb lŽÑ_ZLPL;/ĵ+Ы®+¨JàÓ]Ÿ5MñëŒ=FŽ>%Iô¾òÄÖV-Àó,ÞI*?Ž=â½ÀÊC¼-bßl¬f䕯²QçÇî_¸Jì%t¦¬¸€ “k:‘ˆª§ l¦Ä%xÒx¤z†¬opáÉš~éƒÔ]ã ©åÙÁÝEHçDì– y`i<|4No‡÷êÚRdõœ! ½ýÊHN®ÇŸ !$lbÙ«‹'û(ÔÛvG/ «”vüÝ'' µŠØX§ŸÕKX©wïýÕó¦øp,LBµÞÎæW£Ï¥Ì¬G¾dRï, hÓè|g*E®þÕ¦¬® JVøŒø—DÊ¡Dz¼âôÕÔf峈ÄoDÃ|IÒ%#š|l!jãBR ǧ‹á‹HÒ6¹Õ½rIÞH¬á­¿×ò^Ê ¾ð>`ÜkhªÞ]µ{ìV®˜Œ=%¬Ï§=mÓéèÓ¶‘NÎà;«ñϨô-¦ñ`‘ƽ#¬ZOörŽ_þ>u´«½³¥¿³¾(ý×=ă#Êæ–#'ÕÁÓ}D.¨JShš¸™<¡0'ÜÅwgek¬)lNZ7Ë*°±xç2'᯴oa¦øÝŒ@¼3x ®×¹­0T=íWç4è§TpŠî@Þ{DR&ÿ¶•ƒVw_ÑW•P7Gà3Ó^¨…œ@’AÒÄ&wetUØöb˜Ü; ãé-¬ªT.‘Nã0§QS¦ŒfJ¤gêÂÝä ©F•W\[&!U+÷^ûE›Ú\?Á͵›pè§KâÔG/Yf<ú³âüPܺqªë"fï´ôL˜Õ±[nÊj U$c98y–’V‹û‚¶–­)7Ô„GJ12¤¼¶wH/pª8#ÙK&æì%ãd|úÄiÆ$L8CØ +R¡=Úæ`+Ú» shH¸yj ged¥Ò‹öÑ«KÑYšÞ®û…òË](_éëíŸ1Ù®z,Ÿ÷AxDæãõ“HT{y— *)eEÓ9‚‚yI¢=¬˜N’„ÝÔ9S3 pp”“í+Ò9iš{o[ åF^lÍ=|+аÆ;?Në-+¦ï¾!$…Íéñ̹71ƒËЕµv%ãJËÉžDúEÉ^“6uMA­“ôÊ wÎgLÞæZ#0§ñRÚŒÖ&1³|Ÿ9§V*mwà;9 ?Çbò~Vñ`,·MÙ¯µ¯þ £¡qâa[,’£´g-Ä”iÏ*¢4,Ÿd4‡Ó¯/”;Ë\$dÜ.TÙBÑ7ÒRW„Yµ`û€¦U®ê–ëvœrFÐ F.ÿÈ|Ï%†¤ò²î35âJ X›OÉh©C†$ž7Aðn;KU@¬æ&¯ vxq±Ä=’E·)ï¯Öî¶äŽœ0Úyä©q³Ñâ¼n†òÀ2‘$"÷V>%Ò&È](á¦w–Ãz… |ýØ·Ë9;0ྡྷ#¥°ëúxiçukcná²UJã\½þâ-‡,žÏì¤Yr£p&Á¨9Ú?!äØ$L\Þ•œlŒ-ºˆÅQ ™K›Òâ¨<ÙÄp‘êzir]ó3˜Ê×Kp7EAÓ"f=W>m O|Dø‚H!Üõ+RÁ¾›¢2í6Eóæ4™•¼“7eç/Ûë•1Êj«¾Š†1oFBÄŠ®ã“ è¨_â:5B•‘¨y%Ò™P¦3”—›¥„ÅŸÖ½gzG ØãîÌèA‘!­¹lq’ËÿDQ‹¿3rùì¦ÜqZ2 ©½¬3l‘$_º£2½)­#î]¼v˜²“’%Ãc|™Í £1Ø £q'=f•²ÏUß;x—˜©6yNnè†Ú—æÉ‰²&“óÓ„§÷v–1»–28 Ó£¦­SºëÚéÕ/«xCE=¹ôz*ÚÚièÏè>Ó£g¬|%é ¯¦6Ž0øVsFðE]6ql_íŒ!¸i{ØFe·±|ÝÆóV¼ì„>Ǿß­éo?øõð9 jÓÈè3ŽŒÞ@ƒ:‘»ÆDsFB©¦¿ìíR©Þš^äÙ@F*6…Qûd ®#³¹~Êò¦"Æþº8iø*œ®áA§çä|H$ŽøI ejǺ*3­Tt#ÇòtÐd“†üœjX‚ +ºéØSÄåPi’Ö\#™Á°‡ß–ë7Ü€I#ì•+=fP §[ ËÃôh¿©(ë 7w®j§]^¯F^çòÑr"¯^îÕdX8V–´­'Dö€þšú³i µ¾UÕ‰šIj}—¿'xNŸ•ø‚|uq‚û±ë1öqÈp…$Ÿ«• œåñ4‡ª«îÚIcùêDüFu¢~×kUƒÏŒgZ‹W^ub…÷íÑê0Û¸<ƒµ;¶®Ÿ)|åt#Ï`|ÔŒgð{ði‹Vܲc3wnøI.ʼYÛéßñûi'mãüûëë7Rô&þú)¸!ÁG§w²9ªÓ2Æö²WM1,Ò”Õ[Äkš¢W)ûªð´ÁA|é¶hÇU–vddP‘Œ)t?zwN]Í ¯\–>öž>ÓÃgAÔêB—æMÍ’ËØlƒL¿ýäü®õùŒ¬ð#zÆ’ãØˆBë°,‰öŒ=1ÊÚocV3°îü·®•C¾cïû‘w0X¼Ö^ÛèôŽâ=·ÝI#ø40>h¼;ŒÇÉÁ;¸kw­ôI»º®l ušá͇#·7}’äöÇO‡ÿ%Ÿ'Ù endstream endobj 3853 0 obj 5168 endobj 3857 0 obj [220 /XYZ 40.7999999 232.339999 0] endobj 3858 0 obj [220 /XYZ 39.8400000 302.419999 0] endobj 3859 0 obj [220 /XYZ 40.7999999 232.339999 0] endobj 3860 0 obj [220 /XYZ 39.8400000 302.419999 0] endobj 3856 0 obj << /Type /Page /Parent 2 0 R /Contents 3861 0 R /Resources 3863 0 R /Annots 3864 0 R /MediaBox [0 0 595 842] >> endobj 3863 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3864 0 obj [ ] endobj 3861 0 obj << /Length 3862 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè¼ÀÊÍGw³ €gÆ ‡† ääx³Y,âEœ=äï§¥~H"õ‘Íb‘jÛx4M5Åb½Xwúôý¿~ß¿{þôŸý—ñ÷ó§]u¨šjø·?þüxù@šƒ’ÃÇÖÔÙÿí¿|Ý}ÛÛ}Ü}ìÿÿ¶ÍéÅñWß8 1tøû—ßvï†ÁwÓOÏé?ýo/÷îÿúuÿ·¿÷¿~û;~áëÎtÍñÿ‡B iú?.?Ùýõ‡ýoýÌ©ßãÿ?ʦ1¢I›Ç·ùUqú¹| Ví•Rµì§(ŽÿÕ=8þûÏÝÏ}oó4¢mt[-§n[µïڦߎÚéÔYÛ²®DjG¦ny::ÎH¤-MTºõwu0Z ÕÊZ·á¸µ1²ÿܪñßòëJ˜a;Rwcî)ˆºÒ’©£~F"ieãfàžX÷Bèú´pÕ$/}ê*¹£ºbêè8#‘¶´i7pWTª¤ªÇc`R:u• ±ºê˜ÎÁqF"miè®>²p,yæXß}Þ½{íŽÜùóÏý4N,~øõùëN÷é¦ÒûÏ?íÿÐóù÷ÜþuW÷lßYŸd‚±¥=µ˜óƒçÓ}~ðrz ªCÓ ÓÖçwÕЫ>hÕ?®.{ÅïxwÚž¼¨ì6ò»}0Н©†Q6ÕiØ-èGpu(»!ýq n  ‡(š@xa¢¯†S,Ä¡ÖÍ•šFÑZÜ£Agñ´Ã*³ T£b]+DË<8ŒñÞ¡ïá¾Dhçšv„TsF9$m •Uжü¡€ÐÙÖbuÖ1‹’9|§zŠÇ#Û¾À<ƒ¶ˆrðí±}Z]çó [>Ö [FÁáF‹~ŽGáÖá«up¦¸¥‚{âÁl¨›áq$†bWVzXA*PVFN£BÚSr>­ Ã4Á6p«ÒOÏ;!šÀE{êx¾ƒ[ŠîcmÖ-áž` CiQ_JQ<Ž ÑÒ¨qÞZKOÆOoX–€4ï6¯d"q‹ˆÇxÏ™#`/ó¬±üÍ:kÏÙ&P¤ËPÕ¶ÍÂH”î¥e£ÄkhykT•÷”¬™¯`¥õPo#êðxuLhW¡´`Í+ã“ Ã 7Ê;:¥ø3õÆ{J ÞS!<â—ÂR¼ .eÁ* —XõV)Ø`Kþ»5c&“ŒšpÛX×T)¾J1ײÎ0ø:_2'Üàñw²±ŸÀ3⇨kkž™\z|\w‘wNìï´üæ˜å6ìSñP‡n}ášî…F‹Üe\]=÷àŽÇ^>Òƒé}gÓGªå®BwEÏ‘gõoâ¤ðx«1"Vá|3iŠß©í™¿±Kao»ŸÎÂn¼žeÁ³4^ÿÞèí¡‰ÆÆ°GªG´)àH½I…´¨»ñ‰³Q’ÇÇÐé'v¿c¤ÜÉ #±óY’O„x˜Çsž!.¿ÞUÓ žë›ŠeÖ"Ñ9­5A”5ökv¬^Žø.»ÆêÚþ&œä=‘ŽÄFp ŽÔ2Ï$3ô`BiA„2÷[f–—vªÆ>S¥üÔ$¼óQùíÊRÙ”d5BɪƒO©£èàîYÇp„y zÔHÖ`[c£W‚A&Åøì:‚vjG»Ð’° 5:Léctc‚E!®ù*ßfߊ•ãro5ã q™ƒé*zºm4†fàÇh•p‘,†O %UHè¾/¯¤Õ™òjj×Ùc:ÐO«ý1…™‘Ñ ØId³RYLrž`)Gè{ŠúBh{[VÃÌI¢~„IÏ„%%ÚÆˆß#Î’‹­Ã>å nå©‘êTEHøœ–ÝÙ–ë ’Xp=õ¶zœÉ€bh-Eª%ž˜lK÷¹<à DšfAIfÂ’ Ʀf’¶UØ=/µ\ðeW·ÚNÚv1ǘåSÜ[´Ñ0/ƒ6º{mZbÐ úpfKCeú€¥A8crbÞÅ$‰pqGÃè³äŸ»¯Yă“eDÏ™– E÷­ÆÀqÓ‡n,¸—ðÑpöz³®xæ˜ÇºöL§È²ËÓ¹zsð‰Ø˜`^Ú£´9Z#Fø„äxù‰K©^àℜö1y”Y-3Xržs0¹¿ÇolS3¨™ËÏËi‡Ù-.g!ǘÔv†i fpx®'~)b—%ªònÎfž$ŠÏ¦ª)þç]Â×g„È-R  Ð0ß.dbe‘˜Z$ºB‰fKpßÒ¢=–.X⛃¢wkîdmë$…%óÒ9éu ·."à}¹Â#³F3˜Êj7ç¯à¨¯ážOLœ—g‹ 1FGža½iŒ±´¤8F¬FÃÊrÿë2õšÉbÃ[®rLj‡wŒ P•´üú±kAý¤¼vR±Ÿ„“ÿÝ©_1!>= Qév=ˆkñ÷m-ö%"”Üq7’s&k,)ɪ–ßÁDÛÌã!TM)œ(+Þ@Òò+:å$½pB±Rt…ëÅr7†‚³t¥¦»gOnvÖ ß”ª*xn¸7J~T\%Æ“uÅ•°œõcÖGÃg±ï :ø,àw0àzo0¾aoœt²gtÕNE¹òdŸ}p?v‘‡ƒæ¶MÜ¿Ò|æà¢,’ÀŠ­k+¹êæq["Ù%*°ké_®š"-/'Ëh¤Å3HQ#[N‡Bn˜ò¦ÕZ±i=ø‚ÇË›’€×–Ì{D:ÿ£¶".—)“]°[”“‚™/ê† uµE÷=¤%âŒ`¾ˆÙ/åfö6F6ÄÝGÊ®ž"•&ƒÑw4ôÚN@‰-¯™BÅ"äÛ&÷ŽðÔÁ˜¹\lw³/³Ô:‰P\Œ×wób+›¢ûÍšf÷wøˆˆ;ÉÕ©’Êã8‡'"•D„"ÃøO¹'¥xz.o×boq|–œícÍù‹5+Šu¥Hóí%ÝÞ—©:ÎtâÑ+RRü§Ø$Vé¦±Ø Ï0ø‘ìß˽=Žd¯E;W „×K_åáË*|iYÁ|q‹ÞáÕåRÙsq‹¯›áÜð¥2ž›Æ—£yq[aÀÏ.À 7¾+Ч©›RˆRJÿ’’½ÀèqÑÀÖLòª-tšHq …j·èm)‘$eâñС҃Ip…) – Žyæ†áFp¨$Ã*ÿxf€^ñ ð¬ao¼QjW†ro)KÊ|Û2F(*!úl0Kjwwã÷ðdJQ4Öâkn ¡S"aá,Wó°¬)‚Æ– +|2ªgìêNÙ-ˆËZ\p²JŒË«`é®t0 ð¬5|ÇQ¸ ¸Å#—‡øL™s¦»›¬ˆ›xB¿-$Äš2×Ã0}‚s[ ojæàÛ7Ñx|c…'ŒqãMúä5¤ªžY—äMÆ*óý]ó&Þ”é}¦$ÕÕ\F .8êÙ/oøbÇ+óÅR=ß„è|™ù4êmão(ÆYz ÃÐ䩞®õìØ?lÂ…Ï–ã;7ú{ŸAч3ì(¦^|cÀ›¾c Dz=Ù½ÚF«î-oÍÑ‘ô†Ã[…ÆŽ7¬³ ú†”°÷A¸å´ç:òf¡&?<ܽtÀè,kØ‚[qö»x}|÷gúzNªš)=CD™øˆŒh÷.öã8íø- ô‚Þ²@SŠnd‰GY‘k4k®|¼Ÿ”Ø;ÖÄ÷”Õ®÷µ±˜FéôÓ1åK)$ß[Fä{çl¹ ÄHyÆf1bsuÆæ¦Û÷(ÙT½ÎÐwüuú[TÓ£iÓµB˜á©Ü7Íá´²þËã“/»¦>ÑIcÄü-}Õ‹¾£ÿþø·9¾¶·Þ®Z{ŒþIÿÎõLŽßê®zé®Çøe÷ôC®xûAökĤ€îMQ8òœÍ7z‚¡–,1L™‹;ois3§Í%ÍèÞÉæb›7UˆŸñÉöšñIs‹ñ©ÊfJªrŸšYÝÔ‹¾cf|²¹ÅødmÑ?qßñ[ÝU/ÝõŸšl”ã+ÌøX¨Ócó¹Ì…´™+D²d_ZÙ=·€S22%-HJòqJ‰B¢+¼åxˆYæ49´Â&Ù¡pFL]h‚˜È{d†pòÁÜÕ²ä¹?¬[ií´Â„”ÐpB eÄyºCsËxZšÑ@w†á¦tlJÇù«lJ‡n®•ÝÞR:tg+ýGé8~K_õ¢/ǘ•]ßR:´vÆÐ®ÒqüVwÕKw=F¥£žü ¶Zr”õ1Ûó#ÈÒ›°ôóOñê,· ˜Xá×÷ÖÖYJ¬ÇøfäÑãYÒ=S®ÿËç8®‡*Æl€dĦ€a¹£G d°ÞÄÆUŠi‡£×ýº›®—Íp6ºyÈÙÿµ%»y!j™)mm·4ñïH8ƒÉãïÆ;¯3U`x~g®X0øÖ]·B-ãÏ€VÍAä²EÈ#,Oh=žÀ•âÞÞŸW¸¼Ò†° [>À]€pÃЯïaoOC<³ÆÐïL¾®õa !‹vbeçFÜÉH4”66Õ€ûëYA φ.>Í_)g6ˆ{ùýƒ[9…‘åÑZIÙgäV—íETð$$v$*’çiÄU .Àà\=8ˆ)rZ„Q<¥nœš+²Føˆ.ÂÁ›ûm„ÒJ]E£@fnmñ žkŠŸ6…­d¹€[_Ù6§p°s]í<¸[¥wÎLpÅ·{A~=5ð^¤Wˆ¤±³­ŠRfúÏR85ÔIFöÒUÊb/Å=†S¢¹X ÊnêSˆUP‰õ‚Â#¬d÷ üKª.…¥öå‘€,e¦œ¯Žæ¹4æç!ýx&,ÕåS„Qì ›×{€rÆú'ÑÌE’eFÊ¢”²H‹šv9¢b&¾YînMX‘]BÍyfJ’GäÊœLŠ[Ø®”ÂÚ)vE \IÑêpfžBBUFæÑŽŽÓKäÒ”,âh°¸HdJÙÌ IÜ9xjÂv8žÄBïOŽk3–<)î¶áñÝj èÂsμõH\¼6ù¼&ÔxFqOE-­MeÑ b¼<1‰JÐm‰œ¦!$¸¦$l£h¢/ËX!#—Æå~1þ²z`žÄt+ö a¹š(­öpf4;Kj*c³$Î(óÖD¹×X{{LŠ5ƈáEÑiAQ/> }Q²…°˜˜Ç `SÎ!ãY¡r®^Po$Vòjé!öY@ï4"ˆ¢¹s‘F¤Ér÷Ï“ 3!£*‹+3™3µÀ¥!Â\!„¦p¦·y1ÿØš{BDùÝ)Ɇ¢s²ƒFXü ³ÁŽ/2Àጻ¸Ù¤ò&󸂲œÃFL=§‚Âul(µŸa NÄ[m·ÀÚ.UÁÚ.Ý\W*X‰;.e®ƒ÷VŠ¡ÔTlÇzç:Yž:b¸®ÆyŒÙxOà>zv¸$ÆÍ5¢(5ƒðê<Õšpú.B iÅ»VgÙša…«~–„Õ\¥Já:ŽåæSWÒ0²s!^<§´x* ÂE<Ž¢Ô~¼;µñ¼C‡RIÀµ\…ëCÊÓ–•«1‡öŒCs<ø†÷”¾aIö¢"iÿ³ÿÖ“Ïž4¿0þúòuQrÂÊMNøÑKн¯†³P4{Ñ/ã–óv'šÃTBUsE1ÝCshn_ uúŒÐ²=´·‚Ú-8•:ÈβO޶“úÐ êÚ¹¥…ãøNßz+²RWeõF¶t«·á \>yßïØo¬ð½3Z‡nµ´ŽQwŽ{gܱ˜µs;€¬;~–µh¯â­ñÞðãƃ¯¥ƒ×âá(†ùXÊ<ªïƉ¡CÁxŒ‘¼ƒëí¢·VúÌ‚]ÆTÍA´Â´šaàã– }ñ#'µßÜý>¤F9 endstream endobj 3862 0 obj 4809 endobj 3865 0 obj << /Type /Page /Parent 2 0 R /Contents 3866 0 R /Resources 3868 0 R /Annots 3869 0 R /MediaBox [0 0 595 842] >> endobj 3868 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3869 0 obj [ ] endobj 3866 0 obj << /Length 3867 0 R /Filter /FlateDecode >> stream xœí]KoÜ6¾ëWè\ 2ß (ØN 6ÐCÑCá4-‚&¨›Cÿ~©½qÄý¤]RKQÚ€WÞYRóøfÈ!GË«ïoÿüÜ^]ßÿÓ>ú×ëû†tD‘á§í_½|ƒ™Ž³áRÙ1Ûÿ´›§ö©¹kîÜß§†ª]CÿâˆÏ·:üüø©¹nÞ ïÜ_ÿì®þkYû“ûïCûëoîåï¯ÿÀÇÆXÕ_ü=\PF™qÿ¼¼ê‰5¿|×~r,˜]¿ýßWLÂŒIâãiß”î~_6E7#-ç’pÕRÊŸÒ©ãß?š÷®·=”j%49ºWÍ\·ÂpÙZ­Z&MÐi Ûq]ÑÄŽ$±l‘ŽvÑ4Ñ(zº«XÕK*ø &ç$Ueû¾;rb,£ûG4Q6¯ü©¾:#8åšIÑ[¢·‚4†¹kÍýÏ ÂK6hQªd=>w•Ú‘&f!ËöÑ4Ѽ=®î ”ìK |šhøæ¡¹zë aúqáá½ãd7¸ /N\پ꣈tÿ½k¿'„¾ù¡}øÐØNZ®å0 òRp›[HaˆB¢°E)œ#ЏŽàMCI-ìÍÀ6˜õÆ¡®1×Q¼-j9Ž)˜7Ø&…ÈÓq0ÑÆ›:Ý {#¾´vŒMqÑ{#Ãza\¿^4" è½}pcÑÙGeÏé› È`‚ì nüöj»ÙÝ’’Nij;ãaNº,ÍP&C7Õ €2ˆ&:1Žéͪc;ÎB§Gtïc޹ߏW¦  Ô¨Wª˜tâ=‚ÒN õµ1$ìd,Ÿ‘YFY 8EÁX`xcŒ1jǪ¿1Á¢Pð±b4Á@`¿ÿãˆÚ<¸_€S,VÇ ¨ÇLNÆnv÷Y)Îݹ…÷ @`JÆo c:eÏâ#}`n<" ‚à ã0d-°á)15f\ÃÝ` tcòMf¨ÚßN²9žJãÉ<œ.›tSœœ`b¸Æi?Lº äÁDp6íσ +¿Žµ‡Rˆ A M í)Ô¯ˆ˜JcÄN` 'ç 0N–8L|ö3œæÆP°<Ø3°å"zÜs=±„CÁ…)+ÅòÀ€9`¸Íú |8Fã8ˆc'D<ƒ‹NxmB;oòEHFÅ,?1Ñ!ÊZ™l2Á[Äj.,Ç )Ê7mFôI–€¾m⥀˜”Óš¦Xêk$fA6kĵóü,L)yž´ºwçôÎL‚ùMD„‚Ù@ÌðDox¶1râŒ3†RúŒ+•ŽŠ<œ¹Â]…ØÏ6™Å—\¸Qr~¿lQIÍ®I¶¢’渗ÜäÒÇI…ˆB¥d %ÇÛ bJ .'J01åc‹®˜¬o9쥯¥“’#f‹}«¯Ùdµ‰M)±Ú¦Mð¨S†M$MÉÁ×P «fA²ZX¦äÓëG¨ºª“I&e]¤îƒÇQJ_õ×$ie曉/­B®sFÍtzäÉéP+ÜÕ}–Yk-j­E$e£µ1»IµÖ¢øy…a)Uæ%G”mfuí®üj#’êö7¹s]z5Qóül4Ž­²ZئdÀë{CÉûšeì\[š’^⾦å)Õu_óçF—¶¯YÄìÁê”ŠŠºwX÷“Ðg7Q½²úÚþ6}&#’¡)«9uï0ŽRøŸ"<{eÌ&ãËFg„%ìª_Å^öÞ¡úòÕ¾9ïJÙ>“«{‡uï0’²Í½Ã¨§ž¾oA«Oco÷ilEEÊÓ6%GÕmf[u°øýSEUý^Åsá²~¯â,úLÊjÛ6wï î\1r±UH•Y-,ްcݽßîî½b2éûŒZÉýƒóV‡ŽNä ÎЬGBce‰9e-sP1V#ä5dm̼÷¥÷ÃL'Ö†'¬â#e!nRNtÅR`N&NºŽVpˆòñgõÎ{[Ô‘À'xhà\󟀌L ÿx'›øèY5qŽõìÞagç?›Z£ý™ŽÇ€• U4è6â8ñ )nóÍ$ä~îÒN‚Ž9‡Ùó¶Ó¼ûmŸœŠúúø—Ç:E¾ënÒ\“MgílTKÌÌ-Uݤ-'Ï C>ýUªScüú”At¿ CÓÇËÁ§õÊà œwÌŽ&2>úÊN ð›íÐ} lca›a*¥YÇïIc°êm€îËwnàgýó$|‹Úø‰Ê! Erøqû´6Þb§ÈîyÛ9@êúk&Çoºßë`ì`x\³×ôaëÜoŽœDÁÖÀx`X;1ˆÇˆŒÁ”ÇϬIz½ºŒ!ª£Ú½#˜aåÏQ|Ä_0Ú·wÍÿ  endstream endobj 3867 0 obj 1947 endobj 3871 0 obj [222 /XYZ 40.7999999 333.139999 0] endobj 3872 0 obj [222 /XYZ 40.7999999 333.139999 0] endobj 3870 0 obj << /Type /Page /Parent 2 0 R /Contents 3873 0 R /Resources 3875 0 R /Annots 3876 0 R /MediaBox [0 0 595 842] >> endobj 3875 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3876 0 obj [ ] endobj 3873 0 obj << /Length 3874 0 R /Filter /FlateDecode >> stream xœí]KÛ6¾ûWè\ ߤ€ @»Éè¡À" ôPôP¤/MÐmýû•-Év$”=¢¸ôzv¬³³$gÈ™£™¡øú»÷¿Tü[½¾{ÿwõ¡ÿy÷~#jáD÷Um¿_ÿB…Z«î£¶VÍö«úðióT=m6í¿Oév û-q¢ëðߟ7¯»Á7ÝoÞßýÐ~ú¯RÕ÷íÿ>V?ýÜþøµïoûŸ6¡qÛu¤’*´ÿ9þ´%þ¹ùñ«êsËBØõ»ý÷•r2-/KøxÚ7•»ïã¦h0Qií¬U•”ªåÓ¶¿ýç·Íïmo{6ê`´Ô^YÓ~nœñ† ÚÏ^÷_gäÕn(¥«Æ»Ê:9h"ïy]-íÈ‹¦£Gr™hRï*årx©ÍNtmÔÒYºZ¼ÆÛ4m9’ËDë—#ÒUÝ)ývζ¹Ž;ëšNLåÃRI÷}-ì(ãÒÌý–#¹P¶aò§}=$OuϧHÃo7¯ï¥Ña»W<þÞ²²Ûpº­À¶zµµX×R­Þ¡õ×ÕãÇMSÛ¦e¾Û¡:Šâ ¥”oEÝ!Šô9ßBÞ^Þ›P"!r‘Ç ^ƒgöF¡àq0׸«­q¨‰ë’vÞH¼ Hú&¡ŽJ¨;‘9 èÖ)kÇXŒÞ0†(lÛPGÆDŒ.¸ Òú¼ƒ¨;® «ÁDØ›îÚ¼{lwÝÕ÷Ð`g9¥àzñ!:`T•p5Ü0`ÜÀkç b÷Å`Oc'ö °Æâ6x}(¶™VR¬£­É ³ÀšHþS.k²)=¶¦+·¦ç¶3¥W±¦ÈüâÕ"<|‚ô\Š#e˜ۺʧ°B¼°Ž/Ï6“ÑfðóÌóÛLÒg­Bl¦iÖ±™çÏï`ïG`)^ÖìIcDÁ«ðÒ,°;¾¸9€ˆ2‹Å"Š×þг¿œý}ÃÙߜ؉ю³¿œýÙC3egwä<{¨u³œrö—óUq›á|Õ¬ùuª,8_Åùª•4¶Y§’óU4ÿ‡óU^¹RæŸcïEGä®Óo,ÃûzIíAÑÑ5޽_©¥—]þ*ôŸ£Ë]~ÃÑ圉Ïmpt™£Ë3;åM- aš]Æ~DÒX¨Ä¸%-ÙûI;£iã($® ÞÅ ìSkL,x×#åzð.AÐQÊ\ã•S}c a ɉ!J”F„ÞŸåÜ:y½©Üz£ü*ÖĹuέ¯¤±fIÕçÖ9·¾’^º•ª”8·^@Æí¥åÖÓFÍ ñeÂ’ª+¶À",O–æ´ߎ¶ŽÍ<{lŠ«[ ·t>YúO–za†w¢å#ã`®±¤„çìÖ`-O»Îª ëÌ‹q5U“J±‚¤‘¬!Á¿­G)w/pgìétJ €;¤)u§:RÖָвsPn+ c]:ü¢Wb3¶S›N°#ýwÖ+³¯ÅD1-ê¤7'[k¤²Ss:pÒ{TGãuêîj%ÃIGê'ýrœÅôd*°“©˜0Á0±ºÝVª·¥/¹‡RœÏc¤­Â~cÒg{R< û"OÄ—Áò`W}àªè"vkö™5èk‚t‘}œ‰%ÅN(O-p…#5ì”6Ð#TøD äÚfš,Oäö,)öË!:DzÃQ̵ÌggJ ™BÞgÊÞg"q¤ç(;¥‚[ÆìYÃ<–¡Ì¹œæáÇh¶Ô[´TJô1©¥Rö׬–êÔ¹œæá'H¶Ô3¬!ñTÂN“SKµ˜·|ò"§þjÙ°þ–¤¿„OéÞ•ÖaVºâíÄrŒ®$;¡Dâ Ù¼›·Èi!ÖÐp$áÚ­¡ˆ· x³OtRâžeXƒÑ7û´žg~í:·°¥“¡ 9%€r;¬Ü_×µÀÝ×aªDCzÖÛ1Å]Þsp¦L( ê­OËÈ–ä¬SGÕ ª3Z)êÝï§ÊjÓgl¼ÝAŠB¼õÉrWë]ÅÁIS˜´ã`IUW° uípgSú²Q[«nª(¶¹¿|M#sÇyWûÖtgE8ÑÎðó©1žPæÐ!݋̞w¨- t|ý¢,k—K-íP¨2ÞeO”@Eê}&U=“\ƒK®p]ÌùeaÓB™IñÐä/ ¯ÊA^/(ÆÂÓ8_þövÐ!×øÁZ-r¤w˜2é¾÷ÜO”ê%YÐHÕÙë—B_"œàî/¨GÃK<©<_òHUeb±ÆjÈ=– VàaŠºŸUwÊbLŠJ eŠبÑc¦TŠ^#ÓÒÑ» 4¦‘£Dã'9Âû*"uM¸Ò}îý±+n¬Ö†Ñ|ÌëÃ’Í*Mýó÷ñ¾6!‚¡O:é³Ä§J—@âý,Ì^rˆ9 xP_.À©P åµmk˜óe!ó’_ÙA)âLz°(òjÊëpx÷……#šH°’o„£t‘Ù!©¤èAD¯ ³ƒq§Çª<©¦Ðó­6R˜•ôUúK§sa"¼ò#òÂ1Êñ`ú8yôÅì®|ù¢” E“H‹)(¥„L¡Q"ˆM9âüÂvG‹ÚÉâïgà“ÊæŸ¢û a×b|*›ÂøDÄ'Ê‹´sbš¿¢ $cSÓ®ÓrEI/͈·^…ÀŒ·±Õ Mxãm ÆÛØ8øõYñIEþŒOÑüåRƧ¢)ŒOD|bŽ·vÿÎ?Æ[ÆÛ›¢0ÞæÃÛ¬˜Öì_×Á˜á ’uÇ/VcL+šÂ˜Å4|ñlF| û“TŒO‚TMEšì½3¦1>•ŽO…û\AïGeLcL») cZ>Lã¸]·ŽëfÎÁ[\ß9ÅÂØY4…ñ6:~á\N| ë ŸbDö&>Kq¥ƧØ8râS#¸îˆÊ\ÂE*¤ÊŒvŒOñÉQ×(®ƒ[ Ÿ"'[ñ3!{cŒOeྮ.'>®[ Ÿ‘LöŸŸ Á'q͉Onx=:ãSj|ŠÌî _€ÆøÄø”Ÿp|¼ð‹&p]+cÚmRÓòa×Xìð6µ•ñ–ò¦(Œ·Q¼Å¨Z¶ÚÁÓÓn’˜–ӮŇl¿«§X[ÐÜþAÿãçÒN!Z ú! ÒѦó7t¹J¶bœº£«‘®î.ÏÒbḦþ¢1W»ñ•%ýÔ˜º›™‰ê*_ûñ­Ý‚ú”îáCëZ5£›!úlíº›Ç °MÛtõ^ÕJìnU«Ô©Þ:C8þÍ[ø· †Þ£6ýM§(ÉÑß[qY›~Å.‘½çmg ´nûYYé¿4ùSã}CЬ;Xz½V½–o‘Žâ9ïïC¾ˆ‚WëƒÂ³CÑx¬‘½ƒòô·¯œ’ô.‰v… \-·W¦Ô O>¤ˆ£K…R¢}õ°ùØé ¹ endstream endobj 3874 0 obj 2722 endobj 3877 0 obj << /Type /Page /Parent 2 0 R /Contents 3878 0 R /Resources 3880 0 R /Annots 3881 0 R /MediaBox [0 0 595 842] >> endobj 3880 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3881 0 obj [ ] endobj 3878 0 obj << /Length 3879 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e¾D‰@°€=¶ä`àrr¼» ñ"“=äïG=R÷ôŠýQd‰â°gÊ<í©æ«êãÇbñõþO_ÿÑüó·æýÝ×ÿ4ßæŸw_¢VLšãßw—¿PC«Õô±ºV¹ãŸæÛ÷Ãcóx¸?Üÿ>¤}J8ÿ…§"¦ ûöëáýTøaúÍ×»¿ŒŸþרæÏãÿ~iþö÷ñÇs~Ç/|? Î?ü{ú •TÃøŸËOGá¿ýCóëX…á)ßã¿ïT/Lg̦z<ž“ʧ¿—IQa¢Ñzvh¤Tc=»Qÿýéðó˜Û¹­3RöÖô":×^ÙöuëíØú~ðrõ™×ÆŒ†ÁØ,=ÕHnl›¦_É‹ªýÁ)žêÄV³Ú˜‘“]&+ºI[š6ë>UõNÉI_è·jì”ÕfÕ÷2îŸj$·5mV½ŸÕ}RTϤøHøñáðþ‹4z8Ž?5yH¦cs»æÝ‘Õ<üØüQýå‡æá—ƒk;7vÙiä™$âI¤…’æöJ>¥—£5Lƒk %ºáö`‰ƒ’éz£´G˜†%BõÐ>0M@òJ0F!®qŸ `TêËQ07=áúóÃÈh{óÓÑoc~Z¯›„XH˜+`!æ'?uXou0—vÌ\ì  í5Ö3WüÄÌEô¬j÷¹º™+¢˜¹Ô3W üÄÌEd.¨J˜«ï™¹ž%Ë4˜¹j0sËé*g.g™¹"j€mÏq.f®×È\˜ê`.%;f®ç``ÛCvP”óºg1dæ •ÓUçRÚ0síÄ\•JÜÓÙƒc檃¹ðˆ\suš™k/æÂÀ>3WíÌqP s9ÉÌÃ\¸=2$FDEÍp›f®P9š")È\ZžKeæºQæbŸ‹™«æªÃÓŠ÷¨F!©bN{yv¸M sZ¨q%E™ËðÕ[g.öƘ¹ê`®J¼±÷€Å”ÓáµÅŠ{-K˜ÓÈœs«ƒ¹Œà=`Q^áD#3WÝf®P9¬u%Ì¥xØE °82õê$Ì\¡rêXu4†wz]ÔïÚb~zuæ§P9uÄáåû7úO<'¼Q óͪdæ7ðNÔž3×J˜¹hžUÌÕIÞµS·¼' ™¹j0s…ÊÁ籤(siÞµµÍÂÌO·*aæ 2ܽ‡%E™«ç½Y1£è °ßßw{2w2s•d.ØR,Á½ã­(Û9ÞÏÅv/¸¥}̃H˜íʱñ¸=up§•¼£l/O1·ƒi˜!™;ëàÎÀ»U•{ŠVóþ´òž"ó` f»rl÷*=Åžw DñF~'KøôhæÎP9–S½?èÎ¥2§1§½) sZ9N XÐçìBñ. òm¯xGͶà4÷‡ ýŒr{SÀ>Ëo†ñ™oCåæßUœë ¿ÕyëÌ…Y¿LYË~mÜÉÌ•›¹°F‹rÚÀûfʳC@Ø „Ú_›ÿÄÞX9N«=n7ÞµU·›ô7XÂÌEe.µcª8™1(½'^2´Á15 ?O„'#HÙvÆcuž+3™´o…WÍÉ%–ª5×ap%Íll‘ .XL¸– »øÅô sÊô"m%«¹z•vù ë %R,3™ºW×j5HÕ]f2 i¶UrXÑ«_µeó|S`KCuíÕVÞ×T–ZmE@{ €Ê zéÙ«4D¥Ÿ6¾óH‘Ô ”…êÃ=W‰e£—ʉG’z/-Ô‰­aÅÞíNÝÆ,¸[}@ÜÕ¸[ªaù ’¹=;ìÛå|róÈ<¡LÏQŸßP_®'Ù×3²ª[ Svìâ®^¯¾#_ôž¯çc—r¸hW;ôÎ~½SÑè%…% Sø ON숪Áº5TEŒã]—_ÅÔè}µRœXò\àÒ9>Ư¬áe ‹$û*øÄZîtùA©p^@¿x‹8¬A`a—€KMû÷kiìBï>i'øÉñóÕ”¡ ÁsK˜ã.]¬„™—ŸÒó/æ¨ñµ1+-ë<+K(y™1¹z“5_ã„iêŽ~/ê4º–&~–0*žúãQŒuè5ËÐMÀû[›4—›n ¥Ào¡˜íÑÉ}‡åãeD¿‡ú ,ÚíØõ­ÑkãeŠ‘)±Kr&„ÿfýo¤§xG}ÄÎC¥•¯†ÔófЬ=çùÎ,=fÏ ÁZðxP?Dsí÷_sútRdÏ,1PRHÐ# xMéܸØÊ^y ñ̬Ërx­mÃÔ!=Xã¤,u`Lž1Æ\3Chþ꣧ø¬ClÄÊìÿ”4ß²r»Î¼'‘÷nÁäyœ†ß«°Å.ÕL¡|· ûû8·Ì둤ùýŒkê,ä\'8éS–‘üð¬nÔ€öú4¡³ù ïbX_t PU‚…ÍF¡Œ„ñnÞ§&ZÛËß›z÷aÆio˜ÁðJ»æˆÐ¥Ì°·x€”ž–À1¬&æô°ÉmO»Ózµ”¤„ì µ÷­¼îùßP‰Xê9E;{»Ðü–A3 i;Ç‹D“•[ö>M¬—âÝB”ÄÖžîÙs!©ëú(°xeå¢ÌW°NK' ßÞ”aŸyvÂè5“à?®O7n)"Yÿ¨HØãÿö¼›|ëë‚ÜpÞ GاŠÓh<&Qö¶â[\k¼ aÃYÌ&N¨Ó3Ñ/¿/pä ï3ŇtË!Û #W냑ÝãëB6v X8Û‘º]Ù{c-f½n6pô´†ÃßNôîtUÆN¸aƒ®= ³>–àyÚ[;»‘$ \@^þÂAü¸' Ø>xO4!|¹ã×Hy>×€¯ú*YmW-TóQ{'Ï·§¬gÛ¿¸®a¥xîâ™ûelbOs—À.[|53æ%Ø:ì©F|KÍê Ü4ÆŠàE ±Š—’³F-ÏÞ=ô2?=Û¸øð¤MÀÏ&\JGz²‘°»ž²‡^ŒÕèó#ío/·ô­qdÚ8 g³FË ¶[¿Jxö ËÔ'âùÜ’#€y~’òÅã7}–ÿ ÄH×äQ"€”¹7¶ÜËG'k¶ö“ FäÍóS‘%¹¯S«ú  ß›CèÝyû Éc  'o<0`…R×E`§ôá@K)¾+…)¨ªX;y;P·G¼È»®‚ç#YWv2yçý„‡/=‹°U2ZlúõýÅÆ6î3¤>“}V X®`ÔÔ¸]•Â2%‚yŒàF-Âèð¬(’=4Z}8ï}/'ê"ï+ZqŸ G~9òÕ/#¿ãßæq„æ»ãæß¾°êƒ\<ƒü>ó`ÒÕþ1ØFŽÍ¸v:ÃIÛ>#hôù”YÖ¶öú gÚI3pTßöË“@û+’iÓºUnqh>dÕµvÚŰ4Ûµr˜ÆÁ4“A{Õ*¡¢%Ø®å6A÷ò7Ÿàwçë®´ð J3ø¸&‘¨óž´4³ÅRÚ>×í©l@Ýñ³êÎ[€f »VÞ0v0f\+×òÂ(Ö¹êÒ%Ø k‡‚xŒH î`{æ”×Zz—]à l+Ç·0ÃÊÇ’‹9ï}N¶oîÿ\˜o. endstream endobj 3879 0 obj 2803 endobj 3883 0 obj [224 /XYZ 39.8400000 146.899999 0] endobj 3884 0 obj [224 /XYZ 40.7999999 616.339999 0] endobj 3885 0 obj [224 /XYZ 40.7999999 535.699999 0] endobj 3886 0 obj [224 /XYZ 40.7999999 481.939999 0] endobj 3887 0 obj [224 /XYZ 33.1199999 425.299999 0] endobj 3888 0 obj [224 /XYZ 40.7999999 375.379999 0] endobj 3889 0 obj [224 /XYZ 40.7999999 616.339999 0] endobj 3890 0 obj [224 /XYZ 39.8400000 146.899999 0] endobj 3891 0 obj [224 /XYZ 40.7999999 535.699999 0] endobj 3892 0 obj [224 /XYZ 40.7999999 481.939999 0] endobj 3893 0 obj [224 /XYZ 32.1599999 427.219999 0] endobj 3894 0 obj [224 /XYZ 40.7999999 375.379999 0] endobj 3895 0 obj << /Type /Annot /Subtype /Link /Rect [136.799999 554.899999 220.319999 562.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs >> endobj 3896 0 obj << /Type /Annot /Subtype /Link /Rect [410.399999 384.979999 442.079999 392.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 3882 0 obj << /Type /Page /Parent 2 0 R /Contents 3897 0 R /Resources 3899 0 R /Annots 3900 0 R /MediaBox [0 0 595 842] >> endobj 3899 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3900 0 obj [ 3895 0 R 3896 0 R ] endobj 3897 0 obj << /Length 3898 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹¤ž@Àã±äÀ°‚o6Áb½ˆ“Cþ~¤‘4Ý&õ‘¬b‘RÏöð<Ô"‹E²Þ7üô÷Ó?ÿ{zóîÓ¿O_–ïï>=T窭æ¯Óôï‡ë?èþlôüc×7g=L_§/_¾¾=||ø8þÿíAµÏ/.߯‡ëó€ÿýòëÛyò‡ù/ŸÞýyüé'}úÓøÛϧ¿þmüöã2Þô¯ýÐN?ü2ÿ ´ÒýøËõOÓÃ=üåw§_Gúçq§ÿÐjÛN'ÁñíåUõüïúU4Yu2fhúú¤”álFtüç?£½€qj¥º¶îªèQÇÿÇaµªNCמšªsuÖ7”Jhü]f  "•¶4UÕ¨s_e:ÝÔÓ6L[Ðô½îÌòEYzÛÍKot2סRT/´¯#D*miëvà¡Î}»|ÁŸc&êO¦®L;ݹª>9Ó¨i¯µjÚ¾ÕÝ4xeæ_£ÑQW2Ïx5}•†ÙËP‰[TWý eš RiK›÷Ú7“êÕªf £Ç¡Óú2T*Æ”©D®Ù ‘J[Ú‚zw¨"Q_8â7Ï‹ŸÞ|Pµé'àóOÓ¥›&¿}—Ûœ~iA«ºÓçO¿¯*óá§Ï?? çf0]3‹óÕ¢'ºFO*MMõðIŸ@TCÇ<>?yÿyÜ«ì˜7mžÊ@Ì?Â5@üVp‡«ÎŸTuA\5Mx¿ñ®bŒ@,zžà{‚a{Çx¡nÞKÎcàçßTϽ‡Øñœ1¸ daçŠq÷_© ÞÚ®^g}:<ƒI "Á'kÀêêy]ý¬W†ØµM«›ë­ŸÙ^}®g(‚½ñDÏ£õöùéΕs²fÚÓœîÕ÷Ϧ¾ü¡µFUƒÀ4 ¿×ç@BY…Aóy qðiªßÇ£B¢E€ÚÀ ~‚AR>m¢ÕGKQ HšhÏZõÖGñ±·m¹Ø}²öÛ?gb‰—B<œ uæÅ›7Ô!+,7Å]ß»ìä^½×-¤‡• ž/\šxœ-³ç«ß—cé}!°c+QXÅʱ=І ùPÖŠ¡AìxhŽ:³»¢Ãò5ÈàQ°X^P™îÕV-°¢ò¡ ¤ãî·û~»u»ázŠÞᦻ•;ܵ÷;‡ËìÉbN-a0l-@·Ï šÕ²¤Þ®ÀTó×ÕzR­*SרOZú;üd¹š£™YœWæÜÍzÎe4 ç™u®µÄ;à;b¶º€kÔ:ål8TêÜÔí§½4š‰Ša„p,5"6Ö AóEI'ØV°-αØÊ¨šéÒ+HœuzÔT^–ÏÄø ÄR¬I¶=}#‹³³ŽÕűÄx#dmìÕ­®úCðZ8‹À”Ûhð"´â q¤C ¯Þ"Ð0ÐÌ\µ±È=áüÑ v,;ò-ÞÜmçЪÕö9Hq™sH‰¨ÌêÞ\L‚JÌK§óä^X¾à›qwµ³»¯u3 üŽ%@ÚhóH®ñ<Ù5„•–2’%po9ÜX¬ãFØGâÏ@]Ãi°"^¿á>b<Ö én9MÑMZ'…¬'XƒvS{éA ™SW)[ô Ü=|8ŠN%œ°œÃJzÎ(C§ÐùDÀ wÈ‘"¾qfHÐa#d2Ï5k bw_(ÃZ@›×}ÂEDÈ©îVµ…(Š=› ;qr8$²I"”ÚvkbØGß5ÎÄ žD÷ãA ÁóD^0±°’nÏ…™×Y+e“€ˆí„²Ù±8ÐÂ&p YßÛœ,!Ö !œ&ã§Š@Ö —s޼*ë±” %ð( A+™aßO%†%0¸.Á舕 ¯{YJåºBs»&h{Ü_ë9}iŒ¶ø^J†…°Œ;»‡>‘Dëc«œú;*î¼+‚'H·ÖµÎ«ôâ*(èüB¼æÍTnyÁiOž·¤ž"ßO_Œ©¯ÿðËçL§ašÈ: 7i/è#1m!v"ÿÊÆt®ŠX˜)›M’žûçÐ{B Aú”ˆâ<ŽšOYC‚ Ê{øi µ´ém)è&³©¶éB—õxe[\c C®ŠVÎé)¬ãÙAš-°œ’#EH­ÉSR‰MîÆpÈl™|Œ›²P°W”PÏ{¾x…ÝÑATb%<½9È£¼¨_BÑœƒüGƒ9È‹°º‘ƒ¼\eUçÍyâÉu~ZÅÉvžèòä=„æ-/)üO´^a›UPG mÏfúê‰YαvôÖGˆë ÎS&sz<”ÍjÄÆ9ñ¼ñi]¼³™+ÂF辇?ùíÀp Ž‚ŸEu¤d»92ÁÈo#Íìlò’ (È“Êj¿æ% 8¡Uî%Û]B‹—ßYëì6 ä÷ü‰ÙÃ`q“¤z¥%)Þ¢æa ÎLBȱL-ЄI‚»‰•<‚Wt@È gbGÉò9‰/$0k‚‘ƒFÈôIH9`^e6Ake³)÷~Lj›©z—Å^0)#øX°{˹¦Odž•1Ãp¿0OY]Šú‰P٬Ǽ©M.…•t²Rð]Æ«e™«ˆ”±Á*›ccæ^‰{€j„p{RtÖ= ‘ûŒdÐt½M¬ Ì¥ä`Ë8«8Á`¿y;ƒˆª&[JŠ¢få-p”'G®0ÏOI@¡d2Šž„˜ x“9i¼¨Gä…9`È:œ³‚•ê,–Aa˜YrÁD Âõ›‘¨Çº7PëøÙƷ̬ hÂCÞ~Ž °t‰Â²õÆ¢­Mž(a! GKŠÙ•â!Çþä,Ie´}Œ÷2½æŽN?`‘6/”!òŒ†Cˆ.À"ž–òCÆ&Aø‰‚ùoãhÀã U‚»àYÏʹÝ¢'bªñnC¨=O7¹ ¸iÆÛBŠ6B¼<ïpæÁ_ÁµüRŠî¬ƒ¼eDà8:0QudC‚ <Þ çI/ ÎÌ“hÖB_—Â’Ç|CèéÉð~È:èRT¶ði±?±DÍn™ô~'†”'k•J±d?ò%'I_ªÈ^h:ˇ Ãñ™OÁ§&RFÑÙ%¾Š!7)X)s-(‡øˆî‰H+›+ï^† úKÈì#ÄŠâ“äÌï~áFX¹BMÎE;8±ZÎpòÏŒöÈ”—3^«êlŽ“âí"0~ õøÉ…ô¿þ¥¶A°æ$ÖpŒx²ž²¸Ê" èf*"?…sD K:" áKaW¤äsÞCHÉE ØÁE"ˆvt—›¶µ(¥óW© Jê\¯Öá’D‰0·I–ÀÞ©%T±ÂV§¼ÕkÚª·/ì‹Á ŵc`±SOW÷'ø×µÁ_óW¯YÚa]0•Ôq’!ªàè® 9R ¸gÎÒ4mä)æx†Œ·øà<Ìý &Ó©G‚"G(o¢½QéÆ#sx°" pyÒÓmüùÕhSuô3í Û.cÕÊ|gS¢ÃSB¼‚¹M"ñ;ºÞl\1‹4M³N¹l²¾,m°ÿ²à´½|D9¬,„I]½ôèÌ´Dy˜³©-»÷ŒÞÉo^?Ëí+£†óÐ?¿d³‹¨ñ‹•µ1ÃN}Q£”°ŠS<` ÓVØä©ÁÑÝãMÉ„6p¡FN§ùÝK•ÉKåH ƾb %bê¬Ek›Wd):"jÃÞ¿`V‚³€^ÑS—ÀÍDBÆ–CêÎ is W̺7`½ˆP&¢í8E…s1é–‡¤æn{9À<’’¬×&ç œ¨;‹%?rñ¶jv•*xS«ÕòãPÄ»ê#<Öû¸†xFK_ãM6YyJèƒHêF#ƒ&UˆÄÔB¢Ía“¬sÆO4Ê"\¯#Ñ6Oãº{~ÃùZX¹ Šs\‚¤¢¡1š5_æ¢Ku,×'Å!,QŒRs‚çá7‡jFØ Å*Žïë7™›Võ¼¨~i2×·õõöh27`1åBVúxZš»b£s"±àbþ‚pvC©Úu³Ö‘’­±ð4©ÚŒ&3ž+ïW¹"¾n†`9ª^É\Ähž,F5O†Bi<ûça×c”äž–j]´ÐÂñ†¦ì2®ÏŸÏYcØðÒ ²C‚‚HšA„Òuï:t›®äºùñª›y¾8>¾¼™V÷–÷y¤pO-S±€UOBF7‡CŒxú~•´Ü œÃñßÁóÀ®Å¾Ãêt û&/[¿õÆ„•_ÂÉp`¼a\{ †™46ÃX)«ß4„MÃy œÇsJA݈BÝI>94Þ*u]ª¶kä·Sø#fíëà>xvèNÿ}Øï°ð†WŠñ†!€»p©K¿RÖÙÔJC*r›'C-{1Ôžcà Âï`9à•ÉOx=ø\/w¡Åo+Þ{|b1æ1­§BCZÃ:ÿxO0E;ì ¯”#—àw }ª0l˜`þ¡ ž>­Sx†¨L*ÌM ñg/݃ÑBZÂkãïÂrýMzéJJâÝâ1xm~å×v’Jr­^¥XÿYŸ <š¢Ãæ‘ve¥)ç.¨£öFÝiEÚyáØôðíÆ· ë@%)B“$“>„´ržl™ô®íŽÌsŠà _ j³¡ë*ÚÉXâ§myÃó gЈO Ö'ëFðy½d¯lDiÛƒ¬NÝŽår_­{©EµÄ?sRœµ0Õ.ó/Û•­t©Z2CQ’aZ¾êþµ zˆðeÄcol`ÊT–I`ÎÓm£LYŒ¤š57–T¨:–(Æß¥-gœNYTâÞú¬\åhÌ=”’Ëv”þ‡¼j¦"¥-wªbâ<6ÿt‹‰”ÃÅÈJiþÅ!/E*Ëf•Sm©9Ou—Ò•–dk£‡ó»9õN9I¿‡¡în=3É¢©,ÁXBk‰è-*¶\@;ï×|iNßÖÈÃôö¦¢jÐñ g^û‹êëtÞãY«{<«=÷xV* è:ë–½ŽzÕžZ3ެîú”P0ÕSm‡ <åé§[¸ðy&c2YÕÍÙµ2Öuºw‹ŠyQÏêð–]ž©ñnvõ0Ï9 …° ÏA=Á®U¤»LvýTô)ƒörD+HP‘ˈl¥mlß”}'cy˜†,1@[XŒï;çá©ÎVÜmò”÷ &”#¡e!©0l=MéIŒeÉÌàöÍHþ§¢™³½!‰;¬ÔSúsú•„-¥©}‚S#Še ¡]«+ñW)aA’GøÁ« ĵIè>NèåŽÅg0i`ØÁÂ&¬ºF«ˆVQs¶ôìj‹3ÜZœ®¨”VVðôÖ š8É'KÖ ¨ÇÚɹ!eî'á]Fÿj™Ø,AÖ7­·xd‚lV*E˜‘ƒ’”®˜…ІåN¾"WVyåzZ…ˆwÑŽp=%ü‚™…ïLtèd‚kÂ>0!­‹^«Ïî1Ó·ÄJqû%ò)­ýÎîy`Ýeaë_YWRòF´ÕÍ×8þŠi#¦Ü`¯LD‰¨§½bûo;ù4"zC‚³ñ0åå*}3Ds-V»&uaj/q«J3Ü3%êMñÉÚÉrÅñ“‰2ÍÝQû§è¨ªkÃÀÜO’u³áãí@Oòf¢½N‹FÆ  Mcߎ ¯€c¡Ÿ|'K±AŽà?°q¡x„Ÿþ@½„q´ÈUçÞñßéÛx—Ç«:}`ùöå«çr»T¡ºP…^ºà}5\m¬=©q[žˆAµç¹‘¼©Öö’KQŶ=·ÛTe¨Ï@¨ÐݹÛ]ê6žÌ÷И³¬-XCsnç3eÓ›­yzøÎß™A§Ïº2ß[Òô¶F›Oîõ_žàgábc…Ð; 3Úz¢Ð:–H{gÙ1ÊÚØž/@©›~ÖÝ"ak¾·ôs ðÙYÎAã¼³”xß©ºï Å™ÊÞíEqÜî)>xçð<êÈ.ô}ÕžÕT)ÇÚ<1~Ò]SFAªxúøð$ô&º endstream endobj 3898 0 obj 4962 endobj 3902 0 obj [225 /XYZ 40.7999999 324.500000 0] endobj 3903 0 obj [225 /XYZ 39.8400000 244.819999 0] endobj 3904 0 obj [225 /XYZ 39.8400000 674.899999 0] endobj 3905 0 obj [225 /XYZ 39.8400000 244.819999 0] endobj 3906 0 obj [225 /XYZ 39.8400000 511.699999 0] endobj 3907 0 obj [225 /XYZ 40.7999999 324.500000 0] endobj 3908 0 obj [225 /XYZ 39.8400000 674.899999 0] endobj 3909 0 obj [225 /XYZ 39.8400000 511.699999 0] endobj 3910 0 obj << /Type /Annot /Subtype /Link /Rect [251.999999 334.099999 309.599999 341.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 >> endobj 3911 0 obj << /Type /Annot /Subtype /Link /Rect [87.8400000 255.379999 147.360000 263.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn15 >> endobj 3901 0 obj << /Type /Page /Parent 2 0 R /Contents 3912 0 R /Resources 3914 0 R /Annots 3915 0 R /MediaBox [0 0 595 842] >> endobj 3914 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3915 0 obj [ 3910 0 R 3911 0 R ] endobj 3912 0 obj << /Length 3913 0 R /Filter /FlateDecode >> stream xœí]KÏܶÝϯ˜uŒÅ‡^@QÀþl袀a]]NÓ ˆƒºYôïWQóÍ:’xù5bÄÎP|]ÞÉ{ßüùó?ÏÿþýüæåóÎ_ÕŸ/ŸOÅ¥¨ŠáŸsÿï÷?ðæ"øð׺)/¼íÿ9ývú~þ~útúÔý÷û‰U׊ê®pìbhð÷¯¿Þ Ÿ†_>¿üµûÛÿÎüü—îÿ~9ÿýÝ?ªöú¾š¶êÿòëðÆoºÿ¹ÿ[_øóéo8ÿÖ ¡¹¶Ûÿ÷^ó¦)ÜÆñýV•]ÿ½¯Š:+ÎB2Öý1Þý§ìÈñß~êZ» ãÒv_Ô•¬‹Õ­Ö¼o¶h«s[Wg΄Ѩ1·uM1׆DÑøi¨s›+d=ß™ô’óôÛ9NtlÊ™b•lý4Ôˆ¹Mm$=nŠLúºòFú±)gе'Ò÷#òDzÜ•ô¼dƒpצ³›ç­%W‚ñ²žêFÄœf¦o´ôÉ‹%⯖èûLÅw_No>2)šÞð~ù©ÈÕz|é&[žè-“ç/?žÿXâãŸÎ_~9µ—Ž’u9˜û¡¤à¨„¿…u*a¬ó–|°ïGÀ’¢…ck`kÖ%Ïô¡®A.É%i”H¨)8äk^Ú÷ᮚ‘S¬C"I0Ö.˜:-†µ%Ç£†pxµU_:kܶ ‘m[ ÛÆa?#ÌôŽ Ö™äåÉÀ%x¦Cp?˜CXý\«)º‚¢qô`É“ñž­d†Ë1¿`[ ùeÆ F6÷IëãX£dÖ'ŽV­Y2ZèÙJH{›¬! Û´]ZÇÑ\m:’þl%øŒ[º~Áç(ÇÑi Sô@Ú.î*Dу¼h“ÑOWB8ŸÙ à¯Þ – <6¬fnð]¬CÒø‘¤ö8u>83HQÊ|^m,Øó¥œ¸îr>QíoÒÑëÏV‚½$ÈI3w¥ð–of,…á[nx3(ñÝ<Ô Ê Éî> ´]"ët$ðÙJžŒ—%äX ½û™[Ö($RR¼òõ•#«\ìGU½æÈ*Ï‘UÇÑ\¹$—ìØ~@¿([ËÒ”!yÌÃи¼N@È1¡† m^׫Õ~(’¯_°¥/ŒFÍ/Þë_´ÚbðÛ¿Èi{ÅØ¥”UÓ•éôcÅ¥ªÙC‰Ñ<þT1ìE>m.M[T¼¼çàA†êK¬:ÁÆïÇȧ›÷°è-XtY ‹ÞÜ"ÍG?¥®ÊÇ)}q·.Nñ%‚ÀU­6tÊ|œÂm£óEã·bà79r³¡ˆ_IÎ „k œ­ !a¸ŽÑ¼1ÖU] W~•“î¬Ð»ÁuñX«Å±Bº‹u•XÅìr1ˆ~9Jþš5™™Å’üÝ‘BÀOuR˜tµèÆâ¼B´1ëb2B¦·‘:kE'W m¦8SPpóÆ ½é`h;D©©6åÞ1ßzý¤-ȯ³Ê WÅauV0á‘P”¡ -  ïXÈ"nÄP$Y±yÉ‚’® ,{˜Xæš$Á¦[OìucÕûSLRŸM@ÃÐÔÜaWáÃÃŒåïxñ† V҆'ìâAãù-ª8{-~›+‹1‘°Z ¦1¤똲¦«u’5ÆjÀ`õ›’JíÃzI´odŒ¡jËŒ96ŒxéÍüvUmr¿AÂÖ<¶‰ oÑk5’ž…•)Ù†´P\ÙZ³.䘷Ð8Ö¡ø–ød øZw?¼%¨} _b=g|X<ó j×ËI¥éß[X/ƒ+Â8zuïrL6ãGâe3ÔÞ–ÁAˈ‘€²ïÛÉA¿èðã‘‘árI.QÚŽã1“7ƒ%‹ÏOЉ~£LüÆ£Q´%Ò&õ(Yõts«—2ZÙq2¹S^…LÑ£![±8ï\â»$­Hí>i};•ÌúDÑ·%ËèÛÍñÒv*››Óí@zp·8s¥È™è´„ñÒv* Sô@zð èÊ2½q ’ŒM—’ZƦóMÑŒM7gÁ26] Ve Õ J2j]F­óN=G×4sƒ’'ãòŒg—Â*à™ng—#ÒfëŸÄ·ÍÒÑåúº›:`*(m8“Ên  ˜lcÁrF>·Ü;ËP±¸+¦-àU¡/¹¦Ág֒³Æd¡† Œ [®b!±9˜9³ j•^6‰We;jèÁu½J™s xëuvz8é`zÛÌ`‚=˜`[ê¦(0†Ž±Êx-1ÅàÀ~–½/.{ ­ ^”å-‚Á€ˆw3Š2ÚŽXŽYR†÷l¬±:[˜Ò ›£Çº,©ÃÄ){€£DÑÞ.-’Óe7 ºW/8G2(†`©ë€=¸+.@¶Ùõöãzg\Á5Óñ]Š›§8ÔËHƒ^à æ*&F_Ý£o&—!Ö}+á1ãúå’ý–àû}¿9èiÄ4ìxpûÔª)#–'ÿ:åUÈ]AÑ8ZUdܸ}”$ƒ¯uIß'­cÛ’YŸ8:ºÌXsû(Ùgm§ò¼9ݤ;w‹O×ÔŸn%)#°íTj¦ètçbÚ5m:z#—Ì–d¼PÛ2žoŠf¼9«—qðBX½¶È8x;)ÉØy;Ï; tgýÄ3vÞNJžL22Þ^ «€gêo‚pDBÝÙsaÿÅ^¡–à©ú³ŸawÖb_¾þèvƣ؟¿°æ ÒâÇØwëÓeNv8X²Ø€X,o^œ°ýÞåàc| J-œéD(LˆÃ–ä4L³ ;?™‹üpÍQOõü"F¯x\ŽßîDñäÞ„yú«úåsÍtØ‚\…||¦6Ô¼…p`Šáe&¼5cábâ—(¯ë™ZÞÄâÞå× )ëHˆ¦ a #쀅¹v ?‡²ÅÓ1vË„'¼¼<Žæµ'—û>’säæÉgìP@áäê6çU:IVš`sü¼éâ,zñ\ߊ3XWèºÓæ­9ÊüÂ<Þ[]~4xEë6<̽„[n¬ÄMåpÏ&­à /;?û‹T˜/ ‰¨Ô¥ïGyšÒ >=X|É{&ÿ`óh³0G¥îÅù[V>‘Ÿ’\Ö./|Z·‘|?¸&±T\%„ûÃRnˆÒrìoòïGØF—Ë3ò›nÁÂÔúÔ·J¤XnœcˆYÍ[ÒÒJ7·aÖD•ƾAó“)Æf>Ç¥~äÓÔHï‚[¨ò0)Â*ŽhÎɤÚoBµË\%“û-‚ˆ,^D·àqÈ£I#Üò—•¦ÌmvŒ”´[ÂQå¸Àä¢åk•Žß3GœG:ÒÜÓÈ%Óó ‚öWHc½kP`1eÆô-o\/öº3víý꥘aʽ‘C8ÃLf>%¶p§h-/uÛäpï@:(ñ²ðzU»£x/‡¨ð»W^pÈ)~o'Ö£ÇXhüåKû«ÇMÒõ˜ò»õx«\,¹rÌu1¾ÐÕÕÌsëxŸPyn¬jïèóÜ‘¦ëè‘4ø ÅóíØúxLÏ àˆ—c8ýD:xMØZ'”ÏNHÆs"E0}kÕÉeHPL•ö}§À(a#A,mn®(á¤Ë«ü¤!P~]G Q0n/7z1$!ÝÄÃ%!x×zù0ì´[ý0F¤n¤nD‚Ü_˜[‰&-?Àå^ŸÀJÂp1Æ¨ß Êru]—´q§c¬õÙÔÅ’î7?×4”z÷ÐÊ ÇNùó¸{ ¿E¬Z\SÓ¦{ñ#7òPò±ÛÇn¬å:»%srEJ,HîH:ÇBX(|¯@ 6ŠÌkˆ>Å¢À\-sôæ)ÉìGI-z¬šxo¿J^¢zHoÆ„¼é™6^&)ˆ_¿CG`n ³-‹¥Ó µÂfõWÍ/–Ÿ²Ð‡?Y£œŸGÞ8šóµ€g0ø)šÿâ’DØÁŠ1ÿl&¬ÈB±:Øoõ’ØŒE¡JÖo*»ž°Zzfý^‚míúî;(&¸³y6Kê±OÿsÊÅë§‘S.fD‚¸oŒ$l˜p¤SÏÐy)îÆËƒ´2)Pbœ(t‰å·7ðŒ¨µ•(í4UòKZûÖnÚĬGÍ‚û„¢©4z±3\ìQÈ–RÒƒïŒÎšôÛ‰ÌÞ!±W´Jìÿ¿½4Mq®êþš±¦ÿUì\Uãó|ã/_OUya¬åMÃn_ɇVä}Ý÷êÿë¾Úù±¶h+­þ—®ÎÃH®_µ­´}ü|z÷‡p¢Ý ’- ±(ÙXYð;AV´Ú8ÍËx4i š ˆËÆzÏ©1˜&¤ #Ÿ± î­žŽÜ%³Çoì´C,Jì§2ì%5äÖªºžŒ<‘Ú¶Èݧ¬~ð)$k¦| ^è>/LŸ‚^Ä­yßÇèSHVMø’•zÝ/ºOqýª}h¥}ì#ŽOÁùãÊOùïP ‡%á_vêéø8ƒìmdo#¶·ör|ýn$ë_BðÌi¾DGH^³9 óš3¶âR;) ƒ²Ö•^$­ÝŽi·CTn‡¨§ÜÑê.A÷‹ávô_ɇVä}7·C”Sn‡FÒt;ú¯Ú‡VÚÇ>â¸7ø.‡£Œ©xHÉ «‚KÏM9>oaû ~|ÉêJ£®“K´õ‰þæáKû¾ÆŒ“­“žOV ,>…»É ù:'—eùh\Êjʸ”®ø»_ ãÒ%Z‘÷}ÜŒK)§ŒK)Œ>„i\ú¯Ú‡VÚÇ>â—J[Å)^g³ãÍì¨[³Wºg³“ÍN6;[ÓˆÌ`A›ð»Ý†éŠÅgæI[£u/ÑÅ^âôJiæÌÍžYÄkœz¬xñ†rE—Údš_®½#~MæäR·F¦¾¤®1»RxýÄÀtI½S4º] `ëx¹’ð!k0ísð¨¿}p-÷Áu9µ®k}Úýbìƒû¯äC+ò¾Û>¸Sûàš}psÜÕ>´Ò>ög\·«h‡‰w®pï¬<Î{MÞhssÙkÚä.¹ qáÝázLH›}*%¿x½ƒàâðYä8lîdc0ñ[nÃú±rìy q®IlØúÕÒ5É¡Æb˜‘jäøå·sý ¤‡ßÝV•®Ê‚PšZÏ€Á3mÿ®EÇXäÏìðN› Q—œk¿oëRVË%·Ûk yä„U›ÄC/¹&@²©Å,f´M+4;0“‰gb‘ ï5Ûg&ú" JغV½óŒ§qOøŠæùô‰l>îCHY¥^2Ê×»Õ3#ñøE?ú@æ^r C¦±Ž¡ñk {-€˜,9áý÷8g1$^ÅLJ$>¢  /}” 8+¿×í‘ :÷ˆ+µ§°”0§+V1܇5ÂUH@@…QëæaÙïw|<h³† $ ¬·^ÎzYŽÁ·’‡ˆ¨›ªó–`\ Ø€%#ƒ½¨2ܦêà’–0XWÁ™J8 i ñØ0up?CðúpŒˆ‚WŽ`ÅŠãñLñ|ff"kÔjÔ~H°,à’G d.òa„ f¤ä.Õ*¸-¨]è»XrC÷ïù{7Øn ýê¯ßV…8fˆÃ§Ù‰ÏV]¤XSY7©-b˪Ëuczň€©n3«êRMŸÖ·òb8Vƒjàõ¥ž>­¯'J·Tˆ o'=º²¼Tƒ—¡û'Sý4°N ë ìZó /D_¤ ÌTkƒ yÿË{ø­Ú¸MÌð#ª£LêT CóP&Õ®ŽZ1›¹«±]Àëú¿ó’Õb5Õß[{>`˜w”Feغ:ÅPôZRè«­™j®)æ¼r¸öâeš¦¨.¬R×–wŒKîP¥>ùÔŠçO§ÿü"î endstream endobj 3913 0 obj 5423 endobj 3917 0 obj [226 /XYZ 39.8400000 785.299999 0] endobj 3918 0 obj [226 /XYZ 39.8400000 526.099999 0] endobj 3919 0 obj [226 /XYZ 39.8400000 203.539999 0] endobj 3920 0 obj [226 /XYZ 39.8400000 85.4600000 0] endobj 3921 0 obj [226 /XYZ 39.8400000 785.299999 0] endobj 3922 0 obj [226 /XYZ 39.8400000 526.099999 0] endobj 3923 0 obj [226 /XYZ 39.8400000 203.539999 0] endobj 3924 0 obj [226 /XYZ 39.8400000 85.4600000 0] endobj 3916 0 obj << /Type /Page /Parent 2 0 R /Contents 3925 0 R /Resources 3927 0 R /Annots 3928 0 R /MediaBox [0 0 595 842] >> endobj 3927 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 3928 0 obj [ ] endobj 3925 0 obj << /Length 3926 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èóÛ’H `í90l ‡ ‡À›Íb/âì!?ê–ÔÓMê£ÄâCj5×ÀÎŒ(ñQ¬7‹UoþôùÇý~|óòù?ǯÃϗχêT5UÿßñüïÇÛ\ïmU}âúüßñë·Ã÷ã÷ççîÿ߬¹|8üèÇ!úÿúÛáM?ø¡òùå/Ýoÿ;ò㟻¿~=þíïÝŸ†þÎ/|;(Ýœùwÿ ㌫îÛßοþúÃñ·n êÒïùÿ?òVVº{'d߯Ÿ²Ë¿ÛOÑ`ÕQHÞt@`Œwó¬»ßþûÏÃÏ]o×iœ´d¬md[-îµåçn•àGÝ6GQI«Skm˺b &ê(]fÄ–Æ*Ùº»¢‚^p%/ËlííôØØS0äE­ãttž ZÙxÜîÝfö(¯ªÐeŽ]ÃKUmœŽÎ3baK!»"ƒ^wüë²L!Bzí*°#YÕ‘ØÖyF,li#è­®>E‘DüU}w|øîËáÍGu–º_~î¦qÝý/ß\<‹#ÑýõÓñUÅÞþñøå×Ëìú\ªöò@¾¾ÁæÞ`ïýßÐæ(âò€U§¦eª­«k‹xé[øIŠîyuÓ"ûvªes÷ “¨7k`ü*gŠ÷NJW ¯ofR}¼´´§Js¬>ôÝ‹NRŒßΑOwÿáK‡@aè :ȪG‡Fl.CêSÛÔ÷+â­¹c.ñÅ©€½Â¶À9ZW}÷rÄ”›?ËaÞÃõ1†áo¬î­¹Öh®•º´4'~ÁGâ‚Cö.Ø$ܽ5“åëãL1÷Ñþä-B$$x ZÝÉò xl~•÷äPüdI‹c`¸PŒZ™°ÐÇh¡iS(ÆsƒÌpQwc".Þœ—äl_iƒï;fcNÛ±—”6äféÉÞ(kŠËwÎÕx5œÚcŽÖ·ï‘ŠB‘´ƒZLȤ1( È}dæS¸8%öÎ\¨µò·pÏ=øb ÂÒX '€§†Ç³ènù\ '.Ez€Ç¶åª.Æ Ñ ™ Íä¢@©Æ[Ö™!•H1GÀ¼e¯ò ¯“¢D/—lŽõ cü€ŒRÕ"¥Ÿ¢ ÇÑc2Ù[QÕsV™øMØv[ß®Æ(ÞÃñ øâŠ…AŸHO$-g㢋ç&—²€d˜C›#(§¹ÌëåMÒ”,›ó1 ïÚâ~j1;t0.‚¶Ä˜X7žß%GÌ>¬îô¹3¨«ÓyÞß®³“RÕ±iÏ?ZÆTÿT›æt™CUO¾šúĘæJ±ë[ò®y;F÷~ÿ·ÔçÏŽÆ×R™ctOºoîgr~Kßõ¢ïÇøåðî‡@žÊ¤@ç#j`«u}Ïmô©¶¶ G(^ß ¨6Õ¢fZJ&[}9„­õj‹Ø¿0ÉØ¶\CÔ÷¬ÕÖjò°åõ|=XWÂìŸ"Þ’>’9dGP\mu¢ýR׿ÈS*®¢1YìCZ–:cJwÉg¤{¬Óúñ>„HÎÝ(ºÜÒut?ïdObxœ­’X˜Ç9eÔã-ìH|ν¶yxkû‡éî¾×ÝÛjJwo¹©WwO,Ýýü–¼ëEÞŽqÕÝ5¥»7­9F÷ÄÒÝÏoé»^ôýyt÷VÎêîWG„­S¿C-¬E-ƒ%›RçÊX[ˆŽ•@š¼×>~M(êB&GnŠÓ 0Ùø•ãè„c|¡X”“ÛµåÍ9ÂBi|°~€’Ò¾hëi1àˆ±õÆåó‰YX=‚ê--¿%ïz‘·c\5fÕNi̪1ÇèžXóù-}׋¾#ƬŬƌ=×X/fXËÆ>m[^ þ uv‡'{K/¼˜®)þöÌ2OÞö,@õÛŽXY~„jÏh¹oÛa¥­åíñ0–¬§˜‹¡°ü±DEmð6>ò‘ºâ&g_ÝjŽâöÛÞ™””Zvä¦ùÕ×%ëå›rа™c“y·‡èeâ”Í—8þÅÃÁ¶ ’ÁQ.P\ ËmizzEJÌ$ìž×°7Ê¡O¸ÅšPoC:m€Äq샅èËñ:ò!᡽PKE'P‰í=Äà³´¾ä·ó³›ó˦œQn‚cÉ‚í<7le`ìÅzçöóÅz­ã›ÃóHˆƒph§Q=üìÅX…½-ØëFYiÔ[ßÒÂzø&l0Ñ-ªØ` ö¾Ø`êmɦ{N”Eðnã•:h¡pül¿Æt-‹ýŽ/šÍX ¥¥´ÄoÁÜûýö•c.„õè¨|С{t6 ÜŠ•î”SÅJ/Vº«Š•îܹ‡\Öó(-Ñ ¯I֗⥥´äÔ ãê8¤oŠ!*'Φb¸aY€a€%%–ïØ?ù4rj#2§-7àKËž[0WuØ®˜CÆåÄ;GŸSîQ¼›ßaR¼تŻÇÁRrÅa‡´Ç™Kñ¦¹ø„A\ŸÌÓÕðÒq6¯ýè’u¢´ï\'Ø" Ž ŠöAqçEaa`—ØrÆD$»÷}˜"y´H3y›„±ÖåqnbŸ†ÈF Z% õ÷*Ì! Î/ZXXMÑ,fD8$œ÷œÌ–è «7}€HÃìò( âƒFðR‡}A9ð0;¢øÒ=Â~–ŒƒqHÉg9ÛÚž=Å@§èI„å|d™½³” eÍM>¡HÒÊ4UrGA:z 8™Ý² 6j#ÊÙR cv€!üZîrŸ›­¢ÇW–+h£)D ¨päò¬O*ŠUæKð/Ħ¸Å—)× sA‡’0—’ÖÓÑ‚¯Ù.jEN³á øÚ}®"vÛ¸.'Ò&WM¯.}[êEazÃêh9[qÌ5Æ‚m»ÝãÄ> ÞDe$(SQ¬¯(úMÒÄ*m'"Ƀtg=m>–„E§ZxÒ+UÚ!Ñ^›¼à˜<Ï­8ŸÃCC¼#ôq—t)Éq)å<ß%nì)ùÆeBiGêo\NjgÜn}XGöþ¬¾žpÈzŒv+rroöÐóð§½íœ£òê;·NÜŽ…{ 'Þ'Ž{ÚôDzgT¸•ÄY.¤Ç»†… í íM«xL¾±·]pèv;ä Ë=¹?é(H¡ZŒ±Ï£Áe‚hdÝ.Ó¬7ÂÓÄX"²ð´ýñ´½é{ã5{Û‡>ø\\µ.Qïû媎õ°Ü± ™¬Òõ׳ªm¯£ªÝÕB©…qËgÇÍ|‹KÔ¸ô¼á•n„ÒU‰Õß/¥¯ŸÉ Œƒ2 Ü(ã¬!Š÷tÜ¡­JÌù~¹ƒÀV%a¥¤øñ‡ä¹à¶yîÀKdyáé¸EãÏ5ëP ,‘Ëû¥@‡• ±[¯x3¨` ÔƒöÕA¸IÌ ^K<7LÏ%ömŽ£4%wÇåi蹎znY,‹Ì\HÉy\^5ÿ8ZÀP”LÉ1@Žõ½Ékå8Òñ½¾ÁæÞ` ˆ–«m¾1dª¬NMËî³jö-S©ã†^í kWNi%_`>1Ž„¹2qoC}á©Y› ÄJÒÍžp´®Á³óÍ11&œ39¦Õ}úÌ„J]c˜<’aFÉ!%ÕºG"âå©«}²FIÒ5_ûlºcœÍ3$ÇoÉïšÒ|^ðÉ/1Ç|Ò´ðqJ2û”à³ò®[¥XqÝ.ïí)åƒb†€H”Þ§&`—µSƒô÷*ŒÂŽT…ƒ¹×}äìò"á‰*C$A›z,È'áÆ‹Ñ3Mf,»Bªëm¸Î¶zî´Òxr^®TcòòåÔ±F\}„R;ï{í; Z-/‰[†œâaî‹À8Éè1p–W(µö`˜tzXWóèL‚#µi3[Ãá¤Y‹Ø–hH‡"ìûÒO}êûRpÛDX¬í®Yv›ëÆ$þ4u–¶Ë`=j‰%fq-s‚®˜ÿ®æô° \[' 194Áƒ–È?ñ&EH±R<Ük—B'¡ i¥0dHÌrbÒ§¨õ‹±H¤ØŠQަ¢r¡RŠ+DûÉYŠK×Ï—¾Æq‡2áp<Άß¶\¤ËqåïÜú+Åãàä>«¶|¤ÛçKS¸Ã.Kæâ¹VŠ¿q̇›b*Ùx ­Ÿ/ Já(®Ë™Ô¨ðN×.’ªb:Å{ú¨|PVì:jáƒOÄ O+Ì g0$zœ:‡3p´”K,’½¦•Hs#P¯šò[Ããx/áU%<ƒsŦG>^xšëûó8m£gSîÆxÄ)¤9·§œ°{ÌÄŠTŸßrŒHq<”ͱqœ|´œ¦â„A%?ѯ+iˆ“D¨™™~)×H(AÃ6ZY³Ç1¢inÙyàèÚ×r‘’μ@ZÎßT£ÈŠå¡¡ŽÉ/y™g»;Åר9w£„B×ܪÅkô* 6G­—êþ¿w[ÑAúüÂðãë7ÇÞØ›Z½nê'ç¶:?wˆ4GÖ-c#„fÍ邇GQ)HûªiNÍ´É å ˆÞžÚé‹íDKbBœ¸6oØûúÔô›`ÒÓÔ8 ~£á7=ú·üÄ+qç bC¦zëqúöÉ{øn/hÔÄ ?¢ožjahEø}3ì˜ÏÚ‡¹] ëοóšLhP(§Æ{ë ã΀µõÍpšÑ}Sµ÷^!Q™»ÍkØ?ÜSŒxçð8ì%Ê.(U5'vöÔÛÆ-7èO1¹âñÓáÿV±RX endstream endobj 3926 0 obj 4864 endobj 3930 0 obj [227 /XYZ 39.8400000 180.500000 0] endobj 3931 0 obj [227 /XYZ 32.1599999 378.259999 0] endobj 3932 0 obj [227 /XYZ 39.8400000 143.059999 0] endobj 3933 0 obj [227 /XYZ 40.7999999 106.579999 0] endobj 3934 0 obj [227 /XYZ 40.7999999 352.339999 0] endobj 3935 0 obj [227 /XYZ 40.7999999 264.980000 0] endobj 3936 0 obj [227 /XYZ 40.7999999 642.259999 0] endobj 3937 0 obj [227 /XYZ 39.8400000 226.579999 0] endobj 3938 0 obj [227 /XYZ 33.1199999 376.339999 0] endobj 3939 0 obj [227 /XYZ 40.7999999 352.339999 0] endobj 3940 0 obj [227 /XYZ 39.8400000 180.500000 0] endobj 3941 0 obj [227 /XYZ 40.7999999 264.980000 0] endobj 3942 0 obj [227 /XYZ 39.8400000 143.059999 0] endobj 3943 0 obj [227 /XYZ 40.7999999 106.579999 0] endobj 3944 0 obj [227 /XYZ 40.7999999 642.259999 0] endobj 3945 0 obj [227 /XYZ 39.8400000 226.579999 0] endobj 3929 0 obj << /Type /Page /Parent 2 0 R /Contents 3946 0 R /Resources 3948 0 R /Annots 3949 0 R /MediaBox [0 0 595 842] >> endobj 3948 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3949 0 obj [ ] endobj 3946 0 obj << /Length 3947 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Å—À"€ç ‡Èa‘CàÍ&XÄ‹Lö¿uKêž!õQd‰¢¨nÚ€gÜÕ|«ŠÅb=>ýéËßÿüýøéñˎ߆Ÿ_eQVeÿçxúûÃûxSÞÿZ7ªàíéÏñÛ÷ÃÛñíðzxíþ};°êÜpøÑÇ!úÿöÛáS?ø¡ÿäËã_ºßþwäÇ?wÿûõøÓߺ?ý¾ðýдÕé—÷¿0ÎxÓýçýo'à¿ýÃñ·n ͹ßÓ¿?ðZ‰RU‹æñviÊÎß7Eƒ•G!%üÈïæ©:tü÷‡_ºÞ.Ó(ZÉX]ɺtîµæçn«êØÖÕ‘ËÚèÔX›[WliG’ñ0fÄ–-•]kkWdÔ«R—)•¹Ÿž »ZŒ±Kéè4#¶li#êqWES àï.5Ý(ªd²ã¯Rv,; ó„ûù•ûß, ¾>½´'I÷õ—nµgqÙÿøúý »ÿœhPvП?–%ã<~ýõPe+jÕË×R>Ÿ!ª® ãê„É3¤¹~Pê°óŒRïWk”ý0rìãÝW›3¤*8k>vÂú6ׯ>jˆêüA[Ô•ª>,‹ÀsÕ{e•s[^A¼Â6&‚kˆŒ5}Òaö’I©`<0ÜYåÊÅ˾Íó׎Y—±“¢ÜW«žû:õd Æ—•±Ž ü3l#„U°Í„<û# ¤Ä+m!¤ñŸǽáà•â@ˆp Dàýy @àJñ $¦*H‰¸hãqS')27enr›5#Ìú1$7‘0ºùJqË ÏYøÎ Y#ê,k²¬y?kx 3 ,…´ƒÇÁ´3\’”ª¶ÁsËuÀh ©ªÙugÈ=A,¼‰©ßm°ŽÏÝû‘(ûÄõýœ¡ÉìOœ³ û™ŠÊ ˜7-œžåzx»#½®ãÈÛV&Ãé’Äb9¡ð3¶ÁÝ$N£w$£ãîBé-˜HFndHÌ3–± Àï–”ï« ¿û@Û¿Ä/iÓ%žÖà¶ßS$ÖkbXÍ×òr…Ïݾ ÁÇQóË`~±Ä±´÷¸öA¡¸~Rx°†É+îBÉL'`HEÇÆp8ÈãxÁf/ãY¤¢@ãQ’H¿|R<¬Ãµ¡Xcþ­D:á݃¥7]°)/–«Ãñ‘œ8ÜS´7‰f 8vÌÁsÃÎÄ•Jlf„¦IŠq´ Ê%$³)!üÅ’‚;bó,¤k®½fÇØ Šq)>¦ÙTÕcéö?ÚC ÁüMzÀÝ%äÖdå‰f{‰Bx´<Ñà'Aü„ŒÏC8ƒ4|T{1ùÝä J/·&ÓîGra üìLp~!éƒ^°ÈN‚PØYï3ñv[²ÌkòØ‚àVö¤Ä’Q˜vpˆÅE‒Òï>1ÒÐ *6åf ëûÕ Âº¢Yì˜;”Óˆ¢a`þ!$;Ä;gqÉÅ÷)‚{-žµ „ëâY'ãG®‹®›!’!Ang›ßÜfâÈ[Å“ÙÇ É Ù3ÄÄG¸„MuNÒþñ»%ð’r’b[ œS ûDlƤ†„ Ì$¤±„ â•âTS[¡…³‚Zî¡ôàá8šLÍæ©eZþÈA½Iþȱ’Å¥¯Cn-‰«;Œ,Ì’øæ$ñýøâîÔÏó\ú~µ)ŸFqÎ&´Ì É ºn“}вšý|Ï/· ¼Ü.ðA‹¢¯4e.›!’!r×ìi–õ•Ó·Ï7òþŠhâ¶ì=Ãb'–µŸöyŠÞò¶yceÝI–n¼§;Aâ¥èš*Þt¢XBÞÉ}JÈû‘ƒ‰p`SÞZ(i—<“5¢&²Ë•&"7Ú±äãýÈ\D6Ë òþà[O$ìà6”óòÖš†äjÙFÞdÉus’+—̶څ¿wuc¯©×©ËåÔ;- ôâ"8Ô‹ã:1½ûd¨Z]¿"¯´ÚW.bÆ(7–®…è˽éÄÊÊ¢’å‡òÍc±a³ÍP6¬.ÚF‡ô3¨ŠÊ(®[û·±ÌíA ¤ Ïê+ׯ>èÅKæ&‡f©Çcꉽ„K. ˰쥲Ãb¶W±Wå5sdØ*öÒ¿ ž¥Žz3¢°Ö*c[j•ÃjÚ¸f6®ç«V=®–Ž+Š[ªƒãúó¸ú{W çfYo–Þàþ{ÃUÕñ8x=xçpÅ÷õkÖ—­&,|wD@Ù`ÁæLL{˜& SÖ3ÐÑŠ…eÙ£½al8™ÌÚ¹”‚¸–zóF•dªàEÝÚ¹°ŒµCQn\€Þ}®–:Úp&F1dcYÌ¥{[zÍ\,$†ìQ£Þ LžÆr"ÕŒÇ$†çŠ«‡…¢U¸o¨Y’Ï cOŒa øŸ;ø×™w)4nÒF–{Mòõ ÝËFjž¦U c‘æ!BãYÊÖ{ð>þ*&÷“Ï¢B z ’„ 6c\¸Õé­Ó2×ãâuZHÚCø,X°!~Ãêc¸7C°œQ¾wØjŠV€¥ÖÃ,¦w¤¡9(­³loˆS„¢Ï–+íܹޔ«Þ˜âBøAt2Ì= t@ùá.ÓMY‡'¦‡zÊWW@ú )+/¯ ºK’{”ó ‹¥Hš™-8ëL­=ÈA¶äÔ_‡¼ ¤¹s åÊá®$šwåunŒøÄqgã„í%Š·$]Q\‰škòÊ¢b¹_[‚°"éîB^IIÃóÆš­‰Vªä$6Þ,&âˆîo›Ö?[„Ç•ÀÝR9IÀMÓÓ:SĤ&ž ĶÓx›‚W<궺û““Æö’ð De_r £A.ŒÓˆqM#X‰bÛþ=öbÐ1"Ü|ùè–¶¹Â“Þ ÝVÜ&k}_(¼M8r-+F®±»†8%œ ½­±‡.š¾Ï[YX)³à Ф‹ã£Æ[‹Œ ³Ôåµð3œ÷ì±sóÞ=Ý5EüÒ˜»½B0>œ/Ê–Y;¼Ez<‡Øê0Š¡‡42°B²ø\x‚*±–Ë<î-Ä«‚GCi‘œ°PŠ}aokJ÷ªÑÅ;áX²\6)ìé!(´9/Å2•#Ž&¸ lï3¶õ½dчSD‹‡çÛ*öHŸÓ#¨p%)È »‡7 ángyý á0ÒÑtÅâ©»@¶wºHŒ›°wîû!hîU2 ºÖ¢iwz Žå&…±a‡6ô÷#Ú§-Á³2 ‚·ÖÆÖ?ZN±®™äöï!³ÀˇºDå\Ùë’²£Žc¬†MõºÐ6%GX;ÅžTêUN€¬\Þºr¹âRÉF;Pö­¿R‹F£ 1"æ2ЬÆ;Æþáî7 ú´ãÖ}Ä´8jâ­æÚB}Ü"ÑUmoŽ˜ú—xÒß8!‘L‰*„ñ@í^ÞªY ZîÖ†ZhDެìñ„ "˜oÀLN..•­¶ÏéóÛÀ+ƒÚÕí‡&žQo”ì+ äôÁã<£qd5ñ[ií߯27œóE¡qÊ ybp¦ʬ1FI8X?Ûºl€û;¦J› #œ…‡€) ö7\Ê´™Š×—cÐZ_öÃqHqahöaýÜðÝ)ßø}nFóaß”»h¸Dƒ¤<¼ˆ=tî%®4 4ù„ƒ\‚êxÓ–ù>[Œ`—!?뚺a­õ}2®`ú7µÍö }ØQËÑÅû”ôèdÂ-ó¢ºDm†fê2€gPû·±ÌíóÜM}ªÍ,æÒ…±Õ„9büáÙã) ÊÃÔ>U3§ÉúG·—\ô:v,)aÅÔB “|ä÷‹@ŽÕx”T“„T ABƒ=Þ NÙoœ+!&™_3T»§ì .=Ï句RibÞœUä|E7fÃtˆ$˲{ÙMñšžù[’ mQBÀ°š‹ûžÇA³X‚1 (?©MÇÎÐ–ŽŽá-ÆÖL·W2íl²H£> IK IïÙšÂdza n¼U ±DÒSaÖÁÑlp²¬Æ!7²ÁßÈ6¸;²Áa{Æy å*‡{KØA+ÂéÊ÷a¦ÊhP¢ÅæSzÍ&õ œEÎCÛ¦¸ó­𘯇X»1µ;„ $Ò5t3_ì%A. —–%ZbQ~9Ÿ·˜-©*ídëFN¨îëÞIw‚uÖÁ*wwr—±–üc+gœ’¢l—Ï1Û¤HÚƒüfÂX›JigEòÉŠqº.Gïãæn5¿4š›{ló‹‰%ÝüRb °YD"ùÚ`KC6MpŒ?Ýfd¶ÅÖ£íµ\¹V³{¨Ü;…{Ãh© ¨Ãù4“e®\šµ xÜçÍ]qñQLøø¨&ømÇ…‘’ŽÜmÙÁøÓyÄ&›Já/sËjD]!5‹Æî^À*H2‘|­OèZø!`}Z­ôóÅÛä`zL ¤]È–i3”=¾ÚBnr‰ß2Û(y†Ã3ø !ò€ âÀ2댃‘º§ ˜ÞæÖ³f eh†îy—ÔþÛçñ¹uqÍÞ²Bùɉl¹T52Âö¹®‚Áh3Œ$QÔzÌ8Ž3'Dî[âª#åBà0æGƒ["Õçbí§p Çá%ÚKDüê1ý§X~Æs>‰ûË'±¾©*µEçˆNÝ;8yä |tÝ''즄óâ‡M£ílb ‹Cæ<Ç, ’µ] Bºpí¤¬õ#ÂÉ$Ç\ÃNq²"ÜÌ<œi(‰‡o4/€|¾R`÷÷øÖ‘ZGI§.†ß¾[hÏ$ÚòJ´¯V²µ6×¹«#;‘ôD&­–UE¯ˆ‰òò¶9¨oUQMë6­,À&ñº¨§¢zÒo…o'_8”*ª~kõ=™§mZئg·š¼¦%zª·ž™Þò¿;¼M¬ðµ˜)CëÁ¯Í°c>kævf€Twú+¦•¬˜ï³?ŒÎ^t©w¸jNõván ¦¿Äs{‚<±3œÑ^\‚q0<¿/œ-ÆdàµCìc®Çk7eÇ*ü9y§<-àܦ)«‚ìF +80†¼{@x y’_ÿ‡¸s endstream endobj 3947 0 obj 4441 endobj 3951 0 obj [228 /XYZ 32.1599999 450.259999 0] endobj 3952 0 obj [228 /XYZ 32.1599999 317.779999 0] endobj 3953 0 obj [228 /XYZ 40.7999999 537.620000 0] endobj 3954 0 obj [228 /XYZ 32.1599999 256.339999 0] endobj 3955 0 obj [228 /XYZ 40.7999999 229.459999 0] endobj 3956 0 obj [228 /XYZ 33.1199999 254.419999 0] endobj 3957 0 obj [228 /XYZ 32.1599999 450.259999 0] endobj 3958 0 obj [228 /XYZ 33.1199999 315.859999 0] endobj 3959 0 obj [228 /XYZ 40.7999999 229.459999 0] endobj 3960 0 obj [228 /XYZ 40.7999999 537.620000 0] endobj 3961 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 405.139999 98.4000000 412.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview >> endobj 3962 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 396.499999 124.319999 404.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples >> endobj 3963 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 387.859999 172.319999 395.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3964 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 379.219999 159.839999 386.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_simple >> endobj 3965 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 370.579999 161.759999 378.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class >> endobj 3966 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 361.939999 151.199999 369.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other >> endobj 3967 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 353.299999 97.4399999 360.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_stl >> endobj 3968 0 obj << /Type /Annot /Subtype /Link /Rect [175.199999 274.579999 212.639999 282.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 3969 0 obj << /Type /Annot /Subtype /Link /Rect [127.199999 202.579999 169.439999 210.259999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/sdk/index.html) >> >> endobj 3970 0 obj << /Type /Annot /Subtype /Link /Rect [184.799999 202.579999 228.959999 210.259999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/tools/sdk/ndk/index.html) >> >> endobj 3950 0 obj << /Type /Page /Parent 2 0 R /Contents 3971 0 R /Resources 3973 0 R /Annots 3974 0 R /MediaBox [0 0 595 842] >> endobj 3973 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 3974 0 obj [ 3961 0 R 3962 0 R 3963 0 R 3964 0 R 3965 0 R 3966 0 R 3967 0 R 3968 0 R 3969 0 R 3970 0 R ] endobj 3971 0 obj << /Length 3972 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“÷HÀX »«Û€Ý€ Œ^ï; ·÷à¿o)õH‘ÔG‘©”ª²˜ª¢$>‚ñbD0â×ýö_—¿þóòë§oÿsù1üüôí…\‰"ý¿K÷ß/󦯜õ¿6Z^™éþ]~üþòóòóåëË×öÿ?_¨º}8ühŽCôþóÇ?^~íé[¾}ú÷ö·ÿ»°Ë¿µýíò§ÿlüyè¯{á÷mT÷Ëßû_(£L·Ìëþöò¸ü£‚¾õÛýÿÖ(IµØ4ŸÓ§ôößüS4¹p!•ÐJY;OÙ‚ãÿûå/moÓ4®ZpÊ&Eû»Q¢!RkÖþÞðá_ÔH ‡2º4þ8Þrãz¢[;j/ÓÑ Œ›VF‰h‚=] ´éö z‡osSLöÐ’ÍÆUN=m—âT”騛Ý´²«$´%éF ø{Ì8ú¶îßh;bKÀ» ã÷ì0bŸaÚÕÔƒmÿ- óuI'NàÎÂÙœ…³‹¸øl<o07œòaOíF.tT ä6@aœ‡¼Ìg%[áùí —J—½ÓÑÃ@/•¹Ìge úÍX¿´€»é£Z°›qF„9à§Æøù÷ÀÿÚþW­†ð÷h\V­ƒŒ‚ôG«À0¬’ WïL{&éôD#·*ŠcO[5Ά´¨[DuífD7­lT]aO%÷¢!)sŒ˜zÚ¼”ËB›ÚΨÈ1Âë)‚§ycøg}v?ë‡÷Çï/¿~¡‚ëδñý/íDº7~é|o+/¿tGLM/ßÿ|ùB8ÿãåûß^ÌUÞÈÞ Ò?¡ |¢à“è ƒO¨†OzBLÑYÖ1¸ÒÀ7pnä„(~Ç!»ÀñþdÌC¯C4w0ÆgaG~€3 ée°·•`XÃÞæ˜~à ˜ø>ù Ÿ`:Íá!xŒ½x=°æpnYCLÌyÂ1cšƒ½°ªì¬{è|þÞÊÖÚ’²!ëXàƒ/±< Pıb¼ÄOh^â•b¬x-‰—nYãÞðnçH–ŠwÓæ)÷§=@Ì‚ôÄ,…»€VWLÎÁѳíîCs%Gêò!eœ©Sˆâcm8jíLf¸c †V/oå•3M-X{9%nCÏ‘(»Še*YÏÛÈ~1öámä}DÂW{:RWFõ"6DÂ÷Š' ᘽ ôþÔð0p}Ô¸½ft€I‘=/ ¤ÀV{3ŠÇµA6D±¢ g*£2è=…ÜøªÊ á29Ëta!b íí{ù`´òÐyGão8’ë˜ÍÅËò à SW"Ðê¢tTI´© ’ÜwN|†ÐÇXýŶÇÏÐü5ú[oÜA5¥ô*…ê„@‰ø\ômê,)B×IѦ¥] «3Ü qŠði¼¾òåè.«ŒÓEÆ'UâN É[o`ƒë+¦qÄÀûSY+[öί+ù¸ÜÓä`ü\Ú—ÿ—áF;7}JƒŒ‹}vìI ¬Õ-OцêB/° øÄç1X“‰Ÿc%¶ûî…ãpØÛú‰ÄÓ¡rŽÆlùíŠòËpîÊ/¼‚ Џ'ðýHŒOóÇõf–£ìÍÙºdR«VÕ¤Iç7¾\̱[æØGqo˜Êã™1æè)ÌxUÕÎ98¬KYãç[ ž(¯@J‚p¤£ §Úá ïO“(¢¼­ËŇëëx‡·~Fúª ±5ù!š†Êä÷'øÀ÷*Òñ:€¨9ʾÇ=–™€í9èRЎ¦}ˆÉW=:HPYª³YÕ˜wÏfßÛmÆJè½­ÎÙ‹’CeWãõ¨¬ô²QUE#ÂOì±]«²`ŠxŠk(]@hb -C—„–á®@i[<¡Õ½%¬^Ä|ŒIhi³$´´vÇh[<¡Õ½e¬^Œ=ÆBËÈU¡U&ô)£ž2ê2*ÐkcÎ`ÙOItzIdˆ¶$‘!fAJ)ѵ¸’èö–°zó1FIdH³ ‰ Qîm‹+‰no«cQ_ÊW%Ñ©ùÕ[&3Ï\@þô‡GVe˜¤² ÁýçyîÖÃY6ˆà2 YeÅlê†Ù.6Ö\l†¹.¶®Åãölt±M½ˆù·gK.6Ã\[×âq{6ºØ¦^Œ=ÆÜž¯»Ør" LÖCâ?mÙ¸œç‰äm¨§{MÕqc$\ÈÇËY÷O¸vZMð“"ŽÎs`œÎ‰ºÚ€Üd­°ý×F,ù¯pý×]‹'kÅ连zó1&Y+–ü×F¸þë®Å“µbô_O½{Œd­X÷_§Ä³bÁV7P.Aöa9Ç?Ì Weû‘Zò#åú‘»\ÕèGžzó1&rUK~ä®^;†ïG¾½e¬^Œ=Æäª"üÈÒíüÓqŽ-^пu}Mø˜ePÇh‚Ÿ&%ñ¤Ò¶gÐè%Ï Ñ®g°kñØ=ƒS/b>ÆÄ†š%Ï i\Ï`×ⱡfô N½{ŒØ^÷ fåo;úpNVr¦Í8¾òã ÷ßhß;#ì#öoýÊzÖa‡&ÜxZ¿²œLÀaŠ"ìê=Ùݵre®5/ú+áð÷<{Ü]î´ãxoÍ‚÷VµûkKò[‹£-ôo «1cÒÌ¢÷ÖxÞ[³à½5“÷ÖXÞ[³›÷¶]çº÷öi?…QùDrF$|Mœ„âƒØ|ÇkÂ>&¤5N÷3ì…”×ÖwéÜ+tY1Ý,ñ¡–»ý{ÁƒÝ¶WâQσݿ%¬^Ä|ŒAâµ/x°ÛVááy°û·ŒÕ‹±ÇØAⱈK¢˜+Äßp~Þßz<Ó“– 4@‘¨iþüð˰xn¶ƒ’})ñe¡VVm·A\Ø"ˆ/8vÛÖÆÜsìöo «1cA|Á±Û¶2o ϱۿe¬^Œ=Æ"ˆG\LÞ'ãò[—<çŒáØgïŸáHÏp¤s¢r9é%™-½äBœCÛ*]É"½8‡þ-aõ"æcLÒK.Ä9´­ÄËsèß2V/Æcé%×ãÒ¶çäœ xg\ë~à€ñ”’ot»ž‚í)Øj ¶s“Ì^5´1S5û½kh=ÜÞáSå³ÞV‚¤{Ö-’³ˆ>ò¼ô¾åVѾÉCÞN˜Õ»@a„ª¥¸¸#MüI¬š<J|¼µ9´îkÆTTŵ‘Pü!çÖPV¤a•ŠJYsÜ'­r° q}{ÓxwYÌ}É“€c 8_O0¸©ÀâÇhI©(+´qO ·²²Ï섽ÉŽ¢‚Ô?W¶àÅúÎçʲçüûøó895ì}œ\w§o©p·%¥ þ6M$ÙA‚Ãøsʹè’ÖUdà€±ð-% ªÉÜép÷ʾSÌA§®µÎª+¥ö°ªDeŸ„¨Áw'Ê-Ð;Þ½¸M¤g¹ïM–ãuᘠXsø@{`eµ.Ų-Na÷:~™/"ñʵs²„¥NÝá )øúfø˜’À²:ä8:·Ø,¶Ô^­C"w׫Q–à uìyôD¨U.ËAÇéšÅ”™qØE Þ•Ð'ÞŸ=¾œQ_¨YÚU¦úMÕl²×lÍ‚9[´AOȨƒ6ÒýFd|Cá7}3‘*wÓ-¼‰’ko=1ð:à$¿mÇüI“ú*ÜL÷{Çî8~‡(Á\kn`=_2àFá¬{tm±fÆ Q1Ÿ#FÆk'3Ö¡w™|{‰gÍÒçÆœì ãYÎ` ÀMA ̘õŠŒŒkîr2LCŸ!ÖCœÐ]7»ˆç†á.!•áo ýap,2fà k½Õ?.1:ÞZcŸFp¸©&"¼ELáX¥ôaØTõŸˆP\å†XLg=â-yj&dÄ,¥ä®N¨v^âüòV5ÛœÌÍþÇVõ²©ãÂíˆ6ðdÕv#"L Ç‹!yÀQX㈂Sw|B‡óM‘2–'°3û“ÖÅe%áq¬€4*¸t£_V¡Z½Ñ›AOÞ·ôDÁ'ŽÃ2fð1ã87a€¡Ãà8ΠÀÃ'9³Æ]í­¦+MI÷öÓ•)ñ­Ðmx/†<Å2¶ƒÕã*ÖüSº¡¶è]ˆOïp˜my5컇਴õ­Í9ÝÙRuŸ—å¶Ì¨Š‹óLÚå~¾;OðVëžß–šV°“3¼n8¦ëã_‘Ê%[ö6’%„öeùçã=÷9\!=¸{z²0Ý¢âÑIñ7…“BèqÖ_÷ >ÄŸ³{ÖŠÉ· ")—ÎtøÌÏø\û!}ëÂgø®? œká¬çgx‚œú3ö'Ǻ aoøIÖþ¼¦CÛ…¶×dìiãá¬ƃS®ôi· Qð»³ÛU§’'¾=ñmÖ[‘8"Îm¶7ͧvœË ¯+Kg-Äó}fsmŒsèíÝŽ=µðI•·xWsfb ¯Àê÷lNc¬Ž?…1úiarn·b1~¥½fº©û!D§+3Fœ•~ô¦ßCe!²„Îà̤§ ï’… ·¤§ãßâ–®´¡óT£‚«KCæ I»–/ÊÌÓ–vmJÏ{ÿâcÒÓáo6¤+µ¿¦Þ]-&w&í[|Þ‹½Ž!éé&Ôƒ #šàä¸ÕãRân5ÂUJŠ\zŒÏˆ©ú`óŠPE‹Äf@*šyÃß_¾mDBIm$”l ¥pD  Û¶͆^Æ¿¨„’,!¡0îÂøH(&´z±×ñ`$”jU!aÄø›/)[ý9öwÿ²SNNYF'²°™:oèè$H TÈÛûêNh}C‹’&SÁ4ì[YÛÂd[~´Ñ¥ïo»2¦ûbhÐ7dv:P;ŒjnY“¹½%ín¤=ÌoŸØƒ&¨ìïvˆFŒx5jÄžòpW:ùFŽKm5D‘R5™uíƒÔØmýmçå@M| Ç¡!šuã£ÖKähˆK'†øähîô7uCæÃÜÉQ«%rÔÒFKŸooI»ióPr4ã…@ô4+•©Ï£1XNñøò,žNÌx`˜7ÄÒ‰$Ò¦IÔH¢îZ\:éß"v7d>ÌD'’ˆ:‘„{ÃpNú·¤Ý´‡y$HºŽƒeJz><]Ü"%IéDJzÞMJŒ;¤ÄÄ)1åâ8S>)ÝÞ"v7d>Ì”["%F½a¨OJ··¤Ý´‡y()±õ³ùîQèGCñ-§ŸùÙxzavÃf3¶™@Š%3®™ kqÍ]›Òó^Æ¿l3KfÉ]3A×âš noñy/ö:k&hq'Ñ5< :X>cÜR8*úØ‹s¢JY_f¥ñÅ©òM– éÚT‡3'srFÐhJ lÂîìt]Tôm™[3îœÉÆ—DHPš`cÜ5p{Ó‹F?œ´d²&õ!Ú³'1½®¼»7Žy-8f®)ÿã¼ÂO—¾z†6ã}üeAÂöòþ2ÿ‰ßË 5Ô8 ‰èŸ‘R_““É£N–êãáòÛLEDrV38#êz6†-wOŠpòÊe#±êd×=ýÑnuÓr})¶ÀÌœ›EEîc•à`›öKLâ/éíu!§&Ï>wv*Øï‚gÙË)Q4 y«ßè=&!ÐÀ?ðNbø ¹¯ZUäŽUå¼´ùS7$iª(Ñ áŽD È„„€,âN¨âìÍoË„¬cñku}©?%7O*áÌö(giJ ï°‘‘´­N…°ˆò/xÜõ0«Hh¬Ð-’¡9ã2æ‘êëíídâ¤qèywÎx4cÓº3«Ú f£Ÿ“k5ox„7«›‚ØãÏ—ë–¬´:EìD[®ö¿»{åUDÅN6†¬³UΩ«DÐÓS¥~J]QµmSàŒ…>JõzF"ÔM H–ãçIHé²! W€ç¬Ý‹IS}sÀŒ¾«yv8‹O“[ò÷ÑÖ¶ät*៽™ás5ú6Ò, .Q¡ihªWÊ'iÆm|Y*ŸŸàRHô5ã<,QÃG„õ†ŸQoR8ÃöÊkÏØýíM)7(ùKûà>9…•rÊAá"*¸øÌN%¤V ¼Ô—¯Zåèå °S˹”ZŒXMeî=aF”Õ#óÒïmÈeD¹Èz}ÇXA“—±—¼:ˆÜ2]ò2rÞð+m7{—j¨Ðñ$°"` xb;v±Pô÷‰€ÝV0%Ô*£mDVäœR¶«½nÉ”^9›oá“ ¾æ"!ˆ)¶˜"ñÝE2*c¯ÎcgdYâË1x?Wö d\¯é7P.O­tsdädˆM~KdD/S Ïd{¹‚Òð[Œ±gª'ðvœÁ!a_W9F¡×¶±¢ÄPžºñ°囪×Õ B9ÉÉ{˜ÏŒu­ÓSV¬KÝ#ÎaêÊ—½ VÔH@­|xÝ–—…§E£tñåňÀJè’ð3¼l¸n¸É\À'VïˆjÔ:=\“N?‡lðÅ„V>X[nQäÖLP±Au$ëúºO©l`bNú2,9rnÉ*á½ïZÍ:­æøMâOo›t¹„«±Ö{ç¨(y®)TŒq¤J]^s‚€ß÷?.¶¦É£-4¥Ô©ÝÙòËp"Tˆ@Fº:fŸ^³Óí¹œl7ߢÓ‡U([þÆÃSjæJQMô¹fÓ¡nç>#ïY’ÙccyRéM\X‘ár>Áå-?Á',}Ö‚À'p ÃÞœ†5îÂo¦ ÿ\®SÂ'°”5.ä‰K£v.§˜)ç­'P 6cÖã(.ÇësÃ…¤1§ pnø‹ Œ!ø ¤àÀng”Ì”¶Ç+}ò'yòãó¬ï`è@| è;9 ï.ªž¡‹=¹åÛã.om=¯sfÅ-ñéšÃX-T9ísŽUzuuøDˆ¹ÞÇÆb€q ŸV‹âå^Ô„g‡ø ^©ØÇt³ÇXŸXÕC*"¨ËnŸÙðrŠD8oq’g¥× RTÖ ¥ó¾ÝP§kHç2C†Ã¥ºËŠÍt7ÉŸZÂÞ$Ðr•¬Ñ )ý"RnO_Z“År—Ǧ¤iL¸Æ¼>P4ÍkúƺY<óÑõP=ììaÊŽç¥-œÊ8ã î1T©DÏñ£‡6Ä/U&]¿DpŽ;’ºñÄ@‘ŒÄE/søœré·®­–Èi\#‹ÌçDiŠæ¤àÜùÚrÁßODWBâo{ê© t¢ëÙ ÷óÜ*þZäº^‡c3³"ÎòÓAŠö¿ËÏ©º!ÔðãÇïI&gÉ+¿‘9øéz‚ru¡í2–œ¡êÚ'æDŒËÒF««Z–ÅF\™³æÚ,[yš…'=ÓàüÊŒ£¶yU=sp•ª¥q4üÆÀozôhØ•n%Ún©·Ùæ-¯ðÝAŸ[XáôÍ f–žP´ŽAˆ¤}3ìXÊÚç)À7`]÷;“´±™ÁÒxx àÞ0 !@ 8:„ÅíÜ+Âg¿—ôaÿƒ€Ú }­‰ºÒ.•¿³ . ?™Iê¯%¹áåëËÿùû‚ endstream endobj 3972 0 obj 6409 endobj 3976 0 obj [229 /XYZ 40.7999999 768.019999 0] endobj 3977 0 obj [229 /XYZ 40.7999999 768.019999 0] endobj 3978 0 obj << /Type /Annot /Subtype /Link /Rect [299.039999 723.860000 368.159999 731.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3979 0 obj << /Type /Annot /Subtype /Link /Rect [372.959999 723.860000 508.319999 731.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/guide/developing/projects/projects-cmdline.html) >> >> endobj 3975 0 obj << /Type /Page /Parent 2 0 R /Contents 3980 0 R /Resources 3982 0 R /Annots 3983 0 R /MediaBox [0 0 595 842] >> endobj 3982 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3983 0 obj [ 3978 0 R 3979 0 R ] endobj 3980 0 obj << /Length 3981 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€µâC$fç ‡‹ #‡`'0¼F&>äïGj©gzÈþJb‰bK=òÂ;³M‰bÕWO²?ýùë?Šý^|ºÿúŸâÛðóþë¡*+SõÿÝŸÎ?®T²ÿÕºº”M÷_ñíûá¥x9|9|iÿ~9s|qøÑ6ž†è;üýÛo‡Oýà‡þ“¯÷mû_!‹¿´ÿú¥øñïퟆþº¾\cº_~íRH×þãü·®ñ߇¿ý¡ø­‚;öÛýýƒ´Ö*!gÍãåõUqüsþ*¬*”¶ÂèBÙγnÉñß~n{{F錴º®Ÿ2’•ÝPJUEcMÑÔÁ8Ár§õ$æv¤¥NÓQ7#1ke¢Ò–ì©l´Öh[MÞáa‘Í»ÿM3›^CWséå´NDx}ìdÖÒN”Ç]qIïjÑ/³–v.ÅN]Í¥XSé4Âsœ‘˜·´ôaW_’@¤|ƒÈâÅÏχOOM§žn§qÔ)ýçZ?t8i]ñüSñǪRæOÅó/‡¦´¦6²>*¡¾EÚc‹{ý ’ÇlY5ÊÖÕÙ£Õý±E¿½Û÷Z·Úˉw½VÆëUôÃèR÷VZ‚NäÝñ!ÊZ×>ýöh ;ñ×'´¿`Y˜ÊWÀG…èç*OSzki& wl1¥nd—ð«G¸Ó™Ï$d-¸K!MüðŒ„Ï&!ŸrøF£–pYIú½w¥kª÷ÒVõËõio-wp/>ÃÙ[]ùS ¸? ‡;‚GkŒ³Ÿ[ ]…óqÑ"\Ü‚¨«;(O¸·qŽÀû<ŠzT(Ã'°,rpJÁȬáúàÀòit}s¶ °éú /œÐÁ>nÄÀDăGûe }âí ȇÉS#ì̸ އ!‹ÊêÑߋԓŸ ×âWlÉ@*X̱3W<ÎjOñæ Ò&˜$°iÅçTûà Ñ\ÚiŽÛ …= y7èÿãß‘¶T§¥ÙÚkIßiÐ;ƒ})ª²7ZÎzSâIßžTYkyöPx¶R {3°·Aý•ÚnEäð¹Ñ$š,ÀóÅäð§k+§Õ“ ]7nÛ^/ç<_É/Ћ֯e숫2&72'Z²è%ЂÛòvƒ;­ $MD&eÏëůZ9€™¶–f;ß”5°E.µ4°åµãàÞ`‹‚-Opfiä´ó¨›!ÿìhŒš‡€I77^ ôQáE´dô¹Ñݾܟ<ôF@uÊȶrÊ›1 cÜUœAÅ-s,›ˆŒÔt§4IÝ:2‰äC)•Lj8TRKˆ?Üa}¯«°˜@5Ùød•÷lpK%aË#lÁ½aC ›mriTVx”Šp‘g¹g&pî2Â;Y&?#®ÄrLqT # ^_’ã3Œ×äˆr."8Û%¦‰˜.>µ©}üÞô!†…âcÓ“BØ„ª,KµÍ+äö<#Â#ÓÝÖw^vµEë©‹êüƒ__³5ì¦àÙµ”M“[ZìpäçlzŒ3¡‰å(°¿SÚîGù§3<6â{Ëv7ÎIF2VÚ™| \üwu(°pNNr 4bð×3!rubø¹D;ƒkC×qc–h|idƒ‘HN-*AkèÞÑ-J­£kØ¥6£Ô2*¡9ˆ˜£Î•SGIX” º­7Áž5Ž72¢Q؃'ö”Sį̈–Áë¹>¿eEâf<·‡}:\%ÄáK¢sVÏç0'a^Þ+rygÒú6 t Ÿ±Û›Î0eÁšîìú°†Œg묲㼘´åÖüyNý+ÈÐ@¸·l»€u§VJ7A†u˜ÓưµÉ,k¶ËW µ˜Ç®O¼R|®r—À1 ltf Ä5ËZ]¸£p-¶ò“ò%ë” ærƹoÂÂåÄh83`DÊ6`Ç­Ãñ‘?£“ž'Zõý œ(^éØÙê,èí„ç—¤-5ÆA¬Ï8Ñ>̱¸…s^1ã™@§dæÝÚfäŽ@ìL÷̰ªK°½quìSÖ\ãÉ:KÌ8¿Å²àð.0"ÅœÛqo„á-‘bÎÍ=Õ‘¸£<–¶%g\ÓÙeÖpý">5Æ>ŽõÁÈvÞšÎØÑ÷fÑ÷RKÆh”s§œóõ±&rqª Ü` PÚÜéõ³R„µ‹e†a¹,Æþ°òbŒª)7uAëÀFæÎäfÃ=š8‹ƒÑáÖ²óX691dŽ×Ÿ-£‰£8^÷×ߥÕ,I+uqüõã ÅJ´‘Î^Õ°k£l<ƹI…cãg“¬!vjì¯râIkkkŒØ^gxMÄ8®Â3àDÁÓ޶ΑFK͈ê`]‰.0õè>n³e×ùtÁ~Ɔ܅´gl°Ï¡hÒïb¸~æ~vìöøšÐ”kС®m5Z/[>óê’~ýzk‰WŒ{t/õJ÷èÞÊ9ž+Ñ,2wE¦zȸ:“]Ÿíõ¦ÙêMÓF³V}oΦ'å|ë8¡®~f/×m˜ë3]es×e¬ÏtUã2¯nï%ï%½<휌Nâ DÎZIOníù‡k„ØDeçûo“ž%*c3#fÅçrr’ÚBUîµ>’ÖRø[Û8y Æ9mÖ™x¬ nR7Õ«ËçY·Í}çFÚ{:ˆoÄãpä‘sÚ‹Q´ÑüL¦*£´(ÏŠqj£–¸·6:4[Èv®Z2ÒžëäÜ)Í©¸~ÝIÚˆ2ç”(#À9ÁJäNW!”"w^jÏ­i ¥H>j†ÔU?¤=)ÑWEeMmZ3P÷ÎÇf[V ¢ß •~¯Æû`P¬q³Ó”R¸‹£KÝ÷qÆ}@@ÈSÓ[KãOÍ¢Nä“?éé$üˆeaR0®Uˆ‹DÓxl4TòœÍãñÕ t,ÈõRóõéðå:›¦F›O´;Õt> Þ ù$B¦§D]*éÄ» EÊÑ2p'1€7v¢ÅûÀD<áh¦e­M·sþxKª¥=a!Xr:0aÎQ4ƒ/sPƒå}‰„wÁ#„®<ÐÄr°b†‹ ¹/¯ÒL^ù2ÛÒ&l¡„ïº+ûÏ>üÉç6•ˆÆ-JÀ,†-"<%˜NÐR˜ 8Ä 'Ðäxš©;ÄÃFQ '4°m'­3È펪õéУ‚r[sÊÀÇx)QzƒU:Å9ÖÄ(Ä9áãF#–hÎ!椇Ò¦+Ó^œÇÚæew¸ J ž!"#n˜SÑÆ ͹nƒ#éŒÃõÄÜ®n=Iù´xËù(<Æ@À)¹d$´9è@\6ɹæšIš*d@3Žì²,\†»M~#´8C‡´Æ|À8ØŽ¯{"ÆÉån’tÉ£«]ö"ªMî ·ŒCÔœ’}VécÒòª\~NbޱRoEa9åÙT¹ ¼nNžW;Ä`ˆ=ê0.SçH:çŠeÖá)L7la3<Ç´è7dîÒÉ7V/ËfR¿xG”M#ŠÎ]ª›3ÆiÌk©.Þ»µ\}¤Hû§xi—Þ.«{`øñí;A‹ˆÕ¿d$_¥¿3…h—qüª¦<æÄ õjêàbLiüß@4]ö” ÄTÚÒúɾžÁì…–~C•*eã%ì†Ôa]š>ùÖbá8¾ÓÀwz¶²”•êš|&¸Ô[Ï çŸ<Àg‡¢ +|Bï U5—ZZǯ{gر˜µs; À ®ë~—µì¥ñð.@>À½a>¾!éi£i;÷€ø9ì… >ìÿ¼Èdõ«L)¬pÖÛ†‹ã;DLˆ†Å—Ãÿ¼Sb endstream endobj 3981 0 obj 4041 endobj 3985 0 obj << /Type /Annot /Subtype /Link /Rect [211.679999 536.659999 285.599999 544.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/guide/developing/device.html) >> >> endobj 3984 0 obj << /Type /Page /Parent 2 0 R /Contents 3986 0 R /Resources 3988 0 R /Annots 3989 0 R /MediaBox [0 0 595 842] >> endobj 3988 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 3989 0 obj [ 3985 0 R ] endobj 3986 0 obj << /Length 3987 0 R /Filter /FlateDecode >> stream xœí][oܸ~Ÿ_¡çQÄ›HEèC#ú°èC‘í¶Xlu÷¡¿’5šŒÅùHñðbG O¬EžËw.<<úøç/ÿhþõ{óñîËš¯ÇŸw_]ÛõÝô§ÿ~8ÿ7­àÓGmTËíø§ùúíðÜ<ÿÏÖ¿Üxü1\œ1 øû×ß§‡¦ß|¹ûëðé oþ2üï—æÇ¿?~:Ž7~áÛÁØ~üðëôqÆÍðŸóOãÅþö‡æ·a æeÜñß\+eÚ<žO·²—¿ç·¢‡u¦7ÃþQ9þûÏÃÏÃh§i´V2¦{©»Õ£j>«˜l¬îŵ3¨³¶uC±Äl7ü'Ç@/3biKcÔþ¡ZÓs-Ug ü±tË&v¤rã4R27Ø@€”LÄÞdRqF,ie33àHTkmµž€DHžºÌy¨Dz©Ž1•‡ðãŒXÚÒfÊ;C=fñäøwOîÙsã§§ÃÇ&…×§Ÿ‡™¼x¿Ó§a¹ªù0ztV6O?5ì:&ÿÔ<ýr°­XMîr‰+ÝgxW4í^ù¯XÂsðz£qŽ®ÈÐõ¯d[§à=sÒÚÃSøíøtÂ'Åv|JÃ'‚$qÂh­Ít˜:„+›× ]FþoH32&°Â~œ5¶¢Ëj)±ýÍd Þž§GÎÕÁ ckãæ=«·nÓ™™yÖ:ìÝQp ˼Âî ¨ˆ½â¾"å¹Þ-Uš¥ºüô–5cÖDv#û]ÏÒôì:s9W™Qfž’´Ó fy<™!ì;”ÈËÔÁ^í¸q‹¸ñÎrÀ;¢lQL튔š‘¤íæ{IJ¼†¬Y×ë -ßw­ÎíD…p¤ì!DiÊhµ4½&~[¹ïºÝ¤Gx•‘ä¾÷¿}p<"·#Ê "Ê;‹1w¬¹¬Ñ·¹Ãimx‡óJw^JD¹oË-;nI¬ƒ˜"ØîaZòVž¹½¹¥ÊÇa Ø+»‰½z¡ÄôHÖµ½ff˜ÎršºíœiN„2Kí4KÑ­œnuœ‹KWúå åÒý¸p/×Ë{áäQ™]Þ;-Oµ‚Æ•«›ß¿*9š‘g^ës&}”HÆZ%û×lƒ¤!Ÿó¼‡å7–¤pe“Ña,$‰33†éê|U®Š ú–¿èÀ9\|®ºŒË×ä.Rx,ìhÀðµÀF Ãd6§,†LŸ<‹´ ÃVŒVuÆÙ°fæE¬«@ZvxG¿r†oñLc/¶e†nuxH⩳pŠÁfÁ!cXæà0=†ë„ewJx}•Th=‘\pX#Åò1aSMzÊcÂÁ]qDWléìèßòy+DÕ]Úz÷+Â?‰p÷<_ ƒàzçŠâ´òûŒêEÂçuƨ=ø«Øt`±\†#xLrbÜõõˆð´¢!Xïr¸ vÂ<‡+Lòzqq¢gO  WíËzpŽ…rMÖzìféÖ¼ Q±]•BÃv½Õ·wøŽås‡DÉ×Ûõ¯5K֬РN“gÔ¯+ÄÁöT¡ïÄ¥Að,› ¹«4ȸÃÂÉÉÞÕD, 8ˆÈkƘgԸ–u9’gM·}µŠ±T«õ"N±;FÔµª ¹”­bÇ9½™Ó«Ž­c[Ï(á0J7_Ÿàÿ¼ ÝÚ$6š×j?Is{XBñ"ºýí „>ÿů‡/Åš*"A§ðZP]­$$óŠ8³ïÝbÜ^×#r¼*‚ÊiTÞNxT/…á‰A0q‚^ü±@€©ùf’4Öµ]:Ñ1ùßÂÙ §*;ø²ëuƒ²Á—Pþ‘8ré‹Å†’¥¨~8Qò Ê‡ÀœÉàÃ\'¹Æ»©˜úðŠg´Ûs“â‡õðHÁ¼˜M€µž{É0’-E“¢Ëî. Þa¬XñÂû¹Ì0sÅ ¬QÁ•(™+^%¸”ÕSi*rË̾ ¥À³ËZ…ä)'ÇW®™Ã™4ƒÔ¶ ÆbnŽVx¸P¯u¡ÝÜpBâcX*pq/.IÆ…ÔX–q©<–>|´”r+À+Åtƒ£á+Þg^)¾‚%„@7 ïÁr€eK"n)ˆåš²R.P¤ŠÀmÏ àhW`%ÊBBͧ”N“îÕëmÕ2Õ4g?¦è*¢Pƒ\á¶¡šXÏAõõ/Ê»»Áªº¤*·ˆŠB^#s™C¥“- ÕQ¤„¡J¤LŲ“gF¿¨âQJÆ_ëÀ&£\ÊÑ`E^çªr3 ,žZ¼Éºp8…ÒÉÃ-C€Ã¿ÙD-Šžâ#Ñ3G/©< S§ÃÃY0GL(]sÍBƲf¢nŸQþÈ»a +r»iߘŠç­ʯ("¥”¿E”Ûá"YÊUD¦`18nN¶âDöö÷Xbv Ç&"¼®²}Æòìˆ%T]Gìy)ž#ìÑA´1vÑGíls éxþ®/^`™3ßò‡ì¹XQ¼=ÊÎZ„[Ì÷åÝú̲…P”±A5®ãÊœ=oòD/½Ú¼|í—]bFÌê#¢§,ÎëxLoRàÁuiE>\;Z‚SZºV: ïiýQܶõÌ,ªŠiqÓé Oy¨yí¥ä7nò€¥ŠÀ9O™ÒTä}JoÜNW«Šr)U¹Ä=’„Sû„f*žæm„ b\ÇÏÁ,„0ž•fÕôHl¿x‹A\‹мd¥¢±ñ†¡!='´ÄÇÍÎ(M»D6›– Ûñײ˜Ë¾bLÂÜ"Ø#OûBû7ÆâmgJ»} –cË@Aì¬Íñ(¯‘ð4í¢H¾B(Y 4"Lj҈ÜCkBùA­—yxüF+ªy$›ïÛ…ªÍÇJz²K> {Žåˆ—®0´Ž£ñ‹»çȱ˜µ³³×–$HÝø™+¶È^\zæ”<–¡‘ŒÏW­ãÜ=’gwõáøÇ¢êTêÓõ-Íð‚ ªãù[øs¢aóxø?òd¢Ë endstream endobj 3987 0 obj 3534 endobj 3991 0 obj << /Type /Annot /Subtype /Link /Rect [71.5199999 460.819999 162.719999 468.499999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://developer.android.com/sdk/ndk/index.html) >> >> endobj 3990 0 obj << /Type /Page /Parent 2 0 R /Contents 3992 0 R /Resources 3994 0 R /Annots 3995 0 R /MediaBox [0 0 595 842] >> endobj 3994 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 3995 0 obj [ 3991 0 R ] endobj 3992 0 obj << /Length 3993 0 R /Filter /FlateDecode >> stream xœí]Ýܶß¿BÏ,‹ßPˆïì}(pð}úP\šAôš‡þû•VÒúVÔo´Q\íZ6à;¯–äp8ß3½ÿëç¿üY¼øüŸâ¥ÿùðùP••­º?Eû÷ÝÛ¤/•ì~uÞ”²nÿ/_¯ÅëáéðÔüûzö8°ÿÑ<–è&üóåÃûnñC÷É燿7¿ý¯ÅßšÿýVüøÏæÇOý|í¾|mÛ_~ï~RHßüçíoíÃ_ÿø®ø£Áçmÿ}'}%Œõ‹àx= Ç¿o‡¢ÅªB™JÔ¶B6pšÿý÷áçf¶e­…pV»êâY¦­]3µÁ¤ÁÞ.œjéDÊ&šèˆ³e[•vôT¥·ÒiSÕþ~9ÄZ¸ãÖ[º÷a¦ÅHÔN%š¨H,ÚÙpp&6X%›”U½t›ÃT‹ñåu•f¢"±lkæñTIÙ n8n]©¥›?Mµp¢"Íq´‰e[ŽOÅå!TGu¶Q5 16LµõN':Ã"±lk=êéž’ ò«±ðJ üð|xÿIhå[Ûèùç’£Õýxn¶kŠw }HYÏ?i¬,ó}ñüÛ¡.M­œé,²î‰tè‰Ð艂³U5|ò ®cã!¨à<¯#ñ:á“GøD¥ÄAÏããŸvO!ŸJ^.µ( b„Àï¸o¸; Ǥ¥Ë ±<'ìíü cúõñ»ãÌÆ9a¼õ!~Ue–PœdÈ¡~1œ³ÇPs´ãIõÄ5Þ”I óp&ì` QP&]ÿL%<…÷SgäM©oš71ÅbÍ‹õ«ÂP'Õ¼„MŠu?†:'½h5¯[SÁS`tÕS»sagJ%½&4Iý˜Ê¾~PÙÑòqüŽÌ]YbÖ_?ÝØÒו=¤;%a†YÆ’z øîÌ…(¶¾„Ænö”ÂÏ@/-„dŒ¤žñt©»å–œxbú¸?´þ˜Úµ9AŠùKG¬I°œÁ>)Ô$„ö²V‰x _áý040†ðà:ئQ×Á¸æøÿX¦c@;½± ÀëdŠM°(‘aC6#:BXK¹gÃüƒ£q‰é¯“‹®9Ü]6+Ô„ÇÄ ªˆJM=Á¸fxBÄ~0Ô8žÈˆ½î§½(ν¾ïÓ§Ww9ôå~ÒØ #¾úF¸8º)Ü"<½ŒØ×†-' ¼çàÌ#¶—!vÁ8¿·â%ùL?ÙºMY¥Êv_Nÿ×¥÷Ua]ûà á»Omamy„»ª†O^Ö”BÔÒ{qú–>›E¿]£ù~ÿÙ+Æ£E°†hÇŒ i¾UŸÍRŸ¯ñëáÃwëy;MÊŸŸÑn‰~–è½iym c zØfX%“@úy.ýŒš’~ÆŒ%SóI ýÚoé³YôÛ5NÒψ)é×èªñU(ýÚoÕg³Ôçkä‘~ÆÍóê.ývé·qéw{òʉsyå䔼rz,KšOyÕ~KŸÍ¢ß®q’W®š’W £5šOyeOj˜¥>_#¼rvö\wŸÿ&"<ëG¬±<@oºl*p±ß¸•Ø{ÈÎF¸ëð‰;Öñ‚À)ǪøÀkÚIDÒ9Ø·@Hˆéƒ¸D2á˜fO§/µ˜¢ÂYˆˆó ¾Š#%ó bÆü„ž Ç|øq¼Ïêràqkž/ ýô©y¿ˆÔ괢à 7¹B_©Ä=ahkÇ"?“} 9b8"ÏÈ‚ÕxüZ(}mŠzÛVcų~ÆÚSå/£z%×Í ÎýŒFW¡?$µ4Æ"®;„4†O‹XÑ?bHIÇ7Š$§Fcú"Dœ {6ø>§ºR,®¹ÆikszG' Ï8)ç%¤râá™àÚ'ŒEVý ƒ. €9â€ò¸âËZʬÔg/ÀïÕ%¶Ât aÓ¸öBÀ¡±l÷’ꌈáå¡WßýcYå †à3ó…4Æâ™«ÛL7@ÿQ'·™ö7p 9âøó’Ë‹Sžz·+{N`ùÄiتàHoì;²,Jl3 &ä:–·X@¨9;Õ˜B’ÙÎ3™4Q¿ËÈN­Z¼$éE¤—!L\ްZŒ¶'aB‚`1È× ŽˆznNgcpAr°Qwΰ‰ÔÇÒ ï†¢6éåÛ~?|^­ù¢ì„‘,XP$Nv@?øÈ#fAàÔX9ô%5÷{rôjÉÑ%Éüt OÄŠ&PË1·[0æ8".þÎEââ Ìò™¥^ÖÅ”ñp‹¢E|QŠAXAÎîÝ„Kn'Ũˆ~˜íàAX?Y¬Šø‚kYXÃÏ–¯¼´.é{±LÌ~-]ÅávÖý·ÕuFíWïõi—ó×*ÅCk‹ÃP€©µÏcPᾞg­LW×°‚îæî*Õ¤Ͳìœ%Å¿L Z-ÈÂ’¢¾ÏàL­s þfDȼªY´ ÇÈAVÚŠBN;–r‘FÇÞ@`Ô]>öÚ*žð¿cÔ`R#™µQޤZp÷ g%h­å9Ååù5•¸ïÑ çu˜DnÐeļ=ÅÍñK¼;NN4W_u|×ßÜfìSEÚ:œ{Ës•Ýøþó^‹±ZŒ<òÉìÕ]>íòi—OWÇÎF¤C=¸9¸ sE\5‚éb׺`YCôçHyL±Œ›Wi¥ç=„L»3n"zšä{G‡h\¬s/4Ê #ö€u`¦{B·ùdç³ì|…klH|K:ÓÉ;Å7jšŸ)q>ø¾§‡ÞÏÎ WÖ9t–NTn…-Ld5Yi­Õ]î–÷NË_éÕñF¬s}ì\¡oó:¢Q9;æóõ˜qw&wŒ>WOžÄ¯ÂbÜçôaõ£Iû:0ܨû›œüAÒ» Ûè¢c]î\ÀmRyÎ>&¶¾……¬'øÅê8 É©íö“0?2ꕉì½ ”ºMÛw©?Þü-^Ñ0û…þÇËBb„¢¦ú*jžHaC•RÞ¢u£&Z«×–݋PT5$«úT„µ¥·”í™T—f‚Ñ®t㦓:ÝÄ“N5*UÊzò…oÆ”¶k9fì©u<SÃ18YÊJµÆÂ`j¶Ž­L@²SßíûÝNìðÓ‹Õ©'í£o@7¦?±˜½÷°`Õµ¿K#F¦ÿÔzø àÙ0ô—™&hT>§OîÑs8 }8¿ü”ûÞW¶m¿×Ñ1ˆ8ÈŽâuû”RO‡ÿxEØÐ endstream endobj 3993 0 obj 3573 endobj 3997 0 obj << /Type /XObject /Subtype /Image /Width 256 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 3998 0 R /Filter /FlateDecode >> stream xœí”UU½Ço|¸ö*Ïû?P¡úŹçž{ÁÌœ9s¶Å‹û?jï…^¨œ®Ô¸qã&Mš4cÆŒÙû#+ç™gžytè•Lœ8qÚ´i‘zPºöª ¼ÿ£tˆþu>W]uÕ§ZI$>øàßþö·ÚÚZÅ]ú¼yó¤vWj„ W^yå§|477æ3Ÿ¹í¶Ûî¼óÎþð‡7ÜpƒÛõÉO~R—üþ¯>ȶ_qÅ7ß|s2™|衇V¯^ý­o}ë›ßü¦õ¹Ï}î–[n™;wîØ±c#ËŽ1üäÁ'|¢ÂÁ¡ÈE†v-§PýŒââ‹/žëãÖ[o}ñÅÿùÏþ⿸ãŽ;ü»¦NêJ©/¸üòËÝ®ÊÊÊ7Þxã¯ýë»ï¾û—¿üå׿þµÚ‚Û«œ¥¥¥‘G‡Þ‡”yíµ×~õ«_•ò¿öµ¯)ò•¯|eåÊ•uuu_ÿú׿ño|úÓŸV ,WRvñä?;±êþ³ï¼‚¶ªûÏq‘…÷O¸eÙø™—NöxuÊß!ú—ós‰Ù|­ì¿Nûšk®ñïšÿ50¼ì²ËªªªäÈm(//¿ôÒKÊ͸îºë¬a´”š2yÊü;Æßÿl¿åÏÇV<{ðùX òÀsºëÑS§L9³dÜÈÂõ?< y2ŸÈF§-K~ÓM7É“yçwô=¨å*ýüóÏw¥äÿ«;°ùW­Zµ/Š5kÖØ Ê)ÿ?òèЩ<úè£R¬~ éߦÜ~ûío½õVSSÓOúS¥«¯—ª®®¶¿à¾ð›òì³Ï¾÷Þ{RþÚµk—/_žÿ #FŒS¡ßýî»ï~â‰'^ýõ¿ÿýï¿üå/Ÿ|òÉ%K–(]{¥öpÁó'ÃÝc–oûpͶ˜Â»Ö;ë²KãñYñøìø¬9ñøeñø%sfÍœ>szÉ™%Ê_¨þ‡DqÖYgɰ«>ýôÓ2Úú~d¤uaòjÞ~ûm}ê”G6ß•Òè[GYY™®E_ò‹­È¤¸¸,F™‡ÆÎ§Ÿ~zäÑ¡ó§-ñ¯[·NáÏþs—®_ÜFä©îÙ³G‘ùóçë‡þîw¿«¸<iU¦^¿ûç?ÿy»Wq õ[ËïÝïqO9å ÷dðÿøÇ?JQÛ¶m“´¾òÊ+þóŸå`hï°aÃ¥Fqa¼dÁýƒRÏÄRO÷Im‰}jáèOLûÄìY³¿üPí;ÿ÷ÎÎ/TWvúÔéS.žrúiFN¢DÔ»©·ÒÙê2å³i`+ý«·š>}ºÎù'?ù‰R”çŒ3ÎÈœí¨Qú*V{lذá[ÑÈ×Å¿ÿýï«kÐÀÇÞ8*䧃ŽáÆo”žõ³úõ¯¾;éK_²}´RÔãÿãÿP§ ¸~Pµ…Ç{Ìé_½¿â?þñªc¼ßãž}öÙò+díeWÕû+>eÊ)Jã_yÚ;tèPþáÇŽ{Ú­rÏÿ|ø¾§b÷>õ/÷>›{ëÐILZ’L¾þêk»_ß}eâªIÏŸ4q’j9zäÂõrR²½™© TÏ8cÆ yk² jõ’®®WNà8iØ•RûUs¸çž{”þƒüÀù<²'.®V{/^¬œê­"ô°#Kg¨^«\»suìöGbU+?TõpŸ[îsÛÃ}*îsëÃ}®{ Ï âAGsÔ Âõ_EQ6j°:[ëɨÑöºRGu”K¼÷Þ{æwïÞíâ2þ.òG:¹"Vÿö£\i^j—ó£¾~îܹJT¨òs\);æÕpÕ~¬ªª’e“W ¯øšk®ÉDÙºÃ?Üþî²ùÖ%øÍo~3{öl›¨½jáR'Ÿxò¨SG”Íû+«ú\v‡·y‘+¼Èœ;û\^õ¯C‡sú5)TÿÇEqÈ!‡|ÌÇ%—\b;Áwß}÷ꫯþX6®”.¡ÿþ6Qm\Våw¿ûJíܹS¡FIrüÔÞmå<ì°Ã"½ù N]t‘”/IhX!ý;=}ôÑá‚2éLº`ÖÌYS§MM“™6}úŒøŒø¨Ñ£lÿÒ!úÿèG?zðÁÿ{+žËo·OLäºtå9è ƒ\©üã*èöqÄ:y9j˜ ?òÈ#Ý^å<ôÐC;éÛ†ž†ôÿ‘|DjÑO¯Ë–-“=ÔpR>¿Rì®Hý åÑahäwi,yìqiçªPý…ÎDš·§m™8qâÝwß-¯Ï¥hïØ±c•Ó_êÔSOUŸY§å9í´Óüe¡w£ßZƒ\™ÁȽvW‡è¡Cô/?JRŸ¶?”G¶Ý•’ªÏ=÷Üý–²L˜0Áß¾ w#m=Úø+QL™2Eö°CT¨þèEªÿ"€^ú‡™Bõ8@/¢Pý×­¬«[UGHØ;Âvè¿fe)ëmŠ×¬Ho©):qâ=?^¨þkjMA¦–§’K“©e­á²¤i Ùy*›i ­ax¯©gY2.Kùó‡kËæ? !a8,Øþך‚vS¼zIuõ¢êÊ…•Õ «7­@ò[^ãÏ“n&ËÒ ÄdhM·»RKS¶m鸪r ÁWOþ¸­ßnŠï7?qâÛÏ »PBmÙÞòö{o‹;wHÀjÉ%I.õ¤¸Ä„J—¯¥<M/݈|IRmG›*ÙûÖ^m;^6•¨aªÎÆ é ]Ù5ÛÞ'®£,¬®YU³oß¾¦MM¦5yíÑä´­2ûÌ Û©ßÖ°ÖüÇ¡yk³$×¼¹¹²ªÒoaµ‰,ôº/¢PmÞÒ¬#V,¨ÐG»™] *ë×Ô›J¶x•l1•H±-ÛZ²2/¨t[³ [#ö¸Ú¥"ªJ­Ìæwylà œ<[¡úøØM›¤7™ëò9åó+×'öîÝ«Ž â¦ YríÒ ØjRÚVذ¾A’Ö.û§xÛvÖ5Øœ‰y Ô¦ÊmfiÚÜdz‡½{•²çÍ=*Û²µ%qSÂÖ\¿¶^»”^½´Z§dô¿¾1>7®îCé&óöÓÝȹÊYlÿ—×Xß…o¿eœÉÛHw~…q‡Þz»|n¹+Mªƒh•A#n#éu Ví¤Zô™XP\™m%2ÚjDiý¯k÷bþ7úÊ.s Õc›,¼šŒmAjFçÛZÔÒ—&»µ¡QylÍÉE^:Â9,Tÿéa©·).ÍKT2øRBÉÞzDR$­ÞA¦[²Üµ{—¼qk«µ)RQeZŠˆŠ”Ï/w•(Q)VöÊiKIÏ¥•îÙ³Gõ”]T&÷ÆÔ° Âª]î“ÕF”!p;¦°MÃú`ó'~€Ç Õ¿+h7é_rÏŽïØ¾cß{ûór3ŒŒ·µÈJËVK±’¥ZSfù¼r¥H“R¦¤«*%ÏG”J)]®KPÿkʦ–©±HäŠÈª§õïöJÿ»wù[™:Û ­ì•n#óg;À·‚íÿÒdjië]—¥ÉæMͱÊ>KÒÒ³1æsËm\š—D­ùUC°’–VÕ@¬gR·ªN5Hù²çªDmaÏî=Æ#š›Hyn¼uclDMÌê_‘´þ«Òú—ìUVuÊrùµËš}]£GÔÖØ1ràü‰àñ‚ív%Æ·—ÿÿÞÛÒmÝê:cÉç'vl3žŒ>šQ€7ÕXÕIºra¥…üš¦Q[#õÚlRxýêzÕàÆ¿©Öñ¬š‰Ñÿî]ŠØA·yè°¤ÚýSX{íQ›_#·Õ*TDüÄÃñ‚í¿ÿ>ü’¤¡fØ{½ÙÌ-G„¥mÙp™å²eŠ›nbS“"ö¶ÉÖz«ÓÞMßö´5x÷?mUêYT*éY{ÓÐæ”›sðvÙÛ¡™shMÌz6AH¸¤½ú÷mi±Uùn¶nË/L? 6›§^jsƒtA…}"&õšfâ«ÁöE™R™[ýÙõ«*×§¨-¤[Нlº¶ÖsH?`cóm…êߪÈZÉ) ¤G攟ïÝ×[bT©-ì·l8T©ôÓ® f,ܪpB¶‡í°ÿí>\õ¢jçÃhK\ŸH›ývI×Ùvgá»ýË$üÀ…ïßþ·£ H®nbCûÄŸôõ;Õmë} ÃaWÚBžv±ý'$ìQa¡úKÿýK'•ÆçÄËç”w^¨C´ãúJ¿ƒúÕ¬¬1ÓÛ¶¶4omî¼°yssݪ:µµî¾b€ ©å©]¯˜)g&ì¼mw:LÕ'nõ?zÔè¶ëßÕœn_=£I+Î-&Lëß‹*nÜÐØ¼©¹èè"»K‘ú5õjFÿ^³ÈóÊÅSËS6?âêÌ4ô= +K³mN‡Ò¿×ÔÖÈò+.‘«-”N(ÏŽËÚ7m4ú·yÌ"‡+kÔLŠŠŠ”’Žliv)þšM¸µ¹»¯ ƒùg–çææ¦ÍM6ÒIqÛ t÷d0¯+Úl–÷—WÓÙ›mÝ}Ŭñ·âÌuS'Ä7§ß ÖÝW !#û]nnêî+È`ýó.¿× t÷dH‹cSãÆÆN½&ÐÝW !=òÅþÉóÿÓöyc'DZÿГh\ߨCàÖ­qCcw_1@†äÒdúA•»º¹©Ããéa[šÛñª&€Î£ÿþõkêíÌœ6Íálw¸µ¥amCÑÑ, =‹¢¢¢øŒ¸}ùcâúD‡‡ö•Ž:DñÀâî¾V€^NÓÆ¦ºÕuõkë+TÆúvL£O]½Ð¼Œ¸qccýšzm•Um­Ü•u”Œ+iÇ9´½Tûê‡ÞAz*N_ó ¼ÒI¥Rgñ`³jhVåËÚZ¹+›¦o¬nU]ÁgÐöRí«z n*ZùÜrmýôO.MV.¬´ªˆÏ0K=h+oŒ¤öÖ¬¨©YYS·²®_¿~ú˜Z‘R¼¦¶F]J/›Zó¦Õù+/:ºHÅmŠŒ¼ ¯©°¶¦zQµYeqiRjte-‰ù õPÚ;dðÿù(⿊À™¨”ºW*¹,©s®_]?dØ›Ù]c ~8а5ïÿ­­‘ï!mH9V EEEêbÞì †u 1O~åóÊM~Oíjb^Â}Œ¨Ük\Ú+qŽ5Úè¿6¨ÉOõǼ9xʬ¢o¬amƒª¸i•ž¥zŠeæQÏÄWÊ%ªòä3ïΜp aüYÔ•i‹*mÈNÚ]òX¤ cðkkäë¨Eh¯,¹â1¯¨¬ûÆøÿ«ëÕ ¬I´ÿÎýФdBÈ÷é³ô¢Rç©ú»€à™¨ÔºWCÅõR¾zÙùÀ5¢ÿœÀT|¿ Ë.*3ƒâldKã³ãÒUZúãšúÈ&`+—e–›³úwöQPÿ *J'„Æ>}ê|œþUgÀÊ:©©efô­‘Å âtwæ;(ú?ÀiXŸõëË‘«œŽ0“¢­ó`]ççÈW‘ÿø˜³roŒ)ñ+ýÚz›¢š»å;œ´aÿ}gh ­™åPù瑆ÏÄ•ŠÏ‰[×Hû¿ÿA³¾¾±ôÐ#^JýÇ<ÈŽ7í=I}Ô^mÖ¢>æ©\¶¶7q}BÊ—Uaõ¯Êuvè*5Ú#JÌþ<á3q¥¬µW{É¥—Ó¬kê5Ïp>èhÔi§èØ›$“¶±`sjœk‡®= iØ-EbîpöùoŒä£Í9Ñ?ôX“-Õ4nht·Ð1S}VÕÙj ÕKª+«*•ÈénKº¹”åsËí]G%¢豤–§¤j7&ëv·7ÓFêU†˜§i>œÓÌ=óîí»Ç[æ9¯í¼lèz2%JÒO”²õ/#/åËÈ»ÇFþi.gé¤RÅeêµÙçÅJI\Ÿ°{MãBÿгI›nŸª3ÓfG<6ÍÖÖŒ}/ýCÏÇÎê‰y"·ÚnÇ´™ð4¡,ÿgçÿ0µzò|¤Oy5f”ê9öí˜6 MеŽíx™©5нØ;öÒ«ôØ]vô¶Ï5*4s·`gzî8r¥¿âsÌj›Ï1ïgµÿ²ìí£ù÷¹ÀEÄ<–¾&Ñÿ×'»:‡ÿ‰ýÚúôì²Öûá–ý~Ñg:b‡Zžþ/agüF9iû\£B3wN!ýôÌ+½ÝHlî¶CÊ×jõ߯_?{J’}FßnÂúW…RµScúß©}³þ^gm¥üßF䙎ØQøõoïaÚ[—voxnC9“K“ 딿xp±›Y*0›(ÿ "‰ÎJeÊô•2;TJšžË+•ùw䌸«DæÑÌñXX]>·Üš}óyvE׳"e/Ö}-ŽÀL'gCLmž8í·êÒ—y8ÿ7é¿X6…úæU•_–EGé$•3ðÿÐHËžß¾Ì<ó¸¬DÍCÏy §(ûwosQäù6rå ±£ðë_2³0bóžæö8äØ3Ñ¡oÛ?;(ºTöl¢ü3ˆô ê›w¥‚“<üËÅ¢þoOÉ>˜SNû¸M§êÎ6zWÞz³Ã3Üï¥ó·ÕZa¸ôÀ¥å:\ ¥Gþ÷_gXyI_£]@, }LÔOÔü.ÿeîw—_æÛk]‘ù‚*eµp_s}agÞÙúϬFrS…Œjxn+åæŽ:E¹²‘¥³‰òÏ ²}¨ªuëY…õïŸeø¨oL¿…ÿ”tP{ã([ž]ùë±_KäA­fÜ/ëæØé…‹—}iù—çêb!ý«NÛâú7.D”uÍ3¿Ëýúùç±ä׿˦¯Âήqäú6‚õ‡Î¼³õX!<·Çí(íÚ¶þ²áRáÙDùgÙ vté‹ê›¹×p€`o5˜˜]B¿ƒÞð@=‘zOu #×-€žŒ›ü“ëQ];ÐpÒ>Ôs#S?áY"ÝEø¾âûÇ<À²þ[o…9"g‰tý&™D¦´ÿÀ„™üOIº¿þ#žÅä~å„”lg,Ø-ð¨B#b{+8ðü.ÏSr€®Çùÿ•U•á‡ì‘ÝÛŽEÀÉAÿУðÛÿ‚ôŸßþ;S8ð GÑnÿ'Nðf‘“5é~Ù©‰áY"ÝHÎñïœÐøwN[;ÄNü¶ŽµŸÀ,€. ëçÿäZÅÅ­Z™'¼’Œ"þ•{#WŒé? ¿]å Ï¿8á@¦‹çÿÄr¬ââ_µ&2Oà9šÕ÷OºˆcV¤xÄyèâù?±¨U\«Öò„W’ñgÖ!"ÿ[ù¯=@ºxþ% ÿÈUkÿ­¬$cV_ñZ–Y2(û¯ÙnŃœ(eSý¼k"éâù?–Àº1Ñ«ÖDýÓÙ¿’Lb^BÂV÷ÿýXöŠ1ª0`éâù?¿¶#W­‰åþ§`%áÖÖ¬#ïËÍ5Òø—„éâù?–Hmç±ÿyV’Q“´K¦„WŒI¼Ì؈¤ëçÿÄ ×äJ2öƦòØÖ¹bŒ†´cð½ ÿüŸ<ï?ê¨×Z¥ßŒ0 gÌ»(”€óÜ$ŒÜÕ>ý‡ß&Ð-dÝÿ÷¿•)ûUP¹^ØÔÆW†_#Õ7ߛѺŒ\ú¼ *çë«ÚðʰÈ×Huàtk€vãŸÿã×àUP¹^ØÔ–W†E¾F‡™™ÐÈeÿƒ/BÊñ¦¶¼2,RÿJìÜ h…ê?øúª6¼2,â5RÙÓº‹BõxaS_xT`:À‚ÿØN¯S endstream endobj 3998 0 obj 7788 endobj 3999 0 obj [232 /XYZ 40.7999999 473.299999 0] endobj 4000 0 obj [232 /XYZ 40.7999999 473.299999 0] endobj 4001 0 obj << /Type /Annot /Subtype /Link /Rect [138.719999 411.859999 207.840000 419.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro >> endobj 3996 0 obj << /Type /Page /Parent 2 0 R /Contents 4002 0 R /Resources 4004 0 R /Annots 4005 0 R /MediaBox [0 0 595 842] >> endobj 4004 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << /Im3997 3997 0 R >> >> endobj 4005 0 obj [ 4001 0 R ] endobj 4002 0 obj << /Length 4003 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯Ð9ÀÈ|ˆ,Ìø±Ø=0l ‡ ‡…'qoû÷WjIí²?Š,Ql©§Ç€ÝÓɪb½XU¤nþùôŸâ—¿‹›Û§¿Š—áïíÓŽ•L³þ_Ñý|8þB˜RŠþcmT)šî_ñòº{+Þv»Çö÷ÛŽë}ÇáOÛ8NÑø÷Ë»›~ò]ÿÍÓíwí§ÿ¢øwû¿ßŠ~lÿ|ÆëxÝ™Fw~ï?pÁ…iÿsü©küu÷ý7Å-f?n÷ûƒ0\êFÏ‚ãíЕ¢ÉX!¯¹(8-œª%ÇÚýÜŽv£l*Îk]Õ,xÔZtÃrÉŠ¦Ö…nG¶up ŠÏ¨®š4uñy¨qVÕþ¡J£E])Öø9bÃz6j.îãH³‰hš*Ñ@¬#áÌÆÅ€#¥\ ¡˜Ù#^»â‡ùa¤¹$ÊÈDµñY˜ kG¢ª$¡¥êU’1sчšK/)…HCø">µ‘òÎPIÌ•x7WožŽŸžw7¼’¦³ÎÏ?·ìM|ÿç¹EW:].ÚÖÏÅ?ãÕ·Åóo»¦T¬Uï,Ñ"ïö-÷Ï-=æa×Ô*Ö£fÆ)Y?%g¥®¹iÁ9Ãô¾Å¼ÃÍûGEYÙ5Ö£Lí¿¨Æ'­Q û–ºd6YØmßçý‹ "j’ðQåÃþ ]Š=!ކƒpc) uHo–"ƒva6°¯ó¨‡z*ik"gé!ºbJ@V£ åáþ<<îr†Õá9g læ÷r¿oQíÆÉðÖð1!^?4‡$“ˆ !ʳþ±Õ©«_o7ue[ ¸1¤$ŘÄÚ¦ÔmZ\1oÚˆNæh8Íàޜ곩5ȤªÃûнgÆKUé/¸”Z§ºO¥u¦o#åˆÜC¼#=pç©>öW¾†-:ù°E|‚°}ÌHy%–¡<¤¦žÓʳ ¡_0 ¤(nñÐóËí'jëã¡\9LëÄàyî`‹$¬‚Î(5߀^š4a0U°Ë#MžyòÊÌ)í õSf‹§…0'BêH¸ '.ìk„"xn°/ š²™]qÐ`•=1bo²ì–+‚àæð˜iGcÄ<0X½#tœ¨•îÎxK´p8SàÜ¡ïã͵#—á}] Ï$xÂçV4BIê’š\IK•‹ûàÕö0¯…R3ÇŒïrfø¼Ú×Ñ鹄‡ÀC1é¼|ár5+ü -q\-Â4EØdL¤¤7‚_pÊ5OŠð8Ž÷èUJo‡Ocr^VJÜèÊŸ›ª¯{ûPíçí~¿¼7ÿz•MSÅÝŸgÉù·ûîæ”zºÓ®Brü°;`ý?[Sha#c×Êjáwñ}Þ÷‚NŸÎÓ —eÏW»¶,× {H žg`SSVš‡ZEh¥¿Ð*\ |“_—²aVØâíÁ&ï!¶AµsåÒMŒtë ¡ÁÛâ;>QñzDzd£Úf–£dñÂ7v†ÀcÆ}ˆÍôÙ,^Rçš9FA·˜·¬°Z…âfEDðúá=­ƒ(E0›ÂFøA„-…Ž1†¤®YÄ*EèÀa¡”~å’ÖD+Ëœ¸ªš²vʆ }"êÐÖçw»ÓàR‰ðødDY&©®ä“ ´S7ÙOsbó¾æêŠÕ¸0¼OŸ\`™JòJ¤Ë#¤m55ÈICû1j- ˆ‹Ûކ ËvP =Ömîv""‘BpTIÎ-X7o̰%•j!¹ Ô°SDèì;Ïð zD¦4  ïÌJLûâ™üø$Ùíø‹4Šn†)«Ø¥qâ„/(É»4÷ ‹ÁYãÊD8ÿn&…óhDLd:§>o%ô%$¦Ï‚^ZlÔ³÷¢Ø{JŸ5k‚Ý›‘õë“/o'™¹FZ7/é+Ž´æ´Öœ]# ›çåkt-Ò$çÊÖ’\~kŽáƒÂ÷kP4A³_#@×ÐAš ŸÄáêi%X_]š&ÜjãÁ”pÓWNÛ"x3) ç×jÇ<ßþo-ê-ZÝß—רkAn}ô’ÑÛu’þí“w"tâNцë²…½dÕ—,¡u©Olª²§Œ£ˆE]ÖöIÖžhõ‰–¾ô\ÊR4'ï—QªÔýAÌ÷–Îc`ŸöéÃaµ(“]“­NÖ+åãoîà³ÃM&'0|@}yª…#<†C°q}†‹Á}€m/3¸®û,·™§æÃ«ù†ù`¸×ùŠ;gµñÊÝ!~vGñPŽ?0ŸK}c˜.yw¹‰µ ‹ãÑ­_)µañ¸û?|½w endstream endobj 4003 0 obj 2831 endobj 4006 0 obj << /Type /Page /Parent 2 0 R /Contents 4007 0 R /Resources 4009 0 R /Annots 4010 0 R /MediaBox [0 0 595 842] >> endobj 4009 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4010 0 obj [ ] endobj 4007 0 obj << /Length 4008 0 R /Filter /FlateDecode >> stream xœí][¤¸~¯_ÁóJÃø~‘¢Hs”‡H­i)«® ÚY‚£xåTgEyßEszCV{^÷êÆ–scàîG7«–Ì :ºÆ£sDÜËØbÍ#fÚŽ™qžîxlÙs²Ö9oÙDc…׊W†ìORKà÷ÃiˉÒNuqž¬(íÄ8çN”·Òç `÷ã„gKÒI9N$vÔøÝh…¸µº~$Œy«úæÌYi,wBHÛSŽW¢ú(G¨­+g¦O}#Z®»Z¾ßy{Ü ç¥V¦Ï¥%‰Mž@©àD“Ûp†ßtVçÊp™Óp”†•yIv–uƒ”¦W£J¶-ðv:ãº¯ÃøÎœ$ÎIqF艒(Ÿo[l•&Dº3ó.é(Œ…¯¶”œG¥P½2f·)&ܨÏ춃«ó,ìb°ª»j5 ïÎ&ì‚Mì÷Âs„uçâû×±<vzTÂ竊³ñ¼µ37rGZ: ÷©¸ã:Ÿ/®©øíȯuGEÉÜ‘ ¥JY¥Å1 %e¯+ÃøBX‹Å1ää·ân ÿpU\^÷ˆ- ß(ëë”rÂ!dY­ì¥SøFˆ ïÝßå·ëþîé}œÞ1 ®„¼Åpä7:6Í¢0Z›£N £=*lˆOeÎÈâp"4qúì$º=A%d,£¸hæëHË*yÈk]ó!‘ÃÀó:qíH£Âc÷’ÝŒEÂb[›™tÇÒŠI£,î¹æ‚Ì–ðoTˆÿG\ƒÉ®‹= ÊLÏ8+ýxΓðh {÷qV-¾C¡Ï¾3\ÂŽB[ÂÄ»¤ G%ÎhÅž*Á#^yöçØ„(̺O:ÅϦ°Y½Çœ±¬„°Ï1%#¬]Q" ™R2ðêæº6‡ÛÉes8.|ÚÜlŽç>·€¤²«öCˆÎ'¨~ø™´§†ìv“P³“ê¶<÷°P™šóýÑxoáÌ”Ã!³b®‡ÌŠùdVœ¨Y_ ‘ùú”êÕ¢îÛèY1;€ÌŠ™°êJˆÌ×§|¯ßo# 2+.Ç-ÿDæ™Od¦÷çpX*lK…ÂRÉBœ“,ÆRyCÏ®u߯ K…ÂR¡Ã6ª+–ÖOù^-¾ßF,•bÜVO,=±tXºë“1‡˜ÊôSÙ!ÄT>D³êJ„˜õSªW‹ºo㆘J!¦RQ*FÌú)ß«Å÷Ûȃ˜š[䉘'bî1wðž†ÃábN=\¬ i£ÕÕ¬þô‘­~JõjQ÷mÜpѨ!\4á*V}%ÂÅú)ß«Å÷Ûȃ‹v\®ç>…W»“eûÝšÝ hØ1´j—¦e´H>=;%±J?#¥fƶ„i‰n—Å©‡:om4-¦=AoH ÑæŠÉ!Ñ£xsŨ,:þÝÑ–‰TúSØÏéù9‰/ã*wˆ´¹n£ýáÍ ÄEW(Á›×pfÜ–x,}Èsrˆ â9 ·×Ü6µÍ³Cæse9O{Žô™\IE9V–òІU_“›Øò Ù6ÍiCx°RRl­H¤5ßE±&Ðïù–¶qΡ Á§$ŽëÀ‚—·Ç^G½¡L°!äo>Ì8É÷;̶JÏîvpƇ3J2xh~ª!Z”̓Ӽ²é^`¢ÌXÜ/¬0°ÌûØCÍ4ÇËšõža"/Ô¨6:Îxzx ahÓ¡… ãg€L˜»Í0ÅUøú ôþ!S)™ÄŒ°Æ<Êt¾væÓbb}ǪºJ®Ñ¶3¶v’3T=t‹ñœF–óLm»39ðé¬?šræô9UÜD_|÷^½ÄY¤ø V¨cXZ‰vorL´ƒOjÁ{œ §¤“Þ9 ×{kD„:IgwBP“ôUO´hýÈ,6c¾õÊNš¤èe°¥C$PŸa„Ë@%µq#«öY1Î߇#vâ}½6…OÌPtŒòž5Ò»ÙV3°ë"þ{~ýÇXñÓ–°3¼KêÉfî3@ÿgIîлŽþ$·×ÝZãiùK8Bâv0¦ávþÖX¦íÙCØ×‚hõS¼Tê\©jý@ûñõÛ¤MÂ,Þ$ü”4dÑQ›r¦àU7†^è¹i–Ü y{ñQ»…Û˜Ò ‡=½*ÎD liÃhw#P;p§1)Káƒ}em˜]—¦ °†°5ÔŽƒe<,Ó©¥`²¾õýÎ{X[£R÷W>ÂgÛ%•~FeZ³ºÃQ?Zgh^™VbsúÎïBw ´®þ.4·}“jKê® ëA;ÐÑöÅÓ$÷és\K‚û°þ6|±”ûÎ1SòzI ƒ†Œƒæx?3zZ ‹§ËÿX\jÆ endstream endobj 4008 0 obj 3109 endobj 4011 0 obj << /Type /Page /Parent 2 0 R /Contents 4012 0 R /Resources 4014 0 R /Annots 4015 0 R /MediaBox [0 0 595 842] >> endobj 4014 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4015 0 obj [ ] endobj 4012 0 obj << /Length 4013 0 R /Filter /FlateDecode >> stream xœí]MoÜ8½÷¯Ðy("EJ0`Û ìa#ö°ØÃ 3³‹Áf°ž9Ìß_uKv©_uë5]¢ÚL€¸Ó´øQ¬/V=–ÞÿõÓÅ¿ÿ(Þüô¿âóøóã§]UVM5ü)öß½ü†²¶ÃÇ6øÒvû?Åç/»Çâqw¿»ïÿ}Ü™æðàø£o|bèðÏ¿íÞƒï†o>}ü{ÿéÏÂëÿ÷kñÏõ?~ûÛÿ—]èšý‡ÿŒ56ôÿyùißøŸÝ?þRüÖO!úÝÿûΆºí¼½hÏšÃß—¢Áª¢ö®u®0Æöóô=9~ÿy÷KßÛó4ÊÎÓ6®­Îîµµûn}ßm×6…­Ã¬ÓÙÚÎëÊ\ÚQLœŽö32—-ÍT®•»*Cc[ç«.ÀÏçÏ8ÔvXzÿå…‹îêÒŽºPÇéh?#sÙÒž¶wÅJ‚¯ü°L[5—Òþ¹¯KIÖG¦32®m$þ‘¾î£(JûUQ> ~xؽ¿3®Å^>üÒOå`\†ý‚}ñn¯E|(~*¾ë-L÷}ñðë®+}W·~°FC‹ ¨ÅÂgª;øÌ8N [Øâà8pu {ó°7HcQ‹ƒÏ8Lƒ°¥B-¶8ÜÛ-l{ÊÌÓÓ ïž5³R‡9dàªÛ‡^f/“ÀˆŸ«âŒ}r »1¥wMè§óU”†¥¹¯_ 4mJkÂDêÊ¹Ò zA3toŸš¦û¦bx¤“jز¶¬fâ>›#œIÕNÇ “/ªfúEÆ5xFNOm6ðt®óuN±Ã¾÷ÛûÍõ"f”˜uv3ù¢¾A½ÛÛigÕtî˜9àŽÏf4[„ýò-3æ½õ SÌödó3“^"+íŒÕÎïÕ|8›6siŸQ`¶Ã˜£ã «µÙ‚q''ejìì5u»÷å>z)gmî>¸EC©Åü¶€áá¦Î^è.Oú´æš«î© u– VKôõpL¾»éú°ø{ŽU朰¬Cý0#5ÅËð™qær¦å²csC é9×®ç?›ŽeoN yg|Sj¡Œ9ßNÏ´†»eONŸÖCã¿åðE'b|ŽÇ'ïž-- v¯§†Rkq<æÚ¨iPÁg*ü ^ž5Ô·BD÷VëéÁ®ª³Ìzp+’žõ 0· k!ûYþ© ›˜òøHL+œûÀ½aI§,ær¨½µ4 æXŠ:˜ÖXž þgì–³JñìØ9sZf ÕbxLÐË"YfôdæÚ¬– >(ÊYó¼¬yðL =&ì æ&~´É–,gêr¶ˆÖØß¶Ð%àU@Œ cYðž ûÇÖƒýz¼ž, +ÛCä{ix"ûÀ`Ç2F³\'N.]€Y òÎ:‰‘ULU6­‘\r$‡%x ç9¹%&u5ÏöÆÈr-Ù¿óÁKÒ‡ `'‡‰xÂÌçê)G-HØ.àSëvšXxj˜]0N.ˆK^è *¸‰²/6ÃŽÄ@xÍÑ…¯Dj§&‚a¯8p½ó¡ËIÈ<£H´µ”ùiDË£6îiK#w p¾¬hü-œºç§,Ž]2ÚacœÈÁŽ>NšáqðzGŸ˜sÍCpÚ‰àÇF ø"ÁFÝS!I«´søèTÁæ-”ŽŒ©éå`ªj`¥±Ÿàê 'Çú)™ÿJ¸ôóý(L8Á/™:üŒ[¿蟯BsZGA¹Áü=€!D*>²eB5qí(“VÏvT˜Ûx7NEÎŒu§÷žY7ÃåïÿæF@y…qN¥È—ÑšÞá ¤‚ÔpÁƒ!ÆÁ)iU™qu–™”dCøéÂ¥xœîcè–ºehlæò„¸œÑ¤ÂYHþ¼ÛQg ÊåÁd.OˆË™³‰0qr¼œ¨6C·HSšlu†w—¥)K“|6‰{ñóÁÚ3kº,Y/µgø4æ*†Ö `÷¥¶>]–.K­¢ÔbDµ@ ˆ,q=Sð( º¥¬7˜‚B¦™ˆFá¼°§ë‚׳>¿©jâötÞŸé(:Á—Xf„ëëçܰ÷þfP ‘¯NÖˆ²»Äz6GÒÑ(ÝS£ZïZž¯ŸA;ZÏ®íÔÎ 8¨hagpoj»@\pcJu 4 |@MO¢~F›©] MØûN@j™²îZÔ!®ôg <)­Q–@SŽQrøä…Ëù`7îåx¢¤…@Ìåøê3ãáF-`Ea< dj2^ñ²•âq˜ÓS0ëh¦Hs²&JÂ0E™ibux¥¸7¯¨½»Wò’pI#¬±=cbz˜cq ßg ²[®ê”wk›ñ9AcGÍm0§WC‚ýÕuõz£Õ‘œÌ9…¹'Fyp«rb^Á%¬T©h¢À£NQÛp’Çâ¶hÆ5k•W§fϘ8Ö}Œ÷Aä4¯Ífdí{µÚ÷X‹b4Ê5O™åõu–æb°L¡uñ?¡†JÃË á¹ ,b¨¼ôþICoøJ;“«¦7r5rk‡kËÎcÙdbÈÌ©_-£‰£8^OlY¢âqqüõíhŠD¬‘UG5dk¤ÆcL5ÆÇW“l¡îtø¼ÊÄ-¢¢G=ÖØ_'NMÂ8 WeÒ#¿€¸í"ÈÑ≨æÑDl³'÷q›-ÙèÙ‚|“FÜ…¸7i°ÏP”yM_ÂÕ|CìúøZ°”iØÐŽÕSËg®.éëã­Mœ°†ÌѽØ+ÍѽÄ9žÐ‰X–N‘Yßè­®©µq@o*ê˨xӸѬ¤«³1wÕ ÁuÏ˰ú=­š—šøÌÆkã€4ñ™Më•W—ã{Ñã{QkÇ­QÁdt"#™ÊYQonåüèkºM £DqÜ» 2Vé1ŸSä¤ÖlÕ­Ö[²Z5~C“§ îiSwⱂ4¸FÛÔÖÉåÆuÖíµknÄ­Ó!¼ÃÃÈ#sÛ‹Àm4?£„2Š«å©ƒzê´:Ú¡MGlT2âÞëd*G3Øõq'q#ÊÌ-Q"ÀÜ`r§IDÛ —Ê¢Ä3D¸†,“QÙ¬d„J»rCÊ-oÇ c0níÅ”q%ù5Â[ñyÓÆN,öxà.Hk‡µ7¦(Œ9YœÁN"âìµV¦ÑÄõ·…*5”ûDx±ÑÎÂkòHWigk®­®/s÷Ê:DÖ ÔûƒŸñpÜ"`À±/BÜg`â¹iTmí¬vÞ#Ÿº¹SwÆ%œ+Б§3ÓŒjtM:~›VFÐ∖R‹@, X $Séž²¯JÕ$“AH…wtt@·…ÈfÆWUW‡¯Â»- ˆV¯\÷&:c¼Pæ¾9!së[#:øìË&xp)Ä™š^$“ÑÞTÜ€ð*˜7¬Rçyæí¯Qßüù.W»€í‡Å‘¿´1íM¯@“‘ÀìseŸ‹µtj¶`õ·0QV?³54™S sBÅQ·„Ïâ×xÖ³v¨—¸{cŒ'•cob2Œ'ByXo²)è´¨Ä] *F tcêI)¡ ™úxÒ8êÝÊ_ǽ'•ļهŠËžŠ{èØ)· M\;Åh!FGã·×¦ŒAfÞ¹ËÌ@ð‰ 2Fœ2Óÿ-{áèÿ ãÏ_i™‹YõUÌîEA=)¡¡)L¿Œ#Zw¦)Ã~•E]¹o´iÊ&gjW”™)NÛ–m0Ö¿l6´=Ò2ˆU]—¶;Œ4uc¼/›ê° Ó-86N€Ïtð™ADZ[ÚªÞ7MÕã±ÞyùÍ üÝý‘Þ¡gÆÀ걃Ö1¾$mÙ3ãŽ-Yû8·ƒ\ÀuûÏÖO¯ÓïäÜæƒ1p„GíÍl·ñÎÝ ~ž÷"Pöoï¢P?„ª)MkB;Ù ÅÑ|£#jÃâ~÷n :á endstream endobj 4013 0 obj 3277 endobj 4016 0 obj << /Type /Page /Parent 2 0 R /Contents 4017 0 R /Resources 4019 0 R /Annots 4020 0 R /MediaBox [0 0 595 842] >> endobj 4019 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4020 0 obj [ ] endobj 4017 0 obj << /Length 4018 0 R /Filter /FlateDecode >> stream xœí]Io䯾÷¯à9ÀpXÀ0›ø`@9>ã8‘1¢ø¿¶Häf¯ÉÕ¯‹Ý5$ªY¬zûV¯ÞþíóÏÅ?ÿ(Þ~øüŸâËøóÃç]UVu5ü+ö_o^ÿÁ¶¥³Ã¯MJÛíÿ_¾î‹ÇÝýî¾ÿþ¸3õÓƒã~ðùÄ|ù}÷vxùnøËç?ô¿ý¯°Å÷ýÿ~+~ü©ÿñË8ßþ_wmWïù÷ð‹±Æ¶ý^ÿ¶ü×îï)~ï—Ð>Í»ÿþƶ¡ªÚuëxüö¨yúzý(zYU¸PÛýbí¿…ÿýÇî×~¶oË(;oLSû¦š=kcûiC\Ñ5ua«ÚNflnÞ\fåD1>ÊDO+2+÷f*ßœ˜‹…~cÚð´Ñ`Üj˜S­~Ý5‘°Ø¯È¬ÛÚûéT÷Q8Ó¾pæ£ðàû‡ÝÛ;ã]»D¿ö+y’fÇ~»¡x³çÐÆ¿ßU•ñ-~Ûueè\ñ—ʈíÐHÕÀ‘¾§†ÏX4àlÎÁ8›ÅÏ@¸Ÿz::;Ut.ܧLþn9UXøžÔ©Â9“ îñH–4VÁÙÞÈaá=x6‚bè@Z®LÔ÷ÀUWŸàÈǘ+0¢Ö®Z5¢øb`,Àà÷\žv–Ęv¢r‰€m(ñ™µ#:Ò;¤#£…,o! ‡5²L»øÚ,äMf?ªVEÝ¥C} ã>eOÇ~€#ÐæJÞÚmÛd¨/Ó%çkùÄiÌÛ:JhŒ°¤[Kb6÷ƒýlÆÂÅTNp¥û17ÁµaÎÀØöï fÀ6\[€öœ  6¡¬6lË_ÜÖ†a@x-gÁ÷PXÀÚˆ±O1ÿÑÖZ<Ü)ÃY˜OÏ: ­çC2º-k½¬õXnŠ;âà -ÁD°´â‚½N`!heŽðÚ´ò‰ÄNè0X¸Ì1~èå1‡Wpc¶G½…z‡l{dÛC•¡— ¬ÚÁø‰êÙoÓö<Ôl{$m{\sÙöزí*›Œ…¡V?…=T¥ÊãÆ ×`¿š‘(X»F­’bfcbàB¼”ɦBo:rç#²Ï"®:û,[Í*ù, H|Lo8ˆ×ÆTŒà÷™8á=L~ë)<¢”-Nº (g=Oiñ°…:ÇË×ßz¨§<–›äŒÈ‘-lA¸9¸Sªjê)U>k¶P·‰µ‰ kk{âlUŃ«’˜ó‘Œ Àô-‘„å†àe0¹}ü!울˜ÃJ<2Ú:R¨kÒ‘5§t† Dj³…ZçùÈ‘ÛZÙÚ²Z×tØÀš{ bºÆ^?ö”ðlØÞ`¬1œqK8x[^í¶P뜵^Özih½ËÄÍàÙ.¿Ó¸ñ§l¯(Ú+J4šíˆd숰…ºålGd;"Û+4 áÆ­à¢ê-²±U;âfh4[2ÉX2Íz‹Ž¹lˆ4&÷Õœc2Õa¸öª³"ê›™n juc›ô#…˜ aÅf .6~rçÕØüÜ:±ï5˜KGOii0&cçˆêoGÔÆ'­Yˆ¸EÜÊtJFãý’X°;™þUD==uz›9á–ðù2&&ÉôÍf$¾ õ0ŸûÁ½¶!(]Ý(ê©z µÁ·s×c>à ßgðôx£ޏù‹Å€|b££| ¥³­±aªµÚ9KÃÓO ß7…€ƒÃ›Ék”H £|2+à Xø†æoc”ФÝZ€ NÞͦŠ 2¥Š(˜Å^Cç$Øój*õ†àèFui˜b©³\³xF¥Ü³Êt§‚rȸûL+s(cy䫱ÅÂ+â…g|4u¨ÿÄà«Ä/!1°}³€cŠR%Y·àY £ÑÁ['0G똆Àp]@ÉJVÁ{´‹Ñk\§:…6Ýüí0fÞ)ŸQ@vÆHLES¬6ûi²0ÄXtóÍŠ%R`J‰óÙsêW¬gmϺöUÖΧ找˜xw ÌÚ!aª²nÌŸ¥Øß1ÖЇPhi;ÁºC -Põy}ÚÂ2<õ[âÂÖˆ,íÝq<¯¯aÇ°Ø 'Q%=Ø?ÁÇc°€Û¦`_#na ^µRñN#¡m¼¶³{U>4Çé(’òYÅc‚’‰^9|щä|ƒ‹£5Æó@À+²å ø^«ƒôçT+.Ï:Ö§“:“øâ_cÏ äžQ4n¢R°Ñ‚ù“ÛDýBzF §XŽbÑê Ë “LHd)‹Aý>ÿIÁ6M“žhžM“Àd‚O©Ëe9̨½¡ƒ*jîà³ÔGØha²ûD=.Õg–¨+Ûm‹ÂÓɸbr‰Ð¡s£Q”î¹~Ë ¦VF¨žfÎ%3k»¸ƒ$Ô#Æ•·L…'QûÃTÄS]k1UaÙIHáÌvz‰s¬‰¾§T¿Ô¸'˜ûÚ7Io‚gº`Xc: ÎÁàIÂ{´B]›¤¯×a¾±A»ç6q"È[âT°ÂÂÖª»×òs"{tQO0¥5ªüܨŸ®º6~N8=b0t0g0Ð!ºS1œŽýbA 1Ýœ0ܰ…õ'Fz«ÊNýY–)È Æ‹Ã¼Õ/ÎeËÅíSš1NçžÏjá§ÁçΙÒ¦ÿd«‘ ÝGîê4ˆRŒ2@©†{.Q;Å}x±FdnˆJ…Ï–iªS¯ÃµÍyxó†¸v›vß&ýEaÕÌiyÜY geãvKaîÏâí¾t¥P«Ým4K¡$¤Ð•yŸY>]§|ò•vÇ«“O%1=©˜QToD¨J F’ç «Ý«ðê8ƒ 1áè?¶ˆl'®í ´#ãÛßL¤àò8ÕŒ{¯^w‚q¯7öõAKªc{À\ÇÜÒ÷^\UFÔ´Œö²äÛœá\©©n'>2>¦¦d•vÞïêøl›±œMF”s½€kU¹aµ»Ÿf¹‘„ܸ²p–(ÉH¯]‘¢éI†úù­Â)Kâ$/uÝ®Wšœy\©unÇ+„+¸;´Tåw—³n7inғ̹ÿô-ÂÚälåMJ”+ó1³¬Ù€¬q·™á¬Ãé çF3/çðr/­Æ¯ÀVîâÄiªx>ѧ»±Ï.”ÐêzÒÖq~h¡÷õy›7®êè ïõºb¶uZ^êò æ&¥É$ó»©O>ÊtÊ÷îX§W´â¦’¸7¨1ýOµnîXЫõdèiOSæZ¢>Ñ¢wòˆÐiYýLêOäëÙ›ûÞ8ÐDýU†]ž'ñl§y#êÝ~ÄÝãmšÇžÙ”äâüg…+œb²øëŽÎýWñØórϪû)Æ_¾ Ì=• Õ‹T¸傸èIÒÖ…é7zD¤¸ÎÔCW÷ÂUßZ‘Fe]—õ!…f²/'41¶)›CÒˆ£922½s¥íŽÞôBYh:$Šcïiá3|f ›Æ–¶rû¡—‘÷p¶¢^ÿå#üìØ'ýÈïÐ3£ulÄ }ŒD½ì™cKö>®í‰VPÝþw¼ÇÞ‡±éφéÀ5ˆFÇÖÎó0÷Ñótúp~{úm[Õ¥Ù{–hp_w-¹) ‹ûÝÿÎsq- endstream endobj 4018 0 obj 3234 endobj 4022 0 obj << /Type /XObject /Subtype /Image /Width 256 /Height 400 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 4023 0 R /Filter /FlateDecode >> stream xœí}”EÕo¼õ¼'Oó)êª D‚$BÂ?³È³$!Ád’ Y ”ÿ%J\áã‹+hÄ%HX£Æ³ûžñløŒnT4 'º¨` " zPðÈTÞ¯úöÔÔTU×ôLOO÷LßßéÓ§§»ªºªçW·oUݾ÷­oe0Ú^8™Áh#0ÿyF­ü?ɆOö±«¯¾úšk®ùÁ~ð¡}H^zï{ß‹&Ço/£%Ùþž÷¼çòË/¸õÖ[·nÝúÕ¯~õ+_ù õÉO~òŠ+®X¾|ù)§œbÍ{üô㎞rÔ±SŽÂ~Šq0ÇM‘=§VþoÃyç·\ÁUW]õÐCýë_ÿúõ¯ýÑ~T½´`Á™ ï‚w¿ûÝòR__ßã?þì³Ï¾ð ûÛßþð‡? /È«HÙÝÝm½;£ýf~ðƒ¼ãŽ;Àü/|á 8øüç?¿yóæ¡¡¡/}éK_þò—/»ì2ô3c׬®yçóáÏYsÓé×Ü4Ûš›Îkoš}ÅúÓ¿kái§Ÿ†×Ò7„ÿP~.P™ÚBþ£ÚøÀÔKçœsŽÌuÚi§-Y²D^ú¥ûï¿<ðÀo~óyo½3Î8#¡§Íp㳟ý,„¤™vþÞ{ï}饗ŠÅ¢vgž|òIdÙ»w/tƒ(Y4``xá…®Y³:Ô†žžžw½ë]ØC͸ôÒKI0µ\óÏ™ÉGO»é'6<èm|лåAO;¸ùþû¯±`þüS»f_;ÿ³šÌ;+jC’¯^½šÌóÏ?&£çâüYg%sAÿÇë€ÒoÙ²å%FFF(RBÿ·Þ‘(¾öµ¯A"á¿ÿÕóýýýô}æ3ŸQσ¥/¾øâSO=µ{÷n\á«f11}út(øß¯¿þúo}ë[¿ýíoÿñüîw¿ûÎw¾³nÝ:œÇU°ÝÌxÖܳ>tý‰ö¾lp¯‡ýŒ¼iÉ…ï*– K K–  ,[²xáâ…]§v!}­üŸjÃÛÞö6vôÓýèGÚùÈG.¾øbð¯0h5Ï=÷šŒ7Ò@æË\}ãÅ1oÞ<´ù¡öïß/¿ùÍoÎó±óÉ'Ÿl½;#9@Óù·oߎý¯~õ+yºØ’ãŸýô§?3—\r þèo|ãPWpòsŸûN" Þ ‡5‹Çs †{èJùË_À(¼G@-ìyä‘¿þõ¯P0põØcÕr͘>ý…®+oš\ü±WüÑAÅ{½÷¯ùÎóß¹tÉÒÛnÝôüÿ{~ÿþ_ô÷|á‚…óÏ›òI‚N á?F"oûÛñ¶BmÑ:èlØ‚ÿx[-\¸uþéOŠ3HóÖ·¾µ\Û30ØêcçÎÿ·Œ|åñ÷¾÷=¼0𡉣Úÿ@F\|øÃuñ·ªüÇ_¶ßyç’ÌxãÿóŸÿܵk×·¿ýmœÄÐ'¿ÿýïã:°5‹§Ÿ~:ô H{ÈU¼ýq<þ|0 ã_h¸:mÚ45ýqÇM›uÊIW}ñUŸøöË>uwã=ÿíÆ{¼åWM›{öÜu¿ýÍ£ýö±‹zß7wÎYsçÌEiÇÏ<~jíü?Ú0™&3øÃ>óÌ3‹-‚¶†1,d¨‹·!ô½Y>Àa™ ýÝáŸøÎÓƒ"<ñÄòøg?û®^wÝuH‰·•õM›øO? …˜Œqè¿øEœÿÔ§>Eç!ßÀÉ{î¹'ñ×ã Tã%–żî‰3ëׯ߳g†“‡‰@…ÀI\2eŠš~Ú±ÓÐ)ú·M¸î¿^6ð-o`§Ø–~ðÈËW_þ‹~ñè#î}`ï‡Bhò¤Éo<ì“kçÿ$:+‹Ú’&ƒN§]•¹ÞøÆ7Ê“7Þx£äüc=&!üe¤·Þ‘4 ŠÿµóCCC8)Ž—/_þì³ÏB»Æ1Æküã_xáè-èaY€¬{Ýë^Gÿ;J •e.]º”Nâ*z™ë裎žqÂôy+þ×Ekºð£þæ¼Ç?XvÍAï^óß§M;âÄ“OD÷A–Zù¸ ¯zÕ«þ]Á\@ï;<‹/¾øß+!s¡ 'N¤“èãx@h ×þýû±ê©§ ø¡¿S¤|ík_k½;£ý=ArãÜsÏóA Œ ÀɇC=ÔÌ‘~öܳ—,^²àü*Î_¸pQaQaÆÌô~iÿ_ñŠW¼ò•¯üŸ%`x½ý%źŸ<4|°Ìõš×¼åÕ׿þõ¨<HtLìqü†7¼A^EÊW¿úÕ =mFÖþ¿üå/[ð×ãçúõë!1¦€Î3tÉÊi0F˜¨ÓK¾éð@¹ª•ÿ‡Ù€š€óTmœ9s®¿þúsÎ9GžÁÕSN9)Õ\'œpÞYÖ2U ÍI'¤æe´7ð_c 1h½J—‡†ðz¨~~5 d»ÌVŸyæ™UsfÏž­ö/F{Üž9s¦ÐWl˜?>äaCnT+ÿ_Ï`´jå'ƒÑF`þ3òŒZùÿ:£P+ÿ‡6 mâ=ïÛc_ÿ7мþ†ãÁÁVÜXTÏó1gÿ¸Vþn徸¡8pÃ@q}i¿~@ô…Ê4Ø#™è ¥½v{œGÞ ¿LwzÞó¾!ûšåÿ&Ÿ®þ†ãþuýý×ö÷­íë_Ûcbïà†A5MÐMÖD$(§hì(gàÚ*{J/úTez>æãF×,ÿ}ñ.÷`éžö<÷âsÀ¾ýûÀ[0y`Ý€Øß ¨+Ž×àê5HŒ¢  á':ˆÈ¸~€:ÝðÈððöaïú‰Ä0‚Ãg£ž¼ç½¹¯•ÿ¤`Ó†cpdƒÀ±WI#‚ØÿATvÏÞ=ÏË‚¥Û†‰í«Öˆž‚RXZ€ øI/iP(–ä?J¯’ýûHþ‹’¡ÿo*Ò0E–гè'ø¿jå*Òµ´zò1[kå¿ÌHÈ ÎƒÃûØ÷Ò‹/À`¯øêmïˆw0Ì3Ñ $ÿ{VôàŒPWžyzhë²£³‚Ô»¢W¼D®zxNü‡ „¡ÕøoœÇípkqG_AB?ÑãˆÿZ=yãͺÕ,ÿ1À¼¡(g]Æï‡NÁ JƒÏ 36:çÁdšÒuIÉŸÑAÄDÐÎ1|” ²”zºÀØŽ1¼0æ¥N’‰ÿPoè-#›‘W¨^Ï=‡áƒúýNŒ—i ¬Ô“ùØz\³ü¯,DèöÐÿ_ô‡¢[…ƒmß^AT’í8Zb<Èóí£Þ’&ˆ®±ibâô~Îúdx ÿûãY¨IÈ‚®«k£òLéú"FêÄ)iP©?X>n‰ãšå?Íí—ö¶BcY)6ÓOy`žDï8ðÈHéy‹æáX¼&0p^)tž œÕþìè•¥ÙÑR^y 1A¤”©ý¤\j yÏ{Ǿþ+MàËÉüò¦­¬í›?Õa.&H¯\E+bPlo×öÉ¢ÄÁÚ>šÏ§ŒÚ%¹p`þ V*+Éoa[­ü'v©{âª0]¨ºç¾=]³ºpÜ=·}DÍëÞSH»Å F‚œ{÷¨øO]§uí»îÞ…:#üÂm¿w:ö8SXT=¢²„Ðí±¥Ýb£ áámï>ˆtÁO/ôÿc§¢7q¦Ìÿûö_D0:ƒ1t$™·Ê~¯x ¤Ýb£ p20Q¾7Ø“üï÷}Ahü/,+ÿgΘÿ²ä 1™à$‘ó^±øïOš:¸q°>þ¦8"^÷Üî†TiÒá5´¢ðõQ —ytxèÝ5× z®úÊgdP~ÿ7Åã¿çõ,ïÁ6ñ‰7 ô­í#V WغNBWÑÑ7m‚Þ…ŸÅEãîø)ËÄùy æy¾YZxç¡ÈNg ä!xE›û¯í^oe^Bï%½xCáªPð”úà@m…Vä«GæX?€:o†¬ Ä²ZùŒ–C\ùïSTÄÿÝ4ÝÜsˆ x)x¾unáùôëYÑãùƒìAÔÞ½ò§¥p¿sá*ȉ~*ø¿Iç?èG5'‘F/¢ÃÝ6J‡È.z¥¯G¡œI“ËvzM”\ò$ X'ìîÔ6j)-’ÿC›†ê×ÿ!Q7Ü€œ¤KÐXÀ !ð7 B‡GAÀUHr{~A^ùÓ„Ðÿ·£H·Ê©~`Ò5ÛPÅ~vŸÛ-U#tCõ ×¹¶ÊV­\æã-9¯µ‘ùßê€üÇ_Wÿ/A%ä¼sç‰Aq% K K à1-ø92líT8$3Ô ø/åÿµ:ÿW]¹ª{¶1FPø‰úHþ£LMª¨‰škÁ<1úÆÈbò¤àu¦Ü”ùßê€üëÖÿGwTüû(ªrp|ˆ0Š&å —ztèÚÏÐÂý1&ÈôÃÛ†é Jê–r;pÛ"ÿ•ŠÁB)1*ÕŽÔ¬‰ÌUXV ÕôÝzÓŠ'ÐáCó€‘UÄ”ÿþ{¾ DãMš“ÄO\ÅFUûé(Ä&ÙÛ»²ÌQ`Dþ£pT€†®`#ÝdVÓ˜5‘¹HÚ£¿„ñ_¦~Mýîi02 ’ÿuëÿ FK#¦üg0Z1õ£¥ÁòŸ‘gÄÔÿ1ê$š$Á˜4ê}£¥Ä8—†® Fˆ#ÿÁaéŠDdïðÔ‰"§dþ3Eý_3¶Ä+`l瘜BÇ0õÙ2D?Q~ÿºþ¾5}8©¥”Ó’Ò–²gyÍ:â$óŸ‘bêÿÅ E°ZÃTLwwå#çóœ7S Û3n_.o‰u^z;øÉ˜ÿŒäþ¿kvW°¢TÉy0B^.©f2e÷ÜnCÔc£õbœé]ÙKWEçbþ3CCæÑ­°ºl6sÄ$˲i%ÿ+,öý3ÌFsGÿ—Y@râvf3¦™P…þ3âë?lZÃHqä?4ðSdÇ(ÕWìë0›ñ 3!¯4þ¥ñ2›Ö0’Ûÿ0ò ^ÿeälÿÃÈ3Xþ3òŒ¸ú‡É’ ­sÕ\’!6@Î̺ÕTÛèfQŒ&#¦ü¸a€æ9=e:´TM<$£ï +Û£Ö6ºY£éˆ5ÿïOÝWœQŒ|<›af¤IŽá ¸±Ø¿V¬Ëw ýÝ1JßËÛ7!¤'s‹òŽäÂO°jõ*a§±¶¿gy ÄU¢®Y= ³´…àî´®§ö³œAJdÁ­j…y7uÄšÿŸÕ¥é<ª‘iØ#PiTa¤ð…Њ­ÿB Öê§» (-‹5¿pW‹B3iÉ %`³WÏs•CU®'dmmöKÒÑÖF­Â¼Š—:âèÿVþK#Ó°Ç3Œ‚Âø_öj²zî" M‰ºåÛù«l8C…«† :‹ZîH>ºfw!™µz²æŽrÈY–¬­Û~Ioce…©#ŽüU+0 {L£ 0þ›^H²8Âí¼jÄ“¼•E™üת'áæ?~jüwØ/imÔ*l½;£™ˆ9ÿOt,\z:ýÿ˜FAžjäà‡¸‘ywÍoUo ã¿Y=‰Pýç»þc·_*i8juGC¬ÿ¤˜ó?4à…|ÀU·ÿÓ(ÈSM†œü§)VárvE¯Z¾æ·Góðãà¿Y=f9ôö±ŽÍrÊŽý±l£Vaÿ¦Ž–°ÿ[‚)t.1 UÍòj#:Zbý·¸¡L¶“¿ý „ª!—éiׂ-aÿƒN ²AÁÞêä°ÉÀËݰQñ>)¢%ä?ƒ‘š¡ÿ7ÎFÈ ·³”({êZ}­H½ÂaÈlÅ44Aþ7ÖFȪ΂ªZìdá_«É* ¶"³Ó´þßX!kz‡³ ÕG_Õ*`¦±ÞH-V³R Œbª„cº„Œ4‹»hÈÖr6.©wtØJQåê$Æ54‘k-ÐjL)·²WDF‹`•$-ÿl#T‹³ ÍG³/ ‚”…¥©Ý:ˆ Œhª„NMÃg1¨§Ð+z1´—+'¬ÂæsÓîhÚJ™ ÄdG2šgxp²S)—Pm·}T¦´þßX¡šœivVû¢°4u[E4UB2RÔE3EŒ¿ "³Êk9a6Ÿ›vGÓVÊl :^7rIÚáÁI_L¯Å>ÊË’–ÿµªÉYƒÿjÂø_“uªëF1U"‹dG…ÁIò!¦ÕÍZNX…-ÏÍ3l*m¥Ì¢2xÔôšp{pª‰ÿaO2 hÂü#m„¢8 *A³Ã±ò?4MÖAªR±.V²ð1CŒÑŠÁtµ9¤œ° ›ÏÍmÍÒ@žÊÇU·'“ÿÑí£2eõÔ„ùŸÚ™é=ÃYzkÕÇÊÿ°4ÖI8¬Œ4S%iácš*Ñh‘Ž‘††*ÿ­å„6ÊxnU£­i ¤ 㞯zÑ‚»Ãƒ“Uþã/ˆb•)«§–°ÿi!4ÊT)ƒ&O´Êl§ ^ÿm,eª”A“'Z—ÿ-aÿÓBh”©RÖLžÜh]þ³ügäõÿÓZp¡igŒ—µcu6‰ÆÔ"úXiJЈ\è Ø„™Á²”L–!)ú’y¦¾\¡ü”L%i5––ò³¼šÏ¨ ùÿ©ÏÆg°AÓ˜”“ú²ÐÝ1*Å2)U ay¦¾\^Iá—cµ Òt™ÑHÈÿO}66HIKäèx³ÈuýªÃO‘är^h¢ïœ%›gêËE#UÏ Få>Ô~Áhu$äÿ§nÐŒ>*‘åkw”L†~B 96ÒÛÍ3õåBJ¼,‚ÇȰöþ4/} ¢VÑêÈ ý¸J“ÿØx²‘(xý—‘g°ý#Ï`ùÏÈ3òãÿ§uQ«uef­13X±\ùÿi]°S „ÐÆþ&o´/%;í”–?ò{+Ó黶쨵±ÿÍã™ÒÊ«ÓWmK3?Šg§@Ùw ÔÆþÑÁ(¥•ÿ§7ìÈý|ZÑ)Pûÿ¡¼Öè`”Rõá^]n§7ì¨ýœµ±ÿÍ㙲üòõÏõµÃé ;j?§@mìÿÇôxŒ”7I§õ|kÔJU_þ»ÞXï.ÁNZÑ)P횀&Ï”²S Ì"Ÿë¿Mæ?;Ê,òiÿÓdþ³S Ì"ŸòŸÁ ÄÔÿ1ž <çT~¥ÕX4ß#„XPüÿHÈw{jÄ‘ÿ‹ÉÉŠä^Í÷¤.nšopâ?{jÄÑÿår¤Dã lÒð¤:‹@ÝÈÌF³2b@í˜ú¿°zZ×/ýü4ÜÀ&@ôÝ}P‘ !¦•{jÄŸÿ§ezp) ›´<¡’è&¨3ö8o±²`@m†Ìÿ¸NÂÀ&u@äÅl{jÄòÿYÊ2K+ñ»q6©x’(,*ÈÕy­iì¨=Ëÿçì.²E‘ó„IØ4ß#W¤ãÖ²wèVFì¨-ýOcXÙ##!$´þÛÆŸâ2Ú Ùÿ0ÿ-¶ÿaäù´ÿg0,ÿyF>íÿ ËFžÁú?#Ï`ùÏÈ3Xÿgä,ÿyëÿŒ<ƒå?#Ï`ýŸ‘g°ügäñõÿy æ™>¼jA»W#ú +,_å÷’äG‚>c1öÔQ~;!çÔˆ/ÿ‹Š(AÿдËy5"?ÅM•:O˜0þ;ŸœHÄ,¿}ÀÔÂSÿ'ï Z8/¯äO¡ )4Pƒvi±±Ô«U=Ì4þã<þåÀ·[¥2¦E¹2ùo­ƒ»Ê3|™Á³$¬a¼Ì¢³†÷²—Ù¸jyÛÿX‘»9Ò¼‚×­`þçlÿcó?'`ùÏÈ3Xÿgä,ÿyëÿŒ<ƒå?#Ï`ýŸ‘g°ügä¬ÿ3ò –ÿŒ<ƒõFžÁòŸ‘g°þÏÈ3Xþ3òŒ˜ú¿ü°È+}KRwM¢˜\J?6Q§kÃÑåŽjjj;#"bÊÿòßó¿]r]VüØDä@•“Cd—;U4¡²ÀÔÚÕvˆ©ÿ[ù_Ÿ—Ié0¿:ª«ó¾²@µªSÎC;¥;¤„°Us¹› *¼±ˆÊ nTÍåŽl Ã§}Ôoº*¢;jm— ±d¯¬ Ú¥ySa¨ˆ)ÿ¥ÿrÇËü[ÃüêTø±1|øXï+ù/+ ¡9Õ±ò¿\mgTgA ÍÁ‘Rgͧö]¿éªHuΣ=(3»µ&(3Â?™S4\ÿ¯ÛËú·ZýêhÐ|øXï+ù¯ù¦ð §"VþË\î&X …ðßô©¢ùu1]9øoÉnsmÄp áúÝ^n*Tú¿:&¢Ü×:XÐê2Qòúñß:Üp70Pëå¿Öö:ø¯×„áDÃõÿº½ÜÈd¿:e?66&a÷µò_sªSÖÇ|78þ»(Y§>YˆéSHS`®ŠÌ¶[õ³'²þã@ó?õy¹QÅZ˜_²× åÂî6Y¤:Õñ|§= ¶9:å¿»²2ªËYˆéSHókäpUdm»–ݬ Ý`ûŸ¦çí3^ÿm˜ÿÛÿ4 Ìÿ ‚å?#Ïh†þß!Æn´F†Ñ_sLwÄÜàŠÞ‰¶ `4ì´Å: »4éˆI´,+Ë5•C•‰ÓFBh‚ü‹þ¥?˜0¬f¾Ÿÿ4Ei æ ;‚U¶Š›†_¢©x¯4ùYG9Z´2FF´þ/ S>b–£…¸2§ø¢¯f–Cÿ7UE± ÔEp\’@¨äZËÁž‡Ï ’–ÿ’0V³3Ä•\â ³ÍÈ65ò…Lž¡ú´p‡ŽK¢!³»hΟ^^µ–ƒç`.g0RGÒú¿›ÿªQ5ÄÃ^È¥ [5(XÝü' —Qk-uÑ(ÙAÒòߌ‹d]–uðß+Lþ«Ê†,¦þãùQoPZ­åà93ÿ3ˆ&ÌÿS,:ÖÌ2%ÿÃB\9ì… ë2ÏL+™nGÅrIæ*uaN02\G9ZgdM˜ÿ¡q.ÔÂ<Ì,',Ä•#*VdL7kP0hc£/ U í’§ÏR¤ªSS9¨<[#gíjÿeà 2ðÊofѮ뿤¢§]‹x h†ÜŒŒ€íyF»Ê# š ÿcÌKÃÏtm`,F8bXª.KÕaäù®ƒ3>øoúç‰è½G .·?xÈo?{àuÍy rèCu4–>NÎI–Ū¹ð‡RTµ>Ž»é‚< É{…Å;ÓZW®žQj]…C˜Ê[àÖÔåE Ï©‘7ìÏr7_oKÉQ@Šh¸þoúç‰î½§>·?ô½<ÈL'U xÚŠj9ò+`TÉ\Å*¹È}DXÀ2ó.”Þý(¬ü·d©l„Y¯ÿå­Å?5ËòO…=R3¯ûÏ m~H[RDÃõÓ?ODï=u»ýè<ÍâÁZ™)Ë1ùV¬•ÿÖ€eþ;Eÿ-õQZ'ÏÕÁyë°*ì¦f^ëŸUµùamI ×ÿMÿ<½÷ÔíöG>É@ѵi&aüw«¾ô!è´¨LaúOEzç£PŸžæ)HÍ¢µ®\½(úíŽ*ô‘y­VÕæëmÉ€þ“ÄüæŸ'¢÷žºÝþà< ²ÌaÅÝsðßUô­ƒ>9þUëcÞEK_õQ ™?[A0-‹Ùº° x6þ[oöO…=Rkß1ÿ¬ªÍ׊ÍÂø—íÂPë¤_OFA‹6Ÿ×ÃÀü¯ -Ú|¶ÿ ó¿&´hóYþ3òŒVÔÿÛF2G­X‡ÆÒ"#˜QrUMCëV4{!­ÊØÒ±Ý,,ÞYM¹h)œ†Ãr^«wEo½Y†4-*ÿk²–iuþ »‚’óö`µZóÝ%ƒ]b¦´ ¬…䇋Šêœ’–Ýï¬Ö\|ŠîNËÄrF×n ’ÓÿMóÕx¦­>£;FñXdÌÍ>DÆŒ@F]³º ¬Ô?×ZŽWr<i£ÍÛ›V+š¡K˜)-zÊuŸî¹Ý4§g-Ðjkd5( 3û‘0#” {$k“õ’ýëù«fTyð¼•ÎÛqYˆÉft3k¼³úr™Í‘a!Ž„äØò‘š€®!%†g؇ТçsŒþ2œ“Ï¥VþñKòM[uõ«펦)‘i!Cf(0ÐÂÍ`t[#›AQ˜Ù’i‘ûTžÈGÖd³dŠ0‚\ôèÐ^TžºµY$“'ÑÍÌ3uç"¨¡ÙdWmš§ú„ô·y€ IĹ4û$ƒ Å_Ú£ ‚çìCòßZŽcEå¿nµ¢º¦D¦… ˜†×\¸t˜ÁèkÍáS7ÿ­öHj³dÜšŒ¨ È…¾€MüMË tR2YÂŒn&ÏÔ—‹ ”i×Ú!D%YM¸ 3Š„ä¿ÛÇó¹Aïnͬ±Â>Ä $ ð`)ˆžg¬çšå„‘Á´ZÑïèé¦DæÊà$‘å¶Yª‰ÿaÿx ؘ ƒ£ÉfÉ8ƒ ¢ƒÆxÂRÿA–Àšw›°æÕ"fjÑÍä™úry%%AŽeÔ&8‚¬5 éÿn#"v9uÉÄ´uA2Á«Ž€`ºÚRNí¨$UdzÓjE»£iJ¤[Èø_”Pù¸ê¶Y2ùfPd½‘|Ũó*ª5šz¯°&›%#%½4Ñ/P ñÅðª28šªÉh)º™%ÞY]¹hD ê9Á¨Ü‡Ú/Eró?# uGqÁð䥈iëB£E:¦ð‘^%ÿ­åx^ ÃÅLZ%Í4«íŽf4 7’o  )½›%«ü3(Òn¤¶…ƹ4¨ÿµWªµÉfÉž?úY=ÃøÍS˜lF73ÏÔ— )ñ²iïOóÒd‚Z½D‘Êü¿çZôôzoݨršƒLM«4fÁ–ç¯VS™ÿ'É)Ž:„ô;x!†=Ú½¢ÿ˜w·ÖÐ4XÊ2ZTþ×3ó\o+>´9«õÁ4¿‰b_dõ‡SÕø'ÈÕÌ’iu–_IXm™Ô4V¡ªfEæcÉ8² ÿ›Žqë—/V°M)# bÊÿþuýô±•çîÔЪåÓçZ“Ž˜D!Ô™ÿŒ"Žþoýš½ ¸±HÇ2>»élR?EÊý§ ɤA!nþÓ7†¨’ø‚XIP5|˜¨ÀFáAçµ€Jfs¬ÞŠ‚b+GÞ\@Èïߥè@­ôOõÍBù?Î ¿e!Œál”èYÞ#Røl×~ªü'8øûª!àÕOΫ†Sýiw´ò_óV¤VO+'ðü惎çƒp BFÜõ~´xò!%Ä‘ÿ¿¢ÿàÏ ¯•M€øoy¿w.aÎk?Khÿ«†SK¼U¤±Ù7ÿµrLþ£¥(ÇAixœ’"bÎÿ‹ Ñ%ÿ+ü Ž “þ£9Û‘$'oœÚOµüšôò1K·Ö\î¸Ã‡9øoiŽá­È¬ž,ÇÔè@Ü·#è€Ú ‚ÑLÄœÿ= Ášÿ <Í®ìÅO1ô¦g8ÛÁOÒ_¯ý”Pç?éŒ{üKolÚø·jø0ÿÍæX½iÕSË)Kn‚hìLÇh ©€íjϬ¶xý·V0ÿÛ lÿS+˜ÿí–ÿŒ<#¦þ1¬U É̪*#>âÈÿèa­Z‹Tõc´&âèÿް¦…M?ÒÌ!¥1p¢D³Z iÑ»¬¹Â„™Õ( 1 b´ âÈGXͤG]3‹\”2Ü', X˜¥ÐD5:XHl/k˜0k5ÌàbÚ2£mGÿwð_·ð±Ø8ŒpB£€…X ©yݱ½Ì0f5ÌàbšQ£mGþW k¥˜ô˜ £V#œªQÀ´bå9mµ×ÛKã¿ÃȽ(ÌhIJÿk¥™ô˜\²áTf)TÉÛKã¿ÃˆùŸÄœÿ k¥™ôX ÃL#œªQÀÂ,…´ù%Gl/3L^˜-ó?ÈŽýOkÍ‘2ÚÙYÿeþ3šìØÿ0ÿÍGvä?ƒÑ|¤îÿ‡Xø3RAêþ˜ÿŒÑpÿ?žáñÆz¦gyM<’í(ŠŠrò—‚åxëÙÜø01Ñpÿ?æßæ™à[uÏçö¶aâ¿XüšX^ü¢¯é½’{(»#îÿÇôøá>ø‰2ŒÈüÒ w"³á †—€ÿŸøüG²IŽ¡J_ØmŒxh¸ÿŸšõŸEÿ©tªƒ8/–hV= F|$áÿÇôxcž¡ñ/}´Bü§cÕø'GwŒÊÑ®fÕÃ`ÄGvì¬ú•á—Áh²¼þ;uÊTõŒD‘û ô‰n15 ‰,Ë#iÄÔÿÇvŽAEK·‹†°Kµš=Ƈˆqqµe04Ä”ÿžs¬—êã?/3…˜ú¿Ê‡çœŠKÕü™v>š±2ºÝm1Ñ@ùïðœ#/Uõ dÚù˜ÆBž¿Ž«Ù †FéÿZp^ÍsŽê)ÂíÈ´ó1%<¿³Än:ƒ‘”ü×½=¨z¾Ó/içcå?ÇLa4 éÿaü¯êÈ´ó1…p@> Œ˜h²ü¯êȳÙùhÆBÂî”çäÿèöÑÌÚÿ0‰âüçõ_F>Aò?ƒö? F€A(Æ¿ë˜ÿŒbÂÁºfuá-Àfö ƒÁ`0 ƒÁ`0 ÿÏýÿ endstream endobj 4023 0 obj 14559 endobj 4024 0 obj [236 /XYZ 33.1199999 451.219999 0] endobj 4025 0 obj [236 /XYZ 40.7999999 515.539999 0] endobj 4026 0 obj [236 /XYZ 32.1599999 453.139999 0] endobj 4027 0 obj [236 /XYZ 32.1599999 340.819999 0] endobj 4028 0 obj [236 /XYZ 40.7999999 515.539999 0] endobj 4029 0 obj [236 /XYZ 32.1599999 340.819999 0] endobj 4030 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 295.699999 106.079999 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction >> endobj 4031 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 287.059999 173.279999 294.739999 ] /Border [0 0 0] /Dest /!.#09#d3#f3#3b#23#86#c8#c4n#25h#91#ed#c5#f3#9a#20#82 >> endobj 4032 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 278.419999 205.919999 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline >> endobj 4033 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 269.779999 163.680000 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java >> endobj 4034 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 261.139999 110.879999 268.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers >> endobj 4035 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 252.499999 100.319999 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays >> endobj 4036 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 243.859999 186.719999 251.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library >> endobj 4037 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 235.219999 279.839999 242.899999 ] /Border [0 0 0] /Dest /_#cc#213#a9#ff2#e1#cd#d85#ba#5e#f7#9d#d9T#7f#e76 >> endobj 4038 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 226.579999 196.319999 234.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning >> endobj 4039 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 217.939999 113.759999 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4040 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 209.300000 244.319999 216.980000 ] /Border [0 0 0] /Dest /#efjA#8d!u#87#8d#20#01#cb#c1#99#fa#12#ae#16#f1#0b#94 >> endobj 4041 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 200.660000 228 208.340000 ] /Border [0 0 0] /Dest /#f9#21#80#b3#d7#88#9c#e6#f0#10#d2S#f24#25H#a2md#03 >> endobj 4042 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 192.019999 266.399999 199.699999 ] /Border [0 0 0] /Dest /#bf#9cM#b0M#beuU#ff#1bq#ee#fd#17#3f#86#e0#05#c0#e4 >> endobj 4043 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 183.379999 234.719999 191.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception >> endobj 4044 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 174.739999 108 182.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 4045 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 166.099999 158.879999 173.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example >> endobj 4046 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 157.459999 180.959999 165.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 4047 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 148.819999 153.120000 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats >> endobj 4048 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 140.180000 122.400000 147.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules >> endobj 4049 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 131.540000 138.719999 139.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 4050 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 122.899999 317.279999 130.579999 ] /Border [0 0 0] /Dest /#83#7b#e8#c5#3d#c4#072ls#13K#b4t#b3#b4#85#8aT#bb >> endobj 4051 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 114.259999 279.839999 121.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects >> endobj 4052 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 105.619999 304.799999 113.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 4053 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 96.9799999 286.559999 104.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 4054 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 88.3399999 346.079999 96.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors >> endobj 4055 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 79.6999999 237.599999 87.3799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes >> endobj 4056 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 71.0600000 252.959999 78.7400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class >> endobj 4057 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 62.4200000 186.719999 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type >> endobj 4021 0 obj << /Type /Page /Parent 2 0 R /Contents 4058 0 R /Resources 4060 0 R /Annots 4061 0 R /MediaBox [0 0 595 842] >> endobj 4060 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << /Im4022 4022 0 R >> >> endobj 4061 0 obj [ 4030 0 R 4031 0 R 4032 0 R 4033 0 R 4034 0 R 4035 0 R 4036 0 R 4037 0 R 4038 0 R 4039 0 R 4040 0 R 4041 0 R 4042 0 R 4043 0 R 4044 0 R 4045 0 R 4046 0 R 4047 0 R 4048 0 R 4049 0 R 4050 0 R 4051 0 R 4052 0 R 4053 0 R 4054 0 R 4055 0 R 4056 0 R 4057 0 R ] endobj 4058 0 obj << /Length 4059 0 R /Filter /FlateDecode >> stream xœí=Ë®äºqûþŠ^¸=|?Ã@æ$‹ƒ ‹ ‹à8ö…ác{ìE~?”DI$‹%‘”Ôê>>cøÎ4%UQT½«Xüð¯ßÿçúÇ\?|úþ·ë‹ÿûÓ÷ ¹E†?×î¿„ÌÜ8þ©¼1Ûý¹¾¼^~^^¾]¾¹ÿþ¼PÕ?èÿrGÀ¼üåòa@~F¾ú÷¯ÿ»²ë¿»_ºþ×»¿~ïáu7¼^ŒUÝ?þ<üƒ2ÊŒûþ«»øëå?sý‹›‚éávÿý…Å1›æñsz”öÿ Å‘+—Zku¥”¹yJ·ÿßË´i7w·’Xƒþ»“f#*Ûý_<àuË Ñ­€Œ&ûê—qÓ›Q"ô"$·æþúï<Æ!1’0÷Õ‰p„ÐXA©V­L)!õK`¤›s·–’QÝbN¶~£vú¼ýŒè¦7óŸ‡t“„:É¡@ÿ]üy•¶èç= \ß]Ñr4ÝÛ·bÔýÉ ù¶® *'0k j vW¨-Ê ¸_#íTˬQ9¸™tô*y˜_…qôΊ:ýý—ÞrÂvYúÐYKïæÁ¯á¬ø£.ývªÏ}ÀÖÝ/ÃܲÛqF¸æˆŒxjŠ÷ÂX|ÿëøõ¯q'ØìN,}´?.¾RÁMç=ýøƒSe½ 6üõÃÙKòúKgX{ýñûëo a_wýñ§‹½¹÷ÕrðÙ†+T`WÈôƒ>ÃêñP^QØŽ^aѹýKåËG{‡¯¼ó6Yyt­ðÁñàkµð…mÃ3 ô‚¯AW¿²°Ö8½|Z¡¤Üôû,¬úåðµn™áá+Š…†¯ó3kàò½Â(DÝQ:8/ôñ¥Ã[ãt| šÞT¢Ïûp:ÇeÀø™¡òÎ:½Nãk€Ê Ž~SOo;È ‹ Az¡a 'C{””Ü”¦ÆM'%=“®B00|21 ó71¼X°êàÙ…õ ªr†JÑ[©M ‚Š)z†Zzv ^ucýJA”{›ò÷ =B¥ŠÖ¿R±ÒàûQÀKåo±ðíqRðb+Œãã_QbÇ È¤øÐ[Å—œLGÜûŸ“$6½ Þg£,£ËÙD&‡Ôç/¢ÇÝý÷åõúáß^aìzýü×Í*ÅÙ¡6§R˜êTŠán~-&=J†?ó§E¯‘ï´L®ÐÏõÏ0Š>c±gø@Ô]R='¤´¤n¼'ºð™Iy¼¬&sžªfhŸ°+øÜphü ö¦”¡k0tdJ¦R1¿©½5c¸å©Ù§Óin‘«\cPy*éD*‘ ƒ+¡•íMûœ²Ã¡•z¹,Æ5'„ l¿r`M†®Ò*ìD±÷È— r ÍotŠ ¶ÜŠY°vËU6t"𯴋M„ƒKy®†ß``sJoR¨ÈøƒË‡JŽÈ†8æR©3ŒM”û²ÁäFé­Á}Þ$ÁÌváôÓä\áÐv}ÑŠ¯pþqý†{!ø3øòí!õV—#·„fމ*TÎåYÌþ)7ן{`U+Þ)q¶¯‹|Ln` s3–$$‡F§)Ç®£ž!qTØ¢ùùò4Ù¾1él°ŒÔ3Æ=“N|]øU˜Z qZü“ñß´9ÈZnzKL£!HÔ ¹±z‰;øµBb²zU‹.`E» ,hC¼q!z‚ã ’¶šEñ”¥|;„òصÇDvQŽÏãµÈðÜ餘ã÷ñZ6¤÷ü-E|5JçÖ¬p½.Zx­CÂE Pqß _5T`TdÍQ䥔?[WÝ¥d¶%°´Á¼Ú/)`®Läd)¥ƒ(RξDŽ2`U°tž*}“ð›ÜâXªGJOi…r"Á¯ðÞµu·òagÄסó½ŒßÉ$•\ÇÓËxÞSV3m nçY…ƒ£\èê5­GŒü«õ¥Çc,-ˆ [mçäÐx„¨B…µ¤>6T· êÝ]ƒdB¢xV=“ƒ·Rø’Ú%Oh׬Lƒ³vJyÖÂÆF¡d"ؾ{ßÙ°oß9·°ß߆ïRÄ¡µì¢Æw§¡»Zý´µ³´6UÏ^TC4øã·ÆêßÓ]¯ÀÙ$ÁZ\¤]=Ú7æEá•F-õÿ,¹ý‚¤F{Tá@™f)p9v$«cµªå¢X«âºß‹½Ðáßqï•Çñ<¤¶}ÑyÜgÐGÞ¸²ëNÝr` æÌ±E5wª©H·2Ÿ]azH™Æ‘ùa³Åˆ¬),ßPg¶SzÜŽ Åq_±+’¡Ï¬›n`ßI¢”-Æä.òø>2çñL~™~‚}ÉïÇâÛZå6ø¡WpQ¶°+x}î²g*ŠP|ûF¤e·6@v·l^)¯bYøBxdåaŠvª5pÌ9Ê…xVèNxøg”ôðgP<ø¬®à•7 fPª÷¡<Å5 nßâTv¯][R‹ñ>a˲`á¡IP¯‡×³§:Äÿ”åP;u”zš˜£6¡Û÷LÉóeJ¸äÉW| Lɳ!”Á>·[æÏ'€6\EÉî.eW÷òõp ÐIÃÖ¡ÓKÞ7½´Š;5¦÷gckÀé1!®|÷¾C:95õy§h'Ú…ŽÄháºÖÁ:÷ Þ{½òn•<®UR@—b=c(ÐžÆøŠçqh8á9K¼+9~šúí á\‹w½Æs£-ÝÏq~Æ9pß.ë <Ãvëi®œe÷Yöt¬ùØôÚ÷ ª•ý*„#ÀR󿬾i«r!fóÉô•<ªÃö$ÇÄhO⽦æäù"3ú;¼*ã7:¨»Y¨èùC”4Cṕš÷‡â˜¾íèõuümÉÍrÕ´ûKS:ÂdÙU“±?é8òrQöF©eÆÐqL™Šÿåq¸ûýoÓ=vMž6:ÅáF^.ÉLº»x%~—˯—¿‰Ö„‚5¡edK+¶ÚŠXÂm«jè²ÞÆÚTwÙ«1‰ŠÑ[ª~¥¤§;ªx8ÐÉ´H·TÈî~G#€qÀô4ç´¤'˜~”v#Ì“Õ8ò⢞øæ»H †„hº'ü€êÉ.@dŠÆtE“éï’1£ù5<“êNÔKåÐÚÙª+í…•#¥J5G­ƒê,J¹~Ê»sëtÕ½DÿÜÓ£< kÿåë%ˇ&L*ÚŸÃpë®n?ôË[âS-û¨¿~Ñä¾^º3Û2_tUT0™ˆ ¦r¢Â9u » *ú»H †„hfQáL‡Œ¨` áPTôwÉŒŒÑœ**ødŠ ›Þ¡Nª¨´;fÿ`KFhC=ÝsïÑܳ )÷½~¶$sîÕ1ÉTj NG™¢I8ðç„§ª j#xdP!2µ*1v»‘Ô îÆ” ¡Œ¿xdP'N Am8(0¨û»x%~s j#Æ@^¡³ âÐheKW€¦â_@¨ ]Çî´[å ½cÏl©He5øL«aùRwLjÑÍf†‡Û墱¼Q,'o”HeòÆy‰â¡Œ¿h,oÉÉiSnÈ9I%~“åšv|FåÍ®§f¬g+uËöåµYÅ$®&‡\³p`;‰ë8Få¨)Gâ&Qu#€ÄÍ£¡ø_:ŽQ‹Qƨº@âzŒQPâ÷8™Äͣ»߰¢ÕNP ‰_˜Þ­¤J3ù~’†ÅΣMãL6g²$3YãLÃ]$CB4³óh³q& âL6g²sœÉÆq&ûq&KÆ@É1§@½ZˆûTÔùÝ…Šj¶Ü£ØÑ³d q”ò¿¥IðÈÒ\ðÈÒ4xÔþ§SðhCB4ÿ[š Yšº‘”ÿ‡»d FÆhNå6‘À@Gn’àHºŠ0îH€MƒÕ{ÚË)†8c$80ðÌHºžÏ U*ª}öÜŠ×Üã;l*Òx°+-(lÞP1ù”­ƒÏ£Æ= \[zW4j¿ÏÉÆY–XZ½^$9ñµª(9O%9EÉUªÁ¸‚в¿‹Ä`HˆfV”œå¥Óö) e—ŒÁÈÍ©Š’Ou†¯(í_ ÁxOExg{û„rk†1.i8°9šce°´2°´2 Xv#i4§S&„2þŠ–Væ–V¤Ën$æôwñJüçFsì¼OuK4g¬k]?6ù‘M© Y9,M8P¬ñ”M4ž&9§YªŠ4ƒ¯¿‹Ä`HˆfÖxÊä4žÒ)¥¡Æëï’1£9Uãé=¢“oê r™­ÇPéQí ™~¶g܃z–5 >{4Céq¬âxç†ÞÀ]˜IEž85ÈjNóh9¢Ì2H¯á]— °&IX“MX °™d€E¼‰’#šYâ›\2Àš4Љo¦dÀ FÆhN•øv½jò]â#ßòDâÛË]G‰?¶w‰_!ñýîÚþ?3—Kà‰`Õ9‚]‘ÀÖM.’Àn “Žq£I:¦I$°¿‹Ä`Hˆf”Àn “Žq£ é—ŒÁÈ͉Ø:fh–À¥¢Ê!¡“·eÃãDU‡(y¿'æ±·Ö÷å, üVià¬fd- OÚ&Þ»aqáx,µœ³*'ÆVã‰c™4‰U©fa Mâï"1¢™ˤIÜ(h@šÄß%c02Fsª›Ú1à ¬FÜ”Q/TWœ ´Y·²©º˜³pà@7À!Š—~aÐê!ŸMχ‘!o$zþðVE—“¿Òœ¤ü°%ye‰ˆ’Wîw&yåF“äU?’$¯ú1eB(ã¯(yå~g’WÖñ[ŠƒƒäÕp¡ÄïqjòÊÍbäUËΠlä_—½rk7…"• Š iCDe²W]©Tj!(½òw‘ Ñ̆ˆÌd¯Ü¨NÑH½òwÉŒŒÑœjˆ(ñ&‰ò)Ïb.7ŸÔ”7óÒQU¥,Ñ:a%I XbHJã¤ü]$CB43+éLZÀÊi—ŒÁÈÍ©¬dØ?/+áÊŽ Ò¼‰3 ÊùÞL{¨ ŠùÞ¦Áh› F[Œ¶™`´ƒÑ6FÛ4m³Áh ‚Ñ6Œ¶s0ÚÆÁhûÁhJÞš]WÞ?¢bGôÎGýÕµOpiÚë H8°ÙÁ¢4jŸà~gÚ'¸Ñ¤}B?’:Xݘ2!”ñWÔ>ÁýδOp£à톻x%~s¬n’ž*ðúá]JÿquLòà®»üñž ¥Þš#ŒQSXlgG$(ÏE$(O#Ý`>F$F(ã¯8"Ay."AY‘èFð‰Ex‘˜qœÊ0|—rZ|Wë9RÏåÛÙøèŽ1NÃR»ŽŠ$4Be.4BeéFR»n¸‹Ä`Hˆf²ë¨È…F¨HC#ÝHj× wÉŒŒÑœj×É14‚«¢&ÇdûQ™åfœT†Gö”éòíÒ9l—@Çz‹p'zOMMìzޣŇÀ}^wÄÁ{|¢ì˜€:µ¿‹Ä`HˆfÖ©Œätj?¡¡êÔ@‰N`dŒæTʦj³¼ìwù®1½„`c‰ ¨1…Hùà@ƒ>µ4Ú Œ­€âÃÁë2×¼Ö@ÛïùFÂoÁí.IÏì™M[ÓOU÷^laÅâòõ¢†0F*?W-,žTí1‘«Úc"­ÚëF€…%¦ª½ ÑÌÏUí1žVíu#ÀÂâSÕÞ FÆhNµ°ÄXv†×´>L…^ÖbU¬w-Ø”5Å74¤÷Íùî²S­¦8aãÑŽJådz™pàHÓË$ R“¢ßÕÉ=øPÛ‡¡ÇMbbrpSΑê&‘I=“¹z°nïS"â¬î"1¢™5‰ÌÕƒ1™Öƒu#@“È©l#c4§j5ùUÑ.¥Ål[wŽmè_ï»^±ö|Zd0㪺åDù­©k¦x¢@Ôá…i£™øbAŽ¿ÑƒÔ·4}©8„‰v•듉:„²9êXÕ':©°b:WaÅtZaÕ}¢§ « ÑÌúDç*¬º&)Xa5Ü%c02Fsª>1±pT–¬«‚ §p(¾ïTD´!&t§XF¾ûsñtå¾u7ÍQÎÁÆŽ“¿]¾]:Âtt×Ãþzy-ÚŸK Îo ‘W<ºô`ÏF]ûF ½Ò,Ù-Ó•“©Ѱ‚JÝT^›[q:°Ó7wRtæÊ@ïœß˜Íš-åM ~ÿƒ>cÑgÃB³#<î¯ý…6k8ò½×k¦Ì~Åžñ»B±÷ð ¶îÿÅjÞÝÏ­ç  T×ý›Iªca–ÇœpÚAéÀ›„:`Ã3ÎãÃ9Wè å,¯–½wzç_wYs§«Ÿ×YNÉâKt¹Ð… OÒø¶§ ¼~»ü?Ô‡¼ç endstream endobj 4059 0 obj 5580 endobj 4063 0 obj [237 /XYZ 40.7999999 585.619999 0] endobj 4064 0 obj [237 /XYZ 32.1599999 414.739999 0] endobj 4065 0 obj [237 /XYZ 40.7999999 585.619999 0] endobj 4066 0 obj [237 /XYZ 33.1199999 768.979999 0] endobj 4067 0 obj [237 /XYZ 33.1199999 412.819999 0] endobj 4068 0 obj [237 /XYZ 40.7999999 667.219999 0] endobj 4069 0 obj [237 /XYZ 32.1599999 770.899999 0] endobj 4070 0 obj [237 /XYZ 40.7999999 667.219999 0] endobj 4071 0 obj << /Type /Annot /Subtype /Link /Rect [441.120000 381.139999 501.600000 388.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 4072 0 obj << /Type /Annot /Subtype /Link /Rect [80.1599999 230.420000 124.319999 238.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4073 0 obj << /Type /Annot /Subtype /Link /Rect [461.279999 116.180000 506.399999 123.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4074 0 obj << /Type /Annot /Subtype /Link /Rect [273.120000 710.419999 365.279999 718.099999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://msdn.microsoft.com/en-us/library/aa290048\(VS.71\).aspx) >> >> endobj 4075 0 obj << /Type /Annot /Subtype /Link /Rect [210.719999 701.779999 228.960000 709.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mono-project.com/Main_Page) >> >> endobj 4076 0 obj << /Type /Annot /Subtype /Link /Rect [244.319999 701.779999 286.560000 709.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.dotgnu.org/pnet.html) >> >> endobj 4077 0 obj << /Type /Annot /Subtype /Link /Rect [291.359999 685.460000 413.279999 693.139999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://msdn.microsoft.com) >> >> endobj 4078 0 obj << /Type /Annot /Subtype /Link /Rect [366.239999 676.820000 451.679999 684.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mono-project.com/docs/advanced/pinvoke/) >> >> endobj 4062 0 obj << /Type /Page /Parent 2 0 R /Contents 4079 0 R /Resources 4081 0 R /Annots 4082 0 R /MediaBox [0 0 595 842] >> endobj 4081 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4082 0 obj [ 4071 0 R 4072 0 R 4073 0 R 4074 0 R 4075 0 R 4076 0 R 4077 0 R 4078 0 R ] endobj 4079 0 obj << /Length 4080 0 R /Filter /FlateDecode >> stream xœí]MÏä6r¾¿¿¢Ï ¸-ŠÔ À̼3r`Ì9,r¼Ù,ëEœ=äïGê–º[¤Šd«(©ß¶ÏXjQY¬ïzêçùþŸ§ÿþÇéç/ßÿçôëôç—ïoÕ¹j«ë?§ñߟ/ÔýY×׿v}s®íøÏé×ßÞ~?ýþöËÛ/ÃSíåÁéáæüŠë€ÿøõïo?__þv½òýË¿ û¿S}ú×áÿþzúã üioüÁoo½mÇ¿üíúU«ºþçñoãÍ¿¼ýûN¦Ð_ÆÿûSÝwFë6k¿ßU—…^Vtck[Ÿ”ª‡y6Ãrüï½ýyüª¬ Ö¬OæäOÒza?L²ï†­‡§éáGQJU+åguÿÎzúÎùMêôø^5lþ÷m–ÏêªfY>w ¹åÞ¤OïÕÛ-_>õ­m‚ÈÚÙëtëaéìüÎMÖ 8o;§¼áŸûNÿǾ†ç¾þÿžNSM70ïʬ¬ðÙ¥ºÖtU²<èêqÌ®×'Ûµ§ahò®-GR¹õÚò 4ÎHe}Ù°Ø]p$¾íTÛ3n¯2ft¤ç~XÛd¬Âr¨Œ}™G²-×HÕ8JÖÇUª ŽD_ûn ˜ñ3ug²?t+{É”ÒÓâsR™_7­¾7TËŸ•æú®4‡äÚço?ëOµ9ýøó0ñöO×?~Œ’áôÓÈ|Múñ§Ó?U•zÿçÓ¿¾©z¼¹RõÞ•îr¥½]PŸ¼ŸXç'•¾\°ƒEÓ«º¹˜;ÓÃÕõa}ÖFw‹;êr§;ÛÞ½óåúLunMÕÃÝßóÙŠú _½ƒwÀñsº~a{n›ñ‰*8§ë7ý1BÞÆÚÑò[ÙXS]7v0‰®¯Ôí´Ý4¿Ûdêëvö÷ùÖÓ7Vöò‰Þº˜û‡XçÙéË».³²ñî³Uë^è§%­UïL$}ŠÞ¨u ÍÈÖ\/œ¯{Í´h3Ý ÔÕ]>ìvGuGõ\M´4O þNå]p÷FuÐça¾¦·/}¡}¢ÈØàÀÖà °¿9𠹤?ë©ôÅ‚É%0WxxxŽÑ]ª'¡ÎiDϤþƸ÷Ó³’<×h‡éYîÀ£Á' ¾Ÿ[—X•‰î85í=Ká0I²~̘?¯Ÿùïó–¾w'ài¼ïô6š¼ô[MÞ4é¬?])¤;0 À„D²F8Ú~d5z²ƒ’xÍöv·–³Ê)ÿPÀòär –1BýI×"ŸEÑ/ârå£Xd›©ö»ãó/nîohà}é|­öœËð¨hG¦ 8élïˆx‘ý£ÀSˆZþÑOçòóõ((3Ï>åÀ™îÚ ¬Â žNs}¦>_§Ñ7¼8S‡Ãƒ“%×b2ª€X÷qªzRÖËÂi˯’H\-!Æ 3‚ãÆ“1^ØBc§àºÉ.›Æ•+ï™:œeœqbWoA¬î·&Öq ι-–¦gûå ¦x3ü£„(LE¨Æ2Ùtð‹ŒàIHÁG@1l•]ÀÇ‘®È"ê|…£–YèÞÆÆåeΪ̒u¬è9¼U"q‚ΘV ÉôëpýÀGgxâH1ËtyÙ:§m¢)ÆÝ©ã£6ᨇ”qʧ|˜«Õdí¤™ÿxaÔLeˆm|‘£ ‚*8E³Š*¤¢Îl:d/ÎT^ßkgk{ë+ãîui+dœ‚#ÊÔ‰ÑTý„01Eò‚À!´N–¥(Q F;! £ÁeP ©<³HŽ˜¼A?v-Ș7lA0f½Hæ¦wÎ*˜÷‰­DÕô:‡ÍÍ ’û`Ab,s˜ 2 Fx»âJ?ƒ³;$6¼ Lj‡¶Ëêj² &àh”®º, X:‰“@Y õµéKcjÂ&D]œ¤7Ò eI3Åï„!žXÄ)ȶE@8Gµ"åÖîB*í[ê&CïAU<*p&63žS³$/ŸOT0¿tŒ’DFI‰‰ƒ¸×¤»:I5§÷}ýxa¯Iï ¶ØmRvß¡½¾²iæW^µæ‹ï¨ªVÖvíÎL<]ãÜ™:qp=c¡g&ß›ªÎ^³‹+­ _ïÉíùé̬›M¾þ„7ÖËJožš<û»75GÑçÎÕ.?ƒóœ’4çÞ±“¦èÌʪNçye´IÁnÏ“ÑõpGO'½ö %ð=ð3-x~œ[]*I¢¹£(#e8#8'äv}rž÷¤}y„ˆ¡H·ÉŠÉÙð»ÉÊÆðr!™Ìœ¬Ò.aQ ϧUñã‡pÄgÕ)‹TN3㎱@æÊ0–?œ‰Ð̨%ÛpÚ¤msi“‘‰Ç”,G¬\®`:ˆ"ºßò<yQW¾xÿb‚”ŽEÅ$רPF÷0³Ê•f7—4pàÖîX莂Ÿù$}&mo‹c“ñ6ðÆ1‘DúxÊæË~ƒK¯‡-5©]ñ„) á(D„¥+Û9DÏ$\òèN€ÒÊ0â¨ÓÌiòÅ›%á“¥‡%?$J&ED[¦ôx÷‡‰nRõ ˜ÝµgGñ©x…„uŠ.KH¦£îJñRR|x±¦Ëƒš©Î8TÄÒÁ¡K¡8'ÚÌ:û’Á$YÒùX€·Ò1ÁxRd¼cˆäuÖˆ®LeÞ-WÈ¿s¤²øÚ3¼SAwjp´À¬kð=-øÌ;tG³eöeÔªuöJ^bµµ«÷àå’,·º{Q0 W8ÚWpÖàZÖ œ5¼ ð¬_ ¼n¼ký¼Ó¨ÆÓešpjø”À3ß#Ï1­­×9æË‹qÁ0«M]–]õ(k;ï­À£(º;‚èy}Þç r—` !ŽÂ=ÉŒ™ãØAÄVãrxä>źf¹e2 ±=|ë¸çø ¾ã>PŒ^2d\+W¬ œ8Q¤ná½|E¶<öÙÊrÆE”Ç·J*ß]:ßÎTê€/§ï¬Ãÿ6¯ïÀ–:h[køØ‚†ý?à¬ðŽß{_L%-‘¬õ ùDvÛ»T@‰Šr`“æ4 ®Û'f¶ŸÛîu`vq`TÓ8;‰Ýò[Q°$N‹tg±ónS¸q:¯n”CüϓΫ­]?Ø¢ÞQí²÷—»zu¤/ß/ͦÙÜ÷{H7êV³P¾´×tóõ•—+}ݹ²¬L©8%†‚ÝÃܯ‘½"ÃëÅâJ:¶†K@z™Î|(v¼ÜMê*o/Ù¾]9ͱ0ðOq[:¤³Ÿ´éüþo‚'£n;çhähTL_âsöCl‚ê±'ÿà¡ !×¢£2ë~¬ÍðøiºÚa5èÝ5pÊéË÷½©ï»«\f_ ´X)÷,QyJÄ)jÛ²ô4É)ž!eHðâÒÉöW…•- Ë‹ûÁg=ÅÙŠL½äÅX»í÷€Â^|8‹® ÷ü«A¸Jl) ö®¾½r{ öªùÊ3“_ÁŸÕ¾7|‡€â ?£ŸOç‡qbê'kýl¼¾?dvøN`Öð—‚»À½§à¯ƒ3˜:d®­¼¢àºpëKÑŽx½Ëä‡êZ=K#Æ>ÅI€Ÿ, ãžLñ pšK¥»š1°säò %K¦ûy1‘o‘¶O$K™”á§0Nz3É´ïÚ0ðf´v8ô«ScVIÛó}–áíUm½ÝÑñ²­3x#>0•äDÒ3Lo†<>œÈî†á ‚ñö‚Ìé»Ë†‹p5Lž†^‰zPx°®¥ÌtcW Û7€A# ¾ž[àyn<®@H_ɨ¹%]N Ô@|êÞ¥Ï»Ö {‚M_Éøá0kÌOGT€5Ï.ø üï'K¸Oø®I4âfâ?3¬•áåíë‰2ºNB¿ƒ_$Ûn«x¯+7š™ETj½ _Ê—ñS]ëlYm ÃÌÒ}™‚k˜•Q÷ ü Á9H›) ¾CØ&ß.B„i;Zºe :™Q’êÎ9¯a4“h°•ŠŠ†Í:aÂÁ`‡ðÖùK~h9qß»@Âå‘reYàxøÌ˜î)0ÿ•©ÊÉØÎð½Îú¾Îú̦ë[„,M'8¬ó+SJð¹ÛÇ?+Ÿ VqD,#Å×›n² ‚TˆŽr”äGå¶*à ¬´»–d¬q™ bQ)±kxã3Ї²Úæ}¸BÅØh¹iâ‚áŠó~Š»]D ,¡9ÜV;àEK_Üýðáí éaÑݱ¦_'–¨§¹P_n@ Δ I¦Ü6.Ÿ8ŽÇ¡€°º•Ûc„Uº“™ôÄ’Ûÿ¥¦TÐKxÇL€K¹y›[±äSrtnÎò„•qÖ82E<Óå¹Ôš?O\Œè¾qŽÂõBÊ:“iߺ? ª áÂZß½G³t½° H;Nwæ¯"…O¦†l–Q.’å@îÆøä£ÂÊ„Œ“þÉѲT°B _/MoKü‚¡þ(;v#õ· -A?'|…(.AЧS1CA°õÈŸ…3xx±3”ѲGFYeA<HJŠC£Š”H6e¸`û,Ä BcÁ ÜvÏò5q°O„9yöSH8òÔ¡¦læºfݧ õжK5£0ÓÜh°öÄ,$¨X‚-‰Dzq*?ò‡Í+µw˜Ò“л啣q'ð#$ie@Ö&©£îõ×½v‘{l!¿»ö Ô)‰6zÁoY(™é 01É*‡¬ÜÙ!ó“ño|7aĉ”3¸CF¹÷ü©ÖJÙ.„ ™Ó a xð9 ÓH3ÓÙ`7 LŽp…Er:cð€A’YkªváEø>Htw!»‡B"9ŠJtaŽ>ƪ¾#ø9bÎeÜkY-_öï1Mè= cxGY"´¬Ú ˆM¨BNo)xµœ˜.(Tš®s… +„)Iš6¡#ï/„`-é,`'©VaâK”ÃÚZÃðRf°ÐŠaÈ=°N ír ÝQð30T!à7ÑœdËF;+Uª Œâ¼€½4ÿ!§cj™¤äUÇ-,H޵Y·~®ÒÏ`RS ‹Á(r¦÷x庽í}žþCÖùÉ„›¦ºyáïëéó[¯@7-¦í¯‹–pgÖøªsk.è‡÷g¾@wÏL­ ôY»ï¡Œ6s ŸöÜåšDÿÚ~Ž®5ü°Và÷€³ö†×AL§ú኶ñßTliu×Ö:ä=w±óÚÖuîï±²XïЉ©¯sUª$BiÙÞ‡†þ–ÑRYp1B¥¯ÞÐ2Žwý ¯Âc*Ýww ’2á0(™ÆouúäYBûI*Ö“/‰°Ú‘2ËfÉ`óöQë8 ͤæx>n†‰™"rëÎht^w^ÉßÅóa–#DÚ?Äábô fM>òFµà×+ILU!Ü/­§—Ö3^\Ï™ÉM†^·[MÛ]Ý·{ܵ˦™±sáé·7Ûwþöö= eeÄó8G<#‚ž,‰Ñ¤>Ÿ È ùÇŒ‡v£Ào.Ô¶þz×£Àˆ;`ã‚Æ-B¸DhB2kº¯a«¢»gp‡ˆ´Î¡‘Ñ.…à`±=a‹~q ^‘S¼²¯CS¬uØ>§˜è,Bvkrÿp~°Í„/‰!’2 U‡Ð½ê’µ ¦vdÉP-ŒßŽJ µé§&ž™Õø“eCj.Ýê{x@¡¼¿NÛ«û»—j¬ËÖ‚Dýѽ7´¤ï"y’ ­u)ƒLJR¶VHIEœQ +NÃ…¤"ä…L•Ÿ Š"˜Ê¢g¤—Îð}Ñ'‰ÅSŠ[¾¼+-.ƒÚÊÕNŠ—Àz¦ ¥®Ñ3)nÔao¾Þ÷#%V´†Öy\nÛOQ¨ùÿí¹ï«SÛtJõãÕºR§¶=_fYUó•_ßÚæ¬”­û^Ý~e£˜Çw ¿Ÿþ¿;-ŸV¶uÞ1^žYÌäò+»Å.ßñ—·ÏJw¿’h]Ý‚d ƒ’IŽdZú‰‚A¾'sø#Ž’"G˜¢•z*»'\´RÃÅ$=xGw¾‚wà²q(:m÷°ÊÔR |•0É cmSPéQÒ Ò[—0>4±,ÿiš6™ÿh/Ñ0gú*M2meœo{¬›ÊÒ¿jÕ-ô¯®Öô¯ºrõ¯ºòõ¯zÖ¸n£˜ÇwÌúW­Úý«VûŽáŠ«]~e£Øå; è_7ä'Nÿ€ìñP•uæ“:\ªÁ;Ÿj<š¸àVS>Ç}¥^‚û8‚•Êâ“á¬ßÇÀT±úÁùä‰n—òDwkòD[—×W%À{Dàœ‘¬ ž2нùêÔJZrÖvhâH’óà ÊÍ \ ÃŽs£¯–$$`튟çj6)T€“^,DÊp„³Ÿmy(i-ˆJ#ò<<BžP€p2"#^b„{#Œ"ØÖ®6øt†ÞcB º9ýtaªö”ãUlô”VÑ®ÏÓ–Z¦ò³r^‘œæ¨²#y¨§3ÝÙødèÉ…R˜¼„´XŒwf7høû9ê²à_ûùÎK+ ÓôÔLýÎ}¶ëQ’SÛŠ°Åõâ,èJF•s€û—®€yi¬q=ÓL§s%75¾ ]ŠP¸ <×”..ê–˜B­vˆ—s9ä\$æÀ @àLBi͉ ¯*˜ä ÜwœuÏÞx´Xhð—Ô¸­+ô|n–ÑçþåF™#Çs£0m¿ä<4÷͇S˜ [¶r(šk®Å Z7/±ú«Ç«¸8<[“”ãÔ˜è„à;¥Ý)ôyÝ Fö½1ê–zù%Ý(Z@If:ªÖÙvžžk,uò0Ÿ 4½Dôun¼P¤ãÈ•6žfǹ²ß*ØœÎhæ¬ØÎ²M\{ÜÏŽ,ì•)ƒÓ-Ùƒ¨q•ø(`˜x º®ü%uí®izûOáþjBö¼ €ñîüSnÉš°â0[üºøØ"„ñÑðä<ÁmC wV€òà z«©™ÜÚÁi}eÓ.%Ag*—RäEf=g%ÜÞ¹_ÆZuÏF9X0'ÚpönÅ‹uÊ[w-ƒêD‰B ª £±8DÿL!º 9C„¡³ËC_­EúÚõþW¼Ãø+³Å<¾ãaèúµC×¹ï®x†ñWv1Š]¾£@„¡Ÿ3ÀíwŸ{ úÎD‡Kà;pÁ\Vë+p‰ }K))ؼ6µ´ß&^Ð~GòÏᵑ¯E²©ŒmÝóT:!fwŽžI.¬x&ÔÌã=Ù ß)¥ˆí‹ÞB  Mçœ$Ax+PtÞ’¾rƒ$ƒ¾Ã,õqB牥f'Ç^ƒÂm9º*n(lm²&‰+Œ§ÎÇQ Áí’d1‰¼7¼¹· {)ÛûS¶÷çRK‡%ÄpWwŠeýɲZ’®k稽´$,·2Uï²+yƒJ¹û&lN² KÈpƒ½ ²kÂ’îøªfÙÞúLb*Å€%Ý'û ¹2– g¢JɬìÞjWÅIavƒË‚PÚ3Ðè™Êÿ):¶ôÃD`sÿÊ-T3r¿;ØÐ¥b–à­ÙmÀˆãÀë X ©¿¢‚gš—#”Þƒ„H %§ˆ”ÉŠàûSs`àÄ8Þ©ç ¤ønåË|ŒrÎ<÷ÇÓ† ¯[·Ç7mX3Ã…92%»õxPµ!¶Ë‚±¾<"ÕqÁ–þÕèeg×F¯uvm´ÛÙu¼â¦]~e£˜ÇwÌé_^ëìÚh·³ëxÅMÿºüÊ.F±Ëwȧ5æ¶©pÂÞ'fàgf¿_¥œí†ïø§Q…DC£ùJVÁa ݇•ƒ”:Ëx!sFíké*ÇœÒEÿÃáÝŠ»z(4@‘ÁÂK@=âŒ( W;N‰¦+äB*£(ïüiæ0„IØvø\¹† Ž(_£¤ªPNØVg‚R*¹ùšð©r^ªrYSåšÖU³†+ž*7þÊ,F1︩rM½¦Ê5Ê{‡òU¹ñWv1Š]¾£€*×ÜúW|õsø˜z>KObA^H7çð@r´Â.gaMn?hBiGn¼½½«qˆs¥@qYš´J’×ñ*O"<9Ûåá”t]B› J.ŸfÕ©¥fÕÕkšUg\­g¸âiVã¯ÌbóøŽ›fÕUkšÕ0çÃO³joºÔ<Š]¾£€fÕµœY¥¼Wƒ‰CM?ü$M‡ö¤tõgÂ#ùyÅ‘'‘”à—h!©æ I×’aÉN¹Ü\¦ôE+)´âKAlì:j}¾þ¦”Rêó åM"ÅÂ¥Ðãâ"A„yÛÍ¨Ý ø¡=ÃrÃàRoGh À:H¹…¬-18G6ýY\FñÀ@”§°EÍœF~lVñl1\^Æ™¤äÂù¤@?q•‚m¦¨Ù,HjÆŽ´é†!Ã$2Ùå÷µÉô̺–è"¿BN …I ÑjQì /y<_~3ê³û6¯ôð¥1aMr ¥>b‰ÎÖŽl"ʼn \‡-c¿m—¥{m»Vº×¶néÞxÅÍØ¿üÊ,F1ï˜3öÛv­t¯mÜÒ½ñŠ›±ù•]Œb—ïÏØoÛ[AHÐÏ‘<‡p¿xþ"û%½8Ç ž“ÍŠ¦]¨qYz„; É"³¬`<7GÄà)ôI›ÞoͲ(ZBïŠ ¼ËƒÂºKŸèÀË€PÚ9ùÃ#ßçêgwÉ.SÄ ŽxX5œˆöž¥€|lÕþcs˜ |I`fɴƶvÐndÆ´@Uª§E{ï> ·á‚¥Dº;„TrÁ’±þ ºb^ì ñ9õ^…eN†gíFGýS›ž @òòr$Ù2ˆ áÆŽ]ëp 6iÔ º3QËÚ3=þÕBwjÞ±øÑ $kðø¸é¤Ï™h”'+2"Î9°Q$:8y‚5 ŽEi)T[šQªu(«QŒ— yêb)ÃÕ0µË6ž´C,æ=×RÏ¡(½IÛü¸Ê‹Ô©4P#Ð#€–¤;È>9 Kº;ÅGÇÅ»¬ÝÜÈÚîñÂßÞ¾'…^y‹;wC3ÒO1ÀípÖ[$ÚöËH´µ+‘è®r¡óÇ+n$úò+³Å<¾ã‰¶ÝZ$Úº-Æ+^$zü•]Œb—ïDw·n«BØq纩Ó'Á/Žˆ"lDeñlÙMƒLö¢zü>LÝ&œçEK<“ žÌm]I[Ä >Ü,dÖˆMDuº^ˆ¨Në5¥WD W<5þÊ,F1ï˜ET§ÕŠˆêtå½£òDÔåWv1Š]¾£€ˆÒ]\DmÎë^ŽKDákãió•Ë ¸AÕTDÐÙ›É:;ìÒ„ ãòuçu§ä©—àÚ˜â nwØ…> f”C~òK]˜Àðïé÷á´'ùbŸ_ÿøõ7”±ý º rŽà£Q–Ó·'5|ÆZàŪöšuÒÕÍX¿nÁ ¸ÛuÏ’5gS_­îÎÝz M·rç*½¢¶«¾Ô¦9·Wí €µ÷ôà3|æJ]}®V»(êü Žv%ÝÇ+ïào'/ÇÊ~ƒž™õÚ}Ç$qÏL;†ùöin—AuãßëFÍ—jÀõƒ÷¤ƒ‰Màè¤^Òn¼ƒt ¯ìWpÖ0uy”¸ËÝ4ýö¬F?nò¶ƒÇ_}zäÀŒÜ÷ôËÛÿ!ªår endstream endobj 4080 0 obj 8946 endobj 4084 0 obj << /Type /Annot /Subtype /Link /Rect [451.679999 90.2599999 534.240000 97.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constructor_helper_function >> endobj 4085 0 obj << /Type /Annot /Subtype /Link /Rect [151.199999 64.3399999 231.839999 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 4086 0 obj << /Type /Annot /Subtype /Link /Rect [247.199999 64.3399999 368.159999 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties >> endobj 4083 0 obj << /Type /Page /Parent 2 0 R /Contents 4087 0 R /Resources 4089 0 R /Annots 4090 0 R /MediaBox [0 0 595 842] >> endobj 4089 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4090 0 obj [ 4084 0 R 4085 0 R 4086 0 R ] endobj 4087 0 obj << /Length 4088 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷ŠO‰@À;³C€Å.CC°Žc#ò÷£W÷¶H}”X¢(©›^À3#J|«¾z°H¾ûó§žÿýûùÝ˧ÿœ¿ô?_>ŠK¡‹î¿sóï»û¼ºÞýZVêÂMóßùËÛéëùëéãécýÿ¯'¦Ûûuᵉ®Âß¿üvz×5~êž|zùkýÛÿÎüü—ú¯_ÎÿGýãǾ¾æ…·Setó˯Ý/Œ3^ÕÜÿÖþ|úÛοÕ]¨Úz›ÿÇ«JK-õãëíSÖþ»ÿ5Vœ….ª¢:3Æë~ªšÿý×駺¶[7.F2VjY³keR6õ–ª±eƒëik¢Ó^:ß_«ZN1M‚š>Åá{XöZðX|­j9ÅJk›>Åá{XöeÙ…âËIVÆS[>‘¦±l bÙèzêãªèä7¥iÊ ³œh}]‹‰ÆYm"ë>±…£ëÉïTõ1Š5Ì¿YÃ_=¾ÿ|z÷“¢jŒÿÏ?Õ=i=ˆîÇçf¼åù»Æ,æüüùÇó‹B°??ÿr2eD©:Ÿ£+)8*áßÃo*a–È\’Kb—ðX9×VXòšT~>|®e}xlª ¹ä¨%qácxH+%‰àA_›õÀÃT"0Ià7¬m{&Ë%G-Ù tVfèZ6‘ÙÛuI†®q|"P:µSF°_< §ØÃ˜ô°×˜a<=ÈöØJ¶µÌñ>ŠzÌ‚šÈ3}æpßð,FŠiµŒgA¯L©D•J¬D&0V¼2nß¹d%Û+ÑU8><”21 éÔÙô¤å>Â2)6qÎ %Ÿg{AË%;‡¡#s|"ªö“Ï€Iëõ‘ó+v †2ǯÆñi`•©÷¿Ýþ./UUœuû£d¬êžš³n_lþ»>ùrÒêšcÓ*v{Kj‘÷mÔï÷·Ÿí¯¥Ó†l¾±zR¿eµ˜a?ŸÞÿa¡r0@3Ô#jƒ¾-N\§»ÔJsu?Ý]T£ú6cÆzгqy)œÉí„ñ‹´Kð7NõÇËEµökKc%p¨‹àŒ¼ÐvO:IÖ—æ„·A%òCBuÎÙ5P¬0ìaÐÁ‡¸@ÐQ°‰ ®z¾Q°FÝ$„# ¿Á#•˜ÖØ»„í(¨<}Û\ÍSo/%/¢â¾=Ç'O!vÃOžP8qmöÃV+ž9Ȳ˜n¸¤¾a¡Éàùxà™9þڃ徯øÀ·ã•ñíx¥,¿«ybûví[rP‹¼oãêÛÕÞÀˆoÇ›÷­6 Ç·kß2ƒZ̰õ};^Ý‚~Ý1vQR7ŽË· ²=çAÑ ’¼ºZwÞ‘„%ø§úÒîö KX«í â®mïÌîÃ…òFJ¾%"œ Ê% KÔ+—de•Áµ6üMV«(ƒ²šfs äãD!B ‘'¯[SH>ŽíáJâ*ƒÌñÞYÀ= léL6 ”spf%3ˆÂ‰„³FS™Sq °DdzReñš6ñù X~°‰q·ñyQ<^òr—¼‰ÇKaÇÊ›'v<¾}Kj‘÷m\ãñ’ë‘x¼ävÌ¿ybÇãÛ·Ì 3lcýx¼·S'r<þÆÅ›Çãä2œB† ŒKprœ”~KàM »Ó¸=Üû S o§CãlC›=#²§N¾öCT¢¥õÝ«[Û$ÅÜŒK<í= W9¢Ž±Æ™Ù˜X‡+´O’€¹?úá4YON¬Ã{! q+€Xžì_,0:\È<ÓåhÚùlâjé—µ»¶K,Èv©=?oº·bçX1.泊‡EWíQì.æwÀÃ]0¡£ñ'0X{+pœEqW°Ë-/±¹–Ì[±¼ûòƒSÈ€·3°%@+/oL¦¾«µ‹Œ¸K¸’¢sPÀ ‡òXI­âÚaͺ¾~©*m Þ|ãdL;"P½;»¸úi;Øycr.Å+ä;G÷Î)¸áˆ÷«3Fï*V·;^ ôÏÇ’±Lðƒ>‘`5y “b¾· ›Û`yôW K‹—Âb~måɯì6CŒ‡) "=󄿯{<’+Ì"˜Æ"˜ì÷R™BG³zBlGJÀ1ƒ°HHTºÅàª8•o€i¸$@ J8¦¨£‹¦Ã]óÃA!F™óªÍÀ+qX@­;6W‰Fus£š˜I·A(q;öG!öŸ6–K(g,Å© ¤óÀíg”4ÏHqœŠþ"!Ý ¨•…˜œ®dçnèe»¬gOåâǼÒx—0ô< –9>9Ç/•jxž[©ÆÎs+•ÉižØÑ¢ö-9¨EÞ·q•jì<·z€Nîyní[fP‹¶±~´¨TåPèÆ¢E”„H'€r¼vŽ =EL¨bÓ(NÚ9Œ-¼*DXáÁë8ÉnçÝ\›ç’=Ø:Ç”’…F, °Ë”@ȧ/ÌôøÎø>ÐÍ6ð\¦Lh'ÇžŽZ1Çc€zPYHPrú*ÍcÔö=xP¿~—0”*˲¤õôÅœÒùZÌ'*É ½’,$¨êvdÓƒ…•<1Âi–žU¨CÚcÇ,ÉuYHw¦¸¥¼> Ü=ÚõÔ<3ÜeYpÁsQ†Qr°a”IØ0ª´’)š'vÂFû–Ô"ïÛ¸&l%F6ŒâNÜIØhß2ƒZ̰õ6ÌíZ&l¬|†a”Ó{’.(“âÚÜ#K£œQ‘3S03…·ÍtøxÂl-Hu>}¢Üáí šç)‰kºa)‰¼µàÈŸº›œ…7ÒgPË ¶ó’TÐ…¥$ƒZjPS34 \äÈ –Amï%Éì1(%ÔRƒš6“ÓuLèâ„’ ]WòtUÕä¤$Û¥NY€Á{RòÅð¹dçЕ˜ãÓ@ +ÊIb%Ë£ œ‚K¶gæ\²‡’T9‚. ‰€ƒO_%¶k[äÉ Ù]{<àHf‹dŽOë®1©&'û5ÁÌJ<÷‘q×3Ç<µœd‹í×3+eðÜ;xÆ]{Ì¿<—¤ñsÎÄ}ý·tÓøë§z˜bß>±Òø»·ä yßFŸÆ_ÿÍÝ4þú)sÚ`v÷–Ôb†m¬žÆ_·u;H¥ ÈŽ]Eë¤Xão|·ß«UÉæ×âÉ®Gõ4‰6›ÿÛ«’£ö<ÉåûæßWŽû˜è*=ÒÝÂvõRØ}Ýz†=ÛMðÕšÏ6m3.bž/è¢+Kf ÑÜÊ`»î½Ïέ±E®¼ èbDæ_ñn`Å¥2dG~é(ëã¥Þ<» ”ÀéiÀíº,K¸GÊSBØæîórö]áö.I"y«Àpoú±â¢K6°,„MwXxÏ–sáïä ÀQvØî3v¯»ÂƒÎ«´îj#å ©¶ÎõqðQö—º2ÿÀó-U†)KKex /G|¡´’ä7Œå[|Ž0–kÓòê° U„Ä=`—n0á|*À±yW0Ecã¾½·±ß&Áí¤ÖR«áûìyTJb÷h‡®Æ|{Ã3ðICË3õ«@Ä‚ƒVhY1 ¡]•æÌòÞèóžS€ Ž}T…)V‹+jˆc_˜â®: @õ(^¹ÃËK(WMcCa>‘HR5_x"2ad„¨Š÷FquDiM¯)[‘e+l¹–À7Trš€dÍIÜL6µ²©•ÎÔʆƤ¡±"ü cãßJ¶ÌƒÙÚÇ—ùŠß¥ô‚¥¢iœˆqÄT£ä“$Zñ{øm¢8庎óÚGg®ŽûU¡-Üç]:üH[;Ï5dùd>3M®£:¹’ÌÉ•dó¨Í¨] ‹Ú‹€Û†åãj”•=y‹·ÊLmˆÖÒLõ©©Í¹Éw~=}Ziºš†,áàk¬þÐk>Çs=fQ¤]Ù…SmÍìÛ‰JÛs='Á9&D¶}°¤ÖјÉ"åõ|ãü…H'X‹aZéNg)EIŒvÙ8QÊíü”@J€6Àï GsÚ(œfŠ-»s¾°í­,XJPÈ¥'”B(aÎãFTÿÖår¼Æ¡Å+8Rü%FBNHðÂôVF8Ö›cé;)ßÓ Ïð|ªaŸc#_•F[ºh¥ dzˆÏ£E§Yyzu8 ö`8Là?›ÍñuÆ&Ïù™¸.ö¬²*Ɔ(ùà]TëGÂ¥¶Y?÷Єï×–*n¤5¶á…u§C\“¶n]öœ ŧuàÓ Vßú"´˜šŽÛôœ™Ã`ãZ;•üBðzH×ƈhÎH$}Aز‡q•ã!H6ßnLØi»ŸÀ%êëŠ0¡ cÁDޝÅöŒ¢¦ç礩ýDÙCHc_tÔýí!qÄkw1#FsŽ8 MÁ|щœY3J{ZßÇÅõz¤5¿$ò@0䦣ñÑð˜¡“Ö Ç׃S²´)Ð#‡ÔSÉ*–ê¼¼ºÔ9`\•–,ôGëûq3+fg\5]lzÈŠ> ‡vÿ`½Œ«¦! (2´ÜP/æ•â!¬“z<…23XjÈAo'É•ÍR©»š.X’¸‚¿ ÈÈ>emÇ #»Ì¾;Ž0E‘ƱF2ÈLGg=¦û’£©[wEÙ„w> endobj 4093 0 obj << /Type /Annot /Subtype /Link /Rect [228 604.820000 304.800000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation >> endobj 4094 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 288.980000 521.759999 306.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4091 0 obj << /Type /Page /Parent 2 0 R /Contents 4095 0 R /Resources 4097 0 R /Annots 4098 0 R /MediaBox [0 0 595 842] >> endobj 4097 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4098 0 obj [ 4092 0 R 4093 0 R 4094 0 R ] endobj 4095 0 obj << /Length 4096 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø¼Àzħ$ 0=9Ì99³Ù,;‹LrÈßdÉn›ôGŠÅ‡%›ÓÀ¸[²(²ÞU,V½ùÓçìÿõßý›wŸÿ½ÿ:¾û¼kn¦ûñçÇË ¼;>ýÚvêÀûñßþë·Ý÷ý÷ݧݧáÿï;¦ÎÃÍÓ+¦ÿûõ÷Ý›éå»éÊçw~ûßžïÿ<üõëþo>~šÇ¿ðm×õzüå·éÆï†?.oþ²ûëû߇)tÇqÇÿä]ß©žGÍãûùQvü¹|½¬Ù Í—{Æø0O5€ã?ÿÜý<ŒvžÆ¡—ŒµZ¶ÍâQ™”ã¸Rvû®åûÖÔZÛ¡XôHŠ‹D#sbq‹k˜rŽD‡½jåq™ª‡ØØ8Vqâ`ÄÂë A~£6»¨šÞÐ$""û…ÀŸg!g¡¶b'¬y‹ 8£"#•\ÞžùÁÀzÅvÆÓŠä4˜Å,ÀWØvÆ@ ¯k¹Àô{biBÙ~½µˆ¹Pýr“2¢ò¨®E‰¨JJ𤬆Ý »«Ü|™Uòfõ—•©Cªp¿—pß’É,é ã^!)U™l~ßX6}8+n@³%L¤Fé*q¬—&lHVK<(fa‘¤%ÌØöAM”‡ €”Ï÷زž¶x:€O¢6d2èٜɢ¼5TGZq5®wæ€õsó£ÊúêŽÆXc Ú¦Gnl~/çÚŽÁÄ1ŠMÖi˜)0ZÀ$z01“lðé2¬éŒUñ é·’b¼óÞy‡î̹Ÿ·ÒrÚܨó¸´¨Kb¯ÎudÍú­5Ë®z¾â;)§€ƒ7Xç:´1¾QÀ‰(E1"-MŠÉcö3 .9ÖÝi?@|„BˆCQó># àÒð™÷ ß#à‹h<ƒB0p¥XàGdhÞzÞ‘x¥ø¦*87)Ó~†¼3«¤0lwá°&ñB GÃï!ÌMBàg°¹‚iG`,`g-FVÐ3þ!àÏË7À¹Í³.£ŽFå½e3‚(ÆHqÀ“~†0¬D׌,RæhA~7W)ij³¤'îÖ¹,, Ù\X¾ëàuàêN¤ÍÅ-¦Z=T²@éñħ½Wvô8£—mgHpR|!àÜ$ŽäPΊÎ}(‰|”*Q&JÔÎŽÓXК<3ÖtË®¢?Š=ÆDEj!¥-òCA3_7í5D‚ fG|G ¹Š YGÄ…â¯aã—`ÌSf£ ¯”»ÀÆ<„›Ö5¶TcKnªªîøª#H?"i¨Ï€+8ƒE¡‚¨ bƒµ{UAL«öF1­z£º×xŬ vü–¼E^¾ãTAL+u£‚˜LZóÒª vüV5JýŽüÄ´>SyÖ b¥²(5½9¢ž@ñ"YOZ^*²€X­ýäÇETí'úð’K*‰½êŒ›.‹è¬…§n¢ÐÐÌÄ"É¥8ÙI dì`R’1N\ö„ÍVH#ë,1è*g¦•¹†¤É2•Þšþ½eûg×]oÑøŠU÷³Øî9,ôü[þº{PKK,‘Òf]Âh« Úþ,öjÀn΀=Uéz FÓQaåÆŠž—ÆÆAÚ¨p5Ò9ºŠ¶=ƒ\uüѹ¤:+埶>þY¿©“ÓŽ•ÚäÍu0Žt*¡ÒŽÑ昢¤_HS¬ˆ…÷îäUÀ»ì{ŠIŒŸY~ô=í¾œ¿*N”¿Bð¼“à'µjZžwIÂN„ÿ•_ ñ–Ñ)ž(L>—ÒáTxÛ  :è¾ ÎU޶Ðwià,™öRíc`µŠÖ¤¢Õßúx$­²Ú¦™óÈT{uá­Ç)äîÚ¿CFvH‘À$u˜I} Š"  ¥ÃÇxX—²h™óœþ7ŽõEž™¼¸My­|ÇîàryhŸl˜¡…ðB¶˜?"Å¥ý"¼É°›\È>&俥-¾¿@óä4r¶bbÜÐIké`¹Úà©ë¸sÇ h œO©…ƒOdPjîÀ XÒ7ƒœ»¶¬¤g1}ü^šœ™åFýØæ„3ZOǤ¢• Ûî´K^ûg8gP¢$ò»¦;MˆÐÄ`›wê!À‡˜n½ކÛBHlÔ¢˜k(Š ¡C)/I*" gíXi¡"Ÿ”±Ž—X@Ú¡Ì@à•RŠñ$ÆÏƒºAÆÇ%„ñz†I›á¨ðñg‰;Ÿ¤5ñ p_̎˳JÈsŽVSEÃssÌûmÅŒÃzö}Ýf#¡n‚Ãs#TGpˆU ½U3¸šÁÕ ®fp5ƒ«\Íà¥f0AÓ:ª'QdƒR±e‘Ö…‚3à*ÖeãÄRœ^[èø©`ýi·«vA_¾ŠÌä [7òËÚV0|šü™Zîœâ£Ëx4ûh`À«U&êד‘m¤4Eƒx0ÅSúíd>ð‹‚UÆ77‘é8Wœ¡Ü"¾5§P}NÛŒHq¨ýyÄz=<Ï’ŒôXÅ\ð“U¼š¦¢•®³w”K[È¥¶iô·i,ÞTí^íRIíMJ±¥´åžîÖO<¸kXNó¹ï ýALr¶ÀÅÃÇð^Þ&£PÆ„ÔzÂtÐIá;l,IvãnŒà˜žËÍwG‡jlÁ¥U¾Åç‚»ŒW8k›Y¼K  pB]fËÒrRË—ôê™6ÕÊzË*…ÈPl[®_вc1–q@ÀÐj9ê ób­:ÏîÁ÷yWFÌ£@’žFß÷È~ÍœBÊh½üJN´ÌT¶Ý uT ÔzöÊEÆèš€ ÒzÅm@±\Š/l‹[ÿ~FDíác¯3 XQZÃúÝfïþMõ˜ t¯mÖÏœØÒôÆÜq  #ñ—PßÇQt'ÃP[jrâoN#¢a…­ÔÕwp‰¼üç’ÚŽu¥ü£„¸Í?YßÙšï\qtëY ™m¾àè-`ã(Æ…[ß…õ^J¶~Æ z¦M]‰w¬®§CHb…—(YÁÛækj’t‡Ìؾ5ý.Gè4¸Ë·(é v ×ý{üá|”ßcÍétÍ|ȯ;t}cxÌ”f[ÖvÏG8È–D.Ÿ7Šì°;‰™15™6¸ ŒòWZa3­4¯´¢ûýˆqÁ#v¿ÿ‡n ÝŽ-cÝtUíµ>Á2|y¾òu§Õ±žw;K^"/ß1|þ›íͧëÇgŒ™ ßê¯Fé¯ßñËîå‡Ì\"Z/—X¦-U,»9@$.>çÁk4E“6½ªûiQöe„iïÐ/”¬O?ÛE¸0÷ß® ¶ÿ.&oæ‹ÜWB^¶MžÍî¥Æ¬ý•¡DL—Ø·ö`–šÁ‡ÓbIÊñµ­†là$I]MrÔÂtÒíA òxfIUãf‰´b°©€¾qýº+U ª>Цm½éÄÚ{„_¤6AHÉ¡[ij—Sd–ÏÉ–­…‡–^×6WŸaâ„• ÐÉù 9åã:Ëìf¯œ5¼»¼òÛîs&Ÿœ[¥¡úºH6ÉAôn!2º ª=áBòË #*–Ä^Ròø8K~Û©H6sFÁÆ:e,ºxaœØæ¡ägÛµ£Àæ`Öæ‰ÿ<Ýý·¹Ör´)»÷°šêzCÍ™¡Pªûw_÷¯ÚTñeÎb'ÉxòÛ`s­æEu#ÜaÔScÉ©RBv) ¨îQh+àü‰C¡h•å̌ᙠ­òCcÛöøúŒ³ŒA0׊V(ǵ’µ¬ ÉáŽzѸª:®GŒGÃõãqû_¥ÑmZ+9J¨Î¤#á–<Ù~ 8J:ô}/ÏR¹ ØÏZÿHTåØÅØ¥œI0 “nÈDËÙ‡D´VÅQJ-7}Ã4±YZ2uÎë·/pÒ1G¼—ç¾Æö§´8P°<äõš¤ñ·†"c¤m’\Š<¿Ã¦I¯¤©gbÎÛ,/·@ʉ[kb]Ç´—~Z'D¡óT ½»Ksf+ñìÓÖ¼¨ ’½†'@Øbq”b„†œüбt‹kõϪ7.fâFJ„6Sø=ŽXu+ƒÔX 78rô‡+Å}ríh00æ 7Ÿçî­‹›gÖ`¡«}Ú ÑBâ[Ÿvkânjq·M¡F黿õ`5î(hC( Cé¨íèJ‰E1îNZÅw1ñí *,](½œ±tÁsÃØ^‰ÒéN“ªtªÒÉ t°x 4›w5,8°ÆþæÝmùê3lUéP¤–HV-ŠŸ›cÑE)™t4ŠÝ‡×#’U{]`yêþàÐÐw¿¬Y×9P\‘š¦ŠI½Ì)R’%AÒEiµÓÜ£9Á:+Jàõ¼/I~}A~“v=°îÂÆN5È×OJšuׯ½5¡¾ä„ˆH!OB€îOªTi/EŸm7‰:ÿ“«ôlg/‹nå·ò”'SÝð[w…¢Å55®ÒLÇ ±z‰©g#¢Žg(ë¡Pe‹ƒ²RÈꎌ"ŒJçaß# &ºc=8NˆßCØU)åí‹´÷NÈÁhØöÝ)³¼®aË«†ÁÃn "?î'2wmÒZ³™Qƒ9¥ùð³ÿ>ðÍÀãæ¯ß‚Šš]”KûääAç£^æíôž ˸uJ·gúptL÷¢9wGš¤ºÖ};™½—+ 0oííjëí;SFˆïo–VSê '_ÛDÁ­÷tð™>31i˼WegF¸5ÚÄò—WÞÃïÎa+üˆž™5Ú­; ­c¶>Þ™1²öynGˆ ºñw®Ø¹ü³‚ðÃ8…t0³|@ê%aã=¤k ÙpÖ˜º,J\%¶»®Ñ6—¢aö¿8Xö)¥ôÝÚý¾ š endstream endobj 4096 0 obj 5222 endobj 4100 0 obj [240 /XYZ 33.1199999 82.5799999 0] endobj 4101 0 obj [240 /XYZ 33.1199999 189.139999 0] endobj 4102 0 obj [240 /XYZ 32.1599999 191.059999 0] endobj 4103 0 obj [240 /XYZ 32.1599999 84.5000000 0] endobj 4104 0 obj << /Type /Annot /Subtype /Link /Rect [172.319999 262.099999 229.919999 269.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_module_directive >> endobj 4105 0 obj << /Type /Annot /Subtype /Link /Rect [338.399999 210.259999 362.399999 217.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.cygwin.com) >> >> endobj 4106 0 obj << /Type /Annot /Subtype /Link /Rect [372.959999 210.259999 397.919999 217.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.mingw.org) >> >> endobj 4099 0 obj << /Type /Page /Parent 2 0 R /Contents 4107 0 R /Resources 4109 0 R /Annots 4110 0 R /MediaBox [0 0 595 842] >> endobj 4109 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4110 0 obj [ 4104 0 R 4105 0 R 4106 0 R ] endobj 4107 0 obj << /Length 4108 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€©‰˜iäÀ°‚O™ Nùû‘JR-d}¤Þã"©[6àn—J\ß¾|ÿÛÏ>ýí¿§ï_?ÿûôuúùúù¥:WM5þ9 ¿»ÿ@¶g%Ç_M[Ÿe7ü9}ýååÛéÛ˧—Oý¿ß^DsyqúÑ?œ§üï×½|?Nþ2~òùõ÷ýoÿ;ÉÓïúÿýãôÇ?õ?~žÆ¾ðËKÛ5Ã/ÿRȶÿÏýoÃÿ¿üáW§õKh/ãÿ~';Q·Žo×WÅåïý«h²ê¤Õê~‰¢ÿ@Ô=8þó——¿ö£]—qѦZ<ªÐz×qjø­.­MôNç¡âaÖô|(ÑHýšDÜæ&àÑÎm3ý¿/™§í'©…è'•>%¹a=û1eÕœ:ÓœŒË³áq¤ˆc™jE¢ªa˜õÀ6Þ‘R¯Rµu¼Ÿ’È7ò&ß|ó¼øã——ï? ­ÚAœûò×~¿™püñe¸3æôÝ èuúòóé×U%ôoN_þñÒëN™z”"CO´Oà;•€O^á øÎOð¸6Q1Fû‘¾6¥à<’ÉY>¹îòä§/=ZæG²NF YÁˆA¢0Â|„O:8|‚W­Z8\5^™ñCTRx4 7Œ²øBc”…+À—#³wà<Á'e®F×k9Óö>¤š¶s¶Õ8eSÏ;ýá2e}V=—–õ=Æ7èÉD ôíƒqÝ¢:7F´=(o6RÓ¿+F¤2çÊ9„ñHõY=ù .ºFïH{sh—̇W?^þæ,/ñ‚ÏØóáQá“éÚ² í¼ë¡ç,~º‰ž…xÀÜ~W øZàz«JÙw òƒ ÍÍH”’ö: ;Ç‚¯YÐÖhØ$h[Ú¬s6Öœ¢³o(¾ø\ñ bK)NbïÓ³‡à9礪&Ÿ ¢• 5r¼BœkÝ<€‘B%¯.ŸÉÃ…bƒ)F†žFK‚œ³Ka0!ˆ|–1¼1c ÈÔÚb@žSŽ—s#Õ…}ûo_UŽJÊ!ïx–PˆR&a_Û%:…ìUkq¯Ï®ë~¦²Âo¤ö°‚x qx¯|«‡›u¨ßÊÄ·&©ÀUÍÌÿF"ñÌ:¦p˹ª‡€c¢ïÈ“ÇF=9-FzFƒ* …ÑÓíòoõÆ%‘yÊF¾,¹î ÛÀ"ð©¤N…Rk^îmÀTÅŰ$xÄ—U22†!Oî‘3àÕ¸8ëDàà‚”YCX¾¢tL7/ª«¶›Y$d†¡ºFJá kO ÕøÆÑãypà/¿ÆAužà@fFT>ÙÆ!è8l¯Às œ€i…1®Ú³ˆ£x?žÑp~‚‡ûÁ¹+8žÐ“<ÀIEÀ8ŠçÁ¡îø´a¾‹‡à›ÅÁQL)p"=óà\œ¤ÀÙÅï`¸át N…ç0Vá<.FÖÆ%gPXÏ™bJŽGcàæY5\¦H,ŒgP$…ÅgÊÚi(/ VFÌU³±„G<9€:df¤‚Ä!H‚Ä!Hì[ÀtÔƒoðäÞ&ƒ—æ`ðå<$«žy0 ðª6~°ñƒl|ßlï‡Q)‡ƒ£o“õëk죌çB'££âý¨’>*qËdx 8xê‘l°Äñn| S² ›bVbðªñÄüσ¯z©ý¬./+¸U°‚˜טw+T@IK5‡)¥pÔ!$‹P„ç1âx‘9§Ó‰ÔÁ+!$n.uˆ;È:%BM¡jÁÂ-yâ¹ôO‰“ìæn‡ á°!øG;l‡ Á¦Ø†ðÖ""le»a´Ør ÚC•ΤJB?Ù…˜Q›ûEYäEY$,’6ø`û2‚žA,c÷V̬…€Õ˜`mߺ[ŒmÆC08ƒC08ƒâ‚Áêá ›&tå9Ïá-,´qyõïÝyñ–ôÅnßϦ»´õ3êÜoèôËõÿúܶթ1Ã#D;~ÚœšføâðgþäëKSŸ…èdÛŠë·ôÃ(ú~ŽþûÓÿåðÚÉ~[8sˆák%ý·º‡QºÇ9þþòã¯òz6µ¹¦½Ìc«pyTÁ‚GŽSŒžÇ™ÿ„ªAŒâêxIQ˱sSa?Y^ð•a×?J(0[ Ö‡pÉξ1 ›çããw0-‡ÂŒÆï$cb°:nm,xPªÝ‡›?Ä”ÉÒ6ÉãÊOJ¹öZõK·ÊB…v; ˆØQaòFaœZ‘xõ1¥ñÈ}òRÞFÛ”·† =ô5{)æß,nÝ“§÷~ʬåES·6“Âv†"­çÒcQÁö3† ø¾—NŠ àrçôRIëª}PIëª{¢’ÖÂV‡Ol•ôò-ý0оŸcVIëÊ"uf­:Ç“ æ´ž3I˜½”W0m¥-˜n&°9gÚ^k3‘Q;a3®óg©v\yÌÐiºŽàkÏmWY”§õ<þ\ªQB­®Lœ4:‚ðËqyr žWæHÐ'³â>9-n§v(îÌÑÞâ®êÆÂ–L½ƒ‚k ±B¡ël(¼ÑÞ”¥:ƒ½-ëÏj% Jˆ8Ð"X{8=}òt}^Ùº>;Vï˜4f¸œ¸[ìõ¬+Ñž³/¨²Ù*QNËhGÂe„O×*'xtq;¬×lʼ­kØHb„f„˜ÃìsªNc£[߉í\™NÒ(u?jö3ÞŸ§­ýUùÁ~7aŸ­ÖƒZwAð$¡û(á]N44¿§¥Gê¦l²wšè”uÜûù“h½I:ÿzÌù£}¡0½åºGšhT'°Óñpãa—þvBøRÜÌ™8kñlbæ`›Á]h-—V(6u‚ ´UX‹q¼oU¸é´ ª]Óµ¶¸¶MUØE—"š¯Ö´‡æ‹Ä~‘Þ±æKH–ÁP‚<ÆaÅxbÈCÊf䌜ojY÷“hçŸJLfÀ’&aQ.ËyP¬;ImÆ)Sâ–Ιt ']÷pÒTÕ“„“¦’V2Èð‰prù–~EßÏqM8éÚg '±NúOœ„“á[ÝÃ(ÝãùNšêZŠ"O „ÒI§äüÍÜþì£ Ä÷P¢LBGL‚¡‡a‰óB8¯ÂsíöyŒÁ„[†/Á<»ƒ˜j$jg”ÎjÑZ\¤¸a|_+²é( ‘EûðQ!l+†aõŠÖ8%{?³kôdê)÷äɵ #oµd2ñstŸ¤þØýÑŠœ•)øÆ<(Ù]…ìWù×NÍLWB0¤³I¼džá' «›'êxD9—ºHúƒ28=N#˜.àIŒÀéaØi„ZØU£rJÎ ZÙpßnHEŽ òEyÄ6yœh@¼RÇNs¤ó’µÅ³ ;î–«&áÞ-¸þðAå|t`€§Ös©ÚUŒŠÎC6×;ãi“dfÔu1P¿\¹ `W[+ݨ…R6¬óä!æñàlÁ¼¦—íÖVÎÝ9Sº|UÙoKD_©Çð;°“èIO½; :É [’ÓĦp¾3—[æØR—¹Ì aDlÇgëáyón%¿7„x¦î%m%ƒœîÊ&ÉÅLS=Š™F< 3²‚¸†Oì@±Ë·ôÃ(ú~Ž9PÌÔÝ“@±¡F·5Gÿ‰(vùV÷0J÷8Gþ@1ÓÌÍšÒ8¼6“y· ÞÌž ²ê‚ØÖã4ò<ó~B -'z3YžŽ¨ÆŠs¼e&w¹°êÊ{œÚ3…<¬ŒjœiБà!„pÆï3§’ÙÙdÞ -IZ–/mµ[£ÁD-O}ßÒV©h¸‚šË¢)Ë£¤]Ê¸Õ ð̪‘”Ö•­aŸNchO¹CŽjÄi”^ nikÁQ8@ËBœr9®z¢ïœ1«:pEa¹YaøI´ŒjB°gˆ Ц$£¸¦¨È©úÂ:Pr’ZGq˜_­~|DE%'óuŸ?)ì „#ðl4l‹pˆC •„`ؘÀ£§Â½·›†K¶&ÈÉ)½?ö˜¤ð,ÅØ9ÙSoÍYc2™SÔjÛ#hŵ[,–¨9%nðˆÝ*ÉFÑUÙKˆ©Bì ºÌ'Ó*33Â"UúRGL¾)ª:7F<æ59‰­AÚ¥™ðö/'֪ǞÄÒ¾ó†_«tÝ\®v©,B•Â!Ù·p…8“;<9‰7'‘ŸbnTž *Ä@–Ø‘í¼¯ò«žÈ¡(˜€¬” zð³ ñ³õÚ{®ýÉê´E0irL;)Ô»LåyÊ÷Šm²˜Q&kàò ì9T‡òï€þe2è:Û²½y›Ä;*²,1ïS‡ bÕr™©¦¹[>ëlô3H\8›QËÍãaSðøMj¸ìQÁ£a †ö›¨ÜWOšÚ:ßpZn›%sÊYÀru•’ˆBè‹SàÈ!í§ì±›µ"¯´ÑŒàádÌ$ •ƒÖglâHñIÌž.*b[Øò” W çæÛpÅÖl,ÃÒƒ;ß«µ"e59ˆ° ßpB19‚™´\ŒÃ1eaŒÕjqôÔÄö+¡ðëõäLµ¨•-5¦°A²2†Jç;%´ç.ÁÂç”õ’Jw7ݤµ·½FŠ{z¦K c9©%0,V+Òµ¹|”C};7/‹æ²À:.^ÔóÄ,ZàÌë`¦d1-™šG㈨Z$¨m¨sma£–·‚½ƒò·úJ2X;HþÌ©bº¼ßsT†ôjÁ@o<œtAµÖ1R–W0ÄÛ³k¼uu«w¿–Nš'¸Ò“Ýn~’Wêu¸cLI¯BFÅY:)ð< ù^3üÎ\;±¶k>ykºBDs"BDSšð!?g¸Æ(Í—Êû:ôX»÷Žb/H¹ãD‹xz0ÜiA=Ã<ôjÒT^÷«]Œ&ÃèäŒÂÇŒ¨ÊÌÕ5ÓŠ-"¸4P1·ªm)&IXçØÓí ê´ž4)XÜ ¿ƒÓ¾òëÁ]åHòJ/8çÙ˹Êïêšt]mƒk8×$]UÈPQõººµ8®:ñÚMEÕ].)}ã ­»æbô²7îlÁUa„±^¡‚8ˆÀJ–wdšån+…Å&*ý²½ô㺺µCÙƒêÈSŒëäJ–ø««×‚ˆ Ëpokض¾µ¦è]ÉãÊÏY{«s®à®A”ŠákYê",õoµ<¶á$…ËPTÄ쮣¯)Âòr|ñHø¥Së#bP)×1V$¥39…›Ï$Qê) <Ôâ,)ú»Êh\«–wÞD+JÇ®å„3]Íåö$õSwꥮo-*=O9Qi£Ìý'ã:”÷_鬯Li –¢w/ 5!éTIçEnIµå,´'œúÒ>û*e 2Q sîZ{üW>¤/aä·w^á“.ÕI}¡¯¡“·Å„ØeŒ¼…éÁ²æ!'Z»ZÆ9§Ë'÷ÏSÀ³ì+>ïÜO…qH­Mq3RCU¤É}ãäXþòn×é6IYЖŸÂÑŸ®Ý"";mOÈi9)¾°oåÄœ¯b8¯–ci¢¤ipdØ$“TÈSj?gRï"³ÃóãŠà„¥¥¨Á»^U†=®Œê–W¬0²µœÀÉØ¸“¹„O`ï Å »’h¼6,ØÀø`Ü¿“EèÊ錟+|T|I­REYHbLKUÞ Ÿ.bè. ´7fébxî“"•¸3똕²`…™Á„´–N˜Màä œ¢‚5V<cm˜éàw ¸¼gÆÝàˆ¹×•[k´½µ¼ÖyŽ¡ˆQÿ)·€ œä­žîηÙN]‹Ö˜$Ý!&‚‡ÀâηN£,”„#!¹Ã:^ˆ­7S(úž6gÞ^c¬íI¼ œÞ‰[abÉ'˜B&¡œUe<–Z<£e/e:!µ*<óö"±R¤Hºý¥Ãᯄö+ØWvlàQV¯VÌ™…iкۆ~¶›õ°åÌÉŸJaÜv}žá!AÔÉX˜Ïh>:¥šK†*(> endobj 4117 0 obj << /Type /Annot /Subtype /Link /Rect [184.799999 426.259999 277.919999 433.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://msdn.microsoft.com/en-us/library/z6cfh6e6\(VS.80\).aspx) >> >> endobj 4111 0 obj << /Type /Page /Parent 2 0 R /Contents 4118 0 R /Resources 4120 0 R /Annots 4121 0 R /MediaBox [0 0 595 842] >> endobj 4120 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4121 0 obj [ 4116 0 R 4117 0 R ] endobj 4118 0 obj << /Length 4119 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`µM²Ÿ@ÀãG€6CCàÍ&X¬qrÈߤnfH}$«Xd·dÚ€g,ªÙd±XïÇüô÷ý?ÿ»ÿñí§ï¿,?ß~Ú5‡¦oæ?ûÓß^~ ÇƒÑó¯ÃØôtú³ÿòu÷mÿm÷q÷ñøï·êÏ.?Žƒ—WÌþ÷Ëo»ç—ïæO>½ýóñ·ÿíõþOÇÿý²ÿëߎ?~Zæ;}áënœúÓ/¿Î¿(­ôxüÏËßNƒÿÚýåwûߎKÏóžþýAOZ혴ŽoϪóß—¢—5{Ów¦ë÷Jéã:»#8þóÝÏÇÙž—q˜Z¥†¾šèY}š¶Úý4§6Æ™ÔÙ[äT© M/3ÑiE*mkªiÿTlÐÝ8oSµÉ»L•:Ñ8(¡3<®H¥míz<ô½ºó6»!qŸÏ3¥¬×Fò穤-€Ç3±á®G-„òשR'2“Ô W$ƒòž©Ø oÛ™¨w›¸ÏËLÉëÚFf¢ÓŠTÒÎ.€‡3±áÞ7“Ê?O•:Ñ …îÎiEB(§bƒ~˜”•¿Ì” °ñ¸Y™#œ”•·gú("ôê«ÐûÍóàÓçݦ“€ÿùçã*ÎZÂüãó×Ý‘<üp’|ÿù§ýï›ÆôØþe7†¾ëuwV+æ=œGÆç}þ`84“ºæÅW›÷ç‘î¨~ŒêÕ$žgÞžGÚçTæéGk;¬÷uó¬‡v~äÅHoOߨà›Ð´kÕoÎ(uèÚþôåˆEëü÷5mô¶\¸NñpÅ+Š_+ëØàHxêž¾ÔŒúr*žó{7µ9ôƒz…/æ}èüRÎÞóÞ7pVüÌÓBŠe‘"<¢žì%Ùk”!p:°Áˆ‘#ŸC<Ôá‰Ïo^ôûÏGþ“‰›ŒƒÅN0åâÜA—¶Øx²}ºªM¸ ä!Tø=EY¬ È`\ºÐsà) QÃ6Ìú\Š€ c<5ÇXá`¿‹ñ¯)N9(iLj´˜F/|ºÂR¦¡Ê¬À8ü+ž¤p0Å¿0¶ÚD­5!ÉÍ3Y+…¤ª5c@UÇ×dq:tÎzÑpÄ ‘¶…#à^ÛGÞ¢‘®Íó ~ϟѹ‰Zë T™¢ ùàƒJÆ)JVós!£&1r yI•锽þm¼õ ¦H™raÛ8Gè`˜#J||<ÅØL¥ÔA-÷4çq öqÈg0=#ˆh¥Ã:ˆm/Î-#:¸+*™ÉXóã×È‚Çþ‚Ñj"òk~Õæ¶e‹! š½5ùºŒ`àî3l#áh8P»t^’ÒTÄö°„`G éO1Ð £<÷ÌqiN-«-Úb³" [F9,ƒC&D׃ùE“Yêj›!¨ŒQ á¢nTAÒžSŸVÚå=ø!DdÇ$Gi<ñrðyîr‚8@‘ñõ'àw< =—sä"¦|übÓ JŠÝesŸgΑc—v9æ_^³G“Z‘tÆæ©IÆJBX C’¡ &¤F/çÜ ¢8¦`!)Jo)dÉw1Æ©ymÇYì[ª»ÌryÏü ÞN² ùÎ&0ŽAº¤/ŽŸq¶vÜiˆ ž°0Œ Îer,syÇGå;ŠìÚnç;›ÑpŒ#Œ‚$ÎJD% ´Pªu¹:!.+žù$…G­EéWˆÀqŒ{5Ý:ÝÏÇÑ·—WÎDp:œACƹ5rÁÖ¡³F´¢?£ÞÀg&øL{¹ÜNx°º°úÙUôb¶åí÷ˆ÷4x¶ù¼PvKãH7ËjÛ‹+f‡3ô•9 Ñ«½†‘Ø\2nìÝ3gÓOð=„˜£¢v;ظ}á¼Úö.a5·F:tâHág´ØUPÞ®Q—«‘%ƽÊÖÅekW”&H²ñú·ˆÃš%órĬ,G¹„8&xÓl„%€ mÆí»y¿hN²ßOÝç„G»ˆÁñœ¯•vu4\&r c"!±G;q0Élæ\Œ'j^fÅÊFêò®EH‚>¥'8´b´Ê%Ljõà_¿ŒÄ|ìbîìÄù ޻ʑ;D’å’Σ¨Üq>Ü—§§œú *îØÅš©¬cçD̬mÆróù¢ÌSn™¶ÓÆÏûÖ']zª•aú—Ÿüºû” æuùd\ظ†c{®\×éfãh^þÿÄÒ%EFc·ñìWrb:dß‚a™ûÍ8ü–•!)žÎq˜ÉD£§Dh8‹H4Ù`lJ˜áØ(QÁpŸ²J>ï·£9fxÇnˆB¶#¼ï#cÞ Gtj9¤–ÃLªpe¸ö!(3Rš ½óÏŠ£ "ƒc(`XŒeêeØZ¸ &á¡Išiæì9®å1ÜídÃR‚Cwf9Šäb+Bdg.üd@’úVèVÞ<æÉˆ•)–ýßÁµ$ðœM¿A#¸f…z‚³Áœ–­a*7NØÆéß cËÏxtÛZ'—-¢øL«Æ:È8ãSÕ9~»ðF$Ìœ¼ í¬@ÿŽ”°¸Bà³­X4¨‡) 3`úk n-˜äc>°t &ý˜-=ûÛÝÙ |×Á ØS{„Q¯¯M3ÖÖ¼£Ÿn æ9£zÞ] ¼ªWÞµm=ðjÔSpwÙÁã~´ VSGpDبÌÚóŒà[5 †“µph†A^ÐŽÁõܧc¶1uB÷<Ã12CˆâU{¸^å‡[à5xÐè@¯éši»~¯¼‚ìý!†ÑÇ"5«á0é×5‘< f,¼Õ?ón¶$QïÑ{îºýÇ­+ï Dálžöø|ð)`ˆ^[ÌÍ××¾½7V€ÛÀàµ]ùˆ³6ë…“ 5ºñàÆÑùš÷söæGáŽç´q³…Þ³å»àÁøÖÝaƒH\5¼%¸’ç=ø8ÍtB·1ØËÔ^r"½Kõ³­±C=OÄÚRcV¢U.§Æ|Dì‹h§k³„ÂešÆSêââáÀçñ¶ÖŒŽY WW΀£c(Ô]„E¬^¾”@Y$ÙKJ i¸!Ôú%±ä3wNãT e]uBÛv]´‘×&»É9á§œÞ]¢ Å µáùE‰sö¤ÖÆVAÔÕ9ÄøÉ ñ‰R€¹ìÊhàF›:“Å3Íbõ‚§^_V7CVu}{tÖ1¼‘{Pû ]ðpSOìÖÍŠ)Q²Êʆ͜¥c¡ó÷g;1}ÈúÕEýF™ô<«¨o~3ã<<6¡Ã(ëZ$”‰(Ë«wL–‰l]u:•î}͉wùúœºB,¡¿fB@KéÛáNÌø¦gnU.˜²’C¨”p½‰†Š¡@g ÅEÊi3‹Ë9t&ÜÜùF‚xD° ,MMxƒ;[IRȸùa°6¿þ^5¸ªÁÅpùRÜv#m¾;•.¡AýêÊž,'çЂ#Ý錩3­Å’6,׳¸e–;XHutÏï»EáÛÓP«9'³¸ÇÈ:Ë-=˜:Í!IX¦qD<½-¬™Õé%ÅúVFþ@ðÑæMš´)Ë‹ÎemyÙuù¾Q—Þ¸–d´=‚’ŒgͲ=Æ,“ñ(àwÏA÷¥*ú¦{&ú—ª_NØyiUŒu¿y†YºqÜWཤõ¦FÇ?<+Lʽ ±Law™ÐãAŽÎ±¢?¤”Åz’ÄÙhßÕªÝd»v×ÂmÓùV3Žœ#S+šPl¢Üßq@s\añ¦Oz!žÍ—#´ÉyºqO±Ô9MKj°sܱc1¡àSŠòÏ1rÆ÷ïuaDÐØíenôM?aö¹{/õLë3£ÒöÔÌ„^¬Ø%Ѽ¹¤~Ž5Cá$L'"²¨çb®ÈiŒ± ìõ=䔞›§Â¹ƒ„2}ËÁ}ïì‚àaÐðªëmF×møœÛu´_¥*sŒS|Å8go;ÙB!coÂVÞ"ŒR8ºT¦+ÞÃÞAx•MýYÉ)KèéMÉúã„P>ªcU5—ºKΕ˓üŒ•Šò»]O;(T ñHž{c¼¿ãZëí‚C6Öq¤œÉÆKº ^Ñ…ù“(‚¢ʤ,в´¹ŸÇ<Š÷˜ï¢j/s³×ê+ *bç‰8ñDkfÖ¬XÃõÕ‚úÍõO|F`sj¢²ÿºë´~ùÁ¯»On›‡MŸ–`Ý*¥T¶tÇÇ$À®ðm`L”–îÑ7FÊIcæ­š'Ì­v§©Ýi6ÐFÄ/Tºæ­p¨>‡rnÝ™ÕÇàé*læ\‰ÔmýV·žf¡ð=ž†¶¸)©¢¯Ú³Sܾx€#b]8±Œ2ÚçKˆª$X»8ñ²)åv†]AkGÌa.Å4` å’ˆ»-œ•ñ>ÙÕçu°°NGZ4´/Á)Ì*±ãLOÎ ÌYy²‰Ž“æ$O¶ó‘éüUž0D‰‹ä„« bu¯-Rë×ñp*ø2eH. =v=WJÄs.Zúj»±¥ÛìÈÄù:7žÑ¹Ž£æá#¿çœÇö½Ôuö¨Ls?Ë^7'¾ÁÆúŠ‚ÚÂr¬·f{‡F°–Õr´9Q=Ï` à jYž÷`Í Ÿ>SM?5@îh †~¬ú c|ÆsÖ?S8Ë®¡ƒO¯ ž©ï=žÙ°} ¿Ÿ¤×˜¸j“ÝŠ´±:¢ubæ;qÎ72VJ –„M]ÙJ"ÕÏãzÊ}LOñpLÉú–H8*0]ý`â»G\´ëªˆ‚dÔÅäa>H2v«¾‹Ìu ²o,@´X¥©nµÒn5|>eð¿3aüÇÁûÆ#ÿ±±¾Ð ŸÑ \,>»RGó¨@§€S|±)JF'§,‰h‘ø”ƒ%”Ì O§ää­–Óe¯ ð$ˆ;ÉÞ„¼ðBÙ¯pVè󴂸§Öë%rx•Eö9M&D²Ý:v|H+ÑQÅÃU‚yí¥ ~èqÄâ10*¿°*M”©1p—¸2C¸"¥¢¡3¦ „šLyR¾1Zj|Àª•½øK$½Å^Š—{Õ ‘ËÓ7˜ÐþË•|ðs á¤æÎ8µ1 G¢”¡%Üt NP„¯%58%¨('‡/ªm¯«ÖJxÿûu»¼µ¦ø5,“'A›H]v¥<±š–®ÞŒ=!4¸B”çÜ$Dï¿1ÃñïþÛ‘´Éöé Ë/_=´ÞeÍ•I|ô² ï£AþrñÕq7Ø‹™T8óµ½i.,f‰$éûC»$ÜÔyd&{z8 6žÁ9Ü™‰1=Y6ŒEEëýÌ¡mIáÖ{FøÌŸ™¯Õ º1§!›™Þšm¾¾ƒd·¾»HÜ7vø=³0ª[# íc‘ghÏ,'FÙû²¶óHÀºÓïúÚyDu~øL1`Üx`æ3íã1, ü–CÒ 4†g ò`ä;tOÕ[|Ǧ?¨“Ý&1<äå™…F ÒçýÇÝÿ5Í}  endstream endobj 4119 0 obj 5715 endobj 4123 0 obj [242 /XYZ 40.7999999 557.779999 0] endobj 4124 0 obj [242 /XYZ 40.7999999 557.779999 0] endobj 4125 0 obj << /Type /Annot /Subtype /Link /Rect [140.639999 488.659999 187.679999 496.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://msdn.microsoft.com/en-us/library/f58wzh21\(VS.80\).aspx) >> >> endobj 4122 0 obj << /Type /Page /Parent 2 0 R /Contents 4126 0 R /Resources 4128 0 R /Annots 4129 0 R /MediaBox [0 0 595 842] >> endobj 4128 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4129 0 obj [ 4125 0 R ] endobj 4126 0 obj << /Length 4127 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň( Ø3v€6Ã"‡À›M°ØYd²‡üý¨[R÷ŒØÅ¥Ó<ãf‹"«Šõb=ÞýùË?ŽÿúýøîáˎߦŸ_uU›züs<ýýá岫”m»¦’ýéÏñÛÓáùø|ø|ø<üû|æüàôcœ_1Nøû·ßïÆ—ÆO¾<üuøíGyüËð¿_Ž?þ}øñÓ4ßé O‡®7§_~RÈnøÏËßNƒÿ>üíÇ߆%tçyOÿþ {¥ûÖ$­ãùò¨8ÿ}ù(zY}TÆt­< !‡u68þûÏÃÏÃl—eT½¢5º­ƒgæ¦íks<} „¶&µö8UâDm-z–‰Î+i[µnÝSQAßÖçú&`ÓLÉF3¡ð ”M€Ç3‘á.EÃDòשR'Rëa™è´"’wLE}cÔy›M›ºÏy¦d€&fs^‘HÚÙ x8îfb­-9bÁÅÅjZÍttÌ);›ág"Ã½í¹¤ëuªÔ‰úš‰àO+bb5x*2èû~er଩ëy¤b'¥`Âá°"‘¶µôx**è;%5·¹Ì” yÕóýyE,ÜÆšé3‹±!¯ÆÆ³ãÁ_ï>õ'ÃêëÏÃ*ÎÖÙøãëÓAÿ9YÝ0úÓñu­þtüúËAˆªÑƒ!Òœ¿w©Íy¤»| ߣ¯juÑ×gàgkyi«ºWÃçu'©úªÀ“´‹]س6ã•u=Û?0•Ýâ5Nòñ<Ò &q'dórÑõrz¸?ÇôÖvÄ8kÕ vÍ«÷Õýˆƒfžÿ:ò­±þñf½¯qII1äÁq.z/ÎáZ¥…sL˜¬ý}\ž¥Oç>~xCÚIZuà°·Íù°÷ªŸûøÖ¾j,ëшèЈ„ÏÔð=ò|O G ÑhD¿‡kûG#p6‰W!*à{°†³Mœ€  Ž@Ìaªšð“‡þÛÖOÿ"xßxÓ?¤ LË”³9IÕ¨÷øŒ¬á3x§pmŸZHIÃΦ ¯ÉQ‰OÆæ\H6nÏfoÊÙ,g³œÍ×Ðûá;›n ±­›Ë+gõ«5Íkƒb]küSNoY“žykØ€‰X}„5™b•„[ÍbT…œ§½~ui— ëƒè±Øñpz‡…‘Ž6ð‹#Ð Cƶ¢V~ù‚%”¤Ø–SÐbÃÒó}lû8VM¾Ÿa]µÂ«¦ÈKlQc¸=ÆK+M‘ЬòR@¨Æ”HÐ*Ö*Yµ^]k{}ÆakÀÙréÜo ÖÝqsX;äž {¾ð{ð©‡ü K Eš“}“G¾K™ ßI#¾’r20NV<^›Æ–2ꆫÆv·ÆÏ`*Çvj‘Õ4Y½9f–‡›ï‡WæÜ§,P}FޝE÷ÎæC}óšÁ†ÜÏ[>ˆ$ véàág‚“ÀÞ\½HpIÓ=² ZÅÙ’ÓÙ"u—p4±1RãëdìR¡8h°0ÁïÁ¢ ꔋsfö'X8âÀŠ+ :¬Bââý`¸ñ«ر8L;”8œnç^~vA`èàÓˆM#Lo ¯ c+Šð=8”çNÍP¬FS”eV ƜäÄ]¦K^‰{Ö5S@+&¿ nlc+£Ù&͈V.âœ\hó‹8’daÕ‹0,ׇ÷ÊŸ:N±ûŠÝç<Åîûžì> ~HW…»îR¸Ë÷Æ]éYÏMá;…ï¾SøŽ?Š7å‚7ñíV€-=œzã Q|¶1ïųa<íØK€S‰<Ÿ?Ð8Í ž¹í½^_eÔÙÞ>$VñzÍתÊãý½ÔÜȦYFÊHÙýHñþ;©ØIÅNJÁOñÂîR¸Ká.ø)ÞßÂw ß)|'3ß)ÞßâýõðÄâý-Þ_7Dé)¨Y|¼ªn¼)#e¤Œ”‘u¸÷öœXBY#y~`Ðý--ÍÈ žuQ«êñÏ ÅΙ3¦Ûf1"Eü3×àrë™=3‰9ÑVý˜g}E¼D³M&†¨«±~cÐ3ŸàÚ¦ŒóJO‰Þ×g>¢÷àý8Vð߃GàlW“Özϸ¶¶R ^þ-Ì=BˆÂÙĨÜ6•\–Ñtàc®mJ†»5ex„¾Ÿõ+Oèz.áhm€kCDTœˆ¨z€kD࢚xzo™ » ‚õ¥˜…Õ〧V(Æ ÅY51¬¯êà÷N">¨°kÊqM]B€¢#)€¦TY ¯q›RKerjÜ#Æð‡%lð.¬¯Z}DLü”EØÂ§ÏÇøÖdò“2wåòVcáŸÒDƒƒÎz1k'¢ýžÝ ¯úÛDÙ=§–B£Â¾Ll?¼Ô©Æ9Gw¨¥`«êZ¬¢ŸÂÒüäÉ[Æ .$¦Ú»Ÿ€—_¹¸WžÖZ+J—Î,mˆïæÐ°PdæÞn6r"jñY¸ö¦}í^™êÅÜ‚+~fv:Ôba"ó•öÂbîý†UG»¡…mŠèIÐŒüŠpî¦$I‰O¯U© ýí 'è•¶=j-WŒ°e#䉷¼ãú"AN×{×Óä8À–ô`Û™øYs­W-¿ŒuÞY‡ÇUˆ+·Ä‹°«¬ û%ìÈÔjhI¤’¶½bÞk¹68šŰ<Š‹“"LÃ鯦F‹‡PJ[ àPVI¦È𤼢 tÃ… ¡°A[ p¿b¼#ײ×E¤e¦CQj;¥?¹_ _¢íO‹à˜§ÕvŽÙb’CäF°lŽë°$……~­Á„U-éV-7æ†+]H ê[5õ¤(W$"œUøSlqˆîoÛaÔàšš„·îLÿ~‡ãjÔωYî;Ìëý<=h÷sÈÛZ—¢\8F–°— F4Ñ•Š…Hcú¥YEGØð1÷0þZ,¢Xœ^þ3AÀÿÔÿ)ŽfvsµN+ìýYÜ”¼/KSU%„OPX4Å3á_t\ºx½³)±ŽËÆG`Œ"ÜÅÀ#¬Ö·kj%dÅ|ñþ ¦ssIG[Eú$]uúÍ!,Ý#¸JÑÛ&Ô’Áûï^ïêJd•ØM` cA-b[ñžsW÷UéÁ¸c7ßÄL)Ï]ÕY9@)ò–Ã,Ž¡pû˜ÅmMÒ¦W!™€ÀbŠ-¿[þLø/)[¼¢ìñ“ #!""\T³8<®·u J 8妈ҧÊv6âNL¸«¯¸;¡à„¾>¥ûŸJ©—üzøâ`xëpÊÓ^“¯Wn¯È´.ö,žMé‰ìõ"ÛŠä:*AŠ8Ž9¯Ó1"¦Ô— µ¾jÐH5“ÌäûGØW8™Q:`ëq%²ù$ÍsSoí<Å7˜EÝ¡áF€Cã±¢€9’_m“˜à¤\r¥$ÎFÄ_3D·FˆhnuʉÅÜÒUÌ廬˜ü©ôÈg2$‹¶zÁÒyÂY1•MîXKtåþ‚Œïà~í¤»u"9×Ù%É‹bxñ^HBXðæ&e¸¤wT­ë¦Dú+o$•‚Â#„ˆ¸¬&n‹ŽK˜2— Å;…¥+qÊš­è’}}»4gbÔþðJ/”3ž DñMyò V¥–~Öq%‘æ•rs)°uÖÉ{"½6k ˆ¯©í„òg®FÜSøÌøUÓ3Åò|­̲³L#‡`WS²Ñ" vGÃuÓ,Š¡ÀÕ«»è”1‹½Å j)[bÊìF{úÅØÛy #|*[g¹8@Ïk‰„«+û+½£kE¨ Œ;g²ˆ ™©$À ™¡RExÃq™âß$Ṳ̂©3roú¹Y§£¥n÷K:ãö%¸@4l­è42À>¡MŠã=ØòÎTX[b Ÿ@;Ž&Lÿnœ± ¡´ŽÚ§p6Þ2ꎖ'p§®÷8fÃþCüJ3.Ü2(Ci|wÊ4 pˆf–ìáWLÙ‚ˆx {2BÔ^JIÆ€bÓ®.œéB ?Úo]ˆX:O9q^ÐsÌä½ì H ÷“²ß*%˜Ò”H³¤’¬©¸kßKohÁÎW¾¿Ÿp£ýÔW…Èi¶õ%7o¥ÜRpbýߨ↢XÏÆZe6¬cR¬xJsPìL/–?ÉòÇpÓ„“Øîv4Æm„)íV±5JiÈKhŠÏ‚Àé€Ír àR¾†âúöRÛš×½¡>ø¯Xyêþâ™ãëxKGfäÝÅ’(Ü¡p‡}p‡rÍ…;xœ ½¾¼2<~ÅRl+"—#!|íªt,µwVhu”ýbœ§Ì=GÐáÊ;Û(ü¶ŠÐ5©}S ¶"îàX×|ÇN¸5„Q ÁÓM‡…‘e®öÌ\Ã;<<€·SëF×ïr< 7ªß9êо‡|#¾¥`Lo·„°+G>òQHë6À£¸x#´.RÍÈ*ÌVÊ©oõLÍ𚎥 KBiLú&ºE²„BE1Ë­í'¨¶¤3õÊSµ»¨Âý ,á©›Þ vò^Ósœ×±„ò0‡ò8`Mð::ü„øVX—Ô=¶àË•ºÇëµ/÷fûNcÆv¹Ù5¶ßZºŸ÷¶0f¦¾¼#‰,ñlXÇ!Hq,§¶§rR|¦e|20ç¢Äka® gÓÖX×%¤c)î¤7XÓ`½{)aïzŠ”(R⎥DÑþóI‰ë·)%:í]ïHÎ݉Kjv6H4¥£ãÔa‹—qìÐÍjø <©?ƒ“ÝáÚ4~Ë@BJ{ñ»ô'‡Ÿ¯ ßçPn‡ðYÀïÁ' ŸSH½”\.foÖ‰ñ{(þ[Š>ˆ¥cÑ|‹„Ì ~ïÂÅ +\,3+6¥Ÿ‹å±“–Zöi'•‘2r¿#wyã±LT'´ÈŒ“Œyä0¹).ëîÚþ-ï®ïv±Rw6E'›YŒOŽÃ[qìû çÞ*äÀe‡ös¤NÛ¹eYÏ”˜w;Œ“”+ãÐÛ“$¥|_D÷gœ¤B©ªLÂ}Dc"Ž‚›•¦ 'OJFCk¦5™|£\¾ä¤Rh¨ä¤ÞeNê=%ÃO7“¦jÔò.Q¿Yõ~¸Fû¼Ë%r,"M˜ê ÖA„ƒ‘’kÓ ¡œ= #Õ¯Ù˺6 Ùô6öÚÍ´)}cÂ…ÅÊ1ò4ÌÈ`è¶e‹˜ðòÒQ#WIˆNÕþ’Dá´‘Ͳ.)—«— ªæožcž«ˆ‚¦Ó*åUH¬“?vqv¸s_O¸YÚEƒf[b!zŠ“à­8 àÒÔòYJ£ˆˆŽ1ühº0 ªûø½\Ö°8{"ˆ!¼X%s§u‚=‘PÖ0Â-ë@0ô; ^Û”§tæ}ˆ¢^ª¥(zóMp2Ք͘w¤š¹v®wRâŠë=ÄãÈLJ-0Bí,R›ÏLqÒ¤Vš„¼#L;”8*‹Q*˜áà÷à*G:ø4âìëÞgåP’”`Õq0O+õNï•×” Ð[j;Îuœz^ âGÂî{¤* …â Åïœâ¶*ò þž¾0ýøöäЙme»¾*ÛŸê¶óQ¯žÞ™£¶qCMW½0Õùfàxu¨OFŸ1•¹c×ëj„Œ¥Pȶj—Þëœí‘‘%+UÉþfOȦ©Ìè¦^2ƒ[ïéà3=|f$VV²>ù.™õ­ÙFb{ùÉ#üîyc‡ŸÐ3+¾5"Ð>&F÷Ì„±˜½Ok;€ª;ý.qiŸÑ@øaœb:À´é`êNjj›â1, ü&—yÔ $†erPä#:§â…º®6•hE׆†ÀH6/y4#>~>ü@‡> endstream endobj 4127 0 obj 4632 endobj 4131 0 obj [243 /XYZ 32.1599999 770.899999 0] endobj 4132 0 obj [243 /XYZ 40.7999999 178.579999 0] endobj 4133 0 obj [243 /XYZ 40.7999999 178.579999 0] endobj 4134 0 obj [243 /XYZ 33.1199999 768.979999 0] endobj 4135 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 719.060000 122.399999 726.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications >> endobj 4136 0 obj << /Type /Annot /Subtype /Link /Rect [140.639999 719.060000 253.919999 726.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 4130 0 obj << /Type /Page /Parent 2 0 R /Contents 4137 0 R /Resources 4139 0 R /Annots 4140 0 R /MediaBox [0 0 595 842] >> endobj 4139 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4140 0 obj [ 4135 0 R 4136 0 R ] endobj 4137 0 obj << /Length 4138 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€í©7°g<r`Ø@AÁn²Aœò÷Ó=’¦Ûd$«X¤ZjîkïpDQd½ë«â¿ýòçÃßþ{øñùË¿?Í>yªŽUWMÿÎÿþpý=k=ýµÚ£Ïÿ~úåéÛáÛÓç§Ï§ÿ~{RÝÛƒó§ÁåÓ„ÿýé_O?N/š~òåù÷§¿ýï ¿;ýß?üÓéŸçùοðËÓ0vç¿üsú‹ÒJ§ÿ¹þÛyðïOøÕá_§% oóžÿûƒ›^UMÔ:¾½?ªÞþ½~½¬:ÔÝPÃA)}Zg{ÚŽÿüå鯧ÙÞ—q¥ú®é«àY{ý6­ncßz{NëÓÂfRÑè@f¢ÓŠTÔ—þè3‡nþþ=ä=Ãù%M[ŸNøô-w¼£n§½líI‰»ù>UäDcušDä|Ï+RqŸ¶0žŠ»õ£ÒýÛgžÉ9rÇ–©¢·¾•:ÃóŠTܧÍ[½õ½ž(¬íc¿s™)zÃúA M¤Ï“Ä|Ù²ñæLŸE´¾h»oŽ?~}úñu8œäê׿žVñfL|=­P~8 Äæ4úóá×U¥^~søú'¥Ïão?©ë'ýÛOº÷èÆú•Ñø5ÏÒŸl‘Aé¶z©{ïÃõ¼¨«Ÿ|²zž~R»¦ê®_P½¢­§‘úX7ußV—¥ÞFúã8˜#õ´¸cמ纩>škRœúÄO_O´w²ãÙf»q²M5ìɘ™—÷áí•írW ŸŽ¯9N‹¼™6µ¹ü …¿:Ìû¢ÕзÎIæ.¿Ñ™?À“á¸4ýɘ^õð+ô|îÕX{¾Â±kÖç„?«{óÙOðØÌ×èé„•:¶MwÞǾóå}zõݬµ¹¯Ö³3oÇ~æ–ËHc>[ÃÁµÚ„„Ï®uZÖ˜Ÿ¥;x&á§5‹¥—%±Žàü,üÌÇùP*e ±—„ËúPkƒñ~4_c½wÚµá8Œ•±Ä‰T»L{Á’ï£Ç8¤ ¦<±øýõ6¡&Ô*m¥ µbó óYÈ¥""h"Š—˜ñà8v,'à3M`í#\’~‰ƒá¯Y_9bÕ`¾OYZKR[âóÜ”¶$°6Ù0eLÒÜv-æÇ;±@j†Q÷¦f ˆlü%øÌ„s—5“9ü}2v·Ï€KïV¶U·/¡cßVÁÌm³„¥R--!!)N‹E¼æ{=¢É¬]$H7l"±˜Ó$ Žw€Gaß8i}ÙoF%”[uß™‚k—¢?Èw/"»ˆì¤–°ÿô¢„ß.âÇø(±ïy®-vÊô¡Ä…Dk¯ˆ£Ó9n¸¨‘”kE¼|ËPÅφÇr›Úg:s^3¼ñà5“)+µ¬Â¸SÑ=E½¤–wš *Ì&|W*É×¼òZÝÏŸøË“ûëüóéK2Ô"íó¾§íÏ·CÔOO5¬ÂϺnƒ¡)îŸõ«–§MEÉ´+»Að=Ì÷53œ§¶à<[6ÁüÂèÌßI£¦WkK£ó¾gLÛA6DçC‘—ƒwq®óì:©eJ5õ€rú£%Ø_gÁÞ»õÆÈŒ¼52Òg›‰ïÖˆ†#ð=ÕG¸‚Ajƒwv£iSÒè ˜ˆƒ,Ï…ƒOñCt`â:IDÿYþ^¸Ï– • v±E³gËÆ 1‘ÛÎC•!ÃÜÔ™¾Ù›(IžûqÎJ´åžB¡»HÄÄè¹LˆÒ-ºB)UDÛ™:"Ü$â2V¿}¬!†’ÈÅ’ÙUãs· Lb'pýâI"mÊi6SŠš§%B6ˋʑ,?a[ï% ’Ï‘¤ø ÎÍî2ÜWà â•Umè‚÷n 0ÈŽ0Iô†¥Ob¼l"øœ<¸¸µò³0®#`D ïá„ÿ"´P€Ò ¯ (&óÅ03œöØÎ¯¬k(…-ûI$¼Gˆ‹À]è¤_ž2彯J8ákV¯)G)·a8ýp¿¹¯1¤¶/oî õ¡Â©Ñ—L¶3FVaI˦GCl:UDË–Vfù4X*2T•_DÙТ5ÿ‘VòǨԴãªYv¼—“õv-Bˈ”ÝÊ*ˆë÷òÈ™È}6œEÄåiÝ´ŽA_¡¦Ý@q<>Ÿ¸º< Á]’»“6}½Jéù·²•¡¿C2¹ÿ¶‚î%ù"WŠ‹n¦1« Þ"7ÞbÒèžO¹/¦‘4Ë(}©³ô6OyÓÙ\Æx¥fb6‹ØhYnÉàö—OB…Ñh„PÌ!ìKŠ4ù~ ¦Ñ$wñë9*þÈÀùS3Z l:ƒe"\m›¾ˆîLº‹J¯{»ñb›ÙнFضù–iê´úU«ùù÷× $«'™Ò¯©L ’(®E ûÌÀŽ N°iXy¼ämyßklT™¦¿_Œ¦[ëò$°"¼Xºàg’T¡ÊN·@¼,ÉêeÔ°D2°~ÓcÉ Y: "å]Ñõhˆ®J‚ÊaQáªT‰„ª_dÉ4»dHÊVdò-½b™[€’hÙN”&-"ÇÄÒæAZÑ"Nl ¹¶=k¦F"¬³QϨ[ÓDÞBSVÑHËÖ:5À&‰•6ÎÒn§ZZ¿Ê7\¬jsÛ7áðÞ…•Þ=?â²\/.ŠTˆ) ØžIÊ $‘)Ùb®I¿îý¦;v’BÈ}Ûé …˜pnöîÉ‚åý¶lD³Y‘ï-ø†»ÁãI¦8R[ªÖ´2ác¬€´-{)¥jE«&Õª¢Ù2`”´÷¯$ìßP5†)÷¸!ÀWâ8ìØTs¡ÇjwKb|m6¿¿V‹BH¨Ùr@¹´Åkåœå–FQko3¶@Ý5†øÁÝ–8­§`§.•\¯7Z_½©(5ÁCÚ— @JÜ|´ š©…ÔÖl?ŒÖÕ—ÑpÎE¤ØQçE±LLx tÊX£ÍqŒÞ;éß”éøÎ45fæ@ö8Ž´ƒ×,Æò–”¹/åì ¶M ¸•éÏ|Y_@`ÐcËàb· FHƒt»gñ±ƒôRÒû6LbÚ`k‹žªjcãKÔùô‰>¬Ç( ÎÕ‘Ø µ”U`–T ÛQp Ú„6"r‘ŒþO+ýºÊ’~Xè½2N&›Ä1î iNYO¢n"x·"-jýKÖO+Y†¾7½£cÝ>ª´B§ªl¯éÚ¤˜›, Ýèg‹‡vQ”êzöKd§Xôn)>¨®8MÅiÚÓT£)Úijº.BêŠÜÝ\Ü©(w*BÊSºAxOÙ`‘g¬òôÊ4°H;ÞFR3‘$)Ód>Óëz¹§ 2è©Üñù.ËŸ~ÇçªwbŽÁ™„ýé¶H—"]Št)7'––c5ú¤å–š¯Ë\<çs*Ó ÿ~–ý—kB8\,_\êP¶ÔxÕ˜ãð{p˜® èÌ¢3‹Îôé˜Â%N.y §|¾5æú¼ñ[{ð)£~ï{¿+#e¤Œ”‘ˆ–ìĶÃa­MT¿;V€-Mèý;öêÐûIc63Vª8ÇâSkÙc-Ÿò<†Ç‰Ã®wr}¡ø­R|ñùsúüãÉ ¼¿ Œ”‘2RF¶0RbwÃÈ©)Ûún¨¯Œ”‘2RF¶0R4%SSâØ'V‚ŸÁž=þ| œ÷`O8CŽÂ]ž3ªjIЧ)Ïa]ŠŠá€mØÀÙ¼C`¢£ûçöP¼zhÒúâð¬ó"Їąã”B8ÂývÖ®™mêg´¢zsï`®Úé 3”jc\VQ$ný'ºï:¼ÌÐQdjÝÏ“ÑãSß¶Ð8^³8bΈ+lEak³gå°þ+¯ 8Ç~ôïHɯ³2mŽü¶_ñl^ÀAmÈ¢C8ÞÊãä!sFâÔ¸Ô¡~ÎÈÏxS§ÃOF{®MÀµZE¡Ë ׺¸–5t 9øDlQ¶tÛ¹åÈF¸ÂéI8½î §'âtÇ—2p¦œ–` Ú请+ÃTŽw”ÓrŸ6–iEn¤íR PäÆ=È ‡…€×Æðà±|r Añ 8ÂÂÏ)ø¹Â–~Þ?cmω–³²Ý%ò·e‰2FaðŠDáIl£*O@åµÒ…ÊQ¹†+px¯XkaÎÀž('“ËЬ/ƒ7‹ H".·Õ ­éV`ÕœŠE\9W wÇÞ ?'áçËÝS…Ÿ³ñ3öxY•c!ø® *˜‹»‚KÆØªÆ\Nœ–¡wÊMyxfXV5ãYxÆÉ3û¤KÒ)äê鑳£Y£;ïþÔ¸Sbßj¼iJ6:•ìÛ[×¢’å-ö¦+ùãÂaTž-®_8=§%¯[8=P×®½/øÓ}J¡¶Zòî%Ú!-…‡b÷&o÷½ñôziÛ%tCé­!zŸx3ÑocMò{ŽÃ{kp:»n8§ïMâ{•{mG‘ôL{³tØ«L)›»Ñà?9¶‡ïìkó¸¡Aê2nd÷+òö²û\šánHàFj^Û ðfD¥ÿ§ÿÔ:Z´¯LŽ*z¢è I™=Œ­i§™òÁâhÉ–Žiùg¬M+4¢“vÊÛ»;u[[]s ôUÚ­]œ¿¾õóÄ>;¯&¤Uwæî>^»Q‰Ž%á¢JèYšÇ¨›‰UUÇ®WßÛpVßÊ}héÝ›º ¦d1 &kì³à͵Nˆà5Š««íîÅ‘Å6Ö&É®žp\ ’² ³6äJÇ’{ï'2GÇ[,9ò6“¬Þ…¼Ub BOz¡SÛó;æàÛÕÒqœÑLê±]VÕµÆîR²=˜oÂlÎE1 "ƼŒ0-.b©œ”B4-×Ö•IXœX'[ìÈ21ú3VÉýÓzзY0é;;ã,ó`Ö…üh] ` Žj±æ6ŽÐÚQ€¯‡`Më`fPæ\TŸ—Í‹M! \ºÁ46ǦWåø ‘/÷%1úÞTòÅ6L'õÊØÝhVŒ%Ð9á*/Ëû ¿éŠb[ÊÔzMøš ÆûLɯ2Ò9 €Ynë¥MA1Ù׬zc§(Æ=ØÓ)7wN \m®¨ÉNñü°"ø¬ÍÂædÖy`“ÀÎ 2ÂÙõ«oö˜ Ûl²cgL<›âgùo,yÄp’Kc9‹ªzÇî1\…ÄI¹<ÁÉo _=Ç….ŠÞ‘Õôyb·FIÓ·ÆÈÅÔF}€ÏŒð™imª>NœwÅ>=}¶Ù7mÎö ÎöŒžÁ³i½Œ)Rtõ=jæŽú¯Gê™JµýˆÖ6Käï©Äê\©a0(Œ³»—Zkß§gT{œ˜6hw;¸‡pmjyïgN¯Çêû÷àSÄgu© §äæõ}63é éµVZðîàÙj4›cm˜Ï!_hHý˜ß© S¢sÙã¦#ªº {¨«å¢¸Y}vݱ»mSÍÑÚßI˜èþØ›Ç7Ñ\cd2óêú¨GãfbhÝD9—‘¾g€ÏŒð™‰z}ÔÕ[8ÜT·f›(÷ú'/ðwgoèÆ¾¢gf™pkD¡ï˜Ù˜öÌ|b”oŸ×öÆTwþ»nU¿ÌÚÂýÃg é`–$:˜¥û :˜ëÕI³Í&ë þ™M"75AÊÐpŸ’œò­‘g‘ó†ª;ªs°6”׉‘Ï’òøðùéÿ:à endstream endobj 4138 0 obj 6072 endobj 4141 0 obj << /Type /Page /Parent 2 0 R /Contents 4142 0 R /Resources 4144 0 R /Annots 4145 0 R /MediaBox [0 0 595 842] >> endobj 4144 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4145 0 obj [ ] endobj 4142 0 obj << /Length 4143 0 R /Filter /FlateDecode >> stream xœí]ßoÛ6~÷_¡çUøK –¤°‡AìaØÃ®еX¶‡ýû“MÉN$'ñ(ӒͨÓÐ:‘wÇ»ãñãñæ‡Çß²?þÍnîÿΞÛÏ»ÇÈE)ÜŸlû÷Ýë_(›kå~¬l‘«zû'{þ²yÉ^6›‡æß—,w¶Mc÷ Gðß篛÷òûÍãÝOÍOÿe*û±ùßçì—_›-½í¾ll]nøËý •T¶ùÏ럶n~þ&ûÚtÁîènÿ}§ê¢VZõãeÿ¨Üý}ý(z™ÈtY×ÂdRª¦ŸEÃŽ~ß|j¨í»‘×Fʪ4•˜LµRÙº*3S›ÑÁئ‘’a„*¡ëjB-φ&…©hRLÖWÂ놩u(Çö¤B VÌChÛ#64ÇzŠ›õ¥–n˜2Pë_‘ %T™™¦Ï¶G2lhë1)6ë«ºØ S‹`Öw¤B9&E=ÓôÙöH† ­c=&Åe}#ÆÚ ³¡Û“ %¤õ<¬ßõH† ­eýÔÃ,q€:Ä/ă·O››Ò4|iüüÓ§¦'»ØÉ}<5Ã-²w[‡¤«ìécö­úÃwÙÓçMÍï l¹q[nQ‹¬P‹‚ÏØYÂãÿŒ‚ψ÷ höxÞ?5:qr 7Ÿ£VWßûsžà"æ<|†-ª†Ô$C_ 5-` ÖX¢×˜šõ—)æ¸óŸéó kUù†ç3žµoîR#lÔxmž?P>¸×xÖëÛˆV¨YòŒJ {<:lัöïap^aËÅÐòxÒªšnèñÙ€[ U”Øúâùˆý ”‰†^ ÷°ŠØ7a{‰{¹ƒç=äŽaPÃv Gm,‹¥©áØ {G‚o86ÃÞ{alŸ  ÖÜùÆñ3=ÀÜÁö6ÍzJß.M$ö®¸o jDL€åÉ–±î`¾]kW3qb­BbÔ’ZRË•µœ¥bX;œ·ÃÙ0";­7ö”¸oØ®3|Æ+NÆuÁùÌQBr0ŽÀ^<–'ä×px–p²•˜Ú’õ€àμÔ£ŸBØA"?ÈÈ-ÒÂïaÌ3œ©ciÞåÀ™Ð˜®öo½øV[w\€ÙOܲ€\´«^µ` 5Áàx[vÆÎļþˆx†±ãFìC1ö‡ˆyψ8~È©ã½+N¤Çà5aá8=`ä^8;¢œ}(B«p´ ÇÃÊ2a¾­rÿ»å[ÿ!…íæ öÖxâY‹åÈØq`­Z®ÍƒÅÑUrÇâæ/ÃoÎÛrþýë%㱈ýHlcñ3x7ë?~{ l¹"Y‡´»ì¬!ë”Îv´V9Ž—0å…z –g9;b“£IÞ(y£eØ´äŠàd€ ëÂàg· ÇÇ£ùúsû¶rw?ïl XÇáˆ5£Yg&†u!RÖ‹³·Ç9;CŒ”=ÀþìÚ29^V‘ÈA04‘°ÿœ<|D+¤D¶ÑBÄÎxÎ@ûÄ9%°'ê5žÅØ8š¤BŠ1w•éPÄi ˜ý©êÑþ°Ö³Rãì&,á´U%´ÜŸê=»m¿4ü'n›kˆ£Ítrùgë´îrž1-®®Æ×^óõ§1b×£ì[…•E.\oŠäLíëiÕ}ó•. ¾ê”Ã~á$orã彦OU9í,r­¬T¯;ßfXT[Ãy¤¸e@¤µRæ…)móíÃW H¤?¾vPÌrj E^VòÍkÚ¥$õ¬†Ü°¤ÿ Îãu–©ÌÕ®ë$ø>=àîp»µ”“0ÉD<‰c¬|;J/{­:'J#ò´œ•î^CaÊÁòAÿ…9JøpΩ¿ExíՌ»'äˆ#H¬Œ¨“£Ëçã5ÞÅÁÜaÄ£œŒÿBtYÖ‘u™Õ²üºHÇžÁÚ—Ö—ÑÖ— {-FEŸ˜§. m#ϳ˜«»¢¨fëÈ®”û”b§ÊUY”o–A!‹+Ÿè/:p`]OÎñbc°„_‰Î²rñXÎ:Ë=eJ,/ûTc®BʲË\(lM±ýcÔ÷`!Y8{üŒ(ìŠ0.k w€ ô'3ÊÁ`iª “jÃ\ÕVsu^†ƒóNé2*ÕóCÏ€qŽq,Aµo—‡ûzØÒ¸ÐGªŽì1 •©ÍN<¬Ólœ^ºùŸ`%‚õ‰¦3x‚3Ã`Û.–²§¸eMxܘ{Èv8_òQ¢êέÀUYåIÐhòïÁ|Ãçqñé^¼·k°pV ¾ûߨ’²|ñ°{±Î†éyµ ãf½C0&NØšñÚˆ¬úƒ³Ê1–´™DćZ[„Èäì¼"ªb,%ï¿L[QÇjRy"VÝÑóëòuݵY›è÷]¥›úÒýœä¬½ôâ¥aoÓýœ¼Yiz0Ø×dÅbÞÏY—!7T¥I}YeÖkøV/Ž^(öÜk–¤—rr¹¶±mç:oŒ*“:¤ÒCÄ“áRè \ó…yªEïÏœ}w$â ’âQT±@Jµ/:ê¼™ã¼>¨ãn<ð'€ÖèÜ’éì#ðgÓ«}Œbko)óBïº:°²Gˆø¼¹ï!z²"äÝÙðukB—þµ4ç }H!Êž! Ê(o=0×>bÀµ(9hJ5ËJiÕ[æy-`R‰KrY±Ê#©‹Ø–J„$Yש˩0'•ªK‹tj<—¢\rÂtဩÔþ¦’ªw9f²ƒñìà:íŞұ‹ALj&k·k—® ÀHjÈ:%±HTEì¢à—v-|òÉ,Ý¢$_ Òµð±£ÿ*v ¤et †.ÏÄX¦a•ëb’ÝÛ%*ß]ãôvÃìon? ²#)ƼŠqþËo<°¸ŽƒI>p¢9¼É‰ IN‡å1û<@0¸’Ø Ó¶ßééõøÆUÉDœÄDœÒwØ¢ç<<äq" 6˜“ƒ÷N×wN5K"ZÃãÃú«f†À瀾²Bu†'À ªj1½–ꉼäôKù8nsZ2`‘ã¸à6¹Xw`àzcôØ(ˆ©êa=f±gð«C] ¸tp† Í'ô3µR=?ã>y`‰‡l™ÕÌ[Íu8õ ¸ª2Ú“0›¿ÙK#µF(Û/´Ï_1å/ò 5€|tTul™ÉfG”Gײtåï3-ºë.ÛݲÌËã%æk“/­ª¼ê{Ç´êH‹³Zçª>j‹"/úZxì=>SÃgœVT*WbÍZn!5§Z¯s¿ëÔÝáôLŠk‘h­Êú=ÓJÌgìmßv @ë¶?«Bî3Õä–)ÔƒÖu{éAkŽèA뽨µåfŽÌŸv߇Ö&¨ òé$R>Ör7‹ü­e.·e§§*‚„áõývsÚãìaó?fŸxÕ endstream endobj 4143 0 obj 2842 endobj 4147 0 obj [245 /XYZ 40.7999999 423.379999 0] endobj 4148 0 obj [245 /XYZ 40.7999999 423.379999 0] endobj 4149 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 387.859999 160.800000 395.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 4146 0 obj << /Type /Page /Parent 2 0 R /Contents 4150 0 R /Resources 4152 0 R /Annots 4153 0 R /MediaBox [0 0 595 842] >> endobj 4152 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4153 0 obj [ 4149 0 R ] endobj 4150 0 obj << /Length 4151 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň( dÆã9Ø@A7›`±³Èdùû‘ZêÇýñQ")u·lÀ3n¶¨bU±Xo~úÓ×ìÿõÛþÓó×ÿì¿O?Ÿ¿îêªVõøg?üýáò®+ÁÇ_[ÝT¼þì¿¿íÞ÷ï»×ÝkÿïûŽ©ÃƒÓ~ðøŠqÂß¾ÿºû4¾|7~òõù/ýoÿÛóýŸûÿý¼ÿÛßû?Nó _xÛéN ¿ü2þÂ8ãºÿÏåoÃà¿wýÝþ×}˜wø÷ÞµL¨yp¼Ÿe‡¿—¢—Õ{Ñ2É{ÙðOÓ£ã¿ÿÜýÔÏv£ê$c­’mlí$ ±Y+›g"ã«ö°H!çJ›ÓT³ñ¥jf¢"6oiGÌã©È¨Wjä/®›ÙS‰Xµ“i¤Í"6oiGÔ[S½&QøY xw<øôm÷éK7(<ß~êÁ8hMãoo;ÙÿgÐúãñÛûß×5cØûyÇx%EÛŒjÖ4Â#mUwÆHÝFtÀW™4¾Zã¯*ó«Ï‡äùó¬6_'‹¹˜½£?k" j,­Ua´Z¯ñ/ækÌå9ðL ¸=½>| *δoð«Üä#?Y ìgŸpªYî`,LÏ2”9½&¬¼¾cXé‰Vñò­—€yä™è¤)Ð|û+4ýë4°дW»ªïÊ—p¤C#õ|Oë #dº~ÄG„€ˆjŽÍ 9Ù!ï ˜± g:|û½FšJpÍx3Fþ,#Μ˜Sß+q#&+²977ç#lA¥…o ’Ž k´0U¨²šIÒ;,ˆð–ÅX ûƒHžo+ðe`ÌÖû±Bº¾Pg´%–Ótè¹ØT²¢­½ærË“j„¸Ž%ÇxZÁ ’­P†³´Ã—@Ñ©—”ºüª1øfSè2)t7?ï:ƒŠÉI|¶s )“B°™IÈ«˜åIˆçœÇ…0÷ýŠ3aæx茈8ØWâ-¦iM¯ÁzãúŽRÇ2VvüªÆÜ J,þˆcðu˜Ø"Å–<öL@¿€Ã^‡V9öP‚ +'ˆ×g‘Ó^o˜)è3¤÷dŽÈk¾Ð.¹S~»2Òä#æ1êój°‘;–Žó+Ô·b‰ÈßO¢aB²á*c)ÿ%E]¹Ý*fÑÙ¡³­D˜Çd•!lH8Ž9¦I|k–±®Â‰,6ÒI°£—c@˜b7â8‡W s˜=ã 6Ó÷)ëó»™(g}DÂ-TÙ“`~Áº 7—c¹ë0h„÷н/gò¹îÂÕ^‹G-TRN±çQ^%:f’ˆk§òÕ0êѳq)®&uäêa»k¹”– \>„m¬MCØn³´ ¯G$ÓÇøR4~üb,Þ$/;¸ÛŒ˜_Ö1jlg:zà÷`[›@í­‹{)ÝH>$ìÃ{{ý]Ö+;éÇoÚ‘›<én ˆ7ʹÉÁrrð6å“HV …ÚSÇмL–Þ䇴e,ù[=çVÕ[Gn1%Á1ÂùEÈTލ¡'JÇÈ'÷ÇóSzîî*ðR“)³*)Mï>‘agA„]Á„v…êßp. ( ºôN;LáèÈHΣCKãìXmŸæ )\&Cw5^ùÍÁM~ …Ýsë@ Œ2“)—&.9’O°A“½ƒ¶æ­)ó¥ƒvþEkm²!¡´±ö]wQ ”5C§€«¥¥Kgúd±„7A!eŠBÁ’Á`-Úé­‡¼°kºÑHíY°;Žqú"â“'ùbw7v€BÇ1%œ°…aœÎCȽ%Ã0ºQ~jaG6^æeìânï!`žûˆW4ëÅ®7à‘R °Ó'êCØÖ–±ØNÀPSš}Aìlåë.—˜CðÄ圡ðÆŽ#¸íz¿Ýà0¾6ÂlÓ‡â%¼ƒñö0RL”´»ºâ ;ÛÈ6²ÜðˆÄÞ–BÉQ“{›þJÉÖ#ð)^ê|wз2Á©}Xc"ì¹5ó«HìØœDA‡à[pP ¿‡°ÏW¼S8ÉwìÒÇFú%Ó:»æ”Ö‰±P(PÆëúè^œÜª!ù'3ÂÆkìË“Ë1ú(t¥»úc×¼édgÍÈóN{‚(ŸÑ†“DBªYLűÕÛ›ÒdÏÎsÒ°’tz]æ~Q+cOoŽ@—J·¹ÿÊq¶`!Õ«’w¦?EÚÛ-:ó•\BnÂd&›0¹NŸ;‹!-)Y±O:æ¾¾Ò¯ŽfGÃÑ ã§ÌEJ %µ8iUÒÍ$»3f"|Kv˜Ò­Éš–ìžØ’%³$WáÄ”ë„;V"®Q!åñGôö-Ô­.i{6‡#‚\ИÇE™¤&v÷à`6L&ö¼[^·§Ö¯7ÙPÄÑšy8ƒ£0›Ï戭$µÜuZ[:Ú®Tb> `”c ¯”Pïà˜ SŽ’õEhÊåPò°ˆßCˆÍ“ HÛ‚ÂñI£ö$ìàõ⌨1F Ulž6× ¸yÚîÖÓVF›ëŽÕ„ïɬ§œ,‰BàKG•æ>Šö³ø¹ëØ›B8JVžÃ½C¨Ž¤Hb’LKÚÆ—R»IŒ©M°o@F'Ú Žö¼7,E›#ÔQ§Õ[Wã윈Û.R´ìFQØÙHp0ÛÎðˆf(áæÅüå¤Þw-;ò4œLѰï–õ·åDxž#îÒôoG÷?‹),\QR3SvÉŒhg+¢R^&Éœ@P"bÝnœ›£¨ÞEnódsEªdm£Ì]–¬ÝK¿³»ë·¡¯ìN¯3ÂÆDÕŽÆYL´žÙ2"—Õ&v'¿…®$7á|p>£gðl|d}VWúØxoϪš:òYB¸©¸jÔµj‘+°M‚îÊ{0­(88vÆgXSi£Å  ®ÂæXÏgøžnRW„Y³ƒq1zî¾/¦JÇž=ç`ÿ80¿¥ÌÏ·ðOœÖ“Õ$Gf䕞¨g Ü >¢áªcn<Œ¸î5EÎMD>×mfùûnÎJ&œqíi’ 4bú¤ã6¦@ûÛÚ†_ápPaXÍÆª3î†]°>5ÂÚÄlqµo¸\‹‘§cX:à™ÔÇãf†¼Æ#./èã\¹Ó»N^²pnrH…Ò—]¶“$,S.)°UDÇiÿE7äd ¸l×Ó§8 #Ü»yJÄ‹x ucj͸åĆ«3žTæÙ‘ý¼ê,Š&¹Tì`m”<'Y–û[.C»—¤`H1~DCoÊÊSWû£wÌ2eo[åˆÐ“½÷Ù9túùq¢Ó†‰Í&b×gb÷4;L¾ýÛŽ©îòƒ_v_31Ëð¢ÜR&”uq}ÈÉ«;),·~¾õ“Ü ñÛŽ·­Is,Åóˆÿ„Ü.8áÏœõ‰¾¦F$Êót¬÷ͤä[=Ì…Ç¥nqä+êRpž¦馊5Ü8ÂŘóq, ðS:½]Ð^x()=O×jB`±9iø*#mÕ®c¥Ü½„yË.Š„Â‰#8c@Ú“2i ÈŽ[(=vJÝ7@Èú_ùMC\´Ê¿º­fqKE£î¦ûLE‹’øÛ.qÑÇÑU Ó”Ð)S;­‘ØÞ|œýC©™§t?ÁÏP8žÞ]/n¤\‡t.º9·n=ðRh =ð¹dǦn{às)Žw+”èOëïÉOÒ†’ÎF±GÖá’Ý Rìç$`Äq^S|oIû à{jÓÚýkö¸sVŽÇšúèetøj±œÆ!ôÎØ"[€,…nÖƒÔð9žðR·‘/OG‡î íNàXï­çe¸â«NzÓ`Úžźgl>ÿõùc‰r›÷ï‘x”ÐãŒb“ú•°ó8ÜÊo[ä:FŸJÚý>]·ü]|Jt&+[ ¡ñ·(ÐÚ¿G¼†PAiÅïÏöõ—98jÈ"RSS4lÈ]Ž(㋨]º³%‡“”ž¤ g‹Ù¡)Ð6G"d©Ö#Õ}®.?˜V?æMcÏ_!ÒÔ­qšÌ)K¹J×bºD쀭äbÊ}WO¤©0tlA«ïV‘{ÿ$3Øg‹Ê?`T>£€ÒBV²†Au§[ÝKåâ@*4ø~A ¶™á^¿ñò1”RôïÁx“8¿ ËQ‰ù€ÒYyÅ^Ø¿woþ–-bÖC–«ðý©ðÞ©µGÌZÆýr1KJÇRÔrФ 'rÐÁgÐdq\Q"…¥d…Ã×¼¼¬(ÉczV¤ü«èt]:J¼i5ŽÅÏû’»[Ë9YÓ[ý£SKÙr!V qõZIÿêÒŽlÕ`[ͤ{Þ§w9ê”Øv‰‹>[tæ£3×xt«™\‹ö¯…óióo²Î²$MºzŽŸµdFbÇÙ•·ö÷ïýôý£Ã×§ßߢÐ]ô¶{u‚ê|Ô‹Ú³yW–(:¦Æ ö¢–ņR•ºÞ<·“ÕHKÜò¶j¯§š´WFF§‰Sãä¦Rc¾†)¯½GÃg:øÌ¨F´¼âµøØHñ Î6n¹ËO>ÃïN #WVø=3)0×FZǤ\Å=3Q,fí——ŠÌàºáwÞ°“{±øÃ4…|0Q|0eì]áƒéfЍÙ&åôÊþ™T77AÎàOY¨|mä9 ýµ®UņäªPF`P \fǼ¦”Çû×ÝÿÆ8 endstream endobj 4151 0 obj 4310 endobj 4155 0 obj [246 /XYZ 40.7999999 675.859999 0] endobj 4156 0 obj [246 /XYZ 40.7999999 282.259999 0] endobj 4157 0 obj [246 /XYZ 40.7999999 282.259999 0] endobj 4158 0 obj [246 /XYZ 40.7999999 675.859999 0] endobj 4154 0 obj << /Type /Page /Parent 2 0 R /Contents 4159 0 R /Resources 4161 0 R /Annots 4162 0 R /MediaBox [0 0 595 842] >> endobj 4161 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4162 0 obj [ ] endobj 4159 0 obj << /Length 4160 0 R /Filter /FlateDecode >> stream xœí]Yä¸ ~¯_QÏÖc¾€ ÀNwO€<hÌyòÌf,2‹tö!?®²ëÉmQGÙnõ,¶•eФx‰¤>üñóßÿüíøáéóŽ_ÇïOŸeQÖåðu<ýûáþ²-”~lÚªÝéëøõÛáíøvx=¼öÿ;ˆúüàø­¼¼b˜ð·¯¿> /? ùüôçþ§ÿåñOýo¿ÿú·þÛOã|§|;´]}úáßÃB Ùö¿Üÿtü×á/¿;þڃОç=ýÿÙµJ·­o×GÅùßý£èeåQ5²SõQÙÃYõèøï??÷³]Á(:-DSë¦\gˆ„ßÒ.¨ÇS±Q_Ëî¼LUjß…^¦òÆX§d˜‰N ¿¥]P§â¢^‹fà°Vø¢þ:•/Ætÿ{˜‰Ä^KQoOõÄ7;àxðã—ÇOÝÉæùòsÆÙp¾}ùvÐý/' ÙTÇ/?_–ªþÃñË/‡®hꪖÕÙÒFdsi¯(åùMQvª©Ê»–Oç}ýƒç?Yhã£Ob¾TèÅ ‰Úü¨ k© Dæ³öd(Y³… â£/瑪·…[ñùDè mÊ h´?ာö–Ï.R)N}D9~–#AÆúï ÉE±%J9ÈGQusá¶o_f7G@­¹‘­G±lÿ ­Z°…{Ã4Ü>†[öÉĈÔp¤sŸmÌS#ŽÀ÷”!mlÙªÊÀ®­ö—[§Ú¤q°íý•ïQ„Yfܽ˜”n,#àÈ“;3;"3uõ,3±ls<‚…%‰Ò”Ö¢\®ÝÔÞ X›Ò\…üÝ–èNC«® ëÂÕ5éBX%qú%…Š:³½:Å@¾ó¦ÄÁ:EÂ-­°†‚:ë!Bb¨9b IŽöä@­0ÔX|â÷4î`u@X?¦Á(Æ£„J„Ü+!¶É0åÜËâ*L¼RŒ7HÅ;êcB Y×’5Âðj=3<†·¢Kø äK‰ŸP ›ÆÏ`ãËÁ,í’I»5K!Õ%”5í5ä—HÖzcã R8Ë´UÈ4 tÛñJÄ57ˆkBÞÂõ°¬$(Ÿ0F7‰sâmRn”ÞId´(¯±„Tö G®§ Ðeû6ë‚]I”¬ úgðÁ^†KÞ8á¬ÂúRyH|õ ÒÌn LY`¶Òbåðu#i G.ñ¦2Fnkù37õc=ŒpMk¢cX´PÅpØ~G›fÌ©¥ z -´4g{³=¡gðlrر¢,†ŒBKÔ…:ØÒ¾*¤™†x“@&l£¾™xOXÜt”…áQÃyÎ"Ôp¥6b=Ïð=Ã3M¡ºòû÷`\cŒÞlˆÌo.ü†©€¡&øb‡ iÃÀ~Ü ©p-‚‰aúˆWÉ“¾'o¿ÍÇãÙ²4æsŽpnÕO¥00ˆGÞKÊ%N1pÉ~Å Æ)8# ¯¾‡•âƒÇåIJœÜI—$e+ó„‘4beaheò‰Å8br­)šñ~Ý»©Qˆ¢Òõw›×~1&[¢Ø©=8cÄ!“s!£4 hm±yçR‰bj‘V™jdy²K$ª)ऎ;@2_sãÜiV…‚ HDc‰ieÿ¸X¢8UíÔ,Ï q/Ÿu5& †`Ëñ[~#ïG¸bÑexWš2܈“U.ÉÙG ó“C™;j;Õ ‰„-Hzsæ²ð!.BÄM)åúD¹%>ÒÀ…WœÃD¬XB(¬ïG'è¿7µÌoħ9[k[°ÖÜJSÊN¯w©Š¤1Æ<„XF3Ë ì0 „s¡øŠŽÑ§èÑ5o„ìÄm8v>ÄѬ(ïz‚ßöÆïg³ìVìÙB;·” ¬m÷2ö6Ñꃸ%–£Œ‘u4¨P^­0±tàX „ÜÀïÁÖƒÿñll؇#I)|m@®Èü[õµñ ßàXmAgcy:˜ª } ­¯-Jp,ˆ"¦ÁiΉq0m‘ …5_ß!EB«ÅóoT¾Ï3';'UqÖ{×¶ÞÎÚ#4Í±ÐÆB×Þä^· ¤êÛH¯@Ö`{Ž!;+ c69çó¦á¤®óऽµºÍ{³Ç?ñlœˆŒrâ‹’/Ç>Òs/ç’ bg1¤]*S{1¹J\sCFlªk9¡ƒÁ3“TuW×sì3Qí`eÌrZWy$Ú­¸GTœ ‹M_ŽžbœMÛP_+ÏAºMÁu-èñ°š>T. W-ÞÆï}ž}/§ÞAlT{´•4µG¶½‚Ø^‰šÓ­ÄÀy˜¨‰ïßÖe‡ÐâÓ'ŽÕÅ«¶„§u}ÍgH•© cdŽaØpNŒnjÎ ÒãOâSѾãMã+êaÌç¾r²úÊ­8ÿGísÞ¹Â^Ü–Ú8?;h5WÊ3íº³ðÎkáäÏ$¢A“„§ð9~<®8çò©dqõxY‘’ÇTëÃc8›bë‰uH¦òªäŒdK`z8é®k|jCRž]7]åiØ–ÎÄlPfçüPrwo2ÛˆÈijqü°•Ûì­Ð‰5UÒÕ)Ÿ ž“äêçÜó€–cï¦bzoµî¹ço×ïÞÏæTõã]’Ê“8Ö€9>÷VØpo…SÄj,ÀõpHJÇÆçÔaí±“¶Û ¤Ý5i"YBW_Ý»!X'ô%§È4e<¯ ³F¹ªdEÉ{ëM€ “‰§w¸eÓY­ ˜^Йxùþ[Hüµ$wè~ìÒÚ¡.'uÑÔ|rá|‚ÿ#‹&ZièŒ\4‘‹&xl8dïâõa1TrÙJ8Xü½7»É+¥êÓNÓ=P—W^ƒ,åðeb}j䂟¦2Fn‡g|¦CÏŒŽPEcØ”cÐH”ÅpU µÅšB™…5£Ð¯‹ñН»Ù>BØz‹ªhÍ{ÁP«fYB4Úà‰1à2ç˜ò3]<".²Gš·7ŽÑ‰‘q_·…¶|‰0…©H¼Òw´&Ö3ºP½‰Pè¹¼@*ÂõŒi#F­s2†ãSï%W°Ewqu©®^µÃ¥Aª€—›Gë¹ãÓå–Sëv:‡Yn¶‹R3˜ú Ð-]ˆ½»þQ7ûÜç²-–ߟç…EÎDñ}Ѻ5„»EmÜXåjÆYdÇ ±Ó=ò°heÈ»´JNm´./Ç%0ñèëo æ˜ö˜;9ÎrØv>MpàÀAõ/G,“Lq-a«Ls—HÁ)x„ј`pgæåàfЄ”ps¾g§f±ïeÿ‡8U"lÔ ©¿;å®=„΃8ãñ?CàÄ=$7'3rç;Ãz(Þ0çÎq·Çt-ë•ôrÕ¯¹´$B͹|·NµcL‡FÔÆÎ\Ç)LÎ ‘¼Ck–%Y–¬\–ì­‹À#e£c©7IãRØÄ8ÑZP[fÙ«ë) ôIÕ±Ž pùérz>qÒªiC¾DD.;ÝJ`pY¢»JæAG¸ä²3âT(Ä)‘V³«ˆr+Ø–S›î@»ö€²‹Ý§ÏóOœÃE»žÖ Á°eå³¢œUº$R”膑 õÂñ ’ÑóQ×{lpÄÜŠϧÖ:CLÛÔá«Ñ8"ÔnÉg 4Ì¡®Úu9"t0¢à$$o*Ñl6‚¿àf:l¹Í'£sögÇ8p}©&Ê#¡‰x ´ òÓù?j³‰j±nr±W¸ [²?Blãg.‘R˜ÇòpäQ֋ϹeX‡ ÊzVønŠ¥>ÝoÅÌý¦8&†WÙºNŒ‘2éêÆP&Dt‰AþP7šS>ëÙ'p/õµF×!:4Ëe]lJœEŠR8SŒº;Îå3Ä!>èa³Wq®¿áƒ1Žšâɪ6(¿ ÙoÎ LÐȃK,>®§”ÃÙ¬YÕ)“w²a— »•v¡çP‰p¶œ“ðY¦a;rx>É«ïÓ€kÆ6}w¢˜aˆ°9ˆ³¼æ 6ÓðmÛÑkÒÚÖt6|JWÏ Èã2ÞÄéÛi „Áþ¢C†Z¿¤ØƒCèX–×Ú›ìC­Ç‡šz_¿)—ð<-¥ÏE'%¼É•‚Ùm=˜_0x6FÚ2+rR`àõ0 ͉ ’Â&43Ší‰"x÷ Î…ÔœDcŽd¤-çî[ä>}7 ô„Æ`\%ÅáD–.ÁWwÃg*ø<º´:¨ž½Ñ4v„ö¹h+¬¡™£)ñ3”B„ô†\¡°\ÇÒŽcpÚß`ìp8–5Öü]°«‘aq féP¬«±7ƒ)‡w Þ °¨Žuµèš‹ßAèêMr"Ñ( GDÜKPs-çŠ=Ž÷³4~fýZ3¥Y/°=Yšaã8· ²E˳˜²„ÌÖÛZ`èwÎ A†ãðN*KfÍû4ë÷YýÞt³æhJ‰1‚}0ÌËœs'ΩæK†Þ娸¬6Y3!øéÃû ë|®¡±½Ž%$×9‘-Œð'Á¬s – +Útÿ@y@à:ØÝ» ôn×ή!K®,¹Ö.¹¶édÝ,búpx¾G2lP<’R³(U{hÌËxgpÎw ΈAhÈå„ÿÁÈKæƒÁQaîðáˆÜ›:X⎭*[èá>{öÌ©‘|ºn ËV¼“[«?öfñ†³¸‚ý³7~{?^àÞ(Ǫ‹JXýÔÿçã™Íý~<÷e ¹Õ}8±bÝå’ÆanWJqäòs:HµZO5 ŽÈü›ª¾€c;sj9RÅÂV“0¨@œb*0" ¬œ+N+£šÅoœÊµ‡×¦p(GœXcØ8Wqò„ƒfÿq:;$«ÝfTÏòõY·õÿŽo½ëÔé㷯߭f«Ãò¦_I…H>:«IÛú(úeLöMuqîPrT¥þ~™u]ÔÓýÌ;] ˜±ŒuÙÍôÍÍÄÈ f•*d7yNUõÐæ6ÒÀ÷´ð™>3°T# YªÓ)¨¦fØýþ/Ïð³c·‰~BÏŒJtjD uŒJÔ홑b.ka;o®;ý,+Ñ\f­ þ0M!ŒщƤ› >ï²qšmt>&öÏè ÓÜ9CB> endobj 4166 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4167 0 obj [ ] endobj 4164 0 obj << /Length 4165 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès€í’( °/È!ÀbÈ!È!XÇ Œ¬‘‰ùûÑ´Ô=c²¿’X|ˆê¦ xÇ«E«¾z²øö_þ~üç¯Ç·¾üçømþó×Csjºfúçøüï›×!ÍIÉéÇÞ´'9<ÿsüöýðt|:|>|ÿûtÝùÅùñáåÓ€¿~ûåðvúøaú›/þ<þô¿£<þiü¿ŸýÛøÇóxÏ¿ðý`†îù‡O?)¤ÿçõOÏÿuøËŒS0çqŸÿûfœcÛs ™ÇÓõUqþ÷õ«ècÍQõZ·ò(„çÙŽûß~G»Nã4h!úN÷ÍêQ{ù<¬ßúîh„vuÖ¶n(:Ð`TœÄ™AKî顸¤oå §eŽ;¶Ð—¡BÒ:éÏ3aK›IO Å&½ôy™rüB(Åæ¡‚)Öë8âsž‘[Ú…ôx(6éû «*L±X\?ÈX{8±jÈÒ.¤w†úEÉeôD¼øþëáíB+ó¬{¿þ4Îä¬À§?¾ŽËmož•R7>ýñøû¦úǯ?†S;Œ“Ÿ4þÒ“¦õB|§O|"áŸ|@OÔ;ÿ¹5pnÍ'øΠÁ³ÆÔéàh:š1š0ðIg0øÖà]€£IÈUÏÓ î¦(^ióžAQ,%p4üÌo„lcê0øšØí¸‚ùà#”(ÁzâƒO_GìNŽÄ¦ AbL+̱x\NÈœµÂ³Æ¼Œ¿Q¨êœªsªÎY¢æD‰¥‘ƒ;x4ˆÑ RÓšCÎzƒçU‚‰`)´&h9D1t–zŸO»¶Юœ'xï·—¦Ši¤œýàÿD1¬eLQ5%ÆÁ\ò¬†ŒR+U€ªgªå嫘GrÎÇ4‹ó!¤ÛŠXj°¤a΄£±ô=æóLö2G xéFÐï6^)ÃbY]Ø?ƒè)¡ž ä,§]1 Il„\ûH gÁÞÀãØ/-Çg >1ÃëÈ)0™-û¸Y"þÈrr0ó ñÇ®Æ4ŽÿlÇ’Ž#„Œõž ä*üN ¿ƒŸT_¶l]°k_6.P}n]€ý¸Ã}ñnEÍ»<Ž–Ø>ÃTíè°SãwvÉñDÃ;8Ö‘);Oð(¦5'‹Ãˆ_»PD”´kCj¸¨Ú "qE⌶GÉ^Óí‚̈Ä}H W}RŸÔ'IžàüF®¨1¼í¿Z{ÕmØ×«õ™UæÊ¹2<á^„Ô qžhÌåp”—3æÄþ±gϨ”—x¥œjZ¼R\G„ã²8cÁ©æH'²…׃é—Ö8"ˆq0®žÂ'&g‰X¨Š¿÷ÛœLÞmB°.`äÅ1ï`«DcŒWŠq”A7Ž4æ¢¦Ž‚XEh&Ž-ÅÈ`ŒÇV#+ÃÆ˜5®$h]­Æ¬F¬Y^§28ªnÜu…†Ÿü`‹8§½¯.U÷µÞãþòuDU8£ZUáj2òr+2óò>ŸÔŠžj;TÛ¡|Ûû‡U~JŸ{Ë’ì³ãŒ<€ 9•÷@q›ÛR5ƒYõaú°VT“+ݼ¢ºŒÓ¦¦É}Ú”õ$SW³}âíã`‘GŽªw‰ ¥Zy×hF'âIÔ˜q\”ÇyiäônÚ§®.à 42÷iàœžL—û¬ÁN}Ü‚5Ãã`_É}lˆHuéÞˆÉÝÕ’…ŠU Àš/#eûÈ9£ãáöòsoY¤2,סÉ}Ž!§å:Ȫ­¬3Õ!59Õ^®Úúíå¸{uòí®”¯g§+î”Î×?=«ÕÖ]¿š¡ü&£›çÉ´£¤ÙLßµl_³è”26—õ§ìŠ~ÙÀ)‘(äIßfÕ[ƒLÛ¤/¯P3鬿ö_83šÁ ;IaÖ~×ùÌlµ'%ø ±ð²VL­…pî¼ëA´õÛ7chN]&× ‡~Zš‘»^Lš.¿£í­g0”)<6‡ÁbÄìáüU8È|E¶×—ñ”ÖÊÔ E“&H‘RUôÆÚÅxÌ¿i¤ýM,XÜl!žÏ§ qju÷î]’r{Žß¹ G#,û ?Ùlÿœ= ¸Ni¾*õÕ ïo+™W{? ùsL,,ªó™õÜ-8¤*“³#üÕÙEèÆþ G‡$F"Vá,x=8úØÛÉΠ”­pªEÕ¢Ž*W‹SËà:+µ(}>ª»ê¸=è¸\ì±]fT NB¸Jg>±ü«xòø ViŽQ½žâÈ”™Å`ío†oJe³|§÷ íÛ#]ŸÓ÷ˆ¶¹)X¶×ª¶;«jKT…R=DLŽÏï#M;MK¥m;&F»‹{)SôiM=clS žªkvwªN4®uµ¶è*CÀ\XgóÛ‹f!„EðÚá¢)À§¬}ð(ÎÜ/)ÞðÊKœ—š‚L m£+4në›v v * ãtÌÁ5Ž'†§£!ÏŠCéÓgnyâ1Z¯lžkò)sõÕ£tÀ#r¹|æy™_·è‚sÒƒíPíðT\zS4ý²ˆE=wÁpkWp+cçBj:wuNJ8þœ&]Qœ<óÂÒ:³Øâ”Sâffs†ýªJ»>Ž;R#À}:[µÖºÓJ¢f ¥çÖåznÐÙ£ôjãuö.žØwç©u~¸/£&:WÆ,bK ´¦ÓÅÉ“ÝeQ™nžŒ|ž[çFXpDà³Þv^í×"¼ˆÅ^úI#C­…娝Ùãºæb ÊÅ&” Ù ‹Ã–û.pÍø”LbxÙAûñ8NÃb¦ÐÇtÆÞÄâg=o¿»|ùQ ‘Î)UM/mÀöp‡<”v¿â9KyÎ=$^Ä« ŽAàƒPùm&ê5P„cR ÷å LsÚwE¹yh›6ñ)k~GKÕ-ËÌ”õDKX]ŽûûøÃQÏx­0/ššKô¨Ç}*}¢ô÷‹ÑiߥTi¬‰{”E:ÂX¨à³Ë‹:!SÃtVÁ.>«@ŽJÌ>M˜ÁCâ2ã>ç|%+ ž-úÜ_.sŒ}¦ê«=<NÁzÙÁH–gå8xž¦œA•›Î}š1Ž+øÔ\­×Ø!íÏ|f‚#'Ç=ðËÇÊä`Äu»¡%…ËÁÂ˨v§{KãD ¶&®d1ÆVPwò!Î âœ~‚ûgâL"£Ð'Ûm/5ÿé 7½ê-îן2Ý܃WÉëéÏR>pOK–`ά~G«²À—zÅqŒ1aLÛ%—W=õ€zÊ‹{Œ\øÜ#sœ5§8ñÎJa•™Ä+{Ó”àÖ¬UÙ®²½ ™¢EWèêN-·@HE¬C ܈ÊËUóWtØ/:àîB,NÄ\·‚#£+ÇÞ'xÏÎ@-abŒ62£Y¸Îx‡ebIÇ{‚%ã>ylc A7"€“ÔÇŒ3•ñ¿º—Õýµ)IxwÊäÅ,›uÚª&7rC¹­SÅ9ƒË­¼Ö÷a#„ιé»ÙŠq{FŽq—âÜ´—ÒQø8ÃôÝÁ©ò[ëÁüÓõÊ áCŠ 3 S‡pQñÜ» ðN#W¿1Œ©2L¦Q!†˜åµitmMóÿã„A Õa;BB‹ ë)œ0 ¬ŽÌA,6´ö{2dÄÛîÚpŸ£í! q…àKüF’ó˜ç*àœ;l.~v΀B'/7Ââ {ÔÑXÖÞÕŒvR§¯Eƒ˜V˜g1­ –(€µ c6c=~Á~6áår8Û—˜¢œï0Š„FãhƒÍ½\Bj£&…ªÇJî\&µôð×­ðX9€w‹ÃÿÛc Ö¨ ìlñÜ£-FÇòpR?p‹û ÆòŠØ»ElÜöÆñÉpäóöX±÷É@oNÁ5± ~ËdÉã=-#öÑ ×¾”=ã^,g³%áûć£õ´îÔªsÙ×À#ðmóà)WbŽ{jdëßÊ VÚÛ½<Î¥õáâ´ËÄ'ò=Ú;,ß äÑån½ø-nhâK\ÛÞ•šk_©æãj>nÁŽÝ<—áBV)-Ôð¹ÜÔV-9—œFíñ À²Œi•Í2÷Ôl,õ]“!ÝcXÖ–s “½'.wAú.w»Žs‘ÇÝšëÛ˜å¬B5/-‡[pv¬ŒØº¹”gÅ=q$Ž`Ûר2Ž—6 ¶É&‹3eÄ”ÌõP¨b4âˆ{€ {_Œ RÉ–m=Jzyã}qtAéùet¸‘Ð&KO²¬n¸ž{ ÿ=>ï>ÿúüÇ·ïÄ÷܉6/ýLN•|uq¦;Š‘x·"eƒèNg»ò¨šëå¨(wÝ©»Ý‡qÐ'ǧ˜Kö§þv¼þÆ“ÉCQê$+J8ûÙí©›lY{ão}ÇÀwøÎ¤0zy’Í9æn‹ö­Ñ& ý7áïÎÎþ€Þ™Íú[OZÇìiø½3ï˜ÏÚç¹ €ëž–í5ý$ZH?¼§fsÒ‹fÿèÌ^ž×h³rC~feFsä é”d—o=ùeÿiº“èG‡v-#sc¸“#âññóáÿØ´âÚ endstream endobj 4165 0 obj 4369 endobj 4169 0 obj [248 /XYZ 32.1599999 785.299999 0] endobj 4170 0 obj [248 /XYZ 40.7999999 708.500000 0] endobj 4171 0 obj [248 /XYZ 40.7999999 708.500000 0] endobj 4172 0 obj [248 /XYZ 33.1199999 783.379999 0] endobj 4173 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 718.100000 89.7599999 725.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4168 0 obj << /Type /Page /Parent 2 0 R /Contents 4174 0 R /Resources 4176 0 R /Annots 4177 0 R /MediaBox [0 0 595 842] >> endobj 4176 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4177 0 obj [ 4173 0 R ] endobj 4174 0 obj << /Length 4175 0 R /Filter /FlateDecode >> stream xœí]Io举ׯÐ9À¨¹I¤€ ÀØnÈ!€Ñrrz2 Óƒ89äïG*±ÊeR%>R”ªºº¶»XÜÞ¾ð‘ŸþøåïÕ?ÿ[}züòïê«ýùøåÀjÖ²ñO5üýáòaj)Æ_µijÑ ª¯ßoÕÛáåðÒÿûvàí±£ýÑ7ž¦üï×ߟÆÉã'_ÿÜÿö¿JTêÿ÷Kõ׿õ?~²ã _øv0];üòëø \˜þ?—¿ ÿ:üåwÕoýÌqÜáß$cZ+•´Ž·sW~ü{ÙMÆ*©›®5ç¢_gÓƒã?ÿ8üÜv^FmZûþ¾d&ÓÏÔcHô31Õ/Þ›¦SœëVi¶xñZ c !«N·•ê”7¨ÂeCñÔtÇ, +âi[ëÁ­ÃC‘A¯{¶)X— 1;T2ĆAòàpàŠ´­@‡¢‚^3aáձľ•:à:Ï@ÊxÚÖ,èCÕFI.µhÔ€†1¢ÿ]Kû'fëmwÜz#M2íPÉP4,'WÄÓ¶vB‡7ÔK=(Þõà[ ãÃëáÓ³©„ª^î—q4Ưýy?}¯ ;Y½þTýž1þô‡êõ—Cûñf¼Oôñ“öüh½¯tÎW¸E÷VŠá¢aç©g;³Qg.ǯÖmÓöŸ³‹–DZ«[ÅÚË>ì¶À>œ[tÝõ ¤›‹y؃»|<37öùµ§€4|vƒ 7O5SorH}‚®ÖBïHánÞw"ìYwÜ¢õþÁS›Ž}ÕâŽ7§Q\$6'ú äu£Z£}„¼OÌ[wÑÍøzDË娟á|x£¶(8·$<±±Ô*¸™°e©¨Õs¼/¸zΖ¯~9}à•xô1ºHxER¹£büÁ àé­Îü†#¦‰ Âå}S$÷ûFLCÁ †Írjô¡ötæšMòó\_+îñ–»€Åóôtk*“®u´ &s®¡„ÁÜŽ[(£%°‰Þ–Ë)'ð|Â¥7 ò,%F*Pе\„ÞmÍ‹hÅ1‚ØSä„}.‡ØÞòè%BI.ŒÄÊ'¨N(¤åñ¬+«=\ì¡ý¹ºÀ7Æ8ßWaž9!èi,ëDqqúnËØpWäË)L¢BðÒøƒKÅ.Y[vÂÅÊ,„¼bQA DÌ ËQ¬ä´ØQ«4Ö;nšý)æåÆ—ôÞZ15çØp„ÌJ2°,_1îðn¹JÇ >Y™uÞÜP\£xšÞߊl,¹rù8Â*IÀÔUñUÂÄ©"âb ÍrŽG]ô¢0Zuàá~eœá¯æ $eñžcÂp ÑšøŸ94üÃ°…éñî†n¸£*k¹`õê6Í5‘!ÄC=GÉ÷å®Ñl+ÅŒÖï+à˜îŸUrušdUºƒ¨x¹•æ›B,oz/ÚcKN]B® ÂZJòq–£/‹UH²¶×Á£ B—UÒoIé©ëÎ¥¯ŸþRÒо´ê©aBtˆäZ,÷|7ç§÷9§ç›F )‘˜8V&™HO[cI]H‚ݵJŠ”Âå/:œUª/`¿”[Ž$檄»¢¾é˜rõÍ÷«Ýçü²@†IØ#ˆH„¯‚9 "¾÷· OM´GÒ¼¤=î æËˆ–G;±œœ>CÌ-iDÐä&èü,UFq¿ÒI EK=˜M=tÿvj«.>øõðeµ³ãõÃ>â~}É¥p缆8ÀòàÅ‚°¿—¼ÀQ›y…KI|$äRN8‘Ì•­Ž:E¤YÂñY­0ï<Óæ¾OŽCé1kÅ$ŽCމ݈ÔsÊZ£1½¢|n„räóMèçUó¦âÝ,Åxúš«ö4åètõq;"yªå$Æuã´ˆ6¾ÿöéPŸSñ–¬Gæb4iÁ.Ü|‡-¡2µN[¼5ÕûXAÓÖòˆÜË>h?x6 §k jŸ¦`Wm¹©ë±oê‘Z½h@ï0zåp-‚µ]Ûú‰.näG’ÈñsEÂ3Kv6GaTW<ƒœ3£—çœGŽìsÌÁ¸Û(}@ñˆ R+iÐA>!ÉÀ›“Ðü1ÕbP‹zkEl]Ù6Ù)} …˜£óø(0ôWÍ̵Ô³çÀ ë:áØÕ†øðÝ:¬‘®ÉQï9[.Û›JȰχ¦qݼŸùˆf8š&Ý\õÄ`+Ç×ù[@Ì‚>"À•çLUî#n äEr”$$¬~ͺ¸Î¸vJı O¦fIGF„7gñm¬ËÎtÖä9|a]>Ç·ðöY?C2\:4i’®ïá &¶µ97(ªZåÖ˜ˆÂ½T†R*SB i\¶À®ª€-°ƒ}Î%É1¢ Žf­Ö©–8^[æH©ènîiû³unWºo]œ/ûº ¼9%€ŽŽÁ‹«©ȼ6‘‘ËæÁ+À-p4ûl¸'Ø"³îŠ]+BËЋ>׺ðH‰³"°ÃkDz£V Kòp§f)N@~”˜â0!îT‘íŽyˆH.çiãÓ"ÞÝc¼éƒqBññ~,¿ ñ‰„t))øÁ´üTÆ~§±ó\ `”Ïߨ•Á–\Å™ @ô{sç¢äÆÞ²Ó–Ut]FëaÖ–%aÈcûσ±…)rF@èEBm„[ðh óÙæ¶¼ ìç.½CÒ;€íBô†¥ÝöåíöpÛ^ò8ó^´ue¶÷h°sUf1 †qOÍ‚ç!Äu6JAl)fR<¿‚>ª:e¥7æ£öCˆVSlùb¶ žï·`y•ÖÅv&y•«z{k·Áv ŽïÁµ¸SHV%å¨( ‚=·÷§:—‡I˜å*ªyšçáͳO»9 F¡¸"xlعZëž±!"ļ¼ºJŠ£ä~(Y}œ‡çxmx?…ò_â3cJÉŒálå­Q9ˆRlq ƒg†%öÉváu7ílíØK¥à1¡†ÞÞר{Ä{ççðóžµ}€Þ(y6 ë½ËAÕÞ¤ÄÈ ÉÎRRèûá³€%¾w>ëRò÷“4ÙOÒÜsÿÅ|µû ±‚t½Æ ±õ5òæYë=ëP|¶I@yp—oA¹Cà’½[­P<XHÖ|1A’òáë”p¬ó6üm=Ú¾Ê«ê €F¨$¤ð½€4X«œÖH¡£’ynÉÄǽ\YjÏyn왓nÄ·’̰Jq:Q2c Õ<´ó¾(H9sœ—²·¿Å ÛÞè¢ÿ ÷.•¡¾&é–é’|¢Sr€·ö. å†'AÈ*íy§”[¡(y:F8Y±gˆ&¼2P„Ó/žÏÀ§Â`K n€Pј÷DнKÉéPè¿}pËnlä2ô/“î@¥@SEÖ³Û¾1%íøŠ®Ý~Õ{Ö›{¾µä‰7դܒ»w[^iYxw$«×åAZ”ðV€ ÙŠ˜O07Üš7A9ÿ³g)¿ÌbïÿVo=ãöL9|Áþøú-Àɾ`ï"à%(‚]g¥‡i+Þoc2¯ÇÛú˜[¨$;‰G›ölÛºuÓVÍ©z„Œg ]k7Ú?‚SO´Œ•²±·¹ƒ¦nÇp÷{‹†óاƒ}FbÓ¢LMï-p´‘.?y‚ßµ)‰>£>6 4ÕÂÑ>l,®ÅXÌÞíÚŽ @uÃï¢áN©áü0N!pØ<×(™“ª0ÌùäH)>%blp gæY°m kk>$Ë–¢Cö¿¼#î%§ô­^ÿf» endstream endobj 4175 0 obj 3645 endobj 4179 0 obj [249 /XYZ 40.7999999 561.620000 0] endobj 4180 0 obj [249 /XYZ 40.7999999 561.620000 0] endobj 4178 0 obj << /Type /Page /Parent 2 0 R /Contents 4181 0 R /Resources 4183 0 R /Annots 4184 0 R /MediaBox [0 0 595 842] >> endobj 4183 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4184 0 obj [ ] endobj 4181 0 obj << /Length 4182 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õð)’@ c{ä`0rXäÌf,2‹8{Èߺ¥v{¤þØR‘ª¦Ü´qiñQ¬úêÁbéß¾ü}ÿÏßö¾ügÿuøùðe'ÑŠþkøþáí/”o´ê?:o_û¯ßv/û—ÝçÝçîß—l?ºÆÓ}‡¿}ýu÷¡|×ÿæËÃ_ºOÿÛ«ýŸ»ÿý²ÿñoÝŸ†þðmçC{øðïþƒTRùî?o?ÿµûëïö¿vSðÇ~ÿþ … Þ©¤y¼¼>*ßoEƒ‰½vÎx³—Ruó´9þûÝÏ]o¯Óh¼ÑR;eM÷9´Æ ë½ê>;=|Í©û·Jµa\»·ÚOš¬w^W2µ#/Ú<f$Ó–&…qñ®ß*g¬~^°tëŽKwÓm_JÄ¡§d"­2mk7#™´²ÓfÀžš`¤t‘˜-pǹùÃ.i¬N\繯Ď‚µ"KGÇÉĵ ´¿Ð×ç,È©ÎÈùyðãóîÃ'i:9ìñùçn*GmÓÿxîl»tÚÍòù§ýï…æûç_v¡±A;Û«§5Zôã±åé¹£ÇÚ«³ºe^°Ë[poÏ …ãxØ¢+u°·[–ÏZáÞà¬ÅG ;áå?Âgp ֑݆+Åû£!‡àq"sƒë‰ìé'ØòDàkψ(Ö2#ŠÂ\Ž))/ñ3ŽÕ>ƒq°Ã¾Äòü)ŠWzóY+ Ff s‹ €ãHE1¦A~3PJJÆN,?ï‚aD;g¸­ÃŒ« šyu$‹â– ås)–b=Ž[ ai `9×z(ø¢á ¶©Ï"høä¹•êû²­–[™iRðŽà¿F¸?u<ö["ôųÆö;‡àmU=Q6æçEö’WJÑn·÷¼6 _yÐÛ§D„9íw'\1¶ø6%Uàè.%¦um^Ëþ¾¬Z§ØÏ0î†Ëæ ‡#اšÙÇ–+Ž©á(ŽA1íÆåYC¨Ò¥ÖpŸÜÔRιôY!ÜצÄm9cÎëì£0¤Ç!½>™Ã‘—m´òRÙ)¼\h˜ÏœÑÓÑ4¦'ã›Nzöc†r,}îUÂ?UOã^ÛÑ/ Ew8¿°šA‚ÚFI­“'D½á èÍÔÆ42zÜÁ§TœLŽ+ýÙ•v &{óÄ >p›û‘CYBP§š–ì& _q n×ãpÆT¢*w"ø…Kâ§Ú^üÚ×èä«¿#ú¯ à?iqƒZtvÔr^Úüg"3è™Á䔺q½?÷¦£Iµ¶ýÞhê™ß7Fž<®K-ð)+BM³‹ 6^žÁ`ú¸Fñý¬E6±„´ă¼JÛôé›ïÙ]Цd"¾—zÃt‡ãàguqip¯Î6Ù+ü ¦ÞyÁã•ùÎî=aÉIÝxšIÕØFÇN îuêYacýº?±ÀœÇŠ) a vFæ/gâL)>yÓµçY©N/Ó¯;¨˜ž¸7¼®ÉìçûùK˜n&ìÔguË×7#üÓÁBð3VÎ=é!>*ecM{ - ppÂKZ€Zx8ú1¶ÈÎâízÈ¥g".œ íH×ܰ¢"·A¨;åDŒóÜÊÄDç^Å_,ûd^ ¸¡¦ ífǺ1L(wvB“Ç“¹Ûö>ÐYJNÜ+äÈòÃ- H>ƒ= g„¥XóC®+)««ÃäÔD+bNPrŒ9)§!˜ßq ¶½Øm†u]”^=¸`p"•¹¾-ëZ—¤}™P_#²A×ñƒöøŠpÃ|š¨ÇÙÒv]Óã «%Ò'$ ÜÙ4«ëüHïL@o‰yCp“¸£çëøúKP!kVÊcý.@‡ ‡Kr‘!Ä á¤•Ã݃SlN×¢k´;ØJÝŽ¨›b #¨[—AdëFk`˵ÄãàëÒ¸_:¹NÔBŽvñz°zƒQäêsésä m,@Êù#ØË 1×U6ŒÍŠU”ÆŠ€Ù*MuGÎmñé,åÀøšoÍpfâNס†$ë 1þˆ¼`K‰U•sæj$õ½¹ÔózXàFI=bÓ­Á²r´‚÷nѼ'ô¼z#ÈË×Â\ø>.⪱‚/Zg-]Å\¦wÙu÷›ßý”«øøZ=¦(…C(—ô)+…÷ÙpiRr¼R\Ü {øp|;.RÔ¯·¡”nÆÅÚHAáxÆN^Ú€9S>ë]FJyAÖTÜ(7 u°§DÉ#XgY))³&ÝÆ8ˆ ÈJSFJJåGl)ÊË7àþX|[RÄ6.›CÑxø,%”¢¯˜ÖX~ Þ,Á˜ßøŠýx™Vn—¢C±<pƒòê—¼Õ"š2ëiTÉüO:)Ãz ÛxçpÁ_FiRIEEI/^ɪk#㬾Û{æ‘Ò¡ÕZ.ÁZÎj]æÕ”˜Wf;€P ûöÚS'¯– ¼À-R8¯Î)»øµWüe«ó»°4^éU%Ùêã/×{sibÓµ¿Ò®ÚQN¬×q%ΠF\c²ÍqxÏ”,gÂé(ÅbóÎJ(ÖîÕVе{-R^°w?±±m¾Â®ÚBÕª¶Pµ…Þ«-DA>ÒËa¸Î˜1÷Þ>k’ 4´;KÅj•òj^’-Ey®ëNˆR"¡o$+¿PbQy£TŠR^FàKÚuÕÒ¬–fµ4«¥™diF,3.AˆºUT.• Χ‰È6É 8J±„H7¸²Ú£”×loó˜3n®MŠÅ7w>a¦zó·ÏÁ,Þ3)Ù¼”–’ïæÝaNY72%ÛSÖM9ÍÛæ rŠ×Ñþ”8UÖó»ÈzÒM¹‘r?(R†ž0N_Oæ.Á§Šd…B+®€ Ò÷>¤d5°ñ ÆJöÏ;ó;6uÂ6?¶ç5²åøÙ) ²‘¸§¸¥ä¼û’o±”®«­ä>i¿Ÿû %óeæÛ%YýH’§Ä;±º.ÏÜ‚kJ`9Ã;Œu:¶£ VÖÜØBPø‚ü FŒÜ ÐT ç/ÝlŒn5R@Ó@53/wä£fæEgP3ójf^Eå5P¹ÆoI™y¬Ö¿çÎ÷!ÙºUžKgœ­€g{Ã4 Ø”ª¬$›Ÿàøå?…±]D° J΃àDÈVp×ãŒu´*¥ŽëLÛ”Œ£š'“[®<ÁÈ8ykàÜÛ}!{ûƒe¡ð“öÖsgÅÝ~·òުϮg%œurUÖÀÕW+âßÓ™*¥zAçpz NÔj)ü³fÝaµÑÙ”³ñê…åäÝÖb³ ð8Yß ±MÝûªg‘Ú›|H$O–òf`lMî ;Ç~ªT½½êíUÍRˆf©^%'Fjå¼³*­kk=ÊÎÝ\‹³úžý½X„›Ù»Û·Õ&(Á&ÀsÃõhqdÒ:B7Êý9Œª”³ŒÄ8Rã•”,WJ6ÞmJV5¤è6wn@oŒö’ûmk$\§Ø” tJ¥æª ª.(Qª.¤Û ¤üoÝpÜ|»u½ÞÊ»´¼Kz—Ö&Ožnçš­~0WNqõ˶òÞÛ½yœ˜„ÿ”o¹Kˆ´•qòä{½#ýÌë&U8%dÄ`=á1B†OäÎÁ¢¤àe¥¥ÛsA¦ð2§=Ì:™D›?’CxË()âö99Ç*Žm@Ç–;·„í¼êæHºáN@ÕBâlÊp‚-[(U?"žè&3; Ü…zÏ"F’OÇ•ES2Eqäã!ƃi­(?ãÙ`ðÜù%W«#é6JmMÌ}Y=Ì}Û¬—W´S0Ü>³6‚ƒ[´Ûô)«-57žÖ}ï_:5Ú©Èà ?¾~‹èÕ©Bg…ü9ª’£^Õ墖Ý2.¨rdÛøÃ*÷Z˜ïÉÙ¶Më/oizÊLLå祲o[zrº -=´hݨpi,¤Ö6­8n¹ÅÁq<|&ÀgzÁvªQBšÆŒs©·^xÞþæþm‘þ ?¡gèºÔ"Ñ:á\ö̰cKÖ>Ìí( \wø¬¬| §XH?¼§$”C|`tN®Â4@/Éä”)'âÝŽì)yPÉ©»í½hé¤ws·}ÀfÌgDßýçÝÿ ¨ñ» endstream endobj 4182 0 obj 3321 endobj 4185 0 obj << /Type /Page /Parent 2 0 R /Contents 4186 0 R /Resources 4188 0 R /Annots 4189 0 R /MediaBox [0 0 595 842] >> endobj 4188 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4189 0 obj [ ] endobj 4186 0 obj << /Length 4187 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹6À»ÇrÐp99žL‚A.¢TÏÜåfI¤Þú½…Ô»?~þûñŸ¿ß}üüŸã—éçÇχêT5ÕøçxþûÃí/dwRrüØvõIöç?Ç/_¯Ç×Ãóáyø÷õ š· §ÃàeŠñ†¿}ùõðnœü0þæóÇ?Ÿþw”Ç? ÿûåø×¿ ?~šîwþÂ×C×7çÿ?)d7üçöÓyð_‡¿üîøë°„îí¾çPÕÛŠƒÖñz½T¼ý½½MVUÛŸ? !‡êÿýÇáçán×eœz-DÛè¶Z|×V·íª¾;ömsºVÆ]‡[x¯Àõu]E¹ÑÛŠD೉J·Ž{Q©ßwZ¼=hÓÔ¡4»Ü*f]UWu.žW$Âm¢½y«ç(š)¿iæ«åÂ/‡wŸ„VÝÙ½ü<¬äÍš?^†Ç­‡ *ôñå§ãûjøðûãË/‡þT÷ª­Gó—b¤êá5ü寮¦‚+hü×Výh¼j<ÏGÿ¨ÎÑ»Áç©>Á‘á\©1ó(ø¤.H8"àæ6¦5”Q ¹ ê˜Ô±Hž>©eÊNÉüÁ\PÖû†u!ªÝ)š¢:ÛlÉñó@ZK(× û’qäÇ—ÁS'÷»Jeö»$_I–I>ÚË5Xú°U…:ƒçÁÒ‡i-ñ<˜s‹9g™§d,U°dóâOZì`ÁÈÙr7ø¤mÄwÃþ¯ ¯€1[>L½xŸÑ‹×2·¯ÆR޽8–¾'4F±·ZåEâkàª\›Æ×`ë€åu»Ž5c£¶{0¼l70­ \ Ð{×lñ!ö»Ø¿cžBþ”#ï OJ(UÌ…Œ\ är¢’V õ”o¥¢êVjÁ(Qóë‘cBLy,ÙQqýFã|®™pÍÄN7z±T#ñ<¸jƒmŽ?V§5Ž´(‘#~F¡è¤ÅÂâ'ÅóàU,¬¥2Bx‹Tá˜ǔ̅¸«ª¦ñ °µÜ¤å[¿N‰# Nü¡Ë.¡“F6©›û6Œ4)Ø=n¦.jn S§d¤‰3Ж\!!Û¦…\Ÿ:”º8‰:X/(^®:—ŸÂQöS¹hP² ±D«ëvÑq_Át+5æÌ3 ÝfƆëgH-’DÈÀm4Z°%ŽŒ# ¶B¹™%A^K”BÉ¡gÊëf³øn[úJp$MÈÍEæ¡ú»{°\[î<ŠËS¬%„UçêŸçÄtý˜A E«g2±~‘s›Û™-¯ìÙäËã½¢™#u1WÙ3É¢sXo<”ÏÐñù/Ìáy »ä¼™üq±5˜â¨{öp>Í„8Õºé†o'0)ˆ§u%æ<ņ|”ñæ$Eç2¨ RÝÍB—…%Ùm‹À›˜óE¡ñÀÆZ¡ì˜Úwù.W f Ñk[¡²ø¸jã«…`ÖcH‚€õSÍXžx¹4ZøGy.CØ=Ì/üªav-Æu¹hMñ‘Æ‹¿FCÜö‡…6ÑÂ×b>Bq4 ö„^¥×RðpCLïã^¤KMჇ>º1¢:5­øÎ”M ‡ô¡eS¤’¤}s©Œë7BZÔÈÕãf–¯b `µ§°+ª’,ðÝ8¬÷ðmË]ŒEÆ 92-»¡áFª… ‹§x~‰¦X8[~`æ†Áéý”jÛ™ôðSæz±Ò`…ÆÀz.$̈Es)ù-³èsÊ Û’0«†Å(`þÁ7ˆ¼¾êÊ‘ÍÓ#Éåi\1…«ånÚbQ<|`’XåíÀç9¸âã²Ò´)$ô mo@ähGº¹P¹ºœ4¥ãïYX·¹ÞŒÂtböØIô%!ß„èçŒ ÈˆnXvŸ;x*öÀËQ2½–L†GÃEšìʡתjçŠÍÅJ.V¾ÏQ¬,œ§óÁ`”Rƒ{@”NdgNãábÖR”„)1l©åÌT' ûj¹³9.ªÐwE±1Q#ÊF³LÒ羯¹¸­&¨6²„&Ÿ”Âòݪ v¤,h'ô7nû›¹VËœ¹K“²ýæÉù|F=€Œ›|×FÂìJ“¯Uº¿ì0Ôîå<\ÀOã€i9™âb¼²‡Â¹ScQøHÙwlî?÷ðAù·ÆÉFÍlõD}®ÌÈüZwisÛ¹“V‰ãß\Èvrå7óåi’‹Cà(¢œß7ª™ÙcÎnDí|ØâƹVNzõÖ½mn°áºVйC÷Ziîáy„ë÷㹌tú¹nÃf"Œ òû¾vþ ”~‘8›6ò&ן%+›]Ù nÏ ÊÆPó4I%c²Œ‹‘3Ò¼»:·ïqÂÕðrmJ8å°nTƒc& 3"fª 4Á^o{^¯­´Ëëx„oÐö™ýA©Â(^Ç£U™2_þफÅâ0+M›k”vú8áQžfRmžpX¶Ç!ò$ò•úÊ” 9 Ù»•%«ï«±)A)ÿm´ '%“Rns®š¹J”Õ×O¸2t¤ÈQ»T¢ô´ÅÝë¡ „¨×ç%dÅí5V¤£F` \ë~¦¨\쫸Ø÷þ1þn:ÏïÆMZXC Ë½:”À!ä¥ åàÁ}~A½VQ7Æ»T(C©»Ì¨o­VIÿÿÔ¥c9ãÀæŽìn Jj‰F/—ÛLÍ¿¹rx1:4ÝiŸ×>yì„¡8Þ¨ÕÛ 7^ü+“÷•·Kkyu#æ–"y|Î7FÿÇ”8bHvØô‚ÃZ§Î¿eÛÈÖv—ÍŸ‰ºWâú®ý•Þ!ŸçÝÀ‰aV3NùTü…÷YŽ?½8š«ì­vMÚ}? ö‚{œÔE‡àIá ^ò޾4瞬V*ÝrÎt*Aò}й6 lé-\¶\©l™8jWÉˬ¹jklÂjØ6¡+~RË Ô‚Í2b&¯v°¬U›Œë‚:š‹9Ôª< ‡KA9a7Z\é݉[h„š©?Î X2-¸A»8hÄ+h-.Ž,;ÙblWÍlÜ-›i_Í»ÚaV¿¹‡òc£Æâ^(UÕÄåê®H_þ餀’²©šsÃWÜS:79“Õæ=VKÛD+¦ÚÎDßÚÖµî· ä,5u × ›®¡ÓÇÕv»}„xSú½kà~7¢FÁ'Ű¯ à<˜n¸ Š ¡¤Ær€a!æ‡.º£6ÕŒ^½P´iwUµ¨SGâ*.®van?ùsS”TY$H¢¥ˆùÃÖ嬋„Þc¸^£…¬¹éTÄ#–Z8î  ¾ù‚⣞® ÒÈÎ8,ñÆõØŸEõ@{ëïyœÎ,l!w—1rUÒüpÀÞ¨CȧåCÝ0mà ÔSÆ•ÊfYí–L,”ˆˆÐÌÍJ—YªEøìu‘E®)…Õsï´QŠf²”ZçîlHqàà§¾ïU°ÄVÙzλA‚z«Ø£nÔ£:·¿¯Œ¸… ©S[öÁäóÛ Jf‰÷Ù v¦äX(¨°È’%TG,ÅÏõ´èbÞ<ãeXޢ˶UeØ[½ÀÛ?Œ½­q_#F¢Ê¨E w³H¦[¾ ©7Y¬7ÎQb ¤àm| ¡†£‘ØÑˆÅÞòYC–Kw/ïZ* —‚²kÉbñ9?Ù"•á]¥hœÏý8ÞuýH‹½{£ {£¨{h)Þh} ¶ì!¤t7²wݲwUu€w]_–¹k»Öí+(¯<Žwå“»htãþ†Œg” ^¯ÖNãÙå{½¢cÊÇñz\³Ïè]ˈ6ûë{*ñ9Xg°ŒQÎÁè:/ ­”:û‹­üFc›¢3ÛäGWY­¼RŒO‹’ÿLø”-WlÎ1BÞ©…Ô‰ºÇ¦êBªÅE­“ìÍÖ`ž–¾C5—óÂýøòÕ2Ÿ¹ÐêÛBŸ­Kµ^ê|Æ®9ŠxwQõ¢9ugÚU¥¿gUÓœšî>{õiäÇÍȘ€í©í„¬oGFÐÞY©“ìßfš;ú>5Õë¿´pž^ÓÃkFÚÊ“¬Ôyh.”÷î6ºÖÛß<ÁßÝyÂOèš)1toD ç˜ žß5Ç|ž}ZÛ›HÝù³¬Åõ@²ÒóÊ ÈÁtØÀ9Ð*¦Taš‹'¨ PRLIÄܶðÎ<ÈPnw]ÕœD+ºv)Û'»o䦮ôÓúŸÿ)t©Â endstream endobj 4187 0 obj 4384 endobj 4191 0 obj [251 /XYZ 40.7999999 456.019999 0] endobj 4192 0 obj [251 /XYZ 33.1199999 133.459999 0] endobj 4193 0 obj [251 /XYZ 32.1599999 135.379999 0] endobj 4194 0 obj [251 /XYZ 40.7999999 456.019999 0] endobj 4195 0 obj << /Type /Annot /Subtype /Link /Rect [296.159999 519.379999 352.799999 527.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4196 0 obj << /Type /Annot /Subtype /Link /Rect [85.9199999 100.819999 138.719999 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 4190 0 obj << /Type /Page /Parent 2 0 R /Contents 4197 0 R /Resources 4199 0 R /Annots 4200 0 R /MediaBox [0 0 595 842] >> endobj 4199 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4200 0 obj [ 4195 0 R 4196 0 R ] endobj 4197 0 obj << /Length 4198 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès€‘ER+0à5@ È!È!ðd ƃ8sÈߺ¥^LöGªŠEJê'ð{nµ$.ÅZ¿ªzõ§Oÿ8þë÷ã«·Ÿþsü2ý|ûéPeSŽާ¿?Ü »Âèñ×¶« ÝŸþ¿|=|;~;|<|þývPÍùÆéÇpñòŠñ¿ùíðj|ùaüäÓÛ¿ ¿ýï¨þ÷Ëño~ü4=ïô…¯‡®oN¿ü:þ¢´ÒÝðŸûßNÿ}øëŽ¿ CèÎÏ=ýûƒ)«êô˜q|»ÞªÎïoE/+¦+ëa”ÒÃ8O¿ý÷Ÿ‡Ÿ‡§]‡Qô•RmSµåì§¶úôØF7Ǿm†í¨‡:s›÷(û ^•2:HÅMM•Uë{éûFŸ§ÙºÛI]°éI± ¦JÓ má0"5³ËÂÃ'q×]©²“Y÷ë“¢×]uFèAÈDÖ?‰½îº¯ÆI;Íë£bT ñ¬óˆTÜÔ.+Å^úªŸ¸üðaìŠõB+Öj!š?HÅMí²ôøQE×Làïs^ÔÞÒ—õ ÊËjЦ×|Q4ôMÑøæ¹ñÍçëýI©úüó0Û³f6þøüõP^?hføßOÇËÒ¼ýãñó/¥Šºjº¶>ï|¥lÎWºÛÕùƒª¨Ìð½Që›®èó•¶(ûñÒíÊøøjÆCtk½Oá§â‘ØïÓã,êAŽ^]úæ÷~Õ™šgÐ]qfî¼O9c­á àY0†æYé˜åƒïS-zŸga»ó•¦Ðª›}Å’§Stý  ~7ú~Ì/*Ú@Ÿß³u|%^×»F½kÔßÑD¯º,õš*añéa?Œ‘P7Á)Ãm3ð¡‹aßt=4mgO ¨ë› Ïj›:¤ë/ëÍU_èmv»”xáRB;¿ãN†å.mpÇc¦ƒ¦΀@ܪ TµÊ朎 ÏAÀÙ»N Æ>âážÅ%ìãVpÔ/Hx3ÌeŽ6¹Blˆ¨©š)ðOaåÚ ‘ÀÜ ¾Äc)¤’‡\Â'‡àÈ…æñn”1wµ­Òn c^Ņ̃–Æ1Ø"ƒKq=%ó ó]ÃÁsŒxçD'0$Sj<“%ßµO® ³èo]"¶o réÄ^‚F[[¿{ Ê-x ÝSѯä›ç=x­ñ•èŠië†é@ÑǦÄ\¯Ø>ímví°(VÃvœì£ôŠ4> åKú•=•~Å0×è¶PÊhxßZ'ÍY~7:MXJÇ4uüLÎáÜLÂBbpt©l¥’¬Þ‚å¼GÓÀ²J2ŒÃóïÁc3PßÛuƒ ê£%×”Mо{„=žtkÉõ&\¼„ Ãä¯Þgàríèïjê ¨Ã`&Ç0§>Ø`ØÍÃÝ<ÜE@¬x46³ø.@:ðœÏÿ¦1¬±{ÞO`Ö•ïuŒ†úޱ'x}1e‹zrJªN©Ì”½¼u¾jÎÃò÷aÛ$£}Õ™4Ô·MœCåÙ$tFiÐÝÒøsÉáÝNÞíäg´R˜ Zœ«®Ã‚蚨8Ì»Œ#½ÂÄäÞ€àô•²‰O f«lÕS„DªE Ö¼JöÔ vj—9ƒŸ_BlËÕg²ã$îf)}8•Û¸ûÊ)ì¹ðè+X~@}E‹ÉX.±5ö¬ƒ¥ùˆikóÀ15ϯ¹ˆyANü_ßGÅåÖB‡4ë…£bL ¾êX½ [®ïu"©_Ó¹Ñ=Íeõa;ÛBŒSŸ‹Þ4¶ Ö`רaè;¿ÝúÙ\1þoç·›å·p˜ßzVŸm§àxN9ÈH½Ï”#?ðLa´Ä§¿‡1¶ Ÿ`ìÅQiæ|G°ûNV=ÂïÿSåÕ9*ãÿó´Iêá,½˜âû„¾”_¢…¼$*lQÒÚñN‹Ö³›ÑOb~ÙCJë‰Í$™ë¾±Ž²'n‰õ (“6šÉød–‚G›`D'9(xÏ=xÔp&JL(á꺶ÎÅýq¼è÷}ÖÇOfFQFÓ[£©ÆPæÂçplÑ"õnn=?n±îæ·ä¾7Wº)AM”PÞ(á´¡çýˆ{xà×CÓ¶÷üzø”½µ{3öƼ#²½])I¸¾¯{@8ZÐûr´=På R€…ÇÃn,(46-¡+£‚"yWŒvÅh#Љ®9eü4á c <ïa¸§™¦T5µÍmcÜ2ç ¦.ì 9Q‚ª/O±O÷£çäQaÆô•ðTe탫(p@;¯VîÎ!Áºï™BÓMaήâ‡DiÏÇ3øT¤à†š0H$ÚqG;¾JìÖqKøû)žë-@ž¡BLZAôަ/–Iîú‰,r°Oœ¾è,f(ÂÇ­„åÊÖ¸  Òk>V}Fy?JÔ¸X–1Í/m"ÒL—! çR£p³êÀ8K ¸ÚñˆºmƒÂÜðbɲ£]‹ãÂâxé=etœ²"„š©y§h³F7fD*nB Ô!ï%¨À7ÐI)›Ño>ëžÑ›ttR<€2ÇÔ‰Iiü‡œ?€åNs¹½†Xж &oÅ#æøÈ2ØE ŒÓ‚ò &@àu‰}3aåsåÙ¤°Pš26á¤ìr8ˆ³„„M¥k%4vÌ@²ÆÓÚr,ã#¢Ãï ·ÔHf2CÍ•Ñb2Ï×c‹vÇJè%âS*+(¯¬5ŸP¼´]m‰ÏÞq|¦Ž¾æt掩3!ð¦ø`¶TXç„_}A{ò:9°F›OO „åIàfh«0fš±±2Uó=Í“V$W‘Å2_Keš˜ÒÀP$#›•Ÿ. g­!PïÙΣ§ Æ*ئ‹)¡últ¹<øx›ô¿Í64¹’0<»€)žrÆ)*žä•Up¡ª¼´¸ÄM³„¬êkÁ… ^ŽQ±ž¼c–7)³7`ù``ÚäzY°ÝŽÛZŒP¾@Õ+œÍ„P!áAÏw€zÈ"•RâôÚ9›b{"UzæG´=T<C½Mfã´}v¾;bJºÆ ·ž ¤ã‹-îÇ^mÁô”x¹)sí&+<ñ YÌB¾”[iöÜ‹G"X ×)­Ú‹‡x÷•1> ”%ŽšÚÚ«Lº0‹çDʆ¬ïœ1ÌZ_²„×Çò”YqäÕàvô8}sͯ&æM“@¸ì¼â¡D——-Àõòã¹8gŽ#?Y,ùÌÀ(áQ ¾åàó³Ìàø: Ÿö.ãH+1Ò]ûÞµï]Y‹&²šòÌy8W£·¢ÿw1%ýsJƒ¶”k·ØÖ×”eÜšˆ€×Â)®„Ú.Nx$ 1MCkVÿ‰dTX¦”ÃIžÃ!x8¤0ÃÙ7·ö‡ ‡8#ì4œ•ÓUS$Í™PdžƒÍ‘ÌúCr2C¬Gÿ§‚7î½ÆòÆpEòmÎt›ê¶œ² óî§bcw:ApbF;¿.Hâü‰œEt£Ä9,‰Ë1þ]At Â3Gþ%s4\Û^3Âvq¸‹Ã%e½Oé…«©[ëÌΨyHhc RÛYâ!G„ŠX…™ê«,JNoŒjeˆßôàüÚ(ël\‡Ê­tDÚMˆ¼¾*˜Œì™\½e¸Nb‡}k¬£»ë:»®³°ªÆfôé3¿jÛ&Z>=c5%‘N–!ÞÖ_¦ÙdýÒµeTqBÉòùÕ+YÅ·”¾¸XñUY&ÐIDˆhy¹¶ê1)íÿÎfˆ›¨©€3 Ãìõä.GØð›Ø¥ŒhñkŽ/†€bˆ`vÂèÑæ¼¶î5:ô¬ën}1'{©*óÎ^Æ×p$„DÅo~——ˆRO …GWj[x0|O"íUeùEîf-‹k>¿Ó(…7JúÈӤЦiuÊIº¤4 [rǹÖ…^‘Å%˜”’/Ouªïsfrâvö"ž= Gœ GD«ç'T:ˆ‘OC§‹i猭_™Ë¦U½ÅKv—Íî²áÎt›.›­Til€’ØDŽÁg01¯ÕœIˆÄ ,[„y96&KX:t © IT—µM£ê›ÇÞ ÷ÑÂTåØÞø%Vn¬;žjK>``c*_×_«"OçSÛ;~ÿɸ>ÍmÒîWzë+öN뢩ÊÓ!v8‚)ÌHÔöanŠ {ç˜%mÑwö=Ý3õŸ%½g’¼'neÚžà$ØU“-"ïVG½GCá,¤ÊÕF¶¯¬uQõ…šYR#|SJÙÇŠÿý ©ïVhüdÖÒ*‚n¡•µ¶[_D.a'ƒ„+‚H ºë)ɲëñ÷PM{XÞöð´çdÅpÿ ‰Œ¾ÿà×Ã'ÏJ$ ¶”Hk¯¦"› EHDa°=ͧú” &SÛ„¤ÞÁÑëî#ÖM1*8µ*#Ú¨NæpWt}i$Püyê”¾Š¨s6ÝK9*ÑÓ®Õ[„ËÜ'EKn:ÃLZÁž`hµ†˜˜°“œ! §ü›¦¬ ØV–°x<«³ 3jÍmÑU”(9òÉÅ E©IÒH4XE<ƒ‰^wp #Ê’oS_dˆÃrh’ºoJ\¾¹zâJ! 0^ ß´:åäÛ…]˜#¿˜CEÀîdŸLÕºç:³y+($NMc ' òW»ÈÒy8ÈÔpßš˜Ô‘íÔBl´­Ž`¼3ƒÑ[FoaÄh-šUuö&-):#¸û Á-˜I5Gâ¤E¤f<…Ê•ÁDo/=í³ñ7õûÞ^*Ä`OO3Qœqr‹¦„NEço³¦ì £³Í‚°Jc;'(ýj#˜H„Ì R›Ãÿ"0)K-Û¿<%«žs·£ø‚í>ª#q_Îá—²Mn±ü€jºç=¡–é){94UH²È6°$-.%²&ç¦=+Mg+Ÿ«iÏž2nº Ý f©§œISÛ‰S_I›‡˜ÛÒÙQ4/Ðý•a’ˆ‰/lDdpa\Iª‘ðu1®ã†Rž`}J$Ö³œ1èuÑT“LUX\>·×ÿ|‡¿ÇoÉUÍùN?¾|%•Óº«ÔõÑ{ú½·†k(6G5Lã‘jÚ«fŒ†MY}OžMS4}U€ «n‹Ö^´‘½´®Œ'Õ˜B÷Ku]4ãöØGöÑ{:xOïU« ]¥ÝÒ‡ž6R’[òÑw'uôÁ ? {&¦ûèŠB󘈙vÏ´c”¹Oc;€ª;ý®ku…}ÕpýðžB:˜D7‰Œ‚û÷vâ÷Ö³æ®~¦!ÅcŠÄ»þ¾‡±:Ê+B]]W6…:ÕhžKf“ZüèJ}Ïñ¹ýñãáÿç-þÇ endstream endobj 4198 0 obj 5405 endobj 4202 0 obj [252 /XYZ 40.7999999 636.500000 0] endobj 4203 0 obj [252 /XYZ 33.1199999 678.740000 0] endobj 4204 0 obj [252 /XYZ 40.7999999 636.500000 0] endobj 4205 0 obj [252 /XYZ 32.1599999 680.659999 0] endobj 4206 0 obj << /Type /Annot /Subtype /Link /Rect [175.199999 600.980000 222.239999 608.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 4201 0 obj << /Type /Page /Parent 2 0 R /Contents 4207 0 R /Resources 4209 0 R /Annots 4210 0 R /MediaBox [0 0 595 842] >> endobj 4209 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4210 0 obj [ 4206 0 R ] endobj 4207 0 obj << /Length 4208 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň( xüCÃrXäx³ ëEœ=äïGÝ’fzÈþŠdñÑêÙ€gÜl¾ŠÅz³êÍŸ?ÿãø¯ßoÞ}þÏñëòóÝçCÛ´¦ÿO¸ü@’ó¯ýÐ5r<ý9~ývø~ü~øtø4ýûý ̹ãòcj\§˜üýëo‡7óä‡ù“Ïïþ:ýö¿£<þeúß/Çÿ>ýøiïô…o‡a4§_~RÈaúÏåo§Æþö‡ãoÓ†ó¸§Pmgdg’Öñý±«8ÿ½ìŠ&kj­’G!ä´ÎnÇÿyøyíqͨ…èîÛàQ{yÖ˜ãØ›cïŽél-l$‘:Ð"Ï@§‰¤‰V÷äHÍ`–?ð÷y†Ó$rè¦nõ„4ÙŽW›ñ K9í#šëPÉÇÒ‹.Ï@§‰´­­Œ‡bƒ¾_ïCçžg,Är]­Qô™Îð|!’¶¶‚5]"Ùë®ø{ÄÖ͉Э#¥QµZe:ÖiEy‰{ ÔĮΛԪK…×:T2à»!:¯H¤mm¼;Ô§,‡|>¾¾Þ|O‚Ö—Ÿ§eœ¥µùÇ—o}š~b‚zjýéøÇ¶•æOÇ/¿ºI‚„ìÎâÝÜÒÎ-ÃÓàWß[ôÓzþ Ñªï¡q™¯·G•çú¦çïâQž"{ñJ[Èö`Îtxeö&„«ˆØ q· "ßž[„h:m†©-4x[ÎÄ+ñ"LJ/Ó5(ƒÔRV· î±Gç@÷pn1Cp g´²ˆa>;*>wbn_µ¶ƒ‡?OŒ1ÈORä‡ê×Ú}È—B¨\†³¯3)“kçô”ïùà,Ä¢à.ˆA"VbƒÑžhHAÒmôLº]rÀƒoÆLÌ( Ç!9 R”Ëí9ô'Lûð¶ô‡\ç/´ ôÝŒã¸îaæØtõÂ--l°EÂ[Þ¡õ–±¶¶|D-ú¶À>xÕ¯íCüÚº!~m º…-Â@8\A;Ây`‹ÂÐ8úÒöSëÎi¸ŒU^cèzÔNˆa§võ©]%L"NÞ3͠ѬµÁì”xßÏ6ö³sÄY†GšØ@ã"˜šÃI΋-)k¯/,‹Åpûƾ$'âZâma@R,©Ïƒ-?‡ËL16Ð"øNHçÊ0Ô—²…Ï£Ðqœ1˜¤rî"‡nDXÑeqAhÖe»Æð9"à¹EUÛ{õ½¬a\HiƱ 0>ç5$c3.\5+ÂFTbÐGÃFn¼SŽ^a—^>mN0 áUcÓ<„q¦Ø ƒÈpb 7†³#¯C;ö»½ßíýnßóÝÆ7˜€(vïqn0ÿ¬« S?ØD»k÷-vsœ´1šadò9‹ÆÏiºà”C°k{¯€"rM’Z4ünžÂ×ÈöC°Î csc…ºæˆÄ1b¼šYÖÌØe§|¼SíüçÊýpZVP.Öº‹ñ}Ä[ØgD}Ôb¦è›qf±O}˜6zá½ö9Lø5Ø×æ­`ɼte4 ûä£èE§¬SÄ{{zeíìmTEÛØ¢ÏG¸kÜabmb!~ í Á–%@¨¦·æQÍÃY^Æ#b¼Ó÷:p¢j¡OÒ6™}0ä…Aa€ûpæÁgÊm\x<îtðiû(Í•Ñ8wŽ !ã–`¸aª¹A‘0Æc¼Æ£Á ƒFóâAùX5ö+kÛ¿ïÁ¤n´÷ç§&ÌÂáPKš&룴ˆgáÉbÞxDX­²¬•aIŽˆwÉb¦ul},݉¯Á0qõ9ÞD»†Ñ¬‘·w¢E{IJòAZŒÀ]žZV‚z]¬“¢P~‡ø xŒ‹Ó—õUÙ£Òaúç*·ZÔI|²²µÀ–˜ä µ Ü8Kâó,¼"â%d‚W< 6òf!q^jÓ—qŽœˆ¾„\ÍSPò™oŠÁQFº¤ˆ ãkQ ÊcØîõ£œóõán_¶‘ŽŠ¼ OdW&r³zþzlPw¢2ÂÜÄ. $á=o ûÁVÓ¿—vX$->MŒ4þt ·z¸ZÓ‡Óãs€ÄɬµZn.nYòÁk“¯'ï1Ãêw{‹ƒ„+ -€H°ëHUmƒƒüØwóNí†[°ÈÈòNdáÇx‰3ÀpüùpmšáoãP;N‰ë-s‰Z~JŽÝC÷éîÒ¾ÊÊy”×¼ ê­zïiݾ¥ÅÒ l!æÁµ30…„V$ÂæÇñ63(17Œ— 3'ëáûã1$8B*ÇgÊ99çÄјè“WêÐ.ɳ_‹n`\Æ'Ìñc3ï÷ù<'Ë)çb’áµÕœ˜<¬ý2*çÖ x  8ópnI^Û:àª7O‰Ç¤È²¿"J¼[5y¼`·jîVMºÏnÕÜ®UÓm5êá9 ‚J²•©Ö‘ÿ$ô,I¨ÅhSê Þ€§ê"+ ëóGÄqÒï9¥¶Ð5t[5ͶYé>eYoUs|*–²Ÿcîsĺ)Ž­cDÝi<îƒ[Dé^µ½~~ˆW€Ë1£&¤&/Tª8\<õ‹î1²n–:ŠY2çÝ÷Üá!+ád)LH@[æ¦Þøêhæ5´BÑF[L¡Hœ{A®vÊêe±µ”šr õ2B‰Ì’+9Ï]Ä0‰°87!â!^kKbž´£öWýÅe³:ÿŽ =Ä/NFÜ·T@åÚÔþ’Ûe’DÇ í}:i¤K–•MŸïš,êMðé±s X×nPCÄɨõ|sÈ,Y2"Ñ5;YÀ Jÿ¨üäc¯-Q¸šC#òó»Úî?œf"A -ˆùRi õcdŽ–YD—¼Ã SeY¡ÒÆ>×;SYÕ`cæKWY‹ÐŽ—oXòëD¾Žøz€„Ÿ†O5o-ñª}”¯Ž„Ñ­µŠòJÆ2xáßaà2«ÞF%|ÁÒ΢Ïʯ¹Ç®SÉêET»À0À+ȺjíÄ£qvŠOŽ#G`ÜÁ>†ç‡ðl3b>ªºe¯;‡Sæ•9p»OÂÙ©¢uxµ7+¯~5:rfêÀÑž9U„9ôöÁÚëä8ž#†NIèFp4BåWÚªsÓŸ!ïñ¢Ô­Å7ส%ãn€¬Ö Ž Iø°ÇGùáÑ0VÁv¸¦$Öšà]ÐnØkr—1ÀÇþÂ^mÃw«EJ<Ö^'”¢B[®š×ž€kr'CÃ<§Ú 8qÐ {>S‚ïr0{ˆqEŽ'¡®Q‡vª”è;N †|æwJ_0Ž1"ÃYñ =²–Í*/Ý ¬Yý5£htWæf°¢\–ŽæW‹7uxmkî.§ír‰‰xÕÇÖÇx³õÈXmRb«QÈ»äÄÚ8±6»dÅ’¬nÏ9öNB#Ã’ÇgΠv˜¦U•Ó†Á7oÞ’—ra~¶¿ÞÉýz‡­À ÄÛ¸M]ÛW¾5ãû;iîúÞW‹4ɺêKüþ¿OG9Óé ˯߈³u‘¢}BŠO$Z]½ø4˜£˜¶q-ç(Ì\ñ¨ZýœÓ;ãÖÝ̹h™ÉŽì›ÞNP5N¥e9Qª‘ãÕ š]ט9S“Í0®Í3À>#ì3«¡½ld«NM¶Prm´¥.?y¿»d·¼²Ã¨Ï¢4_kh‹Ê×g9±˜½/k;_€¬;ý.;ñH ;?|¦–Ç>Qx°¤x»‚K9b´ÎM=öi禧–ÖÆ‰÷1cÆb|;à ×BÐÌxµxMKº»k¸‰ïÍ»,¸9 ­iD/†>I©óÚÖ/<#ŸròŠã§Ãÿ4j› endstream endobj 4208 0 obj 4898 endobj 4212 0 obj [253 /XYZ 40.7999999 498.259999 0] endobj 4213 0 obj [253 /XYZ 40.7999999 498.259999 0] endobj 4214 0 obj << /Type /Annot /Subtype /Link /Rect [175.199999 471.379999 222.239999 479.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 4211 0 obj << /Type /Page /Parent 2 0 R /Contents 4215 0 R /Resources 4217 0 R /Annots 4218 0 R /MediaBox [0 0 595 842] >> endobj 4217 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4218 0 obj [ 4214 0 R ] endobj 4215 0 obj << /Length 4216 0 R /Filter /FlateDecode >> stream xœí]Ënä¸Ý×Wh`Ô|‰’€ @ÛmÈ"€Ñ²dôd ¦qf‘ߪ¤z˜¬s%^R,É¥n í.ÉËûæëðÓŸ¿þ£ø×ïŧǯÿ)¾ ?¿îD)¬èÿû¿?\~ šR«þ׺©JÕîÿß¾ïÞŠ·ÝËî¥û÷m'í¡âð£+¼î>=K£›}ºùúsGÉ!gí¼ví: ºäĪâõ§âBHó§âõ—][V­®«>É+Ñ_%O¯ÝØâ(m™FÈ´ûÒ¾K;SwTUĨúPÒœ>êðA] —nñx(1ç4üªuZ•î!ÝTý¥é¿yñUx¯®Auc®úÑTÝ쥑ïØIÐúë4‡[*Ù8CêCúìÊ¢¯Z‹fÜ;`…²-É3:UÇŒ® /!úÁ1ƒáËq¤ŠDºˆ}Ž „WÄž')œ‘Jœâ·†õJŽð¾8¦Ã’ SÀ‘½`MÄ1á/ 8ZusÇZB°ãÑ0Ú³,8©ß!¬‘ÃQLg¤ØJ8U,S†ï%¬fVD†€5ñsÆèjì8¯°´pÖ†¹ˆm†‘Ïqòà%[:‘Ÿ¦¥[:®Ã‰zœL&©¯ÑmFk²UŒ5q¼œ¤eL5ëÕKê9àÁ|F&¡¾ÏîpIHJÃÀuÆ´zº7{6\7žCËæ>ÉŠ3A­sÀžoÏ"œé9HèiˆŒ)Ÿ/G<:Ý¡Õ Ó\Ù êB §sÅWÆÆa¯9!žcèó:ü|“¢ytIƒÄY™ÖhÊD#ž =Sö ó“,ˆLŸ•/8ç<)5Áá x–¥âu„é ŽY@[@ö4š¢äÊÖæ}*D(3OF8J‚ÆŸÕ˜=àXÛ:'dþÊ™Q§"oúk<¬ê[?AãGwÞj#\'Y¬Y»æL¥8¡/昘ºXoÞØ Ðíé.”ˆ£œS^ÓCmîÇ1—òhI†‰çéR©ÇIVB0Ì©ºY;ŽPF¾äqóÓUϽsta g'QOµáý¥€W¹–k¸¾#dœÓ Y Jº:Ž™… ˆYÇN‘æ.`jÃh-ãPF߀â ÔÓ¸ø4ÚW´ ®Ï8YÌOÆ{¤FǽT“›ƒN͸ ˆõr8ªFG½¯³Nk î§­RÇ8÷Ç9¢ ° Œ-wsŽj|¿?ãM(}zÑCCkÊê_No",Ñc'o=%}a‡ãyX7––‘ ÄaÔ¯2ê(Æ;,”¨›4§1'ø%#ÓºçGg刊¹u~?ž0-N-'ŸZ©uc;›ù÷Æù”11( xé(í‹z«Œ¼Ä«E«OÚL"­m~4o— ýX3Pí³úA;at[Æž×x•|›å€0)¬)hrñž«v°f±Žœ0¨ô ¨!åií€Iά†lBO¿‰CL¸›Eéª&žü~&á¬à>r.—Y\¾ÊtäÃ\œ^ᆑ’eÕK³!p?¾‚«Ýz˨8Ó²%tVkbà¢9VKLÅ8Ç0pLfd,æƒéö5·?ÂÙn!ä“IC¶8%¶2:ƒÃºƒ¾BèôÛÛi.ËâÈo§åxdjd¡È¶§s™IŠRܮ޹vr¥˜s>Åmà…Y6éžþ¶|x2ðŒw!ê(|ýloJl‹‘w”¸­óÝ«ûÑQNê˜sI >½Äq{ϵ-d¯u@øÌö¡9 Þ~J`ÝDèkó@ñcÉßñÒü<9ÂÄ­ÏС«ÍôMŸÜ@[0SGÑîÒÐŒ-ñ¥Ü 'õ8J"fôè­”®GŸn Æ„ yxÌÃleàgwÁzæu§Ëf!î3eI‹ì iäD1Eu.À1¼Ï 'èƒ,Ë‚­Œ9•¸m«nÛªYy°à­ŽûÑÑ¥o«¶:ÔeÛV¥´oÛV]‚¯Y§î|ÄmÕ¶Š¼Ù¶U·mÕeXà:½÷B|@½KÏ–ŸrÀº8š„aeàMÂ;pàÍ!mó ©·ÃV»Ý¢#cÎ*oÑU[|ßîʥϰ1üÓ‚mn!ñ½YÃ1íaM:¨„èG0b(Ôrâ&:Μ« ¾Á~8ÀuÕx= û ÜÃÛ¥„ä’ó𠡉cQ/‡ßèú]ÑkB—±„9 ጘs."ƒžKá‘rVÑž˜ÍàȩƑ›1×»½=/|_¡qÏÿlö¼Ù3Óž‰µÆŒŒ°@œC2`] ”\b ÎCTP 8ýp¬?šsUÎ\R½xOlbC7O|Ožx[÷æÅ‚mݛҷmÝ{[÷N¯ñÛº÷¶î==Ëêþo]:Õ¥Jû/ ?¾}'ò+?1çÄì…LÍȪ£9]c Ù ãJJ§[iËÃÅ‚B‹#°±èƒœµ¥½þfwkÊž3%½¨º¬ÝãÚ=;ë+%}²¯u©Ú«Ï£WUiû“â®â\ë§uZX§7ßZ•Jè}‘뮵ֻ‰ËO¾Àïw®ŒðÕ½k%c¸VgXÈØÚ¡uûßU%O :ä–)Ôù9\†‹DWô`¸@D´Vy­éSÑK„«; jÖ*¬D?Ø: ʸãÀ=cj1MÊÞ5ÝÄvó˜D7›FØRî¯{NUÒamäZ‰½Œ cEñ²û?p·³! endstream endobj 4216 0 obj 3651 endobj 4220 0 obj [254 /XYZ 40.7999999 425.299999 0] endobj 4221 0 obj [254 /XYZ 40.7999999 425.299999 0] endobj 4222 0 obj << /Type /Annot /Subtype /Link /Rect [60.9600000 398.419999 135.840000 406.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 4223 0 obj << /Type /Annot /Subtype /Link /Rect [271.199999 380.179999 367.199999 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 4219 0 obj << /Type /Page /Parent 2 0 R /Contents 4224 0 R /Resources 4226 0 R /Annots 4227 0 R /MediaBox [0 0 595 842] >> endobj 4226 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4227 0 obj [ 4222 0 R 4223 0 R ] endobj 4224 0 obj << /Length 4225 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ù) Øc;@ Èa‘CàÍ&X¬qö¿©¥~ Ù%MÍÐ<ãf‹*‹UÅbÕÇ7þüã¿~?¾yúüŸã×åçÓçk˜fóŸãô÷‡ÛDßH1ÿÚõªÃôçøõÛáûñûáÓáÓøï÷×§—cãùs‡¿ýíðf~ùaþäóÓ_ÇßþwÇ¿ŒÿûåøãßÇ?-ýM_øvè=ýòëü \ôãn›ÿ}øÛŽ¿$ô§~§¬gŠ‹ :¾_å§¿·¢—±£ìÓí‘s1Ò©Fvü÷Ÿ‡ŸÇÞ.d4CËy§ÛŽmîµc·mß³ãÐé#˜Õ©5¶]v4uˆÒщ"64ÎÚÎÝ•õŠËy˜²¡;wÌú6ÖNñ°¡-¬wtEf½Ró0Åø†Àž» æX7è8Mñ°¡Y»"³~;;±¾W¡=wÊ1-$Ãú‰"6´3ëqWTÖkÉûYát¶ñ䨹«`ÖëAÆéh¢ˆ‡ ma½ÝÕ§(~€¸úß¾ûrxóq˜|ž/?dœ§ùÇ—o‡vzý¨G¯éËOÇ?2&õŸŽ_~9 M§•êäiÍ-¢;µô—˜8}Ð5lb7_eO§–öúA;дó7Ù†N8?µpq~èÚ2˜”hóƒ§ÔèöüÙ(8&>#>šÝ[ããèbŽÜÁrkv0Ë-ê¥?OÔc)R`M­I½x;s‹7ªÕýøôõ« ¾RbKùü¾_ÆU¶y+{° Ũž¯CÞ/ëPŽÜia°…·°e€½}$PðÞÿ<ÒE*î´H [à3?ÓÆšb¨f7æ×gšK€3ó¨dÐòI9V­LYn·[ŽíZËꕤÚ?lîÄg!“‹ç’`J/άŒmÅŠµ3$iç©Ø¾6€¤9œ’¸fR½îŒPÜõËg}­Á{²ÛçïL¦5À]o*- 㻘¦lÑM÷Z $ç ¹âï;`ä’¾Ó26}³àP°7Û”Pôµµ„°–ܾíÕæau,)2_c›LKWmç„Eˆ‡Î²}<7ÞÃKéK-Ûs>>ÁßÀ²C¡À±¶)çe_Ï‚#¥Äa±5J>®Õ#h>JäïÛZÌk¼N¡TµØVæÇÑ^Û-öâü¬Cªç\Àx$Á³ËyÊ'Eàƒ’Zv9¯G£8b*¯gտܶ2ó $Å!qõ;%ÞIˆjîÓž9²véõ9ü}®tl…sê-ÖåSú>¥- Ò<»ÌuìŸ ÙjŽ]K®³õ]jÒºÓ)7Ñ^ËX¾›”l1ÅÑv‚Œa›Œã•?ƒ%ÒÖâgðj‚šëe£ã8oÕÑíˆ cª1 ¼eóƒ)9»ôøkœ×©ç%x eìz¦/ìd×£ºèo]AfQœ› ¨À©ŽJÒ(ÀqVõ<L“P‚‹AÍKð 8›Ý½¬Y¤YZ…>ô)¦¬&.±NSÃnÕÝSJ ±ÔS qס<€"·oÆ"öjç^E3sÕިŚ “FÇ‹3àŸ¶†i(YÛm$)$Ï(i@Ƈ‘0'ÀPà‡ž”‚xÝ^ã„"~Ü[‹å­øÕ?çÚ¦ø ‘I‡PÒø()˜mƲ{-.çmÕæ¸àÅ(·×ô-)Õíõ¤!a@éÍ™¨Û ^E…׫ðzSK…׫ðznÿ©ÂëUx½é™œþ  Ie¯ðz^*å^Ï)£^¯Âë…èõ.øû…n½4/iŸEȯ(ª™±¼@AÉ/l¥Wx=š¿Qáõœã©ðz^h]+¼žKªê)lþJ(z<¥bL÷»Ò}Ð ¯÷ò4J…×Ë» ìdÈz…×+[’*¼^ÙóSÐD§B@nsMtÝzæsX^Æò±2Hø6¨Ôzq?f'¶7Û•†+ñ)°†B!Ã-˜XŒBa‚ø |y#ô%44ZµÎc ›´K%!˜Ö=:ÌF‚8Gðô€H]År€¨†ø04ä¼·†Ã[Ö… 5BêÃEZy_Am‚” H•´Q|>òÓT}øäŸìÑsBªuÎ7·Ì]†8D߯ ¬Tqz¨ º-ëîcbø‰>~éº[¸nf A”Ú´û„ï ñ¥I˜ª«¼±ü9’rD  ?V 4HiM‡ÔÒÐûÌpObÕî½çßÐsßÅ:Ó’%7BfëŠÚGiíBcà¨ÝäÃ5qÀaÝÍõ!Í÷²1NpÄ?¤ä1N[J°uX÷w,R£˜×X“W„fGëÔWJ¬…¡ZˆA˜bO‘îŸ'3ivk€±é7ÂëVé^2X\‹·m?i!==¶‰Û—ý£v”õ+×ÒoZéº `—G ©üóÇÙä «^,C/>$«ë¼­¾Îÿ’8ïuZà£z-ÎïóJ# ˆ”­§;M,9q¤_òT×Þ~0å;%šŒ®5&ƒtéÞÏ@%eI+ey:nÔÀFi–cƒH=— o‡Žõ¦HåN¡›H0„íQ®¶Gú™­¸‡æ'é±Âo qDâûVš‚U#ñ/(?ô¦Ë!Î2póQ\qØüÚio†Ø…ÐÏ—ÍŸÉGPîÉ5½Ô—K¦‰6ÅÈ4Z pïÍÁì[ôMoU ½ÝÌ“(¢3 =­ÑR2þrDo®ßuOëêng¼ ÇÙJ ¡Ü‡eÊ7éZ̽$ué ‰Èt¥OUÌ=›#—”r?rÚܬÄA>]|¦g eWî‘ñ‹³}¢Ü¬£; ý…Ò‚Q¹3.?Ú2bw Ã¥NŽpß•!Ï0/r±98¢G÷yu†J–+Œ®SNf2±¸dþ’nUÀ` 5 êæÆi¢Ü‰ŽXQ\ŒaxsAÉÜq`Øblf(U…è ‚2™M.£"²µÔ3ÊJ/Ýft!ø†ûœ{‰×p. WºT !ˆwû” Š—ãÐì…Ï0ç2d†ñ ZkÉ3º X™„ÞLVn«óíÀ¤;« uÁûǸ·.büwÊ{çz”;ßJØíkÞmðãÞdFØ{‘n”x¸ž'ÝÉŠqu)·Mì‰ãf¶¨w’îç¦ø9QçôñÑL›Â~a÷G¢ ?g²k®³à¤ ßÿ‰¹ƒweø}}Ƚ´%ûU¾¼XuZÕië:M°ó¹RŽÝž;KM }Ùzb°Wë> ôE–”ÜÔHÒàb1.WJh$ÍQ'JÚÞže÷--¶d”d'B¨G^ ¥{{ ”LÕ¤èL8©f H¸ $†ÒúGé ºqNiØ´Ê¢|JXVÑ­o,®Á½Eôh­hg³mGÓ°s=82UpG î¹^—»Ûežî¤ cI%Ô ú˜>JYoâŒæí©‘v®äû=ÿ˜²/’’mœ½F.ж’™=ªÎ)…Q«œ× „ÙvÀ®¡Ã!³JðºÄ aìaES{­Rh•6ÌÊ*€Kˆ<ðáLy³ »×eöñ8˜Y|u¥”1G/§nJŸc!Cg¹´*PZ]Éú­AIÜ€ÜKÒƒ”x $žb”(wJe¬…ÑòšQSpu…#Ó¼à ž’OùÙ(”¼Œ¿€g"Uxæð{(#Ý%Ò½;L6–*<\_‚߃{ƒsJÑ.…W³i–ßVx¾¨ ʊا*YË;²§ >Ý/æ¨òdRìàHÆ+_‚g¬ÃmYHn®’?5Û~¬Ÿ°$ L5–XìMa_†àc´ÐoĺFàgp5¤­ÅÏàùÁ%Þ?`»‹u´”Õ†Ò´ªÃë‹[é‡GŠëu8}P²O€-ÿ.½…*U{õ~âJbÜJ:Gv2e#ãž½!x ‘+11¯ª—U¶—…iƒÞ¶ÃNA^;ø†5ö±îŒZ—‡9ŠeÔÇÁv Ëh&OÓ!¼Ë™+d—Þ† ²dÓø”7´ÂŽ8<%FT­Dµ…ëšj%Æg°O©»ÇÚ…À7Iˆ$•Žý2%ôÓ5þ’HŸ…RÅ‚Pjvy.WQ5ˆ^E&TÇǹ 8«'/.WFÌJ ±Îù\1«¸huÐ/¡èAGf!ÅÔR;¥’Oñhõ#h~„#³Ï)¦ ×iÕš}Ïc?Zþü­ÉíGm©-µ¥¶änyüÞ¨æ[Äæhæ,ž<Y—³fjKm©-µ¥Zäj‘7ZäÇg@Þœ ŽßG£<Üé ˯ßVÚ6ïìjÞ?9 ¼óÑUÏ ×G>ã.À×3pÑQ²óE#K@FëFßÚfæÌMË,¢k:³^fgw§e®Â—²Ã]TN¥=—¶›ËêÞ{zøÌŸ™O'ÁäÔtmy{›—Èí'ïáw,’;#üˆžYr÷Z8Çâ¬ú=³Ì˜ÏØÚN @ê¦ß…â—”Xù‡çÊë/ tÅ9XÀ|½)«7yy†ÍM×fÊŽÀc‡‚¥ Ëã=xu@ –£ˆMoÆÔbš˜Œ{²‰×ÍSÙì{¦>a mÒÅþá–Å^D´ÇO‡ÿ|‰{ endstream endobj 4225 0 obj 4610 endobj 4228 0 obj << /Type /Page /Parent 2 0 R /Contents 4229 0 R /Resources 4231 0 R /Annots 4232 0 R /MediaBox [0 0 595 842] >> endobj 4231 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4232 0 obj [ ] endobj 4229 0 obj << /Length 4230 0 R /Filter /FlateDecode >> stream xœí]ÝÛ¸÷_á秈¤$’@q@²I ô¡À" ô¡èC‘»kqhÝÞCÿýÊ–ìuDÿ(iD){²Àz³\QÃá|q¾øîO_þ±ÿçïûwO_þ³ÿÚ>}Ù•Eٔݿýáë‡Ë_hWÝýh]]hø·ÿúm÷ºÝ=ïžÛï¯;Õì?ÚÁÓ+º ÿúÛî]÷ò]÷›/Oiúß^ïÿÜþï×ýßþÞ~üÔÏwøƒo;ç›Ãÿî~PZi×þçò§Ãà¿výÃþ·wœ÷ðýSzÝTËàx=?ªŽ_—¢—•{ãšÚµ *Ý~«[tü÷çÝ/ílg0 _)e›Ê–“gµú0­Qnïm³76œ4XÛ´©ÔÒ‰oÒLt€H-[š*+ŸŠŒz[ÕÇe.Çüi¦Ås-}%™è‘Z´²âáLd¼;ß/Ò.Ç—Oƒ/ÛÊÅD;èèX²´æñTTÔ[eT'm´YбÓT‹Q_Õi¤Í"µli=ê#S‘Q_—½´i?.ô4ÕRŒµÒƧAý"µli'ÔS='1ô›ðyðÃËîÝgUw°y^~i!9NÝÇK»Üº… 5|µùiÿDzTÕû—_w¾¨½ia?ZZkŒ”>óaþlÆÀg4¢1lŸàÈG8!(?χ­*á3®?¡V¶ ?w®´ð ›š¿RqÁĵrp®'B½p¶òý|ŒbÕ¸ÒB\ã•–˜O1 F·¹sfLò}ziåýÚÒ»Q†Yz“$>¦1(ʧùÔWbzÁP‹–-‘¹¬-Ñ>y.² 5–.¼L!øˆk¬YŒgÔ,Fsk ¸'”ÖXKà÷à}d‚šu‡kµ`·ÌGFHmú·zðʪ<¾Òêӱ؜¶Ñ6u£ëKë„•î«-J@%ëb«ñCСF©0w`Ûë[‚ÝU¿_{'•±|ô»P Mˆk6ÜÛ~ŽwKUãkÀz¤oñÞm,šÞ´¯Æè­?¨²h¬:8ßP÷é:y]³"«C­cš!Ÿ7h± !!t‡'¥OËì;DÔ|5÷6kd¬€G‚ItÇåJuÕ|Ç`ºD}@½3…TuÁ5ÓÙã³BÆž‚ñ×Ì@Åçáûüäõa¬/˜ ¬êŸñj­;ÉxèL‰c JŇõÈÁ»§°ÆU81RGZŒ:noéž‚T؇aîŒ13iÖ3|FC¨)ys¦k‚Q1¤ .áˆ{7™±:A>y+òi U\º"kDÖä.k°Ë= ¸6±sRÅáú¤B ñ`ذƒctŒKÖw“º³|æœñÑvú™³êˆSÑ)p†' ˆO;;à3‘,†¿VÂ9 #ãogQä°IqøÔ!!íWBÒ$<ËÁŒ¿fOxîžî 2CWKà4˜áe㿤•Ò ßÇz¨Œˆxf÷þšÚË Õס!>•4÷9dÖÀ+ˆ…„(Q ³BIëŠÅð}A4Gn¤#ôC iÖtŠa[Q5!Ùíš@vcHκšÓY?€0’(˜6üŸqkï‹ïÓ-.Výá:q\èÅž· çˆ#È9=þŽ({‰È`8Ÿ3¥ÒhŽÚO‚! S0+³a1GØÃºD#ãS–v”ú,Žˆ"\]ƒh£Ì!ã¹5aócIاˆ^s´)(MßO6„H3ø) 7̶3=ÁÜ AK™!á8L/' ίÏ5FÐQ R2 )B\_Æ”{ˆj‘ BÀ&:ÌÅÌœµ&dšFÞƒi‡‚Q¡ø (>R+ƒp¨­ž?bpõÂÁp=e¶Ô„T'Î:_iᦌ¸)ýñ„0¸há…4K²Ó Ž ×Ö G"œSn(H JúLd=˜*0]âD. N¬Ž©_ …Ÿs†:çsÎtéB™±M9`ì¤õÝlÓËÂk`Kc7@}Û”Bâ·ËÜo—4"„g#E„’Ά¡ŽDžäSp‚ŽN2#A9I2ÊŒ6<)ºh„å= òdƳ*#ùG 2Ï#Ï.ÉÎ_%ŽÔ–…RRÉ”¿É®6k6ÛZSÆ*;²›hÅ•4C˜Pփв\~ß„*Çéi‘Kø˜´[3tq’>RKJ4Ü£T…›°¨†7{:ÚhÔ¥ŒœŠ¸OEk–XUf°¿ e]ÕPs¥)õ˜®ÈCëu†©­¬-×…ÞXÎøf(gî§]•¡©6Z/7¿õúçy¥Ò%Åæ$†Ì¨ã¡íŽ[x73/’”ü¤©5ÃrœpVXÒšÅfÊ ÙðÆO/ š/Äc­\¦sÉÊ<ž¶ºrOGÐJc¼SEÚÍ8V./i[¹ÉŒÖî¸ ¸XsÀùùõ2ZÃæXè Ï·mt´"½5ºЛI¦IÖíFˆ! —3£›ý¨Tþ-JÀa:D½ aÉoPÍù†iY¼Ñ–êr -s4mÓdñÛæÍÂØîÝ*wêæ ²3JË”vïcY<,;¬Kî›o?¹¹”P†ó#’”i¥9ë¦Äòÿa¹o3öö”ø8­þ#¶áöðÈ.àk(ª³ çÙSN3„*4ÙŸ(—$¶uG³¨olãk½äfçœGÄÓÀgÍ¥»1wÅVùÐ׈\e}\e±o夕º>“U?Ë•° 5êíãÐ܉´[Å·Ä",¡åêÙÕôf±sÍÄÞ–X„Ä"ÄB¦ëg‰EÐb ¼…ùÊuSg#o3ë˜Æ(g›Œ%>eD$dRNW9œ®Ä£—š¹|¾lqvŠßÃyš7õ)+ûö:çqF(6Èš¼eMÙ$I¥PâV)1qÞ UáNY϶†Ÿ€Gó[3ºî{!É |ÿA¢Pü\±¼{“·¬v´¿×ú;³³PE¥î5§S2ä¢rL2ä$CŽQÓqdÈt«Ü¹¼Þ#”¾¸ƒJ’ÄIïžþ"Ö¿ š†[ð†'3CÜLhÅ»f/hZKÇ5ûY­kÍ5äñl®õYQ°™Æ Va+(†î䥠w|y‹ÒÞoFGˆ—ŠÑ“R÷==ÌÒêø.¼ˆ ³É+ÂeIcû%A3 ê’’©‚ý?„{…#TE¹C²ÒMæ.à;±"ž Ê™!m^ÜSŠt!ÝÉØI¬®í(<>ç鱞ÕÙ%Ù×ÛÔ@¤4%o‹£Å¾Ì©/!âKÂ!Ò·MY~oyh$º¾ù‘YßW*t-t}aºO6ûÉs×ääŠ9ä,£·™{ªÚæ âÛìK¶MŒfú0¸fîÆ¢«ÅŸ{©ú@º:©Ý)Z<µÏDîL]JV–¤yœzšz š\žPJW 6Ƀûjàõ2î"1‚Œsä°•£ñ3Øa«ð3Ø_ƒ­©œ#¯˜zÅÃOòðG¼šx=xO1\9¦YtÜhìãåˈŒÈˆŒláä'•›õœP"јó°|>¼)#2"#2’ψX b-­¦üž<â¶ôÙp-ÉÓ=u¿„îáâMŽqFZo2ö±*èûŒØø×¼aé€ýÌX>%õËbŒbäÙcMøi=÷‘xÃ&wn4דGâk÷ý[³”ø‰#Ñ8f-žH<‡’,šE4KæòI4Kû öîQbµXºðfYV¹ç+ÙjI}&›fIš9Gâ÷P*Ë“BÍJ ÷­Bë<¡Ê›Ô WÖb_EævÖmâ~‘MúœðzrÎí•úʨ%NðmóþŠmòœÜR‘KdÜ•rK…ŒÈÈvFD³ä Y2¨>½³;I„Þ¢–ŒÜ<’ÏÍ#<–™æ®Mì½:<««–Ô ²BêikŠÌ'È»Ä]ãwvc°'ž­º]:€fàý!õ¤À1iÆÅÓÆU¿G²()r×¥â®q„ŠÕœë_¥S# ¶êh'…®ï‘®ªS£óܙܷ¯²x tjÌ ÇSλ-ù0š¯üap}½âÎÁ¿½T} ]-Ù\Ð[î™Ïí»™eÀ=vjô5w¦ðãäKÍR™CÍRZ‰ )d›>ìÛëéô°Y;·/”P¯Po¶§ŒÜû”xË~‘T„ñZò~yû›äîmú$Ž›CW4jæyÔR×,®TÜyÇ2"#2BÍ’ƒfÉ Ê-aDoRö`a®4Ü÷¬1ÖY¹²^r£+¤nIî(–wXÚD*ްo+iEØ6ã]âÉÁ'’Pj6„®ï‘®yk6ŽÚµýÚ¿¶j´U‘‡?è?¾~‹èÕP!—o ù9ª’£Žêr×ìU»Œ+ªÜxÕî°Ê½9·@êVMS4î:Òª¢ÃL Îµ-¬Sº¾éf¯ŒÔÇc íoz鶺®‹¦h‹è 2c³ÕÁlæüLÙ ½”CÚÑxíB0Ua:ˆ¼s„ Oå›ôf -†I761ß<%¡Íö\ÓÊ*g§i¯å®¸K}‘PWìŸwÿc 2U endstream endobj 4230 0 obj 3723 endobj 4233 0 obj << /Type /Page /Parent 2 0 R /Contents 4234 0 R /Resources 4236 0 R /Annots 4237 0 R /MediaBox [0 0 595 842] >> endobj 4236 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4237 0 obj [ ] endobj 4234 0 obj << /Length 4235 0 R /Filter /FlateDecode >> stream xœí]ÉŽä¶¾÷SÔÙ€kÄE f C€È!È!Ç1ŒØÈć¼~¤’ªºDê£ÄŸ‹¨*yw·(qý÷oþôÃ?Nÿúýôæýÿ9}¾ÿá¥:WM5üwêÿ}ÿ€«³àï­ªÏ\÷ÿ¾þúòíôíåóËçîÿß^XsùpüÑ5^‡:üýëo/o†Á_†'?¼ÿK÷ÛÿNüôçî¯_Nû{÷ãDZ¿þ…__”nú_þ=üÂ8ãªûãþ·¾ñç—¿~wú­›‚ºôÛÿÿ{Á*Ù6*hßnŸ²Ë¿ûOÑ`ÕI(UéæÄïæYwÛñß¾üÔõv›ÆYKÆÚF¶Õê^[ÞuÛÖU}Òmsj»Ÿf§ÖÚÖuÅ;R¼ÒQ:ºÌˆ…-­ÿÍÝuëUÛË2uèÎßz Þù¶ƒ¯(õ3bA+7÷DÞ÷¶ûqy|·kì)x»T·Ö8Øý`A+»î;쉼ïJhÝ£wè~é8B³*ÒÆ÷3baK»î<õšÕjØú&æo]o½ä"Òv3baK·ÞÑyëk6ÐÞ/ôÚUpG­ŠÔQ?#¶´ëÖ[]}Ž"|ñWáë›ãÃw_^Þ|bR¨^ÖüòS7“‹À:üøÒ-·îf cÝ_?žþPULþñôå—}®µè„ƒ‹„[JKEù†Ã[4lQ¨EÔ"ߣŽÇÁ³Æß¼ƒ»g]µð› ~Óæöîl!­·àÅçg@9¹’áC/ƒR}ôŸ5ƒ°Ãð7xÖpz€Ï¶8Öƒ)R®}ûs=®‡´×Qqïž5ž›Æùø¥ãÇɹ+×¹9%¤ ï/Þ+Là™p<7 ÿ` œAáÏMBÞ†©ÇßÀYcÜ”øL× ¼šAÇAo±$ƒÇÁô Ro…ÄЋù;”#ðŽbůԣ›Ksû<¹Eºž‡zKUŒYÏ\C–þ³>¸ÄÁ% §5—è¾Á2>^AÆwœ–ñ1„àoà^;ô‘³4mÅ2ÎT5ÑGÕ`HY]†äÒ8ÆÎµlz¥ bò#X¨Ï‚wZWmÃi{®,,~»ºûÑ)Ïrè㮓©Ôë«5zµ2_øîÛÖ›3gj§ÖÌhdÔÊñ­5gëÜ;ÜNùñ@Ö´™MÐè‹·¼é€¾ê#Æ¿Ûê¬TujÚþG˘žòSÓœ/³«ªë“¯/M}fLótooÉI/ò~ŒîýñoÕv2¾îðÔ£{Ò}3Iÿ–žô¢§cüüòî»DH£F¤iåi®T±mêf‚ 6¨Â³´@f”Hº½ô²øÚ\'š1:}2qD¯ž´cŽø0QœbüÚ­)NÍ}cuo‘6‹làcó ðØ|Æ[¦hxáËdʃ讇dkÃËûˆ˜Šã©º©³Q¡yy6·ÃÆ,‹ÌàT»‹‚M”ÀɇL…¸;œÈMˆÎ±ùáÁKKá¥añlQLÓþjJJ@1ƒ#$‚Í$Ìc+¢ê“мH| VŸVq?D Œ ËZ+e;#ëÄ’x`ÌçT yçü&d*š™jŽÓ³>ôä0Iê5¤ÜNHè%E’Å Lˬ‚"m/ñæôÑ ²’=H68‚”éCW£°ˆ›Lš%äg/XȹžâÚ·*\ךQ”s\Ÿ™íРRžpJçgþêé.ÔÓ¨ºÍÓ¹Õ2iL>I51å›81ÿ¾Æî÷t²¥1ò”‘k)ARp?²)š’ZíÁÓ¤)ÅLÚ ¢Ð%.ðnSÊ(Z}Lk péPóeè>$Ê•(ã§°¡xYJKθø”q襱mšÀK9:l§ÌЏ­/‰õ1 'óH4÷›5Æ/m  ÕËÛ‡·(D!Ú[ŠiZ¶siÙ}VÉ40«b]Þ’“^äý×à/)æÒ²¥0Ó²û'fð×å-=éEOÇHü%_¯GHíýŽ8çýz_qnùÈzýúƒ Ç)ñź•Kñ6&.)_KƒG.“9¾í•pgõbÂYʲíÒäcËå”p€§9Šù˜’Ô–|XM‹bF¤Ô4Z_{ÏA±ÊÈ³Ä ?a)Q0=Š™DÇ¥´‹Ž1¼wñi‰ŒOàWò‡\žFªBÉT¢¹¿¾U|Ø·â•™E-)™ÛïäXðÖÞvŸjÇ‹Qº>ÙR9ôÁéžû¡„±™ôý(ó2@†”ÐÎÄjsßXð„q€Ïgc·öÜ®¨º¼>°%ŠÝ€¤CRâê<ˆžR~OxÛ2“üÄÆç*¢¤_‘²žžÖeñF¼àÔ*BD•$ƒfتåc_ôÂ;,Š1ㇽ¦B<—¾žÖs‘z®ž‹Ôf=—þ‰åÒ××z.·^äý7—¾ž«ç"•YÏ¥b¹ôÕ͉¯ïë¹¼Ž‘Á¥¯oõ\Ò¤ÞÆõ#ä¬þeçÊ7÷/GqóFµ4—Ùå¾ós3¾‡©z½,íeëañ˜¾AÚÚ5»© ý+ "¹ U3f°ˆ<¥Ñ¯†ÄÛ°Žú¹8Ї&@³$6XRj;B  )s<Ô¹P 8Jµäbj/'ßF+|aTiT/Ý!Ú¿>ˆZð%Š—7n˜%‡buÒ#Ü%àÚÑ\u—¼ñ#eјF˜t¿g±†›g§7ÌÔ¬^VVŽB‡Ÿ÷GÑ)ªŒÜÓ+Œ)]ó£oèŽØxœ?Á@Á[ÊUѼöÇפÚé*E¬Ãª±ŒÉ5WcrÍõŒ1¹æMýÓ˜|yKNz‘÷c\É5ogŒÉ57o韘ÆäË[zÒ‹žŽ‘Þ˜\‹ë…ÐiŒÉŽj:#«‚aY]ë2Ê õç|q}xj”Ô‚eù¼ø }‰ƒ¹2ÂaÃ;lx´ÉXr˜½¥9æ³Ëâ‡ó&µx¼§ûDédï—6mEÀï€K‘¹|,'Ø"DI¯L"|„}§•Š´lM΂%œ"!`ºƒãÖÒ¸ 8U|i=lË5¥ú…cà I ˆyÊSD?-ö°VÇøÜPÍ%3÷ã]ê1Çú µj¯ËX¢:+]5 Š®‡ÀEÄ®ØõR‰‡tG ›=8~H†´\Üqå²Ü fËjƒG @K6ö0úg£†ÜF·êg̤[=‹°ß) ù2qGÉ“i¢Ðãåð¢÷ x„îx8³ÇáKð°›ï’ƒä›Úõ’ÓGö—23’sõ4?»ö9ÂÛKáÃ0Õ*Ê6b8š²|ʘZ`öðS¦õ®f^Ímªf†Ä•cTÌtÀ-åºð)ˆÇÅ—ˆ.‡­OÎ÷ˆ¨$ÝメíY5NiîR­”>ÞÊÅ0!æ H¢dà¶öîµ6lÀ"0®Ü ±XÐŵ£7Ø"¡‰ÖQ ‹ô0´„X?wê†W=à\³B0T-UŽäPãðL³ÁvöÁÍA°‚ÖÜJl8Ü’»„KǬ ´=uÀ”kû½æ8ÈÁq(¸‰Ãì2qÿ àOMÁ¹íi…â0Z L-)A¯8H®‡½Çi)a¥·I'‡[tF Cß úbº`jk6=Ò¹´Êõa9vvGÜGÉ€ð˜¢Ä1>Œû¼½x´¥¯†) îBþqV­G}˘ná‚ìÏi tQR¢/U2²Î”_>FEJúÅd™ «oÎXrߨR2…”iý!€é®<IJˆ‹ªª§Øá%&S2I×°aw&yGŒ«x=$¹ ƒU,ln \R‡U`|røà8 Î ;hr&±Àׄ¹ØX6:ÌpÖ_Ih¡˜ƒÆ‚'^³¦Œƒ{“Ø$V„‘Dq¹xöœà¤¥\$ZQL鄟Gs ãÞ¼~¾™ïÆ¥\ ¹DQüLép¸å€|2›ÃAƒe¸Òv\çÞkJÐÞkwÈ+¤Øàò9ˆ×7xwr™S,)Kòp×ö†MwuÁ2Aáó¤´ÒËØý`-³=^’¤ŠL+-™ÓE¦òkqI³Løì˜[ÔÒ‡%»¾·‡D]0qH<¹2|(n¢§9…rXŽó‰¬8²N®L‡¾›O6ÔÝñ#³ b¨ ØÖ –IYÌFö)ev˜ì0Žð¦Cç‰Ì«Ÿ'Ëlí~ºâ×LÔíyÎó´Pd‚ƒÖ”Mk ÐsU28 ±hH, ÊÅ7½"WoûµÈfqÝÖB¢8œ@Q(v‚lIFo³ÊÑM] ”Gö9>˜Ÿ2^Lç ¨P²˜sÜ^·‰K_ßàBÒŒ#]CH>$%ÆÕ`0Öâ+±´K°–šÓaºÓi4·öa3Ù >)Vº ŽJǽF¹‹ƒp‹˜Ož å6W«ÒGÜÿòåvæÖÝ‘Rø= :¾UF(JºRä;d) ZIoóHdò¸Ä1Å]9"Q¦„Ž-ékÜ$êpzÂÌ#£ÜBmS4ÂF-KC§ÊOÐZU«Âçpm6d„ÛROðHýt0úI+͹þÒ¨Œ†h¦Ùt-^¢¶ÀêV.¡€• ’©2—z‹•ÿ]Öã)âr ÍÙŠý%„³• ˤÊ's`ÜY 9Oa—u¢Ž€:×ܶ¯Ÿ¹ý% ÇÕMN ¦8ƒrrWž;ý±dWW.súöX»Ïðîía§ä ´ö™öVò¾¢ø`;š9µ,•¹ÓÄ(Nd‡,T†$Òì"°~—–ŽÀp‚þk0pnƒ5¥£tÏLóxÒä@ô‚µì¬r€Ê .0UŽQl±”À=l+ÇÁd…Ë(¢ÚCÐòöôeŸÖ…ÃÖ]‚­ûàÏùd®}¦{öÛ|R€ì€ÂN1iµydCþ|©KGËÑRF˃&Ãç¡\Rd>­Ñn‘gu ßËL ˜©ƒ«/µdY¬âïéBЬ¯,ùÒÙ6u3‰:?bÙw•žá‘àà‘É‘&Ëçz6É' ’@—)CÑ:PBͨ_ª5@°˜óæ±%vŠ­ÕÙúÌ,?;«/Ï•aëè)9„â‹°ÁÚƒü†dpz@dL*ïs?¡f0Û‰X¤Ø„üÐådµ ›!=N $M¢ûÑŠ£ï3{k{H<.X/»ÒÌóœBY;Çù”P‡ñ çVÆ5lµ ‰V?®7'J§†›û”qŽ u×Üž'CýѰñÈwwIL9¯elªl©í[Ž‹Âk Ðf¬Á‰DþQJE?‰ö1s£½¨ÿ½†Úý;}ë˜eÇûÆ_upO›íV¯l÷³“ñ:?]äØª9±nsႚ5C˜âIT·÷„5͹™Ï\Ñò<ìŒ…Š¼=·f\àpíLËà’â̵‘ 5†³ÖçfðEšH:7Ž‚ßhøÍpÔ-?óJôM&S˜ëmØîŸ|€ïŽþô™~BߌêÙ\ Cë=ú~ߌ'æ³öqn€ºþw^³[©Þî>Sì­?Œ^ì8o·sôV[½‰Û7ÕÐôÚR™°ÃñÚ!„`¨ÂpàcœÁX¦xÕÈx¶xNc8ûlb¼y6•ªš3k™j×éW2×rWãsL^qúüò„î: endstream endobj 4235 0 obj 5565 endobj 4239 0 obj [257 /XYZ 40.7999999 533.779999 0] endobj 4240 0 obj [257 /XYZ 40.7999999 533.779999 0] endobj 4241 0 obj << /Type /Annot /Subtype /Link /Rect [421.919999 375.379999 494.879999 383.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members >> endobj 4238 0 obj << /Type /Page /Parent 2 0 R /Contents 4242 0 R /Resources 4244 0 R /Annots 4245 0 R /MediaBox [0 0 595 842] >> endobj 4244 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4245 0 obj [ 4241 0 R ] endobj 4242 0 obj << /Length 4243 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ERÔXí9Ø@‹ovƒÅz‘Éò÷#µÔõ•ÄUMõÐ<ía‹"ëñU±X,¾ûËçùãøîéóŽ_‡ŸOŸy–—yÿçØýýîöºÎŒî?VµÍtÓý9~ývx9¾žÏí¿/Už~´çWôþñõ÷ûþå‡þ7ŸŸþÖ~úßQÿÚþï×ãÿhü4ô×}áÛ¡nÊîÃoý¥•®ÛÿÜ~êÿ}øûŸŽ¿·C¨Oývÿ~g”*Û‡Vãåò¨:ý½}½,?šö“ÒG¥t;NÛ’ã¿ÿ:üÜövFÖJUeQå‹{­t×­m»mªò¨+åtêÌmYW«;ªê@u#R릦ò¢¢»b“¾6EOúڮ蹫•kr¥ê0¤ïF¤ÖMíLzÜ“ôM®:MÓVk vîi5åu]êÈt´X3³žðDOlºÓœ&Ù¬”økO«ÉU¦£nDjÕÌÎt‡=±énõ ïʬ湫µôRy(Âw#Rë¦v¦<îŠKz•×=4›r-Ö\ºZMúÂæxXwмjjéÝ®žƒ8_úê|½¾ÿrx÷I¦î|Í/?·#99¬ý/ítm;‚öõºmýéøçú:ï?j {+~ð§hØ)JðÔú·¼ Á£L 6˜§?w0çLî;¦—ø_Z[´¹e)ì äbI¬ É{®cä"pòž Îƒiú@Q¹,‹yæØZ(¦ˆÒ• }k³Bï±n…•yâŒÒ˜[XO` Ë/Áþ¶:úáÞ \ò-á‰C$5y’ŸÅC_Œv’¸\iuž7ž¦"”ÂcǸG@ø} )Ç@ȶ¯Pb ÍÀ(„G 醵vvÓK¥Fm`o„\s°†³>ãX–°òÆñàÞ ¢]1?ž}Ê%1j†$Ýãî´Ö8*‰×ÂA½>)ËBØŽþàuz̘ÆAü$£¹Áh‰c/ {ˆãOéMÜf"c¦X·YœÃ- ‡a›ó[?„zk^Yä§WÖêú¹,†ªÒ–Úº®K=æd•å#‹1mft­^õJtÒ+r™iU„+dX)YÑ÷qÓI[,lOtPÛÏÏýž–!Õ~O>3(+1¿ž¦Þ7~ÖíÌCL Ë]á¿f@¥2[”ÝÓ zu©·Jú¼šää¯uÚ‡¡¸ðhû0R¹+ îãU8GX{¾PF¥â'cs )íl‘ùÎV“¯Éûcí†Åœ ºË}o©LšûcMØÝJ,;Ý8þúÝe'æ]QŠKíVîrïÓ-‚´£hà]ª°™Ì’Þ‚žÏÆÛÂY^_T,Öä\‹µì2j†³—”$ŸÁk58¶?ƒ×„±SLå 嶦ìÿÇ[³„ÍŠ9¢!™/Ó”ZØrNgãˆkàÐxgŸ~‰ÝKª•0‡Ãîp¥˜HÚWàŽMj_!Ùg9Ÿ+æÜ{V¼&IHÊ|O²‰ìDG/–-×äÝ{cñSKjy[-£'¢!Õ[q‹¦  s+Üy¢³k¿p—Ùùy©f^Ê@ Nƒ¨óšd«ÜÉ`­fç *V«rèñ b®Efv NÓö•ÍÔ+uyz¥²—4„ ˆäýŸ ¥sZ·…*;j¹ ¶Ç3 >ÓÀgzøW&«úÓ‰ žQ=Œ©<ëèÞ´h4‚áÔ`™™Óá:Wíë¬Ð‹G€Ÿ¹:jÎàØXV6ëOþÝPGÙž êñ9eÎ|0E‰ÞਯpéÐ ‡óéÇVe­L—Sç='8§žÐØ8r  ¢(1êO3¿!£F€9BÐÓrÄ(†þAy%Z¶àÈ”6cy­ j`]ª¢]ƒšøˆrÏ÷†õœ†.ï ¦1d±‡VašK½¾MŠ= ¹y–Qýa¢›N–Ÿ>wêCøTÀ_ÅÀÕdÓûœyvÎÝ:¯©Á*+°¢Ø„[×ÀF…©¢!$>œq«ìAõŠ©g¬kíàÈJÁw$Ž­/âÁa,Éİʆ¨üá HåÓŒÀ:¥Iˆ§Ilh‹mmFüuD’¨ˆâˆ$ƲYëL(£þQ&,¦àãºQïÇJ?&ŽC„MÁƒ{xhƱyÎ:–Ôâ6‚0vâQËÇ1ÀCÛÎl!L«›zŒiËÉÆuô`wwň9%ð8ªî>Ddò{”h#ŒöòðJÆÛõÞ~%­UXðpÖfãâV˜í/—nÍÒ×ßóQ½YãC”ùãx+Ž3äÄ.B®ø¶^Æ¿,Ç öæS„Sïøm*¸Qv¬áw \(Œ!üï#‰Yv¡ ³ò®F¬> ¸¥Ýª±ÞAl†XcÉwBZXÞd”$…Å8lX|ÍÓ;Z»¡ÚVº©­ãkxl¸Öšá¨?˜ó!WßµåâåÃûŸ2'²ð™N¶ã~fN…MΘûÓúÑî×Ñ0w¶À|F ++ŽÍàÓXœ÷àš)xyé3! £ÎiÛ%0â>®[8Œ÷^àÍü<œ¬û®s”5#ާÆGÚaÔM5âïýV8þåD:ï_$ð /gpKØ…ñúXäæ÷A¼’7áÍ7é4VØCèΛù]\m™‰G¾kɃzAÓ¼–{ÄBÜy]ƒ 'gûR(°† ÐìåT>W‰yÌÓc+”âõnhš\ °’ÓY?–E“urJ8´t÷ù81"8zÉè‘©ôkažr×#®Ê‰ùq"ùs÷ˆSªFIï®—¡^Ñ='Ã8-a£{DÔñ"Vˆ[¢¨:aRByTzƹ'ÙÃ(ìaò¿’¼Ñ6T׋éJ¬Úœ»ÃÊ%¾K£=a ‚Vmáø\®ôòf´–@b\ý$lGFÍ‚sðË© “¼¹jýR»ñÅ%Uh`¯²ç¸ÔÕÙ¹ý5Ôƒ­³z\ô`¨B5î95aÎë÷ÙEòˆ<ï:çmMx>Ìi­ ›~{:v>¸f~3ÆÅšáì91rqñ`Ýî=ösgóx 3曇àˆHß–À?œ>¸"¿ø‰§5õ?<²ŸîTJï3+ñ°'×C&¢mtÒ÷ú‰/XB¥6" çǪ¬9fæh£RØ ñ(©³AÖÉ koÁT½Óþ7‹PXyœd×jìcÇø^öÙí$DŽF$*‚${ÌœäséÙÅW EœìGŒ '§#_{ÐëÚ\Bɺ¾TòúõR©yí~°"mš—,¯BêJåˆ-ÔEÃâ“”>ccx±û<~I$pýÁ$„ðx8»0 Z²Ž~¿.ØÂ:à‡GÞ%þZÂ@$ìÑÎCòòD}CÏoˆ¥‚[‹Økä´<:ìÓËJq˜â0ØÓLkžÐ¶:Çh‰)бWÊ?ÆÑ'ì-À÷HÆýÊ¢‰Ææ¼ŽO°&n¬‰`…’$îU¯w…¤*páA©Þö (ëÙy?Z 7p¹+¢pâR»þ†·¢~t]E#å÷lŸ2Üqˆy©¨ò2>Þm_ˆgp –1FÁEÇeE9¥¯`°ÖÂ8$áí2¢%ieÁ³t£%m`U¤ í%òb8¸Á(­:›‘æ‡øŒòÊu°Š3f9[x—±Å%\–D8S‹¹€ÑêöŸð8%ðwíÛùÍÒÚžn©J#ì§åøj÷‰ƒœgÌvŠÅŸ HÌÑÍAeôìZeDJÏ8¹ŒœI´ªó=d™Çl©ÒJç-åñÜ_S¶tÊ–Žƒ ì“'þÄ“--ã¯èx¼ŽŒqò ¹Ä˜†G€WÉð=x>ÑÄ’d¤ÏHçØ¼ËÀ‰ƒ|¤UUÍŽgŸkó¨cÈAër¤èrŠ.Ó¶?æ•Ò#F—ëF:áá¢ËA2ÅCctìqçFYi šGܹ1…0ÃRžX_Am0œØ~õƒB$ü,Î%—A3 8x)6Nì}Ï‘ ä²ÒûûiÇŒÄ |µóÝgÊÑ@NtáþˆÂ™i²®ÉºÎ¬Õà¨-'ûš±&äD>,§>ÎŽÇ(ư”„6rìOÚuCå°{DÍÌ·ñ|ç-Ó>ÔàƒVÒ¹o¬Õ3ã´#5ËßÃÈM(»›*íu•’*õÄ]#ãÑä ‚ì°$!QKH4ÕMd|¶f™ö©%µì·åA+Ià“j$ÂÜŠ5·‘¾ãNååyëºîÙËê&/髿ˆ[é<îõs¾Šï¬t½üޏ6ÔãLx¹çÂdÎÐEÂÅ‚gM\rÍ qßòÛ3‰{_go“ÝæöÌ]^^è΂qÑ6q7¢‡¦@ò¹c\~)¨ïu ©æ€GeûÊñ}ÈËi£Æ*»ý…Õí`G†€¸Òt‡ [(¥ª×s™ò`8{¯Œ|—ge'JÕ šÏ©;EÜÀˆÉ-Ëlÿ_Zl…«ûÂðãë7B"]Qί¢üL 3ùè¬ÔåQµÓ˜P‚VÊþfߣÉ/JÝ­²ÌÊé›È›"sà©g®²j ¡=9«‰–ìŒÉt3‚ÁmVöà0†Á©÷Ôð™>Óq¥3›®éÚòöÖìus껽0×3ü„žŒîT‹Bóœ ¿gŽùÌ}ÛIVH]÷YÛ ð* é‡y å@ýà/ƒó0!ƒ;JôfÞÌ噼oº¶äcÙÑxîPB°Ta9 ÞƒµŽ`€ïEoÆ£Åc²)ÙÄzóD6ë:/3Uµ®ðR!¿©–›ÊuÏ!mÅñùðÜbÚ endstream endobj 4243 0 obj 4169 endobj 4247 0 obj [258 /XYZ 40.7999999 500.179999 0] endobj 4248 0 obj [258 /XYZ 40.7999999 500.179999 0] endobj 4249 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 464.659999 528.480000 480.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 4246 0 obj << /Type /Page /Parent 2 0 R /Contents 4250 0 R /Resources 4252 0 R /Annots 4253 0 R /MediaBox [0 0 595 842] >> endobj 4252 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4253 0 obj [ 4249 0 R ] endobj 4250 0 obj << /Length 4251 0 R /Filter /FlateDecode >> stream xœí][¯Ü¶~ß_±Ï"‹QPplŸ}(`Ø@‚>NÓ ˆƒºyè߯´ÒîY‘ú(qDRÔ®lÀçxµâeî3œ¾ù˧žÿýÇùÍ»Oÿ9~¾ût*‹R•ýŸs÷÷ûû¸.ï­uUð¦ûsþòõôíüíôñô±ý÷Û‰©Ë‹ÃöáuŠ~À?¾ü~zÓO~ê?ùôîoíoÿ;óó_Ûÿýzþñퟆñº/|=éFu¿üÖÿÂ8ãºýÏýoÝÃ_Nÿîü{»}·û÷{ÁxSr¹jßn¯²ËßûWÑdåY4¬[\ûO»ÎªÇÿuú¹í¶Œ¢‘ŒÕJÖåâQkÞ [jynjuª¶µö¶l(¶v Y•aêVÄÖm•²vE½fÕe›\®ýu¨µã¥ba@ß­ˆ­ÛÚôx(*è9Ã6ëÕ» µv Q¨[[·µôŽ¡È •èN)WClj5ÄT¥á°][·µ+è­¡>QFüU}s¼øÃçÓ›&…îtïçŸÛ•\xÿãs»Ýª]A«”$?þéü§²dòÏçÏ¿žš¢jD]õîI)Ðþz"í>ià<ð‰cÕ>áðÉÂ;AWÍJ8ÚÛ;e?ïá“=‘(Åk“ÛÖx?x~0`¸Aþ)1ÜÞ…¤^F T8Űý >|nejt ÙTt I’ªätÈgx4,k°t˜*0†1]biçq@R’CB>#I; <?Ϧ7aª(1 Ÿé8ÜD±TåXÒªiC‘òD@NÝ^·¶Œ D ÉXh!c{›$TîånÝ¿9툌qê°Äá<ŽÑÚ^`[ã4c¸ ¬ñ<“= D)|Šm;aФӻœél´«ã ÄÇúÓ Å¯%H! #ØçæøìõõIü¶Þ±~D B[sx§Am|‡æßÜ*ÁôVµ‘`€w yÎAoØŽÀÿ4ºC·å¡õDXƒ ,‰eÂ}W*ñ¾.&¹ó %örD 3ZÈÛŸ‰90¨Í#ZÈ™oB€¼ãĘrþLÐê%^õƒäb¯…äµ)ò2Ù (±ÔÃO?üt7%>šŸÖGÅ>]~“`"íšóIËö§tÛ?0ýç¬);=lÃò° Ý:®º"äÿQ"Xç`º®(ˆÖŽ˜ ¦^lRèúÈÈ@*SN’:˜ªØÎÄfk2å“ÅJ°F&ØÑ¹ç!ät¦’ûÔ®–C¿ýÉÞ£É&Ëí¢øÕsÐ1î±}®ÚA!YSHàÜ;:¶ÓØlUêÚãÉñ乞p,r=Ùhyø”ujlå‘?%ôš*¥aIV*Ë5yÝ­>÷$Íîx¦ ˜R–ý”úª’#Rº)¯îAÐ6úÂýW/ä´¥S%ðbäë 1ª5ÍÀ$¯³XH¹ûª„_ííiUp¦gVäÄZšõ®µ"ë<:š¼3Ζ4¥`v‡$Õt-_*VJ¿ÞþÏ ­Ë³ª»5cºÿTœ•*.«+Ëë'_Nª*k¸niåú-9EÞÏÑ~¿ÿÙt¯·[6æh?i߯¤ûV3¥ÏñËé‡ï"±†îY£bל¶Û9T­ª1kp ík ÇvU®Ù Zïâyñ¨"ùË,½c¶Â+Á` /à A„Ñr¡ÀŸºð— ¡5´&ûñ¢ß®ík{iˆQÜíB}Ë¥»cõà3iÚƒ‡0þðÎíá-€¡fB€Í+ (t³CÑfêŽ5Ã`k.Úã!ýéçR¹Ø^| qÈîë×Ù¶\m[ÞLÙ¶‚™vgû‰eÛvß’£Qäý7Û–×S¶-Wæí'–mÛ}«ÒŒçH`ÛŠkÆcÛ6ÝÙêÉb‚Y:¯[RÐzsü¡±ç½ŠCñe¬øâ0õCi3‰ï#h±k4GÁ1­_® ÝaC!¨¼p€R¯¥†jˉAH‹µH"L×ÀAM˜-Ãíxˆ‹à >$ÂÒ˜ÐØ`ÊÅOñþ¾Q›-rHÏ#šŸ†´2V'qcEaØãsŽ("*©F)CI­P¦KxÃÇfÆ6æ}l‡â}-wu¤˜3[V yÑ :6E\=Þ×Ü£4NãyçãÄÁ%:H‡bù,@:!œÆîH]z2¨ž´l%ÛJ4?°7|¹˜ÙŒR*»è!¢EM,蔡ý!$÷®™fÒâpØ’9lZ@Ëqo„‘ ‹5$!€Ã>V„Ȳ'æPÓZeÂ4WqyVµ¥ò+Ø âcYìñnK®(ίCµÔñ< <· â²SüÍü8t¾%c–¹?ØQ”`ù×sŽ©jf©z§‡ˆóåÂgq“­™ª¦?U±Ë½iqAÂ7A²ËKÙ(åö¸¡ÂQ¸N[ÛqùK²n‡Ëü³m!RȪ†œ7²~g¬¨¤ê´™CC޳çÕ,^À¼»íp’æc¬V {ѽ¦Z•¾È–²¬Š7ãa­)Š’1e °IMÈ?—é©Å8ÓSË©LOmeajegzvß’£Qäý·LOͧ2=µ•Mª™éÙ}«ÒŒçH驯“!3=#[èec¬:ªàÞ¼Qº¶Go¬V<ò9 vxîXTX¾bÜ‚"<š© ‘_哿‘B7Ÿè‘­«UB2Ñ[¶Š›%8fTÂ$$F jë¬`J¢-)ù§Ö.æítœËYF'I©È1ú]çA…ÍÞYŽÙ%Þ~Vô Ë_²è•Úa‚±·¼èr¢cÝcžhÓFÎ9MÇãdM}^úB¦qP$¦ ÿÜ›ãŸ8©²^\ŠñP~Ž˜Vz!mHP b]ÚBdÞ–ˆSh‘4ÍrKapx¨Ç?‚zLéø*„R{ïQ=Z©¨òîR¿U±TÅÇ¡Ÿê¥¸ÙªûÄŒ¥^¾%G£Èû9®±TŦ:B)fv„ê>1c©—o5£Qšññc©ŠÇè•&–úºvK¥Ï:b©”û^bËŸk,õ»’ÏjŒcWxÔum§4v&‡8HE‚³@éßà‘ÏGñ_6è(%mH#R_ .™7©B¤™“¼¸\kâ*hÅj“GšÇu£ ®™R±Y³‚R¬@ 9ÌyœÑŒYN9’›†}û‰åKóPø‘û–ù·ø Ë(kª¶ŽÎmÀÎlªˆZP& ¹&8¢Î>riÛfÉv~ï|‘aÃqk¤ŽËo<Î)™?a/$ Ñ”2l6÷æ´YD=¨Â‹¯’š’*Éa:{”ËĹé‚2Ù+„¹OëfkÃõâq³ å  i³ñÏåÿ¹.oøÀ}72¬1àw™ÿp\Q¼D*ĽÅÌC†(íܲ[pið¯ƒh)Ò’"Îr-ðŒ|¶Q ÇéÞ¦¹‘Ó&Fž7»pOýÐç-£WŠæ qûa¤à$à]W›xEµ¨Lôh›îA"aoó ‘¹¼¦þУ½+IEÇ;²í#=MÄåþÔ{iíªf²G|ŸˆSËÛ”7©, ¨køäʶ¢¦L$w$|§Aï É$LuÏH&iLŒ6h(Uˆ ’ïG<¶Brc4Ç à;â\\Û@‚¬*z ¼ƒNÿ+‹ÞS³|UpÓ‰›ÝODc0)ìÚc¯½]-è–RÍÀp¢)ÕTýòM°whm cáʱê¾À+Œ€8lÐ~ô !ŠW€çqÀãÃÓhP8¨—@£$èÀÑ8\›c?ÆøqÌCÁ6æF ×c®àªßCz#è"L!èÔpL‰˜Oñ<p#ȃãC”°Óø¥ær8*¨¯ ´R§Úed³‡LŒÊ9l׾ɾ]×÷Ãâ+aÚ“”c)é(IJ”–¥ÉBçal;:óaQz·Ø˜ºÂR”£6þžÎ?©;x=¨Ì®1¸CìØtÍ-±ç{p-õtr~>ïA/´åB­(ŠßÃùYŠŒ=n()Ò=ËÏn|MâÛ·¤ ‡ÎĸdzŠäØ2t3VI%³ðý‚Pµ"ïF± Õù]VrYˆ*ýX)GŸüvú Wì™oüøl½øç'/Eu£®hcÍýñ°ÖM4F[v"|Ù¡ÕõD&ø–TΆmË,LÀ†HL幎íå‡PzÕ‘ W÷YZÞ.Rܾ{ ¾Ixó³·§Á–ªgדëÝÊ v§ÕŠÝ9z`Á™”øRO _LÙ„n’Ði×Aó”n”<Ó¹Ž0SO‚ŒÌÓXSV½îó=îéAÀ}Éê»P—õ­ÒÝZOFIòÖŸ Ö#$]â³4Bé•„«ö*¶ï î$^aÇu9¹š‡íÙhGvaXAœ`È;ªY­ö)‹+ ôzľ׊kœ¦æ!Xµ˜7ìØ†õDÎ^f…;Ýa.èÚ²Ð{¼›÷B7ª¨ö¨Ï˜uYèdË<ÊÂ[&Hh9º9xÙÜZq„Låó©S {÷½TäûZú»¤î.°¼!ôó¤è‡”„Ò‹¡…òFR´*AS8îí¢HcÜðNãwbýÑØí%ºY`?­ DmÊÃlxL%Àõ4aÄœSpsÎÍo_›ïõ$cÅ1ˆ•±²üô ¤<ò ÌnANe竹ƒÜ'²#Í¢n’+òŒHÕøÖð!F<«ž-ÝeI5N ’\RSG¾íEX&oþž¨É”rÎ ó¹SdØë°wKoÕû4· çø®=clÅ2ç³]rÎDVA„•üu¤” 01u»à >n€n<©Y–ë8<‰›¨Ú¸=ZˆrÌ.RÒ¥¾]Cëîó‰ã"w %áTHƒqN'¤däÀTö Ä˜Ã\K8ÄuPÈæ-0);Ýþ‚; QÌ%¦$V°}pcܸâÔ/´ŸP»ò’ÏS߃=qhWL±n¢èÝœcÉ®9Ä=´QÚh{uxtF!ÂÍAAÓ˜(Éã}Xa:€+Á¢¯ 4%_“H{<¡=ÁšòÐF¡e#ÑíÑJäÑNª$_‡– Ö(ñ_ûo.ŸçÉ!ñOâg]°ú4º ,<¢–¨Ö”O-qh‰§© ËŸFâ†(ý”#$®¯%RÛ˧TO0NrŽßæ\0KÒ9¸ÝAÐSãÔŸÑpRh&{Rˆ[Òrœ{u­”óåõ—¤ÄÛ  ¾ *@=n¢0³Ú3.h½ºy ‘Ç’ô§ RT„¯‘¤”SÄ)î›ïʽŒW^:pŸ]qŠb­älÊýöÞdcܨP¢Û±Jõ„Uœ±¼RÀ£h6R)nЛ\U]Ù7`ñKýÐacyÔEbÒZ΃E‡þZ:®§43Øð蔼SRôžšUS–°ˆ['ÚÜ»¹ÈUýL)åØ stWJÕ‹yó®l8Á'È9\aJ€eŸÅC‡Œ,£1í8öaMÙc,‘¬tá',]½URlóž‚Yô<årU¿fÒ“]Rù£èl8ßþ"çƒKrà’ÜûxJ™ºà›ÔáTæ¡Õ ûÿ!¸ÿð`GÑÛÛ´Ieߪný¤ÌM”3ÊQPÌ].·g#}Ü ;”ã'ŽÑ°­H±pƒFÊ’O 9)mH|†yï”r÷ÆŽ0>‘ZNâ-”B)Š~vøg,÷)ïˆNS<J!EQôáR¯tJ‡wÊ<:Xö:,+‚äV,%R@±q(ýï)ÚŒrG!’ãà¶WÐNûkÕ-!ɬòŒS´·/°9¢¬yÓŽN$óæ³mJ )öPFó)MÚáxïB0Ua:p̃¹®`8b]43^-^ÓPn> endobj 4254 0 obj << /Type /Page /Parent 2 0 R /Contents 4260 0 R /Resources 4262 0 R /Annots 4263 0 R /MediaBox [0 0 595 842] >> endobj 4262 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4263 0 obj [ 4259 0 R ] endobj 4260 0 obj << /Length 4261 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÕðM X{ì90Æ@AÁl6Ábggùû‘ZìÙ%>[²ecOÓ|Ô“UÅbñÓŸ¾þcÿ¯ß÷Ÿ¿þgÿÍü|üº# QdüÚß?\~ÀÚ†³ñWÝʆuÃ×þÛ÷ÝÛþm÷²{éÿ}ÛQuèh~ôÇ)ÆÿöÛîÓ8ùnüäëã_úßþ·gû?÷ÿûeÿ·¿÷?~2ã ð}×vjøå×ñÊ(kûÿ\þ64þ{÷×?ìë—ÐÆþýSA©dIëx;u¥‡ïË®h2²çSBì)eý:eŽÿþs÷s?ÚiM×ÿµVB“Ù£j6 Ë%ßwZí9Πl󆢩)©ò 4¬ˆ¦F‰Ðþ¡¢Qß6‚I“Q*u ŽÊ< +¢i Q‡ŠF}§ ‡õ¦bLåaVÞC’‰†j$ ´#êñP±¨çTµ0¥NF˜)óŒ‰L$ìWD“ 3ˆÇ#Eãi• ïÇ‘’ÑÅy­uXQ¼Ã‘¢ñÎ[žIÕœ‡JHòL ?¬(ªñ zٚ͌ódŒµyöE®3iùÊhhGÔã¡¢Q¯nîd2ÂriùVeÒ6ú ›S ;"Ž‹wAD.Ãæ ‡Äùƒöðjm¯ûÒÎî §!¶Èq¾FŒ sM5êã¬B·àÑ´ <„˜({gT‡:xg°ù}™3/ÜÁøÈ…”‡1ˆ§ÅÓáÙpÖÒ+&Ÿfe<‡MlTxØRÌÆZ ’BXÌ!5æ9(ÞÁ'óÙ"¸½F‡\Î4x­>‡~•ÊÈ^ë”,=½ö»L¡=£¥Ö¦‘YABéÄbO6…ºÇ(d̽¹°ÜeÝ-,3u@²îš)¿¦ìys_-óVËq“ÓÒja]Dût¨‘”^I)}@â¹Ï%<} " ÞmªÞêÃ Ó ]6³Ïs8<ÌŒÆm¯ ¯š¡yCkÃ-äÎóû@x^µ‚…ðkN7ܱa‹Üó[ P#æü n.çy˜à‚ €3fiÌŠ`úB¨=8Äó@nY5ï•ÜFG×K+î(D[Ur{w q°ìÐñ¸\l¾½ìÙU±íRLJpM]¬Jî•Ý…)ˆNÇ|uˆ…C¤²Ž3öØñ #¼Œ(ÛÚƒ}“6R¨+Á áOLX±å~†{ ÷§Ž³zGº0n°Í÷ã<ZR7”ÜU4µ·Læ€0#ΖÀxó£eCº€F@ d2H–%4‚àùj Ìà÷ùkŽ‘gwàíëÁ†ÂësÄFš%X6¹û»ѺQ”W /»,9 ðp ´ ro¥²”;6M0:<¦Ý´k€ûNÓû7G7›PËÝÃ-k0gjm/+‹õ'*xÚ-æÄiO{yl¶î3ŽlZ“ Þ ÊfsüäF‹§Ï3ly ŸÇÓò¶< Ö·ú@x(ÍÓGÁ>”}N…-üll»Û!ûaÄ9±«§U¨ÊfXçj"ÀC÷l )Q‹gED8ðžÅÆøLÀ)«´¥²E—BåÃT1 µ`…E¡ÆÊ”Ã3OA%§Rrâ©Å´<,£år1;&…Œ±jf ‚”gKV˜A{)®ÕÖ-üBë‚có ¦#æ>Q#šOó"æ8loaiÀ\ ç$B±]WÀ$¤=ä7ŽíaŒkǶÅbÏ¡Ç<żƒñö¥¢dtìzV Cùè@'Ži'%¤í䃤”ÖG[ƒÏ9æÇv^@;!PâúJذqÃíØÃŒóåî¹¼!''ݘäÇ݈3ŽšvèpÇù¶ˆG³oÖó¬gcµ}Ž \ 'bjãyb …Ö!ÃÆØ§RùÄÔ†óˆˆø¦¨]0M=£AšÆh¤…û‹¼ðïǶ§Zê@Çu t«Üµ65Éc­Ã—R%ðå»”T- «è5sÒ‰ì³ú}cNEk«—Í7ö\GÆ.âÝÔ€TD—*8q,&7æà0Ë¥‚{Ÿê$ĺR…Of‹&oyÍ"q]°”À:ƾ òƹ'n>ÀÕ5ª(yFŽ'y›mØdÁN4Y¢\/lhaÓµ[JÎrRr2µ8p`4iÛN!ïì&@>ÀnyÜ‘™[²wÉ2-oÞ2y´ýù#Ü'.Ö¾¨`³–¹iYÄÔJJs­|ªQ Ñ«.£u ó6mڸ̜7WUÊšŸ\iK%®z/¹waaÊe³„«fwÄCn™` sB\ÆŸ¬¼#TÒÝ‚:—%äˆqسÞY^˜%å"¢C¤v>/àxVD©« üÖÎa0}ÀmÁ nÂ}¬æ²ÛwÛQ{û^sžFÁí»SíÔö}ÿ`}Åd)ÎÉ1Yj‹8’-âx6_×q\³ÂûÐGOUÖ„OŠWD:ÝA6SAŠ2 [zJzH­&t ˜òÓÉóÅ:ŠäÕ43U×po›Ôߤ6Sî¤|Âúlw ¶;^šnw ÌžÃSr{—ž¹,N7î·;ÛƒI]R݃w)©§ûîK¿c )Í>ëDA*y-ts’°Üóž,I'•ê…­âÉ”RÍqÀr‚™×9ÎQ\9„oæ' æ©$_;2’•a˼$·Å†æïT\®B"Õyðä…`ÔE(¦»½ë0ýl]™Ä ¼"'Ðía_œ›P½ã¦b0R.Ÿ¯Ô Ú‚‘[0òÇ-91ό܂‘^î­Q[IYÚnÉá:Ž[V®SõK‚¬²Ü¦‡öÙîœÌ ÖjÊ•¨úåJô©\IÈ“ìÓWr䯏ÙHY_·Ú.³x(<}™%€Âóc˜5=Ú–¼‹Zùa;L„ íñA#ìðÚb }g4±–jî²-;ÍŠ½>œs“Û­˜Çã)»»{{Š<&0"¼…‹ÉŸ¯uìƒÁ%ï–3¨!1v8ÄA^¹wi ÑiütÏkÓi›NË.3Ø?ÞtÚtZÞØU 6áí·¿&HZ¤gópž@ÞGîôŠç’kP-%S"*šð°gÑYêÀ¼]Á .‰§+ |)1§ü¹·óR²Æ¦Kä8+Œ¨µâ‚ñë àÏLÂ=¤“Ö&R&èÐÅ)8k§ðÛš½p ÷ |ª’/heóABÞçôYÂò…®tT|i¡»“D$Xä%¢%¶†˜.g—óòIЄ-ìïõÆãè5 ¨*uc4£5Uìs9aFŠœû˜ ­¤­â‹–'ØÂ “2Û”öŒöŽ“îrk´GÏù@ÏžãÁ>$ÛAdWÚYüJ lTA¼3È_n¿U„[<Ü‚û`*žà¶GÃ|9™SÄxì`á~¸jÜó«G–0`ùpžûVõ7Üëzl(${§lt>ªÀGD( É·àçmö,|•ëÑÉV1k«°`£NK"Ù.´a«0B–}Š9sþ¡³GlÛ&•<虾"б¸+za›æ™2Obãí£÷9† µ|pÜr¯sGŸNoÈ!þײiç¥@\r+½âÖñ“YlNޏ¶ø\œ‚WFyÌ€àn*?àÈ4¦`V—fò~¤.5Ô%gêD:ÐH‘¾ý÷—üòƒ_w_=j®Œ~–pÍ83†:¨BË<]‡·Á×} e5®ø˜eey¥$«#º¦üù€KrFÔ˜*q¡z¶T‰-U"FªÛô¹ÍÅ4óäGw„ÚþOÞ×#Þ.¬ðL¨t4K ïýr¥È'ò*xåL^óÄ,¹Y^qñ­\“g³]‘䥼Á—§ösÏ·M ލ<Ž2Co=>Ç¥Ësš}¯ÃÞ¥mмS¶*\s¹¨’{†æ¦*­kmϹ<ë7KÒÊ ÷=ÀͼÓ+[ê˜GKOfÖ¨c$ˆÞÞ«¿›ÇT æãÔ3ôÔ1‚> endobj 4272 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 379.219999 184.799999 386.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn3 >> endobj 4273 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 370.579999 193.439999 378.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn4 >> endobj 4274 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 361.939999 120.479999 369.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn5 >> endobj 4275 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 353.299999 168.479999 360.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn6 >> endobj 4276 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 344.659999 130.079999 352.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn7 >> endobj 4277 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 336.019999 177.120000 343.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn8 >> endobj 4278 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 327.379999 132.959999 335.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn9 >> endobj 4279 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 318.739999 136.799999 326.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn10 >> endobj 4280 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 310.099999 102.240000 317.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn11 >> endobj 4281 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 301.459999 93.5999999 309.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn12 >> endobj 4282 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 292.819999 265.439999 300.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn13 >> endobj 4283 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 284.179999 213.599999 291.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn14 >> endobj 4284 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 275.539999 255.839999 283.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn15 >> endobj 4285 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 266.899999 100.319999 274.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn16 >> endobj 4286 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 258.259999 93.5999999 265.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn17 >> endobj 4287 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 249.619999 160.799999 257.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_collection >> endobj 4288 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 240.979999 201.120000 248.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn18 >> endobj 4289 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 232.339999 260.639999 240.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn19 >> endobj 4290 0 obj << /Type /Annot /Subtype /Link /Rect [420 69.1399999 477.600000 76.8199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_collection >> endobj 4264 0 obj << /Type /Page /Parent 2 0 R /Contents 4291 0 R /Resources 4293 0 R /Annots 4294 0 R /MediaBox [0 0 595 842] >> endobj 4293 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 4294 0 obj [ 4271 0 R 4272 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R 4282 0 R 4283 0 R 4284 0 R 4285 0 R 4286 0 R 4287 0 R 4288 0 R 4289 0 R 4290 0 R ] endobj 4291 0 obj << /Length 4292 0 R /Filter /FlateDecode >> stream xœí]K¯Ý¶ÞŸ_qÖ¢ð!¾€¢€ïµo. 6ÐEÑEá4 ‚8¨›Eÿ~)‰Ò‘8ñ!J:çö:@ìCICr83œù8$øÓ§\ÿõûõ‡çOÿ¾~q?º†H2ü¹vÿ}?/`ºálø§Ò¢a¦ûsýòõòíúíòñòÑþÿÛ…ÊþC÷—}8V1üýËo—†Ê/CÉ§ç¿Øý÷Ê®¶¿~¹þíïö¯½î…¯md÷_‡PF™¶?æÿêþ|ùëw×ßltO·ûÿ÷œ Îô¶v|›>¥ýóO±ÊÈ•›–v¥ÌþOXvü矗Ÿ,µ©}*Ù*’LU±Ž,iåÕ(i©2@ô-‘ÔVBÔ¨:„ºÑm]£¤U뤊YÏZÝw“³µ£#©ÍkE¥1ìZD·umd=Nª˜õB»nÒvkG'R[ IkþªêZD·umd=Nª˜õJZ¬ŸHm%¤%¯C¨kQ%Öã¤A¨º”nѧT¤ûžÛvS[å5`×ö¨r¸n5ü˜jXgöªƒÚ?j>Æ‘ÌÜ\6wUص½Bw%]‚{Á-Å-¯È¡½¹@n\`Ž c;Úë¼U­u?Ý#ëçuXï:‹õ¶3Ö÷¿î”õÛ¥>4€'ðÝ –íflÑò±-ñÎøÌw¿æ£¥ûƒþ;Y–…Ñžƒ‘ÀT0n0¨f· zMrž>_~x1€ðù';™ö(Äð×篗¶«ÞÆ6ìÿüãõ„pùÇëç_.¦QRH&zØbxÂTÿDO„õª!†[Wmö*ySmӿͨæCÿD4–{tÑVŠ3´¤mÚáI¨‡J¿I~ÿÈû¾€’F*ª;¿u|Â?ľ¥ÆíñÂ}¾²—hS9ÚM…±f…º"Öw;í‰ß$önàmD+Ü#mÞXô äJJ!Þ‰Ú k HJ¬^ýðÙZœmöƒ¶\#&D‰Á„hº”0Ó¿=ì {2™ð„¼ O ZúÄ¢¬oVZð}¢óŸàm£xOÑoœT„¨¡¼¦xÛ:rè“•zðVã<À¿yW0r%’ˆ6^OIO :ÚxOqy+7…žà£ÖÓ¢¼Æ5x¥?¨uÁÇt…:¦%©DâùÓq6š“[ƒK,:öÑ'ÇôŽš-½{ÈY §†Ûò‹€ÖÓ¢6iÅ*>ç·€¡åèøð‚Ñ>Të¸Þ —E²Œr~Åæãc‚ÛU¼ž/geìÍ£%ÔÎó÷¶TÉ7{÷èöN¼B{gÄÑöîÎ=“–¶bSìdU½V[¥ UÉäP¥a# ¦°ƒ nƒ¥Ñ'#Ú£„÷äf^ª|c°oœ:RÞ ÐßlH#BI3@©³'°'Îê¦e>µgôÉ`–EÃfû„õ‡r웕V¿äs‡Òþ‰lxe&µ±|@a- 8wP^“j®ª-÷ôbE&бº!Òà‰“=Ñ èòŒZµ¾E–3 ™ùÀyÆ‚ãÓ¬`KÊFÔÖ75)¸5 ºòmúZI(CÏ ­%>hZߦÅ!ÀF0|/YB×à¢IúÀ•­ ¦ùõÂ¥ t.2‰u¬­,0¥ëØŠ@¡+LPJÒé +YÍA+¦O~Å %ï°±XP0ö@€ý!‡:ö¼»­w.åÍØ—¬óáÖ)A˜ð±Œ¯è¦ ñŠ&Ä­EƼðf|ïÖøn’4|þZŒ[¸‚„(6U9›K|¾ÀjyÔÄVQœ¨µÙɬ¨õû"†´¾½/XÞ+Z~ÅÁf¹÷,g$óCšclЊÓã“û'­“²F"“ÜÊÂÇVGÙ2£V¸‚sð 7]ž:êUµG%NaF`€î#ªB¨‡,áO2Ü/Ø‹ ÿd›d4M§ 0ž ú—Ñ€’t@ÜÌð|c¨ÆŽ† 㛘ô 8#Øõ©ë Äd9ÝÊ ’aq»Q5‡µDâ¹¹w Òmj3Œyú\\’\ºÞQº2?0õ¥Â1(§OŠ1µÛq*Ò„zSQŽãˆÛÝ èl‰ÕÛ E‰Â*ç¹/5Á¡¸ÂÞg­)>g;Fñ8×a!£^.ô„ÂRÆùT%>Ù°ts?±ø‘b䔎Ìñä8<1 OõGÊúqT O@ÃSïñ«”6GÑô¼•­ èÈ1|cžb‹Žη9ÀS v[¼§[>J8] ŽÑç){EŸKzW•ZÑ´G¦ÊM‰×%›ÚJ´îÍV”Ù Ž¶zå¼m%ÅçZ|>Ã7+ ¼^¡vÇO8:×5>ø“¦S‡ž¸ÍDN›7V¬oµìH¡8Ò·ã|ñ;?kí<àñ-ƒ".Òøø e]½åkŒ^†Â"Ú¿§UÂ3Ë Ög4zI+–ñŠq„0]à‘”æËN=Ø~Í·°l­Õç‡e%ç­îÜÇnVMX\Æ ‘VƤ€‹oaïö#IŒÞ$m¶áU;õ»â>d΂ í}†M{´]ª‹¼ñä_B€/åÜ.Õ(\?´u{þI碉~SªoŽY;¦Ûâ:vÞJ‚5aÜnh ;jÆ:xO7D{èö‡r„‘¡mÃȲ§n )Ô¤ì×Á^Rʤðö Åû“E5ëöü^¿N¿y£5¹*Úý¥(N²ÕâªÈ¸9x,ùr‘¦¡Ô0­éX&õœÊøk¨Ã¾ï~Óÿ5utßø-±oñ9•e?¾\~¾<}·à <¡iŠC32T†„£GàžQT Üø• \p4%#L-YñÇÉDz‹&ÓF1©µŒîù¬ÔRiæݱ¸«RO[ÑDkk Œ½˜]­=vâ6”r[œPŽ%_ìGÔ‰îí-²$CæÕt_ "mz™¿.ØR½¬¦/é>š5ƽ%–dIJšŸçÇ$ûTô§WØÏ> É8f ª‚*¸Zº¬1 §ï „$}p¾C(ä–Üô„SˆæàJŸºY ®ƒÝ€÷ã-q¦æÉJHµ§„Ô„”Ð:‹žÚ „ý[dI†Ì«•Ð(¨„¶TúÕØO Ý[bIF,«9U SÂc•°Ê.ŸC×:ÕNq躂_=ÁÍõ&… ÍæÞ¤ý­ 7iKÍÒÓëKnÞ0Yvš64nÑyÑøpˆ Á!ŒøpHWâÏ‹Ã[dI†Ì«¹Í‹&‡‡˜bnpˆYÂ!æàFF8„=£^9€CJ¶ÛQuí)ã4«’#±ÒmdÕrJ¶©æÀÍ[‚ÿ˜AwMÆt³#S>‰Vó‚T«Æ¨‡´1BÚõ‘¶®X5:!m72d^ÍdÕ !mŒúH[Wâ[µá-±$#–ÕœjÕn[,v «Ú®ÿ cá±djßåXëÓܶd‘Õ\âMY^+º%c»_ß«òFËËF¼­Uí¼`3’ÇøNf<'3îÃÉ]‰äueRÏ©Œ¿–p2ã!8™qNîJ|$¯‹Ï©,ûq.’ÇxN>ý„¼=‚µ7™Î ¶ËžX¢ÈL„Pd&|¹+²'Fy¤2þZ¢ÈL„PänË•_D‘û·øœÊ²'ËžHØ“´!2)rÐq5S…4É®§ò€f¦B@3S>ÐÜ•×SM@ó ™Wss=ehfÒš»àzÊ h¾‘ËjNu=Õ¡®K2X²0*ÖQt¤PÕÃ:öÈ‚ 5FeL©yÁv?mß›7Ô7¾†BoËœ wTÆ_ziൠx-ý:´„¾{‹Ï©,ûq²7Ó–Ž:–鈌@Œ<‡Œ‘]N[9¼äÖN|,ãš /ÉÉOA„!|ô…•-†)Áyê­‘«½Ø8ÙÉ0¾%é¼ ÕÉàÄ÷8 á[œøøVWâ;Ã[dI†Ì«™œ NBø'>¾Õ•øNÆð–X’ËjÎt2º|Ò‡ ìñs!IoîÝÁ‡ëþV?rvúÄ¥½—4Äx ØÂ*ö$w5›Ó Åj^°ãj¶­hiEÜÁ63Õñ/ÊàÀ1Jí§×-[½~?SêúçÝ .§C2λ­r•Yk¥sÒ|k\x•³»gç¬ãÁÄ*W§´„Ñ eÍÐ ÂÆÞ_0Í˸Ó~enïêÁÇ¥&Fm%Yߌ½hè1ûµÏÅŽÑëP÷¡rã^H"Ñzˆ§¹£²eãüüƒë¦‹ós w§CäK˜çf~ 3#È ¦\U8SùŸÀ½]USÄÒá†4äW;,:ŠóÞF,PàÁA•! ²l¶Ø¤¢$ø“Øœ&Kð–g8fÅÉ«³nrÎÙðUåãöÆÜ£ÑF9˜ß–N;Z«]W‰V©ý*û±ëÅå~úú¯[¹Kd¸÷é6NÞÍAÖðNÜ¿„¬’7¾z}ÌÁ¡»%xŠéV.ƒøÞ\Ë ‚˜‚…Ä•FgxÔ%ëèÇ xRö6š¿ŒÄ®ôúp£h•"}I§èhÞš';G´ñ«Iâ÷Uä$}ç/CísÁýCù2Ulp…AÙseÏå.=,ÍÀ¤ ¼ Ôa¾²â>½ *ü!ˆ´)ä·Ä1žŽ&1êƒûmxë3¼2üU”<Þãj+¾2þM»(Ør‡¿ŠŽR²·ÒR„§ p: 2o§œºëúU<¸‚»Œ3iv‚…3Ü»žK¨ä¾ˆ ]ãOn~'~áOÏÞ9Õ7«8vƉÃàÛª· •lÁG áéÑG6l²çç`Psë:U\DÖÍódõx?uÖ‡ÝñÎ/Ï#X{Åø¯8¹müØÂ9;½k{/Äw\Oœ¡–#1àsž8i¡¦1ºë„oœˆSÞðv ©[óYB?VÚ„÷Ðä›H>¯#½Ã4çtœdñ4µ÷Ê¥'üů2*ºA>޶lÙuÖÙ¦)èàÚøy®Ô÷*á> J$œIòjrÂÆcg»$s¡dKã>î[Å©gìnÞ7¤Ä´å˜áôpšáŒ[…öL²?o£ë=;.ñt'ÜM¨s¦ú–”÷*y QÂUÂÍäU6îm÷vM'ãûN8%'HV °“ÓLjÃD¼gsvz.Ø#9Ç ûáP&ç¼ùj§v I\­ò¥,lå’Õ­ôU§:ëy(yŽÆ°èò¨oKFÞaþ‚6ÍŸƒ½¨àWè0ñj‰oWÆÝg!T?œtjÒäA2üžæ¿~£1íÊKñ½@»ì¼ªrîÕÛMA[攜yŸf 6lbp%ò§NçÝõdx (.*JØÙR¢„1ÛÑj)Ãýy¿âÞpLÌ!·yRàʼݞ»s†ó·çvãØãxÙ—áz^pÆe_]<ÙªbÎ>*cÎY©ôˆóqûßõ›*Mþúò5kpgróquxW?û·òJmC› •ÃÝ[×îÆOÇ‘ÁÉ•²‘aY0mƒxDL5*¼0©OYà¼a&¸+TˆF#é E¨~cÐo†¡V¬a6²Z,þ?¡Ô)œ—¼Gßuèá öóCO(ÖgËó¾q#–Ó÷yžä©ëþÍÄíTlÖ׿ËÁÊ7¨8// ñ.!%$£è:Ð.ÀÙž£’‚³")¸< ýYi.«ÏUäAk"ÚáƒÉ‚*û|¿ëÇšöùúñò?.,5 endstream endobj 4292 0 obj 5646 endobj 4296 0 obj [261 /XYZ 40.7999999 258.259999 0] endobj 4297 0 obj [261 /XYZ 40.7999999 91.2200000 0] endobj 4298 0 obj [261 /XYZ 40.7999999 768.019999 0] endobj 4299 0 obj [261 /XYZ 40.7999999 610.579999 0] endobj 4300 0 obj [261 /XYZ 33.1199999 450.259999 0] endobj 4301 0 obj [261 /XYZ 40.7999999 425.299999 0] endobj 4302 0 obj [261 /XYZ 40.7999999 362.899999 0] endobj 4303 0 obj [261 /XYZ 40.7999999 610.579999 0] endobj 4304 0 obj [261 /XYZ 40.7999999 258.259999 0] endobj 4305 0 obj [261 /XYZ 40.7999999 91.2200000 0] endobj 4306 0 obj [261 /XYZ 32.1599999 452.179999 0] endobj 4307 0 obj [261 /XYZ 40.7999999 768.019999 0] endobj 4308 0 obj [261 /XYZ 40.7999999 425.299999 0] endobj 4309 0 obj [261 /XYZ 40.7999999 362.899999 0] endobj 4310 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 100.819999 156 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4295 0 obj << /Type /Page /Parent 2 0 R /Contents 4311 0 R /Resources 4313 0 R /Annots 4314 0 R /MediaBox [0 0 595 842] >> endobj 4313 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 4314 0 obj [ 4310 0 R ] endobj 4311 0 obj << /Length 4312 0 R /Filter /FlateDecode >> stream xœí][«Ü¸ŸO1Ï…u¬»¥ä$…>B}(}(Ùn—e³4݇~ýzÆò\¤ùÉ’,Éö'sb[÷¿þ÷Ë›?þçñ߿߼ÿüŸãWóóýçCÛ´²þO¸}@»†ÑáWÕ‰†êÓŸã×o‡ïÇï‡O‡Oý¿ßDžšýËqˆ¡Ãß¿þvx3 ~ž|~ÿ×þ·ÿéñ/ýÿ~9þýýM§¾:-O¿ü:üB(¡]ÿŸÛßN/>üíÇßú)tç~OÿþÀˆ¼ífÍãû¥)9ÿ½mŠkL ©ä‘ÚÏSôÛñß~ê{»L£é$U\´ºƒ¿‡Œ¤èi(ÕÉ£î‡ÊÇYnXOdnG§y::͈ÌZi¹òö”õ,4#™ÎbìiöêNeꈑLg{Êy’‘ç,.=ÍÝBITžC=Ï(ËYàž²ž5aþYÐL¨EÒ~y:êg”ç,`Oýž›?ð÷qºÓ ¼í¼±'vf˜OYè&½ÒÍï¾Þ|Ô'áËOýbÏŒÆðãË·? ßOÝÿïÇãÛ–·:~ùå@H#¸ì”8w~ÓÊó›îò€´Öƒöýù¿~A†ÎhÃYßU{íŒÐóÕ´ÚzC?NõJߢ)â^[e÷ʇ^Ç™µx<ϧö–¸; ÂÛÚèËdïx½áˋشé³q1<=3Û*Òö™:§‡çìô ?eÜhø©µÝ >q<éîüF6”tS˰{g“ì¶løB7J yw[Ø ööÆ 2qöoîŇá7Æ3éát>|é©A!Ü®”…܉ƒsðv|€÷¯na …PŒl‡©„—è‡à+çA àì®w ã Ä ·”¨Ë§LbÊv@r]ÓéöS¶ÃòˆW~}óBÔ;ÈS9¸†´TäîSªa'x`Ø› ¨7‘xù®w¹pYw$ú.£òŒÊÕã/fšg8¹À·èM;Ò#%ʶѨ 3Àšá<Õ°ëøÆ½a$¨}ˆž6ã×cîÉƒÞ ‚èOÓÁH̹Sõ'|„¹€‘SVèé­ƒç‚×þaÄísîû#Øüçö±8;0ˆzª] 0JtÓwl»fl›U&À“Žæ]Õ€@_àÌž‘3®Q˜£ˆ ‹puìBÇz…”i)Þeê0§†'ï…=‘||á¬xP‰3ìÈÈJ° ásxYŽÞ|ôFÂ7¾y?ú¾Áãø¹áÞX g ÷€À}Ã+ŽQ|>à›ø†Á7Bði«‰½.Oê;Å2z*êw"ÔžX›[KÇÀLN¸øë¢N<µ:‰Þ ¶õhå#ÈK9t¦³äÐè{&`ë=cˆªnü©Ëìàe9Ÿ¦èìž•'Æú¯Ìj¥­”îŽÑ4˜€ÛÊ0}âL„íÁs&‘ŽG¹‰E ,¦G(ØHIáI¡3VÑÕYú¶IÈñÍ ×›¯Ñ®ó¤t%†r;°œ²ó1kAj¥±¨^cf9¢+N‰¥Éˆƒy®!=Ú .¬Q·)ý¨ðèGp¼Ú £<-V^øÓdKÈ$jgøÃº8Ùé,B¿áÛw³"®B‚NcZͽ“¶ª-ñB‘÷yA$Ä8·°P]*]ZaÃLF0Úþí9,ME0ua%£î,Àò£SlI1•*ûTôÓ’üF‚‡Øî…Õ>«b&“ŸÞÕMÜiß”µo)½áYÜÞ· †*8ƒgƒÑòvsdî‘Ó#]×$?·¥ð»ÅýÞó:Tì1¦äMSØ Ò2ë²m_½nÛnl”YÀ‚[˜ÿ—½†¦æ“Z$Ÿ!Y|xËø×­P3¾Ð<¹Rvó×–Ì_Geo'§ à™Ãr…wiT z[RñlG¸ê3"®%V#âpg€uY{æOúZשV¾ ÙŠ ´-ŸoÎ`Ï7q°Íç›0|Kß›U¿y¶²Õbà=GÅ&5,•rT°Š[bO ¾ÙóZ$ôúy-RV‘Ä^AB IøÈ+í 5|s[Þ”›²R{Ão^‘1¹–¡Ž¶t’3ŠÁ»áêOtm‚ÆÂ#¼;dr ñï2x00Ú‚Žm^° X–¢v”f‹®‚.‚„Y'¿R½žÏ.:¸9nz·Æ…MS\ØÙc¿öدé¹îƯ¿ÖûUËñ\Y%#æ´°éÀ“è7€¶³UA¸¥—Íõ™Ç÷ °=, É¡¡UR,fÂÂ({˜³G²±î*ƒÀ8‘Ö™#öÃßj,z Kã<8¦á šn8µw¯‡0eÃæ„ìNʬI-&ïì{å¬^lÚ®ïáoæ8jE”GÄï.ÿèøc&°‡Óq,®”Ç='B|r'’ ûe)«àÊ‘À@ybF6YÌ0\5â ¼Pþ(J-„ËÄH u5 6<âq°°¸¼È;míÇ4®+ä°³_ÁõD®ÍQ¨yÐD²¾²L@¥Äk6"Æ0‹E4j\ʳ9r Š(+‚9ã¥hCóøoÏÑyf»H@ˆñ%=ʲ ZÉ¢,ˆÇ÷i•,éYkC²ïMRñ â½ÖÓ`:§‚öyR>As§`z!Af±ú¦ç(y ¤²Ae†d£J)žº¥2B7åL$…UqqI6KÈÆlÔyó’¼i{V„a3Ï“‘#³t@ a1’ ä ʸBÔvÿÜ”ø°³ÖÛñ¶¯#º¬°jr(½~ƒúqÜö-M‰šIñC4ã”LFÏ¥µëñ_aègó`VWÒ·˜ß·¥šá±-¦@Ðúùz¢!DÓ®#—¯ø]/üvŒþ{óÿîÔìhµfÊ£Ò·¹ŸÉé+}׋¾ãçû?”2âJÁÇ2¸2I 3WóE×ÂùVµ¶Æ#dâ 4ìÿ‚ʰ)+kxýñ òHԯ绋tžw‘.`/æŠtóèžèîéžÐèž$6MêŸ8tïô¿ë…ߎq¡{B=¢{BÚcôOºwúJßõ¢ïǨ@÷äEƒÈà](©~-LÃŒçu™ž$5; Û 3¦ðëù¦%ÏNº²„-'˜ƒƒ£\o$â!¨5Ô‡Sš'}©SDó´ízªØ–Ù+OѹeIm躞%8.yh‹E¸—Á‡Óh7âÌPèÿ/ °œº|±q$º˜ñð0 Yë&½=3±1x¥˜‘òX©ñJa@’ÍÃÓk¸Ö¯šë,áðèð1Xw»Ú&ØÓŘ+‹ÐQ§äœ˜¶LV ‡çHÏ¢Ÿ{¹ ='gÎâdm»ŽNpØé$–!‰… ßpŽŠ¨î­‚î!¬ ˆq¤¦”˜¾"¹èòTù¤‚˦uV•*鿥{•ˆu5ŽOV:h“åÕC·Ë!alŠín½Øv…b{xÁ”"J3 á=)×]'J#d= ,®`‚s5wÙ–§pÊkªl²ˆa‚o†9¼ð· ð“RïYO¶¼ Ȓ̹  ŠRPž5qur³”&ñXÎj`(})”½xƵrƒÓ¦RRL#ª†9^©8Á%Lš”.ÎÀ³)3ÀA(8Ø¥E{í™Á{s—Ýðœ6÷&àzÖ Ó] *à+NΑ9ªH:ƒBÕR¢3*;h,%EEÀM@6ŠÕÅSEPïYeÃ+§bõpá%V³àµ¸´—Äí‚ÛÈ}w^€¤tÏ‘A[y«" Ç|ñ}5ìpIQ¯³‡Î…ÍÂ`å™ôS)…?=…fSl¿pÖjÈÞ؆Ⓔ𠇳æP‡ÇÁ½Q¨—ñLÅEp§Þ,z…»‹¬[œ:ŒWø:ä¢Wø2 \èQ§8Bà7Ð7+=ãLyfB/)ãìèå’ #jßhÊ™n%éöRˆ¾x¥+ƒ’n†\%]§±<âÙQÅPMàà^ª ÖñV@×!E×i$8zl¾Ø™_TŒ’öËíë  ×r¹ãΫeUÐBŒ À6ÜÕŲø yBòRü¬Ú,U>g›u¸¶lêYµà #GË‘‘;"¶pM×Z¥§$IPÔ¢ ÏàYÍݦ 7+¤¶Î;*î,£O3]ÁÙNsë¬DÏ~òT4(RÂf状Ì•,ÈÖ)›Ö<)ãõ\44¯¿“³{ž€¿éêH¹Ò⺮QšVc~ƘøË„L>IîÇYÝE¶ëÌì?CÕßÏqÈÄ‹oªÌyžš9j´í(~ (>¢è}íÞŽ*Ë J[Î x<މÈb²ÅDpHd)¯V¹!,³BõSôÚë-lçbƒˆjâ+¤µÎM{1Ç%L”N %ˆ8?|}‘Û¶½õX·‚Ï Ji¯¥qy\FÛ :Ø„Žu°Ø=€BM+Î{ÍR²á,ÚØg öÆ óDÞ\ÙØå{ø`÷Žuäå³7µÜ¦ÿs ¡·Åur0U÷§„“vN£¹«Kº §þ”Á7 ·#Ô4„Z1B¬³r¯šªNR{3dn/œDÛSÇÇŒÝ1Ð`°Å;7&äëÁW—ã º¸÷¶gß`oy‘Þò—švö…Êãƒ7éŠSÆSËÕE¨Ž ÃÔH(“™.!Œ~“¦óò:ºŽØ`Ž"3…)E[>.a·Ëh·¶ÍBÏÉŸ'ÕB“yÞL‹'@_¿}lË(4ˆªd±ϰ*ºËJÉ32?·rAz£™ÃpUö÷ÛRííÞ3É4ŽuK¸>V˜;2}¥6„ÄËŠ=GöHJ Î|ÖFì)•Ôj[ž“O-ªåcˆѰ%¸’çÁùY4Þ‹§aòz‘{-Æ¥§pjEسYü@ Õ_In¿¤pa|i›µ±5¶Ÿ¥ä¨‡js¿×HÛ¯„Í×î1o¾˜·” fûŽD.bµÑZ[РÑÄ>b‡Ýˆ§·S%NÞ¶F-¸’örHØu9E®Â¤+"eoa‰ËÑÿÌ07Í¡ü’&ßlA‹µÂCq¶ÞÙOÌœ¤Œ—U{鈲¶òh¸ƒÄÜÁözû«t¾Iä”ÿx*Þ oüzø\=+Õi ÷×»ŒÃèœÔÒ1˜4ÅXÄ' z”^uÌÎsÌëê­dîf6ezôX«jŒ"lÌy¾|ÕJ`XÉÄ€òé{xmsqBu*ŒÀZ*bUÁu^`õ“ukÊ[!ˆ’ÎFMzënÊ~ÁöE¨°2 ›4²ô0žëSë,V‡~/ä°Y­ËÇ 7Í#¾}æ¥Õ6&ŽÐÿbÌ‘UDp0š–Œ³ºm9oܶÂݳOR˜‚˦ëg†í=DFdÓâ¡c›bFËçòÒÒ¢&µ£ÞñE3éŸç9¥ÃÀ£ãv¶‘”ñÄv®/hÎ)ò+b¹€á¾û¿Çï= ÷pzêÂüøú-J±y£2ýä½Þ¦ÓÚy<ëŽÕt'²t¬Šª-e#»²hÞ8›7 ªõÖÕƒ7Ãñ1ÖPm¬Az¢‘<ÚW÷Ñ8l£a›´mhËîôhFúzÔÛ&·O^à·‚¬ð#jcnñ£7­Ãи6æÄbÖnæv¾3 îô;äô-àx<po -‚SçÑ8ðl=ˆoI¤xÚ¼ ;·1êºV6Dã¹ "ÓÆàõŒ8ýøéð¾òd› endstream endobj 4312 0 obj 4844 endobj 4316 0 obj [262 /XYZ 33.1199999 447.379999 0] endobj 4317 0 obj [262 /XYZ 33.1199999 268.819999 0] endobj 4318 0 obj [262 /XYZ 40.7999999 173.779999 0] endobj 4319 0 obj [262 /XYZ 40.7999999 732.500000 0] endobj 4320 0 obj [262 /XYZ 32.1599999 449.299999 0] endobj 4321 0 obj [262 /XYZ 32.1599999 270.740000 0] endobj 4322 0 obj [262 /XYZ 40.7999999 173.779999 0] endobj 4323 0 obj [262 /XYZ 40.7999999 732.500000 0] endobj 4324 0 obj << /Type /Annot /Subtype /Link /Rect [391.199999 705.620000 504.480000 713.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 4325 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 652.819999 542.879999 670.099999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://srfi.schemers.org/srfi-12/srfi-12.html) >> >> endobj 4315 0 obj << /Type /Page /Parent 2 0 R /Contents 4326 0 R /Resources 4328 0 R /Annots 4329 0 R /MediaBox [0 0 595 842] >> endobj 4328 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 4329 0 obj [ 4324 0 R 4325 0 R ] endobj 4326 0 obj << /Length 4327 0 R /Filter /FlateDecode >> stream xœí]I9v¾×¯È³É.±†RUÉ€ ðaàƒÑã±1 ,ÏÁß‘ŒÌÉ÷¸Dd*Õ@·º¢‚A>¾}ý퟿þÇá¿þ~øííëÿ~7ÿ}ûúÒ›®™ÿNÿüáör8*9ÿµÚ£O¿ùqøñòååËôï/¢;¿hþ3=\>1/ø÷ßÿöòÛüñ—ù'_ßþuúÛÿäá_¦ÿûËáÿ>ýçOf½Ó/|Æîô—¿ÎRÈaúŸÛ¿þ÷Ë¿ýÃáoÓ†óº§ÿA‰¾oU—´—WÅùŸÛWÑÇšƒ{1ʃrÚg;ãÿóåÏÓj—mG-Dß龉^µ—§eÛiűï¢΢ÎÙ"—J]¨3-tÚ‘H;šhtï_ê8h%T/[}º†Ó´Ã §¿÷Êü!ì¸×b>úôVâá/K¥.4ô*ÏB§‰´£-×—:ùÿó¡áô•QöÍ5z"ゟ&ÞçùŒìuÛŒü{4ü‡Ö`ÄØ&Þäe¥T”:ÕæY¨=#DÊÉ jᕲÞÅÄ%ΟDPâÉ—•’A8‰L M;I'[îÂ^éK,¯ù‡çÅOß^~û<ž”ožvqÖ`æÿ|ûþ¢OŸ{ÙLOÿtøÇ¦òŸßþòÒ›Qõí¬ò˜'ÃùÉpýüÕ¦=?ÑG=?¸Y¤‡OàjòÃþ0\¤Á[z›ß¹.ÒX«6óùº£CìqšÞÞš¶Wµ¿Ûh´˜´#œ¦ó»Çal:ÙÞþª‚pÿž˜—rÙ5g²;ÿ æAü¼ÇÎÞÉúUÏNæï}|›È+X„V —“zô3Á¨¾ã±u0 'í|ç >‘è‰Á¹²WBÚ‡2½òD øƒ±‡ßï¨l AŒSõ£Í9?Ù4i€gÜÇVw'Swu£ì+„Ú|‚OFˆ‡}i ëI§ùù.#„œÃé Kv…^Þᦎĉ 1éìˆÀ€_!þq6–ÂÎÉ©ˆ¿g)x¾‚øÖoï3›c׋Ÿ@¨?ÛÇ"."!‡P ì»öçÕÄ K¡Å%âg³FŠ­}ø "ÍgúfuòŠ( ïïÍENŒ`X#$,’…CÁ8üÀC–˜Í}*ι11ðHY£7ºÌÐaÂPûÅÐð¨ûŽžfúP_õ<+¹')‡ôx-ŸbùÄÛS" +âê ¶çæš€mR‡QîìåJúõ…ɉÏÐtš·ÖðIÃ^­$gï„uêòz™îZû›X@ŽñX‚…ÄhSSÞæˆ6]˜›]ûUL˜øÃæµXݮ҅¡dóõ CðWaãEÞãÑÁþžgÓ˜IÙŒ•€ÝÁ]S†ã°€ðÔ-TÁÂ^á ‡åÓfÆ­ƒÛåe?zÆ(GóÉhACßÛâÓS+ʃg6Qæ‰`ÔÖ" æpIe±´7cMwá_ØËŒÝ§ØÁUBèrПŽC å=àBô¤\öÆQ›ÊYLMŒªÒxÚÇõ¹ül\ÝŸŽ¢âg¹Ôøp0ßDô<š!Åiê`SßÔ;ÔYƒ³åAmhG:ÝæáÆ¼MQ;ã1›£‰±ô]±eu52D¢ë”³wäâ@èx™{×k‹¹»ú6 y³a0€{ óVŠ2‘À—Ÿ¬ôÉJ÷ÌJ±ž„ÝE)Ð*ÀS+DeûñWaœu•ìâ,i[KeÝL/ê“ÁfñnáèB’ÅÏüLŠ»Ús<:ÃO8wÁˆm…Å'v@¹®:ÑçÁfÐq)a'ÇqéqiâlfìÒÄ{ƒ Ç L+Æ;øµ·íâ»`‹KìÙ’Â&”W½rsv¥õã}H3ÿ¹næ=iæß·ö;p5üŽÔð½cM“Vc§sª¸Ú íá¨í¤Mƒc+OäŒÿ¢9΀£WuGu–²·O”‘ÀÒ Ö‚°nàwÆJ©j/)êeôœ›kòÛe•똠j@“˸ã솔H…#b)qBÚÁ¹MPçn}Ç>rÒ-~—x;6Ké”{p=åX« -Î…M™”[ÂMt6 F{Gí1¬ã‹ß@°&î°ô ƒ±¤¾b´Û«`À'Q‹dk„%2ð£3¿,ÑÙ°*)ñˆaºÜÐæ.e 1†Mg̶ª~ çÅyt~šæ™oiL8Eä"Ž8E†/¦n ßP‰^-ÌÎD[µ L·o¸€¿£Xµ=D=Þ-†‚÷8UXšÔ(~]xƒ;ÍûÄùDrÝ0Ö1à ã'žÕÚÇ¢@ÎI56qC÷Sÿõ€Ëv½èN»¥Ä£¥dÛOÀîå¢R¼eñf#/0ˈ¨ˆ"ù*Íh«`TéùÌe¼Wû’£q Ãr‰nÛljÁòQ…!’W¿ÈªÇp4ÝÜp.]¡"¾L¡²FìÁ1ükv•ìK{­Á'¬2—gdv´Öž“†n»Æ*ñÄØ$ŒÍÛÌ£/0l+g SŒ xöƱ/97‡ÛŽ1ä™ÇgœÕ3ŒqgÏR󧪵-Äk*ù™=#?ïÒ'S+†ƒÔ«isÝæ(.n—eÒäõH¯öOŒÞÙð¸ý•Ñúq󓑺cçÌ€4Ó!ÕQÍùˆŸœÝ™öY½Ó>K*û‹Ê´ŽÎ¤J‘ ÐGÍØ-Úl™ŒÂh-JFPJ»¿„f F”)*N*,…»4¸rïÄ ïŠW —…ÓÃñTOF¶»›8’pm­„[ã”¶pÓœªàBvÌI^À«9ÇÉ¢¬%°†’E#½¶dDæ4XBv ۈǗâs8('E¾|̆Q^—“^+˜˜2¬#F´Ôç$dQ kGè)†¹ãt#$ƒÕ&ÅŸédŸ>²W Ý‹vñܱªmÙ«yMг>!‘Âúãk…·*îz q O\sX&õ‡àaapyLvœÔ0N®Q¡î&„ØÌè«;À¨¨×IX¬šäË›Æ[) =Gl71RŒÄY´4÷N-0vНã.lrœÜR$‚ç1¥KÃAFBÈpÍ4Á–y´JzodkóZŽDåÈZ9ÅÈæ ûIf©ž„N½O xJæöÚU,Ò>\ËÒŸ#o¿ŒÂÍtž©}w ³d¨ .H_²ïm«”Výiu¼‚÷Ý2öGs˜m–ʕқÄ*$Än9ç+»(1q>?¢hóàÿáZAùÒK[Ëâ§âd¸9^š!î9"-¾v{fLœh½ù'žZó¨ÂO ªÖ N6Ý‚ïeÚñßs|{]¥rb&ÅeÌI KÁŧLþ;¥)/G§•‡h~ài‡ÄÈ£%t¡Ü‘fqg=æÆÖ–G)'d¸y†ü}âÊŽ½x Õ¥«_Ÿ[cŸ[Ï»ûq§Æû‘XùGÀ.?¤îFnÝCÅÅþí*X©ò’az?n²í’ km<†!²½Ì®nî—Iù/õ*«¤U;‹NžS‡|ZéÕ,/¬ Ä»ýø‚³åïÝ|ÚwiÜsºÅ†%Jf¬*[ˆìßèˆòÏÜq}JÒî#à,Q-Ãh·ãHúÖ*‹gkOÇïc:~K¦£v£M•¥;†Õ°§aVÈ€ EލƒÊÑÄ)_Aÿp8iz.=‰¹JTŽ—OšŽzòº‰Wû'æôÝõR…ó+£ý+3nŠëOL‡¾îh²¾,ÔQéŸ ¥ÐC°·ûþìlês%A©p„=Ž×ÉKÏ9b!AË9ÃeŠ^¡û¦Šúz¡Æ¿¸Ùû²=Œêµ¦’ÀÕTŸÌ[ZÉã3q»•wÜcx'Î¯Âæòί‰tÃÑÄÓ×u3“UéYÍþ°á]kË;çsÞuä€côad' h8Ûøc~@XÙ›wf3a8;Ãæñgf¾bµÇom‘R+P{‡‹àwB&í¢óÒýh1/‘+¼w # ˆÁF¢«£vZªáï8 o6H ®nøAÉAƒ#fâ“(ªgJÓ¬ £ åÇÆ;ˆ=ƹcæ8J }PÐ~æGç(9Ž˜È·›á«JÊÛ'¾ä,à’±3Pú†qưsŒN¿«”~¢1§éñLJª–S–ôŒ|*ú8ßÎó†0$ïØgO,ò1'~Š¡{CŒúê,u§nØ…ßp«d¢•-æ“„ð¯o9™/´ye×ã¶ŸŒpj3¢'€Oà;x5ãóZy":ød€ßycœÂGÀw0 ŒZ±¶š¦ŸCGÂÕ ©­=ß1„KÚ›qˆ‘ £ày| ¸ÕÚ[[¼Qsß›y…­Ø -ô< ¨—òÉ€„aÔ÷Üd&˜yn¡Ïyž'C€[Yö°˜‚½x8f= öÑM7Ë.Øôšâ0.c·e ;çt|;™KW2?Ji —–”‰GR–œ}Íœõ09thî@~•´o[UöCRñ©Y„DPgŒÏ'§4Á!TƤTŽ<¨ÛÞñ¸›¥Š’1X(ïÔ¶ *æ;%-¦@H¥ø¸Ê¶Ž$Tî…sÛ CBRÚ¢ë j:Ÿâ µq%8a&ƒ< IBEúþsžºƒ:usžx—sŠ„f¨œq…ç×oì¶¾Š½7ØçT[©U@¥F¬œ¼Rz­xá¨ú mΧë÷„,pø‹%ìÏë¨ÒÀ¨{G€@0Jý±P\ O¦>ÔPÄ`+; áe(‰x ¹@ «s¦í .ÀȔʆœÐa"l[ú”ÆëYD%§é!AšæHt.¤i”IQLp|mn¶WòwQ´[B />V…¼øÎfÒw`TPÆáÅÕjUç4IN¯PS˜ Vµ¾jôbNÛ‡1a\V5…U¶×4GÒ‡¥ìlÌ~êÃÐÄl”,–l¨)+Z¼ÙgÆö&b\o4r¸|ò}@3ÿ¹Þâ+zÒ, ±o­'RÐßñ|gDïLÍÑi•"Œø1͵~í¤øe41étv˜™Õ°R¦ wm:¬í~G4ð|¸·+ë#À¾ƒ¿ãÁh¢²]r ß)ã¤K› ÷‰ø@ßñ캃÷ƒoß6Üu­;ebâ’Q·Qþ-d‚jèm.Èà ŠÁX‰ïÊÀ£=VW@)\Þ/¾¶pø#¨¸_y2_…RG9®ö!iÛc7_­}'kßà;#|gæ½<Êæœƒs}ò ®6ôíOÞáï©·rÂÏècÁ¬=è†hœÝìíL Xwú»lE¿¬ÚÂïi`Ü1xÐ:ï˜D»vâ$ó£(á{2avWÚ®à™‚x`¬ÑÈr ÃÐtGqš}˜Än<¯_rrÅ×—ÿËÎ}À endstream endobj 4327 0 obj 6534 endobj 4331 0 obj [263 /XYZ 32.1599999 134.419999 0] endobj 4332 0 obj [263 /XYZ 32.1599999 90.2599999 0] endobj 4333 0 obj [263 /XYZ 40.7999999 662.419999 0] endobj 4334 0 obj [263 /XYZ 40.7999999 287.059999 0] endobj 4335 0 obj [263 /XYZ 33.1199999 132.500000 0] endobj 4336 0 obj [263 /XYZ 33.1199999 88.3400000 0] endobj 4337 0 obj [263 /XYZ 40.7999999 662.419999 0] endobj 4338 0 obj [263 /XYZ 40.7999999 287.059999 0] endobj 4330 0 obj << /Type /Page /Parent 2 0 R /Contents 4339 0 R /Resources 4341 0 R /Annots 4342 0 R /MediaBox [0 0 595 842] >> endobj 4341 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 4342 0 obj [ ] endobj 4339 0 obj << /Length 4340 0 R /Filter /FlateDecode >> stream xœí]KÜHr¾÷¯¨³­a>øŒ¤–dÀÂðÁðÁ˜Ýµ±ð,,ïÁ߬&YUY_fF䋬¦˜é›É|Ä;¾ˆüåŸ~ýÓþýôËë¯ÿsúmùïë¯/͹éšùÏéòÏîÿBg%çû¡=ËñòçôÛï/?O?_¾¿|ŸþýóEto/.ÿ™®Ÿ˜üûo{ùeþøËü7¿¾þËôÓÿä韧ÿûëéßþ}úÏŸ–ñ.¿ðûË0v—þ{þAH!‡éîº<ü¯—ý‡Óߦ) oã^þý%¦W:5Ÿ×WÅÛ?÷¯¢5'5}3œ„Ó<Ûi;þ÷Ï/™F»Nã7<šjà¬á¸ox¥x4‰Ïç+|ò>Qð ¦|Ú½g¯¿þ˜ø";•kAåJ‚çˆßáÐ2þŽ:(‰u xÖ϶oSÞkü^ž5<9—<Ý)0h”3·´§àUŸ?Ê™r$Ò²; ´ÞTžnf•7YÑ‹ŠXÐwm'ÛûÍ0Üf'ßþ¢?7@"äÕÖÝhLý ‹tt!ºÖØÝåLõmSç%µg%ñŽRšvþÕ³žç}· =zâ%&mîÿƒ_x‹x­Q5š…ð½ŸqìÜ5kTù%xF á9f$gGJˆs«»az;dF„Í*! &4ÉU2X3a†; MŽâÇâÎ:‹yœSMõò±8ÊúÍÎø&攤"‚Ãv”AæîÎR lIÛ˜bEÌa!×ÞžŒæ‚“ªKÀie®‚°7ÞáÐþ ÜW$>#µ>òº6\߈Cn?±Ü´×ŒtŽÆäLÆá‚Ñâ0Ì6Kàu3Ï(L+GARn¦(Àä Gà:jx¥†0OxeIÞƒ\¼îAè]»® Ÿ–Îî ÊÎÜÃÏ>½/f…,ô*@°¨qX"XÔ`»Æ4ÒøÁ³äÎÃØ¼Õ,JG´ë(·'³ùòÈiÿ ÝÀp‘m›…Ö_všcÏʰáS ðªsª™»Ï| —ì’d;j“}7¡¸ X(€ÏdV0}ÿf›ÁѶWÆîÚ"2œÙ1þLŒ‹i͈úÚ ,šñŽN`x¿[ ›ícO½3%Êá{dò=HssHHÆÇT´õÇnxlë Ó×—ÓÞ%ˆú9¢p®Y×9 +k3`~ ÃxE°ªêï]ÌŠ`Í>oÿ#o=ܽd,"\Ò4™§pK‰µò<ÙÿðQYv,M3çˆÁ¦5&¶ðÀž£žcÌÑy*ƒ)ÖÉDŽ„X˜åÿÔu?´MùÍA5bs*:ìÌp”06D6¬8øZ\éÀ¨›h9ÝVŒ ÒJ5Þ]®4"€FÚüNà¥`ù½8€)Ïb åÏ]ŒB”¸AsËöY,NPñÃÝ"ë3«œ@o1‰röÆŸ€+àÊ^ËÔ¶—:+Çs]SÁad eŽ{± )ë6¶ž›Qn(Ù‚ã(á`Ř kŠFm´c„‰ºŸÊ =XDÉȘ¤+‡9¡M­›,5íÍøè› Äm®Ÿ¼zÍüçF=ŸÐ“få×¾5žHAÏ`9‚GßiW™×õâ=™Î£‰æ<묻洞O¤©ÎDŸ|eŒÖÀw¾ÑWºpÌpÖ&ÀP úÜ£)4Ú#xð^©c=p4õR¢X´¢z“o‘s[ôsV&ÆÑ±oŸáÜ{à 7LU-\cLþ‰GÄŽ#€A¤Ã1Aù‰Ñal[ßÅ4oQ'!²†i»q9É4ííÙ¥K…Ø^t/ âbµÅ”xþ0ùê<¶†6Ž ƒ•N~ˆPÛáØ$‚%o¬æÐ j4dñü~>äwÕZÎF ƒÄŒ;,BÈj¸€3¬z¿²ôAGǤ? É3B"ŒŠàè²L6ýnèbP…È8ž‚8q2έŒ·‰Œkçæg÷:Æ pô(Ýc*)`(KÎ_ ·JNlᆈïe¤âIÿT|Ëši‰kw0]ÃÑZ‰FS«Œ°@5êÎ ¥y•8ÚΕIH>f+XÈ#‹Çñ‚Sž7›t¬/ʳT{‹A,2sΙ+à'¶”ø°Í-¶ˆ‹…W$ÔZ.ù«\Œ$TkÖsEÄð&Žºìd'zx²ƒt´FÀ÷ÀÀ'{,-ÝÇpÌàkªWº3©¾bÌPu&F¥ó†½Dr²N[²Îá cÒÅl…e#DPøB˜œN½é;ë7ͳ./UßÀÀVQlßÃ;DbMÚ²&­W8ý³ÂÝ›4éwBÅ † Z˜Ã<𤖯ÿ`)š„a¥§¹ûŸq¹ëeÞÚšâ`ÎãT#ù ‹«µ^-ÔM¶H6(“*Ó­áD•Ã.VÎV= Äz²•Æ~$QvvÔÆj¬ËD…ãrŽÆÛo Ûk Ê>"4Û•OŽÍÒj÷^Dx#^kÚR5#4]gòàÈv‚ 8º’“‹ Çz•ò«Í_ ÐÀ»Ñ%ƒîM:>"`"`ck‰þø4d‰{]F!üç´eJÙÁ%Ð9ÑȽ6O‘€ŽH[’ ž 3`Mg.v4%õRV¯ÖÕš´õ ²„”Dv¯VûÏÜÁ#ç|çÎú÷óÝAiTåëSRœÈ¢·DÁ°÷;ùG-yL)fÁ FÑé÷Ó ¹ëõ/Àßa]°K“§~Kÿ}îÛLÅ} åÔY¤=‡¬Â§ðdgºÍ«ÏWÞj ñ£ZÝê÷ø¨í·Wìj­&àô '¤?DÖ«*öõÝM”X7­)±eäûZ¨\7eq2ޏvŸª·@Éf?ÔBˆ1tŠ-ÜŠ+ Þ¦8ê¾¶r°eÛDi¯ˆ†/ê "Šç(­ÃëÛ Ý—¥Æ.£Ð–¦jwBgs f’ÙÎu ŸÅâ~YÊ0lž»¥€{ùl5à¬âKX0ʧÒÛáÔFÍÒºu‹Ýâm¯LÙ_Qe„«SñXiêxÂ!"ÇU­¹ë¶’·)¯Ã¨V”@õI‰£¶)¢ZÚžœÖŸxÁIQ’¥›–޾Õ'§æCõ¿zÃc ¸’Ž€çŠÌ¿3 Ž‹%kRŸÇ¦×âšr‡É’Bým}îì”86¤ëF7Òà©÷¶À`ç@к¿~•Qêç(ÜÀb ‹nÆu5¸°Æ¡"pľƒGS CyTÝØppØõÉ:Ðå0tùé›۠˶"èò(þ€1½Iù]®”%7v¹R|¦Gé:BŽ}KNo»,Òß½írß¶ÜÜ`ÓMÚN®Ä’¥ieõ§=Uêð¨OÖ1á .ÉVª7EÈQŸZƒçOUôÒ8E›}ü qñR^ôO©®0œNÿ„â‚$UZdHOæÆé¢5 ëÕT…ŸôÊ´ùžª4#»Y¦Pi@2¥;?ÿ¾¢œ=ÍÓ¡xŒ»Ÿ(—e±wàjÕí Âź'´ÃµÊ!sǽ2IŒMÇ\—¾c¯–ô¶ß% FX͆‰Ðï¹Çô/È®NT£ Ž’eŸ|Û“´˜,jª¯ eÄá÷±J+J EN,”€B Ÿ´”># t ŽÒÝvì3ˆÐàÒΨŒ%j‡–½–a~uÐwƒ¡ðnPD ¡]BL5f l«­À ^{–Ž!Ž*ÌXÍl¦éMY¯)› š´žØw*æŽ+ ”¢9pþ/ ¥ê‘u²¼©ÑŒwX°*,Ze0»]ÍÀ0…»p9(+’=Ëæ´=æXuúI‘%¼­ ss{- NU8o•”…³`8§VJÉvj-vXTJ/ ¾"IMN_:½R©ì…ÂZàdɦIºeÐOQÒxt,ú¸wM胹vîkRÖH³Ú)cÙÆHÈ‚4V!N Øôo;ž°ßŒ@‰Ê8„ï„ýþ|MŒw 븗£ÉõKJ¶RŠ“³«£jÍ}ϰÌK;C×e¥]—qåb-Pbí¦ŒµWÀûnÕ{Ke”n5Ƴ…¤Of_³°ËÀ¤pÌÛЬOdb‘±?À«DIšÜêþP΄½Ž±Æ«]-aÛG5šJvg0- °s²µ6xa¯¤^DT»2×ïÐFpÊ (s"’toHÊu¨ Á¹­ÓÚ±BEiu} H^c•°L?ªŽ ïRFx#—ªùãd)Rúõ,ðôÌ›iÙŽOj㻲oZ?u¦(:ÞO#ûQ;#p/BÜÓ…q›=§¯ §Y2¾³iŸñz»;\.Or‚æeòžßíÇ‚ŽµÁ†-Á—ŠiÚ²½[Ë«)çðÔªm â³Ç'\Ñ—ÐýhP~¦««Ë˜«ÝšS=«ào1¶ÔKNïEŸ6œ'àÖ$ HüÊp¹>Ù œÏ!:8ŠÍA+óÆ%cÎ4°åÉ<½³Š‚#ú껂°—z+ü“ÎÝžœÊñ¡Í?cDúëí@âê6óŸÛd>¡'ͪ9ûÖx"ýFÄzg„ßQëIu½x_Œª+ͬÁÂŽ¢9Ïî *…žpFßèëYÃdÛÏzÁrÓ}§ƒs «ªy°õ,•è¤ï,á€á¬™²R¾³ðØD·–øP–/4sÐkr(n?Cø gË8¼_‹5þh¥˜ TçÞ S-¤ …Ï%‚ %5Œ¦TÒ)ù[âóÐb £^!í‰B*khŒíx$%˜vámsÄVˆ)š²•.[¢T9â­ÀnjG}Oe¥ƒ ÕjX(+7C›”Úåˆ(h’8™ƒ—8ç—´¾¾¨Ï–SS ÒPûÉ|µMgÌýc×·½2Ïr‰¬Òˆ˜¦Li±õµë×v'š\uNÚäpÇU&Œöú˜qª\fO¸öñqD·œ—¦*Ý&.Æ•SÌj¹˜ôçGÌê…¹äŽ#’˜{HDd²|ȹÌmOÇ]\ûÕ¿„/eÜ`.:üT(HuqWmåî ѶY ¤î­Ã¸m—òQH©n-Eá>yii"úí ›M^ ¢Z¯„*VºañlùN†ñÇisÊ22­uqÀjIÚNû±8&iE m-“ã¹fw?ÚÁdSÊ]Ø^çôæËÒšˆCÍ|‰UgéåúÖÈ&5Hoö~ƒ%-(Љ¨’ôv©ÎÜÛDôÆ6ãKw§A¾ƒ„pä—VÀ¸çÒE¼RÇ…Y¼…)²ÇE-­4% >.\ëŸLɰU.7îòECUáƒõ=É(·D³tšr9çÀ¯.)™~ÁGÿ>ÛÁõªy9P,÷×Þ6x|Ö·&•äg™Áüf H$ à;ªk!¬›'âV©ÕÆÆ906¡•In •ub^áî- Ï|­¶Í]GÐ tp•¦÷f†–ìªh,4c@Ó…p_Ûqföð9¿ÓUêZÑjå›IÂ\þJOBÇXN%‰GZ%fÒKaš$Û-‘ÌSkÕÓ^qŽ+ìÝ ¯/ó…÷ ë½Î–Þÿ(`¯˜,>ß[ÝòMiñûÑm¿.í1bvuu¯Ù  ægÓ† p³‡ÊÀ3(™’kìòÆR#x²&]Ĥ•6âPÕãŒF%ÖÊë§½ Å ¿”>¸µŽU2F˜§sBÒ¾Vf,mS–Û–w¬³®ì­˜çïV|ôM¤í±µ-…ã’\˶ñ§ÓiVƉã:‡[ˆÑþØ–À£aË6{¥O?z•:›b7 ²‚nœÖ#"4·HÏ"ÖvÞN»–íW% ‡“Ú+LäÆ>á¾þæ®.ÐG ïüD¸µËñ*êÕðÁÅïNÝ\Õ~€ÕMq&é¹GÅ>K=´rÄÕ&œB-¯›_^âºë²~LÌÁŸG/Ó† ‰£Ó±v‚P³©›q¥EJ”‰LrÙÈF©¦ؼµJhÇ“BßUïþ±=PŒ2äÞ“&q2§Âº1x³dˆHÙ«R¥5“í ñcJ„[š9ÑÛ­6iÍ\ dUâG1¸t«¹_ 4Þ Û«1¦fYÈ\VèŽå¦Bn'd¹õÎCbšˆÉVõÆÙ;-ˆ¦ke—óÚåX‡Õ‹÷ˆ°Y;¼~;‰K\ç"ÌÌ<<Žaq ¶[…c0 ¶/¤MÄé­æpæt¸öOÈ?¸; ‹rÎhù«<”I㙡ä÷ßšhFˆ¬ÌzŒ/MÒ¦v(7¢ tNpÓØ ý¬ü›)›‘„69I‹<¬{Ææî"1q8¶z0réÞ4›è¹9ê<ÅKd=gp0P Ó¯ñÉl·€oæê–5.v;ú Å•KÝÕm?Jµ"ý(~¥É¡ÿ.½px[€âÚpïͲ@w&í¸&LõóY mFã|·W¦¶™Ü&瞇™aAŒ°í¤¤.æúrìÁÀ ¶aõ1~Xø6:N‰ >é8Ž$V°ƒ’²`ræÄ…ö(Ҁ擔‡;Ozé^D äåîZß³ $>¸ÿ(”6ÎæI±ªÏÞpD®hÙÎh8BëÈñ1z‚¨å"³Ûfm³ß¯Z£,,Ö ½$wîQ’©ʼn¥n’¢Í,ž¨ÊÆÌ&Ñ 8Y›ÄðÚ¼JòèØß%ð#n¦ÙÂåM•6Çs°RV@¸¥˜ëw#Öï0ª`ë÷ˆ˜: ºê}AKܾÐYfc4¶¾°Š\×IˆèFÔP—n’°™Àqõ"nÊ¥µ‹ªYS‹HÓÅ W8FB7 z°^¡{ÀMrYòÀ¥²Øôf9¸n ¾h·mý·ã­åΧb……îý~£iÉèBÁ96+sƒÃöœz‚_Œ‚A™/¶Â´ªg-¡Ê™ÞUÊÔIV\9_ÒÙAࣥ,?6œQ4Â<©<#<’»x{zôðTó#É/_•"†bŽ> qÜ™»›ŒÓWáÃÛ’£+Œωç…AfŠž[„Ç (D$Xëí¡N{Á¤q‚[ó”ÉŽ¶1Yé€údÒ»¤¹9Ì0žÔ„«t£Nh HyÎ\­4à4 ±•¶"6&~AÐ]Ûo¹Îâo·Czú? ØWQ˜áwKµ„š9Ë5Û{dÝ2±¾N#mmV¥Ðp(sWä8ÞÐÐÀëÙÛÓbÐæùÖjY°ßF0®Zk-Œý= èÀNÛ>ÌËÁ;ÊÃæÜ¨KÇ‹wµáð\:Øpš”G’LõIÕ1·I|2ÿfaîvÂÚú•Ñø•… ÅÝKŸÍ—ä¼EBÕ¼}¦»ô['QSŒ‰ñ<o/™ô4¾ÈÞu± „R«Lȃƃ‘4¥Ö5 1ÝS«3žeä, /À¬ZÁfnqnz¡vŒ<Éúýq“X“Ëb¡h¬á}j`Kͱ‹IZ»,'4N”SSŒÊPiŽ,iè" ÊŸ;¡I¶¯§^æÄG¯£Ð °‡Â> ,€uxt¸#†ðܺ§åCà‚^ˆèZd$¤•à Äq)ìïbD^iÅÞþýК"C^æú)Ñœ•„³vºF„´Á§ý)7ωFõÁsÎŰ‚ßxÎygýŠåœ/®¸>[©TËI_Ú9të¯ÞöL!Ük±ˆ£ÅG¿:öKÿÑ“; ;ýsú9íð[\¡9-ÿùíwÇ–ÛgÕÜÎê»ó´œ¯ú¹;‰iéº5Œ¢;¿p'Õè÷ìÛM;ý¸*fÔgà¹ËþÜ?#õžÌ¢E©³»GE%m{îf=bÙ£ï ð¾3q/ϲQâ]tç3m&û¿ùwIË>Xá7ôÎBÌž´ŽEëÒÞYNŒ²öeno Au—Ÿe+®©-üž¦ÓÁjpÐAk½³¤ ¦wšù‘©|îÃYp¶øL1à“Ã߯INašî,.Áºàã€,&îÚlO)Oß_þܾH× endstream endobj 4340 0 obj 6560 endobj 4344 0 obj [264 /XYZ 40.7999999 664.339999 0] endobj 4345 0 obj [264 /XYZ 32.1599999 197.779999 0] endobj 4346 0 obj [264 /XYZ 32.1599999 505.939999 0] endobj 4347 0 obj [264 /XYZ 33.1199999 504.019999 0] endobj 4348 0 obj [264 /XYZ 40.7999999 444.499999 0] endobj 4349 0 obj [264 /XYZ 40.7999999 444.499999 0] endobj 4350 0 obj [264 /XYZ 32.1599999 197.779999 0] endobj 4351 0 obj [264 /XYZ 40.7999999 664.339999 0] endobj 4352 0 obj << /Type /Annot /Subtype /Link /Rect [386.399999 610.580000 492.959999 618.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 4353 0 obj << /Type /Annot /Subtype /Link /Rect [208.799999 576.019999 265.439999 583.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4354 0 obj << /Type /Annot /Subtype /Link /Rect [333.599999 454.099999 426.719999 461.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 4355 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 152.660000 106.079999 160.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction >> endobj 4356 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 144.019999 148.319999 151.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation >> endobj 4357 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 135.379999 100.319999 143.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps >> endobj 4358 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 126.739999 189.599999 134.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 4359 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 118.099999 165.599999 125.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype >> endobj 4360 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 109.459999 193.439999 117.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout >> endobj 4361 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 100.819999 208.799999 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout >> endobj 4362 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 92.1800000 165.599999 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps >> endobj 4363 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 83.5400000 179.039999 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps >> endobj 4364 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 74.8999999 176.159999 82.5799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables >> endobj 4365 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 66.2599999 116.640000 73.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features >> endobj 4343 0 obj << /Type /Page /Parent 2 0 R /Contents 4366 0 R /Resources 4368 0 R /Annots 4369 0 R /MediaBox [0 0 595 842] >> endobj 4368 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 4369 0 obj [ 4352 0 R 4353 0 R 4354 0 R 4355 0 R 4356 0 R 4357 0 R 4358 0 R 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R ] endobj 4366 0 obj << /Length 4367 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘ç&[ÜD0 ÔjÀ…*À‡FÇA×Àí9øï[JQ™©â.)+«~ïi!©`ìŒøõ_¾þçå¿ÿqùõÃ×ÿ¹|×??|}k®MÛŒÿ.Ú_ Ý•ÑñWÙ‰+UÿË÷o\þxûòö¥ÿÿo¤½½¨ô7§)Æÿñýïo¿Ž“¿W¾~ø·þ·ÿ»ÐË¿öýíòçÿèüE7<ðã­SíðËïã/„ÚõÌnþööï¿\þÞ/¡»;üÿOýz‰T4iÜ_%·ÿ毢ɚ oJù…Ú¯Sôàøßÿzûk?Ú}×®Õÿàï>3uÃLïFÞ/ÞšFqBdËeã½xIû1ûÑøEÉö¢„5¦A¿‘Hê@„uyVD’¾¬B:Gºvœ&©àà ð]Gûß%ÓÿB>¼S·—6…‚P” BÚæÚÔ~E$é˦½€#]ECzÎ!;÷%5©€¤Vb¾y§iëLÓM9ˆ‘þßÊ4_¶eAà’‚Î%EÇ[Zø#ð F¢iûmù“A¿‘+•†Bó€ÕP˜Ö!/óUÉ^F=$èU/W²€Þh7Ð+¦.óU©Ã‚>ë×6p¸«ñcºìjZÑaxÄ©1^3ÿøÓ_ÅábNЇ9áÚ´÷ßÞ~ý¬ÓéÛ_{9v³¿Æß~¼ñþÁ¦è¿ëÛ_.ÿÔô:Ï?_¾ýí­»vªi©¸lã¦ï<.|º]½ùÖ‘å£nwøýQæ»Ö`b|åÊ™ÚPÔw¤ù(‡ÒÛymÔx+f­xxúÙX‰ýYxÝíN{¥¤[ÞáÌ\€µ"÷d\Ó„;ïà¿ß!WÁÛa-ŽmkÌïƒ_óåö‡~—Ö\[IK£ .(MP4‘M]e+– f¼Á†1ˆ@(nâ–yC˜XÄt&úƒèAÞoÃXqÔ=ùô­—f…x¹”3?ò¶[„WâÏ@ð^ÚŸc-À_¾Ù›ëFÇá|–àyVÎy&„¥ïàgá5bÝb?“p¾Ë,–†¡†é/ÍZ f÷Nl!^£µK-ÜÐ}ÖÿƒIÒÛ‚“½¡YPî Ž€¥Üq¨¥EH£ˆ‚\RRk«K´§fß–KÀ¦f‘ÿu‰­ºsfyé~Û~ 0EÌwö~§?€Cd‘¿ÜŒØ–aÏ €±ád ‚‘ÛIõå§ûÅòc{cð§a¤…ÐöPODòYüGÞ,¾§ÎÜû;ýÔ5Ôz7`!Y?ÂÁÙð×X‹©Ði€ÝXãÑ+©óä5ŒƒÙ<™(s˜Êª|„©e£CœÜŽ)ÙÌ&«¶#-BL[á4„C¥Øôøƒ#@nÏgYZ î&ÑMCÒÁ]7B?%(epKì%F”ñ]`rÏÁ’bØ–™š®†IR1Sÿ-ã?0?ÍB^N#ødÛ¯•Ô¶im9*¯»ËS¾ì‘fáG÷ðÓq††ˆÈt³‚Ѫè4å^i»9Ô±í%6èý6TLn(©„gtr¹aCÕÃtÉÎ/´—€ÅdšÅ£+ŸHR×¥„ì,ô·Ÿ)J™7k%‡•y 7H_ q”ñ·ÄàîÕŒÁOR<ÃJƒ%¬ib8Xº7>"Î:€ B 4 ÔUé²v‡Â; Þù€îP¼‚ÝiàGÓZîÚWÐÁw0 ðª! Ègt‡ÁÑÜwá„w8ÜmøNWa!Ê>…¯­ÁÐÁ{ ¡£í­ ZÀ_Jáhn+ˆ ‚qÞÑ»P–Ý‘žÍüΕ`¯1³ì—Oex¦!Œ 1fEðR– ³FEXk@w[‘ ý>µ‚¥óEe&ìÙR{Ë’>UÄÀΗŽwr¯¨uÈMIá’ IjpûÔÉSK9¸}Áîb8šå‹‹ò,§d3`ž‰9c pö8=î`¢mk2Q£Îc6f [æVYHÚ Áº4Ãü>ÆÑñ¦à` Z“˼jlg %zØ-OAm‘Ê9Ǹ÷¾/GÄ÷8t$¨ˆðŒX YW]I³ÃºþR¼¬'rH3XCep4]G¥dV(“ýÙ– Õ˜;92ˆíèàÇx³.%vœÙD«¡Cpƌޟ\_†ØQ ±¶i·Ø‚#”nå$O€ƒ&¢ÚP€« λí’Ãy eìÚ˜“?6»ÍR_&ÇquÛn·Öº™íH0ßåVF"þ<+! pŠX5Tð “•T™&€j·SÛÍ´Ob5ÇÙÂʵ‘6•– Ù~ çóYŽD¹*Ï>pÖÖ2E9‘¦Ê‘)rÄŸÃçÀ 1ôe}_ŒJS7p"OyúË‘z‚bÇ« { ²«›<[4( ¦þÊÏ™æ•<ë³çMžm¥©üìïÏáGêô³áôÐ?öÚ9ü†1©žYA•c¶Aʘ¤ÖÊ)¿eIPµÒUpAŽLO¼]xó!)#ŽwB4¯™ÊY»ùu¯ÌçB™Ïa[779Œ]UÊ,vÀÓÎRÀpÃì·xf1ãÒ Ìm+#ÄUŠuJ|'g-ŒW=ç æ\Ç ÊÒ“à8°ŸÖ½U§êL’O?¥èGÞÃâÏéTªT­f»T¡ÃúHüµñ5K5ê€Að^diÑc«©€ƒÄ __ò¨¦3í <­¡÷ó •jåX NL9OŒÝø8ç è\;Ä`çY|_,†¹ãÓánD0tšhXYKL]ÞRÿâ|ݰ#ž ÈŸ³» Q«'ÌÆL5®îy÷Dèfü÷XÌ;t§™  …q‡¶áï8æQèÍß ŸÈÃdkßóA#6×hô¸#&ŠIÍk´ÏpÕŸÑ<Žïk{8#¬Lbžšßq¬ C‡hêc7dßap¼ê¦’Œlò:GêP%¥÷…šGEMÁ7Qs¿nþ#© vŽÒ¤M˜€Ãgöad=[VFùªTMzïºü»×ùŽ"ÖéàÞŒ…•IUÈn;`¸'gÀ³þPËÜÝ&`g×ò=ÛÒd4™æ"â óÔ‘Ú)$S¦„ØÏË-άz¨m‡eI‘J“O•4œ¥y–ƒÖ›œØ^‘Á#{ ‹nž’@ÆeŽ•9ÿ™£ésˆ &áÄí:9Èáq\'®1’0âl«‡V·LÉÖTŒÂ$«€Áï : PCB¼DXž#-së\´‹ö1I¤ðÔ˜.²V]…¥°ŽZ╊נ*Ø’m·;-U<¥ÈÙÁ,Æó¦{»dÝnin÷©Ì•2‰‘1ö‹?ór  u‹4¨äÁ¯î¥z†¶µvq1bQ.¢…˜-Y;ëNŸ÷0œžÆ™ŠðÍ$ăʓõwFY1â¬RÔΣOmŒËeïjC?]J_J`ßÊ&Ú6÷¸„+kø±ö ’3©³.KÖ©rž^t÷þ¹¸öuL‰ˆ’1}ãð pöò6úÔmé]àFÌ{'+i$õ,©ÝŠ%Aw(îzœƒ“w¸ØÑsðò$—¡5o–èÙqJ(ƒut2r(zÖGǤŒ¼S^‹$ííÁ‹ø³ 7:ž*YêxÅ‹ÂI@ÐtÊ)½S8>`k¡.€Ÿyïv7oX ÖÛ,­¥hB×LØô91 qÀÕÚ‚*Øqv#)M ̓Œ¾!´Î}^~¼)ÙÌ/üþöÕ!ËÈQ%M¯VQÆŽåèm#6©ÈBÞ,€«æÖÜέ«U‚½ejZÃ+w¡°!R6û3Kñ¬g!ð4lr85Ĭ(ïœÛ´=ÌA¨¼‡ÜmRÍ’ºùœŠ:å’xÊ ¼ý/;CV8}Ï£ÒeÖ|Ѐ|Œßê™ÓNãyŠó/WÏJ²¸"TÕŸ)«E¹)üëÚñ+,Y³œ-,™rQ6.L†—ç¸.8®âÓcFyi­âY­è¶ ÔâÅVm§€l§J'u#œ ögm÷…£ÚgÙb´)=~Br¸ö*„ŸP]ò­nÏ4#§ã¢µíÆÞ« gv)Q;´Ã¤4öÝQ`÷}/b…, žómÇ$†­¸í„Ò1 ®ÄüÂ1‰a [8_Lb¯ˆ*^?y²p…‡ÛxÛ#šrR-k"p%õäDj¦#ËÎêˆóh³z\—äòtH¨sràʺÁU/Jæ$7¤3dÈ~òû­`àËv{¹;y__I|GôÜæLâÃþ‘-ç@¹qY ,ˆPIÁ”°©’ü„#E{eMìUƒ÷gc[ƒ…”¹}6lj‡¶PçÌó–Ã÷à_9šìD}N%2øi‹——;R÷¾žÉ˜,eCEiüYûYÚ'VUT> é3á+Ê2üS Né6u¬<\&‚a»¤0}o<Á,^dA#">¯£X{øìü3ˆ^©vÕRír 1›–9Ø»}ì? t­é3fYœ´Î›3 ˆzÆ…\Š–ƒ*iXé²Õ¡’OÌ!ÕRZ©x`ìè(8RÁ\lÅ6¨‹–C‰²ÉH¼Rôa¯Öj!2?‡ƒ3êäOŠ%RÇŽK1xj ãˆ38!È^\h°¶5xΩ4Mùb%Ü13õ/¯c5ƒÀó8 YøðÁÁ­jGÊñtÒz&Baº-NëÅ©À޶$ðæ¯ã; QÖîD¬ZC§d}ÇMÖà¥ÆÂÐ2ð³žLHxÙ%/¦ ´&…ÔR“<Øár#E¢ ‡;A‡^i™E Ûa߈ ýnúa€£8ÂÚ/£ºì¶eVöüVk¦Rä „£Ã£ôFÑÇÂqá–Ç»e4ư¸©%Ëè~AÜ|þhsB¬õˆ÷“~ỶíXàáäbžê¤5ì´…˜OBxáTeZ:ÄøJ¶ ‡oÏXÒ€Ô%q£VèçiT)¶Íñ…›\ç<ÇKùª&0žRí¦ÔyEô±ˆwæ —ÇÁ^ÚY(ãÍü‰´Ú\i  °øÒܽ—G°9ÝGô¥áw&ãyöÍ#ú ÙUüf›x$¯ª3Gù ßùg6Á¤‘#lxj-/²cf¼AÖ‡Ù‹Äûî/Æà px{»uÝŠ ä´–‚ñËZó¥Õ’D{i|6Hë DM˜`nUñ•4]©–Úª¡6j'‰.–:ýM¯]×\Z9ü¤—·«üҶ׿kšéÊ÷·V\ Q´ëÈý)¾…ÏçèŸ×7Ãkãí~Æý•þåJ†§Ôbµœã··÷¿”ªÝ0úº{QöZÛ"- U¹V7ì”\˜€F›e>³Xsñ›F#ZÒˆjÖhDQû+ OñÅ(|>ÇFºnF:iÎÑ_±hdxJ-FQË9*ЈâhäxHµ{fY–Ön1fMŠ%*$•Ò*¡ oHR{팟˜m3ÁÈ?¡GñäÁ²r'SW\0uÕt+L]‘Æ`¸Ã“©ßžâ‹Qø|މ©«¦]aêªæý“©ßžR‹QÔrŽòL]‘ÉÎ :úã75¤ô»•“ÏÚÜk¡Ù_Ûs;¿¾â,¢ž“Ñ[IÒm7®ÊZÅž/À-•Rµâgsæž) hâcÉ µ>ü`Ì!Õ¬0‘V²7Sº9äi ½+ˆd*?\»ƒQ«@<ˆk‡0³j1þb­Cê`à3q¸©U@® Ž<$”Ƈ¿ôqȼ+þG¢lBÿTÃÍæ'ÛŸ¾a0Ó:}Çšù…=:? KX’UÖº®j½ Ý8¥ Ó”µ†«­‹Ù6¼Cwš ¤0îÐ.üÇ< ¾Ã'š»¸RScŸ\ýÍÕô¯Ó÷w>7N3{‡¡Lî,> ï!høK§¨ƒýŽŽ:tWNµ5ø{­EpÓчµytôA\G ¶8Ÿ¼2üºö¥ ‚µcO‰æ l\Àl"`w†×ÖÀý™‚Z+kƒ°ÆØ‹¿‡)„Žyàªñž:`€1që{ 2A>1Þ;|Z‰ÉB¢;<ŠáœðÍ¡Ëg²ªîÞGç¡oç‡AgÊ:øÈ³OFµ ²çHpɛӛ’þvüƒØö¹ëÆ…íôÔgsztØ+Sš2"(SÞ7Ê**Y¤d/Ö†˜2Ä?2›’ªyäNŽYªlFÈÈâÔ0ñ¨>›Rcv»FMQO¯4 ¨ï–#àRÆç™õ|~Lé¡¡àéË(J nK†}…QÍ[b")§‚·sº!&†¤á'Ä/ku‘!ýÔÛÂ8€eaƒõ¦sƒy.Ï®œç-y‘§F@‘ŠY”A‡½™Ã³àÑ/uw©Z¾”Ž3;c¥ØóôŒÆ©’W“¢À•BJ¥:p˜íã¯ÈÒZæ4*^ⱈ—j¶Pî¦dCVªLuúU1ª$FŽTÒÊ“=  I:ÕùiüQÅn¶³ø$q€Ùó?µÄOÝ,Ó’ýUÇ23ÒÆ>ÝÝ}mCð;9N¡=©ˆIŠLé˜ö&Rºæ%? (xaøØIÂ’g·†¼é% ËV®œGò^¼mÅe?Á;¸Ø-¼£•‚•;LÀÑp\\jÏßaálYy»¥î†Ü-G™aX°C„DÀßa ¾Sé{0Æ2xg¼Ôœhm°p3뮈±„ˆÆ–ÂØ ;¼aÿ’Vmªû…]ÅIi)›]MrtOJIR›\cBýÛ=¤¢Òï²”û>“ªŸ€ì!Ek³l¹9_À–Gi< éL Ûæ­›ý·oÓâ/(^Z¡ ñRØÓ“9›4keËãr …ô@{Le͘ ÌZ²t[À<&¥zÙ¼ä«\릺i¯°sdØù(ÁØ ó´' ˜â`9­x/\6¥pÜiiWÔumâÃxÎófÛæNçK©‚]E-Ás®É£L‚µ{]äýÏyõ¿'+äñî8Û)Ÿyíðˆ{Ÿ3+]T=&¦Ç›ñå6Kv6m•!ž´GÀNÉ åÃt¼¹Ä}2¡ÎH£‹a&11&ìóƒ\s»aå R-^áýˆð¾`Ÿ2,_”c*ƒeRÈŽb ¸¨yáJD{ç$†ÇŒ¢0eeÉlΑ½›通ÅùsŠlëß’+ØÍ“ÅAT$-.dÔ"ÞÐ,ì ÷¬Ñ-ïãª$OwatµÊ(wî]“ˆVªÛǬ+E¤`ò*•¡Uëç6Øî\Á¸› ¤|’yxB½óU6h ä\œõïàÆð|lÑÑ<6B²KOÁÄuÀ¨÷¿Ûk×5I†’n¼Ú]ds½!Eÿ°¾òý­UWBí:2]k»ù(Ó_ãýóúo>¼v1ßfÖ¬Ç\Iÿ›²üŽïo¿½½ÿebÁ„ø!' ¨Ð3&ƒÎáÅù¢Y©¨OFŽpgá]ª¤ˆÆ;Ò²ù…ßß¾&b´`KŒ| £Ekb[ÅÂèþšÆY=Êô[b´ k-ˆ5±1zxŠÍGY~ÇÎ-îY;Љ‘E Íê×ÍR®ŒÜ·}´Ö×ÄÄ“ö a¡4¡QAæÒIX’% KºFÂ’›äÕ_±H¸¿¦‰T2ýE–$ܵB­2çè¯X$ÜÞ‰V²üŽIXN~iGÔ×ô’tZŽ¡i{ø. ÷¤œÄ‡Æ=}aÀ='†.nÏwòNTsÙÞÚñ*í¯PÓ•ïýKD£Éã©f9L3ŸfxC_ènb ÐIsšþÊðÒb1·§Är±œæ7ƒöjàYÿ#¢)¾Í–akòR1Õ›´»4Cg$Wè›U˜î•ÐáŸ2X½\@ïÞ¼nÊ€°¾âdÀŸúL¦c‹ ¾4Ý6rIÓmÓ­ÐtKƒØ†+&MO5Ëašù4wšn›v…¦ÛF˜ÓôWLšŸËaÄrš=iº%t;±+*A¬xTÂÎ*LŽ;­ÕÖYÓâMY-™L"Ú‹Ùoʢ ,Ú®QíL”§MY·§šå0Í|šeQ¾FY”YÓ0›²nO‰å0b9Í®”Å<¸­uk›(¶óbÐ8ïA«E€'7Ðþ4Ç&†J1¿0Ñ\~Ì¢ºQÚ³N¾]¾¨¼½)Æô*_Ý”MFÈ™Á9_c„¼59omFx{ªYÓ̧y0BN×!'Ö4Äf„·§Är±œfWFÈ»t çŒöèX¥?àwï %ó ù%[?9Ã(Š.'‡MFfºDØž™J¹†Á›Ì´%3mé3m¹ÉåZn3ÓÛSÍr˜f>̓™¶Í3ÊœF(›™Š÷¼#–ÓìÊLÛvkR,,}ÖBN°$~œÆ‡9‰€VÞͲÅo’†³íÖœ˜mg:1‡+uw'æc˜f>̓€ä𳕦s¸b¼;1Èå4»P·íÄÜŽ¾–‰q Í+VRòÉŸ™`»»‡’ˆùo‚U¦‡R­y(ecz(ec{(ǧšå0Í|šÁªU¥²<”jÅC©JµôPª#x(es÷PâLÔÎánŒ©n°Ù‹ ¯ãÞqÏ*­’ã`pT¤Ã> ¹S QËf2éYÓÍ/$‡±%YæVI²–[5è_†˜‡+f{¸ÖvóQ¦¿–¹U’¬åVIbæV WÌ0öí)6eùû†±%½ï°/kV‰®`AØ„…ÂÉœ1™îø˜KÀ¹qßÁP—ôn‹ub~a ‚/o_.ôxËbl.úÇ÷^äÑØS~qf:_ÝNm/¤_öZ5PÎÑ kîJÞȦÚöÚ®Pü ŽjPy•ëGzäÊ‘13v¥fn§ÆqmGL0Qtmž¾£à;cF¢¤WÚé¬ïáh# ̯|„Ïj1²ò…ŸÑ;Ÿ×îôšnÂÞÑ;òízm7JÀºáw*È=kYÀùx8h½&Ø{„ŽÝÀ ¿ßqìÂGD7x·øö)^ºÊNØ<8Š!ŠaàX½cð «ÅIFÍ5áñ1Fh«1»‹éC¯ BEkkî!æ¨dlHàM½î×tƒsÛIAÁCfÙ>_rê —/oÿi¦"– endstream endobj 4367 0 obj 8175 endobj 4371 0 obj [265 /XYZ 40.7999999 209.299999 0] endobj 4372 0 obj [265 /XYZ 33.1199999 678.740000 0] endobj 4373 0 obj [265 /XYZ 33.1199999 506.899999 0] endobj 4374 0 obj [265 /XYZ 32.1599999 680.659999 0] endobj 4375 0 obj [265 /XYZ 33.1199999 233.299999 0] endobj 4376 0 obj [265 /XYZ 32.1599999 508.819999 0] endobj 4377 0 obj [265 /XYZ 32.1599999 235.220000 0] endobj 4378 0 obj [265 /XYZ 40.7999999 209.299999 0] endobj 4379 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 777.620000 94.5600000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas >> endobj 4380 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 768.980000 109.920000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions >> endobj 4381 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 760.340000 104.159999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors >> endobj 4382 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 751.700000 111.840000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features >> endobj 4383 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 220.319999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace >> endobj 4384 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 172.319999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support >> endobj 4385 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 168.479999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading >> endobj 4386 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 170.399999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite >> endobj 4387 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 708.500000 135.840000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples >> endobj 4388 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 699.860000 186.719999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features >> endobj 4389 0 obj << /Type /Annot /Subtype /Link /Rect [372.959999 527.060000 381.599999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp >> endobj 4390 0 obj << /Type /Annot /Subtype /Link /Rect [423.839999 527.060000 437.279999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java >> endobj 4391 0 obj << /Type /Annot /Subtype /Link /Rect [77.2800000 646.100000 158.879999 653.779999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/) >> >> endobj 4392 0 obj << /Type /Annot /Subtype /Link /Rect [214.559999 628.820000 290.399999 636.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/1.0/interfaceToC.html) >> >> endobj 4370 0 obj << /Type /Page /Parent 2 0 R /Contents 4393 0 R /Resources 4395 0 R /Annots 4396 0 R /MediaBox [0 0 595 842] >> endobj 4395 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4396 0 obj [ 4379 0 R 4380 0 R 4381 0 R 4382 0 R 4383 0 R 4384 0 R 4385 0 R 4386 0 R 4387 0 R 4388 0 R 4389 0 R 4390 0 R 4391 0 R 4392 0 R ] endobj 4393 0 obj << /Length 4394 0 R /Filter /FlateDecode >> stream xœí=ÉŽä8v÷üŠ8ÐÑ"©…Œ*+³ ø` Qø`ø`ÔÌx0p\žƒßZ¨‰OOä{\¤ÈŠj 3S”¸¾}ã¯ÿüõ?/ÿõ˯Ÿ¿þÏå»ýùùëKu­Újúwþûeù@ê«’Ó¯n®Ò ÿ.ßùqùñòÛËoýÿ¼ˆvüÐþèç!¦ÿñýï/¿Nƒ¿LO¾~þ×þ·ÿ»ÈË¿ôýíòïÿÑÿø“íoxá÷mÚá—ÿž~RHÝÿ±ümhüëË¿ýáò÷~ zìwøÿ/J edÜ<~Ü>ãËO±ÁªK]‰®î§(ú¢é·ãÿüò—aUQ”Ë ÊK}“„Ÿcêa’MÕö=Êyzô^„ÕFGñë¬îë”vóHÝe9n×þ׃¶Ï(fûœŽ2nŸQæ²×¸}ÑзuYöÎLÓÕýÖ™yÌCö Á·“C^ÿï¾ó_©÷ðª[ûý=¦Œê‰wUoìpÂa¤jD‰a†ß·‡}‡FЦխì†Î+5ýÔyןD¥ús½˜®½¨®æƒãº+Û‘Ò:MGÃŒDÜÒúï6»ŠÃ5¥•NM‚‡¹6Õ 9Ù¿›þ\u/µ‰áG'„žžÊKW /Ž"}òý¥5W!ŒÔZÌÏZ½ìÅþeÇèß·ë᳋óu¿pgŒþÉ÷g&Ã[jÙËzß{Ùîõ«=`OÄJ‚“÷=ù±óáë·—_¿˜AZýö—†S˜~|ë1§¾ü2®»¾|ûÓ埪JŠ?^¾ýíE_µ©ZÙŒ2òÔR½-M/ k±jrl鮕Q]S-[ê©·ûƒ©{!¯µû*ÚI¥Ç–÷o=,Ýwa2úÅŒki,dô¶|J†q˜k»5̵z æºÊ…‡®‚0×Ý Ìö2ÿÕ­a®m·`®mÜ1ú'憷Բ—õ:†¹žöØþ2…¸6u«ûÿýç±¥¾=PÝøÀ\ûµ­ÁS¹ V) px5n'S¯õ ®‹N´¥u;éÜDˆîÔ ÑX>ˆ‡hݬ!Z·[ÝóÚú'¢ûgfm/ó_Í¢u½ÑZ1„èá-µìe½Žƒ!ÚTtˆÞy‡0”ã ½ƒ8ŒHÆ&‚´3H7fù ¤{ánÒºª7@Z÷šÅ܆'.HÏZ½ìeþK­@ZWr¤u%À€ôø–Zö²^DZ ­{eÆ 5 §(üH@øpðÄ!ËÅÙÒ¡Gº@g/ªpèO%¼èÊÜH}³|0àÅ.ô‹zz_Þk~ Gȵ²`7=­û'Òçüä{ÿ‘° |«ZwS-‡¾°ªxÆ'«aú'ÃG«ÉŒo5ënšõ0uèB èUÄ dË?pªŠ‹‹/`ÂÁ«€Ó€ÞñÎP1Ý éíU 푪v°‘!´Á…â3qQN H€ˆ¹;źF;A„ÅòûZ7¤kÀ“Mfõ¨žIJG£]Ê8´«®¶hW-]¢RKH»Æ·ªu7Õr˜;íRz‹v©ÎFuvo5ënšõ0‡Ò®zÖìÕgŒs˜#.œ Îô]´À>\(ˆÃ¡ÀábÈÁT&-ëYÇS3¶44´l:-½…–ƒßr/mѲ½ãá­›j9Ì-›v -›Æ¦i ZŽo5ënšõ0‡¢e;?p¹ lY¸MF€î·r€¯¢ žëŽPAKéÚY •F-#]×8H×µ[H×i: ‘n|«ZwS-‡¹#]Wo!]¯“ºÃ(ˆtã[ͺ›f=Ì¡H§oÒº•o«kÛ‰5Ò¥°ð€ F{Bze:¼WŽ<÷¦Þ<ö¡n¹³Ÿ¾e„ã§7üì–âíOƱ?™Mû“ö'³a27û“YÙŸŒc2›ö'ìOfÃþdnö'³²?™SØŸÌl¢8 ZLK—_¼‚C'Þa9 {€™è·À¢ÀQסä‰sÒd6,3«qR®Dã–b…[FÈ Ü2¢và~xââÖð¬ÕË^æ¿Ä ·Œ¨6pËTÆ£2·Æ·Ô²—õ:ŽÅ-#f³V5A‰hæ³çˆ‚òÍ ëÝͯâ2) ×år·Ø!ÞVcúón ŽÛ„qდãG6Õ1«ÅJ‰åƒP2çEé ¢´¾ô$uKÄJëÙÚ#Þ,K¸ïxbº½¿ò ¼bœW¬!ÑlèhÓuUõšˆXöÔ]ûé9-Ÿorx=†›ÜÇyóÇú¯Þдÿ9)‹ÎVxØSµþÁb´º×Êúƒ••œå Úâ'%@RDܾŸS!÷©¸öW)g ¢$'*†ÿ°d<ü0ã5Óªdš~{oRßh ¸=˜-éOVNToq²b¦N@ò§p^ x{nxÀ[°bêìZ¿º®v·1WA7¸«]Ôò Å%t“ä»WRÄE*¾q`ËÅõžŠ~‹Na»¨Tëî¢Øå¶vÑ}Õ‹Ó[›:ùäžxïì̓I$‹‘%…¸¸µ'„…*uú­t÷ä5ü[w?ñÉï,‹QèN .Ü ³÷ö©èL=Wkרñ¹[+ ÍÃ¼8ÞŠÆeE•‡U/ˆ@? ¡H€Ð2t5pá8–4î0äHŠG¸ø‹èœ[ ÷’%°5VsÞðPìPLœ>ùØ×T Ñ”`¸w÷~ëß"ƺ)Hˆw‚Slï.î ZÀ\ñel|Cá(LàéfnéL»Õ’—@Ïzt=Û£$aï \1& eÇéLˆ­âlôAñѬÔBz~ Ä' ¼¦¬PNBd8Ý•‘()Õ8T‰’³Q¨(¾íºö2‡r(üQ©sx`æDààŽ×¤ZáÆv€ç8òâ¦7ÁIûâÐöø˜I5&õÐ8§55c½°Ûƒ#Â[šYD»“›W¯¸‚†JððsïøŽ$ƒ„ûú#‡ ü€ÃƒÆ?¡ öÌMw¢Ú'k³(ÔfŽI˜$#ü'œ#!X“ðMŽ Ï(=èÚ¸/I쪟ìGä5äÉ÷ÛUŽüÄÈÌ”­À T1]úž«†“Faðí@[üÚ5…d08A (âyr`ݹB… èìá&-¨nt>°‹`ª¸ ^.&Í1®çŽpÉ0 ¥AæÊhøÙóBC`›1…cèfŒ±*'/™Õö3a•Ì»NHa`0¢C%ι½åR“ØR9&€šjpGüW†ŸGM"ý$΀‚®ÖÒ©\)™ qÈq’#ð×Q&TcPÑZ†Ã€’3² 3[ÍïúA!-D— HJèä´FâüÚ¦A¿YH#¡ÜITÕ†úŸßÑÇxú‘&Fµ"è”ÇËw…(~„)›€ À²’uNªlâ@ð'³Ì|§}Ìm ß[ åt§û<Æ“¿¤_¨L[²&….@Œ€ý ×I7ÈŸ¶NbSmë€`a*‚"ã 2óNWÒ;¬øqÒ*‘IÂX‘)jÉïH)ÊñP¹¤ñŠáœogÇVæÒo¸º—Ô'Lq•s$‰”(ô¨°ºùùÖ¸« ²„It9cÝmñ‹Å0H¯DòI#c?“"  É~7pxÁW|s'ýáifë§£)·£‰ \04î(P'øwîRœI0ʆE±ã_,’Ó)•"µ¬V  u9q3m€¹6€¼«Ül¨iŒ3›rôI0MFŽ~㺷¢³¤š$ŠCЂ,â úÌI ?ÍYX"“Ø~ÎYKbs%x¨SäÂì@úåtk—AíbO_>9„´ˆüjvK!ÅÆZñ pMœÏ0àWvü·Q|ȧ±ÄŸw>þ˜Ù1G@2Rç÷|7u²´s†áEóÎvæîl°ÿ[¿-æµ#ÓÝ<‡ðÜÎÄñôy¤ü|2GrŠR$qB£¨4“m™'8FÛgq4¿u›A5$•*˜÷êâ(5'äE‡€4s’w Ud"¶sdÚÚÆD80Û±ôÅÄj TÈ“ìà§p8•â\PãþMbºâDx?̈–…¤ùºsæø}Õ¥"¦¼‚ôºQ®hý±R“(rexPVÊ ó3HðyB¯R‡ó± òo˜Ï¦ïʪydþ_*÷&Ëä“ʼ™rpâ£J3°´1Ñ NYÏ÷Mb§$ªáw¬L63s­„SÛoya.m„d@!3?\g @à”Ý”dA?é&¸““”í}¨Š”eb ¬êy)]cÊÈ Z›õ~çi¢79eŒ)ˆà>‚Š‘$«#K¹±´âLŠd̘ê}Þ¬Á¼Ñ•Z(Âç»k`teµThD&Þ›]ÞÖ7kQ mù„µ4è¬ñ–ü¥ûpeÌ(9>OduL,t¸)AÁσ£—wîgî)û‚ª€M­€².ÓÖ2ýXB"A«Mjtå0Oˆ†enˆà¨s¬xöAê¥Ë1 Tþ §€„Ó‡4ãÇA_rÒe\p>v¢4Ϲ$ÂXª  '‰þå3šxš¹ŠÝÎMþŒ„"½8&Ê—T”N[mãt×/ý|‰¥*t‚^º£cÇÞTÙpÊyØý¬Ô'©º› â4'ƒ0Ã!¢lå ùâ ¿ Çï,ÅÛ)º8Á® 0gÖ„Ø]¿ø#¤rã¦ÿÒë¡Ó±ÏÎ^zÝ)½|pÄ¥×Ü…º'Uר¡ò¾ï vÖšG –µs.ê ¶Vz±n?¬ã¯`U7òhX¦°Þ“(Mî! WÜç‚Ê=iLÍgŠXÔô“” *Up]š€*zÕ7)^ס²Ô ÊW“EWèË0´U£}{7ìbÇüšÝ¦ªmªïŽäùP¶¦§åóE„Ã!,ÿ M³Z«çŒú´cÃËSãb Ç ûT5ÀE+Ü]/’È’×B"ŒrV%ðx<®";k‘R:ó|@¥˜e€yj¬çw¨Î¸XôÁîËÌ÷eÝ6Î>¶–œ!5²Ýº8÷bÚ Ü¬ˆ¤,Ɖ̊÷1y¡<)û4c(ÅP8ךؼ…ãE€NBHŒÐ»Ôž¢)3$ÿ(À”ü¸ÊnNwzçj9‡ëÓùïÿ³út+ºy2hð/á„â×&‡§1§©zþ8vÜ—ûŸ9òf¿”¯¤“ÎÜ5ÌŽº62ïußÇ•~ù©Koiå÷gðËÜãLs{Õ3|€AcÒj®…]ò)ëã1tŽÓŽC9)›ý˜Ü_ …æÏzµë^è·û²ÂrªG¶ã›®=rrÒšDÕxO=æu­L@Õ>÷1Üq¬‹ð9¦¨5sB¿LQ1+§bc¯ù»¥((Î[“6>‚€7àšG(`õWòhÛ€Jxw¬E¢q%ª¢÷V¡>lÜ‹.PŸ¼b¬tgÖèÜd²°X ÓUϺ ¢p2ÐG+’q¶°øÔŠVRwkšhcNÂ'~£ÖÇ‚Ó"6ª¬±AÂ¥ö¸Å…(’Ö –ù†“<ÈNÔcî¡§¸Úp›¤ôz¦úšíü;èF €ˆg@ŸýUg’è4~Ô>_µ”ù—°àwcD×8Ì媌ž…’Pñ¤ôÿé\E,]ã¿Z®bÄÚïX#p{Ú‰öçTCUiWŠ~#q‹ Çî‚Ï݃rÖ#ÜÍM{gY™âñÏ‚©ÇL ¸>xÓ¼’$s™‘ùV:î›pq %•R!í•ÖЋ—9ßùf.FU ‡àà-„ÄHA‘‹ ÑR_±[´N)j7öb†;_!@<Œºµ’8—cÊÐLpœb °?‡Ä= QÊC2åwäíÎV‚¼Ã­<eÌ­–²jBNU*çD’d<€Ðo§Üj³ÜHZÆ,™ÓÔJ˜Î—öpz£h~uT |e„³8?çäÇè¥yäð¼už¢¡N*äTëIÖ™g9¨Å2ídÒ˜“vøŒùY¯Q.ÅÄAÅÔÊ©ž‚´ì³;WºÞŽîЈÖ= ¾q;«nÞ¸óŒ cΔRj_užBte¬!;Bt¸ˆÂ±L¥(óZ_8wš©4ik¹Ó‹Ì™™D?yˆ³p[Á…ÂJ×âDêå Hä&œRR`HÏ…DBФ¥ñÂE”ÊR£* ê‹Å+`+™£o•ž)þî¡v¿%085Bý “ÉÑvxÕ- sJQxH©;ʹ`-‡m·c¤I½KeM óÀôèwT>@ì +}/…–ƒö\×Â8,¢˜U$eÙÇ4Çœ¢ÎeîZœ‡'ÝÄÜŸ“´~’Q€Õ?¢%¥‡†›m8îÜ´ E¡xÊ$™‚Ê3…ŠEìo$gÍWh]Nô4´Å„9¥S/õEÖ›×RLé‹FÜÂÞlÜ£¼O<±ðÙº³|Å8¯X÷'6€hñ‘œöL¨«ª¹Ñæ´V×¶…Mw7…¹=~äž@Pÿ–‰$Ùè^ÛºWcB Óèõ¶šëb+ØE[ªf»Æmié߈Oè7ýFÏ[8EÅÞ[TGï­©çc0à`{USÃBFyE¿ADZjÇÆ¬wVZÍãLfX[+µÀØÀ¹YÔ¾Ö2x–dm}óJŸÁ ü”õtöö³æ*]+”E¥îª€ZˆÎÚîuN·ódF3¦YƒD\åé¶–RÉáˆá¼2À ìÞlÌX‘B"öaö <•ȧSË÷ndæx¯Oã¿'8ÉY1ïTŽ×sZÊ*ãrÒ‰Y,‰ú¸ÆÊ0â1Ö“Ôã?±¤~Oè{‰!cÌ”ªj½Æ7RY8ü¢4<Õ˜“nÏíÙò¨-xb9^À¦'šAa¸.ƒÏmç]·÷úÐ'¦?[ŸO×e0]·ÞÙ¡p襤OL¶œÓñ¬ãÇÅgQ5Þu³ðý¿˜øx{¶<ñ9zËবóà&Z#a§zJᎇ¤gËO…›|è-ƒµµò®Žƒµj…×"Á%dŽ}?“j(O á'ÂÚŸzËКVzÏäIkžÏ“Öü¤Ð[† iá=­R6„¬eTløþ2®³Ú™ÁSâùpT觃Þ"´FVþ3yÒ&­Áç†óZNL¼j>7Ü£ƒÏíIkžÐûÐ[†v ã…1íܹH¯xËÙ«ÃågËÇ£Y · >«¨(Jt ;ßà•ø{µÓ’´&øwŇ7á<ãƒéwgÆç'ôf‚Þ‘¦õÿ]~ôÄk̘­.öÇ÷ßw¨$ƒÕ þ¶Kw?õ'½¶1¨‹€*#Úë”:¨î·ØMÚ¶×v;òÞÔ×ig-Sì®ÝvÁÕn£eÊqPê*“§bãø›k;Åøß[:t~cÐo¦ ¤N^e5f²ººÕÛË'oè»6Ubc…_°ol¦ÂV‹ÀÖa“5hߨ£¬}™uÃï²·PémÁáÀ’J ÐË:7®ñ}GgC€ÄSž¶ÖU{Cje𱣨,V8!õ½üöòÿuw‰¡ endstream endobj 4394 0 obj 6993 endobj 4398 0 obj [266 /XYZ 40.7999999 95.0599999 0] endobj 4399 0 obj [266 /XYZ 40.7999999 713.299999 0] endobj 4400 0 obj [266 /XYZ 40.7999999 713.299999 0] endobj 4401 0 obj [266 /XYZ 40.7999999 642.259999 0] endobj 4402 0 obj [266 /XYZ 40.7999999 553.939999 0] endobj 4403 0 obj [266 /XYZ 40.7999999 270.740000 0] endobj 4404 0 obj [266 /XYZ 40.7999999 270.740000 0] endobj 4405 0 obj [266 /XYZ 40.7999999 225.620000 0] endobj 4406 0 obj [266 /XYZ 40.7999999 225.620000 0] endobj 4407 0 obj [266 /XYZ 40.7999999 642.259999 0] endobj 4408 0 obj [266 /XYZ 40.7999999 95.0599999 0] endobj 4409 0 obj [266 /XYZ 40.7999999 553.939999 0] endobj 4410 0 obj << /Type /Annot /Subtype /Link /Rect [60.9600000 502.099999 84 509.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dinput >> endobj 4411 0 obj << /Type /Annot /Subtype /Link /Rect [174.239999 492.499999 263.519999 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling >> endobj 4412 0 obj << /Type /Annot /Subtype /Link /Rect [183.839999 457.939999 258.719999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_imcall >> endobj 4413 0 obj << /Type /Annot /Subtype /Link /Rect [210.719999 423.379999 285.600000 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dpcall >> endobj 4414 0 obj << /Type /Annot /Subtype /Link /Rect [339.359999 68.1800000 419.039999 75.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4397 0 obj << /Type /Page /Parent 2 0 R /Contents 4415 0 R /Resources 4417 0 R /Annots 4418 0 R /MediaBox [0 0 595 842] >> endobj 4417 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4418 0 obj [ 4410 0 R 4411 0 R 4412 0 R 4413 0 R 4414 0 R ] endobj 4415 0 obj << /Length 4416 0 R /Filter /FlateDecode >> stream xœí]K¯Ü8vÞß_Që]->DI@ Û³À°,Y=™ƒö žYÌßT’ªê’õQäEUÉ ´íKKâã¼Ïwþ÷¯ÿuúŸœ~þðõÿN¿M¿øúV+S¿NÃ?Ýÿ@¶g%Ç?6m}–ÝðëôÛ÷·§o_Þ¾ôÿÿñ&ÌåÁé·~pþÄøÂüö··ŸÇ¿?ùúáýŸþy’§?ôûëéOÿÙÿöçé}Ã?øþÖvføÃïㄲíÿrÿ§aðßþã_Në§Ð^Þ;üÿ'%¥©t»j?®ŠË÷¢U'])Y›“²ŸgÝoÇßÿûí/ýÛnïªÎµilú?·•ÿôþF¨D}êsR¶_ï®2ìUbí‹TÛ¦yÑ0#±ni¢Ò÷U AWF_,ûo­[òõUk÷N+Q¥yÑ0#±niÓ!¸¯ú’„UåUxüõÛÛÏŸ…Ví ™¾ýe8ùá£ãoßúåÖ§Ÿ–mú¿ýùô¯U%ô¿¾ýõ­;×jêQŽ#²C#UKxæW4"8bàœõ1Röˆúiˆ¤sƒôÆB½Ÿ¾õ€ŸÛŽ…Ÿ+üÌG8¢âw±‚g_ÉøYoOå¯3R2?ï€z³HUµ,ÒAAýL‘—ò—­iùy%éÀB½yø¹wâ8øY` ß&°íð Ž|ŽÿŽ„o;¼„ƒŸƒ,ñ8Ëkn¼RÈ?nÄßY²7òÈmxdÍ“Öö¼ùl#û”5ŸS/ÅçÀœ•1î L}H‡é¿CZ)ö7áÜÔ½ÄÍíû–ÏF£ ¤]/êºG¢Nš‹¨ÓRÏŸ¼ªñ×m2p¤§©ÏMm˜øg<ßéàwÆiÏZŠv½½md sVBÖïž¹ Aû;ru¢:×F>rî|Gã=€³#ñ×giÆÝžBQŸ[ñ~E¯çúˬ°E,]laļ€zœŒ>;6N³9W÷ŽÕâTõ´•z|Ôa»gµýìHòÚæµÛ¿f"/%G*ò<«ÑDäçÅEÀ ˜µ™÷Ì3)ôV<×1L%ĹÖføbÈÛðˆ}1»æ<‹?ã¼õãL÷¦ïV¡~䂟™ù«'á÷28S ü0¤`÷D?!rÄ,„ŸqèR+{ã*ø¸\ €™—0“ÙKXEºØR<µ°5ž§²U‚»F[%x$rRU”™Ó\b‚ªOTöœ©xÍãÙ=çœïÁ3ÙL¤}†¬¸c®½“£5*ä¼mø´„ó›~<Â6bÇ!ýà¹p;Þ %o%°ÌZÚ`FAÝÉÎÔÏ!s\f 7fÉ+¯2øƒÍ‰æ0æ5{W½½lyècQbáœRâüûV 5¯}5vÈ#žx“¦³¦N cØ|¦Kq S¢±Ö–) àQfá6A„òŒsŽŒ&¨5ÐÚÎÃ9Ûó‚屗­…yΣ%¶Žq­:ûäÃ9 øÅ©+”´¥Òænä½›ç°C'ÛÄãû¦4% ’ž¨}¸‰é‘؜––!l“Œ„ß™±Ö4Oe¬Q‚Ç[úù­ÑÖöç²£u3»‰Nk: ÖþS¨Üu¬Ac m¨0q\žg8s†Ð@oõI¥É_g 4>›õU¬4⌊t­M‘‹ÎåpGhœS`IàFd6OÀäõ.xÍbÕj‹n=ͿטÀ'÷lüF„ñ#$Œ‡#XŠ8V¦¤óF>:#›)›xÇÃ/ëeD¨‘¼I¸Íµ–P–Ö Á¤¶¯ã‡ª×Í•E6‡ª{ž!€¾'yx¦€±+¬¾ùÈá0íÅ0¼P}òhŽw–`<¥¬ï;žA.šx¶}[Aãü‘ SÍ`¥ JcQêžÀID,¥ñ:5RX™éÊZ;JBÞºy2l %ÙOвKß¡›Eòt¹.âeÛ‡ËC…ka€¶´ ˳ s16Ë–(uÜ“2áÉü-fë2•$š‚RÂÁ©8Mš -l4Z¸$÷â@a¤uЋ-Ø8ó~­°g³ëË ¡KvGS€žÓ !²Ä1‰kNd3§ÑÍÏŽøÙ-Ȥ’eO±”­$wqyÃrx,`÷òX “³Äk̵Ú6æž§P®ílÄÅ }DÄ¥çmp}ºˆöéœTDü Ó.NKçösYä%vo9š-ðrÞì.›+6 ·uÄÍô’Íb[:{š‡{å(i‚UDêòSCåq¸q@â1²†4ÅÎ’(¢Ú%¯W/L;ÌĤÞ{‰Ûù2ž-¥Lc‡‡Wa•ˆÉíÇäæ,.UÊ6ÎöhÕ/:aÌ.pÕZ»øD.pm¬µ•!ìæ;‚öS¦3»Aש“©X „\׳DÍ:CÏÔÖîNæ‘à Ðõ9<Ç6MŠK#%óÒVÙçédTLjšÚ–×G‡ãi…_áµÎ$w‰âã± ëIÑ8â Û=" NI~\"=¹×Qüö$ЉrÝùì±È„fkG c[ò+êP=Ÿ´>sU=‘-7P­,¯ÕÕêÙ]¨"x“Ó݈ù²LO˜ÒB'"x^šå‰ª9}†` ;G¨c¡Ü¹©¯—n^î|»bÎy&mÉi¦¢×'*‘6¦¼ïOV¼==ÛŽ]VÝts ÚûÝ<¢·y‰kžÔñÎë: Ù×5a“r;Û$­>Î'Û%ò`û>=¯2[^¯•³‹±»¼Þmê§”?C65·¼MóHeŠ´o®àwØ…‘T¥-NØS¼úӒš̞{¤3y÷÷ÕšSºÛ­Ý8ŽZØöÏö¦x©°ŠCHdÛߣÃ|„Œ+¶Ã|ÏXÏ}Oò-5²ê~Êâݔǟ­UDW ÞÖZ;'üq| ÇRUx×ÓW(¦V·ö½ÌÓ òÓp¡f{ÿƒßß¾zŽ›‡N†)¼ß¼ž à€b0,î;9ãÒE× á.¦–=$[µõ6J4Å^ #Ä'b¤aÄ¥ò/çˆïöTt,Jw-´3õ¦ Ò¤ _rº!y,Ï*6‹V±´0L‹Þƒ‹z¸P·}\ì÷­„©q´WÙ*å7#€±M›²¶/ª—|t,ÌHÞ è½8m GØÝòN/nmPó)4C43ÆF{ÐÌøæ¥Dø£g>-œ6ƒ!pcô2=`½„Gý ÜúŸˆ>D)2g³e94saÇF‘g´‹ˆHx&@9œ ‹+¥sP\MÏk¹oPäš;«ªÚ>!ÜÄá¿ÅzM’,ŒàjJ¤“Pífbï+aðƲ‡“¾t=³ƒáîC0›‡Æ†Y4†;¼8ݰ)ˆ³hY»¼}Ön 1io_î\À0kcó€Ò"²nibEá ’dÁ$¹’ ˜¾Õõ'£€Bm×Î’ewHãëÔ=Hã" IÅìö_Wp€ò*£}¯ d¡,NØ5ùhbAaý'Á—{öz‘ùèÔ¦¨xô"'üÙhÛv,/^H¼-»ü(H‚æh´Ç ~‡´sS£=Y‚k°Š¥¹×B9'ñyš{L«( Gp)è“cŸ= &pÚm?2$†*aW¥Gˆ\Ì# .á}Òãܘ“êM¢¢£MP^–UÒ&—½…ÄÔÔfÖa²}„Ä"Rÿä¿4“‰—7ë !uÇ›/ 4M¥öÌ϶}c–6ê—åY'fr›’˜¸3YÞÆh)6.¢hE$“S„ÏVïU†ÇdüFv—³-+âî<»<‘ûƒÈXøª`¨ô§TDåq$šz$«îÚº6èØ~G‰&!å¯à8Õö+}ONWñ#ømž˜Ž“`/`êÅ#°\×S>‰#¦Žé(|]ÛæÜˆONY÷{sÊN!L1Ü”vÄ@>Û~nÇÈó˜dT¸VÕ,kP8/vdÙ|:j­íérû‘¢*BNB攵.†*mŒìw$«¶oT1ëÆ#{D>Ê)Ú·Ç´CÇŽ<ú^)üæ…£?›P0g-F1Фë’G0]×ð™:gĨ“ËTqŒ#ÇÈ1rŒ#îH=%ŵí׿:Ý£) mp··úŽ‘Ãk*ÝkÚ'gþTê ¡ sT9ë>âëÇÈ~GrÆ×¥îVÌ”’Ý|º¼ç‘MÏ<è­ø<ûС»z9ì€cd¿#Yí€vuY¾¹÷zŒ¬òQiûík0½•çÂt]0ÿä¨ è…`÷øV‘‹TúZp=Þjüu[©æ*¶¦¶GLü3·û–g:ôÌÔkÀœÕ¥òó¡+b¿MŽ?ôi¸”;LÖžõTáf§F”Hú6ß¶ýŒä*êóXf{7ÿ©Rœ¿•€jg<ü0OÆn•F©PöT §èÔ½ÜÍ3àfÕÌU¦Inr 芷“ÒF7[Kr p|OcRãÅϸ-R\™Ó2ß)áLÍé…âED|jk.Ò!\T+&ÑÚvÕûV&“pïEë4“ÛÈ/pY£pÐ," ðgôl@ˆˆöŒ[v!èKü¯¹'8àÒa¼ kú¤”›ÎçÜG"®ÕÆ=±,ÄâyMã,W1Bh~ѺÇáTâú=u"Z¡à¯¡J|„ÎTišs¯è”ãö¦MÑg(¢éˆ‡ÿÂÅðš[áÊ»š i7ÎFÔÆv%2uÒh¼`!¼à>bü~œ®DÒÍO²In~¤Ü@i0ˆÛU-›®+´i“Â}…þŠh[±‘ZGF4Y"\×Ãs§ç‹è¾ ôŒdè=ÝÙòpOÚ;&^.æIv}Šæ€îúR:™NŒa¢~Vö]Ó5< ‚û»“îа"D8K?À¤þSLØ$‹ ÎÔå–Q´ª±ôAöûÏyB aÿÖ”G¢EL-\ðYŽ–Ý ©äžçOnŸJÆÏà4êH^B;ñ Ó¨âÓ,’"Ò¨xj:Di·:Ÿì¸ßÑfb 'ùKI?ãT2ž›gwà¬dv¬”Ÿƒ Í ZKÓ?I„E¢åVbÌ7Bdº½›'“Ž >ìePܹÜ* <¦§9Å^‰0ÐXo’x½«bËÌ·ÆÒ&L!Ä]zl8ôœëö›úÚÌCÖ¨Ÿ%DRE$óC…5ó•”J['áŠß1[°çÓD+­µ1¦T}{ÜÙÔN)\ó\ÿÞÀ:.ƒÃ…k„ž°ß/;cí{@ÜnIèó’ŠÍA*1B„R5JX)Þkµ$àðÜXA] èc÷Â5`Ìgʯ/&òOAw½Ê%ykA{ð¼×à[s8„Œ¥é”­K·÷93…¶Ž2%ðS&á#Òº>’ç<±ð gÒtn®ïVèÉö¿µP¢\ž«(·#«z Tl8RÌCl¶±û¢ÕÖùFÈÒ»Žê†¾Ééh‡Yœ¸>»Î‘FÚ{Ë’€wCÞr8H¦„oGXïQ®“î9N’[æÇœ_†yñxaká© ‡…<2/ÜÐc´–ÂÞf¾çl.ƒޥǔç°ëu•$“‡`pd)+ûר$ ˜ÃÑFŸ©Û,î]K鉆;«ð§ ¾o;µE£[RÜþ]Dù(é"{‚ºß ¡j›ƒW†„h㚪Š/± ĉ{yoR!ÅÜÚ¾¦~8ÙKñÞ’V>¤­YÇˉ_¯)Ê{{Ú¡¤EÝ"Ž<ã nuȬʲ;sÂSŸÊ“¤ó Sy:Õ¤h³“ëÌ3ƒ ™Î>¢EΊhÛú(I=Jô–dðî[½Hm›i‰$…ük)i^žbx d töÁGc3&¡ŒhßÓ_ªˆ %Õ„ýz À]÷Y:´s’L]['²4Ѩ`Ê !ªŽó©­®ˆó—M“àü=QB|þ”(á†`bUkk§öùU­-uv}Ú4˜zkeË›^–T%·* O€,›,™.ë-Ç KRDé¸ï$üaŽŽQO*¤(§_<>Œˆ¦i2ïp¦æd)0oIÊac\Ÿ-2PY[[<ý=/I‚íÂ2š #‚Ì—ª%ôõ/ô}OÀâ? ¢|“ƒM“͹yÜ£y02ŠI¥Î²{f¨ë³á6ÒÀï´ð™>3º<Ëêr=ámäWø¶‘îòþÛÉ„°ÂÏè™É0{4"Ð:&Õ÷Ìtb1kŸæva€T7üYÖ⊬©á÷ঃ)GzI§ñÒ5ÞÙOpÖ˜ºJ,ò´Û¶2g1€‚²ò}HýKJé{úòöÿ¼'³ endstream endobj 4416 0 obj 6051 endobj 4420 0 obj << /Type /Annot /Subtype /Link /Rect [182.879999 744.980000 214.560000 752.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 4421 0 obj << /Type /Annot /Subtype /Link /Rect [364.319999 667.220000 415.199999 674.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4422 0 obj << /Type /Annot /Subtype /Link /Rect [138.719999 564.500000 152.159999 573.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din >> endobj 4423 0 obj << /Type /Annot /Subtype /Link /Rect [151.199999 371.539999 169.439999 380.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dout >> endobj 4424 0 obj << /Type /Annot /Subtype /Link /Rect [246.239999 88.3399999 297.120000 96.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout >> endobj 4425 0 obj << /Type /Annot /Subtype /Link /Rect [312.479999 88.3399999 367.199999 96.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout >> endobj 4419 0 obj << /Type /Page /Parent 2 0 R /Contents 4426 0 R /Resources 4428 0 R /Annots 4429 0 R /MediaBox [0 0 595 842] >> endobj 4428 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4429 0 obj [ 4420 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4425 0 R ] endobj 4426 0 obj << /Length 4427 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx]`ñ) ( $¹I.  ÐÅ ‹"Ói1˜ šÎ¢¿’%Ù¾¤?Š<|H²•¹7–EQ‡‡ç}>¾ùóçÿõûñÍûÏÿ9~¾ÿ|¨N•®†?Çþï·ðæ$øðkݨoû?ǯßßߟŸº¿˜>ß8þè.Nüýëo‡7ÃÃÃ'ŸßÿµûíG~üK÷¿_Ž?þ½ûñÓ8^ÿ…o‡¦Õý/¿¿0ÎxÓýçö·þâ¿ûÃñ·n ÍyÜþß «uÔ<¾_neç¿··¢‡UGYɺæGÆx7OÕ‘ã¿ÿ<üÜv™Æ©•¬û¶¬+ïQ™”ݸŠ7òØôc+nj½œïXÑ#I¡ÔωE¾]Å”{¨S#5W²_Š~TÓðî÷ZŒ‚^¾Ñç—oU<Ç¡â騚*ÕÚvsbq/7.‰¾êj`a.ëèÆŠ'Y«R¿Ÿ‹|»‘úx¨¤Û¡Ó|xù:úõ¯cEÄêT#õsb‘o7,‰=Ô§$Œ_5ØwÇï¾Þ|l{mýåçng•?üøòí »ÿôj¬Û²_~:þ±Óûퟎ_~90uªZQ«³0\áõùJsù âçêé›×¯VÖWߟ?—˜Œ õÃùŠêl˜†ñÛÉ3|Ï0y’Ã…›+ ^1§d¿ŽùÂÕǮ줤nºñðWù[øUÂû±Öœ«ù…žUs¾¢Oœ5¯ï‘Â|skíñó,Rh88ˆƒ|þ3aÚ¤šùƒ;(e o±žk Gµ^˜ ´áÓw}EØÃzÈ/!ìŸçÏR:6Þ$Ç ‰Æ?˜Æ+ ‘à ¾tÚ%NW0)·ºhøeêƒXkO på+¼EW*8Ú¸ô÷®4áW¾?çަSQii&µAw‹­¥„{c˜8«Nºf¯ä¡0ùnä!,Iòrë¬Q_ör0\ÜñB·µ±"Rå~f3Ê¥&6Õ#j­ô+Ö¶MR¬`ýþjˆé„µ&ÖIT|€Ãú”0Ç$Z,Ķl ø:ü…nŽ8¾Š‰ͬ´†ƒc­×ÀF©EÇY»‡™å2¿ÍÏ‚´€àÜ#KÚ÷Pžr¨ÞÂ{„¯ HÂì sÿZç·Ò§~¡º÷lÚÛ~=|.îý÷SxMj›oüàž³7É?˜kÀ 'Ï*o!eÓ3@HùS:@ö†ø Xâ<Ï”D÷?"¨à ÖGó…¾ùñâ/œ“0.œš0£SvLÈ?úfBæØ4£­¨[K€ë¹ì»È?òg³›„ÅZd‹™í™A•dŒ`>d9™Ø¥Œt²¬uǽ)ãàë nÛ!ÞwæRXkózÙ]ñÉ-®å#°Ÿ­E¬(‚&»Âaº1—Á"¶õ&þ:<À.¶üü$1pÌ]Z`+iÜÄAz¹°«éùœÞc[°1a”G±V£·gƒ^Å¿j…)þßœ¥mèyaà°¡ýc¶QÒðÂ6KR’°€6yófµÒWŽa§{ñJ¯À¸(ƒÑÏ1ëxï ŒÙJ<7˜ŸsDsqd6é=˜¢Õ;xe.swçŠ Ä ñÇh92ž%oÛš<bƒ,é1ôE€ÆîÜBñÛœ}\ÀÕí”íœñ‘´(±¸XÉ]!Œ•ØÅ ‡¼÷¦PQr\'UçÞh‚׿ú¾+´¹[ÞL‹PÞ±Ti`’ážZ@‘Ãl;›éo—/Vpb t¬ÍR”Ÿn¼>t×Dflw\Ì¡ ”ÞkIv|Œµ¤×‰ £`iæ2äºöæ*¬_w®JãÆŠÌgÓÒ(þ,Á'Rn9@eÆô$餰¾JÐ(¨€úÕ¨Œ|€CÐÏC1þp+KwGP6À‡&X/iìàà}Ÿ3âÄ„)Ò(}¼Ü„ØKH¸œÀµ±gÉ¥€ôs@êb–Ñ“ŸU8rìÔ´•öR ü`Y‡ /Eq%j€……WLVhâ-ÄãRœ&4!q^Yih«bÆ[/äW­1ÝU©–u€¹4%oDÓ‘Uàï0fcy!E™Iô½ΛÔQce‘£N*K}ÍÓ{-T“qÇ×Ucîx̳*¿0 ·t"À‡% –Ð:³iÒ¾yQ;&§3 M+!]"nΡmø¬mRÊá„+[³@&8‡+ÝÎÁ‡½–‡sxÆ›à®+R ÎAudbÓÎáyá6]âŸ'-âAÂ+óŽçæc¬çRør–#mƒwu„ÃèЋ“ÉW1Càà+›ðËÆ+i[É™fÌP4!®®ãØ%e½«ëÙ mdKYYh˜›·Z §®,'„kõ³ØÆ¾ð7ýäÏsoFø›Zµ·ôð7q”ƒÑÕd3…žôë9vciQhÒZ“¦@¡RÒÒ!ˆ5ܗޝÉÖ;µIÇÒØGý^S8 ¹Ö·0nWo<\íÁ%ÝÙø,©Bk^•Wˈ Œ<‰=‘Á ¢¶.Àõ )ÅÈRGV ®eÆ*gÞ°9ê‚ö~娚ˆáñ†8n+£R—7‹ï݃sV0ÿ„¯<ÝìN§ÐMBl­/ZW¦ÒLÙ½‚Àm°q““Ø4‰3—5‚‰] Û÷@ˆç¡–µ˜:…%*ž[ÎŽ€Æ´[JµK«ªfÓâìéÓçMŸ’€å­¨N€fJY¡šÄ›O’G-…X…ƒcÞ¦$a)e„r^M(ý(󛊵,ˆJ¤¦\ÒE¯úLÈAŸFZ‡®°Âì)fâ(!ô•ÙaèÙhš-‡-Bä"¥åm›…QX•÷Ú'iöuEÄ 'AêÙPŠ…T*Ï iðEÀ Ï­àðáŒï‘ø`ͧ¡h…¹S‡ªÆo*)´¦D±p÷6~FÇò`aÚ ¹3î’B DMmB!VÒÑ0Ã`aƒßG”È&\\ËÙ©:¤ìò§*íZÐÅdðM|Ót©5ökEû L,Šª ˜ Œp€ ¾â0*wfv˜tŽ@…ͬúŠn ɦÃ'ªâ%Õ„fRë×»$¬Õ( rS&ÌUº.Õ.”¢àWX58¸*)ÔÅGø˜ÕÂê&mº Š&mx¬C™ ×C|*vÉÉïVÂY ¥lY£»›‹fžýðŒüG!0ްbD>ÁN5^Hìâ¹á ½oÛ=ºèV‹G‹¹>ëpŠ”º$”’¹>ó5·ª?¡ˆGø /ë‚€)SÍí•9ŽþÈÌI¢ñ_S,°r"D‰Kœ& çVùÁ´oØ‘mkУXM´& ¨‰ÎÛÄ´ñjé$§®$•Û+¬}¦jƒé¹]¨Tü»'píµ:¦›j¯»óÁ"µ×­2ˆ“_ßM‚ïæ™[,ïFͤ™Ï[ß®Ä{n-*``R :Ø. öóÒG:ƒ÷^‚( Ü!%²O9Ìd‡boÌgw“žÍî„ Ü/ˆ[sS´,Þ‚“³ lËäã––`ËÃÉ,ÕÑ‘ÅÐ/r€l^©mLûò¢H“k/Ûyvð?g%ä\K,ÄS´S„`š¤>(=ÏŠ1­Í%+e%[ª;4ä4§˜L0+fé¯Ïs~OšS0÷Y#iqSCß*Õ²"地žìÂ$ç,`¾¡” aÝ@pSBþk}•"¾<ÚŸH©v}úËã( ,È|mc`•1Ÿ(u‰·Ž|X. EˆÆô‹*ÒÓ6Ì\…¨–«…ÐV õ$kN™vÊ+c6:rvY›f{U¨‚1´ñˈߜçN¨vv}üs5vòÆJ'ÔAP*¨üÓ×ù«j¤°x?/¤yÉü®Ä}ÚMµ5¸‰ëÈ€èJÅ ÝîÝ'ro€K«Z––Ã/$äz³¦ä¡»q~®®êKj¥`FG3vq<žF¬9L·U΄ÇÖÝUù®ÊwUžA•//†(ªï`<7¼·W¯°Ùµ^¼P¢îüþ‰t„So¶† Ó6ÆKo/‚ȆÓ]½Αõ|˜CÄGœDך>N¢×²SN•ßÚNáÂnèÚ03ô«Ú;R”úÃlTÑHsÅ ![jÎ/³ìÈ–;²edËìGþ`_$BçmºmÜ{S ò ÌžÒ‹O€í á‚õÂY.ŒÒ*•2¸ã0ÂÙœ”À¥Ïˆ!„FÕ1-Û“ïL=1bË*Ín?X[¶ŸÂë%Íæƒ-À°ªåÏ˰9a’{¾b庪—fåz´ýo ÿ^?Hb€zqf6ºüq>“çŽYŠ+=Ò aÿÉÃx¶Šq± m¥0ÑÖv;×rŽUvðý Œ¯²5×#íÆ2¬"ÀûQ&=8c­ÖÆf^!bÄê-ŽÉ¿ãß!/­Ð9~;pqÄý$ÈÓEaûsSÑ(CèÛ°aiÝߘþ:+%E0í~¤§ËàJÉ*¯˜ÑÁW–ÉU·Ì4ž»t¤mLó|7TóS}r¬54t(ÁK " =šæâºÒaI„ ›]½õ¤×\”V@ßÅvß»©v3é¿0þøú-(ßp“Êøä|mç­³ôê$ë^ãžØ2}: Š£¨.à´Ãj}Ò÷Õy+OÀ*æõ©¾Ö_ß¹2ˆ5!N¼Õ÷@p•:émMwï9 ¼§…÷ AÍO¼ý¥ë•wp´o?yßM˜;oøÝ3îà{WzQR„Ý3®XÈ»s;o€®ëçŠM_LÁçÁ+˜ÆÒñ0>€ÜKZÈט²à¬1wYœ¸ÊÕnšJŸX/~½—neööV'”¾ÇO‡ÿêçݦ endstream endobj 4427 0 obj 4461 endobj 4431 0 obj [268 /XYZ 33.1199999 240.980000 0] endobj 4432 0 obj [268 /XYZ 32.1599999 242.899999 0] endobj 4433 0 obj << /Type /Annot /Subtype /Link /Rect [174.239999 751.700000 230.879999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4434 0 obj << /Type /Annot /Subtype /Link /Rect [174.239999 684.500000 228.959999 693.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_class_code_typemaps >> endobj 4435 0 obj << /Type /Annot /Subtype /Link /Rect [244.319999 209.300000 289.439999 216.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4430 0 obj << /Type /Page /Parent 2 0 R /Contents 4436 0 R /Resources 4438 0 R /Annots 4439 0 R /MediaBox [0 0 595 842] >> endobj 4438 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4439 0 obj [ 4433 0 R 4434 0 R 4435 0 R ] endobj 4436 0 obj << /Length 4437 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸ÞûWx]`ñ%Q@Q`r“è¢@]]™N‹Ádд‹þýJ–üéâ9|ØòUäÞ˜Ež÷‹oþøéïûþwÿæåÓ¿÷_æŸ/ŸvÍ¡i›éÏ~üûÃõÒ”œ~í¬9È~ü³ÿòu÷mÿm÷q÷qø÷ÛN´ÇçÃàéÓ„ÿýòÛîÍôòÝôɧ—?¿ýo/÷þ÷Ëþ¯~ü4Ï7~áëÎöíøË¯Ó/B i‡ÿ\ÿ6þk÷—ßí–`óŽÿþ ¤iT£“Öñíü¨8þ½~½¬Ù릕Öî…Ã:ÍŽÿüc÷ó0Ûy‡^ ѵºk¢gZóšÖîm'‡¹µ7«·¹Ø¹’gj­È4Ó¸&‘¸»F˜ðT|ðw¶=nÔtÉ;=M•3«e¦™Æ5‰´ÍÍÀ‡3¬VBuÒèñÆ30ÖÊá÷NÍH[ïõqë½I‡â·³ð<"áÈ «ÆïÁX•íPVéA|ßĪ¢ïô0Y#n1KÐ+Äí]ÄÅ\JG„Ÿõ™ÛeUâÁpßxñC¥aŽÅD¯ƒan™3wÏH|’øN‹&à4…†jUÒ¡–÷^.EWYï+Îi…vaé«lXcâÖ÷0"Dð:A-[Úä<Ÿ'p‰„ô½ŠÑò$ô{K#dÈUÒáãXFu|¢äbt´NÉÙå6-;´Ÿò¼_éÖ9‘ukÙóÓúä;÷¿6Ãÿê¿/ž£à`¥¯%.æU×8÷.ÝÇg¡øìãIñÃ/g„.æDøÄç©`ùE)0 äÅ”°ødioè‡ ã2â€Ë˜˜}Ę’\¿ì+…ûÄú}½@ |aäm#Nª(ε„rt¦“[Ï(¨1à¬Òwpg{Â÷(¼‚MbEò< ¦¨ñÖ{ tfÎrkDÀ<ÆD¸SqGAš‚5†\ªÊ†d*=ÛÈ–èS;чÄ4$4ƒI¯š!‚…(†ÜfëÄDÌ"±Â¢ †(øŒ½x¶ŽVˆ®@cá†×¡ƒwªj¤ƒžÅžê—AÙ&x(‚Æ<.œÅxÔòDƒõ¼8ÂÑcójì˜qpH} þh«Þ£f@ǰ;cOÈü®Âkç kÛ·‹(ÇaWØõÀA’ÊUr¿&PÂv á†W€õP¬d†Î…— !àNýn[AÀS¶]cN¦ÔÚÁN–,¾?Ë,^鯤p µê(né‚Ë„ü Jk9ž¾ƒ<…·Jv+µ½‹nôN`”Øe|ð”ÂÃ- ÕðEè̇ž×ŽNHXéË)-PÝœºˆ‚_Ü&k´0§•\F~„8ð6þȳh„Ì@»*è' —?®@¬–úÙµËÓ"X{áÚOŸ.’¾Ih+ÄêMÈW×û}‘ÒŠ3¥RcG¼E™R‹€‘¢jn‹'ïú–ÛÒìµ@ áàbO,¶ñ °ç2°ÉÈúÊëü -KtÁ#Á5>müFø|˜È‰4q ÀDFŒÑWs¦Àz_I‰´Ý©l¬zý¶.â‹eòöoz «4!‹;É­ãnÜÛXÿy%ÍF:p/Ѥð[VeÀMÈ­{êncoÉwjá¾3¥¼¦ŒƒcëþÉ)àcy,ÓÛën„3Çv.øú¤&gÑ{¥Œ+ajzšzyª²¬ÜË~ódaÐ0<@›¢»ù8^×™>Hz|¯ÛÅH»Â—F*m¯=5ƒÏ—öuÍ9$¢gíõ†—$åæ‚¶œÅ• Ù‚~ñðZJ ›4 £Tïï&´*Ø·²o¸¯Ð;#» ¸³‰çõa¯¶â6ö}§qÞIèÙçµæÍÒ¿MÀÄÇ™‚qVóZÙœØÑú¹u§{¥è?^À0¨‹óß=©LðìTh[ S„KMw‹úDƒÏ!9=ZA¨:YˆîQܲq_uA¨6Öë« ¨srã­–¨Ë¬˜#øñ3ËWÀ•mW›×PØdÀí¤í’ƒŸg®¡äÜ¥œÐønEÒ9¯c¬D>Gc4³ð‚9FB¨~2÷WÂÕq!æm.¤)7•´*˜“¦[ÞfJYÌí2ÔšàÀ£Ü½Á/'(yùO¯ÝÓ%”[W*TîšžÓ è¾ÖŠhzgí[ǯ*Qpa¸?p×)Ò¬Oß"\ŸÄ¾/$“ƒŠã­W„²Ü‘ryHà(ÍŠxKs†‰Jú2:åÐsJ€/ÏemÔLôî„>§ìm-[†æm€“œ9çÃÈ• $`ãóa`U õ7T®˜܉öt;ñ¦ÜÑ7YßRC«´€Af«6d®ŽÌ[®ê“’“lä²°ªUk!͹ÕÛ–4¹å9®)Ï1‹ç.Àƒ%x“5zU¤a B虽t¹Î£è E³.<^[Þ;b´ûÎWš&4è¼{3Ѽ 7À`‹D,Sò‹R²]Ê^ÛLñ¦2šµæh‰Ÿ²½|¡¾Å;r:1cø³Wíby²tUyÕ]Ék?;×¼àçSh1…8.!!#¸Ò;úÜ/Á!€ &ReÄp;ÃÝS=j²QÕ:0ÌäÎ „`^SîÍ÷›æµÎçhäÊÌÁ·Ë´Î'PSJø}¾P9DÅœ„ÇѲ_½p£Ö \‰Ã€'¡!Àpÿ—MVÞäåv/õMOýTO¤õ¹×áÌËåeÞ'3Zµ¨ ï+½ó•Ùõ-ºÓ™á¯Îç~½„ ˜B”þÞ£>'Üñ¦…K¯åewè­ûð‡³DÓGï~hqÎò.ûÍ?¿¹¤¿lßÚžÒ]s&”®“ÎRJ=XòŽ×hEMŒðL(Ä_c‚X¥¸1j¾FF¹%“‘Ä ›§Q¼r¸gÙâM‰1”ɺ %ŽìøšßŠïøíôI£”À†p8õÝbÎbdt Ø|9j‰ÜââédÄ|2ÍådFákãÌc«òöúƒ_wŸB¶Œt6Ó½ׇNH¨æ±¡A?öidÉ4®lU•ay%ÐrŽ·W"é9 *Ýœ¸žèòÁß]fU¿¶-Gw`În2®)1¦Å€%úV¹rÁ;1‚3‹V<‚%F‚ÊI'´ ¦´‹YîËãMËsHÈߤXr Ä0\N^JÂ¥/wëQAp ¯§ë[¡ê4‚Áñx1›*.D¡µ¥™F¤r5׬+2V`ñf h/+™”VEyß}™@È&Á‘|,yÏi”%w”€œÀÖNVVnµPD{js3Qú¥ÖYûÚ¢abNQ½ì`ñjð¯ÄˆL¸ú†}+|È}ç€hÓW(!]¤­ãÖIºŸ`ilŠ¬Ç’±ö¹…ÍÕA½RO†Ü[#Jêó‘âñHñ‰b ‰à ÏÛF:þÅw/Y£Û¬7“gnlgàŽ³4À¬š ô[´tyvo}¹¼Æ°o¡ô¯Š½UÛ>ŵè­Š+B Ú‰/ât]ÍÛÕSx†qµPùÒºÙ¼îÔÙz!Råi?«ëp³9ø6G@çÜ ‚‘X¦o§ pÒ÷®þ&twª¶,ihÛÞáò„ÞÖ>ÊÊR—øË a…²Ó³ô*Ï’lËh'qïü¨²–'ƒÊK¾Ï ªádîæ‹².Œ¯îW…5PÆ ³Ëº‚ÁxµëÊmXmÒ«´ß-™†×˜K‹*ôØ·fâëþ°ui‹Œ6vù‹¸Á"©¦ûM*ØÁætí-ËϘ a ç£_w±þî¿  íq÷ó/_Is¯šñ~ ‚=øèòíí^ Û¸yM§hÇ]îÇ’âómÛC{Û‚íõÁÚDº²;t.¯Î¤»12RÙ߬4æÐN‡î¢ù­÷XøLŸ™ri:yúþV†·p¶ é®?y¿; «;ü€ž™¥Á­ö1kV´gæ£ì}^Û‘°nü]qêð, |Áx 0îpð>€9>Á÷ôµÍ„[{pí²YI½µŒ] LÁø=ßr‹‚?dÁk›ö F­4e ¸Ž|Ìɹ÷wÿï?§Í endstream endobj 4437 0 obj 4512 endobj 4441 0 obj [269 /XYZ 33.1199999 692.179999 0] endobj 4442 0 obj [269 /XYZ 32.1599999 208.340000 0] endobj 4443 0 obj [269 /XYZ 40.7999999 112.340000 0] endobj 4444 0 obj [269 /XYZ 33.1199999 206.419999 0] endobj 4445 0 obj [269 /XYZ 32.1599999 139.220000 0] endobj 4446 0 obj [269 /XYZ 40.7999999 112.340000 0] endobj 4447 0 obj [269 /XYZ 33.1199999 137.299999 0] endobj 4448 0 obj [269 /XYZ 33.1199999 309.139999 0] endobj 4449 0 obj [269 /XYZ 32.1599999 694.099999 0] endobj 4450 0 obj [269 /XYZ 32.1599999 311.059999 0] endobj 4451 0 obj << /Type /Annot /Subtype /Link /Rect [334.560000 585.620000 372 593.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_importtype >> endobj 4452 0 obj << /Type /Annot /Subtype /Link /Rect [360.479999 543.379999 412.319999 551.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_splitproxy >> endobj 4453 0 obj << /Type /Annot /Subtype /Link /Rect [300 217.939999 356.639999 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions >> endobj 4454 0 obj << /Type /Annot /Subtype /Link /Rect [405.599999 148.819999 419.039999 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4455 0 obj << /Type /Annot /Subtype /Link /Rect [434.399999 148.819999 443.039999 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors >> endobj 4456 0 obj << /Type /Annot /Subtype /Link /Rect [402.719999 85.4599999 430.559999 93.1399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 4440 0 obj << /Type /Page /Parent 2 0 R /Contents 4457 0 R /Resources 4459 0 R /Annots 4460 0 R /MediaBox [0 0 595 842] >> endobj 4459 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 4460 0 obj [ 4451 0 R 4452 0 R 4453 0 R 4454 0 R 4455 0 R 4456 0 R ] endobj 4457 0 obj << /Length 4458 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•EêE‹~M€6CCàÍ&X¬qö¿ŸîÕÝCöG²ŠI3²ϸբ¨b±ž_ßüéó?Žÿúýøæýçÿ¿êŸï?êªîëéÏñü÷‡û¤ª9ý:¨®’ãùÏñë·Ã÷ã÷ççӿߢ¿Ü¨œ.Θüýëo‡7ÓÃÓ'ŸßÿåôÛÿŽòøçÓÿ~9þíï§?éñÎ_øvPcþå×é!…T§ÿÜÿv¾øïÃ_ÿpüí4u÷üïìeÛȨy|¿Þ*.ïoE«m=¨º= !OóìNäøï??ŸF»N£[!†¾êàQEÛÎãªAÅ ¬Q­— +z¤qH5Ò…n‘oW‹Î=T¥zýþò uzŠªO\(ÄéQ2Ý*«¶Wz6ë z*ziT×6‰F:ÏIĽܴÆx¤”K¬d—8Ýcƺ%#Tg<æS¹)oró»ãÆw_ožDÛ¨³šøòóiõ.ºfúñåÌ"Ãñ‡óîm†ã—ŸŽ?ÖuóôÇã—_cÕÍÐMÚiº"t¥þïéá=^ðÊ»”sc6Â{àhŽ{0uÞÃ+ ŽÖ¢+- Þƒ¯8Þ”qÅ1ë·p´†A7¸ ¤hý‘νxMñû4ÓÜ>~9 ‡ü[}è¼[ÝÁ²˜XIGÃdÄ ƒß§yW’ÀcëÝ«é9XÂ=$!|ÊÒ—$ð(ï„SÅ‹ÂáPU8æ–T€6P6˜%Îx²nôc¡..;¡Nø%ƇTRGÙ>œ8OFÕbœÙbz¤7F±>©'vëo[¿µ¾2_Ñì&ÚªïzÙÝ3â´ÓE]õm}¾t»"­¹œ¦ýÈ1tìuHÁ´1i‡þ7 ÇÄáKb†Û`ŽýKÈ8$‹ªø<Ñίj’ày‘“!‹õœ' mi_¿aJÙ3&-›)ÀÆÔ4ï%ð4'Ógóy%Ð1:)ÔŒ>Ú‘{ ’û¦ÁsüƒÑnª2‘W˜†=ð¤_¨US*}aEÇx}Å,p†±–Ù÷(—#Ä-(¦@ , :“e3Û“6oq 9×>'*¯ ñ»‡}&릑K”üVjî½gOa•N‰0¾á|Ý7£Á×å­GŽÆûLW1‘RØÕ»gŠœ "ëê<«o‡A ÷üzøœ­À ­Òy †ôÉ.ñ)Œg²`¤X7…»×ÙŠðfF|ãv@žª†žŽªŒ ÆrÕöWÃÃÿ8+…) y«‹»4ø“è-æI_K…)¦\„Sj ÖJ¨Y­õ! Rsý—E ½±.ŽŠ †ßëǃ¯ÌqÄHe#M~5aÀ­á›Ùu¼­ÕzË~JFøåpEhî~W„ŸC\c Ÿ#!uvAQ¸ÜÔÿQ"Ž`¿…[”Ž` ®Áû°.Í(šÁ â¾}^Çö‘£0V>¬–ÓÀ‰êZÚÛ e2â¾QþåËÄï%Q•3Y¡”±Jƒ[^h´ŸS‰¾šêÈ4û™*Y&­1JÓ oRÀ1ƒ(VVÙ½³Á“&'z_È­tÒDÕâþƒ%’&ç)<]òªº3%ob¿y®ª–ÁqæµåÕИÔÄ=¯ðlÿC×Û¾ùíØ±|×þ†ƒÞ¶ÝÌ}~’(¢< ·R%GËg?ÙûɳãÎ8Þ'MÎ3«29Òµ2XdwÒ͆MQcV2Pßô×ÅÜõ®@=ž5¦ð˜ni×'it‡ïŸ·Òؙ˛´+ɶE'†u Qމ&AÙÖ ¡L£±ÞÆz ÁTÅq‹¬@JèúOÚ¼nàÙ]Ìü|D(î‹é ¤a#ªOaþ ™:9Â>Mߥ¥š"¬Pu„3„#œÞ•ÅÎÎyñ°ŽM¸ó”¤1R”=ÁÀÄ„á%3„v"[ªï§t€ÛpI¼%rˆ‡.Ø—€‚Ç4G‰ç¡ü.W{=ecE•L™å,'Ôš^B0áÖÒÝNÊvEæÇ'd齘—RO‡â¾GKþs†oMVá”ó<¢r¹›o~¤’èŒgî[ ósøQL­ÓŽ¡achHÕ–gg¬ìèŠ5•. ZúÑ£{ZhO !_®••®+Ú‹%(ÇäJZHJè6ž.ƒís[5ËÕ×ÛK¹Ä"ú\BÕÕþs ñ¦sˆ œÇÇB‘ÀÏá 8§ÆrÐŽz|5¦—-|Ó¿)ãpdLkÉ9Ú›s0žV3¯1 :Ƚ¬ VZpMoŠ÷~SLkÆqÁŽª6Ì×Igà08¼)*ñžÃïƒgkñê-Òà¥ízŽŒq~NU(¾‚ßGKòB&†¼Nh‡$îÄ_¬ïI3Æ6ÀXJ󾮂£ 'i?ìRkº›s¯ÉœkàsNO²4Ößus\dס퉵‡˜¢œðžC¿;d¯±in[k-¢‰§'›†ÐRàýMŸ$ã`†ã)aq:Ä:ŽÄÑÐÓðÍ·ç †·žLÒÄcï³äUNÄÉ0²|oäOÙX[*0‹igRÃçµæûÁ´Np¤t7eS›²ŽÃÍd¹Íë4™•0å¬%LrίLÑö½L[“œ“®3×!`XgAĉ@?ê1HœyôÁþó;µ½˜»0GãD°e1Ò…Ó9Å_µn‘çqwmgˆà©nÑË…T\á±I˜cõ9ÛÛëV‹79²G9JE9Ö⯇”Ø5œp+Øtµ¶^­œ½L³SoEP¸C¡ˆb`ç¾›¶5³÷gE08&zÌé9œºÛ…Ž j=¹šÓZ2Å¥××O'I¸{±ãÅjøm¬ÂŠp«—R’¤qĬ l=¬Ò¶­!nmª‡—Â8´ Ö.ÕœÕv8 ö¤ìÕüÔ¼²ƒWܳ~='2xÔ;ëüæì VÓ/sÍ!Δ<Ü{h5»n2´¶Çƒ9’¢TÈiÒ ¢®úA<ã(Çé#øžY3ÕÂÒøJ~œÝh(“=Ú›†yöhïíÝ£½þþ±†—ÒžŽB\\‡AJ¸p;@ŒZ2L*{—Që>g7"æ×z§‡Zjo;ˆ«®eÓúL¿ÁÈiÏIü)ÚfF))Bñ$ÉœÒÒŒ7åé¬ß@Êìí®Ïn(›¡Ê§×}ðnbÖKÇ6#èîÐúZaätB›ÞT;; :@«íhå]¯¿ÐàÅZ5pÖ²iHÁ-„⊡·ÎÍcµÛÑ[;z‹¥0wôÖŽÞbX”¯½u·;z+¡’SGÙ>ŒHN%¡JÌÛ H”·IXŸèyö¦œ¹ÿÊh|ECµÄ0“µÑ¼ûä£5þÄç|g{é}»ò„®èVl¢©šiQLU1T£2¯4zKh•o9®÷„ªáøùO ™ŒÕÏmžuï½|nËB“Õ¹ ~kßêø ¶rdÓYÝÉY.¯¥—Æe°‚&eª Çf>Ž‹eD}Lqm“à쬦ƒa3ÌȬrL)ŸF¦r¯—iZíº¬çð³+Xg妨« ñ²bØ ‡~:ÄRÄ—hm’S“¬¬ç&9;2Å—1bß6˜ò8ÞÞ~i”PGS,ÔtÍ\ÊÙYF´¦‚`l ޹‘¨WÆà[úú“Ì…pe>;¹€o9Œþņr/àüÂË=mÀ[KÏÆ+Õ88![YåÑù„€–M‹£‰³ ­ÓÄ\ÌGªÚ²zc èÑ$5-â. P„üPưZ 9$+t>+£BX%‚¡šìô9Ÿg:YÙm7šöv~¼¡fæ±¹žÔœ§½FÞ4ÇåÌœ>-´(B;i…ZšZìBÈŽ$Ñ“¼p<”Òì$EÂ!ʬb§pv ˆÍZ1§QÝ1‰U©±6áIz‰nåvå-d—wÁšÈ«´²"„¡4/˜#l' p&iA¡ZL€=ë–┬̒yÅJ*Ê'¨>¼#½‹?ñšdŠë9Í­xuåšÀbj¦jHa ² T²Ø,9_&o»í°!Nn0ä?ÞjöŸÛ€èJ¿fÔ}ç±b@_Yƒƒ¬f/‡:NÅt5q:6ÈÌ‹ä¡P‘c6féò¹‘*d9 cûfΆ.Žó ÒXŒ ÷Ò\W©×Èîø!à•÷ð î{ŽàFß5lý̹Òd?0®«•IÝ×b¥lª¦:-ª(‚ŽÞów hjî3ÑŒÐȃŠHáT:ÖŸƒãÄAËHAIÒÏà…¦¢Jb’©á"šÕ óX–pdž@™›!eE¯&–§Ù¿ÃF7}% Íši “F qÌò[À1È‚þàýâˆg‹3}´ª‚`óö½±ª. ÈÚ[`ãÍ ½ˆÃuCNK'ôÒÕ·¥;¯Àeºê,¾úÓRÜ}ðëá³cËæÙëç)\QF.Yï7Hi ¸ðôo¬Ä A/1VÁKÒÑ2IR#Â,Õah¬›ù,j^‡!e}%¢Ãþ*î÷#‡p—"ÜqèA_!§*[Cù{¿QÔÈâu¡I²š)‹Å/ò`µÑ‰aó˜¿F~&\On¿0£„Uwò¤UÞèhùdV@ëU‚®òwoïRAhdO)d2g”$÷åÈæ¬LÎÞF­4Ä?îÇÎ*·Þ4â+m+n¯p8Ç€ˆÇ•‰èbZ›Ê Xž •£ò73'$åÌ{m“ GÏ9* E‚yÓ§ÇrÒ…ë#VT^;¢ëÁÖ4nze®R®Y’æ—I¢' øXî m¾hÀÌrìëp°6ñ¯0áü <ùðÈ «sïú@»á\ÙÊ`Ú$i]–¹x«´ÍÁñY“ƶcòˆK&…•ìLš 78r*\@FõrÞ¤ ”ÔŒ)…Ñ…TódŠt¯-]õwùίÜ(}I9^Ô»å)ÝáŒ^DKŽÒ†£æúZ3æYñ·ƒ¡MöÊ\h‡$gãù÷^Òs-8è>V‡‘”y¾¨6õë­PñYšÎ9¥¡åƒ2–£ÿ8ÞòäVŸŸyü¨ÕJt÷,¬>OÁâ@‹,·j{óÕ|•þ5<ú| ûå×°7×°îW\Óµ<Üïh}Å:.TÃcUeË A¶ÖIöQÌë›SÒêëº/-ò`Œð4}J9ŠXÅø°¹Ã´Ï¤lž¯üeGÔÏõ;¼RÏ6ÁÐW4“îoá=#ºg>˜V"éðè}„V ÍÅ&±YAU­Ö-·{êy©,úGtÅ1¾¾©cÒM?§«&ó+hn£fñÆ„ªÎ‡õ’fð=ÏÀA8·›–0ç†g¯Ü:XX¼ßÇÁU˜{;tcµ_Ÿ¦PߨQö×W»ÉPc›û$B¨Ýqjmx‹ ‡/[Z Aî  Ç#Ì{:{’ 5밽 b€•g š³` yó¢”(Q|Þ0.€ ÍÛ“½¡ u}A“œj¤ =²iŒóKÝó…+I@y ×S†¶‚’ˆIKSâl°%†£ÏÞ „)~Ôl‡Ö{twÆûˆ®Ü¼oû‰{ŠãeîbŽ™5ãý‹ÄÌNSxNÐ=g 8f‹ Ͳ¤â25I‚ËYìUQZßÉ2pѯgñ-VÜcXl Ò.Ähý¥…+:{ˆq¬IÌù…1EÀI¡sIVØ:î$o„ë[áQ¾ËÃ÷’Wé̵³õz8À‹ÁX„;/yŽ.~„æŒ%éš³‰õØz&“–§ALω`¦M…™|ç'¥hF?4ßÓ¶¦E#LjÖš š»^,¼Œ9[ææñcY6 £²=M7‹,u€1¾ íŽ[û:©€Ä[ýP_±`Œ~Ô€ä»Íò²â)Jº!÷2ÌîüíØîðêV‰m’º’¥šqD”J,vPn’¬vâá .!5ƒa¨ÒÜ€…¤¾}žœc]#ê3‹4øÈÙvbön²”sY:HqB>ý=~?Bô—wÓ?¾~#%~îrJŸœDuÞêǹöGqz‡ë!újB°5õµˆFëõUÿ¸éÔØVÑ&"‡jxl: ®L¡i*9>ŒÛt]ÕO‹`n‘GÏQðžÞ3‰ÃAV²nž÷`~G›Øòþ“ð»Ú£xð†OèÍ©®ôZØÐîÑ+Fyw=·Ëˆàºóï²³|¼‚ù@olˆ'Äñßý€G1͵’%ñƒcß'¡¹Ru_‰s"'˜ø#|» Ú§”2ðøéð݉< endstream endobj 4458 0 obj 5454 endobj 4462 0 obj [270 /XYZ 40.7999999 471.379999 0] endobj 4463 0 obj [270 /XYZ 33.1199999 397.459999 0] endobj 4464 0 obj [270 /XYZ 33.1199999 344.659999 0] endobj 4465 0 obj [270 /XYZ 32.1599999 174.740000 0] endobj 4466 0 obj [270 /XYZ 40.7999999 471.379999 0] endobj 4467 0 obj [270 /XYZ 40.7999999 785.299999 0] endobj 4468 0 obj [270 /XYZ 40.7999999 785.299999 0] endobj 4469 0 obj [270 /XYZ 32.1599999 399.379999 0] endobj 4470 0 obj [270 /XYZ 40.7999999 627.859999 0] endobj 4471 0 obj [270 /XYZ 32.1599999 346.579999 0] endobj 4472 0 obj [270 /XYZ 32.1599999 174.740000 0] endobj 4473 0 obj [270 /XYZ 40.7999999 627.859999 0] endobj 4474 0 obj << /Type /Annot /Subtype /Link /Rect [273.120000 364.819999 344.159999 372.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison >> endobj 4475 0 obj << /Type /Annot /Subtype /Link /Rect [65.7599999 356.179999 143.519999 363.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples >> endobj 4476 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 129.619999 98.4000000 137.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_overview >> endobj 4477 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 120.979999 98.4000000 128.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples >> endobj 4478 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 112.339999 143.519999 120.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig >> endobj 4479 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 103.699999 210.719999 111.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline >> endobj 4480 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 95.0600000 180 102.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs >> endobj 4481 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 86.4200000 168.480000 94.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour >> endobj 4482 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 77.7800000 159.839999 85.4600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package >> endobj 4483 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 69.1399999 135.839999 76.8199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names >> endobj 4484 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 60.4999999 144.479999 68.1799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants >> endobj 4485 0 obj << /Type /Annot /Subtype /Link /Rect [315.359999 533.779999 324.959999 541.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/1.0/operatoroverloading.html) >> >> endobj 4486 0 obj << /Type /Annot /Subtype /Link /Rect [419.039999 533.779999 428.639999 541.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.digitalmars.com/d/2.0/operatoroverloading.html) >> >> endobj 4461 0 obj << /Type /Page /Parent 2 0 R /Contents 4487 0 R /Resources 4489 0 R /Annots 4490 0 R /MediaBox [0 0 595 842] >> endobj 4489 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4490 0 obj [ 4474 0 R 4475 0 R 4476 0 R 4477 0 R 4478 0 R 4479 0 R 4480 0 R 4481 0 R 4482 0 R 4483 0 R 4484 0 R 4485 0 R 4486 0 R ] endobj 4487 0 obj << /Length 4488 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“#’¢(†~ðÁ@£ðaáƒÑëõ`1³ðxþû–RT¦D*DF0H)«jv1Ó-¥ø ãñEÄÏÿòý?/ÿýËÏŸ¾ÿÏå‡ûï§ï/͵éšéŸËø¿Ÿ–dUrú£éõUÚñŸËß_þ¸üñòíåÛðï?^DwûÐýgx9w15øùyêüezòýÓ¿ ú¿‹¼üëð·¿]þüÃþâÚðûKo»ñ¿MRÈ~øËòOãË__þýO—¿CèoíŽÿþIIÓê.oÜ?·ÿ-?…:k.mc‡Åº1þKËñ¿ÿõòסµû0®}çþÿœÒSiE#´zjÚað%»‘Ünİ9¦oÁ?'w£MSµQ¸Q§›a6åVL ÿltó-~ÜxF¹<ŒòÒ^žåÝ5êô8ôp’[¡Ùh¨ô*4UnæqÈËrTr`ƒßϸôB˜žeéý†ŽZúaö²•=ëÒçSýÖ°îvšŒ–ÝÎ#:áš<â©)Þ1ÿiñÝßʯ?Fb“‰moÓ>þòòó×þ"ìå—¿÷ØMÄþóËï/²»ü4ŠmÊ\~ùË埚F|þçË/{±Ãî2qìMcnoÚ«ÑÞiñßìôc¡oZy{#ÔÕˆ~|ûhM‚ó·7ÝU ©×oÔíÍ îwº“ËÖ<Ÿ¯·7ýµ•ÞàQK7êZnÝ,¾ùŽ›h Öà™Â£ŸðóÓsU¶Y­ù ^Òꀣvkðå—™ä%;*zG©m¦£dÚ`ÒÝD• tÓ0ýÓ°xкEn•ñ¶ì‹#%{!7HÝ\ÇAè´oäW¿ãiÛ”‘³ð¿u‹.äüqÊXý¥H¢?ÙAóELO{9hµw'Αáâ§ ¿I†ÆèN\Ý€+.ÚèÆpDétã8XŸÐX8D¸_x/Ò·-š¿òáVÇÞ`x×àˆž>ù’„ãŸ}ÀÁ§é =äñæ8­‰O qÕm·b€­ò;FòúÖý´$'7Æcå0C >à›„9e"ŽxªÏ`Çpó0Çö—^q/OX¾tÖJ9é;»SÅÇØS¢Œ/Hf]|±c›" ð:ĩà >]€9r¥…6¬M@¯wåÎELžbÓåÐÊ*~wX©½»cg4ð‚+RbºÀµCx0#‰­%¦ ?€|ƒ ï„,¸’*¨ƒV>ó={Ä áþ„Ï8G®Ú9=†Ž¸ô^À§#;PÈ#}ÿâbðŽÌï|•# ô0аiL9˜ÒÊca ÞC˜j’H¬ ª%Øêñv#„np’2‚îQûx>Ö·¸äH@,kDá©áºR3y:p󭆆¿¶ãF Ðà,cqäÊpD„Q ùÀX_æþÂ(È{aÇ‘ Òvúùÿ·Þ3†;þ 6⯒민Æß ùÁ'2pn‚Ê—[ì Sl|Ü,÷>Åø/%«¼†`ü,¢ÝÙŒ¨'’Ìw$ÖàfͰŸ†7Å‚€÷¶SÐéƒE,¥€Ox4VØrœs†3Ôm ê²X—äåÚxÌœ¤ëx÷Ž&0•¼Â`cц»/èsÈ­êÕmïmì† ˆI[o>oàÖ>¾‘øoT½q,ºà±é†Uõd /|îsÞÕÕ—Ë#ÓZŸ?<»ë uôʱ±>ï/ßôðû<ýõ›t¦ ƪ§9Vø›&@ÞëU-»Í>âG°3Sp>;c+/Ð9å¼Sï÷Pô¢ØX, çsò0̘%£ áKÅô | @àëÉðÒì`‹Ó1~k ±)âA.ƒÝ¡7ØB>AŒ ¼Qü,¢ç-++f´½ôï®W#kkåß˱<{fÕ§¯qL(*¹^9Çz¾^ x)aÁ“ÍŸš*„J\É…\äÄÀNÝxV„aÒ^Ötbq¬ +ÝKÞ—ŸÓW î‹=%ÀË 7`± Ý{Äâ fuA!Üf ñgˆ“| Z!†áøzEºG£hÔ° U0<ô2¾kåqcžžò«0æ=s]ºqoÓRb&Ný£˜ )î6!ôpV·û›»Þj"+Jc€ŽT•/srÒ±<˜l ,†ËÓ=«8)ËKºQÞ²sfXB  ÷š¾S;"…}µÓ§Ætæ 'Öx̹H§ lA@Oã6ÖçLï~à½ùé¶¢÷o‘ i¤OoÆùL }ƒƒÙã&S0߆“W¹D+hÛJƒâÚùÂ+ 7@7&H‘ ®t 1G"« Ž„"AøîÓyM(0däLJ'9IYéè…’©Të±£·ªzXÊFa¶ZøÛÄ$Â(“ä4A#b‡¶ ìPA2Ú†‡O¢ç[Aaüí¨dãÍSôD»w@c…Œ2à2oÌIŸã=GÄ|ò,+‚m T˜­R|"”ýô¼•ŽoH)g/Λœ•j½–—_kõNæŒWlIˬ•Ü·l'õ â~‡·9®sú^÷8”c™àˆJgɽS»JÃa}xò9©ÃóîŒ Ÿ—2R&åMˆ;‘Rf¡ŸO@(©Y·Æ»!HxRÄÝÝËJïû.¢d‰(e’ÚW¶Ú“BÅt ‡¿"d‡3z­,_ºŸ‹ÂÁPŸÅä•‚ Ë l0*• gq9!°÷9±’w'K¤)…ÄOÝ+½øê"Ú ½ ãñÙ÷ØÉ°mv3·ë²»wy7N4Ó?Eß4³ÙØhïÍä’þMÓßXè5q ÑÎh™Ç&"ÍuBÑÄÖ_['¿>fú |#ÁÕNV7¶IºÁ7`?ðLáÖ¼Ö”™Îwš àGð|àÕùí‚+¤¹Ñ»;·¾ùZ\ß›¸™iæìŠ<‰—‰'=ïíŽÙ%j"âI[•c´¢T»K×.kãgCÍ›2 B „¸¸AQÂ%º1Bðf@å³HÉÜqDeÃ9E&ãqœ r;¼ˆ$\E¢CC\aÐú|–¼¬öî˜s‹ ¿@FpUN öùn<¨”^£ö(oiÓ¸O(Ž«Ý¹d8¢½ài±†æîgØ ÏW ñJº»Š‘ñÐ4ÅúΚ„¾ŠÏ°¤¹Îyˆ¼;˜NH…ÞÔ•Ó• „x»)œƒt°ÔΪ• ÏHX¤!p"Ê%“å›l:ƒŽÝ±êOÍZ~#°.Që ù=n€ç4½¥ïœ¶†$“ÆSÄU‘Êf^о"eF±…§ûÙÕgphéÈÑœêa€jz©r’œŒ0,…‘y\6ˆ:‹„ËKúiQˈ7aÐBß«7v!äà"sò2«ƒß`FRM­4³iê•ÊtÏTÈ›” ^ŠÊ…it𲎛qAVOm\~¼k%3àKåñ—B|+Ò,ú ×6qHŸ$q>O9æÉ²‰ÊàëI‘îë`&bŠSª'¬cpz[^‹ ì*°šIR‚ÁŠ•OI˜“þò`I/ ¹òLZy-Hÿ:ÏýÏ¡iD^Ž\t!·Ç€¥30Ì]ŒðäÌq¤„9³Š& ê¦%\$×$g¹h–âŸïÎfÅ>'-ìÏLª†œý;÷³ÁÁ‰1ânÆÑȲÌ!ÆQS?‘šÃ‚ÈRARØ‚¥àn!”°j ‰{y‡¼X輆džƒææÒyëòÚ3ß q?¿ƒèŽÑå˜xȦÏ: âd†Àþô´Ôœߢ)o”w<³Vµ…-«š74%ïÊÛKêy¾P¡ðJÊ5pØ£ÏÝóÊ@ |õ•Aœš ÇÆïˆó†òî¤ ¼YÛc «Œ™€YËI.7ƒúau¶•»6]•v=ƒPQ%“ÐÆÛh &®ÕåÓÓšÎ'»ê]Ù•M°¢`.Q÷¦¤¡VFW´2w#©oèÄ…÷ØJUéTßgV¤;Þ‚©×Äê Xr–¨›Z(U® G'|€Þ`Ð(Ï4ã7§DáåªY2±b"Ó“$î#Ò¹¶½ÄRºÜyá4áFÓp~ó |C¨¼36°¸rð‘w…²­¿îç >€Sʪ¯ Ò!Å“^Ý©LÈ;"`”ñ~B‡ñéb<3”ý‚¤3Úç ,ºeŽˆD)ŠK ”Pì d -&ïe³ócðƒeKæd% D07 0¼=jiÇÇJnVJÉ ”µœ¿vë (7Ár „¥0XBG°ó tlÀ RQ+£U*GÙB°÷xæàò`éÍÖ¹mŽá¸°G…â!¥\‡…Ûu²òÃ5ªóHIxË  0åø‘uJeÜ8H¸H–† 4z(f |{s·³9êÎwl!_ 7Ü|§ƒ÷óŽ5FÆVü®Õ.,j±ºKƒ%>Â"?GäeáÌT…Pí”è˜Sõk£Ò&™ç[]¯DkB²ˆgLì›fÊIÐ|:”O%€³"–Ô\*ƒÅŽ&A¹«ö­ ë{3à¡R*«SN%K_”ù ÛM§ä„OµVÌ]~žåÉfúç1ðM3OÍhï´„oø…¾q5¡®“nñÍÝ=7yÚ‚»÷F9J—>nq盯øù¸Û¹»ªÛyZÎT@ý8q¹¿¶Ò_B?pkî$™«òÿî´¦¡7pk;;ïBl>¥y«è·Ÿ· ® À™_%ã›à!>ºÔI]ŠŠt±7½ü_]Dë¢ÕÃÊbRÔl‚Uu”®¸•¶œ.CBˆ?ƒ…ˆ)ƒmù‘‹V Þ©ðv>´†W+å­™}¢F¦¾­±;<Ø[ ¶¶3°5 ûŸa{pl>%4ñvA’$”¢ì. jã|EÜ&U_7†oL’‹GÕtYˆv?í5PP`t^`ï¦ùX¡Çq7ˆãSH/iNkzÿ ã(“‰pPd‹x™ËoZ´xnö—îšÎÑ]š:)(ĈB/*Ûf9ìrqe‹)àv*SÒø¨¤E"¥Ž-y¶Á¢µwZP°,þ|Ê®ÄY8‚Âá-A¤‡lJó"Õ o ãðR@0’Ãâ³H¸ Ò…¡ÐôˆK¥aDÁ¦D C‚Lª B ƒ…$¬è`¡Ð0Ø<êwu»ÉQ·qt¯“Ñn½[SÅÝã¦ë£Ì¹Nâïa ýì£WŸ@‘dfØ_’EOØì0wpÔŽ'ˆsê’äå”ya? láCU+Å]­Ò¨Ø‘8£§;?²º,i*å/+lÂ…óìD+S0Ff8ƒ½•˜ÁóºZ(FþZk;&µÝ)Z˜¸Þ'0u†‚<¢bÒ‘YÉ”/>±&áßÙD¦>–ÔvEãÁž ˉÀ?dzáÓ|À;|×€Ù¡HNuÂýD1°)Ø1 ß·ðÍExãFÆŠ÷ 彇†ù”×i¥¬$Åm~­-`9¨ÁcYò³}¡ÇcËBÎàÚL3@X:Y“â#Eã"Ù@,7ZQN"“­\>8B"‡àëZ–VÙÝ)†bi¡¥µžʉFdèÅ\ôýHìà[1':J1…º¨‹ Ã䜑0¡‘»'8Æù|MŸaÔjj7 à›pU£/¼.ä-s@û0j(ð–Áë~Á¦lãŸ0ã8 3­'Í \!¶ò™@©Ç[èUóæ,ô˜ZTÓM<¡:‹¾˜‘Ή’ ™"ãb`,†ë£«ÆïRâöD”®-ŒŽ‡`ö|0n˜jåƒ;íÝ;>ŽóÚï8Ü? V<áNÖ1Dn± û]|+Ž^)bË…¢J’Ì“e«_•‰EKÿ–t—¥K–Ç"F¸e ²,lØ,º›ÍB©Ùf1ÿ½½ö}séÌø#D?=í.]7'ÔŸŸüxéôU+û^ÜÕ®Zi—} ¿w—ãgÿkô!Æo¼‘ ¿²«Vìº__>þ)¬ièô uÏŽwa.d6$©Ü9Ý"dá‹o>Ä5ØÂöÑ{ >”¾÷…ñw a­|JÄõaùìÓ¡ÿ”úÚ(Kq,mÉ€¸^YM‹€2˜3ðÖänuÀ XJ–r?qr–Ä ç ƒOÀ› 9¬£-=ÕSE W^{Jd‚êÄkí+QÖ¯ž­™ ‘¡“ÆÍÓå/+´w¹ð (`ö°)Ä•E°“–EÖâ=±²3{yÞ(‡§B€SL'ÕÝ<Ž´‘Õ"Ïž;ÛSN"´óg{BÀ…`Ò"•+-«V#vø|…ëŽ ‚™ŒÇlêhRe ˜£XÄóBJ°‹° œ®b:k± öAƒéšÆNDcºZ¶3‹× åM‰ ÅdhÓ¥Kl³dçe½úaq,5ê’R–±Ê»CX¦¢Ùj“HYÝ* µU¦ˆR@«[px¢ê^Š3…ƒÌʤi d—îþÈ©Zìi°Æ°Ô^L0šp$Ð íH„Ä Ï_ N­ØúG!'X58P, ð³")Á)õ“Kç†`‘€ v$–ê“qMx‘A1§4½°WæA‹z³†õý´È6>ìÇ6!´ÈÞÁDs+í²;´¨ï¶ E½öûžТñWvÕŠ]÷QZdï[0°"€úøÐ¢{˜R¨ðƒoB|ÒgžüÈà.  ;¸å8ðJG@¬ñv.ÔMÅ“CÝ$n§N¯=@2âsø0~-‚hV;J#Ë4“žž„Gƒ„Ãs?€³€¿™ó÷Ô½6.Ào*@}\½Ï=Xe‡hXhªŽ€"1O’–° :Õ‰WUýʱ­"\‡q·‹çˆây’z IÚ¥åžN7Èœ1n®¼[[ÿ¢á Q*‹yÂ=ä±€ãSïÙ&_eä@y«òðÿô+qÕÀ%D@#ÂÓô*Š QÜ”, ¬ÂËE”Dá韧JA*9vË·’¿âj‚ßð‚ËˈUgv$^„ñ:½2ŒN¸ÿAÄFšy‰EãZ…LÓ 3'>î 1%hýºdqEí\\*”s]'dª‘M΋ ô<¶”S W¼b‘ý`îžÎÚ*y){NÁ¹ÁˆIL¹³ô‰’öíüA t6ykB@Ô9r«ñÖ1bµ÷²?(÷%o}Õ |X“Kå×vw¯*Ìó‹¸Ëž›ÞLŒutÆÃ“-Q/¦rDE7+ˆ…#ì4A ‰ï‹ûoì=¡½=˜G«-š`Ox|ºp@-IöBèËÎå=]Z5R”“DÔÃâ4óæD „å±emk­XA+[+7 •­m=ØãøÄ‡VÞ~Õ®Zi—}ÌÐÊÖ6Ðʶ·~ÃZyû•]µb×}TV޼§p¥1­µ_ªóKdÇá²m)èK¤r§¿8¶2ø…‹$Íü‘º·<SÊÖÛî€(°ZßßB0Û¢R! å•—íJÜ»CôV±ñ9|%å‘Lz'(:Ed‰§ÅÊG–©J‘ÍÒëÔî’ •ñ(ÔàŽ‘¤³L X™ S Á©bupRì39´,KÎ’/î`ɤoÊzNŽÕ”ûAx•ƒ *å½€R×”÷‰iÑâ'ÄsµlÙ0ób‘^r 'ä&E1£¸Ÿ1\“w9‹5 €¯,9ÉØ¢†µ\G k¹5¬•5<>ñM[·_µ«VÚe³iKË­¨a-ý¨áñ‰oÚºýÊ®Z±ë>ª˜¶´ò¬ï[É„§uFl@" HAE ¬bÅÓš­¼urÆØŸØN²$R:\JŽäs,ñ£Jì QesQ Ô\Dr6„²ŽfªxÖN˜l8òÕ„›”n5ª›¸¤¨Ôç0…Î G®ãÍ:0úÚw]$0%¸±O^cp ûN®¼¨y?ž¤þ¹su¾.î˜ØÎ[åDÉSà ¬1Óñ žJ»Q¢ ‘½èIÑÂÖ»1^k)Ûó„º0ºk*˜™t|d e8®”u$• w{ºT¥šnmÃAØ1pHÓû‡!@Êt9aϪ '+a¡D0µ|,qÉñºÜJ‹ñ¾.ÇE(ˆQâráóR6¯OÎ ÔPgà3Wc7e‚¡oo²£1P«56sZ ÙÎ::Üá b|ŒÉ1—!ˆ/àà‚yÀ#Èw€5:º¾qùïâæº0bévèzu1ÍÒ91>ùñÒÙ¥ c|ÖõËVæ¿5³dú»±Îu±úz¸y½>†'?^¼‘Œ¿RËVÖóp嚈`MDÙ „=a@»^Ï7)hÄg æ !äø“6V@¤Ò·ÓwŽTDk–~{ùžI„¶_¡µDháÈøÄ'Âñ™#3×Êü·~M„Öl¡í|"´]H„ã¯Ô²•õ<Ž%BÓ¨ùΜ.› ‰JǬ•ΟݣˆÐ4íšçÙDhD·"B#ÌŽ›½&BaC" «_¶2ÿ­[¡zƒhƒ>Ú€o¿RËVÖó8˜¥˜IÍÑOJö²@8*+•աºûZ‡;}Rº3"Ûfù`<}»gL´úö{õ8¾î¾Ñ*GÜÓS3<‘îÌO~  wP¿jÖÍ4ËnÆ/Üu;"~2èFÞ>Zfü•^7£×ÝüêqŸ'M¸ *£1#qŸž) ÄÎ'Ôö aËÓ«ˆï`’Ù;Xrñ!jJ—AÕÃÂ) ‚à†–jˆ³‘ÆGog-E¹+Ò=Hæ;Zz|G«-¾£µÏ´ùÎíWͺ™fÙ̓ïh±ÅwttÓ„|çö+½nF¯»9”ïhç;¯+üiG.8[øÓcЭÅ5VR’Ÿµžµ>%ÌòA¾(oÖF c¶ŒÆøFñI ʛ٨1·2ÿmmÔ0Ý–QÃt¾Qc|ˆòÝlÔ˜[YÏã`QÞÌF 8Ž5'Z ãæLêv´¯?E4©\)ãÀ@OzU˜Îbf½^Z¹|,;ô½';ôvKv°Â¿Ô­e‡Û¯šu3Ͳ›‡ìЛ-Ù¡ïünú.”n¿Òëfôº›Ce;Û¨:KH¤ OÉŽÄÅò”O€KŸ@á›’òP&†ùÒµ³.^>H= }Ó­OÃ@s§¡o¬G¦ãÿ4L¿jÖÍ4Ënî§¡oôÆiè›6è¦ NÃô+½nF¯»9ò4ôB0œ†"„Å ç ·ÄLr²]>H&9éz¹e4ê¥o4Ÿ$'ïF£G3Ͳ›ÉÉ-£Q/}£Ñø$ 9y7=šÑën%9I0åØTX@#ËŽŠ¥_5k²UË#ý~{ùvùcØŽ›ë·¹¸ÿüø=IiÂ>¿íºÎw?ûÜ™`öÔÆŠî:U TÍ=Øtâ ]wí¶‘þÃͽÒ\Í6ÞÛl¼™D?¥®Òwˆ;a^_»iÃýíÞê§¿±à7“°käU6à#ØÚt¤[¿u𯯠¿Bß8­hë€æáŽî·c˜¹»±ÝNPÕ–ZÌV$Wµr«?ð LÞ9 ¸otðRs?YçöRO!žH0íÀ»½Ó> endobj 4499 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 137.759999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes >> endobj 4500 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 760.340000 235.680000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4501 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 751.700000 202.079999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance >> endobj 4502 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 146.399999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates >> endobj 4503 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 164.639999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes >> endobj 4504 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 725.779999 197.279999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code >> endobj 4505 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 717.139999 207.839999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable >> endobj 4506 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 708.500000 219.359999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 4507 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 699.860000 214.560000 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 4508 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 691.220000 193.439999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods >> endobj 4509 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 682.580000 211.680000 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 4510 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 673.940000 285.600000 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer >> endobj 4511 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 665.300000 246.239999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4512 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 656.659999 214.560000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 4513 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 648.019999 157.919999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments >> endobj 4514 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 639.379999 184.799999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code >> endobj 4515 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 630.740000 143.519999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps >> endobj 4516 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 493.459999 93.5999999 501.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 4517 0 obj << /Type /Annot /Subtype /Link /Rect [108.960000 493.459999 177.120000 501.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 4518 0 obj << /Type /Annot /Subtype /Link /Rect [375.839999 604.820000 408.479999 612.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://golang.org/) >> >> endobj 4519 0 obj << /Type /Annot /Subtype /Link /Rect [262.560000 560.659999 300.959999 568.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/cgo/) >> >> endobj 4520 0 obj << /Type /Annot /Subtype /Link /Rect [299.039999 535.700000 346.079999 543.379999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/install) >> >> endobj 4521 0 obj << /Type /Annot /Subtype /Link /Rect [429.599999 535.700000 450.719999 543.379999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/go/) >> >> endobj 4522 0 obj << /Type /Annot /Subtype /Link /Rect [59.0399999 527.060000 106.079999 534.740000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/install/gccgo) >> >> endobj 4523 0 obj << /Type /Annot /Subtype /Link /Rect [168.479999 449.299999 223.199999 456.979999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/tree/master/Examples/go) >> >> endobj 4524 0 obj << /Type /Annot /Subtype /Link /Rect [164.639999 388.819999 185.759999 396.499999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/cmd/go/) >> >> endobj 4491 0 obj << /Type /Page /Parent 2 0 R /Contents 4525 0 R /Resources 4527 0 R /Annots 4528 0 R /MediaBox [0 0 595 842] >> endobj 4527 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4528 0 obj [ 4498 0 R 4499 0 R 4500 0 R 4501 0 R 4502 0 R 4503 0 R 4504 0 R 4505 0 R 4506 0 R 4507 0 R 4508 0 R 4509 0 R 4510 0 R 4511 0 R 4512 0 R 4513 0 R 4514 0 R 4515 0 R 4516 0 R 4517 0 R 4518 0 R 4519 0 R 4520 0 R 4521 0 R 4522 0 R 4523 0 R 4524 0 R ] endobj 4525 0 obj << /Length 4526 0 R /Filter /FlateDecode >> stream xœíÉŠÝÊuß_q×_×,„€»íd06d²~yy<âGœ,òûÑ|¥::R4ܾm°Û%©Æ3Oõþ_þ~ùç/ï_¾üûò­û÷åË»2ÃÚŸKýçݸA”W)Ú_‹R_…­.ß¾?ý¸üxúüô¹úûÇ7͇Ý?ÕÃ~ˆ¶Ãÿ~ûíé};øSÛòååÏÕoÿ»ˆËŸªÿýzùëߪ~êú«_øþTZSÿò¯ö.¸(«ÿŒ«þòô—ß]~«¦P6ýÖ¿“¢4¦,£æñcø”7ÆŸbƒ±‹â¬”æÂ¹¨æ©«íøÏ?ž~®W5A1ž ¸¨ œ$ü°¬'i4¯zýôè½pÎÙLGñëd·uŠnýHâ2WT‡ÿeŸíã¼(“lŸÛQ¾í«F²—ñ¸v¿í‹‡¾¹CȲw¶®¬¶Îöcî²o¾òªŸÛvÿK¾‡×jªíú»7L STÄ›©™N9Œ®˜éÃaÐalõ¼0ª`ÞÜ­uŸeÉ.¶0—„Ãà´'Û‘Õ:MGõŒxÔʪÍ.{ ÝwÁŠ¢]¤e‘˼uÛ‘¨€1IGõŒxÜÒº_è*xë¥lá«ê;v¡}WÑ;¦OÓQ=#·´~ëAW8S¹Qx…o®t#H+}­ å÷[ƒ¹6ˆ¥dýoÑ2—R•U‹¨_­u”®å[õ¿V´A”åí-6톇©¿èTýáÅí@‚adóÑt2õ[zÚžó‹Ãû8à}|¢–ˆÛÎüXøðùëÓûW[«`_®Õ/¼kÿùZí 6—wõ,tõߟ.¿¯–ðü‡Ë×_+¦|ÕÊ”…n^lŸ˜æIykxiÔÐ ‹¦Á^ £Ðlômá|Ë™ÛÀÛqÅUÉB³ñ·¢yR\™uŸ|jžèJ-ùd<Ž£ÚI÷ÃŒžhô X¹»V6 Ÿ¾V°};©9®6¼ÙoÞÁ°0vÜP @^H`¤ƒFÍ!AE‰è¬Z4o±i7l<Ì Œ˜CÃÁ0"Aó–žv£§Ã슦L€ìcû-»š‚O¾å` àÚ–¹Š¦/¿'k½ùƒ©±=˜ŠrÜà+§Ït-¸hzª4M]ý©XÂóæ'^¯¦9ñÒÜlj»Sâ--ãª×8(0Ø”ðŠ×µÝ§¶°'€}à«PîBì?“ŽŸ¬£TAeÑ¡”’rÜ¥l±?JÙJ­¼K”b0˜0!ˆ0 â*Â0ˆIôUAƒhËzy\9nð•e,/¦²ŒååŒ,ckÛùDȨ[\Y¦}‹M»aãaYÆr3#ËX®ÝaªW–ißÒÓnôt˜=e+D Þ }UåÖ¥â!¸ŒËïÉÄ+záZ4ìÐà ÑÒQQ­œSQ­tUÔº@´TÔ[7l<Ì ¢åœŠj¥«¢Ö-¢å ¢ÞºÑÓav…h•BEe¯è·8½Åi4r8yÅØ_Ì:"ÃL‡~jPŽK=nˆ‘¬æ‘t¯gâ銱 o ‚»pzþ &Ÿ»åTB¾³ô ìÇ?8@ªè¢{ýVj1nHiæúmm ¦›æPPŸrÀ<ÅSSbaès w€uusüÑ¢èrY¨qC´( £ZµJ˼m¾s¬,Üb Žsc¸¥X_VÅ,Œ2Ód£m£?ÙA%¶vÜ@¼¢Ž»#¯€¥§v “§y™Â`¡À€[0é^äO³¤:œµ‚I‡Ø1Ñ9BãÕºØå+à·èQO¯_ËÒŽ ‡@é¡–œ<& ¨B€ ˆs:”½’)+ÇÐÕþJf5‰Á™ÙMy--3ËÌ@ Î=÷smù“è…™­3@½†»…w²¿8£âÍåT å–rÜÔõþZ.g¦×rìöÄ­4'v{z±¢˜ˆâ€ᅈ fpÀ2=nèûéµh ¨†°õ8% 8sþìÒH”‘„ðxU ½HaˆüŒv/4ºŒ5Ýeühûþ¤¥qÁ/’ûÛVê€ÆUÙJs™MØ!>C—Œ-À+ànƒx¡« úeŒÿ ïpŠ^öÖ%Ô¸!#E¯r }[IÙƒÞL÷¢š³Ös›³âË®¿_vmÃ…¾ìÚ05u27-Ž/»{‹M»aãaz_víA¾ìÚCã S·8¾ìî-=íFO‡ÙÑ—]›)úãÄýѸõ0, ,°<áˆé/ÚÅP"@*‚l}¸\ [.ŒC0f‚MÂeYWk€{O$[§zmßè•@1iÈG$ë¦Ð¢A–6‰¬:˜œ]«uérn×È)çÓРêg&4¨ú)]rÊAhP÷›vÃÆÃ ä”ó™Ð êG‚a@hP÷–žv£§ÃìJNÅ€Q¸;èU¸•@œÿ··®Q,I¶ A‘¤EìT0Dì|ÜàR:X!gÒYªVã‚«é,Ý[lÚ sà 9“ÎRµr0 HgéÞÒÓnôt˜]±BaFÅŠ vÉ%žŸÇ@š%¥+klɺ†¶EüS·Ò:B´4¼ò؆1‡·Z¹Uµ¼mÞbÓnØx˜Þj6‡·ÊºÃT-oÕ Q‡nôt˜]ñV'IJÊ"u&àÈÜE÷¨P|Üàk2[=%F±å6‡$ø`7Acä¡©'G„<”>€ñ(gb"#%‰Â)c€êHðÞQN·‘wLX÷ýßžà™E(Pí†VT²è¨]ÈdÑW¡À¹®…bÏ`JÅÃ+#¬Ð×cþ%àE ç#Åá/Í-l´ÿÔ‚¼žy2ôW! ûdàSé™I½USnBq|Ž}#;@+ þTlX€¡ë_€ÖbÀ_† èïÜ'Ðø…N¼¬Ž[ËÇEçs¹!˺v•éè· PDßà¢õßÞkX…•ã†=„ßz ½ÈòœŠh–—jæô$ÞÎaÈ¢â£Y¸ç1niÕÜæù¼bWdçµ-¯ ;Ë‚;?»ÕÈ·^°'°.;dídý –›Ku*d)RŠ¡&D5do5‚”"„_N>b•¿æš8:%óQ@µëQ^!;_ÁÊ·ú’V³²I¬ËýþÐAI}ý€öš4]STs’ãÒŠÉ뢤*­ËÒpÚD7áEeòjóoäàÕÖ7ì!dÖSp'E0õzˆ6Å"fz€Þ…åUfDn£Kw³ i‘ëî.¡ÞªÌ£ÿ¡†0º¨@–S;A&Ž8ÙÍd7–›Ãsê¸H ó¸é*Âx§ä¼t°”Û’ÆX™Ù®¯3n Z‹†Ê !H‘àšL˜”q'9WÎVâÔ;FH¸3"z”’=^ùG{9[),!9ÈÌ=O4ŠŸd6â5ºªûôŒ4*k V”ñCHSRI…e_XPu£€Ú/J£»DÀ \²°`ã1&(©‰»Qág–àŸMB]Ó*UëL)¥q,Žã)ðH"sg‰w€v7°Ÿ ‡9’Æh%<ÿ]LÉÚ(÷tÉdsÝN[Ò Ò'é6â¹oÈ—ÄU4]ÅÕ˜´¶!–“bÕ ;Í<Žkz:ߟŒîqmmV7€ ­[‹<¼èICÿBt$•à&@Û>z“%2‰yj¦ÖWå:4' †`¨AÂÆÖ½lkxܽ,ùÞˆ^OÁÙ½„Ö ØÃè:P¼]•†,¾o`ž)ÖŽ'!Y½8¬ˆ¢‚¤Œ=8”®“×Nê-†äàæ‚™¡aêZOazÒN7ÔÚD±Íúç}åQÕ H)Åt•²vu”‡gëô Ü;žÇo~Ææ­•á°J8—‡ÆiæÒ8JÐdÒLÒZG«W›Å)Q1·×m&ºWlLæ ç3Œ±T¼×R’äÒ­¸o/b„•8=Á·¬t þ¹e‚ÿÝnA%Ì2ÚÌ`”1Øþy[zÐÛ5ÿ Àåá e™}HÊS„õÀZLôß.ÚIã†]¢ª)8P‘ìïÜ”÷ð[ ,„è³?ŒªÏpn}â“í…{"˜ìªY†!X’Ò)+%æ)ƒ´YMQey?dPMQø¨)Ú½2jùä~Ôø¸›î{µes7ÄéÞ•W©¦’I·‹¤Z¢…Èo$×ROwhN´òwa' KŠ,n€8Ι)«¬?|òÇ¡o.ýh3‹`¿iêóã8žò¶¯< 'Й™ÂöR¸tÁv Ö·{&VˆðIðÞ„ HGbvrº~%Ѓ¶fJ1Wÿ|pa+»®áE?dˆ]wæ`×íö¥èðöj7⌅– —Ò¥Hw¢³YÑÄb(¥ö$1^¥ˆ÷|»÷Ãet†à͇³$HPÚ&4{ý¶ãLyȧ¹8X3é°‹ƒóûh´Î<ã™Ø'úöˆ:Ø™¡µÌڟЄ¤]Ca$Ežý[v‹¯º/™êÜœ0ûžœú”3 ·{™„ïÝWÂ"aþ§µ¾”e0…iÿ!¥òðóñ¯ìˆÅKé×QkW?,'YM°M§¬Q¢…‹Ñ‡»3Ïå¹gð£Ç¸tÁŽgŒ’Xr›¥ `gªËˆŠFkg§¢j…ã@bŒ áÙtYî>®Ë[6] …œ!•‚»ù°:ÞBb»‘ó*$Ö¸y…·<Õý Ax¾BÙÖ %P¦¤ž;Ý7§Šß]Õ‘ÏjY(Àx”ªÏ¦ß0Ú¦:הּ…h÷J-xT=ö‰_LZK`›[HB´ž …;‘·ºèéÍgF¹l ÂçËTóÅ$~S—ÍZ„ŠÍÈÏî™ðÜû[0áÎÀPÒXÿÃUþÝýf”¨83ß©qut£J¸‚Ü,ÿ`ÀãT8bì_i†!WùðøsëWwAI(DÈÇô ïu/nbAnÕ?g2›ëR¥ŒÖSeyou•¸ß /¡Œ—CÆKNX¡ƒŠ^$õQf±ª“fÀq/)~>xééè‰>Á!?m´IÛ@¹1Pþ(;žZx²e_Ù%¦nËq´ ³™.øÔ"¼L1–©$—²y¸ÃA–wŠê® [Bˆ˜Ûǘ•8÷ K°×¾d©“æD¼{ÿl9ëÉÖ·x)GQ•Ü¡àGFp‚“§2UÞû·JELôCFåßåIå9SP8…v¬ó‚,×ÔîÑ$Xé€ÜÙ"šDëQ­à0M>Vœ1¸9{Cb ýK ¥áá Íy›’5.˜ÌSˆU*“4Ä8ð<¼h‰½H’´¾‹ÝUˆÍ ëŒœ¥Â|ÀU y¯òŠ _Ѭ Ê?Ž©{_ýIH+JS‰€`!¡Gò{ä{äÌåÍZ”™;ìf·tá;Å:øñ—սРýÀùaÚ,QtJÁÈú6P‰åPDåw‘˜J-™R½¶©¢sîDî*ψ²pñÌ7ö¶¡¦`§¸; ŠÖlí€mŒÉø:`Â+0ºü0€,†’Æ]RëÆ4ï²ó‡‰²Œboû\ï˜3ö܇‡„xÚ¿xM²ûeÉÌ•Í5‰~Çб˹'#+øç”Ôðòùéÿ™‹ endstream endobj 4526 0 obj 6117 endobj 4530 0 obj [272 /XYZ 40.7999999 685.459999 0] endobj 4531 0 obj [272 /XYZ 40.7999999 148.819999 0] endobj 4532 0 obj [272 /XYZ 40.7999999 194.899999 0] endobj 4533 0 obj [272 /XYZ 40.7999999 685.459999 0] endobj 4534 0 obj [272 /XYZ 33.1199999 244.819999 0] endobj 4535 0 obj [272 /XYZ 40.7999999 410.899999 0] endobj 4536 0 obj [272 /XYZ 32.1599999 246.740000 0] endobj 4537 0 obj [272 /XYZ 40.7999999 410.899999 0] endobj 4538 0 obj [272 /XYZ 40.7999999 194.899999 0] endobj 4539 0 obj [272 /XYZ 40.7999999 148.819999 0] endobj 4540 0 obj << /Type /Annot /Subtype /Link /Rect [114.719999 70.0999999 189.599999 77.7799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 4529 0 obj << /Type /Page /Parent 2 0 R /Contents 4541 0 R /Resources 4543 0 R /Annots 4544 0 R /MediaBox [0 0 595 842] >> endobj 4543 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4544 0 obj [ 4540 0 R ] endobj 4541 0 obj << /Length 4542 0 R /Filter /FlateDecode >> stream xœí]ɯÜð¨·qš¤Úõi"i,ðnÁç ¦$pŸíÌxt‚¶»Ï5Ø2ßÈks¼ÎžzVæ.ïy´–,<š²ÃµÄ÷æi!ÌG7ø™¾ņv» Å¶â ØŠ=ômßnë³ݹ¯*¡úàVuÖÍjïózd8¶×Y˜G?Û”âÄfEËpâa881“†ì¡K˜–a® [TtwjáŠo067ÆŸàÀg^³ù†¢H‰ýŒ:?”ìáƒÏ) Éç“S„}ª0zvÖ¿@\UÀ3UådA#úCÄÈÊê¬. òi# Kd$Û‰ŒºnæuÒõôç6Ìl™& «®ÉðÌM09Ï à{¦McSÛ´²Y"0§·iqÛJóÁôž®RC}î쎹L$.êêò—ÀúJKÑw÷Ï6ºÐbESÉiÐK\ø üxÝ Q Uuö3ðºMÄ/šªréX,´Ü˜¥Ý›a½ +*>ƒ--¸nðŠ‚ïñì¸nê#Do0…Q‚ÛSp<ë– Ù£ë ÓhÅ56a>æ=9ro ‰®ª6Ø›õ1Ûà–¥g¦}Ð6¡-}õ³Yd%'ê¤toøŒ®ôôMÚD^øÕÖêÕ‘óbZà‘ØƒöûÜî 0üt©%emœìÎÀ=ñŒÈ™§3D˜í!ʤ,ç50:†-õ¶2lid³fùl}n©û‰‘Q5º=Oè¦cLc”Uo¸e àîÝ%p( $\wïjû˜.˜šJkhÓàõ1Ò7#»û™Á-tÏo¼˜Éw×$O ÒËc›—ÞÅ8n!ºià×ü"Ò…WƒÉ£Àºx¼„öèÓ ´£è}ýž«²‚Ñ`,¬‚gY#„*bÛpî<á/d~ñXú vž5 Tm³'Ä™qì:ð8ç5Ö`’EÐýZâ"fC€ÉfmÁsœá¡ÞfhLFsÀ%2ÕQÝ]‡bP"„E<5¹»›¬æ¦xUígÃdŠÆ)•ý:G­Ûžî±lj ]/çXmRPO„½Ÿ€z=‡÷/&ìyoB@%¿XIѦHý`>`b”)ñ¬…°pt@N°T.ëSVöÙÌ«Z²ŽÝùF’¿øu V{+<^2j[àŽ…m2j•#üÃJaùdŒ¶Ö0Ãê&ìppµj ?v”W[PJ'ÞØ3Æðp´ø¨üø^žÊàFa$ÿÃXV0«„]Ê,Y6¦p!Ø,E“¥$«åÍŸ' ­A¦QXe"˜ïyøZ9ƒó–™‘xüâI˜\“ÛŒrnÅè×€öÉv•À«J©É[Á(éôûŽ*Ziå)¹Ã…#‡K¥â¯˜Ç(šÞ–l$ElÉãyRgï=LDØ©ÖV¯6 =t&ßúnœ<¹>¯NnQò">vÂíաެÉᙄP JóZù†\ V~¶˜“}›ã³ædŠÎá ùd%/./>"œaaõ¥Ø ¹oj¨-f€ÁgÀË6ö¥êŸ£aä-‘Xàík{›ã0…_Q‚°aÙ½E3Ršbšb½×ÖÊ!ÍI!ô?€…ó¯ÆPÏbÄûŠÓxHÁ©áZYl—)R¼ûðì¼v#g:10nS ëô¬Í*^|XEö´«£Pšémò\ËA´zíäÒTQLÔõbXÍQÏ“ýŸkC*¤‘­üoH»äU±Y=%J Qidµš_M9:96Kåbv¯f9¯aƒq*!Î:­AgÓ°¥Âb ì+ ¤¬˜[za{9z,‰~®OÈ'#‰xHž¬…­CÈ™¼>Àë•6‡3 eP6Ç>ðñùƒp0"Ƈ ñ)$a£ŒTú‘7‘S v þ3:Šá‹Ù%§É'C º ߎ·ýà^ Ò%D!ápvú–,ð«aÖ_“ü'hx… -_ÁL¶½EC»È›J¯zdVùz=œÓà ×GDŽÌªˆÑ…Jƒ€÷9™;MTmºPr'ÃB…% < Àt$aëQ©æl½ý,!L—é&‚8«{ö_el«ÕxÖa\ÆÕa\M§¿•µuú·l\ÕðØZ¨Á»Ÿ$»²×ÉÖæºslrN¾‹9[3¡|’,¹òµg}#£ù“ä£ó¡éƒ‡<‡°æÉ/at#x£â„.A¬ebìnÆü+µ9ÆNØ1v» ¢åÌx’yÀ³w$S0g=K©‰|áxH†å¼¯iôµÒÄ5>´žþØS\j™I k2<ãÁ¾gÚ ¡gÛìÖb2+mø°Í±E]MÖ\Ô3Á ÚDžµ•ÉfzÏgplðL#÷9e´&QaáÍp e½ày˜\Î3{² E¡Ì™’¶.Z¨Å36vØTOvèg“§ˆAŽ‹ãóÖÈÁß°ðÉ™µkû; ïš$¤Õ$¥µ#R:(•„Zèy9çT(!Þ7@AIÙl Ñ­’¥uoI ¦‹` ˆ3OQäS "Ø:DݰBׄèið²êϹx-×fªÇsG6°ù-A[3h˜sÊ+[õÙ ´Z¶Ô/¡t&a¿„Ò56©o†PøÅC_Û§£Õ,·xE¬t©¤"v^µÝùG'D?}*Om;ÌŸüxk›JˆAö½¸~K?ô¢ïß1~ßü¿??v²žn;ûã'ã3#9kxèex|Ç_ÞÞÿÀ†ÁM<µÓóŽMä-te ˜à­%ZýµÀ¥ ÄŒæ ÌªƒZ\Ð(2»¥Çõåá`ˆ‹>Ê”6H;7%#î1aBÎYJ^e¹ Åõ>†MF„`(T/;%ó¯ìñgT‡!,ÖíI- TÌõ´r!R²_„oì(†ygÊ.böt“ÁäuÕvâQC›Ãø ¸åUNY–ë±0zX‰@#Îd£NY"‰WßðÔäê ˜»ÉBIÓ¬1ÓŠ’ Zs$v£â‹ðÞ˜x§Ü…‚Ps'ƒ *…ç™Tô×ߤ¸þ™|‹±»YQüÞâh{ •8wl©êæ¶Tu»[ªº· Åó'6lyù–~èEß¿c†-U­`KU+çÊ-/ßzßÁ[*q݆ ÖÚV‚¸ !Ç>¿B9)üäØÊ8ÅÂÕ‚;ĆmÞ`¯‡L±žTuK’Œp;aŽŽ‘y OZÒFtÓá‰eüÛ«Þör¸Áa>¯d>s†£ÇÆ’x6ÈŽG T#àZ†­S®ÕŒWº²šÌzÚŽ_ HB‹GHBË%HBk.?q ‰ó·ôC/úþWHB×K„ìwŒŸ8„º‚s/Ãã; @×âð‡9ì1‡ÃXè.]Ü»`M¹“Pq&KK½ÁB6æ¶yJ¥ 0€½Yt~˜æŒñŒ¡M&NtA KFdÉùMªäà0sE„Ý!b,RÎs8ÁHÉ{«KŠ£™‡•=»|ãµ+v. âÍ$R&rÖK¾=†ïF*1°–WC´tc›)›9Òí=·תe¯J<Û†­&¬$|¨³%JI̯A¡{M’㞀pB®Cx)×!ØE‹t¦•–@Íyø!sVOºv8LzN”­ø0Ùíö§ö rjîÝ`«î‡ëqõ¿Ô0»¼ ]ÅŠ±Ø²0†,ÁFÛªìã«áÕhk_÷VÃK ʦLñŒ{+u½·ð»¾MzPµMÑ›©é¶¬Rµ½µ‚eo™{éw¥/Öy2ÇÆ«.‚O¹Ïm9lƒbi® cZöqqZ qqZ +fíü‰wù–~èEß¿cދӲ[ˆ‹Ó²µß1~bÇÅ]¾5<ô2<¾ƒ?.N+5oÝžââ7û¦¤Ý ]I ]Û«&…ñ%!.;’¦?€Ââ…‚ „Ç™»ªo¢b”IF¨k°.M¹ ÛMñ 'œ’ë2øHºÖáãÙA<"Õׇ«T×Vlú »"·tGù\O,³@pçX¨D‡†Àµ¦Á«rì€E´ [µ9êf¯u=a¨˜¸•ø{"’´ØÄ³«:äó ö'©USŠæk4„Ñù¥½,÷ŸLëÒÞ.œ¯ öW¦Ý,ᯚƒÝUC¯-ýÝy®ª”õ]s‡àÙxÑœ~¡Û­Ùù¥!8£mÀH§ÛÙ9åj0Ê s\R‹™‡ÉßYXcSäf¡{øÃÆÇ‰ÙÖÜân{ uï»næÀ…5†[à5Üké™/ÜbÔD,4ZY統ñ‡Yr <¨="\ä²ö§‘Ü>¡¨ÀÝç¸G ¢ŒN `Ð)@0p‚9k4OÈ[Êm‹$뎦AÊPÉJÁ ñ³œ¡Õ–DØ`©ºµêT™`ž˜Sã±§áä¸N6BÀñ }”¬Ê É… øEDidI§$ÁÎ6Bø³\áƒp"ÀÌœR©´ñÒ*âP%Ä•I9ãÄBÅ` ”ÛHu\ìÌ,f-ZŠˆeB ´^SÀòl¸€°”‡÷¡Go®,%)1²tåݰS†àé%)y÷2‡RÆsë椗ªl°92“9#¾ŽE‰È“Ô–)0¥NAéjÊ ^¢œN’Q¯ZÊY™RVÚúúÊOFP]ƺÀΖZæ£Ô5V‹ñž žÀgèCDBÏòõÖòŽïMÜ- œ5„°ÔÛDg}¥m¿èìã¬+­{3hýÒ{¾@ï磯ž„ÎzÆ3Ÿé0ˆ¦šÎ‚3~}®Uݼ„ X’'88ÁD\p. ÔX&8سаXFhBYÊu$d£”rˆç@£J]Y›à¸ÈSéfG džÉeíü NÒw–ÙƒK9omóïI:‚ÿ¯}+&³Q"žÖZq z£¬z£ÓÆó_ÞTÿnhmõª±;»õ ly‡ZDµHð™`G`ûVYëQ dMæðë—Í¡‡µ:]ƒr›Psž¥šJ@ˆ“j¨eT XÐÍ\ý–pÚZ‘Ð//\D£ì݃ëÈ(°å3(BÀ:2ªÆ÷מá;RÙtÎ/v¤Òö;³$v˜®{¸ÂÁˆ°Sˆd+¥Ê!çõÀøúÈ9<‚BÈ9 Ò¼€u*â— Ý-%1áöx€9„@*wuoÆb]¾"›§Hðý#n•¡(OnÄz° Â" ø„WW·s8F0.Þ0Á]ÃÈY®OÛXáÇP”ûMRB )ñ>â¡0ެ™B˜ŠŸ›C|‹cÞYüNÔÌsów¡k6c™%I¥1¥Ö!›ñ¤qö+9IXk´Û’fý|ªˆD'0 ˜‚´#ü¯ynQÚn AD"IYò(`ßJ´0KäÍdum(û…¥$PÖªN»¨®œÕW£î¢ã!9cåegŸýgO7œÓâƒRà°`-Xæ ×iÈ/¥H¡ GÊõNû6i™p3ækÞrø˜¯Qì„­T’’ÅJâæÇ±=Ä”/`ÎaÛ%rX&GoW~ă™´º [l¡Á°±Ûk½DÛ»I2u ©¹yüžh:à¼4­n­ÅMº‚ Pcnê!°Ó0 Æä¨yð¹L9í9«H·û–ʤ‡SÈK!w}½Ì:Æñ$Œ®4VY<µž‘dºÆ„rn×Â/ò†œ"@Ùµ&ü nÖ„h Ù¤œb¥ë-¹¢ÍŒÒÖÂ,pv‹g}{áE;×?ÖŽ–ZíRÁ(û©Ð}Πs©öÑ?™ ´Êy¿o^ÜÐu6)€Ùo¢…Z̬XÁžÚ¦Ùˆ¼„…º}9‡µtL\sqgÜFšf”¤§¯oÿfóy endstream endobj 4542 0 obj 6906 endobj 4546 0 obj [273 /XYZ 40.7999999 721.939999 0] endobj 4547 0 obj [273 /XYZ 40.7999999 676.819999 0] endobj 4548 0 obj [273 /XYZ 40.7999999 759.379999 0] endobj 4549 0 obj [273 /XYZ 40.7999999 721.939999 0] endobj 4550 0 obj [273 /XYZ 40.7999999 676.819999 0] endobj 4551 0 obj [273 /XYZ 39.8400000 254.419999 0] endobj 4552 0 obj [273 /XYZ 39.8400000 254.419999 0] endobj 4553 0 obj [273 /XYZ 40.7999999 759.379999 0] endobj 4554 0 obj << /Type /Annot /Subtype /Link /Rect [397.919999 199.700000 420.959999 208.340000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/doc/effective_go.html#defer) >> >> endobj 4545 0 obj << /Type /Page /Parent 2 0 R /Contents 4555 0 R /Resources 4557 0 R /Annots 4558 0 R /MediaBox [0 0 595 842] >> endobj 4557 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4558 0 obj [ 4554 0 R ] endobj 4555 0 obj << /Length 4556 0 R /Filter /FlateDecode >> stream xœíɎܸõÞ_QçSm@ÀnÛr`Ø@ƒO&Á`<ˆ3‡ü~T%©ºšÔ#ù)J%p·‹%ŠËÛ×7þüÓ¿~?½yþüŸÓ×éçóç§ê\5ÕøçtùûÃý²;+9þÚvõYö—?§¯ßž¾Ÿ¾?}zú4üûýI4×§ÃàüŠqÂß¿þöôf|ùÓøÉçç¿¿ýï$Oþ÷ËéÇ¿?~šæ»|áÛS×7—_~RÈnøÏýo—Á?ýí§ß†%t×y/ÿþ ”¨z­£Öñýö¨¸þ½zYuÒBuMwB묇ãøï?Ÿ~f»-ãÜk!ÚF·U𬭦յ¨N}Ûœ„RÖ¤ÖÞ§Š¨Ñ’g¢ËŠDÜÖD¥[÷Tä£ozuݦ¬ú蛦Š>±¾Lw8¬HÄmm>zx*êÑ×b†°ZFnôeªØ‰$Ó^W$â¶6½c*òÑ«n„0ÙÄBýmªèktÏ3ÑeE"nkóÑ[S}baFò…}w<øîËÓ›ý…ñ~ùyXÆ•{?¾|{ÒÃ.©“§/?þ8°ð÷:}ùeXú¹iE×Ö×ï]GÔ»ëH®†S–u2R=_GôËêúA{®z5L~÷UÑŽ_=ëqànDBÏTÝu¤9ËëRÃF(³™ÛoÇSçZ7¯N©ªÁmÀGì¸~Ð…lÇ|V4æ³àZG_`eNÏz;öê­³¿QÂh'^¡½´ÐW+ ‰lÞ>âB`bž Ÿâ‰‘ÖŠz¶)‡OR“èqçò<Â7ºUÖ[P bç sCx%ãû>|O"6Rw&aÁ£pwÐ26a2ä;KM”«¢€S8µ± | @Šýõ/ÒÃïb$Yr^$3Ý+W˜pŽE"aø/?Fpà÷YKR½ïbÂPOmNp6:X~²2§®ËÜrÓbî3ÝÿÖk`n݉õì;‚šgä—UŸ\Z•î¾  ƒVZ‡Ab@ÂdkJðÒ¤¡m‘&Æ|ˆå1€¨Ðª T a€©£?×À F&XHˆMÒF§ä,EjmžM¸þàØ…µ´Y5F±ßK‘*öq°:ûhªÞ ‘zv`ØÇGÂ3ÒóLBÆÐ4mvfÔ´£>˜Ñ.˜Ñ¤¬0À΀¥ý¢ ÓŒ £o¯|?#O5þ1o}id†”ÉwêÿŒã==øÌxebj®.È—‘wøÙ&ë…PçÑ2ÛÄùDu] w#ýt½‚¾öŽN ÑœÕIm+î=ðlÙ4Ú¶ v#¿±k-×s%!':(Âl ïà#‘Çbo[ ay-ƒ-Ñ¥ËÚvñ8Z¼ø"@1i¢XKÏtë‰<²—&ò{-•—£†”0”jƒP ô*Á«¬`)¼ä eáé pï‘ɉTËÀ”ôæ½a"e(‘¥˜Ñ×BÓZÃÙ'w#ܦ¿wV`“B|xîѯù¬8>ö†¥e­2‰^fö¸¶ÈNÐÛÎ’ÐÊÃ’€ C¿—®å²%èáœæW®nKp<“É– ÞϼÐTjaMþE¶FFpõy„¦»‘É6vÖÒ°Yˆgp¶2À¶5´lL…›nIn™ÐU­­Ã-Ç2ð(YñIY«¢”+Ød‘ý”0LÈ=BòÁèLƒåDæò3Íò2ò”a9ž58-œÃ“‚ˆc¼±í &*Šb—³BúX¢ŒSFŒ¥ä4˜EnEäLLt‡?ÐZZn`?’9"SÇŽü˜ãÌ‚Ÿmõª6ØiÞ{€Ÿµ¯ŒÄ¨kfúc¶g{Bkj¥Qat¦e²-û}—“Ano™«.—Uo"˜1³[“ÚOˆ-°Î„$+ Â9òäÃÔ>¨HHT­Lr„€&„Iß:ðlÊe½×":0Æùe˜¡X^ÝpŸtÀ{aTôŸ3ø^˜wØ‘›áÐmÛ(b‘µ‹Ù^‰R6Ÿ‘b~åú># >³zü©˜1Ìò¾8|9pü)8âð&åòØÝá¹™-É Â¾ÓðfV€£Ä EB#œE@, EÌ‹ à6ƒB踬¹\áPÁSKˆ`•Ãø"p㇛cYú1"ý‚pž#–ì9ÖRBd­¨R z’øïˆûúõ_V×ÖÒØQ`©.±÷‡rÒˆ(LÇ+âfYc?xM™”ú},×ÅÀ“›&õ™’J«Åk"PÅËOæÃ•C>Rûé{“ÃPB”-%ÌŸ…²¤†=|Q× újÓìàbÂY«;¥¿mYͯÔ-H:#²Þ0õ¹vÜ9r0„®‹U`V'\”Nªsä`€#p½%Ç{ÞC#2A•0‘ÃkX-Øt5çjÁ‘ªM>­˜GybºñÌ'%Q½$þ¦?„ƒYDÔ±m“ó[C) Ò¬æ/ŒÈÛ'ˆDÕäÇ—kÑ<-ÁI) öQLÝ£¯½ýU ~©åi}I¬A›‰l˜‰EÛ¬t ©ÑÃ^Y['°à*ÍU)b`3¨É—¨8ÅÞbxúQñÒ€y93½ýaBÀÒ %¤I8,n䥄‡M¡ ›BXÆ4ðBD«¤ ÖOKQ.J_cCD ö…‘ƒ>aéS#k}z\-Ÿv&ß'!-VÀP:8e¢º7Aåhópuð¢MÃOþW;o`)Å ã"¢f|å´³)×-KA¹V·—C¹†)ý*%F\žæÙKz»¾C Ãb€­q†‡VˆÊ.„'yÜNk0¥‰ ÝŽP––ÚéZ˜ZL˜C!f ÄuߘÂ`°Ë µêaiýnƒN(ýÛÌU,°T˃Dž2gmèò¦³%-öØLãˆzƒCDÔ[¦P”D*ÍÃ#üú\æ0n±`*k&l3‹Ø¡¾â§ØBÃku8异3ü“AÉëçRAîè­¦…ðCp©òúGa¤: ~kÕõBØ÷2×5Í{¦;;l|‚ I°‘«…F8B1ÍUÍ†à ¶fLSSú;—¾cט#Z¤"\ƒQGY~}¯¤"Aûž…²˜y„pa~dK)¾ñÿáŒL›Œè¶¹9KÃJ ¢ƒÉZ…úyƒ(öö¼;O™é4§é߸զ‚†“Ô1JìKÊ;Œd[ˆ$S¢v˜Í[¬ô­%àá-¡[ô3ws¦p…´ªÃ&IàîEz†ÈRú$< c´DTÕ†Ý+^»#¾ðwJ®Ñšlc’ç8gð.&éCZ&0|¢VZ‹w[õ>î4xó°¹'®" 8*Ž"¦ôm»6¸ÚjD7±X ƒ†ÛÄ,”ã”8l¼%ï|b0‹ðÕúû¥CÕ¶& Tœ2ÓãÈšâgs¬œmkrcÝô&„e³\÷­Ñ2¹_üÿ#´yõÐæ€2ã=s5¥¥4¤÷‹¬µCHÍè`4Qã6’e${ƒdKŽËT³ÓT |!ê@2Ë”ÀV_hZmâ),ÂúBŽ€ú‚„Ÿ5‡-7CY3a ¡Åù±Ké²—4N×°©`’£”R µhFƒäàâë+ °Uöƒ¬ÖÁ„)€—&W`‹¶Å™ÙJ€¶`qF^c É$a8$ÅfÅ*}´#½ÿW«[«ñÕY@ù ³m+áŠÉnww‡1(Å)ò¬.Óbœð$¬…|X£ú8¤R„Wâ¤;Y]SN28GZz™`xÀ © P‘-&6ó¶µIÝàð1‚—bÛp¼\›ÃBÙ¼68¶[S¬ÆÉ3É›)ÐáåæKqÂ…„Uø­R`0ós¿pA7`öà´É:4rRhœŸËÀ¹”±–ÜYÙ)©5Óy…Ù½nL¾^ô/Æ_Ä’ÄñzñZSM$ÔâºöXZºž&o8‡ûÎÕ¯JšÇëHþ½àÉà†%DXnÚ¬%gÛ÷Ëdñþ†ÖÏÁ8¶M“`ZkpÉaÀ‰:ûÊQÃÚ{Œ”®þÐ,SĆC:xË8óÔaöZB*Æ›‹@Y’sʺ{I«(ƒUl}Xb×L½Mš/Z/còþ%Q(X³EÎU“ÄÜ_€Ï8‰}>»8¥¬‹¥Xã€þ`°eeòË-§(\ä Á›Ó[e¤©T¤IC@3Éil±7Jé|vÕ– oè\Àä* 6ªÅµž3òŠ}¦ üéQ5¼`#ÊúIŽý°™ n¸‘ÞõÀ#ÌîEÞ.¸²›¢ >ƒ>#Tt"*(aó0nÁÏPL—CE$¡Ïc§5~?žß)œ¦ «†ÓA`ÊEÚü a¥Ó¦º½t8ð­Çc`onMuJ‘¬ºBÆy‚ÚŸ«ŠKf7B- èyXZ‘¸4ÚK¶¯ŒúI+›×ûGq84ÍQÃíaä‡õC, dÒfÔÄZ]{×ãÙ[‚¤ã…"ù7ƽðYÁ’ñ&©¯Êó@E§" â°Í$â¢Yfûߤ±åy«öóx^ }orÛaÃy$ÎÞ · ‰»«û¾WÁØŽlæ¼²¼J r’Xmó0‡'é•l¹`¬‹ òñWݳW7–¾÷ÀâÌ1¤ŠÞˆ¸ÞˆLª-E0ÔEA˜qˆœ1w;)Õ¹« ¿‘»Gè<“£L›0H8/ɱS´r—(kXÂÿ9¼i{ï\p 6ô[¿¯H9S|¥\š½†v@)"ÓY!w»«¥Á^8‚§u[É]Û(Sà~æÒŠ»ê‘Aw®³0µ„VdIðÕY€Ð™Hkp¤Æ€RZZ0dû‘c”¾»Ù-j(Éwˆ+¼ß°nßü†xk~£_&GK—ñÎ÷ìdâ^€ØéÈáº+w—ÑC¤ ±V¢ÆY—ZEôH$BÍ ï|*w°ÄE¼‡/Í>Š ¢ öW-"NÙ'øŒc%"!®+yë‰VX›¥HðrX”Çîêw'·©pXÅÁ‘õ½BÛk»Ñ˜°š©:W–2CA•˜aFAÞº›9PO iÜô-Xl¹´×ZÄ–¤Ìļ·õ¢÷y™•E=(J8‡Ï"Î;žáô‰ajˆ•Ú«1_¥‚ïqS¨¾óòʺ û©[ßµ­ÉK©[ïÀ4D§ DÍ1 ‚ºÑåvs:Ä~Š?)¦<0`ÿÍ Áë[;¡ðî`zü@žGJE¤bá%pÉêõß"13&—’BÍÖŠXJS£*‘dUNQµäÌG¶ÂÄNDÍ–ɈÒñ0gJ,q·a#x\(‘1m[b5¦®¶Aƒ‚~=ƒc:qÙ΀¨Å˜(TJå+yÜ…ÒZåæà”­GÏäõwÈæI(ç’Œ9>ײ(¥µiwª7`AÃÙL°? ´v“šøÞ)¾’cñà{\˜{]°›óÎ1-#´Å“9¨XT¿kX¨Ee–gcAH0ð’¢ÓbZõR)»äeòMv(…àÍ…jPb*e„Ô¾„uE”ý¯EÓÉÑò~ÆØ7 ?s„ïlϲÀ²1­›2«Á¨µÑ…ã x?Yá_Eµ¯gmáÂ+ÿ8VMh„Fj~ù0PNáö ÆÂ-xÛRåÁ¦ZÄ`Lå Ô×Ѳ~¥Í-÷繓öW™ÕJÞ"ØÀdïDIȇ&lzâ5 gª†¨’Ö|aRHWmšò j÷:`EOšU‚bú…­\¹»£ •’ìÊΠ»˜ên„"¤Âˆ~ ”Å‚8@9ÒÄü!‚yàS£øÄ9âöT€¹ÛOî€t°hZ±­ij™÷lÐ e ˆqÑ{…„ó,yË+ú3;íån~d{ 9šOñzð7¹OD ÀÈ€¹B”V¸¥‰‡É’)4[NFÆäpžy,1i[¡¨‘œ 8¿`kö:ݖݾn/¥ØBGÒkâ~޼fÀ¼Õ=+³à‡Ó–YP{šrDˆp¸D§ÄÝmU0¹xÙÊkÞ‰q¹s…9ª\òÔ_òBUŒ¥Ü;f:%}Žb,c᫼e¬’ˆ§›&\Ùñ1——’ÒÊ ØAnæ„Ç• lP)δ2njSÁÀrÌ«?do@¾!èØ_þÉð÷ô}@ö—/_˜~|ý†ªwWbî““p8õwÓnNbØÆbëHÑŒIZ'UÝ\Oã)6͹YÖÈ{}¶m(ÙžÛå$Évad(¥Î²_Ìž­ës3^‚ YKïéÀgzð™1³•gY©¥VÕK³{ÿÉ{ð»YØáGè™ y—F´ #pÏL7†Ùû´¶+D@ÝåwY‹[õôYì€2õ±_ÂzÁ÷L!žKÏ€³Moim0tY¸à€*o൴^N¡à¸gÆ÷ÔÝYEFkû½¾Cø%ûð|Æ0í˜*Äbn×UÍY\Ô†PžïÒÈ]åÈOœœôôééÿbc& endstream endobj 4556 0 obj 5567 endobj 4560 0 obj [274 /XYZ 40.7999999 175.699999 0] endobj 4561 0 obj [274 /XYZ 40.7999999 175.699999 0] endobj 4562 0 obj [274 /XYZ 40.7999999 139.220000 0] endobj 4563 0 obj [274 /XYZ 39.8400000 229.459999 0] endobj 4564 0 obj [274 /XYZ 40.7999999 139.220000 0] endobj 4565 0 obj [274 /XYZ 39.8400000 229.459999 0] endobj 4566 0 obj << /Type /Annot /Subtype /Link /Rect [237.599999 624.019999 300 631.699999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://golang.org/pkg/runtime/#SetFinalizer) >> >> endobj 4559 0 obj << /Type /Page /Parent 2 0 R /Contents 4567 0 R /Resources 4569 0 R /Annots 4570 0 R /MediaBox [0 0 595 842] >> endobj 4569 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4570 0 obj [ 4566 0 R ] endobj 4567 0 obj << /Length 4568 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯è³kER xÖ;r°Ør0rÖq Ã6²ñ!?ê»§›ÔG‘Å"¥žÑ.°3Ûl‘T±øÕ“ÅwùôÏã¿ÿ8¾{ÿé?Ç/æçûO‡ºª»zús<ýýöö©+%§_{ÝVr8ý9~ùíðõøõðñðqü÷ëAtçͱñ2ÄÔá_~?¼›?LŸ|zÿ·ñ·ÿåñ¯ãÿ~9þðñǦ¿Ó~;è¡;ýòëô‹Bêñ?·¿>üý›ãïãô¹ßÓ¿ß*%UÝˤy|½>*ÎoEƒÕÇF´J7G!ä8Ïv$Çÿuøiìí:jh„軦¯ƒ{ÿ=w+ŽCße78:ïÖ•Hí¨kžŽN3i¯&ê¦÷wE&ý Ôù5[LúKW©ëZÉ´†§‰´W»Þéê#˶”/Ûò«çÁ§Ï‡wÏ¢Qú„BŸgr†²éÇçñuÛã·'þôñóÇ?Õµxúóñó/‡¡'Þ·öM-¶ Ÿà3 l¨¥†½Õ¶ÀÞÔwð™gØò¶@àYÆùÒ­ƒoªâ×§&¬¶‡x}ÞÇó›gÖxØžæQÏúÀÞjÌon ŽãÙ?xåÏðîz̉oh7Ö´îY[0*v0~SÏλRÇ#K0­á8 ®œÂ»·hài!` )0‡`ŽÇ»óõÎ×ì|çfhðáó¨QçÖÑ/Ó s9A"×°EbŽÅÏ@ÙæYaÌ}oGVïšó£jÎMAtP]:`)ŒùÒ£ãS¤œ[Cb€ç‚ÞQÈ·7‹òÛ¦HGÌ—~ÁØç®0Åb&­Ö†µw^½(_öͽV\dÔVÈE)åK•TÛ—¶‡=–ÊÛ¡Û†ql÷Bø¨³e/Þ¼þ‰-ûAHt+è!i•HÑÛø–RRÏ3kBÔ‘2ÎÛ‘šÂøDXЇ„âíðØØ@÷F`Žçõ‡a®ÂÞ…-k¥øà1méÕ¥«ÑæÊHÊÖÒ’ÊŒª·“áƒ%ƒg?´jO¶ÁƵ©®N‰7íTÜzÉ¢áêâ@i½{͈»„W3Ú5×bškI¯|'/ÑR>ýgC6õ4¤¶€\ˆªm:=ÁÞ>]%…¶È6¹ šª™¨æ¨Ú^É— ˜å%¬–Ö[)g\@¡ì4c6/èæ,´úª9·Æv¯†„s‹ÙÁè]B^šBX¨½á×€ÏxÆélδÉA<g1œqE½´gœ>eïLˆ°äb°§Š;Q°3ì ³n‘ÏóÀr³ ¾CÈæ® ~Qç«¥ œœ&šº±a/™Ã‘xÛr ‰‡.ΞŒ@¡Åýìì+#nÛJI-dÄwþÖÁ\%ßÓh›¢®º^Ü1ï5ÆTŸ4‡ÛIã·{{òƒ 1R€‚ xÉÃù&fCãM çèv’W8ÊqŸ‡ÂA—y7{¤ò ¦(3p¼€ý–‚IŽÜ$¼¸;E {t§§y!£Ò­°DPcÖ²ÒCm”óö˜„ÎÒa…ÆÖ¬b6ÿŽÈI{ßy?õÃe@ú0¥‡a™¤„r92\È™#=@TFçó Ñ+‡0Š1ó"z}3ÈÁZ=£(ãÖWµ°ö~ >!56`+lf-—]’8:]^ýÌ? («cAs`ƒÂ¥€3EÊvNñ­•p·mg‹hBh’¤ê ¡ÂH8µVPŽ1ÂY+œtHIá%~ð8‡ÅVôÆ÷žç°œc¶2\ñ\Çp‹t¥#¤ Çû]"¸”=Zs gOñq¬î¾Š 9E9Îë Þê œ3æ‘ßtg³ÊÔ†9Á ϘnZkQKá+¨€³óæƒïàЬC¢s“/>–b%­cfG`ŠÕ™°KqpQâYæ¶gD¹… áÔiaX#"ä‡êm‚c?˶o¡ š KS'sñBÐ]y@ú*©&înñÝœy`´üêS%à¶Ó·üzø”­€(bÌÓ,Ætl$g{:@„tS…8ppCWŽ>k+]øµ<ÚF–X@ŒW1=_’Þ™#7ÕÚRs7“󷆻^†û1~><}“Ë(˜ä®¯ŠtZ{lß”m„=IIʦðh¸aà½vB<ád|;!Ƽқ¤P$x‰bò<ÜeàÑyUkì*,}Ún­`ß27 At 8§ý¡ ø_®L錑åÓ{B‡Hˆ # ÷£»Úánæ,beSƒ¡vŒJíF¢HŠ BŠ)•ÙaoÕèÉÝ2¼*›¬+·cã5‡EˆÉËY]ÏØy­€ŸÓDÅ_€#w­Íذ<{Õ áºC(S*TχàoŠ‘4Îú±´ˆ’;üð˜~yý’¥w!’̹ ¹)œ9Rý}äHé¹ÈQSÛ‘£¦v#GÍ5Vt饹ã9RÝLäH«ÖcüÄŽ¿5Üõ2ÜQ rÔ\î]ºÞÐwÖÞOQ¸#2 =ÎG'á1‡c8YZ¿A,GŽiŒº³(›("~ýxÍJ¹0¹tŠfZ&YMKOc s]ÉÜ”H|² ·„3uL™®ˆ²ŠQú ²VhK°$¿L„§$*f¸ð™C0 `=žW ºÔl? ÔoÏz6C¼{¥»© ]ïñ2. "£ Õ_Þï[‚Îîál,{)ÎŒw»4ðÐMAê(ÂI¬í«@’É%¥›h»Åùx¤Fü æ$‚&Ðb;lç>`«Æ‚W{˺ ¯4zC\E,E5ž>Åçù˜žÍ=À“à‰ârdÁ3Àœ¸ä[Š¢eM=ÚË.]}8XÐ '†”h‚ÇOJàŒƒžq(ÞŽ‚²WßjAI%Û‹ou}Û|Ç¡‡Å!uvK?“4ˆ¢uI€ì0 TdRž¤cSd k,Ë£“b-Ÿ¢ûÂU­SvÓê´òh»ÄÆ‹¥ýsÁÕ’—ˆoI[VuW¯ëê¶ìnm=)…:_¹˜¼qó’žÒI>B^ ã*%šLÐjI1yÈ}-ŽM³JD…ù’ð¦¼ùx ‚€O¼–äú¸áyJ¦DŽä¦¹(O@.Ï '©(§{Šù´)¾âã`¾¦ø™ÏްžZ+ª£tûlÏÛsǼ«],wŒî‰Äšâš:eðILkVû듯¯‹"qŸÁÛ³™¼œ´aŸ×ÿÊ‹O FÉ# hc»'´˜ÝVí†k\¶˜Rž¯KèÚöz0tÒSúÞâ¦ÈžXü†SÉËþ†;ì`}Ü+š+-ý´ô¬‘°3e —à+wœ ±sÝÁ÷-ìÄÁsK*\tÂû¹Oïa‹‚o<ƒk´¹÷„À:¥súØÂÞ°Lh=1óp­ µV9FO¹_JÃ,¥zyn©%”ÑŒ)Š ^F”³d¹ßWSsªW†—E\¿dêvJV{ª;rÜÐFª)Qä9åꔄúÚ)ÕìÝ aVæ(pS årˆïDlºÁ’4<%lYïº`*Wã-è¹1€rq aC'Lƒ‰“éf‰WOòˆû0n0‹¹ (¢„;å*ÄeèÚž¸Úmy®-‹(Hí °«9ð^ŒM¯~žór¼AØvPЉ(–¾CeqYN×<7GxHÁxUJ~O@'šÅ%,Ó¬JIŒº™r#f SŒŠí×®p(„ß÷öþÅ‹¹|“W±Äj‰ü@˾ÖÛ„˜y(ËM³„æ°màæ»õïÇ‚„v/ªˆØ°ºæ¹(ÏV*|Ýú©E¥K?]³r+]ð•éáwº÷|:QÏB* ÅÅnkzÅ åÍx/(d“(0Â/”½!ϲB4å¦ZxSì[ÖË^enйX¤J.¯«>åa³,ªH£æ}CºIaˆÉÈUâb(]Ù*Eç¡)AE“NŽO‚à|Ã5‡"îݦ\[¿VHï®C}ìùÝMLÕ_Oð]s7ëés-—7ê[«E Â3xœ=sÉk.µ—–§øÞÄ5ÿÌÎ%2Ú£®Ë6öжš ×QD]M®>‡õÛJÚ^À—SŒö¬ ÿv•š† ™›‘ùE^-c~͉¢ee%âFш«oÃ’I^‡<Ù™³Û(¹.7K’RŸXî.ãý ÐY¶œ©áRŒàFõÛÃ.,vN.ðkF~iÁH„ב5ã ÛB¬7N“vLþü©Þ •œrs´6™ó6—ÃãsäÍ4u’3(€E`?”üJ‘R`ñ(Q:ÉâtH ®òdð=³KHO_V!2©œŒë¼g©ôÐZ"FáÑ”B”KÅ)Ç3—æ–QLZØÜòÖàõw³ÆQ#‚Åœ,}s-§º¾“EÃg 9YŒ^.TÕÛî e¸Çu‹¼7ú¿ë~ÁŽøŒÇ•ßÇ3ìNÒðM) Á0²²m ܲ×¾Ô‰-eÄ5qe¥ÍŠ„ÈÇG½³Âc¬°Zœ®JÂå0íH–ÔÛÝ+!¿¬Tú\žÌ,Ê~ˆè~íü ˆó ntoõ†œÝ'õ^$MÌŽ{íÇÇyÊq³æéFÄì¼)/¼N¢åx¹ƒGµ³ ó–ü ðL˜ñò¢G„Ÿ. ¥šó¹']K‚§æŠ‹¡Ö¶á²ÜH±0GP¬’ÌéÓ«$é,˜ÐúZH}½8¨CÁˆ\ ÂÁ—½0ITÎÿêæÍk×¢ó‹U÷öfßÅÎ^¢)®uÒ ÏàHÎ^i€ð޳18²èc$Ìkt•æ<ÕfŠ72âµj4œGðòÔy~ZÕÞˆúÂ'ÊEŒÞCÑP+Š,jl[y9€â‘5ᶦ{þ(÷™ã¬ \1>QÔ—õ\íŹV<úá#ÜË®øeUI]èpä#GòT¦ø7å”B¥9"&…§è,_Äñó˜SRi=~ÀfMˆPWÙË’8’bg' ÍjÊÍâ†Í)L>ê‹€x{ÊånuGìÛåü†”#©®ðŒ°n)XCðƨ¸¡í¼Ê–g&áð¾ì (-âIK¡XŒË E˱å ЋÖGñHÇQ³h>yÌ›êbs°W¬("¯‹7G+n²$Öº&]xâFJ¡R¸‹/Šèj•‰Ö!ˆuÂÇ>ÿ³ DÎ$­m< W¸owãßã×qã0§'Ì/¿y&æ¾QýòF½ïä}tùô\w#ÙçÈ1ˆn:ÅsTõµ£9½ÕUÝ|äih*x—}ÕÏŸïgZ&ÆPª’Ã,åÛ¶ê&öµYfn Ÿà3Óžïe%ëóQµ—–'ØÛÄ£·Ÿ|¿k<3oøŒž1êÄ\‹@ïa@3î³b1ïnævÞ \wú]¶âz[b éGàŸ1| œg¤¹P°v9ò¦¬‡w §˜s«s{s/Ç\Ž>÷ ìÍxÇææ†¹ËÙ ®r÷ žKö¥9]÷Ì4N«/Ç7Z> endobj 4579 0 obj << /Type /Annot /Subtype /Link /Rect [370.079999 119.060000 451.679999 126.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding >> endobj 4571 0 obj << /Type /Page /Parent 2 0 R /Contents 4580 0 R /Resources 4582 0 R /Annots 4583 0 R /MediaBox [0 0 595 842] >> endobj 4582 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4583 0 obj [ 4578 0 R 4579 0 R ] endobj 4580 0 obj << /Length 4581 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹ER@À3öÈ!ÀÀrXäx³ ëE&{ÈßÔ’zzÈþø&[Òp½ðŒ[->Šõ®bÕ‡?ùÇñ_¿?<~ùÏñÛüóñË¡95¼™þ;Ž~¸þ€ÊSK§_…ìN´ÿ;~û~x9¾žÏÃß/ÂÏ/Î?†‡ËÓ€¿ûíðašü0}òåñ¯Ãoÿ;Òã_†ýrüñïßæñÆ/|?Èž¿ü:ýB(¡røÇõoãÃþö‡ãoÃäyÜñïÚ¶í†%G­ãåò*9ÿ¹~MÖáýð;!tø«Àñß~F»,ãÔ3Bg¢qUÐaXÑP~ì?¶œhƒj{s*z V&h\‰Ûi˜0 zÖÊó6é0CäF—¡¢!Æ%K3и"·µôx¨`Ћv°.òËHÑ=M4P;³³ðp¤`¸÷¬I÷e¤hpõ}¢W”îp¤P¸Ë†wià~)\r·iW”îÚHÏIÄ?}ÿ/†¾><ÉQÕùú󰊳¾4ýøúý@Ùñ‡Q ìøõ§ã›†|úÓñë/çÕM4\ý@œ?`—(±~CÚ¾A>ªßè•o´ÓÂHsâ‚HÑ5¯O>+ïª6}ƒ´ƒf8àÇÕ»tþêIö ¼>!Ó¾Ù‰µÃdÍÕ“æéüDœš~z„M¦rê³h:A ?‘y‡'ÚðÍ#\Ƀ “Ïh£óv>Ð2Éz€d×9#Y×.'Æç- Þ½]̼ù«££p‹*4&`ó=ãÇõWP ¿Cn³ðœÜ·e ûeÊ Õè#:Up'Bîé{uÞ=”*ñ±N8±a±¯ ódá†5Zù~wã€Ý=S‰À‰†ÅS„âµ~‚ÑC—qVåi5ÈQ8H®êæÖ¥¢ˆÎà#Ãóa¶à¡Dr81^’ФXuòáüp;H)¸2~= ¦$¢'ƒÝPÀÀ$@avW~ ÄíN4>¸«½«qOlT¸³~ûv^£Â@xÊ‘»za8á ½ˆö“}2®m;•=àÕ`ºáâsNJÒUÜ’&8« ¨„œ£ž1*„^„e7«ð/{=!x´ÏðÉ#zÂà“‹²¤&á꿼jÚ[æÉÈíˆ`Ê)VçÀ^œìs. º ºÞŽÍOi>™Í‘[´^9Ôj9”Ž ù– ËÌÚ‹·} >G g‡©BÛp¬DÈøÔBi•‹Óà­UCŒmCNcù'ø¤/ˆ—mƒ—ø1äñ9Â3Á¼Â€±Wàýt2*V ÌD¢ Às$¾ƒçIº&A|!xžû’¨Yð¿ .÷4—÷öŸ0Á|9Dâyì=Õ’iW@áª)œ'-Õ¦¥³.à9W ùFÈhiW½f ¹?'.©;PB¬§e «Ð([¼`ØW`Ð0ÝcýrßmfÕ³ÊÀ—ËÙ™…Wõåfúòv5\*E5ííÉ65\ƒÖ•Ë ó”¯måy^…ŽÐ2³‡*ê […m€×FñÉáwð JÒ&¿Ü9¼/¯˜sk†ÿ³póÄØñ×`µ© 3[(W`X3@rÒ»äKÖ âtä'sC´ãç>ló´7é,ÃQú{XÅ]S}xYáK«/Ž¢«ýS}xjb¥}x»ó“Á'8ž˜6>š6¢YužL:O"~{ÎUÒ£ÒñÛ"+åMõËV½$V/Y³_¶¤^ÂiL&hÕKÊé%‰%ü*ℜÅän•:œ¼5+äÌ1„ —«¼óõuÝ3n¸Þ+–hå@ðEl÷ëäõ‹’^Gõ¨Ú¡DIR 2áü¼¸=@[ŧ%iÝî÷7 " “³¬F§òý¢yHù¢Ðê4ET²YGÌMðÞŠÄiµ…ÄÖk@føô¢ü’ZÒÌÅ‘q÷jgi ÅbIí± TÄe­ºhn¤uHꪥéü1¥´u†JªÝZö­Ñ°jb[[Nñϥæ˔`ßBÃN‹åNstÌ_¬µÕØ'ƯˆÒÉz $w±d¨6ªIYÍ„(çë!?®(áÕß6{™>q¢âN#œh¬"¡¨pQ B`«Õ§Ãg[¦¸^Ö¢¬Ó©½³Üxxç³c§qσ¥Âºë~=|ÉÖµ!Ô¸„·•®>ž¹SŽ—„â{uÊѦu Ìn7jËœY…ÉÖ¶£™µ[8Œ»Ýà‰á;³´ÄõT¥ËÄÚ¾®Q‡=^Ú'6pò›°}³øèó˜°>Ö öù¦-A¨-ɽz«Až`/³¯¾p‡ŸÅ¥QÝ«YiÕVM!ÀóïÑ[ £‰Á±¡þxão"ªÒÛëëXÒggg,£4¼†bvû"¿-Ü©‚À`ñzœ?†­{ÀÁÀ%4…ʃ bE?¦ÝD3M|út‡Ñx!®–õ× ÷1ŠC\Ñ|C8µ£$ñ:”¦7ˆB«D0ÔaÄ,Áî52ˆÍ€xbfŸæwí"&mdï¸@¤^(bK¦Z‹€,.Ï pW6w´Õ[éÜÏVºòQX u=]3ÑaÆ®y"”†c€ ȤO¥èsU2“£¿TNmñÝX˜!hˆ-œlC†+·™´8SÙŸö®¤!"Š3Éq?8Ί¥0ökȤ ÉŽ^1î2ðqüîgž';Ç—“YC ÂÆ­‚_“0vÖîp2—ó˜çYœ>¥M9nCïìÕÈÀûb\ì‰)T¾B†pæÖ5µ‰1{žŠwË̯O>ÂcÂýó»L¥TDvú¨ÀîÄ5fm%qL¯:ä‘»›£v‘ßÕC”®A¥pÙ}ŒBŽð§äÉ;ZO2ò»k:ß±»ÅG7Øä0£êU­ŸûK [=pÒ#”Ÿ"Î…È¥€½Ê:¸³MIƒ¥ÆxÄdï»b €”† Üñ÷&±vÑÇ=Ov~Î{,½T˜©Gâ…\Cw'ËÄ»ßüóɲˆ‰Í×xÓmìµÆ›dÓ_zéb=Ž àŠ*ØcŸ¶ÖJ@$ÊPmg1ª´±£5ßvÜ[E¹Rµ^$é–ô•Æ])7Hmº ˆIû 1ð;i³èìC«âiЭ4×å¾n…náž^5Æ×cŒû$HÛozX#†´ïøÈ[Ö8W„Èz¼v’÷‘b¸r”Ĩй›îO´œÙ–†Í¾€¤wÃ<+t¨¤ˆ‚&ezžAˆ`s†`™{®Àýk¥ˆY‡„;JdÎUjÊÌ`”éi‚SqÌŽ/¯Ñ€YTõze%¬ba[ƒ—!¶)MÞ–d‘½Z†¤—Ö;wª–¡Ï¢UlPc×ê@àò=5¬å`¨Ø«</g¡•¦À €=<ŠŠdlÂù¹e‹Ó¿pJ¤SaÉ–$v +Êio”†˜vþ³$:užêèqéEÜÂHœ¦ù³ ;îÒÚ~.ö=€1'ïnUæm¨`­˜ö*A‘Øýt‹¿w&ëÆuÿ}yñ}Ê<ŠèxTúŒPÖãIwˆpdq{øHvßÁ]pÈ›$$UeN3Í'>a8od“ù6†"…:žãóYõjÊ…•l‚îzDZ#4Ÿ«”˜ÿ¤zæ-Í_#7¹#7)kûDÝEsך«3ëºe »Ð \Õxõ×x"®\…U” °}}\O)ì¥~¼Ê ãDA¬^”•€Â%†V¨Uõ©ªêo ©ÊÌ6tÑ~¹(¦#F’’/Ùl1Ðwê™Æ@0ävNxÊGXÒö¾^UŸ(¥O¬9XÎî•Ü®VÄúP½–Ìwʨº©ê-ª*SBª¡œ)f/ü2ß3#la†Ar"&ÍÜÿ2Jõ'U’‹0ˆÃÜÛ›š‘KtP¹DH”&i•ÿ(m®ðýs{-²-ä¬@»§)ülîÒäPVÁÕ} {çÀ"g€ˆ¥s d׌3…Ô´‹*°Â–ÃQ¿=Ùï©ué&‘RG‚ìM‘gc°¥d± Û$s'<äÁ©eES´«™™†ó«™™)À¸«´É¼¶£ gJëÑ©oQÁ…r"2Qæ\,x.Ïöºä5Ç‚+ø¢$g*cÊZHÐéKH þeíWguÒ\²ä]§ÉGöðù®¾jÎëü\•̓üS!ª–¿·ÚÃòˆrrÙ¯÷‡Pº_Céb0 & Õê59Õàà»ë¡= áÑrkK’v–0RoH¾!•3¼,Uº­—°ê%¬«Ñ¬Éy·>š¯ÇÍ}àFLF]’dÊH`P 8÷ãshŸRžî^Òy1‚u¸£`X‘¶ŠTÙ™ TC4)1±†hv¢1äѤéé‡ãýp[ºæþ¹Ðm·\2OJE1¾9ýÀJ¥¦g—J„êAó$ÞÓ÷zË)ä2†Oßš”‰„izqÙ A}Pï\y‘Æ}wÕ¼ªYUÍZy²ŽsE¨lJ“Ó0Ck¡‹1#Ä‚óPyœ(Y‚½ÅýZ{=IQoy¦¹åi÷âæ—:vx_o¬Â²—ï…j:lŠË㾋ÖF“klçÜŠK¢ú;õÝÖˆµ—$1“H$I¢Þ÷*Ðï)èŠNŒ¦ô.cóˆ(‘³žØÜ¿ì•‡pDÕ*=:U¥ '± ¦q=%1m<¤ˆvîÊd’Æ7†߀;}1^0ÏVZ#D­ƒÏTC¤”ñW}H ò+»íñÞJÛŒÛ!U&g¦4ëÜÅÍ{KâˆRi«Þw½?g¯€ݳ‚-&’÷r(&q-6L)¨ûmˆ~áŒX¿O9g¢t+UªÙƒÛú ±áÏñeͰóñ óoß½*Q\¹x6‚Ùøª½"?’a·,ÛžðéªÏ±m.‡4}œŸøíxOÏN@¦â$n×57žLÈж'Úó[>þ®;ñéÔs¼5„ïôðÉôD›v|ôúäŽ6‘Íõ'ŸàwgÚ¾±Ã'ôά6ÝzBÐ>f¼÷{g>1Ÿ½Ïk;@Ö¿ÓŽ\z9t~x@ð;3í:Á‚7:ÆCÜÁ5àÄ”¹ƒé-ZÀØ ç¡ð8Ú,‡n­ c—F ¬Òé¯E ºœ›²ú½3ÍÓÉS;µ¯txbXÛšŸ!† …¸Ÿ`cÞ1{;b)WʆŸÈ‘u%áÙåvëÉ•ÒþœR’Ÿÿ³]Œð endstream endobj 4581 0 obj 4069 endobj 4585 0 obj [276 /XYZ 39.8400000 284.179999 0] endobj 4586 0 obj [276 /XYZ 39.8400000 88.3400000 0] endobj 4587 0 obj [276 /XYZ 39.8400000 88.3400000 0] endobj 4588 0 obj [276 /XYZ 39.8400000 284.179999 0] endobj 4589 0 obj [276 /XYZ 39.8400000 652.819999 0] endobj 4590 0 obj [276 /XYZ 39.8400000 652.819999 0] endobj 4591 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 663.379999 120.479999 671.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass >> endobj 4592 0 obj << /Type /Annot /Subtype /Link /Rect [324.959999 376.339999 385.439999 384.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4593 0 obj << /Type /Annot /Subtype /Link /Rect [324.959999 99.8599999 385.439999 107.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4594 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 62.4200000 164.639999 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor >> endobj 4584 0 obj << /Type /Page /Parent 2 0 R /Contents 4595 0 R /Resources 4597 0 R /Annots 4598 0 R /MediaBox [0 0 595 842] >> endobj 4597 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4598 0 obj [ 4591 0 R 4592 0 R 4593 0 R 4594 0 R ] endobj 4595 0 obj << /Length 4596 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`å&ÙO``=ã CÃrr¼Ù {gùûi©)DöÇG‘ìf÷Ðýãø¯ßïž>ýçøEþ|út¨NU[MŽç¿?ÜÀû“àÓ¯]ßœøpþsüòíðýøýðñðqü÷ûµ—åñáuŠiÀß¿üvx7M~˜>ùôô—ñ·ÿùñÏãÿ~=þíïãŸåxç/|;ôC{þåëô ãŒ÷ãî;?ü÷á¯8þ6‚Ð_Æ=ÿûƒu'Æï„Àñýö*»ü½MVkÖ×#ã#œÍøÛÿyøeíÆi¨ëÚº«œGíøe؆‡nZmPmmŽC…Ôô"Î@gˆXØÒXUwæ¡È¨ï›î²LÑW¡ ½б‹6êϱ°¥]Q‡¢¢~h~YæÐ„"ì:R0æÛ:æ/± •IÄã‘ÈxïX ïב‚ÑÕ³8RëQ¼«#}Œ¢†ø«únxñýçû—á¬r?ÿ2BqÑÛÓÏßõøŸ³0ãÿ~>þ8*ïŸþxüüë¡uyÏxsQôòIwyòáó~0=¦*0ÃeÊúc:1=éOýPµp¿\žt§j]SÝ?y?½ó:üú*kñh'XÅÔÕ?)«¯êéƒS=Aw^§¬¤âpÑO±VÂjv’ñAYL=!p85@|ò„ž°=áx4Ÿ`Ø0p4ÖûC€×c€CýÁ;‚„În#pÉÞŒ_)Ü…ž=˜¢Uù]ý@g9çÕ«Ô:™}^þÁ—¡k H5Qd{â¬wE+1!Ôº2‚{«a_Ç‚ö  Þù€4‘ˆ8·ü®Få-Ôå¶ð|h*¦5â­9Á˜óðv¹ãF_f8ŸÖðrÜ·šOÆc§¦nÏPº@‚×å!ì µ$HT~³‹L©w{‡Í7€¶„uÔ5ªuÄ+‚eŸìÍÖ?Áw^üm  Ûgð ÞÃ<ÏëÙZC£&ê‹ö4k_[é [¯¬&ÐN÷Vxa§çŽ9®ð ¤L; cìày0®1@Y…çÑÜv®m*a_7|‚ùÌ@c#ø-ïMìTzÉŒ7)–áί³âÕan"pÞ¡Ù‰°–¡ ?¥LR½W;.m]ÚA ÏG(L‘ÖØ\EŒZ÷"qŽïT ¥Tgâ:¡ î)mÍ´æeåò´Þ5ÛÕí:[-”—a¼µmrç–&Ã5§€ˆŸ¤±sÜÕ§4‹Ö\Ö„G†ÝÃ<âôA9gb(>zŸ½âÈŸNSjоUUE^QAoÆÝ,w(°EÆ5–£xxVËÄfê+<üb`{²ÄꆑC—×ãCUßÅE=^ôxÑãÐãq1Zôø¢z|¨Z¶g=Þßpº gìêX_Çí,¶†£’K›½a' ÅDg…‡‹¢X«æ3‚»Áñ¸bûÛ7s‰²;ÛóÜ’¶Csó寋Š+íJ§Q…Óäô¨¾-¡\S‘T:tA^WÂêð9.®¬¡H+ËìÉP‡ìIæ'hÎDt-hNýxÛ©„µé£G#‘ÔY»”Ž-¦'×B:$’Ø©UŠ„_L´~›=W™.cK„âÅX ¹íf˜Œ¼@™SÕ©hÀœs…ŽR4O|joDá…MñBFSÙE3Ï Iç”95…cлmBN³!í"JO¿õ{úm¹ûžÏå ”fÎx}”†;ZÆ£ñëδw¶ï…N·ëâï…jðc!‘±òÔ×¶V³u;ÇãüÄmú¸¶¨Bîh,]…Ã,Õø Q5¹IxÖ7 …å,á —jãð®Hͤ¼c Ó…x§îÛúqâ¥:ü ¢Ö{„4Ÿ´ŒÖ è{KC-÷Tyó°´®_i"noÎSr@cŒ[”·’Ò¥y×¶QÝ«ê¦W•âªÜmä⾬ªµjÛ߯A‘`É‹ýœZR¥ý¾‡èUŶ~½Ö!W¾X“vtÌ{˜DöHÄt(³%Z ^KÍðHàEýUôׯô—^ü;nÞ¤Šr72%¿Þ½È'3`“whUHVÿ€G)Ì”WvšvÜÌÉ´jöR"o‚ è»íé»^¨4RŽE¹¤Ö•Wº×LÙK¤H°Ô¤9ó ëàKC+FßI.ãëz;Ò1z|¼‘|QMê—dív¼·DSËîDÒ–5ª¸²’vèZR–ÄûiÁö¡ÆÉö'‰A9à„_? ºHë¾WDI*)I%?æ}€)I%èÊj•7YˆgS· PEc…;c'¶C®Hvwë$®§äº®WHfåÖ3»ï¯›̇—r´»Ý‚ùlƒ_2Ç/0ë74w‹ö ­vP·©G[,ùXÃ0>5͉'m¾I“÷§~¨Ú¹@¤vœ™ãßHAê|R÷0qU>ƒHÒÑW‚!è%«ÜAÿ.tXH 5·kJ%Ìì²Á¡ž&,1Q:÷ºˆ½]Ôñ—ˆvܦ<½ £ïà Ic±xxw0õ»7‘ˆH©šFÕîÌt‰G”Å£=UvAûüÄ~.HSî~ÚÁú¡á¸íÒvz’Í»x$DUP<Q"Wî—GiÙ—[Р:Eåì,hÌ?÷d77^Ϙ‚竳3¶ÙbÜ£\#=ón­ÝŠAÔÈ«$šþvãÚáÐ'4ì¯p˜ K Ê8HN‘cøÒ<”Ðoq5Ž€ò^à»/1lÑd·3Úª¶Âc >œ#JgxσƒÖêÒ Öõ  ?¡@€ß¡Ì“³]µé üú–]$)$¢Å"d ¿ÙûÏ Y§mשD¥´B™I i–v‡¬oŸï²ó™,Ýx¥´Ýu˜Å`h°áð îl˜çÙ£9gç%ÁAJܪØ'0I襢Ÿ}=ÚÌØÜl)›usQ[jx§DŒû] ”áÑ"HSbØ×BIÖÛ@>¾üôYSêx(x Ḩ$×á¬yýOs…äõ ,a5$Õ-)Ð%¥Ê ºiŠýˆ”vT]Ì tÜ;séX¤ä>PDnN ¨Cß*(»Ì«NŠÃ5å=ãsÒæÚË›ŠÞSŸ³·ÊZó>÷óyFôxÝ*;â‘>°í¦ì‘9»Ùœk¶NÊNßòfŸ;òÚb4Ô0ˆ¶íZüY«ð8>L0}¾4}~IEK†Ï6öƒõ >á“á†uìp§(ìÇópä-º¥B7sskoÁARÀêÁÁ¸i'$},˜Xѵƒž·“XA9>­Ÿ>±»H^‘øËIü…¤7ÅjÄŽ lã]úc©Úßî[*…¤¯¹Š‚¾5Zvmâ£.Åù½Å çZ¨@‡¸c(UFšÜ££¡Ñv™;ˆLÙ4=W™.cEr 'w㊶Wp˜aeÜ%¯U§¢¡8¯]ä‹Õyí >³käI·'Ù¤(¾½pÂ=©³RŸ>qâæÎ#-ÓDÅÂeOÜfWÕeoEk= bê&§]gr׫×]?oÞeïÄ鼿ÑF®›û¾>dg¡{á‘ ëµÔ÷·)W굤͢õ"ÂyDÏè î—$Éç`U¡%IÎåàîK꺄¦$…3:’po'ØÊÉ€$Üä ÷gÂOðº*øÎËzò]aÎwj.÷Ì#é‘`•¤SˆG=FP&dâþá!ùèLLï4a×}#a_èšKÕÇëþþƒ³êKÃQç‰Yjå¯,ø|r®U ,­üÏ <âf)û˽êœršGûø8Wr^=üGqo IrD¹Ã…`·\ B¢B÷„bÃð{I§ke¶æ´ÅVP\×TˆE±“[-C.åÀ›ÞíPÅP¥–.Ä7жµx%o7© îҰÖGh‡l†­!úEàßGÉ> î‹?ýøòÍË"¿3ö?µ„ñU»W­=²qųùÚ¬=]öê(n]b¤ «mOí|'‚¡>i{3‘ïNÝ|‰P7ódÚi!N|˜EtÓœÚi¿Te37Oßà;vüÄ+ñØ8ü=m¢—ûOžáw¥˜šYá zGʺ¹' ­CR·ß;rÇ|Ö.a»0@Õç »U¢5:`øIL{‡O¸h+â!í`ÌhRŠôgÏñ¦^8Lœ{Ž&Uêl˜º4^0P•Î7–ñ¥tÑû½3ÍÓô'19nž`{Aóà=ÄäöñŒc,;¤¾ åܾ¯Ú;Û(®,,­JüDjÓˆšôøñð])ì endstream endobj 4596 0 obj 5153 endobj 4600 0 obj [277 /XYZ 39.8400000 407.059999 0] endobj 4601 0 obj [277 /XYZ 39.8400000 407.059999 0] endobj 4602 0 obj << /Type /Annot /Subtype /Link /Rect [324.959999 455.059999 385.439999 462.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class >> endobj 4603 0 obj << /Type /Annot /Subtype /Link /Rect [133.919999 380.179999 232.799999 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4599 0 obj << /Type /Page /Parent 2 0 R /Contents 4604 0 R /Resources 4606 0 R /Annots 4607 0 R /MediaBox [0 0 595 842] >> endobj 4606 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4607 0 obj [ 4602 0 R 4603 0 R ] endobj 4604 0 obj << /Length 4605 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤¨°X`=ã C€ ääx³,Ö‹Lö¿©%õôúø(>Zê¡ xÆÍU$«¾z°XüðçÏÿ<þòÇñÃÃçÿ¿Î?>ªSÕTÓŸãø÷»ëxw|úµíä‰÷ãŸã×o‡—ãËáùð<üûr`ÍùÁùÇи¼bêð¯¿>L/?LŸ|~øëðÛÿŽüø—á¿ÿþáÇOs㾺¾ùmú…qÆ»á?׿ÿ>üíOÇߺs¿ã¿ß !ûZ6At¼\eç¿×¢—UÇšõ½àGÆø@§¦ã¿ÿ:ü<ôv!ãÔ׌µMÝVν¶üX ºcß6G)™Ö©66·®‚;’]¤ŽFŠXØÐXU·æ®ÈSß±ú°]à@—®Bgl-‹3õ#E,lhËÔ㮨SÏA:S´uèŒ-]O}ÝÉ8±°¡ÍS¯wõù+"¾üøåðá©ÑÿËÏg2ýøòíPÿa±Z:~?è‘ú‡ã—_õ©­œuÎÔŸÎ-ÝåÖ+TüüA{ªúéá×–‡s˧/ÃÐÓ dX4ç´¾tׯcnÔg%zMõéÜ"Ý1.¯[ðûlé4’ð‹ÕáhÏòOÊ5‡ï; 4<±Úúuçšgëû¦^ëÇqHÜ€©¯Ü×ÜÛuæVG¡±‡ úÀ#Êaü`õh‚¬Bˆ*òišû“SµÒRÁ–ú#|¦‡-þp܇-˜6Hø>ó[>Á–ο¯á=–M¨¤d­i©äŠQïRÞ‰ñL€P‹±I‡±Ìú7î¤y¨L+Vjö©×®…ެjïÚðX u¿VðÑ‹X±s ã I”÷iÄë£ P‡>6ŠÿjF§ÇtN8ÎØiû‘+<^³EÙö Ñ>>wKÄ0ãQ,X[' õAß¶ª> ˜¦ºïG±oñbzXçx.q÷@ÂNûâh7¢ fŠ`z@S ÁÔ0Y—Éq·P°–ÐX”$ÔpõC ê£S†_hŠ+@ÅÔÓü4±-M6sM ¶¦4—";‡}TiT‰‹Ø6²yƒºº H—pó"%¤2¦`ê¾-˜Yí>êòëb´ÑîF…ƒéŸ$¼\\ó4«åáõÝÙ4î*ÂaSD •I'U}3@x'Ä`™„ìüèn)@næ¯!xßú„btÿCe F$·³fÉè!)Šó3Êfäöܲ=E·Ò@!ñK¸Òô¥Ø7TS¼Ñ„1÷ºÃÑÛñm+Dé-$?i0Vš–½ág±ì¸VLqÝqËvYÞ‰$ nTgU3t ìáàcäf­w$Õ×ûCÚThê9ÀÜžt©m/>ÎÛ¿†Ç.@ÝcÅj«{Hf;}ª¥àA#wǹUœ5*#Ë™‘}r‘` ýáL œ[%,¤´ðz¡ÌÔ´¾ióÄ=K„І8‡‡â¤k¶”úCp…› tj+¥A“ñ°l± ý}Q\ö[cõ§ ¨ÙÊiñZövük©8‚N!ÕäZÒçžaÛk¤8)—áTU¸>†„a<<£pvpò/iµ£©;.ïíôì“/kœB¹‚Àc˜ ¿TÑr¢ìkϪ>`ígÕâ'u0EÝð Aº _&âË5ª!þÏ&_^æ]/ãY„3¿e£èä¬c}qU3¾µ“V>Ïeëì]ò•ÁÖ‹ŠjR@AµmXg¼ª‹u¶=-˜gíù²Ù˜ y³x½‡°¤aÍà!aþŏеæŒßjLÇÖïá·(¾AAÅT¾Áv5oçÀå°:¿=ÿßÝø"Ïç\¹‚š¥ðAF>Èàý¥Ìi ÑZ9»ØÁŶX%®˜Æ\kɉ­´ry.tˆ[.©pß^#jqc³9}-чD9 3‹NáÞ°œbÅëẔX ²°¤ž¡xnOã  Ä0mŒ ƒ•„=ø]jû»óZ6a;Ôl‰ë“vª .´+…MIÏ(é[[ 9£cêp^[GÔâb Q¬äY“ÖR¼&L2d¡[Ëõîâ:¸¥ v6ÄÆ–H\[(«¥×Ý"r-ùv"×[ÞݲtÇtÅÝ%x?ѱ­ç(ÈK1Ù\ž¤aï[‘%¨hx#>åô¯ä¥ÒXŽr°\+uçQØÚ¿<ÃŽJt\º c<Å*I_ A42‡Û-†¾[upUÝ´xƒ»R³?nù!{ÉQøÜ\=+Zö¯qË^IÂ5«¿½TrúÄIF˜»Œ4LƒŠ4 £V‘ÞHñŸ«2še£±†Peù‚ŒÓª3ýFßqñƵãÕió`#×òúƒßŸ³_9’ð–¡ìõøg¯Ôé¾ÌKJ¡«]Ú÷¹Ä~?ýÓZí}¯šZ»ÞeÊSK¹ƒ-VÎwù4×Íåð ÜÌæò_¯‹´et×qƤEŸUÔÜëàûP ãÇ ÒE¹jc!Ñe‹jªE×-Q Åç©æ_?ÎL,ÅYµ¹˜Pš›àÃÄ“ O…z÷2†Æ‹L/%åA‰ýâYŒÛˆë”x_¬*ÆÊþ•NX•÷w)‚æBèwJÆÀ'Ÿˆt&ôÉìoEÝ|ÌVÞ¿‘iËû罊êVúƒ1¡Îæ†õÇ-íkÖ«|´ëSîøJtõrštŒ÷ÔìǪM»#T(Våú*ÊŠ­#VÒwJõï£ÞÂë wÑÞ_Q¬Ç uf·:6—ls§—Çmæ µô0ÞµšêÀcÅKè¾™’'ÜE¸É)-¾..r»œ0Ù2¼ó 8œm­¬bšÌ gØ@GM¨!mþP.Ãõ@tܽ–l;É?M_¼þª ŸRæ˜s¦ð¦®à<ön·T&º%5ªé¥ÓžslДö­Zœ„‡GáÕ(óšç<ÔÍàrè Nf57w³ÕÀJÖ¼Þz–˜S×W%M+ë¡W 3íaÒßF¦ô-¹P wÙóÙ»Y&cžkT<Õ(ñä=N£!g=fC¢5à\ÓóN{Ù*âXjÃVs²ûKQàpÑO>mŠK¡–ý±_vg.«èaG` ºþ™IŽb0dËì3‘Ò#å†2Á™µ<Öœ>»þ˜hÀ|Bɸ‰²m@8Ñê±(;õ5dÕ©Z6Æ&‘¦‰Pn/oÒˆÚ~Œ»t’4@yJ"”ö\R]ô¢0ÃNQ‹•øÉ\A™É¥ÿ×|–Ÿýðˆ["‹ALg‡¿{O‹Ž—O kîLÛL­¸ ³fB×ùŠe˜õÚ¶Œý½ò Á!ß?Yމ…gU‰¸bÌhT«_ÕHï™ÙAõ¯ÄEµ¯j(E'|Æ@ ƒ8¢Ž|R¬ Åì]áÐ÷J÷Âz)¡éUI€1ãŽ!¸í3©x¦(˪I–A“`Þ€Äò%p ¥Û܃çØ ì~Þ \› <À ¨&vj—ûqB*èUÞ<2YæÅ­Îí›§¨»ã7`œ­®ž64oRpŠÏyW2qïœê[ÃzNãÜœ§FÎõœx×_0ÖsJ´*]¯¬ é ]Œ]Ö3~>1< wœ™eèÀo¹aP/¼SÙ#w¹¯‘EœcF#°ˆ:°I¼Åžð­¢Îöˆà½Å–oà„Þìé1¼†¼ôØI¡œ¶ÉŸŠ¾œ€¸Â-,FʧA:5îÕ&Ù}ÓÍ!Y„`nT¡ŒI>¸K*Ä”v“¾ëäºn\K3'\èbHtÇIëøJU¼ç/€ ¤§@ª yøê<;8æ=à÷pØ›õR× ñ…^Ø…#É)eNx§'œÁ¾Vf´Ÿìá\ K8?1v™t}%W1â1§Äv{2aøy»ÀD™(GJ’$ÊxŒOw¼æù­dÏhžQÜ"„,Ÿ¸Ai‰H™K³D]^Õ–‡ òð•öˆ vÇ;÷5N¹!3H±m+›ÌTøsEJ¢1˜©¾Wý„ j’(‡gCЧ~ã,ÿ|ó]W·oéYsSñýŽøvQÂ]à†;7ñ]Õ6GÙë,‹áÊíÅ„c 8ô (7fbÚ» ¸nÃÇAðH7Œ¸»®*á'Q©Æ¡È¸Tç¼i·krß´»Ï[–w-3y8©‹ÿ¬ý­=V^Ìu'|9“j´l·$ß VPfgÚ ¯y€60Ì<Þ\ýa9#èT‰íÿb±‹}㈲këcÚZKNÛ¡a›±}ã¢]\K—P0àÖŽð=N2È&–™"éù$r<´(–b…×¶Ä•zœ&d°0¢âu®óàmç0¿Q­KC‚VTô¦¬Idý—Ë ˜†ÑA@mDI83XpXëá•Ø†GŠ9‘â1P0§ãA?Ç0RB¹#'b­GéâíJ‹‘¸ïí3G‡=2[KŽÑ±"¢{æDSVµKà$ä «OQTÄ…`ìgk‚nEÀ5»’Ô2:C¥8OŽ<^ •9Kš}I³Yë¼—ë–ô½úNrÇQ*àG)¼LÁ±(ÙCIŠ}½¿Ó>G=޼ÅXÈ´Êš¤ï0¦­µd´Äë]•7·}Ky‡RÞá.%=Ey‡<è CâØ¥qvJ1‚RŒàûRŒÀ,õ¥ÁŒÄ}HÑAÒš`o‘°&¹<Ù{Û…7x Å‚ËfÁaî+s9=¿š…ö+ELTßi‘/ß&—Îx<ï&rnàkJì’`]R"®[^…{Ó`9£µpÐŽÍBá>ƒç‡ß“Ë뱡Ýyµ†¿Ç—aY†)¿0ÿøúͰNúW¯ ül\bã£VÞèš#†±Z†5Sµƒ£¨.O[!MsjÖsýûú4ÍÌU˼=µëgÚ•– „8ñ^¹zN±—§fÊ[W!uí=|¦‡ÏLKÝò¯ÄؤÚZoƒ^ò¿;´Xázf6yÖZÇ|šÀï™yÅ|Æ>Óv€®ç’]Ò#$œ?0üÌÌL{†OsÑT:ÇCÞÁ3kàÈ)ìÊæ^øž^מ½Íèm˜»4Y0p•.7˜–É%ïÏLï‘ÝIôUãÖb í ½¯!žAy·à9ÆØ1‡3C%·ëªæÄZÖµ®"<ò^k¹"é9¦&=>þh«b endstream endobj 4605 0 obj 4309 endobj 4609 0 obj [278 /XYZ 39.8400000 722.899999 0] endobj 4610 0 obj [278 /XYZ 39.8400000 722.899999 0] endobj 4611 0 obj << /Type /Annot /Subtype /Link /Rect [227.039999 743.060000 325.919999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory >> endobj 4608 0 obj << /Type /Page /Parent 2 0 R /Contents 4612 0 R /Resources 4614 0 R /Annots 4615 0 R /MediaBox [0 0 595 842] >> endobj 4614 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4615 0 obj [ 4611 0 R ] endobj 4612 0 obj << /Length 4613 0 R /Filter /FlateDecode >> stream xœí]QÛ¸~÷¯ðs8")Qp(Ðìf ô¡@úpèC‘ëµ8\ÝÞCÿ~eËözE”ôi<¦½L€ìÆ´Dr8óqf83üøç¯ÿXÿë÷õLJ¯ÿYÛÿ|øº*6…/ú?ëíß§ØfãlÿkÝTÛnÿ¬¿}_½¬_V_V_º_VÆïÜÿè]ô/üýÛo«}ç«þ“¯í~ûßÚ®ÿÒýï—õï~ü´ßö ßWMë·¿üÚÿb¬±M÷ŸÓß¶ÿ^ýíëߺ!4»÷nÿýà\mª¦\4Ž—ã£f÷÷ôQÔY±.­)ËfmŒíÆYuäøï?W?wo;cÓ–ÆÔ¾¬‹Éo­íöµÝ+×mí×®.ƒ—s›ö*³ôEeSɼh;"³lj¦(ëø«hÒûÊõÓt¾Y:Ó㻾ȇ‰Ð~;"³pnâ‡ïú""™öU2_"~z^}|2¥k¶@ôüs7”šõ?ž» Wë[¶õvýüÓú‡¢p\?ÿ²úüÜsY¯-è²,v]n¡ ï²¬w]6›¦-¼­vˆÛ·˜¢o9~P|Þ}PuøÛ˜7_-Ê]K¹)]]ía»o±õð%v÷A½)Úþ»^oÌ®ÅØÃû_ŸñÓLj;~èGÿúA§ãá뤖.Â0¦ky»|ûnÛM5œ•ý„ZLƒZö4:×Ò–G؇ÏÔð™‚xµ«æÏ'Bϰåi~?¾-2S1&CøàÜ fHGÑ“Îo¬ih+Ä>îw†Ðã¯â±^÷Â1Šô§TeU7ŒG˜ß¡\1h€Ÿq"$£FØb!îEúCÞ âDÕ‚¨bKb†Q|p°cüúšÅpæXK‡È-3V PÁ,FÑ5ü^6Ø®ýŒ­aÆš”ÿ<Ë) Œç9]3ÝëS†R/ëî¼M¤-Üd ÜD ¢Å`õƒ.T¸Áá¸mÆÕ¶1V{¬jWÆ0}táp usÉk=yåÂiᕃ³ˆ<#¹I˜v:xbÚL‡ó«§KDÈ¡‡’ì‘eœNðÚÕßeXûÓm.o@›r€¶×ÎyØBEdDÄ fDa‰"#­Œœ.› ܸfÚz›Ð¬÷Þ,3ů׻•8ŽÓ4‘NóxË ¸%¤Üh1;QL3]chÁš3æIû4Šõ°›MfìåtT$ˆ„vŽ#~õülÂÃ-[î¸Òo¶û¾òÖœ~ðëêëÅN<¨l‡0•‹Ãq'LÃ>!_ï¤Xö´ŠðL ~à½OÂi8Ã&Žo\ä eŽ'wºÃ8J cµnìyîÎg3ùlFÆÈ¯UCÔwö8¦Nï°½ßܘMUú7ªN(ꄹ0Ãþ ‡vqøÁè¯ÊqˆÂË2CË `-XRÜÄÆÙ9Å\]ížõ[wè2àV` ž0¸ýF`Ôß6ïv¸L ”‰Oç÷Pã›èk7ÚŒ®ñÓˆêyn¯†Ïó²­ýÐD æ5üÀVÈ$ÚsÛ û=À•PÐ^œ­0$&¥ 2ÃIk1B°¨¤6~}¸d-ıuaïŽ!T±é|‡Â£;ôÇa‹sˆÂ޲z÷ ÛwÜ:Ã|Õ((ç0A4­ËÚvož°+Ö‚ßõ–+ì€R7áÃ=êÇÕo‘~q(cПÄéK²D´XùYA÷Á·¾ñoGzŽÝaË^'ŸgÞ¦/سfq?@s=ò6lzãgpX¦5¤Á¨‰?o¦L ž)^båRæÑ¶8LQÆy†×ŽÚbŽgÖs<æ*ì¤Ãý˜ù<ŠG€iyÛMr¢,ZFx‡áLQ¼ ÄúDp”@>Š{‰pÛÑ·©huqt׊j˜ŠLcöCbçg86"ñ±lÛ ¦1G,Ì!O„˜˜HLë›Äè÷£-àùD0šÑJ0 =BTê£m‹êî²û»ìîªeuEfŠçÑ2‚ä¸"=ˆâxþ€]Gðƒ#H) ƒ‘&F÷ÀÏÔŠT,Ý('Xœ(Føns¯ÕòQZÁ±ýITSŒ¬¶˜;}—‹ Däþ&ùò¦u@µoÌ‚µXí×OàÍ|©f›8ˆÿ®Ôã妘À±¸SR>ecöäDÖÑ´‡^ÅŠßL赪/£1cû†ñû2š9åƘ½ŒFõja¿WÂòˆgZb«ƒ¡5Έì-Ä‚1Ï”:À>`¬—à~˜`z‹á,sŒÏ'Ÿ%ߨ¦éij?:-¯ÈûA|YîÃþeá³ E?FÓVãü’Ñê.ý­9ø»5m†¶:zΰ<‰}_"æ_Œ«ØÞÃ܃ñ›Ð+,¶î ¿]ö¢eT$wÑQïK²;o[/ñ"§\-båñ ”ÎOœžfyNAžµvdœ¸Ÿù@‘}çm{ìUO¶…mTõ—²‘ëùì‡ó<$ìådÎC"~p&kˆ‰Qf|³ E1ï0¾œ÷Ãñ9-ç¯e½f¬½3»½½' C”°&rò‰yŒÁNb/dc³EuÈd(]AÑšÉ["p#r„éGO #4ÀÏ0Úéõ³ÔdõIÙŒ3ÑüÍHÞÃJx)yˆûÁer, Žd_ÊâÏ;:z„¿Lm¼ƒQTÄè ªãËfrQçXŒe/«ýÔ‘Í˧"ö»€õû©é¹ð‹‘FFg“­g µÞ™ïôÞ¬ô‹T™ÑÙ«› Uɸ3ŽUC®„ÏFÏ@U8Ö‡(´–ãÁvÍ™h—ÉD›' ¸ÅSrS —Êîg²g_Wé¿þI'cÉF‹©‰uõ³cfåî-Z.â·»³J”Óš9Êã$ê‘õÃ\_…u‚«W+] •èìïþ-ì[¾I»+åý=¢wÊž“(eOkiYZÕü"Ö<¡iRÚ|†áFã™SDw'ô&#û¢*ø nyG˜Hè8·yÎroþuUÿb3AÒµ¬ô;ÛC©Ýû㘳ðëãFü›ô<ÞÖäê °³mGÇ¡¯¬Ç–àrLy#Ò˜‹n#’Ž#ß+#G÷ßÖˆž7¨ynÓ¾z®MŽÀçjûç»{&Ä~«èA•ŒN †BZva1µE©˜÷;ó+iú ¬«È {”õÁ(ÝjÍ6kë%õú´bB)Íïý¢Õ“©ûi˜ÓtÑ3á“þ„=ZY' €Þàˆ¨tpÆ+¤Žð‰£‰Ëê(DíoŠWm¡ò@™UÑósæ¯ca2UÎUí®¶¥¯šÝÅ —h5 ­››…ù?{ß“ý­ì¼€Â~;%YˆÜð©è·pæp—£f·«Ž•qÎcnge²»rÌHŽÙÍ4ûí´«ÏÎC Ñõ‘Í妵ÒÍdš‘.®–uuoa¹‘K)IËÃ’t®æ¦* cs$læÈð À¼£´>ªöj³(^•‰5c²‡p?ÚEîúTº=?Ãd)eí'£]Ú¬ï'R-€ˆïQ¼Å–Å!âOÓ X–~”>Ù ˜½€;d/`ÞMäw&VS¶JaöªzK¿(º2Ûj’Q*FÞ”ÍîI¶•Mçžd‹³1gßäý¸ Ô]¼3ê¤ìU¹ä¶]µ¸ù«×®§¢ãeo¶¸Iɸ7Ý—ºµƒ±ñ‰ ¡ÇÊÞ}MÑM6b5áóÙŠMIÇqŠFxÊÞÞ¢uÛï p¢Žá—¬Öõ³Ÿ…ã¿™½€ˆÐÊñÏ^V· •?”rqj³ßu0­N§ÊS–À|α›i¶õR°õ”ª”_?C™¹ožÉÉÄ`ß¡³E²šEmdê´ Ó ŸE0udÏVdsÂtk‡éèmB•¡rõ\Aý‡\A}×"£Í`§pn,îï®ZˆŸ«å*FSøMeGöfIÝ9á9Wbº?é}Öó‘²sR®…Ãø>oÖ2ñÎÎ!{8I}#{8³‡S\K .ÿõuHÅÌI_-Š|Í‚Á™©–Xá k"‰3g$VEâ4n•÷õ’Zš²õØeÑN6R?çbgI§%]4gV3ßÙ·nTÎdu!ÙÜð:ˆ"ŒvùN8êN8Æ&[ùT¶Æ+ö´17WÉžÔ03e¤K}Äþ•m«*§‡Äµ[’µE­ ¶¿¨’%‰q½º^CeTâ–¬Á%P;LVæ4-¿®ç%ºlÏ”swD#)¨sµ›¼w3ã“>1y"·é· N1Þ2· Éžº0µc”2à#õ1dïáÕ½ëVgwõ e1v1#µx§ÛO9&b0ñ,º9vÇ€¬{pV`Þ?¢úŠì-ˆLu:¦þ9FÙÝs<O™p4n…¯›trd«¢Q;¿V ²R F­Œòc2·Jà·Ú´=kŠxxdëÐgg‘±]ýþŒHÞ1aÁÄÞfŽ*ƒ½LUˆIIÏ£l‘Äãä›"¡|!"ÊV¸®!ã7Ç\ÁDf170ûãAÀž ,M„:Š+_›ng`ŵÆoší,×®88úö~Þo|s^ËMO™“–~ l½©c«Ó–žœõ™–ž œÛØv×ÓkKϺUµñÅn†`{®Ÿ>ÓÂgzA¨íÆnÛ4dœsoëÙðô“GøÝž™›33|BÏìU‘s-Ícµù¼gö+6gîû±í`×m·Õë% ¤Á?³ç> >> endobj 4616 0 obj << /Type /Page /Parent 2 0 R /Contents 4622 0 R /Resources 4624 0 R /Annots 4625 0 R /MediaBox [0 0 595 842] >> endobj 4624 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4625 0 obj [ 4621 0 R ] endobj 4622 0 obj << /Length 4623 0 R /Filter /FlateDecode >> stream xœí]K¯Üº Þϯ˜uL¬‡e( äu tQ H€.Š.ŠÜ¦ÅÅ9M¶E=, mK¢=3·'r˜c[)~IKòÛ?~ùûùŸ¿žß~øòïó7øùáË©¹4ª1Îãß7á/¸¾nÈN·ÞÎß^N?Î?NŸOŸ‡œ˜š„ÃEËÂ4øë·_No ó“ùÍ—¨ÿžùùOÃÿ~>ÿõoß ½ñ†—“îÕH<‚qÆõðŸ/þëô—ߺ §vÇß¡EÇxU?~¸GÙô7|cÖœ%ç½’gÆøÐÏvPÇþqú>´æºqé%c’]³¹ÕŽÍ2ÕŠsß©3J'­&Âml«²!Ñ bR44õˆUÊÆÙ­´Uª}Ñ ?FAÛ®ZeÐRµîGÐ âðƒUIšÇ[*Ö;ÓÆÀ¸¬V¼mªZ_’+¢Ô£:ªD³šÇ›*V½ì4‘ÉÛ–ªÖ I4„ChLméÒ6l˜·:-Q:ä3L±C+|œ÷€§8¦eHks˳¿{œÿ¾LYÇ[ÙPzÎTŸ§ÉÕ0HÇ(¢ SGΙVI Œ‚ÆG’VN¯ÆCc’¯PíUú•rhføçÈ–­ÏèáÇt˳¿»R¿c‹ý`¥À´7"™_‡4;”’F1R9½_€Æ$5¼BµWÓX€¬@›¡ÔLyšKÏ×Þ_+ïèŒÍÀš6AƉ׌fÆ´ìýÔòZÝúö M,¯Óç И¼À7е)÷B9S¬ÇÒ“… ·<û»ëA«†9˜*Æœw˜Ó0I()0ŠøÐÊéÕ Å$^¡ÚëØÈ t`4–æÒóµ÷€vjÓÊ8òšÓ´@"ÚD^§[ß>˜V^§O-&¯åè¿Ö”›&xCzëqôdaÓœîî&íï[¦¢qÞaF·<Ÿ’RRá=BÀ‡TN¯F ZLRÃ+T{µƒ¬@{£q4—ž¯½Ÿ´f`M› ãÄ+¤ÆýýÔòŠÀ)„¼ˆåuú´ Åä¾þ«MY˜LÀÞz,=Y˜ &íÝ •ÚáGöÞ;Ìh­-˜ I)©ôH øÊéÕhA‹I* œój¯7b#«¥½ÑXšKÏ×ÞOZ3°¦Mqâ5£µv@ªÚT^5äE,¯Ó§-&/ð ô_mÊ­K/UXOë“®é–g7h•vøQÚ{‡9mÓN )%U©R9½-h1I[Æ#µ×qësK;”“Ñ´>×r|íý 5kÚ'^sÚåœC›Ê« †¼ˆåuú´ Åä¾þ«M¹óéeXO$`]c 4@VƒVw?Z{ï0£;—v’RRí‘ð!•Ó«Ñ‚“´kd¤öz#î‚ܲ Œ¦ ò.Ë×ÞOZ3°¦Mqâ5£;ŸsÖm*¯€ò"–×éÓ‚“øú¯6eíÓË>°ž>Hºto 4@Ö‚¶k”ÅO×tÎ;ÌieÓN %FZ9½´˜¤À+T{½ë ·ì£éƒ\Ëòµ÷€vjÓÊ8òšÓÊåœC›ÈëtëÛÓÊëô  Åäµ|ýךr׸ô²k¼õ8z²0m 4@Vƒ–·?\9ï0§[›vI))÷!àC*§W£-&i£u¤öj#YöFãh.=_{?hÍÀš6AƉ׌n]ÎI0´©¼

    -h1yo ÿjSæ.½Ho=Ü']Ó-ÏþnÐJéð#[ïf´´i'”’JÔ€©œ^´˜¤\7‘Úë˜ûÜÒ¥1,Ÿk9¾ö~ К5m‚Œ¯-]ÎI0´©¼2jÈ‹X^§O ZL^àè¿Ú”¥K/;XôI×t˳¿›´J:ü(é½Ãœ¶i'”’*Ô€©œ^´˜¤²ã‘ÚëXúÜÒ¥1,Ÿk9¾ö~ К5m‚Œ¯9írN‚¡MåUPC^Äò:}ZÐbòß@ÿÕ¦¬|z©ëQA¦”-ÐY Z-~´ôÞaF —v’RRí‘ð!•Ó«Ñ‚“T)©½ÞˆU[ªÀhTwY¾ö~ К5m‚Œ¯-|ÎY?´©¼:jÈ‹X^§O ZL^àè¿Ú”µO/u`=:Hºtk 4@Ö‚V7ÜâG7Ây‡9ÍmÚ $¡¤À(âC+§W#€“x…j¯7bä–:0äZ–¯½Ÿ´0°S›VƑלæ.ç$ÚD^§[ß>˜V^§O-&¯åè¿Ö”uãÒKÝxëqôdaÒh€¬-g?œ;ï0§™M;¤””{ð!•Ó«Ñ‚“´‘:R{µƒ¬@{£q4—ž¯½Ÿ´f`M› ãÄkF3—s m*/œBÈ‹X^§O ZL^àè¿Ú”¹K/Ò[÷I×t˳¿›´²qø‘Ì{‡ÝØ´HJI¥GjÀ‡TN¯F ZLR.›HíõFÌ}ni‡Ò–ϵ_{?hÍÀš6AƉ׌n\ÎI0´©¼2jÈ‹X^§O ZL^àè¿Ú”¥K/µ ¬Gú¤kºåÙßMZÕ8ü¨Æ{‡9mÓN )%U©R9½-h1I¥à‘ÚëXúÜÒ¥1,Ÿk9¾ö~ К5m‚Œ¯9írN‚¡MåUPC^Äò:}ZÐbòß@ÿÕ¦¬|z©ëQA¦¸-ÐY Z¿áFÛ‰æ´p“áµ-u’F1R9½-h1I—‘ÚëX¹¥ ŒFy—åkï§m°ÛF;Šæ´ð3aýЦòZÝúöÀ´ò:}ZÐbòß@ÿs¾…›Ó¥€,ª7§»–j÷”.©§iHLçWlNOZúLrL ÷ǤüXxðý×ÓÛ'&…O…ùú}èÈt´Œùñu¶=¿KéôùëOçß7 “8ýùÔ_Ú^t­9‹fõÊ{ìŠPØ•æz¥CùàWp>OÏðügD‹¶†j¿ÂðÖ>¡W>`W$zea|t¾vðà½æ}>!Ð+ÆF?}P¶;fúÎrýHŵGX‘Ö›ñh—–Y–lbÉš‹ê˜”«­»4‰BräEš ¹5ÓW{\3Þ¦èÔøX‚[}ÈØÈÔ…O2lêëB×Zô™¸Óà˺Æ?Ewð§UiÐ>óíJƒV÷µàAÛ±=ݱûb(Üú†Nw#éŽîBob¬ ·ÖZå@R±¿ÁàðEÝ„üt˜¿¬i+ žh R f·¿‘ÊsŸ€”µ½50Ù‹î5ŸGSŧœÄˆ ž(YߊC²d6ÄgÝDò×<é i÷Üîf*¸†c÷Ò8tÞ;,_+OçõíHo¥û 4•\Y¨ú¼žYÀΧ áQW‹¶†_)éþL Ÿ×˜g§˜‡ÈßÞÞs‰þ8ÿ$šš×Ôt¯é6ôTª×¸ä5.©ŒKˆ+—ÕV é5.9..!žáqyŽœu´|YG6bÎuWÍ­¼j“­]óúªíî^µÉ-b½®$z]I´âx‹Á~Ï#í;‘ÛçkwºÔ¢‘MÁ³‹x¾.pÊZÆVqB-Þ~éÓÄÅûGj­K¯\á¬Sí 3z´0ÂëÖ˜D³«“XI%)UàûBçÆ’mQl›Wd9^±‹Übc¬ìZk¬ŒµV8å*›™Á»´RÍönÀltÅD…­†&ŽùŽÀ‚b—+MŸbëYx614Ü-•$¹¸CÆg‘íõ ËÍîÆŽYúôÑ'kT—ñù—SÛËðϧ/»íÄ 2vaFV¢ÔþêÚS5±T«Æ¹WcþÄÃp튵뮮pVðL>ÓcÏ€_`âb6nW .p‘<ºhT1ÙP:ë\ëÑk.Æa$¸i/<ö%à ®ðYÇ€Iëšb?—¥ÎÑ^@µ#0y}ƒw6àÛò ®üÛ:¦ YLËcÄ ²qt¬ðY•íšµà#‚Z2ÞƒkÁÇ·AŸyÂzÀŽª™+éRð]2±œ`_­¿}9=‡…:¤%Ö…z4ª›$æ&ÉJ–üÕ®3ò¬]^dDù¸Ñ-„ªqš± X\IªˆkòIDœ£<ÎÆN"ð¤¤/%pG€‡ÊÛ‹5©æ]4ïWÇãû…gìlÕ°x&F¯dCÅ'Ï¢)\ª¤÷ñ³û—õúšÙ„¤¶s7¹d*šú2Ì wŒÓ׋ëu íZ˱4N©Ø­¼|•ÿȨ}ft±¤bQ"f,ÖX¨ŽnïÀzí±H¸ç¯Ñ¸pvœLz!¢É$|b(ÙØ[a;iàƒ;y½WëîêØðæ€DÔoðÞÅ›’– ¯ b^j«^Ï<«ìŽ?ÃmAžÅ…üŠ-‹øææê dÒF•×^A<í­J :¼.mÑïJäwüÞ…F`ì§ãvÛhú’nõðˆÚv쥚;ï¦U¦Û‘1Å­®ÈØÈwë KõƒÏ™ûOà`½+ú¯GͯFRi$NÙá4Ó«#¿¾àq!û#;`Mñ$èdïâÑÛýD%;$’?2\ÝŒ´ÿàv¥T± G(þ>»g•×7 Ê{Ò¨ð•ÞSÁz梨Œ3ä×q¨×÷—&Z±$G¥Ý½Ð ½1–?¸õ(N7?ÎN>¬Z¡ûáßFð¡mSÙ>àï/·ÑBUã¨Á:\¤kˆLÖ„ì¿xÆSHÙ«ë)ò—²1œN¢› ç áÙºBaiqËÊÉ®»îdîöxÛ²Eæö=vk»»ðÎÜ•Û}~ã³!v[/sx~7­›"Ù »}qq‰ÃHù´/g!j*«}o¾ž_rÈ9"œëÈ’NPdè•î¥çJEÜlùùÁ‹®vž]ž)YíWÒƒã—p‹¾‹ñ€{¾Œ}°ÛS©¢]Û$öU°)½¤¯—¾ÌÍpÛt4ÃÍUÉ~탧ìœÕŽ5œ1l÷sÚÌ—ú_Pî|Üùܤ®§ü’ƒ{ñƒañ#@ >Ë@—,¨DË8 z´8Nky'qÜý5C²ò¿æÍuÆœ¹ï6¨œ8¬ à |U[“J¦ |°Ë“þUéìÑüã]<ê·I÷”±Géþ^ë¥ÁP²uÝ&ã‹3F.I¥IŠJ}$©®Nv¯UŒ¬È»G§;ü½PÆ ×«ÐùmÔ¨rH’åÛOÓÌYqÀtŒž&¦’¦ ÔXˆ ië ›ŽI²úŠ`.M? Òý…c>ðAÁv뜹¥d$aE-ë¢ò›W·(²B’8gýÿ­!ç«%ЮêÍ_;ØóÈ‚.žO×R4G'õ‚¶·¯åüÊ}Ìž¤lZr’Ãë)[w7]œÎ–óñ±÷ù†¯ñÙ”«§ïcóx ÆVO grn9Nmµh[ÒçLRR«ÈƒÓT Ö½ÔýfÎwlÄR¬ñ>Çc%þ³ "¹àüñWäI¡¾‰³>5ï?jÊ+%YÚöƒwÓ©sµ€–1ÀuDç#gõ{f>mM*;EɇîKÞçˆÖ’3ÝÝÈúƒäÜmèºý×Þ¡Ï çÑÛõòW¾^€??E=¾¤5¼×øYù _I@O·Çû†ŸÖ¿ð­ ü|}üË ¯/¹²Èå°™«ä|ÕŒƒÌiJ,‹IKލ§}P”+ÔœÒJQd¾Õ÷yKÖ m¨ ¬çÕøð%áÁögI"¬$¥ÍXr‘ó^âë G¿ ÈH4ˆß[¼Ãã®%›xY8øªäÜùØ®×3Ý×sµK&  çÏ¿úÇcüãí¾ÏP³øhµ³V¬rXHæI¾—ƒk|Ÿ©–Ì€8ì2¾µ{ƒcô9‹æŽû)¨®¿ YØBM²Ä¬`¥J;¬O–›·ˆj÷5…혮X½wÜÚ‘Š% fïggë­ª˜oö')Û?t¤¹ÓÞ™=Öï¹ÿ¼ýTÑZÏíÑÍ6’•Ç“|zŸô5ÕÅ›%?·Y¶G%Ò¬®"" aŠÌ7Í"Vßâz¯Z%›Ñç‚rvQåë^KÅ;Îêãhuûøíx:æÈoÝm>bÍè°%ÓÂmì—л-Gêdd¨6Òo;–¬Y£(ÅlXBE9I¤ê¤x ºïÿÛÅŸhó©ÀÇ|D}="Þût¼cø‚‡[]…‰Ï>R¢WÚÍNå±Sêûz‰×EÓÀT¬[±^ór«$dN*(ÙêžáÚjJû|’Ÿ3¦ä’*Êöbkaܬn¹o¡6ÍJ¦™í/ IO+\HTŽ:>¢Â»Óè3ã%ÄÚ÷ÁJ³ç‹>–¤h@jVwô6õæ‡í}Ö¬÷€¬Vˆƒ°EZ[&ªí;/“ŒIIµ ú´'ÿâIŽ$ÃÆÒæ[Âx= ³y]áè·ë>mí »²px§D[û˜ßë…£@qyD~k÷¬7Ž^èÙ}xkª¼×ø™‡¨\£GíâÒ¹Êã;?3–ÛmÈŽ.žíû&§¹·úðÉÙE ‘Èöí¿gZ|¢¦ãáïùÇ€Ó†ã ðãÛËpSÄ7ñŸ1¿øèúEufƒW?¢ÀÔÅìNœ’RuýÕC//HÙˆw—îzœÜ]¹b` Ä…÷W]SÛ^”±)¥Cùhô™}ÆAÇ/¼™¶ÜÅæ­5c¹é>Èk÷BIðŠ„OØ3à8¯]a˜€À¼g`ÄrdVXÝHó–Ù­¿¬EõW` ì€%ÏÀW×T“Z> endobj 4631 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4632 0 obj [ ] endobj 4629 0 obj << /Length 4630 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÑðM xgÆr`Ø@‹‚Ùl‚ÅÎ"Îò÷#µ¤îQE•(¶Ô­1`{Ìæ«Xï*?þùõÇý~üøéõ?ǯíÏO¯V0ÚÇúëÃõ„+¤h~µN¢¬ÿ¿~;¼ß/‡—êûû›SÇöGÕØMÑ øû×ß›ÉÍ_^?ýµúíGqüKõ¿_Ž?þ½úñS;^ýoWšú—_›_¸àÂUÿ¹þ­nü÷áo8þV-ÁÆ­¿²ÔNÍ[Çû¹+?}]wE“±£J¹j‰\TßtŽÿþóðs5ÚyE©8·FY=ªݰ¥5Gëém-n$>w ­ušN ›µ3Δ ŽD†»aö´ÉRÏÝe7ÒlpYÆÓ T¯ˆÏÚYw8îV‹DøÞ4\N¤:ÀjEiðŽD†{Ée"|ïFš .ÍRN½¢4øG¢Â]s^ž6©¤ ¯n¨Ù€OÅàO+âó¶ÖB>0ôF¨Ó6uõsæF»¡æBÌp•çO+âó¶ÖÞê%‰Ú%.j×{ ão‡Ï\IWk™o?W+9©ªÍ·j»úø¡VJ*Ê|ûéøGÆäóŸŽo¿ÊB—ÒêF·mZX‰Z¸C-öapñœÇÂ[j‘ŸàÚ\Ûì#§¯}†-_¦ÏÃà)07|¦‚ŸZ¾¼Uøº8öI1z bƉ!±‚Is¤à2ÞƱMÂM`Ú„øGÛ( 0` )]ÁyK9šÄ-e*¾Q¦QÉÊÓp¦;ì®Ï=u!…ãµ&|iix¾ºlþ¹ß·?gýOôÇhY²-˜w„µ´,90ª?osN¦Ü Ê«¡i¼µ6§ Õ|ÒCD?ê²²›þ9TЏÄ-˜ðž–FîêlûØí!†‡îi€ðáBlƸƒWЪ†1X¥¾äÓ8ŒbãHµë»»¾» öérm,m×´Vªièó‡99LÏþ„! ùS:­6‚;X·éÓÚ­áÝ^¥¯ÀJµg×{‚ºø¨-Øç…V¦6þ.-ž1°„…Û* 1ó{ƒµˆ8dŒ®}!ÛKØÂñ–·…‡Ÿ£¡Y†;Þ_NãË:=®°B“„A3& ’0ÃóàÑdR ›ŒµbŠuÀ8€ûQ¶ðé*¦À'¡ƒû´ŠWìsLŸ 6•!ä¦?ÆeÜ«JЈȅÿi<¬tT ìÀ4÷peÀýH‚â•VýUii“ |¦åë­·¼²ætgy±†%ºÂ•Ì|¯¬aáêÉaìI]ÜŸ¢Åâ+*Z+ôôÕž.…ŠË›ç¢[Ñ¥–?o¼â<%4¯•>:n(`%†ð.x96_ÊPÔÕ¨KûÃá‹>Þ¶šÊ(ú ,zÂþ  >®QôhMæð Ì,±Í;ûæšAÉB–P†”¢/D0Ãôøä>qQØë5s/sŒÇm–ÇoVË¾Ä po³˜„£ÏéúÈX+¶ê=„52=a3A3XdÃD7E ÎÀ¤"e´3Oð¸ùžg4dÄý{/55œˆ¡R^Y} Ç*yý‡_¯‹åv" ­—ÐcG‹³@«lÎxM’göÆëÄ>ºMÍBZsDÚàC€Æ<²¥ÖìÍ`ò•þâ°F¯ÅL9SJÂwRËïsB û-œß%tï4è¡ xu~â ¤,™{æÑÄÆ×g@¾ˆµ.‚íí?ÆLBhÛx´ÐðZã“à6œºº$³–}Ìœ€þfHÑíäϪRö©ûÆ1çÅéa8½ó˜¿bž¼©° ~›6ë÷Þ8ï,û JñoÅ»'r†ÂK‘ܾç!ïyÈË`ŸÑãØ·â<ä] Íhk6s¦qœ¦²bXSò0ásHs”ÑÖ‘ ]º.UGbJÇ»Ãr“@µ”DŒûˆØ—!o·B½rÐ bjÔÓLuø™Xóï²[: Óê^‹àÓûð'ØÇÁ–® A#. Û(Ö—yÔã¬h Q-ÍÁëBô½¦­óa¨ÏóôUsú$^5o­yò¾Dõ¹’·6 ¼çÁÐÁ…kcHIöh©ea®P¢‡{ÂSl•ÉŃš¹3ñ4œi( †ƒŠt.‚Jœä1!cìγgÄ—Þ'"\Ëf2­0ì4áöE zĤRû^xJ:]|bÊ9ãÙ˜KraQöØpà´q(Þ+HÏÁôE8ºY|ËK¢e„ÈbÞã¡1L¿^ü(¾o’}úi ^¢%}pBšñŒÐjë"]ÌTi'MP‚‚À)ðæNÓ+Ç%Ñò‚Ç5~¨kýÙy_Fţ渂kã8”"9nüÂ,4×8ñM|®YL¤ 6léÆ÷º®LûƒXô6•6|ŠK "!¬‰]Ç8L¸EˆW@YuÒÀnËßûZõðèæ0}dÞk 8B#ª¹‹p„=¡bO¨ˆÀ>Ë¿§“¡•–À ãÓ"r'Gð2×]ü@‚¦@Bñ´€¥„s)•0DñÚ(©0x I«MQ Šç¡TÓÀapJI>Œ;7×Ír ¯-Sù7, °Æ©Jø´ñù`Ê"`Þi@ è+·¯FCáUX›KŽï帧ÈwŠüÀ)Q$I‰±®¤`z¦TÈ¢ÔÎ"`IcºyÚ*ERÒµpúß°¦h%¿àö/paŸÈ¦c·©ìHJCÒù°¯›R~‹’ɽÑÓ¦è·Ií¶ýä2ÒiF¯ŽânòŸ !ž²¿»¿{ÆKigàåãÈ3 eìy ùôδ’{4v•‡6µ™A›÷¦—^r&œ0–g˜c«ŒqKeõ¬X‹‡0¬ÊsåŒ2UËñ;úéÖ3RE;ó=b•oñJÍÄ¿Ò(Y…ëÂÊÛ‘*Sá’ £o.æËýBvî:™›.U:¥&k¦šj”]࢞øYVJ½GØ'Ï«ä˼KPekIÆÜ<†tÅ™¯ø¥žã„">ãP›ð`ðôÊÆªËŠ™Nà0)«èM!¼ø Çiê­>žSÊ*ɃÃI”€&èUzP˜q³lIðrùzœJô$ú_k…ÄÔäÝ”Q;óÞ9GDåâÉöàòÖªajtgÒ+Myþ1þÑÔQ9‹SÁèÎQoW~ïÍMŽÓ3ð¥¾@<ÊUDÂåRu›;Íè¬56âJéNµ+ ZN¹~‚Ã%xJ)ѤɮCé8Ñ·<`šK{…p­0è]ÅåASnüeᛟðã\î¿=¬)éºë¸toewI—R <­4¹7鸎ÄH{.h  Âë»”«ñ¤kg‚ì¹ü:%õc›Xе”uh¶‡üíeÖC%¾jF¹6†µM“¤ ¼„TDÒ ç„Ë>ü§Èû5¿¾NI Ä\hŒÒ§Ñ\Úµ812é“Ã:m‰òLÞ›lŨ3]èOË-'Ðöí‹'Šòc¼¶ùtw.‡MÒÓ%(ÅåkÛ}`«¶ÚסùºKâUø \Lùν × dÿcô*û9 C´žô¹º{óìE³Öâ­+ÏEI×Eï,f¼jʃj܇»k›4_&¥ÌHZ®H¹Z›Ë†Éy·<æ¼¾¼W}߫᫮õÇÛ_¿æóÊ. } .5ØutÎy¼-Ê’›â”a|”u¥aׯføÊ]©Šæ<<Ö+laûÉûÍQÙ–Æí&e!Ê^*s›,« Ó$_^Z,œÇÁ>%ìÓ0e+ ÁdÝÔGÊ¡ÑFsý—Ïð³í’>£>­cq¨…£}´™°Óú´'6eïíÚN0ëêßëG…»Q5„8îÓâ÷ú´7¼ ó1â†lw ¦´Bjˆ0öÂyZ!5ÔŽÖÞwZÆ.XåÓ ^‹EtÙ¦uLëÓÌ£]!›Œ÷ˆ–ÀÚžÑ<ø 1Ä}Ü‚aŒyG«˜Î¥\ç˜)¸åÎÆ’0‚-W2ü%¥$=¾þìH endstream endobj 4630 0 obj 3326 endobj 4634 0 obj [281 /XYZ 32.1599999 118.100000 0] endobj 4635 0 obj [281 /XYZ 40.7999999 462.739999 0] endobj 4636 0 obj [281 /XYZ 32.1599999 118.100000 0] endobj 4637 0 obj [281 /XYZ 40.7999999 462.739999 0] endobj 4638 0 obj << /Type /Annot /Subtype /Link /Rect [75.3599999 427.219999 107.039999 434.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 4639 0 obj << /Type /Annot /Subtype /Link /Rect [93.5999999 362.899999 142.560000 370.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings >> endobj 4640 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 72.9799999 148.319999 80.6599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 >> endobj 4641 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 64.3399999 135.840000 72.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 >> endobj 4633 0 obj << /Type /Page /Parent 2 0 R /Contents 4642 0 R /Resources 4644 0 R /Annots 4645 0 R /MediaBox [0 0 595 842] >> endobj 4644 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4645 0 obj [ 4638 0 R 4639 0 R 4640 0 R 4641 0 R ] endobj 4642 0 obj << /Length 4643 0 R /Filter /FlateDecode >> stream xœí=M¯ä¸q÷÷+úl`{EŠ¢( °³³ ƒÀ#‡`œa¼12ñÁß’øÙ¤JÉ¢šzO³À>vKM²ŠõMVñçÿøòß·ÿýÇíç_¿üßí›úûë——æÞðFþ»Mÿýä~AŽ¥²Ù‹îN‡éßíÛ÷—·/Ÿ_>ÿÿñBøüCõg|¨‡þãÛß_~–ƒ¿Èo¾üúDZõϽýçøéo·?ÿ×øç/ª¿é…ï/bàSãU6%TŒÜÖôð¯/úÃíïãÄÜïôÿŸZÖôYóøa~JæÿÜŸBƒ57F»aà7Bè8ÏnDÇÿÿÏËïcof÷ÒsÖ7»{íéÔ-§ì6ôüÖýNØöuE2;â„õ(Í3"y ‘fœÌjW©¨ç´#3˜íH÷™Ó]e£ž³§£iF$4…ú•®î]CF&îÛî@£¼¹ñ®å£MÆ&1À[jÛL½òjßž„ÁïΠ¤§ÆÀöã âFš±c5êØ1¤†ò?p6,Lûqä,põXn÷S\‹Íï² Ã«FsñŸ…è±ÞñIÄ«æ$ÍIÓqÛæê•Wûv&Ž»qîýˆE5h?ƒ$zhϪż ©Èé|n¢ÂiÑø]µ!HåX.Ús@ ¦Ñ°ê¶˜‰¦¶M¸W¿Ÿ ¯zaeŸ½"V½6•¤¥ßdžWãÖö/Û¸ðZ|~Wm^9–‹ÿlRîGrÕ¤ìPnsõÊ«};ŸiûFJä±Ç¾™eÒ<Ðc[ÊHý6*¤j §sÉ¿˜pZ4*¦… Uc¹hÏ'b «j;D£Û3a©qõûL«vîSÁ8õØž1nßG†×àÖö¯^‹OÅ´¼j,ÿ¹¤ÜOðhR¸¦Óæê•Wû6Ó²F+½±iTº×n4_É&&¤r §sÉ¿˜pZ4j¦… •c¹hÏ&b«j\iÏ„¥ÆÕïc0­\XÙ§„QŽõØn Så/m¯Æ­í_10*¼Ÿši!xåX.þ³I™Q£ôXkD¾isõÊ«}i{é‚L=öŒ™ÚÆ‚UMLHå@Nç’1á´hÔL A*ÇrÑžOÄVÕn¤7í™°Ô¸ú} ¦• +ûì•ÿL¸×¶æ+ÂÒ†ðjÜÚþ£Âkñ©™‚WŽåâ?›”{ãéM+ò{ëÓö½ñõú%õÏ´b²ä b¡è±m,XÕD„T ät.ùN‹FÅ´¤½ã•(´çqo}<Õ§",ëÓšqõûL«vîSÁ8õضæ+ÂÒðÜÚþ£Âkñ©˜‚·wÜ„õ•ô;h¥'HcD¾isõÊ«}i'ëA ʈ±ÃÛÆ‚UMLHå@Nç’1á´hÔL Aêx% íÙD,´Y>µeŸ’°t{&,5®~ƒiåÂÊ>%Œr¬‡¶5_–6„WãÖö¯^‹OÍ´¼Ž{‚°¾’~[£ô3"ß´¹zåÕ¾À´=Ó–ªÐáî·«š˜ª“í\ò/&œši!H¯D¡=ŸˆµY>·™‘ô¦=Vk3(ðNŒ!Vö©0„{mk¾",m¯ 8‰Ç±páµøÔL Áë¸'ë+é—¥7*oC=ºÍÕ+¯öí|¦&ÄÉAàA[[°ª‰©Èé\ò/&œŠi!H…ã•(´ç±6Ëçvo%½nÏ„ÅM`Þ$µ°sŸƒÀî·ùа´¼·¶ÅÀ¨ðZ|*¦…àŽ{‚°¾3ýJ/›Äˆ|Óæê•Wû6ÓNÖƒT‡¸ß6¬jbBªBN¶ó¹‰ §E£fZRÇ+QhÏ&âA›ås›IoÚaéqõûL+Vö©0„{mk¾",m¯ 8‰Ç±páµøÔL Áë¸'ë+闥ǘù¦ÍÕ+¯öm¦µ[¦ƒ³!üØ6ì°´©–© 9ÙÎ%ÿbÂiѨ™‚ÔñJÚó‰X›å²m$½iÏ„ÅL`Þ‰1œýÒÁÙ~l[óaiCxMÀI<Ž… ¯Å§fZ^Ç=AX_I¿½QzÓ¼4õè6W¯¼Ú·ó™–4vÏtlÛ-aÿƒ±bu\=–Û½dcLp-6ïÂðŽ{¢ðŸOÍÚ>ŸÛŠ|Ýž)¬7ˆ…0+H`&u5èUˆs@Fœšâ•ð—ÈןŠãFY˜JNm*ùÚ¢}øúòó'ÂZ1eÎý}Tesú½üóõûKßÝ~b”7#æ¿þåöoMC>üûíëß^†{7´}'óõå >!üÍþ†AOÚzÒü>ù|òKü HöÆÁ' ¤ð `ì40h<IÀŒkxnàâôàpn-ø ⺟4ŸpR<ü¤…é ~’€Q˜BL!pâmER€³†¹>o+2–Hðš‚mAì¬Ì ^9o+OÀUH›ç·¯£Ö-®sè°Mÿà“y ó Üø„‚k÷Æ@ùÄàYãÒ%¬Åa>ûxàÚ3‘³ö t-¨¹Z{\¥µãÓé—¦K“iJÊõ¼ÏáZxMVÆüÊ8 $ÅÕ3°ü‡¥/¬RlŒM y ½þÝB(ӣ¶Ú|`2¬‘“éµ¢£r±¹wŒ‹q:–($ùw÷– B»”™Osý½zÿ' TJBˆáe¼ÁœÃßÂkN@ùº µÒ¸&+³ße”ª{YALsðL´ù½Æ°8L@/8€;‰˜I@ýûñšÃ±M0‘”åƒÙ~²Í:Ñ4PRêw½'ö…Ð . –€QÊEQ Bgy¡p\ðj •±ÂÆ (kL¬@…²Œ0•˜€5Ìp=ø$œ}Àµ0AÁD!"ˆ>:`uº-Œà%Ø$ä$yÎ5 ¶%#4ð~ž^!éˆñ"ˆ„o…Æ}$EPò&cÔ;ñÝ2æ ã ¡ï—˜Ê-[ ÞcwŪüeö¿X ÉoÞ°Q°² ìªtònîÀ7WûMÙ{4u0n8‘ýÈ xåL®®¯Œ(Ù rí¨ÏÏž!íD˜×ð« ‚7‰±O$p Úþé†À¥­™Ì/ Î<6ÌC:9‹#:`n…ghÃÀþAF( GÌíw]B!±‰ÎÐŒJ`&úqw'1r,# †Â °ó‘Ú¹U[ÂÖJÌ!!öÎMo¯l$Óð„,¼“´²wï Ã;ôðn#¼o ï''ì‘*–*¨Áº¶õ°«´æ KªUqCÃåX„4xdÅÖ—4+Bi¿æX‰ mí³²sJÅöÎé¥÷¨s >S φ>ÅŸfM8°rö>ÉŸ]N9 c>™‘pʈÁç·A¼Ág±á3e+'†` áÁ]íŠO8 Ï-åTÏʉF£ ÿ¤Pˆ²Eâ¤Ë9içÀóa-¥Ûú#åœk‚tÀ•øÈZ/eÖÝ„gtž>uàIó–oë磲›V,„„'ÈYG®IŸsú×΂OY¯X 6mÊI~øì1Ü[’å Cš€ë [,)ØÁ]XÊ'XFGYm+9¨gêW(äéë“"µŒ½/äIhÖz»²Q–ðŠô…×ûé^;.]­p*<03Y*âúJð Né%­\Bv÷Š ˜278–’»‚jÿ¯ð6TJT&…ëazKʇYï«)õ]Ý_;šŽ>¬yGó@o¼#×>Å.Z¾ö)‰wÝ6×V… Æ|B…“óîStüÚ§Ø5·ƒö):¸ÂL± ^eŠÏ½"/Sô8ŒQºŒªyÅ3âàœš:$T'3,&„p9¡ÃG¶Q#ÿ-RðD!ì;ï %ñ¿!¿@¿Ÿ(±±Ð›Ú$#ã£QlR÷èï‡øÞÔ¹J~oçSœ‹*ÐïMì"Í}?d&qg곯ÎHw—ÇEÐøqÔ™Ïò ½9k£dÿÒ‰ëjέG”:À(¸ò”D°9DXï-ÚŠã—¼‚û:¥Zñ|RJ™‡©IpbABY¤´x8¯èI…"*ñDàÎ( sfhˆ’ÀáþAK`…ûÌmSe©‰œ#½ ¥Rö",Vr‚2pfÀV ÙÕl,3ž†™ d…®,jNÉ0xι*+Éœ90 KDTDX‘˜)%à`ôÁãp}Ôïɪ:àKÝÿÑgCºGÑ?‰±V|Ùƒ{x·“ªP Çú³#ø?‚ýR2ÃVìXÀ¿IOÿ-Y’¦i÷+ÄÔÐçUøÃ-{RÄq…÷à’ò3*-$…È÷óT¾¨Àì<‰Yᕞ9t]&¾‚ ×xñRZ‡+­Côøh8û;.èP$˜>Váä 'ïgÍ Z}vR©ì˜U6œcÉy/%Z|Ú0+H«Ó'¦ û‚Àuý†…¾‰IÑ:¯Xú ü¤å ˆn%>—¢I`o¿šÊo/šå!±Í»GZ[‹“åïC•<¿¦é§3i¿e²9¦ÑA;y9áÙ"I›eö©cÎ21Í£ÂSN% ¸¤´£ƒ'’._D¹%;'1.Áú;jû²LÚE5ç5 Ýa™¡Lê¹%¡1T<û¯ö.s\r[ü¢ÜÂyô]}8lïª>1…Y¨Ë欸¯çDö¡pPÎ|ŒD)¬‹æá‰2ÿwÁçdE=fü0S„óÜGÀ·ùuåÜJ0LNn'´MxžÑÜ©Œ6Ê÷‹gd´Qµì¬}ùóÁ214ý¶¬‚#ÛçmØûDPRo[êZ 7W/e3bÿɶÂ[)'ˆû•tPËî;œ.»#˜¹Ÿ àaž±}¬ ZY……í’àÊÅ£gåj¬Ä,Iw»lÃí3Ÿ×j•å·‘óöVÃ#¯EùÀ‰h=íRK´¨Æäúgågâì{•8Ór€4¾I39œº­[Úê(°ÿ~öl”dDz±Ìœ Í2\-ÛÈE½¢@8`è-”õˆØòŠ!3”Ô©„„ùgI%ŒõÄ©üQ ꨔú2»Öç‹*Q­ónýá7ŸZZ‹D()”‡Æ—ƒO:Q‡­Ì¡|T5~t”e‡5†"§r5ÞVa©§GËÊ\¾±‡q¦ ƒÃyƒ©ü‰ãù"„`û.2äDwwöýÐHUy©Ÿ& iÐjB^G0ö–$QÈÆÉM ‹DÝr¼œÓÂIUEQŽ5Vba]vé$) —ü–%Iòë’¶õMÛB„%â¡T¨®nP£aEݶ9êéQ· éæ:„å‹:òâò9w< NÉ qbzŒÇ•:AÀêÚØŵ+P±æ©6d_2–Æ}…óÖw¶&N™T\‘úÜb–#œ7¶½U¸Cíb^z…ŠW0ÿ&5ž5 ÖLs‘¯ òÛ "' +‹áí#)ÌM¡‘+!ÒGkc ~?[È*_Ó1êy É$ϘôqÒ]µnÿµ@ooß­3c¾í#¥×L×Ùi7ÈóÙøÚ K1…¯ 2õÅ9ýúkƒl?\d×Ù3µ•à­§­ÞúÙ‰rƒNéqVpBO¸ØFÔ¿¿â÷Wü¾¤YS²"ÁÐùœ~m\[õˆÅw¿¿ò¼ŽÍóÚÅÜ•$aÿýÀ|ñí]ûF´!àüQë±$"a >ÔpÝ)÷^ ¦\Õ­‘/–Æp[sj>AäYR³Æ—Ï*ãDŸ[OसÌ¿-\£Ã»<¢«þõuòÿ:ùŸ¢›ª=ù_ô.9â«¢«þu£UïÒàQ.]ÃTb:¿½jY_‘ß2hÏ· _ô: Ö(W-kä#W-ërղƊB3}[áŽ<ƒsÇ*ˆSÓÖ\ró¶Ó%ÎP>SîjƒµO8L½Ž%¥iC<?¹°¬?X{ÞFa׫ðö½Üò÷u «d¼—¦àuæ ÁzO8óÅpõY¸ï§ð6íÌUnç<ê%ö_ur»±¢Ú´¿®»ºœí뺫Cü¤¢¾uçñóufêýºáÏòWq%v5±„Ë _éärÃDV¥n8£¾‘x¹á;V÷rÃß±>œûþ«¶…ç² +r²[r]¼uùî—ïž$ø*q®Šž<1qùîï×w¿Ÿ®Ä§ñW£Iñ¾ŸÖBϸ!«ñÎji;¼ÛSg—>;¨Z&9¬ÊÛ¼Ú–oñ³R¤Aá²£÷ýìvL¤ÿŠ˜Ã¸‰Ž˜—¬Ã× >Õ”Û)k¤ç^ùd{Pqå“]ùdÂUܦ(ú‚m>‹VFÌI7å‡q;âÓ¨Wú{?xÂ@‚6ŽíúÄ‹];áßG!ew14üá ïÌIɲ…)ßÀÉvK3øv/áú'!Ñ„OšOvYáu³ NÔ‚7vÁûö6­[ßÞ§Ž¿›ÏãÔGo«'ÓŸžŒ×ü-¿õÍ}&ËñeõÍ·>Ü ¨DÇ…Û‹þ$ÇßWŸéô³›ÿkŒAÆßø3ßjÝ^áøöò×—xÀ pBö1‰ÙU–\ЋG‚^ZÔÀhs»frJT?G6ç(C AyLjö ÕPÏ®·1K ©f&šA± íˆûÅëË—LæÈ#st‰¹æ3ÞøMÀÜãwŠ}U/úydî¡Ybn1øcŒßÌ- ;«^áx2sÆ{ÄA˜¦›=L¡Å,ìšS œ}Tì!õ¬ ŒÍÐBL={8êö1ŽÇ†^óíÜ/&ûüòùöc$ÙhnêϷﻘ¯ ‡ü¼jL­þtÛ ã72N{±Ø<áw¹mcRŒ¤âüΗC»H—ö-•eåÒ/<‘ôжwê›HŠÜº;—‹èóÒ8üÍþFº“£Q@Ï*üö& >´Ò–ÞU®Ù„Ÿ ß(J_zB 8”œˆûZ±ØÕÜfÊ º©=ª­þQ.,á/üE$ø •¸àMHñ íÀ˜]¡R”‰²Ä 0õ‚ãÐàoÀÞTain0u¼°BU!ßÀsé!¾¤"á7rœNÜ[Ï¿‚Ÿ¬Ìí4¼†0)HûðǰìP³\Îí.~'ÓVé^&¿€O:;¥Ï˜šôöùå_G=Šð endstream endobj 4643 0 obj 6855 endobj 4647 0 obj [282 /XYZ 33.1199999 584.659999 0] endobj 4648 0 obj [282 /XYZ 33.1199999 506.899999 0] endobj 4649 0 obj [282 /XYZ 33.1199999 454.099999 0] endobj 4650 0 obj [282 /XYZ 33.1199999 376.339999 0] endobj 4651 0 obj [282 /XYZ 40.7999999 325.459999 0] endobj 4652 0 obj [282 /XYZ 32.1599999 586.579999 0] endobj 4653 0 obj [282 /XYZ 32.1599999 508.819999 0] endobj 4654 0 obj [282 /XYZ 40.7999999 325.459999 0] endobj 4655 0 obj [282 /XYZ 32.1599999 456.019999 0] endobj 4656 0 obj [282 /XYZ 32.1599999 378.259999 0] endobj 4657 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 777.620000 126.239999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 >> endobj 4658 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 768.980000 93.5999999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 >> endobj 4659 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 151.199999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 >> endobj 4660 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 751.700000 153.120000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 >> endobj 4661 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 195.359999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 >> endobj 4662 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 231.839999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 >> endobj 4663 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 160.799999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 >> endobj 4664 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 717.139999 130.079999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 >> endobj 4665 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 708.500000 100.319999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 >> endobj 4666 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 699.860000 179.039999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 >> endobj 4667 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 124.319999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 >> endobj 4668 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 682.580000 162.719999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 >> endobj 4669 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 673.940000 134.879999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 >> endobj 4670 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 665.300000 130.079999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 >> endobj 4671 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 656.659999 147.360000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 >> endobj 4672 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 648.019999 139.680000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 >> endobj 4673 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 639.379999 138.719999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 >> endobj 4674 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 630.740000 148.319999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 >> endobj 4675 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 622.100000 127.199999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 >> endobj 4676 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 412.819999 88.7999999 420.499999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/guile/docs/docs-1.6/guile-ref/GH.html#GH) >> >> endobj 4646 0 obj << /Type /Page /Parent 2 0 R /Contents 4677 0 R /Resources 4679 0 R /Annots 4680 0 R /MediaBox [0 0 595 842] >> endobj 4679 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4680 0 obj [ 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R 4664 0 R 4665 0 R 4666 0 R 4667 0 R 4668 0 R 4669 0 R 4670 0 R 4671 0 R 4672 0 R 4673 0 R 4674 0 R 4675 0 R 4676 0 R ] endobj 4677 0 obj << /Length 4678 0 R /Filter /FlateDecode >> stream xœí][¯Ü8r~?¿¢Ÿ˜Þ/@°€}lÈCÃòä!ðîf°È,âìCþ~¤–¨–X,ŠW©Û>`ì¦$’¢ªŠU_]øÛ?ùÏËýãòÛë—ÿ¹|›ÿ~ýòB®D‘éÏeüï×u3WΦj#¯ÌŽ.ßþxù~ùþòùåóðÿï/TÝœÿ.º!¦ÿñíï/¿Mƒ¿L-_^ÿuø×ÿ]Øå_†_»üû ýyîo¼ácÕøÿžþAefø±þ×xñ÷—ûåò÷a æÖïøÿ_¹&lUÕ<¾/ÒÛëG±ÁÈE0-)»PʆyÊa9þ÷//ߪj‚l=Av8Iø86 ')„zdnzù½PJI £ú÷$÷÷dó{º‘äe=®>þ—“–ÏhÖfù¼Ž:.ŸÑü²—Ÿ¸|ÕÔú]ÖÎNÓUÃÒY7æ)ë†ðÛƒSÞðç¾€îWë5¼5ÿAÿLSV ²žXá†ÃÊøÃ0~È0ÜJ|Á)×LŠáßV M¤1lø·æóŸ4¢¨~HIz©‡RQÁ^_Õ=i%õ4ΉV¾¡2ÞUÛObg|y©«ßÞuU¿Žc/zæDë^nþ hOm¿‡$K£ïẪ_E«m«žFÁÙä{ø=Õm€šƒ†5ZŒ^%Í÷›]L):þ¥)5S«¸h2Þx³³æ–o/Ê^)µ#ñ¸6eÖ½¸_ÓÃýóo2>vñžZ¼1†–o/ÞLÆ»øº—í{| ®÷¿lÖ„‚5¡³ŠÝ×ä{äÁ÷__~ûdGòë_‡Kã ¿N}öqùõ6‹áêŸ/ÿDº|ýÛ S\¥PFËÛ}·+Tß®ˆ«àZÎ&í|EÝ®˜¥¼N·ÞÞc½2‹]Éè„+ú„Ý®è+±Ó%|&4£ÓL®ÆÅ亓w·+¿qÿ–ú6b¢ =Ó7#rݪááœÃí–s qŽ`>U-€s†¶™7æ^æ_ó çpâ®ý1†À9ã]|ÝËö=NæœA~ΔÅoØ^µ’Þ§G©‘hpÙ¯¢TI…Oô,„œé€rµn),JGTL)‰. æFTðùÞZGI°ù3»–oÃCt&†û]dÛ Y3>17¨xHé3´Œm&s»Kn»‘Ûa~÷8ìj¢RM䤘ûš¸$Á…Ûô eîÒýŠõ骅|’×÷¶¼ÜIÕACY5$Ó¼–Ík¢ym|bZÍßî"ÛnÈz˜;Ík¢ùAúÃpHó·»ä¶¹æTš7û»'NÄÜ®¨+£&ù ÎA&La?&7§C3EÖ ÉÜ`¹Ç V„¸aÐ÷=2-Ÿnw‘m7d=Ì, qƒ¥` ¹áv—Üv#·ÃœÊ Ö8-óÕwq¢(¥u¡ùÇÑÉéÔ=ŽÝï·úæ °WÀ\ÒÝÑ:Ë€ »nH•ŠÒ­3pg¾ÿ^7T£ŠJ86s¿MUTÃjn¿±ÅGǶ 7t½¸_¢q¿UUT¡{c PÅÛ]|ÝËö=ÎE•t0ç(5‚ lЏXÿˆmÏ£™£½ñîÓw¡Q luúO¶¢Š§*¹`K”­êyKÉ-o)â­)<ºWòÖÐ6sÏÜ‹û%·¼¥Dˆ·cpÈ[ã]|ÝËö=Næ-½(© ßÌß~Šr„ÅŸÝ›<ÚÓ‹á%麡žö ßÒž!Ú3ʧ £ í m3uͽ¸_|K{†…hoøËƒBÚïâë^¶ïq2í™Ü™©„\‡Oµ•ëTR"gq?ã‹Æˆ:Õš‚; ˜ 0Þ€Ú¨ÐEúXàŠí#ò¾m÷eð%ß,#z+.ßö5ö\±f@ŠÊuCªí¦‰Hi¤4ñ©±Å·Ý¦»È¶²f±Ý4 RR6HÙÅX»w#·Ãœi»iâ)ÜEyÌ6&÷H ²nH&êøš… |Í|lDÂÿÞ Ys'2ð5õ ü±Å'’é.¹íFn‡9•H˜3ð#`ZÔ’o,'¹5> »s†íQ‚·áFVÃí3·Ø‚ºn¨Ö+5ß⚇ð-|¼`lñõʱmÒ]/î×/Ð<„hîãc‹¯WÞîâë^¶ïq®^©Å‚¼9 sÐì‡WøRU%-ôñuC=§Ê-ú e}ÐÒGÆÀ©Ò¡®÷k‹>hB´ôч±pªtèƒëeû'sªZСì\ø®a,cá€~DíB™nïèiµ„ÇP¾n¨g)½Uf ±”öA•±°”v ŠëÅýÚ‚*ÃÖb)íƒ*c `)í@×Ëö=Nf)í@•Hô5.g‰—0Û®óµ $ÑìôÉCw0n£=”ÌËÚÙxL˜uC=/Ûm"ж¡DmýD”±ð²u‰(®÷k›ˆ¢m(E?el¼lîµëD”û§ò²U?(/§Co춃–ø·Ù>bZ‚ã<|ªl,ˆ³uC5›²Íš14”53ÌÞcÁ±Ågó±M™u/ó/²Íš1$”53ŒæA`ÖÌí.¾îeûç²¹¡ûð ü à¿’èðÀ¥˜:E0¦¶qñ{½¥ò¡¡ nÄɺ!“5ÌË-2,”[d¸Ÿ[4¶ø˜ìtÙvCÖÃ,˜¬a¡Ü"ÃüÜ¢±ÅÇd§»ä¶¹æLLÖð(¢.6½|·³d4ܺë)|†F ¿§ÑuC2‰ /•ȈP*‘~*ÑØH\,©D÷nÈz˜;‰‹P*‘~*ÑØH\,©D÷näv˜SI\._¾Kh^°ÁÑ“\Ð¢× ©ªËîz’ôõ(e\NKÜ6 •ú%¾F-ÜÏgûN"²+'¯Än.ÁÂ3Â|ÙÜŒÇS"ò<= +B èkDBEp:ÁÇɈ©à È×Ý÷TàÊ)Nþ`Šîð,®7Ϙ°t‹”²ÝãN¢÷[ÉZ.þÌetS¶:‰¿% —Ϊ9»“ õ[æR÷y¾·Xï–yÉ(¿rá-Ìì cùWÜbÞ§B_cCܾ–¯èé«5~/ŸÐg>¢#ƒWž7s3úÊóf®Ü#¬ \Á' ¦Ä'î£ÚQaÊãëgç­K} M~‚.†mEþ{»¿ÝôiËÙ9PXºøƒZÜcqãÏpð—D-Ö(^JÍ;}ïá÷{w@wlFÄå~’èìuwB,{ÊàŽŒÝûa”“ˆz–1Þ3úkwQo¬'ë8†×s „M‚–a,)Þk†sßÎKÇ…x'Ã3µËÕ9v{ÆÞÐN—Ï«mNS¸2t—"ÎS”X‹û“êœ7+¤o@¼©µ%xb»­¸»µhÈÝ¥Û>K6Q¿ÆÜ ²Úû b¿z¤Ä’gÜ9J2NŠ|ù~Ï£†£Ñþ|&øžº›³"S={­"´^¬V—#ÁñPÔ Û+ÇÄKŸ\ÆôJªm¿=†õÜ:4óöŽ>@K“ºµ9¦vºª—€Êexq« Åº–Ô—€|UÛmh¢$6é$=d>B|%!ÁÁô¨$I+ÃdèélÑžQÐÛ>«>NütÉLBäÒµl}büÍPdŽäpAbÑ>Ü%¯¼Dvïs8ØèŠ2ëAÉ£ÃlVå`"|ÿÀ(»‘bˆæàŸßË›(öMlä ¿$P–pY™‘†é›tÖ‡5"’'P¨¢ÜìÈ‚Lsq¨,RŠÞð0\<ýYø’/QŒO)¢Š¢Ù#``<##R‹-Ù»{6P£õËQÚöËCû L†º•ƒ¹ìV@i(á ÖîrÔ‹ŒõÅÍÉ’¦Æ>LË@Òº J5tñ³”¥‚‡`8äô’ŒÁÈI<’ùÝFñhNü™O»ÓÄPêùkÁHVÿáYô#Óíœ"«ÄÃ`ñØÖ‚Öy¶ýUs*wR“@’&EúvŸƒ”ŒWSí¡ q¡ÈLé fÕHä6@fFiœ ±"ÞG|˜‡‘¾øÉ¨¤Øç|j5É#ÐŲ̈«Wëï»3öü¢t¡tiy†+HOî— 0Æñ|½´@ïä ;(À%Ái~VpV36 ¬/H †¨b†-!Ò*\kû6|ËÞÑ/¾Éî{žJjéëh{&£¢£ œ±;ŒÅzz„œ¡ºì! $ã3à‰ÄQÈ8ì¶$¯·ä”¡Šý§IÙÿ]e?#?Þê›U«ýO¸oW(p½ÐNvåô8 ©ùwì±@¦.ÀÛB‡ÁŒUÁóBEá¿9p&hãPU“üï9g"”þIäl^6˜D>Óp²ü ™ÈÔbÏ=N&F~jn_û êX±0­Æ3‘.ÎôôšÐ‰³ê£GTë’š05­³<“¸ò•‘ÂöÓ¢Î9§±¡K ¦e×éC'!Ç'Ødbª¶ÞºdJD@-¼¸%~Æñ®„ή}^/_Šl °ôÖ¢‘“’›,Å¿4 Î9?–¢E~N”E“K“ZÄÂ$pfÉ©ä@²Ôßh2ŒöÎáPÍÝLÏ(N“—³QS†¯ “;ºd«³LÍÖh‘a-´=çä~©Ø[ßaÉ–ÚØL¯Ψ;NaûËàl_íüÁkWý¨ùÎ-TɈ\tPS·©”A=eqÓSÉÞêåÓíH†y²="83VWBÏŠËy«ÝöÀ•—Þj·U…íÖøxÀŠpO±[þê]Oè‚ëyÓ ñaš O]kóýsGÛ–(J¯qWvI›i²ù<•6Qrà°5 Êj€‰¬»°U÷r56UB°GC䤣¨áÌz²æ yÒÄ]~GHK"÷·€´¹Â*Û· ÕÖÕTDÐÁ$_˜–{TjªàûêäãÔi|ºsÉ´šBŠm£ô®k°À„ÀþΨ º6°:yK¤‚Ùg_À©¿^'£–!®e ÔÑSpRéKÎô•ËÑŠ ´êu¾ÉL²£óÊ Þ®„ÚÍM*€–%mâ&…>kV+#'¤{ÌØàZè9†v‰!è‹„H¢NÁN}i%øhzyÚm«eqÈŽß0^.ðJ64 Ëîr\‚s-#&µs‘ÆUk×h8,õuok8À"\JÐ6©4^Ýv.oÙ2}$Çú8G4¶ÉÁ@¹ÕÐ(ïZTø|U`my`k²±šå™“åþºX }iŽ^™™ :‘fD.ä^î1 ætÇã¸ÖÞr´„T© ’æe.ŒvCNº¨½ÞÖt£WRì qô§eƒgætÖÐ3{†,áþžå³À@Îðœj-¯ÆËAwÇzSho3½\H¾Bgí`fS¹ÐY;¸ÎÍÁÍY3lEg*­õQð³\òð;…iµ(C‘ÊMLßt”2Csàd'•¢ Þ'©°@ë«Ø–à;2=ª挒Эeùç'gAU¢Q•Ÿ·¯á¦¯sÆc!Eº§´Ô÷m±ó1jGôdôšS-£ÖkO;­yQÁ1kB_¡˜bÐnx!t…¡W8zå»2ë~¡gLþ3GçÖÿØZe”ÏÙ}T„ŠºumBZ&(G‚ÛOSMúãèÔø,úLŠîÃÃÙ$@ !į&‰ºdF-BR›¨}¸‡:ç˜1ÜEþñÎq)ùÆLfeÇÄe)ÅœÉì~Ë«öC¥Ç¿4øîÖª/J9[ßµ|{QòJ©eÆÐå.±éE¬ÇîŸóñ±‹ÿ4c°ño&Ã]vÓ‹ÝŽñûËû_:ÁŽNOÖíhI‡qX‹N¢òûJx±gð+%½ÕUù xS> SÂñU“Å'+´?%€ô¢¨-ÕëÀû¡Ÿ <Y5|) ^xÞ‘CrÏ+RÐÁß`¤Gá°J)Á[A4|‰”¬:梢ÒO‰Ë1c‹Nv«Ô¥wÛPÖ'ѳ Vµ)…ÔtJªyí‡Þö=q¶ær ·—(~(‡g ¬´ûæ@›^q2ÀÍÀ5 Â(kR& "ÄÏË%oeØ„²2f#©ð4§]›²ýÈ5»ËA¾©ŒÃÓ}8¼yP©÷þYÄΞÓ.†¡#yŸ.Ž â9=§Bx«ø†žžÆêvÝO®aØÕˆ ³>–|þÈ…J€Òü€^ùØ’œÏ$MAìi>“²Ê'SRŽì="r¬äãE¿dœÙôDŠ’cA‹ò^ [ÞËœƒB3|¢fqæ2¬ÕÄäDÃ#Iún™Zƒ·C·& 6,|“C·%ò »Ù€qmN¢WÞ¡oú¾@7Ü›uOcl³k“©Ê-¨ˆÞ¸1· ¢ÄsÙ-¾[ðv—Øô"Öc8· "*àTDúc -¾[ðv—Ýôb·côw *ʶ$JO^%Ôy ".EÔã6K“zWXÆñ%à.R= 2CpÊ ãÓ×›SnßhZh«MÕÇçqà= X»T‡Þ9ô”ú¼=/Q–D —¼ƒ• èÜð7(b'ª[Jpï[%!ÛåüÛˆ É@üZæhìì’ƒadÀ+5\Ú¦ŒŸTôµ)¸ñ<.ã®.?_}óJ/W2Â’C@ú;ô§O¨ËF”#°’RvõÂ$Î×O3Â]Ztò8Õ§š$w.:UQ.ç”ÝȹÎî"ì ¾Ó,ÎvaÑ …©B†2KÍ<¬àÍ«±ÀBWPþð÷a(€óÈ«ÃñÕiæ©O` MøS³FÉÇÇI)Âh¸Ï '¥ˆÎøÜJ|u¸O¿‚¯ÊEá-xŒºÖ]7‚®uÄXð>§^\ä?²ÿ_·.Á¿Ï£ˆHæ ‚Ÿ‡mñg"sÃY'²¶ýyM#kðÀÛζ‘ _Ñí¥ÑÈR bF‰øºáBºDÍÂ{ Åão³Ê´)â[Ð]"+!?üãG„'Nø‡DɼˆdO×åKaä\ûÆg€3ºn%b„Ñp¡†3MQDoxx{wgëŒäk+cN“ AÂxA <ù¬Iníãi<ðQ|ðxMš/X|Åû¸_[fM–™ÊAÿ \ÅxEüŒÉRãŠ!ßEÇf’uARzú4,ó¾È~«|*¨g‡Î±`sQó—p»` =#¾æó¨ï_d]w«»½bÄRgªµÃµÄˆžŠÜž.˜‡\â¦/n{hñm­…7d9**žY~ƒcܸ‹È÷·íÝ-™~^TFPPQͦüC J4úH¥H?h¦‰Çhì•›aªiߎØúa_%1´-òº¢3( ,RXç¼SÞB×ÒÏKìi5¡›‘'^”#•U€P‡ªíVºSæßÔö7µýçRÛßí(õ>°¢m‡Õv“i™MœsVx—¬†šÊ¾ûçCv¸+n% 3HH#:ýdŒÅL Å™;Ï“÷VF5©Œj‡Y:—TBî®×Kf<ÿL‰qMŠŽuW%çÔdS·uxà,»µm7üwù>°ÉÀã ó_ßþH*†D`1¤ÏQ–‹>º_MH]èð!¶¥ê:ËÉr4Öô”ºªðæfÅQ4˜¾ê0‰ëÀ•‰¢9¿2Tþ¤¼ªéóø´Ç ÏXô™I4ive„‡ …z›vÝò½wÞ½oø {f¦áÐнÇ,H󞙿Xλ¯Óª+¨nü7“t)%&Ññ è`Önòè§xôÛ2tÖø•ÈÊ~Àxÿ‚úX°8Ÿ¢k€ÓÐÄ¢.tÖøÜæˆ> endobj 4692 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1738 1738 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4693 0 obj [ ] endobj 4690 0 obj << /Length 4691 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“#>ôŒúiÀiÀãw׋…gáöü÷­¬”2³H}$#¤”YÙLW—2%ŠŒw|ñë?ÿöŸ‡ÿúÇá×O¿ýÏáÇü÷§ß^šcÓ5ç?‡Ó¿ÜþBG£Ï?öC{ÔãéÏáÇï/??_¾½|›þÿóEu¯_œÿš..8ßð?þþòëùá/çßüöé_§Ÿþï ÿ2ýëo‡ÿé¯?Í÷;}à÷—aìN?ü÷ù¥•¦Üþtºø×—ûÃáïÓ†×ûžþÿ‹±Fkm³ÖñóòUõúßíWÑÚƒÕc3-N)=­³¶ãÿüò—én—ek”éuk§ŸÇÎöM; zú¹7óŸ¤')k—g ½>´½÷ ï}o¥òï4X©;¶2ïåÕï${Êt¯¯>¶Ùï¾Ü*µi„îtZ“Ê{¹ù<àŽ£Uª?C2×Í‹3FŒ–[åxá´&^€w’å…¡ã…åVù»xÒ$2w:­I†àdÏcìG)þXn•»‹¦iL+u²ÓšdøÞé8tº·m3ðç”çL¯;½¹ºÃØw‡Þ·’WüöN{x¾‘í”ÌN+RYo¦Û¯Ý雈¡§¯†ÞÏÀ?~ùõ«²'qÙ¾ÿeZÈ«q|þëû‰òúÃ/'ãbÚ·ï:üÓDÍæ‡ï{íhúölNŸ¯¨]Ñ]iàÝšðÊ'xEõÁ(üÆüw§ùBSs~Ηï¹äþN~h^^Mc^̇×G¶“«4(ÝÞ.³½2¸ë¶×_œ—köü7¤á}·Em†×+ÝQ«auŸ¬Ký±w}ž‚UêõŠÒËR®WF÷&=\4¼½5î¢sv >Æ»«·ø™þÖ¶s?jàcð6º7QMúðkňA€5rQOà[öÈ#¹x2®\6öèï±KeÞQVÙkcݽΥ%÷º{]ô™½óL}ÓJ[ÛXs³ÇˆXŒ¡“¿’‘þÂIqíI/oeXš@yJ‘^cbÛŒèj‚±´À‹zŒ‹o‚ ±’¿±þêÜ$®½¯Ä)Ú'5¨Árp‡œ.ÕLŽÉ3ÎíØl‹kÂwÝí$…Ɉ@0ÁJšo% }ãZúºK6YÄäÞ„u0qÊðXÚóþke¨Ê€,ø ÷R±/ó0ÁsÔÞ}J YýÙ•ú_*XKCuãr8îð™nÇÏİùÀ¶ÿWx7GÁ‘¼jlãHŽbà}ƒïX\5¶ðñ^ãç°Þg€§ðþ>ÀçlJa§aˆ¾ÞóŠô•G]{·¢"RŒ½Æ«fì¨ÂÂîKélNoF–³°rƒgŠ'M!«ŽðîD¯ÔQ-ºéw#pïóÊS í[ UËàéKê¶9;{Ãq›î­ÿ9‡,ÛÅc»^ÁY¿óF­yíu‚nœWÀ{ŽF¸ýañŒ(.+hKº×ÎÉbêÃá‚ô} D2{®x¡!?6ê>ÆZtæÐ[z–6Ô)œ¯µ#x°´ è,‡¡þÂzE8¦RW¯Ô­ê]%Q<àÜjåÒ‡]õ’$éÒ ò²Dß¶îFîÆ¯-x”j·¶-SaË‘òPGá°{À‚ð‰éôÀ áçy¶V¹ cŠ“¦ñ3ÞÂ5ÔX‰¤®Çâà†¦ #_x·éÁκƒÀ¬À`’x&9ÀêØ%HÏ1RPvƒßà xz‘cäzo£ÑÂ!žF»JC×xîâÓ"$›Ó€JÝ·ü.‘¶Ë~$ ›“¦ïÚ·.\ •"O<Û.ý1”A!¬Ìc"ã* uçò0AxD´w„ØžaÐŽo¼¶8fÕCamñ*”¯ðŠbÔª48RªbûÑ%q xà+°!…Su×*Š `9Õ XÅâðÁÈU+éùk³nN­øO¾fâlÇÙćH–w}^pû’¢oZç¡LhhÂ’8K%–;Å)²ï=ŠôdÁ"ª#wúP%Å‘Hd¯ðÑ…¥H\«,ËÖ%ñ÷Íòjâ’ [ƒðó¸Å£·jéüqŒ®ÿ¾n<H%,KF-+e%e!¾ &„F0á»›dÏwÕÇóy‘nôg§@°&Z—s3zZñæHÒ+^ÎûQ•qp$ ''C°¤ÒcZ, ‹G˜Ü±´ðŽ!NÚº¼ˆ3©R W8ã>tÙÀ0¨€"2ÊV°1]bŽ:ÆïcšÒ‚¤o”k¢ä{`…h­Ý%ãMÇv3®<Â$)[-w _ÁÖ>ÆD ÅMãÖ†R©ÌœÈEå˜+÷! Ç"4ÀIp·¨åý/£†øbÜu*ªðd‚ÑÞaû$‡Dy9$é.†E»7ÊõÜôæJn„tåtÝD(.Ž^xÞèŽ1ó»K”QV$ÚÓ‹PN n¤Rî¿j'Ó_ú9b{—“^ƹxœqÇUóØvÅuUð} §k#§$ôé'äø ¤ó±­3-ãLáû:Up·t`Ðh€p|¦ø|8g:ukW°ÜÁÑA8$üx® ï«°ËÄâp Ùm²zé.…£’’ðÒÂjTYç­î@–LÄÊÙwì“È3 É,‚_‘7"xŒ ¯ÂÝ¡¥!^ §š{O¸>Ût.'ßCÝvç7#ª›q½ëö °Ìºý²ø÷ÎŒîÿ¾v7ì›`ï[Òª´ëMëìn+ç)¹šÕw#rEêK%„DlN¶á8¨Øšb$ìêe —K޽+ž]ž‘$E]®ó;÷W#¥o›DK Ù°D•ËG?L“>C¨Bw³¾sYŸc28€âpb¤v´TÒöÐX«T /‚ƒä4fÙ f\NµaYã~^|Ou¼`’ 7^Ü hØGô»(bJoO‘Œ#!ˆŸNwóã4IÃê×Õ ¬ÖTbãs'ëz\E៵Ck.Ó(.ÑäæüçúF ]i–Wë[ïàÌ&ôÚw®>¶ã—_ ÷n3k÷Gã*ŽÀ3Ë&í¸ÌW=›G;rÂûh³X]¯ÞÆ¥à f·H5Çó…›µt%°;_#ïS^ ·½}KF+:þ)Žw(Ž­†ÛèE€8Ã7/’áȧg ƒèlPOyº•ée}ߨ"S åþK*‚ÆrÕ”ØçÜA/–ôiáÝ6¯tÅeh:UZ¢«~æÆNÌ<\"¢Ï™çÏ™ç Æ 3m‹)ãT*nñ7r¦ˆˆt°/ÜŽ£R—=(g|‹·ìºíMà ^Kç( ÉÂEecNîˆÎ¤'¢XÉÇŒä~ÆZŸS®ëÊÇ­àíàˆ\Tnu,ÑÎü´v€¸I£iæ{(’Fãúåss…›g>‡§'˜?ÞVx†u¥W--Ö«¥Ü¤ÌHí½XmwŽü`%ós±ªLá¹G]¬[ãðI Á îqµ'î¼YD—Þe\‰²SìJà´M§ÒOûX*V±3}š;6#rê5q¼š1•§ ˆó½u–ÙqU9¥ÀNLÂ’Þ–'7«[XÐQdG×GÁÔÆ‰‹8 !;~7ÊÇZŸqÅŸü¬š¹ÉËõH¢ýJ¥­~9@RïÚ qþ/ %dÌr —YZ­v4y_Î'äµÑ¥¡ýY‘u\p«\fzç.x ]÷iJŸC5¸Y.îÂ%& CÎö<ìf©b.C;ÔzÅÆ±æëÚ¡9|]*6%ÞG "p®¶³é”oÅšÛn¢×˜õ/¨hZå=30Ÿ’͸TmHP¡jBѾ]„ÁÄ’˜zãÃÒ …pLµ³>º¤L6¨œ²*ÓóN|ƒÁ3 ¶k…üØÓÔʪûqt]›Àô¾2ãp|©uÝ—zHˆÞÌ”-.£ŠTûÖn¦yOÕ”YÐïºË>'CæÇ`qÃú›i㘃¯¬¯fÖo®¬ß‡‰‡FŸ }¿_þmŽÃкþôW¯Ôpþm{躥"hùÍ—®=*5êaP—OÙ7w±·Ï˜>?ÿ[¾vp¿ÝxÏxý޳’éSã›»ŒoŸñ×—ȯ5 M·™V³(žKU˜[­5“—2 }]Ï¿…FÇWHx_ÐwðÎÝ–º4W¸­™õŸá’ ´$:È?p±Þ’4T4+Äì&f¦äög)3£À°º¶£Þ! ÍÆËr¤øœ§1ûÄkïÕ—69ŒÕûù½a${9p´RúÙd4¹ß]uTɨà\~C¢"3g9VŒÄÄ Ù%e™‡ÌÁA<¦VdLåðmkŽU 9¼:Ì W8ÀB™GÑæô‘€«SðU±9L?j^¦»m¾€(¨ƶuô¨pØ?mÔ“aÅlT¬ÐŒ&2þt¸ÎqŰl{._çIÄØv\s‡} #€Ìà#,aÅh@¯<@¯ 0òE[g7GwApSe‡:oA1<mR!Ä0Hj&«Ágd«ªœ„µÞc÷ŠÙ±Ý¸¾Cï4‰×šÎ•֢ɔ}¥èC`.߆b¨“À,M ²HK N (Ë×/tc#Í{2¾n½€¼Ô™ߦÎl³–:³ÚMkM¿ñRg§OÙ7w±·Ï¸¤Ḭ̂–:3½ûŒé7^êìô©ñÍ]ƷϨ:³—N¸Ñ®—Üh5{*^ül-í“C35§äžv˜{&‰ÞЙžññ7„öLÅ}tïÅ3RAJÞq@‹’…«PŽmÛftyR"ÔÍ¡žÃ$8bëÅË9ÇDˆ¦Rn³´/! V=¯²ÿ¬TéxÇ y#BÓÙFœ•bèñhþfi·ò¹´¹8óF{¤›ó¬Hê„¥“Dá öYA\!ËÖéý›hr9Ç@ÌL-NÏïù£Î£8dʉ͉v8ÅJŽ8 …Êpmœ½ôWÁkÃE…„çƒS~}ctxáôÍÅ{mqÆîuƒs ²kDûÒà75˜ÅbÁ Âæ¤—çÇâÍÂdkòq&èqP3 Î+sšq÷Üê™¶jx }Ê ?ŠâÀ›b:ÀŒ†Ï”£±èâ )°ˆÄ+À; w'Êç¤Øðwª 5s)íy7Z= pñÚ°æÄ‚ƒ£Õ²$dáÞd‚&†°xµ­îsß0—ìÙoÂÖjù&=s `ìàB #„$S³ŸYQÅÓ¬ ®’ãŒ*õn¤Ô»eL;ç4Ê™/Ë(w ÄMÓã™”Z- ø8åL*÷†¸íPØ46'2ŠšÆ³«BìbÅÊð#4ÃÇ øºXr Fl\0|¶÷$ ¼ÃTáXO×%´ê§ëòt]Â\"²ˆŸÔW¯–en> >ð<Î|v]üQëxy`œ9@>?ÇDÑãQë³ÂYùܮḜêáèpGаrÅk7oæÎ5ýqÔÉ{© ¿èª1…pÎt6g×V© ÓÁW)l½g¦ÞÕBörÆ 0D Õ˜Ð$ѸP³Û<]äx‚‘P‚Äé“ÊáÎL¢(Ö¬P`Âë5íBS­fÈF)ž7G’G˜ø^°x.þ½Ðûǧ…ºÖFÜ–ÚºM‰°"ׄ®;9‚ƒ†»æ5’ͪ½Hgc™öfœ6Ãe0¹µÝ{ÎÛxkýàrŽ+”«ýO¸÷ØéÈ\~”[¹ç&H¦u#,#ËË)ÊɘÞIƒ,b¼ÎMc@‰Ñ@%›- £krWÝhÜgBo8œÀ 4Dý3–®!x×\ßF“…+ wšè¡[RæsWR†é˜ „Ùäµ¢gœÎ%é Øܘ¤Ø¡×&â©HL #à…·7H ´ÎÉyÅ»UV™;Zº¬q…(†Írt5Êâl¯œ—FƒââQÔ\ù&™­Ü"ø0Gˆ‘æÐn—DB,¤P“-ÉŠ߆#LÓ®Ô#/c¯|w-Mˆ|îDÄÑ6;LPf°%'-8¤‹&½¬# ÷ZÛãˆeB |?-ÿDBqðÊÜQÁ¿°WÂñq»º –ŒR ‰ÓkaUÂHÚ¤N# ï ­Cj_#P¶ã¢“@ |ŸíËÓ¢Åa%'¬¶ƒK-Ñ g!AñlLáqái3ƒqÕØ¶“‘ÚF»äÛV؇VyÅ­«Þûd¤vÉo¹g$[y\öÄ;Ý»”¿×9K]Û%g´fºhÞÓ3T¼¹ VÎz-K½'6–Œ½Q[HÆÞz}JF8!GyÆ×ýIÆÁ7»•Œƒ/q8(’âÜQYg”±ÞœÜe™0á®0ûw-E¼)]D xB”TSV0]úûnMzo&?§Ì ³¤ÑÅÓØúbñ¬ Ä~™O¿8ai’~±pN–VC¯Åb%´‹xñ ‡Ë É B^¡ŒªÂüèÕ±A©és¡þ¾ –e©#¸è“mnU8PÔ ®ZÞ8`6ôìÃè=ö½;]g·8‰®÷»Ww­oÌúí9+UÐÄï{ׯ·fÝZ-ºW¢•Q³ï׶܆¨ª˜¯ýÜÓ|rÊþ©}‹>¯|àB_f íÅÀ–†ñV™<­‚ú/HLjð¨)&pÖ'nõPíZ-(`zÞÒ¡K¢¿zB#@‹s ,Æàð€™ÓÂ}Ü:Ž¿y!SµJIÝ.½ñq›Y 9¡”Ñkåõþ“¬B¬^+v7Eýj†À_‰åYÔß„brSÔoæâ°1‘do÷%Å·0õÇÝìÍZSùµðÅűže»b-9 ~×xÎ@™ÞX9©Û­ µ÷gœ×9ŸCõœ©KoAy ‰Ö¸CÈ ãDÁ¤¿ƒ¶°e:‘”i,)’=â¶µÑÃ)ÝÊÑÛ1Šv?ƒY*D_f<ÜUyìçQºGº4å¸6øýÙ"½{Êt˜+ož0Œ)š?öoê‘'ãíù1ú8Ìæg:©•Fåyöîr‡„¸qÌ5à+ü¯Å0S\±ÈÉvˆfoÊ·µ¬uηB«(ë©…(ž¢ô\í¤;Óõ^`Pt_°‚»mD“ý¹ö¡¸6p>{é™±¡z$i±í_JdHð³BÞ{Æ=pt"T¡8·s¹G‘™ucµ”Ï¿ë¹fôz"„¶Ø²3¹)= D 9 *w“a%Üøá¦’jÂô.á1rõ28-B$Ò“½^ Ÿ'ó -+ðÞpe“³¿—I"å„Üj%ã»æô/.T­!ÒÁ•j­Þ"©Ö¬0‘"f~š¦$Ú¯Eȇ¸©ó±ËéHò·—Uléðï»f.¯[™ýê~Ô6ÉmL­'[°Tå=äV©ø9É– Ä“)Ø:ß@t7³K¿(§N‹£Â<~òz> v8-éî¶ÚὬ¾¢å>›M½ÀçNSFc[¡•‡®¨“öpØ*°@átBÿÈ0߯¶j ÄAi9"ëŽÄ‹ßâfg_9Z,n¦ÛóU‡Lÿ~NÊbÒ§{Îýø= =|µÓ\Õη â ~5Þ®£;¨éÍך»ª;×å&/fÙˆ¹ùDwìÖ_£=z»yº?öëÀÎ~åÊ™Q9êq5yÓ¶ÇîL.ý¬=g€ßáwÎ|Ñë£n^#×+áÝÎ4~û›Ïð³³VXyïè;3ˬ]Qè=fYDûÎ|b”w¿ì‘Au§Ÿu«úå®-|ƒæ <0ÅóÕpÕøJ`g?#^À' ¡/Œ=À| ÷ÓÐìv®Q\5^Û<:¯küóÁ{€wÔãà ^X»òI„K†¡éŽêÔ–'™]>DiÖ\‚ZëðíåÿH©î endstream endobj 4691 0 obj 6846 endobj 4695 0 obj [284 /XYZ 40.7999999 172.819999 0] endobj 4696 0 obj [284 /XYZ 40.7999999 76.8199999 0] endobj 4697 0 obj [284 /XYZ 32.1599999 785.299999 0] endobj 4698 0 obj [284 /XYZ 32.1599999 724.819999 0] endobj 4699 0 obj [284 /XYZ 32.1599999 269.779999 0] endobj 4700 0 obj [284 /XYZ 40.7999999 172.819999 0] endobj 4701 0 obj [284 /XYZ 33.1199999 783.379999 0] endobj 4702 0 obj [284 /XYZ 33.1199999 722.899999 0] endobj 4703 0 obj [284 /XYZ 40.7999999 76.8199999 0] endobj 4704 0 obj [284 /XYZ 33.1199999 267.860000 0] endobj 4705 0 obj << /Type /Annot /Subtype /Link /Rect [375.839999 288.019999 484.319999 295.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4706 0 obj << /Type /Annot /Subtype /Link /Rect [391.199999 192.019999 471.839999 199.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker >> endobj 4694 0 obj << /Type /Page /Parent 2 0 R /Contents 4707 0 R /Resources 4709 0 R /Annots 4710 0 R /MediaBox [0 0 595 842] >> endobj 4709 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 4710 0 obj [ 4705 0 R 4706 0 R ] endobj 4707 0 obj << /Length 4708 0 R /Filter /FlateDecode >> stream xœí]I丕¾ç¯ˆ³Ž)j!`¨Ìª2àÃ…*`ÆÕ^`¸©ñaþþ(BT,¤>ŠïñQRdG5Й©…¤¸¼å{ÛÏüú߇¿ýûðóÛ×ÿ9|w?ß¾¾TǪ­Æ‡Ó?Ý^Ðý±Öã¯]ßµ=ý;|ÿõåÇáÇË——/Ãÿ¼¨öü¢û1Üœºü÷÷½üέlIÕ¨¶©=VóE„³ë+gÿyñõÛËÏŸûƒ6‡o>ö, ?¾ ¡?˜nkß~9ü¾ªÔÇ?¾ýãEéÓýó­ü+Uw¾Ò^1Á#Ö{¤vtƒÜÕ+ÝT—;ªïÔÇÚÔ]SÝÜù„îTŸÇ;Õ±5U{×Ú¼3ÉN¸i ¾S½ú†ÛÇc &C»GͱmÚû¡„¶ãËÓ£)Ó£jøžìqLŸ¾ »3o¯Ù“Ä<³×LuÞk­ª§=1S©ccÚ¾»±q‡õþ,\/Tú|¡;Vöü7ïŽÓÒ̬sï¦E«Þ{§†­ãæñpÇãv2×å|~Çožò¡Áôk0Òs·_ÒW„‹|nuñÝ õÈÀuÔþd‰l†ªŸô—þ.å,Ýà‰†ýénü}¢Ç[½ú“ÌÖ+"EŽbö)Û1>' þ $Ž£E.P¨^ٷ✡é=Ö &¡cNÂét\5vÔMútø3§?@fE áËÇ6 FÁš2Žà2q%©ºNLG>%?º¸™S¾“04MPÃ`é!= IxúŒ‡‡@”í¦3(âI É3@ø(C¢2õ+ ¶)aˆát“¶|ø–ÏúÒÄ$õ}ï“ú`_pä¯A7Âk‹O$4á4åˆÀxnß/†椭4IÓM§²‚Ì9Xíà4¦oÆö‹Œ -!·Õx"úco+ŸO„j¦V®w>@b eëe],rx8ê0& ¡Š¢/.âL݃ó¢'ùúr`êQV¶Ç&Øã=ºãf|îÎGØZ[š _å}[Ž<ŽèlÙõ©ë.y}Ü€ð\¿ƒ55•™_Ó¢}úg$KÂZ| ÏqÈlYV 1“ý@+é’&– )ýÖýVÒ£0ˆÅ9)â(Bx¹H‚q™œ”û!h¢ébé9J yk" F0ŒEJmĉ ËI\n`[å-lŒÀ€?ÃGrSÙÆ½yI†ìõ(Ù{Oõ¬¼eøÍ'Keåà86ñïÖMã­8öÈÆÒ"–»pò,‘ayÕà;¢R)–~ ö0Ç ~G掯žkS<ÖÁ¸§7”##KÙ$DÒ—u©Íq ÌÁû9é7d-MWû„fm!QrM ñl·ã¨„:©L3ݥζ{%ª¼øoÕ¥Ná¸ÈÊL£Á_94œ¬ïé5!({7kž€"~˜s%ÃRÅBg8V§eº˜~D–Ëà´KpÕüG&U“¨X—“et¥tÜŽ!‘€R #RÉi¬¹ONcÍ\rÛøÉiNWüÅóSæ®sÛÇ£hÍ\rküä4§+~Œâù){׊½ïC"9MW/8]ÚæRÕ%ŭʹ$k%9œ#IÍ‚ûVù”ñ>ú!¹?TÀ³ 9úî-á]<7Kt&‘ÃwÊç)еòöfH•Æ s9Ì—«2¦+äœBU"ò`pË©šŽ%–ñù!°5Ñ¢–YAKÛÀ+”?½9_"ÁN‚eŽx¾#•™à +é%ö0M!ÄjÇŠ­È!ãXrÁ­Ž?ä¹o$Ê4ÍAu¡õõ…HqzÑ4rd!'îwóqq'®܋ԃNç´™ŒP©‚ Y&0I²á¾p Á臦†¯tÝâÊŠ‘èì`ƒ3Ê`C0#¦Y‘ȸ5\wG3ÿÕ7Yìs`&U5Í-Ì4ü݆0Ópµ¿‡€ÎW<˜i|Êܵbnûp0Óð· a¦ájôQû0Óø”½kÅÞ÷±̤ªö²O˜é`¦ÈgÁ¡9:Ã&oXL Ǹ%"Õ(o‹"R,Æžž’žî}»“Tê‚=?™d,¿(#ÅG$)?Æc-¤yŒDµSýJJtŽ;ù,R-Œ…Ì0Tü ;ÞY “"¨> ½T$§A–ó„krXH(5ì P¶wò°²ÝŒ<¬¬õdÕÓ_>?eîZ1·}Lò°²ÍŒ<¬¬ ú0<|~ÊÞµbïûXEÖÕ”Nã)¯%»“”)…­jDTaýœçäXo!ƒ‰Åê„¿\!Ë–pÖ |8§›åÁ¯ è ÑÜEØßÐ'¹ú¸ÏÞës*ƒêR5t@sG{PÎfëï9‘Fà™Â£w*ËÜf÷›Ÿjy‡ ÃÉï3àœŽÇö‡æNèÜ&ÇïÁrí­à§ÚÌ`¯µ™ÖŸµªxž–A‹òOÙNȆt3Er`8×S›âÖ°*ÍÉoɨPË ¶NV ꪿§sQ“Oÿý„ì&õÝŽñw¿õлWPÞ>T‹Ë¾‡­!à¬Áúq\y2"ײØ6Ìcl㱆Çv© °E$ÎÕúÓ±@0ˆh‚­0X4áXG`59<‚Ýa%S/)먌hù•cý¦ØŸ.\„FðàŸiDÆMÙ[=¿)…Œ¨‘‡SË-™q RÛø‡t9Õ¥E×6÷@L™”,ιq˜TXÝ-ÎAfY:±‡hà_+¡ÜŠ„6…bP€ïòÿÚ@Ú¶ifõĸ/; 'Ž cç,²A|.RJ&å`z,G 5`ÎÚ˜ä劸Èb6ÈIin¶ÞJn¥Žº¼'¡«ò~KÖ—1®U A†"A ¢i;Eb? % `…š‘‘ÞªÖß´qÄÌÅÒ›ˆ¦mçÓµ÷Ñ©¤Â]7Þ„qrtP`Éub€wÏG ]اð²ËÖ¬@ýÈÔði2·vÑUU6à/ÅkÊ©x‹Í:kº5Õ/N½ì¼™w£¾GÃw þRܬöbpøñª¦îR_b@PÛúbXWqþwÇÏ £¤•ñ>¢Â‡€q§<äädDc/Φ›TÁûÄvÞ÷ºMp™ŠÆû‚„üme -c (9ñ„Qµž€^rüÖòKWÁ0þ‘Ø ç-YÞQiŸRÓj‡¹^û|È(ÑðÝeå—‘qk®Ë7§þõ*–ïžyUííð‡VIK†å’R.*y¾²|Ý8µ¬rüãÖÏN7ÐiŸs<‚Ô±E‚¿¥èŒO)Þ)¤SRÙÒÖ—ÜV*V¢}1à8S‰’3U„mDÍG7¢¦>ˆ›¯Ø,jfeƒ ž‚p p”Žïù4žX‰x¡õNÚ5 Ø8ƒ3aº ž ízm{~á`>Ê® Û‚ ö[£™bWzoåßó>ˆÏf.9JKO—•Ö&È‘VwSÊû±eë9µ„.È鮂œî*Á(BL¢6ƒ1ýÛ6ÄdŽØ^>Þ JN}0ŸŸVŽÏ‹„-×÷_R¨°Âé,’u•lSÝ^øçËפš ²ùƒU‘àzœ!¤+„”,£Ë`lðD Àc1‡Œx®€ØÉ}¤ Tœ€¶ RÃ’ÞþΡò:aï„àÊùOô‡†ÍMÝXF­5S¦nåü'ôuÆ”eª‡p}¤±Þ#SU•.L’?nÓdž9 &×fõeÇù½NÌz·¦&—¶pð;r‹f{ÿŽö'#òìTÖÄ™]oÆô´ÇLöÌËBð2žõ™fáø93Y¸Þ‘Uõ?lfa/ãG]ù;}Pl¾8+Å3°;®Òö A†|C*¯Î&ˆù[P#}ÈÉêQ@]ΩfêðzW^“呪fÏ84By ™ä†Ø{C&d ©¸Õ¢ì&X{*ˆ'GކáX–£ßÒEÊÙïd¾p={—ɤ¨%LÕzß«>8N†_â,—8ȉ“²Ž€•ž‡sáT‹08ŒS†6’zßs q°¾Ã˜QÃQð;8ß*#ýD g4’ÆÓã`œ¦3rgõQ¥iT¯ý3KqHÍÈï–S>W ‰°ÑUýËÒb¨x—±B^%šò™Ü]µÄÈnÉŸ-kçX] ˫ª]ÕIN È ^M (”Â[‡&s‚Èd>'G/›Mr›8Žž¹Æ|8Û®ìƒùb8ÇËbŽoÖèwãÛ±¬È»tj4¸Eb¦#D>½ÌŒìÌŽ7} dt³ìXŒD¬e\Æ(¨q:]£dÚ- µÊ£î«ùqnqù€ÎÎ…a³®ñö‚›ˆ9¨§øÃNþ‡A+< Âa ¶ÉœÄÈz͉lTdkØZ ×ç-Ÿä²k;o‡%än*\JX2–… #ì˜ñ¯ ×ûû P0)ÁŸz7*Ë)ˆ`#㑃m£ÆVÐ[¼{;Ü¥A–­ W®•)¬„oÊæöäÐ>‚ÓO‘Ù+Ï‹´­½Ó[(ÁK;½ŽfJž1¼O@Ô·¶§à\³ÏÉÏ)«þ¨Óψc_=+ìpò‚^KL‚Þ!’ « )ܽxT´0 ñùÍ{øsè“ogX¶±Š¨9>OÀ|/€ùY J¢Ù+¨®—ˆÁ'*îÍ«{s¡íAñz>Fê¯C°šScƒÕúŽ€ï oÖ-alÝú§æ cïV”+ž°ðT'Ƽuf²’Q\ªN&Aœ¬×N† ð>HKYý]ÔØ&NÓz§¦A‚@ÙýnêprrQâÀ©PÌYÈœDXœydUg»jèÒrÀ¯ #¬.‹fObá†"ùÈelJòˆ€Il^ ®´bQ„âm,YØ ¸š¨a.Ò/Áÿ_q-†lÒ9vá•Ý,…fÙÞ,HB†±Ûdeç#Wá-™ÆÙ6>‹XKr#4ÆŒŽe¡öOWP=[½x‚ ™¨D5£ÂeˆË„Q¿«½ºë~r²¢NÎ%Mè.ùÇ• QðvøËq+!`ÙŒ|š‘Æ$ðÏáµCÂkdÏä”×9œe ”אּ£ˆ|ËrÓ„ó¸’XµƒEè~ŽA,|&R&âž¾Ë7'­r]ûâïŽAÍ"iš#K0o b5ÓÇ2_ý†N)f8‘¸C8X<$W~ŽN¼Á|óeYè‡Ý¼ð¡¿> le¡ð˜/-9ÆÕË:†”IGð›×É*ÜóyHu¯½¾#¯Ù¢V’µ¥sÖÜ,±9ÙÕžäqä±´á*ôŠ8ۄݤÓtŠšX>Õâ6Ý_žï°~ò†’nË“tá¿m•[¼0‰)› Z"›,³ Øð$"?ÖV¸qèiDíÄw°.Žï¤-Wò ‹"JàEt v½×^*ì” 61)3™.#èr²C_É´¶.ßõu²7÷Y{ÈPˆýT+AnmVÈ#¢1 ɲ(*öì}qMež¯•SW{ÊŒ GÉŒév‚™mAæò_:dýh|œ>’·öŽú3êKâ£êc翃óyNb³ÌæðNdlxv”Û®Î-õæN ûÁ£®®[|øïðcØË ?=à~|ÿ•Tã¦ðƗ蹈¾º| Úƒ>c΅Īö8NY]]ÜݤµÇv²³æ,º;vóE^º™;ã֭룶³@\ÓÛ‘6ùGq®Ÿ¾cá;£„Ðéã@UÔíQt›`®µq³Ý^ùŸu\}æ ?£wÜ&›»£Ðw¸£N{Ç­åÛo@Æ®;ý®u!ã 챿#íƒúíƒÈj|‚ýàµýˆv¼ wUx¯ l%2ãV«ñVÂ2³›ð<áˆg]Ù}_µGuâWÉ[ñ¼swüE’#¾¼ü?îãø endstream endobj 4708 0 obj 6785 endobj 4712 0 obj [285 /XYZ 32.1599999 724.819999 0] endobj 4713 0 obj [285 /XYZ 32.1599999 672.019999 0] endobj 4714 0 obj [285 /XYZ 33.1199999 722.899999 0] endobj 4715 0 obj [285 /XYZ 33.1199999 670.099999 0] endobj 4716 0 obj [285 /XYZ 32.1599999 493.459999 0] endobj 4717 0 obj [285 /XYZ 33.1199999 491.539999 0] endobj 4718 0 obj [285 /XYZ 33.1199999 300.500000 0] endobj 4719 0 obj [285 /XYZ 32.1599999 302.419999 0] endobj 4720 0 obj [285 /XYZ 32.1599999 178.579999 0] endobj 4721 0 obj [285 /XYZ 33.1199999 176.659999 0] endobj 4722 0 obj << /Type /Annot /Subtype /Link /Rect [100.319999 743.060000 206.879999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 4723 0 obj << /Type /Annot /Subtype /Link /Rect [158.879999 690.259999 239.519999 697.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/software/guile/manual/html_node/Foreign-Pointers.html) >> >> endobj 4724 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 681.619999 540.960000 697.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.gnu.org/software/guile/manual/html_node/Void-Pointers-and-Byte-Access.html#) >> >> endobj 4711 0 obj << /Type /Page /Parent 2 0 R /Contents 4725 0 R /Resources 4727 0 R /Annots 4728 0 R /MediaBox [0 0 595 842] >> endobj 4727 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1738 1738 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 4728 0 obj [ 4722 0 R 4723 0 R 4724 0 R ] endobj 4725 0 obj << /Length 4726 0 R /Filter /FlateDecode >> stream xœí]I«ÜÊÞß_Ñë@ú©•$,Ɔ,BÁ™y!NùûQ·¤êôWÃQUIê– ¾×-ugúÍ×?þößÃO¾þûð}üùáë[u¬L5ü9œþþòöÙ•~mÚú(»ÓŸÃ÷Ÿß~~¼}yûÒÿûãM˜óÇýÃiŠaÀÿ~ÿ×ÛOÃäoÃ'_?ü®ÿíyømÿ¿þðÇþÇŸÇñN/üüÖvæôË?‡_„²íÿsûÛéáßß~ÿ‹Ã¿ú%´çqOÿþRéÚèvÞ:~\¾*Îo¿Š&«º?ªÓb…ìÿ©ûãøÏ_ÞþÚvYƱ5ãø{ÈLíi&)û…‰J÷‹Ï9RxšN ÑÝTÁgÔÈó˜msèsýMÚƒ’› JÌÈf ÓŠÄ¼­õÇݸ‡JyÃM%1 i%T#k}ºíÓM×m+ûß5þ‰8˜N´çîê¹G<4÷®T%dšK?­HÌÚÙtçp¤„W®DU‚v(UwÖ4_’jy%Õ?_|ÿíí§Ï݉-}ûk¦gÞ6üøöó›îÿs¢×>|ûóáW=ƒ{ÿë÷¼ q¬µi›úüÞù‰ç'ͱêTÿyu}R}:?©{Ù Yß<‘Ó6`¡­W+<߇ó}ý@ÁW½€føîQoVO+Ák8Z ŸØ‹­û²s`ÇvÈw1bµÂKaÁY ¾Y ’0䆯D´á8‹ï³xLïlJðÞ†må{ƒ ª:èW‰aÞcÛUæþhÆáëé<¯OÞÁã„p:Nüé[Ï2q“¦³Ù ¹‚‚ï<ëÕ!0áNJûRñ•Es"î}5EpÖ+Q7 @£÷ÖZùÐÈq˜f…ôNðÒˆÐ1`¸Ó»³x£c£¨;öňäçrI8'r,; AÞ0¹/™ßPœ‘º·­±©ûËÊÝ®EÀðÑ~5‚PáSƒû¤óEð\%9,!q0§l2jºœd·fdz±˜^±6€FÂÓp@lR¡ÉðÚ¯Š.øè4á¤ß¡~,ŠÐ‚0 €·E¹;ƒÂdRZ9 'BiDÙvŸO©JY¨Î’/#vÏ`KÂB΃"á¿#L»c£aÁK"M©=®1$qŒ"áü7€TFðîˆÓ ¹WH«c(d°Ï5³„3ß q ÀffܹHSi‹‹¼.À熷9T(BCŽ˜ßÇ`n‹ˆQ4k$ˆÙð±ŠP‹zûþü§·8çc7|€”_KÂÏëü÷SÚJ`Èî– gu=?Gµ±.—Ŧ®S†h¡ì ß1µI¡÷ÅèG[$ãË˹»6Bæ+äMÓ"3Ù0ç<ý÷—äBÉÙxýÑ1ÇBî¶ü¬¡Öu8kÀ»†nNj$†ƒW#0›e… ':ti„‰c‡5Ä è@y ŸÔOIÌ×Ã-ì +ó¬³/'Äg×€]͈¥ÀØ€ašS½è©ŸÍDf­—Æ«J¶l½÷LêlÆ‚E¹ÄY̆¾aK‚’ÉRfÊÕm5š>©æ´šÈêÅ•ä²JÎp€®±Èí–Ä¡L¾˜”j°ƒ ÙTªÇ1+bñ‡PÊ$‰s|ð }ÚÁàði݆aéôËà'>Ì ð/bbç “†w8䑆Š$‘[¹Q†ð…¾Ë9r¿9ÄÁŠRaI’ïçñëÏ–Èi3íûZJäÙTXáŒØ¯˜I"ivf‡9Q3)ÌòàáZÉ“æE‰‡¨§ˆ®væÍ3è×cQŸ5Ëx ÙQ€Ãút6w¨LgKwyîe²\ •d§ùQÙ'B(\±'eý7ÿ]ësl‚lêé¦U{ûÁbüi ÷0ðb2דÊ%ùMã=ÌLS²LãïÈ+¶©WãÞ|ò‰| š^±¹›9öfgh\¦Öìq‹ÔÀþÀúmÖŸàhrgÙÆK¦*³¸–E̺XmŒñ:B÷ÌšJûbÛQ;ª‰Àß¡'£ÓéÁ“Ñó艣Áï8ž¼÷|'#nÈ‘Ußœa·rDü{nãÙ ~—¡‹&õô' aÊšý©-àŠÐY)"'å}$‰~¤P=c‰c¬D^Ü …‹´´–ñˆb.þäÒr€<Ñ2ë Ž¦à àwF(yôDÂ'x¸j¼Sß‚\ÐËqÛwp˜çàœNçÓÒˆŸhxnX²©ðⳆóH|ÖXNZªðª KjQwª0­Já@½U·øß©·s´Ï;U]ó“USo<¼íªÎ ªu»¸Ü©êÅšùÊ!ô ŒµpmºG+U;žA£;³(ßiô¥„þ#(Ç4ϳKË;vJËi¡j§Ä|J\‹z5°¼Sâ~ÕÆ n*ŒéŸ9ßahÌ¢Ž§5ÇÅÀÚ´¼`Í”K¾Û„*¼S…¹ãÜ$†¤¸z.¡ô ÌØ¹Dr› ô3b¬å@¬ÀÜ®À!%ízÁª¹„ƒSnªv½`ůÕjèúNñ]+pDòqüXØ »Ûןâc {q¨Ú©÷ êÝÈÕÀÿN½«)U2 3°,äˆ\Ø%ì¢Þ M!¨Úiô ݉Õ@ùN£y¶ƒàµ1r1vê½UÍ‘°KAÕN½õöÔ)0zršÆûÊÒ&ËQ½çµFÐÒðIxÍ—˜£ð'®§ìÍꨧQCçÇsºGâ”â9En’45ˆ¨o‘¤²¾HYÍ,­aôÇqZ «LÞÞ¬cMœ¸KÁÞÞÑž…¿F¢£¼ Þ΂e´®-‘0 áh5¨ÞÅãú–ÊsP@Àƒ…—åJZøÓÒ8m›îÔô:U‰§äÔô´¦WK>±K`›š–À.íQm/Rs‹S —Írt·`ÌC·Œ'ŽÙ\䈢›ê˜…£#Fš%°€Z~ù½QSŠ®Ñß;¦ ©‰Iêá„·× û wÊÔ“2¢&.󓤿¤=–Ë8­•cZ‘C"GQ†Ç©#§ªÖB\‡ÅÚþ8 \•ÎSé-Åa5ø°ÚÚ¦r8ñ †çVÐÌ‚Í`U‰’VZ)k{£¶”Uþ·çôWž[c KN»GN˜$=-é!à"š…[Y¤m¢Ã)çˆÏ/CÜÊ{á7œGÅ+Ô<6n8ÝY’¢Ý,I±pÅnïUg¤ómÝÙrÆST¨“aÁÎá<áæ²… ´ÐK}2"L¶ƒ ·ßt·£ø.½Ê-ìòì/mtΊ’lØß04¼©¼£H0Yn}X¢ÿ|Î2ËÂFp¿eµZM!Š'©"x´ã/©±°nkÔåˆ{1ŽwI<'ƒ‘µÍa’9|L­«îOqMñœiÛV v}Û±ÑçÔ·c ÏsXGn ‡Ó$V–7ßì Å+&l ßÄL¿Ï&K»Þœl¥6_a„öpp³ôù9­‰³+I:Øî£ ‚ÝG÷Xjv¤5¨ÚÂËMûè†ã˜ÎŽÎ 8{'™%Êá?l"¸sü‡8m‡øÃï8X€ínìÁu=’ü>ÇNÛsÞv iú éÐb¶•ÕØŠtú¿8¶mu0ÍéG#D;|ªÆÏĦª¦O¾¿™ú(D'ÛV\ÞÒw£èÛ9ú÷‡ÿ‹îôµƒõí~*kŽþ“þ;÷+9½ÕÝÒÝÏñ÷·÷¿Èwý퀭œ¢?™ Œú]8'“y'1Jâ\.‘š…iì3$ÁÕòé äCèM<¢mP>¶ilʶáåß¶â‘PB¬Ý k.^#q–±œœúœ*¡26qˆqIŽp ŽvÅ »Ùú­ivŸWÝ=Ÿ×Õ#>¯¥ÍƒûOŸ?½¥ïFÑ·s\ø¼jñyÕØsôŸ>z«»¥»Ÿ£ Ÿ×—¦èXOÁ•ª°ôî«Yž“ÿÊÖÚÛΖv¶´³¥ (ßÏpŒ±1—¹ÖÂ"XŽH‚´dci2Æ\·÷Œ¹î1f#l¦ÙBóé-}7оã˜ëæc®=Gÿ a̧·º»Qºû9Ê0f£îo/NeÆíœf">c`Nf®ë¢ýbš¿¤#N. Ÿ`9geŽFð\Žt–—ÅíÉ‚Žýí¡Âáb§Ô[v\ºøÇz5#®/¢îJu¬m-†s1 2{Z4oKþÂÇ]=>Æå€a4ŒV4Ž@D„‡ËaÃ0Ǫ!>Žâ¨Øa mœŽ€GƉj\‚Çý% ÓtÜ£±`ÚvŽï$mç(’›,p1Ó›¸ä´–‚§XãÂß;ôƒ>GaéBá‘^ÚYþÛÎ}‹?qpá¤PÁágcð¼ﲪìëÚ^Y,9†¨_7K¨ï´p§…¥¤·IMUZÝo-Ĥ¶[ìËÝX"r–|üYÞÙðôÅÿ`xQ›$õh,w~ñe«-ÝÚR'G9þMu”Àóä7q™ÚfFˆ[-ü,9.\:|Фy?ÎgfVEÒ€ëÁtys¯ËÊEðgDc¯s³m+×ajimSc1Š —XSZðÊÜBµk­c-£ãVö´ö–q‚·q¸ VÁJ” ÖÆX—é®ÙqÞ=­£¨2T÷ðwVËÁŸl›mYñŸ4*Ü9QFÆÌÝ_FQÊ»œÔ—Ã1»o,€8Z˯mËêRçâ)h#Öù2“BNð V ?”h¥ k/ÁŠRÖuRy×,´º@XÃ%P ‰H¸Œ¢½YjX$‰Þ,3/m°-O ìi_®¸|âÂØ‡µ`ÅŸÉ"á"t«ë8ð!¢+-2ïò}7¶¬ºæ’eüòC…·ôyÅEmÃOJ7vÆÛÓŽø”yZeOË VXT‘ËlU¶Ë„F¨Îž3mC…´ b„Æ€ëT,d®ÚãÿóÄÿ0$INyúëê1€×uï°Ý–‡%ËÊØ8²–(ÊÌ…ˆ ’ |— Áí'Šÿ„É2JÚP–?AGÈÞí“»}reöɺR”QÒkaOû"d¿nÄd¿níiŸ‰ì;6n&CøÐJXŒ&ÓâÂ7MM¸f'¶ÿ-›€Ñ›¨o" Þmé^þö¢¶ôÖØêúËÛÒ;Ù¾&›îZ›pàMaà¢"Šò‹pðɈ¦›“N°ÐXGRÄi#„=mÚ:|«õ«ˆ¦ÎvÞ0Ͱµç\¿_%gô—$°Çwݰø·ò¨÷DÍûÙ5÷DÍe5¯ˆëH“ä”&ÅYî¸ÿÇž¨éLÔ¼Þ23ç\„6¥ªÜ¿¼9®µ§ws…vV*¥$*s_ÿTLùf[rÔìÙÅ—5;úç$naCâ¤ÂK³T¡NXX9§º«m:±‡q‡Ñ<õg"™™“`­XUbÒjŠø˜íY_Äv-F]æºñ2jaOûTj—yÐØ÷ù RY?_¦æ\~ƒ«Ò&›ó`ªQ+)LhUmO»Jg\=Ü®<×Á£ R£Õ„– bÊ@GÂ1\,‹rD¬r4={,f„;E(%æ´scÄg¥m– ‚¦+r\Œ£:æQž½ð ð .¿í/¼±üê35+^°D'¥Í&Âjâ#iÍÁ†p•Ùæà£,ÞòkZøcÖCc‚d E!ã Ù$Ô/ž#>Dä&àˆbÏsj£e¬:šF¸;ɲdƒÐødÒ£;6ÄtÆ vôî7 ø¨®1&Xßm ^Œ189”¾xU€Oh3N© Ä?0e®{¿1Ó[µhˆaŒøäÛ£ IkŠÌÉŸ2׎#Ž®˜äðàcÏ:#ÃEâȦwÙIþغøºë$.aÚ„`#6Æð2?±3'Ñ}êXºçd¢ã÷ªù˜m¤Q/‹$Ø.eHN- ‘.%ïa:îœc•ôóT~Æò¢JI>Xo‹PŒ 7p‹a滘“G¿2™ÁUrÛæžŽpGÔˆÃ7qüÜÂ%ÎÇ;7 –­ÀáŽGšfO6줭8ÅxN“zê6`F‹i3ÉI˜á˜CÂy±ÌÞñtÒÂM}ôA¶'αÀãgñ 9^J[Û÷·ðtTnö§cá:$I@Ôk›ùîºø,#ðb¿NDz‡ÌPðž‚DÅhl+ð×g£Kdܽ´ãÈ#Bw2§Ü;I1•DƒÊlsÄ©Û4£2ŎÃ=_þäeÎT’ÚfIJ'‘:Zõ?<Æ´œ¦»4 Š0§Eˆá›&—Ò¸–³F†WI‹Ž÷6CµÜ-ax°˜Êm[ÎaÈZ­¶è:'à•$ o„–šLi[8žHM^ÑJØitðÉÁ—0”b––1c1ƒÀ6š_‚ª•šî2(Ó8–<±(IÑh…4~º9ƒ„ÒµrnxQîãlh&,´ÀA)gÑGø{``Q‡½„*¥Û\ïªÕ4—VüÒØ™{4ÕÖJ· ȸ䇣¦ g°èvšâ'ŽÅ;ÅOðND¿S{  ç eJ—Ïl=a®a­dFâùs„&.RX›àF=o©h„Ý º›Aî “”ã#fÔ¦eQó<^+üSüöº¾–/jÁ`í1@^:Ã/¦c š_Û¶³ÙÖê"ãV`{\]ùŸLØI·pø¦v@ªŸÁºÿ{øÑï0g|ÿÙЪ+&|qâ‚ó«þêyæ úm<2Lt U`ª²Š˜s4á©ÓGà”ͱyläk<0V©£ì,‘b„’úh†K°AîÑ<-üN¿35<ÊJÝU­ÙG£ ÀwûÉGøî[vø}gÔ9=h#ÈÆ}g¼±˜½k;#À ¨;ý.k1µ–5œc1Ç(8-à íÉŽº 8p@-Æ(‰Ž5ŒµIx—¨‚kãà‚³>"z#>$ë¶­ÌQœÜ˜ÁUÜXž¤ä3‡/oÿ2Ϩµ endstream endobj 4726 0 obj 6807 endobj 4729 0 obj << /Type /Page /Parent 2 0 R /Contents 4730 0 R /Resources 4732 0 R /Annots 4733 0 R /MediaBox [0 0 595 842] >> endobj 4732 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 4733 0 obj [ ] endobj 4730 0 obj << /Length 4731 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`5â[‚éÇÈ!@cÈa‘C0›M°È,ÒÙCþ~$Kv÷ˆþ(©HÓ´]Ý@ÛmZd‘U¬7‹ŸþôåïÕ?«>=~ùOõuz}ü²kêÆ6ãO5üþðñÙÖJŽo]kjÙ ?Õ×o»·êm÷²{éÿ¾í„Ý?8½ô‡!ÆûúëîÓ8ønüäËã_úwÿ«dõçþ¿_ªÿÖ¿ü4õ7|áÛ®íìðæßã!…lû>¾ÿµûëïª_{Ú}¿Ãß”¶­mÚ(8ÞŽŠýïÇGÑ`M¥•2ÎVBÈNÓ/Çÿ±û¹ïíFÝi!œÕ®YÝ«“C·V4U7tÝ5^§ÞÜVvÛ‘ë !IGD"nj¢Ñ.ÜUÝj%”“FhP`ÚVöïš~6@ܱŸºÒ2vò‡®bWQ‹N¦AÇ‘ˆ›Ú¸«”èÐRë6z]Ewd›D ‰¸©Mèt•Ö˜RE¯âÔUô*vÎ%Âk‘ˆ›Ú¸+ªœ0M;2©Úȉ»Š]1£D9±‡HÄMmZz¿«—$:„|×!Þ>¼î>}î}éõ猽Ò5¾¼~ÛéþŸA‘èeØëOÕï›F´¨^ÙC7} ÷¸ºé”3£Ú6¶4ÏûÓël­æc‹Ù·èZ4+z“Ïóê¤Á ÐÛZŠöûñ0ööþÕÇÙÊî?èjgýn:ÒÍ@ 0ï/E3ïUtóšù¸v櫈x]¨†ë:µ<¿öDG¢B÷ä4•:³§R«ÕR=áÊx³ƒ-²C-ÍgØò [Úí-6e`oÛ[ãi‘ÂယG[¼ÐM 6fg_Þ^ØÆr6¢´†Áµ‘>ó˜AÈõMsS8”áx'¸„ –æ  Áq ÜXQBì+0Ó¥=#QÊÌ(lKE½N¼ò|ÓoíúqbzÜöT ìÍãT>hH’±('´œa9gÌjC¦ŸbYò€ø5¼Ó 6mòÙ+m«õ -WÈ‘æ.íƒyoÑÙê´º­Ø `¨«ƒeÆ´Nñ|TF¿kb²^ÒÚ®ŽW¨ï ‚ÆØ¨eè[¾„½IZÑ\ôù†ƒ÷3ÅÆ'PUNÏ\'sg?e£±\Ö ÁÖÃz%k,@±˜Ê“Z›_ A{ÁØN¬P,TüLRïqV  ÊûN@¡r8ŽÁ6s‡kåI)$«^o³ïgH}”µ¢xK¶…/¯Uß~&Ë:Ï>sQ™§„}Fñ,a Ä<0%بª¸¸•ÌR8UEHû<û¹;d]f”Öº‡<¢[ó\'–:Ðgà„\µ€_ónrëI«“IË= óeÂù½’ã!¤aKy;yø ŠÊ8ÄtÉ>ŸÍ25ï¼5Ÿ8K‰Æ@ºÎÛY¤Ä¥å‡1¬Gߣ}7ç¹X+g­<;WuzR]bÜãªðDM€{L‰c0”Ó>¹òÔsít¶oÏ dùÎ6eXR²Žs6å…õ"!äâdk³ak3Ø’ëŒxéV†P1ùŒle°•ÁVF)VóÛÕxl·Hÿ}ƒ’E9ÙM¨_R2æˆjÙ…Wôöxt:®®/£¥<ÀÅÇë½bþ‹µ¸X ñ‹Õ81£.VÃÅj’«±jFaç)VÃõe¶Ê m× ®/sFëGº[ÍÒ¿ü™­ë´Ì¸¾ÌâžéΔÑÍõe 89ÇõeBX¸Úú2Z ³Œ{®-QBÞGÊ® q­õe´R1YŸÌBp}æé)$+w01u##ZRÌÎhälRͦ§!ÑK¼(ÆnÁÌ'Vac«x«â-”Ãù=Ümý=RrZ°ÊEÕZäJJ\Iéjñ“±’’V]T=C®¤T€?ˆõÍ|TUx%%­ÅÒŒÒZËjW£áœüÐ|®3‹Ïl—ù»Þ3ÛZÇÜÌÙí! ¥gh¯’Cò©× ¯a)q§^óÈ{«¹N¬G¥ŸŒ`­œµòsqÕöLÙp|Æ™Ï8§ßélÞžÈòmʰ¤dçþlÊ ëEFÞêÍÍlmæ“F—?5^†•aô™îtf+ƒ­ ¶2²ZÌooTãiÅ"ýs%¥(}ÞLqÙt3DæÉ…óa¹nTÆ5`ïIÑ+zy‰”­n”Uæ{$ž(õ$çu£\`a%¿¯. |vCI+¿WX'ć(bù¼¾3¯ºŠWžê,ui<å甋—¢ªO .×b‘¯ii²¨]¶=^ïŠUGl”’¾)N`<…Y‘ŒÌ‹ †ÀêàÞ(- ¥?.B‚³-í!г¬[–½éšëN9 p‚*pè²ë®×>hGåRøRa:Ðpu4.eU¸+ÅI»Lÿw¾ÍÅk!RÌQrR…^¾ ´ª¸x‰’é% /ÎóИ][³.aé–•*ZµH¬Çö«C .\ebïÚà®ÅX(B¿l›åkÞ Ð$X¿ÌKr9€{?Tq|ùòá¢b4£ÛÚ›æX$©—Ÿ½ïì}¿ÀºåÙ3îc«…½ïÄÕaïû½yßÛn9jGº¬!­¯!ãŠt"&‘Ëï{ØÚ¦á.í <¸W+¢ì.ÇîÉCfEœ€°ë®ÓêfŠ-×N:í= £šuê~Q/¿æ"RÒQ7¤gnH‚ $ªbè#’ ý¼Tœk‰À7öm¸7wïorÝp•"ZÏ‘2ŸéºAo¥ñ„7ÜbI˜ß–Ä⛼$sU'ÞWñÕÔÄåõ»Ã¸ wO!˜ó¤Äç8¦¤µœ Œb¬ü3JÉyßÏÚÏåZ(/Ë?p§÷zVíß±ý0§2ænõ¸þíß„]äó}ÂÅä+ÎH`þ‘épŠ·Ðë—à5…DÊ=aŸ²(—ÓÏ; ì õÄàé)þ´Ãæ˜éŒÜ°5n.ÚÕj Eì#åå¼¢®íÔÜ6â@@€EWá™5 I.bv”z9\^Kn{̘‚ªC`ƒcí}Ñ:ñ%÷oDÁž…³Hß­±8{F“`Å'—±8¦¸6(D€5’oÒ2`W^­ :gùj¸oa7h´Õo ÐÐ7pd¬7F·»pÎ)f¬›ÉÏÃÕÆ à.­»Ï£M‚·{Ùl×Ó0uÛõ 4®¶lW‘òü·xL¬žç“°9>*xýoõÖ“ZOI旯ߴçmóN´/A² >ºHï­­D?¯:aë=+¯Ts&NÕ ­­íio§kX‘®v§}—îD˸—”ªewÒÿcLmG$ÌiüÔ8-|¦ƒÏŒº³“µlÔÐôÞò{)÷ã'Oð»“Ý|b†ŸÑ3“Ì;Õ"Ð<¦±í™ c[æ>Á¶ßT7¼—F-Ç#ÐÁdm¢ƒ)Ñý¤]ÙI0®¢ƒÕâ)1“…t@€MB\¨ ÂFÙ õ„øxLB×mÛØZ¸^7^MàX'5Éš„r¦zÙýƒŸñ* endstream endobj 4731 0 obj 2885 endobj 4735 0 obj [287 /XYZ 40.7999999 480.979999 0] endobj 4736 0 obj [287 /XYZ 40.7999999 267.860000 0] endobj 4737 0 obj [287 /XYZ 40.7999999 480.979999 0] endobj 4738 0 obj [287 /XYZ 40.7999999 267.860000 0] endobj 4734 0 obj << /Type /Page /Parent 2 0 R /Contents 4739 0 R /Resources 4741 0 R /Annots 4742 0 R /MediaBox [0 0 595 842] >> endobj 4741 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 4742 0 obj [ ] endobj 4739 0 obj << /Length 4740 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“#¾ô ;]Ý|X 1 ìÁðÁèõz±ð,ÜÞÃþýU–¤Ì*2?’")*S=ÀôC%Š`¼ã‹Ÿÿí×ÿ:ýÏßO?úõÿNßçß?ýúÒœ›¶™~.ÿýôþdVrúc×›³.¿Nß{ùqúñòõåëøÿ/¢}{qþm|¸|bðïßÿöòóôñ—é_~ýô‡ñOÿ8ÉÓ¿ûëé?þsüíOóx—øí¥ÚËþwúƒBöã_Þÿéòð//üÝéoãú·q/ÿÿIé¾éT»j?®¯Š·ÿÞ¿Š>Öœ´2Í OBÈqžfÜŽÿÿï—?£]§q´]«»&zÔN¾ ÛËÓе'©zgPgmqC‰µ)1¤è2#±ni¢Ñ¨s¯•P4úr —#0ýøÃ͹Só/ÂŒuÓOÇѺgL\ü2Ôê]l;•f ËŒÄº¥-LJJymÓuoKïÖžÆu¤µ›Ø “æ–½ÍH¬ZÙ|x$WZ_†Ô#+îÇyšnÅô>µbÖ‘zj$y!ßU‹k„ñŽ”èÌ6f^z»†—Zc­©“"ÑH—9‰•«›OÄêk-BÞ´ˆžùöòó¡G95j ßþ<ÎäMóš~û6Þ}súi䟢Ÿþéô/M£¾üëéÛ__†³Tg&UmzÒ¼Â'¿ '¢CO$|§3-|¢áh’>ZÓFûüm<Åìg2’bèLÞy¸#â÷pu|ïàsÄgé…sö®T`êã<³ncnp=:x-H—£Øò %azáŒÆ¡—à=+²¿²á;Œùgç1ÄßÁ£á{%>-e\„Á­”¢Ï€Ã+ðŽÌ—?ù1(¤(-Ëy”ô‰‡‡ž”Ù5¬X]I>/M_•Ü‘C„Žzh0¥5˜g?€ƒ×ÍÛÁ+s%·e »Ö´Ò¼?iýmÞ×Ög=MÛ‘\íYŠÞZë§é´ƒˆIºvçÆÙ[çG{køÝ™ÎîM Nz¦ÀÞ³àé´ûs?47x¾YÂ,S¹=™èÀœ•ìÅÇw&zâlt{Ù&üaÙÂAðrðÄo¹çˆ5|âÌþ÷p¡ŒÙ{ÖEø°sÖŸÑË×YxH8þÈ/ögì)Š&HŸðL( ÀþÑðìœJð劧’yÔœì^¿CüôðN¸W,ÃO0U`ÃTßÁ\K ïlž¦À 1¯Á)Ðxwà™z$|‘»¬r’§áªkc…æäªóÛÑF~`=ØtׂÏÓƒ9%¸èÉsð¬+Öe8’Ϻ' êfeîÌ Öh`ÈEZ!78‡ÖìwOžÏ®Ñ/]TµÇ·ÎÏ–d-XŽÕ­=ô™j´œÔõ2ye»RT¸¤9‹Ò²ø §MÓC7QnxÆ:•¦ÉrZê^-Ñ»”û"ÏœBw–ˆp“Z+)ŠÉ«èÁز’Q£í1f±‹«âXEfà]íQ\^Iø²{ 9æ9|‡"»!D÷ Äž-B`¹64áv¸€ÈœœÈÅÚß¾5I׌£¤ŸB‚+-$‡'—öe®Á¨^¡­ Ü=ˆLݘæôt­ÅíÖà·sr‡XûR™Ç_ϰy·]L\,‰s·³Gto¬µåU$3q¢jÕÓ˜àô¡;Æ3Ë4(ž•“uÆÖ~‹q²´¾}X7Âé´í©Áp)Ù«PúÎæÌ1_˜fì¡Ñx*Â…!å1„0˜ÁÖ¯7€•ŠÃÑy §¿O]›yœêëÙùìÁŽ¡·]ËUZßdõbp2 œ|MŽkš"}J°bX_ /œÐ‘w ·¾!4œÍ›ÁÏÂHbÉìQåOâæMMSl^kÄ3ÊØE±è&OŠ%¡Uq8ÇÎñ$ÅÁžÛÚß“ÍXò:Y +²Yžß•\ '\Tå½âo{B™aÅåãÏí¯ê7o‹”µ§ª†I×ܱ«|yšŽàß&†@¬õæPå‰ÝÔS!G3†“6Ulß…pp×¾‰Û˜ÓC¨…%^Ò8ºR ïzÄÑ@2ƒVAO XºƒHºxѶBrËÇÖ€éxm“›õ­Ò}¸L6`^_“XBWbÄ16½C Ä7…k¾p1#ÎíiÁhx€Aó9±ñü¨wJ+›Ù8nâ¹æ ‡ú`¦°ƲÛ{ '…£×º>øðÁi ¹é6ñ?sÃNþ´µŽI{8áõxR?”<¬¯&2aÖ¯òÚmÑ8æç´¤íÚΚޜA‘fIŒÈ#äÅÑJ¶qË™O)¿;ˆŠ¿0ÛÀJ” ¾˜$@o©^VÏH~rF.»Ñ!àæAÅO’:z9ˆ•y;*mÜ“èy|ÎÂ¥€õÑÜl9 µ¬¸fšsN‹“ŽÁ©LÍóú°r64Z¾œ!2Ó†qšO¦¬©‡¸ü¬Ô$F`6¬û_z§f”ÕŒÂ#%4'ïE8CŽÒ|à'@\3l’$=T¤)Fä’(íiqTK°‡äõÔ¸-.ì y0sV-ͨ·Éäqá´DIR¤TœIâ Zµí×1š$év[*°vÀÕí®F:8[iq»ÃÕþLµâºÒ™Wk[[ä?Q½¥2k[ÉÞsÉjÞ»Ð;!‹OK`àR°ú*ãwà¬W$äÌå^z7±¾l˜ Ûq ºÛ³¤Ý,ÕnGü´„ç&^R´% =C¿7T•VäüåL¶î‹Z6k$µÇ°Äó’@'†­ç<`Ž}Rò_6m©ÖÁä3¯ûÞâ)HÌ}±ÙËx²e›nж»µO~— C{„^÷tqÎì3ô¨KØŽÍ’RÀÔmÛý‰mMý,WÉBr+lÁ0j­ò;¸F¶fm5.Š@d%‰{XâžA§œ]Ï Qo4¿½'go|CA¾Q¡Ãƒ£ÀÓt# 8âM\JÝ©#Oþî‘êÀa²{BöÛ%àÆÂœ5;Úl›â'‘[¶ßZΘ©2–h8Pc“Ñã)”?[ÀØíMøºWŒO¶" ûo>.‰M¡®w &’÷­Ej3ÃuŽâž‰*íc´®r6ÀÏÞ%NÎðÞ]+G‹N›?QkjfÎØìÜnøÝ&WX ŸÛãÂ^lB?]¼ŠB­3ê«$Ä–ˆko86Öî“cRĶÒ݇ÍÂså\ÈUîÆ+6óÒT_ƒ’©ËØ*ÍU˦b ¨êoÍΫk¡Óì–{;®uþäDÅÐPj‰ÊYÁ=‹RJ#Q=+¢PæLö©¨åݹî+!§? UÖ~ìBéÏ –‘¬‡›mÄ­“´žtw/>2à*ÑÆaŒ²¯ùƒÍn0Â1Ü7^2>S\Ö÷ÚC;xn ºö@à}ƒ³ö”ö3îvZŠ÷œ\RÀ”Ä÷Î C>b:0Zòix¾õ˜»Ÿ”‘ür8$ÿJþCêRïzY¤>m¼;ø ƒÞj•F£(î:O¦DKÑ_›\¯E3ýº•@OšÅÄîŒõ䯶ìwðw<£áwôŽœQH']HLOÌYÚAŒÙó"šóôÀaAwžpF_RoÀ'-åR¬—§"òp¸Ù¬UÈøhØZ8ç7ìÁ'Ôd•F|ª?ʶ&õ7I¡”|ž@Ò \©$Ñ9|Ù€{=k#¿Îâö¦Ãxûu\ùyâ™)bÔÒë!H@VLœPÎÍÜË{9ÂåO‰‘ã’Ôþ¦Œ±n¯§”áûYLhž±ÐÇþR-²‚#¶õ‹—gµD Øz©ÅÜgE[ÅÅ3».zP“uv''?ï«sZ+–ÇèKµ)þa',ft`·zŽn³òÚZÚ3ä…w5S7†wÔèÀ»ªYERËØswÒUûš©Aúû›W¤´8‘ÒŸm¿,™Çz8õæeï·ÇÆqåKì›AäA!T±œ©ñ¢Õ3p˜€àûYQèê†kü8…íÍŒ™ø~ìkL„zy“«Ä8YëÒN¯Ê\=›ã­\fú˜©[iT7H%sâÃmÎoÂÛˆ³W8™(8Ï­+°Y²QöfaÔ=·ÞBýàmL¦ñúà[a-¼D®,tê«_ ØT!]‚}LjK¹E¸IÊ‚8yr â4©õEÀEÙ C ;¡žZ½´9ÝÃ`ó¢#´'gõf’¢æ®‚+æJ`¶IS½ÁûX‚7ìì‹è™D–!Âǽ`\HFôÅCdI¸ß¸KAñ˜,Áà^îp'.ÇÝÍIqŽç=›é iÛãq¼÷¶ªán}u‰l§ÅqUâ·-£5@ô)óÖ2»‡Ù•{:/”-ÃÊ)¼zmK¯0žÙcôWÈ9äÈÖ.%mK‡ûq`æó «Íl–$ZÜF0¡^yU/&#kî[i±æÃÝCPŠŽdEgGR wçjžíiÕ¤`¯¥¼Gy¸8ÁÍBè&‚°ˆ¯:«Ð2æ4º¸J/ºp† á<<´Š‹ ªZ‚þ¬®ÜƒŠÇ1 ò¦-³Lwv+&õÛóinw¤NJoÕ ãôÛõïúÜ÷Í©í.¿uBôÓ¿¶§¶]@3–ùþÒš³ƒìGjù)ýaýþãÏÏ——×NöÛÂù†¸¼cÍdü©áÃ(ÃÇoüåå—ß­‡:¹¯0ÎÜ¡í?2¤;ÜA8Õ¼äjø‰Bt­œ«÷’Ê`³˜+ À3ñ¸õ\5}εºóÄÝÇò$LºA¶…gÒÝu…­Ž_ì9¾ÂõÁáÙ7ØÁæ-XÜÞ©ðž,^ É-n•ÖÒŸ£Õõ ‘m:Oý_ñÞ)TŠË·K _ؔȉ~¸ôI-äE¨E)Ô…6É]$h‹ØAÃ(,)TptЫ§ƒÄ¥ÏAÿíûDsš%í£K6eõìÞ#†•¹~L}3N9ºÐ.“óÙ¡²´®.ŠÝ–(‹uÛ·I¥R ]%mŽQDÊAi!¤Årz‡†ÌêG8Âj¥”ÒƒuÓòJ†äwÎßÕ_fñ¾5ÓYô«ºõVÃÔ‹wG;úÅ>+»J¤æ„aR,$…2¦§’æÔ(•²D¦ïÄpe.¿‡ò‹#œÂU8N°á1Ý1°³6‰ªfX,Q´FÉE£óÛaºÑa2\Y•·[:A o§P–lR'Æ”šS×IÕCµ×ðú´¶È7~ñàžàD8wŸƒ!ßÁ£Õßî,§¡9ô6£ –±»7»Œ»0[J¬³dIŒÈžÂ–Å´`a–)E09lí˜É™Áfrªf&‡!“çÄy’ɦk†ûÌ'ç7…²¿¹uužÌOªÚÜû]‡â*Ì“}ð¢ãí€CšHËRªà¼wpiŠ'ÙmÔ3 ìíèÂ^CÏ. ªþõJ0«Ž"Í#öà§Ü2±‡GÂn0B[üç°L'm™¯k­o>ÞûƒæÆ$:˜É:H»³3Pax¨ß(H‰ž9µs“ð,=TçÆ¹ ž›õŠøø”„®û¾iÏâ‚oMàXç'³¬I(gN__þ NÍÓ endstream endobj 4740 0 obj 6071 endobj 4744 0 obj [288 /XYZ 32.1599999 145.939999 0] endobj 4745 0 obj [288 /XYZ 32.1599999 145.939999 0] endobj 4746 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 100.819999 98.4000000 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview >> endobj 4747 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 92.1800000 108.960000 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries >> endobj 4748 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 83.5400000 151.199999 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig >> endobj 4749 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 74.8999999 207.839999 82.5799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline >> endobj 4750 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 66.2599999 191.519999 73.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers >> endobj 4743 0 obj << /Type /Page /Parent 2 0 R /Contents 4751 0 R /Resources 4753 0 R /Annots 4754 0 R /MediaBox [0 0 595 842] >> endobj 4753 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 4754 0 obj [ 4746 0 R 4747 0 R 4748 0 R 4749 0 R 4750 0 R ] endobj 4751 0 obj << /Length 4752 0 R /Filter /FlateDecode >> stream xœíË®äªqß_áõ•¦¯Á`@ºŠtÏ<"ei4#eeŸ>ëÿœHyÑ|è›Scƒÿ}ý×éç±óÓxåËûßëoÿkhó;ýëÍÿ¤?þbÚø~’ª¾üsüB(¡Rÿ˜n~;ýá§æ_zòÒîðÿ»Ž)*{¶i?®¯’Ë¿ù«Pgmú¾oeCÕãäÿùëéoºµë0Î’u¤”3ý]õL´\Jª¿‹Îü­ê‰06ôÅu3RP wéôäLxm[›[”$jiÙ8»–pSiQ"™'/¶OÿÚÖÖ–DKµtÙ8;ƒ¸©¤(m¯.“§t3—\ÛÚŽªúTÈÕc"g7¢ÄÓÔY1BÄ€ŠÕâÐ ¯“ü2Q.6Ïtjj;ÌK$£.c"Û&g€¶”–ô…‘ZµŒ¦­í`Ú¾H„Z5´²mv#pSgÞm–ÉÀïk:’C/Šm1´L!EºY·I»‘eºjrõAôßB7ŸÃ†fänf(›¡´akŠ®§àFJê]­çÈ…†rC¡½A(LãPÍ|TJ;_z6zNÛAï4´è‡qf>*rPÐ' ú%îw¥'#‡a|¾Ž#: ÌñÐ? üñWøÇÄ*è-VáCÚË×ÓÏŸˆžÊšùú7­Ê†'Þ_“I4…6‡¿þ¥ù¥m;õ›æë?NêÌU'ø Ý! |çt§ý¼ó‚¸Ówdü¨‰[aо[ë¡;nÆ ƒg ކ?p?,´ÑO ¿j’Ÿú+R`„Y&óñ$K1„ #$L‘ȇÉÂÃh0ù!ˆŒÁd ŽÀ)̶0Ü0‚¾ÏÆØ 7¬ÁxDäp ÅÃXðÐ(BH{FŽšÂE´æáXRÀ´Ò5JäÃ))Å?&Ü`.é`ƒ…•TnÚÐ)7HV ¬ÂŽŒHŒÍã1’ZÅií¾´vyÌ£àFZp0æ`‘P{à ¦k Å#`ÝÍDÊÇ”¸‹è½º¬3¡âÁ‘ž~˳”mÓ‹áC"/W¹¾ÒÓ•×SÏÏ„h_’ëSì®6ïC?o~÷Ãkõ6ãvúŠ~ç~$ÃSê®ußÇ·ÓËOÅ,$cõŒÞ]æIm(zÞS>Gêh}ÈÛ…‘Îú3%ÒÂ?|gävf#úgøWVóFŠs ° »QüØ*iϽ¸ô¸¢?竪½Ÿ¨áí…;.>mô8BΜõk=º¨üÜQIîM A;wb¡oÆÏ]š×è"’njn €Ó0Òf ö<•É¡^ RYÌÀ>Bˆ0ð˜aSAØ4V; º%0€ï°ÎƦ=’–Aƒ¦Â¦VxhN«ö»|×`—Ði¨þz«?ÚƒÀ* 2G‡Ü8úIdݦóÑžÎûÜLÂTo1‰1œ‰+B\4ÛÔ䀱ßuyßAChy'.……£ŽÅìî¶xœ-ؘGD\<†ìîaqL¬,©Ê(„°U¥ÃŒAbÁž–T%(0‚"=G‰š¯$6G™Å‚™4êl‰Ò–‹4%h<ý¼l’Œ´#!ÚÉÙ§ìì>¶±]Ò€5h,x:« <…êÏy× ˜raPÈõºF±cJÀ@’ÙiÓ¸àbZ7‘¹bt1ÐØ€Ó<4”ÒLωÜÂÑŒØ0€M:Äxl4Ù"ì‘ îùU•6®= ”0»ÆKvøö_ln³ÙïºìDú6yɰzs|0G«Et«Ž ®ô8ŸÎ7¨äÒQˆÅ‹1~¶ÀÔ®ë ³b:ԉϾ¡ Š¢=±ª´vZ˜?`£â ™¢ë-uâIQÄøú˜¤58“%YÒlívË*ÙƒXcÿb™GCa<éõx8táUy`Îo‹[‡‰åzÄR†Ïo‹]/ë",›-vDØÔ‰kGW…uïáVTf$Th¹2à3"ˆô½¡Ðª2áÓÈow~ôJ—Ã"—Û´Á˜0Õ¢¬.„ì÷Ì ¶°]í±"Ä6ÆáNj½ræ0S ´J¸ŒÙb½fifÊÒL³Æ®OANe‘ÚÒPÁ}!ùð˜PùÉV°<Àê9],Øáƒ78¿¦,Œ0ºàmðf8—Τg ¿ã‰¤Ãý” XJbóк„×LwÇl"Ý„)ꇬRÊ =i–&âîÀ¶.|'»M®Ì&ˆÃK i‘îhsÁ¾XÐ#ŽˆÆûHl ê6(iº½žœ“Ñ®’­šaÈÝÍ´mí¼äÖ¶Ï]s\àþ‚NÛ}SÉ/KLÀlâÐ ©Ã>XÎÅKJ,¢‰Ou€³¿=Ù¹eCöÙÝõ2+„n>‰…‚º©¬Ì¢2OPÌÂú¬œÒš®ln}f·¼wÔÇQJcd¤LNdHþ½ÕÕ¥ˆL ˜Éº‚â1äàø¨³- fAÇè š‡°7†ÓáÄL®¬Ÿ£EZÎÜp¦l|©)D÷„RSvA«ñy¤æQò"ébÒaHlHÇy lðüëÛ’ÊxnÊ…Ä{t9“©²Á!ì#¼ªR+›Eš7*EYo£ÕÞ UãT5NŠ (bSÑ^y6{-‰”nj*S²i(€´Ÿ’í·ΧƒW¾1å—jµÆZ­ñ—Z­-)jµÆGMƒªÕóTkŒÓfÉjH¬0T»Bx‚w<ùHe#ÅÂð"Å#Ôà±!U¥.ˆ‚0Í<Ñ1¬«WŒ1…¨Öè¡*í 0‡ØÇV¹•2Í<óIkˆcT2<ê«ÔÉIU2F…y¤%ìÁ3E» ãn+T%¹®Ñ$U•?£& y¯ž±ÁïÀ£Gàa4XbŠí‰Ú‹a Œ5‚°t×jàGYšMer‡ôV!sûEú4Õü<“JÉEL”Ö'0æ0ò Þ #ea-˜Ôh9@)¨Ý)>KýÊ(ê=ÈYJôUxVáù–…g¡ó-àù|‹ÃÂBâNñ°Y›½ñ˜x%ZvÝŽïú‚“ã·¬aJ¹Æl²É²c&b«ª †S·“éìd :iA;ÕD¥/Ú ±¿ÉIª?þñ ]PdE¢ßlffª³$õ³nf.¢ži¯@Àõ$v_ezk^ê*Ó£®2•´a×nëèõt$~àôT"2é‚?fqÅeWa`Õxazº.¶<*Å?WŒQ>þûy_ÅÝÁÅ]]©Ë#“è¢dZ ®5qS»*eÔ™M뮥u§Q[>à™]¨\ÞÝE×A¢F´ãADV‘’Z¤ÔÀ-¢Õù󽃱ÿ1"ßSb»ƒ­;ØbGìÁ÷Œ c ¢zð¨áݘíiié:í²¼×?17Â\¯JªWÎÂB­Þ©wêz§Þ)~‡Ã¤§1as.è£Âw.êÖŸ7ÅKŒâmoŠ·WV¥gÝróýú»;KÙ6½>!r¼Ê›¾þ¦+¯§žŸ Qt(5=ÅîZaó>ôóæ7^kì·[§Ë;ÖHôSê®ußÇ·ÓËOMð ˜1e¹£Ó^»Î•[8Oo´ŒfÉe¦óBß莡¦¥„´Ñ,]Ês4¥÷n–ØÈb¤=÷‚Ü¥š2zžÝ![}i°v™@â7÷)•M–¯TÔÂû‚pËÑêIŽcHÑH|-ÕÄn{2=áÜLÌi˜sÑ“–8÷†Ž #'9«~X=ó˜|劉Ɵ°±jW@œj[•ÔcuÃe0qGF=ß™·p#0Y„å_=cwÅzÆ®G?×»Òuêâß#ž±Kô,L>ýQºm³kå„z^—K;f!Ïór)ï¬Ñ¼…órs–ño• °£ìbݯÐþQ¶˜¢œ³ál.³%t0Ê÷È.N¹-»Ž²ó.ç ‹2(#ëYaeΠˈå^Ùz¹G¶F¾¦¡ïUÚ$ÍJÄÛ:ã+"À’¥üK’r3»›¥ÎN =š¿U×OÙÙõ©íÉxŒk…ÏC@gÿâ©ÕÀûnê¶Vø¬>‘ø©>}âáMVøä2\·»}} Pƒ¾5èP5èû¨Vd úæ ú–Qn= [uκ«EkQÄ]¿Å¢ˆ}®ˆ_EJj‘Rc]8ˆÖ¢ˆ¾wjQDd(cÔ¢ˆµ(â õÊeÈêz§Þ©wêǸS )úLÀ­…·©dH³1 Rtdêr\IXJÙs€èÐXÚá ñsJÑØ¥ i,åRÙå ALºiÔkî85ᲂÙ÷úÖ[xÈT°¦ÎYøß?u®–Ø–C›§ ¦r¤›!ëtg’ÃDJþΙ{)¤%—"ò 1õ÷\Q‚¨®èy'¼±|}ª½g~`N+“"ÍBácÊ &ÍÆ‡yp½ärpÏ`Û§Šê-` ×.Þ$) !d”îÊÔZºI÷Á ׬„w9ÀMY–¡t‰ÞݪºzLegTv×eò ™ Rt‘63zp*'aØ‹$®´e]71 ¤åÖ÷¢û¬”—½Bqž²'ùËü9b#¦‚ý¡±“5¢žRis0Šwu2À–@KØç*´×uC½1T-ù0Q`jÕEœ~OÝX¿y9ÞbyžZl˜³C¤åñ"⸇ J ÉmÝÁC„êÎ|¸Êzá G(VBš`1Ûô1á¸BeÁŽˆuA`%Ñ@o¨4­R¶Áv˜-£œÛþš­ô,…hˬ·ä\RílÜe*$š¢6Ï §ôŠå–ª.»œYýæG”ïc»y“fçhpßfN=â(’ÝN++UËZHÚʹpfÓÙy²6ÅyŽÕJSû D[„ëâ¶ÃµúRøêi4ZÄñ¨I+äm1Yj ¥¤Ã¿Ù¥¼”¶”÷,ó"ÀàÆvœ0'†ç#œ‚øðxðlØÔ95Œ"V¬BÐ+à½K&$a…¡óa•u±; ýRX»¸›)º±—AP8»¨ÀŠ7—–4Ú}•3O¥ëÁ A ³„-ÓÝüeTd4 µð„K§·å!ÏGÒ.鎦 ì¿’ôºÿŠ‚Êýd9ïUX²ˆÁY”Æ÷cöÜ/€½­Ë3AgGÖGÐBÀ#I¶ó\Œè©…ç4û»lƒ%ÆyqäZD.nD7áüŽÖm°XIqªBL*),6aŽ0ÕV¸‰»§ÁGxÁ‡LgTZl Æ…X8²d{Øzc>¯f”¸²#=ÛZœˆ=<›ˆð‚VW¤„àƒÐy—îú–ØTš¶¼ÏÍgC±5kä;FìLª»'ÁÆJp˜R¨l;¤í”¶²Nm…W«A¨…ËG¸]o‘»›Ù1™A%·’ìT,- -E`ïˆÜÑ…¦Í•ê—µùŒGœ<3¼`)éà+jÿ8KÕ º‹­UOŽV¾/s9ýŽÚx0ç•›†Ê:¯™ƒ m^üäVÔåñì®5{g}VÇ{…ȉÑIª5ì¾v½3"s¤váÖÃÃ|£N|aѺS½~0S‚p‹ÂV~áBÚs/È}–uDA*L¨ ¢Áz‡²rB]9j|·ÚŸŽt̳Ժe#q¡Ò‡°ÄxѰ–ƒ•ZÒdó…7#òèòän±Ä“Tv† ¨+#Øn•¢ViSJc."¨Ã•˜ÞeñtIoÃöacâÐÅ3”#¦dÉ caýþF Œí’ÿé ÕeãæÁB5Ö Â¾qKؤWnwàÌdÛP)Uhýàq@P’ΠLêq¦j»•@˜Ù+ö@ExG˜)ÃëÆ;l¶§Wÿ©˜ÿ´bƒ\§>qðä!¢$ᤇ$Ú¥@ê\:ÉÖ;¨d—`¥×å‚ $"Aô‘·³Æ$våXš* %MpšŠ¤8[Èœ¼´™4Ù²¹l:ºÈÛ0©þº `büýmò̾Ò: 4SgÝÒÒ†tÝ·e `àÝýAºcG”M&#Ü¡á‚Ù˜ c. ÁXœÝ¬AļY§£©§óÌI0nè#}í }¢k´C©9è<Ðá÷ëom=˶dø„ÈËÕN_iϲӛ+¯§^ QTJ2]ë引éר‡~Þüî‡×ëmÊí>ô•ד5’á©nÞÊý<^OßN/?ÝÁ„80!ëHšD¨«Ë¢¿†µ(x¡:PŠƒ8ÜF¦¬±I®œN Rѳ»L®3¤B˜˜_øçéËF"düžY¿D„LÚ¢¯8D¨¯23­L¿ø=2¶D„¬súè\"žêæ­ÜÏcg"äWÃþ0ÂÝÆØß»'¢ÒkÒ­zësCüÀÉÄZ•Í. üà¥zÂøåùþÆPæ»P,a!·ñj¯¯PC”Ó•Wý1¤{{ª½o¦wózº^ ¢µ N7äòÒý`†§ø}3ü¾›o–<(Aû„÷#ñ_K­v†ôÖd8Vd„Y‰¨Kœ#L¦ÚD)CuôþÂj²•Ä"[I—ÈVs‰EOúŠC¶—§ÚûfÚy77²•íÙ ew£¯8d+ntzm†ßw³+ÙÊÞ²õ ‡ðù…+f ª ®ÏðIRó1“óš"âäzÞ°Ñq~Ýö(ëe‰œ¼‡N°ù…Õ²D©{YBÚvA––ZL>\±eÉøT{ßL;ïæ&K”\’%Ús·d‰¾âÈ’ËSü¾~ßÍž²„´ì^5Ämƒ Cr)«öoÚ†)ê`Õ@DúJD$:"ɼÝ!> endobj 4757 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 161.759999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module >> endobj 4758 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 185.759999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4759 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 751.700000 249.119999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp >> endobj 4760 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 170.399999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows >> endobj 4761 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 734.419999 246.239999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio >> endobj 4762 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 725.779999 185.759999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake >> endobj 4763 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 717.139999 168.480000 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 4764 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 708.500000 245.279999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 4765 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 699.860000 132.959999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions >> endobj 4766 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 154.079999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables >> endobj 4767 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 682.580000 132.959999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4768 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 673.940000 145.439999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 4769 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 665.300000 197.279999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 4770 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 656.659999 187.680000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums >> endobj 4771 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 648.019999 195.359999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums >> endobj 4772 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 639.379999 197.279999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums >> endobj 4773 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 630.740000 180.959999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums >> endobj 4774 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 622.100000 128.159999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers >> endobj 4775 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 613.460000 133.919999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures >> endobj 4776 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 604.820000 139.679999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes >> endobj 4777 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 596.179999 153.120000 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance >> endobj 4778 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 587.540000 242.399999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays >> endobj 4779 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 578.899999 178.079999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers >> endobj 4780 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 570.259999 183.839999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions >> endobj 4781 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 561.620000 174.239999 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments >> endobj 4782 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 552.980000 155.039999 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 4783 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 544.340000 148.319999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates >> endobj 4784 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 535.700000 163.679999 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers >> endobj 4785 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 527.060000 228 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr >> endobj 4786 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 518.419999 208.799999 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic >> endobj 4787 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 509.780000 204 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details >> endobj 4788 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 501.139999 185.759999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass >> endobj 4789 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 492.499999 248.159999 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas >> endobj 4790 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 483.859999 172.319999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 4791 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 475.219999 234.719999 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas >> endobj 4792 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 466.579999 158.879999 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 4793 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 457.939999 204.959999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management >> endobj 4794 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 449.299999 172.319999 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring >> endobj 4795 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 440.659999 250.079999 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc >> endobj 4796 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 432.019999 394.079999 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 4797 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 423.379999 278.879999 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries >> endobj 4798 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 414.739999 168.479999 422.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 4799 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 406.099999 144.479999 413.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes >> endobj 4800 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 397.459999 207.839999 405.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 4801 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 388.819999 215.519999 396.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4802 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 380.179999 217.439999 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes >> endobj 4803 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 371.539999 132.959999 379.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 4804 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 362.899999 209.759999 370.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 4805 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 354.259999 159.839999 361.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors >> endobj 4806 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 345.619999 151.199999 353.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes >> endobj 4807 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 336.979999 179.039999 344.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead >> endobj 4808 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 328.339999 180.959999 336.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example >> endobj 4809 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 319.699999 179.039999 327.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading >> endobj 4810 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 311.059999 190.560000 318.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance >> endobj 4811 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 302.419999 197.279999 310.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 4812 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 293.779999 160.800000 301.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected >> endobj 4813 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 285.139999 168.480000 292.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization >> endobj 4814 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 276.499999 176.159999 284.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions >> endobj 4815 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 267.859999 195.359999 275.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension >> endobj 4816 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 259.219999 206.879999 266.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode >> endobj 4817 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 250.579999 280.799999 258.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 4818 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 241.939999 237.599999 249.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access >> endobj 4819 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 233.300000 129.120000 240.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques >> endobj 4820 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 224.659999 311.519999 232.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters >> endobj 4821 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 216.019999 151.199999 223.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers >> endobj 4822 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 207.379999 212.639999 215.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 4823 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 198.739999 169.439999 206.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 4824 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 190.099999 171.359999 197.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char >> endobj 4825 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 181.459999 267.360000 189.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations >> endobj 4826 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 172.819999 112.799999 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 4827 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 164.180000 203.039999 171.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 4828 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 155.540000 230.879999 163.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 4829 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 146.899999 164.639999 154.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 >> endobj 4830 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 138.259999 163.679999 145.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap >> endobj 4831 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 129.619999 256.799999 137.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4832 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 120.979999 175.199999 128.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 4833 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 112.339999 169.439999 120.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 4834 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 103.699999 235.679999 111.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 4835 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 95.0600000 163.679999 102.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 4836 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 86.4200000 185.759999 94.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 4837 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 77.7800000 129.120000 85.4600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples >> endobj 4838 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 69.1399999 256.799999 76.8199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4839 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 60.4999999 281.759999 68.1799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 4755 0 obj << /Type /Page /Parent 2 0 R /Contents 4840 0 R /Resources 4842 0 R /Annots 4843 0 R /MediaBox [0 0 595 842] >> endobj 4842 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 4843 0 obj [ 4756 0 R 4757 0 R 4758 0 R 4759 0 R 4760 0 R 4761 0 R 4762 0 R 4763 0 R 4764 0 R 4765 0 R 4766 0 R 4767 0 R 4768 0 R 4769 0 R 4770 0 R 4771 0 R 4772 0 R 4773 0 R 4774 0 R 4775 0 R 4776 0 R 4777 0 R 4778 0 R 4779 0 R 4780 0 R 4781 0 R 4782 0 R 4783 0 R 4784 0 R 4785 0 R 4786 0 R 4787 0 R 4788 0 R 4789 0 R 4790 0 R 4791 0 R 4792 0 R 4793 0 R 4794 0 R 4795 0 R 4796 0 R 4797 0 R 4798 0 R 4799 0 R 4800 0 R 4801 0 R 4802 0 R 4803 0 R 4804 0 R 4805 0 R 4806 0 R 4807 0 R 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4812 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R 4829 0 R 4830 0 R 4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R 4838 0 R 4839 0 R ] endobj 4840 0 obj << /Length 4841 0 R /Filter /FlateDecode >> stream xœí][¯9n~?¿¢Ÿ˜3ºQ 0¶gä!€1ä!ÈCàÝÍb/â݇üý”ºªt¡¤.IUÕªsÆ`ìf«Éºõ‘¢~ü—_ÿëößÿ¸ýøñ×ÿ½}Yþþøë y%’Ìnö¿BÓ¯œÍÿT^™±n_¾¾|»}{ùüòyúÿ·*ï?\þš¾\EÌ ÿñåo/?ÎÂ_fʯÿmú×ÿÝØí_§O½ýÇNýqág|}ÑFÚüÏüÊ(ÓÓ‡ð_öË¿¼üûn›.AßùÚÿÿÀcØ®ëøæ~Jïÿ…?- #7Á5eâF)›®¦Çñ÷?½üÙÞÕ® dá²›¸¥™þ¼$PO©ŒÑG¶^^;J)É0ÚŸÄß'[îs•dn¡\3½ü_‡<>1ÛÅþÇ—0:íñYIôÊ¥ÃßÚ—{ §<;c-Ú újÿ9ËòÜ övqÍ›þø8:äú4õÝTÀÝsþ ³à• ^µžü²àöo5_år¢0;Ô^ØBù2ýˆ¾Rj˜Ö~‰ÙPŒýÅB`ö‡7Ì€&bèýGñÅØQ³XÌ_У£É££Ñ¬Æü“ùöà‡~{ùñcgðßþ<}uæ¿~›ž ÈÛ÷«Ð·ßþxû§é>ýóí·¿N¾åU*ªÜÎßÈû7Ú(‡²×IaŽ1–o JàNëÈ`¨*}Sþ QøJ–÷qþ­ÁîõJ ºÖt(¾Oö æžÈ/r/?£·Ç믵Ì>y[ `BùUÌ÷÷óo“;ñŠ˜3ÑIŸîêdå""X÷Peã@‘ËÙ8l|%±ñû(³!¡oã@r6. 3QÞ¨ˆÅ µñéïùuòYÁètUBÆ6®ïßÈWv·ý³¬1µ¨Må$?ß 0­Y¦HÞ¢Q€Ztš)ªBdŠäŒB1¬­%1Šû(³!¡oRçŒB*,f¢$Fq1ˆÅ 5 %Ö×ùKÉ(®ìÿ˜=Ù§êÙºgæMb²%'3ïÏ­ÖØö t£+X§5¦CBµk…,X뜂MËÔ‚7Ydž„b¼k™³` XÌDI,ø> b6‹jÁÓjæj¡ëƒhSt,¾úÄ ß ÑåBŒ† =ñCÉ3úØhÛf]UrNCÂjÛÇk°„4¸ìùßòâ‹ýTŒ7ËbІÂ6µ¿ìø‡û7æ•L¯=2ƒå›m}AêñõEȬ¾lÍŒ@<0"3s#9iKÁsÁ<ŠÄlH(ÆÍŒˆÌ\ÀOÄðd.˜GAÌb1#çF’|,©@º²èqð‰»9Ò^:>™žÂê:º®,‘›Ì eKnŒ¥]WøÌ¨P‹ fX3ÊÁôßßÿôòáéªÈ¦Èð®ŠlEÔ8­WÅä='„Cõl¾²)v4$ö†Ôé§b ñ¡¨É„ ‹Lêã”!FH|ꘀŠqJŠ”àòÛð2ŠSaz% ~IV,›×:Œ­èƒ ,70XqxŒ,]ÅP±^ÿ)ýXé®U@(·þ5!a‡ (~g«r-Ÿå I)ºD³|ÉnŠ,1 Y)_^¤Y"ºÒ¤¹,Ÿ`œÖÏ3…~ Ë k¡+±£xÈ%¾}øÃÓuY‹Y•¥ØÔŠÔÿ”W¦G‚³iHQž ’i#Y™–ˆ=–Z»=XaüTdß¿*É|Ó²È*¾^D6¬*KoÛÏLú{W_p¡! ÕK+…`6¦r0Óf³”di¬¥T³­büÒJå`6¦0Ìf)ÉÒJ9˜Í³XÌÐ¥•^AŠòtFz¥É¶Çvº Œ=p!Ewæì(™ì{\ÖH`ŒiŒQNÆ&AHçc²d*ípŒ¦É²ÞAñýR\l”¹êzUN毢nwÚeÍ-³Å­‰‹õÑ.LxNA7§ ƒ‘8“EâL‚Ä™ g<gb$Î`$Îd‘8“ q&ƒÄÄ™‰3W@â8q>Y•ÖµðG9";'Òbqâ@,jBB­êqŠjÙ8ÍÕ²qŠkÙ,«Þ<ŠÄlH(Æ©§¹Z6Nq-›¥`Õ›GAÌb1CUºZ¶""õ ìØN‡ö´8ïò⪌\¹’Ýk¶º.ïíâ< TÛ Gõ`œçêÁ8Çõ`–’Ø wõ`ž Åx;á¹z0‹~ 1,­›GAÌb1C턯€WCâ¼ä2s3|¶lÞÊ~¾U¹B¾š·•_qʯ8äʯ8àò+KIt\ù•gCB1^E®üŠ \~e)‰ W~åÙ@,f¨‚CªÔ‚t(‰‘ŽdI“,"Ë™€gÅþÏ :ÀÁ#«zxdÏ%Œâ¹ZW}ÐËä!n>椊¯¥L4‰Të×ê +ÕÅ®UšºçÊ­â…„”Fó (qKiYr$©$˜fÇ÷A¨UF¶Vê×P³Æ_œó°_}¹@¶^uÍÀÊi؆ÔtƒbÕ§Nž]Bõñ{ILH8@õèò΂És=W²ô܆]~ßÎN0—æžÅ•p€ÆqunÏCÙÙ•¡…úÂÓ.há¢:!\éÿ¼z\ µ«G(') —“ç$-¯çQ$fCB1nõ( —“´%VPl~ßÛõL6ñûš&©r/p Qá~Šæp?E1îg)™G‘˜ Å8D‘î§Æý,C ó(ˆÙ@,f$¢¨ëpÎ’rT(Ô¡74óí 6·«„Êî¥\Ïò ?ô`oRÛ(êy1!aÿªL± ”%)ξÙw#{Ú”½ãpš†Æš]+ñƪâ¾Õ  Õ1ƒ@µhJäjÑ”Àµh–’Ä ÂÕ¢y6$ãc‘«ES×¢YJ3W‹æÙ@,fhÌÎ`NqgϲŸ{|áÃþú‰ÚÊõ…£àS%/Ÿ*©¿kö{Òìw>;ºóI'!¡zvÔ¨žLé\=™Ò¸žÌR’ÙQ»z2φ„büì¨sõdJáz2KIfGå§CÕ“y1CgG= ,Ús!Çú»G_À”+ÏQÚÌC›¹@MÜÆ«òa=åˆÉbnǬËe6UÖÃçGÖ W{síÎ'äÒ„„ý:¨éPÍ\µUy5ý;Ýù½ªãq|½P~&-Ü{=¢ëßûœ´žtɃ¼bîÖе½!ÙX¥…«ïY Hœ]eźÝr¨pÏÞÓžêý÷¥m¿ ôì퉽¿ŒÞ .€h8-h‰ç{jç{Š0ixõöPÍò.Œ»¥ËB—:6ì&nÈ]í¿Ïú)Æœ Œ„„ó¦+(v8-[ºzЬžõϱ•Œ 'ׯA¿C&Ç,º;ú5ì èò›'މìûë‹’ üÎ0F^ ¶VnlGwâíÓ–É4TTöLKÏi:±çø×.Ý/û›?¾¿…ÅžöUëüëΚ”‡„—x”#K9tý}!Ý®ßvpcúò#ø¥vÑkƒšXN=¶rbZ£*ÓÉfrbÚà*SKÁ9±y‰ÙPŒË‰M29±éò±V™Î£ f±˜‘91m*ªLöÝN°wB-74$`'phÈÈïG¥}7~ónǧP½Ph-ntn-n4^‹[J²Ðn-îÙPŒ_¨ÜZÜ(¼·”d ÜZܳXÌÐE€vÞê˰ŽMîô´}FgB£Ý¢u>sn%ìn‡aÜÞçõ³NÛa{íQ«Š;µÃ¸Óæ†+—õÓºÆ\?ËL; 3YbÜÃRp;Œû(r‰ïch;Œé l÷mkߎɣõxçíÜI2“œR԰ݽ¾|{{Žù~Æá+J¡ðr6¢"ÔÏÃ-'ïH޵5Á˜4߈ÞÑmG8±ý×$(6º†¼]åA=…. 5µ“zÂv-¬s|#ˆ1„Æ[P'Bf êDE[PïÄ,£H̆„bÖ f"d¶ NTžˆI¶ .£ f±˜AŒ!Ì­’Ìò!©;°ÐàQ>ø÷aIsx5½4wp¥!¡Ú’8G–Ä3ÇLT‰Uœ'Ç,£H̆„b¼%ṉ̃•&b’c –Q³XÌPKâ®cà<‘çrfoJ+ßåŠz5!îN̪M(2!Èìøœ¨ë6$;>—Q$fCB1Þ„ ³ãÓa°‘ìø\FAÌb1CMV”Œ‰’ rŠNC1ùž¢c‹[ê¥ÚnÉvȉCÕ[øVótgÎs !¡Ú<¥Aæ©2€×DeØnTx-£H̆„b¼yÊ à5Q#Àk1ˆÅ 5O寎úÆCÎhYŠ¿‡°ª­fñ“ÂêžBõö·SoåÊmԽÄŽPmåZ!+×™ÚC Áæg’Ú–e‰ÙPŒ·r©m™¨€Å褶e1ˆÅ µrã0Á÷Ç^§LôÈ5pŽ÷á+‘zDìm8šÜMD ‚(ÉA”` ÈR°ÙÏ£H̆„bœÙS’‚(Á@¥`³ŸGAÌb1#ÍžRòÎÍþâ’CvOÒŸ£+Wï + NØ)´xJ]Ù7!¡ÚC0pQ–¸(×¥$‚9€Ë³!¡ï!Xࢠ\–’xæ.Ïb1C=s»´/SP•D¸=VÑr$Ι;wªöh6ÓmåèêÍ‘9°ÌD„3;Æc¥{빚ïè‘s`ø‘ï© 0TDŠë˜Ò *Ð"w ® °4©C.ë§è@‘ésæ@C¹Á2xr È<Ї\âû[AA…+ì3Ű©¬Zýµ8m¸ù¡¹¶[½»ÊŸz,sjÛÓ‹»ø›O=õ8¢¹¸ ß„O†„ýÎÃoáž?K’s’aÖ,umq —å˜Øy€Î9PX¨ÔyØQ<äßÇ`ç!·ÏŠm˜Ö[ê…¶OÞ)'û zê§Î_t^ Ú1˜'õxé©”×G¨Ñ½ÈxK¢#T¯Î‚m©ÊÁ¶TcØÖR’ÕY°Sl»Šñ«3•ƒm©Â°­¥$«3å`[Ïb1CWgºâÞŸŠ~î±½-ùÖr)Á)›ƒ”Po# Ïî$Õ´Rí»`êPm¨­& ´šh5 Õx ÕÄ@«Á@«É­&ZMh5h51Ðj®´2²mtÚµ -=¡|&rèl\îbÐÑÑ6õfXž˜o‹òÕ« {ÀËr§Úe0âW¡CB­Ë`!¯ŒæWF1òj)ØeÌ£H̆„bœË`4‡¼2Š‘WKÁ.c1ˆÅ uTw¿[—qrk½ýeeõÎ…úS’yH¨v.]2ž+ºd]ZJâ\¸+ºôlH(Æ;ž+ºd ]ZJâ\˜÷&<*ºôb†:îÌâ€7•fÙ\|ì)Ë|Ò~†çxŸzÃå¾S…„wKM‚bõ<&¨zCŠ{hùpùé Ö9´dsßðË©ØÛÛƒm–'s²9³ T¯<½¡Ü̸^ÙR’™ \½²gCB1~f¹ze&p½²¥$3›põÊž Äb†Îl°ç¬žwº)5ØöøláÕg#pø³V!áÄr­J ó§Ç¶ïÐå=g!>Èå”&e;3•ŠtË (±²íÊ¥2µ²˜>çZY0…[YX Î¥ZÚœ-]¹¬Ÿ¢VÓçL+‹‰ X†LZYÌ£xÈ%¾±¹T¦¶°9%‰"!tlDjÝõEœŒá‹?¡"|N(2å:B.‘…jËS0òLçò6ºAaNóó(³!¡=é\ž‚iœ§°”$zÒ.OáÙ@,fhôdÜÛ¬oo”nJ”¦¬àçÖæ±¼’ì‡ÞÕ»?qd‡ú5Ð3>AB‰°ƒ HûŸÛ¿¦¯Ì®cÓeOäþ@NîìöžI Ïõɪ|–³ê(âéêÍØS,tÈF”êÞA±á}“õ['(-ÉI.-É NKZ ŽæQ$fCB1.Bà$—–ä§%-Gó(ˆÙ@,fd„`‹J–×ùöƒ_ÞÍTÏ‹œ æ%+¡ÚÊ£q–Ë£q†óh–’Xsy4φ„b¼5°\SœG³”ÄõgQÍ‹j Ìþ´ì€UötÛgfº‹¸\‰Ü0å•U½ã ¤9ë«A—ãz~õ>‹¹¢†Pí³8ÊL¡AÎg œ!±”Äg —!ñlH(Æû,žËpŽ3$–’ø,î2$ž Äb†ú,áŽâE;IN’Ov´l/­·Cà=gkÕ»¬›´.f.Âר‹Pm.€jì9äjì¹Ä5ö–’˜‹ôöQý*Æ› äjì9à{KIÌ\½g±˜¡æ"WŒ™},ª\ÃdÜÓ`óhÔ4_Ó³­¤aJ–þ µƒåuC9Àî€A*â Vû”²6:$TÛ§B5W9ÈÚ¶ÊE†£RÈzEb6$ãíSå k[‡Å¤õ< b6‹jŸÚ™É¹ý» ¸s›ÿÔï°yŸ jµÌù= þž%yCú­põC{0[…„3Ál…ìâà³¢“grì1¹ ]+ŸÒ0cÜ2¥¦Rc‘‚~}Ëhì®Òî:€­ŸE¦ô‰Ê,—>XšÔ!—õÓŠ‘®ŸY¦ôÁ7…eФôá>Ї\âû[úÀͰÆ<[§ ?B­zzQ6”¶• pãÐ¥BBm<'(‚TÍAª‚bHÕRp<7"1Šqñœ 9HU ©Z ŽçæQ³XÌÈxNP©–{Òu$ĨQrLLyòÛ‘ò_©ÜêHPß—„†„ 7'AH•NñY ]d†AýÕ•ñË™âH ¹·µéBlÏ!¶‚cÄÖR—ÈbëÙPŒw‰,‡Ø †[KI\"sˆ­g±˜¡.‘‹wá¯9ììÓ×ܨ´Þ‹r G„ó»ñÚ·Y7žŒàŸŠÊ÷¾çdzµ¾µ· W 1ŸÌ…hÓ± ”["—[€s –’8vðž\D¹…UŒwì"—[ç,%qìÂå<ˆÅ uìàú÷tÓ4lµßÎ 4xµ–öS›'tÙi2ó©4a>ØÖ˜àÒóºr%T›–Di!sié°ÎË4-0"1Šñ¦%si!qZÀRÓ’.-àÙ@,f¨i)÷:‹•9-›Ä¢œž–ü üŠªx«%)wÆæ!¡Ú’4ªø:Wñ)4®ø´”Ä’´«øôlH(Æ[’ÎU| +>-%±$í*>=ˆÅ µ$íÆSޱËñû¥—þõ%3OîXï´oˆ­B‰é3PHëOß« &šó“ãrVƒ;HM¦ÅŽÊêÍÖ<û@rÀ> ì[ žGæQ$fCB1n™>äæ“û&ì7qx6‹9‘ïJ)™·¿²8´n*= ²aããaçEq@4‰Õ&L ,DÃ@´¥$&ÌíÙPŒ7aš¢b ÚR° Ï£ f±˜¡&ÌÄ(.ŸYÖ0”7­•‘¿žz¥ÍrÉ® þŽkl9Øõ8Óe¨Œy%T›.GP#ðÔC–’˜®ð¶Ê#¨qãM—ç Fàj´”Ät¹ƒ=ˆÅ 5]±Ý*cül8z·½ÍaÏ>¡c¶Yuì,ºˆá’Ç„3qXé[:žÖïQ}à’{:ó>·‰~;6Ùžy;›Îx ¯0xm)‰³^{6$ã5äÀk ^[Jâ¬Áמ Äb†:k9lýþœ篼"kv$¬WBµ)„YƒÊaÖ 0fm)‰)‡Y{6$ã Hå0kP³¶”Ä€”ì=ˆÅ 5 åлwz°í°QWϾ²œ÷ì”C¯™ »KéÁuFY?çŽsƒs´\JoiR‡\ÖOñqŽ`rÇ9‚ÆÇ9Z .¥¿â!—ø>Æ–ÒƒqÀä…—F ²_߸½§qØ1ýXÚêñÁ¸Ráeš1m˜Ÿ$ó“4‡ùIŠ1?KÁSé<ŠÄlH(ÆM¥’ä0?I0æg)x*GAÌb1#§RI]ùßþÔO˜×9¿:]Á'ն岯ÑÉ Ûªžt%‡6¨p~ÊØ[ÊÙ hv´µl)WªïÛUSÛƒ¬w zjs.¤d.ጵnsæbò–,yKŽ!oKIf.î§*AÞ«?s±ä=yw,†¥÷< b6‹:sq×¹£Øæ  sò1où¨Žþù’;Pšêpæá6©å;YÃ?ýÜåCÊhë™\'r|SY=…ÆhOÓI,òóËçÛ·Éô&˺óšÿúòµ F!©ÌÏÈŒ~úè‡wû·UÃÓeç<€¡òuÞkÀ ZUIù*±"ίЈׂ-N³¬Âö;¿K•ùf~—ÓCeŤ‹7€W9+ ~©99ºøSüÍ+öÊÏòúPä6GHùT»$o3wøKé7Käœû†–îc1å¶ß,o¬åÞ—k»[Э³ÿf¶²há Eyz@j׃¥ZFŽ}²ìS¢;E=x µe‹*jâƒk’E=è¸6V|—´ªxm=¶ðÀ²>•ü ýxˆ^O ‘iÑaCâj/»™`²ú|ä> endobj 4852 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 227.039999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays >> endobj 4853 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 247.199999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object >> endobj 4854 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 751.700000 214.560000 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments >> endobj 4855 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 262.559999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts >> endobj 4856 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 239.519999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method >> endobj 4857 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 239.519999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers >> endobj 4858 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 176.159999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer >> endobj 4859 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 708.500000 317.279999 716.179999 ] /Border [0 0 0] /Dest /#e4#7e#c5l#1b#03F#14f#de#19#b5#895#b3a#ab#c37#b8 >> endobj 4860 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 699.860000 279.839999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 4861 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 311.519999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 4862 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 682.580000 150.240000 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq >> endobj 4863 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 673.940000 113.759999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends >> endobj 4864 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 665.300000 162.719999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments >> endobj 4865 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 656.659999 232.799999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface >> endobj 4866 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 648.019999 196.319999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions >> endobj 4867 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 639.379999 201.120000 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance >> endobj 4868 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 630.740000 136.799999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging >> endobj 4869 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 622.100000 113.759999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples >> endobj 4870 0 obj << /Type /Annot /Subtype /Link /Rect [145.439999 449.299999 186.719999 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 4871 0 obj << /Type /Annot /Subtype /Link /Rect [165.599999 424.339999 257.759999 432.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour >> endobj 4872 0 obj << /Type /Annot /Subtype /Link /Rect [252.959999 269.779999 302.879999 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android >> endobj 4844 0 obj << /Type /Page /Parent 2 0 R /Contents 4873 0 R /Resources 4875 0 R /Annots 4876 0 R /MediaBox [0 0 595 842] >> endobj 4875 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4876 0 obj [ 4851 0 R 4852 0 R 4853 0 R 4854 0 R 4855 0 R 4856 0 R 4857 0 R 4858 0 R 4859 0 R 4860 0 R 4861 0 R 4862 0 R 4863 0 R 4864 0 R 4865 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R ] endobj 4873 0 obj << /Length 4874 0 R /Filter /FlateDecode >> stream xœí=Ɏ帑÷üŠw6ЯÅM"Zº˜Ã…*`†FylÃè2¦Æÿ¾¥§Tˆ 2Hêeg5ЙII\ƒ±/?ÿç—?ÝþúÏÛϾüßíÛôó×—æÞ´Íøï6ü÷Ó¶ë»àã¯Vwn†·oß_~Ü~¼|~ùÜÿÿÇ kN?ú‡óc‡ÿüö—ŸÇÁ_Æ–/þ»ÿí_7~û¯þ¯¿ßþðÇþÇŸ§þ†¾¿hÓ¿ü:þÂ8ãºÿcûÛððo/ÿó»Û?ú)èG¿ÃÿŠuŒ§ÍãÇò){ü·ý¬¹IaZÙOqh`ªßŽÿÿß—¿ «Jš ßNßäͤû94 î'Ù£ûù<=|/Œ±æ £ôu6ë:ù´Îy$sÛŽkúÃÿReûäx/Ò·Ïé(Ûö #±Ûv\Vmû ïè²ìé§«‡¾¿ŽcVÙ7à¾]òúëŽÑïá]·Ó?ð÷p˜Ò¦GÞ<ØaÊaƒ‡1’±®•]Lv:>ô©s3]Û“è°ºJíh Ü$ 3biKë·»;ï*vëYÃøc™ªK\çÒSꆱ¦ÕDõ3bI+›6Þé F9ëýg.kƤÙ,sW#^™TutR ?»êé[ûA%^ðÎÔò­ÿˆÝ3\ëõ­fßM³føbjÐÇ7«ƒ~‰Ö0}ËðÑn2·Ô¾µæofdfd;¦•¯;óãäÃ÷__~þdýë_úG.üñµßAÕÞ~z¬]Þ¾þùöM#>üþöõï=ʾ+ÙêN=^|‹¨É:Wœ=ÿdÏĹ~<ð¢X÷âû‹âüè¢xÉcÛYä±ÕGäqàuöt«k\òØ­ôpé¦Ù³’Ƕ="­²‡é[òøxKí»Qûaª’Çž#šŽsDô¬¹·Û“:/Îdú6òß$<Ú#`·wþXeÐrÖ‡À2 ¿½kÓ´¡ †7)}+Â)['fÊÖtÛ†Œ”­h–Qh|÷æà»FCp‚À¢îÕq¾i†¦‡c|ɬ^§†4¾‚ï/’É#¨ð¢q­,4®Û#4Þ£Y ¿ö-¼Õì»i¶Ã¬h\Ë#4®…3ŒpÑøã-µïFí‡©ŠÆM„‚á¼L#)ŽF ×âèÜ^8ÿžPÜ xX‚qK: '†-Bß6är¸ÚlÄTŒÏ \Ï/œmŽá2Ü‹w?"йsuÜ•ƒ›t25G†7I3ý|8rI¡Ô¢kÄžZt< ]ÓZh|h±©ÅøV³ï¦Ù³P‹®áÔ¢k˜3 s¨Åø–Úw£öÃÔ¤]£gì9â#ýÌþPbzôÁØ¡^ÊÉcÞ®™uÂ\7Û†|˜wh&'ü%ŒTÀ=qpÖI÷^ýäëÆ¢Ö™÷TQ›# ðbQÎ,,ÊùåÒFo}‹ƒEo5ûnší0+åÍ}´ì†é[,ºA›K7j?LU,ÊÛ‹‹ººÕ¬|sifØ]ÿ Œs]`­(<#Gû._m¼Îge¦àݶ!#GÍ; p]šn pé3Œ3ÃõùÎŒ-HŒZÝ=Øë´<Q8ß¾‡ÆžoŸ(Žž^Š#,[v'lÙ´mÙC‹CqäbË^»i¶Ã¬GÙ²;aÛ²‡‡âˆÅ–½v£öÃT¥8r±e_…â TF{1ç^ ¦g°lŽø£ø?øâ:[á?$R3bf>âNàäboå¶!#ë²îIií ÌÃÄra€…Ÿ€ýyõ$@²£ô’eÙk;ud¯íZÛ^;´8$ ]q¾ÚÙkçaV Žìµ²íµC‹CÔb¯]»Qûaª’€v1Œ}9ëpŒïÇ;~AONXŒm ÏS, Ö‰–Ô!°Î ÁXûý¹ cDÇ<…îè¨R»Z/›mC>ª4 ´¿º…©„s¬½X1~‹3íveÚíº#Ón×٦ݡÅÁøÝbÚ]»i¶Ã¬¿;2ívmÚZŒß-¦Ýµµ¦*Æ×Ëq’z’¸B+… òÊä‚’¥¾Ê:ß^,¸Þ6ßmcâÌ¡!Î8†8s`ˆ3«!Îì qÆ6Ä™CCœq qæÀgVCœÙâÌ% qf¶°°Z˜œ±x(Ü\¿§pYÃUÁ«pt 1 &±Ê`y ³Xe¶mÈéÇ,ÀìÙÞ¯«¹ŽÂ”Ôü±¬¿õª„8”ˆ ‰B^Œ17þÆ‘HÈ=FЉð¿=q-uD ÷¡`íÍ}i~„œ|ô^3ËdÜïĽ×Ì6-6½ßjöÝ4Ûaz¯Ù‘Éøá¸¦qMÆã[jßÚS“Þk¶XÞÞèýUè}žˆ¤`.B³Õ,¶ 9 ÁÂÇ yµ"”zÿeRMúóXk6½‚á=âý㉹÷HÉòŸ¸g¡¸rQQº´kÝ¡!ÖL]*/õã–ùZ‹#óµ¶ùzhq¨ŸXÌ×k7Ív˜•úñ#󵿶ùzhq¨_Ì×k7j?LUê'f³\ó ZN®pŒ’„„¶E ±;'7§L®+ŒUwýMÀs0¢±o ´zXF@,óNm22²oæ…ý±kõbxg<˜Š(cpaÒÀã‘Æ°º’²ƒ›b¨@°è¼¿w=ó`û"†dx:èºÙ9³%óߣ'CÇ&2>RûžvÍD웹åÛKk&–€Ím­Þö2ÿ5û)Ìn Ö×=c`!ok&Ã[bÛË~?ñþwÅ =ºùhµøBˆ‰Qu‚On—³NšÜö{†‡AÄÚf}˜ƒ;Y_Œ4F„D롨AR„šm`\íÒ1C«ö˜¡m0C¥­[Ûj3ômÓÝŸz™ÿR{ÌÐÊ#ÌÐ g áb†á-±íe¿ŽÊ˜¡[nŽ% ¿f%ÿ"„r šs0@w‹’·ÓÛ†`9Y[Va­¬ÂZÛVá¡Å‘“õb^»i¶Ã¬r²>²  lãZ…Ç·Ô¾µ¦ªœ¬u!¬#qÿZÚç­hÞ,›é5 “mBï‰i,kŠiެ)¦±­)C‹}OÆ·š}7Ív˜åž˜æÐšbkŠ9°¦˜åb¬Ý¨ý05ï‰ifõµœNÞõŒr„U5K~¹¨ÈçŽÕr¢‚M$'h&Æn]š¡vPBòD*zL³X|$Û6dTôHf]W½3ÉöÞ8™düFÅ×±?®ï/r –³ÏÏK ˜e\0üȸ`¸m\ZbÀãÂÚM³f%ìȸ`˜m\Zlb0¾¥öݨý0U‰_b~jç´poƒ¹ ¼VSB¬ÃÕ'™oßÏõ„Z\Ž.cYBÃu½j¶ ÁX@XáQF…Gi‡G -ëµ»ð¨y˜ ˆ£ð(#ìð¨¡ÅÁb Z»Qûaªb9«9ì,OÊö`bÛ)kH˜)„ˆF3„{g%¥ &Ï@>9ÓÈ%åf˶ ÁHEY8FEàeGà -RQKÎÚM³fE*ê(Ç(;ghqŠZ"pÖnÔ~˜ªH¥ P˜ ¼?Xv'‘Ãb Ù“pˆkgÅŸ˜ÙvÕ&©´Í’(tþ[¨´‡‚{uóÐb«´‡¶Vo{™ÿšvóßü@¥m:æŒÁ•öã-±íe¿Žº*mÓ•R &68™LûH’+âÔÞ¦[°ÎlBÞ{ÀMøË!@OÜ^&åv° èŸ7ÙYÈñ’²Õ’ŠPD b°ÞYß ;Û§Ó G0db†P¸wØîCçVw¼ŽÈKA׌à¡)´Rʲ—`gÊ¢¶eA9¯WÖ‰¯…‚¡Þ) LŽ|¼èáAˆ(Ľ“sGØßaO³ˆ|oáîr®9/¢>!1â¢PÖa4©1\i‚ @ãJ‚'½ÖJ8q«OtDˆpr]#9¶˜Ð´p s«œÇðAeªàbX&„ª-¿&AJ›&% O"âáÁßQ1^²CT(ãn™Oœ]]A&£,ËY3äÛ‰â#ö¢†H[®Hƒ^Ãw$aØ3{óš±2[h4 1ò¦¯î=BXˆ„Æ5Ô/sÔJÌSš²!l1Õ{ò¿“MH‚À çS{Α4›Tá|NnÏï®’G|•«Ëñ“ȹ1×_ $‰=)ë7“–À Ãù´錞 ^AtÁ P¨?,öû‹|ÛðëË—“»›çÒSØŸäWí]‰Ç¡¼6)¸^õ¿ÍvMç1©„"WNæŸY_LêlŸ +ŸÔÀ»^:âêÒ‰ÈP&ªªXäšèfûè›ò4Í.Fm•9;Lá FRr‘$$¡Šª-BëdhãC±ƒ§I.GYÕyU~}oýÚxÐGÔ$Q¯B.h1uF/\þ Ÿ‹.)8i0gÇT¡u¶æiœGëØ„tk]c¤`’>Qú©ºéøKœU\¯ÉõsØÜz¨|%›ln²ÓÛ†6·a ÖMyJ2“cqeôüàÞ8•Ë]hŒqEP „ò6=:Q¨|µºÔ´0Ï=î„ø"\ŸcÊùÉ&Bk{=‚S*{wŠrLd BÙƒÃ)ª¼Òª_r:¿m~xâ}„ôex«æ)í…®Òá¦æož­V2sŽƒ5Iƒ1N®P‚±~@âo–†’jr®S€+J ˆ©jCbw/ȱšiü©­§I‰›>A›ä²Žy{*TFn•ÀŒdáúþ 1¹œeÄ3øô`h-Há2jU­Á€%‰7@æî_C2Í üˆ’®³H™Ììõ•«eyÝÒ/oËò̘a.“R©´ ¨n~åwž8ßשΫWÛ–¤à#‚{ë„ÆÄ»žDÙç ÆBÈáêØ'óœVœÙäæ-O-Oý*Œž[7[Èhäý¾Á'膢D\®2¬éõ]}ˆYµ Í5çôV]0!Æ/þpVÖÏê±DVò©( Jé‡h„ÇÂý2&0"¢ÔU!CmTb>E‘0ö”9Þ£’Û'DOræ¬y¥Î6úÕd“RXäŠÕ)rbÒ\J’\ûÆŒ"Í)qÅd| ˆ2Š¢Õò9\lj"§F&p,$³! á‚ȈƒVÏæt8vÅß³¢lªÆhd)“t⤀Ði‘ø§z_Æ+#ê*‘º–G8CjóÂjË¡9T×ÿ>¡6+«°²N,%Iw ©Œñ¤Ëƒ¦o\ç»}l‹b˓ʉ¯€$í–é@ÛüÑ$=¶öR˜¼ÛÜ6ðtíäôdâ;Ú¹³Í=™Î—™»Ñ øf¢–LÜ…Ü ÁÓUÙ,^ÇÉœàšB8L©…ªæÚúÎF¶ðæ¼Awá”ÙÍsÝts°ì/«88ÇgŒŸŠZhàK 0¥]^Àj¼Å ¤„ޱtŒÂ„Rãô—evOª`>ïê.Ò¦W)‡•"Fh~—²<´¤6Å@À_@WZ='‰ó‰N/F’ Ä ð÷ƒ)kiæè,þIîþÆ$›§ÌŒ¢ìM]lšÓ/C3‹r¤ÈÖˆlDî« %œðùü Èf¹/d¬ÊëbyeôNê ²´þ–r†ßÇÅÅ™ˆ%’J†ØjÚŒâB"ja¡)îƒÂœ8•i ©º,zŠoŠGÖUD’ë¹!UÇy'>˜ã09„ Ðã/DÖZ7Qp?ý,ô¤?@ò@²Á"¯ä–˜Ä…]>aZF¬¬¥ƒ•ḃ8w¹Æ”´«…|4`Ä#ø"ìšáJ³“å ;`N üÙ»aâYÊ­]™ˆ•=CÆf0¸Ýuë±;£ÉWI¼8x""ª¢E”æa(‹°Ü9½Ì³ïsJ*øð$8…Š$\§2Y€b0&Ÿ,,W u¹r‡˜8xƒ§d³ð{#Î=Q@(" †õ[TzX l‚±h •úY½Ï[ ÿLj+˜8–ð´I9&)8„ÒíÌà…Ø>ñ\9¬R·ú+Ôøs¥ÄT[­DõÔ¹.§{˜_¨l×l‘…’wå͔ɛçêZþœnïZXRÈ“YÜ–p\å.¬.*ãã[Í<’EO&&Vý E)‰ ‰Å†ƒö‘âXG0õz×"¬˜|.>4ÉE) ©$¦¢x ’º«Óï´­¦%ÍœQ˜Â—¯p(§{KX¾zÞ™×'gÂC‰¹{Rò »~")ÇH"–IkY„ìÄè¼ €âÚ’·¬NR¥èRòL£­­¬æŽšIå¾êVoŒÉŠ@’$à™’‚Eµø¬p ]”IÂ4“©ì _CR¥•Ì¥üˆDBP^÷;IÒ¡f&…†èœimì<^%sW»vðD4ÐÖ‚O$ô„ˆ‡¬öàÉf©NØ\7‹á·îmZxNQqJ÷½„ÚQä™Èuµ\ü§¾[ïS("8dÐW„¯Vîœ|$õ´##G™HŸ8i’±B°÷ðtq÷zVŠ9Ôµ2"ù„õ–ͧ”Eÿ%C0,Ò(„\’W¯|ÁKJi–¹žïKJ?mÚåÒíbè1.•Q,å¤!Z[DÄ™„{mUybL‰0«€&¥!€6U¤5—“hÅóªÖë×ø gÜã+š…#aÆè(§åwº#õiÈsaK»¿òaD»f-id,BñÆF>«u·3¸“¤ ‰-ÈïŸÃd:6êõS€CØHêSnª”^¤cbFú¼§~¡¾†/½Ÿ0Rp4YD²(u2SäBqŽO•ÄóÍPíÆ`×쨸˜›™W ™ÂES }t¿Åçl‡ÏÇ– BÀ„ 5ÏG .W y¡Ôã±é€šõ€†}~l³¼Û2z l~}ùrBËó0³ÓÂzöIöËÐMÆAèð{Ç”®iVVäåFc,¬Qˆ˜4)}sWWŒ©n +ñ1µ9ÝâsæÓíå)eIfŽvO› –JG‹^3þ[/„ž43£Ö)ë ÜÛÉ7ïÀo ô˜Pqïì¼KÎ)¨\ê‰˜Ž™;…‰ào>á×Ó0¨·é"ö§éÐ#á°òd®‰>9_›ýÄCrsÆ(WHxøÂÞÐ$Ä#\‡}BÖ(B“r]Ɖë‚.ˆhD1ÄáÔ6E"ÊeFy"ò6$0.Ғز¸ƒwc}B-ù~ÆGžÝôvƒ`o ìuþ ô:oÀÀs;ña¿ÃNBéJÁS€wô$LîM„¾ÕéÜ‘“ý}®\¿‰9x'¤…;aíé­Ì™èÆ{&‚L¨˜Yìœï"n¸§'Ñ/àºaè!.z$¼RŒàfñäQCÓzŠÀ‹aÚ¿ ÎGt Pz‚G`úŸHÅNn8Ó·R+{0gRªÐ­1~þ³¢“ì'Ü=O ÄêVèê’—¿úĉZ44tö "n­ôcÔ&Ël8^û®ŸÄÿ‚äñ$6F—dB"˜z¼ÓÖÚbòç”±g™Y#•_hÏ fÿa ²ƒQqè9àðM/ÀR°f‘…`üޱIâ-Ê3ÛÛ0‹Ë‚ŸÔ‘B¤Î.ï‹“ ×1c,ˆƒ ,;(ð:«ìv%.´}g®B¾¶Ôªÿïö£_e¿ˆ¡‹éÇ·ï(W›ÏçÓ;ýÔono¬_è¯`X;fW½‰f©ç>š¶½·Ç¦6#ïÎæ’w÷îØ÷¹;x2…wn=/•º·ã5²Ïäh ~cÀoFlÜñ;ïÉ+ß~óìm„ÆmËGðÝ Q¬ðô̈́˞0h²Ã}3fíl“&ê†ß¹b³~eªp4^‡‡ƒ‰¡à@tŒN޽a'÷‚g·—“ÝûŸ¬É©»¯uÓÞÙ@„ƒˆ 9øL‰ oŸ_þ <˜i endstream endobj 4874 0 obj 7853 endobj 4878 0 obj [291 /XYZ 40.7999999 638.419999 0] endobj 4879 0 obj [291 /XYZ 40.7999999 179.539999 0] endobj 4880 0 obj [291 /XYZ 40.7999999 504.979999 0] endobj 4881 0 obj [291 /XYZ 40.7999999 504.979999 0] endobj 4882 0 obj [291 /XYZ 40.7999999 399.379999 0] endobj 4883 0 obj [291 /XYZ 40.7999999 179.539999 0] endobj 4884 0 obj [291 /XYZ 40.7999999 399.379999 0] endobj 4885 0 obj [291 /XYZ 40.7999999 638.419999 0] endobj 4886 0 obj << /Type /Annot /Subtype /Link /Rect [347.039999 708.500000 395.999999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output >> endobj 4887 0 obj << /Type /Annot /Subtype /Link /Rect [380.639999 682.580000 394.079999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes >> endobj 4888 0 obj << /Type /Annot /Subtype /Link /Rect [452.639999 233.300000 528.480000 240.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 4889 0 obj << /Type /Annot /Subtype /Link /Rect [293.279999 198.739999 374.879999 206.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4890 0 obj << /Type /Annot /Subtype /Link /Rect [201.119999 266.899999 237.599999 274.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 4877 0 obj << /Type /Page /Parent 2 0 R /Contents 4891 0 R /Resources 4893 0 R /Annots 4894 0 R /MediaBox [0 0 595 842] >> endobj 4893 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4894 0 obj [ 4886 0 R 4887 0 R 4888 0 R 4889 0 R 4890 0 R ] endobj 4891 0 obj << /Length 4892 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€íI= €_ ‡† ääx³ ëEœò÷Ó=’º{H}$«X¤¤vïkg4¢ø(Öó«ªÿøéï‡þ÷ðã»Oÿ>|™þ|÷é©:Vm5þs8ÿûÃít4zük×7G=œÿ9|ùúôíðíéãÓÇÓ¿=©öåÅéÓÃùã€ÿýòÛÓãÇŸÆŸ|z÷çÓßþwЇ?þß/‡¿þíôÇOÓxç_øúÔíù/¿ŽQZéþônÿv~ø¯§¿üîðÛi ý˸çÿþ`=èºOšÇ·Ë«êåßÛWÑǪC]+Õ´¥ôižÍi;þó§ŸO£]¦qN¿ÑµuWEÚéyØ¡kMçŒé,-n$•:ÐédzÙ²¤•©ªî¼#±÷½1оÏ#%oW3¡N3’Ùw8{ß{3.²sïq•óHÉÛ5T½Ì@穤•ÍûGâî»®šz\¤ª—y*u ÕÊÜœ—©´¥M;ïнõõt¯uÓ¤.´bº«…¶þ<#•¶´yë¡>Šˆ}ÿßÿ|šÉ‹Ê4þñù´ÜæðÃYõÃáóO‡ßW•~þÃáó/OÃñÄ·»fÔ±Æ'ªFOª>iá“>yCŸ~ŸÀï4p4ü„3£àJ?ÀwðŽÂwðÜ<Ï~§zŸøS¦.@;>ŸîRÚÍÀµ¨«—k¡k3È<Í®mZÝÜná8Íþ:»æåõ±§íÜ“ö¨Uo­h¤žÚÞÊîXƒiNvN¯^ͤÒèŸT5œ,~‡° 8¼o¹RǦnÏÃØ<£Ç£*ç7à–ëí~âY9cï+‡>ð–Û õÌ®Xu’'ÚàÑœSÁÃ;d1²UÛN½:|ó~¿óvº›•²î&~âN µMmª²O“¾Æñ»UŒ ÞI±UÂaºÚb­û”N Ê{΃ßÁëÁ³†òQg—Íɸ|}Šî…r˜4¾%%ï¤f?¯ á‘vtz’‘XÛÞ„ˆÕ#»lñí*å;¯ØC&Ò3{NÓ=Â*^c3ÏèWñ©Þž@ƒN»W¶€Y_‹Romq¶`_Äk“Iõ.á3e팈›öÐ#×Ö# á­ï‚C*ñV—‡h±%ï /b'\uÌ·Íø«K–ö›€FvC;Ø\gp5ØWÁþKœ(Î]thE¦MoS~<ͰxpP…ñlK\’°{Hà_# É@%Î¥fQ=#,EÕYÏãù£~}&áy˜žë–áØ,g"¾A„Ëmo°G1p¶þÙ^pŠV³Y}.§5ÚØÌ=EN².'äq,Ù¿TÊ&»¨€9´óÑg1´Ü•á3åØþ’W87Û¥‚Xس^G OБ(:+Þ¼PÛ«“$²ñNüZøêÙßý5'¨|îv4ƒÎ’S0tÚ’ ¥˜AØXO[y쇪õ_ Šrgdl7!‡¬)ª ¾6¡½á„úïònì[ŠåõuUm]î}ÆúÖ„@uƒ­:G\ÎïTêæ guu ý}œ//›¬Z£š]³·@2Þl5!¡nN1!Lv‹c·%†àü*!Äœ".ªFX^q¼™ñÛJØÅürÄL1¥j# DòœéÊHľ³vcø«ŽJ{6a½Äª9½´>½’ a ŸVI°Ü‡l¸ßsŽ€ôÄO°‘kÇ6eÔ™„hë¾ÅJ º½ÒÊÉËRq¼@BD­­DÈ%Œo‘ô5R/XñM~'(üð$ï/l|<:åfÔŸOàåÚãùý“5Üv·?øõéS¶l=h·a Q&RÊ$ AÝR– ÀÁ¹Uß.”ÜK} šàv§„6¬ªºYV‡Ë¸2LýZÕ^2ÉᓉV–\ !*v1dTö‡ÞZt1 „içDïLˆsì€ B.Ý4 Ý6¯÷8Â)ŽÓNQ¬qb˜m–——é usO cÓã&…œ ó#w ¹VsºtcíG˜à)¸Nú9V3ðý%(™óÞ×ð‚A¡`”uºÛµÝÐAçgàŸDÓêî^ãÆ^p(Ä=säøÌ2Û])¸<Žgo( »…ÎzOXglñÃ"'¾” »ŠÎS<ϰ«.®"sûƒu\EÆÞ¶ph§‰9ÁÙÏûôU}wöN·#¨Ê9$U&h¨,#*… J¥Õš¾máó·º †Ùë$”yæšKÈ¤Ë !iZë,ø  qÈr<»Oàrð¯=¼wµ½ôÕ¿3!,ó²Ê/‚†DÈâ¡0¿µ iÃ2¤l±—¼îÐVÙÊ‚#…Q–™‰ F™Š>š§rlvGi;£É.;µüV’ƒ–á à8Û5"„Á°2âx&qx#'&tÓ¤íò!C8ÊäÚV}‘ß@=#b§I •‹…ØOÿË ç£àJŽ€ÁJµßKµDN“… ¦HÒx¡Šî±È uXDlçø´-W\q bÙ³gHlÏÚcîµL˜ŒQ_J.À)âÇÊÈ“o{KŒ04|÷Þ&h³YRh†#3ÜU\þŽJ¨¢æ ø|‚õP¼¤€—eE¡·7³ï;IÕÊV`àÛýA ‹ÈÁ1S÷—O^àÕøÏu;jô¤šÝ5Ö<ë½3ù÷”9ŽÕônFÉIUÇј‰zb¦ƒ×¶4q®öh^"ê+¬Ò^ÏÄ–f á;-üÜIU_Ø<·éªæ8Ò~ÌϬñJñ)À•zÎ~g‚£öÇZÛ{÷m—Ô³)|¥7 g]ŠBJu“jÔìÐx8DD.AAÖ°%NÅÖµ‹‰{lÐpálÖ?);]Ä>Q¹ñ“ÕWD;OAd—ŠR­iscqh™ˆC¹-ÍÓBƒRkð.ƒWw‚„£xyš¥‹u$5à„'ö†ä+ã©-d|ξÄMg­e“=†×ïðëAåÀ¹yÊNâ”GˆñQbmÜ`¦ø(£[¥^o¡ÃÚ¯?0 ÂßÛ$âĦîÌd©.Uå}°‘%gºÁ’Û¾ƒ¿ã,p2‘ûˆuMò6{ø™+- ŸßðžHÆ\Ú8¿‡*L0bâÙÓKIP3'6¼ï­Å{¼£Ž²®ß)Û½du‹Wb},{7ü„P'iÖ5Eò€žV9Ç¡µ\I¨²²¸ Å +„à­(Ø•€òãT:æ íòQó Ëf®ÿ#*, m>HŒ]¶-£°¼,~ß!ÙRRS"X€ÉŒå2!t­‰÷S`vÎ~&2q‘ jÕ‚‘b˜Ð7«ÈµªL?YB#»‘T¡%ƒày)·’]X@~w—(3f¬;Ê|hf§—Û«1se·r&úåÈX”•ÐÖwÃÕî$„´£›–R õŽoé„ÞéÔ¥^†z‡S7;%âC 3p=,ÿKJ|N°!âŠb)œ,‰ÌFT1SO/†é#rÉ «çvQ 2p°öÇ­HøÞ& kCÙÑÛÂ#sÏ£}¦UõƈWFæ°5ÕÌ˹>ÁmkÞB˜5­%³zZ, ¢k.@ºÕ³ ®øçˆWŸè|¯ŽÑï¼:ÉîÁ«?Ó׃g0aW„pþSG¿¥ÝÁ+…ëÁsÃëñä 0VêÉÀÙžÑàîȵs…s–D×›Ù1¨çÌàU³Ð†K ÌØ²Çl™ËØÙ”f\ÅSG׎MMÕùO´sµ®Œà œ4~gN,rüø ŰÞNÝ„vš™r4M¸Þ„­ ˜A»íMàë Ô‹±c¤­ÂxZŒÆÍTn™ÕTÊZÛ¬=ë9ŸÆè¬çãé [¯x>­xÚm5„N›ât!ð¯áêéûQJq£Ä·.¥\N˜¦jÜQ¤n25ξÑè ʤÊxçû¶±¹c™d­Ü¤trqå l~¼ 8ÊÃu©öÔê–Óâ­Fe´Ô{e‚‡ë)Gj‡Ã3Ùš ÷{Éܸ¾m_Ï”ÖTëcXë‚ß)•‡gàÑ"áwpõiœ‡wkžrÕ§#¨¢oT±'ª í(>|¦8gÏŸ‚–<O†.ž>S8š‡âáz<ûíRÝÆœdë`òvø)eÊR~²Xõ å'1’#l‰Þ˜ú5£4)€C@ÄqR0 n‰’;aGº›_™RN´p‰¨ˆâ¨)=ivyé׬m4K.döxè;ú„¨Œlîb@˜¡›_ëa´‚ï*xé)öÈ€Ï@ˆçÑ¢EL=%Dq‘Ì e …‹˜âõ`ˆÌ{¸ÒÀ$»­+uI€Î¢@cǶ§/´¤„Ë Ñ¢3`½â˜)Þ_‚JâÄNW$†!·WÒ.oE7SzHsêáõǶ£9sÊ$˜su ·ÆÜÔì^r˜$~·#s²ÿn°ø¿9NÈ:ö õÀÂp ¡‰¾$²}ù…,œ`"Í×J¡òä ¼‡—u$U”n¸Ôè@'SJh˜#øèÕÄw”ÿUH““Ø‘L ÆthtFy1ô¶½ RªÛn‹Ä˨ÄYcL¿k­DYw'GxHg¯­À±®«ÛŠ#„ñ1O÷huõÄá`ÔUç¯ê16p»ÙÃä|µÜuÂJD¤ƒSs ¡·ÛöÌŒ´kF¸K;¶`9"’wÏÊÕÎrt¶‰^ÍÓVÈ*ÑG¤¦&¥§êˆh{—¬7£ÈèzGwÎâî¸Óîf—+¡> aòa€NžŽ@¸>áø8·‡ã†ÞÕ‚o]õsª¾Æ&6 S:áᑲ!œ°–Ž ‰úš¸¨¾ÓîЦkéV=RÚØR€"«È]5Õc»Ù»GEîVäÖS¶Üõ¬°N_TéÙ«} n•˜àFôðC9M1ì*Þ›ÎÒÄSrŠãý˜g}i‘ÌðB¯Ôî—SVžR†<^¿ŒPä9á…MÆ!›ž¥²²eˆXkßoî8ÎÑ*›)ñð¹ä,I=#b.÷x‡ŽÜÖõмþd”gˆzÀކ_"ÉyCÈG_«ýͺÕyU[[Äa°ûŸžÆ«+ºíµQöe ›wëWÀÍ’³J湇VÍì꺜§•Ýw@«¦w{þ´–Þæ[îº–ÅØ[½rIá’IÃ"Ÿ›KÕ—º_êráªñŸëå©Ñ“j>Ž®±žàÑð;žï è©F…2ÇíhBÝÑ8å•ÌĵmLꆪŽãƒ›'Ïô¹]™Žó~òÎ`*_q¬µµR<ƒ¹ØUsìmï4œú€fà™[‹vtb¯ù•ãºÓA³/¢þæ/'HPk3Ão¶Œ%Ï¥•¥]Ɖwe'‡ œäMÊHrîK`9ñGœt–Êl¹w·—(ˆç±Dê^YRcÚß%Ûá ´p(Z¬ šÅƒƒáØÖÇ îcû©Æ+e@*lõaà|g:ŸŒ*FÛÔµP1CÂE`d¢6ÛŠ'ÒAk•ÕO˜QˤëâäaPݘ+Üèöõq’ºW) ðÁ· {W0€œ‹ðÙjÏ­ˆÓjë×TJÚ_¿dÂ4|‚©¿ã™æØøLà“-S,ž›óÖDÐXo‚óñì"Ccñœ0~G”.Kîo[é„ýe=yhžûÖ<—fù ßÙ'P¯Çàû<¼ÏZ%ÜMS>Ï´fºOc§ò(A'Íó>ϾáÛwÏ®ó1,µ<§€¹/cnæ¤~‰ç†9œ[å–Zþt£þ=|;1¢“9ÿÂôÇ—¯$Xæ âó£—©y_ G%Ûƒ:-c)>=¨vtLu1§F“°mí²¯s¨Ž—c$]Ý»å<ùnáÉhJsÔÃbk´¦9¶£ÁV‘–¾ÓÃwøÎHl>êʼjO3±–¥ÑFÒuË&/ýî±XXá3zgºêKOZÇär¡½3eíÓÜ^.@Õÿ®uÉ|nà÷::L×—D¦C4:AÕãNî=¢gwÏîÃñõ³Èî÷}ÕÕ9€} ˜ nº±}”䆇Oÿõ¼Ôô endstream endobj 4892 0 obj 5898 endobj 4896 0 obj [292 /XYZ 40.7999999 100.819999 0] endobj 4897 0 obj [292 /XYZ 40.7999999 645.139999 0] endobj 4898 0 obj [292 /XYZ 40.7999999 100.819999 0] endobj 4899 0 obj [292 /XYZ 40.7999999 645.139999 0] endobj 4900 0 obj << /Type /Annot /Subtype /Link /Rect [287.519999 119.060000 324 126.740000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 4895 0 obj << /Type /Page /Parent 2 0 R /Contents 4901 0 R /Resources 4903 0 R /Annots 4904 0 R /MediaBox [0 0 595 842] >> endobj 4903 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 4904 0 obj [ 4900 0 R ] endobj 4901 0 obj << /Length 4902 0 R /Filter /FlateDecode >> stream xœí]I¯ä¸‘¾¿_‘ç:[\´†ZðÁ@¡ ˜Ã`ƒöØÃmLÙÿýÉ,I™ùÈüHF0HI¯Õ tU?=Qd0öõçÿúß§¿üóôó‡¯ÿwúeþóÃ×—æÜtÍôÏéúïO?ÐÃÙèé¯ýОõxýçô˯/ßOß_¾¼|¹ü÷û‹ê~¼8ÿqy¸|bZðŸ¿üýåçéã/ÓO¾~øãåoÿ:éÓ.ÿ÷×Óþ×å?Íë]á×—aì®ùÛô¥•.ÿóø·ëÃÿ}ù;ýý²…áǺ×ÿþdZ«LßeíãûíUõãßÇWÑÇš“µºëõI)}Ùg{Ç?þçåÏ—ÕnÛ8V©¾³}“¼êe½Ë²v4§ñòݶޢÞÙÒ–R¹ õ¶—Yèº#•w4Õ\6\Š ú~¦c*› ±e©Ü…F¥„îð²#•w´ôx).èM3ÎÇluæAïKå.¤­–Yèº#•w´ô¥Ø ·ýÌp.Ì6ó ËRÙë/BHd¡ëŽTÞÑÐã¥Ø ï‡™¯“ ±A†E›QBwxÙ‘Ê;Úz¼ôVõ3q«ÜƒÞ—Ê]HB ]w¤òŽ6ƒÞ_ꋈ ¦ï*Ø÷À‹ï¿½üüYY3\5Îo¾ìä‡Ú:ýñírÜöôÓU.Oÿtú]Ó(ûûÓ·¿¾Œçv4};é¹Ež4è‰~‡ž4|¢áw:øÎGø¤‡OÞÃ]Ã'xoïøä|2B0àÖ|¦¯fà®ñ-hˆ!Í'ÆÍa¸áó` ÷£ðmÃ]kx?ø0D­‚ï@ˆžL{ûôíÂJóš¾i3ø†ùXq§ÚŠuŸ´ÍôÉ~xäª9w½.@¸£Ë„°ÃZ.(}¶.GçW›öÇìò›¿Ú£'3zöç0#{_þ*^>ðawùÆ¢_Õ½{ÐôM›‰5tgýÎ[ÃÇÜ;Hÿžžî¯==(Ý>þªìí è\„{k\À*ûü[ú„Î7 ý¯n?Õ#ïÁ¨åF°pÀŒ2`, Ä ±÷¦±bŸ9O{l›Ü#ÞVé°RPé r4Sn;éÆVP¹™U˜:û†×8R^”V/Wò1Ä€(ð¸*” X*ú|ÞcÞÞ8âÄãâÓªú<ý"o¯³¨Ô¹µ]XÂGŒI+Os }ÍÈÿU,ë£×?o`#éwSF Pƒ§òrÔIXÃ0±yèb£ú& ø%¼io¼[J§>ÿ†ñwá)üE>gËzpø²Ï ñIðÂ3úÚ.^„ƒ"õÞ3!Ãô‰äS2éá½b •rŠtÊðpÂ3H½_Ä0"¯À•€E¸W£#ã8³‚÷“÷R¬å¢dŽÏX‹î&Î2,¥º)áMóZºû;Ý'ÍÊYgz€\ ¿£;øÎˆÞ™õTeΓÇé™!â®639ÕœÛN?sž<ÛÁtwª=OW÷ðŽ™oUwÓr.æ g«½áó¨­†¿ƒÏ3ûbŸ”±šú¹Ÿ’èª_µ†ûÄpÇ8ÑÂÕàÌþùgßÁØ"©°)g.šÿ‚#TÓŸStÖ¨NGu•$E1!˜eéŠ0EG{z}! ˃8Áã¾y•´Ç ;ß×/9¦9äx+v ÖU°;í°k!{:tôœË´-<9AŠÅxwYWs;¸ÚÂN“\`§¿âð;ŸƼ >)NŒÁ‰$8òï'’ß DkI.ø¶ñæÔ‚ÌrУ‹ýï]Êõ"ïËIz× 8 öÕ¥À nëÀªœHq7jåÜ!ËENP1ɉŒ=Ó¿&õ$[ "¡¬RP3Y%­BDª«Ò‹N™®ŠU¡tßuàW=ÖAa<¯/6v0<=C·Ž¹'›ØS†}zª&ÁN‰Ûó•¬Ë³ÏÝ3Ž–P`EÀ}ÏÉKK(É…­uØ0Ë*â„Íâä…¹¼XŒ!&úÅgk(âTáá/N!…Dùêë”H>Èa6o”Í+š8&ËPNYN ILÑ:êUÅÄT£nyçGBc³„Fsù×4Nªe $ñb‡®eÁU;¸Æ„ùÀ 3j«áó`\†8€(ÃI…w-§v÷0 p8­ÎXîE|?xøà4ÆQü 8tŠ÷†¯ î"ë– ÔB8æ£W.~‚¡ƒßáÔ­bè`‹WÛe]d-¹°i^µá«®˜ÃÅêpÕé85íò ò;¥™JòÝàw{ H~¬™1¤K;åðš#ð+ø=ð‡oÕx¶Ë[økfð\ê(~O”÷,ôÕeÛ!)·-).;çxê8ö.#Íå`< ¦±Ã{Þ†¬/sl¬ þÙxÒš’E7Û‘‡dÙ¸d9R_ßœüH‰]Þöú²@Ã]c[" Åkʵ4xYŸ{oYTŽ…Óðï kc xà<Œžˆw>dtÍÜÀ-¬Î…lŽIkÓý’^A© $Šâd'/³çRä "qêaÓñ1Fò.¥:¶H›‘ܱBµ$‹d¥2ª¹Ó±‘•w/[îœQ'ËÉiä´y!'L/ÀÞZ-qI‘1XGfì¡Âuƒl°zH0£/+ŸŸ!¬Š`*å(W °•×h‡Æ×ÈÍ™Q²Š¶\¸ÊM£í•k·‘-^QæŒ>=pÌÌÇ%Õ“ƒ{Î[,Ë#Óu¼õù=Xd©lçÂ}Ï,’RŠG0Ç3Ì+Ï„Å$ŒÒ@•™W*[¤›Ô¦D±ÊÁ÷j$rª'1Î|Œ²FŽk¬²u³½>|ÛQff_t@c$@@¦×yÌÑ'¡eô‘ÿEºâN¹:´u·ì9Fx†â=4;5Ää5rx”…lgZ:dûˆV\mïì™W%7ѹ@+°ÙGZ]ACM?ÊRG¿xY1uødûî9~Ö£BŒÂqC2q–펓ªG—½·¡ß–Xl£§ÛÒåÆ3Îëøß‹LÀ+ ¨Þ*ž÷ˆÓô+i`çÌ“ˆû"çš[Üï­|„Qê5‘ªv.K˜Åá„XøÚA§£?rJ7¦ÚŽ%¬(Ú?Ž•Ãáã1—yYÀXír¹ÒíÐg;÷³ùJv>mÔþµü²z¨¤Ë¹Lv¥±*䧾ˑ0gÃCαʎ»’ø¸[õ`ÆwÊlX{Ìx{Z¯]Ñ#Ö·C”µÖjÌiì2Ö>0#(#ÔFÑ™ébÛËSÞN·×ßHÆÞa<%O¢Qò=L²”Ho§h+—'TÈW¾KÕN¦Ša­äU< Œ7±&xe q„ðr¾G1D;r²Ú‡{£Ê%¢ƒ,)™*T887Ž.KñlSÿ‡jJóÄÁ(÷Åùð0Çû¾Ið»†L”xŸáäy(HÐDÜc±ú¸c5S¿ÄXñs†5Î'J.Û&¸M̼íœþç²t³u6‡I%dR•Õ–Šº” ’—žó©èëÐ¥²Lβ(µsó~úát–á<Œ3Xú7c .2Cæñ.u$^NŸúŸÀYnøó íÍ?L3Äž=±ÏŽ^<©5.aÚJ¡ à7 e”ÌØ•‹ˆ‡"SV‘Á `aQ/n!*’`MXë0ô‡Œ}»2V5ƵNE² ê¥{Þzu´ðô`QÀ—ëq†Ç0«%oZY`k‡ÎýYé~?Ÿs3D–L–# ^4T³Å¤-BqRTkä@O$ÜoH žÒ¦L"?8A÷Î18ÃR uæe‹EX…ÕxK[3JZä}çÈü=Å9‡Û3²(2+£äÅöH{ËJiJïÀo„ %J[JÆLI§óZYàTÖ8;”íÍHHýóÈ¢lŠÂºÇÖ¸á¾#‚“…¼ye LåÚ"=PbQÁôo Ü+¹ZÓ[…kDe©šSoCH\Ìw–킦FŸ4n(†Ÿlt0) ÛÚÁ95ß Ý‚ònž¤Ï&¥™ATwÀùÉ’Ùùúì L Hh3ÄÉ%^3ËXµ.F–É‚½=Ç—„t‚µu™|Íž¶_6ÑougkÌ¢éæ/8Ç™÷éwK•5– ,$®N¤+p>Ÿ…¿j[¨YÅÝ $øýÕe¦_.º|´] -[ÿ'[ØNHT#øÕ «”åv£í©ÜŽ6Ú‰1 IáÆÆø;å[7ÚÆXñ, ž±·ÅñbÝ…ÖEIÏ;0ó×ò–¾U”ã1í§,FÏ ï '61ˆ¥˜ÀîY­ át4›Ô×;«§"dpXë•ä½{C„‚Ú!g1NhÎ,N°QÂ*fáhŽß|Ò[¥¤ÒéŠópïüôBlVøz—™ y¬6î^ü4=ܵŸÀ³WÞW´Éµv5†³UëèírªNùMR„9î#Ô£rÂÕø çäE¦7ÆU ‰ôN¼5£-m¨ÃG^xzh_¡œ½–™c»="Çš¨Ö®Ë¶e©$ë§’ˆ°6–Ù”‘¼‡FSEBÝ¥ó÷E\ô…—÷L„xSçø@3YÅà›JçQÅJÊ9ƒã.ö&Ã>£L˜LsØŒš×,·ƒtÒN6e¨æÜõêuÃ;ø=üÎi”[5Ÿd6ÝÍSw2ëƒOOíc‰oB›hv!+”a®útQÇc³MgËÐ+—uçtÄÃïrJG++ó>—Ѹ81#¹.*AåS|§mº×²úY8Т'F¡'8ûÔà!¼x¤/ÜojFT~–HEC¢ w¢—>{ †u5„+<Êgã\aÙ||Ãø<œÕb¹Ï$ @”1žïÚ¾£cl ÿ›Q¼ƒõ¹C!,ŽïïßÎÂ8Š¿Ã‡NE³“0-ÈdÇp3 |‡“ƒŸ`èàw •xÆ^Ƹz|?X–ð ó,Kb G4ÚÆ¸ƒï‡q ="Àãñýphï Fu4k£·¥² cyàî151°"p[fIzr½¯ãwro˜É9÷†Ÿp¤ã¡½„v`ð;Œ½86Ö;9\ž£{cŽ‚-L 5Y ã>Gç ð[¬ñà“bˆ2p4€‰¢b ^³åÛð7-p¬g¬?aX×(‚[äá £°Úç“Cò°¦<\ŸGïS¶i(Y°Ì90‘‡‰µ¸˜aÄ2wŠ!ÊñÃ`;”á¡áø³9'å`HM=¢kTôÜû|r臱 î}è!=âÐmáÐv¢-èíÈ÷C[ض¶ pD‰“ãÄɈåER\LŠs¼o C¹{ÈÝBr׌ÑsïóÉ!wÅå.Œëâ” ®à˜oÒUØFÞçm’ò”…$e;DϽÏ'²’²r ;à½1h†“‡ Mk yæÞ›¾…Zº®Á6eMŽÒ÷Ë|–új¤[Io– ¥*—_¼™RØè+@èEh¿žÞŽÙïGÇhâŸÄ»2ì¢U¤-Xz )kEºd‰L—ñʺ3Ú´dõµ"t‚Àøƒ©À#%Â$ÄŒ¹™¬ùñâh·;‡Õ òÀü±+/))ºÎ¬þ’œ!m9Óf ü{m«´'­Í5y)4E´G¥†G+¸24•Ð ®_‹·ÈQÓ÷”]ˆ9áä”ÙD90øÊJvn•+¤*O]ÝÎ$Óh£°¬a‹e8Y0AOµË*÷'ï "ÖêõÙÛÛhBÜ ŠÁĆDKÌ«¦Çío¼~×¹ ÃE‚Kî*Yµ71˜Q¾ÑÚ!}Š2½¹ù ‡ ùVUH,ËN‰­å“púeÑãuCQÁ[Èfߪ³¢ Pémç • qʘÜC‘%‰Ï:²ŸÃ†Ó¡wèûÔâ£Æ“ñ¦‚©ÜÝbÛ« \(¢CDÇî¦ÌX‘'$3d¥¸ÔSvP#pXŒ¨t’GÛ3óÞFsôš}Ÿ‡[ýÙÑ÷¹ÙHßçá^›pô}>ú>ÿîèû9φkG޾ÏÒµ#¿¾ÏûìÔÜBªÇýÆ^LÛ¸r㣫#Þ~bðVìð;•í†ÎŽî©MHÝx÷ÔáVÓ±>w8x4¯YŸ;¼5¸­_ ¦[ø˜^S‡£Œ]œšvùä·SwZË;qÔƒJóg®ˆñ€H(mlo›nö:“­Ëò»Á8ÇÍ©%ÃXJ»ûœvZ¼ð†>ãÄ$EKqÌgô™¹ ÿYà gǤGˆ¢sjøD'ëV.œ]-S‰Ë–à†²¥Ðk ¦7ÊeT{N]>2Õ²òƒÍˆÀø^z™5AÐ칤M¸’ÃCBѼ Bî’HÂÕ+f7­uô1e|oÉ0´®e±ÁÄËÒ5ñ›p…òë9ªO\šº­kUªF»jÐúÙZºÆÉ÷A7FÏÀ™Àš9ËÙ#¯&Ú­¤`.î¸Ã½P-CÁŠWýˆ0¡5³ŒµU.ø¡P`¥­b¹o5¡Ì^ÂcÄQï²T|‚lóŒwަ$Òø ÞyÀ.‰÷iËÐ& Õ)`G¡wR‘Ò(™ Qû«ä’£¿’àhä\¡M6Óë¹V0eºvLg÷.cŠ7Uá°Ô¸^=ñŸI¤"–Ëá@`B„fœ6y9üÒ}¹êa…G,Œ&œ2\·Ž)ì –¢ É+#š¶ç—*k T!V= QÈÉ•‚&”q¡Sãà€'' = ?¢Çe«ë˜"±N ýí踓 ¡©¶§ã'oad´2)Û‚Â6 DW©Ÿm´^v‡S â×Cèû.ë†KÇÿxÓJDå雺ÖE Ãd»¯­Ç²¦<”hþ°û)V¦šs׫WÉ<¿èÙ"ø%êÑ('$†Ÿì³ËAÌä÷+)LÆÎ‘&Û Á–Á _{#ð˜µÝª²]d= yDSæTén7yVžF9ŽïŠ‘ÁDÈÌ¥ä)&™¬I–Þ(ˆàJÍQ£½¤‡ÇôɦI厬‡JÛˆuˆ¦6@Ï© Št¯ôÀÚeX&x—‹9±'Ó IåŒ „åL-c î2ž†Ã¢GÏÝ[Z;ìß[WÛ\«*“âb\³lÅÒú.,BØ g»ÒX²ÿs½>‰¼æœt¤(:V°ïé8˜)Ë þOÂIƒæÐñZÑ4­lO:PµêÊò8‚¯ÔpÔƒ)aÁÙâ!QÆLðB£”82„ò\l,ºÇñ)Ž›wλÆ-þõ~0·êUfÙtàxÛË;å„3S,Vд†zÅ0¦Ÿ$q•ÎiZÓ¬§ƒãåqÐÌξñæ bj†Xs‡Øõà?Î=ž¯Ÿúõ¥SÃãþöò5À½Ë°ýëœËX»8Žâ'HBEgúLa§Oílõú:Ùü)¾ã„à-Á;J.ü:›VIlë²ÃxºK­YdJ¯`‡÷]ùWóZ™`9•’z&KŽlx¾–Œ´_»bmÅŽâqI7M4%âa_G‘,ɺ[íòî©٘ d)Flª1BêïTj;%ZgèkjëôüœöŠ˜DÂŒüe‘ÖWhIù-À&†“Ÿ:„§¥Úå“·†ÞÍôÏS,zÒ,ì[ç ^ ¿s…æ½3Âïܼ޽“µso¶å­6a¾jÏ<ì@/œrbzß13aiW]R|¢Ñf²éÎfÚ@Êwðyfl}²k ·ÀI'ŠÎÖ̓ ì …«AèÌã2ž}ÞÏÌïú³žÄ¢ÓºƒïÞˆúD¿«†q#Õp¿ƒaðîãkƒè<°Hesƒ<Ò-`N3L—ÕëÆ¼ÎÃyW›0÷ñ'áï΂æÉ ?£wfvþì‰Bç˜)‚öÎ|c”³Ï{ûAXwý»nÕmÈi ¿×Óñ`\$<˜ë´žàè,©Ónî#Âg•ôáú³Ò— ýahº³ºJ¾äkÀÄÐ=rDAnxúòòÿåcC endstream endobj 4902 0 obj 6265 endobj 4906 0 obj [293 /XYZ 39.8400000 196.819999 0] endobj 4907 0 obj [293 /XYZ 39.8400000 456.979999 0] endobj 4908 0 obj [293 /XYZ 40.7999999 512.659999 0] endobj 4909 0 obj [293 /XYZ 40.7999999 512.659999 0] endobj 4910 0 obj [293 /XYZ 39.8400000 196.819999 0] endobj 4911 0 obj [293 /XYZ 39.8400000 456.979999 0] endobj 4912 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 422.419999 108.959999 430.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 4913 0 obj << /Type /Annot /Subtype /Link /Rect [414.239999 208.339999 496.799999 216.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems >> endobj 4905 0 obj << /Type /Page /Parent 2 0 R /Contents 4914 0 R /Resources 4916 0 R /Annots 4917 0 R /MediaBox [0 0 595 842] >> endobj 4916 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4917 0 obj [ 4912 0 R 4913 0 R ] endobj 4914 0 obj << /Length 4915 0 R /Filter /FlateDecode >> stream xœí]KäHn¾×¯Èó“£xè ôӀ݀ Œ^ï.3 ·÷à¿oeIÊJEè‹2’²5 LU¥Rñd ò#ùë¿~ý¯Ë_ÿyùõÃ×ÿ¹|Ÿ~~øúR]«¦ÿ»Üþýòøì®JŽ¿¶]}•ýí¿Ë÷ß_~\~¼|yù2üÿÇ‹h^_œ~ ç.Æÿùý/¿Ž¿ŒŸ|ýðïÃoÿw‘—þúûåOÿ9üøóÔÞí ¿¿t}sûå·ñ!…ì†?»=üÛËüáòaÝk»·ÿÿ¢êZÕ•ŽÇû«âõß㫨³ê¢µ]wB㬇åøßÿ~ùËÐÚ}×^ Ñ6º­‚[måk³Ã¾m†¦…Õ¨5·À¦b’]¢†n#qS•nÝM±—^ÕóÒëØ‰Þ›ŠmH7uš†n#qS›—7Å^úáÏqšCÓ‘½7ÛPÓ5iºHÄMm^zÜwéëº׫“6£MôÞTìŠ5JUIz‘ˆ›Ú´ôvS_’#ù&Œ~8^|ÿíå×ÏB«î&{¿ýeÉ«|¦[_~¹qêJ^¾ýùò/U¥>ÿñòíï/ýµîU[|"4zRuðIŸôðÉ;úäøöSÃÖðΔ€3ýßÁ+ ßÁcp$ÞSØOõ>Qð ¦*L!­‡v>}ÎRö“!EÌÉ€´\Šú0ýsZï{GÀÛ³Ñ2^<ŸéIú×ÕIÿ'ýGÒ¿€+êÐð;x>xÔ9N`*ª’pÔ5l S"ÖðŠÂ~Ji/œ(¼npÒªàZñaªÒxÝ0%â~ðÌCà`ŠÇgÓ^Q?8OÉyJÎSâÓñ|àX3…£.ªiÖý¡5MGapÌ…\ÓØ“é“Û>O¶{Ö©9»à8YŒÖ8Ráµ>$…8öóª÷©8~ؽ®^Ù½jɺ뫒µ=Τ_m*…íµËÒá&ñª¯z|õ¡_ Ÿàw¬æ½ƒwtc5þ®´úÅcÉ ¹JÑŠ™2û3 ?›ÝX ^ywoŒBÎC ØW»_ki¬€á'6µ$Ý=¼%Öàb‹±VÞž ^’#1ÇXábÙÆ_…C“ŸÌ¡}BL ¿ƒˆ>'›V­Á§eù4\ÇZâe€\)éd1ŸüsÄ: ×e¥×Z7·ÕqLS“9‹É¬íàöz:i×®¯šåÞ‡÷k/ \=¥ÃO6ÞÇÞl„A~Ièà øÄd§ ÎBÖðA —oÂÜé(U‡p¢h{ž~Mn“ :Se?TÍmg H3Ç{°äÖq`mùo¼µ¨!e`afIÓ$è>øa a0j¿H¾Û’ÚÆP=’€ÂWR»?ï-ÀqZý@Öpr²Ú°.‘IPÓxyÙ.(˜"B0"+#³Pº5¹ÅF6 ,¬ƒäfvàK¶æ,MÌ¡ýY"q 4HnYH/1.ÅP †µpá—ÖZ w«:ú£JsÞ€DgÈ‹Ÿ8pµ À¿nº%$rªzoð´~r”Yßáfï›Ý1Ÿ¤u¨;v‚10%¥ îำ9k€G­úp¶=È›Ñ ˆ³âÝÆûß‘Fã ëÍ᫉OV©~Î|ž`æ Væ$ñØÎMêh ?+ª1púOTÁ`¤¦j¼»uÌ'‰¹†ì:g˜£l/)*Á¹§{æó´gä²öîÖ1Ÿ”Ò’ö|ÎNÞù|{ºkÞ é ?90ïÔÚ»[Ç|²ç“î¸'½1GT0Ø£ìÙuÒÎóÑΞ¥ÑöOŠJ£æž:¹¬®³£Èáø$àçqN1PÅs2ޏÊùDÀÎàYp’ù2²¬RŠZàÇÏpˆã“dL-Ñ?ZÉÐ @7R¤³Ýaêu*µÁyÇoð€ƒÊ¤ÁÖϳNÀRÌb?øÎ¼ùÞð0†ôˆ'Оcâù“EGtG2¤­×’d›kŸ4à€!>)jA<ˆ9'޲†ÜÙO}€´Ç†!Öbbz­SÊ"3Œë'œ+-pGUw—WŽPÖšpø09`2‡ÄEIaéä–ê`qz<€˜Œð3C¸,‹dõ»‹èW3·yÚöî ¸;ä«ñ¿·åÑèI5oT[Opkø7·–õNß©çCn&&xKY0†>ŒMMË.Íè@ÑÀ'Ÿ­UðÏô™¾FÍwp?ŽÖ¦ 7¸*x´S6¡®ã†Yr/?kí„Qb%¯…}X9B˜ÀRI9wÍq‰E=s6ÖÈüyYpz’›¡B"K/öùåIcå 4N¨bÚ*LI£ óØy#O‡bù¥ì„„ªq×'NöÊ.å7õ5& Ï“Û& Öcû¥Û¨6Ëê;¦$½J‘Ô. äWL–(ÿžpŽ>Áäf­tÆÜ3J[Ù+ð“Í-µŽ°ï˜ ëðKÅ4eC GU÷5g %d‘eÜÅ@_õ†˜.œ4Ɇù6cXZb’bÚÓ5VÏ;²Ê…3§•M»Sà(û]‹cKë6$˜š3{CO½/E„sw³JÒ¸Ä/6À„Ü“%(ZrôÛ‰ÒÚ`-˜±³¬ëŠO¯Å*Wl+Gþ†ãÊ’HÙÌYl'8%Ë#ï˜À˜´ž”™Üÿ’äŠç 3½—€˜[Г˜ˈ—m=É1ðM8'XA SíÝ X!­>꿨8´e`/ni”k–\]In6“#œ§¤Ê­ÏYàâ©g¸ƒ«…o¥…ì/S›b3“5%Ù{Q¤YñŒžks– €ŒGE6­qV(6,FÚñ´1\çî“™¬»ç¿2ui)r­É•¬€FóÒºšXm¼3¿Ñ›tˆ­—Sÿ¶•t浤' î-~Çâúæè–ÜI¶7&ÇÆBsÍ`v8â£ü ñý:·jnű=„áXÐNo©4åiO\2#<=mc¼Ï“ì^ã&x²ŸèTZ%ãžËSÏûô¬5@­æ „ðËnâáT{Ì«»†WÉ¡¤gøn6ÈÉmBP¸O/Ùæ^²¬á٭ɺ9tðÓPëo+'øþ€tvo ÉÖ˜úIR4$©!EÀj„_îŽ8ïg `ñÚJlm!‹xK‹F#&ZÔê~jš`Ú«;ÔÚ”çfÝ$T CÊPGQç n?,€äÎÂ*F;<ÔƒyÜi±Øéñ“ ô+¤žŽ)î@Œç~ÊÇ-ÓVo[8ìÄëFè[|èå÷ÑtüöòÕÁòðÛ êÈγD+Í>Ã1„0Ç™&ÜÚ’æ¦ÙíE(è Pæ–’5‡|bgÊi4FK‡³ o¹¹SJêC¹XŠk¯ÇÄÐö†ªðŽÍ‰áYtÌxC »­)­v‡ ÞŒËmÏS )户Ž=ß,³`áÜ5RCÔò…¿é_õûVN ÿü·ºv]uiÚÛVˆñÐÖ—¦™3ÇÌŸ|i꫽ì:qÿ–^´¢û¾?ý-n¯]Ì·+«×wŒ‘ ßê­ôË>þöòþ¹ÛÓmµ½£E5Ò™íÓa*¶iÉj=†'„ ǵ™àÛŠÒ´O. ÒÓoŽÈ’k¤¬¦y›LÖ)ŸM[# “ê¶œ1•#³¬,’#£^\ “SA›yDùÅ õ¾Z õ^¬ õ^™wøÄê·oéE+ú±»Pïú5¡ÞufÃ'–P¿}«_´Ò/û( ÔûÙIá`pÞ6^Þ˜0¶2~;G;Áôɹc=ÞË2kÅî¨á&ÀL˼†÷z«EÂöJ?8… Æ$"ôßlAG°,ppŒ€?Ÿ"'ò©ë v¿½™()umB)Á„14„þ"Ò¸äYÇ_G"À°ÇŠm‰Øƒ4uK6ËçƒóÛ±w#Or½²ªgNðÓ”ÎýMÐ8T.F%’t!aŽz€ãݨîòËM§ÕœüŸàŠó°¢£"'Ûé´Ö® ŠßÁóÁ£náºeO±.…6v+º‰: )ȇÑã7äuT€’3r‚¦òs˜*OäH*ˆ&Èrú&¤úœ¡1dñ+8àÖ•ŽS ¦ÆCsÁ˜üäÄÀ±r«l¦Z*è†s¹(G C-ç`¶YhBuÀ÷¸w#Ê1•“¤í£“dø»³$u¥ TÂë'†“dü–^´¢û˜œ$Ãßí$>­Í>dm:IÆoõ‹VúeÙ$Ã<¥Ÿ íÏÓyºIN7 SELŠò°Ô¨¼`„ ©ò¦ØH¢‡?ª]qzx'—zx·«<|jyÓ:+Vyü–^´¢û¸ëáÝJ¬òð©åì¬Xåñ[ý¢•~ÙG=¼›#à~V=ü¾§nxê†?¥n˜E6cKï§ìYœéÁR\0vÅT†¿["hº79æö¡QÏ­­Z2«¥¨ÄB[•\Ñ–D¥ Mæö‰©-½~K/ZÑ}ÌÚ’¨ª5m©ïMmiøÄÒ–úY?º·Ò/ûȯ-‰j®ßá¨iD€ÉÂÓ|:—>¨I¦*¡y–ž€"å¬k’*,Héñ\€2\¬ýl5owN‚]; ³6ª1äKÚˆîSVHŒJàDÊ!)kŒÐH[ ¯£ŸA…â€*SfîÉ$X w^¼Iø¢áô‰±©Zç—5rÎ`s- ùrÖ€ ™ßƒT»Ü´2_u¥F<#+=ÄØÅÇ1eQÈÙ$1§T8¤TÀ$`à!hMÙˆª¥Á8Èþ)+õÊⲪ\y ÕYÅ¢íòæ]dÇg0€˜Î=)¼'xЬª®–X±Š~0>(áBPËi¡ÖB¤…6Á·O,‚¾; ÔcˆôÜÇÝ… ÖB¤…2A·OLÂë·úE+ý².=‡¿.„íÍB§ át!¸tÙÓ…PÖ…àH ~‚ì´/u è^2ãt $fB8«=1¬iÌÏi¦çäŽÙž’~úüÆþWY‘o;ȳ/›¿¨MáÁ KÀS‚Ìg³º:‚v Cÿéù”›dæ+j3w‰ý9)KÌeÛñömcMæ:ü¤Ì,«ï~j†û‹s²7z“'°WµË@}Ñ®ê‹Ö Ô¿}bÙ«Ú9PÿÞŠ~ìãn¯j×õEkêß>±ìUí¨o¥_öQÀ^ÕÞõO{ÕöZæÙƒc=³Ú.ްXÚÔr§èŽØœíÃ=žÊÖ•’CdŦ¶† xrœo.ntJ¯´ Ü4¡ú–…?)+ (‚±LÛÛR cÎÝþ?äÊZ³Hš¢àÐþÓ¨j6œ‚ágÂÁlÈKQÀbÔ7Œƒòìœ}?håç@¤¨y¿Ã;ÌfåQìÃdšnYÄ–âðnyáÑS¢ò¦~ð—;9ä9$Ä(Gá)‡½°yŸ¶ú’'[[„˜Ì‰ «~áD¢Zq"H! ÿíÓ‰ðú-½hE?ö1;dÕ­8dÕš} Ÿ˜N„×oõ‹Vúeù·“ÓehÚ¨as9)Và‹eÇÔÛÞM ©£ŸÅu»‰Ä3¤Ìhî@˶_£°Æœ¤êb!&oQö{dqùïÅú”SÅmL¾ì0ͦ &\Rs3ªâ BBˆý[JdÓ|–€¤QŸþÆ1šp/h˜ðmdM/‰*åóÀç´ßÖ©  ß~d^Ždé ¥QÀU®p•VW¹RÀUÞ ¸ÊEWip•«\¥UÀU®p•÷®rQÀU,à*ïÅù6ÏÄÎGȆØwŽ üM™ôÀi×›€´–Ö†1Ô$,\lAÓÂPÖ”R‚1Ÿ v ÐX|k ú=áNJ¸oe†aw¬I˜²8n#ûz$gÁK•—hñãVüRÞ>ÿ M¹Õ9¬Þ%Â@´éÖÅQ0¢±4¸€„å8e©ýaQ<¶$ ­¨,PŽÉT“¢êwóÅk^o' ïÃ4OR!’JÛ+“ƘìÒÚ(#<õôPǼ´Ú5æ:€Vs"3•É¢vëÖ(wÂýF,ÓtŒË0{ÏùfßÕÞÓoMcpay#tRúݱO “C’)·CÈBq¼ì öÚíÓÚKàñf#]ØŸ¬ÇM‰~&‡pCžb …“2Þö§c€fÊíO‹ç¡˜.’ä KÑ+bÞoÄ^ý)쨞‡òöçãÆÉ’vƒi¶…Y QEÉFC@;¥*1’A%Ë•<1€ãœ’7ké=iÈŽwl/€®Ó³xùsRÑÞ¬”˜ë¯P!âŒR±èÁGåâd-|*CpÅø r)ô“{åSl I«nc ©´Ã¼":i;¥j½›É9ïð4ŸceÜì¶B¸4º÷žŠTÝí…cWA•VG‰Ñ•ý “ˆ (\Ô;d5€$AÑÜ=òhIOØ‹³K·bêRÍÎP+Á~žº¥ƒ Yaœêª)nX„#ÇÝ»Q°v“Üáhòe s”'3B­ß”vñý„öF©bInÚåµ6]×'äð,Æ÷—g'£ea€Á‰.Ù:|Îõ/Bá(1ÅýAž`>9\ùÈQÉ øÄÙêã.W>ÀöÏ0¥ìâ;;Sx ‚IJ¨×q9õ ´ûîSØEÊYyYÌÞõtZŠÎ¥”íyw²x–ƒ¡eçX€0"-ìÁ0rû«Q¢O“˜¬ÉÀœfèÌr?×i&EÜ*VL%ã —î´÷×2Êl’L–ö5"Ü N9`IÉ€ ¥ˆ’ÏDŒ ÖöaˆB-J‚ÙÂÑÇ ‘ÂHPNÀ:K)ó¸”-oG­®Ã%QÄÚø˜ nÏ +"¬Ì9"l)%Œ6•uhê°!~8 „úS)Òî爕¹Ÿ’Ývà¶}5e=ê‡zøà·—¯™ö¾Ÿ"ãŽQÄ5R C&]àzË7L³µÖ3$?URü`k­t22 µ•ãÁÖr®ù!Lò–Ͷ汲N„ù iQŒ¿ÞøÆdÉ\3®öHÜNÆÕ5á=)—¶³TXüËÉ„#_‰šž¬àºaÄX]#bVSí¾Ç£›2¤`½"~ר_£PNiû«A虞!˜¥·Cèfɇ”Æ ãu¨û/8&o(>n5æ1s"¿Ãˆƒá °yF€ 8€1–͟ÓèôÌG•`ÖHéÞÉZn²6$NéJº˜aLo„ V7œj8aÊ?ãè¥)v–Â2œI¬À“av“»ÆÜò&Admm’Èi‘%­õ†È²f3Édw=]RŒ›á`/oÈ(¿Ä0C€e>|Ûà Ü9ßr%Ä+P”·BI\ Õ W—$ùIÒªØy¢|" ÜŽùô¦'½}³v1W‚øKÇÒÉ—+‰æx{©ÕÝZún†v"V˜§ò~'ä%Tì§‚}ûÙ5Y)gáL#ÀO>Ðû‘¸µŽ¾¿ÃØmwNÀ'>ù)ñ0Uá™ H£¸ŸÎÇA×x­ñ¨7§7Å œÑͱ MAn×6~ZÆ;Œ× ·†wø§y"1À­2ey‰ÌºTÞ¹T×h¹¦sly,–@›SßIåQT^„b›{U/L}òX×Ó%æòðdh(_’aÇ'ƒC±Ò‹ÂúÜæ\HáÓ„o09v£”_“†‹éRÃ3sòÿ“þ_ß´óLÕNà[Ð:ãF„÷߈·(¼Š*v|'Ô„ù%n ?Á­áù`>ȱÞ`ͯ\‡ïÖ³wó[.|б +œ)^QÇ@¾!!(_W˜Ûa aôã ÌC8”)Þq~ 'Võˆ†—ËØéí Óï¿“0Æðå/Nöí|Õn.b˜ÆZl_/šëèQÕ|ù˜˜NÓ\›u¼]¯¯ãÊX‚M¶×vÝSÓ®<žRWÙ¯ºëêúÚŒ~ SL®õÓÁwzøÎÈZZy•ÕkÉmó`¯µ6Š}Ûç¾öÝ Ô°2ÃÏèɈ¶öD yLjíiÇ(sŸÆöz"¨îö»¬ÅÝß^ÃþZ:LL‡D“g…F'‡YØÎ}Dôl·âX}Øþ¤tÇ®~×UÍUÜÐ!ÁÛ€ âÁ:ò%%7¼|yùó'ŸÃ endstream endobj 4915 0 obj 7104 endobj 4919 0 obj [294 /XYZ 33.1199999 439.699999 0] endobj 4920 0 obj [294 /XYZ 32.1599999 441.619999 0] endobj 4921 0 obj [294 /XYZ 40.7999999 196.819999 0] endobj 4922 0 obj [294 /XYZ 40.7999999 388.819999 0] endobj 4923 0 obj [294 /XYZ 40.7999999 196.819999 0] endobj 4924 0 obj [294 /XYZ 40.7999999 388.819999 0] endobj 4918 0 obj << /Type /Page /Parent 2 0 R /Contents 4925 0 R /Resources 4927 0 R /Annots 4928 0 R /MediaBox [0 0 595 842] >> endobj 4927 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 4928 0 obj [ ] endobj 4925 0 obj << /Length 4926 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹¤(Q@Àc¯äÀX99Þl‚EvgùûQ¨î6©R‘’Ú3xÆÃEëýâ›?þð÷Ó?;½y÷ÃNŸíÏw?<5ç¦k¦¯Óåû»û?HsVrúµ7ú,‡Ë×éó/O_N_ž>>}ÿýò$º—íqp~Å4áoŸ}z3½üiúËïþ<þö¿“<ýiüßϧ¿þmüñ£ïò_žÌÐ]~ù÷ô‹Bšñ?÷¿]ÿõô—ß~—`^æ½üûÒî”\µŽ/×GÅË÷ý£èeÍ©muß´'!ä¸N=‚ã¿ÿxúiœíºŒóÐ Ñwmß$ÏÚËË´ºÑ§¡ïNFú“z{K›J¬œ¨Sªa™èeEbÝÖDÓöá©Î¦³_ð÷”™ËÎÇ÷Œ‡<ž´d;áÎHñMݯ=—y¦Õlúži"yÅšÙóÅ3QáÞ7ã1^69è•»¼Î´\}3¦‰.ÌhÕÎ,ÜñLd¸‹v˜6Ù®EøÛTk'’k|Y‘X·µòÞTY¤¼I»/Ÿ?=½ù Ze.ÂýÓOãJ^4„éǧq»úôÝEê súôãé÷#š´8}úùi8ëAõzR)¦ñ!¤5ð™Žà<؈”„g4ÒÀg4|OóŽà“ëáH‡FÔ4Û÷ŸFì/ŽËªârûîá{8¢à<“5=Ø—1¾HøLÏ'€ËðäÌÓàÚŒÿp¿ÇŽÔ¡ ÝÍôøR*ÙÇŽ9Bâò_Äåí%·"H …é rU׆ß›˜6 ’s.ûLJFÏà žp yìöt¶ýÈ+¥ïÒôLx‚080wÚ<k“$iŸóµj‰í Šºgî€í|rß G¡Ð3EGc<  =¡f(Âõ`‹Ó³Æ>ßÀô¼=mV³xá3c,Ô¹Z]Ç´˜÷@°)V%æ"˜î:Äÿ€G>#)V2æŠpÕ‚öxû[0÷Å\ãÖŒàlø´ÞÊN±çã(\5ÆÞ¶¢/Ô˜aýJ³ø˜Ðœ<à˜#É@ñÄ+Š–ƒù ¦tŠ_“À£ÐÁܰd!x—žbüžÍ!jGªp¡AÎŠî §þðÑc#œp—YO˜W¯ @”˜×àÓÆû¡ð[tšå=8*…GxWùÁ»vh¸lçøæi$¯<«ž¶½þ´½6†½¾>ˆ)€å:#x?·×7Ö\ÖoI\•ÕŸ¼=D3ß°¯ãÐi°4Âk{4 ÁV ÆlçPöOᘠX[$`b.†OŽ`#h]Ê\c˜æ[®eƒñr‡ÀöóZŽtà|b{yøÆê}mêy»ïËX¯ùß{È$ÚqTgðÂ`϶xux@»&öK‘µ”|,’eN‰8`ÝŒ©B‘ŽUù—€Ù8ÓÉæ+iÄ×HèQNw2õâú„¢=Kq¸c[zÆšå #פî8}X«gaV6@{ð¨S<ÿ½Þ™dà-FF@í¥€ƒ#0mÆÅf–Õªô¸MGêÒTH)X¡Ý4}!F7ÂÐA Oèwè´±øÀbÁÐÍÜænb¤íC¿„oÏ1.ŠÕ_áíàE{´Á1I†tòe:=ž3,ÂãÌoëéÊK@E¡œž kÞ1A)Gï“… …F)*ÒZ r¨AH‡C%X!ø0=îæqO×ð(Œp ÞæI 9Œ«$Ì-ݤ‰«lÖ.7îQT0†MT¢Z·~õð‘A÷¥p¹€ÈÁo+]ù‹pëô\°6lo瘢ͤ‹ðýš;¶|xÉjÌàéÈŸOŽ™…RÃ-H@Nâ8ëI­gSßJ RôŽ“‹<[U)±-*Aoz¯hÎ]/¾vÓÌñQ1ýÚ*Â#qopœ¡ksJ.LÛtÁúÓZêZZ‚·Z W ½iç€ïäQ–¡YW³G")û°¡ÊÛôú…éñ3–xƹ* ñ½AÓãóñáf³–`ŒG0D­I¼ô [× ¿h—.|E;A%NÜ‹Xæ¤;˜x°z"ws6Cãè›6ЬçµÝFÞBú H†P'5²;#«‚ÅÕºÆhÝ(M''©"Ã}–鎺`zðL´èø eždØ4”8,Œ& rd %`=Á3VJ ‘^9R$à®y ÁRÖÅS&÷)îòo{$N2Lðš)1^o[ÞûXâú”¨}†ÝEaŒžµš]%+8œÎGB“í ®•äAÀ¦„³^Ñ¿.ú—̵h¥+“‰yqŠÊQË0nb-ÛpžnNÉ´®Bså-hÝÌ·#Ñn÷f(w»¬Ù e„ÿ3Âg®Ÿql…ÒsXÍ*²%Ä*(Ìu/0)™áÑöªö8a‰¸¥3&RS¶¶Nõ¼Q”’xMÒh†‘Âl°Pá_-5ÃKGP%3<—•Ó¡8)õÂ¥% ¤àÞÏÀó ÀPX¦¬^X]Ú{bÐ]¢LWצ†ügð 0öcjÀ brÇctQÁWdæ :r,‘ ¥°nCÙh!Zh¸SîDèÆO¹½W°õåC8$Œpà‘‡C©n®dšæØaé†5ÆM*$çð²"ÓSXpòPÎû*YA% UòaJŠO¶N*šð“j·"7‹£œ³Œ»²Š¢nÆjâî0ͦÑt'åñô£51,éµé:ç|Ûéòl¬~]MBþG6ûæÀÞ^ÁÝ ½«N W‚-¢ì {N¡ê”íßbÌspWä»óß.‹"ìX+Yf<–/F\­8#‰7 »,…}¯Êb†²˜·Œ®µ¼_ kÔn䜄Œ×¼ü,­:XZƒÎwÚ_a÷L NZÉ|F9$ÿèV&ÿ~ÍkrÒßyÛ°Õ‰‹úsk¤+»ö¯?[[ú(žÞU±çªã…S,^æ­»Á…úf­F@Æe—û·Éº{/\æW>ÅS×c"®°íïëÝž¥‘R‡ù=äL×¢pävÆüÐ<‡ ^½ç0€+±´‘ÂW­ãûÊqYùŸz8¶má¶bÛÛŸøø =µ÷|_ù‰¯ú—=ŽT˜ª”_ozgÅaºw–ÈC$ä¬ÎfMðÈy¶6ŇSâá³ë"½wgè·¬¾"m‡ûÞúúŠJ—ë®ñes=— ™®^F+›otäýù ü`ðöJß‹xe_Nó~—â½>ck =ªó–Oé°×;Ld©F*¿YS0 ,ÞJ½J‘2Šo0ãBÖR•k=ÞˆbóÞ#œ×‘í¹-@™ÎëÖÔb}±O¨¯Ow“ ù’í/×Ä)ÓVŸTÒ·¢˜¸ÌMU´÷abÚ{@yö"%€¡æ OñÎpjÖðÐÎþ„–"axý±M2§XÜc³Ùî¶q\(Å•žÓ|s¬bnj…„CAì–¶€ø†Þ :éÖæNFGa¿)壎J¿ªù~™”ÊýR]Vb…î0€ÛòûÀH(çÒÃm“ ºF¸\æA*õΆ‹-pðàÀ„Aà=x6üÌÃÐL#]ÜÛKUŽwØcCÞ(©v¬êÌîr[k;j~Œ—ÄU:ë!Š\9m³34~²QRÒ¨øšjT;Â…^9ΕŒàpqTöØ—.r©\TÓwW¯\þèùßjÈvOü8#XcÒmÙ@ëÖ@µïɹtÞÅ^–ËR DZ÷d,r5h¡¼‡%˜ëg‡·ŠÔéà2)ÎZ2.w÷ÚÃîØC¾¦.”ófàmDpÉfTÍ\r3¾6ó%¨Ì×¾¢ëî±LH¿â~ìÍÃrÊðŠ ¦\²\¦c[y™ Wáö†•jéYœ¯iúƒ;ŽÖ©e¶·ß±bQåµÚ}-7ÎÄw3ÿ3ê¡­<\P’å^î·€ô^ópZuîqgtþÈ ™Çr_­‰ƒ=VâM­ “ÇB(Îüò²òÀ¨MÄQžÂÄ£N`™,ÙøÇчÆåè }1ޱܼÆaüTrdä8ƶ)ëLÒÍ×3á N†ACí¼^T?…ͽOkÌG’Ä+ïäëZyvhÀ!•ž=³™JPýö®5Š[†¦ã)¹óºàòïó³É‘YÝHé½” pÕ^oy|/½MÅ~\`Ç6B¼µ¤×ÄGQî.æéÙ­9Ɉ/VTòæuÞŠ*Je€cʼn¤ÊMˆI~wB32Ît¾ë #6D/¯ =En¯Â&ƒz)‡w¼ºí~tóô’V'o£V;ÝWOt;b WsÆ“7+òÅB9‡3¯éCT¹!ÁªâCV$?¼Z´w‘v„Ńv¤ß_ÕÎkuhÙêPë »aö1«Cí=µK³áöÕø¼¼j|±×Q;R²6S—§­/c/‹¬F ¯ÈZY‹6uQî)Vº…%i šHÉäSÁ¨mMt¹,{,9Ê0% pJ$¡R¨¦ˆžŸco} '\‹ö2Eon#ÔsÍ™¹µ\×Ü£;r¾Ál…²dMVãš ³ iDi‡ýXÎÂÚXŸ“t€=nqo`­\‹\þW’¹ëÎáî9-58“”w¦„. ›mõ+Ì$6±Ñ Eì¡Pð˜€Ù ;u•¿Þ[ÚT!ÐL(ÞÎ; Ž±\¶U ýäÕ’Ñ]&ƒŸ%&Î2I†=ÂbDAm_SáÀ=¤JT¸ŸìŽk’lr¤Äq%ÌкR9 a`¿E GpD]‘ ”JUZ´QA²B¡ ´æÊ¨ÀäNèNmuÁòv½iÄc«Ù>¯ÃÜ…Ò±’‹•ʉ·)“=„;f½ýQÒYØ)‡ÀÊx«·¾Ú<ÊÀçó Èà~2]Œn¿^O^œ Ml–á04TŠ´"fZÛLà¼â3Å ŽeãöÒ«`”;°ܰšbï™Jv£*o‰oúøW½=¾3ë%@ÁÅsN¬å14׼ܙ÷ÝÀiùR.ù2ºÖi`°Xë^vœýð`öYB{†5wÔ1¶ÍO:òÊíîIÝäVä“<ÍÙ2hOŸÑ) 3a3ÍF»lX6«'áÑÎýPÄUb6Í×|ø&Ý‘f¶G-ë^ÒÒŸÁ+¸6™ñž‘·ºrW°]“§X‹Gr #½Ì¹µ˜ç2Œî¬^ðá~DY\‘nPç¦Õ¹ûÁ+Õ´3äšÚ^’ÕJíðÚC! s8äu­+ryníá½ò’‚Ù2ê; KŠ_TçŸKFLÕ¼‡]WÇnžñϤj-Äî`©QÞ“uZé€#ÔèZ×K¸`ߨÙþTØ;Ž}¹ø’T\ ˆ}픪Ç#û³ëœ°îæõÀxåªÙäñ "¥x C¾ÖNál >£*yz!ã÷ÍìÀ;_æ¬#)p‡2JVhe+Z·ÒB]8Úá…2TX ‚rlX•H¸o‹P°&ÞÂÒ1¯ˆ»Îßc즨/C8\r—‘çòA ÷ز5ˆ+-â– …çw'1ncE¨AtSÕI5W“[wçn¹­ÀОé ûs¿\à×/ŒL"_©³Õb­Ïݤ·¹ºÑÒ{ |f€ÏLŠy/ϲy ÒßFžál“Útÿ—÷ð³6<µ°Ãè«d.´«´ç=cO,gïvm/°ë.¿K-®Y$¾¯'àÆ‹Â{FÚ{êã!î`ÈpbŠÍcY¢Œ½ð=V4/=g³¡Ô¥µaìòh!€U>Ýàµôˆ.¥!<3½G›³š<ÿ #µ}@ïÁgˆ!(!îã cÌ;¬ b-åÓtgq Š'“0f&wx}䔤§Oÿ[÷}• endstream endobj 4926 0 obj 5648 endobj 4930 0 obj [295 /XYZ 40.7999999 688.339999 0] endobj 4931 0 obj [295 /XYZ 40.7999999 133.459999 0] endobj 4932 0 obj [295 /XYZ 40.7999999 688.339999 0] endobj 4933 0 obj [295 /XYZ 40.7999999 133.459999 0] endobj 4934 0 obj << /Type /Annot /Subtype /Link /Rect [386.399999 249.619999 473.759999 257.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 4929 0 obj << /Type /Page /Parent 2 0 R /Contents 4935 0 R /Resources 4937 0 R /Annots 4938 0 R /MediaBox [0 0 595 842] >> endobj 4937 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4938 0 obj [ 4934 0 R ] endobj 4935 0 obj << /Length 4936 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÑˆE‘@°€Çã Cc ä°È!˜Ín°ØYÄÙCþ~¤Ö£Û¤>>Фúá¶±§i•ŠÅb½XUüø—¯ÿÜÿòÇþãã×ÿì¿M?¿îꪖõøµ¾?œ~ÀUÕðñ×Nµ×Ã×þÛ÷Ýëþu÷¼{îÿ}Ý1yxpúÑίþñí÷ÝÇñå»ñ“¯ëûßžïÿÚÿï×ýÿèü4ÁþàûNi9üòÛø ㌫þ?§¿ ƒÿÞýýOûß{ÔîðíºN¦áñº<Êß§¢—Õ{!:Î{ÙðOÛ“ã¿ÿÚýÜC[Ш´`¬“¢«ƒ¡v|Ë„ÞëNî™è, ÖÜA¥âºÍhÀˆ¥MÕýÓNPdÒ7=°ašm2ågHÉu“ЀKšÙLx‰L÷¶áã$u:ÍT* Ž³<€ŒXÚÔfÊcPdÒ÷ó§ÉD2źL¤W*“´0biS›IA‘I¯'zõ²5qž:åU-eÊë¹Rf6B¢Ò]±v©-O¥×*PS‹<€ŒXÚÔ&Ê;@‘I/j•‹ô ¨T@m›ÇH:`”‰ô™ôrfUžSCê Áù`®Âïiep>˜ðš:¸Ó?ãÃà饗ť]/’é’«ù¼!¦½:ÊýV ^)êÃ+.çWÎ ÛÉVòö”)ºÃˆ2y¡«jkÅ#âH¾Q€ÉŠ3µº­W€LÌ¡þÔz_Ý@¨ã,D%ÆL&¹‚½cäq†a4–ËŽåÖHXÃ6]%Ks3¯ƒ6g´hý½kyD h“äàƒ®óÜœ73Pž¸›±ªr˜Ÿ‰¡2Wðdã ó/4$âÜDFþ)ÿ`bÒÁEëJs[õ¹û>™Œb ÂŒâµäÔ¤)Xøˆx[5\±7ˆ³z}MN>€Òo$Ç>•Þ÷E¨Ld/TþDWˆ6ѰôÁÒ¢„õŠN³æ —ÞZ ‡v…#þEU¤ŸÂ§3Ê,Æg¬ÏfሧíìÏF\ºfM@Åá]bûÞØéâý ‡OŒýül=Æ{Iã†m-­X_íµ>Ø'ÆXS<_LQã ö4ñˆÎ%z WíÈQë‹ÞМH¸,b=~­°„9RÏ’¾kÍ™õ Ÿqcb¶²L6j+nš_G¡a¾‡–««ñK²¯=ƒß±n4„†ß3 U‰IíG„ž)žÏˆA6võ/D·x=Ÿç ÈŽ½±¦˜ÚšùŸ™Y¢'ÌÛIãÛ3}§CÈ40¦†jaWÁ¦4Ï14{:év+i^á&|„GD1‹¹é…Û^ $…€ö}`{U˜FØiKpU,î ›dÒõª”eíŒÉqäNër;Üúã›69­rì Û¶^ƒy¡xBt!ÿ)ò1cš! k[ªÉC`x?S¤¼Å8^cNØ'zçéðæ·¡|À†óí×2ZÒ˜°ŒñQ‹úáêdž®šIõnâ”1qàqHä=`‹¶5 ª"ÍLU#†"’–agÊRº×#q¬ Ð1Ï,oé™â糪E»žŸÈö­†¶±åßbÔÂM„¤³ÂaO–ã˜B¦HAžçÔÛï $¸¨xÙü"-†Ð9íÔ,Çk^·¯ä9o+ ¶¹'{e5Eã“åmÔ…ïìásß:·ÇpRH ï\˜ÏPPñ(a:C²B˜°»*ÝS"r8ó«ÊUË"Á²ZÈÙ2V=nsËæ¦B($@ή²%†— Æ$ć ×€Üù”¼mXP´~™g׆³)I~¼_½Z²<þZ‹>"hbéÆˆâ)o¹¥4ò *”V†V¹ ¶¾Ûìì‰ü‰j#ø¶ë~çñ ”}’£ƒ‘cÙ½N–½¥(Õ8Ø+±´‚¿ÏŠÕsïüBÓÒ9ÖçQê繟!­á£iŠ §©ÖmÛh@Éî½èz+Â.°qÜu××{{À8T'.ê¼ѽ¥Ð0&„útÇbà D›ÏÒ,ä1Ę”6$óL‰ñ–1Ò£°Ÿåm7ÓD ‡7ì·2pWÞsFâºVúŶCýþ¡Å]"4"Ú¹‘:ÃB ©#\PŠ×Ðí!‚ž ¦…C Ú¹4óÎÚŒ3žÖV­õRxqå†Vç&‹GÑêo ÇfÉqÐèï³’Ôh?:€_òŽC¦ Î/ÔküÖæÌÍ£·ÒÝY¥„-îQ‘4Ñ'й±H—Z1aÍŒlÈ,"œÆÂ‚”‘ç>;&è±¢kAµ%g_ª°Úºr3pëx[BOp1¡¶rûNÊ­×&¼Ó8&…í;QzìnWá¬ê¥ÂÙÑ:·v d 2¬I”ü~Œž¡]Ã5ç§(Ì–>?E7¬LRõ±ê–Ðx WŠ8(B©¢_kr¬Û¨‚ãÂÖ«£¯;Ö¥jÝÍÈÐÃå÷Ü®QU¦8á@‹ÔL–à•½)¾¬dáŒÜïØò¸dŠRU¼2¢“¹ùƒ”Z™°ù©ÆyØûBnjQÜT9N©ËWÐÙ\Î`ûuëš[M¨+»ä×_Ƽ¸ü¤õ|ê=†/k–îzpó±á – ŸÃÙ-!í&é6]ËÞºŽ‘l7¡EýfcŽÌ%Ê‘p@žüß½¸…ƒÓèÆ”r„¶ÞŽîp„ÔÝíBûŽ@¢´AÝ *x­ðy3f © Y‡÷S¢Ë8%bjir ù_N­®³½¹#ÄãÀ”þN (]4 '—qnÀ¹ÿ²– ÛŽ+¾œc¼;]|nNHëv—ïMr(æß©ï|×yÂ+MÓšÈÐy¬ìêKm¢þÞätA¾`²5¨›RpUMLm!ƒ=¥_XR!ŒQÞ’ ʺùBÖü(LÞ=îÜG¬EskG¸Òn1å–mJ±HʱS„ Ãy²…ÏýIì)aBb ©™M™”•ˆÀqzAda{fÊr 2hÞµq"•2(P^>º*kAH̳gY5ÿÒvÔãÞƒ¡m•j)UHð€uê´æ»âgf²×ÌHÜÄ#Ù Œ¬ir1Aî,í()Šï¾Fáû´ §b’záÁ{ÒÙ@Dð/â.Üë>FHèPß- ¤ÜT˜›¶Ê±)swzdÛîËeà ­2Yaz+ŸÛð„®¤ mn½¬Y´WÓj@ja»}wY‹ œ±g[§,S¾üEDÊ\·[­¿¹P^Æ¥\ \êˆ t‰>ƒì8 P8 C®†ÏÀ@¤È¦XýüÒ>Ü¿0Ü¢c€5…û°ŽÆÐ0ÿÃõÁ<æàeÌ}r_@ûˆ«¶gâ6j½Ýà£#|Ç#XÆpÃ’´ÐN­ûïýkÏš=Û 0ýøö=ªÎऄáÙÉæÎGý‡ rÏúi¬¶c²ôM½Ü‘<…Áe%×ÝV-*øâ]Õ­'åw+##{4MÅõêí€m[ÉÑÈ1ÍÚ{|FÃgFÔñŠ×ÍÛ›>Ah£exúÉgø·S€ke†_Ð3“Xah“jˆ{fZ±˜¹O¸6@× ¿ócVkáû:`Þ™ø€YÏLJJÖ6ÇCÞÁ”uðä”ɈXÛ ˜{á{¦3Ôµg ´)»†æ.k/8¸ÊÞ7—íK®ÏŒïiÕ|~0âÀí z^CLAy`cÙÁOŒ­„«T-+6œ-oa,LNªûžsjÒýóîÿ{Ä*& endstream endobj 4936 0 obj 3912 endobj 4940 0 obj << /Type /Annot /Subtype /Link /Rect [232.799999 628.820000 292.319999 636.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 4939 0 obj << /Type /Page /Parent 2 0 R /Contents 4941 0 R /Resources 4943 0 R /Annots 4944 0 R /MediaBox [0 0 595 842] >> endobj 4943 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4944 0 obj [ 4940 0 R ] endobj 4941 0 obj << /Length 4942 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€)‹¤(‰@`ÜmÈ!€a9 r<™ƒ™Aœ9äïGÕRUW“ú(òé‘ZšnÀ½¨Äõíë»?þÇé_¿ŸÞ=~þÏéëøýñóCu®šjøwº|}wÿÙ•~l;}–æòïôõׇo§oŸ>õÿ{Íó‹ã·þáuŠaÀß¿þöðn˜üaøËçÇ¿ö?ýï$OéûùôÃßûo?Žã]>ðëCgšË¿ ?)d×ÿrÿÓåá¿þö‡Óoýºçq/ÿ§tgº®[´Žo·WÅó×ý«h²êT×]«š“²_§îã¿ÿ|ø©í¶Œ³©…h›º­‚GmåeØF«“i›ËîA½µt ¶eè²"±lk¢ª[ÿPä£ïj9lSË¥½ µt c˜Žþ²"±lk×£ÇCQÞÑ Ûl—nôe¨¥ÉŽi ËŠÄ²­GïŠ|ôJ™a›J-Ýèm¨¥ÕýYº¬H,ÛÚõèñPä£o¯Tb9Ô·LÇÁ4P;P ¨ÇC‘Þ45Ô߆Z6®*Ó0Ýa¿"&¨ÇC^W¢¶iôÒ»Ž´øäe/x² tY‘X´³áàÝ‘>±ˆ¾òEôýæyñý—‡wE­º‹¤ÿå§~!ÏêÂðíK¿Y}úî"êþ·O¬*õñO§/??˜³6ªÿë³~1<‘=©Þ£'¢ƒïà'>ù@˜Ž&êíî”´6nÕ#a-MV€oîdz6‰ÖßÃh8„ÏmóÆóT1$z ßœŸŽæùð¥§hËè“Ä©®ž‰SWÕ×­ G(ªsÓŠg¢uÛô°Î>íúû¬´çÊ9Áá£ú¬d'¤¾‡"øŽ¨¬áÅ€&õ¹>ywØ5|b/tÄÂí¸GQ‡¿1͇øSó>iç"Sp°9Ëg š´F Ÿ¨àËÀÀæÞ¾\b0tÀ¢ ß5^4M~Ǽ$|éÎF)û G¯ˆ{ó|”u$(€£I w¼7»F”;%_©µÅXÄ ky=†¨} ¿L_ £öGG‘}òÕÈ/ÅY×Í+~Y}ÝgHË(ðA<(0 f1,.7;Æ`‚©ÏZí¹ [fñ ö{û((lFA±mtójñKD#u`À™†W p†Çp³VtxI/‚ÕFS“„¨ëŒÅÒHúGGžû':EEô\FF‡Ÿðˆ>t)ç¹»oö\yÊÙ;EŠuFÀžœÄ€¡¹þÀu?óÞ~ê×PeÔºñö4Ca6ÒáÑH¦_¼lÅ&?hVó쮟~GâsÃ&¿'ø›qámãµ)l^ݥۯߜzŸÓM=I^vI<¸I¡3¹çDY!Öóï‰b'v<°B…BÖ|‡âj#¼³O­¡«MN´‚°Cºì6ƒœÅÃßá< ž¨ÂtÍ6O×P…®º¾ôD!zV€1r kñª!xXê£P!ƒG+œ%gÙ)„Þ6ð6%çá¿ð¶ÂÛü«æµaÌ€áZ˜xž.‘K0ß\¡ÞõÖ¢PïB½ß¤f²ÏçÂ%|\"Ûþ1ðö6ë׬~µéáü:%‘s<Ö”‚>eR03ß~ݹ3Õë°¬‘D }ß¿©Ð£÷ð´œ@ψí$ øðVS‚®áXñKi¢~4šH“ˆY€—;RhÑQ+¾0'lÃÏ‚»‰‰e ×9E÷X1¤ÙkŽy—5ÎBðpt²ç"2ÒG‹wÅ32!MnV!¿‡ÄG 7)fí$*Rì|@Äœ:|Œô‰ãB]¨w¨-&Ùø òcI Z;Æ>B ò\µsÒáI•FæsâóJò›‹£ÿ5¿ÙgêêZŠÇ¾sF"À_H뾪ÀõÍçöó„îð 3O<(c8\¡®/½<ù×f¦±zê£ïmÇ«7PZÅû’áÃãA’gÓ‹FÙŸ'©+ 7?qB®³V`ÚIˆuRKëô+¶Çs6öœá8‚qr´8O7Äð‘…Má>Äp]*¸‡ûª«§!aEÃ$!­ØAäZÍŠvi$e¸DeK¹ ';F"‚>p6¶Ú£å1ÂÅ$ø-H¡Ç‹§E=‡¦³ætq›R …’bO©§d€—Ø=¶-M¸4ë¦ÄGÔ+Éœ‚¿Z‰¡EïðÈ‘˜iæÔ“gD¾ÇTáÔa(."¼£²µP¼ iÊp@ˆÈ ˆ—.¯g©¥sPÒe[œn‹ËU?ßtO}ªK¿­Åý~yøœ¬„1¿Ë,³R¥ª}:iè*LZ1µqîµÈ©>9UÎÅx&”òÚ¶‰ÆAih]è…µ½„´ãáKÊ1¾á’¨¹EZŠ@pa„+ÎÙq2Ds·f^ˆ:D½;5Šm¬³\iDë<1¢¤²ˆbÝ&kKÝY8á\"Õ2ÌZ9­ª¤M`Šê•Ba~-Ÿ ÛCQï{f`G ˆayS!i8¡…ô͉,ÀA“sB£ìÝo' Ï!8Á½ã†c4¦tÙVæØO@¬.cW6Á  ôô 8ÿ8Òx¢mÒºÃUBWoàÌgp+gþÁµT™¦dä°"\Ñ€8£²†‰£r”Ò+ÛË6I[éZ°Õ¿³˜îµ˜<H‰ƒ9¢‚–Äþì"61_és#nåiŠò¶Hy[·L„/e"Ê=.qÅ•ŠÁ%³pἂœðÒ£M~x©áÚjÜZâÄyðDs˜”íu=¸d.ZŠKœ³–#5›€óh|ø ¾a¼<Úê|)Ø„KkaÎë >Ñ73 àLÝgXy¥§ä+¼à'ZΖ¥/>(¼¬Ï+=B,/ŒÉ9K }3æ%ÌëƒÚwQu{õ‹ºå™í²ækéAæ{gË•CK²¬=ÈŒ2¥"ôBºQ*Bg«ç_T]¯²A8уªÇSO2›jË…ªªê_5¾9Š,Déæ•ËLR*ãswÙâ½¹Rÿ~ ëÒÌÃe¡ë…®ûe®L®LOß LíXûfPè>k­Á4×ÞC¡vØF´KssáÕܼz·]øûÀßëkPb¶þ6ººšÚK›Ò߯!Gïo“­eÓXH¶¾Nd) ÒŽåïÎp¥ÖDyRªõ“Ê:ÍšzJî4ë¥SêÒ)й @S爭k:‘ƒ'¥¬"$ŒµƒZCÀ@–¤›Ý65ói']·sé¤#ˆ%ÉÆJ$Åât9œ|Å[;ˆ‚5ª¥t¡ÂÒ<ƒ>(g9DƒÀ Æ)f÷ŠÏgÃÕk÷\W.e~sÝZ÷þæ:ùÅЪ•).’cJ$À««ôðó8±ÝÓrlå ÐJX<m¾'¦¥6çë>3;sRòäÆLÃj9@_Ïp¿O–>)¼íìë«#ûEëzÓ•(D?ÇÜ¥ÆcR–£ºÕó¸3óÕÕg~ÛZ„¨é6åuĸhµ/%ä©ÚÚëZÅyw^|ÅÙçõ(LÛs‡¯¤È¤iô·KE&æ\±—'IGõ‹ ÍÇö»µé1)ä¨MÏâk±§IÛSØ,ƒÔHD#ˆ0O²ô'¡t”À·Á>YLÇê"²N nÛÚÂá6ÕÄ®jéBlp~bË‘²ÏúH:Fcï-<šâˆ1æ±·Øúæ<¯iÛ(›N- ¢§Yfù05$SÎ7Ìhlü¨‡Qåyø Q áH[Ê#!jëœß¦î'FBë®…$É–ˆP`)]³bB©æ9e¤§’6]KœuÎÑbŽ’k˜¸«ã|Ëòƒ3…¥"%%UL^¬ÇiàX"À¡: ?q'·«\¸a›‚¼céPÏ.ÖŠ·]=É´ˆ{MµD@,½h!ÅíE›^n„Š'2¥§íBÑ‹%Õ³6oÕw8K|êUJ–ilxæÙ°»t‰=M9šÕµøˆ24ý~C…Ïv zǰPJNhåt—îÇÕ´T7ä,WwmIè–„Ñ-dñ3‹ˆËa)ß2—VUð79þî’”d+ÒÙÄS„nÁBæK+ÂÓæ|š´a5_h‘IbrVàRFÚ{ß%ñ^Ûñ°§xÎèQÙ’b‹q¢«éÈYÍñimìj¬wõ‚ÒÅÆNëA—ÞÆ^·6ùÍVþ¦inu,yƒ[Óh¢òË”Êi±°§4•DÞJɬ߹AˆæGQ´[æÐ™J§§)È#ÎÓƒ.ë€Eó ËPéF79†â°áÚ  ¦š½ÐÄŠJ1wíÁÜÅ›’Ëâ6ßZý÷ÔiQÆ–õ‹*Hks‰›¨ãUÃæužuë¯-½Ò;* ~½˜Ã)óa 1šÆFD_:ÐÕu»éÌà4äH[{ËnÍXGhH™’¤mxÉ•¦@ ú /ÌÁÉÈa£lX'sA iÈ›3;í¡¾fŒšÅµËZˆ=e{‘”QVcFÉÏp6ï$sB «Ø”wLµ—Åœ¦{§GQÚD B€³vÎÒê””Â4aµŒe öÅ1âçK¯·Õ-…œ¥þU÷К¥ýEåÔÚ%“ª÷2+šêÑOõ1”^;ožñôät®m»—ÅeÀcJšwM¯­·m˜<­NÖ LçbväöKÈo´®m~S<‹JH­I³½Í¸¨Kbß2¥‡E%§dºJ¤^Áê8sóÖª±å0^3y¸6¹Rqï Š ”ñô¸ Œ ¤ÎÑ©£|šíÛ-´Ê[gê [½à€{,U–®:WØOÛ’ÃUãy*ø79Ï#ùŸzòD Þv…÷W€ë³WzñÍÁµy࿃o¯¿ó£® Co®f]¤µA\ ¼ƒ1+s%ú•yNw«vQxζyN®ÞšœYÐ)cmø×·LNL—1œÞ=æMÙÁs'p)\E px?x4üà Æ3<–Ÿ(8GãÅMyS†Üçœi«£â +Ãó©Or¼tæ ð²¾¬è¡p™dùm6Þ­£¦¾‰·8Ô!Â÷Éá´IcY_="5ÀÛÁrÐ!»iQ.Çžn/຾Ž>® eþH£­]ǸvY ˜PÀŒîäxŒ·êÄKÙý¦³ir‚’Â^"L°Ææo'ky>–íXebsºÝŒi_“„(ÂÆ^¨èb±›Î°€H’Io, cž`$$)|ð¬ì{LØ%!ß¶ÇH…ƒ\†R|ØÁ+ð¨7l…׿0]_®b’0¼ì’:ð*×ó¹çDY!ÖóΖém1ü’ ¿’p¢5O=Éæzé§Uz– U-TÕ¿j|sY¨×w(W6§qNº¡ëù;)t£Ð ?O/t%€Î ![vîQxA M-˜•³(áÓ™[ÛÕÚ›ßú‰kV¯«\÷@v5g'v•6zZ›Bi6R¡7^v-I·ÚÁi­Ô5±·^5ÆdŽ\Né“®Ïu¿·Ü>y“–€”nÊæWüÆ@;Ú;û)~.#¢uªŽnLM*àA ‚£9uçHyþIzä4íØe;[JMVJßy|)ijÐdídFª™"‚E Þ®KIJ2ÅÈO„ð0 Š@™ G2©¡×Á+&µÝžõnùp‰>Ã#Â})ô0‰‚’)>1@H+Z3+ƒª^_ãQÞˆ°¼÷’D¸ÎZz åjÞ;p“Æ6’¾ÅAk,Œ[RB7qÍ™˜öuÕ›Y„t Ì‹¿ĸ°6¡Z$íQB¯:Aa8áÊã†ýEè ”ÎÙq÷i”²µ¤¬nú¶º±é<¯…œ`V£¼ãX¥[xmd<üö{g1§Ö¬®Ñ?1GM,ú”3g¾Ø§Ê× ~Þk-Œy½í¸8 I€#ó<Ž7Jœ7Ž(áÙx¾K«³ë9Z<àúŧÖÏQ”Hfk•+®Í“ç1bGª[ø <‘ûõô_§oýÄý —Œß¾þêY‰»…êe Ÿ¼›ð¾:»û®9]Ú©L¹šh†žá'u+|?¾¦97ÓVkSŸf-Ûsk‹DÃÅ·OpUê,Ídœ’Öçfà6ëžš§ƒïøÎ ƒµò,+uyd©Ñ6wÿ—'øÙÑý3±ÃèQœŸz"Ð>FôŽ{g¼±˜½k{F€PwùYjqE¸1Ørj¾–vF8Î;c aS¹aŸ¬v ¤Œdx 0ôÂyFkê8Ú誜Z†.¢yðâ”öñ|ƘvÈ»j0 0·ëªæ,.=ƒ‚Q“WÜ”‘“ž>=ü–!¦ endstream endobj 4942 0 obj 5088 endobj 4946 0 obj [297 /XYZ 39.8400000 179.539999 0] endobj 4947 0 obj [297 /XYZ 40.7999999 659.539999 0] endobj 4948 0 obj [297 /XYZ 39.8400000 587.539999 0] endobj 4949 0 obj [297 /XYZ 39.8400000 179.539999 0] endobj 4950 0 obj [297 /XYZ 40.7999999 659.539999 0] endobj 4951 0 obj [297 /XYZ 39.8400000 587.539999 0] endobj 4945 0 obj << /Type /Page /Parent 2 0 R /Contents 4952 0 R /Resources 4954 0 R /Annots 4955 0 R /MediaBox [0 0 595 842] >> endobj 4954 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 4955 0 obj [ ] endobj 4952 0 obj << /Length 4953 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`å&ÙO à™±äÀX99Þl‚E¼ˆ³‡üý´ÔÝ™ìb‘ÝÒpõŒE5›,Ö›õx÷Çÿ~üçoÇwÏ?þçøeþùüã¡:Um5ýw<ÿùáöÙŸ”œ~íúæ$‡óÇ/_ߎߟŸÆ¿¿D{ypþ1.¯˜&üí˯‡wÓËÓ'?>ÿyüíGyüÓø¯_ŽýÛøã§y¾ó¾ú¡=ÿòïé!…ìÇÜþvü×á/¿;þ:.¡¿Ì{þûÕV²×³Žo×GÅåÏí£èeÕ±n*ÙÈ£r\g3~úß~g».ã4ÔBtmÝUÞ³vò<­hÛãÐÿ7ÆœÆÖüf±ÉñXX&:¯HDíLTug‰ w5N|Þdgžeà.—™¢ÁUKÉ3ÑyE"jg ÜáLd¸wª¿l²ébw¹Ì ®n¨™&W$¢v¶ÀÎD†{_7Ó&»èm^§ŠœHT‚g¢ËŠDÜÖÈ㩨 …FÍÃâ¯3EC^ Ú¹¬ˆ…Åã™Èp—íÀ„ò¯SÅNT+¦‰Î+âAyËTdз3¢FK×ëLÑk&È·De®x&2Ü»fVÝú!v›×©b'˜äôeE"nk ä©>±XòÕÒøfyðéóáÝÇþlU}þy\ÆÅ4›~|þz¨Çœ•ðA?ÿtü}U‰þÇÏ¿„85uÛŸW^Í#ÕÓe¤ýàÃôU5šv½7_•rúꩪvxR›DˆËÍ2ÇÍWÕe¤>Õj\Fu;ÒÀéñ3-ÁÏÀµIÃ4ÉõƒZzÿ¦úxéNÕ0­íuúú2òáóˆKq˜1Ì9‚†Õ³¶Çê=\x§ÃÇxV 3œA)še×>ï{BÐV/¿Þëçð¤­Q|p~CŸCU®Ï°r¦ÐfœµANfyÍ‘QBÕÀÂ{Ìmà¯â âÅR€2±½ö4êªÚá™Zé4v\£ÕKƒtðžS3º–:Pp5¶;Á@†à <‰åÅúÁÈ÷oS0Ýuv7|¡ö?÷ÁÄŽŸÁpÄ”åfU˜…¤û5Œ„us8“´r™¯È€„ÐE…s™û„tˆ§'±?Òá•lIÎñ1¹WBзºÀCdž%[+Ãç@üj@˜_ÕaROß§é(ýØ®¿Ú§ )‚‹‚ϺlÊÏéQÚN|'?)§$_´í`ñLRxãê“kT=©jgIX ‰Aÿ*EºCT‘º!d¡Š yýǵ"@raÀb8rðAžé#´2’Jp§ÆŒluÚ+jÏébZàGkŸNf£°(£¼ˆó¨šâì• ócõþäöª ª›¡éº¤9‡ñ~ŒþÊÌ–2¢zº~B¥&‹‡5184ª•Î!,T&ýžV’ó;díín‡¥i[ù¨ñ,†ÄÌV2X¶²ƒ„MqFcħœ-Œê­ºþÀSQ+tCß5X{mé1¼%OhDµhd¾b^à{àȬ2=cYÁ8҇ൠ Ÿ±¬íŽÀ“Ã0ÀkÃûÁ'—kmø=–ýà3•å´Õ{8¤z D)°†0Èurê)#¿`Ž I/9ëF-‚e2ÅÖ.¡V[ŒêoNpqnLÆbòníŠqÛͼÚ«‰CR«(‹¦øýÍ/34" VPb€ÞšSÏ‚}Øàûñ¿ê$Ý'qDÎd»jkM"”°–íî? ºMãv+<† îÓ3玵°Ùtô±hoi}…6iµþ^öǽO3q&µg S ¦Øl‡¬Í†Aì³áh@ Y¥–Ïb|½. }ÅFZ<^LÉNÞ5¿oG!Ø+‡A§ w$ãDkN˜‰‹cê\f|Bp¨9­ãf ]¸£)äæ+M,ã[_?ÈÕO´ešhÿH†kÓ\ù|2 `F†+';¹ï¼wh©?h|CŽÛH×¥r¿JeB=aPºžàá¹`Ð$,¼%&82&X, K#€C»n2\:^»æŠkÜ3àZÐ_‚‡Ìš!"Ô©ª˜fŒ¾”¾×¡ËvÍ?è°ž rye£®¯¼Š ªú^%}húHµ( ³k°„ g,ïÐ3sd¨v¹vsAuj.Å5 a»62—siN—2„mªgÊ|}Ï3‘h?³²ÔžÔôš›53JÙ6ZM'8ÜéL<éYhÓöË235‰ ¾p[%¤‹¼€d#àÕ0‹¬uCP„¡´öÌö )# l½_œó¢«9ï-Í´€»kMû†D&8ãªH#o)˜øw>·Wõ‰Üé<ž'6cÃÜ¡Fò€Å—XÂØ0{2¼7þŽW“MP °„—±æ“`Ÿx˜5Žokiöªë*õì=ZÛ'~fQ[+¡1;<’KÎdâá,É„,lÔ­pÜ'!M tÁÃs›Ä\– V,DߥæbÓõm„®Aºçˆ ÝKSÖ#“5k¹L3H¶\-Q*Túßfš,Ý-‘¨Óß]›;"1p P—XhˆRɲ/ ænëËHɪ•ΫÕGHFþÉHöVTe8§îà‹ ZÇk(& ¸ãð8â®–+ý¬0êÝX!Kä¤a…ðòwí…ˆ¹ ØA¹ÑW–šÂÉ9Š‹„TlÞ¨Šn€€²b9פ7HÛªŽQ“¸TXâíX„ O†Z&Iš&•“%š†cnõîÅSftJ£_lq†xí"tÔÞò$$óÄ eÒéž%8šHI°1¥±gp¡$Ðû¿föR&8¦Q1©weü°8¿ƒï« ‘NÔ»"Iø¿Èx”ðêÜšrié¯èP*„TøØŸÈMãFñÏ£èßNbÎâ¤Q5H\êB“XJç‘òº¡cN.ÏÝDÊ0Ñè`OSä™àˆ²È”Nãâvæ“{Öº7›)Ø\…â"pn_Å]·åK“²îaßr¸˜rßæîðŠ‹‘ÈR>·J“ $=žã 9DûÁ²;TbY¸c²¦»ß*•?w1ºùB1t·ŽHc‡eRÕ˜ã­0æF´U¤Øü!G½¥Å1.T,’6ödxðôf’¬© NÅ-ƒA\{H½S€rE ÈÛ+: c/ÙD%›ÈH8¡6]9WÈ ¥ÔØá=f"o~r¹o2ï³Ñ^@lgY“õX“ù–°»ö·5Úg<³ÓOÀº˜C¼×¿1uv%ëbFÝ•¤£'€åæW¥þÕ¥¶‰ZNÏ:óß•Ygaµ†dúþæŠ)–Kµ•ýÁãÕg«q2Š¢EÖì&²‚çfÖ-2«™4»"ËÄ𻆘š¦,Ÿ;Í&u4ÓÖuŒ<.„}¦çaC¯JÝ×K°~"noZÝAQûèÝ52¶,í:ñ=UÕ=ÅÍL-Í%]­ƒž©Ÿán^+6*\å¯W“„k°f®¥š$\›”p¤#pàz–5~׳ÄŸC99BN VÁÙ$~á´·ßiicâ}ÂÚ« T.s¯—S©a)²È‹ã³e¹ïÍ£¯çò¡•Îpûé ‚˜R‚¬¡–g(Í"¼X@]Çc¦¤EU]<8OÁlI1N×é÷Îþ™î×™#u“¤ âb¾9Íà¾Óü,AÆ®‚¦3nRAuTbE7nÁÏš–XZWb“»°áŠWØ , oöÓð†âøÉCéCçÆ$Œ/wÉ,´Iá˜f0þcˆ²b¬å™=óÛLîMüì¸y4~Û¸j‚‹ w†e>98[å‡EŠÃý(ìÆÜ›ÍáåæÞƒhÝxY¸wáÞûàÞ›_ ŽŸ‘ãoÚEJLRB5n\.R¢H‰]H‰í/Ï‹”È'%vpÚEJLR¢©Ý¸\¤D‘»@S$ »ýqŸR¤Ñ$:U¤Q‘FoRá€Ò"?îU~Xδpü‰ãKÁ”9˜8yȰ¨êk®}U-³@«ô¥CRR0+‚<Áœ9WÌÆm‹LÅRó8H‘*yÁ)•vò;í}gA^ÙÔ{YV±k¸–¨+,¶_[úRTm³NYIß©óñ¾W”¼eÖ@Ö¨~„, õ®Ü1Ä„¬Þ¬œLÅ÷Kôv ÒS ÙyðÜJáû˜4!KÊyDí £«Â–冪ׅ Gí[7‹³$IÊnVC5¦Üõ!À’"˜²_K»ugdñ¶#ÉU<ø±˜´G géÄ@­‰­ëº×¨®X×6ÛÖRô#¹Í©:¥sHÆdÛ Zq,}°(‰üKÏÆ”uéüÈRÔ˜ ñ€Ï_&…ô:&,š§Õ¤?ȳw] €´¿„CÊfB.4ҙƅ$ÖgÚôÑœ„²Q'rwQ¤ôsô÷m¹+Œc*uWNdö3p!J R÷GŒ3/¦wx@Áå¤^EÁf÷Y´ÐÅôë—pÒ¢„Z•PX“.½*–‹ëYeh²\|\ßùf.>H}ò2áògo¦†ètz;ûPßhφPâl þðµ¸XºSïG±ß‘çÖ¼b­ðk"M:FLRV;eÇǾӅuLq¼îë˜+Æ$7ÙESâi=-QÝ·’D#drQlŽb! PÒjÓ7äiÂ+"Žß¥“Í@±[y?Ý7p˜‰Q¡ÒÍ[Q’"€C'‹Í.*õýÉ›}·6ûëYíG.†ô™Ç1ö]y¸¾MrPp´oz°ð†<-R†ÓˆA#úÜ¥ IÚ›¿ß;W átH¿˜ŽS$6pñÆÚŠ6§1MßÄ\%…‡Ú¬€$1¡1TÙ/ò!x#[Ck'&}'u ’WdSÇ…ošÆkjÉ6RC÷Ó"-†Ö-‹ö×12§¢YJV+5ÊJÝ6á[ˆ®$z#!qÿÑ 'eÅËáZ.³ô€,= ‰0ؾ°áöKH&Þ'¬÷ÜRÈz×]wè³djeT´UµTä¹Ïzj¥ ”í™=×ø*] ²vJ 7&•j‹¥ÚbN~{—] ,FDFVÕø_è¹Ðó>èysw3 ¸rr‡fpSSá…;ì‚;lïHãå{æv øš)'O»v¬.<­ð´½ó´Gsý–êóVXo^}¾t/É,JWõ"Þ¨4ÊÕ½ä>9dN.T_»ƒgë¨QwÚF“Fݨ„öfuLcŠjG‹Õ¹¥ßªo4«”Ap”\3V…Çí ‡ð ©äBédJñ奭SDšÔ…£ìŸ4”\gÓ)ËZw× Õ"$J÷r”QŽõþ;óƒØ_[ërÞß¾6|>ä®Òb@ãþÌÍ‘1°fWÉ ¯n$äâlÞëpÕÍi¤ÓÀ˜ƒ5×@Pª]/UÈÜ)žAÑvÞ•²7¨ªužÃáo ¹Ïä¨sÉÒPq³ûöDWŸ÷TS5W”‰€táÚeˆŸƒ˜RI4 ýYŒ=J¡qʾbf4{f>±½Ïk»@Ö—#?ú^a]{_GÀŒ;3ã™Y¹i+ã!î`ÈZpbÊœš¿F {á{fƒbí8Û{¶¶6Œ]-X°Ê¤¼–Ñå¬ê…=3½§éOjJé÷±¬í#z>C A q`cÞ1KüXÊíûª=‰sioÆÌäfIŸ8%éñÓáÿf+³Y endstream endobj 4953 0 obj 5197 endobj 4957 0 obj [298 /XYZ 39.8400000 362.899999 0] endobj 4958 0 obj [298 /XYZ 39.8400000 362.899999 0] endobj 4959 0 obj << /Type /Annot /Subtype /Link /Rect [60 688.340000 130.079999 696.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes >> endobj 4960 0 obj << /Type /Annot /Subtype /Link /Rect [60 108.499999 137.759999 116.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 4961 0 obj << /Type /Annot /Subtype /Link /Rect [121.439999 81.6199999 151.199999 89.2999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4962 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 49.9400000 536.159999 72.9800000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 4963 0 obj << /Type /Annot /Subtype /Link /Rect [285.599999 425.299999 373.919999 432.979999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/developer/Books/shiftintojava/page1.html#replaceenums) >> >> endobj 4964 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 416.659999 158.879999 424.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.javaworld.com/javaworld/jw-07-1997/jw-07-enumerated.html) >> >> endobj 4965 0 obj << /Type /Annot /Subtype /Link /Rect [219.359999 416.659999 338.399999 424.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.javaworld.com/javaworld/javatips/jw-javatip133.html) >> >> endobj 4966 0 obj << /Type /Annot /Subtype /Link /Rect [353.759999 416.659999 515.039999 424.339999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.javaworld.com/javaworld/javatips/jw-javatip122.html) >> >> endobj 4956 0 obj << /Type /Page /Parent 2 0 R /Contents 4967 0 R /Resources 4969 0 R /Annots 4970 0 R /MediaBox [0 0 595 842] >> endobj 4969 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4970 0 obj [ 4959 0 R 4960 0 R 4961 0 R 4962 0 R 4963 0 R 4964 0 R 4965 0 R 4966 0 R ] endobj 4967 0 obj << /Length 4968 0 R /Filter /FlateDecode >> stream xœí]K9’¾ëWè¼@«“d>ÅvÙ^`6°‡Á=;»´ë™Ãüý•*S*©dƒÌ”Än í®¬dòoF|ñë¿û¯ýÿücÿëË·ÿÛÿ¶üùòmך¾™ÿÙŸþýåúz<=ÿu»ƒžNÿìû±û¹ÿ¹ûºûzüïÏê__\þ8><bð¿ým÷ëüñÝü“o/<þíŸ{½ÿÃñÿþºÿÓÿøó2Þé~ìÆ©?ýå÷ù/J+=ÿçúo§‡ÿ»ûÙÿí8…ñuÜÓ1½jUÛ&ÍãçåUõúïõ«èc;íÔÐ{¥ôqžÝq;þþß»¿G»Lã0µêø+íÐD:è×a»f? ý^“3¨³¶È¡RšÌ(3ÐiF*miªiÿPÜ­?ÿ¼Ì©K\çe¤Ô ÓªÑ2f¤’V¶l<‰½ïª3ó"§&y¿ÎC¥dZ¡?ÍH¥-í¼óx(öÖJ ‘üy¤ä ›šNf ÓŒdHŽÄÞ÷©ë¥Hþ2Tâ@FµBš‘É;C}±ô›ðÓóâÇï»_¿¨ö¨ýŽþû_Ž3yµšæ?¾—Ûí9©¢Qï¿ÿyÿ¯GÓÉüÛþû_wÓ¡›ÌQA½šYóý=1=zÒ|O&øøDµð œþŽá;ŸéëÁsÃëñìžž5|âÙ·>gjðw0¼0Vúþ¼R3SÈçïGþËÍMc£Â;ŸT”æ@ÏhÆ ð;²;ú4¼Ù´x=ŒÕðä<§ÀÙQÆ<Úi(ÅZ8š,àï¬%¦‚ZBGPEÕUK<•Üðh 8k,7äþ€ë©še ÂÒ,«ÓŽG1è ïŽÆò ŸÂ'º–ñHX8·NÁY7p4,G‡íž¶Â¼À x¬K0/xlœmX?fªÖOµ~ªõ»R(![ü¤%$ƒ«õ³mëg}ÚÙ¼/ÞUUmTµQäJ[†½î‰áÁÑ<~AõßXþû]ÒÛæµÞ0T­Wµ^Õz«h½FݪžÚ¬¯§0…ÔhrÁhr)®¯1ã½2õ öJ OŸ=ç‰G¿cÞÄ£áà¼B†æo ]´¾õƒíIDÁOðh˜zËA×6PÚyNÓ#WÔ³oXâshï5¶JÜèñâÉaG§˜°N/-]îZ,Á½µèñJì ¤˜ús´aà‘ë ‘Z Á8 ãà°"EÿeWwçÐËe‰æ scñC¼|Å^5‡²ñ“ í«±òqh‹,µë6t¨i"8£b‡ßkUSÅgUçTìp/ÿTìpV…ßb‡k£.h×…°ÃµŒM.ÀvÄÜ}§[‹B`$2Aˆàur¸ð”$ 8“p2p#è†à÷DA¬È_,X•xªÀ°O@(L˜S8”DØÊ7G€FäôÐá.sêŠ$åJYÜ'ÒZ©*‚Á¡hh£¨¨,‚1IŽÀ`O÷éÁšv& ’˜±Ó"‡º$(Ý'ţ̨yƳgô¦y²Á6Ǥâ‘v*.XT_yÖ³9…aÀ*€HDnF6R}gU£8ùXÂL)_‚‚7:-¬`ŸõZfûDà9öFŒI¯é™Áf,>Â-a’â¡f‰b= |=«ýI«¼âìFl}B<Ïù®¬ã¾FS ßµ„6ÕÄ£˜x!Œ¸œžR;Þ6ñr~ó|Ó~Ï‚é¾åÎ~ñ’ϵ¿$#x..|,²uþ{ÏVqä3#|ŠÉœHð0€H°+‡ù-ícnÇÚ 7QHé™ýTY&tsð0ÿª2gKå±µ¥³ë˜ãdƒÕñý(±â{j^+Á“ëá :ª4¾ùŠëU8zQBî—ÊU)Lbž#rN;ÿ†>ÌtŤñû …ù®­ÜqÂXæÐŠ9åì>¹xÉoJD2•.wâ¡¶ç^=|Ö¬Y½iõ&˜[öXÆÔÛõÄÍã8VfB`Ñ£\°Ö禈³×®Ï Ò„.]kelIæ”ä¼Vµ·ÎiSëX- ×£g %\óô¸HãÂYi„ûòíZä„Þ‘áÖì,Qµ6 PB_IÜ_f!¤MIäßî½'|Á‰C­ØŒ³´­æ37uO¸›ÅS“ªy³Âñ+Î%„þ/¼ Kâb©´@&ؘñDè*Ö ­ÓÜ.½«eE)ð“ *V‰Ì]ŠHñ¶+Í(šˆOQ<ÄöÒo~+ ³k i0BKž@•ĵ¿+ÄE¼1ÂAJj5ÞïJI¦EåÔ8KÆÝ›Ê)MV)wÎÆVy«S±*fF\Ð=wy5Ê‘;’rm""C8wJ)ÉäYoñÈøà iq™e<ìˆ@ Gø¥¨Ç¼ «¢À§%’Ï ¶"§øï'Kþo9a«Š]žp­|·²¥‚$u‡êÉ[#‹HÐáYŠ E ‘°Ò%uCkÉpOhçì`c—á }2ÂÃü³àÐŽ‡qjúļ•ÇÃñD=k|ú,'I¶W. €;]RzDÔ½$ºÃƒ› xF²7Ï]lÂ…ƒŸeÿD®fb!sÂL4CsP¯°´Æj-Ò41”GAf©LñXÀj>m&¢VÈ"àhÙÌPn„\C×°óWî©î›o̪x#8O’ñ6Ž“Áòy9ÎŒs\œ:=Bðü>RÊ£,uå©u·&žÙ%N°ÿD†dÉ¢ÛR0 àâ•aëÔö—…ÜøUóþ¤Õ 3)¥v‘ ÞÁê &Q¥Š÷†ÞA#¨#J² ^Ÿ^j6nÀ2Ì x°x2>ùÂ#§8‚$!í*3/y5>Ñ™p¦>„ø à<Šòƒqâ)œ&"w›h´„Ww­ÁÔ; 6ÿ$Jõ)B•ƒé-Ý·TVß’-<*'™îÜ;ÇÉ)•R’9•->ºX6_h´‹å6“¯ZÈ·y#ß¾áx8Ù Æ ¹þÁï»oÛ.“ß m«n“Kà% {66ï.}Ï®ØA!vX¨ÿuÀ'‹Çñk!Ÿ`QWØXºõÄYúø«@=Æüªû˜’§L€c®FýhÏ¿ëL^#ƒŸPܱìYŽ“nƒŒBÍ9Í%Ãöjšyq|3ègQ´ŽW9Æ'—q³Üx®bC¦ êUÙ†^25õy,Ö{(Ãy¬®&¢×¾’a®-6Ó/&œÌõÖ0áNS°¸ºtñÍ’þÕyÈó6äSêÇ¡mNé—dîË*ªÁL£EE¥Kk°é±¡ƒhÊn”ÈA;±€#ØîèóÌT{Þ$åST ã–ý±Òb³†­ÂòÿÄ&ï@ßk+€Ó @*צ´Tê‡g‘J/¡¤’çâ3'ô¡2—ЧÀÝ/*®²tCUz²vXÞŸÐ;y¯Ž:mvã;SˆÖ¶ïYáU‡ׯqîÆËýÓƒãfŠâ y§üN¢Zש“I•³ãnÈSY·,nêúåÂUKÇhéÇè^Í8–åR¬ úMEÈ´î)Ý"$Iéô!‘¤¶¾çQXD *:.ˆ‘j‰26Bf5¥›Ml§¶D4±õ™ ©eØ0ÞåKq*2At¯¨]¦f´µK‚Hʼn¤ÂíŒDtd¹/î¦:G@P‘Ù;‚,.kßœ#¯¬Â³øBsOYmZEîhõFqÛ„F€ÃEk„ñ`Â\å(8FÔ‘ÒëFRÆ>è¥åÐR‡Säò×Qw£-GÂyûA(ñ$g‚“1,Ú†6 zQžõ£„â­x³?"÷X(Œì3N‚¡3é0å®aûsßAâ`°sV.O¥ ’ðJ·¢§ (1”䌄ÛÁgÍÓW6dõ üG}¾¤f‰,Ѧœþ¼œtjNÇaB¸óIÍÈœý땱é:¥êœå=´I`=¹$ Ôyy©Àê{}þ¤  =lÖÑ&1Ùg}îêã–Û½ÀS±«ëÎi7@%aÑ gx{ŽpåÛ (û÷,Ü3³®æ|2·2gê¶…[~õ74gDTŒèõ$ByC¾=§`°Pþ>Öûã"°!j »¸ ´ƒ¼(¡Yâ§¾ÄnFp3Ôõ[èò6/übÄuÒ8×F+ô2{Kêˤ>ä•(U”^¦ óÑmQ͸Œ\ÅÄ£»òT‹qáàÓ´K½ºÝÜÕíó™9beçhm§‚pY”rëNˆ‚1XÑ mÄ0’ŠGúìÁâªéý'¯HODþI¨p‘þ$¬w¡ ÄÚ’$s…P| SôÛcUsTbgß›üIAãdÉÅÔ§§­¿‘%¦ífó\2B „ü@ ÀOBHÈs&„”$ó¼Ùmñ”Ü0ßö™`-ÒïØQÎÙz®B&öv|ñÇ*Lˆ¢-ÁrzÂ2‰THOðÚÌ$ð"Uih‚¹ûàRÌó§¿pˆhnÈHuMê?GàwF  BBÀQOüÎ9O¢QVž~R¢äÁ‘eR„DÌs)Â)¤ 3e n…­"JÅâµÖcÄÅkü?¢€AGñF¾§^ï/¡’jàOleûsƒ†U~E«2êaÃí< <ðõÕ{«ÊúæU„SÔx(é¡€ãØu BÏ!„#Ò8I"˜T × œÚÂç"šqÝÇ*'&ÔJ‘C'Y‹z‹À‹ {áFP¹Ü%”cJbJ‹ï¤[&<#B9n<ÿ²’ ²xOŒ$D3 7oyê”8&$!”Á²7·Î²ÈÆfFµÒw¶ZÁí¡‚·ÈñI¤ø¢H$N)S̓P6‡–Vó·Úø1¬ävž€>ÌSæÉÿÜ¡¦„Ì'Ïq¦˜ßKj:ck Ð©p•'žL؇ï:Í©8¹œn‚ƒò.Ý¥ZƒÐ»†&tlÛ÷*}:tήNèÉ¢Òo<Ñð~G„ßà“>iÑ“öc4¼R8ëÅâ¾õŽÖÀ•zÞ³nàJ—=(Cc½ Ò˜Qp Ÿá;xGà;ºÄÔ‡¿ƒŸh8kçÖÁw -1䵈sua>Á<¬à^á¹azÁï, „Dc˜ë8ÒÊ`ºÄκÅ{9ÃÀ•zf¿ƒç¦ gà¹)Ìé1Ÿi8Î,Æù­=Àï`íˆwÓçäà¬ÜQUÁÑ4þã´×_i¥¦ÄûÜk¬‚{ §§nÂdúó¢Y721æ{€†ï´ŸËYÓx©2ÆVÔkm†/ƒ-C„¯vPi;¨]š£aÞù²ÖW™uë!eÝ«Û|ßÊcó…ìª2gÒö g²´Ì^õ] ýÞ¥5VtÇv3û‹ím,îô„·ý1ª1)g㚢Oð °â‰.ãà8"¤$Ï;œØ#¶» üöìÇ^…|æy‚GÃ&ÜQÏz°-m\|r8:͸³À{íYç–C£x¯±ÍÎàF…×à×Àðh8žg¯5ö0ˆJ˶¤þÐçÛƒ%J”=dÔпgà[08x…èy=Cõn†óO¢–¦Å=ƒµ´Ú'fÒ¢¸@Û/š½ðÖL€j!ÀætôJFÃát„?vÚ4×?ø}÷ÍÃ|y¸ö4‹mó—`Ï×ßLéRÊ9±ÕqZE gñ®I€îÝÒÍ]¥^‰î,½]ïûf$L•ªð(¥P+VwõÝhËò”]àX@ány*–k^)ZRuºkõjž ¡¶é‚É¥>¦€ ?µt®Iô]WµyÂ(“²6¤ðukÖ²ìÉ>ìøc ·Ë!RGÆ/P0€;³ø|"ê ô¿¢ôÎã?V«¤B΂LëRë`=&‰$/°Y9‹‡Uk‹R޹Â(}Ú²x¨Æ©w :lÐcÂ…W2ôD,Ö— yL†B:–Я˜Ð¿,êÂ3Þš:Çßs*¡CŸƒ\FàÁj¦´UËRrŽ#ÑF¬&4àÔkußb Ôrj4Â~Ý’þã×yD•˜Ô©²¨$Ž2ƒˆ¶À(ÜË’å/K°¼hÜ£x€`Þiwy³ä=½ »<`-¥8€céKôQgÝ …ù’78ot·Ó½E-+! +!ë=³²ÍÉëAŠ|‹¿÷]Kn$¢QЖ›1 %3fòÊšQë*kDfÍÂ2ÂÙå¸qý¹‚ù2ÚX 3Q‹¬q ±¥€5Ì$‘®å)Æe™N;Û̽WSgÑ(ÕMjóÎ lÅw¢ˆÎ?­÷u¹æœ$Þ×?X%I|Iò»:‘,lQiqø"†”N@8ò·Ý]~=,S ®,!•.Œ+^‹o ™J°Hús:q¦¤øgËó½ƒü×»JE&Ð^Šå'¥OÒ^Dâ¹y'ôö Ÿ–dÉX¦®c+†ïÛQYÒ¿TuéóµjÓ¢;OÓ ß‡<ÆMòERXµâ²i±5¸sï‘-ÏEZTÿÏ£¥²8öY—Á¨ò•(Ï8 ªYbpýPÃ×Ý×ýÏ#å ûu°ùß~‚sWýê5›¼¯í­±ß«ã´o%LLªŸ;ÀìMÓ¾çÁ¾?ô·c@S{pØgÖz8 ·=ÀáÆ“™£9èéfúW×ú™l¸õ¾3ÁwæKÏAtóÚéíÉG8ÚL­×?ùwq¹n¬ð zg¡è[OZÇ"2hï,'FYû2·WJ ºÓßu§.¸§üÞÀ L; (ç´o\Ї´ƒwÖC;RÔ'È ˜záw–ÛÆ[ïÀÑ–ðÀ­¹aêrxÁCU.ß๠ˆ/4TÚ;ówºñ`f£"â‰gn_ÐwðâÔöñ¼ÇXvè«<ãÎǦ?¨Óµ[4 carLþ*©I÷_wÿ endstream endobj 4968 0 obj 6348 endobj 4972 0 obj [299 /XYZ 39.8400000 767.059999 0] endobj 4973 0 obj [299 /XYZ 39.8400000 484.819999 0] endobj 4974 0 obj [299 /XYZ 39.8400000 767.059999 0] endobj 4975 0 obj [299 /XYZ 40.7999999 397.459999 0] endobj 4976 0 obj [299 /XYZ 40.7999999 397.459999 0] endobj 4977 0 obj [299 /XYZ 39.8400000 484.819999 0] endobj 4978 0 obj << /Type /Annot /Subtype /Link /Rect [342.240000 538.580000 372 546.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants >> endobj 4979 0 obj << /Type /Annot /Subtype /Link /Rect [235.679999 432.019999 293.279999 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums >> endobj 4971 0 obj << /Type /Page /Parent 2 0 R /Contents 4980 0 R /Resources 4982 0 R /Annots 4983 0 R /MediaBox [0 0 595 842] >> endobj 4982 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 4983 0 obj [ 4978 0 R 4979 0 R ] endobj 4980 0 obj << /Length 4981 0 R /Filter /FlateDecode >> stream xœí]K㸾÷¯ð9ÀzEŠzA€~LÈ!À`È!È!ØÍ&Xì.2É!?¶%Ûݤ>’U,R²[3ÀtiQd±Þ¬Ç÷üò÷Ý?ÿ»ûþùË¿w?L?Ÿ¿?|>üûíAµ§§‡Áó+Æ ÿûÃoß/?ùòüçÃoÿÛéÝŸÿûy÷׿~ü8Íwü¯ýÐùeüEi¥ûÃÞþvü×Ã_~·ûí°„þ4ïñßïêV·ºÓIëøvyTþ¾}½¬Ú™¦Ö½Ù)¥ëlàøÏ?~:ÌvYÆ~0Ju­éªèYÿ¦5µÞ ]»gNgkq3©Ô‰ÝÊLt\‘JÚ™ªLç‰ ÷¦ëÆMvéð:O•:Qg„&:®H¥mí y<ôFµ~ÕuâF¯S¥N¤‡^f¢ãŠTÚÖ&Ð{¦bƒ¾6ƒ ·¹Ì” 0cj™‰Ž+á6x&6Ü»‰¥Ö¦JÝf'Ä›ªmd\‘JÛÚòÎTŸ£4åhê ¯À7σO_¾ŽÚÎןC'•iüñõׇÚ¾;ªFñõÇÝï«J?þa÷õç¥öiû®9}ï4R5§³7õáãQûšF ÑÝi¤¿~µµ>P•ý 8Yõ<ŽÄ¬Èy/cñø¥O#ݾÆ¡ëHGŸM7h¶ ¾§útiÚn¯tóv¤?|úzÀ²+Î(Wk4£8 ûããlmß}ðËÃ’> ±±ŠÇÆãÞ££{æãöÚ½V}4°j8Â8|…dSOJ›œêº;¿òÅZƒ6ó«4Á}ÂZÙ߬o¨qUíÛN½ã'úÉ^òx€ý¾ªö=N¿Â´ßW½ IΜffd@85ú›£í ÝÖ¿Š×ˆ÷5±UŸ×dïKâ£>Üi1>KvH› F0ubþ`¿ÏÃÅûØí<üבp ¾änØ^|á÷¹ìÏéjäJŸ‹%Ò1«Æ yq6ˆ;¯q€ÅY<~Æáé…Α¡¨x –E*SŽ<ž‰xôeÆÎ#OÂÙ{ ÚpFÒTÊ"z ‡H$ŒxX¹tp¥…B#žû°lnÇỎâÈ1d–bÑð@1€Y”Ïd—ø}œf Ú"áðG5{Æ\©ávð3£‰3ì+Õ¼WÚñÈbšWf{²ßg/ n't­Iõ?£ ZÇÊk¦X—k•À3ôœnØó9¤~Í þ³-:D ßQott6Ž~!Ë,Stßà³õ+£‡eôñ@Šçô.BôCìÝŤáðWŽFÀ9ê+§àš:$Qô§Ð{e.D&YPpÕCc±N— 8”FØ4ÖÔ^íŠ7w1ÀXÊj‚â¢ÇEϹl¨y¼ñ¬“#ÂÄ’GŸöðR…',³ÔHå3,žÅC˜qz?.™©24 m‡:R@¿ Hê´­z0ߑÎ'Éa¯ñxžbàs©mùktÅ(ƒ‘È…ê*S£hÝnt¯š¶9ïÿu¢ÄÄŠÎŒLŸ™ Ÿ©à{ô|OGZ8bЈyd̆w W=ÝmÌh8\[UÓWí(ÜO…G>ÁÙð{àÚ*x¦žà٠ܦÓ.CM½ RS­èð­gâ¡@Y¬€¸\CŒ²KæžT[‹Ž‡Ï±©êÂs+a…׆ñÅCÏtÃTÇáË5ÆKÌË᪠†¤Œs8¼ø¼6…y9–µ˜Ò±4¸£á 80˜¬‡9àg°€!Šq‡srpÕ BÔƒUp6ßÃ8íåwÚ@.†1ñ6aíáUrr*à¹ošs¢Ç?٦\\r²éðó©œFѪ°õ†Km†Õ†5C‡Ç: Ã:ôhp?xm[Ó³†¼ioí­ 5é! y8²Q 4r¬CÏ ð3¢eÁ ®­”â჌µy쀂övkú0þoô¼Ñó:èyq‹_˜p¼%¹CÛ…©iãwXwXÞ&ËÖÌí ðÝCIžÖ·aLÚxÚÆÓVÁÓîÍ{Ëáƒkæë·Ë»ª C~ーC>ˆïÑ„5¸›äÞE¹¾Äí¼H½5p{×uýûÎÝÞ‚VE2Ðò¤Zr²»ø ž"žB¦s|¹7BPu°HÉò‰„¼rï ª¯cq3Å <œGÆæ[È /d»"Mv–­ë¬n¤Œ¡q„h NÙ?JAÀõÕ“!Ôgð€À |ä‰*ú™7H¦À—#«3çfI€¼xÑ)¤ã…õG)&C¨‚’§ÌWkê{m †®»T !—@>á*)©í„dËôrá…äUŠÏêÊp¾ðÝtâ¤4šŒ¯ÚÆ:«ƒãŸ,·à´Ï‰BYÍ)œ&§5ŸÙ¦íÍF¿"«f%Éâ€bl;/¿¶üÖûða9U’!RÍ/gq¬’<³t¼¶±Y)ölD´‘-›E.gnüvÜïi»ýÔù­SÝÛ–èüv\B€qÜBç·BåöX=@0ø‚ìa}Õn(•‡âË­•*]†ÑR¤¯êÑ'bü ÆCÌTÌ÷Ü«6ŒKñ­7‚Þ«Œ;j{kG®//¾ ‘[›ÃÓ–ÆVŠ5ÊQfï+ XVÍâé[ñ½Ãbݧr·„N°=ðÒdxjÞ{”¤V2¸º§]N²$}Î>€ÓÍÿU¾8:VDÔOi†LÐn =þÁ.H|_Í]òDDQXMŠ-²^†I‘D™1j}‚nSÞÖ«¼åìÛ×·¶aC ’­­M¸ŒêÚ0pN‚¦6ûà¦Ä]žèìÒgžÒÀ)µì*ÕëC1¹ªÌ!FÒ^"½ŠQt\ÄHq1{ÜlSj±omÁ®di¹u<ñlØCß}îÙØÂYˆ´éÁk”Ht[@Õ?°|‹ïSº]sTýø\³¬­–Xñ7˜/²8&ã †c¼eæ‚^¢¿§£iÊÞõZ,ïÝ’Ô~)ŠÃŠm¾õÝÁŸc VB®öJàb+Ç…$ÕÛRÅ9‡jnÁðãQÚ¦Ü5%PoÒ5mQÊ/`m^ Q-’Úø4}ÙÜžGfÙSˆõŒ8k4t8mÙ,To*el0‚:+r§Aà"ñÇç©i_¹@Ήs0ƸáA_ê*ÙîípùÎ>uSjs¸ßì·ŒhÑïû¡z/¯§òØBUõù®ïÓp¶Îö ñÂY,üêùôÝO—•s#pªT÷ˆ¡½”¼‰×›6—ŒLF<†‡‰rÒû%LŽ5*S©¡}KÄaÒ{:¬)uçQE àƒ ½8kn-Mr‹ˆ<¹$Ø}ı€Ã”–`qˆT.Ù‚I|¤-õ/x$%‹QøƒT~‘Q6$.:n+–NÌéÕ-®Dë¡mÁ” ˆ•plàþÜõ~ùð"رÄ(y”¢hx¤,' I$õ5Åj\_Á<†HDÆÆ#< ‰štŒGÔˆJo+ÉÍÈÁê)ñõ [üúfËT¸áZºÆ÷ú‹“$–W—ÐÛ1r*i{ãgØMAŸL„·8ƒ[}º_Î ŸS&ì³¥üeÊ]!hþ)µÀD$'˜øÞÝîVÑ«\ö«9¾ôc(G+,ЗE}Óº^™Hӌԣ±Éç£%³RMdB0 {ò²K*ñ^&õw…¨µ¥âfa[*®3»¼iûÚ’7ÂV=Äâ-s…Á §+4l±òø Šqñ@œ„úW¥\«‹»½$Ž‚ ¬eÕKT2ßXÜ„ª: „%9xàçÆgŒ$¥ò­˜´–í’VƒÀ£¹‰4ùeÚYzªeJ¤ ýL?^¤5‚©õÆŒˆÌ(Ü€áÕP‡©CÓ¼û`‰ Ç%X'-™.B¾”¢˜×‰†v‰TŽ(Õ‹BĤZ ȼL‹oêãd›ŒÎ±æ:¤ŠkŸ@EÙ‘ßÀJä$l4cNïÙ€iÎWï“5>gY<ÙHËɘÕóˆ7g|ÃT]ÕÀéñ30U×ó \›v`agõœMo?‹_ƒSƒMþ.Œ]k¡†Ëà`šõÕœW~ÁîÓ'±úâH°r‚.o<Ûß°'Íl\1"W=.+FYC™bþ"-8åäSÂ÷®)Ë4½- ®Ø›ê_S¦ŸÁv7"›»ÇÛ2üoK2¹ÁÛ’= †tqóI&FÌÈÊ–*¥ÏDaíB‚À2;å×WZ†î(p×mœ0ïKE©rb‚eQ²0_žÞ«„ì@B34ÿ‹#‹5¢óç)VÆ¢Ú⇎l··0ÇcȉnL *ÈRéxEµ36L’˜uÁ¸yÓ˜ß.å‘u̳™£÷UUÃù•#k?]™Vï©Å ‘séÌ}ר#-ýŸÐ3ê BìOh¶É!ßìµSšm”ëªÚŽ¢Ùî§»›7ï™øÞÞL¨w}æŽ*•i”¹”H^_¥W³%¤JåÍ]^Oí™Ú½)ª4!"*l»Ø,ÙxŽz€²<ßã—4Z‰ëôcÀU$õ)sÅ숴€BÇ•’ûœRKi6?j,i’â”q+r§=fGIKg¿ÁzkÓù%ª´õÎ5keYŠFÞ”ì-\‹VÉÑzWCc¾ml¼WÑìiŠÝÇ&‘ã˜ûªý¾ÉŠ™É˜’_çËéë, ~Ež×Øk°fn[„š³Ö¾/;Û«›ÙS4 N&ÇS’/ÒØ'ëÖfÏ[*wéTîœÅÛ{õåšË„œúí9æpʈ›*„81‚®,:Ïr´ÉÊE;®ŒCq= E• "…Ñ ]’SÉGBøD”ëJ(Å*ƒ§gˆÐŸ¡•'÷%A‹f9ó’RÖ%R–` „úbŒ”mˆœéZ*>ø^ëŠÅ‰¬û¸çAÞˆ°û”‹\ârt*ì Op¦ˆ³5Ëï292t‘EEDîû¬©M¶4‘‰Äg£‰¶ªÎrQª$PUDm5ã{õ~ <¤FA‹ŒÜK <™þB"‘CøŠg1UIĬÿðéW®Ž'öElÎàÀó=Ú•ø ±™„f ãT4fFFãà0Æ+ªû.Kñ"†—ˆ«ØdW|&˸ïEB±;N3Îzü…g±I¥¯;A :°¦ó“HH÷X "5ÍfXÕ .ŠY;(67(ÅrEƒPaùÂz´J‡}¥¬û^<²âü…< J!»"u¹$±Pbýfj¤‰—Ï+á,(õ€RĨˆ_† KNBß9ƒ—›&Zî$•yÅB?§ò8 ›D¥g¼£N$•™ yð;Kö{-nL)†Ïg\ªdTW´Í´ù}?T­ß>¢È+|µšú\æ“°=½[º‘ÇwÍ¥…lœRáö(°9I%:›jálƒ÷S‹!s|;Ë“ƒ[·Ñv÷g{†Ç§¥álð=ø„9§¥!VLÄ-´Ÿ`½¹Ùš+¾þî¾ãpèÇ/L?~øÕƒ).ŠUWûìE2ï£AììÛ:lc¶§•jDzB»ººd\­m÷í|ÁÐÁìƒOwûnÞ]ØÍŒŒà¬ë½,5lð;™¢- çÞÓÃgøÌˆÔÞëª>]Gžàl#Y½ýä~wò@Ììð=3©0s# íc’P´g¦£ì}ZÛ‰°îø»nTwžµïëx€qgÂå<£§6v•‹ñw0d=¸1eJ œ£Œ½ð=ú >g›¼eskÃØåЂ«\ºÁké]êžñÌøž¦ß×£1âYÛ+z>C A q`cÞ1‰ïTÊíûªÝ«£÷ö= {ˆ³å7©ŒŸ%%éîóÃÿ/n•n endstream endobj 4981 0 obj 6322 endobj 4985 0 obj [300 /XYZ 40.7999999 624.019999 0] endobj 4986 0 obj [300 /XYZ 40.7999999 624.019999 0] endobj 4984 0 obj << /Type /Page /Parent 2 0 R /Contents 4987 0 R /Resources 4989 0 R /Annots 4990 0 R /MediaBox [0 0 595 842] >> endobj 4989 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4990 0 obj [ ] endobj 4987 0 obj << /Length 4988 0 R /Filter /FlateDecode >> stream xœí]Io举ׯ¨s€V“IQ@0Àt» ‡FÈ!È!è™I0HâÌ!?*kq™ÔGŠK©Ênvµeqy;߯úúã??~üüõ?ÇoÓÏÏ_¬ašÿާ¯ç¿¦iÅø±3ªýéßñÛ÷ÃÓñéðpx¾?¸~~qú1<œ§üýÛo‡ãä‡ñ7_?ÿeøô¿£8þyøß¯Ç¿ý}øñÓ4Þé¾L¯Oþ=~à‚ 3üçüÓéá¿ýÃñ·a æyÜÓ÷­ndiëxZ^åÏ_ç¯¢ÉØQ*i†Ïœ‹á›Àñߟ¿ £-ËhzÉy§eÇ6Ú‰Ó°ÐǾÓÇV2gPgoÛ†â‰)¦U–žWÄÓ¶Æ™ìüCQA¯gã6¹L…Ø2Tê@­hó tZOÛÚzÏPdз·Ù¶É›‡Jh ûL8VÄÓ¶6ƒE½6©ö©çe¨ÔŒîó tZOÛÚ z<ô}ÏŸ·Ù«Ô}Î#¥L3“GÔ?¯ˆ'íl<‰ wÍÛ‘³;WoG‚k)î‚gBàiEœ`óx³¦5Ô‡ÖúÖPoÔ~4Ö÷J=4_‰J¯ô” %‚GÊc™”Õ†Ãóì\‹óÊàznN‹ÂyðéÆƒázW11{2*J\Åärê…g¯|ëéÁb$Óë×€ç¼QR›a9¶™$9®Ò1t#¸±<¬Y~!G))m"<û…BÓˆq0Õ´Âp¡\J~d2ÜVvá¬h²‰VFwöŸÂ¥±ÎúÓ‰O i‰x ac/À…ë¸ÎÝñWóµ3ç''ý øIâÞ^‘ y΂k†„åî78:¦_îЄ½É$ék(Æ£¹@ìå ‡‡Äù"F CÍA0Þ IÄŠ\¢ˆuû»Î-ËtÓð%ÕA/,}àAƃMUÕ¡ò „°züÎdâx„žœ¨¨1=³p·]ï¸;‡ûkm5ãTãY™‹yÇ/Oú èJQì.ïÕáyþT/&AÖ@Jv§qÈ&e$'–qwÄßžTqˆóc„yP\#ôÌØ . 1×FÀÃÅ„eŽyæpG¶F˜3™Q€†ÑvÛv‚|ù#$_2X°}#f#ql å°Å IZ‚5ù.ihÆx˜YÅî¤ëZßä&_;ÏôN[”ŠŸ”×­n-ñæ˜Ë®iaéb’¤ˆÆ"δBÂl»ìz×"Œo ,,'0þ‚KË#ÂìQå8¯hÆ•ešcòD•¢'@ÜCsÛOÇØnöŽm—-d޼_“BbC-Y’KôŸ±×(=a³Þ˜°î,êaà;=œ‡Ï&Ç(y<è¦}ÆÏù“‘xL#'ÎZ1`ìÑ|σGó¬àΓ-â2”_$pJ ?»ÇÚÁ|ˆ¹Í‘ –¶y#¢׸ 5¬°²Ø_e\kÛÕƒgíŸÂ”¡†ÂAG†£!1&ð=šg¿¶]Ã(ØÎÀçÊ!* 1d q–”س_D¶×%œÊ2ýY|މdR0o0Éb”Æ@«ü¤,Ÿ¦Äx Ef(F>|'æàâaGÅÞ¤íÁ)’«í=ÊIrVI²}«¨´?œÜ‡=I´„ôMÓÝq#ež$ZBQGÍ4Q¡EŠ„²O*=NÆ©¥yKÃ0ä ©È¸@ƒ4|§f:ê (çY!å[OÀYѪÙíåx˜%#,%]¯ŒaHŠü؃xNKpÑòK=º”l.L¹RÉNHj½‡çÁ2– I÷ŒO1ÌЬÔé`¢ †õ+þ ކ¡(ðkF¿ƒÈ ¥¬eWYLS<˜Ž£4¬´²$ —Éõô¸¦‚·‹ýˆ|û+7Þ"‚ü³Žò–’K­‰³Ú†ùRh<•ž³lUK„÷!À_âúÇP¤’Î~cmíͧÅÑÚ¼Þh¤±ºP/[d㉄„“û·GœÂvõTÂåx³I®%­æ¶µå_Ž~÷û«19€gé(J社—Émˆ¥¤vf9ïŽÍéÕ-ÜãƒkK>àÛŽñmÐ ¶ºÂO<÷^ ø7¤7)i|r±n}ÓÆ¨+v0­Slœ¬EˆGÙ÷F¸žF¸vüºá¶ ކe>ï¢umצ´®õ4, =©³;Åv÷æ4Ü…ˆu]'Z„8ñ8œRÀÓø¯€ÒzÇO”„ò½gÜâÓ2~®@@ BrVBn¢4’ÃÒÁÜV·¿Ã£aèPîbù¯*J”—ÌmJI,åy<]RZ{¸ Ó%^ÆjÊÃLmý®yC]ä÷n¹4‰¾|#þžY Wó©ÌfûMΟru’Àaíe7¢²d~‚‹Á[*¼‡¯4D¸Ÿü@Çq¸á¦Ë}y¾±ÐV6Ï'\wMÊøˆd7)Iy“°Ü:ÉWGï&¦¶¡æö> ”v”Hoí®+Ynæ!…´ ||ÃOBŽÿ’á3aÛÀBvÓ5¶gsF‡§  dk­0ᥢÝBöÎb‚Q##Š,­V²¦Ä÷>ÇgŒÍV¹")€ë¬È¬Vµ~Ï—ÌÜÖ:¦ëCÖö ;:—©ê9È%dÎ{É‹×ûâ¤'h¯$ôŠ,Y¤Î•M¬N‚#‹4 – ’Y8%µ¤_îr½·æ\Ù¡«­ŒÄÌzO]ÏŒG 'õl¸  E{‘ŽÁéΊ‚:CKGgPrŒ ©oµoÊ{‘Uëmg[I: Ø^©ê!ZG5d){Ìš¤žÅ´Áê€&zD&O‡µÊ×=l>emj=TD{EḦžºwU¤œb]·+¨r¯pŠ].g¡4€‰PÃÈÌ)Ù ¥··¸î™O¸yl„2Žâ 1—z–ÐU>0ž„ÿ7co¦Àe )8BÜn°”.^štFT¼ÝœŸÅÎxÏö¨u(¥tß)tA!ÝÄUŽpa—Åu]‘V©¯©3Xaíx)ò(s(¡há˜4í÷P# Wô& ckÂK¸nÂK8&s•íß+R=©auЦ¥\}ñz ­ba¯fB¾^Ï•ör\Ø›5G½ba¯ø(¼ï‹SRÊ,%.ðƒx”ø ÜiÅ=ÈøyÖ‹—¨hÎçz™Ò‡ÅË[ç)ù ]à ÷ ëЫvN’Ž2oÄÛOi›)î¶87lÆp½T ×2p6VŒ5KO½ !Õ¶ðI¨Cz1K½2ƒåãî[b£&ÉK¼6läá^pmžw.Þ™#/7yê¼q½3î GƒkSn—噀a)¤°AXéZÆ={‰¶»7Ro&U¨9~Ýỹö6©z¦6$Ågíª—ä@K0 ³\gãÝŒ¨ËÉr#Z4uíõ+,qœ¹#!f™’D/Ëš‡Šq¾µ, âM0”²UyDªIÎ R·p]õ³0¼ 2¥e2à×Ü,ñ>›Ûèê·&¢Réå3¦£û»­eî,AR†Kç%\c]Ò¥ÚÇ`x{x¡»Óö{b¬•5¨…žó?Þp:™zø:> P€vúƒéÇ·ï0»øa/øyðbÈûjµFù°ä¶=×Í3›[¶îG(jÝèuÚËÆÚhKˆ®éÖ/:ìVžŒLÓ¶èW¥="Áf§µy |§‡ïŒž¸N4‚µ§G/O>ÁÑFÊ=ÿÍüÛId¯ìð½3 äµ'íc∸w&ŒÅìý¼8$êNŸ…âKŸIçët€ig¢î¼#FXhæR<¤ Yí@Jáw0õÂy¦d™µwàh“y±¶6L]/x¨Êå¼–ñ¥0„wÆy”iÚQcmxâYÛ=šãCP@ÚÇO0Œ±ì˜âó©œk Ó ?h_³°‡é XægýRrjÒãÃáÿóÃó& endstream endobj 4988 0 obj 3888 endobj 4992 0 obj [301 /XYZ 40.7999999 372.499999 0] endobj 4993 0 obj [301 /XYZ 40.7999999 372.499999 0] endobj 4994 0 obj << /Type /Annot /Subtype /Link /Rect [202.079999 689.300000 312.479999 696.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays >> endobj 4995 0 obj << /Type /Annot /Subtype /Link /Rect [326.879999 689.300000 392.159999 696.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays >> endobj 4991 0 obj << /Type /Page /Parent 2 0 R /Contents 4996 0 R /Resources 4998 0 R /Annots 4999 0 R /MediaBox [0 0 595 842] >> endobj 4998 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 4999 0 obj [ 4994 0 R 4995 0 R ] endobj 4996 0 obj << /Length 4997 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Ñˆ,0ãÈ!€a9,rf³,vqö¿©õh›ÔG‰Å‡Ô¶ÆÀ¸mZÅb±Þ,–>þåñŸç_þ8¼{üÏùÛðýîñT¥*ûçîëÃË_ðº¨xÿQײàM÷ïüíûéùü|z8=´ÿ?Ÿ˜º<8|kÇ)z€|ûýô±ŸüÔÿæñîoí§ÿùù¯íO¿žüGûí§^÷ßOu£º¿õg¼nxù©ü÷éï:ÿÞ¢P_àvÿ¨”,eû7!x®ëGʯpä0F*åÿ çþϰŽ@ JnqéVUpS´¹Œ|}j9,9¿¨z\w )ÂàÞG¸n×-îáÆ­#pOJˆ›ã<äË’ÀåóeTiÂR[j8ò‰ 7 é¶{™©ufË1÷:v÷ü"Jµ¸©£ìIT©Ã:i‘¾~\qŒ¼£‘ë8â°gÐ6•ŸýýŽ-AGc H¾Ö·hí‚w¯DõD(^’ƒ¬)š|À:‚Íi€ÁeopÔä8÷ÈÔEÝ”ŠKÛlצå•EÅköúO{Ë+®déI©‹˜ï9 pCã÷&Ž˜ôŒ­ ÎêÕ#½â…èYŒP›»|ýÅ$1>>l2ÞŽ&R ¬•aÔ¥ñú0&xbw ¤‚Œ›Å¢Pm9¤v½Ëí±³‰N̰WŽG«Òz½³ôn2sÒmdˆ ›±lJÖXáKÔT~v?Ââ IjÛ™ðPצˆr «¹Á*; âYo{»-"ü•´)ÞÈÇâQ­CODp¨Š-§Žpij‚INW)©ÑÜÅÇq" “倇P/Gn“$¡½QÜtMnÊuH ÞËÅ2oÎWÝ#Ô.‰é$û~Qޤֳ>EýaÎÇÖ{ÄÍX­ãª<¼.ŠSó$Ã'ˆÂ PV=ôm¦ã&ZvÞC*ð³‡ùòö`Ò©’I‚±|–inª‡IYŒP+\]Ì!ðÂ(ÛL(FÊíì­¤=,,åèd¹´#à ŠbD<¢”§qÓ_5¤‚#%{^4ÀKgÖÅx¶N70ÓaÅMõ‡ç÷š˜ZS¯°£èÆÃÏÏ\Š™ÛÏßz&£Û ³›ÜuòqUtS}?ÉæÕ/~;=&kfd¶CÁÙ9„Mԑ╱´áÖ휘+ISTâ>¯×FÃu`¯ã€¼’ÐmÍ+IЪÜZ:$”ÕÆyÌKÙÎèäÔÛ—fÑÔøX Bv?ã²{8‘ í8˜3±š°Ô!ñm ô‹Y±3€”$¥æ§/.ðà‚5Å1Îb£ðVPŽn}QHP¬M?ýÎpCòjqné–•CŒSÞiz ¼›7>õåË)ÊhªØµ ZÃ.2ó08°þ^λ1;>•„üiÐý›´×øÄ×XÚ~¹É—*ùk|üZÐÀæf6§q´ !´~«p;&Ü@‰Òî'ZÈ·bO8[ÄÇÑ0(SËGÜò.g“:%¦Y¿ì]ß´NÞ å}v˜‡Ù[øº]4tÛ%³y:ç¦éÙâˆ6—=jB÷è¸N†„ 4šâm¼Û*nõ(ýP$mfŠG}KÔúË,v©Äú]Ëݽ1w)H”ë&½…ÅçN’å¤D½–}ÜÊÚEH—zʦož:ª¶®ûXÁ/ZÜÇÛ¬žq`Má$ˆµ ì=ljÓ%®Ø0†GÚïN¼âg0 ðmÌ£Q+É0NÌhصÕÏQ÷·kÍõÖRëÇÈŠ‘<: ‹²yØÍ÷4rX{¢,ÀXÀ1!ºrðÁC[L·¸‡‚$h„õPÇ’8Šƒ÷cIàyt»=´5EÍü}ÃÞ5ã56‘½ìÿͦ9RŽi-ÍåÿÌõ½õLƒžÒ¬*ú3ÛÐúyXYôÉ«5#xž!µP‚ó°ñ$„›ÅŒ£õ ù,]Tf”÷ƒLT4¯ 9+¯Fn/™A<âsFi¨M¹½¥º‘r¬í‘2ÏýNµ¼…ÙßÂòæ™.J'nJ™19Î+’´‡Ìòrç”§Ö†ÅÙ¾•\îÛ“™”ÎÀfY¼½MGs¥û˜®<ÅÉ„ZJJSª]4qÒÕµQNøàúcá}„TtpEÆô\Ô&.÷ìýH³Ë´rTÖô×Aß¾²  o®f†”Ô#M8úwè˜êr¤¾ Ðâz8jæ) 1­q›º}ðÿÔ’Ô|s9åfánJÜ[Ž}„8Éè|t¹¿:³vsïÀj˜*ú›òUi¸ÚJj>vnD ×…6ÕrO4=3Ò›·ª*x3ÛŠTÊBõêÅôdææ©á3 |¦÷\4/xYuCבÏZ¯=_þæ üÛÁZάð=3þÜCë”±ß3ÃŽù¬}Àí"\×}æ’í?çæÓ>À¼3ð³žá=-Tis<äLYï@N:‹ÌÉæ^8Ï *çžÐÏn7Ì]–,8¸Ê–Œ‹FrÉkÂ3ý<²†¬qàvæÁ{ˆ)È!ïãLc¬;†-TrëºTëb¯EØ!tP-³¯/yˆiIϧÿWÈd endstream endobj 4997 0 obj 3535 endobj 5001 0 obj [302 /XYZ 40.7999999 339.859999 0] endobj 5002 0 obj [302 /XYZ 40.7999999 679.699999 0] endobj 5003 0 obj [302 /XYZ 40.7999999 679.699999 0] endobj 5004 0 obj [302 /XYZ 40.7999999 339.859999 0] endobj 5000 0 obj << /Type /Page /Parent 2 0 R /Contents 5005 0 R /Resources 5007 0 R /Annots 5008 0 R /MediaBox [0 0 595 842] >> endobj 5007 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5008 0 obj [ ] endobj 5005 0 obj << /Length 5006 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀróÑAr0°‚o6Á"^d²‡üý´ÔlICêc“Å"ÕÒhðŒ‡jv±XU¬7ßÿñëß·ÿümûþã×ÿl¿ÛŸ¿nš]Ó5Ó×vÿýîürØ)9ýÚíNšý×öûÍËöeó¼yÿ}Ùˆîð ý1ί˜&üíû¯›÷ÓË7Ó_¾~üóøÛÿ¶rû§ñ¿lÿú·ñÇOv¾ý~lÓíù÷ô‹BãÎÛþkó—ßmAóîÿ}§ºNvm—ÇËñQqø>½¬Ùê¶”Ü !G8ÛÿýÇæçq¶#;£…è;Ý7ѳör?íøÌÖôÝVhíMê­-rªÜ‰LÓóL´‡Hä-M4ºOEF½i‡Ã2{;SfgÊEØÐ(Å´…#D"ke3âáLT¼BvÓ"ûl|§ÊH¦‰ö‰¼¥Y̦"£^鉳M›»Îy¦l„i-x&ÚC$²V6#ÎDÆ»6ò°È¶ÏF—)]­f’Y{ˆDÖÊf¼Ã™ÈxoG•†ïóLÙèêÚ–iGˆxðg"ã}Pv‘"W«9M•;‘á"ø=D"oi3æñTTÔ›FXÁ<ªy =M•;‘Ð<Ìs€Hä-Í¢>0õ£9ÅsºgÊF˜4<6Á"–ÓÕ›é™ÅÈ“'#ï%ðàÓ·Íû/B«aoÓ~ûydÿ‰wÓoãbÛí»½±§ÇÑŸ¶¿o¡ÿ°ýöËÆìZ£úv²¤—FšŽH8ò™ðŒA#Ž`¨†ú)ѧC ð{#JÁŒƒi=Ÿ¿TYœÆºöÍÑX€^ë ÐrGÀÁÇUPÅ ç·~*ÀèæŒ¡uÚ²Y¶çd01úàîW¿k†µKÄÝNŠÁùè´µz§§9Î6OŸiZ8¢¢âð!çY"VŒŸ‘ŸãÑ6}´Ý)9ˆW¸àÏ…^~˜ »VwûŸ>Ú¹À÷ÉOîG=$õé{àÏOAjpéR~YÞǤ¨ªÇÛç ¾ ýÄë´‚sˆAɃÿxùO®w0#æE5ðƒ*OàØƒÇLƒU¸·¤¨ #ÂoZ}Áï‘Ø®O}ÍÆ^i˪*^•–GB6—Yv!wf^ôíÍôu" Fšùhï[w¤KF~€ÏôŒe2¡výt^¹Ç±hv“„Ž ¼GY/]e×ÿ8Û4p¶‰4VïØié@-> °G¶š–ãÌ0Š¡n êâ6Æ šÙÕÒ Ì`š×‹¶[%ÚùpveÁ%åê *¼ž„Õ“»CXôŸihPIÆ#ËÚ+V̰îPæ°Öš _º 5FϦÀo«ˆßs ’›OѬñ{ ÂYÏOÖ×\ŒGR6ß3ëX,1ü>Š!ä„­¼O.N’ö’½,!Òš`TU’Þ¿'ÈM’#ª¼®Œ{°ú.¦#Ævì,aŠfCrÄölB±?|w…-âÛsÈП„⪫—1¨¡¶¥…- æ:¶6± F€ížBÝôbfO—‚ ×÷Pìb ¬ùJ‰×ß…µS¬³‡'ÙHŒEJ ÞGJbô½`/S ó¿'AiÅ›º…)φ©/àÕ¬•…é ï\O¸?×÷ìR¤C­ý‘8éŽZ‡! IÈ ²sÁ;¨{ùZ<^r;A3’ŽÃ›ê‚Õ÷åx1¥8 !¿ÞójÒr|ïÁqâ9•jÚ­œ#P1‰ò|Ðö³Ê«­ëçÒ¥PPÙò‡€·¡dIŒ§â>s<RSÜ ”²oƒ½÷=r>ؤW§æãñú5¾ÍŒµ|  ÉTŠ*KBùÌ t©nètžàO­ãþ®%º)ÙÊ« È1´.=]Ÿõui&’Z¹«Nc: ${!rLL aÄ„X9ou)K`&a¡É]Y~RýàPÖZM‘þ2”|§î;,ˆ‰Ìžû*¼÷e%~Ö…Õ*Ië½”ß9ľO0u—s¼¤¿ÕE# ×æ&Ž€Þ;ªD-X/ç. jÚ‘¨†'„òº+åW]ÏÀñY,ûΤå$ބ̪øzЈ Ó•"D,Rʆ)fb‚Sþ‘üU*ù+'g8]ͺ Z+Zê"rÎ3*¥º.FOÏ&œ‰EºP°ŸÂµlüÉâiÁŸŒ³A™öv5ø¾7DR9FB¨‰°´è¿†ÃÔ+èÍFç‚‘­s.à½d ÜÐ]Á´S&Ô§r)‡Åf¦Ä¹2|> {Q$¸VËiÞTF1 8½0¹PÊâu ¯ï&ɯySÕ{Œ¬ZPÊ*Ûç$fýÀ5aC<Æâs.t;ìý6®ßíPàn‡Áý O­í&tŸžyB³Qzâ^ƒ¤ž†ÆÒˆrS5Æ5ÆÁRçÂKôœë 7tÇ{¤ÞLŠ„©Yk.M‘ð™ÅÒ”$®?Ò`\Ã<›¦hó¶Ì…Eݸe¥a(‰Oy[STɵ´’k8¶Â}3’Ká.W—\-¤å‡äzH®3é$QpA&¥•Ià=;6P]=igŽ×¼i')ÍPjéioF¦=¤MÚø¯6TÂÍžªJ¡S³•7#…´¸E)¤!F5Ü…Û”\ÌR·©£Œ@z#éO˜B´¸õŸ»°fh‡›ø±µ`Y-šc[¦œÐbႯ[Š5ÖJ•/’ðËZÔeåGr4w#ÅÕÖ¶»áR6ÅÞØrËðHBÿ>Rü†Òlpo|@r\»zË •v‘ÕHâÚÈò&]?}ä4']s¯ŠßžZ‡zÎrí;Ë•I”…³*xK!ý‚R}žT罊·pª«ÄZfWiÛyø‰•e$ $p=ð ಪb„Ý7Ùã—rdlõk;£à4‚ ÝZ­`ÌñÓˆ´A^唥¹«{5Š,\Ý…!qµ¿#†ãV5¿7€WMpp¶?+Ù³í\_׈õÜP™’YX¤ÅÕò$oÚ»¡󤞳ñWÇö¹dõË_.ì."]Unž´¿ŸÉ ôEy×¹¢ü¦ê3rô^BÛ‡B}8Î’©H‘ŒMŠs$¤Ô'èÇ͈"Z%V6ò®Ôµ^ð²^1ƒiÚã¢*%`Pïk¾‡”o·:®29$pO&!å4ŒDH½ྦྷÔáôÎ,b'GQÒÀIeøÆIÊÍ®+.‚ʸçÆÒÀÜS…ÓT IŒ¤×·TÌcšaX„çÁÏ¡õPJƒüÌÍÏŸµ— š~q <Ó 3À.0½•(üÀP×áZÙ-ÂóàÚÐz(&®e×ÄW\øé[qŒb^ ðá.{ŠRþ‚È)9ňá ήÁå”&S”lÍøP®Õ°œÛ®bA qhïYÂMœ)«³8êsLIŒ§\[àOâ½þ’ö *’”ø†»GÝNîC²@Éó œá>Âë÷^ae Šõ#•šÀÕ„U³WpT﫳[­¬¼[¸)RµÝ¢4»[Çnõ¢òn­ Ù¥ÁW…ÝZ°™Ô±/OÊÞ²*Z8?a}ýN;.'ØN8Ûb&'ììŠÍ«„ÖWr¦ë%ÜÏp¼THÑ œfªï¹Î«ÁuÓ¹²¼¼‰%¼óc5½«—} ÿ`¡+æŠ$ÊóØi¸bgùêÐ[:ü<”†"2¾Å‹$]75nÌûXä‹Ú.Ìg\<ƒ.INì/Y>/”#Ô™µõøïE m›JHà™„û‘s:ª$pZ‘{YUFÿhò4ELs*Ò*ßZçHo|±\d\à™û7™Xšè­ç(_STG*ãp VÔ —FݶW„TxµžEJõV|ÜcRbõÃ2†KVýO·G©}n’Ål±Ó¢L›†øŒš€ Œ¿Ó>¥ PNïÊyÍ{)_ü9ƒ=GçwÅßÛ—‘ GzÝÀþøþ#@á>k4'Öx2GðÑåK³»­—qÉOoD7 È­jެeïYïvÝeµÄè‡ßiOd¿ë] 3íIadB´R;iÍÏŠÝv×M{ìòò¥÷ 🙆^îds¸„ý4òg›øàü/Ÿàg-'^XáôŒ_—FZ‡eð´g쎥¬ÝÂv`€ ªÛÿ.[q¬|jáûz`Ú±t ¼gä„‹®ñ)ÒÆl€v ¥Øú™K¼€©¾ÇÖÏ\zÎfOK°aêòx!@U>ß`XzÄ—ÖÏŸöÌôžv˜¯§ Àö½ï!Æ „´G0Ž±ì°¦Q.çCÓíľãék0Ëge–Ïœ'éöyó²—Ô endstream endobj 5006 0 obj 3728 endobj 5010 0 obj [303 /XYZ 40.7999999 651.859999 0] endobj 5011 0 obj [303 /XYZ 39.8400000 785.299999 0] endobj 5012 0 obj [303 /XYZ 39.8400000 785.299999 0] endobj 5013 0 obj [303 /XYZ 40.7999999 651.859999 0] endobj 5014 0 obj << /Type /Annot /Subtype /Link /Rect [159.839999 138.259999 211.679999 145.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 5009 0 obj << /Type /Page /Parent 2 0 R /Contents 5015 0 R /Resources 5017 0 R /Annots 5018 0 R /MediaBox [0 0 595 842] >> endobj 5017 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5018 0 obj [ 5014 0 R ] endobj 5015 0 obj << /Length 5016 0 R /Filter /FlateDecode >> stream xœí]_ܸ ŸOáçq¬?–l 8 Ùd ô¡À" ôáЇ"×»âp9t{ýúµÇò̬äŸdÑ’íÙ8²›ÑH¢HŠ")’zÿ—/ÿ,~ù£xÿðå?ÅWóóáË©*+U Šþï»ÛxS >üª›ºämÿ§øúíôR¼œžNOÝ¿/'¦ÎÍ®qœb𯿟Þ“Ÿ†O¾<ü­ûí/þÚýï×âÇt?~2ãõ_øvjZÕÿòÛð ãŒ7Ýnëÿ}úûŸŠß;šó¸ý¿ï„ÒR7r/—®ìü÷¶+š¬*dÝ ÙŒñκCÇÿuú¹íFÙJÆ´’ºš=ªæý°RVE«U7´tuÖ6s¨¥ÕµH3P[¶4VI튌z]%Cýe¨¥5,ê{ˆ¡EF}£äy™ÚÝI±3#-FX+ÚD$ì b‹V6"ŽDÆ{Û>­ùb|µIX^UL²DlÏèX²´óx("ê»e¶< Ë_GZŒy®t"v¥`yÏHd¼ ¡á}i1ºº•¤¨‡( ÞáHd¼K•ŠßÇ‘£«‰ø½‡( ÞáHd¼×M“ïãH‹Ñ¥T¥f€( ÞáHd¼k&Óh“7C-¨á‰¾‡(‰691ÔS#_¼OÇϧ÷MoÐ>ÿÜÑ7¿~<;qY¼ë-½nO>ÿTü¹ªØ§Šç_ÏÐ pi}Péóòú }ƒ}°¿ÑÄwi­oH~þ€±²–ªÑuuýªYCÙ´•âuuma¨²”¢ëPÍjq&æ _}´€fÎWAÙ¹¥.oØëáÏ-º¬Úa¸kŸØ2@ÿù¹cºe,Ôê¬Ôž…dÅ^#ŒÕ#4NùŒÖÊm>¬jH mcÝaÙ›„ ïài$já6Î|.ˆ•ý†œ[œi ±Âçc¯·âˆÛ0=ÍŽW%gÕÇA†1b#ÃÐÃáù£M®ö|6¢…,æ|õÍ‹ae¶õ,ë!•`R ƒD0m‰a[Ö6@ü#j1·d”c¢®mAæ0• 0UP8ðÏö7B¤¼Ùñ¶ñlÌKŽ”HÆ1ðÐèé5²±HvÅk²ço ’TsèAºáœg|”ss ‰8ƒl¢"*Ï‘™Â>QÝ“à 7ç„™/èc0î k#ËÁ€s$ÄH |ا˜Sq¾æöż眎ó¹Ã£‰AÐ<§¢=q ŸF bsʆõŽõ› <4È+>¥˜^Eƃ§eÒ>å &5(Ã# ša P$ \§£Åxì–ù"Û³ààqæ ú\Á~æ ò‹KPk<,¬*•f¯$†øGÅ}F{ bõk_nqå‚Ç…£#;ûŒ¢¢àüa³v^Ä©ë° AmŒ˜ïújèdžUP‚¤JvÇGN“–·–lq¤tXð4xä’³#΀J+a½žÑñ€Â‡Ä2ö-–\˜JAݱú€@ó,ÔA½ƒiÇ"u˜"âŒÂžã …S@Fñ §ññ:Îíb ï!’RJ6–”¹IT!> S8»ñ— m4­lÈaŠ p¬ƒ,ŠŽ5y]ÏÚømµgUw®çY¢C‰©–O°EÀèÇÆ°U¶@OºÂzxZœ'‹— H9sÑ2ìCi© vp MVp4Œ7¼RÌ!œÀ‰ñëá„>x¥¢ZQn´<ˆ‘CnøÖ# r#µÜ`>˜CÄ(Iày0M1®ñhIe ‡ò6-¿Ý©\‡`ÉG¡©GîÀõ`ì`Œ²d^ÛðùQ3\÷q~øÖÃ!lÇù‘üüÀ\…)±ƒq}ÈõC®ß¹\áurݷɹ¾š?Ê,<-ÚÆï]®¯áÜÈבküšsÆ¡»©¼²K) ô•}‡©ÂLäÎÍÚ"n1Ït¾˜Wy˜¬7¢‘Å9éÓ :}ÜhçJ."àlAEĨo!lŸ·6CÞ]ؾl—uNmc-É­lа J”LD€)À•p3:#Z=ÉÕl8Š0B Àkk£ïN]hRÞ¹çÅ-w•÷5?NoIœOÊXϨ°WBòá¢ÀË,'ÙΙ"ÊaÍ0vÝrë£#À‹8£2Œ–$V„|¶î ¼Â‡w©ó ŒFœJâð9I(ÃbÃcB¦DxYŽÞü.U]b–v|„'IÆ£D»ZïºZof[Ó8pn˜þÎlM^sk9ë™Sr×-º±ÛÀÉV ×§‰ %cçSâR0ÅØØS»`ârÊ@Z],B%—)•Sf8zqé–u“º#üÊ™‚>pîöw¢`¸³f›e?btÊ…ÁçTÇ@8NX‹Ñ¸Ø5‰c~q¬3Œß¥8G)ñøw÷¼…õ˜á#p´% RØC<¡Ça§Í]F[¯CǶúî舳9*ïÙÔ ,Ç lkðKÀ5ÓÈKôw5[]˜QÑ&K á$e€óEÜ<ÄÜmn~ï¶Ö˜iÒz(ðĸh‘Søvþ=s’X?¬­“JÅ…>±¡±C#î1qyԵئÕ÷£õEe»­vÒâ,æÍsÍÞZKâœè{Ö©W‘mßzH‡´—0o²†™åžõ2^1Ô¶û”\÷)îÚRËoµÚBÇ”“k±Ø ¡”ëLzWîøÔ_þ‹ió·Þ¼s=Yt|HñPÄ£sÝ#ñ‘‡Å#V¸` œ8„#Â3ÏjåTU7TÅðE„ ¨.¸X ¦ýjJp‡Å‚Z‹G°±W{‡«&Œ‘íqåá«P ¢8™‚‹:m.Sjºò¿'µíSA µ¬²:Æš§¸¼ê:W0zùIj÷çy,‘ð^é…§½Õ!E°*AˆuvëϸuU—´Oç9zv#y2ù¡‚æI—¦c ãAÓžß•&4K°>#ç1Iõ¢$%70JìÛ×ôàÙu…Áx×ÀNBØû *©u¦þ:…žó Nb7¬~µœËIO”Ç™þ+^d 5^¾oŸ1¹Úk¦ßQNlGá¦9(|•YiÃ~pxv(®6ãG›c>À/ImÊÿíG^bM$Ø”U›×: ?|cI婜µ~׌²)mËU&S–dÅ…=GI.’(ëûÕ¯÷œÌ«”uÖ̈́̂;§œBXÔ–Žq ,“)Þ±9L…׊¤l/1o›+’k¥ì1³°Rbγ؇yQ3ypE&®ðDîoÊ¥»V§1¼dŠÈbŒ qN›H)³²u¿ˆŒ­°Ý±£+¤ÌïG…=à¸/¥$L058IV/N² dKcÍÅA´c¶¥¸°ÒrwjÊëÄá)”ûîrå7'û|92XÈz›â—\×7VðÅã”Åú7ÔètoâÑ<jÚBÇ´§!ZbG;Ä(îCÂ(älx¸ »¹ ew<9'غI{ w£˜ã Ç5‘W"×D‹ÕuRŒRÖC¡ÂšyçJ^ðK5‡ ž¡i¹œ’‰ç9ô-ì3Yš—¼}“Í¢S£ ,zûÉ'ø]“º7±ÂGÔÇÜLµ0´ãi‰ëc(³vÛy,àºþw^³Ës‚5œOøóŽáæôá.Tår<äŒYï@NaŸà^ÀÜ ç1âzªͤ™NÁ†¹ËÙ ®r÷ †E£}ÉBŸažº)Åà Ñâí̓iˆ1È!ïãŒc,;LÔòÒÛ4•*Y_ çõöl:(–oßgJy’O§ÿÛŠ:O endstream endobj 5016 0 obj 3670 endobj 5020 0 obj [304 /XYZ 40.7999999 721.939999 0] endobj 5021 0 obj [304 /XYZ 40.7999999 494.419999 0] endobj 5022 0 obj [304 /XYZ 40.7999999 721.939999 0] endobj 5023 0 obj [304 /XYZ 40.7999999 494.419999 0] endobj 5024 0 obj << /Type /Annot /Subtype /Link /Rect [396.959999 504.019999 453.599999 511.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 5025 0 obj << /Type /Annot /Subtype /Link /Rect [244.319999 106.579999 288.480000 114.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 5019 0 obj << /Type /Page /Parent 2 0 R /Contents 5026 0 R /Resources 5028 0 R /Annots 5029 0 R /MediaBox [0 0 595 842] >> endobj 5028 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5029 0 obj [ 5024 0 R 5025 0 R ] endobj 5026 0 obj << /Length 5027 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·EJ¢( `ÏxäÀ°9Þl‚Åî"Îò÷#Ô!õ‘¬âCÒLÛ€{|ü8Ï7~á׃îÕøÃ/ÓB ©‡ÿÜþ4þûð·?@ÐÏóŽÿ¾«•V½Qp|¿<*žÿÞ>Š^VUiÕ…œí€ŽÿþóðÓ0ÛŒSßÑ©¦«‚gíäyÚ¾SÃÔ5©µ¶À©b'ê».ÍDÏ8‹[š¨šÎ=õ¢Òúy™}¹ÎËL±BË4‰¨•͈Ç3±ñ.ëzZäð¹ÌËT±ÕªM3Ñ‘ˆ[Úóx*6ê[]MËì«Ø…^¦Š¨S}š‰FˆDÜÒΨÇS±Q¯e•HÐ_§Š¨OÅ>#Di½c*6ê{=1·¬úhŒé4rB¸O´‡D"nigÔ[S}N¢É«þõÝñàǯ‡÷O¢©õ¨n~ýi€äYg>¾ËmïFE ïŽ_<þ±ªê§?¿þ|èOm_wí¤äN#UG> ¡á3áÈœMÁ‘Ά!¨áÈ'8òˆFj8›„+u`$ÝF»¤¸)é ’p lõ„·O_þËÍMý8:A ±è)iÝžñÃáTH‹‰©§§:ÖƒaãÓ" ;#e(©mî”t—ù[”ùÙù¬jé#Ž÷À•n@ÏJv6 â¤_'RâDT¢>¿òÂ~ÕôçÊd ™ÐæÔµæˆ¢?#> g0l3Ë.Í6m•¨OÐãèu=¢:i!_Š8âxϧó3­2ž™T|}j¤Á¼½êTO¯Y"Jk¥è=3µ'©¦¡ëˆ@ïq¬B àzžèPÏhm\c¼Up¥"™BÚƒ“¹©&Vj y(Ä©mÔ¸“øõ•➌_ÌÒ¢¹~ã¼»µœebCãÙçc¸;U–Pjæýo¦K”.(ïû,à?@Là×@Ф÷}3ñ.-Øúªµø¬c à3ÖæˆŽ¾`Êú>A ´‰y„Í1lZye' ~5 ¶Çrr½®?½Üåú]®ßåúžåú]Bò%¤¬ý˜¿KÈ»„|Sò.Q"$J#“¿Õãú¯û‹[irš/ùK§qœtárBæÛAKy=s–z{ò:‚ñ8‘ùRX"&Äë¼¶}8ÁŒú¿:Á7ΉS¼Éœõ¥@lÚP†½.ËOÈ;Â@‡ã(”CäÛ ÆùóS†]sž2 ¼hFF"%àsK’pâIMNrJbâÅ@ËÇpjZ+Mc€±`VÆ<οߑÐA‰¹!ñÓ€;Œ]rœ&ÖÎÑ%ÑE--Ë…Ÿ±îEqòéÚqhl˜kD²È)2õf»«© }lÉ*ø¸LÑ¢>ïã â •™€­,KlXCÛÂéñ3 Žàg lÒÂEo2W…`´ðˆ_3{I–.:dÏ3]c†-@!­¤5éb®“T+qo¦9E$ ‘ !ŽÀµ°6û¯–„Ì“MëH˜çšýóÖQ˜ßjjƒ[÷t§:MN"Ãe²§",ùèM#N’û¸Z#®õõ¾¬Ú½ƒ\ ñã.ïáZ@‡');ò|-‹’SÈxˆè¾5U¾p£œ€þâõra )–éæÜZ”Z„|úðÀ-‹üa¦ш.(W¬ñW .Y|о#SÀPIÎÂ1~j°\²Pwr6eÇïç˜ÌÈé²o Vßg••|»~uÔ¡³'5ñ9qrŽ;ŸàÂÈSÙ"o®ÉâˆÅ/ubÑMH*ˆ ®tÙ’pù1ó…{7an„ûfnìz˪=ãåváÂj;!Â0&SÚÔ|Ÿ üÞ¬¾°÷rhú%cLÛ,ìînãn=oV?VÑ[Íéîö¿¾dk\{mò\’¤³Ò哆D]Õ´}nï²åjÚŽÙÖ¯¦+SR¾t²‹ ŠrjÑ54ª <3]WæD’$œp·m?¥(¦ì÷íoT—¶¡Ž•›è>§Û³Õ¹¾ö馜÷lßê¤U²_]k—êmhÓº»„½÷©c2:²8¿Ó%ÇÂßð.pú\¥å^x©Âу³Ã¿-£[–êFl{Oz±s{ Z8iå ‹b1l Šm ÞÖå{uÑ«æ%:hÂ)ÂgÁaJÕ +Ð˹s^/Š’ BÈ,R<"u¶‹?¹Î_hiÙž™3È"à™Wž²ê?ç> «ÏBŠêNsÁnRüœ 5 ¬c ئõ¼&ç2—ùº9D6wi5q +‚džp«Å_\Ö:5³ÔNG2ÕVÕÊ Gö¶i±6š#Ò3—²ªM.ŠO J‡ßCÚW9Ǥ(g?I24æž4ðJáHÚäŒNcд8¨°C—ÙÌuàS0§$#áÖcÊ’l”k9áU2]åÇn¶¤6J˜Ò²†E]”ö°á~PJj £„1…Á?N9®ÕÚ%ã»|„6,áþÃ]×sË\)O*é+aJQ¨Ì X·{­Þ©¼>§¶tª]lÔL»44¬ìó´z»„°þokÏQ÷ƒ ,‡GˆÒªí•…Ë”IÓAvײÃ?Òµ«ð±Sw¹ptö7Z2ýí• —,Qžžð~&Q¹‹s:–uŒz¤Ç´?0#¼oÌ8ÂfXx®%³5i¢Q8{Pή„ÅWéàÕ´¦ &Øå¥}œŠÎœCž"åË“6ßýŒçnn¾5V˜»ùÅÍ·F^n~€möMBùÖ]–%$LâoQï{õ›Î„‹¿”¬=|àq¬'¼N?¹ˆ.¬¾±Øh±dSÒ qÿrlÕÁbœÀÙ½6º«Mq˜2èE¨ýIi!S£›q\³x‘"b1Èá”w¡…€ Ø×—¬¨{³·¨õ­¦ä4–€bбRøÍY9[a0åv –8{Ÿrè.ø„KŸÕ:‹Ü…Üz-“ÐtD‚B’Æz£x3Qâeª¶B‰)ïMÍÚàÀÒóHJ,k2ßÝά{õ5‰Cýá¾oë¢bT_Ý ûOŠ"P]ò›uµ¸\;¹Ûìemö½Kò¶sv=¨µAð™»$-½ÃÒœVã”ìq‚Vãtäˆ ÒxFpœUƒ4E¿á€JYT0¬­;‚x8ç0ÍÁÉÛJâ¿ä„ÿq4mÚYøaLµä¼Û$¦Œg’ê»×­„m°[¨?¦¸vxcO:ß+m'œÒÃs-\,wrù{ÉúÎiY“ܶ9ÈKäívikî„ä“;K ¡L”b¡j]e ï,ýv3 ¹îgR?ɤ 5å¬,¤!Ý™y;Ì\þR`[÷†Ü¿«½1"¦l@æÒ¡ÚÔ $®Ð—´T]Ñgó˜Ï¿Tµ©=EÄøîX†£ÖïQg•€Ž‰ÂZXGÖ„cÒx߯-±œWÈ•6霓2†¨Jäý%”Hås s0³WÀànz/?اXÄ þ€àmÌø,i€Iƒ0i¯*&)YS(FÍÉ«ˆ¨¤µa2 g÷D˜2kf„Õ­6%ÎZÅJ’Dô)w§üzKÑþ{4]Úª5Ègצ ­£î°‡Ëbãî—¸£|÷!ó–3„ªzS¤lÅ2 ¸àH´•.·% ¥ë¥¹É«ç8 ÝÍ+u- LÔ•aËFNSNG»C,f½ðJBXÒ…°c¥XÐapàž:vCàÛ휱ÉJ™¤<³T‹Wi¿Yý‚cÖ ;›’ÅDøq­¼’[LÞnho×* ‚žQŒõìô$Â+}5çMÓ ƒÿ<0[iøeYÓ7äiv¶v™4EH(ÀÇÃK`ø*®×d´/p:roQY»'8<ל 1áŸÍbÒ’ u®X¸±îsnÇÑ}‹¬Î8Fq Ï‚õ¶+æð÷ø}à›-Æ)æo¿’ÊäÝTàûìäAç£^æÕê(†….y×{¡&i¬+£¸R'µ¬e÷ÍÉBÞ$zdwê–“Y»…‘i+êú$ûÅJqm{RÓ^››´ô Ÿéá3­uò$«z2ÕŽ¥Ù&‚½ýÍ#üîlm-¬ð =3KÇ¥Ö1sí™yÇ(kŸa{f€ª–­èγ¶ð}ƒ0íÌt ¬gä„ UÙicÖA;RÄ#äL½ð=ò#|Î6{–`ÃÔeñ‚ƒªl¾Á°tˆ/¥f<3½§Õ§zŠŒ8`{BïÁ{ˆ1(!íãŒc,;æS5–sµ®ÔIŒÅ…^²°ƒé X7]>§> endobj 5040 0 obj << /Type /Annot /Subtype /Link /Rect [381.599999 369.619999 429.599999 377.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 5041 0 obj << /Type /Annot /Subtype /Link /Rect [211.679999 303.379999 286.559999 311.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 5030 0 obj << /Type /Page /Parent 2 0 R /Contents 5042 0 R /Resources 5044 0 R /Annots 5045 0 R /MediaBox [0 0 595 842] >> endobj 5044 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5045 0 obj [ 5039 0 R 5040 0 R 5041 0 R ] endobj 5042 0 obj << /Length 5043 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"©ì±'@ ‡E7›`±^ÄÙCþ~¤–ÔÓCê#YÅG«{Ç<ãV‹,ëŪbÕû?ùÇñ_¿ß?|ùÏñëòóáË¡®ê®žÿ§¿ï.?ºRrþµ×m%‡éÏñë·Ã÷ã÷ÃÓáiü÷ûAt§—ãÃuŠyÀß¾þzx?O~˜?ùòð×ñ·ÿåñ/ãÿ~>þð÷ñÇËxÓ¾ôÐM¿ü2ÿ"¤züÏåoÓÃþö‡ã¯#ú4îôï;Õ CÝÄÁñýüª8ý½|MV›N*=‚(äøO;¢ã¿ÿ<ü4Žv£Òì›¶4ü=d¦^®S }wìíy¬å†$bjÚ6Í@'4F­LÔMï©!ú®éëàžaëëá´HÕE/s*v Uwi:A$â–¶bÅE½škZæÐÆ"l)óR4i: ¨•-ˆÇ#±ñÞ y)»ÌóP±ëL3Бˆ[ÚŠy<õ–©P*v Šæ'ˆ¡Þê)‰U _¬‚ïŽ?>Þ?ŠFéÉzþi„ädIÍ?žÇå¶Çw“~êøüãñu-º?Ÿ> U;¨¾M¯ù‰lГú3|ò >QðÉ#z‚a«{ød€Oàzd‹ž4ð Mà'‚Ñ8š¦ãÀñÎúz$Üm%Ë`´Á4 q©Ê±soø ¦x¸Ûïê Δ÷TÂyÔËXƒ·á.8¨CGÃPC‰äXÞÆzZ‚O$æz,«»íñX’c¼Á'x¥ºvp ^)¦Q Ä pO;‡!`ì6¦D/`\cŒÂÃÒ¯Ç!0…`é‚)$©^P5ƒÞ0×3,®ëkgÎz–ÃõI¥ G—` qh?çšì§%ýç Ì3 ‹Öa祕ŒÝb­ð<ŒS—ƒ1ýs,Æ9Iáƒï8èÛ›šƒR”ˆasèCLoø Çj䬟R°]¡N¼§ yëØfãxÒžlŽtañÃ{•;7iröCÍñt8|-W÷…½Éß•ÜIêorŒö&Åòœcœ_pxiêùð¢»×`¶•’ZÈöz²0LóòÁì7oªf^ÐÅWø„0ÈLh]%…ÞdÝ—AļSÚD©6±ñY8öU ÄÙÖ¼ÖÏkÎ#?›0öpx ¬…OŒz æ»Òœw‘Aø´v‹°Î^X«h®Œh1ø0ψ°Žá-HLX»¥ i '$ssð*enAøžX¤MÙië]H•I°ç-§¦h[CU8ÞT¼¸C¶ ‡2•"kf¿ë„!‚ùÑ+(MÑMÈZ'–qÁ~Y>kx!ª¶é¦q£Ô¶Í>–Œ³–E°²m^/p×5&{ÜrP%£ éaڜֶc hQfcƒû­C‡Â ·;(*Æo2`vÂYRÂ1»BÑÚ¤ƒ%G²•ìùB¶G)asÁšºãì¿×&¨ Çæ`œX˜&ÚÿTÜÖ­:q^…È¡‹ª—Ô´¸Ó8áHï°Ó!e’(Þ†<üŒG5­@[$s\pe[-,šËbJR,ÖxY”‘áUÝ™?[ºÒCݽ¦¿Ù¢]1öòúΖ€â–ÍMð$9öXçP̾IO¨z™`@ExŽvìǸ2ƒýîÜ%ÖÍmû2öjçÂï8¸'&åÞï”*lfÒuá‡J¼`‡™˜Äƒ“»ÖdH9ê±tGz²`ÃÓbLG>-š¡\ædäž0ûâÏÎ-'‡JÓÍ`OPÕàZƒW€Áµp]:8OƒëÀÛôŽw`Sk'4°:@ƒ+5A°Z¸¦œ§…UØ2JbQ¯1Ž-À É´u±øÐ¬0à$j†{àR\B(¬jÔ"li‚ c{ci8……p5ž’šF¸Gpµ—¹õÀ¡y{xýš~çMv#’îÔH¡Új¢¸‘+ÇM»øà—×lÅÌ¡`ƒ~Òqã¨Ô†MÀìèÔ¹zúY;ÔõkSá¥zºù¤^•ź°ÈŽôŽø!p´Ž6„PU?ó i_ˆºš…bÈÇÛ~ÕH‚ë¬ÐÃVžfõxÜiX”D#¥¨Ôñnå¶gíÆX©CJc‹™¡AÒB áÍÛt\ëÎ/R¢>ƒ‰s,½°3ßQ,V¢U7À¿.uØE {ÅqÂrœEÜó.8ìp¬/R§Árbvˆè¥Ÿb“ZË×÷·¤å&•CïBâbHØÚ.åÁÚ¹µ-Q˜Ê÷ìÛº7úwÔa¹:®¯Ë R6kàtI1Û¸wb_)%ÔŽô§)ãÊè0Ñʆ¸™¹V-!a:I÷(|C7EÙë_VÛáµû«ßÔºRëFÊåkHÒþò„üúç)¾Ÿ÷²G Ös’þ…p¿…r~ýRƒL4•UG%‹Ð£Ü5ç\Íâ”D&ôŸÀ—#Ú.ìL˜áwAm3Ñ¡´ Øe%²~¾Ðz)vتš\ªVóšÖ{Zn·”óÒµ¾ü`*ç•ÓÓD¦ùeŒü 5Ö5ίzs¡¥ë–M (—F”r –I”¶kb¡bkãÄç¿=[Ã\½ØÚ"Ì6Ê£á’jŽòh‹h´‹ áÂi/¢Ñ§!j!J»¨[VÊ*ê†WšÌåïßžŠªQJ¼&~mRœ¥õý±.´Íò Ö+ëÞ¾|£kÕG(¬ádÕáájÖæÖnÍ!Y*çn ßZª%„D@ŠAÊNmbй9  Ï«ÔZ–ÀÁ2Fƒ½ß«°«|4çSðPÓ7ÄA ùO¥³ÇqºA¾Ð6¬áÕí4i IK4ز"Ü呤~‡e"sê·øO15 þaÊ»€GÅU=Bµý²8 ‚Ã+ŒS ƒÎŽÀ;¾äŹ‚Ë8\tÅþ,ªÌý wøRƒá!¬Æ‡ùE~kòLñþžáMBî´ù|@úж¥­8=³ÂÝp¹ÊœvJáå²JÅB1ÎÌéÂda…ãó8¯?áÜ®~S•WU•º×¦X÷×Q&ˆ!r3¡œ…!¥0Í+N‰õDŸ¢l«êcŠá)ÝM8MmáhI*£'¨oZàˆ­ YåÚÏì$䶃‚Åœþmvp•‘H‚ßñ÷ÆMªcÕ›LÒƒ;e¦Uμº3¸4 ú­PN›Àp~z‹²»ã{žð”VÛM/ý¸ îNV ;N}ìÐi—N›¥–Ðy3¨ËòåL½¦“½´ÝöcÍ@Ò·C«´‰µÒ ßÝ…þe™öI âçÎ(nä¹(Æ^Å&VdoAù–Ï ‡Þ` Ï®Ûz†µ/d5 •f +“ºvÅ)Pù‘Mpò[xX8%µ8N„èóö#ŒŠ±ZŠsç{È#zpÚ„ç¹%C醋UÂU›ˆO@ߊ<ýpš8çb ‰,a«“Üg §ÏBMÂ(éöä¬þ¬=þL-²Ÿ¾V‘_ëQ–»9ÝRîgKÊ3®l°ÚºEà¦ù´,´Uf¶î^<. {S6©‡šLs Ü"Cì &ˆNFYRÍ|Á7‰mA¸i)ËúÀ8"(,Ú’ôKh díõ§ÍNDH—»Ó‹Ð…MÈgß^Ó%‰Yy¯ÉRWNÞMon,ÎHbTÎvÔÒaÔ+tÀ†ûJà'¸þ”¯2IÎ(h'ÍIâÁ·<´)Äsš&ëàµçßwW±óÞ:þ@î¼Í¾>¸“ƒªy–˜v £_Ï.úÛ¨6®><¾tâ{RfuQuÛ1o98¯ûÍ.Ø}-¿6ª2ùÞ¹¡3ë‚ç?ïtÝ9a4ÉÌЫ !çÂQ> endobj 5052 0 obj << /Type /Annot /Subtype /Link /Rect [128.159999 415.699999 182.879999 423.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 5046 0 obj << /Type /Page /Parent 2 0 R /Contents 5053 0 R /Resources 5055 0 R /Annots 5056 0 R /MediaBox [0 0 595 842] >> endobj 5055 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5056 0 obj [ 5051 0 R 5052 0 R ] endobj 5053 0 obj << /Length 5054 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨sË⦠`»í90Ü@A'3Á`Š|z¤¤²lÀÝ.·Ç·ñm|ûç/ÿ<þòÇñí‡/ÿ9~µ??|9”EY•ýŸãéï›ÛdS(ÙÿZ7¦íéÏñë·ÃËñåðùð¹û÷å ªsGû£k¦èüãëýä‡þ“/þÚýö¿£<þ¥û߯ǿÿ£ûñ“ïô…o‡¦­N¿üÖÿ"¤M÷ŸÛßNÿ>üíOÇß»%4çqOÿ¾Qµ¢jf­ãåÒUœÿÞvE“•G]©nµG!d·NÓã¿ÿ:üÜvYFÑj!êJ×e𨵆mëÓÐÚÔÙ[àP3ÒeÙ² ÔÃlÞÖD©kÿPTÐë²n™@jî@¢•LgØ­ˆôž¡È —Z·Ùš¹ûFš 0¥jžN+³v6ŽD†{GFçMšz6¸&Œ×Ú0`sBÓ9;àG*šÊþ¿‡ÌÓœ÷ÝI[ÑÍØ‰(¶ã­KË=Œ;h$4/Cͨ1LzZ‘˜·µá€ñPdзÝIž¶©¤š»Ña¨¹3R2)§‰y[@‡¢‚ÞÈ¶ç ²jgC¬åaFÆTÿtü¡,Eùãñù×C[˜VÕ¦¿Ãô-ålù[>À‰Z4^ìƒçQ¸ÅÀÑÞÇ·HZ„†£©ø>Â÷Qïâá&*ÂiãµÁÑxOAAˆ* 6¢”–ï¶lóLEM€NCÀÈ‘<;…tê™ïŸ¦mÊN Tï(/ à<–æ>>w2/¹ÓͰRˆ}“-yVZÕ“ü_BÆrFxEšHÌË3qÒ½eoÉ*kYu”¯Ó\NNÚTÃz0=cÙBá(P—áå\¼üVQ´)|Y±æº·ìüÉß2ƒxZ š.O M—ÚYf]™JW½mÆ«Óc&%DatÕt[oÑJ6âÕ¨¢gRuQ:‡ÙNÍg­ Ýw½aIõ¸¯A_µw€ª¢¹ }2ˆ3߸¯ú„¦ñ@ Š¿ªÕx­Îâñ>á¶DÏÙ…šðáØ í½³øD?Ç÷[܉ûý5EÓ–#dï÷'Ì0óµåBeË/î¡ÿxb|òãZc²³æÇ&|s(.‘+y4-ešgÚ´Ù5% Wf©s¶ã9R1Šafή=Ñ]LÊ6NÊѰqÈ Wõ…+>\èPxpaš1ÎÐòK%ƬÌÅ.ç´Çb@Ëø£Ä4‰±Y¼ŸR$Dd¡ ‘jOtÁïJB¨fFÌçê+Óxަˆ>¤pÎæQ°Ú‡‡'hjYxA£vu!Œµ¨ 7îà7áîàÊX}ŸjÒ"Fëè‘ö&ÆäÈó 4W•xt'cB”¥Ö“ "‚L¾¾ÁˆaZ„{$ɪzx*ZŽ$šκ†7ZGÅÅÂÒ9\¸x5&j5ƒÃ˜€W¢?fà&½ý_ !§™ f PÅQë¯pžèl…}°ïÔôX™#£ 8a%^ó’µúʵ0.Ø¢ØFL°®PližµáSJöé”ΙP2ÝŒO$‰IsPB”>–É›N'‹ñÉE„¡o&uª²yWÜØ:Š[p…ŠÛϱŸ‹°ê%i¾nÍÍc  H½/¸óˆ M–ÆŒÁ²©æ0giy RÍä~öòâæ¬í¶ðš³vL\vžÐtŒ½ØŒŽÝ‰˜‡`úÁ£±Ò6GÁ&~’“à0ÈÅý%[°hs”ún’è[{YÌ“•Ö×Eèñ'V$Tׯç+íø+ýq ]8EP쌪P½Ø3dQ•>k5c¢.ÚfÔG 4šE¨{£ÁyœmX:.Ö*M7pÊÞ«,”º×2`½«Ð—?ÔÓ¸™°„röÎ twøOaâUNùÎ1À­zÆÇ¨ÁŽÈXÙ{Ò•ŽUãìÉÙ¥UQ¼ßqQƒc¨ `ˆ³lÆ gð„[ƨ‹?׬™ŒvOd‰wLÕ{°ëÊÁ&µiR„s‚bO"ÔbˆØŽsŽÓ;×",‘1±ë,È7m5e©>“\îÔ6bê*w\}*mPºGã G@ŒnRôÒc} Ÿ8·å{±ì -RRGÐó´„Mã80Ê¢ªÅë2øïàZqŸ!Î¥#I ’—….ÅuÀ‰MÆõƈ{Î[¤‡ŽyÓ8UvÏ”°h›“ ,1¬š²¼õ2ØYŠ’£ÅR¤-väàÈý¤)|Ýß³¿ð„@g­ØLjÜûð«:&Îée˜pÞ¹ØCpºO@±Ø´f8ü™š›FÈU¬÷ã>˜ÚðŒ>¨lãUÎP¨“ÇÄîs'iiyØB¤Úwk.qù<Þ'%ü,"ÀcŒ5dCAtÓ©”1 ‰VÆ3\3›K2pßkÊP1ÚЃxëÒ”v^̉<'¬mN(KyŸ¥ ÕìÎy 2¬™Üg=Ýaa Ü‚f=ÝÁMÂoÀé…ˆ‘ê1¥Hb_qvNÌyû"QEH@î=Ëg7Gžàcc‰â%<%óLûR~7J¹–+£{<Ähïy['®Pü2†Ü§|hUê`3+.‹ÅÂÁÈYR‡E{¦²:ƒ´’õ0å¥Ùÿ¹ŠF-倧µ÷ñ}Ä;ا…}†*®CÚrœ²§%Û„â¦Ðãg·=ó({ªrlnrÒÝy,Ï« ûPÈ l¶ú½µÙrO[m¢²{ ‘ãï¡ìŸ´K“Ä7–ÉX ÂÑ,”.hÚŒ°S^¦ƒï¼æDÇS¤DsûÁo‡/¡óØîDñ´PŽƒÑÀÑXžÓ¹},åÝ\Uñœ_Þ—ybÀáAì,ƒa£¹$+;ÓJRø;Byñä M¾„³|àC*$A*4¦ÕðWI«8e)`_«á]Z K%ãÂËž—iX‹Oç*¯Ì—y3ª2UtÛóV>-xž³Ïø6h]«Éò”oÏõžèTÿ<°jå`åáøy ÌSà»àø9†\;Å£yJ÷ãý^µçå‘—î'ž§Æ ¸¸s¨$[Pô£é‘Ø{ŠñzBW1cʦ]€ß‰r(L°¼·jNH¹¹<'$Dýd“¢x4¯5-ÌÇði¯]Nˆk½ Š&›‰ãz0v›X‘Q‚=X”²JÊä¦õLrbùèÐ]Ð0dvÍíºévqí· šL^žÛ-Oµ!nd9X0ù´$®‘æâÖÜcŽ.äŽ9ÚrÞgLMcB}Θ Mgñ“»Ñý7dѽˆ€\Žr!ë©ón’j»nÚµCÑË,T”JÄé#fµq÷-±O¥¼8 ˜$°“TÏ#MBâ*µybìAìÜ¢·Ä–ªÏr8)Ÿã©ô†ECÌûx?ØC À.qìÃ!'‘ÇåDæÅt2¥PIè\ΕRÀ QBXÆkJ˜æbžzÂÚH¡Ök.‰È»êE h ú\·k ´€¼LAÆ»N°ëYu‚5§€íÆ®aìÆ”†‘ÓêPÍ) °·ì-{ËÞ²·„H‰å퓞µaJHÖöhsë¸=7wí~{ÞoÏ?ì·ç3D÷Ûs¾”p8%Y–+|¿=ï·ç¬«^ÅíY—s’÷–½eoÙ[ö–)±ßž¹µ——!èEùN)Ʊø)xn¼ç“«¼I&ˆ*|¯² u/ÚÖ©d§/Ø_¿yô8W,¯ àg¯ èí:©;6ÕQtÛ¸ ÜŠªOÔ=ª‹úh_vªª¢ºŸqÞꢇÌMK“uQßO¨ï´ôH­T!ÛQî„Ø6EÕÇÒ^[j8Oû´°Oµ,d‡xò¶Ï{8Zl·Ÿ<ÁïÚäÚ;;ü„úX#à½öa/¯q}ì‰ÅìÝ®íL3°îô»4â4dà|u<Œ;,aW¢(û¦€³O{1Ìmý‘{kÃøçÁû±†×¸y(ØqÈæ\Üi.ý`úœÂĨSæ=<Í ‹ƒ>Þ3(üÀ3Æ&kàZ“}Ò;è»\qðʃƒ>Î(wðCê&{glš²*ÄéÑ׌Ò#¡ð¯tF}åøùð'yØR endstream endobj 5054 0 obj 4424 endobj 5058 0 obj [307 /XYZ 39.8400000 399.379999 0] endobj 5059 0 obj [307 /XYZ 39.8400000 399.379999 0] endobj 5060 0 obj << /Type /Annot /Subtype /Link /Rect [90.7199999 564.500000 132 572.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes >> endobj 5061 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 564.500000 199.199999 572.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes >> endobj 5062 0 obj << /Type /Annot /Subtype /Link /Rect [214.559999 564.500000 253.919999 572.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class >> endobj 5063 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 512.659999 326.879999 520.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 5057 0 obj << /Type /Page /Parent 2 0 R /Contents 5064 0 R /Resources 5066 0 R /Annots 5067 0 R /MediaBox [0 0 595 842] >> endobj 5066 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5067 0 obj [ 5060 0 R 5061 0 R 5062 0 R 5063 0 R ] endobj 5064 0 obj << /Length 5065 0 R /Filter /FlateDecode >> stream xœí]MÏܶ¾¿¿bϲ©/  ر] ‡† ôPôP$M‹ÀêæÐ¿_í’úXrJ%í¾L€˜1µ$g8ß¿ÿÓ§œþõûéû?ýçô“ùóÇO/Źh ýÏéòïwó¿ê\JÝlU}–ÝåŸÓO__¾¾½||ùØÿ÷Û‹h®?4ôÃzÀßúíå{=ù‹þ›O?þ¥oýï$Oîÿï×ÓßþÞÿñ³ïòÁ×Õ5—ÆÝRHÕÿϼuéü÷Ë_ÿpú­_‚ºŽ{ùïwe+KÙ5Qëø6þT\ÿÿMVœª¦®„< !ûuÖ=:þûÏ—_úÑÆeœ»Jˆ¶©Úbõ¨­¼ +»úÔµÍI63¨Ûº¡Dì@uSò tY‘ˆMU늌úFTõE4ꇡ¢1¦¤äè²"Ú€z<õ(4…Õm$œãH±kDÝ1 Ô¯HDAfG:×…è…g«*ØžÏÓËùS[ôRë«iʪ—°M[US»–ú“/Ó×!üËlRÑʺêú`ûvRuRe¿=©*;9LtÛVÕuR54o'‚ÔL4üÒä…sBãWÝFš¹æhÂïu˜ê¢QMó¢}Ï ¯Áíl|Ýæ…wÂçWÓFðê¹æø&å^Τ<£ž¡}¥°RĬ›ÑL[#ÿTÅ$nÛÅÀLºÉ i5qêlV8'4L‹ ÕsÍÑOÄVÓžÍØVã¼ã÷L«7V©aÔsݶ‹‘‘â·Ö…·š1ê|.^x'|L‹àÕsÍñMÊÕUÁëæŒz†ö•®:}üšiën䟦˜¤Ã¼]k gøšÒfâÔÙ<¬pNh˜Aªçš£=žˆ5¬¦=#š±­ÆyÇï9˜Vo¬Sè皷5Ƨï¹ámfŒ:Ÿ‹Þ ŸÓ"x+ã‰Lø&åF{׿Œz†ö•´19|ÍÀ´­ù§í&épÓÖ¾Èð5/¤íÄ©³yXáœÐ80-‚´1¦ò„öx"Ö°šöŒhƶç¿ç`Z½±z̶›ÄM[U##Åo­ o;cÔù\¼ðNø˜ÁÛ ¦rÁ±¿WòT“{©fÔ£fN—ÒÆäð5Ó^"?fÒNMÒá¦ÝŽn§nrBÚMœ:›‡Î Ó"HU¡,´Ç±šù–jF4jæk™yÇï9˜Vo¬Sèçºi·“Ï¿µ.¼ÝŒQçsñÂ;ás`Z¯*”…ÿXRVÅè^öÍ‘zÆvOU×O¾L_Ç3m¿ô”hGépÛn·Ó49!#§Îça…sB£aZiQÚ£‰ØÀ:´G¢™ÚjœwüžiÍÆê15Œz®›v3úœ [ëÂ+&F½™‹Þ Ÿ†i!¼EQXø&e1º—JΨGNN×õ“/Ó× L[6#ÿ”Í$nÛƒÛišœ–§Îæa…sBãÀ´RÑI íñD,&ßÒŒ©‰FN¾Ö0ïø=ÓêÕcjõ\·íÑçdØZÞrƨó¹xáð90-‚WtÒÂÿí¼ÔóÓZ}XÙÓnäqå8Tì@MÃst}]‘ˆm8AÅC‘Qß–LYV±€CEc¬kx2?®+q  ¨w†úÈ’Ì#§džož¾ýüòýQ•ê’»ôù—~%×(ýÇçÜúôÝ%©Gö½?Ÿ~( Qüñôù×—î\we[ëŒ)Ó#`„=%ìéPO­PO…×öö¼‡£Uð7°§„8( <ÂS`¼ÁÔpcÎS¾Øùöàý=x ¸s%Æ(ü€ðˆb®ÏS¼ƒ= L½pm¼t€±SÖpÕoÃ{ð<΃w2Z)ãói ÷”yÒs æFÙ†K>Œ7ÊÚJÌÁ©,!Þ0ÏyxË®™W½„Ñ÷Ÿ{Ë#¹QÕ‹pçžÜ“{rOî‰ô8°.ÀöÖ`Ø.¢¬ ëPh³á`kŽ×ZÀx+¡C±‹<úàî¿ ï¯ºÛÐ*iªa¥9º‘£?äèÆ£9ºq€è†Ç§Ä%ìOŽTäH…¿ç•E*Ty?÷äžÜ“{ŽÓ“£9êpô]ðXõ¼û³‘ï»FKì/ohÕ…<Œ´Ë=¹'÷äžãôdû«W¡ØúÉö×váè§>µÃJó©’°tÀ1pløl>õññf>õÙîÔÇ“é iÇãOå“•|²âíy]'+uu;:÷äžÜóÚz²÷œO/޾ ûzÏPá½ê¾ªðnH˜¬´1¨Îª+YÏÖ[¥lÌÕçR*qû©†µ²·¬=€ÙÔŠOñ|òƒ=ˆ½€RÑœ¥PŽõ§Bœëª¹ôÙ»¼ >í0‰âÜ´âvûS_¹3ª‰ZÌ hí¿(!n4 UçJwÌzjØãl¨3Ÿ'œF:¿%ì£ç7íùþ­B{Ÿ‹,gEï×cÀþ­gñÎ14pñžá)tƒ©ÐYlÀ.V"<ÖK¼Fg¾Å}K)ºecÉîG-â­M*Î ¦AÛÔ·š(DÖ`náàN¢Qø/<š" Ã[°‘0Y¦,nLh_Èa¸5{àÐ)–5i—@®6aû0@13ÁžjÃ@TSµËÎÃî!Àª÷:jo7¤—¦YÞ-¼'¿’à"{èÒ2¦r<”#>ÂQ•‡Æ0F éužàßðb”‚ÂÚ÷wgói†Ž«`JÕ݃ÿfÔ…°Ø÷çV¦çN2 S*Ë=ùÅ«ü Â’ 3Bú«àegé‚Gº ¢Xx7f½H6F‘ !"§8ånqŒnx%¿¢R€VJ÷®J§QºÏØ*$‘À21Ë áÜŒµ}H™LRo ÅâÑp¨ 5Žª×kœ˜ÂQI4ñÊ/ì¥Èb*Ñ® pjødr»Ì¸è­XfÌë½³<É K'Í/n¯ÿfÕŽ‰õ;&Jam™[ÑgýN•¶žY.s³`i´‘a4ú…A1¡ÿ‚Å+åù‚Ÿ¯/R´ó¿øòòÉÃRixñ²„Û­Êû†å.„'em-Ïû6TrËÖaS—ZJRkÑ,X&¼ o¯¥Mxiöï2‘µÏÀÉþz8ëÝ9ù² Õ¾€Sˆ˜=»HR)[ý`e¿hà8¡R°vg µ‚F{¤ÝÐhÕŠ½iô²„uÚfUŒíƒ,9 ẰYV¾³ÙÎ1HmröhªÅbâê°¹`b.˜ÈîLï•vÅP)ÊJ€H¨N:QYêdëäÒ¨sÀY÷]€ÌCÂsIÕÊ~æT ¬:p ¨²GÈX}’wÜÂÇ1¼A‰8ÁBÿ2MÆ K~P×%!«—ÂáuŽs?–"Y¸9±,¯|­§ÚçCß J8 ÁC@@#M¦a@ (À[uiÌ(yñxX´ìãbÜ‹‡S±}àŽëÏG™_Ðcxmã0pBåÑš\ÒIyP.¬ŽÿFˆc¬È% UÊ©/%†séÖ±ö­4’3X’`øs¨ïEKf·²ONio™Ä\úôèXÆmBª¶ˆˆç\)¸‹u‡E: I¯*kÝ! ˆ5ƒ†”`agœ ñᥑ£²ä c. dp=¥ìÁ²Y¦Ž$*þ±‹c¹yG‹fåF9ÿ º–¾¹óõ€¤w©j[£aù¸œÔ!6¿ùÀ"}Yô@ZO+æ>›+ RèÓœerd_¹²•5ÜëçHÔ¸„]HÂÖFùeËw„–Á¼È ˆ®rH‚7VAU] wØq3½õ-Òè¦Î\ÍŸy-˜å@Ì7m¡Þ®m¬¦ªqÊó®ž:l£5òH±Á·*¿Ôµ*Bg°‡­PÊ;æC)Y$7çŧ¨Ë¥Ç`e§ZBÊ&|DQÒóð9e@6V ÚJ…tÇöš<ŒLŒ‰9ìÐã,ðËsÁ9ÉUƒ#Þmdͱ}u«SÕMKÌÝ(Jd< àÃÆIPö]Xç$ê‘…ýÙ‡3¨À¢kCjt³œ%ø½Z?&(€Æ€´A†4³Db)ÔšòÑ}kb®Žg´$z‡Âá¯õ{CÂI,O<¬7°XÎÍIÇ‘=ž‘7pŽË»ÌšHð[ŠÇÄqéÕ¶‹Å4Õ€§$±˜dJ «õžƒ$9Hò AÎ@GÀš œÎärïÖï ¥pìSJ÷º´Ä{@H„T=#À[ñÄÁÖ£”Št ÷Sþ[ç5&VV‰^IŠH¨Œ¹„ïÙ‰ëlö~«ä¶ô!—Ö¶ó'&BÌ)9>¬GºQ—¡(*‰µp‚J 8ˆa xÒk·T)0»ÖìĽÚõHØS|€=8‹¯öxVçyGK^„WÔµµ#‰ 8‰9UX‘-ÊRr#‹%Ã4¹F‘mcDÚ—Ï«÷ÈVS¹(›[Û.ˆ‹·O[(‘ào°D ì©POYž,a—%ì=H%ê©àŽ­Ö†WPB Á´shŠ0}j Ñ‹ábè:­H4ŠZ飡º+mT§)‘˜æØŸ ¥ ¢D”CHK—}´ö3Ë%>³N5‹ÜÂBè9½&Ù# ]koá»6Ž óTkâ8Î{e‡g‰W¹geÀw9Hute€)‰øÂYòk#ˆ{Þ„gc¤<âhlQÀ—=…¨M^«!4rJÖ³³ê¥#±[[ ‹¥/Ä›ð/ºûúïÞ«‡øP19×Ў(ÐðFuÜÓ2pbS⟊rnÍhïáÚ0<ÒÖ€pI†O<»RÚ]óp-¾qÏö°G-àŠ ®«ƒŽ'ì1+IÉpæsâ8~»·‡ °NB¤&„¨ô±"ÙŒ¥fÒähæ Å 9Cñ2qâáÚRÈk”²'ùª“m4pœõ2¤~§ÝemÉî€; 72I%J"R£HÒ„ß9ï‡ó”ñ]jt=¯¯,¿rAsÓ 8ÒUŸÝØd£;ƒ‰ó*Áôà-¸Ç—IÓ×´Ô/ «¨Î&Iê¥$Qt‚±ÀiרǾ$Æ î^»ÇK„QßÃÌQ^ZÞ@>×Câè“Èç£ÔÚB¶{'á‘Èq*-±Ö )¤J Ö˜¡z3‰7èo´¤ÑX)„”-¬²RÌJ1¡RTÔO¢÷_AL£çZ ṈgW¶Ðé#é™´™{þÚŸÂ|œMd~¡jÅ)ÙîÌ¢÷merCC ³¸${òÙhÉFË…'ªb¨”ðôFËê‡ç7PØÚ1Ázüg;Ÿ.àÉ9üDJ­4ÏÌ: ‡ró|Ù ¸›Îñ`©fK¡¯Ý²Mè-²X¤ÅœY÷fÝ›P÷ÊáLùYt/A&­x[àKWضÐäã&>‡&_NŠ Ègt“21&O}­¨m‘¶b°€ŠèYriŸÜÞœÓëmss`bEÊ#¼E½I·ylŠˆ¤ÖÝ’VÜÕ]Ÿ%ÏÂÙçÐ+w²¹2¤ÌQÇ8„È(•ŸƒÜÀ´®Ÿ,p7AA)ñÕûHø°ŒåþCˆ-O)ÿ³D¸U@²zX_L:> V9Ú¥¤¾€ÃäÙpˆÛÃD'Û«*ƒŸg¿v¶ÓùTš×H¸ùMìL^ŽÇó^¹’Åüîb~Ÿ§Œii€¤uÖû£® èÀòC×ëSðWTtÀ»¼ÌÈLçÅÄÜ5Âc[x¯«1»–9óQ²Réxmžây°<.)gˆï^ _µ§P9^^Æ(,¢îÁ ¯ºb+$µ‚þ›2ÓÿVÀ[¤ãZ`ÞÄ¿e%=ÜôÚ¸öUóÏVeL1F=Ïs`zƒ:‡R°ÕÃ^ÈRyáa™‡BU-‘¶±#Æ×Ÿ<¼™{rOîÉ=Ëò–×%d'Y%X·±zµÙ&ð­² ÏÆãAAH1Þ<+È”®ÙJû/Û8M!2®Y!R‘­ò$+Ç•b¯”ÐãÑéìÁôå2ÜaUàÇ6)Þ<%æ…iŒi ì%ƒmÈé%¯—M°¹<«†ôFФR´0ç¶‘åøŽÄ;®YÒvšn8nàLÛI‹­¦³—ž5ù²&O™¦¬*kG*}‹ãÞÿPÆØÖ»‘÷Òš8žlðd¼°¹MZ™DÔhZñ°#gŠÛ"™&­ l®Ýê"áÖÊŠ‡.^‰Y_t+j^¿øÂç¥óŸÑyŽ5É«?ž=Á5ޜ렔ÄИ„Æ7«å²ƒwt–·€9¸²Îê—™û!·œ¡ˆ_Ò×?ms= >楊6Û*;IJ\|>É“ z`3|«‹)­ËxZ¯¹²erlïšb»¢–pmØ…÷ŒFª•„ÃÏ^ H ÄÔ»åñQ«ªÅ½÷)‡Ë¬Á^Ïáå!ŽçTQFà—´'‹PöI|> endobj 5076 0 obj << /Type /Annot /Subtype /Link /Rect [424.799999 222.739999 461.279999 230.419999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/docs/books/jni/html/stubs.html) >> >> endobj 5068 0 obj << /Type /Page /Parent 2 0 R /Contents 5077 0 R /Resources 5079 0 R /Annots 5080 0 R /MediaBox [0 0 595 842] >> endobj 5079 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5080 0 obj [ 5075 0 R 5076 0 R ] endobj 5077 0 obj << /Length 5078 0 R /Filter /FlateDecode >> stream xœí][¯Üª~ß¿bž+‰c©ª”}I¥>TŠ©UªœžVGÉQÓ>ôï×6ø206 °=“I¤l²1—µXWX ÞýñÓßOÿüïéÝ˧Ÿ¾˜Ÿ/ŸžŠs! ýçÔýýiþ ®Î‚ëb­ª3oº?§/ßž¾Ÿ¾?}|úØþûý‰É¾¡ùÑVCèÿûå·§wzð'ý›O/nKÿ;ñÓŸÚÿýzúëßÚ?›þº¾=©Fv…¯ºÀ8ãªýϼÔUþëé/¿;ýÖNAõývÿþ$jQ•¼ŒšÇ÷±)ëÿΛ¢ÁŠS)eÓNŽ1ÞγjÑñŸ<ýÒö6NãÜ”ŒÕ²¬‹Õ½Ö¼ë¶üÔÔòÄEétêÀ¶®+ÛQ#«4u3bq ±¢¬ý]QQ_¬îÁ¬êH8ÇžbVµHÔQ;#™A<wΔRˆX0Ç®b;U‘¦£nF,´ó¸+2êKÖ$"ù¡§h„•uaÓÏ( ÉÞÎUÁZ¥U«–çã´úµí…ñVéé"ï4›ä•œÊ²ÔŸ|¾î”ß/³AYÍ«²iG€åËAÕI*¥Ì ²Õ²Ã@—e¥úAÕP¼4 R3Ьó®˜Î ßtAjÆš£= ¿e×¥¨}±ýçë+•šÊÔŸ|¾ŽÄoÅOUS”àM’è¢\t¿N ©hÖy_L ç„Æo¦Œ ÕcÍÑjkÓñVSîû”\ÌÊe1Ž;~ oÕ1ƒ^XÝgcˆµë¢Üc|ú>5¼·³þu9-¼>¿™2‚W5Ç4)wü@Ê3êÊ=…õÈøu<ÓÊ¢øG²b”åB Ëá뤚fkþM ç„FôR3ÖíñD¬a5åÑ åž°ô¸ã÷ ˜Ö,lß§±뢬1>}ŸÞ·³þ '…w§aZ¯kŽÿXR–¬Wð¦8RÏXî)¬×éã× ˜–«‘x3J‡Ë²6k†¯ÓBÊ'‰0')œ¦Eê±æh&bëP‰f,÷„¥Ç¿OÁ´zauŸ¼ÄeY©‘©â—Ö…—Ï„Â|¬´ðNø˜ÁËŒ'2á?š”…öúâŒz†rGUB“Ã× ˜¶T#ÿ”j’—åb`&]L i9qêlœ¤pNh˜A*Œ©<¡=žˆ5¬¦<#š¡Ü“wü>Óê…Õ}jõX—åbd¤ø¥uá-gŒ:+-¼>¦Eð c*Oø&åjt/e5£ž¡ÜQU¥ÉáëL+둤š¤ÃE¹ÜNSL ©œ8u6NR8'4L‹ ­ŠÒB{<W“oiúÔD3”;b2ãŽß§`Z½°ºO £ë¢\>g‚¥uá•3F•Þ ŸÓ"x«¢´ðMÊrr/ëõÔ3L6Ã)F3­’#ÿ¨z’e9ºº˜R5qêlœ¤pNh˜A*i¡=žˆåÌ·¬gDSÏü.3îø} ¦Õ «ûÔ0ê±.Êrò9ã—Ö…WÍu>VZx'|L‹à•´ð9.õ(F•æÄ©¥ÝÈ“±«ØŽš†¥é¨›‹m8ŒÁ]QQ¯˜=˜]×q€Ž]ÅbL5‰ŽÁú±8Ð êÝ®>&‰ÇàS<ÆwOÃçÏOï>°R¨.üäó/íLúýãs nuú© V(ùéóϧß…øð‡Óç_ŸšsÕˆºÒA/¦æµ¯yûÜB7ŸL¦ÅQ?™VXè!9ë‡TgÕ’W³Éo}Mu\±‹Æûšú\ذR÷6ýBwÏø¹´?…ª¯‘gΔUóÒ×”ã/ø{Ý=;W-´OŸVúÓaÜÙÀux3pQÂN \üÕBNQàŒ‡?…€â9òzýL ˜9& V󰦱¶|¸ÇÔdäž.Òár6îBIµû" ñóŒj __k³£0ëv%–#BÊdœ¸(ìEaÙ`‹¥–yP SÄIZ@t³g›…ìE,k¨£‚¹mHŽËõ[cw‚× v_Š%ÜPzÅ+[j|ò³^#šR.Ô€¶Þñ°§ó©½(!Ú3‰&tzŬãôš”—<ÜŒ Õá,,SâìîmlEq…€Ä 4âÞ¯çfHt{¢Öó§{8YOMŽÉfÔq­Ãk+gÌq:*€ÃE,ì¶hÆM-«ËCpW“aæHâHÎP((€NÖÃ`/ºþ첡œ]qÙXìŠ]Ìå“äôlù¤/ää&‰gòNb måxlf¹ÆJ7‚ò€(Ç›ÄÛ5)bs(7@؈P—° Äœ‚ÉÄÎxœAªk®‹N-9%†p ýgBi‰jŠa]êÊnÃÂÛà˜ÃkmÊÁ*oa¹ QsÈÇŠ³6"f½Uv. ÞWŒ3MÚscÕˆ&¼ žž¬:kºžÕ<ÃqÞ ^Q ˆÛÖo†?¯´Áã`ìYŸ…ij6ð u¹¼¹¸ÜƒÉí¸—ÑŠ°+±lÓÒPât6Þ Ù_Åë¸QxµxÇ¡XN»Ã@©îŽ“ã[à¶ôŒ˜ãFg=–ˆÙqèN„v?ôÝ-Çay;âGK˜È—$0d½ôÛ<0zÙÈ8ï¹!Û©|K%J—`yÅ.¡¼>ƒþÆâÀ:B '%Ý?´Ï >rØÆ37≔!ðÜåÙyqü·Š¢Ê’’r èÃl;­Hêpšàes6{ÖGÏF!:e0K*ñtrԓМ*C֖Έ9PÁ™eÁì äYöåÓ´A[%:ŽÑvÔɉ7 O¦ÇËañ!»óIrM—Ey›$ºñ0xIÌÙ(c„N9ScJiÉð艦QÚK[V»$1 gu$@SäÑÜÒ1Þ^!P‹ÖÀ®w3îÏâCø,‡ÆáYÛ·‘µs`1‘Ô§rÖo…ž ¤x7,k6°¸góìæ½6®’~)©ÙG–{háüZx¯ü¥-£xÊÊJ—½±sÊýOñÅsžPbh’ž`zNJñ 68¹Z0«b¼!>ÏÉL’+9)ïIDìý“’O)–]¸Èô¤)GD GÝôq¼äа²vßÛ ¹‘Œò&ÌrÆñéf³üêœ7æÔ!ú)Ž™y\¦ø¸LñV#bŽF(¦KŠÌ’ sÇÇ-ùÆad3Q@Ž`C„ȼõWÆ(Îå-$Ø^Á4¬ŠP0™!ó^N²ì`yu ˜lQ}¼µ“·ÝOº7ž‘YaN2g˜„Dêì¶™ñïy5EÌqLÀ]¦Ÿ¨lѰ3à d8.gÄn\N~1» Ó<ó+ V76©ßЦørî2vÌ3‘æn´gÔV^Ö¼´I'â2œz—é„ä×™.‰Ž 9!~¨”ÛQ)e£nB¥T¼Þ\¥T‚ݰJ¹…3öÇŽÞ¢Úûvô’Þñx= Ç(y9 ;{[…;‡ µ­îØÒN§îïí/û s£Po®q¼v[иv÷$7L¿@3{æ<\È(j›jžíÎÞ ¯¨Æ0à5°pCö˜¿1•;û„×HÖÉÎòñsïµEÝæi¶k¸Ähp€u\f„¨ürzeí‘ZºÛÌáÜ Òqáå­¨‹,.‰KÛïx8ôiëÀ´™—\—äŽõÅ=õ€Kÿ™Þh"E6AT¬¸ï ž@N½PKK1PRÇ“Ä6“V×Áe’M¾§·?|Ço¸æM ü­Ó–I¯:b®¢¼tJáëàƒòœ! ¼±ÕSÞŒ›¨¤4­ï™çS†+ìí%´c;>ä´ušSf«ˆò.•°µ“Vðìå¯%1IèÉöqØ L‰ž H^ŸÇ@ЍxÀ »SÉÒÆàœŽ–ÓËCψh³îÛe‘5Ì‚±ÀKws=»«/¸F@Š÷M4/`oîæw‘]yŠRÕå¼÷Û¿ ¸¹gQ—çŒ"ètÄ7þ“{“;ôswŸk£´³G¶W–Í/^êbùR‘­½;³ÜÅ{ðHÖ‰hðq» ¸»XÄíï7ÚùöJúI©sÊkæðÞCçÞ¨Îâ0ÈØq¸a3K~BØæ—ÀÆã'ò ,Eè†;×€þ˜íè€gÜñÁY€×IÂõ°`žãÌMÏ'׳^bPZââþTGUf=Sdʇ˜X˜¥¶s|Fô߇"Z3 8¥s©*éÕ*+.{Jù¶eÌnXof~bsVÌ/äÍ¡êÄŠ›Ýd±ÛÝa‚”¤›z#¬Ã€ à4>zŠ˜ã{0Á½ë ½H{rw‹$LéÛÀ2œ.èßÌö ûô¤v&•mœÓÓ9øu–€pJÌb@è Ö9â‡y âþéø€ú Eìì­lé—“?ìŽ[Û—ÑÞˆâÃw¾ÓyÔµ¸mÞ#Ú£$i99é«ÚÞäëM?º¬[åcb…ÝË+ó¸Ó„“°-…Põp¶Pâçð£øé|‡ãë)ÏEà§¼)V๽ÀkðC×xnxøÑ|oÆáörÇÎUÃï•–“Î sóÆmð¬1]þhô7”è¹Mð@gˆÒãEPS õp®ïMV ,0…VºSI±‰¦l[æ³GÍ£æQsÃ5‰= ¤v+ÉÂHêOÝ›ÞõXèŒR¬z÷õ!§øïÁ÷xd²KWØâ^¹ Ó%en+6 õ•cêöÈ5][Àk°ŒÅÍbª€ëHòd){7˜Æ(^6En¤5æ3¼>툩 J,Óðšz$¶Ÿ(Ò[ýLçàmdTƒ~}M5ªÿ ^Ó5Køzm|hµ*qe>Cv1Cý›U ±õ ÉÚ-Ó]H‹'<>.j´CŸ4]3C×ÅD×-yöÔ)ÎDÝÝüåü_Ÿ>eâ‹n KÆ8P„ŒZ‰= [-T²Ñ‡EbYÊõ[2saš"þs÷‡S2½¶ð– !›&Í«`ö›Ý½R¾ö!7M¦|Êüp")÷{-ÍU‰"µ@™nÆèBÿ™è½D5Ãë+纲۰ð6“Cä´iP¡P›ÉaµkDÞÏÀÜhÇŠ³¶üf½½{·4ë;õö çöW¶Ás+à Ø "¹s"Äaœú,œ»û`Ù´º6ƒ0QE£.þš¸Þ˜Ì“H ”Q+œG%–srbÌ&¾lãÞãh3]H Äx”=ÀTÅXÃkàØ«6Ä0Lš·iKx—0†(`f›4QÁ,Ýk6HÛ©*KÜQÈ­w*H¢%‹Põ\íL±œcòBœÜ€Å[Ê9Þt¼w ›$g/àí„€k¥Òˆ(ÞiÊKB,ˆ"Hz K¸I±Ë¶¹âµ%¢CnˆL±Ér\¹¼AÙ¡±Çbc6(›ḆÇe7ki÷zV(ÅMö ÈF[¯§ïÛýËïã³®vaM£ŒáŤÄÞ€Åжë‡×õ¾¢C‡”gnÒ¼ÜYé…󰉓a¹ú€.Ã99`›èý‘4 P¸ ¡˜¯`ˆ ]ñ$ˆÀ@= â …Á&ž<Bò %FT°7àˆƒtŽ&ª˜R‹óI WXàÕJØFHF£„¯Q°(Éœ¤ rŒÌg”€3‰g€{£¤”ÃXSÂ`R …ˆío/êEü&æg,û¼I ‘LÂú>;€ éH)3ŒY¢B‚'E Ëh…l*ŸÊjqµòi;+T’ ·²0®ëgB2ͽIHŒë´’‹rYÇ´“V$Ò–¾—åâ|§)?ô&›6׃7¶D”øá¸)­ÞÜŠþo× —tél+fZFQöÃ.÷q7¦R¾fÚýöý­|JÚ4ÆÎf{zâ·:%ðøtø0˜ tÛWTÍâ|kk¬÷té¹C9£"\“J¡Šî§Xždz‚7k(ô_N˜8åb õ&]mO¢ÿÙ´›Z‡uÌÙë–Öa9…f<¬CÚ®-æÊž” r(ãPNä)‘"x/K+lÜ–)EÌ©†²ƒDÙ“&peçRºý{úÞ.K‹òîóãË· páY$òGï{›.'.ËkÁ¸B¢aò¬“IE1lóšËe¤<Ëë×MyÖ˜q„-¯ÏõõäÿúJvY„8óÆJ†1‘§ÕYê0:Û$¸6Ž‚mØF«÷šŸyk†ðy›gØ›Vóß¼ÂoMnÄ? 6&¢ôZ Cp˜ðа6fÅB`7së ‚êº2¯Ø2RÁñêp:`˜v Æ–ì\èªkk’ü¯P/ƹɠº67Lp {#ŒC¡.HC&vüJ sùóç%­rÚuÁã˜c‹0ìcx”A‘žq05A”¥½ÊxN&†zÕ·ZqèÊCƒ?N/Wècjµ!•*ä™u©Â—‚Ò£¡ò›_ò1¥½rúøô[b¬ endstream endobj 5078 0 obj 5364 endobj 5082 0 obj [309 /XYZ 39.8400000 414.739999 0] endobj 5083 0 obj [309 /XYZ 39.8400000 414.739999 0] endobj 5081 0 obj << /Type /Page /Parent 2 0 R /Contents 5084 0 R /Resources 5086 0 R /Annots 5087 0 R /MediaBox [0 0 595 842] >> endobj 5086 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5087 0 obj [ ] endobj 5084 0 obj << /Length 5085 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWø`<"%Q"˜¯C€Æ4CC0›M°È,ÒÙCþ~ä–ìö~¤ªX¤d·f€iOË¢ÈbñÕ«b±ôþ_ÿ¾ÿçoû÷Ÿ¾þgÿmúùéë®:T¦ÿìß]þB÷‡Z»¾=h{ü³ÿö}÷¼Þ=wʼÜ8ý.ž16øÛ·_wïLJïÆß|ýôçáÓÿözÿ§á¿ìÿú·áÇOS{Ç/|ßõÖ?ü{ü ´ÒýðŸËOÇ‹ÿÚýåwû_‡.ô/íÿ}WwM×¶:©Ïç[ÕËßË[Ñê}cú¦iöJé¡Ÿí Žÿþc÷óÐÚ¹Û(Õ™¦«f·Úéc³ª6{Û™}ßT^£ÞØæ5¥R²]+ÓбG*mhªjºpS\Ñ[5¨þq˜¶Mç¹¥TYe¡†ª£4RF6 ·Ä–{ÝÙq]ò0ÏM¥6Ô6B {¤Ò†v’¶uxblÁ Hج€Äò,„ÿBè‰GHeÚÊH/·yYi ÌÁ||I`ô¸ï;טyÔS=W¯k—›ä%:^WâQ>Æya „0Éñ*ë-àë6>[²6³×ÁsòõÛÕbzl+^y˜‰HXN|×{s L^È„Ó*”n2 ƒçÁ”øÇbÆ8BFਕq/¹¸{Ïr6ñú‰óu‘˜Ý-Rm߯p`/Fw­o^@©‰]*¾È2Aó££c)×hªëñ«JÚc:ó…7ˆj¬Ïg*eœ²š®ÕŽ¡ à®·Ä ÔC"¦CñLâa\Ìa£;$.z-ê&`›ÈާçúPcÁz1¶S"û;"‚Íc¤p«®(ü°‡Î 5'gø|ü/¯xNñªå°˜¨%#L‹êŠç re·RjLg¸ÔÅ)!(rÛÚ|ÃÉZœØ:,¾&êÒà¯rv·8Z1?î%`Hf=öˆv¸‘Ï9¹ØTÊüŠ'Cáb ̧DÏà3J°´/œs¯ý´Ås¶X³+C"1õñlH‚UçV޹$lÇHAܲrÂlœ˜KÔZ5S×½­ŒØ¦ ÁE ,~8`ž#îISÇdãsJÏöz3-JžN䬗-•žaÏVFÜ·¶wpŸ%0Fð–°zD<ÁªØ¾µQp>ùÛfyœÝ¼I½u²ü‘àZ,ùzÝMçŽú¦}Þ,yN¢ˆù…ÈftÀ)‡éšøcˆ„€'—ŒL rîöwÞB+äìþqX$+¹)sžAœè ÁÑ&øLŒ£A)rElkkWûùÕ…rl3‡ôäCž”˜S·Îpަfœã©O’+>c$wKL%Üá×: ™‡‚jFAéÃØ–qŠ^¦œ£Ø`ÙÂLK$ó†jxN«£ï”l½îœI ½3€›á·{’vMÎB6GÎíDÛ: XëÜå˜hÌVZ8gÈË<¦NÆ©WŠ=¿¿¢š «±¾eS¬7ð^°´kBPV)Ï•,û“3Ýô{zåR„£ø•]ЄjoƒyóÂï¢Àh)š» /Å$üèÀâ‡Ñ 7k™sŸ3ÿ¾w]uP§â‘cF]-VQ ªÉYDÛO™•ý°ÎI‰'ûîJfލù’Í-X7–ùµi¬7‘‰îíÅOÉy“·4„¼û¤·Ö¬±¤šI¹—³Ùˆaj~‰$ÂnnU+œ—€ü…œÞÖ¦—9¬2«‚Ÿ'¹ùKƒsN¶,Ÿlü”Xiñ“÷™Î·>O8 Ä]n`H†ï”U>K ‰Ñ³"!ì<ÕhÄF¤·Ê1"…6ÖüfÙ¼ÌÌÍd ýRæ“Þ„fZ_}‡ïƒN§Dæ3SÌRawe‰˜ äâv™ÌÄ‚òJˆüŽ”vÐ!iKÊãÛQÁ¸sžÝ}­–X_I›G8eÎ9LjJõå³8t¿—Uĺl[üôÂá9³i;㘤7\›¼`˜FŠzh|œ&ÄðJ\¡PQƒÀsÄvgH¾>o8â’%¸0>Šg Îp`îÅŠ_ÍHŸ¡U¾(X,¦y=U´¸¬ÏÁZŠ‘Ÿö€½^ýl33×<[->œ.:5<é³öylÏ™NkžG K ló8Í£6§§âÂPbý‰ÄhÛ×úƒøåqÑhUîðcANj¶Â„¾·s›\ˆ&Æ• ^aõ@¶„Ý[+*“}e­õôð ´;—Õ\í0Ã^¾ ä ø·†v =ØÐnC»$´ë^Ý!¤åع7´Ëâ©Ý Úaélh·´ ¬¼ðxb>X´y|5–µgx˜·‰ƒð¤³áà†ƒ"Ÿ]Ó¸Ë|FêH½Q÷ÜT 9ˆP‘‰ð¶­„†LÅ!ï"í\ôu‡o%½X™™:®œÌ8߬ô‰6ÜÂK‹ ëœq‚Žþ¶Â¬‡9c,òàß Š}ˆ¬Óù©¤¬C£À•(' ó‚À”#óœõ#RÊ›a“^3{ïY• ï*¥¼q•pH\ôåäñªíyO¦S\"”¯À!ÑÚ1Nk¦Ñ’Yê÷Z¾¦°ùŒÒê^¸Ñq ®×NÎ@5Âco€ T LYEKè_Ϫ›rßóŒ¡gœ² =Åþ_AuDЉ³ÞÆÎpgT!òFE˜@Ùw‰bÑ’îp±´ÌR&áÍú•W$©Þé™FѰåMÃg R[—bFö”&žÉmÎS$¯3¯¯œén°J${°P„„ ÆÇͧbaÃi~zú&>Ö~Á|c"+ååÌ(¡EËhŠ!ð”.^óÌBËK0Ò„ÍT¬,P7¬­¬c<ÖS˜'w(†÷L ¹L©–»Þ*5|Ïw–AÅàã•×O0I9…œ%Ë>_Å3íFÏé #WiÆþmžÊø"‰<”º*Èy{$¡²v ®3\Ç’çÓ{sª±æšI8“çÔ׊þœŸ«)P[aÆlõæfKW°5|Öƒ‘ù¾ŽÚW¶jãú»¸fê¨à¹gdâGOf.¼‚¬>s¨­RÙ(‘¦NÐ߀öàø¬F|¢ˆS‡ŸXÁçN—_'Pc׌"øÌdz4±ÐüÈž H”qVoâ//ˆ2üÝ?Ð1ÀÂñ ÓoßXâƒPõ BA Þůð¨a× [eÆô‰}]A}TjcæzBºm—•îÝõ¼îÊ•‘Ö×õAÛ«ûm{0£#ñz¥ƒÏéá=Þ3Fd:}ÐÃRÖ—÷|„­àvù›Ïð»SDáÊÐ=SðÚ…Æ1yÚ´{¦£Œ}êÛËHкãgݪsé¼>¯£ëºõ`£ÕxiÆÜªÏH{±Ìµ‚}ÃúŸƒÇ£¾0žÃÑ.¨CSPðÊ导>cšHšeÙyÁÏ™â¼4éãñ04ƒƒç`m‚2hw–qŸ¦(Ò¬ïtÅÓ«€bùx­\ÑW,©‹m†|ìûÊÔñ=¾?%6‹g¹&°‹¬ñGI¾²Üý^ endstream endobj 5085 0 obj 4040 endobj 5089 0 obj [310 /XYZ 39.8400000 233.299999 0] endobj 5090 0 obj [310 /XYZ 39.8400000 233.299999 0] endobj 5091 0 obj << /Type /Annot /Subtype /Link /Rect [80.1599999 611.540000 124.319999 619.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 5092 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 243.859999 534.240000 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects >> endobj 5093 0 obj << /Type /Annot /Subtype /Link /Rect [134.879999 243.859999 348.959999 251.539999 ] /Border [0 0 0] /Dest /#e4#7e#c5l#1b#03F#14f#de#19#b5#895#b3a#ab#c37#b8 >> endobj 5088 0 obj << /Type /Page /Parent 2 0 R /Contents 5094 0 R /Resources 5096 0 R /Annots 5097 0 R /MediaBox [0 0 595 842] >> endobj 5096 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5097 0 obj [ 5091 0 R 5092 0 R 5093 0 R ] endobj 5094 0 obj << /Length 5095 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·ER% °3¶äÀ°9Þl‚Åzgùû‘ZR»›ìdRÏÈ<ãV‹,‹UÅz¾ýó§ÿõûñíó§ÿ¿Ì?Ÿ?ªSÕVÓŸãø÷Íõ²;)9ýª»æ$ûñÏñË×÷ã·ÃÇÃÇáßoÑž_œ —)¦ÿòÛáí4ùaúäÓó_‡ßþw”Ç¿ ÿûåøã߇?Íã_øzèúvüå×é!…ì†ÿ\ÿ6>ü÷áo8þ6€ÐÇÿ}£tÓ·]ß.¯ŠóßëWÑdÕ±nû3°Bÿ4:þûÏÃÏÃh0N}-„nk]ªå8l§êc¯Ûŵ5¨µ¶À¡bê{f "·4QÕÚ=õºªênZ¦Rq ½*v 1ü'É@#D"niê]C±Q¯ú:ê/CÅÔÈ6Í@#D‰P‡b£¾ÑÓáî›h„é$lBW­‰¶p€HD­lA<‰w-å´H½ÌËP±u}¢FˆDÜÒÌã¡Ø¨ïë‰Eh[n×¹Œ‹0Q‰> æGˆDÔÊÄѸx¢k΋”U‹¯e¨hÄ«^¥h„HÄ-mƼ=ÔÇ$z¯ü®÷~s¼øôùðöƒ¨U7ªùŸ 9ߦŸ‡å6Ç7£R¨ëã矎¬*õîOÇÏ¿úSÓM—‹ùI~òþó°‚8xzL=ügTI†›Â<åóyJ!NMÝv8`ªöü¤»| @_­ÕùIýýÝgóƒéúT™k¶¦©´ùAwþ =IÑï6Ó4§zôûa*!ïÏOšá:× Ù\?±VQ£ù¤4žÏU¶sBÃÃ'„}Äø´6EÔæ‚Íe©hÛÄèÌiÂÑH 1uÔïSI‹Ne'–-ª‹¨žÐ“™î=iá“>éèïH™tuÅXO)Œ*Ÿ@Øf¶OÃ[Ò'óÁ'=Á£©àhÏŒÝ~Ÿ`zcPž‡C½TU„׈ê²[OgÔöúý)ŸGÁ ¼wÉûÒâmçp/Ã1¤=>%¬Óß‘vfì”á\ª‹¡K,' 4¨8ÜÓ ¤K…aÃt 9ŠÄ¼“¡39hlüfËœK@=˜EUxÊRUÐèeuЄ³>½ìO^Þ“´<€£ßVXãap|‡lc@¹‡s9ÖÃÁ\©C¯Áë’2ô˜Ž¥·$qÏniYCc,©Ø(‰ ÃáÆA‡…Í…~Kx2ÁŒO1?®¢“aÍÚrFZ½9§½O)ÈÎÞR‚EßÚ§”ÖyŠa;Hà ŸÇƒß±Œ½„Ã3j{«JÕÔ&¹&3Ú¡#¢ZkÎdKÅsvæœá4ïØ4ÉYG ;­N9ùÁþÉ'8f}!ÎS‹Qa¹Þ8X “¨;u}ÕÞb|^_³Løý V4žàB½¬˜%ø­åx¼ Ü ‘E. XÖDïÌoxWå °…DZ%xyk«–™ËÚ5,ذn[™ƒ`~Ǿ–†‚˜XF‘ÑÉÆë³n›[¥`Žf}øÖ™Û Lí/€}`ÂÒCç„€¿Š™âDÎäa-æWmöK@Ri抗Uç>ê‹Bæ¼YG`(øøBÐDe³ ÿ²ð­Èµ¿QÆvæ¿ÓˆÖœs‰5†fß¡°fï#ÛÌ{Ô—ß#YYs–Ѹl›‰?2•`R°t%K7#paòY«„J‹ÝÄXD}2%%àMÌSlp-¾çÓ„Eq:†âÃÀ¡Zž'º–£jaHðÄ ƒC)§ì²¢i:SçÊE…8µYË“RÈqRMÊ·¨N­7øT‹®Æ=?±8ÁÙ¹ï@¶`‹Î9² Ï•àd$¹¤ÅpdЋŲ—ZBÙº×E°%Çá² [ÅGÑuÚÔ­³»ñºÞœs;d˜†]•9}k^ObÔæ ìõóÎáð·ÞŸ9níž¼°4úì'vÅmÝ=+ìÎoÊhÌ9ýDìG#Üm[²÷~UOß§‰ê#½öIÆ$\ ²„µµNÿE–šµåUNgþð±q*¼‚Ã<À~“ÂàM‰“aÜrlÀär¥%0Ä Ç©`! OvvHºpƒcåÙYò"ºK¢?ôDÆD .eö „@ÞáþF›«…^IŠyí׊Ë|¡Î$Ç)f¸‹ýÊúÖœWJôÆY/'­9ýÑH˜„¶ˆaÖŸÿ2Ì)TknÔÆ.,u# qj']Ë›º˜Ód^™bØ1Ê2´óþ4¼?E^¦È+ŒFBèÇXb͸6àw(¿p³ '”ãèYËEÊñCnB'–pëò‘GŸÝÃ_]û’“‡u„¸Ì)~33g“à:éG?¿@Uʯ0bb|-11Gátϲa޾µ Žçœ4¦®¸¶mSÒIÖÒ ü]:%‘Ni¯6«%Zû­Æ1QvŒÐ2 nRdÔ1â ">¹Vj1fV‚dxÈ)fåŽ{¨?€>"Ãî„YD^FÑÑöÝ.:rˆŽ$žgÊ^x1NÉVÜnâ^ž2Ä&K°Šด Q1’œ£“9T‰Mã‘,pw•ÂOficù³ÞŠœ–רºíÛ0}„cAˆéªzÉř׆õ1#šxB¿°{”X<#QžÆ£9f”Éë~=|ÊÖ'µIcg‹…£¨¦Y0ˆKo$±àp²²9ódñú8¼ZÞè–ÕÙÚzAîxåœzä#£„aù¯êñÙqõºêA+÷ëü1²—N@INÑö¦Œ¿B;êÅDñ&-³E¨¢“–ùœRË@oZøjÉ Z†( HØ‹vå)Ú‘ÇŸ¶hWJûoq/w„GžcV7š¬ì^ MP)StìvÙ,vY›ÞÈ9ån™úbžO.°P*wÆÄÈ“/°Ýý•è6/£¬jŠÔÔ®û¬E‚µÉr8 úvrüw‘—ô>ýÚDƆÍZŽÈ¹¬ ç„+Áá?ŒuÆ”t¦“KîþHÁ’Ì JÛôð%5¡ƒ±ýsõÿ+ç¿#à‹5GÃLêà ÄÅùMS°~׆‹—l*]Kí§aœÉ‡³ÿpƒ7Fs§R­]ÎsÄOpƒ¸¹Øk™½¯ÛØ{…››A¼ü˜ÖVëÎÛžyi¬Ì·ól †Û£á³å  ˆyÇž$« €‘ïy¿œF{˜²1]1Ú÷r°¸>÷”ß9öž­b ‘WoÍ‘Gå`âÍÑ<ÏÑð{³s¼+Ç!›K(} -Åã8h.=uÓT§c˜h“B7lOäx!3W ö?)¯Tq©˜8Àˆ’­„Pã¬=SÛx-G{ÒÃ4€U°"EÌäÆlP˜hiH“íXÅK{ZQúJØ‹¯Xña†lTÚ/Y©Õn–‰S|Rêü8L•ذ)Ó¤^…Ÿ@Ø4 /(˜Þ—FƵ•Ãw¯˜^€d‘½ŸÆ|OÊ@Zw…Ï–àP6v2Œ8øNšÿò¯+¹Lù o.„(,B2?{ÝTÞ弞8ƒP‹ꀈ‘Ʊ(¾Wãï.yWЗÈíW¬ñnXãĺÎ~¿("Îf¯ü{²ºã~Úȱ÷ƒ”z€½L®¸ N]ЍìAFšn³mìAåý´±mxè `ÐF×ö·³®i·é¥º2ijÁ¨Šuº¯ô½Ä‡¶æìq©[S«U¸/5ÐäBF¨AC0$bóVÚêÔŒuEÕJJ‘a•Šgusä`ÀjY01§lÂ<­„R¨F¿VôÚvê¯q¡méK=€9\M»Fõzü$ªÊ-§ø6¤BûáæœJtÁ¹K0Ç2nR¹ƒBµ¸‘o߈ÉvÐt ‰IÀ(§;ò€ÊV uTµÉè„ïÈŽuEVŽYoŽ¡ÐyYx–̨p˜ãHüÏð‰‚&U `v$8ñ l~ךh—V8Ž*¯®…i Á°Á4RV]Åð½¦Üó3»GµŠ¾Ç±&ñåqT˜ðcEèA)›ŠMÓ^7S­!#Ž!ºpi8ÍÅ™äK' cßR”C]«°.!Ü("óxSò«D2t+¤I6Œ¬ÅõÐá·©Ye(á¤+âS4³MÓè׊×qFt§ «Ùr8÷ç9*F­7‘=×mn~í:q‹f‹(±áâ¬YØ*§Db™=Qú–GRN_`9Õ?·~Á{‡i‘‘”Ï*bÉh“âX)NÕ…¤¥Î r4‘a<ÙxÁs!õ¥ÁŠp %¡û¨´bœæù»„žO“’°[%%´j„ŸFv ½KèÍHh¥/³®^€ZÔ²67;izÁ«5¦N¤%¤ø¤ðª”ÎŽs˜öS¦W;Üp—bʼl˜œIlö„x”WçŒN’-ã•Áó嫸{ƒ·†ÌÀeœH¥kóãð÷ømu€düÂüãËWR ÐUŒÑG粯úcˆÚ£–q/²íi Ãv>T7þ.q)êÚÀù4¦H³6ÛŠS¥öªpoçÀ·;Ô‹q>Ü݃ Óœ¯G¼gÌá.HC3ã½óDØçŸO%’v9í¾àyæà.öñz”ÁáŽy05AÔµ¹Ë¦Y ú®ƒV,ºrÐ Æ5ÊzŘºRq"øc׉ú$ÆØ·[F‰Åâ|ûª5z2ë, õ•ãÇÃÿP(ef endstream endobj 5095 0 obj 4286 endobj 5098 0 obj << /Type /Page /Parent 2 0 R /Contents 5099 0 R /Resources 5101 0 R /Annots 5102 0 R /MediaBox [0 0 595 842] >> endobj 5101 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5102 0 obj [ ] endobj 5099 0 obj << /Length 5100 0 R /Filter /FlateDecode >> stream xœí]MoÜ6½ï¯Ð¹@dñC$è¡€a==NÓ"h‚º9ôïW»’íµ¸Z ).¹fÜf7æŠß g¸£‹Ÿî~¯þüV]\ÞýS=Œ¯—w›¦nT3ü©¶?ïöÁM-øðV›¶æÝöOõðeóX=nn7·ýߦvŽ/}ãÓ-†¿=|Ý\ 7ß ¿¹»ü¥÷_Å«Ÿû}®>üÖ¿|ûÛ~àËÆtjûæïá ㌛þûï¶m~ý®úÚ‹`výnÿ~'´f¦1^r<>_Êv?û—¢›5•ÔLjU1Æ{9Û^ÿþ±ùÔ÷ö,FÝIÆ´’º9ºWÍŸºíúÿ•‘V§ÖØŽëŠyvÄYÛéhЙßÐX#µ»+ªê9g,ꟻòV½éd˜Ž¶…Q½ÝÕmeÉ_–å£ãÂ÷÷›‹&…Ù²Ðý§^’• /÷ýpÛê]¶éªûÕ÷=Ÿ‰ªûÏ›®n;¡Ûû†þµ…ZšØÒÁûÀ&—_ã඘å-X6Ö†”€A]c Ä0s×÷=öVGRo…f5[0úšËåHx±æyHÍãÞã²1.±vãÁ½aí`àÅ!Á po˜¹0£@ l‘MH„ˆ.âzî­Xäõ QAY›Ë@Yéºp…žm܇¢Ñ”E`$b ®à5˜£ ‰ÊO¦-üäÅO±üSu}rÏB`ËYèÍp'ÖuXNsèÎÇØ Ë®Š¹‹Sô`U‹J[Mo¬¬À¸>ŠââÍ­¦°v3þóݧ+É=ð"®"Jj¼]ùÚ˜~£nUñ½üFG>{z”X3å>”,>åÜ ŽrbÚ©û2ZûäMH-”Ø%ZMXM”yŒÊÒO<6&Ká‡Èóôö?ÑL| ¶Ø7"Ø0¯åÈL-Õ™±UVÇ´,²Õq 3 öÏl§áØWb&¦DÜ ;Îê·¤œI9¿˜qßÔ£÷ùÖBž¶?é7xÇóÒ'ƒ¿Æ'Þ—g ÛGó ;Ê ‡JhÉ6²Ãû»ÅfÜ,ÏFÙé#Ç:Ñ„ç4Òz>7òÍÇ}p¦ë€ÝŠè}ðÞqÊÃûàòâå<½“ïs“·ð:úéÇXü€³ÅZ»¬5ÿŽÈqÂ1(‡ k÷ð÷¢p' »×erÂ3¡‚ßµ·”ÍpËÎ2ZµŠ·ûS?,@3Å®€Ÿuµ¥º‰è’€Í°õ|fOŸ¬8“[Ô¼ÖÇ869¥÷6Š'k94X„|h’5¨š3st‹%ì~d=¸I$£ˆSÌŽ3dŽ—u]sn&³¶Š•Yw\Í⎠ŽãOS÷"x çtl[ nØ+r´X“‹?ŠolAÆ¢bˆÌ圹×ë@þ¬©•Þaóei<]–×[¡At| „ùæøy_2wœAÐ8T`‰5¼hö@±Ð8†ƒÕÇe Ëo¦ë5âf”KùZâÌ )¬ÌÀ[?äN9DÇCøêÚéCUi„¸òI,•‚¢.Ùò,&˜@!sKÞD ‰Æç+åkœ¹ÚçRþ¯”ÿsëú K<Õ'ø^h¤ã“Žƒ9„´©ÌNIº’€¸7\¸[J¨ƒ<­Çv Ç-°‡A‰àV ¢…'XÊbYRIù ý¨È™íÈJÁËYŒµ¹+])\tŒ­,/ƒÇ©Î¬àež>`)Ÿ9ð d±KNåù‘R>ÓÉ¥|f)Ÿ™Œ*E&…Ùxÿ_ñB½¬uEÉJùÌT|™.v!³”ˇ$^>“·ÌGó1Yº•ë<>7å³p¥|æZª3c«4¬N«¢—µ)å3KùÌ$f.åÒ†Éó†ñÉ@¼^Ê+å3éøWMô‡PZÊ9£³+Ÿ™gÆêíxpiÄ'ý¸å˜1 %Ëão×Úgd[Œ“+å“ÈóŒqžÖ-õè®2>±ø˜L¨™Ï¹È<£»¥¬kÎG-b— ÏóÌNÙ»¹¬[ž» R$6…ï?¾­"±ºõÉðDõe:Ÿ˜Zž¾Lž<–¯÷aXì¸H)9›¶'«äìÛY饀í, ŸøeL›l4 ~×™¶rÄ0õŒÕ­T¯Ê&Úå!m-«s§ø££d&ìÄqÍñ…1­rzö€§ÇãiaC&`Yÿ[ÓçsG^»<û„}ƒ­R,î+{v8óÎk>¢a­šLt)Fç æYŒN¬ÎB˜)a,ØIPl1 ¬ÿ´ññMaØ1ÌV4ˆw¸N80#7‘+øÑq,Ë´tsZöï]Ñ ódeÇAÝÕŸ]¦„˜e> ÚyòĪSrêœüÑëÏ©æ|:jàó­)„˜úàKÜÊ [±Ìxï~ ¬ %DE >â1ó±£0¡¢5ž±FJaƒgÛ~œå"äx(‰·%“»_ø¡¸¸ûÉÝfõ+>…ž¿ â˜÷ãÁCJ’ÑK¼Îœ¼Ý5S,k>ÖÈ)šJ§dqÂdqpþƒbùçs&dz6“Ö–ùð`ì„ËÜYƒAõ?ÕcÏD=Ñl?0¾<|qP“ÍiÍ §Ý:YÍyé,U±~ŸVËT½e%šç‡x†N©Z>ÒÉ䓸®õáx’>Ð2Vˆº'äC3Ú¶VÃôLtè>^ÓÁk†5«yͱmziy{ð¹ÿ›+øÙ1át`„7èš©‡ZǸ"–]3ÎØ’±²í€ê¶ïyËž¿\ÑÂûéå8`;ãVÅêfh:bnÙB/Ö9gP6Œx<vM¸]C£a9ÐÂìõƒ×çÍrØyÁ÷=eÚÇã! ƒÂŽû`4AH9e,¿:þ³¬X¸r`ëÇêå^±¦öv0ühL£j¶ ż&JlÇç¡–vßg è¯T·›ÿZŒÌC endstream endobj 5100 0 obj 2583 endobj 5104 0 obj [312 /XYZ 39.8400000 748.819999 0] endobj 5105 0 obj [312 /XYZ 39.8400000 206.419999 0] endobj 5106 0 obj [312 /XYZ 39.8400000 206.419999 0] endobj 5107 0 obj [312 /XYZ 39.8400000 748.819999 0] endobj 5108 0 obj << /Type /Annot /Subtype /Link /Rect [300 759.379999 326.879999 767.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 5109 0 obj << /Type /Annot /Subtype /Link /Rect [312.479999 233.300000 356.639999 240.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 5110 0 obj << /Type /Annot /Subtype /Link /Rect [274.079999 695.060000 456.480000 702.740000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.hpl.hp.com/techreports/2002/HPL-2002-335.html) >> >> endobj 5111 0 obj << /Type /Annot /Subtype /Link /Rect [372 540.500000 412.319999 548.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.oracle.com/technetwork/java/index.html) >> >> endobj 5112 0 obj << /Type /Annot /Subtype /Link /Rect [71.5199999 216.979999 258.719999 224.659999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.devx.com/Java/Article/30192) >> >> endobj 5103 0 obj << /Type /Page /Parent 2 0 R /Contents 5113 0 R /Resources 5115 0 R /Annots 5116 0 R /MediaBox [0 0 595 842] >> endobj 5115 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 5116 0 obj [ 5108 0 R 5109 0 R 5110 0 R 5111 0 R 5112 0 R ] endobj 5113 0 obj << /Length 5114 0 R /Filter /FlateDecode >> stream xœí]K丑¾×¯ÈóΩ7°00ýZ` 4º=>ãµÆŒ±mü÷W™R>ŠÌd#(©*g€éžR‰"ƒÁxÇÇŸþãÛŸýçá§ßþïðËòçÇo/Õ±êªùŸÃéßßÝÿÀÇÚÎí‡öhÇÓ?‡_~{ùqøñòõåëôß/¦;¿¸ü1=¼|bðŸ¿üýå§ùã/óO¾}ü¯éoÿ:ØÃNÿ÷·Ãþ8ýñçe¼Ó/üö2ŒÝé/¿Î1ÖØaúŸû¿þïËÿÛáïÓ†ó¸§ÿþ®î‡z¬»¬yü¸¾jÎÿÞ¿Š>Vš~¢=c§y¶9þñ?/™F»Nã86Æô]ÓWɣ𦙯­§÷Co-ÜA½µ%eòGšÖ!4’9Ñ#kq•iƒ#ñiߎͼÌ>¡×±²Gš–"4ÒiN&su õñP|òU;/´µÙK½Ž•;RSµùOs2™«[ȇbZÜ´N;V‡±ïcËŸÞë‘2(6TÌ@§™¬•™ªéƒ#±éÞLÿs^d×ç.ó:Tî@]ee:ÍÈä-íByo¨¯"Ö€½Y?/~øþòÓ—ñdù|ÿË4³ù4ÿñý·—fúŸéPVÕôôχŸl¨Ÿøþ·—v2©cÛ³½µÎOn?há¯ç'ÝÑšáü(0HwþÁpýíàÔ¼wëóúc5ÖÎgÜQMåü ú ?ƒ'oá÷Ü©™Ñýž;£ÀgðHqûÙ]p7'}fð–ã½ ?S7î»ø3x®½»`0£Ïß§ƒ˜w¬Ì$èÁɲ­qŽ–™÷h<¶Þ”?Ã'z²¬J`H6Øat…ƒÇÌÞáap¨¿a¸ßµ_b‡ˆr¬ã’gŠÆÛ¦;­ Ïݬþ‚(b ›Á]Mìd*²Ád8¸l¥+–-pÄc4óÁÝfoߡ]YÒŒ³͇ˆ\x$K>Â'#zRÇäÏ£'½6K¶]“L"&ˆ¯«±ñ{†ñŒ|…%CT»zúÞ—•éÊÜzâ`"|š…fuìzóJhÖæTb÷ŠŠøI–‰—Nß¦Ž Žê‘4O"6ÎXŒyïÆÔ¥âñ&·É9Þé&c@«š™!í…tøœ‹ØÈ™Ä9” Ï¢&HÔzH<Š•þ™2FQÊS±X”­Åg·íëM{ ŠmU¾e(vl ô[4ŒéJùüž®Œ5»gähv,½ f ‚e¼âjp™wo^qÓ¹+ˆ:õåôcÖP , Á+c‹ÞtA84x&éÑÊÀ ©¡$–--2yí u'àMìÑî÷…-ù`im lOzëó$‚·Štî°ŸÜw££®nøwÖº²î˜çç&øa©ŸVvÊðœ¸` ¦Û§žæÈ÷îyöy磻®•ÉHâï¹âÂŽQFâ³´?òað^x³± M§±ªG—icÌ£™}Yœý¦ÉÑ ˜Çñ.1Ø#`›1¹~”,êhÙ/;GÂ3Á䋇˜9›â[z›XÈP×wâ‹c'DÓÇ~ ï°—z–¬ìÀËóŽÓ¤‡ê½‰èÅh)Ïýdz}ÓÍôø$™_KèÀÒ 9(#8‰Wk•vH&#ÏÛ~¿¯Æ+©3i a(ÉéÞeؘ`íÎѺ„|ŸcãÌ3~KÂiáçu·ÇÓû'w¾¾ÿÁ¯/ߊ×7ž¦àØO„°ºhÜQÄÇ_L y#ô‹8êË'Ý’õÎpï’ÔÄ~Yú¡ß] u zQuónÏgÔÚ+—pÃûnG_:6_<ñ‘z…Oª/ðÃøjÞL¾<cåñ3zâêÙ/Þg0ÕZ8o/,I²LQó¤\ª®Gs†ÇwVO‹ÅÄ5Ð8¬áw¼ÉVêVÔìæk/Çp^у,B<A‚`áðÒKr(‰޲!Ø“’µm^ÑMBVh+±áÓˆõ=rrT»ì¼wN'4¼HÚ;Œ€v]Ã'¶È©ëÆ¡”nfxeƨûÎe XCŒëq"P­™ ÇÂѶÉLÍ’é1›0¼ _ÀG³ß¥êTJpsÛ™'7ëåá=%²=n–)5âTl¬œ}n<9þTð³ÏKì'ÀÅ8 D ÈfXᬚN|À” Xz1X æ^öPzânJ3ÿª=΄ ÅRO$“§4½·£€;ߘèA d¯0I½ú©ôr‹E )Õ+"9\Nd?£Ã~ͦÓ÷ÏlF¡¿ÙN¹ÕB/”2¥ 1ròŒÕŽ,饌SÚP wl¬q1Ԝ剱§y\ø¶q~>ʈæ|{w¾ô:”¼Õœ†3‚w”SÎ#ÐQMˆåSŠørˆÐŸËˆ‚çìk`jËgu«ég¸ eKË+2u%Dcé•c¢ä€ˆØY•àä²E…jŸ]MFàëO5µW¬€«ß×l%̹¥–ﶺ§5ÁR{£T”ŠM—ѱlj#É(&BßÇLS1d8Š^PÅ&ðKÿÛæ³¥`»€fAÃR–"Š ­ ,,娊('–ÕWÂg° (ˆö¹ñ«8ÛÀMmé[@Åíñ¥u­½ Ë"¬*…£<ÁÈIóØ’€)Ë9vÐ1Ïéæ[¥¨iþRÁÔÁ=Üœ2å¡‚ìZÓùN¡H*E…$§!“eÖ{“çÀH˜oÖGÆð¢ ýø^,ƒ¬ !nwe kFç§wæ}e ªÅ£ÃgrlÎíeurÔDŸCå==¿F)×Su“šÙHÛ<%³ÈEàÏÝ>€3‹7›ë*L¨(¼C(Í€zËÔOßBjãòMÊûç»+DŠ{°Í²;ú€ßº 'Ž,z¨A”ö3ŸÞ™%”¡`}ÒÞ“2(a ætµWm†jA¨Æúþk Tœ¦à˜¢q¸ÈôÊhÉ`¥¢A>6Æ¥CDSV?œ¢¨6©Èv¬ê«èù*à±=ÃX~f8ÖKB PUK­Þ5åç"bOVK1„.ÿó´?Ç•H´HkR Åàœ‘e¦™`ú Y'ÔÎh§KÀæÈÉGèÌH=#îQ(]*rIg`+ÄPÃ"V€­¯ü»ô6›: ueÎúŸu‚ òÞ¶.§l&%V(€aùëȰ \Ëœ“ ϸ CDŸárxŠ R-¥¢Wê ×´FWÒQ¼Ñ¨¯ÁñÃâ–v©"ÍÜÐ$[¾ñ&l µºÛ()ºã›PðG4"öé›óÍÉY‹w¶Þé]»Ë›`qmoV™áJ øŸx¤pñ4’ ” %ü-æÎ¶×ÙÁÄ\N˜C÷–±7âgp.'áT=qjD%"w«#G1ŒŠf ³²TÇÜÎ1¥žfÜ\†DW²<“qI†aÔ2I< ÿR´í4Áåð–嘲]3OÆ¥i¤·KÒì”ê\­²™tÕ.P…UÝ".¤D#OVSú³2.žrkÜú?=°.Ÿ|zô’½dwZRH{kÞ˜"ïÚ0üŽyÓÅË_^)ˆp‘ÏSf²VYóÉ„eÓ$‚¹¦sËZŽ\ܰàÈJ” àJ† –ú åhƒ]MW¶œÝÆn¸¬g™ŽÃ™Uè´™«%Exß~.(–ë,àéÖׂOXÓ©V­:É)üÒ½ìœbD F°!ÜH†ÏM*µ è†,m>ߎFiÞn94½½,ígísÚ î'Ë—A î²q°_}k[=Ű7S7îÆÍó¢Úâµá!„á!(íyÊÍix}:Õ´*ér™’§"·š¥­]*rA<ÕIÂH Éb'æ\Û™1ä'ä„ÌWËXkõ²šø½U˜j^Q'QE(Âme0Ö…04 }—jɦÇòº±— “, ”ã S*ìM3¢Q ßÐ"ÐÌ~Ç`¾ £ÁXP`¥8Fƒ¿ƒi£Q˜n8Âù-À!˜¢xnøoÁ£aŠ2Ò<s<ƒç¯”³ Þ»ØSœ “=§x·Åà뢸«;Gس¸ùÃïpˆᨠZÅìÇ¡Vã¹á 2gðLkÎÑÀ‚#v4¤¸ Óï)GÁCÞ± ® ì6Þ…®¤u×´—åqì$|hŒÉb?ά9bƘK?b c%Úzðw8³.¡ëÞeæÀ¹cH2<6M0±vjX3LÇÀ¬1 8õSXØà¹aº²dÓÀQ›úñÑ â{Ó®J)Nä;>Bê5° ¢'xá·B¶UWg8$!€54Þ|L`|ÔcÇI—Œ¶®2fL•f6Éaøäãõ`‹kõOR›©Ih«øEá9w[ ôÀ­€PJèŸb õm¦¡6J‚Ò“üçÑKdJ§$a¯wp¢=š€Šé5òÚ°Th´hhU$?ã*ŠŒúÏ,‰Cˆ‰‚@®V]/ ²#:x rj`00qØMÂD’À=‡¯SѤ C¸l¹¼ Œ¶JØ:Â~p Œý#Hh‘åM§¼vÞ³ìCuÛ‡9ÏÔ´Ç“ 9™¨æþ¿¾|+ÞŒzš‚#ýT <§æ9çJSrµ¯nãÖÅ“1ãë? *=»röÝ•£y=×Òÿwã£{€ˆ•ºàÛö ΢né-]ðwŸ\­ þ6‡fG3Õùé…õ¼ÅÞžA³„s¶ž‰ëÞh"Öù,4Qï{*ÅÓ„»Æ6Íž “‘{««kÛ8Ф<ÁÙGÅJ8/dЙ¨´Z¼üø¤†£EÛ5[)†Þ²ñÐ Gè¬Ø.Òú|/rßAçÄãÀ*ød[¾m€ Zv ̓•[)¨¶‹NTKvX"•“Žšúì.M+xcïjЦ‚(=·ÇŠ3‹eäcnV_3Î ç8ý¼(a2?Q©ß *u*ÉZ=¢:üùŽA<Á[TÔÚd½§‹‡(IÜí]'θ˜N¸KÕxµ!yK¸ªKT—¾Ø qNXc»ø”Q×A'Ѓö£gñâ^œ¢c$üÖŒô Íà®Z?ƒÓZç›»ŠÒ—HX_jÊ»[ 0§˜žƒ¥‰Y›¿iñq€³®Å@÷SÜtf=Ù%(ê26´aÈØgþmÓù7#¦•ST×¾þ¬¾€â<Á5>X0šiF_®f Ìq9B`+Zph¶ÃJ¢Op× –q5f NÇ Ë8üN7¬l¤ÆÑ qÈ>oý€sÃ\Å¡uÍàÑRôYø+ìâzdEå‡Gk±Ù%ÚWuüЬþ¤,I¬-½¼ÿZxc6±G‘ì~?¶¯©ó¨zç±ÝhÞßË`'”‘Îíø±Èôû'Jß ¼½ÖÜ'Nñê8Å Äâä|¼9¾u6=õÆÊ;WJïéj»v¹\ñ¦Fžæuð;[1¯5[ÄÆþ1OlÌ$pIÄÕuü³&í­Ô¤%\™íóýcÀzë¥&áN„À5úÊ2ð%n$U¼W ŽÙBÇ¿ˆú1ú>ã`œ\Á[1ѺL¼rjãÂ;:w–`Ä¢%þ=Þ›Ïÿ*5‚¥þÏ;†¾ÛZΪoç4leôXù\ïµE¸Jlte(H!箯ô³HéAc4˜n¸†5ãnOV½tà]‚Éêõî6G*·s”¥K¬„s¡SÛ=¯ÊTÇ®7¯„zý3¤+~çâWƹ»?É2w ®Fs*'^&#V&£¹ûäj`4·9`ÆÙ‘O®œ#«[wã8÷{a¼)NÙ)¿´SoÊX—½öŒo£ƒ ½znu8Õâ©áñÎ2rl¾Ä–…f%³…¦S2Ö®4 ™Q¸Û绸á&a„,+NWgÀ4'ÀüH4Š.S°Þ…^‘uÀÙ6Ñ‹%ÄY‘´¸ÖRÙŽ§ñãQð„¦n,þ Þ’„xK¬q.—XÌ}l=-£#Ü=ýã2$ÆÙ†Ýî¸y³¼ ¸«]çÎí]Y‘žÔM¥¼»‘…'’»ßÞÀ‰ürÒ‡„r¿ Ÿ’PjJÑ* ˜Ú“0̪€” sª$uîfPI¤—@K÷§erîŒ.® Õ#ÅꎀNùN:r$¡Æeµ"oNí‚,ŸŠX4Ømɸ›‡Pé/`i§¦v­S|Â9yO‚ýX†¯úæÚT33‘i./Ì6Y»C2ý=¥‰ƒ{Ò¯F E æR—ZÍÀu9Ø;€6L~‰hI“wÍx´[KL¸½Œr{‚ká>@]¤®>lçr"%RLâÕÃÉ=©Ôì)ƒâDBQØ´±¾/ þ‚±/ ®F6à|Çâr„õvàz2z÷ m~{µqÿ|Ø. ½ÂØ”õÙ/’{Rh#ûN…$;â÷\ˆ´ú¹»µëˆž»¶ ¸, Ç„ièÆ=Ìx0Ýp×1cOñwZ<äÑ:Fë"¢«©®}²Ç)`áaÑÅ`Yü¤¤h&õÔO ðÔ‰Ü[ŒßðùaHsEEn*3ºš|-Y³>œIcnøõ_´I?ÙÜr-8“»9œe¬ 9ò–`L0@øu†’né’Ñé½=2Í!„roO¼Ç¾© #íE’Òaˆœ>m|¥7S(ÛZOʯ_H*~ ¸™éíPH– àEN…H‘º ”J4J²Òó$¢ç¥¥Z]g{ Ò¾QàâiBØ*\þ\B¿Z/ß{N%ZJL)%õÛp┣={&¦vãÒÑ‘†“jŒ+K{§)8ê™`r`r™™œ%ò‘1Æ43í­u6ä‰d’¼éѬ¸('I07%ú…tîWÍ*à…{Ün‹4“t%Üd”"ßgBQ3½=4ºr?žêauŠŒ+8ŠŠùíL[k.X#Æ-.±5z—ûMì7ÑctåBƒ¬ô‡M¾@š»Ã/à21á xøyKM}ÙS÷”{%rÝ'Ñ)yõ’ÞÔàg·îÑÔ¼A<‰Ÿ>Å ¯óƒû™."ú|<¼r¸]¦†ßñ&[AŽCB'¾6­säeY¿öŒIø«˜ e¨œtú ‡ÂýU,4Á⿃·É;ô=Þ#_ú¨,r¿W{¶¢ûùÞ†ŽÈ¶ÁOü™>ž4üVqþð AˆUàˆª÷p-ùÛ^ÊE.V¤T‹Ü‹”Sz‰ßåX“ 7‚³âµ.6ÙâÕôÛ»ê4@‹Õs®{º B N…Ã0„(íJˆâ©g%ÓŽŽÊÉ zwi$@òlðJÄf7|m\@+ÆËGs®â‰¦Ô³Úzrªé ƒ䉎èÉÐ%¥š.eEëæàO6—ÓŒEW®OÂI¾Pö~Ÿ·Œ”(R¹°]Ƭb4ÉtÔžì®v¯+*Jå¤ ïb¹#[ûS¨Y@´ŸEDëî© A]ØÞ8-kÑžj$ä¿EÌz‰YBL¯+KoVY#‰Né׿´­ŠÖ:x^TJiQªÁ[„Hïå¾×µ®Ûö·O¢„0«öŠ E»ämZ‚=;ŠÚ¤7ÖÕ&é×·rz¯¥T&çì‹‚«–n¤eë‘ãåÞ 0$à±2áBu2‹MB’jT;ñ¤r±@‘kgû¹>¥¶×ú|™ ¾ †sワ³Æ×œà'¸ÜÀE+bu… ûØ\Ó÷øâº÷ª]æÓ™ËW1'p.$b\sŹ‚«÷`àä}ò| ¯oûPâ.ØHH®1­K(Q$B#€ßó™î’íªõ;G›º0ŠùWÆ>+ŽD€í3"S<)aK¶Øio(5 ó¸Ù[ Ó9òu3ÊXS©ô»jý¢š~p¾¹zδ¤Ótãk-Bº‚“ÃFØ \?ɹŠu}ï‹qg`nÐ? \Á¹[¿¬†8}1¡·}r^ÝôïáÇ´ŒiЧ_Xþøå7R›ÿ‚À× I‚¯Æ;iºƒ™–ñ¨—f4Ý q¨+ŧëŽÝ㡱9z*of0ÛûÇxýƒ'³‘X×G;>¿iÛc7ËQw }g€ïŒðÙëíÑVõëþ–p´YßÜÿäüÝÅšx°Â/èÅ'yôÄ u,F íeÇ(k_æv>\wú»mÍõö¥~¯§óÁ¼ù`q†;s¬z§Ï îíÒgú€{1Í—&ÑGsÃü¿ƒ×c>3¾Ãá.ÈC‹¿ðà‰ñÏ>Ÿ1N$í²ì¾àï,úx= ÎàȃÀw07A4»ËxNËuI¿à¯<ˆéãò€_1¥î|‘ ù8 Uw4§¬ÊkA‰Õâbç<"ØKöUÒ^9|}ùÍ g‹ endstream endobj 5114 0 obj 7353 endobj 5118 0 obj [313 /XYZ 39.8400000 99.8600000 0] endobj 5119 0 obj [313 /XYZ 39.8400000 99.8600000 0] endobj 5120 0 obj << /Type /Annot /Subtype /Link /Rect [318.240000 170.899999 359.519999 178.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 5117 0 obj << /Type /Page /Parent 2 0 R /Contents 5121 0 R /Resources 5123 0 R /Annots 5124 0 R /MediaBox [0 0 595 842] >> endobj 5123 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5124 0 obj [ 5120 0 R ] endobj 5121 0 obj << /Length 5122 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ÷Wô:À´Eê ƯY0l ‹A'“`03ˆ3‹ü~ÔWêÇ%uHV±HIݲßëV‹¢ŠUÅzñÔ›?þÇñ_¿ß¼ûüŸã×éç»Ï‡âT4ÅøçxþûÝýº;•züµíê“îÏŽ_=|;~;|:|þývPÍËÓáâå〿ýíðf|øaüäó»¿¿ýï¨þ÷óñ‡¿?~œÆ;á×C×7ç_~QZénøÏýoç‹ÿ>üíÇ߆)t/ãžÿý®l‡;š*jß®·ª—¿÷·¢‡Ǫ­ê¢;*¥‡yÖ9þûÏÃOÃh×iœúJ©¶©Ú"xÔVŸ‡­ÊæØ·Í@âÖÔz·À¡bj -3ÐyF*îÕTQµî¡Ø¤oêj|MUESì2Tì@íð‚2k8ÌHŽڅôx(6黺–"ýu¨Øú¦“è<#!Ò㡸¤¯‹A…Éþ6Tì@ª,e:ÏH†ôŽ¡Ø¤Wݤ%jM±NFáÔe)#>/3Rq¯v!=ŠMúªÑR¤¿;P£„¸þ<#!Òã¡Ø¤ïôȪu¬s)š`]'¤¸Î3RQov!¼9Ò'ÓWßLßoŽß~9¼ù¨ª²;[ú_~&òâ.Œ?¾ /[¿;›ÀZ¿üxücQ¨êOÇ/?úSÝ—ƒª|ñ/|WŠ]ÑoÑ•²£}„WzøxÅ1ë^ÑðÊÆ=¢³.ñ¬!­ñ TË ^9Æjsø@áÑ '*E§N®Ysh]2ä´×ç×A%×(•ŠÐ(¬+VÓËó{º¶ã¬} ùRp4¬k <ïR+=k­¿gŒ×´„£UC»Ñ;ú*p´P %KVÛ•}FÖÄè§ò}Æ™¶½øS{ðȪxyd3xú“âV©Óàttn*m™ÎäÓöTÍ\ŸJÝ)]Û¼=wÏ» îJãu7°ï$\}U›Ë?­Bu›^=~pªÆÙY&xsÒª›]Ê»A*4…©¬QÍ{¼wÚŠ”¾Ì€õ¼Æxžn ›ç¡€ãµÌ¹*ëƒÂü …+éúÖ|OsŠ“ŠŸÑ'øyŽ™Dð^ÌãªK²8Œ9Úlâ]a¯€¦ÜWjKÓV¾ˆ¼ãøßœ™=z&…†u­5*ffÆ®ÌaU›Ý°1¦¤?z× „SÚÏ Kø>G1žðZÃ÷òó¥õ Ö ¯nû~>ÕmÍÈúžˆ¬\0Lyô: ÷›~øØØoD8~ÕÚEb[}"‡ß™ÔÐë n,ÐïqÌ;h8¯ìAKWÐrë¶hü«…×}Wò¼®cÞn“r¯8 1,ÝXê°=Xò‘EÆÜp’““DÛS¦¼ä‹CNᬂ“"xåpúóLpàè΀‘ÆXsÒjÍ´V85µŠôO[U—§æJª´}g²AÛÔÍë0GŒý†sh‡ã,ÿÜï¥öæ-œ`”l_4PV•æäÈZ©®7j-òžPŠtÕo¨¿‰l•%¬È ”NðÌŽaðó¶w/j†ÓYáßÁƒØ‰… 9f¨ú•É´ËʈqT=#œêßq˜Pé kVDA$2Ï-P~D£:hbª.ïóRzú6¤ß±0þ0•åz‹§ÈúKÁ•¥ˆƒ I"LP[/úíwQ1v'$} ‚e`žD"‚ªÒ`<3E…½jYØ>]¯C´ôa‹4‹Ÿp§hUoÚ‰{Í,V][°:×¶ƒ¡`3DS9¨³J–aBpËȺ,ƒc[ÖÞ• ˆT2hêfmÞOÏYÎÛuF^ice}{9¯kåörÞ‘Ëû¢õ¯ÖfËy{U¬¼I¹ßËyÅ)º—óîå¼ÎY?\9ï* IûêbÉg+$=#@{MgFáE’€ŸA¤ÞÉaàx¦Þœ¥ØÇpp.Ìò‰8^„èŽlr,>‘VT/¥£7ÁYÖO¨-Ê¢6Þ:£gZõåämFO¡.ÚìËmöÀ¼ìð»¶HhŒ¹­y°E¶ k¤.ú(¤ÆMF< 'qåÈyµR×§f²xkÕTæ"ˆò' & Æ„° Þ £FìL‡±Ê±@ Õpì08\‰L§É}L¿€´,ç$_Z|“Éäi%5N²~¼Ô9Íj}­tÈiVë2&D½fƒn7«×° k7«u…¸²x°ÖÁ/8$‹ T µ°Ì¬˜—w(ñÕHm[ù9 Ë L<à+²» æeV9#Õ¶†%ƒ¡k÷àçÀ‡£x…‘[6ˆ M}!MÛ -í =xú?—U±Ž}¦T—¤C¶€XÙ4æb ÄÒR«é©¯ÆŠKÙRA·Æ[ô0ÁNªqáÒÃ}¤ÁÏñW úy?™x%§Œž±8„s¬6&ŽDÑ€ãy8üš@ ¡¼žp–(ÆPiª˜ðcÒ”ú?òH š@õN‘Pm–²Ndˆ6–!¤‰Â$œy]×A—¢Mêì¦ív;Ä«ðÔâmS™ Ä09X)RÎa‹–x™“@gPP#6”[C"'WóØI­ÃžnZè–ÉO@zˆXr/˜A†ØDWû—!³î§€h1ª¦ªíÃÑ;Xx ‚0¨ª2ÖPóOB[=,Ï ß4Êk˜Ò¨F»S×>µí=öï Ö"' ÊJ›:o-¡ü¤ŠÞÒô~ÏX"•8PôóeÙÄW´%\ÒZ›Kº8K¼{fûb*bq–pæ*"%ŽQÕ¬‚Ök¼—ÈsŒÁæ¨àõ«áì%Í4VÜv…gŒžY•øÐ®/ç÷ö¤ÏlÃ=G‚-&É l‰Àe‰œÄ1ò& `e ¥•TEÅ`øp•Jéèâo&½/wŽc³‚RyÐv)¶›(DY~æJØé¦5„’BþâÓGXi‹w®—Éøy3šö¾ðX˜½Hø$h„ûDA}ÄÈĸ1DJÄ2H*i*–ް䩷[àÜÛ:O"m e¾uú‚ð%̪$hÑ•EA]•‰cÙdNÁ¯§2'À»r°°¨Ö}áö·X.­º^å Õ]ß[ªg­5\Kå™2Dôå„ÖŠUöÒ6Ï–²J¥Wœ– Xu&9QðìyÝ™âù y„²ìL¥Sé¿ Lã-zœ>åvRVÆÒ=Hò“‘OÐã3AÌ€È ¡Ó…¨OìÒ,«Në¾yBuÚÔ¦L>¼:9}çÕ¼OÒu;eö^ûæáüå2¢’npLÀ£‰Ž¶®¯Y]UWð Ü7ø=âs5[U—›´Ê÷­ânÑF`2ýE–]RZ£¼ŒÇÖ ¥•2„ƒÀg±«‰ç‹V«°,‰®e©­(V*‚‚’¨: —:D¤¨ž{:/²CjœŠD“ÙÈ”î~oZg+]*ÞkùdV«úkw­Œp×µŠ]M8*9@éwÍ[…µÃ]×e Ôçw-.3+æåîz5R[Gõ>Ûzw€^q=XBáhï•ÈYÓcm‡•_…í€%±§;îÁÏÙaåGiê¯3ÍžÝTW÷.Ñ)M¬AôP`—;¨"2“¥ð©—.ÌdÔ)oN.#¬Ö&#ew;L“&DòW]–ŸZjwGG3MÖ|‚øp èY$aT~ɦ ÒÔÝïzi‡TÌ¥4ef2UI~5F>¾ž²Üp:`w·`~#dß GO¼å¬¾Xy2¿~/%hByú‹Cªqfú4„ɪKÑ•Àet\ßæšOÆf:ݧM²àŠ&‹g-\Â)20·„ßû,.eÉ&]ÿ±0f;‚¯H(Ce,¶§ ’ÂÿÔ†ˆ8p§8N¶H¥ª ¶ )Ú}-¡Ë k %VãÛ=ú]w¿k÷»Véwɰc êÉBï){C¶ŒyÅÐÆ~1Sšº€g]M-¨njžc r‰pˆ :T" &ÛÆï XÛ š‘£t(Žðî"‡6£JÂ3Ç ²èš Þ-)ÎÆc¿æ" t§ +:c±dƒèl™è1©¦GoºàØJÀ³Š ü–j®SÑííH¦6Ñ A _¢êÆá{[ª‘Ó€ãI„¯ìÉON¢oq¤4‘z*HFËð`a£/XÊR*íSï;oÂ’”J–I M¶ ôã˜)AHBö„êý4º|™óÍ…¡ ÂËí]Ûxp&RDL€€¶‡—Äý „pe¶Krb1q©yÑj;É9ƒ”ÐîSÝ»7H¾ÙµUgnvë+—ÑC 4¼]C=™†Z Ë(­ÛÏæ†ß¢?[¼3[R¿mÚ Ò$õã–”VGiêõáÇ=:³nȉ4!îD9©%Áä„VNU™åÛ¢JhˆnB8ÊR$‚X¬"ž<áq‘|A¡ôg†®16 øO¨Ÿ.FÇh鞌ռUÖ`ñ§DáYî ³]ÓÞ3‰RÊȨ1ôÛû¹™Ûi·pIÚß4¾Æh ,Þ Dïp dàÑÊÔ{cßÕ¥¢ji±$aÙ¾çHÃb¨åm×@ÂYÊs¡£ÝŽci`98j}ñºì€ämî±¢vϳ·™ËÐÁì¦k¶l%Ü¥Hðñ;?D¸%F–§-q¯:fF¸`%ÄihNàb+ÅÏqòDi®'ŶL"íE;Ü‹¿z%þã'AzC°»§6Ü7½á8¤^6N 1®-kxÕÒ#µÕDíâFí3Ñ^hÖžÎâwF@×÷ürøìÐãi6€ó^/äR—»¶ªò¯¸ääùÚ‹FK1I"î è~.‡q0!±Ç“©ÕÞš¬Ãè"å hF ícU”ÊtÆ ìk'ÉîAúxCwëkŸ¦úãÙ<Ù€“81%ï"-Ü×—S kp(ä\iÔ:nQÁ—fíwRïªÂ`S’jyŽ]€RƒëÆPáÕ$¤6vQ¯†{áä’EPU¤¨íöîêk].¶Ö芆Éœâq€­ãv¸…nÒƒ¯`€öLoÊi¸°´©‘N…g[,à{pÓ‰m6ìÁ³®­–0Ýrµr¨Ä_ …6ù½R¯§9—x;¿¨ò²ƒ˜ü;‡ gShR%Ú¦ìãÜðøž^Á÷À¹i‹½i±p#6ïÅ™øln·«RÛª­ ÖÈ|º¯ˆã Ùáߣâ=eêµW¦Ê}¾ÎpÖpÂE[Ð[÷âŠC!+JæDeà˜ÒTw¤éP@˜‘¨D@îbO‚ª/‹q»‚ûd¼EƘ(l´ÿVÜGî²Lõd~Ô×Gš ¸Ú2Zã=´ò}qnåxŠiê9ð¢±i ÍCe¥±¡åŠÍCÛ…6f‰gÿlÛ÷ @àAð=b½Û©Ëö\ÃWÂÞÃïa¸¤¿ˆeû!˜'{¨½-FCè 3£ú–yÝìkÍɵ…OÍ猦Ïö]ïßæÂíÊ© ‘!Ë(á`ÒE™¥ÜeUpJ´žÑL+»;N°L-»žc+{Å€À å;d :ŒJ¿…— &Yº†c‘²œ­.±jJŸšlsÏà$f9𣄠ѥP&¤AFÉ®æ%°–‡Ž$¬ìÔ™¦85­zí±{›59VØ[¥à‰JHEðÄ×Ó—Ù¢¸)ÿx?-[¤°Š ÅåvýÕr²ñ¿{hÁÃN}­­Hc÷%¼g­mõ¶q¢…h–µ˜@ÉÐfx³¥´÷%¯_(Süá•"oÝI ߆%(~þÂôã믤³(wÇ\>9—×y«?Z×Õðóé´fé¢|Uƒ1…÷æFùòþ“÷ð»“Õ2ó†Ñ=Ó¶0wE¡÷˜ØœvÏ´b”wŸæö"\wþ]×ê TÃçµt>P˜w ”SðQŠöu-^Û)¡2ý˜æÓÎ977Ìð9ø}¦¸+í9î‚<4y3W”-?X>}œHZeÙuÁÏ™ìTõñû08ƒ£ÏÁÜi0UXÍi2ô‚¾ëà‹¯<ˆéc2ï˜RwÖx„~캢9©³ õZQâmqŠ‚Î]iîmA{åøéð ¡ð endstream endobj 5122 0 obj 4784 endobj 5126 0 obj [314 /XYZ 40.7999999 161.299999 0] endobj 5127 0 obj [314 /XYZ 40.7999999 161.299999 0] endobj 5125 0 obj << /Type /Page /Parent 2 0 R /Contents 5128 0 R /Resources 5130 0 R /Annots 5131 0 R /MediaBox [0 0 595 842] >> endobj 5130 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5131 0 obj [ ] endobj 5128 0 obj << /Length 5129 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Ñˆ¤(J@`Çã C€ÁÈ!È!˜Í&Xdqö¿µ¥vÛd|‹”Ú– Œ=f‹*ë]ÅâÇ?~ûûñŸ¿?Þ}ûÏñûòóîÛ¡mÚ¾¿Ž§ï/ÿ ‡FÉùW3èFާ¯ã÷_ÇÇÃ×Ã×éßǃèŸ\~LƒçWÌþöý×ÃÇùå‡ù/ßîþ<ýö¿£<þiúßÏÇ¿þmúñã2ß鿆±?ýòïù!…¦ÿ¼üí4ø¯Ã_~wüuaxš÷ôï5´ƒeÏŠ§ï—¢—µÇÎô­ìŽBÈ N=¡ã¿ÿ8ü4Íö F3vB˜¾3mô¬Fž§MJ9“:k‹œ*w"¡{ž‰žp–·4ÑvÆ?õ²5OËì;w?zž*cƒ–< yK;£OEE½j¡0“»ÐËT¹©–i¢D"oi ê=S‘QßMÿ´L¥ÚÜ…ž§ÊƘ‘#ÏD'ˆDÞÒΨw¦úÊ¢ŒäE=züôpøøEtj8éÞ‡Ÿ&HžøüãaZ®>~8IEmŽ?ß¶rüÃñáçÃØèQ=küy¤ýGîáÈ>":4ÒÁÑ é¨OO#÷Ó.ß“‰CðàʺÛ;8©Bà÷ü°6Ôj¬¸[£>ã<ò„Ó/æ:¸'îêaDˆ.ƒ~kñº‚»¥(\·:§âõtIÜi CŸÁÒ?^eçæÍÏyfòK^½µ¨T0];3œ1o©iZg{ÌÓÈ`sçå ©v6tM7ÏõBnÙ“µø½ö¬j¦“¾‘د÷N²P÷ñQç}b´aIX7JBê—ÏÚ(Yèóòù%ˆ4a:=«²<#ìUxv+ac!=˅ߦSyŸ¾KbþD3Œmÿšfrú ‰m&]£›Y$ Ñè®?íÆEôÝ×I²³hp“† ì»C³‡Fê1Ç¡ÔGq[Æ"Þ{Œ_¸[žõPÜ0›ÇP#˜pžõ°RŸ‡¡D©æpbÄ›¤p¤kYÍÿŠ.¯4Cm~†TAáMf pºÙeIa>ûG DñhTF·,Q¦D t7–Ñ ©)Ÿ”È  îòiA¸õ-¼ ÌšK¡w#;1®yešp$¦^ I^Ö‘ªJááÙ5*‘›ÖØÎ•m“$»MnâÕ›µèÿvýteT½ÔLuBìûe„Q $“ OÞýúV¾ç,±?S+Ú‡“ý«gðÎa¯E‰[µŠ;UF[{ð‹5"bqÏó‚MêñôYé…bPìŒF±´ƒ#úׄ¬”„ûÃ\ôĺÛ-Ô”oÍÚ­i7v]N¾¶ªÝx©TÚíF’Ýèɇã•bK ¼‡’ŧÔà('–V¬…¥5mÝæäMH#”Ø%ZMà&Ê>Ö”ÒZæÄckJiÝçÄ!Z>âY7.†¦HL‹4¶èjñkI:¶„)z/9®C˃,bql¹’S…'2ŸÁ{í|‚=F9Â@Ñ÷7ju½1Í» ªosâØ$‰‚©Kì÷¼1¯Ù#Á’˜’="DO4¶n²žu˹òÍË YÈ¿zcä-Óo>Ú¡ø)j¬…+ú²½Ê‰8VÁq<Ì3x·p ¡*æ¡U-¡®X×bܰE) …°J×Õ¥*s¦bѱÉQ¯,jFÔz““÷¸MÝ¿éê1ì±Ö¤ù1'~_“~Ê©~Ü#´ˆ°'òF‰¢í±â•물ÇMƊ׷§¶îë““A QæqÇ\‡£,8 ¶{N>ωà{"öu<¾á¯žñDB6áј1'·PÓºäÈþÖ@˪a8«ZO[9׺9-€œîV”–J °f ¯tüqzH¹í˜f)%äyZ›?’'¹­¸lÜJ,HÀxü>zºgáQ¸¯IèJ¦îàVcʽ¡=ΦÄo5ex—œ>^Ö²RRõÚ’Y»y´›G/ ‚êR÷½­/Ý×C1äHÜú°NóÇ…ÔEÛôF¼¦Ïm=[¡_wäÃ# êÃE…³ ¬±þÂ=[{z ž>cÿ:–¶=Õ.US¤êž®Û¨Œ›’ß«Œ.ï7Ž­|M?QK¼iѾT–ø tèˆxè®19½‡=z bÀiðëq@ì÷a-H³²ÕÑ&($·/¶²ùq[ Mè¥Ð:ÛÁ‰†p£) a$%è {# Œµ„8Öê]Ù#Â,x¡d˜ÇRïFiëÞ Û¢ëzë£-ðv9DÎ%ð`Œ1%¬ عaÁ¹®Á£0*±|ÃÏ`Á \/ B„$b1ÃúpkîKLˆéݸ®‹s^©Xr3ŽùŸB ød5à ÇâÒ}4¶Zr©. [u{àä¥H’Í“ c y„x_zWÏ)ÂhYé®'œô°C“­½Û/¬–`Ðæ¹ôïÔoá5_•q8&IÅËǑɴx*ÄŠ‹ÕœÉ 8¾´èN¦›~$ á65Kú‘d 9~ަŒˆ ÊŠDÿ·Z½Õp ¦ø`9ì\%ˆ‰÷r;r#A‰‰ÍžÀ~ñ¶Å]÷Õb˜b:³Ä¯)–yüô®…ïHç\UŠLß‚ºiP½­›Œ•["VRÍg†tu±%í•;d‚±ÉA盹g÷&UCÆ+øÓÏ­ ÊìËÎà·Àà åíÎåÔ«–S„Šñž†–²¹ÉéÖzß]{Ú’^v×ÛÔtC'n8ÐÅ,K$'‡J°úyoqßÕ A –Lø]†ž¸¥Ø9«ÃËɃÓç ­^ê‰ï,JÃóL<êÃ5æ² 4BV¤P…&KR‰µJh3(A ãY)éñ•ks *Ѫ|ÿº‚÷ÿ܆,ʲ-±íTÕ¤¤s8p§Èªx;ÝE0Á8ÍáwYaëŽb’Ã{)™CJÍ3Åè‡ …åÜúI{ÖÃ¥Xí;ž'- ÕN•¨¤,)Â;cÉð”%¹Ìáó¦âyãx*' ªÃIåF‡q¨ˆœSyuªoh]\*°â÷‘r`†G¦aŠ "¬s–,AÑØ£ã 7§öˆ">ËgâµmÕoÈÇÌ0G¸”¥ž+Ç-hˆE9áãÔJ9{œ ˜UðjÍs£a\%é¸Vx[òvé,—¤ ×ûä$Œ(J‰’Lã`'·®›’»C9Úšq”–³à¶d²¾·Ù3å $!Ržr¸2C”)ã/#ƒ—^Þטq&ZÑ¡¾L2gb\'7°b-¤)Sƒþb‚ุ*ˆâ®×î9–¾KˆÐçuQ W{9ØÃÇ[νŽhV’Á@Ñ&,­G±Ž÷ԶѺ©£”mýq$*Övá^­žíÆ!ZJÇJÔ‚Õë(+¹°Jˆ°n+Ÿ«ÙpÏ⢥¢ž×dä#+xœcfƒ$ê±$b?ï[¢RÇ@ÓÊsìÏÓÉ;¡j¥ˆÃÂÓ<=>IÍh¨Õ,¢yYC3Œ­¥aÅ Ph„·äw÷”–K×hy½&mÃ5i Õ1å«toÉ}oäQp˜ÓŽÝ…Ï,§˜OèH•Pˆ‹ýãðjŒçŒÞN…òFU!¯Ø§l¾gË‚sÏêÜPV§dyÀਊ $H[–#NY}gâ…kV#Þ L©v¬ª«*ø¡]ä’tá©& xJY·wšrâ§Mz"ߣ– PÖì•)çÎ/ØÕÍØbô;òΩ±"h` .B…’½B‘B”³ÇñyµíEÁ<¨HðÔôbBRÒBªRÖ&'˜‰œr®s îîøRñýuÞa­“Ó 0ÇàììSÉ5.™o—ÆV{µe3ƒ¢¼XŠßH*#>ˆ°z¿¥ æt(Wá8wÜ£âÞöý9þEBt¸Èu6œã>\.@9—œ˜ØÂÁlŠXJ–¥%úwÚÚÔ¬Ó!{HŽ`öÕ É­oÔ±–'¤Ù $ô'K8mZÆ!Þc^<}ó1/ÝÇká0ð^ØUÝ"•ÆW0†ÆçŠ5–>gGAXŠIýÞ Fq‚2 —%d9Â5>LRG–¬w’˜ÕáÄìÁ|)[‘:µ¬ûbnàœàêõ°•=¸’ŠÁhK3xò³”HµáJ5–ôCØŠhN°.œê¯,C;=Ü–"©×Š%çä?«»Ê9ÃJ¹8 S”³ç… ´zÀ›0ž¸WRNel¼‚£h„¬FÉúÞ’W‰vÆÖD,¶ÐæJy¬]ž»,YìÒíuT5BDÔ½í( Z|[í½°y‹…Í|q#Ï=(‹ƒ úˆkPðÈY¸.ézÒu+2Ïu+p6‰/UÁP P£ËeI°ÕáņÏàG<”X“φ!g¤…{òÄ/…gà¥B‹R¹6bÒå†ÄÂæy–(›xe ¾Ú φå`÷T`({бƒ/±Â@Œb:ÀØÁ¼àÁAnd4–(lÝ2ÂE¶&G¢¼m¯°ì¬¤í1¼Úž¶·¨…¥ìsx†0Òág°\æµv)šÌgŒbÍ€¡†#ëïOðRƵµI§3¨\±õ%Ž€ôRsò~,i›ÄVÊÖ)nPìÔ3½r¼~Fï镪“çíyÞ„vþº ´C#í9îd´ýŒ`}fDÏ,d-¤Ù»8TÎzfm3W<¼xÏ’Ÿl:§]-„@Îì#Tc¬gÄšíâ´ÄÃFC€×Ób¨ÏY1éô‚ëY’D¦Qα28âYO¥Ö{F™s °LùXJµOÂk*]D›ÓÄÅ)pÓˆ Ux¸:…rF8\˜ÌqÖ´òÁ“Õ›¿gvÛʸm´àe®ähÉZ~ý"‘J^fnkmìZk:…ŒN::”/©¤¶OÊ»ÅgسR¬„’‚å_[·Sg[ǪqL\a_Æ=9.B”?ãDZ ă±G'ÁòGåq â Ã°á]ÀQy›ç™ZQÖŠQ¼NË0Uàxk¶Ha,r(8j@‰ïQò;ªÀ#˜ÆðzxcœX rO8Úâφ¥7–ªG°¬¡PHÍHP7FHy^~&äŸ1-{´#…Óap×[ОŒæêRS"³tÀú[XRrѸ⿇ õ(ëQ8wK;žgp>Ë*ŠíWºñ|¯nÇ <¼#oÍàÍêV“O­-s*û^澦ïããÒôºÓ–ßñÀè.®½,î«wyÞGÙ¶þ(¦e\‹š¢oæL†jŸû¹ÌfHß7ýõžc×̘qT½4¹Þ’Ì\™E¯R¯ÞØ¢uÓÏ¡§Ëˆïà3#|ffL#ÙªÓ­Ì®Í6òË¿|†Ÿ]*Ù¯¬ð zf1¯´ŽÅ“NÓ¤ƒEõ¢i硈½]²ÒW¨ã|É#_ƒ Ó|^¸'¼‡B]†–4Í•áòæÏ%&í2ï¾à÷,¹¿4ìãõ(ƒ"<ïÁÔq°8ŸQ0-y‡¨ÏzhÅ¡+ bü8³\¡WŒ©™ž ù8 m߈SÑÆkA‰Õâb³`ºØ,ŒöÊñëáÿ žb endstream endobj 5129 0 obj 4259 endobj 5133 0 obj [315 /XYZ 40.7999999 348.499999 0] endobj 5134 0 obj [315 /XYZ 39.8400000 302.419999 0] endobj 5135 0 obj [315 /XYZ 39.8400000 302.419999 0] endobj 5136 0 obj [315 /XYZ 40.7999999 348.499999 0] endobj 5137 0 obj << /Type /Annot /Subtype /Link /Rect [108.960000 661.460000 153.120000 669.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 5138 0 obj << /Type /Annot /Subtype /Link /Rect [210.719999 321.619999 252.959999 329.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations >> endobj 5132 0 obj << /Type /Page /Parent 2 0 R /Contents 5139 0 R /Resources 5141 0 R /Annots 5142 0 R /MediaBox [0 0 595 842] >> endobj 5141 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5142 0 obj [ 5137 0 R 5138 0 R ] endobj 5139 0 obj << /Length 5140 0 R /Filter /FlateDecode >> stream xœí]Ko¹¾Ï¯˜s·ùè'°e+@ Èa‘CàÍ&XØ‹({ÈßOºg4"ûã£øèîmÀ’‡Óìb±Þ¬*~üóã?Žÿúýøñîñ?ÇoóϻǫX˦?ÇÓß׈¾’búµë›J §?Ço?ÏÇçÃÃáaü÷ùÀÛ—çãàùÓ„¿ûíðqzùaúäñî¯ãoÿ;Šã_ÆÿýzüéïãŸçùN_øqè‡öôË÷é.¸èÇÿ\ÿvü÷áo8þ6‚пÌ{ú÷ƒìa‚ãùò(ù{ý(z;Ö]×Ô#ˆ|ü€7#:þûÏÃ/ãl0ª¡æ¼këŽ9ÏÚ‰Ó´õˆÿ¡kR2mRmmnSñЉ:1Ä™è[gugžŠŒú¡é_–Ùt¡ë<Ïаžñ:æOñ •g¢â½gý´È¡ FW]=ïbmàZÙŒw<غÓÅ—ç*Ï3£KŠHx‚ˆ­ìŒw8ï²kâÈ™ËLÁèª%´#DQä ž‰Œ÷V°HræüütøxÏkÙŸ¬û§_FH^\„éÇӏܿøádövòøôóñl4Mþt|úõ0TÍ0òêäSØF˜„#wpä3‚ˆ!æl¼óÇgp„à Äh !¨ïᆠâヰžÁïéýwNB$zåD‰_ŸFÎLÎgƒà3obüBúÇ»Å>A,ÂL}x‡±ÜÀ+˜›ð3˜’†|TÑr°ÃòKFHG³¹è‰=aàGÌ _ ÏÀ•b †ºïA²CYa€?ƒåÖ ™¤ÖTÅ^Èg/¨ R¯„T%áþlÝúhÛ>·õõ8kÖø=^rQƒZâÖl³¬6SßíÄfêXý­xeͦW¶ÁvmÓŠæš™&²ìÕï*v¼VUU½L6K“L›QŸ1AÒ*põƒ™sÚJðÞ«ö¬öú³„£M¦­ŽCÍ²Š¶%ƒú¦| ¾ªßèà"8"Ý!ÂÀãIðž Ó©¥ºå àY­ô£aZÜÛÑ©®WL_m*)zþ†¥ ”¥ƒaïÝIÛ@&Q&±1yJAÊ¥"I1œXjL©Óx1$>,î.Z ›ie‚ô5È U”ê|å¡d0Ýi»¶rüdaq^5u{Ú® ÑaÕ¶DÅ¢¶óµ ì<–¾˜Ü5±4”d4è³±°BT`–2.…Ë­èóÁ íkŠ=ðàaK&^ꎾ®UÝc§ F·‡ÅÛ­ݪ͠ËEí‘Ï6³ªø#z'H Šä&Òìkvç Òe&‰Bœ.Êû£²« <«èÞ‚]åÙCC˜ˆ±&·G B\.Š2\MØF°:V÷ÆÜ|1‰·ž‚_÷í‹ÁÌŒ½X)ÊÄ—öðÞØ J¨:)U5à %ÉKE%Qóî“T´é=t;üªІˆ b#¬ÂilPy1í. ÊËCÁZEŸ@|&±D >Ÿ˜›·Îà²- aŵâ!$ÍB þbœht¬¨„»ÍëAÝn/¨®_˵t|î/÷€·UáÍ-Ù¶¯y/ä2¡ŸëÅ¿',¾ ±«Nì4úµ­¸þàûá1Y¡t­GJ 8Æ»dØj‚ùíã;XC¦Ï “ókâL*ûÉ~L›'¥j<›ýÕ[‡:WÕ@¼—Ø!Æ‚žTð{£åsZŒ˜^^lˆ;ÈZyKQ´„Ç9`Œ ‘ÌÁ¿˜¼“¾§@“ý¸ÚãYÂáŒâix¤ä¬eòàì䙕ª>pÐ}Û; 9~µ":¥Ô¯¥"ö y€ÖúJÎ^l«Èþ{&oÈ'RN°ôƒhÐ<äò®øÙãäêÆM]-;òÈ.Žb¥ gÑ€)“Ëæª’W=°E¦$‘]˜ûPqÓÝÎh$¼æ!üí› |æúR#sË £&$’TL¦œšÀ_”#zˆ{Ïæ‚Rf{5Be‰Ö]x„{£$|úÄ Ý«‚ââå6.)Ðë —%^¶V¨ äÅR&‘1ÕàÊðYý°»ÄuJ\'_\ê§/³Ø}ö8žx¶SÖþܰïæOY3{ܓƩ(‡»VV®³C^JÌî3Å ^µ‹Hß(Zs\ÜsÏY|ôŒ‡a•¼£à&9 Ht|£O‡O!¤¨‰%ÏÛS¸¹:Û*F‹—4Çlö³ŒºƒÆ«·#”P L*úcAS©”Ó&ŸP3œ>¤YÚÁBXË#YYñ¥÷jVhQ   ¡+*¤Bƒ†¦ì¸í8n‰Ž›êZÚtã÷@ØeäSj¡ Ù ìHzM(¹F»ÌQ[¹f¦¼fS¾Ƹ‡ì¢ˆëÄÕ×iŒú(¥,„šL»Å–© G”cÝ5òˆCPÅ9ñy›‹l¶vÑÔk}î¹øªO$¶—KPl|]áâ˜6µæí_Öö&+JVUÔlÒ v>VsÚ!z©}$Ý»8øK«àeñ!Óʳċ·[³¾áïwŸYòLjÎ{SAyúáÉ )×:·mШ"r|s5c~ó%¦uÞz¿CØ5Ê)ßZ-ûre–ô’’^²æ¡OÓªÆÜJêƒñäíÝš£ÆÞ`¶}½UC0eºv­:{ªpè²7 ADê~e·ß¢zÅ‘¥u.ަy°¾û唈±aó)µSi‹SbF}S&#ô\eúÕÜײAýý¹ ‡óÒ¡"sGâÙc·W+ÚžA§þ%ñUJ1[’8Ü‘èÞÙÔ°mLJ„‹=ˆÞu½)ÝÏfÞEÂÜ|£µúk§anÉ2 ülobÏ_aO¥ði¾ÂC¯c7äÔ|A#¤ î·@_Á—ICvWäuŸÁ³½ìàÙ$¦hW¦›­ÊžÕÕÊ/–qï÷ÖZYÄ셽˦,ØtÐNí!Ä ²Aµ‹¡WØg3²)¥¡Ø´ªÐXëôfÝpp=l¸m?‡#Ž@ó©†*£† G5† —wþ†"~æ=0GÓZ™Ã]épòÐAÛ¦UEâÐ8×ðúî²6{³ñZ*¡û§ðµSf€¶õ²KúNÕŽÚSòÑZ÷xå¾ÿiû{’ÁQ¹y:{Ê Ê2„B?c<µç¼³ÊQœcáHŸªBh&ãüR :½€Ÿ‰ u‰]'o'Nž_t6Wü¾PÈ^)$×F¡½Rá„Ç i£5±t°¥dk…‡A]mɳ†æì;Êä>òì vλùöŸi®þÒm%q{ŒM!yuø~u÷öøI2­Ö+%ÚH3I¡-3Šõ ;r¤9MÒbʉ”*cPuFHC›FôàåL 0m?(‘¾=3çž Û¶äœV>åíéRᲫ¦Ži$.èHÒjc‹°Gôªò \ð£éOœò º¹¸ý ›Sz^1½™XDÊV¬å*y[oümA¨}Ú•EžæJ+_‘˜•ä l¥³Vúº:>ç\Á"óWò铬ìq§¼X²ÕXY£lMŸ¦Ø-j+ãœgâBíîÙ6Dêái¹µWÝÒî|‡£ÏtÙë\fõ“‡xÕ vJ’¬T«íƒ*JµZ©VK@;[®V“—£>1Ÿ»±ªí¸ãõáê¾£(g\Í¢=j#Ò4oÞîÑ`ò,YËts›IÆ)5D×+*bëyÌ5ëßRÛ’6.yÌ%9§WSr³EJæñ îiT2Ô)òWýVJÏ1õƒ-Z†è¨Ü‡å8÷¤ÜÛs‘¿h6ýYê;ŸÜwú '<ƒß3 gfDq¡ù׳ =ï©¢QSEK#ñ¦šÌNf“±¯êÙJS­Ë¦jQå«@SW: š®’êA ™ ©%r<v®:\¯+%áàÆý› ™’±vÈ'y+àff"Ð[Ny´^?å0[ÞjóÙv-¼øá5}â$õ¸Gƒ¡©÷ð•Ø“ZREä’ !!!%¹fÂ6Ÿ±Í^±}BÚ Îš“Ú;žB!ìúƒï‡GƒJ¤¾:MiLHaŽÕÃrí“ñú°øñ8mØðåÊQÒ Õø¼ 8ƒN2ˆÊå9Iú0$nb´ú=Úƒ¨¥\Ùê­QS^©1´ª†KÒ"Æ£¯‰š“¡ÞÊa/·æânCŽ+Ć Ó‹q)ÎæHŨ9”5„ºÆ8€œAÉWÅïÁ°áLcCn0æt¬ íAÜÇÝ«·S.Îþ~ýnØwÁ&vMI…F؆ë1” Î[q;ò^=Ð_®q2`ŒŒÌû,ç~?¼×½7HbJó4 F 8¸µÝÆaAdKø=Û?öÔ-Q´Äû’[ÁͲ !i–ÕiÇ (ôF ùoCë]šX­W´^ÑzÖ•®~èV´Þ(„¢õÖ§Íû`]m§¤¢Š6zW²æÖ’)ŠÛU‘ü¶]ÒÛæµÞ íÔW´^ÑzïJ>­ŸXWôÔè`}=…)$nqŸÚu:tÜÎE‡æÓ¡™J“Ê–p–O¸DŒ€7CA´ÎÎÛ-GÁºÉ ÏpAæ3üBöß;¢åœš¡()^w+¤cï0OÚ"¿)îå „«ë °anØðJw«[&B²¶Šn‰­[°oA¹Xhd`uHŽÄµÿŸGÆ×¾0ÿøöëköUCîãòŒÚ›°µG>.c©wúÀÛjº¦Bª·F´mÕ.÷gêjÂŒ¦²DWuj½Ñ„Înad oHY‰A©DšK皪Êz^G:øž>3Àg&âïD%˜|Û¾ì3œmbæëO¾ÀïÎ-Vxž™•ËÒG똃 ~ÏÌ;æ³ö¶ ºÓï¢y-åhàû::à˜v Ì"¨åë”6vpogÓ{z1Î玅K°az€ïÁë™C<~ï¡P¤¡¹øua„ëüƒùÓF‰^»w_ð{æB\?ìãõ(ƒ" ïÁÔq0'®8Á4_Cëô]­hte AŒm–zŘºj ûžµ?u}+(±Zœm–¥‘«AbÚ+LJÃÿDzš endstream endobj 5140 0 obj 4364 endobj 5144 0 obj [316 /XYZ 39.8400000 394.579999 0] endobj 5145 0 obj [316 /XYZ 39.8400000 394.579999 0] endobj 5143 0 obj << /Type /Page /Parent 2 0 R /Contents 5146 0 R /Resources 5148 0 R /Annots 5149 0 R /MediaBox [0 0 595 842] >> endobj 5148 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5149 0 obj [ ] endobj 5146 0 obj << /Length 5147 0 R /Filter /FlateDecode >> stream xœí]Io举ׯÐ9@«ÅU 0¶Ûr`´‚‚ž™ƒô Îò÷£²Te[ÔGmìÚnÓÅå½ï­|$?ÿéë?Šþ^|¾ÿúŸâÛðõþë©*+]õŠóßOïÀ›RðþÛºQ%oÏŠoßO/ÅËééôÔýûrbúõƒÃ—®ñ2Dßáïß~;}î?õ?ùzÿ—î»ÿ¼øs÷¿_‹¿ý½ûòÓÐßù¾ŸšVŸ¿ùwÿ ãŒ7ÝÞwnü×é¯(~ë¦Ð¼ö{þ÷“h—²ñšÇËõ£ìõïû¢ÁªBÖm¥tÁïæ©:rü÷çÓ/]o×i”­d¬Ö²®nîµæ]·M­UÑÖºh•Ù©±¶Ûºbžµu·Ê½Îˆù-U²¶wE%}ÛJ1Þ—`—ž< ÖT•¨Ã°ð<#æµ²ð¸'"Ý»E6Íë"-½é5tåMøV±@ìfÄü–ÖS~¢«§ ê¿©ÃËïžOŸ™ÍYû?ÿÒÍäÕ„ô_ž»åªâÓY-6mñüSñǪbò‡âù×S[ªVÔª·9s-•@-üµ {{„--¶XfÝÀ[¾>tÖLÁHQWŠ?SÝhð£û8$þàYCŠâ¹I<ˆ^†9ge¡z€œƒ’…WŠg€1º<¤oPS`Z[¤„ ùD?ΗçN«ÇÖѬj•)sAšûì¨ì-”_îXCvßçoíXÞj-¯)'µ)–Nn À·WHu½ 9ËÕ4[»ÝÝ<Ý^ê¤ÂeäZ0dç>Ÿ‡¬û¸PÆJ%uÓaÌR]rÖLÂMŽõC]V :™hòË î•ÿî̘ž<îäö¹J1Ϙ@/*²”}_ï l,ÛS@•‚7Œ«Ûæ:ž‰…‘»7ªÑx–N¢£eö3Æ$”ì»ô{'Œ_Æ!¡ÐaFzÔ+¦¶Íeµs?0&bY„´ HN õ$f/(Ú%òQMm˜—œ6&¤ý‡ºwZéÍíS4ÕAr]"“I!²7ëûø¹˜¦ÒhRÉ÷öƒ6×ô]@ˆHSHá4s®ÆOt_&Páãx1®)‹Y¡ÀÙ˜º«­»i/sñ“·ÏÈÅ*Ýî£zkJ:ùZúT‹Pâ rƒ¥Íçœ(«X.ºŠ[0ƒx3¢ •4ð_ÜÛ´ØkïR…£âÍȲå…ãLCíQŠƒÆ!@˜ør=¶Á¡’{ËÕØÕe˜„NsóË-Ù ¹nx’s„‹Yð¥F+Š„«õU‘¹¤½q £s><q #Ui¡rÁïÑ‹¹‹­š1 wíÄ<ÿÏÛ±åJã|ĹÌDzE´ðÑ¡4˜”Õy½Älg |) 2æS?ùR7º-RvŒR ƒg0›dß“Áe­c„Zv£×rÙgDaå5S*ºýá—„ÙuÌ]Yn‹Šr¹ « J¸7OŸ$&IÈhÍGqÅŸ.E¤âd¶vz@ž{¡o V¬¹êɇѼ¹á ÖcŸ›ÍþÆlưƒ-“cZL¸ì²ôn¼˜žÔMÙ´Õhãá2w?ž£h{û·úYn™YWó[z\2qÑíãc‚U#´U¶ƒõÀ2gd+§2°ÅBÔ`d˜‰^Z~y¼/Na€C(L &2Ê¡JBÜ )`\H1]f=ÄÅ&¾Åª¦>96¿tÑÄN6 ‚xEA7‹B”ÁŽÀο·ÐÖú#$…Òø-,R¾¾NIyñDÞÇ ünwª—†ñq`©Ž0ÖªYŒ ü^3~;ð —}xÂkOŠ·¼£Œ_"Lö6Ks©Ärrœ÷wó˯Uà—_ñ;€XÎ,ïæwdó;²Ö•âwd1·Iëeßŵf:#¥/ûUC*n"ï3¼ó¥.ÎøXuO¹ú½žŠèCܨäN—òÕ{´‹]µœSA;èÓ…¾M·Øë3OØ%‡Î—À.#!¦<ðäNx\z=ëÅõO³n¯ç¯—8(½%à˜sêÓðÄë©äÕ@ihu}º–„ßM†)éË™^ }q°‡µÀF9¼ŠÔ#WÒƒ÷õïVü0;iåË?¥žøà†“ÞÀ¸•×ÂC6IòŒ=:Œ œÆr†ÇÁz9c9­eh¹’D°;Ëæg*„æ7iÃ(¤”âÏ„µ¼‡ÉkîvB'Ë›½œà–a後>9(RËÎt„L2¬ýØ™dà•bêàåãà ÌQJ-s£áb>ÊJ1·SYJ8ëTÅs˜?‹Œg@‰ÆSF=B{åå)ñÆ¡@ÍâsFã[¨ƒóÙRÒô-ÎqvÑ1u,º8cž*8nɱzL _ ïÞzð4ýh|ö*×Ür”ã•âì8ÔÁÑfà#6›¤%¦¤hÈãPtˆ ’hoYùTBä]ºŒØl?èö#eœ/ßî L%ÏXÎ(HÈì-C¹]“(?hYiöäIš8©W!}jìrrݲ™£žõl<êÑ©ë s¤´ ”§ÚÝLé×7>U‹$Œv&,2¦/AûZЇ‘DÓWvŽ,ûC½ŒÏ¯Yøg@òë){d„jŽí3Ö˜ Ø·#Ô‘R*,g0ð-Øÿvù3–˶ðY®£[u]Ó,ç’ØPU±yTä–Ü’[vÙB±,¤È$hMåÒÂTYT¶úpù‘©–„Ѧâ>r–òŒœR>u­ŸðN IRqÔC‰WwæÓÆ;ãÜý-^:và:ÿÂðåÛw "M(WoP~²‚ÙúÑùtÁºeLh™._oï*Du} 72Z—zúm¸V–=e AàuYï8ëÉYO´ô`¢äíäãÒJ•º¿ìë­¥†ã4ð3-üL©š—¼Ÿc¸ƒ½õÐ}ÿ“ø»Ã3$+|DŸ®Ù˜jahCšÉí3Ç\Ö>ÌíUËTË;¯ÿ)¤¿R<þ3kÆI endstream endobj 5147 0 obj 3737 endobj 5151 0 obj [317 /XYZ 40.7999999 345.619999 0] endobj 5152 0 obj [317 /XYZ 39.8400000 541.459999 0] endobj 5153 0 obj [317 /XYZ 40.7999999 345.619999 0] endobj 5154 0 obj [317 /XYZ 39.8400000 541.459999 0] endobj 5155 0 obj << /Type /Annot /Subtype /Link /Rect [106.079999 552.019999 260.639999 559.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes >> endobj 5156 0 obj << /Type /Annot /Subtype /Link /Rect [370.079999 195.859999 451.679999 203.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming >> endobj 5150 0 obj << /Type /Page /Parent 2 0 R /Contents 5157 0 R /Resources 5159 0 R /Annots 5160 0 R /MediaBox [0 0 595 842] >> endobj 5159 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5160 0 obj [ 5155 0 R 5156 0 R ] endobj 5157 0 obj << /Length 5158 0 R /Filter /FlateDecode >> stream xœí]ϯä6r¾¿¿¢ÏÜ)ê,`Ïxä`0ä°È!ðÆ,Þ[d²‡üûQ‹”TõI"Yd«»e¶ôº›Å*V}¬*’ÅŸÿåÛ^þúËÏŸ¾ýÏåwóÿOßÞ²kVfúŸËíߟèd}Í¥~¬êâ*›Û?—ß?Þ~\~¼}}ûÚþ÷Ç›(»šÿµö$tƒÿøýïo?kâoú/ß>ý[ûôyù×öío—?ÿGû¿¿˜ön_øx«›òö𮄲n_èÓíÃÿ~û÷ºü½íBݵ{ûïOy­TQ•Aýø1üTtÿÒŸ"bÙEÕYQÉ‹²ígÑŠãÿëí¶µ¡×F Q•ªÊv·Ú¶×6›Õõ¥iÿP—ÊjÔâm_S"´¡¦< Ýz$ÂX™ªÖ›ò½…êØlŠ@>‡–B&¤â®G"ˆ3#xÜ’·Ü[¨ÑLVáòê› mH•L Ýz$ÂXë%›º™hÁ³ª|¦„Zœ¿ÔUÛø‡yl?oá·Ìåø¬ÌWÞÇoß@øBTT²PMK>O‰¶ª\·V«‰6-Ú÷„¦ÏuÝ­ûÇ)Ñ N !Òøí‘—ÏQŒúqjhQ±ÉW©KÝââUýxãOæíœ:>×ú+ïã·å[´}oʺ'Út,iB“ç²vÿm^N5!Òx÷ÈÊç(ÆóŒ8Õ´¨ØCX•- ô¼öÏu§4Y=>·þÇ@·fâ·V·Ùe½Ñš<—Zµ–¡µùíe;¶¯Ÿyùåùaž¿š•°*7-?Z•›lÔžñ¹Ö_y¿n´M.¢7à3„¦ÏBc2œœjB¤qm¿œ|Žb4F‹85´¨ØÃ•XóÚ=›6;¥ž;Å2tk&~›a`5]ÍcGkú,doH CkóÛËvlß0+¿£<Ñ"~ -*ÿPUnò¼TY©A{†çZå}ü6ƒÑ£ÑD•'Ï£Ñ,FK9-F£%tXùÅØ-âTÓ¢bVbëyVjPšþ¹S,C·fâ·V·Y%ž<£ Z›ß‚-¥ÅËï(ÏÞh¿š•°*D•‰ÑÄh‹Q™ £½å( Ѻ’¡És©zcÒœœjB¤qm¿œ|ŽbìqZ£-˜Œ¶ JLŒ¶ F[%æà·V·©yÔ´&Ï¥ )|hm~{ÙŽífåw”go´ˆß‚íÒøº‡ï"Ë3eâ÷ö¹¦êFr|©ûo½“_„g+DûQÖSnŸëØü¥›‡_0ólˆÑö»gfމL?Ì æÙЛŒC(fµíÈ>‘Ð>wŠTÜ@c|¹%äºo½“_„C´ÈTS”‹Ž5Clò¢š>ÑÐ?óò¬‰Ñöõ3/ÇD¦ý æYÓ›ŒCÓÅ z®û—®ÕR‰’¼HEˆ7’‡s•eÃ`›V5³†ÞäEù ?çFÒ”„yaæœ÷£Áœkz“ á¼T*8ï_ºVÛnÖä¥( q•1qÞ‘ÐcnZ- xåüEù ?罤 óÂÌ9îGÿ‚9Ï º+;7€&³Ü(ô/odŸ©íŸÃ½$€^Q<›¼”dK&@§æKœ7Ð'ô˜9'Âs^Q@shÜ( 7Ðo  · €Þ¾Œx6}ÉF5Ϭ<b´} è¼™ö€Žy6ô&ãÀkÍÖ( 7Ð k œw`i[·j˜Õô¦/X†á^༗4%a™s"ÜÐ1ç†Þd@`­™Àô†zCaƒó 3æºUì¦7}ÉÀ2Œù烤 èÌœáö€Ž97ô& nÝŽôÜ /oFx3Ïá€.  çÜ&/’ºäô Ï9tJ‹—c"ÓÐ1Ï‚º‡pX3\/# /Râäá\#§¤€žSX›¼H èáýÄyN}B™s"ÜÐ1ç‚:Ø÷H65èÃKQâ*câ¼#!) çÖ&/’zø˜/qžS@ŸÐcæœwt̹ €Î0æÐ(¸Q@Ï) çÞr&@'‹¢‚® N_ÈB¥`ZðLE'´x9&2óœS@_Z©ñ‚µ|kÐs è9…5Î5XÒEQAW§/t‘’a¸—8§‹¢Sz̜ဎ9Ï) ‡ydX£€žS@Ï)¬qpÞ‘ ‹¢‚®N_è"%Ø/qNE§ô˜9'ÂsžS@shÜ( ÓEQA–Ó¢¨ ‹¢‚® N_ÈB¥`ZðLE'´x9&2óLE×¢¨(&°F.Š º4ÈÁ¹Kº(*èjàô….R2 ÷çtQtJ™s"ÜÐ1çtQ”aÌ{$›Àtº(*èÒ ç º(*èjàô….R2ŒùçtQtJ™s"ÜÐ1çtQ”ŒùW–ºr¬+ðc凿~ûù‹Py}+£ðý‹Ðµôÿ¾·L—ŸnõêöÓ¿\þ9Ë„úÓåûßÞškÑäU¡‹7Äø$“ð?ià'5ü¤òøMéу_  >Ãßü?ù‚>‘¿B:°×x$…•1ÍÒÈMB:˜Sé£oPCÔÞð7ø“\Kô·ï-žÄF‡2+,=ÿœ°§*Á¤~òÉ]³sŒ/Øî±=zX·(Ü[ýƿY‘æã%î8 ؆Wd5äeæŒÜÇÒMhé¥<=–§Õ>^åuä–Ô+¨Eb <=OîœvæggØ/—ÐçJi›Ubg)=öªýÂ鱿žÇþlœ=b Œ}ÄØ£GUQ‘ÁÓμê±$²ÍSCûYUêu“3:x tÎgÖ£Có(ë&u~®›OðÌë³Îàa +²>W:Ø_¨«œé³ÙÙŠŽáYÔ£oX[ž[°–C½\é5–ö^Æ;÷y\ROí/9h8¶\ ´þ`eðøY¡ä\.ÆUËÊ6X]ÄQšÏRQ@Ff…Ö5‹¿ýè;x™ï=½n65]Î@ {´¦Õ÷& ~!kNߊÿâ‘ﱕVm‚b›ÄŽ[ p„ó/P«°¤¦ÜD0Áâmnæ½S…GÉŒicŒ%OŸ%@ˆ9BVsXÁ(k6I’c‹9g4ålÒ¸ûÔ¶AÛ‘ˆGdðÀ9ȢϬ ƒ–êÜ„ÂùD|"Æ)Ô˜az£æÒ0=EÞü)‹;iHâ“5õ bSð¤É’«Ý²·Âµ4 rb½œôøËô™œGÇî ^c8è ß±¨Ïqíò9ž$Ú<#„¦­ªÏá ÓV"ÊEY×p0Þ{(`ÐÑÉí\¥õ ë,ûX· 8¬ç…l Ù¯¥ædc‚²(Ý5öœäÃF7í^§DTK„u鑨§^ÂaOy)çú¥q¶¾ÖM¶÷02ÆfÄ|‚ýËiO’#pˆ1°Ûà`;[‘C'+¶²¹‚‘!"3£†.a +¡ë†@U×ÛïÛ¯Vôïoߢ]'ÝZÍQÑaË0––OškÌvÖÛéóññ0[d]|õ;îG(31ÓˆmLYÁ°4µ3V¦åýQGòMƬé‡äðÎV¯ˆŠÓeïm”‰g[p‚=©ð¸œø±&í¼žŽ´Âýj®˜bó›mØúÑÌõC·±$7›H—%tÝ¿À¡Ó3Iù…FzcZø¤Ùðº-ÿiŽpè#ü*î#æËL["ïû4'S³f¦ˆÆÖ0aGК$–~²"T61ld9D® É8ÕT‚%¯½&gÞK ŸÿveâÃø¢Ç}bï|a].pq­âWÛö—öËó1ë±AvÔo\ ·Y S´´{ƒÅE“}¶«zg^ÙÚˆ/§ð(‚«|®•â½FÂÖ`ßp)â•bX¢å®ñvU\¨åB0Þ‹3ðí_ÒY“ÌÊMkÊñõ#P¾>…£W,W+ .ãKçV®Á%‚Ó3R›úË‹¯sáf)y7,‡½VX¸@;F8ÜH÷M`,Çs-¶t<›@ÝY)î!\ðØÀźã3r¸|”èŠVÁÖVÊyŒöý9- ŠaM|LYo¬:Om¤,d5œúÀ çæDKÑÇ.sè^ŠŒ4 ïY<ðÉ2¥y–Íz‰N-ËI– «’—¹xHÙ‡Ô>ò`lzƒ‚À=æÔS׳¹geÄ,èß.‚åPæÏöëPCán÷ØsH}M•‹%xlBÛÞëÆ²÷̾à-rÈ»#´Ê·Ðö~.˜C¹\Ž3™ÛUVÔ ðC<Žªw-»ßG¹cHÙä4cÿì•j:1GaëH›œ} …oÙN(—k0|sØvi&–RÛOgTXã¹XÚ§LK;8•Cý–+öcLÐ5ÜÛ¾ì«ç6’¼œK¸€K€;la©q5‡cË2©²˜žÿm~^s‘W~×ãbp÷ŒÆ N¸”Z¿WÈâS»Ï«2cÈA,8ïà»î/ˆçRåÙáãÃVâofsÑC.á$¯¯Ïy`’µî8s°î0ÕF™E^0¢ÙÊ%q«á6©€ «uçEäõ»û, EÔQ53U‰|Ç6ÖŸYÈ'·TÝÝ§Ö Ö„‚Ä.ïáüH@þHw†=Baã»CÌáºu‡EÛhN†+Å1·ã×#ÝEY4b>%o5ßaØ!­Ê².‡¿¸Ç(ÁÄa›ŒSóå– \’Þ.LäÕî‡ÌqîXU·Äèq©ŽO®3ê5Å—»™œÇ«!Ÿ]b]¶âM[‘xS¢QsIU?}hvÜÌô3Ýÿž G˜ùSoà»HgÂÊ|è\;÷Ë$30éÌìÄŸ}nßÞcqàÑ IbYBw䃎81§³ò@æ–¨Ï'C·ˆ²Ë¦5„ÜÿÕT)m6Y9l]fj®6>טàj¯øbÞúUXWj>x\OâueLôcÌ•ªçãË‘¥±“>5Èñ$º é>ûçyna;ÞúËgºÎçêå$óÉm>×j^œËè½8ÇÆ8¿è5Æ.¯·îx½ð6 ë}îu:#â=c÷ˆ¹å1¬Èj†-<žÿaý΃PGö3BL|[$¡Y :pÎQtÊCÒïûOmØ¢Á*À±1"Ž¿݃÷î·ÆŒÔëù\çäùéwÄÞÍzpåÙSóû§u¯†[û’yŠJ.ǺŽeY×SåZÙ÷iš4L/Iÿ Ô'øIµaÖH-Éî+SŽ ¡[]XÚv ‡Ù1§CkÜe:÷[z.ò^8s†#ªJžes]Á‘3÷fïwÓ•Î>Ò][qkÖ cˆ»îaŒ³’ý¥eøæó×Y¨À7Ÿçøžz\âJt¥ø1¾ã:z!›Þ+Ñ×GRRô o÷EÒq 8oÔl´ëhÌŒµ’sM»=bv¢˜›Ã«îÚHç­ÆÉáÍ÷z;œ™HT&b; òº¤Ù!~¶²B–ÐXö6[ûj·­`ÿa1ðú¬–Û…÷j*Xâ Øn³£šÐË¥ÒQÌb”¢™Í.œ%G㺚»øþ Þ=Søn‡ER8õ¹Ø¶NÔºûúòq&¾TÛŽ€¾è¯p9ú!»ã†>ð$|³¾ÕêL)LµòL)<@JaÄçK) ¼Y£¼ãDÉ™Hœx§¸°ŒçþNqÀTÑ[ˆÞ2ÅÓGMí£žI†§ KóOÃJ£ÜÉÂcqI£ÂzèÆ®D…¸5|w³×íĸ58eãHRa/{Üø†r¨!¾ûü°o9[±œúß4›ýÁn¾Cxå^tŸÛ…áíç j,ŽÐp6ÇÄé&ç—Êc 8zæ1 QßIGSä1FM<Ó‡K[ðì[° ÷ßR(É:ðRp6d§¾Wí Ÿê[ O?¬ÀV•Ía+±ûópGá[¯’p8aê„©˜ŠìLõ®ïB=i 3|¨Ë¹ ïpV»÷ŠÞ³Ú)¦F%óyÿ4S£ê—CÞb¨‹¼ø•É$BïI¨ë-=¸ÛaÁDyíMÇ,·šr—-§,&¬ÿ²K3„ƒó,æÖuo—cÍ-ã8!ïURsîQ©‘•ó^ß.ïQOáL+­0J›J{Ó½Võê,»Þ8ÒÏÈÞß¾­^¤ì‹®­Í˜H²c5ѹàHäÙùÜÑ\YïÃëpxå ¯uÁy¯hÅßý,Z,{Þñë­Õy ?{Ï´¶ru”u¡8GIH‡ i—GÊù”s¸,õ¶-ŸZ–išŽÃiÀ$}ÆyàLhß/`ThÖA/²´–#ð*ïìÀG^ÇËÕÌðLE­¸ÍÐÕŽï6W•œsªZT] ^36Ë‹Ý_Ëh¥vO Ì¡à“Bî .Ndõ^X3_ôLeUÎÄ?lÆ´‚‡zTÖHÉÍŠU&Ä\’  [‚XظFÔƒÖΪ³j6t¯WgíT÷iÊn“å½±ž[ÃW6YG™Ã£nf]»õÆÀý8øGuQV˜è/2KŸÜýdßCÛ]\“})ÉײCBxNdÔïu@é¾Ç÷Ìq% ®§¿¶מí(_*ÁëðhcH¸¥Kâ#9¬ÇÓ|ü%“5+§Ï9©ûÄhæŘVëÓ̉Õéë¿âœ¸2ÚxC÷9¿óÛæ·*uœøœóÛ(Æç›ßdvæèÏùíœß¤ó¤õsîõ˜{ ¬žs¯ÿÜûüb|IãÍœ+s§7sz3»¥ƒe½"=ðY#Æ}Ã2¨<Ú[EæNo“ÛJ"ûzRÌ&çte“³÷œ®lú]Ï Ñ×ʬ¼È(Çk_¶r†~G9yÞ£7ûoà{ˆ£‰Ž…:XŠsèó0gà[áÙ+´åRΣÒjf3ÃVdY:}jÅ‘Sgq L8Œ¶5!\ËyT7²÷3{ž²t¥.²Cx k/JrXWXCÈ›Àb _piÝírp-K)²Àá{¡»dbÞÓ“Ïc –J¹qœ›ÔÕÝ㺳;ÊB'A°"ÉÛ\Hý‡…Óí^¡!ƒÎCgyí¿—­‰µtû…ùßïNÕàH¡¹¯«æºúÓí£ÓåE´|-Å嵿%ÏTϦÖÛ²¼–ËrnÔÕÒ=ⲺVs£ÓªV-|¢5+ϯ²™­Æ*®¥ѹù-Ñ©áoø=;Uò*³|zùWØšV ú—Ïð»æüÿ‡_ÐoŒë¸ô‰@|›qû1ÞMß:к۳,DÕ·Z@z•»¬;PrsÀ]\³jvŽ­øŒ´Ë\ Ø7¬æÇ8Ûnt|´ ê b>¶ý`ûÜÒD§QæLÇ$ãܤùñÐ !ØWNåòõíÿøÁÝ endstream endobj 5158 0 obj 6788 endobj 5161 0 obj << /Type /Page /Parent 2 0 R /Contents 5162 0 R /Resources 5164 0 R /Annots 5165 0 R /MediaBox [0 0 595 842] >> endobj 5164 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5165 0 obj [ ] endobj 5162 0 obj << /Length 5163 0 R /Filter /FlateDecode >> stream xœí][oä¶~Ÿ_¡çÑŠQPص½úPÀX}(úPl’A6ˆ“‡üýJ#il“óQâ!©Ë˜6à‡yxn<7~øÛ—ÿÿý£øp÷å·âëøz÷åT••ª†Ÿ¢ÿýîõ\—‚o]—¼íНßNÏÅóéñôØý}>1uî8¾tÓ#†ÿøúëéÃððÓðÉ—»tïþ,xñ÷‹ý»{ùa¯ÿ·“nUÿæ—á ãŒëîŸ×ïúÆÿþù—â×n úýÔMã¬Á/OßN²û§W *^<ýPüµScëï‹§ŸO²”¢©G•wliÎ-úòkÍ*ãƒJÂÁË\?¨;mZ3^¿þª2G}€_F}xê /Ö+o×AÆ*fŒŸÛ–u;¬óeUj‘µŒ`½Öò€ZD Ÿsû|œ™A0"´cZ™xg"Æn!âÿ¦¬Ì•Ì"`ZTáLË”èâ3j©4ÜÜ©7ªS›g7 B_ÈYŽwÎÚd‹ `Qee£ïr\²™‹Õ3݃ÓÕ§ƒ3šë´ö†ž…ÄrºcìÜÂø´àË“Â|Þ6,!lëÑ*Ò2šº#OC&A‰PA)‚ÍH|×X”p”<Õ'(/¡TäÉY]­Mfmܧԓ˜ô1ÑLt:A¾QµzCÒAœ£A˜í Ìîg¯õ»ãìc)Á¨†)Ó½ã$G îŠÂ}7?·øœíg½{™Ü4ó°Ú;çiUa%™Êñ (t¿fã>XÚ:¸/æ¤èìYK§Ø_j¡¹¿Ì;Gãå”sè±»ÐV%›lö#ÿOïD“jRù >]ñ¨Ì‹zø@°?Êá|6}ùÔòè4Çó(Ž0›¸ñx” œå¾zÇ”°kÓÃ=‰Ý…pxÇÆYVÐò‡´‰áꀑ6çŠGÅp ó‡åTìNs7fa\‹Š¾ùw$Ë“ª¶‰=—cŠÈ‹Ü8ÀQ=e9<ìMöHWˆÁ—£H/3ãF…z‹a&dE‰ÌhSxë‚è¼åqîŽÀ’åRÍ'í "ÌŽ1è Ác”™+h0ëR·•í3À“ÕÓJ_Z>Â9~‚zŠE™Öž{Dd´RöSbÕ0š(B|WëÆ<¿@M’¤jyÝûG¯ÅÌNžw¸\¡³cãLeÉG±;|^¯Ìi(8¾žœçfÃNQ¬¥A“«ÃÉ‹ ]ИÄñ¬)nìúÄÅñØG·£ÎÂÇpƒ»í€(ÞÓ QWŒ=nÁë¹1'&ňM®q ÅÇ4U;¸%Æ^Šó ã(0÷WºŽ •Shq á28øa.a5’t¥à‹+ ŽËkpÃ|Î:n ½cÖ˜Ò1G¡P …;`èàç`LÄ-¾AÉm#…Ç0Þá$è+Ž`,?’[G']}‰ÃÀ Ç‘ÒÃçâq,ôÈÃ'¹()v1 %öG­tfwŒŠ×7›Ä6á÷çAa·-U«DnŠ¿žbäŽИ~Ø)ï;¯ÅŠj ¹r£Y¶…’—ʼn´#÷„GY>ŠË& ·»-Kö!Ë`Þü®äärTÛ$<›ð9ø(ç8.QrÉ)U½°€`¸"/ö_B%’{„³ñ_é$øÌÝbcWTGŽÞß¾:v 9F›Çõï#j»Ó·2e:;S³‚@%‡(%"©%r50Þí Œþ9I«Î*C♈ñÒ0qâ>K §Æq†­}åÄöþžýI¯³_l¦˜÷m± ­ÝQl¡›s½Â#e€=¯ 6¸™|Êxæƒgó™1inñpÄ9ëx Pšœ'/¡=pëvwó!1PÌîFvn.}Žs#çÜ •-Ï)o¨i,â÷8y°µ4—Íž><0¢D¬é_ÖlJïÂÖcì÷u¤L¼[tÜ0ócú$6·­ï½6¸!K©aEIéÚ~1–c¡²ë^Qs ÿ!8®¸Âé)p={¯a«ëÊÞÛWaÜseããÖ¬×Íå©kÕŠkùtyH¢{Jß½¹9¤˜U6W“öcž[©ÈvØäüš:‡fyA%貕 ¼Ã÷±{Ǫ§”c¡žááa à»=›*™øúvQ›âô½Å &Ä7%˜]ŽÃfæ«Ðy©µ BR˜´LÏ»+igû\ ©8>ž‡$U!ñ^øÑλXbBŠo™2)Þ;æ%-Ço7f¸{¶¡DÍÂöª€¨ïκRè$$þ׃âÃSÚ$AãKã¦_9AtAañå¶ Ÿ¾x«£Fý®]ëaM?]ûR=å~:J¾)EŠŠ$e9»'¥¼ÕZA ·‚SΩÅÄ=xrEu¹CÆ‘Ÿ<ײÎLEÐ]ä‡äåÙSž=ånXßš§|'\±ó”µ…RŒ•t2¡Ð²c=‡,TŽ >rˆÿ}Ç+lÏ;oMÛÅØ»=¬³œº99µV¤ÕVº‡X$Q5!Ñ£ñâ—ægÊXL?ä™#G®¸m—ñ6ËI-YoÌzã.ôÆ[ã57§±®—!íá2ˆ}hSLêYˆìD›RS廽ۚ™VÑá㎠\D·è–ÁåÑÁ¤”ì·£[“>d¨½Ï÷¼ƒ»Òý‘a8šc•´n‹N’¨II“·µIéÑâ”»Õ—ßß<„ê˜Ú» 8:êý ÂB¼wW2ÄgÅ„û¥8éû:_]fIFOX³+rœ¥”‹§æsKóJ÷ÙÇܾD·È¯}ŸT@ve¢¤¬§EÊrq¶.Âë°Z±<§ŽR`3Í]*ùâ´%}d U‰h¶ó¹3û¥ Óèhñ»#ÑâQ}餎«´ÅÜ€©Øh|⸸W.y°ò 9¥9@Ks»ó!œ vÏ_ÆæÃ×–ÅX¼­—ò"ÄÁKÓí9åå2ÍϹ–ÓJv.Oq˜neÐ>aÄ¥¬áÞ”"¨ÈÛ1¹|N†ÉAÆnX3Èxïá¢Y@9&5:¥ãAõàœp’eÁвàæÂ7w")tH€ûš!’’73Íz½ ç·×ëçßÌËoŽ—ï]¯—RÍSFÖë³^Ÿõú, ²,’Y¯O"ÁÔT¼jïz}]…”9¦^ŸÉ]³¾ÅDòš‡vȉäY7së?·FÏ7§ädí9)ƒ.g[SciBl¦Yc¹=ŸX¬±´!Ųƒ5–ãj,zÎËÞ4–î·xîXaÇæú/Œ/_¿9x£ÍT«¦úèd«Î®³üX«‚u˸ŽEËTyŽ€/D%ß‚S©R]¨oe9@Æb{¼)3!fgs¥ePÝ…(y{õ޾º.Õºo²°kÏѰO û èÞð’W¢o2 ûÚhR¿þä~wÌb¸²ÂϨϘ:y­…¡uŒ,߯ϸc>kçv&€¬ëßóš]\î5|^ã ãă‘°+«¡iÁÞ²{„½æœÁ¹a|€ÏÁëa„çP° âИE|¥…Ùôƒés½v9î¾àçŒÙb~ÐÇë!`…8žƒ± Â`*ʰdNü~ùw¸bá•1|¬Q®à+†Ô«ìÅþ¨u¥JÖ_ü–Qb±8jM×Z^êcê+Åãéÿfön£ endstream endobj 5163 0 obj 3440 endobj 5167 0 obj [319 /XYZ 40.7999999 375.379999 0] endobj 5168 0 obj [319 /XYZ 32.1599999 511.699999 0] endobj 5169 0 obj [319 /XYZ 40.7999999 375.379999 0] endobj 5170 0 obj [319 /XYZ 33.1199999 509.779999 0] endobj 5171 0 obj << /Type /Annot /Subtype /Link /Rect [315.359999 522.259999 376.799999 529.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps >> endobj 5166 0 obj << /Type /Page /Parent 2 0 R /Contents 5172 0 R /Resources 5174 0 R /Annots 5175 0 R /MediaBox [0 0 595 842] >> endobj 5174 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5175 0 obj [ 5171 0 R ] endobj 5172 0 obj << /Length 5173 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹"õ<O€6CCàÍ&X¬qö¿uKêî!õ‘¬âCR·lÀ3n¶(²ªXï*¾ûÓçþõûá݇Ïÿ9|~øüT‹ºþN¸ý l²~mÚêXv§?‡¯ßž¾¾?}zúÔÿûýIÔçÇýàôŠaÂß¿þöônxùÓðÉçéûß¡<ü¹ÿß/‡¿ý½ÿñÓ8ßé ßžÚ®>ýòëð‹(EÙöÿ¹ýí4øï§¿þáð[¿„ö<ïéßd[·­,ƒÖñýò¨8ÿ½}½¬8¨VÖ…:Qöë¬zpü÷ŸO?÷³]–qì”M­šÂ{Ö¦/†À)_¼!,jý«Àö‡'1ˆÍ@W…b>«àW9`¬Ñˆe;¶,+ ì˜òB~ÖŸ<”Ô×j,¾Æ\–É‚’%¦ üAb¨²ÕøwÙBGFtÎTp¶1ß3>“PÐUE¥K:nkÁ2TôCãf²—’ˆ•ÇW¥Ò·‡Ùk> ½x%Ì( lO"éûâàü>$àCH"Ä\ÛFéÌ/üU§ýÌ':ry˜€|…zŽ¿éC°Z8¶‰ÓQ3è7£EÜÔjÚÃË0²º™‘òH¬ª¼Â‘¾ŽXV¹’¡”ág¢®ZâUCXãèÁ+Ø´<QH½¹ÖVÂ÷Xè€1›„«¶œúL0ðüp`€g“/êsFNÜÊNÌÁ”„y'Æý ]J`Ž×V ¸êΆy4äƒÃí8Ãm¼óÁCó'<ÂÐ0,+ÀûÁ’ÂÚ¢{`®ú(xæ,zÜ…F1fȶ\2”#§–?Y‰¼Ÿ¬ýdeÔÌd—Oÿj‹2@—ÊOn¯!ìÙB+UŸ<"W20\h§h€WÇâeÁ+ñwˆs|¯îWnÿÒã9µ)t%Ô½þ8”…´Ü“øÐ-å~VÿFùÑ›^-ÈZ‰Ã9% WRãá–ce §æ0r‚,/&pèAè‰âX7â’“úÔ+­õ›%áólá &K±P“µAžJA¤‘³¢üÁ'ôt\Ž’&jE-0¢¤Õù“‹C5 À9ºÓrÜŠÒ‹ƒ€ëë]«qÑÝå´Æö¦—í¢(:]¸‡ ‰Ä9n£IÙ[À‹¤”y­¾µg]:lmZnSkš‰)„¢dˬΉ²-Žºa~†“:îR½Rd9)ÿ’\‹Æ”–É”­±oÈÚ9"qk‚BV:×Ý6gX(Ì4ñÙÖ·g$Ôši[+,aaÌæzãYœƒš±‘ýˆLÜYÇq2BáWÝ'¨À8ç‹`LÈaêªÔ•œ°h¸î æ`æ®…m$6H¥Òà­ ‘Ä1¹pÎ ´d¢D«·„ºw!\nyvºT)Ã.·X¼™a:D©xa©bßsѹ¬µ ÁèNË÷:1ªY®ÜxÙãkuÍ ˆÙ`Ðc6„k̸%b¿Þ€ÂúLF¥2¨^RUóŒhΰ~¥ŒYØ£{ÔÃºÓ ¦æäÔ¼œ?UAuÖ0Ðh¦è:_ÙäUž¾–Eªp€By˺¨ú[îÌáXˆÀe$“ÕÚ6}[8j¹”ɼÞ< #}Ã\|8ÐÒvtÐÆic…ßÇI*$$ÏÄègEÉp%1ÑÊ]hWS'7J0|Oy¶ðNŸ1üb)Gçàd–>Œï.¤… ¡SJž$͵Uäĺ²$K3ƒ-[)¹ºlufÈq×ñfÑ9>X 0ÎT îEÐ-Bª.Bz÷pdŒ9}@!ql»¢Ž–ü¾‰†hùZõ¨~…ÓþqÛìGľGNûŽO2ÿlšçÓ t±Oûº!D±QÀU´uÆå¾yÎLé¦1Œa ½0ÚAá–XêcЋ‚ôò8§ Ã€Õ C‡ÑÇi°¶ìóNÌ£q,ãsœÎû0q ~8Íçø/¨þeNzÁ­0Dð±N…[k`úÇ+€³eÃ0”Ïx§–÷À‘5ë5Y5‘jºÎâ‰`Ýór¬ñómäžf%ÄÔm%§ùnØ7ÌpW›^ìí$$kºKŠ£€¯0âNF"œ‰ó(!ë\Éd·uâú°®Ò8Bu;eE—”ÚÜÉåËç¾D©õ\W8Êœ²Ô”½½þê’*önWË…~ã„CZz„dÂsô'œÇÏIòæ¼'jùÿÂõfJ—7»á¼qÃ9¡ðëD­ ¿õ$©NFפÅr¢-Pýîúû̲’AÍò†op!_@Ê24!ïROIÔUv µúQ³žýY ¡É¶G·^ìž'äoWGik¡K /oÂ’Ûrñ<ŒŽ‚ŸÁ×:#Ã,ÊʃœçÔwµqêU˜q¹›€dº˜‚Š$5Õklµ”„\XÞAŽyñ?ÃDÀ)#õ8~›½J|ö>EbBQUMžó à–ÒŒ<ºG}®/Ú‹ÐoQ Þ `øÄ w‚€»®Óp—=àÒè¸Pý91B®¸Bî€óþ{ÞØ?ßÛÈu}ûÁ¯OŸþô¢í¨x­'<5ð}{jÊF‡'æ3iÔi |âA lT§ÇN¼œÖöPªÙ»F3·»$²ígÊ+”þɨ{Ö¶¯tÚWF~$š GבE§†7ê̺¯“<ëÓ^bÛ¦§Ž˜K©GxÙ^o_8H/!rÀÛuäÕØó ü®9¯ùô+ƒ¾±ØfæE3ƒ›-ïŽÇHtÇ®=Ol›b ¯nt¡ÌHB”`¼âÕê³`^…&¢E[Ð +åoðG˜ñ!Ät Ÿå[3a†GH"}¤j°4N÷[Œ´‹µÈ½×±‡½Ò›Í?òäé&¨Á1z¦ÌN@Ì£¸óÊKUBÍ„“CAa¹| Ðqr+ótÆÁ.Ë%nÖpÕŽÅÉÄ¡Bw?¸½ SòÿZj`›ŒØí‰s]1ïâY9Ù—þN—î!8û õä¾(‚Ãèdš»Ecö«ÆC"IgœC µLMxHþl»R=‰ÿnú”]¤EÏì[èN‚ ¦n-œXX¬ƒ¸ÅãK°#1ê/$\É­™‹IêÄíZSß9¢Z®õIkÉKÅìRhÍhý@Y#¶ džsL ©ï!É[ÿ!)„s;[áeB8ÔRbn8. TŸ¦ô;CœÔ¥>uÓ½Ù¯\ç`;ß ¤Üg¿q01`ñ­ºFîNèˆjI°üâø˜†HÔ< *ËOJþ1Ä3ÅaC n§ÑTÆ`,Ï´û·u^P“R24¥&XG>ʽ,1$Á~&´9g±ê´= Üç)µ=¹¯//a)'‘¹èðí“K±ý&*i¥¹‰j!ocÊö8Ri’'µÃ%€—&öµz¼‡Hm’ëƒõ(/WÓÅq¹p¬lÌÐú|NÂCH”ùý;Fqí¤¾hs©šº4‘eJ»Ÿ€ 4EÙätat›!!îÿ9µùr´®ìolx7Wc©“‡ã—•Ĺî—БŠÞß!wÈó.ˆ˳V|U¸‡œ‹‚‚(.­Åá%ëœSJÍ2R.:_®®yŒÛ:Í6òüV\)Sª ©É™ìÜu)•2¤.×#yø…~À8fKša»W-sêUCZfJ1I}¿4!¦Òv+¦œ²Ô²D!N§„ô'ºV#À\÷ÝÄiª“FûÇh&¸æ9;‘*°íîÜ‘ºsp62°[¶dKÈ’õ%öK·‡s,ªiK×x†Œ*†6Rscè—¦Â5…#‘|‰’»àwŠ¢­lÃLõ)õÌ¿}].NÍéÆñLeNG%»GãN‚_c‰£w…k6V^µ.NîÃ7—ë<š›? °Œˆ"¸ýSfï$m9äB4¤¿(%ñŒ Ó‰ŸF>GQ¼ŒÀ¦¡”2$¸GìÌ_Û°ˆ¼ô™Y•¸Oq²š›~3X–­|ûJ¯#Äaàœ2*‚äH\c”Ä1Ã%N»Øô¡s.‘ ‡e‹Ë4&‘j¤„LWw½ðÖlYµÃÚ= «ñ€²”Ôêµ4ószÀ6p8F'¾äÞ£˜ h ¹ÊIÀÝó6¼1œPš4­Ô¥ÉbU¥ŒÃHè Ò7/Î-18ñ¥ú³ì1wš@ !½É« iãÒp즡ó=Ï`µZvÊ;² 4¯ ¹}dÅ”;ûÎ'ΞI·³Û{`·âÔHyë¶*5±bÖø_~í¶-s7µÊÞ¬èîk©—Šžyô±(Û‹ª3)SQóp6TÖ–Áh“BóÖ¦ôÊ5ú^3\NÙèRª±©+™¯|Uð“¦ã- .å IŽ¢:-,³Ýºþá¡­ÐŒÈõ¸¾·XmÍ)Ît$eb´šä¹«Ë¨Y™…5O¬ÖäêN¢r¦Gúô׈s®£hÑÎ\õ»ï°¶…z߯ú¥ lE}„“¤tƦ̘î*ÝÂ!ð}ˆÓ7Bpvf‰d0e…¡±â^ûã~Æã–²mç¯= šbºëö;d,âp5wȤ—q'Ù¦1äýʧ'Kq€%ŽìD©© éq“V3¥p®&˜åpß^ÏuÎV±”fxþW4mÁHL“xе7^7›öp²ofÒ܆öª©§WÔÖÏk}b…FЉ›*Â3â=|¦CÏŒg¤'&]Ó1Õë@ƒÛÕ8#3ï|fbr¥že"$Á+x¥ïT|„³á ”ÞÕÈ\®ïy…#ð™ñàÖGy>$·Ï ‹ 4õ5HÌ­@¥·‚+]XÜöü:Ø®§yv÷#†ÜH1%2Õ¡.MÎÊŸ‚Ǘé£äŠ[4 Æ- !íäÕá™NFÌ` !`ö›yHX½Œ¯F àîÞqz±Õv&¶Lajx×3µ`^wU …œ°ë!{í{œì)ƒ9{m¿ÂC#×ÒƒWæÎCMÛìnL®ˆ@;BÉ%téU«Æ·Ê‹ÊØÿ yF##JfFJøLW j4"%}£Smnä}%ž­¤Ã ¯`¤—¹À÷¨÷ð™ŠþŒT:pdÍ´# DGþHÚO¶¾€u¦ßò\_ù(9Ò!ÑŽÌ<Ó—\L9r§Wß™h¡êÅná º8àëÌÊ)$˜¢î[°ñ-‚užG3uÕ©N®Ók9Và]¹v¯e_xnûoSñ,|Mñ½ú^ð¾ð·›Ÿiª“8^XwŸÒ²–º'‰RFĨ®1'¹då µRê²-fúóòf³% Ç ¥¼+›±Z]Êš.A)Y!«iX¬{ó}(N› “4*ÁêZü„”‡p<ûô$©”½ñå⃔ž{FªXTUÓ¡8Dõ¯a<ûad"XÞsj^îš´p¶¤¨îAØ„AئèÞ®t.ðG,Á7ÊãÅð3– %¤Á ¥em8ù0Á^ ð{+°PÆ)N!ÀáYø ¬ñ{ðÚp°—Cñ üX(DD=?xŒ÷Htð ðlœsŠa`I`P/'½ÁB;:`$KÄ»µÁC‚•“ç§aþdƒþ-¸gp|œ`„eîMqR‚$\›E‚my$Ï9«'7®)îšâ®)îZÅBZm?X0f[]€)se×™Ë#?Úé>ð]O»?Y7u;€–·©¦†·rrô©±ˆGá-J6LóÛóý6‘ïçÎ/_cì{ÏÜRF …¸é×â#êì%—’e—Ƴ×HDiÚv`°‡”ÜiÔv›á~÷±ÜT£÷€D:K>²»©Rš“F¸ (q/ú1! ‹ÕÚvå´ÿÝjÝ­Ö³[­Y¨¼b§òëlØ/ÇñZî'#òÉ(°·¯€C£:ñΦÃkÓÕ“Ót±ãm— oÂß%•¸oºéà`Çß™ÀÙΖL¨=óW`mÚé@r;¡ümNWBJô.¦Ú0þ)ö"Ci¼ó.aÚ]r_éÂtÛÒ Qœ†Ã>ñ¢é¤·Ý ¡«kw Ç_Éh•æNS¨\´aP’Gù½ËÝ8÷Šr O8ñçö†âN ÀI¤Ð…F’ð1AMgi؆¾Ç°#ݲ=ª5×§<–Ã3wÓE¹‚v;¡ÝÁÃØØ ]/bé!-‡´Õ÷çc‰î¯êÖß¶‘š€Ù´ 3sŒÄ¥* ·TDٞĴÏAKÔä†tÕŸ`ˆuÖiú´rÄFT‚´Œä+ß®Šfzë¸Ûƒp7Êß=…§«¢íÜßrí=ùŠ6*Q\~ÃóˆÏ½%花1lÁýàëÿ¾÷[ï·uúÂøãë7 ,L W ~²‚Ñú¨ûFÔú úmÌõnêD}n©”ÅtM˜-V×Çz> ¯SGàœ+›c3%kfFB–òXv³:OUëAˆ^Gøž>ÓÁgÆ×”DzorêÇ37ÛÀFo?yßu©™¾¢gFuknD }ŒJ*í™c”½k;€ª;ý^Vån¼ƒvî} ,Ï@:õ¾:Q %ƒBÌO,k©^,X†43ÚsЀT‹ßc™ Ò³e§ï¶:²0`ŒOÆÄ7^m)àlðŒÍP^-æ_‡& âµp¨®i¼µ™ |Ê0]™;„¼Žƒoqã™ àum[ÔGqòû¾ezXÄavxÛîäSLÝãðééÿØŸ½S endstream endobj 5173 0 obj 5640 endobj 5177 0 obj [320 /XYZ 40.7999999 451.219999 0] endobj 5178 0 obj [320 /XYZ 40.7999999 695.059999 0] endobj 5179 0 obj [320 /XYZ 40.7999999 695.059999 0] endobj 5180 0 obj [320 /XYZ 40.7999999 547.220000 0] endobj 5181 0 obj [320 /XYZ 40.7999999 547.220000 0] endobj 5182 0 obj [320 /XYZ 40.7999999 451.219999 0] endobj 5176 0 obj << /Type /Page /Parent 2 0 R /Contents 5183 0 R /Resources 5185 0 R /Annots 5186 0 R /MediaBox [0 0 595 842] >> endobj 5185 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5186 0 obj [ ] endobj 5183 0 obj << /Length 5184 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€•Ň^@À3È!€a99Þl‚Evgùûé©»Çb«X¤¨­Ûk¨b±Þ/¾ûãç¿þùÛáÝÓçÿ¾N>}~¨«º­Çÿ§_?¼þÝWFíú¦ÒÃé¿Ã×_¾¾=|zøtüýÛƒj_^œþ8><b\𷯿>¼?þ0þËç§?ÿö¿ƒ>üéø?þú·ã?Në~à—‡~hOù÷ø¥•îÿóúo§‡ÿzøËï¿Aè_Ö=ýþƒéûúôN ß.¯ª—_¯_E«¶o”>‚øò[sDÇÿñðÓqµ Õ`•êZÛÕÁ«vú´lmºÃеÝXgQgoaK©Ø…ôPË,t‚HÅmMÕ¶ó/ÅF}?¨õ}»ÑóR±kU×È þ‘ŠÛÚõx).ê[ÝÚq›GJ‹ÄØe©Ø…lcd:A¤â¶6¡Þ³õM=â«s…qŸç•¢ÖtƒÐBõ ]1;;#®ÄÆ{kF¡jcåüe¥htµÅŸ RQ;;ã}¾Ò' @_-€ož¿<¼û¨¬éOÏ—ŸŽ€¼XMã_Ž›m?œ,c_~<ü¾®•ýÃáËÏCÕ ¦kF3ké‰éÑ“z€OžàžèGøÎ3|òQt?¸SÕÑ!ÀßQ6ÕÂýøã`ÜÏó—#½&§¾£šÚ©¯ êƒ8¨!aØŠ§¾£ÀŸ¾ú¡x´ºP¦_HWZÄt…e æÇ†æ:ß×®0§L¿£ððùx¸ã s7Öø;)V8“‰Æò`Äö»FÛ†FStŒbKk»6˜n»ŒZðÌp ݾcŽN½Sÿ]‰×¢'õH ¶êw0‰Þx§~ÿòD™ªSýééuµ‘ šJ·M«¿{2’[_Y={gb¹[Oà;j$ë¶2J7ßÃöˆöãïCÐÂjÁø®2C={>ÁØQbä:Þ±õH®íÙ±ÝLï€9¢£Ÿ‹Ø¦2ºWúƩڹôêªÚ‘7ðɤ‰o<ÑÝç{ð]uf;>‚¤ŸHq:Ÿ 'H}ØÙޏˆó=ʪá»P4"LŒ3÷ìœ@—„ãÂ0†#V?ÏRŸ‡Cæû³f«¼‚LÀ‹8‡¾Qý~Ó)5AÓÎTÁ.Doˆ;‘b9…Bƒ–G’n!$ÆùF'óKé3ÔžïÍ¥œ+‘Ã-æÈ=ØÛ‚€5é"’´ž_-AY˜Q0¬ÎÙ/ïÁ«ÃÔÎê1‚n|²»ƒ°‡-ÌöX×cû@Lx<é¾éf:`¢#Z ‡xÞÃ'8ðŸXFè…ñäpPÖ\“ƒškòòÄŸz\2b/QÕnî~S?M'·¨&ߺ?gg$-Á’Î’ƒþ'†á?zLŽáÆ€`YCQ|rù©Ûfθ÷Êbx_¿}Ù·É<C"Î?0°‡¿§?Jz&Ž{5·Ïȉ»F¸Ûê|Î#“ˆ˜DNÛ˜ÈPuÕŽY‰«­p6·j5³ðBÈ/À½ ÷ñYÖ?óIš6¡½ˆ±Žàôº£«çFŸëK†aŒ#–…Ò&UU.oà.M¡­>!0#ƒ6}~Ôásm„8Ç‘tAdÿ›¥wËm•ùrØ‘“«"˜šá”âfÜ’ë8¥Ì ƒyÔ¶×vŠtjNº´^$*ÁhÁV7L_9´ã±º12¢þÁ¹H,Ï~ÏŽ‡¡«L%qEwXDYKº$ió,Úèçìy–íåYLÛÎN±DÍ‘ ÛšR¥8œQ@ <óy1’êFqä6Á å§´óÅ÷6ÅŒk[·1qÜòM~žyEIËq8ý„xY± µE¯›¹î©c%áfNÚK7l~/æå(®ð¦Ù´@ ¤…œP+l·luIèúºäFÝ'¸6É;u¯¢…Èv¹TÂ:ñTÄ2|ð€qÄÔ’æFÃ(dogTEØ4e' KÚCš„D.½&¥`>†šbrÌ ïæÖÂÃàìxX//À1yUñœ ¸¬á&YÕïáóûpYm®ÙCÕžý‘«NŠ)öÄDz­Ÿ‹lŦ¥ íñæ)‚õIˆ84è‰hq‹›¬ÎâÈ»Uϱê%ŠrYçQ8Œ…,E}‹Øa{Â÷&!™Á[îC_fî³¢Îjâ”AL(+b[Ù jÂE÷^¦“½Kƒ`ÉHÔ‰‹(Ú¨Æ Ñ†`g7UJrnÄØ”:¥7s¥’&¸ "ÇŒ#°çT%½éRº{â)™òX«Âê`|ºþxù-EwA§)s胞©†õ]b‘D—DM@=a¤ŽºñžD¸fý1 ¶Š¡¿òB2¨Aô Â±ð"CÊ»'V‚' &-gþe®ØÊ6 Œž ½`ýB€•„¯lÖ“ l¦éÀ»*H áÓ!$(e 1NéÏòÌžÜ#‹11,ÏOÁ´¿‹¥º™JŠJO‡ÓeôN 䲇 7á–Ïê!‰ÄI«½®Ñä–ÞÁmên‘4Eê³'‹’åÉœ#ÌPM=E¯DʲÌDÚ¸9c܉!VO='®“ M;2Æ- É4ißaTÙ9 côÞÈðÞh+Sv5IŸËÝÆ¡¤C(ä+³²¡u­«=¸…t·Ì5,1!òã2‘‰åˆA!ÄTø.’è>²ªJY¯Ôu3q0:œã`ãh¸…"+=ïp:§žƒm²‚Ûgëê°,dŽ4•h™‡P|ÎXg®¢öd!9Õ$±¯(…­âÜ1!x(I«ÌLÁpFrâÛiš>9qgç{Ër;%ë …GJdo3d¥%ö¦ÐRÒ–|ú. ¨)ó‡\jh­:aÌ „YX)cÒú$Lo»T‰“*åµð–W_H[U>wo©Z½¥*Qp°ØZþ”UCÆQ'„ê­òn"8^»#´;Bwg²ˆÂrçµ­XËÝIbFb¿U:Rð­›ÃëZJð—‡K½akLÃKÌœˆ\¦Á›u#Êsµîñ.ÜõÚò-Ïô­´Æý÷ç!Ï´VSæ 3Lnw‘ÎB±}ÇW3‰lïSÁET…lŽÓ€PỺM¿¶9N)¼'`Ï9F¶žu8™Ì¼€n4¬_6]C-1¯Ý`ÅtÌ íLÏì± 9¸xˆÀ©ö5ܼ–|¼Ïº½Þ¦9&†êeß±ƒEOêóvÀ;×ÛÏwôιÆž[ůO¸Ú$›*; ‰+ÚŸÐ3Q^]Ù“ Õ4‚@=ÃÕàN=«Õh5Îwjˆƒëýë„ý@ìxvÚÀýœu†žÏðÀ†ñ¦’›èc ¨½ŒÛ5ÝŒ3Ø€p‡;󇓓 ;Ôo‹&\E•ä:3J(aýŽm¼6FA9Å=#4O‰´H%nD!PAøv/»..Õ{O©EÚf¦FÒ(™»gà÷–]Â=|t¯K«ë3;bMWýdnŠ o/Zm¢4å~‘vެˆïÅLzˆš©Np0à–¬7kÀQ(ƒPY“HŽÑÁ]¾NR&xºü"ó=Òx‚¥‡éÀ_Îþ²R–1¶™[ÑãesLÙÊ fÝ‹¯¡Ûvƃ"$éšÞi#ùiÒ@2³FNµÖKøvâcôFÚS¡U7윰Ȭ¶4]âyî‹¢OSçåx ãe°¨X»€0ÈûÁño%ª6‘Åž²K]÷3­"[âB¸!D¦ãÙé)ÆÄÛã½¹.¬\6 íô¹•í1qÛÌCVd§² ×¢ É'}¤w»ë„kYž$Xk:¡€|gG™fŽíÌÎÀÆ…³È%=«Ý#Âð>X¹í&É´DE'1-LI§&Ê›†Oa—GÆ*¡Åß)/k—xPïF®½hš~¦¦KSN=™;?,‹mP.L —¡n@Š“eJ`8Ý[{#þ”«ï¶˜qXÙæ{wöRÒ û¸9A˜‡Ü‰õ,wO¼]³›ÑVDä‰üo µì²>#K)ÒÆsÇ®6Äg@Dĺ‘p^²°*§;m5EŽf(Síæªáívà‡Ÿ;§7?j"ö¦TÝ·õÌö½¾Lf˜YØçOêyy (1SG‹å²Ì”ÚúEZXsâù ìLͰ&ž‹ÌxË-X=÷¹ÚÔ(Áâ— Îñeÿnŵ[&©Jì}¬Ö)¥eq Àþ1£•pª$¼²›5é|ÉÄLy Ô4@ã*dÇ2¶7(³…J7);ú¢p8vY½Ë^óµœÊ¥BÎ…ŒiÊšE½ÕÆ~î9^ºt›¿z©kçÖ¦«"ÚÌDrg÷ŽÂ1Ÿµ®C[ml/Á4™*HŸWS^ü†¨?ƒ—|¹aý¸†HxžÏd(‹µfv@ƒ”sˤˆüq°-2£$œ¹)„PÜ4V‹šÄ`•\e“L2ˆ* sˆÂ© å$ᕺ@G8!njùö¢mrrmÇ[^)ïpªíÜfØŽ)µñ¶6JÅÁgµô“Xëv^™óF¯«âŒ§N¢ˆmã^ˆ„¸Åu¹A’6¯Ä°»L즕Á5½Ž:ÏXÜ;;öÎŽp«»àÎŽl#ìû‚FØOWבFØ×p´¼2Ë»ãΧëM5Ê‚Wh¸žÎÒG¾c¨ñx}ðIµ•Qðê< ¯6L„lœÑ øä ÔæB !…¤8Óôº²¿Ž„ùù¨éFØ4 —¤‰¦i„k‚ÁÉ jdD/|Uçp¦æ 9×'øÏGtŒâ½®N¸ØT„‚ee/J,ÿ£¬éQîz¼qºZè;cä(D|€OÑ“iß7žhøN !P-zb ‚z€Ožèh¼š¦ã C0Éç[ÀïØ÷ð†þޱ;ø Æ|§~fP"¤U 9°Õ‹¨0ŸÁ=x°éÅÛ ÎÀ¼‰iìÞ¸V–›,†`“ØQP y¨ÊÁ"ø¹=}w‹X×2öíÁÈNI”„1jÄ¢-4¦.‡PÆbYn°ÎÀt ÏÑsÂ6#FŽ?°h‹à³Ã¼Åà–~ÅTŠ­¸Ÿ[w;ßó4ä3Ž7˜7?d䙦Ûy&d? žÁv,†À³S,å1®Øñà ŸôÉ<¾ –Š~ ×wɵ]ûýWW¶w•²åpP&nàpªÇÞu²°-®1íÜY|!BŽå‘ÆDØ÷vZ?zo· J° ²jÔæ³+ü)äV×£‚ÐñF“¯i‰`‰ÿêHîÍ>ÀûñÈ,i ÔØõØ]jŽÓÝ0;ßÕ'þЂN¨.ˆ™¼Ç)OéCÉßœnU7£³ìS~’Ôñd‡ít‰…#Ë©_ (Â-…Ój¹¦·w®å’xÁ)¼†E½$:>Mû0KŽÔĺ\Ó s®Ù½Ã:·w˜r²¦égç»Ü¸ŽË<)Z6ó- Qs »fð’õ¥)‰àE:bÍqV ãþו?gñsÁÃ.~îIüè³ø¹Ò¹Ó‘»Ö”¥LeîSÄ-òXÂFwbpÊéì±â|ˆÌ÷[¿;Éà½-L5#LI'8ñ8h`ž(ðˆÑùŽ’¤µ6Ú¾©£{‹¼íHxo³š0­z>˜Ãí@_=’0u JŸoÜ’ü»31ƒci/ ô»•Y¬•™ràcgæ„ kM3KõÎi5{v­ŽjÎX!‚ÓÄ™¨³¡DYÜ]ŸœQׄÁGÏKT℠ ){i'>9²ÏÀÊ™ÕEàó/km7ÓV”ñOXqn•)7¥!ÊO¹u> Ù¬a1‚*"†ÎRש‡Ë4ï‚»6YÝ{?óÛ‹ Ñ*ù9s@ F=°áýà^‚Þ èÙÉÙ•bT»L±˜.7)½ïb·)!“t¤æáÓDðLÎYÓÅôœm“» è½ÝKr—•++Á¬'5¤18Ëã0,OÏl:lyBªðp¦>ü<¡±í ó&\3?n·rJ°rj¬]wý±QýÁ‘«Ä@I΢Dø„3™1g¸UjñLʰ·­‘ÿêBÁ„í/Cg.³ûçA|·Æ 6nö+åJ¤»ê¤/±å9g¿É2o5æœ3Ø-›,›·3«Æãécïc‡q 5#мsI \Rú„¦i—O¸àùôØªÝæ¼{“9¨|ÁBnUŒ'sA8§Y*¼àßIxíWÌõm»?WÈBŠzaÒ·÷SÌG¿Þ}}‰Ïñ×áÛ‘£ {ú鯿xXÜ• õU6|òJï«ËWýµuÜÆ ÁbÕVã%k¦>»ßSĪm«ööµ¦ƒ­œSõ€îªîvÑfwãÉHÆTz˜QéÄ/MÕŽ”4§–[ßéá;|gä“NWº6ßÝEÀŸäÆ?¢w&z¼õD¡}LN2íéÄ({Ÿ`{a€ª;ý]7ê2©¼ßëètàyÒÁ$ÛoÐÁtùå-ÅXr(Äý,-:Ï)Cš™4Á-l@ªÅßñ¬éÙ³Sxî·;SŒ9ŒûðÙÁóÆÐNs^o­yìE`h±üÂgèÒ †…C=¦é S60—aºrweç¼Õ«’ûY×÷u[©Sû{¡‡UœG¾šòIÒö8|zø?SMöÏ endstream endobj 5184 0 obj 5241 endobj 5188 0 obj [321 /XYZ 40.7999999 478.099999 0] endobj 5189 0 obj [321 /XYZ 40.7999999 758.419999 0] endobj 5190 0 obj [321 /XYZ 40.7999999 617.299999 0] endobj 5191 0 obj [321 /XYZ 40.7999999 617.299999 0] endobj 5192 0 obj [321 /XYZ 40.7999999 478.099999 0] endobj 5193 0 obj [321 /XYZ 40.7999999 758.419999 0] endobj 5194 0 obj << /Type /Annot /Subtype /Link /Rect [405.599999 416.659999 426.719999 424.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 5195 0 obj << /Type /Annot /Subtype /Link /Rect [411.359999 174.739999 455.519999 182.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 5196 0 obj << /Type /Annot /Subtype /Link /Rect [330.719999 104.660000 388.319999 112.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23throws_typemap >> endobj 5187 0 obj << /Type /Page /Parent 2 0 R /Contents 5197 0 R /Resources 5199 0 R /Annots 5200 0 R /MediaBox [0 0 595 842] >> endobj 5199 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 5200 0 obj [ 5194 0 R 5195 0 R 5196 0 R ] endobj 5197 0 obj << /Length 5198 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯È³ÉE=Ã@uWµ º>³^‹é…Û{ðßwfIY™MæG2‚””¥`º§T¢øÆ;¾øõŸ¿þÇá¿þ~øõó×ÿ9ü>ÿùùëSu¬ºjúçpþ÷—ÛÔÃÑÖÓ_û¡=ÖãùŸÃïߟ~~<ýöôÛé¿?žL÷öâüÇéáåÓ€ÿýoO¿Nš~òõó¿žþö‡úð/§ÿûëáOÿ~úãÏóxç_øþ4ŒÝù/L1µ©‡ÓÿÜþíüð¿Ÿþí;Max÷üß_ì0Új²æñãýUóöïí«ècÕ¡ºÎvcêÓ<ÛÓvüï>ýå4Úû4ŽccLß5}•8{߇¾y[䨿®ò2RövÝ 3ÐyF&ke—}‡#q÷½7íD¥mŸ¹Ê÷‘r·«¯«Nf óŒLÖÊæ}Ç#±÷½iÌÛ"mSç.ó2Tö~õC-3ÐyF&oi—ÇCq·~0Í|¯Í¹ÐëP¹Õ]+3ÐyF&oióÖûCý&"þë«øÿxñÓ·§_¿˜ÆgmçÛ_N3yS™¦?¾–Û~9K¢ÓÍüöçÃ?VUóéŸßþú4ÛÑöí¤cMOª>ùŒž˜=©ñh5|‚çg€×ƒç†GÃ{`úwL¿ÓПÔxw,ã^á“/ô'ïè ã|0…:íàS°pß,<ƒOîµ´ƒ© ¯ÇV¢”8=yývâ[y\èÄ‚Æ{,¨îÞXP_—ɼ“ÄỠɵAOæi6ǾÕ}gDïTÏoOŒ=öf8?½nîDF'k´k»ºõ¯Åpljçù*Ý{ß1ñwGkêöç¹}Bë Ì®ÇNOLuœš·RSÃY¿Âï཮à;_è§øÎôN´c•údf‚wæØQêbŽ@7hªéb6ÝÏ“1æØ6Ýy6.Gî•ÇY¦i ¿:ßÇë¯ÎüêæÝv>fz5ônã¾;Q`sý7º;†÷JýÅý wŒ™Ên~ãu&[¦¾s‘¢ìüŒÁï4p7E÷y˜ÙÅLÁU`;á¯æŠIoæFõå%<ÇÀ&ʼnÒl8¶ÀVàáS´÷JÝ%Ó«ý‚¦ˆ·ÓÛ›ÀΫRím·ÏÛIð…Ïêì{lþØ@L‡„óñÖÈ¡aƒ¼Á?dÆ:ÄìQ\pcÝIËÑÐÍ `Ž7ÜÛ_Ó0ïõ¹áÄ£——râéôàg/ˆ˜iY¦9==Àq(üÌ»øj è9xÓ¬7|®ð̧Øe°KµwÕkÊ‹0µÅ†W£]ßÂÙD™‘§¬šRFúþäè';â­ÎÕgº­9~ ÷O S×)f“°kâ“××tqK(ýJ1ï&{ƃ?¨›Ã‡8ÚN\ønéZy“çJ¥F{Cð{lÀtódš¬7‚¿Š7¡¶½{w9!øþʧoJÒ&&wgBdÒýLÜ_æÊñ0ØRỽåOæ“B2/ŸgR×L{™èõÉ3ÜþOˆÑ6îùcnmGÈ­!Çïø†¿Š¹Xà íšÕMÉtW’HŸ,dÎë¼· ßÁOz¸ÀÏôíò÷Ë|œÉâÓ€i_Á—Å?8ø½ýÁua5eÎò¼7<8BÈ= ëp˜ ëq¹¡c2¤+ê¾ûï,Áù XÈ®U ÝŒŠyÐÅ?¨s?©‹²Év*%N^¡ –ÈcÌ"Ätý(®°7=ûÞgr’?±q›¾Â„MÀt»®¸òJ¸¾OÃ’KKŠÇêÇ®&>¬š¨oœu³qvi[xÄ“Bs<…„$l0¬ŽõP*ÇszWbU‹îñœÏik—û o$ed{NKBæUÎÕ–pù솽X,(4Ô ú7#ÉÆÏ¹Åt@8T‚¤Ìðj8\é¦V‚ûœãÇÇFŠ›h·ÉdŒ¥ì`lâQJ+ETBœ›`‘ãÄeüÇ9F¬J#Åǃ7:¢ˆ`ðr› 䈼d@kè\i¥âQ8:ÇH£–¨d5÷$kJ6“œsÓÒ™·/#p©7Ôäâ®yNÀOàÈgèW%K)-hßóî¡×W;äEi«KAY››‘x»c– 6rB´Ñ ‘¸$a+öðnàp¢2D¹…æ½ó¤4DïðtÕ/ÁÁa*rŽBî—œ¢à=’´T$)pJéP¹IYU­2í¾_µtlÀ'"‚'Ó›»Îfµ>N¿Èã©,äg,¬–à­8B¶xŠûò¼Ôã˜m‚’4 †è›µù›FVÔ®*`š!‚Þ8Ì< V4NW¹X‘<‰(™L¶Çe½Ì‘œ˜iF®GqI›~%ôͳ¶½àÈQŠ~2ªÞ³à˜EuÈœòl`Ÿ%§‡Ñdót W½{^È ]eÕL=WÍ\/\ãÏÉëNOdã´¡4 LW¤d3o6©]o1”a-Ê̲Ât»¿pÊ6ÉŠ‚2¥ŒA(šÅö¡¥I_÷®úÆñçå˜"çžÎtüQ.ÎÕàA"bdÅALÓ”uÈÚóbõZ¨ðz\TøßÚ¾ƒAªíH'V᫯ÞhŸÑ;x4 Ž!«1ütS3![/å î†$ùaHòPámëÞ˜W¸S›„©7¥r7¬s¸s\ŸØx€›  AcB¨dºüú"JÅ|òY2‹ûÓã.OQ»Ù×ÓIÜ÷`B½YëíÓäí­u™»D š’Ò²šPF©jGÏ“K0Š£7°PÞ,t‚O”a«–Š˜ˆài‰8ª3Üo”¾Ð•GÙÑ™á|–q‡º Ç㣂™ÐŠ’b¬\IAÈpjk)Á±tR!T$ø2¡>2'5V2Ý´€ÁؼWoMŸ¼Wv†MÉg¸¢éJ¥´Ž2^:†{­ë£‹:ïŽãP,'º˜“¬œãŸ ‘epb™È2Ajè  FM¿´9ý­Ëdhi‚uÏN¼†ò*äB){”ýÅ8·„r!Ò3C}1PçÛ¶ƒCó¸Aò6‹\-aÙ#ž[ (³Z»ÇZÈ«æ+—n½@¨÷Èü1X{Üì[޳~Î׉es«ðaqÔgŽŒÉÂÈáŒÊÀžõUbmþ¯’ËÕ ¡Ýo>Áf&àe®U:;§&!ÃIÍ*ÂE4!„ÆÞ¡m»”{éZÃåKn7•°ÀúChbJ}OŠTUé‹Ç¦ª£ XÞs'¹,޼ß"<êjbÿû±­8Ž©‘ã§ÏaöXîb?}ù&.Íà2y‚ÎÄiXÂbû*œœoRÌfB¡èúЋK8´;;¸Äø`¨ÆñÃs+ëêÖô䵫QÞÕí æ§A§Ÿ$ÍÆPfÓ9³áp-NušÏ b¬ïýP¦m0ó6T×m8¯æm1ö\pøþ4Øêö<} ›ÎyŸ§àÜç¸Ïû¯%‹ )Z§×Ÿ.Œ0«§@º'ÑŸcŽ_T“˜•’žS‡<µ¬î6YPL:œe€ŒrJ*G]„––êxÅ’!„eé#«TÆ!ÍÝ¿ªí_݃ q§ P\­¥bwFîÎÈ%Òn:Û;ÜþÑ)C.¢oÎÑô—bó½9Çîæy›Ûâ–"œöðLküø¤‚·D¶u >¹ÀNSLo†N‰øþàÛhj‚wÎÓ¦kU•äÑ£Î'0S|Žœ³Ç¼ó'†”°ø,§à;ª`ŒØÎî`ùgÍ L}ƒ7·<ªázj<ƒÇ̯¿÷Ò^Oà G'`è+¾Ž¹ª\ §8ïlM½vd˜ÆðÙãuýZ3Z»tl¯EÞŒ™ÊJÔ“–ã¤e¯â›±vÞ×êÐÿòür\ÓtML}˜’VغØ[Âñþà¹1ø-¶¬·¶_ç4F]µ†ÀXOÀǃmOl-bO¦DÜ–”áã ø*0w30ؾÖ§,æbØNÁ‚gÍñ-3ÚÆâ¹qö óÃã9¾X+V0™ ãt—bìR:K/ZÜÓ˜ÇËŠï Ço͸Ϲ1ö-À…82TTJp"\kÖÛBòýãðh¬‡sôãÀ¬K‰Rﮇy<ÃSWa~͉®™vQ¾¢>™aˆÒØî“‘–9»,ÞÀÝ'óx²@Ô'ƒW x8LUóQùÁ™5ˆƒ> NVÒ®9Ks˵{7ºê½}ùâ>Œmz7„³ÿ0Åb½èÃܦmê†;W§ƒÝ±ë Aºû#Öâèên×Rè¥T,ç|181‹ã3n Ž’¬€ 1ê€jùÅOQö€Ö(Z;ÄÉì Üí× gk¯™‹qfͨµÙ+«˜ZI¡Ê*–£¤†Ñ´Ú‚})8Ó®Yà«ýö ó®BwãÑîú:*ú:§Bûk|& ©Þà”ªdœc€ÿrj¬9Q-Fý^ÀK´fÛdÏÓbyg*Zºûºƒw»”e :ÚòösÀ÷ˆ¹K[Pº6 »ˆï ¾éŒfkzͶÅ6QJZ7}{É?—³"ˆŒƒ¹ÀAPÚ1ë‚(®©“2yˆ)G@¸  ©‹ T¦÷Wæ@äùÀYlºƒç]öwÏSσXª•±wOP4M‰1vŽÈØ‘R…‘R?¾ãGæ,é ö'/{Q2£“¹É\™æý~XJ§‡k´“EK—mJ£._ÆÖ8ò…Òæ(ÿ<Ê©) xr?‘Û 0ß‘2õÜ[ê;º35î ¿BêxŽÐ ¾>˜g ¯ µGŽÞúz(¼á­À Æ-A*úúßy.³}½öÝ©ëÎ%ɨ¸X'˜AxÛÊÝÛÅõöRb;Þ|q_X}ãñîE5Á€¯É[Ž·7E7G³/Ñ ®]I»æ ‡•Û@õ«f[»¹/N@„å´^Ñ—½­Ý`ËÛwœve1€r0©ë7ÄOöŠ©r|k5U/Š×Þœ¾‘Á¸’{VêÜ­C²¼°§×™>f­ —Üb=)9Í Ë`Ìœ&p¥@H “ C«— }æwªÌ‹içĈ8;žtæ°*•H'«éeN»ðeZð)Ûzµq™üÞ%êš·Ë¢õÅB{ñ_Åf} ·ü¾÷á…œg»Ê¡£¾\Þ´b»q·çªá‡ËÝDÒý÷T¢é¶R²Ù‚ÑysÚ÷ Ò£½V2U’¾¹Êúßl㿸†zš$j;gw7Ù0½Œ0|gÙ€˜3Ì8±»‚.JÝ´îYŽî$zx@SH{8cõ³Â8!ö‚Ý£ŒOîº3™²ï|/07M!05 ŸÀ-ÀïÌ7ôÁ½jßPÛ4÷o¨ê7—çÂüyû^äçt™Ã¸a¾À”¨ƒXMÀ+kàŒ´ŽÆÆŒÉ@§tÏìS)Z8:ØZ÷:ìÝ“B3tOªÃs'[g;Ÿ©fx½vUÙ¸#3QU•~{©ïœP乿½ï2ª±9‰œÑJB™šâõø9)Á"è‡KÄL †s¡š}Ð6Ùfª¾=º-¶x:9‚“é’AÒ9rß#ú¸¸X¡oq1›†™Mñ¤âiú²5QÖÄÒ¢$Í‚tuB~E¦nA}bí臢· „vt%¡ÌŠ-¯´U…-\ µ¢™&R'6}«R½@¹Þ Ž—#R¼è§’yì‚Z" Í)ÔŽ«WÍ;©oÙù‰ M?Iâ_†¾‡ì‘‹&ca.\ïò.a¦2ó U×:oôÛ>Çóûߟ†±ºýÁO_2HGx £gÎ,T¤C 1–Ç kê"%t—¶Lð(’ö>Ö—îM«é4ªY¹28‹VJOɀ͒Âdï¦h¨] £c”ÎáÕ{iÜÓÆ™ö²Øëœ<‘Þ=ÿÀB`¾ Ö„Hl+FmSŠb;,4Ižé†tÕlÌ”0óa%:þpfÃVH˜¢JÐc#¹¯—0ñ• ûbñ}öLnÌ ºk±".µ4”‰?E¼YØJ°(9Ø kA*Ýí¸‡²ãšKo[lDz2aN$Î|´8Ï•B'4ëh¡¶¦ÝӶΉ(™æ“À&ëTi`¡$‹£z2'|O©¬XoLD4ç`)[‹Ý{?/ݾÁñLI_6¼Ð*êv)V2 Œe­qòõ›ëS?ÖÖ9ß j%ñj•PAN.XU(ßz¨Ú„$!Y‰BèT+ad(G1â~j‚QC±V±¤”-ÁCÔ/4s£Íà^ŠM{ D‚r¬£¥|W„‘d4 „Šv‚H—Ü>µé 'µŽÂ©©Š¯ƒSÂÍñ¬Ÿ³”†¤í¬qXyó2ï\kß2En)_`eÏqCÜÈ ’@8Ûó!½Q3ÃÙöíO?XÎö<…Ÿ §PiöNŸÅ¤åúu™,óóbêmL¾°ž{ßIäBz]¢°k“áBÕiõ¦tÁEWQª0ˆŸØqçÉ£Ö%'¶ÀÉÊIæ)c-v ´0!hºÜ…nx¨˜Š9EÈa‹P<]‹¦šÞB«~°.ÑwŸ#ן'Ö\3¯ƒ›¥àßo}=¼ÞŒðVàc륢¯/ðgÅíÓÌ…¶K[KóAu³: 1{±wú-§ü7 :¡o> endobj 5201 0 obj << /Type /Page /Parent 2 0 R /Contents 5203 0 R /Resources 5205 0 R /Annots 5206 0 R /MediaBox [0 0 595 842] >> endobj 5205 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 5206 0 obj [ 5202 0 R ] endobj 5203 0 obj << /Length 5204 0 R /Filter /FlateDecode >> stream xœí]Ë®ä¶Ý÷Wô:€{DR”DÀàyÈ"À`È"È"Ç ÛÈÄ‹ü~º[Rß¾¤©*>ZRË<ã«+ªX¬7‹oþôùÇý~|óîóŽ_‡?ß}>T§ª©úŽ—¿»ÿìNJöm;}’æòÏñ믇oÇo‡O‡Oçÿ~;ˆæúâðÇùáø‰~Àß¿þvxÓüÐÿäó»¿œÿö¿£<þùü?ÿö÷ó?ã]~á×CgšË_~éÿ"¤ÝùîÿvyøïÃ_ÿpüíLBw÷òß´<ÓCÇ·Û«âúïý«ècÕ±î:¡åQy¦SŸúß~:v#ãdj!Ú¦n«Ù£¶ò:lÝMÛœ‡îœA¹Í*v Ùè4](qSUÝú‡b³^©aš¦Šèm¨Ø´¬Ó t¡HÄMmd=ŠÍúó+×i;Ïq¤h†µµH3Ð…"5³‘ñp$6ß;ÑORV&všãP±ü2•0i¡HÄMmä<ŠËz#´Idm^†ŠH%òWŠÒXÏPlÖ×¢Ÿ¦ncç9ŽͰºMc築¨™Œ‡#±ù®M3Ä6ʘˆó¼7©Z•Èn](‘syïŽõ)Iè+_Bßožß~9¼ù(jÕ]"ý/?I¹¦ ý_ÎÖÇï.1Xs~úãñûªRÿxüòóÁœ´Q­îó‹þI%Ñù|G¡'¢ï¼‡O>п£0-ÍÀ'ïèó‘x4ÈÑê-Ïh‚1¦¯\W¡†|ƒOðhx¦ž5ÅßÁO $æ¦ÁkŸàÑð¨?óê6–x¼¦Øº¨~¦¾œícvk×é ¥¹„úìY-ÌlŸ*†b[ƒm4C3üŽ„ï`;èñ;k‡y€×[.lQ°7žÓm´‡;˜jìßñp?Á¶K´pì ûræSC뀥 óÚ#‰>Áq^R/)ØSÂï`ÿ°ƒ<`ùw,½Øîàõaľaò<6Þ£§Øo3"‡’1ެꈇ=<ÿØs ¯ü¯2—Xg|¬ ù÷ç±Ñ8çÄÇž'8–J*½{îµñ8ÇÚˆí5¬(®TvQ‰2c©"âõ¾ ¥µ¿Š+SÉè1€˜ºê‰1·"ü(m£©ïU³òζ¿í©:Tß~P÷iNZ 9%„w£öyI}ªûA×'%;ñŠ4% >©áw’ð‡á .·ð ö÷†M !NºnºóÀ¶hNRtV"9ì,†‡è%ƒ“Ÿ³æ¢÷*BŽÃ¾<Áï8Ã;´bi€¬ L˜ Óίڟ¢Ân‰˜%ŽðX$Ñ£ÎwíÁj‰¾ëNÜ!„£†xžAZ‰{T † 6yDî]wtÙí6·;‰#Få.K“ÑÃ7¢¶Ö×UކîX±QÇ¢ïÚ ŽGŸo=óZ¯¾¶•½žžœikšüð:Ÿ'cÔ]XUó´r—Ûþ©§íOÖoû›0#„¸ž(Ú OðÛÂÀÉ,;;.Ç4b“Ê Q~°?Œ‰Na± A}Êh;‚­„O¾hT¹÷??¥qs+<¿·ögœïö ·¨NM+^gáô‹*VÒùÄ{øúp‰rÖ©!LækÛP¼KxÕ´ d´JJË\੹ „ç u$œÉ²–ï`yáˆP>¢ør‚NÎWšÓ³=*ÅÔeQV‚aÁzíY$Ûê{ÄίþJóÂ…yÕtÃWqaÞ³¡ƒph‘$q¶u0 es)äò‹A¤õa…V]¤Ô3œn?¾H€øFZ¿ÎmtÕtă´` ç#1O‘ñÀY1ðŽ]gøìÛXˆ‚0‡ºj‚šñøc$K¶BKÑÖ2æ PZº[Òr–Ta0(G›pÎ5c鶯. /ß7ت}ƒëµ’m°ÍÐŒ&ü¸µƒKé×x¦«´OäŸwX}±H¼hTÑÉ —ו¿úxà¸Öcš’8žgw×ݱ÷þ(GŒ}XÎöy f˜–ˆØ1]1¬N*i ôæbûåï|äÜYok}7ƒÉiáegsŒA§»Gà~§ôùVJWöšìµ‰j¯Mpãøìàßvâz¬îŽÌ]2·Ì1©Œ×5ŽÀeMÊK–ÞOò:É[ woëðä~"ó ÀsY0d dš“ dຠyøð0&Þödœº†#.”SM`Dý®üä<_œQG¥é,%M‚Ó¥8”ˆzS&Í˃†fÊ3’`<>k’§¶êꊳ68‡fÔ3&Û†A!T+à,ž"鹄5Y&Ï´’d8üCY9Ó𺵜Ié~Ñœ°N5›JXf?Ùª½XL…¥ÑVˆäø$oÅ×i©.ÞõõTb—Ò0¼@VkTX–BÞ6#™ºµÉ$Ô‡0ÝXseGB0°…\àºÚ÷Ëùú>¢þ'³ä@Ì—Ñt– xZ¸-­8µÊ6s7¥îS¸7y^Öäº$õé¹sÞÕ÷?øåð9ÛMI°ÐÕ¶ÁHv !`J9žÐÛ›$±o nv0#©[U9qUž’GØ›ÎZg¨o?‡ž”™1³óô:gÀ"XG÷q0Ž·÷9óa€Ì=·œ`^c©Àk ÎÇTszis@#˜;Œû0`œõÆiÎwÒÞvúƒïápΑ×ý¶j­·},âÂ9º^­çdm;ž° ’ÐcÈ剫"¶4(º¥B;¨+nX½®ÞReŽèÚR‚ÍÁsŸûxÁ׸3rûñ¿Wж[H tÚÑkF?®²ÀÌÚÿv '8™Ì c"3Á¡9"w¬“¸õ¤ç÷c¨)‚Z:œ=g“xÑØ.»P ¼*ϰ¸B:Ŷâ‹!ßU² ~(S6"¸¸œÓK3štçÈ1ßák¾":*x˜)?2ìNÀ§q2sÖšD@4Kn6u·~\{OVoq—+“ö#z|G—½ÃkñÒMvö¯‹ïrØÝz¹•êÖú<öié½_»¸^T»½\€½Üû¸†¤ÜÜú˜-¹‡õ’»H>‘6áͲ¥œl ià‚{E>QÀàŽç&F x˵¦{–´ LÀù]!¨™'OáÀŸ87@áõa@³X]¢ð;Oã187&-=/02LÏóô÷Þ¡–«…Z®2ÚÖ…üûóØhÕs¢mÏK%•Þ=ª_DTÏGsŽ–,Y1NÑÚŠ:ÂU°Û¾Ñ³ùeèicnÍ\r<·dß¿ßײÚc÷Ö+õÖEý‘ïÓLè[ZåÇy™J[r5Õ_¡×“Yý¤zA›êlÕ À®W‚;Ñ(EN«A<ü³›¢þ‹zÑ«ãT38¼C£Ã“ÁuLñÄ~×…¯µ"B_©·öšáôÄðIY‚™¥æË žŸ#t΄ùa6:aVà ch^ûP{‘©ïØ›‰}˜[cŠïbÜ-8$4Gýä{ëݺL¨Ñ¾¼üêGdxêF<¢%,p1Á ®œÖÅX|FÌ#r!(ò,ëéØ9 ù‹Wš .Žˆ;ì›/¦ÿuÌ0ž8LÒ|-pM>~Àí§Ä¯0Á2aJœUJ²¹)c¢<ÂçD$Eyïž×w¢¶MðC”Š!œÁ‚†Å½BÚ¾»î®»LÊÛttŠ=¼³çâq_IÕå9Oq æo¾‘ ._^ñ•ýaÑ{ùç|yó^“ç‹ /9AdJ)¹§ ¸/²fh,þÎûùn¾£¡¼ËHC<ΉP.K’Ë8Åüt¼±]$¸gG# îÉI ùæüPC¯1ÍNÉÆÃVóDsßÿ Ç'­if>)âšþòè{ï€ uF”N¨¯m³Çä‰f £Æ$Œ Ù] N! Ê@XaæZ¡ýŠ,º]Ór+ÅIÒi<…èù1„Gcðð„é¼AAÈץЬaæáp1÷”IZ»RŒC(Nd=¿P\¦D§ìùçÙP §aOˆÍpLº²±´ž9¼qFOaA eÑ®%…Úɱé”ì AIÒ\G²RJÜeãÈ«£å„;¼J)rK• Ñp-âv¤g8N!@¤Þ_„ž¹žûY Ÿ½}ðÞ+02Ò _!™÷:ñ˜{·Ã×^»ZçŒá4Z‹h‡Ë¹Y7Üh¯L§µœF·V–ÕÝÈm „ÛƒÉöòpõP:{Y’ýÀ~ ÀÑÐ9€œW)kÛ„„{.§õ$[h'›qºÚ1(ïX›Â3E,ñ´02„#…Œ{èw¤¬ß# Pæ—ðx¤ì³Èç™ûœËòàE™Ùô8†„ÎcQvàDIà“adMa ½PC O°‘ÿ„DÛ-Îî§8–Éâ6Ч‰˜iÓuºq K¿ŠŸx€Îa *'!cˆY úPÐÍùö4ť܈#) Í[£‘­²Õq/6Ç›3ZNeºéµÊj­¥ýMBqc> zöuÛÐ^‚5- Ó­u |ðñ‹¾?C40¬ƽŸøfåÀö›•÷›•¿ßoVp'é]ë„îw!—šªºÒ¯'=g›”p¨=Ï9ÖLû{Œ 8w ÅeOÝʼnèSêCCàÚüÍÏ÷Ò¶™{p ¡3–.o¯¹||WNS­”m«ó—Tk}Ó³s‡5’¡Lné7IçƒgShœ•WC ¥¯,TGh#¿@bÛ6Á ¬*ò)$³{~6òÖó‚ `¢Þ8Í8PßÍáîðÑ=Fw û·¥íûÎÁzÀàX1&0$UW=;ÿ{üvV¨³²\~aøãë¯ sU³zQÍO^åô¾Ôê®9Šó4&EŠætuQGUÕ#zØ4§f:`0õ lÎÈöÔNïY´Oz‘Rê$Íd`«õ©émb§¾ÓÁw |§ÝVžduÝǰnj´^á´#dS¿;„Ð3üˆÞbø©'Ícpê´w†£Ì} íªRwù»ÔâÖTÃïµt9ð¼å`p&ä@¼‡2йäHˆû- ZÏ*C™’Ç)n@©ÅßñŒåÙ3S¸î˜·˜;ªrxŒµ¯\oLíÐ|j4¨c©Åö ¯¡+ƒ˜Žô@šÄ7°–a¹rgmg½Å]©'ÂÖu]ÕœÄúÚèa‡Íaõ*þH{?þ*/}' endstream endobj 5204 0 obj 4676 endobj 5207 0 obj << /Type /Page /Parent 2 0 R /Contents 5208 0 R /Resources 5210 0 R /Annots 5211 0 R /MediaBox [0 0 595 842] >> endobj 5210 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5211 0 obj [ ] endobj 5208 0 obj << /Length 5209 0 R /Filter /FlateDecode >> stream xœí][oܸ~Ÿ_1Ï2IÝÛ)ЇAôaч"Ûm±è.êîCÿ~5–fâˆó‰ŸHJ#3â±eQ‡‡çò ©÷úü÷ã?;¾øüŸã×áûÃçCq*ê¢ÿw<½{ý ÝžŒî?6muÒöüïøõ—Ãóñùðéð©ûÿù ê—‡oÝÅË#úûúëá}ÿðCÿ›Ïé>ýï¨î~úùøÃߺo?ãÿà—Ckëó‡÷”Vºí~xýé|ñ_‡¿þîøkGBû2îùÿwƪƔå":ž¯·ª—¯×·¢‡Dz£µnJéŽÎªcÇÿqø©íJÆÉ–J5uÙ³GmôyØÊÖGÛÔÝÐÆÕ™Ü̱– d‹Æ¨õ©…sSEÙLŒErß¶´/Õ…]ʳËPK™¯TÕ„YÅ3EjÙÔzÞßêSÍÔß4óY¸ñ×Ãûª4íÙ}ù©£äÅšõß¾tÓ­ŽïÎÚêã—¿/ óñÇ/?쩲¦©zó7\ùðråéK7ƒØô4…žªJDpåèJaá=-º¢á=ä•þŸÓÀ+µÿLͤ ΧÐð à[WA«„’¤gÈK–¤À’ÄЦ!m˜ox´ÂøST.¶¸ éiš *È9xËU‰åK)¼‡Ñ:F¶,¥˜æ5ÖaÌ78SjðhŠàÛSH˃ýž@5!o‚ýO´Úx>ØÏö?(*`xÍx ?_"øgáÕ~$ì–kB„+Xvz°.Èò¨fZÝ >R`°¯Æø§ðŽ cðž rÇ`ëG+!Õ%öïØn`$Ÿc Ç÷”oË(^í2žµªšF® s­)—DxØJCŒÁØbÁ‡a )`°¦ûA‰Ó8†Ç¶_Á¤”—Ê,‘âJØ\ F ¾a"Û%ðá5¶Åok-´pØ÷ º™î^.cí6©–I”w`lÕôgÃùvÌ· ç·±þÀ|€˜  cã™{²} lß°¥Ø²ì`ÛkðúàÑà=Æ&D´ž¤tri(µ—ºî6ªV“ôÚ‰³<Øóò¨4)Û‹Þ­aÄ+*BdLd«©ÈúÇ ûT&vÌõ&Éwcß@ŒV>ÈY¢°ºðvVGã8%ÄMx>„0è;Y• ¯)QaݲþùÆR<`:yÚÂZK ¯0Þ™ˆ3 Áúƒ#øT:GH¯ð,×8bú˜¬ –^b>8vLYɲõ¥ç)WŒ%¬[BÚpîQaÍȵä\K¾h`;ݳ!ôkb̹(XE˜Ël¶cøJ"ü” %QY¸Dg&“¿~ݳ„oX›ÂÖ™NPÍÔ]RIìTŽ~eYVŹÜBçV7e¿§'ÍSÍ¥Ç'w= i.yè¼×î^ë#o(/ˆ‘p²ÚM§3¶Ê:“uæNtFAyK©3Z•Ygî\g4–1æL¢¿*ì #ƒ¨-©ÎT—TØŽtœ5bb8>Ä3 » w$„ÝAÊPMEG`ަÚ/¿ó í¾dò)»…L[MêfàÓýW„«Š«b¸û/UNæ>qQ²sñ2þÚö‰ …Æ_X1B{²Àú²3å]o]I˜Ó/‹KgûNöîè)/]Ãù,¼ýõ࿸½^e­²6emº{mÚÆ.°²-²6íV›r(­6Ujú4aÞ÷™Éßpôíx“Ü­°¿5ÍÝ oÐOE_ÓÜe.ùF¡Ë|ãgPUÕŒó뙽DAG£N2MØ“S5Kjv¨½îÌVlD*l¹@*¶üð"atT«Ôo»gÞäÄô™ ;q°6à*3æ=?̉of§¬`å‰ú×–{6rl¿í80Çöû[ÓÉ쿟Eb¬Öú„QKmRŸêž1Á½b‚°±ybmŠ.×BO2³¦«£’T1nöm¯ä5]€Wv¶¦¹!ú9ÜåZ%DUêw‡dÔ(Ít˨Q8gk æξ2+—³Owš}Ê^bC±UŸÓÄñ,oÇçTCÞem2lÖÁàZ`½*uk—Hì&ÞdÕmpÎYðȲèy}9å°Õª:Ý*]½¤^ÈÛ±®–cwSžÊž{ì~uo…þt×ú¤U{Ó6¼z^/ÀÍ©p–X£+Âðøž%3ê\%ü¼ù” ÞtÎr ðô%øŠ@ 3/‡9ÎDËÇA*óò8PÌ’X†h(ºõIøÁADiü¼Á™)uªÊú¬=3´ sØGþ?Ž(WsÔLõq€Ò—ag wøùFI`” £z]qüäkzbú•ª9–!~™ÅS¼0Ž Ì"W}³WÎç ‡‡ &x)<‹ì¥Þœ—£Gb±_ñ°v˜4ìŘ„‹Ž¼úàüéøq‚¡dÖÑÃÞcòð×Á ²^´FÁ~Ún¸ˆþ¦mìxnÖ3cµJÂt»Ó‡vƒˆL·f’éKT:ÉúØÆ‰€Ó&ö#®*”ƒÂ>ÜV‚o¿¸vn7uUï*jHžhGõ²;…hÓðu'>1m S…¬I Ç ¥ f q3r=¢p'ŒØïˆ3DŸúq~ôaÍÕ‚ÊáùM'G÷ âã$mÜÇ@qñó•Ð)ó¥åœÇMÈ{¬Åž$9¢ïèÐÓÈwÜ—3Õ•DFgc‘u£ÛÑJßõù)1ãôÂÑ wϸl(‘nBšHë©`»x'B V]·Ç?@pí¨Eâ42eÒ8­\éË•¾À•>AÚ9™ü„‰:Ó !I9=Ÿôû8òtÄă{‚ñÀÞóä[]bº•ºù•½Ë[¤4ÂêEÖ7¸yXè1ET_Xâ>…%~ÛÁ´N¾|F¢*Žìõè@§ºQß!Škãh¡F|Å]iœ=†4ºN„qè!P6ÕÂc =òA– ‹Ûíãû± `Lœ£FLˆPÁD¯¦œ\í}ø é+î°ö@¦w´:Ó–E ÑÃO9~Ò¡u3aŸ˜obܺyˆfzªfëmî#š'S¶#ûä°F¨Úº8-ÖNóÙÂè žÇ™ˆù6[Hªý'‘Õ‚ª£ Îcz»ßžZ[ŒÔ Ÿª.£ÌðŸÃöÝ[ ÞW«÷ôú õ§[e~»ŠÇBnG¶}PÇ&ša©L7#ßÄ4¦0 šÊ…D±ï ôÀ¢è“ ð˜è.29!VëŒÀÐp“ ä­4± Kv¿`é†Eà¾#ÑO¾¸ÍJé÷üj[üš*æP„°‡h0/Ýéb1cNcÆÂ#'òÜAܹk|=|™ÓK¬‡‹ö÷Qñüh*H•’IÔ¯Þ/Œ2öU±jÚ±*†M–.)fbFáuwZÚ‚Tâ=ÒÅØ\8a¼GJ”ˆ-vZR_R´ÈÇÂÌ‘`¢im‰eòÿÞZÖ_¨æºñ Ù…õ¼KL½þ¡†Âqb˜|.>R¯^mL5æAtT¯k5’×íìa âé|²ÃŒ'ÇÙ ‰ kŒ³=l¼Ó€¨œºx‹áì¼oê·;§€Ï3$Îe’‚‰¹—NÙ)ózWû†bÔ¢æxš MÞKúòßnE‡9Àñ*%8·#¥È)÷œr÷žiü”ûœ[¨6«Ûæ´ æ,‚§“¬ŽfG¥g¦}-ãýq$qÏ8äÉBêqÚË\ç3ƒ_´#ͦܬ‡8¯ÝôhÊJÝäÆœ%±ÓŒú΢“ØÍ\ ™ãnZRÛóq°Ä.Ù%!䌦vf;Q*/Cyˆéh¥ûúžÐ­ähÅ{¦é¢•oòêÓƒédË™øÂ9­oÉþ€%æ7NœáøÈéÓóï‘& ™JÝû¿Ķâa•©ÇÊ£en°=®Ë®Z“}vöÙa}v Õjtø?L5ñ¾ÅŠhÂÞÆ‡7ö)1ͰcKß{¨óGÆríýôÓçÚNöâÅߢcu‹èÒ°»Û7ñžÒ4™ÕÈ›…j3Zz|R«Iee·Ò¿q7VVÛf´ŠKŽÑð(y`(ŸHïÐäd[…7®ðÞ⤠„ÁÄN”¨— ßå •©`¾mH˜)äNØ7 r€)ÀkŠmU°cÈ&mg‡•Õ$¥øŠÀEâuœ|™vŽèizÂ^Á;9°>R©UÁË Î›8/+8¿þËð| Ë©¿œú X°$VØbÃùP('¥•¯ÚIzÂ^’^W„ÑVOº óY}¿…XˆÄ:“*ÞÜþ6˜-%‰„ç(`¶61¾¯!UB„ˆ_äDàziÌQŠ1‘[*’±Ô]X¤4x¥iã¿x+éê¨$—‚C{W‡âœº`íðsð1Ø„hëÄÈØr!;ÁXls ç’ÀÑÚ$’R*”ª¬ð³JCéõÜ\!óüŠžîëøÜ=¸ôü÷¯¿”¸S(¾Má“8 ñÖÉÙ·õQuÓ¸uº Uõ饹àhŠëK7zÃU×§úöéF¶<õœq ±nNÍí- Í+}ˆlÌIÛ›¯¦¬ªSÝ×_ÇÎõÖsZx…÷ô ¼Ñ']¼¼†pì nÖ›ƒ×¿y„;”•oÌð#ºgH_Þº¢Ð<†Þ¿{†ó™û@Û‹,ºóg]©+d«àó9îr0t—ÜõesÉ‘÷7-5Za•¡Ì aç-n@©ÅÏFƒò,Ì®;æ-æŽ)cíÃk×S« êØ ‰ÀÔbû…×ЕAL #=&õDpk–+w†ÐÖ1ë­^5˜-°um[Ô'u~ÓË÷F»8ÁÖ¯ñG@ìqütø?«c· endstream endobj 5209 0 obj 3982 endobj 5213 0 obj [324 /XYZ 32.1599999 101.779999 0] endobj 5214 0 obj [324 /XYZ 33.1199999 99.8600000 0] endobj 5215 0 obj [324 /XYZ 33.1199999 766.099999 0] endobj 5216 0 obj [324 /XYZ 32.1599999 768.019999 0] endobj 5217 0 obj << /Type /Annot /Subtype /Link /Rect [71.5199999 777.620000 249.120000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 5212 0 obj << /Type /Page /Parent 2 0 R /Contents 5218 0 R /Resources 5220 0 R /Annots 5221 0 R /MediaBox [0 0 595 842] >> endobj 5220 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5221 0 obj [ 5217 0 R ] endobj 5218 0 obj << /Length 5219 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`ÛÍG¿€ €ç ‡† ä°È!ðf,Ö‹8{ÈßOKÝÒhH}|‹T·¦mÀ3Õl²XõU±XUüðçÏÿØÿë÷ý‡ÇÏÿÙ>~ÞÕUÝÖÓŸýáï—ȾRrúµë›J‡?û¯ßvß÷ßwŸvŸÆ¿ïD{|pþ16ž^1uøû×ßv¦—ï¦O>?þuüí{¹ÿËø¿_ö?þ}üñÓÜßá ßvýÐ~ùuúEH!ûñ?—¿ÿ½ûÛö¿CèýþýA rÐLÇ÷ó£âø÷òQô²z¯!z½BŽãlFrü÷Ÿ»ŸÇÞÎèúvþySx“lšñMµo½fÐBt­îêàÁÿŽ}ª^쇮Ý7Õ§EÁ°žDjGZu<F$’f6»söD¦{Óé‰îMò4O]¥v4ŠOGlj´©(»¢’^ÊMÓTm2ÅN]%wÔôLF$Ò¦6“ÞÑ#¨ÉVKÔ>±€»|÷ì>¼ Eöåçq¶Gm8ýøòm§Çÿ~è÷_~ÚÿqT‰âOû/¿ìúªêV6Gõ9·ÈcKWÕƒêš:¬åñØ¢_?ÐÓ•ž¾ùúUÙM/ïõù‹±øÂ"˜#˜'Ø ‚©iÜCÕµÍ[‚)mÎHÅSP f'‚u[Z³‹ØæBYË!ðrX_5_':˜­^-rZcþxü@ˆªÑm?öòš†¼`»Wæ¶©5òÈ‘E†êÀßv²‘—üºûœ‰9/z˺ŸH¢F‹·Í«–[5ߦ°©Õ¦ž–hÌx¢©/Ž_> yµP+L)®[ØmÝ5­_[IÑ+@¼:…p|z¤9q°«³gøUKÊ&+AÈÓI½F˜ ñwPÞÛ™%©Ž¡âéQ8^éÕOÓRÔUÛ‰7JO=Ì–I-L˶˜:Ž_ÐÚa0mÅ`wñF‡p#Ø~ù¬zA¯áQ<ÖXï|qÄÃ÷{©¯1¼˜‹Ôí镳ÄÊWÖæ'ó ZÇ/¿2˜_™ÖNt¶­÷xÆ}ÜÕ…´¼ –yÍò-j^€y“tÑRŸm¬ia_[^üS–ða<±³ÛY›uÕн`"`ÂQzÏhÖ”g…#†Sÿ!ƒ…ψ¾O}È­=f… úˆæ„-¯¼áPðo+êp¸çÔîö÷N1´(æi„…‰¤•©grzŠ.èié=‡HrøHK^=>Ç1L¸’p ~i³#ÜÇ‘b¡”ÑàDÉpÁZÁ1Q‹A*̬#"ÓÌéÂr”É µn¯^„º*ÄÓ|§8>S@ËÓ+gϹ>&„¿!ãÉgŒÐGP?Ä`=\÷¤}*‹íÎ÷¶¬aN¶ÎönaÔ"ç*=Ð¥ nNgî…PG€Èª6Ñ‚’StÒÐ1XºÂ#È<&žVNVÓÐÃL{lMà–ûR˜l)1z;€RG&Xún¸¢ÐÚÛÐ@0Õæ‹X¸Æ»òÅ9ÝÕucîÖ½óc9$¨.¸›ÒAp ˜–/‚>ß6¶…6cÀaÅ«ŠÙ¯P˜4wâYÚú­z°DB™k4³ãP5Ö€^- ¶<–Ø"Q‹hQ‹8{Ù…FêÆ\¯(—ÍÊ9ùA›“Ïâü·ƒs"Te™\š”¸ýõà®;cÁEåK2Ä^\p F³>»šÔÂ#ȸJˆ$ßL»LÙרžCì„[÷QÇQÜ ‚{º9SÆž¨9Ê':ãñœ€ã ÷çðÝM¶Šz~«Â–àS<ªb] 1Ã`]  •z§ÚèÚà{ôGøLÿŒ‚û‹y_umÔ۞Ŀ'¹åšÂ•s¬é‚ñ@@)qp"œÏüžüŽÝž$.¬ón|Ï7 Œð¦I‘°…½ßætHFèܰ78˜¸ÖhÙlŽ —2\‹cˆØÿLq›¢rVE²d2êÆƒ39ÕJ¯L½Bˆô¥™fÚûû Ø$µl‰bÙ¿÷#ð%4-ßwçÉs÷²ŒùGUÑÔ§àƒ¹hÝ5ˆy0WN@ê¿@½¨sk¿®3fd³í#œ"^=|娖lÙI1'Ë9Rñ›Â7gŠ-ž.ƘÈOW Çbb…dùíݶOv0¼©×#,ð< qŽ|´“nÛ6,FÒl‘û±1d§f‰“Œ`\ŠmÁL`fq|ì"üdÖô°êH°l¼öCF¥ÒÏ5ð/”JÄæáŠ-v!€¾]ï—TL+‚lQlÀ ǸqÌÁ—%¹o8L¼K­.hÙô¢õ®÷&uýYË)þFi=(ÃcªIà1…õÁ£LòN¯ð||>³IÓ&M~iz*Ú¤É5НŒà=Y'Ea'ÈëMÅ´æ•Z¦±ž8réˆÒ)ïH—,/šc§Žµ0æÂY=¦æØuJ­c§߃ÑNá™R*#Îg6Ê‚Bƒô¯ á ãöR»dì\2ÝÖ‰v$_3Ajñ{Ö»·„HÁ€›Sž±±œá÷8Pï’)rã5±~vô†Ï4q\(F!¼»ÂZöÆko”<T€•³JͰ X0u6y¾Sy>—­%É3kÌêGp‚·> ް¼»XELJ\ŽHÜâIYaxlû–7Ò„b•óF\3GÀúîù`e—íX9¨³>•UZ$Žáõ!ÈùŠå°ÊO]Ò ÒwÞÙÝގൠn¿£ÃYX¤÷`NÂÑà„ý”ÆrƺÚ÷9r„¯þßÖ‘/—ŒŽt<¶ChBØ1ðžE8ÆFÈŠaΣ§ØiŠRÎËY/²–ÍÛ·ÞZ›hí¥6¯%±ÅqÖKÈ©Ú<ô›‡Þ)§¸ºŽãÈñG-–D»ÞŸ©Ê§ Ü•o¥hΪß,ÄR22¡¦éâÜ5óò‰±6›9|AF‘Jt·«ÒF°æ{/ßz»;G2ß», /,YS‰Ûˆ‚Ð1×Ä@~ ¸(¢@s5ÈsûMžË§Â/‹!c¸vO¹E×Q¬ÞªLœrñ]‚²¨àJºz4†]†9|År©ë1¤Îû’,×c¾—TÈ?Bv¬u²X—åÊU¦wnyÔÅǤ/jø¹®>³LRX†ßÏë¾0g@|JÜ30ñaàóºM|ËSû;Þ‹™·ð^™“²#çØJä¾¢'á~¿uß}TÚ5sa–s¼‹êûྎ$âÒ%Œ—+uûô­¥"®æ¡Ø”…¯ª¹½¼¦X™WÔx¤nãÈ¿á”õ¹ !–rK–—{sbÁ‹‚¤lO ºK.‰×ñÙдA[Ri ÊÕ12¶â£Åy§ rõgt(W¾TÊaðK!IŒ·<sQ“ }€¾YJ‘%RÒœK†ºª&%Qa¥Ò}û’E N}?8¶b|éRÊ¿Ÿ¢«ë,¿…¹¯d®RŠô’Z¶"˜‹æK8^ãÞiU%¹\‹”±÷V”j|©áØpËB¸¯I)ÈË}”&ÅÝoe·¤&·Áof£'l´íNË «×Â8½QµŽ¼ BX¼#ö”RÂï#2Ýxc¹ñ4¼™mI)`”àçˆ4¢<•0ò$ÎáT>+÷)<ÿÑOm±s²ÆJ o'”~ˆ –·âÅq|ºõìÓ ;ñ“ÔG8hüÌ鈩F&6n¹}r{B ýœíne]äT+½©Wæã²D0‚_k‰ž%`þ”-?ö$”THIγ‹hø%?`"òÂ0ž¤@údEõU?Ô†¸ÍFHsêöµ²ÑÉò¼"‘ 9ŽÊÅ!Þ,Y‚Ë… ±M‡äOÚâKJú)oÉbKÈXC£Ó®sf6öÊD㈠aŠ…¹3-)a|¹Eù±˜Ÿ Ïðg Ìdl‡“'+¢ AÄZÚ¹ÕÛ±p”ŽÁ~J±?BVy=Qå$—2À„ˆ”шe# kµÞ¢H$t(ÍL¯‘7”j à Óœì)(«é‹4mã>ñÚN–ÅâÏw)(ÀY\ÈÆð,~žb3þ½Eµr”s$‹b¾û»JHûÈjŽUJ(X“©,gϖöŢDa—³Ã”¢xê×-¿êèºÞP$óÝËe*o’ö”òKœ®¬¤Ê6yê n›ä34€²Zäˆ ãßý÷*D{”þùÇ×oì°A§~ONØq>ê?×n÷bœÆ5cwíd‘îU}¾h’û¶­ÚëÇwƒ®€‘#»ª»¾Ý•–‰ÐJUr¸ºÅkšª–Ç\‚kïéá3|fÚ9v²’µºr­·‰cíkßÑ÷Ê _Ð3³Æ¾Ö"Ð> endobj 5229 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5230 0 obj [ ] endobj 5227 0 obj << /Length 5228 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9ÀÊ|I¢€`yÈ!€árr¼» ñ"“=äïGÝ¢ºgD}”X,±¥qÛ€gÜl’Åb½X,V}úÓ—ÿü½øôðå?ÅW÷óáËA”¢ýŸâø÷‡·([jÕÿÚØªTíñOñõÛáµx=|>|îþ}=ÈúÔÑýè‡)úÿúÛáS?ù¡ÿäËÃ_ºßþW¨âÏÝÿ~-þö÷îÇOn¼ã¾l[ùwÿ‹TRÙî?o;6þëð×?¿u ØÓ¸ÇЭ‘üIp¼ž»ÊÓß·]Ñd¢0­jºß¥TÝ?U‡Žÿþ|ø¥í FÙ}[6µiÄâQuÖJQ´M]4þ˜ÞÒ–$“²Ó@òˆ”•IašàHd¼·9-R+ºÌa¨T|iÕÖ<ˆ?B$Ó–6`EE½ÖÝȧe¶"cç¡Rª4êOÉ´¥9Ô†"£¾¶ò´LÓT© †JŘ‘¸9A$Ó–6 EE½Q¢§°ºIEØ0R2æU÷ƒg q$eeñÞHŸY,u±^ï_ŸžÛ£µóòKÅÉdê¼|;˜î?G3@šâå§âB¨úÇâå×CÕ™QVªêdcõ-RœZìùÑŒ?ЧšR´º©Ä›¾ÂœZLiú†7-l©gç³§êRI;šï¡õ¼<} Õ0Ϥͧ<ð²Æ¨§q_‘Õ÷}zéèd]—µm»„Ш»s²¬L}Dó¥åqŒøU<¼x‚ô6Þy?©‡dÝwi˦®êwƒù[‡én9U¾Šœ›I_’ø­ý`¶´­xÏ¢í§©`/-wpÿî{ûÒjŒÏ€Œ€Œáë$L},$!ñ e9>¯äfÅúè#4_ž¬®¿êÊŽôW§¼7›Š-̦írÂó˜ßÆš$Œë—“‡@«k“¢@9ð¸€^à4zl1’¬ ŠàIo½õ&EY7ò4×wpÜçÞY^BŽ,/Ü’¤@—1ÎldG¶í”8Ru/*=LùèÖ|Bß;.5¨Åm¡)›jÜÇÆ÷‘w°O ûôóH]ö›ëQDUª±]û8yÔÑJÏÙKZ0lZ}zÞôyv6ŽQ#d VŠ0Új `´qL®û…NqÒ§“§`ƒ8=51ÔâQ†Ài½5ûàh˜°,F÷°Å@Ø,l+uû9…jãçÁPK Û#ly‚-p縆°iˆ÷”Ò¢áJ5Û1tgÔj˜SƤŠýhïc€ú •S8SŸÄxÃëÁÅ-6LIXrm˜æ&,…0ðÎaù„!À¶hL½ÏœxÃ80p=FˆkÞÑ4–ĹÜqí±•|‰ðpÍÄØ”›7wãcp™Êغ¥8X=#ÞŠ)§£˜Ûýˆ[Pì6òÂzžÑʇŸñ%+þêüéÏG£wæ‰pº±\á²\ÿãS5óΰœ\æånc, YiÁòAnó£ÆßG¯êakÆbJ2Š?+ „8Üܼq‚ì”Â"¨#DjnQÃn¹è«н\ׯ²í!š>%¶Ã:š3¾ÖÌvQÕ#|¤xáH~V¦x?| ú}?e`Å>ŠPwry?¬ !ÐlïnàW”¢¢æ‘vâÇ!âˆK|6Å‘v»ŒÁÛÌé8.>GObžÁû±SÁˆK¼?¶@\2ŽG¥øB‘ô\ãøZJ”?!†¿Z ÅsS°ƒyÆ2o£^P"ŽÚ&Äšã7*û”£½ ©ë9IœKÂ"׫ŒÖ‚©¾»½§X}ÃFxkPr¨¶`ì"é¯ÎY­åÚÌÂåX7^!,<A^ú|72 •ãy(os(Vl …ð‚3€kxÚ4„shà­*„Ma; S"¶1]ï’(?ãëR-ìÙEû˜oV)¶ó¦5ðÒ“ g-»´X¶Ì[¼ºI]Ý6£h­œV›T2ÁjËÅg½ß¸,–ænÖÇÍú؇æUºš…ç£ÝˆìÓ^È©ÇU5Ü“eÕãÍ|Ø.<á jÝAó~§E?hÒ§u䯚éŒ'V}—okV©!ó¡2 O=ðÊ ­íˆ;¹Î¬96)™4yϲÌ;Î5LŠØÉhèvðÑK.ñ©ï=\·Á¶´ † ÛÿøÄ‹Ï¨”À°å4hÙåù™½L’(6|p:–8²š€7œ!üÓ¸ i¤ý 4vý½¿þ(^)Å¥0-_4µ‡)$Á6xS77Þ¼ñf"ýoy´ófUßx󯛋è_c®>Ú‡äͦš§ò¹–<¶f–~w*En²U<ÊU;( 7Á÷•Ô”›no-ˆÚ:]ÎÜÃVuó~Ê©T½·­”K8Ž$óøÞÌ»n]P”uÝK±«eƒ^žâwL÷åÏIy#²]Sª ,Ï0åïEDve š‡$¯Ú‹wÌYÛ<©àGD,!Ý™_§e6A™‚òÎG+GX2BɉDÕšzÁª‘bÈ]š£Ã'*œIËWF ©HÍx¦_…*û/%(þê¬0J)1H ›£´ >¡H KÒ@ž,8Ãû¬8tñS:‚\XÊyº#Â8ØL-Ë«SaŒÆÐUë—]Òã“É‚dÄ×¶àc2sšdœÁ¬›öìù\%š2éd—PNRÃÄ>!K>¯q³üÜÈS6)"_tzð%ò—âÎpq59™ ²/P ‚Rý ÛÞfP2X³Xðsƒ¬(ÚtÓ$È6ŽCbJ)Æeá¨`.œÄR.Sõ” ¹ë…¯\-„€=Ò<Ë%È­ôÇÊÌSzs•j.®9Ä:%Øïèy¤VW8VÚ‘Âáµþ2WˆŒ‘B…¾ò˜Z)‡üˆÒ X8Pª~E˜×OH„ž¡”ߢ(ò¹ŠD Li ÙN=U‚ѵ:Ìœ/¤Eÿç²eµˆÛÎaû¦ïƒ!pS}úy¤.û*Zž)Y•j\ýîò i<Ó”M©Ç/{q †Í…,ØÒ¨l—`éHBŸ˜cÑhŽ ¤(û….ZFعÙx°Áy0\Ù©ý`¸gòQwiÑni_Ø™Îø¯êzÈ”è˜xê:+¥¼wñˆÅûönìW®‹q¥ÎktR\Lœ>ÞêÏI¢véÄ„Ÿ4Â]ëWl—|Ãu¹yPå¼Jr¥¬r]½NUž¢é 5•G]´Ç‹¼oÈ™K8³bÒ¤ø()·Ë,î)#C``_íÏG â:ð´“ ËüUÌß&¨ –[ª$Úµ@ *Jÿ¢îÖuò\ó_1.¶j¹¹VÓ­`ëÌ#FžS¿áR2ø1.°‚ŸÃáǬÉFvð¨%Ïëiö2¦ lª¡(‹„)”(‰“ƒÊæPêC‰K ?™Ìø`ךQºýkÃs¾ñÇr‘d… IR¤QеÝ$ÔÌÞ·"¥´jWPãSJk“ 4SʋÔ”¤„ ”4öXÞÒl„Æ”N ±\-$Œ P•RtæêX)ᬓïã”=Ä<”T ›HåߵΠñ ö¦ðÊKlcJóÒ2ÅBņ-Û2Ý„½‘¬–ý¦ç!ì6étƒa£¤¥Âg|úÄ> (o™Ï‹ûÄÁBgóM¤Ùjë¤rƹ4ò.K;1ëÝœTaSv+§·¹½… PÜ.­›u·8`Õˆ;ÅA#nÂãc„Lº÷ÈÕ²a™FñxâbÂÌE‹±¼ýh¥X`””¡ØbÇ-„[Þ€ç{X°¿Kb,!±ïà¯Ù2½N-[8Ïq)³q}IŒ1‚ã„X} ¼2`ÁåÜáK±†«ïc¶ÆþSÞÆöiÎnRÊ@ït‡3ŸÛD¬ˆmÊýüÍëD£Ëœ;,eÊíxF’‘Z½ŸuUÌ…ßLiå¦{¢HK¸¼ Å_BJ+ötŠÝßâµÃa‡¢c÷ãë·RýÝ—ÝøÜ`×ùÜu!»uMå8keݧ.ô9ÉÅ-ÔuYO?†kMéí@¿{ª)›é$³ÍDK¿ŸZ—ª$›ª*ë~WÆ;=5…}Zا§ÆF•Jœ\Zîáh=i½ýä~×eõšXá3êã" ¦Z$Z‡#̸>nÇbÖî`;1@ÕW•<Ÿ~*8_Or–¤×ÇůLQ¼¿Ûþ'x/½ïN|÷S‚“¢Q´®0–!bJ€t…±ácŽ2ŠË Çç>Ä}†C q,XxÊZQ—ò˜<æ=saQ`;ûVÏ1ê¸âóáÿ.^·, endstream endobj 5228 0 obj 3970 endobj 5232 0 obj [326 /XYZ 40.7999999 681.620000 0] endobj 5233 0 obj [326 /XYZ 40.7999999 681.620000 0] endobj 5234 0 obj << /Type /Annot /Subtype /Link /Rect [391.199999 646.100000 454.560000 653.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 >> endobj 5231 0 obj << /Type /Page /Parent 2 0 R /Contents 5235 0 R /Resources 5237 0 R /Annots 5238 0 R /MediaBox [0 0 595 842] >> endobj 5237 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5238 0 obj [ 5234 0 R ] endobj 5235 0 obj << /Length 5236 0 R /Filter /FlateDecode >> stream xœí]Io举ׯÐ9@«¹S‚º½È!€a9 rz2 ¦qæ¿©´T™¬×’]j]eK$ßÎ÷ÈÏyþgõËÕç»çÿTßÆÏ»ç©‰"ÿªÿùtþÖÔœ _u#kÖöÿªo߯ÕëáéðÔýÿz êØpüèNC þñí÷ÃçaðÃð—绿ußþW±ê¯Ýo¿V?þ£ûøiì¯áû¡iUÿå·á e”5Ý/çßú‡ÿ>üýOÕïͱßþÿO¼•\wïÄÀñ:7¥ÇŸó¦h0R‰V° ”²NÙ}ûï¿?w½Í`Ô­ T+¡Éê^5;vKTÕjU)mõiMm]O4º£î#MG¤ï$ff”íì)ïœñã$e4Þ§ž¢ÑÅu›¨£"5³ ï°§`¼+:Pißsä4§®¢ñÕò&MG=D4njæqWÁ¨o›‘¾¨ˆÆX“†T%%‰dM›Ú„zÜU(ê%•b˜¦ŽÇØÔUlGœ%ꨇˆÆMmD½£«`Ôs- œ¹«hŒ©V'Zâ4Çîê)‰ñÅNÆ×«£á×—ÃçG*:AÜɽ—Ÿ;HŽëðñÒMWVŸz;€w¿ýTý™zÿCõòë¡­eÛA>X¸ã…ž°=! >ù ŸÜAzÂÿ6 †ÛP<ÄOãlx8‡Oà8ü!`}àLCzö†©jÀèÃKdzÙ9P´ÓÄȸZ.ñÚ;(RÑþ”Ä0aºÄã@êÃK g`~vÀöèß›ƒgp›tÙ¢äH”œð·¤Gi-…j:pNèÇ'¢”gèÐþOÆE&•6+Æ™@ÕŒ6ÆÂ´F'Іu×5±èø±œ4àRíšàZš ï ¬%è<*–'x…áìBä½ÃªÑ¹% %ÚÀ‡%²Ç=Èš³†2yޱ{óU(-|ÀÂH 'L›Xã=˜oXóŒè}Ôî”ÔJÓ·³±„/†ÄÆ–ÓëÇå“ì!Tª7«†ŸØÝs« š +œ'ýjcû‘^¤Zn=ˆ„l­šaÙ0r”²é]„C¾eý%~¼La9Í ÉMáäÁxxÅ,T³í2{áÞ¡ ÄV[,Ø,ÐÄ"ç›À[N08ž'føõDì1ÏéˆhwŽY´HO½ò{´ô!OòÐ:~•[„„×q=ê⯽Åm½.R¿ÍA|iõ±ÉbCl×,J(Ë¥JÊZ)I/£~h‰¸lÌ_òA±Ñ˜¸õà&$‡p¶§¡žv@%ö’–`;‡¬½´ˆL k(ç!g—› ÿN“è ™XXK³Mãßæ2¶Ú´¨ÍHE”׃um9~²fÊ0¢)CãŒì­kÞ£ |‚aCfM-˜ÛÉ·  #'ñ#y­êm”R‹1LtÕ|8ÂÎ)$bÁÇÁ8`®„ã€SÄ(îÛL âëác¯%ƒmHÀ8ôÎ=Yˆn!0*=MzbUm.^”C`iW(ˆ¢ÓÔ+í‘x<øÕ´Æ|Œý¶ì‡8Üxxý°+l…ðR/F_’ZƒŽ5Y¶ÿ—Qãan9p„½n¼jÖ¶„Åö+މ1d÷ÃAôÛ ¤.†:sjЦ5T…G´úV‚§>Ú3`ßoWM×WM>âa×Q»Žº •3(%¥é£”JeÑ&Q±/¼þüëÀšÊnV ¨$ÊH™ó±*¾@´ì–Hˆ³#„jfΠʖÙ|8Cf&:r‘à8fÿåç/¦“ÁbRÒÂ6iíM;”DÀ.éÓŒ+Ä…6VÈ'Xa¬¤Í†IáÎàms”x¤|xD0avHÐþæ£åÈÖ‡Þy^É.™IÙÉ’ÓR½€õÎñ„ZGà ö©©¼p.ÿÉNM[Sv–·ŒÎa§V™]7iê1i©L•Žã‚ÛsP6ç ¦¬(#¯ßêÊú1Swæ‚ ¨}è@¿®ÇeUýaBÓžÿá·Ãs¶’:DkMc2؃ŒÓï…cþ™GEÊ$ïÇ$(P.pÂG~‡ƒRjŒùQ=À²ÆÀ;‰Q·2Ò”®Ïí˜5i\óûñU9ænÔ#·ÇÞÚ~²„³PžàK"ÃC£:BIRúáò¡YdÔ*’[š,K¾}éÍŸÌä½½Äíe9|TóÄ'Ș%þéÇ֫Éï…kI|<ªå¶,1øÜ»ó7P³ÒJSï„8ì–1±>-$©%M³»œ“.ø"VJ©œFWLÅxH9P_†8Ö^^“Ñlj 8"ÅG³À‰Fb ­¸å²òòKÄŠN„˜D;¥)ºwp³Çaù·ê5_-;m‚»õ'¬ØÄHQx$À¼¼•ms^‡9O÷Õ­ŠõÃ8x²”®ÌuÉŒÑy+צ[ˆšÂkK£ÝcØ6…oT&·pÌ>£’=·0]n¡¤v3Åֱ鱙$üjiýţЃÒÔ (“§rêÿô%õZuù Ù¨2¨Ö® ±vCd`„Gœi/l}¥#ÜŽ-ÝõW¦ääÌiŽÒ$¨c)ñ1¹ŽÞ°b ÉÀ‰|ø`Ìì)~J²%%ãðŸDßrÕ^T˜G$i<Û#.áQ‡²Œ‰;ÓCCç¨âÉHÕ-3¶gcøØù)Ï׳µ„HŠ ÓÇ(#\ElŒ­$lTÀÕo§C¤=z¹BM/HbåQ9Õ §c×”>ý!iaÓÇù5k¹Á¥öý3…ˆ¯UJ|= !É1ë=Ù +<ÝÀþøC*þY¾,AÍW§ŒÄÉWƒO—ðà+pP^H€½EÇe'𪠵£ ÎèÇ×(¸a/;×8È»tqBêSÍÄ':è%¤f_ƒ9#)-; Hfö®X“ùèÅaH1ec* ×—<%/¸Òd¶s`t _åX“€z(§–¸f“1TZˆ£±ÌÛá“€õ!mŠÍ®é–1ʱt0J†³r­Ëë¸aÝ‚å†Ã¢ƒ;*IŠ¯Ùº¾äJJ}€-á\‡\™`+¶>üV¡$§«)k‘bß Ï!€^B¼­Ï)ä[ ›C›À=ZнTHÿ´À®ê ªhØ4ê­¥Fùq*ÄNIO°!4B[oÙSqÌgÙ\ßZHˆõQ†gØ Kú¤˜Uݰ•örûÝ3pñfÉXYÃÛÂøN=L/–Žýž›Ñ×3ågÙDðfIŸ·YQøQž9;ûà›‡xôEæÝRùÛY)x!‘¬U³:J™)ôž.ª(”ÚY0mBv6â–\uI]dõõ²- ˜´A|ð–“OF¨ËP…"ËTZN!I¢ÛExv*ýXTêV’òiŸà]œŽ¹|„T™Ë n¤¢Z “HnmÛ gµ6Ypû'†å¥7>œð¿ŠÞ°.À´ƒƒ nXÎ#hµD!IÙY•‹6__?t„—u¨M.X.gÛÇn§ršË¹Ïk [ÿ9ï¨Èn"á¨` ˆ£:d{'ºFVº]1ñNŽí“# ö¹ú¡]1‡êç)R»zÙ~¶‰ã`ú‚SzºÉ}¯3sµÙëÌ2P›ëgö:³dJIWÁsõZ€Xg&Ù\Ÿ±åìÍ‚uf’òØ÷:³móÉ^g¶Œn¢ÎL²¹Îà}ê–=›t¯3ÛˆÚv™äsÊõs½$—³I»çz½u„Þq®— Sê6r½›èØs½6*™ë%„Z¦Ò‚‚Y(¹ÏN¥·F¥’¼£Í×MºúÛÞÉ9ÿy/ïwÁvSåýRÎYè7—§çÇ©›°#¥ZÁu{yÿ^ÞŸ|¦ï¶¼_J]º¸x/ïOm'íåý©y³ä¥lcÊ÷òþm˽¼ Û{%ùYѨㆠF´ßV„Mvn©¼_*-.`»û©^»î»¦ýëãÇ·ïŽñl@É Ð''¨Î¦‹slTE;ä]ª¸i©ªû$'s.Î`(U«Ëõy­¨‡õ8{2ˆ¦km¦ª̤/<Tç5k/^-e­†=!S`_§mZØf dÍjFxÿÈò—zöù_îá»cAÃ…>¢6£¹ô„¢yŒ¿6ãŠùÌ}„íÈT×gò$ˆ%OûÓ]¤jµaR¼½Úö_ðZZï^ø \L c°É‹ÖÆò=äCL ®06lÌ…ôBø<€q†!ÀPCÓ»$<Õ4DÕ´¿šç-saQê`»3{ì)¥Ž«žÿ<# endstream endobj 5236 0 obj 3208 endobj 5240 0 obj [327 /XYZ 40.7999999 454.099999 0] endobj 5241 0 obj [327 /XYZ 40.7999999 454.099999 0] endobj 5242 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 768.980000 77.2800000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap >> endobj 5243 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 408.019999 540 425.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 5239 0 obj << /Type /Page /Parent 2 0 R /Contents 5244 0 R /Resources 5246 0 R /Annots 5247 0 R /MediaBox [0 0 595 842] >> endobj 5246 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5247 0 obj [ 5242 0 R 5243 0 R ] endobj 5244 0 obj << /Length 5245 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Å· Øãq€ f€9Þì {‘Éò÷£–Ô=Ýb¤X¤(vlÀ3%>ŠõbU±êÃ_žÿ¹ÿõý‡‡çÿ쿎?žwuUëzø³?üýáüo*Á‡_M£*Þþì¿~ß½î_wO»§îß×Óý‡ã®ñ8ÄÐá_ß}ß OžþÖýö¿=ßÿµûßoûŸþÑýøyìïðÂ÷]ÓêÃ/߆_g¼éþsþÛ¡ñß»¿ÿiÿ{7…¦ï÷ðï¢ÕªQ:j¯§OYÿ÷üS4X½—­2‚ïãÝåðÃx¬RR^ŽB›yàN¬W-ì÷ÑããKÇbã&“¢¿r°RL¾ó¼ÈÇËñK&‹íOQ ÷îàJ¼.„¥ÎWSF†uMca2Um¼lxi‘h3,¤´„5Ä â†M'….¹!“³%iˆ2êGÄzY]iÃ.xøÑs”=5›3pËZXºçSº½ñ¤ß#â9¦1ëÉæ¡( ?Bj5NFYð*M!>ì f;4äà›Ðº:`àá(/Î|Û=g?ª¦p èƒUþCîà4âóõʆ:&‹¼uò÷+zI¬"â ƒ1@÷%é|k-®Oâ–Cï,aJ6ú[* a9¶žcá'^„s@b˜ø´ü5-iš){MbÍ€K’©–ä°UÕ/ªaÍ¥æÍ £y훤½1 [ á¯gd)yà+Ì%r­nd˜aæ# ùGØB˜›Àf*Ø6Fáõ8öc^)„(Ç$6»±ðÞj¼Ql,äØXˆ à¬ÆQ¼ Gñ¬I< '¥+퇓«£àRÈ‹6#|Š€ïúX* ‡#âñÞ¸/äå¹0Vð ¾M:ƒ¸³>D\øœ‘;´òrÔ•¹UË„_ÍŸV1ï|0þa÷"EstèùؽX0g/Cÿhÿäs§Nç<¶M¡Íà}Äø+ð)“pVÇûèXOò|C²JtÇÜ0ƼR‡.A—þ9hFwªmÌ €Bg*¼÷Æ1V@L"ÉפҺde¥‰mP«(Ú†(„é$˜ôÄéØ<¥7ø –zˆâÜÁæéÀ¨×¼Ûë!ÞÓ¤ö¨´»½>ýôN †¤a`» œãl“–‡`-‹âá¡@”¢1Á]ÀM;†@?CÔHðÂPtŠt¡Ç3tPnü°*XM̱®‹5ÀLš™Ç0^â³nÁHà5ia@Ñ#6)A“$oD&)áСF»¾¾¿i€ub Ðq.§P=¤àqy$ò4~q‰¼É¶[•møTK²}&õ½:ðà·wHWŒUxœÕ}l«uF¯®uTt EwÀ’›°Ã¹4‰=ƒØ/‡¹Ä> m:|“{6A[^?¢qýXJ„Æ*‡–T0ǧ̃L”µ¾Ÿ†‚U›ž·éyn*Á]FÑÙ6Z(šÒj¹°sÿ¬Zp#½«sH×|ñúpgvµ„øLÍ8_cTé ½·˜LùëŸr9ådP²íïO& ûú{ŠïÉmžà»uéd;§…fíÑܳLû.}@‚BbÁ´·µý‰þ²§ÂÙ ü÷â!Ò$vJ‘À*×ð«bŠ…vN„ùh’Å &Qä-ä3 ÀdB¢5Ü[H~¼fƒÅäzÉH¢i&ƒ”7 G*Þ]ÌÕ“&|‰Èo—[DØŒc>îXŒÒŸ¨7@"pÎŒ©C4—ÍåZ‚TÜõ¯#àî)øØ²Ek—y¡ˆ Q\Ç£Ö8LÈ×’guML`Ïmò¤’/nW$Ë¿")êìa(™B ×wÊoaXå‡a ã€Ú°JÀ±Mó$jž[èVRb Ý*!\e}­d r†•eÚŸ2Âb„^X•#–|ÔnÈöÚ¼/–¤¥´Uzøó†ÊµÔG·QÓoÂ7 ~Ó¢oF@1n'5„½ Ê\SÉѸ=%Œ+-ãñƒÕÕàg>CaÖº½™ú¼e tUñ©sú̦sæWÆqÀ€Á¹ñðqØ#lÑh=x¥Žq¾„ïöȼ™¨Ìd3€ûƒáV'cOü:R¿¤¿‘Yv¯û±ñýàvZ ÆãØÐ—®ÎI´p¶ð›;Ýå壀¤9%wÿ8NÓ.Ù9¿¤ò ”rG…†bÍ€¢j" èÈ"E(Èså(L©”l2ÙdéþKÏ}¥MîÒÌ8¿Aɹ%ÓÎZÒæØÂtÆaNG‘œáÂçUÁ4ÃqYœÞ—§ÆÐÁ™C2a/©j›Iö‹ !|w!F(¡¬Å î€(VÓJ6Û‘ÔD)¥L²9G±Ò—Ë9Š÷tsŽí¥”?ÙÜ7áþÈ!«M½0c6Çæ·ïÆœ¶ØÓ½'|€;X+Á:ƒCb­„")Z#Ö‚qI²k$38Wö’šçÊǹî×ÜÛ.d;a-tJØ’•?E×+¹%-rèÁ”’‹í=-¯!X'îû‚¡S2À-Ø%•Ž;¸Ý1¦nתÏEñ'ØÉ)(¹wqRªìב•ÑûMR­äzÁ¯ZsÅ¢ÏTŒóÅŸÔ3â*}9‰ C2ƒ–“ ê3Cbì l>þîù{aÑÊi·hÅ.1‘W¢PÞ|>Y^õ"R1or9S5mí+ê²ÄdôV¦NëßRel©2b0Io©2@±¹…T&x~A¾jp´P<̄臇€&Yv‚Ãë-ÁÇ,·ú5Ò-ÁÇ–àÃÝr›´·®l1leǰ~©Ûp¾%øXJ²l >Jëkf[‚wẀ,èþî_;¦ß1ôà ã¯ßƒÊ8zr ç§^ÉÓè=ë–q­ŽlËtÕ[®÷¢–—[­u¥¯µ[Y 9kØ7•¹^aÆ\i)!*Þ^u™(UéÁdûÖbà8 ü¦…ß H`xÅ;¶yQMëìm@6e¡ìµwGö•~Aߌ>†k- ­c´Ÿ‡}3îXÈÚǹõu‡ß¹b'c†‚ã™p<`^<`Ö7ãÚkoï¶ýï¥õî•'p0&Œl-×9†ògH‡ ^ahØ£ô tN Cü Ç3À³†0fIhªij]±CI´Kâ¬ÔAvg÷BžRʸýÓîÿÌv®Q endstream endobj 5245 0 obj 4034 endobj 5249 0 obj [328 /XYZ 40.7999999 163.220000 0] endobj 5250 0 obj [328 /XYZ 40.7999999 163.220000 0] endobj 5251 0 obj << /Type /Annot /Subtype /Link /Rect [353.759999 706.580000 420 714.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables >> endobj 5252 0 obj << /Type /Annot /Subtype /Link /Rect [429.599999 483.859999 482.399999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features >> endobj 5253 0 obj << /Type /Annot /Subtype /Link /Rect [354.719999 198.739999 487.199999 206.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp >> endobj 5254 0 obj << /Type /Annot /Subtype /Link /Rect [355.680000 182.420000 399.840000 190.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 5255 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 172.820000 542.879999 190.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap >> endobj 5248 0 obj << /Type /Page /Parent 2 0 R /Contents 5256 0 R /Resources 5258 0 R /Annots 5259 0 R /MediaBox [0 0 595 842] >> endobj 5258 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5259 0 obj [ 5251 0 R 5252 0 R 5253 0 R 5254 0 R 5255 0 R ] endobj 5256 0 obj << /Length 5257 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðs8âE"’“l> ‹>Ùn‹ÅfÑtú÷+Y’íCú#ÅáE²¬È91-j8œ;‡3oÿüùÇý~|ûòù?ǯãϗχêT5ÕðçØÿ}sû×'Á‡_•®O¼íÿ¿~;|?~?|:|êþý~`ÍùÁñG78½b˜ð÷¯¿Þ/? Ÿ|~ùk÷ÛÿŽüø—î¿ü{÷ã§q¾þ ߺmú_~~aœqÝýçö·~ð߇¿ýáø[‚>ÏÛÿûF´JµZFÁñýò(;ÿ½}½¬:ÊVq©ŒñκCÇÿyø¹›íÆ©•Œ©Fªjö¬Š÷ÓvO[Õ9·'µÖ6o*;‘<ÍD=D,ni¬’Ê=õ²©ÏË\Ä.tš*cJ'ÚÃ"·´ õx*2ê[&S¡~š*cš‹& ê{ˆ¡OEE½æZ˱¨¿N;‘ìÄjš=ì bqKQŒúF Ì­bEýe¦h„)–FÔŸ!bQ+›g"ã]5â¼È¶ŽF×8S4ºtj;ˆXÔÊ&¼›3}Jb|ñ«ñõÝñàû/‡·?0)tok~ù¹äl°?¾t‹­oz#¬áÇ/?ÿXULþéøå—C{ª[¡êÁÂÍ1R½Àgø G#ü=á=:jþCølØàlxD´ç‘_::ÊNšEì°øPRQ-òVÖNo…»_áÝo!N2á3Õ8ò1%eâ•r¸R!àl£p6׃e ƒòK7@¨„€¿#@€e$†sj2™Ò†‘ÕÀ0JL`‹®O¢2¼¾EGƒFFQ.¯ 4¯¯4ææ#ÌúÆ€cuª,L 42ò§<ÉaàfÏö-ËñŒDï©j8b-ÐB’"ÆÎ#ŒO/žƒGë}øx›gÚ3ÉȃzƬ#SÎÚs?²ðžâË«Šxݬ%°‚eÖ+XKa„¥:”hXªc½2nlF¹%êÚÀ®&A7¦„<’-3Ðá­)U¬ u¬¿Ï+ûÃY÷FÜà÷be€×gN?ÚŒjÙôÛ¥7ü¨wH@ø>h¨©YåUBP¹fRzkØ{C_L7ÕÔÍk[ÅzO æU0ù;¬ØøÇ"ÿÑÄwÓjÓîÌcŒ?ƒ¥Oº­^ÓˆBVO³\G ±<"÷žÜÈ® T‡T¹˜É– ØÂ#Hg{M3‘bÌS`ÝÖYŠq>¡9 ·ì}¿êLÁ%¬¨2Šï…I*œ°¶m”µ$ $\“ÜÌ:xXuj{%Ä;¸mø™I^WÌÐvãH0A;E£Êİö2[“&e:ˆ /Ø’–Ç]ŰFš±CÙ[2$y݈ßÏkª…Ïk S®ùý½ºó#|~ã€d¤°¥“ÈÆ€`'EM„Ä­•S‚«…µ‘~³`±aˆl•§Ê5#Õ­%ò0nMK/Ä¿¬0#´˜7RÙ(­ikÑ–Vð|H,!S£„BÀW­×XˆÆrëñdA.W÷ÙÙF‰G~LàOj&¯ò˜„UR›ºÄh~¯Z²K6Å|º pÍC\W|úo‘Øü“Š<š«Ø3$~VZÃa_ë‘Òñ Kš¥ í¨€hÊ|‹ÝY‘Ù*ËìåæÔ!JJdESFÜÇ!;Nýðû²˜Œ!³R¬ÙŃîs93Ë-70+ãžÍc#p ­´ÁFc¶Ö=ªšïOzÄ‹d–Äìœ=dgÀø©'ÏoŪÛ~=|΄“þE†hÙÏ‘—;GÖ3 Æ oÝm¯A0¹.´ RêA0H©ŒƒrN‰gM"ż"8‰0í—4Çðyí^¿äg¥°¥¬'èçìwFb¶”a‰ÛÂÉy!¡>Š=šÂ,w@ï÷nðûvhL”Þë⇈3ÌlœB`öÒ6ò$ƒ8v Îf«ŠÅ“è‚.§¤–ÒÕÛ¥yG’:ý6½áéMÐÁÉ,2(ò8æ0¯Œ_¸9KÂÂ8Ꭰÿ!ˆpv%?¦’‹þÛͲկiñyn”…U2€÷w)™q¨)·áÝoǽýd^’ŸÆj¦¼ð80±³ñmë•`D4¡Œ<Ç¡˜¯ë, §9°ˆ+3àœZ<#¬‡R™K(\s7Á•&pî.† W€Àt‰Gðlx×­À¸&h¼Û5a6\Ob%’TÉÂ’T@>sð&Aú:8’#Ÿ6\ƒÅQÃF¨Á‚wÁÁ¸j ¾'€m ¨Ãµ£Ã&…RUàš2…è ë aÃ;‡asT^ÂëÁ»@ÀEFc®n´1ÊA*ÍÐí¥ÈÅâúcyÉ%±5†¹–`YU8¢P¨[/þ—ׇ‚ )171,·;;G±£ · ×.…¶Wæœe)nè¦ç ªR™³©y«žb×kö¼Þ¦L8²¼Í¿¿_UQ1el`Ìc¹ˆ1í|L±² yé8ôópƒ£VïCž%9bÅ„¨¥înÚè åTÓk-fçŸÄV æF»À8Àis0ö8)´ƒù§gë€m?kÙÜYËFs&ÊX%2挖$17ùFÊ`¤™N¹ð t±úîšé×,“úú^L‚jÀmÊ•ï€êÆ)òÑí;ÒVŠõü{À¨òL^ fº6¨¦ØfÝR@ØøÜæPÎh2¥ÏâU~òó 72TQNwNeP s?¶™\œ¸C¦Ä$4JÈö¹Ùd©#«*Œ¹õ6kôKˆ¹ØSnd}ýd+k’Çl+}{$ OÒ MR¸ÆÏ†ÞöJym>=+µ<…5‡<3êÊV¶>fÜr„W튩—¡òܳD¼€ó+” ™ëW8˜;KG<Å2Ò_?*e‘¦£b׆«Ñ†9]ÏJ¼ø*jï;”µÜX¾ X*t³ÑèyЩê rZèýGs–ðnLnŒrp0ãb½@¨ç1Ã+[™ßÏOwC8g_-ÞØÍž‡@e„4Õ© hq×iš6ø²÷_Ksÿ—©Sä1¡ÀÅQÀ¾š?ªŒk¢bÜh±¤ëô¯&"4â"â:ų‹ ÔM8¡8Žš uÇókŒ±5ðÍZ)…·­St‚*!ÔŠ0ÏŠ—êYþØ)K‘äjÖ´±c˜bG84?¶0`ÊÛîšW+5õem Í€+¥vd’ì¢*Iߨ„¡ÔœÑ‡)ZvÝLœ½ÅMño¡~RÑÒ€#–œ§ð™ü‘äô.?CYnjAîŸib–ILcÙàZ[g””+‰t~UÀQHLçÁM¤àätÌÆLñ9ziýéx¼u5Ý1X¼â5ElÉÏb‚[â8hÀ ¾$º{F+Õì|ºpÙùÝ3zXÏH¨ÆÜÌÝ3ZÖ3’ÓQy&ɺK¼P&©ÇÖ`‰—Ô— IÃÆÆüûiͨJ‹ÂÍWÅ_±a‹ÌלgÝÌ4ü³´k\¤á žò8”¿#U±FÊ#éDzç6×ë·í¼kÍØ\¯•¯>X¢¹^+-RÊ»¨M°xƒðí bñ²(N¢Mk¡>…V ÓJ¸¹þÖ/ë1pÊtŽ~Ì€ö³+Â+R?¤—ê>p“UÅrûWP}/ޱ ¡Ô%Þ{Te‘ML%Ì-ö¨jué*\{ª3æu'"°¸÷¨rJ¨½nâªë&n°G•®øzzŒ¬àÂÓÞ£j^öU«ðÂöUê…ì¢+Yº;Ìš%×Þ£ªœ>Ü{T9iç™zT骉éF´÷¨rÍö°=ªt¥£ôL¹nQºjÛÞÊÖTjbïÊSÔïgfE€ Îß`¿)ÍTLLùy¨tïå´ü±˜½wTrëlïUÌãÜ{G¹Þ³µ3fÈ”±0Ú˜³Ó•÷ÒœM'IË÷Ò¼¹$•%¼k*ÍmšõlŠâ„¥+J…\Ý7'³.¦Ì¸A«©no¬¿j·•—êÃQ³z[Ô’©˜â^H<ª­Æ¦ >f¾zÚjSIì™­[=SÍhk4Ú46äÇrö–àÌ‹Ñå#x¥2jö˜3q¥cÎBúáy\ÿGÔmÌê’‡Ÿ‡Oöض¶‡Œm¯9ªJ’å»»U+–¢ÓKi×0Ø æ7¥½ð<°½Ñªä8õDUûjцé‘4ªPìÆoÁÍ ¬Úþy+\Ý·#”VÙÓùh$5a¤|_},S,OÉ%XŸ& ñ‚¾z/ùb:EƒRGˆ²Ly¼³ö9@ŠÈ¤]+™,Õ~RãEÍWÌÁx$Á©”©+v&Y“”-Ò›™œwbH,1Çh¸ö)áÇ®!%O“ôº²N É,HR‹r¾ “ šSÎòk\Ú„TQcΟ Ð€P€sÆûÒgÇèój‡R`J_ ´nl3Eêý™"Iв‚²…þ”‹v)ÔpAÀ$õsSv´w쥺%f«à|ÕÒ…— )íI¶MrV¥—ÌGi±X±¿áB úƒh!ù²&T1)-¬IZHÐ|Å‘’—½UFéJÞSºÓU\9B¦ãj %J? Ž}€FËRÐy—Né´ýGJ¡¦÷ƒuØ{¦ëyNUSöZÝ~°HöZ™vËü¥7^ž¦éŠ{üͺºÜŒÉs…BÅÞ0¥eÖ9¤ïüû ãYudîùöd€Þ‰2[ƒ;3eîΤAz½¸–ž‘ýú™à&Ëpk@,†t÷>ã¿ EI)H/"D@ftf(DÎÚ·tf“HŒOPß3ŒÇˆØ‰à)îéÓµæŠè㚥KÕ¦³0-EŸµÙ|k¾s~=$vB9 î§—=ÓKŃS™øº  mµiV®ÉÑ—©“dÂKÍPеC°ç*èX%¥)éò`øü&C¸Ðc}þ¥š+ë!P¢ÌZ§° çáì·fKn~.$*‚Lè%H9.Š%$IÖÂ9Y?¿Ñø¶ý¿¤‘ƒLåb”3¢ 7,a<ö (ež€”µgе¾…I¼?ß]Î WÏ¡gJ5óNšsMɬ²Ìè€ ^”0)%w ?CàìtGdúÈÚ»£$¼p¿\f¯†?WœJ4RM(TµùŒ&<ƒßÓ¢gÄ€\¦N-7ÎãGgó$Gì^‘ËF´‹³dºM–÷`^ßÌöÁ660¸÷ „šq¸Òµc¯´IO˜Q/<‚¡[\0qRæ{Ä(í¹H á:Ùi$þ1ðJýc£…îë²AãÝ»íµ¨ïøH?õiP”«¢` a6•(ˆkøŒ;SX©2˜u«_“ÄœPqiä±zf/–¢|ð–7À)m’Øâí»|)Ez0Ô8+ç@ØH³áÌ \l†’Í‹Úd¿­#”)Ä elò(=§²iZs£RœKÍðê–.±¾ºÅˆü“¥ è&½·b5DÊ0¶ Ðüø›#¨6¿ö°Ã¾X6aQ5Í}²|EÄŒ’S×›¯«Îz 7çJ¤¹!q´€óé¤ñ­´×S³Þøˆì!b ‰çCIH÷]^Îï-7Lù‘]H¯'9ƒ ¿ßS¸ïCaš…Îõn½_7ÈñuwÒ ƒ¯²eä7Þš ÷ P%‹»7ê²þ=ªò|Q•°B¥øÆ ¥$1¡µ£”?ž ÃF 7\èšRþ·»~P\ãFo-¿ ¶pnôå®9–\Þ$”.~н_œÏŠ5}SR¼Þø{—)òÖ¯‹JÛòºmI Œ=K$t-µ:vÞ9’¢¼ST\%‚cIe(U"NŠÛ…!¡ÈÂæß¦—uß;ÐIøþ ã¯ß‚’soÒ~?9Õ‰óQ>OsdÝ2îY¶¬9 É¢šº½Ž.OÓœšûG€­lW'u?Ê«îŒ "ĉ·ëŒgõ©6Δ…÷Þ£á3-|f`^ÅO¼:çИ†Ð½Ùнýäüîb½³ÂÐ3£ä¼7ÂÐ:F¦ {fܱµ° ‚êúßy}^Öð}*œ˜—˜õ âíݶ?Á{i}÷Î'p0%ŒJ'ˆÖ9Æòȇ˜ ]alؘ£Ì2&Ê…ñ9ñ3C€¡†8f/IxJëª9±>Ãô5saQê`»Wz.¡Ž;~:ü©+: endstream endobj 5257 0 obj 4684 endobj 5261 0 obj [329 /XYZ 40.7999999 678.740000 0] endobj 5262 0 obj [329 /XYZ 40.7999999 678.740000 0] endobj 5263 0 obj [329 /XYZ 33.1199999 729.620000 0] endobj 5264 0 obj [329 /XYZ 32.1599999 731.539999 0] endobj 5260 0 obj << /Type /Page /Parent 2 0 R /Contents 5265 0 R /Resources 5267 0 R /Annots 5268 0 R /MediaBox [0 0 595 842] >> endobj 5267 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5268 0 obj [ ] endobj 5265 0 obj << /Length 5266 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9ÀjŧH 0Ï>ì99ë8‘52öÁ?TSR÷’ú(‘¢Øê™žvz›R±X/‹¬âç¿~ùgõïß«Ï_þW}íÿ>|94u#ûSu¿ŸÎ¿ ªfÔ~l•¨©î~ª¯ßoÕÛáåðbþ};y|±ÿc‡.,Àß¿þzøl;?Øo¾<üh>ýQÑêó¿_ª¿ÿÃüù©‡×=ðí ´ì>ü×~ ”Peþsþ©küÏáoª~5(¨#ÜîßOL놺 ·ñUrü=uÖT\«VòÊüßà) 9~û×ágmD£ÖœóHÛ,†ÚR –Uº••LohË ‘µ€”hóê0"«FFÞ!ÕJö?ðó’~T׉&†u¦G#4¹Ø«¾åaïi-W4< £,ìÅ’éN‘‰î¤Õä26 ƒQºCHÉtg‚ØA2¶v˜#¨µ€¸Êc‘uC(A%“^0ž‹ô#¨µ€:û›P‡Q&ÒcPɤo‰1[ß1ˆçi5ÁZM32‘U#!%Ó]éžZºY;ÌÔ*@¸Ó*“Èw‘uC(A¥‘Þ “°6Ç{i5å)Ë1aôe˜`' ½dYÐÐÓ‚æ-ðâýëáó3áLuë·×Ÿ "ÇE ýój+ªOo­MëO՟貿T¯¿t-4k…]5ö-°å¶PÔB$j¡:'4ÒÂûQñ4O ïÀ‘b`¬Æó÷“B·ë”ŒÛc< Ò€Aºxj©óôj¬ÆÖ6@1‹O óË ÖHù€Œ=Çã&ĺа>C¹iFšf0]PþÍš ïõ1W¯ª¢|ªKBŽ]ê†d³]?ÀQ›³ozñ’.OÏÑÎ#½Â’³o,d-…¤ß‹ˆÂjÆ|8½3£ŠÐó¿CêâDö µø`­¢¶µVî£VíISKÞt#rUk¢…ˆFÒ=Ãa<ˆ5É&òÈ;o¬ðqù½–R .U{ŽŒ9^[ôÏÀQ µï¨Ó£Òù¢'òÙÜù‡ayÉO_XªÚ(‘œI"êF;D¿;¶ˆ 1¾Gð;$ª—JÔ¤‘ç èÚëO; ïÍ–Ø{äk Ü1}ž#9FÍc(–_z]¤Ã³KHÁcî03—ÅÏ#„=w–ó xL¤¤qA²†8o0›\áî­ì"¾-WkO¸©„´yØÜÌsáØyz­¶-Xé]ú4]ÎKß„y’ïAÇrç±áÉíÏkx¼ÐPÅHÈrK’dþ¼þ¬Bïæëc·5rÄ›=Ü/¨¥Løå\ Ș7`ÀX¢Rìp„ãÏÓòås=¹Ÿ›XÙ°bn{¯úÔâ„¡±á!Ÿ ÷1Ú1yÁ™6àz~³'žsJ¶á|£åÌ7è%©QÎé%07&X”ë—ÙEQ@¯–êdE¤ä©”•LÊì›2O¦XQh, ° Á8bLÖ~Ä"ÉëÆÓô, —9ñ—±pÀ ¦§!˜éMO¾‚ç àI!Â;ôå¼j°ùDÂ(umK„—‡©gÜ÷+Å1ÛdygUÁxÖIŽg`XË•ÃGÊË‚ÅNÆõ"üxŒ€ÇXìUªåÊïWå‘è­{’mXUDOY[*;c«z ]Ž{{ý9Q£–f G+Üwtü;ä¾£Ñ;£u`î~À°¥ÓÔhÃËo6nü–ž‰²fG‘Y„ÛiÇØÆmØ›À ÓàÒ-a<›PgKA¶nÙ$ã8b͆ªy¯‹ Þé µµ#g-Ϧ~㦑ô¤sBë7AEM]‡8 ÉÏn·ç0 n˜?ñ@þàw¶u§)4ÀzžÄŸ‹Kb)ûˆ±Œ´ÍIÀ;p¤M ´B‡tÃá_´…¾»õÈž}Ã5Aæ5 †”€›×ß8ÇÈ–„…b üeHÞc–€ˆÅbÄVàl$®Püü‡WÑ"k¤iUvn|N&ÂxôßÏ&l Ôn½8o±"”ž©¾”°®Š?¥œ.À‘°¼g›–︦žæ7xÀÄ Å5$‡¸îgÇœ?å2³§¶µé|ÿåó_`>ClÁçåX'd.áñàÌ †GŠ©S 뻫ÄçŽÀ, œk3Ø(Ö˜?ƒÇ³óœ&Ý%VÎáóÞxOV€ß)´ÆZ[.HF†^³åÍDPˆÒîÖ¸1ç™!ÔU‡ T9.Qó@Y뜢» Z‚Ììв]éœÇƒíÊÎç.*ÚsWÒ )˜¡p?Ãyå’B ’¤¢àlCÛ1¯ÔlØgžœm+pª8@-©Ôr ùŠ3°ú€³Ðqæ:¶íØâa?só}"…KÝåÉŠcUî¦HJÐ7à©Ì&+ÂL8€˜#*˜r>Çn[-IŒË‡P.AÊâŸ`+1àØ¢ÀÒ^)ÐvQ¼JsYš[·`éùÁUï(c™¥ï:õùòt+ µ3¡8Aw=P—jvIÝ;‚S+?¼æq3¾ð£yk#e)•ÕÀ+7ï4/ßDàôÂSóÙþ)’ó§ü6>€˜#šRü´Þr¡¨Àq;:–—m%ã%BlŶ‘?̱‘+ˆØÄ­À ù´<ëÊÃòÆûXµ5– ÂÞŽå¤èfJ”Kä}@7K•ÎjÓÚ¡¤òËÀ>a«š yí iÞãs{žYöakd#6Ñ µ–'\âÄ\Œ=«,3lípiwˆ[QÞS>« Wê—ŠƒSìËäõKRâYYuf'ÖŠåXnžÑÍ3 j`^OâÝyFY­žíñˆý€D¡¥v‚ ÷&Är#Š´íæä\–ò‚ᯈê•%ãaÅßç*Œ<£ÓJý^-6-d“9=@“àélÖ;AbüÎÞw0l[ÝVÜ §³ ïêny(^»‚x«wš?/¶%»æpzµ".ZŠÉÝÜÍÎdÖMh?ä‚—p&]kµß"=1RœRX>å†y¤£ï>zo•t²ÖËÿ ^…ˆ«§{9û¹¡ujíU]Û߸p8`Cö*îN>I­–§ŸÀÊÑËQ),kñòíî)ÝafcŽ$Ö¤©,‚H ¾iRÙÓˆÂn….;ÒŠÕ„Ö8;)ØU®|R€ä¸(ßµ s"3–xÀ‡¼#d'ÇÁbß÷œM/æö Z[»‘f9ð|á8ÇXª5¨³\ÈXHó#ª6¥˜Ûua *™£Hï'ÌÈqÄúê¬Û²ƒ1ê²ã¬Ï˜ö¬¹wd6Qfÿ6e[Ñá•ö@{Jbu‘+š-}–¶nôœèÄl?§,£ð&W–™[žmny.»Èsѧš_·º ï².ˆæzžÃ·º ·º ÛHŸj祯ì„wBðòùð{ñ¡£ÆƒóöLë=gÊh}ù<Š£k³;×ýʤïò•/R*º\§¦ RÖû°|¬?x«v»Š%,±{Æú*}‡ä­u½JV˜[·:dWk²^ÚP&cJt‘Á1c*Ç–n`ósùqo!âö»”ĉ„+vq@ÕCŸtÊ{mÍ-‰kvlלI(O¾ÑÕ¥×yÌ0‚)÷<®‹m+éõ;”EÜÒŽfùâKÀ=4ØiÃbÞHH­¿R§"=„PFú”ž—ЬÉœ® —YùXrÉ@›á6·2· u]Êá g–JеŠ9ضåq‘3A©KÕ”(çŠ=M¯GRÎØÞ½›pv2ÁüVo†x†6ÝýŸ¯ßÔôÙМØðdDðÕY*Y3ŒÉÓ[DÚ“«kÆšËÖ•²–ÓÚ¤yíÍ*:mëÖõ*-OÚ‰ËÆjª'3Ø…¨¥eºk¦úQð ß±¾LKkÚ°®éÔr¡Y¡;ÿæ>ÛçyNŒð½Ó·©‚ÆÑ•¸wzŽÅŒ½Çí¨+¤®ûLÅ+ öׯ˹›“á½ÓûÂØÛ´€JcíK”Àç°<ÅK:–,‰¾¤S’€-¦ |' QXo²È¦R¬IKºdËs! ˜$ÜrvñïKι¢z9üJ«RM endstream endobj 5266 0 obj 3199 endobj 5270 0 obj [330 /XYZ 40.7999999 413.779999 0] endobj 5271 0 obj [330 /XYZ 40.7999999 413.779999 0] endobj 5269 0 obj << /Type /Page /Parent 2 0 R /Contents 5272 0 R /Resources 5274 0 R /Annots 5275 0 R /MediaBox [0 0 595 842] >> endobj 5274 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5275 0 obj [ ] endobj 5272 0 obj << /Length 5273 0 R /Filter /FlateDecode >> stream xœí]Íoܺ¿ï_±çQÄ/QЉãè¡€==y}-š‡ºïпڕ´¶Iý(q8¤´öÆ@¼6Mr8Î7‡ÿøíïÇþvüx÷í?Çïã÷»o‡ºª›zøw<}}xù ÙVJmk*Ùþ¿ÿ8<Ÿ‡‡þÿ§ƒhÎÇo}ã4Å0àoß=|&? ¿ùv÷çþÓÿŽòø§þ§_Žý[ÿí§q¼Óü8´]súðïáƒB¶ý/?ÿuøËö ´çqOÿÐu-¥NƒãéÒUœ¿^vE“ÕGÓÿÐö Ùÿgztü÷‡ŸûÑ.`TÂ6ÚÖ«Gµr¶³Í±3Þ˜ÞÒÖ$RRVó tFYÒÊD­mp$2Þµ4LxŸFJF—Ï@'ˆxðG"ãÝØJMF—e¢÷F6LxÆFÊÊ&¼Ã‘Èxoº† ïÓHÉè²F2m`×0áŽDÆ{[+&¼O#%£«5L|æÞáHd¼wÚ0á})]¢®ÞOñàŽDÅ»ºÙÕ©øº •:R–g D"mi#æC‘Q¯ëq™J¥.ô2Tê@Fñðš3D"miêñPdÔ›nÔE„NÆXÇ£ÖË$/Ή´¥M¨ÇC‘QoÍÈžE*§*u Öòpú3D"mi꽡XŒkùl\?:~~<|ü*´jO¾„ÇŸ{HNñaøöØ/×?œLO¡Ž?ßúú‡ãã/‡®2²fð` -u‡ZD‹Z$ìSÃyäg8…- lѨE‚°Iî£âa«¿À–ûøyj¸ 5ÄÞÓ;÷=½f§>%—!]j)©Ó9Á؆ô8A˜²!ýâS 8L¿˜âàiÀó(L¥.€bGbŒâÓ]Ã>˜[A¨5„Má–Ž‹–;@Ƚ¤9²®Ík’0•’­Æ?Xíó/îοÐÏàhi*Ù‹Þ9$ÛªÛÜ®øS­œù<ꓺÒCWoÿ[—ˆf¦ñG5hT%¢sQ»óB½yýÁ0Ì÷hטç!'PÖàCO€-Ó-"­BD ¸ 4^9^ÎzúÀÐò#j›Häà!4úõ§Ê?ë÷M|ZìјS"¨Î ¶CaHòk¾{œ¸YÜwfƒ1€IÄãëÎ V°O¼ˆyïüÅòžd’¹.¨‚”U{€ÁÖ’È_§7 ¦Œ|NKîB2ëÓ(¦ƒí¯Æ8S QÝœÌN—DÙ¶žâ¿ØÅÓiê6´¤ö6pÖ[ÛÛ+ÁXžIàÙQàqK„?Ùí›ß%m¢¦ž‚Ü7YµoY%¡n4BŸO7f2¢Ô´hۘ׋˜‡™CÄ!ÅGßõÚùÌâõXïÑŒñ B—T„·7ÂSpÕ` ã§û×Ç–2 ‛p¹ï`˜‰ºj¬x¥á\œ+µpÎnaqÅ JÐ#‚` î{LŸËnV®µžrýóàinàqÞœ\¾±›¿rŒæ<¨+sÖÅ¢ªO-óÅõóâs%¿l¤ãÇÿ]š,}ZŽÿyƒpÃ*FS´Š„ˆH`H@‰o=2,߯8Í/oº1Éâ…¼‰ &Jò¦Àm0!8îÛ Þt(áÍK[R´ Ø›vʾyÇòò=3§±FXÀ¾n¶^p±šn1BˆÅ½}y]†²ÕαÜMì9#/RZ:«Î/•nœ9¯)ßi?vW‚?êfLE%‹®Ï% ¯z|ÍöN`Y„=ˆ¡Øˆˆ!‡K†…¤X’˜ ¹ñJ÷¬ì&mîv3ïv3ïÔç:oæÙV¡£ð6r"ÅXAoÝßT’ýµjÊǼ±¿}³?ƒóðnì¯'äî2åÝjKŠâ Oç*k°Jæë ÕÌ›S_€’æíÈ)NZWž®ºF°²€ïn}rñŠÈn|+2Î*_Ĉ3‚e“‡$\"¸<ΛáH—ˆÏ„’ãÕȹù¶ºŸ¢]ùâtÆè£äÈ– p$¥l® åOôÚ‘;»“ºÌníõþ­8*–.r"³ñ8Œf²ŸdÍ“× CX¹-ˆõ!O,ÍlÐRö`…Ú»|¡ Ÿ€M.á¾ÚFUZò:wUÝ8§ýÝ•&ÍÊJ¥‹]Ž"p<¦ÝDˉ1íÑcÊõ œ âeÆ,Þ‹Š –¥Ø¥oÔé銙Jé“Çݹ|?jd/ÂLÃ&m1ÉöÊ]½ê$:Ê%GÿÎPž¸%Æ\$ÜÛÙ©¼×½xBK Œ’!¨$ð"9)?…5تqᤫ ÝŠúRÆ=÷HP›Ü «S:æ¢[žP`™Ö$Èrp+KJ(k¤Ô Š [¯Æ–ÉÈ}Â:‡ûf‚2^~h•‹ÝåTîˆ+AEÃyY Oãài?î))¾ÌÑHrŽŠÑ\ .õ—(£EdpF\má)É*›—k6Òåš ÚkÆsÕo± '[£ÇM7+QÆ)íeÊ £¯‡îi˜i©'z²ÆíÓÅ÷ÁŒ"`¦Ï˜(êj8&/FS#íIï [-L5å ¨%­£®“Jì}Ôxžg“ÌÅ^ÏxÌç £äQÃB×@-î`K)FÔÓ-ü,ND¤Áµ,—Ù[Ÿ”“ãÏrg³€ ÅDŒ±”8´ôÜÕ|ÞD…„·>¶z–74!w!sÐÎç%eoVeµW:wm‹‘ÙU1-ÜíÀNNJUp… XBíû-7W¦~`scL›õöcé;»+¢‰xšˆ@Yw+U»#=:•Ùj„K“7÷Û‰·fñÄg~¡¯l%šŒ¨l…‡Ê«I3jµ{Èï6c§ÄyѾ-Y?ã¢XݱâÏ›÷ªJ²{S2Kåq•ÊÿBN ï¸\\¹ûõB´—‡¿¡VÐOÚÞ!bµ+®à°";,ëzy‡ ‚, Jq: ^({xÍé½);e¨OµY¨Óe4 áõ(6a¹¿&éMDVZ àcqó4?Ìó£Á–íë°àÝVx¥;¥ ÆïBîjÌ}ñ)Á' ËZ‚΄׳‹—6…´—ÊN˜“~)zžëÔn!ÄH!\ÆNÀ¶Àx#¼üÉ»?Ûs+L£;H¥VÍEd|Ç'³«¾sA¿ñ‡÷Ä Åe(œ#°R‚'#›ÎÍÔ±y>e1 C”Døõ‘P/d>f­ Aò‰³6ˆ÷T·2–(n_ÿþ¯šþ;{ô_Š’´Œc„P Ò„åÌæñffúßP€pܼ£X«àåøx¥¼ëÙ³ Ý?Ӫ˳b{©¾KÊêÞøAã¼BA(ålÖížß»ºç÷Þîçä{BºŒoñ> *v–¹Š®jÞí©§Tpâ͹¸Æ§±±.o•F¿Ùm‹@ˆ0‡¦Â\f6ðÐjD)Ä ñmŠÆG¸V6~™Û¯¼QQ¾B—ËþÛ^òd]¥gšÙ ÊÑÚ^~$F´ú¯ãSOÎ=©žþ`üöýG€¾ýƒQ?Œ‡àÑv]~z©9Š~sõ#:ÑTÃã:ª¾(ãc=MÕÌç¬tºò¸È€Ni+;ÿ¼¶i8R•ìf“tŒ©šÕ¸onžöé`ŸÁ¯`e%ëóËDÏ-ŸáhÃ{ù›/ðoGm}f…_QŸÑ 1×"Ð:F)×gܱ˜µ°@Õ>K#.×M œÏÆÓø´DÆë32ÓK¶¡i–$†Ú§HÃtpOé˜0%ú”>> -Æ ì8QøÜܱÐfÛÖM%¬8=~ò’H, ¶ˆ6ʧ¬8>þ#¥´¡ endstream endobj 5273 0 obj 3515 endobj 5277 0 obj [331 /XYZ 40.7999999 723.859999 0] endobj 5278 0 obj [331 /XYZ 40.7999999 290.899999 0] endobj 5279 0 obj [331 /XYZ 40.7999999 723.859999 0] endobj 5280 0 obj [331 /XYZ 40.7999999 290.899999 0] endobj 5281 0 obj << /Type /Annot /Subtype /Link /Rect [71.5199999 733.460000 115.679999 741.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 5276 0 obj << /Type /Page /Parent 2 0 R /Contents 5282 0 R /Resources 5284 0 R /Annots 5285 0 R /MediaBox [0 0 595 842] >> endobj 5284 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5285 0 obj [ 5281 0 R ] endobj 5282 0 obj << /Length 5283 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀm>ú  x^r0°9Þì‹õ"“=äï§¥~HCêc“Å"»%kðŒ§Ev±Xï*?þåó?÷¿ü±ÿøøù?û¯ãÏÇÏ;QˆZ _ûÃ÷‡ó?¨¶Ðjøµi«Bu‡¯ý×o»·ýÛîu÷Úÿû¶“õqàø£8½b˜ð¯¿ï>/ß ùüø·þ·ÿíÕþ¯ýÿ~ÝÿøþÇOã|‡|Ûµ]}øå·á©¤jûÿœÿvxøïÝßÿ´ÿ½¡=Î{ø÷C)d©ë6 Ž·y¨<~ŸE/ûJȦ«÷RªΪGÇÿµû¹Ÿm£èJ)›ºl„÷¬:N[Uû®9LÝX“Zkóœ*v¢¶‘< ’qK“¢lÜS‘Q ÷ã2›è…ÎSEN¤dÍ3Ñ"·´ õx**ê•êùè°L-ÊXŒMSE£¾Ršg¢D2ni#êS‘Q_uê¸ÌÆb¡gŠFX]7L[ØC$£V6!ÎDÆ{'$“´9M9‘L‚þ´qLEE½–#gG“ü¾ô/hfþ—Ÿ{H޾ÂðãK¿Üjÿá`Êþ?íÿ,„¬Øùu×U§›jp.†'ªDOÄ3|òŸhøä=Á°‰&6 Çà'B­ lC1ZJÎÙDÇ´pŒ‚°‰ð1â1|ç„ÚAo„õà=Õ£Ž'ÔÏ_z>OεªK²ÃJ‚ûèàMz—¨e¥WÉ3ÆyâïÞm7å䙲Ö÷D}â”/ÎÀÚë3¸'nÂ4†ßƒõ3¦KVžqØp6L}%ÜS¬¹±t¨àŠNç•\x¥¼ëÙ².È!k: hJq4P˜ÃÆ·EÛ‰ZUöšB€¥]z2 ½<ýaXkY”Ã'Ïp:pwë?ë-çë––"ý&ýÖI„ »'«i§'ÕW…V­|?f ,)‹ª¬Û~F¥œÄGSWÆ‹+ˆägÉωÑǨ—÷ô: _ÚÙ‹G$êâ0¼÷?Ûòü¿í>'ó/ÑÆ@0vÖ"^Pb/ÆžìÌ-€,áà¸УƸôÑÚ›f-¯YY„ÁÐ ¥§A3ÒÂ)®ÞÁz³Ç0À%*ÔX](Ù¤øÀ… ÞŽí.!HÕ~J9½r¶"ÅðuÚò=ÓÒšÊÓ…5ÓÁ1ÆôkœQ÷8Jýrιy—V8Î"ŠA^û<…|U(SÈ|viÌKø G+Uê¢1ÖãWêÀoð=ÝÈ(èÞK4#ÐJ¸–# 飄9·Ð$Ú ÁÉïµÖq !¥ã1W°s,Ûfr¡W3Ô°Ùàô–´4ð'Á¦³­Ëܤh`$£ y Ô_6¦¡z\Ƨc}ÖGG¦WÓ{H&U€Óäo]:Œ »ÌA&ØÊ0Ö/ÐìÀÓ·þ õß”.c´;INoŒDàô­ÏðêoÑ:œ¼å&Y:H ;JÉ-ýròûgub¹Ò¶à²Pi± mþ’l ze"Œ´qïªÑ¦ÖÆ©ÚÅOàl”0º„ïÑ0|Š! ¥CpH<¹Uw­¹WÁc^^9Då2¬pÀ„â}cÉ÷`²i@„`”úTÑŽþÉ‚¶¬múX²… íBâ)þ 9\Ë&ä£Þ1ù‚§MYïP¬Ø2m} õ–ÏÔÁUBOá5Ó+„tž£hƒ’fÆ%:„¤NŒÝ5b”F ÂuÆd¿•Œ eRÌê”TÂÝ èb'ën5TŠÓÄx‡±ÁûˆË0¸8’ÜÆ”D(5Á…¹8—:(Ó%¡`A³åfò|@! ñU@ϪœGŠjU½§Ž+KÞä:ÓMzÃûë,|‘.ËYÙÜæwnºs]]ZrŽK{„6©¥(¦HšÇþ6Wš[M˜œØ]¶Ì¤¤6×vb !Y Æ+Íô×)=/WwyH@/ÓK¬‹NXî® ö¬CÀPŠ¢.ø¸YjL~®C­°„Ò´I›þp,Ü_iñ`Ϻ©ÃžUWqÒ*Ož…~bîÿø~òåk›y,cçü ³œâM_’4ê\›jÆ_‡§‰Ëm')²>K3¤]_/'QJ€5®yIM«££ÝÈ:¹n|²®É¹ô4j€ÈŠ1ô) „$t±ÊsÝØúÎÏfŒŠÌ²5å}°²2ÄÃöÚ4Få³-!@èxhYÂùäáím¦qäÝð‘˜b×B}@HÛ?¤FÁZˆ»à¯%—l›& ¡¼Lk-"Y®ãÈRœP/4UièÒÍhþ¥‹&2‰ð²ëƒo‚gµîàrÝACH×T¥²±YD]â{¢ecHª«n¸P¦W]i` )ß”WE enWšð'%¿]LÂÛ*ƒÙLxhÃ'Ž·wbðªÔSšR˜€„.ëyG€ ÀÞÈ|þý:Šd/M]±5©žÁá?]ÿsÏ@ĨÉvîÒŽµÓÍœjmÑvâý冤l7E(‘˜ü$ÞB§¯2{}ZÛ ÏjÑ·Í¥û‚=ýöª#X, ŠOl±A`á1Örb^âL³Rzì8|(¼çذÅcXʆÒWãW­¡iX.Ødn‘IBÞhEYj–Ž)&%ð‡#ƒy/Ø‚ïß½ ‡Õœæ-¸ÉhVÊBùª1} hhGå«ÒÖîå:,¹&IrîëŠb£éÝïVTËh±\ÀÍ©'¬Hú?ù3Z’Ã2Ëiõ¹GSWïC"! Îb±°bpê?!¨R{s©f‹²!,Á\ü …ÜKÀZ&pÏŠÓ–KtCŠ&ÖjÚÀ‹0PŠËpÂî ÈíZ·w ×°¹#}<“èQ‹9Ø8KYÌÑICálðœÿXíß…¥Ú|¥þ¥ ÑîewÑŽo·s79_"†¯Óž–艘$aS™c: ÇthÌHRCˆáŒÉµ+E1X¯gO*ôäTufAðgÃïy†ïÅuQ*j<â`”Vp€Ç¨Gˆ·G~¢ í@ŒÊ\Wf´óý\Û%Àý㵊)ïaìƒOŠÖ]w“¿R éÍ@YVJçu‹†sLÜ9ªæa»Q¸ÄÙÀeTؘ° yëó@D*¥†hL1^få£"Bbå2‡R bÑ7!Ÿ:V˜géÜé4—w;®#„³9N à‹ô ÔÌöA¨×¿TÁkß× b¼=†ãÀqÉ<ÕA¹°’oŽÙÖ§*BOjÍæªzȹ–r5çú—ã’è’Ur9ø™"–®ôÍCó}¤ [·|isÞÝââ&ŒÞ6-/·r1òv%v'cx“"å3ÉK¼'Þ\ßfâ½Æ7£ü×BÆÐ‹~Ê©êb(KO,Õà~;¸¿ÒU.~ÌJWeËN#îXµ–b2eZ«^õ‘çÜ÷#GÅ qcB¼ÔÅÝFš=IqñrOšîi÷sÞ@ÿöÏÂ%= ÔR>ûÑÇ€Jfr­ã„+7¶©Ks_׿^›jð=Z†C ±«q°äj¤,„j;s¯n¢¾rî’”&Êwù©–ÕÔyUãN„ ®Â.5|vV$N„@· »K%æè»L‰‘)×yh¹©–i¯ñLËp‡s%Op° ‡”š+¦|p2Tge,Ôuâ9ғäª;ôJ% -%¿Y¦k 0·ÓÝn½ËjÕ rìBÂÌfn¤óKæ£t1aš4½ u_¹ãoJ¥!µ)Ó"‚Æ©•ä’®XP-ž£-Äá—h„pX{{„£¼rGÑ]¨[LF˜Õ!κ²žWÅ’3à ŽzjJ£N, XîŲŽß­¤Š*CïÄ”µ“Äå ܲñËÑeCÙŸLJÙ£…î¿No|®*à¸TËA1G†Ö¾¬Ûæç$þà÷›¡emú|U€»b«G-JƒÁ·×~~õ;ºs¦´˜þn8x½~Z‡·ÊÜQ#ˆ« ‰²\{:Z&—žà›h6üd±f7y…öu>ðGš—ÂÛ™¸Ÿ{ÁUêBá¼RÊ™Lœp%”8°C©ŽæMPb ‹éY:_pÔâý÷þ­W×½*>|`üñõ›CÛŠ_œÿ«Sõ;‡.7é÷²_Æ%ã­“u1459Øqã2‡¸Z]õe¯§+ PMÑ\/4ž ,¢u¡º‹njUõ`Jž4ð=-ÓÁ1y4ªPB™ä~i¶<Îÿò?;FÔ.¬ð]¾KO$ZÇèx„w,dí#lGˆ ºÃïêp-Þ8kßׄÓü´D•5f<¤Xõ–ûðÈK CmS¤@ÇÎa:x§tL˜mJ[U…A‹1Ç88 óÍ# m¶­¨ yðß©C$Á'#aú‚QWì_wÿs·Õ endstream endobj 5283 0 obj 4132 endobj 5287 0 obj [332 /XYZ 40.7999999 180.500000 0] endobj 5288 0 obj [332 /XYZ 40.7999999 180.500000 0] endobj 5289 0 obj << /Type /Annot /Subtype /Link /Rect [411.359999 153.619999 470.879999 161.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 >> endobj 5286 0 obj << /Type /Page /Parent 2 0 R /Contents 5290 0 R /Resources 5292 0 R /Annots 5293 0 R /MediaBox [0 0 595 842] >> endobj 5292 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5293 0 obj [ 5289 0 R ] endobj 5290 0 obj << /Length 5291 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"EêvüCÃrXäx³ ëEœ=äïG=’º{Äþ(V±H©{džq³E‹õf±êíŸ?ÿãø¯ßoß}þÏñëøóÝçCY”u9ü9žþ¾¹þ@·E¥‡_›Öº;ý9~ývø~ü~øtøÔÿûý êçÇýàôŠaÂß¿þvx;¼ü0|òùÝ_ûßþwÔÇ¿ôÿûåøãßû?ó¾ðíÐvõé—_‡_”VºíÿsýÛið߇¿ýáø[Bû<ïéß7¦Ôµéê(8¾ŸUϯE/+¶¬*¥JéNÛ£ã¿ÿ<üÜÏv£èŒRMmš2xÖFŸ¦Õu{욺Ÿµu&uÖ8UìDF[™‰N©¸¥©Ò4þ©Ø¨7ýOË´M4ÂÆ™¢f+-´…ϓĬlB<œ‰÷ºg¢Ó"—ˆ«œfŠFWÝ Qü "µ² ïp&6Þ›z\¤2±Ëã[Û*·%gÃ<è‘¢”€y]sx B]b{Žaxl Q\c ñІ¿Bí±ƒW—p|ÆC£PÃcÛYvÛY9e_ïÖ-Ú/›#Ÿ8t‰ù r“‡Ï°]ŽßƒéÓ²¨\÷È'׸§:X]Kx fx:¹4eNï››r`s{œ hoŠ;çÔË#©›ËÃÊLa†¹®ð4Ÿ¬Äïuf°_Zµ7ió ÄÁ‘Vz‚Ï:J1¥ kêÓ¼—¯Î×龦Aë\Æ‘þÀÇ„;»E€xÖ…¯‚¦?¯ÂÚ|ȧÏlÙ݃ƒñµ#k$…-“^ZÙzrªiiMmkm½†Á.Ãaªv¸hþÁhºÚ¢Ò­z«+`°¨ : vä¦"–åˆ:WÍL@ë.تò`˜Ûpþ…ص ƒ¨ ÉIàßp³U×V<ÂY9Aî{^LÐkáæ¸«gëóíÈ ÌŒh‚¯„õ6EȈê^,Ä1»áý#PäsŠ6^´v(r³·£sÍâ{Þ“‡øœ÷ݵNJ¯‚ºÒÌT †?\¡CÐCcÙæ<‹…#¡ç"ÆÝ\If‰ZÙªÏà™¶jYˆÊ ^‚ˆÄÔÎ. câ‚#/„Z8eR< †DtßW!lÐáQ¶MãP¯¦¯’k¥ªÔ3ùÛžN³eÕGDמèÁÜg#èVBÞCÑú˜ÈC¢Ó!&­Ê¢nÔ ”œ³îJ5 Žâ‘Õ1Ž¢W4‡C ËNG+ã-ç,‰(攀Èc·3…ãÕhB5sºõRÍäÐÛõ9ƒBYá" ‡ïI"‡Ew§ß•Rüæn:–¯>´EÛ•3ÓdÔûvZìe䈰'h+Â6anîÇYÄáëŃ0(û̈?È©.OІ²ÍŒ4Îk]=«Ô“Û¸”QŸŸ´©f8 0¨÷$ ‚‰ƒZª%* Œ‡€±Gp8±½Á9¶Ä…‹ø‘hhƒq?(:€Yñ´©žN›.öËC†F¥“È¢™u‚ŽAb8ÑAç1½»:A"l±È$W[ œ,›Sã…Ê[LLxBTÍ%¿Ç¾Â©,áIà’œ‰Üµ=çË/œ 6—ƒsEºœ‹Õøz˃:Jyh¬ÑË4¶:~.[¸üÆâ |) ?À€uýTô’ç*©,†CU²×i׿®ÖœëüPbëF·ênú.SîU¦àÂJX ÂÙ°%À‘6ž•2Ê!x`3©y½êYé%ÇB_,3<¶èBB¿ç8sâ”äð”’å—þjJ«fÔDPžPÄ5’]œn0\䀈†Äq°³"რÆê%µg©qä#†UVNEç/cÍýG`2‰Ý,øÅ0ì‡ìC7'éE=7//Cl@S3BÎ÷X&ßo½úç…DäÒÅ38Äç"„,ÇPB—f“œ„=¨iÄ’ç"z2é æðÛqžÔstÎ#ˆ¦k'x2UhÔø8¾ÇSO AdªY¶`æêõ»Y;Ç©EÉ©ñË©C‡j›¨hتfz+§R2¦ Ì›xïǃ¬½Çt¹Ë€ È,×quÛpSUgÆÕ£QŸ‡Ïð3 NÏU#øN¹iõƒ]Ù÷p4ËæeœÜõ5÷+’Bût—B»’—BÆÎú=O6–Ó‹ëÆD^_Y^\ºgË'ÛeD«I§¹5»‡r)¡\ÎEÒ÷|4JžT¬Qíêån ÖÆVXnã>8ÙJgƒaÃÚÛW81,SfËÝ©ö.B¥'M~úó¨ {ë÷ýÉÜEˆÆ?™z%®O!ž•bÛœÑå’Eox¥œa8 q±Š“‚Í{Ã2‘i]Š˜ä±˜Î•žöŽÇ>›`ýŽÇëk–½wð>²ledï.íÍ>Øp¤5£~7§÷FP߃ù»æ‡¾¢S·Õ#I²§G³má|Ý”j:¾ÉØçÜô=·ÿ°÷9ßûœûß³÷9ßN„2²SVðÞçÜûž½Ïù´ÄÞçqº?CÅ(uîÏ3T-¨$2EX·ª%ZvG´$L\ºªf›µ—Ê)ïµT΃•ßÂú/CAœNÏ…ØbmŠ„½®<lúƒ9Å =ëÙ9k£œU}«¯èu­ë픆¢­E<ɘ),é‚Ò¹kàã* KŒQ¦z Ñ‘š­¥É?•­Á“ÁôDR mçv'¥q®“Å-QQyuBß‹¤…ªÐôñ nÀIi+ŠPÚÇ1šyjUI´¸ÏÕ-N¶L‡hém)•ï°u„oÆàÙ"ÊõIÚi)75­'éù!ªáÙÍxÖùò(Úˆp­‹ù€vWŠr}cuŒ„e9ÉQíÞ"êÕã.wÛÂèò¾Cìq­|q­õ³Ì6pî¦í½6l¸}çui^ß)ä87*çL¸áF ›.?N¨•zŽB’Ò¯”¨d·>!—ØR͸d9ŒèD–ó?–=æˆÂÿÛ‰¸Õ|ç¸2šÁœ¸íÞ†Â!GžˆºûÙ)X‚뒔̦40ų2˜&:}rÔŽƒÆµÎ¯34Œ0s‡ ÏIkZ/§kš¹q˜·@^ÂS½Ý²dù"û%q‚Ôh‘7ö%)‘2õpt±Â¹åŒÛ«n¡jç˜Z«3A²1ê(¦#ífõªwœ“^,^ã¡”Gym7§ÙÌgÖ1ý¿\ËHôHO"ۋй«Kæ«–g*}.·ù`ëWT‘N¶‚Ûë9ÓØ+¸íܸ2d¯à¶WpóÓ[Æ /•i©o¯àæ•{·½‚Û>’@‹ïUÅ|¶ÇýV«ê&†ÆV÷Á8õfî´nÖ«ª@Uµç\«Œ¨Liñ³W *÷ T%Â}V Â»ÀÊCçäûrâ({Ý,¾ìÔfÑVÜëfy¥Ý^7k¯›å·×Ïß7ͤ’ÌßßbÞ¢¶¡.lõ<éÕû6“ÑèñžÒ©—sð6RÎHWzÎûUá« ®AÔõl9¹Y¡n–‚óš¥ìâ”"_·s-T½Y+cbF»3¹à[5»nOãÙåà ¡°Ì+ pÒC$>‹%ü.Dz ¨ Ã1Ñ$*öÇXÅ®­ Ò)€Sè*#qøƒÓ%sY%?—·Ýv%([¾æñøØ…ë¢Lp(Ôoá\™° N,ÛvHDÀÓ%Dü¬(ׄÑî`1¢l™9·S¬Ÿ`c-ƒq€ó`¡Õ&ତçFlÌ!ÆxïV¨/ˆkôp,~¾“²]ÕÍPL¹Ö-ƒðrG¶Ã³ÍÜ!B¡IÎy}ò¢i“»[U’(ÈZ¼ÚÇwŽHŸ ÈbHÃ!ŽµË FHW¢TZ gp¼j–—² îOã;b7P;=JªJÙ¹Øgp™t5ë„zÌ‹–ã•ÔcŸÀÝ“6f…N(Êóµœ*{Tè—y<6ŽãŸŒ0±BÜI#ŒîˆfABuÒ˜j®NR1¹:™û[¼^SK4s EaGè‘Ãc‚ésãm%/ƒÓl§æßniæùV²4šè…®€XB«ð+Éæ˜3+º4Ê.n*%Ì&‘`Å2ªÇ¯ØÔö¨º›)ÚÃ5^Û_y®œP.Ø7h¤œÔkcçÏtŒgð{:øŒ óyÒ¾ªFjÒó £Re1 8p‚ñ:x[˜Qz\ x¢C­>0 P£ø«„<ƒ!¨àþŒ¢®)*§ïœ­Tp=jˆQÖÎ}\XOzWëó!x“„!È8® áò‰ÇB&¤ªq/Ý^!ö•@¹Œà̬'d¦ m ne©©QvsÚÃÕ)aTÛX³®›Ùª)á„Ü}Ç8(ÉS›e •¾¸Ý®µv­µk­hK1Tµõ2]b\­ÞbPA¹Ái$(»÷%gï1 =•K¢pVŠw%k2qmÎF§Mc#xs†ÇJbh-Osàû”ÿ6ÉÁñ,íTx¥²ôÏ€7-Å#‹ÍáóðYgbøl×›­…¸çÒ ë[Õxç<öö&4P«ªÊ/r ¿Âæ¡å îÿ¿÷[ÙoÓé ã¯ßH9W鄟¼dá}tùöd}Tý2nÕùéT=”Ü?Vå$lG·º®‹úvÕÙÎf’ÒMÑÌÝt67F†@EUº»Ù…ÀÚ¢/# |O Ÿéà34ºÐåóÕ¾¹)vk¶E®?y¿;fÝXáGôÌxÈukD¡uŒGY´gÆ£¬}„í™"¨îô»¶êœ£jáû:¨–èÀ:ÏŒBÇ6E9 `Ic¨] èÙ9L蔎éS¢Kéc¢: ZŒAøŒ‡£0ß¼¡Í¶-ëB.¼¾$RHZõ… ®8~:ü´¤ýé endstream endobj 5291 0 obj 4848 endobj 5295 0 obj [333 /XYZ 40.7999999 620.179999 0] endobj 5296 0 obj [333 /XYZ 40.7999999 620.179999 0] endobj 5294 0 obj << /Type /Page /Parent 2 0 R /Contents 5297 0 R /Resources 5299 0 R /Annots 5300 0 R /MediaBox [0 0 595 842] >> endobj 5299 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5300 0 obj [ ] endobj 5297 0 obj << /Length 5298 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀróÑ/ `í90<@A7›`/2ÙCþ~Zê–fÜÔWl~]MµÆ=xÆâ,ëÍbñí¿ü}ÿÏßöo¾ügÿuøùðeWŠªè¿öÇï7/?°ÍÁÙþ׺)¶=~í¿~Û=íŸvŸwŸ»Ÿv¦:u~tç)úûúëîm?ù®ÿäËß»ßþ··û?uÿûeÿ׿u?~Æ;þÁ·]ÓVÇ_þÝÿb¬±M÷Ÿ—¿ÿµûËïö¿v 4§qÿ¾ñ…k*ëgÁñtéjNß/»¢ÉŠ}Yø¦ÎÛÁYvèøï?v?w£]À8´Þ˜ºòu1yÔÚ‡­ªjßÖÕÞš64XÛ´¡ÌÜšÆë t„ÈÌ[š)|-E£¾-Ýi™u¸‰ë<4aeÑ™ æ™Y+;#ŽÄâ½,êVï—‘fãÝ”:‚Hïx$ïΕý"½ŸùËX3ªê¦ÐÁü"3smg܇c}VÑDöY= ß?îÞ~2Þ5GÅûøsÊI{÷?»—û7G1ííþñ§ýï‹Â}øÃþñ—ÝÇÇÎÅg­ÌyÖO§YÛCÙººì mxZŒ/NÀ´¦¦,ú)Mq¨jÓtà\€1öÔRŠ1˜¦>µøƒï¦´%léû4σøÑÅCß÷ò­N”%Ö[¾ì#l©ÆÓ˜~åö žoرê`O(*&!©Ïÿ4˜OXÄÚñ|Åx ˆùŠá$XŽ·^ñ¨B þ©Óš°¾€è>ŽúÚOãÁ0ˆÓ§ÈïlÁ£…ÐOGcÀKqd¥` Î9˜\p fÙ貤XÊÆÆXiI…àÛ±FX„{°´ d€ D0EÂtjoü4ÖM!ôX­àùĪ»1‡Œ%°Þ.Ü'~ŽTд`?`Lš9"†ÐÅÁ¨¡^uÑ~™îôtfK!5Œñ¢1¢KtqÑÝtÜ÷¢û>%Z™ÍP¿ ‘(Ue/Hüâ–Áà*:•„ÂZ£Â:$7,æУĭ1b¼vkgv!Fp„‡\np‚@„+Rpó®G°9”¾ú.N¬ÜÔbÍxT©mª³Ûƒq%ª4€~¥eØß+-ŽækØÒÂÑ~eÔš°:Bœy,ìon(SëÁfÞ{b4÷›÷®1 7áÑœýwÄß^#~[õÄß^À¼lHÑ]±*Ç-ÅYWÕå¸OKô©`Ÿõq½@2]SUVö…óí0ÃéÇÁÚøy«ˆ7˜¶àEKO¦8ô “ú°Ï§tìàÑ0ìÐÇêQ‹0E° ëØæÁ}ðžV×B3˜kîdàMê#@G{ÙÓ€3íXà]„8°‹×†y C »#5 ó¹°ž*ËCïL’[ \)Ä–h¸!x Î3ÄÊ–÷ì­Ï è…赸kàô'µƒÂ9,øà*!<ŸBqOç/ ‡z ^sô´>å‚ÈÖŠßOÈ `NlÚb$]Û³Ì yny—õ1Lü(*wžc.˜‘#5)Ñ*áTÒ¡…¸8%HLóÄtIÙÞ˜‘p²R ÊäãÅ≙ð[ü|x†Ð 3Y`ßPÖ0é´LRØû˜hÜËkz\%š8=‡ç•ªQဟ·3L¥’¿€Wœ ¼3éÍT‰ØŒš9é„AÆÚXœàì|eùyÃ,çÖÛ‘êÁ{˜"u2•07Tî”`Öf$qcéª\P_ƉYÍÉìf2 –M¡Ä}T">!á-jqd¿´µ±Rà$bÌkll<ƒœ2³sg—~–W>Ç[±#‰r?Jy’—tIuáÜO„’K‹¸’‡Ì H‚I¸×5çêa0o€«=ôÅŒ[BÍ®Bã38'wø™!qfâ ±„á88¼³ÎGAx$ÜN¾¡~9–‚é—[yÆw©Ø¨×º©ðËtaFi+ÍPÃÍ2 aM‹ø ãZ›AogpR«óå¬ÜÞŽŽlÄü•À¾‹X :viœga> Y>ÜÍ0þäD,®Á¬“3e8à>Óͬ8ehZ/èmNùl¿Óf… àj\p¢Á\7OP=·¾™®\‘$áBäŒNÂIeÑcú$¬´¸ë«“+°^9Ãh Ê¢\öŒ1…W4UcÇŠ&±¿«Õ,qœ;NÇ`‚:¹_1‹®C_sµb;hÕ28«Ï>òSPòÚSƒð`ÍÒòñìV6&Š ·TM”kBBÏòºÇõ¹qÝ mÆè!Ò×9à†Éæ³1»O¿0:‡c¥°<ºKa§áRÀ”,ø·bá2#÷1ºB/4ÓA 7ºóm’ÂŒîÍà–GÚ¢šižCNb "˜˜JE ‚9~¸‰…-v¸fèº ®ÀôåQâ_¥Pn_¨VNPŒ(-©Cêf¤D¤ŸÊÉ- ö#ÁS˜ÁµÞ#ì餩kØJ!$ {2Ç1™ž¿™`½¥¡[Un^MNzÊúé‹ãPª0¹¨)'&ªñQ¡‚c©%ªãUJ\Õ|¿†k-`%¡¦ ®h‹;Q忈ê!ÙêÝÀª6¸È—°R\ATÃ5\ˆ[˜ŠœÛ\njCzŠÏázBpu¸UÙWAR-<¨wo!¾'¾¨¢{âÔ‚à±—¢†¸ÐQвK¨`…å*A=K›(Á†ËDb¼ ”¥„ÚšŒ4æýGc¸ +Ö©B%3¼R¬ià<lyö¾9×Ûc¬¦¡% ¤ea¢»ÊØw@9$h>BB ö S)S⯔°â\ãÑ ƒ‹ß |逑"U1ò’ÂÜAúêÒ¶]q ”òÔL­F<Q“±w…yðhØ«cìwÆç½}Uaç°fŒdðºñ£MóσítH}^W1Oí¨Ú¡Ì.àçy°5äñþ¾±2UaýŠ)„XàicIŒp‚œþÚ´„®¼uDä@˜ï)æmUìPqVÌs¸Ö‡Äh]36£ÇZµñ3a7‹GÙâQ–­¤ÚÄW§ë gÃXŽáyÖ¬¹1õa¹Œ5>Æ£O \‹-¸œTnÏ1Ü!gÖêRÔü•yúº~æaA««ž•3+µ6,ðËcÌÓ¹ªežÁ]‡5T_¼ftØ«£râÅB*2Jéæù¡ã»Œpg}L./yÛ,ûs%Èk-x=÷)—qËŠcBŒËhâÉy ×D\fó&VáM`½SƒY¥*·ŽÈ¶ÂÒ!—žb4X6n‚+õ׸‘k‹O0J¼Rê3òпw3èŸâì c{ç¾`íÈÜR½ÕïÑ -Döc ù¨±—ÞÓ¸–8 vs-”ªøæ–ªLÄ“ÊÄÑõsTyŽÊÄgîC061ƒ&nGDsùm¢uØ\•ïýfs­ÚæºOß&«eÕÌ9ñÝ,«Í²z–•îV&÷†ÂsßVõ^W6[ß¡Æó`Š[;š¸iq¿VR[ÌÒw™çq¿'a­¹E¾B[ÖQ,Üþü@ RB¦Pò›ñðš'ä·°|»ËUBSYl—v‰n|bí™ m='“!—/»2‹Þ4Æ›î]šµÓr;'›cËäѶ_t3M¶Œ9.c.£YuÛ—™·»ðÚØajŒ0ü¬+k˜,AF6­ÁU¿^½1ùaº‘Œ%BÝ eæÉäÁñ9œ™¡z{2WÍA·­Cë¹ì9(™ü®ÛËhl?ݾ²¨rìŸwl²åy7µ£üœ‡kË9§øÛ™(iCq”h µû]uî³ú5Çë)Ÿ°¦„"Ưë]­úþ'‘™DUöÅþQÕáöt­¤U[pºñ´ÆËÆ–/Ui•ÉÝad»Ô­ØÈįx[õÖš¿Ín‘n¾çæ{Ê-›ïáZS´‹ðææ{Jšaó=¡e;§–µî©ûíw‹ªew—QùÍ_]ƒ¿z§¢êãÞg¼g%ÒÛÏ©9OYw)íÿaÍÙwûJBeª9«Ū¾‚+D–°f`îïàÈó.óòŽÈ¼ÉÐ¥)S½y¢|@D>˜¸e11žL™xÔ ù›çèaï—y›¢xÝ»*Œ¬R­‘í>,kæÕD*ÞOðO™éEÇU¼²V™&÷mÇòUÖ¡[Þ±#ŧ··²˜›yDöª²7³ ÏܹïRl'{ÛÉ^¤e;Ù‹q­Í ¾ìm'{ ѲÏ!}ŸU?¶³+ ê'×r£Ž˜J LDo;”°ÃÜ©ÜîG®ÂŽXyŽª­æÜNÉXª²Í,»†ˆà2oRF«­¤ñ£êéæöF­H!™ª R:9Sb0‡Y±ßj'm±¬ôÆÄV5p&÷½¢\ç߸^ë}jþœç«Î徯°¯þ¨ç«Ý÷þ©#ÚŽ 0üøúM âü‹gòÿ,2€Ø5Ê9Mµ7Ý2®0ŽkMuhޫܻKJÑ@†Uu¨šë¤ë=fádëCÝ[¾léÑY_iéOç¶=Í4&ݲƒ0(ëCÑ7MÀ’ÅP‡)PØ9LÓ)Ó¦ÄÒ‡+ ZŒAØGà(Ì7*´Ù4Eu0µiêï‰TI°eð1}¡¨+öŸwÿá“> endobj 5307 0 obj << /Type /Annot /Subtype /Link /Rect [258.719999 447.379999 317.279999 455.059999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com) >> >> endobj 5308 0 obj << /Type /Annot /Subtype /Link /Rect [96.4799999 413.779999 115.679999 421.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://java.sun.com/docs/books/jni) >> >> endobj 5301 0 obj << /Type /Page /Parent 2 0 R /Contents 5309 0 R /Resources 5311 0 R /Annots 5312 0 R /MediaBox [0 0 595 842] >> endobj 5311 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5312 0 obj [ 5306 0 R 5307 0 R 5308 0 R ] endobj 5309 0 obj << /Length 5310 0 R /Filter /FlateDecode >> stream xœí]Mä8r½×¯Èó“#~H¢Ã@LðÁ@cðaáƒÑëñbQ½p{þû–Ä "3$‘ )•U9ÌP•ƒ/‚| CÔ¯ÿòû^þû—_?ýþ?—ïðÿO¿¿Tת©ì?—áß_ð¤¹*i‹­©¯²þ¹|ÿñòóòóåëË×þ¿?_D3>ÿët"l…ÿøþ÷—_­ðû—ß?ý[_ú¿‹¼ükõ·ËŸÿ£ÿß_ ¾á†/¦k†Â«-)¤é/piøñ¯/ÿþ§Ëßû&˜±Þ῿誮ÚZnjÇOÿ¨ÿÅRªK]5J닲ogÝ«ãÿëå¾6ߌk§…hÝV«kme_m­T}éÚæ"´NkMÀ­¬kcEMk*–ŠÆ‰ØD¥Û…º®¦ÈòIfÀÞµƒ+ÝwDL]‰¾Ï¶F“e,¦^—V5CŸ‡âнû~dB¹nì-¯áî¡ïÿ„ŠVÖºë%å©PÓ¤¦ï¢Vj_–Ú‰Š/ú»^ѱäMp½,TýPf†ëµùÖi¼N0ÒÿFÉ}5½~@±“}¢m›P6pËk¸{£ŽûŽÚÖý@h=B²‚&åzh€¿›©„*‹¬8ƒ@™Bjeaµo*Ì0Z¬Pë”]¥CYx¸áþxMeœam£•5)÷sãÝ¢úm™oÐç(Sx­,¬ÿ-xe'à å±N¥¥e…äJÃW5ξ¶ND£¬I¹¶}ÌÝÏ×é6Ôo˼xƒ>@™ÂëhC²Ø×òSÛxªBìàÊny w3²1Æ íýZ/hR6Æ‘¥-r"µ‚På–Ÿ9q5:R¦ZYXíÛIÊb…2"Wn¸Ÿƒ”­am£•5)÷sãÝ¢ú Yñ}:R¦ðZYXÿÛIÊâ…2"WVH®4)SxmHûŽô3ô ªNVž\ÙÀ-¯áîí¤l¤tN«‘Ê»äÓ²] ¸»Y‘‚ TùHʬ8ƒ”)¤ «};IY¬P–•'Wn¸Ÿ”Á°c€q”5-K툒Á´ ^§[T¿%e^¼AŸ@Ê^…õ¿¤,^(ËÊ“‚++$W¼ªqöëtƒh5-K툒Á¾ ^¯ÛP¿%e^¼AŸ@Ê^O’ž–Ÿ´ñTU{—Í— Üòîf åÚ†ˆ†ë1 cMË.ÂEN¤VªÜò3'ΠFGÊR+ «}3IV(×ÞSóeáá†û9HÙÖÖi1ZYÓ²/0˜6Å ºEõA³â út¤Láµ²°þ7“à…rí=5_VH®4ÂEF¤ U>’2+ΠF e ©AQ#Pûv’‚° ”ƒ§æÊÂà ÷32v¬0޲¦å^`0m‚×éÕoI™oÐ'2…× ðƒ}˜dðXm@2xpN®4b°/SÝ’j¼§æË É•†ï@‚Ö¾¶N·Á¥dTáû¦xnCý@Ьxƒ>)SxQøˆÁ¾–Ÿ:ï´6•wÙ|ÙÀ-¯ánR:(uÛ\&.û9‘Bl>Tnù™gP£#e )ŠÚ·“„MƲ­Ó’‚+ 7ÜÏAÊÖ°¶N·ñ2Èš”CxÁ´)^¿¡g¦²xñ}:R¦ð¢ðƒ}˜ºà±Ú:-)¸²Br¥áÁ;Ÿµ¯­Ómp)•CxÁ¾)^§ÛP?4+Þ OGÊ^>b°¯å'éÖšcW6pËk¸{;)‹jpÿ­Ô¡ì#%É…‹2¸2#\' WoišnÐ&p3·Cá#Ðÿv¶‚ø‰-«à²¹²ð€Ãý ìì,2'J–öãÌÊ›^ xƒÍo!wšF"»ó"GÊõ„N#Ç10›[²r«ƒ±,‚gè/Œ»ë=ÁAè!‡z(‡øN|áC"‚ç…Î)fØ—@õÛ2/b¤SOè4fú·Î+¢5ˆ÷À…¡¿8z†…ÐQRµ ò¢‹a0÷-ä~¯ÓÄò˜‘#åzB§‘ãƒÍ¢\¼Ç^ˆàú ……KÄ\5ÞæP+Ê&O.B<„Áæ·;M#pÁŒ)×:ÇÀl„¦ƒŸÜÕÈ3tÆÝõŠž` tò¯ûrH//BHDò¼ :Á Âpý@‘N¡Ó˜}h â=pQ#‡Ð]ˆ=ÃAè%d;°V^tâ! æ¾\ú­OÉãFŽ”ëF.p ŒÁæŽÉ4r’m­Žfjä*:áÒ0!W·¹­Õ³Q^tâ! 6¿Ük‰pì΋)×:\à²ùW–še8¡ùç̃¿½üúEhe†©¿ýqöTkû¿o?^ÚúòËpRsm.ßþrù§ªúŸ/ßþöÒ]ëNµµ={_*EýR ò™ßÈ_¾üò‘úEvä/ŸÈ_èV“ψ†ü…l­Q) ž!­ ¬~ûÖ÷×Ý{_ÛÝû lR‘ú•¤µf䘂V“ÏÐm›3ô3tÿ'ôÈ Ÿ™i[RE¶@ѵі£‘¶ãŒ|†æ ¥]sðsöÄ™K÷ò~øVÑ¿ŒEàg¤{7±Àr¼ŒôŒ§Ízc¡$äPOFêE Ìæ 6ZÆçš™J|”SÄÐúîso—þ¥$#’Ö|I>âcòÝ‘Æ&ÿrß 2ûÍÕtÕÔ‡ˆµ¨]-á—¤n>.0ëŽ3O'êhæI,©õˆe~GœYNÐpýp™œ ¨´k$€lZ2&JÖ19]1×Ü>8XñúWŸ ×ÂLó\òŽ^Ù'µÎèèÞ‹äœ(¹šL,gÌl™Zi'¦¡æúfnM›Ð>Ý’Ýg%%Úˆ f< Ú%ýœï^Îôxúº6ºÕ%ëà‚HÛ]ñÄ£HU$a ¢0IÒh’x"›¦í—WkÆÂ¥RAèh&ôWðZ$³e_¨$9óLÒ²_./hk-úŽÃxm«£i+u“3Çòg¦‡,oÖ°F˜WDýYÈ5#òÀ:×çld¸¹ù|µÏÌžx3Žf´Øßž1yâÁ¶ÎÔ~8cÁ_.òÛ7Œ¼Œ(F:)Ñc¥$,IOœœñÉ™ør2Œ·8ë'ûÅ¡¸cÇ—JG=f‰W€^È››ë8¶ué‘–tÚóÅ^ŽÊª`Ù)XÀlj4=é–¬0â™%5(G»M0GÈR7µ@ãçÙÓJ~sðL'Ox­$4´;ß7µŠø~ç…$½ “±l+Úa!µ «®DätÅ»0é³ ~f”O]3FÙg¦98– ¯QÝêäVºŽçg©ÉJ’À„KîO|Át&]²ðëצÞ>6vlf]Çͤ÷iˆ @ÞtXˈ–=Ð "g’ݰ'œúŠI,nCCΓ£[0û3ÇËiO(£SÐóïè3Çy›±6Gx‚’»ò©aƺ,«[ºz¶—.—&öÎ'@©Õ¾ é×ïgìêÍÃë0+†ÅãDÊÂHëÔÃßF*H àÇû¾ttô¬pÆå/Kcß̆K,¾Œ4x·nf2„é5',À²¢oÍØ®ÍX-r䩳ŒÁ´iIã3‚š4ŠŒ¼§Ï‹Êbôg‘&¬ÜïAåà,xsiËÂyE²q‰±?^«À“+Cï .Æf$ýNÚú½‹£$i©É2ÁîúΈg“d[s9 “1ƒrDŸšðx_+ð|R^<*%ªˉ!+gŽÎjÚå•"?þ±w3§Ûå ìg|éd}ºÇ®[{{¾T·Q½wÓ®™Sº×ëBû¦˜mI‡Ë Mp2Ù>‘@ž±ÉÑ’·êlxƒ:#$¹÷{àÙïo>B€nÇÉÄTu4™¼ ·fKw.YfD^2ÝËï.ì’IÍ·Ëg.ù»i·ƒµwç7?Ä£dP‹ŽÿêhÍ¡[ºè8çÝýýÅÚ3wOR1°E{íŒíb¡U(Pºªè^8,wÃéñ •¸G‰Î ˜i]¿`;Út~ÕÜö rÚ<:¨dR¿÷;G9 ª4>EAvPÎñ†c6r胘ÉÛäÂ$¯8ÿë Ã™x^ž_?fÜïõÉ 3ÎËþÏ>û"Û׸{ÎÆDANwFâeÆ)öÇöÙuË º”$x.ÓaƼJîªdègÜY¼ú—i±Þ’gÒw*3²}3hð^>çÎ-ïšØÝ¤?7!©_f>&SòÉJòsP3ÔQ{ó±iU¤©‚ mÉÌ9g£$ ÀêÇgìd/ïºëŠôN·«œspJÆô[°0Û÷¤VÊ#9`y,݇Šüׂs¢ŠÞ/éfÉ]›!Ý瘒sËJv• Ü<–³ƒŽ=1uÊ5úð mb2Úì_V S‘q*H­¢qšóŠÛï°hÓ!©ÞLiÌêG€~ª Ÿ戲wIú ¼(©ñ^_~Ÿ!º}rhÂTõКk­Æ!1׋ט£OÖ¼ì+ЙŒiÑÙK»&ÈÎdw%ñÑéÌ/ݤÚã}™ãMŒg‘4MoC¼—å,ê,µgõïyúI'âyí!·KXV.yjŸw5JZ’‘¡ò˜KŒ’uÃrvá›X§úGGÂû΋9`©®'’Þ˘€ :|ÉfIŸÒšÌ|@Më,ïhw¡Udx^°+v;3rÚY殿É{ÐI/$ËȹÊHÈäÙ£ÞX¥5À2rÄWœ«]rdã–8aù2w ti“Ìrd¢Èr>3KòÇáo/¼ä˜òE†“_r°Oäí½Áž£9[ˆè5•¸GDohBÔÇ–2KjÆ.¯å|¢% >,NõËļ³7’víÅ6'QÞâX^‡e9´>#Wñ |ŒŒ3ö0ô=cYê"ZÙy[œ9#!ã jŸ>'ß?¾UÿvÛC¡fSÓÓP[»y ®›«é§¬¦þ× aì_Í¥i®Ö…¨Ü_¾¿4õUˆN#ü]zR‹Æ2úûáZ]â§U"C ÏD-éïê&µtS}ùø§ÝÞűýÛ,“f‰OQ^‡Ž°f+€öUKÂx£Û"ÌÑ’õFxoáÀU4þÖÃx‰÷5³,K H“±›ºü’ÇÌÉ/¦Åg%ŽËòzþÜôúƯˆä%ÓòñÎÚ­ÇüÄ"ׯùÓÏX•DXèO,qĉ2ú¼ÈÛã˜qX"÷ô!O¼//¯Hf¡é–Ô½üDlz‚É!™i書âî÷úY©â±ÏZ*]ïˆÿ@ËO`â÷x·¹ñšºñ¾åÆwMìb÷IÜøá.=©EcÞïä-7¾‰ ‘ºñÃ]ݤ–n*ã7¾s)oÅß%„óôXߡǺ÷„½œVò†&o¼†öf86Uh÷6õëé>¼á3J'?J¸6IÏlƒe¼ëG…’¯Jõ‘¹-ß1~'kÏß5còËß ˜ùSIŽÝbV'ûn׎3ýuÃ!Ù¡‰ùèµÀÌ!)­%>gÁwhO³tÜsKÖñò cuú)¾5YòÅëיʒÑמ¬=“mºÂ]ßö›Æô€£;äÒpÚõ0µÑ´B,oPæ,aJÎÄ_ŸÉ²á½¡»d0 -#-›¶œ“3´pl ËÉfò‡{ää Mˆ´Æ˜Ê¶w–û–µ´²/«°rŸ‘N’³²XŸ5³ÅXrôÉ._¹8ê;b­¨—…ó|\6íëcEÛùœV¼hW’#¹>sy‘˜‘~ÍûåõŒ<Ò‚/˜õFê–s;öùêÀ>‡9q¾®¿êD¨3ÜŽyÝûˆxžŒè¾D?2YM­•–È[q˜zr*`I‡È5[ÎϾ×éet9³ñZðËNÇÖ<Ò<ä Í¢¹þ|§\òÀœ‘³ìvÅ §^¬ÞõË`*žL¶|áàoØí •dÛnø$Ý¥´ßÊ´1Ëvaqò6„Ç–Q`ùÜËŠåCÉþiÂÕ ç‡Ï_Ã’&¸~³üÆËéX+æD–Õí.G¡”PÏ~ÿª·÷!Uëˆa¶¸õ;9ªˆc›—÷ÔÆ|uú³ˆîæAˆö|eYùÏùÓ+ûO0¿¦~©Ü|ÒÖñ3òŸô3õ ¬ï„ºÚX/ú怫–Ñ/0 6W8u0é<·Zà<·~LÒE꫌] ¶r*¶¯µPæugûºoÇÜ@ð‰Ô”¢°¹¯ÖÔWÝH?Cëƒ~v†oY„´/Ý[èÈdï'õVÒ‚½‘}nÁŒMi+Tä3_¨öu!©õòÊáùùú©û˜ü½¦’’=eïòä·€ÛéÃë#!ç‰æ|¶ÈÑo?ä¯&÷$wÝFì~ÿoΰzØÄV•mÔÔž·vHÐô3Ò½l/â=úç—Ä=øV&GüšÛ3»±ûòeoUJÙFºTÄØ@ ŠÄŽšyxm¨Æ,iCKÒïPäÄyruÐ[£6TXé䟳xäÃí—õÔDÌçæìÓí @ôâÈîut¡|$/"zÆ^Šmí V ny{o_nTénqTåÄÈ—¶\@Ô´gá‰cTzæ¨Íý¾áôèH®¿wb¹ÏÒoN$+Áõkþ-ÁÿÇâ]-³äQœòN|–Óé¤;è«°ÝÜB{3\›S!qãMù˜Àòk-ït@`…Z,":ˆõžÝàT¼¨å¢Ö·GãÆôHfÜÁÅèFq[äž¡!Ý©Å1ww÷lWß…Œ~ðâYÀ#y³,P ŸÇôˆSé[e®Z&¨ýì§fÛZ6‹Ê¦Ò« Ðм =SÃݬ»âÖÝ•8ÚóD¹w—‘²ÃÏÔAýÈjVD¬ÏÔpè¡Må¢9³<4â4ñé÷nì{0X#<Öõ©·TRà”ÚKSÚ¹‘¸q§_sÍ8„ö7ç‰ðî À»ŒÅZ³ÊC¯^ð> endobj 5322 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5323 0 obj [ ] endobj 5320 0 obj << /Length 5321 0 R /Filter /FlateDecode >> stream xœí]I¯ä6’¾¿_‘çœmÀ ×6À(¸€94úÐp{ÐðkLuúï2Eeæ#õq )é9mÀ%—R$#Œ=‚?þÇÏ>ýõŸ§?þü§_ÌŸ~iÎM×Ìÿœ.ÿþðør8+9?öC{–ãåŸÓ/¯/ßOß_¾¾|þûýEt×ÍÓËeŠyÀþò÷—çÉ_æ¿ùùãMOÿ:ÉÓNÿ÷·Óÿ4ýñ3Þå¯/ÃØ]~›„r˜þçñéòò_þûßNŸ–0\ǽü÷ÝtròÖñýö©¸þûø)š¬9µM?\+äôŸvBÇ?þçå×i´Û2Îm#&púAÃçÇ™&ÌO3ôÝ0ácy¾@­´þ§í̯~{øâ‚›_f½lõ8MŸßÎ<œô°Ì«Çn™èñq˜gÌÓÛùò 5ÓÜÆ¾<±ÃxÇâëü?ëpÞæ}ÄzæÄ§Ä„WóØ_æýôÇíy0?ùíþëL ·òt99óœBݦy|¼ž¬å—¬@γ܇¾<ñxÇßëü¼£™éÛ9`ŠaâŒNó|S޾?‹°÷ßgB;4ƒÙÏë3„×™¯¸¾ý–TƒÕûè×Gf@ïˆ|Ÿ×!53=¢=V9ÊaÕ<÷3Cúþ¬æ•´Hó¶^‡4Çæ2ÓããÛ·ß2ƒº`õ6úõ‘Ð;"_ççuHo,B²lë•MœÇð¤+'Ÿy…yæ÷¿Ý~™Ïtu·ð@ÝËe’ÇÇN~8?ñÁ7OrùÊ}¡»aÎ0Üuøæy°œÍƒfçÇëˆ3_0bòö[N;oâuÄ´ë<^`þ6ÚPlÞŸy.'”7.»å<Ϻ³Ï åühÔY©oê>¥X œX˼—×Í ¹ÌóøØé…ëåï¥ å‚ÍÛà3£å„ò†BÃZס\8\ßËQ‹‰ß꾉¶¦¡Ûfhdw§³ÞöŽõãaq#‰ìÉ4¼ ’™htw¡Þ—‘²Ñ%†‘i iE^ áARX¼øõô8CÞ.ãßßü÷òÄ–=±ü þ’ †XŒñºIÊS6òÓ _sîz±† *Z y %ËEã¹uÖ.à›ÏðMyö;Ùëo!HÙ¹/öaq$~+=-žÊ<ƒ8`•²žo°1@ámxlˆ‹S“{û<`ÎçpöxÅ‹(úrˆÆ/a0¼VÁ9Ç4…mÛPÈ.Z­LaùxïYDL%F…·-~øÂ";ò, Nضݘsxéý/Tg„xßµo]º~SViéûÑùT@°:óz#àh¢ƒozø†Íñ dжt4=n¸dîBÃêM‚ðt¹¢í¤JaضÇËÃq2˜!æ< 2Ó•ÕAÿ]‚IÙj^€^„Ù}ùQ7›nôfT£…³£ñ)±¸û!XÆÖÞ%ÏÂ!Ópµ“x="‚Y9ÊÍVÄL?B.K#ñâx'4É”fq*%¬‘ÅovO/F’æ=Bq‡Yø@¦÷á£öØÇjÑxA6ßvŽCP5<º!¯ŸÁA*Þ«>C™sÍ‚¹å—ÇE€çè–I!“ŒEMâðeí@+ßÜ»Åa²è9®iY™\_$ÁElwG¥EÈ*(OÆÞ–'k!ÉhÇ_€ùPÆÙæ&°,DzY8nP×.—öœmÇŸCÑ®œ¨ äøÃ“Ãí1p 2A5!è°~©?sѽÏíÞΤߎfV…½îàèî zÐ×ÞÀy$|ƒ½ûØ¥ç<ˆV¤­;ê0|„o$amÐ!¨à G­ Æ Yê9<Ñ^¬×òš} Hb $1’Ò“±K«# ¦ ,ºî-õ$1u,Â=Ì 2u,ŠHªÔú꧹ᅇWùbU¨ OH£l Pp@Ô¼ªv­ãUMÁàñœSÌCài4.Ž„áÁü eUµñžRè˼ü ÁT¥¨³zÜSáúTI¡–Òa'¬ õf5%ÕUø°‹œ°¤p|H}AJ¸§€—±À–ØJsgIY­Uƒ‡³æ1)Sl´­£ç5m$Ù[Å೑°®OÒä°®áyoö ;„µaýÓãÌ|Z;°:)Ö†ÇNÄî{¨ÑÿެÛJ¸V{¶¢«QbÈÇPGV2LåÏ7Ï7Ï7»óôØ==vûmγƒ@·ÒÝÛíåéˆQÆAQØmu¤LÇý8¸âs[Ýd×O£ãt|gÔ2Ž5B§“šŽ'5Žo÷{9BÖäaöÐ<P¨´P@h¼6ì‚ìYS…Í-܉±ƒÍI,ˆ ðÒx°‰¯ê%°Ð‡Š‚$„ú=Švaê…kã¥v6w¤1CJp†xœ£”ldÌG±«•°6ÞÔOÖ3.àSBÈÑ­¶êF«Hd-† ÜÏ7{xã1 ß›ã•5àY5%T÷ pïÂ{£^ÖÔDϪ zŠNà‘m;ÞŠƒëw”úv¹9Ï"–Jµ$YÝD‹´ßÌ©¯Niï´m7q1íøÛÏ`¼%{†7Â^gÑ>É[7y×½ n‰*¸’6´ÆÒú#‡¥à8.j–ÆA¬mf*4]Ÿ›B>ìnî(œ{‚>†N®[€Fi½ÄIL”È©£m™ð GærJH"¾»`u޲uSß­ZËìæâ°ªø„hϤ½|±}µz¯³4át©ýõQïˆçvd!ð÷”Öà•ËãÂzš„ºSƳ8І¢UŠBjýþŽ6Â¥»[nÝÎ3%)2…Sò‡74w$_ûVPRt‹ûrܪ1îö‘ JSì çM‚X«t­”¯ þa\v^YÇækµ<œÄ¸~³ëõдê6å-±™ÿ¹ãV£7ÍrzŒFîšIßà˜@×Ê7&:"Ô¹·=F†¼ÎÚö%™3ßÕ•ܽ[[Áâg’£¶gi{— 9­ÌÓ°b íZÙû WsÏÏtv^"¨1vÍyíy>n1ØÅóžÐŸ¸{Žàþ6ÒÅKºž§ØÁóàoZ¸?;pÕ&Ÿ~…*=û¿Á´ƒ¿Q#:•‰÷Ò0û9k¥®0b1E³üeŒÔçÅ<¼WIÈèßà:y-VŠ 6ƒçÙdî­ÕO²®tßT‚w¾PîAÂZ·oGÇoÄŒõ®ö„=÷ ¿›ÛÎ qó - EEËe—LGÐÒ’±º­z{¦ð‚Z¦‰#tø™Âà5Üào“­¶Ñߤð,ÓùŒ²‚9´9œ7ÁãÌzMX%ãc?'¾L_áœ*·É)œ‰oRNÅÑ2ñM‰Çå-úΚ3e_Yè7–;h6OufÉúL`¬w„Û~oïK²¡R¶Šb{k.¬ü%˜JQWœyAHQÈ1vRp³ùVó¦¬Ó¹KA©Ò‹Þ–*µËrXÒ5d%›¥þ ’ X‡¥°KŠ«…b°;ødÎtËñívÈü çl"­§¼ß5:LXa¦ÔËP|™ )3²x\´žZp …ÖÖN< +žF¥e+<\&ƒwíYU(SU&ÃFN¸‚Âír,6ôØNˆûŠdCBšVȦD½ÿŽb®›»Gª_f•¯®–Ìfo”%TžFvµè8_ÚuHíSKÓFÓ8N‚kÙî …˜²ÚYÎÁܪØj‡ÑΛW ›AÒáæÏÄ­ý)<-(t(qïªáØ’Âdж4)Sߨl" šÕ{Ê&JÝÂÞ´ƒE©;1Úl• Íš¼XØMOñâ%xX¤Å~¯Ñ9Tøa[3´Ê:Ÿžž½ã=ccsÏZý¿¶î²s¤à™ ì%JZÁ-ÐâüågúË3ý…N÷%¥´ˆw{jªÖ?¡o7nÞ?¡éà7¸‚ñn¬Ô–ãÊîÏhJ•6o¿§O¥Â¿MÇN°ëÃÊ<÷»™lx”éàö·0·{ˆþ<Ê·Çj5ì½RAE>Øè:b*\S^»†«jÅ)çÎJà"ÔBˆ_„•©”¬°"Nß7{™Ž÷zFIVíèK? ×Ô=Šv•äãæ¹;#wK0œC”7”aĸ á(‰°„¨„ÀBBŸ4–„³ñ§ËÓij¯øö†ÇnÆ‘ÊEÚþ I±p1Gçhq™Òí<>µÁ=þ”ð!Þ¶PÿÀ¢ŽQe±ò„³ŸâiVÒˆ!’#r¶+wÒt¼jžã˘wXÁŠkEx1éêÌ~xIBGﬞZ”N]ûu =(ÌÝ1)Áx©Îys%ër¸×IuëxâdÃÊ>ÕöÛÐjŽ5ì£c&Ém榤‘mYÆFÙêÆ*Œ‰m#¡”,Ç€æ5FÓ¹ÇG(H°þª‡lÓÁÓcŒ…ÛfL‚Š‘¢·Æ;wÂ+"¤c¹³$4ÌLH`giyÏ!àË4  º9*X£¬—(£©T/úIhv“‘HÇÂÂ\2ÁºJ¸yг9kSíwšŠ¡^Æ€y¸V‚Á¢ ˜bDê!ÇV{º ^¥ç_ÈóL$D½xOw·´E GM!-«x•÷©Ž”®2/"o«U£ r?ÕhRÀop5š©iﻊëÓ$ŸRå©ç¢Ü@ ×¶ý §¼÷ójQIÕº%¯Õ\,»vÐëÔ³$í*¼ÏHI‰'bÃñºí&' Λk ’-çnExÿIfõÈÇ«/,÷ÉTw4ïò‚­F‹/“€Å†-!'',WÇGà)-J(ÊÀ¬G?§äöåTQ:ì@I”o²”€ DjŒéìzà••ású¶FÔ.ÇËQWOa‰4×î,‰÷1AÖÓï#-yqk×YRÄÖâÓ‡ƒ…xzôs(òÔˆ¼ô¢íŽ“Ê•±®ö±Òi€øÅç^Cn% ñÈ æpðqà‘nPŠzvCŠWP‹Ãa¼áÃß@JôÀC8 Xnâýi1 Þ0õ*¼§•x4–ŽUyš\²Í½,ufÕCHç„u4ŠŽŒá©¨qŒM×aðèìnƒ9Çö<Ÿh¬q@þ€e˜GKaÕ«IâÑPÎ –GKBÊ«ì„K:‡‹°qi¿‹kú6%.iÜÜoÅR\ÌR‹AI1…¹Ÿ)µ›,( Üà8w QÍÚÅ›”þ)¾ÉøpqJ䞦.Ä%3©+%íH,-iñÞó™²îpó‹²qº# ‹")9õ¹ú“Yk«¬ìÙ„°¢g„+%á%\aP¤Í¥‡q•HX`ж—é.¿yöÊ^û$mެ-©’’Û.-MÈ` H$'±+þ†n–f̵Üæ×n׺ÿ}íÍ_YärÂC¦TòñkDÈÞÚ YÉÆZmg¯³LÅH)wdúËaf%¯Ùë•E›7Ç,¤!(­í˜íAãNIÇ$ï_Ûê2_ÓÇѵ¶ÆQN©E¥4žN„ ]l«Öù”ìÖÜH[êon/&7ñyñ&˜Ðs ãZ¦÷áTã­M8à©Å›¤)¢+¡.*ÇY¾Uƒr>rNé‚FìÕ‹¿w/x†+˜Ü=ånu‚K“R¹š‚´·u*i­ŠÑFòÆf¾²wÝ`¥$J«ž4PDeª«”—¥ ©ô:]àTË’6}«‚slî^Æ2H8ñÆ/ßæmæÅ¡!ÕîZ!Y ¶ÔIèBKˆTÿ~´2Võú¸Ñ‚vtDú.£«½#¡Ý-±¡]¹‚¬¤/HتÊûd2%QØ;úU†;©Jh6°uЮv+ŒÂA­RÄŠ´(-Ë`ÇÞV¤Ô­{' ƒ-.ŸÖâ–9ípº|+øºÆ¥ð£V>fµÌ©,B\¹3‡µi}ugÿ|JEIsÄÃGº²$'žÈÒò‹³Å`u¹žq‰KËά›¬ê3(¼5|ãl¥‹_3Hœ$:Ê{ƒeIˆ))‡ãÊ㊤F9¨·„’ÖMˆ·›î3;6àÊbJ§Ï<›wVñô¥ÂݑݞvÓg+i¶¯²×”.jÂʳRáYÂÕÈeò@à *±W€³fãIžbdú÷ô}¢•‰.?0üòê!—êš;Õ}õÒ÷Óð…&Ýi2Ý×HV¢›/":©fé€hnPíºs·®ÏŒúì u>Ų?÷ë©mýÊ›yc•:Ëqõ¥¶=wó&Øgmž~3Âof¢ëåY6×*A[ ®6Ðãß|‚¿5´µáô9Dko‚Ã0š´oÌŽ¥ÀnÖv=Twy–­¸±ÉÎ×§ÓÀ;é@k{O1FMÃÔ¨ßâñ¾¨Æ_Bü`*”ç ïÃG–}†¦;‹Kúô[ðwøF<¸ù¾ròáÓ×—ÿ5fÈ endstream endobj 5321 0 obj 5755 endobj 5325 0 obj [336 /XYZ 40.7999999 300.500000 0] endobj 5326 0 obj [336 /XYZ 40.7999999 300.500000 0] endobj 5327 0 obj << /Type /Annot /Subtype /Link /Rect [99.3599999 82.5799999 156 90.2599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 5324 0 obj << /Type /Page /Parent 2 0 R /Contents 5328 0 R /Resources 5330 0 R /Annots 5331 0 R /MediaBox [0 0 595 842] >> endobj 5330 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5331 0 obj [ 5327 0 R ] endobj 5328 0 obj << /Length 5329 0 R /Filter /FlateDecode >> stream xœíKÏܸí>¿bÎ2±¶d (°yè¡@==Ù¦‹E¾EÓ=ôï×¶$Û# mK¢d{¢ÝÅFŽÇ¢H‘ERÔë?úçõß¿__¿ýôŸëýçÛO—êV5•úçÚÿûjþTÞUM!ëmû®_^.߯ß//»ÿ¿føPÿѽ4 T‡¿ùíòZ¿¨¿ùôö¯]ëWzýK÷ôëõïÿèþøY÷×ÿàå"Û¦o|S B •Ýüտüåò·?\ë† ‡~ûÿ¿â•¨«JFãûø)þ «®uÕ2Ñ\ ¡Ý8ëŽÿý×åk×Û8Œ[Ë  Õæ^º­ÅµíºnŸjÛz"±qFq:êGD¢0#‹=ÓK> I;ž‹¥—î*š^‚¤ìFDâP3”‡» &½dµB³­b»ŠëˆTEšÃ~D$5Cz¸«@Ò“ŠJ¡ÉX,ÅÆ®b;¢Eݨ‘8Ôé—º &=ÓÂÝi²H<Žšè:jPV 5"…™!<ØÓ­®Hg/ˆNAí9œÎ´¹¶]§½¡š„öGÓ/m¦ÍõO¾M¿î펯3 DК·°}Tö™fÖÖ¼­(>ý_C[aÁÂÅw¢ç‹nCø*XsúG³r¯z +ϸǴ£•afÕŒZ.Gùáí¤îÚRaRMLLù$©38¨xNd4B aª`ÍÉÏÄ WÓž˜Æ´ÆÒpÍï1„VM¬êSá¨`ݵ¥)~j]|ùLPç°pñèi„ÂWÁšÓ?š•ëa‰WÍ÷˜vÏUõ°¦¿FZI¹*ݵ鸪&&¦ ³à â9‘Ñ-„©‚5'{<+\u{Æ4¦Ý3“k~!´jbUŸ Gë®M§•0~j]| m… ߉žFh!|k½%™èÍÊ’‹ž¬'óØ´ã£Ù¨š±BÛmœ³êõíqQw*-P¦ˆ®Å,P¸èNÔÔ² ã«¡ÍéÏÍ _Ý®';Ù´ã“݈qï*Ð3#®ns ïnB¢}à ‘ÑëI¸ÇÅ{|duÝŽn1ƒ,æÀî8…O<€‹³ÆX¸Ïh: 7Œ³‚w7ñ,®±6õ$Üãƒb9>±8 惉9p1‡wÿÀù$yñÓýsCiáÀCÆ|FÜQ¸a̼» ‰gtÑȉÑE31•yP¼×È‘ÕU;Z¸)› S6f=L{`ÝFÅYc6,dŒg45 ã¬áÝÍ‹+¬Íƒh&^2Šå9±8æ½àèÉV½jd<ëa¶F˜î˜”6½~°Ñ²ñ„Á, þÆéÞ+3x Àgbá¡ÁðšpA©V¿]ÀÄb?ghÎÈsàRÙ¼µ üfvG.à1Âxè›&´RºÓ®X¼föZn,¤\²$µÇéȈ=a°ÐÀóòM”n}³¶Rp%V„ÜjÞôL s¨+cÂÒë!xN¯â¼ M°öM³4&1Sè{[}Ø\âìݙؘÕÍÈv‚ÛÄòX©6ð‘ÃÐŽ Ák(Œ„³¸9X¬®xÚRy’ K幓 É£xAÎà ›ËS0ú ÚWà&Ûª¹«ÃVhaó>ƒù¡7Ì5ÿ ñ|ó´X@× ¿©À,¸x`‡ì˜ pþ,Ѐã“g†ëz}†a—èX‚ñ^p9ÁT„)Âa0å,iàÚBvïÁ#€{ƒ%vW¸RaãÂ̘"»yAº±7åLðõyßPP6iÐ[Á#ârP6ô?ì²m3ÎcË"æqa5ÝíÈZ¤/¬/9>(Ÿø™v~Ú¶Àù©a€tƒ¹—ÁsšIGÃVENÖj ¾Ëµ^ç„ 9Aí-È®GÓâhšv‡…½Nˆ¶5Çþ:–hØâõ¼†-X)¨û‘²OÀ¶ ¢‹¥\×"hZz%Apz?qçHD‰¥ÀÝ—d‚˜d8ìÄ¿­IPøf=á»ñˆ¿À®úp(HqžÛ+ib!:âøßÐ[H”Ä! Œ–#mû ®HáâucëŒÀÈ‚2€=FäTÚÙ=+G†HÍ[{’Š™ÛŽL(„MË­ù%h»Ç5»OŒa?3¢©ïì1LöìÀ‹0IFj6ÛÂàOm3F˜ ©:ÛÑZX§À©J›‚áù¬Ûw,p'ÚÓöH_ì¶·ˆH …ÑßÙr@Y_0$^ýÝe$à\´ÕM™äÚJ{±ðHÿJ7ƒ9 S6ðºQ‰‚y„K-Ê[¬$íQ¢¬’'R›^¦7°·?Û´5y‰:+T·F»sÌx*bmNá7™vF úTZ®”Ãú-„Ïa•»šm ³Šk®Z.üOÒx„ruyÒýú½SñÓºLYSÛÊå‡ê˜qýãD5FÎÉ¡Ç9ŒE‚L‰Äñ†ÚfÊc O-™=ΤÞ&M½ä9 9Ɔëiô¶~S6„­…·LÐv vJävò{ùö£¥þñÇM ¿6ÖÄYO­-¬ ©uÁÅ 5ðyL…'¥½eÚ`ÐGäs-¨³õœX¬’ˆbÉÑ"hÉ‹+;vIø½Ði‹›Áa&-*xl‹‚jÅ8c%ÒêQì«ã‰Ë ™”.ô¿Iîᢕ°éáÄXÈm€¹ µ´»âdN²B¹GŸÒD \LhÀôâLí-¿Þm=úæÃ ‡¤Ál‰Q ž°›°¨Ë~q¿Ñ–j‡µMwøÍ·ˆ[på"ˆ“Á±Áœ ÷6vw¸äש~ÀöoCëô›@ÎGB%¹t÷È5¢‡3Î` ¨™ëø¸Rßl¸ÓMbÙ=ôÛ¯ÕtÃ5Ax9ñˆ²†”evíQ:S]ûí ë šÁã¾TÀ“”ôšÜÚÒÇO¢9CŽêá–çG½iñÀõ:Ò`q"^Ã=›²W1;,mFGêîW7{¤Ùø=ë{Ô¢¯Ím­ÅãL·å€|N 'ø„P×Ê3eØUÖr•N8—Ò{¨Äð-7†ÝèT…’¸rUÖŒÝKõÒQ±™4SÐòû°b7fT€Í[N÷ ‘'\ZØW°M ¢¤y àGßÀoÈÔ ¹õRð(Áì­²gSï’úŵks§›½.%ÝÈ ãð`•ÉÞ‚lïl¶¯p»¯<¹ö"f¤‹°G'§Ül“.’†rìsañG9…üCX­IK25–VÚÝ ] ‡‡ä­]´}Ò@Œ!޲ªìï\L“ ±w† Êä,sÚÉáSQ9Û© ÅLµ:•·ƒ Ðx-›ÃV•d•qÓ¤Vùˆ.î¡äçGX4MħØï KK±ßo¿'5pkK•=åá@^äb¿ŸÀ‘^ z%ë‘¡”»^õ©Jz¤¼+e% ƬÕ%›s^Æ0wÙ96Um»*e!§|‚в&eºÍ%¨&JbPL1¡Dжùíx¨K’íËRP^n’d˜ìŽŠƒßKÊÒFi ÁSúQ÷n?¯âÓ+lÕÁU¾B*º>Õ+þN“¾fÖ9{ÿü‚?…»?ÓÁ…lÎõ†Ñuê¬åGr»7Ôº¯åì«Ùîögq$ÿŽä’n6–î)ŽäI Grq$§U²¥vÉþÞ°õÛ$blçîAÈ‘™ò€´-Ìý©Ž²VÄÜœ°×ž~á€iHEáuãeÍÙžckÃÉ©/ß>W …÷¹‰Ká]¸ÊÍx3:ìy[/á,…ÕvÈ©vÿ+ rÛ¶;9Kâ6­ë6nÒËÑ£ø+Ò–Ó8ýÏþ §¥|’äŸÉ{¸ú3AVZˆùä‘’‚²ÑõñK¤‰ g Á§¼#§lèˆ~é ´¡O™FZkUÉâ38ÕŸrCŸc4nùçˆ;µu*ƃÏС܅Y9Εȑyw¼š ’rCĨ¥‡¼Sñ9Nz¸BõÅö~.Û»¤ç/ppöäÍýí,6EÊ0!çöJPÌ–S™-û'§ðq–CúàžÙê‰j ƒÂŠmß¶_UŒs€GÛÃêQ£÷ÌæŽƒþY©;.\L [¾ö¾eèÔaênŽ{à÷NïõÛß73°)p`ÏãŠðöô}NN¤ODìî#‘ä)“±·pcÉ¡~²ê”ùN ±×—bÚŸ*ßiŸ4íÛžfC&ÃqmýõøDI€* P% /†ToW%êpañ’4µ¥“çLš Š‚ƒ¤p}=p÷1–^|òBú¦ßUÅKãF šíkY<Š/ÁÍ/KæUÚ%¦d^¥A ³þiÊya ÚÉ•Öñ,Šç(wþ ÙzA–’JWRéJ*ݰ²n쵩dë•l½£dë¡”0Ȱ‡’Õª{—œ¼¸;\]Êý•^ÃfBx\›°$éý`IzGÖ%ƒnÿåºdÐafD¥Ü*b-3%I¯$éCü€†xŽM›îq¢œ¼§=6ƒ<€™vÏòMÔƒ÷ž©gÈDKîˆ.ib‘ÌD×ù>}m&®?Ü&ø)‚ñ —QÛKÄãýQUpæn)Œ˜×a».•Õ÷@7D?ùmÏÎq(2Ê›l«f«6¢“º˜ër§ÔßlR$$`ëÄZ3špžQŸb·£Uç¸^¨i&zš«išûÙê'‹W·×— mÄü/¾]>-¬(i–¢~÷”¯€´lÆèRI“-7¦n_'vÏþ=Yšì$hOa™—4ÙMr\ÒdKšlI“-i²+^†4ÙÙÚTrFJÎÈÎ9#9v=rtú•,”€«¤ˆ”‘}ËSTÄä’…ò¬KsÉÙ2±?|wɪ~ 9ånGÖŒrVmAH0ϪÄÔ)™­{f¶vÿ^¿wâÝIoÿýÇ—¯xÜ,Ô÷qQU,~ºªcds%üý-inÃt^YÅ šJÞ›æÖ<^#Z~üyTÜ„=IŠ-Ń7ŠÐŒÝhû°Œ`]ß5ö<‚#ÁoZð%ð‚Þh5˜BÓ›7`oŠ_æóü­R`ò† oô’ýè ðÐî÷ž1Üõ؈຾Mk"L¯5Oøógä£:·P”¾Ûþ["> endobj 5334 0 obj << /Type /Annot /Subtype /Link /Rect [99.3599999 744.019999 156 751.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 5335 0 obj << /Type /Annot /Subtype /Link /Rect [99.3599999 715.219999 535.199999 731.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 5336 0 obj << /Type /Annot /Subtype /Link /Rect [239.519999 620.179999 300 627.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 5337 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 193.939999 138.719999 201.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic >> endobj 5338 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 168.019999 544.799999 185.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings >> endobj 5339 0 obj << /Type /Annot /Subtype /Link /Rect [91.6800000 168.019999 219.360000 175.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps >> endobj 5340 0 obj << /Type /Annot /Subtype /Link /Rect [104.159999 496.339999 209.759999 504.019999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://mail-index.netbsd.org/tech-kern/2003/08/11/0001.html) >> >> endobj 5332 0 obj << /Type /Page /Parent 2 0 R /Contents 5341 0 R /Resources 5343 0 R /Annots 5344 0 R /MediaBox [0 0 595 842] >> endobj 5343 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5344 0 obj [ 5333 0 R 5334 0 R 5335 0 R 5336 0 R 5337 0 R 5338 0 R 5339 0 R 5340 0 R ] endobj 5341 0 obj << /Length 5342 0 R /Filter /FlateDecode >> stream xœí=K¯î(rûó+¾u¤þÚ`lŒtŸ‘²ˆtu[Êb”EÔ“žhtÏ(7³ÈßmÆà² Ø>ÇÓÒ\sü™¢UEQüú/ßÿóñ×<~ýôý¿«?}©žU[Éÿ=†ÿ~±ÿ@»gMå#ïš'Ãÿ¿¿¾ü|ü|ùöò­ÿÿŸ/¤?Tÿô/5Ùá?~ÿû˯ø‹üË÷OÿÖ?ý߃>þµoýíñçÿèÿù‹êoøÁëK'Úáá‡| ”ЮoØOÃËÿ~ù÷zü½B7ö;üÿ/¬ê8©Û¤qü4Ÿ’ñ?ûSXõhHÕ ú „öãlzrüï½üÑ÷f†ñl*Ò£Ã;>ÛzÊ?~©+Êzz¨ç¾Óž$mM­Ó¿úa}1Ðæ 2á´a¢>Ï!w=¥ `B{€ ÔüYAíôãhº ’ÕûðˆªEÌWÙ€°ÕÐfäO¢2c}?í îò±`b?7TþäÇôëD*÷=R¦aRÖi0³Ç yBDRB©g@pœè÷*Ÿ—qTlj§ IHÛi<Õs#%§²ž{‘1põïS±å­âçØ¥Äp„4{”0y‹ÀQUMU>„ŒèDÈWù¼Œ©‚d“=UziË´ðr3Aõã T-SÒ+ŸRg'§z²pjÄuö¨'Ž|ÂÃO©g00±3”S3s? Ç¢r²°J å#7³R?¤@ªß"LIÉıG‰ÚgöhfJ:],55ù *–†„j:.c)áXäNVÎŒ°N«%ŸËáýóËôÉØÛrz6öFFg=YÔ#’ N=ƒ‰¤! š“–’Eîdy•XÊÇi­äÓR©Aªß"ÌJÅͱK…ÜÉy63Ÿ.ª†¦| YCI59!\%$‹îs ‚ Cc¼Úíõs¼!¤&ÕC øõ}º>çŠíì*µ#ÖœŽ†‘4ÔHÅøzWѤoѤ•HETw•L±a BéhICM“î*šôœK «+–L1Ž#¬´â ‰‡| FjšôpWR)sY=wÚAŸLÿê‡õB|„±1f0öɘ 0¿1Æ ¦/Òƒ$3œ0»ÿñc‹¦:Lã¬àÍøjõýLVQ¥,¾fÖh¨úÕë °„ÈBÚÓؼA¨6ÕÔ3.ÎÂødsX¸[4}Õ geµØ|H2–š¶3XëF#£€ƒéb”YÀÍ7©˜ŠR1[õªh.áÍD ùsMi „j cn÷U7`Ì•¼Ù IÓ¥ReHIW ÉfAgÎn¾IÅœuÓ—½*d%¼yCκé|Ì5¥™󉸯ºc®€Û IÂ\ØÚMXÚƒQ1‰Œ„ 8–N¶R–†Sðæ É¥Ö0×”¶5»°U;æq_uÆ\›1$s¦L‘sÝ{m†(ÑÔàæÖ7‰˜×tšçªW‰¬‚7o)}gž/a®)mP dÌ-â¾êŒ¹„7cH æ í¦UM7¦XÏÔ ­¼ÃYÕ%à„NÀ…2L­%N7ˆ”>³ž/a®)-¤~FÅY«]XÈ[4ÕÆ:Œ³‚7ã‚É*±Ö Û6Ô Ê,àæ c]1[öªi>Âsr‡rúsCi „¶Üq1·ˆ«us-o6CLV%éªaÛ†¦ÑYÀÍ7ƺžàc¯ÙžÓ³núsCiæÂCÇ|"®6ÖaÌ5p›!&«Â\XÚC›Êb©,X:]ØJ]XNÂs’K­û˜JÛš]ت s‹¸ÚX‡1Wðf A0Y%æºaÛ†ºÁ'Ì­o0ŒuÅsÙ«BVÂs#¬oÐ17”¶@hËs‹¸ÚX‡1Wðf A0Y%æºaÛ†ºAZ x‡³ª5JÀGžË^²žÓy`}ƒŽ¹¡´páacnWë0æ ÞŒ!Ɇ+‘i깫Œ‘hRÙ ÓÆ:¯L|›p2…ñFÅŒ1-ŸqqæS4} c‹¦ÆX‡qV f6ÒMV…µnt•± Mƒ2 ¸ùÅX—ÌV½*šKxóFÅ&K:ÝK˜s+˜>‡‡Œ¹E\c¬Ã˜+y³’n²jIW®2¶áÔè,àæc]MpÙ«BV›7*6YÒS|snÓçð°1ŸˆkŒusÜfHºÉª1–öÐ&d7…x p,.l¥., §àÍ’K­/`έ`ú2æq±c.áÍ’n²*Ìu£«Œmh|ÂÜúÅX—‡‡Œ¹E\c¬Ã˜Kx3†¤›¬ sÝèLêûÔ ­¼ÃYÕ”U,y®z•È*xóFÅ&K:çK˜s+˜>‡‡Œ¹E\c¬Ã˜[Éæ(º]ê4:Å·¹Ñ5 ©ìd*¿ù%šY©Ð*©^ÌV64Êñ¡Î XíÂBÆØ¢©6Öaœ¼LV‰µnX\Ó Ìn¾Á0Ö³e¯šæ#<·1å¨ °{sCi „¶Üq1·ˆ«us-o6CLV%éªar§Fg7ß`ëz‚½jdGxncÊQÁ˜â>æ†ÒÌ…‡ŽùD\m¬Ã˜kà6CLV…¹°´‡6!k+Þ«céta+uai8 ÏmL9*<÷17”¶5»°U;æqµ±c®àÍ‚`²JÌuà 䚟0·¾Á0ÖÏe¯ Y ÏmL9*<_ÀÜPÚ¡-w\Ì-âjcÆ\Á›1Ád•˜ë†È5 ÒZÀ;œU­Ñ^à Y}hÞ˜rTx¾€¹¡´páacnw:aNôq‹!Ɇ+­Zë$ŸÑ5 ©ìÌ[ýœn¬×Ü$£Ðº›rnœ7i*êg ¬ö`áblÑÔë0ÎÞŒé&«ÂZ7¬@®iPf7ß ë’ÙªWEs oÞàSŽ »—0×”¶@hËs‹¸ÆX‡1Wòf3$ÝdÕ’®V wjtpó Š±®&¸ìU!+áÍ|ÊQÁ˜â ˜kJ36æq±c®€Û I7Y5æÂÒÚ„äSˆ×ÇÒéÂVêÂÒp Þ¼Á§ ž/`®)mkva«v,Ì-âcÆ\›1$ÝdU˜ë†È5 >an}ƒb¬Kž«^%² Þ¼Á§ž/a®)mЖ;.æq±c.áÍ’n²*Ìuà äši-àΪ¦¬bÉsÕ«DVÁ›7ø”£‚Àó%Ì5¥…s‹¸ÆX‡1¯¦º"6Ï¿¡”‚£S)¸Ÿ+~üíåׯb({÷Û"kçÉ~ë§Lóø¥!•¨ú·yüsU1ú§Ço{aOVóFÛ“oˆ|ß•¯¦7Ýø¦ÛóÓÖùiÕ@ðª/ã›æÙÏ]Bû Ø}UƒoÇ Øý)©Üo%˜/¿õ<ÎÃ1Ò[,s–Á¨Qî¦Ü'Ù‰ùû<þ¡}6õH„é§°ˆ¬Œä«K9±{hðH¼Aç!ãBu·{Ýíž5T‘..Zµ”;ñämÓξõ9 ϧN‘‘’n‘÷…¶÷hö íÑœòÈïÿ"@C¸ºf¯áÙºÅË]S"A;¬(Z ŒO.Lh˜ð Øš‡'mwsze¬…x³`‚#ñ—6¸ûM2æ™í>˜õ)CLàÉÅíì C?6ga€UxŒû¼ó´GŽýº•~c%φµÃ£df[4Ï3±÷O0ÂtkÀú ‹K!­+­SR=[Nf2PTV[E« ~0h{fãWH’Ã}¹ eˆú‹¨øVPãà”€ßlÚæ•ÀîÙõ:lïäܯ‘Ú69‰ ûø@öóRêð¡ú é·+.c—pÕêc¦›d3ñ«ÿÜ™Õ<Uû•Øøñò½x4i‚3“?æÖ:‚Õˆ·arm­°%qÏÆ­ÅíݸyyL‘£Œ\w+Á6Y "!ŽÈ© wæóÅu£ç]Ÿ×WÄ êÆ‚1ŠùÒYŒ9ìP䞤j…C*<mùØ¢Ap|é„çÉæ·+!V؆s½T_/ïÏc¢_tzÀO=Ïzs»l›ð¾‹ãÀÆÂ›ËÆ¥MíL„•„M2sP7¬.´B&¹î]‘æÌɸ.û¶Ý¬€]ïwgÓÂÙ\àÚvžC©1¡z‡%uåÆþ¼à•îxLâÐŽ¾ ÕĈ¢,æGÓæm¨ôÌNO@±ïýŽ¥¡x÷!^^pâtNM…£¡{ßþAIÚÍ~¿âÖË•óž²|üözŃS^vRbx‚—³# +@cxoÌki)Þ?æ7²žçéòÖUÿàB½ãtEÀk¸ãˆã“€˜¹ßçŽZydÜaÑÜb§ÝB¦S•b|œEêê”L¾^L8ý¼ßþŽÈ(U YÐö- ŠIÅŠÖ™¿Wøx˜+…£Ér Ó%TÛŽäuŒôÔLºàÝ/D('ÙŠeÅä#yŒÜŒzªˆ4»­´¨#;çE¢.pý×óÂQк”ØIŠ5°bþ&äY„l¦åÀÜåµ ræõ![“p%Õ¢i¶|÷KYTåìkaÌáj¦(k€EQ&Õ:$é:é¨{¿Ûvð9º²©‘Pïï6@ŠÇŽ.K—ÇÊj‘d\^Úªs—OfQj¿Ä”NÂLD<ê¤ÄûÓòWÒF¹ÍÈJQp âÙŠÉØ@Nj È㊹” þf¿q‘ÇM^¡½7´ˆF1®›ÒË<Ù®Ö´ ߡȓ!t‡«O¼¢Þ6û½J"­’1kŒFÀêµ{seÍð$…&ÁÇ6s®ª´µD\¹ÀÛ}_ô™"™Oð¦Z–*ä1fVIV<_\ÒÌó€¤í,Å[Q2^Š_£D”nôÄ ¥àõ~³>Êë¹Ýˆ£­Í˜^cžm¬˜]죬àU-tÿUÀ‘°„ úóݲqØ9Ý&zËœµâJZè|·^DEncTÚ}ÒlÇ‚žì†YU$»¬mÞ…â“uÿUv¹‹Úðj¡„`ÁvN,¦ ä)g¤/´âŒd{:\fÉÃ& ¬¨ }õ_Ó±¢s-Éó[gIEp®Ø ßνŽZeö—KÜqÕzD 4|¸ªúÛè‘LoàÝ¡Ðê–ÇŒ9û±d%Õ¡¿¢¹²®áƒ\dNÁÕ uãÛŸ£†îYvÂs–ù©™Ã¨$x/&ÆE½÷ >¶P]'&œPsG(.à8dšÙãéÕR de…“# KË%Ͼ¼Uï2˸÷2µŒ«HijŠ%Çþ{B¼à€T&”òE)ûFÛùÉ¨ÑÆK®Ìy]í·PõÖÊé€âwYð¤ô%&ûÖ˜aò¬—=We–—•e øÒb‡ÞZ@᧨K@"\¸€©°ÄÞûfw„:Q,ä£/ü޹Ç'o ÷vµû×=‹¸ØçŽÏ`:Þ9õsݸ #ë ×Úc_°È°’ÛÂ%!jVÏÙ²”Œ'½€©-Š•Ko(ôFIæÒ7_ 7ê2Å2´jéih¥Š0*Öáô…{£|¤àŠò±#oâs8F~a8…èKáo'°ôµÐÊI3" Kv Ï­ÃuE!—u„Ä⾩@¹ŒÒ} Eë*\+*/+LªÀQ+LËÌŒþ…u>ˆ÷™çÌʨALP*pçį̂A]ÓÀßÀ–<Ï@nÇX„+‰Ø ­Wzƒ%1ÆvˆÐ0(,ñ V8Á…:m#ÔÆO¥¨{ÕqO×­øöû‹>$UÕÉrb J8ät5iºÝü¿BfÇu—WÚŸ*•rl5"âçÑà€8üÆëÕÛüqw?ˆO­Ócœµ:µ^óÙŽ8µ> a>eCô0¼;²?‰3 i9' æu@ñòˆ”×L»°áuÎ/RߥaÔÚýy~ž®T€A-2—9Ó±P–{Ùrww•‹»ÊEîg¶á®’Q‡ Öº:G„×s[”ç¶™N`QžØÞ>‡EÙ²k`I‹² óäý¬M5¬Ëa¹ŠxSƒVuÉ„î–w—–ŠRq¦w&‚_Z*Ž·c‹I,*¦oÍŸ9> Màãð¨ÑfúFŠ/oÈ\X°î†8Íš%¡õ°u¦úîwý‚„ú06>O"² ¶k¨ž¹”c銷H?ÏQü’gлŠÍ‘ZZ @GžÀ .¼‰.ß h@0xlðiиaÞ33pl¦¼)Ž€Æƒ9q² Ægå„LQø¬eD€>˽bLÛc°1qŠ W`ê\Ó=A¦NLšê)?X#Á3¶:â¬2<¶ç Ö£1áüZ#z‹¢eÖwZoâ}¿¹ßÜoî7×~sf }el6<‚•ízÔU|¥¢ h{ÄØ+È¡Þù°bSÇH|Áô¨ŽÑ÷77ßO­)°±CúÚ”ä¼{c*2¦”VD•å{ƒ[bÖ¦Ók”.ÅÖ¼¦$Ÿòp¯¨§‘!öÊ‘ñÒ%ÌGXç¯ì ÀÒÇv#td±8mAééa¿;n!Ç€Kr«iß·NàÑ—ä0o8|M;ÿý¹:ÞÀ=ruü¬Ý<¼TfÖŠ”RïÇ–~kóùx?leE½dnG1½qßV$eOÿý¬›Çϳbëæ»Y ÎŒé)¬ ZÕ);uQô…‹ŒDÜ Ç>ÞÚ^Ñ5ÜãÁ;P¼~tˆ’J;¥pýÙ•#.Þq ï>Üí’ªEŠg®Ý¹X椂ÿ ”Šè(µ#¸PúZÊ2©ž-'óK)§Žö_@uÛD̵„›Õ˜Q¦Çáרz‚Œr;ìåoYÕ8Ê®æü/¤G=¯JDJíkµ\.óî6Þ¼r×ÿ|dnûŒ׳Þ3FƒÜäSüfÀ5Ú0Éá1FœT…á¬Èö}”ç(çVéþŒKOWwÎÒÏÂ(Ã8àu„M›p³LÀÝ IG£a|ẛ—ƒPð‚ÑŒšzû=ž¨Nè$ù¥o.Ó®©9µâA”v ÊÌÿ§^Ï“ðàGܵr8(›¥#Â5ýöM_½8ÒÄÔE_´&öޏèk‚#âûUœoAÔxèâÍÑmc7`±máÁ’0µ<½/¦Þ,ôÑþ0!œ˜²0«hžâ$ñ«[Îhçîä<±{pxIš|›F`|£ó4͹<Þ6s«2©âÏþˆÕÊÕŠ°T¡ ;¨þTH,ã^HÜK3·WdoòíÆ£î.,t¡\ž*Zªð’ÚØo{…ØÿEmê]N%ÆVMæû`,¹•1æ78Dí,y„ömÜ;y¾¬Dõï–v®µP¨×Jùc¸78oãCîéÄõnž¡TÈM³6rÀöELw{É^Ñ€¸[ß§+ßð·qö ¶ù¶ôaÎË`+‘q9:$¢,jo…ý Ú¥ðŽBbV1ѳˆÑ /æ¸;¸Æt†ŽüìTP—T¬³ÿ2DuóÈÒi÷üØkXm£ìb8Œ„·epÖ‘ ÞnÊN€Ñrqôvà¨ÛIGµÀ¹¡"µÿpÄvÀ0„9}CöŠ<ÒQC4/ÑšwBíÒš÷møP™B-ž1àuæþ" qëm-q¹%j·:$j%5ú°âh}8 aC†„Ÿ˜“w¶½-“ø»1É 1p6“`p¶+PrústŸÑÅj8qÜ“"Ÿ %Nž¢†ö²3ßæ¾0iñ=“ „òJ)YŒ4ÂÜç²bÖµ˜ÄŒà•e6gÎ]Ó9J9¿I*ï“’XŸgu©œ•-ñí³v1çŒ`´¹Ë‹réuH}ÔSºoÂ|—×úÜØïþ¡…ˆƒ2kr#fiDùÏIó¬¦ ×Û­>ñ¼<£[]›kän·Í­®k­ëÔíäKŽð–‹¼´ xj‡{Âúv¸Ãn‹r •sÎäOkÔícdŠgäÔthŒÊŽH™ðÏ8 *ÔĨ;mP!§çN\2œ.naMä€ÒŒðжûÌÅTR³ìEœ”ÉŒYÜè½ÉàP M_o'ï(S¸7›suj©ÃºÛåµI°'àŠPþäää o¤,Öõ“ ÇÚQÓ¹y¶R^\iY‚Óßðioqú¤U=;­«Žþ-õ&¥ÑþËgð·ÊdXÀð+ô’Ç¥7ÂCÍ®°oÇBp·Ï?&HÝðL›i'½áñp9 0ç@9`Ìå)LQµïú- æK]¹ýS>°Á’·‚̇O(|ﺪ}’Á†œ ÀÊtß«@ò7L=üøöòÿÈå1 endstream endobj 5342 0 obj 7956 endobj 5346 0 obj [338 /XYZ 40.7999999 639.379999 0] endobj 5347 0 obj [338 /XYZ 40.7999999 639.379999 0] endobj 5348 0 obj [338 /XYZ 40.7999999 374.419999 0] endobj 5349 0 obj [338 /XYZ 40.7999999 374.419999 0] endobj 5350 0 obj << /Type /Annot /Subtype /Link /Rect [330.719999 587.540000 379.679999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling >> endobj 5351 0 obj << /Type /Annot /Subtype /Link /Rect [101.280000 527.060000 134.879999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5352 0 obj << /Type /Annot /Subtype /Link /Rect [288.479999 527.060000 349.919999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types >> endobj 5353 0 obj << /Type /Annot /Subtype /Link /Rect [96.4799999 484.819999 170.399999 492.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap >> endobj 5354 0 obj << /Type /Annot /Subtype /Link /Rect [382.560000 468.499999 539.039999 476.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 5355 0 obj << /Type /Annot /Subtype /Link /Rect [180.959999 434.899999 337.439999 442.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 5356 0 obj << /Type /Annot /Subtype /Link /Rect [144.479999 384.019999 196.319999 391.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling >> endobj 5357 0 obj << /Type /Annot /Subtype /Link /Rect [339.359999 347.539999 419.039999 355.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 5358 0 obj << /Type /Annot /Subtype /Link /Rect [176.159999 296.659999 227.039999 304.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables >> endobj 5359 0 obj << /Type /Annot /Subtype /Link /Rect [168.479999 251.540000 212.639999 259.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 5360 0 obj << /Type /Annot /Subtype /Link /Rect [459.359999 225.619999 503.519999 233.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 5345 0 obj << /Type /Page /Parent 2 0 R /Contents 5361 0 R /Resources 5363 0 R /Annots 5364 0 R /MediaBox [0 0 595 842] >> endobj 5363 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1739 1739 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 5364 0 obj [ 5350 0 R 5351 0 R 5352 0 R 5353 0 R 5354 0 R 5355 0 R 5356 0 R 5357 0 R 5358 0 R 5359 0 R 5360 0 R ] endobj 5361 0 obj << /Length 5362 0 R /Filter /FlateDecode >> stream xœí]K¯ì8nÞŸ_Që]m=ü¸¯E€F7Å ‹ '“`pÏ 7³ÈßOÙzZ*Ú–DÉvOÓêã²hRù‘¢¨Ÿÿù·ÿ¸ý×ßo?ùín¨ùí­¹7]#ÿwÿùÉýîŒÊf?´w*ÆÿÝþxûqûñöëÛ¯ÿÿñFºéEõ¯ÇCMBvø÷?þöö³$þ&ÿòÛ—}´þïFoÿòø¯¿ÞþôïýYõ7þàýmÝØø.„:<þÃmÿûíßþáö·Ç' S¿ãÿÿÄ!hdz¾ã‡y•Lÿ¸¯BÄš[K(o†!ôñíCÿûŸoyôf>ãÞ6äÁN?p°íRzHþö»|7íI$£Îpý«ïΣlþâP&=m¹xÛsÊÃÒA¦TtšÔ¼=HªƒnΉ汫(9½MlVa¾Ëÿ€¸ÕÔfâÏ’2ç·Ÿ“ç]¶Ú‘ifK§çßÍ/3üèòAÑ£–ˆÛä“pM ?I„Íh`rg$÷.›Ïù“t)ç0HÚnPʦd‘>–¾nRnHªßærÙwj§©¥ã6' ›ßâr©¥i:Ÿš¨\¾Ëæs.Õì±âÎSyã—³ujJ:‚:ÍÁT¿Íåò!>µ Ç©¥ã6åjÑ¿ÅåRK“Ïèàr©Eø.›Ï¹T$­¸³¸Vó³Òù¨ËU“5fúÝ*¬rFûLtܦ”±ÀQ¯—ZšVà «bq¸4"|—Íç\J:ޏs¸ä“¡Ÿ¸”Í©Çv]ºÙk.Ío3¹dT¯Ë©Gjé¸ÍIÆæ·¸\jišÎ§&*—F„ï²ùœKIÇw—íã$—²ÙJpÕØ&é ÉÃ’´Ó4Ærê‘Z:ns’±ù-.—ZšbF•K#ÂwÙ|Î¥¤ãˆ;ÜD»¡Ñ°J7G5ôxþÝü2¼öTƒ×žDç6©–²…ÇŸ$Âf40¹3’Sàõ9’Ž#ålX'9”Í©G ·T“rCRý¼ÊAœzTRé¸Mj@eþ0ú\jišÎ%ŽÅäÒˆP×ç\ªÙcÅ ëÔlšr'¸¥›ƒ!©~‹^Õ‚{T¬tÜ&5 aIz\jiò\.µx}Î¥"iÅ ë—¬t ·ds‚[Š$ŽnV¹ £}&:n“P‰0–—ZšVà «bq¸4"Tàõ9—’Ž#îlX'¹”Í©G ·T³×\šß"€W9–S’µ‰ŽÛ¤Tæ¥Ï¥–¦é\âXL.x}Î¥¤ãˆ;ÖI.esh4šÒMÒ’†%™€¢Ë©GÉÚDÇmR*óÇÒçRKSÌè riD¨Àës.%Gܹà®o ¸ë xÕÍQ µÞÉV.x% …’FáéÏn[:붉Ǥ¢Ãæd0™4TâRRrÄï$—²Ù«›”’ê·(VæÔ¥íHiÞV1Qý{\VLm÷×b2k$©À,Ä«šHVîÙ@OMÝ©Ù8kšƒ!©~‹gõ»ÔÌ”æmP©Çª‘)Ÿ“ÂeVKR¡ZˆWEÔÊ=ñ)N…Yû‰u×j’8jW8zWX•4Qš·U”Ióz¬™:ÊWXí‹Ã¬‘¤‚·¯’’#÷lè'9•ÍÎ\Ýì5Ÿæ·W êÔ¥bn¢4oëp)ÊJõY52µÝKȋɬ‘¤Â¹¯’’#÷l (9•ÍÎ ]Ý$!9`˜™VÎX4UÌM”æm7(6ÕgÕÈTÌI¡2k$©/Ä«¤äÈ= ’f &ÝÀ´'õ$3-ô¯p¯L­˜z” ’мÝhlŠ“VárªòE<:¨|Z1jì q*i¹bφ„ŠWÕ&Á´)·tõï1 °XÙ§NÊ¡Üo7£æmȯ–­í_áaT~­<5 †øUÓÊ‘6:ÔsY¶…IK°íÁÒÕ¿Ç@ÃjáN}*'Zóvcà*ÂÒ øÕ²å-d~<5"†øUtùgEͯ°:A8a¢’†.’^ŽbV_IZóvc+ÂøüjÙ:ÚY8ê‰_+O Ž!~%-WþÙ˜Qñ«Ú¤/˜voøµ¿ÇÀÈr|eŸ’GIkÞn ˆÍß_-[Û¿̨üZyjœ ñ+i¹òφŠ_Õ&¥Á´Igé(ö¨Us¸1tujªµMºÝ<›?¾!¿Z¶Â£…˯•§†Ì¿’–+ÿl(É©‰Û>æ«Aoº=i.ªóXU34·Ân»ÆÄ¤gíñ'ßí¯q9í,Rvè òiŨA3Ä©¤åŠ=DJ^U›™à¥iSnéêßc€f9°²O%䉖ۖ·¿Çæ·s€²K —_+O š!~Õ´räŸ"Õ\–mf☶=Xºú÷ Y-Ü©OÅãDËm«e~Íoçe—2¿Fž4Cü*ºŽüóA¤âWX €³QOMI/ G1 «¯$-·­d.TsÀoçe—.¿Vž4CüJZ®üóA¤äWµ™‰nšvoøµ¿ÇÍr|eŸ]cBس¶”¹ý=6¿”]Z¸üZyjÐ ñ+i¹òÏ‘’_Õf&ÐiÚ¤³t{$©_Ùgטhö¬-enÍoçe—.¿Vž4CüJZ®ü³¡äد†’zÓí á‘NƒIÙÌÍÂäa³fçm“¾«š˜œ “%ìÒAåÓŠQƒfˆSIË{>ˆ”¼ª¶Út›rKWÿ4 ›3¬…<Ñšµm:/ÂІü ›9<£…˯•§Í¿jZ9òÏ‘j.˶ÚL{°tõï1@³°yĚlj֬mS|1–nÀ¯°ÙÄ3ZÈüyjÐ ñ«è:òÏ‘Š_au‚v X4v^ $½,Å,¬¾’´fm›ö‹1¾¿ÂfÏháòkå©A3į¤åÊ?DJ~UÛmºÝ~íï1@³°ùÆŠGIkÖ¶©Àãò+lÖñŒ.¿Vž4CüJZ®üóA¤äWµЦۤ³t{$©°9ÈŠGIkÖ¶éÁãò+l&òŒ.¿Vž4CüJZ®ü³¡¤°ÙºÂæ$›ö¤¹L®jæ‚fJm…} jú³Û6ùª‰È©"Äætpù´bÔµ!N-Wìù R8)»Â¦'›6å–®þ=hV+µéCQ”{m›6Œ0´¿F¶¶ QùµòÔõ"~õ´räŸ"…“½+l¦²m–®þ=hÖ w:èfN  ^Ûfc,]Ÿ_#[>§…ͯ‘§®!ð«é:òÏ‘ÂIä6iY·%°³™¼(ü:ŠYX}%¨ÍÚ6™c|}~lí,õŒÄ¯•§®+ð«h¹òÏ‘ÂÉé6Ù´{ïý=hVã+ÄéU=õÚ6¯a|~lmÿ @£òkå©kMü*Z®üóA¤pÒ{…Me6mÒYºŠ=’gä¨SBŸ^³¶IµmŠ1ÂøüÙŠ9-d~­´<«9À-¹ ú&91­KÎÁ>£/0Ÿ¢±ÁwØ'p=¢†Cl Šk¡û66¸²°ºTRðn5·Ý.HX 2™yòz¿øšðOŒÔ˜p¢0I9Ø[½›V"'§¸÷];þê…()ø„õõN‰ÅrÐÐÂ2†­Cyå¬b9-=p÷År¬òz¹XŽ^$–óÐ{ïÃ'Ã|ÏM1Qc€Î„9+Ä9¬–?Qœã\âkAˆ’Q›Aß–_q\yÖ‹stâ¸R@5v z.P>øXØf¨ç›‘z5?öÙSÐÒ©ø ×óÉÿê~בWÕGò»º8p¿«7.嫸]fÑD ÌœÝS>—Æ s3ÿ.dî/ÿk{ð”°¹dæí@¼Us†!ãü’"ù6t`·–¬@P©`e¯Nç…!HH Õ *ŸSk̃µáeœ“ÀLÀG VMeUŸõ!Û›){=4X‚)AÆUo78‰ Ã[p€kꆯK2É:ºÚn¢å‘~ ìW39âÏ<á¾ø )ßÕrRŽ»¬û-kñ±=|Jgð)+øYÎýæ}Dˆƒ`< Î…#8^–ÇÚÁä22=3X)xD˜:8bÝFäfòI” 6ëm#+Ϩ pƒµ;‰RÁÁÿC üÁÖO­.  p— ùqÇè›ÏГ½SëjÀ(3Œz £h·ÎÚ9CóçÛÇæ¡ù-Z¥öYøCÀL3‰¯ø>Ê †Aí”`0{~ÝÔwÒ9Ål‚ˆ^‹–Öð—ÍüYI'Û·§T²æ|ûU5t½µê‡±{;q5i¯®7ia [HŒ·Çö7^7ðmÆeÁ!H8m £ÃN5KJB«–6æÌíËg|æXu/{Œ¦^íÌÕó 3N¸Áú'-Œ “²+¾UC6fY]^ì–9“ËöàÞaÆS¡Âªb{ê@ÇöÞL\:ødœÒÈ>8VÅÉ^Ø/¬£Vž½SÇíƒE¿P‹~糂m ñaø$4Áz݇`Iã¦pÁ37"…+¡â-žVbŒŒ8T†1ægû*AM‡ŒQn  î£&ÚöRŠdÂïlÏ=¬]ß­aþÀ*Ày% ÅqÆëvžqO%ó=3ÃøU)êéKfÚ‰CO=_ûÖçSÂ;øŽ€ÞaôŽZöOž¨}é¨wà/PÓ¿»³iF»ü|%Jµ7#m¢CG­ƒ;ŽÍɹHÚ»\:[¾zÌØÌé“/?j¨½Ó`{¨¿ú+ôþX¢ÊÙ(Q’‹ÌÔ…s>br—SÌ1Jˆ¥ûwu0üŠÈW¢(¡zé„ànExYç]0Üû˜i uwgÝñKÚ‚Æpâbö"Öb§Iôvª®»I¿lá2ðûv<‡7ÞÉ7· »K둵g+¡b…ã,R(xœDoûa·”»¾ñ£XÙõb•pœIða†º‚¹e³'8 *@!>®+Qé$y̵p0 ž‘)<'ˆšr¼5ϵ’™<“§Yø¦¨ÂK'ã\ÞÂÞ3ü‰•0ÒÇ̽#]é1 Ô³(›"1âØ>CÖWJåíˆêˆ<”äþÊ)»ê­ö¾‰®V(«¨Lô¶îe¬Õ­ïÞ^îÒ@I©•·Ýìï°åMÕ¥ºvÕ&aˆ‰·¾H)/3ïïߤ¯Ço࣠1Àðãcð|Šë,”À"e8¬5›t«ÌÈL™É¿lÒ‚$"ŽùZKɦç™ùÎÂI󰀂‹~„[Œk2vJŽQ#ÔØ=Ê™6c2Éíý­gÌýÃ÷·ß,Y8~Â|ðQRTu¸€<Á…m€2»(W@sïìÎh²ËSMCï•á÷P"OžØT> ûä éÀw¾‚O¾ÅÓaà“sòC†„ÞÀ/€¿š½/QuûÙ“/à“ÏàXÖ t(ømm"ÀÞ@Pð…’0G,7xî0xÆÃúžoð…ǧŜ‰×ÈÕ9–°²£€J‰mµÙ)Ë9•}ïqÜSqCç)î˜t®”ûLmW1Z8¥âH¥T °¾äB1 ø„b÷aÁ°1¥d/_vLy¦¶ðã‰×ý&qæ:õâjïÉ’–ú£aù2ìë;¢#›—­Ú¥”¹ØcGtü„¹èÕDèî-óJ ”©¤ãMadÃã:2/qžö\‡3`:¯„w€ç9nl´=ÛÅÐ躘›àDŽGq÷áö]¦–,JR™£IGãÏLl×7{›Ø®÷1,g¾È×+¦˜¾:õ΋âÑ'0d¡ ×ö¢³ ݯNÒ§1EX ö$I Á$•MA¯UPò’nkÒ ¦"úbC 7âPÜöš0jmTˆxtæŠÓˆËP®a<ÓÔœQÏTÖJ¡GÉ·Í0/ºµZ­>‘e3jœ»}†c€8‡ƒ‚‰±¾NpÔ¹PzÎÿñ[Çû ,‚ÐÖÙ ºãàËzþº7w‚Éz¼]°ÂCÃp­»/#,\†¾H^èþ56rÎ(Gä²à”>ÝËâ  ³¸U»¸Ê‘ý¥]2öEáÙÜLh•ÝòM9¼¶Q^Üe7š… ÈFûxi°#Ò#"BzÇ3 8EÒO•žPuýt^“W»êè aE,›õÝÉB•õ‹žsŽºTÊ ÏÁ;/ø~YQ¶ÊÓqÏDí÷m©}Tájn?{ªŒ¡\„ŽÅz8e=9!87–’ ZâòÝ ^,£ë Øpm(JWt¸¢é¶Î»2Æ›ìEõ³"œy3ŽÌÃã½Íÿ(Ào;[)Åòc””§<àó3|<.óy¦ÏψÁýÃ.çgŸà)¦:ûç7[§ÔªÀ1Ä{ “n{¾E­<Öteó|N™r|äXmFDv÷ ÊN}«ÐBÉÒõÍÈÀ¨l·Àë5~®;Õb2 œàk„”¬S4™‡{v « FÈ pÜ µºVНâ±UŠ•Ÿ!!ô£õ»8¤=¼¥sú3å:¦²ÕÆ×'zRØö£Ž1 +ç`HJ*ëÎGc—"Še#Gè´øÄ½G 7ónUϯ‡CFÅ3é^…CHÓµî_öˆ‡Lßà©ÃZN8i´ ã„ãìØ¾ùr¹ç»Ã¿uÏQÌÜý†c÷Ÿ‘{ŽN< ápýv>Qã…/É]gù³6Ž…xÙNÆÖ#ŽÕÄÈn(¼-_)¾Rè’ÉsG²EêéØá ,Êrˆ7/æ‚ú"gùÊqŒTJð§PîAÑw;Ø}€ì¢U·Â”ó«É°ŽûVUqD‘SqÙ«jûnžÚÇÝ =r!¤kγ¦õôÄîU˜ ݦ}•‹ÙàõGŸgæe@”.Ær”BÙç ¾‚Q,yVˆd˜“ÃÙÝêqŒW·/Wüâ\v¥„TÁçezûú£nÇ\¦ !b ÞlÂq!NŠq5̆͂tò‘Á›LW¢áa ×ÓµÆá›FO§kqNÜ?ŒÙZe&ÎHÈÓBW2dÖ’¹’!– é-¦÷·ŽsuU¿ø…sÝ­@yδ@=ž*(Õ°˜¼•õ(äÄ•¼É¶£Þê‰ñ1`6N'ðOS‹«Táj½)t"8ŽXrú"gK"âãš%¯zhË^Nwœã3e /h܉‹’PnpŠ0È)²_ßI 1G—/¸~é@½sÆ#!,¶ |]Œd›ýOƒ£Xd­Šê]Pû‚ÚÔ®€3†a]ÆÁç¢äQUÎÛÁÄ•–FÉM uBÓŽÿaÆÁˆ+ä@§ªWÚü(5âO•… t.F©v’JÏ40mÇ=SkÃ:ãØJŒcœ“Ž–`hã@®)`u»Í]?¤}‰1ºDhÛ…ýØER¦ÎèÞ®Ó•°¿AkâæãÒ‘ÇÜô,Ðꇖ÷·iÓ%L“„’ÒI§ØC¬™HpïˆNÉžÃ`ýxƾ$%óe=qÃì¦lbѯۿ¤ÌŽÑnçÕ3Ú«ü•´ ÊSrLj]ÕˆUq òR-ðÀüa–D!hÇ HÏÀô5UØÔ™œd»i$³ÆÁeÖ©ˆ·ÃÉqOÃ,lk­ú;µAM<4+;eûN¼È”íE÷|ʖ̸kGe·³Ç0ü‰P¹;„ÕÚËø'Iû °åÂRJ'ÈÁŒ”Ìň ü}ë UAP“Zx8xí¯Ç7qª*zb±½fJÉ™’• aûvóÍ÷ì]{)[ÌW‰²ã'\C9ô%rZ°V¥äJ ¤ÌÉÅ9Lö”Y¹µLÒzÖBŒ÷ð¢·iø”P¥b‚(g j¡¬œÓpûè«àÝrZtI¼ˆ:,”%“rê.âg%%Ež‡¬A3.1o©ýM}ä3Ž[묌Ÿ6}¡¹%¼ïÜ?”«³2š '©¶NB7âØL’ƈ†+†i>*ïo¬%þ0Õ.Ø1~‚7»·#Å I'¥”G¸§R$}ûÄ ¯ò„³g0AìuïÔzec2µÐaÉ8GË|‹p+tJã´Çt‡Oá„BÑ$¿*„+ç±;¦zÒhû¡&¿óΧ„wð½ÃÀwÔ`>yÂDü;ð(Óß™h<Ï@öFš»tœÞԾͫ íÏÉ'OS«‘úüÕ¤ƒÞYh‚tîW·Üø%ªÆ§|€€™Šâe®dANX5áI5ýÖ÷fˆ¨Á_.jJ’V´Oà0Çg?æ /ÊÍ©'¯õr˜“Ü…oLN¹ªP52×Cbµ9Cc¨ˆ l4$,š”ï[‹#×)CY·Dì°À½¦ÔRÛîÐìu„üôÆ;>lÇIgšùÁ°o¯)»)›ƒŠ|Ý.àÇ®Çgǹ0M¡â³áîöˆÏŽŸàiæ ˆµÎ+cvOÆ8‚ÁÙÝbÛôÞ)Mñ˜6®jKÛr¡‚(ök  RX*ÌŸ¹°T=!øeü|§ø¾¼ôÒ'#Û›Åÿ¾Ì‚øá/¨•0ÁX¿®4`«ÛÌZ% Y¯c£e:Õ‹î~ew²ÈióC{ò°‡XO;Kpг6#0XWøíˆá7ŽvË;iùŠ:åM«yÑ l8)‰6©0>Zè þð‰Ç8:_Á'ŸJÛDÒso+ÄÊÔÄ1yüÕï踔ÖêÃG¸Öá‰ôÂs £Nê}DÑmœÔÖCެ< r­èÝaÈ†Ë ›):Èi«/3”ÑAý‡=¢ƒ\E©T _®l¤‚óÖãT0Ó|ßQø…ñÂ{[Àuà“…¸LDbjdK@îÅÚL,}·XÊå_¨{æ(×§CÕÛÊ.ÂNÝ<·eªö³i; ìíøà-?{êOç¬*VåW"6U"nÛYWõo÷ºJg!,›²ŒS*öŸTù–Ó3eÖä$TOiÿ°Éȹ"¹\¹Ãµ8g ¯ã¨8•’Á¹®|÷Êà,\j7&°^U#§B®]¯5pÀšH(û3 U`ö7U({V{U=®ŽÚmF*‘TøV'%¶l9ŠÒ¨æ‚ÿ “áÀ) G¹×àU½›u¸Ç{î½xFã>édƒ<½~iϤ% £¾yŽŽÒVpI;º¾v·»PIZ2ᢄ2T¨¥RcRÜ>œ«Ž+«ƒ©ª¬`—#ñ œƒ[?¦× }[úëèð¨ë½/^H™ÏU\èè¨èˆâï…Ž0ôû].è²t)kZÒ¨΀Ýò’‰ßó wF¦ìBc%ôYêE•çÁHÓ WñösVá‚Ðc©a1œz_ð“í%“RŽ/%]Ý´~AÓG3¯ÒÓ3sJVŠa¾¹¸àä> »¼W;®ºPÊi¥Ýyí ¤«¦ÚÑ2h+¼¥¤rŸ!e¸Àx€§Í8ˆ»9\2þ6¸Ô|z>  ýˆ„àÍBpã¦Wƒ ,Hþj8¸û_kg‹fOûs¼Ì!ÚÐ?ŽÀÜ)Çw*cà+²Oä!âÄØ÷ÌWuUÜÁri†E׺ñÂe PÄÕà)—÷­‡-Ô-8ÃÝ”Ò8pÅ%Ø[€å¹f+ø­ã5Mk¶å6„öžR2ÀƒêY S%hí³°Kž6dó$BÅe{N=ýeT¯¶#s<ÆÚ©x/”G$æŽ{ÏC„o‚Ó…½-môM°wÿ°ËM°÷¯¦õzÖ¶5e(^¬+7á'g­ÃjG±ZÖ¶7ymWÖSµ1"óJuX ÇØyï­©ë”ïù™:¶cGqÃnVÎ ÉåU=aG§Þ*Ïñ`¯ÈÉ#ž±wPú(Á#ˆ(“Ž’Müq#:9‰Py—(5!k%”ÜxÐnµ;gñèB.KWˆ§Dˆgô$g¦Bð,‚gÞgð8|A÷ahº;‹ÔÍ'ÀÂrŸ¸‰³¿bêáÛ¯oÿø² endstream endobj 5362 0 obj 9492 endobj 5366 0 obj << /Type /Annot /Subtype /Link /Rect [241.439999 143.060000 324 150.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps >> endobj 5367 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 83.5400000 105.119999 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_directive >> endobj 5365 0 obj << /Type /Page /Parent 2 0 R /Contents 5368 0 R /Resources 5370 0 R /Annots 5371 0 R /MediaBox [0 0 595 842] >> endobj 5370 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 5371 0 obj [ 5366 0 R 5367 0 R ] endobj 5368 0 obj << /Length 5369 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðs8¼K ìÎ$úP`úPô¡Èv·XlîCÿ~%KöxH”xx‘8ýèO¯'üãëï»ãËwã'_þÚÿö¿½Øÿ¥ÿ߯û¿ÿ£ÿñÓ4ßð…o»¶3Ã/¿¿pÁEÛÿçò·aðß»¿ýiÿ{¿„ö8ïðïÅ9—ˆZÇËùQ~ü{ù(zÛëáWµç\ôëÔ=8þû¯ÝÏýlçeºþûQ [ÊxÜÖN ÇS‘AßÈÃ:»ÏÓLÑkE—f¢aEï>~îe_;(šÏ?÷ 9j«ãç~³zÿaPz´xþiÿcœ}¿þu×t'=ª·Ó‡#ŽH8Ò¡Ý¢…×öŽ|‚³)ø ‘pmìG8wÊ›ðhx CžüBçŽàó#”ý0xržS€Ïp¸‰ñ¿Ÿ)Ä<›„T †PF$ãÇý|zîùVv.Ô3î¹õàÒ™à}cÎeà ŽyF0ßÀ»õsì…ýI#¥¤<“R| K-†W@Á>ˆåXr ¸6iSæŠðä0À;¥ðeÌÀpÃïÁ#XžUZð­k"Xç‚'‡ñëS^5Öb1öêpŒÇk£Àágî‡SèTto’†×&à <ÜŸÆ^üÌcJ>ê¡,Ê~ is°ž'»bÚœêWX›Ã°òœ<{'Æï!X²EÏDÊøÊÇ‚+Õ"èöo™Ý5<9L;ðJÅŽ¯äâd\M*zûºóŽê F\Ð@cu$—æÀ€¸Ð)Úþ]®¸àü •iû§^ŸÑèÅ“r`‚·W öÚ F²Tç4³Woo‡Ûߘԕ++Â#Î{ñ'Î|ñ¾ÎþoÏY¼sŽhÎá‘OØ‘‚ ‰pRpa#%·V8±RΦáo°F „OrÜf{h;fÞàà4R„¸yÓ–6©nÓ)ŽÍ=(z%äÓ •°ºØ«‹:²q׬â]3»žêbßþ9 *©.vß3ÕÅî“›ÕÅ~O´P]ìÕžNQ]ìÕÅNÔæ¶îb²tÂÄmºØ±ý-3)zö:&¼RÒ•/š˜ ÃÖ]ù¢éaªÕŒ7_ª³y»ÂrR— X*XÅ'„¥2Öš°÷Ò7ƒ³QàæÙÖs°LÄÅ'‡G0Ü0/Å7^5¢Ùà5ÖD* Dä'úcÉ" s$oNÂþìoŒ~æ‰×ÍFËÔøìµXœu›Eñ,üs"]N”̉ìáx–ú‚Q2ç5èÉðmy ¶<¶`‘¥¬Q|²_Œ½éH`&6¢Çn45`­ÙÙϪÇiEZâBÚl†ÊðÂÇâóízŽ`T>¸8M»ÎôxkÏÏöucñýíb$ÆÈÊ( +„•Ńߗëa?âICI‘å²=<ÉrÎY™žÀö¶ô…÷Î'µÂÛzgl&BÅÈÈÝ[Ã-îÂ)š¤Cv.ÚªI˜`ÂË= Áz8^Fgi³˜ ÍyÏÂÊp9^5¡“§ŠP0Œ%Kåv…yš8µ@«<-9&šGPdàmj—‚ÀÓJ6`Ò*¦‘Öý”ìSä™§1Ò†q9­ŽNiŒçiƒH‰ãáUZ±`dQ°ŠÐì­d#mbZº•laØ©e…G+ èIIgóèËŠç Ê#bmx¸ÀêR}}.=«=\›-m‹P¨Ç–ä6FÅôeßò9’4G,5ðª ÞºMÃÂ7’¶k«Þ¶ï‹Ç2 ¬:¢‘nµŽîÂ:šÕ¾)zðÚÒÕœïÁe©Cž·á›’ÅOšaBÉ™¯ÒpóÛp¾„=™“z° ·ç1Í—²Î×H“‡ä4°)˜%јö-܃¤Go$زžÆ¼MÇ™1g'4ó¥¬z}yTmmÛ$ÿÑ-k»e¸]uýGÕ±7ÍÓ(ªà6ñžµáH,nŸJh*šö"&Gîn8þåÅ¥•`˜ê)~®Õ¥k)©Gº\¥l5"Å#QDV·ì,æ)h…¢åËî¥øò¦ ÉßE×:m8| 3…ûÂGZ(]ÖSæ4§wð´Ý<ÎÌòrbLR…訇!Õ–Ž©Âs°>ý’²ÃR´}Y x´sÈ.í„Pæ{êo µ!®'%€UÌß]â”K+š÷—Ĝ┒vŽ ±X(ɤ1Z`Þ4ÊÛĆ)Ȧ9ha«ñ¯ÊˆË¬AÓܰŒ õ“0§Ê˜bŽ!88#æè* + IÛ  +x¨ÓÞzZ<Ų`ñ•¸x ‡/7çsÌ¡šå·Zkfa½eéÎÓ¥eΦcuöêát œ …Ó^ñNpÄI]8uKÃÙà~N𥤊àÔG<NN‚ûñ$‚Ž' 'ìജÁkÃ#¢8Ù7Á«&Àš’ä‰á¦(³ád8œ2Jy†h~gæØUý‚×KµçŸ4MO(r¦&am( +‰ƒ'ÅÍ+wÄ I<¡šÒ¤& ®¤ŸÍ:ñª%¸¶ Ô>. =´3Ke‘·è’Õó7¬~üd‘Œà2BiKHLIøa¾™ "éfD)À` ožÄÎ*Έ¾|B_öо‘°Gº~Âo;ÛË~Û}ñ(Ay´§a el¯«Å_„õ¬LlÃOЩykçyl~\"‰í¶¹–’Ê6^áQÌ–.â ·%jÙÆ[ ÷V¶‘GéH_sã¤IŽqyЄÒêg>’$Wä¶»˜¨é6.;Qã… —²€ ŽqcìøôÔíÎÕ×gZJ i“Æ2£Ì= ›Ö„À¾Ø;@ £lB‰j¨Œ-2‚­6/k=&ÀŸ Œœ8Ü›éž-Â*iÁHu*w÷X08ʇi†ÒúÓ&ޤáë(Eñx?ùm(­­)gCJújCU* _¿i*DôR=™’”V§Ë£<T¾‰4óÂ&ç W*il¶>‚ýZ3`ÇÀ'°L<’öFë$²(É$y˜ >¥¤ÈšÇ¢F®#ã/¾êÜÍ»ºG gPËHC°Ìï|'ÊIEpUÚT‹µ‘Üsóh½¯/`òÊ“¥íÚ¤ToJý€;ê (WyDÀ½xËf1­“Œ2È­>1)x?óê¢Ëæ 8·í{2Sjgúòƒ!µ!4‡½çÓΖ×%]b¦â„‡+̹ òÒÙ$ìÃ(èwTüÜøzýœ{J­¥q/®þÀµ ”J¼‚ó‰ .-l¹drýßýK?yÿì‘úÆ_¿‘Ò•>yê}tv‡­ÙótW{Íq3Ú{ÉÎé3#s0×ÓŽ;uª¯hÍõnKÍ•‘‘ÙIyeÔLÊ„>˜‘yÚ¨í=-|¦ƒÏŒHÔˆƒ`ò@Ân×f‘àò“GøÝIs¼²ÃÏ虉¯p´‰¸Ãž™N,dïÓÚŽuÃïB󳆯áûšp<àøä (eŸ)†¨x\þ]üF|.SéØå!|0aÌóì ŸÃC’so[f|èñ0¹sÌ.’iŸRòáýÓîÿþPD endstream endobj 5369 0 obj 4159 endobj 5373 0 obj [340 /XYZ 40.7999999 419.539999 0] endobj 5374 0 obj [340 /XYZ 40.7999999 419.539999 0] endobj 5375 0 obj [340 /XYZ 40.7999999 645.139999 0] endobj 5376 0 obj [340 /XYZ 40.7999999 645.139999 0] endobj 5377 0 obj << /Type /Annot /Subtype /Link /Rect [113.759999 689.300000 157.919999 696.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 5378 0 obj << /Type /Annot /Subtype /Link /Rect [345.120000 654.740000 389.279999 662.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 5379 0 obj << /Type /Annot /Subtype /Link /Rect [62.8800000 146.899999 101.280000 154.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode >> endobj 5372 0 obj << /Type /Page /Parent 2 0 R /Contents 5380 0 R /Resources 5382 0 R /Annots 5383 0 R /MediaBox [0 0 595 842] >> endobj 5382 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5383 0 obj [ 5377 0 R 5378 0 R 5379 0 R ] endobj 5380 0 obj << /Length 5381 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`µÍG¿€ €=cÈ!€a99Þl‚Åz'‡üýHêÔÇfýÚ€g¬V³Ùd±ÞõÕüü÷ã?ÿ{üñéó¿_ÇŸOŸÕ©jªáÏñò÷‡ûdwRrøµíê“ì/Ž_¿¾¿>>ÿý~ÍõÆñÇùâôˆaÀÿ~ýíðãððÃðÉç§?ŸûßQÿtþß/Ç¿þíüã§q¼Ë¾º¾¹üòëð‹BvçÿÜÿv¹ø¯Ã_~wüí<…î:îåß´ª–aóøþr«¸þ½¿=¬:Ö¢ÖúÏâ*±‡_¾ÎÒç‡ #¬õñËOÇßW•jþpüòË¡?µMÝÈú*â‡+²½^é^>¨êëú¤U[ÚÀx¥»^iNRt×K·+OÃ=_½ùOOÉÚŒ(;Ú˜ûfž«ühÞkßFió1&96Çš¢õ˜\¬¯šs–ï®qªusY>Ç™òŸ¢½4.+á1辜™TËZu€ë¨Zl§êG¶S[ËÛ¡+ãK<º§÷<Á{ÞÃ{> +Ϻ‰µŒs«Ö\Ãh[Ÿ©Í}“ äjøÀ`âƒ,*“‚1;ÍÌï‚Äb@Ö˜kã©p"¼À6×öOû1Pãv ÷+ïÍ)Ys| /’?g·×¬|6¿J >1L@N“uœ¸)¶x°àSûµ–:­nLæõ±o%èÂ@aAÅ œ­Â3€Wâ?çy9±×u¦Åb«VsgßÖž­ÃâÏœÚ:Wø`ãç1䨇 0¿áä«QÁýZ˜¡K”jÔH­J ¹k¼øÉ\kk'=,³Å…¾Mø„@¹‰xž¯8(”ÀO–:^?@\™•ŠÎ¨ì:ã|=‚·MkeO¾¦}¼ð›QQtU›ü`Kᣅ¯0\‹A*P¡Ù×;^W¹ãÅŸE<5u/çNͦœMÈ‘p mÊ,=”S×W[ãs¼cˆ†ÂÐÀ(^2¬¬}ÈpîÛÑײÞZíø8:7oUH|ì1«€3P ]ÑïàsöÉúHk àsFË4—'æÑ›Âµv¼O Gƒ÷¼§o‡ðnÃ+œµVø4fò#ª>#¿ÕÍ,¿upH¼VÛ9¨ž@ÇúÂç`~ëðH3NSÜ5x;TîàÞð æ8þPã5È™x;R<—Üé ‡lêÂ! ‡\‡”ð}âòÎÂ! ‡œ‰¼5¢}”%pà¬LìÝ÷Ïeå/átÓcå˜IšÈöv·bôšÝˆb5’$e|ktYßÞš²…f0˜«íðûù'Ò­'hš5'Áº7uš®I#Å”%€ØÈ¹³é…8ö­  =­g‰¼ID3«Í)£h)Ì(±çyv—cO/sßÜžrL¡„tÐZâ}>#šRúµ`fN«•Iâ=•“Ô€3·!v2\«FH«H›é–¦P±ZþæKHíØùrä¼°ŠqŽ ÒIª;8Æ,] §±ñi«œ³d8vÖÒËerotCœEà2ç9SE¢Hƒ¹ECŠ)Éî÷YXeÙÂ@„?ˆ¶Ÿ£Bátba´Þ´¬—#<ì°‘[. }]ç³–V]`dd+î?øõð9{Mþe ¯7ÔÝb¨ÝµžcJ­œžŠõd츂šz…¯p\ º:<žž5~x%wp‹V»˜¡*x$œ^0 ‰‚!Q0$ †DÁâjCâÆvvÍ€!q·†Ù0$nÏ\¯þX0$H,¢`Hø,Òj¤QžzO-ýÏ#§<>Sª¸˜Ó¸¤R"EÔ¦p‹ùŠ­çú+å´Xl×?mÓGL³$,á@-êàÐIGK¸†-R²·š¥˜2K(ƒZ–JÀcU£§Á¾ˆÂT­µñÏbI/–”µí%.ê³ÿ%.º’¸èz”ÇÏÜJ<³iLͨÄ3“Ä3/ }]g1Æ3ÛZÞ°D<ó2…×›/žyÖÄû‡ÊÕþváã#_4½jøsÛn®T“lkkóžwŒ{zxOîYÙ96­xÍ×ÞÃ÷hET§!øv÷œQ8éñŒ™”'êÓ@xa“ž3Øö¤,Ôü¦íxüÕ0»{à›Š'ø>ø95\üæ6ZqFÃ3P§ÖÖpF&òh>ÌÌ-åñÁ|îÎ|ëQ„çiÒ¾‚WªÂ4÷S¿ƒÆÕÈ«¥ã ¼‚wR~Žƒ^«ÔFÌäèè à›Ò[=Aå{Ï Á¶YÒ /ÇðkÛµ1ÔcNF ¢.DëÞ©÷2Äd§är`2×»Ífy$2ô¢˜S¼´4!)lë˜ëJ – cnëMxÄ©. ðǨDLØÈ;Nõyˆ‹Œ9·–âyÒ–LkÅãèŽ|ŒšT¢³šÿZYÂWæ£üoD1h‡Ws.Xá Ì"èB‹£GÌûäSŒŠ-±öA$gú1Ñì&glj Poâ¦y,•eEˆ=Ù+€OxÄs•ÞŠíªz‹Â1*áð„nA›•ÛÁ÷P4¼ëh[aÛÎ_ºÛ«±ÙR´¹®ž •ýŒ0þ1£´Þ‘¡‚ñÔ`ÆÍ º0a¨€¨s“Œ+޹qv–Ža|8¼sœl œE…Qú$Ìn’pnª†ûÃÈÉÂ…hË]p0#ïƒz¨Í¹ró0…0vÎÁG1…À8 ,á©w”Dr²á¬9xÛñð©g´É^L•—q|•œÖi9/K^ïeñB›7d°À:ÅX<‰`0 ½¸ tš,§Ï`,EqÓç0b”49ɾýq%ᤇTØÅÔ¾·Ä Kq¬‹Ö1¬_¦¾|©7[AßG|ìbwK‡3ïÁ=äì/‰ï‰ÛGÏÑqwžÄ=aO¼ ô¾L¯b˺™9¶´Ô'ëÕy@7IHeW&O¤¦$OÝHW>K°¥ZŠ(ˆ›1J“·I“ÆV"¸Šb’oZ+LÅ`Eø9„>ŒÀŸ4ûM²"QzÑ.e®rò(jŽm´4ð>$!3œÕ«Þ3ß¶É IìoˆÛ“!uNkCå²wK9ÕÚÎÎi]Êb€3²}I‡ ðü[­yv·uÎhKåc¨bQ°‚BHQ0™öA/Q’ª¢tK¡öðLRêIÓìLöGP¿X;‹ÃãC˜)ßrCÖÖpsÒè·[( €Ë§k8¥h1þɨY¨jj,ªpE?¬§—¸nâQ`\…ê^Á÷‚Ñ21.z‚ÂoÊÀ½Àë6êu q;d (­¦· ëÓ*;X‹½w¢ŒRÆ ÏäVÈcÓ®IûÓàÇ(@!$”ÏÛV›_Éu¼‰µ4b"ÚJâ¡cî#ÄJ°Ó±EÆ%¡†Dl¼˜V£“2ކ;r(aPmb¶aX¥ä¾35Ö[ëáµcœ‚BF"­­HY!–L.J¿bz"vJϨîÌÝ]ªü‹h"(€ÕɆŸ/QƒÉAQK*’t|‰S¥ŸÇ©ÕÊÌR{gÜ‹¿:ßò€UÄLpszùÓiÈ1–5ÀóŽô–øl¼œJŠ€²?Cöõ¤ÍøÉã1HYº×õ¦ÀYÜÜìÈlqð,f %ó ï•Á îàÉIÔwŠ€†Èé|។©ž>·!žXÅKÓµú—­¢ÑXÀV§QZ@[„|ƒ¤†±6XLê& QTšÃïBÉY“ãxØHyêû ¡ ‡¿3ŠŸk>þÆSàß8€aôRÜM`j›šÅ”:#ad•½ÛÝäN°p扵Ë7º¬ŒNÀ =h}Mþ6³ÊÑÇhÎVì»ÙÉØHîzþ7+8‡w;‹!ÀÒZŒ!‚QLpp—ãfè«[ã­3Y²„Ç1òÇ„à$hÎâV¤¥ÈZ™{SЀ\ÏY5Mhxå­¥—<¢^ø>Òµ¬é÷(¼ øJ¯`)€÷ž g !?ÐxnÑu8X×dtÔz~å1ÂT޹¾GÃçL@JŠËÆÕIKjɉg§»©-Q‘`%¦xÌoç8dzOE-'MÌeåÆh¨%#ŽP»áHLPú )R³ w-ó~©¶Å‘ãs•±"³¬gÒÌe“o½AM”,·ùü`ÿ4B óP H¬(Ðñ{q#³ä+~“K÷žNŽ>!Û€Zídgª½ ŸY…Û„JS7÷wðrŠtÒ$ Q^˜3i+_ÓšŒ »Îåcd°æ´œg} ?aËðj+Nú,qŒ¿HŽ€ ÛÎÜîtÅ|.÷s׬nÿqd{ÀÓкQ接1 —èdå ¦ªL ;ç8Ÿpç¶FŨ£Hj Ã褯–æi`•Tc>cì­n§lþ{s=gͱ7ó0¶™Õ‘-–Ø9{LK,±ÄK,qÅ.娻µÁ.áÊ lz¿³=B°l›“£œÊµ#2Ã߃!ãÉo dpÞt‚KzpÒTß!°¬©zºÂ!™…{L™bÛYÌöF7)³=²Ùî(¸btSt¸”ñNš:4§±Ù.p ý\Hšã¾i>S¿[Q(‚ÏtÞÝ™© «P¦bÁ]î.O—„FÜꃽö ªV‡rà£Z>3s¡(¹x9pfÈ ©ö9ŸÚÕŠRk»€ÚÅPzµ¶¹TŽócW'Jrõ !xïsµ,æ4àb´•¥yp‚5„Dñ€ä¢YåѬRê­2ØË‹éñÕµíQ°°’~“`š%nÚè8d ®\.eJÞ.}f„Á‹•¤‘ìûˆžx„Ï÷Qó¶@ë‹NjCˆäL‡€¥F€‹Ú{’,w®ÄtO-âµ Ÿx‘™ [NÍÔ`EË#Ô´¶ŽÃ5|Îg_Nã°Lb\¦ê¶Lç·½¾ìÙH=?àÛAÔêþƒ_ŸÇ5Í9£3ê¶°6G`éÛ3)(¼]ˆSV#òIh¥@ig_Ç£·B-0DOË”6°·ÞÐq}QŠêwª}%F°R ì¦¥â,'N $ÝBLYñR5¦@Œ¢2ÆÈØæ0ï8-Mh֜nE–‘›1é§«¦Ü±}r=‡}bUÊàçÌÕè=ÚåšE€~´ DYG1£¶±Â;ljç1ö”ó>DYíÀÌYëYìP…$æi4˜ÚšÉïídäqf옩9Š#±pƒk€Y¤ƒÝá5ÀG߃™4¦D¼? 8bÇêà£Î(Ïœ…ÉNê‡nM®‘¡Ü{x¤j_/š—ž¿m€(ÕŠA Õ³÷W·ƒL!ÇEwT¹b-Ä¡ß'gj´ào+õ1+Tcr±…!wWåÒÛPªG«ÄíÞù8SK›µåH›Ö‰5B&!§?€ ÇéÞ»L/¥¾Û CTúm†DCK—;R½þÞ«u¢F7XIIÖ”KBT§¦¯ÎºšìõJÔ¯¡T´Áœ}Z7ôíÞ™}ŠuÚ «k:œì“(RbbèÜ`e¬Ô¦j²­ÍS5lÏ!Ž`â÷›NŒ¥«M.T°TAàCôæJ%È(I¼©«Õíö[@N®ëfŽv CSµ3‹¬”ž^M[þ„l/[LaÆ#ËŽ`!%2n—uG‹º7ö¦¸£"¢c¥VëŽvdü%´Ë]Yl½;Åâ•¶9Ä’Åiî6gu•¸Úè.BàSU&$×¼I3žê͈š b¹±¯+NJ’·–2ßy¬w‰'ŽjÃé„ÏS &>W³¯/9KmcxùBàÖ'îwŽG–2?©Ó¦œ¶ŒKe¸»Wª¬Ø×Ø~zc¹OÒâ ­„ïsê+ð;Í Niå,wûûÆTŒ,ÕB½.}|žSª…ªýu*ÕO¥úÉ9ë…«ŸjÕLzÍä·S'Ò(ÕO¥ú麧wŒãü÷øýÌ!Χÿò…ñÇ×o$@Ÿ;¨ ONnã¼u–MuÍQœ_ãQRG/šÓÕEpT•~½¡Msj§­ôúdiÄÑí©}ܸ­}peÐÍ•:Éþap·®OÍ aß®´ð9¼§‡÷ [ÝÊ“¬Ô+ð©‘@6õý'Ïð»£ñà ?¢{F3äÑÞc´¦h÷Œ;Fy÷qn×@u—ße-^êšjø¼–N賈)«ÐgEå³ÿwññ¾¨Ê_ÂõÁT„)Ïñfxž¢ì{×UÍI\Ò_>î_yÅ‹#òáã§ÃÿhÙ»Q endstream endobj 5381 0 obj 6039 endobj 5385 0 obj << /Type /Annot /Subtype /Link /Rect [420.959999 476.179999 466.079999 483.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces >> endobj 5384 0 obj << /Type /Page /Parent 2 0 R /Contents 5386 0 R /Resources 5388 0 R /Annots 5389 0 R /MediaBox [0 0 595 842] >> endobj 5388 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 5389 0 obj [ 5385 0 R ] endobj 5386 0 obj << /Length 5387 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ÷WÔ:€ËâS0`·íY0l ‹ ‹À“I0˜Ä™E~?ª’T]MêâI=Š6ànKÉû¾ä=|û§/ÿ8ýë÷ÓÛç/ÿ9}~>yªÎ•®ú?§Ëß7÷ðæ,xÿkݨ3o/Nß~}ú~úþôùés÷ï÷'¦¯?ºÆñ}‡¿ûíémÿò§þ“/Ïé~û߉ŸþÜýïçÓßþÞýøqèïò…_ŸšV_~ù¥ÿ…qÆ›î?÷¿]ÿýô×?œ~ë†Ð\û½üûF2¡´lãûíQvý{ÿ(zYuRL·JŸãÝ8»ÿœþûϧŸºÞnÃ8·’±Z˺šÝ+ºë·Zžšî&„Õ«5¹¹}-îI¶:RO—1±e³káúZ´ý<ëå3½õµ¸§¦ŠÕÓeLlÙì†ÕÇ=V¿æ—.Ûî?m­O¼“{òð^wµ`ž×ŽV«(]GÄ–MU²vwE]úF0ÙOSñ¥+vëjiGRÇYúëˆØ²© Kowõ9ŠIâ/&é»ãÁ÷_ŸÞ~j/æ÷ëOÝ0®6¼ÿñõ:×7»ÔÑþ맪Šé?ž¾þ|]ÿAůÔ窵꽀¡¥¹¶è3gÑ"¯-ò,ûGîZ>^[Tç64Œ«»V™/ðŸ{kôð}ÕsßÉíþîúcg%õeBs ‡µÆH¬ ;ÐâÃì¯âUãõü¡õ½~üÚñð2ŽdR4€)9oM®ìGØž•µÎµTŸÏððg„€-2Öb!ñ•6VÊ";c=[ó‘îs¨À*¦ÄÙ $ËÀUЦ“J¬%†XØÌ™ ô|ù€šžëÐA%6°ôÄc¥âи¸…Ò›5 ‹¨&àéX‹$Zq)Ì÷Zcv¨bŠXbcå‡á«J\'~7sÎ ¬1i€¿ºk«Ž—Í6âÍ5±€g‘”ëm޲FFa¤mïVDÏÖo~GCá^dz“µÃW ¡½é¦aú'ŪPÔáÇÙ¢Ào˜áúÑ”E¼Ž!ú“ )À÷ª”Ug]³WAŽx?¸±SúÕ² - jŒB›ööj‰bÅžë¢ØÜ ^ò(.%äÄ(!Œã™ùëຆ8Œ–±BÈT™"GbŠ}Àbãcž´Y!­%i•hç p¡…-ïP‹€-²‚½ÁLEz摬5Wj›Üï ¶ìÎÖ¨-(Y®ð˜ÿÂóü£”öñŽÃ#x·Ìt¯s¨·£SwSIÞ¿r*él‰VœóÓ™=‡¸À»I:3Õ´)IgžÚX©Í&ïq>{GÉâÜFˆŒƒojÊáòã´‹©+ípˆ°fçäp$%!;×ÈB­”~–e.éï€íEÌUp(Ü´(kiòÌŒ¤ØnLªk“®Ø‹#˜ŠÁ–÷ð=ØØa¿ø#Á+Õ©¥F×Âkž(® !›ä§%ûX®Þ›2aÙ©ÖF–/\H¶lîÒ?vg™´ ƒoV4:M#M?˜2ƒ†œ”ñöÛúâTaZXûnxZ<5'ŽÞT»³ð­6‡¾aÇFê ¦ÄìÍñ ^gØ’<‰ÅeeÒ÷Á\ŒÄÉÙay››Û‚s™PH8̳V0yBɳ:¼`œ¤Á-X´á{ÅCÇ™k¦ŒìÝ$W [ß$½7UfÙjúŽ`êcNƒÞ ;n8ÿXÞöœÉ¡°…-اóŸ ÛÚ¡ ,V‘Éö5w«˜Á*:²`„ílN25§¸Ï°±ôÚØcAHSPÔ‚#åP$>ᤠV³òÇ­ŠýûŸ´Hšé1]ŒŽ+Š‹‘ÈÅ eÁ(® ¦|Ç£Æ'Qr¹ \ ¿ÎØføe臣þŠçXk1Æö7&Keꬸÿ)¤0¹*Sñk©†Ê^ µC"ÛÊ´$åtêôá*]oÔ*dp‘š›ß^Εf±K½š:€tæ)à°5^¼³­ E£p¬i³ÎÖ:2ó¡‚Vˆ@ Sí÷…H[ùß<šÀ!Þó…ØÁÛéÏŽ7•aŽš>&ÙÌp~÷„8TæÚÜ»o½z8?ã€u /ë0é’=ŠÞ·¦‡×—@Øõ3¡a‰`n²x¨­Ì˜ x<rS:ÁÕç¤/È€@‰Q*ÃH9Á´Õ¹¡beWKš; YñJŒ(WUaÑ¡Ã(}¢ÝÒT%<¿º&@Â1ÅüEÕx™³tÙK­‘̰¹xÒ²€ÀàD>¤îß”…£Î©04ÔíYrJ´°ÂA°F´†m²ª©¢¨],Ù™kç€4¤Ý Ý>žÑËvr‹²ãJ86އsxz¯’×év~A‘ýÁÁ]N<® 檩QãÒÊLqù ¦~Oú¼ŒdÕ´”$}§4ß¹á Æ6òR|¤&Àd)þšå€ãüÃüD¢ß}r¼fþ™¦Up¢ß:`H‰¢ì&®õb»£Ù>+*‚!©J1úo‰{vÕ>@Ø:[™=ÒzTMkڞ͜XL¹ë¦ÌèdAyH2.9¶ÊÞÉñøfHä½ÄöQëi3ƒ3p+ƒw¸ƒè6&õr¡jG;v¦v.›ü¯×= NÓdm=ú‰¥^°Ô :é3DSÏàx ƒT`X!M%„«ƒ¯h`˜>ð=X~âÝÂ3C %Ó~¢ÀNNç`6' W¾äP!±Rš0‚Ã)_QQ}²Š“P ĉ$‚ÅíŠÌJ‚ ÍôQá-ŽÞ0|W½„‰:Å”¢º»‘4ª9rðewçã0nxu𨱙 (vŠáÅ”£è*Ì;ØWÄŒ] ›!¬l˜ò+!)<ªcY |6;þ•4é>”64É®Loœ ’é ”×x&#>2RwÑëQˆu%Ü#kß ½Ä8` 0ŸÔŽZŠLþÇv­ï°]3Q +ÆP®b†[6(2¨Ò/eP9FD7CE™FáÍ·d®ÐÇ$zh¥vª/=*DôfKpW¼iðèñÍ ô½ˆi­”aÔh}nbºËk*ö”î‹™©£e´­![eð¯ãfÙðÔªe¦Ÿs‘ÊÕ ¨×‰O@P¢1lQæÇ¡k¨Çƒ/Va5ÊÌ%yO,öŠXý'³¨ÌB"ÏvZw?1Zܳz"²ˆÕ /´èH¡«ê|Íe£TÜðËÓ‡0§Ñ—!Ljÿ¤ûõùNJ~“‚Uº@ù¢âœNò¥T²`£ê—û»áùä$X)QFyeÌ-Í.}¢íÄ£§e7ä•ÅH€Zi À·î–__%>ؽê̵4dÝX»C”´s (Îáç<啺¾Î*匥œñ‡]”3fö¶M— me-¥ö3rí' Õ¯aÔþh©Õ°ùÄE¶Á3¥Q¼Ö¸å`”sD«0ò¤Ô4ÇÅRúxkÁó˜ÊšmÈ„ej)…ó4ƒXLK1-û¥\.Óâ„ÒU™Ó·acÛTmÍ[ïP)Ø€øV$Ù<*b^‰3¶­RŠ1Ø+å¶gl²¸–w@‘!‹ `¬Ž 7f%ü ’Ub%9%‡ÅÏ4“RÃZxEsåÿãRc;PÐ3Q¡˜ñbÆ÷K¹õÍx.˜ýl3õ¥?39zÄêÝ<ÌqÝŒ7¥8âáh‚½ög£y{eÈ|âü’ Ç!|´œPdhŸu 8K©“ÆE8DýÞÓÄ\] ƒ‘ЇÈCHy|ªª *&:* ™Õ¾.تH..¢h”óìYÁGSÚ iÊ{â+-·cRHW"¥Ž%™QÅPÇ4 …RëÖ§¾w¤ï*RÏyÍZSÇwßOψ‰qJ/‹ÜϨ97m¥§*¬ÃàSÉ\[»ÇÏhØ‚ŸcãÖZ´ŸI>{ñk†¤ÙgÈäù¬ÖkØÊõ¸_13DÃa)™g=ç}ïÑjä½3é`â0+ú°¾ñl~Ãì4¤nÀï¾Í÷#I¥8¸"v‡Â³¦AѰJÍá™–$kLqÝ0lD@¤„ë³âÂ'-pPå‡a:J\¹÷Ž8IŒšãˆ'’á¶è†;Œ'­j\(1V-àêÛÖbé"ŒÄvd)õÇÖ ñûplì¿0%SÌê ¶ ó倂tº‘.%þ_mÅQ°H*‰“̹@³(~Jn\À¬cl-!‡•’0ÃfT+ü  IêóW³³1î“ PÊ[v§c8ÍþÝ^ð.é†4D2$MqÄÁ«}“ÜÞyqÑhƒ¥˜Ý5êͳ§„î“­)•{V×q­üáaÇv½¥“ßPÖ†pàx2{Ž ¸ÄÀú E±Ö>ôúÛÞÍ aíÍYß° œ¢mPzB¢–7þUñS™˜Rù ?ÀkXµ% FŠÝè$@õ,¿M´®ö;ÒBÐ\Æâ9Mår$k;»áôLinÚ´7×g¤«{|÷öv;ŽÄA>´¿z8ì@±Ãõ„*CG]¡þpŸx>2GIϱÍå½ÛçØõkB´'$V ),M„tC‹œrV8>_ÅGÐZ;Òœ¥Ô¶8$˜ ?[Ö°@WQ¨}Pí’ÇŠ³%@¥¥´”–Ò’¦%r´ ½ŠÆ'Õ»F]·ì<ζy‰†ˆÑP8®ÑÇÍdÆáGS0j °„”|Ü­^ÂõŽü ”&¼:kDàøƒê§<ºFà;[Ö5¤\!Å @ºâQ—Ü@^^®µw¤›úÅWš`-ŸÁÑ–Z¬å)PÃqe†¢ŸðØ(Å7‚\^ãSÅÌds %èb¬F‚_åØr=NÕÝÄãBínÚòQ|5JD%kL‡†Á±1¦ÎwàÕ)ô‰MŸ5OËïiµcmì–ug®û ¥à1Æäxìq2ÇEšhÒ”UfÄ­¸ Ÿç ´P®Ô¡Ä’ø´ %?Œ%ûL¤x{mQ/6%íÝÐù ǪÛÍÖ™p³^ÝÂÈžE§@K¬‚JýÈÖ‘=q®¡m¥zTSµÉ#¾TCz<ûÑT½Ppµl6ôãe†ŽZx¼þêŒh×PR9Й©³Òb-)G¤ÄBÎ (îNŒ$…À#ç”±:V|ˆ>ÀQĸ{< Ã}“Ë*Ç ˜å’sa ¼¬•™îëAJœ—‹Ð2BBÃåXDºl'ÝšC/™Æ=dr3Üà‰]A,¤¹-È'B?ÓWšo¨mˆV )Ì…ùže5¥$7É‹Œt3Ob7™d΋£“ø* š™:ð˜ö*åU@còÛ‘=âÆ¥ ÜlÔÚtw®R,e°§L!À´(Jº‡†’aÞ§ Î\°ŠîÏ8“¼'EŒÞ噾 02¤ô Y±GA,³ Ûògiø1ÆÝÃ]ÔS‘Qn®x<¸^Œ¹™-5ÖŽ§ß]î$!b{U¶Ò ZÀÕnÛCŒ““Á_Ůގz¡My–`ìŽ*¼ÞédD‹l„ÜC•iA‹tÍç±NŸ ­wÀ±ëcç´ÈÃÊYáøÐ,XA‹<2TA‹Üµo”_šJKi)-¥%sËÃíÆ'8èɆ Å‹†2¢EÊjuò@‹<&_æá1.vÀc¡`×<&§*Á»¿§ï]÷Ý£—¯?¾ýêxŸ=Ðêe ŸCu>êc£O¬[¼)³–éóuÓè$nêz€áÓú¬§÷þ[yîéa‘×çÚÜ&ë‰XO´ô›DBœy;Yå®ÔY÷›N/-5|OŸiá3=ó×üÌ«k5)˜S½õÎÏý'àw‡3;3ü„žöߦZšÇ°}öÌ@±¹c» À®»üηޘ‚ï«Ãù€aÊA>Ò¤)^Ñáèõ¬ïâ7bº ÷ÂÞ¿®æ"ÌyŽ™a:> endobj 5392 0 obj << /Type /Annot /Subtype /Link /Rect [85.9199999 133.459999 138.719999 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 5393 0 obj << /Type /Annot /Subtype /Link /Rect [160.799999 133.459999 204.959999 141.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces >> endobj 5390 0 obj << /Type /Page /Parent 2 0 R /Contents 5394 0 R /Resources 5396 0 R /Annots 5397 0 R /MediaBox [0 0 595 842] >> endobj 5396 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5397 0 obj [ 5391 0 R 5392 0 R 5393 0 R ] endobj 5394 0 obj << /Length 5395 0 R /Filter /FlateDecode >> stream xœí][¯Û¸~÷¯ðsuÄ‹n@Q`s’èC úPô¡Èv[,6‹¦}è߯dIŽé—á–lm€Í‰uL‘ù’3ß¼ùã§¿ÿùßã›—Oÿ>~™ÿ~ùt¨NUSMÿÇ??\ »“’ÓmWŸd?þwüòõðíøíðñðqøÿ·ƒhÎ_œÿ.¯˜üï—ßo¦—¦O>½üyøéGyüÓð¯_ŽýÛð×Oóxã/|=t}3þðëôƒBvÃ?®þëð—ߦÐÇÿÿƒºmÛ&iß._ç?×_E/«Žµèt+BÈažõ@Žÿüãðó0Úe§^ Ñ6º­‚GƆ­«æØˆVXƒZk *u ¦ehœ‘H[š¨tëŠLú¶‘Ó2•J]èe¨Ôº^ó 4ÎH¤-m!=ŠJú¾Rõy™²«z*•b½=Ï@ãŒDÚÒfÒ;†"“^kq^¦’©\*™bm£xg$Ò–¶E&ý0æy™L]ç2R"Áû/™¤gœ‘HZÙBxs¤,N€üî|s|ñíçÛýèð|þy˜ÅÙkšþúüõ ‡Œž@7<ýéøûªRÍŽŸ9ô§¶©YŸÝ¬é‰lÏOºË•<Оª^µuuõ«ÕËù‰ùUsTQ™ˆóBž´÷5 ½FL¯ÑËWOðÔºó“æ$ƒúÄšR^1ž#^—cøÆÜHkÒø»p9ŽmÂß¡ìÊûó“zpõ;ñŠAchoñr8+Ùä³ÃäÓpFpY–@8¦†‡Ç¤ð.GOS{ÿyÐ[iZHhÕEÔÖgET«~yk;+¢Úâyž(žÌä½õ.þ;UŸ¼ƒO|ò>yO$|׃é†G“?ƯG4ê`Zã÷Àõè¾ ÇÖÝ8VbŽý@Ø<üï=ä)Š%P`iÂßÁ‹%p—³EÎvŽ¿MŠe;‡wÓGxÔ1L,ÁùY³†UX \EÙíÕ.e¬xÛú¥i²?ÙŸìO ?aŽ6¡÷CÑøŸ€7v]³Oàˆ8Ô¡D)Žhˆà9;f°GC´hèmA§_ù+앞8tÿ%æX¬…0})R 5$ž³dÐ÷§'5¢Þ€öuDd„'¬“žNÕá1¥7ÀcŽS&íQa«Õ²÷ï¸Þê¹io«å !ÏM»žÒœju¾F¼"ì4HÔeël¦»€_¥Ü ÏþÁÕB­ËH|Û‹ï:áõ+&Ž}ÿ ‡—LšX«ÀôĤÀß±†Ï’càØ?mNÀâψmÃëô§%À)ʾ/bc÷V¾‰d6UBœjÝŒ¿ÀI#¡^.”ïß°Âü•œÆ¤×†5qì²?×%"O&BFÂuÔÄ)<¦i}b¤•9¥=å˜6’…å8F¹z¶¸ºÛX†'óHj3c+Aü^^QÊâ78Øol„›fèUZHo…$sŒ'ªSÓŠW„RK4[ #XÁOV¨vÛq«/ÌÓb¡O–0¯¸ÅŒàqlsr={Çìq‚lÄŠá2ì„\¬µÂ·8 üñ'“}Õ<ñQÞCÙš²ö ÷mÕ•ª“†áØ33Á#+ÅåsksZ © ²“ô^vƒ¡¥ P ¬e!¶ÛkY JÖ&´ýn½öÚ×zžë~£Ú;S|§í¸?ÅÔûVŽù´i{Ç/›Ô5·?wÏå_{vQ§Ôα+âØR™ ÜSÇ °¿}ìoäÌñ̉º=_ã Óš²Û«°¿âÈ)¤T;­Ã·«å²†Bٜϣ;­ É\‰ˆ%ƒ"+A©…Ül®k×^NòKåˆõr9hà¹O¥Ÿ£å¥p§Œåî^ »&Ë·d”©ƒ'2e»mç–£ë ŠlmO•l}{JÊ`!`é82Í›2û:‚r¯™I”ÕÜÔæÆp‹ÅõÌ„…g&–$b.VLiy¾›ëõ^Ø]xyÚxa£ÙŽûwÞ¾æ4~ÿë¡Vêúƒ_ŸŠcäS04p©4’NØnYÓH"½(ìlç á+>B:L‚QJ¶¡ibô½I`+ ‡ä· œµÕ1I~þÄD¼}þ¼¬a(Õ&˜Å"ªÊT ØÉ¢[@à’›•’±t÷„?•|I‚ŽÜì9»•PºÒ(Ú™V†&3`iJ޳2ÅÅayò¦$%¾cCq±áÈqv!¦I¸ŒÇÔ)øÓè927×Û·Âtó*\eN¸ËRp4]Å–_µmkÒÃÒ,¸Š`Ül†ð{I º –‘¤]c±Øƒ!'xuŽHbqHDùf/rmA\¸¸]`¢msnN×>ÙÃó'˜æ}€¡œû°Tï&Ämv™\¸ÐŽÚ(Ú!!zYóFúc”Ù“ˆ:˜\»+oúÆP یٽ ¢4<Ò] ûi|:iâµ›¥ø»g² üÂÆ0SÕ§pöµ¸¤s)+œ5©ýÌݽü ÀÁDÅM{ôZ.zup¡åÞŸµG²î¼óaöe°W@ZGó ü‚_î8í`åŠgDñ™0 Å:k.‡Ô©•”¦,îeÝmG‡óø‹úÎmʽ}Qß¹_n$…kôª¶X™NÙ‘ñg&2ÆTàâÉð*„ˆ¤Ö€b8–ª­ûtkigKÁ-^Òžnȳ Iõº„ÂQ•2…¼T;^÷cnm¨:SÎÔœjuν²‘ÞD~v‚’gK@4. ËiXtm2Æ#ouW„îÀËÁyõþ¬»ÍDÌÈ?!MÝÁÖñI T/áûÈÒ§ˆõËìÜV­!ö›Î\ΉªÕiSAn @‡bÂbŠ, p/„®-Ö%`¿DP9&ÖBü· £BšâfE4(ËŠj–):K¥ (4ËÍàz@bºÚlRV\ØŸ…hT Å,¼‚ÖÆLi3•žY÷†´lê ŒåôÄ[19ÓoóbP„ÀGÑLB†Ý? 1Tá3ÄÌà^6°Äž5Ú8Ôà€FŒ9$ã@³Ü&—#Ëžà¬o Û„¯†2µ2,Qîúv×·DDQJ³Ñ|Ù·#K—¦dÑõD}ùÛ¸/!ï2`’to*ëIÙzÙ™›˜%tuÜ'J‚Ÿej“¤ÈØ‚‚5M˜¶BÐõ*KLèm'§@i ¸ë ïW—Ò,ÏIÒÞkÜ>aËöX6-—‚=Ïá~óêzˆoJ¬°\“z§”9ËÓ7*7a—¬Ø~ø[ÿáýXjM½!Ç$Ž×Úýi`&3 ýzMv-÷hZ.)m3Ø€û‘çzn5¡XüäÌ¢j{ê¬ñè?âá=Åü%Aº]@Àvp_×{vpß¥ÈÆ•jBŠRà´ž‡n5æ·nŽ•jÈo'í%Ã;ʉ¡¾Ö¸PÏ'ʽ‰R@¼ ðrݧ@¾íà容m¸x€=;¨Yžk•¶ÃlU;¼’[žwpà˜hõ(ëQ5Ü‚Þ!Á@a]E‘,¼Ò•C€Õµ>;œ©““v8S5) ¡%!™šªxÓ§ÝÏÚý,v?kíV§‘)͘v«Ãnu0'´®v¸¨èŠŸ¯=˜Øa¯]Zd‡½Þý~a‡½ž´w[oá±Ã^ï°×ιí°×NݹI½¤ïÜÊ­´Œiõå­÷‡½n{ýz³n#™ ‡Ž¬Å„2—˜¢Ì¨Å;üô?Í(ø²¦°íðÓ·á§ç"ôï”zløéí•L ¿Þ ¯™¯9gíF^=7Þ¥¾fŽ œÖä­),¥ Ö;yÁSœýºzaB’bñ)G21Áö_SH¼¢ÐôIiE BŠ0hë(…/o"ÏY…xøˆb´Å³`_±ßE<¦=óVß÷pÜŠq'Tu9zp±”¼þà×Ã'‡å‘¼q †èù¡>ïqñSô±&Žã‹áñqhD/¡†›ÙjÓWЯ„c0¼³pŒSð 6 ¥ʈBbl•iÊÙHðd„¹µP,D¬w±ºæj"EnAç@ev o‰ÃäJݪ´çè"£nPp"o¼Ñ´¦Å•8ßånFŽ7ðYŒ/ÊÙjEûÕo^¥ç K ù#|ì[Fœ¦À§Y8'ž`2á8P\È.úñÞq†¿M„„·!¶I¤`‚rÀïÍ ôÒ&Û:Q h@Žï‡¹ÛqíÁhçGW­:ƒ”™ƒD€ƒD¼†€]Ä‚=’d¥ZÓRìXÞ9kk%{mÙ1B[5––¿˶ó¸ÖÇ•’ àw"„™ãìÈ |&)‚?³žz‰‘.†‡rlÊçʈ.°Åx; £Ö#ó=ê`›™$×Њ9(g¥Ø€[|W‚rç÷»¬-ÜÙXY^†ã4¬o…b¬ÿö=*ëzÎ+.ð6—2XÖc+'³õL0s,˜°¾¥»<¶ô–¿‚§qMaKܵ)ÝDi;*UÍ <ßõÁ¦Á:s&nöÚ TþÐFõùÎ7¼ˆðÑ#¤ Bì9î¿c²Àý¹\ y`ws¢·sš½{þÄ…–°,­T¦îzÌ¢øœ@ëU_ÜætÂÜ7»ÈÀòWYÒ—"¹»ýHÈVº ”¿+ª–M° â*Z‡;‡ëk}È Ù¼ï€;—½ã;%­“’ðé;€-pÈÐ5~RÞ»‹íƒç§múÀ8#‹Êª1xt®U¾•šqŸÄq½½šÄ.&ø\ž¦e;ÃÁpÁ&ôQŽÈ"ZÂÀ…²úô´˜ÐvË(¡$c  ÕijTyßý˜„Ã!ˆÁ `IÑ˃@ˆ]“ŽEp#Ôœ¥“um Rj1Vƒú—¥Ç<Å >¢ :åp&¢©zæ41¤2ó]ÕšîÐàp›RKàx¡«G@ÊËL)Y*ICÉħZ³äذÞç¬ÏÌ÷UM` ˜Ï†`Œb¢Â5 ‰‰ 3`Þp7%ÌSc¿†£8%ÓÊá‘„'®c¿#à–("•Þ|¯=úZQ¶ÿ±8Û¡æ'§]è…aJÃååL’?rw÷Šc–‹l“ZB³ÖME(]J¦ZxK,¹¢âó»)–‰÷üÞ¥ÛI õùk½¾§¢;di†F[rD¢Ù»@)9GnYxöI<ö­Ì„=P‚ÿ”¼tÖ’‘B87wËÜOâ3áp¬Ë ¼ëZê(åPC™ÎH¤çÁcäð: u§Hyk~6UãÊ˘&yHÖ¨%ŽÈœ‚ÏçÂm}Êù\|N(í^!¥<< oõbª¿“Lwëƒ)/£¦ž¯\óî¹a﹄ÆßL¦oSö X¸-p³*\ ‚Û1Á –¾GÃïØúÍñØp]À| U4n-g€‹än:ßSÃ$<7G;³µ”4Üz¦¡Áè6×SJN5œæ*_c\¥e ŽßU8¨¹ñ濾|‚¨¾B¿þèT«Î¯zõq×ŰŒ›µÈ¢™rªºx2Óæ4Í©¹íjöúÌŠlO­iè&¢µ7žLÊM©“ìofnÖõ©™Ì”éÜzO¿ÓÃïLán+O²:÷éùþä-mR•ן¼ƒ¿;[ì+ü€¾3 Í­'­cš¸ïÌ;³öyngHàºñgY‹‹ PÃ÷µñ| ðÎA>˜ˆ}yc”9 ú]üF¼/3Fóõ!}0aÎs¬ ïà ˾w]ÕœD;¸ë¯‹»ÀŠà |ú#§>~<üvðÞÈ endstream endobj 5395 0 obj 4967 endobj 5399 0 obj [343 /XYZ 40.7999999 758.419999 0] endobj 5400 0 obj [343 /XYZ 40.7999999 758.419999 0] endobj 5401 0 obj << /Type /Annot /Subtype /Link /Rect [62.8800000 612.499999 510.239999 628.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps >> endobj 5398 0 obj << /Type /Page /Parent 2 0 R /Contents 5402 0 R /Resources 5404 0 R /Annots 5405 0 R /MediaBox [0 0 595 842] >> endobj 5404 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5405 0 obj [ 5401 0 R ] endobj 5402 0 obj << /Length 5403 0 R /Filter /FlateDecode >> stream xœí]Iä¶¾÷¯¨s—ÅE`Èlr0˜rrì,b#ò÷SÕRuõõQ|ïQªÙ€gÜjQ$ß¾ÿûO=üã×Ã÷o?ýçðãüçÛOOͱéšéŸÃùßï^ÿÀGg§¿öC{´ãùŸÃ??}9|yúøôñôß/O¦{~qþãôðò‰iÁ_üåéûéãOÓO>½ýãéoÿ;ØÃNÿ÷¯ÃŸÿrúã§y½ó/üü4ŒÝù/ÿžþb¬±Ãé^ÿíüðŸOúÍá—Ó†çuÏÿýΛv_´//¯šç_¿Š>ÖZ3ŽÃp0ÆžöÙž®ã¿{úûiµ—mGoLßù¾É^µ·ÏËzûî0ØhÍèhy+™²…N8a[‰…¦™¢“™Æ÷É•÷n\w>¥µî0øáÐöÛûz©‚ »¬ÔR+ödŠ7.¹ÿê]×O§›âs¾¬U¼RÛvB+÷dÊN7_>^‰ûÃŒcˆ?ˆ¡ëèZ¡•Î{A|¸ûêMÓ̧ì‹Ïy]«x%ÓK­tÞ“);Ýtù‰•ø·ïœBü—¥Ê¯Ì BüëyOˆ-ôQD ³W-ìKâÅ7ŸŸ¾ÿ`¼ÎJç翟6ò¬¹N|>iíỳŽÒØÃçŸ?4ñ¿=|þ×ÓxlG×·“ª»ø¤O |b៼EOZøß1ïï´ðÉ¸Úø¾ƒOê!ðjÃgd@î=ýÞðX{ƒ;pwøÄBø¸®ﺻ¶ð‰ƒçÁ4·ŸgÛç©Åkñ7}çýç“ü*“FgCå–(²Ý$Š:1è«×e•GOšþù‰?ömøÎïèïüΟŒhµfZ͸co†óÓ¼íÑvmg¿z2±ÔáèmðΌⷞÀwfÔëŽÎØöë½½AçIìžtF£þèÆæëóØ ÅMsœZx|o=:)~'qRx£Þ(ë&dÚã`¾~çÊ4ò¿3ÃG€˜G Wúf"æqyu^»@5\Ïjgìi"æ=AÈ_¹Ò‡ùúçûŠ®åÆ"f¾‡5úžé½¶3føéÕbíÑÙ d9çsð‰‡ß‰¶„?< ÛŠj;úî÷w?‹É¬Ý烉³ÈL-Cbk²°Î¾¾Úñïæ ´.`)ÞBpIPÕÞlŒÄ »Äoµ9²;±â¯YòŽ<5fð3tŒÈ¡×;¿O ‚Š%5>N¸j|}k3à;¨ P€ò!ÜÀ˜ ¥Y¡7ö²l?‹–'Èö|ìß͇IŒQ;0`Õ…ÔÐÚ@HQ02RbgƒÛ[ßÁ¹9ûné31ø ¤‘™ àöù”ðfIÌÐ 5}3ÒœŸ®¬³„€JÈ^#\J|Ïg#ƃðLgÌg¯5`™½Æ{ÆÌ o>b=‘>‚/ ú]C:Ö0€ F…¾IÕ{*‘Ve(Â;ÂjŠbçO„;•Tåê~¾írû¢½€CðLƒõ—`E 'ÐVÄŒdØñÄ8‡ãFDæØ‚i/ë_Ÿü^ã¨ØFØAÀ,b]”|t¦.£|»ðn{Ó´x\ÊÈP0¾%n‹R†¥h^šB]Æ~¾s7Kt¨œ%öH§Œö !<›t”Èe»‹m 5ÜÊ™×4ü ƒóP`ŽYsJðwpvÓÌHù. ÎrƒçÁ92øF˜¿ƒw€wmx;b*ˆW÷“sÊ íå“*Aí‡õ «8úïÉЕqiÔ¬Jú>F±e¿H¤Õs|Ø—M´“H©&ø°ê®›" OðT [¨¸fQkšc7¥×]ÃETƒ¯¹4~¢¯ø·¶ ¤És÷|R¯fÇäc^†{Nk)Ñ0CJËšöŸ›~õ–»»Hêè ±Ø|Ÿý®Œ„%pH Ž„Tt{˜0\k"1erWö8£8¬¢À[W`¾Hh®›SÕõmEÛ¸\OÜí²¼ÂÎ{Ã:#z”@¢í¦É*‹%ÙÛJ°ÍeO:!ʈ‚†£q’©«cæÔQcèöjÐ0Óõ2”6d2lñNðÆDº6!Ñ4ÁCSäüŒc7‚¹%üî(ŠS&t ¬ Eö$V;pªÙb–:…qp€CgKÔAqüx6»awhIPž¯Îi†ÚgÛUŒ?Ë I$$Ã{ñï¥î%:5nœ®¦½d!ì±Óæ[Šr:À{KÀî q;Œ“b<½k Wóp—üŽctåáà¾ü¼kËè‘Ø£Cç<¦øÌ]ìö! †`øXØçÈÁ]Ïx +¨f·š3›Ã1EÅŸ&8µNf’Çb­ÔWJa'°¾X/’P/ÂwÉ2ò TJy#ÃôY®e TˆÆScÇÃV¯à—ócÀ—(µ¢‰É%5Ü«ï »f;Q^ VUêIh3] öݨR2ª4C½£_RÏŽ,$R b†Lp‘W(÷7!þ“ëuu)tè# UW÷‡¡DÝ'xÙWÊy{¬ˆº~‰³#Ôr4 Y‚‰¬¸ä=cßQ:"‘ض ¨¤z±øêuwkSËjê !Û–’Ÿ.›–ªS„CHþÆø©[D±V&EâÀ*‰ÕGNIo´W¤jf”uã·«Z©4OªÕC‘SEÐíTœÓ‰îÇÕ£VI¶§Q2£5´ˆ¦_×^}æ>¯Ù‹‰&ò˜<¾d5ƒÉVfyü ÿœöiâùçÏ¿æšs÷øÃy@`ã_ÿäßOŸ”Nz±m}9Hô¬°U.”e)ÍádL k4c¯%1ü.§ž«äËù}&QMS?fš²óìÁùg’ÒômäÁ…Ô¶E!{Ù|]Ï¢*qOA»‰`vRlsN$œSÿÍ—èšqç® Ð9¡ÔŠVdt‚é¡°l`ß¼0ƒ=xϾ¢ûž ,¸ö 8sÏ?Ä™˜J`®gbŠÆ¼ÌðTM8©.9QZÀ»^Ì„•¢,¼7ÙɈpµÄdDL ‰ÜbN3¦zý$89Þæ|8_¼F?Ä1nÆe$c$‰?Z¿Åê‚X»ˆp¹¡\  À æÔ5°jç©K)m_põ;u¥ÞÁ#ºVŽ ;Æj~’@L|oxT.±ðÉ–Õ‹o'¾Q†¢ƒ^|× #FÔ¼I`V@0ÃÅð-ÍÛ²r„…¬h©+»ûnñJdŸÔ’÷-CX_„±êfÞœ„ŒáGÀ·ÃQ$ðj‰½a˜Â'u ml ˆÆ½«¸ÕÖøÊÇ*ÆFÌö±Ó®üfx&" ŒÛX”c•óEïáˆK†Ç€# V<ß[B©¬toœúûõ•Êû”œUù|ë.½zäxöBJJ;\œ÷SHhì}—+74‹)æD‘+ÝE[wø«ÅQêXA Õ’r„}^ÖvÆÏT˜þÐøÐ6œD•OŠJéUùâ—"¦dSÆ4Hôä”"étnŒ{Ø„, ÏÙ¦ì¥ar©´v\ä"Qº½aMEIó=HYÙuù­5ãëÔ¥©ÅhŽg0‘êµ~q†n}J *Æ„Ežs¥oJvMǸIÌø¢3뤰Vê W Ø:|P.È) ”íT'Òy» ës‚+i¤ž¯‡¹Ê2ºp©Ë)7!o«ÓŒ¦v[J9ÁWAàzº½üE˜€’.®ÃˆE‹Db™T{¾">ŽDs‰¹\AV˜&lF²ÂZÑ&‹kà<ö_3²Å9¹øG‹àx$'gc•þÌó±‹Äý¢Ï¨n“RõÈZ^„LNû’³á^¼’AˆºV±f›÷¹ùÄE®¹ j;mŒXÀµ/­7¦#’¦õp¬Ö9³áÖ­ç+·¬fM¢½tBO„vÿ„ÑY•úkK@:qàü(7Á“¶ÏKÜç%b´ÐÕ˼v˜P„í(œ‡5xh)pêd¶ nvŽm/Æ®¥G¸Hæœâ­UÏž° õ쉂œ¥Ï©Â‡ý-0´å21¡N亀Ê §bP$%¿A§²ógl‚«Ù™I3ÑtU4mÉØŸæÆ­7®£d<¸KÕ»|5›0¬w1å«`xW£±w\ÙëR½™ôƒ“‰Ü1ò1ÍvY­K8Kùæu¥µó> Ô]QURT5ÿõCEìžÚso”æRD|6ïBÑ]ô­Tâ§SØãôóZêÅ­w Ò"Všªl-™ˆÿââÔí[KªÓäÌm§úÍ6üæv•ÚºM|`‚'Y²é·Œh[¬ˆ#¶RÝPÁÀ—[ SÂZ˜¼ƒÀ2dó·æOÈ}!r%õ+­ŒÄjO»˜/¼ˆQ¶–º¹·Ü_%(‹÷9ÞL¶¸ ‚ù!ôoÆ3Å Uäû°Bö¢e@³ËæïsÏæžEêÌ7“©!—@m\ß„ºâ’–$o“„ï^(æ†ã;|wf…·n=Zµ‡¿­úâx¤€~X1Y[ƒ¿êp ~˜°|b÷ð fÄ3î²ÜõBtÖ}r ÊZ>‚Wx9~D«¶Ú ~Gë¢U]¨“̽ n‘›Sç§íM»xf Â&vìï!qˆå‹àlù.<5Þ >Û fAø ¼Ý¹õ-Á¼Àñ1"z€¿š üˆGàTæs×ì[MXð÷8Ü>ŸmÍÍýoLèJ°-õ~[nîÛv¥—í ^Ý6v<@¥—£)ÔgTƲÊÕ%­¥eïUõbèº.ÍòЇ"Ц$‘¸(ÛÓ‰’‹AHàç´™ 0™ˆ8–ƒ’ B›²åÞ#ÑÞ 9²”Š+‰ù­,¸F›ædëæ;òmø_Ä º¨T±Èþ~#þCš{~ô PVɾX¤îÒžà|Ž#œòR¬ÐaÇ1ÁO,:a›áÐMôžÄºfdLUn.¸zZœNàÒ.E$&)«îô…Á–r0tÛqs1µ¯ìn/Ê~¤ Âr³d{¥ûéQïÇ1Àž‚})Øs!团tÅéÅɺãôf^\µ(³£ +H¢yA™Ì*(誧ˆæÃ\øú ÍÊëj)œXáôƒgøñ2R·/}‹n2T°üZ·ˆ²:ñ€H¡„Tq_Öífí$Ç™•ðÏ‹tÁÁ P@¨BW—´>Äè]—¼?]Òõ]È—tæ.j²Õ±ÝdzAQQÛdz©QIïóµ—µG%%.9Ÿ_í}Õö¾j´ƒº$rE‘Ù"ˆ‚ƱtÉVÁ";ýI§ù»šºG¸õüãîK,Eµµoï Ë0¹J‰T4`ª•®­ó±‘c楅±ùD<šB ó žÆ;€c¬xa·|ž„AгðÀZܯ·èçžÖ罃7—O ÆÐxZÜ]qô’ÄVBfÜv¤R¦rf JZ bR"~ÈZ5°•;C‰´²˜!# /_¢”—tWWèZÓB¤®i’'ž˜í’w‘Ë ~’Ѳþ®¤ØöÚ—ÑûÞÔ÷㬈‚îs”w±cJ·ÌB™ºTc@lfgÆè̺S=5ûI·}(œ¶;ws9 îg°ß¨ÿü¾‚ñxmÕM.r̉QŸݰDf¸JôJp ‚-ÅY¾Nž¶µSs 0Jë8ÜSÄ,Æ&R“Ý”ï<š‹Ïwwq6»‹ó*n>Á÷–Èú;ÀßÁ8êðüX¸Z¢ämœù”€ƒæçáÜ(.…)ƪ8;€çaÑÞGkŒ›UÀ±ë¶v¿šL×§¾§Öûë Ñí3¿Üudõ&1Ú¾mŽ&œomQò¹zür™¥i‹¨“,NjbžÊ:ýò¥íD;î¨%nõá$»ã1øêŽGäiÓÕ–ºyfO–º´£@ÓèÛ»S¤4¯cnÇUÈ¿÷6ÚËï.÷Àõf÷œ£”ñ"fj.„Æá¥7$É@h6ÅQ`9±x‘Ìé2ÄPƒ3ÈX$I}iӸ˘§Ý#ÝìéxéÄI·‰»Æ;€0Møk$·¿ZÛ/nˆã<·-c5Ž»šX+ñœk컂kLø` Ìa6ã¢ïº”2¶ –¥®ÍX¡+†¦¶ÌÜ12ãVr˜q<»Ôâp”# SÜã«X™à0(¨ZøŽÇƒÍauS1ß)ˇwÀ’÷r55cüâ!dŸÔÒZ’a5•aÂ{ØJdØ4˜48b¯ÆÉ8ç *8W€ÌUÒ#^¶ÚÚšŸ Šý Šku¸z8 CH×*O6öš¼+Mje×é´Z;ä=O‡#E‚D‹oJª2›gøÌE¥oy°rÃõìài¥¦ãœa• =êdŨÖ)w¡4ɯ]¡t»§±D·¬Ñ1;ÊÛRD'Ž›ßC]„‰¯?’½RmÖÛk1P;kP¹L‘…É€rjÕɹÚ…Ž ¤‰vvwݦ ¬º—ºáÙNãß„$¬ÞÖp3L,80ñ>SÄM®j[œÑnË·ùübsSªKÈÐxTËEú€oT/ÅÀºÍ¢EHI¯–è¯P«ÓrÇŒ’þFQgŒq9«_‰ÈÉ¢q +ñºD‡ † žÑ(K$sú1ðEEKÖœ6t¡|Ùñ»RÄ+GO|¥2cû^õ ʪ¾lPB¹ÀníkUVâ2vc‰Œ'¹ÓJFg|Hh«· [=p_R`·ú$*Žv'ÖUî’·=‰½ùkù‹B„#Á.mv ;£x¹‡ƒ~¡|×â¥v¾Ôj·Ò£V_IwæX£7½ÍbH"µ1ÊpfdãïT J®¡!…¯kæIíù)1?•=ÞÜoÅ)ÄñÒUí…àºKEÑ^/úÎ^/Úõb½€TÍ™h¯_K8ÓÔ{ÃðY½Lr¾}ÕΛ—¦+‚ãæ”™dc‚½?(b¨Žþìƒ;ÜŽ6ÀQ{³C©´.Jss`Yñ‘ c¹Éœæ*]¶äF/À–duÇaX~lv†µ]†µMäWcBÖéAÊðѱ³ü2 }²‚s» ch §öðšÇÏEÀÔPqš»ñí¥;ÅîL‘V0Ιr—SㆯloËP¯-ÃÚ ”6ìmöŒeßÛ2\ú(m^I“½-ÃÞ–aù*ö¶ [)RÜrå^A¸~ùÊRmÏÐRE£Hñù§_N;=mä¼ÄüÇ?'¶Ÿ¹¹žùcòÔÉW¯kèætЛÓŸávpÍ%dn+ÜuÇî6“ýÈÛûÛ.×þÆ“‰m8w´cwË~lÛc7¡bÈPn}g€ïŒðIŒööh›ç ©ë“7pµ ‹_ÿäüÝÙ_zã„Ð;3;¸õÄ sÌ„K{g†åìóÞž  ëη­y ÑÂïõt<0r.E–97jßåÿ.þ"†‹kÂõ-¼ŒEó'Ãpx+÷ahº£éŸ^#&w³ôdæÅ‚|øðñéÿ-¦Q´ endstream endobj 5403 0 obj 5662 endobj 5407 0 obj << /Type /Annot /Subtype /Link /Rect [124.319999 517.460000 221.279999 525.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors >> endobj 5406 0 obj << /Type /Page /Parent 2 0 R /Contents 5408 0 R /Resources 5410 0 R /Annots 5411 0 R /MediaBox [0 0 595 842] >> endobj 5410 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5411 0 obj [ 5407 0 R ] endobj 5408 0 obj << /Length 5409 0 R /Filter /FlateDecode >> stream xœí]IÛȾëWè`dÖ ¸»í9hØ@ƒO&Á`™Ö ¿Ñ×´íy9YŸ-”Y|VÂûFÆíôž±†Ë±8‘­ü ÎÇ­ÉOfÇxÐIÂy9{`ÅL¬ÐŒõ BžÆR“[ò ;-ºÂΡ¡¡àZ›HÓ}½‰´åŠ4ÿѰ#Ó³zAÉ „۹ƜœL[ްµA‚§¹iƒ ÷¬+`¼½Ò¦øÃG3œ„;K™3΄æëÏ}ê—6C&EPº 1peûf)›œI+å9Ö_Ób½“¬ê˜D0e²&Rö9“dg°äS“)I˜"á¼ìF,Zõçðq |Žé¿¢Œ@B¢£c)³V’¸nY’76>{þŒÃÇbI¯$®T!š.1ÅþªNФU†*~'¥ww‚‰[Ç4ŒóРªRNÊàÓyåÑ=d¶;¬GÈÜv7^F˪fEê,³ž‘™°…ÎPò*Ô÷·&Ó–›ŸÖžÕãò0nÅÿɨCjY›Jä>˜Ä2¦Ã£ýP67-¢Ê`«tœ=é–@üiŽw1ÀJ1GS¬á”uYgb²ë:Cfâü ‡Ï‡ýއ’]Sôº15Eþ>ëÊìsK·(“nQÀoíôytYʈ“á:Á¢ÀOY”¸¹¶I,Å´‡œÒBŽ™•숚±œ.ž—}ⓜ9ÏÛÎBóãB„K¥p8-f ?4vÀnL÷$Yzذ˜ °-š•DüZƒORQë,&£q¹NwD +ûü@ð$gz¤j ²ž‚§®iL#ü=ø°R›JËç_N>?=¦—ßKíªsAuÌ©cV„§Ì¥‘R á(€œÿ<—`âw|’/#• ²È$³ìRPZ;ZÈåMƒìnz‘–èa…£.ˆí|g‰æ;)Æ ý9¤1FÔ-)Mʲ‹Èà\¹Þ#ÔÎrε—ŸZI©!tøð#Ó]x°‰I] Ø«Sg,ëL¥E„sXŽË^XI¹hÆRD)*Þ)q´G0“@ Ìsâ‘×¾VS‘åK©p60ΈÆèHx8WŽ@`”ØÎnvd*cÔ"¸t$Üš€­‰öÃ@nâ¬Înã®(Î wD˜`.»Ã×ÄÙç¾Õɨ9›©îà•ÏßKD)•ò÷bÏêž c®ˆ7Ï¥)qGY6ý!H‡up¶·ëöm¯4åƒ<†æÃO’ FøÏ¡29IMš!CU4Qa´â­õ½ÕÍmusè ¿nîÖºa‘´ Å5EÒžbé¢JT _Äò•p‹· / Pƒ±°ÁBšÁwê*ÞÚ,R°:ª ƒ2r.XÛÁиü L!KIWI4 Q],ˆÃM¥Âp[8p .CÆ;øëm†åPÖÈÑ}„‘Ã2Œf÷@6oÂÉ«ô&Öi ×¥î/y7BâÙñSI©w3Ä2☱¼†1Å•ÒÃ,Q}Iã£é¼Dæ°“’]£2Ôîrµ ŽNº×]VúˆÏ’ƒEIoÅ™“¤”ð£E;+¼úÔ>¸æÀt,âÆnéʪ2¨eɦÐf¢8CÙXa΋U„0¨2s‰óìЦE˜]·íŠ˜}ó{Ê •ÅØ®Yí¢&B¨p0 ½ sœ pJ ‰5|M(©Ò °tU ?H€r]<üOVÄ/ej“uc‚æ¹Ö°€\·¡)$ÅÒ\Ý€÷’Q€G)­YÍE'’¹¦ ñ†&ÆO‚ˆI²+aPSiذ‹‘bE+V•åN¸ã„Ã)9ê<-ýŒôÜÅõE°Ž¼ &^¨^yáHÒ'Š&<¼¼áA]ðëî‹Côfrp+e°¡Ä=ñ’GPyÁ 9dÕ_`tÞMbq±Üìš2îW8¨öP£ÐRÈsþCžPº~šX½V'÷úU-éÞAùÚ…Î Ñ"ŸÂû /ÛÇk²¦r­Lè'–ö/cÔp0¨j•eIp9jã>ÊÞ Ý’äJ=ä%¡ÖW¢¨Ú^meHõùÃÿIg¿3t9Úc»+#JIaôfÿÅ6á(ÎŒkä£òš!s´(Åa.5“¡4fYV¤Ðfq:¤ô ºIêç#bÕü>}Îç"ØVŽpATÄH$¯Hfá0%±;½cMšƒýùØZFÎØIlrkУк¾2`áGe/ês‡¯O>Â1>@éœUŸ!‰|œè(ᔘÁÞœãéËUßb/zßšLá,ñ;²)$À—žÛÐ_fç„ÏNL ³ïVÔ Gþ\€U!ZÓ™ýØ…\åÄ Ó¦–áðUÀBâ+BÌá€pñ4÷@ÌMç9v«€?x¹gòÎäÞüÁ ÀVOtpÃlj™ù ¤Kâ· DÞ½%é[‡õˆƒ‘1Ïád¥;ŠÐŽü{ÜgÔ$F=½¡€QÁëWá€aqV‡Q«ÌÁñs !à'ŒÊgN%·ó!é.8úáÌó#‰ƒ-çCŠ9Ö YSˆ`WþâdÇôpÆÎK =ÉÂÆJ*Ø pݦ±Úâ¶ön1K*qJN›ÏÁ/À›o¨¬h)‡ŒcT=:è€#³$ò„TByÙ‰¥.“¶ÆO-ˆ&•’~j\¥ßà€ÜÃ#ÀÆ·]´w G–å¡6`×¹ù« K‘ ] ¢ ^lupî÷ÄâØA˜%mz]Å`#±ð”01Œ*–ùˆyó™À¡¬Uò7 諤BвÝH6ŠdóaÄ-X‘:L²sû5˜˜ El%† Óœ©„óá`.–²KK­Ž‚<·¡¦›µ S]_N7‹aÖ¢;Ó[9‡œÓDëÔ<É5È…s£ó$KQÎQל–:K‹PÚĹîvùyÐﵘ,…¬m64ßtŠ›»ÛÆèvò p.´µ†7Dó¤}­ähQšV¼•âá­NÖËÕÎ|4?€ohÒ8ß" mvÀÜ}oÅ¥x£Œd à²Ù‰`„zê­Ö T­Á¦C׬Cóßë{­7Þ…šî&ˆKM[™ïw¯@'Ö¼µ5á ˜ýá±NDr5´2|²4H´í¢ʤ÷d§">Wø’žã(ÙKRSZÈEÝðî •mä¬jœ°ä¯l®jYì#ŽB¨÷H›«¿E×°èºóèiÓ§¿ÖŒ ѵòÚŽhoË›Ív¼gÛ±m*sÛ³«¶¶ÑfŸ³KŒ´È[)p;(åa¥jõ Uvoa°¨0EƒYÁ'Ó  Dη¢Ùý-£ž°î±ß:ùßê ·zÂWá—*Ki«'Üê ë¶ÕFö¦ºäîlõ„÷YOØÈοÅ8v•W.86»ŒÁ±?i«Ó2'‡vþ ã%ºÆÂ«[Ë,V±taôã¨(bÔKãQ;¬ÆŸ–L6n´`+UwZP[©ú²+±Š²SçG~ØJÕ½ËØVÚO« Im¥êþÍ×w‹S°Jº™Ðˆ²ØJÕÏËØÐéV÷»•ª;IJ ¡©ØHv+U?=™=´•ªo¥ê¡Ö‰Ș…˜êÝ+–e©Rõ®?›³¥Ï–Žbåûú¯MÉSy¸Üôü€BNNš]ÊkÀî#$ïZ¾C¼®Tm2^oÒƒUÂû×K@|Bìl5/’åÃb…N˜“žé²­Ñ‚0í4O¾ï!çÀug¬zL¿ÿj’¤Eö&î¦È›1J©C±*¼O[jÁÈüuä¥òoµ º‘U«kÔqÀU:XAŤ+ju’܆“…Ãïï $“ÃùØ IAS€I[5dõ‡ o §ÈkÎZùÎT"œ«šE}k#uf¿P•Vä>é™ eƒÚW¶Oä'½ÐʯÍìÛùKš$ ÀÅbÍ`ɇ· —„%•Oþ‹JEc„2tlŽY!Žp»×¢¿QdÏ׬¿Ø}º\ñUàEg C8è"¢˜™%PrX¬ YÑ›ÐH™—`»SŒUÉ ¼!@™jLÑ•áœ6/Å7MkÌï¶Ä»°qÉÆ%È#­{“ÂV=Iq4c‡­S8}¥ï"p`’ú's Pè ¸v—K¨ð*˼Ç3ãž“ž Gßø=,qØ•¯|6ÌîÃ*Gc5Åxß“œþ”®Œ•¢^'¹®Â’ŒƒGLí˜)LE‰5p²‚"ø™’ìÄA0O’ÒšîsîÜš˜´²LJ®Àà èõuo)÷ –Ĥ›/´Ë9-·L„$(öyò5×$–'±(÷{¤H<"ÄL—'Lç«f³–žã¼!$%gΆÎF?)˾,K.ÿ©oó¾ ç;!!t¬1}Œ'Òþî_Hìø…éǷ©¹z¥æg'=;_õ×:6{1LãVâf/šÃi–{u¡šdsÓšÛh¯ |(ÛC{;©½ñdä ¥/Þ:­ëC3·úéà;=|gºDd¥Þfl=ÀÖF"¿þä ~w:¼1ÃÏè‰Üo=hŸÑÞ™vŒ2÷ë|‘ª;þ.kq95¬a-Þ9HçªÓ²‚¾‹{Äû2!ç^÷×S¦<ÇÌð><&Ù÷®«šƒ8Þô–0» üä*6øœRïŸwÿÕ¦¼ endstream endobj 5409 0 obj 4762 endobj 5413 0 obj [345 /XYZ 40.7999999 75.8600000 0] endobj 5414 0 obj [345 /XYZ 33.1199999 603.859999 0] endobj 5415 0 obj [345 /XYZ 40.7999999 561.620000 0] endobj 5416 0 obj [345 /XYZ 32.1599999 605.779999 0] endobj 5417 0 obj [345 /XYZ 40.7999999 561.620000 0] endobj 5418 0 obj [345 /XYZ 40.7999999 75.8600000 0] endobj 5419 0 obj << /Type /Annot /Subtype /Link /Rect [84 534.740000 141.599999 542.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes >> endobj 5412 0 obj << /Type /Page /Parent 2 0 R /Contents 5420 0 R /Resources 5422 0 R /Annots 5423 0 R /MediaBox [0 0 595 842] >> endobj 5422 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5423 0 obj [ 5419 0 R ] endobj 5420 0 obj << /Length 5421 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨sË⢠Øm;@n ‡A'“`03ˆ3‡üý¨J,U5©Ëã"Uµºw»YÜÞþßÿùë?ŽÿúýøþéëŽßÔϧ¯‡ºªÛzú:ž¾ßÝþ÷•àÓ¯]ßT|8}¿ýzø~ü~x><ÿ~?°öÜQý/SLþþí·ÃûiòÃô—¯Oûß‘ÿ2þïçãü¨Æ;}à×C?´§_~™~aœñ~üÏío§Æþö‡ãoãúó¸§ßIÖKÖÆ­ãûÜ•¿o»¢ÉêcÃEÍÇ%²Ó?ÍŽÿþóðÓ8Ú¼ŒjŒu­ìjïQ™h/ãö²?ŠZ£›ó‹E$¸H4Ònq»za©ê[õ÷™§?Í"ù0âyœ„§@rÇOc¶M}ºv乆…×CE fh2Í@§±¸­àîìC‘A?Œƒ·)D4Ä.CEtÚI"Ž+bq[»€EýøŸ~Úf±ËP± ‘h ÓŠXÜÖèÍ¡ž“¨=~U{ß-?¾Þar„˨Ö^~Wr6¦/'1>ߤo#Ž/?ÿX×âËŸŽ/?†ªD×LÆÅÔRsÔÂ?À>µ°öù[>‡Ï#`‹„«,|¢O¹j܇p5a?¸I8n«f R"ÃØ†+â%^Æ„õÛÞ)ïv¸QàÖL<÷ùeTù•Á¨ ß[ö–½eoÉÒ‚MŒû4™j¨öØGØ·<…Ïc1ªñ<ؤ…J¯c¡Æ.Æ^l±àö±»CA•ÌØ<-ÃD7n!?l¥lØ‚ÂÖŶÂö%d'lÃIØG@‚‘ñhØ&µì†÷Cñt0k¬nI[!¡Eùµ…XNVßC1¶ì¡Z(fË!’õ]ð´¡‹õ÷Ó`zÛíòrv9 ÛØ8¸…wJXÛn±Ç¨qÙ»-vl/c`’¥Ûÿ…@Ò·êÄ`žc™½;>»ã³;>WñÀëfw|®}vÇgw|6á(ìŽÏîødp|0í`)¶ag‰äÄÀUoĉá\îNŒ’vNŽØ ø·dÀ$óúrCTà<(ì̮’ꊫ_Öñ陓ö8Â.†Q qJŸ-‹!lˆb3Š®¢bHÔó‚šp_Ð’áA°1Š)~ªÚO0†Ÿ@ØÌöòeÓ]Û´¼1—ÙëPèªø!òÚ÷³Ö—á¾ñ¶gý"4d%§.7-Â{%–á%~Z}S4Þ+˜X¶Gƒ}‰\¡Ä¿è 7€¸‹DZp€k ‚aÓº6¬´Rï³-}0ePõ»aÆBüad! ã£þÓ(…D„Jíß@ ƒÇ8q¢À²aȘü“÷ [„Ð+Ü–Á[&eáM±Æ/ÃúìÂÞàeˆa“-0Ñ?åVMÝh:ÃäA²äþ’ƒË8j2)Q_€ÝT`ÌœXLô6n!Œ&…¾ '¤kHxn<®¦€0UÛ3¦¾ å‘¶U#ÎKöá ‹hÓ· ·£;0LîJ«ø›aw¢o†VDë›Ô|÷#XĈý–ŒcË ‹ §ˆÄt”îÔ¢?žŽi{v©äó”Ÿg\-õ¿¨´×u~0>ÒôNjÜë_øGcî 7LTbìu¸‰ûY]µ²>yÏ:±¡ús'·ýÆ×—+>éËUGÛ7ÙàÅà©•>j+ðÙ4Kv䇘OÖ¥´”ðEW–bÛ`®ÏÃÊN¼Ñ—b#^g€3íú7ۢ鰿­Ä«Ùö·LbÂÓ_â[49Öþ†Í„½ø€Íä©l×2RÍâRHÅU?Ôm¤©äãᆌàðÝ5"Ç/k¨C×/¦høxºô A;vа!©x/ݲ@÷½Bä²ÿóD<,‚ C>¯°U^gÞ“²¶t;©T–.!ïÌrà˜¬š ôæšVƒT@XÀBùFˆÆyÐQ„0úšiÛ½ÏDu 1aÌîôC§C×?eµ 3hM°eÍe…—DðGoƒÛ"“!Œ#hÒ©.ìcš· Ã$lX"/>‰ª¦¾P›yªž¾®«“¨¥¾€²k´öö铎6 >оX]é1•ÕT\wó/±¦ê5†ºÄ6Fkáh «•TšüÚç µàý·kq7½E á},Åû©t”¤^j°V®@W –(Dð*% ɰr²_¯óß–¡«ò0™¨:}m—”£²€9ã ïÏc¡¼jkÊN-} ÿay‚G»¨§J&È b‘×F^R€ó$ŽÝQ‚ÌØ·ÐdF)dæ‡æ†SÑî×xàØ( 8¨öÍÄ»Ô]œ¥\гå€x—é„€ƒ4ýkÞšÊÌgN¸9£†ŸDÄqÔ¢¿ýÃ/‡¯ÙJg#z9-á5½ä¢qɵ9CòbÒ-(¹¾”;{Ñr¨@ðF<€•2i$+;yLd>±3è/špldPV’@©™RDq^ ߨ dÂ9§ûX¥øiíÚÙË!4à ’"Óþ1KË/ž8»2éj¡+Cè/á²y—!®ÞQ;9hW&ù‡Ç}.^XÍ4ÆÂ-«Ë{ÌΈhHæ!61( 8…Âßû -vm„†˜?”œë.·°¹8¹Í@ @ÂŽ,§1ma $ E$V¤Œd$&¥F !—RRÜÑJ|ÓÌi©X’Ô ;$â®”E8ÀÓyÝ0dE“ MN fWBÚBî)+)tä˜G…ÅPJ»x| ‚JÌOdIó4¹Ý˜Æ+2›G14×C€‹â»GäšxÜMÛÍ‚YSÀðæ× ó\Ë÷¿DŠɃûŸ¨„˜3°Ä?'fš”ñ&JÚp@VrŒËd`¦5Ì·v ȈآÊ!Àr›ç)b™¢Ù9ªWä”Ó­Ôõ£û…†eìqcú~Îð3åò†ØW”ú461ö½q‘r×­ŒØ¿+™º¹<ÞÉËÈStjEí2\2|gíR¸dGÞËÊÉiÙœB¶þ¥B>KÙg|c—£#¼üÁqyéd—H`d¼“s¨Ò¼„ÈUE£_í÷ÉQ­2# 9¸hôNj¡ˆ®ÕvB¹M‰y…„5)¡¢‡JT 9>ÀáÑ"Í6˜’Ô Ëlå–=ëÎ]q!7è^H(‡ó¸M9ï‹2Ý"¾Ër1â0ÍaB¼ϼ–ç „®Ï ¯’8íÿ°²×¸"<~’ÞÇuì³<¨”ÿL®n É^޹‰7ùÜÛz,UšóhtÈ¢­³¤¤¯ç¬eZJK¬ìfB™j¸}¥3ŠÕýI™‰’~l·²a!ç!Y’=\ci’ ›ÂñÈ¡œm¬èµªjÎUÍdJIQÞ F²(^sI.’@“î¾¾“d[”·e"J%—*­¹¹ðQ™‚y}óNY»ýœƒ‰=(‡v„ÇÀ°£Oz~”ðjp©ð© ½¢ †Aë8sÓØ]æÃ;b%ð&å-ö=pWî%t,Ÿ8\Á–é ó…B æ,’ð:Ö,¤b¸aÌaâ¢2Ò[ÎëÙ¥wjn‚KáŒ]®o[®‹‚v}§_åà ¡Å"c)/ÍRd9~¿N»ºFÝÀ³ÉÉ…9cêÚõa`±*Þ"¦ë, °K”ˆõ.ö²)pÃv%‘†½Šý„)‘ ,ûضP<Á†Ä-?2Ÿ,¥ÀCu}„f%Þ ¸¬tèvk7“¦x§„ȆõnoÛÆñ’~m/7§SbIG£Ä·ñ~Jz ýü )ÉÏXHó”èöZ0?¦Õ&N¿4¬–å˜þ –'åäG`Ë{¯Ö@ñ …PöcÁœÇrþFO[k- õb¨ …Ûw¹RË0%a™†éó ¦ÿ¤.%;±Mûv¤w ­ClåŒGpÆÂcÒ8Óú¸ ê˜;÷ ]|Áq¹bh›×L[þm9J²$yé÷]9hý\ï¹bÝcT`qp+Sð„Hªh7Ò|µ¢Êy³ïcÞóØoâ]ÇçböŽå¦Ó:Å~>)ªC8ãÚã~[ð8 Fƒe-:7îï9ÚXŠMÅ;ˆq–b×ä¡Å»Œ¬ôÆe=\΄JùÜ’É9õ iÍÓÒו°§¶vi ÷[TZwn= ðÞQuÔÕÂ/7¤Kš«¼žkÝ¥¹š61ÎÒ'éª÷ã&šÉ¾7Õ¤ã¦m¸ œ{¸ŸÇ”cXÒ§1¶°LÃkk ¶8Né¢\½z0~ÆT¾_?ÛÈÑžäârÅ¥`‚°ä]çäÔÝbI½ê7¤_ßLÀF¬‚!*¤v——Þ›ö‹eÖDüýbÙ.–íþC9^زÖÛÄ…<)Ø|ù¥T ^´Ãk&YJ~‹©«º?±zäõ§)¢*Inï…ˆÒðt§¸mì­‹¤-ÓäÎhrŠaÞëðÈŸ*'¸6çú‡uYr& ½%Þ`^©»hšò¤IJÕïAÆ”~Ž Ÿ¨ÜÏ$KÄH ¸[`P¼Ž„ =C0d¹ °æ«m}#t!od0Óé «fLxM-F¤SbúèRö¾d5á)U3 ‡À`ÆeŽZî1è*à÷—ô4üàƒäá Ñ[þìð(ņ+o»Ÿ,Ù#y#9Ÿñi±v¿>­Ö{3z#A·Úœ¥æÞ$~½žbþ¦ð–w¯.¿Âé„ÔNÌ[LoF´l×> ày•á°DxÎÐd‡G<´f¹r`˜÷ ÚMÚWþ’HÛ­ Ÿü¾¢¬çT¥ÇP˜Idûm­­Ææ3R SçüW’ ñÚüïÔ×µÖŠNgª.ôq¹øZÒ§Õ CD0QìàÓSVqQ¸äÑÁ(áfwɤÓ$š<åMVóÌÔÿmI˃bÎù–©º–ÁuÍ։௕}ÒöRÍžî»tߜǡ¢×1¿½ë1VZ=µÞq˜ó¥rK¥§G:+àÐʹ8g@ô€LM¢bÖÆKîXtøCñ'„RdÓ¹€€*k…H±þ½VFyÂ$(¯:,÷Ý” ë&MYZçô8§>èM!¤a£«†”¬¡ê×I{h¸áƒy1 2 è•q–1}‚WÓv‰Â'Fß$%“í¥ãbøâáüÆ­¤‰VîS1K^¦ÛØ!è`K ÖŸêC¢{†²2Ó×ͨ^.5õBÊ»(TkÞ€©‡xÈ{“F‚ùK÷ƒ’œwt xÀó3Íi´îîÔoæ{WX}øCÏ"ױĞáñ´9Än‘S{Þ@(©‚~vµ$˜!ÖÎ &= ¹vƒÓÜȤÓR† ä4 —ÕS¤yÀC¦æÙ\BZ€³)së¦(Õi­‡¼Åä\™G-ç•èycË0׸íuÅÂЀOl)‚Ôy ±ØÄÛ‰ÉLJ𣵛ÿiÀ\\À·›+…ZŽ… |¦ÚÄ™åØ=×ÅEÀ±·)à#²OCî^œ:ú'ê§ ˆç¿É™F‘[frƒ•T%±¦Ì‰c!»8©UôÖ½‹,ÙÙ°|MùÌ‘ ›¯tÌ)xõôu]D-õeGêˆë`Ÿž0\›*‚µÐ‡«ëcòâé8\MÑ««Éc»iù [.ÜÊu7 Ø‚çù¾S6SëtOÎPã<½¦q žG•ë+ɵyÄg¸ê'ÔÆ9„Sì¯Ô¼¬¯i¢þØ®“U„ì7Ô:ÿ J²=sÃÃÃÝB•ºxÌe…°ˆ!já%¼jÂhÊ:<Âûì<;ãç̳ã÷ñûÈœ#s> ~|ûÕ­&›×W6¶2ºµ«[B´G6nc)ì3™¯x-^aŠ<–F›H÷ö/ŸàgUtpa‡_PE~K- íC±mX…±½«µ ‚êN¿ó†Í¯¥6p¾.œ”é½ÔÇI!1š*=ö©»×fº¨u:àpÛ˜B0N-ó@JWw\xZ™Þ^3ãÕâ5)Ws‰Î0<%¡³¾¯ÛŠ,ÖׇŠÃ-7—jžSÊýãóáÿ’(¾} endstream endobj 5421 0 obj 4661 endobj 5425 0 obj << /Type /Annot /Subtype /Link /Rect [459.359999 544.340000 515.039999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23throws_typemap >> endobj 5426 0 obj << /Type /Annot /Subtype /Link /Rect [171.359999 332.179999 225.119999 339.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 5424 0 obj << /Type /Page /Parent 2 0 R /Contents 5427 0 R /Resources 5429 0 R /Annots 5430 0 R /MediaBox [0 0 595 842] >> endobj 5429 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5430 0 obj [ 5425 0 R 5426 0 R ] endobj 5427 0 obj << /Length 5428 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å‡( ðÌØr`Ø@‹ovƒÅz‘Éò÷#µÔ=Ób|R÷Ð<ãf‹*‹õb=ÞÿåË?÷¿ü±ÿøå?ûoóÏÇ/»æÐ¨fú³ÿ¾{ý×Á§_;Ýx?þÙû¾{Þ?ï>ï>ÿ>ï˜:>8ÿO¯˜&üãÛï»÷ÓËwÓ'_ÿ6üö¿=ßÿuøß¯ûÿ1üøižoüÂ÷îÕøËoÓ/Œ3®‡ÿ¼þmü÷îïÚÿ>€ óŽÿ¾“¬W\ë(8žÏ²ãß×¢—5û–ËV¨=c|€³Ðñßí~f;ƒqè%c’]ã=kÇÓê~ßwj/™6&5Öæ7‹œ¨m•d¢#D,ni¬‘}**êÛ¦›—)D4ƺ4ky£íáq’¨¥Í¨·LEF=ï»i™-ÆØiªØ‰¤L„ú"·´êñTdÔ·l^&“± =O;‘,ÍD#D,ni'Ôã©È¨ï„NEõç©b'Ò©„ÆQ"ªÇS‘QßËæ¸L®£yýiªXŒ)ÎyÔ±¸¥PoLõ9‰ Æ_T°g˃_wï?õ£ºùõ猣Î:ýøú}7@önTÚá?íÿÜ4Bý°ÿúë®?tªU£Ö²?ðî8¢Ï4íñy¢kg}xÑÇuàL‡^F§g^>àǺCӋ˯ ¹xƒ_eì8Âø ”—‘~9I†Ó@3µD´Æ˜Ä@0F£„«øxi;D³‹ýÃè³Ì†Ÿñßb¦½7Co!¶%YãÇ%¬üô]ìÐJ5~Ùhþ‰þ>˲ jð‡5ä¨ ¸,'ÍÓ@sP»@<Ì\¤a .‚GbX^…åd.Yƒåø_È!6 Wa91`—>~¤L&™Ñë…Ðà½ù¡¹hˆuË¢á~XØ»±S˜×`š1&1˜ÿN¹'³µ“î ®kÙŒ ‚dðXVÓÃ8_#>¡“gÑ$dÕ[ãWìa¹`ƒøR-ÄW!'Xùa‚ƒ¨_F!Ëk0òW -Ç.€« ¦]DÎ(’úÁ¬]ˆ$®I&± ,BNoÙ^¼›:R™]VóPéKݺ?´¤=y‚#Ž|B#L¡Ñ`s½'#Ñ2¡ØÍ«M„+‘w'ÛV>¬X`å=Æ\w JËrV®ÀÙ¸„#ðü 'á„•>@’q]h]1~+d}ç’­ï[À³bÖ`p<¬×xsü-VsYXÅ[2+Œq££h¡þÀã¯Êø[×ÉWq~iúúùh1$Ì9f!Bf)?@Øàz0K´Àö˜ò= ž°? Æ\~Æ(Þ…‹S8‚gcv°`µ@”Büž¤”¢ Þ lS"TP,J 6œ>¡ã‰KvZÆÈqbq“’³‚TÑõûh¡y¼n8bÙÇjŘFa¸~(H}½vÂSeerY e˜…b çÙÂ0ÔØ•Ø—£ËŽuΓŠe˜ÀX$Ø@¾, bD¨ˆ“Zùwjþ-0]&}‰ÇVŽMâØmR^nY)| HaÊ3·)ð©_}–FO¥DÛV}®¼>‡Ï #œ ¸RLÿ[†.;A—$Zƾ?¼[؇Eñ1l¿åË%-ƒ^ÄèÁy±füò­+cN¿ÄmØÓôæ‚i6˳µê#NZÕ%hº„åž+-QdA:åpZ;ÏýÛòõMq†+/®~ž{ä¾?ÏÝñåBž¦»ÃŽY¸·•Þ¬¬çQw%¿„¶ÄSàs†ßCˆ˜¡Üa¸æëØ †9>ÆálÖû/ëJ)÷_÷8ö2ÊŽu!×H™Õ©jQ^¬Åå[³Úˆö’m#ºËW^‹,È£ z/hÙ Ý.ÖŸEÄäÌ ãb¹ÿÄJ¢­¹ƒFI gr™1)M*&ïµ£ ä…àlo"¼xÁVJ~.©>F“æұͩ™lY¦¬´¡dÆš•R”ÏKù~- ˜QfùÉæ/CôT2ê• ‘O3ïkÅ‘–h§( EB.l1à-ó‰+Jþ2[˜Óf2³l÷¸'Ç-чsc¹J&_òÛîKñz”GÆOšº“I¤F27ˆË˜oÏ^Þ€â†%ºBòÿcxY-Ù+ÞÚ¿‚”¹9õÌÒª²UÌ–/Œ(X»8­Õ¼¾ˆT×#Ø"š—ìÁbú91Î`ÀQO[‰êèªþù0Fºúg+P"Õ@£á9@ø½˜ïÛŒ‹¦`a›–5§ðTKa››,JaIsZýЇuQ.„q€!ƒëa8€ âMâRAv$† ^¤ ¸Ûox¥8ì®âͶRC*Þl+•oòD!°@M€ ˬ‚A2íØÏI/«S.³ÖÒ+-á}ðLË¥äî ,Ãz¦*Jð#Ù0W]ÿ,08b)*FI ¤˜ÔÀÌ3õ–‘2*½¨ŽÔ‘‚#¸ˆ©À©BØš!@ÀqAF\ë…¼\Ãgî«n9íCm¡xl™”KØm™ŠIԹ͘XJ¼bذï[˜%wXŸÒ0,o²tGÄçZ«Ó–^ Œ&…h'½>¤D…zè_+ª`½ÀØÂw€‰{‰n8ì/"ǃ@ÓÞ´G´Ù0:7†Üâ÷×vyÛ$f‰6›Z:cv=vÞxjäì×|!+ò`²^ö{`-Ïe¦ö‡”¨øŒ5G‘!ë¤2¾až¾ZŽÉrs쀦¸·wìs6؆¨(¤îgÊ]-ðG„ÑF¶[@3V̇]QálÓ¶sRÿjyÌ«7¾ÛŒJ~¾òºYX/äƒoIÓÞZ aŠˆ¦mdVï(7äMÏš†-–Ì3©–$©êžE6Ø%8q\ˆ¾„]19O„Žôk¶™Wj)î”â7èžÃº!G' mˆ…èÔ?CÒzR¸BàÍH,½ã½ØXÄTé®*ã¶p,Š>FZ€W7zÙ5 ÙzìTÄZ ¾”Y‚Ç•œ•ŘX ÐxR¾^ºtHe‘k³HY؆E:¸aËëyB.ÎÍ<+ÕâEÀñÙ8†§Úðü·>¾¤#S’°P É﹦ÁÕvz)°"ªqX¬u'SNRw¥Tä‚¿ÝCº‘ ÙX€*µ!Ûnè®d2¸gR“Á‹[’Á )T[^‡°YB¬«:t¯êP¢PûÚ¯»Üþl¢+A+dLO=ÌQ6ÝÑqõ$!K2æi„]H›†Ìq‘…oXÎ .<5¦Bô†õ¢ Hd ÷ƧV‰|ÃÉoBÅß°œgŒ+¼n‚SŠ^æÝ*³'ºtBû–¥ÉúeOp9 %Qz÷­Oå‹™’Nn±1Ô¹‰¹<¥ë†Ú² ˜“ö&¥¬gH65ýÚg¶ÛM¿–üœ~]*ÉZv纜s’õx@ P–‹ƒâMV2—ç_Ûןéjhíü59Ñ)?L¯÷"“âI𯛛ð¹¹É 7¸)ꥰBV¼¥È³‘¯œêîv§n'R7s·Éš×¬ÑìdaA8õ"âˆR}ͽH)¹µî“9/ S„A’D›./bw¬Ðp+Q=_0;Û)wÈ€3oDOºËul/?µP8Øm5®Ù®V½¹¸ãFqçÉQ†¾š1(÷WKdÇTzÁµY0Qú‡ö%ˆÌY®جMw{}š³œ6X`€>ž´4D5°òX%#}Û–9ö× |à°'yJ3—-GjÁÛVJ¡ #D*‹ˆÜDœ`Ûyìá¶Ô9Rfu:& ò6ϽEª ~Vj0Þð{(Eá) \(»½á¬JTOU•o\U¦ÈŒRÜ; ¶dnޝü­—‹Rü„‚ŽkRA"ìð/Ïî‘âJñ^à ãîÎîîÿìNs'\›¯A‘òV1Ï-4e÷°1ZºHü}ú9C\1×ÔnÈœÁõÕó¸Wròü®[0}¨ðey_:é`Îf*bT. ,¸S‹ƒ¥ •–(Íl7XŒ‘Rú=üš)IQ+ÊU¾»uÔ•~™Zƒ!úƒ?õ{@”SŠæ¬ønÚIš!8áýÑa‰ÓÈ)f XvúÎÄÕöØyžZŽ) ,ÙñÜíèÚ$q&IU“ÚzþçÄr౑Ѓ_"®¤š‘‚«0ê)œ;»Üs—€Wœ3IîJx½ª4'SbIJp­bàèZ­ÍK;̬¼‰¨Rry k™ëJWŒZêT¿ä˜ym´­å¥dÄ­–Š.Òdn:òyHJ¡~Üí! ¹¿H±h;þql³üÍË-OÆ^N'^ÿN}ýÆF•‘2Îù‚Ž<2z¤l˜nƒ PXKL׬ä¤è#îÑ~a“E’…dËmÇî0̃쨈 æ[ºÐŽjŠ E HÙ_^Z„]ËÚ*íÞŠ´ Ûˆ7J•qMˆ´Œ`z#¬ÇQšÓX1ô‡ÒœÈæ%¼ÊäܮըzËUCRäÑzÄ–m¸ÉBLÏ<—k"ÿ=bÇ´Ì$¦ué8þ¥`¦V×2µÞNO†RZ›%Ÿ…+f‘¼µvý´CŒë Ôº®öÃ(ÄB«Mvýù­•ã'>g–¼aL/k¯rü-œg ®q]Ù‚ùɺy{¼–ìxBÕhJ?‹ïãºúg$=g<¦GÄÛ©ê½åÚõ%50-cúW”ÌÖêÜ6K´R¹Â=7ÄŒ‡³V݆£©ïÄM+[. TU{ëJ“ªö”&4jJél0Þh”ê‚Ú]—T˜ûž»ÏÙ­ÎR c1«»IéXÍîjvæ"ªtYÍî›1»‡¿ûç0†M¿0ÿøö=¨»É«Æ)Ÿ­Df}ÔIZíÙ°Œ«Y|LM%•ö¢‘—ˆVê ®Gƒôò`t:ywè–‘ :»+#“! Ä÷W›yµíAMâR4^{†Ïôð™‰uüÀÕ’¿~æÎ6‘ûëOžàwç¤à++ü„ž™…Óµ†Ö1›àaÏÌ;²ö¶ãˆ ºñwÞ²³_©…ïëÂé`f-מqRHkÌ6³‰á™fzi–tÀá:ðnc Á{jy¤ô¹»ö•3= ^oÆÐb˜æ¦kt†ÏÀc:ÓºQ6Vǹ$8Ì^¹àý ùþþóîÿo†Ë® endstream endobj 5428 0 obj 3998 endobj 5432 0 obj [347 /XYZ 40.7999999 677.779999 0] endobj 5433 0 obj [347 /XYZ 40.7999999 677.779999 0] endobj 5431 0 obj << /Type /Page /Parent 2 0 R /Contents 5434 0 R /Resources 5436 0 R /Annots 5437 0 R /MediaBox [0 0 595 842] >> endobj 5436 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5437 0 obj [ ] endobj 5434 0 obj << /Length 5435 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"E‰°`Ï#@6Ã"‡À›M°È.2ÙCþ~Ô-iºMê+ŠÅGK=š<ãaóU¬7«ŠÿôåïÇþ~üøðå?Çoãχ/‡²(›rø:ž¾?\ÿA¶E%‡_u[²;}¿ýzx=¾^/ý¿¯Ñœ;Ž?úÆiŠaÀß¿ývø8L~þòåá/ýoÿ;ÊãŸûÿýrüñoýŸÆñNøõÐvÍé—¿)dÛÿçú·Sã¿ýÃñ·~ íyÜÓ¿”,[Õ¯%d¯o]Åùûº+š¬<Ö²)kyBöë¬û¿þ÷‡ŸûÑÞ–QtJÝ(].UË~غSå±ÓM•5¨µ·eC‰À)e”Î+a[¥ÒôP\Ð7JŠó6k °i¤`È+­# $O°ÙÙx<îµj”WÁ€Ÿ† †—îTœN+a[› ‡bƒ¾m†mV2”Û¼  1-Ú&èO+a[›@‡â‚^We‡Û¼ ùª©# Ô¯( ·Á#±á®„¹-µ=·9  ¯¦‰#`Ï+a[› o õEù’åë•èøùëáã³PU{Ò5¿þܯ䬰?¾öÛ­NJXÓ·þtü¡,…úãñë/‡®¨»J׃†ëj©Ï-O_û½¥^iÖ€•–j‘Ÿáî8Ú3léà<°…€oí?^›€ûxÕpmÄ~0Üà)”’±Sxr¢……+%cmþ«Æk+?1ðú¶0æ©8<Ÿ^µŽÙ²þ¤ä»ãO¥ 7[žüwŠyMåÁåFà2 ÿ!VÒBÓ 1Ä1b?pmXn˜„y9–› i_C,—ž¦gÈ—wí%¶ö"0ï¼9O#ô ¼6 ¬£ÀUU:ÃóàSÀ0ÀZ,–]F)цpü¬ºY×EŸµSªò<¥¬«ïXÔE9ÀÀD=5Xh©LÞ3÷ѺZS)»úÃÀ¡U¡†®¯kñ¼.Z*Ø‚7»à(—ïÂcEöq™g?ò¦¢åUs X‘–Te­ ©°ÃÐ ‚¡‘ó$ä#•T&#±˜Æw'a‡Ñ͉y'ä´¶åØœͪ®6ÁzsÕiç)…R¿[2Ai»?Þ¥=SÕ6æî°[€aNVØõ„GÃì†Ãˆû¹%¾5¥0NDDs_ôXÐÍ  º·)߸w9|]¤±B-å$ãum´ˆO°Oë?Ú…éX}:ÔG *ªBÂÜäÃ3£á>xžQGîyw3tº´<ÁUtÞJšó<£9®­,êFÎI¦¨Î¢éº¥Å–l†N—y>£µJÑÌ<#7œYAÍ‚ˆla2†áû9‘JÀµAìÇóˆ'ØÒ ýàó<Ãó;íŒ9ÜÃŧçpÃ} Á§×ÆÂ*¼ÓGÆ™2VM@îG“Ãé4½¯¢ªÞˆlôUˆ¢VÍw¬ßÒGëlƲô0m [ÞÒOáGGuæJéÄμ´n¹’‹5eKýµTçåŽ6ÎQå“ù @Ã[N ˆ4!!?AÌrï¦Ó,_a‘.wzYku{~²Ó‰…ƒFË×Z=Àãû´xx'¦µ ¬Ïæ4Ö¶&e[›ì߯hއö!×ã”àðªšßyJ‰ÑiCd¨‰}Åaâ´…GÅۃǙm †Ó‹ ukøåPó 'q .¢åâ›ÕCqèvgÕ™Y5bX—?ŒþŠ9´ô¸ÚXÎðiÙ*”ó¢-ʼ‹UŒ„\¾µÁå×Ì0×rWš]qöFª ¦¤j§¾%{-—réaòX8ŒQ_Ñ{`Ùr¡/¬ƒ 0â9w‹Rð¸T÷°E<ôX ;8ò òV”_•Oy^Ë»d-!1"6é-ç q Ú›> r­Ãí-s{unµ2–µ|¹­É¤=Ɉy4‰‰Øq\7–y3ô•E;Þ\8¶Ú¬ù¢˜Éù¶ƒ/¯ø¶u –ú å§Gž¿}R ‚O C÷QõbäÁ:š=-ÿ¨O ârð`ÿ¶:ÇX@䵸±­NqJ°¡")q˜Öh"^RŽqšýÄ}\1y y]Û[ó ¯óÂØJãà¿E^žKߌßåð0¨rÊM»Ü÷›qJAÆ_nú|'÷{ñÀ#KC.…á†Á-¹¼ÞO˜ë¨l©zª’@dcÊ`È8ÃçØ¬΃G#²=±apsBm3‹8¿ìU<>9œˆÃšq`5#ÇnÍÅ0 2…ãfˆâlÜ 9ƒÑ]—“%ˆæîÌWŽÌÖlâË]âQ쯄·‡„4ê%­qâ÷£ëËR{ ¿‹©ùÌXŽ˜2)W-ªÖçB ”Ùµfì&eÞIË–ÈI&äÜÌxX`yì¬4ÃjÊŠ‰oqvÛ{K1“!®r #û«›ÇyÄÚÞðN¨íLK€à#VxG2Vïù‰éwŸ‹²þ ¦ 6ªÔ „CZk«QÆÒïÇØBšÇ’äfeuójÁÖs}žÓÅ]·ÓQ —ÒÃN5è:ã8˜‰B4[.'˜å„›²tŸ0tÏJX+㡈!+oàF­™ŠSI„Qd•S®tÍnz1Dn’£%81-@|ã\UT°ô"Q”Q¤(Å‚û`jÄx°f:å‘&.ç\ô“Gˆ·Ò˜6±<ÃוŒZKYp{ŽÏáÞkæv¬ SF/‰)s‡ŒEº›ªuž#qÂ/K|ŽŒüD‰x|ŽQ5W¬n³9dµ01Ç‚¹½Ô" s¤0Æ*Ìkp#FëæhŠq± S0'x†Q›à;x§Q± ãgmÆCžˆý؉۱À¶Æ7Nym†Öˆ5ÍQoÍßtÈãxœ€XŽŸ+î“N,[š#Q9öc4ÂòÛ¤ïr÷èñÓÈúàÊkº:·‡ù ãñB£‡)#ŽÏ'2ôl´™ ÿãÕ½wc¹!ÏÕf£ŒÛë ®Hhüœy0.s¼2ËÂõÌÌ\Ë»yôó âs®ÝûCP0†è:žœÓUå†ïþ0ilËyÂuÈ3Ê9ÔÚ‡–í¹ÁVNJuœxÅ$y5¬LÊ”9‰“ ¥6Ïf7Þ§>)4«Ê€»D02ØŽ©u'-yóˆŽZȦ wzZH}€ÂrÄö^Ä ²‰BÞH÷šôÀΤŒ$pePmè/O†’§I¤àÅMž¶€äQиîH] á†Èé¿GúGÇÿŒ‘þº¬ÒàòéOjü{¤ÿÝÙP{¤?ÉíÞS¤¿.Uç†ïé¿ÝH]6!õ«2FúkQÝ.nò¦|›>lÞáy¢úO÷'ôVnÏïOèíOèÑ)£¿EÈì•¶©3m2Òª†v:¶Ã´Ëœ­bÈ^œ:…Èw ¹ä;–,É¿ãõŽ×›Õ²Öá™*$7«ß¢©¢ÏJgWh)¦½gj8¨¦¨«sÎÈå£J¢ùˆ¬¹åOe{$Ãà5núÍÈ(ïˆù$õ†¼uº<-‘HCZÉSäDV‘†º­#Àà¤hYÔÍxáqq>Ü’cËñ '!lT­ Ö?ÏÖ¥4ö¶š§™3qš(5>ˆAÜ/ézÍ*ÕbÁÊ#w‚ùh!Í½ŽºœVC^…'¸ãèUåÜ0ÎÂNó@úòÊQ‹Õø·å ó8ÙÛ#¹šæv}µÙñŠnT–ö.Ð3i9ÚÖ[¢Â]ai<–>r™q«» Çe0.Û)Ë#þW¬²êH{HÒªog,Ы+52 8œ–*O„cW.¹[p8«D$£ä%'H›S˜‰Û…§SÀs¥IŒ£+~èaG§¨„ŽŽñ`Í´·œ­3¸Ý‹‚9©Šk¾Ù$ €ì¸3A'½¾\uÓýV•l… âÖ8 ]-íAÀÛV„sjº ¢¦×å%”TY î3Ù4edÄèä¾ÀÐÃl²]¾Ñì™..Cî)¶7ás‹•þ ex;ó »îýÁ#N€{N‹^Õ!:Ãí íOîP'·Ù'w´jB ´­üÉ­ÚâdÛ¤Ô½ä÷’_Ôiï%¿JÂö—ü"%÷Š‹Q¬C ×¥vŸ}Ü–MêL»Ïž:…»+”±L-CŠÃî¸S —·)7³Ò¦Ê]óZö÷ßÇ×~ýO|û•Ø— ò$dW',Ûæ(úmÌe§u¢â›U©¾'̦)šù‚*ÈXìDêBÏG^ê™–0«ªÝì%O]Íà¸3ÍÜ<-ìÓÁ>sÒ²å9ŽÑ$˜¹ÑÖpý—GøÙÑû;³ÃgÔgôâϵ´ÑÍé×g<1Ÿ½k;@Ö~—õ¥¢L çÓþx0’ï\'†ÔÖh#ƒîû”C“)p®ïFá>ðic ÁgJÌ1}Ã34=ª‹fÆ«Åkï«æð ÓÀC> endobj 5442 0 obj << /Type /Annot /Subtype /Link /Rect [428.639999 699.860000 482.399999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes >> endobj 5438 0 obj << /Type /Page /Parent 2 0 R /Contents 5443 0 R /Resources 5445 0 R /Annots 5446 0 R /MediaBox [0 0 595 842] >> endobj 5445 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5446 0 obj [ 5441 0 R 5442 0 R ] endobj 5443 0 obj << /Length 5444 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsUÄ›D‹ÉLR  EŠl·Åb³ètú÷+[òØCú;/–?÷r8·TmjQXBªÇ‚»“«Y©ê’¿µ¯ÔõðÊN{¤¶²]ÝHã³c[Õ€Q¯ l¯Ï¿ ¬+=|ó‚×î°óg=‚årßÂ3BÄ<€‰ùë„ °A QÝØ~¡®~¹¶…PŠSBžf™óâApšJI+Þbw[M%…u„ ‹<ý(á®ì ÔŽx/Ö.‰xä—¦Üg‰]`Àvî$x[ò-ë”(üðLOPGzÒÕßwÒØË_üºûšÍÐF4~X‚Cäow“átÞ)H«K˜¬=®Á¼á  ÅS×,1Q»Û‚œž”1úüaô%Qó©C?ް1êøÍóWµ„¢ £ÚΦŠÐã5†hÛ/îÒ\âÃðä(úÆÄÚ`œCHËÏ.LyÕs¼÷A¤„(R<Éã|íáqf„™EÐZ€*ÂhÃXòv¬ÇœÒ]·®xŸoEdÆPr»N£ÛýF€* áhøj>€±±‚VRˆ*º VÐÊÝV•„!åôÍ—œ¯ñý§<1´j†Ãö'3Fàó`âÒ«o|¸Èñ1ýiŠ¢Õ)©Ð6æm•èÌ£Cl×9:Ä— Ø•r!é ¥iıÄdxÈžÖG…ÍÿÍ¿åÍOœÜImÞ²AX–?3•¿ÌÉÖÙZˆ©‘ÄbŸVDÑ9/’8?’1­¬‰øO)øJI‚€“ð °a“ ‘[Ši[—îïÂâ ± q<ÃñfÞyQòâÍ:ß( lû`%Å_•;m¹ô „9M{ÚQq^ƒcO(ÊßñDhŠÜViO(‰ @¬dJ'fÔÍÉ8kœ¸ð&ÏÞðÄ|@ÊC!…pzØ…¬†×3]’¼¢“Xã ÍX¥]òZ|nrúìÆaWÇM5ãá Û©Ë_od‚gÿ"Ç»‡üé ¿…ð÷]§ä¥ÏË–0á=æ9ÌBˆèù,ÃI¯âíøŸàC%â^Ž_¦ÈD^›—±/# Ò²¢Å§h2Š %Œ#'ˆ0õtp(‰-ÜÑ‚ð½Óœ£Ê±Ó²ñ¹už·ÛTƽª ý9•|œ®U±â”7T8ãƒk?Âgpõ®Äµ†8³߃ë߬5ÄïQ¸Ê ¯ VŸá3Ve®ƒÄ;Åõ|8¿‡1÷#áÚ4¤bøõ|œMŒÓs \À•¥pµ#Ás¸ŠSUÒªJ‚8µŠe3ÚAkÃ;•xmX&bXãêgtÚÁõ°˜â!osªx¬ W†m(q :¦ü ÖL˜–¬³° !è ׆OñO»H5Óv–X»bÈcžaØE··~8Ò{ÉÒŽÕKëwüÌX:$«DšÁÆLâ‘À0”ËãC¯KlŒÇ¤½N°o´ÎŽ3Dÿ¤ž Þ)ñž›k-¢óG cªÂ²†7b6¼jŽ¥˜–ª03ðCÌÆé¾„wš”ª?”±6‚â¡LT˜Þ0@¹£JƼZ= «›Ñ†ìäh‚*°>äôUâPy¡Îh댩”’v·<ò–a5bKs´[Ëȧ×*,¹ÁèÇÆ‰saJ"x¯šãKs4*Ç¿cÌFx~«Œ]n=^DoÉ8MlrdÕÍõGëmù©÷”Ÿ"è `Ô­¥;&1 E +Ær½„$øŒa-Ó,…¤·Jv¨w•«ÒlYœqs­ÅÑ鄌å¼Ó2'¦È‘å– «üÝh-,7ˆSXrm±K‚ƒ9'XJöïLq ¹à«˜‡%îÙ…×ÆÑt¢ÛØœÜO jnÍñ8e9(1í0¬jÉèE_ênëet[kUÌ;Æy‹I»UÚ€¬ÞëƒÆ>*îìÈñ é]ƒ1©—Ð`Ø«,´ÂOÇ÷x¬’–Þò51ÂÓæÈ8Ò÷ceÅ9š›"ô3´…ˆU3¸‰“ &,E&¾/Û·û‰…eÄêÚ6¦'-ÑåšÓ‘Ÿa -Æë£XlUpz€§F%ݶDðÈÒãam'bx†³;l—¬RöžuÒø·ßiZÏot@X®[D—³†ž,¾…7N¶õöÑF|{ë νÁœû:¶8dê8$ç ¶Ìá[‘ÇÂHë¯Nšó[r$‡³êÍúÙl¶M€oº9…Hø >çŽïGâÜÝÄ:ˆé`•ºúÞ¼.–½‚1· ý~nÉRJ¿32Ç.!†u¡HÝ;Êr8Sƃ÷fã`é°åZ—k]zÞÔê<çûKeÅ<2r“½Ü\±¬Šw#íŠòLÓæ™wä{r4'zš¶póq7—æàÍÇÝ´Qmdcª`6mDi#}Ž´ÚˆQŒk8Vå=§ò†á«mrý½É´®Ž©"+y#}'KWs,9ƹŒÄN«[P‚=¾»·ŽK„ÖHêyq²ó¬Î'iû*q´#KÀê%À8íÌ:¹wš·Ï”ÌÁœ.¸¥=ÛÎÁO!^Ø:´¤¦ø…W}t‡÷Žœñn:´üÌáZNÄû ?a§âX=bÊÕvtµˆ9qû^'íÿ®wñ#`µäÚ1쓽Ÿ:0âdwR GX˜ Î ¢8ײ”Š·2\kJgUKiÞEŸ*XB¼¯«Û¨Æ*ñ8òýßýKâ|‡/Œ?¾}'`î#«>#ë‰DùèôÃÍ^ xͪÍp?ù^Õ§€éhô5MÕ\¿Ç¡ÓÕÏÀ–mÕ^¿E¾½22 @©JvÎ)ã•0¦j†Fý瑾ÇÂg:øÌ dZYÉúxó¯kR\›m ÝËß<ÂïŽw\ÙáôÌxdáÚˆ@û[•‡=3b,dïãÚŽ Au‡ÏÒˆWµbàûÚp:Åѵg&)Äx³¢¥¦†Î#µKîcSÆ)ñHéãñ+<=^¿0ëÍxµxMãõN×è óÀC:³¶n*q¸gø-Áañ"ðÈ…Où”RîïŸvÿ©ÈÜ endstream endobj 5444 0 obj 4594 endobj 5447 0 obj << /Type /Page /Parent 2 0 R /Contents 5448 0 R /Resources 5450 0 R /Annots 5451 0 R /MediaBox [0 0 595 842] >> endobj 5450 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5451 0 obj [ ] endobj 5448 0 obj << /Length 5449 0 R /Filter /FlateDecode >> stream xœí]KoÜF¾Ï¯à9€iöƒdXˆe;À, ‡` g“ÀX«ä¿ŽÈIC~EòëžfS¢HcµØ]Ýõ®®*¾ýñÓ²ßþÌÞÞ|úö¹ÿyóéPäEUtÿ²ã×›§¿Ð.7ºûX»2×Íñ_öùëá>»?ÜnÛï÷U=<ØÿhOKtþùùÛám·ø¡ûͧ›µŸþÊtöÏö_²ŸÿÝþø¥Ÿïø_®©Žþ×}PZi×þçé§ãà¾Ë¾µ ¸‡yßßXmtUk/8îϪ‡¯§¢ÅЬÔMál¦”ná,Ûãøã¿‡_ÛÙÎ`äUª®l]Ìžµý^jWV.kê*SÖ•ƒY››9—ßD¦(Jb¢"å¹7UØzb.òôMÑÒÜÃF­©}Ïì4•÷á—ef¢#DÊokÝÙLu„3õ#gÞ ¾»;¼ý¨¬qGAt÷k Ƀ4ë~ܵÛ-³7Gm\v÷Kö¢0ï¿Ïî¾>ܵp^{Ueª~Õ¢|XµÉËÆÔe't»]£eш…#…‚# qË!(>À‘ÄÈ;8RÅ?c~XþŒ‚ûÑpDÁýhŒ9M`›€@8Q ^ÏvŸÁt!Àg-¬‰ªœbÆ<‡÷ƒ!€r‡‘Hl‘N´$ÎÍ@ØTAp Äæ`L£!«ªFàlš€ Sb¯Oãhñ²<Ñ Ö`X Á}†vï <Âu ÁÒ[ªð æ™W#!Í»ˆ[Ûii…%#y î™uLñ¬³…³‚’Ë Á¢ÄÒ ËŠˆ8ÑJ{àÄ`ù@à$ é…ÑXëà&|nQéÒ(º4á“18axF€[C„7Àø aaÓĈƒÈ›ØâÀ˜c4öˆ° §!§k›ñ0F:(|:ØúŽD½§Ñ0GP¯Åò6’Ÿ#¦ æÍ‚!HÙÓ0‡åNLZ5>ö6¶x˜È7cU3Ò®£!Yûê Xì…1ø [‰£}iвs´,HR&޽=±!âY»ÅÃY<ê §x?s>Üs÷d™¸qЈò6m®°²“`}Š‚r–ÆZIÃ~2Eíc?ÍCäAc‚Ä÷«ß€3÷Œ¼5Øçˆ‡ÄvŽ62¹ D¼GR¿]4¶œæ3"ÓDÀq&ÜB {Ü2,£KÌ3ت«kƒBMy=ŒÿñFÒT>7’”¦ÛoM()¿{q½¸„㈂íŒéZ—ÛôÈ !áMXýÕ·q>¹T îÕH.,k˜ÜÚ=þ$f4½qÀV CoB–Þ&eô6£èT|û9Ìl»},e%¡má“·ëCIZÄôÏHo‚Ïp ZÈËÆ:‡¨ÕRX¢`œBض©Yv ¹ ©}22cÖ‚Z»Êªõ)Caý TÆêbòp4ñÌ6ëw¨Ú:Fª5½LœÂ´ƒ¡ÆX›E†ñCDLqµ¢adêFˆŒHæ.mýêËh¼z•´à‰†•£IÜÚæ”ïðzª/«óLÐ<ΗV}Iå³cfqžN4Š 8vUÚe@ìîrC’)ßÝâڜ핟Íë먶*yçôÓ7ÁéõéFÿõÄŸ ã§oRÚQ¾0!˜XEØÚ>Ó™ŒH=p„E æ6"V·9<Óm.N×·äcE¦R¶q^šì¼Ÿ8ÖBs|‡XQp!¢«$ˆz(‚À?l6mÄxr¥N7Æ»ï)­Cõì |›Ý÷”|OÜ9"eœbeºGÆôW+s>«]:„¦¤½§è†{ŠVÖ§oeµm²8#±™[ݰùžx$f6_UyõÓ‰˜WW×y³ÎþaÞ‘¶ÃºcajÃf¨í†ùÒÞß@õÖLÂ[«õŒ›BÆB :å©c‰Q«×•ñ9Eæ¦ß&„½3ðy0lØæ'z‚nÓB {nLP6rí|â—ë÷ÝÛ"^ò®ð©Ùf¿ÑXü(ô(ÅÙAóTcr·Ó×ñs“Ö•DMŽf®O—ØêÂ÷=˜bwÑÁ6)î‹×Á§ƒOtýªôÕ)$¬äŠªéLô]Øf1ϪÜJ¤ÉÕ^ý>7CMãÍP®©VÀwcNò6ê âá|L\Ms_Yá} %Ùà`1Î#IìXZt>-1¡Ìúa¾ _ Wç9Ð;ï­ôéLæàãžàFvbE•§Ù(U8}X Ä5oY\Q5Z_h Ý4 ~q).vZà«„°ÉØ­ø†Ê ‚Æì|pžÖLÒù$ z5s}gV3èsê]fTˆã2Íé²ïAÍ1®‹]P…:¨$%Z´=­m¿²û–X[Z<þAÿãóWz‡d_<’ý­Høâ£“ãªLµÛáÓ¨ªëê–µæÕss³ªòj¼t¼±ù€ô:&Ðu^÷ù©GF:7&×Íh¿²Ì«=—ä2¶ŽƒÏ4𙎴jë‡.M›±Ù:Òzú›÷ðoûrù‘~DÏô26¢Ð>zæ]öL±%{ïa{`ª;~Ö¥:»ú%\¯^N=§=3I!å`¶ÞˆkŸ)º¡Ç‘â’4ÜÆ6¦ŒSaHéý%ØO÷¹Y+ch1L}…1:Ã> endobj 5459 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5460 0 obj [ ] endobj 5457 0 obj << /Length 5458 0 R /Filter /FlateDecode >> stream xœí]Kk$»Þ÷¯èu`j$ÕBÀãG ‹À0†,BannÂ%s‰sùû©v©Û¶Tß‘tôè*»l°=S-•ttÞ:Ïüö÷ã?;~¾ýöŸãwýûöÛAT¢ó×ñôýéõ¨¡ªÕüg?´•O_Çï?OǧÃ×Ã×éçÓAvÏõ¯éáùó„¿}ÿõðy~ùaþŸo·žþúßQÿ4ýë—ã_ÿ6ýúIÏwúÀÃ0v§?þ=ÿ!•TÃô×þëð—ß–0<Ï{úù©QM3ˆ¸u<]†Êçï×CÑËı­O€;J©¦íŽÿþãðó4ÛeÕØHÙwM/¼gíÕyÚ±ïŽjÚ»9©µ7¿©dìDƒêÓLô ³¸­IÑôôTlÐã ¯¶Ýçy¦X€M›íÒ@þ´"µ³3àáL\¸K1ià~™)î²mà´¢$pÇ3±á®T­á.b·yž*^ý¨ÒLtZ‘ŒÛÚòx*6è'Q—åÏ3EllAþ´¢4(oÎô5‰øW/âÿ‰øåñðùA6õpÒvžò¬2Í¿§Í¶ÇO'9T×ÇÇŸŽ¿B=üáøøËa¬Ú±îÛYÇšŸÈ=©%z"îá˜!| ^¸EOÔ8^ÁÓ=?¹œN1û™L¨ì‚Þ·¸ ‡|ÓC(ÖpÌ~ZJ1p Ž*xZ½\Ïiµ×>­RÀOn žÖè=…N«†ð]máÓ*È {1®æ´TwíÓ’§µ ÙOv®KžOah%%y?)‚.ÎŒ÷]C\ãj±Š}w“Çá}K¸¬Ó ŽV9„ÈÐ:ù†H‹õl 8¦ä¾Ñœ©ï!)(ø„€>há'é(mÀmÄ ÜöÌVµ¨k«Z Rµ¯—9ƒp0åec‚¿©šy¯@i©¹¯ÂÇGëÆ˜UÂÊùĤ:¯íåÉhNÒ£]à•4µ¹hsxiÖG5]/œDÍÇ&eÕ6Ý0=#VÒ™gÑÂcƒ+á¬Qóϰ1â@ AÇóÌM$À+"0 ±¦ŸgW)98°@<­é…ÿÒðþL”’_\ôPŸeßµÝ[ÔŠàÍ^üÉ[ùö£É-#&ÙŠÝf—Ck  ä„Ï‚‘G'Üc9”WÃ'x „§Ö¼XDBp·ˆ÷'#[°ZëÏË9\PZê¹Lhy$Rä=#”5Öš=}0®ˆbŒ6)ä¹›bÔ/íº—¢êzéP¥8PÃøŠµ;K˜8å«6Q†jÅ[ù@Â,ž•]îŒucÈ‹X,€ÙÀ¾ä0 ,œaðbŒ…ù½4L “}ç24²óËÚ+„:A˜˜‰àÓuòÓ†÷®4¡mp€Žte*%@N˜Þþ¯)仹š€t;dRn8#O­ÇÚ`ªØ<%0ƒc°`DO¡Œ¿++û2~ÌÞÓræÆ@r޳—Ø ã˜¢Sd[¯¨#>fu™‘lbcÒ×('Vˆs'©¢m™~3 ÝWùûðZmpØæY ¿B—¾uëàƒzÖÆðظ±m×b"´˜<öЖH3¿8Qª7±™cQÀÝÛ0ÅÓ;E‚åÜf9)¬1´>7ϼDâY<“¥ebúµ°)ªYÙ´}aŒ>ï¥1÷ðI­‰_YZ-ží!xÕÜàùàÙê1| ^ÁK¤½5[‹ ÓtšÈ´®ój6Í2ªFÓŸIº O´æ²4Û˜0GeR&^ „]•m5˜jáĽâ+\Æq‚Êà{ˆSd`¿Ä'© B‡€(\5Aç¢ÉpÏá“ûË`””+h…3Z¢Ù’…¯ƒ’(C¶zæv³ZsD[% Ýó‰d…§p4ä \ƒ¼Ï ‹}˜Èža®Ú^±÷Í`_`«ÓBˆŒ9åÃ( Áò–q Ü{$‰Åc‰%¬0 ûT‡êL!•BUNœôI”tá$ÚsŠXÀ'5Ny/´Ÿ´Åp‚mS­q!Fº.g?Ä pÉœ~\¨ES£ ©ÝRôýÛ ¬(ÉØVæ9®\+«Æ_} q«}ø é5ßçøë–It B*c ædcqÂê"ˆÙÃm¡%žI®ß®~¡€“½0€9èáTçŠe¿’&WK2A‘ëX yÕê¶«£Øu°‹–ó¢»MHœ™$ø/ob!öÖk—¯ÐG–R «ûý;g¬hÎ\daJ#V–e `WÞµu4Zëz|WpÑ%=S²–oqxI~q¼2° ±À¾$W9²¥1P¶–ò€á¢p_öš0€Oˆ÷À…Ø;Gè$/ ÔcpS\¦´†'×à±XËÃÅkÃzˆU§Ý~‚ ÌÚi1r ¢d:.~[êäð~°‚íìEçìòëøoå¥ò¨~å’O ËäeÛéµüî;×Òiµ„Ê"{ç­{T<`¸ýtÜ™ªæ·e÷œø“ÔiÉ òHOÆÌ扲üÃØ{µG“¯·²ÉõC8ò{g;eÈŠ˜,·t„ÌõíUˆ³vZ}a‘”ôʸ³˜¡`¼ƒä´aÜæ]&«—S3‹òZ¤Ë)PÑßù¸>Ÿ|Ä$Y]¨–Èp!5WS”:õ¸úË\UQz2 cÆì?IBîQĕҞß"VâÒó. â=¢tsT¼C$ØögÀZ±±À0ò<,þžà_¾* ]³¨·t Ó2é£+‹n€eçúY¯(|Ì!˜ÂÕ´fmz7ª½4Ô ‰ O[a¯:¼™#nÌðí$¾Ñ„ïIýíDÄ=>Ï'!ʉÏ'ð-Y¾Ñ·ÎõxY ÿ 5ÐÄÍ'ÓÝÆyœÉ¥Ð çLp›nÜb2qÓXEL¸Q8çC Ò½ÂkãHGÑsÎÈá°´oñ1œ" Çû`Ú,…;鈵1ïÄ”…£® ¬Kĸ¹Ýô…ÛáÆ²Å¸Ý&5#ŽÆÂÒøSq!¡Ó2, Ž mñ)À1„4š+æ¸å-æ\XNáX/FçšiàƒëൊÑÑ!öaˆ¤¥tgËñ°¤µQ±Üĸ õbÕ j"NS-Öú8m¯ñ~ö]©gÐTR†ž[é>á´µ'ü’åõ*k‡a,Ö°åÇÐÒ® køÉÚ}NuïåIŸ` q›|Œ°xñÚ6¹Ó´Ù6ñ€ÐBwOËÓ&±×ÎÆ¡s­Ø (ñª99„Ðb`ù±7k÷¦ö2öChYë°¥‡±°îÁ±=‰Nz¯¶f¯ gÕ»ö³ël`Å9Û g c<À*¾—KJõ˜æ¶)«ß›ÕÅÒWðÉ­B¾7b(-ß7¸>a\!­üxowy‰)aü‰q_¶Q^Ãðcî÷¦å4ôµß6êR¯_OKMÄ92î9‘ ¥¤QÚâ÷ÆíŠÒLÓ¦™d{r$Ç{Šy9'Vs·qw—¦àÝÆÝ¥QiÔÅdšìÒˆ’F £.KqªâaŒex8>ެæØj;_ÿpÐ)"šûTxîŽ/Õøöð–ne8qe8VGÃqêƒánœŠŒ\8n‰X5£ é{‹¢­!¬qü+‡¯-i GbÕi÷èìVj§8/Ó6Žá#*ü•:9¼/ÉÈædírØÙü“XÓs¸Ì8\ŠÁ\–)毱b>g¡Ù·ÆyÇ á³©ŽÑ \YWý¬›²¿¯jSaÑmƒÚJ™f“fêRTóƒWOkËxˆ²ÍS”Z÷¯Ÿõ«EòµÎW¡½if0T2`¨ ÙV³"g©°AïÁ'‚ÏïTÀ³ÝÂB+¸ƒ;…ïÁF¬šxÆW¸j|Út0Å@¸ÉdC_ç(¡.Lôu΂';ÆÀ†vI9=¼î[†€Ëâ$At!7Î1Ø£p`ö_(¡›…Gž#°=öi/a ûï\0,×[DüiépއÇ#nʺš @iN”2ö@[PÃÓû»ß®£Ñ i„>…o'=ÜýXºp¼Ñ „É{  aeŒ ¦ñ@xH“°[·ì]]däŠXÙÕERÊ|¥€À²-1:tƒ‘QªŒµ2ÍŒuEÖ÷ cgIÄM–- ŠÁ¸Š¡°?›ÆMŸŒHªˆ ÿ;À$AWiroÐJtåå;^÷ÆY¸ŸÔwE c0¹zÄ×5pVÆûÒ®>„ç3¢æ8§“Z›ºÀ¿b¶l=g×½æC0¢3$b(&Óš?ãa‘E˜Ì¶*ìñ š,Q¶³ ë›1ñÜ¥=s/ y3¶C$]¡ÂI÷Öë†^_¨$'­ÉæbÿDpärξ¦]"œ‚Í' sõð/pG \‰ª‘þuVI˜aáË™ XrCí•´*”õ:Ž .E@®GrMJ[§tÂnéÔÑ{ ˜¡åLºíkƒV8ÕÖ¢’ï¯Tu-àÒzKîÛ«_3sø–ºó§‘ÉãN(Œ0³=&cXTÆ‚õÞïj„1© Û=ÆœŸFSÉy÷ÜÒhÊvúǹá/U(B‰ñœ‘†}Þ¶U”€Ìû¼Ù¶!Ó[jM‹wëHQTw^.ÿœ5yr¤#¬ ¼üI¢œaWP„»T©-FYƒ˜ú0q€ë«U“ÙuÍ µý`HBY‰Q/c‚—7 ‹—-c¹ßnóÜ"kv³—£êÛÑ vœßг™qÎ%'ƒ“È^tåç¼ ª;R+’nßkT#†ˆÂ´FXŠ=Ǧ ÐÐ ©Œ@¦õD—1”\|FÑéûø4áâ„j§ú×÷rÚX-^°ú+‰×äPw¦lw”Ó¾–BžFÙUsŠb-ΗÎ:;¼ëªnYMe~¦ ÕW½yz3|û…'ó1Öu¥ÆE_@ÛVÝŒRæ/½g€cF8fÖ^zU)ñœwiJŸ¥Ùfzý?wð³:Daa‡hŒ&Œ¥'íCÓyØ}b!{×k{&€¬;ý­ZÙŸgmáûúp<п4Ɖ!­5›ÖH§1b~ôòD˜x à>ðic ÁgJ¼bz}ƒhZkã^oÆ«ÅkÒÊÁža¸M‚gà ºJžì½·‡Ù F8Vš÷'äûǯ‡ÿ¦2˜ endstream endobj 5458 0 obj 4772 endobj 5461 0 obj << /Type /Page /Parent 2 0 R /Contents 5462 0 R /Resources 5464 0 R /Annots 5465 0 R /MediaBox [0 0 595 842] >> endobj 5464 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5465 0 obj [ ] endobj 5462 0 obj << /Length 5463 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsUÄ«( (°I&úP`úPô¡Èv[,šE§ûп_Ù’íÒ/G$-ÙJ€ÌÄ´(òðœï\I~øã׿ïÿùÛþç¯ÿÙ›~~úºk›V·ãŸýáïo?à¦|üµ3ªáýáÏþÛ÷Ýëþu÷¼{þ}Ý1}|pú14ž^1vøÛ·_wÆ—ïÆO¾~úóðÛÿö|ÿ§á¿ìÿú·áÇOS‡/|ß™^~ù÷ø ㌛á?o;4þk÷—ßí†`ŽýþýAr¥ûá;sÆñz~”ÿ¾}½¬Ý+ÁÙ@Æø0N5üößì~z;£é%c–]ÝkÇݵï;½ïÜ>©ÅõÄævćeÉÒÑaDlÖÌX+;oOdº 1NÒ(5w𧮿ÒK0#óþ0"6oj'Ê㮨¤‚ëã4å L3)vêj6é;™GxŽ#bó¦6‘Þíê9 ò ¾züø²ûð…Iaèÿòó0’£ ¼|ßÉá?Éøãå§ýïÛ–uØ¿ü²ëÕ‹N:gli?¢[„†½}A- >ÃDZ=½ 4œG‘ƒµEöÓñò2¼þø¹|ÀtMëÌñ騢mWoçŸaìØÂx#íÞð{ä8ÆÓ#QÏÀ±µæØ¢›¯­±}´há§ýöÚYdsŸ…³àγ N~z_AæáBÚ„—Ùá"ûÏéx¨Å¥©½|\KÆ%õ˜1\åH …stÏŸl"u!‰çQgQܱ¶ö70¯f!°ýUñ 6æSÏk± óáµðt©UAæ}*´·Å¾ý 5بEBZYïHÕ±võ »XxÙ úÐ#AÉvdŸkˆm58RK›ÎK¶ê$›ìKsdÇLÐÞ£h0‚áÇ¿Äów¼ªvÕ|Y…œbÄ%ô:*kݱ÷¦HÐðÎûc´»†¶<¥£ê´œI¸>-ôµ÷ø lÁóiñ|ð3xp¦ø=$êf*ð¨ñØ ÅcÃ|@ZvÎŒëÞäøsa8뜹úVS`9ãÖ™ë9(4À3%dëIu”QS²¢”|)æ7Ì×YóÞX‚'«³ôlýa hP§S86ko¤Ì.ÈV`A_чñæ°½à¡æE‚®]§òpE͵W&8ž{CÂÛ×¼åËbG¬pwªuÐæ÷ÐjÍÙÅ[S¾×aœÿ\oâãxNYwë"²yõG%Ž¿7Ͳäª9’½NÈ Qüñuf'n£ÿ…â¥ÜîLc´Ùn[ˆ°¥Ø©–`“Fœ²ØžÝw«Ì@àŠI "P*—îNo®9ô—fT¬93jN]€€ÈîÁU,éXβîyÉ;6NhÉ\ýBѯk0—ãÝ«pæÚI»- :¬ *ñF| ÇvoÑSÏL+œºvJIÎ(gµP(µ#Ä ÏÙ3oχrÄ¡£Ø¸z’‚7ç*Œƒ·×»”ÝÓ¾¬VÖ2²grBÞ™?Dª<À1ÅÇ¡eßÔSžø ¡¥ª4 1Cš0aŒ} Ã3%`¬"ä"ˆÖYÏôظ·÷Öò ª¢ª WH{(óP•ö@oXCÌEܼ¾¦*—wç[Üêí²ƒërzëÃdô=qJ3Ýê©>àáò‰u‹?^-’¹;W6LÛ0môEaš<ŸÏ½a©J{C¡ …š’°r”¼%¥R½*Ö˜ðy?ƒ5ž}ô”(ÄV3¾!¹p¼rÉÜ›7;_ÏpÎØµgp¼=ïNfüLÖ}ƒž“„·DRΧªµcmZ¯ÚNæZûkŒTkç/Þ×I8# ¯®&íÊYÂŽDÁä)7è±bŒi›·V Nl§îl·.¬–Ö”“¾ñóä‚éíÖžuðòvk7¦ø04ØôÇýÑšrkO>-Ñ!Û£ŠàìÚÍDÆ%µ†s™ÚH\sù`·lä8l‡ ]ÓŸNFt2-Ìå} ÷ŠG2ã})³UkݱwT;½-Sš«kæ°Óât?yjºáÇÎßv‚—kô­Ts8Çßý¤”¯L“|ö+tÄ-“›{­ÅYki/Fü ]Fuz7ñKípæ5<½àˆœé¥p¿AÜáöú?ñ’دa­ý ÆOMxñ¬½Ã&€j%uˆ1–ñÐ4¸¨˜`)\¯RDby¦ÕGóªZgˆQd)¬3H@i`rö¯)\È&Yh“‡ qË Òg±R€rEàáÈ=I++V„ßÕK¯;[½Œ«lÓ·–lŒ4eê4ëK 6‡?"zÚ¾.1¡Jæ˜#ž`'¸ÅY»§â¦Áä^žwùb¬J^ÜÉçx»/ÝåXµMž  œ¤¼áeDÛÓ¡””ÍÎß,/ša” IV±^8ŒÀ;Jl>(éÞkuÒŠ¾ÓVlkŠƒ†lOŽ=˜(Å9}wçaK sRd;œ.!kâ#—$”üXÔÔEsø'E¥—‰u—Q[%êÊ»ã¢UaƧijfNn“Éìá­â„Ëfð6éj%ã#—diþcƒÖ·¨{_0>ðÎÑ«„{áÌ!VNŽ—ÿìwÖSaå `q–„r4Òþ(»&ÏY×XØâ-ïÎ(nš+Ž/‹u –·°!\âEé5 “y³4yË3“Ü’Ùj¢Ã3Õ¿é5«ƒpååŠ;Ò!H„ñ¡N+ GtÇWµøú˜ÇÖá¤þœ1'+HIC`NÂǸֺ°žr¹ù’96x¤R“bÎÕ°”ãö=+ŒŸÉÊ—U髿\,IZÂ5V”#ÛªR±›s¡`µ|•#å2nç ¥‰SÜ„Kœ± ãTºç*`|Œ=ž)>F’pô$^ÑÁG{Šã)Îâ5%μàáFGÙD`@?çú;Òµ¾X«Sl‚Þóô†™ÅóÁV$¶ VW^ ï±î(QÀ¥ —ç€{¨%ðñ›´Ã-˜:„kîó^xTÓvPŒ…gwû–UÚžÞ(K¸\œrœ4åXLFÅ’N°<ÇågEUá ·‡‘ {Ó®òx=„˜Æí­Klï¼q@Êð™Ø¯ä™xð ŽÍcýÃgE/ônM«\‰éЇѮ?’pÝ–Ç/ÀGÉ.ƒûd_™“j^J­´YÉHu«gŒtٕƾñ¨)Þ4ÅF TiQül|Œ<¶± ±s’ŸA¹ö‰r¥ŽéákHp$ëu£5cšÏÉr‘ÐwÍǤñe¥Ãë=Þ'á2 ,›Ž’˽3>V¸,ÂáïþuéA\_˜~|ûî‘qÚ 8<{áÁûhWŒÞ³a×6,öL7Ç£½hO Þ)$¯u£¯×Ò÷²)ã˜>¼k:»€m$gw¥e!Þ_=Ì_©FÅX—–¾ÇÀgzøÌȺox{˜ ìÚ3AQNoL Ï´cÓ¥¥µù€ÃyàÕÆ‚×ÔóÈéâG$Ó“ õf> endobj 5471 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5472 0 obj [ ] endobj 5469 0 obj << /Length 5470 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`4|Š,°Ó9hL99³» ™E:{ÈßlQ¶[ÔG‰EŠ–Ýî¦{š&Y,Ö‹ÅbÕç?}ýGõÏß«Ï_ÿS}s?¾îXÍÖUûïOç¶–¢ÿÕX]‹vÿU}û¾{«Þv/»—îß·oÝ®q˜¢ð÷o¿í>÷“ïú¿|}øK÷Ûÿ*Qý¹û߯ÕßþÞýøÉ·ÿÀ÷m›ý/ÿîá‚ Ûýçü·}ã¿výCõ[‚=Œ»ÿ÷“MËt“ÇÛ±+?|ŸwE“±JKÙHQq.:8u‡Žÿþ¼û¥íFÝ*ÎM£ [<ªûa¥hªÖ4•êFê­mÙPÜÆã€°skt %lÁ8h-O¯lXÓ]˜ÓYOc˜þó<(¶7A^Ïly„-ú(´Ì o2¼sÂz07 5– ÞÏ A^Í‚1zyØ;· ©jUa©ÊY¼Þ p-–i˜Ê±Âr#+UæÁRj‰¼z* oáhXÚ•Òmš@‰ Ò…®)£Q .%;4ŠWJÙSÌXïBÅ8ÈkùÞ)±œ¦¼SbÐZØ„a˜L XùXR!²ÏÚ‚)ë§4ƒ“Ê©j®kÖãàD.=‘Û1šá“?œ}´W²jlELõmF}yoØsQ«ñvµãiz]¡†Ož}Ô ¼ >†Ä[_ŽùÁ ëZ ËÅ9æAj#ðë,UÎk­ÛÁ¶d×¼å©å;®~ÕS9α¢ÖmDÌãð‰¥«Äö+ådmÑ€¬Æ@mሱ̞(;kÉ<øäLÐÆj/ŠNÀ^ ì‹ÀÌBa·º­j§¶J4‡­j™ñ Ö€Q¨… "ÖèQ ÿö±ñ£ ܧ…}zÆâ²6ܾÓj¼gSÎj݈÷[¤“ݮ’zªÏs<Ô®” Ô"Ûø>Œƒ“iíQƒ¸†Øq‚ÏÖJŒû@¨ö7uG·£]èÙ¯©åA.êÀ ã€e3lËJ¦F<ëœçQ{åÁ% ¼¶§ÁBìÍ”EóÀýÅP;uŘŽû‹û™Ïs&~´#úbÿ¨°Ë©Ÿ f|ñ†Q)«kŠv¬*°8\à3Á.(¼eížT˜çR‚‹p¤Qö0‹›ŒÃè ×v±p¥8²|nÁœ¹EɹU¬$õ¹bm­M]ÞµuîÑåm ’ (Äg›–O«@C¹q·V‘v&%ïuQ{¡îÖ¶~+©¸zŸ ï±ÒG/ðÝ =EÉÞ}ù•b©Dð4`ÃçB<Îz%óõZʤøóf+ ØzxJ|]¡Œ÷Çgƒé?`ÍPd47Ô‹ñF±  Mä¢Tû‡ì¹íœðK8¥OéU`ª”À+¥Uò F<€ ŒŠß;z)r¤b¸?3zà˜{T5•ŠeùëýÀ»ÕÛ{¦[?ßUšçÍu®ç^¬äj÷ô~*jî4¼¹jz!ëÙpðBѽ׃Ýùqg¥PÓဢ7ÇÝCU~¾J©ZT ùá8¤µîÖ¨3n#Ì{tLåÂ½Ý ÊØ'ø¯:>¯ U´ClZ©áš•^(yj$îSè…hÊ<˜ú°©Bˆ‰ ¨RìNÁ|Fˆ½rtP„g,O‰’ÜrK€Æ²Ö>^¥&Oœ¬¡Ôƒ#¼£Tϼéyø4úƒ) Ñ:1åfÖÕ^!#¯0ÌœÔ[ùà¦ìˆJoÔ¶"§[©Æ8œ­ó‘`7®¹’f,³ÜN^ªá‰JMš¶÷WáÁê k,/“H¿Àañ”Ç5ç(O½¡ˆKŒ¬t¡p‰¸EbN|«U®³‚IÎ’{+Gº¢šZ+r¾fÄúGÓÁó­SûÃçl=FDceQ–d¬¥HêË«tW9£b±4_ƒàÛ »,¨H?$ÊÊŠàòþµ,!§ ãÃxõJ‘RÌUÂÔˆŠ¼ëë Óˆ‘®ðñBÑÝ©7_̯¸“}e?n‚ [ú}¶c4м¬Ù޳.k¹­uôwº*\ÿüÙ²!§ ÷ Á8-ê~pïhV¤s!íˆ&æË(;x§ÎÔPqf)õo{\®€äöìÎ}™R×>‹#5ÂÌ!xÞ ÷B÷‡B÷f±ÖÛ`¡ûˆíž/xq³üœì;±g<ó’í*·/¨j¿\u`šÆÊ"-R¶+Óy}×G߉¯kâZÑŽDØå+\Ò¾³m³Ð¾[³ =SãƒG„KÝëå•o¯cœ˜s°@_ã`÷ˆT/¹mÒUyó½°ó ™¿‘Íñœ„ÉxgÎu^™Fèæ„}\ÇÆãÙ²üÍó±8Rñ! (§¥•¯Î/u»³¹ˆŸ´¼Y+‡\øNŠÅ–€`Ò¥<%ñZN²ÜðEåâÙ?„_&”aM… ÄH#”â´Þã)Y?Ânž4K{uS¬ Ï“3ûÚ, =o.¡î$Å{5u)tÕ/¯£^ßhô}Ô ×@ýDø.79˜òú¿¦T;Æ×†˜ª²æ4ÀNª[Kzk9ö7žy^wÎÂØ-‚"]éo;o†fZ&`‘”ÏK+ŒB*=\!‡Tuk ЦÃòrë\gR*e—jÁ¹2(22o6¡¼é”óZ¡™Ó\Â] %²Ãˆ­„K(e°u¸ìU„ÚÅrÍà](•w g®¹üÎÝóŽe>ýn¼’ŠfmJ5¥[³à.¯·nq¾ª(eÁ]ÞvP˜3°ÞÄÞ5|~ÀôÏTN¨¾µÄÚ{2±GîîÅ£Y>³Üm§ DJEûbrý¬B\÷]½uKï–µÿ€ûñí{>Ù ‰/A4»Îâß6ï–1•X åM}¸à«$;V¥ëAÓÔÍt„E«ê3‰ S›éf¢¥?¾HY‹v2´Hëºé¯ßN-ÎcaŸöéÙˆZtJ[œ÷ùGëÚù_ág]HÅÄ ŸQwá9ÕÂÑ:Ü}u\·c1kw° êö¿ ÍÕÕ4œÏÄÓcß©>³¢½ÑœyÑõa}Ó©…é@ÀuàÝÆ‚÷40¤twŸài§êÍŒ¡Å0¹¹):Ã<ð…άeMÍ÷ñ9ï ‹—ÁåC{É)÷«—Ýÿ€9Á endstream endobj 5470 0 obj 3479 endobj 5473 0 obj << /Type /Page /Parent 2 0 R /Contents 5474 0 R /Resources 5476 0 R /Annots 5477 0 R /MediaBox [0 0 595 842] >> endobj 5476 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5477 0 obj [ ] endobj 5474 0 obj << /Length 5475 0 R /Filter /FlateDecode >> stream xœí]I㸾ûWè Ý"ER Z:@ ]@ƒ‚žÌƒô •9äïG¶¤ZDOâãbÙfеÈâòøøöåóŸ¿þ£úå÷êóý×ÿT߯ï÷_wõ¾6õð¯:|}zÿi÷~l­ÞËîð¯úö}÷R½ìžvOýÿ/;aŽ/Žßú‡ÓÀ¿ûm÷y˜|7üåëý_ûŸþWÉê/ýo¿V?þ½ÿöÓ8Þáßw¶3‡þ=ü ¤¶ÿåýO‡‡ÿÚýíÕoýìqÜÃÿŸ”´BX´Ž—×WÅñëý«h²ºÒÊVBÈ~ºÇÿ¹û¹íuûN ÑÕÖ«Gme?¬ê¬¬ºÖT°Î ÎÞÖ %Ò=.Dè¸"¶5Q«–Š úþ«>n³uÓ`ÓHÁWRÇè°"´³ðx$6ÜUg†Mvu0¼¦¡B26à+a[› ‡bƒ¾mÕ@mLðF§¡B2¢‰3ÐqE"lkèñP\Ð1a˜PÁ‹„¬Fv6Òö+a[AO Å}c†mÚº Ýè4T(ÄÚ~#q@X‘ÛÚzg¨§(ò—|“¿^ˆïžwŸ¿Õ؃¸ùüs¿’£Ì:|{î·««O9ÌÈêù§êu-ÔÕó¯»n¯»¦Õƒ›âIóp|òøÜÃ#ùî¬8ì½0ÍúÂÇ 'B®–þ£ Ÿ´þg§îáÚàyãÞÁÑ ÜêGÿÊŽ7Œ¿w1It7­†Á˜„áK¼áK@¾à‰ï&|"ÿä¿jâ´!¬Y§ Ï¿C¬×M×wŠO®1¡ƒ11.î4˜lx§ GÆÈI£ûä• jx›ˆs„7ƒ xŒIx?…rñ(\Aᔵ“ra^pm²é2ÒAÝ^ˆV([óqÖ¤ëÀbT}\LÓ¼ý@õ¾‘VHý)°©½Véh5§¥Bìµ2¶ÿôÛGü±o‡QÏÿТiÄü]g^¼Äñ†¾{w uí¾vßù¨³½ÇõƒÍßuö;Rc³—ž¤Æ'F]†„4ðáçl¢"äO<ßhc8± waçóy€bI­!<ðÍ³àÆ£ÎB^Û$¨] $6Ü3ÈDõ‹ÊÁØQ\>]Wµ À¤k»›^Âýà²Ü˜Bâµa¼dU𪉘—T¥ÍÇ«m÷¶«Í‰Ô•­¨i¯­íf»½â—ððE‡Ùé;¢öâ¡ûh¢ªš3/¡Tyè _æÛù.1-ÆJ-çGtœ&!š7=t—Ð<­bQ§N «çÄ/‹™ íýP¢ï êŒ&äÌéñ ¢Êô³¬wr$>(¹p°,(¢YdÐÐ#î8”`É`tÊ6BNÖ[ Cî|Tq7_‘c#œŽ»5zIÎóàÒëߥ^– A…#“bÔ1þâ`¤pÄ¡E&ÃÎÉIl­f·È‘š\Øb4Ç;ÁïÜ B,¿»žÒ(³þæew-8à  Š##;µD¼"ŒYjœ‚³¤6õ Ÿ¬­Ž ¹ù¨TðÆÚžƒ!pÂ…àÝãÜø(êF&5"32"¦z†™£‰ìÄõwN.—ËÚÃýëÁœ°Õƒ"®ç4ÂϬ9Qno"q/âl؃ÙãfL¼mn‰•}kç·ûö[/7…Àæ8h: Ö†ÕsF„çHVRwÓÈÙùªÇ h5:ó´œ2+pŽ3‹>8Îã(v?cv0aÃ1G8™91Í7k¿Øt­BbÓo'%n&Ao®ä\A#q×JèïJ´¾h w*µ?×ËФMH¬=‘!aU°Ä> Q8š†tã%+ó C‡s gç—É]³R;ËoÉ2«‘êæ4ªë&plÅ ÖV4·ÓÜŒj–ϤdSïàU3ðåvä޼Œé ¡Óqh¦nxÕ¢˜này¢Ê%öBL܆nb‚*JÅ“XÜÝ­0Ñí”­âá*Ä®;?UÚ5ú$ÍÆô7.§x ¹é§‹îølßìú¸IüQ@‰#Ým;»…ŹwMÎ=ÕˆÙùz.|È[‰½óóp˜Å€­”p±Í.* /¯•th`”ç­çØh3?+íSºîU·t»=btÏæš&€({ð¬sÑÖ'8áù.ÑL“:b9d‘… ± ¬8âMÅöws]è‚ {'e!ì¡9Â=æÎ€¸œ\„ëVÉh ¦âGnJ˜à5j‡ éÏ7fZEÝaþ€Ç¨Ž<Žƒj‰Q1—Œ¢œ‘Z&|<]à®RR²³í†N7íüÎ\€û.¥Ö­Ä ñ¹ÓË%cv9¶—ªÅЂ–5¶ Œ1l¹™Ê1½FÝçe&(ž×¦Ÿð^·c‚Ø;Ù/³Ò½Á$Ó8éWôq[NSÞÇÃXèüzö LÕ̰ÕÂ6ÁÄ5b!Ø×ù ¸gg´V‹°uË.ü8ʆ‹Cil‚¨êa¼óðÍæÏt­˜áÁh¡õÞ´‚®ãíãÈä0ŸJë ¸è"‘o6Á"e±iÂb ‘™•cîÁ‹Œµ vá,à~ï‘ѥƴNT«GT•ÙG¦À…="ÖHé>•sjOXáÛÂBW;—‘Óã¼—•bѽ_¯Ê§)Þ3SÞÖS®Ǹ·Ø"7 3ö"—|ÆÞ9¼œÛÂÕ„“€ãÀ¡£{O ‰Ú=ò Ý›Í9±Ò\ÀÙÇSÊW@DéeŒ+4‰•MÐ×1iÞÀ ¬0*+¢6'`e`1²hXûÁ+À8ÆÈË‹Üç˜ë$Xž—mîø¼%ÙÊ£LŽ¥÷H2ÈüÜNn¯›´>{*cè¶éUXÚÁ‚á|gA‡á :?t8†B|(˜H0±Ú…yNs,l0gå°;ìꌌWæÙx£+#›vò7C£ ·s ëÚ@XWÖ›¡¯¼Ì¥ŸA‹Á¯ qå´ÛÁª"il#ÒØÖyÎk«öÛ¡·„ÌÅæ'ÜvŒpPBJŠšdÈ‘‰Ï+?-˜ò9E°¦©ýïQƒê ¾‡)=j%¤$…e8…–Ýác4/áôÒòéä”» ÁyZ`$îÕͯp‘j²K5I;G©9‰Nß•©±³9/©P§%‹ y"ª’ëÝ|iÚéq\®Ëý3Æ´¢SÇåœ=ƒƒœ¿½Òzäüþð¸Ø œ©–ïv}èÁá@Úãˆùx’²“6s¶·>üÀ§,¾·XÄuX‡Ã…ˆ¸gjB‹o A³a7¤L&î4ø`ä݇úD uYRç•õ_wPo bÅš‰ƒZVfÉ*Qpš :Âj2ó𪔲ÇSkg·Ô].±½XR˜c¼ js³Œuöf¡ëm‹ ’“¦ɵ D1Uþ4ÝŽN"öˆŒ ¾ªaçewÞAì&,™Ø«Œ}tØ7ƒŸ@‹)­’œîRTbã;½d‹¶×ɉ”Œè4ì'îö¥3ঢYõWÐN9ã;7M;sí´ÐÛBo¯‘Þ^&Žf¥·Í«Ÿ¼Ð[VÑáB‰ %.”¸Pâ`J¬_³q %&æ!ŠdãµEÍ>*4ºÐèË¥Ñ9Kª¶]¾¥tÑähò¢»*—Œ¦?›(7mTgð%c¹i£›©ðáípøÂy ç-œ7?çÕ:¤Xâíd÷rîÙíd7ÆÍ&Ç™ŠÄmâh{˜·qšÉbÀ‘¦FÜX¤ÜSêžJÈÛˆk¸Ó­×ÂÑmP“´Rw‹…c¥îPá[çånþ±‚t!­+sµ%¹Ù{ëmlŒXAËãÚv1ƒOXÍ&£ÚB‰ý`‹#²¯hó$Ý`4Ñàp-¾)Ü cæöÖ˜n`û >mvH†p`Ý`Ižc+k9Ä8Ê©°Ä °œ¼Ä-á´pÇpÞ„6ß<i½7CšëÛ“Îcá;|g ­ÜËžaÉ÷ïÜÁÑòøþ/ð³cšÿ‰~Aէž´1÷ØïñÄ|ö>®íx°îð³Ôâ5pNÃùZ<¯ï©w1D;£$¬§½=©çx á>ðic ÁgJÌ1}ENÜé±÷ª™ñjñšÆR§ð ßû(xfmmö¢¶ýˆp˜¼`„{ßó)&ݯžvÿì\>L endstream endobj 5475 0 obj 3609 endobj 5479 0 obj [354 /XYZ 40.7999999 497.299999 0] endobj 5480 0 obj [354 /XYZ 40.7999999 210.259999 0] endobj 5481 0 obj [354 /XYZ 40.7999999 210.259999 0] endobj 5482 0 obj [354 /XYZ 40.7999999 497.299999 0] endobj 5478 0 obj << /Type /Page /Parent 2 0 R /Contents 5483 0 R /Resources 5485 0 R /Annots 5486 0 R /MediaBox [0 0 595 842] >> endobj 5485 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5486 0 obj [ ] endobj 5483 0 obj << /Length 5484 0 R /Filter /FlateDecode >> stream xœí]K¹¾Ï¯Ð9ÀÊM²Ÿ@À3¶äÀ°‚o6Á"»ˆ³‡üýHê–4Cê+’Å"»[jX{Í!›,Ö»ŠUïþøåï»þ¶{÷òå?»oÓŸ/_žª}ÕVã¯Ýñ÷¯ÿA÷{£Ç¿v}³×Ãñ×îÛ/Oßwߟ>?}>ü÷û“jO§?ƒçOŒ þöí×§wãÇŸÆùòòçÃßþ·Ó»?þïçÝ_ÿvøãÇi½ãüòÔíñ/ÿÿ¢´Òýá^ÿí8ø¯§¿ün÷ëa ýiÝã¨õ`ŒÒIûø~™ªN¿_OE«viÛ¶Þ)¥ûlàøï?ž~:¬vÙÆ~¨•êÚº«‚WíôqYÓö»¡kw}58‹:g [J%.Ô"²ÐiG*íhªª;z).è;34§cšªN…Øy©dзƒÐw¤ÒŽ6žXŠ ú®©NÇ<¬œxÎóJÉëëZf¡ãŽTÒÉ΀‡+qáÞWz8Rë.ñ˜—¥RáÕëF†vN;RiG› ï.õYDé«$úNL|þúôM¼_:ìä$½Ç?¾ŽÛì~8J¤®ß}ýq÷ûªRõv_~öÍ`Hs÷K1 Tàj-œ£áþÎ3üNGàwj¼„>i50ö¿£á®9÷ƒoAõp58¢_àޑă!ºJ|3:bUõ Ž|„«1F Á˜X¿‡«AÜ!èb"žƒoã(±kYÀÛnàÞÈw æäp±7Ì]FXüz ÙåáÐ-Fê²c,C²`¬•9¾à½=—»ûî8º.¦?a^Ž1 sEHÝ„¾9)ÆK,Q!——Õx4Ü[InÕ™f18&;¢1¯±„Ç2 jmâ?GÿÁ4ƒñŸÐp# Wk =¯“jñý܆åBM½¾!Ì…ð=bŒÅv ¾a&q¤ÖÙöºbÜÞ5„5æè¼ûîÌN¶,;(%Á8{ÃV!ÁðmCš#äÇ"¬ñ®3‹‘‡üP"ƒ¾ãÓõJ¥ï4îÜXNˆÒÓü¾‚§`NÈÐr8Zöp|³®¶ ToJ󮪉aÉTŽÜ‚#Äy±Õ 7YjâÄ&JQÖ“ìU¬¡ÍPJ»ÃÖ†1‚©‡á…àÀš-Å–†¶1î`娵ïæ*Á# ¼Æ Žõê½¹2ÒµJëÎØs!jµw/JÏ¥< ãÁâèÆ¬Â7"nƒs6-kñ}[:ƒ°”ÅÆì^£MûÈÂñ›³¿[N“À'ëêôI]žÉMªª}Û©þ º}å€m¼žz_A#xµ‘Hš½Ñ½ÒËê´EðȈK=g'S\ì:Wá­9?jwBÐ[Pkàˆ³jmŸÆÙóH½J훺}{ÕÎŽªà-:§qoÍÞ*qp$à3÷¼s'gtÐí¹øæÝ‹v6’rÞpÜH žëб£‘9·{}â1$ùp>ÛŸ±¿{‘®]Û´oˆß='‡ ù*'Óo‹ëÜŠ‚šÀª$ß™¯Ã 2˜ï€Â9pm¬ˆŽ§L˜ éjoÞaÇ„„Ä$?*ÅJŸ']Fjãcî"pavÈcŒÆ´…—8(\ÞØÊ !4áµ9ÅÁ ZBn-‰Ê1€!ÅÉÑÀ}¸•Q6 Ú¶Hbx7¾ˆ¸Uá¡Ó÷ö"¤—37A×4ŸÐLFü-£â}v½fBKnö\ºãôV§ß÷CõVwœ¼‡ª9/kƒç.=C:¸ëˆ%H<®I‡Œ‘ ŽLŽ}‡\5Üdæ(……ydn &œQ+à^ÝE²Ë£>Aç–¸¥á­áå%Tý‹IR)wt8?Éc ë¨xD‚ #¸¬¨ÃK]‚wÛbŸ€çLŒ‹uÃZT„Á"â°ÂwÁ9(Þ’ˆc$ÅIZÈç=£§¬k”-rH‘….¹rȧŒ“+«òP¸n:&Gûàh¹~Ç6¶ÐÂÝ´1öm¸æÂRÑËhJ˶xësÄxv‘íFΜï†;"’4/MoFÙ£šÁ¾\‡^ú®b"š2ÈñÔCÖ“aØc¢Š6¡Œ8Dã@àƒ÷’£«PÄ[_¢®Ÿx*’Qj–hà‡ëwA¨hÀóཱུ:Äâoízº…f?räóL©Ý›qÊ«“*xÒgxˆ•Xz5"LSU6e³áÆ„;þŽtŽñÈ@:Çs³õ@Z^SB…‹T }õ=XõjâÞKÏ×#Š‘1(6¡Döò”Y¤HðŒÜ¿QÚbÿUñ’¢a[Ÿï57Ï”.‰Ú8„—º÷Þþ!‚ÈÖeO¨‚Q|Õm<[ñÍåô²Ï’Ì*‹Î9¹h_Â9û·µ%‰Jë`¬"Ô’™§ÈÞÉ9€¦y‹Q¡äÅ9ÈY„ê¼ò R)Ö‰dμhÃú¤Œèʼn¼å™°'„óÓ¦é”E›y¬HÙn`K¼* › ¸=&š<†±TµoǸñ£$˜¹a8|W¢»l^gm|ê4Ë9´”·g¢vhŒÇ^’Ûç¡» RÁål¥,{ äÝÔ!û•rv¼4†·9i"ÞŸF<ÄÉÚ.¥+GÄweº@3x]Ìù0ÿ—Ðþb¬è$ô;\Îi@ŽÃ…Óû´X³±¡©½›)¬P³bqÐY”;+›(F}ñ)Œåá\⦑^ïÇ’4ŽùïW+¼FÞ¢ÿÌ¿B*ý)ú-bÄS8ïçèo~‹†#¨ÃßÇ×aÑcÌ@‰ÂßHÙÎ߬[‹ò#ÒÕStóÜ3¿*çëÛûxjG)ïã÷ÎãñÔŸ$±#¾Ìò(8)Îu^Ý&UxZC‚ 'gRôÐY’!&þ‰ï0<¥Ô¯f¶ ·—b«âi…^7$Äæ²[pýÁ:Al&Gu‘E]f’ß*˜¤ÈÿìòJ×EëDÉú£¤¼%ûª½/ÇÅMaö-Qì—=å”4Æ%Yqqx 8MS7¸Q'mð+† nTéqˆo5Ÿ‚ËÈÃ^ùïqÙF¶‘mdYÇÈÃÈ]ÂæÁ¯.¡ÅQ¿0 Šßpâ&O½•DC”Rò¾œ&£Ô¥WófÙ¯¡+µ–ß·Û,­Í²—‡ÛfÙ?še¯?°tÙF¶‘mdIy¹»Yö$tà-˜rmè{Õt ¸ÌjšËhÛK´áÆV-c5ÂÞÅ0Àž lWcûÑ—˜ÃhêMT4Ã7'Ú™Ø5Ä*‚×phó~ï¾Hí@Fǘþøö A{.ÑVW¢ýL’-9ÕßO²Ý©Ã1nV„SíøähgªKQ¸© j»oo§ õ~„ŒCòºÛw·K@t7FƼZcöz¸ù¨iöí˜ltéàwz8g€sFéô^W§Ž¯6RßZmD¶×ÿòþì”¶zㄟМI8ÝQè“"7gº±˜³O{;@Öÿ®›k£µ~¯‹Çƒ‰|oÍñbHã¬61ÜjºŽT6hx|ÛCðߘ>©V7hzêrôe¼[¼§)oùžaxÁ³¾¯Ú½:–„|‹p˜½`„{ôüY’ïï>?ý®vÂb endstream endobj 5484 0 obj 5082 endobj 5488 0 obj [355 /XYZ 40.7999999 520.339999 0] endobj 5489 0 obj [355 /XYZ 40.7999999 520.339999 0] endobj 5487 0 obj << /Type /Page /Parent 2 0 R /Contents 5490 0 R /Resources 5492 0 R /Annots 5493 0 R /MediaBox [0 0 595 842] >> endobj 5492 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5493 0 obj [ ] endobj 5490 0 obj << /Length 5491 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ÐyË|J$°àñŒä`àrXäx³Y,âE&{ÈßÔ’zºE}”X¤ØêÙ€gÜl’Åb½Y,~üó×ÿú£øøùëŠoýÏÏ_¬dëþíßçSJÑýZ] Ûþ)¾}?¼¯‡çÃsóïëWÇŽý¦q˜¢ðo¿>v“ºO¾~þkóÛÿ Qü¥ùßoÅOo~üÜ×~áûÁتýåßÝ/\pašÿœÿÖ6þzøÛÅï æ8nûï%™V*Ž×SW~ü{ÞMÆ - 7 ˆ\4ÿèÿýçá—f´¥Uœ×•ªÙâQkÑË„-l]BÔΠÎÚ– ÅcZ§¨…ˆÇ-3Uû‡"£^²ê¸LÉTìB‡¡¢1V±D{ØBÄã–6 EF½¾D³ÜÈ…CÅbÌ2©Ò ¾…ˆÇ-m@=ŠŠzËLÇÜ¢r¥X(ÆL9a¥f‰ö°ˆÇ-­G½g(2êï™[ÊØ…ž†ŠHkžf "·´õx¨ÒT¢VšY_qÅÄqéu4# #E#±ªëD5ñ¨• ›1é9‰M&Þl²WOLJ—ÃÇ/\IÓš /¿4€íØîÇK³X]|hm3«Š—Ÿ‹ãêOÅËo[j+kݾk´°Ï°OûÔ"óÔ°ÃP[Øò µHØ¢X8v0dÛÓKC•kÓ˜à2‚^äcFH¥fý²><ÓÈ„#0¦¶±†óR«Ê4àŒ·¾.™ÃYêÆU5\ès¢ÐÇUª®ËYK}l1 †ï)KQúŠOp9ãQÅÓhTŽ!ê8´*7“ü±h}•×k$pKHpb°°c©—ËÆ#ï¾Q˪Kbëä ×ðc8E ˆ>ÔS>Y ¥½Ü í#±V€’ë [<ë‰Örƒ!ÀëÁóà•zFø†°yp@°8ÔڜÌH‰ýù‘g´‰± áê<4†í?ŒEHÿ$º„£õ²vçÚPÞ„{Š-wlQ{ À}žˆÇ>Ç4Šå:aO=Pc?òœÄ%£ïÐxÑ«H”-kn˜’p „ÚC/PP|g<Ʋ¯kn¼?jLÿ{€p=ëô´:S<®1ÔXlÃÞP\GHR4bçÍļé±ë ôÏ3É Œ·œÚQÉìÑ[¬Ï°Õ†¹ [üIåi=?Ðco¸Öc;¤ery¯½žÉÃ3:&­åÎä²ÇÏ ´d¦Ë+ÚY Ævï•æ½RèšBñ]éÀsbˆ1ºSHêøÆ&"ª³4¶ŸÌoASf¥ Ë#v8çYºæ‹i1<ÂÆpM&‹CA¤?,™9–¿8þ­.,e±4§èʹIR]Çó¬çýèÔmÄ µŠ9Ÿ|G:•÷Âyp»TݶTõDáv‚æAàhß–#×›ð{tUߊ…{JÐÌ–Z©ÓB‡m¬+}™r'œLLœð†Ó{²Y’£ÙKu.PÆ2õlB¢b@î$sr¬)€'á3 µ6õø«ãU``­×Ê‹`%ä;Ã{¶ÚÉ^>ª‹qL p«=:K@”ô\Ï|Fñe ‰ƒ5˜p"+ úÜAÂu¶Ï¡J,;0F ÆÃåËEE?ßšŠÁŠ‘fB)6ê ±dŒ8vsÎ179K.Rq÷r{e7ˆ«Æ `íEûþÿ5+aEU·?jÎM÷©(ªªzˆ!ÐÀ‚h\î“sú +JnËê±ä~ØÒJÊ=‚‡°àÌ« ‡Œ—ËW¤¥$Ëе $+’Wïx6Npõx’?†¸’Dôw{`ƒT±¦=°"ƒK©G~ÓA’Ÿ€Š^>Ÿ'›%àœoïû½• ØÉÜNtW7éÓ”§+(¬ûóF µ°AˆÕzÔÂ?Á>&ÓhÖ_‡å¬ìÌñ³yxOÅò¸ç-ñ˜Rõþ6Ú#Á>x u%xjž„ƒþ‚‚.ÅØóè%dú\Ž©õ`ìÀõxæëaÉÒÂ![ÈzÄ7€÷õÓÀk3äÈ \yu3Ò3—5´]ý‘FNå£â¦ÌާH._`L¤0¤a3Îñh–÷Š-P¼¯¤)7k‹ˆˆÌŒ7ã ªùTåñ5E·°cÙ¦´gœË +™Â ·äLÎ%½$ F¯[ú~eÅ’m1.úO¹’W˜K‡ó OÉ¿Gbx8m.ŽóUGŸRòfyÊ#å#x9$´AU®’7b¤€Ö98^!åC:,ŽD§<3!Í`óйI±´®•&FWëûƆéy”æ¸å£ùÝëú«<¸Š¥vðêB†3;Zuš®yòuŒ†‰pîOIñVguhˆü]wY9_ç1ÚÎrˆ€ÕK<ÕX(¯yà>„š»i_óÀ’%mÝùœUœ fžÄŸ)õ?q•O¼'„úN˜^¥²¾:šô•%Ê+Û¨¹nlL}×azÁ{‚«~aõb)UÌ(¢H¼‰ßÒÌH–j…Õ~ÚŠexm,êÓÝRˆÜâ¡yJå1J1‚DÐ6,+(ü¸aóhQÊëºXªÝ“Š)Þ6óh FÓV,'̓%$ÞmJEVlϽ—GÚÕ§Ôë¤ÒW»L»$Š¥ðfZ‰)É#“zžJIí¬ÓpzoB-—¤µ=ØÁ²êÝØ+”š°öé[òè+f×-rƒ$£ •©sEov«ÜûþÒ†¡¦D><1\û&±³‰Ï–½] »I)tý÷.v-üžäÓ.k¬ñ'XVŽ¡çR?7Tïí¶+¿äÎdÉxìlÛš^»!º úÝ]O9l"ÉÀrsÌ»eÌ¿$ׯ7Šü ! {ýc2Ï3VX#ÃÑ~ ïáñõÛ¤ª?žk¹®féßd¼É=¸§íIjÙ’Ôk#ØGágæsr`­w\Âw–t—ËæÚr"å½ÙO'ÞÂ=݈`Õì>fKÅÇ‹1“[ï,°ËNÚ³± ކ-+JÒs™&©¥HáF’Cñ ñn¬>üø5%²‹é`’Xp9‘¤‘©Û”ƒií§ÛÄAVº”"‚.)zÆsa‘"/ é î}VÌë! $ã£ÝVÔ 4ÀžÄ±Ÿí%÷ oToüœN; ÏõSñwoÝŸ·¶ »Z²˜Ëð;ýo7µmÁÞ‹!G!5“P'Í)swØ8§r¥h¤çÝÒÕcÓU¨…ˆkREƒYðJBÀcd„“ij&-G—ûФ%Åê¯%y‰h•ÄÖ\E.W®s”â•À4»ÌkŠ}¥Çr?Fæ,Ò=&³úN_v%=»S>9i‰çÄÕŽa%çÄ‘'½ÞÙóˆgo) ¯dDHÙ⸘™U F“P}Àí{g¼úzÍ‚¶VtÓ–ž•_ñàaޱªMòÊrÚ PÐ&rÉ,ófu›¨w…­Mn€G“ânY!^•t%픉Rc<Ԉ´ë<–’óœҧãÕ ‡ókþ¯ C5ÌÒ~¡ÿñí»‡Ã\Ödo¬ùìeNo×Y®6UÁ›eL0µ´¼ê©Kò¨ª²šÎ’²ªtŒnÛD]ÖcÛ±Û‚z¢¥³ò¤,…¼å¥uYuÐØb™šÇÀ>öé6´¥hü qÞçŽÖÛù'ð»}òÚÄ ¿ >½˜jáh}rjXŸ~ÇBÖÞÃvd€ªkšŸ*Dk8_N=ËOõ™¥íŒÖ;òMÖ5½µ°1¸¼Û˜Bðžzæ”.?!žîƒL‹fÆÐb˜z¯rŠÎ0|NBgưªämôà’à°xÁÇÏò¢ŸSÊýâùð®¦Ä¨ endstream endobj 5491 0 obj 3661 endobj 5495 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 72.0199999 543.840000 89.2999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions >> endobj 5494 0 obj << /Type /Page /Parent 2 0 R /Contents 5496 0 R /Resources 5498 0 R /Annots 5499 0 R /MediaBox [0 0 595 842] >> endobj 5498 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5499 0 obj [ 5495 0 R ] endobj 5496 0 obj << /Length 5497 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹Ô¬_r`Ø@A7›`±^ÄÉ!?Ý-©gFìd}*²¥­µ=²(’õúªX¬zóÇÏ?üó¿‡7ï>ÿûðuüýÝç‡âX4Åðßáü뇧?°Ý±´ÃÛ®>Úþüßáë·‡ï‡ïŸ>þÿýÁ4—ÇßN§O þ÷ëoo†? ?ùüîϧ?ýï`:ýí—Ã_ÿvúí§q¼ó?øöÐõÍù¿0ÖØîô—§:?ü×Ã_~wøí4…î2îùÿ?T¥ië¦[4ï×WÍå×ÓWÑÇŠC]öMߌ±§yÖ§íøÏ?~>vƱ¯Œi›ª-¢Gmíyضi§ÿšÊÔY[ÜPfÙ@UQ«1Ð0#³li¦¨ZÿPäÖWEcëË2ûzé†M#-ÞùÖô:gd­lØxÏHô¾wEwYdi˥˜†Zº_Æ”…ÎÆŸgd–-mÚyg¨O*êÐ>ªÃïžß~yxó±?«þ/?Ÿ¦q±Ão_¾=T§¿œ…ÒœþöÓá÷EQ¾ûÃáË/ÆëªéÚúòï.OŠæò¤{üAuùAu¬ÊÓ¿lÓøÄ^ž´Ç¢=>†¯"±íü{ñ£šbþnwùAs´¦{þ®£šŠŸ@Qý3qWÑÅOàÃåI}‚±õÓmü8ÄùŒHn§Éz¶±Dp©å|¦…[7˾OB̸óAìÑâàl^°qDÉùî‡,ÌG OÑCµ1£dãL FçÃxx†-ñ;s±s•Ö0é_NV'‘ éê™)±5űiÍó}q¸jWÀ–„”ªÊùgØl!Š„1«€S+ç|`úhõä™+¦–†¶Å–È£¨ð;¿¤1’˜=â9I€5˜Mrf’˜sÝA`N`“âÿ©y’% òu–¯ðVÌã (мôu73/1 k;g ¡’£,AˆåÊÓrÇ*%DÝLÛÉ;»TÌŒ˜ P,>ÐÂËq(7E€§5Ýi~0UÙ–0M5ã 3lb¬çò-z2.âÖ“èÉ(w·ÞI®Ì¬µsIp Ĩy|‰9§8¨/Bécm‡•)f,›‚¸‡Qš„¥íç$LÃzõ|àq¯¡¾¥@­ bŸãQ«®esíH˜ 2EcÃbLn0Ý…/¨¼4ð…MBú0¸Ñˆ¬ÓQi›ŽG¹”ÞÂt`0¬ª3ÝCÕT¶n J€$LŽõd&>A×À:Àã ;ÃgE`UÌîáÉž¶kf˜—ZML¾pՆתqHq÷Л@F""mùa„¾ïvMézvÆx´§rž¯«–8?yŠ?¾Ž0qS¡mêæ9ØZ€•=ÊR28¦ð±Œ,ˆd2i%øÂýdØD‡„ó*Ñ÷INTÝÏ@¹wÙ½©ñ–A—]î·jì\ÿ vN –t@Ë`m»c×Ï•k1zõ4Êã“á‡ßB%æ 7’ÃÔ4QL|‡Odª-Ÿ¤Qm£©O{ÜÑ92]q…ð|bÜ[Oà9Ȩ·dg'Ä ÉhéEïXøÎ(A²=(éõä¡pyþÀó,üïo…鈹S«“†ÏÚðwF,ã18·àÉŒÇðzþ÷œDU9ƒ’î Óî£7(ÁòŒi ç†uÅœˆßé ™Ã’…Ÿ`Þ{€éã™5þ¦6œ‡¦ª£1¿é½Îc§êÉ ÀH„±ÛÔO÷—™Õd¿Üx2žæäá˶Ùù2bÖ;_æåËÞTip=¦ æXüÛd¨áÍtª¤½'| &¢ÆÈúšcz®&2 (äȬû¥ïÑKÆ‹¢¼BÆóZ1z`Ðæø$~ê꠾ܦ¤3Ñ{&ZñzbçÊÑeÈ;žÓ‡ñPg±©q=Y¤ÖSNÀ.µùVºKº¶¤¯yw²Ê³ÝÏУë.黤o[Ò›)º»ÍxÀëñÆ×̱¹äÙCSÝ+æDž‰‰÷þ<ôa²TO)Nd2h™ûU)luÝ]qÀ«AcL¬nGIœVÅTxi»ãÑÞ/m˜<Ý“åd¶žtg¿ä¤ÐâŒ,34© í½M^Îy~lͺNem¾ƒúâ,<ƒ—ñJU1éŽ$H$‘Q³Ûº Ó„¸³ÀD; cñý›mÞ\u®z¦|}*7ïÖL&C¦è€Gãã¼sÕÊ=žõ™¥Êw>ÎÄÝV|Î=Úê<6§­Ã|‰%îˆgݱPå;oÄÜ,ñD×£òäêBÉ`xÙ§""Xß,€s+1Æaj àÝÁ¨<÷R¹Uº”#¸wÓ§“"îÍêÛ÷Upçí9çÃÒDà }ƹ^ ~bÖC`‡]Gût4ö™s>JãßG·©½ï‹tmŽÇîbÁ{€­|R„mcì”ê¾áÈËÚ-eiÊàºKéá¦J†ªÿ­ËcÙÎßrrE¹¤ŒÇ>oòTJ7rŽåŸóm”—ñîgªYù¿^rßý!WÈ} r­˜J¦„͸?BÞ(ÚÕ½U©šó§|“žð~uý]½¾¬Ù^¿š1¯¢ì¦ìŸ×“W‘«äž¡™/¯{’X/¯™tõ¿Þ}o«Òª¨ªëµ¸%n5ÒtHô†‚ƒ¸ ‰Ž±™:kJøFk/Ï~âff«køçoýÝÛ-è0:êó']4罫á{'YxZ„`û¹Lo:šPù•M;ß)‡‡ˆžÀyš™§4 v¾/N÷?ªg"îŠߘP§*VZÁf¤®Vq^Qé„«ÚR;‰~´Ç=ˆ1=+1‹D‡R ^,é‘î4jžóze ^Ç{W‘·vbÿ¸ªWgýJ¦½¾&‹þP0-¡ÍèjsÛ–&ý¦CkFöhЇÁNÓlw0A{{<ùps÷jm¬ kÇo™nïÌ@xÖ’8™ ¿^5º(ps]z®?f=)üò›=:ø‚ÔÁ„¦£/Ò?šŽ4ô÷0 10÷Äð1Y gÏßí23X²y¯ônîðj£¼>_Õιž©Á·ûªú¾j7¥ zÎ9ܵM„`³ÞÂÏ ìÝ´fFõûgW¤ÇØBpl´Cîrßr«f†2:ƒŠ†“V4²Ýl± ïa ’ðOxyá›íÉMFcç&ÃCä°áDqçQ+IªK}Ì7˨\/„(Æ0Òk“Ó=hPÍK‘„ ™‰Ø˜ÓA<«Ð<áX]ù¼ô.^S¼ŒëCiÊßí!šÉ7+„=²ËžNpßmN€ëÓrUY˜ÙöÀߦ¹ÍUI«äÎ9yKÑFÏE£p²„¹k%pŸîðrgµÞ/lˆ‘9QŽC¼"2/âQöX–,KG–¦ž2׬¤©þÀØÁ'¸ß†gÖLw¸ož¾+ÌÜðl²¿KÐXß¹«RÓ^ÓM!`÷t1Â%Ÿ1¿¥˜ XØ÷v£h¿éˆiOõµaø’èjïéO¬”Ñ\ž•2û†y”é•鉇 ¸Ï'ÓSrÅ6Ç#sxw®zi|MY–uØœÇjS»ÍÙmÎù ÆOªýä<}ÅqG;Ì;Ìwð; YØmΪmŽ'Îè,õp¥•,Âcì¡.Ç3’Uà›™8Ä37¦G-Á]‘1ï`ˆ©ýŽSOŸ>9lÔÞÿS´Š±Íü;†näŸ8 ÖI(Z_Vl¢ÒÇDVIDéHxóS2AseAF­àÔ5"5!^WHÄ.žÙsÔ¬F¸RÚ ÇXèfàÆ&†V¬âäþP5I4èQÏ@3Œ(Iô2’ýåËæ)×*Éœ35ñð*¸· Ø’ÚÊ9û‚jÕò¼û•eÓÁf›M=×þ{Ýi°M^’ÑPm÷k Ð6S¾Å~+ë를ªZU³ý¸‘«<­ÅõÊÉPœ êóëRøI¦\ëô·ÇJGbªCж…*päpUæëκIé=»émŒ¸úæ”-X¯%•”ШGŠ5%r]ÙZa« âpâ‹ú‚æO®Iqµ/eÅ&cg–G§P|]¤4¬VÔÝ(J=%…yFŠá'Q44ñ4ì o÷HÎ#®^©BCÕ¢W’ÊB!|q•©f¤GñHó¶^vÕÏïŸüš}ú“_>'¢èåKÏIº¥ú ó+p‹ç;z^y›i§GÇÀ®%ún}°RRy'dÂD?müeßÍDò²|úƒ3ű1KcÏSxÎ  .a}E!£xFÚ’F *çí%$$ÁÎxp&1£âª­I£$s)Mƒá)¤Î¸… œªTuV.Ð\>­Š¸.(3QŒÎ¹ ? \Ñ_·àx¦S‰€ªØ¬R½éḭ̂%Ý­[÷þ•u$Éñˆ°"wkzâ Ô9†Í©&Ž'­Yc^€M–TMòØíx×'\ÒtÓT\#vè2$ô×ʈ¯µïJ"ãà©bD{C¦B%αFî‡@6x­IÓ º™@-Ϲ…1uË8šy’íxúuø~¢ÀiƒÏÿ`üíë7QàéIHë“—šÞWƒlÐ5sZÆ-¸7Íñ²ÊCYLWvÆâNMslnog_.¤mí|;Îjo<ÌbYm¡Ôõ±7—ß[ßéà;=|gÀH­=Ú¢)æ|`á:0µ1‡`šz¾9½üÉô˜$õe<[<§ZÜâ3,ïTø¬ëŠæhÎ~és†Ãê3œy’QüISï>=ü A£[ endstream endobj 5497 0 obj 5242 endobj 5501 0 obj [357 /XYZ 40.7999999 785.299999 0] endobj 5502 0 obj [357 /XYZ 40.7999999 785.299999 0] endobj 5500 0 obj << /Type /Page /Parent 2 0 R /Contents 5503 0 R /Resources 5505 0 R /Annots 5506 0 R /MediaBox [0 0 595 842] >> endobj 5505 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5506 0 obj [ ] endobj 5503 0 obj << /Length 5504 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`4â[‚ÓÝÓrИrrf³ ™E:{ÈßlÉn›ôG‰Å‡%·vÓ=¦I‹õbYõùßþ^ýó·êóã·ÿTßÇŸßvMÝèfø¯ÚÿùtþokÁ‡_M«jÞíÿ«¾ÿؽUo»—ÝKÿ÷ÛŽéCÇñGßxœbð·ï¿î>“ï†O¾=þ¹ÿí¯þÔÿë—ê¯ëü4Ž·ÿÂ]Ûéý/ÿ~aœñ¶ÿÇùoûÆíþò»êׄö0îþïORðNw: Ž·SWvøsÞMÖTJî¡«ã=œªGÇÿ±û¹íFÝIÆŒ–¦™=ªáûaû=¨:£+.3¨³¶yC±Ø”ÖiÚCÄâ–Æš¾·w(2ê53Ã2]èi¨ØŒnÓ ´‡ˆÅ-íˆzâ–u‡¥—»×~)‰m' ÔCÄ¢VvÜ 8• zÀ‹ìÇŽ\æi¨X|q™h±¸¥˜÷ EF½ì‰-£…ÿi¨hŒu"ð?@Äâ–vD½3ÔKÀ¿ožŽ¯»ÏÏmÕ“äëÏ=KjøñúcÇuõioð¾õ§ê÷MÞþP½þ²ëjõnz -\¢–ÆZdm”Õ¾À>mÊÑ<óth4Á-ÌÔgmßüÞçùÐÒÖrh8kù:ôQu˸º˜çÂöˆFã°Ïõ×מTòl<ë©ürçñÚ‡kk†>M­ôì>ÏpÕ¼Ã>ØØ¡E×blµðq4QkÁÐ<Ø0˜Ž<óà•>AìÀy<‡–þ¦‡¦9}0¤Å8À}(óà=¥Œ6àÀÔ¢k.1êÁÞí)Ise4 Ïydˆ"p Æ–ê”;X"aŠÇtGƒ+e6I 4A·÷ƒ\ѲAjQ¨Ç¥L>°Rû·÷A cQ\;Ò⸠‡äû|$õ¦—_ÒšÁ¯Ž´Ïøƒgƒ4Þ®ÏE’¶>àƒµÂX­¤¾´<æc-jg5¢ÄÕéëàwª|3ðËZ{¼ÎÂ1ðy`Ť††0Žj#$w¡ó9ÏÇ¿Îg?{¾Vð«6ñaÖ%15ž“–x§8„ê¬ÜaY ÷þ1»h¹¥\ðl‚¼Öä"”z®Ä 1ó%fÈ4Û:ÂÀŒ9TF`lÌ,üy¾†w@sd€ƒ´Ó¡C›Ë#·8¨½ùtisà–Aâ‘}˜ælŠ0O¢+*œ´'Ó Õ¡Ïùäá‘OKÛ¾„}ôsÊr„–°Z9Ø$̨›:É,ÝB£Ð^£ØxŽLB›ŽýK±×0«áÑ\`H±‡ìÆÉpHÍ´*™a‡aQˆ1˜Bï²"<‚'‰Apм ëÁÅÚ|b_S±“¢ÜaÔÀJ\RxW+ ®µ<¢–÷8…ÓÒ…ÏÃ$lap4ØÂtxKó›H&âfì£áÓ¸‚- ÜF  Ï=,„ôÂážPÂØ,B3ßC/8ôr8ÄŽçÁn8x,Lë óÈ48¦>‰÷tÁ2ºT€âpÄÅ}Ô*›Å¤7”H¥ÂÁ½ éݦ ¶`‹ÇÞ `Ko$¦s šÅÃM˜^.\ÔPKxBkx4Ÿy,_¼§”ÃrÂF¹¦æ¡DìDnËñ¦iÌ$7-Ú²‚°áÝZºµk¸^÷ž®€z¬C©Òc¹B—=NÑ ²bT.Õº©|;ÓmgºíL·éîðL7f6]w¹U×bª“ï§äð ^QC— æ¤byG7?ùFÀ Ù\”4'8„š2lOI9áÎ×7™ {À’ò v>yxn!PR@¼“ANÏsp'³Íü¾ÓC¸…²î;®.7ñÊE£<dȨ)î<×Sȱîò§D˜î!¶nŠDoi20æIfµå › %ZD"£<œº.ô•9™—8ExÌ©¥¥²Üò˨ÕTÃmµ ý’þàváœ[ixã$ÀàpBÀmp kObOΧþ4) R :þ=Â/BNpŽ›r2 [€&œÊ^&1!±cr'Î ádÆFXÌ(ŸÛNØòyÕâxÌ}È›.ª47…›9 ët¼øÜ…é˼RLŸaïć‘ªE‹È'Æ¢ ØSV·é³bö6¥†P1Î(¨…™ˆ¢ØrE&9“Ç4nÿ\IxÚS•²¤¾6‰¹†¢S“ÖSÈrv ƒš"SîLvyü”¢¼KÚ#»~Œ´EÐÓ®‡ÂñªRžï­îÉ<¸ik¤õ“4…(Q B$˜ä)&øÄ=POI¾"V oŽuSÒZ%Š%èO„‰@ËiG¨g’–^pü W Õ%ÀZâ J[Y{äRˆa’BM’Iý{žX ÅŽÀ´ƒ£8„Ø“'¶N¸u⑪KŽûS4eZ«‘‚·uÊÊJ§0ZFWÛÙ¾RéêsFN,(§gŠƒ"oa|:#í%ÚD8SzÎFØ“D¹å‡û˜‚œ~z<½Ýrõî0…Æ’Ö [ç]VE8™ÜÛ‹›eD ¹Žº#„¥ÁcDòo@¹,q=8¬Q z†™ã8"„©R·ƒ µ(~È’@ÞÆÜá`¾Ø+JÍr½RR¥]‚ Xê¼™–7=Rß}IžMÌÝÏ™™pÁØíe¹Â°Q¨P)tVà3ø$iË:%‚6JÔpÓMÅtÓí¥ xb0…x<„”ˆÁ³ˆ õ\ˆn‹K–\žjÙÛÝåÄw—Iq,!!Ô á ÕFPyÉ›ŠÂ˜Åðc±XVR¨‹ÒU§AWþÔ\ªÓ”G„&-é’Q7 ñvL·2é±<™P0¬8ÕUŠŒKÎb2]|R‹"¸:Í–b2S iI›Â†œ)&;n­íîêšõôe/gèÂi(å/æ×ª/T£îÃ*4Ï&QÒÚ;¸q²rÅÈ¿Å鳨nåO(Å馴ÃÃ')e“ÇðrjpØËÂ"jF‰S'¶ó ñeN”µX¦}YžÌ ±BS”¹'¯›²>3WÕwQŒ÷v!å–)`™Ð6vçŸ3]q™¢X&™,˜åGqq¹Ê /åŽ"å¾ é­\©˜Ó‚oÊ-#Üÿ?+ìÛÄ1©–2«ÓQ·#¶Ì•KxÁ²e®Ü2Wú!XpæÊb™tðJ·|Žyr‚”Ñ`í ̧ÍM·ez\?œ[#Úª‹¹C´ezÜ2=®˜Ï¶L‹¿­YÌM®-ÓãølËô8Iå"æ`ÉûŠZé[ÌÚ \o~ßÔ~ßÛ뺂úݨ7À‘ÞÝþOõÖ/£qÿ…ñÇ÷žu¹iÞòâE‰·ë$.[]±~W/G1]îT¢91æàjкÖ×o’t²0sÖ2037µ±ÃìØ+-¹ Qóîjå[¥j=„¾ì-¸6O ût°Ïàô2¼æØ7½·<ÀÑ%|þÉüîx×áÊ ŸQŸ1,x­…¡uŒqé°>㎅¬}„íÀT·ÿ+vR” ÎgÂé`dùk}&)D9£‹¾O34Ù‚ó¼Ê,\ÞmL!xO=ó@JÝüWxšK{xf -†i €_£3ÌIè¬m]3³O!}ApX¼`‚c_ÎeB¹_½ìþËæÍ endstream endobj 5504 0 obj 3746 endobj 5508 0 obj [358 /XYZ 40.7999999 659.539999 0] endobj 5509 0 obj [358 /XYZ 40.7999999 659.539999 0] endobj 5507 0 obj << /Type /Page /Parent 2 0 R /Contents 5510 0 R /Resources 5512 0 R /Annots 5513 0 R /MediaBox [0 0 595 842] >> endobj 5512 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5513 0 obj [ ] endobj 5510 0 obj << /Length 5511 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhćD x8~ëOC þöý×ÃçaðÃð—o÷îú_!‹?õ¿ýRüõoý·ŸÆþŽøqh»æøÃ¿‡„²íyûÓ±ñ_‡¿ü®øµ'¡}í÷øÿ'­´h¥Ž¢ãezT¼~½} Vµ–¦'NÙÓY÷ìøï??÷½Md”Â4ÚTÞ½yìVwUÑ™¦ÐÚ8:sóëJÄvÔ©&MGGŠDÜÔDÕ?MvÅe½ÕÀ/Íú©«XŽ)¥Ó°þ•"7µ‘õDWlÖ«Î Ó:šc§®b;ªEª5ì)qS;±wÅf}݈×ivu4ÃÆž¢ÖÔu¢%l޼ˆ™Ù‰ñ°'6ßMÿËë$k;Í©«ØŽZ“ˆñGŠDÜÔNœÇ]±YßéašýªÆNôÔU,Ç´Jå1މ¸©Xïtõ”É3þz!üò|øü(z¡<ÂÍçŸ{J^1ëðí¹Ÿn]|:â0-‹çŸŠßW•Ð(ž9teÝ)S w®¥R¨E~A-ª½=–Ž[ˆù8ljÜ‚çCpôŽ1Ž\ïL”Å75HÕÃs¯K‹kFï³øšÁÒ&,ÿP›DË$HÖ&]…K_uÏ Ë2æ(”K‰yý[¾†[;BÓ!m5Ô@ y-0¯ |¦·ª S€­\íÛ±iÖF<\Ì7[Òê©‚ZBX1<^9ÌÈQì?T—ÑK´Ëø‚¢lñ9šžÖK@IÂX•ðÈØ:䔾®ËQ0ÞÆk*Þ?\‰Ô˜6ŽÄn·¢Ímá8r¹IËCІ-öŠ=Ãõõ™ƒX°å"v Ø30V{X¦Uf5úœKÓñ¾ ¯½À{-Ü‚{È=*ž)ƒ;2ÂÞË2ÞÝÔΠ­›Ìš¡¾fœ]ÿ}ËzO`~<¶ì™¨Î*¿Þˆ,vB%µCêj²9¹J5,°e­›^+מÿ0pK—z`–³â¦¬€ühN¤±Ç›ëuÙÕé÷¦ïYµ{Tº ìJ¡íq¤K!‘P˜Æ%º ‘DK² l/}ÝÅÉ6ǹªà†œÎõ«áßyM4j©N0µÕ"îà3mÊÞ0Õ#2ºÐ›–J˜²“â½Iv-m©‡튺l…|/ÿ_ m÷¨7 ŸÁTc Îo= †½£¨Êºñ~æÒÆá|† m@»M©†Îî,©­°õÂ@j+O¬/î­FœÒ ¤ ¯¤ ó]t£qS]õJ‚Ç|Æ“ 0Ùƒã` {@`ª Ùcè,îM H^9<Î`S…*miÌi[3q 1Î ou)›ÚZ¸¦„­Ã+— Ñ8UUZ[J¦K‡ mDI€mƒÏ‚]§WçY–Œr&ä©·óG1Eø˜?ŒË®ä +çÅ}œ#ƒ˜8½Ê‡P,ï³CÀó$V ÎO~µhœg–¼C›¥ÍË,÷F×ûæíh§FÙ÷šx¸˜Ž¡#½ÉiÌ{à¥NF¢×Ã÷†·¸Ó PTGÄíÎÔ#b ¡ä­·=p‰ï¼•ÎÑOes>J-ñ¦ÏËnaô6n‹´=¯Å1ýæ½§˜4íÃOxëï/€„úÚBbi‚9¢IhtHo°Œ†ø8?wmfaCÂ5ÇEÈ¡4ÎÂb—5ë:Xîœc5î!‡„Xƒ>¸~8 vôÃÆ>Ì"V#·Åý@×ÔöŽáÊ ;Ãó²·ÌîˆÃÁD<'Ho yƒ–!`ÅBd|…Hm«äB†1–Ý]®˜EYx'ÃòŸæ`¿YÞ„ìL9{åyààB(™)")Àï¯ëe$4÷FZöÞuèö‹– ˆÁávJ gí©8®ÏÿÔÄ¥1æY,š˜õŽ1PJøQÎkW›R}`»Ýr†á¨ÿFÞãôÔ™…;†rá »lÄÝû¯£ãèЉ’«÷à<ã\ÕõÅkÓ‚%wYRYž(s-BNv’…ãõÀÌû7>,Ͱ›œRÁV°¥aô¦R1j6dO ¥ÞÓ“(ü‡uâÀ+NˆÀ½1RqÊ1'ÄŒ3ŸŒ EêXŒd–¿œ´´Á½1’B°\ôù‚}•0QÅ6© D¢Â&eŒ“HXqB»¯¯8™òêU¸ðM¾x%:kÔ+ÛY• ?ŒSêðÚáõf$kಠ¬,¿àù0,+t}H@ʨÔâMz‰nÖ<Ó¬öEO) +.I6zÛ<ibÒoǦ-PÆÁSÕn¬gK”º¸2ž’mLº+Jq*–†á% v4›ô¼Xb·9Ÿ´H"­n~4k—«`¡b”3ÍiU“~;z–¸äá&ù¶Hé×°UØdɈmZÈÕ[.i‰XtÇ:óªP™)û6eØw@ŠC’XÕ`Rÿl"8p]ïƒç…N«iÔ›ÙPsªK4ä<úÒzªºI˜ðá!†=Z0 RVkÚ›Óa¢2à~˜BHyÍÙú¬y¦ëÐÀÖDh ±uá„-`¿Ç@úƒÉ ¶×œà¼ž Ö'“„ì>§Ú”hd…e‡ŠÂš³××Ó\šÅYüú)Ç3+µžâ“¬¤Hk)v“zËÉO‘5‹»ß‘Pµ8pºˆÍÖÌ#R§oî¸-eÍ ,¨¹žjïço·„£¶yÇíÈ(ÉåÜm7SEñÛÑ™ý¼‹¢šÊu»Ïã[âÓðuØ 5¥¶Á[$¶òœ·'Œ&4=é "1N½Âö)iR¡3ø^HõG;Ã\sòW®3Ìš1ÎŽªý¤’‰o³qû…ë§o^Õ¿Ïœ-6í)£f™ ¹ ×\ ©P¢Å¿qÆÇ)lâ_š w‚‰% =9µ§# ²*²GYzTE8ÿ¼·žUö9¯Vöø³…îcZ¦V’hwZË”ÎN"51õ)“ £4* ¿¤h[ËA¸ÌvP¡u‘» *SÜoíÍ}ÏÁͽ[WxÔ­»ƒFp^Ôü߯æ.WçQÆw¶cš±Ö㢆)_º”äuŒ>‹–ö¶ð׌WV ¹ãÅ¿Ø?QýÝA„ÁïÎ—ß š)2Äüq¶9i‹ §¬²ê>‚)ÂÊ FÔ§tÜ úC–צžn¾™W¾û¡é–°öõY{X‚1ÍÍéÌ–@Q½‡%ìa v£;U/1Ô%^Ábía¶x…‰NeHFÈQIŽÃ©BP}ÖÜãÅaZœF¬Ã:pjx’8ç)³èf+ô¬6­:dÒ†Wkí8«ªÓotMõñ‰°'ì38!YŒ ¢Ö&îá"lÅ¥¼Þƒ½ÆÙƒWå÷`Å=XqF÷`Å=X‘©Á V쪅ƒ9ÑCþ|‡¼ ç¼cAB>aœwu¹/u&ÞÄqnÅ4.Cƺ¢. x(Y(±¥i,=Üd™Nˆ »¤™£=Îëe¿'B€ú,9צ¶e9 hA@¸çJÂGân­_cØÇ"Æ8ÓÅèºÁ |a]Íá4NB˜#øŠ·Ý ß©C®Ö6Zt¿» áo pr‹Žé8›€hlFð‘Jà¸޽‘÷×CWÛ¼ŽcóS^ü.êÐ>ì`¼6ÁÓ˰=—Ó}Bó[ßesz°ÎÌgo¥qŒ-©£šN4wUÒëÔ“¦Uù«™ÇAIŒáYÜ›LÛðIßXIóÉ UÕ®ž_"Fe$Åðòdšá*ÇY9¶h5û½ëKcÄÂÎg$Ïç•É­—Nc„+N€ 0úI3=’¤†§¼-茰ýB€-ò0N«Kƒ%¦gÛ¢ ä°&ÈJ{ðâ2˜ƒ7± JŠk]ñÀæw²çk(¶¶5B°®”´Î´ï%.èõy® ´YÁ,œàq|ìǸÐïv¨f¯oÌ!˺1WŸ¡-s-yfWÇ\Áš8„æ[Xlr’9°Á;!X‰&I)àÌTà7äŒ CâæNh$¶<°¥Æ0Va› -¬$%¬s9Ød„ Á·´‰¤˜o ûFH"æfØ·Ù ê<^ϨyþfòzÜx}_ÀIýÁŸ†s1Bæ ÎeðZŸ8èþêûNJaŸ8—¯s¨æ¤æâ™r |Ë•š‹÷ùwíz'ggG¬cÒÔ,VºPÒ4ó†¬6šP†- ‡³âìj1’Çž'·äK7ÕBˆyy¹Mçx†´ˆ'm¢ÆO Á¨®©Æ:Ã@±Doùâ–Û±¸ìÐîÁV0œ€¸Žz¡<8Ÿ¶e“ëx;%qiÄM®vV4¦»ÌÈ:À¹œsÆéÂ6ýY®ôü\¨ÀÛÔô5Ò¢içåSú5¥ÒÎ> endobj 5514 0 obj << /Type /Page /Parent 2 0 R /Contents 5518 0 R /Resources 5520 0 R /Annots 5521 0 R /MediaBox [0 0 595 842] >> endobj 5520 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5521 0 obj [ 5517 0 R ] endobj 5518 0 obj << /Length 5519 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ¥°g<r0°9Þl‚Åî"“=äïGÝR?†ì‹¦ºežq³E‹õ"Yõñ㟿þ£ú×ïÕǧ¯ÿ©¾Ï?Ÿ¾îšºi›éOµÿûáòÞׂO¿v½ªù°ÿS}ÿu÷V½í^w¯ã¿o;ÖœŒÇWLþþý·ÝÇéå»é“¯Oû_Å«¿Œÿû¹úáïãçþö_øu×íþ—_¦_g¼ÿsùÛ¾ñß»¿ý¡úm$¡?ô»ÿ÷ƒJ ŠÑñvz”þ^>Š^ÖTJJ.eÅéT#;þûÏÝOco'2êA2Öµ²k÷Úñ±[1HU ][ evjŒmYW,°#)F™ˆÑÑ"64ÖÈÎÞ•õRtÓ0ùø†PŽuq8&ÛQ¶âÌáAC›YoéŠÌúNöëÛP©?uÊ1Õ0‡õ{ŠXØÐެÇ]QY¯Ø¬Üá¬?uÌzÑÆ±\Šâ°ÞÒ™õ’u‡avÁœ?öÌ09ðH± ‘{"ó]µó ‡&t˜§®B;ê‹ÓÑž"6´#ç®^£Ä_ü½Yüüm÷ñ…IÑïÃÍo?”bÖéÇ·q¸ªú°ÃT_}û±úcÓ0ù§êÛÏ»¡VƒèÔäºZÄó¡åË·qlÉ)íºèoÀ+esx¥ìøÊvfA׎Ӫ.XÀ»CKú á‡ººÑ¹Õ<ZäùÙ©W5.zö®×¦ÕzeÓkd-§N›-F'üÓáÆj%Û~üöù« v¢o–†«‘¨3þ¢w6,æcñüØí¹?ctß>hkÎz×ä˜Eš%ýÅ&ƒ±Dyß$k˜}x"=„Ü" ªÃtÙ¶<‹çK=ä–E@ ’ VH£¡ïËÇÇ>ë¯Ñß›ÆzÉ©W^O\½øªäP ð(z˜’åÆ Ó8'¥Ö{/R²a4ŒÐ«Å^@É÷‘ÀåÆ;Ñññ’:ƒY£¿3˘ £³¨fOµ…7×€jž"$‹C¼·ð%­‡^7Q=\´¨eĵgøÌ á=ÏþÏ08ž™ê„ ¤ÎÝäN§7f4®v›ìŒ\/>IæÍÃɰêUi­pšx…å[(1<.\¿¬0Ý÷ò%ƒ)1Ïòè$W¼‰÷qÚX›à€-~3©¸…]Ð ãø Œ&¡aR-·,ò&^ ¼E±ëθÜ$ê\ú.ÛŽ`)³ì;QVSXm?çJ'a‘x?­^‘ç¼{wí3òœgÜë=·0ÿ÷ábÚ`\ŽãeA8XAüï5žÙ8ùQ{“XFa e&`o²ñïm6K×zƒ-x䨥7< ¸ê‚eæ>fSMQŽõö†­ ‡:W²ÝÁv”Ãù±è‚Kóø6y:XÜ|[dÃ:Ó`}&ØuŠ?Ä–ØBÁƒÅÕ@’µÃ<ÀV(gtÙ.ˆ^`˼ój¡DI–¹Ç>[EŠoÂ<ÀÒGÐtJ4F¡€2R†mŽÓpoÐÖXlÖ@¬µ°Ea (11ÁÞâ蟲.°P@‘*)b£ÈžÓU®"Ÿa¾ì›E1ß *E$“ÇëuC1^Ïâ °$ÝÜ`ïJYãR"+l,ëJ„A°iØ*¬MI´X|ìYòF’DJ¼5f#Q½e¤”XøFÑmJ$ƒw'rî' !YÜx +yEÚÂq%^¿³]ç•Fгã:äÓtÅ:·¼<Œ¦Sjo-lPo³Ù`¢î¦ÌÚó{8êm®QhkqH(6U³¯%×z³P0…BLÕS~ò" žÐ{f³ÞÕbhÞ×íÌÉ>¬©§‚žEï9&ís½ ÈÒ"`K)x!ÌÜ3ì ò mXBð,8e'¡¼Ñ,À\ÚteXZÄåKaF(|?‡U†Eã„!è¬å=x<˜oX^¿D}Ö%ØÒ@^7Øna9ˆj‡#sR`i¡ð@Aª±¤p'š¥q4¶ý1ë!f¡éîK˜ÜÄ–ˆ-Q;è#šˆ¹‚Rƒ+ð3fEU‡fÔ/Yjà<Ê:qÙ®}3 ÚÜ厘7ú°(° Õ£zú$2ÌÄZg~?ñC³7 ÕFqôÅ¿ì¾&CCÂÈ¡üIÓ—r¡ë´E0–×ÎzýÝ¬ÐØ§P´4ù^D´W†«xóÔ/Ëçyª•Ð"¯‚Ž «ÂeóPHjÇ]žÙ‰ýÍrã&| „]ÀÃj×ð@q &WÞÑgÇ÷Èâ,¡£i• cø¤UqÜ: LãŽè0 âÑcÒ‰¦cA¡ ‰aN ¹vÚ‰<‹Öq9=.µ€¶¸… 5Ääͤ¸n a¡@J$DÚÓ6òS7}ø„ Ÿ ÒsÀšuÖ(¦ nž»ôû]Ó»Öë5½l5º ïîãbĉ>q©;,t»oÛA*á÷…ÄÒ$¤I'o²õl)‹ëØ_(óÞbdC–€¹”œólÉ8Æ­„¬kKvC€’ÝM©ƒµàê~(Ù"–êjLAzGÊ”Kݵ.À4–Ö¤ó¨øþIà:cwÒ<!ãìø,Ý'K(÷Ý0hrïÁJS±Wulj7¢Âao{t^;[ÛN?Á0Ë\×Þt¼s3ûÖ'·B•¶òyl}FÁ|MrÉ<­ŸóA“ù-Z·õöѺ¸n“h¥Oü°Í…|”‘r!’îS_ bÖÓžˆÌÙª×æ`r†}Ý™Ÿó$Š$ÅL—Ik´[Ñi z?m¯\ÆÇúœ|˜úPîü°,n¢ˆ ˆ\xÒ-'™LKžË|ÎfbîYN¨)wQ¥=ñIœ+èqò¿üæ©ÔWâ3„ŒÈt]DD.Û+³›ñ£-#ò@ßhÆÍëÜEàÕža(y‘9ÂBo/W¸6˜„HÁ‘¥ÔT»V‰×FJAºËÄ {\|px*[2w(»XªÊ¨ïEr_.¹ŒŠw )˜MǸÝe̽ Âr[åÜ ¬Ã¹,\éRÑ… :­S*(QŽÅ²—>ÃCj•ÆÕ’et;â¡Íääö ލ'$dfè]ðú&î}]‘òË Ù¼ˆÕèp†’¡èSÜûuœ· ½ÝÜΓn+Á¨U”{þÄ‚? ßr×ZT=£ÈhÉ» –»5p\A9+¦Ð†ŸÁ'é„Uó6 VÚð-QoýˉtÌÉùuÆ›¼? ÜlÚfÓØ´áôÖ «={âªjäié‰!ŽŒCâ(_Y,S×ý ‹Å„\) ‚[¦:Q îò,8hiU¢dÊr =ò&(Ý›¥ä=&­IÆI *ÆŠ¨²ý­lÝ9§tl­Êb| œ˜%Æ7æÐàšÝÚ*šÙVËk¡Ì\5:ªLà\Ѷa]¡×éfQ9ÏÓ•„f,©ØÊFq}d£Äé°ËS÷Ì\¾ç;›"žìÙ°Ù+ž¢Xa#ÙÖ †ÔcA% ¡Æ}¹ àÐÐyäX/±Ap߬§ôÊ<èU& ‘ ·’2Æt@—QŸÏ-ç·GŒÉß«c<ÛÝ´XË„6¶U— z‰d r«¤({ˆxŠ#£ ¯g¬ïP윅SpÅÀ:oœ/ùd°ˆ !ÅÂ2„ÊθS,è\yú¸emmY[¾Qòƒ >¿.æ0îrVpèà•Pˆp~»-×BÇ#År‰k qÍ'¡BKAëÍ¡gÁ¶GVEG»X6¼Rü@·@—a`Fˆ=Š©k¶À®o‹ã|¨CRâò€r8‡S¡©%ùR-ñ‘<”¼±ÂGÿ˜JL|†Cª-%Q`ÙÁ×4ܾp–@5%^F ŠØ´VÃÅxl›Ub)¥ ›MÛlÚ=Ú´Ç9¶¸½T‘Jªé”€x¾Í±U¬Nûèå`faÀ?¥¯è$G‹±8{R·G‰ZŽžG¹’Û‚­˜•¯³)QË!JIó•dŸ+ÌQ&Äè[CBÝ^ÿœp¼‘`¦]åH©4op?0qrÚØÒBµ佈Â5¨¸r–‚£ˆ™ 8Š–‘âÚ|\‹iÃ3G¨¶TõRBm< ðàÆrT¹Î‘Õ,Üqåeg±B- ªæŒ[9ŽóÑ7 ¹YÈÕÚ KZN“‡ëÊ¿…„ ³éÜÝI"ÙØ’Ž…¥ ÎŒŠãnÑ…¨(IX‹î­ˆêÔötûÎfQ6/¾^Ûù@뜨•ý+ mű٪ÍVÅ]q”œn k`‡[,…rkEÔêtJ"u.Ïbi¡Ü¡‡¹CÁ°Åó7’¿7_uO’d×)%X”rŠþ4,Bˆ (7ÒX¤ ûjŽ)EFH³RDÁy¼ë鮳¸Þ•‚ÉkéÉV –h[Š6Ý~ÍBY¤œáhÇE”&Q iS¸à”pŽ–$ÎËbkºÓ]M%£;[Ö¸ÛÝx¤»ñîÎÛ§¸-íøv‡÷Ót§ûiJ¶i”¥dªKÞ .Y6½Ùèòlôø·zñhh÷_˜|ÿÕbM³ÞœÍú«Õ°[uz„¾­Ø8ŒkÈ“k§RÎê|íÁ|µmÝê©Õ3Ód=qæ¢eRRÞÕž)>±³»Ò2-Ñ…¨ùpMP©ºR˜Ï-|OŸà3S`Øñš7bߤªk½MbxùÉ3üî$Ìý•¾ gæàûZ C㘠‡ß3óŒùŒ}¦í R·ÿ+Ö{Uð}¿ÌfïÚ3N QFo³óŸi¦¦sK£Ë‡ãÀ³%Ï©å=PÒç…þž/ˆZôfL-¦iNTº&gXž¢ÈYß7mÍ:ÖwEä¢xò5¦Ý¯^wÿdÅŒ endstream endobj 5519 0 obj 4292 endobj 5523 0 obj << /Type /Annot /Subtype /Link /Rect [296.159999 76.8199999 452.639999 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp >> endobj 5522 0 obj << /Type /Page /Parent 2 0 R /Contents 5524 0 R /Resources 5526 0 R /Annots 5527 0 R /MediaBox [0 0 595 842] >> endobj 5526 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5527 0 obj [ 5523 0 R ] endobj 5524 0 obj << /Length 5525 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès€i‹‹$xyCÃrr<™ ãAœ9äïGj©ûµH}”H‘»»lÀïY”¸kgUñÍŸ?ÿóøïßoÞþÏñëøóýçCuªšjøsìÿþpû€«“àï­ªO\÷Ž_¿¾¿>>uÿ~?°æüáø£k¼ 1tøû×ßo†ÁÓÏïÿÚýö¿#?þ¥ûß/Ç¿ÿ£ûñãØ_ÿ·ƒÒMÿ˯Ã/Œ3®ºÿÜþÖ7þ|øÛŽ¿uSPç~û¢i*µm߯Ÿ²óßÛOÑ`Õ±–uÛO–ñÇÿuø©ëí:“–Œµl«Õ½¶¼ïV1yÔms\XZk[×ÛØQÃD¥£óŒØ¶¥±J¶î®BAß0¥ÎËìwv+ÄÆ®6ƒ^w«³‡ÝŒØ¶¥ wtuRÍøþ¾f ÕÒŠJwôUÉŽdÇa>E¡~þJýß¾ûrxóQ÷œîËOÝjÏìrøñåÛAvÿéY@+_~<þ±ªDó§ã—_úÔ6uÃë3Zª¡E½>x~ ¯??hO•m]Ý~+P oÍ^ë¡×“Þ¼évϔ٠ž‰9éJ¢ñ|¦6L 9q¦Æcìü€ñK/+ÀÇ´1ëcjæ*˜4Ha‚Äœ3;Ì™:¢éh œø[ ‰E$Äû¹Y {Åãáõ½œ[êNOQlJd[Ðsý^Ø`„ßòÍÕ­ÊĹðY €LÄÚYõü|é¸r"ËZƒÉZ$蘞Ç.C¬r0f ~ÌQ,àZs´¶òGfÀ Xà³I. Ç?†¯b™µxÐqÐnyÈbŠKÂ|ÄGˆ ë%¼c}(à–ãNld »eÁº¸Šl‰I¡gj;ÍÔàLbTÿj0¡™ÖÀoÞ–wþãT¶¼À¹)Ô"ðÜ`oÕGàŒxé7ƒäÒJuVÖ'rŒÙ˜cÆPµ=[Kö0)°6 ®Ðp×ëúi”á,¼Ikeš¦b%æ&˜’ø-'ÄwVIáÙ»%Y-s$ŒSê´£ß@‹E¡.†…Ìo×›AQp>Du†æº cU6`JËŠênçÃÏ ÉeT‡×Ê;$Q€UµaÕkvÇÆWå}´pËeµžJÓxTR"‡éQ±—ævÖñcBÖ–ŒzBj‹­W~C¤ƒƒ×a×N•f^Ýš˜ä r“Nl¾‡õ†G>öQë€Îz¶hw>Ë3±—cn¨C1[ôæò—õ(u—õ3Ib_X}¦q%Û©EãÅù9v*AÇšÃ}ö!@*Áqna°7è¼Ê!á7°…cG!”óØM<·Ì:ÈLK g€g-á7ܳ¢x¥ÐYÊ1Ü t®dLõpä4wî\)NsŒ×y$KÓdIÅ –;pã¿Ìˆª^ä¾Ö‚1)„_rH3XjåZéþÒÞ± ½9øÜS¹]ÉÜÁ±ž}á«|ãŽxç0dìÅ’…°ªrh¤X‡t`§ù^°öÿh:1^©Ä³†•X¢c ÁiIgÛYÇו\œµ„µ`mŽdÉ’yeÀÞ0¸^AÚ†T_ÃoâJ â!ÄCˆ‡dÖ'!¬±Öˆ9ÖAœ·`Ÿ…áQÔ\LG-R›ËæQÄZ#¦ZÜöµ‡p!èM‹ëí$O_>êàt’Í·]ç´ù%/†’-a¼  ¦\² ›¾Ž)ZgmêvØ. –O‚a9•Õ“ª®ó¡h‰;ÃÛ_C X7G!ïDfž¦5ñ´‚äfþš¦›`1z}þŠ£°"¸E€•€½æÔíèÄŽtâè:1E€mÐæD»8jy<¯3É’Ï% (Œxñâ!›ôIŠK¡ƒÖÍtÔ"µ¹lELÏ!§jûCZHê9¥^ˆŸ-@ê‘'¶ˆÝŽªã8|%¸·éêÐ¥¢êÇ„£‡£Ø† Š/Åë;— {³úÛç«é± Å¿?ç 9Ä4¹¸Çã”ÜÛ#ÚÈúù2õ)KФDR"n–ÔþQ*Ed"5Œ=_ægÉg”‰[ë£L¤g’92‘Ü5¬¹–xW4ÁïW߸åÞÕí{HÇÞtºá.6ûú¼¡fg„͊HS^vÛVÊûoÒjM‚™4Ž¢<$(`ɹš±‰F«.ðê˜ —2W­|ѵM[!wuyÜÀá"_òYœ³ R]`më¾`0ùÕÎÈ¥}cý¥Fãgg织¥ár‹Uè°G–Zò¬®Ö[Vw—ôm⥉<ë+($£+ä$Û¼ØÚ ±îÎuƒàr>Cñ¢tÿŒ{ç ŽŒ âq=×ø›Âóæyû|yóÔB-ñ[H†’dI YpXÔ³€BìU;ï·äSï\§d%kITñ# ÖØÖ+y·)s’¤x|)~ו8²È]Áž/בZ¨%k É]’»$w‡•ÞsÕ“<YPöµP Id’È$‘ÓKä;¨!”GîÖ¹3÷÷>‘:êi ù¦Ãv¡ßtT< YM²:«¬&¯õ «ÛçËÔ¥j)¤…d5Éj’ÕK+%O÷’×Ïwó/µPK!-$ÅIŠ“_X)yÇY-Ù%›= ©;„+T:¼¢£Ü¥(ˆÿcȇd=âŠÿY!QáŽj†x¥U¼u8\ ¥ ¶𩲃•\1ãeu‡euï~ÒCíœë)ù¤4$£9ÜÓ@ ƒ[}En©³B-ÔB-Ô²Â#}…ô•Péš)Ož4™Œ°ÎéÙjr×ÁØÚĽaø†Ø”^ZÜR¼×MÝÅòwIÃÏs÷ãÃíÝÖH’»p¬zžû ßJÀ7º/coEhÿu•»þɨýçYß’Kžu¦Í–ˆþ;­PwÏ (Æ(nÎ ¶C¤u€Ué8ûÅÒŸecÎPãÙ±ÒìÅçùp!'ý%Ç PŒžkTÕܹsG#îï#*ãô¹V”@-ÔB-Qì.Ò HRÆ·†žªJ{SåÎØ?2ä‰|¶Ø‹GUmŠ®jCYq$]ãKWªC³(y9ú-µPKñ-$I> <¤Z/‹’RP&µP IJ’”Ï,)©žÊ(ëìY'»ûɞȓJÕÆ À·ýý²÷M²šdõ™NÉË;Èêö.ò©…Z±…d5Éj’ÕK+%ô’×tÓ5µP Iq’â$ÅË”âäduËrßýˆÕÆ[‘ûFÓ ÈSµñ‡«6ùŒó¾ûÌNÞýd„ª]ÞëÉ"UrB§OC[Óí¤ÔB-¥µÜ%¹:7ª2ý€°ÎéÑhs×2¡*Ó™½-:wn<ùá+ª2]úþP•i’Ü…cU™&|ËÊŨÊô“U™V,·ž—³v³â[r{³Î´ÙÉùæ6ólE­2}§gd÷B|Ý;Wp„Ïþöwˆ%š#L,]G/½B¦R¹£ÌãÞCýiXV—¬a8¤+ÝAwE.‘GÇõY…àuPdUFO®îåÆ&ÍeôQ5RVíšn c§^æv@0‘B¾â°ãõIpÅxmcV{ª,üy»ºûjØ y’C7 Ä«^_­Ñ«•ùê¸Å7ßœ­9q¦f©`ÍŒFÁ¦ßZs¶>Á½CpÊ—WÁðŠ:lDêu}¬eÛÍïÔïà·ëÿÕI©êØ´ý–1u~ʺ'Íé<»îåñÉ×CSŸÓ\)v}KNz‘·ctïÿoúÏŽÆ×ctOºo¦3éßÒ“^ôtŒŸïþˆhÔ™hºu^"®¾¨¶©› %ب ÷ÒBùaÄÌZœÉëfÛ9B»%¸Zñªƒò>šèÕëÃËñ!ý `ƒÖÎø¥Û5P³º·¸ Åa0\=X€Ôc¼e懾ÌÑ<øóz¤·îXÞ ’?Žý„8à˜ccÆsË„ì„WZeG6Ìä¢ä%#Ï´{çJñ&ÔÈ[nj6)[»ÄmÛ-’H™|-‚k&|½=çЩĶCqH'$! šÖ”9 ‡ žI]³À‚M8WÔ+Sjá¦FËC[2û„޼ p0Pkƒp}µÉÆ€bæä¡„´4Ö¶lÞ8D·¹?ÂD7Û>¸9Ûæ’õÔ$›9wT¦«¦{b¹ƒú·ä¤y;ÆÕ$åœ;H k a»ƒú·ô¤=#ƒ;¨¾nTwv X˜âÁ•7ÉÞ<2F«á§AÀ;½3˜š°_ voSoÆ-x²pø‹¹Õ¦„ òV¬_¨íŸñpÀ…¸KÖûÌ,Ø„è">¶U çËÂlÄðêÜ1ËÛõ#d8ô€ú™Cs³>GIY3ƒmSMšŠjÒô-KQ UȦáVÚTÿvÒÒMÓJ“nˆ:\•çJÁZ/Zs¸Žð88î r8—: ÿ'$.Ïö65µëÚ¤vY#ñ϶käÔ¶ë ®Û®iM»«{bÙvý[rÒ‹¼ãjÛ5bζë˜9·m»þ-=éEOÇÈ`Û5—D²ív³í¬…¸~ÉØ{cwï°ív;È'#/žøR|*¾”˜_ÊŠ"Sµ-¾ú·ä¤y;ÆU|)6'¾” §*[|õoéI/z:Fñ¥.Ù™á!¼ÌòHÛtûnéOœ©GÜgTl^^§Í»±ÿÃl8øëâ˜Æ ñ`®y°u³98 ƒÏƒ»“dØâþ+OKÉ Só_®ì~/.䓺H­ÛOk·‘LÆÔ°¬Ñ¤q"„€3²I䛎†d¥0øÐ†Ð)Gº…e‡„£% ªU†`ð™ø–ä*Áà!tCR<–EEˆzºÅòHÈ p9$l0ŠDNªÇ®9Ÿ‰ôÂØ8›&×3Ú-Øå¶ÖŒ¢àÃú7GºÙX[l¬ zBò\f¡_²,Ž„ÉkÒfš0Hrù®à¸»¹|3©i\=»±ìõ x %ˆ3ާ#—º^XŽý%ä•]纞†ÃDœla–=*Šu+ ¸Ka¢äúP4nƒZ0÷©M%ó>Yf:Ò¶‹y † ¶Ÿ>ò kz„RÌE0¥L…ã¦Ì"~´FƒòˆãÙÀ'‹Gfp˜5[´Ôå#Ê(ÞûDüí¾ÍÆÌÌËçü/f‘Û(Ç"Žï}ìA\)ŽÒšLB›\&sY2¯Ûêä™é²n xdrAD1â—Ò'îe'™¥Ž¸G¼íjѼ”>€ºr[‘XŒ[öBx„vDqKÙTæÃ´ð”ò@*Y›ì×»æó~JE”´š l–Óœ=Žî‹wäd°[½¸Ô¦FfÓÆƒiy”RŽÞúè¡¿ñô´°Ós…-˜6 [ôO¬€})lqíEÞŽq HÐs…-˜6 [ôO¬€})lqíEOÇÈ ¯…-Ò¤TÆPõ£æ"ÒéøŸŽG9¤Ž‚–I¬HhÆ8w9`¾o OÍãn¤õj·A:d±‡ë$Ã-0K¥'^²ãºkc,@…ìæ$ˈgñÈka 1º9¹zÔ›“S¦Â0nà®"ê²GV€‡©æG”“á¸!n–ÊŠ-Ï¥9¦Œ"¨jÓ.€Aqô×½*íD¶Å„T¦w'ñ¾Õ`‘Ìû¨itQË’íOȹ9WK¡ÆS ‰_ÌsT™•còÿ”µ0ÚÚ`GQm»Ÿr„]x˜Éo–OÔðHE¾xî¥gD¹‰3M¨,G öB Qì‘(¥n -AιžœÔpQÍœÔpaÞnÑ?1OjÎoÉI/òvŒËI çj椆só–Žþ‰yRs~KOzÑÓ1ÒŸÔp!/9ÉIG)'Ûõ€pù„´'¾t_Ńλ´êõa;öDð&A¹¶œ¿œ¨t”å[2ñB:† 9C(¦<šG,fHQ£=VaÖ$k Qœ9i© ÌRØ:¸0¸ÔÊ„KŒënƒ²g¢jÛp8TŽÁ’F&‡[ ±¨ŽÐÝIã ã–"f)×yåx =žéórWºâìöÁ¯‡Ï‰XC?Ðk¸ëàýeØ î@¢jökl¼¨–Žª]Aq^þŽMñkïÍ•-ÎÝ€Î,sCòc!=¾/ÃYWÍýÕØÝ=ø÷u…]e«î|íþ¿wÝíã™3?¾~óbs7ô“iœŸ.b›jެ[Ælž%k_ÆQTW69ZÓœšyCEË“ÎaÛx{jç9i;Ó2Zˆ׳' u}j†Í6±~n¿Ñð›/[~âÕ9ŠõµåìmÀØÛ'໣Î;³Âè›Q…Ÿkah#iø}3î˜ÏÚǹ `Öõ¿óÞÎ{­áx­?ŒÆÃÜ7‹R[½ qù¦š^[*8\ÞmŒ!xOã@LC ghz¼~ÕÈx¶xN£ƒkÏ0 ¼‚gJU͉µƒŸ"f/ ¢» Aý“ï?þɼ ø endstream endobj 5525 0 obj 5065 endobj 5529 0 obj [361 /XYZ 32.1599999 785.299999 0] endobj 5530 0 obj [361 /XYZ 33.1199999 784.339999 0] endobj 5528 0 obj << /Type /Page /Parent 2 0 R /Contents 5531 0 R /Resources 5533 0 R /Annots 5534 0 R /MediaBox [0 0 595 842] >> endobj 5533 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5534 0 obj [ ] endobj 5531 0 obj << /Length 5532 0 R /Filter /FlateDecode >> stream xœí]K»rÞϯÐ:ÀÑiv³_@Àž±dÀ8²²ÎÍMp‘sç.ò÷Óš¦4–>’U,R­qÛ€g¬V“Åb±ªXÏ_ÿñ·?üçß¿>ÿö?‡ßÝÏçßžšc34ëŸÃéï/×´Ó±k×_Ç©?¶óéÏá÷?ž~~<}{ú¶üûãÉ ¯/ºËÃóë€ûý¯O¿®“?­ŸüöüÏËoÿwhÿ´üï/‡ý·åÇŸÜx§/üñ4ÍÃé—ÿ^1­i§å?׿þ×Ó¿üÝᯠÓ븧±Ý8µÍ”ÇË«æõïõ«h²æÐÛ±‡ƒ1íg¿ ãÿãéÏËh0ŽÓàþÀßSfšN3uͼÌÔØx2Íl;6ÉÀkOƒöÝx˜Æö0RØ ‡2Ù# ¦Ué“É[\cúàHrÜËȯËìéŽrz+{¤…2•F:Ád2Wç°‡’£î»u¡cþR/cåŽ4™Vi¤W˜LæêúñPbôO]g_ÚÙ8;•ýnn´FZ`2y‹[‘G’ãÞZ³.sYnîB/ce4tZÈ?Ád2Wç°‡’£˜V”-ŠV>Ò&%ôÏ'•Oi#§BòVçÐO†ú¦¢ûµoºßÀ‹Ÿ¿?ýúu:´öðýÏ ¯Êòúãû¢9üòª–-ÿûÓáï›Æ¼üÃáû_žååüIkýOšñõ“áòùä…~ÒÌÞKm·~åj˜õ“á8ôCÛ¯šýú¤›Éð»¦Y¿Û»±ýõ“¯q ÜËãrXÄXߤLh^ŸŒÇyò&ì …LÜMd…­ÿÉ ,ï›O‚=¯ï4ÇÁ6Ãõ;ÍWø¾ƒñÓ|& £¬ ûò}9=yga>ÝùnœÛ¬ga9ÿßÃë”óqtz#“õLo+é_?°Çu…×kœ–[3ï°ì0fS¾Ú:6sç=éà AÂÀþºÈB Ð*+ǃð²0’üA Y'|—~•!оkÒ祀|yý ?ì$Là=Iß­v€ @j[¡Mòæ0¨ÃŒèIûU¾Kkí‹"‰eáol‘NH¼ÆOìsqy0ôž@øéŸD„“‘uª0yÁÄOžS;’¸®?XûÅ_8ÜŠˆN‡lÏ/‰8¶Sͱ·ÃéËM†±åYdc1ˆéßØØ¼ÝW4M@¾Nþ4xád„lðj$BZ¢Ó1´¸)æóO-uEÜvpÚ÷8ùTšÁ“?ågŸÿ© 3vŒÉ_¹}»ÁzW¶–°/É\·1·¥ï ¦Ð¼ÀQýA­^£y_Þ¹ë_Ò»ŸnŸÖ[ÀGDæÃ áAðÄd/óñj;Yd˜ a Üz¢®à-ðwV‰DóUÏüb Ð#E ²¥Ñ“ǨÈÁj–#xÑD”Go›ÖWÊ0Ù¨¡µýà#ÑÔ˜– .|„iLu,I5&g¹O—äÝ&¢ª†ô3²rÑ`𮨣Xõ¿áôÔq*@Òæ1*F<ƒ1Rˆ¢•CŠ˜Eã'xY_Kó̱õÏÞŠïC˜ ™ŽàÑQöJ®N’»"ˆcWi…•àåÉûíìlLáq÷ë[»è'¬N~…ÑDÔE‚DrîjÈ•¹1Bœ¹æ–ÀepoLߟҕ~ÓŠQàÓi‹+\îÊeM{†Û"R¢ M =Ý»À1ÝQ_ÐyèV8õá½Ó ?aØ›°Y"`ªñ‘ÄÙla¸ßâL< 6æ0¶‹a\Mwmq;˜mäT G€M(ªnS¯ G œž]Évº™8‘úÆåì'w‚{‚æôÄ ð>1ðÉg8ÏŸ<Ã'p4<~b‹ûÞz;BÈËÉ>ÖdøbðÙ ¢)ƒ‘”Z¢(_VqÁHܱT‰G $j ,²Yžq‰ã#=.ßµ¨rÀàËØ‹ªáŠí;4±íË‹ ¨ £Ç•œ±ûFà“†  ’:;»g¨Ñ~JÖ0%úUÀ3Œyy\Gb0w¬c­Ÿ0|¢É¹e;;+Ü;SDeÅÜ 3çô#ÆU‡s³)¢èp|h^wÊQÒïgCZ6H¯ÊK:ÅœìíÈÑcÞ— `½—²ü8|’”eÐw‘óTưÀ@­£hpœˆ»úr,`$žF¦Ó©Bäk×ä¢8Óx`.C~­CÄX8¾]• ¼‚þîóÅ Tä9«/ÃÌ÷ƒ&¡·2òû‘XvÜPDI‹(H ¾möÅmNß™÷Ùg¶å«ÌŒhÞ Ÿ%‡“ ×X;Çù oH÷ºIî³ ®Ð‘JL™9>½âÒÉL³¿Q+J§ã47žMÎ¥…ögœ¾=Á¦)—yyÜU;7bK]ɉݠtáövêÎÀ§in5å=ÃíßÀÀq5ÝJMÝÑ: §À”ðóBÕøTâp=F¥š_&{€–•Ìšw ¥,M%DKÀÁíšÛ`Ù¿…ÿ`$%D¦‡Óå$¹Šñ>2h=Z â– ‡ÅÆçö_“I„M(Ž yLÛ§OCƒû`ÂÆœ’,Kr£ÈŠ'‘ʨÒÈ­)éO§5ÉL5!”WÀZ—Å€…;Ã-âHϨñßœÈ`F2 ^æ¡>>)雃HœááF mápíú°Ì¢p$»i=QÀ‘oðb¾."ÂpcwÙm «ÉÞ›ñ=3ºÅ%å…*¹Á†F˜È /É®$ÙWü MÑÓpY›{B ¤ÊFÿ »t%!‘D©¢Ñ¸¬åx3ŠZ•Áëî0€ƒ8)o¢î]zÁ›èÙ°/Áª.Œ]iûÑÓYÉ-NÒèГ@’Lìp܈5O‡Ÿà”8«y©~§!¸?xœxëÁ“ã RN¯ið<ð Þ9Œ¼ D"œÆ“‚:ø¤F[Hñ’=Å©Y~±Ó ðÖ` yÈ3XÞ9<NBƒïè%”¥éì)–‘Ád!À[,€ ‹##Èg¬Å  ÄÎg4;Ö%G»ÐÙ¶Ðé®êcß)˜`°_Oñ|Lp5å=ƒ ÞÀ¨T»/ÇyI-ÿØÕÁ¨`‡]ù °$tÁÄëÃð KüãØþÌXEº•™ã/Á@c„d¡é´ ‰s.Ã#ÅñêMÜÝį[fp•–þüdœ‡Ä'‚¢“¥ë‡éê”eó½ñÅ ‡ã´LpŒ ¬éŽªÚ¡ Yõè$U[‹¸£q€E<|¢VåÁYµ5PµMdT–#Örkœœ‹ù–T|ÀeáD‚›áf•DH‰xôGOgDÊT‰§˜FOåTÇæ²x8;4µÎõl8çøaŽÂ©[ ³­VÁp˜û3Éã%éii"_®Hï<’§–‘Ïí^ J»×A##³“á¬TuÅüDcª·ÉèÓù{‘Ðgƒ…F$5"$õYT+¨Õh5z,ºp”‡ÏKÒñ¢ÄYûìÅ.áÈ eެÒóL¥1¯ Ä3E,®ç‹kÖ ¹íô~ûXNñ{?±'úu°ÏI×»&ñ¥êBàÁ>4<®‹!€ïà°‰THüÖØ_‰½…Y‡7n‚O#öÌb\ãýO!kI; A,B×€ cS"ÆœB –ÂáZ=„@¯F‚@. !z†–„i§!º=‚¸“Ôó@€ãR*ц­ÅÑ4x=’“ŸÔÚÝ`bå³*àqjô‰&ØS×uTœ L­#ëîb,º+aÕ”°û³â­š‹7§«Ulš’F}#°Nÿí ®lQÖôQpß4ªr:ÝH’ïJYÝ X$-§¢šÊi“xõD~ùx Ú»†W9vŒ„P T¨Æ[Ò­1žð(”FŒ çøl¤óƱ¥^V’Íì^¹QÎ1Þ8^ëý±}Ô?›OU¥nÄOì}‹〔-jÊ¡>¼m„7b2ÉgZ…Élý›Híú2ºŠ`/[W§Z‡¨Ì® ®Q³CG®µ³¹ÄÄÍ5$ª5‹˜îU‰¹zlÓÝû™kÈŦUj,ºmŽoÒ¿ásÊ’w)ãs¬‡j.q¯æ'Œë€JÿWL£Î$¨@"È<|®²tE"³ŸÊ£ôÄ-é ýáIpû™µßu€ûOª›’UŒ yÀ3¤2êk<<Îæ‚ï0ÍXn‹+“âm"9a‚ðŽ&†8§´…Ñ'¦ÐÏP-‚OЫ9}`ç©É?ÒȳPgÆ»â+wH•þµ"~P=ð~™´I:n3èQ%0;šDà ¥&IÌ7YáÆÜu[ðFH dŒ|¤²Ì&¡Ð© y·è¦œýúý Û~òÎÃzÄ0ÈÆ£t",>–øÃù™*E±u®‰q~q™­àUÖŽÖ—6äºFt{|‰aÜ2ölüÞ³ß`´Uð” S矒Ÿò’ÜúâX7ü.CÙÿ`ó•£-ª+µ•ü%ŒPL¢fû½8wnüU²ìÝ(GÓ4GØ… Á$~.²²%|ÃGI $XÛå~)»—nS²ìä`|ÝïX ½jØ4»›žO£—<óâÌo«Fî+ÔÕ&%…0ŠTßW©¢.ªw¾óÜíóÜMéX‚ÑjÕ˜Ú¶pYŒ~"të@fÎí‹Û—¾{.å`ív„ôe¸ü$eÝè½#ãB)ªyZƒI-ûšdsÒ#?t<û+nLsFóÁÝÙäÛõá'ŠêNÖcÑœ~;$rŽ+S(’PuJóºq7nÀ(Y®â¿+\§€Óæ^uýkÕ/K? 7÷ªbÁ F‹§Ö‰ŠÁÈ’tÂP,oSÒxdf_¾àûá¡/”'@¥þ½„3ŠK–©](²èDCÐî•—Ã"j—¬áÕ‰â5"_Ÿ¤°Fƒ_¨:&u=Æ*ÝHs|˜ñÀ¯&Í‚ü¢¬Ï0îÖÒL"—Š”²ã  ]wâÄÙIî0 «0Ñ8UµÕíöYÑ)ã®â›¨­Ò«¸vrÌwbW¹‡TªáÎA#fQûáF£hÛáìOí Ê{8¾V&^ 6œoúÑ"o%+A-©<‡3^U«JF«»•T߯Ñ;I£R®5^ý6_½*Ëì=$:{ k³%aý‚¤8å'ecæ"Hš—ÔV @Ù(^O-Q‚q€KÉâÚDÅS†ÑºõâæK b˜X°Û§+Ù*^‘ΩbR¨å3Éi£QW@bž¨)r%óÏd1fäJ‹¯DéÖGݾ߮XÑ j=±‹|<€f“q|¬NÉòpz_âd W9¾“P#§F%knï_™À3+˜ªt—ÿy{ô%Ø[ÖE÷fYÀEeòg38AmšãàæÉ<¾À©ÜÑhœ¬@k¬òwÒÎX=Ûåä¶å$–J»œÜŽœ¬d(àW½)jŠï=v$ªÑ' @R͊ʹåR!.1‰Õ‡DÄCËèI…yŽ3ߊ?º¯É¤ô£·Æ¸“ðÔ &,Zu÷ÍÐBJª²]ç 2ùv’íædŠ2+Aší6§nߣ•W}oÑ) ¦µèÜpO'Qø. ÷îÕú\TÚSÝN(5ÊâG¬!¶=”8†VŽåµ†CYã™Ó[×â%/h·!I§ÞVFÌu¦Åçh¤épŒ\UQd #¨`Ú“/ŠìCjBÊ¡¨ªM³©³•”WÆ!¼p°Æ…çµe¯Ù2ÒÎ9-#óTg¬ây[¼÷´ 2ÝNõµÚš F ̃Ô†[,Vm²Û›6¾)Ûà²}—ÓƒïþÍ|?šˆU~"ÈHÚ2vt› ï|1„·Úи[í«õý‰¶ ª¤¸=¦ÃvßZ¢ç°RŽñh˜uI®S-Ä.et­Û¥]W n¤mq?Ì•Ù7N²m%vAEÉQ—¸í]ܰ&£ªéÞ"s³Ä6„Ù7ƨ€¥Hè €,¨úš‡sšrô$µ>ä  ͨ>mĽ<\rÎÇLÊkG¹Eà sy ýˆqI]Ÿx(s™b·8×S£‡Dá:b˜Z­Û$\%  ½¯(`]uË5z4ˆ J6ãd«A%óµmç ˆ¬*Š˜ça¿œF‚Ú´Œüð‡h©S¦º`Nê“`»TD®J­É½4‰H1*ÅX¨ÕhziwÚ¾?@‘•%3¸gÿŽ`³~~QNÈ7ÜŠê\íF³ÇÏ2c=ÙîB§;¶ cã6á < ÅÝw{#‘*c—¨k ÆÛ%x²yûàØçÄ3=&7ßóÂ> ŸßýÂn·÷ðÚ yÍ+‰£1'fõZiYþ~,0-ó¾à~üþGHººæmuß‚ë ¾EÌ4̲Œ[eXf3¬¹ý‡®¹Ü¡Ö†ãp»Êlıž¥v<ŽþåzEçxãÉzʺîØÎ7›ÈöýqX*tkž ¾3ÃwV“ÎØÛæµý¯bn¶ž²ëO^àw]I’+üŠÞq&Ž[O Z‡3FðÞq;ÆY»ƒíõdPÝé÷¶7—Š=œoäÓ;¾v¤£Y>…txŸ þ\ÂeÒwñn;s# Z—T|ƒž@ i ‚s=›Ú¼'ø]ɬùr¸ßôÜcÌNœÙ<«œ­ij†£95/|È0K5qš«›â7MYwøöôÿÛËP‰ endstream endobj 5532 0 obj 5569 endobj 5536 0 obj [362 /XYZ 40.7999999 287.059999 0] endobj 5537 0 obj [362 /XYZ 32.1599999 312.979999 0] endobj 5538 0 obj [362 /XYZ 33.1199999 311.059999 0] endobj 5539 0 obj [362 /XYZ 40.7999999 287.059999 0] endobj 5535 0 obj << /Type /Page /Parent 2 0 R /Contents 5540 0 R /Resources 5542 0 R /Annots 5543 0 R /MediaBox [0 0 595 842] >> endobj 5542 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5543 0 obj [ ] endobj 5540 0 obj << /Length 5541 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhøÒƒ@Àcä`0ääÌf,2‹8{Èߺ)µÛ¤>Š,Rlu[60öX-²X,Ö›UÿøõïÕ?«>>~ýOõ}üùøõÀjÖ2óU¿?\þAôµæ×®oj¡_Õ÷‡—êåðåðeø÷åÀÛÓ‹ãáá4…ð·ï¿>šÉæ/_ÿ<üö¿JTþ÷Kõ׿ ?~Ç;~àÇ¡×íñ—›_¸à¢þsùÛñá¿ù]õëB÷øï%5“²M‚ãåü*?}_¾Š&cU£úN‹Šs1ÀÙ èøï??£Á¨µâ¼kUÇ‚GåJÇm{^õ¨†ÍpFu8OIÉ"ËH'˜xâêoüC‘ѯY3¢L'£ÿu¬ä‘„Ê„þLRÇrt„‰'®nD?ªîÛñ þ2Qœ¥çÃr¦Ιa—cƒVºk+9 KFÃÛ¡ðy¨a¢W92ñ´¥ èîf‡ú’Eþ‰Wù÷âyñÓ·ÃÇg®d÷ß~ 9é æÇ·#EwÕ‡ ÷lxüSõ{ƸúCõí—ƒ®-»ÆhkyDOÄCü<òÓéÉçoâ×G£h £‘„zˆ`ÞÆo—øD˜§'¬ÏCxÂ!lø ±#yÃ'p4|Nóâ ÓõÎ}t-uIÑ?ØeŸ|*¹¼^^é¬b-†é”"i Šê‘ÞŸx ÈÊã8Ĩ ì©GrB\{L¼Û˜ûQtRÌÉ8 Iè’æf|3FŒÇ¼ÁÂ>ñÌÙå8a"k° DPà1l¥”½ÛT’=ݲ DØmËÇ»ýDÀ5£ÆNÀ¨Ç AÀ6€1xö´R@Ùl\¬ÂC ‰0±AuwºB^£¢v–úží:Ýô7j×eŸVƒ9{vœRÜfî]Û´¢¹¤m£LôöAìjæ´óQsþÔë$z×™†‡O3n`ˆDæ]U+óIÚÂÃ×9ºõ.€·ÿ3Mƒ€_Þ nÞ媼ïÞìø³ý®¡GÎê¶;}öuàÙ>ÃFÛiÞ '$ÎëFµo ð`ËhM-EÏß4FÛÈâC6ÃÝ7Ã؃ˆ®Â¡$¼ð‰3ȃœÃ4Z}.Ç&5ë'G$öœP”X¤Æž ìï¡øý®®,Kh8âÐôõ=‚÷fŠS¼n' !Žä‰W½ªÚ†ORs&S -h¯ Š“ቇEâÑš’¨)1¡Û”N˜Çyx ‘œp‡šÇ1„¡Æ©[;˜(@Š?¡PÞÈžÛä£Ä1úUˆu©”HVY×ÐO^Ô*çÆÜ$v(Ù†;½yÕÀ=7îîv{Ïè ÐæžŒühÞ•Žüd¶F)ADJ"X¡Ø2v†àyH¡OŠk’b,Qr&òæ? ØŠïAßJÜR >·\벊h¶&¢)º³áóœ pÊÞžÒœ’‹øÜc¶}èäB,÷ ÅN³r9ÅŒ^‰Û©8ÕoÊSI´¢„h¸°D„|Fä%á^>@äF0L£6ëtI…rÔ}'k<IòÁq;€”Säæ Á}Ýköö^ƨkòfš'„ ?!ÊUQijœˆìr‡ ±ÐÏ»÷á÷Îq‹Ús¨"ÌÂÇ€¢m,ëh£µÜeå<~ž áJª‡®.Š´–Á¢È³ÿöM[ —ÙîÖ9ï»BrŠ!Fé[V†Ÿ8•-·d+ ¹¸¢¼ºÔ¢Ë.È2K¸œw¯ºwñã‘ã±Û3u#4xq'\jŒ1!(þ–Öwyts—Åg]ío ñ’X‰œxÌ}ˆ)üü8ŒÂ£ß%\YÝ"û‰¸ãL‘JIíà%~\È ƒØ¨kµwæ—µ‘k’…S–>c[/²7qràðŽÞCëØÃcï=…%½:.»öínEeT^ÿrNT÷ÀFÈxõ$Cò–{Þò%yA’½ /BzÊ?bØpê?®ñzŠ])¼·Kò…ðVônŸÔ)ý(×( p}ÃeRÊZŽ/sÚ;ž'/S£ Ì åvé#¥X!å;AÜæí{RP‚Zâ)UKÁ(ÆÛÕ/»ä-DJâ.e«#”{НS+ŸtKŽRß—$Ç; ”G[íJn—L)±³ù«dªyelÞ¥¼ìñB½ìÙ öÏÜF®é+"ƒ(Í"(m$pŠÛ¬âA:2÷0Ï«»Š9ºÑ»ü%kÁˆÓPúôÖ Á5¼±ÄIJÅ %mrv¶XÙ×S¾1 ‡†û² <©À ¥ëœ‡"Àá;Y þd­p’Rô;¢ÄK ‹Y¥ˆY„÷H\É ³%J5îåâéë[E!ÊSŽ¢0`Þ¡$3¿‘Rlº–œ)­˜&]æ5)Ú à\ ÎóÏ‘œÏ>gʆ}¿HXî"a¶äVDšBõöþn®1ÏæCî+¡f©œŸÐ³³¿lÔÅ+ÜÊþËÔ£çÎû#î0c¬ëõ¥©MA_Û¾'nˆìØBÎ`1äÉD².C´'žzr]@Ëâ't†zö°ºU'm6ixžÍ<08={Z³õª»gÃidæË&™'lÒúGG³ibæ<e´sO+çת@O¤Žgìg0lbgwüßy-·ó \ç<ÏH`MmNEГg4ÏDȬ6'ÖÑeÛZšÁÖ dXª×(ý9ÿ+Æ«aLjuAqšcï]á,™ ‹ &"L^×Í[Ž7Âïœ#”±ç$3" 5@ŸÐ²_ ÂÏ’%RCéçB¢“øâ̘¿Äð³å£C)4Ÿ‘¶×½²d‰DÂ,™¥6|Bhb편»e¸d‹‰æ…GMÖnPÑ—Ç2°‡'K)'6®#Eô¦¢ÀàM?¢n}pGŒ„·W(%  >éqÛ;›ä`q¹j}„ö~N²¤iàsâ„.éÖôs+m )ϦFf™XSΣ¿¾±¨në²[Wöºë*¦V„ʰ,>ðåhQ _ïዹ…Ó1—Ô(uY äŒc’@¼b@SvÊfBYÔjŠ^¸rG§åÆC}uëU«­]“8°E¸^å©”ŠƒnIbØH£á;–”:²”ËZýÚ|ᘵþ–Âb’³&¦Æ84rÈÛ”¾ )k–L’¤\ÏhE~Ít1£3H0-F¯óv-OÈîsÚ‰ø®Ÿ½¹l„[ö¸°(…X¦ƒe­7b×—ÓG ï¢që}§»µ¬²=3“)\§*¡wÇ\Ïæxô&òÝÓÙß_:ûÜh¸d:÷C1Š›£ângž'ØP¸¦ô_!¬”‚·¼­¡=-·–ª³EÑŽz(ÈÓdJ; ÜOI`£?ÛÅÕ€Õ5¥{7àu{š(P¶jz¸"–@„æË$9Ch ï`ÃÒÑ5Å›µÿ.…ûJFàÿøüà³q݈yWêÑQJò´.¥aK)ž&(=ª(=Ä(g†pÒ=Ü› }8Ç%Ž¡&èÛ¤þÆXkƒzy[Â’0šµ}¨§v¶Ú½|C¯Ã(|c¤—"ëæL§h¸¸ò3¡ E7Ã4¯ ¬,Ò m¯ê¦YñêàIóÈ{Üÿã—b=bÛ ?)ååÙ~ä=“Í{}É6ìqÞ¶‹2uѶŽ[æ}„^«$Ù÷Kuü„°ÃHزŽMésµ3uæ]€<-sCVJ‡e '¦ÐÎ’nve>(Îæ¯6oSjÉ]•§Ý:7UÞ²¾Ì Z["©k°GW¤Ä¼(¾È=´HÄg¦Dã剖Ï-¢%Ü“K‹sø®^†‰y{hüñý‡w ìu _¼‹ð¾ºÜò¥­ø°Œ¹Òƒš·¦Ün%ÏÂhT‰Û¶nçóÔµª f.ž’]ÝÍžèfžÁ"e-ôì…ꦩ[“7a«sóôð ß1"§µ`§6˜Í¿Ë¿<ÁÏŽ·´fVøŒÞ³ çžp´Ž1G'îqÇbÖ>Âv: Twü]4|r©Œ ÆÜ|]<ŒŒfn48¦Ù!ê{5Í̓Ÿ¸´göì)¦8³ç P(qi…©Ò÷¬­ù±Ò[RÁŒããß^r팻úrø?@ï’¹ endstream endobj 5541 0 obj 4119 endobj 5545 0 obj [363 /XYZ 40.7999999 624.019999 0] endobj 5546 0 obj [363 /XYZ 40.7999999 262.100000 0] endobj 5547 0 obj [363 /XYZ 40.7999999 262.100000 0] endobj 5548 0 obj [363 /XYZ 40.7999999 624.019999 0] endobj 5544 0 obj << /Type /Page /Parent 2 0 R /Contents 5549 0 R /Resources 5551 0 R /Annots 5552 0 R /MediaBox [0 0 595 842] >> endobj 5551 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5552 0 obj [ ] endobj 5549 0 obj << /Length 5550 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Ň$ xlO€k ‡ ‡À›M°ˆqö¿uKÝ=Cê£Èb‘R÷È<ãfóU¬7«ŠïþøãßÿüíøîÃÿ9~~~øñPWu[ާ¿?¼ü@šJÉñ×Î4•ìOŽ_¿¾¿>>ÿ~?ˆöÜqú14^¦üí믇wãä‡ñ“?üyøíGyüÓð¿_ŽýÛðã§i¼Ó¾Lßž~ù÷ø‹Bšá?/;5þëð—ß–`ÎãžþýAëZêV'­ãûµ«8ÿ}ÙMV›¦Vµ9 !‡u68þûÃÏÃh×eT½¢kuWÚÉó°­8ö]{”­;¨³·°¡Dê@­ly:­H¤mMÔºóE}gúq›J¥nô:Tê@½d:ÃÓŠDÚÖ. ÇC‘Aß÷Ó6»tˆõ<‚‹|N+i[»€Eý‰Ë2aým¨Ô”Ö<Văõž¡È oùÆúëP©µƒ fè´"&Ðã¡È ïԸͦKÝçe¤d€u†GÊžW$’vv¼=ÒgýKÞô¯ïžŽO_ïžû“®ùåçag…uüñåÛAÿ9iR¿ütü}]«8~ùå DÕèÖtÍù{ç–º=·˜Ûúü®´¾7*ÃS‹<·tUÝM·–qx0ˆììùÂGÕÏ´U£„|õUÑ[£ŠÚú@~²¿ÑÁ}6°E¡µâ¥9»pÃÂ> ç ,÷«áóz޼ÌÁz¾jº¼O£åøA3Xpæ|8e¶÷éËÀÒè[he‰«º±iüù:`‹áB2(DúÎÂ0>ÄFs6µ°æôp-3±\) £8ÂÌ?b>–A²°Ú‘‚ù¦G„Ùr×#fÃ¥Ž‡ƒ;Ûù”…Ùs¨gž¡íœ&xâ'ZövÔ…kumÓ¾5 ?ux߈i HZQŠfkªžÃ±S6läó¢25VL˜$–AïÏÌÙ"˜Ê"H5»ê¥lVõšÙ½‡S›Sb°?Cˆ9øÏ;5œQōРy@K ÝbJc”¹9U¥ÉÞÖ‚UvÔ2éXÄ’ƒ˜g`1ï˜c˜þá¢õ§&U7YT½~R3Ú·„–n™$ÛL‹†-ØÂ6žGB Äcg@kOâ–÷¬kƒv­ÇÅÖ+n!œœ$ÌC99ÊN)£yúðž´ú=+€8걟ñ °Žiû*(¸ƒ½ M9n§…z­Ì­ÂJaÈc|”ŽyÀ–ù^›€òóŒ}ЃEá·ê© Ž)¹H'‹-eVÚˆåSÅŠ®/”Ù]€³¬-mHAlöP ¦u˜ (äáÆ\"ï7ì—÷¬¯Âóa nž{“šUcÇ´a¥5ïN=·#%yšé³(4C t÷†ú Ö%œã²gÕ„›>Š¥‚wŠõ Hº/¶Í)Åó`^C·³‹ð¦6›á%í½Fv)î]ÚˆžXÊm=E—Á;%ð$d X[”r¦/‚ø¦Ø[Òæmt[˜¿lݶnÚ&awêcÁ•}'0mkÅŸaÊ~nJÙŽS¶×М+K©Ç?7&­QK}¹'ê«E¼G}ð<žÑpŸõ‘·kÖñLmæ)êjŒtx1OZ&æi*=ÝfÝúŒª^[M¡¢/ZFv×TÒ©¸‰ :pBÂ>-œB¯Í³¸ÓILÌAíƒpƒ;ŧ€W0Á ')56-É †ªêì]c¸CèNŸsX ñȃãø1-I8>¸6õ µH¼¸6eBºðÐÒ8OW©¾¶úÀö³áÞB¬BÛ_ü&“Osîþ?".œ#@ÎrÂ[(Hpi19¹îvœ¾8NÍ ê[Œ™Ü7¦2þ€Íe;·Œ OWéh‡mD CJH‹óU{”H‘&Ê’bá®5bññRÎQDdqF5ºY/ªãHµl)x™“o·ÂfÜëÇv²ÄŸÙ\x9ªÕÅ÷wS‹œÐã2!ù“é6‡ˆ‹4º™pb–˜Qv.æ‘òùRrÖ–óO¼"‡ ;_)0?Š”Rˆ·”4‰‘ Óf”¦7¶`MnˆÁ‘ð\›>ÁîQø™žyìÐü¤ÁÑÍñ‘ßù­ÀNt‹ë¦ —›íœ?«\Æôˆ?ÂÔÂÜ$oVŒ:Ÿ’÷ŠdŠöÉ¡APÑÅ rœŒìHM)U7~# "lM'=ÕÑ=}dÙGCà$)Êb ©c| dýpä9øËòäH'8–b #TÑÕ9t€ÙÑ# ‚„@eŽú®ˆ™%r™El« ƒqk‰ŒlÓTŠ‚‘ÜÇŒHHÅ'8”]dIÉ/`½ªfq™17?~,B‰0Š‚µ|kã•’šÏÂHòÔ¸‰¸ ÎãÕÌ.Ò¤hl¼ÎSnm-W.%]Æ´Nñ./ò|\ÜÃSU_£oOGla±Küº½º¬¯ÁFíïÄ#×X¤@žRÅ ; ówu*M×£ADØÝáEDܪ"5C–8ΛŸ¹–]bd§K3Û[v—,‹c®Õ®¶\rAá’ 8ц0[2•ÄÜÊJm8ýª.˜¼gÚåò$ÊPÿ k$ƶ(ßXu) Ò¥`åáç)…ˆqBY©âÑ<©¹x?„RN¼<’’ï)’LhÁ©€E鬿$+|Z¥¢ûûF¾Fë™PoÞJ„E#2ó¨Â¢Ä¥Ç(©Å˜áô]LKÅC2b›˜bÑnÒÊV¬#Œf[Kðöoø"bÄ ‚Å[/S((iK…«ž[G¨gž÷aÝÐ'%ÆcmœEÌÑP{0KÂí4k\gLÙuJˆ:~Mƒ%Ù´È$9³Z[cÜn gD*ªç>+â’'*‡_nÄÄÆ³<– ”ï_0Ý»‹·—ç‰Cã.-®<…·CÑSÕDŠt`ÉaÀHÚq‘,ƒ­K°Ó£Ú¯é4Súr1ŒµÂxî „},É–¥°DåP…¼^‡˜¥±ä§ø#X„ïî0]Ì‘Ï$£j{akŠØ-“Y1dy1\ÏÝðÆ{öIˆô`ðc™—Ãè.‡%j©_Ÿï&£îôÁ\žò4.¹Œo€ å“7¥&…w¾VXœòl€_øï³:s”&ŒšÀTë)”ŽŸø!<–ƒãÍ~(?ãÍà<øqI ©Dãµa<ÀÅ0€}JÅñRŠì{x4æU”'×S¥ÙŸ[½˜úÜ<å ‹úVó|—m›–m¥hf—`»{cl—£,0IO„î²`—DY°~ŽÌÎñßÇ߰Ͳ~ÕN [ …R™doKÇuäwg:ÎÎ…6Á…(™ðˆ'ï~²<®ùX|P$åÎï|ð Ýiyúð>–‹¹÷†9Ê.§¶ §v_aaù¡ û¬þô‘Ab]®ªbžÊ ‘ÙExSa9׋¬OêE¤®“’T`D\Àók,ù‰±¯¬°”ßeÙùZ¯×í9ð¼l-SãkêëÎ"w˜¢IãÔê)l yQN¾xL,z‡I)“Z:•9‚Šò¼d·ÔÍë³Ú-£ºGðÄÚQîºî2*[`oÇ[Z°þ ­~P|Ùt¬—)±v¼÷œ„ûn OAn2Ì%3¥XD Ó®1¹K“{å¥"q¯ž®PµÜ16 c7/¸ºÔRšÂŒHj*-­âàyd áaà9ƒæÑÍs%nç|j6Ï $‹Æ¡‹nRKÕYꇆ<«IÞÏ̃±Ÿ¢_Ky·ôíñµaËïc°(žŠ`!‹Û8$(5ù¶Ex³†RšÙã‰`õ-WýVÏè,Ô¸¯÷ÁFÀ£F¨.ï’n<ËÀxSšÅÍ·lWs„È&U¸Ïïãê{K@D¼¾çr% CI¡•;xdBLJ† ÔÌ«»Îö¹¡ƒ¼Žï8‚¾X_´á|sQ"#É)ŸBîñ7<äÇ S\ÍáÌ,ËLrú•Œ¶åÎ#ð«–\w2âU®ðÛIø8 <Ï -¿vE 1À‘,¯qn%³ó~Q]áûJ5¡ÞŽÖÎOù²ï,x¸H!š)q+¬ M¼ïÝËÅÛâK[L…9lg÷”UC=~CVfr‡œÜê6ûZ6S’æ—÷m´Âšæn]å–¤ËÓ$<èQ –pXWŒr异sÍhi n‚®Ç|P°%³ón´Î^™`­뉞l.Jõ9œï—]ëJ¾qµ³€5o.Å#=Ïs:rk,¥ð¤"ë±1.¼îòšé~TÖœ–ªn,´¾o¯ží)P&¨Ê%¼ÌVî#"-b^§ŽÐF#"ìËGìs7šrcòâ4o]‹mEoqà·í;mMkÁ£ÄÛë¶r÷àz²ïz9¢Àl=^£=Û1`•DºN›ãsã(ë˜)­%‹bs¥HqjRÂ()jG^kt&‰ª9*Ú& æPÉo'7µYÄ¡<x|î`Ψ mAÃùÁ̰ø ˜óX´¥TIšôq5Jõ ¤¹•âÒ/l ²˜,«K_^.žåîÛ¬‹ÈÕàH¢Ø>û߬Ո„JãÈX–²û,K½‹˜sXöG¦€eKO ˜q=?xÞ|ÉbÜM{)tv•¸òw0Y½¥½ñ~<…›qa |5Š/g ÅðÚHÏ­þÐØ~r>¼æ-ñK*”Œ`Aæ²ÀŒ/YX²1–‰2·¶kú€õôgnOHâ§p±ˆ ÄEÏ“ ˜‚ öàG6ÍáXOAÁ° iKãóÁœ”°L÷”â”§7ðh˜)‚¢”ÂÆ§M).K)ä)U‹ 2CŒ÷yùŽ%<ÞkÁõ,'ŽàË:ŽJ­IïÔÞuA@ñî­F(äeVJvƒØ=`>Ù²eÏîÛ=`/Ö–5´^Z\c—ÐëKhJÐ$%œr³ÕrÖèlEú Hm qöÑõJÎ$Ïüvb'0fîÁ‡˜zÖz{#%?#‰XkN)ª3=ì3r¢NV²>?â{ky‚£xùò“ð»“(šÙá3ê3Ï\‹@û˜Ð<®Ïtb1{ŸÖv&€¬;ý.››ùÓÀùºx<˜T‡¹Ñà<CT‡°wò¦Ì̓[\Ü3{ÎcœÙCL\Úa*†S·•8iA¯Q3ÉÿeùÐÏœûøùð¼ýj- endstream endobj 5550 0 obj 4743 endobj 5554 0 obj [364 /XYZ 33.1199999 89.2999999 0] endobj 5555 0 obj [364 /XYZ 32.1599999 345.619999 0] endobj 5556 0 obj [364 /XYZ 40.7999999 539.539999 0] endobj 5557 0 obj [364 /XYZ 33.1199999 432.019999 0] endobj 5558 0 obj [364 /XYZ 32.1599999 91.2200000 0] endobj 5559 0 obj [364 /XYZ 40.7999999 679.699999 0] endobj 5560 0 obj [364 /XYZ 40.7999999 679.699999 0] endobj 5561 0 obj [364 /XYZ 40.7999999 539.539999 0] endobj 5562 0 obj [364 /XYZ 32.1599999 345.619999 0] endobj 5563 0 obj [364 /XYZ 32.1599999 433.939999 0] endobj 5564 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 469.459999 513.120000 486.739999 ] /Border [0 0 0] /Dest /sq#b7#8b#aaX#cei#7fM#b1#1a#a1F#0d#2b#c2#fe#e9m >> endobj 5565 0 obj << /Type /Annot /Subtype /Link /Rect [179.039999 373.459999 240.479999 381.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples >> endobj 5566 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 300.499999 98.4000000 308.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview >> endobj 5567 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 291.859999 108.960000 299.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_preliminaries >> endobj 5568 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 283.219999 151.199999 290.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig >> endobj 5569 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 274.579999 192.479999 282.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples >> endobj 5570 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 265.939999 146.399999 273.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues >> endobj 5571 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 257.300000 102.240000 264.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration >> endobj 5572 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 248.659999 188.639999 256.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions >> endobj 5573 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 240.019999 188.639999 247.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting >> endobj 5574 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 231.379999 159.839999 239.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit >> endobj 5575 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 222.739999 170.399999 230.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx >> endobj 5576 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 214.099999 153.120000 221.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk >> endobj 5577 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 205.459999 226.079999 213.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit >> endobj 5578 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 196.819999 98.4000000 204.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 5579 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 188.180000 124.319999 195.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example >> endobj 5580 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 179.540000 119.519999 187.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example >> endobj 5581 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 170.899999 116.640000 178.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation >> endobj 5582 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 162.259999 142.560000 169.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code >> endobj 5583 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 153.619999 153.120000 161.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates >> endobj 5584 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 144.979999 126.239999 152.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter >> endobj 5585 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 136.339999 145.439999 144.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states >> endobj 5586 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 127.699999 223.199999 135.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions >> endobj 5553 0 obj << /Type /Page /Parent 2 0 R /Contents 5587 0 R /Resources 5589 0 R /Annots 5590 0 R /MediaBox [0 0 595 842] >> endobj 5589 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5590 0 obj [ 5564 0 R 5565 0 R 5566 0 R 5567 0 R 5568 0 R 5569 0 R 5570 0 R 5571 0 R 5572 0 R 5573 0 R 5574 0 R 5575 0 R 5576 0 R 5577 0 R 5578 0 R 5579 0 R 5580 0 R 5581 0 R 5582 0 R 5583 0 R 5584 0 R 5585 0 R 5586 0 R ] endobj 5587 0 obj << /Length 5588 0 R /Filter /FlateDecode >> stream xœí=ɪåHvûûwÝP·b”` 9¼0$™àEã…ÉîvÑt5®î…ßÒUhУГt_eÔ{/$ÅxâÌÃÏÿöõ¿ïÿóÏûϾþïý»ýùáë=XÃÆ÷á¿ŸÖ ¢{H1þÚvú!Ìðïþý×Ûo÷ßn_n_úÿÿvãÍóCû£8 1vøÏï¿ý<~[¾~øþ·ÿ»‹û¿÷ýõþÇÿêüÉö7¼ðë­3ÍðË߯_¸à¢ëÿXÿ6<üåöŸ¸ÿ½ŸB÷ìwøÿOJq¥HšÇoó§üùßúSl0vךwBÝ9ýñ̺CŸôɧˆo²ÎZâ³F÷Ÿoé3ÐŒ¾;µgø^ã+Åa}ÂQHÄç&Qˆ÷ìu¼y ßè“w($¢ë‘ø™â˜‡ü–೎ÙQt¥ÕvT£;aåñŸ¾õÔ£8-h›Zõ½"æ´>ÒéT vÐ5 ÿ‡×üÀ·^|{aF‘¦"Þ0:ȹfji*öœ¦QÆeAÛF7B¯·zÄÎ¥[íƒ!'Yv‡ãL݃ÉP˜Ã¹Ma<Çæ1ã ØÜŽSb¸…ìÕ¾§­\„¾. Ùù®€ªèÖ¸kÀé#ŠçqÌŒKx1àÕ D2q!#›ÀÅCí³É+€©vó=¶]ãˆ7ÕÔÀ?ËxÌ316è‡ß 9ø­D¡ÙíNþ: ¾¬#´ºLM|:%£¤DÈ}„²sžÂŸà‹Å&À Ú½½ø{d9ÕÏîæÃèc¤Dœ?´j†©,¯jlòø²< 7[…ƒdøYx&€.Ðñ1|j8Ð…ƒIL.káÐ@aêÀ«`+Ð¥óŽK¯ò3¶Nþ[¡‚«é#hÒ®`ZpÌ€Ò5œ¢ÈÊ3NÄU…ë"Ü2€ð©>‚Ó‚4©ë+RFå¿ Æ18·)XE -Äœ.¸ï]¬à®F1tKè„ÎÃI¢ÇgoB±ºé0àò\ .=GŠZ!R¸Ò˜Ô¶šH8Y†ßâLǷᛦ>Úñ´|^®åU%ÐUàhÄE³ÜŸ§g&òðVŬ"B¶ª»¾‚wTtʹ¤1[H¸ÇµHømÁçXB “^yöæ˜& °Jج2C`÷—cô=Ò%*® w ü~@ùólòR˜7,¸ø&ówV§¾·¬Y9÷sŠí#b¼íšQXj9¶R\¤q_¬ΞysŒ½:cˆ]:|?=;#¶¢÷¬–ˆ2½R Åà‘Õ ªˆðGFœB–ŸpÂd‘Ó,‡y].ò¸sÛuP5ùíÿfRƒ2îàüIŸéV9¸ìm0µÄ9BHDWå×鍨 6 % •ªm<¥|‹‹#85ÁÅàþ¡^+$Ää}Œq¤›þ• %-ý‹Ë/Çp}ÉŸ’@ð4½^—ó7fÚª£OÏ â«œò_†Ñ½¢Õ¥ž:¡™­ÿþ´rp1‰m)3!ÛTŠn' ›ˆl„ˆî Ð\DŽ|¶×q-Lâ±Ú–::€q«ºûM[.ÌLq$ˆ BŒ’•»Ë"ÀeáÁ³$ûÊ6˜WÜÍ⻑àµ\È6 ´á1J iÈá „…b”Òy}}Šu@æðØ›ã$ΠvÂfÞ;R>`]5å¹_S+È=˜WH.‹”4üÆd4M`ήf(¨ 5wÊÎc`Ëb›ÏzY'W“ÎÕòá1¥ucÚðÜkz:wßì#ö„FWŠ?‰É|V++¹4³A‰ÀÃ%8[]Ñ$%˜ª’"árŽ%”Ÿ‡EI KAýH÷þ­àu¬›¦ð¢ ú¡êñŸW Jn¤¬‰+Ît7­ƒÙ¯#›\ç´/ižDdÃW7<Ægõl8;øß“#c¸Lˆ£­)Tàü†ò懃ùÃ3%dɆOP]„Ï*ZhºséCLˆ#¡lM‚Ì3,á‘9hINÀ§˜A/[IžHêW,ç‚ߢÏžœ’ÂUÚYÆD$—îEŒÉ¨†›x~Vx,Zšc¿ œk 7:38“¦O=\ ¼g1Ö“Ë‚wžèôÃð:ˆqrVŽ=6ˆSh@ÌŽä¸&qPY‰@uPVÚš•ÝÀ<™K¦¹j…ƒôK'þ8¶£¦X»SîwŒä˜%¯[¸p#D$#ÄÚå BM)rV pK ï̃Qù#¨ÜWíE¯ T‰9i–lõ…Jd‘Ý Ä±š'k.¾BØ"Å×5oòG$yMÑ Pézålt×É/öŠå>³ ³äÛ>ÉuÓÇwæÄRÔŸY™6G"Üb2g;—ª–QÍ•E%È£…‰â²ÄÜäÈäOPád>e cý+eŠàÐÉ£‚] Õ>ç<¤²ÀG$BOaèa±%ñ¨ä"ͬ˚à?OXkÉZS¥NJóˆhÆ¢üðªÑXw‚è¸ø|ƒ'xn"f½’ašR¸»«0ñ+:vÍ× ç›…-A;Æ)­2˜pSr=Gð| ŽŒ3HÄí±eƒ†u>—)†øŽûPo‘¯þvûZh‡ `~7Õuèá^ÇéœÛpW:ÉIYÐM“VãVp9-0`û®o™:>ƒ~#žûÀ§#àzÝ0œŽÀË`þa Ûáèð+Ï‘ú¸+LÖêI6È2>òùÏÍ€_©^W”­8;ëåINÕ%óŒrp@K‘Õ ”ÀJOޤQ DŠ},%ì-"N+'B›—79SB1Ç 9Žù «PN-^®\JtÍÈC»#n@LMêÓ‘«'±eN5f¼Ã­ Ð.™‹$º€p-ô5/B7²”vÀ_ H¬Nžbjä°H\0t‘€þ:ÑDºu® ›‹;¢oÐ( $%ý¨ŒvWPÞwËwÌ"áÌ1ZÍ€¢¯`<}ã “ãܸyåt󤢙ri0TèA*a€ *ŒAkxöÀò9µqù˜—2€æ^BËãq…“„ÜîÁ%³I —);ÍI.Á‘¸Œ¦’Â#†•¬…àzboÇ…é ˜.¶ÔfgÉ4µÈcÙ8Žë†‰T¿—t-QHŒÉÛR¤ÔyáÊ·”¼ð ÜŒ–—›-N¨xÓ: QÍV]'-{¡BDâ‹XWñ!;%ã±äÊÍW"Ó/dt=Î#;Åó$¦D²J‰uÉd‡)8àî~¥Ðëß+ÇâC»19Ï"²ßFì 4‚ÆlpÖ:Š1µGcœycŠ#¾tõ”×AÂ4¿ÉJ‡ç $k‰‘îOMUb\iémé¹ä.¸Eb±tDÓJ€Z6¦M–`šÔîx“jýhôx“(5K)v©Òó·í<"H€`‘窅—½‹í£5»~CR¸[8Ü[-·5SÆ-j²eàN)4v¦À?¡“s»ÒJ4ž¦´¾w¸A×øa¦€lû„ãOÆÛ1ñLÙ%vÍÀ ‘ w„óöY0©•ͧ¿Í£ë9˜–?Zλg«ä÷–=ž€ÏØÔòýÖ˜çFtŸÚšnÝËô×8Fÿ¾ý»>»;_‹Æ£où~sf2¼%×½l×ñýöËíýê—ÙuNÝ’ÈfFÙ‰ Í‘{‹’d·¬½Ûb¼¸–WMõ€T»nUãà@¨š-ªv•q¤o@Ø·Y0³½L5[ Tz•c(„Ã[rÝËv'¡žŒÇwŽQ€àRj GP½Æè¸"îC°^ÓÞ=—(k̺aªP†B=WÏzZ]³\(Û ŸË•´à6¶¶}‹°@9µ|ï?ât—·Ø¶¶føÂ6È'к0Œx~´Ìð–Þv£·Ãüâàƒ°Ïõ˜lºëÂr zÐXÙ¤ND×1Ô[4ìЈßîƒÃè¦!l;á€m'÷À¶Ó.<õ-lŸo±m7l=̶ßÛçÛaÛç[zÛÞs*ØvíåÁ7zœ&Lç¬ðpxoº‰S[7”+H9 ä@Çëh¦7ÖÙÇ_oRɽ=BH†±-B2Œï $äƒ)†!o±m7l=Ì‚ŒÙCH¦sRßÒó-½íFo‡9!6¥ãГd º!˜Ä•]8Å‹0¢Ñ3Å#†žˆOˆAm’å"÷¹á{¹®p>´¸rÑÐ6J>S/Ó_[áÜð=áÜpW8Z\¹èù–\÷²]ǹr‘ò´ªë–â:!ˆ¡³@¢7 Á˜X6&–í&–ÆÅÄÒ@Lü|‹m»aëafLl¤ÞÁÄF*0Œ˜x|Ko»ÑÛaNÅÄÊ çÚa £Äù¼ !G0†'ïÆI¯eo¬(S!&:=5z8AS“€'¥^7$4ÁŸž_F÷?úÿþñçÛûê7JˆÑbô¬#ÀEšp¯Þ«UVÿŽãÈ_ØñFðõbD¿ ›ÁH­‚©Ië(L»§h0­«hZ5igEÃÒ [³P“vOÑ`ZWÑ0´jÒΊ†¥½æTjÒ‹’YR§™È$ƒ+ʃÍa~Ù#—£pÚÎÊ‚V¯2 ÐOG¡fÎÖãó^¸·£y´¨€Œk"æ2³DgšuCòéÉ7Ÿ~z’ñYBS»à¤Q Ònö£MRÅP'eÕH$[©¢oØ‘*úVGªx¶8tÀ¾Å¶Ý°õ0èv¤Š¾Ua€TaßÒÛnôv˜é€dòJ“ÿÆŽá(7 ÚN|Šx®¸Úé…õïp½\„×-–¦"”ZöÀ¸rÝPNµ.Ç´Ãë{SÅ= cr0Uá\œ­ÿõ¦88‹m¦dj¢Óßj3ûÖv«i|¶8ÚÌg[Ó­{™þšŒÐÓßj3ûVÆ®6s|K®{Ù®ãTmf?‹Yˆ}K6¡§"R2½XtÚuC0ËЇehvDǾU»´¼¢£}‹m»aëa–¡ÙûV†¢£}Ko»ÑÛaNešItô°Þž@t ',Í,†1¾n†£Ž9pÔí˜ûVépL‹ö-¶í†­‡Yà¨Ý1-ö­;L L‹ö-½íFo‡9ŽºIvÄYϨ¤GfÁp°éfÃðuC: 4Ý–š‹žä̱è=[\8´Y*gÌššnKÍŽE¯om\h€Eo|K®{Ù®ã\ÈÙ±E¯0a{ùŸCÉ2g³}°Óë†Ptʹ#És¾'É(k熎o±m7l=ÌŒN9ß“ä9w%ù¡ÅE§ã[zÛÞs&:å‚“å”üŸ²Žóƒ+B¥¬`ìÍÅÄû Ù­‚¡T*JåŽ_nßÚºà#_®}‹m»aëa(•;~¹}«Ã¿\û–Þv£·Ãœ ¥Òä… îoÅ,´" eçrF’=(m•­SC0ðkGrâzOrâÚ•œ†üz–œ–nØz˜øõžäĵ+9 -øõ,9-Ýèí0§¿N1ºEÂÇ€Ú'"¨éE¸Rë†`Pk኷{Âo]ájh ÖÎÂÕÒ [³€Z³'\ñÆ®†jÍ,\-Ýèí0§‚Z«_Ô‚öóʨ‚ÛÅT­‚ïÅì=7˜½{Ñ˦ÀïÅó-¶í†­‡YîE×îÝ‹®q‡éx/žoém7z;Ì©÷ÂÌ‘™¸(!š ÊtaÝ"8¤Eðí0¹áÙ–ª„Z•‡÷ÔLl¾œ.ÔVš-‘›Ž;Ð(?c[‘'ùB¥ú¤À çÿ Ð!)èøö¬kܳ®ž‚îÕ#…š¹BB:¹%´½ØTnÍ4 è_°eÃûÿî¿õ;ûÌ5ÇîöÇ÷_I"êJúýâ=%ï§ÇÇÛÜy¿À=-‡áÍ(TÜ%S[Æ¢é÷f?gj/#hD´vŸÓlwžŒ]ʇpÓZD¦Íõ.píÓ¡ßô›2[2ýYvh¯·ÈÖ-Ñw-Ó±³ÂÏØ75ì=áØ:,í£}cOŒ²v¾º P7ü.4Ÿ©FÇkép`5³{ßàP…BˆRîiã{m]½ƒÞÅG´9ÁwnŸ ̇<î¶Eå{Cë‡,Ñu¬yðAɸ üÈ8zÝ×ÅŽ¿äÄÐ÷/·ÿ@ÉÔ endstream endobj 5588 0 obj 7093 endobj 5592 0 obj [365 /XYZ 40.7999999 127.699999 0] endobj 5593 0 obj [365 /XYZ 40.7999999 665.299999 0] endobj 5594 0 obj [365 /XYZ 32.1599999 692.179999 0] endobj 5595 0 obj [365 /XYZ 40.7999999 665.299999 0] endobj 5596 0 obj [365 /XYZ 40.7999999 127.699999 0] endobj 5597 0 obj [365 /XYZ 33.1199999 690.259999 0] endobj 5598 0 obj << /Type /Annot /Subtype /Link /Rect [335.519999 768.980000 357.599999 776.659999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://nodejs.org) >> >> endobj 5599 0 obj << /Type /Annot /Subtype /Link /Rect [381.599999 727.700000 389.279999 735.379999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developers.google.com/v8) >> >> endobj 5600 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 711.379999 71.5199999 719.059999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.webkit.org/) >> >> endobj 5601 0 obj << /Type /Annot /Subtype /Link /Rect [420 711.379999 458.399999 719.059999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit) >> >> endobj 5591 0 obj << /Type /Page /Parent 2 0 R /Contents 5602 0 R /Resources 5604 0 R /Annots 5605 0 R /MediaBox [0 0 595 842] >> endobj 5604 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5605 0 obj [ 5598 0 R 5599 0 R 5600 0 R 5601 0 R ] endobj 5602 0 obj << /Length 5603 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€•Ň^@À¯ CÃrXäx³ ëEœ=äïGÝ¢¦{H}$‹*RêÙ€gÜlQdU±ÞU|óçÏÿ8ýë÷Ó›÷Ÿÿsúj~¾ÿüPWu[ONç¿?Ü~ ûJÉé×®o*9œÿœ¾~{ø~úþðéáÓøï÷Ñ^4?ÆÁùÓ„¿ýíáÍôò‡é“Ïïÿ:þö¿“<ýeüß/§ÿ>þøÉÌwþ·‡~hÏ¿ü:ý"¤ýøŸÛß΃ÿ~øÛN¿Kè/óžÿýAkÙvrÝ:¾?=*.oE/«OM£”—(ÆD3‚ã¿ÿ|øyœíiUßš?ð÷˜7õç75í0¾©Öãâ× Zˆ®Õ]½øNžçl[}ºv\¼;©ÂÈ©ÖNÔ‹†g¢óŠÄº­àîüS˜”nꡇ¿¶Þ·—­7Ýj š™VqÐ’ ­ýy’5;›‘gbÅÅ0(&\Ì3­¡®õÀ„ÔqE<¸€3qâB‹¾çÁÅÓL«q!5»»¬ˆx&V\È¡aÂÅ<ÓjªF0!u\.àL©¢ZëA3Á}ži5¸š¦æ™è¼"¸Ã™’áÞÖ‚ îóL«ÁÕŽkᙨLp‡3±òž¾áâ=óL«A8&¤žWă {¦O,æ’¼šKß=¾ûòðæq8›†_~Wq±/§_¾=Œ¶Òg›©Ñ§/?þX×êñO§/¿<´•}×Lé4"äe¤«êAY#ýe¤øjÝ£ékŸùxiF3¸²¹i.#ºÒÓ#7K¬%Õ}µ~?DÌêY½=‰ÎWµâ ·ñÛŠÿª|´ñç¬îF}@k•9¨³?;¤5LZ -ÚŸèàŠ0¤ƒ¯u4ÚÜ%ƽ‡%âYKj›æœ“ãÂCO\F„œ—³VH¸ZÙžÿñË(m2ÉŽ¶·„‡|;mIT£þqfÌ9†#òƒ KHð.ô¶‚û…™å('£xª–-çyø$~1D"˜à“¸^¸Öé Ø#xRd†C0Îûà¶Ä»e~qóÁ[ˆ¼V ÒÖaåª#y¸‰ƒ‚"ˆ%‚ƒé„S–_"ô½´$‚ËKí8ßpqšrÒ1zQj”‡w;$’9nÎWN}ÃØª£uŽf¼‰êù*¤‡ÚÅ'8ž–ð 3íÃ|Ϥ$¹‡4,| ÇØNžsæ§àB"Ëø÷3˜°y„j&± ñŽËLpnàþ–Ãß’ÂaxíPLìà•ù†MÜòá8ÄEñ ¤u´ —¯;jA±%¸–`ýsf9íU¸¹Rç%_V¬ªó÷з·üúð¹x\ἄç`Dª(Ýnœ÷åOv9Žƒ, šGZ!O=ÏB áx štH^› q×RÍpÏü6¦®ÛYßzD]RX+5ñÔu} l(ò³†Iw­»aì'ìb¸‘Ëãñò‡A;`nŸÈãe+¼4W:f›;%P0¢µœâ¥W–|¡¨Sé^Ùë þƒz?ÜsëˆM|0ðê’\Ác^ÉñI2†d×8:M¼Ÿ‹ ѵ†ÀqeG À–]P "”U‹NápfkqëZ”xí`!.בöNTàc@!¾òc€x2 ÄAÙ Ö "ºˆè×´Þ¡êÚ¦}î6Ïb¸,ÕßLн žaCÀ‰!×G]—áó’˜Cu‹P‡8<µaç<Ŷ†„”¤ ­eØy×èñ”ijù¤°d8 0…, šóüàMÿ\óí«Q;}®ZÕ×ͼÎëÎ }ÏâaR|½„#r€ ©ik²iãÏDØKñЄò˜X„j;Ø'l°)PñFè@Ãþ†–KD…GD²DìÁøš–tï2wö6à’Œá›3¥lVž0µA­š]WrÉ’‚~pÛúáJEÖlEqn÷—Vˆ36]g‘ºÙÿP5€6FŒŠDzÆloid€# \€#-QxïMæfK]-#y#k&bÖÌ@D—²éÒ¿rxp˜²wžë2Õ`RöºFÝ~°EÊÞy T\b›šbïˆð¤û½*þÚwö™Uo!<ÌÃ+1çý@ça24[Îà„vtô\Ì,¶‡Þ¶äºFœèà”X5|Faªb³»N/-Y,€ÜxSJ§›Ï~–A=? KÞ”øHA#¡er„…e×”m®mD× nÿ¿…äW`qó–.ñ•¼„ d%”Ù·ÛQÎP†lRÁ6$Ä!%0¥ý‹?®t!!£’à/ÀØIH[猷1WU„ëTái§_¤Bq-cß Gˆ¼”)±»ŒêÒ |”b˜p5(ÁFhb¶BÏ/^ºÚÖD^o^yDƒ¬êÞ{i/Z[Ïà¬"õdq$¹%wë­†3Dž™ ýÐnm7œ—2X¢,,¹[w¥L*Äàã(ãñèÐÛ¨ù32! ‚–bŒTTœ³á`ÌámN}h‚æ­§Ye5­”²‹¼>6¡¤…›Ã£ ìïz° UÀæÊ>9,ÇÃQçä¦î¸®ÚN1;hOø!#áZ{+BWvy•¸J+}Éÿ»NòˆF jçÉnF1ô/†jè/XŠxÆèÉBUJ?ÔælÞlïó&¼ÃõbXÎ"½ ¾­»çX¼d‘<בe‹FêY7jumÓí™·ð™=£ÞÍ(štG%‹ÐJQ†}J‡€ñ3ôý%a6èFl:Ì^9‰õš‹|6e«õó…/¥ñrdbs”Ò•®¢÷Ût ñ]¦’š±Ç»¢X‹ö7« Y^'Ôv±T6•-ˆç.¼#Äïâup'1¾qZRÊ`·fëbí±ðºfb»Ã,µÕ“Œ!8xL?ë®›‹x¤g$|Æ“–a ’÷SÃhƒVlöAÄzTãhiñŽCì†8îÓbŠëÓ¢†;½*%9i°kÙÀ  ÙWÉ-Ñ<›£9b=ZAÙF’(®†‡Ï ¦y…©§Ð~ðiP¸üC§Ôª!Þ›ÁA—ƒ žuÂÁœ˜0ä=2ó!ÈÙ1ÏÇ…O¼š‰‚åZž ^5½,ô^·6 œGá\)7ÿѱMRò->p¬õ§›·ÚqFFø ´ýx œ}½8íï̡ȶ³Ø„2Ä"„Z‚ÂëÙ)VHJa/Ö»²—ÕêNYp/К¶³q‘“¾u)AJÇB ¡4'…u$¤Fä]§”„Ä߸Ȓƒ±— y¹çÙ¿ÇÀ=Cü.g>»éÎyÝAÆÖ'>“IëxHbxeOoë¾½A«˜®!F^¢χΡFg–ܧœW jûÈD´­…6ݪÛdwÓ–RßCÈ1dLúÊ\ƒßÙVü½QµÅвFJ(P(à&i›0§´på¨Èõx BÝ”™ûíQêüR*›dÞÒ3N‹;ì4»k]Ji‚-u!©…}&_›„*d·FÔñ’Câ) òû1fIu¥;í¤T²§ôúM Þ¾îøgR< „I:+¾U‡²t.^Ê­¦;ÏDG7‡s¾ò-ÙÒbÄX=ÆqBìÉÅ 8z|ø¹Ó¢î9<\/-÷Œ–ÕS*Æ<\e`tÍ÷ 6otãε0Á®ÏT³_ û"8BðßSUÔšf°Zm™ÄfO7%¨îðÐÀFñ·‚9Ðzä(/TOÀ²«³á‘CS94•CS™4•ÑÂBUžÈ‰‘í ½bì‹)]äVuþܺ n»$­{ð²TeÁ¯º¤œ÷¾²ø{Ò<Î*§…G‹z÷·¤´JÖiœ,w«nV@ ²Æ»ƒmºr6œ¨;KfÇ0µô¦8ª÷||DÙ71…ÓO]õž3ޱí÷öœ†!vR³EX{Ò%É‹BWñi!žêª²(=¦–aIéÁ²Kx‡‘jÔ Ù¼<µL_¡5꥞í Ç}Ð4hÄ]€}HÝsdüm7MÖ(éá™’yKÈá¸ê¶T/í­Ì…9öŒxtü Þ^5¾§:;ÏT½¶°AÞö ]7á•!<š-{>^Ó 6æ;etˆÂA(£y›;k6ÅwGè@Pg÷uãN0w¸Æ¡Sƒ4¸ÝmÒ]0ñ©#”'ìbJ`%nx˜PdÇR!R:SdÿUØNfKW'½^×sì}Gý$ò¤Úpö[#°b‚[vU·Ê,m$3Uòæ´X¹8-g’»qr_`Jx‡v´?/Î)•t8SjCÊÜú¼ª‰Çž=’+8ôšÌ¹ßá‚$¾Y¯{O!y£¼Tj¥VO—õe±Ø]!Ÿ¹ØlEµsÙzÆÂ~LxŽ€OŸV¼Q‚Q¹¦²zë²€ã˜ó®ç “kür †NZ’¡3تIà]¤ÿSÑ’º*½Ä³qßR,sW­­Ã}ŸA¼-ó]ºÁV#ç½øômÞöCgå|¹“&úmæ®±÷ÉÞî G!#¶±¸"ß`·Žÿ MlÈØe£,fî R¦tbÿ×-ä–NžÛaÃtï¼Ì¯[eíG’GD:·ö@³D:=åIñÙó<ÜgëP+¢–ôë?2òúv°Å'¡Ó»Ê*‡Ûü2!g'KÊ=ÉÕk/én”—“>%ôvMÁ‡½–龃!D‚°)%íTDå”ÚZ·zD”ía vœ+©3vJ*V(ê /4ó…b,-Ds\z„Z¶ µäÍ-Ûëç)õÌëŽÎØ]Ñç´l‹[ß×2g½Ñ…¸JÝBqJBý>Ь¹´  פ\­D¢)w(`ÑŸR¹uq‘9þ²Bz¾B%ÄàÈbŸdíÅ“±Þ$ÜÔ¥‘ÝL`8ºÛâyFZÄÜä£Åëp3?ܺ·TS<Ï`èÀâÙ$nAˆ[öAX7°å§¡aæ0z(>n ¶$Â+ðÐn““rJðl 8x?¸RÓ莡£0tpc¨ºÆT…O~†Aw)F!0ë §˜S`™…99æ½FU©»’š~.Yc­·Ìt™ƒ­’:="K¶´kÕ&ó4SÃô‚å;¦åCû9´/½áÆu5¦, ÌÁÐÁøÁtB;е­_ tö,w%~/yA’2ÚöOwILË\²õmyd|ÉKÂí1·„7å87ëžmîT¬H`'IJ›ë<)t+•äÕ:D;Xø 2ºœ©¶æ¾òëj\"€¶t³KŽ–j@Ôl¸ïRö¯/rÙWÚ‰ˆOVÚàºbÕt6!æI‰yáä¶ûxÀ‹H¬{!͘1xV~Ì×éb”¸ÃbíÃt}a÷ÔºþzõN=ý¹RH‹Fê]càÙ’žÐ3„BUÔë„L°uÎmD^&íÜ{Ï3ôýN<'´g2c*-­šÔUÊ–ÈæÐµ•ºðߨg<Ò±õrÁ½˜í#žÉ™•’£ž§i%K wJ)>fjΕ©,…@±bV"ìãÆ[í`7ÞœJ±ÇYLhOì`+w……Ð¥•R¹ÂaG²–ijt«)¦²õ×l;Cmn!¢)a %NyŠË^–¿¦ôÅGíSOÏ| ˆqÿûüΘx/)¡¥+Ó™îÊÅR²HSò _ÏÐ)U"xm»×êàZ˜Ië¹X¼ïÁ=UnqÜÖ%s*%«R-XnÕK¸Î/s#¤ˆ¾ñ­ÑÝ€ŸýˆL´ žÅs‘‚#ÊR\ƒ3¬ bDÛGæëF4þ=}OçxøÎ_0?¾~óW÷œ××sþÉ{Ò½†“ Ú“·±$îÑV“Ã]ÕO|ÂdZ´U»l^ ºr€6a\vU·žêF&(UÉa±»iªv"C›:–ÞÓÃgøÌD¬d}I+±%ÑÒlÝ~ò~×PûÂÑ3†¨—FÚ‡áx´g Æ({7k»€Twþ]6b®I7ÁŸ¥÷aœB:À³a:0ÙM oò¸–hbиj ë9¤üŒ‡R0=ÀýxÖ†iõ= =ô}ÝVâl=' Ì0aˆÇõ'Nþ|úôð=kW endstream endobj 5603 0 obj 5630 endobj 5607 0 obj [366 /XYZ 33.1199999 347.539999 0] endobj 5608 0 obj [366 /XYZ 40.7999999 305.299999 0] endobj 5609 0 obj [366 /XYZ 40.7999999 527.059999 0] endobj 5610 0 obj [366 /XYZ 40.7999999 305.299999 0] endobj 5611 0 obj [366 /XYZ 40.7999999 527.059999 0] endobj 5612 0 obj [366 /XYZ 32.1599999 349.459999 0] endobj 5613 0 obj << /Type /Annot /Subtype /Link /Rect [239.519999 278.419999 265.439999 286.099999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://launchpad.net/~chris-lea/+archive/node.js) >> >> endobj 5614 0 obj << /Type /Annot /Subtype /Link /Rect [361.439999 268.819999 374.879999 276.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://launchpad.net/~chris-lea/+archive/ubuntu/node.js/) >> >> endobj 5606 0 obj << /Type /Page /Parent 2 0 R /Contents 5615 0 R /Resources 5617 0 R /Annots 5618 0 R /MediaBox [0 0 595 842] >> endobj 5617 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5618 0 obj [ 5613 0 R 5614 0 R ] endobj 5615 0 obj << /Length 5616 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èó+‹O‘@`g<CÃrXäx³Y,Ö‹8{ÈßÔ¢z$–>J¤H©Ûî`ºG>ŠÅzWñÍ_>üóüï?Îož?üçüÉ}>8ÕU­ëþçÜý~?¾ÀM%xÿµ1ªâ¶û9ú|úrþrzzßþýrbúò¢ûho]ô þñé÷Ó›¾óSåÃóßÚoÿ;óó_Ûÿ~=ÿøöã'×^÷À瓱ºûò[ÿ…qÆMûÏø[wó—Óß¿;ÿÞÁ\Úíþ~/¥0FšMãør}•]~ǯ¢Îê³RÒ(}fŒ·ãT-8þû¯ÓÏmk×aTFóFªÚø}MO ï»RgÛè³jH?dºëZb[²Œåi¨Û43VË&ØRÖµ°ZdZ‹¡¥­ T5³™µQžµ€-å\ U7užµ¸¶´y-×™µQ–µÀ-e]‹–XgZ‹¡¥Í äÚdj¨Qžµ€-e]‹–gZ‹¡¥Í M¦}Ñ(ÏZÀ–Z˜»ø}M?¦ë¤ie(ÖöØ E—ܪž[µÀCK[WJ×2¬qÛ4³aÉaK9×B3ÁÍÛïÚÒæµàu“§!v`†í‡[ª¬d¬Ñò妅 äýØs•¥›-rš×¦¶6¤Ú­Ÿ¥¡nDlÛÔÈ“¦ÞgQ«ø«Zõ%ðâÓÇÓ›w¬í¢Ó"?þ܎䢊öÛéªó÷4oÌùãOç?Õ5÷çóÇ_O¶RV4ª×]û;L¢;µAwøl­­áwð^àïp8êgøÎpl:¾ŸÀ|,|¯AnðÀ|pkp¦BT°øù  Œ×pÔ5ÆüN ŽâÖàþÁc `/Äx<6QÇï,®`?Rp7ܦ;w^>¶´{%¶€ ËúB†­äSgu¥fÚá¼³®ñáºÐÃVV²Ÿíë£n gä+h{„`¬RROFèF¢;œŒõ9¬\ æÁ›½…¨ô¶ôâ3å¯>º£QªÜ0®è.lªš œûkK0/XBŽZêŠ_–Ò²kÊb^¦ƒ™Aq áÊxs“/;€Ô ‡Öê‡p¸‚µ<„Û—öéW#.¨Z]»†Ùh¥'ôZø AΜÌÁ~ðzÇú4s¤ó‡»pŒ¸y IŒ$—ÿ ÜØz¼Bó£¯`ÐD‹n{°Åj±…%ÀÐß N7"A@{‚º%î·–¢ =´Û AÆ«"`LÄ£ÆÙ<„5ÆQ!Êñ^€£fÖ¸5<¬ûcì]·²”ËñL¦š[ƒoAAÁoÒ7Ëj +ü²ñWS̵Äíü’F£¼Há/å.´ÂDZ;ªÌœ¯„×è‚ö±›Av1i¬=Ô¡µ¿‡žvRt:ï™§÷E‡Z#¤{hŸLRg`kâ-Ä'ØZŒÕ.e·Êºн¸TÝkEkÝ+·î0V&h>I#H0& “0Ÿ‡¾¶‡ôæø>·vÞúIÏy}¡Rø}X\€…ûæÓóƒCÃ܈kă±Ã6|{ó phÜÏ>ÎHá!ð‘f.¸7Šfýb¥(E”":ײ,‰ñ!ZË$e¸ˆ‰žØÁÌ‚°L˜ÆÇ28š»ôJE0Fñ(•³ÎæŒ\ÖL„zx…šÉäÎÃ+”Û+´$G̽ƒá†ßÁA&n ïF¬iA¸a=k3ˆP¼ëñ;8ÄŽ@&´†GðÕi›;د[&eçí×&%ù¬ûŸ™¥òïÔƒˆÑ(ïn ¿Sã~,zGõ¢%“ƒ Üß~¬®zÓø¨µ'8S÷ލú0ãU­Á±]µ.aë©uÞ!KÔG†çFàôÚJrÔ{™&¤¤\Ñw9gšÀRYI$±BÙ™ZMð£68‹η"ïÈÐ8|]8 øc‰ °N µFjaYZTÁŒXÐ+@ZxЊ{„ÂFÄ”…Ì¡ bÍ4 ³¬2 ä‡Fë“W<jÝ\O˜€7.†X‚2/²X¬ ¸˜Ú<ùâ±úEèï‚Êa0.Û‹ð¦\v€`bŠ‘=GÄ™g™nÖÛ » «5‘î)bÖÆr¤?¿@Þz©&ë÷ÚÝ)égÅy“‘ÒãM">ƒU{>å‘AæØë(y}-[¼@)‹’¢v­çä)b-h:¹»ìÆ5e-­¨mWDF6¦³Zœ?_ÿ·•1õY7ÝGÃØ¥ð4ì¬õ`Þ®|:iU1f¹iÿž’“Vä¸öy÷Ó½vöÞn´ßG{¥}g:’î);iÅNûøåôô]) å„g3øaœ¡$ŠQ`÷j@dõq&@R"Œ"„¯G¨Á<Î)¢yŒ·Óâ%p-k¦‰Qv —eX2òÊzäÈ@ë Îê¼{°Áa–‚,X@µ2ºO„0b#Á3'ô&E¬Ë:¤±?cU- 3VÅÄ cULyL¯»â3ÖËSrÒŠ÷10VÕîVÊX«I5a¬—§ì¤;í£-k¯zÙ=%'­ÈqWz)Õ½”’ô!)½ìž²“Vì´è¥bÓe˜©gå÷_B,ÇoGÈEŒ†IÆ_ßLr£l8Ôð’A\,ãz]Ü­3hrŸÿ-*æY=|˜Ðõ‹Ð¾oÏúxk!um'Š%]Œôˆ8u!¬7²Ö?+1M±ùn÷_e/L=/ ›/ŒðY{…ˆÝSrÒŠ÷q/;'^4Æï£½BÄ‹î);iÅNûÈ ^BÎ à ɰ*b¸ ƵÜR꘥ dI —Ð?‚aÏBQ&ÂoAÅ6bΉàÏé–­íÄA35!šéâ ™¿q»+>q¸<%'­ÈqqÐLÎÍ|Ô]ñ‰Ãå);iÅNûØ…8hîÉ¢qçà’‰8çÇú—¯ãꈼÂã±Ñot£«© Õœ Ù„ŠJ—§ä¤9îãºÑ圠%!&’J—§ì¤;í£¼‘A+5Ýåßr°ïnñ†¾Í"% ’Ú³$cf ½y²­¤ÌÈ))3jŽ”™Æ'3íBʺ§ä¤9îãJÊŒ˜#e†“>8%eÝSvÒŠö±Ìb®Ï‡—yÆýà\Ð@Þ-–ÁŠ×cö¡›à™ÉRÚø½9Ë¡o1q½ûù{Êà’Kk¸†Y¤&]LìABxa ÿ\QNf=DÄ#,Ä‹b¥]¿dG‰ˆ0§âµ_ŽfÛé“$ê-7qº¦H“½cröé%)wBú•-°ˆÆS|CˆòrÕ,öƒßݳÁÏqäâ¥ThÞ(a¢ eWµðH»“Á˜p) %‹?¨b#ŽiH"êd§9&$"ß1‹Czq‡•=rA¹ì¬WL.r¢é\kðų¤ îl­˜ÛÓR–½ y}¸…ÑðØ‚‹Ü4>Ò´ëðªC+¬î F³w8Ýp‘dËÎhÆ=¢þà©14á ÖœV€à1¦¹ò…¬ÇŽ,ÀG#üßG 8n6w0 ;¢ÅÿÇp4‡½º—ÍC­ªâ¾ŽFxqŽ˜i± î –¨£ðúH a€gÈvÐDdÖx˜,{É—/ñëÀ¼¾ø ˆ-U\ê§¼Õɲ!¹[V”(а/$Ä!©–WVH‹ðœ]œ7äz½F8™§0í²{¡ö°d¬Ï Ã)Ð+2Orõg™Å ‹TŽèÊø_REn&·ÿèSû2"\›³·qJ[ŸÚã|*|Gx®!h#꺻ôÆœ¨ËY]8ÂFÔ aA†Èv—¢ æà^‹'å–Ûy .SŽ‹ná:Ƈ‹ú’dØ#ïðçA[À;Plôïüxx¢e+OX ÁýÀùð”ºÙx¦ø^¹¬ $ži¢xÿàÖð>Å‚a `kß„z‘Bêv_)…ÌL¹ð~Ækû w0­ó @4¡tw¾2Ü+°óöÝöÝa/j>{Qù##Šz µ®=UŒRЍ•Ýôšû#ŸxõRüÁ”ÑÀá„즀]/KPÿ–(ò.<ÔI {¯fžãß)ìuÊq:^élÚ2)¹…W "ŽL©¶¡xoÒþËH=Š2 哽„ô˘,fl€J)sœ3á¸Ì‘˜)·ÃBn.3pSVøQ•crÄ¢vC ùK\Ϧœb֦ذ7¿ÎQúàˆ.ås“2­{żå$ ÄICŽ2ÝRwE9„bBOÊ”ÚZ†ónú´U‹@HÚüxò ”eÒ—Uäò@ômXÓaN—â>Êä¬èQ"/æø™Ûªð#Ãú4îl÷ €NS5Öúœ%²=oºXAA"@S„•³;vïºõ+Z»‰ù*~n˜cŠì®"]ÊöŠ·–£®vª;¾ÉXpW© E,Zûªâe©«©0BèµÁ®¼â^ .µ¿ñ^vsϲ;ŸÚ°¦ß´Û4É}¸öVùøbv‘æíXU,G¯_!µ¥z#ÕÆRò£1ç,ã©[oÂ¥G`³Üúj" y+§æ­WÖ?QD6Űnæ¤×Ý'°‰&¸~ gÅt ÷s“TO:ÃR€êáø’³ëúÂç…¢d"iIQ:Ž:è.k@MÊ)иf‡xFwÊT+I:9B9=((†Õ–=µ*¯¹ã>N!4Î6"GyØïa“D¬jžþ²ä0–tޝ ÔÌRû…Àæ ö·ìN ¢yJî¾U^õ@¤‹SÞœÌU€"N@ý²’ÞÒ%6š·)Í2¡½qî’ :àšRMºË.«=èŒW¸ïi¹î4V·Úû¥k¡¯9l …w$^­‹ðNÉDØŽ˜O tFÕžÚßó—vÁ˜¾,€ûøô9*T!à}pñƒ¯.WõÖgÖNcΪb™î™ïYÔ×s\™n]éyáÆÊ ¨·¼©šy®ÖÌÜéÙ©·³â‡R•îeŸÍõcà;¾Ó£GÃ+^_j’¿Þy‚­õH=¾ò>ëDŠ™¾Cï8©cîCóp’rÜ;nÅbæ>>€oÖuß¹bW¬`xM1`ÜÁx±7e5ðÚ:f8×Ú[´îlm©uź<žé"ãeÁ‹<®¼ÿ>'­=¿?ý¬ù,q endstream endobj 5616 0 obj 4611 endobj 5620 0 obj [367 /XYZ 39.8400000 540.500000 0] endobj 5621 0 obj [367 /XYZ 39.8400000 540.500000 0] endobj 5622 0 obj [367 /XYZ 40.7999999 452.179999 0] endobj 5623 0 obj [367 /XYZ 40.7999999 452.179999 0] endobj 5624 0 obj [367 /XYZ 39.8400000 414.739999 0] endobj 5625 0 obj [367 /XYZ 39.8400000 414.739999 0] endobj 5626 0 obj << /Type /Annot /Subtype /Link /Rect [182.879999 551.060000 212.639999 558.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples >> endobj 5627 0 obj << /Type /Annot /Subtype /Link /Rect [251.039999 387.859999 352.799999 395.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.apple.com/library/mac/documentation/cocoa/conceptual/DisplayWebContent/DisplayWebContent.html) >> >> endobj 5619 0 obj << /Type /Page /Parent 2 0 R /Contents 5628 0 R /Resources 5630 0 R /Annots 5631 0 R /MediaBox [0 0 595 842] >> endobj 5630 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 5631 0 obj [ 5626 0 R 5627 0 R ] endobj 5628 0 obj << /Length 5629 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ÐyË⛂ÏL€6Ã"‡`6›Åb½Èdùû‘ZTO·¨j–(JšnðŒ›M²Èz‹ÅùúÏâß?ýOñâ~~þz¨ÊJWÝŸ¢ýûáünKÁ»_U%¯Û?ÅË÷ÃkñzørøÒüûz`úØÑýhû)ºÿxùýð±›üÐ}òõóßšßþWðâ¯Íÿ~-~üGóã'7^û…ï[ëö—ߺ_gÜ6ÿ9ÿ­müåð÷ŠßìqÜößRªª6z¯§®ìø÷¼+š¬*”ÒÂð‚1ÞÀ©šíøï¿?7£À(kɘÑÒTWÚŒ×ËDÑ~Àjî ê­íÊ¡æ¤*™f "6oi¬’&>3)lk¡~û¹ähæv?¾5ËUŇÖv°MëOÅŸªŠÉ?ß~=Ô¥ª…Q]¼D‹x8¶<}köcéÕÉJe^¥E~B-‡-O°å3ló0ƒó0K€ú1¶À¾%ņ€ÃÑ(+­lyN¹;â)#r¹>#q ¦åH°ó&¯ ¼ aKÌæÎMÜŒ9¼Ü2ɵ7¬s*Œ9ܯC½:°]g”ëRä¶3®Nó9Ú$',K¾?5˜RVÇ)•èj§liëJsuÎ&êØ"KÙíÇtªܲË>:Ó%gvTiÖ1·r®)+ÀícsÔ‡Á–H¸,„»¥ŒÊ;ÑÁX©¤nwòŠ-À eõïƒhxˇ@³j8*¦L[Ã]sjHžÈǤé)B(*öæóø´ëã0iC6‹(w c9ecA[ÎÛ¤K:_Ý´aC| „µÑ¶xDtqm+Ux¬AÑ'h”@ë´@ñ§çaLÒÑ4–‰)m’Zæx}²û/»½œiJp>¹G”ƒì``è½MÂGœÖD¨5¥L”¹ÆxvÓ3b¼€o?T#-…ùšbîbÍæEàÃ8™x}§hØÐ#8#Ûðém%/—åk+ 'ÙùôÏ O8€®àI Ï÷ñ“øÍs€Ÿî›ÐÙ; ‡sîgÞvØ`N?çC¹Ñ«Ï£ö©3 ”(Ø1{)N»}aþõåvyÇÕ52¹jïR «Î?øíðu±k68΢[c'=?œ#X²;È>åodkÓOù8€(åä:ÎÄΧøoÔ㢋U¥6ìB׺Üä1¬< Gu«ó“Θ‚-"ðòfˆKà´7ØáŽãÇÒ3ã\×ó¸HDü9Âúº>^tÌq~ÿ^Z[Ú´? c¶ûTZ—]t£ê?y9hU2VskÙé[òby>Gó}÷ÿªíV zóz8GóIÓç’ö[õÅ(õå¿~˜ë„“íÌÈZôç¼Î»¥tä2”þcæ0@U £2¾®¯!!?Aë ‚æò7=í 5üà9Ç}q"w÷B@ ioÀ²¶.ÞtvlŒ "6â<DD²!N¼õ¨î+F,e¡N3_³.1Ôp&óðv½2w{²¼;Z›Ó”™ÓH‡§¸%Âöb†×»k³Òê#Žp®Ï±H¹l³?£´9>‹æ²!œ‹xÑ1Þ,ájMÚÃ9QÒÇi3Ðz@þ¢)1¥4£/øÓP"yæJž“/ ž0êuŒ=cdF–BànP’c1Ê7ŽùF›gâeÅdCLŸb æõMš™ç?ÃâPáGHèóð‚¥Ió®’œøSN"N‰±jŠ$§` bTxdj1T@ž¹y½Eìk ŠÚÇqã|‚Lu*O’öª$>'œùâ>”“PÂÕBJ6=©t^!+ pæ w_ ¥\n\×iH¼õCtGâöT©á´QU÷ç LZúyiÔ°…ÐCpŠ z}\ ¤žÎ숟©²“Xgó¨^Ïvˆ³>.>9ä|B}p e4¼RÇ0 6¯®ÐE|ÆÖ!œˆçÃÀŒÆ‹G‰L[$øbÆ®×ãtÈ¡âñ¬ü¥³#üÍ‹³ aŸ[qþ)¤ã Y‚ƒŒ¸3UÏqG€#Z|ªæy ¹ðŒø±”˜ÔRÊu¬ë¹š”'°NÐH^ôõ!JÜgúRoÄm¦5s§jXhŸ>(xÀ’+ÁÁ0U_ZB‰…{„5^?éZ^%ßUj5æ0O~ú4>‰MêÜyœGuYø*†ÑcÊEŠøÖç‘ ô·üëĘÃ#´åvAB¡>ÀÜÒë‘\ûfmÌùk$0· \òÐ' "Ïv÷#…ë·„ª]ø°ÃÈ¡(Äqi\Ößp÷â’Ýn„i¬Ýµ†³µ-ïZZ?c‹›7(Š9å9|A›¤Hðô‘zÒuNìö3Ó…>&|j.úc¨ÀuŤ7¸())X1×M<ïX;¿3âš›«‹óî+¥ŠpD\?]ëÂ^D ‘€O=£ÆÐg ×ûI>“y!Ö$Þ¨ËT!"Ä3Ö§0üí12lŸb+”r÷ŸðT%¯%PŸ‚’Áƒë`ࢴÕ!(ëÁûF) KÁ»½ÎB±âíy+J ÊŽмSª—8·P*Åî²þGà!"ü®‰‹e¤@¼;p¥x4N¨7ƒëô(ȵNõ0Èü£T¼óPâ(: È’t!à”²S)£õw‡òЉ®1UaÎÂóà= H—´ ’pšÉÎÃyßkÚ|‚qzL$~¶§MO¾R¤Å" ìAr¨œðhàúÖÄK~–¬O ð3¾‹‚ïnP¸‰ OŠ%µ;74p¬kqÌg”g|1u†T}í¥À3bX»Aî<¿F¨¥‰oOaÍ‹¹;ðânÙ°7²e‹?<Ö[¼{d!^xo¾…ª8öÈ-ØÒƈ(iR¤%AVå’!s›8 ‘3ɪ-Ëëõ%RZtÓ{é-ã]xiô$<÷XêiÀ+]ߞĚ…@Ë7dÍáw)Õà.mÝmÄ–e­rk‰-ÛÞ¹´Ä†­r NsYòëk°-So@»Rêð$Íüap¯IÙp4¼¿Y³eœRÞ0ÆÑÛw¶;ðj7,É×—Êé^Oš¶d““ððˆé’ ß)\»eJÚ§M °Ç@°ðz8”\’Ð2ÉMq}2FœÔéN…ïQª Ô„HƒÄˆõ3>Å¥DAÙX8¿áÝE™‰[Ž/’Ös×z$­GÚë›9¡ìŽ€˜£ÐÁ{“½ALUIýCÒ+¾”HåE^JNŽÂcÍû´&rÙºÛˆ+Å÷`·¾³8Ìú¯Xß½ô-x鑆MBXÃcFHë5fÕ¼¯s;ùĔۤ;™”»Ÿ™îºàÛ$,ÀS†Ä÷lq|Ï÷X¼ ‚ïo`¨ gdm+Ë6 [;%B¿OžKœŒ©÷ŽŸÄøÉm×zN~g…%1> ÆóP|ŒÇ¤µZ¾y¦ûe'éý2ÊzÒf_d‹=* Ptuàu/J•½yŠæÌC9¿ Ôì `ßµ¤T›!h–IÌå‘ÞvNÞåýÎSòÁ(A¦Q²$\n!ajñ ÈA,k°tÀ8¥HÈ ïŽÄëÙ¥Ö œ„%åS¼o9㈦š“…v—ëÁÓ< u¦;O¹~;8 DÝÖ‡:Wþ9ö«)tMч„Ûõ“JÈY¸ê"VyÔz(Ñ !TéÁ£­~Ó‘T ÷+ d†àѧµi¡¾ûÕ!&e—eòÇ6bçÉY9#„˜W ¾ˆ©óf®{y˜ÊÓÖð¢h× ßMÄöä>kŸ­ïó¯Ï%‘\zN¦Ë½âsj;mýúbï­ŠØN%ñ†5ئoì’ƒ7¢ êz÷7tû.“TÝç9éÒ2;ƒ.÷¹¿÷7H‚Ôw¿ûY)qÝ%Åo#óß 3¹ó$ëãÄ»H©2u¯”½«ŸRìSráõΊv)¹ïÿ½3«Dæ”Ä&{- Ë{-{- ý¾å¨L®W×¶œ)“«š(–ø»äí-×PÙ§ÏÅïMËÜNÕ“€·J¡ë›ÙýWWiþ¯ùÞ˜æíÜ—ï{Þwª7GàKÐvô!¬.X³ŒBÔL—Ç·î qJÁvIDZ—ÚŽ,»ñ„7¥±Œ+ßµ3#-]j%¯3½µt$¥T©«#ÞZ œÇÂ>5ìÓ‰0ÃKÞ8(ü¼Ï­c¸óOáw;2·#+|F}œškahŒú8ŒÅ¬ÝÁvd€T×þÎ;œãÓ¦Lz)ØÀ¸u*sl´GÄ ;íµ•.™aÖ\"£#™}:—· emñåðõ†&ú endstream endobj 5629 0 obj 3911 endobj 5633 0 obj [368 /XYZ 40.7999999 295.699999 0] endobj 5634 0 obj [368 /XYZ 39.8400000 702.740000 0] endobj 5635 0 obj [368 /XYZ 39.8400000 702.740000 0] endobj 5636 0 obj [368 /XYZ 40.7999999 295.699999 0] endobj 5637 0 obj << /Type /Annot /Subtype /Link /Rect [225.119999 675.860000 288.479999 683.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.gnome.org/gtk2/) >> >> endobj 5638 0 obj << /Type /Annot /Subtype /Link /Rect [323.039999 675.860000 362.399999 683.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.gnome.org/gtk-tutorial) >> >> endobj 5639 0 obj << /Type /Annot /Subtype /Link /Rect [444.959999 675.860000 537.120000 683.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://webkitgtk.org/reference/webkitgtk/stable/index.html) >> >> endobj 5640 0 obj << /Type /Annot /Subtype /Link /Rect [261.600000 268.819999 294.240000 276.500000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit/wiki) >> >> endobj 5641 0 obj << /Type /Annot /Subtype /Link /Rect [263.519999 242.899999 286.560000 250.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/nw-gyp) >> >> endobj 5642 0 obj << /Type /Annot /Subtype /Link /Rect [422.879999 129.619999 449.759999 137.299999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/rogerwang/node-webkit/wiki/Manifest-format) >> >> endobj 5632 0 obj << /Type /Page /Parent 2 0 R /Contents 5643 0 R /Resources 5645 0 R /Annots 5646 0 R /MediaBox [0 0 595 842] >> endobj 5645 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5646 0 obj [ 5637 0 R 5638 0 R 5639 0 R 5640 0 R 5641 0 R 5642 0 R ] endobj 5643 0 obj << /Length 5644 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`4|J,0Ó9ht9,rf³,véì!?’E»mR%–(Šîö 0ÝcYd½«XU$?ÿåùŸû_þؾ{þÏþ›ýy÷¼c«Ùðgßÿýtþ0•ïѕhû?ûoßw¯û×ÝÓî©û÷uÇëËöG÷ð8Å0àß~ß}&ß Ÿ<ßý­ûí{±ÿk÷¿_÷?þ£ûñ“¯ÿÂ÷iëþ—߆_¸àÂtÿ9ÿ­øïÝßÿ´ÿ½ÁÆíÿý¤T-9S‹àx=½ÊÏ_E“±½Ö1fϹèàÔ9þû¯ÝÏÝh'0ªVqÞÔªa³GmD?¬Ðrß6uǃÆÔÃmÞP|á@†É6É@ˆø2ÔºMx(*é ¯Í@z!–Rì8ÔbÒ“†ôˆø2Ô,éCQIß²†hꥤjé@¢C0É@=D|j–ô¡È¤—l0Ñý\ˆèq¨ÅÓ¼I3P_†Ú‘ôÞPOIœ‘xsF¯¿¾ì>?r%Mï{_~î 98ðáÇK‡®Þê¬b+øþå§ýŸãê‡ý˯»¶ê oôàñ§ž¨&å;¬†£Á'¿sçiãç À1e‚lÒ@ÃÑî@¨1u†Sç>ù5Ç’ˆßøhøŽ€°drŽ ød ÛÃKg5V·jš[iŸ`  >¾˜÷ŠðNÉòÐ3hŠÆ‡Ç[È€6ÁÑÒÊ{oº¡N”à«Ù—xÙÁ:€ zWН¶ïäñFº]âY v2'9ÎzŸmVÃú§ƒý†ÜÇVˬ­à€j@ Cä"x7o:P;°(õöÁä7¼Ag|£ug$‹JË$gUÝpÓ={ó¦:ýZ@¿.€ëéǹr—EM­k¡ÏIã¢8X¾¦b ÚÖ•†_ xçÎ%Ø€¼:ÒË êJÈÄÒvÐ)ðãð« cèD`îÂh¥{ŒÒžTc 9MLaÄÐE3þAăû®;ºõÙfÌÞ¼ílêùóz2GÌø$Bn|=!bÎ+­ê «„M„èÆNré`Ïí÷_|ž¡ä†’sÇR®M OY¼$Wò2a!cò˜‰“¸Ëý[ϤtÕSýûN+yþÁo»çÕ2¦HpzÁ‰ÐOo=Ú,pþ»[1ÎC-­¹Ê«¥ˆð>ó]5æîdä1­>=õ.Ô§n›­Õ§á’£Jº"ìÑ H)am@‰sH™¬A8“BØYFÊaPl,e×'¦5!;liGÏN5xÒNQœ !d]qô@ñ{iaÛ~W:^ë¼·ý÷‚°pC }–D¼fÀQ1ŽÓB˜‡€Ou +Rp}&£§Õ,8Ž5ë¥îB˜ËA v."ªVuSŒ?Üþ|¼eu.P²¶7;X´Äù€À<ŠfªS,þæš•+ZÈÑâÁ̱æFñ`·Úv ÕÛ[m;8ÚÍ#góÈÛ{‰|5¶!›Û7 õuêv¶ Âæk«2¢ÍNG÷䊰¯Æ´"¬«ò¿¹ß-Ú¢$õ® ¹Ò˜ Z.’7*8¦.Yƒ±ÿ¸RX†—PK:jn^‚æ%®sWÄ™aÂÞ¦ÀšØrêL-èÌuò~ûn·’{-ßoJÚ½w_´µ+#v0KúI±CÁ§EçŠp,„ûÛð¹å%WTß›„Ýmºùéþ¸Ë gô”QLë¢%ïÌxgÞãS†o«ÙŒHþ㬋1Ô„ ˜ÂHéE§dçð<jAÐÚý—œ÷¦àSr”EÁç:½DÑk0ŠTA ¡xŒ÷fGa´´1¶;Ù¡DÛ„µ"é¦=,רËର¤œ$@¸1 ßW…ŸOò%»ßÛJ˜$ÿð`„]½%G eÈ¿^²û¢ô=Íu»¤×&ížæÀ]ˆioqMº?9q×#žǧXë¹—Ä;—±Å¦ô(Qîi$`zÛs‚í=î9oø¢3€nýÚeï Êu?8î|¦ô¬ãÕÞ{Û¥Dð»88ϲÇ´N¼åI¦½°‰O%ÎuÆ7E1løÌ†ÂkE^ÒVúÚ¦i§qÈv®´pÓÕ çN犳íÎ{`Ø*âúÄ'±R"ž© {­5lÑ)k¹NJÜüLß2<ˆQ‹²c”î!\Ÿ!xuŠå˜'9)_÷ÔËûT³vS¶cSŠú0e+NÉ“ø³áÏqjô„oj´û$í;-zÇ2›Ëj¸ÜÏStS)á<±†täÉÛ1U.¶%­®äá‚3ßiéJ¸·#Ú¢gÕðàìÉã¦+2žkíp^Ü!ÚFÉ ð«æcô€”bWi9òæ½Ñ0¯Ž4•ô.¡„RiË)cR‰¥âóvƒ¥ [@/ ><Àw ÆØÀyjLƒ€þiušcü™¢èú7L¶§=8øªTÿ‚7ïú6å~ƒrß¡wI¾:¸h_rŠAÂNÒ$pQáÎ[ÿZº»Tpî¼ÖŽ”ÖIïååß¾µ¢rІ;tÿð·`Ÿ}5âöSˆŸx\MŸSeݺL1o’[Þ·˜–s?-–™$>Å¥ÖäÀ›\¿®LãÈ ÅÄܶîi™w¯mÄИSæRËàUà=øK{¸Öõù[ÜÞƒàxÃ\·í1±ÁðÅòX¡ÞÞÁwSÜÉ|÷…¢Í•#Ö8„ÎéàêÄd7ÜŠrÇåÐCI—…YøbÄF|ùà¨1®áY%î»Æ5Þš1¢–Ùñ FÖ<à<†HHÜù£’M7ä]t'ýüÈ:"6]{Itôúi]3­e{sŸgô¨Y=e>½;BŸ•ˆ·fÅž¿|òuË,%·@qþú×[ôÛø}˜IF#ÜÀÊ^4?bU Z•ïJoñGð´¾}Ãa8O"F°§IrfXРÓädAj{‰£J“·Ìšœ­²#8öJyà‰§Ñ ÈÍêrHl´Œû’d8³;µt@ÿر—.+=AC¹šƒÁ¶+¡lE¤Œç[,’!^P Á¤°EôY¾o~hEI$ M`×&9@É”+ÈøÆ^ÜÙ—¬;& ¤k€fÄé”xf~(™6ñÝ_„¢E䞢sÐg=,V"ts¾Š¨‡ ³M!«õœƒWÚ„±m%«dºNÁ_Ú9Ýh¸ÒÔAx°9Všd{þÁ&•¦!rbdª4µL£´í£cÙ®ˆ,.¡(å—qžo•%,%˜_è@ÆÑóÍ®U Tð¦ÍÛ|ƒ»(­°Êb0b% fŸ×B@I {öÂÜ¥’@/ˆç„¹7BöÂ:®mê-gÇÕ¸¼—öм¡É‘¶|>£¼±%ôÝ&Éu‘”Æ{”¾œZ ¬Îgq×áÛ0VM^¯\<‘c€®ÀR¯j•Cõ{‹3îœP |=™¯ËXcýT*è°:ûà T©ù5Ó• Dø«•ÑÜ]V˜§hvMÁÃ$ÛVî1Ñ®*ßö=œ˜²f{fíší oÉÂB”A¼ Žm뺉„u˜MÊÌFH—mö<Us9f…³¸«›#Š•u–‡°XÝãy@SÙbµ1ìüƒ-ŠÕ=£‘ά¾I¯1‹ÒNa^èᦪ‚”Ñ=’gý(8v‰5¢ÿ%¢9‰² Œ²¶Æš¬ñ"àíÉc.eðVi\¹Ò{Z‡“¦Î8’³J-OÕ7™Cú޳ÖK®¡ \¬ˆ9œô‚ŽÀÌiñ)¿j…Ì)Ù‹jlg:3—Œ]u‡B¹Ò·¨Îàöˆ”C†)…g²Šçþ¨û»íØÒ‘ü°f~|ûµ9[Û<Y|uúDÉzÏ;4ÆòÖ-¯«a(OÍaV-꺪Çk!­ªÀ²A4U3žÇlFž ¡ª”•hGÛ;µ®ê!Àu•ylßiá;ƒx4¢ìp¢+lc£ ýù'÷ð»¶O~ÃGôŽÍÒ=Ỉ{Çr,w ÛAH]ÿ»Ðü´Y^Ãù0O±`ÙÁr¥— Ì[Û+;6Ú=Ò…+ã­1¬®xrè%“1[0“ù…½Mhk÷O»ÿ°˜B endstream endobj 5644 0 obj 3792 endobj 5648 0 obj [369 /XYZ 40.7999999 349.459999 0] endobj 5649 0 obj [369 /XYZ 32.1599999 393.619999 0] endobj 5650 0 obj [369 /XYZ 33.1199999 391.699999 0] endobj 5651 0 obj [369 /XYZ 40.7999999 349.459999 0] endobj 5647 0 obj << /Type /Page /Parent 2 0 R /Contents 5652 0 R /Resources 5654 0 R /Annots 5655 0 R /MediaBox [0 0 595 842] >> endobj 5654 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5655 0 obj [ ] endobj 5652 0 obj << /Length 5653 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e¾@°Àz<C€È!È!ðî&XÄ‹Lö¿u‹êiSú(±HÑÝvÛ€§=lQÅz’ůȷúøîŸ¿wo>þ§û~>|<°ž6þéŽß\þB¸^Šñ£uºþø§ûôùðÒ½žOÿ/nN†CãôбÃß?ývx;¾ü0þæãÃ_†OÿëD÷çá¿vûûðã§Ðßñ ŸΛㇸà ÿ¹ütlü×á¯è~Hp§~ÿ¾QÊj!E/çGùéïå£èe¬ÓÚ+¦:ÎÅ@§Øñߟ¿ ½Éè½âÜeÙæ^­8v+™ï¼5~ÆÎƶ­+^Ú‘æ¶NGGŠxÙÐ8S6Ý™õfè‰õN—tꪘcι:)âeC›X»"³Þ{YKë§® 9f˜`¼ëUÒzÜUïLø?oy‘;\ëÁµ Rµ$l˜tÁ‡ØbÁœ»*íHëJ)âeC%œêŠÌz3ÅÏJjê„ì¯â×FŠxÙÐ&Öã®#Vi6>o§Øivú |…cŸz*f¢g¦NGGŠxÑÈ&aÄ==U™ú‰×©ßKâÁwχ·¸’î8Ó}þe ä4]<ƒÕÝ›ã»îù§îŒqõC÷üëÁ÷ÃÄÄêq~½G‹úµ0[8ly[ Âx˜€-¨E@ª9¤Z>žZŸ=Ú]+¤½­€a¾Ç¤u¬®¾ˆ÷°Eæ·4Õ m®G+ ´°a}a„÷`Mª«/J“õ¥V ?é–ïRêUõ·zðJÅN¯Ôj ¯rRKk´úRX£³r±fÙžˆ²/·ŒHר›B_Æ ^Æÿ@ÁŽòâÂF£¼V¯äùXNãu/…ã_ˆ4Ä,—xË÷:Z‘êÕøÈ… }ˆ»‰ŸQ$ |M %Ãt=â7ôfX—Ô%Éš ýv"¦@Û8rày.žº½-@ ¾l»¾SÇïÇizÁ]Ä ’°ECÂöŸIP‡1w+kÞþõ«bTPÎ{­Ì±ß ”ˆÇˆm!ö- tÆaLZè1ëÂA76sRsÄ£Éy/v¬¸“86ó‰GŽùºÊ„6ÎæÛ9Ÿ?¹PàÑÑq1u»Eµ F‘°‚í½Î= ð5ü]ƒ9M \[8râ<§#¬xóÀ»Ïܸ8¥®‰Í9S"a¶gŽ.͆xÃqå(¼JÌÁ eà¢#Á3¨ŒJ€XeP«AZ[—4©ØðV|É»¼˜=0Ã;Z³wÑ Û_˜c*vuA)7Nl׎I”Úc8}Ÿ NÀé<iK…B›ã S ñ”m²f8s,[DUDå*§onŸg1ð ÷¦ê¥<Ÿ@ñ´”ƒñA$8·UU/o@ÇÚHØÚu ²p ü5%§G0OK±ò¦Dã(‡ÂbTÝÁª>[·¥2©wê" šQ}åH+ÍõMÛ&i?¶$«ysRû1Õ-õEž/ÆÄ±¥Í•™1nýÊÌ} ȯxÍ–s@Æi7”dåö›æ 2,›Rô»Ü±·~v\N¹ ÉE:M`Fº^‘a:> ciÓÊs3žbÝI6í¿‡ cz³ ¼êgÎcT]a{ï Œb³ -£+’²>ª. µº7£¯‹}ÒÒ{|ÆÃgFÕµ¢LòË‚¾`> >> endobj 5660 0 obj << /Type /Annot /Subtype /Link /Rect [253.919999 609.620000 288.480000 617.299999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://browserify.org) >> >> endobj 5656 0 obj << /Type /Page /Parent 2 0 R /Contents 5661 0 R /Resources 5663 0 R /Annots 5664 0 R /MediaBox [0 0 595 842] >> endobj 5663 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5664 0 obj [ 5659 0 R 5660 0 R ] endobj 5661 0 obj << /Length 5662 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9ÀÊâ[‚öŒ'@ ‡E7›`±^d²‡üýH-µ¦‡ÔG‰%’’Úmžq³ùª7‹Åªþòâ_¿¾ü§ø:ü|ørªÊJWýŸ¢ûûÃõ¼.ï5µ*yÓý)¾~;½¯§çÓsûïë‰ésÇáGÛx™¢ð÷¯¿>ô“ŸúO¾<üµýí/þÒþï—âÇ¿·?~Æë¾ðíT7ºûå×þƯÛÿ\ÿÖ5þûô·?¿µK¨Ïãvÿþ em„^·Ž×±+;ÿ½îŠ&« ¥«†·KdÝ?ªÇÿyú¹m\FÙHÆŒ–¦Z<ªáça•,£ .3¨³·eC±•µ›¬¢ t^[·5Vµ½½CQAÏDÍÏÛÔÒÅg Ä.C­…¯¸‰ƒÃnElÝÖÐ{†¢‚ž3ÝoS±b—¡VƒÞˆ&Î@݊غ­  w‡zŽ"ù›D|õtüôrúðÔtÒÿåçvgÒÿxùv’í:¾²xù©øcÕ®øOÅË/§º¬›JsuÖ9}KõùÜ¢Z…S³÷-ºï3~ÀØùÆK)Œª®¿úpn‘o_åçLÙ®a櫲Ÿ†—õù‹×_5ÖÜÙTp^Ù·ÈËÚ¯¦©Ï-ºä¬~ßG56Ë7Ì{ÑÎ.MÁçà—„y;H±A§áNßåd‚¿*¤=*Þ'žÏY¤Š¨Àâ{žb¥’º›ÈCìÕbºqù™÷3ÎB<°Âl1»D [ðÇ@·˜ (dñÏ/­žX'õ™5üFõ‚¿6ïWÚ”ÊÙ?laöi`Ë#l°åly€-œ°jاbp4>îà kó¬ †£áŒ9ˆ<† ¬à3§B0Üœ‡cJÄ«ž[ANg­š˜‡<Ü·gq©¯€"7žbr-§H”ýSßoBˆÊp®?¦ÊN1¶ kcXÖÀUSèÍCñXªâÑð~ɘÞÖ,MF©*å,ä)ö'è@ _O œÇc;@œloYáµy`e –O,xV ¹ÉÃéˆz,8“‘g´Èl‰` WÛKyGË*­jžòYA<‡2–c[¶äÄ «XfœPä7'Ç´8Æh´ì¡`\\ yO ¾ÄÑøÎ__ç¹j÷ÄyÌ`\RÏ®(­ b²±|I•Þyûñ{x¸äF¸ö¹Öwˆ) z`E Á 5§˜4IpT"®µÃŠ<‹ÇÀªíA–»„…`àOÓØJ)è³ß Žq·Áâ!ï¹~ÁNƒÕ/=ûì¿1ý %\laòÆ£(AB€ËØó¡Œ"u9¦„]Ù"À3:–0˜?àh.)¦C¨$gHDh„ r&5„¬‚¬±¢ UD-„ma:ƒ‘¹.Ï;*;êŽÄVÌwrlôM:@g†Ë™P_‚®†¨ò©ðÝOÓâ~žRÓ¯áöº?/V„ââ90ZYÇÞþ„êRö^{÷"É {¼Ö@€õð™:^cŽ¢( ‡é–ÛeÜ&ÓÁÝá3qÒDÃãðÇTÅ0¢¨9gÑpáFþ‚¥LÈ» ,C(fßr˜¬9¦Š'¤r☖…ÿRžý¸²$#Å/·Æþ¦X¡Î óbÈ%¯å”›zþÉVˆ´u€à·8Ýâñ“€tZϨ–Ìb Ïýõ\ìY¬[ýV'·žªÚIOà<bC`Y\Ì£mÞ¨‚Ïþú2Àßà väÜr¿p€k>÷¼8N>h è+„í «ÏpZ«päzü£5×:¶·kÁ±#¶;êîÌyøÏ–!Œ-GÊÂ>¤\a˜H ñ±¥²è·s3Ãt»:oJ—uw•Õõ¿ž¾dO±Ð-Á‚´#]œ»šë–Žò›½]ñ,8X›3|/Ç—ïÊóÚð„œ\±µÊ‰£·v§Ê#ŠãMg—&ç=;ó(8wHð8#TÃÜr;CñÛÁæøU’o-~»%¼Ç×¼Äc‘¬‡!ÖLZß’ÇO—çΤ™T”ýÑOðË“J6FUýA-Õå¤g”݇…÷Á+½§úô¸c¢4Ö•»·/HGó Ü”ÂVÍ,W`£Ðã ¥ Øž4W™ Ï5Q5OcZ÷DžÐÇÚX$ày˜ŒŸzž¸§wÖñáô¶·¾ð­±‰ìTʽ^”»GBLŠ §_æAZNÆæ´á`ôxËÃi0”8}ÀðåîìmoÛÀXÁ9W ?\#$T¡ÈÆ ÐoØBèG½¥H‹Ju1° )ŸåU[rTªZڨ̗+ŽI¦Vú # ìe_^±öâ4Új¶Æ”®x˜þ)/S±ÈôЋÌ%æ©gÇt…3à—ü;¡EÃ×@žÒBy•Ÿ x î·ä|«Û™tœˆÇ|+Ul õrS2‘’ìB¦…ógÜ¥Æx³‚ƾ©Æñ ¶ä”jJÖ+p’Uªi³†zpf#(‡âZˆ¤\É„¬n‘ó$å¤ÅZ¯¡EBô¥'ŽËÌ$ï1?ã>”̨”ýPòŸR²<Ò_’•.õ˜ʤœë1Õ<ÅmǸ›°0®£pêŽï÷|W·µaÍì(ö )0Å~Éx;lÄ/ðAí]Œ{ì Â;Å<Œ-Ç]hA£Ì,Ÿl/ï²rƒYå‡Þ±~¼5_¯çŒGÑ÷”>{–"½·âÞ9¬OÆ›CÓÜ=LJçô»ç8«UP³»G÷ða¼±ö°›CKBÄ yÈ|˜ H³'>ž&àÚ¨ hZŠä}ͨEy´ÌU‚ÛbÒ•›TÞâ†^Ï=$~”:Ž´‰› K ,epÖÌ+Ô™%Ÿ6?íÿí@ÒLc6®J—¼nŒjl³«V·ð]@~d §.M@›¸X“Ò¶XMñ¼>!’u#g­@ˆŸ•±Ü€ó¤8]~’=äxÙ«¢)éT[XQ"6¤J¥jäòB!E‚fó:K W4_ŽÎ)WòÌò a;©øA(c.šø(ÙAá!_ÛªÀ#pÕ…ùòçËÍеè)êH¨8ïÖŸ,žWær{(B&˜•͸^³‚W‘˜ë±wˆb6;%r{Œ (wQÏ4!§¬…~sK|%¹5F¡ÞŒUš8¯Fþ¤¼iÃÞE{ mfœmÚ³‚º'h?”,“¯,)<‹IyS$q4(Ž´†UFp<5i§Û„µ1œ£&j8å%·g4¼ŸCr#¦·}Ämó1;†¼'òø¥%~·€9#ê› Êh®Kÿ”XÖà‚>ôà{¤p+t<>1ür‚0š'“A´3ßÞ³÷e³xvœb½Sg`Kd{üdÕMc®Æ\ô¿›·BwÎäŒ=c.+ÏŒù·×Ûç–¸ó M›l¹œ<#ÆÌjqÏ@)5s¥î…Ç’†’”R³Ê»rÊ~¢ÖYqfˆtÚ£d ÎE”\1é­°L‹J‰žy0 0~âF]RäÁœ? ¼UcÌM&…’™d!d’ƒ»¶vqÆ6¨C=µ¬vá%c®Ó\KÒ ;¦Ø]Ûš7H±ȓٯ±EÉ K°Œv`å* ³ÒéýÎÿƒåF†— x†o”sbªÁÂÝÍûýÙ×þ-^[„µÈè¾0üøú̓AõÕꟽÈ÷v¥šZ¬ÝÆTDbÃtÿ°¹cò«ÐZ—z:ž¨‘eÐÜ”fú¡Œ™héE·%o&ßw*Uê>úÈ&©©yjا}zÁixÉ+Ñ5½µ|‚£õÌ|ýÉ#üîæ5±Ã'Ôg`Û©†ö1Äj…õ0²÷amgXAuÝï\±1°‚óaœB:`˜v  G‘ Šœ¢nu¶9Üá 7…L!Q°Pו.™9gïºFf¾!sªåêósL©X<Ÿþ4ññZ endstream endobj 5662 0 obj 3541 endobj 5666 0 obj [371 /XYZ 33.1199999 96.9800000 0] endobj 5667 0 obj [371 /XYZ 32.1599999 98.8999999 0] endobj 5668 0 obj << /Type /Annot /Subtype /Link /Rect [374.879999 108.499999 483.360000 116.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain) >> >> endobj 5665 0 obj << /Type /Page /Parent 2 0 R /Contents 5669 0 R /Resources 5671 0 R /Annots 5672 0 R /MediaBox [0 0 595 842] >> endobj 5671 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5672 0 obj [ 5668 0 R ] endobj 5669 0 obj << /Length 5670 0 R /Filter /FlateDecode >> stream xœí]ˎܸÝ×WhÀ²øEÁvÛ ‹n ‹A'3Á`ï‹äû¿<ÿ³øåâýÃóŠ/öçÃó©*+UõŠîï»ñ/¸.ï?6º.¹éþ_¾ž^‹×ÓÓé©ý÷õÄÔùEû£}8tÑ7øÇ—ßOïûÎOýožþÖ~ú_Á‹¿¶ÿûµøñíŸl{ݾž´Q݇ßúŒ3®ÛÿŒ?uÿ}úûŸŠßÛ!ès»Ý¿ï¤4Fj5Ž×Ë«ìüwü*ê¬*jÅ¥Pc¼gÝ’ã¿ÿ:ýܶvFi$c’MµºÕ†wÍ2Õ¦QEݧQgnëšb± 5¤i¨‹›«dãoªÔíˆe] ?LÝTç©e¢©h›Š¥¢hjˆ¯¦“Ψ© ìÀMµd·àç5énæ¦j•©í²UcÛÍSDàWDxõ¼øñåôþ‘I¡;|ù¹ðEû/-Uëâ]‡ -^~*þÜBiýCñòëÉ”µi¹ÖÃîÒ&á;ŸÑnŸ0ûÑ„'¸üÎ >æßðOkᣘ§¸LkÜžiõH–Ï/­þm®M­:/ÉrÕ@ù‡<ÁÜâœÀaøð“ŠuÕÄP‘ ©*r(q;¡"WËHxsYä98\uvB_YÇÐ7“”Ê}ÐJ‹M¬ >ൠ®!ž'¹,ÜÚÇ”VFb›ÊeÅÂçàÎä\ÉUÅ#Ö Š¥ä¡/¶”°vãÕ?£Þ·®o áì(¯ÇM*ó”±ížrBÚ°DÅÚÄPñІ½ðÑ þI☠ÅÊÀOðª 5ÈÓnbƒQZõ‡Ö¸5üûDÁÂÔ!h:Eª°ìxfJ±P ~Kb´ƒ˜æ¡–QÚY«6 >5L-k¦"AÆn/ÿ·]3 `Hk6Ò\ºìÉÁªR5L·Ã™’PO-ß/ú5F–²Ÿ˜cEè)ëFïöº"¯¿¨1îôÛËSVQTÉÏ“sufîg$~UM§eÉɇQ¯y‚GâPmÚŸg~Î,Ö3Çy7`ˆQýB–{¸Õkm] ®¯×Ñ3NÃbÚ*qtˆãÀ‘(‡å­CéP!»PÌM>qG¹DÑ]š<#Á Í£:i`ìaó…¡a“•Á¦æXæÈ(ED¦Ø4ce-Õ7+QÚeż³ÎAŽ1CW~Îgoi>D·9ÎO&µ¨qŒ”â!àL•Ñ«Örˆ¸Ö„ÈyÚ¬µ‡[8ëG¨…ðø%О¥äÀÓæ”(Q»׃`¿ûf„`AByóDã`|W/fйMÑŸ´5Xâ))žÏ]j#–·}Ä7µb‹ë‰,PÖ&‚fPb9£0Z_°oÏëÙÍ#7iצûD¼ÎÜž?Y‘Ç ²yèT4l¨BÜ3òluì>O}ÁÍíå·†I{æ\N´jû>Ð*žŠõ­Ú3Záu˜äÙ&­ˆ9ЊfAÝžsYѪ©gw Õ"¼´òì¤J‹™ê vmq@#í`ØCHTì’Ñ8°‚NEq JØž±b×ëý[ÄŠúˆ' â¥€‚·zìoJír®QÃdÕ =D=íÎÜ,½²*&JxìoŽ ¸Êƒ×óÔzã@­=PÈ‹8§†gJ@;<‚¬(t9íþ@¡Ô(„m;ŠeE¢!•ëtaŠ¥H¹ƒŒ2 BRlȴܦd<Ó¢*¥‚8ê›;¯7LØ™; QVLì1'Χ岬°‹½ì¤7E‘¬ò\Î2`ì¤ø«»ÈfŒnh9P( eÒ¦Q2Z/”JOBDW`fÅF/òþÀä¸Að¡<;†°üSª)y±Ÿòáao %rNÙŸ“¹®w™åÊÒ%•KOF‡¤:㉖`m"ø]‚ôDÎÓ"JÒº—í2Æ’’Æá÷áÅ]ï?;0-¦ú#BŸ“Û{ŽÐc¯ô~#ô*}£j&)—„}b”ó%ë%c•áT‚´Ù³•H1ûÛEEs9>ÌÅÜn½ÃáÜœ9wÝÜcªq£Ëï>w/ä«n6üǽx7 äµQµúöÝæ®eí9Ïäpoáµ5‰ÝÓV—ÚT“~ðM˜øÆF|æô~<Ïí‹SZpç*½mnR¤\DpdÀ¥’‹WÆ\Dë¶ŽßÅWÆðSAB;cÅŠw@æxœ!tŒ‘ìŒì³ \YÈö91µ×ï5ùn°& ¿ʹMtènœŸ¸Dvˆ¾¤‚£¥×+fõªºêU§gí¨ËŽ‚WmÆ¿øíôì1k¶rìÍDe—Ë{7ÚÑw×F}ºRt]p9›M¶5…f¸P‚Ù­Á|ʘÑoìÜÔõ+ÒùŠ™|åR9éò¬ç&3¥Ñg_›µû»E)zÊO!L•6¾5j­×ñnk³<[Þ+úÁïØœÂܘešmÌ‘‰1<ßpVª­Ý˜1—ûµSÆGÑÉG¤hOd$%“v³o³ws‹Û(™Ï ÄÖv€¿áÁ8J\u}% )£›t`€5"y…›Øâ°Â °ûòõ]³²Û+$í¡µT›‡¯¤bà÷±£ó1ùÍMŠ—ö„`[æ({Tén€O”ÄAvt‘xZ̸+ßúÊž?u}xi£Å9`ˆ£…ì‰ ˆ€¥(BY!â8…ë°`²<Ìâ´ÖjŠÓo{Íûn|†³Ð´‹×V:˜:3Üþøò5(|3Š =y%Íûêr> endobj 5678 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5679 0 obj [ ] endobj 5676 0 obj << /Length 5677 0 R /Filter /FlateDecode >> stream xœí]Koã6¾ûWè\`ñME¼\ ‡Áè¡è¡Èv[,šEÓ=ôïW¶äGD”9¢hÙfÄŽG¤†óæÌP¾ùñãïşߊ›ûÿ/ÝëýÇEUVºjŠÕï‡ý¸-oß«J^¯~Š—×Å[ñ¶xZ<5ßL¯v/ ps‹vÂo/_7íÍí'ïnÞýWðâ§æ¿/ů¿5/ŸºùV¼.l­Woþnß0θmþÙ·þµøå»âkƒ‚]Ï»úûA*ÆtƒË<Þ¶CÙúw(ºYU(-jÅ Æxƒ§j>ý÷Åçf¶-e-3ZšêèY o¦•¬¡mtÁl¥œYÅ9×ȉT]É(­1b#ׯ*iÏõE<øN<Þ<ïž7Ëz¥ ÏŸ<ÖúÔ¾<¿.dóÏJFtýT|ß(•ú¡xþ²¥Fu ØAÌbwHx)_CLYÕ-hy\CT£Â–qµauzx©gú¨(Uv Ñ%göýv·†<>7¬Ç[°úc¸^1F6üØÜòa}˺T;ËØB¸FŽe²4ª?F†a·pLÆTl aU©4Oö;8ÛÃî[)eÇ‘Ý YBÄšµŒg¢4ý1köWºŒ%,~-–•äÝ-ÅF$Œn±Ù1ÞÑb¬-Måö±„ú'éHi¸«[%Ê ™ki°Õè“€uòÌ7×î.Õý…:Tý ¼ïñLñlLÏã'Á vÈHYއž˜1‘ÃÂ:ÜÇÒp&…J.*ÓÓòN cäèA8„t‹84¦F¦ál A„ ÇšÁ1žõ, X[ÂzóÇàûÀ17ÌÌÓ Â!óÞg‚È„SYÕ×¥»¾ú;öບÿᘂùv-/% †>5$Dp1“1!‰'2ôÇ·aòø±«Á›! C±$9+ŸÎ!³Ž÷ò¬dÐ7{è“Â[Ñ7 :ì¤6Á‚Ç`ã !G8¹@ÔœõbL† 39Óc3'‘â°G™V4k׳AaârÝ¢¹ÙNk Þv¦`²2=)æGÜfî".S¢GÝáØP´«g¬TR¯ Ž:B"ÀI|½'W7ð—C¾:NàGID 1¦÷ø G(iþýÈçᬓ ‹š(—[£‰s&uÝÓe w›ƒ­Þ+Ãìƒg‡?d§ôyF÷^_ÞP@³'‘JH°=Æ€PòŠiKÒ.lLÆ1ofc8¸a9 ˆüצµ[†ÉÞÄqAëñ`0K›j¥í{Ÿaz‹"I×Ýc ÈíMŸùq|p”’•SMóŒc“Çd©° 0@ù;«Rò%Cî0ÁfÝ¡}ÚF‰WH\ž2‹ë©6¸JC¨Ÿ»"êâñûã®AÄ–¶®Þw*à†%%D%NËBäÞ!Ê.m8Ðñ¥c¯|¸ï¡//'ðJBèžÝ è±»{>ÞÐ:‹Ž›˜‰âº 1ÍÅPòZÎ$˜&”¢$F‰¢â1c+ 0Äã gÇD¢y‰š Labh˜Å° ®þ.b¢dd@P@¨ƒEuJoY—{œx§Þ–Û˜ï×ÔBÄ`RÒ³Q?y³”k¼íÇ­dk ¤Ù0u0Ö°)k°É,\šm —ûfL+ÌaÓD¦–pë!N•a $¦(¥½ã!u: ÒHRÝ ;‚Ú;HL9·“ØbeH†\#$>K“ZŸñQ¸ ƒ#\$†…eRI{Q\î¡°±ßþ?j y=¸}žPpò”Öp,?DÑ4hÕÈK.‘z1 —Hƒ¸ °,ãý"=¢ à ò´+P$Ñ&ÁÅhÓY7Je‰+±ýÒ}ÞQeH†œíŽJô›%N¸£º¢¨-ït†w:Iä_2; ó~&²fäØlP–UïÑM±lù…I’§bõÙcðz(Ø d"³Ï˜IvLÖ2[ìŒa‹¹E訰Îàúo~T‹‡:Ü<²7{1¸º£Ï‡Öå@àè%aŒ¢˜Á­óäI¶ÙBÎÃB^è@ÎѪœGÏ II£ÏfXkOŸG¿"Ï=ÿ>ú$r©«i:`³Œ…Œ…ÙšœGLZ{j~§¡b¢Ú>]÷ž1” ¤ƒR!ñi¬ÏíÖZAéÆO¦œW!XbO†òÇc¹°ôbn玮)¬ÝÔ,r„#„¬)¹ B¿'¥¯Ô³,UQ{¤çoÎ1¥Ð*ÇÄØÐ¡€5sŽÔ»µϰ/ DüØ¢D=+…sÈøÄ1Åz“Î<ãÙ pæû¬ã§4¶S²ñ«Kƒ©©'‰çæüe=×Óë•#°sŽÀ,Ûž_>9ErÞ ¶õè ¡VŸ;@æ°ƒ§ôähjÐ*5¨3øKá"wgQNÄBmÂûMÏ3‚²½ÍpçkñJ)Oƒríí{[OóLÂÙôødH†Ì’DŸk¶ÍäϸÛìzúø=}‚·Ï•9/O/0/T«ëÓ&J]ìz¨“ó“è™ÝtÃ^Ï3­®Gg(…’ÅÀX_šTy*àSœÑÃÓšòLDB…’i‹[qˆû ñìYÈž¥¹¯¿º4˜ÊMî=ç‚2$C&„¤Ñg=Mÿvª\ÐY?# ‡Y5M¶ïê¸&ÿù4\ʘbr"*žüIŒ—¦3ž¾õ ;'w=¹“³ÞႤ;A§˜I}ÆþzlM®x]¦·çLg)?£ƭ…]Ýr•lÝT›ŒBªÞ¾ìc[Ïz(ûM,„ÞX¯ÅtÃvž ¦†@yÃt»¸³¥¸w·ã•RdŸDzƒu;jEÒÓÝŽ#Ò¨4ðH"sçyž›Äн>ùJ)<õœï±Ç d‚(uû¸§ŸIžQŸãé È–Qìƒ)'À)Ùœå%ØQJ6S'™n_NžEÁÙä¼ó,ÚË(;O#Ư. ¦‚Móüî¼ßõÆóšGé“õy¹4©Èg‡}+=ýÙáKûl£sæ}».«‰¾Áq.‘’!ó€¤Ñgž¼×¹Ìï~JÃG=Ñó3.“'a4È}¶ï:ošßâ­ÚF Wt//¯)vſډÿ“W¼C5Çê‚5Ë8 8¢fº´«U¢ÚPhg­Km“S–-eö m ÉMi,ãjÒŠ”9iUQˆ’×ë;í ­H)UêjÍ„ÄÀûX8¦†cZmxÉ›- WŽš­ÃýO൭`Ú+\¢1Ýæä„¡utù°1ÇBÖÞá¶V€R·zÏÕö!›LÁûažB9è U˜`é…äk®!e!׳¤”k+]2ìy/2Ø@t~÷‰÷¾Ïë)¦å.žÿs#c endstream endobj 5677 0 obj 2535 endobj 5681 0 obj [373 /XYZ 40.7999999 567.379999 0] endobj 5682 0 obj [373 /XYZ 40.7999999 567.379999 0] endobj 5683 0 obj [373 /XYZ 40.7999999 162.259999 0] endobj 5684 0 obj [373 /XYZ 40.7999999 162.259999 0] endobj 5680 0 obj << /Type /Page /Parent 2 0 R /Contents 5685 0 R /Resources 5687 0 R /Annots 5688 0 R /MediaBox [0 0 595 842] >> endobj 5687 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 5688 0 obj [ ] endobj 5685 0 obj << /Length 5686 0 R /Filter /FlateDecode >> stream xœí]Íݸ ¿¿¿Âçqôm(H²™=d€ŠŠìn‹E³ètý÷ë÷,¿™HþÉ-iÞ‡'@fô(’")’"ßÿéË?šþÞ¼ÿôå?ÍW÷ýÓ—k™aãWsüóîõÛJ1þØYÝŠþøÕ|ývxnž‡Çáïç7§‰îÛ08}ĸàï_;¼?ü0þÏ—O~ú_#š?ÿúµùÛ߇o?¹õŽ¿ðí`{süáßã\pa‡¼þé8ø¯Ã_ÿÐü6€`Oëÿ~§´R›àx>Oå§?¯§¢c6ZÛp.8õ€Žÿþ|øeXí FÛ+Î;£:¶zÕN Ë*>à¿ïLÃ-ÓÁªÁæV®µq!Ý3•e¡D|ãÞ8SÝÂZ­5¢Sšõþ¼fÃôˆEÝmÜýy¥­h4œ™< !â›væ¨W¢žÇÅN›”r3¾¦¥¶.$lŸ‰‚D|ÛÖ&Ìã¥È¨—Ê1j·y£ç¥¶.¤y¦…Žñm[›P—"£^1n“«Í›–Úºét&ñm[›P—"£Þ*>nӨ͸?¯µq!«lÕ{‚ˆoÜÛ„üp­Ç,–™x±Ìž#?>Þ?p%íÑ}úeådÍŽßž† ëæÝ`µhÆ›§Ÿš?2&úš§_}«{ÙéÑüGØù GlúWpäG4"àÇûsž#ÒG¸s>ÁŒ8Â$ÄÎG4"1l˜Ú;˜w0ÔšÃ9ì¶hŠq !}"ÔîrŽD`ƒ•#F?? ­¸|’ý´ wGv‰å$Ê~ ¬Ár#5Æ5œÃ±fÁÅz ÏÁØÁ§ÖV<]ww¼ŒµcDoÞ v$<›’`U\nªrΠ׋¦È¤]7ÑÎ3‰ ”â9X›Plg¸Æ(>éÚέ…O ÖÂ>¯é³Ë§ òIËÝB.d!sÈcXDü(x?øs ÔâCEë'/Ñ~kI¸ˆ× C€wú†m@H̱CMðïEøÛx¾objã3C€-Â;„[eD£bîFï7˜Ò»S¶Œ…€åÓ>²ÜãHól&Ï_µóŒ£8Øê£D˜ üß=ßWáùNÓ£wtËÀþš¬4ø’°ÿ RNaBàxÊÉÊŒUOzs1w.¯ÍåOóNŸŠRh¿ù•5Bmß]H¸QÝB‘<·†ƒH¼*«­ñ¿Râ°©HðqFöC¸‘aï4 ×”Ø öïí²œ.!-ß¾» `ös` s³Wg´¿^Ñ ¦j;íÏQés0î0ÎÍ#—mÇíqtæø«ñQXrÖj#æ¬m•ðWÃŒ;å¢5#kVsèÖòï!Áæ°n…‡^FÜéh›V޳6ž-]´'d`¹ë3â\†*çíñ âkò‰YÔx@ÖŒ8™®| Y_t-çnÕ¯~vôb$¢O¹9  ç8º[¼?g0Ì}ž?7\ Ã|Œ†À[ÇfŽ—b‹`X!>#¸©éà7~ ¦@@D¯ù«º,$»˜8Yê£DHÇ·b\ /ðIª«y—Á+аŒÊÊž˜(.ïEaœßt¾òHçÂ’šA÷žj¸yÚ…GŸŸà |ÎfÏvÑD+éÓ„ûÜõ÷ýÁGøÇÕ¿êdë¿HzIvÒÿ`H`g¡ÖY`ë £’lTC$3Êø$[/z#Œ¿¨ìµ”¢ÒÖó½»éGÔð UŽù¡†m²û)º ÙБW0ž¼gœ±CÙÏN…jù·"^Jþg¶Ì$½e¯}Ù —ì»K3”Þ£[J·3÷ÁKÖn)¬0Œò®1.Bc`¨q„gÇõ®’…–eÆ“N„wÕ&8BE“à‡¡øRá Æ¼êN9¤jç´2Ô.¡³z½""ù,–@Ûz[@Ê`Å­ñ²îá,L'ü¹Ën‰:^—)€£¤FÜ0+¿G]ZN@­·y83cµGÊÃ!á°S ;ß™p½.Ìo¶jv/%+ÕX¶*> V0—“;Ý=æžIXíÇ¥¸Ãœ»ìh‡Pôr`%„«vë"u Š(ám=h)ÛÂ|CÉûÀ—¤€a ÷—:F»$p¾xÀ‘”3Tï-Œá½‡Õ9-FÉËĹ©Kþ–$;‡òê-RS[ZX¿a¨+½0Ä¹Ý ÃvcC¤vÅJ'Pãš’s©p’-”²,„8×-ȚϹ»N©îY^î#HÈjoJäè×á>cŠè&Q>g×3»žÙõÌÒ\ŠÀhÌÒº&QöºC Ï3$|ÏKÈÏ‘~z¸ñÜ ^€Èk¸‹0 ™#•â`‚¨Pùr€³ì¦0À­=“K„bw¤’v„K0éÑmÞ‚Œ„ å€÷skœH1¶(ÁJ²Óq<Þé›—‚Š„Ñp¸Žb¤RÂ8hJ(J–×®Ø<ÅÈ^,óåÝœ¦ˆ[²Ó¬2:rš²Êhœ8A‘ÞÎs^wAäl žÕ’·”äÒ¼Ûp;—!UU¿ÈË»T½p©JI~Ù¥ê.U©R•P^ûΤª±‹¼\Mªf-†‹ïž”á5Æ”íjÓ림eˆ IY8ý,q¨ÔÚõÖâj‘Œ”T?ÌUYÛóD¢Â¢g iaZñï?rî!ÍþZ} H…êÁRª¾&”HÀPP@v1·¬öÓ¯ôâekE +½3œP`2H²;_˜‚Nw2áy±˜ ®NY²v˜öåa˜Ê<{Ã/ä*”‚j²³Þfî'I¾VˆÔNìnø3†JqÇýËe#jÈ/(Ñà7T6iµ|ÓçšV»&nìðS:-æMçÜ“c;¥¼ŸË›Ü“÷EbÞ>¡y¹÷£Rði¬¡l–%±áS:,‰e¶ºƒ+à‘r‘{(ݨö„žè» ó_v.8\GÁŽ„á J‡V…»úaíˆ-ż.Q\ÃrX¶8¼U2¹,þém ʧÒub ÅnéæY©.Wº"-JúÞÃ`dk„‚b‘zÑ…{%Рò"…é"^Ø5ºXs+ÌÆ!à&O‡ƒ¼]Îs ¯©šÜ^½°ÅOšìæ@êo( j -}}[^Ci©üϼ¢"œ[nÍ”†)™[+XÄ£žÃHˆ¨Ÿ½ ^S``Ë I •õ›VQ¯VêG¥¡BÔ¬´È¶VWWÖúgzÌðoèô¢¸¶¶h…à7Þ¤?w¯}:‘2Wò>÷,Þ3.ýmkxÝvô«w>ðñ^DÚWsŒ¨)3’Ô¸)AÛ/¿>Ìû_Dé5øë½^)üŸ÷Íš¯³ö /úÙWoNýœ›¤òóM_/è1h„M„ê´?G¥Ïaøsz4Ç¥4 GÁt|ήæºÅÀ+ö’NBˆà‰w|-Ç)kFÜmնʆ—9Å¥“ ¶tSŠtÜ#§;! v]û1†E ®§¤¸Ü†¶ˆ$§h ’Þ*{¬Ò3ù«h$ŠUÊZ+´Òe­´oRy‚’ÚëùD¼–„ú!RâKêŽÎW5>Ó§[Š=Eð{¤´µ'øìWÜ(Š(䈓-‰…­ì¬î#ˆÌÍî´ϑ°»|Ê 8AQ–É©¡èpJÞ$è,œ¢Îâ8NIY«¸àc7ÔX³ý–í&¯Eæ·É”÷l0¬w£æCÚ»¹Š¯jm¿åUí¥÷‚íå–F”þ±¢æîôò(#¤î¸Xr^ZF|Ü™‚_RÞ9âý^MbŒâÕò›R‡ ‚QüJ k/äj5òV”Á jðû÷ãÞ 1Ô4£¦¼5eJ¢¯ë¦<üiž‡m Á}ûú-²¯!ì!Q”D§.Ç:LÇmÌ9ŒznÆgPd“AêÒŒiÍü-¥Wm`ÖŒ,º¶óoÞ#¢»™‘R¶¢÷.wÎà×­tŸÁæ>ÇÂ9=œ3 €N´‚þ1Ÿ[m'¯ÿçGø».?³Ã4ÇÖs#íÃ]ƒÒæ8Š¥ì¿J«ØÀuÇŸ…æç:Ï~¦)ä§ØÒøs/¤ €P»ëêf!ÕwN™åk™iù1‚ù=Ë`ánŸs#¯žÒ>æ”ÜÍãáÿ4Ñ]À endstream endobj 5686 0 obj 3429 endobj 5689 0 obj << /Type /Page /Parent 2 0 R /Contents 5690 0 R /Resources 5692 0 R /Annots 5693 0 R /MediaBox [0 0 595 842] >> endobj 5692 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5693 0 obj [ ] endobj 5690 0 obj << /Length 5691 0 R /Filter /FlateDecode >> stream xœí]Koã6¾ëWè\ ß"¢@“l ôPÀˆŠŠl·Å¢YÔÝCÿ~%ËIÜ¿ñzHӴ̰3$‡ä<¾™!©ë~kÿøÜ^ß>üÝ>nÞoÑ '¦Ÿvü½ÚþBùN«écïm§ÂøÓ>>5«vÕ,šÅðºj¤[Wܼ …Ï]L ~~üÔ\O7Ó7·? ŸþmUûãð×Çö—_‡·÷›öÆxj|pㇿ¦RIå‡?¶?…6?Ó~HðëvÇ×+cµõ½Š¢cõRU®·«¢ÎDk Þ´RªN;LÇ?¿7†Ö^Èè‚‘²w¦_Ýêð:4ëlCï†)6æM«o÷•mE6äÍ0Ö ­)’‘c“Âô»ÛZ$aõÊ+¢âͲ¹¾—FûQ–RÖ"5½-‡Ûöjd“àÛåûö[!¤ù®]~lBgƒîí$ƒûJ´G%"À’[X¢P‰ºuÞÁ’ûÃǃ©–x¤êÄýà…uó†[S°5é ïhØš€@>ýáàõQ¸5¸>KÉ4oï–ƒ8²<÷B»yöðٔ䵣c­7nM24C†1ÿ È‹Ä säž¡I)Öå àì0æšÐ/Iç ­KkϪ1¸5(?¬‘BÚì€iö‰Ñ¡Cpk˜w²€m-Ö!Øž‰œ¿7™5þÆæ]Ð}I[3б éÝáºâr.Ñc}žÑŒHZj9c$-mŒöL‹¤õ÷)mÖI„a iBW@þ==.'Ð7¦ëŽr–HÍ`½ WÁb-91§paÆØJúÙÌ­Ÿë1<X¿0|ËÂ/JEE± ï+É3:㖎Δñ Ç9±`Oë(ëZË´Q9B¯r29™â[×ÁHãj†5àd¦ˆ:6rÄq´Ó¯Ë"beø0eøJXæXÞÆLõ­jÆHX«˜HFEÂ<ËÀñšYY@8ל¸JZÍsžÐ22ùÚÆxç¥#\ÝÇxçáÎá²¢ŒœÙ©(²¢Èãè´ÐÏEOª(25ŠT Ú0+¦ÆŠ„,Üd”Z}œ“„d@©%ô7Gžq?Œ¬¤ÄØ Ûq,Ï8—Š©†rfàÞ“œþˆ±1w}—‘ÒÍ)Ýs²2&šS=§ùyN57@"‚½:B0'rNÀÖ0ïpü°ê#îÕÞú8¨« Ñš˜˜eõyvæô™‰wGŸ¥››/šÓO°>& V:úv"& VÑ÷üÐwÍ[T„[î–†T¹ÏhçD¸ãuá–ƒpÓfA*Ž-Ç–‘Sqî8»³kNåÒr*ÎÇd*ræTzÅ¿…{u½Î}®zu<$Ps*LÔu19L¶{xÞ8·¸AAõ8÷jo›{/qNsø©gœî;ËœŠÆ˜é,õØÜ|Ñœ~‚—11µÒÑ·×¹ïøªè›§kN¥ˆÙ©÷®·¹ïƒÈ‰pÇKÐ+Â-á&>YRqlÑ8¶ŒœŠÇÙÕ^s*—–S 2†+ræT‚‰‰[•îÕ—û4ìåxu8;¡qþ¹ù¬'3` ‡ïNgܘJXÌñiŸâKˆ½'°L! ŒhqS~Úì'_V|­0Œ™œü"ËoÂZ ¯)ž·ªùŠÖ|9#)ÁçÞ¿Ÿ1’â‡Îb°o¤$ޤOàìN=Ké®ñ²Ÿ‚Ÿê‘Ñk÷ÂÄD¸ ÷…½p¹ï½_˜ð °Vd<ç‡å0ô qwÖpÄ>3;S½J&Jª^eb¯²êƒôAF¯Ò ŸûN¦2üM)bFWýMRêNîowBž¥«žÛQt€žqÓK[PKCÒ3IIeYè¤Ï/'ê0æÛ¦´OC,àáIO %FwiŸ©ÍÙ£s1œÈ‰×°vpn„ÁQÌ;9­DÔ¬Rž1„Ü÷¶Q,AØeØ3BR9ÇØÿÏÒòœý¹imSÚØTÁ{£N¦ƒcÁv†Á×_ ?/™ãÛ(i>ek9ºª”s-Y,‹’åœï;Ï_¶fw²u ı Â+ÅÚöƒ-?± Œ'””œsà Ž ÆÃÑ(±ªÒ¹ÏÕoW6êÉ™âÓ¬“5Ç©ĉÄã çIKŒ‘qð“g.9'Ÿ+̸›1íJœ¸~Ú8ˆfÄ©*äãƒ\à2²E*ÄØçÒ³EZt '[”V‚0/¦õ³Oÿ Ö\¹®)‰\†Ì¶çµæ¸.,÷¤ÕŒo?ôÚÄ쿘›çÆ‘:޵ŸÛ¼U—Äisóx‹ðt´Ê§sÖ>“®±ØÂ'ÕB§Ÿ¬7Êà1£¢NÍa ¿¯$ÏèÜó®úí[y†ßv54?Tÿ}óöøDô÷–PñJè‚$•¬ºwŒÞµë-òo‡¨ƒtç¶Õâ9=ºqWëœßͼ¦›ÖãqU}×{©ìvÉ´ðýŽ’ ÀiÝ©°îéµdk;'ÖKÿåÂïêÇÃ:Ö™E¯:%ôXô¥ÙÝÕÚdÚ¶¿¹ƒÿ;©¿c„÷¨ÎFÝì*‘h›çau6+vÈØ7´­ ‚ëÆÏÊÊHmaxM!lÙÃøs/\A©VÎ,\õÊ);9Å{á:ÙKßÿŸe°‚–lÙŒEJÍÝ.šÿEœ Þ endstream endobj 5691 0 obj 1984 endobj 5695 0 obj [375 /XYZ 40.7999999 509.779999 0] endobj 5696 0 obj [375 /XYZ 40.7999999 104.659999 0] endobj 5697 0 obj [375 /XYZ 40.7999999 104.659999 0] endobj 5698 0 obj [375 /XYZ 40.7999999 509.779999 0] endobj 5694 0 obj << /Type /Page /Parent 2 0 R /Contents 5699 0 R /Resources 5701 0 R /Annots 5702 0 R /MediaBox [0 0 595 842] >> endobj 5701 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5702 0 obj [ ] endobj 5699 0 obj << /Length 5700 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õˆñ ¬=ã90Æ@‹=3ûÀ"³ˆ³‡üýH-õä>R,‘jµ[6àn7›Y¬úX¬"«>üíó¿ö¿þ¹ÿðøù?û/Ãëãç]]ÕªîöÝïw—pS Þ¿Õ¦©¸í~ö_¾í^÷¯»çÝsû÷uÇÔ¡âðÒÑ7øç—?vú‡ïúO>?þ£}÷¿=ßÿ½ýï÷ý?µ/_‡öº/|Û«º7ÿîß0θiÿ¹|×þ¶ûç_ö´]0‡v»¿ßÉFš®¿súñzªÊ¿—UÑÃê}£LÓ¾gŒ·š–ÿýy÷KÛÚ©••Œi%u=¹UÍÍŠfoµÚóvìn£Þئ5Åæ6¤ÏÓP×#6oh¬–:Ü™ô†É~˜¶ž;ÐSS3²u-ò¾ë›7´#éqSTÒ[¦Ìa˜žKúSS³I¯…ÎÓP×#6ohéM‘I¯= Sû –J°¡¥Ù3*“ôt=b³Fv$½´ì0or™Ì/k¤3Áµ&¸ñ†gP ®3P<­Î'Xò”Þ‡­ œ”ÀHzZùp¨+…ËgKÌ2oŒÓ!Çèõiü–ˆâ”´j"%/@K» U¨,2-B0gP f}k„;ý%ͤrÂWv3‚Å8PBñ7xÃÀÎKü`ÏHOñoļ¦óúpÆPêuiºÙ>à°˜NGÌS¤âÞ{]Êé… õµ¸)\2îB¦O×&€ ô»‘ä–P<”ü)ÆØC–‚¯Q>cv:êx\¼`aP/C‚…½±Øçšw89\B¸ÎpÜ|{à¹ÆÜþàÔ£ðÊ4EÍ]eæn ¢¹©í¸BXò™ÌSB‹èœ³XsÀ‚骰Y4LŒ½ñ£u ´É¡f-´wHY1= q­¥%ªs-`Bh»,Mq!MÞÝŠ]$›Û³]¹ìèCÕSО®/œìPuÿã êHI}ä=ݸu$¡ƒu,ª3X«Z]Ei6°¬©ú©» ¶f•»§šÍGU¢¯2¥dXnM%‘9×yD%x<¢ëJØzrß8¢©×Ù¬Žáeüx²]YwгV‚†’¬;‡Í:±Ð´´ÔœÑ$£þ˜FÈàk &)œ&‡~I°nt¦ÍXœ€sL0þäÃñ¥l¸{c•'€v‹8šjw)ÄgL>Ll>Xñù<ž@°#Ö·’'³…tfqñ; ÑE?ëM#ïÅo81ßÂ%/°„xÄÁÏKØ'(•ëñéŵ/‚>¸ªBËžl\a$Ð%eݤ,uYdaýÊn€ 6Æ#g‚cÄ%I^xnŠ"+‹£;î³¥‰})#b<|&^tü} Ç™˜©Šì] zј«“î¯b%¶æó;å¢èr79,¯g¯V›rŸlÓõƒ³@èÛ*nY~ æC!á3±Sž:s…\"zNàÂM‚–“ •‡O²‚͹½×4m<å1×ßœÄcßÍ…øozQîæâr” lõˆätõsoçÜ›Ùæž6÷-S” ¥SâAú†cêàûvø®=– Ì;ø€"äo•®™ão2Øs`¤]9ªÊ³+î&Q5¯}‡óÆ%uc4¾w‰KKº-JíJBoBF‰J€ù€ÄvR«æìÚ7©Ý4žMãÙ4žûÔxšzV‹«ó^±ås_Q(ÜGèÁ¦?múÓâ oÛŽx?°ic›6¶icïX3·mÕ„xŒXÒ)œD9•@ònÚØ¦ÁÅnÛ}?°ic›6¶icïWSÍ¿Ež)ç—(g*½^({ŽgX¹ ¸Y¹ïúè@ZCñy–uH“ci®1’ÆJfÇÐMbº‘;6Z™·âÌšã —ùòÄÖËsƒ,ëý­³èEÁë]%‹ßí \=õn*Á.N¸Ê›% krÒ²Ò ­#7[ˆåŒy›Æ¡înÎx´äÐŒvwºøP-ëõ^f¢W .ìSn÷ÞT<æX[êVöô€Yo|&„ª D˜¸ÎÿÜS}­ ×Lrh çoÇ_|sX9oò8] 1"Þx.vá”‰ëØ É6NšÅI8é"Nå)°±Ž”b^ ¤¤!jHF1\’7!ÅøŒ5{|(×ÁW8ñüPÌKð9xNñH(´>EÌ'æd©ÂAר©Þ[lNJºùx«)Y²ì12dÌ=sBðϦT2§EY•DÔÌûM'Y·N’-$\ ”ty¢|Á’£‘ÁO_ƒÛàç<¥'Ý9[ç¼Öp2˜Šf8â8Ökœ Òà|D8a`:ž@ Â,ÔÙ,mPÈ´p¤ì|äÍ£äWaÓëhy§NÂÔ%qKO&*ír%æ–'—·—ZÍßNȈžOˆâKP)7NNWrϾPä`_–´¬¾ïzê–¸‘R<¡9IÈ1D:ð†J$lïüæàGÐñòÏÉÏ€I0!¥·CÂû èTÏ1ÚŽ4ž!5GIŽ>ž1ü&’MÄ3Ìä=D„…“{>~Ò Öž‹„²‰J@”¬Éôé¿óæ©OIÌš#ÙŽƒ$½$näÅL€5¤“ÎüÜÅÞßZ_>y‘võûðö%-gbæŸPÆ–G¨,°~²é[³4-£¼{«H@Hðù„/®Ç ¬j)EPsž¦ÔIH‰×égüVȸþtŸ„DÜÓ@œ¬y&]‚=!åfJXޝ˜FUWô ši|»šüY4Êê^ö+Üí%ìÖwl1M§ózÖS¬‰ÎÂöwÿÚ¢L "]áåË·ìøxUŸñê9ˆXÁªq¯‰Ú³v\c`g™ªz3¿¨7η²R•‡ ++`9çºÒ.ì÷”×#%½\Qq«Æ¬‹MS©~V\Æ{Žu,¬Óƒ°æ¯Þ“sÉl­çöËO>ÂïB42Â'TgØG•04ŽA"Òê 3–2ö¡o˜ÁuÝ{Þ°S4”>Ï)äƒSÓøs/œA{=¨ßc”…³¾qÊ(§S«ŠuÊç[–Á1蘙ôΈÜûçÝÿ=O¢Ð endstream endobj 5700 0 obj 3230 endobj 5704 0 obj [376 /XYZ 32.1599999 108.500000 0] endobj 5705 0 obj [376 /XYZ 32.1599999 108.500000 0] endobj 5706 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 63.3799999 137.759999 71.0599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn2 >> endobj 5703 0 obj << /Type /Page /Parent 2 0 R /Contents 5707 0 R /Resources 5709 0 R /Annots 5710 0 R /MediaBox [0 0 595 842] >> endobj 5709 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5710 0 obj [ 5706 0 R ] endobj 5707 0 obj << /Length 5708 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè¼ÀhøÒ ¤ç ‡n ‡ ‡ 7›Åbg‘Îò÷CYrÛmù£ÜE5M¾`ü Y$‹õ$«JÿüðÏâß¿?=ü§x_?=ìT©j5üý¿§_˜¶´fxÛ´Uiºþ¯xú¶{.žw÷»{ÿÿóN×ûŽã‹o< 1üýé·ÝÇaðÝðÍç¿úwÿ+Lñÿé—âïÿð/?Žðú|Ûµ]Ý¿ùux£6­ÿpú®oüy÷·ŠßüÚ=Üþÿ®ªUÿ›˜y<¿tÕû§]Ñ`ª¨¥<´6~ž•÷ßí~òÐ^¦QvNë¦vºjc°ªèštë&P'‹»V$ ­;» ýŒtäÚ´rÍ ,)öµqnXhebqö*íªeõ3ÒqKqUVJ{>nü® ÷× Ôö£8åGñC‰†™bxÙaª4Ãô#¼Æ´ÿ»0Ìý¼d~ãŽrÛœÊmS¸b*»¯§àGmå!ÆðßÈ €Þ êˆ3bá0º8Uí5æC–¨÷²cÔŸºê½€.Nge³E}4Õ_ÚÀà½Óx´w‡eˆs #VMñá¿GþáÓ»ãÿ-ƽ9÷¡M»{Ü}üªm{_æñ'¯ÊöÑðòè-¦ªøÐÛ˜Öú±øƒÓþ±xüeוUg›jð †u[:Ô¢Øâ 48ÇQŸÞ>7ea‹³†ãèή¯C“Ì:€¸§îÆA`x S"G@x¥êO¨ÅÂ]¨4GAhpÉþ¨W@£h_Þ>ŽÆë3°£˜B0UdHƸ¶×š„õg878õ®cSH"ª¢¼êúT»åµ@Ób:ðO@R`‰„ñ†%’ÄF`ÓÞ¹À8z ÌM@{Ï`Ö†€zE3ÀÚŒ”HJ ÏZ`9`MꟀ^¬4€k(ýí°ž/»û÷÷Ø]wõ.á¨u;oY-k‘Âý¶p¿±Ç°ú°¶¿¹D[5íöt`»„Ø6©9p3>á†ü¡„«UšbaKTƧf+µ<±Ö’XìšÈgÀžŽ`¥¼aù¥w€Þ°U!ð äF×ã-Ie𩍅ßIrIÎÔÞ'–¯]t¾'áôíXü”5s²Æ9ÚO«°Ÿ–µÞoJšµ=H¹1'7j!7{÷ÑHxS`;¸ëMÁIo€7%w¸ÆnÁ·†‚>Ié²5t™ó­lÀ[V3à9¬ / ‰v£fX³f0JGpà†|“UÞF,Kÿë<«pØ®ÁÐ2¾iÄñ¦ŒŽ”ÅÇPŠmê¾Kÿ—Jóco&¥M`»yžÁ¼Y-iG¬K¸Ã’3 ?èEržŒ£™ð8£ã.¤¡—*&hYÿ! µ ôÅçX×®ó±Ž2?R¢3„æ ×â>™h†&&âˆqBnbBžlÆ7a¬A‰.À;'ðâ4æz÷‹Ov–8–HØV…4Šq5…@‚uNζ7Þm|+ðÈr×»]LÜäv|û ´DÆ'‡ZbG@hK»UÚ8Y‚ÌÄK(kÕÕX¢Ü>'óL`n!Ђ£sà 2šÖ©,ZR©7Q¦}ÀÇ^àÍy. òÐS]L.-ý 5FK^ÝI ;o»hÙ§ТÍ{çhK m©,ô»Óó;¼!ýÎèjÊ”ò6`¢rãÅ/Æ¢è¤APqdTÎ,hÚª´Ugey{C¼Í§9©Ài¥Á÷ðŒ){ÅÅÔfÁ§Á¢#UNý‘ƒtÈ„–Û˜,hÚÞÔÏ+æÀE+)AÚ¤QÚ[´!+“U´p=Hls hYRo* ùªøFH"…r¯YÕ1‘|ÌÏêæg2W l]²~#ŒÂ"©—HWç^½­jcâ·“g˜Œfõ¶•ZÌoAcõ6a< «·ÑƒÊB¾ÝÞƒbõ¶PVo Qbvx­®Ðz›ñù¿KÝFÝ–•|Ò1±ÅŒ_ÏœŸoºÁêm¬ÞäŸíœnlçT•ÕÛfõ®‰‘eN§°ÏíõaÆš…ÕÛx#;C!¬ÞF#læ¡]«˜g†2ÿ#Jbõ6a^«·­Ô:eõ¶¥y.÷êmu“]Fÿ#hÑ’gõ¶ïÑÂfEŒ ím)¡-•‡~ïøì¾“>Œþ ¦L)o³ŽÊde‰ ¨œÙù´Ui«ÎÊ*òö†x›•7Tà´r½•7ó\AVo£þȈ–›˜,hÚÞÔÏ+æÀE«·987Vo#Ò†¤ yªw[õÄ‚E«·eÀ›x¥‚¼1Qf!¶#0oJêZeQñ­u1ÑÌéÒ?s:™_¶HYñQIa ‘T|[¥ͽ~\[ÇD&n'Ó1‰Ïúq+µW˜a‚ÆúqˆÖ£?–…|»½?Æúq¡>¬¢ÄLìð–Ä'}ALÝFÝ–‘|êTTt3¦>IVi¢ BŸ_”³¾™S”‘–ÓP¬‰‰o³w gêbž\Ĉ'•2šd­Ñ$ËF*£²WʌܤML›xVV‘·7ÄÛŒÊV“ÔÕFe{'uæëÆSçdDÿÕJ²´n–µC:µÒ÷z«ÒšV›êtƒä¸Ò ¸™’;RýDë²ruë}üéÀCíåêü‹ £ÏûNÇýrþ‹ø›Râwx"#KÕ¥ÑíE–ºu~ŠcÑÜKXlfûÂ0“¾×/ÜÔpÇ'›…÷¶L€ˆãzÜŒœ¢8Œ†¸1_Ï º/éØÞ4‡ðÙeK(,{¶¹bAiö¾;j¥L®²:æ =U Ó`ËfS‡/ŸpyQ\|ºkø±()ÍUkß磮ì£DJS·9ϳJ~f2^Zª²ªäFŠÓö˜•Un\Ô*ÉãÍV1墂‘’}Ä2Zà?JIÒÖ%ѱ´“\•¬ó±Z‚ÂYVP …¥®² uê<¤ws¸\îb¡-ú{Åéí~DwL@Fôó{¡Ùöü›ç'‡ºƒA«›²éÎŽŠ‡-õcŸ‰OmJWÙþûØ2 ߸²íTýªå|ÀñhødNãµÀ…)Œ¡’—&7;,ÕØRgÎç,pŠ„¬©Ëºª_Çã– <íÉäÌ€8£K;œ» -ío'-Bö˜`¸§,L:GšÓ#Í©#Í5¶ð¤SiWöC~{ù\•m«ŠF÷/ÖíðmS4ªÿaÿwøæiWw¥Öi[}ø®nO¡> cøßŸmß­8ïm&cßç|&þWöÊëu<í~ÞÝýð 'z‚}êë/øZ·gÄJw¯Î¥{Éí¾ ›ÜÐ ä{Í=Óôæk”ª¬=s¡¨_Hó|F°e:Ù»¸—ä©fÂŒø Þ(ê3- oøíìwÓ¨‘7ŒéN¿øu÷à!ÜÏž`öÒ@ãËÓ·«ØQM‡¼*`×yíQÚOûÝÚN×åK…}©G>êƒÚKÀËW²+'HÅ›—„—/´› -ÃZ[šsé9^–Ve}.É8N ût°Ï`J4¦4êL›ÝAhž~óþv¼)¿°Â¯¨Ï¨S.µh´ŽQ¡¾­Ï¸coYû8·=EP]ÿÞôÚb„ZÁñðžB:¥èÛèS/ÜAg=^õ_Â,ÜuRÊEJñš¿.u¯Œ^“ £ŒÇ-û)Ý/)¹‹ûÝÿê&D) endstream endobj 5708 0 obj 3138 endobj 5712 0 obj [377 /XYZ 40.7999999 456.019999 0] endobj 5713 0 obj [377 /XYZ 33.1199999 645.139999 0] endobj 5714 0 obj [377 /XYZ 33.1199999 600.980000 0] endobj 5715 0 obj [377 /XYZ 40.7999999 298.579999 0] endobj 5716 0 obj [377 /XYZ 40.7999999 456.019999 0] endobj 5717 0 obj [377 /XYZ 40.7999999 298.579999 0] endobj 5718 0 obj [377 /XYZ 32.1599999 647.059999 0] endobj 5719 0 obj [377 /XYZ 32.1599999 602.899999 0] endobj 5720 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 777.620000 203.040000 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn3 >> endobj 5721 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 207.839999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn4 >> endobj 5722 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 183.839999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn5 >> endobj 5723 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 751.700000 227.039999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn6 >> endobj 5724 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 222.239999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn7 >> endobj 5725 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 734.419999 89.7599999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn8 >> endobj 5726 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 207.839999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn9 >> endobj 5727 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 185.759999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn10 >> endobj 5728 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 708.500000 84.9600000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn11 >> endobj 5729 0 obj << /Type /Annot /Subtype /Link /Rect [451.679999 612.500000 465.119999 620.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl >> endobj 5711 0 obj << /Type /Page /Parent 2 0 R /Contents 5730 0 R /Resources 5732 0 R /Annots 5733 0 R /MediaBox [0 0 595 842] >> endobj 5732 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1738 1738 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 5733 0 obj [ 5720 0 R 5721 0 R 5722 0 R 5723 0 R 5724 0 R 5725 0 R 5726 0 R 5727 0 R 5728 0 R 5729 0 R ] endobj 5730 0 obj << /Length 5731 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯èón‹OQ@À{äÀ°‚‚Ùl‹ì"Îò÷#µ¨n‰ÔGñ-µÝ^`gF”ø(Ö›UÅ·úüÓ¿~?½}þüŸÓ«þùüù©97²ÿ†ÿÞÌPuftüµUâL»áßéõ×§¯§¯OŸž>õÿÿúDäåCý£oœ†;üýõ·§·ãàOã“ÏÏéû߉žþÜÿõËéoïü¨û^øõIurøåßã/„ªú?æ¿ ??ýõ‡ÓoýÔ¥ßáÿo¸h)2i_¯Ÿ’ËóOÑ`ÍI´D0z"„öó=8þûϧŸ†U%MÎ'HOüdOÒþ ¨†Ir%úé4½ð^!ÍJGéëlnë¤zÓHò4Wö›ÿy'ðµ„æŸÑQAðµ„æã²Á—Œ}k›PvÝ8ݶ]7¹ ܽóú7Nå†áYIýþîSJˆžy7|Â9‡éx ‡é8!­ämã-vZÚ÷I›þG×ÊS+ã‘cÙIíˆôËÌÒÑ0#’´²Ø­³§h¸Ón„–hSW9õ” .ÆUžŽ†‘¤•Mp‡=EÃ]R6Âu©ËœºJ…#’äü0#’¶´ òVWi¬žØÊrË.z/'gÑ Šûô7=+Õ døÑ¢Æ§üÔ6Ë‹B?y}’Ý™Ž*E¦gRÍ{™þÇèß×7Ãg'ãë~­Æý“×'c&Ã[lÞËr¯½iñþ‡Lˆ²0 è &_¾ÿòôö¥Œ¥/?õMà oÆ_zùÀOo.³è[<ý¡_À‡?ž¾üÒoçYöò©—÷ÆyiQׄŒ¯Ò3g­­¹­«“¦5<_ðë®ß8«®‘T8;ûxy zR‘å«ôÒÒž›Îœ‘Ç›¦:[Ï8WÒlvÆà9š"ž| ›wzÖ·xFÐps¨D-÷†¡¿á.b=ÞQ^B@òq¿>~éÙâ W˜\O—²l5“crñ`PhL’pqy_tºƒél. Žp¦¹Óø´—=ë7Ö?yí?"šÓÝÞj–Ý4óa†/ôuáqF½@6†éŸ -&syK,»Ëa~6ú¬²_ôÈ+û­w“u#ÖôœËÖ‹WZäˆ)·µcJ"-ìÕâe…ƒƒÚ­åXãáU`¨Yl OÀåpï;f™Â¾•'+ðö‚¶bâ%-Ÿ?ðæ%mkð’V­ñ’Ë“‘«Ææ%3æqí¦™sã%­\ã%­0‡éŸX¼äò–Xv#–ÃìÊK¶ó=Â'Rà/¾¢‹Á[‹P-%ÊŸ©ä•½6 ôçÉ›ü' $¡¤¬ØDÊ”Ïx“r' Rîä)wʤ±þ‰EÊ—·še7Í|˜)w|”;f ÃlR¾¼%–݈å0{’²lš)?Hy$ey¦—õ;ç ­ž»Ö ؈–ݹ4ùy'¸Åî›]Û*/ cs²™\<œðù_6' [²9Iø ›“=a/ùÏðÄdsã[Ͳ›f>Ì•ÍÉ^·µÙœìG3‡!›ßËnÄr˜]ÙQîLl®3³=6yWQ€´| —sÚš€= ¾”}Ø&Þ\Ÿƒ{c‡"¶QñìuCI&oÄüï(ô¸K¶ô¸K¶æq—Ìô¸OLûðLªy/Ó_K»dkwIMûðÄô¸_Þbó^–ëØ×ã.Ù¶Ç0-—[iÊeÌ{ R§(ñĤÑ÷(ÙÕܧjþÀ[úrÃ÷(ÅšïQ Ó÷8<±¤¯¸úoÝ4óanÒ—¯ù%7}ÃKúò«ïñÖX³«ôßãÃ÷xw¾G) ßãôÀ›—HÃ÷(åšïQ¶¦ïqxbñ’öÆ<äÂ÷8 sã%rÍ÷(¥é{žX¼D^}·nÄr˜]yI{õ=¾D8, b9()F3ò7¨cŽ<ëÊÞ5'ÇÑ]þDÞÞ¼’jþ ]óTb©y*¹¦yöÄih…JÙšgÿLë–º—é/±Ô<_Ó<³Æ`¶æ9¼Åæ½,×±³æÙ]ý> Ñ}‚»Î[¿ì&sbÐì/ºl‚¦ñMÏíдœo2†½Â` 9dž¶¢à'ðgÉY`ñ= þ9Ö·ìôDØàDyëj¸{ÎLû ÷Š[ 0÷Þöta7‹…7&Gxɶac c‰IN#œ+!W®!n{L\n²Ž-´´@ÿ’`ða–ˆAw Mþ*ƒ H E Qáˆ^;\Ì_KÜæÏ-aii™Ý(‰›õhóã7‚9Œ….x×-Aûi}1~![lûË_7·"@mpH¦€ƒÅj²Eò~Sª=´Ì,ZfŽ“:täSP–tR˜fG€¿Ð‚Bߦ-Ûs|ÅèËö~ÀMÕj@I©¯íCyu™ÅDns·œBʱQò3—¹Ab;»6µÏÂfš ËZ ɢ»[,2á>ŠXý•Æ}6ÁøK9›Ébe;äI}©1¡Ì( r¤Ž‘"Çò¬fÛÇ‘5…É^F¼¾,^´gï¯&Ù€…ÈŸºm=l*àL"u×¶+b°ÂâØdé>€ºsŒ`0†ˆkÿ,äÛÖ Baaé£y·-XM((g”­ôb|#ŽqÀ—U¹jó¥”3m*–¤Y½ 12[Þ… fŸºBÚ8!~(¸/佤e\å óÀ½Y&b ©}ø¶í¦ €tÈþ=¤]$©S%LZÏ’ŸS§îÄ=AÊH8pÝ ‡Û>"À‘c:XLÞZp„NMô× ³Ì€·ýØŽM±Îá,v; "&{)g¨chNûüe“#b=Fœú»»ËË™–ICÎ|w‡€Ñ>‡É£UNe ‚ÉÖŤ©Þ¥vq˜ªVk- ¤^;!ë)S‘Ðjìô)i ePÔÃ0zF• £ x­N”¯¦A‘ Z«kåK¢9½A™O4Üåmžï¬W:ã:n+i'hšlDž5ƒói™rµz~É/\âöÍ‹9òŒÞì@Ç´µjeÚ+˜Dºs§.èÓbõ¢)’°3ã†AkÁT³×Ùt„e§åˆæ4’mh#ê–rs?FБÕñêaŠÇsd ¹ØËÉrPYÉŠ*ý&>{l½E•«”¤ÄŽ… öb®fA/¸¨MÑ4npî;`e*ŠÙÔdu–à-E ´¼uÒ¶ýø¼Lq;¢*À7ŸÀÏbŒ5Ç1fB$æ6Ê…„óÕqoûÆÚŒéVO]×Yw7vœ3>Ï#e] ÷dôÃO9ëÝx­‘ª³¾aÀvlòËİÖGwf j«—Ÿ-KÀîÛÃØªÆv¥mog™öÔ‰£{¸0muµÐ}–´Íd™!‡ÛÚÂà$û‚—ÜÂ%S ]#0‚ Ø?$¼ÝD€ÔQËåýÝ­àòrÇyŽ#ղ禃ƒ'FÔ¿É’Ûu/H‡MH ¨s‚SXL³B• Ò¬äžì›¨"'1ÕßRÊE©BTÆ=xœ²hLû:H13 ›$åmáˆcÿ( —µVæÃ¡æ—&ù œí¨!´Ã)Á¦ª×°€V«0RÖZ¡<¯RF1ø’P൞={½t1o)¼€ˆËsv·:1Ö|‰¦ànљ۽}P¶×ÁEÜ-²W7¬ãæçŒK¹n‹ÙJÑ XóŒ©â‚Q&¡lÜvaÀ,‡®I±v«¥ñm9C*ùKÓ<ÕÂ0‹¨"’¥bf‰æˆ‡ØVxí=EÇ÷®„”eß±òo‰!MBîfÜ+9'Ahñ¹@J8SÈœ½œÄQÒˆåæwgª®µt°åjÑzÛJ‹NÄ]kã÷á-xÖ1sÓ'Xk-xn-Ïúö÷G¯'&µ“¨h TÒZÉÚ"`ËÕƒ°<ŒdšüÖZ0š‹ˆÄ+­AÄL2ôƒ7[Êb ë¨9U o8Õï~Çy«Öw¼¼5GZµd†k5aÒ¾BÑ Ä g–óø¼6ÏYCÊ©s€âWç¨!Ï9™£ÅMOÌÅ*!jwiQçˆXOºYoJÞ€»´îf””R"áŸíƒFQžŒ„â´XPg¹zÉAcäòˆ›óH8Gf]éåS¡Ýã`×z#aÛ¾5üàRÕ¹T‰2!%CÔ 3E[µ2྆rÙvçÐÃBnÕØ¶*HU¹ç£‚MÝMÕ s¸úË”±‰0…õ¹Â8 ‰:"73»$ݪuÔ§)»zu®^åfüw[‘B-ÍÄ·[a´àÞß¼ƒßtè›IßdçQÝœõöqÒD­2¸…i¾GÍ ½UòÌ.üÐë››KÏ\ÏTøbe~#á8:Sù :xnSUqY¿O‹cÖx¥xàJûÇѧêÌ© ·)3•OÑ#7|£pÖµ0¤ÒW”¶Û±4)úHÀYw–`Ë(îr÷2–dô5øð·z_¥JµëD9Rİzì)öå.F³Ò5Ë $eìÓî|a|Üás–TäØDdùT:®äÆè#È-mnޏ- 7°ÖàX¯lÁ,%ĆÄ_ ë5Wâ´›+–†AbéLBëЫShùŠpyÙ`5k\m¨k§ð›|š$ÚÑÏ›k¸ï{“‰AøhY¶"³û‰®t_ÞÚ׋§z:Š;XÆo€ ˆ8lÈ{7‚^WPrº9MK*ÚM@ùV¦AÑ µÖÀ¬Ü†„e9Jn«e`–)¼i*6ú2w*åºEœÅdœFäçPm…5J¤¸[øJŠÅbì”ksß‚°FÚrkJB\Šr3z(ê&œ€»Ês\¿Tãïßu FBúwÊa†GBZwÛATª ü÷¼5@÷¾¬Æ8ô'© •´Þu ½eÃÄ{¸•›LI<‡+1ñ‰_cqÓðÊÆåÕ6„n[0×ÞFñ½¹ÈÁ@ÙUEåߥ.’ÕBJÉC ¶:Jêë]c×nÑÂQ”ü5"ú«W¥÷Ý¢“SâG„¤Wp»ø«­Y¯ ¬Tè,¤Ò°?ž}óqÿ)©@G‚9ôq‡êpÈ]&ì)‹Ï²ˆã3oïíHî:„!Ú`Ö{`“¢ºü© š]%Ènvv!Ÿ9MÁUÓ<¾Ôs‘-šÂf[N.“× {XZ{[ZeØ\QP4¤ž$’&„OdŽŸü©§¿s) 1!Ê1Fˆ‰åðî©àvÊÕZ1¬±lÛU²)]¬m¯2%YN7kç­æIG¹oñy€jЊ+SŠ”8Qˆ oˆ/ ]:L<ŠÂ#¤RØúНv¥ ›ê‘t“C÷ÝÇãÄ$܃D IÉ'! ¸ ro.´š âzÞw€š ø˜¯‘}%;çÚÇäç“gØ‚ë Ddá;rí_¡ƒk.h†6КaYà–+ª3`§¬Í@ÀõÄÀ ¦ZFDËûEGåY6dR.áÍäYì«,Êe–;ö’Ô²”Û˜S_,vbÜRYÄM倻™•£Î@LÝ`-8%¾:‹“ä0>ŸÝKÓ‚ç·ãP£¬-1„ÒþåS¼2QáY Ý<ÊÔÍ»(^'§ ±§œFTßñ¸›3ëñxãrèYi}:†GGÕÙ÷¿n8JML@º(ô/¢ L-$¡1!°r iI³H_ér“A…¯Ý%Ù’’IË`UÝFš«"þÕG¸m¸|Ñ»g¸Ó”ÞÓŽssõtyÜŠ©ßMÁâµ ´3dpTnéÇ >Õš5wz]tš ®’¯As\iSñVýÙ¼:m­JNDÕŸ|7Q{@¾ß*ä#.7c°ÖPÌ>RX ·Ä\ÉFáÍd,ßem›˜Ô^£‹EG•'¼÷YñÃ7c1 ; ׃ï«s@Îes×{`… ›óÁ°jpý3¸¸2ZÌž0ˆIŽ;á¬ãd;ÁôØ“6…Û8ößvˆ¥®"±[˜‹0¸[¸7¿©JAªKØ-5lÝM™ ³qo1{‚鱿ž¨F¥PP%yB¡<¡òµ е¦ˆ¡Su‡i[†G>d/°>„6£ød§2x‘wÕùH﫜ëÌçZ(õ>) ¦åÈTƒ¯›wسX#;ðžÖ¤ºŽÒ;€ˆ—±6Ñr ›¦ã$†kid]¸&þÊBöß磸4– µ´ñcèÜ];Yº‡Ð®XCÚÚüîKóÎ k3XgÁ-˜º1mÁYcŽ€ýö à ¢1ÔéöưWß“€×ƒ!á—ÃÂ0OŠØmQÇ.Tƒ(Û¶ýDùÛîn')í%¯ó>!Š©>«tP}¬÷—ÛŽõÌ4™þ¿Ó×^eéÕ‘áýãõW‡c+?ÍMùùäTœŸngÈÉé—±Z“È1óÄ®iîú˜Aʳ\`íøy„ŒNÚžÛõªáíJË(|;÷öÍ2ºGlj³ƒ\n--GÁo:øÍ(´[z¦Í%…Í$ìµÞtɬٓð]e»²ÂôŽC]k!h:b0ì½c!k'³Pº¬~§âªªë ºµñºp<Ð$ïÀb}£Í¬Œ×o+PÂ-xoµ om¥ -`L„x­I^c\Å-[˜4k†iâ*±¨Q›Ù©8ªT#ÏdH*]"+fMYuœ––eÆéÓÓÿ®³Å endstream endobj 5731 0 obj 5232 endobj 5734 0 obj << /Type /Page /Parent 2 0 R /Contents 5735 0 R /Resources 5737 0 R /Annots 5738 0 R /MediaBox [0 0 595 842] >> endobj 5737 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5738 0 obj [ ] endobj 5735 0 obj << /Length 5736 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e‘% X¿ä`àrr¼» ñ"“=äïGÝÒÌx¬þJÓŸØ%JMð´§Z|Ô»ŠUÔÛ?}þGñÏß‹·ï?ÿ§ø2þ|ÿùP•US Šãß7ßþ†ÒÙác|i»ãŸâË×ÃCñp¸;Üõÿ>LszpüѧüýËo‡·Ãä‡á7Ÿßÿ¥ÿô¿Âîÿ÷kñ·¿÷?~Ç;~áë!tÍñÿ‡Æúÿ|ûéü×á¯(~ë—Nãÿ}SûP»P/ZÇÃÓ£æô÷ÛGÑdUá[WÕ¡0Æöëô=:þûóá—~´§e”]mLÛÔmõêQ[Ûk늮m ïºÉ “½½n(³p ge ÓŠÌ²­™ªnå¡XÔ;ªa›¦^Œ±Ç¡–d»X4 't,ÙÚˆza¨²ÿ®q­õõ‘ Gølÿ¹u㟠VìŒ¶ÞøÅ»ká@u×Äè´"³po™ŽuEQÚgEù <øîþðö“é'8Ú…û_ú¥œŒËðã¾ß°/ÞfºûŸŠ?ö¦û¡¸ÿõЕ¾s­¬Ñ1A* Ÿ©!ä‚XÁ+°pÕÖ#ˆƒ«¶ |ÆÁµµ;pmîǼ‰k ׆Ÿ©àNÝGb4%®Â;Å÷SãÑ WYˆ7 ©1‡$Œë ò(ÆÞ©®*Ä]›@mˆk7<óñ¾·×¶¦š×OÔÑ÷1ZèÓåóTxÕ&Â3x§ŒŽ†Ïöƒ°”Z0ŒQŸÁôÁöPÍ€£1ºs›T ì;ÄŽÀ×G³?&®íú/ÌbûX;| èˆužkHBs ’޽r,MX±­ÅÒÄÈ3´Ï5¦)öÊ£úiÇÞ0ÄVpÕGãI`Ä/ Òׇë/äÅTeӚЯæ™[¹ ß+_:ŒõS5t2˜–¶¬€éoJ{švŠÒ ¬¤ýîfò벦­„gëïŸÄ´~þE ›Ìûúgí÷ Ö q5™oÔûÆ”¾n^Ò“â‚AàG~ä’‰1‹a´aº½æõ_È„Ñf†ÛG¬ñõ‚A¡’iLîœvr3ÉfÆ×õ¼'kÜ£ÅÀ~´2ØCÁ~¸àqEõ©…X{õs‘M¼™§  Þ)œGÈå★ V £Œ«ÐñGŽffÕW÷²\õã£o±WÎD‹q#A 1·àU+ÝA!ì‡À(u7c‘•î{ËRÞÖëØ7TÒ.ëë*a4âΊ㠮Jýô¡1Kzv3dä™ÏáéÈŒK‡Z²UãÅFÎ2ýÚL ®­ÕÑuîÌëA´¢U™irK†lßn ÖQéÖR|ŽEEÉLÿ>I#ÎÌ…¼µ¦~ ¹š=CÖÐ\{ËNke „Ê„3x¸vHÙæ¨èÛ¶j’‘Í ÉÔ!ëëÛ¸>$¥‰ùSGf}2ü’!²GUÿÁôy0•.„ß)x±D«ðLT_5¥¨w…1o:fê% ¤œÇkc¢Ý 2†èØÝzI'P†dH†$£ñ™.üõc£¨÷ĵ9ÉØ‚¸ËÒhw„eÈþ ëŸZ®åS˫觰…Ž– Ù*$ŸZÆöoçÔr}›“2hE ìj ¦wGð#ˆSòõO»fýˆ½Åz*~Q¨rgS†\ÏûYÿÞ­Ó!*nSÒøÛÛ‚M‡Ë3d·Åöbo'n[ßæMMìr/_†dÈv4q®CÕi>÷ZfH†¬£ ¹zï(¥í”²õ¹5סƀT³:mî!Î ÙCü‘ëPcÛœdlA\ˆŽeér·t†\Ow& ¹”Î ±®ñÄ ¼qïÑ×òäÍ\ ¦¢Ó:“»¥3d m—Ï@9}Cg ›¤–÷sÙ£µ-¥ËýÍr={x•̉ŽdøÜŸ™!Û—ÆS 8^%¬p߆#Lh…ã¾e\x£bÔ“´¸Ù ænB>šáÆ[öCà<ïTØcf·k÷ÚÁ»þÙ¼ QOw„÷­bM q õV¯mVå]åý±:’Þåž´ IKSz#j–Ixã1”ZaB¯ ZˆyG|[v\ÏWx;Ü“#Åœ'žQô¬êʤ#rKAß2:Gq„7†ßàÌøÑŒÞÀ5®‰è ›;Â2$-½±~m#–ÍY© ÑÑuî Z/q6—ñø™ê‹ ÈcMîH‰ûâF¼T¦ŒàeA2øytø?äšæeáaqõ2“½!¢—õò´µ©r]êBê¡Ca›ë©¶a“@Ôâì u†õ\+W+g¯í ó¬ï;(uÎ ZŒÁ5<ʼn{º¢¦-‰y¶¹ê4òGý7’±Õ…D­œQ¥}³×Š®¸á΢>ÒU„–ÇÕ‰„–ßaubm«§Y1æ ˆÔ2ØÛŶŸ¸ß]ÄÔí®åãi¦2ðv…ŽB¢/Š”æâH9ógëß,.ÐrÒíT‹Y¢¢½Æõ šº¼ó™Ç¶Ác g䨻O±^&dFÀ¾ö®¤ág9çÐË E% ÏQÏ›p¥,Õm…ùûsµ}:<æ÷— ¹s&2`ÎAq Ñ‹9{S¿´{íWÁü‚ï€Êü2Ë/]:VÓ/QùE«ÿX“+êj¯ÕÔB•?ó¶Ûâ »×úZÁk[°N"|~­úZU«÷Z_+ô›3YÓ}òØÚÜ–dÛöÑÇí{c$w©àZ!×KT…­Ÿ»`nc¹ìhj_ÍW îT/ëà·~Ìueí›¶ÔQ@sõ‹‡ž™zF9~aüñå«À]S¶¬žÙòNdLñÑYŽMaúmœah×™¦ Ç]îIiŒ_Ó”M8èº03Q¶-Û`¬Ÿ2h{2›8WÚî4Ó3d`Pï˦:áÒÂy|¦ƒÏ F¦µ¥­Üô=©Ï6°î·¿ù¿;¸áÌ?¡gÆâ•sƒö1¯\öÌH±Kö>®í$ ¸îøÙzó@y8_w9Œ"/ð™> endobj 5739 0 obj << /Type /Page /Parent 2 0 R /Contents 5741 0 R /Resources 5743 0 R /Annots 5744 0 R /MediaBox [0 0 595 842] >> endobj 5743 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5744 0 obj [ 5740 0 R ] endobj 5741 0 obj << /Length 5742 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹/=€ €=ã CÃrr¼Ù‹õ"Nùûé©{zH}$«DRÒ wõ¬5¢Èz|õ`‘õîŸÿ~üçï>ÿûøuúóáó¡95m3þs¼üûÃý_Èþ¤äøc×›“.ÿ¿~;|?~?|:|:ÿ÷ûA´O/Nœ^?1øß¯¿Þ?ŒóùáÏçŸþw”Ç?ÿï—ã_ÿvþã§i¼Ë/|;ôC{ùá×ñ!…ìÏÿsÿÓåá¿ùÝñ·óú§q/ÿýA›¡5B.šÇ÷Û«âéßûWÑÇš£é´iõQyž§9“ã?ÿ8ü|í6S¯•P4úüóÐê®1}/Ï?wjú'êK<J©óÿ ]{&»ΗœG޵p =´izš‘X¸6Ñè.0ÖiÐBtNDóùi~æÌƧ…ªvéRoC-H‰ºÌH,[ÚD{ÏP)•áüo?.]Éaéêoc-¨kú6 ?.3 ×veˆ;Ö§$ø)Ÿñó»çÅ_ï~ZõsñåçóTžlÎøÇ—ó‚Íñ‡ ŽvýñËOÇß7Ð8~ùå0œÌ :3©=?Q =i>ÒGkð“ŽÖÃw$œõø_ÎÒ’÷gÛ ·Jñ^µIyeìCyp=ÍC@ÆV–¾V™ ·$¦¤/~‚)9,::åñ 8ë‘x¥P^8š¡ß¿.)øIRZcžbŠz°¦ÒšEkŒi…mzì<ûòY¬#Æ€r‰ùˆßÁ’åR™2ØùJý€2Û©<¾<|²_~eÊwBT?k~V)[)!^*(Ërãåìs¥oËÇèT×GìjyC|ÔC>š´Y´ÊÇÛ%™Z>bû­ñqe÷M[=µ]xjžhSË2Öü#‚öè ÆÈm<Ìœ}ÇÅRÅʯUÎm€si=iÅ¡5Æ® âK\7¹g·v»ÃÙëñH,Î"à}Õy"·CÅb»öËá-G@°É ˆE`Aá øq‰`l Ö>ìÌ þªrVƒYÀqãâ3NžLJ…isnç'Ò¡Œ¥µ ĺCzˆŸxô0»ñhûÖ6Ž äQè%`î€PxÎÎ+X‹WNþ.±ÑrŠÓWŒ0ŒhòÄŽŒu½™Ø˜€zñi9¼»ß©»xz0ºÌxnÓ–ôÑ<}ÒÝÁä‰lú0Oàêp?OWFLÌ{Ü÷žfôÕàt'áôòôRÂÉñø ÎáÎpÖžþeX3 O±ìH¼ž]vœÁtSåz©oÝ1öaŒÅëÆº‰¥/m¿vNǽեÂÓS ¿S¨Ï1^©§‹cÍ`tƒÅ£á¾Ížà>Q%µ¶½vt«ZëM¦íRư¨[—$Õ¨*IËðŸÑëÓƒòp=IªJ½^õúJKjº¼õ¬š^=½7åé%Ž7Ka'§k9\OµÕ~,²úzÊ¥ÚÝÆ TõÌw”ÆùJØßÑ#.0¨c°¦sP÷ƳÆÜÆßÁ¶Z¤ôWXù× KHµ‡Õ.²‡ÝíV_Ì{†5òÄXþXãÙ‡*eàü«Â–Ÿ³»e.à7ŒÄœ®ôœ=ïÕãÐ’ú¬oÅO}Æ”Ç()bsôÙïrçt}¹ÜÆÞ­6á] ·<ø¿ã¡/F¸´²œ£Úfî ö ¿=Í:¾‘·Âr«½ëï&èt÷óT\ކÊqêîðñ¿¹rä`Cú)šœ«”káÔ⯼‘Ù›? £lòÇW±o•¥9B’óF™nËQ/U¦Y†ÃYVE-á´BŠKü õ¬çxÍ«(.®®…„:q§;9¡£VÒ›H×1n TÙ:–¸ö9¨íß‹8.’…õ¬嬨Z’¼ä"ä$w€8 ƒ.ÈÙø^õóž÷Ü•!XŸ±µçÜÅÂñHàh“Ìä_úñõ0ÒÞøö¹ù#šaСˆ&‹[–!„Ò ·S™C—L†¢Æù2 ­¶D„5Ï$72úE,QC<Â)Ôøè¦X[ ÓßüQr2qáe8+_â•וBYôu] Â}Ù¡ösTTíá§PÄ ÷çèìøŽücgƒsu¸í LßËy‰§hmÖÕ®õ”Ï*ñ:/ ;m¸™Å#zk]´°§¢X3Ig3ÏL•.‘½ö” ÉÛ_ÔÍ|2z]$®éáÈéòV²9«­:a†$é•pÀžzVmý–l¤0ð,øpÚ"5A+Ú—ŸÜGú#]7W_qao‘h "ó~uÖWkz¤¦G6”ñ¼ÂzÚi~NÅÆÊ;È?§noô`ÝËà$‚Ü"¢Ì+Æ¿êTc=€òè(DãĈÁeaìW0I çO°é¶³‘8Ü]'EGà2}¼3RÎÈÁ¢Ü†Š¾SæÅ() B±0Q¹£Íl,¾²ýµ —œ³Šóœˆ# ¡XŽ ‡)w…6“)’µã–i9Ïé6:ìÜ^&°XknþÖ6/ yž ëßâ¸ë=d—ãÅ’}Õœ‡g„Í•WfÛªiñ¼ i³ZcÃ<Ù_HN÷L>2ïívL(lìÊìv®Réí­“êæ±6óg…°?ë ³CÄ™­é6ɨDä‡ymÉâë²ïóšž,e­…ʨKݲÖ}1«mŠ{x’[rÈúvyÁÞä8Ðk'R D³ŒNÜ]áí<_ïoub¶4¡¾ó=çî/ùœZpOP¿µŸãtAæcàt|‚%çÀ9»=«Ý Ò¶}XgöЮVTŹª)Ëð]P‹Ák¿9+핈֎í%-)M–BwVæ›pt|w&FM7…?Ë“ca8•6®(8a:.ÝÈoadg/:ŒCX>8V"©âQ"Üšo%„7ñ[¤„ÝwJ5êN®Vk[Áò^¢¢qͧ7 '¤5â > endobj 5750 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 5751 0 obj [ ] endobj 5748 0 obj << /Length 5749 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`4âC l?&@Ó@AÁìn‚Ef‘Îò÷#[´Ý-ú£È")[vuÓîa“*«¾z°H}þÓ×lÿùûöóã×ÿl¿ÙŸ_7uU·õøµÝ}zÿÒTJŽ;ÓT²ß}m¿}ß¼mß6/›—áß·h÷í¡ñðˆqÀß¿ý¶ù<>|3þÏ×Ç¿ Ÿþ·•Û?¿ýºýÛ߇?Ùñvð}cúv÷áßã!…4Ã/ï?íÿµùë¶¿ $˜ý¸»?é¶6­N£ãíØUì¿ßwE«·M7ü6(äðO3°ã¿?o~F;’Q­„êd£‡Ï}«»º1FŸ;e¿‚žÔÉáQ÷Ùö]»JöΓœ Ž•8P7üše =E"qn¢ÖÝÌXU¯…èv+¼ÎãD¥î÷í›T–FJæ½Ò*Ï@;ŠDÒÌ,çñHd¾kU[©W©Ó<•:PÓÊ<í(iS;pEf}cÄ~šÃ|“9f‡Jå˜Q*Þì)iS;°Þê%‹’'õæéøðºùüEhevöøõ—’½Q¼Óm¶ŸC%„Ú¾þ´ýc]+õÃöõ×M_5½êšÑ [dZê/°E£ÑÂçÀ>5¤­~€-°EBÚ MûüŸû`^×¶@¾Õx} ms¯)~¦ÏŽ&àšJ8¼röQ˜£ÏñR…ŸC‘*’ÎaªñúÀûàç<Åk½‚ܱ-ϯrÇÁF02Þ%bÚòbš‡;˜×X®±ôÞr™ž‘‹‘ë.‘«úÌÈuýÈ%eÇÈÅÈu—È…õ™‘kÈÕ6Œ\Œ\w‰\8kÆÈuýÈ¥jÎ÷3rÝ'rIö¹ÖŒ\š3ôŒ\÷‰\XÓ¹V€\]J†ËnñÈ?F;Œ¿ù‡(ÊÚC ÀRŽyíÉÊ@óè3Æ'q X¢DqÇ“OÈšXí!¯ŸííüÈÅucWvkΞ^o›yDá¼*çUo½9–öµ\Þ,ŠƒÆÌê&ã ãà-â ÇìkF®VòÎ8#×}"Çß«F®–w’ƒúà™bï=o 1®UÆy=@lÛð^Á~ä=‡Éö0w®nIKiTÊ=·¼ë¸à®#£ÝJÑŽ½öXØ[(ã-P²Öž»@(YënA¥Ñ³ó&:$Xñ[°E"ªÅ¸%ÜVJìã¸oM%G¢Ch_â¹cY¨ª›P-ÇÑ„8È^@‹…º®R}ý‘j œ…ÏYGƒµqÜL;´Ú'àtž¥Š´¦Ýa¦F|œ)nñh¦ Ϯլ €ÖO×# nu8ÀI7 Ës¢®±\Ð#;†¿­,þèÓ¨­A%G.Oý±®ªÛ[,°!É ô;êŸãìPŸgaÙxú +*¨‹hL=·sD?H·;¦ãkñ,†3Ì>g¢OùnGå;QÒ!àÌÝ„“”Ct-¦˜Áܲ†Ã''ŽÞÁÇXG8D<:4}ž˜eÌ4¬ p Dß+ž™‡Ë´GSð S>ZWGÈÃ|¦Ï+ üZMÿ訸| 'Üú&dÉ(î± S™t– ã-FL ä–k'#Ðg¶¯GÅ ³˜§ÕÅ'G",«ƒBޏP„"b)ðð´š•¬ç9–ظÝ'wÄá^Œ•ÆìŒ°€9ÈÊ=A RΪA^V¶ ½1½coR|gì<„›¦KáêE =–чâöß~ÇWózˆp-§xÀ$È· óÐëÀwÌ莨¦P–%l.©©Cö¢“´nq‡ð0Y@)™·Ï…°¯4Å ˜\/:…”^‰~ªõbjÒÔÓÑ®ŽéÊ®ÿ¶¥ Ž©¦›NÉY~G¸K@GBçýþ‹ç‚Ôœ*<Š ÓcŒ+ŧ‰0A˜Ées ” 2Ö)hCñ&9Vê ÝŠH…¿+öÂÓ1éû„Ü%?‘'á‡L5ÏÂÁ<&ëpÓXÑp²™Z ¬`žeqg•å~°5šŸåC_y¼ë$B+<Æ6«ÃÚ[Ö°,µ‰·4®»ŒÎ±=Tgç÷8<|MˆNâ ZÉ€¯î'ê»n 0FŽ)+ËœS’¶µu5î®C«'t¤ØöG?‹ˆCS’'® ; £Ýu×KØ<¤‡#ÇÍDƒe˜ºwØËr*!òõˆ}IG9(ª,²¸y«á"j"àl<ÈêìÈ'ÌÓÙ $•…g–]1ͲQD0P¤PfÖkÍYsº@Ü(ç+¦bL`z¦ÿd:R=¿K>ºCÙ|ñ¢g;o½=…/zh [P,D/'r£¯èáñ9%¿O–€FMJÙõ±0ÞŽrjùÑ’ÖNKæñhe·XH³x(;‹ÓÿÔE¹œN`žx€?œ¢|µ+óçT¥9ÄRðžZU¼ÿŸ %ÜBM9…ë9M9EH8c© ç€=§Iñý¢ðîÒíÝ ð­ðîSË·e$VÖóô´k¥ºã±ó Æ(ŒÅSô HåØH%9Ò)5Ò”R€¬»kÜ],D*ê­" ¾ÌާÅc”kÙcˆ%HßO¬)úÌy /iÛgÑjÁTrϹä@Á¤Ä¾iÏg^ë‰Kø³‚ûŠ2Žž8wªZX?]vH¤øóòCÈÔ$Õ†Îïá8£gñ±"Žº†ê±™YÔ°¸ é[51!ëΟXŠˆÕÅ»+}qÛnÄþï¹Øí )ºž¿T4–å.«‰™cbŸˆÝaŠi-ºl¤ Œ££,‡7/x˜V×b‡«ˆþ<¨Bçˤ«(1ætÄÊ–=hDAæùDk¡ÍÒ"+ëÙ2Ìr =Çõ 1ÛšÞ¥ºC4åV ð#øy+N.XëÜ=ÁyŠ^¼€ŠE2&Kã/áé@¢IGL¯¸´‘mN¯©|¯Å‘º+>«z§OÉ2¹N¯é£Â)»#·h-Y¬¥е<—ÉëÂ/ÿÏ‹Èñ‹E(%]”W.à|-;äŽç¸ÔŠò’gÌ7B‰šgµ¯¼<« (ϺŸ²AO™A–)¯ä&•²üGú f”ýîø2Ç'ä)\ñ>øºî³\x—§ÛN‘†•11õßvá’œ¥o¼æšƒˆG‘ã`žù娄ΕÌH95ËTìä)¥¹’ õʲe×£û·aú"ÊγXIG*.TäB)ͱ÷X;²Ô(èwéÞá{û6`ôÁ»?°?¾}÷€¶‹öõ í_¼xïí:ÿb¶v+†iœ»¨m5žðTõ¡zÏ1m[µç׳×ÐOÙUÝùM×îL˸JUrr®¦©Úq%§²~î9öéa{ZWV²VNÀÚ$عÑFIzÿ?Oðo­[pf†_P«^çZš‡§¸>vÅbæniÛ+@‚Ôí>ËF½“>¯— ~9N©Ä[§þ —p ^[k‰ÎÍô ê–D(×LãäË*n™“”(ªÖ («ÂÑFÙd‘Qc궻룰bhxqß½bó%§Íؾlþ$Ÿ‚ endstream endobj 5749 0 obj 3266 endobj 5752 0 obj << /Type /Page /Parent 2 0 R /Contents 5753 0 R /Resources 5755 0 R /Annots 5756 0 R /MediaBox [0 0 595 842] >> endobj 5755 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5756 0 obj [ ] endobj 5753 0 obj << /Length 5754 0 R /Filter /FlateDecode >> stream xœí]Koã6¾ûWè\`ñMEÝ$[ ‡AôPôPd»-ÝEÓ=ôïW²Çkù£¬!MQ vLó5¯o8RW?Þÿ^ýùµºº¾ÿ§z^¯ï7MÝè¦ÿ©ºß7ûp[ Þ¿5VÕÜu?ÕãçÍSõ´¹ÛܵŸ6Lo+/más}ƒ_¿l®úÎ7ý'÷×?·ïþ«xõSûß§ê×ßÚ—C{Ý>o¬ÓÝ›¿û7Œ3nÛößu…m~ù®úÒÁnÛíþ¾‘š7FÛ q<íª²íï~UÔYS)c”Óc¼§jÉñï›mk»aÔN2f´4ÍÉ­¾mÖ²Ê]5nt4·Óšb Y!t”†¶#baSc4þ¦¨¤·Âšžô¡”ßµLùöƒH,lGÄ‚f6·T[)˜0\ÉŽý•µ¼}oÄð3gâƒìZg‚iI œ0±¸º•Ý ©=scÔÔ]É_L䓧⻇ÍÕ{&…íáác;’-¬ô/ítUõ¦ÕUÍÚÿ>Tß7 ³?TŸ6®V-5UC}Is KnP Ó°îGÌwóGÀ$,y?lž~àLå;Ý ­Üœ©èëÜ>´Ryvãnšò°s¸ÁÜ‹¥–à±I<Šüó„<‘6€'I¥G›€‘RJ°®s¨ióK)”lÌË„”·:1åI%'Êã:Ørp‚íÂäÒñ±õöòáÖ:5¿„„- Ø€¥¢¹žoE<£Æý`Y†#æ“Fú¸ÌFÆ#ù`Y¶M>›32xä’•óxÅd èŒ¢ ŽI,¾ÒY^vÔÛ˜V•‚Ü9s{»ŽùG€×µž~r‰ºÆÒFìY$±xè‰,MÅœöଉ<¯ÓƒÃëÊîQ­§aÔp ïÇQÖ]+4xŠi$V¥Þ¸´8xÖòßd/å‘°)ç8bñŸÒùO-ñ¬¥á8ÞÁÚˆ#˜:q=8<‚DtËÞƒs«ØO¤ìÙQ"„]üu¢8):• ØÚÅÍ+Ñß(ÑÌS¹½Jo!g.à,%æ¬ÒûÁìÉ%…ýPè†c79¯†<«‡Ì½'Ö°ÏîYOa2=ë.q¥ä†“vz0­ Z‹ë¬µØâ pL’¬PÜ5XÁw¾c õP‡°³Îptœ’yu¼N¯1eF½S<<ŒŒ®{¤Ek½4 Dº=¨‡‘ŸàÀ1ɸYVQ­PÊsά!÷.ášÃ¶ÌÌfÞË{,”X,Å.Kì£ò´å +Á¾”»²cGõ–×`O<-ãÝÄÕfIÙî\ðãÒöØr¶\Ëk:Çû1Qñ0¡çjr’Y@!åXr޲ÄiÚpig(ëìužÌóÄËŽóJOY\š_©ãÉBËû„¦e2$º¼Nœ"é3æ0SQï®ðhá–0R&Ñ…!² ”ÖéEF3Ñâ{dä{¤ÁC²k’p_Ø2;=ž²_ëÕ:ÌǨV^BmÀö×I5ê¸ç\3 5¥Nʈ‘ ÙL¹fà"$Ú½Î5Ãò±-†½! ÒÉ-èuqÜOÜœÂîo²»upÆ)>™KàL%<K¹a7®–d³7žÆª }Š„¾"7©Ï®ÓWÌÙÆfmû°ÅÆ1ÓT˜Aá)áì¤GFñL±-Ç‘!Bæ#E)g‹<§¨JNYdŠz´„rÇ0>­B9}ƒµ„¯pÊ- ºº½þ”+7ÁDô^èR6}—»ìŽe­4WûBÑ ¹=ÔbS7@‚åË}š¼¬eÿÍ‘êìµ*áWq½¼ªZp˾´F% ·&`Éé3@co^½%Ð5göÔVm³$ÂÂþäm:Y–|§AØQžÂ‚£[„ü Òþ$öeò~N‰•ÂM󄱡ϑÊs®¸8D(‘cÚNÓv)ËBñØ=k‡I.ŸÇÛOD¬‘öbtñ£ËÄÓí–4È?Á%ÿ$±›E‚ç’Ÿ)=7¬ÍЇ³­iå#§ öÔf˜Ñ„Ë~Åžƒm” iðÏሩÇ;ÆZb4ç©C¹Jˆ°±ëITÂÁæ¸ ¾8‘¶–,íÁ#˜z`¬MBŠY¡í( ¶gIŒHc‰ƒ®ð£¤¾S®nóX|JR<áê6RÂ%tˆ)&Ũ ëª(j¡ðqù£ž­Ë”Ür'P¾xSÅ›ºDo ÓºxSÉè×›JlדØhtmYñ³’ûY cºÞ]FT0½`:Ó)ð¨sö<%0=—á$\<xÔ‚—ÆÓ¸¾Ãª1' ²Øçc$Y ²dY5²ÀëÅ ²¼BdI‚&èRDlñ1ÚIJ]GšÝÕ`í ÚSÑ>k&ÐÀ#o¸„0‚uÆ“×Ië‚ögÁ°«´JÜú"c&èÚ2Ê#¯Ž sØ2[üÆâ7®ÞoÌùÁ¿8~¤ð“)kTÂÅ!X³ÖéÓ9ˆ-%çcCƒ®X,¾ó«ó¹LÙ™+>×ú}.ÊÅkqkF¹„SgÏ¥q¡ø“øv…FnÂ.ÔCHÂGÇÎs&K`|~m|\šÃŠMr«xzÅÓËÝÓóØB‚tI)!®ƒë×!\öL±¤«Ü <]§O[äm­òVvçÏâG˜i*–crÞ/í]Úóœ5¤xc¤ËþaV³ÇbSFP² òX¹†—ÓŽ'Õ)롼×Cåk]YÎý<Ø&ƒ0V|ô׿ Ùr7æå1ï)yNQ}¡åQ‹ò ¦×ƒé©¨“Ò:°fzoðBíò–¾íoõÔ²%R÷…áåñ³‡²c–4/,¹ó2Å[u’›VW¬Æf ÇtY%vÇi‡Q­k}ü>y'ëž2#†rS›Ã+½{¢™#%}xEˆš»ƒK©‡ge¨Z÷wL¿”Ø…u¬Ó›ÃkÞˆ®èP µÖ‹Çþ'7ð»ÃÕÙGføÕ’p•04á0ÿ¼:ÇæÌ}ÛV¤®{ÏÛ%¥*ØŸ›/ƒ9òÈÕ.Æ9"ñÃS[ŽP —`Þ—ž›é Ô,‰P®‡ áçÉ5–U\2%)³F-°N@Ye#m®¢•Qk]³î ß +6M 3woHw11£ºÛüŽï™… endstream endobj 5754 0 obj 2593 endobj 5758 0 obj [382 /XYZ 40.7999999 372.499999 0] endobj 5759 0 obj [382 /XYZ 40.7999999 372.499999 0] endobj 5760 0 obj [382 /XYZ 33.1199999 147.860000 0] endobj 5761 0 obj [382 /XYZ 32.1599999 149.779999 0] endobj 5762 0 obj << /Type /Annot /Subtype /Link /Rect [118.560000 345.619999 197.280000 353.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 >> endobj 5763 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 116.180000 68.6399999 123.860000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://clisp.cons.org) >> >> endobj 5757 0 obj << /Type /Page /Parent 2 0 R /Contents 5764 0 R /Resources 5766 0 R /Annots 5767 0 R /MediaBox [0 0 595 842] >> endobj 5766 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5767 0 obj [ 5762 0 R 5763 0 R ] endobj 5764 0 obj << /Length 5765 0 R /Filter /FlateDecode >> stream xœí]Y·~Ÿ_ÑÏÔj}AíJ ‡‚äÁÈC Ç1 ˈâ‡üýtO÷ÌÎó‘¬â1Çö öλyTëb±êí_>ÿ³ú÷ÕÛçÏÿ©¾®¿Ÿ?éšå§šÿ½9ýBµ’ËÇ~hk9Î?Õ×o»ïÕ÷ݧݧéÿßw¢Û¿¸þšC,þñõ÷ÝÛeðÝòÍçç¿MŸþWÉê¯Ó_¿V?þcúõÓÚßüÀ·Ý0vó‡ß–B 9Lœ~šÙýý‡ê÷i þßùÿot§äôRÔ<¾_û§¯¢ÁšªíG!d5ý7ͳÀñßí~žz;N£´ª—­ž>î›väô¹WëOÐH½œ†ô ª±ïªaì­¬õ†u%";Uß'éh?#·4ÑèÞÝUJtŒZèýÒµŠEDZ«ht m“¦£yF"ni+:]ÕS›èg4ï¹yvCÓ í~™²ãúÒU$ĆFŽ*MGóŒDÜÒлºª‡nýŸCæQöø›†œ¸j2 wbfo÷Iç¡§h¼tC’MºÌHD­ì€_³§OI£|Œß/>}Ù½ý(´f=àËÏÓDöÊÄòë˴ضz3 HÝV_~ªþÔ4Jý¹úòën¬ÛIl´‹ö±´Èµˆ'zK{k4ì­‡-}œõH¼Ò¶Àõ`Xëw°·g7ƒ¿ó¶À¹ápðÓ|d¼#tg­1½á@lã¹9pš”â_D¶`î¢ð \lÅ܇/¿Ïν;í§$Â8aQæ laþăú0€;SìÚR„^d#7i¿IûXiÏhiÞÓaíà(Œ°¤ð]®4­t¼~[†wJQZÖ2°åàÄÆxÄ|盕Á‰ØÃ œ`ðAwÐíj,ý°i,›Ær óK¼c?cJÄûù–õŸƒÛ¦MeáëcŸG›Ú| E峚[7 ì50Õj/¶6 lÓÀ<ò÷[pƒØvìgì—ÁãàŽió8L£˜ñ8`ü`„A‹[àJuÃÐ9!ÊÒƒ7êݨ÷&¨÷ÕY#YµŸ¨>âùŒÇÓ²Ã,û®íd{JáË^Ì¥öu¤M©üò®hÌΖ•êZ/}Àmä¿kO¤….(íj)Ïj¬­„ßÖJâ háIÃùÑØšš6Ÿ0!o£ÂzÂìT~(ƒðNd‡.0ÀáÀ«”Š# Ǻ¬caÍBƒLñÊÅâsòÐƬH&eYDà=Æl8ÔlÒNæÄAÌQuÒ`öî¹"ä´ÆÃX¶ˆˆð(aƒY{ß"o•”¬¹Zã6)Þ=Ö²à*lAhígL„¹b1#‰1rb‹‰>âŽî­IÃñ´2A‘’…S°•BÁÀbfO>¨ÉeåBÔ­îæ~P §SùõŠ×çW,rÁ|.¿t™4¥ GÄHµd3¶‹—Ë×ÛýÜ"K×Ų™¡på1H(üÑœ«c£½@yÄuc`1T7–%‚ÌÎtö,G ,…B¢’9ìÑbWœ]ë›cF„‰ÆBÁZä@,©únI¿–ÔÝ`Ó›%-iù^¸Uäµ°%@I²¯8DA0qRto;&’:ÒXÀ 7&)𶳨È~¿yAa [\ŒÂÖòÀÈZø"†z›s_øz2 ÚúB€µú’”]ˆ´j4…F ÇêW3-+!\d³\j~Á0²üâÌ1‹à½Z4u׋s£÷p|eË`ó“o¸»å5O¦Åúcv´>D×qbvX7ðÙßÕcv8g³Žõp"Ó8矜{±8ž®`Ęî2Åâ¸#F”ë¼G `<âóÎo<Æ ÇnÂqa÷3Ài)²gÚ&&Êò>96Žiâä+pÜ!Àô×ÃàO,ü`^ùƒ÷ ƒJÆžaÅìc)Œ¹Œâ“XJ$½O  ¤ÄÐnƒÛI•EC(•Ç9ã=ãˆÎN»ÓpÛ4çÞLÊXœ…8äp‡Nx)vÓ…nArp»¤öÝ&…³ì³!Àv|=Rß Ù¤ð+’·±7;“÷"­½é& ß–ƒú°Ü„³Æ·¹ZÆ;E1¬^Ÿþ>µLI›–ÃÓrî4'å]•Iáê+-ʉÛ<çU×׃Yù{8çU¸…3·Mw¾SÝyÃ\rÌ’zNËáKä›·JÇí”ú>lN-Ç΀3g¥ŽŽsr@­Ä‘U™qjâ€NÒXÍ Ü¬À{°zñ¨'õ·Ì!Ì3ôh|pÓ7»í!1wu»íFäG»År܉Å6>¿ƒqÊ©_ßÁ¼ÆAo œr8'ó‹§m–Éf™Ü8Ü8y“YùK[¯âÌ`;oóé½"wjS>˜ UتÝ$åf¹yÚf»Þ+æ®n»n8MÓ×£eݺGdh2Eön‘Ô‘¤÷òþÎÙƒ§IÙÅ©ðP7¯ÃæuH·¢Ü[æ©[w¶kRn§±œbð4\‘åúœkÓ;7+ð!1wu+°ÇG¹u³°ûáp|éHaHHï¸Ì;²FN–ŒÃ¬Ô€…2ÀzíÕNæ‡[ˆÄ«9Oïy÷¸…dÜ_ŽˆZ—i–uTIêÃk¾È’è4yza™ÂxV:ù€¢ψ^£jS…o˜¤y¥SÉÊ))†Ö1•5'¥(;€FåV†lŒÝ”9l´r/‡×S¨¸COÊŒ9¥˜HDq';K»¿¸a’ê=þ™Y‰ó“–J‰ðôêyDK‚’@!lÚQUÅ¿÷®Ã2 ޱ•¦‘YßÄÊ”]r€“\ãc(oµ¸•¾ Xãx€ÌVÎ*li€}*´¢Q®„`ÍÀ.RH‚5K)MIÐÌ ø«–Hé]&g p˜aD¡Œm&¼º¤]MÕâÊ{ïrœ/m-K Vñ¬â™ÖmÀ¶º£æLÒÚþb²ôòt9Y»nMÞ~-§ÛíyÅÂŒãÃS" |-¿±¿¦MT-]Žß€S™Í":BÁ¿æz&?yÙÊLqÕ2Y%t’º{8Ã0”Œ¨ZHÖ²ü%¥Š”°Êi7ÒE¶ºÄ©>›×ëUÒ-«߯“oÕ~û¾<Ú>Á]H´·Ï¨ÏšÀ*½Ç¬LáãíÖRUÒSxç-ag9y´d¨MIäp Þï­Ûž€0†JŒ—Cv aŒÇ!¡KÍòóõµ4(ô­Ñ‚{ÃïHßÑ;Gd*s»¯Ä31ʼnuÒ2¢wÖ°¡Ö+-¾¼ó [ÄJ¾+‡8iQ+[‘¦Í1· ¼/³RÇ ð;Oh=âš5žž ÖsxÖŽ`ÌaXù±(QBXã•âq0~0 zÆ^èP‹cnc¹9Ì‚Ío"8 {Ì‘Ã! „=–µ5k Œ#˜zÝNsã”äÄÉ-ßѪ Ô˜“X :vt†W½¦DxÄx4XVïQ aÒœ»mÏg¼.4#Vši^hfFýóÃÌô«o;%Õé¿í>g"ºy ƒèÂýiôþë›æÑZ Æ,?¬˜§`€‚ÀøÃ]‹.Í,šÃ~%DëY4ÀñÅqNÈÁ:Ö[üâ例¨%!rŽ$‡ì™åOràÂ/¼NR‰ü±¶‡!t)üLUYg㘤Âì8PCíŒfÃì£<”€Ç¤ÁƒkfP¤½ç“l¤¸Y‘$àìá9WLÄ mhSÄ:‚LREª…[@*tókb5ºõCƒ³÷ÃÿYñšVh/C 0á½=(î‚…Cˆ N«*d—qb ³e% ’*=gYŠ Í²G¦y³ÈÑBNêÁ¸ôËIãHùÃIî/ãârŠŽçø 1§ü' .P g½®4ëe2iБMéå‘%Æ9ÆÅ¬6<ÚÚor3Xô”KN„2÷‘®)t:9˜|Ë"/x[¯tJ›è!î2'¸éMÅWá.œ¼œ|˜}ãV)ör÷2óé7S÷dn›©Ë§¤±¤$ôÏG*™EÞ(ûµQ¶ìcè…S­À‘ƒWdØ8+«ÔJ9ÀK¸*©Ï‡¼`Õx¹9 ¯"BRÑc.ï_+µÅ+á|Œ:s‰ˆarDôÄDËâ ’F¿ÊHvßá–—õìÇ”i¯(Û'ä¯.^çj‘†§® 8ê !ÚÝ8d«V­Ú‡¿u=L„Óõó¯~ví¿íª®;\X:|óu×µµ£œ3ŽžÒg½èÓ1¦ç׿åüZe¾-¬1ÄüŽ1“é©ñ¬—ñ|Œ_vO?äSÄ{ª=¸ÇTÅfN£fSÎð“¶7!e¿Â;w!™ :_¸2–F±I’ÑÛ É‰IµK¹yĹéTJ¾ÇÛ Xv/ÏYv¯.±ì¾5ÙéôŲç§ôY/útŒ#ËîÅ%–Ý7ÖÍ²ç§Æ³^Æó1ʰì¾?ÇÄ%†‰Y)fæØÓ•C4”`Ù=¼ õjX6扯ñ¬ÓUßž;‡eO2ša˜d½óqcÉ;ƒ/¥¹­“Dâ×ò¢YwÂw6+2!šñæ2ÙŸxŠE ÷üçZŸÑ– \¥Hb8ÜQ) û>¡` N˜ òáç=#]gÒÄ ‡í±‚ ³‡¯ÉV0Ì”†¡^²ÒÆ^-ú>æ~ФtþÒA, k¼‘RžfeŽ5Uæþx´ îû \Á³~´pïÛ”ÝØû"ejÈùËݱNØzû^¾0–Áüflgr˜ÓGFã‘u»ŠþÀt^ú_¶‘8éî°±lþ´^µUµZ8âKÿ' *”kÕ£Ûæx?¦0pÔ[Áwpàž5‹¦?•’Þ;VÛ¦[¾ƒ>ýû‰”mÂ,‹ŽDP8ªÇ*¡TÚ‰pª³pãƒxsSA RX.Ey/Vo\‚Y©0Çi“€2O B™T¤YáØ•«W@LÃC³ÔÁsŽü))2Û9è4¼Fj’ bç”–Jº»úÒr*ÕkÂÆYSþ·Ôñã´{1,g ‡v8"0Üce/8¼æ0e—ZÃä•ßi4UzÁŠû<üt‹3Ö1QDÖÂÖ¥d 1GY¥ó0'¤ÂüÇQ­T & › KOáljªØt—ÉÍÊ€‚’Ü›w3ªVhÄz9ìp½¨~é¬2½È/4 tmÖqÀãa&›Ó¹£b1õ[Da¨RÔ‹-zÅ"˜@¸.¡è[‘ 7”ÄÓÛ;So{ò`¦º¶~Lâ•è6‰Èç8®Uï9ÅyT> endobj 5775 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1738 1738 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5776 0 obj [ ] endobj 5773 0 obj << /Length 5774 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"©ü˜ C€ ääx³ ñ"“=äïGÝ¢ºÇ¢>Š,)u·fO{8|ëͪâû?~ùûñŸ¿ßúòŸã7óóÓ—CY”M9|OßïÞþBêBÉác«ëBv§¯ã·ï‡×ãëáåðÒÿûz͹£ùÑ7ŽS þöí×ÃûaòÃð›/ŸþÜúßQÿÔÿï—ã_ÿÖÿøÉŒwúƒïÝ5§ÿ>)¤îÿóöÓ©ñ_‡¿üîøk¿}÷ôﻪ©êRVQëx½tçï·]Ñdå±ÖeÓ/NÙ¯³îÁñß~îG»,£è*!Ú¦jKïQ[yV¨c×6ÇþÓ1­­ù$¢ÒÓ@ýŠDÔÎDYµÎ‘Èp×ýÀ§MÖmì.Ç‘¢ÁÕ•LxZ‘ˆÚÙw8R¡+%T+ëêt'ø×ZËþs«Ì—ÿz…èÏiãªÿ·õËP±0uÇsªç‰¸­™Óp E%Ñ–ò¼MÙs·ÈŽCEC¬“LgxZ‘ˆÛÚz<+%tª Q¡ù ¶àyž kÃ;Uœ«.?ÖpžÎû`xrf?O_{¬ŒÄ±â˜lÚ ’ 7[>Œ˜ýÊ'ZÔ„ƒÄ;}b=&oÕª)è!/¶¤Å’ª[“¥bxÃ¥>ü‰WZÏŸ8ô<ºó”­¨d†¢,šVè WÈsK[”€éδØG”ç==ʦçiK¯‰‡ÅVSAwU¿¨ %µµ³ï쪨†YÞ0îvºVÿÙ}k49míè;Ý›™Áð…öÞcx zÓµâ£Ç€¶‘â ß-#…Ñ+fˆì"*Û¦n~\Ú¸èméBwå}$l±–TµèOq ^R¥¦;ÎDmOÞÔf#ìMBúNI×ÁÍ>%ç鵜0u{y¤ЇÄI¡}²fñØåóRL4Æìõ¸t !Šºj~”šË&rÔ<¶c›4 ùe*ò§@Ç&¬Q1L‘-2(‡÷€@ÂüÓf¯xbÅaYJYƱ‹pˆG°jš µöÀ5Lžñ€„èŽp­ÈžP$iÕLõc=Õvƒø{j–/l]×"c‚=m«1–ŽË! 3ý½J,lŠÕ B€¡Ú±U2Ø’µ`=,®…Ä(c´ ê£èæc/v—)/Ñ(åðuÝ‘F-å¸5c-ZÇÔG|€}:Ôg¼PVÅ ½íiT˜­È«ESUÊ \S¨3bxõ¹†L÷cØæÜ $ìÓÀy tÌeì tðÚ ¯u1ЀO‹cÕx§øàNçç1ÑOº¨änÊ`U5êÔW|“pÕ¹0¤ËÄmµl“Z4–°ã‚3Wë^ê¼îF[ÍÀƒPTÍ`oDˆBpÙŽ·…û,úQk zaqRr(ä6€)¨ãý°`™ÆIÎqÕ@ ÙNø°«¦QWŽÃ%hø¹9×î$½mÇ\&'iLøDŒ;‚ÄÝýÃQX#fH¯°!K…ëFhjUŽ(k“6£õd/{Ú _Ú ÎÁÅûYZf^Â9ê~ãsnn…¤ŒÙÀ±@‰!F»Ó–LÝ”8;4¼1…çÒó{šãœjA-™»††}ð<Ö ®=öeäjØJ¦ÃÜnføô–½A¸vD8õ*" ¬Q#Çk¤ÈaÓ’Ȳ4PnFo5V÷å °D<­er%‰ß²ý6Ø òÏ`ñX<‹Í±< ÖsY@6¤7ƒE9!§€‹dJ˜ íÌΣëÞ$†r_]Ï=èˆV³ì kB°û­º•.â颰^G[Œ6ÄCo9“8ܨ!¾1B”PjßX3 \p°t”“kÐGšÔ°¨èJH.å+Iê³Í"²œv‰žD¢ç"]»xd¹ ƨ\Ï{Ò"Eœ=Œ@%íëNE_DšÛ9%J5Ö'q8~n:ãÜátÃÚƒ€hYâ\oIº¦¢£ù±{ÇBxþîó&e>ÙpÍ÷‰Y4Xc€¢"73¹«“¥>TÚÕÛ–qÙ,^_hÏÐæ&¶Þ=vº” aQG±&ÉQ?„·vkwš®¨asØ ¢øC2Á5m¬Üz’Ê•<#J­Ç)×Ož+ÀiFóžKIŽ4œ‚Ó6pªGgÐJ Zsû!¤SP’gÆ`‰‚qæV-Рĵº×@A>k«áh„RBížB¦ÔÑ£æ¨wP; ¼8ž6@'KcÆh§_V(ÛÆußNùÉ{±böÚ+׺K(*ê²žÈŠŠ‘‰À™¦AIb§TÆ ÑS’;­Õ ï¬Z·¡´ž›ºÁâq¬¤Í©]>óõê”Q"M"JË$Òâ0è1Òy{ÊòªµžŠ«€¤cq•¶:æ Öb¥–á´‡M{ȼB•å*òQlˆgÞß—@ÉûNX4ýS\[–Å3n{Œ ×%ò³?¹ù[¶Žªº®ª-&P‡ û’|G™­ŒåBõ÷¡þl˜&rKºµUÃÕõ¨Ô‰]ÿ‰ÐRý\WpC\ç!·µéÊ¡¤­ñ´, A¶i5ñE¥(Qô:ž×Qþ“`$T™^Øâš»aÂŽñëÂ;\–r;¯m®âìÄÍ2}lû›%ðŽÃ>ÝS™}øyÄ…Ç+”b“؈ (pŸøÐ=1+q¦s’²+=2@B†.„“‹•FʉXÙNx‹?b°Øòw#ƒº šðµ®TÔÀ›•|“§œ'®?ÊEuçw,J3…§ ]ë5ï=°‡¢‰pV¸MúJ¹žˆ’ãÃÝ2ÄÇ€Vþn %½VFÌ—E´X.XÈkÍ\޶…-°ìí¥Îk@Ù[£Q• VeøhŽRÆx?°\p‰[dø<ŽRÆlAIXq}î c†¯Ä8¡È{ÂŽ2ÖxmŸ -p4wê(c½z‰m QÌ7s¶BÚ4ÓæÆŒËCσá‹1)'OÒ]|IüÓ#”-X9N ÂWa9¥›†»|&ªÔ™Ï$"adäêúÌνAñCF(VÍB±Ì÷|ˆPM}§PTlQPÔÕBQfÄŪTw E£µç¢”™¡HÒ1¡-’}Ï·ÀUc Ôa—±•¢ð8û*O±ß"`5×RC†XÁWbÒòM |oÓZÁ§Å‹9-œªÍnufòÎ8úÐ=a|ú•ñ 0¾8d7„¨Èɺܶrÿ3//žëƒµ³Œ6y­FkÒá™#è,+o¿aÆË¬øÒV‹øÂ|†±÷Á²S*A/¦HÇÙS%å½°vh)pmŽóYŸ6)ÖÄkb£Í…ȼFŽb7M‘ž$ѯ^ÙÀ„ø;;ú, ü68\=|ú.²öý[x:å&‚i#Ê òäˆGÔCwp¼üÏ-T­žH‘€Úÿ!ïâ8ÿÅ$E\»‘õ¡×;e²ŒÒ3à®än˜¸R}6»©MqW\Œuæ‘jÖE{ÆÒ \,ÈcèyDÑç­;›²žy*ì*–q‡¤ÕXuƒpÍÿ h+oÄæÒ˜ísÉ‚»v„¤IÔ&–wRCžžð?9žwÒß‹¼Ò‘€ÃR‰cÃtQL>"­&À¶’t²âžÞsËO¤äHb¤åxV-ªÄò+«•ã·LÈŽ² Œå¨VF(£ç°J\¾á//l°ò%oÆ5Çò”4H¢äTU¸Ê#Ï’Ö æ fOáòÖQN.àÜuìªj1wÃs}†áƒýQ-l°¨Z$sð<ŽýÀbø²­ªáÚp .à¼èÅ;FÊx“¶¹Ä‡ß¤Yó ~ÁÂåþbÎròY¿0U3‹¯?B¤ø0ÄÄ^9~Q‚ô†AcE¥¸™KY°Ój]Mc¸¥ày]0ÀOP÷ÄŸžX(ÏŽ­UöÝa["ο¨t̼+;–™ œN< ‚/dÙ>ÎÝ9¡7$mÙNÕ¶åê²,ºCÚh¬˜÷Ïï1êiÚý…@±¹[[æS!§ÃòÄâÒŒ È;Åñe$^cYËåÅ<ˆû)ehCwÐÞŒ s£ðKâ,Ýa‘*cÀ±cý„â­µz¸oŠä%^ògÉkÕ¥‚ ¥>oM\® ‚™F ¶à>ŽŠg«\¶õŃÇ[gb¯Á\×gO*J¾:†(ÎÅ$Ôè“p4L3ŽlCB]KGN!!ãRÁŒnÊi;2º µ#sá>SG–~&úQ8õÞà†kDà\YÈ•P¢˜êY% ƒê °Î%·%Ö~ð~2Vtj;™"7PÑ)L²`Ž‚µ¬GS*â`ì#P:¶%6Mgn'á~*Ük2X›ƒ-Æ-ÃÛmnx§¹`M9Þµ9N{²@«íØF{Õ2× ’T- ÓÆX«X‘ôVkæ6O"ß)•g-¸jÔÆ5_Ý\ ù¬Ïín³²Ö‰)Ã(U¬(Ú ¡&âq”SmW^ê(~Î8k£"pžòÒŒ£"2kÕ?Jõ]=bê†-Žúy:ÙïVyXòЙNS[žù$|˜2`5m —Æ÷£;.Ó¼…Ž[ê|U_e¿ö̸L²(•H)øOÀ>ÇK}¸í·­4¸åÒ…ÞÿÕ9ŠG ¯<òžÏΈpã…%Zá&iîFµ üÎ \AE‰gÉ©{È4öÞ²·ì-{ËÞ²)ÝÚ»î±ëÙu•æU´½eoÙ[ö–½eKºŽ5Øu]÷ØVR§yasoÙ[ö–Gk!ÝÆP^·Ä‘|”[FÊ»—x„¸RÛcÉ©¶Ý –?N‹#{›P½ —Ë«]nÿ»&É9î|™›/ß4–gÁe!êܸLÈ´rD£2Ep '­ïl§ŽH¦Lq¨¢~ü¿ÿ>¾öÄÑ#þéÌoßÔb“Yy%³'¡9».R¨nޢ߯ÜcHh†z†GUN x7MÑÌ¿ ÔUÅ‹¥Ê¶h§…® µ3-ÃuR…ì&Õ.M¯ºh†Jd×–ΣaŸö´•…,ÏEܯ-áh¦ ¼…~skÊMÎìðõ1ï̵´c„õ1'²w³¶3D`Ý鳬ÅEÁ¯á|0î@<0)‡3x à990ÒxfŸÖeSˆÓ(?oÝ—›kySõí…“Ÿ_ÿ­(8% endstream endobj 5774 0 obj 4266 endobj 5778 0 obj [384 /XYZ 33.1199999 322.579999 0] endobj 5779 0 obj [384 /XYZ 32.1599999 324.500000 0] endobj 5780 0 obj [384 /XYZ 32.1599999 287.059999 0] endobj 5781 0 obj [384 /XYZ 32.1599999 287.059999 0] endobj 5782 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 241.939999 108.960000 249.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn2 >> endobj 5783 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 233.300000 116.640000 240.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 >> endobj 5784 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 224.659999 205.919999 232.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline >> endobj 5785 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 216.019999 222.239999 223.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 >> endobj 5786 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 207.379999 194.399999 215.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 >> endobj 5787 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 198.739999 161.759999 206.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 >> endobj 5788 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 190.099999 168.480000 197.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 >> endobj 5789 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 181.459999 130.079999 189.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 >> endobj 5790 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 172.819999 132.959999 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 >> endobj 5791 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 164.180000 154.079999 171.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 >> endobj 5792 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 155.540000 168.479999 163.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 >> endobj 5793 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 146.899999 257.759999 154.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 >> endobj 5794 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 138.259999 128.159999 145.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 >> endobj 5795 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 129.619999 133.919999 137.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures >> endobj 5796 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 120.979999 139.679999 128.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 >> endobj 5797 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 112.339999 153.120000 120.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 >> endobj 5798 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 103.699999 222.239999 111.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 >> endobj 5799 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 95.0600000 183.839999 102.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 >> endobj 5800 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 86.4200000 147.359999 94.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 >> endobj 5801 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 77.7800000 195.359999 85.4600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 >> endobj 5802 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 69.1399999 219.359999 76.8199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 >> endobj 5803 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 60.4999999 148.319999 68.1799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 >> endobj 5777 0 obj << /Type /Page /Parent 2 0 R /Contents 5804 0 R /Resources 5806 0 R /Annots 5807 0 R /MediaBox [0 0 595 842] >> endobj 5806 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5807 0 obj [ 5782 0 R 5783 0 R 5784 0 R 5785 0 R 5786 0 R 5787 0 R 5788 0 R 5789 0 R 5790 0 R 5791 0 R 5792 0 R 5793 0 R 5794 0 R 5795 0 R 5796 0 R 5797 0 R 5798 0 R 5799 0 R 5800 0 R 5801 0 R 5802 0 R 5803 0 R ] endobj 5804 0 obj << /Length 5805 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ÐÙ€µ|?€ €g½ ‡ƒ] #‡`lÇ0¼FÖ>ä¨EQ”ZÝ=£Y`§§DU‘Ū"ëã£ßýíÓ¿›ÿüÙ¼{ÿé¿Í‹ûýþÓµH þ§±ÿ¾ˆj)é?JÅ[¢íOóòåòµùzy¾<›ÿ¿^°è^t¿ÌÃADÏðÏ—ß/ïzá—žòéý?̧ÿ5¤ù»ùë׿‡™_?:~¶À—‹ÒÂ~ø­ÿ€ &Êü1ÿdþrùç7Íï¦ ªãkÿÿ– .1'›êñu|wÿæ¯BÂPÃÁŒ5SOnÔñÇO—Ÿ ·±­bSI83Ÿµ`q¥ˆù,©û)’$‰…5E–¢E‚¢ö–±ÂnŒcF]ð¶¦aÄdžU«ÆÒvCq'÷ÍBõÍÔ[U?±ÚÊHq¹#[#¼­iNõV{z‚iz¯Cb"Ãf-îÓ)¾W¿ZnjÚÐ0«V ÷~.¤lË1Õ&"f¢j$†#l¹T ü\.Æ Љ;r_1ø16Ô]McØü$Ä|“†5ñ^î(޳UuTîn¦#Œ®­4i8- õ ͼVÄLœ>Ý£êâbÕ‡Œn¥zSÙÌk%ïUõÛ­>Õ7лîCÚõP£;Ô9#Úâ]ðï•ïþº¾þ×äxdÊñröôùòî#fTÙ”öóÏf(ëòâþ×g31ãÍ·6×3Ó©Ï?6AˆÒ¿6Ÿ½è–k*yŸH÷OðÓú'HƒOÈM‚OÄú÷à¸nÀ'×?k€àZÃ% `VÈÁj½Þ‡žP°Ö¤ïÓŸŸ_ÝÊ¥\ÖÕ®O`oÊØ?¨ùŒ]~_á3` ØwlI«ÚCÙÖ§ÅÁ–”±8&ºÊĤ냭ìa¾S£7²k/5:f|îSØv*êVÓs°À–˜ñp†×šÂ¶ë l…-äÀˆb¦mgç“lDãíŠ(pô®ðôÕN͸[ÁÀó´×¦ÑÓÞî@;Gé`ß¹ÇâX½JpfBàq|RS·Cg”Ý͸ûvždfgÄ?#þ©ž=æZ«v)á'ûŽÕFäGß9½Ê8•±K8 ÁŒùÂ>Ëñè $ŽpŒ®Áä3njË’mËðj ŒCV ¡5ãYÍØÄ_YKa>j Öè}ÄJôÝÌôÎuÿ½×ýk¼^cËäð;ãs¦¥°?Ã+BºÎD.P£øÀ} ”©Å¾?÷1äÖýOÏ8Ü3VõÏ¡c Ø²+èÜ—‘³ò*d©‚Û™-Z¹Ú²ûè|²{t¸cŒòö¹À=câ Öœ À1 Ä(üN…vh°= ”à ehËnª = %|¬lå‡ÚÙ²ž~b”'F¹PƒWˆQ2AíÿÄ(³öÏeÍžñŠ\ëÞÏ&1…ï'7yLLï KºÔÊ>z&q¢V;Ÿ&ÂóØÌܬÛ+Í$ñ3¬7øÙùdïøT“3œˆÍ•›cÙ÷켞ë·â¦?k¦úÀÞ¢[Ö³3Þ÷Ö®– s«éØí¾e…ó¨›^¸÷¾÷’Áït; ƒ×˜ŽìáM7Ÿc]]ft ¯:iãà\<²>jºí^ÞutMìªÙ™¯¿fNÎՌ׈jÇô½fÖç.ûì.›·‹±>·ä;ï0¬¡+Î7¼º›ÃnžÉ¹cL“-yÔ¾û[Oë{sÖ·é š[ ÓúŽÂ+2³Èšq¼b÷ã¡Öw¥sàYÊi}§õÖ·é&›}¿½åž­ïöyÜk»»ûA5z~;Èò¬m]\?»¾‹óW]é^œš{ÞÎx{`txÈïÜwÕáÎﬢˆÑeëÛM…í²â`«ÐTxž¶ëzçC¯\Õ.Uc¯±ŠãÎ(ñ¸ ÷*Ädªž )nਈЏ¦`9ì›^î÷gaÖF§ÑÀ'h·eÕP’RŒêôB0 ô2k´)(Ú ‡‡FKDè­›’°Iv×§ž‚ÜèAØp:èv‡Íêä6—&ª€?€• Ù: %¸¥ý¹ÐãRìgCá>˜:»ÎCSçIÚØ>¨µ"¿ŒãV)Ôô¿$ƪ§Ò¦/hÊËEècM”ÂM¨9—á¯^†)ßÿÝ¿Öo›‡ Cy¹5±¥èœ‹ßŽ—Ë/—§o<àH'¸Ì qù6ZÅz‹–ÜwÚÔ™›šé›r3'FËϽevUÂÍ€Ù/%C†¬Ö(ºÓ³pV‹…ž~»|ÚèJùþ tÊ4mÕP"04gñŽËð—òýAÉ”?(Ê0”Èl):çâ·ãÆþ Ç阳FÔ ‰ýPmжG„íÛ=ät\±!k6²O°†œ5W̸-OÑè Av¦fæÊÎNzªé)Fœ5 ”óv67•B>4cßpÞY[È€EbX÷’_[Šûl¸/æ—À‘0ZÌEgµ[?œ$N].¼ƒ´æ0ââY¹ªóøëeŽaÖЬ8æVsRe˹¤HÑŒô*[<6ZûíÌ—¸@%šŠc aAL!<Sˆ ÝP¢˜Ò•B>43ÅBS1…H ‰cJWŠûl¸/æ¦1eÜ1Lêã‘p‹E¦Ï÷p“åat_×’öè•uŽN÷Üo{3ó‰w8TÌÕc;ª¹¤¾JåAy*ClN(jŒA­aP3ƒhc(QPëJ!Ÿ š‹™‚ZÿbÔŠÄ 8¨u¥¸Ï†ûbnÔØ°ïáíµ¨ht|5:¹bÆV“»ÃS·Û^&UîãlȽ)óÅ>.Pàã§|\ÐÐù}¼+…|6h.fòq®S>ÎU(†«ØÇ»RÜgÃ}17õq1@ZnE%uñ |úyOoŒ=jÑ8W\fp¯N!†ŸH='l†º¨ô¡.*SPU!Ôe)!Ôei=˜5pþò¡.*SP•!Ôe)!ÔÕ•¢s.~;n uQ5B] h°å‰-¦½åj…èÄÕý_{ŒZðƒ~²‡ßVgR øI¬ø*2xÊ úÑ‚Sù„ §¥@$UCÎO4™ŠÇ^‘: DêˆÔ RO@¤öH‘: DêˆÔ RO@¤öH}@$owpwlc6øÖU§- 4nØbhH·ì*ïŒPjO  Ã)Šá„²”ОúRÈgƒæbF{b8B1‚P–ÚS_Šûl¸/æ¦ö4ÞÝïΡ'= –cj.P:ÿd¦§ç„bÓ£TÀh *`4„ ,%2=:B43™MAŒ†P¥D¦GG¨`bÃ}175=:Bàý‘k®Ã,Ÿ•¬Xýpû¥®µü s‹›sDˆ¦ÃüŸ2'û ÒmÆSé6ãaºm)‘Ÿð1ݞؠ¹˜ÉOX*Ýf,L·-%ò6¦Û©Ÿð!Ý^©½¶{„+ôÌ¢éœø¯õ(.üIô@Ø«Ó'a$˜üty:Ü8 é7ì1I_§qfÈkÖñn_i _\¼ïý¯Ü2½sW…îyÏþr౞Ù9æ,±$ÅC¹ ²w¦RÙ;Saön)ÑP®Æì}bƒæb¦¡\¥²w¦ÂìÝR¢¡\ÙûĆûbn:”7Èd6ƒ®Ø5tÝ•àÕc|¤æ„R“ã(Hð9J%ø… ¾¥„&×—B>43šG©Ÿ£0Á·”ÐäúRÜgÃ}1·49ŽÆ]&°É½ÈèÌ”ã xN(6S€œ¤ÀNB0ÀR"3%#0±As1“™’ÀIXJd¦d&6ÜsS3%ËûvÁç`¾SnÉdL×)Š-™é:g©t³0]·”È’Ù˜®OlÐ\ÌdÉ4•®Ûo1 ÄÐ8]ïKqŸ ÷ÅÜÔ’Ùrº¾%¯Ø÷¶bkÍ!Ž]’´¥¯›(w 6æÜÍ ÅnÁUà\§ÜBàÐ^ŽÝ¢+…|6h.fr .SnaZˆá"v‹®÷Ùp_ÌMÝB @ÁM}Ñ›ÑÐ #¿¬˜ÃdVßkj¿£×­ô–•³OÏŒÇÑ´ñ:u=èxà~¬Ø1ïˆZ;©#p€øœP=ep™¸ K‰¢§ƒ‰ š‹™¢§L\†À¥DÑSŽÀÁĆûbn=Õø¥WžTD[B‡­ÚS^¾Œ·â‹Í6}k pµ›«ñ´asB±ë‡ÑIFG8ŒNà0zÂa´Ãè‡ÑIFG8ŒNà0zÂa´Ãè»ÀaôòiŸ+yp´e¬ÆƒkŽz¬þb·bhÄp˜žJM\àÃ8…áb8–šx_ ùlÐ\Ìhâ§0C ÇRBïKqŸ ÷ÅÜÒÄ^ÆpY6|ÇVU*±bIsËP°b»iEºã¡<æ.§¡Ñµ2G+Øñå!OGIÔœP2h– šË Á2K‰BÁ²‰ š‹™BIe‚„`™¥D!ƒŒ`ÙĆûbn2èÝ%ÉXv9z–qÇÅýjŒTxÅÍ¿¹rß«kj¾€µh_qÒ§æD^ùÄÇ¥ëåQŒÉ5ÕjN(Žb,À6Ka›‚‡Ø¦¥DQŒØæÄÍÅLQŒ¥°MÁBlÓR¢(ÆFlsbÃ}17b|yÔ>sûšoð,?\[59«Ë×Îöùx…£9Áýóå¹ùjú°»ƒ 5î×Ë—¢Ýu(–ùœ½Ã.ûêòåwÆŽMµ¦D5mŒÃÞ…ãôÔw­H‡6“Ù§§ˆleúë_eâI?ŽRÚ’ðf:“ðVô½Š)9 |Gƒïôã¦$-AÁe|O ·Þ;æ”ïÁ²n°M´ð#ôŽ‚RO0Ôç'ëÞq=¶¦í®nm°:û™ð1msGŠRòôz;À°í€vàbaÂÜJ[$Uá“ù­•´d"ÑbÏ}uÁÎá¾.õDNUzÞ3j5Ï—ÿ]%R endstream endobj 5805 0 obj 4219 endobj 5809 0 obj [385 /XYZ 32.1599999 439.699999 0] endobj 5810 0 obj [385 /XYZ 33.1199999 507.859999 0] endobj 5811 0 obj [385 /XYZ 33.1199999 437.779999 0] endobj 5812 0 obj [385 /XYZ 32.1599999 509.779999 0] endobj 5813 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 777.620000 163.679999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 >> endobj 5814 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 153.120000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 >> endobj 5815 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 141.599999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces >> endobj 5816 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 751.700000 197.279999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 >> endobj 5817 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 743.060000 158.879999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 >> endobj 5818 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 734.419999 172.319999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 >> endobj 5819 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 725.779999 100.319999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 >> endobj 5820 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 163.679999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 >> endobj 5821 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 708.500000 152.159999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 >> endobj 5822 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 699.860000 168.479999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays >> endobj 5823 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 226.079999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions >> endobj 5824 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 682.580000 123.359999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps >> endobj 5825 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 673.940000 179.039999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write >> endobj 5826 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 665.300000 162.719999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn31 >> endobj 5827 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 656.659999 166.560000 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 >> endobj 5828 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 648.019999 212.639999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 >> endobj 5829 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 639.379999 188.639999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 >> endobj 5830 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 630.740000 150.240000 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 >> endobj 5831 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 622.100000 216.479999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 >> endobj 5832 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 613.460000 179.039999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 >> endobj 5833 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 604.820000 170.399999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 >> endobj 5834 0 obj << /Type /Annot /Subtype /Link /Rect [391.199999 552.980000 449.759999 560.659999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.lua.org) >> >> endobj 5835 0 obj << /Type /Annot /Subtype /Link /Rect [377.759999 519.379999 459.360000 527.059999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.eluaproject.net) >> >> endobj 5808 0 obj << /Type /Page /Parent 2 0 R /Contents 5836 0 R /Resources 5838 0 R /Annots 5839 0 R /MediaBox [0 0 595 842] >> endobj 5838 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5839 0 obj [ 5813 0 R 5814 0 R 5815 0 R 5816 0 R 5817 0 R 5818 0 R 5819 0 R 5820 0 R 5821 0 R 5822 0 R 5823 0 R 5824 0 R 5825 0 R 5826 0 R 5827 0 R 5828 0 R 5829 0 R 5830 0 R 5831 0 R 5832 0 R 5833 0 R 5834 0 R 5835 0 R ] endobj 5836 0 obj << /Length 5837 0 R /Filter /FlateDecode >> stream xœíG‹Éù>¿â û¶rcÐ(|0 |0>­‹w±ìƒÿ¾;‡ªþºê«ÐÝof$fª»+~9Õ¿ÿò×Û?þ{ûñý—ß¾ ÿ¿ÿòDîD‘þÏ­ýûò™;gýÚÈ;³íŸÛ·_ž¾ß¾?}~úÜüûý‰ªîÃá¿æá8Dßá¿ýúôc?øSßòåý›Ÿþwc·?4¿ý|ûó_šÿ~úk_øåÉXÕþð¯þÊ(3Í/ËŸÚ‡ÿ|úÓon¿6S0]¿í¿?¥,3yóø>}J»¿ËO¡ÁÈM®ÚÉRÖü#›íøÏßžþÞ®*k‚l9Av7’þçЀ¦$´é‘ÓÃ÷B)%寓ÌëdÃ:Ç‘Øm9.kÿË9Û'ˆTE¶Ïí¨Þö5#éÛr\}ÞöåCßÖ!TÙ;ÛO—7[gÇ1OÙ7ß.yÍŸy‡ßŠïáݨáøs4L1eâMÄÆ—FP c¥Z M¢ÙŽf]ŸÍV«†íd@‡ÓUnGŠÑ2 Û‘³´f»õ~WÍI2-$±ü±tÍ»¥7„6w‡ž²7Q3[èX›Ѭ•‡öTô,´¡…Îbì){ ×…ÕÐBgöTò,$iH_‘³˜zÊÝBIt™CífTä,àžŠže¬ÐYŒ=eo!Õ¦PG͌ʜ…Û,*Ír õUJ*d¯Ú»$­~;6èæðšï©àíÿº™T³ *Xûj«y-ßšèÒf@3¿EÖÝå0íCƒi?¼9(íÓ´´­&Ó½%×ÝÈõ0ÿt$:êItt¥l³yg¾ï|øüõéÇO¶5,|ý{ó¨}á‡þ¿¯Í6’äÝÚÅíëO·ß6Køð»Ûן›£»+M–Ý‹ÝþÜ=±÷µ“$æ yß=síÌÝX²~•öO(» ®%Y>aÝ}'ÖyB>vOä3C׋~à±³)1pJDõOæ öªÝWá ¤,ÇtO>~mpg†„-i´;O9à3|ÙЪ QHf´ƒdÆl!™%.ô[â#™±jê†,‡™‘̨-$3Ò¦iñ¬{K®»‘ëaNE2ËŽA2®‡Wµr;.˜rA0¥6Öa„ñpËà ,Ì[>¼"ˆX˜×D®a^µóšÛæû·Èº²f‚yMÄÌk½a¸óý[rÝ\s&Ìk:^¥”Þ¥P+˜‡é;Ìvˆh6êÎ:ÌÚƒÛÆ’€XxÕíVôðÊW ±¦®e]O¬Žæo#o=~ôŒ™þè›ÿCäΣ;RâôèûÍë©N wà”Ø'w`œƒ˜ãÑÔ†ÎöøºÓ¥l.Ù²¡tr{èêÂbÁ˜fˆ'Ðèb矀štŽw Üë Ì“R¤é4Ý¡6Þ”BÌ#Ô(‘ðAP2t§h=×ø{/—k:ýøm D2¶|{jtÖ^P¡c›2Ë^ÆßF©{ü½ʯµtÇЭlï̤}‹/{Y¯£•ržs8,у²%{® ÑÛ£ó¾@nvH”×},ýiÕ­i§©¤Ë†hqÚºâ´Ý§­'NÛ qÚÎâ´]‹ÓÖ§í¦8m=qÚnˆÓv§íZœ¶W§ ™N³?^*Ç“‡Id’ än`š Ü^';3ñÆ‹˜ŽF$Žô ™ýÞ36Äb’¡|I†Š L2 ì¬A¼mq1©‹¬»!Ëa&LjØæ&™f4wêaRÿ–\w#×ÜŠItÔN8Åk²ã Ô3¹<¨cuZCG­I»lˆuNPçl Ô¹pa°iñ@½{‹¬»!ËafPçd Ô™u‡iZOAFtëà¸7_ÍÇ¢ŸÔAË— Ѩ%¿™‘[~3#]¿YÛâ¡–œüfs7d9ÌŒZbËof„ë7k[<Ô“ßlîF®‡9µ¤xC­ugñ-'•ˆ +˜¤pŽÍß¬ËøüøÊ\wÒ¾wU« îL†”s=NÀþò$(w!8Ë e'E&pŸ:‘ÇÝO`ý®cF(šïAÊ€Æ3i_Ç Ç–M>c— Ñ\˜;>+¶ |V¸¾¶ÅãÂb2ðÍÝå03æ[¾@Ýa¸oàëß’ënäz˜S¹°˜‚TQu¬‹r>1€Ü0eEî£ s ¹¡Û t©rVL¡Eù¸ + +·2ºÊk2 ü þ-²î†,‡™©ÜʰÒÍh[ªDý`Í&(køô>$ø`Ÿ‘‹r,[6DR,Aè:j°i؈lZ¨Á®Å¡XÃ[dÝ Y3R¬¦a#jPbÝaˆ58¼%×ÝÈõ0'R¬fSÔ`J€l‚ {4’—#ì)ã^Ôá¾ñirR# üŒöÞ©85D#5³Ró sfÓÊ\lãž9sx‹¬»!Ëaf¤fæÌ¦U»Ã0Ïœ9¼%×ÝÈõ0§"5ðŠ`,0–‡ó]“* lžüS6Íâ‡Oq‘V/bÕ÷ àxÀiP¢ƒ3Н•Ì#•³‹Âz(ì‹öÀ%%`5Ä¥–àÕkß´ =îë-<ÅØ ãr‚c4E—Y†˜x Q<¬#ÈMXíI){±côñ¦¯u„%¢,Å.âáí|ØÏœ ‘˜s-‘´ž¡GO¬§<„º "ƒä$U#Êðh–±M¼z»ãM)ˆæjG+ŠEÈ0 Û ñGÕàB¤s¤S:¨ÆÎÎ7)u¤ž]nå±/8úÁ`Rˆ ~ažÚµô•º‹øù—•ž‚ã‘;oçÂÛ”gvίⱠj'% Nצ%XŽ'$˜íÄ&#Î%… •ÈÜ‹0d¾6qFð9¤Æ7‘¶$ T%q.+ë¨+#ï$'— ‚ÔÄKÜoF0Ï:P/lÅ­ºF¥“l^~xBCE„HçÈ)zoF°°è»czHÐDŒæ¦'ð’6ýÞá% ú³GG|KL‚TœtBU昔ë"…Õ¥øÉ1U–”#P阂èxfðÚrLB bánôëŠ=9peªY"<2~Y4T:^wxW‘$pnšPY‚ÄT—O‰{,.RÚªs´ä– øp 7Œ<Š0üU°£HHIŽ&…ÈÆLAŒœUÄW|<”£ùK ƒcÖV 5Ǥµ¥Ab”™”6ÖeRñΟ¤¥DL#à.£<œrºsI¨’JTy<†5‘–½…KHYUñ—©Ös°™:©¬éèJÛ[d€`gÂ¥‹²t[BÞZÄGÄ޹˳àÁO>Ô&X£¢-X† %Bß| }þr:—Œ,Œ-¸E(HE¤¡p¬wÞà ÝPD±Àhû*<‚×(€€ê…Æ—áí'Ý+#0z–­”8²"0áï‘%¨Ëhð„}(±GÁ¨Ÿ-¤¨²5‘®fð³4IÏ*P¦q¥9(²RÖ G+ÂîŽ Ê2Û…v±ƒû£ó Û‹Œ@Ø7á8—à‹Ð«üþÉWLxâáÆŽ`Œn=Œ‹÷3Eéî…lOo,b´]6œ˜Hµ bk¥¨–„jsYv D©ë*^HøúpX$CÐÔˆºa9ŽŽ*0°cY¾‹ÂXzÃå?ŠÆ[dhLG;°vBì~É )ý¨’þž °#:˜“u—0:sZ»l¨ÌinmêÝFT_-œ©i'†L6C’u[†ÍQóö½ó^±î+Ï#Ã÷ÅÌJîJt9«s'Ÿ 'UcgCÚx2€µwk:ˆøfóæ€x3.¼/– ¯cgNð mm–0¨ÓœŒæ)® ^^'#£Ó¥È€9‘p5|ë8œ`ñ Ñâ· ¬Ã¤Þ"Ú±=àõEC|uøìІJ×Òzߺ҅—-è¿q…‚¸V;"¼2/S2¼²º5%"¦ü=売í`ËRBâ@|XÖ«AÿËdJ”šy]£ÞAÖó2 áÄ{/zÅ“FO 2V8¤7ÉË[4Þ "VD~t´]8V²’3ÂÝ4H 8@[d“ó5l÷¬{’Sý«D*iŠnS侸t+R ,¾àHNâÃ…ï‚ÊP'kºtµp±4šRÀ(¾dh™ ÐòÂЊxðÁÕeÉPŠE%>n¾HÁ§°2U¶Û“?=±qMOÙ€´“¶#nÔb⋊†E‹2T¥ÈÅ&v·K…iÂÞQûâ8xá1 %ÝCâ: ‡~TIºM"´ÇHQ­3æTo{!‘~¢Ó_pêPè¤"G9QðÞÂEIR –,v”#OïÜÎÈ.F”ÕK°¤Ÿ–é7xÛ_}p‚Lå«“2༼ ¸á¦BªÇÚ_>ÞÈ2ƒóÏà')ÙlŸ‚Óľ°až eAóD}yUȰºQÄŠ–rhFˆ@‘Ûp}Q,Ì™‘ •T²dêF„8M»¹^|L¼q(çº2¦òƒ«)•)Þ…›2ÔŽ¡A‰;^7àESÙ•„ìîÓÀ¤·ÍÀ'ÏЪ¡' ü†€3  |"ðß0ð›A<ÃíO^Ï1'<ŇÁ'Ì‹ImótÜ…wàÎYpç xªà7ð9À°Ão , p¥¥[߀»3°cxޱ©<ÆÌ»G:b>Úf@öÀQG@ˆƒñ†yCÏA뱃ذ³;GÍ<¯§X!‘¸´&ˆë;tÞ˜r¼Çïü‡éHÙašÏáY•L¸ÄÏ~R^º’ÌÝ(ÏyÎãMqŸ”T)_h>E„ù?§fùus„±¿htéµòFv¨?*ÏÍ@²œ"<“b ,x5‡RÎ ÂÎIß6X¥’Q9 x˜ëÉÎ`óoXÖ9!¬eÁ:,Õ»—f%Àé_GIZ9»Oè,± h4Â4;xŒÈ]iºb_|gBa~‚ðÛ×¹u­NÁšœôŸˆût—_3­œƒ '¬ÞK ÉêN>N¥K5®Â¯´¶:Uf{aü:ìÞ$†×!15›0…k‹¤ì¥\7Tô:”27;‘7Àªåµe”øt-L¡á”2k·qJ¬íÉ‚¤º=&Å¢0¥O°.ﬞ5ìîN3¹‘Î)(¸SðÚˆ¼7À;ðP;ʪK÷­»Õ9ù`n]âõ˜¬­•ÁÊÊ:+È£ßømÖÝ9WF)ÁzRì\Íš¸Ü£ %"놸-dL¹F¡ÈõLj2¶)Ùá(ç²E§ÏwÆæ³.XyP£ÆS3Äe$eIp–c>!óN¢Œå]ѺN`uáÛ[¤bZµ\¯tP0%1QfözVœ.•„œ)7KtCQN+[$3(ô õL^/˜«\”I@ܰl ׯtÝ\‘‰…èNº(üÁ”…ë¨ðGß —’±P*ÃäÑ•»ê¯Í1¡G_é®#¡™ÃŽ"a«²¶r#è8ãzL-ˆ°.rhDt7\$úuáÆcs±ÊJD8Èý˜N¼3ã]´uEçä|¥\·¦ÿAkçÞä÷ |µƒz˜p‹ø?y{€…še<‡kÓ§˜oc­;ªÂl»H5"®c-P‘(ɶ ˜æj†b µÈІÈ0¬s¦ˆÂØ »<îÏM¡;Ú > 4MrêTF‡ ?ÆÂæx;”ð bà478'd&gýaN¼©CkW W /HúHÈz½ˆ›ÓüqAšv¬+òÂJ3fÄ¿Uq|«â]Ô«r½Ej4}¸z‹Ò8+¨œÇU´ÐWJ~nŽtrA©£Án'’ê’)‰ äÕêcH¦Î=ŽSb5š;«>°@ª$bºcï…\;ªÜÙù0úVŠ­´¾ )ak@öˆä!ØI¥|ÃÎÇÎëD^%Þ6oßä ªöá¿o¿ì`‹fdF³Ï»ˆ¶ûiøŠMu£Í2¶ä}KU¹ç“IÂêuA¥îj;ÊÍŠ»'G÷GÀô]o‡Óè'½TÎùYGKLJò®zaÛ=œ­q ø¿é‰fwFøúêÏg°·ýkB·Þ,-+ü}3(Ä[O(´ŽAÂ}3œfíÃÜ:È€ºög&éX\Jp¼wx8È †kV7 ~¸?v FÁ ¢;»³ç ¤Àßì@ àzvæÃêû"ð` QwÚ–±XL`À ‹ì‚Ï%éóíóÓÿ¯ÎYz endstream endobj 5837 0 obj 6136 endobj 5841 0 obj [386 /XYZ 40.7999999 578.899999 0] endobj 5842 0 obj [386 /XYZ 40.7999999 731.539999 0] endobj 5843 0 obj [386 /XYZ 40.7999999 731.539999 0] endobj 5844 0 obj [386 /XYZ 40.7999999 578.899999 0] endobj 5840 0 obj << /Type /Page /Parent 2 0 R /Contents 5845 0 R /Resources 5847 0 R /Annots 5848 0 R /MediaBox [0 0 595 842] >> endobj 5847 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5848 0 obj [ ] endobj 5845 0 obj << /Length 5846 0 R /Filter /FlateDecode >> stream xœí]Ýoܸ÷_±Ïn#’%EÄN ô¡@púPô¡ÈõZšCÓ{è¿_íŠZÛ¤~ü©Ýµb ^[9Î÷ ‡ïþøãßÿüíðîñÇÿ¾šï?>4ÇF7ó¿Ãé뇗¿ÃQÉùc?tG9žþ¾~{ø~øþðùáóôÿ÷¡Ï/šoÓÃeŠyÀß¾þúðnžüaþÍž>ýï š~úåð׿Mß~2ãþàÛÃ0êӇτr˜~xùéôð_ùÝá× „á<îéÿZ=ˆ¶²àø~yUœ¿^¾Š&kÝЉ^„œÝ„Žÿþãáçi´ ÇA˾íšq€Ÿcfêåy*)ã4]×;ó8ËIdÔLM‰¬•‰¦í½#ÇVL»ÕöMôϰ)Í…÷e¤ltµ‚ ï'ˆxðG"ã]ïBå.s*_ZŒ-âO‰¼¥-˜ÇCqŠ=©‚yé*w;ž‡Ê¨U‚g D"oif;ZsP!d±‰>,²¥%Ä`CEÁ$<šühOŒ9.žkD¿Ý¾Õ{‚Ð!Ìsï¼à‘A±àÀaˆàÒÔQ!>ØËqÖ÷®/ž^(ŠÍ³@Ѹ+AõhÛƒ$Âv¥HqçOÅ̳r%K$PV\GÆÔJƒÔ¶9¡kRa!MwIŒu‹1‰í±°m…™"^šnnøzXã?¡ˆƒ‡Q”¦<è Y$E­É™måpÆdü¶c+…Ó°æpH+ú™òWb.Žïç±îÉ\)HðRÚï)ÃC3›¹¤Î6ãQ1W:Fa¼Šöà„ Ö|oªÅ ìðz8QÑ¥˜«ÌÁE°¸ìš“Aßg˜Zk®OY–×ÉÂ…å½l¡ývÝËÄCãÝþ”iðn×&Z÷–6qω&¶*¨Ô7ªl¾¦W¶â­œ°Y{g,M ý0ØæÆžÊI7!7÷h÷°nŒ@ã° \©h§A“¥‚¿Üöáí¸š w„o8ÓŸè–—c6*Ñr˜@ïÉØî¬7ÂÇ–,%ØN ÇL®Ö³ŸŽçƒEkp0×IHoTŠ…ní­EÐ Ç··—”ñ]o ùœˆ>Î0:»KÉCq¬9‚$J¢¿—€LàIBÌ*ŸÞÔ)¯šåÃq›×Ane6í’R#)bÞ&Ñ.\…'n[#aG=–%õfãYmQ´^yŠV)H*®‹FÕÙºˆÃNñá(±z,ª2ú)öYØ’² EgŒ¶xïâLê.,Ö…D霚d&%ä—nº¨ ±æÙöéá²ñg©…Åmo!þ¬ÄhË NK!{ ¬±s¼•+,.JÈþÈOÁ•Ç׿xì|'¨Ÿ¿¯š™ˆÈHØ+㈹{‚),A+%øê•J8v‚É2LýCtÏ(eÙåUCßi[+ßòI(æð@BøˆPqy˶"‰;I¨ØZ {'Ëx\·ŒÏ,¨š‹‰ø´¬Íüï¥#zÒ,kí;ë ÍóÎ{øÎˆÞ1æ¼PÇÞržÅ,àDsœm…¨'ʈ!éÂð«:‹§¨wšh=†Ö ð çØ1t<['´a3ŠAtÇYÇ<ñ@W w¯ãÀ³sãÖ­acâMJ¸ÒZ´Sܱ4±+ÕJ3%gç€(ƒ%µ‘ŒÎ¨XIPZÕOÛâA(æ„ èÊ'î4•É“1¢T”«WI¤ÅY^\«2*)†MhíY{¨*áh¥d£²äJP )yê2b‰#\u}¥E•R³ebC9Þ|™³ùŸðÁÁƒdàÆ5"|åÌ0¶øò¶¾Ó sZ^Ý뵬¥p2i„OÞ£'f¹kÉ$˜ÎâMZ‘ p4Bª­QØx‚%ë W7¾UzYô ÌZ“§9ð±RòdË`S‚sc…5Œs¹2ªA–8‚ýZ¾ƒçqh¼Ú!b]FÍ¥Ab¿Ÿ•áËûʆfºå z‚öG0Q?!†ÖZ’Aøšã|Kµ)©]hÓa£×:V*$a Ÿá-cØßBfŒ¥ÑDŽŸ‚ËÊ Î|å²à’²vì-ÉäÆyâ=dR98‡pñPz8 šp„ŠºdÔPEÓ]!m<\„rmŒ+(jèéËbw­µk­Ò'„Û'3M§ì¼á~ä‚·àЃjÎhá–G :ÙY2¬Eu'ŠíÔé?¨ØÂ&6-'ûw²¸Ž„ímü¼/&P³¦*Â9Ï-P¤”k!òæ‰YÞçIî01qd×9ÏžM—j‹ëŠæÃkìÀL¥tâXžZ<üF-Ó®Pæ\MéRõÓ(µ Tê]Là¥%Iãa!Ö3&õŒfÙ2ÍžwªãG½ûÆõféöÿR?åa$DOJ ÑסôÚ/žÉ…ø=ž ÁÊßÞÔ ^“O¶•{ÃlƒƒTc˸›ŒÒRjIGŽìB&SPeŸó?ÚYEÛL8Öv…üÛ[hQ²Ü™tú=|°0¡0–Ò§?¡ áýõ±îM›¡*‚¥Cg¬‘CºKÍ£¯%, Ž£«eì "æš9¥{NBv{Í i•„ްã[¤ùqDÆ6!*‘ðn¥“ß 'ǘ'.ßîâ]œ@R5}íæ!ÑYÁkîU†ñ&Qò Žz ¥ø‹‚¨çÀë‹Ú†m6+a›§ú Ïç¸5Иw}•„Š×{Xéf7ñʑǶ%xè)gº(eš QvŠ1µeþS+[`ä\D•`,ÄW ¸E¸ÇÔHÖgႳó3'½C9ÍNÐrž–^¸“S†o—ÐE­š…šà—q zŒ-¨þ=7|à{!á™áXNöŽ*çˆÛ®i¢ÏO—¼¨Y¶ÀûŸ€x+wKfu0Ä[BuwB䃣 R¸/|ZÜÁQ[íøD7ÀìpV5GTVQÂÏÚTBê%¡ ã"§…D¥;^*u«©ÖOP_r WÐO¿ƒ;ÌÍ›ºÒOÒ1ÏÓ÷«cíq'>p Ñ;¼Ýü–& Ò9aFY©R\ß$Þ.BK9] ð<°!î‚(`÷H]㎓x:lå{j-{DŽQ‚JªuN;¢1O‘îT<7Ì‚„6JM+%3"=)~Í6• ´ø‡³7Ž7A9XËi'T¯T¾±xS1Ö*b^ožSHíTÑZj…¥a¦S¿š"ýÂqYx%_D,4Îf͸¼Î"q¯'ÔÙ²ãáeí @ôb šã¼—…GMS*7Yº”=JÛ²uÔótS”- ›‹ÃîÀ›& Ü‚±GOÊßÀ5 ÒZ¾ê’Ó†.y)e£m͵Qz7ÅÔçh_³·h/.÷qÀn fðJŸPY wöÄDî Š™[¦Ãæé¼Š;¢âÑ`wS)*Ò‹jß½´x¥¬=o){o`«³÷Ú÷¾ÔÞã>Ä; ®çê)©—;%Åì=¾ÔB-!o‹ÆÞ-®°¾Çv¦XL/$CM  ’Ãïà~ꘛ0Þ0®)»×ƒ]D¸ŒQ ›"ŒFê«ñÖ¤S•oþ‘XÞb© )Daûs¦.ý ¢Y(ºÍ³?þñ`SáNÏ<ÙëÁæ9Ь"P¯Gº¬<I¤:¹½ôñ¯¥Û0~1U`óHïZ+%p:¾ÿËE¹±K.((ë¡è^¼)¸§-„­Å¸®_xS÷ˬl¥{³:¼CoÆþñp¦,“Ø’á}Ÿou¦ø3X×aKÜZ’ަàÞ×äèñ¹2c±"¯­ Â㡼ßxWyu/¤RL‹8棰͎a#à S)^'oAðl=¸&xÝžè ŽG±j m–Ó¶ 0…,­í­‰y!dçl­Ã´ â׃y‚?e‡.YcŒx·ªb~AHùztáѧyCð`»Kbk±’%[+‹õÞUp´nN'‡ªzÛG¿=ù 5ž‡¯®‘½æ'¼ÑbO|—"7Q^ªÂö%ö¶HØ¡d5 Zó‚G÷ãl0%е¹wTѳՓaúæäú½e5oSKÜ›\ßóv{Þ.BÞv}#µ¢»¬rK!wU‹k+ÅçH2ú6cSPFSbSØÏ÷?Á'ƒ? ’ —¼™óB¢]h%b§ÜJU%’¢3æ«|ʵL—…+V½ž’0ŠÃ‡dZᘕn-¶§¸¤Ë±ÁLh书‹Ò-‚Ò|Cºž¾ X›ÁÞßGÊÒè¨F{ øJ4¸ šµ…º'¶!ˆFv„RYœÛ盹…㛎ò¨bÝ›Kb2³v:ÊЖëýê=O*aÄsw)æ3,—ñ½ ˜3xiŒÀµžy0F)•HwÖkËcoô3 £¬xVŠm;Bõ’§E|RUráÛvÉUQrazÁ:Û»äòø6N‡£‘0Ê Á.¹fÉ¥…BºK®z’Ë#Ÿ ÞZ^ áÞ$kð–„QVvÉe$—ŠOxOpd‰þ¤Îº‡ånñ=‚ëƒí¦K,’p%¾ß'œˆëôæÛ×oŠtI¹y&åÏ^bö¾ä‚AÄ´Œµìä(ôq®”TMûiZõz"ul3f•ý±·á3¢û•'3:•:ÊÑJs›¤}wÔszÇÞêµyøÎß™н<ÊFÙº6Ú¬0^þæ þ­)¦]Yá'ôŽkOZ‡1šÒÞ1;–²vÛ™2¨îôYvb¼Æ°[›ï}:ÆN¢c ®P¼x‚4 wДœ¬`ÖƒsH)ø¥`z€ëñÀ†iõ‘…†¡ÑGÑ‹S1úKÂÀb†xщì3§|>|~ø?7X‘r endstream endobj 5846 0 obj 5102 endobj 5850 0 obj [387 /XYZ 40.7999999 696.980000 0] endobj 5851 0 obj [387 /XYZ 40.7999999 132.500000 0] endobj 5852 0 obj [387 /XYZ 40.7999999 696.980000 0] endobj 5853 0 obj [387 /XYZ 40.7999999 132.500000 0] endobj 5854 0 obj << /Type /Annot /Subtype /Link /Rect [268.319999 706.580000 434.399999 714.259999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.eluaproject.net/doc/v0.8/en_building.html) >> >> endobj 5849 0 obj << /Type /Page /Parent 2 0 R /Contents 5855 0 R /Resources 5857 0 R /Annots 5858 0 R /MediaBox [0 0 595 842] >> endobj 5857 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5858 0 obj [ 5854 0 R ] endobj 5855 0 obj << /Length 5856 0 R /Filter /FlateDecode >> stream xœí]_ܸ ŸO1ÏαdÙ–¢@v“èC úpèC‘ëµ8\Mï¡_¿žµ=³‘æ'‹¥ïzÜέÆ2ERü'’zóçOÿ8þë÷ã›ÇOÿ9~™?~:ÔUÝÕÓÏñôï‡çжjôô±·m¥‡ÓÏñË×÷ã·ÃÇÃÇñ¿ßª{zpþ5.¯˜&üýËo‡7ÓËÓ_>=þuüô¿£>þeü¿_Ž?þ}üõÓ<ßé _vèN~>(­´ÿçù§Óà¿ûÃñ·û4ïé¿?˜nhÚ¦K‚ãÛùQõôïù£èeõ±µ]7è£Rz„³Ññß~g;ƒQ F©¾3}=k¯Ÿ¦mÍq軣ê•7©·¶È©R'²Zh¢D*miª6}xªÊvº7m=Xø9âÁÚiéʤ.þÿËm?Œ&__£?ÿX×êퟎŸ9 U;4};y—óHG:8ò€Fê>cï1hÄ<¢ ßÓƒaÓp¤…#6S3ÞóŽ{1ë†ÎU5äÄù=ï?;3û>Óí*'a¾Ä¼\Œ/e9Òž#jÆ{ÈIØà>ÓXÚ½§ó%æò€Ä|)'»›¸fPA× r/æªM1'24˜†z7°ë9T ÊÁ®Ùí;²7Œk¸ CÜóHÀÞxǃx×–´7F÷n·7v{ã®ì ÑÝ´Û»½±.m­\ÁÕ%Œ¬a 0õ´€vqg1ªL¥•=Asf"¶u9¦­m•n}Žé«Ú[Ñijæò‡é}¦2Ó7½Å_Þ§;ø¾xДšÖ§—º‚ýЈ¡÷@r—㣂þˆ~ï|cÞù6ÂYè]ñ‰'Ò¼U0ðìMæâᬓ­b3ÀOiîò|„ã]!‰E¼ÅÔ¢~ú®í¾ç}Ö)âM ç:ÿ$AøD¢sšöƒAeFó2ÇãE <—òÊ á«8õ âÕà öïõƒ,ሜIðê›·ô=(Uµ¦;)±¤‘ÙéÚzX¤Æo=9vr¹ÖhH Ì­X„bz8!ì8+¦¨¿=½?ÀUfµÎ$v©ä®s¶ÓmÄì ¸È2\ÕtÿzÝGM¼daŽÅ;‰4å§cž¶Á“`êªÓǯkºçøõð)Ûçè פ¥î&a9˜e5g_´ž~.ÈÐH½¯o<~¦îà3|Ï´-TSõ® ðg›VµÕ$¢ž­tÚª®&kÄ3TÚJ{†JGð35|Ï4ã™÷ ñ€Cq±3¶2ž[׃߃ùã`ŽË\[)¤ö/ÉïÿÍâÀSüßiŸtË7cTœi\ÅÉpé°ÅåYížLö?YÀdÁ*ŽøÓ»vO`V†q‘9z`(𫾕èáÄ3 Qß`4 =Â.¬Úµ{|³ó&¶j°©ëÁŠ×ó.1ŒY) ÷–‡±ç-oÕ›à 3ÇÚ~É)ôûÞ‘úÆ@Ì ‹œ—À¢åªû‚ÝO‚`™³®Õ£? Q–å2B³ü[Å„i¡ðõœNwöF-6F7™®ŒØ4œO¼$õ%w!)œ%>ÈŠ«¯2Çä%ϯœS#±Ô[WàY ZÅ×çë‘Øµ­”Q ³ÃþÌúß¶ ºK“`&c>_‹KpͰè«yÓUv¨;.MSε’×#!#hXêìoC΂¬#쯫/Bøêý¹9m¥Œâ£i•#?2šÃ΄óSìr`Ýjå sú}‹«¸øáë |‚= a®+ŽÅ¸z2àR÷Ä"a*™à5äÀÅHÐIŽ•„Á¡ßå‘âheW¶ÑŽâ ØR¬L'­\Ȇ¢sqÞ¼ÐA¹j§ÊjœšSrq’3#ùÆSSµXz-ô·ÞuµVÏèV`W±³ ‚:‘@á,“`7rrRâãx)VZ`}ñ¨çÄþ|¾õ§ZÔWš7ô‡tçmTBrÏ™†%ÊúZ/qEÍ(ž¯qi–׸¤BâR \d#[È‚Ëé^˜Ö ‚q¨À)‘Ü$Få^˜ ø¼ uK(B¢ÇM¤I(4äK<ÂáX\@Í)¸lDe~O KKÒKoÌ—ð=œRL9Žôæ”ËÖSH`jsøz—™dç®_Mk±3Ø}Ø.±]JëÃ×#!wùT£E¥C¿¶)6¤bÐK!¬g1v ;´g^…Ûyܵ!v04wL…mj‰ X±¯€ ²8Ø­Ÿ F±+”¹Ú«féÙvh^!@JyÁ&ÒÊâO;Sº1¬§>N„òr¼ƒÒõÓÙ ¼–ÅŒ  ÞBL<@¸ÿ„¾;J½NÉЕ첔)Y+…ÅI”“åœESe|[+GÈk<7³tn‘øFDY_ncµhã_­gßfÑ[(:fä\š—ù¬† Ëè²ÅÉíI©Üàëƒx¥ÂRpʶßc†dF·Ð8Ï8$ÀwrÅÝœ·é²àõÌ;2¿c¢›Ì%uõOHÌS)"š$˜¥à{ݰXï¦æIûˆö8#·Ê`e•³Çg®Þª$ÅS£YÈÚxǾÙy#/'§ho#Û3õ´Èb8³²«½ÈC|1Îz›ZN¯NÑÕF9ñµ…xŽ8¿£PñöVœ¦3ö$ÔM:}íò7€œ ܼ±½u´ˆˆI›Òi*ûfôùÇ›„PH\¦'ÕkkËQÀïmû¬VLR–»ëó!áÿd5ÁE'èØRUЅ윻7¶s,NUÉÏví¦íùÒçhg1$ëÍ Œs RÙv;²–éZ=ëí¤A±Þ"f! ¡»nLc& tÀašeIð…7ckâg#œ,gjpù2ó¶"<âóýnïea#·PÿŒÛ˜²ÜÍþ|&¯OÖ,Ê­CëˆFþ(-†SìÕ{j+©ZíwKR<âÔßÛFh “pì Ò•O„—ÖYöþ¢ ²½öŽiÀáÉsrànÓÊöV¡¼"ée£hûÞø¸–t…µp¥ çºvœx«5®‡Äõiœº1\"Z÷zÒå*|hÉwŒZ@<›l5b€!®µ€øòwFâæ=óÎjª¥P½] ¿Ó0Þ£1µ6@mX™¨NæT‚Cìh±ôÙ}hú®Øuè®CïC‡²p Gvíºk××¥]îÃÊ݈¡Æ»ÞÔ‡]·Î—XaŒpºSà®]˜ÿ7©‘o¿Ï²òAƒû­a©ÊèÝМþLåZ†WB OÃÆzÏZ¦2RèR¹Íý åg§ßóˆ¬ tÃÚˆaßdö … +kd9‘cYì¼<£‡Q1*ðýÐü§Î机?;¤þ@è³~±užÛy×WEH÷ÎS,’÷-’R(ý/OÁµÀýsEì3,½g6êuíqûŽðìgoANÜ£ƒÂÑÁÀÈšg”ß®m¨0«óö‰ëenN%4¾ò¿êå¤MßÐÕd=o|ᥦ'²»}ó"Ù鯍Èz)u8y{·êÓFqD  ÛR´Ù›d¡pR Do@N)ÝWLd¡»›"Ê^@ê`D’ý&9¹½„PÅÞ`#7r$+Þï9BhìÉ!5'ëŸ`Ƭ /ÑM5Ù¾@¯“gƒÐ,•A\_¶q¶|!Gb—¥7ß>«;¼€ÓÛ ¥ r‘z|@7¡ Mñ ÆWkXúÛá‚CÜæ|ÕzâC*¡hBÖ*ÖÙÇwÔGÄ-ðÊ +«Õ¢ˆ¥M0È8æ:§LÐF“iµ­\‘S¸N»Dàœ7Æ GàŠs{®éÀYøD7ŒÇ'j0ï/pZÁ8Q œZíçw}f´Ÿ79q?oÜ«ÂPïµ~9ô{Ó%pÅnì6Ánä° öÚÅÝZØ­¾µ°×.Îú½m×yL¶6ˆ“+»I;¢Xv^_/UÍDª¨L0Æ1¡ p Ðÿ²LÊ;㎱UL ºî]†ÞÀ-¡"-|ññ ŽŠ¾°´"1ù„rŸL'u„Œ¯rÆåVÏ=o™ûãë¬I®ŒëÝ׳{} ¨¢•e9e­2ް¡‹wbàªøì›ˆîɸsJÚ,äƒ@ºw¼˜2MŸç•¦øäŽ× ’N­¯(¾HóNà®-ÌoY4(ÅÈܹ¡J§:䥖HúGž2ÑJ Î-*„òæ”»/dH Ñ?›`¿fIu,zÉ)ôµ–ú™ó„d’·ÖÌ›"ñ8«Î¹jŒXl NvûRÛY Ö/“ˆš·Xg ÷ÝáåŒKäDDÅÊ-âä{Q‘|elWnBbDN|o›±‚WPú¢Â;ÊH¾e”¥m±%oIÆIÈØöŸ-åòõ¹ H_N25Ã8ædœ¿¬Î ñV”g÷Þº£D ož§¯TD%!͘“¤K¸®†ç§ç7ø´ñÄ6ýÓ=ÚœbÛzr›°5 —ñÝqg“B ä2×õÆW+rNÀDP‚åH‰2£“4\½«¥›vQ~å9]»ž~.XÐH½`»o<~F+øÌ€ž™£ª©zç0vf¾jÜÎK³îi+ tª«iàÙÈ:lcß{¼ƒL¼o+ã;Cf¦Tm5ñW ê=‚ [‡0Zº;̪úÜœžÃ°Jhfdª\æ:e‘šM‰ø"g}gÝjnÖr/u<#e:I8þÈÜäjî![¢¯ŒUÃy´('êë­4îÒãDüÎñeðÛ/©Ñ'¨Ê¦`ê½½Í÷Ž…ÜH]…³|ÀºSî3ܳ_®³SÿK玹UöÓ[ÇÇoãô㣧¯Ï¿¾| ¼Ï´¾ú1jðÑuϤ;ªy×¢Áƒê¦ŠácSŸÏÈ&òv]Õ]¿Vp0•§ &fÑ}Õ_?쯌L„ošJWc‘m[u“t™ÿÚ{,|f€ÏL¦×•®›ÓÐeäÎ6‰­çy¿;ëý++ü€ž™£k# ­c¶~<ü®b©Õ endstream endobj 5856 0 obj 4705 endobj 5860 0 obj [388 /XYZ 40.7999999 615.379999 0] endobj 5861 0 obj [388 /XYZ 40.7999999 280.339999 0] endobj 5862 0 obj [388 /XYZ 40.7999999 280.339999 0] endobj 5863 0 obj [388 /XYZ 33.1199999 710.419999 0] endobj 5864 0 obj [388 /XYZ 40.7999999 669.139999 0] endobj 5865 0 obj [388 /XYZ 40.7999999 615.379999 0] endobj 5866 0 obj [388 /XYZ 32.1599999 712.339999 0] endobj 5867 0 obj [388 /XYZ 40.7999999 669.139999 0] endobj 5859 0 obj << /Type /Page /Parent 2 0 R /Contents 5868 0 R /Resources 5870 0 R /Annots 5871 0 R /MediaBox [0 0 595 842] >> endobj 5870 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 5871 0 obj [ ] endobj 5868 0 obj << /Length 5869 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`4âC z^rИrrf³ ™E:{ÈßdQ¶›ÔG‰Å‡e·»i)¾êͪbéý¿þ½úçoÕû_ÿS}7?~=4uÓ5ÓO5þ¾»ü‚«Zðéc¯Úšëñ§úþãðR½žÏÿ/Ö;š?Cã<Å4àoß=¼Ÿ&?Lß|ýøçáÓÿ*^ýiøß/Õ_ÿ6üùÉŒ7>ðã t7~ø÷ôqÆÕðŸËOcã¿ù]õë°uwü÷ì›¶ëdÔ:^N]Ùñ÷²+š¬©Z¥x£*Æø°ÎvÇÿqøyí´ŒZIÁDÏ[9|ÖÝØyè2|î…ùÙ4SÏÇ©ï+ÝwgÒ™ÈÙï¶¡Xì@B6iWÄâ¶ÆÙû‡ªUg~àç-©ãεßÈ–œi´d¬±½™–& tbBKïRR 8ç‘¢ñÒ3žf qE,jg3~áHI¹mÀßq㺡)„ªU‰:ü‡EílÆ)).´l§ÇK¾ÓP‘é&2Ʊ¸­ÍØÀC¥D‡fž¶>ôŠ„âi¨Ø¸diWÄâ¶fÐኪ!´hy q)`2‘-q\Q GJÊ-›D йõy¨hö\¤h\‹ÛÚŒ g¨ç$ö;?Ûï/žŽ¾ÞaR¨ñ¸òíça%Ç3Ïôç۰ݶz7çÕ·Ÿªß7 g¨¾ýrÐu«EßN‡¤©…IÔÒØò¶h8‚}8jp¬C-ïç3lùD€Á—ðµ5=Üi û|o >¨2; :Ê@¾+8k×DPöƒz|-ò£d1Üë‡ìzƒÔWTviuʬMÙ fU—KS26M©ÚÁ¹0~&:mcPÝ¿èœG´õŸØŠõµàŠñÖa«ó£lÚu_ëÁp‘oSÅå_Rñ›,.›#¿I®-¾h\(O‹Q6%H[_<Á Ù6Žæ˜m(ö1p:o¸BÖØ.‰T¢)¬E;»h&vWµÒG:p¨‰µóÚÎ-Oh;3/³º•ÝkÚt&†‹6Útiøöpl”¡D~D°ËÛ›–äàÚîË?Ûè²ñ‡1ëÒ˜C…xãΣj3Áb¬ó…ÑOjË!À]èÁyXsŒ›ÙëÀòðávˆ{èÕ’‡ö(X"c.µì8†…Ò²»P…=§21ãY›Ìæ«MŒ°Üg6Â#ç5Iâ©p·ë3öaM­ˆù¤âðw(3I€èÆRS1^¬>g£«:#­æó(7ˆ÷ŠJ¡p’èo—èDÅ´ c€JÀ¦DeHر9\m‚0…ï¨À&CÌQD[•’ÎmÖç šä“ÊF³‹÷í6q^|ñ!|TÅô|x7§›]Kìä k¦Ÿ3Æ5jifVê[»¥ ïÞ`úsðîkÍ-À4û<[Ž“ãja3ëp['¥ª¥¡r›"òãÛfv›…X‚ÿZGcã‚c|æ¡£-ÄmpttŒÌåX“²ÄBÌŽívdíQR×rzDñÎv'€‡Úæ+¤ôX&‹Gáê¢aýè‡Eà*Nrê ¥,¥Aq7Ü€¸X?ÁµÚ}צ®€Ã—pŒG‚„qÍY¢å ^+c§[ÖÝïIdϪ§ÁÃÏyœÂIÎQ«ç…‡ëvXüÄ„û®úLÓx˜“F꽜eÑZúÀŒÀ.6'ê“BèarCâ°Àù‹u ºî•% =„ëRŠ7Šw/Àï—Çö¸¡ûÊ™¦´‹~»–ðP‡ƒØuùjkaÏè„An†­àõÓt¥$0€2Ê ÑÊÍBÈ݉CΘ˔ýesÅ¢Ö­:Myý¨5\ŽZ{bt¬ÙaSnP‹!à¥43ü(Ž’ƒ5õ¡cB8'?àzz€rw Šk).̯´Å튠DD÷§W=l…ÊÜgÖçQÎ¥€,Š´ä²ñ°¾Ä&­Á›6ØuÍ0üM‘7;++m©—qO"Ú€ ÛmδNB[¶÷%©™#1Å;•J;XOìÓý\¥ŸôYÂë-qÒ,žG4°¦…zFƒ)¸ž$`BB/)¥'çâ4Wœ†ŒïtÜÙËYñ½;õÂ4dÏýV<¦kœl W€)^B:À¯-¦P¼çî-­/(¹n<©ßÃûO‚¿nz¼nö•¯›âéñº9§>^9ß'.4ÆgõHþ!BK_MÈøÜ]­ÔÒn·˜ Kâ4|Ìw|󅃳ÏRšIs–Âv7¾¸[½ ä;ù]Û‚÷y‰òÊö#;Uy܇ýÈ´~sô» õà­¤´°œ«1l˜œ#š6ñ†•Yì´¥2«öÁóàW§BˆzæÁ¥faAYÏhx§;~ݪL¾Fâ‹ÐÞkâuHâýµo g®˜K*°^ž&&>ã$9U¾îzëMÎeR7Rú3#6àõ&ê”|M‘Űám1ñi Y«Òö–”ÏTe:E8<†áb’&$‡Š!K>_ˆmû…¨ÏævœÜ¸æM™s’¤&ÉzB¡9l©èqÿÔ Ê˺Q÷´°`šRœÉÛͰYAˆ§yVŸ]7i®ìH’ˆàö(Mû&ÉëRsw+h&‹D¬"ņðÔ®ÂJ @$ÅSö‘ñ¶µmÁúšZ¨9ýáñ2æ.l²‘1!0=i¢”d6Bª¦1W”úD¾jÜRêZ¶sàj¥ _IØraç—{®A'µ¹“(ý¨ÒÝN6H€mAP¾™KhzÎYÅãïó²j‘×BÑYçôuP¸9­À)êø¢€gÕ„àuþWIH­m%”ýðÜ6¦Ã]8¢=¬Ó [W?X‡È:O÷Â:vȸP±É$Ëo„›!Hãô ø+)ÅúvSk{´® ›œN]Á-†–y=1Ñ“I¸/æ™xõe*ªf©“žšÀ×jŠpôë¾nð0³IÄ—Öz1E<°×:iq‹$0ñ8/R\RJ“ëaœ¤x͉,)™9ÛÅü5kÆ Ù[â(J+PªüF”_ É ð«¬è,‚€w™‡¼ºÜÉ<ƒ |ikR%Mþ ¨®™&öŽïÍn¯$œB R2qÒ@ B¼Ü¢ìξóÂwQó«$Õ°Í*éÎÊBç¡GŽ&F儽šbY@çΆJ˺]§”€ $õfDeÜ…¿~&wM…T½ËHeLÛd–æ}”p|’šI—´AÞ]ûªWšÒ®ëz2FĬ—äN¢ZïëVZ÷ߵﺕ,¸Òʘ╲ ^ì8_²œAÛY±Œ2³ª.‚²qÁ‰›.%tÍôJyQŒ(_p Û”r¶žL0xr›qÚ ¤‰‹¢bÚÁ«ÆØ¦ÐÁƒ|›@!ŠW€åávBƒe/!›s…H+ ì”dñ<•Ó”]c•^}pm2®ÅÖBÉâh—Þ³•5wI ·“â n×ÅˤX¸Ÿ¶ Yjiå/ÉRÃ2σït¬®RZÝ£)vÖ„â~;°E¯çðP´åI’ëW ½=4üÜRF®«·WŠ÷ÍQR¢Þ>쟾±¬Ú0ù’´ÅØ(Ç}¿Õ˰ÁañãæÏ÷ž» jΠzöËÛu½ kW±Œ I˜šuS¾~%NEŒ2뺺[Î¥Ô²ž ã°ïë~ù¦Q¿Ð2‘¸5׋÷p۶Í0Kó(ØGÃ>“jìyÍÁ. ¸VZmu—ß|‚Ïš¬…~A}L‚ÆR Cû0¹a} ÆBönÖvd€ª?ó–Šÿ¶p¾'`Ú1tÀœ>|‚E׸iCÖC;RLä%^ÀÔ ç1Å1–úÀÑL†ÒÒÚ0u9¼à¡*—oðZzÄ—\úLó´ªSrñ†ÏÚ¾ y019¤}Ü‚aŒe¿púEp®RMW³1výš…1Óa¾ŒE?§Ô¤Õóáÿúã|u endstream endobj 5869 0 obj 3866 endobj 5873 0 obj [389 /XYZ 40.7999999 212.179999 0] endobj 5874 0 obj [389 /XYZ 40.7999999 212.179999 0] endobj 5872 0 obj << /Type /Page /Parent 2 0 R /Contents 5875 0 R /Resources 5877 0 R /Annots 5878 0 R /MediaBox [0 0 595 842] >> endobj 5877 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5878 0 obj [ ] endobj 5875 0 obj << /Length 5876 0 R /Filter /FlateDecode >> stream xœí]Io举ׯ¨s€Q‹µLwÛrÐh99=™ƒô Îò÷£*Qe›ÔGŠ”ª\nÌxaq}+߯üú÷ã?;~øôõ?Çoæû§¯‡ºª»zú:žþýðúr¨9ýØm%õéëøíûáùø|ørø2þÿù ºsGómlœ§˜üíÛ¯‡Óä‡é/_?ýyüéGyüÓøÛ/Ç¿þmüö“ïôï‡Aw§þ=ý ¤ÃøËëŸNÿ:üåwÇ_Ç% çqOÿÿAõ¢ïµLZÇó¥«8ÿ{ÝMVÛA÷R…ã:Ûñ8þûÃÏãh—eTƒjDÓËV?ëNõu; rü¹oÌת™zyžªïŽzüO´Ò™ÈÙïÊ¡RÒ²ç¨?’´5Q«Þ?T¥•ý «l¶ÙÓ6…J>±y¨´t]kÁÃqE"mkóÑã¡)A×B5ç­ËZ§žâ(êEm÷uÃðç†wá°g>ŒtmX8ÀÙVçÂÄá0¯×Xà¨&tŒïU¹Ê(MƳ°o :3¿/¤ÈEè§Îl~Å‚*¥ù±GœõÙõsn»ÙJ rG}r±™‚³ëUÓ0ãKQkñâ=züg:±h3¤ÈcÀÊDP1ˆ~RàÃâÀ,£™0P­P£€X&\#A†ZÏØ3OW­ÃüléP‹”„>pƒ-K-ŸaK[k+sòrH8yù)¾…GÜÃÄÖRKÏŠc{Á¦s«1ä(ó@ ¬1¾QæÐ¦@y§p œg'ÜAõ»áä¤çr‡¦_emwžv­ð¹óÎr;­u<•[ZÞÙÍ—QföN›½^‰‚Ú{NrÎójà ¶‡p£ÊÁQ׊{–*݆ƒ6<± ¶·÷ëß]ïØ ˜¹ðáDÀSðæVÜ<Öq5ÁB4ói­Á$ Üâxþ°y«0¢º Æð£X%Y=š1fÉ<”înxå•|\¬@ Å Ÿ÷¬·|d®Ïê·"jOC9­Ld#·%Z)¢Oy™Ç5ìp~ n¥èU³2ÝwmçG‰•‹[Öû¿VÄ¥|$ GŠ»+8;‰rËŒ!m‰sÕìH=pXè¨OBÓÌÚ@£‡Ç„‚Mˆð²,ñ•˜ÕÍsf¤2nê0„¡qųoØâpYGÑÒhºàÉ+‚‹¾ÇÝ'˜‚ {̓جŠG¼jfc\I|é†0¥¾sªóu}ÊV3Ëœ.ƒC5èú­Rj˜hgÉûÒ‚ã±Æ·›»E9‹Qñ¾ÊXÒ(¶!Ï™D¥œÐ5'ôÑY«sz!‹v^#UgÑG›ÌHÆÒ°ÂWtìЗ£b¯·|Fk)‹]aÃÐuÙâò+eoãÛV^—!á b8å#Y73¼\wžÓnô‡A²t3këÉ \0öÈú”À•{Xƒ¯¥Á÷ÌRa”„5O@"¾ÓóâöƒWáÏ ©a‚íÀƒuAzÖs˜R¹à(=òŽ9¨æþV<üm©抅8¶¦P¬6$Ž@@»Q!G±@zp”b%„Þ›s+ÃkšfÆŒ„@bÊY5”`j ^²ZzèŒõÜnÔûRÿ[êÃX`ãXsDP‰#P)qNÊú˜‡˜D£`‚IÐØmJ…Z^É™'÷Ê !‰`3¬•¶~^磪E`D¡V…É©&Ã[a4–7¬5ˆByk¬“‘%¦576UÏæf… Ø9€C° :®4DHØ¢°ã·Ö&ñ`—³Áæ ¼j¼8vŸRN§Á† œ‡!‡ &xmÐ,ˆqGdOÓhÄ`ÑRJMÙ˜ cÞûXP1ˆ‰r¾â¨ÓœwªVبBÑw³<žSºÞ_ lÀ*©š9Ö„’.!’£7`,Áo¤”Ê&¤ûxÌf„Õ³XÉîW¢ž\àJÜÎÙ\<…ö8Â(VˆÐý=GgB¸˜ª¾–2ìàí8Þ W(ãØ¿)E<§yºÖ6ÍGPK˜(žK£àPLŽ‚¸8‚µh ïËóóŸSf™³îù­^WT-¹†x NkÀ­Máx ¤‡gdêýìs¼0õUŸõâè¹g ŸÌ­±rÜvxâDyß ˆp4s¼qQúi…’‘pk(]:ˆ—†bŒt9 Á¸“öâCÞº†ë %ë6µ2å9ªRO¹^gý…ƒ©J®º¢G~< Ô•(Ym¤U)•®³>Úû¡ÚrϘÔ5a8bjx,¸Ò—`ã{5/^áš]’°œïŽ+€5þͬ`I…Ï€RýžRƒ bˆ'žR5‰PKÑÓ‚WÀ¦†‡¹Cw‰N½KÄÛã\%%b'7âŠù¯«]?«,O¾º‰ÌáLEgŒ_g‚ûÅ—bóÙ$MÚƒì¢WJx¤)¡öœ§ú]¨ÎYÎg iÂ~3HXlÔ4áGÁ´“%?v·¡„YŸJÐ6årðáͪä—IÖøõ”Xú…ŸZYoÆö¯c)".""ÀÎ)gQÊÁ5Á¡~ü<Æÿ‘7•’ô"}ÄXDTg¢”naÍ¿·?qƒ¹½%fn5&’Œã©J+Ê1㫺‘ê&LA®MŠ#¸É3=ržGÑÇJ¡rÝ É™9nÅáÉBˆ’L1 –Šþcm(aSZYD]ئ3"YIko&¶®ˆM²Wý|›ÇUàR' 2Á¶ŒíëžZÂÛ¿HA¨YìÁxÞר(/̰â[aKb”åÞãËþ\þ ¯z`J½sBòåáýPꄇ|†û€úîý½?xÞDf ÄðÁœ¯šü:cQüæ8N±a^s+²ž¡¾¿ä·ÎSbe8¯p CÜ#‰hÚÔ=’Èðy¹½Þeÿ¾;Ù?¨Ëƒ(!¾œß><èî-–¬ˆA§Ú~Œ‡Ø`Îʽ©â».\Èa÷„¦±Å¶Ò" ¹ØÍ½»cNn •sv6댈Y[L#s¥÷¦¿cïf÷±-±·Õ"{óÖ‹©•‘¹ÎÌBpkS‚ÖÂXíGéÊä±µƒV¼ëµÕûhyB xªZÜ¢'\K›‹íÆ'–óÁœ^[»æ«=0ž´^Ôs'eG_*[ŠË¿ž¾ìXh©g6×·vKßçÅläôѨ1eˆ¦ê'Ò±©|a4C~¢®¦Ð³W-ÚP[có#†ºª9Ó¶Ë>ãæÁ£Áx΀²‚Ô‚ç1d5TJZgç1f£¥–‡™sOìÒ9ƒüFÝ[ñ6ã2» Ö0`ŠÆ…ógÊ Wf¡T_¶åŠšF•Õ`núÁQ>©´^·yÂFŠi'©ò#î»>n2R c·UárÅ ms>O¹[Ügºµ°8n)ñ“¶øý¹xµ:Φ×À»¯_"’ ® ƒ·ˆ=N7ÛX6{NàOŠ9à,Ø¿£W=ÓQ)ÐÆ³>ÛÙ’hw^¼ˆt5º9ˆÓ6µ¿Gz¢ùd{®¬GK12s¼ýμ¤2ÂèÊ,³BŠ£ï”©ùq[_‘í.Éú„qgq…Éw–+ŽóºA3×ß_xHk¡»"wÛìsÁç–ò`\‘ó åñž˜ 百þ¥œË]³Å«¦”q¿[.6~±%·ƒ?E}),ÜàÄLø‹ƒËqÁ<ìÊdM̼‚àç2¾üÅö¤ORÒ[ AìžÄÂh”ÄJÞy<¥-qH"†.¡ [N‹k£òmؼž+pùRZàSÜs²+!‰‰Ô±b{ì+v„tÚâ3 „óxZ0¿ÅûTëyXb©…Kü²…‰†y€¸~öÐY¡4}E Ë‚8†åfƒ±â¥Äg€©΃‹€(ˆ/ –é8ñ soÚ~?)Œå–9;Þ)æBx?xÕ™s•§ƒñK†àìø X*ݳ¬«n¾ÏYãPø\ó@ ȧãû=>B´—:×XhÑHð™jï²æ}FX#üôžSâ´ìŘ4±!8K*ÉU{ŠwT›µÄo–`ä˜8õaÊ%-IJÞ.pIvíÅ¢ºÔß(nÓFW+d«X±cÛ™+î–«dËÕøïø<Ljø§˜oß¾{¨Å%³ú…̾x ÍÛ5œ×Ÿ¥0 -ºI³:6—*j&µëªn9]G«Ê‘¡Áɾꗕ¢~¡e’ÈMSImÉj£5´U7‰3›—æ` ûLíe%ës–šRK£M(õú/ŸágMÔÎÂQCêK-íç¸>b1{7k;@Ö~–­¸…Î÷#0î<NS±¨«]Œ‡¸ƒOÖƒ;SLbê-`ì…óÃõR8š‰0[ZÆ.‡âúLó´Ãœoº¢Å³¶G4†!>A q·à3ƼC¾] ”; uW‰S>Ô[ÆD'01 ¯¥)£$=~9ü\\Â\ endstream endobj 5876 0 obj 4134 endobj 5880 0 obj [390 /XYZ 40.7999999 141.139999 0] endobj 5881 0 obj [390 /XYZ 39.8400000 607.699999 0] endobj 5882 0 obj [390 /XYZ 39.8400000 607.699999 0] endobj 5883 0 obj [390 /XYZ 40.7999999 141.139999 0] endobj 5879 0 obj << /Type /Page /Parent 2 0 R /Contents 5884 0 R /Resources 5886 0 R /Annots 5887 0 R /MediaBox [0 0 595 842] >> endobj 5886 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5887 0 obj [ ] endobj 5884 0 obj << /Length 5885 0 R /Filter /FlateDecode >> stream xœí]I¯¹¾ëWè`ÚÍ­ àç%@ È!È!ðd 2ƒ8sÈßOëu·ž©K±Hµä~üdSÜŠµW±øæŸÿ~üçoÇ7ï>ÿçøuùýîó¡mÚ®ާ??\þ‡%çý`9ž~Ž_9|;~;|:|šþþvÝsÇå×Ô¸N1øÛ×_oæÉóÿ|~÷çéÓÿŽòø§é_?ÿú·é×Ëx§/ürÆîôáßó!…¦\~:5þëð—ß–0<{úûÝO«”yëøvî*žÿ\vE“µG3 ©§%Šé?„™Àñß~šF;/£´ª—FOŸÇN÷­9}îÕò5S/OS‰ÞǾ› "‰œýF•;;žN+y[­îýC±‡Vý¼u“}ç¡rš¶Ã3ÐiE"okëq࡚QO‡u:†hš›W× jÞæØænôõÊ„ây¨Ü$“Ày^‘ÈÛÚrž¡XCi=o]èÜÍŸ‡ÊHó¼"‘·µõ8ðPT9!»~—s7z*w Að0¦ç‰¼­­ w†úÄ¢aË û›§ãӗÛ1'ƒâËOÓJž­’ù×—i»æøÃIÕœ¨ñËÇß·­èþpüòóal̨z3›1s‹Ô¨¥ý[ÞÃ[>¢¼¶¶‡}Z¸Ÿ¶À>ú ¶¼ƒ-p?R–:¾LØRüì{„bF ÃF°É<!fd—ë„1@2pøœ5*8ꆉËÙEÄ*³úÎt¯Ñ2·Å“½"{Õ¡i¤³Ä âö,bVÊ|6RÈâø»â’b0¶¨€(“äÇ ‘ø]¸ˆßõ¹ ü@‡¼x7¸r wGà¡E OØ"?‘7x£sq †°­8¸p¼#)íázeŽu;øp2/"xxpXÅÊ(F[¬8RÏæiZÔR̨0K ëó¨B4Fw¯­%ü,vŸ^«-E”ŠšŸÀ:5›%²bµ©D ‹•åx£5ªtº° ¡°8”o%àù"Fe!63+šal_[í8﬋}iy ‡‚<€SÔ¸2=AkâuP¼9 r‚¾X\^)“ÁkH0uaŒÇ|̆:x KKàÐݺ…d´Ð¸ŸGI'˜%î. *ä.š`»Mp$ '£Ì11Wâõc¹–â xª¥WõcP ]Säˆý Áéù²™1—[IK¡•xç§+±”4?iЇÇY|˜Îê°‚”³Ivj”Ê®·èG§'0‹ƒŸ0”ºPEI=H›7„ü žãPª»íq\ë3?¨Q_?¨¢söœ»å“!þl[&Jذck¸ÆÀ‹CÈ£œ“³Ø¢Äà ûQî2Å’‘®$¦«Æ`ÿx‚U‰=XAÚ£ÆáxcN·P±˜9å´ÇŠ÷ü㙂‹¶DrGO8Ô„Y|øÇãuµQÓãn(k9“< !,«C®ñ¤à,²ìm@µ»¦BEQÀ„Ê·ÀÈem)P´½°ãÍãI'P•5˜wÅä¡“’Žƒø7×} g¶îɨ)Ĺ'£Þœ°øpIzuN¬+#X^šðêq¬èHAº$Ø’ÑÓ[òP‚<á×ïÍê‰HáY°Èˆ°Æ´È’,‰¯=†|)’¿u×òñe-ÖÜOO9Á]ƒµé[`k§kÎãIà–÷QD7ZÈC‘v)ñ“[©W!9Ü`̧è¢îŠì¬Ò>q~WY]$쫪Ílj'B–¹–’^éHŽè¨g[áKIÉ7IäàafÝ0W×ô:ZDx¼/¸ÅÙ,‡aBÉ%zalbÑ}ã³·=Š[‹¡V H„¯‘®b‘<æ)}ñ†) ÀÄäðN57axìs”p~.ýq¦–¦¨“»MÍ׊ÆR•-®(!~Ë–@.‘sªŽµàý¼©kÑo\ —:‚)œ-Œ¿{¢ì0–®à ®Ü†Ìu8)‚Âe¥4„›Ò1v8§ ¸»ŠE¦L;ìttûÌŸû,æV“ºÍ¹Þ@UÖÝNÃ; £áïKB›n½ƒmðy<-øì!D¤t<š‡ž1–³‹„÷Ùfû¤“çJ§ï-[C:F|oÛ^ÀN¼ˆÀˆÐ7Ä[û£ý™Þ®Eqž¬¾«Ï-±x$®Ý.Ÿ—ˆGQÃãAàÄ }_³\?B+®`á²×ZfÎ,Ôº¸ˆµ¹‡‹p%ö¨ i`Ë»Gýµ£ÅûÃ&œ ¹àÖ='‰ÁçÁ£yV‚Nù4‚®[«ðªUt:ÁûÇÈÅÅ_UN”ÕáÈÕ¦ÊøºS|zá[£,wW(1qJN|lóæ)nº‡¼&§&SJsDÊ„Ü]¿<æåTà¹MÂ’,ÜH‹‡×¾O¡ÙJ&„ —^¬n…M lc#›³ØÔ ˜Ícgûn€:'¬LŠØá†O BŸ vÒyêR@Gveà(ŠÙ¼aG%^5~ÂÓⲂçã5v\@Ì^Â~°« ãÀNÏ ï;Šð~ðª=n½»„Æìüó`^Á†a ` Ò³|=üæûñÀ¯€ÂàÚjÉå¶bsDh%ç7ªH ¬¯xÂ(I‰ÏÞãæ'ì4¨ÉÔ9­ó«R "@¤–ÞIÑú<'L‘Z˜W`NʫۅRGŠKG^¸) (tû`¸mžûŽr])¶®ði¬~ Xd¸Z"– ˜ÿ,xÂ\¾Ò<ž´ Èp …Ò[l?`éH¨€éÙ)öä°ÎãI´ à5IÂ;Å} -`*ñ¬Kd|Ú˜âS à‰J‰JŽÏVú*Ì×!2ô´ûľۧGñbež-'J×Òb±žVS³Ôyò{kVA=­Î¾õš¢^Cà ¤_Œí9ý‚åõÍͼ¾”’I€$!ÜÝŒ(3šp½åÎïS| o–:\•Œ úf=Œ€—x×UÂY_͈¿¯È[ÝÎ{ötµÂbx¸åa^ÄÒ½²ø¿³¼ôªLeËTˆ¸oNšpOËÈ\-Ë 0»Š¯oC*¨ÅYzã18Ú­žeßΓ» ¡¾¬FK†ðhî%ߎb®²–ðÔ)©ÞªÃž0Õ ÅU†Åb”"¼ù"uÿÊT÷+C}5SÇ~MØï§¶›¾ŸºåôÈšw@Çq•ïqˉ+ìtrtR+eˆ´‚J)-éQ¶J×S•RM»SêN©q2uýª4Ü…+-¿âF‚r3·zä¡…„r¼E5kÛK,µ G÷2˸Ÿ7WHÛ%?J‰W‚ÅõÕQZ`©Ñžî|-ý\Ïæ}_%eÇ ,á±9÷Z¦Op#n±*úˆè÷ªi÷¡Ãï^©cÇõúwM[WŠï­ÄIü8y›pµÏ“ˆGI9Çv!Þ³z*`Z oª>¦:¼jÊ)”¸zP‡f”Ê ™]¶Ô“-ß—U\Ÿlñ?w.UÛ½FјŠ¸†à’‚~­¾œS¨ÃSPK7pxÜ×Ä}àÚ¤ »Šáò6STJ\§ÖÜÓl˜ _+˜tòרáZïá)¦/å9ßœG)X¼BÉ3„YañÒòÿ›óšUêºå¤oV‚Úryâ“qüevŽ›r8Vð9 ¥7xpXw¦t‡Šâ_è(™—ËJà#¼O;Uòùî*}Dð)ã> =HÂ*Þê®ÄqíÅ׬•œ»™[[L*žÊR° '±ßsô)=,™%,ms;©ß^®'ë2Ìø''¢|t_ߨP€†õ‚JÉŒü˜Ôž'ÀËð’ y†Ï3üz)$o¢–)Iޱ„·.«ß¥9!æ\^Ž(£-æsŸïZ‰=Ï„T®ª@•)h¾®ý˜œY.‰mÑ^Ê›÷@ïðHÕŸ_¶Û#Z÷Ñâ-gJ(¦ûˆ155vÁõÔÌ×ÐÂ씺Sj¥îwšQ:ÌSjy/ô°>É\¦²AŠçÃþ*jQô#Ç0fñÜ»ºc‚4‹PÁ·ó´åÊRï`K¥Çke§ÎÅMðå+|«®ð…­°ÌMHa¤¨‡e ]°hä+þ%ÀœûÆ…µ*Bü2Gßrt¦T*×öKè­$åÑÜÂÞ:N8{8q„–x«šd)Šsz/%#&ÂXÒ$¥þZ¸X?!O)¡ú7K6…|OMawzé8r®$ú€gâ JjZá:fNú\B•œ 'ˆ¡p]’ÿ3#?g+ÞušÛì±ê-$Wö,ßÛ")“0«éØžÝ.š%”¤s¶£«™F§#¯%Å#ŠaÅRý9CXÁ,OÎ.’/ÖP®éPžØ~ÞTÖk ¯cã«ë_ÚÁ¹R8# ?K‚±·ŠàkC¸T~ˆÁƒÿ8c’ˆ!Š× Vx°_Õã=S¼j À%Ð3žGÁÑHç³ãŽwxeŽçLqÉŒ Ífúsü61ã‰Ñž¾°üúú‹‡;»l½}a럼ŒÝÛ5%éŽbÚÆÕühÑ5³÷^µúõQw]Ó]ºq”§™Uʾé¯{äú+-³ðQª‘ãU×…1M7«B¶>wmžöaŸÙêeszYº:\mFjã æµï.Π+;üˆú,ÎÎk-ícÖi}–KÙû²¶gÈÀºÓgiÄù"šó½%àÆ„Óg©Õµ.ÆCÜÁõàÄ”%>y0öÂy…úZ8Ú⸼¶6Œ]-x°Ê¥¼–Ñåò"]ZŸy34jvšG´xÖö̓ÏCPBÜÇ-Ƙw,®ž\ʆ¶kÄ)\úš„1Ñ ÌL. P}┤ÇO‡ÿŸÁZ× endstream endobj 5885 0 obj 4345 endobj 5889 0 obj [391 /XYZ 40.7999999 496.339999 0] endobj 5890 0 obj [391 /XYZ 40.7999999 496.339999 0] endobj 5888 0 obj << /Type /Page /Parent 2 0 R /Contents 5891 0 R /Resources 5893 0 R /Annots 5894 0 R /MediaBox [0 0 595 842] >> endobj 5893 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5894 0 obj [ ] endobj 5891 0 obj << /Length 5892 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"Eêüš90l ‡ ‡À›M°ˆqö¿uKêžû#YÅ"¥ž™À35©b±Xï*¾ýã—¿ÿùÛñí‡/ÿ9~›~ør¨«º­§¯ãéûÍã?è¾jôôk×ÛJ§¯ã·ï‡Ç‡Ï‡Ïã¿?ª=œŒ—WLþöí×ÃÛéå‡é/_>üyüíG}üÓø¿_ŽýÛøã§y¾Ó¾ú¡=ýòï饕îÇÿ<þíôð_‡¿üîøëBž÷ôïÓ]›> Ž—¡êüýx(zY}´ƒîl{TJpÚÿýÇáçq¶ Õ`”êZÓÕѳvú4mÛ™ãÐS7ƒ3©³¶È©R'ê•–™è‘J[šªM矪êM£šN[sÚ†Óؾ×ãï]3Q–Þ6ç¥6‰óLÉHl'´­#D*ieËfÀ™$÷¢©®LâÒ¯S¥N¤l/3Ñ "•¶´y7ôÝJ@`ZÅsù㤎*½`ÊC‹LïZÛúφgcÞ‡xº™‰¨ê‡ºõïY§Cš¢YèG‘åÊ=×5ŸÊ©«ýÐ.d –ê‰Y¨,jøIô>ª'V~1l5T=¦1ÃhÆ`£+Ùæw›íj óÏVC¼y 0åÎÙ lÊ9{9gfsw¦ ©Üƒlh3Lp…`wÆt'yvî©ìIÇRôÔ6æõÔÆHû;šJPRÀ™3ôýS0o9› kŽÐŠÓך1Á•€•Úx·2ˆÌzsoY«ØnÆú=vÍ8'ŽñílÊÚHpш]Bñht^C±¬ñ{á^„]n"V k„<ñn¬Žó‘@ÀîÂÃ^P‚)‹é7Þ{•b:GOp/áÕàǰ\`dfgÎU@ÌR^ÕUÛ©'¢yÇcÙW«Õ!ÅO\Œ­ñ⸖fl&ÇKt»NC†ïž@ŠC5Ó)%H|Œ Ó9,9òÖã…Lð$6‹Öèˆ*Bˆ ¬Ùx0·àT‡†ãþæø%òÑLŸÐÕÄ…}²‘üÁǟ͉8`,^ ¾ŒBc¨_­Š Œ’ â Ó:oE+`ü¾~§Ÿ]ó8ÓP3"nÙŽ^-øP— pâ ž»í"ÈiÝI ¹ñ$„@Á sN<ÁD[PŽB‰5¡øø%ï Í™,3žÕF­+B9Z‰g Gká¯øà3ÜFaE7Â5"«íØ“`Ì;ήâèí®—„£üs„†„‹%̼Er#õ® ‡BÆi~Ô5Ž Ê¡ñÞàÍG¸wy\ÐÃHÑ}RB „óD`:Á;Š?fÈñjRfàñ½Çç{$^¹H†áî“JóÕ›S›§ÛIJçÁU5L@P8ѦŽhœjÄHÞòÔAdB+Ó®ðŽTØœ@X³bsSÝãðŠ·G]®yÁÃ"™}ßԞ͟Ý9,C"ó>L¨yê3<³®}ÅÍ@ÔSµ_:Ý<’¿­­í#¥–i7Šoi÷—ó3P2pDÈ®ÁžnÉõy&“ Å)©Ù~O¦;æÝÆB܈ŃyÐMÝ-¡fN´'?f¢ÅóÛfGàwèüŠfE{FÀ,oO:®³Àcpv<.ÌÇ5 ø 6½a£qm Þ4ÌŸa+B/J¥Tííù<¾º„"xÒÆÜJ56x¶¶oâáƒO7£Áއú ,æ¾;Œš¡íùh1Çr “I]úîä œu2‰½XY”°2¹e2» ccâÆ»ŽdýA;’`Þµ—7œTCHËcÂ{&!ìR|°•S D)cø·hw¢ÖìS=áðdx¤<¤Ý5_"$Cz³‡`éå¤e‘M›gúÌÊå2-—w|ùûÕ2‹$Yéœ[Z0öÊ4ÕËR•QÜôV¯ÅhúfAª ËŸ<‹¬öehüdë P„Ž Ð˜ßzÖõâ€ö”ÊE9u@Œ^ ¢%d²yÚa^¹•é/–u÷^4½2O;'Q‡¢! ϾºÕáDZ|ï¤hy…ÕÚÌmƒ“yl쟅h«VØ;B6É<ÞsÇi»Œ’ `ˆ¸€œ­Ï’UïRI|‰4¥¢-˜‡Aw' 9ýJ¥L1²:’p²§6Qú£°F"q|æ €˜~Ȳ„æJ¤¼…™Xä³0œRgÅ©±q\>P\§Èˆ¹_cLƒ {š`%IT&% ‹Pë´à ¥Cçfw‹µ¬mº½”tI[¼yªS]³1u«ýo> Æ€{òxòà“çåY¦˜Ò*·Ì$’ õnÛ˜¼ú{y\BCD¯ÂÂîÊæäÉ©Š?íã¡`¼Nʃ½-ǃ=ß–áÉqfÜJàÉäÄö˜Þ8ÙÿœÛ2dï뀰ïëØ2×—±?žü`N®/' žq…Uyrê·SàÓ(›#­á}B€s¤=ÙÓŒÜræÒe$åµ¢é™U¨ì£b¬Qmxu!Ž éæp3¶8õß»€yQ=êéëz˜ô¤^”¾Î®Ÿ´ô1à{æS]Mjï#2P³žÝœíŒÇO&í+3«àkõëÆl5ƒßƒgó@ðßSèfÛÆ(½ËŠ N¿Ì1^‰ÒäBñÙÆ!(>Á”Ú€ýä÷s¼ñ ANN{íÌ¥óyºj”qHÜ·*%}‹ÒŽV­áZÙN‹)„Èé·ÍéƒÅ³Ã2”{,4ØÜu\:^òRÚ‰ŠÜy‘±s?סç,­híZÿß*Bé‰Úsš÷$ä|ÉyÁv)¦]¼žö"ص‹]Èœ Qa‘žðƒ¬;¬`Íô&ˆY—)gOpø(Á­e1¿Ló¶n–·Â@¡<?‘µ—”RFBG,”5A(´cµOšôÜ+Vš¦ËV]  &¼ °;§y®ãàíö’ª@§õŠÕCŠÅ;ŒéSùÌgÊ`Ädj!‰1e*ÆHI­´mŸkˆT–~9ú”,½å}ûôt’Ö½ç'%ÏVWÛ§g+¿¾ÚÙKËÜb™só1''R¢ Ë"[º^8Å{~ψRö<·ˆ‡«WÊ\èJhñ›Üqc)‘ˆC¹‘sï¯h“&˜ Ñ,ÖE­Vá`ü¤@„s‘FWÑp—Õ±\r¾Õ® îý‹I„¡œ2Lg„Ê£„’]JBÎ-«…ÆP¼‡%"Üa)j^S ÑÍŠ‡¼zÁJÜ7hô°Âû÷ ŽD¹Þ|IMÒå„ñÅ í¢^eÝf&B3J.ïXÿ{U/ž©zQº«›¤ž3U©s¬BÛNBh }h¨¹ü¢õ”¡k×*‚X–KÀ¬í÷WCñ}ŠäíC)ý2yúÖ>^Öõ βR.Áy.KJi9™ áñ©íyžï'ÒWí‘·4.ó•Ö9ºÏåäì¶_³vBshÑ"JQÃ%…÷7qû˜pó?”ÌcëÛUTúd|”Ìè/™Ã¯×¨Öå®QÅùñx6œ“&–%ÐÁGrYPˆÛîmÎѺÒ~;Þƒ¦I0°ÆG¸Ý-¬ŠÜq]©pÈgUŽ"“h.å6€2ýþ²2]‡ëÞuÑnD­ý-'Bý×diÕš©$? ‹i…íñ¨ˆ† JGÉFåÁV‚ç„ÃI%‘åVÝM½Zvl8Øf-3°Ÿ„욥±Dæ.ayãÉ:Ÿ%‘]¦½>ч9tK$Å;K1/åpYY•Àä‚·µ0VmÆÂæn“EÄ9zWÅ ñ¼knáI* !ÄÑXäåîÏæ,n( ›Z¯Ù@Š"âøø9Ûž7 ‹c nÞÚä¤\eÇá`Ï4™`Dm MI»G[éNÅÚÞ®øò}{µÌ4½®&P™nÆçÞq‡wŠî®p•b dÆwÔtïN¬”mù{»»ôÛa…mvY6´k,Äg;rrEs·­Í€X2A‹ä`˜À!NÜSGˆQ%xëó¦qnv·-!´¡G§TÌ—1t]† „œöìu1!Ïç> }ëµ½PI¹hšfÍÿ²?—¾9(Å£,£Bqêgu:'ÕŸ? ¶´›ÂôL>AFûÅÌqõÆÓB71Á0.ã\ƒ¶ŽÝÙ„ÝòÈ×WYÂütåçÎõ6­ös­¦Ñ—[ÇdªED²¿¡Ó’€'‘Yí¾L§HœÒÁ‰¼ˆFmDöw«P!î1v-Üä…ÕKDÂ똻E Ãqçqý‡#ŸwMJûlè`U¿’Aœpò¯ÊK*…Ø:2ÇÂMP8¸i¯¡Ä`%U¸Ù¡rX¤óXÞæXä©gIöÎÍ!Kw•¬yWgP’Ì 9K‹Ìšï§,ºa{‰X#Hʘ#Œ z×"bã÷ñǸ‹ã&>0ÿøöݳ­.=ÔWzøì¥ïÐ )õíQË¸Õ cPíTŸ|lêÅm0;ÄÚ¶joGœS9H›Ø–îªî¶<èn<™ØÓTz¸ÙÔÏÚª6aÍ n½§‡c8fbî®tÝœ]Ÿ¼‡³Mäøø/ággJ½±Â4fæ>·ž(´ŽùÐÒÆÌ;FYû Ûù$PÝéwmÕ…Yø¾w :À´3ÓrÆÌ}’ÛÚ¥xH;³Ú”¢>³€©¾gv…Þg›¹ê-Ø0u9gÁCUî¹Á°tè\êž1fzí«fJ‰xâí½ï!Æ †´Ÿ`cÞ1«±©'·ïë¶R§ËÜža|èf&ö±4”¤ÇχÿDlVP endstream endobj 5892 0 obj 4424 endobj 5896 0 obj [392 /XYZ 40.7999999 285.139999 0] endobj 5897 0 obj [392 /XYZ 40.7999999 285.139999 0] endobj 5895 0 obj << /Type /Page /Parent 2 0 R /Contents 5898 0 R /Resources 5900 0 R /Annots 5901 0 R /MediaBox [0 0 595 842] >> endobj 5900 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5901 0 obj [ ] endobj 5898 0 obj << /Length 5899 0 R /Filter /FlateDecode >> stream xœí]KoÇ¾ï¯Øsú=3@@¢È> D ‡ ‡@Ž‘ÚÿýÌì<–;½_ÏtõƒÍåH†Hoo¿ªë]ÕÕÿúõŸÇÿ~üx÷õÇoãÏ»¯V1Æ?Çþˆ¦’bøµnt%ÚþÏñÛ÷Ãóñùðxxìþ}>psê8þè§)†ÿöëáã0ùaøäëÝÝoÅñ‡îÿ~9þýÝŸÆñú/|?4­éùïð \4Ýÿ¼ü­oüÏáo:þÚ-¡9ÛÿûAÕZñÚ­ãyîÊO_vE“±£n•¨Å‘sÑ­Swàøí_‡Ÿ»ÑæeT­âÝ·UÍ6Ú× +;¶Ý¼æÖ ÖÞ6:æ‘êWÄöƙªÝCU’\ÖB«þú#ÐM#ºßk9þñٺ᧭×öûq)ˆFšHÇjzÔ ÙÙtp$2˜¦Ž÷i¤`pÕFD:ÀnEqàGŠJ —ÃÆ¹ ÝúàâôA]±VÖz0S†f}Õ,?¾¡*5t}ÑŽj Âî†AæÄýââa­‹=(œ_ _ÕåÕp¡_®YÃÝ,!áñU®ÖÏ–‹w,Ñê«ÐB, ñv3Œ8?µp1 »[ìá›Ó¦¼Y ÖrJ¡ {¬c> ûÜû#ƒ…ž!¸Ž)ÈA—ðÌÀUÂþó©åþ©ãgI¹“ó2$âzÚÁê nç[6Ôq_ë«(äã;ÔŒÉ@<@á 0Œ‘pœ-A©o‚¡æ±QÌÝ·ó4Ç ZxxŒlƒìXàƒJ.7åD“àÖPâ+ZÛgJcäBâøˆKñ à¡AF⣨v ¯P5-3—$aíÂCòÀµÊ¥Úëб¶¹„8W76ÄH‹³Ø+ZG S·)Þ2,2¶˜`×àÍv=ÅÃ$ù44¯tïFÕ.|/bǃë;+_’¤‡= ÷§îcq{®d~­~_ËËõ´•¶ö/`ËjŸaKë?Ïè*¸Ò"5 ®·8æ‰fòm8“V¬®·0_N8aÇ<÷Vm>X)ΧY¿±Õ¾iz☞àyãU—AOH  §\†Ã>Yñ·©3ÒÓŠûK«™¸ï6+HX—º }×C÷ 9JSè׎…`í·PTF÷”‡rça¦Dq9ác#¨úŽ|ûˆ)FzLשׂLÍ/¨Ü¾íæûnQ%H÷ß´tN¶Æ¿xu=GJØ¢òAÞpyAÐ(Ç'<º±n”^ãèÆÅ|‚Ìb5Š–˜šíù ¬$9›†–s3›ÿ6|Ó¯®Ûå‚M åkƒ#4‰â戹Ä(œ:^kÁ ñIdI“b!l]x5¢4K¸ÚèK”IÄþ£ ’„z5!êå1±§q̇3,³ÇcQ–8õÈí¡DK£¦V%IhÌ®[ VÝCÓC ³}&Û™^NÛ­>Gÿsù¡5ÓëYËÉkŸËÛ+ ­“ËÓŸüÏDàø¶8×üÚ~v{Á- ãlÁ£)FÀĨ±?ÁŠ}Ä-x4ì+ xFŒOï_¨[yIJ×ä Á[îÐn,&sÂGgzC¶z¶sivÚëo;óiÝÍ#(Gr®_ ÀÆÛºŒC+00×`xMÏCÍÂ܈Ãü’p¥l¬ZŸ¼LH’62E16ý/¾ùäƒâÝXñH{gb;‡£pá׎·FÉÞ~Hvöö9Z¾ýf#IÚíÉõE¸m5_bÞCîYCîÑI ¿ ÷êƒá÷„“ö–|-÷Åu‹ñ ;DqìêÁ©ÏÐ…II[w8 Ûx?÷*¦mLšsœÁ•]r¢»¢ã)…ÉÒx4ÜÇ!‘ñhÑ,Ô R¯ Iñ{‰fëPlYšt½]Ø[vÝaU[Æ}0ß İ ÄTO‘@X c‡ µÞ>(Øê)Ù,·»„OF´•©f{¬<œkØ1F(b{Z ÷ð;$?×ÍâÄ̳¡šC& ’ßæëëÿ]îzý*í¹ÄÎdŒT«q’+o;Èè¹ó‰âð±åTõð‰SÒ°"¨¬ÐkñQrIhùô>%ÙÖ³#(á8|p»4$•©[‡Mn‡ó¨£„x‘wÇFñ<ï–»b8ÚóYØ@ØEûÛÔ!Üo¡kx:.~FŒ_Ê—¦U ù‚ Çé“RÃyˆj@;©vådýTo£Ì Á &n=G¨· u‡BˆòÛËÄ-Uý^YAÅÓX„ùò6tg{_¢O‘¾3‡·˜ipì‡ÈXFJ3RF*WY6’”è¾$”ïz–fóm\RLƒkÀäˆ*B·Å›.J(¯§Ùüyg)X€ÔJŽÑâüêG@™Ór‚¿8´¡–ÂmF潚¦z”tž œB‹)Ì-3ùaJŽ­ún®´ŒMÈec–§ØDZl’C>Å&l*ù”¸Yʽ¸"5 ×¤튠ÃäN%Ò@&ÐkÒ@Öü7Eù¢´ôÓH‹Ž1÷Š{z×U2àh[·8º–ñ•ÁÔcЇËjЊ,JꦹliÁóŒ˜ÑTJ,æá“VMö3bQ]IKí‚-# ][A¦÷Áµ4óý)¨Ê‰ _€·øÔʧ­ C Aq·`cÞ!^TP Ü¦a¦â}îÿ% c¢ã˜^<üûS’ÿÒQ[l endstream endobj 5899 0 obj 3246 endobj 5903 0 obj [393 /XYZ 40.7999999 374.419999 0] endobj 5904 0 obj [393 /XYZ 40.7999999 164.179999 0] endobj 5905 0 obj [393 /XYZ 40.7999999 374.419999 0] endobj 5906 0 obj [393 /XYZ 40.7999999 164.179999 0] endobj 5902 0 obj << /Type /Page /Parent 2 0 R /Contents 5907 0 R /Resources 5909 0 R /Annots 5910 0 R /MediaBox [0 0 595 842] >> endobj 5909 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5910 0 obj [ ] endobj 5907 0 obj << /Length 5908 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ!Q‚3~È!ÀÀääx³ ñ"“=äïGQÝ=¢>J,–(õ´lÀÓ¶¨b±^¬?þñÛß³þ–}üôí?ÙwûóÓ·S‘UÑÿɺ¿®!ë\Éþ£©Ë\6ÝŸìûÓKörz:=µÿ¾œDõú ýѯè'üíû¯§ýËOýo¾}úsûé™ÌþÔþï—ì¯küdçë¾ðãT7U÷áßý!…¬Ûÿ\êÿuúËï²_[ê×y»?hSUªÐQp¼œ¯¯E/+²²)M]gBÈβEÇÿqú¹í F^k%”‘¥n?7•6EYײýl”ý³èMFv¯ª*“5¦ÊäÄ‹œõ.›JÄNÔ­†e¢"·4Qh㟊s;ZŽ)û¥·OÅ-þ2UìDíâx&ê qK³Ûá™*o´¦Û†ÅÁ‘¾§ǯÂ|…#x=ðQ ~ РܥR…>Si•ð­eó–ÞÚ€W¶ ì^Ùe_©{ô–¹’µå5â{R"/uU·›rÙ¬9õ˜²t®ûÍsvÜäÅx_õøLÿb6cF’/ð«ãY-O€& Р ñHQÂ3‚ÞJœ-z r˜m¦ñîÈ1>…ƒàží«\ŠzRôi<™guâÕì#Þ-<=^Ñj ’CÁ_g]Ìn½ó êöÖ•kJé‘”‘PùyÔÕ8‚UÁÊïs¸ò£(2lY: Só;ØÁŠâOý"•Tf¬“fùÉ‘œ!*) ”íájw,Éì`mYÀÎج€¤¯ûÝ”y¯/–©½Õìp¥4¶¬ÙÕªl¬ wªQ£òXdx‡0¶áÞaÉÏc4OXL:u¹-Ê«xœµªšÅ'ù¿Š¨—ãuù±cÃŒc§{øiŽÄ?•ŒÓ3‚yQ~™µÄ §ÛcA‡L2ɺ†Pb´å»6„ð{°¹ƒGÎ@ ®YÇ)6ßVähiX—ýuhS—©ÄJeÞ´¢È»øÒµ¸OåXUB/ÑìO~Æ‘’$]Èbdâ郿 ½Iž^ÊÁÛ3k’øLA×M``Âuz¼¬''‡uê")`寋ÙE\ÀPL)×>ÂŒ™3 …­1m³Ãš:¨®ÆJ¨§À:¯›¢z»$Š€Ç[…™ïÌþ¼èïMƒ5«R¸çGf-?F„„]0ó9+§h[HÔ”è\Ôî8¾çĈßKÑq‰<ƒ_ÕTeåðãónJ]Çë¼Eü˜ý+LÎë8C1ii<>2zÞVdÀ'ÀrH¬jçÙÂs $$e†$ÓQ|d¬ g&_רæ Xz äŠú 2Ïú Ñ)è¦ò[]è ÉÎëd©¸b— 5Û!n6Ù¿*Ú/XÐ7ƒãOÉ%§BÔcÂ=)ÍìêpôGì=û÷ÞCé aªÂTó4‚3ª M¤Ì =‡¡Æ™ø=0ÇăQüÂNœUMBkÊ»£1Þ"@-c™DHšNI]U¬}+Ô|ðø®•¨eíq{ÍzREZpB€dD!Fà–$‚Í¢Ù·:¦T&ΓaÈ*î%_Š%:àÇ'Õä²ïâˆ#£jëqÅ‘Äj•pôðdÕð8¥8ÕQÊÁæf%ÅÀ;FZЇ&ñ̆–˜Þð–p¸¥ôŒØÞIá)ÞËQ.\¿tÇ ôL˜—så ‡.`Ó¼Ãí%ämŽðÊuÏþv;®¹¾ÿ¤‘Þã.C‡UþŽ$1Ö¡ø=ÛËÁÛa–Þ˜å£G6¯ô¦ô¼;]°¾ëZTx\×IêËY»ö\UÃÆu÷i@®1% yyå v÷9y2¶|zQMGL* è@¨„áíI²gGõRÁ”³vHe^„ 貦x—Ž|¨ùæ%8gz#¥ L¨jÈj!9° ™t8°¼Ösö=Â|"d(zŽ@”Ù°;ló£ s6kÞ~';*]kíJ]òºY%þl=Fîk„WâïÙ­³göä(‚û$}Ȫ«=Õë)]èÞJ_Þ¯$>J_nVz¥/÷§ Ö/}© õ–(§îHZ^y2ß*Ÿ’VíøgyJ'vãC\û7ÇzKä¸Bdžy¾;)áæ½,÷ô†Ô•Í–„a§ðû¸ 8æ¦ïäËÙD¸Çh×¥œãaúj\<›Ç?…-phg{Þƒmf¬Wy»ZÂg(Ýl='$Ê€`­¥:¹[¸æó…Qÿ|XØ æc“^°JQpH'þå uTeˆݪêÞê^H©GÕRL&`ä¬y©™TcæÁ%‰Ë/q¯L`-Â]©Šú=¥D‹éNðÞÏ'1M{ÑáIüÞD:/&omyKÈ®ÞйÒjWô;ƒx…›)>—}6hU ™9âl}ýŸ 4R Ù”ã‘*üÏ{ôÌÞ¬òÞ“åØ¢Èû=]2ây²$"A³òv¶~àÊ–hÄžê\ËÔ6:05‚!–ŒT¿GüM`C]@,Ô ”OsNQÞê*FÞãO ÈŒÈeÅ"צMuÍÜþ.wsa$ ‰taÕ:öKŒ_ù¢…åšžç‚Z‚IµrS˜ãÒÞñÊ×ÔEµ+#‡3ý¾?÷r¥+É·¿aåœ}÷ò%É2å9;Çwï©ÎFÈŸõ¼'á {ÆŒôCPÆ’Ii=䊥¸jžZš Yi–5·Ö“uŽŸÙñŽ÷%j]݈¨«2¡˜ñ4¢yûÊ©s=áÞõ;³òœ!‡˜uÜ·ÕÇÆË"<ÛßðêѺ©úg&Ò+’Ð!/Ž´~YkZ)A óýåÜ’¬K‘T&ú¤²ëýÝžWo…"…CÕ[5LÉQbI-pî °t7aqHt¾Íü|£ý€9ÁÃÒi%¢KK~÷’5µ‡rÄKD€!À»¾ n¿½s3"S¶8$,HÄÇg! ÚòÔ2V1Å—L1g%“)vt¹ ŽR‚9‰®+áH~ ¸ªƒ§ˆsž“(É’ÉxDCZ% _Pâ–(?%U>˜Åù•Ûçƒ=ÀgpžÖ…c´?¢Ù(¹]8犔ÛÕX Wc2Ò£s\SÎõxž¡ç­Ž7éÚ“GW!Ú¹¤ÃdÿñÒ!ûÏvpœ‚šòLñxÎ&1§òƒ 5„cz¥òfJ¥ªéa©O^yzláqž²Ð±)M2²×½}1Àœòô­â·ºAWî¢Kñ!b\:ãònÀÑ’BHÃãÚ ÚN›j¤+XÄRÈñ2 »œ5ÁxA¶÷¸¨ÏöU{ …çjm<ú3Äùà€†ëScV§Ô(²86 6¢9¯ÿnÒ†÷ªÆ ÞfCÕaés›×pϦqëªTI´¸%¥±æ Ÿ®¶ò4I>·’KçL´»‘\ ·Ü\r•–ÉuH®+é$Qp‚Ö¬ {Ͼ/å3RQ÷#í$Ü­í¥ÝýÈ´CÚѤ‡O ×<àò¤RH›ùÕ½3)¤a›î=K! 1ªá.ܦäb–B¸Q"e_¶A±Ÿ0…hÇsÍ Ö»¸e=–”&Ù«·6´¡EU,HÛMBÊ-yòèæÛ ÅäsR2¨p@€àéOù é½Eèü’½yüË&6_è‰G<ñ'ãÈ¡Taâ¥ãdoJSžå™¶è[¢«±>Ù$NÝ[ŠõbXýÙR|©Æmãn ʉ¡ßqW¡äDPò;®ïÁÄ0o½ñö€Z9£‰’™zÔ¤Rm hêª)†¼œE·ÇÄT'$l,W› ®Üè1uåA\GÂR9Õ´q]ÛÕþ+·³—– [zí¾`|ÿá¡p—5Š k> endobj 5916 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5917 0 obj [ ] endobj 5914 0 obj << /Length 5915 0 R /Filter /FlateDecode >> stream xœí]Íoܺ¿ï_¡s(ü) (à8v 1ÐCÑC‘××â¡y¨ûý÷«]Ik[Ü%G”ÖYˆ7¦Eg†óÍÑÇ?~ý{õÏߪ÷_ÿS}~Þ=ˆZ4¢ÿªŽß^ÿBùZ«þ£ó¶Víñ«úöýð\=¾¾tÿ>dszpøÑ ŽKôþöí×ÃÇ~ñCÿ›¯÷î>ý¯RÕŸºÿýRýõoÝŸ†ùŽðýàÛæøáßý©¤òÝ^:þëð—ßU¿v øÓ¼Ç?ç¼Ñ* Žçó£òôýúQ´˜¨lë´0•”ªƒÓvèøï??w³Á¨»¿•Ú)kºÏmcœ°Þ«î³ÓÃ×¢•œ:-¥ÛªuM%»§¦ û]8UîDÆIž‰Žɼ­Ia\|ªº5Rº#¹‡Î*uÚfks÷9Δ°¦c7–‰Žɬˆ‡3‘ñî\ϧ.uÝE¹“SQŽyw¡E`·ˆ”ˆ»\läœÞ¬ “$Ø‚º$"rx¥CÆÁްø„Oí*Š4Ê1ìÂ]Á*„e¸Ä„4Ú#Ia{Aѹ¸è½Ã×ÖÐìÒȧôg”JF[4" xDk8‚wz‰Ñô>}$Bí;HS<[Ÿy€#˜álj¼Î*|]F:´2C: îÒ<j}†<±ˆO:–\7°oé !åä—¾ŽÁ³á³ÙÂuðY H!>Gb^y¦ÖŽe€†X¼É€=Œ\§ X§c ÛÄsç9mx²–BMA¹¡Î!ˆË ñ{“{¹R¹ù-£6E‘(®àI7þ Nº°ÝNúF®ó¤Öé‘È× ÆD"ÑÈרcŽ`ˈëÈ3ðœR,ìC çtÅ”ËP9cÅHTÎÀ`°ìŸ‘jZò ÎÖq$¯ÃÌN’%dø‚lÙò|Q˜°JH^A}œ,#),ÏER=9Ùzü§„J–”ÏVˆ<@ÊH*„6+¥€°ê„ü”ay !SwE k*×L4ÄûÈɧäƒ1§|^~ŒK§a5gÌ»PÖÚQ°¦:#æ64v‹9d8 KHÐê¶ µœ)L-‹S¢¥¨EH²í„Z­.L­;éÔšq¢ã²=¡p´tÝ~Â.(özBýôû49"eá¿9²;v¯ê^ƒRÅ€8 EߘXŠé3jü"x8³¯)^ã<ðÁåŸidföi˜§‹wyMÅ`õT3Âk,7 Õ¢óx5øRÌ,¿]•ªNžG‚p !梦A­Á`¾²XÇ•ÇÍ~ BWË(61²jçy ÏåÑíÙú{ƒpšwr¢(*;òÌò¸î<™y.”œO¸›sµjÞF US`Wa¶^áÒWWµ±³üAJI×õð©_~±)árå<9Þ«ƒÁqVw¤Ê3D¶¢ä>rmâÆa›vãW½K¯ÄéfÝfÍ8’-¡äدRÇÜÊ›\ɽ܀ÚÚMXÉZ[žÁ0á4ÄAÅt½” '4¨ ˆ[ÖèS‚Bþ÷|ŇëÏ —~ìÖ¼éß¹?EÈ8¡è÷k“"Ê®ÉBåȃ¤hgx(ÃIJS‰bÜ$øXcc]‡T_pl½žÅJŠ;É¡¸­§øZ›YǾêsòRÔ“ñNwë´‡Z_õÈÖL9…3¼¬ÛÚ‘Œ”—kãœÒë›ù¹CóS²µhðÕ±‘SxU_RêÔXRúrãLô_/´lш1çìt¤IFÞÁg<iálý3R×½ „s'`{¦]2‚×y)ïšÂ¦1ÞÕR5MÞÑ1©ª¦^†@*8ò0î´ŸlløL7ˆbÝ#ôÕ3ŸÑlƒquiŒ‰ÖâixƒÈR…lζ¢¦ö€7 ädkxd¾8$¥.XžiL)µÏ±ï®©(!£©ü(Á7,s€g5—,ýG#§!à0 C%\b)Â`q»ê”–¯É«Všù©èN Ì7N ?c!Fž‡\¨üíÞw /¹iîÚaæ÷a`¼û;y[£vl0J|k‡Ò ŽÒP†p?‰Ò•·Ý>îy-8:â`¶Á‰Ü3#4`Á÷K1l;¸æý˜Nú?.Q&óª‘T;Ÿtã( ]'/ñª.æ1°J9ZD Ëðz©xaœú˜š¹!…13p´-‰×SÂVóÅ)Í„RK kIK¦Õ9 ÚŠé,ÜŠqóæd×9ÂÜRíšmÐ2ç̺+8gö’°°5¥ù[dBaÛ³ ¸ÎsvÕ>ÂꞀïl…·À,ñ"(–XØòØfX”SQÉÆb¢›~U÷†ò¢XQVF‰B<=ç gR†pyegŠLàñø…4Ïq¼×î'Aˆ“ÖIˆ#úV”roN.I[Q›X¡'ê„'D>¿é¹®—%Lb/š±UÚušÄØ)½NSuÏ#¼f4/M#Pc3¿=:²‘nÞ¸/6áme¨Yß_2û.¦Ä oЀÒô—ÚÌA»é"­ )ØÁüFx$åÌ‘Ê]u˜ìRPˆ­ îŒÃ-å¥ÖØáN°ü _X¿y—?žw™åC®{­4ô®U¨„&j¤ÊÇù®ˆË‹ÝxBRó…y+ß¿.ÜØ`Á·õ‹t9Ѽ Qršàõrî¢.°&„;X:FaŽœ9î”Öã;n££NYÁ$TøÞh´ ¨Å©ÞiÉ/¥jFñ5[=z=‘ö 7£î°a™>ÛH¦€[d¯ûÅb —|nwrª q¦‹BOB[•wù Ü ¼cr$Ö…ãV8 †cC”˜t¡ªè‚+¥ÌÛu)þˆãu”B)HáíË•µyeô,…JñÈÎ_6äU£®W¤ìArPbûÛ¿Rk'œäe'áwÏŽÙgœÂ—X•ºôãµ=)0˜†ë”E* ±#J£ÂB—oÖìŠö~mÓr×I¼딹Gò½›ëŠÝ±}EÍö#¼5=¿φ-rì%a~#ÔÚD*CÖàÞ22@52@Pê¬v,°L»I‡‚2Ó{BN,ú5þ ¦AÖßžû½±&zö׌i«,ûrˆ™ó^Vv8îDòt„†JAk§ˆ½´Á¥ôš]'9- x[RÎ7ïŠä­ÞÕm™Uë^ÜD#째h»„[wÄ\©t#AãjзNŒ+r©3¡N)ÁêÀ&¡Œ%,EXÞf%%>F©ý¼õSÄe›eV‰³í;E’4øŠà ýæJ&i¬ÝOÀPC€;J`ìÀàÀ¶\1ã´7bŒŒ!QZ„3›sãí9³Ô•(‰Ã}…ú–àò}È«ÆùW¬Ä‘‚‚M¹bF^9}®/…žAÊÝš„œ,oÅ"¥uÄÖµÚ QÍ•Þη΅JÊz‡¡_Ê}!ÜÅq¶b™¥Øx«·š¿ZÄqÛ*åÄœ æ˜"%X±§Æ7ÇPå[ýr+¹!ÛmîÜ– (Böò">#,dŽ”Zà¢Ã¹çK;…Æ-=()mÞ>ˆØâ¦DF‰kƒÓà¸5¦)£w°?Bi;Cé=)ÓÁÞ ox#8ÀOˆ¹ÜâNQ®"Ä"gó¦¡9S¤Øóî¿J9§ð4RÊo"ÏF‰vJ ñùÑ­/Ì+¬Ý›¦n.Ç[S÷˜ H­\í.oº #½è׺VíÅžîÖÖMb˜’àÒ:>ÓÂgzvwªVâôÚëé!½4[¯.lÀ²—þv¨O¹°ÃGôÌм4"Ñ>†pTÚ3ÅRö>Àv:\wü¬¬o0 É¡KëÝøóÎÀ2xfP¦9òÆl„w §ÈÏð,`î…ë wã/=gj©.Á†¹+8 ® Ï †Å¡s©<á™~ëkÝWZ-‰ÀöˆÖÁ4ÄT÷ñÆ1–ƒbÏ=¹[ÓÔòX±üöãC'±0y£M5iõåðÞLH endstream endobj 5915 0 obj 3629 endobj 5919 0 obj [395 /XYZ 40.7999999 549.139999 0] endobj 5920 0 obj [395 /XYZ 40.7999999 549.139999 0] endobj 5918 0 obj << /Type /Page /Parent 2 0 R /Contents 5921 0 R /Resources 5923 0 R /Annots 5924 0 R /MediaBox [0 0 595 842] >> endobj 5923 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5924 0 obj [ ] endobj 5921 0 obj << /Length 5922 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ERE XÀöxä`àrr¼» ñ"“=äïGjI==¢>>Ф=²O»9|ÔƒUŪbñß¾þãüÏßÏ>ýÏùÛðóó×SY”uÙÿ9w¸ý‚7…àýGÕÈ‚ëîÏùÛ÷ÓËùåôtzjÿ}9±úÒqøÑ6ŽSôþþí·Ó‡~òSÿÍ×Ïi?ýïÌÏnÿ÷ëùooü4Œ×ýÂ÷S£ëîÿûŒ3Þ´ÿ¹ýÔ5þëô×?œk—Ð\Æíþý¡Rº”uÜ:^®]ÙåïmW4Yy–ºix»DÖý#[tü÷çÓ/íh×eMÍU%KÝÀÏ>3)ÞM¥$?kUŸ•9®ßH,v †«4u+bQ±²RÖ‘ ]1¦êJ•Þ€TM$«¢ñ5;Ö,Û±8ÐFÌ㡨¨×eÅ¡þu¨Ø˜”iêV”õ–¡È¨M}Sp è8T4ÆT™fû\VÄâ@Q‡*šJ0¡¸¬:2t$­Àl?+1ü ]êtÅq¨Ø4O4P·"ÚH}xÔÝ™áù—v—ƒGÿãùû©jÿÓY²9?ÿtþcYŠúÇóó¯']¨ZÖ\^N*}KÙ·4¯_|¾|Q]¿àýoÈö Ó°·}eÿ«E%”Î?Ã|•kÔ²B}¹šö…Ӕͥ¥.8k.M×–JLç3ÀzœN3Å+@ð˪(µx;¿eÍ€ãá¿@šk ¶0'—`°Ü†‘Å >2 1FǨÁ€+ ÕèKYÀ,†IÁ.-ŒØJ_—8³HŒ1à¿"ŽVbH P0±Oó‚éËs«?2i¥&ê  *]ºÔAãCÜê€ÂÞLOQPäÀá«/©°Í*Ñ„+yÁ·fl„ÿqP¿°îL «aKGû[ÂçކW€ûPÖ±cYƒ-ŸÂ©0pÒv*¸jزÞH”[oB/¸7ÅDóÍÁàjYf¥•ñƒi‡)¤!—Bè6Í¿¼¶­óbÝÞ“„ Â(¥e8µàÑ*ˆáÁ-Ø^°P¶X¬ ÷bNÄ+X}/lÆÊÉy¹x¤tɹ㠱„ÄÕeûÓi™ÃP~$è U,{cužÝµü^†Çtµ ³=¦ŠÃþðg¯¦f‚Þ“„Ú™…É ¤ЕÉ$©Ã¶aMý–æÜ«=y™=“SDÍùY{t0VȪî¼ÉStD† «ÚtsC‡ë@L/g=žÏX™¢Ââ66æ ˆEÄÎp¼Ä A±1€#r88éŽ ù“cÏ w9q´á޹Vƒj¸/&…#gLÝ‚ðüA&&'RÐÄ !ŽO ñ/Þ85HgÁižýeAÌ;pëÄNÓ„“ý7 Ÿþz.@æð‡ˆ¶ lQð{`ùk5Ì|+¢­—ÞI˜+eÜâOëÉ®Eb2yÖÔ@S;Ó2‰Ê“÷2ÍK3ò,yeŒA(G̼) åÛ6@7ámdèzBB‰3Ó'ÿÁ“—£§§yÆdSEI¦$)ŒþâÍ<[õçê™ÓsHži€¥uèÔ<:ÕLÿò—‹$%àÂŒ[_°éÞÏ“IbY2ŽÁþºÕÜ5Û(ÀÃäN'X3N]¤l8Ü’„›ý“5IjߨœvU„¸'yZàÒÖ÷ø³rˆ¢£0P@öõÚ>Òå ã:Hv®ŸÈp’ž"xÕ(²Ÿ-pKÔNÎ{AÈœ_Mƒ3Ð7“òhrÊ5. ×aÈc”üû3ý‰—fz2SØFïÆe°ÜA]Œ‰¾Fˆ)>ˆ´*ITÙ"m’X¯1· ³ˆ×êaÀ´—µßüêZÙiƒ=|¬,jÅÞÌ+Æt’MœN¸Å‚-½[ 9ޤàO ûG\°³ÄêòÜ‚õ7ß’œø¯–sª„ZMt‚E¿‡#÷Uõˆ0Æ–³l"]Ë©yuMr„š Ì-(MÿÃŽ„4E º>¦¡§Ž¿2 ñObÙŒ‡OyÆ å|¤PÃæÒ()Apõk­CNJt¤ ìßòÒö^¼h§Î2D“ÉYP®à¾«j1÷UE ˜ÁwËÔêáSLg°¦°(ÉM€ââlJ·Ž€"$Ù”bÇ¥ îSI81(”rÃtý3GÒ(s˜ \óÈRÓìß`1Ƴ‡BI †¬¹oÕDÝé‚´žûL×’dC»ÏM„ín@YiöJ/päÖy-üÅSà6áçhÎLÏ!פ >V¦a×[˜eÿçéµ”#+*9m©Ãû°¨nÜïs£õ‰‰¢7, &jmŽfâ¸Æ-xž×›ŽÞø8Zクé3lԢ⓵ u$æZ8ÄDïà‡÷Y›eždwšû]Ô×o— í;‚ •ä4ª²o×nLñQc^ÿÜÐĹ^œÌ¹)îÔè€ó…Ñ7Â’1””˜wÄ]”㡱֥bT’[Ra"ì>ƒMÖðµ w{näþBQu·âSu»Øâ%§BœšåþI’)O £ ‹6 É([º²û‚uÂ*6žpp=¼W#T££Ô©°ÆŠ¥’ ¬›c©Â!ÅÕW8¡6Hv€õ ð5ýÂ7®ð¹ÂRg s¬¢c©¹X-ˆ+©œ´³´àZgK9l#.µÔI´§T«¢ÔŠ‚£YV¥ÕR«^°ºY¥j'ti9 ã×¢'–Ü©ZFìÔ}ê\ïíÞ$îñÁ} Þ(’g§¸&TÝKŒkJ ?JŸõõÁβÔKܧv$T¥pˆ€;ËÒça9=%Yå\ÏûÑSÛÓ‘p’´œ3î × áÁT8d´•G±æ_žw£?HôYž{ÔmB8×sÈ[+<øD‡Ï˜û~7J%j|.84ÿ¶9‘¢ù—ôsIÉн:Þ›ÜljaÓü¶Ô‰a}š.*ÓsbäýðؽÉ4Ž=z‡LÛ¿2-‹LÓnŒ¼»;™ý(‡LÛ¿2-‡L«KíÄÈûá±»“i;íØ3Î=Sùr>£Ý¥YP0Š×†9Ä2åíìõc~„œž%ãCõõ*Ë;’xoÞq=¤Ãn¥Ãúç­K‡F¾5«-ã¸m­„~K¸™»u!Õ"í¡ÜÖz9fz¡ÌãÎ[ŠB ø_*Œzápá[cæ¥RwÓ˜;“Ä Õp–¼¤¦ôµæ|¾œ¢Ó¦>ïÓ`qéáã !¥¬‚” ^i‹à$l’œdã¤*éÕ/ŽÍ…%9I”1œD8Z®cdNÓpîŒe0_é,˜Ç‰ÌY\>Ëા¾Ç!!`ùåÝÐgµ4½sâÁ•.k'½v¬/@oÇAL×E3w>ˆ)sG©È¹TÝ¥‹R®^—E­v]‚,é3글½³¦GeMB »LßýYœÄ{Æ|k=§­¬U諉jHû¦­ÿ£4¤×ÓSÖ“(yœ©RÚÚEñîD‡lWøhõg‚ªG/z¸‰kô¯FzÔß¾Œ©ÑóP%‰Jh –{­'ßÔS­²za»£cT%FµñçÞAšWëìÖÓp®V“ÍMPjM®]KY“1¿«¦îèp E•ï¯òbGa9±(‚\né^–ðXi}Í}&äÇXjKá0æEBíÞ¸ôÞ²¯)7·œÿG [n9/ïÎöÏN+ t’¸¹Úi׬Ãrkçïu‹©Gc*ÍñÓºXíÉ{Ã&0Òñ™4‹ŸÆ´çŽ[KÊ?Z•É-á¸õ ÚêÁ¸„~5)BámŽq¦¯þ~à bgÖŠ[b^m²à&m)ðêäÔšªŒ$ï¡RÞòHá2‹yöÚŒñº#ki(²¤–Ç¥ÒEý#ãI°ð| V+¤˜B€oÍ÷YG›û»„:‘KŸåÉ1R²Þ „(îÒwMvÒ†"Øc,Ùãéz#!âñðÊ sIsP†ÖU¥ Ä÷ØXª![< Ó‹+Ũe~ÕÞ)ùCÞPÃøLrk ëÂËŠ»>8-RÏ(?cS²‡¨ýR·ë.G}¼%(pØ”p“Ãâ„Çáè%ÝÙ§{žv²ÿp ¦)¾Ïö „#\w„ëì’âבÂuÛÊqy=!n<(ÇÕ½òÈ!c{ÈØ2vÝ”‡¿DðjÊ®ª–oÏi!^EJô"ó‰zÓ;–↉G\›âÉÛH–¯nöè`بÂQ”mp\É’f±þÝ•÷rªLw#!O¹ø¼­—åX ŸªÑ¤ö†Å²¢§~gä!©ô©Z˜u(ê>©< Ô€Û.92<,àÄĉ è[¨Ö»¹&Òþ=¿´,×rT7ÄðãÛw šÌ[¾2ï“•}­]|ßÔgÖ:?Ьî“9Ï¢¼2o¾ÕuQOåå°±«Â@^ÏÀ\j^ƒª™–žB\ÏæmHYÔ=E§Dš›§}4ìÓÕŠ¼]ÓkË'8Zϰ·ß<Àßbì3>¢>ƒúškaŽÿÃú  }XÛeDp]÷™Kv­/á| |€ygàfô Õ¥Éñw0f-¼9…=À½€¹Î3¸wæúÀц|¹µaî2ö‚…«Ì}ƒ×¢Ð¾ä ¡O?l Ñs=Z,k{Dó`b rÈû¸ãËŽÁ}»s›¦¬ ¦X—-{»…ñ¦cX˜Ü\«}J©IÏO§ÿGÚ¶0 endstream endobj 5922 0 obj 3651 endobj 5925 0 obj << /Type /Page /Parent 2 0 R /Contents 5926 0 R /Resources 5928 0 R /Annots 5929 0 R /MediaBox [0 0 595 842] >> endobj 5928 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 5929 0 obj [ ] endobj 5926 0 obj << /Length 5927 0 R /Filter /FlateDecode >> stream xœíÉ®·ñ>_1g5wèIV€CC Ç1ŒÈˆâC~?ÍÞ^s©îfq™Ec~ï±ÙUl²6V‹oþôã?ÎÿúýüæÝÿ9ž~¾ûñÔ]:Ùÿí¿ï× T_UZ\¨±ÿ?9}==}<}ìÿÿõDäðâô£8£þþù·Ó›ùilùñÝ_úßþw¦ç?÷ýzþÛßû?Mðl‡/'m¤ýåßã/„ªû?Ö¿Ù‡¿œþúÝù·~z€kÿÿ=וZgãëò*þ­_…uç~Ö“gBh?NÑOÇÿyú¹‡¶ ãb8!JrÕ†ª¨k¸<Õƒ4|ÛAP™€HgT@ÈHÞ§‘Ž«mPÍaŠ n—Á.Кö¿+6ý—ðé„ëñÓM—;‹ ¨\@Œ•YŽaD$ïӦ娅åÂ;]ˆ^Aå”dGT†BP‹HIú*%¿n¼øòéô惱áÓÏý0µ2þøôåÄû?¬¨ý_?ÿÐÿfþxþô뉋àR+1ôž5<áÎúæQCO:=<‘Jôðèõ‰žè¥³Èkw^ýÁ{¥£Cƒºt†yÐýw Ø•¾? ?ŽDôZW*ÖOŽ©ãЬQå}èÆH@ !>Á|(ˆxc°¬ÿÅáè}z!æ85€_šX$““@ Ô ÁŸ#>ö —6Ž*ÉŸÎ}ÌM8õÇimCVÀøàU 8O?ì:aɃi?Ø\”Ò%±î03ï‹À”™Æüç^ÉTR½~tuF‚ü‡ 1EÌ—X†§ìyÊž{’=Ýûq»‹Tı`ØËĽõë²üäÑ©Ÿ¼ì Y>-ìE›Î››„Ó˜`üÀ¬‹±ºðCRMµ‰¡6 (Q— DX*ø`1PFB×-Sü$<Â÷ÄO` xXÊïècìÜ‚íX1ó‘p¦Y­¤ñeµšˆ_ ]Qs(hŽ`V¸>/ÌmÞ±ytoÁÕL'Ò ÊKæ ó 듾?>¢ cZ²À¢€| çá a†ÌÞ@ úŠ ÕÐ^Dا2ñíz16tBH1+—€&Áwp¼lânø JVÙ¸Õ»0â äÍT‚ýâK«/ÜÏ` ïjðî(cb^Ý)±AÌc{}뵈;÷wT•اŠ#$A@Ø&¼ÐO‚+Ãÿ^Œ7'…*«¬çÆþá‚*‚xHÂ¾×§Š ‘ý˜š„"jA÷(·f̦3¾&*ÁaÁ2‡æSîn¤÷C„¨\¸Œ!†"Ü—´ú¦tÞõQ‚ÐÆ ÌQ „ð*ˆÖ#,ðH ³³±è¨­ô`]*õ„°vw[‰É:ÝQ9…ªÊ–14ßD[ù„ (ãðXÆ8»€÷®üc°ãøg…N¶Ö¾’:‘ðà 14ú¢¬= z Ä9LMÜ3«ÅÅ8ú[ÏQ‚…9Ü4-óñünI)†ãÄe8Nc Ç¹Ï }KÀp¶w ð5Ž…áxc8f|}KÀpla±Šqq´a8.36þ¦œœ˜B•àM0Ü2Ápìm)þ’Ë_’ÄøK2Ÿöû–€¿l/î@ák  ã/¡}}KÀ_¶—q Gþ’"ƒ¿`µE@.‚•àMð×2Ò¾ÜRpði7`Ãõ’0rÖ 0ž2.ãé.Æx—BŒ^ —ul/î@ák ã)c<å{[lKÀx¶—q GÆÓ<‡ñ@õûH`KòFmL¡¼™ºC•W÷T%Ü›"Æ cÕOÉSÆö,!sa#8Yâð\¬Þa ŒóæÁ†äSÍüe|êBâ)\úû( xv¯1Å+÷¥Ý—Žêzq _ãX¯Q1Åk7¬‘¡âµ½ŒŸ8š(^ùš:Œqá€òµƒ]87í"}VŽ)ŸBE0Á½£€“ᮩz˜ö¾úÅ]]AŒð¦ˆ‚VÄô¤ó á2¯1æ B—r ]ºìg{q _ãX˜Wðó ?k[æµ½ŒŸ8Ú0¯<ÌTi—Û´gæ•Ý“yw˜w™"ö®‹*7¥\ªXJ¹ ‚œR…)åC/î@ák ‹ªXJ¹T~°Ö¶,ªæ”òŠqq´aQ••R‡>oÓk;³¨ºãÄñF,ºLƒ=´ö‚M'aáî`YFlo§.‡Îƒf„"ÝGs –J•K1êÄ7ö½Þ(W6jÜ÷Ocä˜@iÆÔ'œÂl\múÁfï†)¹Á¹Wj¹j¯©LŠMj"®H‰CßÞõÕWº¨ê%âÒ§ªŒjEˆEdcV‚uC÷9Spˆ’°ŸÉqG$x=0›Á š‘hP6)c-?”ƒ¿s1¼AÚõab©à¥Ü+¸JlTYy`ͼWq\¤œj×#ˆ†8-XÓbÚÈÃ*º) tG£qY7 Ã|Uv¯ sK]K6åÖY š%й•µˆFC¸—*9ÇWÛ;páxºf‘Ë•omçN;Ÿ:7j­Â;w°ˆÛÆàžþª»p©üù¨yRyMö¿öŸÀõs‹zcPòö)„¾G!wµ…HðG^;ïÀfÑ€ª ‡VäRýdûÛR'Ø‚®QÝqd¿´‘æppëxQ딌ÿVuì3r^ʸÊîOpÕÕœ³ ~©aS¶Ö-F¥NÒ"­r.ŸÀ5uáj=ð]¾à؞០ê3^Ök ¬¤—zû«z—OPt…¨= ›¸0§^Ÿ»áÀw o\@‡yâGÍA™ÄÀõá wo75ãÍ«»!`ŠÝÐ7Ì3 .] ®‡·àà“ —x åÆj#JERX¦Á+W…ç1£(<˜õAŒmC·Á:ÖSð°­ ã5H»öÜ·0o0Qó?i©)…Ø]­û|‚¡˜.am´¾¢û.mȦt©–B´ïKaÝŽ7Bµ¿Y…NösO¼–wÖ¼ÁSùmjì>jm›¯õñê%WŸ4kD/—i€ÆÅ±ñÂQúh[ ¼˜-¸r žÄæ!à)‰ \ÔOJZòœ Q…7-)‰˜J‚ïŸ(JIÙ'0Šva3B™Î˜ùë;ü`>Ùp1´¤l1‡hMQ>] âÃMWXÉ‚G°ƒê›É Ûåá4J‚]qˆP<£ï ˆe]˜]¹q0BrÁî%ŒC3×§Ø-óÏÆÊÁëƒp&vÅÜ`¤ª™Âf—À”ÔRk±×[¶žvÉÚ%;Žd&µ+62]“%|¿Í Iì»m‹VZJ8UÖ¨ØÙ]•”nã¿¡ú3W¹ò‘uÚpZ/lÏePåf÷¤iÈfAšóÏê2a| ç¬'œÆÍ>^£­ÕÕ%ÔÈcUýO© \””­GÙªXXãE–¢ŽI—¼wïiæÃŠŠ@iî+‚oÜôÐ,PöW4=¦¢ëõ äz’È —oV½·,ItÂÆÆ¾à€ÓxrÒ00e8]ØF˜žC<·ïÈÞ2Á+—#œ7&Ël¢Î£ÁNRDÆå†»Ãx@§Ù­ž{ .0æ­Õ\¼½Á¡„'½Up[s¾$¯ÁsŸÖ€ÏÚ!ÎÿÞuÊQ›Õ’ËŒ4<Ë—“à×?Pø<rØxÚØOÚ¬ãr¦úú3_ø <¿ |€Cíp@# ×xÚc¥O¸"àd™ë×Ê`ˆ¤JŒD%Š'HÆ\‰zÍÏÚ-¯øvk·lŒ“ œpŒ%ø`x‚Ÿú¤è=œžé^J¹p¦þ5]ê.µÇ­^‚p=1˜r[60Gõ7§²»Ÿ¼âj»Ç£©d[û ÌUÁF,Àë7LîŒC4|×ËÇô_ù‘`Úe21M÷Ê4½}nIŸ©‹üeù[_´îÎRÙŠ=´öŒ"åeøÄ¾óÔòù$Å…Cµ&K/î@ák}ÿéoi_;{o3áãè[úwÜ‘Ø^Æb\¿œ^¾«˜x?I NgâÀÄ€`+ìW…Ÿì •éR‰P1*Æ_Á¾% Û‹;PøÇB%BĨDð©Äö2ãâhC%’äP ¢TÈFAT¢„K%JƨDiû–€Jl/î@ák •(£Å,¤ÛË8PŒ‹£ •èÃk”³ÝÈ΀#Œ ¨Äp—JŒˆQ‰Qþ ö-•Ø^ÜÂ×8*1,F%†8hH%¶—q G*1&ƒJ6¢XpŒŽÊÕ§E˜C%Šð•¨~ÊÜ´->• ½¸…¯qÌT¢PI+ÀA*zŠqq4¡Et•lÔ$‡ó2ð9#¨„Q—J‹QI`YªÑ²t×Ùöâ¾Æ±P #1*a¾…l[*±½ŒŸ8ÚP Ë:§Ÿ®€éçšÖ«Ä¥AcTX–j´,Ýu¶½¸…¯q,T"º•pßB¶-•ð….f(ÆÅцJ„Ì‘%p¶œ7Ÿ6º¦Å¢TçÒ"1ú lN5Úœ.Ø^ÜÂ×8ú‘&F?Ò·mK@?¶—q GúQ"GÊÀÙƒ°]{ÍÝÒÆ¥ÓŨ$°9Õhsºël{q _ãX¨Dë•hßv¶-•Ø^Æb\m¨Äð:RaË dœ—ZŸæt§šÓ‰Ðœ,X=Z°Õ ½¸…¯qÌ4×ÃМî|Kܶø47ô2ãâhBsš°œ½(eì×k@ ÔõäjóäêÀNÕ,ô佸…¯q,´@cž\M}{Û¶´@gOîŸ8ÚÐËòäÂK¦\èÿ¿öØÞv˜~|þrˆHºH>nNÖæ«»³¬å™ôŸ+áfˆ¼ Q3ëfA?%èö$"ãa"Ã/A ß[À´3Ñ Þ™ªåÊ.¤xvà™Ý RÈ{`êñLŽ¢Ø; ´)Á,66˜º^Ø ªoà±(ˆ/©F¼3âúÂL'=ÙÛ¼†ð Röá'ðòcJwËåÜÞ>èm›ë²0Ìt&«³ KjÒóÇÓÿýý endstream endobj 5927 0 obj 5522 endobj 5931 0 obj [397 /XYZ 40.7999999 181.459999 0] endobj 5932 0 obj [397 /XYZ 40.7999999 181.459999 0] endobj 5933 0 obj [397 /XYZ 40.7999999 705.620000 0] endobj 5934 0 obj [397 /XYZ 40.7999999 705.620000 0] endobj 5930 0 obj << /Type /Page /Parent 2 0 R /Contents 5935 0 R /Resources 5937 0 R /Annots 5938 0 R /MediaBox [0 0 595 842] >> endobj 5937 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5938 0 obj [ ] endobj 5935 0 obj << /Length 5936 0 R /Filter /FlateDecode >> stream xœí]I䶾ׯ¨³k¸I" À,Ýr0˜rrÆq #c¤ãCþ~¤U‹¨)ª¶Ã]-·Çï­|$ßýéË?öÿú}ÿîã—ÿì¿Ùß¿ìXÅ6üìû?ž?º’bøØêº¦ÿÙû¾{Û¿í>ï>wÿÛñæPÐþê^ŽM þþí·Ý»¡ñÝðäËÇ¿tŸþ·û?wýºÿÛß»_?Ùúú/|ßiÓôþ=|à‚ Ýýqþ©ùËî¯?ì뺠õöÿÿQiÞý×$õãíX”þE±}ø®ÅžsÑõ³îžþ÷Ÿ»Ÿ»ÚŽÝ¨Œâ¼mTË×ÚŠ®ZÁ±7m³—B:•:c[VO­Hi•§¢¾GH’¾Lº¼¬pPƒz×ÏVk2µ†ÚÖ6)òp^ÕªéI3sÎ7"¦’¢jFÀ 5AaöòtŽ7|ý@\[E¨Ø<ÂílBG,"%xz ì(*mX“ÏD‚]”SÃÄ£ °RqTd;Ü%ƒ´ jSÇÌòpÁ:xu@¸\0ˆj5îwÆ_®¤Æ}t Ôpe˜"\ØÐü{ü6Å â)ˆ 'A3Ÿم¼ùåÒÐFJÒ0ö®±TòØ+¸'kðÍŠÞ˜'ÒÖÖÍDþµ‹×É®sSÊÖ­Œb§lºÌ’²wK»nZ‡]Ÿ[ç¢T¦£àLç¤ú‚½ïy—$"¹Y¶j Mhfî¸ïZŽÙ2îqx¢>%pR“²ÏÉ LDØQ9Äù3Ð%âÚ»_®0cFšÀgÁóØØ |ƒ·žà“’z#áY_žM6ðÔ#&ãGŠOW°×žñdzáî_xÜ„ÍEÏ0Fåô*UVRçÎó¦G©€o$¦å|DØkÏÜc¼à&l”“°6O¯±´*ÕkS—µŽ./’0}=z¢$§¶\c•Ãò<{™Ã¿E96¯›qIWfu])[‰<‚ãò—Ü”Vë”E±k6q<}ã9¿§Ë”ûͲÞUFéA^ó¸$Ê–²LByCš-Jް=ìšyÆ3R‚ÄVE ß`”þ)H… †‘RÏŒÿ¬›Ÿ=Úë œÀ}ËŠKJ*¸‚VÎmÚ?m‚7Ãb(Jj‡2?„¾ Ü7l;SBk8„‡—p°.(’ Š c^GÚq£Tp3ë©Û jæÕF%g¸IY¨,mtÊ¢‰g™c¿ÁÒæq0×=·Á\=‡“¡(þæµGZ–rìÉãh*Þ¦=VÈÂ¥H»¼¦K%Ñ`¹A’(·‰ªBV~1T=”×ÒŠ¹^Ò¦m¥¹luUÊ–ú[3ºY–ú\q3©súïˆN÷¨ZçÞ ‚‹ºZ5AáB1¿òžEu›­ÇtÁª‘Ø…3gÅ[$5u’(ËöO$usŸõ,N…zI$i•‚$B®'é|<‚ìÃû惜Q„ò†ÉÊo¿0ç9WKÜBîwÞ7'²h¾ùÌyFŠå2Å!#„ n3Ù†ü§duc'›V"õË*JÞÖ™#q !là ”P9¶xŠ¡ª¬D*£]ÅñÞ’;³BIÉPû¶ƒS«JZ®FAýDZŸHËjOü—Æÿê–of‹”r¿EsÒÏ¥¬ 7Þi @‰ß¤X‡Ø·ÉwCü‚1´cPÿq´VeùSkù´ÉSk]”§ ÷š#,Oíx§ÚÑèpO7ÕŽþ%fÉŽ×uÉqÊY¿Ýj˶g‹ñò EÝÛP—_â[z»·{a¹3ΔÍäøþÒˆ›| ;ïa»Ç36ŸB¾YcwùLÙ¹á;µ¯ðžjJm뢷‹¥ äv÷buÊ=ê°K6íCÅ{Ôµà1k ûÆL¤½;1Ëy#æt‡'–K4wøˆ‹0§‡îcŸSÁÏ×¹.Ûq˜­W¯c™ã<âªmÇX NGíÙœ8û‚ÂèYóß–KÅ0°°åá¹÷}Z«Í`œ™zÊ›•®†/|PGvá¹kú‰¬,†/W×FNý¯Û¨Ê΀jÑVí¼uÓμ&XÊJ˜ÙÃêºj†Y™Îô\;–1°Ì Š[Q vXú>½ùkXáüÉ'ø]+egFøŠÊX3hî Gã°24®Œ±˜±ŸçÏ% ®ÿ,êり͌˜kï=;Ü)cO4l˜‹xˆLYv RlÐ/`ôÂvl˜j® ¬ÍZs}ÃèrxÁƒ*—op_ZÄ—BÊ íÔzLYðÆÓ·WÔžCLA±ß`cÙaŽTÎÕš5.Y3ÇÂä¬KŸsjÒýçÝÿ]3$ˆ endstream endobj 5936 0 obj 4346 endobj 5940 0 obj [398 /XYZ 40.7999999 698.899999 0] endobj 5941 0 obj [398 /XYZ 40.7999999 378.259999 0] endobj 5942 0 obj [398 /XYZ 40.7999999 698.899999 0] endobj 5943 0 obj [398 /XYZ 40.7999999 378.259999 0] endobj 5944 0 obj << /Type /Annot /Subtype /Link /Rect [147.359999 777.620000 213.599999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 5939 0 obj << /Type /Page /Parent 2 0 R /Contents 5945 0 R /Resources 5947 0 R /Annots 5948 0 R /MediaBox [0 0 595 842] >> endobj 5947 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5948 0 obj [ 5944 0 R ] endobj 5945 0 obj << /Length 5946 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àjħ( XÀq€6Ã"‡`6»Áb½ˆ³‡üýH-JÝ-ê#ÅE«{m¦ÛÍ&Y,֋Ūҗ¿¼ü³øù÷âËÃËŠoöõáåP••®úŸ¢ûýîünJÁû·µQ%oºŸâÛÛá½x?<žÛÿßL;Ú—¶q˜¢ð÷o¿¾ô“úO^þÖ¾û_Á‹¿¶ýRüðöåG;^÷…·ƒit÷æ×þ ㌛öów]ã¿ÿSñ[ ‚9ŽÛýÿ4\7R®‚ã}ìÊŽ¿ç]ÑdU¡+!´)ã-œªEÇÿuø©m£l$cµ–uµxÔšwÃÊŠM­‹F9c:K[6[=P£ ÔBÄV­ŒU²öŽDÆ»–ì¸H¡W/sjí@²ªÒ t„ˆ­[Ú€yx8~ Çxÿ ÕZĆ]öUýWK)je i;Ÿ ZIÔ—×Ó¾üøA]VMÿ]<*cdž]0ˆ§ƒ›¯ü)´`V£{@ƒ-üq2ŸS;TSÍñ]rf–"kÓ}üú:aHæð [Æ+l9¯pi&Ì"{¼01ló ÎåKâwý ¬TRwèÅTÅ¿N÷’Ç“J%` Ü!—D‚‡ŽY!1Œfæ7ãHE'ZaîA·Ûò㎋²üí L}þÁ¯‡—ì"»á’ Ùýårès2) ˜¶ÕaݬR¨Ar?YM¡ad`‹F-n¹G-ö,Þ@8MÂ5^g¥MÆnO¢BlÒPKHkÞ;H V.͵<Äï7‡IL ¶@ØÒQOÀŒT¼š‘®²Çš›Žé‰•(V ÐÎòX`ŽUCÐni ¼ÝgrÐ$Ü;6´<ØÂö6xòÙÏi"-Ð ßfÖ Ö=¯k=Lù8žªÿ™Q©Ó–jØåZM[t|v!`p´Ž6ZõuÏQS^`UÙoÃ’Ï<Ì2®è»œõ±»ZJ>ÀRS.|€ ¸ùª’Oe1ã;ØX.5Óþ€y­û½:é¼AƒVl²hÜ!)lmñsÆ«X&•_zÔuÎS} ûoðÒX _«3ï7¤S#E:ê-èåšÐÑ¢Ž…9ް=½ Od`]á$\®ö\NeV*™¦š0u3HL õ©å¬I«^=Î3«ó¹s°ÑŠ1 |sdÑvzŒr‡aÎ\r‰}ær9©¸€°Í4=Î-Êa"­ªˆ8Xa”c`èH.Êî@¹&t×?Ý?×îIØ7)ÍQ,™$çãL‚ù“C¯“C7µ6ÔIÐa ºH¦à”pâñ˜8ö(åp’Dîöh•ádËÁÃÌWäÁBÄ»V)HÆ+žAÃfùš¸†‡â5þT‚ÿ;]³ÿ8€ë–'ø†m$×(jnâ.n{ƒBAÖÐ8]ã‹€9ÁN;,mbHä×Tt¾¦Õõp¡ŒCªGدB¼råøb-ÀÀÏ%?&€}<×ÎðÒ7¸ž<;܈à‹ŒA*5Ccî æ`È_ñ„ÀucZÄôK¡E‰WŠ©Ó"^) Žð…À uª,L¥áÑÍ¥œŽ ˜J*-<”@€M@¡p6È©¸ÅÃA8¸GÁ•BØ<¡BW‰éÀÞ±çácÂë†bÙ…¥tÚ°À\²CS›ªÂãÁ¦8‚®óèTŠÆZ=©|!˜Rt7›-ÓÎå ‹5\Òò*=áÁ!`Ü#—ñzð<o,*—j•ßš„ËŠy-7Áü­ñcÖ=1bÅžä²õ>6% ŒÅ¦âWÅ´”M²´’J\µSâÓ쎱ƒ¥¢;ûà¦Ó½ ›¤Šç³àW޳B[VxêÁãá¹=¹5ÿ!† —/÷-˜~w Ý+õHil14HZ8¼kÈ•)[í2€‰#AõYôÅ@NÄŠ«µ‡{^YÜ 'xlJböþïlçú໵=KDlScÙO ó¼ÌGÿ¬’›Ð?eOH²›¢u)iï¹¼7]DX鮽%9韋 wSÎ,$X²;É€®gõpÅeÕÇL¾›bç±-}ÊÄaNt肌°$a›”øÁˆÜ´ˆD×Ù÷{NÞÙmlëf®,©w³qWðCL°½3 $i—í"òKÃóF'€f ~ÏpªÅD¸_CLo8Þ™õØf²têJl"ôbro)©*„Ò>*‚T^&ÈŽ1#0—çÆ¹f‚#•Âz'“ ˆÐ¢•M±ã ðºqÕH·1‰ÊŽò¤h|¬Æƒ²Ê³Õ­ª/eË=S"ÙmNœy³…1ª‰’wºE¥® ǾFÙep …ô¶IIO’«œí€—›Wu“\ŒQH{®ê&áh^ÕÍê­™:l¸v›§ÛƒÕ‚nµ5\¡ ãàdðL¤{°DéV«ÐJIÕãðJsÝÛñz̾_qoçѺI«îV|LžÜ±'pù³L÷aC))/9jN'žAìÙ-¸Ãž½Ï˜È¥ôª²7I“=¶Ú.leV·É„+•ÎX{·u5úÍPÂ#`Ci¥.§\ôð¢Ï{Å5›ž‹÷ åç1žâ/Ñsß$mœÓ±qlX’øåˆ™Ï öÚ.<¾ue. ìfé¦Õ&ž¢L™$égËgKV]›ÔF©0Ô!/Vù¤Ç¤Õ\>:hˤ•\iåín¼e»äÀÏ–?’|ZÁ ÛûV k¦`ï»qšÎþž ìq§m‹» §ˆ/ž¢üÀ+˸ÞäpØBDØuæ=¹..8ÞHŒœˆ‡ûî0ê"im¢„d±¥Pj¢’øìqL;)Á âYÕË%UÌC«ÃÛíàf*t$_8å‘ßkª×ydèšè"| ëÈÝåšR„©Å\ïa C©9qÅ‹Œ“¶n]9ÅÜ!ç©…zY~[æar1Q[I\cÒ™)ÕiV …oÖ 1Ê0Ù­{èT*®©jìy0Bû[¼·ëo—×}Á¾|{ó ÄÅduÂä³—Þ®áBfº`í2f¶A4L—½ ÆG2XÙ¯u©ç£iY:Hëy…×e=/áë™–žŸ…(y3z¤T©ûM˜²ïÜ<öi`ŸÞº­yÉ«cñ„SË=­ç«óOáw­…8³Â'ÔÇ*¦¹†Öa9"®Ý±˜µ[ØŽ °‚êº÷\±±Ö§‚óÝèÓŽ¥æôá=.tåR<¤ŒYí@J±%çxS/œÇÆ`Ïõ£ÙÓÌl˜º^ðP•Ë7–ñ%7„>ý<Ê”¢×| Z<°=¡yðb rHû¸ãË{Ž_˹ÆTºd]Dã% c¦cX˜œ%.<§Ô¤Åóáÿ•Ž endstream endobj 5946 0 obj 3226 endobj 5950 0 obj [399 /XYZ 40.7999999 600.980000 0] endobj 5951 0 obj [399 /XYZ 40.7999999 600.980000 0] endobj 5949 0 obj << /Type /Page /Parent 2 0 R /Contents 5952 0 R /Resources 5954 0 R /Annots 5955 0 R /MediaBox [0 0 595 842] >> endobj 5954 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5955 0 obj [ ] endobj 5952 0 obj << /Length 5953 0 R /Filter /FlateDecode >> stream xœí][oܺ~ß_±Ï¢ˆ7]€¢@'úPÀH€>}(rzZ4uÏCÿ~µ–´^‹ûñ2RÚµl vÌ5œû ‡Ã÷üú÷ã?;¾ÿôõ?ÇïÓÏO_uU7õøu<}¿»üƒì*%Ç_ÛÎT²?}¿ÿ8<Ÿ‡Çáß§ƒhžœ~ ƒó+Æ ûþëáýøòÃø—¯Ÿþ<üö¿£<þiøß/Ç¿þmøñÓ4ßé?]ßœ~ù÷ø‹BvÃ.; þëð—ß@èžç=ýûNwª¯[™ÇÓùQñü}ù(zY}ljÝuú(„à4:þûÃÏÃlg0ª^ Ñ6º­ƒgþ¦íÛf˜Z[“Zk œ*u¢¾oy&zÆYÚÒD­[÷TU§•P­4úD† L×Éá÷VM_á›áEÏKïMâÚÏ3¥"Ñ-y&:A$’V6ÏÄJ ÑülÚdö<’a¤©™ˆÚŸØ9ee3-àLT•dT#˜TÒËT©é–‰‚'ˆxT’c*V1˜n\z›¼øóT©5=ÓD'ˆDÚÒfrà©XÉ1HÔóÒ•T©‹Ÿ§JÅbSw 9N‰´¥ÍäÀSQS#Û–Ç8ŸgJƼjyÜ3D,ÆÙšé‘ʼn–/Nô“ãÁßï¿­ºSÌðíççÀcüñmX¬9¾;y˜¢=~ûéøûºV_þpüöË¡¯L¯Z3F*ãHýG>¢Ñ¢ Ÿ©!¢#:þ Ÿ©?p Èëùümà‰ìVÍ ¤‰w¤ ¤ÆøyQÆÓ›—v!À¦ ¢&¬Ãö)j!€Ïà÷(¯EðˆÂrGî £…p-|O_P; ÇôXÀÔõ LSËî5y„¨Œnºœ`Fuн`øú¨õƒ^²ÃÅFZëJK¶ÖÜágŬ}ÚÆ4CHmÉÊ˳bdжª-¦öƒŸÝDøÑIM¥d'^Á*¿,'Ñ%ÒBI8ö&Åâ@g=®¦©¤è"d½wÉ6Â[™X>k¢%|vù 3Æ¢ý¾‡i£žIs±pÈÙ~X|¿O.¦‘LÝ ¯†ÄÖûø‰=Œ[öƒ£4¹úo)ïáõæx}ˆQ’÷ófF$ä<‚gÛ2¿9´ |ã™nmÿÓÇ¡]°dõx¥”ø’ÀU\ãõ@*8`ƒ–ÉñžrÙ #j”A±¡Ø~`«Çkw%%gµì#›a¶¡¬~Qõ^.¨ÓDŸG§aëÈjé°ßé€ Óžâ áÌÁ'Þ½å}äuZ‚dåσŠVͯ¨kyX&;ÇçM •NCÚï³’~xV š7ÙçÈÓyŸÅYÝIÕÇàÙp–„/ÔN¯bH,X|c%~-4¸§smÖæÌI‹Þ'81˜ÕXOA² ‹§ç¿<ÊÏ‹OØfSÂgT+µTÄØúà\4!ëAÉq9`#XmÇŽ¥ÏÌhî–‰ØÌâ‡5(æb¬ MØçÃÀu‰‘TBÎCXsŨP¿–'`-«EÊ« š®_ðžÀ>/Y5RvgÈp]ê5e¾íOæ±P¬^ÀN³õ‡×;#Z:³D‹žà®º¾~]бQáò«¥ç„]a…!)¹e-å\îIIM9Ä’5uNI3íêlÛ‰.Þä‹ÀÛ›˜rxÛ‘à|:«pÄÌ!x6VîÅEo€SÒÎp¶R©6ØŠ5Ü_SòÕp7×d‹óžn=~½Ó£‘z62­YŽ4ñψ<[g /TÕŽ~õ¹¢®ºeÁïQ³MnƽŒ|†Pš\ -°MÌed2_lc¤å4ÕT‚v1¢&ÿD.«*_˜r ÛŸ\{[­'c{:!ôjie¡¶Ÿkùqyµˆ,¡×Ž(l´n—Üü†çS‚_Œ=›ž–GëÏbw<ÑáŽ:%ÿl¯‚@-{å«ADû“'VÚÐNYD “’G² Š`þù¤dŠñH7†Ãˆ«–c È!ŸÚ“äß•3íRÉSè‘cÍ:žÁeò”] ¹øÃ¨I„™§uPà?™aW³Xkœöo˜94tµ±%Ja [ò8úÖqƒ`$ê â\?ÝV³ Y è†ö3}ü’3×Û‹…é èõ·ô¡‰\l+,ÜFhJËq#UXGœXË<òTNàÕH@H{ y¨YχÀ¦Rûk;ÐgÀµQSªàšÚ׸1!„µ+„w=XcàR\°GLX±X†[æKé>F \s‡K¡l–«°±W`— ´ªû…D¯y!yÊæÂ})‡[™²¬ˆŠ³”âÆ21Ôjî¬?Œ=×[ Žñþ­£æ7Â]çˆcSƒ; ¤K–"¨þÜσ÷œ&.+ œŸ$ló:êñæ'¡Ce»ßQ‰OŠâMcßÒ¨õHÈŽÍ\ }(§91lo„óMÞÍi&>Plñ‘_ÒµP^xn“c5–gJ§ܽkH\tDè’„×ã8]W®”ÑJ¦p¥_C¡¢!‡ÜÃâ—¢˜7sP4U^äϬ˜Ú¼ôò™JáÚS:yR:Úë ó ŒØ-ˆˆÓóæöкDbÙ¯t™{ ’ Üg¸Sómûš'·ìÈ•ÁHßø9»êGp`¥`³TR°@8®ˆasð/áP>uAih„ñóüMŽhB›AS” „ü¢œÐ¡œ0p$=°œ±&qðJ ÖŠ7i÷LA]Þ(½ ä!%ý(Ö¿‡ȯ¯7H Y! $X):m²¨eä̤$>·<²¾Ý4›T6íœvœâ°üɯVžÝí­´OÂɰ˜’OŽ|H@Á!åx_B GžrØ[:pô…;¹Í,-ï35Áe)ÖæèÒd³M¡t¯ÖFm‚¡¯úÈz*G-´½Ý–â–° êk—Ôe>öpÈÓÏʇS:Ãpôl h:˜pëL¦>~y-S¶Ì¬¤p’ê¯éSH¶H¿ñ½·£¼ÖÞÉÍzœ¦]Ø fÔETúféÒšâö[°/«âÇ«(®W©[ÅZ­ýÄö6ú"jKðü)Œ`Qqm±÷}À^á ‘¥´¸XMFü)ZìF4”È䫱œ²É®«eß-Ä—{òœ'Ä<ƒy“Ò÷¹ƒaCÉšŠ¶ÏÓïÞö×pÞŸ· ï—3÷¹Ãõ”k¥úÜíüÆÌà.|4ÙwïóH}+щ9¸Ú­Ä´÷mÖtìl—…·eÁðî¿Á;ùYx3\õv4Ÿ‚8°C¹øRŽRƒ´åƒ‹^ .ãK©¹z˜tŠ_ k£IœD9ˆ5 ¦=åø3«^w\ïˆc0Öê1^£Þx%r©÷M[½2ºÆÌ‰Ö»»zõ&õ`јýåj#l+)[ÑRW|ïgÐF ÷2EºoR‚°'/²¿Qƒ€kÊ(8Nw´tÀw `Éx3gwïp÷oÁ;ìŹ³ãînÀ¶•ô{å—“Ý;¼eï°×½—&{‡‚ûìPÐ7]ÙZ}dý“–{‡ÚJ÷ òܵ›‘@æ8º¡49¥pæK|(ÅgÂ: ç4(7ÿîš«˜æÂ¾CAíÐÔu“E6×ٵùNlµ§\ß¹Ö§,×ÜYøÛ¾Púù`X7|Y#d1‡¨ˆÖF1N(¼…©»ÔvAÓb1Éä©Èj„”[«ØbŸ¿'Û¥§ôlX>]­w­Ñ!5*¤è o«'ºç¾‰ÞßkcÍßä0ÂfpØFG_o#0‡ŽÂ!û$áé½^ƒç(‚‚чGRÀf±Î¥ï¹æ¼‚5gc5c9ï«)þ»hü›Ãð8x5Š*¼íE“D\.&ŠE­çƒšŽ6¸£ Åœìú¸Ÿ,³;mϲxÒÕ³%GÑë ©ÓxWÜŽÑó]1WÛq\i+ш€&Eά…³$6ÂS¼¤z mÁQæu¼ŒäØ=(_è¡ú¥jK2[)Œx·>nÈ,GßðBÚ±ÌM€¯—’]ɳ۲™À? –-%ÝŸ"}ûžÜf¸„•°kÞüÔI¹ô›7³#•¹.c»†"Bz(™!ÞhÀïL-éP~@©™‰Ø¦ÂH#£Õlá<±­¬ Búfâª$=±•¥+óe‡…,]îUPjìc”³¶DË%ã§\ç¾åÍðR2ª¬…f«Çà<“°n€Y:ÆšŒR×ÉRcïI ±¾Ûš@–Ãzþ 7¦†2¥”l­ƒ“yÎ=6»ÚoÚ†®öïý²ãéa=htïýZyŸûÀÞÊ–¿@ì%•=ñ©ÙÌ×§†qG¯ yR"ïÒ‹•3K3gÎÞLIŠE ¿7Q‡…Wã(V ßÁ‹Qb«5ÅØpª?ïZÝV/ÓöÇ7i9ålhóÀǧ9-CÓ,Lýî\äI=åi6€•¹?3mqÇYÖŠ‡Õ´l½—¢a‚Úé@y‘>eJœaÜwÉÃ}à7–¯Ó®€³i8Â{+øú8ÀëÁ8¸'Š-6 àÙ{áÙ2µPn4¢¼‡W2T_öz¾mF=¼¼uø>> Óž>>ýøþÃñ>ÐúÐG'¨ÎG½k욣wµ*R4ãy•£ªõk¦lšª¹¾}Öë dBd[µ×ƒ öÊÈhü”ªdµ¶Ô˜ªéÒ ^{OŸéá3c˜ÒÊJÖê4´²k³Œ|ù—øÙ)r¹²Â/è™ÉѸ6"Ð:&'b1k­Q¸îô»4çÆ;ÂÀ÷} ðæ‰„õÌtISÛycÖÁ;SÄ”̽ð=SÛÛkÏÀÙ¦(ûl˜»,Ypp•-7–É¥ìÏŒï1]¥Æ %`ÄÛôLCŒA y`cÝ1%dR%·ëê¦í©Îñµc¡Ãjù¢âë‘Ó’ÿ$09 endstream endobj 5953 0 obj 4054 endobj 5957 0 obj [400 /XYZ 40.7999999 220.819999 0] endobj 5958 0 obj [400 /XYZ 40.7999999 220.819999 0] endobj 5959 0 obj << /Type /Annot /Subtype /Link /Rect [415.199999 239.060000 522.720000 246.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches >> endobj 5960 0 obj << /Type /Annot /Subtype /Link /Rect [98.4000000 230.420000 213.599999 238.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 5956 0 obj << /Type /Page /Parent 2 0 R /Contents 5961 0 R /Resources 5963 0 R /Annots 5964 0 R /MediaBox [0 0 595 842] >> endobj 5963 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5964 0 obj [ 5959 0 R 5960 0 R ] endobj 5961 0 obj << /Length 5962 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âC¤z^r0˜rXäÌf,véì!?²%»mÑ©*–(¹»g€éÓ¢Èz“õ±øîÏ_ÿ±ÿ×ïûw¾þgÿmüùáë®®jWö‡¿?\~ ÛÊèáWß6•îöß¾ïžöO»/»/ý¿O;厎?úÆÓ+†ÿöÛîÝðòÝðÉ×íûß^ïÿÒÿï—ýïü4öwøÂ÷]Û¹Ã/¿¿(­tÛÿçò·Cã¿wûÃþ·~í±ßÿ?ضQý³Æñt~Tÿ^>Š^Vï]ílÿ»ê?Ù«¦'Çÿ¹û¹ïí<ŒªµF¯ÛÿÞ9ëë¦muÿ»7ãŸYoòúø*c÷w{åUð¢`¾3»ÊíÈÕBF¤ò¦¦jëã]UUÊØ0›Éã4Ûn˜fϰ\ŠºÊí¨ÕJˆ‡ýˆTÞÔN¤Ç]±IßvÃ4Î&ý©«\Šy­Œ»1²¦v"=îJÒyíF…ïêl*:Ûám#ÃŽãˆTÞÔFvDºâj‚÷µ>NӺ쉞ºÊí¨UN¦£ãˆTÞÔN¤ºú"/èçxá)òàûÇÝ»ÏÝ!6zü¹Æ1À~<~ßÙþ?¥ìþñ§ýû(KýiÿøË®­Ú®vº9FdcKwlQMUwÆ_µ<[š>PkÕõ3ï‡gTÕX×ö=·|8¶Øóú~µ¾ZÙãk/ºWžÞ¼ØjØI=ÐâùÙöø«´jß}n±³ßW›ãþDÆ‹¯ºéûüäÕN¿¡agŸ Sc…¤'tb-‰ê¦Ó (|§…Y®?O:± ¤M@<Ï`hÓgfNðŽdac¶e3ft–& A¥Ôƒ4ÒÁq¯ó%:Ò žŽˆn¥ºÿôØ;—…\EïÌ&¾‚c|p AÕßOi9ßæ˜á5]å]síàY‰pH„Í„N‚¡Ä"õÒÚ"¡óÚAa˜v5)¹ÑŸ¦ƒ/ì=1 "ÆR¸·ÀIÄ3»ÍWjýqö°ÿ-ƒ€TÖ´Àúf0„Ο†®F›Ò<²¨eõ[-°·‘ð·ZÞÃÇ{³°ÅØb R¾uÉy8oƒ¹ŸÑ˜÷‘÷Àgðpo5äVDúðL!­ÇeÉ­gà|°Œaºþ©ˆŒ5usm‡hTüD磩E­¶Œ±aÃz&Kƒº }i´Mëð]¶X)ÿŸÁ1l_°‰ÌÚ$ͰV+/k/ñLÈ9ÎL#¶[;NŒ{kJÚrk6£²-ߤ $qtÛÝl×nÔé^Kv[ãÓ M/£gNoF3^šßl\A>¶êze»ä¶ârænã º;îÁnöÂÛ½ÁWz)}ê62x¼JxßföÖÒ[i‘Ìßw 3`x“mJñX˜Á^^º3ÂÆà´3ÌðÙÕ´Áaš$óÕc¡\+Ö$ÆÞl˜ `$@ì§ùv'HÎOžô$ÌÚ¥ìÏ’î Ó@°¾2ûÞ’)à{Jösœ`@áàMà´1Ѱ_tO|¾Çón"‰¿ × Ûrçk’y7Jt”‘Ï$ÐHN+íΧ¡ÆEtk0ÇVRòàpŒa'‹»Ž®_Ö\»<<¨%'°Íñ¡EÃlÀf1èU,AšZй.}Â^‰è3k™AˆB–õ£C•刂`h%ü´y»$,iŒ@”H®N;“³²Aƽ Ü$_Ž–4ή™XçÕpס¼c¶Ï÷o…¼¡_Eãˆv*Ta”€ÇŒ7_Ë*‚4›£ŒmZŠ;` ž± Ãׄ¶E ÌDé¸ëT${àõ) di%e'5̧`4SÅÉóaŒOU͇3Á†“m…tÃüÁxÂÍàÝÊÈ¿UIù78“[çä]Z"2g‡óÔXë°ô`®FÞƒñ X98?)]³ÑC›œs:hþ®V$Âá{€žf,sJ¢óºsm£ÍD‰›ÌmY\ ÎÇâ±1òTø™c~0EaoxÔ˜Šbncêà ÌÈa.DzƒÙe\ã«0ç"è>ÈBÅÀùl9/Éma‹„¹½º¥`åRSøOZ&su\ ÇŠ±0YXç0ö‹áe 9ÂÀÃr2çÂRÅAúqt›ï••ømäÔ»s¬‹™‰bÞŠimÁzÍݹªQ©sй…©˜ª V‚"þðÞ¤$’‘ÈÙY ÅÛ”…MVr¾ÕŽi2Zоø^!r´‰ÑÂ’1ŒÊeÄ"ZVϺ‚Ü2manÉž/bU1Æ~qò(rz„s‰ac#¶‚Ñ›\°x—®Œ“ç‹ÊHyã3$VÛ9c¤ÞåèÖê1‚¬Å-*#]“Aùõc Y;©ô+jpuà’¼Wç˼’{‰eÆóŒaáÔ¡ÇV€siõ3ý¥N: Ÿÿ[nx>ÂkÖ¯HÔ9Íò©¯‡Ø~ÙboÀ‰=-ôG ¾‡Qý ²Æƒ-ãt}ùï&‘,æÉâ°+¯íÙÕ–Á,/sü" ÐV¤¡¼¡d½' ˆŒ\/{VÁÅ•*’ŠÜ >G„/dͺÛ4©™…“ÇV˜Œ3*À3äG0›ƒßã=~_FmÏ;AÚVM\ÆjW-çÔû[FÓ–1¡9w-pNÊÔÊ]è€å‹8¼‰;‚½î²îÆÙh¸*`í£sp8ÿ€×8ÿ€wx›H½ Wp,¶ÛSa`”Ë‘2H6‘Žn–¤üó:œZ™åaóª@°Õ{—[½wèKYÅtÞ!"]’ uÖ?‚Ì’9è—2'õ”çÙ=i¯£¥AYÔ¨,õ³²dþ(ò¾:Hó÷>¸6êò“_w_#Õ2‘Øq ךh ]è›&'gºz2;Gq_‰WÖM¹üfâßL|ÚÄßñ:íZqTŠft¦½ú` pµ¦ŽvÃU9®b±é˜nÑü$a-²ãHè•°l&,·8©2 ð´›Â†õ*5õ€PĬ‹ù^ôFåcô¶‹(ƒÓœ™½'€jŽu"ø©NQ,æ\º“F°Dà韵°†2Ä„¾%бD±ƒv¨o}+q?øîtúóù–zøó<îµÔ§¹Ž›¬Œ’žQp-ì­C½wæõ«‡!9˜Î[½ ÒªšªÆ´#ï*«§½u£$˜éýg#ôPÕÕ°r5‚è=É,¿ã·©"q.Ïãf›[èJбÝ-] ¬ï4c jòÅ“í„C,¢‰ð&>ŽI—HÌG^,±ð¢$„š¤±á!ŠÐ ˆ8Dì;Epy9;œx‰µ[XN—ÇSx31âœ#8œec„_\ Ýç\úøî›q6Ž‘›Zço V3v?D.NÛÑS5Š ½z ;Š;‘9¸œsn fz8R?ãär!t-á à]sX>#º÷LßÔYÒÏtÍÄѬ|¯Pæ”-œaíÛÎWg)[8ïJ˜!áöÎó}Pžå¬CK¤W³‚žá¸_}œ¼ ·èL7õŒ³‘SSÁ⌱q.²Â#d"r5•Öàxbð J\M†üѸ”rV¿­Fs}ñÊL©$R ‹àÕ8rÆ©CÈsN:} îag¥a±Ç'`]ÇÞîädnç&½¡ ¢GÄïñâX»¯H D®)mp}h\“Q“4RIŽ€s1§Âz¤^0¦®›šOŸÑc˜Ã¬[Êñ¼!qu[‡ –1X VáÊÿX.qõaLQ\ÝK®< «¯²*ïjDçƒ+\GîRÀ3eÜÁ©M^òž;®¼þ¦µ÷ªµëº¤Ä¶çÚ×¥nîÞt\‚k¥ãêþxÔøf\/Ró'B7|…èMÃ@¶.=¤NDð{p¥sìá ÖL7±C—34ݤ%éMÓ£÷ãu¶ÿŒû´ #fâøt|?XDþñÝ%½–kÓËX²âò·ØŒålãfö¶õÉñD4k7^Ý`¹d¬ "£~ãð‘Ã]í28¹)ß;ÇYóBIŠÈØÅ9ýßýSO®ž‡/Œ?¾}'+¾8±ü%Júè£é,n¯úiÜ:“Ü)7Ô÷Ù›úœÙ¹ÊÝ·t¶(°MûÊßOû-ö1•înÞíÒ4•¶}Ÿ[<|O Ÿéà3ƒ¹öºÒµ¹†5¿‡½ *{ùÉGøÝ.vc†ŸÑ3c"øV‹BóÓ{´gFŽQæ>Ží¨Rwø]7êìø¾†`Ùå@ÏŒ—¿¹:”x(;˜²Ù’2»¥ Xzá{FSyëØÛm¼56,].D¤*Ô<ôr<ÆF{fxOӞΗÍh‰Œí3zæ!¦ †²[0±íÓ\ÍmÛÚUê#œ¨0V:h–Õ•7ô¤û/»ÿZXÒX endstream endobj 5962 0 obj 4293 endobj 5966 0 obj [401 /XYZ 39.8400000 368.659999 0] endobj 5967 0 obj [401 /XYZ 39.8400000 496.339999 0] endobj 5968 0 obj [401 /XYZ 39.8400000 368.659999 0] endobj 5969 0 obj [401 /XYZ 39.8400000 496.339999 0] endobj 5965 0 obj << /Type /Page /Parent 2 0 R /Contents 5970 0 R /Resources 5972 0 R /Annots 5973 0 R /MediaBox [0 0 595 842] >> endobj 5972 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5973 0 obj [ ] endobj 5970 0 obj << /Length 5971 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ!’‚~M€ l ‡ ‡À›M°ˆ™ì!?ê¥îõQR‘¢ÔÓ´O{Ô"‹¬ª¯ŠUEòý¿þ½øçoÅûO_ÿS|·??}=Ue¥ªîOqþûîöÜ”‚wµ©KÞœÿßœ^Š—Óóé¹ý÷åÄÔåEû£}ØwÑ5øÛ÷_Oï»ÎOÝo¾~úsûé/þÔþï—â¯küdÛ;áÇÉ4êüáßÝÆ7ín?þëô—ß¿¶$˜K»çßI£„h¿BÇËð*»ü½}uVªÒM; Œñ–κýôßœ~n[È(ɘVRW‹[Õüܬ®xÑhUHÅœF±-k*´!ÃTœ†.±°¡±JjS¥‘‚ ÍkyfÙµ1¼ý¬…ý³b蜉Ëй©Cg±o*˜²Ñq:SĆfÙái**;cÝÐk:ø¡©Ð†t$í¸PĆֳ7E&ÓHKú¦Bg¬á"ÏEÒÜTLMh¸é¤ŽËPv M³£æ*_Í܃†fÙá6õŇàWâÅóâÇo§÷OL sv™¾ýÜRrñ»ºßÚáÖÅ»³/!ÚÿýTü¾ª˜üCñí—SSÖÐuç¨mò„¡'ÕGøä|òûÑè‰ð a<åµ÷0ÜÚgøä zÂñÀ~x³~8| l¯— ùC‘©Ý\ùÖbÃæš.›Äš^AS¸…ûñH”>†5J¹‡6ØšGÏvÇ€¸8ˆ¥Ü#!þ@.`tðô%Ñ#o5Ä Œ5XðŒ¦De£ÿ=¸QR!×þýšnVð.dÇú(iÐÁèMP’ì̧ƒi•-ǰ\aŽÛcÝp?ÐZ{ôK6öX°”VQÇCñ¦0ŽÍù%idŒ×DZ¢Ðx$–`_=…mæ0–$<l÷pkØ#<†$I™X’H+<ˆIØB ‡¡”{ä_&ä–‡áIä'XS!"xÖaØ"b  ŒQhóX-°bÝ;6 )x¤¯–â‡rE€vÆ3Ø{†ã¹Óy#¬âI~|ŠkÏÞ*%^H±gûG+°RÏËØKœé8vÄÒ°Š%F‡c ï¹ð+x i(Mô^Ð¥¬º.›Þ1VÖR™v®ªÕ‰¼¹jÇôUÙá«åõ¼k¬.o9S»vaêɘ›g¼”Ó0píoð†µªÕ«VY5nµƒ]V\$~×BUrfF¢[µBwÓÈrlÐTöà˜ä JÜQàþ–7âa¨Ã6ˆÆOV&Z~I§Ä\öaS 7(O#ª;ƒ]l°qƒìõÌ%p; °£[ó¸&ªqú‡Eu=.*Á§$").ªHªâªQÛduš^MÎÌ(’Q$>ŠJzŽ ;¸5JX4%"ˆª÷™¦”à})#±‡W­ï:ÕÏîE¾x<ûÓFñp™q.LÇ…¤¸,û×lÁazÔ q±3b?b{üåÝq,—p&Æe݇µ“úËM_ Ñ7£oJ„;rÙ'¦ú>‹)R·È%%’JÖ—•Û"¢4½ŠœÑÈHš‘ôQ‘ôÞêÁ#²îsD³…CièÑ£ìQ„^Q—\^º¬ÅPÑÝÁàMƾýŠÚM5Ã8Éï|ƒ}7jV¿b­ÊÍ7º6¦J >ŽßíPŸ‰¾ÌáJH'µ¦4M5*0á£F,ÔN”JØ*•©Êˆ6ßQð ~ÒÆ¹Ï£ ª-™GÜE³íKžjÝ'Rªp̸¨Å©ÄaˆAvžXÝ××\ŸÀŽí„MMå&%@¸èÊ-qÒ³¿À¿êÖ>­žÓïŠÂ&§|é˘2ü®@O¸y°HÉÓ¢@^pG…apÔ3Ö™’ýÎñs[Ij=² œPGîqƒ±»M)ôÀ.:!¤M©¿'íÝHT‚çÀÓ!ÐàYRÂpanA~C‡Hs5öˆUvpÁqæ €üýU¸d\ Ç*»fš€Ì!“æ¡ÔyŽãªíñWí¶…)¿{,˜ccÅ-X3kx›½r~C}nŒé3ÅÛ\1—kv0¬PJìSÜÎ9N°âlúÂ)á¬Ïzd$ÌÀÞÿ ‰èÎù¶Ð8ŠéÌEš±>._Q”EÖè”»QÔp,FÊø£ŽwÈ£*gŒüœË£;Íyv¼ÁÜ»qH™{׿팤I3’>’æÜû,BÇ;àÜ»}’†žá‡d¹w=”º&÷>¦cEÎØI›ãܻթµ}´FfÖöFô%y9›ì â(Ì|žç]—ÇÜ`ÂýeضÅ/Λ‘Dç\˜Ï0æ\Ø[Ê…I=–þíãõÒÆëoú|ôt)eæ4²‚BÞ€l~uGžüÞÖy’„ó   ìº ‰K”¢dT*õÖÀJun…T‰¥ðú`ÂXš±ÂÔ`ÔÃc‹qÀœ‡¤YŸþŽÔ –ªµš%ó­µì\ôA:.Ñ£qÎøå5q«ÇX>!±€m¤Ïs¦ä<æCZ)q‹W`éñådCµášå¢AšË+“('¼ÎWÛ܃<¯ŸsÜ/z|˜ï¬[>ÄWœó†ç#‚žßO}ã"á‹Q|˜jƒP ƒ={`õÆ©©Š€Ã â.ÈJtuœ'ëŠGŠOÒÅÁK| >å,$ÞbÞ¶\}2Çoj¿¶.†YTä­BÖÇ룺 –©º~­laµ»n}…‰ÁŽ€³RÁ"´â^BMtÔ=·ÇÚ¸‡…™z,)»»¦ ¶1êl•äT-ÄòõÉš8{” Qvª¯0xoŒ€£ƒÇÉží®ÇYŽÜ§"Np›íŽq¢L›Øm„½š ÅÍØE)ÿŠ‚¯®”GúFñbˆÿ?®[°Æ!&ÜÑõƆt¸Pݸ˜`û0»îÄÛ(=€Ë1¢ìx ˆ%¬ˆ‹f_3rZÿf{ÉoøPÒ9•¬*•fþÛ $ùiv®èÆÃ¨ÁÈòáÞߊrZøIÐAd@’ìßiÌ08œ8ò_ø>‚ãï¸LÃᦙå°'—‚ŸàqãÛ#p™<Ãwº•p‡“$H9ewj‹ª›Vèæ¥/j4ËrlYöŒ'š·@’®[¸öÏæï®Ãáɵú–p =ÖGì=P¶”ám[IJ·Û»©†x+e=8„ë:0r`Ä“¸Xz‚žÞ€[Ãûç1mœ už}úø¬ˆIûÏ›  Ïç„:ÓÈ¡ .ik,y<2õŽò¸V'î ;žb¯{P¸.ŸCЙTˆ‚u3¥gϘx­÷{Ó#ø¼ž<ŒHÂ#«Ù¼®gÏqnõÄÌž#Ís$¬ï)85õ>=GI8Ó/¥çÈL 3ÙsÌžc|Ï‘b­#c D»”>¯úhqWόܟÌ+\”ãC£!Mã¬9}´kb<¼Ï·ºx ;ßêß÷¬Ï‚&¼Õ¥bt«t¤8d¾‹ ÊwxÇ“¬RßN²{Ÿ¶ï‰{à.ðÑλçc<‚e”“òÄ~ÞX](%{‘ê¨j‹i,X-fõ,áí>m×C6[ÔlQÊ¢:Çmm¶µÙÖ†Ù¶áÒÛÙê¬$ôH6ð;ÛÚCÛÚÔ}í¿Ä9懱M”L¿ÇÂÕª±ט‚DVX`ª)û°²}ÞÅ>·‹—ÖðµFíüûãû%tMhu5¡Ï^#ê}uþ~BU°vSGn7L•—}!*ùZ¨•*Õô9Ç,»™q‡ëRƒõ«õÄ“Îñ¢äš:Ä ®KÕ…øÇfiªßià;ÝRFó’Wâõ¹<ak$ßþæ3ü®ÍÊMŒð ½cÍÑÔ†ÆakëÞ±[3vKÛE¤îü™×¬ßÉjØß‚`Ù±rÀœwlPIU®ÄCÙÁ3ë‘()öFÎ)]ÀÒ û±¥ÍSïÀÖlyŠ6,]Ž.x¤ÊÕL‹Fziï6]÷N×OmJÑÝÚ¹à‰‡¶'Ôæ!žAe?ÁsŒ±Ã†ÁB5טJ•ì|þÈH…±ÒAXf7·þ>Ç´¤Åóéÿm´Ó- endstream endobj 5971 0 obj 3188 endobj 5975 0 obj [402 /XYZ 32.1599999 251.539999 0] endobj 5976 0 obj [402 /XYZ 39.8400000 651.859999 0] endobj 5977 0 obj [402 /XYZ 39.8400000 651.859999 0] endobj 5978 0 obj [402 /XYZ 40.7999999 199.699999 0] endobj 5979 0 obj [402 /XYZ 33.1199999 249.620000 0] endobj 5980 0 obj [402 /XYZ 40.7999999 199.699999 0] endobj 5974 0 obj << /Type /Page /Parent 2 0 R /Contents 5981 0 R /Resources 5983 0 R /Annots 5984 0 R /MediaBox [0 0 595 842] >> endobj 5983 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5984 0 obj [ ] endobj 5981 0 obj << /Length 5982 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`4âC”,ÌtÏÈ!@cÈa‘C0›M°È.ÒÙCþ~dK¶»I|‹”Üã`ÛÛ2)²ªX/ÖãýŸ¾ü}ÿÏß÷ï¾ügÿmùýðe×6­içŸýáß»—C£äü±ºFއŸý·_wÏûçÝÓîiúïóN˜ãÀå×ôðôŠyÂß¿ý¶{?¿|7ÿåËÃ_¦OÿÛËýŸ§ÿûeÿãߦ_?-ó¾ðënÍáÿçB 9LÿóòÓáá¿výÃþ·i ÃqÞÃßé¡ïtg²Öñ|*Žÿ^E/k÷¦µ’{!ä´ÎnÇÿ±ûyší¼ŒfÐJ¨^vzú<Ý·Ý0Èés¯–Ÿ¨7õòð*9{³—ºs^äì7n*‘;Q' ÏD‡‰¼­‰V÷þ©XÑÑÝqëc66N3eÑ #Z§‰¬gjF-DÀAô›×Öz>혻ÍÓTÙðG¦ótX‘ÈÛÚ òx*Æc Z¡tL\:kó—©2¡(ZeÏD‡‰¼­ÍèðMÅŠ­Z®t™)ˆdBëaE\É3S3˜å~ŽyÏpÜw?LªA«'mƒ‰ù‰¶×ó»L•–±S<VÄÂü®LõÄ¢3Ê‹Îøìøñëîýg¡ÕpP‘¿þ<­ä¨gÏ¿¾NÛíöﺣžžþ´ÿ¡m•üãþë/»±éFÕw³b>?‘êøäÓ×iÅ×cºÓ[ZÐèI«à“ød„ïà+W „/ÞÏ'øä‘ƒÏékk{ôDÃU{f£@>§ÏöŽÐ‘-Ÿ`èàý( QøDBà'x¶ à¯Rbû‘sÕøÔwx„ý´¿áS¯ðªáNñ æ§ø æ;p?ó^Â~1ôÂcg¥Z´éÅkœ8ŒAbÓ¶Kìp{⣽"û½j„d“ÀDFΗ ½’lß ß÷€ž"suΈƒeI´ áýcŒ¹.&Xx%g’‚rrlðyØ>¦(gŠbQXTøUe«.qØ ^FfÎôÎâñ¬á±X—JÀpÂqf 2 Áçèr)G Ÿg b¦¸„…²$Di ,ŒÓ…9žíËÏ!äºx!ð€Ðs˜DÍ.ºR[²·\ÒC3Œ­‰=Ús.W› Ä“»‡BãÉë$éˆÅòCpç›1ÖWÓ]"”Ñ ÏKÀ=^"vWxŒá Ÿ  d1Jh‹ÇÔ>r)`Ä5*ù)Z9П¸ÐöU9¼fö÷ûÇÛ»Ä%Ü×I¸¶õïë<7“Ö¸mù^B§2ÔáBºB¤fTÆ!æèWdx+z¥œ%b/OQ<ÚŽc¿ô¶àvÄý ñÁžtHŸt¼®Âx¼®å °Mñ*Dð‰‚Y@eQ9eIðÅËbË[c½9_n²ÜìåÜP 8l(Æ«wžû;g;ñ^7×ÂN¸†Á÷wÜE}ÅØGÞgãÙC<> 2á¹g&¸¤RðÇr¥™` ÄÑxi)ï û>â=Ëá[:Ï¥E˜L1hðå|ücÊ…^‚³sEÏî!‚ùµdðœc—Ø„ÅLÖáO2Á©J"àZa‰Bü$á å\i×4ÞqV›¡ùã1\q!4B%C #˜Y›1Þë`X hÜá•z Bxô`«ã\)´“ír$']†Áe†Ï%4»Ù<”¤+B±×9Pdu"zè Cž—²±3 R¦ Œ{ìHU5©b<…Î*ȳ—°*ë…¼þ«) =)êžÓýÆøê]r.§I‰»ä̇bAW«KNϹß2OºËá™ÆÌøZ—vt‹ÃÏ l'¤DÅ`*Kü !¼"%9ÁéïëIp}%Dî¤dP6œ‘fS;–dýžì`‡/“´’@l˜„ÃaÀ”À®¬K”íÄ¢S"æXBN¤yrRY!¦ûÑ)8¬ËõEz”|];ØëŒgi˜ÜœSëqíg¤fñF '!þÔºlƒ êÄ‘‡ãAk¥ø­/f8.6=·F÷,‚NÎâÁŠ´«›&(€áãG¹Ö½,™3Ó ÛÉH{M.¯Cˆ¡ðܹSÂsn L&‚Í'›\¬e-ƒ´ãŠTŸH¯b ÆÀt¿‹nº¾(7H± f%ƒ;AKã±ZMý "°¬#ûÞ:æ¤Ò[8º{²)~[†…É2lµ¤÷ðùS!¯ÂfÖÛQŠ!KÅ,¢0Ï)\‘€sJ›”ÍÏ]#åça:ÕMæÝ¾^RõôÚØ¬g+ªOá ¬Áæ¹AÉY Ck«ëK|hTvøIºæ{Í>!þ™ó Ö)±S–ìF1Øçm“.çQÛŠå†tnÖ„•­°»t>ÿáJ<;éŲ¸úºð.sŠÚÁÊjFæKÁ ˜ÑÚ@V1Ìòª*eù˜PÒ†Ù&ù˜0Â^çUâcKè—ÍZÇóÇj2z€6‹ÂU1R9 ûaü ÑG%…\gK9’YŒOiÂå%2ÁÈ©‹æ-Á»›uqˆîÂe›rNkNy]Æ|RZEÔ õ#g‰)qñ ªe.I¿›luJ]5Ïô%µŸ’™®·ØýöÝ„›V «7}MÁS[…-Ý8dçxg÷#á¹ø¨S˜U´BJ±º“¢Êä[?¨âÏZˆxõÒ.)6™sò±ò,ÊÈ œø:žÝ(ŽR¯š·ŒWN~PÉÉ’üX‹!ߣ2K/«U·× ¿!›ùrKævO”ì¨௷àq®Wøib<Æi÷¶ZIIß~y§´ÀÄJe¶>Qßp*JÅ›ä§1Ýf‘—mP¬lßj—íZüÓåwT"«&ÅJ]yw˜ú<É„PŠ;I\ú2w8ÐpŒ†ÐÑx6ÈkêÕ²Ÿ(I[݈ÓxîÏ=¦$(EI³aþBÃÛÿz}Ž»uh¬c¬ž”£)‰Iy¶a9ì¿1ùá)eG”ž6 †ÀÅ<%•ñ{ÐÁ0¨Õ½Gã1ølÃ'$ K3 ^îr?§¾à÷`ÝpaÖ ”÷Ķ낳QÎ6†¥&/¬1ÜH§‘ÂG > ʪ=:< Ý6^w+&hJð:rX0eê4züQŽÇܱ‰±Î ë=×™~3^ Ö‹•p)ï„ ‡¬.×ñÝßY*T¦x²0ý°öxX³b/-.Ÿp}Ž]žó•P#2žxh›šñ< ¥›¡Ú-ì¼·çóšal_šE;Ýi£—'àô㋾’pS.zi“Ë68/ ʾòÄXà*••¼¶a~2#ò(½~oÉ–ƒª·$Dép Š ™òž„“½_¢h°’-À1#³wÚã™·-„Ý6³ÄtûÊüËa0:¢.êÍB-—¶h^ŽIß(àa¹6\›g \õ%–ÃÁ¥DÐY.ù‡F/GÇVœD×Ì”³jü]+½¾oÏi°óó–˜íæ¡RtÐt±žâÆgIL`éç¾HX–a_Z‚Ë.¡k#G‹êÕ¸y–ÆØõo½N¡M¢W£Å—I›¥8;뤕ñi%Øè ÉÃZ(YÊ”lFg_'•Áî\êBËa”¬˜,% èíYºa\»šËÉ%KpP4˜x×^ID­Š"mz#îˆXn¶YxwB£vŒÇY·³¢Œ±¤ˆ‡-%øØ±²é0ŸSªŠã“MÉd¥oÈ9ÃçʽöP%hêØŽ JhjËç—ròjeâ÷²ã$¥íÙ°¤ÖÐÎMq™K.‚]³ónߟ**ÜׂPS'Ü‘*ãRúÏl¿_j „1 ­p R¼oOª#†"†<îÜ€!OH+%uÎbM_õô3¨˜<¨.|¶pº&¤1Ü¿’·?/Ux’)ô‚¡ƒ¹"®Œ”qâ$%A¯ žgÜU…’pqªYû'aê%ÑîßGèÆ„éM±e>Fp‡N¡¸å8uÙCc¸7¦1BesÏÉX½Zýztaœb¸QºýŠPz@cm ã§Ã0 ô¦ååX¾o„sõç´íÇŠo½”gç•-¬³‘:1ÂÔÔVG!‚{ðØ{ž‚ùÃúœÐ¥ svJaŽZÚ7¥æ6øÐ¨"NÐ 5ýÛ?O/>–Ýh÷˯o¿zVân¡½láÉ» ïÐpœ˜Ù‹i× Fa溬{ÕžTÈ%‹Ì˜Æ\lu3CÆQ!eßô×ïGú+OfѤT#Ç«y‹]טÙíwyÒÃ÷ pÌÇÌB¸—lV—'ál3£yù—GøÝ%¸ñÊ?£1‹KþÚö±xiÓÆ,KÙû²¶ãÈ ºÃgÙ‰s¨@ß÷!¦…:ģ1íüèò¤µ±-áj1N1`Ìá÷ˆ, Ckq¸T²ÐˆØ Ïé'WÜ?íþ¤·ÔÒ endstream endobj 5982 0 obj 4308 endobj 5986 0 obj [403 /XYZ 40.7999999 97.9399999 0] endobj 5987 0 obj [403 /XYZ 40.7999999 645.139999 0] endobj 5988 0 obj [403 /XYZ 40.7999999 97.9399999 0] endobj 5989 0 obj [403 /XYZ 40.7999999 645.139999 0] endobj 5985 0 obj << /Type /Page /Parent 2 0 R /Contents 5990 0 R /Resources 5992 0 R /Annots 5993 0 R /MediaBox [0 0 595 842] >> endobj 5992 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1739 1739 0 R /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 5993 0 obj [ ] endobj 5990 0 obj << /Length 5991 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€‘Ej‚^Úr`Ø@A'“`âÌ!?ªUÝçËã#¥ê®6àî.¶¨GòíßüñóßOÿüõôæýçÿœ¾šïï??ÔUÝ×Ë×éüï‡çè±jôòã0v•žÎ_§¯ß¾Ÿ¾?|zø4ÿÿýAõ—Í·yp}Å2á¯_yx³¼üaùäóû?Ï?ýï¤Ošûùô׿Íß~4óÿàÛÃ8õçþ½ü ´ÒãüËóŸÎƒÿzøËïN¿Ì Œ—yÏÿÿÐŽãÐm߯ªË¿ç¢—Õ§^ÕS;ž”Ò3œÝ¼ÿýÇÃOólW0ª©UjèÛ¡žuÐçi‡¶;MCÒõD&%k ›J¥N4uÌDgˆTÚÒTÝ±mT3è®=ÃùºqÔóÏCc¾Â!Vª—¥«6qñOS¥N¤µ’™è ‘J[š9ÇT\JPÍüË…Æ.u¡ëTÉ;Ö÷Bgx†H¥-mÝz<{ë‡É`ØT§.ô:UêDÓXËLt†H¥-mÝz<•$Òu£„dÂuªÔ]Ôº™d&:C$#èTŸDôý¤/|w<øîËÛj˜÷eÖ¾ü4Crѱ–o_¾=´ó/ga:ðåÇÓïëZ8}ùy†¾ê5Cvù»ËH­/#ãÓí僶j›ùïýÍŒ<^F†ªž–¡ëHóö2ÒÍjݨt÷üµÌöôÁ4 Dµ6hd²áòA_éË¢žM¦kûYÿì\øGûO{냦¹|ÐT­$d;íÕPˆàòðQÐ=‚Ð=ê ¬’ð÷9޾±!ëSË9*Uumÿ[L~kObÏÚ66¬x2GøÂõûuËþªf%‹§?ýˆè¥Upy~X!«†HdzBø<ÉÞTKØhúìò_f.œ§6ÅTŒé”·ÔVÂ1²˜·„ã“î k}ü¡YHl¬Æ©îC¸™,2‰Dаø—á|!ZbšzÌîäG¨ oV™Z)žåVÕ¬û­¯\´–©úÎB^›µ«i[}ÚÚR#±ôºz{·ž!ÓðpßÛ(g5›½¥…âg§WdvoªàÙÈ–ËlžØÊ¬Áï­é!;r€„y6Þj’½xË,K«Á÷¾ˆíÆø}¤É9HÝC"‹ß#º2+ÆhHöÞ>QÇžg1O’ûÐ#§°´%-¨5ŠÁ#äÃàÑ,‚Q’l® £zg9KìÕðó‹^ƒ.0Þ±„|†šÐ)+ç‡ík×\Ž"ì÷9&!|ŠÃÄ#Vîgd_Úƒqq´¨tÄ$ë_hŠ`Ì”UŒüͱ{ \L@xe”*SÝZR%‚Z‰ØWÄė髚É6,.Aޝ¢Á-lq#8`üúØÆßzf‘«SU+ËÊÄ#F0†›~à \†°qŽVÃy&Å‚§N¤1jµˆž“E8¼cKàØžŽÑW¡Œ 0°6#iô`1’<‡+ãU“ðš`·¡/~L ÎðÓ0ˆ‹ÃÝR~2˜qøJˆŠ²÷E¨e½)Â’‰j§ ó:`÷R½Ým …Ý~Ç1OÏ„ã~DžQÊ “­®¾ _”(Õ:ô-ÁæpK.FtaÄõ1ïà` a;ö“#9HÐ:7…¯öh×£õ÷96#BJ|ÎÞlïL çŽðõÒQâ,¾¬:™»u£-ô&'¦HÂÎ 3ŠrJf¸ò.Kñ I„— IÞ>kr`ExFÅk©A”’¢݇t/Eƒ2åN?ØrçÀNç˜]ç  IÛð’—¬Á@„ÝÔ<“ð±\÷Ø¥m§û’P™Î¢´»E4x‘â]ΩÉ0 Çkd}á̪[ÁcáÅñœIáœÎ²8šá /¬ëǸÑÂ×Ç ô$ù«EbÉÞ×ÄèíYÄŽ#Äëô¤ïeE@f#3Ú¯=ĨѲɟœÄF‘TúüÙ¸Ýhq÷]‚°%&ŽÃ}i¥öEµÍˆB#—*<¥ZµBª 9w„9µhÄœàÖ3=éш~ß3IB€×Ó¾ŸMãÝ+5¡Û­‘Ž|Œ‡Í¬§ &õu &áuÃÆXa´ð­g4i ·yöF-ØzÓ¦MLŒm;ø ÜQ¹B¿\¦u¯àŽ8°ã%>-øLqÙÁáðÙ30S“c6QÚtìƒc;d^qH“® ÆN«†Óbz„#º‘‚tsÚŒdõ0u7¬ÛveƒõòµA>öH½ê]Cg?£âŸÁ\ëÉ3† ©¦¬þ$F}ªÆ®h7vRWi`'©ºZž|Œ‡ÍXN}eŠr¶+²×A°v©ØèIJ0 ÕU£Uý£tü{̾å÷ðèiõeËDòIËLÏH~%ÞÂV‡‰˜P^F#Lç°”96tŠ'p÷Äçp a†GÇö´HY„¤ƒÌ4ÉØè\‚ÇŽ¤Ãws÷ŽÓ‹ä«Ëø^Ã]‚ˆÚ2Š—®-ù’)vN‹mËàzáDâ÷:òçÂ]g_f€ón£?5‡“í‡(&ÿ…´íØMÀ„qÔÓx- ¢páS9¡lùóÂõȘŽ[ûë'¾ÝKÐö‘"1è=ãSßY²Ä!Ÿ#†"d­l÷Ñ|=Gã([®¶b U9ÛÚ^²ËÔIÉ/®Â-Ø2jg„ÏI××>1á8ŽñêßéøÜ0jæzÃÛ1z>ÉÏ-;+–§Ó´k%—qnÑ[DŸ±H^!#.¯2R(£†“¬áÏÒt˜"„œrº ¥4¡‰p·ì­äÉèZ)¹¼ ÔŽ~,~¦‹™ h£ †ÍÉäãôåÊÒ+«Ïf²¤I¦Z< ãÌ"ZX‰ uã0m0b%îÔ#€cbÑTøÂù×¢%DÝ'mªn2âA«Œ Ž·Zù-xoš[°*C"\Ò{ºfL*é3‘q‹X|SÅ5>VÀÜì[?0 ÷NL†|aSÃ_MÙšÉ6ü»)(s*)Ñ•$ó«SYjÂËoˆò2Ì÷’ý­ZSìpæhÍÈ´Î)ųÁœO,œm ׃ó½¼ÒR9²j˜#{h¨!pj>j›£êfÝ;rÞy˜ó<€;\;¡ax^Ú™8Ö#Êð3g¯1ÕŠ¥ÌàK×­oýPð­SS˜Ûpp±˜}I)ã¯ÆU97)'09VzpþÝ]ó 8ü›Å¥qÕæÒø=ŒZ"Y\Ö6aL*È¥»f­â-É¥»~­’;€¥!À˜k4!ÿ>2gwȰ۴[8+ÅZÓÑ9û8záÙÿLÒÈblA¾Ú×C™Ȯ[xa]ô:“5ÊX7Þ_‡µ_r¯ZyKÌýè§UÀ;Ò³K_\ƒSŠ9}—òzË÷º¤-¦ 6Iû )u¢éE¬Ä#\m"y"+G‚cË~êjAä0ŒbÄPbz]áâ$ lž¶Ë)e²÷̼B™yˆ¨²6êj-‰ƒQ“†ƒíèh-Z†ßK3BòÀ,’ݽ×Õ’/®ò0Ê´Ä";M9*yI9Øk#®Ã&¸g”!ãj(]eÈ+æ(þ,®›¬Ÿ’1!ý•“b½æ<öpMÖIºQ–g¥ÜM{URzDg1¥…Ž:\ Šä's85RMr^ŠÛê`®@{õ'öãU!ÐR˜”[>²xÝ’nbãôÉË·Dšš3ú=TÆ3Ú»¥ˆSM…umXDò8^9ùÓÊ!®•ð–ÅZ ݵey #ÅyÎè-Qäígö1×ÈIÞ“¤Hh«ÂöZ¡€ Ç0%ÄÑ+ö˜³¸ë(ü´¤DDǼ>ÐD#oX»'‹ ‹ì^¯r€£—V¯¢`Í‚†´¸«|-9›Ü­ Ð-«;‹ÎŠà½º›pI–Nᨧœ²æ½“f${]dÄ|5“—…úñÚcf!lLªáÊp}#[šs£»³¶r­EË"'Ãðqª‰°·2V#<•Ù08`ª•¿4‡IK¶·vÈT¿.Üe r{žœ·ÉŸy;êëÍ!˜;2´LÇZ˜;BKÈa¡0nÂk`•”£êíX8êÎð=iI„u}œEÏÇ\7TûÚÆ}eeóŽö—Ãʶ¿¼µG‡´h\íß@¾Ñà}ÃØ ë;ñÈ‘}G>9ξaسA¨ëÁÕAzg+#?úµbü.?˜òÏeÁ]J8kï&îrJw„ï¶åÄöß7&rö£GïÛÑåîxkÞån1¹+këݦܽ÷qÆïrWwîr—‡‰¯Nîw^•7`RêÙu϶:O{aÙVGöpâd%; MÍXø´îÝUï>¯áw ù÷¾•w{Õ-… ÐŒ»âJ×Jýv 7ŠbòÄn¨âKZH$Óš |LDÞ_D"Y–ŒÀˆjnÖE)m U‘·oxˆËht}½?ˤLÅ1l†*ßAÁàPåqz¨»¥Å® 85§Î1‚¶V,U;“Æ&“ðºq¢£¨º€°Û<{GÚd!·Ž¬AÕpŒv±â)?þ«zMã12´Ì[µz©TÇH—vЖ-c@Ô)òÊ褽®_ôÑ„§›R(žëì°¤Á¡öØSfç‡1açqqgݘÛ8® ;0‡*æœ*„ÿE9Ô4$àå‘ej±ÓbÌVŠžKb’Vëõœä¾#`-cØîë‘Ô <®gýT™¾°·fX¬ëqïµ”Ž|á^ÔûíŽu•íûÔ±ƒ±ŸF×sµèÄëd¼/ f¸üÞ ãl—íÇh¯É £ä<êœ2£-¡ãM”ôÈJ°DàÈrºöûJuˆ OÞ/òñSÞþ×x·žÆ:£¾:ðµ5³o4? ïg{¿Î$å:“R®‹4ŸÏÙ¥®ïmÑ‘Ð7†³àí`45Ë«ñ™B©(.X:å¤tWö½nøi;«Ñ# Øæ×‹ ­¤ˆåL½È"$Nµ ÏÊŠé…®ˆ“\/–âOG»‹â±[«ÉBo‡&GtÙðîûŽ\8N÷?¿ê¹÷êÑú®w[IæIp•@D>‘’^¯\J»Å˜]̬Jxùù*ˆ‘_VÏÞçé ä7›zÍTÀ—›à¯†—¨˜\”g°äÂwãâû¤8ï)5kGEWZÂ&k,£Þcf¨ ½o­¾Ç`ÜÖ{áJ9ïyvÇ1‚wž*Õ5®m:óJšrÈ&†D¥¬'B"ª¶hì]&|âÝ¿|V¸˜(ÂÁEÒ+³t–‹)˜(ä¸=Âéȱ†¯ÔnC°§ñ|à#%âðô¡:äèÚi{yŸ²flf8]­-‰#›J02å*åpQŒçZÄýÁEÞ'Âb^D5GR¹Âq ,“>ЩÁÏ1"bð…Rßw SäLüÈ((¦~°E„ëSÖ±¡˜0Ô¹<ê~N#×›Òg\v ÂÅa,››“bϤøäY2QÄÞ û-"]ÝŸÔa>½¨°yZh9FÍ+Ô&ÂMC*¼íÿžéIGxbqþ¼UGvمµR»)),¹éGkN'³ô¸I’tt¡‘”ÇɈÉÌ߯%BVÜf”Å%y«#‹Ãuªça¾ùßéûÌ“g–{þóíë7“¦Ü½~âüÝù¨?¨ØŸÔ¼ŒMÑ ú¥éË©©×›5 ƒíûªßv£Lml =TƒËþ# º4M¥§M­§ëª~9]¶Þ3Âg&øÌÂ×]éº9Ùbak¶ Ÿòþ­Q7Vø=czkD¡uìŽ{ÆœXÌÚ lHÀºóϺSk×bÕÁ÷½Ç…qÇàAGž15Jó3õ2ô4RÛ§­!´øL1à“ÃïQïENaë¾Rç0¼ux!‰©gfú'I®xúôð6>Äá endstream endobj 5991 0 obj 4927 endobj 5995 0 obj [404 /XYZ 40.7999999 240.019999 0] endobj 5996 0 obj [404 /XYZ 40.7999999 240.019999 0] endobj 5997 0 obj << /Type /Annot /Subtype /Link /Rect [367.199999 708.500000 393.120000 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays >> endobj 5994 0 obj << /Type /Page /Parent 2 0 R /Contents 5998 0 R /Resources 6000 0 R /Annots 6001 0 R /MediaBox [0 0 595 842] >> endobj 6000 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6001 0 obj [ 5997 0 R ] endobj 5998 0 obj << /Length 5999 0 R /Filter /FlateDecode >> stream xœí]ßÛ¸~÷_á秈¤$J@Q É&úP H€>úPäz-—CÓ{è¿_Ù’í]Ñ)~Q²×»@vc­Èáp~ÏpøæÏŸÿ±ÿ×ïû7ï?ÿgÿuüùþó®,ʦ¾ö‡ïž ÛÂèáWÛÖ…î_û¯ßvß÷ßwŸvŸú¿ïTs|qüÑ?i/ªآ솿½<±Ó?}?Œzù BÓhç]<ÍtTÝ?¨{‹±ííƒçÀ—ÓQi œŠ‘U6Áùt6…VíËùªÇ'¾ô”Fª2- [I¢6ê„¡⮨§ë×z2nÍ•'x´qÓ®½ÓÂ'ßIüÚ“Îcã!( <Åïàõ`Øà<Æä™G3¸þ@`>1p4¢8ðÌó1ž³0óO—QÖÔá55ŒZ´]ù’F!£êÓø—'o!]bÏÖ™˜ œ°g«œ ÅTHÐgyxX&ÂûNñÜ1Õ»é|SdäæüÐgX:bv 1Æ’*¨Õ$"[*Ú27ú‚ñÃè†%£K˺Fµn‰vš†6—¬=ˆGÉ%Î3Á¶7\VK³BcÛ Þ]¢Å2JÇÔÁ"‚1ºRL°¡á‰€f eˆØ¬aÍØ»ÄFÎØ.¬[ŠøiÝeÑXõBv›·pTüÎÉÝ-ÕD«â'Ëk¬®´S6ík[9™lQW-k1n•G‚4‹D£O®M&c:ÝÕ)ºå˜½Žuå!™1ê:6Î`Ý|@0k¦a´̧¨ÐWŸÖ ûoß}EßȨz¾,p°€-¶§ÙžOØriÎöG„]V ×Å:§ê"¤“«¿ clä 3ŸG"¼ß0÷¨a^U^f¨2ÆÎžÎÂxõl9aKÜ«Y¦›x•œä`HGQž‹få”=©y2]Í—é¶l&2¢‡…}ÂaP¿Ô‚Æ”[>~XøqÝUq€ªÇD£žðëîsö´“ÍË缎<Ä”>‘ïbo Rát»*ƒ3TÛqÊeíTè±aÄ…ÝQ“Ý"úYıq5 cg‰TŽ.’ýœaZÏ7ö]Iƒ£áän‚)‘â¨.íª'ýË:Iîú[D+CZ¯î&’;Æ[a„SHª«xoò32¹’º2¢ž$E…¬V`âYNDàÆÑ?жI·SW•bþE…óƒK1 )ãE4–ÌÛ=UIZÝ<ÅïPõ¾„ôäk!*V‹däsQmàkçën§I)=A+®AòœçÁµA¸.WÒ?Á'¸Ö Ÿ\º±ê$­í”ЗMÏ‹xwQ¶¾hб™î*Æ¥#\§»'WEˆîðIÑê0G)†íC¹„Ac"\LáZ‚¢ Â8 ËE¤¤ŽÝH†Vè:œ*ÄÌÒ$É6çòÈz´ÏÜÐ4|‚©àv6žà8Óä¦ÜQÂw0®!ÅV׫ۧØnôPÞÓ›¤‡Ÿ² ?êœW2uV‡éå-Ùt´d˲æ!!’–HÎ#’ãm£‘ÿ SêSgT­×j+#ZÝâá ç” ¯¾=ÓßJžÍHê…—©YÑjîB8=Ï8ᙯ‹hK‡ÙÒSø/Û"¢µÜòÇ,:=QÔÅ;kŸÄ9’ñztSÚ.hQ`‹¯Æ•1„wÊ@€m§Š¨¾òD°U…ãäD„ÃV嫟7ewª1©ðž`>Á£U#Õ…Vx wKálŽ+CŸKçËšeÎæ6>ÀÔbúÅÜ@Ô‰eË´2ÕÞ¢ód«>ÌåŸfЬƒÌU±•±’Шº^„b±¼¼MÍ‹3Ôž ÓÿêÔ÷Ðö\UVïzâ›Ì¹(âô%£sé‚û;¯j”=Õ˜d;‰ÄX»Xk–ÕCÖxå‘Ía2޹d£Á¨s¨ŒôÆÖÆ(|R1Õ~˜³ ì¤jZE³¡xO æÑ®Y­å΄9PöÉYËÂù{¬Ó«œÉ3ÕA¸*Љ¶¬^yAÆT3]0%ö £§<6AÁh£ÐOÅJFy«U¸r/¸'y 5*éJìWw[_Æ>ü!.ö²¨ ¦l;ã]X=ÂrÓÕzy$~}¯6:ãsS0±Ç{Ó«Ë4Lo¹¢ ›¦·Õ%±¬fñœ;`tƒQæÜ¶#˜³«„Ýš3 ÛSå°õBð³,ÅÞÛ ø\5°;1FÛŽékÈøSØ"ż€³„W‹GK8Í•E ™Ò×MÙÌYF eŠÙfëÄÉÄa˜•i6[èδĖ«=es RÁ§Ô M)la¬n)R¼y»–bu¾­qË•k0súÈÔp™šGû÷¬wv ªÐ˜Z¦>-›ìdúÕb¿€éô’±öÁ4U˜ÏDŸ`,V„ÕV2úQäÃÁ–«‚pç™mœ4­ r÷6*‰ªR)ûõœ®Z¿úhË=¼ryò¢ïòê!Çœ$„#yÍ”L<.#v3nÞ¢"^—Çãžoî{†_K—ýÌ%‰1v"J–áú”f☊6DÏ’ÝóˆHªBÕ¨Ÿê²{‰¸þ¯';õ ëïáÖ•H¢ŽD¸òΔý*±‚Ädª´S|DXaþ€ŽCÊ41C‡ ©È +¦dxDl?ú”rÕ3VÜ m1Β̸V è–‰½=ès-ú\Ò[1Sñ‡‰v¼¯õÚÈI&¿¨MždºDD_'8‚°o)%“PZ4cÇ$i¾r&“¯o#oʪ΀‰ïmP[Íw?¸ZHõ­ïÞ*-Èt,r‡†RH5lzNG”ºOJhe2¬¢“ÍËGIk}>„=_ÈQò×qùqŠ_‚ç’è!xo˜Hvvý²D¡KŒöp̺ù*Á âã«­j¸9ac¶ åIĈGuòŽ7G2…RÎðËG`­#¦ ØˆArx/™b¢íJˆx<™ÉúN*ÂA¢Õ¼ÂEˆ];îŒS†§!B3IõÆ1’NQo »wiòæÔ.­RíâÙm,Ë#¤EéAè¢'£Æ `œXÌÔÈÔÞY²Æ[Ù Ó{ÐQ4…Å“‹ˆÖ‰@/’òšQ;¿þ F—F¤ö^]ì1SµXöE§ä3¥H²bà–32k÷Ô+hA}c­cdJ0€[¿.ÒY/\9¿8Xätf%V龪Ä^®$®fQÕŽÒÓtÎÃ\vnرðED†¹\MöÒ'|å|B]ÑE\xD]7±aJô´Y…ä¼ÈÑ^ªš‰Kò4øz¶F„xÓCc‚lÒ_z³ºäÒøÚAÜäs-^)qŦ|ù#‰…e'sñq9óú—ŽË^ëá –bÌÕC²LÖÆa®T$Zˆ{.CÃ븖»h3ʶ]÷íWNXdJ¥y"bÛ½ÐG¢R뵤¬6ÔÂGò^˜®wVÍ?w–Óåmëóíœ6Á(C‹1§ÄJ…g`ÞªÌÎ ViÞ°ž#] ¤øÙ‡Sæã:lnÖoy˜,Ô×]‚‹ºAÌ}»²·œRòï=á¢màvXžbóPŸn¨ÏsßtèIžÕUçŽ7|È0ê‰Ç‰~5ä!\XÞðžbYÁ°¼d$i^{÷Ègý÷þ{ÏPÇ»7Êýøãë7‡¹¬Y^Xó“—9½¯†t6{Õ/ãZM§š¡ŒjoÊêå2›¦h®;Ê]U€è‚¶…½^Çe¯<Á˜BwW£ u]4ƒK5u׿iá;|gPVº<]œèµÑòü“'ø·cüâÊ ?¢wƸŵ' ­c̹ǽ3îXÌÚGØŽ @u‡ßu­ÎФ†ó½§…ig¤ƒÚygT1ý;åðèò¤œî¶†Ðâ=Åt€wÏ£Þ‹ìBÛ–M¡q‘Év`BSÏ,O’Rqÿi÷bcD endstream endobj 5999 0 obj 4894 endobj 6003 0 obj [405 /XYZ 32.1599999 626.899999 0] endobj 6004 0 obj [405 /XYZ 40.7999999 417.619999 0] endobj 6005 0 obj [405 /XYZ 40.7999999 515.539999 0] endobj 6006 0 obj [405 /XYZ 40.7999999 417.619999 0] endobj 6007 0 obj [405 /XYZ 40.7999999 515.539999 0] endobj 6008 0 obj [405 /XYZ 33.1199999 624.980000 0] endobj 6009 0 obj << /Type /Annot /Subtype /Link /Rect [294.240000 583.700000 325.920000 591.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6010 0 obj << /Type /Annot /Subtype /Link /Rect [340.319999 488.659999 372 496.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6002 0 obj << /Type /Page /Parent 2 0 R /Contents 6011 0 R /Resources 6013 0 R /Annots 6014 0 R /MediaBox [0 0 595 842] >> endobj 6013 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 6014 0 obj [ 6009 0 R 6010 0 R ] endobj 6011 0 obj << /Length 6012 0 R /Filter /FlateDecode >> stream xœí]I¯¹‘¾¿_Qg]\rHz’ àƒ1‡z¿|žþþþ¢º·—ÓÃãó€ÿüö—ŸçÉ_æO¾|øóôÛ¿vz÷§é_¿îþú_Ó_–ñ_øýe»Ã/¿Í¿(­ô0ýãò·Ãÿ¿üå»LKÞÆ=üý“•lÞ:¾Ÿ^Uoÿ]¾Š&kv2ã0-Qéé¯vÇÿÿÏËߦÑNËØV©¾³}“<¨ëwÞÏï¨}k»azéüäÃÛ{ú@÷óħ”~û ?Nwñîðö¤Ûk58OÜQƒ¸_m>Â]ÀAððªs¶£?9øx…—Ö΃ìí<ÿÅËx‚¡åžŽ>8ª·s5ºƒa0Îè¨ôqØÐ{篵qÍÇ(ïìèáXÁ8{Ê|Ø@âRû®Aû‹OC Lýê†7î1‘èyz'®;HlÞÊàW}XyÀ `'Þ¸·Op¿NÒ§Œ,9ìß&éåÁ¶¡0îÕ:‚hÜÏ{ï lìˆvîâa3Å«<Úô¶…å‹wjH&V'%H| ï#(˜Z½]``14 ›Ð,Xïã AÛ I‘Ž0„4A|‹¬>ðU<éà‹ž˜pm®í|ÇÐ×Ö¼Â'éó4ð7|¦ZUľÁƱüc{ˆ/øI:Öc;…ûáŒf ¯Á”a05a…§Ý` «æœ‹Jðª!ï ð[Èí –,p´E“žFÃÔˆ¹7æUðÉú<$,«á<-Æ7H@úÁF`4HÛXÃ`<„ht´*2Ti…<‡žñîºÆKöÕâ·.$ûD˜§a<À y4GÃÞ2&¨˶®"=[•awq(Ð`Û&!Ú à\A5¤Õ9—¬¾^KS4××…£ñ8W%š ÈŽŽ1¯ s1ìWª%ÁduŽ¿‡ae4_¼ë…NËßKªñä„ñ·{×9ÞýT¼£vPËD‚¤ß+°®r¼Yy]Óÿ­í¥-tƒíVŽ”åèÆð§VÒœ°¼ÂÚI@šãóaÈÒZ~¹€Œ[߇³aÝ:°jL?pžÀM >†ïXø´9þãQÞwcúÑe* ¾›Â{²¥’áÑ2Y_xŒTiJ 4ÁÑö¸†¼Á¼ìñhè8!5àX‹Ÿ'ΉG¸â#^ºx}­v^£ÞϘÀÃ9ò’°Ï6=¡à±ó KÊap¡²©µ”ù 9aToñœ„† 7>y=©&½ºBïE¿µüÎQ1öÒ¹ñ“8›à$¥qÞÉI©§°AÂqI&Kf}vÀŒ«nb‹xûQüùñÐRåeÀÐ÷Μe§Z]œÆã‰,…DSÆDÌ Âw˵l|¶Mƒ„Š1±T°‚Ç!Ž4ŠÞ|OIíf…%¤WY Xeã!h—„Y 6<ð;²:bº’³~®mé%ˆøõ0:ÔO¯úDÒP»ö¥ÏˆNJc¿¶þŸÕh*eJsêo±*28‡H!¿œ‚e@n_Ïüá’(¯ð¨JãŠP,®mÎP7RÖíÄHgp(¿,óaWo›š ŸæP#ºÓúòƒß^¾T/ñzX‚£¡Dèö­Q:Büé5)%äÅD)¯ôZsÌ<Óç‹;W@m¦ÂENY?ŽíA¨C’ãÓ±ÆEQç%Ô3z„²>¬âHÜc>tYÛä«Vª¹’¯s#¶°·§¤@hG"pnÂX%ÈÓËêø°$(êÌ äxÝdV-;*qùÅ(Qu0¡´¤„¦—À¦D¤—w§™„µL¹)³˜Q¾¼PùÔ; HÐÉwÞE+àºvGV'fRnp "4÷¢0L±9ñ »‚eÚÆÉ‘r–²ü^QÓJ䞆r+ǸàÀ£ùR9ÚÍ#]VÜ{dœgœçô*ɱþb(*ð SmçwlÃÞ1‘Ðâ­8Ç 7ñªÅú¸X$\4+zò³8‰ UCK²ëÎ8üú.=…qNGqSÄ­§ô ¾îu4#,uõžð«ÆÃ]ޝöé /SÌ&îY•ì6C J`Ð=žš1‹µ%ì^¡ß’vå‚(}³Äþ€J½5bêVyC¯mtA$l4ߺNwÅÝëEåE†@ê¦H¸0áŠ)çrO’}p|>œŒ¬ûU†Íñùr®ûÊZΈ–lãÔ¹ìié p‹ÂïÙçQÇI.ÛPœÐ8¨Ò}wµ˜‚¼c¸æÒSr)õîºý{N*A2rR_Й䤔üU\­%s6u›®¾2ì›2å6fq©]8ì킽."¨v?8™tçŽuéó,¦L¿7 ’Ù-ˆÂý4øÉ+Ü)œgÁã0À;=–¤Ì£O¥*{w¼³Œö’ÐÕÂv–DGïL+(9c·L¹ZomŠ ž“Ûí‚ Ag©/È øå©HZG¥r]…ì§Õ=Ekç–ñädŒVóŠrü¥ž¢O縺*¨Y¸î"Ü% FF¹VPÏÀýÙ<^®UéZÓêò#µNÈaWo›ê—:!“n{ùÁuBK¸†t´,HAØëÑYÍU EÛÃòT”ë8‘ ÂMa™DÑítⓌ,-lKÕ®¾å»§bR¾¼ =ýe „”pÊæÓË$Ø«„ ‚œ•xn'ÑýÂõ˜"ªnIÁñ ó:kŽÅ²–Ûý04»®?üèÕ,;ÛíºîèR:~òm’¤{¥F= êô-{5нœcúþòo}xmç¾­¼9Ôág%Ó·Æ«QÆë9þþòþå A œûvƺ–•ŒÝÅäð«ÍT.SŸ"f¼²¯‰éšŒ+窚J¤L¸²J·«)™Ëd­]sËíô5ËíÌ-–Ûµ.;œ>ñXîá[öj{9ljåvêËíoŽÆg¹‡oW£Œ×sÔa¹ç懸Í8nƒV<_5£»Î'7ÆKãhã8ø‰pѼR0¥ ÄÓ³ââÉ…d:¨k.<è[\x°.‡œ>ñ¸ðá[öj{9lj Í-.ÜîÓ'îO|÷8Êx=G. wdŒýàpWŒ!8p£§c¯Åx€aG«Esœy††(\:˜²0v ÷ƒñ€ƒ!8 ‰E§1¸••íлb fw8Þ ²bÌ8jE‰VÀ!'Œ²Xè@$ÈY :[fwXCá-nX`¦6J‘-®2“lw¬WYÝ#-2HåH“2E½YY •±»Rhg¡žt3ÒG»²NoÀhQɦ5ãà00aD$1§C,²BÛʦ~&¤ñ×®ù_FÑ÷Ð3ÝR Ø©‹HP|D*Ázᶜơž^,N7> ÉN&)©Ðå œ;Ê~ºGÛOziDïg2KÔ  áùâê°LÛ¤xËŽð"T¢¬Þ“™ÁiÊ")q12ø.RBý~(€–ùÊ›¨ã¹0I†EýÃ)ˆ-%Óº'nB¯«À]%#ǧ¤Ú×Ò²ÜEÒíT+oȺ,ç®,ñ`·ô28±ù€ÞÁRÏôðÉ)ýÒÿ÷¶±Ä†‹aØ:< ¼uÙ¶^› òXÏ#‡ãý9U$L@>¥C;ö®t 4—!i 0BõŒ<Ñ~‡¥åUmÂÈÍ-cyzèâz¬fhPœú¢õu«£2¬µ ª‡äm§Þ¨HYÙÍ<¬_$osM#«»øs¢«8‹´œÜ]ÌAÓok”2캚¹«(Ðh5œVá[ÊòTIÛ£GºV:ΖS5^Î~O)}ˆrr()Š æP8šçóLDÜB"âú©v›I¨#åù–ÑÆÙ)1œyd«ùã øb}·ËRäШdŠ\4×*a¶£Gô…A`ô K}Öò–ÑXGÏp‹(ÜâÙ„‡;œ¦ Q .Ü.ÄZG„UŽg¹õä"nrúo÷}Úá´úÖß~lÙ‡Us†Õç ´‚¯FÁ¿ü«$ endstream endobj 6012 0 obj 6225 endobj 6016 0 obj [406 /XYZ 40.7999999 545.299999 0] endobj 6017 0 obj [406 /XYZ 32.1599999 289.939999 0] endobj 6018 0 obj [406 /XYZ 33.1199999 766.099999 0] endobj 6019 0 obj [406 /XYZ 40.7999999 212.179999 0] endobj 6020 0 obj [406 /XYZ 40.7999999 723.859999 0] endobj 6021 0 obj [406 /XYZ 40.7999999 545.299999 0] endobj 6022 0 obj [406 /XYZ 33.1199999 288.019999 0] endobj 6023 0 obj [406 /XYZ 40.7999999 212.179999 0] endobj 6024 0 obj [406 /XYZ 32.1599999 768.019999 0] endobj 6025 0 obj [406 /XYZ 40.7999999 723.859999 0] endobj 6015 0 obj << /Type /Page /Parent 2 0 R /Contents 6026 0 R /Resources 6028 0 R /Annots 6029 0 R /MediaBox [0 0 595 842] >> endobj 6028 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 6029 0 obj [ ] endobj 6026 0 obj << /Length 6027 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€•EJ¢$ `{fäÀ°‚o6Á"»ˆ³‡üý¨[TwK©*>Z=ðŒ›ÍW±^,?¾ûãç¿þùÛáÝÇÏÿ9|µ??~~¨«ÚÔóŸÃñï×è¡jôük?t•_yøvøöðéáÓôï·eNí©pébn𷯿>¼›;˜?ùüñÏÓoÿ;èߦÿý|øëߦ?ÚöŽ_øåaÍñ—Ï¿(­ô0ýçú·cá¿þò»Ã¯Ó†S»ÇhGÝŒfˆÇ·sUuú{]uVŒêÚÑ”ÒÓ8»‰ÿýÇÃOSkçaTƒ±àï[zŽ=u¦ŸzªÛi𤛱Uª7m_o|¯möª?Œý4ƒ±&nl*¶¡±6i:ŽHÅMm"wïoJJz£Z}š¦žzˆ›è¹©XŠ™fÒ4t‘Š›š%½§©„Âe:Ó¤.3Õ9Q³§zIÎ¥¥èuš1MCÇ©¨™-ë [Ó}˜Ä4 Ý—–¢É5š.ÑŽu"º»-}JbTõŨ~óTüðåáÝóxt ¾ü4âä…Ì?¾œfúÃÑÞ©é?~?¹"ê‡/?? Õ4f£»“ÛbKºSI[µMßY‡f.Qs¥—¢-uzX¢O%}UnkO§’nòšõrlçÖ.´¨ùÚÌôÔÅ$ç‰vËØ.%ïáÐ>ÌuTÕµf˜*KÚgg$Ú F<4P˜t,!¹jFÚÆ¥#!,ì¦q«8"؈ÝF0lçÝo'£?¸lŒFô{ÄZ"¹ƒ%¶ã§/“âÊ£†ãê!EÄSl8•˜J«!À­£]i‰a̽´U8-Ѻq%Ó³ ú‚Hœí¯£K,¬7(ñ<Ý`um H_àÑ“!‹ æ9ÏX±BÆ%î,Ô‡T*f˜ö/k*F©YÃtÃÒå£]± #Œî'–@Æå•믌ÎWÔLCÕ/Lrùªí±©šö¥û`j„|ÕWãàÔY‹«¡ÌÜ©ÆåË—V»®ÓæK¿Ô%¶N]™öäí¸«wÕ> nŸŽRÕˆ „”+•{H·²¦ô¡ŸàùˆèB;šåK™ äÀ“WO°DÒÚ3¡Ü˜Ûˆ·õIÂL­¯ÎX®îíÈ=vQ`ÝÓcv±£YH;ã%9l÷&ðVi;=9ú›á®‡š8ÿ„Fnë“Í` 2 ¼Má¶I\„w]¶ïÂL]ŸíıÖf›à‘04BD€úý„_êÍî!•-ÌkAÙ"ýzx!´69íAß8!f9¢”Q™›(¦%ñ¸ «buÈðý&˜cÇj;»PQ„f•³ÂX—'ܯ¨qMz´™…§UK—Ö›:‘âÅŒFTR/Ùwnï£ÞÃ:#ªc‰;ÍÑñ¬‡ªµT½”4–µë/ZmiªæÄÞÛêÔ‹OÜægþ<ìnb­.y„#€4ðPö£ÏÛ€Þ¥(¤§<6<ŸÑŠPã†ÌñÊyèf·B]5k³Mëƒi€ùMCŠj4S\R?Ã~ðŠmÊú%ìá9ÝHâ vM¢~ jÞp‘"ø.ñæÃ¡dê 3v Ã&8^ñx*ØL 6¨1ñöÂndÞ-Ýõâ¸8̰ýDÄ6X¸{[†ƒK LHQ:ÂÃÖL%ö`gý™ˆãÌ3¼ë Š /‰¶O)¢Qçw¤nÞÓ$N@¨P†çÄZ^¢|ÂPeIB57ˆ²TÐî„=€mwЪµêr¢lSD/8­2įŒP§=ÝåDø³ÛŽ‘ììf{å@‡†$·Ó´¡EÂz k£í,‰Ãî¡`‘G~9'e[¨³û–UF³(‘yFºìV}‡"äãët@9»!‰06,d$ŒDlºÓó¾ÊóÐÝïY ¤^Ôçô,)Ãm`ÃÄd.ç9ÖºõQeZû™$Ó$E#Iv+™“=‹ŽŽ ÒT9œ“û(!Õ6ÐCGú¥jÎGR„Î*±ë¹V¢aɈJØ]éŒz¹o;W/g·};:}îÑI¸SÜ-Ø®½Š'·/‰®O„¹Ÿy÷8¢»‘åµ: ìç•è÷°Ÿ°äl –`ºiLƒ¶K0E=+×÷³g>¸ýÊIfZ Fàáx(Áx¦xå<­4p^më­”´˜n¯,?iìø%žÖð*@êÔP¿y8Q¢)ðà¨q?ozç^õŽÈfaÞ‘ÌT ¸ j1…[òÐôÙ̸ÌêÁ`I™‘Ë ö.›d9©áñ uÿæ3½é®7Ÿ)Úg*æÿHvq÷)pÔùÁ²W;]\lƒ¾ÕçHaI-ßva¾Ú¹åL»Pî±`¯C¶×ÉÆ8•Ÿ:^ºL’gP$D>ºCßT-ãJªÆ8ô¸‹ô,ákÎaj¡RœñOòùc.uG\ìõä.à\Óíð9ž$›ðu ´HÒ­ý$È–Á¡ÊirÚÁUTIDN¢±òœÚ3n»ßSÒX £~„Õu˜ã-zð=8¶ö=ˆ9qɨЇ¡ yž7¿R¡Ø³æÏŸ=Ž$âfhTâjDØnÓ ì¹»sZÑ­Ó'7\¸ _Ê Ê[èJN€§¶DØO½ÃFw…“Qª´izàËátáÂÛ»œíÚU7…AY÷] ]µˆ¸¹¡á¯°&ÉÒç)¶Þ÷´Ÿ‡½]øÎŽàšï~n3¥€cÙ­«y“«»}7ºfáŽd‡AuFä=ÏÍ£3zÅD܆”\ÒKa¨D¢Èˆæ½{xó»|Cn¹^6—}7Cí%=(Ärv®è~—¸C7†x-üh&ùty{àG8 ßLì5@¾3ä<Ä%…`1$`âQ -1`¢‡x>öƒ×t›Ò•™õRCCˆ (1 à*س…ìjÙÔ݂Պ!M8ÛlÀóâ…'¹¸›íE¦dñ|Ó {eÑ•Òæ=l×Y$®VŽžÀ%…\³Åç¾ú˜Ynd8ùè '‚‘åÆ}ß –±)IXȵªÏWÓÞûnî!eÎûÒ£»H03:mÎô^ïÆÂŒ°Ú8”J¸'÷¯{Þó¾%­ƒû[®•x;Æ 'Ëü¼|!CÅx»‚#ßßì}’˜ŒÌ™2ºHÀ“žHQz{ëöÈæÃ¨µ}W e¸í•º6åvŽzyÈ™³s ÏÙ5bÞK õ9n{J­ïYHIEp©cCÞ=@Ó‡JǺiÊž·µ7kÉt ˆldÔ9÷Ô™€wÕ$±O4c ÐÁŠc±ÜcMZoÓ4õðÝI]ƒ5ûŽý]‰t{0—$^®ƒG ÇÖ@l'»reø_ŸKËáÍš¦=ã„ì×4&¼,…ŒkZµä8qŽE$1ÐéˆeÀ!³ãõÜü¸œmNŠiB°>$A'Æò‘ ûNBå÷„,&;Ka•,&É탭ð¾ÍÔžt¹Ëp}5óÚ¸LzÕ¡%›ÊÚ ,YÎ(?‘á ÚG險qG*ãy4 6©Bš_ž­»í#j–ŽŽ¶ƒ•1!1–wëµVê­»n^2îšÒ¹U7#©ªP8•¡(%á«Ý=nÎû3ìM)ÐÞ_s–$é¬Û¯GqžWdpV’hN„›ç.„$Vãq»ˆsEä?iÌ>⌬ˆÞƒ£±“èG‘žbš±o²y´‘E[Ãz'©VeÔ~8'Ãn¿EQ X@’LêÒUtüsM6¬a<_&#Œ£ónu´Š)!¹µÎI¡ä~J>E}½aNä0Ž®³_úœòFBºÃG&w»/È¿Ù4ê|d”ãvé&›ÇnöIr;6쪿ûS†ßƒ9ê.ö’Œ”# :¹@¨8:-|ìšÿ†³}qíJÇÓÖ8›ïÒqö¼©1œ¯Q Žä4ñ@,©;Oû*‰Ο  <Ü]_|Âm̆€·„Ï–s Ö]~·?«ìø^½†÷!Abt øH˜ø\ 2q×Uo/ayçsI« *!““ÄHä„xn£6Ñ¿©ZK,ÉêYi]#«;«ó±GÔÚ€›ˆÄGYc[B4IšCLˆŒC èRr4 Öo-JF¼„U }ÜvŽBé4"MP¥H¸”0‘FÆæëChˆŒÅ“ÌÆî{<|eŸ&YÃû"C mwÖ†ÆSF#„®„9R.§± ˜Fă´¢†™±$DA2\«,÷˜3²DÆôM`ñ÷b óÚaP®c~+{Ö‹ØÄTôxaÛiInYq6 §1ôÒ¿Š÷5dhX¤·/åWbDZð…}<ϧ®ŽÝzš!Èáa™ßp‡)…KÂûæÆ :CÇqÈJ¤&¯ü–öM‚{CÎ.G`:8nâM¶ÇÇn^ å=ùé®Ö‡#:ú ¨ÊœgÝ×Ë›(êüÖZ=ÿ¹gD%õjî;·ÎÀ¯sÁÖ uFØÍøÔ„«­-ê* ò£&I Ù›O°DÒÚ3>¸Ž2h—wwHŽM úÁ£ÆtÃý(«\›“£µ©Žg’õ#ÀõŒ¶¶dJÓ,aÅôÀ~¬ÒP]5{¨›ø®Ï’n½BÌxÔ¥ŽûvIú·‘Œ5ÇYñGR'ñ)lÒ‹Æ…ßJñJ7'$æve–ƒq²$œsi’™˜å¼Xt©?èÜŽYN’à›%³µÐÕbÎRÈá²^-ï…ÍyW³(>æ—Ü¡ çíœÍ$ÙÏ6•6i¸8Ï•ï$˜I<ø$˜I‡ì 9œIù¬PNCcŸ7¸XìàK´¸èòfP\Úùºšõÿ¦V÷-ˆGVëX#s®2îY {ÝN ”ŠWþœl’GâÞ| †¢K¬r“8‰7D×úѱVwÊÊŽjþªÕÓ‰»¦¿‡o@Fëƒýñõ_Q†¬/ ùÉË’Þªál]sPÓ4Öò™GefàÐÔK.…={1¦2ëfnl+`Ïu_õëz¹_)™¹i*=®æt]eæEp9z­ŸÖaÙôºÒuóƒ÷lmfËëOáw­¾2ÃgTÇrêZ‰Bó°:šWÇ®gîvl'ˆàºãïºSçñö÷žÏJÀV+­ñ\[EøÓÚÃMCðú´é¹ìúód ¶fãÅku`kMM¤Ó¯Ý#Ô<¸çiELI,?ÁAkʉºrˆ"$vjS©c’š#ºXQC1TW¡ëO)-èáÓÃÿ³ÚM^ endstream endobj 6027 0 obj 5099 endobj 6031 0 obj [407 /XYZ 40.7999999 366.739999 0] endobj 6032 0 obj [407 /XYZ 40.7999999 366.739999 0] endobj 6030 0 obj << /Type /Page /Parent 2 0 R /Contents 6033 0 R /Resources 6035 0 R /Annots 6036 0 R /MediaBox [0 0 595 842] >> endobj 6035 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6036 0 obj [ ] endobj 6033 0 obj << /Length 6034 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹‹6 ॠ‡ÆÈ!È!ðd âAœ9äïGU’ªÛ|õqyz¤¤ê²w¹Y¢ÈÇ·o|óÇÿ~üçoÇ7ïüÏñËôóý‡êT5ÕøçxþûÃË_èîdôø±íê“îÏŽ_¾¾¿>> ÿ~;¨æòàôcœ_1NøÛ—_oÆ—ÆßüøþÏçÿõñOÃÿ~9þõoߦùÎ_øzèúæüáß㥕î†ÿ¼ütü×á/¿;þ:,¡»Ì{þ÷Û›¦ê›Eëøv}T]þ¾|½¬:6ª­”>*¥‡uÖ8þûÃÏÃl×eœ:k”ium‡Ï}cÛªî:=|nÍô'êM­¾¼ª3ǾmŽº¡/"û›J-ÈØNf¢óŠÔ²­©Ê¶þ©DÃ{Ùºio~žjñDm/4ÑyEjÙÖæãÀSz«T{>†h𻬮«:5RÂÀ–mô:ÕRˆu¦’¡„ËŠÔ²­M ÷L%I Þv9Žvñæç©OÔ*¡‰Î+R˶6™ê“ˆ ÓÏ‚ì›çÁwŸo>ög¡ýùçaÉ?þøüõ`‡ÿœY§F:þ¾ª¬ýÃñó/‡zÐ:¥ë‹ª0Ž˜÷—¥Nµmº¶~©šËH÷ü‹q{²fø^õb’J_FÚSÕC×ûŸ_lñûT‹žUdipÕÚ9Y€ê$f'iNZuÎ35ÙNëþÏ£n¢!P©ñÙS×WÍ÷_íG4©gX<¼…Ó¿ƒ¨E@!màDGU¹˜§÷àÑÝÓ‰ßÁÜT¦_ßûôy`=y‰1ÃI0Ô5AZ|¨.Àl lÚý…%lj¯n ³N[dzübjè”3KÙøSË #̧=SþÈàyø±5.O%L®•î‹<jØEC`©Qf(==ôÑÝÃôàô"õfÄ!œ!H²ž}&hd! Ú]v1ÓU®ÂºH‚’Í‹È,ŽT¹O·D¼E(O˜âÉš\P½sÅi‚ˆšŒ¥êÔ´ê;–ŸoM˜„£âzN¸ÉMò³‰j­Å‹ j"2¤GÒàgô“€lM`””ô–0YŒð¡ƒÌˆ‘ª·J®v0a%RV÷ Û:ÚP¢ÐIȈÝ"¢¦`$‚£æJÝÉê e;xúÎeÔã:úSM5™ÜG·žéàH G4¢Å@åVS»\"ƒ±Ÿ÷Lmßœ©çäàùTxän0¤îuCd»éÓ×D!0è<‚k ®oz nÐq‡ÝØ¡ó/à iLPDPjHÀÁ ûEãÖ%Ô°;ÞÃ1°¦Äñì$„z Ÿœœ™‡QoPjvÚkå’…rÉÀQkr‚âW´"n½ç Ž|`ÀàcúÚL¥q:{Sá‹!b°¶ÂØwÏcŸ†÷Œ`È×ðxöø‹±Ï<áÚ.¡n¸oñ…oc$­€5¦îÕñÿÁÇ`yk–`ùêgmÅI¸õ Á>?¼¸S ¥uaqcŸ+Ø´öQË{Ä—¾…$ÈËŽl€7¬}5‰$e)‚±Z©0ÆŠê ŒÝ-ÆâgJb¬¹BqûqÒ4\†ú‚†#xÕ­S~†±‚-ã?Ç^T:%íEmûø¿ë˜òŠÒ„5ò çMÓsp¶2ôÜtó[9–1ÔÍ<þ+ i³ÆÚa!½¯ÀöO«k—œÖú:éëñc@ì{ø1BXnª9â„y¤+°lyÈäW$“-¤ Ï3ø| Êd£ç¨ÛÄåóç&˜vVëódꪑºÔ¼u¸dͲ…Ç»ÌXô˜“à@¦ÏÅ¢‰1\PL&·`5%I5>µ‰f¡$Žl9Blî™tÎP°õ pÎPé:ªøâV‘Yö„@Û¸lòÈêÓHÔ*ãµ#€³®V›–€´*Å#ö*àŒÉ/3o!ÙàÒþørWV…}B¡ïë*öºÕbcýS‚uŒìeRR©­šsN2©ÔyR¸±(Õ!ýÊ# ãå?K@/é|²¤ŸV¹S*‹>¾x"=K‚$¯±­{—NwÑÍÙ ¬nxì¯ÊÊtÀ™î:J™S°u6ˆ!’|ž¶Ä$”éÏ‚7§§–hå‘ÞŽ£ˆSÓ6sèêÞœàwÿöJZP §†c¸ÁµqažP#¡}Éé¶kÂûÞåc|ñÐ3>aŠ–M]x”®—®sxÚ»N-I ¯BÉ‚G8TÂÂQ† õ̆S`àÚ6“SD²ÔUÜ÷>Gå„l¤}×i>IüûÅík+lM`ùZ†;Ômø´v9²e0¶¦ÙlƒË µì{dlÁƒuÙM{·ylûÌ6Xÿ_Weë6a·™@ÖúXYØKúÈxdÔQví=*ÂU[u¯¹U,¦Î…q™ë,Ô¬ý·_À̽f=âö¸½ûŒÛ³"à¯*FÐÖ÷š‹ä‘›­‚ãùÕ¿“ðªE5„GqçD!Z؆Ïj0¯6±Ò@Ÿ§îÚ­5¡Ï«kZü=¸ž†ˆ¤#Xü¬)|Â7±’…æF¤¿T|§$N©„{ïm CWÊA0Oórlõíòr@ ]ÐóŽ<ÍÔ9É ³¹±êÉwÕœÌ娣žÁ;õ¼§‚kƒ«ö@t|jO½vø†c§¬gj¸Ó™%j7‹Á³ê>»¶5*[½™oŽ7=T$r±O4AAËÃí±ä Ësü¬¨Û–“Ï…ßaÒb=…ã¨Æx‘x"™± ÝÇgM´†’“3eÀ3Œ',ѽE”âÕwIr$‹0ò[ÕÚeôÔ­J¶¶–Ç7 )`Ø&¸„‚~žL™sH†$8’}&ÜŒìÑÝ Çl$ÇIÉœ¿k&¾½œÙ{…tžìAHlTV¢$‚œôµq¥U7Ý®`K'áz$xîî‚ Ì×¾ÛqAÉŠÖ¸Ê M¹ŠÏBôHW2ë* a%sõ ^BÂSãò8/f©\5—¾oÊ~-‚$“Q“™°—x+^«Ê).XXÎyvA„9ØxÁ—pä)Y´ÄLÇ»%É «ák|õwJ@'fOñŠzžÿyä-\ã;ˆ–ÙÅLk]1³A„ó:ÝX¶'À³{þVW=='dº¤ ÞßúJ¤dÊͲšÁí8)yÚF,þåŒåöÚ4'A¯‚P‰ÐÖ&jDHpA=^Ö6lOPÕs„nVÅ« ÍbRºS…Ã`y6ÁhPD‰TBlyìOÑ@‹HêZ™5rJÿ9ù$¢AßíÕaoMÍÉ(ê^»H$LØMaXÁÞ‡DUÔ"^ÃIÖãx—÷ä³c‰Š’% @d=‚"d·ëh’\Ò»ßbêªêš›G¿xu4Ÿ;o£LN—&Ϻ *)îHiùÀÉo.œƒÝå«{è2£«ícØ+µp7‘Ânúe•vT¿ ›Ù+êÁ¶íÑà‰®a‰Ñ‹8Bʰ4EbvA–†Ã-~0ºq*Y³ÈŽíHÍÕy*ýÑðrõóHzN'æ'êÞSî‚’Š.ñ.šb‹auhÅB‘^¹H©/Ãôö€Ç( £$ÏñæãhÕörõC“°oõœý aDî î^ì™#N<‰*ÅLN¼]ûU ‰cùrŠ×*9“¹hƒ&“4…³^ë¤î“‚’œ:-‘Ü·­{rU\/7¿mHR8¥$‚&MXãŽèµÀà8ƒ=ÏÄë¹4]·˜½™/£ô8™Dƒp^_ *Û§¡Äµ RsëTƒ¯ì½®_ÈÊi€Ë¹7ôõ\ŽÛöâk®ÅÚÇDœãõ’iÏð ãFÆø2^Æeá¶JÇ$|ɺçc±ÔÊÈ_/Ö5bì3â­}ÿ0¥HçàÁ8["úÙc‚vóq) Ï1‡á\ˆ=Ùè+s­»­ÑwÒ¥ëøRoƒÛžã3+À§åy&$CnˆÝÕqö¶ ž} ÁßV…|Ó!o0D0g~ŸEæ†õ¬ÓqöÃÁ¨‰²ø†Û†1Ö£½ÚÂÔ×f!']Ÿ£xø Äx…aࡌ!˜æðu! ½„õ 7 kx>C8ûÁ§=%Ö¤qX¸j–XJ£ÄïÙ†&ÒÕß¿5«Vpc™k¤Õ2¯6x󉬧ž ^’NïY¥Q9’‡%’: ¿J/ÆÀJ7ï‚übICNÐ*¢äZ´Z©Hpüµ•œô Š„ ñ”ûÌB*û9Vá¾ä÷"­š0‡Ž¿'œß¢qKqµÂŽY»3‹o$©Pù¡D±6¥pNâHŒ.O2ÍöËH÷4‘ü¹–R\¦ˆ#ghe]³eu{AýaDÙƒD'4VïˆXRÀÐ|nŠx÷•ƒK2y%.Oa!Ñ‚”i^H.ÅŸ05GÈ}ä×¾­ŒñI:MQ> ñss¦z6˸òÚÅ«q%ÙË2v­Î¾^Ñ´!TÂû“R+•à$”¨Š©[¹ã_1Û%}çì¯Úºëy+.êXRzÑ:+Ê"¾ºø0f$2,†º->!öŒɼfO6tg¯vôs'Ô»WVˆD‘œ+×D¬þQ³1óŒ=¢…Wœ¨ö)BÙ« ÍòôVéSÂbíñEÕ²ÝîEUN̼Î)…ªÇâß›aÜnuê6‹ëºw˜¹ [âè ­µ9ýKjá¡k©Ø¯O?é-’`p…S|"T—ÍÅ.ö->3Wø?²ÐvrÆò»6ÞzàØ?äܱð.+E Øó½ «LYrSR%õ"D»rSÚr¬áot¼8"<˜`¶r£ ®í°YßÛ#cÜåE{À–äŒÄwµÃ*S¼×P$0ÇÑ%j;R¶ã.:¢¥òæÂì  2‰«Ó¼Ç¯¶ÝÖ½ÔÜ—Ü„ãZ‰Q2ÛÄú^BX#!ã¢ü­p]媿‹NN4”q¿?cíÞJ—Š5\³×–‹ž¤üxé¿ë<µßÍœJ¹•A2«©tn5Yk„Ç-áæF‚ÚÄFìD+Ó^öá·ñÖ/iø¹¢9h›Úëë÷OR»÷°ÝõÀ`OO‡ÜkOÃÙVïCYÁn,ë÷Ñ ö9*ƒ}Ÿ+ÖïåéNZ¾µš{zzˆá~¢¸[%„/î@äéUáëy÷ŸÅÔ¹00¸ïîÎ Ÿ1úE—ŸáïñÛ€៿0ýøòÕƒ)ŪgûäE2ï£Aì욣¶qË5Ú«fô)M5·Ažì£¦95·UÔÞžˆÞ0›nOííÜåöÆÈxÆœt³+C]ŸšQ¼ºŒüÖ{:øLŸ]­>éÊœ‡\æk¶‘à^þæüî¤xÝØáGôÌd¼ßQh“2’öÌtb){ŸÖv!€Xwþ¬kÕ~OŠ·Þ÷6&ÅÿÀ³U0¬=Ø1ŸÏ|ùÜjçŸFcp¶IÞzÎf*B}¶øì>@΃ßlWÄôÐòa̦!¨æÔŠíºª9©s4Ú!]̨!ND=IQA zütø?Ú endstream endobj 6034 0 obj 5020 endobj 6038 0 obj [408 /XYZ 32.1599999 240.980000 0] endobj 6039 0 obj [408 /XYZ 40.7999999 363.859999 0] endobj 6040 0 obj [408 /XYZ 40.7999999 363.859999 0] endobj 6041 0 obj [408 /XYZ 32.1599999 240.980000 0] endobj 6042 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 195.859999 98.4000000 203.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_modula3_overview >> endobj 6043 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 187.219999 136.799999 194.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_motivation >> endobj 6044 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 178.579999 104.159999 186.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_conception >> endobj 6045 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 169.939999 175.199999 177.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_cinterface >> endobj 6046 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 161.300000 183.839999 168.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_cppinterface >> endobj 6047 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 152.660000 108.960000 160.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_preliminaries >> endobj 6048 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 144.019999 134.879999 151.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_compilers >> endobj 6049 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 135.379999 207.839999 143.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_commandline >> endobj 6050 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 126.739999 130.079999 134.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_typemaps >> endobj 6051 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 118.099999 159.839999 125.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_inoutparam >> endobj 6052 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 109.459999 198.239999 117.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_ordinals >> endobj 6053 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 100.819999 126.239999 108.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_class >> endobj 6054 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 92.1800000 127.199999 99.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_imports >> endobj 6055 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 83.5400000 136.799999 91.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_exceptions >> endobj 6056 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 74.8999999 130.079999 82.5799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_typemap_example >> endobj 6057 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 66.2599999 152.159999 73.9399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_hints >> endobj 6037 0 obj << /Type /Page /Parent 2 0 R /Contents 6058 0 R /Resources 6060 0 R /Annots 6061 0 R /MediaBox [0 0 595 842] >> endobj 6060 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6061 0 obj [ 6042 0 R 6043 0 R 6044 0 R 6045 0 R 6046 0 R 6047 0 R 6048 0 R 6049 0 R 6050 0 R 6051 0 R 6052 0 R 6053 0 R 6054 0 R 6055 0 R 6056 0 R 6057 0 R ] endobj 6058 0 obj << /Length 6059 0 R /Filter /FlateDecode >> stream xœí=ËŽä8r÷üŠ¢]e=Ûz·tÙl^üØÕÖŽ·y:ºÏˆo[ÚxpW7Íx‹ìÆ*ð÷”l·òFµ£´C¶¨]e˜Ò«áu†éŽ¦ØŽñößÂ0_×É7rOâ.¦Ä]\Õ5$ðé|ß##º©‡{”ŽíA.tTzØsİ ã<Äu:+ѲÕoÜzÁxËQ3l}ÐÑN[ßÍÃ\§³2Ýú P¿t€;ì»ë#Ûmw㌸ç85ÄÄ¿ßüþ¯ ûÑÄSˆÚÇï—Ÿ¿p%m§ð|ÿkËÊîZSÿã{+1éëO& Äõû_®ÿĘàÿ|ýþ·‹»i'îÕ¬þ WÐö ôDð›à8 ø Ü8RoŸs~#á|ÁÏZJ°7ð‰ìOîó÷—ŠCR++o€¤Ý÷—ð›à7ð“O„€+üÜë¼€8#ÁDNÜ®‡[<„T…r»/ðLHûà]„á>ÊÅPN?Ç:§åÜ8a(O ÆÇ¼gyž‰ŸÀg¡/0]†¿!Ì€ö@€8yóW Î|¢À'†_êÁûÿ ðŸV„‡ÁO´‚Ã<GÔÂÀ>¿#|†¿æVŸ¥ÙÂÏŽŒ/ø?4ü+ø´kò3ݬKßYí µèÿôßsB,¨ÿ*˜¢Ô„Øöç*ÄRä¬Äžb)3¨)c8µ ±0·ŽH»ËØ/ˆÍ ±¶te£±WÅîàj”õÊ´b‚ÐÓÉô€l}H07œP/=+_ð7{1D埮º©¾Óɾxà.yFð‚¹rxYàÔ"Oz¤Ð7),Ÿí'ÓàB?û eþBáñÒžÀÀK››àv­ø¸6À ó¿……÷² ã Hã5Þxî/[¥à‚ 4^rោ˜éÏqwZ1Ðû¤aÀSÊC€õ!jè¬$-çÒ#æ² CHÙ=…;w;$ NDfŸNä†'ÎoZ5ÝË0á€éýÀ̈H"È>!@3^88•…¿¡*˜]+§„@Ó°!ÇÔ"ì ¥ÙIäüü”+>òbÛ GøLí-‰ÀC Òû =z2XÆœˆèCÁ .‚"ÏÛjÜ8rþNÁjÓj¸Áð‚ðv’Î.#냨).Û zzÓ€K È6Ì~2‘Ž”‹léÞ¤îþ&@‰ 2CAáÆù0R•ÐÀ€ ΰ°£nÁxôR¥ uÖÖX•o² BÜh¥?ÕIŸˆ…ïo•ÁX+‚­§Ì„`Ù aŒRéšõ©Áð(/;XV– r õ*Œƒ%Sá÷œ-lš°É3"É»Á6 sfSôºí£ÀëÜ@ ‡”G J·„¬ÿÌt £CÀ» `C`EÍ¡»`¦ïázpƒ6]’cá± Ê~„G… 9J¶&.Vqø°ZŽ[õÆœ0#N"§tŸ„t»;°H8tŒq……ƒ* Á›5ƒ½¬ëë>åØy †¤>Ã' ;I½‚ŠàV¢Pß@J ?‰@U^!ðœHopÀ4!øóBoŠïøêþžóIDz%+ ·‡ƒ… .ëX®…gL§ÿî´”$™>S˜óø;i¯M=àøq°öI}pÀ4ANS Þ¥á0œJ!eð !­ÀKJ"JI¹~B°À²P„âÃ<”²oP‚s­®ûœON*ÁÁå%Á½$¸24àéVº;Ö¾ .r{@°ÛÁ\-Kó¤1ÂiGìvp‚/ ­É›oy0oÚX|Éç¾g¬ÃÁ³¾‹§|’—Bæåm‘'’—poš"GXŠ=²m@R$ v"4­¦^l›ÕuŸóI^½¸VòVøæž5|‹ KØðS”3ógÜJ_6ˆÜ6z×Ò”ãÆ9¶ µû0òÈE_%¥)'Ø;kÉvÕl±ð¾QèÓ»ÑdIðZœ"iþA>¯”dë @oäÞ4+켬xŽPë»xÊ'ç´{G owŸʬ_ž G°NœšæÚѳú'8¦äú ŸòÉ9ýò¦²}Y ˆVƒ—çBOšWÄÑ‘$8XN£Ð—O ^> ïPR¬Coí[÷ÉŒµye;žQ 6}}`Ü|ÉõäÎýOûE‰{JÌÙqhç¡)qÞ{¬ZÞ•Y þF( |‹D(SLòü$Ì-¯…Öò£Ûp'U‡ ñWôÐ6ºñò’:OÇ­ô%wVó’:¯í’Ë7uuN£ÛÔëÀ‹6‡€ìxòY'øh"Hš½ÙÎN¯§Û¶ZS6‘œQ¨Á¯8§zÁn)O!¼NBI8DFY8ûùjxé ¢ˆD–ìÜpí¼õàÞ|`Û« ÍzŠxLJÙôü»ƒ€«‘±SšVJÊø"G®ÊϬòH‰y˧|Î#ԤŠà (U5«W¥)’‘u&Ãûq“WáÔZœa½hÑNù…›ðâLYÜ¡â:%ËØI㫽”Íõ¸ê2èDÊäŽÀ-bÛÞ…nγ ô9ÇI“j²M°p÷@©… Zû# Ø ÊÖ¡,CuèJ"EɪsVú “ƒÝRJìÆš¼œ§R0Á’ÀÙj™W²jéEk1ò™oE9 =.´&®è*üfŒ¬b’Rê•®\ˆÀˆ¶J­ƒOÂbVªƒ½XPj †ËCµ'ˆKë%ws–ôIªöü-…”Æl¥ú†%C¢zïz)·à@ÓQ9k… ž|aœP73m1VU(ðÂþ·ð2‰.‘,œe”Ñ,qöŠÙ$ mДªß à:˜T½m‘6ÊjšP„#gÁ}Ï[·uýƪûרx_AvÕ•™³«¬Ö˜²ÊÂzg‘“[{Pë˜Â5×Õ ’t\ºÜ ‘ÍíjMG~Ä»!Î4ÂüÒ ©‡&-„ÈðîM¸jŽ`[µ9j_—7ʧ‡ ÍòDAò1U¡üJpˆRÜ@—Ã9‡™°[c8u&y-;¼¯B»,ß‹UöœC÷¡x¯„3!PÁÂÆ‹ÐÄÛ°\aB¾]¸­à|Œª1ž# ôDqoŽ°Å¿ðõb°Yéò l ¡p>Œ]žÙ’—+½¼VÖŒ 6­‚kU˨±•ΩLNg„E’^#]îÈÂÀÖ ìÉ'á:̲ä¥r>‚ ¼É„ ÅJ!RçÖm*Åé$Ðu„G|FH‹Ç!ªpÚÔ-רÊU«XP–*©9ÃÝ”àî­Ù¤êàUÇH ?$ ' (·„8ö ¹êà×…ñwÚ"}žéì÷ŠS.£#`б?‹äWX¤¸±ä¸ö[W"EÌH=ªð© P»Ñé>OÖ,êÄ©È`Q·Ík|­2lYýÅÊÜ2!÷'ôÎ@6¸’ÌÊÃ}Òñð€ –ù|òÿ„7Ð“È øäøä3øäôD‚s‹ôÎ^©”àUœgí|ÈSÁ\ÃÇ3ç¢BoË U¸T¨.­ X9ÊQ¬~¶(rYŠb.£¸VäÔÌ_7þÕoüw³_dÉbé$HË_ÜÆæ‡ý ×zþM4l{ÂÉòŠ­îžöC¾»¥¼eÉJÂÁUÀ2%C ôhp5ð0ëb7\}¤P¦Ë,VK~$"ž•’¾{G?4©¹GÛªo{–Nj™¬Ðe1cñ°Ÿ Õ{ŠÁÂÂ\¨f•M'B—D& ˆÌ%ªH¾79Ý÷Þ}Á¤#e”ÊlŸ@¹µ|³q>§9^©‹HF¯ôŠgÕ9("'òzêž×±d/ ªn ÚDñj6ôt9FØ¿7“WûjÁãíQÍìx™r0g¼Üâ!»7ú”±P* Ÿ ¢‹?,<‡¢Âl@òÖš… ؈•¥“,â÷ŽlE‘-¶ªÙÇQBrþ„üY"ÔÏèœ\û h·¨n1A”æìýöÔYRó0áu¬®e‘®ä‚„ðP? YMNJ:ã1'J®é2§¼^ÿn7›Zõ¥tcÇÉ€·˜Õ#êNg~Kz›¼ƒ”uf¹ÕÊ‘m AhT˜-:8bÜ,¡§•5¥ãh­…„]|Î÷Èî¥cÁqÜÛʳrÕŸgÉö±ÅŸ6«µ c`Ù’Û£ˆtƒPU7YO¿Apï¼W\%*pìo3 †ÉQ¬cÚ¥œ§ämV²@ÐÖ(Õ³¤çÚÑØèD 8”µèÕÙ±<@„HÖÖükšj:`ÃÄ8©Ãè€$Ÿ«tî¥snÑ9 'Ÿ/øj÷º$ïUˆ,cþà ‚ûÆó<~CÇ„pýŠç ±n 'Ô¾Ží¼p˜|×¹îFÉÖºS ö‘’Ÿr¯°wµóÆÂ«€Mp÷”§øðáópü¡W‡Ax\aXìí»^e«R"¨,÷n•eÊõ¥ªØÚ‹VöyGä”aÄ®”ýª’]àLL’”O°‚WPHE‚¸™%7:â~÷•Ó!¡û¬SZM…“¥|‹¯D÷ wCªúæêƒæ³…[8ys3΃Þ~;Ú±=âØ±-»Õú›*Ô9 8P„ÉœÆÊiáøgpr~·C<Én‚ysû wû 8•Ò„¡¡á‚éjèÅ0Ò;PÀ§þ>€ {‚‹‘×öÔÛ©uí®¿?þæ7kÙÕÜÎmß*¯†•ïÆ–—ÆÝ8wÂZ>¶5vÚËøW?Fû~ÿ·ºvõ¾VÖ£mùqñfÒ½%§½Ì×ñãòëåãŸf{ƒ=ái(ÄBCì`ô£ 4˜ž*O¥LÄÕ|öaNY8*íêî‹kPáÊL~»|‹ƒWúþ~c î&\ÉáŒï­†·-b€„±åGûàåù›wæÃt_ æ)^MãÓ¶tÍ&sKÏ»Ñóa~m×_à¸îóÔ˜üˆ……ĈàGPˆ#ˆ¡Ç”ÀÙíÄ}#Ô\B˜iÃoÞéàI¤mæ$Òš%Ùª ùj[Ù¶ Dpèeü«™“H«—Hd‹ˆþ*$‘Ý[rÚË|;“HÇ=¹PgÝ„HP¯òØMÈp:Q'F¨í´!•ˆZ¦æDÔ2½@DÛ_<êÖµøD´‹Í»aÓaDÔ2¹@Dm«$ûÈ€ˆöoéy7z>ÌžDÔ²GB}øR°¬J±ÒS¬YLI[, éÕ®HvéÀ߇R`{]ÝØd~eù(xK6kH&Bx„@È%B ´¡mK@îo±y7l:Ì“¾D †a!!¸¿¥çÝèù0»a^„ !c¶çVr+·ð“ñˆ‡5))Ô´a³°kÕÜ`Õ’=À*ßеøÂn×ÖØi/ã_s{€•Kö+}{@×â »÷·ä´—ù:öv­zØ8dö¡Ø)`Oº‡A8x샽TmÕÃ4ѸiC23ÕžiÂê%Ó„m|ÓD×0ÓæašxvæÃ<™©^2MXí›&º–€™ê‡iâÙž³+3mä*Ø’YŽMºÁO'87OK„œ6$£i<`4f ó¡Ä¸ïo±y7l:Ì^F£‚aTŒ÷·ô¼=fW`´£ÙA:Ð2»ÇA¹±Þ!6K6¾<Ø—¥L}zEÌÝ âj¶Ê—4žNé´ÄŽJž4jÚ°]Ðsj.è9½$è9ã a΄‚^Û6ˆrC/ã_j.è9¹$è9Œ!BA¯{KN{™¯cgAÏ= í¦›áCt@¤ìƒòýj3âS'g*)ÛhÐ=N"tlÔcÓ†T&ì¸g^q|ɼâ¸o^éZ|&Ü¿ÅæÝ°é0&ìø’yÅqß¼ÒµøL¸KÏ»ÑóaödÂŽÌ+aúWD—A”SêÒdXo2{q|T{DÏ^Ɔd,‘ÌÃÉ—°DJ|¥ ±äþ›wæÃ<±D¸%,ÖFØKîoéy7z>Ì®X"G£Lä1jm ÒØàq+Í`ð > endobj 6072 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 129.119999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_pragmas >> endobj 6073 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 760.340000 95.5199999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_remarks >> endobj 6074 0 obj << /Type /Annot /Subtype /Link /Rect [314.399999 734.419999 332.639999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6075 0 obj << /Type /Annot /Subtype /Link /Rect [398.879999 734.419999 427.680000 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6076 0 obj << /Type /Annot /Subtype /Link /Rect [180 734.419999 209.759999 742.099999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://modula3.org/) >> >> endobj 6077 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 640.340000 87.8400000 648.019999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/plplot/) >> >> endobj 6078 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 631.700000 86.8799999 639.379999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.elegosoft.com/cgi-bin/cvsweb.cgi/cm3/m3-libs/fftw/) >> >> endobj 6062 0 obj << /Type /Page /Parent 2 0 R /Contents 6079 0 R /Resources 6081 0 R /Annots 6082 0 R /MediaBox [0 0 595 842] >> endobj 6081 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 6082 0 obj [ 6071 0 R 6072 0 R 6073 0 R 6074 0 R 6075 0 R 6076 0 R 6077 0 R 6078 0 R ] endobj 6079 0 obj << /Length 6080 0 R /Filter /FlateDecode >> stream xœí][¯å*r~ß¿b=tÖ1`|‘¢H}”‡HG§¥<Œòõäd4Ú{”Î<äïÇ6`0¬²¡(|Y½ÏHÓìe((>ªŠªâ×ùý?oÿýÛ¯Ÿ~ÿŸÛwýï§ß_ª{ÕTê¿Ûø¿_Üxw\ÛNÞy?þwûþöòãöã巗߆ÿÿñšéCýÏðÐ4¡*üÇ÷¿¿üªQ¿üþé߆ÒÿÝøí_‡¿þvûó ÿüE×7¾ðöÒõÍXxUÆï†?ÜÒøð¯/ÿþ§Û߇.tS½ãÿÿRɳúñcþ”Mÿs?…«nÍ0Ru}cŒý”Ãpüï½ü1R•ÕAîvßê[ØÉðs¨ÁîÖ°¾ål¨‘›î¥×«T”OgeéäšNÓ¿¹íòaò?døxņ™%¾ ¢bÃ7¶ÔÞÜvÛÆ€ûMB‘±ëUwÅ0t½ióqÖÛÉ9oøÏ ú‹~ ï]£ÿËÑ<Å+9€wU?aÊfÚžƒÍÈŠ o·] –Ýf†­ùÖ²¶ÆW‡ç¯/m×u¶Ü7ê•Wûö¸oþá4ÊZ.ë~h,/ínë¹n´6=ÓТ<¾òjßöÍ¢T7äT>ié´Ãø¦Ê¥º-wسÆw!Ú±ú7Sì¦Ú‡…3—¹~åÕ¾9¾¶¢éL£B“Äýr3v`~›–RÕSùT$¥Óã›.C”š ¶ÃžÇLueh5e5•3Å-·íš÷sé­;3±ªNCãØÖ¢Ü¨>˜÷©é5mÙúU™š^3žoº ÑkÚµãŸÍÊBâX¬§ÚÙÔ’)w•zåÕ¾M°h¥]´r"O5´(ÛÅ$i­C©´‹Öi‡”N;Œoº QªÚr‡=‡T6¡»¢U•kL™×¶]ó~&½}U›‰UuJ˜åiÄíûÔôê±uêWeZzíxP†èUm¹ãŸÍÊÒ²rã,ÚÆY´Ò2³¤Y´­]´­Ã¾‹²]L-Í¢u(mí¢uÚ!¥Ó£Y´¥ÒY´ Ñ¢•7΢mœE+&& wZ­³h[‡qeg!åOmHoë,Z·-ZzíxšE Ñ+E›?¿Š-+w΢íœEÛZfnimomï°ï¢lSO³hJ{»hvHé´Ãh-Dië,ÚŽhѶw΢íœEÛ:LL@ï´0zgÑöã.ÊÎBÊŸÚÞÞY´n[´ôÚñ4‹¢·umþü*þY¹«ì¢Ë‡YfîIíгh;fÙwYž“.RRÊæEë´CK§F½h!Ju[î°ç3qo™X×91Í\æµm×¼O°hõĪv™eÜeÙ.$‚© éevѺmÓkÇS/Zˆ^Ý–;þ¹6·Nmðº8RØ5‚Ûr­_yµoç[Y%fó"«”œ?5åý!fËŸ)’kÚr«Ÿì¤äÚÑ|Se˜^Ýš;þ¹@Õ5¼6@5V;ð,Ÿj×å©U^k¨ÒÅlHîEcíëznhQ3jª"%¥ª!§ò©HJ§Æ7]†(Um¹ÃžQ\6†V]žêäUÝÙ²yçÕy?—Þ¦6«êT4ª¶åiÄíûÔôš±µõ«2-½v<ßt¢Wµå޽¼j¹¡W—§:'<˜ËÌi·å4ôv•™_U§¢Qµµ(Ocnß§¦×Œ­­_•iéµãù¦Ë½ª-wü³¡jtx1P¥„ … ºZ)zu™Í'~sÙ¼óê¼O€Îf†§J •SkþÍŒ smGØiA4-ÙvX5HÃTëÖ܉ȇ-E³.³ùèo.3§Ý–ÓPÜUóDO•*§Öü?šJ)&: ÚŽ°Ó‚BkZ²í°j´†©Ö­¹ñ×)¬Ž7Ž, >gµœÉ¥z6É æ‡ú>nN¬ã¿­ §œ¸®æã«£Ãþåûð»3Öó®³oUËj*·™ñ ý?¼ù° 6}´ìÌø–\V#—ÍüÕ‹ý\ÆÖ«_ܰ|nGæÇʇ¿½üúµS|ûcx4å1Pÿ|Fp ÿ—©ÝíÛ_nÿTUuûÏ·o{éî]_5\N™Ô“ŠOOÚ{Õ‹VVÎ>©êéI}¯Õç›Jµc_ý2ý ï‚w,²áª›ž|ù6°” G¬3Ð9‘ÙkÖá¬rãn£x¯eïµüïµµÏÃ/ïMoUËj*·Ë{mõˆ÷šÞofø%à½Æ2Û\\6s(ï x¡¦“3÷@æ€yÕ‡1U=ã†c8•ÃÚvæ0æþÙý êVLu†wõß}5±Ì0‡j®KôüÖVš#*óË÷—¦×|ÃÌoMçÖ¢ÿÒm ïë¿»‰_¼¯»Öocøåû‹×“ñ-áÖ²¤cdºÚë†Ílbº¾Ö3,4WT÷¦eÝ0û1€‡á$…ùg c™n f¢EΠÄÜbyns|«øñðj_V› E41ý½märQóÖ§[B»…‘æÎ§)rŸ|Rߨ4A{+ØÑû]7²•Ý ÞÑüN³Æoo ‘ HùJOÀ!ç_(ºÌ ñjÈ™4õÛ'ÀÞTß ÛXÝ,Ön­tØU[YUØÎ‚¯ÒKÀ0!S O Ìl~yV’ÐÞ'‹7{ã±`L±$«Í°Ã$Ë&œ—@AvŸAaãK$0TMD™=[´½ûÃÈÃûìUWÐ ç"èã—S¸äLlÀøÁ¢I€¶ø·²›€â ¿0}+ßPlEü8åðö V8³W$|»5M‡ ˜ì} økS¿x´Á£ ïó±‚ãØç>5BOc–ãèÎj©6}L ge‡=L¸[¸‘ÕB‰®æ@8­@9ø„}Œ+‡ @;h¶Á æwÃXµ"t 8#À«*\‘ñÚXh?ËÙÑ)7¸á¸øÔµÁ”`™Ë±‰ÂûK‚ š`°H0óat·óFöJ·"Â,zŒl»¿$hÉ6ß”מƒ¤nþ@³o"`!§2Ä7ݤÌiY„›TБ=ƒë=ÌIW´Yë¹Û_JPðI0Â9A¤…BÅq YÆw|[Œº‚Âñ? Ê€ÏéŽWWœBãÅ HPøy½i­ø„Â3LaÁ‹À5j÷Ñ2ûKÓûbÕ¥Íì)–0 _„”S* 'h”8»W`#âÅk› |‚¾+RñH™`Š¢Œ‚Áí3¤áa˜ŒKn„¤By(|F5W°,'J ‚!Ž0dí/íîÛ¯G»6&3í[rÇíü&5þ—ñÎ µ²ÐÂßÀÌ é#‚§PoQÏÁƼv8$dDb3 Uå¹ÎoòŒl5÷Nç?#¶µ·J4¯4s¦.ÜJòJwcýC ŠÒª+f&î³&S™ÝÜuõzR™u¥muΊ£ý¦‡¾ ùY{ï¹—®à#T›¶Ò4w1í/!¶È;BÕÆ)ÛYéõ^µè–D?ûa@Mj¶õ¸MoŒ)ugŸ¤ÿ)ÒžB6À·GØN‚ò0JÅsyó%X¢2”!b{¡*‰ :ïÊ‘2‰%:¾”‰ïÆRrW阷­ P¥£ÃÇK‘Y!!úÆ! ^æL”dDä>çOÏ„¿‰`üy’öl[¼‹œb$‚„L¤4é(vˆôcÞòj§¬f#n<"…HH…‘"+'¤V‡§qœsjBš.eEžÃdÊŒŸ?ùóÅ6¦¬ðŒ4TJZüdë¡P]ƒÝ ì×">SVjÖé#|`´Ÿ"n99âCo „ê–r…R+‘Œ_ûû¨_Y|3Ò\aQñD)/P‡—pÜv ›’FCåì7´Fá€-16nÌ!°J&à©jooÂd^#ɦ³wÚ£ç€ìÜ|λ)B[÷NEä:ø\z5u“›£]8bå~V8×ñ¸²™;³SÞß]…§pA>³wÄ>GTßÏ‘rn‘\ úΧF){`¾ ½Cü…û§¿+Š1 aÊx¾¤äúÂD’± =£¡›¹Ç5ÚàÕß%0‹žÈzR?7hÚ@Üɰœ¦8Š|˜p°““7‘Ø>Å5ÃÿˆVë;±ð¯¡¢®!HæÊ’f‡¾ö׿4cŸ mW©iDÊŸÅ"r%¹—¦3 Â›rn#ø £c¶M8Äö”"© _péìþ»ùÅ’ç¸á$„å$|‹¹¶ž"Æsh”š[QëÆßNÎwsIŠ“R‚ôb Øœ—£¤\w:ç‘Í\úBÕñ ûXð-¢öv.q˜„!sÓ……¼tÒñ}n}[YA¤IvQX±kôOIu¹ów‚A*áÄÝwèX9÷À0ë¶MaZÇ@)íe8 2 ŒMƒ8”úÚ0QTÜKÁȲ7'íÁŽ™Ä)ÃAº<íRnèIH+øj¶ Ñ«°õáÊ‚ñØ–½ê*ÿ¡“¬’Ï\úH_·‡Èì +.¥´6cŠ›Í·–þ4b@ÂÑnÂ5Ä ®®§ ‘}.¯Ì%!˜«ÕÊæ4ÂÄe¢ö:†‚»@«ùì.âsM1,{±,k9ææ[LðY‚PÞ³x”↱ž&„áÝ$P–ö:‰lêÖôvÊEœ¯ „¶LJ£\‹ ÇælsL¬ 2SBR„ˆý9ál‘Äùæh¢ÌQ—Fz—9­t|¾Ü_¾Kb|ïƒü }: g<]€RØve%kïÔnå'AÂ8”@“g‰Äý/Ã,‚ ¯OX9…W7æñ¨{q"ŽÒ÷åå’ dïkeâ$®pkn‚¥b¯ØÔ¦‰8B~®ŒT"gÙ»]ž#SlacЦNZsÄ:ÃŒ^‚ËÆÈ¶m:É8ýØýú-ÂìöEÁOxè—2A †S¶h‹Ó$jM9ÙÉ9p¥Ø4 ‘Er–’°à¹$‹2QìW²$Dx7Z ï9>Ižä¢î™µ¿»äõ¢ÐÃS˜•UqÎs¿×Þ‘8'ØA?ì"œ?srïÅo#ÏŸIåhê•ö ,ÀÜ$†ñ'qqΗ‚Kzrêüì,<¹Þ²›oFËf éQ'…óf®ÀÙΩzžë8º°&]ø¢ë÷3ê˜.ý$gÔ)8$¾A9B¬àö"«Öß_Ž‚°|ñŸã|ŽüÚÙ‘ƒÄxî3$yKüá¬U­ü®^Döõ01ètÂÎNnYN£eÍ$éH f+Õ—wãàÂÛD.-U$$¨Ïé|ŠlŸœn»·b¶}ÃúÃÂ:G†oü^ntv‡îÆëG3ÅT.ßv6å0=ê<تì/šÛÏà#m¤p^Q;kÍðÚW?úëÕÅÄ]Ôž…ãÓÌõd±O¾BO8‡jÓÐÞûÎ"ôþ¥O®"zK2I¬4I\eúè„7Þý]É7îVùzR„ÒBQåÏ^Ú7p;=ôͼ„oÒ2^ÝýáÖSÔÜÅ´$«`»{íï=ìø¤…jÓ˜øˆ°¶•ô¥ðè¬Pú1}¬Ír÷Öï5üQ™xJ€O$8sð,€c½ò ؃ÍY(¿ÏuÍSD)Þ`{'ª=Ÿhž“$œêm–·’„øŒ"n,»Ù–HÃÓ|™žÂ¶”ãÀsº –’ /¹ò.κŽ:áx•$jc½¡¸H7"ÙÀyo+ãC›­bóäsT‡~e±èç;œ¼äÑ8W~dQ‡])vp•Þæñ.<ü´ ­RîqÚ’îwÐj; mÊEçóc:ÏÓ ™F0·û ö‚½s{ôHÕ²Ãøç|ÛþAr"ƒŽÍV¤…íH8±(œRp›sòa„õÃYN˜H‚Æá‘¥Ú_™ÈÙ‘vÄY/HÞb¶—M±‘Û>ß ‡8Z]AVÚŽX?æJ¯’<›ÎÛ"ÍN?ðp¬\Ý’™ç·ÖÎTKã©’€®›Y">ûœcþ{?Áó\yÍ´¯æÀ£Ã²‚&Ä'¤ŒÇ,ä[ï Ϋ¥7eO–¤éÙòìu#É9UޝAüùo„­¼‚”&êëð ª1™µ·•â¢&;ÔIVpáÉ9 ~.ñSŸ"ò%ÄÑäËw“¦â¾P$ùCΖA.9&ã „»öÙÉÌùO’›‚T} ÉSË·¸%‚$Ì,œsús3æÄ?Á }´ˆ䶃vÉ+‚û®×Š&í6el7}ÞMÇHØ´5 ³Þ0é~†<ö|é­ÿI³Ž;ÙŒ áE "Å&TÖNqœ¨7*zßx{Ç£©ëÃý£¥'À'â3n+O]Ä«ü£?ìA§{g>C]3"_Ê“ÊïÉ } \GAïá­À…«ÿ v)¸,av0í}Ù€Ÿ¼!*µ`Þà® ³²2üѪàë”›â2¦6‡wµagxÀØ"*‡Õ‚Á¾óB¨Vû»,]žhr=é¡'²ƒžÔˆÚ4«>êu¶RZƒ}ƒ)…GG³VAnæ¢'`gZ‰:E$Éȸ­’aW0é*Ïs{¾î²Câ˵ ³ 3¸ÐP ­„&À9.̲“g…j|öm¥Ã¤²1……óc—>)Ê LÎ9DÈ9ž-ÇïhŠà¼°‡8nîIïF^rÄE@ ¦¯}%;éËG—6Äž1k‡<Ì“~Æõ5C }ýÌZýL|€ž`´£½I¦·³Ò·Ï锞@?Ëdçwýì]?;@?s¸ö]?;¥~‡Ùmzö§È2éÙ:Hbp‰òwÎFò®j¯j9·ÞO;+-{Dµ­I¼½G6,êž>’éào(;6à7ÝnâLõJ´ÃÜäÁ+ëÙ+ypHœr¶ƒKB˜>†am˜‚·ü„”^ ¼$HÄ n`â<à].>Äæð%°ß®*g¥æ§ÚUg²l÷Ap¿µ¹‘+Î{çLÛsì)7P%x&ôõ:{Ø™‚ôÝo}tKÑÉᙂ=ÅqÿÏ!µrËÑÉrW_6Ç ǪM7­¢a†ì;É'e£ÞÀÝé´¼ÔôÂÇc´?ý£' “^mè”L±#Ù1ü·×=·¬êgÊàˆ† Ô‚ÛíÁÄíÔ­¤©¢Ž )8{¥m·hR×(Søµó§$ð˜Ìî‚4ɉ&ü¥ÄÃw‡~¡sPÒ›²106lßzㇹ„Á,pÔN(¢ú8ÞæßYöµôضµ[Ù,q^9p Þ'à;hÖp})”ÇX•€ˆ_á#8ô ¸µÕ¦³Ò7p2CN†"á(„uYƒ¹¾Z±˜=iDÖ`(ÌÊ¡h&\‘óÁÃ7ɤyP‡áÝbXêvÙÝGrÌX $޲Ä,‘Ë'sP)Öí,dÒ%A\3ªÄÁ.ü6·ÃkÔ¾9Yèä ÝLùS;„W GæÊi¨ô£ Ž MXðyFy œ7ÌCÐaíÝ3²TFçg:ÇÏ˹G“†)#CT 3¢ô¿2Ùÿr.bJ0Õ•=S.t”ÿÁkáÓ·‹I¾m}áãʱöEÍøµ¿ÓnçŠ?{' ¾(|ßCÊqš+…wK´¸OЏw,Å8o_ðš¾òÚ4¯æ[ žO›vˆÛK›ÞR^÷Ѧ-ágÖ¦á¾ÁFD:‹õ–6mÇ•(5>°”_ÜÿK0î³"1F( %(Ð{9ðr17ù„8wz ÓU jÑâŒ@µ:£ûnôyƒÈÆ‘B&ÍMU×ó0ªð´·é¼«mïjÛJ{ÇG#ñæ˜ß}„™™¸ó«`MÛ¡S 3'WÎfOØ öÚÙ¯-Ùé~Qâg gÃåy53OÎs×–LZòŒŽ5þ±³ÓtŠ{à€ ¾ì×!Óø]ÀnA×WE$ùÉIMJ1¡^S„ Sv™MX¹Á=€:’½$!Äs@sª¾u<¼‡|ÜΗ3c²¤$düŠ]Úý¢Õ3Ýš-áML¡À» -Æ(Ÿ_&%v-Ç\JšŸeÊÙðÀdåÙñ¶Þµ\:Þ7@˜´4h ­B€Ž_ð>ÜNy³[SµþÂ&ñBÝÃ,æB‡¯„l–¯¸øsç³Û{WÖ¢6ù f" Q¦FØÐ‡Y¤[K1Íùu£}l¹ï\TVíç`cØÑf;½jIdQ?›Æ…Ãïd ÙÀB ^ŽxþcØkÿ2œÖk¾“^Vx‚wò“ â²÷•ëæ·-Ue ´Šl¦g9h*7Â}¿2\\â î)œ_rö¹œ;®’(\1ýqõ F¬/åØ^°´›C„£¢€pNÀßÜBF¤¸o„&Š->Ì,eÏAœ:¥TBxERI½Eçq´ŒbFÀ-.á4“;T±€Å?ógi;‚wÖÌÈüÝ´RÐ(ÍË`NÄ핳tFœƒ'ÈI˜«¥pjß|¡%oT­:#¬ƲŒ³YBJKŒk'Æw.^ ÞÉ hox8¿.½‡ æXçÃíÇe$æ3KW[ç€(Í3tÐJ€¿‹ZÊF‰1–CÆ×)ô•„_Ý+pe±ŒÆˆ‚̪<Ÿ ‹ðBÀØØ·QG§’~м™•¿¦Cû‰ÖÄNqðDe¿É¸.#A¥Ž)\Ã?—ÙNH·;E])®4^"¾ãxŸÈèóKðW? #A1¼ ¾äžÑù›JHˆ-Á 02û,3ö{Bóÿw€Éÿ+æf¹¯{Gë]}JÎ-_Î-?æ ÛÂî»-@ä±™°@K^UÝÝÁꢚ¬g÷¤çòÿØ6ùoo—F½½¯4;ÝUx%±Tö‹uÛš¦¥š0qç•ØàuèBÝÍKºxJÙN%Ç–ì)–Ì{JjR¥¡¨ ªBð$ßÙ»v)FÔ=ÑÕ@ 0ĤGõnRœ¯óz—‚Þ¥ w)(rÁv¦„Øœ©•#¦¾t?[hY¶»OaöšnøßíÇ0BÃŒ/辿­ Y8Ö•ëßVG{õÓí+›Èxè`ÌuwU½\MsoûÎõõ=˜%ñöÞ>^Êíƒ'jÅ »÷ž•H/ayoÔôø[À£v:ð›üF­å–íÁ_ËjSŒêþò|Wóã ¿Bßhô„AthfNûFÏX íîý“\7–¹d³ ÁöàYù@ËI| ZˆGµçJÜÌ}†ø9¬eeôÁú]øÉý®«š;á×›pÑ­ ©£ïþF‰†·ß^þ>ðL endstream endobj 6080 0 obj 8357 endobj 6084 0 obj [410 /XYZ 33.1199999 438.739999 0] endobj 6085 0 obj [410 /XYZ 40.7999999 413.779999 0] endobj 6086 0 obj [410 /XYZ 40.7999999 705.620000 0] endobj 6087 0 obj [410 /XYZ 40.7999999 368.659999 0] endobj 6088 0 obj [410 /XYZ 32.1599999 440.659999 0] endobj 6089 0 obj [410 /XYZ 40.7999999 106.579999 0] endobj 6090 0 obj [410 /XYZ 40.7999999 705.620000 0] endobj 6091 0 obj [410 /XYZ 32.1599999 133.459999 0] endobj 6092 0 obj [410 /XYZ 40.7999999 413.779999 0] endobj 6093 0 obj [410 /XYZ 40.7999999 106.579999 0] endobj 6094 0 obj [410 /XYZ 40.7999999 368.659999 0] endobj 6095 0 obj [410 /XYZ 33.1199999 131.539999 0] endobj 6096 0 obj << /Type /Annot /Subtype /Link /Rect [108 502.099999 121.439999 509.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors >> endobj 6097 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 502.099999 156.960000 509.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors >> endobj 6098 0 obj << /Type /Annot /Subtype /Link /Rect [303.839999 493.459999 443.039999 501.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 6099 0 obj << /Type /Annot /Subtype /Link /Rect [324 467.539999 370.079999 475.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception >> endobj 6083 0 obj << /Type /Page /Parent 2 0 R /Contents 6100 0 R /Resources 6102 0 R /Annots 6103 0 R /MediaBox [0 0 595 842] >> endobj 6102 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6103 0 obj [ 6096 0 R 6097 0 R 6098 0 R 6099 0 R ] endobj 6100 0 obj << /Length 6101 0 R /Filter /FlateDecode >> stream xœí=ËŽä8r÷úн/Ý ·÷àß·”¢^¤Bd”T•3ÀŒ*%‘b0ïǯÿòûÞþû·_?üþ?·oæÿ~)îE] ÿÜúYþ õ½”Ãe£«»lûnß~¼ü¼ý|ùòò¥ûïÏQ?^4ÿënŽS þãÛß_~&~ùýÿuWÿw“·íþúÛíÏÿÑýï/f¼þ/º­û‹ïÃ…BêîåUó¯/ÿþ§Ûß»OÐqûÿþ¢ÚF*ö?§WÅãßå«ÐdÅ­–¢ê?VÈî?UŽÿý¯—?ºÑ¦Ï¸ëÚü^‡Ì¤»™d)Ên¦BuïLS¢ƒZ£x½œ¦Ûà[Sëêæ²°®K9_+óÈ÷ùéú,&¬TÛÍ^¯'Õ7Q4BšY»kYŒSÙtO}_¼aÏœ´Üq®åðý5írghþ®áõšÙ–ðO´R·¦éð䇹|¬PÈ~¦éZ|ŸŸN„q%oºèNÀ0©.¤'Z_w|ŸŸ&]©™h1xI»ÎŒ?†kh¥f®%ØS–*d=­Õ\?ÆÔu¡çënÑÓ¼5Ñz›iccš5>æZ_? >?O¼Þ ¶óøkâõÎðü1\Cë5s-៊ʺPÅ„ÊJØ3_ëá‘ïóÓ釶-›ñж¥žÐw}ÝŒ‡É\®ÔL´|8¿”ëœÁh-´R3×ìÉHlÖ:^ëi¦ëb™yk¢õ6ÓÆ>Æ4k|̵¾n¦ƒD°µÎz'ØÎã›LºÞžæÐBë5s-៊ʭ*&TVÅthçk=<ò}~:ýÐŠŽŽ³ö×ÓTÎ…9Pã5árǹ–Ã?Ž1érghš³ ¯×̶„26›õŽ×Óé®{ ç­‰VÜÌ;üt\åc6çbl4JÂzÍÃdËñÍÁ&]ñ¦Óy†×,´²÷!¹ÇU´“=ÿ1 œžKš•7óf›Q‡ÅšùÖèÅ¡Kßî­•^L1rÚ•/€;mxåB+{CÖ“šTÚÊ6©|!1-ÉÙ´ôsçÅׯ/¿~n{3Ú×?nb°Å ÿûúã¥Ãù_zûR«n_ÿrû§¢(~ûçÛ׿½T÷Rj!«‡ñÎÜù𸣦dóøAO?ùø¡¹V‹w…¶-ÀGiŠáÝú.…¶Uãw5Œ±¸SAwDƒ¿ã~’½ò¢¶°_ÊûŠýƒðZ” wO†ß…·±µ‰Ø€Oóbš3†ÐVˆ{¥êMv€æŸœ áÃà_/ŒòÎì`-¼ð®9_òq€kq¯±ט/‘ŸlP|‚ÈÏ<ÁwäçmHúÚ‘`&‚ÚñD‹¢Âûà ¼11«¯#`Av´ƒN$°ðÓEð]#\’†8ü·€{±³pˆ@&ò~ñS¼Ú°°S¶Á|E pjœÁÙENÖø‰ØÙƒVïtùći°Su-+›ªÃG!>E ²CmI(I81O‘pàsåŠ1òŒ“„¼ôZ×ÎÄàð;§c8sí½©«z_æIápJ ð>NÑjÐUk!„oýB´ÞA 8ßvÖ„JÁv–CÁwTévl Ž£ŸWâð¢ã ëWø˵™Ž1Võ#ޥߴàH3˜3îØ½àO„eøŒ;‚VÝs?Z –ã³!+À+Oiòu¿(ß@,Óy×1ÖùGß±q€jŽ‹ÚŽ½ÂŒYeÜ #ö"4˜#Á„Ú±žQœkCC‚õZpTF‹˜P¥øJwà,¾¢^Ía¬{ÁÖ‰g’“1óh莡TŒ¸)KR ‚ FqAh„NŽ Z"Ò$w—jƒRì©1¢6BJrvÉ!“¬NœóYîXdÜ ªy)"äÁžZÙßžbÄäÜV¥µª'· ¥¼ ?‰Dޱó"ÄÌÚç4R;¥cÍ2‰ÔóG"-9<,Â6e†‰ñ]x…n» çyàdCcÞ©ŠÖæ1Š’•°çLqI¥ tnÒÏìÎØqÄ;æ&„†'6ŒÄ?I²)o‹|#Èi”kÉ«ÁaøqŒ{7&vÙÕÈ¥àª3œ×غ3h‹umë ®7;%6Ó¥ ãÈxiLÆçA~Ê8]7,7Ü÷Q ×wÝk(L¬H5®k¾«¿‚Â(‹,Ÿb]s­¦ˆÀšãid‚gh=ÀM)áÀôx ›)ç!6Q¶G„@EA¤rh\Å_r 8¡AN÷þèÌb6õ˜ DÅrr9H…UG¨yêŽ%*&ò€Ùi“ŽN(*½‘TvæÔ*a1'8ÆÖ•_"‚ŒväZû² tV?s¼ŽO‰Äð?\xÒ펈.-äêðúðà KV áD¢$×3’˜RÕ6 Æ G1­1iŽ0" ‚ÂH¬3÷è¹*X8áwß%5"¥8.Þ¨Xq8ÝÀè¼èÝ Ìçlâ)†6:ïðŽSº/¸¦™å»­°£¼ótG€¡J`õ?˜¸imâì ‚·SúÖ™‚™ž™1’X‚e.*97y» ¡à)´8üÛèŸMQæ$¯ª²fÝ¡®`𨩫9f0¥Üzç#x8-¹·GHiï/oàkºmk7“:E¢QãLj hÅðÏÆæØwŠ‘H5•u-êzg¢Â¥m#2DI÷Á¥âœÞú^>€¾ÍÐË»²CþÅðN&$¸p´/h¡•ÂÐÙYé+ÖFÐå½±¾ÍpçÖ‡ÜÙ™gT"¤“’Y‚w*p·á÷gçð ¼;—òkKZÝâïÏò˜’â:+ÇÔ¡Þà;—ðæ3‡G"„H-üQàCêy¬¿$Uübìì,ÄN¨òF]Ó`|TÃ1éÐ̆VYÌ(÷aľah§XÏX‚£"óÄÔçŽç>ƒ~s(…¹yǾŽ/þB®¥8Æè¯Ptå„|¦h%|AèêÞtx׸‡ ¯>„æ ~©„Å1väbÄ’N#ÌŸ6_*ƒJÚê—Ÿ‡¥4ÛbÌÖ¼„m(?:LÈÏ6.MõÚ$¶ÅÓ•Èa5Ó)ûÀòZóÏ+uqr¬ª]RÇVŽ6Ñjvy—E™VCêI«&ÂÉîˆ*Û Ä'³oÃݼJØø5 ̶pÖŽ][¸4…~óÖã¼:*«^4¸eZ]çE¼€"ÇÔ´=KÝÃì¡{”ºÜ“ ¦QA&'¤TcRxΓ€ÄÑ£\ ‡—ØHèÆÚìUZ<#*».sáD´ÃÃ#ÒËX\½I™4r~¸Ù“ó8z0§ìDѬ;Qè ÁNˆÂºú_lÁîñ”Z¢–sŒ‚(ê ÁN•=G÷‹-Ø=žjW£´ë9ø;!ÒRìvHluÙ•È·ÕF A hêÁÅtÈE˜«(œþ˜Fäåý8Sõ$ø ÚêDÒeÎ9¤”ÈYóE‹š_Z5cÒƒ}ÖÌïƒBÈUÌ QXa^§°dµ°d½%`Im ?Ý/Ž€Õ?¥V£¨å“€%Õ–€%KgŽÒ°ú§ÚÕ(ízŽ V9mÐiÜ9:uŒê~!/¢”•óñ0e;¡ùäé>zº²Nø§Ï rðáNÜ¡ú@ ™jµÍb¾3œ†Ñhq™Â|bŒ…¤„ƒÇxÂb,ÐñBÞÚÆ#hLkÂ¨Ž©2…@ÂcþçÖíaZí¨ò$B`{ULé·pßmy1ˆpgµÅO’ðQ5š²tUXÐ¥1}Â#0]1œ£àˆgá1þXòQ)UÚI†„œÄàá˜ØîXQÈ1“ÇL"ÂöE ò¯ëÚÚÓ¡oKºƒJoãÞ„P²ïôó?¦C£D«–?|ù=ÈtDš“>4)YÀ$Cü(™ÏA wFIYY+‘`žË²º-`˜ôã\ÿ…+œ“Mq4ÎõŸ`íÿëöâ§õ:^Ô[±ð¢¶cáû_ãi=ÆÂO£¨å“ñ´ÞŠ…ï+¼XsTn,üã©v5J»ž#ƒñ´cáOèŽèƒÉ1A¤"$) eç£sÛà˜úX;ò`LŽºc/çA„!/¦ÎòaÆ Ê"W2Õzm¨¬6ÍÆ"Ùp^ïiÚ…»÷¹¤¼2U£,ÀÃͽ‚€kÔ ßy…î”à;¥À\³ÀV˜AY³ÒFS„ ‘5ͽ¬É#‡×-Ê` ¤(cÖ‚¼4… …ÀŽös…âèÐoá5ü¤gN€g® Ïß)U ^Yhԉñ*·§k›$Ò¸¹ìÓ¸Óa…"ˆŸ¦ qLf8…UaF>ML¸²‰ÇÛ‘'ƒåWWÞ¸õ0RR2Ô}·—FìBö¯ž/&ˆøÝöô=IåB哞‡/Élq m¤Þ”¸S–wYO;w€Ç¡gGRƘâ&j®Öúèݵß#jüœçT«Ò¥Å``äEüäAÆn¦ò 0äñžÇÿö6ê¥d]ºÁÍåb}“jÓ¯9¤ ”ÅX9\¡H:|^ÚûPÛˆ°|¤µ1KêîÔ~˜EpõàÉó Ÿ¡;Fð­ÇÁwJèŽANÑÞ[ý€tÀ;†î‰ò^ªµP`˜çbÉð:v¾ ^!YSáNao73¯‡e%Ö[?¶^ž™ß ;ÅxxšÊ¾Sãßð<-øŽ·¨±M­¯àhŸFYo S‹•ÊqCĪîÒAàºc¶Wß•m6Ȳu‡½›´Q‚K=U¾8*Èî^lÇûQ2+êë‚Ê®í@Ä,‡'ììdýÄÈB…Ûh°ÝŸáMaDX‰vÊ ·w8 bcx§ÞFY1.µ}weÑðÊ0® dÄñM úÛ18 ´ÈwRë5yA+åÎöÈ‹00îLj)‘ßÚ­€|ÆÚa±!&·.È(ñáí@“¬GjCô®§¨„‰óä¬wY•¿¹¸†0}"*­Â0‰±túB¬ùUDUÔÛ8˼Y|<ÙŸyêwî0w?W‚£‘aOµ¿÷èý™1Ç‹Ä6“ÐSÓœ´È¯W¼Q (ÞÄ*ñ¯R+›~ÅøTc))30õÀ#tš¦t,1ü.Ùq…«R´=ïb’£Hú)ºwÓ 3¥·k×å¡ÔT’åx—ø°Ëc Zs]¦[î øìØÊÁKòìt}i_ Áw`×J&‡|gç«á•»®tgÀy`Ç ·òÃH<ŒhÆ7Ø)– Cr9Å”û9¾§Xî.Ï.'–Ncg!©®áÏzŠÐ15¼ñG‡§_/Ì@L»Ôð|õ¤Ê'ymåœyJ¦ÚêÌ=vì×nxèyªtäÒŸñÔ!ŽT£pÁÇADc*œ¦<°ÙE¾˜êW1†–ñÙy*¡)—ÓG'm†ØèøŽÈu æt OIÂèlÞ“¨Ì'Z;"À0ùä~M‡ˆoOÖÖOc›ÝÎl³UÙš)K bÑ«ýŸ@TüÝ1|ÖÛ¨Xdg‹j¦J=ðTÍø•-´WÆ\·Ï”ÛâÇ¥öŽø<Ïh˜„w^—áи/q¨‡§ÌÅZÊ ]«¹ó"ÌcÀM„Qbg{#6>ÏFpò²!z¶ÒS© 8ð Šu ÷I±rñ fƒÚ‘Tc]'ï>oTì.QZŽéa¨}…yÒC/qtÒ«12b„4q, ŒH©ýæåf Þï£î¬üE¨HÓ’ÞªU/—’Ž0»e ¢%¬&Æ•‡‰ï%u8¯8¡¹1ÎáÌ‚áÊÎ_šÒæ/PC{”ªež>˜Âú8å`\Z‚ÕR¸™Ï×…äŒ ðAl:‡B2©a;´1;ž8ûó'{¥UÒÁDxptê¸:eöçeÀÈCŸ•¬ŽŽxÊ&wÇHäœ 8ã‹ÊÆ"Ä4q^ˆA¡ÕÏEü'bÂáu!€“ l› È[ç‡DPC€/"9Ñ¯Š¹ŠIŠƒÒ4×lŽòÂS¦h±FÅØ®„ã ¥(XtAÞq{Qì®>ƒ†Ò×UOàƒõÏ»;2üé½áÖ—¨|fPÅÃtúEÔB’£åæ³"©P0º §[Yi‹\¼_ÅÍ/‰–`Ó-’ÖÖ‡7¾Å”ÙŽÈÛ°Ü <ŽÁÆžÓöŽ$1þ(³ž³<‡y"º?ǵ“fê§OwäÎãTŠÒ,3Wâ6Q$Ȟ̞¿É\jÛ®‰˜R/ÊçSʡȔ¸c hÕ¡èBžJÚž›¹…‹gOJMhÞØ5Œ¥ñÀºVªªl*qI÷8qJ-çÜ!=ÙÃMó˜W¢Ì¸$EmI(’‚Q<‚ÝiÄ©ó)Þ4ÅÜRÊÈÄ$QӦ̦wF>£[›Ï`2«3Ù<™!;¶o¥èkJ„N £=¼î šÁßÒuÒœªr<ÿvK ]ó Ç6 èYðníÐ4u†ÑÆOŒÜi†]¯ó)ÁVÔ¦ÉV[i°¶©Õ‡ºCW"`oá¦æbáàò”ïÀ‹Á(`4øy*ðÛæ²áóÀïTÁwà~ç?,@À]Íáþíà”ì©¡Uc-ŒQÖ€(]’ Š0)ðá½[h‹W $Ißsì5Þ@€ºB/XÚ¸²E’-‰B™ÂQŠSƒ©•E%0 lóI°QØ·hID?‰ç-X¢sè+ÍX¦+Ê~@þ÷VMa§óuT™€;~…©KoÖÒ•ù”I³|LÙ$ÂøE;”b@†Û—àX·g¯úŽÁ~DE…pÏ'sgæêè™*€r{!"ZmEÙÞÐa´D"i¸—egšjL¤v¸ÖBÁzIçûÓôœÁTºµÌá…‡˜kÜì¬/ÁÞ’’©êÚŠbr"á\™ËSÔI†)JJïÕ/H±#¦õBX¾a‚ä:ïÕƒã9BT#8]ª zVSD´>‘è”Gš'J)DÄÈí´V ’ºï.'íØR%;1JHë´ Ð3^€Þg Þ™l4îh°Çš=ƒC56;À ¥Lñù#àŽÍ1‘ÅŒHã²:&ø’»Ù%j'gÖ Ë‘"85Àá;OM£Àñx‰'´%îV]™rÒ…ÎÄY%lQÿ%Î"”S;.Ìl{MK6Ðhj?Â2µ3ÂÑ“â:‹ìmÔ§ (î*M©È¡cñW@¨ÿ<œ4BùÅTVLkeí±[[”íå+Ã)ªŒéªÓTo¾íQŒzJROFæÚÃú=vFš1÷ÙéÔ©êìÜ`쌴Àˆgg¤gg¤gg¤ œ+PŠ<b.1û—©äþ¹œà;®¡º¶ ºl 8 t 0mÓ,|뜂Éî4jJmÁãÀ(覱@™“­íè•1´#FÇ'a,Y såËÐò‹O‡¤q™Dhþ ÝYpDô&Owˆ€ºˆ <"‰ß$œ²Ig 0«êÒ¦á1Éáä"ªK¢YžÎv<‘¸ôü9±Ž¥rO/  .å.áaŹc‘Y:g]©eBØ"©c‰uó«2D)Òâ"˜à ?ƒ$,žCÒÌ! çSr‡‡;'£Ègnr§ð@Repžh÷ÿ§cÌ=Ü´`Ï"zöŒWŠ¡)Éo‚1ÓÖEÍ^éPj––˜^I zT\Ì"*ü2/C‚QÈüö©dM‰w ¨x„øDDæöˆ§¯õ8K7•4HžnJœÏmcñ ó›r2(Oº¨S¨TB33üf`DY—ˆrÐðú5¤ƒ#Ùˆ}.˜m|Ú)X m¢”bCxd`NS5MfJõ¾c:¡Ö‚G·Ums ç°ÁhCI)"•†6Ÿ‚Äë|…ÒeG%õÄKRèk$Ê“bc9{=ïe‰¾sbV=äèÀì¡¶-mæö–ÂFs(t²ŠXýùâ‡yŒüáʇUz ˆí‚Á‰( BËäbš]åJ±ÓjLÏ2¶˜ SÖS^ä¥Ï'OÑ„˜r‚=¯mÜ:=’Ö÷”̧çPÅg2ß3™oÏd¾g2ß3™ï&óÅ€B:&^×1É{ÇEÖ¹¬56"=?wjJis§³‰¨!„‰N÷Ñ7©6»!·³UjœÒdH‡…Ì¿¢TÏç‘Öz¤à!å½V¢–ó£¯öËÆã-Ê{9€u~ö#tÇPÝún ñÎN,?nŒ¶jµ=~í]ˆÙò—¥³)Á…ñ¹pÁaߎì,ŸNÒ7Ñn €ƒ¨mÅsÚûãx­NØoÐb¤íMe¿#ðïxžzg¢R%PkµÛ"£F°»wæ …ÁÏòÁÜ­Úøø«ç¦±öJá¯OÕÆWÃÐy!±R¸qªú¥·,ä%4u vÜ}1ÚB€+-O·…ÆEž†‰©cñÿ¹BRB$K„ó”G‰>ÞÏ‘xr:¿2©zzü–œ²)°RÚ"˜$ÞêàR(—¢‹Jr\µ$]U(²¦Té=á§£J¹#ÈÝÝr–^^˜©÷$mþ/-<x {b²‘ÞøÙÍ "J›7‘ <ÏmE37–Ë|`tÌzl3}b3Wo–BÜM*H’VMRÝŸ‚\ÒJ~â=¿Ã4¥¥oú”b-QG˜¤·7œž†¨ët¤¾ÛØ !Õ¥ÈO ©³ÕÀâMá.¹looBf÷kÕ'Üà³´ªy£;ž²¯Ù±…_³,J› ĘHšCžU)ÛKËÜVÔ[Š: ȰŽë«ºo?;ôõ#Ìÿ¾ýØÁ'‹¿ì¢âî«þú&ºel`qÙŠú>TS(‹1À¤0Ýú^oK­º¡D²¹7Ûo6î ¹,ï²Ýls^U÷zØ×·æÑà;-øÎàüiä]ïõ|çmÀÏå/Ágkrc…Ÿ¡w RoÝÐ:Ìqƽcv ³vóm€uýµ¬Ä”YQóÁ»ãŒ; ˆÏÆ›™-wЬ ÈîÀÄøLñ\ÏηÁ¸ú´ê.zÛ–…àVqI5ÐC£ éóíËËÿ¬ô endstream endobj 6101 0 obj 7964 endobj 6105 0 obj [411 /XYZ 40.7999999 102.740000 0] endobj 6106 0 obj [411 /XYZ 40.7999999 148.819999 0] endobj 6107 0 obj [411 /XYZ 40.7999999 312.019999 0] endobj 6108 0 obj [411 /XYZ 40.7999999 148.819999 0] endobj 6109 0 obj [411 /XYZ 40.7999999 312.019999 0] endobj 6110 0 obj [411 /XYZ 40.7999999 102.740000 0] endobj 6104 0 obj << /Type /Page /Parent 2 0 R /Contents 6111 0 R /Resources 6113 0 R /Annots 6114 0 R /MediaBox [0 0 595 842] >> endobj 6113 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6114 0 obj [ ] endobj 6111 0 obj << /Length 6112 0 R /Filter /FlateDecode >> stream xœí]ͯä6r¿¿¿âØgñC"<O€6Ã"‡À›ÍbáYÄÙCþý´Ä¯"Ù%‰dQ­~ó<€§¦[ÍR‹?‹Åâwÿòó¾þ÷?^¿ûáçÿyýÕþýÃÏ/ÃÛ0 æ¿×åÏá\¿ nH¥Ç7>/ÿ½þúõå÷×ß_~zùéöÿß_Ø´þÐþuûÒ±0 þã׿¿|g˜¿˜O~þáßnÔÿ½ò×½ýëo¯úÛ_¶í-|}Ñó´¿‚qÆõíZ¾üëË¿ÿáõï·WÐk»Ëÿÿ(g-§A7½Çïþ§lýŠ1^'.5½2Æoï9ÞÔñ¿ÿõò—[kþ5ÞÆÝÄQZ¢4ätÓü+Ÿo-~µäíû›B&Á-í#¿…§µü0eŠr¾q@阩~UJ8¦JIÏ(¦…aª3m’Ô2/$­œA_ IjyAµ7é÷Ö²XÆÓWG.æÌ¸Ô'óÈoáéFýŽüU°I;¦lÉ0Šèiyÿ4­¤†h|%Iå jüjiLRà ª½ETÆw²:z•P @ߌÉóUœF^=¸Ž5mZ%¯¼"z2¦¥Š®ÍåuºÕ /Zyƒ>¿Z“ךГ)kg3_=­WPt Y¶:ØX›¼“ôW6¼"ÚŒ(ÿ<µ¼N·¡}CÓÊôùÕÒ˜¼†Ô3T±™;¨â½jáöÈoáiP”€§ˆ`)h@H*(>¤r5:PÆ$5¼ ÚÛAÊÈjh@ÁÑ+pX¾ŠÓÈ»Ÿ ,0E4Êö®Íå”!/Zyƒ>(còZ³úo)kË+Í(8š…a«ƒµƒ² ,0E4J‚¡›É+(C^´ò}:PÆä5¼ þ›¡J¨’”%eÀJЀò@yðÑ,GP’Ž”R9ƒ(c’ Ê’”) @YP¤(ä]€o <`Šh”í]›Ë;P†¼hå út ŒÉ+(·÷¯&R€² ,HQÈ»ß@yÀÑ( †n&ï@ò¢•7èÓ2&¯ Lп+>¨š(O”ÇV# («Ê ÀSD°T4  $U”R9ƒ(c’Ž”'"PHM”'Ê#) yàS”¦ˆ@ÙÞµ¹¼ €2äE+oЧeLÞ€r{ÿZ` 5Pž(¤(ä]€OPV˜"%ÁÐÍäU”!/Zyƒ>(còŽ” úwŧU€² ¬X)Pž(Ïž":€åLÊ@Ò9€2àC*gP£eLR@Y² ¥(kÊ €…¼ ðÍ”gL €²½ksygÊ­¼AŸ”1yåöþµÀ@JPÖ”) yà›(Ϙ"%ÁÐÍä(C^´ò}:PÆäU” úwÅ'Uì8yzÕB«™”eØè“`Ë+¦=XJ¢> iØè|hå j´ ŒIjyAµ·ƒÔ@J‚&O¯À@ŠBÞðI°Ñ'ÁfWL $èÚ\^°ÑyËôiA“×™Ð;Hͤ$Øhò4 ÃVke 6ú$ØìŠé”C7“lôA^Äò}ZPÆäµ¼ þ[¡J†í/ 6ú$Øè“aLÒlôÉ››ï˜º­˜…QL7 I)iØÝƒ|Hå jt ŒI 6ú$ÑFŸ_lôI°Ñ'ÁƉ¼ šŽ5mºM9¤ôàA³½ksyÁæ^Ä‹VÞ Oʘ¼`£ -0}lôI°ñE"ï$ýÀÕÁ† ¯˜NƒðèÓÜE,I(©e7øL)gP£eLRË ª½¤Œ¬– àè8F¿ñE"ï ølÇ®m:%/¼bšûðA×fòzÝ꘱¼AŸ”1yYý·ƒ”µeCPp4 ÃVke7pu°á•WLs^ º©¼^·¡} Фò}ZPÆäµ¼ þ[¡j¤öPÐÁÓ«¤‹µZ²”9óøÈ¹Gÿ˜f.ÖkIJIy@|À‡TΠFʘ¤ƒÔ‰Ú›AÊÊjé ž^Cú+‰¼ šŽ5mZ%¯¼"šù8/A׿òrú­¼AŸ”1y­Yý7ƒ”³eCPð4 ÃVke;pu°aÃ+¢™óR ÝL^@ò¢•7èÓ2&ï u¢ÿf¨â>¼;q€Ž^µ ]¬Õ’Í ,’ôèÁ…}-I)© H øÊÔè@“”Ë!Q{;HñÛµmZà±NÏWqyà“CG«ä•WD>æKе¹¼1äE+oЧeL^kV@ÿí ÅCl×¶i#Ä:=ß`cí l®6lxEôàc¾C7“W †¼hå út ŒÉËå迪¤ïN ƒ£W-wÒÍ’Í <ùÒÆÓ 7'´ ûN4U> ¤S@bÀ‡TΠFʘ¤RðDíí %Cl×¶i#Ä:=_Åiä]€Ï`RÜ+yåÓ>æKе¹¼bÈ‹VÞ Oʘ¼Ö¬€þÛAJ†Ø®mÓGˆuz¾ÁÆÚAÙ` 6lxÅ´ùR ÝLÞ 1äE+oЧeL^)x¢ÿf¨šBxwèàèU Üm€Y²”Cm  T>Šh[^Ä=M+©H øÊÔè@“tâ2Q{;HM ¶;Ppô Üo|‘È»( 4âGí é¢ksy5bÈ‹VÞ Oʘ¼Ö¬€þÛAj±Ý €‚£Y¶:ØX;(ƒÂ@(~Ñ®0{žZ^ €ò¢•7èÓ2&ïÄe¢ÿf¨Ò!¼«:8zÕs`–lesËÊÚâÎsÇ´öa_š;V ¤s@bÀ‡TΠFʘ¤šM‰ÚÛAJƒØ®  A¬ÓñUœFÞøLÇš6çp¤;¦uˆù¶wm.ï €ò¢•7èÓ2&¯5+ ÿvÒ ¶«(hët|ƒµƒ²¸:ذáÑ:Ä| †n&ï €ò¢•7èÓ2&¯fS¢ÿV¨Rƒïª! ƒ§o*{‡{º”ó'žÓýcÚr³$¥¤Ì#1äC*gP£eTRp —U{3H)w ÕJPðô ,<_Åi佟íXÓ¦UòÊ+¢C7‚®Íåeˆ#^´ò}ZPFå×qôï :Ζ @ÁÓ, [l¬”ÝÀÕÁ† ¯ˆUÜ(†n&/ @ñ¢•7èÓ‚2*/¸Ž‹¢øá>¼{#:8z‘û»ëÔ½*H ®ƒRàb¤˜ö…ÜÍuPPÒpäC*gP£eLRPœÏª½¤xˆíÚ6 (8z ÇWqyà×A)p%RL‡*n]›Ë ®ƒŠxÑÊôé@“Té#è_:®:¡(8š…a«ƒµƒ2¸J+‘b:Tq£º™¼à:¨ˆ­¼AŸ”1yA•>Šþ]ñɇw¸Jë T¸&IÑ\¥óLŒ"š¹ƒ%)%5Œ@ãŸ)å jt ŒI Šó)¢ë ¸Ië ¸Jë‘Hä]€Ït¬iÓ*yåÑ̇º6—×éV'¼hå út ŒÉ ªôô¯¦ÛUà:(®ƒRàz$yà³W6¼"šùðÅÐÍäuº í[€&•7èÓ2&/¨Òú÷'’;Ôy¸Cý÷~úåå»/ór_ü/yeæÒyó×/__n6øÇå"õùö¯?¿þÓ0 òŸ_ùÛ‹|“Bö–zó ÿ²~£ýlN>øúzfóãð([¿aÜ5¾Á“5ÿƒyµ¦V3)²V½~0½q¦÷Þe3ô›Uð´~3¾ ®oè_öÒx·©ã/)xJ‹¾üð#öòUJBÅÙxƒìe3É´†[ÔÆ»füð—G.ï”! ÿ->¸2e6?þr§>P#$K°7ø¼/qóÊ”Œ[Þ‡xóhïnXÞÍ»&™aÌô¥7@…Ì åà^£P^?¥=™uí÷‡­ `3]¸±å¸›ÙtŸ%Å48ªBŸ¾F~ÖìÑ0Ì .‡êšQwÜLòWËÆÖ¥¦ã´²T—‹§• ç/}q¦* T•Ñ{å´ŒŸ#}‰Û] Rg3<Þ»¾eÍd…÷Nê=|ÙrK;9DÅkƒŽÃÕ.8Ùm¹»ë‘¤2gH˜¹Â¸ÅltX ™‚ö >|óQôL&›a>ñål6KÔLåèor%µ¸È„Ýq ðQ%#¡Óþ º®d · $3w‹Æ7Pü¸ÇH2+„ 6øø»nî†nÎéœ>¨Û'Ò“£RfëÇcOüsúÛÝÖ7œÓÌ\wÁW´1\#ã™o;"øR*Að§Z ?zмï׊Àwm»Â’¸RÅHë³f& bç­VLšâàaAø¾ ²®ÆÍ2s‹ ~‹ö}¬œ°„äS¹ Hâ›U`Z"{ÖÕQÙŒñDÛïFñßnð«™ÞV¥§;Ë$\aŽj¼…‚L³‚@é;ÊÏÂÁ½àaw‡Yj•€ù•a÷ÂvV“ \‘Z\²©Ç¤+"ûq3ùÙ¾Ú(Viu~ ·x#R¤Ñ°‹Ó;è_œ]¿‘B¹ïåãJ«Y¿ábmðiÈb-§&'²_ ä+6–øyžŽî{—¬=ûO@³“ ïä’ÕÉŠ”$ »Ïáv=¦|²Áq‡°dÕ_°Åˆƒè£ã-×Éa¾l|¶{œ³ü£ÛnfRh,WS³dðY—f~#¹÷Í„~£ÐofìÛÁ=ì¹0{€J€ÒìzjAË´ïß‘eK‘JwM[”“HÞs¥PµÑÖ9W1”D…o"4eËd^gµF²±Þ°>.pê –(§zxxèÉPjLgÄ–l¾š“-1‡–`~ÉŠ4“3ÛW+Ø=«qÆSç?Ÿtk„Ç×PûSÓÆßõ6ø>6^þ°Ùœ°ÆžÕ3›Ž-†I¢Š‡[(q†xÿôÛyLL2?ÇSÍû8ßGø,G,²"RôðQC+NìxóÛ·û éBª ²—¯YKž•½s˲OöNGßT6¥f?½ŸA)iXÕèF¿éyˆ5n)lt/¾Á×ÜÆdðôÓò +êÃäƒvà#¯K1•¦ãX{JÏ”d| æ†wlpj83óLJ{dÀBNs2œ^ò°a—²$³®&ËæºBSÉ-¼‡+RYšŽÚ˜ù• o“bÛsVAÈõ€£÷Ì™§¤š¨9娰î~Œ¢Lp@è¼-´k}Ó}ö]Ï4©“éæ™&ê}·ãúÀrÂ’RÎîöE<Ç'Kx:7_öqëï–ļšZHÇÔ®’@Ö5“'C°ëd'Pº$G«Bæ`:r“³½;„Þ½-X—.Rúmy™¯þßó›^ï_þRŒéõSÍ^§ém}»ÛÃö“__¦ñ±™ëåkû”ŒZ‘Çíyûoµüì5ùµšR·On¿‰ßdyjŽZ™c}ùô‡NvíÌZ‹}¬z¦Y6à˜ä‰ö¤ñáIŸì öøý šN'?aßp]ñnso`å\§Xp¦ f@G¡*Ù}:tüº èfݬïX'!a€+‚ªõ)µ"!tótèæ1ºÛ'Ð-OÍQ+sÌ£?Љ»úRtxH¤bAFRi§Àƒ  è´D@iëÉÑT<´áÚ4^ÅmÑÇ«`Ó½ñºü×Û'Ùx]ž’Q+òpãU0yg¼ &2"¯ëSsÔÊó8a¼rßAxlêr›Ëx¼ð&¾\*85†çó<_¸­W¶-:Nè€LˆÈ„¼d"]ý,Ÿd@¶<%£V$äáLð{@&ÒUÜòIdËSsÔÊó8È„Þí ’ˆ^µb71¥Sž×·‚y ‚WÅ7³• éå>Øá”YŒ#¿‡£LGðí“ %–§dÔŠ„<ÉËò”ŒZ‘‡,“¾7X&•ò¸}’ –å©9jeŽyœ0X”¼Ê”ú‘ä\5•6äÏdæçöϯ֬¯chn¤m¹Íè„h‡Ž£“BßNÎYtr¾œ=†it<<¢é{ÑI¡ÓèäòI†hÚE'}+sÌãD›}tò‰¢¤Yg¼Ô2/v™C®ƒ¾–8ï;÷’¸4ûñ)#SýÁ]q([÷BÙrHCÙË')¸¯Oɨ y8p—ýP¶ÒPöòI îëSsÔÊóèî’yïÆš;ÙE5FDQ0¹ªðÂ~úêÙW?Öd3Q¼tA ÝäqVò{QXÉÓ(ìòI6¹‹ÂúV$äáÇ ¿…•<Â.Ÿdc»(¬oeŽyœ0¹‹Â †:Xg¯Ø®ëÐ5ÅRh&åÍfíŸIÅ#êÞ’þS"ç(œ~ÙA&\¥ÊΚ郞g«…D ]Ä'Í,ðŽ„¸¾¬+q%¿ôV‚’©ô¾@ûÕÎI¸S{ï7ø7Ódž:} ­ ©IÛÑÛ3#ßÔ†3‹ßûH æÞÉû$µ гQ:ç N,Q8Góþøˆ}cg {™zø7åƒf+J¼54óКwÙoðÌCô ppTR¼µš^°€qï4Çr£´çg´5´è§èž—)méÊ`¯WN˜{îºøª¥ ¦ eð&êí_þP³ˆ.©ã¾Ý<¹ââ;YÖÓžº-(£[qŽå„ú<ÆuÙ´ß—Ïèºu:GVð€—ú¦Ê¿ õp$zŠä9}\žó¼¢Ð¿^Ñ;ñŠº¢NY‡RV‹­©²–ÍÈ%dNªÅyÜ+Û¯(Vs*öxÀ÷€?UskéùNcG wbä^Í£S8ZÁˆ 4„󜮂è_õÙ9²G±Ìž÷ 3‘¼8þ6" ®fFºB«*dQáœ]Î/&š½kKzKyA”’àQâÖtpKú*EÌè9 Q“ ës€ôžÉ÷:Öµ–OÁ½ï!¥è~š£&-ŽbÝqíc$}]öéÆ Kê"ž¹Ý>à…YÐoè®qÛõ_ý{Ö$Fm¬ñi«_`UÅþTI±‹§tXMzC: *Ê‘ì;õM¾m61tñSŸúüõ“Yg\äT ÍÆ[Æ.{wÚZ•»Ï„F̽oNð.˜,Vbö8º=Jw’Óô¼W™í^x »á?<Œ¸‘#†ñ$Y²è®Û²é$jf-«Ö–+­>–¤0Þ8Ï©m“,*\jüIêGPMp«/h)H‹Fê7  “²•Ý·ûUÈù=n²‹3G’·u¼è‹±Wüª¾F¥e6VUÿºöZ É{>H_Jx%®ìtÁä¹’íñ ªÝyð7-h[ü€ªb€R/½ýÃNû,—mˆwŸäùûÂpSP>¹yå ” J~¾¥×!\8ªìèÚ‡®ž±îiH ò·Ðq’»]KrQ+vÃËÏ«œµ¾ËjàÏQÃsTý€án0<ò^.Ã'€­Ö»ï}a°%¸øœMœ gÚ#`´Çß…B[C³ª”žã‚_e4 oÀÐ’½ž¯,¢’2ôÝð 5ÚÁ%}§ù=¼FæÆ55ç¶Ha÷I î”{rá‹ÚIïGîâp=w´â›½ö¡Ë-MõŸo n¬*ò&[éì~<-¨¡¸Øï—gô³)KêŸãŠ/) ‘®î¹®øF•,Ôâ5Ž#î†âɸS‹»z¸“Ž¿êŠ;®ëF½T;¿AuÀñ k6:âwÕ¢œ¬.á‘a+\5ü³Ì¸Yà«á Á7Êë¡¿Á^ÂdÀ‚¸HW©ëWœ:Ô7Z«¨¢0{+N¢ÞÞHwÁ£"§­yƒ7òø»rµ~†[Ø.»OÐ5^ÏR[ýF—ç-J.xþ³å¼Ð“åÁ©ÑWöFóྑŒµ¾.ä8©Dá5ù°ø¦ECÙžÊÇDê@›Ï Ï ƒÂá¼_*Yì‡è¾Ýs¤×¹Ê2t¿1ß‘$–àaÓ‚Øk‰]펭3­±ð.§(á“÷E`œ¦VõVáž(6¿¾½":éþ>’ïIÇÃ+µu¾»Å ¹ÞÃ'Ý#y!æòóvÿ˜ƒø`ÏsxŠÃ0Aëî×û>Orá‘NÓV½÷Ü3B Eb‘Âç“&³š{IñWkyé–‚&Õ>?Öë‡';ž¦ù§µ80—8B±§tyÁc*]”~±|º½~QüzýBêO<öö‡=õÏÜÀ¥Uÿ“léšþ˜ùþËã=­Oœ£iÿ\¥y~÷SòûpžäÀÇËõÔÆ²»¦+¢»kÌSÒÍAç\ùP4~N¥ê€3þÍ…_×—¦M¬5÷ÖWhOxÇO‰\àˆµ|Á?iúÎkRxé|iô¥?ίæ:›ënŽoÌG´qÚ÷uÍùF,ï 8)Õ°d¯ãœÍ½Þ—ì„âüvSã6 P”Äé²WyÍmÆ™‹dê!ÞuË,â²÷;–ls’Tß8šµt†ç!ä~wdgÔ ²wCÖQîÎÁñÀðe£ã¾ùí—O(FÀiżUr‘å>fÍÑ»ËÎu}W½Ó,’ñ²Q]!mz­¸êá‘uá•©Ù ñ£û”¥¦³rà¬ñA[jyœš0Òû‰´K7 vàǶð£^øR ]lT»Ã—íßôÀœÕx`q¼ªvy³ ¨â6Ø’ðÀ Ç‚oCd¾§\>ݪٱô…Qó_ê!Üùfp³½Óß°òßào`] ;¿ü¥&Ã|óûÆU]»óÍÖ “i=¶0ÞÒw³ý}¯µ/¨<_P>³5 ‘ºÕ®[Þñ¬âþÖ¸Þ¬!ßQcLJä©Ñ(³ƒZ6àa‡OšC¨½ Hu½a‰¸vpIûlÍÉ¢]dÖÇYÉrVI¬´ Þˆ$±±F7].oÑZI?î‡)*B•$Çɪ·çð˜sÍætñè–ãUnH’®[âÔ}îN¹ÚfLÏ aÒÉŒPcÎy„­`ø<ºîþA¢˜?Pâ‰ts Ai¿h)Ü£‰ì(I:®Nü<ØY`'Õð%Å”©—ÄCOªwÒíZøæC†´ÛT¸oúÈÍ9›Ö-qÅ+µ™Š’{4Ù?;×®é|À¬jÜ-ò¹7JŠ5Œ†áš *eV¥CPé4¿.Š™Ä xýêÿ-ß´^'µü¥ÓæÓéuš\$Á}òëË4¾16s­™JF­HÈãö¼ý7_~öšþše<Øò›äMnOÍQ+sÌã¯/ŸþÐë†ckLÓþÏ 8}MøÔ%Á*f(â¨êAÑÖ_90)Ðz¢5Ž}…–:­¶ ‚Yc5R¬Ð[êTœ]d¸”N˜@5‹'PÍïM Z¦“Ûí“l]ž’Q+òð¨îM jNyÜ>É&På§L×Êó8aÕþ t·œÕcùv#ÏÓqÉtÜ÷’û÷ût`7ÏØña¸v|à -Ÿ¤`·>%£V$äáÁnÖ÷ÀnV)ØÝ>ÉÀnyjŽZ™cýÁŽ>WOh|ê=š>:÷ƒ·×?4Ðý6sìÇÀmÎØ)ò€a—iTŽ+7ÒáwB-‹,ÂÅ!ìQ¿{áèŠðþ£.ƒÜ€€†ý“šÅG‰·F±KÒ`·$ ¦™ËmV–ÌLÔ<ÑžèFO×’ë»õY³!w|æÝPE­)>¸ûÚR%¤â’¯ýÃ<Ž Iaë,´šÜ½‚ÚÐåg°ò1Ór"‰ÂI80!v^íì/ëIŠM œ Î ]²ÄšRø {`r€´Xü·$<Ú##½¥d©þ>±§Ä¹yæ¸ÆYI-$çü÷WËøôþãá™b£vÌGø¼oøü€›D8 zfž •N.ϰ‰Û°ª'©>_rº˜¬HÛÞòpÆÇXÓW`5u´8:=¨G ¹ÊyÚ¿èì£ 4õ(úd×ÜBXV>ò8)¤ˆç±oÒjGÐJ%¨×´*ºb’CÙ KŸ~çOKõ˜ãQOyFeÔQètâÅoDÆ [à>Ñʨz'3CKQ°î÷dNØè›Ž;×îa"yŽê ¯>‹k²¦VêF1”оì_/L ©Sù˜¾TC6Æðñ‚ê‹ã#©{mk%§T“ þ–”m­XÑãCù±Ÿo8mñ©]Î&vVT®çqõþ1Ì»:."5®á-ÑänjAÕþ=2à;v“sÒcϽŠmJV:ÃÅq#R.}¾kg‹dÝËŒÈÆþCcBñQg|£ú^wÓÑK6~Óÿ”³H!æ£è.Îc7£S›E-·%ºá…ÙÒh ±[B—0§eà §ÙF…çýrÊX˜Ïi ‹‰ªô€ýÛ6Ê“0O¯_R³6£7ÜMܸ-7,[àÅuñ¸~~Ã>Uâ‘´PnÿH£DŠ$GŸŽŽšÎ®L†p¸ øNhÿlØ~ãÖçÖº¾J{»LS‚îP*fÁrd§ôäŠQ5¹ ùvònïÀÍ#$)- ‰K‡oÃl •ÖøÆ:ÙÕ²»—‡›(†GI¹Šë€«:´¡DÀÆÁ̧ÌðºRÖœÎfè>&I›VD³ïD‰˜OÖúæQè„5þ$>Ðì»{ÔО$=ž;Þ©¤^Og©ã€ã㜌¸“*ÁÒ«ØÊá|oB!®XWp`¹åbLü¥c´uë#¼CI 8á¼B¤k«ãU,jÎåÐì“&u>>Nœ%øˆ×©»PO¡†/¾GåãU—:Mýü]ûlXÖð»NŸç“>: 2Û*®9-ydž3À49’p)j\õgªf¾âˆ¦SÏ^ýÑú '¬H5Ûw*h“ð^ÀÓ¡²þiðQš¼Ñ–+‰\Í’„D’Èã9Ð$›Jyï§wÇKN·´ZpçgßÔ<ÚtÅ}'™ Z6¦j–Çx:HMéõúÙ­kŽÜ”‚úåÏ‘Š!_ç(Áà eS” )¹Ê…âVZ÷x‘–Îø´—O]Æ=/©Ir!Äqo©c´ÔÇÃjûy§çÍ YÒˆÅߌf6» ÿV°½=Ì!5YüøaBƒ_qnúI7_¢×¼ÛQvçÚmüªnk_×¼Ä[Ž*àbâö‰¯kjÊ_æäÃYW¡Ù]Âeßl1‰££ß”¬:kz§æjTŠ}Ì Þ¼} (pK­·â¹«sê5Ó V0<ľúô@S¯ûŸïjJ²ÀûëysxÏY!ëê’B¤Û! cu;Õ„N…жXUÐæ"á‡f<ÔE{Ã`ÁJ¶ v@ëZáöq<¡l?v,?[UŒÖ Þ˜ew/‹­:,‚÷laB3c÷SV N.V†O¾ÇsW]3ÍYêhûøE4´ sÜЛjöÍ+ȳ&=pÓpü´mB#¹|èìåéiÇÉ¥ò>Ql½À¥|‚Ô%‚ÄžE{fžZÊG àãSùùvÓiV˜”—çß$F±™Û§JáÆ5ŸÇàjéÇKl¬—ÏÚ¦ÙèX>|›fã7è6Ç2‘åÑ»fã›Nj›szg'”¶M߀]y›fy¬Â{i…5qÚ¨åæÈSƒ=ëB͆ C¾òÁWgÇ_ñ@I¥TyM÷5ÄÙI6~:g]ÐMKrÞÙÑ\ +ɬ(šI]}ä^Î8°tîÀ¥.Àã·OÓÔ„®0Å<Òµ_Lôœå]ÕyÌý³hZXI6ÂÉ•Ýglž»J÷aâUÃ8^¥ÿ¦¦¢^­âÞÚ{$D÷2zJq±pa^ZëD› ^07ký>)3ûŒ“Š[©©zN±wrP›çø¸Ç¯1À‘g¯*p~#+ê¬0ü ã^k÷Ñmô6®ƒŠúá¸õâv ð‹;ÐoN^>Üëm|®Åß}7Ïö÷*6Þºû |zL½,,ÌÔõ%2ø.È3j)ÈÐ'¯øá1Ä3æÜY=Ø?ï™Î4°Ô"Ë<Ö÷»ýyýýö"7>Ëö¯_¿n¼Y.ÒDúiS¨ÍŸîgL¯ì&Æ=ÿjf“9Qü*рݟަû©³|ËTc&C®ÞÔýtQuç£h!Þø|÷ ÷8¾Mf ¤CÿþfFc Nñ7>¬›ÿ©‘ÞkÍØ üä3ú¬Ý ½#áì7(î}Ã09¬g_öÛc%²Ã%bƒÕ-4™OîQ~x/àv€Ûjö¼Û‹·95÷líA Šw4»¡sÔRðßlX n¨<ï†Ûê$ö õ0½±åˆlbhWZOñÞ7#ÄhB|~ýéåÿ V° endstream endobj 6112 0 obj 10716 endobj 6116 0 obj [412 /XYZ 40.7999999 593.299999 0] endobj 6117 0 obj [412 /XYZ 40.7999999 680.659999 0] endobj 6118 0 obj [412 /XYZ 40.7999999 76.8199999 0] endobj 6119 0 obj [412 /XYZ 40.7999999 593.299999 0] endobj 6120 0 obj [412 /XYZ 32.1599999 220.819999 0] endobj 6121 0 obj [412 /XYZ 40.7999999 193.939999 0] endobj 6122 0 obj [412 /XYZ 40.7999999 76.8199999 0] endobj 6123 0 obj [412 /XYZ 33.1199999 218.899999 0] endobj 6124 0 obj [412 /XYZ 40.7999999 193.939999 0] endobj 6125 0 obj [412 /XYZ 40.7999999 680.659999 0] endobj 6126 0 obj << /Type /Annot /Subtype /Link /Rect [317.279999 97.9399999 336.479999 105.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_commandline >> endobj 6115 0 obj << /Type /Page /Parent 2 0 R /Contents 6127 0 R /Resources 6129 0 R /Annots 6130 0 R /MediaBox [0 0 595 842] >> endobj 6129 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F86 86 0 R >> /XObject << >> >> endobj 6130 0 obj [ 6126 0 R ] endobj 6127 0 obj << /Length 6128 0 R /Filter /FlateDecode >> stream xœí]I«ä¸¿¿OQçÀx¬Å² !0½r4ÝCÈ!Ìd2 ÝC:sÈ׫$/%ù'YË*׫z ýÊO¥í¿o’¿ÿó§žþýûéû·ŸþsúÑþ~û饮jU›ŸÓùßwó?p] n>¶º©xwþ9ýøõåÛéÛËÇ—ýÿß^˜ºt´¿úÆa 3àï?þöò½™üÅüåÓÛ¿öŸþwâ§¿ôO¿žþþþ×Ov¼ó¾¾èN?|1g\÷óOçÆ_^þö‡ÓoýôeÜóÿßÉ®S­P›ÖñmìÊ.ÿæ]ÑdõIqÙtüÄï×Ùôàøï¿^~îG—Qu’±Vɶ^=jËÏêNŸºVºÆÓÛÚº‘ØÖÚ~§Y:¯ˆmÚ«e‰ ÷¦ÖÍe“Jmü8ÔVx5­ìò t^Û¶5 ùÀP•Vö~^3‘>Ï¢kÑ3W-{~õ¦ijÖ ŠVKøy>8shÝ“D/iìçþ½°Q‚Ïäð­/³g©óólfÖòFvý4ðóõÌ=2¥ä03S=6†Éœ%/3ëñóõÌ÷l'›ùœyÇ3˜~µxÏv¾+«V7jö †o}™õØî漡ô8³¸lÍNvý Î˘zäÞ³™l>¾ùœwÇ3˜~ðžÍ|WxزiVëzÜõøpÙª¼~гÉÇ>[w~Õ ÛŽjanæ»~P†èf¹w>@ÚŸ/óÎgÀý:<àô6CÈ&Boê¥ú"?j={`jš|곕¿ÙŒÁͨ /¦¼Ëu,‹/ì|`rÆÝù2ï|ܯÃÞ¹™ï !Û…›èÏA¸É¹ Ôð­/³:«ëQ ÷úi’gÎC= Yû9ëžídóñ­pϺãLŽ÷lç»ÂC±fvmä\~Œz6ùØ'‡@·È6£0—¦åꡞlt/ì|„´7_îÏ€;t¼ó‘ÞfÉ Ö,¥›9—Ã3fò©O>0øeT»Y3ŸóPO6‹û;™œqg¾Ü;Ÿwèxçv¾+„lný¨3á&'>>¨á[_f=rô³Û1̬ää¸õ(pÍç¼{6“ÍÇ·Â=ëŽg0:Þ³™ï ÛÅšÝõð '>=èÙäcŸ,]ÉÉH`.mËÕC=IÛíè^Úùi¾Ì;Ÿwèxç½Í²]¬ ”nä$ÐÇ#fÄ$Ö²ð7›1¸ÕlÖÎç<Ô“´ÍÀâ ;˜œqw¾Ì;Ÿwèxçf¾+„ür‰®å«ó)¬þ-ÐñÍç—ï?tçÂçŸOÌä!̯Ï__ú%}wïÖ}ëO§?ÖuÝüéôù×YIÑ66qaZ»´0>4M-Ý¥E¨•û‡÷—?4•àšñfÖ·–h¾š_ZÚªîÜù¼áßšA¦?À]pWâ —Æ[wp­vÔ÷Ÿ{¤oC!“B,2ѹh|w™¶«wA -5ny [ÞÃ[:ÔÂ4\5ìS¿IMè\HA|ÕË-#ÙÏ©Ý91p(ØçaÌ~Xà>Þð.·3Aš”à6á M9çs¤h ù£Ý›ºDçQ×z©[†SgzQ´Lƒ°ÚÅ6î»AC`R h$o– ¼ðÄx£ë—ä3‹§«\^ôww^aFe¬j¤:/þŠðq£”Ëǘ[9ä¼Ò5 ÃòêmЦ°EâU?-‡¸å°4”ÍxÕlcÀU` ©Ó€ûÁZè0z0mÕ ›ÁfàÍ0+Ä£€{À²F`~ÎJåÉ…©óLVÞÄó`ÜK¸jk‡¤QƆäM Œm¬ÁÄ»ÝýíÒxŸGKwή¿çyf•o¦z–XB`‹! ½1ÍÑMP ZãØ=øÀ ¸’xÃØÿð†—î¶X¸îèœG·‡Q@¡l ’]ÂkŃ„»ø >ëzkMXœ×§ F7¬Z¶ØQ‚†‘W÷ÃaÈzÊ>æ Ýó÷ëÕÆ%^´‡1,D8†ô†ÈŠO]qI“ƒÏ‚ò;Š˜nA)>ÙÁÇ…GÞnЉ¹ŠÈÌBfÍä@IûØZÖˆ_X+óÄÌzi_|zdpOÑÉ㪠Bt7ApˆM2‚©‰[|Ïh—>fÊŸÅsë ,˜ð)ݨ°ÃÓ4<¦>LÂümÞ7 @0iHÐ=©ëõB#gêó°å HškÝ8Ò¼PD#€KW—úJ"ó~œGÍܾVǹÇ=<£‡ npêÑ ‘´¬Ué®VÙX9°ø áÀx”ƒ‚“<¶sŽÿÌ<¦9=ã|½5œ¶Ø]GÉi‘²<¼iB„,E¯÷4Sª’߸Yœ'Á×?Nœ:¡Ê›‹IJ¦‹V¸úwP¾Ï% ÉôÖ˜Œ­`vÖ@á¡d$H¦¤¿a‚—çŠp(¥6x4 ÜàNNeSÊLp’;[ºbõ5Ž$L*¸¼îŽAz=#£×ægB¨¥¤qÛ¸}¡„}:ÔǪמªeWN®xG{k=#éÅÎ? ›GguÕ\œ)O«J\ôÞ¼EXÈUãx`oÐÚ¬±³4O)GX«¡€å®“ ¾õ„Moñzµá“ H±¼"žë R Ø„@ÜLÅÇ- ¡Œœ¼QƒhÂaSFoC˜…Ï„-j¯Òc}ßRX¦öŸp耒ވ†²¬‚¡·§DW®HÇ/¼ 0åt†' vi ƒYªJHw£gö¼ª/ž²|V'ÜÚpا:aKœ)Ë 1{†a)` ¸ÆŸZp5ÃHô Õ ëùšd©ìó5Ì­‹ÙŽŸ½#q[ºA´§Ô×Êû¤¥°'!ã¶Å„|†ÁŠÚù!¢ÔºNù>eœ,<.9Šš YN…dä¼U¹쌭¯)Þ¢­}jñÜü¼Z¦ –¶>â‘’L,cÌÍ„@N^'ë×µK'…«]l\³öâšwí o2·Oû»…k‡)ïÚzMÖ@¬7cú7Á¼¸íªs–Èéá£É8ÏŠ³Š8Ÿ[ï/Æ[g×)f¥€3G zé3e+ä8æ×åL(úßrVÔK¬èØ“Îáƒä)ždO…»ÊóB¨Ðhû_%ÙJ“÷swbÛ2d»—¹3jßíiærÏþ3jŸcˤˆ{‚ z!E7¬°¡—(IWØb-Åö:nð%ÊN;_D͸Ö@53!V°(Þܽ ”Ù‹vg¤¹ÿ5jµ‹·,¹.|J6~ô0!D'¨ƒ¬(ÒŒ*†ÜˆðçÝ·¡<]âÝ·G ì$ÑÁ+½ûvg×®f«E ¾üö•Ú »ªUÛƒH3;-[Ö.|ö©éñ8Lyû³O öÉzöiJØyó˜>¬©Œ}0[>û4D{üNÙn²»MÍùÝäŽØËz=âeD¥*26Ô}S®›J;§\OF¹ÀrKqÊë*ßçÂ脪ë•y+Ê()·oIé7åž¡V}Oao‚õ3iO ówô@Â#.ñ¦Ô}¶•¢¢rJû}Òž¤àFüRõ„kÏ7€3=Ê5·˜¼ˆ%¼;EÈ›s|èmTæÒ§B%(oðž,/BØó\î®W2¶ŽÜ¿ {|K‘Ú=˜ÐëçÊB9¸¦ž®¾ cI¹ð0Ë öð÷1Ÿ³Ü§˜~p‘ÿÚåFzqëë8Qšñš·6ruSؾ¦‘¤ì}¶à|ŽòF#¼-› ¼kç(ó`À`FgÉ8Îbb¸áô†­IßO w„³‹ Ñ@ ¦kŒ…'DCU0™X¢k o3 Åã<7¡$ ³boA-qmdÃDÅpàí¢8eq‚Ó¾8É,!6^®AÁU ˜Ó1?Ã:L}üämÁGˆâ㟧˜v0$®Á¥7‡5¥%ðb,‰ñ!ܛ›¯ pU1ä…ÓèÍ÷ƒ!Êñ1훯:€¨epËíWM’×ùªââ1ŒFm°UŸ-´–¼Q”C{ ØçÇö:^¶ó0Ü(V#”(ï:Vÿš7Œ¹@­ñѽ™¶‰Bäözó¾¦eBy€– g.°>ÊU2iZ{3¸tã4f•á³N–¶e°mFð 1e‘“Šœ‰ÃH+RžÀzÇ÷°÷Z(ŽBñgg­²zã³<„˜Õ³å.ZöõܤҎz w+e<62ðù,œ>é ‚CstÜ ^š… j‹åÞí×ðé†Ä£ˆ›ý•?»K¹^ØÀ ð…ï eÖ#ƒ°‚§‘ñZ•ÿt‘ÓÃ(’¸Ãk#´¬à芼=£ÜÒg}ª­§Úz¶Ü@mM÷8=ŒÚÊì³>–ÚÒÝÑewµ% •g”R[yߨ^ðÝܨõahŒ$+œ$|Rù”T a™í6¢xiÎù*¼(o=[H–đ텼nîíܧՖ …œÃjRE¡øl9v ¶VæZœˆ§”NQÊ ³Z"¥ŠÅ3Z»q{cz-üÍuú‘[^›½‘·D÷io eoèÒeÏ–ìö!¹9&0ýSb"„‚ß¼q·hUÌRÂuƒš¸ø_Ù^0Š'ë{(×} ¬k1AŠ-JI¼x5Naã¨:Öý1î.EytËÕlל¯€¢:¬ŽœM£ä=:-ž$%›LÉͼ¼%%øX\æ@R®î_‘÷(~yË.å.e :&1ô@x4‚º¦5¼ C¶÷PÐAjÁ% 0?0ŸQ&¿ø&,̱ÀÄʉ ˆìBÆåM\œœÀ+ H;LU áTuàœîáÕÖ(†žj‹¦¶J]¸qx…ÖÝCX±–Û_õ@ˆ;‘^ÉYèÒ6НCªÆÕ}”JÂe]Qÿ¨?7lËÅš‡n9jÜ5Z™Ðˆø%e£ÇóV¦QÖ¸‚êæÕGn92Ue>¥RˆªŽaö?Ç‘òGŽÅSh¹P,žrV"P1€í gàPLÖZL … ƒýÍó>åu;¸}­5UG>/ÐtÏzìW—} ô!\3‹u©æ® P­^JÀyvɱîëãžÇkûteƒC¸ú±r¬ýä‡Q¶OÕý,m¦ªîb÷£Ý6S&Ç:‰¡ÇQh¥^wðX M±âu×wY4ôTÇV%øJË|îQ¡Mbè©Ðr+´g9‘UuâÇ<ˉB}HåD„KÒåÍXux3 ¶^™R?zÙ’jĵQ¶ljº‡³G£Ðaðè›~Ë`K¿ÖBÞC§Àðu1”ĸåÀp4‘PBqû“6‡‰Ûîì~¶ÚPã~î? &nÉZýxt'³­ï¢Æýn ¿–¿ÿ2+¬n]¡ÝæÃ–>q¹„*Æ ª¦7¢še2î²äì/–±Õôé}¥s¾bóŽœWJÖýŒžÐ™u¶)Vûßý[¼ oñ–„ñaÐï4\öðù `g ¦@ˆSë_ÍñŸ';naÝ‹ôRìÌ"zº¯gääÚü¸¬²ÐbYFVmãö‘é}ž§ƒóXÔ°A̸HÓ•äL_Ó6GóX©J\hÞ—s=¢=îz‹æ ¬ £\VVŠ »3hÖâ`]ÕZ9á.·­j+Ð.œšéðÎîYwõõðN Ã×Ù¼i,8hˆ­ª½àh?ïÝ=»@°Jñ,/ &¢äʲ‘EÐoÐÙ½õØÎÌ#ÕÕî´`EleiÚ3™—úàà€!$><š•°3lf»­Cž1;Ñ\¯›ñayîbf«káF$li`Ë{È­ò$œÇ¦,<ÆXÂn[À,g¢5€f Nƒ@k5,Ã}òÖPठ¥òמdM,ÅY`?ÑLp!lí)E]ëJS¾›¢sûŽ ÁÊñe2üª ûê5ó¹£2OÒã¾Þ4^_¼l¢yƒd‹< Ô5R8¨³rlÉ¢w-c ‚€\l*{àðæó#¯uím]¶Ìóa9 ÍT#]}EïøCäÝ2îì:dË"01mwEo'Qé’È/90*fýøZ“=ßU ŽyãâÄ]Ѩµ=çÞ¸ÙŽèì+%:›¬y,)Ñ©.*%°f‹k)¬`²°FŒdÖ0x€G²Å¢æã”Ì%Müð¢Š^ |!æ—bèaCf=8Žõb¼'èw>ùÎ.­±¹L½¾H„óF›Öy¤7·;Ø®5AO¥ÀÓ³\FÙÕ½ÚÓ¸ã#7Žlþ¶WâqLìèò·k˜ïóæ=;¥öà á4Å‘Cáœ)¸^7®0\‘l ™DÍwÜ[èkqQÂ’c¶U@>b#êÊx˜[[ & wiˆî—7·!óȹ8‰î¢ëޝÀö,vQ®xjÈ\vZ¨ß 1ÁêË`{Úžv·ä¡|½àôŒÃ}$w Ù.iŸ žùÏŒµf8¼¥¢´ŠÍML´;»T¼˜Õ¥D|KYep‚3˜%(EÌúå^…åzžbo6Z0Œ„g¥­Ïh–†É„¼[8œ9:”yˆÓ)FJÆLø*‰…wîªØ/½âŽôÙ©ªÁÃ!ÆÔ¾¹JßòŒf)TœbLmpª´C‘\„—;ÙîÙ5S{­z¿8.$ãኘñ ñ,9&͘z(T·ÖÅk°—ÇPnA'•Ç£‘n„ÃF;>CŒOt. ¯'¼‡ PÑÂ¥ Ø©Â.M‰3¥°n»uiüXuÛ3i÷¬Û~Šª˜ T@î à‡ ´ŽQ­zz|JÄy0C5LeêÑî!†´*ŒŠË26$¼°ÊMÓ[Cp$‘,¾aÜWßâ’¢±b¶Uþá &+ï(¹Fˆ&À(Õ±ö8ôRÊÈ¥*iÀ+ƒ4"ÿ‚CÖIÑPÏ'Å»HpËWØ–êãý-d˜¬ÎfͰƩV ÷G,Ôö:ÆrÏ•F›Š p¼}ËÉB|?°a¬i)¥ ªeG%ÂzôÞØÐˆ²¿™¥úE@‚¡$‘(quÓ#ÒŠŒÂ†Ó;Rl6Jô;Ge÷ŠñÖ¹ñvHÞpâ’$R׃|EÂÉ5â“pžjÅR÷Ë #˜´öó)ø«K#½,xGñ®…vÅû† 2‰ ò~KµòQε½š8BòË‘H+a?ñ=²Þû†¥’ÎÚ9áþåÀ½Õ„Àb ÞLÈPÞ ±KÏ(X×¹8#žù ìjPó—U«aëW£já®Æ &yjeª_³5f·VO[;¯ð²@y¾µïÔ/YÊù¾¼|  bž—p µ-ç;V„qª·£orÔ²ªO¢æozð{¶"ïbBĆI¡X®8þÓÀÜ*Œ¾þ~š}®°ð‹•N¬îþ-/Mˆtá7Éñ¶kPx:F§äqdõW¾.P™¾vZÕz¼wáö×NÃàk§Ù”qq²4ø:èÀµÓà 쥦ÒÎYµÀh³Äÿïô­ÇSØ_?~M2Ÿf–ÙÇ æƒ]ã$£N¬ßÆRéUÇ”É3žD=–tÚ»ºU¥–ýÓNVo‰ÅÛª]Ž_µ -†Ó„¨xç$׬Ào*e$ŒKlKóhاƒ} #´¼âµ¸>¨öŽfÈÐ?Ô¶ô]k4-ìðêc•ÁR Cû°$›ÖÇb,eïó»7PÝù3oØX¸ÐÀù0 XµžDöKx°x©â¯€38ĉR|ê…k£¸ƒ0Þ; ’?¤†!èñOáÆ(må9­kU±s Þa>(j­u³”Ù sêÀÓÇ—ÿä$Õð endstream endobj 6128 0 obj 6135 endobj 6132 0 obj [413 /XYZ 32.1599999 559.699999 0] endobj 6133 0 obj [413 /XYZ 32.1599999 264.980000 0] endobj 6134 0 obj [413 /XYZ 32.1599999 657.620000 0] endobj 6135 0 obj [413 /XYZ 33.1199999 557.779999 0] endobj 6136 0 obj [413 /XYZ 33.1199999 263.059999 0] endobj 6137 0 obj [413 /XYZ 32.1599999 720.980000 0] endobj 6138 0 obj [413 /XYZ 33.1199999 719.059999 0] endobj 6139 0 obj [413 /XYZ 32.1599999 657.620000 0] endobj 6140 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 612.500000 147.360000 620.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 >> endobj 6141 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 603.860000 117.599999 611.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple >> endobj 6142 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 595.220000 141.599999 602.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs >> endobj 6131 0 obj << /Type /Page /Parent 2 0 R /Contents 6143 0 R /Resources 6145 0 R /Annots 6146 0 R /MediaBox [0 0 595 842] >> endobj 6145 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6146 0 obj [ 6140 0 R 6141 0 R 6142 0 R ] endobj 6143 0 obj << /Length 6144 0 R /Filter /FlateDecode >> stream xœí]ͯ䨿÷_ás¤é1`À–¢Hûæ#R‘F3RQÑÛlV«y«Lö?`À_ø‡í2vwï¼Yimì‚*ªŠ¢(Š·þüÏâß¿oß}þOñìÿ¾û|)¯¥*Ý¿Âþ÷fø€×WÁ]Q×òÊû¯x~¹|+¾]>]>™ÿ»0Õ~èÿ˜ÊЄøÛó¯—·®ñ‹{òùÝ_Mé/þb~ýRüýæÏž}áåR7ʾºãŒ×æÇ°d+¾üíů¦ u ×þÿ,˺VÕ®~|ë>eíÃOQce¡¸be]0ÆM?¥!ÇÿuùÉ@ëºq•%3è躂åaK†ò--ì_‹s­÷…ÊáïÞ°tøiÐ Ó\V ËãVê¢á¡†w ŒŠ®µÚ—ÆíѱrMôpm)^žZ/®0W9¤ê."VUÁ+‹•)x¬_¨mÕ×ðÎNêI^°†û–Œh†º’­ýÚ½—-×DØ–ò!æéõÒæðj[診‹3¸ÇÊZh¢4|ɰ…kŠçÀJ„ájÁ9 ¶MôEGÍðfFÔ<í:À¶”µ@³WšÇÍñGGÝ]¼XJå™Ñ–œl)þÄThMªØ­î­èhÙ¶Ò½ „w³"¨ØÁn‹Q Ä{q¥y ¿tdÞ­L H¯M:y¥º­ýÚ½·_QÊ*è.)ƒ*”ªÊk1Wʇ›k£‡ÜjÊŒ¸ª9e9‡›k£§înÒâÖ–z‘E+ç®=ž;FÎÂó´´ ‹-]Û9ñó4ì ·J3#vå¼ÞœÇÏsKOåýŠÅqg[ì…:™êš”* –FWyñ³=Um;Ⓨðn^,5;àNæÄ²#¡W¡óXzîéɽWÑHUE£ƒ˜‡RÝÖ~íÞÛ¯DÍÌ·Ö”AQ÷%[ûµ{/'n®r«N3â¨æ”èn®žº{•ŒÃ­-éN¼CÑÊ¿kgÁN„‘³ð<-m#ƒ¢£kx3'~ž†äVfÄ®£œW¢óøyn驼[½xîl‹º“êPdªkRª,X…åÅÏBôTµí Š^:»y± Ôì€;}šËŽ„^‰Îcé¹§'÷¸ÉZù°¼Æ…S[׺`Ì´Ì÷úo’ÍÉNm†Ü ?§ë;ŒbÌü›iæÓ²ƒqcz÷#ºyQ± 2ö^&iTY›q†F«¡"”3€Ž¦BÙS{*„~ˆbØ+a¤ÿó]’^ÚBÒOÝŒô’ËbØ+y·¤ßÍõsxº7»¤hBîæ@G<4Ç{åïˆ~KÿœvŒbMŘV•.WïniÞÂ4VXcÌ/c^Ó‡| *66j4ËÈöˆíCÍ[§AQI¯KΚr‡´M@íÄ´ÈÈöˆíCÍ“>*£piÎñ":®x 5u¼q¼‘œÒîqMÙj{ÄvaÆB"Ó½ªœ8±W©u vÓKk™íÛ‡Z |jÅ$5^ð>ð"e‰<}¹¼ýXÛ “/?™nØê7îÏ——K%‹76úÂHå—‹?–%{úSñå—KsÕJ*.ÛÐ_ó®­ÑײZ–ÃÞÖÔýƒ“å‡öWÁkfÀN¿ýðÅå9cWé"qƨŠ÷®SåUiVëA§Ä‡)BS 1BÜ¿z­›rB@ÕÖT×Êѯ¯)?MÕL±/pâTj„½ïÍÜ@7mºò–^C 0sàè‘ !kkd ûhåÓt4Ë\änÄJ±q“ÒÓ5¢­g¾ r…¨Qf+V ÄT¬ôhÊ€¦øèµ‡œvµ°æ¬ùk~€5ï·C¸oÚªaÕpøM‰é{íŸêÌÁ×Ëè±¢‡k â ·Iâ5ÊLM…Y ~ƒY6AØ7ÜÑ­¨„Yu;MÕõSºy¡ Šh…òc5£‡øû©šs¤«úœ"‰;A…=JhS<#Fà%œl¢NCüè`zBŸkÖÔO¼Œ<úWÕtzL'?¯"·ÑÎq_é@ŽÕ™Š•iãPÿñjXSA½$$„v¸Ž±>‰ŽyšÊÓtEЖÑ2$Ö X׳LBö!xÌÅ þŽž.5eòÀ‘ÒRMF*VgyÕ !‚9œP›Ñ‚tF_¯}B]ÑEH`’Â#|ãåöø…7Æå¢(Á‹eŠ` ,2ÓIæu(ñº¶úîÖVœUËH4°« [à5dÒª ²”ÄŠ³^ÝÝ÷J­Q¡ŸnÚ™ó’59fm¬_±Û Ï¢9 ûcÖŠ÷;ŤŒ)¸™ÄÒm=‘c>]îa´NЄ1O¥H˜¶H×zR<&bçFÄûW>kLáÅñㆠΛØý±¸Úõ&×\§q_ ÚHþÉŒUu,®;œ@³òN â@Àã²a!‰¹xiØW)f, Ñàà)â$íÉÓYD÷Sà³°_*¼N$i* i#KP¯f—™Ì±ŽªC“>"‚GôéŸxIUSɾÒL^¦£h ¿®µ1U»ˆ™ÒŸ5צn™bJÿAƒ>Æ`Šw?Ø8 ÇYÓ¡iÉ»&ê†ÅéNTh,JmãKŠ—î·Y‘Õe¡´ý£s0l´®ò(exò|QòÊXÃëšuoU#(Õ° ó¾ÿ­ìgÅäëRNÛ0OÌ7ãžØ·š”fÜÆÏ—§?fS´,'ÌàùÚàèß0ÇÃM̬»UXøØ¢9íi«¨ó‘¡¬/Ö[»æBèƒðJ€ÉÐë¾[»OP/[qÑŠÇaÊs•ƒÊ¯îE"ñ«7š2YµžXÄb4P¶Ç­Ç„Nإ `y”²øMHL˜°9µÇ/?%g“¹"1v‹Z=ÚŽåùM³Êâij‚ÏñðoÊ<š%¯ÿeO_wÙ­WPíIªÄ’$Å,NÙŸ>#T§zª}S‰Yq´þ4ôœb°_Ðìo3ío¼zŽzEpÐÅP×ûÉΊq9KͺL:ÔUíXG°±Hnڢ̕˜Ó}#ø,Ò-ÎU)ÆcÆÔ´wÃ'ó{ÓR_u3Yr9¤ÅÀ¯#:3TбDZ'¯Â:7¼7}Ÿ<'ÍtÁ¯•ç:7+|oË+/Ç}óîAË䓚îïÐ7ó¶ãzÀÕuêãÀßgsÎ,¬½3‹+sì˜ m±¿ Ùã2Ó¢=)®˜w™…ß¼uvi6tTUª*t9tgÙ'ÏÕ ^ö™ª‡PÂ/\fþwé]£¯e3mÃD-è(ë¿e6/"Dõ&Ñ•¥3™ÐÃkE7ë)·œ•2vg‡"¹å(ÑL›Ç3S3›nˆôÚ@úõPïqo)ë€>9i?:±/œCÊb]¼Y´! ûœØ€à*‰W£”³ÊñIr{¢ŠCO´Ue~3±¥X]±Ã Ìb,p"ênù°e–âÐñÍ%U fÚõÎyеuZˆ *«ñX£ýêèÉ4DÅQ„ÓA ÄÁ}8xp&Dy"úhÂÁ»Â³7­"-<<øq!üq–ÎùgÃ.àXʨsáÐ Ò+s]Áãð¡ZÂop;‰?˜çu³Ö#³~MyŽûb•Ïå»ËhrÖaõ!&Âü^¿.Ù‡¹hx†Ú{ä7»ÆiGoá‘eœ(*Ñìu"…þ†pÆC|­ñ‘e< ˜¢¸ö A|4šeœü+kê­ÄøÀvp¯)£©“8pi€{@HÁ–ÀJ½×.çè4ÞMŸ0 ƒê'(M Í…{€G Ó ÷k.ÓFZœ¤‚t« >Nš…Ódf œœ+‘‚ ó(îÛÙF‚œ‰fQÎðã$ ˜_Z‘0 ãv9héNùqð DHC"°€%ã$™¡Ì§ÉL6§È ™‘õ"E5" ƒ`ai¢è9 '„^g¶ÚðìH°Äqb#Êh3LÜÖªØBÆ=À¼ƒ9B»½õŽÓ]RVdX~°îÌk q(sbJ²kp;X¯ãÔ¢˜Ö„ù=‘DÏÈËÏ»ù’|­˜Y´^­{Ö5xNÇ2C±DVÖëxnÃ’ŽñÁ)|ñZ [/ØV…øÜ Çvi‚üá÷SZ­EØ™úŽV-ÿe6ÀÐëLB¯1u(+*ìoÄöÇãóº>#­Ïpßnï ¢øÄIú +W¹â­¥XìɾÄVdÖU˜$\÷‘y„Oœ“kÝ:Ÿ9'7Ë÷%<÷ÿÿ)ixð­æÝ—Å3Z‚gñ\‡çTl Ý~ñ!­»ÄÈ}?û¿„µÉФhö¼t#øI{€ZÖ½‰¼v9‰C(;7ø‚‡ü,®ÂþO Ç'¨ó°Mz÷º£žôÁ/™ŽÊÕe™7Ñèò¤÷H%0Üê„ÁrJ¯,yí(7[-Ÿɘllg‚»(î;GŽÙ-÷lÜ_ºŠ-{0ø[åã:;‰Ørú­Ù>V!LÉ*ŽìaêRvWÈQ6Pï¸FPÜ×”­œ¥ä…Ûî7íÇîÊÍÕ#÷´À훇¨'Æ”âæ¤äxÌÅÅÅ—Õ¹4Íu¨ŽÖÕ2E²†¢£ñÂý17œÅˤ+Fñ…¥„ I޵êIΠ܃ۻH1ųa ™ÒŽ èu >„ÅǔҦ!h(o°9eÓ-á;ï¨6 Á»™)o?ïâà"Òv'Å^Ïz¤ˆ´.Ⱥ٘˜õÎ ºÐ¬O$s¾ÌÌåXÃe  …<fG|¯6¿Äó¦Ä!6„äµ×¿«/aSV&Ø;A8N²³®fîÃ`Ý} ·×i¯òUC¾jÈ{Ѥ5îïQCÊûÑi§­”(¡ÃXj±¤/Õž×PsÖEŽ‘òF÷%G™öÂ33Ùì`j?|õ±?ñ0MAhëÓâW}Ò0ga”Åðn"ċĚëgÉãàn{"ëéÝ߀°3x€òá3L‚é/”lޔ؜èNúÓ“4žsƒÜC亄Œê/ÙÚtåI"Aðý…ï­¸ ³E4)`ë“^G±†Ëw÷æ¼_þÈËŽK=™ŒŽ¹¢u‹jŽn(Y¾VKgÔç©zÈšz>U–«.(!„9oFØÚšõF¶“®Wˆí­é|J¹­}Kúõlë‘=W¥.ÊØ–7…¯î¹«v\“•+)·SLRŒÎ†ÀÝl;`Këšfŵ{¸k=Τ ²¾ƒ|ÝZTËçÂqMÂíƒ(!„,”r ‡;qLTçÊ{Ö˜â8¥äÇYñ²f"azÏgÅ*ÎÇ ¿Fa&æž=G6r\ppÌ âLõXép†#¯zL¤‡ÄbEQhýïLuóóÒÝèªéâÉqDAÕ%”-Nh„ã³(ÑÜ”}Ùß'áh> endobj 6153 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 129.619999 151.199999 137.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 >> endobj 6154 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 120.979999 163.679999 128.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 >> endobj 6155 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 112.339999 164.639999 120.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 >> endobj 6156 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 103.699999 161.759999 111.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 >> endobj 6157 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 95.0600000 249.119999 102.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 >> endobj 6158 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 86.4200000 169.439999 94.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 >> endobj 6159 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 77.7800000 171.359999 85.4600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 >> endobj 6160 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 69.1399999 124.319999 76.8199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 >> endobj 6161 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 60.4999999 207.839999 68.1799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 >> endobj 6162 0 obj << /Type /Annot /Subtype /Link /Rect [71.5199999 218.899999 90.7199999 226.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://docs.racket-lang.org/inside/index.html) >> >> endobj 6163 0 obj << /Type /Annot /Subtype /Link /Rect [388.319999 218.899999 401.759999 226.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://docs.racket-lang.org/) >> >> endobj 6147 0 obj << /Type /Page /Parent 2 0 R /Contents 6164 0 R /Resources 6166 0 R /Annots 6167 0 R /MediaBox [0 0 595 842] >> endobj 6166 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6167 0 obj [ 6152 0 R 6153 0 R 6154 0 R 6155 0 R 6156 0 R 6157 0 R 6158 0 R 6159 0 R 6160 0 R 6161 0 R 6162 0 R 6163 0 R ] endobj 6164 0 obj << /Length 6165 0 R /Filter /FlateDecode >> stream xœí]K¯Ü¶Þϯ˜uLø”D (`;N. 6ÐEÑEᤠŠ8¨ÛEÿ~õ f$RE‘œ™ëë¹÷R‡çý ¿ÿãÇ¿Ÿÿùßó÷ï>þûüÙþ|÷ñÄ.¬aÓ¿óðßwËÑ]¤˜~m;}føwþüåôõüõôáô¡ÿÿ×oÆíþá<ÄÔá?ÿvú~ü4µ||÷çþ·ÿÅùOý_ÿ:ÿõoýŸlà _Ni†_~~á‚‹®ÿcùÛðð—Ó_~wþ­ŸB7ö;üÿ;Í3FšÇ×ë§|üoù)ŒÑ6B9ýý£e£ <ýøÔ+fúüÝ`×õ/|úéü{ƸúÃùÓ¿Næ¢ûýÔ“Ñ\â {¿ià7=o ãté³=‘f|òþS¯Åw«×°è—?Tœio6ÀŒ ?Â'xWaoX½­+£kÓ ÄfÑzƒÔØG¸[¸7fÒ)š½!À ó ·Ápƒ½I.f€g© C &ü 'ÀÙá¬9{%^e¥ï ß@ ì|BA€²poxO)0àY1ž°s˜óYnYE´\½êc1ë¡èpÊðNˆåR†›”é+¢móÁŠzl+å“è±­ÙG5`HÅÆ!;6«Î–)v—ΰFhŸas}at\a¢/Rt|ý̈́ʜ_´jºþ#—4•ËñÔEM _¼:ÑPwkPðÕ ÙÛyŠélÌQ4è ǽIøã®ŒaaecÒÒÕûz¸ÛiSDß—°7¬Gt6,e²ZŽ‚ ³±àȯI+źÖÌ\“éÚÙ³$±•áKÐoIAS|«²Ã†7»;\ÓbäÕ‚-*‚! ÏÁuc\¤XTöo<>–¦qBh!ZÔÁ1­öq¾¢~:Dè˜ðÜ=°ETm¥°·VTØJ蘺2ß™˜ÚF¯­á)ëñ ±uÐ6Á»h­ƒŸ`S£qgï-ÇÓâßG/8 ¼»ãŠ7цgî( w×iQ4°pl…Álsù€vf‰‡4n-c,°9 qB'é0{÷©AA¼ÅŽ·kìE!ÿÔ+3bVwqœØþ–îžìòŸ¦±Ëã]qîß[Ukö_ˆôÍçñ%îěڹ«¹7£L»Í²,Çc–ñ<Ù•ÀÑ l ”V¥ 1ÌJï͆÷9Z@4Bö)&ü<]O Œœ-‹B  È0\;"+´)B7Ar{ Ä.{Ï pLJp"Ïò• „÷‹°bË[*X³zÜ,,}ãã5Õ š‡·>WØyŸˆã¹W<žïË)%daõxcˆ–#¦›¯‘`®´»ãÑfgA:—\:„îϪòVúv]<ƒ‘ Zíw QD‚JžNç…8AaK÷i’|b»:WÀm·„× WuœÏÉÜ8”HÛ®n\ÁnxBš,N?ÂÁ"L”ð%iΔ4ˆ“Úa>J 1²£$ö½ä!ÔY/¯ãr?ˆOI]ƸŒŸPè,ooÎ÷QB‹`:ûvðÿ$¼Æi/µŠ]³¦HWÍaÊÂ…½ˆ@Û²¼‚&CIª áAÖ¤Î@Z)¦¬oFŸ ÀšRððÂè'Þƒñ O´6|-KÏ©‰$- kÿòÝ–Y@XÅjÂûÀ Š|¯¤·Rtœ¼xðÒ4& îd†è7£’4t‚vX)„Žd•$2E¶eM]%ñJqn^ùƒy"Á—%ê%w¼ÝOþ&A‘RK¡&¼'Pó ì ÄK ùå`ÊzH½QÊð)<S:…«Òñ15ézåC7rw·žS:’|7/ ¬b$MpñR¡ˆ=/ “8Ö òjxÖ{ô\—%ê}Ì[Êüjñ† z‹×fæÔ¡ }Eû&ø3G* QJ|µÖܾ-ç dSqÛ1€£Ø¡ìO¥hSÀ«Bˆ‘lî¼’·\º†ìfIÕ‘,Í|PE²(E…#Áð@o8j‚ƒ¾Pñ)¥žu@{¡DM<à‘%KàøŽ§ÔdòÍùœ{úÈÚÂý-†×Ý®·ÛÕ¢tx”'8B…£”Co x8Gé±Å:ÚO·P[^iôœ¹Y¬BoEÇ'Dé0D’Ç )ñkÌ+Ù,ÖŸWÞLI,‘1t*á娹'õÀ] hèo(¹j„ (qvÊJ¼ óx¬iRŽo#pŠýò0™.iëÁ»@ÈR¯ÅwÇëžèŠ1 ÉÚ]jzi.ýÈÜÏ:Œu¸? ½M¨B#±‰± s¬ïãõ8qÅ£[;)U:Â5,?B,œr‘ES|q‘žWþôÊŸ²ó§jÙìY¯»Ô“äË%èø ÆO(qJB†ösÚ$Ü©U‡@à;¬î¬™-”¨…[ÖŒ‹Ku¨jkL”z‡×èÐ7 |ÕAƒ»ýªƒ~C:hw^O¤hsÂßêHäæPâ3ÇjëÀ·»Ö¤QÖ€O¡È*Ï2[~í]bÚÂz=ÎE|à¨?–› ÇÂqlïŽ@Râ³x(^ZÌûVœ¤ÔÙB àå„ì‚€µˆw›PŒã¦˜p„+0>çÏ>Á˜85ˆ2¬?üÙ ò@®5ÖÏÉß8Æ^Šä¯kUl®úÅYI¤ÌBž—Æ6%[(k¦Ù7tE$Á~ÀЩy>˜¼.׺¬1€}8î&|Õ¾lÙ•Tufz½´›‚ WèTriÊVÀ Ü÷ã^…täÓ2·/bÚ Pw•ï»]@{š†§$àm<~•yAuKsîðø”«öŽ\C½¡2áVoCÿ>u_½ó.ÉÍ _¦/JŠ\¹žA‰kÍZ‰ëØ–× WÁê[<%nxK­zQË1®J\Ûm)qmëŽÑ·xJÜð–YõbÖcTPâºë{o >oWx·Aú,Ò£çx1rIb<6µ)¢"j _ïÀ°Þ• #f½½ôÈmåþõ†žR³Ç¯bfd#Ci—”î_^X‚ê|ÕcØ®d«ó_…pöWµO}nƒMÛXD„©A°ºÔ4ÞìŸ$X¦Eµ9á2{,§±‚¼ïÃ(!V›§§Ü¼› e ÀW³-`¶=“œ}<9tgC5“[rЀcó¹]³ ïÀEæ5Tå‚’ÂhíHŠ2S¼° þÙSÄ샋ýÊÊÄîeÜQÄŽÍ5¡&àu¹ŒÏvð·9nm?ÂnL%^ï±e ]¦DxÀrxjð¥øp<Õœ"k³F±ê¿¼·ýéázåpjx³ápj†+gÐÐâ:œÆ·Ôªµcv85\m8œ.½1¤çpß2«^ÌzŒò§F\µ= síÞ›Õ“æͪÉàaâs|^J÷½t¥{,òØû[¼ðxcËãᕬ¡€‚L¯,ΊÑñ¦œeÔaiÓµc„´'F¨WQðij%=OB9\?!àBqêÇ‹Cp¾ÖFÈoªÄi*±É€2JÐ}>‡m!¼ ¡€[àÞfÎã`”ŸöDsSl7œ@ðÈüý9tÕU€ãi%SÊ8»è²8ä±'ù€NØ~‚(…Hã ¬Up+ÉŽ°æþ?Š9eŽì)ÿÛ9ßK¸µ5R«°U¾ ó¸7i LÞÂ'81ÿ ²'HÞ©’}``F È…MÉÛMˆ߇2K¯ôÍkæpë$ éë9|Cr®@bÜå ðIB¶fJa˽"uŒ¼NÍ.r½.¬iôVaM£Ýš¡Ås‘ë¹°æÚ‹ZŽqu‘ë­ÂšF¹…5C‹ç"WW§¸^ÖÜÆ¨à"×sÒµ­’æìÒ´j„“ž<ÖBq0’Ø”õ^?<{ ?Cù<¬O d/Ã'eã¶)©EªT±‘µ^ÝO1ŽÉˆËs¸&8jyBDì¼`¯oºÀÊÃoŽÛg%}Þ\¹6Aa_ð'O|)P Wò?kñ&¥¶>ÁØO(ß«ªà}o™¨+ ã3nlj$èdXÛ¸#Ü϶ÁကhÍ{|LåBŸˆtÝ 4d²U—–F|ÿÔõÌ_/¦¤¡Ã# k“)3¨UÀÿmÀ ôpÌõ±LIÍ»äš×áï-¹ûVßMŽú¢ˆ G1`kÄ=ºv÷躭¸‡anLÂ0?îa®‘޹µã÷èš­¸G§Ý1ú/î1¼eV½˜õâf.)J9P,G»ofõf”aKYOÒK0iž³°âñâee’ȤgñRæšÞÎYœ’4ý'8áè-ΞÂßTˆK¸|؃É_Ìàã è& á5J¡Ç½bÉöye±IJM¢Xý6L8²"€ •2'<ºÃšø‘z®g¢¡2û—âjJг&àCÙâ;›Ñ8òË×ë)Œ£¬3¡3 c±ÿ5AÀPNŽ?šèHd)úP„ò1’–_'U䄈”UBŠbRò°â dŸÁ[qö^Êóaƒ‹(l FÏ“½=Nò€¹‘Õú¦øsm^¦ú¼B@¥i£YJJÑS‰œe˜M‘ǼJBÝüÇB(½òl—ûtg¡¶ðÚÞên½í\¸Ø´l™Û¸¸²|Å8¯X/ZÞ»Y k/¦SôµrìÒ¨‘ËÞ¾yŸØ'äE:½Yô\ŽÜXб֏ÇÄoÓ¶¶ÚF·3ï.lLnvmôbû73b€€— Aºü®„àñÖlçRþ‚¡ŽE\0D8±¢¨Íï…«¸®âqã)™i.À¢]—ÅÎ̱꘴±3Κeï§…3 ´^M ×#Æ›Èu:ëêÇ—Â]hLø1' Sp6´Ž®›æÎsêy‚ H8õ<0ÇøªÌZDZ¨´|Y±ÒôEÒ])x‚g· Ç[Ð%îb)©˜Öe‹/#öŸZ+ÎDq?&œ™{ÈIŒ/ÓO¯¢ðøîkK‘Ó/pí´Õ®zš³:b_ÃÆ_ixmkî­á SXÃ$Ÿ+`Ϭ’ûwE&¨GöÞÏß`æè÷{‹9z1j?hý0Gañ)¦é”ã§hµ„ãþRÒr+inñÖÐ~ÎÏ*[»U&m+ÇM¦>ºR<µ [A÷^—äþ wØÿ3”ˆ>Ê—rÖ.ÎËy¼ežp–´‚ýz«x=›”7“1ž2\o¿‘y0‘an8e?xã¶0g-µ—ÖlÞ~,… íߦâ tBÍÞO<à hÜÙ˜ÂÿؘœÛ­|g`#ê"ØzÖþTìvŠkôÁˆGJ@Z9¨úfªºtû÷Xqqnù²ðÂ4æÜ²eyÆÐòùÔ˜eÇÐÖtË^濚¹Äþ­mñÆúkå1¯åΤK.{Y¯Ã–€Ô¶äº©èд|æcØÿNÉð $R:C‚KàAÞõaÝXDdZ1Ç$¦  ¹a¾@¬çJïwjî`nÐ#Ær%-ºM­mß",RÎ-Ÿû¸EÝÛ[lÝ [3|a䈴nÂFŒ­'3¼¥×Ýèõ0¿8{ Üçz K™ÎÌÜÖ»Fˆ½W3A/‘²JÓc(Íf±N¬"ÑÖô´BÛ¾AúhÛ·ê5>-Úڷغ¶fFÛ¾ûhk†¾Ýa˜‹¶ö-½îF¯‡¹#Úö³hçíıáÚGž=z<-–nú-êfºn<¿5DÓ`ݾE7Bº-¤O7ã[lÝ [s£n¶è¦WeœaÆ»¶œÉŒoéu7z=Ì]éFè™Ý‰´PΛ%6=“`ßÔ®ZóO&¢¹’‰Z6D“‰ì2‘f‹Lwñ·oñÈd|‹­»aËand"Û-2‘;Lßâ‘Éø–^w£×ÃÜ•L”œÉ„r•\NA@9¦H†LU¢P³¦/ÆàÖµ!š(tã…n·ˆB[µñ‰b|‹­»aËanD¡õQhå £|¢ßÒënôz˜»E3ÛÉ£sÝ=zý2¸yo`|œCˆ³2âÚ øÈvïDˆç³Ílšñ”EClrQÖÎ|þ[û.ʾµ]»ÇÇE9¶5ݲ—ù¯Ùƒ2ÿ-}eß*¼1„뢜ޒË^Ö븫‹²ŸÅÕKS&A “Ç´ð!k”Ó›œG«GÄ q%ËE¾“ÝËr§’³F¤H·~ïÕíF: 뮞8£— ÑZ¡q=qfÓg‚ÔÓlŠczI8¿ú®æ½kŽª‚Îb.š³îÿûÏϧ·Õá-D7Á[ʲðNðú{3¸a•¦`ÜYÇÚÇÖa;ÇÝœM’á¸áEÀ­NÎ_{Œ9ØÙþøü%)•z1æ‡`NNðÓýdžæÌûio•ý›žGcÿ,ÙõÀõ ‚Msi¶óLºx»<í”h/íö©ÛíÆ“ g¤¼7ÓÆjúÒLûëbÓÖ8üÆÀo&ݺ^šŽ únõ6¡¯_ë¼õ®uØl¬ðGôe[O8Z‡¥†´o쎥¬}Yû|ë†ß…æíþnã=Åx€{ƒx`m¬ Œ·¼) ¢=ýaz`·ážZ›jkçà mVÛT^1½¦÷ªbsáƒu¾Fy‘ÔŠÚ­' ñõ!§ä98ýÐT7 endstream endobj 6165 0 obj 5757 endobj 6169 0 obj [415 /XYZ 40.7999999 423.379999 0] endobj 6170 0 obj [415 /XYZ 40.7999999 308.179999 0] endobj 6171 0 obj [415 /XYZ 40.7999999 94.1000000 0] endobj 6172 0 obj [415 /XYZ 33.1199999 500.179999 0] endobj 6173 0 obj [415 /XYZ 40.7999999 423.379999 0] endobj 6174 0 obj [415 /XYZ 32.1599999 502.099999 0] endobj 6175 0 obj [415 /XYZ 40.7999999 308.179999 0] endobj 6176 0 obj [415 /XYZ 40.7999999 94.1000000 0] endobj 6177 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 777.620000 124.319999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 >> endobj 6178 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 768.980000 234.719999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 >> endobj 6179 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 760.340000 235.680000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 >> endobj 6180 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 751.700000 185.759999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 >> endobj 6181 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 743.060000 302.879999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 >> endobj 6182 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 141.599999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 >> endobj 6183 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 725.779999 233.759999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 >> endobj 6184 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 717.139999 199.199999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 >> endobj 6185 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 708.500000 209.759999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 >> endobj 6186 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 699.860000 185.759999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 >> endobj 6187 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 153.120000 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 >> endobj 6188 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 682.580000 203.039999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 >> endobj 6189 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 673.940000 229.919999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 >> endobj 6190 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 665.300000 213.599999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 >> endobj 6191 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 656.659999 213.599999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 >> endobj 6192 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 648.019999 327.839999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 >> endobj 6193 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 639.379999 163.679999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 >> endobj 6194 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 630.740000 199.199999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 >> endobj 6195 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 622.100000 209.759999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 >> endobj 6196 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 613.460000 136.799999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 >> endobj 6197 0 obj << /Type /Annot /Subtype /Link /Rect [263.519999 511.699999 324.959999 519.379999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://ocaml.org/) >> >> endobj 6198 0 obj << /Type /Annot /Subtype /Link /Rect [337.439999 441.619999 372 449.299999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://download.camlcity.org/download/) >> >> endobj 6168 0 obj << /Type /Page /Parent 2 0 R /Contents 6199 0 R /Resources 6201 0 R /Annots 6202 0 R /MediaBox [0 0 595 842] >> endobj 6201 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6202 0 obj [ 6177 0 R 6178 0 R 6179 0 R 6180 0 R 6181 0 R 6182 0 R 6183 0 R 6184 0 R 6185 0 R 6186 0 R 6187 0 R 6188 0 R 6189 0 R 6190 0 R 6191 0 R 6192 0 R 6193 0 R 6194 0 R 6195 0 R 6196 0 R 6197 0 R 6198 0 R ] endobj 6199 0 obj << /Length 6200 0 R /Filter /FlateDecode >> stream xœí=ɮ丑÷÷y ³ÅM 00PK—9 Шæ`ø`Tm4¦SöÁ¿o)%e*IÉ)fVVõ^i¡È`0öåÇ?~þËéoÿ<ýøáóÿŸ¾.??|~kÎMÛÌNÓß¶dVrþµëÍYÓŸÓ×ßÞ¾¾½ýüöóøï·7Ñ^^\~Œ7×OÌþóëïo?Λ¯|þðßãoÿ:ÉÓÿûõô§??~YÆ›øí­Úé—ÿ›RÈ~üÏö·éæßßþç?N¿Sè/ãNÿþ`¥„L›Ç·ë«âòwû*ô±æÔÊAèqŠÓaFpüãßþ:­*i‚r;AyÒ'w’îëÐûq’ý ºqD¹N?Š¢Ù(}ÍmrYçú¥þ´ýß`DÏ>{ |à¿4œ¶ßŽ_:öímBØ ót'Ð ë7pÞ*ǼñÏ €ËÿØaxîÛåø{4Nu­‰w£w |´]«»&štrsèûÓ8ðÉtô]»I¤ ¤šFkŽæ‰¤•Àî¼#á®9îåe‘J¥Âë:Tê@jèxšf$Ò–6CÞ7ôº—9˜Ôu®#%Ì´‚g iF"ie+àí‘`|#ˆÂ•U…6³Ü9œM3 Îë3’À~Ü:­¦ŸÝL}…‘ã9=:‰ôË•¯ãKâ,Ä ûþöTs?L³ýÌôÆr¡Ÿ^3^™^º›Ìå)s?Œ¹ÿÌß-V!V!î¤xyƒÌ7ϋýøi˜4–/o]ÔžùÇ—‚¦=ýpY»>}ùåôŸÍxpÿpúòëÈÃÎF·}g.^î4?]î˜QKê…4MÌ!/wºs3òsÓlîÈO—;ýmþrá§/#zÜ»‡ãœ/S6 Èu{ç ±,wgèQẌ4Šéï‹o‰u¾Ë–Œ§pŒ˜Au½¼¹ÜÑg=Cwøù!×[·;ƒxÑAƒ4àî5æwn44ˆ³ÑÎ<Ÿ™q¢=Kч&ÐZ£ÊDWû]ù“=#{0ÑØOtöö+ðªÜGí ÁǦ–C8aéIÕrµj¶a¯*8„Ã2çÕœÛNÜÓEYòž=¥Ð'Œ¶Î`AÔòñÄõøÈí…ôã#qüñ‘M¿"­Å ˜ÆƒÜÍEÎ3Á[lŒ×’ÀCxGãÐH6«D¬î/0 Ñ(©F²]ÑhÞ«áܵæ^r¨"¼áÏ!yV¿ã ïˆB°Ôä]˜–"_üÂL$x¢öö&2΂ÄüŒ‡‰|´Gå${p¨í°oxû`¸Ú3Ñb®ñTNv •3÷&*—‡‡±ŠVˆŽf ÆÖlÀ´²²HeYY¤Þ³²Hm[Y¦+¶•e~ª¹¦Ù~æje‘jÏÊ"•me™®ØV–ù)s?Œ¹ÿÌ‘V©W+ ¬M¨÷ ‡k„ÍáÀ;.bÃçރٰ„ß mç‘újçQÝöƒpc*°óÈ6lçQ-$öÝq™p-[iù€@Ua¤„'Ï•“W'¾Æ3ßöj蹿Àp » =²ÓÎg!ÍO„•ýj?Q¦Û^`ÀÊ¡ûÉÐÑ&ÅüèñÀ{ÄI=ª±##îxÛim=\-9ÝÝ…t„VM–%VE v*2ÜÀŽ7^ŠŒ¶AD#”ÝÕ48l/Äêãk÷z R{z R¶8]±õÀù©æ~˜fû™«8 b;z ’¶8]±õÀù)s?Œ¹ÿÌ‘z RW=p6î™Åaœ€eÕjú ¤6T©«ÚŠíš¬+P@•‘ÏŽïÀG;n¡Žö±TÇs ³jwªÕÛ (ÞV Ý©î*VjÅ1æ‚Ù#j;»Çê÷œz%‘1ëCHåAÜÇÄð ìᎣÜXø¬‘$MìÑê®.~)¶ŽV_Šªú«Šú¤ÜƒºàÁ,çÄÆë#k¨QýU¯íÛí†S0T ×êæª×†®“<¯¬ìÁœà,ɳ72TL7Ýý Z/¤Ÿ -º N¼F ƒÎ®ãÃeâe™L4}AðieÔ'[ytˆ|»Â <ø™gGeJpµ+gÄ8Œõ’ÿöÖJmc}"TXé´–Á]<ˆ?ÆS&½š™d¯¶öÈT`fÒísñòWôs<º¶VtÁz]» L7ºëŸ]Ër¤'ÇùÎ @X/Äú‹õ5¥ézAîø‹õ -GîtÅöÏO5÷Ã4ÛÏ\ýÅzhvüźìÏŒWlñü”¹ÆÜæH±ù/žC‡PxóäM =°zXmRvÛ ±„8¸) B×i.{bÌò°½ÂY8 4„—ÜXç{Ó¼Ó?XXç¡xûa”&hÞnÚ*K:3´TV0ëø·;°z,Ýñ=è #QìâF™,ìÀ°¹Ÿëp0!`"XiJ^YŸàžo÷ý=¥ËGŽz]Í¢1~Ýx\Eä’<-”¸$wD„ÀSrÏ9@@‘04ñ;êÐ ”£S=ÝÁÊD=ш$!O¾(FPâËÜŽ0¨JÊd$V99‚î,–ð"5ƒBã"ŠxŽ‘gTØÛÁ"†æÉ¡ÄÃXÄŠÒ?zî$žøÓ&¿™¬]á2?‘-ãj>Yb¹RHFsÍÎn!,v“DÊï Z…ªÂDƒ 6y.vLWDòë·m#à cN•`3 RªŠ aBˆ¡ñ Õch¡È[G‡N!`ân"0þ ÅŽš1«eˆ}¸¢Ú:‘‘J(å „Á™’´0ã„Ï/Œð=¼Ý)¦43œ زûƒ¢Á¸;Åÿ!ñç)‹¿KP‰J¤ 2Q„ÚðÚúž?Ší>¢ˆ½ŽwÿQôÜÌåè@© C,ÈÎyºA[œ‡"G“p±1¬dÅÁèG"¦GCø­`>RK{îÒèS3T‡¢p(×OªZa܈x¹°Ý¯PÐwn3âä9æyjSààˆ_fM’·™Yþ äÁ€œ•pØd˜r&ŠÊ_L‡TTÓÑÕ£ZÃÚO<PìáÌLŠ9Cë³m…qÕ!oa0&yí·æAŹ3%>qÄñv8¡(ö„DPWÛCñɤÜ÷6i£$ª#üê”ØÙÒaŽ Ë¡ÎfrDM²ÊxÅ7F­³Tùió)«•ˆÅ•‚°ãÎq]ÄÛîy·¶áuÉÑqüð„ül«o[‹m•a_Æ'^ãS¨Rí®cI.\÷!Bé~$»"·‹WýJiU!EíBØÙRò kDr*UKÌEÁ¤,"|%”<<®É1#¬ ¼0¡"”ä[–ðŸ„ÜDl-&t,©á Ký‚,•ÄŽÐÄ—Æiþ>kkBÅÍ¡¬ÜZ@1l»Zä߈:L)i5ºÏãd$d Vð$ÄJÙ[È)?,¤ÌMG}Ýñ¤°‚I´žÄÛO¹O¤ì[kÕa©ÖÕ³´Mâ3szv½›BõÕ¸obå_ŸÀÍèÁ;`r£Ã;èŽ'?º„DÍÚ“¡ ¾Cš›"ÌÞ¹.°§¹Ù䈔Ý»ZÜqw”/ºÂ¦–΃¥Ú×+õW6d,³@`ë>&%0×€©ü¼xÖ -•Ùi©ºT’ßîbJh¢»eî|¶ìʳ6ÚÆÿ¼9^IæÓ<ÕMâÛžçi%î~±š2W)A¥/kÌsxs˜Ç’L=9ŽÞ,Èä•Ó{ (Ú²Ž’‡i) __m†µeüSi­±V÷R¼ë©RqÃ`íâAõ2k¹ÊFÖãm‰ù7W®Z¡½¹Y¿ÙÙߌ¯äW”ÐÕá<ÙÈÎ¿Ô BÄ!S²ÅiŸ7E1“ê]¢ë*9aÍ¥TS¸ªôq‚w¤H?º9óè{‡U}êGÔ¨”š»ˆÚkðÊ …Õ;‚YìE¬iÑ,S„VŸwí±K«%UŠ# GÞ^¥,B¤”1Á¤#Žq΂95ëFÚ0-\˜ÏÓ:¶á³ÔIHUðÔE  Á„uW'x{NZö¬“¤&±t©/s°á¾ž…ŠÇo*J(þ¾&à.›º—PümFIaÎ3Ô7tjIÚE%·àBIÈ ÅjÏj^Î펂ӓoÏYÛ©7ždçà; ¬—Ø,x…>sÒ3ì~ƒ2»Ÿ¿ãŠEaæ™R®‹ Ü.4…ä+çU¦]Ìepù¾*˜=ÒiÐl•&°,~ÇC;ÁïxvÆ7X®Oº§‰¸ÃpÞígk‹ö}Ô ëæÚ›íE×I£=&þg‘HË`l§_ûÂØz$äÅi¯e_Žeͬ·'*šs—%‡'Íüàõ‚ñv]wGJ 2Dpk©³”&rˆÜË xë©uîqØ<­lbí‰/q*‘²ÔoETL`)iÀQ™*¢ ¥B¡Æ6KÆ+g™a^²…àN~c8ú±ñŒJÙ1]Î…ˆ(e_„gÂHš’O?E7ü܉L©¹G@/!µFyLès¾Æb`–t7Ørn…A3ÉþÙ&‹P‰èUƒˆ B”¨ •›ÉÌ­õê¥MɲŷAå-Xë‘â8b—K0MX°ào(hîx6SÌÏQ…ï¼vîQw®÷Š×*ú/c5-6ûî<›{Þ3k3à;ð…|QÈ$ ©’ÂÉéÔ!— 3tê4óŸÛÒ u ‚gàé£W™ßQ« uȹE9³»Á…à>ERà¡Ï€Ô×ç#t^O±^@­ººÜ³ô"`#tüq sŽf\]e,¨ ª´O £ ôòty…›ê•†K×ÒÇ㦟ÊSÔkç)Šol|viÂaÎI±ÛÁ"Ù¤î[ð™ TýeÍáLò-Às “¤ÙFaÇÛÎyjµsÔ]Ǥi#<·ÁÒ­¤£Fhñ\¸² ©Ão Ä£ WaJLå)t“R”·ŠM–Ö»¥Dê=|Los´,d(©ûG£L%¥CnãËÖO߯=·`z`ùñõ7Ϧ¹»ÝÜvûgï~{_ []Ú“—±WÏeí\Aø¤«ÊEÛžÛ}(ú H²;wû;ÝíÜ™­ÔY»…î9·ó~ÙLjï;=øÎ¾3ãg'ϲ¹45¾ÝyŽ6ã‹Û~wïÙ…Dî¬ðô΂Ô{w´Ž…BáÞYv ³öen—€uÓïÒˆ.¸Û‹ÖˆÂÏ; ,ºçÆ/½Â÷pÜÁ%4i²˜ƒ˜¿ãÁÀõxæãê|èû¦=‹Iþ¾G A@ qG£éóéç·ýÚ¹Ô endstream endobj 6200 0 obj 6426 endobj 6204 0 obj [416 /XYZ 32.1599999 369.619999 0] endobj 6205 0 obj [416 /XYZ 40.7999999 477.139999 0] endobj 6206 0 obj [416 /XYZ 40.7999999 415.699999 0] endobj 6207 0 obj [416 /XYZ 40.7999999 477.139999 0] endobj 6208 0 obj [416 /XYZ 40.7999999 415.699999 0] endobj 6209 0 obj [416 /XYZ 33.1199999 367.699999 0] endobj 6203 0 obj << /Type /Page /Parent 2 0 R /Contents 6210 0 R /Resources 6212 0 R /Annots 6213 0 R /MediaBox [0 0 595 842] >> endobj 6212 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 6213 0 obj [ ] endobj 6210 0 obj << /Length 6211 0 R /Filter /FlateDecode >> stream xœí][¯Ü8r~?¿¢Ÿ˜ñ¢°}ìy0yXä!ðf²XØ‹8û¿u“"%–>I¤Šìîsz Œé–D²îU¬"ùë¿üþŸ§ÿþÇé×O¿ÿÏé›ýûÓï/Õ¹j*óßéòç—é²;+išmWŸeùïôíÇËÏÓÏ—ß^~þÿóE4×í_ÃÃqÓá?¾ýýåW3ø‹ùå÷Oÿ6´þï$Oÿ:üëo§?ÿÇð×_l—~¼t}si|7 !…ì†L[—‡}ù÷?þ>L¡»ö{ùÿ/u¥k©»Cóøé>×?ÓOÑ`Õ©QUS7'!ä0Ïz@Çÿþ×ËConçº8m§a{:’ºô#[9 Ã4» Ì­¬:ßF¹¾òÝ¿}AË“AE+kÝ#Àö|Ðî¤û~´¾Þ4m__ùîß=©hÒù¥É §GãÓFÚ±¦h?„_­‡núæꥩ*=ô({!}û áðÊwÿöAüÖCïºÑã ú ’hÖn.poóBjšt~m²ÂéÑøÃ¶¤f¬)Ú€*{ÕŒ°š¶é³Ó¶‡Ñ¿Þ+bíÆ50š±fíÆ°–oóÂ;â6‹^϶à5cMñ˜•u×9VžpÏØ¾rX×Ìlš‡…ö‚D;h_{öµµ&Óä„Ô 4éÜÈ/'œ£Ð"HÍXS´gb«mO˜fl{ýûBkkú40š±fmíé8i)¼#nñxáõø…ÁkÆšâÿ0+÷gåÖ íØ¾rXã˜Ù4 ­¼`•B;“>o«Æ “m2Bjštnä—NF+´R;ÖíÇ™ØÀjÛ­Ú±íaôï3­%ìµO ãu¬y[5£ 1–ÀëpŒÅ ¯Ç§Z¯kŠÿ£¬¦uí‹)h\¬g›G‰ª.‹kfСéLzСm2BjštnèË §G£µ´R;ÖíÇ-Oãc<Û§e,ÓºqÇ÷,­%ìµO ãu¬ í,!i ¼·ÁXÌðz|Z¡EðÚ±¦ø?Êʪ’Ú±²’#÷¸ö•ä¶Ìl›‡…V¹˜V)ÝÍÛ.Ö´MNH•‹i§ã°ÂéÑ8 -‚ÔŒ5Eûa&¶°Ú¶’#Ó¸¶‡Ñ¿Ï!´ÊÇ´F3Ö¬íãLÒRxG܆cñÂëñ9 -‚׌5ÅÿaVV.ÒšNå»ö•Ã\¬g›‡…¶q1í0Ž‹îæmçáØ&'¤‹i§ã°ÂéÑ8 -‚Tù˜Ö¢ý8+ãÙ>-cù˜Ö;¾Ï!´i-Œf¬YÛÇ™ ¤¥ð6>¦Å ¯Çç(´^åcZúþu‘€j}žÖµ¯æbµdÞã…V_¼3¨®„óÃçmçÁÚ&#¤v IçF~9áôh´B‹ U“¨Ä¢ý8nù¥ÝúPÖµ=Œþ}¡µ„½öia¼Ž5o{÷•´^‡Û`,fx=>­Ð"xÕ$‡Ðš>•ÏUÎÛÞ}e -…wÄm8/¼Ÿ£Ð"x'á } ÿºì¥V>OëÚWsùK½dÞ„Ö§Lõ$!ºÏðÉ+|ò%#qsƒðàqJѾRè‰ð›–×–ÿ3ê{©dÀaEìbNˆÚ"¬¿©žÛ`%:Þ€Ž‹c²*•90Ïâœ? å«P׋¯Ê› åÖv1¢â™â7Á¬hú’ïðËÖíå,À­U cÞ¼!ÇŠi{ËkÔ¢‘E¦ýë{ôU¨øwÔЦèû5Ú@#ÏæÅ´8ˆê˜„7Iqp€·Eˆe1–úG"}„;öoZqŒˆ#ØRj[nb_ˆë!ùSÖ&X"IŽîK/—gZíL@E1™U°¿Æ‹`;þ™KäP [t¦¼©Szî‰,Ìf–:‹RB7ò=±Üš¶ºkÏÖ,ÏATØOýbÚÔþ’ÆTˆ,ðKŸà¹aÂX/žèì¼çTï–Õê±\;ÊØ±Ò@ôa¸³ý­¿­÷Wzõ1ÞÆ¬mŽx™û·A¥P]¿ZÜÖêúÀ?Q2ôÖá«TŽÏ P?j6MœÒý‰¶3›B1J—:7ž”Ýí²Kõ`“$í+nï&À=mIh)õX‚h|ÏŠÓñ[)ÍIíÖ{áâpJí²Mˆ0X¬Xé¼+ƒçëfï)i{$eé¤]CQˆgøü¾X/:$8dýZK;ïá“°èLÕÎÛE+9Üc·c{àæômbÃêÎ3Õ ˆöˆTzV%™Ø#uÄ·âû+‡­êÍÙ|ÓàgdÀZ…Zíݘ»"áQ{¤åmå’c V«à*:„R„¶ÎLPµeO¿z¿ÛªÉ>ŽŒ² aåH[‘à„æ4R4à?ïí­Œ²Øì‘X&¸Ä† pëz·'ÙRL›NŒãÛ§SÚ‰Ia•ˆ…†§Þ¹O½ãDÏ)ž=L†G>} SöUcˆÚ¹50ƒ±¥|öÇe™ŠJ/G$‘¬'¡Ã´22^z]™4ÎÊ× ×(ôPî÷c+f&†y„‘â_mtâÚ )Âî b Qð0¸þ!ìD¦Ãh$3‚ÈJ!5e‰ÂÒ \¼aE·.Ó uÙGãÊ“69µR ²Õô§ð5‡p`õ€eꥄ7Ùj~ßi 9üMV9:8iLÒ=®;Û_)FtçJ‘f‚ý¶o³2m—0T`rí7¾Ij½åÒ+«_f]ATÅ.’ü¼ƒ%-shþdþw‡¿ƒpqd'9V­àµ§ZAixÊæŠJ´ãÄß}˜‹ ÌÆ¤t6‘µržQ“ÝÏ´œ]»É`·Ç`ûºˆàvŬ»—`דêÉ#ìk„«˜âDbw("¦ÄÞD¨5¤qK,ë$˜ÆlÑ<ΙŠI1›Ó<@ÙÌJ*æYPшpœ6d £î·u/þÆLñžEçDÿn]0²)#kéÊ–·ÖË9 £ö$*r(AèNñØxè‡Ðeð'øW*{¾^h¢¿” Ĩ‚…¡w¶{±€)b柳g.–Pes$Vâû-гâ3BâJT|n˜Máö¹ÛÃÓãö¬ï_±ß‘œy{ÆQ…H.gëWò ‘cñCH×½;JX:w åÓÒ•¶t˜‡VônaK—gïÛ¶H”³/nSóŠ}IX·]YùÜ_µ“”ÄMY<¦®U½Ë™:·½7é<%–.±0ûkê±L°l¬'5õŸL¬scaÞ— iwÄäavæší7XàN9…;Y¬ÚàrtZF%•‚Ž@E>€×ô@êö­Ÿtò4 ”¦SÜ<.?âå˜r¦7m´"(Be~›D7¼›©kÚÀܙވF¥;™À®¤ìÙ¡²„¾ëˆO†8-ñIÕl ÃG|D/—>ïõèL›Øc_ïùœ¿ºØ#[×…2x{È21÷¡pÜQCWÇ#üIXc©à±ò+7;ÁoxŽ•=r'è½yû䪕Û‹¸u劧#EL Ë5†,juûÚ™ûaÕí¹®\ãƒu9qíô㎩%ÇÖÅÜ•c1qY×·²ÞÔ+®¸7÷yYÒµw£‘bÎ$äðÏï¡‚þ1ýã7Â^O/ŸÓËçYêê÷e]üJ¸Dü€‰õiîpáI5 ˜] 8öEûÒ7=úÆž¿-Ô¹ 7§÷–WØWŸeH*»¦6¡y0yò%~nò#ü?y…3°ú™nÃÇ3+Wês¦0à ì‘ 3X™[ƒ0ZºX\îê´²OÚÎcD$c" 1‘yÊzì ï#¢™ŒAuì~ï™^u¸Mœý¡çýݽûþó•O(F0iðUÝÞq¼?E8ðôzñ’Dpëfòl¥¶Ô•ë7¥Õz³ëcnæõ+ñ”6÷m`—ž2 AÔö1ê‰ãšÞ#·‡ÞZ8ö„˜‚z ’gñ•ªù¹H¹ã5å‚àR× Õ§ùà»èc~ûòç”=jäZh²´_ÈdoßO}¿¿ÃáJ±¸8kû(Œo±ðåoÜßÎ~ä¹j>UÅQÝŠ°EÀá—cÂæ÷NmÁñD¥o† Iw{oûjœ‰÷RA_Y °’÷$½ô¦ì!=BÎÒ…CÛÅYÔHLL…Yk€”‹³,5•:'`;",]Xr?1šŒ&¤Ä„lpSG'ö…÷{‘;”~Å×ÂOR<›<ëHÛuÑÖóÇn¼õ¾obÛEáõâ»Ôœjzð™=’‹ØJ³y–eIhÇn&¼¯ƒœ>±ÿ[žC8#pkGójïˆÔòDvyŸÌ•)ßdÎ9¦œŸAЖРÏI,Ê)!‘u=çàâü†%áuËÕ¨®oBëD–5°ò,´JÝ%z~ãæšÌÊšeòd:û½60l¤;ðH`X˜¤¼+ù,EÊ)ñÈ¿øãÌ2) ÿ§$i÷‹Ü)dz²&àwT f®ÂŒ 9GJD=‰ê’†¨LÊÕ³ò‰¾`õYNIc• žzÕÆÃäŠ)d‰0EûÍf„OžrÙ¡£= »1§«¤HÊ‘?ëY‹1€nW´qܱ"TÛgÑp¸ÔÖ—-ÍnRWpJ$ÌͫڦIëî:Âóá}¢ …1æÞn iRa ³â³¿ª>€«ÃÀ‹_È¿+øÅOà†j ¿ØS[YÆëÕ ™¥'÷mrŸ~„5nœoÄ:éöë÷lû%”ç»§ ÿ7°fŸ²Ê¾òö†3þ·_³¿}-@a*”áÿî!2 ؾâϯùÜ5—çÀu ^–TÀË¥èÈ[Å=°9[ÑŠ)>F‚Õ’x}9Å›ºcy~kÚ;ºÊh¹#*¼½FyH d޵îeøR=B¦neÅbq%»/’ºg¯­¶j²ï “U?†Ò+÷dF*†7ã?¼M*fó7Ä ½Á’uC\Äî+º“ ÏbzÇ!àˆ=欫$w’uÔoŒç9¾ áP¡éÉQXßyE)¬¢¬¼¢lúÓ î„”—ë›O?ܿչëªSÓ^þj…è̯õ©iÆ{žÇ_¾½4õYˆ^vpoéY/z:Æð¾ý·¸|v ¿®È×o‚™ úY/ý|Œ¿¾|üS® øÆDÙnŠ|î­ÃdO[|é•ãùM9ï˜eÛ\ž«æntlÝ[ÕÃeÎŸŠ¸·k{64Aøæ©'n]¡ ïñJ8N·£ãmô»²A4Ã}59/Ù­ú@ë³\gzäp„# d>ø‘.¿Ûqâ4v ·ád½ãvº«ú˜Ã§«¹Ã§Å’çUèŒ ¿‡ïò–žõ¢§c8‡OõKŸêÂ1†_ˆÃwy«ŸõÒÏÇ(àð鱸éÏŠÙ É·O|:~OÇï;~œ²õtëÅ­kÝþØn>Ë>Ïý›y½8ºš÷Žè÷é ÖÝܬû%W°¡›6üB\ÁË[zÖ‹žŽá\Áº]rë&cø…¸‚—·úY/ý|Œ® «´¼+Èá¬åYQ|º€7_Vzº‚à¯OUøðçôsÐK×{N«“ýëÛ]º½¢ºý·U·úéö°ÍI `,¨GÕ‹æl.þV•;YÕ0ç Ù›e»×ë3È¢ÊöÜ.õÜ.<1¤ÔYöA*Ý:[õ¹1 jiœ~ÓÃoL¹•gY©ù­¦ao†ù¦¿¼Âw-o-@ø}c¥ké‰@pXQ‰ûÆR,v;·«àºK[֢ݤ¶õ'£øÀ^i¿Â5ùƘ6â\µóÛmm™âRo‚˜ßl…s{æBùYÎZ¾¾Æïâþ!쪅z€Hæg,QxN²ƒôh!n!XnR$wE¼Bê~Œ× Zkr˜ÝYýæ,.wÎ…Z$µuf­}e´­§ß^þ±É0 endstream endobj 6211 0 obj 6809 endobj 6215 0 obj [417 /XYZ 40.7999999 432.979999 0] endobj 6216 0 obj [417 /XYZ 40.7999999 590.419999 0] endobj 6217 0 obj [417 /XYZ 40.7999999 432.979999 0] endobj 6218 0 obj [417 /XYZ 40.7999999 590.419999 0] endobj 6214 0 obj << /Type /Page /Parent 2 0 R /Contents 6219 0 R /Resources 6221 0 R /Annots 6222 0 R /MediaBox [0 0 595 842] >> endobj 6221 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6222 0 obj [ ] endobj 6219 0 obj << /Length 6220 0 R /Filter /FlateDecode >> stream xœí=KÏÜ8r÷ïWôyí)R¢€`±=CcÈa‘CàÍìba/âì!?ꦞd—È*)©¿žŒé–Äg½_üé_ý¯Ë_ÿyùéã¯ÿsù:üùñ×·êZ5•ýçrû÷ˤ¹ÖÒ6[£¯²»ýsùúýíÇåÇÛ—·/ýÿ¼‰æþáðGÿpÂvøÏ¯ÿxûÉþfùõã¿÷­ÿ»ÈË¿õûûåÏÿÙÿñ—¡¿Û ßßL×ÜßlCH!Mÿ—eëöðooÿñ‡Ë?ú)˜{¿·ÿÿQWº­Û&i?¦OÅýßå§Ð`Õ¥©¥håEÙÏS÷Ûñ¿ÿýö{ßÛ4«®D¿œÖ(°½©ßù‹R•é·Ã6û.û 釙ÛjxåÛüöm[~_ ÚÏI«®l¯5ÝÊqÐ~yÓ@ë¶´ƒš±¹4i¥Ã@‹ÎoMÞuÎÛøÝ¶¡•c-·=i•ê»éûú>4Õ …hªEÛØW¾Ío'î¯îçÞ#õ8hs_’hݾM`z›w¥v Eç÷&ë:çmü>´¡•Ú±–Ûž²T!Ì´Ö¡}ïÓ܆œÚ=ìLã¦õvÓÁÚ>›Xoc­Û´:–£õ×;îíÜ¿mó®wÞÏïCZ¯k¹ÿÉ ÜH5òz¦¶±¯|›ßf@Ú¶›ðÇT3uX¶o¯|›ßæ]©™1u1ë:çm‘Z©k¹íé@l×:´@3¶ï€5Œk˜ÖÛMkû´k´c-ÛvÇç÷¹×kˆº‹w½ó~ŽH ­×޵ÜÿdP6wo› è™Úƾòm~›i;3áO×ÍÔaÕ6jD&Ûä\i7cêbÖuÎÛ8"-´R;ÖrÛÓØ®uh/€flßk×0­·›Ööi×hÇZµš)ýhýõv D]ŽÅ»Þy?G¤…ÖkMdÞÿTPÖ•ÕîÍzæ¶±¯|›ßNGZ-Ú´0uX·Ûf@¦¡É¹R1aêrÖuÎÛ8 -¸Òj•§mOâa­C{š©Ýÿ1k˜ÖÛMkû´k´c­Úm3"ÃÑúë3¢®Æâ]?Ò‚ë­QyÞÿdP–“zÙ7gè™Úƾòm~›iµÅcÝw9 ´j‹‘MΕÚß›¬ëœ·qDZh¥²ªœmOb9ë–CŸhÆö ˜Æq Óz»é`mŸvv¬U[LœáhýõŽ{;÷oÛ¼ë÷sDZh½²ªœýOe]OLO«I<žÛƾòm~›iÛju+&AqÝ®&fh›œ+mgL]ŒÃºÎyG¤…VjÇZn{:Ûµm5‰ÇSûXõ$.²¬·›Ööi×hÇZµ«™¦­¿Þv¨Ë±x×;ï爴ÐzuÝ8û¿·S¢T[E;Zyi꺪õ¥ëuíùiïOÔø`~¢>ߟ˜ùUãþß«üÅù¡jB?À½Wí“ùÛ»¾ÖÒ©—¯‚“‡7xã MÉÛµNì«Íµ?m牻.xëý-ødϾº6í½ßWÁUT­» }su{ÞÙ³(8WQ¹ãÁÝ{;ç´@àó0Çà •”ÌŠ(¢‹ß= ÐÇÃÍ4ƃ´PAàƒ;ƒ'“_~ëùlÞ¡…Ë<òR[áã$ÜɇyÓ$’®[I$²ªH$²—×ÒÂíW"¹¿¥V½¨å“DÒ™GI׺Iÿ‹'‘ÜÞêV½të1òK$²×“ŸR"Q ¢bh* ½ZŽƒÝÃû(=ZÓFk+ÔWYÕÎÀ òöéLóAš¸1 î~ƒ–yë ²xÙ€?#¦¬>‘¢ëµ¢Õ#D7®pÐÿâ ··Ôªµc@´|$€há!|äöV·ê¥[Q@ÑæI½MgOÆÜý xlž|£‡•‡½À¢@K|pÓ†€à!gØ}YûÏ"Kx”ô±REU»Gçn‹üÙND\µjVñTXb‰×"HØ¥¾Tz½»/ ]N ƒNúበ¶Ç*é‚â …ö„ÃS’ ÚA†Frz&Ò6P¶ntéÈe£pÒ ¹ÒƒsŠË2,)€¡8VŽ ¥ñ4‡¢úB%&'ÈU0ä0‹´¡å çÒ]Ú ™GœJ½ÓòEO Œ!,”&`îîÁ8¤Àðüb«j]âJ‹ Çº«˜ÓEÄ”ÁÂDEÛˆÞô@ÄÛŠN O8(õCˆ”×¶îÚ6ºYG©æájM|•%ô3é`0ìî&Ž˜%j5‚¸#”¶×QįÂ'Ù™J'šh¦‚Hð…‹xKÇÆIÁÜ~ÂJRT5X¤rÕÔûüêh-è°Ÿ}K°OÀßøévNxß䥦 ù¹ˆ‰”‰C.®E 8‹dOHyÙYOÏtêà+­a·HbLTéðù6¬B‚GPèeºÃ<×SYn`…‡B âÁsCÌ"9"üGpî)a&áPDÞlïÌ7Î-þ ´ÌJ8f~"ÛVž¶[”J!ðÞ‰Do¤†¿°$Âká ppòq1ÇÚ­4¤²´!îLfL.DQöO% ›x¡hc§#“”Ñ\©WB”•x£ÅÆkÉS#,³Rë`ÌÉCÚÖe"5„­þ¶à©î‰_’òXH€Eè6>T³5‡e¥< õ†W׋7@Ø`ÆŽ ñ¤ôÜ’S¼ÉœE˜ü0À f±–ÇX”W%Ú%uR»,©;yà eV†Ì.’ jm#Ãç“°2R¼KT‡¥#fzg ’™ r?^Ö°Œ3>áp$bi}p7@Ú0Âf)„Ò@7ÄDý! 5eu÷Õ.­AdÝä)eí WÞ†}Œ3ëOЫʲTØþ¿8±Ãm ltMŠ;ß«xÀK0Éœöƒ((›%þ‰515)fk/.“ànÈ鈬;‡üo˜ª)BS‚a‘7â5¦ïF¸Ž/™Ðxdéz:äÕžDàÂßø›„°Užq“üTêø½ Š_´hs&”?3ÆeR¤^ë( ÊšÌqa`,¡Dˆx+?—¯q+È– š³XS®}–0uÞ0ÂEn²–‹óðùÚK í=NôXž¤Ï€?òEÓ¯úȮɇÿÙòÀüÄYï§Ò.™?Œr¶QÄ';Õ§áU]ß!rÑýGˆ7Áß„Qà ɶ)\‹§PL™ zLÉÒã†+óBj9ˆe1ÁsfSø²5Bü@ŠW2oQ'v=r*ð^µÃ°Ê 7~JœR_˜%d[<ƒ½5ë­XÆ¡þOZ:j?û‹¥ÁíU‰>é9ú¢L ü&¥ ~Då"FA©€†Øt ØŒˆpÚ[ àS„w­$«¨ ƒ±ú#"ÏÎyd-XÍä8;ab)ÖÄ÷È{£Ø“•R>°7<ó­yáPzP~æ×Võ0$oÅ®,wÆðP;\úüªgh$óâHEguCðœcњȊ‰¸(›ãjÌòœ‘%g8KôAé{0(þ4 Tæ"Âg6P*ÚôLµr –yjñþ%æ« ß©ô5öfðê—ìtÊÆÉ´jŠ“ ,#p‘OaqÃsFëÊÙ Ñdñ í.1²8Áf(¼ Ïe€žÇˆ†¡â ~~T/â@³Ö9J|V ì’ذ‚‘“9î.d©˜És&Ë¥”ðCàOrö^žº3'v#Ø)VAÀö)sW@ükÆ âß HMAÁpÚ±—`Hê䔂áá‚{OHØs–4µƒœOÏ;â•¥•£è °µÎa ®BÜÕÂ_Hñ dkÓŽ½ØÚûakOaï@Äî£Ú=ó>hÈIN¥r¨Ã”ÝìÅø›*ÈßHaµàv”ãDóÚ^œèýp¢Sǯì–^³×õ—Ú'¯ã;?‡«k‡êf[%HÀÀ‘Ì•?HI|…ô”E[9î+|¹jJÁŸ'c0¹øŠI~ªÍ"ù”僚^òÝ»A¿ãÐÏ…2€¢?NÁ1TsšIÚ{‘È™ æ½L!>š&N>½„ÿ\$”áâÏ´ õÄQ1Œeö ÑI9Ëëé‚ÌêÂ-U‡ù2i¼ã“4E¸Ä:|iÔaÔm¼G¹„º5ݢÓÝö*ff9…gâ­‚#µ"¢8åB­p*Ú•3ZhÛç ¦žKÛ~c—™d38ŒB)Ùy”J£¬÷Fò$¦TÐ8kžë]^ÀR Xmñq²fóf÷*ÇŸ ²ˆ¼qÃê)„,åñHº_‚ÉucÒ0hÀ¬:¾Ö5ƒó¹Ë€¾,­øièÔ·»`âý){sg)á!;9o[éóù‘N›„¸´“j=Ý=o…¿o¦¬?ò©ëhÙ¸ƒ¼¾çR°](áÖ5c5â÷Ç 2x'Eï{vak Œ•¾0«|i5Ó—Íä½ú+B›@2ø€(â EØßGYeªhTX“,ã+ [v-´O)Wœ!ð+Å4ЏÞ(EŠò커*)6Rع‹`‹yï«âU™ q*˜jòðùíh[“pp2OŠC’w6°Ž,ìtÇ„ÂܞȘ”XôfÍýˆÁ¹mQ}÷½ÚEOeÍÞ3ԱѮ¬)À|!á®»¤Û´ÊÆ“‡H8Ž`²w’<‹AÞ3³ð˜åâéd©ËuëJèaÈÚÎîAê˜wÅ+ÉØŸµ´BÃv‹›Pµè˜¶;ÓLeµ>;£½ý>ù=-ôD‚ßTà D>Q„o anàˆà7?· œŸ‡;*L„Šš yÃóUSúTA¸’Ž ‹ògð›šk˜V€ß ¼ w>0ÖÁßhpÖ„ÔàîPzÛ€7Ö=P‚sÖ0ýg>9×à75[ªHM““LÓX¶äúˆù(Æî}ÑØ}ÑØCÐØ€Ò':JÅàÓ¤¯DÕ^"ÔŒã "ØÆXª*•Ô¡¥kèÙ‘¼8'qß(Ôœ-. ÆÚ~>ÑàiÁçŸ}]á¿-EUúÊì¯ã”4AØØß>Žë)rŽu52}UP—ëÑó8”ìÉ ÖO*pGÏKçkÕçC¡C !‹3N›„ù E7¥ÏºÌi5£ ‡—kT¥×Ú¨,k¨ R}UÕ9¹w™5H™e |Ñ«kP£&T’ûªf‚9˜*À\ö:æ K\\>ïý¹ü»‘MŠÉtàÜ$hQ,½…fMK6ìÇ¢ åš²cJQ®#c…¦ƒåå:å*LÞÏJó{ct=Šèù3)áÙp4¶íU^­‹`ù g×#):ÁF¾±£pL*!ŽöhP¤• JáàîlÈ Ùgc=MïȲOBô-nð8ð70ÄÃx bý†Dý:¹-j S$J,<ë_'GÄ9:½."G4Õõù’#hrLíÀÃfœ3¦ë (žÏC?ã»)ð› ®Ÿ=ø l‘$E&Ãö&Vc„õlÈi0n§@ˆµÚàYS¨wA«wÓŒžNAˆà é]ú¿Ï›óI¹ ŒM0Ý(èùmŒH$B¾)Éw@à”8%˜ÆÀGA‚É—ý¿—=öÀu{aøãë÷ ˆôA¹šAùË&0o~¾ª¹ˆ~.QìDcÚ—ºšî‚²„¼i®Íã²pºÚñ§l¯íãòôíƒ'VØ®ë«ìœ2>C%}m¬EÚeLÆ1à7ø÷V^eu¿NÔez³ˆ =}ôî`‚°ÂÏÐ7CÇ£'ZÇ ûf81ÌÚ‡¹Ý ênm©E<íIQp t´÷Mm÷¢×Ê>š •{O†·AàBíù à>‚Q6Æg=¤hŽ ÷®}(›ñˆxÃ3ŒQðœ¤Ï£÷\Œ7ÌÝ ŸÀÓý€§¨Ög\6¦j®âvÝÇ©© lௌ¼õòåíÿ%ue endstream endobj 6220 0 obj 6786 endobj 6224 0 obj [418 /XYZ 39.8400000 432.979999 0] endobj 6225 0 obj [418 /XYZ 39.8400000 720.980000 0] endobj 6226 0 obj [418 /XYZ 40.7999999 658.579999 0] endobj 6227 0 obj [418 /XYZ 39.8400000 638.419999 0] endobj 6228 0 obj [418 /XYZ 39.8400000 550.099999 0] endobj 6229 0 obj [418 /XYZ 39.8400000 495.379999 0] endobj 6230 0 obj [418 /XYZ 39.8400000 432.979999 0] endobj 6231 0 obj [418 /XYZ 39.8400000 720.980000 0] endobj 6232 0 obj [418 /XYZ 40.7999999 658.579999 0] endobj 6233 0 obj [418 /XYZ 39.8400000 638.419999 0] endobj 6234 0 obj [418 /XYZ 39.8400000 550.099999 0] endobj 6235 0 obj [418 /XYZ 39.8400000 495.379999 0] endobj 6223 0 obj << /Type /Page /Parent 2 0 R /Contents 6236 0 R /Resources 6238 0 R /Annots 6239 0 R /MediaBox [0 0 595 842] >> endobj 6238 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6239 0 obj [ ] endobj 6236 0 obj << /Length 6237 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹½€ €Ÿr`¬‚o6‹…½ˆ³‡üý¨[Tw©‹EŠ=n°5#‰,ëͪҫ?ÿøÏÿ?¼zûãŸÍÿo|jŽM×̧¿?ÜþBG%çË~hr<ý9|þúôíðíéãÓÇéßoO¢;¿hþ›n.SÌþþù·§WóäOóo~|û×éêyøËôÓ¯‡¿ÿcúï'3Þé¯OÃØ.¾ÌB 9L?Ü^nþòô·?~›@Îãžþý¡mº±mtß.¯ŠóßÛWÑdÍ¡Sª†ƒr‚³Ðñß=ý­†“[óéçɪ<ûFóŸ&Óµ=ü0œ}#Ÿ~:ü±iÔð§Ã§_ŸÆc;ª¾©ùNóÞù€îîHx¿ÓÞ#¼W*ß@ÞÁÑÞÂw$|§ƒïà]€£5=\Ɔâ@A¨• ÐÆ|G½Ž_Æ53@¨[<ÚÌYï?M²!;§K±@бˆ¹© Ü„)Ö3A:xø™°÷Þ¬y$¤ªFÖê?ĵ¹S†õe x‡:ð¡Ùu`)i'Û‚ÜÔŽ úŒ#…´VͶÌCŸÑô™&ÈJôY?<ôÙCŸ=|ºµýaà@Ä~RŸÙoPý²€Ãî×Ö/ 9éëïžpf­'Ô<†hŽ]/† O×w›ùÝã06lÝÝX»3{ËB•„¼Í™XÌÄÛ.O:dpÚÐìÊ|b–óú¨ç-Þ½ø eT±3k¹Œr}t¾Ó‡˜¥ ħá/ O®Ð™†ûÎD}×>_¼ìm¸%Z¢YüOgÝѳvG d‹í¥ ‰l®h—™¯w^#*6]ˆc«»gŒåLŒ¡wņó‹Æþ^pĦ8jÏkl¯-Ës¨ï£ÑÃÝQže‘Dø¨‹’1ô —ßÃ}Õ› JvpˆùjÁìf€ŽêlŸ¶ßu@Äì æâ fo§‡HXeJÏaj°ºäJgéŒú¡­¥ ¾cº]nyxc»dÁ&©b,R š7fb —&oì‰mHbl,l"´ØvI£FX¡MÅCÓeøÏ³`¬>ñ.a²=­Bt#߇–ÁÝ®y‚—GÙ¾ºÁ@‡¨#£æmižŒ9–¬³uàá€!7:GmÔAÛ<ž%’äºlN=G>SÅŠ<)(C1){ÚÞ£ºƒ½Ü+á«tR å`ÓY…vœ8޽oË+»’]g±S„9Í“ZR FØåCŒ<â)"Ïxo³Ó—æ5º³ÝûÖ~ç]ü;‚¥ÂÄ}ÇÔö uœKxn ˜ï G-·ß‘‚k}–ƒBUzÂ$B†Š*¤\b*ªp4®+Âu>žÚ§Žö²–*,<Ÿ¡‹5ËÍA›=Ÿk¢ÊYE A³GŵkžŠ±÷„•ãwèíª/ Ķ—Ž9ûÇÇ£~'C7z²Bæ‚€GÉoÉÅžÀiØ4vJ3÷>i.œùí"€ÁŠÈ å0Ix'L$·™É†,Â!G8ŽÊÊ)ÒÛÑ’é)©önÀïXDîVBwyB‰(ºÃsÆ8SЇ\ï.o6"‹«N·`=6 ­oÈuÄ£:1ËqUŠ(œ¢^#C#jämü†íŒxû-g–èmSÒ’rê[Û˜³\<&ù¥vÕÙul‚§ËÀÞ[×ÑCIcŽàõ˜³¢ê¬‘0…j@dõ%R"Ê1é}Û{"Yî 5¬™"æ÷a˜9:Hèv³ )sΑ3«°·¥S¦ÓÚÝZXD4d¡äÎï’¤QÂù-ß¹O@Õ‰æ²Ts‚âvAÛ`Äî.9O`õ;C\­:ÓÉÕ¾[xÐuò *ðº6„ø¢r»E­b©` · I™ä°ÒîÄ=ÝeJß³F5µ­"bN˜+ƒ!<IBÚmJóŽjëšã«µ8S5Â.± ؃$lö`$¥+)¢?×ö“žÂÉ€1”Èbƒ„#óÑîS΄¶³ô…‡—¶»é.¿q‚B­kµhUp ]š\ÛuÖÞ2õÑÌ‘zÝ`îãäýÛ£Ð|‚ÔÈÏÙ&Î*9_é•%$•2¥WÎN%Í€ST¨âJ9ò$\þC)DrÊ©(uN2ªŠÊ¨¤Z¾®$kç#,Nö ë¾½~Ø8ŸGù§4E¼ƒ(ïÇžÂerNç^½ûXª<ýÏ#B§mÞª«ÙìV åñ½²dü÷k˜ßC½b¡# B¢r©„UBì‹âFE¤L³¸û¥ÏÝ‚·0Nj¡Fs6eÊ}øáRIžԔπÕh©ŒŠò‡ª·w ¸kzéLÃòù¶†¥ôW‹0ùJS>çQº\BªM“ÐR‚$›«I8Or9P‚VÌýÄí•ß p¿dЪ™2)U7³E–`”D„ÞX«Ìó´ôË|ÚÄÓzËXX¹AúfÖH…¾ÂslMº)åþX—PleIŠ“„‹ëR‰<ª"3SeWCc[ÌZØÌ£)ÕÒ?ÉZKiúÏA‘)bð®šr¼ ™šÙ ÓPˆ´€;ÝõË”¥;ÕoÅÊ>-³•ç evÅÑCáìÛ~be)ä,i¤E‘õ„»î"Ô´=2QèÃãe[6q”"œ9‚X§W¦d5Þe0ŠåÄ)ïvžã«Ýâ1¬Î9cñ}FíÒéÁÒ.^\©¯:ßA.mRŸž½ûkóÃP¤Î߈PÕ 2–ÝŠùv‚añ2šËFWM‡^&Ý}ÂNH6‘е!øY ü‰O^µ#=RÌ7|—f‰kLíø‹$8[äÖ½&Ô t»ƒPÜ…ûq)mL#ŒmB%°_Í[ﻡ^;Oz×Ìè+}ýÔò-£‰žŸS1¾Ãºà¼°‘lƒsZŒ+0ùžyóJµËâìÏc&TÛ" §L×-Ô£Ì&"- +ሄ•i¤G úvKI-ÝQî[3oÖêœ,Í¡úÎÒ¼yP<B?OL7K‚§Rña3š¦9“L·¢=“þxdÁ²˜/1ßžÎY$RÀií¢Šì›,_EªÐŠ©­‹HÌé(Ü9 .Îþiaî½áµR½%5x2"Ο"•8èœbzà‰YÎö‹}×B—LÿJ*Ž`‘™Çc8{€ðY“ý5„•jTzLòN ª«Ëe%ŽG)ïåÑ—ì(ÑB¢³…=KÈjúP8…$).c©ºðˆàSÄ×^“péžæY'!\””_w?iõkÇËûxGù8&_ –" Ò.:r8ð鱤´É¾TA7×C &rZÙaH<óÁu¹­óððÐ=ä|'ý&Œ„Ó^bæ%48 沬Ù0áÇ]ùö¤Ï|6NLsÁµ…2æ"e”'ªU–@Á»êá0ÛŽ"ƒ8uÐo gx2²bZ`Rv¬Tš•î—“’Òç|<‡…/!ñ‚VÀMI­+[Äóy+Ù(‹<ñ—¢Dö†èRJš;Êþ-”.ŸtxôÂ{xøÌ1³ ŽrGrª1X,Áƒdip’§þªºnûWLVÌÇ,&J}U,_'È;K9YØnøxâ'”ÓÅ`…¦)Æoï_lÁŒ? Kdx¤Æž]nºÞ¶äÊD§k¶ï¡bœñ#RœêQ‡qKéCA2EDlož¹iáçz¼lÖô'–âÜpn)•!ýÈ»À‡†¯ “¡ÅÑ‚l7Ÿ²t$Ô}ž¢ZÌäÒ_.0[÷£“j|Àjºç½4çpïÀoÒŽå)Ýè¨Ö¼@GE³|Ue÷ýgIÙPÌOøôÚ k1űÓ, Ám§î6%’Ðú•ÇÈ©wÛŠD¦ó»Þ­yqýrsWEc£0&J©ÏN1űQw–ÐDŠä¯à˜ABª!©`š³V,)†ÎÚA§pEÈÞ€fK¤´Œ©™õeBÔ¼Ô¡ÿw0k[a«á”¢š”JF‚/ÓI){F¶6®O(}&è·äæùʶ›ñ­¸°àÉÓ팇k¦âÌû+©`&?xíÎtǨޕ;¾Ó@Dïh8š„wÞÃ;o wàh&°Yf/Á¼Š»ÂðtâR}ýb.”|¸†Sø¦Lq˜J)§0Àõ`*Űa¼a~lðhâ-]z½\ä±Â¸Â«Ã”„wKEZöì=AFz°ƒå–‘j±ƒ1ºÿz0lsAƒ((7|ÇC‰¼T…ç¡h^GBb Áï”ÔZýZÞ·à<Š­)Œ«¾p呸”¾™äÙ-,+(ò¦P ÆvI)‰À»Ò¾ƒïܯLêeŸÂg9V±ýCát =ì+aHóPt?«õ¡ Þ„¦È|§¤nÒ]ý+¶ŒÖ úÁ©8¨Å@¨ñhµÓïШhqKxÙC* O–Ó˜2%Ž;aÊ„òÓÅÞ(¶ü0߸“dÁ`<|õïÈW¯Ýúú1O{R…G>Œ)¹9Ú‹â:§âh<>‚lÍ’ÿ$™Ô–ÛûQ¤x‰x·EJSÞÁgXƒ`Œe$á/Ë©`l¼2Ò?¦’$Åó`{ÒN–ù¨RÙã,‹hc°æòÉbس}èfIs‘ÄF£®5(¯æÓ Æ+YkÊúZ@¹-®ç„,S"ŠÔ¶ýíÇ·ìkÓ´âƒ'¬Ác¹?ô¯GÿRÎ嬫búÇ‘‰–1£xp5{ÿØÖ±\—†#šùôØ…KQýcvݵ \ƱRÖ;j,ßpä• ¯Ã¸œ:ñJ®ýï”’ûß¹O ®´ ý_Ή$¥vŒÀ÷5ûCúÇšC@Ð@ Æà™³ƒZ8KÜôLåÓß÷‰œ'R==`þûüÕCß.c4WÆøèe ï«áèOw8uz[‹ÿŒ¢;ž[2Tsé`?oh×»õöm£>Θ¹¹3 ÙûõNšýÊYÐ(u”ãj‡ÿ¶=vs4È&÷µyøÎß™Iª—G9‘ñmËÇÚh3±¹A§µgÍ'WVø½cUkwZ‡ ÍŽcv,fí·A´ª;]Ëö$ûm„Aˆ6D­óŽ tâØôV$SÀÑàbz3fLÎÍqåBþñÌ¡6ý·=‹Ç‡kW=”GazÆ…a’Üâ®ó …s=ràÜÝ7ñr`Ej}`áåahº£8}–ù9S SßvXûÈ©[Ÿþ¢é<µ endstream endobj 6237 0 obj 5150 endobj 6241 0 obj [419 /XYZ 40.7999999 785.299999 0] endobj 6242 0 obj [419 /XYZ 39.8400000 595.220000 0] endobj 6243 0 obj [419 /XYZ 40.7999999 785.299999 0] endobj 6244 0 obj [419 /XYZ 39.8400000 595.220000 0] endobj 6240 0 obj << /Type /Page /Parent 2 0 R /Contents 6245 0 R /Resources 6247 0 R /Annots 6248 0 R /MediaBox [0 0 595 842] >> endobj 6247 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 6248 0 obj [ ] endobj 6245 0 obj << /Length 6246 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€)‹µAw·;@ È!È!ðd ìAœò÷£*Qª*±>.”TÖ 0ÖX%.oßøøîŸþ~øçï^>ýûðEÿùòé©8u1üs8ýûÓõ_ÈöXÊá±i«£ìNÿ¾|{ú~øþôñécÿßïO¢>¨ÿè_ŽS þ÷ËoOï†ÉŸ†¿ùôòçþéyøSÿ¿þú·þŸõx§|{j»úôðuxRȶÿŸë§ÓË=ýåw‡ßú%´çqOÿý©*ZQ—2jß§OÅùßëOÑdÅ¡.+Y¨ƒ²_gÕƒã?ÿxú¥mZƱ­õ?ðÙg&užªÅAµªGQcNT¢‡[Ó¿FÏ×õ(>¨Bµ=܇Ǫî«Dÿ³é¹“ÃO¾^~}‚ÿ/W“ŠFVªëg€Ï·“¶ý6ÊZOZ—JÝ>—õyÒv|¼4j§z¢«ÁO¼û¼€ñÛðŒvªçº{|Õi˜Fž¶z~l‹óèuqõÜ?ùzùu$|«~Rã¤Roé4ÑíóiÓ¯yw:Lt5øù‘uŸ0~ÓÏh§Ã\×`Þª¬Õ´Õ«Ñ§çvøÉ×˯ã‘Z 5NZ‹jšèöy`¦ñ׬;Õ] >à—sŸ0j¤¢ê¹®Á»Õú4î¸Õ¦G¿<·ÃO¾^~Í€ÔRŒLSŸ¤Ý8Ñͳ˜à>~z÷Öz‚ýüK¿Œ³%<üñùÛ“¬?¬;)Ÿ>ü¾7‡ë?>ÿúÔõD7™ÎÃñ½)šóulªù7¯áßH¿éà<íù(hOo/£ óˆÞ²*¼ÞPæÜzO¢®jyóFBˆó4Dz+fßÀ7ÅÛùM{Tr¾‚ᛟ{òŠ#–îäñÜ!–Þä8KÕŽ‹yAXð˜S>ëMbü¦xÀ~ù‹RC¡èÊæCb¤5¼0 }ç›bÀ]}Ô€ózCM•ómÌ÷…׈÷¥ù²3Ðå/„šÿb>¯8Xˆc¥êtœW¡7r¾®pÔâƒæ£Þ_·äS»°JPñì²hÊÑkhæÖ¯i%ðŠpÒ1œƒ§IkjX†wë~¸‹ª÷—!DrmÒɹ6ƒ³(ä¸d˜´sð{Xz˜¡1Ô š/ÆÍ °,ˆá;WBVï7ƒ{ÛÔN c Æ-äm·EqŠEƒàÔ_À[˜Õ>S":ííõajR‚RJ#$ä+}[©5PºÈˆI(PJ%fEGE5î‰d'¹å†aÌfŠŠyX¦G„ H£ƒ° p,BìB©kÁ0céç¦F},DA‰lEDqYT¢;d²&5#ŽAq„ýçcÕÚ›¤’ô:¤éª¹  ;¼%ñ™³¾ALñ~ް`ïf¾õª1V•³ÜžzA"cÒêÒ^§GD¦ÑÖ›‘Ñ9L/\@ˆ{È­¥aîgð-;µ>“ÙðŸl‹[†ýØÓKQd½ Þê§œQ|Hi½™ ˜Ð)~\¯ó­†•Èã€4‹¯OoP"ì,WÈ3Wˆ×"„dâÝÜ1MÀEiˆ(Ö´F¸O¨oꪙëyY¾1ˆ'Â6ö(æ‚DÄ1ºE¸cÐ8]Žâ=ÔÀ1™7Š×¢ª­XÃþœ‚y‹Ãßï6e®p•¬ <=¼CÂÖZì´ôNí逃S|B~óˆ3¹\ׄ[Ôåk—-8Çh3Ad[H>sшi$™L Øž¢ˆ÷p>5?ሇ$.Ä ‰zBÛ \Œœ€ìD’BÙAâ´ÇÖ8(S­;e°qîD¨t{†®ÌånSæ M°ðQ|°˜Ò§ß˜^ËT¥¡I)fÒ\“š9ŠÇ Žý¥Ÿ¥ Ü¿ôÝ”Sþ®!på±~“Ò*ô«nœæ¢*½î£Në\-ó5õ2…’³uêÓh÷*È(gœ(v>K]b@9_@|äñ ~M§pÒ©3ÏšƒN§u–  Í…”ÛÇÔSLU¬"ª)(ʈõŒ“iÌRÒ@äçêƒdŸ´°–ãM¸e‘Ú)…fUϤѣeìbb·¼ÔÛæÒ€]éÔ€–eâï nƒÃßí˨z'ao;Ä= Ès¦ÍÔyD12Ÿ²Ç®ÔióžË3L|ç þF7+i=~pä”57Só§4e° '¬“JZ5—$„ LÄ¢šòø {!‘ûKƱ–ˆù×ÓB„Ï™ $%*·à…1õå+ƒð¹l&Ô„+Š^°ä·–:2Í›1YOêc4X*h° S¶ÝŒÕÜ’Œ‰^çÎ&®¯^4ÉÉÍ-缄ìŠeN®xQ¿”sh}×cºu“R"'.±Y¿šX·ìÚ Ÿ ¥ 5“ý_xû­r„i…dsÙ+wõ‰Åeh9B ¬qT!eTM,7©šÝwO\ˆRkAá«|EüºB¾Ê#Õª(fÂeñuiNCDut‹(§ÚRGÙ×Êç³XZ:Dh±à7Õ3Äöj¤f™Ü–ÜMž‹ËåêÁ4£i×®°¨4iç ÈÒà, ÇèúB kó£Yº¾l/MR73Ö IãXÀ±žLðèé³=³B뜷=K¼cJsÑ>ˆè(‘©+òr ÜB€À `Š5ŸFãeòò5μ(Å‹&Ý5‡çäL‚@!jîîêØ* AgÒí.[IÁ^ÏäF5`iPŒÙØe2¤÷–+éIX ¬-«B8â![œ¡*' ó?—G)¨K|@d 1Š ZÚüÓ4=ýSp̹ÏÒWçcK¡o–ÐÇ’×X•ÝœM—/m\úë1øóâI÷ø& õ0y±:×#a'æDý†NuFu!ãè5¶x7¡L7°lÈ„IÙç°iæ*i·’BÎüP„)k " /,Þ"äs8Q“Cš¶[ÊÊlj“(JÒ‘]ÿÕc mñ{ÎòUÇ‘âH‰„×RWÞ$ª2 èó“>Þª±=]‹V¾@Ý¿+zšn‚,w3f?C²žóÍ)¨ ðÈdÊ­'ÂsŸÀr-I2ßÅãîJœFt,©ÁÇLÐ$ÓMmå†$Å< ¨Üà”c+¾òÔÃ,ô?,UÀÚ3>¥'kÕhzŠÓÄÆP–œã|TKMm@z+¹Z·R~Þ;“WjmÑ/ÈÈlçŽÁân …åÚ¡f¢*\B“»ÀR–ŸïÚ¢»Q‡ëõ¥ë!`çí+5Ó]I@ãÊ‹ù/¤pŽaÌÒͱËAµ²½“³“%zc _ÊáÍA0˜üpùéXá ÆÒ4¹›!»; ø€Þ˜£v½à.ð¢EéWwkX´R`6¶423s iù%ÊqªpE5äë·ÔÚBG‘êJ9 žÔŠÈ鮢É1·}Fóq‚õÜåv±ήmòº­4v ä |*G ²;o<%òž³‹Ø9oh5áWwÊO £ 5.–Î%#O˜éÔ²gu·È[d]ÀÍdžQqˆ/± Yƒ­G%†Ô"²¶UqËCìý…ONî$¾†„Ã,àhÔ8%Kz&¡êÊrî‰l8¾Çݦ`˜­â¡nÆ;BÉû¶x;‰{+Pnî0 t6X®×`9]ìf™7…¶TWRý³Aä÷1:µzÊSM:}% V#AÜæ¾Ekñ&{–üŠ?y™Óø³zÌ‘‹Æô7IB¢k”Ú·ÊÂ×F‡w{ Ä²,€£Û‚¹h…Ø´F¬EËAÉîʧUÏœ‡tRVs£™µÃJ®ö§Øt…´jÔEyq亙% ‚Ú-ÄMˆº%Rš¹ùÃÕ#H‘DdÈRù¶BŒx¢‹2øÏ]”œÍÜ¿3*®ÅÒÀ.k>"å±¾jŽ–“\f6×_ŸÅ’Ìq SpC[,¶`n¿7|†ê«î¨Ã'zhätÌ-Tø‚µêû—\ðªD SC+½¦¯â-‡ö€4ø ß<£7¢Ao$ü¦€+5|£Â¿‘ðò0”äýäÁðd'c —l걞njGðB®ƒk!Vá7˜1ýRhQÁn€Jï}¡£Yh¬…›æÙZ·y¬Gµn)û`4¯ïÞ[ܶ!‚öc¡E]G÷míÄ#…£-܉çÁR®Ó…*(¸·Ð%¦¾Œ­+*çz,+Å”!‚qϪ,tIX[ W ¬0‰€å A’XC8Ð"—ñ~°] wZè— <¦x¸‚å!JÑg¼°ÎF×pÕÚpúpO©*Dz©r`ÖõÔn?êÑl¸Ýoaõ[š²;ˆÒFcmwKÙ蕃®¬uÀëzCÄ·<ÖF›®aßÕ±ò»Æ¾Ë£¬æ£K³àì=z£¥Íµ‰QÞ Ð51|o?Ü\›e?¼ÐÁ£Õp?p4}íXsÔÄ·XC¸éúš{£I¸êšu§p?–µa:Pð6 dÏqÕ…lnÉèÞyÆ€”¥‚1Mšˆ ±T;¦¹6ríŠÿÉJ1@ꪜ9B–fik¼9àÕ`þUN!­ù"2c©Ær”k‡H¥gõ–¤¢;Êy؈»GVÓSE&-t¢,©mfšf“+,∷^/j)B÷ÇOÑœ?i«ÀG¢»¸O|2h…XoÑÑã)–_¦gÊVÅ\óä:˜e¢Ù}³øÒw2󹜖¬`sÎØÔBLYJœuÂy/œ·…ù(‰«pNWãÂüš¢Ô áœÎ âœ\GÛdöQàÌ>¥†!G•øHåeéÄãFßàúP\Çy“¹~~C© ±T¶à:l Ïde?–:,U1pE^® !T X$q•‘Ó±Þd}“‹Ê±ÎPXnà \‰WÍʼµe;§¯…Óe1]ªFÀ£Ó. ÓMÈ[j†1N0UPhëçu‰#e»m<âSk¶å×Nª‰¡ Jm%®ÇÒ“ Ç%a ]âýü¸ýƒU¢*è+¨EñiÊ©ˆ•pm=]}I9+Fð¼(ˆOv<š”·Øp˜71?CÎ ÅX%$öŽ–ßåä \å„>‰‘ãTèÈéítfrB‡¢7!ñyÊÉˉ0ÊYV¬gàª)])°'i9ƒ)öuSY('%í:cã:#%É©ç EëNß9ÏaæÙ·’N<(lïR`µÉ󧉋ç!Ä1ðq†+$ÎíQrë<ÕÔOw—<»ä!JžGË$ñeóðs3í{›66kU ÅŽÅR¾Ä5ì¼Uô”Œ:”ƒi/O7(íZk×Z?ž½\¹³¯»½¬!/÷ìÞ.yv{yQ[&§«˜<&©N‚"Q’”B帛em„îA$‹}Å^ ï‰XÞŽ”K%¤e?Œm o㪽Œ=Éë:æ>zÊ‹,çÕMX>±Ö[ðÈz÷3©¿ ætV9H±ë):‡WðRöFV UWl)jèä‘v­rÂ*Bb§ççUx¯M1uø§×ñžWÚÿ{øÞ/©ŸîôýÇ—o–5š›+.›ûhÝžõS'\Úú úmÜKÙ‰z¸×ñpi|¥ 3êúXß¿Œ¦SãMÔsÕ(›csÿ¶­æÎ}¹xy”ÝìK}wW5ÞD}yÓÀyZøM¿X»‘Gٻ˲2P}o´A¸\ÿÍ+ü­¾|ôÎßÐ7º¹ê½7íC_†öÆXÈÞõÚÎ Au§gY‰Æ‰m-N‚è@T.:¨Œo´IQ‹c1¼º˜Ž1ˆéM·Q‚¹¾læBþ±ÌW­o9óû-î½l 08 Ó3æ(¼&ÙB|4¶p˜o(œk‘¯»ÏáràŽÔzcáå¶-ê£hDÛÜ2µÀL´½Ö¯Œºõðñéÿ¥]9 endstream endobj 6246 0 obj 5028 endobj 6250 0 obj [420 /XYZ 39.8400000 504.019999 0] endobj 6251 0 obj [420 /XYZ 39.8400000 347.539999 0] endobj 6252 0 obj [420 /XYZ 40.7999999 140.179999 0] endobj 6253 0 obj [420 /XYZ 40.7999999 140.179999 0] endobj 6254 0 obj [420 /XYZ 39.8400000 119.059999 0] endobj 6255 0 obj [420 /XYZ 39.8400000 119.059999 0] endobj 6256 0 obj [420 /XYZ 39.8400000 729.620000 0] endobj 6257 0 obj [420 /XYZ 39.8400000 504.019999 0] endobj 6258 0 obj [420 /XYZ 39.8400000 729.620000 0] endobj 6259 0 obj [420 /XYZ 39.8400000 347.539999 0] endobj 6249 0 obj << /Type /Page /Parent 2 0 R /Contents 6260 0 R /Resources 6262 0 R /Annots 6263 0 R /MediaBox [0 0 595 842] >> endobj 6262 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6263 0 obj [ ] endobj 6260 0 obj << /Length 6261 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e>E X°gì90l ‡ ‡À'X¬™ì!?R“Rw‹ú¨f‰ÍVey(²Šõ.²H½ýÓçTÿú½zûôù?ÕWÿóéóÕ¬aîOÕÿ}sþ ak)Ü£±ºmÿ§úúýðR½>>uÿ¾xsìèt7àï_;¼uÀî7ŸŸþÒ=ý¯ÕŸ»ÿýRýíïÝŸýxý ß¶mú‡_Ý\Øî?çO}ã¿ýCõ[‡‚=ŽÛÿûF³Všf/cW~ü{ÞcU##:yÿîÈñß¾u£hÔ­âÜ4ʰ«G5¢–Y^µ¦©ŒTÁ ÁÜ®НÈr•g #¾njœ)ª¶ÿŸ¯¤Ž\nY[ÉÖTÝoC@šñNdUðùt²":‘w¢—k©¬==·{å×ÓÛ½è;ÊЪí ÀçK ¶R' ê Ðå³j‡ÇK «f:: Þ?fžçHÆïîÍt{FöupU7ŒlŽ`ûÇîŸ~ôæì¹“ýã+¿žÞ^I_Ýh˜€?¥ÐÅ3;" ÇÇœ3õ€ô%œ¼óÉøÝ?£™`Od_=UÓÉè0ճчç#Gÿ4¾½ž©ª—JTõÂê]>[ë‰í3Ît¤/àdžçHFÏT4Óì‰ì—p‰.¶óúèÎDÚô4‡6µÖ3š†³<õñuSó.62™ôq!‰Tb5ÅLžèƲΎäá¡é‰±jjéñPTÒ[!¥›f+×Rljí@JäQŸ#F|ÝÔ<éá>eI:Ä)éx‰t|ÿåðö#WÒö9Ö—o&ÇDÍýøÒMWWoú䣋{¿ü\ýĘlþX}ùåÐÖºCK»Ìε°°åéØòáK7·›cªå LŇ‚˜v¢ä¡>!|¸‚s€-¸xûX§…-‚€¡”°EäVËLß傊@ uiõHj'ÊöD­w“_0sü…:½ñ¼ô†àéc´Ó7œÜp^kÕØŽ;§ÑçgŽmW´$ ÏET­œLœµˆ)­Ü¨M-¸Èl 0‘ŽœÕ«¼ÀD~˜Â›"àÍ —u—‡r¡u°µmY#ÎIçÇ>濈ŸbNül; Ù"6x`jl¬æ|Må&-jÇó>rêi*3¥é«‘Q5/§5\ MSi:y˜€#|Õ[¿@ðf^-4gS PÚ›£3Ô¦àŽ.ß4úRŸ"âØVHmjµˆé̳(†~µcpVB CFŠ©…Ä̈(/ì#>N©•-ˆƒZ˜£‰l…$ï#´äJ^àoexF¹x¦Õâõ¹ï¶àHÒ }2ˆ‡1<Ž5ÎCDAú¾H_ù¾ >í$vLŠõq~ p~çÉC ôP$A¼*"#¸æ!‘¬[nŠ.IvZþFÉ!‡óáŤÜtÓÝ¥ü)‡±ÒX* ïñL–eÜòey\ÌÑ÷¹ >ʬІˆí‚-X„£ žì–=j_ÊE)†5Í YñÍË­ëŽE¬^äЮ ¹µ¯9GVä qe }qŸe®FC˜ ‰¬ïc.@ŸJ™OœbŸ•¢’bcqK[ÎÖp¦1ÌK9Žõ°Îàk¦<ö P%E^6€cÍ PË%‰;ˆ}ΖgJ±( ÃÙð|6bk„\Ät˶óDPú`/¼´û}o>ªq®ÅÇ^‹l9Keéyee†kœB+3ÛÈEy;¬%£ˆàv‘C»ÌÓdžim9ÛŠðÓ b@ÉE÷8tûQ fÓ-GÁ¼'ÔZ ,ËΖװpŒLÑôbXcMߺžéæ±õŒàí#¸tf#|4Ãn@‰l+^Ÿlú£”-]Ÿ€M( öÒ±²J׉Ë\© ®OÆ}„3-q ' «Ì$G£úDd®Øn:<~õqËŸkþ4ã<åÔ Áfá“ GÍxÇZ3…wòðÙ\¥GÉùp˜ â=K<šÆ¹%¦(ÎqUô6‘Üï.A «“F‹ìèRà”¨Žt³5»n®ÒMŽå’ ±$8„ZJ…iWŽ‹öƒðêA¤> ×eÖ_ÛL70¬Û8[)DIƒÈÚ^é¼;"y<ö»Ø‹Sª•²rcÁÀŸˆ/¹»%/&½K•$EbŇU›=Æ¡Å8÷×g '¯¦ßßÞÞ?^¡X‡]BBBÊØ[9®®îöv··?‹™I£é»Ó€’¢e¬%îCØKÅ´&͇pò!²öI¨¹¿¿2:‚uánã]ãÈn.Î2pŒý¶½˜§”Sô„Ó혢¸’]aŸEñsŸ••nXç^],Uv©Lü¥WÝ2·Ç_ûÚZÔæµÛhÊÝ|„KÈ–÷]#»‘¯ìfÒ^-¶Ñ%êŒKlÖÜ¢¹[â˜}¢œ¥HŽ#¾÷¡Ü‹CˆúpŒ9Wõ£Ñ­Œ hÇ“]» ØWà ŽFÙÏŒh¥ÒcM8S*R|LŠfÎ2 ­l™¢{Æð#e {¼ââÍÇ7÷xeWˆ£eÎÙé•etF²]gvy,)£ªÝ5ãÁ5#²‡cM­”êRÎA¹ ƒ2H·ûï<Ý~¯ú‘ª…t‰o >§Ys¿Î–å%bkòê3åöˆ‡¬Ø¸½Ñc®H”¢Áý9G©Ä(&[޲(÷âû)«€%}Ž]s¦/®,|ukÐ…¤â1e9b… %¾à´p·M£ÆÜçn›ðàNx±K™+X®º7†pù å{øRàžËNãjØ^Ðzáç8ËzEÊMB•22¶ê"íM·àÏá ÜK 'IøÜH¤¼rà§“…J£)ó‰$s”g½BZ`¬)vPÔô†oG7³¶”’ò¼K8õ }P† ‘ëM)W•îš¾Mo—?cIÙx‹,¡PŽIbMÇšQè¾ ¢Èu­žötaþCò/È><³ žœ®§ð„pQÞ¼EìÎâEGI:Œ³¨ýC„¹½›†> _b½éc„˲7oÆ‹Ò#—žc© ¬pP¶, ô¥ØrÊ&Vd%…ð±œH>ŸÕâ äþóÁøÆòE ÖñÆLÁë{íx‘ý¦½0¥0{ ÜBÙÞ}Lo¿ê)³OÇWžD>­7m¼åjÇ=R†­Ð‰ì‘ÈcG"-÷Ï(‘Ȇu3R0Bàý–?u‘Xœ ã¡TþŒw$_¡ßl¥X”ËÝÏlÛÏÜäCpe¤O{§»•§ÃgýÐÅb?°í3ËÜÚmßnûn$}vÕn2%²Éj“(Sª½^“MjÑwDY/–)y rî ™NàgªmqËð ËÓ/¿¹*sOƒ¸ø{®d×LQ“_ø\ä¬Z:ø@fPµ=Å,#ë,Ë\‰²_ ÀàQCŒÞAÞ_>uZ:óýO£ç$|Â`yRh ìƒ[0é!‘ <fPkÚŧ€3l új( £?5¾,²÷UÚ*"b9‹)$…}!9±DaNgÔÔ[Úi-'†šBåP¡™ $ƒ È/!}–Uƒ ò)¶&«ƒ¸.#Aº(æ[ù¬VÏ5-Pb†pñ «œÈw|ª:0m˜ò¸eQÖýÚxžCkí졵Æ +.‘êBLæþœy‡Z†#hµÑÓ>Ïé}N¡yЧE}|¡'—µq:qÂ@zÁSç6[+1éã—YæZ`®6µ—Ù¹$/ (ÆÎtø.ýÌL8S1h½ÈàlÁÔáÙ’øË΂ ¤CYÎXv.#€œ_„ÞŸ8ôò0g‘ðÁIØÇKäœÉN6bÀÁ¼$r>ƒMœ9 1‰pü€†÷ç9æZĹËÐ…¤›çw¼ ¤ÅrØ÷cˆ#´†_’’2ÂD„¸OBLAaÂ+¥Î¢DL‹pëÙDÊ.WdBÞÕ̽Šy±‡kf)¹ñõÉY˜&Èr‚Y\ IYVÊHÈ‘nCôìð–>ÈØ‰òq^$ &, /VîBò/ þõÖoÍR^BÎê£"ÎêÆe c‹Æ'‰n¹bS–+›5ìðIrd©/s¦ø›ÿáž9a)42 ,õÁ‚îvÜf‚vÝdÉ-\ï¡DH áð ç˜×›»•–‹ins[‹EÑ–À¨a’B¬¦9âì] mpð9ÎpTD|é‰mÌÜ´Ë $1!h¤Ä¤×Ã!&L9³Çiè!ðr’q“´ âeƒ¸;øEÖ0ûN»Þ7ÔZaÅDm#)¨d Þ"QŽŒ(ƒ6àeñoß)qåm"Ü5û‰7Úì½ÉV9F@{ þÿ6™íšå¼ÃbFXt¤ljß9'½¡‹h¬œ¸ˆˆ²ÊRÕmÊùòU,Éb<(çq_3‘åê1’®0ã!FX·Šºlæ‚.û–ßi´»mfM—®XGKX¡ÉYµJ-ý ÂãíĆ Û‹+ûaa:†{Ï]ÙLl-eA*¡”²üéº>¦$­Ú>·Ù”#ìøÓUGAèþV/Ç;†ö/ø_¿GD ”v’OQé‰v].Èj*ÞMcFðdË›ÚÕÉñÒrä¯iêfÞæ¶ªQµ0µ™ºÇ3ÓâX e-ÚÙxBëºqLŸJã û´° ÍŒ¨“äûr¡¹ÑœÐÿæ¾ëÝËÌ ?¢>^içZ8š‡·i}<ÇRæ~^3µBêúg¡¹Yä¶·hIrொÈúøƒ^ ¯™™|(ÃÑ ±¼ùd$‰æ>"™“Q¨?8kow¯{ç. ´FayÆ…qòÃ@ÚÂy`½¡hnÄ> endobj 6273 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6274 0 obj [ ] endobj 6271 0 obj << /Length 6272 0 R /Filter /FlateDecode >> stream xœí]K¹‘¾÷¯¨óS“LæXZêö°€0ö`ø`Œw¼0FÆÊ>øïoV'««š¬dƒLf©f€Q޲’dãÍ`ÄÏÿñËŸýçáçç_þïð«ùóù—§æØ ÍúÏáôïO×ÑNGÝ®ãÔÛùôÏá×oOßߟ¾<}YþûýI ¯š?–—ç)Öÿùëߟ~^'Zÿæ—çÿZžþuhÿ¹üßßüÓòÇ_Ìx§|{šæáôðûú ZÕNËÿ\?^þïÓÿÛáï˦×qOÿý©WM?MSÒ:¾¿}ª^ÿ½þMÖ=µz8(Õ.ëìtüãž~[F{[Æqnl¢GÛuX}˜ÇeèY;ƒ:°E•:P×ö2V¤Ò@SM7ú‡:Nƒù>ÇLÔ½îòØv‡a™¤]à}£’§>_O´p×AÏM·üú¨Ú…®û©.ÏC·þä÷˯O¤ÿÛÕ¤jlûn^f€Ïï'ã0œ'‡ñm¢÷ÏÃ:ét~|?i¤f¢«ÁO²p^Ðøm}Fš¹®Ñž„ßî4äÎ7ó¸H…Ó躽ýä÷˯E!5] ~z”…ó‚Æoë3‚ÔÌuöTP»“h?ƒzýíùumc€5©›º(Œó¤ËãÛDÖscm!5] þº¿¢p^Ðh6AjæºFûûy™*vî›vUg:UÅ^†JhÐÌ@§©4ÐŒŠu‡ú"b~µóë»çÃ_Ÿ~~QžNÖæ×ß–•¼š¬ë_pûÃO'; _þï/‡oýò‡Ã׿=ÍÇ~Öc¿Ú¸ë›æ|ó½Q#zÓÂo¸5 7ZÓWÐÌðÍ3}-­¥ã ¯ ™à à<ÝøMOÿFw¯o>](9;].ŒaàÆûzSd¥ºγBœâ7ªƒûßx8Ó/¤¼wsFÃÜ è\‡ç¹7¾ÇzV€eùgº|Áo<»€!ņÇó †kÀ7ìÀoð<û¤Ï àªu#))8É#C0v êMÝõA{SÆ¢‡* YzŠaéa‹åÞtA¶™ºÈ–œçÑ b~Òa¸±¼«Ü’î‡Ùàzœz–ZZLÛ­‹Ô+ÛO °þ ©»üâSèmGc¶~¡W9¡ÚcwKWß®ì8‡\žoVQÜç½z³2÷tœæfhû¸oøÍK«xUýy‘1¯Ê½?êvRïæÓ ­Ä†)ÐuñUÓMÓ%á„@ ÞÀÖFì ŽÒg¤ØJO€áfÀp]óÊp' oˆšã0¾âÐÖ¦7 2–;†õÖ›ÆÆÂ·Oül퇱önlj;ÚóÅjä…RǾÞㄹB4c,¦«w–„Š'nl([:›â‘¡ñøÄpŽóÎ1Ò$èÆ0ç …‡÷lž“¿³ØOˆEõÙ„jTÿ^rá7”ÝaÀåò]p‹]€9\†Lüx¶˜°‘µÀ•SÁL“¥a<<¤Úã‘ë!cÌìpÑž%õP‡)•3 •¸ŠÓ CŽQ×êlŠ=_§mÔÇo‹œd9¦jPk¸äB°04aQ–BüÎ/ÂÓám%ˆ)Ñ5Cäa’§0Òæ¶âŽ7¿ôŸæ9Zú;Xg™QÎ~|€¶;ÄœŒP"€ãüÔ‘_yÜ‚ßÈ\,à«·SðZì´(Á´-<ÜðŒ<ûOÇÞe2(DÖvÏßíçx&Å»…E~%Œ¡©u?3J ­´-& m éZç1Œ‚‹<¬ŒRsMõ éÈÐöìœp"> ýlòxXÁ"h “:›ÂÐ,{.Á¼5‡.ÐçCåq°¢b@ðˆqKTzrØpÎ2ÁYðlÕ3ÎŹ1 xc7ÛŠÕQ8"‡G"Ñ^GÜâQq1hZRBÇœ“!¼è2a¢b–Dèðsn8; zÜ£éŸà™ºN‡˜9ÿìî‚ê[kSkñ‘|¦7a0‚4ud°ÅíP¦m4{¢xñ¡ç°‹ãHäG&O\"hBàöXññ\ÀãÞMˆ—¿"^jxH€#bãݲÅ÷©'"xJ˜Q- ÊQ ŒðKåaNsd,aÿó8>$ç8/}ôÐBX ö{¤1‡ûâ@¬áEÒØêuÁD£Çõ{J9}Œ¦›,mÍ-ÜÙþ|; ŸÉç ³øÑÁ¦,‰œ ¦ä•±ã1n©ˆ1L"­¶–&ú3¤£øC²< ""¹95æU¤hÐ}\wZ[òøaoå“rR:ƒ’&Ïá°+|´:—æv}ÅÆ³Áa+/-(õ»&ZêßEZó®%ô`Î#ÔÉñ²vã´Õ#üqºD‰ÛÝgïdšß ºGnÂ#7Á½Ÿ~Nú{£‘ô±íâ·ñ–q^ÏqO9SñÍÇÕ’ünÌ9MèŠո¯Å. ‹ÜB}œ¶ìÙ§Üu®w¼‹åJF¢‡ŽråÌø,i‘#©ˆú y³ð¡ÊŒÚen”íT—µ$“À¾.V¨Û<`]ÑiÚФÜNŒHÅÌSŸ'%9Tôœ8ÀÝN¨³EIé&ð D©v 8ªRâše„1Žýg‘{(™Ñ·§"–yÔyn)ÞWNi^?ÂÃ\’÷1èG9õ@?YŠ`³ã¿LóBÖÁ}¡øï)t¸yeÙ»û?Še‘é*zJ†Jæšñ÷"l§®·„­}WDoˆô‡h™VÊñ, ‚A  :ÊqSï.Ð]l˜g´eº‹¹d`÷•jpvn[õ qÛq5ðܨËmÇ…'vúeÁ°.îÜåôËr;“aøœงSÎÙž÷é2MÀo5$ ã½ä&wÝ®Ùc§ƒˆÚú+ébˆxxLx:4ã0e.l¾kH«‡ñ=B’9MÃlø‹¯;yZ»~(ˆÅi¨‹¸©4£±v›sbxp;Ø’”=µÝ{Ö«¯êy¥C‹9RÓaV3lÆ…?O[vÜä67æà_¬¹i±‡ƒðþpæa\”ôŒ%‡FqóuÏ ðþ`êÅôÆÀh+vñ3B:L*¸În±š¼cnâìãö”ı+B+(Bsa lþ·°÷P–Vœ‹òP"àµyøë™’{¯æjvXöƱf9¶¹>Ú±ÓS5Ôwoo4–p˜.±UŒ) [Šߤå@°\ÆØÁŠr­g Þ<ðpv®<ž:ôf?VÛ÷ö¦Tä‚à úqw#k8‘ ÏnãX&Öø›VFŒC5Þxcø ¦ØÑh™qºâ‘x´{;ßÙü EØîdh0ÍÑÈâ=œ…-yÌ?!ýQBFÏ PÕȧšßô ßÞSp– Q9ÇæbD³8ò k#Ý‹®JÕs Þ9¤5Ÿõx¨—³ÛŒ2Ƭ¨>–Þ IìÁ^5 S•GKÈj~QÊÃ%ŒSjŽm艢ÃýÁ<‡­ó¦ŒÞÕ:L} æóY~–y s/Y¼É)Íαo·Ï ÙüìŸ/™7e8}!Jµƒ"ðŽÆNèüæ!BÐÍ#  ÜwÉc8N,¡=ÇÍäPaŠð#ìRJcŒBÒL6”BhwÎñÅCT˜³-«žm}³GÉåñÌ‚n‰¹ q£Ê9Ëpdˆ0ÙV–ކÑJ™Óà\9òW¤ÙÕFѲÜÀˆð‰ËxÍbÕ-Bžè Â‹‰×nÄ%¥í[B¯©”£<:ÉælåÚ){£ê dÚºpOæá•gTÑøh8 VR¢<"¢ñ°‘ã|ËÁsÊ!ÃGðì+¶ ]Ž€V“±’WºTkve”úýÔZR;²æÛ,ÎwÊñ¡¨Xܬq'á`3sÞF‘†èÎÖsÈ3>CÉ3|˜²l€Y~ª³"ÂVW›>—U`åG*E–H4äFR&§+±øZ¶V‰×ÜA1QÀYgúº)¶O0çƒ"’¹Q.+‹æáF…çë$²›£Â7›5"Ï“é»u¦8+ŸÆÞrww¢^ëÁ¸Í0„¶±G¹•Ä+z_ôœòsùkK€ÆŸ_äök%S±Ùëá"ÆéA8+‚ÂúïhxPᨎú’Òä)JžõœË‹œÕ‰²ŸéFs«0ã ÅÇchÜJ+gFñÐYŠG?CˆOÿ4¥šoE7ÇK²·ž‚2´k¢!¯0ª^èX>‚œEÌïÏÙM.ã²Î#„ƒRFîY…!þ,ÎV=wQr=Eùq ˜*¼xñ• b3r±n›_O‰á¦Ü+Ît3 šª˜Ï¤êŠl^sâœ+Y{I$»@"ÏËcfÎ)Ìœ<±‹H…Ø\ÏmfEìÖÊ#\¹b+“¾@^ñÙ=zS/ž;"„3fLø „Ém++¸ÐqÅv!Ží%¢ôEîž:Ö½“W¾³DЧü£±ü>¤V}ð+ôÜDRD®-®Û‰˜ÐÖïβÐÚFY˜§Xëì3EH§\†«WÅ©b©{;FÄ—Î6º3²‡‹YAü<ù-ñ®®GßCÁ½üµ!xG9ѯ÷‘©ê†‚pwEj<¹²2õ?6O×IÉô½ü(™kSuÌÊÖ¢âoêQÎ{SBñ&¤+¦Û¾ÍíÂ4+^&> ²m…¥|ʆ®DÁþ±m-^k³§èŽÚžÓÔf1%Ñ.EÖJ1€ñ›3¯£›l #Hd,p°Œ‘ä6NLynžËθ7ô!ô NõÓ,öi]S3DE&I¦€;LÁõ»¹† •š91ˆ & {c?Ì¡%Ë6/S¹ª,ôvêlÖ«ÿ"%ƒ™:wðp+An<êmÊ€’¤|Ra‚OGžÐ/ˆÉxŒû({=Â7[*§²É\Eù0Í–(çôgÈ#ô‚ÝB7&.B(¿ãº–áN*+1å¼°ÞË“žˆÂã5БÜÏi¨Le„yn-˜+b—xµ.*†pð®¾Ë˜œz¢WÓ…Uá¦l‚Ö. ‡+;ÛîK„úˆÝG$("‘$¾(sJñðÏ1gµn´•í}YÏŠp”N0—ê£÷ß;©†!íŒôä°ç6ÞVµ÷¦áˆXbÛpê‡')„°F¬CBD¤C瞸[‡³útbËé¼LŽ÷²U‚o¡."Á=ÌïwM—E§ªiÐé‰gNÞã ÀPB­ŽùÎɬ)Ó;S`,å°ÓÙ>Ι_üµÀ¤û¢eå.5 l¹v=•î.½]ì;y;£½·Î¢ý‹ÖÙAçÊþÅlÏ2!鮞!¾¤¤ã#Ü¢) u…ñ"oOrÂ8Ÿá·x>  üClz&M1Ûp¹ßöÐ %QpŒì) ¸kɰ4!J™r……aÁ×ÜFrzLô’½›ôÏöÖ_D W\¸tK嬹g2¡Êñ"vyñV3v‰Žlã"þñONUÑ·–®©;ЉÕtó]­è_—Þë·Ñ/FÍõ`'o¼1»뛎þÙ°[oføæ3\Á¿ùß0p€!mÅ‚ ûØwÁõxÞ@\yöcî£Ô´yT¡ðxÖ†Wð®Î£}m-¦ÿ’46꫘.,+ànaÉcT.^u™ÝšÛ»¥!Üw'óáª=œ çñP†scð›ï)”—øwkQÙ`ì0Ö&‹·Noý.ñ&»êšé-ô¦ˆ–” bDöM±è‘O¥²Y‡áìå‰ú±Byœ2®9‰5÷¦NO—ÉË^jœ-‚zøX Vç6¤ µD$ˆ úÕ[éŠr`»M©¤œJgq¨-!QÉ áDœ”ŒÜ]^±éɾ=Ç0ÀI%'Ô·ÁWwËd×UîöÙwn£êË›Ü@³-…â…Ïó”!9 ÄK¸¤QõnPïwêˆjs1@P}™pë7å |«~9õ3B®ú)"á”þ#´'ãóK·,¬¶(Eƒ²k)mú³_Jÿ i'hÀ=jsïª6÷²ê2.­‡¦HŒ†q½/ [5¡<5HÂü¡›6ÔMãäè&B:î¶h¹ÚJ¨OKä±ËêÙjÚô¥\Z ¤yTS|™ö‘„cÍ”‚Ø¥.iŽM w}Wm= 9íØYÏ|9› HÌywgCjÖm>rªÉàÝÑ`h!µ¬(¼—r(rTɹUMpT {;”¸¦èMþ;3Rì5™ºÅ[ÖªmÂæ ‡k°_Å6Â\®æ&cDd,ÝjÍFfŒ‹¶õ\­îð}¶?‹Âš°HÉ! ×!'”¹%DÝRÊ{ìýú©Z¨ÉR, bófÊž}ðÖZÏŽ.cÁæR“Z}±9ƒÒ=Xª€ÑŽàN}J‘zÅ"Õ 65VEŠÆK`–ÞÜqr[ÎÃùÙKž}8aø®’_DJíÈ~‰?iJ1ø¯«’-ÿ¾/tµÍéæ_¿yÍ¥ÐæB¡_¼4êý4\m8¨Œ›ä­†ã«ø:è·â‹FÍ Ãq¸mãÌÝñíxoWïo¼Y©Dëc;ßì€×÷Ça% ›~nÍ3ÁoføÍ*ãÆöØ6¯µ /o>ÂÑÌaâÕß|‚¿5´uÂôÑ·Þ(‡a"Ú7fÇ(°««> Twzn{5wÛ˜*$:0eׄ]P8…és^S;Áý!n!˜o8œë‘Ÿàî~¤ËRëE„—§©Žê¤uß3µÂL Ô¼1úUP·¾<ý?ãÖ°( endstream endobj 6272 0 obj 5798 endobj 6276 0 obj [422 /XYZ 39.8400000 573.139999 0] endobj 6277 0 obj [422 /XYZ 39.8400000 731.539999 0] endobj 6278 0 obj [422 /XYZ 40.7999999 493.459999 0] endobj 6279 0 obj [422 /XYZ 39.8400000 676.819999 0] endobj 6280 0 obj [422 /XYZ 39.8400000 731.539999 0] endobj 6281 0 obj [422 /XYZ 39.8400000 620.179999 0] endobj 6282 0 obj [422 /XYZ 39.8400000 676.819999 0] endobj 6283 0 obj [422 /XYZ 39.8400000 620.179999 0] endobj 6284 0 obj [422 /XYZ 39.8400000 573.139999 0] endobj 6285 0 obj [422 /XYZ 40.7999999 493.459999 0] endobj 6286 0 obj [422 /XYZ 33.1199999 114.259999 0] endobj 6287 0 obj [422 /XYZ 32.1599999 438.739999 0] endobj 6288 0 obj [422 /XYZ 32.1599999 438.739999 0] endobj 6289 0 obj [422 /XYZ 32.1599999 116.179999 0] endobj 6290 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 393.619999 108.960000 401.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 >> endobj 6291 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 384.979999 116.640000 392.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 >> endobj 6292 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 376.339999 173.279999 384.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 >> endobj 6293 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 367.699999 194.399999 375.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 >> endobj 6294 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 359.059999 161.759999 366.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 >> endobj 6295 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 350.419999 168.480000 358.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 >> endobj 6296 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 341.779999 130.079999 349.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 >> endobj 6297 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 333.139999 132.959999 340.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 >> endobj 6298 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 324.499999 154.079999 332.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 >> endobj 6299 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 315.859999 168.479999 323.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 >> endobj 6300 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 307.219999 128.159999 314.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 >> endobj 6301 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 298.579999 185.759999 306.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 >> endobj 6302 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 289.939999 153.120000 297.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 >> endobj 6303 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 281.299999 183.839999 288.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 >> endobj 6304 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 272.659999 147.359999 280.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 6305 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 264.019999 195.359999 271.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 >> endobj 6306 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 255.379999 148.319999 263.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 >> endobj 6307 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 246.739999 163.679999 254.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 >> endobj 6308 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 238.099999 228 245.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr >> endobj 6309 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 229.459999 208.799999 237.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic >> endobj 6310 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 220.819999 231.839999 228.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 >> endobj 6311 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 212.180000 128.159999 219.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 >> endobj 6312 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 203.540000 170.399999 211.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 >> endobj 6313 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 194.899999 141.599999 202.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 >> endobj 6314 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 186.259999 155.039999 193.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 >> endobj 6315 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 151.699999 534.240000 168.019999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/octave/) >> >> endobj 6275 0 obj << /Type /Page /Parent 2 0 R /Contents 6316 0 R /Resources 6318 0 R /Annots 6319 0 R /MediaBox [0 0 595 842] >> endobj 6318 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6319 0 obj [ 6290 0 R 6291 0 R 6292 0 R 6293 0 R 6294 0 R 6295 0 R 6296 0 R 6297 0 R 6298 0 R 6299 0 R 6300 0 R 6301 0 R 6302 0 R 6303 0 R 6304 0 R 6305 0 R 6306 0 R 6307 0 R 6308 0 R 6309 0 R 6310 0 R 6311 0 R 6312 0 R 6313 0 R 6314 0 R 6315 0 R ] endobj 6316 0 obj << /Length 6317 0 R /Filter /FlateDecode >> stream xœí]IÜ:’¾×¯Ès«Hƒì²=À0l`9 ÜËC£Ýè×}˜¿?Rj'⤤¬²»Š©$)2ÖÁ_þãÛÿÞþò¯Û/¯ßþqû1üÿúí…ÜICú?·îïï— Lß9ëTZÞ™éþÜ~ü|ùíöÛË×—¯í¿¿½ÐæñÅá¿öÃqˆ¾ÃýøûË/ýà/}Ë·×ÿjú¿»ýgûÛ_oøŸö¿?ýuü|Ѧé~ø[ÿe”éö—åO݇¿¾ü÷ïno§ ývÿþ^RªI;—œyü6}•>þ.¿ Fn 7J²¥¬§l[ÿù§—?·½MÓ¸KBÛ×QZ€?‡Œ¤o â1íä« C Ãë Ó¾M¹£íŸa¾ú 4r3ù²%ù²›¸¹$ìRÿîIÎÛÝ5 î¥]²ÑQéU ó*°aÆyˆÛrV¢ßθô”0вôvGG-};v[Ίuéó©~kXwÓ¿Œl—ÝŒ3:áš2âÒ?ÿ~ñ‡ß*¯ÿ]7Ãðç`Zn³ Œ€EuöÍ5´ØlhíQÎÇï/¿|1QùýÏ­2}X¦ýß¾ˆö—ÎÚjßçûoÿFoþýöý¯/æ®Ù0ù0eûO˜z|¢§Â êN W’,%¯OÄÔ@áG9ø‰è;¹‹þƒùJ¬™ÀÝSuâÌ‘4V¯ì³Õ Øêû¹Ëg‚_˜èÇ'ÍQü ¼|öš¸«¿EÆwsh-é=A2aý[ÈÖ{ÓtÅY»ôêu‡”éãÊÆI†,¼; s `™ðÕ*³ù.ÁJpà÷ÄåfgJ¾þü½Õ…ä=·þ‰ÅûÐS<½KÑt¼°«0'G¨g pTßú÷#÷FÑÕû‰/¶(¹4];¯³3^·€¯#¸½ÒÎÒGLÀG°a/0¼]N÷áRáS±1Ô.‰»}92ëD=ºCƒðZù·Ñ™H¥Å˜ðV8ûê5¼ûZP‡hEmR‡tèG[—ñ^Žâ —` u˜H‹—Úrü˜#uqãf°mZÏ¿¤ ;ÈÆû…<Ôˆ•Þ]On&Yfá(ÈN÷áÔîçð•!ž`~(®¿8e¶œ_˜ðlöŸ&gGÂçˆíÓˆ–Û½²¬ñª´ M€úO¢"Àî¹íƸ†CÀ0ȇé>UÚ¤VÞ‘)2Ä™I„̪‚’[QeIn\PÔÝTÿúÀÆàQÞŠ3E"G…QpðÂò9Ç;³ÆÛ1òÃ_ÝåÝ\M˜Ÿ†àÅŽ` ûSŽ[]oå@Ëh{Ãm“%M8ÔK²¬rœ·p÷uG0``ôYžu8z¿c œÕPD |*¸hŸ™Æ&þƒ"âoJs"§ÒžÍû±zα:ó"Ò1¸Q8¾#ùqcUÊ‘+n“dÂ[Gx¬1“1ª·aQ6F3Ï|t\C4 µøƒHÀªe0*·>)®tc|J^ôÃCœà¨>®6¡‡ÃŸœA,y’Mm[È•Åþ³ùsŽ7tô7ª™Š"Ø£áL<)bÅá·HpÛ\Vp6'ÜóŸ ˆQ@ F1ÔlB0c^;9"„õ|çGÄZ§`ÿΩ‹#>P¸÷LÔ›Ì"˜"a1p ³Œéá&bsýä}üYNu {)8*ì¨`ÿœ5¼µókx·v\‚Â@Q噀sùg5|\!âøÜô8…¶ôÎ%2âR4RDf„|ÀÈu"ØÎ–#ªÈi>¼X~_9IîbšAî‹$A:J*À–k!‡¸¡ò%B+x·ÜÄ‹ˆüJª+eM7FÍFÀ)0F.Ìù+ØID ”€:9Ž(%(wOwÔ“¨‚FØ’(!`dŠÃV&öã­gð%¹ü¦JÕ Ñ‚zF2j+š²‰Á~Fv=)pÛ©—ñGÈ©ˆ TzˆÀ¼Þ8„£FŸâ  7ÕùnÙÓÖÁ¶By`üÝp¡4øÎ¶¹x±¢Ÿ|O0‡ÏýO{Ù ì£M/ÃáÙ]b™ _<ûEù¸a¶ é~ ->p^GTg¿}'íôúœ‡¨n§{xµÀï *ï½àu6á<íÀ“%Ð B‹SP~p&-ò$ëï<:ø+[ïŽ÷v¨Õ W€u”yôJ—‡Æ Uãd¨GذQ£›(g&°åëØ᯳ã„D„`„x¹Q)–/Šë]W ù\%æ*ÆSòû W* v–äù²ÑÒ\jK¾ Âd+ZÚ€Ÿ¼BŸÐú„Á½1ð0^ž%tÃñâ®ì2é¸Do@öЖÕ}Âç’ÎUµèÃï»Vj?:dÇSHñ«®à­¡Ÿ9*i'ë ÃΨTò Š.,Y§a8©ŸeÌùŠÓVÂŽR*,Ddr•=N­³ðI:Íä_ֈ̅Ú5Œ2À-”Œ,7ë¨Lˆ “_ >ýD‹«5z‡³ 9¦° ðdµÅay±“÷æÍrÀЕÐwç—A¼O)¼¡ý#â0 ljW.Üu¡®ß˜àÇøbÅ5¥g%Íw¥t”Rr·/Ü£LÂLó€$Ä Ê‹+iÝkXþ¾ æåƒ¡[ŸdÅ:ÁÐÎ:aƒ`ÐÞAÁÐ¥-:ÑòÈX ³P}áâ„ÆšúÓ…!øNTKÑ5ÒZÝKЕÉÙ©Ta N=' Óè¸Â¬´fJJqÆlYøäÞω꺠d£Àñ)¢3 K(…R8/=â²€ŒÏÁmÄn­iÜ"Þ9ÜxÜiûŽVŽEo¶Mí¬«1qoU‰ðqS‚7Ë\ÍR»HEa±ë“‡XI¡uJÒǰ*…‰È$(ÎÊà)Fø)9!Ow6·óžÌû‚¡|b–"œ¯KÜV^4æŒ[l\[±Ÿ¯ÒN'EN‰æ(|õÑQ*ä0‡æRp † ~:(­p²Õ +“C·d\šÒ¶µø\\vXÄ% nxÊNeE´DØW0c‡×TK*ŸXã¤É›lÞšP³Á„Í•§?kªàѪÙ]©^öÓG%98—×ì: c‡jm‘LíÈü·ªXÃmf=eÆ-3ÌžçéE¬c)–Níla>¯œä¸AOZÓ ¥Ü{äVK²b¬§|¹È­yêOgNŸR P%­u¿’xézö˜®ÿ#>éæT—T .lQxÉÀ­£¸ ŸÔAág3¥¦s¬PÔ¬³K^s~8ö½Ãº˜ÇŽ8UtÔªŒR«çýŽpö%#´²•R™è¿pkÅÍæô§…çðñQè.îás9N¼æ§.G‚`H§Ò-ÆÏ^<"á0÷Ïð`—%„ úvÏâ›tIß¿|,ƒ¶e›«6P íÐX¡Â—göüºÏ–©ó®[•RÛ ùJaÑ;¥á³ä#Àç)¡¹C^ÝaÆl Jႌ8€$“Á™@¸ãT4˹Ñ7â ¿G#K àVø·ÚM Ç8rDðúJ†Sei ç0ÅœJÉd­C";P<©à;fÚ;É(½Zý8%%w2AÈù’ #K繪òe+ňØYÌë"Ê{Ïœ`Ü4”p?CƵWÐks²çwxå¬5<£ “;ß=êöçK‡Y]IÓ$Õ.I©¾N€žäVúì+'P0!B=üÌ<«³ð(‡s×’ÌÖgÆ£/äÒׂô0 ’³ÐùÑà§½·çD%ÅP‹Á„r”æ…¢ë+»¨iG%} )m%’Âi)—ÙÍAáG¸@ L¡‚ÛÌ. _:t>‘ÇqÉu ¬Ë6‘h{颣g±ÞJÆU¥égvɈÔózDˆEøÅ3âÕcâwÂ_ ¥À1Êmþ#n'Ѱ‚Ý{šI›û%"# ‡eŸ?y&&/0%•;ÁÂNÑ!+PÃ=Ug4d’üÊÖÆpu:êU¡ïM¡Àåˆèn÷Ee‚|7®³²ß`¢‚›Ëýuw æ‡V‹”ç{’ªƒçq§,d0^½9“d„ÑšUyÅ{ÄqÊ‘t≊j¤SD¡yXÀ'C­i¶¯í‰JMÕ1¦DYÒÿ™'óúd¬yüÅw>Ň3‹ºßáÞÄ\¼é3Ø[Oú.†uŸ?ù}2Ô6¤äÞCTŽ¿ßÜùƒª–Ÿðâ˜}87'ñ:kMÀqjÝ -èË ‚yI^rD;Ô p®ÕË|çD·Ô.Ìá JŠÈUŽ‘£N¿>,ÙS\ p|D4#*!WÊ´Ù‘ÂéGônÔ}~,n÷ i,yœR!1ERÇXÊÑùÜ £/ß98ÌÊ8õÇ„bÀßyT9Ò/Áˆ1¬34}RF`²ÁIÕs„^Äé§ã"Â,îï‰ÌÄÄÒKVÄh”mI9·†-0á,å3)Ý É–‚§ÜñP6¬Òk@Vðù‘ÅÇÊ\N´é‰ä+¸êüØ[%*ÀЏ´þˆ;uŠäP^á‚ÈÓi¿*9•E/TTïgÝôÖ ™œb­~“îöwÀyl¾$b=…–V¦9|²[ˆ³èƒ Wwe6óyÚ±­]äk´ _(&FÔp!ËYh ÃuD[“³»å¯à úO¨¸3²žõ¨äÈÝÖ”î$G7x±”_æ †wpÞz:l=™·^ñ[·ƒ ë æÛÏéw~ךÜíþS”ê¾UÞ±è±åÇKc5Û½ìeü­£}~øv_»Ùß&ÎÝwì™´Oñe/ë÷øñòëËÇß­Ö„:kBÃØÆT¸ëù¡ÏJŒÄ¥ % ;i cÊù~úÝê“À¢Õ¶ ýXg=P-m̲áo/ß2ùA“5?hºÅšÛ´Ú¶8üж ?ô2þFÖü Ì?(mѶ8üÐ=Å—½¬ßã`~ÐcÁG>‹;û ÈŸ&\öð§fLȺ yÝÐò.¹R!Ï›‰Æó 5*ø@']kChÛÂj[~´_¢ÍÍO‘u7d9L÷¡A=¨mÝ45L×Ò}i9™þ)¹îF®‡ùÕbäDKeâÝ>î&x¼‘5–TjÞG{ŠIéc¨Õ«×~Vëöõ±­b`Nø²!”×Ú¬y­ià ^{ÐóŠ×Ú‡×O‘u7d9ÌÄkM+\^k¨p†¯õOÉu7r=Ì¡¼Æ(*¯9¤—‰Y©ª®?žß…"ºRÌ?Ø“>¶ a8³ÑábÕÌã\X<Îåse3_Ûâðøã)²î†,‡™yœó-o`{æòøã)¹îF®‡9”ǹ•¡:e —•)ÄèÓ0e– ÙÞR#×èA#·ÐƒFÚèA×b{K][£—½Œ¿­ÑƒFn¡´Ñƒ®Åö–Oñe/ë÷8Ö[jäˆÄÄ=„ÄY5ù2ò›Ü°Ü:—áZk'÷>ú)›¯œR$3"M4 ‚Äi¨/ÛÈÑe†-‚u¯"–îí¹×Ö½-ÏZJQqW÷>ž"ënÈr˜Y÷ö¢ÄÖ½­¸±†i´«{OÉu7r=Ì¡ºWM—&É Š¶cš+• Žõ×Ôèn1Ê– Áô¤-l¤Ñ›Øˆq°³˜ ™»!ËafzÒ[ØH£ml¤kqèIOØÈÜ\s(=™ ÂÍNXø/–ôŒ˜HÏ,BIO *Pd *PĆ º›ôú§Èº²f"=E¶ El¨ k±I¯J®»‘ëaŽ$½nš+uCgÆ ·Jʤ«¦œ ìÔÑr^§‚ˆVt´ÿYÖ Á|Â,w[±-w[1ÛÝîZ>a“»=wC–ÃÌ|¶ÜmÅlw»kqø„MîöÜ\s(Ÿ°ÑÝŽ€Ôb²IRÊñF¤ž£\?Z¯,$âÄí,âJÑXŽâdmD Á%˜ÅQ=ñÚÕ~h‘º.G=ž"ënÈr˜™£ú/Ú%ˆ3 q9êñ”\w#×ÃÊQ"àX?ãÖï"…“œ˜ü6¢— Á$×X~›j¶ü6ÕØ~[×â\3ùms7d9ÌLrrËoSÒöÛº‡äää·ÍÝÈõ0‡’\ȽåGU@Éþ9Lή?ǯ¦Üç™RÇϼkF/†3³l– ÊòÀ•ÚòÀ•¶=ð®Å‘ zòÀçnÈr˜Y2¨-\)ÛïZÉ &|îF®‡9T2ht%‡+°˜ÜÔ«b,N_˜p8[è hȲ!˜-Œ˜MtÀ8è€Ù@ÌŒ˜5:`ltÀl¢ÆAÌ:`ftÀ¬Ñst@ [øóRJe†1•œr’ï®t±G¤bÓd `bÙÊÁšZ¸…¦[¸…¦6nѵØÜ?EÖÝå0kº…[´ûã ãâýSrÝ\s(S?nQˆƒ#ÊV¦ÈŨ¿Mâl„Y6“8·€Í·€Ím ¡kqHœO@ÂÜ Y3“8ß4·„®Å!q> s7r=Ì¡$Ε—Ä«¹ 9)W)€Eˆ™œR¥1&»LYŒ¶K!zE½5.ô²!XdH Òr ÒÒ‚ºGdÈ š»!Ëaf‘!¶€ -l ¨kqD†˜€ ¹¹æP‘!¥Wd.œŸTÉ<kµ~¾ªìåË“†°ã%„!¸/ÅøN¸øzDõYóIæ M %“4QˆP«Ô0 ½1l ½1ÌFoºÛ*íŸ"ënÈr˜É*5l ½1ÌFoºÛ*ퟒënäz˜#­RÃ&ôæK¦p¾;½bе °“„‚MI·` æ pSâ!Šׯ~™éQþüxÕ„ŒóDZ‰4ÚL.‚«°0.#¶0.#lŒ«kq«˜0®¹²f¬| ã2ÜÆ¸ºG°ò ãš»‘ëa¬b*á>¾'ÒÅ5b‘ˆ^6–´p$#·p$ÓØ8R×âV3áHs7d9ÌLXr G2ÒÆ‘º‡°ä„#ÍÝÈõ0‡V3âH;ÙO))ôá:6àf:”ú v¥¼ptdw8ã46dÔ²!˜q”McÔV4Qv4M×â0Žš¢iænÈr˜™qÔV4Qv4M×â0Žš¢iænäz˜CGOÑ4 wËêáZ“OÎvïC8•ê)Ó…¯‚©ÔX#ÆlEŒcGŒt-•š)bdî†,‡™©ÔlEŒcGŒt-•š)bdîF®‡9”JñŠ÷¤Ó¥ Å=Â(M~’Ë„C¹¶ß˜" å²!­Ã/BM‰uýœ;œšþÎdx =ÿÕæIµÇ0–1&3å¼Ù $¸J Ãîª}‡kÎ-}9£Y—Pæ$áUBËq2ˆsJ•£\ΛPÉœ+yMn,Qûºwqá¦dï‚4píJ¸3”²ôðíñ(òG‡–.\4*ÅSƒ{cCMóÐUïUEh’ÎKrr˜0ÔV–Sé"œ"k8L…sÀá/]Ÿø™!È:û5¼ÜŠºžc³#}µKüî§yÔ/lWdÂRˆ”Ë–rÁ6£—©&`,%|Ýg¬û—àê´Óá¨GÝ•é÷#üïvë•Á»}ijí¶{5\ÌÍÁ¹á7ÇÀ0¸1'ený½²k5á¨Ço” ù™£Œqö&ÂÝô«éÚ‰ ¨;~Ô-Î׸ò  XKáºõOpW]xX¶¿÷À2ôÝYE˜˜ýr´pìEIލ[º¿Ð¿»â°³†{†«ƒãýÖ+Bu—s—¼}XÚ’{ç>"7Vö0(c(áêêÿ„Þ¶_¿Á°Š&ȹ¶§HŠ%í뾂ëʸšñzƒI°³¿"çÜ.ÇÌO˜?ámÒYîÙE}ƹEÞO{#x¸ÉV‚uÅÄ•’RœÃF¿ÎA­éZ• g©¶”,yÕ$R­sJ3púC„kC˜%\ᬬ§»•è q;šÀ ‰½w‚y:‚¹‚ñ2äïm…R "ê›aä´§ó‘n3ï<‰OvËÀZÍüÈçc?2@ƒâîÄß̱4âAÎ|>x¹;[|¡Oƒ„š»Ñ øÎ@]!3±A‡_®ø;s‚ßДV¥ƒÎh@•õ²X0ܘboúc›SB¨*܄ֲ&3Î(""Áw–/ÂG±–‹ÿ1])•Ô+%3á*gŒBÏ…ª^FÈŠœ›<ω‹Ïb/©E”­F¨cl#öì£õD¼á¤‡ÙrV ÓA§;OTPËbº0ôJP˜1@óÀA‹ Ûà$Àœ&¹¥ÞÏJpã ¿@ßtÝÖ'z†ã¾3ìXÌ»s{0@Õu?3I•w·‡\ë(:Œ‡(:¤ ŠN϶hÜÁÁ¸ÝXÙ5)þÎ¥Àô¾ÏÎÜ`Z}E¡­Is§]&þš0h a,n úŠ)Ÿo__þoþH endstream endobj 6317 0 obj 7279 endobj 6321 0 obj [423 /XYZ 40.7999999 147.860000 0] endobj 6322 0 obj [423 /XYZ 32.1599999 742.099999 0] endobj 6323 0 obj [423 /XYZ 33.1199999 740.179999 0] endobj 6324 0 obj [423 /XYZ 40.7999999 480.979999 0] endobj 6325 0 obj [423 /XYZ 40.7999999 480.979999 0] endobj 6326 0 obj [423 /XYZ 40.7999999 320.659999 0] endobj 6327 0 obj [423 /XYZ 40.7999999 147.860000 0] endobj 6328 0 obj [423 /XYZ 40.7999999 320.659999 0] endobj 6329 0 obj << /Type /Annot /Subtype /Link /Rect [88.7999999 330.259999 113.759999 337.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 >> endobj 6320 0 obj << /Type /Page /Parent 2 0 R /Contents 6330 0 R /Resources 6332 0 R /Annots 6333 0 R /MediaBox [0 0 595 842] >> endobj 6332 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 6333 0 obj [ 6329 0 R ] endobj 6330 0 obj << /Length 6331 0 R /Filter /FlateDecode >> stream xœí]K¹ ¾÷¯ès€-—õ‚cÏ8@ Èa‘CàÍ&X¬qö¿Ÿê.UOÔŸU™¶ϸե¢HŠ")êÓ»?þÇñ_¿ß}øüŸãWóóÃçC]Õm=ý9žþþpýì+%§_»¾©äpúsüúíðýøýðéðiü÷ûA´çͱq~ÅÔáï_;¼›^~˜>ùüá¯ãoÿ;Êã_ÆÿýrüñïãŸL§/|;ôC{úå×é!…ìÇÿ\ÿvjü÷áo8þ6’Пû=ýûC#T-´Î¢ãûåQqþ{ý(zY}lµmBŽt6#;þûÏÃÏco2ª¾5àï1oêOoRƒßTë‘xç5ƒ¢kuWGßÉSŸZwÇ¡kGâÝNFv•ÛQ3ô<(yCÙÝù»%);ÝÔ#Ñè÷xŠÛ¦>½érÇ>÷”ÍÄ®ny::Q$²F6 öÄ*‹®é™d1÷”ÍÂ^h&¡ŽñÈöÄ*‹ah¹ÌÔ¥«Ìޤà²w'Š˜ÌîŠSRÉI¡;wÁKdâÜS¶4t­x::Q$²Ff„{ªz­„êd£O+÷iÕnú^Ž¿wÊüI ·‘’ÇL]zÊfaÓ1 õD‹™Â=±Ê¢íÄyàRf cî*›‡ýÀc¦Î‰¼¡ÍÒpºúÄâÐËg‡þ»çÁ÷_ï>§àåËÏ#çhúñåÛAÿ9yõ£|ùéøÇ1 zúÓñË/‡fŒŠz!›sÈdZä¹¥«êAuM}Õ"ºs‹®ôÔõ l©ûsK[IÑ[-”g>L´]>±}%¢·¾ê!À~ …RÚ¤Õ6 ä4En­Ý½3 ›Yµóˆó M Ëþ*E?í;ƒýÍ&cVph²§û°`Åôªêö¥,¦‹f¦í¹åÊïýôŒ¨ݞȾ´he¿x¢äéËh˘4ÕÙ6M> òcà™` N[§G«&n 9w¡<òc¨Wùdƒb0Éx¦æžý,-O÷pä6’æL#3A± Pù\Qc3ˆÖmHR„¶PéÖcýt„â°Ë•0AMÜai¤…}l,ãc¤<‹Gެ/a/ ´Œ\úºµûuü¼ÅìH=žüŽ®½j-å#¸/ÆÃIðŽÂ®k¼,H+«£ZŽo‰me¥ƒ½#^pÊ™0RÕ…\_Bo®Ÿþ~).(m^©&†ªk›—3È} ¡åjó램&„…Ø•îV ·àW•3Am'.ŃÁããˆèrô{hb#8;Y~›w ´êÁ<•Ã`MT#£¡j@ p«e€-¨E|€Ï¼G-¿G–'Ô¢àH©‡j[à3ø=”gjTMiÙIµšæfØØ’«FÛZˆð$v”̬†>ùƒe8#¤½GÎ᩾Pœ²ø'€í nÇã#œ¡½y@ޱf i€÷4'~¶ÄŠZpM”¶×¤xÎE,;È̦X›¥W€Ð¿@ŒÛ^Ne.³,ä€î¹(^,V:<ë‹zÆŠI ªRVf lNÐ%qKðâ‘}RŽ=9ñPŒ˜Wïºïl!S½c¯î)×>áTiiH·…0&0ƒDè˜Ã8Ièa,Qrïæ¼˜4¬Ž m Ñ0îî5ǯåAkåµkˆ{%1/¥½¾°J$PYû5.²O‘r”2p…|hÞ€0ÁJä 9H9K‚g÷‡G÷Qû¹æ%g•"Í@¼ÅÊNM(äÓ:ÝÅä tËîsó^oqFh[§\ДRÙs T1OÃNÉZ8<¤¼KSæxKo®s.¡Ør™çñÕ„‚ž=ƒe W?ñÊ þ'†›kÚ¤5²¡:Óø‚˜GÔRÏCëŽgà3|fR¡ªÉ?ºzæ=ìmšƒ¢©z»¾¶ ¹SÏ.š:ø„ZŒ²¶•©2q–‚¦’vÒÔ€ùÝj˜Ê¿¾ÒÒæä(æ›Ù º5RÇ©Æïñp” Ú"àÚM‰ó:1[ ”ð/¢ %¹@¸ìg­<%)œ­*Sbéà,!ó)§ŒKj‚èÕŽT%l'â|–)ìx$` dU”)–äbð¥Kšø^[6žç\oqåz‚µKá™îh/üœà4áÙðÖ³‚‹(åÎENÛ*G+·|( ¢ôyŽ”`RUzÎwÊöëXã}æ{b±½È—v=…Œé[(MG©›Æ ä–TÛYÊ„«a·çüxª›6ñò„Bñ…ç=¬ùº2×­\#½@˜ÜͰ¤«gÌR0‚?¶àYrY?ÃdÝÏ’oú,ùVÝ Ó3ˆ¶ç¤o¨eJÛËu&†{ÃÚƒ©öœØÆTã‘bTl¹(gG='Ý pì ‚æ%ÙX,ml_^™õ廹.¢ôm‹Kµx¤…/7ÀúO¦Æ3¿'d78äØák.ëÁdM@ÄprñòñÝÕ©»hmÄZâѹšà›„ êËÊU ½¹ªFÆËõS||傟‚R„m ^a<×I`=åõh1Ζ­³g¤? ¯PØkXÈ£H[ãYB¹²Ï`<eyæ)Áëh¨X¼ºƒ)ÐË]_"EÝyuo¹·œgeÍ!Dxfà| ~f±•Ÿ°êa»Añdî«ø[ZÅy/à"iü./Ïôp‡€9IòÐ ùÃ`Œ°Œ·pºF}+«!ËGÁ5õ\·Fñ‰qâAጒ,{¹!ØÒy£>Z)y# óFoD”Ö{ÑÕ©xËD¸Ð#ñWæSQ¬&å’JÕï„"¬žËŒ)—&oxóžòÆ™”¹°j¦Ç_¦$E7;¤ŸæáYkmchv|£ˆøŠÂ+Šç3]¨lêªÂª±Ÿ}ˆïŒ­ø^Ü#…Í–Íœ2I0§Û]ŒÉ=‹Tò.ë¤Q8*»š’THˆÏêÅh/~U.¡ 7_f›˜àf«ùÊÄìr>Ås{Ô¸0´žcT90sÂÀ)¸rÎÔãÀ{Û¹%IXŠ®¥p–éí(¸é0Ë=ºÐ³v ý²®%èhe÷µ½°’¥²„[PKÁ"KÙ¨—ä+Â"ãg‚EöÿbPbV ãg@ÈfÏ3²YB¾y¨Æ` i ˜<Íé40g uǃa«áH¡´M9ÛžÁpÕʸ[»°y²KdSÇ™üˆÄ%ærC'ÄÇ-x\ž[v0w64 ˆlØÓ¶]W- Â/›ƒKàš;‡X/_/‡%lºÎó {¬×É6Ø#d‰§WÀåÔ¦šöj%ø0/XöÎ@ÂÝÖž[y0 Ó•7ë^½ÛÐõ©wZ%`«§\™Œµ¶„³ú®f…£&ŽšÐ=]1è¹Áªç˜{¸û"“4x—…à³1Õ >¶ºX†ç5ä. €«x@9(0˜¼ÇØ1ÕÐ9 dÉk“œ†}A¨<Õ_xE±ªW ðZ;  3ôÒ.µïn7ö*¹ ßÊGZÍ )ÇËn7y²é;p¤Ý †æ)ÛùÕB—(í ëÆsá}Bæfû{dî{ñ}©6;qß *]z†RJ/Y¨H1_ÉUh­hû ßLb?ëaÊ)/læÓ­¤˜ ŽûŽ#ª(rxÆ{¤óQ¼E -ÊNýt™íôàqJ9sÕ<á ˜ÇMp·('%°x¹qÖ7-¬å$kò'xZή–SºUäõ¬]–e§ˆŸwÕŒß aÝÉöЯ)"§[?,%™ÖÝÑðö˜9/yk{ smí)´‡MsžÚŽš¨S¶hù†~«± ‹Îä8pn!”+£6µ|kz@©W¢ÔUd N?2Á‚yèɰâò ?ã§Â–3ÕekáÃÕWëC¡n8¥¼Nž¿¤ÉÖÒ²Ù{ˆv"rY,ù¨„5œ€æDÀÑ^ý@\|>t–`Ⱥ™C)] 9o‘Ó†6F3òþ<Î=5o 4ˆ¥$´ìÐØ«JÙa²uX¤¬iæ‹S·\“НE‘ð^q oß@ÍðöëÊCs´6œÌŠÐ˜ É`¼´ÐƵì*eç?—‚ÌÀ Ø q¬ð%“Úf>§ è a/#áð*v­—9¯Ì“rH€ŒMÀ.ÀùÞsDáta—g3Ù»¬¢¼]䊜œ &â vN8@?ôS@H‹8ˆ]­_ªqšCµa§’r̨a;æÁy©vÀÅ»kîãèV]óíÓr×Ú§ wíËÒ¾´ƒmp¤ž›àao R­¡LäŽçVYh¹Ô‚©™îrüK˜÷6]‰Ýëª+°öñïñûÈ”qÀ§/˜_¿%!¬^·~ò2Øûh8mÑÅ8Œ[·t¢­¦X]Ü"SìÔ¶U{»ìjЕãÀMŠ,»ª»}Aw£eRJ¥*9X€ ›ª|d{bÞzOŸà3Ódîd%ëó¦ísË{ØÛäJ]ò¿k‚‚#üˆž1‘Ó­ÆaÂ’´gŒÄRÆnh;O€ ­;ý.Ñ¥mîNÒÏ3PTõÊÖ#'ÜyŽŸ1qrš^—˜Á¹Rïûº­Ä)³øRü‚ þk¿ñ§>~:üìâ endstream endobj 6331 0 obj 4602 endobj 6335 0 obj [424 /XYZ 33.1199999 720.019999 0] endobj 6336 0 obj [424 /XYZ 40.7999999 695.059999 0] endobj 6337 0 obj [424 /XYZ 40.7999999 349.459999 0] endobj 6338 0 obj [424 /XYZ 32.1599999 721.939999 0] endobj 6339 0 obj [424 /XYZ 40.7999999 695.059999 0] endobj 6340 0 obj [424 /XYZ 40.7999999 349.459999 0] endobj 6341 0 obj [424 /XYZ 40.7999999 208.340000 0] endobj 6342 0 obj [424 /XYZ 40.7999999 208.340000 0] endobj 6334 0 obj << /Type /Page /Parent 2 0 R /Contents 6343 0 R /Resources 6345 0 R /Annots 6346 0 R /MediaBox [0 0 595 842] >> endobj 6345 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6346 0 obj [ ] endobj 6343 0 obj << /Length 6344 0 R /Filter /FlateDecode >> stream xœí]KoãºÞûWx]`4âK$¢Àd’è¢@0º(º(æö¶¸è\4½‹þýJe{H}_¢- q,óuxÞçððã¿üýøÏߎ?ùÏñ«ùûùË¡mÚ®_ÇáçÃåT5ŒŽo¥ ÕÃëøõÛáíøvx9¼ô¿ß¤{ohþô§!Æûúëáã8øaüäËç?÷ïþw¤Ç?õÿýrüëßú??™þ†/|;(Ý oþ=¾!”PÕÿsùnxø¯Ã_~wüµŸ‚zïwøýAN©¤Yóx;5%ï?—MÑ`í±ãT*~$„öó=8þûÃÏ}o§i4Š3Â$¼¯;.[¡íßKf^A#õ¿û¡:IŽZvÇþSg g½a]‘ÜŽ”–e:fDò–FZ.ý]5ª3/ø>d 5Œ¢E?J?dKkî:#!¬ÛLŸ»Êíˆ U¦£aF$oif×=]ÝŽžâG"ä¹Dxê*Šde:fDò–6mîªÑœ9lC0§g'{ò–)]>¹Î©§l€)^†¾Ïˆd­l<ì©((Í íÅÔS6uWˆ) 3*³°§TàmGÊÀýÔS.¸8aeˆé}FEàŽ{*IýsuöÒO]åvÔïF™Ž†‘¼¥M»átõRD§gýýÍÓðáõðñ™ô´8˜+¯?÷3y·yÆ?¯ýrÅñàÇku|ýéøûÞðyøÃñõ—ƒn„fRŒFÒø„jô¤¥ðÉzÂzB:؇sƒm(ãÀÞZ8·Ï CçSüJ)ž„hûŸ0øä9ad<†àÝö¬çsü ˜€m ^›'O¯=e®MgŠÈÅu +L3˜2 mâ6žÞºŠ°ê%ë–y‡œgçI;O âIQôŒñéŠT+Ķ©âåNµ;ÕÞ&!ù¦5 Ì­L›PTGÊç@HÈ;5§ß#¡çI<ÚŸTél ¾üж¾BGÄ#²a½êG…Cä篒²Ñ½‘>ÄÆªËqÌäXìï3`Ût¼í¼ºÝ §àÌVÀP§Û‰– .¾;r“®éÄ0W—bCÖa|Æìê·¡rZX'‰’AOÜmoQ÷x\¸z›1~‚!JZØæ¹½=Go´éMiGøµã˦»™'†þx#…ýö†ÛO°Fm¶US àzž¦ wPü=1S4Ôì¢-dUÃÇ \´)¦âi wx;l"ëMÀ Ø¥=MC*ÊVëdÓÑÌϳD¥[kñ㉘z±õ"ár˜‰É‘Fðîû-³6 ˜Ð†Ï«jÊÞ ‹Zûƒ ñL_ކ g˜VÀ^Ÿ ðx >áp8ÃRÓö\®e°ÚAë ^ñrà¤iÁ†Ag—á®B8‹vì¶¶õ`{Äx6‚zàYÆÚ™£÷l÷€/Û¯Îhȃ½ŸWš[Òóì$¢Ïö6,l ÌÇ]–=iþh&-¡¡„}%1†L?AjÅr†o ³¿šÂ$H Þ.ãnrh±4£t¾ê ƒÞbÛ-p];ŒèªY.ÉFl[8è]ì/¹%eòŠÂD [˜ÜÓKbmp`Ï”œŸæwª‚eÈ'$¦`?ÀORnüËcreŒ8GqhÚ1óøO„†°Ëã,yìAîûïF¸tȲ\Žâ°ÐUäòí Ë5 &ÒYL»¿Êê»Ã8ŒËù 'è<’¼9ã»¶Ó&€¡aâÁ<á1ƒâ±ÁíÈÊ·æNWF;ØÛÈÇoÐF™@BÐ0EEìÀ:ÞG¼¯+»!+»=‹h‹4Õ.fz›u»O˜D½qÛ‰IáE<°ç¨$l³hªV°¸^\@€íƒñ3<æY½óPÞÕ#Ç!Ž„t¿"6LN¤Ái£p òDØ2+ç >•b,‹õKmOI!›¬Da}˜½NP›¶½ný*F)Ù4^28ƒ$¼„˜„a@pM%ˆžÚe¸º®-i“«-€I|yïo¹B+æn€•Л¦º²õg÷êg‹ø"Õ¦i«bUFµÜ4m•­£ºiÚŠÂË›¨ÊÙxߢõ@7}uð…‰Åuß2g7T·¾sŽªéMÅycW…«u¦ ƒ±JäÉãÁËÁ“^âdDºVr‡æ„¤p,< ãñ7Õåü·”ù8ÀS[ÄE]2"\;i,†„óϪ¯)”²åÁÍq˜Û+wáFQS¤Û*Ç>c¢ÒáYdžpÈ|½ø D­¾•Ê–\;*VûÈÝ: M‘:;¸ÆYþ–Zìÿ†YM@jÜb‘öXD©ÊE¥#~ž€x‘‹s,X¡¼œ‹I‰tX“K8íçfšg˜ð”ñ\3€w§ilÒKX6€`À'Ø'–7Ü&ažø2Î(ê¯Ã™ çJ`ï*œµÖp8*îÁÞ„¨8ƒx]3*ΥΠŒ=O¦-XÞ `·N÷Â&íV-êÆt‚±bR =RoY¢º¹qpŒfÇÿ¤ûäjå1UæØWŽíŠÓm¶IZ\G“€{²i©Înmü>Ý™›Ôï1ORˆmGü±íW3ƒRœïÝ$u—Í Üõ¤ÛÖ“î’i¶ y,A𜗅ۤð1Œÿ |Y`K±ð &¥ÀëŠI°†TëY¦¦Ý7… %ÌÀÃñ8¢E÷ÔÃU+y9S4‘²˜è±$a›눵 ÐÁëI±1¾a+bo &&i%kÌ­ŠlëÈÆOkîÚå]žÖìØ¶Ok–=Û²ãånõÔ¶z:‘c%\ß{SÎGÓJÏik…ËV;Ĩޝó4Ñ“vJG‘Â~{Ãm<ãhÔÆÔÉò®FÚLÚf¬ s1N‹ž%V5Ü>³bòŸºÆ”½¹x2–h¨S„æB΀S )R’[~÷¹ÊDáÙF‹1׆ÞÅÁ‡˜¢@Eà\D|G Þ.§àMx%š¬úHh<:0l¶X~éNnȺ 2_>±ÀMgn‘¶øk Ö”²³EÄê›Dè*ê¥Ô§tPå÷عÕwìK1:vc-nU0IµE¡’bt`L‰d Î O:R­•bWñR¢g}Í\Iú=òÒ“JÓ—PÏ".BÞõ™+ÝÔ²òp­²Q{—3INÁësïE®ºfAí°ÈkßÕá1(Ãuz÷R•+ÞšÀ;a¹„úŸd4gÔÖõˆ\v?ãùº¯SOÄ]Õ:GD|?gè©Rñ¼Ÿ¦ÛÎEÞ«ÿî"úfpD¯b Nó)ƒçÈã™–3·ü0ÞOÂAëv|'S)æi#`†>Ý‚`#o\dÊTm›‰LQØg}¶³Þð88:cpžÞðJñzžá *ÅíxO2ßoâ-Æí6~ ÍÍDò"<')ê®G¹KPÉ·p¯Vì¾³»û*mANãtÉŠ}1tàX¤×a†kJÆ,Q°m~[ÑÄã­ž´½=r×Þ«¹V“Y>XåŽg¥J9äO­{JZÅò²eêË%…/hí¤“6 ñÃ:z”Ó{‰¢Û> endobj 6354 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6355 0 obj [ ] endobj 6352 0 obj << /Length 6353 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË|ŠðŒÇr`x€‚o6Á"^d²‡üý¨[ê‡Åþ(²XbKmÍ3msD‹õ`=ùþ_þ¾ÿçoû÷Ï_þ³ÿ:ü~þ²•¨Eÿµ?|¿»þÕTZõ]c+Õ¾ö_¿íÞöo»Ï»ÏÝÏ·¬¿ºÁÓ+ú ûúëî}ÿò]ÿ?_žÿÜ}úß^íÿÔýë—ý_ÿÖýúi˜ïðßvM[>ü»ÿ •TM÷ëO‡Áíþò»ý¯ÍqÞÃÏwVZcDoçGåñûúQô2±¯ÑÝg)U÷Ãvèøï?v?w³Á¨£¥vÊšîs['lÓ¨î³ÓÃWÔ›œ:¼J)½o]½—­ô^ä­7rªÜ‰Œdšè‘Ì[𯅧ªZ#¥;lCô&ˬM¿Li²1vš*w"ëÓvɼ¥P§bå„ZµýÒ»§2ž*w"WKž‰ɼ¥¶Oź\Üqž*w¢Ö0 ¦DLܧ¢ &+,—`ºL•;‘¬yÓ"Ô¦âä«dõç©r'ÒšG0!bÚ<™LÍ%„.SåNd:BÄ„z<+'ÔŠM0§ÊÈi&Át€ˆi;¼©>³7êbܼ|zݽÿ$n¶ÜëÏ$Gƒ°ÿõÚ-×îߌœ¼×Ÿö¿ï¬Â§?ì_Ùµ•mµ³½Ù¨G^ЈnЈ¬álŸQ¾Î& lƱó!}¥ Ã1*> G>vÁ¥SÞíÀzžÓ!Ð>é:@ñ® ¤*ÝãàåµãóÙ¹¶ØkæZŒE ת’˜·j¿H!æñ3Ùê‚ëvrÝ%á¦'6=¥'ÊðY;½n‰q…y¦L$;®Z€(#Žˆê¾¾g[iÕHe}ycd sYQW @efŒþ&æÙ@O‡¦2ý#"b6õ2~±C“ˆøå`Hjª«Î¦ŸÂI¿íRfÉBŽú8Z(^Î … šêÉCʪ3ëˆY¹A#ÊM½/åÙø]2ý^H}ÂV %áMÁ#b #\NiBõ·ïæ;ü> G ¸ ‰Žd¡ IB pæøYõéödsŠyÓŒä|^¼Ax‹Ìm4s$ÈÎÀ$“Â-ð ¶r(‘E<–j¥¨üâHÞ¾AY†QàK~ me}¢ «+Ï‘ÕÅ#ÃÃ?•OcH<ОÔ—€Š3»úh¬«ÏâãmðÅ&¦x.]·´3/\{8m›Ö oÕÐðn@Ë^bOö<"›')oE(éÊ7II¿xÝp$@I¯(¦ ]–ŒYXmsh{©0F {Ð>/(+q8»jÞ¸XQz±fšSp®›ð‘Ö¢9ÙÛ´MÕ´¢þþüÐ#íIÕɭ3>Y.Æ¢œÐRN„x]e‚W' ¾µ1ÐÞÁÚ‡ÕÃÞ”c~^ £L=âû†…«A^ñ±Ç_ÞQ>Þ›À¬¥…ý[ër)ÎïsUnLo÷ ù ¢zL4œN¨»9x|î„BÓçyoY¬Á Ó¾¼{<™¢c)nT Ðñl æ"Ôõ)×i9? *õ-çG,ÞSS7ëÎ8Ó‚ú²¨¯T¾WR®_ÞÓ4g8œ‡G0Fð3„±½`®¥øÿ(ÔGȆ @#N¬”õãåஇBUj’kÞ\YLsìO )ÛG•„Ü_Ò9ÏFà™Àl”ìc¼ o‰‚Ï8kï6ªØÁ¸¦h#Š„Äž|)1z…°âÚâÙJ×±ÜÁöœ Ÿ‹(Ú•RY€ñ°õ0×ãÈ!ASZWPƒéfšÏ¬ÁÑOÊéîcàÜI±2pM†óæ¦ßiúâƒÀ–똳xwë6J Å>$H»õ2§(P, HU”óW@³² s¥nz¶0v†ÙæÏέ95†« Rq^AŽXœ9Uƒ7²è›¥æ+^”eq8¥¦×ËU$¤háéõ¸Jvf‚°™¥bM{‰œAQµé)¥zNHÈT‹8¡áuæÀL¨°ô§§NϨŠZÕŒT‘1ˆÌXo}üx”ÔŠUS<¦·à˜ß¨l䣉#RYר¹#ÇúyÔö&ÆBÆzæ§0^9®ÛHØâåœOY3}¡3ŠLÝ4#™ÉÜÇ;’¸1åà_q0Ê0CJç“ó²iŠSâ^ÕAÞÌ[›ï8(™{ßÔëîðºåÞ‹bÙÏ%«²mã×L—[V~9ºÄYùFÀÙðþàJ'Z(Ÿ¾qÔ¹ ¶bÝu1[ÇþUp`ZVÓ¸Zr·ãûK…36Ùr=ºMlo¶'è»(´®õXNô_`>¢q2@œÀÙð3â=Ó¢gä¹µ®ëM€Ë3Op==ûHQõ˜«‘v0}ô¸ÓÊ`ו>Úd7•^Â{ðl‚(¼ üžAˆ5•Q#\ã÷ ÂòÖÈ­z3×ÃÁì>i+ÎýÄÔó ̺§£±ÎMò¯”îÓ¹†^›žJÊØg`úYUÕ ä±à¹ÛóòPÏæ«=OˆŽß½5kp?‹1ܨ%§ÿÑÃq§#\q?–£t üÌI… 9 •à‘9OÍX{<Ø6—‰ŸÌ@_ƒì^'½$äu¯±;x¡Èí4uÌÌmé)¨÷bR…yɨhÐHyoKê‹ÞJE×<Þ(BNå}æÉyÏ ›G º*Aè͈/`-ëSOßJï™6Š Š}[ƒ"µyAÚ’’XÅRÎ /ëN•äô•9“”D3 xÑ ÎŠˆ,Œä¡fÉ+'ètE=KE‹ Ÿ~fXçþê9¹¯ñ¥”ÂOÍð\Ó_EÂzÛPJ"%#ñ1,pì˜+wÍvÏÕÈc¦#¡$)¦¯ó¡´w $PRkx§Ú×P"p"¦X¼?8ŽB‚Ç»lw8­c7CÃÒ Ë¾BíZ˜G UÜŸúŠá€0b v,Æ¡Ñg`„ЀPZZ™a­…Så>”—ë* ͶH­‡0½Z«Z B¨5¦ H— ãs-|ôb ½PMi,½ òéþë ha¬?°ÎYðJ±ÂëÁPtÎ*±ƒék–…`Œ|Ñ@`=ø¬z÷õp! È3pÛöR¹¢²=_7W¤isÿ¼@^$!6ˆÚ°f°x² Xâô ¦¸N±Ã™"Œ¨®^j|;*:>˜8ws0ÖvIk·'$¢Ä'~—ôk+{.ÍÛüÀ¤²´õ,–¡>'6êË£¾{Ô·ùõï×SM»ñæL¼y_` 5.Gcúrk3Ä"ïH©c«kç1‰è¿.À”*16ð\^ût>~÷8¼!ì¼õèÁQc¥(8Pxû GJ9FŒ8çÿ-¥ø+éÚ€{å /§þŠ¥ãXV=D…€—ö6½Ã…](^–näÀÆ~b¿Á·=V>ÏRàÄRd@=Ÿ-ù§µX@¤–ÉgŸ¬bL¼ñ.|cmÀš\!:gylß6ùÚ"™%ÌdOF¤gVéŽãf!o9¦˜ù§T:añZRû…žŠFEõFØLáÍÞLášÂ³JL9™›µ½YÛ1wÜm¦ðf o¦p9IÝhM?ÜnÖvÄ{7k»ˆµ½ìŽBÆœ^¹"“:ÆÖúQLá"©¦=ݦ³5šNT„’¬<©ó@ÁNÕ£”Åá”@œ˜ƒ©à›¥¨Îvÿv ŒbØpº"¦r˜JƼ§jЬÁ%ðsàÖ*BQÚF;4ÚáÕm=Åå‘iX-'9ƒ¹! AªN¸‘Ì&o‹ñ sðÝÏ áM;­µJñf€ú¥Û¨°¼„\û£SÒ„Ù__âóÐÏz+mq§O|Èl:üá‡Ì¡÷à=ÄTÂñÆ1–êª#pç6¨+y8¢~ÏÂ’Àƒ2hSFMºÿ¼û?¯Ô Ç endstream endobj 6353 0 obj 3759 endobj 6357 0 obj [426 /XYZ 40.7999999 598.099999 0] endobj 6358 0 obj [426 /XYZ 40.7999999 598.099999 0] endobj 6356 0 obj << /Type /Page /Parent 2 0 R /Contents 6359 0 R /Resources 6361 0 R /Annots 6362 0 R /MediaBox [0 0 595 842] >> endobj 6361 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6362 0 obj [ ] endobj 6359 0 obj << /Length 6360 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Ñˆo ÌŒÇö°€1rrf³ ™E¼{Ø¿µ%uÛ¤>R,>Zò´ Œ{,‹,ֻȪâû¿~ùçñß¿ßúò¿ã×éç§/‡¶iu;~Oßï^þ‚wàãGÓ©†÷§¯ã×o‡§ãÓááð0üût`úùÅéÇðpžbð÷¯¿Þ“Æß|ùôãðé#?þ0üï—ãßÿ1üøiïôß]¯Oþ;~`œñnøÏËO§‡ÿ9üíOÇ_ºçqOÿ¾SLk5üM OçWÙó÷ËWÑdíQKÕ H`ŒpOŽ¿ýëðó0ÚŒ¦“‚ Õ>÷ZšVu>1}­šÉðyªÞ Óõ­3‘³Þ•C%4°Ê2ЈǴ¥±VÿP9É¡[#Ç¥3™ŒÅy¨ÔXg2Ñu€ˆ¥-m"‡g¨¦—Œ™VËÜã2{•ºÎy¤d„ Œ•g D,ie3âáHYÅ@o>/ܤãp*u á™¨:@ÄÒ–6SE3© ≯P“I™v0…YPožÕFÒÒfÔã¡rJ‚iͤ†·R±hòhÃ[‘‰®æÙ1JYÚDÏPYÉÁÕäš°T+q*u ¡ûLt biK›Éá õŽæ÷úÉóâÇÇÃû{&EwŠ& yIÆÃrÕñÝɧ“ýññ§ãŸ‡¸äã_Ž¿úFõ¨1†Ÿð=i9|ò=zÂ4MBØ|Âàį”cØ FÛ;øDÀ'÷ñ°‰q¥ŸN.ΗºÛ5_ …/Æ^é—}”3ñ¸ÆœˆaÃ0HG“ r‡P{ h @šb¾Æ£aõ@€¥±¦æêÌ®5ÇòL×\U0ß·:(ÃÒI“ÖTÊ™v5ñ£E˜^øÉ'‚öƒïè·1(ó9”'ŠVòX,p¥AŽ‹{†­­Ä–u<Ä5ƒ6Õ3š¨ÈÿCÈ;­zæ3ÀÓ`d{F¸mœk”ÔÝÎ…©F†× gÝ"»I[ŸËFŽ zá‘*ÍĦi_Fe­ý.†:Š jïWÞUhk¾É­z· zû]ÄV¡y[g^"{Rذç÷!à]; Ðu=~Iƒ@&\A-‡&˜£!aùg†@X‡Z˜×U¬)ϨÔã'ëÅ`Ò±¦ó E(,ñh,i¤²ìÀäv,àÖÃ^Î’ìL G+؃¹J¨¬X¡ãð|$H"°†Y¿PôöÆŠ9 9êètv2ïZöšÄDJhƒ9Dl„ë´•p †ìñ9ú4ZéWïºrÉ¡~îr~‘C¼\Ft¦É!ðS¸¿€r¶Â&‡ÌN…YÉ00“XD0/a çIB2†>¬ Þbfÿ£°Käx¥aœdåר#ØË Ñ dì 0WÚ’`'böøëƒì„ÍR GÍÚÝ’+Þbr…f\ïš/oÉÛæå·–\Gó@M8ÜóHækL|$II®È›ÞaÛxz‡fR%`Þós~‡pŒ5±Go@àI.²‰ùŸªä ã ‰±’$†å ãë[Š7F8àÏLmBúއ{ñJ 8ðØj<N7 X0¿áõ$‹’RHâ¬1<Í ¶:öCË <[¶ž¦’eñŒ†ý'¿x$ý¦…HZˆÍàÈ„àßf¦BV…¢¹<üFHHÄÒ˜Yß"{JüáÙÃÀÚ…¢‘°døã _râ`¤úÅÛqã–ó9Sø²ÑŽ_`îГvÞÁ5Ê~GÃïpüNç™Î+ÛfCàyFæg¢1ÔÓùî0Ú¸;¿æ‰‡Ú˜ sò·O˜=8€õà:DŸò§¥\[Ìß5` ¦æSÛŸX:{µÞR¢GDN%çÀIzˆ8‚¥olúÌ0&am{g°õb¶Ÿ-³„?y«ÇÞÎyh8Y &¡¬RªçzYr…š5‹ÑsšìÐDBõEb R·åÓ;a›œmióh U#™@LJ~X—Y¿ìŽ‘ÒM›ZÇŽ„ ¨à6^A.ÖS2ýS+²qÙU âjÝ߈»Š¸FjSë•ÉŠ ‚ ÉBÎ⇕O:fŽ®!8žb£¼ed–)…YÓ1Ã|HB½NÕŽ5Ö,¢@‘Á,<S‚ÚÔ ¡½9÷hÂÁÕH†Â™ƒ;´Á52¤ €j[¢4P®X_™ 2…ÎEÝþ’¹Æ’ÙB²^#e)¹Å—T\‡¡›˜:%Å1:y»ê"!Èi5 © Øó¤„õ…+ ïÊF(ƒ]päÙŒ-»åzõ=Ѱ½òVŠÖʶ·hDÛÜÆTŽnÒÖ]p×<Æ¿*ì-ð]D§+äx½cGò,tFŒzíND®Z$+§„àWïDTÆA/¯Pæ ¶?7t…§Ð1è~OÉ-2n/$â˜Í9óqøë.£•E#þ°p¸îSĶM‘ iÅf@Žž!žeȼmZÊ0AÄŽ§ÇƒØnÀ˜×FPx,‹Îyˆ›7Œ¡VYâ¶è3›‚VF1c™™kŸBóζ{·Ði9Èl•©k»øµÚWæÐL+Ù*coßg[lÀ”ÒÇÊñ ñ^C‘¶NžPL†ÄÊ,¨ÀzîÄj9ä*ÂgIä»ZG^ODñD$;þè¢ü€`&¸2w/ްÍÑ C"ë5&×ÂXú(®¶:C¸b‰ÒÝÅÓç^⩳¢Tdâê°Š]D×1B©ÄÎ[k‰+*I•t¸+GÅÞ²ínàŸž€:ÌdVß(G«ýJ;ƒi¤sŸõ}ÞbJ‰]ËfÞkâ<|‰/•"\¬…¡®J{ÃwM{‰/›¬E{¨I1í%Ö5iß³}Ó[Ñ«Ë}æËþBÜW…_4 SØc)ÝÝ(Bv¢®x¿k\aÙªv-¡îÎn n ÎòÏZs””±“#+ëÕf;JÜU2NÂÅ@14ɱׇ÷³ðöÜŠÛDjuT¸z.ðf¸pºY—7#"bTR• mëò”úøíÕäÄç£ÒÂ9SÌ¡À-gjS½°1µ]qÑ|eœrƒI]‡okL(¸!U3rÛYqÔ¶¿”´êx „ípD.ZDRS‰Î]%‹%ToÉõžêP÷Tϰå<ꔺÍ_¼^>7-O é®šñ”mÑáèYRDäHBrÂkªqÖs›÷›Ú1%ë,iÓˆ„`œî‹ë=)E6xžè¾o¦xÓœ¯"ŽIÏÑ8”Tkn{FÒñÙòªÓ+íÆÅ=˱(9²1ñP„c»>}ßIλUëà(‚XŸ¶A$Ü¿wý¶M¸#Mõ"¨õ©•¿Àa—_–Ð!*¾ýy….Á;@é9“§Æ•îÛÆ†¨Psg5Ž6rØ:¢QKp0ÆUÊH™Ö“'”•:)†‹x<9¼±nX„Ž-ø˜MK }–ÂÀ­Â0ó¶BÍX‰P²zQËHåégTé`9G¸¬.£åŇ)†T2¸ÔÍ•ÿy´3ád Ú }Ö(ˆrJ„sž³…HŒ“"¥¡X„ä;2á'×éøZ¤‡tA•#”¶tNÄ0ir½JλÑö"Ù4“óËæÞêçÛë$OÕ¿“/X¤è2©eÞ4ˆõ^ßöš,ïÉňHÛŠéy²ëÑÑÞxÑŽíÚqø7ToÓ³LHƒ­RNеsÃOA¾29ëUà·æM¸µ½T”×}>½Œ¡#Ä•‡+²•k¬ÀˆTA¹µ#)‚y-0¿¹Å¥o•¸g+g.ò»þz0ÇR¤–Rˆ‡1ŠËÎ(ô©%騳RA`;sWQ 3l)ZˆÁ"WOyrVûê©> @m2¥µ¡Œ{ž¦0Ø—ÁëT ”¸î³í›Âu0Xwâ XÀŽñ– 7ªh‡þœ¸IÒÛD¨3ÂƺÆ3!ŠÂV8ŽÃœDñ¹ðŒŠFÁ¶–P;F‘™Z­pû(,µŠÒ("/}pk“ëÓûO•è³æM=gÁÕyÖ]Ñ;ìeŠ.Ç­cHòE/S¬É-âÝkÄ[ÕgR) ~IMr( f(œ„¹‚“`ÛÄÎ]oºjUÕß½y=kQÌùS¸L«Î½ËŠ”·'•›×éŸì9Š‹¸Ë'9ó\¸tGIß-’‡MID‹¸î®h»žBlX»ï>¼·þÐí[ìmßwÚjý¡1ÿß:GG£=݃ !š§í69 “ûîR\«CµG Ý´Ã÷¤ •¨¶9ZS;è÷±®ÔÃsæòïçx›¢UE½ä:ú\]¿£4¶‹½]H-ìËL£•ßœâçËn¦s²…j¥p‰^Ì6ÒVÛB—• Æ•…ï ô6Å*ŸTiðR™‚lγñ^ –²,ïpÍwÄ;ø¬›-Š,Ï;Bw˼SrNcÓzW]5ñÅ‚„N…)­ÑÊ4Žh¦‰ `DyZޱkµWØnçÑ,­÷Ãe±Ykò 5ËÀDBïÍBTw1圸F3¢UVº/[´ÎÒq9¯Þ¾iÃmêóµ ȼ›3)vº ”÷:³ {³µ"!ÊVXÍ-q®êÝò–ÆÞžÁ[f.Ç7xƒàÑx½œ)#.5ÂûÔIûL·Øp„ª“†ïãÓÀšÛþ`úñõ›‡W]&o/Lþàesï«Aùèô‘ ËXŠÈ{¦Ç›ªŽâ’‘4²”Ö^N“ëeã¸+#:¹iŒí@H3 OFD Ñð~±ÕŽRœËçéà;=|gd6Ãފӣ˓p´‘©_þæþíäï-¬ð½3EKOZÇŽ3Q,fílÏÀu§Ï\1¤öÔ¨*Ž0ïL|Àœw&#¥[—ã!ï`Ìzxr »ƒ²€¹Î3•È-½G›b“%Ø0w9²àá*Wn0,É%ïïŒó¨®cC©O<°Ý£y0 19äpüã뎗÷'Hn×µºa§Xùµ3‚³© 9-éñáðcà endstream endobj 6360 0 obj 3969 endobj 6364 0 obj [427 /XYZ 40.7999999 110.419999 0] endobj 6365 0 obj [427 /XYZ 40.7999999 219.860000 0] endobj 6366 0 obj [427 /XYZ 40.7999999 165.139999 0] endobj 6367 0 obj [427 /XYZ 40.7999999 110.419999 0] endobj 6368 0 obj [427 /XYZ 40.7999999 219.860000 0] endobj 6369 0 obj [427 /XYZ 40.7999999 165.139999 0] endobj 6363 0 obj << /Type /Page /Parent 2 0 R /Contents 6370 0 R /Resources 6372 0 R /Annots 6373 0 R /MediaBox [0 0 595 842] >> endobj 6372 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6373 0 obj [ ] endobj 6370 0 obj << /Length 6371 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·EJ”( àg€6CCàÍ&XÄ‹8{Èßz¤îi“ý‘¬b‘’ffð´‡ÃW±Xï*¾þãç¿ÿùÛñõ»Ïÿ9~]~¾û|hNMßÌ_Çó÷«Û_h{jõüq°æ¤Çó×ñë·Ã÷ã÷ççéßïÕ?t\~L—)æûúëáõ<ùaþÍçwž>ý祥þ÷Ëñ¯›~ü´Œwþƒo;öçÿž?(­´þsûéÜø¯Ã_~wüuZ‚}÷üï+£Û›>k߯]ÕÃ÷mW4Ys컡mõQ)=­ÓLàøï??O£]—q²]«ÚA›nú‰PSýHM¿:¾ýrxýQu­=3/?O+yà@ó/ÓvÍñÕ™¬tSëOÇßOlèÃŽ_~9Œ'3¶ƒ™YÖÜ¢,ji`‹êP‹Öô>]W𶌌ýÌkûðe:«<Èì]óö®¹LÙ¾{˜R©“éz;-çq1ýC‹}üÅ ŸîÔÍËöÖ=œoGóð] zpæSxT¼’wR சnÖPĈ¸@‘„ ͈:ï`Ø¢à ÔÛÒ覬‹o>Bx–3Pû“V6‚UTñæ›éŒ™¤_«´IÂbÝÓûpæiÜ+дðOá í{81ͽëªqWâ-A ”GR¼ƒÝ¿ðº`|‘XbàØÒI™¿h2Âå½{)g”QÍ©ÔL }÷ˆû\xb£Lÿq‹\„úƒó‹N3Nßx˜`^öѽO^Ã5v­ òx<4Óé/þSŸÀ#ðoŠˆ@`îÙ°F…-˜{(í¡M€–?u6FÀ±ÃQ3‘Ò—+ʹC:yÞ1¾*oc¿[–v²cãÐOïžÇøXAcr –VºäË8Lïª <ÝÀEŠò1½ÒWTˆþ¥/ p8â³ð`o KÌ‘C«iâjŒŸXºÈ«¼ë$r6#ŒùWÂ]‰/p+r¿bâ,Z&_j6ôŰá"å‹aÃ…”õ®¯Ç¬çåéÓŒB²i!}8ƒÂˆêÅ…ÀQ&(9ø†tøb)À“ã+Á×× ž§l‹½Q—ù¸BØ8‘)ÇG0SyK^%Ö¸}Æ “%y׆F¹ "ÝðA1ðx䢈/FFO_[Ž}6êËvˆyܨÑ^ĸ¡wŒÂ>ŠøŠD8¼¬)-}õ‰ ¬/"ÓiDyR`'¢9Ä ß°î÷h^Bò€ín:¥ï:xNPôû|Ôî€<–‚ðgÈ›”IŸºY~¥–’ßAtà0d|*HVœ•°\È /·ä‚1Íèð‘C)CÅ ¸Í1i$ áîe¸Ü·â“K1,lÇa·»:éZúõQ 9 ŽI°tÊG  zæÖÙ²~™Q+‡š/JsA2¶îœå¹ÖØWûñÜû…ˆ‹Î»%„àçíás è®uäCiQq']èKÙÍ.٠ݨ/[…qÿ{?aæÎ}hq†ö¿â<¸­àЬEO¡mQ‹à<:¸O‹3]ðÉÁóYäÁ*øo”Šž}4ó¦ÎJÛ+|ÄbfíÆ(ðáôad3E±¬¬ú«,ó¾Þ¬}sÍ7Û%×ï%)x W àbL>á´´‰®tô¦ïºèMß·/ô&VV¯@oÝìšÞt˜BˆÒ›KX0fãbM¼Úq'4j0v5}½Ð¨TX}¬ptí„•UWÙ "=·æÂq÷Iϵ-PûͰ Ô9“AG¡¸ lÇ‹þ\“*çN?/ <êQœªD¢™FÛþH8RÒA~%ÿ>ôTÆÝ9xiÇ]Ô?è›ÎñÆ9‘^’î9–àÿ$Ì6¤ ¿àžBU±¿(ÁÓ-™æI‰éf즖«Ý=Ç@bzzÜ”OÄð ñ5‰´Á] ŠíꮢÊE·H! !ÊrîÀy*:wlcLô´6!FÛ‰(Ô£­R: …Í”ÂÌb&Ç]+«0V†93€óð|°ÁÓ¢ë2XÕ^ÑzÆ«ú1Šó[托ê?Aç›UÖFWº ~ õEÖªÉtg¢Pxá/ü`ü@÷W÷uE~Ð6;§ƒT¿–s4PÆÐw°6È¡"Ø ÑbèŒñR«}㥨+‡å´Ç£1ð%#l ¾t \cõ"æøV”ÕZ3îV íª«áY¿O:„Í¢6ÄZtˆµ‚šthv}·jÒ¡Níáá‰t(ìž¶ÝpÝôœgDó9R㵫ES&㻵 ¯aï­H0è$ÔÛñÏU¢.DÀ›É)ö €„Zi5JúèZ;×î¼½¯/µ;ïCʺ”-+“]"1ãNÁäNHø[íb£°YFY¾°—}d‚C gp°Mú«”jª"Æê„o±.!¤åù=PéqŸx°R™ }Â5ðPÚ0àK¨¦­ÓÌ„ÿ^¼€uêx–|¢ MFäPJBŒXœrÑ»*Bpªæ¦Ó}$=dî"„륇2r€„WµØ^옄8G™ÂA%K’ñd#Ñêl ÅÊt û¤^w þ?¼™f¶?ÂvÒ`šùëq1ïQKsÙÚ`Ü8î£-ì3¢>‹IKµ§YžöXÅ$jϘ‘Ò˜§]M»E}ácmn¸ÜjY,OöÔigÕ‹îy¯¯@-hÔÎÛñÐõÞ™ÂU7p˪ËÓ"Ó_#7± ±ÝÚÛœGë0×òÊü2jRj¤•}iʃÌ å‹R™UBŸ ÌÇѹҙ&ƒpK\ð¢TªŽ'à=Æúô,ÙªîëN»F»TôÅpzRÃèBªR}Ötc‹lpeY£†,´ìEB—`é”u”wV*htšíe€¸u«z.O=W°uƒCBwõ⹄ÌG^Båe6•»k?<óÜÈpÅ×^ÂÖ Þ ?.P»æ¹ˆªCÎðð¢Ú$ÐŽ`Ǩ ®éÏÁù  m%<5Þ•[ª•˜ËXÈ*)ÉäP\‚¹Û{¡lEòç`hÁ;ð Sº!„pg(xTæ©tŽ;‹@ÿã¥äsnƒWe£ð[‡¨Fy«*}ýyXÉ»Iˆ8Û‡ShŒËñP2aB:VÔ9¦ƒ¥\s’o8~sB`°B‘Ã#‹ÐGÉà Û{¥H†øˆ„¦¥ëõûEx>«Ô^L*¯÷×äêÒ’àH³/ú¦ŒvV86Õ‰s@Œ>u½v7¸C0­{˜árиw´Œ` Céã …#W˜_Žü±>Y8fè]rðâ¾Ïhæ·¸n9M­0¼¾ÓÞ4ó×#j…á°ÏêaxyãîÚZ¼jN°Ý…{Ávx`»—q| ÃBý½@ÀG§;'0pƒpƒ+Pb5Rb²åp ~îp,Rmš 9ÔsB¥è E:!«¦vꂈx/m·ë`·„l%c[)ÈGGç„§f™yЏÃ ¹"ò%!;"ãWJˆ² –W’-ŒÊá E’eî“PñlðøŽˆ(cqß߆™heóû_.`güÕrær¼QCöêÆ¥!J‚™HˆZá`9BR$!–†0*Çጉ#ôª"²Yþ-úþ"›MD0e‚31‡&¾Ç«‚x­7¶+­¨ãbÝv<|œùpèǯ!¡AùÐZ‹;”q×BŶÇsÚ7¨…òÖFeØÇ÷ƒñs)K–‹ê]jW˜)¯æ¦Ûo{*:•‚skDŸG˪!…Á÷léŒ8¯Õ*µâ{1)® ?‰ˆ– ¼XÆEå²ÑŒ׊r£° N4X7¦^Ù ÏÎ+Xáh¥ò8Á<úL®ïrãäø¥rüÀ Žt”@ÇeÆ£µMij¡–ð†ÖIçãúÃoÆÝèKze()™Q—LÐêGwd ¸¥[‡Ye×v¹ì’Ògy¤WŽ|Nª)Z8b™#Mà’Pž'ŽtéäP=F•%ŠUM¢ªÓ“*š¢eQ^²ö pñ†T¹¿¤:ÔWÀyòÌK Îz±¿Ãã;ÕëÇþ¾}6û»¼D#UhÇñ¸×@t+ž§Vtë0^ƒË+>Z/Õ?ƒJíÊÖ*Z©A$­èiGÆæyÂ28YÛ9%:¬“á}gåÇJ8½ü ëÚÍZê*¿ÃXÞ2®à²öa³”¾»a¯/‰uw!ÕëÎ…T3ð¸SÙ,Š‘*ÃÄ € /vˆ&›xW$$Áí•,¹i<±~—rwFVÅ)†ñwC‚qEÂrœÍ(#b•ZW,Î󊔀Ij"Ä•rtQ‘ôªµJ$áWl=Ã'¢³‚×8—RÏÖW€2*ÆŠ´ã(ø9n°SÝ¥ÔT&Ù£N| Ž©”y¤U$³?îUÌŒ ’m¬ÂÔím“«Jß«¸„*’Ä/XU·¬ajz†EßøqC6€;S–Ìœ{wc/œG¿…}àh C¾·6Œ]Þ]`•oðZt/µeô™ç1öÔÎÉ” -µ}Dóà3ÄÔÃq †1¦‹bœ{s­mú“:'ýüx…ã «›%}’ä¤ÇO‡ÿt ‹¤ endstream endobj 6371 0 obj 3997 endobj 6374 0 obj << /Type /Page /Parent 2 0 R /Contents 6375 0 R /Resources 6377 0 R /Annots 6378 0 R /MediaBox [0 0 595 842] >> endobj 6377 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6378 0 obj [ ] endobj 6375 0 obj << /Length 6376 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`5|?€`éîé9hL99³» ™E:{ÈßlÉýýQR‘¢e›Ý@ÛmZ|ÕW_‹%êÓŸ¾þ£ùçïͧû¯ÿi¾ ¯÷_w¬e†õ?Íþ÷‡÷×JÑ¿µN·Âïšoßw/ÍËîi÷Ôý}Ùqs¸pxé Môþþí·Ý§¾ñ]ÿÉ×û¿tïþ׈æÏÝ¿6û{÷òÓPßþ ßwΛý›÷o¸àÂuÿ¼·/ü×î¯h~ëºàõîÿþ ¹gÖ©¤~¼¼^Ê¿ï/E±Æ(ç”k8]?u7ÿýy÷KWÛk7Z¯8·FY6»V+öÕzioM#˜* Æ6¯*žX‘çJe©èÐ#ž64ΔWÕ:%¹´B«½ö"ÐΉÃÏ’¡{}º E¼t‡š’¥!:Låk×#ž4²A¸&ªx)øaF%Oü±ªäùò&“>í{ÄÓ†vœy\qê5c܆©uâÔ¿U•8cšéî%KEûñ´¡õS¢ª§,ÖI¼Y§—È…wÏ»O~o‰Ÿéºq0çýËó÷êþÙ›(#šçŸš?²®Ç?6Ï¿î\ë<3Bì_ÂL_òöÁ—úóÿøÕûC‰zû@>°-óÒjöî«Rjåð«œJ¸hÕ¸Ä+éG¡Žßd3z¢ä¸ÓÁ(4ªU˜‰©øòÜ =M„\I¤È•‰qM†fr¸ÚÏ%³cà*2oNŽÆ ÍêóæÇm.™7¬røšÆªx¯G\ky+ù ¾ë¯á­VÆuᆹ›­ë‘B%ĵ‰/øõ½7­ànj†aàçÃ9œì|ò€ ŠLÂÑ«åÓÈ{9ù®«ÿÒÛÓ¼é[=î¡V¨d}ÎPÂLqFñ±Ç,ŒMn‚ž¬+SåÇ. –é 'JøýòÜÇídí”=U¢ÖF¯az$~7åj½ö×ýÑF‰€Aç[>ñ´7z ¼Îñ‘®-ð±1Y`‘ }/™ÏòÆË†Æ »ÚçhÛ§0\Í—áÊ‹bÆ#T=Ž® >ˆèS`}ÆLמUjá¢dòÌ0žEœ_Üç¾Vî™ <' ˆ‘ö ffMÇlð5?Ú-?{5t‘Æ(BWxõ5©¤¡¢áÊ0ý/XtM±þšëgG˜Éc›KøÖ‚óQß/ÀO^Q–º±,-‡xål,Ü@Ú„ÕxD %î\𶇡½ñ8#$=\°ËtWõƒË£Pæ0á‚çõÆ›Œ½þ,Ë÷ ½7Yøj¾Í¹hZc…âàÍØ(IØ*ºlåŒðb0I}{¬5–ðÿäÝ`Ò?pÉ´ ²8„¤EKÊÆá*‹îH0»Ô’ÁïK{z»G8(ä8GT"0Ý81=˜Óß­êU§ùµ÷·ÇÝhË9ùd9f°:»'R+E~80èΤcJkþrŸsLÖ÷´”öcšßަ뵓Üô6S$"!ÔKqnh*õ¨d ùS×d­ÃÄŽb²-¢fÌ¢síÀ©q XƒÇâ–ÀYÄíà¹R8|½…ùõþNö—ðK˜E‰kÃÉ?PO°ì±6 ed"L‚L0âpúP)9FR›Î/a þ ×l`¤×& Û‘õYéUô9‚K8n†eg[шì±MÆ}ƒíàä܈ìáH#ãã?+CbiëÏËkxvèÚTFgŒJÐ’/ƒõ k”0f¸H;ØKÏjíÏÏåXŸ1bq2÷ùǃµ©¨ßèdþKZDÎÄÇVÏ2±ø&ÔqŒ3Kr{ì$ÀQe»uZW…pásŠÃ¡]&ÙKX[„÷qäÔf«GPìa<ØÏÆã9ï z3ЧìdO#+B6²ú¸¤¬}6ì_a¼D4ësomÂúKvt8.ÁZ]Ù¾qéäJšuÊý32_ßÀ^÷MOÌÍô¾)åÞ¨0ã½ w%õkÜ…rƒrÖ"¶U‘]KB¯KE˜HQ)8;8¶±ÊX 0ºˆ}–’iå•â’äGâX0ö0³jÆàrÙZ…«ôšOôºŒÎx‘ {¼SD‘cD3 !öü%É:×$ÉvLÈ4.Oº½tø¼:.ß .ožË•L‘}Þܹkãe—c­¥0J¡Ü‹H;„½ç¼¨"å r"Hûü² ¦+Ÿ¢gx®°_ŽñR5é)XÆ%È$’‚GGˆàGXäÊ„w£Š¢ÂÙuPWЖ¾¼ˆ)k]š™„Y$Ùn¼;LɛĜDAÒÙcÅ”Jµ-ˆ¡Sð×G$¯–À<Äâkˆ=?^Š¢B¥ì‘ì–V]‹’2ctÁ¨ž6);4‘àpVHÅ /ØKÙN˜—´;qöøÏ/áRx¡¬‚&³‹`̰¤Šï4WŒÑ0†Ùj#)ÆþndÕ #3cDŒa˰ ŒÉ¤˜0öÒqÎoÅ cC^áv1¦S"̤˜Mµ•¹ý±­ÛJ›¯ŽØ½Êpå0F9¿¥$Æ|RôŸ®„ãÕ8CGÁnf7–‚1‰3y§r|‹`Ìò¤ˆ9%O§b,·Ïg—lƒá¬LŠÌc†»2Tl}$î+‰1ÍxjÕçß4Æ(¹³EqiSv "'Òàù­¸Ìmy wso}>i?’3\ÑWÎïÛ8úOAEäî‹ê÷m}Á˜X'û¼2\Á>ýeë §Rö "ù†„Óº3KCÎiÝú.«3)»yÑWw4r£oëû¯Î¥ì[d澺››}[ß™õ,eG#3úê>onômÜïó"eG#3ú(w†\Yf1iÕA¸»(ÆTÒý y1F9þ"‘”cx¯»Æ&Îôôþ¸|ˆœéy¦ã×~z.>kž¦¸àÙÆçz˜ßE>~y¥ÓFSNÅÜÎI¬„‡Ùnù¨Ò ÈÞ5«_§– käÖq|C5>ú/ëã°¶|cåȬ-—à°!~üZ¤äfUî*]³svZ9 r@倲pÖ‡ Ìà×ÇûVÞ¨¼Qyã’y#"…³?p³$§ñ×GjWN‹I«Ô! •Ón‰ÓðqE9àõî•®ï Éó3Jå"l|=Ä__y£òFåKæº8Í“{*§ÅzP*­üü,T9­ §áÇú–äwL¾ª‹Ù–Jc­pK€o}(É‚oݯëAĬ{=•ˆ€u®(>ÙŸâ€+;lîüŒR9 Ê÷5]3Âð‘E™ÇÖL“Y(½È[¦*ól›yðÍa¸¤(;øš³±;ºÙíüPÙÈÐsÅ%%ÙAòšÍñË\ÞŒ¦WvÈΛÈè’²ff¼ë!Ë"²ƒAA_\ÜlbCêšÉ0g-pmºY9 8ô¹ûm^:Åí”rÿ…áåÛ÷ˆ&‡ÀÞ(à)JÑK'ÙÙ†wÃ8AÒsÓîÏo$;ÈÆ7¦5ãó†ISm?3Ø„míøàöDIOœR¶ÂŽ1ЭéOCx+±°¯ñðš>ÀcE+º…”ÐNÕÖƒàý'ð»=ü܉>¢k†“7N•p4Žáìˆe× [2ö¡oH@Ýþ½ÐÜNJ›k0vðàÑÏ…a!â!vðÌF°‘ .`ôÂv†t½S×ÀÚÄØ7Œ®@"¨ õ÷Å"½ŽpMߎv­ôÌÌ+‰ôíµƒeˆgP@„ã<ǘ;†ƒZR5×9fZ¾?¦é£ s‚ ;¿ƒ5ÍhI›§Ýÿy ?Š endstream endobj 6376 0 obj 2986 endobj 6380 0 obj [429 /XYZ 40.7999999 660.500000 0] endobj 6381 0 obj [429 /XYZ 40.7999999 334.099999 0] endobj 6382 0 obj [429 /XYZ 40.7999999 660.500000 0] endobj 6383 0 obj [429 /XYZ 40.7999999 334.099999 0] endobj 6379 0 obj << /Type /Page /Parent 2 0 R /Contents 6384 0 R /Resources 6386 0 R /Annots 6387 0 R /MediaBox [0 0 595 842] >> endobj 6386 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6387 0 obj [ ] endobj 6384 0 obj << /Length 6385 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀm>»Ù@`ìÈ!€árr¼Ù‹x‘Éò÷ÓRwK3¤>>Šlª[£1à‘M‘,ëÍbñã¿ý}ÿÏßö?ûÏþûôûó·kXËÆŸýáχ×ÿ!L#Åø±3ºýágÿýÇîeÿ²ûºû:üý²ãí±ãôkhœ§üíû¯»ãä»ñ¾}þóðé{±ÿÓð¯_öýÛðë§i¼Ã~ìLß>ü{üÀføÇëO‡Æíþò»ý¯æ8îáïZ0Ñs‘ÇË©+?þyÝMÆö­f²U{ÎŧÐñßì~F;ÑôŠó®U‹µ‡aïö}×îµvuÖ7ÏH¿Š t€ˆç-3Õù‡"£¾z—Ùe/ô4Tî@½*4P7¢#gi3êñPQ’ËNhu؆ÃhcÄð¹“ÓOÊÒ{^j;NCeÄy[f #D…¶Eå.ûö¸L1àLŒÍCe£¾²Ì@ˆxÞÒ&Ô{†*É ¼íÔ¸t-²±8•;ºÐ¾ñ¼¥ÍÛ‡"s‚éFòU*c]N’b)s$ki3꡾1ÕÄÙT{ñtüô¼ûø…+i–éóÏ$Góvüõ<,Wï?L¶¾Û?ÿ´ÿ=>ýaÿüËîéy€séYÕ¡uœõËq־ѽìôh…-ì3já-l1p´'Øò˜>”°†¶°ÂJ óHûÜX‹è ®aOË'Ø‚éî¦k lpÁa œ§ªtú."æÑê»t¸K²t€£­D: þÃ]:„¡¾ÛwéP^:hõJ¤C'ïÒ!j¼÷pïrã.¨Ò¡ª èÅ]œ!èÓ×#`ÞÞt¸Ë¯ €+Å-5¥ƒæü.Î-–1wép—Té -U¥ƒ<Íz—ó@];·&7îÒÁ7¦^¼§U¥ƒêïÒáÇ@‚8"0!^=Á;œE‘â :6HF…_ Û<Ä.CANòë2h”³-Ùµº}C¹+B#¤Où/£¯es&À¸ ¶¸r0¦·”ƒk¨a>¢Hbi$`L|±·ùS)š=ï/¡P´#•x îà²ñç Ì#ja3«vÚn£á>üö1°¥‡£Tq7Ê„sËìM[ qqÐO {fõ-66íw£„›|‚ðIÄÉ#íD6y}œ5ãB£Ö#vÎ68Æ`p ’§C &sº_Ó¾<-nXOA˜îŸYÕÑï9VƒÇŽ7Ë<µ¤¿Få]šŒX–ÇLPVöWã=Ø… }@Y‡)ÅANÀIŽÅïl[‡L;ƒFÇtuþÃŽI–µüËÙPQÚñÙ U,š¿Ü€l¥À³3o‰-%þ” "âÛÎ7 ðž`r'‘N ÎÖ!XSPΕÃu$LŠsŒQ¯™”´Qï áÃÕwE.’ý鶪shüW¹cw.ÞžÒ$κcg¡› G%˜bá³´xuæa0¼9ëÅ#8ìçä(Ø)‡fpYÛÑ_?Ëœ9,À¸†-·NYaM”#ÿ7(JcÌZ’CB€éׂРgíÉ{†Ð'Ž)´‰ín }‚®ÀÃ;.Vhå|TÉøMÈD*JO¨)!Š’qü%Æ+%bç,ËÑ`”\%€P$Ä£¦|AÓçãÆý”M]0f¹lêµdÅì8wÔs3 g¢ÂìUY´¶Í“? ³ÌÄ'ƒ—C,qž.Æ5á6îãÙ¹¢w^q. ÷gr¯y=k¦Q®ñ-¥²Å.—¶x:el)–sm7GÆ=Í 'ë&XeCŠrlé(B Ëv¦(7E‹ê» |KMØSRh®Îiʵ…«‡ærÂÁ ÓPrïãQQ $° ™‹)WòLç+Nn*—õ¾ãkX¸‚˜§6¶Rq]-ʽx\·B °T ùu0/Ä[Î\§÷„ïõ®_oºs¿zQ<¼'›ôÐ SŽQª P0Š#v„:„5+>˜6‚ï¯ÌݸÞ®`Aˆ{â(Ç+ŰÁ å+ˆPÕ¤¾S>;‰ú(W&TlðØ/Wç†km•¾k¯icz3ÏZ,Šžµç]ñY}ß ÿ¹>ÆÍÈßB¾DD˜7Á9v„š­×ÌÊÜØ"e­ù:…®¦a¡ »¤ˆÂ%¤ I•Ã1·y¢V"žC!N• óP®~`¬9볩˜’Õçê¢X”Ä¥„Û­ED2!a­h.6¥V¯g3rq) ½9•ÅK\s0„Hãë,¾—›R#jÄõËS o'ëæEKkô–îX¨êX‚Ù‰ååbFÂ]°œPû®bݨ{cí/ÅGÔôw”¤ÝVµ6í®Îw‹ˆß@ÝW¦]«/áŽõ¥{ßÏGЈ^–¼ÆÕÚlä±Äx¼DYú%€v˜±ú*‚ …t£¿ö*pPÜ^Nh|íA÷×Jq«®Nf%€¾>³P*ÝЋ¢~É{cR[Œå)äè`B´y™Ý%ì"Ä8ªCôp¬ûú°V6E6ep8. 6}q”.!$VgYW ‡³¶#&ºh€– [TBPJÇŽ·o›4œ{Ö›XÜ®mC¿>bs+ÏÙ1ÓõAä9by¨üÒUd ŠëYè¢gAåÄÇÒNžÓ/ˆqÌ¡„‚ý«Ž‡´óÝ$7,E©VI8']HQžKÅ+®¤o)u~)Gáù?Û^¹£vj6maåŽbF×¶Ø(/¬ãu%”&ä|oDª±^î+IO¢¸øt÷Àœ`­‡¾Üå^b‹õ,8å¼ vä…²ñF'PFp%׃‚„´²M]+6I¡¾Êõñ7¢” ³Ý"È]&}q=Ô”‚ JZÅÄ‚ë©d¼&µáíFζcŠUˆ_˜Ó ìóÝVd#Á ©¶ÈÈ î:wC6¢ÒSÑI@K¥~ÌŸë˜a„œYJ¨¨:ôá÷‚yí[„Ù½}¹Ì"(Õ½ýéxÀNJÓz‚‹,øú‘âµeg.™Z!m²¥4OOŽ”sÿs=‰€ëÍ@]ž)é²ÜÍf$ àÆb” +_‰;_@ˆ›ý¡ž×Ç`¼¦#‹„¾9âæ ?¢6SH§í8îà °eªŠwi´ÓC!ã£Ù¯äüg͈õ˜Ï<|rìòªÏtå¹Q‚`" ®]Ä ÁXó÷Õ<󩆰ËsñF€«p’H=—úZúsÊAŠø/ò\\z!‰M]œOÊ”xXü»´…‹l¬æ©Àj ½×q(%O¸ÏO¡¤œúE –gÔXw1P¤¤B¨(Ì’ò_KKx.ÖïÄ'P5éšwÎñI†ô[èÕ¾EÊqxÞd»é¼çä!ŠP/ª•³êj˜Â*¢H­Í«U6,é/BŽY7°¸¤ÔÇ£Ü4X>±£ç¶ËQäΡ/GSÈ©N¹+74„ïuܨ/0 ¦ t×Át„qJä [òvíD×&˜hèB-í“>GÐ-K2ž¬¤Œ«Nw‡}…{Éz㋟î-©óšö;T׎x4eüÑL™C›PÕ³*oA(1¿Dây_¾‹«ÊãW©=/4^Ù&½‰_<Áo®àW )/€^Ûõ¼gÂ[JR&LI”÷•ŠŽF¡¤Š/YsÕvAx<4_lÀ4_”âH¯Iàva­RÏëHØ0õÞ­-û6‘g¥„wŽ=}0®+¾Œ¥L›Aÿ¤–Û-t€œNÑÉø-«w„QüÞá­¼÷ƒ7‰%>ƒkêgÍteùäÁïšßnÇoýBÏÀC_„ÔBeìVÅ—Ó¹>½#\uÖÓºeí|ŠE‡©ûŸ$€ =ö.áUKv0G/áK¦ù¹p¥˜BjZ›úôb²‡–oͧ”µ)º®,•¸¿“ëyëz“üŒ1êÁ~á¿9‹²›Ä5¥PËNë¾K¡w$…6À3ËŸ¯·údn—Ì×.“„WçAãœìó” º8Ô™oÄÞÕ^£¬"v;Ö…Ù «i(ôé=wÊk’ñ×asÞóºÚuô{NwHÁË=ázS וnî¹¼_=<áa)§<[…+äÊV,Û¹tÄËðgÿ2 `Xßá Ó¯ï?<qQÉΨüêE¦·k¸†P»çÃ2.Ý9éyÛŒõc$;9œSÕ™¶i/Ç™{Õ8HQ#º¦»\Ö¡»Ð2’¨”è-âØH7í¸ 6ñ^šÇÀ>=ì3²O'ÁäÛ‹ïŸàh#s¼þŸGøÝIŸ\XáÔg û_jáhG¤õ™v,eílGÈ ºÃg18ÍÁÝæš@˜v&:àNŸÉ%k™Kñv0f=´)eªÑu‰0õÂy&7ûR8Údû\‚ S—à ªrùÃÒ!¾†ÐgœG›FŽNKD‹¶/h¼‡ƒR8nÁ8Ʋc2r9×Ö6üPäë- sÌt¸Å¼Ö¦5éþëîÿ±ßÀ endstream endobj 6385 0 obj 4076 endobj 6389 0 obj [430 /XYZ 40.7999999 339.859999 0] endobj 6390 0 obj [430 /XYZ 39.8400000 375.379999 0] endobj 6391 0 obj [430 /XYZ 39.8400000 375.379999 0] endobj 6392 0 obj [430 /XYZ 39.8400000 422.419999 0] endobj 6393 0 obj [430 /XYZ 40.7999999 442.579999 0] endobj 6394 0 obj [430 /XYZ 40.7999999 339.859999 0] endobj 6395 0 obj [430 /XYZ 39.8400000 422.419999 0] endobj 6396 0 obj [430 /XYZ 40.7999999 442.579999 0] endobj 6397 0 obj << /Type /Annot /Subtype /Link /Rect [219.359999 386.899999 294.240000 394.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 6388 0 obj << /Type /Page /Parent 2 0 R /Contents 6398 0 R /Resources 6400 0 R /Annots 6401 0 R /MediaBox [0 0 595 842] >> endobj 6400 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6401 0 obj [ 6397 0 R ] endobj 6398 0 obj << /Length 6399 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès€Õò)Q@`ç ‡ƒ #‡`'0l#ò÷#Ø!õ‘b‘b«g{Þ7[|T}õ`U‘úüç¯ÿØÿë÷ýçû¯ÿÙ³?ï¿îXÃZ6ýÙ? L#Åôkgt#úñÏþÛ¯»×ýëîy÷<üûºãíÛƒöÇÐxbêð÷o¿í>Oƒï¦O¾Þÿuøí{±ÿËð?ïøûðãGÛßø…_w¦oÇ_~™~á‚ 3üÏùocã¿wûÃþ·a æ­ßñßOZpÍTÞ<^ò·¿ç¢ÁؾÕܘaŠ\ ÿèÿýçî§¡·ã4š^qÞµªc‹{íÄ[·]»ï‡ÿ”â^§ÞÚ–u•Û‘¼LGo3âyKãLuᮣ$—ÐjdÃÈmŒ~ï¤ý“²ô¶{[º`}6mWÙìÐ.Ä×aFÊ)x‘}E‹.Ç2@]Ž1/±Í ø}«ŠTTme9)«m$äã÷#¤õ@ïC@ŠJ ·‹"„Âí@o„¹I¬*Jm«¯Zj5Ž¢ÀÝl¹éê2SG2Œª,e¥IãÞ/RøXÑS3½[¡|€'”è ¶¢X+âq{7#­8N÷¯ŒÞ6$DeTÔ´ê\ñÚ˜/š«À¾^ eÃYŒZ{}RD—Ђ}ŠU§äR\  qo·cÃn’NÌWn8ÛBâ)”À€_WZÕÂw9ùž HSYÊc]¾uŸ¿¯ÿn|þZè TqÕ—¿¤&–¥ôwBæd$ŽÌ×äÖ— \· ø£U à”Í"°NRî¤l¦¬RÅ"eop¥<ÅVS‡`¡)yçÀz(Õ+ð™ªZ¾_P3Ó·…õí–±¼e­ºeºÕç³boÂ,ÕÑ©žÄ¢kØ€wE§ì¦B¹6F5jêëlÍnglù¸Þ0œ¹ß˜PÕ6‚›Y©Ÿ&¾1}C7R.´¯eæZÜ^ùÄl.4 Œ7QóF«v\‡« çˆ)Žkw½/ª˜Å"vHð*~I(ñÇÎ’Ä‚iÇ³Æ ç›«t q8R4ö'¿ÜFØDñþªå S¾¬œÂl•Jž0.eÅRÔñ Ñu-|5­N×Fù °[†)BÀoU®öúªµæÉGÓ/Ø:EmPŒi®>°æÐZÄ5ÖàÍÐCŸ:,ºŸ[´hßÝòC-Ôéþ 6ý9-àµXaRM§ÝØ~ætR5a=ìm‚—M7mO šfÀY3mé–´àql•ßðŒnÅœBáÚë ¸ÒÉI7άíö²mäÔÙ"Ü÷™ÂNÏÜÁH»ãí´ S C+ Ìí ®¯´˜óŒ$^¨ üÚ¿qw¶sîœ=¼÷ˆ÷ ‹ç”N½G¼uµÉÀ„vÂõIgpKPÓ³÷Œ³L˜ *xÝ÷–“^|woÑl\ÖÎgÂQ÷ÚY£07n±ëEkSZmc†7̪ǃֲK P“Áç÷At®´[ q6ž´jÆ@±t†p_Š!‘ÐhÛ±Ý"*¤D3½éÕÕwÆÃ-¾6ñt…7,%ãQâÀ³0ŒÎZ•dtæ«q/ªá½‰àÕ`ºÃnÀ_R;ø½|f90| ‚rÊ ß B¹Û‡*cõU+ª'Ùõ.½—£cç$|…s ~'Ë'PĪ|íÊLмc…ƒÕ H½\E~ªLvÏ[Å=²‡¾/í}@0eþ²0· m<ëÃ;8æ0&}Br”b³1q°Z›ÓJº„­aö:îŠp YóV¸…Rl{3•5•¦3®Z¿›Ç&M %èÁÕ×Ú îºî|vbO¨Æðý{ŠÝ-ѽg¢3Á–šÜ›x,`SRœ׫û[Ó»c‡Üô¥K^mرMŒ:Äë¸L@Ñä—p}èåÔòâàòÀ“ŒHH$Ö]?AæÅSŒE+ÜJÏhT« ñ‚)ɤ#ÙþFã–cÌ|YÌØYmEäß8vÎ’÷ï>˜>YÄKžÀ˾wy ‘å-©¬Ùö8¥\i÷Àxoƒ'°§Âé:˜ü‹¦øæZ`’‘Å2¸‹¼æ*éÕUsÉÒA×v3¸s-µŽ½tæpì¥lv»D(azã<·ŠØÎ¥ZXGK¼íK Ä[rŒ¥?/ç0Hû¨Œ¬_¡ÍXNì–58ÇãÙÿ莙Ä€*éó„ªIh߯y“Õ¤Þp•ç—ƒãàV“ê%a…#®Šd”úO\Ë«±ì ‹34΃+][H7ÜB©M}Jç¶=mÌÕÁ©Êâ¦ìáÜ0Bpµog€‘±ƒ«—+×\¯¨¶¤a®Þ"PÊ–®ÎU€C.Êbï@Œ8¦•ï‡Ì,r,á{eD¶«9p×à¯åg…H/•ƒ²Ò3÷U >)!¨‚Bà :š ÕùùÈ¥Ôøb×O“>AG\CÒÏ$ºoX–VZɾã˜iÉЮ~˜RRœ€WÂNvå ÓåWLè-®îÊ^QóA«=WÊCSLªÇ¿åÇ-(ïha,wìHìJ y\‹WÜÄv ý!\~ &3¥!AgG9çC'!°^Ë1½í[гžã`Oó§EY‹ð$aYQEŒINÌ?ç`žWG¨UØqÊŽÃÓ*îW<÷õ³R®‚Žª)¼i p;A'ˆ`é ¹<"—hÑ9tÓ \xû >rA9Ú±ºÇÐ2‘)lWõ%Tö_ßÁàEµR ÷ •Ί”ínÏe‰Ÿ*R *Ýx}ôúç¤Zã -!äÜ×J©yñì®ñÁ¡þ¢~šÏ˜u U±l½éo–-e/Üóâë° ·òŠÝ&΄C3ʵøoàÆBÊÅð±»éV·—:œQju­ÏtÆLHšúʾr¥¶obœüæ<Áw:¸Ñˆ%ƒW}ÆP~³¿‚˜c >—‚|Pœ~¥á«Ïãgªƒ°Ê êÁÅK׬’âF%ò?6LTãÒR9Œö^ð®ìÚ_¡aˆ/ÙߌÒtñð&®«—LÈ«Fl­×B.ª†¯^„½¦éÒ™ØUÎ¥.H®‰X%®±xÁBQÄ^qBx›làÒ%ü~u|RQükh3(ï+ P¿˜Û@Ê;Áð¬1·)o Ç´ÆëÁ—¾ã÷™?š®‡rñ}-Œ^§ ݈ŸÖo«¾J«·Š|7Voó{s r¿Šï¼.}§¨äò…øÞvÓk†ïeëR7¡<'‹K)«]^Ï…§dWë¼!ôv¶!°àœäCF,8áÄ}™c‹kêX3$ïëu ³bõ벜|*RêSâ~Z?/·´ ‡T±ž“¤ÊQú»¦puOµ–§sÅruî©DÙâ*î37‡Ë¦$v»(aš¢½J‡ð&¤X^4NEÁŽ%ÜwkÛÂö¤*OW5à7l¶,øXï­œR(åP€w=xu8H“c8H‡‘C~8Ps ºBóUe¸Uˆ¥´|´ÄÖ<¯‡ éDÁÚhCÌXo`9«ä=ô?A§´áM.#Ò äÙDWåI@Ã=Ô›©dâý¨¦œ‡dNÀÞcI£è‡ËK Ô6Ø é!ì10¿ï 4ö­)µ­û/Reù"·Tâ§¥>ÜÙ_ÕžtffÔáïþuè~xtüºýñíפœ½+á98Õà£ñ+Û=X6ûÞ6ÓíˆòTÍloÓl›v>rÛ«fBÁYËÑ5ÝüÁÎn¦e ßIÙˆ~öئÖM;Åë\1ÇÀgzøÌ$Àh“ﮤ·â3×Û$ÚçŸ<ÀïÚÈáÌ ŸÐ36 =×ÂÑ:l°6í˱”µÛ¹½ @êÆß…æ]”Û\p€±cqÀ½gÄD‹–ùˆ‡ØÁ” `"ÅÞÌ<' ½pë0Í={³Qî¹¹aty²@•/7x.’KaÏLãhs¸pyAK`nOhÌCLAŽ[0±î°®J®äÃÚ†Ø÷"̱Ðaá>‹Ó>—´¤ûçÝÿN¶·& endstream endobj 6399 0 obj 3500 endobj 6403 0 obj [431 /XYZ 40.7999999 381.139999 0] endobj 6404 0 obj [431 /XYZ 40.7999999 327.379999 0] endobj 6405 0 obj [431 /XYZ 40.7999999 381.139999 0] endobj 6406 0 obj [431 /XYZ 40.7999999 327.379999 0] endobj 6402 0 obj << /Type /Page /Parent 2 0 R /Contents 6407 0 R /Resources 6409 0 R /Annots 6410 0 R /MediaBox [0 0 595 842] >> endobj 6409 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6410 0 obj [ ] endobj 6407 0 obj << /Length 6408 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õˆ‰,à™±ä`0rrfw,2‹8{Èߺ¥î¶E}Y,R’[`ÜnIYoV«>üéë?ŽÿüýøáÓ×ÿ¿ ¿?}=”EY—ýÏñôï‡×_ȦP²ÿhšªíéçøíûáåørørøÒýÿrõùÁáWwñòŠ~Àß¿ývøÐ¿üÐóõÓ_ºOÿ;Ê㟻¿~=þíïݯŸ†ñN7|?4m}úðïþƒB6ݯ?.þëð×?ë¦ÐœÇ=ýÿC%¥u5—ë£âüïõ£èeå±®”j룲›gÕã¿?~éF»N£hµ¦Ö¦ôÕÈÓ°¢ªŽ­©RkPkm~C‰Øt)x:ÍHÄ-M”ÝÓΡŠF+¡Œ¬ô 'TM#»ÏF ?!K¯d¿ôîw,/CÅT—Š ¯ÝŒDÜÒ.èÀC±¢£îF9-½­¢8Œ D£&´v3Q+» ŽÄŠ‹¦“m§…[ú®ü2R4[Í$ñš³ÜŽYÙp$N\èR lËȥ߆ŠHŠ–g ÓŒDÜÒl8†¢*l­ÛæLôB¯CÅT×Lf$â–v=Š•º¿˜öm¨ØšÚð tš¶‡úÂb[Ë›mýâxðãóáÃS{ÚG<ÿÒMã¼é=?èî“I¡äñù§ãËRÕ?Ÿ=´…©«ZVçÝKEšó•æúE)Ï_˜¢l•©ÊW·–Ö­ŸÎ_èÛ`ýkªnÔˆ7¯)á•z4ªç/„,ôxÖût«(:Žmº›o·*¸Šþ}ývEÀ•‹ÆHÖŸÆÏZ .çàŠWƒç<­²_U]HÑøŽj­F÷ˆ}|îÈ?Ž˜…V  gSõôÜT—©è¹²&Ø¢+Φ®<¢+ªAWD GÓpn¼"à{àhWZ=Á•*xÏ^)!Ü$Äœ‚uà®ãÏ _ÁÐÑŸ8!ªà¬1¬1NËÏ¢ð=p=x4/`žƒy[DÛ|ò©*õ¦å“‚3 É' Œa,7(pÃÏfàv÷ÃgP¦aÙé˜5”\˜vNÏÃÏRmšŸ%Ö¨~¦Ø˜^0ýCˆbÞİvPÖék×LCà ÃÊ<๴Eâ;ä:a=lc»ÛiXâ¹AüT˜ 0ůIJÒrˆ%±†ò–$‰1UàY›ŒØªÅ¶±5[Ùd”±Ø %I_øž÷fÓb io¿IÚì¶ÌnˬҖa ÿ™€H­®š±Þ ûÍŠ€Qý#ŽX†õ>ËéŸí…ÛDÇð¤NŒfG T>iW7fÒn¸äú1`@}x?žL ÞÌj<¦aܸûív[w·uÓÙºS2$—ßnûPSÖàÍ\±ÒÝG´nká¾|DFn!Ïj×›w¨7ÓûˆŒi/DÙ#q*»Ôò»À¤Ò?ÄJÒu¤}♤ÈL ˜YL­cU*¬gýSdy¯ã[¡Ã+`Yš4Þˆ&ŽÈâÊkö¿bO>â-tœƒsK/iÊ–µ2¶t:“²æS’!…DWZ¦oÚ1xßÝqB,vpè ‹¹Ä&7ü@t)÷H¥ÖÓ¨wÐó u§¸$WÜ ¹ÛHã–tìX…GÀvŒT–‚°;˜—g< §l\$+K.0¡z‰üì‚Ù¢!$ÌæÞM&÷KcÆLy{g(«fÝ]Wþþ!‡”™¯4“D"’@‘Kﱉ[@daÓ€ø¨#,±)&šØiç>Gˆ²ÈèGàHšæå µ§t(&T,¦¬FŠÛ}v˜8àô!&ëqÚ(fKjBˆÙÎúëµÁOâÅó¨™>!|Y8¤Qè6|YòæmZQç0æ,n °d(gñ€Êϰӭ®ÈÞ’lŠH]›—"…#ý³fyJÿK¥GX^¡åÏ’‚ÅÝÝúk´³ýý_+”5®õo½—Ãa•x“—F×-îË]é˜SަŒ–·õHy,eÓmJ\¬Î4™¸¨KXɪ(n=k‘€uGÎ’m¹ñ¢Ž›, áHÌÀÇž™“ðqI|0t/‹±Ù²ïŒzy‹_¼7è0a_:¹2g˜yŽëâ€(á ¸C;Ž·çÂÂ,oç±²¤œåŒm–ÆqäSa#jò°’Sò‹Š·¤9Û¾!½MajRÝL„˜ï·`d`"g+4à6ïuÇNïSæ8¬$Š0'$…FE½[ñ¦¬–µpÊIÕÙ±pó¯Án¯œÀ:”rH$e)jOHæ|§%<ŽÓõ¢¨)š¶¬ÝÜ•ðL8Tµif¨H‚"}8ήÙ‡åtóOÞ˜OjsÁ @ÿ†1 0•‡×!¾$b½.ë=âÕ•½7ÆžàÄéýôÆXEj]6Ûîù¸wÓvÍ`尿¢x~å¶»‚® ›v&ª(!ÅbýŒŸÙùy-UÈùÕ­™™»(ï}±VM{ílº¿ÇÔŽ óÂVûÙk¡Ú p`®é+ïg¯EÕl[¬ž²½WÙV­ÐwØ«L cfér·$îÐ’ÈC}íºXîô¿Ó?…þ;âo'«_žùkY]ÛD^'Sö?·É|FWÊKˆÕTã+p4üŒx@ÏÜLk´ŽÖ£WH;ócÉ—EŸÞa M¡‡„‹1'® áößæ\g’ód{‰¿ð$çYÙV5K9“˜*© „<&G@@eκ¬Ž< œýî_–/ NŸGRâœëò}ìbrÒTüK$.–Jpàa}Y¦þäÉR8ÙNÄó?µ±HÞ)†˜Ó’RC~&p KÛYÇQʱÉ$Üš8'TâËÂu®óá••b̃δ‰¾,_lÞÿ€Kˆp à ÇñoRÅsg/07©ƒNu%Þê ê‘(õ ®m'Q,bÖ)9Úç%ï-4ìl• P}ڟDZÜú|óS–‚¹áGh'ð÷ᨺ€8„l‚)3Áò)­}¦ ÈñºüëÇ”Fé7î˜ÔÙ ì«T]ÄR@Q`’E͢䰄‡uͳ¶å­”P²aÞ•¦ƒ‹O›ó'%U]†õAu(æk=eê&¾+TAÀÚ·±GF˜ãcžæŒø¹¹¦lY[Joów1¶xá„å]Tþ€%ÍuިŽK¶)I©ªã1æ® ÛfÙÌ¢cÞ(8k™ÿ‚EÔôð8åÎXÃ$iC v„þ-7`í>F°m¼åÜ0EVÀK+²WÔ4Ç9(ʲž“È[¥›-Љhv@”Áê?#–þ¼žñ•²ïOSu„hì´$@µ*k %n©¶,_=¿™ŒPU›·“ZgF¨†£ÁŒÐ¡˜ƒ0E+ßôqvç`´‰ªè)äÕ•:0‹TÂgð¬ñ ™§C¡õ‰ÌSüÌœ:8_ÏM¤qÃ&H—úB8—)£."½`áR_igmF¸rœsÀçµp&?¥n>e†3ù“×a•R!ÅQ’'퀺`ôÄÒ¿ÞIÍ@¨qÄVÓô‰êA‰psEãØR€=Š!D±D¥eìiO~Uc«4¤÷7<•ó7é&Œ9•¦ôâÊ0ÅÁ³ Ûm©Ð¤‡#Dp"ô¿ ýpVf“R"E’PÈB•Ãé¾ÇEåÇÍgTP6þ‹uë P(7LoxB ÞÝá)Ãj©Ö» Éa‰Ä¸X\›”†j0óƒ„sßI UblôqØ"÷cÑ/îÕÚMr‚qÁ›&¡Ïv-“–a߬D{DÍ–÷i8¦Lž½DŠ®øØmÓ8;åNlSÛAÍ"œ9cy Ð ²Ò\êêa}u]8]>KÑÔêš$ªpáKJÓÖÑ(Å?Éz@QÏ>ÎÕÐ C7ŒY ëk_\ÒžÐdB‹éPß2Þ\[Á»ÜX·Ü }ߥÃÝI‡«ã^Á)9›ƒÔZ²Caf3Yß:BàR8Iû‡$߇ŸÖçqªd.ûà¶ŒêÞpF/À}Sà}}i8ú1ÿ½í6k¼-îñ¬q‹{æ†ìe¿©›Ù5ìû¤(K(³iæm=N˜‡+ÍÈM¹…VY¹ÚS|¶ŽYco.Aö­„^dµizámVMá{<ƒ¬xÔÑîwXZÛÎì]›¶“kÇ/Ý/Q¨Ë®çv«ÿ¨Ž„œÕdtydV-ß³*IYG˜ctöð@LÚKIdöd1•©’^ qût³Ú]7g%·QáQ1’ÿk.gÜÄÚìÄ$xxu¶¾N@[ªlæè!ø*‰¤ûw|騣£þÓ Ã¯oßüb3Zyc´/NVs>:_a­>ŠnSm"ZQ÷MsŽêV®§Çk]õ´2kuaµG’4…™.ð`&®ôHRªí¤ÕUUEÝ#}Œ­©÷4ð™>ÓÛ}F²ToÇp´ž¶_óÞ;(š‰>¡g†˜º"Ð:¥öÌ€±µs;3@Õ>ËJ˜Yl‹Š@˜v:Ö3²‡E]ÚiCÖA;R† †S¼€©¾gØ_N=GŒ¢©¹aê²xÁAU6ßà¹Ä—²!<Ó¿§j Õ§àz\qÌí ½ãCPB ÇW0Œ±ì¯öûœÛ4e]ˆÓ9³·,,0ÓÍ1÷ M5éñËáÿe& endstream endobj 6408 0 obj 4090 endobj 6412 0 obj [432 /XYZ 40.7999999 750.740000 0] endobj 6413 0 obj [432 /XYZ 40.7999999 714.259999 0] endobj 6414 0 obj [432 /XYZ 40.7999999 714.259999 0] endobj 6415 0 obj [432 /XYZ 32.1599999 549.139999 0] endobj 6416 0 obj [432 /XYZ 32.1599999 549.139999 0] endobj 6417 0 obj [432 /XYZ 40.7999999 750.740000 0] endobj 6418 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 504.019999 98.4000000 511.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn2 >> endobj 6419 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 495.379999 108.960000 503.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 >> endobj 6420 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 486.739999 191.519999 494.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 >> endobj 6421 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 478.099999 194.399999 485.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 >> endobj 6422 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 469.459999 243.359999 477.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 >> endobj 6423 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 460.819999 200.159999 468.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 >> endobj 6424 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 452.179999 157.919999 459.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 >> endobj 6425 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 443.539999 249.119999 451.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 >> endobj 6426 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 434.899999 198.239999 442.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 >> endobj 6427 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 426.259999 195.360000 433.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 >> endobj 6428 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 417.619999 224.159999 425.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 >> endobj 6429 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 408.979999 171.359999 416.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 >> endobj 6430 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 400.339999 139.680000 408.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 >> endobj 6431 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 391.699999 132.959999 399.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 >> endobj 6432 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 383.059999 154.079999 390.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 >> endobj 6433 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 374.419999 132.959999 382.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 >> endobj 6434 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 365.779999 128.159999 373.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 >> endobj 6435 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 357.139999 133.919999 364.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 >> endobj 6436 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 348.499999 139.679999 356.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 >> endobj 6437 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 339.859999 198.239999 347.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 >> endobj 6438 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 331.219999 183.839999 338.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 >> endobj 6439 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 322.579999 132.959999 330.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 >> endobj 6440 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 313.939999 173.279999 321.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 >> endobj 6441 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 305.299999 155.039999 312.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 >> endobj 6442 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 296.659999 128.159999 304.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 >> endobj 6443 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 288.019999 180.959999 295.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 >> endobj 6444 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 279.379999 187.679999 287.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 >> endobj 6445 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 270.739999 150.239999 278.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 >> endobj 6446 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 262.099999 161.759999 269.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 >> endobj 6447 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 253.459999 154.079999 261.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 >> endobj 6448 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 244.819999 129.120000 252.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 >> endobj 6449 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 236.180000 216.479999 243.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 >> endobj 6450 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 227.540000 145.439999 235.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 >> endobj 6451 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 218.899999 205.919999 226.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 >> endobj 6452 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 210.259999 211.679999 217.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 >> endobj 6453 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 201.619999 224.159999 209.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 >> endobj 6454 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 192.979999 154.079999 200.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 >> endobj 6455 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 184.339999 109.920000 192.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 >> endobj 6456 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 175.699999 143.519999 183.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 >> endobj 6457 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 167.060000 191.519999 174.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 >> endobj 6458 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 158.420000 158.879999 166.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 >> endobj 6459 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 149.779999 149.279999 157.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 >> endobj 6460 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 141.139999 153.120000 148.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 >> endobj 6461 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 132.499999 137.759999 140.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 >> endobj 6462 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 123.859999 194.399999 131.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 >> endobj 6463 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 115.219999 155.039999 122.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 >> endobj 6464 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 106.579999 161.759999 114.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors >> endobj 6465 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 97.9399999 159.839999 105.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 >> endobj 6466 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 89.3000000 151.199999 96.9800000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 >> endobj 6467 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 80.6600000 205.919999 88.3400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 >> endobj 6468 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 72.0199999 164.639999 79.6999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 >> endobj 6469 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 63.3799999 179.039999 71.0599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 >> endobj 6411 0 obj << /Type /Page /Parent 2 0 R /Contents 6470 0 R /Resources 6472 0 R /Annots 6473 0 R /MediaBox [0 0 595 842] >> endobj 6472 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6473 0 obj [ 6418 0 R 6419 0 R 6420 0 R 6421 0 R 6422 0 R 6423 0 R 6424 0 R 6425 0 R 6426 0 R 6427 0 R 6428 0 R 6429 0 R 6430 0 R 6431 0 R 6432 0 R 6433 0 R 6434 0 R 6435 0 R 6436 0 R 6437 0 R 6438 0 R 6439 0 R 6440 0 R 6441 0 R 6442 0 R 6443 0 R 6444 0 R 6445 0 R 6446 0 R 6447 0 R 6448 0 R 6449 0 R 6450 0 R 6451 0 R 6452 0 R 6453 0 R 6454 0 R 6455 0 R 6456 0 R 6457 0 R 6458 0 R 6459 0 R 6460 0 R 6461 0 R 6462 0 R 6463 0 R 6464 0 R 6465 0 R 6466 0 R 6467 0 R 6468 0 R 6469 0 R ] endobj 6470 0 obj << /Length 6471 0 R /Filter /FlateDecode >> stream xœí]MÏä8n¾¿¿¢Î l¾?€ ÀôW€4f€‚‚Þl‹Ì"“=äïÇ*Û²Dж$Ûåz{¶˜îb¹HY")ñ)ýðO?ýÇí¿þvûáãOÿsû6ýýñ§7vg†ná¿?¦áîRŒÿ´Nß…nß~}ûíöÛÛ×·¯Ãÿ{ãæñÃé¯áËYÄÈðoßþúöÃ(üm¤üôñ_†ýßMÜþyøô—Û¿ýûðן&~á_ßœ7áÿ=þƒ .Üð!ýWøò—·ýÃí¯C܃oøÿµ^x³«¿ÅŸòÇéO)aìf´ò\Ü8C;õÐÿûŸo¸ÅfܽâÜeY5W+¶š[~óÖÜ´E<Ñ«Õqâ{ aaZÄw½gÊ®rº;%¹´B«0¡ÿµsbø·•ÓŸ–·îñâokNœvw¡Ôò AZÄw½Ù<$§»f|0iëùï9îñÞnðAâ`ÀOƒû÷X1â9b‚•œÖc|øSóuÛI76`qá"uáâ¦nØ×+ð£”7Qè£z3²Àèì^`K/ˆ©ævÈ[Ú*9Lž?½b×eÔ!]]ÕõC;ô-m•~ծ߯õ¥¼ ßýø2jèv?·èûœðïZã'ç?vþôéüþoYç‹e¿6h~~ûá‹1ÍÏæ±G`4þõó¯ojøûbøöO·¢£ÿñöó_Þô,9.ô#’š¾±oÜBøø ¨… FÂ]I«§(lüF ßŠÁÞ™Ÿ]á*©G9ÍÄ=¾1wÁø¦^°»‚óû M×ë|&û³¡ ”·£?é×bš?º?[º‚ÔFCöê ºƒŸ¤ŸŸÆþdwcyÖŸòÃãg\›¬iô7˜=ÝkäpqÔI ¯CvîúM=]ѵMo²bÝÛž5ä3 (A¾&-—ôD+¶C Wz`KÞ矇Ió¤)ÃZ0gУÜå¡ë'€çÚÕ©4·m› ê¦ EšO‡*ÒoÎ]¿¿Pªc‚#Ÿûú–Ð]@;Fº ,ùòñe‡Czò¥cZîY\ô8±=“î˸b¥©F+ }ê ¬kE»=_2øÄ‹à#×L'NJž;0))hœˆ€}wÇúwÏ’‡v´ªâaç£<1·ºf<¾_ÅŒ·åGÎ\œLñ¬RíÓoË,Hû¿SV‚]š‰4…œÈð «úÐÎìÖW•£\·„A-ÎeÛ3Ò/Þ³¤¿iÐ5ÔÁÏ V_wEy¢SLB¯Ð±pZÁ$ŽEÐðÒ#sÄš?ZH Õ;9¬èû絈Iwô=HÛò:À´žPwÒæDÝ2H x=ßÐòê;x;¤: Ä{(e3AMÃû} ýþéôÄIÅ* '•ï\3_ÈùíXÔ÷@@ Hû±ðâïwU(?‘ŽãÙ"¯k€ô ¯,VŒIíDçp݈=sÌÉΆÖц(¹ç½¶Bû†3F†«@Ë ð¨=d˜/[áÕÛÉ}ÃÎr} n¥>9&âÉûòx~l6JÃ(íØaüÎRvö(, ¤# ]q+=³ÜóìÂ+OŸ4—p²®W¼cL|k¥Ò´=g“?Õí\IGõ¼ƒ“ñd,þ®Jùú&‚íø7žúfÚ”.}ó™ü†lý”ä7§¯ASp©3ö”¸Ž¨N7! zOoÚ(9à ò¥w&¼â 3*PTÆòW䟨oØì–¦^A«¦ßð©ßš›'[ÀçÉ~œ·‡Á­Ãe€Ô7´œÉWÛ»ô ,>Q-¢ýöŸÑÑ»»š&J8®i&}®,m™_=þ}{¢a½Ä§tp éýH.©oZvép.&WÂ…ŽŽÝFÕWÖIÑõ!ËÚ. ª_*âL³z¨ãXG OÛÁñ9iÑ+0n‡âÕ,êèC·ÉÏ5æ†mÓ†]ÒÕnˆåzìƒN¼|Úĺ÷°q$7rm §ÙÜÞ½à¥É°ô¦|ù¨ºy^NÃ+ úÊÏí­¦[ È5Èʺå ÕêI)¹¾:YÓ;´œÉ©œ¿Öá\Ïy½M’w0©3á#·Ü³†$G ƒ E8ý5á¬4ÖFÃâ=Ãu.ˆyÎÒ¦eõuè¾pÇJ¦«.¯¾mÀ;{túP‹ì*!ÒMÏœ#”“½é€#VºÇɤ§ž-goâ4Lu'—Ünç×uäeõÄÒd¯¤Hœ³#„ (ꋵzœ f߀ñìÈ!={Ò¸Úñï©þèYl×L¥h(¯9dEMú*/óÄéÅy §—CÜï;­g»ßžÊÞžõnÏ~m½:íšjÍ2逜К+Ù“2Ä4—òÈ@¡«bîÛ‹€Ûc*>IÚ3ÝÖâ{jäJIeÏôG»¥†y©~,V ò{ÔãÒº-Œÿœt%¬Vˆ@Gª;²é¾ÓÅøf¢ÃZý´Ôs *¦©]ÕÌ{JgêÆö`++Þ† ïÓ–˜®üÞ#+Ú†ÊväýSÚ“‹ÜÿÒÀÁ ¤P?Ôô›£ž¾ ¨²VÃ%²Ö#R:ZökŸ”‘ÝP¼§^æõÒ‘ZÔS¤E{]rpV|êÕÞÏJçÙu¤NÇ„¾grlÈâ®èP–8ÛqÍ‘°æä<Ò€ÖuLÔß>w^®@ÜëOÌÛµ«~a ĵþâT¶nè)-ªÏÊœä› ?Íß‚©\ K çd2|Oš< ÏÉßLkÙ·OdÛ~$¹}$¿!û€ndéø+¥dòŽ‚ºmt¾²z|:4d¥ø‚Sò7+- G{eL;FŽ~ÓWn5ÍM’¿‘ÏÊ[:¦Y>åÀÙªuÝ!¹`ôvh:IÔ»g# !SƧßÁÉ-cMcŒòy+ Éç¥×ÊÓŒK¹ÌŸFÃóÓg~v¿vÊ(ßÞ@KÂS2å’¿Ç··_Þ>ü!ëŽú„×oȤót•7ù•@ŽHk¨¥X9pœ-À)UÞîñrvR>^\8² ‹z”P3Ÿ)¡æ¬ „š   •0ÐŒK¹LŸ&³jæ J¨™…2 TÂÇS2咿ǵJ¨ù \ ²vñØô·ÌŸŽ$ök-õÞŠjíAs=Ûƒñ)!ØÃªÖs¥ϋŠ&‚{hì°dšÔíA•"&¥œ)߆ñIu—§XΆ¥bÂ/&‚y(-` 43P²Æ<žÒ9‹ùøƒgè>×cõ§–ñŠddÚƒB¼çC¹{̤:7³j­!7®ü8â¯'L°í\‚&?YNÎA*žª½‹ÒÀ»(Sò.ÊA³(È»<žb9–ŠY¼‹R%ï¢$#±wy<¥s6:s©wÑ¥(Ôa5 i '<©F°! ™#Î8oØ=íY'ÐcÃ&›™)-‡³‰F×<ÚxF¨¶q#U²qc ñ dã§XΆ¥b7¢dã†#1Ûøã)³Ñ¹˜KmÜÌâSUkÙsDlÃõ@·äK,¹*êÙeÕ:ÂEðÜ:ÒGÙ¹ôøË~Z™Õ»H3CJ¹”Pí".Ò‰’‹b:ໜÂ.òñËÙ°TÌâ"+¹Hë¡뱋´‹OŒlt.æRé"Ìõ;q‘=µrǶøÈCîëÉ´ï(@Ù‘o¼oõ@ª ·lÓ3¹½‘Ú§„jÏä}î™ cÏd˜.#P gŸb9–ŠY<“w%Ïä-ôLÞbÏôxJçlt.æJÏdbÒÞ´QZš–O©!y”󢑌a3Ø ,K µÆ`8ÀB /a¡F@,4P1ˆ¨ý –ЉÆ`x 5b¡a|Jçlt.æRc }´âàI±}ÂÙs‚Ù! ê]Å¿ K—#¯Äx×XÖÓ=é¿¢ÞÏŠðQ†§„j?+*ld 6¢Â‚ü¬Œ¨ð†¥b?+K¨°‘ägeD…6:s©ŸUÛ*ð¾-éœc%l„èjQ\uD±WÃE=óØ!ݸ9}ÔûÑg­RÂî|£g/5V…|34#ϵ˜ÏhÆ¥\æO3X<…|£9’ÁQ>Çã)™rÉßãÚ|£¿ @ú”h½Æªåœ„‰NãÆ÷«õT碅Á9ÈIÃâp³Lô®³5¶›ÖpB[[Ñ3#•O Õ‹) °ecKز±[´˜²[^ذT̲˜²%lÙˆ- ZL™eõd3lysébÊÎØ²ŒW®l{;d-ˆðœ;VLàGÒŽèD¥««{æ¤å“C\qâ¨ÑõG¦´x,z iX¡h Ó¦i\¢ÙSÌ¥„jå Æì‹³G³/`Ì~Á˜}†1ÏbåJó BPŒÃóø”ÎÙè\̥ʿÆ|ù˜¯õïqÕ›£(·w)awÄd™Í"&Ë\!b²œh&P`ÄhcL4s™?Ù,b²Ì"&Ë4”Á4Š˜OÉ”Kþ×FL–ÏÀ7}GÏ®M˜úy‹^¬ÒàFª|Ȭû}lTX>ÃBÊ”P;ëZ@V+J «d 8ëŽO±œ KÅÄY׊ÈjYκãS:g£s1Wκ6‰*K-Ú^å|µWÏ0VÎ¥à>%T«ž¡V•2B­‚¡‚TOŌЅ KÅ,ª§J¡VÁŒÐ@Aª§bFèÂFçb.U=º Cµ–)¡þbï–ëåáplÕÔJòß!§vµÚ‰šãaDJ¨¶ kJÐ5º d'&B7 –ŠYìÄ” «!t(ÈNôb&ƒn1—Ú‰™¡›†}° óK¸i?ߪƒÆ_mÚ‚skApn])8·ç‚tÐÅà|aÃR1‹ÚRpn- Îé ÁùÂFçb.ÕAWQüºcŸãØen³Ê¹€2—ªU΃4+ëKiVŽÁ4+ÇpšÕøËÙ°TÌ¢r¾”fe=L³ ¤r>¦Y-lt.æJ•sË¥çpâÊWý!ß he×í)jêX  O µjê8 /PŽÃ*Pšò@-lX*&ª©ã¥Êq@ TÓñ)³Ñ¹˜KÕT°ÍÙy3Q©ðÍ{¼0²^“EŒÇF(`&Tk²ñ˜“¥xÌI Òdã±… KÅ,š,Kñ˜“0 ¤É2Æc ‹¹T“¥û»&_–,zÊ5+÷4ÜlÑ âÒµæý™zg"c¾Ö)¡Ú™h´:] Z†Ak  g¢cк°a©˜Å™èRÐê Z9µx­‹˜K‰ÞZq&Û÷a›…äq²ÆžHß?<ët¬ù*%T[°!¿³¥ßYò ²`Cþ… KÅ,lJ!¿30ädÁ&†ü ‹¹Ô‚m ùéC׎Héª]iHnUFÁ€š ÕÊèà\ ð ð0À/Úç20`³(£+ÎA0 P2º,lt.æReô3@Ò?뤂‹Vˆ8‹þˆuÙÊì…ÒdŽ ÿ|<„‰‰”°;áÃÇ‚Éù³)$|xæ@2F À„@3.å2šq‡ù³*$|x&‘ ‰>OÉ”Kþ×&|xG˜N³DšŒôtÏ]}‡ÆX;n<ö­L¹cÚ\ÉDí™jÏàÇÌÏ#d2Â~ ò’/J%3^À’™@Aþ@Ì%33—ùS^2ãE©dÆ X2(Ȉ¹dfæ’¿ÇÅþ@ÌQKñGÇõx]ùœ*æ–›56ýÏ‘U„Õ–$â>ó)a¿%Ų¶ùséDk¯à‰Ö‚,IÍ'ZÏ\æOù‰Ö^•N´öžh(È’d´•žh½È¸Ô’Ôv9ÆÉ·—6¤÷T“{Ôϸ´aiÿô*ø¾·q²Wìãë™P_{ ÀoJ`7ì _O±œ KÅÄøÚëØã5{Æ×ãS:g£s1WÆ×ÞÄâ O*ö·F7”+üî®^ÙÇAWk÷4­¹ƒ«zoæ°[J‘ªmÚÌÌÛfæÄÌÙtbÄ6ÃÌf1‹MÛfæ-ÄÌÙ´˜ÙÂFçb.µi7cfϪß¾‘û•ͱÄò.fãŒÛŽ3¡Zç=ÈÆñ¾”ã=ÌÆ ¤ó>fã,lX*fÑy_ÊÆñfã Òy³q6:s¡Î›ÐôÉeÒ%J—kÚï:É|£ˆöX—* Ç0ž'ÿ „BòÏ@É? 0œé)–³a©˜ÙpB!ùg r$%ÿLOéœÎÅ\j8 ć2‚pƧdÊ%K!œ¡ÂyGSMpûœc÷…QÃ@,#<%TÏ'ʃùD…* £×P˜žb9–ŠYæUª…b¦§tÎFçb.Oô (ì)Z:æÈíçÜ1ÕpìùëÄc] ÍŽ-I|õE}dˆÕdωóõy¯]}åM×;H¨_è­x™ª½›±À»™´b˜eÐíX­LO±œ KÅ,ÞÍ •ª¡ƒ •é)³Ñ¹˜K½›'atlßSV´}$s}T¹’wZt\h#€2­mP sh¶+(ÕA•s@™žb9–ŠY4Û”*‘ LOéœÎÅ\ªÙž½žf:M_cU{ŠO>†®+ëE (ŒïÉ>:­œ|Pèx¯å)¡ÖËpÐ&ÎJhgm èeƧXΆ¥b¢—ᬄ6qѦ@^f|Jçlt.æJ/ÃYD›èíF§éÈ(êª{Rxðì•vÇIºáR—hŸ~þɃ¡ÄÚ6'RBµ÷x/Q¨m¨ ºjÛ¦§XΆ¥bï% µmf¤db8ªm3©»,ó^âjÛ†Vl#/³Þ¹ì|ð^Yõ[ÃzãØ)åœÿ¶Üi¨mû¾ž÷zzË`Žùi¾‘Pí#%ÀVò‘ â¿‚|¤Šøï†¥b)Kø/—ÿ ä#eÄ6:s©TïêÀ ï(|¶ŠxOýx”[$ìÞFä:;Twø\8T×pÕ}Pà6b …3—ùSv¨îð¹p¨î@ÕP†F‡êŽOÉ”Kþ×n#rS‘¥Uþ£]¼Šxàõã¨Ý äËÅí–¥„ê©ÀH‘Û¤È-„M6BŠ –ŠY¦[‚¹…b  ©ÀFHqa£s1—N®b-Ú±ˆëq«]ר²1D³? PçñNn¡xJ¨Ö~¡._„º<‚º|êò Ôås¨ËC¨Ë¡. ._€ºüuùêò/uùxªÒ÷zŒÝE·h>mvj¨ýé©ÖÝ.ÌzFå—K›XJ¨õ‚ IðÐ$8šúŽñ)–³a©˜è;/M¡úˆahŸÒ9‹¹Òw>Mô,–T¢c¦éɉDfA·‘6˜C®O!M×ÕÑ+ßf0"Þ¬-Æpb&TŒ¨ƒ%ÔAHˆ: 2Q‡… KÅ,#J¨ƒud0"¢ ‹¹Ô`d,cûHª\ÏäÐ6Téõ‚FÝ8mˆxï±Ð2%T[ÙIB•²“{‡ê©qvÒøËÙ°TÌbª”Q€…³“ƧtÎFçb.µ}5¤ðß%2¼NL[2<%T«¼ƒ0%ŒAˆ1 Ry1†… KÅ,*oJC(2€b0Æ0>¥s6:s©ÊÛ8œõ'sw[G¹˽ ûo_šõ6Þª:LÝ)¡Zo@„+¡ÂAt PÞºˆ,lX*fÑ[WB†q@b0:0>¥s6:s©ÞºØs®­ƒô†*vâ‡Þ xÈ…‰Û›–§ÎbÇž£…_|{\[§&·ñ6%ìÞó‘,/“¬T:&, ¸çhÆ¥\æOyé˜d¥Ò1áaéX À=ŸÇS2咿ǵ{>’Å2ý ï"žz|Ã)Æ- 9eÅvÈÅ^×åÅ4ÜíJ ]»&ãõ§ã¹z‘°ßÄ"Õé³`% ôB`0Ð&‹Ÿ¸LŸ¸Ïýw ¹…2¸Eþàñ”L¹äïq±?ÅrõSÝ! wº¾éwp¶ø!ç϶g7­Í¡š]zP 5jQ4I¯-&›üA¼@UXŸjC)Z#e ­ [ùÚÅr6,C)Kh”­ ŒOéœÎÅ\HkÉÈÚì†)°åHSü[áÞ³ÉØƒ vHü0h²*%T[’ Ô%Hj ²$A … KÅ,–¤K Ô dI:‚@ ‹¹Ô’LÎ/Ô²ú}iå n†–­"ãU±BÛ”PmBàQÒ–ð(i!(È„lÄ£6,³˜-áQ¡º ŠÁxÔø”ÎÙè\Ì¥&dg<ê»ØÍí«Ç:àdù×Ù•o¸„è ÃÚa‚zÿ¯ ž CgBµÿñ ãEúRÆ‹ô0ã%Pÿñ1ãeaÃR1‹ÿñ¥Œé`ÆK  ÿã‡ã³Œ—EÌ¥þÇGdìûM̾=«”wáÁºxÚ…Õw3Ž"ÔÙ’GþÆ“¿WæC`!˜ _-ß| ¹ÊšR>‘ÏNz\xÃ/Ôo¦ ¯ô §ÞcÒù¶ßL#ÖòîSÛ´Cë¿…ævs´§=þ6= ugÒŽ~#ƾ0 k<©;tÏ®è©)üi ´ö’rÄò7$·Éç–ÚFk²…­ÂvC·ÅRv)\ÇoF9ÚÝå¸uYñÍJÛ¾Prè1¤{PNC÷1í;& b¯åË8sça§-7aNÝÖ7&}=r&½}}ûc©3 endstream endobj 6471 0 obj 7068 endobj 6475 0 obj [433 /XYZ 33.1199999 706.579999 0] endobj 6476 0 obj [433 /XYZ 33.1199999 611.539999 0] endobj 6477 0 obj [433 /XYZ 40.7999999 482.899999 0] endobj 6478 0 obj [433 /XYZ 40.7999999 272.659999 0] endobj 6479 0 obj [433 /XYZ 40.7999999 272.659999 0] endobj 6480 0 obj [433 /XYZ 40.7999999 104.659999 0] endobj 6481 0 obj [433 /XYZ 40.7999999 104.659999 0] endobj 6482 0 obj [433 /XYZ 32.1599999 708.500000 0] endobj 6483 0 obj [433 /XYZ 32.1599999 613.459999 0] endobj 6484 0 obj [433 /XYZ 40.7999999 482.899999 0] endobj 6485 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 777.620000 134.879999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 >> endobj 6486 0 obj << /Type /Annot /Subtype /Link /Rect [189.599999 140.180000 226.079999 147.860000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 6474 0 obj << /Type /Page /Parent 2 0 R /Contents 6487 0 R /Resources 6489 0 R /Annots 6490 0 R /MediaBox [0 0 595 842] >> endobj 6489 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6490 0 obj [ 6485 0 R 6486 0 R ] endobj 6487 0 obj << /Length 6488 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯èsË"©'ðÌØr`Ø@A7›ÅbwgùûQ·Ô/²?ŠU,RROÛ€gÜjñQ,ÖûñþÏ_þ¹û÷ï»÷/_þ³û6ý|ùòTeSŽvû¿ï.?Ð]aôøkÛÕ…î÷vß~}ú¾ûþôùéóðï÷'Õ^œ~ SŒþþí·§÷ãäOã'_^þ:üö¿ÞýeøßÏ»¿ÿcøñÃ4Þþ ¿>u}³ÿå—ñ¥•î†ÿ\þ¶øÓÓßþ°ûmXBwwÿï»ZתÒUÔ:¾Ÿ^U‡¿—¯¢ÉÊ]S7Õ°8¥ô°ÎzÇÿõôã~WQ Ô— Ô»jç.Ò}MØ ‹¬«Fïö§åÑGQJ•7ŠßgyÞ§žöyœÉì.ç5ÃáY|MÕT"à³J¾a¦zw9o½øâ±ïÖ!$]?.·@×ç\nྭó†?gNÿ‡aÑ5Óø{0N5Ú Ä»¬n@XršN+8M_)Õ6U[³VÆlÛ]ß6»¶á#ÇõH*v ¾Ö2íW¤¢v6»õŽÄ…{«Œ9l²¯#wy)\­Ö2xX‘ŠÚÙw<îºí›¬ÛhpM#EƒË˜J臩¨áGbý* 9 ®Jê÷+¡3x$6Üë¾7©ªØmž†Š¨•:ÁýŠTÜÖŽw†Â¢ÍYÎP® ¨ªú ­˜¶¨Ë½>zú +ºn˜£2ûŸí$ÔTûOôþ«{MyúäÛð’*”êu׿U^S^N³cú Ù¿¸³0µ=ÍðÉþ¥«Å¾U_S_Oó“%)GSWʱ>Cæ»çÅç¯Oï?õ{CÀׇGû/¼| X7»w0èÝ×v,KÓüi÷õç§¾h‡u}°?ŒOô§Ã“îôê­J}ø -ÊÞ´uyñ®R‡'J•ý¿ã ß>øøu@ 38n!ʰ«Ã¦Ì„(z"/>•ug!]ºî¤:ºoŽÛw£T1Hãݰu$?(º¾¼>“ ®uat§®Ÿ˜Ã“êðó“òÙ>Ç _Uhør<œê<ÈøUUM«®¶c\=\ãtöM¡cù&._y&¶!¬5Âå'ˆ¹pI.ØD@€ñ­úˆžÈì ï9û¼<`ƒWùàßqDM§;^›bbÚÚw¼†÷µƒˆðb#‚°µç£ÐÝ . R~„ׯ^´j‚Ùˆpçž•@ëKrNÒ£éú¨ú8þùɸúgÄ?ª ºÄ\,üꑦ`„q1È9b|(Ùœ%Ú£ê&é4> N«b’¬çÛüëüé¡`§ÁPs 5÷<+®ÎÎQæÇð]Í!M+IÉ*ùšW`Ù=±ù#Ę~–ä\ý„ˆ¹ñiPÔ£òˆ¢¨ç,8¬‰@d31-W,Xü>@ðUfކ{Ž+ô™MDF ¸ªxñxÃÎ.j‹ï³¢ð[íî†pw»Y¦ Ê}wŽš$d3½qØ ^sP³Lƒ¡é{n7´½ª›½ó—#*cÉØÁÁpL›?JGèó,„Ãóà=õˆe¶ÁÑÅ”0ðbbnø»²ã ’¨ð´˜à0 LG8ƬåÎêiU aBPw3¡˜ˆAcNtIIlueS[}¢5ºöâ£ŒÆÆl¸Péá…XâZ’H—ÉgÊ…>$!Ѳff^ŸËøäN\¼<^ä}Pauàç‰^Ðw”)X¬9NXŒ?qŒô"SS,6OjØ4ƒœ(åKqt<¼q„yŽÂA 1„澜ÞÛvˆ>Á8ÆPñ\ñ…Ãc|ᱡQþK†9Ùµ»FÄÓ-êÐè”EÿÓx~ Pœ6ƈC¨(Îo8|McÐ}‚·_D”¹ƒÇM8qé/fñŒS¢hoœ‰çiš¬fB`'VcŠ—@hæHb2(c {ARz:c|¼p÷B9ƒï-Ç"žÔ†ˆ×Ê2€ã‹%*õÍï‹å¯Ž Ô·šM‹Ï ¾¶Íü‰Ñ ]„ŽÒ$%É¢·,]Íc#øÚrÅå¼ÿqq`f$jÏ]ÀE®{e]yJzc8u°¢ rü QŸ?¾­186A°NmØ`Ðð{eûñyÞëBH¶ å"j%ÈŸ0GãÍ-ìn1ÓTÔ,àÑ‘K5!¿iÍo¶IQ(„1‚´D…pÞ¹‰ J> )Ò8Ê£B0DÓ‹°KØxŒ3…P2'(ePû !+O*³‘Õåy6©t&VžœÕ¨#«é+BqR³ ™µ1¦ÑÅÜó‚+:rp’¬_¸E”cŽ$²ˆ ¸u½o=ž¿€èÅ…¢}æ+ÿpt+Aû_BQ×­Å"D<ëæ•AmÓ:Åß,1O/¶úìãžæƒÄ¶P0M4ûfÓÕ¥ÞÞ} p NôÍF$XtÜ;DÀ±ˆÊ,1Ò`L=–6JxRò)çç‚d.K&,OKTˆb™+ÒîÀÈà ô‚°%y4AWéà¨Ø‚'Z®&¢Æ˃?›ê»ž°Ž˜x-J1Õ8ñÄ\Ô‘‹tã”ñ‚­²Y…OÇfNÕ©$G·Q}Åù8ôâ?ôÛª†#ÆcK"!ãG¢M€¹wJH¤$ORÕ“ÞŠ‘ë$Q$¤¦ì-"p÷†Ž4Ø(¨(ë9Jâ•L¤I„¸œ0âäÃÍÆAöÄÉO[°•‹Ê!¸{Ĭ½~&Áò2ÄN^» ž$"S†‡dy4Œ!5\cîBè=>÷´ÑN‰Š`qz%}ðR¯/œ¥•A[m`´W¦°üõðIBJÍ|rjæJž§¡]U‰žª0]`fÒûº|ûœ øe³ÕÞæ½>(bí­Wç+ví­i+ªrjoázZž\ÍD½œºZžŠ[#˜U_ôÝátÞ™Ž2…ÔÆ‰ËZ_pœ*`f¥gE]=ŸS¹Þ*`„þ¥[º­È´ ƒ²Kçã,·Pk­Qc@Uõ†6¦±¨€~™¨@ Ì”7ž¨¾ƒGK^Út•µ·Õ$ÅRèØœ ž’EÔ6 ë×-¡0VEÅ´8ÏÅiëdze­ç¦ãÛÑÃ'à]«Ð“Ì7—´6<†ïL<èÖ“WúN=«Æ0hgN.½xÖwfV‘LÉCúÆb"ˇ0f ÏnUs2‡À€j„­`H·ÆÛÐ衟á<Ðäà1”@#N…CÇáª=&!M_6È`ˆz|Ùjf§y0©«˜dKdÉ ÖŽº¬XqzRÃýLÚù­UãwêubÅŒ¾¦OM¶WÔ†%m‡¨‚%XÈdôª©·ãòg5Ø[]ã9Jc4BµM®qšv…Û:¢ÎQr<"i|ª®Î³@£ÔõzH¬É“5‰Å̰ ªÁ ž'—øWPqü—x4È6ñ V3°ßúc³™SMSÛ/.¾˜•ïQx>œÁå*¸H)'@Èwr -QPøPV#½yV/ÛXS";9 ¯îú„ѤBÌB…/´Å-î]Îõ@[ÒÂB¼$ñDiZ¡oÁUã dEÑ„7 MSAÃÂÄo˜DW|CüÇXßLʵ:÷jšBkÈÄì•ÍwÎG"†’^$7™É0&ÁáÞ™ôâ}vZsΙ]Ÿ ꜿhUjßä”s h¾ ¯/ž/J?Z–ÎúÊôEA™®®19@}Ò¦:ƺñkl[ŒÏÓ| › ¢ç g©Ny!šQƒoù*€¸B!Ç]cK7ÃßÀY¶—ØW€WͨipØC)h¯ç¶½žé³»jeu{éÌîÂïàœš]•)Z;çŽ6åûÔÅ(/]ÈÔ9áF–#C'[FÌlò¼sž4„›gÕxÖ:%#· σñÀ“÷õ w:—•ÞÌQ×Ǩ–4a"69Ñ<ó0VSì0 ”!˜a´‹É_OéÉ$4ưMe™­®fÎúìWòq&M­R§qK‹4®–¬Aë1J¼ûI˜‹ë¾µ‰n¥¸Ãqó,\]ˆ•éí¾;µ#»á`8j^ŽäyÑ1˜ÓÚ%·Œ¸œÔV‰še„žƒ„pƒ…*bÞu”AJ÷ÝY<%W…¦q O¢I‚šA‘lúÙ»'ÜÙ€|ÒZL;mb›•é–¬ §šÎ‚ᣒæ2Äÿ¡]c¦1½…™o¶Xœ»Ö¥ºŠ`&'Od>²‡ÐîgÉ—!û«*ˆ¸á 7%~yV#T¢ÜX¨RÞ¾JŽM±ªÑŠrè4ú+Å Ðy´}´Mƒ—•ŽÁKzƒ+ 1Â<áa0”¢‚•EÎþÒð° ·ƒ}rJKö5ê}QØ‡×ÆÙé6qy¥á¥ð âÎ#ØlãÁf¤$)±!„£Ä7ÏicÅOp½3xKXÁ°sA·y8ewÚÃ&9¥‡Öð!Oã¸ÖÝñCfƒÛï k– 8§à¹YoæL=ÅÔ%W[¹ÖC¹•’(Å À² ÿ!´ÅY4¡4Sž²õN`'œ* ‹›y ¾‚$¼ü'\ÄjMØNTÔݦA1Ï•¹ø]Jrßô½¿·2bóåû8K”X|¢þjá• ÝDôY[Ÿ‘©3Ÿ8š€jäîï¤^{‹…oØŠ©²©I_ò"„r•®7Wá„Y¤)CI/£½qdZq«Ñyêž+\µ­5Z¡Ê\"Þ¾é2…¢qÓ’NkØÞ÷͹F,Ü DA1öˆ)l{‚~V¤åíbØúµ¸mâÇ)M›Ö&Pw^ý/@݆ªsZ-R¼×=%B¢¦®öZ«qT]Œ_k¥>b÷çŸ,P{µi(F¬å$¼®®©HøTꖭѹ0œ°w ,MÈsÚˆ;sÌD¥H$ ¤KŠ8 $µžIhíˆddÐ?[5ÚL–\Nç½¹áS&76c4øÕ™±çÅá)7DZ›Ÿ8µDÑcUŽjâA¨“Ä)¶‘ƒÎ´i\Þ#uuÆO‚. ¢äB:7p±f`xxBò\}M²Fˆ© båbûö­÷õßv1Wæòƒ_ž¾xˆZ"~¢Œ}™òÝþ‚Á" µeј;fê…ÌmåT®¨³®¬g/¶¨ï6‘-šåœYáÍTî- Pç 6`E”©ZÞ½ô¨sÆS«sæa„º êkUc,â.ÌÙ’>Ý4q]œêQP3†^¬Äµ¼Xd¨t=MN 6$Œ¬Àý… ¥ÝBÃ<þI _X¦kWçÈ©ïËÞf¸? N{ÅA 8шÓo‡“Ե儦”UàJGbÀ^îôGÝTÏGÈËÆ§aP¢Á†‰6…¡òÓ<¡sÔõˆ\+¡Òº6ÖíØíÚL2¦©z›ö8Π9Êè‘[²`ˆiì=¼! I߯¥©-èÆ DTMõ4ªt¦¶*„w±rÁá}P8Æ1Gca9X‘ÄZÛÃÂÈuÈN•ô´}k3'BÏgŽ©’“ì Æ£gzßuÍzzßyæ=ϦŠN›±ùÍ`¥úØÁ>iw§ûüv:Ü‘V­'ˆºý=¸£&BcÆžŸ÷W`Æ“SmÑku+áðÜŒó@äšG¥÷þŒÖ“¾<…§`kwætéÜ‘g®I(Î(©îvæ¤bâ{%ìӮ܄}.“!"hm7¤EÈÖ˜Ï÷œ´#x‚Ýp>»à}LI±µ²HöòÚÜ3]bˆßÈ&}¡*™_€ð„“ÄÃSâ\ccÄX²â ñ¹ÑShq”®=ŸÉƒs Q. ³g…rªX‰ØïV+Ѥ¬ÓÚÌÄCõ°}‘c%$ò„; ]j}æÁˆ¥ë‹Ø(+™Ú‘B9¥hfyáeKœáïîû€Èžî‡˜~|û•”±q‘ òÙ{)¼¯ÎÛ›6z˛֫fôììLy²8N6ަhnkQ}U1\·E{[ oo<˜B÷7ÏêºhFܲéÖ<|§‡ïŒhÒêB—ƒÎùÉ3mÄm×¢y뻓ˆ~c‡ŸÐ;I¸õD¡}L7ŸöÎtb”½Ok;\€¬Ûÿ®kÕΟ6¦[KÂÓ"„À°“{EøìŽâ>_~וM¡ö&ÏëcPŒc¸ŒÞú,I wŸŸþØßÛƒ endstream endobj 6488 0 obj 5427 endobj 6492 0 obj [434 /XYZ 40.7999999 591.379999 0] endobj 6493 0 obj [434 /XYZ 40.7999999 179.539999 0] endobj 6494 0 obj [434 /XYZ 40.7999999 591.379999 0] endobj 6495 0 obj [434 /XYZ 40.7999999 179.539999 0] endobj 6491 0 obj << /Type /Page /Parent 2 0 R /Contents 6496 0 R /Resources 6498 0 R /Annots 6499 0 R /MediaBox [0 0 595 842] >> endobj 6498 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6499 0 obj [ ] endobj 6496 0 obj << /Length 6497 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀíæ£_@ÀöÌÈ!€a99Þl‚E¼ˆ³‡üý´ÔìÑ ©d-i4v´C5»X¬ëÅ÷üò÷ý?Û¿ÿôå?ûoæ÷§/»¶iûvùÙþ½{ù96J.‡±kätøÙû¾û±ÿ±û¼û<ÿ÷ÇNôÇͯyp}Å2áoß~ݽ_^¾[þòåÓŸçOÿÛËýŸæÿûeÿ׿Ϳ~2ó¾ð}7Nýáÿ—B 9ÎÿóòÓað_»¿ünÿë Âxœ÷ðßwìU×É$8~Š^Öîûn˜´Þ !g8»ÿýÇîçy¶g0šQ+¡ÙéùóÔë¡íÆQΟe~¢Þ4ÈõUÓÐïÅÔ:/rÖ9UâD£˜Wc¢iK­üS5“b8lCô&›eŽ ¾¦.ac&ÌËaÌ´…ã])+3ˆÇ3±ñ®µ8.²RW¹Î”Œ.= ™&Ò\¤¬lÅ;œ)§øûV.Û)uéëTÉ8E›g¢D"miënà©Øl0ö¹Ø`)a“ÈĈò°œ‰‹÷©í¦ã"W³ÓVùaÃÏpvãS9©EåµÞÓ~‚³MÕhylE·B*èz¨RÒö˜¯%Ç”ª¸³%”"W9ÒÁÝ’X`Þ‚4†el‡Ÿ©„‰e9äZF1-{ô äÍöލœ|†÷GAض§ëûHö†Åe‡®Y?æF<‚gÜ×#¡äÃÚÕƒ¼ }E}ةˡËJúPã3¶Æà‰WÀ½¿5}¨áz<¶¶‰ñyÊ ŒQyó®Ûî#w}Zöœ0|7ÿž cãË,žÏž2Îü_G=ïÜØòr8°’æøÔõ{‡5%¦1(Q4†:«µp? ó<穊wá*q °äÊ+!1ÔŒ]ÈlS34?–!X³(Ìs˜v8>c u­˜TM 6‰¿8’-F0`t{Fô«cY-L"DÓé~œÁ±k<íñôU½p¶YïÅ–5ëF/Kö¼ÆyV>Zß0‡Øthv1À‘à{ÍùzhZ Y^|ua!×÷àå9ïuVƒan!D;°ÐzßH1Z bìÁek"hùÜà%]£ä(dçÅÞOŒµxB&ЭìearÁ¨'1Ï$˜·àôÎþáéõc=!)Åðšjh,¨¼9[BÙ<œ}OÚ0ô¢úzÁÆ+·ê¬»ë.mÝ4°»»i8lècgÌS%#LµÓúÊHzT££E=´4(&Ï#„`&Å[ HÅëü4ÎW ‰zP’b¹º6&†Œ£ÞñžÀ÷DÓ s"Åvn#slÆ©í_¯b!Ñ­³œF Ã˜ÃøÛN= g\" ƒc<Èá˜ra2¼‚Ó ÁÎæðó>þ$%C?Úš!Ëù#(‡9ÒÝ£š8Z„AÊÞUEœ8L‚¬ úœýË©yð{]àãù,? GØaîtVîhô!Yc¢'B¯,î™=‡ÕC0GžzÁZy/üèØ%Ö+†9~Ë==D ØÂÓ{¨°¸JšºÁVIP´Plö “—À`ÿ¡CDŽüËÖ?W8:ÊÕO¦Œ¹Ò©ãÒ_¶« šÍ1V­G aË4ç΃ Žùu]ØÎ5qÌ4ú‹7ˆeˆÉ%Ì‘aG¾X°Cßõ±G†I†=dʈ-„wü9Îêà„`‰•—óªW–d1^BÑ6ý ^¤]Ó•áˆ`9<°ýIP=œhŒ=I§ÇOfy’?³)¯á°Å}öÁ9–àÀ‡æ®øc.÷b:Ça²_¬_C§Ì•vù±%ù‘uc†ÎôgNÙUÎ3|¦[…”MŠ'±º°)³UÒÑ =ydÌÖÂgžè+=åמ™ )›Œpï£xcÞãyâÀ0èØhçt ¡V\éšMÀ÷xp€¡þq÷¯Ç3Û€0êÙÓ“KÙvCs°“-L8#èv-–¹œðÇ3Að ÅŸ(ÎRG;;àd~8zÔÑyM¼¿¿×õ燡¯Á%ãdå8æ0Œ¦‡&°‹Ô5>·È#!ÈS6)Þ¡QV>èå²Ì=}uäókÞx)=úPR²Òí)ÑiG^gÉS茞 =Æô®¢Èé[&ÈZÈÁ#å‚“ù‚çÖz¾’‹øòò€ v! •" ±ˆcäÿ2"/¸˜móÒ8ly {Ýnqõú­õQðt1¨U{ÞÉñ5IœË0 §Å[ÌXÊy,tBÙA³n¥-(~ì»Ã*ÀÁV™!©@‚V$œßïñ®”xW„1žRØVÒYÖrÑJ—ª—¬h *™¾ÆGØEí:3ëTCp¼”ÃJ–r8Ó$DÕò¥ß…¬~õ{:ßäð_Tr0|ܬ£Ü5: r&Á¤ô· º˪©µEúœœ– ž] #•Lho¥½êxC/\&䱦¶VމÂò5—¯8˜„½A„S Ga1ª<'MÁ$ó,ººp˜ñ&|÷e«12Ç{8Ù”Óî’*xžŒ[Ïx^±[‰<}Í?JfãHeé/Nz{D)#^c‰êfJ•XØJâØBœAÛ9Z‹d>F” ”d¯ §òqmï^ÆùZ¶7ÅÓHè¾R)C$oAtÒiø¹>Ï=áÈu¯Ö†ŠqS§<ŒznÚÈzwîÄYëìð Â;Ìi«™u6Îãõ¨l^áüN2…â7£âü ~1Ÿ0î'À<ì¹w&+wã†Éç¿@¼)LåYïÄñ´ÉÍŠ·šwB\5ý³d_Þ»)w1b°ï<ïJkÜFA}*B¸pnÈ7aÍÑ«RmÖdë{ÚUÌH„Çä^\±Y¶üv>¡›¼Ù²dRwo 6¿<3"ËÿRú»k …¡×pŽ6Á޶Ý–9Å Ø»‚¡˜t¶C)†¡(]$$´ê£4¥àÜ/Î~ÞZœ\JeN"gMÚ•ì‘8ØlUÈÐÀZ„c1ºâo&׊ëÍ[ï?•—Õ7îs3(›ƒîîá|]sVçû »[ùÂ¥nrÛNÁíèWoýi;Þðé=Á½á‰ßwŠH$”&nVIpŽÛõœ›¯ ™R¡Ë‚Jr_…Sò¸Þåé:ð‰ÎI×#| ޽/º·(ópU‚7€sk[R˜€p·_J ‹p9=áYÎÍÑ—u|„&¬ŸLQÅ9Îaè˜[ìL• ›]\R_L¥0j»Ê)Ç7›­\„¥'L—õtÃháûî-Èx<´Ýœ½`Óm~§Üv]ΡÛñ„sâ·ðG:„ÍJBq «€&k=G–ÖÈ÷Mqe4‰ÉbßÂ-% E ƒƒÀãÁÌÏÊ+ädªâçÞiFúúÊÍ0—ÇëuZVç¹g¹(ã»b>~²ˆ[è9¨·°ï¨É¼òoE,¬)Š\Ÿ|v†F¢\¯€ñèR‘œ’ ª+­tBˆß{–‰›å~ú²]R\{ž•Ç»j)¢hÃä =Úš¡v)7E§'„ò/ùÆ«ËOËË{ÁBn[Øez†hÓõÂÉ"g æxMd¥œ1U2œ÷e{¿°LY²ž¶ÊºLJè {ð~ÁV™ˆ„‘‰•unNLI¾Ù.òR©íÆ&½ <Ö’R“%wÞ‚°UÓ`­:¥öcËÂ/-œý#´àMpL3šôRš%]Q'¬¼o)­<ŠšP™åJƬâ4«7{3Ã1°(ÝÊ™‹š8S oü çVƒŸYO­°Œ]‚%[§X²ÐÒWP Y'P_Gkí$¤mæI‘öY{E2®¯ &s§¤”´p‚X$øÅ¶m1­õdý­ÅŽÌ]pd¢Ô8¶^ܹÔwÊ¢½ˆ¶Zœšr|ÆÎVš0ó×tV©ôÇ%J¹.ñ”4Ñ.?¶Œ?7²Šå¡³FÄý™S²‰óÌ„ž1çB¡šå<êØôC£l/PF¦K;.cDë|¼]^Œ<Ña3†]ߨ£æx µ@ï1Ä=6ZZëÁï1:JtÍ¢¢Î 9j“p‚ˆƒá­ZpMöáëó6klS&›õò³”9^”,·ØE´l¼¢®ìÖ,|CȤ,†å$¤•¯nURZpRÈ›Q|Åê0ÃÉÉŽíšV4rf+…Ì‘^Gš8îº"*=‹¬ë»ñ^`eîpÍR<™×vqý˜jV(ѽ&VZ^Ú…¦=D¬[=ûEøŠõ T ¨l­‘"ö¤Sá5`êá´„bd·^ç>¶6¼RÌp=ØûçñäÁ•â,¡æxØ4Lìê0…@ªÂ³Uå¦a­Sp ¿åZö¯QÕf Ë­îñ€ˆÌNN ƒPÂOÈ>ÉÛ© ?ƒÌøŒÜ"÷Ùs._e¥CcO=ÀÙ8mã³4Èâ°á`‰²õÝrÔY%!×åå)aþ·ÿ1 éY¦0¿¾}÷HmWÜ·'qÿÙ+ð½†#*ý^Ì =›”,úå®Þ½jŸã*& Ð7ýyžtCrh†óŒ9œY¶B©FNg;w]Ó/´eoÒ¹÷Œð™ >³É ÙC§‘p¶…¶_þå~×ÈØ3+|BÏyrnD u˜Ã?í³c”µØŽ @u‡Ï²Cx·t`¸–Dj@4j’uâvîѳ;‹ûp~ù”ûãØö8_oƒ`lƒÉF"f”†ûÏ»ÿmùt endstream endobj 6497 0 obj 4424 endobj 6501 0 obj [435 /XYZ 40.7999999 96.9800000 0] endobj 6502 0 obj [435 /XYZ 40.7999999 96.9800000 0] endobj 6500 0 obj << /Type /Page /Parent 2 0 R /Contents 6503 0 R /Resources 6505 0 R /Annots 6506 0 R /MediaBox [0 0 595 842] >> endobj 6505 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6506 0 obj [ ] endobj 6503 0 obj << /Length 6504 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯èsË"%QX¿äÀ°‚o6Á"»ˆ³‡üýt¤ž²?’U,RRl¬gv4M‘¬÷ûí¿üýôÏßNoßùÏéÛüõý—‡ºªM=ý9]þ¾yþ=Tž¾í‡®ÒãåÏéÛ/ßOß>?|>ÿûýA™ÇÎ_ΗWL þöíׇ·Ó˦Ÿ|yÿçówÿ;éÓŸÎÿ÷óé¯;ùq^ïò ¿< £¹|óï饕Îÿóü»ËÃ=üåw§_Ï[×½üû¦Ó}g†´}|¿~T=þ}þQô²údº±½lVéó?Ýù:þû‡ŸÎ«]·Q m£š^wíùûÑ´}Ý ƒ>ß7óŸ¨7õúñU­9ýù¿Úysܸ•TêB]ÓÉ,tÙ‘J:™ªÛÞ»’(,ŒVÓÁU›zôëR© õM+³ÐeG*íh 4ðR¢àº;zøëRi ]ª‘]v¤Ò޶€/U­Rý Ñüo:¦‡Çcö.÷#^زRòÍ뾑Yè²#•t²éâ=+ ’©=ãnŸ|ôëR© µ£ÐB—©´£-ÐÀK±É &æ{>mâ9—•’/ÌôBôtÙ‘J:Ùrñp%ö½÷fâ²]ŸzÊe¥äë´–Yè²#•t²åÞí•>‹hÐúIƒþîù໯o?©¶.ÃןÎy´:¦/_χíNo.Š[ßž¾þxú}]ëw8}ýùa¬º±é»ÉL™žÔz¢ |ÒÒ?£ágêðÉø¤O>Ñ÷ÖŒO>~=C1;LÆfyëôQZ]WÓt8â[¬!&é‘a¼·Wƒ}5†~Ü›¦>«ðj>)„©®!BZÀ;hàí¬¿7-@úÁPÀTâÁ^´±,¨1Ía|ë´€áƒo¾Ógï´Í¸ŽDöì ßA)NŽßÃÙÜAƒ!·:à´˜“Cî¯ñjоZÃÑìõí ŸÃïÞŽGŒM¿Kžˆñ`ÓP8h{¯»3úYŸÃnÚ²_ ²¯Â7ŠOÊñÌaø¬o‰c=‘ãÛàx4±·óއ–ãçcx[1§˜ïºˆ?½SzÙ)ö7áÁxÉðz<Ó˜Û1Z?h5¤ ¼WHJzô€ ²$ÌM‚àÊ)Mzm‰ýÉŒ —³Äó+ªàûÁ K@<÷7œàa&kÓS;­ª«éy˜ˆÙëÖ Ü\S†?$­6OHp=™!B+g;9 6˜¨!Óã0Ê<Úˆç}Ä͉ôy}'cm3ú›QØlǦ1v6`c6äÔÈ(øF3Z÷!01ÄKÁêÅo³g*¿jjµàÚé2žW¹ŒÁ_ ö K‚:Çá(<ØðÌ« ÍÑ£ÇÑÁ]áC¸,–°¤ÆÐÚö‚ÂáÖðû\ñ›À&°8ôJQ³Ëµ´ àº/ÇEv3Þ×~, Õ爈鎪˜½•¬ú0ýª>ªÅðáTŠx2¬ù³|ÛJú+àv¬Yͱh.x×edŽ6AÊ`Õùaš‘­4”Í®ßpõ‡6œ)ÏàÞ¥ª6Ý9úè$Ï›ÕïÞ¨ÆRÒ\‹q‡so Ž„qÔ#ÛðâÕðl2L N[Žãhõ¼.5%oÕM¯Û¾RF0mø~Úµ¢•ºãSjàQ©{Tê2)ð¨ÔeÚ·[¿Rל±§·ÑèÕUê’úÜ #§;]B5J…З±Tf–H˜HB‰þ±™R0 ¥•’9’”CŒ?˜ RJÈËÜ sûM×sJ c,QQ¬¯;]¤ðÿíUvpÚ>SnksµÃ™·DóÍ©˜UÂÊU)¾®«ž=ª]@qrBÚ"¥Å0H÷¥¥5ç/<[[HåÐAÈwsRñs ?ñÕ§¤ î¸uDë¹»–¹ï±œ£ð|žL•Èü’…(ÉMP,ã{®S†‡!¢b3Þ“ânžƒÑØêJQNSJW”VMÓZüãPåUnOªœ¬ãÌ•w+7ó0KBŸ¾íYŠ Hk„£è Ÿ]r¢,ŽšŒ’§7Ê–<).â=ù‚8EáÅ ‰a\6ƒ-!O6gfç=fîµ([IM¨y"L  VñlŠoýS„и†jr{Ö¸Ø`óî]Ïó‰^'ÑÄ®ÛñÎWØÕôeш÷ú98„æ œL)BzGB—Òeu{v—«2m¤WqÖæº%pv•¹VZ¥$h ezèPDaü{=p$H„2=œÌ€Å“ˆö”×&áÂŒP8¶>p©n{¢m³e—|{9bµÍŠçÿB bäzTŠ4¾{œá­¤´m“M‰[§8ót¯Ú qœ(„Žr’Î^|!d^Ä'MÜ™5W Ö9 i殳á°8Á£âð_‡·9¯“U¹$ûu'õ¶[ÇRÚRz]Šë#ãåœÂõƒ¥ Þ·¶RÀ&Ö×X¼Ä€GJ¥¥cé,J M Ue'ùU7Ø(²Ú=‚,p„Q‚¨[ÏO”’³UµT‚Y|Ê› )iá’ªÊá1“µ.óÖâ¤ÈÆL}¶%]<½pŒ-Ó0ÚbÔœf[œ6¨&·À5ƒ±n˜9ˆ¦ÁÊ:wóHŠ”æ.÷ ·¹—ÈSÏ”«zHаù9wçQuez;ˆ”3^LÄjwdcóþ yprHÓ¸m{xE~ž”®'«ç«‰Xí{Jz#\cŠ–U~Ãf.bP%*®:Dq±zÕ/óQÚy7üQykœ Ñã°4¦äÍ…sí8¶)Wkˆ&áï=˜Éê½·7V¯ôˆÐíçÎÉô{›ëï(‡ 1ñ!¥?sŒ³Ø<4SëF½¼fZ§]èÄÝ ñN`Ïü <“w(9(…z$ßÝ Æì”}Þ˜șð€ÏØO¦,Ïd ÜÝÓ£¼ápÏtÏj Ç;žYJŒI9¬‚wÝ@øxvƒCšÁ• ÍbÉ SÎÌ?5vbî×ÉßEðèÕŸx õjdNÂü½ü£¦^ù8i¥.I™Éh°ÎŸÀ$r&šÕ½ §ç »?öÐ6Â?^¸ìðhi˜„Ê‚)Ì%ë*ša´ö‰Æ'‰¸l5t<Ê"Í<å ñu©¬V…Nš&Çʨýàx–a?…jýE212¦HÄ”ž¹Y²%óFšVÉ”ôÓ6Ýâ¡çÌ~=“Ü›± Lúëˆ5ìÙÁ³b!´:lïA kžì„[ìÕÀçÁOðäÎ]âe‚ OºQÖ¼QNÂ6¾k|£ØcÏãávïýq»šáQö³ŠzFe©„s;o7ƒ“³Š$8<¯†§c˜r¦Øî2뉔` £P …ÅÉEçCé§Œ–5šåá”mN,c,–98b¬XŽ,¾Áü˜=çaP:+"É8)Ž×–š~µ`Žè‰ŠÊrâÜþĈäâ´ŒŒ <ç»ÅRßΙ´5ÍãçÞ“Ó=|”ñ-^S¤ éÔ“÷"k/sðsXŒ½8¿FÔFðhœ, ŒøIÈú.¢¯´M¾_Q)éy.“®YöƒýJøÜX6Aha]•¥b|‘Õ±¤ÃZ~‚÷ÆÈôp8Æp(Ðólpli¸7fÅÐo=¼FÖÊ>¸Gž•M½^öõSΓõó'OògvzqÖ”ʰÅD™ÂÚL_ž¼š–ŸG›éÚçÚ>ÚLm¦ý\ùh3½‘6Ó¦1Áýì¯ Bu-l¸Û4ÖÁ1Ën9#yq5"dÙ-f0¸v“&.L(x5†š„…®âôtÕHÌæ±ŠÀè'¡ñ½a6…-£÷€gל®+¸RžQØ2víXåaT¾q(ØmœëP°ŽÚt]˜fVrÌ ðâòú3úz\4«9_ßu+{\YG>v ŠÌX”Ó.:÷r»Ž0V%Þ:©9™3$mQ¶…qóì)À«yD-V’pÃìÍŸÁ, Ÿ¶ÔÀ;h± TçfvÍœ‹ó_JѲÖF ۇƒ18òH ù¹f ÂtÖ­;7'[ÄWsʪdæ¾&¤âQ’å8“´Ð3!q¥bkqR4`KP:NŸ9½ã¨³\­Î2¢Ø–?ð+gŸ± a““;X%¯Æ9γÀ3ò<;Ó8UÝ)ÀaKtb)àÐÃKôÀõ•·™³«ã…"ËcÙ,ÎɤŠe¨¸B÷Tùœe}ÍhQV&ÁŽ`dg2’\=Š·HÁ†sá®dœ¢´ýé&sZ»¬–ÂoçR„f)„äMY«R"‹S´IÅVÊï¢Îç‡jË ïíØåR}­l!UX× Ž`¶ä|–žñžRòœ;ÀÂð#nG#"]ÜU'V~« SD ÏW&¸·úð^–e—ð¾¤v¼_ÀFnMpÿ’¶VÖÚtûD+B¶Á¡ùZÁ"‰~\¼6œ" Î<·†Ñþpw eŠióGÚü3fJ;i¡´ù,sÀò‹éá:`†ÕgÐß[¢;äžÓÇòtv§xþDº0H¸®ÂAê×Þ„°©µEžÉ€gÉÎýáLýÌÞe´éGû¦œ*ü‰iß²eËT{ÏÕ Q‰#kôð5±ŸÛÞ=]¯©8•cùíÑQñ¤Æ®‡gb'›ƒëâ h–âSˆ7B#²‘Rã8ôRú}ˆ´ã4?ã PŠXÌÓ9†Ðƒ8%U´Pú%Ž^B'.a쫊„…xÇð‡Îæ÷ñŠ/¥eQ¼·™IZ<žF……sf8ÙP³wÉwõ²iÓCvõe¶Ó¯)E„Ô‚i„ɉ“’€BdVÝö”p!p²ÙeR2.!‰@:`x‰W"Õê™Mç,`µqˆPH,Q¼š4)›À€E- VÖîdÓå`½²¹…‹ ןÙ$èãs£¬AÆb{˜…£„” ˜B}ÊlïyHêü÷ôý ú3d/Ÿ˜¿|ûŃ .ÕOHôÙ‹FÞ†=¼æ¤Î纅£2ÕäʽD绚ÝѦ2·“ÐÆ¶~ÝWýíÄþÆ“ -›¦Ò£¹å§íºÊL´9æ­÷ ð3#üÌdõôºÒõ£ïýéÉ;¸Ú„íÏòþî쑸qÂOè33Ó¼õD¡sÌŒö™b”³«g½ž°îò½î®³“<ÐfàÁ–&áAÓ#µå8È}@øì®â¹}¸¾þ$rûÃP›J]ôé—`P 0¨gzògInxúüð˜tÙ_ endstream endobj 6504 0 obj 5580 endobj 6508 0 obj << /Type /Annot /Subtype /Link /Rect [107.039999 60.4999999 174.240000 68.1799999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.swig.org/mail.html) >> >> endobj 6507 0 obj << /Type /Page /Parent 2 0 R /Contents 6509 0 R /Resources 6511 0 R /Annots 6512 0 R /MediaBox [0 0 595 842] >> endobj 6511 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 6512 0 obj [ 6508 0 R ] endobj 6509 0 obj << /Length 6510 0 R /Filter /FlateDecode >> stream xœí][»q~ß_1Ï<§ÉfßÃÀYé(@‡ Û0,#Šò÷Ó³Ó³Ú%ç#YÅ*v÷ng¥é6/ź~UõË¿|ù¯Ó_þyúå×ÿ9}[~~øòМ›¾¹þwºüùýËìxníõ¯ÃØítùïôíûÃӇϟçÿÿx0ýÓ—óÃÛ+®þóÛ?~¹¾üáúÉ—ÿ6ÿíÿNöô¯ó¿þvúÿœüiïò ߯©¿üåï׿kì8ÿãåß.ÿúðï¿;ýcžÂø4îåÿ¿ïì8ŒÍX4Ï_5O^~½¬9õ}3 ýÉ;ϳ›·ãÿûáÏóhÏÓ8OΘ¡wC“=ê`çaMcšÓuh ¬-s¨ÒŒmeºÌÈ”-Í4nˆÅÞz3µR[ÿ~}øåÓtÑî¿þyžÅ“‰pýñõûƒ›ÿqQ{§ù_:ý¡i¬ûãéëߌ9w®‡îé÷žž4ÃÓ“ñçž>pÏsý®=»vþfó⻽ÿÝñéƒþlÍèýêuî6FÃyŸ±OO†s3ù3iѬ¯ƒ3 ~¿.ÔµÞr‚õ5¯ëkÎý`^Eûøôd:7¦ëm×ä< ‡‡“n¿>|(xåÁ&á3Ç;Ž$šàƒÆÿ``,¯38ø«!5Ì5Xg0û[>EŽ÷(ÿÙÙH¯&ØéùS4Á­Ž^“ð8SûûÛ×YL(1ý©ó¸¾6§L7¤jÌÓ§lþ̺µ×Ð[;šWË1)Fí–Ó=SãmE@«ð5%üË;Â~rvÍý&E¬Æµ# ×á‰\geª½Ý¦O éuÁrz²°€{Ozød‚O~¥ÏÀ~€Oà{:8~™ÁrCï†wÆ8ü‹Ïô7øä#}¥‘Yã=´Sçfô¶äf@Z®E}æ=q üŽEOÚJwóýÐ2Þ¼žåIúÍAÿýÒ¿ÁòŒ#ñzð¬5n Bz[ôð{£AºŽhcxGá{ðic ®ÅgŠßSIKÂ3pÚÁ£Æ`JÄ·Þ`‡i‡³o˜WAzÃ4áUpÖÞ‹9䦢išçu§d¨Ä|:‡¼“óæÓ`no~¡l|‡á=1ØBäpRL=˜_âõÀÑÌ—ñ­ÃRK:†ýÌÒ\ߨÌ—!íD¨Š££ÈžÖ¹ÞÍ™F¤æ.½¿ÇÿÌÌŽ_/àž2yÉwÙ‡>|ì‡Ç±'ɰQä5ÉxÅïç\)\D6%Z$M ßl !ðQñ):=Bœ2"Á· N̈kÛÑ‹ÌG$‚‹a0Çvñ Dôšlº<>½[÷ø´lXŒÌ.¸ƒ,æ“2¦Üù|ü‰½ÊÊ{X™ü°_°Š#Ü 7¦13˜+à£"Nœ…"ÞÄáŨQt¸Î´&§fPdîc×ùJø®ñá0´qHá`Í‹3ùÍêçÁW" ׫`k’Áælƒ"}› ÒB¬Éу߷Fqœ[3y͉YàˆöYá˜Åâ'V¼Åvük¬.!çóöÞÉ"Â{AÙÃSFgmÿúÚÐÀŒî€ÑEWº_u]ÁÍÀŒ\ã8g‚ƒö xÏŠQìÖÁr¶w•Tž5·w@âï9 q$.º;û…ÄÙ±$ᨖ¤Œð L˘cn‡¥¼goMFìì’yc{°e€s ‘›õnÎ4²£˜»¤vG&Ü ÎcÒ”Ŭ #-¡¨3µb(m;¼¦ª;B¼›o âT8”†#Ò%~4¼„ëKˆ ha¾J{s„žXñb jPF‘è XpFÈ¿g ˆž1kƒºIDûÒf€æ @½àÞFÀuþµá*^版"Ùc c(8Öàüðq 8 ‰c{Øípôôë0÷Íçy:â3$Q‰ÄZN@ f¢„/¬¥m·òíÙGšÙ‹(gù¨» ‰oL*"1öY:J—Ù3f¹é*,¢ëF üí£¬œ£AãÝ’`¡!%¬A§ðb›Öb$0§–[JcS-»×zâÄ9¨ëIc~VȤ‰üFk½ßX"KYÂ#ŸšK¼"·Ä#’Åíø¤…ò»D+͇¤ãK“NûÁ©¹•S[8Ž=…9Ââò%‹OÛHð,¼N>ŽŠñıŸ)×_?Ù&dÂÁÀ2>ª€p pŠcc‘Üg¼>æ”wÀsÖ,ö‚à}ƒ»ÓBK¶Ã§ Gç麫••Ö7Ï©xk ÚJâ Õm‘#ž‘ÖßI<£Š¦5›ô%šÖµ8¢8¢ =¢GÔ":·õ£]M™3ÜÊ2v˜Ê7l÷ðì·l‡­ï­Ø²Õ}ØÖ·­!Uuµ²F{sJRšpRìٵʩ|k)Ø‘r¢ Ûç÷~† û;qŽ‚SGC2ƒKÜ/1ÖŒËæ†2R°%;$uÐcdÒr\Áa„¾Mg“¦Ìè{Oh¬'@8}fð Yó¢u„(»·ÕvK£SÖμӄ6V{êo¨|²"%áÈÙxÒ 9…ÉnO„8RŠ­(‚¦¶õEÐJý-KzPÓeKÐ ô{£\ Šrù8zíZe-•¥ø'L-ÿÎÈVA•ØŠ™§b\ÉÂ!äÅ2’äCÀ°~6UÔ²íZƒé„Ìe˜ꖤ#Rߣ7AUùb¹¿’>JV#Ẏó‘Á“ïIA!¡HVGmwÍläÃRQàŒõNŠCõ,gŽ<«¢FP˜wÑèÛÍŸ)RÄl0W'˜ƒXsÀ®³‰U°’û.yGÒ)+‘ÍZaRç¾»ˆ\9F6ʆ’ÍÍ×Öxw€Pâ=ôMæÛʲúEœ‘ë’–KI%QdŠ) •⟜©B"G`8@튜Ҋ§‚¬:žUwŸ ¿uÑáiâl¦œdÈøA\QØ?!oœN?i·p%¼Nµ®'ÃôŒ_ÝJáqánhþt×Ùóõb0YHÌtE¡v×7Ð*Ò‘®ÈîÉÎVòçìÁk^˜'´n<I†ÒÆ4™½=n/¨±……¯PáÅ#÷N„à$j™öU‘(äÎpƒõèò„’.\áä9E0è3£ÅÕúJÜšK«‘f:ù¤^EVC¨c&Q¿ÈÀÞV†B$wºùG~Z8Q&à锦ÎùóÔ¦Kܳ Ërµžµí5%Tô ×ÑŒ PvߥÙ*¥Þ'!(œ¦;D°¨w2ÊtË8ŠÍêà`7ãÈ Ì òYùÆ€&*ÕLÞE¯ÞÓY˜"j_É_B(7+b-½ «´Vz‰Ë}Ã謤·#Ú_‹‘ýè3ò7áÇÛ  ­I¹e9%;U",?ŠD­ ½$jÌ(¶¾~1MNÃBN_Ýj6aÛ§)DÄ$šøX ±…W£DÛ#l# X³ïÚ8ÕŠç;¼hïÁÕÊp=»TE°*û;5cru;x"±W—¶÷÷ÊtÖÛ¬Èáá–N¸P¨O01b’ƒOpñÊHYKsöꃥ~ñõvxGáz"ßÁòàw"…,1SÂ……O[F©ÒÈEÃÅ_ñ0J5ÊRU­÷7ø¸ÁÜla‘M‹g€‹“â#¸ø8cG;ø„óžÈ“O•!û\7a+ŠÐáBàŒÂÙ¦…£9†ÜËb€wtý¢ëÇ™Ftœˆ¤ÄÍ™0Oc¼'¢™anÇY~OŦn“ë“§µÏ'²÷ èÞò=;xçÛ;ÓMóNHoøÉŽyçÏ ÆÕ¹0ïÜðMÇŽ^Ü2ƒ3klçã6@‘vP•8JËð©¼)qÐŽ4ílY­ÿ¤ª4Ým>b¾—x¼×6ís`E"yuy| Å*y²znl“Fæ­”ëX’x¦¯sÐ>0“ƺPÒÒòQ02‰Ô EÝÏÂupN*­Xl£298\Iýúi Šqð%…rвHþÁ1…_’Œ’µ]¸dX®¤¨€d'¥û8f‡‚*Ã1–K2ñ8ù]é|…¡3j”K<¶­êÌš™§ÖùB¥DåÜ^úâ[Ïïãd‡Q4æQ]­Yìßî<«®1l§§XAjÑZ—eˆŸp²1«œ,Âãt+xQèt'ÌJ©ÐO¿uÎã1«U(Uùëäè²3)k»^JŠëH´6+)j§]§úmhgœÛFð˜Uv‡P lŽHè^¤bTE 0’‚S\S3)x˜|¶ÄgÀIR-««\æQPˆâèà8V$ü6” ­úXê'Q1ZŒˆ$7³ÊÔêë$©UU0“—&gºSµÈk•Þ·—R zIxy EhXfºÌ1CëÓƒDm7Š—ó;Õ~É”°6AÅI‡ó9ÆAÛãT]8ê“Þžl¯ñ†1"°„ ¡RÐm"Ý7m;%NBí0@ÍN0­õäÁ‚È¿çâ È {ÃDÊ}•´ '¤ú«Ôà¢VK®ÜŽÅ˜ï?*P§´#Òï'’pÔ,[» šF?÷ ÖçdÓrr3Á(BÕ%­èÞ‡ÙNL}O¡Ð x ÖêÞTÃÒµ›6îSª·«iž|¹Â8²H`²ÊH×í|ÞBà‘“‘€Ü”÷Öý!þÛ Ö’´ ’Ärêâá9Ê|›÷­» (QÝCžeó M¸sK8f.’qß²CsÃPöt#óËíÔ·lÁR^<CðB|%ð’~ œ lžVÆrའ´˜:>Jß|'CÆIsôñ P¾.¤c¥4QMÀr7ù\ ªÊ Hk¼Q+A¾VOÕf ÂÇÊF)w³/ 5&"Üýë»ê"÷0?¹5m¸ÅßñÎsÊvH4Z¯žÆév"ŠE£¿eÒØ8O&);ù9q–õ¡‹¬Íp0pQ )ŒÞ—nÊ0S2:3HJ0Ÿ?ÁðÂŒÃàT#ICQ*I¶Z`c3Yr ò2?ÕLÇ,Û²àiÆÙ8+Õë’ –+Ò®mG¼÷ºˆí„ù«D¦Äž\»‹º\3õÏž] 2WñÅê¶O.Qæ‹ ²*nÂ=¶Ü-B‹äE¥B •j#‰úWŠpŸ÷$%Qää±ÕNÛš¬½}Þ®’F½„ìuK̺Ñy‹‰ÔeÆ•‡ñõеµÞ "X‡Ú©¼˜0|&M1¡W² 6„s TeS¥‘í©ê%Iš)ÏWÉ4]™ýàË“üŒ‘Z0¬º'»¨ÝŽ{{0ÀÊ¥¦³©¹‚;š$”x,9Þ»Œâ­*z!Œ…²!€ ÄäËžâ˜6~•YˆªùITýtšIÃÎÒò² ߟÿmÎãØœúáòc0f¼~ÚÎ?ÎW}­¹}òí¡ïÎÆLvœéëö[îÕ(îå;æß¿þ»™._;yßnFÿó'ów^Ïäò[Ó«Q¦×ïøëÃãïÔÂZO×Éš[ÿ¡¥ -â†>bR˜fò[°8h8ൎfàwpXÜFÙàf3¸I®zRÛtÞî怨9 #¬Ú/ÀŒî6ÊÏ'Øeü¹!NÂÏ‘ý³„´@•ZÁe§×‚«mî ®ÖúBeþ$\—ßr¯Fq/ßñ,¸ìxOpÙÁÇüI ¸.¿5½ezýŽ ‚«}.øàèt—Qwc³BÏöþ0„žŠïÖwÎĽÜa¿ôQTëíû!KÄaµÈ¨™Ór(%z0ˆ@„2:˜ÇeR/’¢¦T>ƒ¸Pæ[ÍÃêÄþSߺt–ŒüÆÒßñ½vù[RŽðbEýYm lbÄ%âÂ,ÈØŽäUp¸=£°k…ð©›<°a'lIqŒõ¢9Ûé½%’®“e”çƒWA·ëe `K${—•²ùñR)‘*ÉßÔ ¬Å*pVPdJØ-¥+¬'<""³€+Ôêè¹–R´>£R)ñ1%Á¤+ºã\sÖgЊ[£ªfáq3y›ÜþЦGq&BŒ /ÑÏ&2¼nÓübû¿C¬°G9’¯u]ð½|-<ÆÝ#àáÓõ™3TRåìs‚>$‚ÂAŽK,NL*DbÃ5‚ÛºçEýºPiià*08 û‹g‡öGŸ5Và}$ÀÑ2fW ×ã0®lðz0®£¶¿£úšT;Ýb<”¶¶Þ²a?”ßÕ­o¯cw·K¢§ †˜hV0'ß?óœà“žzÖLòƒ”öéØ%F(ðB €i?À'J'¡e„* §–_p:ÐEÁÉ88&˜ôÖTMM±2Mž\©®Í$‡ÊÉæ”À77FóȰ”RÖOðë­“isÈma™¢šqz¶^ž|=!ƒè9HQß±¾4¹ó}!Mtº+ë:·¬u–X6"g1¨«$WK×ÝÔò &šj‡£%*kÉÀ‘×nÏþFðæ4+Q\½ÀŽfà>`Kœ”UïŒZ2œ²Ëˆãì m×Nàq«•ó) æ7(!ð)‚¹®SMs{NeŠC¹Pëf4³ÊM"41bKA Ò _Êà ¤upšµj¥º6MjÔDZ˜}'к°‹C¶ƒá¨S^ç’6Ÿ#ÕAñk†~LçI†Õå.”ø´ÓB‚ûí¨šœ|û¯ïoÓ=œfgº§™˜Hü²ÄÎV 3kZ'Æ¿Ç{(Á,Øm‚uGT@&‘ë«Tä°ñ)QŠM´ â.bzk;$ßqPâX" Šâ‚ÁV¨H4´Çþ[z¹B¥p>A3/qLëp˜À™ƒW#ÁZuº˜aÌë}œhAšq29ªÂ%s®|þiß,œ¬cW°aÇ[äÜ"š­¦ö¦Y@ÏÞ‰1±p/ßo‚V+&oâ†0ñÞùÇ%,9f‡o¶áMÉÈQv)®m½« 9ž/†A­|̵¯Ž»¥—OÛ¼úàï_²º‰zŸt_vݘÿœ~̃Ïß}ZÙõÇ·ï¤i¾ØÏщF¿š\áØŸÌ¼‰÷Ö8™þÚùtYîrjWÂíûsÿ^Lî D¢ÎÃ}ua¸óäJQm{¶ÓÝDª®;÷×+â“ô½÷Œð;üΕã öl›öòèç“G8Úõʼüä#üÝŦ¸³ÂOè; ›º÷Ä u, …öåÄ(kÙ¨´€ê.·Ò§Í ƒ…Ç‘è`Iâ¸C£ Ò(ïä>"zG‰ì>ß~Ùýqlú³¹Ò_ƒaÃbG,Qž>?ü?»ŽJ endstream endobj 6510 0 obj 6281 endobj 6514 0 obj [437 /XYZ 33.1199999 292.819999 0] endobj 6515 0 obj [437 /XYZ 32.1599999 681.620000 0] endobj 6516 0 obj [437 /XYZ 40.7999999 241.939999 0] endobj 6517 0 obj [437 /XYZ 40.7999999 92.1799999 0] endobj 6518 0 obj [437 /XYZ 40.7999999 620.179999 0] endobj 6519 0 obj [437 /XYZ 40.7999999 331.219999 0] endobj 6520 0 obj [437 /XYZ 32.1599999 294.739999 0] endobj 6521 0 obj [437 /XYZ 40.7999999 241.939999 0] endobj 6522 0 obj [437 /XYZ 40.7999999 92.1799999 0] endobj 6523 0 obj [437 /XYZ 40.7999999 785.299999 0] endobj 6524 0 obj [437 /XYZ 33.1199999 679.699999 0] endobj 6525 0 obj [437 /XYZ 40.7999999 620.179999 0] endobj 6526 0 obj [437 /XYZ 40.7999999 785.299999 0] endobj 6527 0 obj [437 /XYZ 40.7999999 331.219999 0] endobj 6528 0 obj << /Type /Annot /Subtype /Link /Rect [460.319999 304.339999 489.120000 312.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows >> endobj 6513 0 obj << /Type /Page /Parent 2 0 R /Contents 6529 0 R /Resources 6531 0 R /Annots 6532 0 R /MediaBox [0 0 595 842] >> endobj 6531 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6532 0 obj [ 6528 0 R ] endobj 6529 0 obj << /Length 6530 0 R /Filter /FlateDecode >> stream xœí]ËÜ“4Ò Âñ iPÍLT¡š'#öÓ³Ã<íÃ<^Ì+RötGNj¯ÚÁ‚à õaßèùÕ¥W…ÚÈÓN¢ŽXì¡¡Z£ Ò•Oͦ yêÿÒf4›jö§Á õÌÑg¡îxpj†ºŒž=°€E˜¢líqß­íF~±gÔÁqãg„!†F\ÏÔZ8ð8Îþ93“•‚{/ ½uÓûOë˜c¤Ã+‡ëR­}bœ#ô ŽÇ˜I«,DL€ƒ¥>ÛÙ¡U ©•ä*Ý`±sèÞ)ÀgÜÙ;ÎÑÆh…Û83Î‚Û c&F’º:ã6£ñL1žpˆšÃ`>!ÁÄá¹e‡Îò0ô ¦5ÒâÐ)­! ã^ ×r8ÕäH r†QK‹3à]öÐVH]Å4,Ã|ÿ)ßœ`\á>Ý«J‰’ˆš#‚1X\ o÷Éá†áÎ8(j#ߢ‰CÄŒ‚Ã@ér¬Î§ñ VÃx4yOs®Cįà‰o›Á:ò,ÎKPÙ[åû=’ Œí'Æ8EμkƒÛ傯²(,¼z”%a©=žPRnEE`¡µÉ!på¹Å;w–GÞA ¶ŒSÁÑÂà7Ò– ËSù^ÛT>B¯Ž7—Áÿ]ҶÆ_5ÝåîçñŠS·Wg¯ÖƒÛ¹/1¤ÓÛ»RdgyE0B²¨JÜœ N(£Ö!Ø1ÑÅ'W–¦¤§ò(ÃÓ|pu„ÄÊ»'m[{òël?ˆzï\cPáì˜ìà¾ÄŸ“í oŠõ²éØÄË‘ñö4‚Á‚¡& *>òeä-lÅb™• 'àI‚ª+EžtO rÔHw  A/j¼-¦áá‹ñ÷W‚2r{Rý4™X2ÊSYÁ¥ój9²6ÜãÀÐѰ|µÊS1ûäèžÂ¾’YîŒE.Ø)è­·(é 0›ñpÁ1þ ­¡GU_[»à"$§×:¦$œA3ç ÷Ý6l~tÆý¼zx€•õêqÇ׈+䮨am·Oøö—…"†Ö”¸LèN‚ œ£~ä{8ÞϧŒÇp¹vN>> …¥ùëéÇ\Ù¹’æyƒýÐ6£ØJþa… `Ô ³òøDÊÅêfä­¦êºÐÇëa·——”ì‡ÄÀ ×Þ~¼9¹²¬û{u}`Ö°­,D)äÊAýf–ñü΃ÁXVxRA3^«y± U•ÛI ÒPKL ûÍ& #ÒqÒÎÖ†y]ÓÚ¼c#sEœÚJÆOhóÐv•Õ©Ò×ÜeTÜU™À•¬b Þ6†[UØôÈáÈ•îNYP:Bo“ ô'ZI›/ÜLÒ£» ÃFì“K‘æj…6÷cJä~X ìÞ¹8@'Œä`ÒǪ̀’¡ƒ¢ xꌶÑñÜî~pI«o×Ú´§²N÷ƒÁ)Ý”pä[‡~äpÏ“Ž‘a“{¦ªü°©* öØ<9Z²lAØ·"| à^ZÒ#U ‹Ë<ÆÕדã3þÖâ쇛2¨áÃB¢Ëÿ‚Qàeô=Su:£O•Á°Jç/…éCóY/ÇTkçNÌÇn8{jðiìú‰IÁíûD[Ÿ˜8RqÕhÞfÑîÛF—e·æè÷ •øÚ›/ŒÞØæ=¸ ³7Bíh^Ó¸Ù÷êÛicçÚ¸0g`s<® Ù~±gkØì°×£µ2Ïä04æ)è…°5ÉØ¯çÄèßY¼ip÷58;åNi¦}R¥až¤IizN³!Y^5 'Õ¤¼@j. a/6Íg§löVB`¤''÷ tÑz‰afSWŒeªnÉê¶Uð¼‹Òañ&‹£2F1Âqp¦æ¨° —pë-œ7;ì¦k ÷ªGNoeÁä‘­)sbÿò¡ëÚæ )'¼v?AåÆÒùq²meød¸oPvɹåµp¼xË›Ã#,~¯pÜêÁÂÙöÝ•‡c.bDŒð±I &µL ñöB~žÉЉ¿©à#ÑÑ즶nL¯Q-+Ü Ï>|`㵦A8Â.‹ p#©c»T_Y Æ™c?’ÌSªê uÅáx–`®P'‘Ë•`–äøuâ¯Ø²QIò+ú[6.b«’›iÐj_mN%WÕ  1ãá“M¸£–uÛtúÆ,d‰n2stõÓí©^ì´aK|Äoòp+ƒ¶ëA•+w¨,Ô²ˆ§-=f¥ha°Áâ@w­äÜŽðMhRþ8 >7³ïÁƒ áàãNè5PÊ~e×.¶V³¿9cè2´Ÿ`XÍÝp@Ñî[„9óSdÜ&½Á5èq›wúzŒì¹Ò›A°i7fÔ:rª: væŽ12®Wï©J+Ùãzõžµ‚{ùŽfÐj8ØFôh/ñzL­Ûµ}Áã`¸1ößЯ•ýñ`ú:>7µ2QL·«àåé±2QPTñÁI-hÑ\ülŸQyOŸY:k‰‹ õk>ŽJáöÎòmº[ôÚ¦ö‡yG›@p·³?Hh·™]U[]”½•À!ßj'lJ"ü*Yg‡®ífiL½ë–L½ëטz7Ú wzâ0õÃWjÑ‹ºãÌÔ;µÆÔ»Ö£u™úá+½èE/ǨÀÔûNÖ^¤X¯ëPøíH[¹Òb¥ja)£ÍÍkÆ'¤Ì(ã·ä(=ð^o$œ""k)”èÇÍR euQ…΂4úãh‘ûjG0¡FMÖËF!¦AHvž#¯pJ¶ÇB(÷Xºu3T;ì.§³ŒË¥²FeÌò¼™èYÒÎ`|/ŒÆ#r1ŠLçs²ªw£sø§8{F:ªA…ÞT]{óß´ðÍ;zƒçf|ÙÖzƒmܯÏz€p+žLH eíb0Z¦È~U1†¨˜“Žw›…ie ˜‰p !Ô f°É¢&¨ þ2xë=H‘×q’œ)¡äug謳O¸[²`ŸE„"‹&”’z ûIÛ–GØGº”¢] NUeå¨^ÛÇð)H¤H5oJFý)mï|¸ð´¶…ËÔü…ÜÏhN¹+}ì-(dqð(ôÃ7M†ñä-•yKI”4W[=@!“d³—ŒTEÌÄ•²8YTj5ç 1”L8¹'K9&’wËåJR'Ðà†4¨ñŽ÷çÊâ\¯C™9¾¿›]qsØÂ“¯r”ÜbP†£ÃE12ùý´Í!V¶9ûýLÿ®ßÏôÔòÉ9>±ü~æ¯Ô¢u=†ñûi›F»~?ÓÓÑ£m¿Ÿù+½èE/Ç(î÷3Õ6Š‘An3ç½§çÏÓó'»Þ•á¸ìˆ›eýk+×FfåM,ãDCˆ ä¸W8pDɰe(>×tÎüýEKÇ+›GÜ5ªD˜‰îɽ 5Po]k'6»ích_ã§–#˜Ö¤ ³Í UËq)UK½&U·Â–x§'ŽT}øJ-zQ×cœ¥j9¬IÕ²·Ç˜ž8Rõá+½èE/Ǩ U·§Ì\íIa•ì(»’ØK95 iL ypgQ‡rÚ0ÁªCI²ÈîþYPS ú%MSÃMSÚ¦7Ó‡¦¾R‹^Ôõgš¦º5š¦”3†riÚá+½èE/Ǩ@Ó:q«4­¬õZÌ®ŒW0œf†öÙæz#°å[•¡íÛµ=6jh%Wxά?3zƒskáÜTÀœ[+à8°à ZƒN愎€½ Œñ°7‰a€g÷‡áý1CôA}<ðÉ*K<»q°ˆç}"¦‡pà-†½5p´Å]r†FZ;r×r9ž|õ¢±„ðB‚kFjø°ÂÑŒÕgÐmþvn×aÚ ¡ï–7„~%‡ÀôÔ±óõNù+µèE]q¾!ô+9¦§Ž½²wrÌ_éE/z9F…Âp¦bô†pÀS6}ʦR6-ZÃJÙdƶý8U´Á‰×Ñ»Ë9ž±ñm+ÛΦ©Ûg*xl©iÑòi\Gµ”§ÆnMžšn‹–¬3=qä©ÃWjÑ‹ºã,Oíš<5Jg éÊS‡¯ô¢½£‚<5ê]ÃQ§WhxšŸ†ñç&sOцy¢MóæýuìƒwaïœáJÊ—­²È.dž¿£þ=e9Pî!z<õ Š->o½œY Q=Â…—7ÀR`8Z¦Hеå;cˆ×›³Ú²›6«'/ëÇUo~ÊÑãªq.mœ*¦•êµÓc~ {´%QwN,UŠ£fŠG·¢ˆÿä9·Ãs*hp„\F× ¹]'¤m­:<±58ǯԢu=ÆIƒ35YÑàÌC-ÆntÝñ‡^ô¢—c”×àL{qÚ:F¼6K˜"pVÖ›8 ¶u‡óˆ{D B‰†¿3ÖÍ §²×k•f½ãzŽY=¾óB`#a‚r7þ(ì› f [÷©®ùyKš·ºÑ⛥b¬\&‡%Wa_|NLÚJ—Ž.’“>%m:‹Y†ùM¨ˆ/ïšâuH¹G†+€d ÙÎYy Du"–ZÓµO„KÍÇëE(ÆhG®ÈáX]ޏ9çüRŠ´¨ÅÄf›iG7“„X59|U)òwÕ+\ÕÙB²™°LYs^ûžònмË"Ø•…Ñ$ÓL‚Örg € xšÇ3dÅ.o2;‹*QBèð• ¼}ë¬g/î6®"‡·Åf–܈[ŒèŽŽ1€ƒ f*_s‡0G>F€u’ç >'9lŒ"A:òWH·yá2ۙγ:¿"©·Î\Rh®·[ðŒn;«pùë4‚Û*Keïbùôµ½¬üK.ÄðÔf¼•çQqi\XFKÀRUžrº°`nS¤Øpø¶gæƒKÁÂbxuV¸ .ÑÊ),æ)Þ…ñ#ËVÖ+bOºq)â âÁlùQv«ÁsÃ+Åø׃ ãòyžÂ‡¡j¸[ãå0„w S5+OáBÆ*XFžsšpñFRÃ^ÖT<ýÃIžœæeÄ·žþ¥¶èÓ“zÇ…¤‘iWæ™Ò+|3@0Igɰ—|Ö€J£•µ#+T.‹—p ‡pSápï?–KžvsÙòøZd‘™oƇ‰>ÜI¼TÓ¾1P ³ÿx¯XŠã܉¼É$ûCucˆPeqÃwY‹žäpmtð;o@ÂÔ‰ åPœ°4Ì Ü˜pgTÏ¢OIJ!ÁP°lžñ¾LzIìˆ^&QÓå=Ë+éM­;‹qBÓ"b RR[ä€ËÆ›%~<.!h •g‡£”¿|÷ "[8‰•9™ƒöE¬0C‘X1AÐÔæ ÖIù}²$AÊÂ09Ì(¥Òí­´‚\êÖ:áµ…eJXS–Òñª¤<õC²(ŠàL°@è1ñåMñ¼R¤D½¥„Œ;A&)imnù²“'‡ Ó !îŸYäÕ²é*¥vÎv[œ‹ Òá"ü®¬2Ëiõú¯÷J,'•ÉýÜßF|‚m ¶!›iÕv_8ëk‘sÅGûGCsì¡íñ_Ç~òµü°ûatÛQ =oN뜇%å³RÄÖ<ùP6/šš¢(y¬le²Pbc!LŸYNªžÝƒÁÞ@dó,'ÌØpŸûxŸùOZܦ· h$uwö+Ù^#ÉȨa6^¨“ó–F4MáÌ`Ö4…¶Áãà< ö†ÇÁÚRœµ÷†WÊÉtQKªµXn"­4¯#Œ8ê¡noê_[[“›T?„à€• •¥Øô³U«%ÍÎûÑÐ0špRX: `x†=ÚÉ$x°0l«)ÇãæåA  e,É_Fe3˜­&ÝN* –Sv‘H6WA‹ÛbT$蛊 <¨Ù–à訛 àP2äÈÚA(WÖ~‚ûƨ_Ár &ï±-GŒÚâ[&xÒJXŒ¬V^u JN|\¼˜’…eqãóÈcdßï#ŠLw¿&\8æ×hvæÇŸ¤Ì+WI]¾zñÊÛ4¬hêwbZÆZÝ!-úù±k›³ºÉ¸xõû~Ý/P«=ôå°Ö}n†•7ó9nÛ½Ô«¦‰®Û÷óNÚçbmœ¶Ñ°ÍLf¹—M»LPòö6ãËõ“7ø­¹[¬¬ðµ1’ÈÚÖa+­Ù1ÊÚÍÜŽ ë¿ËN áÝæànñÀh{×0î-†Ÿ‘2WÞˆ/ôÞ0>!´R“~xm¥#ßÐ9Å+õÀúš±oDa/ëü8'7á Dõï¡<¯pÿ{8{癤ò,õÌÂØØçV貸’Ò(Ð86ý^¼|—¤H0H‘ñÖ6RAF‰`÷õåÿh —. endstream endobj 6530 0 obj 6812 endobj 6534 0 obj [438 /XYZ 40.7999999 372.499999 0] endobj 6535 0 obj [438 /XYZ 40.7999999 143.059999 0] endobj 6536 0 obj [438 /XYZ 40.7999999 143.059999 0] endobj 6537 0 obj [438 /XYZ 40.7999999 372.499999 0] endobj 6538 0 obj << /Type /Annot /Subtype /Link /Rect [386.399999 497.299999 473.759999 504.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 6533 0 obj << /Type /Page /Parent 2 0 R /Contents 6539 0 R /Resources 6541 0 R /Annots 6542 0 R /MediaBox [0 0 595 842] >> endobj 6541 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6542 0 obj [ 6538 0 R ] endobj 6539 0 obj << /Length 6540 0 R /Filter /FlateDecode >> stream xœí][oë¸~÷¯ÐsÕáE”( (pr9úP H€>,úPœí¶XlM÷¡¿’EÉé‡í8N€Ø1Mj8œ+g8üòççTÿú½úrÿüŸê»y½Þ±šµlú©ÆßŽ?º–bzÛiU‹~ü©¾¿îÞª·ÝÓîiøû¶ãí¾£yçGLþþý·Ý—éá»é“çû¿ïþW‰ê/ÿT?þ}xùÉŒ7~áu§ûv|óëô† .ôðÏñ»±ñß»¿ý¡úmAïÇÿþ $¬m’àx[ºòýïqWô0VµmØ®øðQÅÕ€Žÿþs÷ó0ÚF­Ée'T3¼ïÛ¦cJk1¼ï¤ùYõ¤NìÕˆªïÚáqó g¾+‡Jˆ+•g "ž65ΚÎ?TÖåþ›¦>ôJœü2Tê@Rê<ñ´©Íˇªû†ón\†Õ<7A×CuJ¤Nt*u ÕeZÃ"ž6µõx(2ê[ͦivÉ]†JH«Lñ´©Í¨ÇC‘Qß7r?Í^¥Îs)aŠÉ.æGˆxÒÌfÄÑr ŴγËHÉkÁu¾‡(ËZà‘²®…PÓÄ;×þŠœù¬ôôMé•[BéðîaKg×ѰeÔ: /y…†íüJöÁëÓ|E- ¯6¤ ¸Éºr Æ% /Èéýls(y0¤ æ~&[kTõóóÙÞ}‘ílB²¯È¸ö˜Ýfþ•G~òxŽEp=®Ãçqú¶•S‚s‹ú1c{ö ±I2Ö7dl¡zknáMJprð¸Ü8ÜŒI´·YÝþàì{A‰¹eTM [ PäÀzÊ8¼ƒm'ÊÅš1J}+õ¡uÍŠ`a¹ó/!‡ƒî.cáás„Ö]zqÖ'8›…Î`8xm¡0’¤l„$YOäÁ‰%o›üBÚ§uKZžH²hÇ`\=>&¿¡Òèzm+ Š0Å-3bÅWÈKjØÉÄi)É£@R’"0¹^Fähy6®\eÇ踫0¹Â>†»äŽvtƒ+ìô&¤-‘RÞð‡åÀú|­Rƒ øï»–ª87ûåx‹¶x¤pËoÝ&dwl¨²×vWl3aiO1­p>¶—°¤¶AŠ£ÔV8‘ç¾^Yº¬!’Njnߊ¢‘Jæ%4K 3¶Ìf»­€g‰<’¢T8N†ŒðãMCOÔ A/¶<°ap¤‚óÂÂΧd¤ºYâWú}(â+’h¯SQž™”ln’ã&9ÖÓ‹’aNýä\ØkiYgO |æÌMÛÛ 69½!]ðVYØý4MÄÉL ‰g«ËÙ’‰Ø¶JØÏÆö„WpJÞu ïÖDœe#Ä=..8¿iZÚ¬áJG¸Åxö˜DhOŠQGÈ0Âùì<‘èàÞfÒ6 !¥‰²G¾Q²SÄ®nDpŦú2öŒÉZeÐ|jã¤ÕÚÂTx’QŠmœ1pŒî2áëpÊ#"ÌMgk\ !kôŒ¢ÉW³ìµ…ü®3d»ÈЉ®¹[]´3ᘮGÀ_w½è?øu÷\¼öÏBÀG"³:>aêK9ñahxÊE8JšEÌf‹Ê„vUÄr$#"ÇœàS’\lÏ–ÊðiÛx¢t.tñ¼'‡ÓéB95Žs)·9ˆ‘3J!ø°º8ãá„õ™ëŸÖ#h)¾ó•™ÛÔ »R+°HI¤-5‚P¶JÈXuéÌ%#:P•LÍè–*/·«¶[€u¢ÅÃô[05£ëXž+ ùÅ‚.K‹¶2T¡—³^ùL3ýQ ·$¾+ÑQP_r‹±ö¢Z<%:ðIsLñ˜ª°>¢P–ù„Ò$Øòr0†P‚Ë3KHú•R8 r}ÐÆÈ ñqߟ¬_ÐNâþPWqA›~Àà–Ù í”Õ"x|ÏszÔÇ ËzŠXõ¹C£™ÝgÎê)ßí¨¥7þ°´C†æØ@[˽“ïîÄ=V*ÿ¯³‡*îg0í¨%›‚säÙmÉqFxE]¼ÃŽ¥dM‹IzÊRü‚’¦÷鋉\é–âív’̇Ë”ÛRg˜ÜàƒÒ¸Å3¨1nóx}’™ÿ­銓%VX (šŸŠ«-b' c¯#ÅE"¬°ÄN4ÆØ FaoVÌáVäüŠç¡ ”ùö»Á„’Æ£M¹X¥âª¿qFqã‚Rf]Â>×A)ÖBáZ[Áº ·`ëe{7y22Å!ù %;¤ìŠD”‘Û¸jPÎ*g¤ Ë-J¥mTd B*þiïÈ4ÓïS8á¤Ègl©$xg­ö-<³ba\A /ë}Þ$}Yæîê¼Çµ“jÓg¨pÑQÊYG^aͱZ®3î‡ÏtÈZ+%ÌJMƒFu¢^+âüEOÝÓÎô|HE´¹ºÑ­­n"d¬C)õÄ]’ÉqêÛíS´E“¡ŠŒ9y’ "øË͉¡Ü?ròÈáÚ,5˜²Ý–òÎGa"Tíú[.²ØlYÜöˆSÖ¤3°“?#?²î®PrÚ(×H¯`Oðozk–´˜ð–HbPc¢BÏEhoqØK‰ÃÊC÷ ŽÃ~Ìu<LéD[7? d»¸g?àéƒÏÜ-ü„ÃC|@E(ì·”Ì}Cüºn„ußÖBÙþªa ˜ØH3Á*5+ÀC Ε: ÝÞ[Ì’4íì-f½‚ÌÓg›<üpå—sY²yND\@ºñõO„5_±;MÙ¤Ô¥P¹C?#%•Ýs9æmñ?ÄâoúÒÜÖF9 xm]¡Tÿõl®z±·u¾m›OÂQ¤¬(Ï‹I 8{H4G¹õвL¸Òx›„Û-ƒNª[/èí)eÙʤ\[¨Ø* J2"•b¥‚ qKϘëxa{Ê]ªeêcGD=³ˆ|·ü` ƃ)r™ ŸÐ9×m'È‘Ü2è4]pÄêW^mmìàr•' :i)·2Å$á› J˜PnN¡$wžßD)R\–æÁ_våWÕtKåL\ŽRí_Äq?Jõ:Ê¡s†ãÑp>—Œ7‰cŸ¥¢¼p4J³Ô8š,1®‚cÃoõ6°çÀzãÌË÷ר@Ž.yò²º·k8ÒÚV|ô{Oôèy;e&WG)&¢ØÖíéÝ꾩S!ºº;}yBw¢eœRÖ¢·öçµ êvÕ¶¦8õ ûô°Ïäot¢l>=´ÜÁÑ&öU)ú® +œ˜á7ÔÇ7§Z8š‡QÏq}ÌŠÅÌÝÀ¶g€ªß Å»ðjSè÷t`XþÅÃµÅø3¶î‰þ?¦ã-GÍÔ$œš)¦Èħx¦\E%·ŠzIüãpn¬ß#y0]áñ!õPÖΔò*õ@ ql\Àr™ùæ HkÖÖ|tÄÞ‹"NEÇW=å´ª§ÝÿE(ä endstream endobj 6540 0 obj 3170 endobj 6544 0 obj [439 /XYZ 40.7999999 231.379999 0] endobj 6545 0 obj [439 /XYZ 40.7999999 231.379999 0] endobj 6543 0 obj << /Type /Page /Parent 2 0 R /Contents 6546 0 R /Resources 6548 0 R /Annots 6549 0 R /MediaBox [0 0 595 842] >> endobj 6548 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6549 0 obj [ ] endobj 6546 0 obj << /Length 6547 0 R /Filter /FlateDecode >> stream xœí]ÝÛ¸÷_áç爢$ (pÙM ô¡@}(úPäz-Í¡é=ô߯lÉZ/©?†CZö:²Ó¢†ÃáÌp>ßýñóß÷ÿümÿîéóö_çŸOŸwÍ¡1ÍôgüûÃå²?(9ýÚõíAÇ?û¯ßvß÷ßwŸvŸÆ¿ï„9=8ÿϯ˜&üí믻wÓËwÓ'ŸŸþ<þö¿½Üÿiüß/û¿þmüñÓ<ßñ ßvý`Ž¿ü{úEH!ûñ?—¿ÿµûËïö¿Ž ô§yÿþÐ*©Å ³àø¾<*N/E/köÆ´­Ô{!äg;¢ã¿ÿØý<ζ€q赪“­Œîš¶ïåø{§æ?QoêäéUm¿:³ïÜ÷8Ë›IäNdưLt„Hd­L4ºóÎ妅·2wéËT¹õ]Ã3Ñ"‘·´ónà©X·c4×v,SeNd„ny¶ãÓv੃¢;nC4ÿ›–)•<-SI•‹±óTÙ¨o[¦=hì&@ôy®†QóáôA;jù½xµNÏ$½ØÑ3½ƒÆþô9ŒBcÆ{kðYŒOwY èøg( âÕƒ¸mø=¦ìEü†JÉÄ9x—ðy°'‘?NçPZmŽÀE­'”ø2²­<&$ôÈfÖùP×N|hgH?Î|¨uÐ«àˆ„#Ohd&Ó• gÃÏ̧nmÄ@Øàˆ€P«Îö;ͱq ðþÀÙ0Þ0Ô”]P;x¶ZP7ÏjŒk ÆN­‘ Ï4ét­gγ ˜zßW¢Ì)\Ìó ~„Mbà÷àýá…¾Ç5–2²žÔ3b¡e¼:)#xÄ#+Id Ö×`ØnSºâ•nZ¼ŠÔk·{ê1’t|~(°Q´¹{“ï˜ïÀõàÙ6ÃùänÀäeŒ>3§úC?4¯M^3˜¢=_ò_F¦c¾vqŸÐ¾vÅvLŽy[8¬ Ø’cÛÓÏ3­:aâbÖÖ¬$Ë^iá{ì…:f*¼œ|:†÷Y…œ²x’ç EˆÁµÞR¬©„gfíôâÅ}®Ý Ûé2 ¯#1&à y<ÅžìàÈ¡Ûø“D1³z0W!ÞÛ»õT\dt-30ÿwðRçäylÙ6E¦Xâñ¦²W¦ULLp6’?!ž©kµNÅQ8 “åÄá‡+௩"áYì­ ñTkZB Y²ª67^‚ÃÍÙ%Âѹwß,g*ÜD†°óý¦Êà)ò.$£®í|g9Ïeôõ„˜úì8\c÷g£s.ðÈ-)»Ê‹© ä—õ”¨A[¼R@S•ÇíÇjâó¼†㪼᫷åM‚qïXs¦èÔŽÆe¿¯fJ×Ê0]PÌ«ØugÔ\ÍYˆqMpÞ(6•/‚Æ:„‡äÆ ÝyY°‹RâðLˬn&{Â&!v4aäÞ\S äAWus6,o…VžHÈð¸2 I5yRß oŽ' ,u*¹¤œç>9O/»ÎsqÝ~Rí‡æ¬T”1%Q²&xÍt9f™‡ébzp<«.ÈxûžkhÈÈÿ‰ÈÚ°w‚”ÆqZa ‹n-‚Ãf=·Hú=¶ wTƒ²Ö¶“mI‘ Œ½è }›Å6u?Î!À¢,áš™j9y†q7B’¹LVmÊN  ª2 q€Å툃Ø8’L=( 8½\°øèÕv<u‚”°”2Ñ6=%D HÚi¡Ø¿ wwõ3Öóçjªœs~žh¦k½EÐl)²á+E¹‘.‹Îû®ÐíI¯&D±¸w•„Ö„(«R×RxÜf < €Õ‚u/¿a¢p°X9T ã —½âöZ[\Ôã¦ds7#žÞeAS^Žô¦³åH†K¾Î¦ ñ›6_­ "p`Ó¢44 KJ8ˆXú„M¾wS)¢Y]ÃBÛVV Y?ïëv¼#ølv¶œ–­œ Eè'ÉÙ.é^*eþfÏñÝùYÊ OÙ÷®®©ñ¨¦³ ÉIz¹Ž:¢TK³6ß·ÀMM¨DÉÚdí ðà~,Ùk…71’Ô?J„*/«NÈçΑIñÉý îÂ7h²&Z2yVu–Hb¤/ç¬)çQ¥ñö©çO¹=ßK I?AýpÄ%K/^‡)¢Cêi_B1§à„G¹ ÜŒ)êGåŸÍè„)ÇTä̞9b¼6uRFXŒ‹Âè)9*oņP©e‚qÊ»“nÅÙŠÔ1FðJèÛ-¶ê½ÓsÂAÎr$Hˆ:å,ó˜’’€å,ˆz.Y‘Iô¶zL°¿çä.²Ô÷†¯Sö¡Ma†,aÿ¬WÌí¤Ö&2Çò€bÙÃJ‹±‘®ý—¿ÃJ!©¤YB¹š„›qFpÌ›¢9LŽvGw0uÚŸË‘§ùá(=É{ÝÊ(TÑ>· tx†cXRRe‰Šý_Opp%®-Á˜*案ëËÄŒt‡;-éÉšPgÏJèÒæ1Ä ²ºM\ÉJ®Ÿg4¶³VýòÕkæBR+qÀ$#ô½ð_`tÅ+¥ eÂ]%£Jc¢¢-CíËÏ›Ï*«’ßõæ5u'•YÀŰÖSè„PbCÀ’D¸lO¡Bá­š¥<ú¦ c‘PZÊSîˆâ€ç-߇1O(ƒ‹h‘fƒÏÔ,ÿÑË¥\¼¼æ¡Ûm׼݇„\ðÛñïþûÈXG¦yüÂüãë7§uYtó¢?y™´÷ÑpžšÙ‹q«uŠ„™ŠÿíU³4Ÿ³®ÌÁ¬GÛú0aæbd:V²;të9{ÝÊÈäüTê ‡Õž&m{0“3õe¤ƒïéá3|fÚêNd£^UÄ› tm¶é^~ò ¿;G¯¬ð#zfv4¯´ŽÙŸö̼c)kŸa;€ ª;þ.Û¥™£g·)t€Ÿt0ì5Ї{‹ñ7¬Œˆé³az˜UÒJÅG¸RL‘Ïèœâ•zpý#‚`¾TGQ/éü8'7ã DÍïá<˜®ðüz({ç ry •z †8žKŸ¬ðeq­žÁú¾1qÌ5xÍŠdx¤¹¨Èü‰S#ØÚý¨§£ endstream endobj 6547 0 obj 4478 endobj 6551 0 obj [440 /XYZ 40.7999999 127.699999 0] endobj 6552 0 obj [440 /XYZ 40.7999999 127.699999 0] endobj 6550 0 obj << /Type /Page /Parent 2 0 R /Contents 6553 0 R /Resources 6555 0 R /Annots 6556 0 R /MediaBox [0 0 595 842] >> endobj 6555 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6556 0 obj [ ] endobj 6553 0 obj << /Length 6554 0 R /Filter /FlateDecode >> stream xœí]Ko#7¾ëWè¼Àô4ßl = ìac ìa±‡`’ì"Ø ÖÉ![ênI&õ±›Å‡Z²l`ì1Å"«X,Ö“üø×/?nÿýÇöã§/ÿÛ~~ú²i›V·Ã×v÷ýáôÜ6‚¿«Þí¾¶_¿m^·¯›çÍsÿïë†é}ÇñGß8 1üãëo›Ãà›á/_>ý½ÿíÏ-ßþ­ÿ߯Ûþ«ÿñÓo÷oÛéÝ/ÿ~aœqÛÿçô·]ã6ÿøËö·~ vw÷ï%„îçœ4×CW¶ÿ>íŠk·Z›VöSdý˜êÉñûÏ›_zh‡i4dÌhiÚÅP ïÁjÛÙmgô–3ëõp[Š%2Œ©,€ö3bi¨±Vš0¨ÆJÁ„áJî–a·ÊZÞÿnÄøƒºÖ{Ô;•LÄRòjð~—äYV½’‚Ù¸u!Gjum*šP©€”ȳ ö3bi¨M”ǠȤ×Êdbù R2ÁŒbyíf”‡å!$2ÝmË3Ñ}‚”L®þDΨŸQºCHTºÛƳGÒ¤¢y• ˆ™L€v3bi¨”€"“žs–‹ôP©€D— ÐnF™HA‘I/­ôLÍS@%SÌÈ<ì~F, µ‰ô¨ç,6?Ú ¯Ž/›Ÿ™vgr½üÒÏdo· ?^ztÕöÃÎéuÝ—Ÿ¶ßµ-3ßo_~Ýtê„Qƒ¡7´´¨…á!´Ï¨…Á>L¾›–ÇxêðҚǯiû ζð§ø>íñ˜b|„¸JŠB>à„݈÷œ`°e˜ÁÓK/ŠË#¦Q-ŠpM°äZÁ~^sËšwF^Yùí.k*ʼr˜G¯R+Á<šOÞv@ØÊv/l™Ô.ÒF+Í•¿ðÖå8Ó´`é†3{–KÏõxQÇf¢Á-{3Öº3ñ¦&à0Ie#‡†“[ôìxa-†)ð„Ž Æ/fý¼zXxK@XræÑu96þšDsn¡0ûr®|“ò‹¿:„ýàÉÁŸÞš– O-‡  ãÍq8¥Ÿ¦oø¨ml×ê¥D iàâG°û–<_´u˜À‚xd‡ØèâáƒåÈX£úÉôŸ^@ùTÏÎa]7ÍjØ hP èOXï„}Z¨½´P¿m¡NLѬZ<7Œ)EÇǺÖ£W¬ãcËD@º‰®ÞÎØÝgù[qØ€ý ÷=Ú3+æå€ãsqo#Eâö&Áb–S…÷œ†&ðnÌë¥Â+‡û` aµ'2ŸÀþÁ»„"C 4ÊI9+aëœÂÜeôíÊèJ^Z’Œ¦HbLkèÕäpµg5¸ò’ø:[燀}ZèÝÆÒ% ; ZÉý4ªsÍø×yÇÞ²Ä9ÿô?ÜO¸öPÐ×í\Åžý¿ýÀû‹Ü¡ž#˺}ñºy~í÷y„¯-fíçÃ/¥¸PSB 1“K»»¢óì3F&aŽù'b£zÎ[ÌÀ^ßáœam£ {ãçÓiÒ2'¤‰[*xÆ'+åx4@ùHæÉI€ÆrQ*`ÑǨà*A èÔ¬uP»ïiŠà{?ÔÂù xJÞñ'—k$Þ¥àh£Ÿ|ôÁEËÃsèr&,x?¡«ƒB¸òƒ) +˜¸8–Œé2¯zG,Lµ`m•MÈI!Émˆ¥¤4*lSy3’ôeŒ7v ûòû?¿•:dqÈ7à„‚-814àÇ©œôdÒ’Ê'ãçµÏ¢cº+ê‹Ìë'k2¨ïËÁbfV ‘ãn;ã LpÐà W2d$Ô9N:X±¬ñ !#‚©8á?ÂÍXÄ› 0å0†!nhJ”¢}Š‘uFT¼‡;ØÆD§¨¬J>Á‚`ß -øÕDÐ(ExQ(¤Hkz”i¹E0 —«÷•½¢5Kè­8DIj$ð¼È|º_å˵4œ@9%%¿—£áWø(%yõ2«RŠIº®R"ðX C(Ì­Å/¸ØšÃаÙÒú:œt|ñöòÚdÇ'Ç]–aÙ˜D–ÐMÖAÞä™”~â{qÄΧ)]ut-"%ãRM1åX³~Ù25A5nÅ4Ž–#Y”Øsì’q¹pÆróãuÕaÏ{p³tp3&'(kNt–Ô#¸²1ù)íÏc!ÝÊþ¾˜r'¼©ðÙKÉÿ\¾æyB/‚d;æ —*òEWIì ãÕ¹Ehä”͘Wª&$¶ÇœlÑza»Vª„½•ÇD»›YµÞ„)¢1V)hæÌå×"W•,Ê“ÖÝqåÇTÜ3XöÎRh|9uwD!GWÔÂw¿xDƒÚ‰OÎË >"™·j2o~%sê^bº‚4ÝÎΫçy‹ot-oLùºß$WXÈ%¹¡³,ÁrÓ|µ(©¶N‚´Ï ·Üdödν­XÓ•#uN„{Êu…à¿m…xË÷”ëK§öØVñÙù\ííÔ¶5Óó5ÒMæçÃÚë~¥‡áõÂéš;€ñ”WzjÉ„@ò`Mþ•¦â~ t–·ì-Ù®5R‘ÅV¹§Ü×J¹Ïq½T„5?u^žêÊ›Iä·ü®|ùòÌ'&n!$ÿ×J䯥5Ê)ðK0ëN½·Ü¤¼ó~Rïäe¼ö”4úuèa¼s^Ý©2ª\±õ‚×UQÞµ[³\¥”Üš\Åo^Ü– àCyù ð¬ýl2¥Üžd-W’ŵÏ[¦™—_*ž B;eýFí‡ìÎf¬ì_V°ò˜9y`ƒvø:·LÎm£œ–#ƒDôÁãt¨Ï¨–0јÁºq„µuüq gѶ‘܇Mf2×ÎýãŒ#|Æ(i„ÚÀ-#‹ž›A-çŽÔ“ 7>xÒ“Ptwe%å¢öE)Ë”üŠã¤°gèÆ£ØóŠ.¸KËíâûg(EkEÉs‰HŽ4ष ³dF@ÍqÕfDEÄmylKÊý!­õDð߆SxÁíÔð€KrFcQÝ‘ìPærh,I"=X]Fó啎šþxÅ&Å?ÆÑaK [_¢ÄÐð¬³^TÓöWÂyt5ÊwKyS1À'O€õßÛ×õ­ÝÆ_¿há±=ñ9HÆ`×yKXoYÆò‹Žéf°©D{0q VëFŸ×Ï:ÙxRgX6nãJÆhæLË Ã„hx§Ï4J5z/®t;7Ž…}:Øg¯†7¼ÝÃ[ ´Azžþå~vTäÏ`øõµ‰s- á1 ã¸>ãŠÅà~úz@×í~çG1Xm à>F×è9އk‹é7j gZØS<4Ì£v…)û 1Åùˆö)Æ4@ëÐ Æ;¡q/iÿx;7a,‚<˜¯0|È=”µ Ì Jy —f i<ºHÎÈevbù%H k[ݰ}óV1(<-o´‚ŒÁöyó$Mfà endstream endobj 6554 0 obj 3343 endobj 6558 0 obj [441 /XYZ 40.7999999 376.339999 0] endobj 6559 0 obj [441 /XYZ 40.7999999 172.819999 0] endobj 6560 0 obj [441 /XYZ 40.7999999 376.339999 0] endobj 6561 0 obj [441 /XYZ 40.7999999 172.819999 0] endobj 6557 0 obj << /Type /Page /Parent 2 0 R /Contents 6562 0 R /Resources 6564 0 R /Annots 6565 0 R /MediaBox [0 0 595 842] >> endobj 6564 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6565 0 obj [ ] endobj 6562 0 obj << /Length 6563 0 R /Filter /FlateDecode >> stream xœí]Mo丽÷¯Ð9ÀhDŠŸ@°ÀÎØCc ääÌî&Xdqö¿µEµÛ¢%)¶4– Œ=f“,«ŠÅªGò㟾ü£úçïÕÇÏ_þS}u??95u£šþ«:¸þ7uËû_µ‘5·ç¯êë·Ósõ|z<=vÿ>Ÿ˜z©è~t…C}ƒ¿ýíô±ïüÔÿåËç¿t¿ý¯âÕŸ»ÿýZýíïÝŸ\{ç|;«Î¿ü»ÿ…qÆM÷ŸëßÎ…ÿ:ýõÕo æ¥Ýó¿d+Œ&‰ŽçKUöò}]uÖTJ)UÅïè”;þûóé—®µ µŒi%t³¸UÍÏÍvÿ­¬VWÜkÔÛ²¦XjCZÈ< )biCcÐá¦È¬×Võ¬ïÄ.•c®©TŽÙ†·™æÐžIÚÀzÜTmDËZÍ¥8OÃy ¤1¼û]·î+fèÚiB×k*uM°…Ì4¯úE|S†æ¦#ÐU¬0Nêtò@/M¥6¤d¦†Î±´¡ ¬ÇM‘Y¯›^Te²Ð-%3L«LB¦ˆ%l`œ}³núŸ~ªþØ4LüP=ýz²µ´­–½ã;W" *i,,Áu8*i[Xik{ îŸ:¾¯ÎEc¸(åÁß0Ucø‹yż"Qûa Ö¹‡%ŸQ ÇRÁâçžÒ…jÌ7® ògóúnãòÏu‚ôµXÊ?tÎIf ¤è ”1Ší;ä3ò/Ô¾åÏ=aN0Õx¤¸ŸCþw ÿJ&Èÿ¦çñGÂlly1¶¶I2bßžôC¼¼hƒÒ‡©xÒçQ7mÂ~/ Ý¸œ{l_6½&c[½È¬ò­U©}?ÉbC ܆…Óœ½âU==#šž­ÞN“uÓS3fµÏ—>yÅ{¨Š×Æz‹ÆX-E×½ôt^Ö-7Œ_À`ÌŽúóþ€iuö8Dëýèüa®Š3¾¦6¶QoùëŒüÄÀ©™`–hÇ{”ôÂ.jÑ›6ŸK¤uÌNgó&À%^#q‘°‘ñøœ Í4kÆu=îµ{p Ä{Réõ×ÛQUsfff +V¶aŒœÐ|€XÌÇåÚ-îË™xÇpûíʼ%xÙÅF`£„]bèâ)'cbH9ÜÞU-V‚iÃ2FØQB4[–ØÛ[¡ýºëFéyÙ°ÅÞrÚëÌ>’;Õ3È·†lßUè½3PïÎØ€}ÚeÂø°O‡}*mŸl3¤ûTÐ>í2¡اÃ>·O\lfNJÅê6`Ÿ Á*ÞE9$NŸE[š#7/Ù€>oörX¡=Ç_­ºÀ%ŽýáÏaª)–÷£Ï‡WA·B†V¨¼: ;\ÓÃCÛÈaþÍã1ÐŽzˆ´R@; êÊÎ;Plæ=ÞæbLWŒá€× &Ï#y‹‡ã¡-}5À³^Š‰Æ˜QŠ$ÍÏ,ëMãÃx–ôçñ$ÂV@Z b-k\ Ç~Áx*°Çþ+ŽÏâlö:»¢‚^ªe|ÀpHi` ØÓ xô»œ­ÓFØ»È×U¤\Èw'cØ‹íñB±ƒ”8‰€.‘5ƆûÙˆn*qèæ¡›;ÑM·õ‹Žòü`ØÚæõÙ´³Rqèó¡ÏÛÐçÀÌaI¤ä€±>§ÏE´–7|v ‡Öf×Ú g+HºYRb9»—¸‘ÇQftòrÚ™¾×)C©6›ÑÕ#r¶ ›½OœK!ÜZª±º¯'ñlÃù xg÷TÜ^2'ÙlßLν•ìí@§.TÁùÁ””7N{Fd€³\Ñ*ÎóšñøðGS0½ÑfM­4{3ŠvXò&ßâp‰ß¼ÇµñMG‚Çó†!Ø ï•5”Ëæo—³bÈ¢çcZ³^¼å7æU‰@Sn ä+û4­ÕkZw®Fæõ|ab oÉ|@ü‚gH;`JY`J»‹K(H´UpQ”Köà°òä¬WÌÅ`¸ðêU‡0 ~·\½·{cŒå¡Ü&áëFÌ9¨»âba-1‹(Áˆ=ÅPíÉkˆŒå+Nñ+>1ûþR“-¼<·ùUvžëØh-»ç¤`ÿ)æ¢\¬FÀ¯|ýÞÓV…Ùñnvõ80ù½uáfªðv)]„AgÛŠ:ɵ)%‰AK”²ñö—lð00Û ‚÷ègyŒjA$ŠBZ û=,.Ç‚_6ý×xðS%È´•pF¨c`‹ê8‹ÅÚZ’Ún»í`?AKJp?NxL-ÆÉs6¸Ë|¬ÚŒ£ñ8ÇO×íØãÄ%V7E®ƒù†ikîôù*¹G%~˜Ó±¶gõÕ,|B¸#åSý@8“1Ñž¹–úÁ­µo-”Ìë‡B¾—PÃ)®˜5*"Ô\èÕ»B%ìoá….†}¸‘ˆ„üò\c?!´³ö ;˜yï{‰{Ï…Ç©ÓÒÌå;À«³æBcÙh¥ ø÷˵Ä7 ³¹èùw†´|kü½ÞJãÈr⊜ÞìrÇ>£„ÏÍàsZ”“Ýø¬„­á3ƒ°$ÐO¶=ìηý? ¾ùr®¤ ¥—+.K<ñ½€Ëw ³ ËlÖW67yá:øŒ~‡ð&)>÷ˆgî}YÅØN¬€j›‚V`& Ìåb¦ån÷‚“:ßÓí´E¤B·Cnèö7‰ì7>N8i¸Q°… ¼[Ží÷íïÊÖ–ÍÊyÌ^5+,÷{Rý5bl“|<¿·WÅÕ‘œyR}«4² ¦Q^WT¸’#¦¶™+ DËÄœ@ÄÄ¢“5‡&Ôhh{:ž”Ñð/wgKALPN DÀsæ×âPkŸ[(a¥bù àŠ/íxu›Ï@à$hL*)Gê1/⊒xóŒA©§WÖG6ãµàÈ['-ß$E0¢¿qݵ/b¹õ`o"]¬à±¢Pj}–ìÈ}}4Ϲ󉸙Àˆaßûê·þ²ÄܲôÊKŒ¤Éd <˜´KD:ë]3BÀÏX›uŸ¯ý2›Ð8–d1EÜ ÛÂ:·dCøp‹©Æj¼SWc5¦»ÖN|8ôj ƒ‘àwïÆ çß0ºTVŘËyˆûïÔò\B– št%„wÚ—råØ\Tëv׆-¸#ï™e¯¿ˆã*ÑÉ ¦#¶G)) Ê]R)W9y´Âq·ãè†pUd²}Š:“®L Ô¦yLIÞD5ûߘ«f—_Dâï º²fy¹~Å,ãÛµ7¾ðcÝT”iÆd‹‘œ™JyY‚õÈ÷² ¾Rtl[çS^ÂMåÄYÁèusšن÷ 8ïâ$‚Ì›*ù¸#½ƒÝå-CeÃ-“@ååÍ éá"üÄ †Ïcîà'òHÀr€ëðx¾àTYD`ýq:WFÓ/|í`¹‹Â6–D Dñp%á`V)ßL–´\—ÃíïÇrä>Šš÷(8Þ_aÚÞ…Ìl¹(O_ÃÙæø©Ý [¡@?Xª°çJ±×[Ž`ú™Ûs¼Xïî»zîÌtg‚Ïp?¾~ Ømßà7¯ÿ1hòƒUç±cªbÝ0¦Î”Y¦ê›Ó6Ãq~g*•ªÕtBÉŠºçÌUI/R\×zúbS=QÒ«|ÛÖÜŽ²¦./kÕ¤_K4ìÇÀ:ÖéU^óš7/P¤±¸OµÖ‹®ô„lê³.91ÂTǵ©†Æá²qu܌ŌÝÑö¢ RwþK¦çg›"¸”§ØSçóÏP&J&/ª5,nÁŠ©» tj¤X"ïžâ‘xý#¢€‹±faé%é§¹ :°¨ý€åÁr…Û‡ÒC™»mÐÊS¤4@5䱃ýLØev•¦M°@Æ4ªfgâ[SÄ ñ”\åMszÕãéÿžªL endstream endobj 6563 0 obj 3331 endobj 6567 0 obj [442 /XYZ 40.7999999 608.659999 0] endobj 6568 0 obj [442 /XYZ 40.7999999 427.219999 0] endobj 6569 0 obj [442 /XYZ 40.7999999 608.659999 0] endobj 6570 0 obj [442 /XYZ 40.7999999 427.219999 0] endobj 6566 0 obj << /Type /Page /Parent 2 0 R /Contents 6571 0 R /Resources 6573 0 R /Annots 6574 0 R /MediaBox [0 0 595 842] >> endobj 6573 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6574 0 obj [ ] endobj 6571 0 obj << /Length 6572 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èóÛß$ÏØr`Ø@A7›Å"^ÄÙCþ~¤ÖcZ$‹‹I=mž±(ñù±^¬*¾ûÓçœÿõûùÝóçÿœ¿?Ÿ?ŸšK#›þϹûûãíª/Œö¿*-.ÔtÎ_¿¾Ÿ¿Ÿ>>µÿ~?yýpøÑŽMôþþõ·Ó»¾ñSÿäóó_Úßþw¦ç?·ÿûõü·¿·?~êë^øvÒFv¿ü»ÿ…PBuûŸÛߺÂ_Nýáü[Û}­·û÷GÁd#”LêÇ÷éSrý{û)ÔXs–ªi=BÛ~Šv:þûÏÓÏmmS7.†¢$WÍêZÛú¤4¦QgÓ> F;•:c[WI«H5´á9*ê{DÒ†F®ÂU]4g„)*x· Ý­iû»bߘ¡ ѽý*uǪR+b:׺¶="iCë—#TUÖå0„ôC'‚%À_B8XÒ€µ1Dß^â{ÀÞ_K>|iW±ôšF,ŽŽ¾{*ë®}¼âŒ´ìl#ðÚÁXgž¢ø…ÛA”0óp¯á9 `;ðŒÂí Ö§VI#âKíÀ߀;0°›`ÀÔ Þé+`\gE/yŽGïз:´†³­YAkà¾ÁµååZ0þ·§\Z³oZ£·*­‘4cð\*©3:MÆ]âjØúc€ÎðæÚÊF¡šõ  ä"¸Ômw^'§¹~ÝCOЫ¼§‹üõÛgûA¿gù…÷CvÖ@ÃßRÒ¿qѦ‘T¸Òšº4€¾#.Œj2ûfÀº§'+FÁ¡o©3 ¸kv­¤¡cµk*‰è‰½ŽÄ~0-y¡D/õ1ã1S¿Ê%pmðˆá°6wB#Ƶ~î©gØYbäpIÄ~‡;Í?Ô£¨TëEI*ÀAà>°|ó%„å%`ÇÁÈÙ¸Êòš°Fz®¸o•t ŒFë%¯ÔÁ ,®°=!SSÐŽso»…XUl`z ë•,Õ0þw‚r.ÞÆjRÀèÛ3]FP;ÎN€îþKþØw»3`»Òžwl/¢ å‘“-÷Ù‚µ‡“IQM)½Ö{1ZízcÆ¢Б1–‹õ G{®d<â/ÃL víûÍ«°Ù¬cý¯%OàTôÛßg pìƒI±¹HEf¯¢[aÃlŸ€§ËY/°zg½àqc/-Œ °EÔ°PFÔ±ó×[‹³ _±ðB½wºä )›gM+xOhî+OjÞ©–A5ý»»¾’‘[(a•P‚øæ üÆ@ߌçm‘y{­ŽäçúÜðô…tÁa|%êÛy(‰OTr¾Û©& ˜Qâä(û®»U«1¼!²¢×ó=˜¬`8Çâ>tûúäß©7o|X|ãÙž+gœéÝŠ‰XZ³ž¥9çµ-È»ãBœ™ ÊJh1ü0B¾ÀœFìîÚžG“0,ÖKr1èô"5”vˆÌFÞÑ1ßðpÉP}AÞ!ZYbÎ<Ü™s$]Ìá<† Dˆ °^°xöèš³]—σtÐàÊû8°RÜ=v§RçA2lOI ‡²fŒ±ã¸Z$|ò/lÄZlµŽ0a(BÍ\cMß ½èAŸ Ux ZA>`„­D¸3—C¨ðR Ìe2ìHè‹à%tQ /ábÏ\ÁØùåFA(8¡‹’O`º"ä·"€†N´bjŠe5#@±×‹GôÅÆX6kÔÆøè2¹¾f<¬`G®së%£á쪶°í[ƯíÌ0B8Ün/‡ýžØ$Ó8Ó®TjÇERÄ #ŽP–©?µÍw+& ˆØZËݽ¼´Ø1Ì©ûæªÎ­òš8sâf¤‘¦Ëß ”èÌûçoÓÿåEë.ïL÷C¢û§í9žŒO¾ž¤¸b¨Ödz‹Ïjá·m´ïÿçÝggûkæ´Áºo¬ž´o™Y-fÞÆ/§÷?‚¸¼>4gYä©PeØU†ûPe¤½âíUÝ[|V ¿mcB•¡>Tâ´A\Tuo™Y-fÞFT}hT½,”¤£Jvrè ªdK]TI­ïžØ¨º¾ÅgµðÛ6FTÉV(uQ%c·Ñ>±Qu}ËÌj1ó6Ê£JyhTå¢H’š9vXããöº¶OìtoñY-ü¶ ;Tû°C•ÝFûÄÁN÷–™ÕbæmTÀ;ô)I>ºÃÕ;\û°Óª­ÖºŠÆÅŽ˜Ð2ÖÂoÛ˜°Ã¥;\Øm´Oìto™Y-fÞFìzdì ~°°#çòµ”>ùZJ[¾îž8Ø‘£|=ÕÂoÛ˜°#}òµ”¶|Ý=q°#GùzªÅÌÛ¨€ulùú)vô\Š–Ú'EKmKÑÝ;z”¢§Zømv´OŠ–Ú–¢»'vô(EOµ˜y°£-E‹Ñ3ßÑ͆’tT©f.E«Æ'E«Æ–¢»'6ª®oñY-ü¶UªñJÑÆ‘¢GŠ6#ަZ̼ò¨j{qhT±¼e@™Ë׊úäkEmùº{â ŠŽòõT ¿mcBñÉ׊Øòu÷ÄFÕõ-3«ÅÌÛ¨€*zhùšë\ØasùZ1Ÿ|­¸-_wOìð -ìV¾Û˜°Ã|òµb¶|Ý=q°ÃFùzªÅÌÛ¨€~lùÚäÂŽ˜Ë×Jøäk%lùº{â`GŒòõT ¿mcÂŽðÉ×JØòu÷ÄÁŽåë©3o£vä¡åkÁsaGÍåk¥|òµR¶|Ý=q°£Fùzª…ß¶1aGùäk¥lùº{â`GòõT‹™·Q;êÐòuwØ ¸3–n¼¸q$pã‘ÀÍ$›™n, Üø$p¥m ¼{âàNOH33 ÜT”ÀÍ¡%ðeŸ”&[Æ©…ˆ9=åÌÛ>bŽÀs,c醈9u1tîFˆdë§Ýe÷•Ñ ‹Ú¾]È<3à‹P¾Ùcö°oðxÀvàHC¸ 8¤Dˆª|ÛYšÑòN}ZÑùzbÕbe–E®uš ùôÀ±BO,uÌ’.q7„ðp˜ã߈™EâAWä…AÃ#ÞÅv„óYNŸS÷ Æ#œ4×AØA“=4Åa¼N”Óâ./IÊ¥°i9f-Â,OØR]ÏÉEp9a*NËøÕ—ŽTΙm`óXæJÁ{mAuª”W’A¤b‰¡¶Çõ/›uOke‘s§[ƒSèÁ©ààÔipb¹¥´{Eã¹ÍÞ–wŒCL¬,™ ò^Dˆš),c…ÌÏZA5¤À†Ý+X‘Ä >L±PË]äÕÌvoøxè gÈ ÜŽß\çÁ„3Þ‚= XgFäx7Õ#ÿ¨oǼŸîQ²ó’§øownÂ;Î틸¾ß±3ø¾J˜·;RVpM—ç‘sïè½a,ó +àx7þÁw¼‚#Eå÷Fd%ç U0B@TÁµí€då, ü&€x˜a$lÄjø†)$¼ÚÄô*@×÷ñ`h"¦¶|Æ„E.AÚŽèç÷6*­?aãiÄt£ãàG“Ö×5?”M“š”nqwv—”„£yί1YR+åx.2k(›P%,&lʱVĬEê$˜QN/EN±’ö!œ3 _É#ª’æê4˜ Â}Î"ºVº80â.r‡º®g’.U_^µý(ÊYORrèãðùeÛ®uýi‘>d³4 ‹‹ð6ÉëO”Ç0“Ã5¦qîvuæ±6ç.bÎ*šÙà˜:Ã}\Ÿº™R];©@IÛœO—d8ZXgsù8—…üuG.+ÌœBa=ü÷\µ÷~a™°‘+¼bBÕçLž€œ…S€ÕKpa>‚ã2öFÑ]c ØâŽ œaâ(.`×8/½Qˆ¡6hŠ(InÄþzdït>GRª2¹¶*y&ï0#ZçsôEé]Ά’#¥^´„XÔÕ•ù™oŽSüäRIÊÈs\MGÒ!âÓŰƒ¬·PY,ø”êH˸"ér]…§R‹\ÉÜM-¡a Î?¤˜ë»#v|·‰0PEœ4&œ¢DßÍ3"¯Uñ¤a£:©T<5] »—GxtÕ9F‰Ñ€ÊdŸ¿¯ëëwçðZÆ–Å÷3>ÃÜ>bí˜K>"¤$L o‚úw¯±pÃI‰¾moR7tpÑß”3î±J,æîÒÑy0—о¤¹´˜\yP¸žªR¨X½®b‘’ÖÒQr¤âÌbu‰ðÔÛœ«äŒ¾ÚšX–ttÕf‰UÜ =ιpÕ\‡À 3KŠÐ»ÞÚ_)YC–õª2óËq«¨`TŒÓ¬ñí@15“7Qm“o‚"\–ç w®zŽd÷ ‹žer ÷šÔ¼bBfBùx£ãrègJBÈDüx%˜TpàDÏ[÷€‚%Ã\—÷~a͘Ӕ÷ÛÇçÆñ JPýtx”4ö•”wÒ0ÄZ­ƒÄEUÜá YÎëQL*€,˜›tõ/«]ã q›[5WsÆÆû`1y"w{n\–ã“FZ“ȉŒÈHÌSƒ³äW4ÈàDs3{9øÞ­JY„Ri¯È„Ò’§,Ì&w+˜ø}è@ް}òur3‡÷DÜÞá ±‰+ãªó戣pU3Ö “8óeNu7»ÂóíXÖkçh*£íÄj—ô…"Žé¹$J¦¡¤Âf Ã{LPBïH±R¯§‡Iît‡ŠÆ]fš÷žâ‰Û"Œ9|‘â×*X ^³ÉV þ/{DáÓ‹b~9×<¤&‡ÑmË è‰a÷Çú19¢²Dؾ‰ &¥8"ßFL*~¨YU4ŒXãÝ>˜ecT¦"¹Ò6»ˆ§N‹n¤!s~°Ç@ÇpsÉ|ì²ë`RÉåjæpfMÉž½ëÉÄ“'bÓc‚½0Â$ÆAzѽÜ=(NÈûµâ¾wÌ”8ц}­ôÒ¿ˆ4ý!r ¦²?ðê15å•ås6’®UVЗ_/®ØŸ,T;­RÉ­´@y¸¹Å@?”ܽº‘!!~ _Êò"ÁD"!åtÄe¬Ç¬=쑚p=VŒ§œ˜¦6ŸM 7<°î^Ö¿ƒi1Þ›Ì@_ ß?p„…{¸ýtÅ…½£µéÒ|]I&^ç½®¡,ª$TA¨Êå.úöq°×¢8®ÇÐÂוO |à}–C¡ëêÊ÷ÁB3›Ëgña6c+ä0òùËž@n(”nC§¶LøE¡Ü×°u¤RHC­|x`δ0Íòry÷J{§Kk§>ä̦‚öµæý û½®ïbîrŠÈ|°ÌrXLk†@s~ h­£¸ößåëi'XÛƒ7? küˆÀúÇ*„Vá~ì.ƒÊÒ±Ÿay×ß/ŒH×IUÅ’P<.䡿¯ÐæŽ,߼ݴ†fƱ҃íˆù¾ÁÈ’pü\ä’BR •+ÜàK[²\º–õ:ÎÃXn¤°–hF%Ï͈²çã‘W ß¡¤ÍŒ¶sêÀÈh{¹:e¾‡µ£¨Ä™Çï,‡ùñÍ+&”jb–òPRާ¤gJJ³k%eû¼5‰cí‹æWØÈÖ亣`n¨ŠˆÙKx„ zVæíN"U J½^N<•1b ¤0sdõA ¨ VG1yóâê.¯¼Ú*ÍG`E³RU‡¬¿µKOw#Ї&xù\2G2‚ý_‚\8âg`,l¼eà¡ó4»ÖyÞ‚ÆAÇã •·‰ËÛ¿çïmåí·Ýûïß­¹Ýl^»ù)ØÑà§Ë·%È3i§Î«UÙ'28³†SÛ)/Òo2üÈ4T]”ÿ På)éycj¼†R!.²'U6Móµ£Áo øMoªUôB6»)gð×óÕÖïöÉ øî sxFøúfب¾c ìqß +3ö¡o× €ºî÷vw©åÕÆàþÄÁ ­ø®-<ƒ:ç)!âkƒñ04D”|G #òÚ§ðHsýõ€r{gÁèEígç&ìUõ(Œ+¸~=˜µ ô ¤ò”z Îñ  yè2¹aû HëF^Hw‡ÏœxÀ%ÍÍAü§œÁùÓéÿñ^‚¢ endstream endobj 6572 0 obj 5065 endobj 6576 0 obj [443 /XYZ 33.1199999 783.379999 0] endobj 6577 0 obj [443 /XYZ 32.1599999 785.299999 0] endobj 6575 0 obj << /Type /Page /Parent 2 0 R /Contents 6578 0 R /Resources 6580 0 R /Annots 6581 0 R /MediaBox [0 0 595 842] >> endobj 6580 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6581 0 obj [ ] endobj 6578 0 obj << /Length 6579 0 R /Filter /FlateDecode >> stream xœí]I¯Û6¾ûWè\ ÷( ômz(ðôPôP¤Цèkýû¥,ÉqD”HQ´äȈÓÎÆáÌpH½ýæÝOÕoÿVoïßý]½ïÞïßHMi_Uó÷æü fjÎÚÚÈšÙæU½ÿpx­^χg÷ïëªcÇîÍ5öC´ÿ}ÿ×ám;ø¡ýæÝýwîÓ«¾uÿû£úáG÷ös¯ùÁ‡ƒ±ªùðgû2ÊŒûÏù§¦ñ÷Ã÷_T9ÌnóïÉ5ÓDÌÂãõÔ•ÿλ¢ÁH¥4•ÆT”2‡§tìøç—ïÚ Ú¨î?OÉ4#)ÆÜHî æc¥Z M&#¯Ù¦Ö•Õª²Òƒéqp$:Ö4 #:‹2Çl„”Ìwãd™‡ï=¤Ùì²N}³j0ÊÃw)™ïV™–HÎgó«5£ÎÔæ‘ ÃˆÎ#­ç<UÁ©ë E#†FÎ2÷YóîCºìæºômZ,e³Á8É3¡ŽÑy¤uâ€J ŒÛ’iÉlŽõ æ’:Ó”j0¢óHëYA%³^1›ÇøŸ Íf˜£3 £,ÆCJæ»Ö2ß{H³ÙeT.:ŒòðBÊjù-#™dÑCšËBN¨È#‹£<²BzÎø°Ïk ãÝËáí“©˜¨^~uX#ÅöíÅaH«7gLyõòsõ¥ ÕWÕËÊšvô>~£N_0áýÄ~Bøñ ë¢RC™<†¬m %mg^sÁõy c¨…< J-º¶fØgˆeC¬1*ô¢âQzç1#Û…iÇà/på¾ý†ÔJådø-éød{>¶ƒGÅÀ9¯pð8"~”nºübx¡âÌ%Ïòy¨¥`r¿ôb"©¬&l ÖÖ O &z‚ÅòØaª )+½Z¬!Y¢C­6öèT„VŒ€g!|h[R¬@ ‹Ç\ŠN7@×]DÚ¨º¦'úMHO¾w°Å¢–ŽîK-B{L€[8OÀó€ÅÓÃ` Ç”bî”ÂúëMb õ 3— )ØâÆð\xЧ‡Cz0¥ü® u`vŸ[“I€ž¬6÷‘)¼Æ³6[ >A_„éG}XÚYë"CX·À÷¡¼ˆxÉÏ”“’‘²°uN™»Z‚¬ìвmtÍÇô`»²òµËh1cíJZ¡ ç+J8¯^âÕ&I+ ®6Æö%ÅV+Nyæ^ ´’*¼ Ä$*ñŠ‘’1Áq 4œð2‡­~\HÂc2ØÓms0£ §R¹ÌQCjb(!;“Ç ±ïöí&q <¾«R8M>G-=fåhÕÊ–n XrnéÀ®Q¸èèëØ5<vp ‚—ß5zÈ]Ï.*#áwÊÆâžï]C¾—9 {úqnO èÇ⹕—ú@ˬ}ÛœÏ×ç[YÎ72Ê{w| cžÑrKFah•RCÁÇ‚¼˜ÌDŽÜL ¦ƒTB8¯ææ9cÊ,½Ä§—oô²DYsP — æH7¯©3“yP$Ol ŒÝ'ëHœPÓo'2V',´)E%Hu\êƒq»zǰk™ SA×0ÂÇ% 7¦K¹†8©“2%Æ»†kØæfîÕãà Ž*è(·q@¶Û»D{W(,Y“?«·wj‚„7iï°ì7lït_t̲m›Œ„ÙÍ9ûŽÐ{ÑyÎtJõ>r:=8ñC券t»µT°° §ˆÔÃæ.”OiÛO6”özi9§ ¸åxMaìz³ykü†'àK,¸²p5´Vë=Ž£Å)õ¡ U­ö¦-®eº‰3³1§¨GkXw¯¢§ª­‘;Ÿ§kÙH^Ð:i!wcñ5ÀСnüŒgÊ™€Ne1<ž%H +¢¸<~üšÔðFW÷ŽNL_¶Rc¯êë´ðÆrÄzšcÓ_¢FKýEû V·²˜6rV‰ñ>¯óó(óbP࢘€ßÀL¤ÛÉFðö&Âs#1ê|—XgCI8Šã3pã¸õ¬¹W0Z“³~›²¬ê9Ôö@á|J1w®ËV² ïº"vLuüÇÄ)®ö…2ë^Nk?‹´ö’qÚØÞÏ"MËfÏ" 1á´Ù~i?‹´Œö6’W³ GiÒ jð×âCGÑÃñL_1¯·y'‡¶¦dɈ°«sÝ7¦}×?m“rŠl›3ý3º#lÖArÕºŸIÞï¸ k욱ޤﰎ`YüÎËýìóf­CÖÛ0‹V¤w³léFìñc¨þÞ‚—üÏšNyæN¨zÈã}ûkUbL 8bÏfFE]ÊU =Ëd›ÕH¼Hx”{˜¡ËÚïv(‹¸J¶® .øÅNNãô^oÍ©X÷•ÔL:®Y9’ùa0Ìœ¬Î*Ç’!ƒ&§Q ]/Í´\20ïRèZŶ-Y.²ð16äjJ–sÆÈ’Æ”ÐvónBÁÊC&ì'ìûÖû¾õ2ÚÇô8¦c-e0ëɬïît¹¿¼u+ÈY2P‰ß³‘¼[aþkÂóco>4ýÖ¼Y7#²NÞù&ï mƧüÞÚY³ÒGîËÖ8/i ™Z轌ú'ÌÊþté~3!)vS×6ÝÍÀ=‡«È¹YÍÆ%¼É›ºnñfBkOwB™”ºÃ‹ÑWx,óh¾€Oè­—9ž¡Ø÷RÁx1‹@ºhæ7Ó¦s–C†Ë>C/æÑÂXäøÜ[‚ÃÇá>D9µÄ}FƒŠ@<qC–Ú‹k?=p-µ\Ò¸+1°î›*6Ê¡1RŽX^V+G,Z)T,Ãúñëfr–jÝv>acg¦Ç{‚íÀt_.)õ˜ðD27D-¸fXb¶¼f¬ØR¯'k»ì5\ñ™ìñ­:¥ùp:?クWÏço;¨JÙöÁ-sшT‚7̤·û«^Š; n~н½ÿÐy²“å98]‚]Gç™Qud\~¹j¯’«ÜâÑ3 ](•ªÕåô€µ§ -Ù®õP6­ÍÑZZmä¼föâÍóRÖªÂÐB_ÇÀ>öiíŠf5#¼iúØr¡µºvþÍümw?ó ŸPŸÎœ_j¡ˆŽnöÆõé$C{‡ÛqÌкæ3“TK;A:{§P{±4˜„ã@}ÀÒÀ¸d‹5å1Xãè)ÅI3Óƒû`Üî³Ì=cˆª©¦Í%Ðç“©6ÚÒ­‡×Âêùð?Ü—vl endstream endobj 6579 0 obj 2717 endobj 6583 0 obj [444 /XYZ 33.1199999 223.699999 0] endobj 6584 0 obj [444 /XYZ 32.1599999 225.620000 0] endobj 6582 0 obj << /Type /Page /Parent 2 0 R /Contents 6585 0 R /Resources 6587 0 R /Annots 6588 0 R /MediaBox [0 0 595 842] >> endobj 6587 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6588 0 obj [ ] endobj 6585 0 obj << /Length 6586 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhÄ7vfì90Æ@‹‚Ùl‚Efgùû‘,ªÝõQb‘b«;²qiëÅb½H}üã׿Uÿø­úøùë¿«oîç篧¦nt3|Uý÷‡Ë_p[ >|4VÕ¼í¿ªoßO/ÕËééôÔýûrbúõA÷£§þöí×ÓÇaòÓ𛯟ÿÜ}úoÅ«?uÿû¥úñ¯ÝŸ¼þ¾Ÿl«ûÿ>0θíþsù©üçé/¿«~íP°¯pû?(a¥< —ó£ìõûòQ4YSi#X#+Æx‡§êØñŸ¿Ÿ~î Ñ¨[ɘÑÒ4«¡>‚m®ŒÓ#m$– È´™õ,K¢¬ƒ`‚È|ç‚ D ‘JæT* ¡E@=F,´‘óTm¥`Âp%{1ô"PÖòîsGÈð±dƒò*“Jû)™‰½NåÄzåM¡l„D^гL|!%³K“ g™ø!‘ù®»­.“ù9ƒJdt&…ï1Êd~0¨¬æÇ²\Ë`„”ÌD«3-ƒ£<ËB"/ƒ–9W£3l‰džA%’M÷Ÿ,Œï1bi¤œÇ r.ÙX‘É*½JÄ™Ê$×£}|dRØ>ò~þ¹Ã¤ÿ‹ÃçŽ\U}è£"aªçŸªßw1¼úCõüË©­U+Œâýa„4Â$i,|FÃü ƒ/ñ`¬#pä‡x „ ô3R¥ý‰0–Ä?ÀÊT`­Â<Àô`^CÜÐ0Öê–E¯K­`Œ5Iãñš{$HcW0Æ K¡çNÃrJ¯,qÃ#yí(¦c)Þ1°öb 4·k>ÇR]sf'Ï6ÓgšÆiS`Œ¢Ï éô0òæ…(6ƒ‚ÈZÞ&>7âIk:ŸSv®ç/ž— ›ãã–§ÛUg€ðÇE™xìĸ®f´¯%KP·u¬D3]¸ Ú-„–G6dhZ+¡ì„j_„ØÒLUë_„Ê`ãÀ¦*3]’n[\£T.F÷ë–[ƒ0fK·jÛ6K{ƒ/1H´Ûí fg1;ùP.XâZŽôã” .(e mEq*qâŒâŒãó1‹ô”‘°Ë&8Ó o…’ ¤¡„®9Ö¬cX“°£Ã(Ç"Ú'¾¬}ŽV–ðžÃÌݸZQôBšÿú¼¾Í> \Ê쯰œ-[«¥‘2˜ÊÒºx¤Ž›#uLõVo2u|oÖw UÑÊ÷BdjŒ*§l_•SZNRæHˆ±Åo Ḉ"û\úŽÓ90Œ_‘ØÌ˜ç»ÍäoLîçz¡9–õ »ë!O|NcðËk '•"r‰ùeÉYùäLÓt–¬Ç`Œ.Ï|*ç@J9ö Ð]¿Ï‰â8`zîmCð€àÝ@‚rîŒÛä rp‚SÁO€R¼‚)}‚XãqFè¦ h/ÔÌ·¸ñªaï§œóÙ¡1jßõ ˆxïÇÐàN=+átÕžKWø„êž±ÆrŸžë.Ó£²Ñã]Ÿ)éÑ;¬CIÆÆ—‚,Ê5·ì`mªª+d"Ôûx+ÊÊ[㘋ØUÇ] %¹x>’x›Gª!rUxÖÐIxýšÂ®zÖ:wQ]6bYÇ=Qy>Q8刱\cRRZ협<׬hJçàp©ßO9×Ïóiâà¸|Ôœ/ôˆü™í_/aÌ„¢ˆ´ÿÞÖŒMÅs§nÿ†úÀZ½¤”J$¥^s#K– J"ê‹÷t¤¼è'ÐZÁ’,µ_,œhú6}GŽgÅÖ¿&˯,—o ]8)7ÐFŸ©²x:뱟q¦ÔžñÊÃ-eªeKßmÉqôå(ê{Ç‘óÖÿc3<ÅIÐàˆSݤ¦Ÿ„óÞ”.®: dV¶KdmÅå¼5XÒV½'‘ñ)Ñ—¿hÓSq_þI;ùwÈ‹]üæÁ{ÈuË7µ–¯9À·‘G4âÒ.LÔb`ìÔš™ºµÓáV…óp=/þ'g$gàû$2ˆ _Öù–s#¡ Ìó¸õ6í¢'!ÎÕ¦Œ¡ÅÅÇð^ú@¢ÚiÀL„W&¦‘S¦²[8óFºÎgEð2z¯ù†ÉÙT%Wt®aOq¹³ÞñvÅ< ÝËUï—·z¿CJW3_©®æïí,Ð%Ëùd¥åi¯„\vþÅœåI•ÒtáW®]jž.ýõÝs”Þnß .ô¶Žõ|]PHŒ^Zo°¯¿ãÚç@ÄÎ@Énä ³îD#Ò‰)Çu wÙ-©Ü†û€UbêqÁ³.>ÇüÌèM6lRà‘q>æ˜ÇmOE)w(âÄ[Šî$8:›tãˆ5•]Dó>ŒJÊù¤h2+bÃŽá^–·EÄ»1Elùׯ@Êý¢\Aó¦NײoËš›®ðÛªKFx nßÖ§Â#Ê ïVÉQçˆòò2)Z¤\Yì…ŠžFiß¶:šã˜dŽ+šc6 „ÄÙbZeÍ9å,~k`·*SLTIJǫoc_b…±eƒ”ë-¸ð$+²Ïó]ñŠlÙ¼w´N¹Z޳^f‰[ÃíõE¸-ÐÄJ¹ Žð’r|íâ% qR Œ4°Zû)Z…eJ8Yǰä²Ê”¢×y°ü5WXHÙ.räúRôŸÂo/¦ ‘ ‰G G)W ‹ro”–‹bI³£œQ&\n»x$¨ ­Ià/I&…Ž©`h%‰¨FæoàâÇ«[5Ò•Å”ý_œZRö\¥¬|,/«´Wiã½» …Rç+t‹Y¨¬þ7>Tðq±³î4$_š`qôdÅíú¾QÀÿ¦¼1žp÷Iàü¬Qåz_޵ªÜGR¯‰(eQŽH#x³ËÕïÊÙD—ç(%èNÉhKY^xedŽêaæ‹ì í{öò%Æ­Ð:“8†/èÿëóÛ鯿fH›ue³±—N”¯‡½šÊýøö= [_)š7¥x ªEðÑåƒqºbs'-Óõk½³Í ¹ÃFZ×z¾ØÝÊzàŒg8¹©Í|ƒ­™B!jÞξ8F©ZUÆ·ç±ð™>38†×¼ŒûW]ÌAÌýåo¾À¿u3>¢g\ÀÜCt¸‚wÜ3Nb1´;Ü^@‚ÖõŸ¹bfYÚ=`=pôŒÆ»',(K×¼VJ.Q4»î×9hX›°n>@hD¦ÏÃÈ¢Ö6ºf}¿Ê{UdPá#¿O9w„êéô?¦UÆ endstream endobj 6586 0 obj 3247 endobj 6589 0 obj << /Type /Page /Parent 2 0 R /Contents 6590 0 R /Resources 6592 0 R /Annots 6593 0 R /MediaBox [0 0 595 842] >> endobj 6592 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6593 0 obj [ ] endobj 6590 0 obj << /Length 6591 0 R /Filter /FlateDecode >> stream xœí]KÛ6¾ûWè\ ߤ€¢@“l ôP`‘z(z(ÒŠ&è6‡þýJ–ììŠþ(qHÑ’£]`í5Í×pÞ3½üîÝ/ÕŸª—¯ßýS½^_¿;°šÖÿTÝï‹§WKÑ¿µN×¢é~ª÷Õãáþpßþ})ëxž±‚Â}eS+,/}Â%5+šMkKNfc.q‘$¡1Îó¬TG {¼y>i?xÕX»Ã-ׇõ j]V¹ÒÜ¡!à%–Ty×¶bjÚ®Öe]n…ÏóÿËܧ¨åÌ kPN”öeÖ  ç Ù¥|PNPìö†7 c͆²‚Õl–Ç*lAì×Va^Nð  JÀ€×‰àâÀûcñª¦zÆãÑ$˪ŸbMÏ”Sª´Ï?pöW÷“(s!‚<,%§°þ_Ê¢Âó¬Ýq¦tl!³eLðŠìE &aŽ ù² à˜ÈjåjH鸅Q Ü$Ö(ÖžG¤3·‰øÊãÈ“QXÚCüWXfôO4l=˜h!è?Û„//c*F÷ œä è±82F±™)Z1Ǻ/Åo@àŠ¯xQÎ#KÇWJzF»ÄÃÂô˜×3 ½»g4w o÷rî^Î ˆî^ÎÝË9-s]Z¢bˆ`,Çð¥Pí”–ÇUw%“˜ßÞ˜·;€½X¬ÜÓ«Ûe¬ÆvÜ=½»§÷8Úíyzu ¢ÕPSfÚ\±Ï4@M Ì,ÊyU4Ó[ˆç-âÏ]¯äµ7ûÙ}À»8…2šõàò*üÆš³Òñ¢¢»)>‰íél8Û€ (ÖoÀÄëÀà\íf„~J޽»]Õª_å“–^åqcÊÖ pÖK-=µ«±`4µànî £ssæë¹¥®¥püÙF9ÞBŒWÏ{8rqúîœ%)4¼ð lFðñðyŽ8Y¯oÄšñ4k…¨…h`â,KÂg,DeM†HçµV¦ÛXƒSû:W ˆ›¬Òy3¹-af:p&é€^R O"x¬†Í†þ Úfa&„-DÜM²Eo­c¦0ÎÀÉa¬¦ÈF›RrL“6¿‡^„˜ƒ„ÇÇ,Àgh˜œ½M@†CVóç |ÕC¤,‚ÏGóáyu©]Hد] ¬çRTÆ)ÅpAŽít3æØÒ£Wù`DÈ*}ÇÜÞg`ó¹C@>ã5S´ OÞxGPáçë.Mãy„¦ ¬å `Ár°ª$•9b^ ÑB|LjARo²`$Ö0‰Õ].$šö‰s>Iˆé BþP æ@‰kaß.%‡jq ‘Tgޤä…HñªhÇ¿pV%!k)‹@^&U+éÓ–IUÄg‡ãWøö%{’ë±ÇÖÖŸï%‹×¯ `ò“pî.ÆXqìúUC3ß& ÔÈÄúT`m„ÌÎç"`ÎÄ£­9+ãè:¢õ2©ZYQ™|®ºUrVu®†à„ý.P½›`Qìœ×ow¨s½†ùÈTK™•žë‡¬ ;£{†Î-­ÑϽÖ)®Á[ÖzÞÄùî9/*pb›¸åZʰŸEˆûfÕõ#Ì.ÕD¤i&X|VN<°±å©ÈÄÔ±i½eÉ\Ÿ†%ñ¡e3^v·CŠÛ!‡Ÿ 1,H’¢Q#šŒ`¢ËÔ[Étž5餿_é|õÚwXb$kŽy"/kªy ûƒyÒ™rÝm:å<«k‡â•!pîß%UuZAÙ¶S+qo7-Þ 7"×ãÃËxÎ)ê| +™ck¡‹s˜•¬?ý>†ƒPôTJDÂãžÆ<û³‹Àm²¬÷°²æÏS®ÀùhI—lãsR{ioÚª®Æ6b”Hǵ”Ø« Až-Ïd [Ý)kHи„­–üêtQ†¹ŒûÎ0# Ë¥Ý 3CÝ`î…‡“næôD(®°YÖ~^¸LÍ2·_¯”X°¤XhÜH.l)wa†§=›ÖSU ‡|÷¹.¡¦¦Á¡ßåprc!y×)v{syšvƒrƒµP"ˆ,5b´+ €†«‘ xKòÄ•¶ì¨Z¿A°¼qi˜F0^s˜7E‹VQR"- êfRvt Dp:i„FLŠ™…ï–KVRLrñ&–+.ÈO¤´#†²°ö\² ŠÑ§;Ú{”à]ãM>—|w M¹µ{‹U]LSúÙŒ_ƃiÈ[žò„²’w¹­LyZÒ^ՅƳ÷ª.“x©K?]h¯êäÒ{U—çÚ«º¬¾ª‹MªúWT&Ÿ«ñ•œÕë»í6ZslòI¬ëê.©VÛ-Úh.©ÖÔn£%@Þ¥XÇ%9sÃR¬ÉÝFc»¶ ^ŠÒOZÞm´ —Þm´ÝFÛ´Ö¨¯OQ™<®¸xªaŸKsôÇx)'ýP.®¾îùò›Ì—¿rт맵Îç1²H"p|á[ä[Ê*I¿á¿è£ÝH0l)‘=†6ç3# v-xt¡ò|v|zÈþX²<ŸÒcx¬“gÚ.¼‡õ{‹—¬¹ÐêóÏáQêÖ§aš?'«¸Ë ž>”áÙ¨:ÕŒz1wåæ?¤/ærABù‡ˆÒʤ«'­2K=† );ež¼L©áx7)ç£Ú ½7ÂØÃHB)ûaÌŽOÍ7!s^:™]îqI–oõˆçÇTÓÊ ® Y©xVDe–é[pÃÆ/Ü M)r4Ÿx(ú}ÄuU<Ôpv Ÿ.®vì´&9ûñ<ØE C8"`È…ã !Þœ'Ðq >¹’˜$Ι}¢^·¿Õc;|ÛµûúðòþC`>¡ìóBïƒK vÜ£3owé^LÃM}dÙ•<Ìk6¦6—Ī=¢ïÑHØÚ^~|ˆ½ÐÒË)kÑ\¼¬umz&2–—æq°OûôÆ‹µ`²kúÜò ŽÖ#ÿÓOÞÀïâûÂߢ>ƒp½ÔÂÑ>Ž×g8±˜½k;@Öuï…ævú´ xÀ x0Ô\¿€ñCd5|þð,….z.Q{jO^ cÆÍ;ƒöƒwŠç¢ð©è35ïªè?GE.Ðò$­ê>§D¨îÿõ“;> endstream endobj 6591 0 obj 2943 endobj 6595 0 obj [446 /XYZ 33.1199999 499.219999 0] endobj 6596 0 obj [446 /XYZ 40.7999999 423.379999 0] endobj 6597 0 obj [446 /XYZ 32.1599999 501.139999 0] endobj 6598 0 obj [446 /XYZ 40.7999999 423.379999 0] endobj 6599 0 obj << /Type /Annot /Subtype /Link /Rect [415.199999 660.500000 488.159999 668.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 6600 0 obj << /Type /Annot /Subtype /Link /Rect [295.199999 457.939999 326.879999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6594 0 obj << /Type /Page /Parent 2 0 R /Contents 6601 0 R /Resources 6603 0 R /Annots 6604 0 R /MediaBox [0 0 595 842] >> endobj 6603 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 6604 0 obj [ 6599 0 R 6600 0 R ] endobj 6601 0 obj << /Length 6602 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•Å·ü CÃrr¼Ù‹õ"NùûQ·Ô=m²?ŠU|H=;3€g‘ƒòI~‹ |óùðêƒÐj8‰ýÏ?M+9ëóÏÓvÍñ‡“<4Óÿ~<þ¾ï…þÃñóχ±3£rfV6Öžô>y‹žÈ×ô÷¨7ç'ï?O0¬;f@„óD~€P|ÇŒ œà1oઇ†ŸŠê]»•ÊÞåàãâc52›`@QÁ1xmðÉB=÷Æ`.`á¼SÈm"O Íã1ŠC— y—”¶5ïâàCR’êé«!i½à'˜K3dæÒø4 G?M’#ï!æ$Æ)æ\ xøÔBpöÃÁBÇ`żF 9Š6"“­Þâ­Óky+Ôâ"s¢g]4”AJŠ ˆ`®„% ž­‡²¡Š–L㥠ˆµj8&òžw JA,m%”ê롘à{"c°îŠŸ`ºÆúKCž­tÿrSN ór_N <#8~Ó±;¿ñ¢ˆ,ð¡ÆÞJs‹^s~¢;=¯òæÉ,Þÿ¹®tuïÉŒýô¼’,Â\fñ”é”Ä÷cæc(Dg´¦AO„6´ì†y[Áa³ÃÚbá¾88 )ÞL¢!20š¬?I€7[Òÿ„Àø >ê¿nÑikf À O–ŽOÑû¯Ác1HÞ#j\Ôý;O¨á饅ÄN€'žþ}:þà$ZùØ H샿á€n\Øb €Â‰‚s Ç·ÕY¸ñy8ç ‰™Û yy”BLxט“   g];Ÿ+Ñw։︼º¨a½0ßKüä…Ëï†Ë/Ö€‰¨ x7Q@2+¤N(dÃa”Á¢é¦oÌ[·lNŽc‘ÆE:zçë¸élƒ¢¤ó-³•â#µÿÀŠ&ZÆ¢Cdp¤»çž N„{'º9“éN3=Œf¼ýÃ/‡OÕ‚ -Ÿ–ð=-/'ËvF!9·48OçZ&Ì*«kI³’¤…¤Ëòë…›˜2G{ÆÌ¦œuæ.ÓW÷켘;7èån Z¨ ¦ŸhP")½9`’÷îH r§Çc,|‚ÇÀµÉ£`z¨¨øcñkúˆf´®}”„Ói„ÛaV¥I+»x½¦cŸX¿Í>“Bº¡d ¸Çê^Ê[Jr®´-2ßVSŠZéý:÷¢ô[%Vµšº®.#}à=€¯«"1™a\“#!rññà0Ì‚|uQR(Q¿o@o‹kõЇ!7R°ž ±Eœ¡0ô”ãÂÝ{Ø¥9!ãÏ1ˆÞ¨œPî²Aô‘A->ÇÀ{crÂÙ[†Û—àüxß¿ÞסË1'Lö%ðžII/÷/÷Q,¤UkÛû5”Uƒò û›1Ɇ%pŸàìïÅK$ø/⺎[K\FˆáÅØƒ EB2BçiœÐHŒH?púU JèéõW䋃=¾ÁrÀ s?™ªJˆL%dp.…Û˜³ôÑôp¼ìßeˆ„\à±b]o}Ë-«aÄ`ä†]0tPê»bb†“Ñ߃EHP·™lŸ6;½,ærá‚8Ã%>îÑ­ÏQd>tÅØÃ6þ¹yá­xŠcœÁ˜ðd ´Ýr§ ptȯխŠ÷pp°ìå8¹ËyŸ]¬šIàÀà¾úaÂóêoqÉ뽃ÍLáò•€‹ `[eHN´JvãÅÞÜRÉI²l¬Þç´"ûûÀçŠÊT U&Ä9AÚÕHûd™öÖñ™®Œ4{,ºCH …HŠ|C¹î ¢D$¬Р8´Šd.ð ‹‘îFuêdÖ¹Ö1©–”U™f‘‘EÂ)È^…òøëâö‹^ôkfõÕ‹?MXò—Yߥ…÷βeeéÃ5´æµ}&TJ¤d%.­à‰îݸ>¹ÉqñnΓJ7Ë/|/]à˜Äš×j£V)æql;å<ýÒS–S&¸°µöKh•Z¬n鄟 UÜ SLxéQ;¿5m'é0Ö)J¸w+¼qƒÏuwi…·½óOÂ3’ÄV§KâÆùS-l,/ÓBÎYuü ¹úCÖî#WKrKDj ¯µé×—ÐäñöåTÝÞ–{ŽÚ§_œÿŠsY#™ZÅr‡`XÌ`¼h £Uh„R—Uܹ„ÂögÍ}€rTíÑÉhTѪ¶‘ôAѨ«Ýfë„vá­‚µ‹xDJô䦘.Ò/àï¢&®…Ëð- hþèÔÊÙ8SP÷—*:øÈÉ9åT8yLlá ‘Ú›gÊêçük©Ö±Õªò„®ÐÀ9M…kD´Ä–¾ªî;¯• ‡+L±ï‰Qã§lÅ rM 2^;q½ÔÄÙC}…‡¬‰£‹ùk×)ÖˆKŒœÆ’WþS¥VºbÏ0îÂ+¥z´Žæådx6jkÓ¸÷y¨gåc=×Üÿ‡LN)R–#pxäôeØqÂbý ã<î–qÔ‹àŸâð "Ä &)Bt9xŸgÓ#NÖus?Ãd¸,ð$¸Õ#GôEKÈhËh×U¸ßýæšÃn*_Eb®Ó›SÑýÊ5[vŒƒ/,Z79iäA)ëœÛ_ñ섾êH¢Q+—ºë2 Ã\…RwŽCˆ˜'®§†µ‰;(ÒUf›¦.¥³Év,kF{×5“i¼Ó¿Ë[e…·Î¢Å½Ê4”| ÝOzÕºA•Ô¥O”û<<Æ"¾ª9hqèÇL;œ,²¦À õt³ÈïJ&ò-ã»ûÑ'ÍôX✲4Q[•WÖ?¬‘hÜ{ ³›¢Q ûdxƒv ëÖzˆ°³õÚ œˆÍŒÓ¾UQÔGÒŽ¶¾‘Ö¿íÛþÉñ‘§mR5¤™V#Q)xLu³0£ ÃB$ €“¾›ÂÜ9Õ…~ÃÌo"ɧïã·‰L'*<}`ùñåk„nC‚ïŸþc”ä£CWÏÊ`bÚÆ=ûÄ(lw¦€£º†I/–`k;{?seÔpLI×¹û~!wçÉLÀJurôXêÂÜMgg$ø”|ï=3Â13Ct²“ý¹\ùÓ“7p¶™roÿò~vÉŠ¼³ÃhÌr]¸÷D },'‚6fÁeïËÚÎ ƒêN¿K#Ü:¶t°œt(éâ ãcc)ùBz‚ñ„)eô$,¡±÷VÀ¡.ÆÕû' C%r~Âó ÷¼¨Åwð:\ÿ’_Gƒzeh”¥Rq£Ðfœÿaèm'Î-¼¾c÷È“›€%åññãáÿ@à_ endstream endobj 6602 0 obj 4434 endobj 6606 0 obj [447 /XYZ 40.7999999 493.459999 0] endobj 6607 0 obj [447 /XYZ 40.7999999 493.459999 0] endobj 6605 0 obj << /Type /Page /Parent 2 0 R /Contents 6608 0 R /Resources 6610 0 R /Annots 6611 0 R /MediaBox [0 0 595 842] >> endobj 6610 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6611 0 obj [ ] endobj 6608 0 obj << /Length 6609 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`4âC  l?&@Ó@AÁìn‚Ef‘Îò÷#[”Ú-ê#Å"EK¶»¶Û4Éb±^¬*–>ÿéë?Šþ^|~üúŸâ›y}üz¨Êª©úŸâøûéü®JÁû·­ªK®?ŷâíðrxéþ¾Xsêh^ºÆaŠ~Àß¿ývøÜO~è?ùúø—îÝÿ ^ü¹ûï×âoï^~2ã¿ðý ts|óïþ ㌫îŸówÇÆþú‡â·u÷ø÷S-»¯t°ÄÀñ6ve§ßó®h²ªhÚ¶©yÁï଻Oÿûóá—n´ŒRIÁDËkÙ½×l«Z)Þ½o…ùY4Sˇ©tÛLWÖDÖz;’,Í@'<Æ-U²u•t;´lú¥w½"?9ªZ•f;ޱ¸¥ Û‡J¹Šu³—®ëX$#EïOÄ'ˆXÔÊÌfà‘’î…ÄK4k¼;T2Í@¢/ XÃê%‰fãïšíÍÑñáõðù “Bùë/$'k yí–[ŸŽâTÕÅëOÅ«J|ù¡xýõ ËZ‹¶î͇¾¥â¨…ÿûÔÂØç ¶<‡Ï#`K¥!l Ž&aØB™ãσGÃ}Äéåùµ£Êµi¬­¤ °…Cºä5a4~ÓRÞa ± ކ©ãr ÆÞvð<)1*tFúç"‚þ1FªÇL’bS…„š"­H\ é’µ¨¥Æó@¨ñJÔZi¥ÝF¨\òaÖ§Œ³6Ìo¿P¸!éhØæ¡ÐoVÝ­r[˜;} „Ú€uF)Žy°õŒ%.î5HVÉ¡µRŽ÷‘‚+¸nŠvÊFIØ‚š†CØVæÚ]Ò2åääÕ©aó$m© %€[ðhËŒkl&Õûôº‹1Ê“ÊõuEä`cé!Bá§]‘U=s}[ß`FóÆL9zúÚ¦n>Ú@×ÑÔŒ| ë°$Ã@¯êhÙ“ ™ÒÖ:ÀåˆÀ}ýþ²bŒ­øä?êa ‡2ûÔB8¥éJ£èëÒÀè8º¦°oõDÚK³’RéªIÆysÂڊʰ#áðò9ƒÝa¢º¢Ú÷ÌZZ¤•’‘éˆw31eÝ»8ƇéÀ‘¡AÉ.Ãy26Ü‚qMÉþ£8ÌqlgÿáyÒÒhÆ,-­•ž´-—Ïʦd>KØçê2Ÿ“枊mgX«ND ³â}Ì O]ÇPzRI²Æ6 “!$>¹üzî6Æ Ùé$—Û!¨X¥?¢ÕÃjJz‹ó¾µ,˜åiNï…Ñ(s~†]ú&öŸ¶íÂIº f¹NŠÙ.)9`Ë ëK‚>GBT¯¾+kÙá_0šerÉ&Í'J#$©ÒúªåŒ'¸÷¢òV’PÓòôݘäJ nìøKÏs^`Š4À ù##Óˆ—ä„õËüÉaŽÀh@¶l ÒräncÔ[˜†B'$²µŠ ª֎AYÓdN*LšcïµPCˆþ!©¹¢îÐ|ª;(YAü‰Ž¹"NÁØRB;#&1 ƒ†Y"€'½ 9J¼ØÈpàå­ŸþŒ+ù `Ío[OŠZ&Ð &ÜÒ ‰ §`4;«/”’ÿ™â¢’¬N2¨Sçœy”ˇ8ØL¸|èjcØvé&w”L8H[|VãÀÞÃ-„B ;Ýqà —Î!”qìÂ&Âcl,°`‚³Yfåãµ\wÈÛ’ÒL={°éÁl I¹ê¦Je®e°ÚzÒÂUxŸ÷(´ÕGÃ>£ 6qÕRV¥4jó½Ï#lŽaÜ:ðJlÌèmqRs³Bu:šÉ`UÙ°d=F±ºìõ©eÍÃrÅ[ ã…øއ–Càí´³7—ŸœCΧ®³ÍÜ. 0a)þ›ôáõë\ÇÉ—Of嵘px€#Õ1Èž£bëdÒÇ$¡‡d|cˆ(,^˜ ³|ÕLo5Q+Ûqµ'ñ/û©æìÙ)õ¦e£j~_¿ )Ÿ/Ë¢oR€‘pÝ1@,%½‘Pê˜/m|öF²!ÒºðÔ²ˆ`;øíætø> X7aÈmͰNëüL],Èìà /Y‡$”a:ðê›ðkXN¤‚{W¶¡ë\éR l‰ À1))ÐD ȨXL–mž"Šd‰Wnp-4+´¼nRÚ¹žƒŒz*6sñËœ$µ AK‹lÛ @ lÆ ÊåFòo¦‰ëô+]YNNÎØº¸ÅÇ*"èi†“ë²]Æ«½JF=<)íÕ^ÇU5L}óª ðLÚËÅjGsÊC0Þ(üLÉwÀ×±tÀ…±ÜØD&„Œz©X?eï1Åâ}L:–¤˜þIå7,Q(T¤Ggà+ë™ 3l„7ÇHeãMÂ¥l|ís榆[²îÉûãµ2=@AÕl4WIŠ ˆ–¯}ç&i}ý=,ï«h ˆ1S²Ž°?Çr nµÒÚ 1ä½ÒڒÆQó+Šð¶¿ÖU+ùsÁ†‹ÇP–Ë€\žuîõ oÇž6Ô  ­Àa@‰Ò«ºtzeEÒ•½ökŒfÁîNc¬áž]_—4µøˆ¨½ë’=‹’É‹Ë/<¬É/ —›Ë! ÷)¢W»Œòûm‘ÜϪ ÔXPòf„ÃEñ“mù€Òrþ¹;W*»”Wz– ©iPØÉ‹,ÒsJ2_lXÙé”SC´õøðœ»† iˆ}HÚ÷çIÝšî¸Ë«´òê~†ØŽ Sw(~{ÙŒ›ä(£×“6¦ŸK«¨f²!sWX)&Q€Ó6@gøŸ”#žöì"Û§W~ù*éëV‡»¢<ÅÒ›¨’G­é±œÍͨµ´êf§G"ÍÇúbý”sUÍ—‡i“†x¯Cç*­œ‘–E°èfˆÞ`¡dFo@ŒO¢»œ›ÀZ½:)ÖUȳ–±½Ã/£ÃAWãEê p l‚âŠØepTWÍX•â'¤”ÎNšóàu¨³Ä`Wlr·$É{Ç}Bp̶$5Eá-ÙøÁ‰Ÿ…²üv{ˆmí?)$)‚/µÃRò9õ «ÆkBwý²ý²K?‚fbŒ©3$ˆ/nßõË]¿ÜõËGýÒýoûwÜ}ü‚yùöÝ!lAR½ ’§(qvõ? )X·Œ¹²Sš5e_X^ŒU7Œ Ü4e3_†\ËÒ¢…^ið¶lçc$íLKh!J®›¹d’º.›~ã¦ä27‚}4ìÓ«á–—¼:Õ1šª“¹Ñzª?ÿä ~×È“™~A} ¹Ïµ0´Ãa}ÌŽ…¬ÝÀvb€ª;¾ç5ký»M ãé ¢QC:€û„÷GÔ‚÷ SŠ1/ƒpÀž!ê"ôÕ”³0Vücó'\³¹'>³ï¬CøMŽQÖWÆFZ*egu#ø_©ª)ÙÑü(dwGËç:9¡>.^ÿÿ#_ endstream endobj 6609 0 obj 2983 endobj 6613 0 obj [448 /XYZ 40.7999999 751.699999 0] endobj 6614 0 obj [448 /XYZ 40.7999999 447.379999 0] endobj 6615 0 obj [448 /XYZ 40.7999999 751.699999 0] endobj 6616 0 obj [448 /XYZ 40.7999999 447.379999 0] endobj 6617 0 obj << /Type /Annot /Subtype /Link /Rect [438.239999 724.820000 471.839999 732.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 6612 0 obj << /Type /Page /Parent 2 0 R /Contents 6618 0 R /Resources 6620 0 R /Annots 6621 0 R /MediaBox [0 0 595 842] >> endobj 6620 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6621 0 obj [ 6617 0 R ] endobj 6618 0 obj << /Length 6619 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀjÄ—@°Àú1r`Ø@‹‚Ùì‹õ"Îò÷£nIý õ‘b‰¤$·ÆÀØnZT±XoV¿üåõŸÙ/d__ÿ“}ë¿?¾м(‹î_vüúîú^ç‚w?VµÊysü—}{?|d‡—ÃKûÿÇ•§ûoíàðŠnÂ?¾ý~øÒ½üÐ}òúø·ö§ÿe<ûkûÛ¯Ùÿh¿ýÔÏwüƒ÷CÝ”Ç~ë~`œñºýåú§ãà¿ÿSö{ B}š÷øÿwJ !¤œÇÇùQvúº~½¬Èʪae1Æ[8U‹Žÿþëðs;ÛŒ¼‘ŒU¥¬ŠÉ³V<+ë¢`UÖTe;µ4&5Ö6qª¹1Q„™è›·4VÈÊ>õ¬f¡PžjîD¼‘ö°f¡P§"£^HÕ-³š½ÐóTs'R,ÐDGˆØ¼¥ ¨ÇS‘Q¯Ê2ÕŸ§š;Q+^íaY†¢zcª— ʈ_”чåÁ‡·Ã—¯LŠú¨{ß~n!9)ðîÛÛûA¶¿•Rͳ·Ÿ²?…øú}ööë¡ÉU#*Õiün¤àh„ÿŸh„•ð™'8òìÿGxgcþPãÙDGäiäù­¥‰y;Ü€ím©ù¸½¼Uz7ÈeE^V¬nÁ¹, :Ôú~Wy°=2ŸôIOÈ kí/| ë ’¹ì®FŠé°ê¥ö,ï>P­[3®¬Ï*Q¡c5úÌNf ͘ ¯÷­Æ‚èŽÞ@™‚W =¶‡PœÐ ºfŒxÙq‚*oé eË‹kã(²RÚ¯ýŸ±¼§AÏ09l•Á¿h6ΞW%¿ÝNØ×¹ä§ÉŒ­b*ïvÊ #¿÷Àõˆ͆ßÃÔLôÆË„)³)5+Ñlo=§F齯æ¸En»U=ÃMW{M50]æ™ò¿æ«K^b1‚Å•EÄÓ°B¥fh ¦€a•B!Û=T—¡dt‚Qß§«L(¦Ã*ÓNd–yÏC¶Í"˜"˜n)Ç;Æ‚OŒÆFZ€Æ AÜ»mËr0Ð,,hÃ[‹7ÐàL}9½¯ÂX®dy£@ÃHKoö *lþ]­«‹^òÆÔP¡¢ ¬D¸¡2MËÉp‚ “Æ)Á#¤á}Vùt©×2“1<6Mزé¶VÊ%lÅàgVº³¼^ß*£?ÌE¨o†˜Âõ=!”¹š×ìÁÆ%úà3FTƦÅ0iyø‘Â/Ä$WU?8ÐR_•GXZ‚†èbTxøõX¤yív >©©"ŸS84=…Ë!ŽËáW±Ù­?^5ó·êñIŒ2¨`ÞOÔc†l°,‡ñ‰}9Œi2{SIºÉlB–HƒPBFÓ‡Á(q"ßáBFØ€ÐEÚbaZ‹¥‚é{Fdp-~e\ý© ©ë¬-g|DdÕbHcCyH^Š– ˆ3‹rÕu·…YœŽŸìÉ:¯›¢´Ç||Ž“–ʯH”‚mhçya˜£Û$.wDæ¬ ¡1§Ï9ênz/ozO'cËBá$²Ûžw”I$}lúF£û€É#º1ÇŠq™ëñÝaY`‰d„\°8u.uÎyéPO÷•<Ò/,œaÀº^½•Ö.ˆH©\U©N8ªÂ.än‹¬Þ‰” äÝZrQ¦OO 2MÏð‰´ï*}•é\ŸDsÓãl–é§óa ìEÔ;e#t‰A…I1Q°F–aï>œ‘B«Ã±%X/Ãjø ®åy€ÏðTVoÙô¯ôIíJ´ûR­tA!9œ,lÀÊÀIP§!ÍQȬãŒ-WDí>˜?ö"Ê"ÑHM}²°ÑBoµ© -G{L=Bµ‰W Bµ¨MסP|…ªZ|í 5€Bì—EVàëuì·àyï"òcjáZhlÖ}BQUC‚ª3}oLÕa%ˆ}GœI³Xª“²ú3ø$T{XMŸ½À„RÙ°Ð/®caèØ2½GŠ<¡¸ÃýôZ9žR^•rH3+¯¢dX%WÕ}I^m!ÃÓ#‰Ä ]ŠuDx&@®é¶d‚ÛºuWGr#ÖÛ #¥ ­˜¶ìP‚4mk|[I5ˆXý˜bÅÆÁa@#v>ÝêI($™•T ÂVX¤·k¬Õk¬Ç!twJÑÌl“ˆ'}2Ó~jo4NOŠõ´sqKì¥ZOPt¥E»@ÅzƇ¢œ•‹ø5$«dzŸ¶T‡âÞ^dÔ ¥Iù™‹KŸâûˆ_BÈ”RÀå:RAHÖ×Ê#‘*tÁšÀ•+…=˜(Ysô£;£r†hì{ÄÚòw(Á¹DEÄ$OqFÊÔ„˜(ôüÏ„cÖjÔ•ÆF‘ŒJÊI<…Tf°ÞçŽjDŽ@r]ß÷Yެ¯ft­ Óyr“¡K‰þ…K“c–I(©“æ¶ÓXƒ”¸¹›xâz2JVÇ #Ò#”âÑÝÖÄ@Ðt\V§$͹;ŽÌ-2;µ]cl5ÅF‰[ѱ%§C”ìüò|£Tš`tı¢ /ɲk”^AK×ClºQµÏUqâp æ4·O›]iŽ^ÍÜ-A-¥0ØGÃùÁÛÌ6®Õ¹õ[”ì½åjpR'ý®.oc÷¦X !£\>úh¾å3磚t°à–â-ˆ¨i7¶Bí–Z¼A3ø ¾q¯¿APäÕøÝuU. ¹ï»«z £¿ðÀPt~÷êá{)ï)ÐHÏMcëaè=ønÁÞ¼ˆ!HvO`ë[äŽÜè£q¢¡(Wo¥Š,žˆ6§?¯qšnyáÞ7Š D‰qÍ©˜Pé‰Ygzó¼ W0¯¯kñÇ8õ~©Ün¿Ñm@Ù{ˆWJc=m 0#/Û4á’W§#ãq‰š…)=jëƒÄ^ ÁFƒ¡'¨±õE£”RLpw—6‡(QHC#¹Ö’;ãnñ¶—K¦QÕ}SŠ‹lÇ·ÕEv»S6(jÀãò=Ra¾™8Wݣ݂ɋÁ¾ *#D‚ܬ>IñzO8v1SРÙ‘ h°âœÙ=’(ŸYaú›c5z\憕Ÿ³ÅœóÀ#Ž$½}å˜1ì‚é¬>çˆfé›#ƒrzœÞÔ›:»I}Ïìœt#Ñ;D•Û„ýôP€!òØâØ0Ð,„Eàt{P?DÕ*z F,F´ì)7ñlÅ…’¸9¤kL+áÚºŽB/”LcX›Xø ŽPV˜7wZŽ@ˬ¨œ»õéì¸òÎ-«ãÔK9•.æ8a×Ã2‰áÇeGÃâWN—¾ ú X)`Oqwåf‹LΆ{ѱ™v¬*VËP`aõV˜r‚»‘9^„pâwy'o›î6MÖìþ‘\¹MÊšÝÌîe€âQhì~œÉÀœ¾sÓ–¹©:7·Y³ÓšÊÛÝY@IwVðó)‹ÂTY‹Ã„_ÅYÝ]Do%ª!BÌ¡€*ÁšÕÉDÅx ˆ;¹M‡“bØCØ$~¾GbC R¢Eµ`§bØ`Cmf…8ç…lÓQ¿·_¸ñÙÜþåõ‡e=AÝ‘uÈyn?¼Ë€Ï',h—ë–»eµaËJ …›Ö<²æ`jXûé~¤)dºK®-K.5öo4Ô¼xàÚÉÙ×tº¬¶T°f?Å¢Ï°ÎØcë¶ÖÁµ wîýε[åÚ=ºŸ?™U½‚ãp%‡ÐçbÇá÷zÂ/îhį,׺âgGÚ–ÙjÕl¡Êp›Z'pLËHìA㘆z·I7ªÃ–ç`KU+¤ ůÃb/YíÆâÝÄËNÌ›*ÇI¸r:–ª¹÷tr<#ª(ë^óHØì7ìu¬:ûmÔ§7f—ثؖW@±ŸÌ¢äØ®¿âÀö+ûhY­e£ãôß¾½[xÏdÚâ´/V¶µ>êŽY”k—1vKDÃʼ»öUòv Ê2/Ç[”62ï0c˜­¼Ê«ñëÕÈH×$Mˆœ7£w<*•—Ó©à{jøLŸéZ»U<çÅé¦$ÝD›­#¶ëOžàßöêFVø=Ó³íØCëèkñýžéwÌgí=l'˜AuÇŸ¹b•{· tÐ…¼è@(HpŸðÞâÝàÊ璉¾e¡zsi  už…ÎY+þ1ù®¹¯ÊÙw Ö!üým¨~XŒ°TÊ®Z“Îàÿº50sv¼ÍðV0Èî–‘«†—/!õqörø?“Ïb« endstream endobj 6619 0 obj 3625 endobj 6623 0 obj [449 /XYZ 33.1199999 783.379999 0] endobj 6624 0 obj [449 /XYZ 40.7999999 741.139999 0] endobj 6625 0 obj [449 /XYZ 32.1599999 785.299999 0] endobj 6626 0 obj [449 /XYZ 40.7999999 741.139999 0] endobj 6622 0 obj << /Type /Page /Parent 2 0 R /Contents 6627 0 R /Resources 6629 0 R /Annots 6630 0 R /MediaBox [0 0 595 842] >> endobj 6629 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6630 0 obj [ ] endobj 6627 0 obj << /Length 6628 0 R /Filter /FlateDecode >> stream xœí]ËŽãºÝû+¼0ñ!ЂӝYhÌYYss\d.Ò¹‹ü~d‹~4©CK‡-ww70í1MªX<õ`U‘þüǯßþó·íçû¯ÿÙ~wï¿nêª6õð³Ýý~:CÚJÉáek›Jv»Ÿí÷›—íËæyóÜÿû²fßÑýéüíû¯›ÏÃÃ7Ã;_ïÿÜ¿úßVnÿÔÿï—í_ÿÖÿùÉ·ûÀíÌîÅ¿‡B iûÿœ¿Ú5þkó—ßmíI°ûqwÿ~j´nt+“èx9vûßó®èaõÖØÚX½Böt6=;þûÍÏýhG2*kÜ|=åIv÷¤VØþIµî‰Ói!Z£Ûz2ñý¿ý˜ÖØmךžÉ­ F x8q¬Ä¤Ðu–ö‰Ä¹õ o/ŒUY­„je£w+±[…ÆZÙ¿n•û™3ùN¸I]ÓP©õ³Ë´²Ý^ºR¦æÖ#ê9‹R'¥ðéx÷móùÉn¥Þ~û¹'c¯E‡?ßzÅöÓN^ënûí§íï{Ujþ°ýöËFÈ];z§Ý¿cŽoÈ.øHç}Dèá#gîüNRï¨JiÕ6{•ï†{ZêÊèÚÈæ¬åqhéªÎî;ž(gŒï“«|rÕ£?\øL ~´Øk*Óì&6iÒb ÷ñ[¤4\t;Ã8‚‹^­íqѨÃô2»ªutž¦6 Ážènöoèj˜éùŒ¬›«¶}=×û¡Ï”¬l«ºS^‹‚-’„‰5þ¼‚‰DãÁ‚¾VÑ¢ADí "1o¦³^àAüÊ€¦÷ìx… L‰ü2ÀZT6ö\HB~ÂA”öY?*„ÓC}1²XŸ…±¢"ì úBË'þ´0ñÞà>ÁðâΟ…?-í䢲]ýZ­„â÷8™YxZsF.·S­ÆWiAó²ãókû 8X©@ûÍYv¨˜…¿@¡9ö# ¯K€»@<\œ^Ûé$FôH0ñ,vs~Ye«rXheŽMÛy8vv½«š@¾ jq´µ<¡ Ÿã\± [0m_–Ö½CéñÐ-©%d|•#2áÃ9t–®+|Õçà>Â|ç*- ³Øò8ÿ90a.¾o齟»`•§ kŽ?_FÑÖúKnÞFñExL9ßMvÅ#Ú2I>Nv¶"r û„Žï].xõÂÛÁK:tuGt¥­~FTjÐr`eÛx-.Ž2«øût°Ï »BUí`G}DŒŒæÜ/QW~œBaªÝ UZzÏ÷°E8ñtÒyÖ¢¤‚À´‰'‚;’ès’$_ú4S©sÎ'Bn£Iˆmpµ1ó®\ gªDÁQLnÐh®eù8ŸUž0OŠÎàp[°wÃ{Û[õ‹67 MàÝ}°ÿò³?‰Ì&§oÁ„m‚QÃw@âÃAÌ`'–á|°gÜ„çgè²D®qüRTf§[¦C:\ó¬ÁÒe5S†M碱5åétÆw•Ð ¬Î|ˆ0Ù%|úzD"e³ã£gá/˜Ò˜“ƒ  ÉÁñ9 „^qÈ?X6¬²q¢ ¶\6Za°<¯ŽÃÓ¹_J2ù30ž„ žàQ$(uu„L)Ô"á« k[fôˆaöIŠÐ¬0©€ÙÈ]2N×ZÏHEDO Ã7ÅIÈgÎ)“K3ù°¹Óö²´~¡œC鯩þ¬®âµ‚¢szV%‚2¢˜]ÀÕ}ÓmØÒH]¦pC–±)Ø_ºœ4¿²s° þSÆz ñ†™'Êëž^"6'a„õÎE5Ìß,²eHq©)ç>AnglÒ(Á ’•Â5x#œM`Ê g‘é“Tˆ–-uI½·C¡AW‹ƒ·Ë+"¹ò;Ô"`Þ[Â>¸Àçñ…†£á<>.15Ê\u,@o ¥°sDc^ ØÒÁXóYXÝ©ÔÀ¸Ä-mNIµ@î<\“Bp'"gÌhÿ‘UÀÒ„yi“U‰„¼ º úZ™"÷yý;³ÁüÅ6㮣†ž9ö˜HS/X_Ö–Ú·c™ÉmÃTSÜ!4$A¼&t@æøó‰X âøƒQ¬"@k%8¢oKZûN\ÆØÕ­=cÓqäYc›ŽýFì—òDÞ›¿1 ;Ø”„¶cö­ õSoð9LT¤¤'Ä2~Ú‡÷áÁ}xp‹xpYóE‘•Ã-p´Hnâf}.!»Ë¨È›Ï.­Žè±­JØ@‘‹øçÁ•”¦cq!%MY³ yñOI q• •7ÁzcÅúi%ˆ5)YQ¬$QŸ•W/ßf®œÙoRULUÔ˘×x}"R›U;4;„5‰äÒ°¥ƒÜ‘Ø>cý„£Y°å6¥„‰ÊÕ6©F{9¸…à/Uµ”UGK¬ ªäå -Qõ‘‰XÛEô Þ‚•[BÖ)µ*y÷µ¥ö›yým*“…k¨›q£>:“iľ1ZDw®ÂJ™TUhÏ¡/ÝB9Ö§u|k¾“ÉŠdN‰¬T„£y+áyÆóÑŒ^Ç{¬íÖ¡7tJeŸ*q9ïR“RöÖ´•„ø•X†‰–¢X´â5®®LoõücÄ¢{*&‹HQ÷ãyO9âs–Äùß5{™ÏÊòRùl&oÎT^ox¦X~˜ÊÇÈ|p‚‚Ìg3/ÅÛËXõþÎfF$©ÕeNˆ3÷-|œ-cTMJ´Æ˜Ú ¼ÏXÇNPµ‡,JÉ]‡¸U^[aYêÖ )^Æ/'òø‘™2'^ áºTìCb„dÝ3D<0¦ž/«®bøÖüŸ¼§ì©;”.íÂÊØjuüâáw³k‰ÔZe­Ž}?ÒTr7¡›”œA±»fp}:–™uß#t›r†4ï]Ô˜‹DL»(ç» ü-dëòVe®ycjJV|2àbu_ô5uÒ9&¸Ó§, Ž(`›Êœ¦dbK˜Y=ŽÈs°÷€ŸÃ̇ðÔ"ùbÎÜéÊxžyÏÎR»i"–I!„©Šdr§Ø>gûÆ :M&&ÃHb²ýYï¦ÎÇŽÔËdµ›¸Æ¦äNÊT\ý\"U¡^Ò“0)§:òúï¥*M¯¿ïy?çÞòJÓ[;V ‰k?[ÖØ¤3/gËVp¶ìúûù³e—äÌԥϯäõÖ\+ÎÌ”9ëÀT0ßéɤâÝ4á‰DÎ̯Â6™rv£”ÌDna„W¯qcI^ψñÖ¬Ÿ¨”W?³©Õ)9ÉuœŒ1&醨BùÎ5ŸgöÌø®I¦R5óí Y¿+ŠÊ±®Cºm’å½zýò›\“.%'¹m©$fî#%ª­òê¾Ì•ÄÄmˆÔÙkÌQ¢Ê!ïÝZżÈRµE«ôV$eê²înð­f·¹ç½M=¸\ª”\á"ß áú9Šìh׋"aÍVôÓ Õ Síg¹UÇ{TÜԘʌ+ƒNW4ʶjýå€ÔŽ´ hTª’· MeLùŠcì9öé`Ÿ­¬d­vM§–;8Ú€ÜówàgŽ™áêãtóX‹@óp8¯[±9sw´í u»×²íåÕ&p ¾\ÂAôqY¾O=4ZjµÝcãÃ5Å8À+yijûî¢ɕڟ~2¦ÓäÔ÷š0Òï³ ÉÚÚT»œíkX g&Ʀ~vÔå9§vß>oþpçè endstream endobj 6628 0 obj 3691 endobj 6632 0 obj [450 /XYZ 40.7999999 721.939999 0] endobj 6633 0 obj [450 /XYZ 40.7999999 543.379999 0] endobj 6634 0 obj [450 /XYZ 40.7999999 127.699999 0] endobj 6635 0 obj [450 /XYZ 40.7999999 127.699999 0] endobj 6636 0 obj [450 /XYZ 40.7999999 721.939999 0] endobj 6637 0 obj [450 /XYZ 40.7999999 543.379999 0] endobj 6631 0 obj << /Type /Page /Parent 2 0 R /Contents 6638 0 R /Resources 6640 0 R /Annots 6641 0 R /MediaBox [0 0 595 842] >> endobj 6640 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6641 0 obj [ ] endobj 6638 0 obj << /Length 6639 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ) ¬gÆr`x€‚o6Á"»ÈdùûQ·¤nØ%~¤ØêOÛlQÅz³XUüøÇ¯/þù[ññáëŠoÃ‡ª¬lÕÿÇ?¾ÿÙ”JöëÆ”²=þß~9¼/‡/‡/Ýß/aO¿ºÁñý„¿}ûõð±ù¡ÿŸ¯î>ý¯ÅŸºý\üõoݯ‡ùŽ_øåдöøáßý!…lº|ÿé8ø¯Ã_~WüÚМæ=þýÁhSwðGÁñr~Tœþ|ÿ(zYUØFv¸*„Ý_¦CÇÿqø©›í FÙh%T-î>·VוiÙ}®Õð³èMµ<¾J´¢hkÛaD9/rÖ»pªØ‰ºÕ¥™è‘ˆ[š¨tퟪlµõ‘ ‹‰ÜC§Ûº_f[Å.ô„v˜¯1X~ ‡à•î#ÝĵGWÁg0µ±4zxëѤ KVb{ˆGàlXJ<°Aí"ðž bÓdzR,§ø=˜ßšŒÞ‚‘™}¡ Ó@?"1M°l\Îà ó%ö¥ „šñwk´¼³Âiè¡{ôÖ;Œ­†ÒèÑbx6lõë Ÿñìì±—Eølj°a‹! *x(7AŸ ãê ýP„¯ÊD6í•`îÃû‚»ô0vŸ`yg#ŒeòCéƒ}—~»ôD¾‡jüÌ#í1åñ#Ú3¤·ß¿CŒà=2ãý$޵ãõ0qóÝVï#ûÈæýOláæÚ2qÔ‰ÈT¬3_í5ó%íÉ|)ÝŽ¯<«ûªÿ¹ƒGúcE]Öf2r ,F<ÂgZôŒêQ(TY‹æ8zy¦7lM©ådDôµ¶TBš×ïé!Ui¬|MÞ8[…žñ@ ±#$é©`Jiû-€ÚƒƒdÉ-ðtÕ3XcÇE‹LÛÓjÊíuY9r ê~ÀA{sùêÓ€%ñ?õô«=1õT}4S2\HÔË!ÂËjÈâ(?½Ï‚ñ3Îôítåx}xVG0íQ*ç³tÄì"gpD`0 æŽA 9»4gpÁ.n0Ïa!#H.ƒ +-B£û,f(ÖYŽÂB”FÛ×J ÓÃèHÛô?<´Çâþ°º.7j¢Ì1É\5è « ÌΎ̪‰! ¡1•Ï[Ýzj[cô^gˆñb´|„šÈn “j‡]ÿßþw•ž#ÂXÚ0À«R½’å>œGáÍû8 qÐì ­hfÚjjfBV ¶JÏÃ;V<›|Zì~Ï*¬uÃÝmc§´Éuj½úVUTJO7ø ëïue^¯S˜‘”ñ ð)Ó'Q˜R«Ç Ÿõ\g«TÇ?_þì=©¶Ë´ƒhÇb,V«9ݳš9š¬(Ūj§b¼²Ç@Øj[…7/Çxêàýì ’ˆÍ­…ßñ,Ò(Ž€½<±q]{O ËfczxoÙ´Õ$ïèÁó 1àn ±´òŽÙÌ¿c U²t+©Z;Fj•@‰'R³\£$1/7W¿áQ¬u·o•Sx3Û·V8[©åÁ/—ßgU–‡cfµ¢Ìò*BëQ¢ÎjˆXÔ€¬ i96VpUÊòØk}¢ˆ11íÛšÐ5Ã.ÆL(·+/þcšQ…®s•E¼mÁÞ–X2çrï>›e3vØÅâriHJPÓc@&U&*‰fŸá ˆòšª½–Ý²ÿy›Û^´Ù<*XÚP¢‹btBHè…ˆ×2qa ‹›mÈÞ;lr#%¸§…D¥…¤ÍÊZ÷Ðų`à­îzb]b‚ ®ô̧¤ÌîèILŽéè‘x‰_7ü6nöês~,11¸è àÀÙ$,³Á-gKä׌ ˆz‚©#&Cû˜³vÅó¾­³œïõSVêZ:÷W‚ÕP¸ªWÉzêÇa °'ˆ™×é¦íAÁ×}aÑKTÇ–¶^NÂî’×j× 2³yêÇ“ÿÈÙ¹©¼ôP˜èDK2f‹Â¸ö]¥zñ0µŸŒæÂj¶Î±¶‰àXjä.%O_l›˜žÕ&œ“ö. [© å<•ák Ó§÷„! öô¸Áý´™ÂL—Ü5ˆéjŽ¥®‡éN„õÓ£ÀÓ† ÓIñ;ÉÊc›:B¨Ç|ÚÊF@Š;Q½Ãq·I¼;"v¢‰;5b¯ kEŒâF‡Šñ5™Ž\„VÄô‰èº˜G2¤‰Œ´\ÁÜþÂôaõÜä©åÑ ¿{GŒWq °Þ€Èìé°ucèCí¶!›ZÇÈæÍ#†G²â׎w)¥óEfºNÕò|!ÃÍ»NyÞs—]§†­WúDyžùLà`+=¬êR98êa‹z… ×÷ÉÁN¯\„)û³£E`ì`jcú`¼aØ0F1‡@îÍÖI¬6çVubXÀ|é•NÁ”O1ïIrHꑤ°qy‘/uÖOtUJÙDaQ1SL}_ ¶×b)*íüžR«Wé)’½üž|)“€¶•›kÍÔš0ºuÝŽ·Oœ+ŒÙRÚ^@¦-Qy¾Nat3š´KDHauÖ)@ ±$„\Yî¨^IíöFºï­\ ÝȉØL¢Òš‰ÃîF*€„Ó¼ÿ€Ö¥LƦ+­S\q‰á€7q܂șC/êœ9ªÃižÌEw/ykÌxÉNµÀ#žË 0~ñÅáøè›¹‘IFüŒG˜ €p NÀëÁ1LR sAž‘&æÒlâxƒ¹ë'&™§Ž¤ÕiL²TÚc!Ä×W V‡`*0×zb Æ\…׃©Àà ´1 êD’>N½½üxpÀHIN+^ÏÛjÆŠ§ÕiË=pŠ03›'Í‘MBf<öIuM¶Wšç¾¶:7hÙ ¡î´êÍù5[‰V„隌;øVÆ$åî©®>¨÷TW}¶žêÚê˜$ð-§ºbKœêºa@á¨$†€)-NêÓnDšlTâø='§2û>òÎG—<¶ÀS‚ÆèõÛÇ÷¶r¢fs0ˆYâvp¥x„j(€½X¼3Ïäß25ÄIÍ6J8Ûf,1ÉXŽ©ªKDÒ¸¦ç”ˆB0±Ì=8 MI*–-³¢ÎÓ±ŽÅ'ÁiOsÐßÜãßr›Òÿꤾ§˜CÀø¸US€‰›$åÄ1ˆ\9 F70Jë£úšiŽAi 5a"Nòx%ö éû9ï"l£Ó<»R"ƒäöÙÕÄBÄÇ÷“½-œìyZ"Ü%p#&Ò€?m¼¡Ÿªê˜”Lˉ´'•GÄsQ8߉ƒªÚs>JÆX…P“+Ù¯I'CoˆSÉìÂk4É´>óø—·Ï—fÎG©½Ö®óȌϱ'SÏ‹ZÏJ*u ƒeëæ'ik+ÒFÔ°~ñð/‘K‘8ZiÊ芛ïaÞO# ›8ŸQ¢U1üÂÐÒ$m¾NâÜØ7¶CóDÑî.qàiÀûnpàÑBIåÇÓ$qÇuj]•4Ã?§-…œ§ýÍñ›+úâÑÑ£"R‰;  æù´4ñØŒœ41 tä[Ëkç91oLj®Â-‰sÂÓÌ×ÐåŒfvz½‹Áû›0‹e•ÙcëÍDn^…íñ`˜³G¢Ý“³Àìõ“⊚2•5˜CÞM-ü¦y”é×@tvap@íá·RŸÇ²X=K­=RµGªf4ñ]â`TÝmfÏNŸmÓg µ®J5çSLû¹‘Õï PZ­,ÌØ^rÊ‹’Fô:_§áñ}7†OÒò®‚j²Îôž®\«)Œ™:!;7^8<ßëöX]þì[ïsžd}! Á:á.ï¼ë " ï¸ûÕøKÖÔþµœªÿu³ 4<=Ôdòqý®´bвRù.®ò @Ã×"8Š BmðÖøU÷}NOù>IJˆÒh{|šÒÇÆµ Âcn~ÁŒÄ\f4í³žô^‰oÎbÌ7v©fùU×’àë•Öì™_©©U¹ƒëFôS*¼Ìï u;¾Õ0³Òæ"¼±X¨NÛç g}ãÈÝ&"¦:ßXOðˆ*Ý´‘xk_w¾ÌÆ—‰kËfˆ®T˜w²Ê™lfiï©÷K_ö¼ã*Wìò|vÆ)µ2ÍÙÅ»ù¥ÔRÀgàÅÂCs²k—Rã«ñqí²g$Ó¥ÔÔåÊxÎv¿Ø0vðåʘ>øâg¼ž¤WcÁ8`.¥ÆÏq€¹c'ÓEÖÊJí Ýö2;U4¾“âvå['—ßi¼Nœ5àþeêh' (µ<àâhÌ_üÉ\ùp 1®öD|œ,qžÆÝDˆÃÖçËpË)œX€Óˆ`¦‘¾'‰_Õ†Û|âäÖ¤¡eÆ„pÛÚ×´í`Z[¥å¦½s­Þv0í-–•suŠ—ŽÈ_~}ûÅCu—]ª »|ñ2Œ÷Ñù-†-D·Œ+Œ¦ZaËÞáPÕÙþ™-íõ»V—Žrî™MÖe=U–=:ë+#½Sª”­½ægSÚ^ÅNmÛµ÷4ð™>Ó O-KY¼ÏËÈ'8[φßÿÏ#üîpyõ•~FÏ ÊïÚˆ@ëÔbØ3ÅBÖ>Àv€®;~–FÔóÔ&ø`0†>0Î3C ¢{¦ê‡.#Õ”ÚCáÚü¦˜0å<ïü¬~@’;DÁ½C‹aüâkÜ„9ý! 75MeKqÜ©¼f+™g°r×Fô÷>¡v/¾þ?úb endstream endobj 6639 0 obj 3849 endobj 6643 0 obj [451 /XYZ 40.7999999 468.499999 0] endobj 6644 0 obj [451 /XYZ 40.7999999 468.499999 0] endobj 6642 0 obj << /Type /Page /Parent 2 0 R /Contents 6645 0 R /Resources 6647 0 R /Annots 6648 0 R /MediaBox [0 0 595 842] >> endobj 6647 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6648 0 obj [ ] endobj 6645 0 obj << /Length 6646 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâK àäÀ°‚o6Á"^d²‡üýH-v÷XÔGŠÅ"[šiðô˜Í"Y,Ö›Å÷üò÷ã?;¾üòŸã7ûóñË¡®ê¦žþÇ¿ï^þ‡ì*%§mg*ÙŽß¾žÏ‡Ï‡ÏÿÏÑœ:ÚCãyˆ àoß~=¼Ÿ?LÿóåñÏçÿåñOÃo¿ÿú·áÇOÞø…oÆÿž>)d7üòòÓØø¯Ã_~wüu˜Bw‚;þûÎè¦o‡ï¤ÌãùÒUœþ¾ìŠ«M§Ú BÈažføôß~ ]¦QõZˆ¶Ñm½j+G°ÖǾ@7­ÔYÛJP©€:Qóg$Ò–&jÝúA‘Qßµý´Ì6cgP‰€t­yf$Ò–vF=EE½ÊLË42cP©€d×ðg$Ò–fQïEFýðûi™½I]çR2ÂL£x3I+;#Bª:­„j¥ÑãŒø7]'‡Ï­²"æÛ˱‡^‰K¿€JÔj¦c0ÎH¤-í¼ù´}{Z¦êêdŒYP©3¢eBý8#‘¶´3ê1(Γ`¤´8T]*/ R : qF"miv;\PŸYTdyU‘Ÿ=¾Þz}P¿þ<ÌädVL?¾Ë5Çw£ª¬†ß~:þ¾®…þÃñë/‡¾2½jÍd‡äh©{اƒ}d™¹)<ƒ'Øò µÈ8ƒBƒ3Ð-„VÈ7óöû£a‹šZž¾4žbµ»0ÅBÌ[Ê`¤éÎû€wÓ¼k€ô‹[ø(¡‹ÖõiуÂ}>f§!E]5­è†é\àt4»ë¼§¯êùA|ñéÄ´Uíœæé«¦R²Ò¸§l¡=™Wðb" ]éé›/PªQ‹V³I;«¨Å4LÕõuóÃÔ,³æ<·kË´»¹BTƒ„úŸ+зŸ–Ó5•XÀh5gß…²å­,ˆ‹)Ö3àaäËãÑŽ±ö¡òâ1 œ â a!|E:EÛ‘n²£z„™ÂØ!­õºIŽàÃÛ˰ˆà¶&^gX“äÐmÕüDx’#Ÿ-)™9ËÆîIäo0þìpTW%5ÉCsðYOèÒ ì¨<â4b‡o4®Ûn&"2IŠ–CM„ݹÛÁü6ë'Zºb‘¢<íc?qQUØ“+®7ËïY"÷,ï8¼Þ^ q ¡XCÝx.ˆxgp>·ß­MäuhY7 ¸ºçhl;Gƒ?xB„óòR}…ZJ>›÷LŒ{&Fii¢u•̪b5à^T¢ýq¹³*^‡óúuGV·”P(ÊáØŒ -ÇàlÛúŠ$n½©9~µ„Àµ˜©qĈ).H|½.¦ôKx•§w‹ÇQÎð›æ˜K„«ÛInòˆc;ÉÔ¥z ›¹õ»âÌcø­c¢yjÇxö"¢2àz¨1Ùž,s}•0‰Å¿Åo}nŸ+FY2p)µ RbRYC%UšœµŽ„^-!(Ü6&<Qó’Ÿ4'\)émý²Â4\5—¢ F”À ÚxìZeÐa‹ ™³$Ë0™ïLwú_"~ÏQ¶Œ*º~Ž©]§ÎÐM¿œ0šv†d’ò‹å²£Ðk;íË޹£áŠÈKLÑÖuîbxp¡”IŽÚ$¼¦f‚aਗ਼óÖJïÜ“¢âÓX3 ‘ñéž™¤Îržï'€¤^ÜÖ Ò›")(‚„ÔЩÄG¹Ëë˜f¬VÀ\6:¼¥á{®vñ¥k,¹ïã·ó`Íùóäaf¿ /l~˵m8â’rÖ‡˜0O‹‘M¬±ƒ›×þ¿×Ý•jöÖÅ2+ÉÈ~Í9Ze¿>œ9¤pФ¬› + ”²!ÁÇò@Ê‚S26º%ÄïµV﵊n¿ì™Ÿ˜Q¯$™A3­§?sbZj9‹ÖÌZdOè£aŸõ±‘ÚA¤:´y¡Ú©,ÿ‹>u•¶T3ß»¥>Ên¢œWù÷ôùDXÏõ ªYú¯}ýxiÖx= šµgšg­=†V±J›µ§ÄuMÖÛã§ÀãaKءЀØy PÈÄò„ªÚùJa{ b opÌ+¥Po¡޵¾ˆö÷`É8Âz ©ê1I_à êœçæõžÓCIé’GKÞÓ»„”·ÅXïu†áôç.¬H0bâ‡y_ì,d£;n„[T÷hº™ (þR¤D'ôË{¥*!Û@b&GI%x­"`)ó(w¹"Š©r¸€Sž‡O²ô7ü !¾èsOìH©OqÊ™Q˜\8’§\ÙŽÚçOÂWb&]n~&)d¡öG0Ã29 œ7ž ¦úòzÇú؈Âd¤wUY—™Ër\ea¹#ê"ÖG©XèÝPÊŒ‚…ÖL}yާoàÂ8?§€ ÓÀrjh°Bòç+ÅÅIðNÁ—C(ØQo¸´È.q€Çy;8p֞ƭi22åIB FxK$y8¡¤‰þ –.2ú2j©‚@æ—I°Ü йl~6…àð"Å òzXrÍI …¬¢í^Î}eægæG\|ÓU½=YƒØ0qHŒr0ÞÁ]ØI5Haf¢ÁC3˜Ð ™´.ûƒXÒ”kô¥–/¬í©ˆŒ_¹£ÜdÇ*/V¢ ŠÕ8Ê]z\’¯ÄŠÝjÎÕ„=õ5 j%©Â'Þa|?#T“¶ ;Ä¢§F+5ì³u,¶µb±”)…kc,òÖG~C-9!0…ê÷òVöÎØ¹‰ßp ¬”ïjäŠS+Up ¼ŽSФ¢8æ(¼œ2Ž”DáƒØÉ¶.Īâ“éÀ#?(Îp¨÷y´U¬_b^Cx}†÷½ Ï)¡¼Œ€ƒ"š¤ÌïBHûŽÃ(–,‚ÀñY÷”’ P<¦7ƒg@ÁžáÕ9’*•‚жg#û"ŠZç2Iø¶!-yÃë”;¸Øã.øÖu³bˆ^{Nf8?Žž|––¨½" “¥RY uìè>}DšcÄkØ<%ìó;™ÛfÆö_QîO§.âóí<²Xè!Ã×–[B2)v‰c¤¬‰‰Kæñt×]Ê™Á!(ü4%Ï2þ„y æ(¸¥ Û¿»<²Ëüø'¦l1˜¿`s¾ØMˆqÅå¿)®Ò›?šçqTn¿$=WKÊ-¤„žñž`79¦e¸÷;u!ÃÎ<ŠÖæÁÇ2猳:=<ᇡáSU0ÀQ„ôIÏ0—|8³OzzvËZ oÈŸYŽ¿i]òÔ%=W[JW,¥EJl©°j‘[æ¼Z¤R·lÀšÀûs§ƒÛýåÉë»q·3¨vÆ>ýŸwëh×ÖQ'Ãt¹ëh7åÎç–½ô··Ž<úéÛÑ>Ê:3 þÙËɽ]Ãl5G1,cA¨^4Õô¬º°W5›¦j–oßôºr6‘€l«vùA¼v¡eÚ¥*Ù/ cªf"œ9Ù,ÓÁ>=ì3ɱVV²>½ tmy€Ð&¢sŸòZú®e´ +ü„úØã¶Ô"Ð:ì1‹ëcw,fívn§@uãgiDÞmØ«õ:0N«5}ê©éÚRÏwÛêKðážb:À;çÒ³ú€N®ÿ®ÏÏÉ Å%j”þÈBM]W7•ËÂÿHVUô–ZÌKÏÈÝŸÿO½$æ endstream endobj 6646 0 obj 3732 endobj 6650 0 obj [452 /XYZ 40.7999999 195.860000 0] endobj 6651 0 obj [452 /XYZ 40.7999999 713.299999 0] endobj 6652 0 obj [452 /XYZ 33.1199999 270.740000 0] endobj 6653 0 obj [452 /XYZ 40.7999999 89.2999999 0] endobj 6654 0 obj [452 /XYZ 40.7999999 195.860000 0] endobj 6655 0 obj [452 /XYZ 40.7999999 713.299999 0] endobj 6656 0 obj [452 /XYZ 40.7999999 89.2999999 0] endobj 6657 0 obj [452 /XYZ 32.1599999 272.659999 0] endobj 6649 0 obj << /Type /Page /Parent 2 0 R /Contents 6658 0 R /Resources 6660 0 R /Annots 6661 0 R /MediaBox [0 0 595 842] >> endobj 6660 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6661 0 obj [ ] endobj 6658 0 obj << /Length 6659 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsuÄ‹( ( $™I> EŠl·Å¢»hºýû•-jì!õ‘äau–Ã6›Ù}™jîDÈ4ÑyEbÞÖFÐã©Ø ïF ëie.Ä2!«©:“é û‰y[A§â‚ÞÝfýuª¹ɶÊ3ÑyEy@˜êÔû~NyQ{~‹Rý÷¯ì…W¶îù÷šu3œãL³Ï¥îò°µËŠÄ¬çëÎô9‹þ!¯úÇ÷Àƒ¾Þ}º—f½~ñõ§~!møñµßl}üá,ôt?úãñ÷U%?ýáøõçCwª;ÕÔƒ’7ŒTÏhDh4"%ãWР­Ðˆê.#Ï_{¸‡¢©£PTpwy¡¨á3›‡b«£P”ÝB¸!‚¡ˆŸYŠªRqº…{À# îŽÃ9‡§0h‹óžâ /|bàò>yÏÀª bï8Âàå<íŠÁŸð «þ1à…T¢äiRŽëÁ|îC^ÀÝqÎDCìãð Ì…ðªñ òI þ¨º©£’ærTºòQôê5ŒŽ âGŸšÚ¹Šð ~O‡žù1Âp‚°ÜÙÄ€”õ©×¼}F „%ªÓ0p3".#æ¤Äeàæ=²´'-Eûjâ#ÁûQ®@ÂýàU?ÃaÀΧ\èÚ΢«]U3"‹~9xmÎнwØ@sª<.G,p§žiíÁÛ3¼©í!êá`ZçÛ„÷‰ÍŠG,¿ºNo ír[²x GÜI,Q9~7az˯k•.l Ïî³ø=xïÅÏbŒâà  `á³%J%[ñŠ(½³÷7Šáéá©÷,ÞyÇÛtÃíQ°±sßç-#= 9»ðÖê†ÅªtclLGRø;¶’¢ÂWVØ/içp#<âa¢w@ø, ”ŽqÃ&Ê.|ŒäHOï´\‘1g)BXý­íª×šÕßD=ÎryázÕT]……°—ÛûL/ýøÔZë=±R&{ûcLÀmuCà°˜ë•ôCLg|qÛ5®e€‰‚\¾§I‡Ëß•®’΅_Å“¸Û XÞû0‡flkZtzS¸ƒXÕÀÇ{»Ü4â•dI°‹HÎx§Í°w½Iä{([sªx[¾âãAs§"ìœbñ§/]ÑϹh&à›ɦí^+qÅýÌzë-§›ÁïuãÐÏŒ£ ŽåÀÞ~¸S£8fŽa€á†Ïç‰~ÚFd1¬ñPˆ!œH)>¹@ S ŽJ3 €Ž!qð€7U ÄõpüG=T"1mcŒÇñЬQ9± óe1 Ãƒ£¬Ô3F;b/p(ŒÄŒÌ˜hT¶#¹‘—M×rÌPÂ*òú¶!Aû"hà«YFžnîzEmÆÍåhÏÙ|úêÍE5¾˜/HR7î:sƉ˜ Å;r} oYÁ#TÞb‡Ü,·wV_¨g1xIºÿÌç2Øã°P°`uïc‘D…Bn—°^ ¬Qùx+G‰¿¦n˜aúkMwï±òv«Op®ñf^zzßl.©™·®+(ICðêj^1#²d0Kè¨v–…ï¾Ùà· Ö9^,‚0#Ä©qÞvÈù ØÔZÅÁ‚×j/²À0ùüI8É«0$¡Œß…5QG´ÚÅâ‚F´­ûÎíÀ²Úâ”4=ï«éáYŠmÄÑÓ(ÉB©PÔn<É_ÝŽ‡ŸçœcÜ‚Îc‘ôŽ3 ð9CB–ìÄcº Ö‘›¦ªVnšZMËÍÌfAÀ¾&(T·!!2½ú%AhÇù%\s€Ð ¾•2>†X*ñ+þé-¾BâY–´F³ÊÚ&ÕJ¹ú„ït%ÐeI‰±€ÑjÆ‚äk}¥}b¸ö(gJ©—x-éÚÜŒ2Š)¾Pe\Y&(„x_òk™Cùè-žgYwc§¢-gm 7g5án,xÕ0Å`Ϧ|KÙ”{Îdh§{Î$:o%gRkG„½¡œI£Ä¸œ¨Å‰ªdÔŠy¦›éŠ£Í¤bÞS6ÈvÒF×qcÊÎ#¿Mæ‘*)ÜuftIÍž¬œ…ßE65|±Õ¦gfTdìèÁ @¦óñ¥ºkX"§‡Îþ`t€Á³Éšœ…ÃÒ”Rà•ò)7˜ Jº «ÄMã²ým¦Væ>ÅS#kwáo>CøA—­CÁmãê?«&¼¶]A:ÝCáT™<5Ûc‹YWÉtÆÑ|© v×é·«›/ÄZŠí³:s,’¿ïd”!"\V«¦uùãÃdªiÛNü†=­]ÀHÚafíA¹Í¾©µPîÎP¢9Bˆà˜SlJY!á˜ÓûÓD¿WI?rêsS×+PÚÊcF{êsrêsQËÝ=˜=»c×]gW—OÏÚöå>¾‚I}šj{‚‘sÈwÝŽ”À’D#Ý ixñ ;)(ÞúÕ¦Y±Ÿ’MS¸Œ/o$ueoI&;Úu/\¶Œ‹&E¿=ZQ?ðÌ»:îÀI;粟!fQäÒYMhÖm½›p\é³f©é× ,}ÏA¤únOEO¯?\À4Ô&]ÐÌÑŠ8gm·Àét‘`®žÂ÷^,£Û:-g9…–Œg2„›Ê›¾Íõúï…•²2ÆT–‹í(^3Nê.Œ<ç…U ¹»¸Z‚Q+®dåÖ8t›@oWV‡¶šâÀ—ÑEêŽ2@7|Mj֨ţ«òÔü«„cqã‘YŒ(K[0F ¥o §Gôò­Ý-©¢íN&Ü3ÜQïí2mXéöJá4iÙ8'¡jK<”2~©vIû¼qu—µîÜ{ü¦HÐÝï<Ët+ŸôhMx)á µ`Y ¡C:œ ÞRý¤Êdˆ,âíÜ ½ÈµœÍÃÖ4£ÏxayKjÁ¢º!ҽ܀[¨0ö[7Õœ¦N µÉ³áž)æ¹×”ZÑ|¾hE_üÞ.²ÝLk™ÍÍo¤÷ïÕ|¥3®ÉÓ1n¦}‘ß~×~8b5¢©7gÃ|ʲ<”U{eÁ0qíá€f«„Mņ h÷°¼@@ʳâ.À»"¯h6‰k¼m{¢k;žŽ¶cqs"àìÁÊxmàÄô‹À±|j’¾^ £àÁÜ_ìþás\(¸œsÅjúÕj„f~”•DæÜ)¿©ß¾’¥ûÁZwºá¬)V¬Çjãùpq!ËäD=N{Áý“>@°Lº -0sЧJ̹w|{×ÑÓ9JÊ—V8Æçâ8ýÑÞ³÷À‘ã|V¢ñ¥˜AIsÁl–@ê œpù£K‚Ž”Àíà5›oç®5Âe¨éÈ€¨…o8ÅÒ7[¨iY f`ùKI;ѹVÏèÍk\g A\å¹›€›ÂÅÕ•tãI)ëa_À•"ŠÑ÷©™e½íšp”Ø>`H½…ŒQ/Y6¡Hd}è¥kºŠPÆÊ‘OQŠ!\­8'‡<‹ôÑ45ù(G €¤¼-Uédþ¸Âëô Ç^`³wóñ-Al¤f)œ¡wú”®ŽâŒèžW´@(Ò#”^̱‹Êø=½!n6d•ɾÔÌê¬OWÐûŒWî,®¯sLž¼b\á-.€Ú¡óÚ`Í4¥Ø–€eúNc©R¶þ OŸÅ›Ç’ßdÔ_ÀUѳÖc³Œ¸ šÐf¢Œ\\Ø2|t±È–¼ÞϹé>IH3DÓ¾>—îtÒÁNŒØÜÔÎÈ5/ýŸéà3×覵iQíI[‚ºÎö ˆñx¥—d¥ÐˆEQŸŒHyƪ‘¢:¼© àýÖ†wºÐ?¦cf\Àmõèn$Ælñ4ÖU –îY U‚cóp”ŒaFä9ÁÒµŽ  \öPJ¢ÆV–nU>°â‰Cé> Š»„/âN „0£¾ž,ÚYÀ(ïÔ¬‡í”U<’À ½‰²ôCÙXç¡Z)WÞâ²5NA4.ÃcYJß—FQ#\Íd– [öœæAô,„€ÈÑ,n|RºÚÍð‡íý¶Ñÿ§~)ˆÔúãª-Ìzp"®BcÔa¶ˆ«Ýj\ÁȨ…Â+`õ@³1Îç®…FùJFMhø|ðiãK¯—²èT¯_9‘ŽNÑŽâ¹o.í¤pÈ9‹{ ‡¾íi7.ŽXUñtƒ²ÀË9yí«»È«$§Öêß\Ù]$¼äXÇ}Woš7YÊ&t÷͈«y¹‘ƒ%x¹½3!d"2ôqƒW^ ó„Çðeç½: KŽþæÑ³h…gdIÆ*LFQþ¨‡oÈÓ°Ò´÷Eóá(À@"¼h‚(ÌÃÃequÆâÛ?1¹䡞2™leiòŒµ)cȵ iÊ®vhs{yú ¹ØXÀ4J@»û +j!ó týÇ>PF×À@ßè˜ß´¤(j: š5Æ!Ž'.k:Å¡‘5?Ý&M°æ\Ž’+Ý`#2°dè½U.õähYá[I„¢˜,]šÖV6ì7g•ƒàCÉš%X¨v•=ÂñÜo­D) {s„Š”ñ/`…›­ù\ì+4*Uã€0ÀaãuÁ {ö´Á;Qg$Ë—ÍWæÔ{QÔ‹ ç¶æXIVÖO #/Íñ’aæ¶ÿ jˆ5•¼Ø´6®˜™a —©|ÈkÔg­ñd™ùéU(÷ìk|3¹9y’ï2qfu_ÆbµÏ¦ë^ïlÍÚç'ø ¬}¶.©*baÅ‘J’oFpUôš­Â•Çð=x6N]v þ×Kãëg¸S k \3Ž×ÖYäWà‚ƒ‰¼6iwªN»6¼j¸6{;ÂtðH Î¯`©|õF™×3u½ƒÇ¸âj¢Çí³˜B9ìT‚›©¼Œbðfqž:fí¬µšûýÑ[¥P0ˆÓ–'©è®ÿ{üÞs*a.ÌÇþøöK€uù<¯ºò¼ÏA®|4®™£è·1Á0U'Ì·tT•~¹ÆœÌ4[ëôÉÚp޲95î 8ÖLŒ ‡£ÔIvNÛ­Of8…§ÞÓÂg:øÌ@o<Éê¢Ð¸ô65Û€}·¿y‚ßµ'&vø =c¹ýÔˆ@û°ôE{Æžeïvm˜uçϲMü´x ðÉA<ŸÆ[-} Gá{l5á­Ù[y8ƒqÒÃ/ËÞ&N*pîÞ,þo8ø1Ë9·meN⬢¾>pu¼ ¢‚å½ùîñóáÿÇ#úŽ endstream endobj 6659 0 obj 5091 endobj 6662 0 obj << /Type /Page /Parent 2 0 R /Contents 6663 0 R /Resources 6665 0 R /Annots 6666 0 R /MediaBox [0 0 595 842] >> endobj 6665 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 6666 0 obj [ ] endobj 6663 0 obj << /Length 6664 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`4|“‚vº§ä`0 ääÌî&Xdéì!?²E»»E´T¢hÊf70í1ÍW=¾*V•èúú柿7¾þ§ùæÿ>|ݱ–6ü4ûßoß®•bxinE·ÿi¾}ß½4/»/»/ý¿/;nýŸ¾ñ8Å0àïß~Û}&ß ï|}øKÿêhþÜÿï׿oïÿüäÇÛàûÎufÿâßà .¸pýÞ¾Ú7þk÷×?4¿õKp‡q÷ÿ~Ъ“S‹ÖñrêÊ¿o»¢ÉXcœ±Ê5œ‹~º'ÇÞýÒvZFÛ)έQ–MÕŠã°5 ·<4ØÛÄ¡–ÔñDh¶lkœ)ŠLúÎt‡m Ö-¦˜j)Å,·6ûñe[;’Õ:%¹´B«=ö,ÐΉþµ•þgÆÖ…¤n?ÝB*‡ZJEÇ;“†¯ûñe[óì‡ú’%Å+J¾D:~zÞ}|âJº½Qxþ¥_ÉÁ² žûíêæÃ^]ožjþȘ|ú¡yþu×µº“V¦hha°åjáµ؇Áp[Ôü>öaŸ 4äý|~îebm;vZƒ+°åa>E7ž!å#&¬Ë2¦^µü”‘ü»LÅMÒWBÝÂø‚çÁ+áNÓbF ‘'¹mÒàÇJw*±„t¥ÿQ´¾-¬)„'Ú.AùmêIR¼L‹<Î)ý¡ÇÏ u+Ýz:°Å‹éÔÑaÔ\·lXÍ+ÙAtc-¶ÇO¾‘¥à£ƒòª1G9oµêI¡O^·R8.Þ.€Ãùx7š/x¯ÕK÷ëG•­5X<ãC—Öu̼["¦ûmË«ñ9RKHqHµÈÎ1ÿÝQ­¦ŒæÏ(¦ÜEn5aø92ˆ”$³Øcê™à–`ˆk8Èx¥"š¡+…ÁðÁ¶0Ç}“Ë£ß9}ÇÃc™vÓlSk$n¡èn“:«›“nlO°8q6^x ü˜„XÀ±î„ æ›a‰˜1H°"ʨ›‰ä}#’á ±e:†´ ,8ÅÂh0]:Bñœaà(˜]Œ°ó|0Ûä8kÁ'ÌÈYžÎ8ŒÙâý0|ÒÂk+˜n5 xƒ'û,= h™8åqæë3DÌ-Rd+i4,‚ªÞGò]÷ƒÑ¯šb‘±.¢µjÛ¨¸ÍL%ÖZlíq­#kªn£›º«º¹uݤœÈªnÆtón<þˆ+Ïà ð~ðÚ ÁAë6ÍÇ›ÃAìoTåÞ|”ÎVÝܺnV¥ú(ÕGY„ƒœ›Móñæpk`õQîÌGáRWÝܺnV¥ú(ÕG!W[[ÁÜ{q=WC:£Ü4E5$.¯º\—–´f|NIؘzr\g+ž.M‡ ²"åÃiK;“X>£êzCñJ‚ªCRé/¡?I!:…·]a<¥(ƒå¿kZᅳ†•õ¶àpÕcÂAæ”aÏÐÛ€âø©!«g<½P€!›ñä.M¤³iÐcaƒûSŸSáÃå´0ü=_gùÒø|$Á3'Di6}ïǹ>xm›ŒäŒ wœUcÊãJL(±Šrn'Üp¢±ôáó'ŽwܘfD¢EÄ"Ew¬éÂ7(qÜÂ!O \r\YMyŽ ±…ß•`%w—yo©P82‰)¹Eà£Â6\¹Žm2îƒoê ÈÞé}IŸ>fqŒ›C {Ú§Ä’R¾ˆ;²l?õe*&mÁö1RÑõßÎGá=FE OªÃ‘»è EŒ!ñK®\eø¤JŠ‹:“ØaI"ÔwDn ÆóP¬ Æ'<áib RüŠ/¯ ÷-PvÙÓðÚðN¯oõ"èPnh~Q’Ò¶¤­!Šœ3(èp}y!Dø!¿RrDøÖr%˜?Y5Ý®£Ïmº~¼\âêÇëc–å¤g(£ÃYåÒ-ºÝþ걓È÷j$õÓÖÄæä°fKn'qã7Æ J¼|›¼¯>Æ=ù”œñõm`N|‹nÞ¿›ØIÉ'7±³bôV‘+'¨Ñ÷,ä™Õ©‹2Ÿ¶’WžPj_Æ>,¿PæF‘"j ˵ۦ ÄدoA"Ñ Œ]ø[¡·ª ž œQ$ÔLD¨ƒ£"8gwª)õµ° ¯ ŒHºÙ3pµ)_ €}ž'%ú˜ …"ß3U†ž©Ü«¢o“¦Ø38OÄŸ#ÄØ1þGæÁ«&Ô%o3ÊŸU›ÌJ:sõ*R\’âMa;“Ö ­93š6^¹nlîüW¶–MfWo–ì;ÜX-h(Txµ—érgb«^­ý­úΖçÎæÌMXyŒˆµ¹3"’ðŒ,>¿JyÑÍ2üPÛeÏn¤­Ã*Ù/HZƒAª¸§ì‡q¿¯çø¿Ù˜?á€ûDpF¸§k%'‰O4i¥×,WT’(g›zkW¶[»HU({/¥gúœ¹ÕLßýÔ©Ö» h;-ù.ˆÄOnžtîVs€õ¹Þ¼’Ô±Üù¯úüp2–6›Q=þêñS=þ¤’¸a$æâ¾·Ù²Í“E}RºZ£jîÎåD|•û¾óœU`É~Ÿö&íÌMú2Næ—8ÇÄéû²r}§åVÊÓq„*–ŒQqÇTvŸ²Önµî0í~’Þ¬ž+Š|W–ŽémßYkZbzV+,c\¨–wUaI±FeWX:f³ßüZë®jÜ+:Z{¥Æ´Âë®ën5O]k©ïª–špú½¹[ÐJ>³SnN+¡&Ìqž;LùŽ Š6Qt³ «Åeî OµZÕj•aµ6Šÿe`¹Î;Í™§ã6}v°S*v˜Rœ¾âtt´F¡ßgp³lËq‘¨E £¹1¨±ŠšVp7u`†jÕ0h ¸º•Âñ÷kdãùàÒððá p>†ilÔL5è wá½Õs»ÀKÃ$Ç-Á’4äÎôAü=O\G™°z§pø Ìð`ƶQÆòyqšsÆõ÷¢»ÖuÌL>¬ P^Â5„¦ÀãäA<øNáãeåfºrA>†è5cEP "€êpqâ5M„á#¨BÚ-y?Kaâž|ÛÀH-bÙ «œµÆ˜ö:ßÑóc|4n™â!^»(ÏJαg3,fW t—Q6øÅ&Þ Sx9wkÑ«vCá[Ñ6uýYê½mª²2€D<+0_†ãë©R|gnK®pZXÙZ` ÀsНPã¼ÕʼóÒðh>Ö6 q`_ÙÙ½ÈõèתåÐ1†)©~ÑZ ¤4#0ˆlí ‘Ç¿<ˆããˆô)| Í9†°ù¬ºÚ‘é~½žMb´“ÄIg0A¬,ÂY| XÍêP‚®bä˜XL>—†#™"1)"Æ«R|EãäøtOue¦®ÊÀ÷]rš_'èŽmnY9¿²ÎA†â¡Â>8^ÌH4¬ÿm^zUê5eÿÿçÛ÷ˆn…JÉ^•òKT-£]/ê³3 ï·qÎÝì¸i\l$;}¡Ã@+cZs^è;Õ‚;ˆ˜°­[ÍAì™–Ae¥lE÷Þqðj uk&Œmð¹yìÓÁ>ƒëbE+ØÁ}mùGÄñí;ð³^¶Îìð õñt®…£}xP˜×ÇslÎÞýÚ °@êö¯…>})K„Û9à˜sPüãºg$Þ?ŒsNFá<þTôö<Æ™Á2È—VáT„ïÁ(á;|HÂgç˜iùþÌøžá²Õ»çZÌ[ìMˆ»Í—Ýÿk¦¬/ endstream endobj 6664 0 obj 2972 endobj 6668 0 obj [454 /XYZ 40.7999999 80.6599999 0] endobj 6669 0 obj [454 /XYZ 40.7999999 552.980000 0] endobj 6670 0 obj [454 /XYZ 40.7999999 80.6599999 0] endobj 6671 0 obj [454 /XYZ 40.7999999 552.980000 0] endobj 6667 0 obj << /Type /Page /Parent 2 0 R /Contents 6672 0 R /Resources 6674 0 R /Annots 6675 0 R /MediaBox [0 0 595 842] >> endobj 6674 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6675 0 obj [ ] endobj 6672 0 obj << /Length 6673 0 R /Filter /FlateDecode >> stream xœí][‹¹~Ÿ_ÑÏ-—¤ºB¬o<Œ yyÞlÂ/qö!?Õ]ªî±ÔŸ¤st¤®nÏ<3­)•¤s¿êÕ?þýðÏ߯Þ|üÏá³ýþæãSÛ´C»~Žÿ~xþž£×Ç©oô|ü:|þòôõðõéÃÓ‡åÿ¯Oj8=h¿-ƒÛ+Ö ûüëÓ«õåOë'ßüyùé}øÓòÛ/‡¿þmùö“ïø_ž¦y8þðïõ¥•ž–_žÿtü×Ó_~wøuYÂtš÷øÿ}ßJé¬u|=?ªNÿž?Š^Ö†iÒCwX~_ÖÙ/Çñß<ý¼Ìv^F3uF™Q÷ÝòówŸÛLÙ6›^f¢ãŠTÖ惇3qÏ}nÛnÝäB(yÛ¼L•;‘2ƒÌDÇ©¼­Ù“L%ÉæN ‘Áy¦ìCì• œV$Bx&QXôøn\uÙg¸M•;Ñ0ÉHƒÓŠTÞÖ6hxS}ÑôE{øxðõ§§Wï磦ôéçe'ukýöéËS·ürT!Æéðé§ÃïÛVM8|úå´:û>}06ílÆ~UØÖ‘öÝi¤_´µIéþùHéšn}¤M˜M¿s_<¢IZ¼¤uõC£Õ䌼Yg»|08ïÓÜŽûlàL¼×àupð`Uë,º5p%pz HÂF!ÌÛÑ}_úy*JÞ÷âÆÏxӃſû´PqšÔƒqˆ2°o½îÙzt€i:ULJ© ¥{ø—qF”»üÑç#oÓÜ;4uú@ém% “àg( Ç,ÀC(È'}Æâƒ]e+ä¾êµ‹î>Í:ûÜŒC?|³Oí½&an¡:3†ÑƒÃ0Ì{»öÞÃ<¢Ðˆná33yWšMºsÙ$AN{t ˜DYÈ }Ÿ¹t>¦ hw¯Ñˆé³žgÅD¼Ó‚8:Îs G=f@ZÈÍ|Ž”.÷£’³L ‚põÄ^ZºBš¥c¡Ç9ŠtL€Ä#ú=_åCì¶ ém–íõ1¤¬ïNÀè’á®éÄ̳€u3®òÃLݶŒ¡*ÞAÓ›#±@»6‚Í+¸ M‹š= ›0pÕÀ÷´Ðôk±A„ŸaÀG½¥ï4p¢š~ÖÚ,˜B i¡!€ÂTκÖ|ËN¯™ÖØU€Ï Â$€ø=˜j”±gì3ŽÀ÷ì¬Àð;åÌÖA7 Ï˜¹"–kÅr&±°|ÇØ§ñ„°,Õbü¬ :øX”iS–ñ~ðé샚†óî8ºÖ³b‘¤±ô<ƒ6³1¸C@;Ä#x6^ÖÒZ5ƒs ‡Ÿ1x1û¡Žs†ÖÆáòbŸÆ< ÃDT¢vXB‹ªÃzVENÚ«³£ù…“Þ)' Ø~ ¿ÁnøØíÒÞ Ûà)ÞÞbÅÚjà=Œ`¾µãê@«ïãvÏ]ŽhÈû8Ðêö­±ÛÍù C rimq,Á]XhƒÚü½"ü‚¥~ê`µ¼Í/2ÕbÅ9 %'–N²’ó>í–ª4<Ì4Œ“ëXÊп¾D|òo&'žV“¶¦©2f ÌHàì8Òî´Ãg€íî ’sâ|½zâÄqØŒŽ‹ƒº]¿.è†G¶øüØ;#%2ý™À{fôŒYÑHu[vÑT«‹\µÍšu䩤CcN‰ ¾ù:5Íìp‰þʈMì¸6cÕ6‡\™ftßÓ¢ýàU+¼êumccæöÛ¤,£Ð{ÔŠÈ}£½L-…®‘¬²é»µZQJ~g<ÿ+PIFȆ”¨ ¡ä¾äŒ‰8æᤣt8ú…P’€õŸe 0!#Íz™C¬JDÂ$ÐòÛpB³(Jsrûã¤*ÉoJ2y3;\Þê‚S3¹bJE¹B Õ“ùSܽšR‘2kq0j,E 51©Qj€<Òf0ŒÀê%ËäýgÝzî£ÀpjHãKÃÀL1!TNàTk/¡:ZÄjísZ²9£ØÊšº™¬M «±ä$lsJv¼º O ”‚g*®YQäls8‘êBÌɬçïÊJ8#^ꢊO¥Þ!y’V¢øÇ×–@5PkV+„\„V9mWîªI·OL¸”0£ë…70´šµ&Ó%ºãÜÜ@,×ìy?8&†ã8v#²8GcϧÀ6Ž/pò“YÑYNžã=œJ©@¼ó4b¥Ã üi6ÑõÎペUeø=Œl¬òŒå#Ó Ã E*Æzçs¾†Õ&Ë«[ó9ÖEéY$áh¼k5‹Õ… f‰4>ñþt]͠眴h¼†Ð´¯p”-¢º”÷â׈ôiLo|–…|wXº£»$£Ö£Ã©)^o½"¾ìçÄ=Ÿ-Œ°š¨Æûj}7> 2Àþj/öNà9}LoÕùë1ck¬¶l˜r±nå903º9SØÃÝÆjëÛNA´ˆGeõ¿öšàÞL÷LG›IjЖ`DXÙØ6ÚØvy_Ï^[]Bþ \V°2Ïm|0 N×sŽEˆ—u?–ÀjGE8à›Ç„3zJ߬£Žô»“*c:‡ =˜Ód?É2ãuskÆoaô0áXxm;>·@¼û÷q­n2ŽOT´3I îĈÊÝéàhÎ÷sp§;?Îm?Äar—ý΄£ìõ"†s;æt\xéè¸y&+dy,‡[œÉqóβ#-ì8ˆGÔˆ{¤Uê:„WÐã N§~÷µgö\¯ãu¤ÄœÓéå>3‡ö!Ÿ•Úr¶jeôÌjØÌbÛNàŠ9+,|×>IBXh? •ó¯†õË;¼Ó+ã¢ñ' g™²ãýP[›L+$õƒ+¼<NÜ,šÛ(…*s/Ðþx!öE)â,{Ùm?¼u¢Ù]i!/,T…Þ# ÐE`ç1õ§d:Ð<ºbò6VöE:ø!ƒå¥9€d—ÆÉ„®u欦Í;¨â·?ºõ„€È5¦9yZ9ͺjµ€a˜j¢®…»Lä¤9±®ûËOs.™tÓj‡P´BmǘÎÐO|½ˆ±4‚¨iu!ÜЂÑäŽ%Û$z¯ÉÖ,í¦EI-‡æX"M % …:šµðe¼„n‰¦~™Ú¨‡ßËRƒL`;nŸB˜UÂÍ–sŒw`ý„à®Ý ZsÊál_4Ìá³ ooðêK“N‚¿—PÎ[D±ŠôrP&®ÜÐpQC:, Õ­0fUb‰ 1?gÝã†!w]²*#’%ºòíÙüÀÛâ½®9‚>£Ì~=ÙE5FëJ•ªHÏUBx‘öÈšõÌ*BG͇ ætƒËÕ94X«|NŠ”-Ün† ÇÎ_ÂJ‹4¾’E¶Î8O–x,çe d–.üÔUÄpª7Á×ÂË¡J‰•}B÷R×»Œ*Þ ¡vG»:$Hñ7aÜõtKÁ®_%³FO`ÕjÁ¯º&tA‘eQ’K«”v»ûö¦ÞëWp œ C}ÖU¿¦Â~%r]“ˆ¸¸o×û^dxAÑ‹"ç AÿßA°€H”ÓÕªˆW€£íË^’g[›¤P6Îv³wø¦de¥çØÅ/õ2 Óç”áû” ^vìÏêŽ{œE5ˆû •¸ ÊÁ¦i?“;uøÇ÷ÒÕ6…ƒ[ž<ç¯xçœÀღy”éb^¦€mGÆ1Û‰X+~7~‚AÛø|©T-õ ûì}Žý6íe—"¼Ž qÉD Ý9GHÉ!xíëÜ‹½£ò¼˜®ÇˈAœÓ¯ôVÄ9hNÐÙ•œ³=ªØ'd±ºe3,ÝÜÃ08IVäJw`ÕÞ,òæFì>mý0¹"ƒPaà›yjYzäa¥–Aћݟ“½æñö[äfY^L¦h¡ØCÄ GA1<‰G·¹À»lÆ4¹ªý÷€1µî.é·sͳv…u 0®CJñßk ù|êž=O9—==FŠENóJ¦ ¦´½h_øŠÛkõ,ð3[ïÌV9Áp<òb³$°Î2¡ñ²"²’lX)—‹Ðq4I(páH¼C‰D‰«B^Âÿ•àìÙqE惛¸û‘¸eCÞ²m=(M}*¹ñ¢Ñf‘n*mŒŠ ùÚÝ䊌{$šä3'E[ë h-‚u¼ù¾²tÉ+™,RÞ6‹F†‹LÆsº­Å*à”¤¢€PÂd,R°ñŽp‹t‘ ò,¡{‡Î–’Ýãè##ï*3­ÀMº­USíJ¹ÀŸJD(Xˆ`7¦û ²""ââôÕH_}¥.\“]¦n.£îïdÕØsN]~4ÿ$ë2‰Â) rá×­D¬›õ)+)êaëÖL¹cÙÓÄ0Mdç Å¥…» ã÷ŠXBð@¤ðf}ƒ9çȹ¤¢L,Ó'Ñ\Š»Òpw˜®ó'Ý…‡4GÖߺÿzI‡ÑŽò£eÓ¦dtFAOFr7…&Ó©ç¾ë£=TlááìŸ5»8ÏPJ9%.,xôt”Ê¢2Ç·7w÷-郛{—lo^¶ŽŒSùƒ£žéåÍ”ë4èáÅ—ð;%GÁÓ®VNµ°jãØ:uÔŒ¬9ÂÇÍM‰ËjsZ¤È„è¢Y>g*.ÆÍ_v–σ k.A„)¯UWü` \Dlö#ˆÕIŒÖ9W°Z]¸°ÈI˜•Y•§Òlp3b§-"]É ai¶ w·Æ%ÛôÆ*ÅïÊiÓL n›‰›+§¡¬ RT!-Ò–óÞýú[ÊÆl²N1=ÿ„Âc3î#©kÀñ c(V"p_†—“`M#»…у£doƒÙ“Q”Â*l¯¤×?¸cœp"¸ƒ)—–ÞOÑ¿Võ}EÿÓ8»<§NÑÿ^C ÞÛUx­½Äû™aIHd¿-+.ˬÅݵgžý’©†#˜èù,¤d³‹ÉÙ4¥å §Z´0UE—þ¸»~ëùaÛz_W‡F: üØó¾6‚®@CÉÒbd髯+h!iVÀÙ$«×\{ÏŸÁÐæœÜi‹gƒkcáÞ)>7|ÖFò 80å¬ÍÀ³6ðÜ0|Ø[C mªÖwÛ Y7^sú)Ƴ°%quûƒºs_B4uû¡•åézvé´ÃâйŠ,Õ̺±Ðsˆm™~tÎcfzÑh^I‘`fçl)Éúñ¾CŒ€÷M] ÃÙÄq(¨x`ó2`|pÌå»g^¡3v `ÅPÀ;ÅÐ*Ò¦š£FŽæ¸Ù8¦üŽMl…ñŸáèÃk ˜ò #t†ô°üÇX†ôþu;Y»¼;žÙWæ]ÆÌ颇íÊ@¾¢—…‚óGs*EÒ†q£(@¤€ÓH¤O}­{ˆÓ ôdº{Æ3‘ë^ÍFJ;HõÍéãœÓNÉ77½fwØYD8‰ ÝF‡!³j–°3K–ä -ŠTÜ&4A(’'˜ MÜGXÝ×¼Æ[X°fäSœÓm¨V¯³h&U‚Ï3ãrp¢ì‰ââbÐXÜûÆa¬Ë %¹"I²­lÀiŠÅ‹w‘E•ïõc­¸‹¼ aƽ½9z¡±«CȤ†Švb¬}÷ë6¼¨H$ô È*ÜCÌÇ=Žn²+Q¥a%ÞÁ®ÅPo×/ï®l‡=öÎÈ%ß‚ðŒ‚ÏÌèPT¦YKŸ=cÍç¦ÓΈ%›±1®bYàИsH›meñªmÖ˜yʪ͊µªÛ"í—Ùz4›­_"­ÍRǵUÃ>à-ÿ_[Øëñì·Ï_Hçck{ÁÖA| >Gôá –m\ ÎjX«¾¦=_cg`h†ë¡¨¹k—Óc3^ïz2^YjL£ç«m–û¾VÎà’ȵ÷Lð™>³’â¨Ýž }y g[çù'oáßZ=þÊߣg,?½6¢Ð>,Ë¥=c!FÙ»z–gžuÇŸu¿X¼Qh3ð@aÈA<°IUW0ÞF/®á(|MÏ{~{[ëá ÆI¿¬fvR¸{³øŸp𜧩u”>ß\A°ZXÞ+ÈwžþB€“ endstream endobj 6673 0 obj 4870 endobj 6677 0 obj [455 /XYZ 40.7999999 450.259999 0] endobj 6678 0 obj [455 /XYZ 40.7999999 247.699999 0] endobj 6679 0 obj [455 /XYZ 40.7999999 450.259999 0] endobj 6680 0 obj [455 /XYZ 40.7999999 247.699999 0] endobj 6676 0 obj << /Type /Page /Parent 2 0 R /Contents 6681 0 R /Resources 6683 0 R /Annots 6684 0 R /MediaBox [0 0 595 842] >> endobj 6683 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6684 0 obj [ ] endobj 6681 0 obj << /Length 6682 0 R /Filter /FlateDecode >> stream xœí]M㸽ûWø`4â—DÁéî™9hL9,rf³,2‹tö¿É’l·èGŠÅ"-÷¸˜öˆY$‹ÅbÕ«âÇ?ùÇþ—ß÷¿ügÿuúûøeWWuS?ûá÷Ãùi+%Ç­5•솟ý×o»×ýëîy÷ÜÿûºÍáÅéO_871Vøû×ßvÇÆwã“/í?ýo/÷éÿ÷ëþÇ¿÷~šê¾ðmg»føðïñƒBÚþ?矆Âíþö‡ýo= öPïðïc„•:Ž×ã«âð{þ*j¬Þ7¶kmO¢ý?¦Žÿþs÷s_Û‘ŒªÓB´nëÕµ¶r¨Ö ½ïÚf/ZáTêômeU©u–©¢"‘Ö5QëÖ_Ueµª•FÓ0L±VöŸ[5ý¬¦¸«k3u½«Ó:VUjER+žŠŠDZׯéðUÅ:ªoíÐõ~ö;¬*µ"ÝK-–ŠŠDZ׿éÀUSW3riSû9×”<`MÝñT4P$’z6<¬‰u4­åÙ$ΪJ­Èj¦ŠŠX6 _Uäe0tñ° ¬»éGvt®*uÄ„iÏЕ$umz§ªgÝMžt·WÏ‹/»Ÿ»AO}ù¹'ã ìŽ^¾íúV? \§÷/?íÿØk¼â‡ý˯;[Ùže¤9hÇc‰¨Ç’Óƒ.ô n–ìáASIa[SŸÕ^ËCI[ÕZ”<JôéTzüæé«²]R„k…•8íÉ?QÝ dSˆŽ MØå¨­oÆÓag—áf<#àÔºœrùiñ@K8ò˜xÅ0¥ùF´ð«ÎºpFíiýʉh×ÀpÚ˲1¸zd O/½ØL‚B+ ä`krÐöû =]eœþKXòˆJä,éâÛ•èÖö)žjOO!Õžþ|†ýiâ{ª rEÓéñ”<Å÷›Â5ä1<ØjüŽê ޼5ßÝÈ+(yJŽ|–ÿîF^ÀÚŠŽ¼T #%³ ìhžvà;“²xéÏEG^˹Õ'®V½¯®ïù,àêqØL¥¤o^®¢^XsÛƒê¸Gq&ý´Z6œÒóˆSÔxr®vE%øçä¡äd‚ˆÙq ¬µÌxzˆÇÇ)8Ž!‚r:t+ÁCÏrüæ¨ÞÓÑåœcvtÍ6ø¼IS:(“¶cˆX:EL9·•¦]ì+W7΂K£±Èj½5ìÜ%¸ŒKí›ñÎ@çeŽóÝl‹Å@úœYD ý†2¶t5´#3„¡ aIóÞÍ$Ù÷ iÍb-ºÜì %¨0‚ƒ¢x^pØÉ/Õ”œ1 ž)¨V’9–Š{Z¯—“T\< A1ÃólŬˆ2BsëvÎBsä:%,%渚ÀɆJ› Þ«m9†ûé•äÜL»Ø<›ÜúžÌ¢¥$`RÙc§0\‘JÄî[(»0ˆæÄ%ªqê 컣)Îzœ–ƒÔ lðUìøÀc°áôX¸6ø¬)¸j»n¦®OªVP#‰ûîè z©¤Ð#ÌcZØ“x¥B‘"HED¼H<'ÂĺÎ$h€Ò¿S”“Ôñ@9 ó˜gN®Î—žDk+Jñ –/žvXîÃÐLÔO7@ÖByi í q;÷-—0H®^luM²cªÝ£†Ž›x=þ\Pdœ’ùŒØšEɉ‘#ÞÑð½3mšÃÑsÃSÉ(m¥§³ç©¶ÔÎiY,K$|Ó6‰î ´Õ£xu5šlϨ®QI û3F›Jûç%ã"3•t2‡Àþ` D)®9EÊ_öSRm¥Ø9,®GBÔ8%­›ã1sÃóÚýY\®÷ÊÉaysÞeu@Þóè­o—²¸Wdã$ÀA8sŒÑg"§ðl #Ʀ§Åó ÀoéDÊ;õ”­Š „¸Œc¿{'vøõÌÎsC)%¨&b¯rŒÛØrqõHJTbѲœùk³Ø]"°ÑžÅ‘è%Ë-S,ÁJ×JC~½øãÐ%Ž·fn'n+æ€L—£½9ü·œäÅ»Xšƒ+9g¯vCÏM«~eéç¼`JJu$ïæ^ñ®n…xK“gâîe Ùª·p¯xÏjÅ<òf_Æ€{B™ÁnJP¾7˜57/¥?˜ÿKBñ[ÝæH¿Ð kBx„&À©)üB C¢„áy‚x/nrN=ÁwÀ½¯„ ñáwÞÛåkœÁš %BãV %ëOXOÃÜËLñÛcïCB¤VØÅõŸRp¼·Ì°+@.ÂéDDHé-dÙ̮̀„Ï)äµ\HyÏúZ›u 8%F>s¬VO@^D¿"„fc6g %KwÌI¶”,¸˜öäÈj LÁ©E”@%“²w)í NˆÓžxR¥HÔSJJ–‰êüŠ_gf]“.•9ÜÕ•ÈǼ7M+Þ„ ­~µXL.Iø1zkÀË—[õ¥ÚFñxþä ~w õ¹ÐÃÏèI$\*¨“ã9îiÆbú>ÑvX \7|–F´áÙ&ðÀ3ù@|F?Ý#r‰Ga;“:y•¯žÁ<éðט¹0SžywjqŸxxð‘ež­­›J ao'\ÀitçK%gžÃgN¹»ÞýóQS] endstream endobj 6682 0 obj 3574 endobj 6686 0 obj [456 /XYZ 40.7999999 456.019999 0] endobj 6687 0 obj [456 /XYZ 32.1599999 238.100000 0] endobj 6688 0 obj [456 /XYZ 40.7999999 456.019999 0] endobj 6689 0 obj [456 /XYZ 33.1199999 236.179999 0] endobj 6690 0 obj << /Type /Annot /Subtype /Link /Rect [448.799999 429.139999 508.319999 436.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 6685 0 obj << /Type /Page /Parent 2 0 R /Contents 6691 0 R /Resources 6693 0 R /Annots 6694 0 R /MediaBox [0 0 595 842] >> endobj 6693 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6694 0 obj [ 6690 0 R ] endobj 6691 0 obj << /Length 6692 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ!J‚žO€ l ‡E7›`±»ÈdùûQ·¨î¶¨âCê™¶±;íÖˆ,ëͪâÇ?ùGõ¯ß«_þS}Ó?¿šºQÍô§:þýpýïkÁ§]ßÖ|8þ©¾ýzx­^/‡—ñÿ¯¦N/êãÃyŠiÀß¿ývø8M~˜¾ùòø×ñÓÿ*^ýeü×ÏÕü¨Ç;þ¯‡~PÇ¿Lg¼ÿqýéøð߇¿ý¡úm¡?{üÿ‡¶P}¯çWÙéïõ«h²¦Rリã#œíˆŽÿþóðÓ8ÚŒzŒuJv÷¨‡m†NUÇÿÚÞÔX›ßP,r Ö*–d f$ji¬‘}¨º—‚‰Ž·ò¸ Ç-hûžŸ;¡ÿ,]1~Z:o†X,ÎCEoG?]’ޱ¸¥éí° •r;xÓµ§¥ É#*‹\²4lv‚ˆÅ-Mo‡e¨ºWúüì3QZùQºSV+ÓåßH&ò„M9y$>ç¡¢7fP"Í@GˆXÜÒæ6†zI¢ùE7¾Z^|øzøøÌ¤è¦ÀןFHNöÄôãë¸Ü¶ú0JÁÆýXý±i˜üSõõçÃP·ƒèÚÉq=ŸÐ“f€OÑŽßy†°)›€ïtpž|" ¨1®1ޚτ•B\ã•6=ĦižÏ_GêÏNË|ˆ å¶}[T¾“=‘}ÄžÜ(§B~ÄTçÁ£í~ïU÷þök –ìXV<æá)aÛ=õާžâª$<²i#4€E¦@­ŒŸX¸®úB`±’JB ×ä æÔ´RÄbiÁ'”ýiaÒÊâ <ä&.o`5]–Áˆ1ÚvÇ|ÿæ<9,±1aãmzX*žÅ+»MŠÝÉžôìýYæw¯ì´÷ãÄïoïï^Ù^¨Í1:í•%˜uSÊfšràKrëT«x{M¢Y÷Ë]éêà^.EA[ Þ³ïFµ 2™ªæ¬_UkH4ÇÉZNcÖåÚ“>Y.T3Íå )–ë[.˜OžF_÷C£| ‘dYŸ1ñˆe¬n¥:âÍgx–¨X~AYŽIWŽÆ„cy€GH8`ý7ã‚ÂD,aÎàk8HŒ´à .Tys¾åËA({í!;k,kùÆžü\N3)9Çç$ޱ`ÏÚ‚0ZOœ(ÖÏö1£’†Rsd¨Å6$¶¹ ®$ö æ9ž[c¿–¸A¡}Üû °êçXƒýד"vÍl”¾5i³ëÓò‚´Øñ9Ær—CåäЮµà.dd'½%áÖ2²coMFî:v]’»9;è.#ï2²”ŒtÄ ûvVÜ)ã…yùI гðSFܳ¦[¬À1XÂ=8xDˆ òçåÞøG0H‘( ôÄ…ŒÏÃ]ÞñæP¢Ò!ÄÖ DÎýÃtFäÉÜHÿ8šX{rê ˆ'[h€@…æn¹ÃuþTb" £$€Ý³K#ÉÅB™‡ª¦Øàãÿ“"°û;È`K ?Áå„ïÇÛÀŸ¬á ºû@ï³K„à&ç9Jf+J-Ù~7Á¬ŒÂ›^ÆQPº¹ýI¾Ø{q±3î\Ï–K~ÕØ3¹œss½Ä¢ ° Ó˜¸x>l&ø›˜†u`*@|dK±S ¾7æ ð.°™ˆñi®ØP.!’Xc¸´…Ã+YÝõ¶u) Ë~g‡oåtgŠÂiØpšÀäõ¾Ÿ`K‘Í ndÅ~åàEþH”ŽM_hçv X6 ØßŽÈá²[î‹ÓIëHíÐ#.sJÂX»ýzü_“•yóoÊ„µäºb\¸´t¹} &óÎlK$[%3*(’½`DGurXº7¦ÞÞ_Èø3½e1ð,ýmM‚®YšÂ»9šÎÓjû¥!äÖ1§½Iâ¿)1C·˜Üñf3Š×n"i(§,*:Øã ¥ºc“Ç_ølà ¦äù¤ólʹy|ª@à¡ x͘ ýPü=MÀR„IÝ8:¥˜”Sïˆ`‰IÞþÆ¡XV˸3JÞ¼’&Õã­R_ 7;…^°]ºE*E—çOàíB'8ÂŒ+ùMbJy€cÙä©x|[U»1õŒ¥RÄ–þ2I.ûÛY!¤ýþ4A¼ày±Á¼dìáà×$m׃d­Ã†ùÀÏ‚¸‹A€¥k¿«íÆè°w;ry‚Ý ¸½¹w#÷6Ü£¦T·wše’ã‹4¡GJO 8¼ç‡rj+x¥ ü»ñ˜ñÖí…Ú6'\$ÛǃT6S†F“©W*ö#C7'Ô˜#%g"R錀±˜× ð¨q33<€©gQÔ†g•Ö¶É̇¥&ÊY0µ!»½Ú8`–÷°vrå­–wýb;®Î»3çuGÛšþâÖ¶ÝW»M 3CZæ¥HQÂÛ… †Œ '[p\HFI– $I*¤®¦4%I†ÿæÅªIq›‡œÐ'Éd$˜¬Ž5IžbD”Ö̈OÌ[ýþjî7PÇF„ “벺C*¤’ÑÄøe†GPÒŽâëâwB̼ť „Ñ8¶"醤q†¨üœ¤š ³ŠQÃçMJ@Ú³r¨`,å›,·Tq•ÅôIㆸ£þÇ"'Ÿ9K9çøšrÓ~€@OsŽ—´á=¥ Î#ÂawÎ,ÿÅóŠŒdù!}u¼d¥¼TM¤2 ß/q¨'áaZÙkOfdk‰c¸®aïôð½#&a]=Lè½¼ó€FcÓÞ±¦ž]®ž½!|y£ÉJÕâ´Q×Pãyðh „à9Z¼¯À&šG7àék©©ÒcÝ1t êG8ÄŽøŒž`ŒbØ4?²¶ž8Ég¥$¼Q¨ªP'OÞˆù X‹Z8õÂôæúëŽ “DÒÖþPŠØ))’‘¹›éHóžý'û!oª£n$âÂîÔ†€Ãš÷Ý ü%‡¥ªIf¿A)ïyp;9@W«ø@6¿£Ü‚‰o5´4ÙsµÒ êÀ.qëÆ¤ð”1¸ µHv—´#|Í 1ñý€–…ýÌöVذ2æ Ñ&uäKÙ&1Maé5Y'‚¿¦höEOßx± èrÙ©+ȉš˜˜½,GŽ(iÖ™KpÜi“X©QæKÚd2ÄSX”úO4Â449nõi§»£[76×ßürøb‘¨yDñ †PYlIqÙªd%¼¬¦@T mÝÐmU„s”EIÍ´¿×³Õ…¥Q€¤ ‡¸}{kî‹SF¦ÓÔä”muÛt@tÈ ²y"Ý ›6r—Ç®ô_xHOé­*¥\–‚×sÖÌW­i1ºæšCW_&ñ5c8lƒ-v¦ ×™5Oð tçñ倔‹þðJq¨2åf ÖÁaü¯opÀÇ5ž‡>Âûƒ±ƒŸìy·axϪ#ÐÁm^mI’IÕ–«$)rB ð;x=,4Š%y[PëñnÆÈ=ð}Ûï7#…ðÎQ0Š¡¶ÈÂÕéÙ‰WšìȃӥûˆK$Ë"ó€Gµn*Å8…œJÙo ­CÑn%1ßËÌ“v Z_Ž5'¶á ä°\iN×(Ö¢[ ‹u2Ö¯/.ç¼o•Æ(b[%¥> ÇÅZ{øÂw‚NµøqêR²[67i[Y:!`/ªÀeô²†óÒ²S9Ä•E–¢IË^â%–Bjì÷à'ìÝ`oíEî,¾!îlñK Q+,ÄÄÞ%2„ízÈÛkq,!%¤µk‹i®ÇÂY%eô¹zº”ŒNëݧï€. 2z{¿‹âYhKU‚¢èwŠÄ¿MiWTÖ(½Ç>„´›‹)-1¹‚ð6ŸÜOЈVÊ."|âRׇ¥EÒ¸8–~N¾ FÚ˜hóž)îÝ–l¬]D=o𞸞”YÝ0Çm±’Û}Ååjv÷©ç—Š}OŒ/Éäú]qÙ…OƯôÆ7Ãâ%>± ëŒ2†¹^[ÔbÊióy21§ª•QãÝÀwž@ê”Ø«_I Üt"ÑÕCïýÎ\KË}–hÂ¯à¸ÆâõD²6z`kÌ5µ’§TØË;ð‰ÿÄ deíëÈüiümsÎH†5hM](·T‘Á¤LbèÐãqoV@‹Î€¦ …Òšcº8? ¿cŽDJ¥Ëܘ*I(w«)wvº‘Ï}K·›ºnúW5Ü[z(ËÝBÈ“ÏY ¶m¥Šgvx»z™Í 雂i.Ïm”kÐ(*w·•–­dÊì¸*µ4w±'Ïí“EYaóˆ¡]ÂЗÛÒU[ÆÅö£_¿X,7I=æaCâØÏ=]eïZU‰I®kNÚGz³Bت´@8€Ÿã–¸ê‹§ÒÎ&â(¥–2uwX@u·¿ñçÞ#Ó £ö½”Ì”³B_Š„U?·`‚ÂÌBIÚóÇp ‚™lAAŒƒ‡Qn(°€›(áˈb}·’×ÉvkÊ/â²­[h®R²I@ÛË%qJ%Eˆ’à™´±Nò¦$ÆR’O-ëÁ%”ŒââËQ:Æ¡…‚%õ-m!1N½À8 $Þf¢.|Á‰Ë–játÞ´£í# B1`Ë.”XX}Ad¡yÌ'„b"JÙ©`óÖ”bG,/-°aR„Ô|ÏCIp¦ èÍ¢kqª†:-%RZÎÜ­¤ÄVÒÞ[š¨öœÂF(X ð ætRÛ)JY¶ vÑìAuÜI¿i7Üù>ŠïËPÅÀ6 ÅŽyXw…Ú Šy yuì9QZQÚŠÕ úGvCcJ¢P¥$½PãR,®ÇâÃ'˜Ÿ÷á·w² Ë´š†"‹qöh’rÇôB ézaç,œ‘¶à®§Å:Ã¥µÊp ê"8°¨Ô«HïòÅF¿‚·Ú³|¡¬gÏò¯gïò¥o¢ ]#eÒø·z—ÁÔ ,ýãÛ¯A÷Ã\Ý=óbE‰õUwñ¡ªØ¸ŒTŠ©©ö¤Íùø@_þªjµžÞ6ÈzÂÌÕ“‰ýxWwëiÝÊ“)T&D͇ջ¾Ú¶VÓ!øåIçéá;|gu¯y#¾+Ôbxm´‰™¯¿y‚¿«Ó¿VVøŒÞÑÉkOZ‡>´ {GïXÈÚ5l'ˆ ºãgÞž;0Xv›@š}×ÞqR3FÓje…ô±Ø–ðˆs¼ëZѵ…ÒBƒºÖžÀõ褧µy0vž¡|Ã\ù„d‚‚±÷庾6‚û¾Q5;–;~Ï– 2ŸŽÛ¯=¹òð_RjÇêåðƒÂïÇ endstream endobj 6692 0 obj 4091 endobj 6696 0 obj [457 /XYZ 32.1599999 605.779999 0] endobj 6697 0 obj [457 /XYZ 40.7999999 469.459999 0] endobj 6698 0 obj [457 /XYZ 40.7999999 469.459999 0] endobj 6699 0 obj [457 /XYZ 33.1199999 603.859999 0] endobj 6695 0 obj << /Type /Page /Parent 2 0 R /Contents 6700 0 R /Resources 6702 0 R /Annots 6703 0 R /MediaBox [0 0 595 842] >> endobj 6702 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6703 0 obj [ ] endobj 6700 0 obj << /Length 6701 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€)‹‹6`Àv»äÀ°‚O&Á 3ˆ“Cþ~T%ª«›ÔGñ=.’ªeîv±Äåñí›ÞýáËßNÿøïéÝÇ/ÿ>}3??~y¨ÎUSN—¿?¼ü@vg%Ç_Û®>Ëþòçôíׇï§ïŸ>ÿ~ÍõAócœ–'üï·ßÞ‹?ŒŸ|ùø§á·ÿäéÃÿ~9ýå¯ÃŸÌ|—/üúÐõÍå—¿)d7üçåo—Á>üùw§ß†-t×y/ÿþP×Z꾉ÚÇ÷çGÅõïËGÑbÕ©ée'äI9ì³ÀñŸ¿?ü<Ìö¼s¯…hÝVÁ³¶ò2m­õ©o›“f¶'uÎ6•ˆ¨oTš‰.;qG•nýS;­„j‡o\®áru×Éá÷V™?á;V•¨Ç£×2òð·©b'M“f¢ËŽDÜÑÌux¦:wùY¨»¬"/ä6,yšY†Ipª6È]·±à¬‘‰jDŸf¢ËŽDÔɦû…3±áÞtÝxÈcá5M;Q7àWšv$âŽ6AOÅ}׊ë1[WnQffŠX¯ñ´ËŽDÔÉ&ÀÙ¸pוéZ6±€ž*^ƒ¨L£$\w$âŽf ïNõ9‰Þ'ozßwσ¾>¼{Zu5÷ëÏÃN®ºòøãëpÜúôÃEÿ“ÃèO§«Jèߟ¾þòПë^µõ¨\oe¤z„#ŸàˆD#ZÐGÄG¸NŸiè{S È': Á°ö¬Ó—YGÁ[H»ŽÄÏÀÛ–wZ:Ü4³aèàÙÔxÒO_”£èz3|¨Ç‚iô^vÚ©hC~‡)Íÿ1χ<²‚´îáŘn“rvÏTøÌ á®=çùŸÁ#xoðæXÒ r5Ï:iå–¯˜jûrTÛW2†j7Œñß3ÂÀ—RÚ]b­kX!Å d0{¦U±~—l?=ØÌ°‰ëfúIðVï¯KÖguñx×.ûïl¬×·ÆëÔg=žãr8ÏÖ諆÷6g)ºY*{±ÞˆÚí¹ˆu[OÀ¯Š×…œ¶réíIZ¸i8½Vö¦?À11ÖÖ½"º˜ˆNgD ²•½°ï×&{ ”ç(»±½ &Wa?‹I@Ù˜\¯X‹°¹‚ó¬a¸30âо FüU<½sà‘au箯š×÷ˆ¡ï~qáœÂg0÷,,ÆbÁ¹f(l8` žMÁú~²i¯ Çg|w8Žu8BλœÄáB‹ëã«pÙ€3ë¨×q®usa?û¢yçN³ºwÁ wk˜rLvN)£f˘ %Q5íöñ3α]gÝpèíY…-­øg”D½pì Œš#¨@äø„3.w2 A¼#VQL´pQár|òpŠ“ÖWõ§TÈ´hã«Jw‹f„9evœg6Y"M»¸<‚c=xDÖh„åûÄF߆góÄ»JRCA÷ÜpZ(î_¶qÃ¢Š‰h»á]âËFnXÆDhwzÃ…ðÅ“ã€ï¾\œD ßx­Îä#Þ‹Ö)ÙëNf4ü¸úÆ•SXϘ BÞ6î~2²¦æ÷öWÜOÌ 46Љv2Dl$Õ¹ÑWÿH/š.Öu©Àw+1Òšúê®x1‰t=5BÕh§ÝFžœ3?ÂïºóºO?A0Ø0fÉÌB3ƒ‡•Îw ÒŠþÜw׉}óÂ[û3igsRðJð½&îþ°’õ¤»y á!$Ç}e¸ˆÏ ].Ÿ&'ÚÄq“bWÛ ¼E„×<^ ‚Û3Â!æÙ+ô-¹žgÿb8Ò¢ŽÏóh‰f÷‹á.ÇÑ Êýa§-ÞlŠ€‹äáNB|³¬(ÂmÉ rB‰—?¦Û6–8!„8X1Ýð OTèè>¤ÕrœËèçs^w‚ L’‚‰‚Á©Ãu<¼ÅYfYÆÇDÞð!lÈÖ¥Tn8*!!ãÖ\%I²A¹I’,î3g$µ’ÿOÌôÚăug†NÃ.&›y0#[ñ:ùdò"U¢~mká‘;£Ãä X¸­¢Ÿ(@` ‰f. ^N7 ¨&œ´!œ2R&€,‚a[V’yP.…Ùì&úR5°‘|õY’6/ȃ]Ç'A £ÃqCIû# ‡LÃ} ˜Ëð‚×0 S2µ8Ž7çRŽÄÕ%ƒ>¿ö¤ª)sKM1Þ¶±øTž2/M¦àN½+Y2‰‡” ’Nâp#OòqRŘåÆd#QË(¨,ÇAú§Ï‡¹m ‚ÉC spD|¸n±Ìæ]e:+]fUÀ×/-ÑÀ"ùpw$Eçc0HÏî#ê6X¬K›;·=y8Q8@r6M(YKŠ…s0Ê2e`;ænŽ¡°xJ, ¹*KÜ2g”AiKòäv¸ÄÔ1*Ø^Ží.6÷(`FÊç¸Pß ÇÜÆœÝ6üY¡|¸Ù€p._ª¢·ã¦\?G¢L–\@1Þb´Î©4„4Ž…*F`ÝMÏ ÕôÔíÓÁª€„‰Õ1$Þb½³ÈßúLP×)É$ñBÝG!A¨`cŽÑ†Ðm$ÀÿîÌ£ˆÆˆÀç¶ÜÞ;ŒîùEFÛw–È(c¿m@MŒéµ±l‰G:qL׬HÑèp™…ðЄ”RÀ8¾UØæ¥¸ÌÙH”€‘k'8¸SÊ)BJw„˜8ÊDF„—²µ1>®Ÿ¢C ¸)bù™{eNZ`Å‚“–èl/¦DCV†”˘j—ƒ1!nBzR)¡’i-©‡ƒ\™I2Y—Õgìä45yõ´ƒÛŽè|€â¬Lµ«F®Ióm’dFdÊ`Œð8&Ñ> ¶~¡ÚºmwlÌcx¬éÑ©«Þ– R`¹ §'Sº³/¶Š¦È Œ5?&fw÷!ÖÂ5¬\ç­xÒ\AéN/÷žcÐkVR¬P×·%”Ò´`ôމ1,RêvlÄÞê˜êsÀ34€o¸bDiE~<±XD#"¯†’‚ÁáÛœR7‚ÀÈ\–Å7Ç’ ‹æ° a¸×bz×P|Öû0´T/-6»ÜŸÇÂ{oÁõˆàÜ{ñúáÏëgé¦1¨åi{¸èøÚå¼Yœæý[ê Ò‰ÎYîˆnNâ‘á“TEÏ]ùË FB—˜Þ‰—FÔ’I<¿‰­E¡¤ª##“¦H ‹/Mƒð䜓œYVº¶IàHk¹S~Y;Nɶ}Qº²µZÿ]‘ÿæN¯ÌÉwwçÌjTksóƒï®Îw×ò¤¸E%NÔ›•‘8ŸÙ©ÅÔ‘•‘)üPÌQ¸~}sÎ øưš^жšš–4ÕçÞ*!j뵪­ ª¬«Û:)«àd†åé+ŒA‚kªc²w“ˆzlÆdå ûœì¾î-~¿O•$@»? Ù•Ûñï±²žSˆKè˽šÿh-`1òÎÝ ”é ê²÷Å«'d ⯦¡¾$ÕÙù#Ñ­­«¿½Vy{ˆ…¯Ÿ=¬u¿¬õìÚ÷Mà€úS8§Ï#È5×9BpE®^p‘uí<ƒ’Br¦ÐÖ6¯Ùy’Û}cB&?Ûñ2 ÜÌË€‚.MýuæPB’²Ž™”6©q§qçV7¶¶Éy33Áb…#ømö,^½ØQ…Ò¹ÐeÆMžÜç2Í—ΔP'ëzÔD?›lh¸D׽Ɣþ|ÝÚŒŒ›™NÔÖÖˆxžÁ#œÙL¯™g ó¨ÔÖ ÚÑèunn×5|fPÒÎ Žà<ÑO*>ÁÙðFúìÎÚÌm'8Ÿ1±9«+Ù¼|æ„(ž­Ï-#C¦~nÑ›)éç¾L/*†å,C"º"*sÁpÌ;8/.ÃÊ|’îQËaú› !q†÷îŸöàM†ž ¾$‰;g„ÚÅ–5Óqw[xüï„û'ô1ÞNË5ìŠ(4Ü^Ç̨žk×ã°’· ùr8u’¬o&ÁxWFÌK´ðLú‡3XBŒk8 igÖæàµ±î^ÀáH9è[Kl¹ÂÔñ»Š)nŽ»êñ …šn7@ö2ºÿ,²§æìswþ-]ŠDÏ^Y: 6oob“%‘w„VŠŒeÇuߘUÕ³Ê9ÿ#ù€F̌̕HøLw 4¢}Æ©67ò‘¾‰g“t¸á|™Û\G¿‡ÏÔôgL ÇtàÈ–qG@ˆþH:(Õ,£©-Džë9Ÿ${:&ŒT˜g.Ç”WSŽ–¯ïÌ?´RÒöjïbŒz}"ÁÝ‘"¿š•H0E—ßoÎ) ôZÌ›ZV'·éµl[‹û÷Zfñ…—¶ÿvÏÂï¾Wß >~Cò.ägž’Ç,ŽÖëL)uk½C‰RºÄ(·q'¹4æü²­WÊ–m)£×OÝ#˜- a(õ^ÅŒÕfJ5£hº¥dƒ¬>E¤aµæÏ÷¡8íOò¨›ëS8ÂñìÓ“¤r–fµz‰Rô9©bIU5Nƒã 4<}›Ey8öÃÈDð¬sj^éjµqö¤¨AØŒAØVŠ×; <ÁOð †ò8A1üŒ'h‰i0héÙ@¾™`¯xÆ€9Y¶l-ž½E$ÊÓ¶ƒ=¦ äN£¶û ÷/“å®:¿G$Òyò‘—›*å¡4›ˆ27•7 E¬Ö¾ÒÓù«õ°Z,nµ–Ár©,¿Í†ýr¯åA‰)£ÂÞ^¼ŽB褣ͯMßNNÓÕJŒ÷]&¼ s|G–Tæž÷®ÿs;áÎÎqöd‚$}ßÁ¬MB;=HËN¨pÛ‡Ó•Ò$¿‹©qLx‡ÇcнÈÐcš®÷¼_˜êP§<Ñ…é¾¥A¦8 ‡}âMÓI¿Ýv'„®®iÜ1%£TÌ©)B5â &&”߇·ÜMó.Sä ôÀËÞPÜi8«€¶ÐÈ>&¨é, ÛÑ÷vär§ì€jÍí)rü`æ­uIÞI» ‹ÐîàÍØØ;@]/bé!.Ç´Õçc™îoê½y]«,³k?Agæ‰kU„ÞR‘äXx×>-Q Ò²‡·îÀ:OŸVŽØHŠž‘råÛºê¤YõÜA¸Êß=…§µ¨Ä2ä÷\€A[§\цÒR‚Itï ºâÛ‚7ì¹ûreZ¨~ñ†ÒŽ$¦[xœR)N+V >ÏRp¬¨»ÒXqg…‡žóà`Œ…š€§TóbF¹1¦³`ìsàïÀØÝb,Ö6±äeH†`ìí}A°H¹ä~¤šRƒ·¬• ¬=0ßp‚K7¬9¾-m^ÖjwRR›—­\¦ C îU âö ¯Ï~u=ÙOþ“0É9ü=}&½|Áüøö«g'îªÛ>{á}tñô]sÃ1æú÷¢9_ã'õ\ÅcP¢iÎÍ|%[¯Ï#d&Ûs;ŸiÚÎŒŒâC©³ìgãu}nFGôm¤…ëtð™>3:[y–•zU—nsn¶‘,^~ò¿kâ3'|BϘÅ܈@ç0Ú3æÆ(g7{»@Ö]~—µh—o›† êÖݽ¦cˆ‰ªÌ`ˆx„Ø‹áçàŽû‰g/ º1ÏýCl2Q»9h@|Æëxfƒ˜î9i Ÿ°ÅÐQ•cL—øîà}ãÝJgƒÔ7ƒ/‚eT×uUs—,ž×ä' ‘McnäýKI˜P ž>?ü‚Ž[¥ endstream endobj 6701 0 obj 4536 endobj 6705 0 obj [458 /XYZ 40.7999999 376.339999 0] endobj 6706 0 obj [458 /XYZ 40.7999999 146.899999 0] endobj 6707 0 obj [458 /XYZ 40.7999999 669.139999 0] endobj 6708 0 obj [458 /XYZ 40.7999999 669.139999 0] endobj 6709 0 obj [458 /XYZ 40.7999999 376.339999 0] endobj 6710 0 obj [458 /XYZ 40.7999999 146.899999 0] endobj 6704 0 obj << /Type /Page /Parent 2 0 R /Contents 6711 0 R /Resources 6713 0 R /Annots 6714 0 R /MediaBox [0 0 595 842] >> endobj 6713 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 6714 0 obj [ ] endobj 6711 0 obj << /Length 6712 0 R /Filter /FlateDecode >> stream xœí]K$¹q¾÷¯è³Õ&™oÀ°Ó=cÀƒÀÃc%Ù´‚F:èﻺ3««‡¬d#˜ÌêœvÙÉä#Ï/"~ú·_þçñÿñøÓÓ/{üuýýé—‡æÔ Íòëñå¿ß½ÿ;Z»üqœú“_~=þúÛÃ÷Çï_¾žÿÿýÁ ¯/®¿^>± ø_ÿúðÓòñ‡å_~yúóŸþùhÿýü·??þןûÃ:ÞËüö0ÍÃËþ²üÁXc§ó_Þÿéåáÿ=üç¿<þõ<…éuÜ—ÿÿ®ïûn°]Ö<¾¿½j^ÿ{ÿ*úXó8Ì]{žœ1ö<Ïþ¼ÿãßΣ½Mã4u­iGÛwç?ÏC76ý4ÙóŸÇvý•ô¥Ñ¾~j°ó8<š¹ñ>ä­7q¨ÜúÞÈ ô2#“·4Ótcx(Éã8ÿm^–>æ.þ:Tî@C+4ÐËŒLÞÒÖã uš;cÆ—cH¾sËìÆaZ–y>°Ì…¾ •;Ð|æ˜"½ÌÈä-í²õÞP_E8§½rÎï?}{øéËü"%¾ýé™Þþ¡±¯ÿ0žšyùÙëïGŸ–QßþÁàwá¼AdæêŽjÍòîiš›ÁöïòùõIÚ“ùá3¦/gzý‡ádÍä ߣA̱Ð/î»î`¦‰cÓ¢ÏN8N髲Úy¼iþ–á?;ß̼{fºvWmì—«6÷—©zýê|꽚Гugn=éàhÏè‰ý™þNg½’ú­ïà•~¡¯´ËVwfÚ?Pú­5|†ëžáúh <-U´ø´àwÚžNøIÑsìmá[×Âw',:ƒžð½q„ó>|>¢´Œ÷º(•ÏqJÂ;)6 [ðÙËÞ¦Oåv±oæè|;‚åÄ|åÞÅUg!ͭ÷»Ð9|·ðîàw O 씼þ‚ç¹UÏî(>Ÿ’\¤·Óå«ÏR_=r¾õI;,ŸœÆmó4˯ëVã'kì'ægô~í¾3£wV¥Í´§q±ê®£µ«åb‡þG;Ó<­hgwVr»õ¾cÌjV¶¯öÑÍ‹åíž^)žÁWjá æÕâk]+?Á»cÄ®OÄ‘òâÆYïòjdÞp#xÖ-ôøö64„ö6´Ñ}7 Á¾‡ŽÀL°‡?Éðúˆx™(£¦¯Âwq`w&Æ™VN KÂq¥ûðÆÚÏîb·¾!îúºÖ«7yì \8Šé/ßq9þ­][ø­1§¾^ö-@{wÇMɹ)"÷ Ý_IXèjÆâÖ”ýàˆ‚ƒ‰’üÔ˜ë`7ø”>|ú&|ËxŽž}a!Æ^føžËå|ŽLˆx”‰–ÔHÛÇ¿wÖ=>/™<¾(x®ÞÙçÕ¼KížÃ˜áÂW½;i÷°Æ‚¯=–õ±°›®%=õ£# vøc·t áPÇÚa žt‰`7 ‡`gVÀù£.ÉçÙ¸’¼>ö·zÔJì›_wtÍo ãÇS žÆlëî-'¨ Öt–œíO0böc@õá(nŒÄ%Å’%H·cëóO;ôîŽ×+¦ƒñít, y$âýc÷ð÷|˜QŽe…(yž ÂÌý\€/ª°%£m d˜æ4,Q‰«®pQ·ãè ø Áå—`^¥Ûø,íŸpËÉ]€…È0OŽñÊtoLëq‡8wÚ¥Ì*eÜ¥N´÷ç@‹E¶@„õî9¶ÜœcÐHÚ"2 vÍ ØçƒR=îK>WO§?ô¦.ãŒiÜ. ÁSe\#¤³Œ›ÄaÛªîmJ˜+::Kßô–—®ßrBd É"!Ž S$Æ"áöb u†dÑunU|‡ý©aÿ¬®Ó‹/[±åé*"F ©oÉBJp2NÊ hûû„ù"f Œ8`@ƒŠšw,Þ ¿×-‡aOËv29Þ{O7‰:ÈD´vI'…näÕ¶Ö¹9Gäu‘×vœS¬Ñ2WPP5EŠw3* ÖgGG5>ÍãÛ{”r)çñßÕeÜ:ü²o©ˆŠãºùÈ“}Àãyû„î(Òb¥Åd{W’(Ê`f^ s7¬~G#õÿó®¯i…W€(öât,ÿ}\ë’'íÕ•ºÅO0š7œ©‡„ç-Ülÿ–Jh'Œ<ÃOdÐAº¼23†#¦Î¡*¢)+ḱ1i ˜õJ¨”ØB5å N|¨w”-è:xœoã« ãeUB¨$?”›ä—UÜ$ó|÷´zŽV/Óg_F*f²ñ-¢H¸í ß[™dk¹µˆ†êqƪrÈ Ç••“á½²ŽÀó@²ž“ÀEPi$RHD$nVΕh­o5UJ^ጊ$šÂeò¤‹N@Z™… ‘£Ï®çT%ÍêZ<»GJMxl•ÀÛF±º;È6¼ :Õ ¦O³#¶·•Áþ¢À.Bµ-χ#bF‰Üší+¨¼qµÐ_}¾™€[áix†!å]Ž+q' *-§4n)'Ë>­uÈØ )|§³>¯Œ²_ ‡\¨".„O‡Q ,”¡0äÔ>R’Ÿõ©=¥«™cbˆ—V´]>eœGG$eÅ© ¥uU¹r.@)}8'I™…(•¶£½:nŒl·î0EISàX¹ÎIÔNp*ª½UÈ•¥ùðó¥5Kië8§H##¶ÃÊç¸æs‚™ºu |€G¡>~¡Q¼›„>yodxo´U(@ª"9Y3öe0(¯ºÎæš ìnr¤Ò]D«R»%ÒØ³¼pØZz†p" (‡C¦«¾¾KOVW$ brT"\øê9ý@ãî\Ñdœ8íI€••±úy.ü¦{èAͶ´§‰ÏPgÀö0îè„§-aâ%ÔWÜÜ?íyW &ä¢ã…Ä£¦ûáý£çèQvL$ºSªÀ-(ÐM…)V r² L"nÂqŠ¢r’Á$j5æ(‰YhÍ#ò}‘o‡E\ôBv7:¥&]Âë2uº8áÇtÍ”Òùšp[¶®Ú}ß ¤jOÆ û„NíqyÙš@ªF^ëÈ ín8û`!/{Z6Ç7( ¬R~¼¥¼da(QÊ^+B¢ãv…* ºÒ†bªm†dÆ¡¤R<΄H-N)/\›†àxñ~T$1þp!çI÷ú€'[›'² ƒHþ®¬uÀQ¿7ðn™X»V¼J‘g«L5@ï&pæ8Þ”ã|RIÇ©âE±ÿ0"¬œ#Ï<Ã3¹sx°Féæ«¢„¿Yw„{Õ°6 äjæÄ®…®ä´•©âä¢ÍwOÖncª‰p¸¤þ'éVÄÔ” íÈôŽïQ‘GЙ*”w"Ù ¡™^ z“ÝdháÊmÖêS& û51¼íàŠ/ÈZMsÀâjbµýÉs\ÝXîóVÒá~¥¥_uÌrW¢†S}ˆ`Д­Ž³“xzÛºlcßfë®Ðœ­„0n >ˆÃV¥h‰”REŠB0SxïÊÀ=ø95ë-ý]É$Y=q¹»7œ¡'–²s%« p5j´•ÛxŽÒ‰Œ2ݲ8ÐÝlHáSJù 9ÍJͳKg”êRáèÊ”9Àc),™ +À‡‹OÚvÐrБÝ.Íañ 0ž3ÁAU¨#jF™@x°N ?ˆ¿Šœjr…,{ŽXà Ô±… e-1ä.ªRRÈŸ'»…,Ý4v?;ûÞ¬åíKdJ` D‹}|¼*¥ŒÑrö¢Þ_Jw©w°99+õý¡,gÖvÓR>îÐ,V6;œã×í˜SMùϧÁpfó j6ØÞ懿^“&ï4Ä 齨ûª¯æA•L/Dñ~‰ä);œ7—ëÔDµ“u.réF½2ƒÀs¨®kG ¾@J5 ¬@àÙÈÃãÌh’•^²+—ÁFV¸r%€’Ièé˜Î^²âJé{Õ 4¡%+"Ê .Vº«^· @T(‚[¶ºX€ÚÓ›ž±tÊ]9€Eý 6*¸9“W‰ä‹7›æ ŠS‰OV5ñË]sY Xš[ˆz±»<ã^Ïžø 7 …‹ÁÖý§×¹õä‹ö©›qp÷… ˜Tºð‰âÆ}ÅžVOqŠ{¬ãV)'¾N1Dà®Õìn×L:ÑìmgL²àÚžœu¼‡Ã_›®3jJˆN4m"M÷&‰¶÷Ó 'ìÜIRŸr±YñœÚ*½kZY£+­¶÷ûÄTȆ¶et×ÀØRYcmàœí*£øî"jžAûŒžàÙ2‰9€ ÌzÝíóaÄ›‹¥–ÀO0Ì=wƒ„±ÆÂpäÔH%ó{ÕövÖaÍÛwn«/×–Àë3aî³´9_LðéTÒB¼ÃvÚ…cV'Q¬Âh‚¾»Þ•3:…(rI~!áÊ e’-+*)U‰¬/` w lTÙɨ ÔŒ;šºõ|nDArª…G 42ÀE<)‘ag ‹jb¦ûô›P³õ›Ól]¤©Z-L³( ÆA-qü²Åؼ$œÙ{H?ø‘C†…^usô´Óe6·E ¸:vPyCe˜'W(éXg{ËøÅ? ¹„ {C©(“Á•âóDª'fuäÉ,*dê‹ COT\  Þ>ÞÙÈß°Œã÷NQ›& sÖ^*ã_=?=šù¦ù¶BŠçñÇ™O¯3¹¡ÉÜzrYÀØ;OÌÏèü˜ÁŒÞiê0Ýs%¤…ÔL{Z4Âwsk.Êâ¢÷½ûΪ¸Ÿ:ë¾óŸÌ+I´.±´}g­÷'ëw,œ܃•×Ü:¸Ró™þæüNFë†U³l_/EÒ^7x¯  ï^)>mx¦x˜B®Æ‰7ÆJ1íΧ)$?ìµ’i¹˜ÞvpŒÓtõ:¡ÿ-ÇA@ˆ˜¦÷ ×¶ÆE,Àt¤Œ6ÖZÄÆËaÔÆNP_TÊ)”.ªÔ·Sœ¡rëø«ÊXYª•!;—iï‹P“OåUñ}¼T;]¹B©ÀMp:E#«…;UÞMJ¡ÄNsäˆ]>\ÀNî-šÃf-}s œâXš6!4˜ÇÚ3ÜñŒâ:®¨Œñ裢¦Ñ¹Æõ øw'æUÑbл}æÓ_\ÈT«í´èj8w‚©ñ„d{‚¯I"­/`}I Ád×a43˜,¥\K†@¢H|ŽK«¤IAÝijIègÏán˜G*«Ž^Nm­ } bàÛ¾+ÚçÀ•X¡gÖÀ@õÍ"»óè\_Š>/ qó5áôŽ@¾ÓQ4T]º@V•p ]™=à q¸}üÈ÷Ðç+}+|G*!-P2Ê¿cWÙÐNw;\eT 1ÚÎUðôSܬ{nÅ\9&d†ÚGáçG ‘û(z,"@(þí3YFŽß‹ TãÀ1œe嶪mŒíÖÄÉ-C óEéL!A÷ÀJ^<[2¢@b[ï˜.º…Sƒu÷ܽmŸ“Ï4§FlBHKÔXJ´ß©7ˆSËÁè†U8ÚcBŸ—xʘ¤”4<€ÄxÇ]^¬"Cu Ld³ª—ü*7ŠRfXëG½“2l—rwWÙK‡Xç(È9œZÔb°’ÍîÊmè®K”€’+„â6ž_‘ÔÂIPqÚé`9ô)’éæ)séÐèÍ’<ü•×P"÷±Ô´|šnr…’F½’Æv7GÏ£ _êl_¬PDÀ‚>Ž÷2Y$8:…‹ˆ *EõsÝ„ N¬Õr È2.ý!úÆþxV·ú6ÀèË[ìÝ—ÀË>c9x=­XÒKÂiY~²† nðÏpu0†eá^aJ2^¼ó˜úð Ã=À³Æßi0]•6pnx¥-ãL­¥¿Óã=x‚s› Ry_C€ÊñiaJbPù>é¥(·ºfÐ2fÊzùX€^ ͸ã´3Àw˜3¼ž¾ƒiKxÌå1·‚7ÏÏZ®zH-S]®q–23Çî‰9ìëÅḘæ-¤_ g€õC ×ÓáÞfx=øÖá½3MËJ–^ïLAcxy*|SÏŸœobw—¢©ÃùÓ.‹m–_7˜¯÷äb޽óä*Ýwð<ÚõÊyïÌèu Ï–¼‡tú G[d:u«§À¨7ž¬ª¯iN 8êÝJ—Y§öÕùôþÉB¼ýÉz`ñOpßô¼W´—778šÁ{€ç6 õžÀ=Ì­TëñŠ„matÒsvŽ )©˜SÐIÔÁV_Šu)$k™ ú¥Šg¥D|ØÊ¦Û^CM&ß{\^"+¡Tq&Q÷fýAçè ,Õ6#­oã9 ŠËQ)…SQ=õ8¨F¢üE÷IN•X$œ#§²:^¹w•¢ÀøÕ½rƒ‰!P–fÃà¹sä!²Y™»­8÷DZPÒSˆ È±­(`Ô¶W•¿y“ÇÛHÀÉàÏ9‰!‡ ]ĆÖl ¼VúywåK—òäè„ïô2HY}oãµß ùN —>Q2%*^л e˜>œ&˜+ørR( YZõ§6hÖZhGWÎ, ÙÖ®ŒzB˜œJ ªAaõ!ÍpZ°Ä4£•BÖ~rfŸÎ©XúÒu DœÎmcÿt¸›¢[z¸Â›‚55“V4ΕTd{çRb·Ði/þ:*°p O`}àÁ 3z§{^/I¿Bä±'gêš"Dƒ¥¹+Þû®‡ºŸ7ÖÂ. Q!Aà[é…ÝY®7B1ߪ‘ çwÕ–2åm°Xgôß aF+*?mU€Ü•Û)Û˜áà höÞ®I´Še©g¢ Ã%3N§æ’ÃØ2r«X18×ç'0²‚02¾ÃyI8'çÊ0æȼ»È ‚3ÀÙ¹1ò…tO¯ŸOí9v“ÏGö 'Û'°WœÌK|ö˜.ñÀ¹µx=ŒL]ËÉkb<©žÊÛ♤¥næ¾8ߎCËŒJ 8× ZÇÊæÎíSn¶±,W)ÚáäÙÂ=Ø^rN¯óÁXÅöHžâù¿Çïg†wff/?°þöëoè³ÎæÊ:¿™gðÕx~âðhÎ˸…a™ÍpZ2ÐÚ¦û‘¤†á4Ü68æî,9;žÆÛÝñÆ“ÅpkÛ“‡ÁjKö§a1m®OFø ¾3ÃwF5Ú“mÚœ¢+IÝm¹ØïÿåþìêÔ¾±Â/è•ßzbÐ:Vã‘öÎzb”µ¯s{½T÷ògÛ›1~Ú :X…\7ú³ïè²zbnPˆy†Ô‹÷Ï£ÿ_sЉÎRÓê®»µžñw£AJ¬´‡ïÀ½Å»Ó6Þã{‰Ïž7žíŠ»5¼}7(âË&ãÖMS3œÌK¸øÇëgà%[õ„[OÞY_%¥àãׇÿ¹Bì‹ endstream endobj 6712 0 obj 7593 endobj 6716 0 obj [459 /XYZ 40.7999999 602.899999 0] endobj 6717 0 obj [459 /XYZ 40.7999999 473.299999 0] endobj 6718 0 obj [459 /XYZ 32.1599999 409.939999 0] endobj 6719 0 obj [459 /XYZ 40.7999999 473.299999 0] endobj 6720 0 obj [459 /XYZ 32.1599999 409.939999 0] endobj 6721 0 obj [459 /XYZ 40.7999999 602.899999 0] endobj 6722 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 364.819999 154.079999 372.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1 >> endobj 6723 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 356.179999 194.399999 363.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 >> endobj 6724 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 347.539999 172.319999 355.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 >> endobj 6725 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 338.899999 130.079999 346.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 >> endobj 6726 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 330.259999 132.959999 337.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 >> endobj 6727 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 321.619999 155.039999 329.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 >> endobj 6728 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 312.979999 132.959999 320.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 >> endobj 6729 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 304.339999 141.599999 312.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 >> endobj 6730 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 295.699999 177.120000 303.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 >> endobj 6731 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 287.059999 185.759999 294.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 6732 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 278.419999 185.759999 286.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 >> endobj 6733 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 269.779999 227.039999 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 >> endobj 6734 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 261.139999 213.599999 268.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 >> endobj 6735 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 252.499999 214.560000 260.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 >> endobj 6736 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 243.859999 245.279999 251.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 >> endobj 6737 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 235.219999 233.759999 242.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 >> endobj 6738 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 226.579999 161.759999 234.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 >> endobj 6739 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 217.939999 159.839999 225.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 >> endobj 6740 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 209.300000 151.199999 216.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 >> endobj 6741 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 200.660000 205.919999 208.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 >> endobj 6742 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 192.019999 164.639999 199.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 >> endobj 6743 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 183.379999 179.039999 191.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 >> endobj 6744 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 174.739999 134.879999 182.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 >> endobj 6745 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 166.099999 147.359999 173.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 >> endobj 6715 0 obj << /Type /Page /Parent 2 0 R /Contents 6746 0 R /Resources 6748 0 R /Annots 6749 0 R /MediaBox [0 0 595 842] >> endobj 6748 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6749 0 obj [ 6722 0 R 6723 0 R 6724 0 R 6725 0 R 6726 0 R 6727 0 R 6728 0 R 6729 0 R 6730 0 R 6731 0 R 6732 0 R 6733 0 R 6734 0 R 6735 0 R 6736 0 R 6737 0 R 6738 0 R 6739 0 R 6740 0 R 6741 0 R 6742 0 R 6743 0 R 6744 0 R 6745 0 R ] endobj 6746 0 obj << /Length 6747 0 R /Filter /FlateDecode >> stream xœí=ÉŽä8v÷üŠ8ÐÑ\E 0 TÖbÀ…*À‡FÍÒt¦gþ}K¡%$ROä#)EdVU™”Äõíþoÿ{ùë¿.?üöËñÿß^Ø•5løséÿþ´lö*Åð£±ú*ÚþÏåÇo/¿_~ùúòµû÷÷ÞÜ>ÿëNC þëÇß_~Z¾}ü¯î§ÿ»ˆËv¿ýíòÇÿéþûÓØ_ÿÂo/¶mú~~à‚ Ûý²ü©øËËÿáò÷n öÖoÿïOZ7Ñ"k¿ÏŸòÛßå§Ð`ìÒ´Ú*uá\tóÔÝvüóÏ/éz›§qmç¦Q†E÷jDß­iì¥5Í…Kéuê­-²«ÜŽÚ&H:êgÄó–Æ™2û]¥n}ÃÔ¸L®2zï*·#®%MGýŒxÞÒÆ­ßéêªïž«ÀŸc²ý(Ý0ÝÝ?¢Î0þÓ£ë ÓPlÇx÷gc˜¯a²ŒœÀh‹%Ñuñ w<{du×£¿GñxÐäFG¥wÝwAŒ»0Í£¹,gÕtìòÛ·ÞpM³õnGGm}7ÅÖß~;éÖçCýÖ°ïí°Óm{;Íè„{Ј‡†ø‰øß6ü­üþc${q—ì÷íõûËÏ_¸’¶Wd¾ÿ¥ce7mhøï{'1éËO½„¯íåûŸ.ÿÆWÿ~ùþ·—öª[iô >•x"?Ýž|þÞoñÕC>j Ù Œý­äÓ͸¦ÑЋ-æöÄÎ LßÔU ›u•ÙÛ“æ*¸]ï#û8|so·seƻ L€ßºÃˆ·ίZ5ýœ"VÁ þ b}þ~ÂË;ùävâM@AsÅLÀÛO>|{µ-[ƒÉN'ŸoOôU ËWß`ö3¡û'HÁ¯z3ÜrÏüq*p÷¢ו20b—ÀNvö3Þ €ÉÅ´ž˜å P$L”â)¼¤§$³PÊá;`s;Gàþ«ÞÁÀì žkŒî TµgïÁ(bGÑu%Ýõ!ŽÚ]p"0<pw„Š ÀeKçìÚ¾êU¾Ž²ãŽl?Ad©Ü­€a¦\m<4 íhîÃíШ ˜;`Rî[-ºïO˜ý±ø5&Ph*ð×Í©®ü<).&H<á^Åg÷ Q\àµcÕæÈr.˜s÷l}à‚Ï)G.¨Íi2ä­”=pß‘•áÓJÑ2Îïålbž0­ƒz’äˆ)±#æ¾Ö"DVN“ùž ö`T‚ _Rét”ì[ÄX•Ä`.^d9I–¡õø­ÛI<׳%O`‹gÌÄVA„ü™!<œÇR°³Iðx0HÙhB³cñgà‹‡žÔ^Þ°×p—¿äÈnG‰•9¶œ)=‡üz‡?UO7 óäÚ SÐ >9±ÁR'Mrj„}xÏeüõÞ£¹0Ÿ¥ð†=§³ ¤°Õƒ8\~ [ó`ép“ðùÍ{ŕ٦[8‡ÂÖäç’10‹0,"•ÂîC3‚&ÇsÁu&~÷v\ƒaÉÉÂ,<Çø‚8×rUžKI!ʲCès|ñ•Í:ÌG’dôQ>X„Ý%à ±3ùxšS Rl!¥$ÇDPÆÎ{^CIÄ(±4ÝÓq¸ ½ 1²uÅÓªîì4u5L}±½îÌrìKˆh?GI=Ï Ö *®;È”à~CÐ5 —ÓÈO!OTÐKùär>£Uæ[ñ~ ’ì /Éþ˦äô‰ƒP˜‘Áy9B¬Ÿ|„žðz"àÞøä?gCÁs¿g ÷6â¼Ò’*#s‘ÞGŽóž rRÂÖ"áùò™º·%‡kPüáok)û‹Hl`uŒÍ;âEÙະÆFc™/®$4LºdÙÙ_PZ…„”]D}#@¸1ˆJb®Iõê4}ý‡º´³óàiÁg²ÓOØy¾ŒŒyk˜ZÁs1Ö°à' ÖäRËäà8o‡›h˜v‚ë‘)µJè-Œ Æ9pG9Œs0„ÀPÓøä@þ!a¨:õ–ô£,žÜªiH„÷†$ÿ¢Rô©?%06'©RŒ«ÂüVü ødYœö|ÁˆÒ@ ôК£¯Å'$eZÕ+g/ŸÈâTØN—€\~©Ÿ?ì½=Ò’¦¬tx&|…$Iï„Ü)Ã,úÎÙJq6>L–«éc¦Dòþ¬5"Æ”2{þpšTTÚTF “°¶ÈP}´Œ;ìã9<žÎ¡a#Ë2…@"Ê—ÔÎŒ?º*eyý[0‘1Í7SÝ’FiIXWi¢Ÿ‚PÌŒ ¶d Î]ìxmßEÛ3síB$«vñJ¼Ä~Xªãq’zJEBDjI ›"‰ ‹«råÑ1€`ã‰ä®dToÜÏ`oàJwzcPo)ã0pî+ˆõ€»³³R ®g¢HÂäwæï/-HL&3Ý(k"ˆt_LP6iæâ 3ÖF(Dæ|‘˜ÄÏóy Ó…|¸DØ‘RôòvƬô_˜$ .‹xl,ö–st©°4µÃF Už¡([ *_©ogYeCaN €õü‰Ÿ©a×ÄÕŽâ&Éöaö$¡ZL’3 ¡‰S &é !Œž¤L ßÞ¡ù…SŠ–Ýä[)S‹æí pÈ@lˉßË¿µ‚ºÜ6ÓÊš®7÷vM0…éÁðŽÀ¯`Êò­¤EEx·÷s¦L6dÝ+"~´#»B\DÓ88H’¾è]ø&¤"¾!šz› Jµ¡ý$Vâ‹”`#ɹðý­sõåN Ewør<\ q&½(¡ö ¾I  cE\£”ÂüƒÆzŒm-/-ˆ©~³C]ÆíÀž"ZPŽ/û³CJ¬)Ãpt™öÝÀM,tfHÌjn#t¯N‰ô í§¼:+¹Ê·$3(i,) ý80‹‡sIp40…ÖfÒRÂ+k?¾(xcIJCRz÷Q%tsÒ­1€DaòfsF†µ¿õ'\Èù sy„” xÔI—mÀãg'Z{lýpï&ÞS™$‡Iœ/0,z÷’”¡Ñ9wÓäÜÁ„°ª¥¸ÊÊJ*OvYÞšöU‚Ho祋©hÊeè&%u9R}D‹wn–Ä͹NáøÎŒ¨€2•žUdϹ÷½P \‚¤A“QVÀS2¶ðéx¾S’1hår†"ñàö@ÆêŠMÁˆv;!´7Þæ›tAKM$x<Â`v/ãÎîÿ‰L—BIã/¥¦õÁ…y$à”`ZL’7CS*jëé”w*z¨à› âeÞº‘nËô®§j!U<úø*è®M„Œy'%˜ó¹*&£{s…·"ž)x4ʘ8^Z<øìKÞ=È]òP;¯–Ñ5"Wh.Þ_Í2I–*ë¦5ó•±oxs,ŸÉ1‡y 0Œ;AÕ§1è$0ÒÚWäùypЍz_\aù‹Få W¶hD?’0£‚8wJVå ÂiUR·ÚæSA¯‹®¿y5¡¶W³d0®2îé’¤2ÀäæFça1¤¹!><ÇP>Hä°Ê$‹Ãލ–ϵÓk|¨Yºõ±^P…Õ.†Ð|1± &ƒ—{lØïý<ºê™¼ôz,arç&˜²ôp£™› "¿0>5&¼v–|™h‹ÓI’•‚HCÍ'žcÝÌʶ}äHç½hHÝ«å§Hã¶¡ÂUEh-ÿ÷tÕ®‚†1"¢SœñÙ³çœ8‡”§Dp$Dá”É|¤`4Z¥¸JÔ_Ia”Ë"jÙ\+\¾â‹rr¢ŒWl˜¼SP„øI h>x€2Âñ—bÊ1âT\ P¾#IÅä¬òT щ%ÃHtØ21e ¢a¶ ¬;«ËÞE€¡£åùacÖpœ=ï@)<ÊÊ y(ž÷ˆG¬tôr·`œI|4¥€ð‘VˆÀ#šÀ…ãs„Ãq[$F–-’HsîBñ-onŸKŠR’aÊ©†±#ÖƒòEáš%Y¥ÝÑ“ ª¯ýr>ÉB\þöñR\öµsØ)¼ïh—Úùœ_Õ¨ê”N~—á­ó(%wˆÎawÖe±%Xdô¨âªD¦¼NÎà .K¡çIø«C†Þ-Fgtœ¦Ü @q“݉“fôÚCKÕ7mH¨õ•PÒˆåL îKN Š»ý¡°ïµyw6PDâ[£·?WPlÍäÈ>^«"1›#hÒš_EÂ<Õ0y.§…Þ{…í))Åf(\ªG²4!Œ Î'Är ²ð/ª¯]´&xE¡)ù@dð½Ðõ{¡ë˜)þ}ª ›Fµ‡¨\Ö…`möÂÛí».oKÓœ¯²½Þf²®[O¦í<á oà'požA Î@MDÙµ‰W¨·ñªIήƒ]d1ΈîWåÝ~:/××át=Ù 5ΨD—âõ\oÇ”qç\JD¡ß=…'+KpAÈû^¢jAFúOBY ÄÌHW•ãáÅ„ŒÔŨêŽáë4q.$e,¾¥²N5·’DXi‡ ŸQ÷Ì!œÇI‘ZlOŒ¸ŸãQ€=–ðɦDꓨ¤n¬²!¥#£Š–W¨ez!Y/ ú¥dÌ”Œc+Y|Û´£)T\ Þ†Ž¹­»HiŽ7.©WÐ-ï•‹HеuËJw¥xœËh rbçËÔÓÆ$& ,–•¤ò‚¬y Ü F :>pˆäf ’¬¯²¬öF\íh§ÝÁŇÒ{ã¥x Â)2O»}òNÎ~m%ÝNV;¤úYÏ?…êøq5E€¨.ãÈH³ã¤²§¨$GsM Š~e؆ ]Ê¿¬qŠô]¸çA^£’%Z3ÍBÅô½x„-('”ªÌa®|ed–ì\2IRKî|¤:¥P#ÐW/4[æ~™2u â Z˜uf$E¢Š¨õ%kZóÆá.YvE„â‰ø6¥âJŠG´¬«ÁŠsâ9 ‚E¸ŸÂp„P€RnÏð€‘0úSŠM!î†eÞº^a‡}óæs·…yÛ2¾b®¦ÝL€îÆvˆg/™h¹ÊJwL¨)¦pD€ÅœÆÃܘÿ NÎëvØnÞúÜá4·åÁgp?<>»ž‘—î W}|èå·ùw}µ–] ïÿ3œÛ¡Õ\ ›I§–/M{å¼¶ÊǶÆ.{™~ÆèÞ—ýg÷ká!ºoÜ™toÉe/ëuüxùååõ«=áÞžð8€æ­d¨±jú`çá”_!–QŒw*àÓÊàu–`݉k÷Ì^ÃŒ6Ì^eÒ ’bî»&±ÂÒ°z¸lÄRшeï/ßö±œ+}{_бƒ¹AÞ0”+9¢×Ъ»1"áÔò£ûˆ¨z‹­»aËaú/Ɔۇ·æ 3|´žLÿ–^w£×ÃüÒ­¿6®s=‰Fš | ݨúà¡RŠŸdh)¹Å$ÙNž 7HÒ­Ï› DIA£‡ÎpÚá¥Z5DS ÍŠ¡ùÅÐÒEå®Å£··Øº¶æN1T»E1”u‡éZ<Šq{K¯»Ñëa¥ZO&Añ Nò÷;—¦äÒÒéfB:Æ— ¿:@‡Ó»Ó;ÙyCL7Ü¡»OLïÚFA|ìeúÍ®ÅôÆl‰éMãŽÑµxbzÿ–\ö²^ÇÁbz7™ ç>*»¥0fV‰•¸Ö£À ÐfRs—ˆhvh‡Z³Åmëò©®Åc‡··Øº¶æÎ­Þb‡ÝªÜa”Ïooéu7z=̡찓Á²iÑD•n‡©‹*ÏZ1Ã`»lˆ…AËÔ-Ó0ØýàGßâÂàð[wÖÃÌ0h™Ü€AË„7Œð`pxK¯»ÑëaŽ„AËÂLQÆø$IDrÿN-ÅÁ’à@ ÑÄcùÝê¡— Ñ#«‡[V+\«Gßâ!Œ˜­÷nØr˜;ˆ-«‡®Õ£oñFÌV{7z=Ì¡#&«‡2Ðá[=<ªJZ‹ˆ^’·Â®iõÔ zÊQŸ­ÚRŸ­rÕç¾Å=5«Ï÷nØr˜;èÉ-õÙJW}î[<Г³ú|ïF¯‡9ôÔ¤> DŠ<¼2v.¼þ®j’N…\5Dƒ«¶¸êv \îÂQÃ}p½½ÅÖݰå0wpÕf \»U9ÃèÆ×Û[zÝ^s(¸6³– «g§¹(ƒ&ª 9(úÃÒHB%AšHÕ„›:Ѭ§™¤|ÉÙ²!—£ªZ³¥ªö©¹’_UÞbënØr˜;.›-UÕWUí[<\6³ªzïF¯‡9—í¬ªÂ¸ ã#ÌiâËÊ—.xyþ—®˜~þB ñ”ÁNêŒí²!ü,øÍŸl[qÑÝßþùåµ:’ 1ÄÙvÒÅwÈO …ËcfÄzÞ7‰„‘~»=l›adÕ#mÇŽ‡‘–› á(c3,LÄ ]¬KJª¿€X™B1g§ã±Oj”âzÙ@€}ÝÇcŸœ4ð1ˆ84-ޥƇN¸š 0pá\L\0"¡âÙx'Œ‘³ËÜšeƨæ£å;Æ”Á˜§´?Oh¡g#€m— hѨ … ëÓ˜+ðqÂeØA#’Ÿ[Lz혣¸“>éå ¤äý¥”p¡0:FH–pÞæ¥P°E3©úJ‹eC¬°µN¬@k·bZëÆ ô-®px‹­»aËaf#`k·bZëÆ ô-®pxK¯»ÑëaŽ4¶v²OŽÑÚy5¥šK’RÒ´wnß°M+ù$$¿…“î kÎ0¼x!J.«ŽìTÒ˸U0ºtJ´e³m'«•é_›mµºœšn*ËÀÙîwéÎv­zÔzkqgom]ö2ý6fL¿s?pÖô»c07pvxK.{Y¯ãÐÀÙnÖ·xkg’9=>)ƒÂDT‰õD>DFM0×QsGÌGÜ‘”b§®ÛÁÙ~cÚeC¤øc˜X‡ßt á7]«~skqÄŸñ-¶î†-‡™ÄÓmŸ/þt­Ö†{á7ã[zÝ^s øÓÍbÎ^³;ÞïÒ<‹Ezà¬Ý¡Í‘AF-¢1IZ“äFdaŠ» ®¼È ñ-¶î†-‡¹c’܈ êZwéEoéu7z=Ì¡˜¤f£ ìRy(¨|b·{wZsîˆ6ˆhÒƒBz# §km]ØÖ^@Îø[wÖÃÜQHoät­ÊÆ ÈßÒënôz˜CQ¨™ ˆp,(Fû!˜CˆLµÑ`‚ öµêæËåT.–ÊÝúöcø²!šþåгa ìZKŒg ßbënØr˜;ý1¶À®UxÃx¶Àñ-½îF¯‡9”þ˜9V ‘êœ`9ö DÚð>4Dy3˜é ýñeçÄ¢Qß´¨Ä"ÃZá`T»‘XÔµjÔ[/±h|‹­»aËaîÕn$u­ÌÆK,ßÒënôz˜C1ªË©”Íî@TÅdw”åÛuêXctòøL÷⟠z¶sí®— ±èɹcýá|Ëúùkýé[\ôÞbënØr˜=9Û²þpæZú=‡·ôº½æHôä|¶þœþÂÞhHã|¶Ž¹lˆ†4áXG¸Ø²ŽpéZGúÒäl¹wÖÃÜ!MlYG¸p­#}‹ib¶ŽÜ»Ñëa…49YGv¢RʧH_ ‚ ¦¸üjøV ,¬ËÙŒ¡ì²!ÖÇF_¹¾÷M«AD€]FQ‰C»H[Â^ùëH™ëBs‡âüàx„1zCOS¹?á¬ßî‚™ìù* S^D@IsÔ­9…ãŽ]¿º¢%é5K^eÒq‚5G€éS’£à«@"Ôݬ[”Ju—wV4’Û¡i¯é ¹ÈèƒK\ÚÉ=c€÷ÆG—ðK§¡Ê]xÅ,wxc†¿ƒôÀUÆ 2 ÖSIv‹à“ǼË8žkâ¡·øõgF°¹,©&<å#þpIDL mÄ•Òa*šÁIØŠû†¡OÞå|J9sÙ{îBÆ’ÔKp‡|aâwS" *] ˜ƒ_ …RD‘óTÌñT¼å¤\Qûn…Å ÞOØ¥¤2žü¿Êô¡r)B÷„V<å\<¸’Iùxê›ÓZßµAª­Å‘Z ˆ'ïIá+açÈ3šÀJù–;TžØY4Ì—v¤X²**Â{QÔ&qs.b hBqg¾6ÎþÅhV$ya/Ã#†` áÎjó³ñ^<©3 “ ”a¸‹?`3*¼Ûâ#‚‰<:_Æ¢VdR0b'^'4ù’ÄWs—ú¦ MX)OÑý®PˆˆGHñùSDw/!tÁGýÊî=L-¦L¶ÇU¢%•òb‡d$A¢ˆˆ DJ4"Ñ:œŒEµ*ÇÍîÞŠàcq ÇaSP‘¤¹°³†…U,1Òˆ\¯Œ;­1™U^iœ0+;¡Ï)*\.€0¤”¡ð(MNB|Ü ´€Ä™ƒ¾d‰/fJ¼•|u‡•Ái’Á^ŽG™#;x˜ÔYC IïÉMXr âÁØV«¸Ã¶v QH¡3d ¿>;Âé™’ÿ¥ôöOªã\²Î÷u%T³ñ c$ u´’”üêùöü*Çc‘È ,VŸÆÙkyC·‰ËWÃÜ7à °0¡Æ® O‘À‹QœH-zò›âAAЉ)j¥@Å¢¬%/Â$ƒ¸œå±i+""¨(I)R‚ƒö@Î&¸vA9”ÂWrÄ[KÔ|w\GHª ©uµ3°Ê8«lg1 t-³Ï$.4Ö’C@  çh¬tÙôÑ”õœIé!ˆû4‹Z™H$‚¿aÂ>#¨ÈK¨ýŽ1ëåD5p¥Þæ„}]7 Ûý½üÞ‘ÒŽRö_Œÿýø U›uQöõë.YÞý4HÏmsáݺ¶<%-o†øù‹dQíMsm¶•¡V]½Ó¶F˜«ÙÎ44O†³—ò*ÚM£¬Ö×f8I¢·Æ±à7-øÍ@’¸ vó ÜŸ¼‚½ 0½lù¾;’Ñ~¾ ÜÖ­cd ¸oÆì}œÛ 2 ®ÿYhn§£ýMö !#Û€þ „^xÿ<Øñ[væÒ@'¶sþ 4âÈÖn€ð ³Óé;+Õà7àÞ»#™·Ç0^Âgž7<ÛÑF±Õˆ}±(Í–uÖ²æÊoóVèÇA$ã0I]˜¿RrÁË×—ÿQÚ@² endstream endobj 6747 0 obj 7387 endobj 6751 0 obj [460 /XYZ 40.7999999 559.699999 0] endobj 6752 0 obj [460 /XYZ 40.7999999 470.419999 0] endobj 6753 0 obj [460 /XYZ 40.7999999 175.699999 0] endobj 6754 0 obj [460 /XYZ 32.1599999 237.139999 0] endobj 6755 0 obj [460 /XYZ 33.1199999 766.099999 0] endobj 6756 0 obj [460 /XYZ 33.1199999 235.220000 0] endobj 6757 0 obj [460 /XYZ 40.7999999 175.699999 0] endobj 6758 0 obj [460 /XYZ 32.1599999 768.019999 0] endobj 6759 0 obj [460 /XYZ 40.7999999 559.699999 0] endobj 6760 0 obj [460 /XYZ 40.7999999 470.419999 0] endobj 6761 0 obj << /Type /Annot /Subtype /Link /Rect [492 638.419999 534.240000 646.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 >> endobj 6762 0 obj << /Type /Annot /Subtype /Link /Rect [262.560000 375.379999 300.959999 383.059999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://php.net/manual/en/function.dl.php) >> >> endobj 6750 0 obj << /Type /Page /Parent 2 0 R /Contents 6763 0 R /Resources 6765 0 R /Annots 6766 0 R /MediaBox [0 0 595 842] >> endobj 6765 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6766 0 obj [ 6761 0 R 6762 0 R ] endobj 6763 0 obj << /Length 6764 0 R /Filter /FlateDecode >> stream xœí]I»‘¾÷¯¨óΗdîÀÀ€¤î`0ÃãyìñdŒìƒÿþTU²–fÔÇdƒÌ¬ê–u«²È$ƒÁØ—_þãÛŸvýçî—/ßþo÷«ûùåÛS]Õ}=ÿÙþþîú;VÆ®²ÓáÏî×O?w?Ÿ¾>}ÝÿûóÉôÇîÇþáéó„ÿüõïO¿Ì/š?ùöå¿ö¿ýkgwÿ¹ÿßßvøãþÇŸÝ|‡/üx§þðËoó/Æ;îÿsýÛááÿ>ý÷¿íþ¾_Âxœ÷ðïïºnÇ1m?ÏCÍñïõPô²z×OCsX¬±ûº=8þñ?OÙÏv^F5öîü=æMãáMm³_˜©ÛýâÉk¦Ö˜¡o‡:zñƒ=Î9»ièwÝ@æ$Œ›É¤NÔµÎD‡™¤í=gÃ}²ö¸É¢ s—§™’Á5MJxX‘IÚÙ îp&)ÜÇz2:ø~ž)\£iuà~\‘ ¾ã™Äp·]­÷ÓLÉàjê^g¢ÃŠtàgý™%¸ŸfJWÛNJ¸_‘ÜáLŠì{ìšA›}CëˆÓ¤BóqÔ¦¿¬óùÊä}Åᆫ¾ó0|&í¦®úöˆü>þš¦jf ÅŒùŸX‘Žš Õ^þz;¿iÜ%s‹Y“y]‚;OÓ Øg<†L߸I®>y‰ß³äÕè½Æ¬?“5-ÍŸ‘•:I£Ý ­d½ÛÒ@à½Èé¥'XBdß j¥¹\IÓú»0["f`n!MÏÑŸµmüm‘}B†Fœ¬9ž¥‹DVh‚.d‰(úÛZ~¯¦ø¨@LÛŒ€*4Më‘ûÅ‘…Ž,¨O ŒC½Œ¯­·7zPä†`ù­Äq´u³ÖqØì ¨3ìã ÊN€–&AŸÁ„p âÙ§Dûö' ÐÐøE·m4ï†"T'#2÷Æ¿¨™1BÆG@áȯ8384á¥ÔA.+ƒº d¤$q‘0u0YFºÞÇ!hœàX8$&Báy`¼£¦ËÂW"…®®@ s‰•…“©VVœºÎÛ[Û!`·/€=Ìë鬇R·àÖÃ'|ò =qÚÍ'…EQÖÚ „…cÜuºõäY°ÓWþÚÁÂ'—ßÔ]+ØD•V :^ØKuňœ‚é*Ô—]ãÛ×8lC½ÀÒâ”a ðἎ¯Ö—QXˆ-_xõdŸ} AôX¶Å‘ÙÉÅ$ß û½‡C"@£è¾$ý¶mÐŽ½Ç6(Å‚¤_"’¿µ{,qÕµ“3œÈnaÂ|=ºZÅè„G_XØJå¤íÅ ¯V§&gar6• -d’YµpTwf2‡Æg X,b ëÁ0~©êÝœ„<Ù‘]ŸÉÛÊüó'Q‡iöÿÞçïÊÉ6…Êç}ñ¾aIuj’[î¡E¼H£ú†¶s:ñþ:`ô!r«ë®?ùíé[ñBÿÇ5x÷´˜‘a”Ôxa€»ÖõW¨ašÎ;˜Ìlý.¬q›1–'þŠÎI’_î øÈ† õD ¿qWU•ç«MÐtָ͕qm¼eÅ´DC¨H7Ƨ»W!å* Qsõƒ]bCËcZÔÐË2eÅk{’`j¾Á7†a‹‰É嘯rBŠ©^?ζ–ÃkV*k¢\“—l«¼IÆÔÆW¼²ùäׇú‡XÈ=ÝÎøb«ùòi ïFå±ã]0ÜA8žs¹æ7Y¼ [Ї€(f‘ZRÀ€Ž§´X°^v´´5$1ü:y‚B6T‘åRÀ} ɰSX.t˜á[ l“]‘”Lþ !1…¨|á‚~ï×(Y¶¥Xævò¨‹$2"5ŽKŽI2ç³'{ ®Ýð•ÔK¢ž5$/âü"Òàö9ýÈ Ùüö‹*q„‘,¬çÃ(ÈÐR¨éºQdgÿ-!–¹;Îoµç´­b^ï¸êüE­í=ó¼Z|9Ê‘Çó8 k¼«[óuÑ%Ê#}ÓjK•²¿xS+ÃÕ&a“…z¶ÝcÙë²Y³¤¬ji9±÷3ÅÅŽ±iõð¦eãøGå6 Ž4Fìîr+2Q¿/†¿žáé CDñ[Ö´½L‚²¥Û2·BIÁh‘Ån…ª-®@ÿïXNÇ)ÅT nàJÕÍ$-³$l—tXò¥Pÿ¦ó25*þÝeGñ)I߉O«Uá‚IÕŸÊëZJOæ<÷âißñˆËé°®Ñâ5åN1TSÏÐ0â3\j‘ysò—×uÅòÊ®íD"m¯P(Mô1› 0l]3.¥9¤WšO|Œ^­0¹Jº9ü*t-¯ ›bZäš9]ôýäq‘Ò©Þ'süû‘è|®éL*­‰ä»(`IúX+ZéókÏc=ž ƒ´ãå?Nµ€;ÒØø­†ËU5KÉ Y6¾Æ›èuJÀeP‚r¶Méï­®g¦ó*[ékFjLTýÝÒ^k,KŠÐðîH ¼E´¡)\K™ãïÅŽ._RI%¹ã}D‘sœ\–’²ºàps6Ø;¦?Z`TŠq#³wdÙùË0aKÈÁÑåšå )%IÛ#©…XôMéQˆÓfÄ\K¸™†¨±ÁH„BÙKèéùpÇ™n Ð3­m‡·[œª™#\_MƒžÔ'4släjŸTÇLhŒíN„ÚO⺤wÍF½«÷4îì¬oï3=|ò"˜­†c^ù;5V0î§þŒfÃï Àéà¼6'°U­#;Åcš¸6ã(Rs¼ÁQ³Îträ³ñ-C§Pç–¶Nf¨ˆêyÛb~®ÛÒÈÑ´·@‘%š6³ëîAô#LmÛJ½ƒD¸=*¬£¾Æ7&Õ)Sg7³&ŸdeP[‰<>P#SÀ„ü¶ÄÄÖo&÷ZÔz$otìÞEk2\!n²+gà'æœ<iwLDrõ»âcR ·Õë?j½ ¾ÄüºäTëöõUiß ¸ºž¸”ÚŒ¨m‰‚@€t'@Ó€µÅDÎY`´ôêJ©zªâÌlGÃ’-IKâ—ÊH–šnÈB—4„ã{–K¢¼îž ²”¨Gޤ-éG A•–Ê !©…<_æT˜‡Z”ŠŠ&ËEØ9·|+ý×QO5LÅl_´H\¨ÎÝ51u^ÓDV£-?©?¡'‹u—Xïé>ÃàÚS†?FT†®Í‰w·žàýà÷@Xª_áýÀ'xx?è¼Â1n|«†Õpmw$p œÆDÕ» ÁÑÀÝ–Ôa{OžÐ‚×f0öb Ácð~ðª!޾ŸSX„Aî:´Ëð½Ë'¥¸k€@ªà®/1UÅ7ó‚»M[¦içÁNA›õÑu)d9ÖMC.Y=ÿ¹·Tå3ƒëœÆmšjðÃáAoÊa‘/å|¾ˆ:_d{2?DŒ ÀÀÍFMï:À¿'»»h¬‡3BEaJ¦¹ ªY×.ĈqÌ&ŒŒ]?‰ùJð.«ô5ÀG.IîW¹²Œ‹™R'K½IN)' #Ç5È_tꊋ$%äç©•«˜ $*`±ñåìÑÂY‹)±/4¾:Ås˜¥'rcá£k×Í×”¾2[ûÎ#T-TV]—Ã[øi³Kò£i|"œ¿N”üwJ2°ðU(º]Ù&/š"A=°ªz=/°ÎŽÚSgük[Λ¿G€Gõ7(÷d–nŒ;KXų¤b5\µ#$¼ûƒm¬ø=øžâàÙ°Wφí¿Ï<öæ‹|!öì­Ú¦Œpf8[EÜI9™Êµn.7w!Ðeƒšªºþ~ûÒ?¨½•‘£\d‰¡ÓÅñ-c±ÌÔžaÆ–ÚÉÉ)㳊2E¹E™$~¸'µæ”eàôû[fÑ”:B…ó†jÈ-‰A·ˆ‰ç0n]yJ71JpI ª´J^+±¦úÂþ1¬…}œ¤Ûe1 AR·øe‚/D³DGF»ð5S0o˜ÂüI71 n2N;¡* $˜@rð<¾9E¯"fÕ33ŸÁoøë øP<±9„¾ì~d{BcÈ}Bê¶‚fYgyÔèCFŽ{¡NÛ:šH<åÉ[µô1$ ’Îv;žò36à×}‚]ÐaÚ@t S?Ú¡Ù>Ú!è`¬j ^7‚ÔÀ™Â'x¶V°S| ’TÉ- à~ÏV0>¿XÖ4§n.§ò–u;¾/kDþ჎œ èØJ·±YŽYßLײRœ2tŠu-Å‚ÄÀ¾!eµf¾Œ„6~±©¤L7A‘CZ]Q¢a´!½”$öŒü¦ðÚgۉݲ‰ü„!CÎ0½š¬(—J¹‡i¼N¼X…2I9ÇŒB§_ïö³7Ön!¨ò·ÞM~Ѐôœ8D\VmÍœÝÒ“%¿ïì;,¡N¯!É\ÕTͨ⪦¯!|$^ö)ÄØ '¯ N*NqqeÓ·—(°ºsÒºã8=Ü„œÑÙЧD•Ð.:gHZ 1¢ˆu‚P$Q…ŒÆVVªÕ«$¬+·ÃàÑ~]·‘3ãçTÏ]LÁe*·:uU²D¦«Ä"ktáú¨‚˜U%k0OS1 ë$Š1íÖjÁÉÿK%´¶+Hm3À@Rqø.k¿KÂ"®–ªªÍ$ÁñŸ_nÇó+а†wóÝ©ÈÅÕM6LNZr°d=Ѹ;Ôž»‘¹3Wéìø ŒõÉöÕ'n÷ýeÏä+“÷;ˆé}8\ 2'}2³Æ•Þ/l__b:ÛúMC²„S‡€¶"2¿[ÿHžà1tz¸ÆSYþ¦jÚ·>GW‡jÏ2GU5ò"Ù7ã-nNÆÒó5– s<„Ë×IÅݨQ®x{t+Â\¥+~2Hª¤`¬†Èš¹ÆZÀµÁ¨!—R¥0ŸË7Ü×Ö# ŒÐr Z¿LFBÙ·“/ïd‰“˜ä—Û+BÓêššÑàZ¯] Gu X|S¼ «¥'ÝS†FÄ(¨ϲ©ð¸¤áÙºëP¬‡0‘çWuûzZ>\I™O,{0ª+ª„±.×N©Û°Fª=,ïÚþ¡æuY ªŸh†Ê˜éìÜšºo½P™©šy@M¶zãI}R9ã¸Â‰gÁ˜OpÌÇÌÆ4Õ\ðÙ³Xꊄ¶LÇÿPõë«æxùèíæ½ÏV*y »“쨒E¯Ñ£P!²`@H';%#¾pñne¶¯šR!¿”=öj>ÁYñ˜Áªwñ“Ÿ|_„q7oìR@¦Îl|Z._€¥@dKßz${;éA˲Ÿ¤õ#ÆK³@càU à*6ë2z ƒáX¢P‚–: ”3_š-kƒ™º÷€XÆèœ_­êR“õÛ;ãtv»3æê¼e¿tèY1=Êê#ƒ$¯R‹GÀ)† çŒT±Ö£-y»}ô»R*¬zE6lY–8q+ÝVö•Àé"ÔF¾O[€DFù[Ô¨§ÂÚ2ä1²Dëo#Œ Fžt>Ëù—K)íkÇ1:o·¤º)úo|0´ÄUA£ ‚UD—ß´*¹©"aÙ”ª’’( êÎð[Ž0¬]Ü€DÙx¿Í”Ýu-Rs–a›éQÇ+‘¹ýòENx4çþ«¸”¦ d§Áç((A*9ᶆc YÏf%;-ìmÙÂ’1¸˜gI|éÌ"E¸kóxörº’÷üA`+XAƒa ñ¿…c0–[HIñ ܘ#þïÿî~îýXÁªÞ¹¿þ`>½2õåÊ| ^šàÐåÆ~göÛ¸eœL?G­ïš³¦ç<'}_õ·-çS[1b&v¨†ÛßÃ'óá4Me§›Ñj]Wõ³ä#Á­÷ŒpÌÇ̬h°•­‘„>¹5Û,†]ò ¿ëìÑ7vøŠÆ8Ãë­'íÃ1Þwbœ½»µ/@Ö~·OÛðÀ‘`œS`Ì3ÂxÝÄksÊ* :æуæÝŸÓ˜–Òøówã=NTŽ‚Šèf‘;p;ðü©÷fë¾2‡ ž·_‰¢¹jØòU“í¾>ý?»Ï˜ø endstream endobj 6764 0 obj 6007 endobj 6768 0 obj [461 /XYZ 40.7999999 444.499999 0] endobj 6769 0 obj [461 /XYZ 40.7999999 162.259999 0] endobj 6770 0 obj [461 /XYZ 40.7999999 444.499999 0] endobj 6771 0 obj [461 /XYZ 40.7999999 162.259999 0] endobj 6767 0 obj << /Type /Page /Parent 2 0 R /Contents 6772 0 R /Resources 6774 0 R /Annots 6775 0 R /MediaBox [0 0 595 842] >> endobj 6774 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6775 0 obj [ ] endobj 6772 0 obj << /Length 6773 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•EŠz°g<r`x€‚ïn‚E¼Èdùû‘ZR÷˜ìb‘RÛ<ãV³T,ëŪâ»?}þÇñŸ¿ß=|þÏñËòóáó¡®ê®žÿ§¿?¼þ@U#ç_û¡­¤žþ¿|=¼_ŸŸÆ_¢; \~Œ×WÌÿòÛáÝüòÃüÉ燿Œ¿ýï(ÿ÷ëñoü´À›¾ðõ0ènúåßó/B 9ŒÿyýÛôð_‡¿þáøÛˆÂp‚;ýûCÛjQ×C/ç¡âô÷õPô²úØéa軣rijÉñߟ¿ŒÐÎhTZ Ñwª¯ƒ¡ör;þ÷¨'Э´€Zs •H×`tÂH¤MMÔªwƒ¢’^‹Až¦©ÛT‚­’)/'t8M‰¤™-„ÇÈtod?ORשÓ<ƒJ4íi@F"mj+å1(2é»^s‘þ *ÐÐ <€&Œ˜HA‘I¯ÅB/¡R'z•¨UÃ$·&ŒDÚÔVÒcP4ÒÓ”j`!ýkP©€»`ÄAúk >±Ø_òb½8~x>¼{Ò“­ùüˈÆÉ`<=¨ñ?“6îÈ矎q}úñøüë »ùƒº3>µù‡ÓêòAsú ¯jÝôíl%/c%zR÷>¨Ž±ð}Ž'ÚpzÒUR ÁO,¨ùƒJÍÐ/_•ÖD1&ᄵVɦ'Fâ³\H ÕZÄËÆýxú ¶AÈÖ…™óØjÜ)Ý7_•úôDˆªUÝ4Á€1öÄ1ð’cì!…_6kÿõð«ð}ò1Ù#¶æHX5öãó(Ód«PÍÄkߞīV͊ϼºj-Ñ8 'Ž©Ÿà˜ð==|Ò¡'Mƒž¨÷ñФ‚óùŸ<Â'7LŒ[ ©ãxˆƒéÖ@ê4º ÇÂ¿Ž˜/1E0_ÂycZ©B“ñï‘„1þÇ\Žw ~ëLIÀ™¶(Óü_ŽËõ¨o€ËÖ7ÉË”ù|ëöÒt­åúÊ•]û®5ÌÑ÷pŒš_,«Ùš"šù~g%ÜL´MZ‚Ÿh¹c×á-Lu‡ùky:^Ë.ÜÓ±ÖÂöy<ßÃê …5?ȶ“Äêçõ\1b¼4È&6Ú„û¶r’Sì·Úûv£·1b0Ü]··‚5Ö+sÐÃU…RP æ5pòÕÂ#P, Ö"ª‰ /xÙ‹ÁEt¶+—'ïát>„«ÍvôF9yÀ0Tl4Á_%-9GT7‚°NöÛXÑŒ•QS ƒé!°hŠ˜3ÿù…‘9DX„£˜òPe‘ìs8ÆFöM¿|aq3+ÄæªÃ•ÃLaaÞ™±r…¢ó"Nj"YRlŠ~Î"kö"Ëy¬ßcS [fÕç›]o5RÂà&…&«Õ³{ &Å¢,4¹ÙžÅÎf#²å^GBö?i…á{Ô3Œ^-MaÜм 8“ÏçRcºá¼P¼r8;·Ô![S÷~ݶ}õ\Ê!k„T¥a ãà_ž`\átÁ’ »éRÄì½È*“*¿YaŽÕƒŸc!a~¹«ÿrêsVÿ ›Ïèç1%z/>”²ï“2³kº•¦PvQ!,ÕjVC½('´í[æ„^}Ë ùëV­[‹§+ïÑ#s—#õ›…þÞ’+÷“›hŸ Q¼+@LÈÈ(up¼ßT)|€{6|,¹Ò@g -,†Ï•1Êt)M3‘„Zi~ÁI`÷>ÁT z‚iŽN$3ê“ ±oÊž«ê8R@H ÷¼ÉN)y˜yI`g\„‹9K®§d%É[ŽlRÕAÐû³b6dJþx–µ°25xظHàÊ&ØF„H)L˜PÚ„$SF¤-æÍ›×þ²I¼¼ªY×|Ò®õ“é{Q¾ŽBw‚¤œ_µM°œsX˯FÔIâµö§9#¡ÙLL6î­L$íæüÅ`­0d)tÄjò8F8À–`TEÔ‰åÎ¥ÞoR>ÁŠ®$Ñc…ÃÒÙÌ?ሠXPtµ #ú–„ë¾|Ïá8u´Å ìNR°«×ú|°TÏÌ=zåI½2ÕÞz5GÖ1YXe´g–à›¹ÁÚJšQ¹KÖ¤ùžÕ:ª«yˆµÓ®ÁïX7KŒ´©zà s¼ça‘”Ê´ÜDƒ0p@Ã3Åóy‚”êMØ©µa¬|X'ÐÍ4 Ù€„Žñy:œdV•¶r‰°å7j •Rbûز D‚-D:£ ¤Ç2Ò=kç«Ìá1Ì@£/©©ýžÓb3tDÉ©úÞÐ$WŒRd±Zä lú”þ Ak6Z¥x1á‚ðóҥ傔­P|z_‹Bk#ì8ÊÚ#b2ž%G»¤l¨¿<Âx‹o%Yପ1ŽL‡¦YÜ ¤ 8h­öî,{Îá6¤£ô“m&„I§Ú e6¶ÙaKPJ÷s·½mœPéÑÿ:¦†ŒÂË ]|Hru/ÎOÜk¡wP@U²Hi tyמPpç(±(T%çS²,£ï´ŸKñ\|wÞ[ ¤"ﮣÑ4°lËÁ/¬÷#5pLÑý8 üÒàýHéZ€ óðÚcI Iò¯0~O!¾Ä¥›{/'ê”rBÊ µ­CòàuÄ‹¹b{Ž%ãâçí¥/ãÀ óE¦±Ú x}˜ošÃ{as]»’úAv~~Á˜²•Ž`ªüý¥Š•²z5BYÒvv9ØoV²S£${F\ׇOF>–Ûº•^árïÛRï ìpïÛ²pl/üó.en®ø†3ÿñL)NSQ®Ð;¢< åïÜGsÙ%!pâ?ùø?Î"\Žû=aùO Ùps„¼°F%Ho ­XXõ&Ýj…-„Rýƒúz"Þ]§ß„TåÓé.§xb‰ní¼ÝE°ûËRŠˆÜ“çðtò&Ï%åŸòöø²P›Õkå!Þb J eŒ•ûSKÆr+IxÞIDÇ;ÀÅzãŸ_ÞlVUà[“œÊdh mÂ{Ñ'Gw6–ˬk"¤’)•$,;%%Ë—Våº ÖÙò*bdIcÑšÛËIBÊg@§óˆˆ7`—%kPŠä7ºng÷;üJ-µ!÷K".'doP¤ugzUe %1ÝÞ´E®yšÈsé ¿•Óiï$šr„Ûæ Ѽ›]´±z”dYÇ9|âH”†Q—,‘ÊŒ[C¶ÒÜUÝ F™ÃkÆJâŸp´ñd-ù¿…ÒV»"ŠîSSkt­±5x.%¿]QÜ aP$Ë1iÎvÐJ'ˆ;J¸Ë+:lÏÖï&G܉À’s¶¿.%–kKN GÇÝþBJ…äžóYû¥ìK<"É2´–l¼í‘ˆÜÊiÀÑc'©ôÜev—!ÿåÔ˜ññ£¬pxób>´8ßyå¸&ïvJŒ-<´^Ê MfoDlïÍ2•µ4ØóÖ,Sim°ü:K*eRmkãw?œI­p"Î.8ZÓ¦ÜFÓ×AiRúùR2bV˜b…Û:)1©[hç™Ç@»©",̳‹ù®éM1ï%%K§îñîq—³uÏÕS$[wëßžç¹ep«Óµ[ì¼Ãt‡ˆ‘ÅÂÑîì¶Ü©ƒ`{;|ã.ý“øÕâ[tõv]ú1¸ßý×)ìÎyºVú=©q'|±,Usbª×O`|Çmƒ2ýîû©Ð`Ê›Ð|Svã~Zµ&ÜEÇs‡Užž­,ÙÐþØDæ;¬ÞKû3ë'D¬^´”IÙ1,ñ霉È9e¹ê aNev“µ†™ÛÏïFT3ß«˜pR‘»uJt(€TQÍÉ[SCŠ•²\éFå°.;€à ÂÇpûcëXL±¦?“ÄV¿éÞQ¸.ÝÚ§È 7õŸBÅñ¸ Ÿ£a¡³b±bœ¦½}Ûi……öîº=w!v¼‡Pãh’³cêP:Jîy>”Õæí- íÓäž[[M;½¼sð>9a:þ=¾Œ(¯›¾°üøòÕ£=¹ú2¹OÎé9‡úC¿ÝQLJìÊMÕZtÕàl.×´.!ήꮟWkUYÖÙ¼ð²¯úë1§þÊ“ÙÖkšJjÃ[X,ã¶êfëÒ\‚kïà ÇÌnQ/+YŸâ¹¦¸mœ¯?y„ß]2 ®Ìð Y|îkOšÇâ¨ÄYV,fî n§ ÀuÓï²½¤^ÁÕ>XZ`%¬“cÌ#âxÞĸ-€(êˆ'$¥{eÿ¬c”-Cà{–`ß•÷,GUH;ËÚÓ »ÃOÝ7ÃPw•˜Îf¾Ý@x›(—Û™]ƨǎŸÿÖÛÿÜ endstream endobj 6773 0 obj 3597 endobj 6777 0 obj [462 /XYZ 40.7999999 696.980000 0] endobj 6778 0 obj [462 /XYZ 40.7999999 650.899999 0] endobj 6779 0 obj [462 /XYZ 40.7999999 696.980000 0] endobj 6780 0 obj [462 /XYZ 40.7999999 650.899999 0] endobj 6781 0 obj << /Type /Annot /Subtype /Link /Rect [289.439999 660.500000 431.519999 668.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 6776 0 obj << /Type /Page /Parent 2 0 R /Contents 6782 0 R /Resources 6784 0 R /Annots 6785 0 R /MediaBox [0 0 595 842] >> endobj 6784 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6785 0 obj [ 6781 0 R ] endobj 6782 0 obj << /Length 6783 0 R /Filter /FlateDecode >> stream xœí]_ܶßO±Ï"‹¤DQ@à|gèCƒèCЇÂiRqÐkúõ+­(í©)I­t‘ øÎË5œç??üåË?Ï?ÿ~þðøå?ç¯úçã—SY”²þœû¿ßÝ~ÀU!øðk£ê‚·ýŸó×o§×óëéùôÜýûzbòò þÑ Ž¯&üýëo§ÃËOÃ'_ÿÖýö¿3?ÿµûß/çþÑýøQÏ×áÛIµ²ÿå×áÆWÝnëÿ}úûŸÎ¿u ¨Ë¼ý¿ßÕ²LÈ(8^§GÙåïí£èe†ÊR´üÌïà¬;tü÷_§ŸºÙ&0жb¬‘US.žµáý´—ç¶‘g&„5©µ¶…SÅNT×*ÍD=D,ni¬¬÷TdÔ7ª¼,³nb×9Î0%‘°‡ˆE­lD<œ‰Œw¥T*–Ÿ¦Šœˆ•<;ˆ±<žŠŠzV6ì²L.mŠ1=U4êE"ž¿@Äâ–¦QŒúªL%è¯SÅNT‹DÛ§‡( ×;¦"£¾VíÀõ~‹1=U4ÆKEÃ"·´õÖTÏIô/~Õ¿^~|9}øÜöºæËO…uøñòíTuÿéµ€Ž9^~<ÿ¹ÓZÛïÏ/¿œX]”­hꋆ«GêËHUT—ÏoFX>R>#ÓüÓåuý¿|ÐŒ€8žeø«‚0‚gS—Yp¦ÀÙ˜4Wl® £¼l|Ïr6|£Pm)ù-!¹&1+êJöÐ.xÆF9¦,š?ÑI\VpV k˜Jæûª?½t›5n뱪; æw_S»¯nßî¾¶¨-fQh„ÃgÊÏð™ð= ‘hD4R=„ÏÆ+¸žOpä Ž@Ø0v0l%ÄŽã=,üŒ7±#Ú9¶Q#µ 1µ\çáÏ0ÈË%aó²€°m„&m㥉€œ–&ø=Ž=üNNØ©¦0…c!Ô¼N Û&x¬wÑùx ŸG- c˜ìÃ#øäÅT€:F GðY造c8¤<¤6ÖrðÙ_8‘Âo%¤j¨å8ð†iºÖY qàØÛ6̉˜«0å°ÖF¡)A?uèšø™ÇTgAw´s—ÃAÐVã+'`ÊáÏ•‘)G㱩öþŒã=-zF ˆbݬ{SwF [³ BC•6¯P?‘;uÁ‡×Ìmó=ŒÃ‘ÁXY “ÝŒôVÂg>§bwI ö¹3®‡?!Àò7=*zñ7TÆök;R,/õÅeùO¼¸Âx¶'ƒïµÞú>°ù¤yYpÅÞ"/D‹Ôr´B\j½/Àï·ÜÍgñ¯Í®oÒÆæ ìŘÇÀ[ë´ÞÁ¿Ÿ/ÖîÀ< m¢ë$Ú ¨Ë‚àH¸8V¸#§ˆWµ!ãI€§ˆ Ø«Ç,bq"EP80 ¨ &°<¶Ä/h(œžïSa& GÄàõn»Ì"!ô•N.¹|V­¥~Ì~ ul<:‚8XÔÙD™[ð+% ìæ?l”EQ‡q`Æ¶â‰øŒÓ.ŸöôÊ gÞ±"Êv7ß§Ù#±þ£©îÚ™æÐ'wcZõy‚އʱ¶ÊQ ßà…Ò.*’ø°x¹¨K¬ÞÆh_Y=ÖÞb2£Ø 7ä–uìÈ $,H¥Ã‡’§#|(~/¼L œ°´<'-G2×…{oÙ“Yl_³å|]W•yã”@‚ðXàLê«´e­"‚Í*#Ûõ¼½Ó/D:Ä7“ 0³ª0ã5ˆ CX©·ÇÓ°™]XÕïÆËfd}4¨¯òªØí¿ž¾¬ž3܃`œ|S¶ž°£Tí[ß3ìXÁg`ØQ#ª—F¦(Åá@Jhé%.âêö=” f«7…°¢Yx¥8ˆ‰¡†áMG WcT¹•ñJ›”Øq<WZRfK–çå±Ä.ßn¥¹0f„!LòŽcím7‹Îàèh)F»ràœ?3îöî(z‹X<â7û,uµâLSt€$ç8ÅZ²pB˜$ÝFñ‚§Ø ´ù™³ £Ü›âx_Òº à¤[¥ì·üQã†GÍÚõDذ%dãáØ²<·6`†óPä^Û¶³$H@‡×¤s° a—¦³_|ª•œÎù×~Þ#3ó‰ìˆ¥Y¹b„@G´Ûr4QxfyÜãÑ–(ë謎Ž;›ÔþÔ¾÷n%à×`>Å$ ç ™{…«Kúù4EžÿhJ£O­ 5)ãÁ¡N[N˜ D)‚ÓÎÇËJ®Ü5 ÅoqVTƒKpñ.J£”ÛàK<Á%{ö”B)Ž Å)%þ°””R²ºO8ʯ÷‰\‡Ë»0‡$-u\£ØØc))9U³Ãnˆõ»Üê0K£bü|R[ˆ§‰ÄÍÒ‡éü€+ÆàŒ‰–9KhoÎ#øÑ\šðaa&ÂÍ :ôb;†þL22?ïx¹IsEßW…DfŸtfó9I’^V»6¯N[•¯¯{(ç<Äjf¬-‹Ño&´|AÁî˜Dè EQ?H#¶ß5j W¥ŸÂ»ì%†i{b9 Æt¤˜¼)äëÕ07B0œªdu ¸oêWçà¾]bžáµƒÿ)û ®cÇ!± }°[%-}îo¶cÕð:»iêÛv8èV×Ýá  ?%]ÉÊz22V®R¼[é{Ú$µ4é)[F§ ƒ.)ÇÜuŒ2 ‚Ã)àÛnsðC Œ•cã9åså3½Kó:««xŒrwëýèÅcAxÛDG`ÆÔD­´ž(¨Qã^ÁþÇÚîû‹9{nÖ²O ÝŠ7Â/m›…_°õqð‹S.o»ã8ë”)?¿lØRst6'ôÔ.±ß|Ã<¶Nª§;ŽîîåZë¬$Ýh°’\N Û†e€#%s;cjæ¶q#.AˆòUØ ´Îsx)\û»Vê€âÓ_IþãÈ×ÀvÅb%Ø¥«IbBÂ6…Ú®ª °Üûþ¸—rÃÕý¹—rwÐÁ½[àÞ÷¦çÝ—ÔkÓáa\QSiöÞëDþئ˜Ò6ñ…%1ý+I‘>Jvðf.M âú/qÁaBMtÄ5ÃQ©÷ Û¦çŽØþªX3wºUÅ‚‹I¸Y«â(ku'z×21ÎonÒ%Óë‚9&Z¿xE(eât#×&ä<1Dm,: ›§#5"` f¹Êqx*®tÇ}ür]¼í—npó€¾:^c’­¡õñ™gp"—¿®Ò¤¼/-ôy›É’¨“[öúLÅŒÔãë}X ™ÚU–>M$6Œ*x6@úäJÆc«/á0Î꘶7øÛK;‡íÊ:¢š#ö` Î"ä,­uc J&¥e€ý쯥Ōá¿,#©HLRé¼eíÈÛ–6@Ó è‘{Û†˜Ú‰ÕûèÅ76gÈ}<”ºö¤ ˜"DýjÆLšnÇ)&yïrpÅ¢ùî ŠZ¢ùýͳªV~ ï2íž*ZëÆK¿PbÎÜvÑ<«Úñ@>Ê|iû,my'Ãü_B~#‡WqŠß.Ëb¼ñ†ÏcôþåĵœÔ¯£œø('vë('>ʉ“ie’·ï±œXNÂ÷i×åÄQ<–ì·‰RÙ.(÷Kš˜Ÿ6±ØQ~»"ÖdÁ"NOœžK ×Ä¢~,n8™‚ùµ<G䉵c„RTíK‡ŠÐŠÑ~¶Ø)V>;¤¢ B6žM`éBÑ>p):æ*L<‚¥%–H¸&mÙ'…w°|£ìlÊQ–Rš`û‰ŽžsÄ8’5_ a4Gáu¤^D(¼¾¿eA)¸Ý§&¿OÍy¿etM»¡2:UMf¨Î„ž¹Ð {( 7ô䩲Ê}ÏH@•^’Ô£ˆ|©µË£.G&Üäm'AÄJ¬ÐU¤ˆ9¦§dÑ\D@ì‚‹Ð ©â!· cúUóÌ)Õ¼°I4Ï)B ¾x‚¥D(Þùý¢Ãá7b=³#Õ2‡­Ýï È{÷^-h|uo]&Žà è 4ìKê-à—Ú›©ˆ±§·<¦c©9™› QNáåÁ­Ãþèš³ÏW¦ùàgKûóºÚ|9âçv ×ÛExW-z}\X¨û{~íx¥c…þ úÇ×oæ±¹®¼rݳ“ïœúýò̺e̵‘m™ôÔ³˜.ûÔ &e!çÐV8TyS4ózd3320£ogÛR×u!ò˜Rcî= >ÓÂg†ã¼áï ÀÛ¾ÀÚÈ›m`ºÛOžàwõÁ0³ÂÏè½3æFZ‡>^žÑ Y»†í²"¸®ÿ×Sݦ6#ðÎ ãÌ£:9žyBŸ–‚6­ÀaGŸQ3ò@WüÌìŸñ™Ê–!ð=â½GW“. igY{:bwàùc÷R¥,Xïžz»ð6aX(ÞDöžSžcççÓÿâE( endstream endobj 6783 0 obj 3694 endobj 6787 0 obj [463 /XYZ 40.7999999 469.459999 0] endobj 6788 0 obj [463 /XYZ 40.7999999 469.459999 0] endobj 6786 0 obj << /Type /Page /Parent 2 0 R /Contents 6789 0 R /Resources 6791 0 R /Annots 6792 0 R /MediaBox [0 0 595 842] >> endobj 6791 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6792 0 obj [ ] endobj 6789 0 obj << /Length 6790 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€Õð©XÛã90Æ@AÁl6Á"³ˆ³‡üý¨[Tw›ÔG‰Å‡¤ÏcO«Ië]ÅbñÓ¿üýøÏߎŸ¿üçøÕü|ür`«ÙðçxúûÃí¢­¤~mZ]‰îôçøõÛáíøvx9¼ôÿ¾x}h~ôÇW þöõ×çáå‡á“/îûßQÿÔÿï—ã_ÿÖÿøÉÌwú·CÛÕ§_þ=üÂmÿŸÛßNÿuøËö ´çyOÿþ k®E­¢àx» åç¿·CÑËz 1Þ±öȹèáÔ=:þûÃÏýl0ªNqÞÔªa‹gmÄyÚN»¦>r)Iµ-œ*r¢žM’‰Îñ¸¥q¦ÿTTÔ Þ´çeŠþ ±3SE£^ •ˆ†=D¨”ìçf7_ÏÃ$—xg}ÀÄùƒ¦bÝ0øúU´§½>ÁcœéÛóu%Îë¾]Ÿ´Wa/ËžÕöj˜ý 5ðý¢ ž7ÏÜëqÆ@ Ìîz?Ÿ?н«Øò÷L‚ßÀ>6h˜òx÷}röÀ>\ó_Ÿüú0Œá•Võ;ÙÒ†ªfrƒÇÏöº,¥˜&èç×^ÏäѲ֖Ú`Ⲉƒm—gðX,×óüé?;–«ÅJÉüU($.^.OâGÄ‘• Â=êa9‰N‚§wt)4&IÔ>ÄáS,SkQ˜B‚ÑèaG Ÿ°#¦Ä¶tñ[CŽ~•®ç­‚CL‡ n=ô ¨Î,n EÅx8?‰ÖË+¶öd Ì“þ>ýåR~U€“íºÐóÖÌq0—`¾ ð|€±4ü„ ºÂñd!£ wNU^7¶.'ècO@F1`ÀQM€®d 0¡YgaBpt•¶!4Joâ‰uâ ‡³å7ØZÛTVŸ!]–{j¦lÁ#AápÞð{ÝX@H`¶óäq°G³8æàˆ§å(°Ã;JeÔOm-m+”Dî+Á1ŸüÙEÆcy\ìJ‹C˜cãøËAp“Ýÿ2¡t£×V’øÅ!žys¢ —§•\öpÙÍâL–T]xÒvis¨ËÅ–” ˜$»Ñ5·dbŒ=>0Ë¢FÈI¦‹4L´æ­òFKOðÉŒ–ôDÀ1 Bà‰ÊTøÇ’‡á@’×S†Âª™§p!m!á¼nL{Ì/Ú+ùcjqÂüs9×FWaç8~¤†Úຠ/·£x Ìcî#è Ïlð‰„œä -'Á÷¼Œ›Ôð žíß ²+é ®/nѨ`’37JQ€²ZdIrw¶²0$Ñh@9B™HÖX8©s •6rbj'ÁQå ‡òx))-`êÜø¬ØÃcÌLÿFp>ªè½iìñÑ}Û2«SÝ®ã ì£áxcQhX4~Âx+á,àØvŒEÚØú>ï‹â±a^.ˆEÉê,X”ŒÆ(È¿E±(ô< u 8@ÉÔ‘â ʘmÐD©Y6PJQâÐRÒ¶ ËÌ6¬ lÅ,F<Þö °wFÈì*ìOA(¹eí¡ßVJš(‡Æ{+«ë€ÄÖd—ÚAã•B<wA¢ØçâhÖDäùs}J_v–qý\’Õò, 'ׇ«ä²Ô†—.+™?ÿæ¾×’â„Fésž³Ež2"‡œ9Úå‹ TÚ{J6|Bñy@Ú<$M‹5ÜI²ˆ½ÉúM¬ÂDSu_c¬àlPà'Qè .jΩÂUkéð/L˜,‡~ÎwËíSlÊìªÖ)dÿk+æ'›?ÈUšHáÛ¤»CËɹšF[à ­u¶9Ó)눦á; 9´ÜÒéÛ¯=÷ôÆpÉq ;ñÖæìa§Yï¿@xÖÈÅÄ.¥3]¹\€XûrÍMb. FGŠæª¥}‘’8·…€enYAêu²âÙ3ÑÕ–6øþ\ã­Øþ»ÕTiRw1é©Bí CÒ¹¨åž¯Ò)<ííeiòº’™4Âr‘uãy[›¬…4JÚB#m  t•¶ }AŠ>jiAŽË©q]H¦ã©³R¼ƒïÆÀ”½/åäòRš`WoQ[,Zîø<§l7ŽÊH¬œ{ÌH\^s›º;Jo®•ÒÑ)Á®G±âAŒ¾Í™¿Î["»Ö’¬ˆJΜê]4¶˜ž¡Ü´XŒÙK¹é4Ÿzß놇ÖÒæÁå?¤¦~y#uR¡LÄfÌb=ím¥mŽ—¤];¥g\xDÒp'DkE41UjŽJw`vÜ¿¤yìëSª;·ÐâÒK·u È\T°9¸NÑ®;êbƒ´kŽNï¹ç£Â&꾆Bµ7{2ó!i»SBéXâ6–ûkĪ:a$;—ø«”$uñIï X1¥†@ظp˜”RuQ(ýâŒN¦Mܵæê{lj—7Ü'uá¥\ÒAéY3›Q‘°ÈîÃ,/!×rw5¦ð!&¾ñØZŠì&mûšCd´Ræ–•J[½šTĵ®îlZ@«š1×ý$ë/:¾^ PS»y|ŸÏò›0ÇlBüÌøØ-ïŽwIƒÏÙãþ€ð‰çܳÈÍu¼m­µ¥Ø&ˆ±5EA$àäCX®ÛÖ¡ö]ɲ ó“3ÞN©Æ&¸Ê£ÝÆ}ÐíÆ>¸ ÂÜ“¬wyéY–%‰zgÅeéRô=¯uÓW „jÕ{ì÷lÆ?×qô„Kk´õ„?…³}01†]®SBǸÑ!r¸ñùæÉ£ñº•Q/×ÙžÐl ŽÁïÁ³y x†ïé ³HpgÖ¨q §`û q€ß3—UcAm’ŽýlöÅÛø‰‡Ú˜ c Z8ÙŒˆQ®çè“?,©Ïüå¯Qsƒu©¤€Ì8©¿r@¦4fï£ô}WIËŽ`‚TŽaã–<á'!9wÂͧnKÙ:Êrì‚äNâíßB5™¸‡T5ä=~¯T‘OP§Ø®km«T¸L*M­ÕlùNÈmŒ)²v{¸'r¥¾+™µÂ.¯°ôð:e×¾ôµyk÷1Kâ·†ìĤÐî.Æ1Ùìõ9yZ¤xrn•)n[ˆû0»«³3©êˆRmì4ˆ‚eCå€nžUõžà—ÂèšöN+òÖ–8qXsóIÅvÞÉÌìé”:Ñž#‹‘QƒIÝÚ*luƒ8_¦ä•Ùƒ®…j£BÎè®üÊÔ—§p¸¼Ëè†"®úKrÞ›ÊïèÀE& ãòâkÊá³ùL-ÎQJ‚ÓD9{rmÛÛÑ|Ê£ªêÉp³–ÖæŸ'—9{È+o¤ŒaNZ¬¹ºK²Í)Ž®¸štÖ±PÃ7D5¼5Äa.¢êñ‚=%‡*iÉã÷Zd:#þ#/pWKæ­/ Jß½Ú‘JíBš{ÉçÙ`¤ÈåGÍ¥ðOâKŸðE¯„+m)×NQ®F“„¢qÏÅq"EjPG:^®Å£\Mì¹ä—R”¯jÃWÏ•¥I'%SÙótl™µé$AbÑC{ˆ_æUAŒˆ|…Ÿ@=„y$-~)º _ÇMºn_³G™ Ž)yi_{‰‘I\±a=„¯ÛÝÆ¬­n#0¯ñÕŸ4¡Ó¤ib¤a—:Òã•bojBÏáCy9â¶›ç¾nò~“÷¹óz8é|”L½«º®êé«NUftЦjìB› ÍÄ“¡²HÊJt“ý_´®ê¡È&ÁÔ{Z8¦ƒcQlD%Øù¾Í8S³ Š÷ö“'ø]Sú6±Âg4Æ”¼M=áh¦x*lŒ¡XÈÚ lgˆàºÓïBóf–ÚœÀF„ñæQ0ò3ŽQ®ï1áòÄ{L°º+$Érd:B:ðü±rÓ¶¬®ø©#Ù{Âb¡Rä7wž½¤´cÇ—ÃÿK( endstream endobj 6790 0 obj 3693 endobj 6794 0 obj [464 /XYZ 39.8400000 358.099999 0] endobj 6795 0 obj [464 /XYZ 39.8400000 549.139999 0] endobj 6796 0 obj [464 /XYZ 39.8400000 740.179999 0] endobj 6797 0 obj [464 /XYZ 39.8400000 358.099999 0] endobj 6798 0 obj [464 /XYZ 39.8400000 740.179999 0] endobj 6799 0 obj [464 /XYZ 39.8400000 549.139999 0] endobj 6793 0 obj << /Type /Page /Parent 2 0 R /Contents 6800 0 R /Resources 6802 0 R /Annots 6803 0 R /MediaBox [0 0 595 842] >> endobj 6802 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6803 0 obj [ ] endobj 6800 0 obj << /Length 6801 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€ÛâC”ìñL€ ‡ ‡À›M°ˆ™ì!?ê–Ô3Cê£Äb‘-uËxÚV‹¬*ëŪâÇ?~û{ñÏߊßþS|~?|;”ÇÒ”ýŸâôóáíÈæ¨dÿ±nª£lOŠï?/ÅËáëák÷÷ËA˜ó‹Ã¯îá8E?àoß=|ì'?ôÿóíáÏݧÿ²øS÷¯_Š¿þ­ûõÓ0Þé ?MkNþÝRȦûÇÛO§‡ÿ:üåwůÍyÜÓß*#kÕÊ(8^.¯ŠóÏÛWÑd…J¥¥.„œUGŽÿþãðs7ÚŒc«…¨®ËÅ£Öò4l©MÑ֦Ѓ:¸-JĤà葈CM”ºöE&½åMÙT±ˆŽCES¬i5Ï@'ˆDj#éñPTÒëRË3šU‰çe¤X‚é²m˜ê Q˜ „Ç#‘é.ÍD÷q¤hrIͳuÎñÐŽD¦».Ñ\ÉX4/CÅTu² t‚HÄ¡6RE&½)‡}-t,¢—¡bª%‚=C$âPI‡"“¾®Ù¬T4Åj&1ß–Lr둈Cm$½3ÔW»W¾Ú½/ž??>> ­š“™ÿüsÉÙWè=wèVŇ“QØ}áù§â÷eY™?Ï¿ÚcÕªºê‹þ‰ç'Ïqð´˜NYœé¨ÑO)ªó”B¥hNÐ\€)åùI},m0E¦Gm#ðx~Ò,¤ì¿Zu^T#仉ÎOôë|5ª ŒÚ#ªG˜Ë£9èˆ âA´‡ÞŒö!Š©mHŒMig0¸JX5ÂOÚ”6.D,ˆãÅï ¯O(KŸàm6¿Äår’CöwYKÏÍÂ&s«Ä ì<ÂWµÂxòáŠÒWØÐðÏYÙs:;·eÚž=¹ÅÄ3üg.B!V‘úL§JA: òÜÚÞ_æ¾!”1>Ùßh­o¨ž B+mNûÜ^ɉý/Tƒ96miÞÓüi’AªL­µül“UB OÙƒ([UK6†™±¥ªZŒ0Œ†]mª÷ˆ¬M,šÖKÅÁøšx2¬ÁÔŸÀyðhRÃ'ŸR¯±ÐÆ¢”« çÅ)€X+9áÑʃh™ÚŒÐl%Imüd¹ý`rZžesŒ}- xb«SÍ Ó‚5§c$`tIl—/õw’Êw[À»–qÃ粩8Q‹8ÒËгLÙ?1B4€&ŽÀ€òÖ}×agBp%ÆSôègg;4Zïšh —€Ei¼öܱ4ÚñFùe0'<'—X"ˆŸ;Hr%Õa¨ibð}]'M¶¦ð…C²])q¸å¼BQØŽSÀtaQé  º]ãÀg$Æp:ƒ{ßÎÓÉ=öp¬$û#DÂï*Û¥˜.gRì6hŠnƒÜì(ŒXÇl–åÑòµÇ{Ki,þöس,F¿c?cËyX‘Xs݆¥¤¹ømþ$Ühõ^*NEáy ŸÃü>ÏÀSHøGD!l ÆJŒ{ª6ãj¹*âµÇÑcüNIáKˆ^aùN!P>y„øàØ:„mñëåØFÜÇ~º1Ž]'Õå4ˆ‡“0Wì²ï&e_-ÚûãØ]ö¥à¤K¾êF9 ïû]öݦì«êûãØ]ö¥à¤Úlš“Ju yÌÃI8Œ€©„˜bù‚i½sìÀ±m5»Z¼15ùÅÃ˘/qÆ ÖGxâ5Yy´­zÓôõÈ$,ÇÜ·[j[¶Ô¥v.ß­»kq_%o•û°=†íØ]ÆÞ¦Œ}-KÙ¹|—±¬Ü7SB×*˱È^BçŒa® ^ÒTî‰]Yæ©ÃÕv=šSI!¸¤í š§„ïày\4ð  —lr9q!:N!Nz z‹´OŸÆØšñ`ˆ³J‘T1’À}­z§€ÊääÁõ¥ëF•dÓJå(€•ζ`Ž›a»ÚmÏ…žŽ%”Sª2ÖŠ„Tûo×Äm'•–½p˜ag¯i5Ø6sì…åv@¥_Þ–,i¹¸ª*‹f{›ÐOAI‹R¸ &½Âw*?Äb 0 Å"̵Ñ¥éék5jSÛÂ+ @…`]‡`Oé“ÅZ[}ãí!æËæÿy‚X!Š ˆ±_áö{iêÏî×m’ÛRƒïÔ\2·ïsÇ•˜˜á$f’F 1!…Ui#QÕÖú¯GXj5',7U¯7ßk* ®K¨å5›žà“ƒ k'¡V”s&èh»A›<@´’ÌjÌs¸Í ‡ ¾ƒÎUe«á;¶yXýÔåý(ÊË¥ acñµCõyº”Vã\QM-Þ‹` 0jR3w އvµÇ4åµßÓ„ZÒÍrs³OöÍŒýñ€®‰x—ˆ²´½],žµIû¼ó@ æç鼓RÔÂRÌ·0é&uœrÉA€4` TÎa¾Å¶ïÄ`•”+í Æ<°K—·¸ w6‘d -€tYåJž´HJ*=..çƒð¼š’¬à9(_úåŒÉ.d;ËB©Íï«w÷†HûRƒÛŒ–÷AËr@/Œ½âI¶SÊXrŸ–ñ–gY]ùë»I¬èdÞ+¼]ª8Íó]ßYÃÛŽ,XGJ–ïÊÞ,«9xa1A²Mml*Îjó”kÚH Þ6¹,¹EÎ. Ø––@„µ¾‰þ³œ]f=Ûëj©äPu}ÇD [žC)¬=…ŸDÅ(íØ«‹Ò§•9²g?Aây7DjÖÛŒ¾Ý×Í…s~¿{‡HxA`LÈ‘¢Gbn- Ù,'Lë9÷Mš3týÜÚ¤âq×a¯Är.ÅœW.yêWr›¥¨ß£TVâéׇK %/žÎ§¬¡ë½Î‘½KC†Ž 3ª_¾ÞþôU?ÅlÜ‚ÔÛÀ5ó!ºßQ”DŠi‘)L£Áï¤ö}KqDh6žEpùrë>Ÿ…dâ»o¬ø1õ¡¼Åµ™CLQ…1WdáÓ…h}V¯¯D„ç=›ŒÎz±#s]àÆMÜ4-†âÏÛ*“¶¬,eâ±…ÌJ¹Ø†’!cêÕVcwgp˜›Ëq;Kž½s>œÖeŠ‘¸ xh5!ù€Sî;V÷..2¥¤l~¦-–ó 3„cº9¶+åÂr,)§¾‡ç1ÇŒа-•»8`ÛžZžÃǬò¤™$ ¦=¬3ãiÝEzn ÂÍæ®Þ³ÞSÂÖäÐß[+O~p–þÛ.S;-Ÿaiµ§}³´7 þªšáå©­ièúùD5~÷õ«°-õ°{…az©B{š\Û[¡ç.Ùਘlî a£MÑ~®›wz¿O™f–I‘aÖ·€bpeP×Äa½l\1ÄÍ"Ò¶' §>JàÌÐ÷´t¢¸+N-}@ü:¦Ä8€oòÔþưgê.)‰·ßÃÕº©,³Åª™DûëÚu“QMÜ<éXíõ)„Öq”²»\,%‹Ö4W«µ_À™:Wܨ‰NlRž *a©$žcxÞTª€ø>ªqS^o/ƒ‹Û\./ß½Æõx‰]³MySYïHá®™&¤‰þòSùÕ6®NybÚß°ôFÚQZD‡QÝx3–Þ‘„ù4f¿N‡æÈ–Øzèbµ|í Í´Xráܷ妄Gˆ;øEœå®¸Ò6³KÙÅ¢­m»wÓ6å|nŸ8b"â“M°¼ü”5Üì6Kq°V—{qqé'¾ §(Ôè Nk \ î)ÀÅ%³ð]r]Ÿg…ëKù7.Æk)BIB”×Ã…Çl=Gз5ó¼ˆ9S¦åxÖ¿×s…jüÏ<X*OiôI¢h†N·óÜW‰±“°‚;([~u¹ŠÅãŒÎV‰yL³´']›<þX~[âš-<¿»Œ¾Tò$Eßz’>¡E…åNàÔ¸ÝÊúí¦©w u<ó`B [Ž6( 8¶nç×ó%¦Á ôҘ“-p(ßcs`@.ÇIÏ$Ï…r—8a܈È5~B±ú MŸðNçõ.J Á­Ù«PÚa™Æ¼>>Ø$­+ìÁw<:'—e_WãÝG1…µ¤ôž€ž™O¤öDyg—Ü~ÊÃüAžéM{0~õ:Ã4§I<ÉÒihC`X'=Ã{äî&œ ™´w–±ÍŸn3±eA¦áòƒ=wKd Û7rì¾;%É9|Bp(rI#g©¸Iö Éê=H²ËA¯܃$Ü´N$é~Š—N…têáô…á×÷â*£òU}õª#ï«ó].L!:4¦’[aŽg³²P¥~¿ ÆÍtp¥ÕGYõ±¶ý랥ê‰'½ÚWê(Ûɣݪ:šÞø³Ù}jž¾ÓÂwú¥®åQ–ê]“‰APMÖ3õÛÿù¿;Ä &0|Bï ¦úÔðüаw† Á}€í¼"¸îôYV—Ë$ðj  ",Œ0ÖÉóÎÄñ¼+ˆaÒ)‚¨3\@1!Ô#Ú?ã;Ú•!põ Í3œ/¢ ig9{:bwàñc÷MÓ”æ(Ní.Þo ¼MŠCbÐeŒz¬øzø?;/ä‚ endstream endobj 6801 0 obj 3490 endobj 6805 0 obj [465 /XYZ 39.8400000 785.299999 0] endobj 6806 0 obj [465 /XYZ 39.8400000 640.339999 0] endobj 6807 0 obj [465 /XYZ 39.8400000 785.299999 0] endobj 6808 0 obj [465 /XYZ 39.8400000 640.339999 0] endobj 6809 0 obj [465 /XYZ 40.7999999 543.379999 0] endobj 6810 0 obj [465 /XYZ 40.7999999 543.379999 0] endobj 6804 0 obj << /Type /Page /Parent 2 0 R /Contents 6811 0 R /Resources 6813 0 R /Annots 6814 0 R /MediaBox [0 0 595 842] >> endobj 6813 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 6814 0 obj [ ] endobj 6811 0 obj << /Length 6812 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ) Xð¼ä`àrXìaag,Ö‹ì!?R‹ên“úH±D©Õ3š<í¦X,ëÁzúø·Ï?ÿþ³øxÿùâ‹ý{ÿùP••®úŸ¢ûýpù7¥àýÇÚ¨’7ÝOñåÛáµx=<žÛ_L;Ú?mã0DðÏ/¿>öƒúo>ßÿ£ýô¿‚oÿ÷kñãOퟯ^÷À·ƒit÷á·þ㌛ö?—ŸºÆÿþù—â÷s„ÛýûAiÑ(>×SWvü½ìŠk)TÉF¶(²ö ¦Zrü÷_‡_Zh'4ÊF2VkYW“¡Ö¼«*&‹¦Ö-héõæ6Ô\@Œ×yu±ySc•¬Ã È¤gR§YûË™J0 i6Á8g™–Pv@æÌl <„D¦»ê8IUÏåi6¹D“‰îFlÖ̺CHdº+fúI 1wš'PsiUåÔaÄæMm <E&}]±Lªf€4›`uIguåQ5™îf°dóYÞä2Šjòê0ÊÄò•ôºb–Q›jæDÏ æj÷»yu±yS³¤€"“ž+ÞO³žO±Ô\@’gÔaÄæMm ½ê9‹¿ÁÏþÆk ãÝËáã“é|«—_Z4ŽZÿçåÛËâCçt(Y¼|-~h½4ý×âå×#výœ9_Tõñ yú‚=Äžà.Pÿ o”Æy¢²O”¦é(zt5íø}‹jýLþoáÔÀ£¢¯”¢VÖ“µß[ê²jú&Œ£èÇcjxöüèòØ÷Ng”š1†Æ¦#Ë{ MYk倀¤® Jp`ÍïÜ…ƒ³~^/­TÍ“‘ÈHëe¤QV¬$š‘eű…}*[„vïJg,ã”ó£%܇?ºrŠçõˆÖÝÃÑê‡1©Æ5‡™B a¦ºøÂ¿Ð%g&Fz mp<ÆÄ£š’ÀþÄ1Š˜®˜£<ðÞlðšxKàñHÞÏ“±RIÝQiB=&Ä<0}LFI Í=’ÄØ&ƒ~dR m„¬„£#-á›Ry=Á–GØb-2½…Ý¡[Ä @[pBÀ¹´ÙTZ»vsº³›“&˜Zኜ]ï Œ\e ÕD‚Æô&ž€"ÁJû꾎¨ìeÕC­:NP;dg‰uÀÿët©ÅZÈšª±¬7`޵Öv˜Pž£óYg…[™ßŠþÇ«%)<¡‰»ékTœ1Ça*b{„ׄ`Ã0W英ÆÒǺ"@7áÁ°1™åý¼c4ê·¨ÀMÙ'ë,›a„©ºj†šD‰ ;† ›Ò9qÕ­˜¤GÃŒc<¤Lßáìý„‚Ÿ#½;åpp‡pq@ ¶o0XG ÉáàãâÜÌ„v¨+ÕtF|£»¦+¹ÔËŠ—ÆYé]&Æ)%¸r(µÆ˜;æ›w˽MÖÜ íç(jö¬³|\ABm¾Jè!_(]ƒ‚ƒM Îà„g̰Pã<!‡˜7WIÉYçU†¸ìS4PÊ„1€ó¡äk%Sïm3–Vþ÷nhવ’@ÝyL‹&Œ $Äûólírœ¾YøpO`³>½ìŒr*‹/°ç3.„0t”.FÂÉ£„@aO—eà,Òð36“ Á8בâ‘3b|^²Óc/ŸÀaÜÕøÓ“Ðu‡[ÂȲë·C3êÒ÷±›.õÝ\[#\õ?çEb¨e¨t*kå´°‡ô>ÜÀ> ç§wbûÖ»cr88>¡e[ cJiWqd›æÎ‡=Á™Ú$Uö¢: ZcL¸™ igj]#V•ýq{Åu)zÔ&ᆩ¡YÇq[ï5ÒX9Œ[gú˜>¦›€-x¦ZcÜîÐL¹©(kw 3…kŠ1`ý´ÖÿTË+Uç_)5a ûÎ…C^KW«%XEjËì¸×©Ió¼'än`f+Ùu©„cb6—ïUO¸Pý¬»ûD€Ó¯ü¸¦Y<Ñxýc–r¯¥)^ß ù+¨þkíèÿt½±à!ÙxèyµÞ¸|Ú«ÍÇä‹ÛÙVšÜ™D­'©ÅSFß+^݆w +Uk”/%ÄåqCÂÌ·z»Ï¤+UŠælÄ&KžÝ®«½£^ (ŒµRŽFG‹|WIN+5Äšö{Uª7y¯Šª«ø ã9P‘8ùO(?ÀEyK (ÉòÀñ÷¬‡Ü9LíÚ4í:œd†«NƒãÔ9–:¼Z˜¾„»{ÖZ­Àm0YçC*~ÁãPŠ¥ ¤[t²–ùPnjºk2Ög‰+#VÑ5º2qÊciÂs ¬½Šiß_ûä•3 ‡v¡+ݯ‰¹ ·P ­QÈ5Ažyý=>Ëç–´9¹6§dŸîsmîb§Õd)¢Z&â³N  áé¡ç‰ã#sY£*3½'p,VÑ&µ8yÙ=‘ÝÙ=‘÷¹³\G×(§üJžÈîoLàŠÝßÈæUlàˆ©N¿'ç~¬ÐÊÁÎ+ Üȸ$߇߸tꯗ@Û­;X&SŸ2ÞôÌkž;抑npN¸wfFa€—-Î{?4åÊ/"0§J„pZ&s¹â•ocXÒ¨Ø#ji.T†ñNW«ë\³¾ÂèÓâíõo²¾Âœ.Ðßë+B}öúŠ('¹ÕÆI¾Úõ_Å7ƒz›4X+¢±õ|_Ãòçû&Œ*†;üv]œ[ߦ¢ÕÑç ªÁ®ñ›RtÁZâ…—¦û#ÆÅÙŵÉf­K=‹mdÙ¯‡gx]Öã)©z¤¥g~!JÞ8ï{±G}U©û@è¹¥†ãا}zÖ«yÉ«ã ]\…6­æËoà³öjî‘>¡>64>ÖÂÐ<¬§õ±+–2wv‘ï˜ÁuÝg®NWÇáÕf>°'0Ö)Ðçq|ÞĸÙû'’¨c Áˆ>°eL#ò3ô‘¾ãXó52Ž CN¢ I²<™ž!þ\¹1¦Ò%ëÞmö½a1aP)ÚkË2Ú±âùð!:r endstream endobj 6812 0 obj 3440 endobj 6816 0 obj [466 /XYZ 32.1599999 679.699999 0] endobj 6817 0 obj [466 /XYZ 40.7999999 533.779999 0] endobj 6818 0 obj [466 /XYZ 33.1199999 677.779999 0] endobj 6819 0 obj [466 /XYZ 40.7999999 533.779999 0] endobj 6815 0 obj << /Type /Page /Parent 2 0 R /Contents 6820 0 R /Resources 6822 0 R /Annots 6823 0 R /MediaBox [0 0 595 842] >> endobj 6822 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6823 0 obj [ ] endobj 6820 0 obj << /Length 6821 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€)‹¤ °»Ýr`Ø@ƒO&Á Ä™Cþ~TUTu5©â{\$UËÜíR‘"ß¾ññÝŸ>ÿýðÏßï?ÿçðÕü|üüP«¶ºü9œþþpûÔG%/¿vº9ÊþôçðõÛÃ÷Ã÷‡OŸ†¿?ˆö<Ðüޝ¸Løû×ßÞ]^þpùäóã_†ßþw‡?ÿûõðÓ߆?›ùN_øö ûöôË¿/¿)¤þsûÛéá¿þú‡ÃoÃôyÞÓ¿?4m#ÚZG­ãûu¨8ÿ½Š^6@¨jë¦=!‡uŸþû‡_†Ù®Ë8öµ][wUð¬¡á„‚Fk9üÞ)ó‡²õÎèÑ.V·¿L9‘>A ^‡‰¸­èp¦ú”Äî“/vßwÏÀ_Þ=÷'÷Ë/Ã2ΆòåÇ—oõðŸ“õ1°â—Ÿ?V•jÿxøòëCìÚ¦•ÍÙ²¾<©.OôËçê—šËÇZu±Ê͓ΫϴG)ôù»/OäùIw¬ze=ùx~Ò v½¯—VÃ;kTpz{ÂÙ0^Z (ðâç!ÇJç5s‹ÿøe Ë8*µÒ€Ð„Ö¥Õ•¡´Æ^PŸà1â=QÃXÔpm5|ò®à>p4ôýà÷¨÷tI‡YAÂDâOõ½M•Êf1‡ç®$³Zˆ8xç}ö¬†°#Åm2±•n-è{VƒjˆuK éØH rE9¶Â2J  ó%”›ž­…³éÜÔÔ iSÓ<ë.‹öv0·ƒÑþ´ :i wñ¡R»æüÖFÖ18Å&Ä‚§ØÌÀøÁªŽ‘pŒa4 TÊý¨¾ îkõVù™DIª$?¶rž²á é×ÃA"Ø%&¼‡𘞾6½@ªPpm5t<^†(Ä‚:x§sXö%Å‚G3`twµwW;Ä՞ƒO1×+¬ Jêg-Æ·>ewr/ÖV5ã+a„um1»¶·—Ž­™´:Ž1Ɉ/!;k×nx%<4ãÆ‹[s[¶C3RÈ)y6C!žxŒVy¨ gà£Ô„…BjoÀ-8úA5øŽ òÉçll CϺ±©Ã?=hÆc: ÎÊ^b\¥èD£ éº=¥ÈÅJRŠu á$RÎ^CGAœ‘žpÞgLú)ùtas}Ô}eÙŒSIˆcS·§­Œ©mi§Œ©Žm'^MR½GKRèÅž1Ðôu–Twhõ&Ø0ñbÏ’žÐ=õp&ÌIZAÝ Ðu˜—HoéÎvh¶ÉÛpGÌô—‹ûùÒh—u£+ÚŒ™‰5 Æ‹=s÷3Üänã–Šf¤É¾ß[qC‰ãV@q úð•àýaÁ„ÍôpÇ[ôŽc“.ª§ çDðAœ¥LWÉ×ÈÒ–7Ÿá×Úqû•ÞúŠèFD¿ØÓŠ1ÖäP ~â.¥5äcxÍq©n_xQ'BUýZŠ˜ðì힟àwÝyÝÑÏ öŒ>žxÑÄàf¥ó]Ë¢?öú<±o^ˆ5¼ºQ‘LHA”`¼~,¤‚»ºUš1f GU¿±2@<#¨ðŒÀ&Ç+'—é5WÀbY¡Ž3Êÿ¾’–üO,ôÞĈÁ¶sÚ¼ö| ‡ÄÆr‚JX!1üäθĹn[Ów  8e „Œæ|2Å .ÑŸdÔúÒ¿…5Yî’{7¥LÍj$£>g‰‹´eA¦â‚]âS …I„¸!€€Â66 ò%õfË'œ„ AVàÍA !ßE( káÒœð!êiµ€èÜC_Àzêõ(§ÕâxÏ™«5SÈ áħ«m%(€$€Å¥(Nöî<­aÌŠNc6Ѩ…ê9¿$¨ûcyÖ³9 !¼Žƒ#4ÒTiÌŠyט§JWXˆõKK5°X><I±ùÒ³ú𸫛Ôàˆê§¢’X™ýÉ=ˆÂR|)gy-.ÁÒôÆaT½ww“H¼ƒ»>”Z•9i™3Ë jKóä¸DÈÒ´…Ëó\\L[¬ž[‹kö'I„…ãTcùm»÷iOŸ$mq’3fD WnÞX¾¢L¢•PB@qÑblË3„b³)F-%””³l6b—8|ÛkKt.OñÞçeñ–uølK€ÞI‚‚$¥û¨ $¨ì˜qÅco’K ÌQ`D’Šƒ-÷ˆ?†¡`k뎒V­U–2cÔÍ;=â‰Î`‡ÃuÑ =üÅ’¡ ™±€ ¬®&y9.se%ùCèñUOʳ“¨‰ ùXí ¸¥•ÍGTâàKõgñäɃ&3 °òºIÛ¬/?¿g6Ïl«~Òí|¢!&]M(5Ê¥ô¬[(.ê‘ „€e’ªÔyó‡%aÇOÞæTgÞO³ÈÍ7Èù†=‡i¢´È;Äzr°ç¢3iÉN&+*I­^D 3‰ÑK(ŽYw·°Óµ¶¯E:G°È§‚¥t?CVÔºp…3Ÿ\&‰QUKï"&!x÷ùÛÂÇ`õ½µ¼Ri“³®H6¶¹ï•ð!"î_MÓ…€Ñ~ù3\EÝ΢0“è8‘Žý̰òÊáV‹GuÞ©L,–H‰igB¨üàÈmÎi9‚ÂX¸ñ΢ ª³eJ’–ë„|™ó“äac:ìP¢ñY­ù?ž%†<å4Šãñ‡×‘Þûù÷=öž7öî³ p»SE1æ› M˜Q–¸˜Þ«ZKP)8 q<ˆ^?š¹8øN¬ÍM¾G%ªYÏ’èÉï¤öÕµª"EÂȹLA’•EÊ;ojþe°½åùZͬœW jiÓÇ[ñ “„`¢rƯŒp¡Œm¯B‰çäî4ÁàBW©˜^³÷(_–”ÿrø¬euS÷–¬Þ«ƒh2éÁBvÚÉ æa½RrÖ šßXc7„r)á]Ê.(es—þ—ºd©—rp»”~³Rz©0É|<žRŸqr+³ž©_áÆUk[ÝGô›.hKqê}ù÷ÙË%i±g™Sþå’ã{›¥Ú|ìT×puNäO+ëÞVáczÎÓÿC÷ ‰9¿‘ÄŠHqËò~T dL€UýˆtÒ&‚Þ|¤pyë±ô®õy„pIÄRU'™A¨ßp3-𳳄¬-Êt•Á,  ÙñWÓˆƒ$}Jf@Ý}ßÖ-¤Ã“DGî4|M\õG8I¡X+AîC¨¹q B ±t¬?e-U‘Ù9Ý®J›Fk¶«çKF6^ '%O$SÁˆ=QоT›zòH_ijI:Üð ½L­¾§~Ç4ô1¦àc :ðÉšiG@ˆùHÚyO~‰/šþ5!OõÅJRQ“,*,3ç3Ç‹GóEÔwZ¨4{±‹£îòÝBóI‚+ÑÉ”E°³üèV¬Îš“ëŒZv%ý‹G-³ÄÂKû›ÊgÕ5s¯±¼¯º V8kAž3ŠY/¬K®ÂÕåbúQN1Õ¸“ÜGÑsÆPJÙº-eõòz·%¢9 åTW1gµ Ê(–.Á(Y¡¨O‘iX¬Ëó}N› “<&Áê÷Ä3áDöéER9Duõœ¤täsJÅ’šjœNÆ1hx‘6‹ópî‡Q‰àyÏ}˜y¥Ï¶í„³%CuOÂfLÂJe­t*ñŸx’o0•ÇIŠá1ž¤%N¤Á¤¥gm8ùf’½à÷0Và¡*ŒS\B€Ó³ð=Xã÷àµád/‡âøñPˆHÊ?xŒ÷(tð ðl>Å0ð 0¨—SÞà¡0Š%ÒÐ`õ¹ÃeDX>y`Å îáB™{ÓFœ’ ׿Ñ`[~R†Ïôõ|în)î–ân)îVÅ2Vm?X0f[_€)Kå9ž+¢?T5Þz¼Ûi÷§ Ò–nGÐò6íÁüÙpÕ^Qeš¼Eņ¹s~{½ß&êýæëËטûÞ+·TH!î”ýjg»ýåÙ²³dö‰(OÛ ö˜c wšµÝfºž-7Õß=¢ÎS<ßT)§@ ®ÊÜ‚ÞñZk¡Æýï^ëîµþXÜk-CåJîTþ2ŽËq¢–;g$æŒ G{ñ 84 ¡“Ž7g¢6µƒ¦‹1Þö1áM¸ãò¤²t¶¿™Þ‰?p°LàlgK.HÒ[ VàmÚé9@šB…û>œ®„”. ùCL­£`Âxx"¦8Š #¦é:ÌÏ(ÓF^7ðLW¦ÛÖ™ò4ñ‰Mo$ývÛºº¦ Çp╌VP1WHS”jÄ=%%¿o¹›æ:Qä üÀQóÑPÜi8«‚¶ÒÈ’>&˜é, Û±÷~ä|§ì€Óšë3å僉;î’Ü<» ÐîàÍøØ ]‚,bÙ!-Ç´Õ—c™îÓåtΦڲ̦ã›™ã$.u"œpKE’máI\ÿ´D-àH+ ±îÀ:OŸVŽÚHJž'o7½0oÝw{îÆø»«ôt+ ¿å´÷<´ÑÊkÃoȘï=IWŒ-ˆaî ƒlk=‹¡´Oó-Ä#稧ë ÞÏÜ1à2TÑv¥©âÎzöƒW€)Zž£‚X3Žc>[ Å^;Ån–b±µ‰5/C3¬ƒb»—û‚à!å¢ë©ÇÒà5[¥[ŒÂ7\`ç¡Ò[ŽoËšÌù त5ßi1ÏA»ܪÄí'QŸíÚzºº¾µ€æœ ë¦~Í葉šˆ"¥L±iBòžÿ2âqêÂ|f,üØ£'s ûö¢ì…já»bÙ4P„»ûª{½m’ìj 6ðh¤ÑtN¤·)’Œ1ËßYáÌŽ×aíÆ€è:4U_>Þš}*…©÷?áÉZ1,(V ¾¤ ¼îÑëÛzŒø9–I[¬\&É¡®8"F/ÃßÃ÷0¤Ÿ¾`~|ýæ¡—Īûä%2ïÐYêÔíAœÜ‰ûBzÑÏvâAUWý¢dÚöØNw~èë£c ]-»c7}2«›xras¥Ž²Ÿ¬³išc{±Õl¥9õ ÇôpÌEtwò(+õª“!éÙ.æÎí'Oð»¦~gb‡ÏhŒ1—§ž´c&ÓÆŒQönÖvf€ª;ý.ÑÍb[pèt`ü¹ :OF1” q?ñ¬¥Exñ`ÒŒ1N¦ ©¿Ç3¤gÏN8ÂCGUŒ1÷aÜA|ãÕï|j6Ècñ1 oi]µGqªmÍd˜•œâÆ ø”R×>=üÃ7,c endstream endobj 6821 0 obj 4875 endobj 6825 0 obj [467 /XYZ 40.7999999 146.899999 0] endobj 6826 0 obj [467 /XYZ 40.7999999 740.179999 0] endobj 6827 0 obj [467 /XYZ 40.7999999 447.379999 0] endobj 6828 0 obj [467 /XYZ 40.7999999 146.899999 0] endobj 6829 0 obj [467 /XYZ 40.7999999 740.179999 0] endobj 6830 0 obj [467 /XYZ 40.7999999 447.379999 0] endobj 6824 0 obj << /Type /Page /Parent 2 0 R /Contents 6831 0 R /Resources 6833 0 R /Annots 6834 0 R /MediaBox [0 0 595 842] >> endobj 6833 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 6834 0 obj [ ] endobj 6831 0 obj << /Length 6832 0 R /Filter /FlateDecode >> stream xœí]K$· ¾Ï¯ès·KzAïÌl€,¼@A'0b#ò÷Ó=U==+5%‘"%UOÙ€w¼5¥Òƒâó#ùí¿ÿû៿¾}üþ?‡Ö?¿èŽÝÐ-ÿÎÿ~óö/ôt4zùqœú£žÏÿ~øåáËáËç‡O§ÿ~yPÃˋ맇—O,þöïß.XþæûÇ?Ÿ~úßAþtú¿ŸýÛé×ñοðËÃ4çþ½ü ´ÒÓéÞþt~ø¯‡¿üîðëi Ó˸çÿ~ÓƒÇ!k_^_U/ÿ¾}úØi‡ºqõA)}šgÚŽÿþãá§Óh¯Ó8NÖ(3êÞž~ž;vý4éÓÏ£YÿIúÒé§OM£=̧¿P§?ÝyëM*s ©³#Ë@/3RyKSçɇ:ÎV©ñ| ɇ¼,sVÝË2u7çîØe¨Ü›•šxÎð<#•·´uëCqÞ„ù4вt•{®Cå¤{®s=ÍHå-m=ŽÀPÔ›0Ûiå'êË\èëP¹ âè<#•·´ËÖ{C}bZú*´¾^üðùáÛÊšé,£?ÿtšÉ‹ _þø|Znøæ,¼¦ÓÓ¿ï:eÿpøüóÃ|ìg3ö‹f ñ¤3à“GðÉ ~gßÑø¹ÙïÀÑ>àg Â¾ß ìüÎëù(ü;=| à¾Á§`:xþ|ºKÂ7c:Í=ƒÊÍSÁ™jËþÕÓ'ç[ŸÔÃòÉÉ\Žþ•ȯÅòD+èI7¾<±Ç±wŸ€£Áï¨'ðüÎBbÊG5Ÿ^G[Hùd÷ ý ¿z²\ÀéhµóN÷|¾£–ÝŽFéþë¹}€Ö˜¼Rx¸R Î`ùÎx4sç¼>wG±]ç¸!¶{!׳u¶ò–qÌäMsÙŽéúÏëþ=)}ãT­+kÆcçqðÉÊ3o<Ñ£;ï{à»êrMìò i&ÓJŠëù$=ñ¦d¡{Ë ÌÄûfÔôU(zpF0yÎ<°r]"Ž žcúÆêg÷WAê Üw}Ö¸sõ&¯ÀK¼pÕ_¾ãrü[»¶ð[¥Ž½Îû ëžEú6~[?|„†gÛôøUïž#h Á³)f §ÅÁÃçc׬€Þ ìŽ{)¡)„f™N)~€M\Æ)eœ‘Ò!µÄ5(¬&ÜsŽË©@Ô4‡ªXƒÁˆ "KÃÊиIÜ!”`UŽ™ÁïP$õ–X¿;ª}Z7¶_]×'_„@07 î<%ÙXUà»ÂwÖã°°»Ùý^t³EQ‰O]…9|å` ¾ƒñ\±€ŒÞ‡Òšw벎 èijº\jÔ'« õh'à.ƒy"!\¸iQ $¹ôÀïÙå0ôqÙNnýÌ7.¢~l³›“•É$´ÑÎÍÙÛH˜apN±EÉ! zJŠïf4¿oßÂ0TßF8”èX´r¹M]ÆÚQÒm9XT?ï‚Ûš8î©ÔÐ…´XAi1éÞÕ£Ò½£°03os7XýŽúZ1¤M_Ó¯Ïá¹H.ã¸ÖÅ!OÛ7Š+u‹Ÿ@«×Oz +¢…ã-Þ-åÐN(>Â,lWä$4fFƒñÄÉ:T…X4f%M:@šÌz9T L¦[5åø¦)±¹]½ClµàaPV\ÇWG‹ PT\?‹‘äçUÜ8Óñ÷ieœGG$eE£i¶ˆD㜠PJFàkÒ5Ÿê. áÕc#ä´0p%Mci|:%;Á^¨Â½l`•¤ßÐsŸ%«×ªÞ%cJ]TB‡”ëNqÀç„,e‹²ù`B­k<9Ë‹]ãÐï ï¶ …AEä#É.†}> °ã¹UÛpþ ½r¤Ò]ÄûšR®9RÒ³|mpZz¶oNC‡LWp}ǯ®ˆÀ½ä¨DàúôSúƶ¬‰5qÚã ãîòOøM9@õ¤ñA˳§‰S,X¸ð¬Gž¶/¢m\u/´çCEp˜(‹Œ¯5ÝÛî=E÷ˆ²c ðÑVT™€lZK±²ŽF½ØÓ«ScSsR«1½î"ol&soßG|›ÇaýƒÐND¨ïZTIâÆÑa‡ =;(v7ÀL×PxùcàJæÓs²NÖpVo)6eÁ» +œâigA)º\ÆôâÙ 8FˆxÀ²LŠÏŠÒˉñPDÁBÖ‘'”B„/·LŽ&Åûì}/§CN}|Ì—‚¦TpbÏál%xYÀ„7 ¤Â5J‰¡Z°^ø& *UIFÉZŒ™–@o;WÉã*íeܶdo$ ªœA»g@UÏ€ò6 ½—DùOœ 0\íõwB^»!´Bw§²·ƒ- ú¯åGëÕªx@kÖZÂ(’¬âþÂSÍÉMË)ÞPJx·ÆB{Õ=v–/–‚ÕNÛwæVÛ‡ïr€)  D Qâ— Gûƒl4%ÁN]ªÕ´Þ q³HÞÀ¥7|¶º¢^;±Ñ’ ƒê$DÜIgQH‰KÈ+ƒÅɦaÏÑý T ©ÌzpÄÊîŸàa{ÑF,Ðé‚ý0sÄ7¶ysË£Ò1˜ÛÖGmÆpgé¡Âh9ÌðÍÙ ›JRAdOÆ5ÙüâXÖ‘Ó/žTCa³v`ïðö-šBz¨™’OW¦È9OM,Jx0]3Åô’FÜ–Ú²ï›4í¯hÆ|Oèp÷q—­¿#iʩё ÒÏà€…ˆôqÙwÀ´„òT¢¨1!ã—#ñ‚-z×£—·1mg£Ôæo~¥¦$ ©LÛÒiV<ƒT%aß"©Pºô#Bï©(ŒL7'³!õá=FÄVá$íÂÕ^NïWYRÍwwpž oRÛÔàU XreymŠ’]=&[3‰u­Ãx•"9ŽSžúzÞàÌqÔ'Å‘$’úÀR cåÁü ±rŠ<óh žIV- ƒh±\ÀÕ:JÞÕzÜ«U)ô*™eºVâ¹’Ó£†Óuªï¯[Çæ¬jN-Óyˆ‚ µÚߣ8†¡5(ïXrB3½‚r•ÌRW„¸0¢|bmµSB/¤á ‘5kO…-sÁ{U‚«;8KBGLú‚ B|sóf¦%,¾vËIÜ»-,J%©h+pÇRöZ* àÆœk¥—¿;¢!^Ð4Ñ|wGȵLÏÒÓ-Þ§¡¢w®?™TŽ‹^a®!6”PŸ%C®ÛE7’Gr’žâR%£Äs‚ k‹§Òfà;a¥Õ„%Æ©ÙNFw¾WŒÇKÎ[ˆR§%šÉ8bF(ƒ¤5‰TÀ~î§Ú—ûÞªí…8î³DS;õ\)¡KáR¬ Ù?9nîÖpW’ŒYõgÞ³äSî|õPŒ öF6µS¦ò«°Ün0¾B`a¾ ÷ÔC„)#Yñ†–b WuðZC³;ÛÀµMÝèpù;ãÇÕ5Ê„ü…Gd”ÎAÄfn·]†íú–’ عã§áÚi§9!Äœzˆ 4ß©ÁšF³Al­ íêÎ:Ä» ‰z.nÖ¢ ¼åW<µ Öi3*>fõ¼/'ŸtÊOs÷Q¥³NBì’“„è:ÍZq S6®bAÒa˜]í‰âzô"ã•lCŒ4ã»,õvIäðþÁ4®´{:`\k[¹b™iÎ0òb.ézRN+!wŹÍ0*…æL¿ñµ„Š @K ˜£³6â¦{zÜPÒ/6¹ûƒp§dT²Íj×S8ÜØ>náÞt #ÌN+ŠùTÛ»¸;8¤q9ŒŽÓ?™Pb^¿lfWÜÈêzÕj-î¤aaÂ1âqÌ·vj·)²Ä©|¥$‚R²µ(ÅS¡ÿ’ØãQ'[$õê¥+$$œ)o8÷JËÞÂ8ª^$¸&k+ЛмRŠ:"˜5K<¯L,?K¤Âj*+û(•Ý\†Ð­%+;ÏÆa‹»úžrÁÊø‚vßL˾™,OÈ’ ßoš*>¾T̺äLsNFKÆk¬-¢—·“|ÅÓ­‡È•ÍàBÜ LŒ ù)`CøÂPÀÁ9v`™‚;ð%…7“/Hv¸xŸ´õ{!ŽÐ°r Oe 60†4bŽàB]3ª`PºÞçà)àQýUäÔ»*dâSÄÅ,c±" ïÁÞÎhv"†<áS¢àïÑÒM’a÷³Ã±ïÍl®þàˆR²ÆêÞ_EÂh9(aV70¦ËÍ»;ؼ}{eI0Ë©ØZkZ \]…F`±¼ù«çµlOÂ]©;8- NZC¡ÝPAÀ~ªñz ¶“Ž/€ÓG± &Õ^í+„˜^Šãã¢g+”s"·'½´\ѾÄ}: l‚|B$ïb8eÍÍäž~\oBï¹tôDÁïÌÐÛAOV†uëI»Þ¸´Ú\ƒ\žAÒ ©ÕZ—ÉÇAŒš¡ÉàJ”*iYqy´×V²WqçÝÖm{á*9¶„Ë iˆFŽéŒ² ï B]ßÉ’ n‹ úôДLšH€à{Õ™V‚ç¡çIž½$X]Ž$Ú¨†Àâɯ9y2%Xr I,ѳöêþt¥ ô fdeg,¥Þ¶¤ñ"N[Å÷&áTí'XÑ6á†6sïðUJC›@ ø°ÕÍzJ·ž|Ÿ Ð%ß´mRβzL0¤I(O¨üS½rË»s@%tU‚ݰði GÃ)þ4xJí%–°ÔûÛgtÎë²ÒÆ:ÀM½kˆh#¾+ƒûÍ„’K{Œx›5ðÙ·9P;Œ¿äY\‘ZÉ\ÃäFÙ|Bz­¯òx¼P&¿nÈ&Gd%«ÙtÊ¡DX½bIò¤°*7„ÔþœŒ_Y¬D÷<ÇѶê.3VPÛñ(bê ‹C“’œ—~™ji£"D (V†Á:b¥a:£db±”êÊñö·¬0fxýY*Ôw©ófè"d¡ºWNÊÑ&šc2p<]É#Øxù;?[T­³âΙ‹Ñj¦ø! pÌôF’uÓFg­÷Uêξ T5†=0›A¬Ö¡JYÉGqy3.( ¹Ì¨’°A­súkh¤áNŠYÚbê‘ Ê^™¨¹ ¥Á¦0^xYþ‘а{Ù#Tƒ×âÇÆę̂WP¼¾IŽ·vKÆô°fµ%aŽhÿÓÞ""÷#«¶8nÉÒ<Ð#o®qîP,ÆÛ—9ä`¼»M(˜p ±Z<°‡U«•Zà?¿®¹ ç[ û×âF#ø®gýSÈš¥“eã°Õ¸ðýÙš¯iâø#øä|Á'땼ñÄôàh0l|øÛULØùA-ÖnÁÂÁ5¼:Æ1§žpàìÙ’vdRÑâ}²ò Ê“;2Ÿ¿»ž÷H sÁù¼v`|?ÜÂ|Gà0ðzàtxwÀ½†¿£`þ&¡4ÁçîíÙùâ²#ý=!Þ'†’&S)ÈKœ¼ ÑÀ'̤ËRzІW ŸiI91…)¶yI>_º”´!ÉÕøJK _„¹_€2Aù8UŠƒ“w½€Y/ð»&¸šæ(-äÉNËÍŸ°î¦Œ¾Ó´kqZÖ0U”<{=FÏ–T¤³ß¤îI¹%nwØ)=ëW§O·TR¹×Ò©Å›p#GSaL„U¸Êo²­ì0–þéøLk{ï/Àª“ p Jòº»Áàý^U1ˆZG8ØÉ:‚æ> 72W˜*ƒÜÉâKq¬w;ÕÍYRN HéÅ‹ól–À>b+ÒÔ,ÉR…¨°T‡ÝÙ¸”s½»ïÀvŸ.‡êÍ~G{\Ù’ß ì¹ w¾é…Šë| vp tØ…÷žÛ­'ð܃ÀÜ>Šk ‹5j^Cmëæªþ²v<›åݤ{åô9/¥ZQäB’<ŽpÜRkû¸æÆ[] p‹¨;I1lå²±Q ±¨9»²#ËÌÚó£ZùŒ®´~ôBu‘sj±¦ûƒ)éç>Ë)\ɼA 7¡E‚©F¨å‰YE!‹žRá ½ÙÞÞÇ b«’‰ZÖ•2…Ò ZæW9 ‘"k&VÀ.ûø~Å›=WvCt`Aä¿V³…rzIÀªB#GdÏItŠk!ñò.KÁJö€5CÃ``ìdÖ2…êÝ´B…ëö0»~!cõTRR®¿ZÊ)ßNV†ÀÚ?ÜG`ñÖ¦¯S:X²~Ý0¹‚GV'!Hú…®ÞˆGXYH/ï!ü eø0Bà%ÄVÚáBèUÈ"°Ug\óSwëEäd2/Å㺪óøR©z³™í…­ÝG‹F>'yäF;Û¿ñØ:gá1DK*D ,J|øt±]*¼ÄQ2[&ÁZ\2€,µ±:X 15pîÇuŠDxÐèRÆwÝB„Ë$TZ 8XÜwmÑã%›RtÖ‘D¥ k™aÔ1F"ðìíhù[ÄXÕ ö ¦{¿À¤ïÓ+’Ê%oZ¥ã4KiççÉIÖ€h‚fÂÙq—çêSÊÀ—rX{)“ЙY’Vבô™(KÔeCº %²ˆ É€ù2î¾g‘P”N|9RRa :¥uº‚5Š”yö³¤a¶æ‘iÆUhãn§É‘›ÄZg Ø„z ÔBPå˜K9 ôò« Ê)FxÃËš2ÎQV¯H°Yò¹YTÄuàmrLh\ k }!ZBLkݪ7Ê=ÅIb Õý XÒYGF™}º‚Í#›÷°o]ѦýO<ØÚA\Z¹‹sl°ï0¥T@ž’èònr.vVGñ è— éàˆ<‡VÑ8opË䕹ˆß먄γ‘Š ­ÁµAx„}ZO§_«³ŽzK(¡µiê”æÙðÞG£ômJUd§aJñw£¶®€YGºÿ‰ÇõÍÊ å;VBÎ &â}>qòЬ’ár ÄÂ:ŽäRÖá·=èNÿ¾œøÁ麟aýã‡_ Âç,Ý•³| ò–à«ñâvÃA–qKwÕp\ ›™îÕ.]Kµ Çáö¦ÍöP£ãmèåxãÉB|Æõìp¤õ>ôÇa9—,o}gß™Áwž8ê£îÌWŠÝа¼5ÚB—oÿæ üÝÕ¸±ÂÐ;+Û¸õDAëX/îõÄ0k_çör2¨îü³îÕ=mE¡øV™qƒÔH£ð.yâÿM`.t.Sif•ú·v¤Zø;Ñ@z¬´ß÷ÞÓy{ ß>øìÀó†g»ºoÞ±ñÌr·¦©Žêìæúú’ÁWIŒS}÷VÞ1ʺç‡ÿa¾Í~ endstream endobj 6832 0 obj 7258 endobj 6836 0 obj [468 /XYZ 40.7999999 567.379999 0] endobj 6837 0 obj [468 /XYZ 40.7999999 567.379999 0] endobj 6838 0 obj [468 /XYZ 40.7999999 437.779999 0] endobj 6839 0 obj [468 /XYZ 40.7999999 384.019999 0] endobj 6840 0 obj [468 /XYZ 40.7999999 437.779999 0] endobj 6841 0 obj [468 /XYZ 40.7999999 384.019999 0] endobj 6842 0 obj [468 /XYZ 32.1599999 336.979999 0] endobj 6843 0 obj [468 /XYZ 33.1199999 134.419999 0] endobj 6844 0 obj [468 /XYZ 32.1599999 136.340000 0] endobj 6845 0 obj [468 /XYZ 40.7999999 109.460000 0] endobj 6846 0 obj [468 /XYZ 32.1599999 336.979999 0] endobj 6847 0 obj [468 /XYZ 40.7999999 109.460000 0] endobj 6848 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 291.859999 108.960000 299.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn2 >> endobj 6849 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 283.219999 151.199999 290.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn3 >> endobj 6850 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 274.579999 191.519999 282.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn4 >> endobj 6851 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 265.939999 161.759999 273.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn5 >> endobj 6852 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 257.300000 138.719999 264.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn6 >> endobj 6853 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 248.659999 130.079999 256.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn7 >> endobj 6854 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 240.019999 132.959999 247.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn8 >> endobj 6855 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 231.379999 154.079999 239.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn9 >> endobj 6856 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 222.739999 202.079999 230.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn10 >> endobj 6857 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 214.099999 192.479999 221.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn11 >> endobj 6858 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 205.459999 151.199999 213.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn12 >> endobj 6859 0 obj << /Type /Annot /Subtype /Link /Rect [50.3999999 145.939999 91.6800000 153.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6835 0 obj << /Type /Page /Parent 2 0 R /Contents 6860 0 R /Resources 6862 0 R /Annots 6863 0 R /MediaBox [0 0 595 842] >> endobj 6862 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6863 0 obj [ 6848 0 R 6849 0 R 6850 0 R 6851 0 R 6852 0 R 6853 0 R 6854 0 R 6855 0 R 6856 0 R 6857 0 R 6858 0 R 6859 0 R ] endobj 6860 0 obj << /Length 6861 0 R /Filter /FlateDecode >> stream xœí]I¯ä¸‘¾ç¯È³ÎWIÀ`€®m€9(T>s”ÇÓ0º©ñÁßRJJI¤‚b”òUVýÞ£$®ÁØùñçÿøòß×ÿýÇõç÷_þïúmüùþË¥ºU¶þ]ûÿ~ZÈæ¦äðkݘ›lû×o¿_¾_¿_>_>wÿÿ~öþáø£{851Tøo¿ü<4~J¾¼ÿc÷Û?¯òúŸÝ_»þù¿ºëë_øýÒ´¶ÿå·á!…lº?–¿õ½üé׿w]hîõöÿÿÉØÚ´•ÎêÇ÷ǧâþßòS¨±n†ªV7ÍUÙõÓtÓñÿÿsùkWÛ£·V Q[]WѵÖr¨V_ÛÚvU7^¥ÞØ"«Ê­ÈV‚¦¢¾G"oh¢Òu¸ªä©ïþ§^çôQUnEM÷ƒ¤¢¾G"ohÓÔÃUÝL%:j©»µ~i¨¹Ö¢R÷]“Ý–-ÒŒ?ÔÍ莭hæ>¾Ý¿f>ï³edf¦-—L[^õÕgÜñ<,EÓ »9ŠßÝBnTÄ= Õ< rœ…©âºì•èÄå—SN}ÝIJ’©w*:lêkQ_—½ªO;õÙT¿µ€Ì{; FvÓÞN=:áœ<â©)~dþÃäO•ÿ[cÇàïÑ´ÜÔÆQ0"&Õ[7ß¼³y¢œw_/?Z5½5õõ¯<½›dïÚf®?uÊ–©äõë_®ÿVUêÓ¿_¿þíÒÞL«j3ØpÃñ|b¡'ÕGð‰„žH°ê=¾JAOô/`m5؃–²o® œ*av*Ð7ð¸×:W)¼> øD óöñk·ÿØw“»ý¡}Óe`×Âs®–„¹¼ö0]ÂORxL±0¯ŸfÇ€ ÷ ¦òìøD€\U€tpú=£yvÆñO¼\î pz]ák È@cÃ~¢á‘>¥V Và)´s|¸à¯V)È;aÙsHÕ䃦-ÌŸÔ‡‚£«òV[ ÉN ôMZõ0m&²¬­±Ò,IyØÍLYƒŒ×7=LÖ‚æʲ7)šÍ¯]b¯oÀ\çö„[0n‡­oÝfäÀu…¸mû>EŒbä¨'ˆñùó ®äƒ[‰× õÓo>ÎÚÜš¶rȤ…fþÆï4Ü“A­37%±®~âüª×˜”Á‰pïÁosW/-8®”†³V˜ ÄÎð¦` %!§ñÄ ±öYOü>‡g€„ÁÖ<~Cæó=»j”#ƒ4ã‚·0°P‚§#F*‡ÛÀ½÷hÑ^î­•;ŠxŽå +b§!öqü(ˆÑx}ij¨n¶«ZÕ¤–WÂѳà'¶;êé‹©€)æOm<ÍÁ„ë-è.w‡+ 0» š;³úá} ¯#,ªø$0IoËŽîT!0 ‘Vê£ ™7ºôšýZåG÷ É®fŒ–®ÉÒØÜ$ܵõ‰ ^§é_ZÒdh T;=rhÄðj¥X ë÷6DŽGÁ9Ú[ʲÁ}=@°(e\¾î4f9‹ MxÚÇàdˆw­áÆÐàâi6À7R\/”ò2àœñdž·Y<úAÈŽ—›ÉðF¨€ ¾BL§ã5pZÕ‚´9u-[—SÃÔ›pU=ýz~R}Â7|BÇ•:+ôDê1]¢ô¿>âÄžu÷ÜÖ–ç–r…†– U1ì;õ¼®•_¬š%XÀzµÍngÞ3/X˜šˆP ã;ÓÂÛ×7,Zú1.¥ÐÖYK&Ý Ô´cÒÀÄD–"·³=êG†ö˜e…‹„ÆGZþîö€|_Q„ÌB)I>>˜×² 'ɰˈܼ"Ì=æñÚ3‚'çS º «©tŒ50°NC * fÚw¬{8"‚5®Éñzåω‚§Ä7r˜¬·Èñ]õì¼Å4À'SøøäÄ©”Ѽ¤¤¯ýLÆgLŽñØã¬°Ì¤È |›)Sœ©•rÄÀẠ÷Z€öÎá)3çwÈ0L%Ü愞gÔv1”y^£O³Î/Ñ"L¸™øÙ xL÷µHX½ÚÇ9îĺ&0¥ÙÒ:üƒ$~~¸#晥E’¾¡v ‹ð”ä‚áÎSÄUH]¦LF޹Ïã™=¯ëä ±ç’0¥l.(“HÌ™¡•«„MêM3J÷¹/"æö,ÇW„8<åÏBáClRoƒçYÙOÿ#ÍËCð‘D¨©å7¡O°>Õ#kà„¾XnÅÇ Hò;0"üä9ra¬K/$¯Òœ&cånúgÊðGäÔîûQL€7<ÝU?aÿYÒü’$M!|`e\Êõ‚÷ˆQD'‰ÿÝH°SÔcfà*ûî癊Ø`4 óÄ*bÈè://³à‹`&Õm6ëY¤?;~×9Ð Qáž_P[”0ÂíÞ,âð5Aº„ñ“4æR”T­Q<ôX-xSКáÚ@„ÂäÙRe9+óÇAƒ„)ÑÀ¼ÆOÇØ%Bm𞃑Žá=SLU0W” ¦ªspoÝ’·ºãñìs¸Æ&Ñ’…2Iý.½»2¥¾Ñ³¦¾Ÿp¤ç<'Ï c8ÈãÄì§KØ\~iœ?z{¤'m³œe&}…äXÝ ¥S†[ô%Ù^0§­¸ðNáÉØ+‚w—tt,8XZe`=~"ññ6"‘Ρ`ãÄd ƒD€8–>Ë^ ì²}ܱõãy¯ÿ8l1fÖž²m(DÁáUƽ'µq6ßK})°§–ÍL,«4P?^/g‹ÇiÝ)(Mˆc")ˆ$ð\i¶`2•Õ®x:<ÆÏF¢Ú$œ áé"Ïé."ÃI(ÌhŸ~(v+ΛFÒ£)"0EÛ!ÁÑóº'b’es5WÑn*³ÃaÖ:3ÙÞîã[í=©&ÁU÷ XüÍœ^á}ÓBߨ÷“ž8êió“¬mŒ2Ü´«[Ž!ÿ'JL;zУj“PÆ+Œ·jG¨­‚jKi§ç`N1AŒœÀH 8ž‰ïHW)ô ž7Á­.LÞš¶Þµ*t1iÔ¤g OxÆ áPBœugbÀÕ<_œï0‹ŒPÙ”+æ;>#ìÂ,qÉÝsïbo8GCx•ƒ¯œÅV h(Ü^DrG<‚^`X¼É+§%Àò‰YÏ$Ïô0kòÖŒê&Éôaæ$ß%)°…°·)sL ¡Œž¼%FnxE>Ô £XiZáˆô˜WÃPb-'ã~ãu±LrƒèÓÈ–®×’P5%˜"ô`zϸ?Ã+i·"<[ñ¢&©³{>ׄ÷ÑAé9Ö:{„$}Õ›ùW– Bf‚Q-åÞ|ñ, i$§$ü¨jF_}½“ÂÐ _N‹‚¤÷“’I¯)ˆOÄÕ0«ˆ8·`E\U”"üwõßZ_à„°TÚ‘7~ì:0ÁmÄîa±‚’Øp€Ù),Î#bHOsøô SÂÄ Ñà 'ƒ ¼U-#+Pk|rXº'±\…‘à…°o1έ &C–{bد½´Ez¦¸ºi#30Ð Œÿ âÜ_ü‘=šƒÙ¥O¯óäGœN_,”6@š†XñOeÖ)ØgÎ@ÎààŒ¯‘>E³¦ðó0czÐúê)îµ*A†qé!²Föåß[?»Ž·9 ;%³"!;†çôÞ3%‰Ñ¸E²ñ8%D­]QÊZà‚ƒ=¹h¦€ˆ…t ŠP2 ŒÆ'OFñRÜ<9¼  a’àgC%d Fv‘XªËB\°²•¥¸P+°Ø)²ïèðØùYÅŸÊÀ¿4õ§J”qXËa·¿e X1ôxâÒÄ9‰øÛ*Ì›ý€áƒç9TW†Ù¼¼?g ‚¦ ëSÜ w⃩ Öë¡ ïµÚS]Iî½OqWKÎKNêˆ;ý)ª/”ÛÀä R€Hâä?è=ÊÌ×v Jo;‘8Çf2)®Kb¦:/Ô4йVØk’èB=R¤IY»ä|Â]NÁ¶Q&¤jVtíŽBÆøDlðý‚ŒŽéâA Û§:cuëHè‚4WÑnß y€Téµ·ûä®Z@OªiÔÆ}Ö#áoZè›Q—ê¬ëÕ‘ïÀñ T(ªÛàãX´3nÝ›öî¶0·#yzªÑ æWÈå½.àÙɸ‰-%Óϯž"ö”¥„ twïl ãðMÀ¢g¤£Ê‰Éb’­‰„ÐÊœµÄ¨î9Ñ8ú¯lJ=‰‰@’âMâãÎeb…0(åF!/ÉöK9É™yÆ V]·Ž a:ÚïÇÜa8ïòÒÔ#¿-`[6¼·|—¶- ÝÕ•=æ±4ôÄÌóàOcŽ ¼…´þd¿Ê>ÑÞÜgŒ4t|ÉM$ç´x5X=̼5£Ÿ6°ŸÊî×:à)Ø?Ôòf§/CßÉ™O¥3„Ô‡U¿ÕõOá:~Ž •üO™5vœVö&pÜh®}I¡W†oˆéÓøa]ä·wŒyPÔˆÓ£$öÆL3`½—›ƒðå¤Eñ,öáÆWÆ)‘À¥Œ$oçcÕ)ŠD_æ•çdx‡fœ‡bQ,f='¢´°ŽtÉò+" OÄ·)))QÞPBçäf•Њ?íÓÂJ¹¡Â#ÆR9žJËõÌñlÀoÀO5æQÖ·V®s<…WHºÆù¸ºõM0[9ž`ö§°`;ð0/t¤M\þ)˜Í:Ÿk>,ËTÕíz88¹gpp<£"_*{Ìb‡}gãÆÝxòVs̸O»ð&Îfeå€yÇCÙ'ÁãJDˆ¿^Âðüx˸ïoçÏŸm¥+_Þ8ŽØ{H0‹{7‰¹}Õ¡Wá'I‡(â W=&]¿ K׫—Åá:G2c‰ÊTbÝäø(&¹¥´I‡%´b•Ü EÜe€6b=‘Èxô_»%•7€Q?ªou» ÉÕµíl¢^—2j…“0N¡Ô“® 78Ò΢O“ÙçwA|;çU;L·h}¤Í¡×[j¸«_ÄÎàÕ™—UŒËZÍËZ«k·:¦º[¦×ß§¿;s´iªî×þG-D3”Êk]M&ìTòíbÛ›­l1•ÙfYËø×ØF÷þøwÓvu¾®j·®äÛÅéIÿ–ZÖ²Ƿ˯—wX͉ðæDÄ‘º@D݆»=ŒÐeÃh‡)Ùó GâS`—0w¤×=¹ô`F¢Ún¢ïólFª¶]üvù¦z¡Íý}YOLÍb…V#¹ÝKU_"G¢œJ¾u‰‘tç·ªu5Õ²™þ‹±ÀÞ‰Ö©@·™®¤ÿhÕ™û[f]Y7ók7þÒ´/Ìà­4jòVª‘ô|Ä>_eð$&"â“€ÏoËñ°¿™ˆs~MßERm?E÷R#ÕÉuA4Ùjã­¶[d«—žºlïoUëjªe33Ùj½E¶ZyÍ(Ÿlïo™u5fÝÌ¡dkœåÄ¡¦œ²;?âTRxmÿb¥Œ[4in$#Ég± (¼2qâ.FŒÌAi±,ˆæ.V9ÜÅê-îb­»í»»ÜߪÖÕTËffîbåw±ÂkFøÜåþ–YWcÖÍÊ]:•w­Ìop—2Øt)="á%ÞíTwQJ䦰“}#ëvYð›CxË©kË©‘[–S¯°®­š®Ä³œº²Ñ6k™þkË©©¶,§~dë6ºÏrª¶ÒXËz[NÈô=¨<¨#PÿVÏ‹Z-†q }óBÞ99h~m±5“ÁÕW- ¢…SÛ®…“­ª ád+éH¾ÄNÃ[ÕºšjÙÌ,œÚfK8µµ+œÚÚN÷·Ìº³næHád+½KNÜ›@Ù±Õd ÉÞ75ÄÒ“ŽÀŠ-€•® /ñèI>h®¦Z6ó '+¶<V¸€¾Ä¥§á-³®Æ¬›9”žääÐ5dgGxH1U#Ž}bIO>¬xÑ. ¢IO9V¼U[V¼U®ß—x¤§Vü\Mµlf&=µeÅ[åZñ}‰GzêaÅÏÕ˜u3‡’žÞ·â1ăy!@0<Z÷*wx»Oô¤ K+—ÑûÄ8ö¨5[ö¨5®=Ú—xûÄ<ìѹšjÙ̼OÌ–=jkö%Þ>1{t®Æ¬›9tŸ˜É…Ôh–‰K 8ðF“·•ލÌS‡R hAX2Ä Àãy‰™´eÕ² š—ÔÂá%µÜâ%µv7y­}^r«ZWS-›™yI]mñÛºÍØÖç%vfj̺™CyImâ%í§MÂñQ Î×Nñ’<ÏLdzŒz2ð”VË‚h–Ѹ‡vÓãÐz‡vÃãзvåq˜š™YF³åqèÙm¦ñ=Ã[f]Y7s(Ëh'C ›¢B¤X†ñÀ€{$áŒ&•n;´‡Éº ÖÎpü¤ÖàHéëëâ‹bNt^¦¢‘ÂêaªO091¤ŒXŽ,-QùÇË ¤«‘ܹ²ÖÞµq<â *öÌêÎyrÄ*G40%¸Åb˜wÚÁqù¨©g¾6åâ5ŠK²÷#<ùH¸TŠ{A÷Á’<^Éb´–õÁÛdyWàÝ@B¦hŸ#£Ti¥q¥JJÇㇴªˆG£ÁIIÙ¾ˆ³‹¤ ÓcÚ3VíäíäA–|)4z5Â"å½Núh)œõ °:w&Â@r'Øs 4*ã2”Ò[_zy®}.¼Øž÷Æ/Î#ØOH³¢=ù–àWâ4b£% ÉDY¦T?³p¾øÂðLGt‰â<Ø ÿN‚g£ù!$S|^pb71Šøv¨üì@÷#+pSVÊSÄ›ê!r^Q#ZˆwæmXûêDN_˜¤h1p€q€+AIÚGžñeiÎ}Ä)øX 16 Æ#nD¶1¨+¨Ðp’cÓ?¤µÃè1IÒeLÃi‹3øœlRž E‹™ãÚ‰îû*=â[Lr5åšÐ¢è§ÀÜ0ëH'Rì2î}dWã^#6ý §}ÕHWH•rUÁ×eí#¦¸›2<ˆ„*YHZÈ$ØWll1Jõ‡¹ÉÒYúv:sœw<(Al¾o7i÷9{$¯+½,8"Ý·ïÂ&UÙÛ€ÓXÔ¼èâ²zñ yüN©7'j¸J¬yx'Ïqsð\`p3¶@ÏüÅ{¥u_7¢¾ypóó¾Ónç'èÉÈqíTÙ≂žŒóÞí‘¶¹/WÄ7,¨º)½f9„¨ŒG OðÉî‡Ø¹€¤Î-r[hè |™ÈHTßÀ¼›–¨vÏmÀ—o€—|žÀ×™Àß|§Pm#KéVÓ%þE*šŠ|v´ˆÖ8ÁƒHI¬'6'±¶aUUá™HA­C\B•…É}?ý s¢TÆx$ˆñ<D¢dRw¼3>ë(ÅÇ™çvÿ]¿wÌõ1^]Çß~Géå ÿsQ?ÝWìUôŽ4¦VØá^œS¶Sg¶9q«o€Í#ë[½²©7ž K¡ÔMºÈè#¹˜›hË]¤­vð›üf “ZÞdå`Í¿kh{Yò|wŒ¤mŒðôÍȶžhãÎÇ}3®fìcßî ƒêúߥõîj;Eã®EÑÁ¨ÆmP¼øÒ(¸‚#³Û˜ÙÀœƒ” ˜ÀñúÓê{zhšÊÞD¯Ý¯ CÀ„nöeËgJþ|ý|ùáF endstream endobj 6861 0 obj 6630 endobj 6865 0 obj [469 /XYZ 32.1599999 198.740000 0] endobj 6866 0 obj [469 /XYZ 40.7999999 171.860000 0] endobj 6867 0 obj [469 /XYZ 40.7999999 126.740000 0] endobj 6868 0 obj [469 /XYZ 40.7999999 413.779999 0] endobj 6869 0 obj [469 /XYZ 40.7999999 307.219999 0] endobj 6870 0 obj [469 /XYZ 33.1199999 196.819999 0] endobj 6871 0 obj [469 /XYZ 40.7999999 413.779999 0] endobj 6872 0 obj [469 /XYZ 40.7999999 171.860000 0] endobj 6873 0 obj [469 /XYZ 40.7999999 126.740000 0] endobj 6874 0 obj [469 /XYZ 40.7999999 307.219999 0] endobj 6864 0 obj << /Type /Page /Parent 2 0 R /Contents 6875 0 R /Resources 6877 0 R /Annots 6878 0 R /MediaBox [0 0 595 842] >> endobj 6877 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6878 0 obj [ ] endobj 6875 0 obj << /Length 6876 0 R /Filter /FlateDecode >> stream xœí]Íoäº ¿Ï_ásõZ_– ²I¶@‚ ÐCÑC±¯¯ÅC÷¡é;ô߯g,g&’’EIþÈnìÌF–L‘IQ$õñ_þ^ýó·êãý—ÿT_Íçý—SS7m3þTçß·à]-øøUwªæýù§úúíôR½œžNOÿ/'Ö^:š¡qzÅ8ào_=}_~ÿòåþÏ÷ÿU¼úÓð¿_ª¿þmøøÉŒw~àÛ©ëÛó—_g¼þsûíÜø¯Ó_~Wý:€Ð]Æ=ÿûAµ]מÇËkWvù½íŠ^6`ˆ±¦‘c|€S èøï?N?£½‚Q÷’1ÝJÝ,UóiØ^·•>íA¹-Š¥$g  ÎҦƩýC‘Q/T™¦vÉ‹03R2¤ÈEÂ"–4³ ñp$2Þe×fÂû4R2ºTË2°k3áŽDÆ{Û©LxŸFJF—4@–ÎåÁ;‰Œ÷N‰LxŸFJFW?hÚ,!ʃw8ï¼Ñ†K…Hœæu¨Ôx&Õzˆ¥MÍ`Þ3Tݵæ~_ò¢î2óAÄj\&Y6 KeÄö€ÕD|¾•:R™(|†ˆ¥Mm¢°3ÔSÚ_ ëOÇOϧŸÓ¦;ï#ž ¹lFÆçaºªúp¶ð„®žª~ß4âóªç_N}­z¡Õ¸{[šØò µ0Z8ìÓ@X [d|û4ò|Ÿž(MáÁ˜ RX|ZžaY,ÜAÌõs¤*ìƒé€yó/…%œé¸t®ÄNÃ8X‡Çº>ÌóëÁÃ[•ÀÙ 'H?,e!÷xV„@`¾Zk¦p4ûˆ>í{@xÙ\/Î0¯œ“nUËÕí¤Ç–îú‡ûËä•0Ö¬±»¨±K-Ç™:‚l®%ø^6’C×C(ûQ#yXS·šuÃÞGᨆ`7I<ÄȦ›AFik~ìöQˆ5—&Ψ²FÉÇø4ÌÁ¼COL5ÏĶ_£jÁ;`¹Gø¨3ê8Ï®îúÆbdˆNþ`¿ÎB ›]þ°ºË"HµÏf”LM0^[î ²F©ËX­dë_.¬6µçÇœäL.)î +Äjeu§öÆoe(¿'˜7P ‰¦¼yÕCǬ¹åC)~§²ßéÈ¡~¹Î);åãz¶˜èùÄNØò•ÙàQÑ£—<ØvÆv‘‡ññþAÁlñã=„@â>xç‡aÃ}°­‹Þ)a¨±}ŒaÃ^±’ *¯›¨¸<¦‚£ÿ?Û«9hÍÈñ ^ŠÍEöÜ{#윕Ìãœj8‹i-&Æo˜µ§À-ïÔ›—Dp†ÙeµíAt¦ÍÝv;޵(Œus•vØZÄŽ•¦Êf@qÍ¥-¯ËÛ„¼³ß¹‘M¸¦ ¨Øä܇ x…g×& v½CpË#ô»2BÕë.;B]•‚å 6"& ^"¨jÝF1Ž–O#Æ`,âIÊâ’ô€ÜExÈ…IœÅ[JØ=ÄàÄA=æ>ìc^nõ­bŽña½¿]÷Ç<édXxc5…û>kååO±xkQÑuÝI¸l¢ û“•øÁ’ë°dFyñUÛh‹ò N™ðaVQ_YÌqW„Óe7ç^ü>Š“/Äq=º³UæÑ<g!u±™{AÁUôi^”Ä“î6E–åJ‹Ü„RÍ!×q!GÈ,ü(E$¶g ü£ÛìgÊï×[6Ein·/ÂXŸ0Cj{8dùæ8ÆýQÿÈ%¶qƒ®gÙègâð–LÇ3|„¹@޲qµAè”á’(+®ºDÃ,ù#·S$m‘XÒÑßr)„½3.›eI‘œß…à .¡!aˆŽ¼©X²Ó#yCRÂc”Þâ.6õÄ>ÜÁé•—HÑ.¤•IC¤‡íÔ.ºå¶vIû»>ùIÐï4„gõ,[Z\h·%§ð‹BŽ€²GLYJÝzˆ}Ä~Ž$s¼»f'x¢ûͰ‰1A[nÿ¯e@~÷Ë<&ÀÁYÃŽºá>[jni†µ„ò‡ßùTθ•òÊ"Œ [ÇØâ)Éi9Ž ßÃÚ8¶+|Ò×Hkq3ÁS xhŠîmÓyÁâüNµnÑ£Lm‘á‡ý~ÉW8ÒÊ,ÍVZ¼ ЪàÊfZÚT Z†)E.°·.æh,œ‰—# +K¤ú‚”µác÷ñúžßsRºÅmÊÐtë„6maÄSþ`G¥ Í~B»VÌÓ¬{»67λ³ë̱íó¶°’ÇPãÑ0l˜ ¸|.må1Zpá:œ¡† *œ9†‹xýÈž‹^éƒØégÓhÆü Ý·#7ãÏUIÔÒL[ ­¬–kƈ>°OúqÂädÚÈíji´úõ=̨{qÙ:-kfÃÅmûÓX¬©Ç†›–ÏñóÁ†ÞƒgêyÏ=Äž)œ† ÏÃF™)ã6öH bǃQMàµx`[«Â`'¦ò®žÈípÁrÇ}žc½œá}GÑ[˹¿x©Cxî6é…yžŽXÞe‚„s^/vBUÙ,º_£Î_kk†29ÎR$DÈ¥ÄÚ.Ð eÎ"ÊV@uß·ÖˆâOÇ:áÀ¸œÒ1LÃù¸=¶bÂNs2‹p⺛„ü!ÜâúÒ”o–’8ñšâº©ç¶nЍkS‘‘¼˜þ*¾xFT\~X³ä×86žô®kßRqî{±÷û ±_{ø žË°÷¿ÃV¢²uŸ@_³Ä~p|¤ù€REîWȬÌåÝS½z½‰%‹–Å(q„v„mŒM+ç\W=ŽHͣؔø³½äÛFD%„5*Þ†ã×,ÐÓ)Õy#âQ"BlWÞ‘R²j)œì1çsDS/p P#Sr”HØYH TŠY!¢ˆÅî’`÷”ó>\ <íË‹í ¥ó8ÚS´Éêg8Q•á‹––+/’ *L½øºeîËʲÆ=¬·Aù²¶³$¹lµùå 1JƑ䎉”ó B׳m.ÈXe…}°ÖSò¦ m›Úfnḙ.%®úTöœP¼n¡klK¦W˜R'WL!¨,Á˜v{šBèqq•”Tó¹!-¹jm-À•b‡w8ùªžø£Zù wÞµaT+†Ài¢ZE­ç£ÿt-lÌZªW·´Ó·<@‘–f3UvÈ8šKäÓöaM)§¨IÒ,ëX¯ðxìfBž¶‡B-üÞ2Òù*Eê Ç]ïÓÞǽÂð$ÃÂÒÇ¥b.ÅÂñ¢kÒ®{õKášáÚP‚cÙÎ+Ús¯4^ƒøLËÂ|Mf;Uè*.gOfFwW¯—©µf}E´ÿbظ½ÎíÁy¤·1,Àn:q»›Ä”›«;²V[·ŽÏvdõsb±lÞV}°A0z—éiü+îÐð¸9æeÂÉhÆ-H†ôœ;лØá|VŒÎ‰-oÓIÀLŸlíÀÑ ïû·L—ëh¡çà£>ñFÏ-:¯{ø°ai.Ädœ sÝßL4!•n‡!)éóÁÿë„ðĤÄ9QF9êåïøúØÍœÊÜ•°Ÿ"yJS2%"H@¹&°—À%e{«,á¾vòÇæK0œòïO̺…uÃ2?»/9^pÉÇT ¦d÷„á’77cŽrÅqJîù*“.Q"…¯ð(|£ó Dæ-ÝÐYŠgsE¨ñŒJÈ£$‘Â%B1E+ì•D¤#e¬„–‡½rTNÙþï­—OB$×v¦ˆ”Å!”¡aC2#¢k¯,‚q?ÙÞ+DüáÀ·Ö’TIœ(Æ>¦{B'©Ð¨ b]WrËì6TêÞb OŠði-¡¦ 嬪|å.’#TÕÊâÄŒ„d Ìߢܥà9BÅ9lkzJÁ‚æKDMÇ1—¥dg—®¬‘U¡.°ŒwSLöH‡dY6zÛˆ`Áñ ËW;KÈáqJe Èìâ ƒ'ÞïcÉ®{¹wÑjb½-î!GîîþðU‚?ew -p\)ì³›Ûd/~«—”—Àʦ2_¿yhë2EseŠ'/[x»†Íé¶bÃ4æül=kǽl%šW£Ú˜mÝÎ'*÷²›®km‹‹‘lz¦e”‚BÔ¼Ÿ-,¥TÝŽË̇sïé`Ÿö«æ5oÄ›(S³DæFÅŸr˜lîY£gføõ1g®…¡y™×ÇP,fî¶ËHàºów®ì!sïÓñ|`n\Œâ£Df8ÞƒY‡<uyÂb> endobj 6891 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 194.899999 108.960000 202.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 6892 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 186.259999 151.199999 193.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 >> endobj 6893 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 177.619999 147.359999 185.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 >> endobj 6894 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 168.979999 211.679999 176.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 >> endobj 6895 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 160.339999 143.519999 168.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 6896 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 151.699999 161.759999 159.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 >> endobj 6897 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 143.060000 200.159999 150.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 >> endobj 6898 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 134.420000 198.239999 142.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 >> endobj 6899 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 125.779999 239.519999 133.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 >> endobj 6900 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 117.139999 168.480000 124.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 >> endobj 6901 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 108.499999 130.079999 116.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 >> endobj 6902 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 99.8599999 132.959999 107.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 >> endobj 6903 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 91.2199999 154.079999 98.8999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 >> endobj 6904 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 82.5799999 168.479999 90.2599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 >> endobj 6905 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 73.9399999 128.159999 81.6200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 >> endobj 6906 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 65.3000000 133.919999 72.9800000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 >> endobj 6879 0 obj << /Type /Page /Parent 2 0 R /Contents 6907 0 R /Resources 6909 0 R /Annots 6910 0 R /MediaBox [0 0 595 842] >> endobj 6909 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6910 0 obj [ 6890 0 R 6891 0 R 6892 0 R 6893 0 R 6894 0 R 6895 0 R 6896 0 R 6897 0 R 6898 0 R 6899 0 R 6900 0 R 6901 0 R 6902 0 R 6903 0 R 6904 0 R 6905 0 R 6906 0 R ] endobj 6907 0 obj << /Length 6908 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èó–ù~A{lÈ!ÀÀrXäÌf³X¬qö¿ªõ&ùI"õìq{Jª¢ŠÅbÕÇbéí_>ÿóúï?®oŸ>ÿçúRÿ|ú|!Q¤úw-ÿ{Óo`¦à¬úUY0[þ»¾|½|»~»<_žÝÿ¿]¨º=XÿpÁ?^~¿¼­˜_ª–ÏOs¿ýïÊ®uýzýñîÇO5½ò†¯cUùËoÕ/”QfÜýßÊ‹¿\þþÃõw×s£[þÿÔ„Pµ¬ßÚGéí¿þ£ˆ™“e’¹.ÒòÒ‰ã¿ÿºü쨵Ý(¬ T+¡Élªš•d…¤W«Õ• Þm&©¥„¤Ôë*{D—½%B“ʽ"ööšV.}φÒbiÂ×!Töˆ.z³FðR¶ÜµU+ɽ¡´X\Æ’•Ъ•ä)eËÝ V½¤^üš-©…„¸³¨ë¾ì]öjä1©\ÑsnEõš’-•XKj)!)ä:„ÊÑe¯V‹~„T! uþ‚6þ>‡‘)¹(·€SÇòº›ˆ"­ÊFïæT•Í$FÝ¿›çi0±Èúþ!»Škè#Î×àJFV;ŠKæÈ¡­¥@:)°Z M?̵߫Ò?ÿ|FÑKq›ÎËEï:Jô®òÚï•<«è—k}l»­^Æ:±Û¦G'”9°w­ññ¿ ¿þk{ù§€¬Æíý—ËÛOTpSb&_~vKYyÇ›êÇç1Éë›2Âæâúå§ëŸ!öÏ×/¿^l!-ײBjª+Ô +„Ág¼òRûˆ®0Ø7ÜÎá3{½)¤Æá3¼êÛÇ/Nû—½/H5ðÆ4¯V J ˆ,83î‰P‘g(¼Bª—…¨.Ì¡F*ª‚Qã]yª¨ÍaìßJô­ÁÌè{w»Bi!…*»€©²UJ|6I€j((5þŽä¾yð Q _' †5 =ä÷´Öd1”Ì]Nª ‚óÛ6ò^Áì´9°oµôNi‘'-å†öæÄÀ^@íe¾Jf™¿`b£Ì h¢ÙÿÖ)[ºå¢#µ/d(¨zÈgÉ4Ãà`SË>MÇ‘žÌ_¨B6þ –VTw°¢¢Î÷‘>§ÚÎ^³L}Ð5lûˆà[}Ùˆ;¬µc­kÆ›N¸ŽkôG 4õ¬ðú3²¬à¥.xÁ¡p!ÀKQ­±+ïà¼|=­ù¦8lÀ}c{x(Æ)z.kûSÛ³´¡Ô†µt¥v;3í$187p89œfÌh<& ÏA(_ì(’Œ÷áš k£D Ôm5·Ã•Çu†ázÝEþÒø%õß{ééÏàÔf,öLÕ7ê.)©˜ TB¬º3¾>Z©+%EõHlažÁ|`¯¹…Ô0Ÿjj›BÔîZw…£ŒPÃoŠßçìÁ^Öj8ˆ‘xc—ð«þÀ¦xÜf~0€Ñ*Œ»`à'xÜéá« .ô’¡¿Â:˜_NOÐf“Èl$d†QP?JˆŒ¦#²U¢È¸3|ü,ŽÈðØº˜ˆ)Þ7üGKp_$“2JÀ¤w€k÷—ˆùQv¨>Î0òjkÄý(÷Êìä’EÛØðý¤¶`Æo3Žwî7$Xû^²þˆ­2Z kÉ»3²š®b€2ÐËz«edaµ c‰2ÌÇþ·_!Œ¦þ ± O«X²Ft#NLƼš±.oc‚¡ËÖGLwÆLËÚ¨Jv–vÏ kpŽÁ& øBèŠb 1îÊ1Üuþæ}FXéÉ1ÁãˆG‹c¨sÕqäx[kîõ^‘e펯3rZðŸ,W®û›“w“âL¦ÛŒ¬7 IßW½q¾ó•ÝÙKñ–ܤÙ’ÉȶÙ!§†(O†[D4Ûêçú(=€Ûl÷¦‚ñ)=Ø3'úŸµ<ÅyןGNFÞ›ž='ÃZq.kû#2›‘+ðíð^þˆöddxœ"ƒÊ'Íî#cì}XF3òÞ÷Ê>:ÆO•YØëÏn6_YÕ¦P¼"ÁÙ ð˜À¾ág0Ì#ñ3ç°„²u›±ŠÖ‡%Üצhr.›Òöçá§l2ÞÆNÎN¼?fg¦Ÿ=¿‘?GNàmƒÕlÊx.,§¢=èsx.lgÒ‚g`Vi?@y¡½üÌ‘Œ× [åV|tÁýMÝÚ ©‚ßpÚh¨žÀSƒ=‘AN>¢+#yÇ8ò©Á‚Ø•º²¨ ïY|p>0–”õŸ é`> j"cÏáyÇœšõâ¥ÔAzt€;70S 'ïdÝSë3åám?Õ5åPÞüôÑE{VíÜS•qìƒw*~¦ÑbB=%ÀW )ûh{çšw¹ØµƒËÙ‚Ï>2ß·Úëê™æ‘]à%šˆãVIŒ]’½ õñžµjÎAñE«1NÆx¿S,˜Žé‘±æsæXúÇ#~8ö©±çŒßS;sdóŽÜ”þÚÆgû¸‚µçͱ³¹Íâ5âÖéV9ÙU ‰ß'p_'pë\4å©öHÝ%˜X1°âÄ \ïÇfœqߣœƒ$ªøz·À==Gº”¾õõ4% X܇Å=‹Å•Úw&ð‰ƒœ«‘M(œ‡O6À­É#m±’¾5x]¶xäpkò½W"i­ýa_jÅ–!ç çñ¸'t¨7Gâ9õ‚(Š-³v5ñ3°&ŽaGêÕ{cº°Ì aLŽ÷qíŸ¬ÝÆ½beÎÍp“ÌNÊ™¡ÿeg¼3\VñY}ÙàÚ)GÌŽ´M;n «Ô]ÌBýsöȰÞ‘ÿ1£TÌ|§"à›#ñ„RC÷ìÍ*sb¿eÃã’¸Nð—“×nð3Aå—U  ¼Ž£¼«æŸdÐN©8³m¦Ê}Ú––•%Š„ùó©• ®ÎüòYã·ùzb óÖ“WjþV­çuš5w‡¸U6å¦îaí¾ó"tÕà°â®Wl]|~wµ\wØ=ÕÂ3nB@!/¯»NqÅ{*êú¨z^ŸáµÄé÷½Öï’€ò¨@;Ëû™²–[Vue¾›SäVH¸îO–¿m+2GÂY»ùŸéËÚØÇŸZGósTòU{v«„1;„¾º9ÅÆ+9àQ±Âi¿ `Ê)-š2vò§6¶0ç³#›/FL(OñÇÎ÷­ßž÷ÏóWcFìïúîtÊ—3–(<¶9 ‹ü«ßBzœ¿ó|ö+dÊkꡜÁ…p𩜷ŒkÒââ9ø³Ÿ¸ îþzø~•è¹j8a÷᪦ Å®[åVѸõ „MKĈiý[õJVNÆùªÉ|y÷—ÐÂ|ðY,7\ÚŸxÀ=È…ɳ±+«eâNë²$ü¡Ësz½ªVŒÈ-cÜdEKêÁ®Ëš’¯–HÝë+%\vŸ Ây¢Ug¨l¼ÁîÊ;„Á¯â®‚a¬òy””]¸5Ðñuëd¥p{þ£†{µ³ »‚Éó/¬›ø6þì?_’ÿ "k¦-Ȳ —aLȨOÀJîŒÊúêvþôJ}:k9RÅùž”-k º…}“Àü%[$ÔÃNiNúS‚SºqJéÞÙ’Ë÷Þ¶LÙ0ʷ‡»=SGÔ¶]—š°Ð6˜éñËvâïkø¾aÈóôè¤E™Æê‡Iþ˜ ÇÍ…×óG.==:â°±ð•ù|ùë{ëzäÚŸË;±ÁŠÒÓÙàœ0ù¬ó–Å­„o×,U~A/âÚß8*å}IÇuÐSí^ Ò:ëh@ÚF£@ÇÛ}9È[&_-˜h¶V0Ãz¾÷úÔÔT»ÐÔTŽt. [ïÆØ š­ú ÛÂT~9ÇÒ©n€ñvCOë¡'ÝÐk~u#¨™*Ë]]¿¶ëÂâ~-hJMÕj¯š4u±š–—‹²¥–C›6eúTš¿*îþúoY>võŸážñ{âîâ}*Ã÷x¹üryÿÃ@&4 7hB¤[’Ó¼­…[)eàHÉÄ{] àÓ9ï†V‚"Uqow{9V« ºßðÛåóB%b¨„BÆ”°ä:T×(¡k«Õ¬¦Òü%†J(xL  x°P Ë»xŸÊð=VBÑ|?o¤6QNV>FÙðF2Æ{¶V=­6¹34{>HÒÌeû å|Õzêìò~ÕM¨ºß4ÖylµºU­Òµ°Z)›–÷­U·»‹ É>›ò‰ºáöàÕ'@6ÕCÃΔwÉ!9dó‹göÐ}Z×uÕJ{Ëi˜è<uOH½´5Þ‚(`‹Ti­-Et“©µŽ f«­!žÚS[Ã}}r-ÚÞî"C2¤Ï¦S[mcj«ÏƵj{»KÉÈ!›CÕ¶ûîGŽÃHȽ¦v†±α¼ÍL¾Œ}¬‘¥h® ofƒiü_&l¿aöl°Æ› ÖFfƒ!ÔSӲş Õ]dH†ôÙt³ÁêØl°ÊŸ ®%˜ ·»äŒ²9r6˜6é´NÅŒ¹Ñ«¢Yó¿(–pP)KWÊ Î†…ìV9E¸qÉ…Éý¿„2dþéÙ)SbHÅpÃú sM‰¡jhJ Õ1Sr›®SBmhJnw‘!ÒgÓšCeÄ”*6"0%Õ]rHFÙjJX[Ç{]gɉs´r¾“â’Ë|åg¬]Gi¿a¶òsá)?—1åçÚ×J®Cå¿ÝE†dHŸM§üœÇ”Ÿ³€ •ÿv—’‘C6‡*?o€Ã½Êm뢞uEM¤Ä´í7ÌžÒCŒŒ!FúAÙL Ù"ÒgÓM CŒô‚²%˜²E:2rÈæÐI!„ áS|{}»yÕ’ Ÿ(Ÿ_^ ëœGBM–å•^æ›Ù„•\š~ÃlÓ¡=”ÆèJc´Ò”-éÐ-JÓ‘!}6éP1”Æ(¥)[Ó¡Z”¦##‡l5ZžÎt¬»Joó‰îwÄwê“zbaFvFáY¹«šæUÄ8ùÙêù¶D«Ö–ˆ~Ãl[b<ŒË˜(ÆeŒËF0.Ûb\ÒgÓÙøʬb 1®ê.9$#‡lµ%¶Å¸ž- ]âß"ÏͰ0ª=þyÜÓ oŽÿÅùîÐM˜uar+¥ðM ¼G• X“ß·9!’jþlƒ,ˆÚ¬Ø—[”·àT~·`I,yÆ?y¦lñóÊ6eúTš¿†É3–Ä’g,ñ“gÊ?oávïS¾Ç±y –6P‡¨ÿ’ ¨‹>¼²¤ÔxP7ç Ò¨âH¤ö’ß6ºÛ½|þh•bi‹€ZÖo˜ëeYæ! –ÅPË|´lñ½¬ê.2$CúlZ/˲j™€–-¾—UÝ%‡däÍ‘^–e Ú| S4skÄP,‡—dÕË–å-xHY¿a¶> <´"ZჇeK O¢;2¤Ï¦Ó'­ðÁò%Ð'Ñ‚‡9ds¨>‰<ĵ4Ïw¨7YõD›"Dm¿a¶ê)|²*>YåƒOeK zªŸ:2¤Ï¦S=Ÿ¬ôÁ§²%P=Ù‚O9ds¨êuuö`ñŸ»80ó½’”ãÕwý¥äy¢Úä!Åú ³ç‰ö€«cÀŠ5>°R¶óÄ´ÀJG†ôÙtóDÇ€«}`¥l æ‰n•ŽŒ²9tž˜XIiSñœl€<¶óG}¨-Xà­UZ#<'Ú¤åÐXëåÐXË¡±ÖÏ¡)[‚eÛšŽ é³éf”åÐXëçД-ÁŒ²mMGFÙ8£„àI´/œQ QÍÁã¦> 6WåÜÛµq1ý†™*'\ 8P9׉Û\«·ÝZ<•«ï"C2¤Ï¦Q9׉Û\+ Øq[}—’‘C6‡ªmâ¶œ´­è ðÍ3\ñ i-_CÖ†ƒŒöJ5}¾<_¿9©ßN’kýãåë,x“„<ŸG†Ž>:}¢Ô¹®Û±²y–ª¢ŠÍ9ÃñwŽ•Š4·¢Ó…öÇ£T¹RÙ+Π柾¬¡>Y¨j}Kãcà3>SAašŒx'\ßCjÕ2Þoùï­]äÈ~BÏÔª»BÑ{ÔnIÚ3õˆ¥¼{ÿ ì­+g’êÉÑ®#Š$=¨Q§$=¨÷«"?"Ù@F$ê ìK½3ÑIf2ž©øHSpï¤6¾2"'ŠôˉÁñÀW°$ñìè­] ›nÁV-ƒ—¡’R¬¤^éÁÙÏk®×çËÿt°È endstream endobj 6908 0 obj 4751 endobj 6912 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 777.620000 139.679999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 >> endobj 6913 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 153.120000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 >> endobj 6914 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 222.239999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 >> endobj 6915 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 751.700000 183.839999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 >> endobj 6916 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 147.359999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 >> endobj 6917 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 155.039999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 >> endobj 6918 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 148.319999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 >> endobj 6919 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 163.679999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 >> endobj 6920 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 708.500000 228 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr >> endobj 6921 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 699.860000 208.799999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic >> endobj 6922 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 197.279999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a >> endobj 6923 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 682.580000 203.040000 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 >> endobj 6924 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 673.940000 144.479999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 >> endobj 6925 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 665.300000 147.359999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 6926 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 656.659999 173.279999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations >> endobj 6927 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 648.019999 264.480000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads >> endobj 6928 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 639.379999 170.399999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 >> endobj 6929 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 630.740000 194.399999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn31 >> endobj 6930 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 622.100000 161.759999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors >> endobj 6931 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 613.460000 159.839999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 >> endobj 6932 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 604.820000 151.199999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 >> endobj 6933 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 596.179999 205.919999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 >> endobj 6934 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 587.540000 164.639999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 >> endobj 6935 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 578.899999 179.039999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 >> endobj 6936 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 570.259999 134.879999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 >> endobj 6937 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 561.620000 147.359999 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 >> endobj 6938 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 552.980000 168.480000 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 >> endobj 6939 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 544.340000 176.159999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 >> endobj 6940 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 535.700000 198.239999 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 >> endobj 6941 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 527.060000 195.359999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 >> endobj 6942 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 518.419999 216.479999 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 >> endobj 6943 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 509.780000 129.120000 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 >> endobj 6944 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 501.139999 189.599999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 >> endobj 6945 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 492.499999 151.199999 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 >> endobj 6946 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 483.859999 169.439999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 >> endobj 6947 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 475.219999 150.239999 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 >> endobj 6948 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 466.579999 159.839999 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args >> endobj 6949 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 457.939999 100.319999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 >> endobj 6950 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 449.299999 163.679999 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 >> endobj 6951 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 440.659999 156 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 >> endobj 6952 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 432.019999 161.759999 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 >> endobj 6953 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 423.379999 179.039999 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 >> endobj 6954 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 414.739999 129.120000 422.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 >> endobj 6955 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 406.099999 210.719999 413.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 >> endobj 6956 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 397.459999 261.600000 405.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 >> endobj 6957 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 388.819999 214.560000 396.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 >> endobj 6958 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 380.179999 228 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 >> endobj 6959 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 371.539999 199.199999 379.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 >> endobj 6960 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 362.899999 154.079999 370.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 >> endobj 6961 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 354.259999 126.239999 361.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 >> endobj 6962 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 345.619999 157.919999 353.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 >> endobj 6963 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 336.979999 166.560000 344.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 >> endobj 6964 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 328.339999 214.560000 336.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 >> endobj 6965 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 319.699999 214.560000 327.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 >> endobj 6966 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 311.059999 214.560000 318.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 >> endobj 6967 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 302.419999 214.560000 310.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 >> endobj 6968 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 293.779999 239.519999 301.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 >> endobj 6969 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 285.139999 170.399999 292.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 >> endobj 6970 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 276.499999 120.479999 284.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 >> endobj 6971 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 267.859999 186.719999 275.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage >> endobj 6972 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 259.219999 194.399999 266.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports >> endobj 6973 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 250.579999 215.519999 258.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport >> endobj 6974 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 241.939999 187.679999 249.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit >> endobj 6975 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 233.300000 194.399999 240.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 6976 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 224.659999 207.839999 232.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 6977 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 216.019999 244.319999 223.699999 ] /Border [0 0 0] /Dest /#e2#8c#17#89#edj#e9G#15#c9#8d7#c4#a7#a4l4#ac#405 >> endobj 6978 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 207.379999 180 215.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split >> endobj 6979 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 198.739999 212.639999 206.419999 ] /Border [0 0 0] /Dest /mp#a4#0a#f14j#dc#df2#ec#22w#ea#cd#99#2b#98#5d#27 >> endobj 6980 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 190.099999 222.239999 197.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static >> endobj 6981 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 181.459999 122.400000 189.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support >> endobj 6982 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 172.819999 164.639999 180.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 >> endobj 6983 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 164.180000 152.159999 171.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 >> endobj 6984 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 155.540000 167.519999 163.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 >> endobj 6985 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 146.899999 193.439999 154.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 >> endobj 6986 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 138.259999 157.919999 145.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode >> endobj 6987 0 obj << /Type /Annot /Subtype /Link /Rect [50.3999999 62.4200000 91.6800000 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 6911 0 obj << /Type /Page /Parent 2 0 R /Contents 6988 0 R /Resources 6990 0 R /Annots 6991 0 R /MediaBox [0 0 595 842] >> endobj 6990 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 6991 0 obj [ 6912 0 R 6913 0 R 6914 0 R 6915 0 R 6916 0 R 6917 0 R 6918 0 R 6919 0 R 6920 0 R 6921 0 R 6922 0 R 6923 0 R 6924 0 R 6925 0 R 6926 0 R 6927 0 R 6928 0 R 6929 0 R 6930 0 R 6931 0 R 6932 0 R 6933 0 R 6934 0 R 6935 0 R 6936 0 R 6937 0 R 6938 0 R 6939 0 R 6940 0 R 6941 0 R 6942 0 R 6943 0 R 6944 0 R 6945 0 R 6946 0 R 6947 0 R 6948 0 R 6949 0 R 6950 0 R 6951 0 R 6952 0 R 6953 0 R 6954 0 R 6955 0 R 6956 0 R 6957 0 R 6958 0 R 6959 0 R 6960 0 R 6961 0 R 6962 0 R 6963 0 R 6964 0 R 6965 0 R 6966 0 R 6967 0 R 6968 0 R 6969 0 R 6970 0 R 6971 0 R 6972 0 R 6973 0 R 6974 0 R 6975 0 R 6976 0 R 6977 0 R 6978 0 R 6979 0 R 6980 0 R 6981 0 R 6982 0 R 6983 0 R 6984 0 R 6985 0 R 6986 0 R 6987 0 R ] endobj 6988 0 obj << /Length 6989 0 R /Filter /FlateDecode >> stream xœí]ÉÎ$7r¾ÿOQçô‹[p ênÉ€ ðÁðÁèÑx0°–æà×w²2“KYI2³*«Z­LwE±"r‰…ñ1‚üö_~ú¯ËÿãòíÇŸþ÷òyùûãOoìi6ÿwñ¾I ¾K1ÿÓXxÎÿwùüëÛo—ßÞ~|ûqúÿßÞ¸¾þpùkúr13üÇç¿¿}; ›)?}ü·é_ÿw—>ýíòÿ9ýõç…Ÿðë›uÚÿãæpÁ…>¤ÿò_þõíßÿtùût öÊ×ÿÿ7`¸ÖßÂOùõOúÓš°é qŤ¾p.¦ë„éqüþËÛ_ü]íº@‘^ ¸¨ ½Húóš@;]¤ÔÎLÅzyý\8ç¬Àhÿ}²xŸb¹ÏU’½¤r½ ütÎãÅÔ!3ºßã›$Á%• ç=¾ýÚWz wyvn¾\7=:·Ê<å¹UìíÉ5oú/>ÀåÓÏ0àÔwsW?¬à˜$ ß­ü²’þos½š‰j'ŠðC¯!n¦|ž~Äß9wþ!„Q,gÃR1þ Aù^0IÄÈëò‹ñ£ g¹˜¿¢GÇÉ£ãYTñÉüvã‡~~ûöç#øÏ™¾ºNæ¿~žž èË7þ*`úøçË?M·ðéŸ/?ÿmò-ïÚpkà:ðúüpýƽ³éWXË7ìãõ òJ0ïÌI,ÊÍ<ô]Í_$߈Úo˜½~£ßÅõRÛ¾ÙâöýÏ“ÑÄÇ]RÄé©]_QH™¼4i²–H“µ*i²ÖXÅ& Ñäë(–³a©˜¨ÉZ”4Ys"†SM¾Ž‚œ äbNÕdm¤ÉPÓW6k²  7tðûë70MÍ-Ï/ .O X¹¤ªa.ÛnÚ­f¡YJh6 Ë‘YXQ2 «°¾Nb×Q,gÃR1Ñ,,+™…qXÌD!fa¢6‹9Õ,¬^•‘ÏoþÝ:†T\chWñºézÕ{+‰ÍØekõJ„îÿ͈œ~«ë zÛ‡[tuq#³vw¶çZÛ#'šÛÁ¬þ«ßÔ¹‰ð•ôN*¬YœŸOåB³÷t.÷žœ±‚÷äL ·æ)Ø{ΣXΆ¥b¢÷t¶ä=§´yωB¼çuäl s¦÷äSfó˜IVdb°#©nÊT^ÝëŠï³îp©séð™õ TdäZ‰¼N ælÍO¥P)¡Õ‚97È‚¹-Y°‡"s ŒZ°&Ù°TL°`ÎuÁ‚9,f¢` žGAÎr1§Z°gY°;‚뿩ë<Ñì­ùV»Š‹5qÊ¥„f—Ãᲄáp‰1O!*.†Ù°TLTqYÂp¸Äާ—Él sªŠ«Ga8dúUs²ÁŪž»æŒÄ”n˜ÅøÄºÝ TÀ4¤„f+„ÿp(á?^RO øÏ<ŠålX*&Z”ðÿñbðŸÈr1§Z< ÿÈxëæ@U{IÂ{•º,%4+½Aè7%t‡Œîx QzÐȆ¥b¢Ò›ºÃ5Fw<…(½ŽZn2t'Š9Ué~ÒWÁ£ª=’z×5™¤¯ƒgµ™Y3aeJh]^+°\\9YséÏ}x¸¾ ag}uk>-õ¢{F#Ýë͉šV§„ëv¶g¾ ãA4¨kZýžÖ.·UÜëÀUB–lxJXãÈñÚçåÚ÷t¾cûñ¡§õëÛäðãÛç!ƒó=„¿–åÉÌщOqVé,¢õàìÇ.¸Õ“‹§5Ì/4`.ÞDp¼‰I ­³R! !D ðâò颧àYé<ŠålX*&ÌJ…(B`@ÂSð¬t9ÈÅœ9+òQ€Ä¿ä×^FCñÇm@}$“Ý„øÉ…ˆïñÜH ¸Œð¿sö-äš¡J)aGl5×i¼P«›Z?Ï@Í”DÎf=[¿š.ƒ-ÆÏVÊç7íÁWš¶)—õÓ Ã¬Ÿg”ÿšìÁW2’)—ü>¼ùð§‡;«fÿ¢V¨G™j”%Ú?B©ß!KÒí jC>ÕØ}c9°^5·iÞÔ­´#f{r½út†®Åw\ÀÀí_Ú¸£FíØùÛõÝqÈ~Û[5{§¢”3.¿š'ƒA”B— J¡1Dé)d2¨DÙ°TLœ êD)C”žB&ƒg:ƒ(£˜S'ƒº¡­î<±9J…gÄØŸÐ>Cá…¡)¡YÅ ª¶T%$,®ò¢â6T E6,UÜ”ª„„ÁUBžBTÜ„*¡Èr1§ª¸ ¸ÒÇZ¾Cç##aºê«å§4c3²Ýi·áÍãtÞBÐy›€¼Ü@^’­—µç}C[ê+íÇŽŸ[cµà=’¼‡‰”°_$—O  "XØü¼ ðçK½tcûDûÐZå0í÷¹ ‡´ÜV=œÜ4 AR¬“íɈSÂý‚¼ ÜÊhX™ÄÝ%á­;vO=Øé8YzÒ[“F)Q½’”¥z%)q½’§àIã<ŠålX*&L¥,Õ+I‰ë•<OçQ³\Ì™“F)W‹Ïñ“«Uçv)G‡“ÞN†Öª:ªq27tüê›yJjžœI ͆PP$`@ÁSˆá@"–Љ†%@A* (x 1-2@!Š9Õp`Px0È?b•ÿ°5âÎ3‰ó!CÑϿòX +r#•I »—dè»]>VX\’F …OÁ‹Kž¦mÊeù¤W eýl ‹KR,C²¸t%S.ù}œ»¸$ÍvËW^yœ?¤íÄkà`K澇jzñ$]%©Yõö(Ìtļ‡\uïUÏÑx£C˜+&Æëܸ”Ð<·°¨[LÚR·˜t¸[ÌSÈÜÂÅɄͺÅV1qnaKÝbÒân1O!s ºÅ"ÈÅœ:·p+'MŠkŸß’ʇy|;LKq{…¹Î}¤´e¤ã~MiÒ…¦4£RB«%)†jÀ+Õ€)†kÀ<[Ò<ŠålX*&X’b¥0Åp ˜§`KšGAÎr1gZ’âáuÎ>¼TÇùRZù%ONm`RB³ „)QBˆ”À‘§!ŠlX*&š(!DJ`„ÈSˆ ‰€E6‹9Õ„ÄŠÕ×ÄwUã:¤v©½ŸâÆ ™Þ7÷}žúÃ=•_u«è¡0÷CöRh÷?"TîžšýB@ÛÄ¡äÚ<…ø€¶È†¥b¢ÿQ% mš`1’mó(ÈÙ@.æTÿ£V ­>&å8#UÎ=­Q{Öš‰9nWH·'ú7‚þ“þv‹R±“P¥„f‹T(¤t©PHi\(ä)Ä¢t(ŠlX*&Z” …àB!O!¡P(²\Ì©¥C¡P}uÿˆuñžeÆ¥þ¬©­uÄQR6Ü‘“·×ô®,)º 9¤„fó4ýQ¦„þ(‹ÑO!æ™Ø£ÉПUL4OSB”Áè§ó4ý‰l sªyÚ€þÜ¥ðmd5•²ïMíl@G„L Íšæ0:âŠèˆ#èˆ+ #.¢#.GGFG\qqtÄEtÄåèˆ{tÄ_Áò~ë‹ÿôÐìk`âÒ³¿l}èvÇZ§® 0Æ\)ºv¯±Ï¸€—¸üùùú—§à56OÓ6å²~ʸ€—¸€ã.OÁkl×Q2å’ßǹklÀ·÷ê¡ÚQ÷ž‹B{ºy:jÅÚÇ‘ú]ý³¹åT#íµ#ÝÓß·&S(à±H¦„ÖP ¡ K(HŒRx ¥ó(–³a©˜JA–P ¥ðJçQ³\Ì©¡T6lô]UÃïÛ Þ“‡ÕƒíõÞ¨XA†ZfSB³¡*~”À ~x 1TàGdÃR1ÑPU ü…ÁO!†ªøÙ@.æTC…°÷“«‚Û™þ¡ëäíØGÏ…ÜÅF6lÅžéf°§Ý@ÀZRB³7Ðk]ÂZÀ`¬ÅSˆ70Ñüu†µ¬b¢7Ð%¬4ÆZ<…x°–Èr1§z³½/óyíóUöt½c¤}¾ßúÊhææõÅâgFÝ–§æÛšRÎeŽqÚ^|H»Ë0¡ÍpLhf`K X šy q6€f‘ KÅD—aK X šy q6€f‘ äbNu.(É—¹Ù³GåæúʃJ _Ó§<›R´;&¶¨r"%ìF85ËNÍJ§fáôŒpzš¶)—õSŽpjVB85ç§`„ó:J¦\òû8áÔlE8ëKI=Sgu$ߪqQën/"_|÷aT­0Ÿfæã<%´-̧E æÓÃ|ž‚ƒÿ<ŠålX*&-J0ŸææóüuŒö‘ äbÎ þZ˜ï»*ÆEœl®O”¦£xï®EŠWvì]u­1°™ÄPÛî©[°k°C™š­_"ìP«v¨Æ=…X¿ ØadÃR1Ñúe ;Ôc‡žB¬_ì0²\̩֯BS^}±-r:Nß8´ãíù÷W^­!œ¹½4¬„fk„i(agZcìÌSˆ5è¨þag«˜h PÂÎ4`ìÌSˆ5@ÀÎ"ÈÅœj :Ô)ÉjöEÎ"ÆuozॲMuÁàÉñÔá`oáTJh6ƒp#mJ¸‘67òb.&àF‘ KÅDs1%ÜHŒy 1p£Èr1§š‹ ¯³ŒŽ­T¨ËÙò¢¯ØxR×^©ŒÐìC”D>DJZ&ªÆÆ­HIË2ŠålX*&úU(i™¨œˆ!%-Ë(ÈÙ@.æT¢Â®aÕ½ è¡ õ„·C±ê)ãcv3x%×øDVDÏÈH/WO{]¶pŠvoÎZ—ާ„fo¦ZÇu ­ã£užB¼™h]dÃR1Ñ›éZÇ£užB¼D÷¥3´.Š9Õ›éíãÖn0‡vªÖ=oýÒˆóª÷oôçE„ÐÓx2p´êöð[ÉՒܵ›¶Žg©‰”ÐlÚÆ!Ó¶…®¨‰*°ÍYÒµŒb9–Љ¦m ]QÕ`1†tE-£ g¹˜SMÛª#M{¨±hdÆÒHåÇZwðA…õë#`‰Ã6ù™^yÜ’Þ¦„ûmòãåÚöE¶è9úLÌ”즃s±u%ÄV0ŒØ FÛyËÙ°TLtp®ˆØ:‚غbë"bërÄÖ=b+ØÄv¨å¸ãÈãMb:&\‚ŒëÅœ+»ÝÎD î¨p‡ž­f.ÂYíòzPT ì¯^ü ªü„Z³„ò–j;ÔöÜ÷<²õBsñ‹‡KÁSÂýb½”¿¶ž\æ1îçÆ\íØ9áë®P!}ùõMà ´Ó¹È'(2‰XŸ‘’åtoø$þ§ÝËÈx ‚N (‰:¿¿¬ø××Ô‘߫Gó¨^ÛÐ4¾Ã«“½ë|sGåÍm×Ú}w|ôsIQúèwš¥~‚vBav5p”ó±kÏõh}ì6z´¢æÃÈR$žb<èl÷gq|íî-Ñ®¤„Ý5«Âf›MŸ ›phS£+׬zÚ\•ºrY?e›MŸ ›MTÀ2,ÙÔh%S.ù}œ[³*ÜÓùHš¨áÔ§¤Ûû–î_uk­Tñ¨v§SB+î)ªb“¬TÅ&®bóŒ{ΣXΆ¥bî)Y©ŠM2\Åæ)÷œGAÎr1gâž’¯oó¥ŽbÛQ¼F íSòƒ'•ûl†ôd8¡ýêU#¡Ù¢ªé’¢TÓ%®éòbQ"ÔtE6,-J”jºü|‹¡5]ó(ÈÙ@.æT‹+TPωEÕAù‘ö¦Üþ¬+ol9¾ìÙn9áày6%4[ŽBõCR•ꇤÂõCžB,G…ú¡È†¥b¢å¨Rý”¸~ÈSˆåÈh**«ŠbNµb<¤¢z ÃmH÷Ú!»Ž,~¤°¯ã„µ¡bëú%\lgÉŸT±í¥„f“T$u©.Hj\ä)Ädu¨ ŠlX*&š,”ê‚ü–ÏH к yäl sªÉêP©Q vùÒ!k3§ïK1ˆöªdš uT4·›ÿ£Nì9i÷¬XÇúH ͎ úiJõ5ÒâúO!Ž"ñ &«¯YÅDGaJõ5~µ‰1´¾f9ÈÅœê(ìó+xG%ZX?Þ«£D§Ý)FÚ;­µa7gÃSB+̸ùê}õ¶vd»¾y%uîRê%–ɪ‚¼:w“ÕWð¡âT)ûú ÌaýQµˆ'ë€\õÇ_r•X𢧺!?áõàž'¼lô^šNV/‰>¶CA]?ª¯vR «?‡ÜW}h•ý—@Îu©?¶ª`…¦Øã6^=–s±q4pva…>¶žªÆŽ3eŽ8Cš‚à÷=¤£æçûr®z\˜æÒ¼úê ®K†+ÿøMµÁ`qã…ø¡æ*Þç ¼Øzµ×#–Qš&ô¤, Ž>Ëö ¤Cè4-é?ð@­_=+ w:à”è;DgQ8¹Q>PBwhEÕqÈéµ#Í?`þ³8úrž ’hR†=+.#ð-‰U;+{¡Ã[I™‰;dGþûnòן“¨¾ú7õ'Y·ŽÀÛ«›Öúíü#WR^WRWý&9YóÇ#cÅåÇ·ÿÁb€ endstream endobj 6989 0 obj 7496 endobj 6993 0 obj [472 /XYZ 40.7999999 639.379999 0] endobj 6994 0 obj [472 /XYZ 33.1199999 783.379999 0] endobj 6995 0 obj [472 /XYZ 33.1199999 663.379999 0] endobj 6996 0 obj [472 /XYZ 40.7999999 639.379999 0] endobj 6997 0 obj [472 /XYZ 32.1599999 785.299999 0] endobj 6998 0 obj [472 /XYZ 32.1599999 665.299999 0] endobj 6992 0 obj << /Type /Page /Parent 2 0 R /Contents 6999 0 R /Resources 7001 0 R /Annots 7002 0 R /MediaBox [0 0 595 842] >> endobj 7001 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7002 0 obj [ ] endobj 6999 0 obj << /Length 7000 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀí&ÙÝ$ €í±ä`àrr¼Ù‹xgùûi©©Çúø(>ÔÒhðÈêæ«Xï*ßÿñëß·ÿümûþÓ×ÿl¿™¿Ÿ¾nú®Ÿúåg»û}wþWàËG©ÆŽëÝÏöÛ÷ÍíÍóæyþ÷džMû†æÏüð0ÄÒáoß~ݼ_ß,ß|ýôçùÓÿ¶|û§ù¿lÿú·ùÏO¦¿Ý ß7JO»ÿ^>0θšÿsþi÷ð_›¿ünûë<µïw÷ï»Qòa˜ç’3Ǧlÿ{Þ 6CˆãÈ·Œñyžãüíÿ±ùyîí8NMæ~ŽIíGRÓ ô =q{ab™ÂaÀ>¢ÞïŸ|~™·(àz§Q_øÐï¾ã”fâ xu'mÀ˜­P§/–Õ§é~¶Þ`½Ýd\štƒc&á“ð¸ly£Sº=gþÅn; a¸´_uÆuÞ°'Òóý²ëõÒý †è‰àNÜ (ƒSœ)ëUh²3È|è wæl–ƒx£= ‡ë„½Ξ@ä0L‡OO2Îöªb¯Û|\Ú°nv|´÷@ÍA~¼[„•»ãáNœW1±ÁN\RÂã}†àƒmÂTŽ§Æ´cöž9‹—% lœÓ#h[“ékaq}þ¡µ»4¼’ ø¸[HÁ.ÌSãÉÈA£p\Ïi› ]â©õ!U*I•Jàhn÷Œ0³Å8—ÀH2˜m:¿:kûtÔg% ÈÈx¬Œ˜³óFrÄ[¿6&VQdh1Z"ãA,EˆåZ¶ ûX]Ë0¦¥ÐiMË,é˜Àm®¦ö:“†ªR„ …hà!É M°8°Ðu”(¨`Š'5ŠLg*ž®q÷‘ÂÙã=Ï2W(8¿o)Ú~Y#nçVdTb²9ÕzJñ|"A`¦°nPÂß!l±~v!¬F©pi2ÞÎf¶Õç´½ žŠLáX(:hIQO!*·Ó£¤ èQEûá-Ä\·Ž·‚¢ ¢ÂqÅã á0%œØuF,žÝõÌN9„O† lüžÄ§Ál˜ëÄLq‰Ô ¡&äPT£pv˜£+¹Äã|‚ )#ŠöV”Œk:¡kúõ¹²y@N ÖѪsÒ nZ}ÊÈÆtÉ+˜Ú“E€ñ®“"é“ 8‘“UÆLÄN1BÀu"`¢CI ÝCʘ ƒ¼ä´pˆ›â„«A(x" L%A{uÚ¦89 B±¢L‘j°eÊ#ç3wÖ—óéIí p˜0õ`O¶³¾p *A0 "4J:heÊ^‡ç] ŠøLoHGl—ÃÑ­„í„ùRcN‰éor -©¨Ç++κš¼©m­h £p¤9óQÆé—þŒ$äfTCQ|öW;™DðU¥ˆò®ç<ª¦È˜˜-3ê°A'&M‘&„sv­Ž¹ed¯Sò*Ã:K3ïip}Œ¹J»°%H­áu–=ÛU7ë‘HXé®×õêT×·ÝCI¸2V k–,9”¹àI(áÌ)«ñ­U§o`0N”hÐM Eóʈ­„ÇzÏ ñ‡O§¤£;ü„r>²}EEÞ} )y̪&_4E·NŒñ&¼añùqáT™Cµ.Wt»ÙfråV;ÂQ¾„yñ’Âð©‘ÖöÙÛa6ñ¦¬¼ßʧ~l3ἇGŽ%8 ‹à*‘¯QF½o_mJMê¾åK Kq˜)Ž_\!k„ÔH^]Y1FœÔp%«ˆm“B‘ã¸}3;<ÞÐ"'ƒ2'…'SbOm´¥Ö]ôô¨g3œÍÔ+V<¯^ñ“óŠ]¯Ø,… N½b\ƒØS·x2 sj{ª/â€éN«ýD´1Ü“‰N,Ûf£Ày}d¸JådCÌE¶žéK[ϧeëåðzëu·GÏWÊ|Ò°ZŽÖƒim>À6µ1Ž©y‹_ÖY›£› mkÒa¤w·ù’¾Sî÷Bo†SÍ»éˆ}á”)2š±×9®CI ¤Ô¾v5ƒ"‡VSò'§f‰»W«j}õ(à::ª”7inoæd|.ÅsÙ Êß_#ëix=ãYÆ”¸ðÄLýÂ{3dyéÉ8ÎÛÀà¹áÞ8lc”¾KOžàQt¥p0D1 ðž8QÌ:˜ÏàÚñØãÁŒW˜:UQŒëáŸpøâ•1O“x>gÀ0Àpƒ3 ¬t€1Dñ à8÷š[Êu2(¸Ì òsimÂ0X?ÿNÓ e´Á1©ÂÒà©Ý|Øî)³{Ì=1—Ærb‡‚à Æ«V+…½ l5sVú½M“Ç! Ö⯋³“¶¦þÐ`ÌÛÑ`ÅmÎè"%Ú[¥„y™3×:]—Rÿ…XDJWÉ(†_Ò#_S0)›½×.õ‹S€(îÿÆNá2E¢ëT,)[V?!TШ ZüiÒǺ¡ðœˆrDzNÏ–¨è\¦Xqbóµ&ûjf|ÊÉfêwQÎ(âÞ U õ— iS®k®,mu¬,Dq<„\U+œÙ hS*â”N“{oꢹ ÞP€³â^3É.ovÕ1GkÌ«©K•¯õ{ä…TBá^9íû¬…†ù5?UØyä×Ühì Ç_Vž_3Ítt˜é#¦{wx¹Ž˜®`Y þ#†Z8†ê‘ ó¬„PáÕ}âÙÌy0¬pôÇûpo8Ú†%œ'~NXiY½Ç"1·òh,Xã6ž@¸‘òE póÈ ˆ;xÖKÈ!=m°LDz¯ÓžŽIãýÁãP° ÂÒ›g¥x· x€Û¼Ì]°þ„g@z¸M3ÒŠ#áqZi—É´ ÛFŒ2Lg7ùä69¤G_)æ¾À 95Þ­–ùªB­ú„qç R‡¢o¯ÃÖØÐ+œÐ‹IТjÉ !ïVKN8Œ¼5–ì#¶Hðl6å)’­† æ)Eýûã ÁGHò8¬so•Â=1ܰï‚@3žü7ž•¨·¹¾× [ôþäñ‘à68.EÀD’ç S!.E‚>óAÁxÂέâôz¤ÄC%ê¾ ¼~<Ïé†õhù Î7†©i<^éxúÿÈUñQgF§þX¡ W–ªsUj¤¸„Š] µ¼JÜFw™`Óø¨´t¶Ò;˸Y»n5iÄŠG–q¥k®t ‡C@Ÿ¯­s­h!ÈÇõpG©>…³ú} k'W«À™P’~­g¿ê21H‹ `{ËPœåCÊÔÀÞU'²Ñ‚G‹[¥´=¦Cõ —=çœÚl¨íªÞâ¾iþ,Ÿ±Ö†u‚üèämkâ­ô'u2Û ÌJ¸x¤•"URÞ¥Tã®{#ä[9=Ÿào‰¸ïfÔnÊ%œhÎã~…ì~„ Í<©YŒÊ(g\#xmÑJݼ³÷&ý3Ðî¡<ôtýCOÇ]›ªQÕ-®H»*çôÃŽ©x k‡”WIÕÅnq¿Z /¸£cümwe4Õp¼ÊÚ-Fêðu?-w-_»[e¯˜,Öz›Ò ×põèI¸ ^žu¨fBEù8öÊÚŰª A×E¼‘ëâµA¼$ˆòêvá¤DY=²ËqÙÜeÜluâ¯faHnk÷w%aÕ0Þ£óØ!+¼"òèÙÐ-Z20¡^¥ãuM°A&NY#2ÂuÚ*·P 5­Ž ®¡šs|Í2Wˆ)^»r?<,K©¹…’E š4ÝKDM¹]^ECÌÓ}ã2˜)eû1%¯¸œ~ç0e<£ªåØSªýÆÙ,Ë:³,‚™QâbþOËá ¦T^]]j~Ù+$RHØaè¡Ô†šFóhK"Ê=èñ§VèΑ.$â„<Ž$!2ÂÕEÙþªCYúNdÖ—R}-»­s®«usîÏÛ7Y‹XÒY–tB¾ƒã¡rÚÞ‚ašr=XØêLˆŠ%hŽw}JÔÅF+¾å¢2Wiìh ˜% EÒÝ Õ¥Ë1~’­%nÿ¨Ä&2´ø”ó^Uwµ7yaÎY]¥“ý±Î\ØuKá5c 'Œ—ì©Î×oÁ-½aTB@—)kš %†]žÒñ*{H§‘ËóÍ“yÊ™-‡†ÑÉ5ƒä–dhÅ ÂæÂ`@yá°zr² ÉíFAë"7³åÜÙúÆhã¶¥Xå^ý`÷Ý¥vUO]–ÚV#ˆóJݪ·sKkúû p¾×VË~¼íÌÕHѯzµò`ïb†#9'¾œâ Wf¨ãÕ"¨ayUÂGKÊFÁ䚇þ…²±mõžÊÊ'ì”´ â9ÏÞÀQiÏf5E®•W°~½¯ºSu-ÇžÖ«h=¥—CÈQZÓn\ŽU3²û ^]Ÿ_á„‹k §DP> >> endobj 7009 0 obj << /Type /Annot /Subtype /Link /Rect [239.519999 98.8999999 276 106.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 7003 0 obj << /Type /Page /Parent 2 0 R /Contents 7010 0 R /Resources 7012 0 R /Annots 7013 0 R /MediaBox [0 0 595 842] >> endobj 7012 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7013 0 obj [ 7008 0 R 7009 0 R ] endobj 7010 0 obj << /Length 7011 0 R /Filter /FlateDecode >> stream xœí]KÛÊ•ÞëWh º¬_À`€kw÷³`Ø@Á,Îd‚à:Oùû!EJ-Uñ«ªsêAR-p·E±X<ïwýò_ÿûø¿ÿ8þòùëÿ¿Ï??=T§ª©¦?Çñïïo?ÝIÉé×¶«O²ÿ¿ÿ8ü<þ<|9|þýyÍùÆùÇpñòˆiÁ|ÿûá—éá‡é“¯Ÿÿ0üöÏ£<þçð¿¿ÿô_Ã?Ïë_øqèúfüå·é!…ì†ÿÜþ6^üëá¿;þ}ØBw^wü÷÷u«šZë¨}ü¼Þ*ÎooE $ÚªéŽBÈaŸõŽÿÿŸÃ_†Õ®Û8õZˆ¶Ñm¼j+Çe•êŽ}Ûµè¬E­w [JÄ.ÔÖuš…Æ‰¸W•nÝKºF¶º®úþ¾ã^L0lmßý²R4û^%ZHŒ Œy³ 2àJ)qÑ©ÏÎ/.tä«¿/»–}š…Æ‰¸W›±a/õ%‰Ø”ïbó§ãÆOß¿¼õ£Šøö—ag=3ýøöã ‡ÿŒ²³“Ço>þ[U ñïÇo;yÒª­'Å4]©šó•îú°>¨ÌÚóú²ÖÍbò|¥=U½ù˜ÏÓ=ï´æªð^Çæ ϫᦻó•æ$E·¸Èë·µqˆz”£‹¸º6‘5a ?Õæ[I®T¯ðÊ ¼¢à•7teÞ[ ÚÌZ™¸´«r¥If’±¾j>“¨õU9Á©Œ½NÈúö«#ø*/‰Ê®Û‰.ÝÓÒŸ#ÍMðªÓtS /m¾ã½BbÅB“$dFÇj–Òù”쳎܇ù‘êB7mS7wP ‚ °Þò¿C2˜‹Ìô*Ä©ÖÍH!Ddéb텺ðÁˆIoÚ|s[~‡ó†…a‡5Òå ËÈrðde‡—·´^¼5‡PH‹{¸šo˜‡,↋(“18V«P–â'nV,²·˜ÊZÌúC8vÄ±Ž ðP‹4¡Fä’WúP¤ºµØ›o1[ÖXHÆÆÉö[aN·6`) ?aBš’¯tˆ„oÕ!٬DŽ‹¤Tði…†_̲I­”$ªÒOœŸ’¡‘3›Úëù®ÒYÿƒKÛ/º´Í$¶ëæžY°šþ˜àX¸R]^º­+â%é==ºg¶G„:µ M‰ÒžT_Ý{3BÍ蕦Ÿ3³©¨NÓ…›+oô½‰W¸ÞÞµ˜‰EIÒŽ,=ÞãØAãÙ[—´WôfqI =^Õ!$8N'aØ&8&–Zgx=6þÂu—ß²,[3$¹ ð• Ž‡£2)‘…˜xÁ _)kCˆfÅDl†`ÈÑá¼nnjƒÞT1"aCnJ’¤]¸ƒÆŠˆèÍ!áŽ|Õ¤ÁCÚ†#¶ 3Sy’˜[q¢cÄ=)Q†}æ@AÓbF„À<~<š¥³BXåfWA½Ô† Z[Ukýþη/%¬ª A€FÛ™ ÙÂÞƒí÷¤(ola „îž’'Ü »tDÁzŒDÇb¬VÝ~òÛákñj«óî C׈i‹%¶¥l?.Q22Oò%\}¤(ºpø»e¯GBüN øÊ”Pçè…+1Vt>EÒ.Ü¿~ÐðH’ª¨<¡2/êsÊK<š3’%«GðÓÆ±Y¥1„Ê" rŒ&K,ÄD‘âØ¡ì„áÜ”sÄŽf4U›¢ÎÑÖÕÁ+ÙðªíÍ}úQéw­16ñ6Sò[BùCyQ«µ2~ÇÞRg`›] w¦œHô¹ÆRÔñÀBºõ\B“Áfgobŵ“_¡ (ÈH)2Å!øA)1ÉÒZçGû£VÁ¤ÉðÐ[‚bú1r×b¬uFbŽå ¦L>åu¥ìRdN9±™}£ÄvóÐÙ?Ê(lÅø|C/sk½€)HÖoxÄþIDà1S÷G‰°­W@p¬d@wmÒÙõ€’)'eX"IG(m®ú…3….gJ_µ&Ûj©:_ n‚›œÂjÝÎЉ¯<¯lüз铦  ¬Á©Ã²‚{ÃZBCéà»”ƒÍ!ŠïÁïȽ`l{¥7‰z §i!ªá=E5e·i÷¼ò¼Â½¢JÌk˜y¦Û‰°; ‚ïÁVCÆ–ò#M›lÃSjT»fñ=‡±U(RPŠ3$Ç:„™åPìõœ»õ©åÓAÉÃÊY0ò欼ãêW8œóoëçQ5#cìÈAYƒaP”kÛz3”ĺ°>ŒG¬›ð=XÊsr«ë³ˆ|:‰ÓgA“fZ–£Ž¬âÔÔìÒªfUè¬_ûPHâs®Õ½öCqËW8<ƒ%ä.³ÇŽ˜HZ-ñ`ñ€}b{QìV(?onø «v—ô²¾tpXŠ»”¾ ÞTr3|¶nfÁÓÅØv—À}º+¯ *É‘{hSòä#@Ð:–b¨§·ûj­1S²RÝîS€îS‘>‹4X`i:š•’^ɯPj!L’}E-jó™œÑfŒóÔXƒY’4å{•±º5-i×3ÎÖŸmµÝ\8ãäq‡9£AßF_ÒÓk³J”9¥˜öRôô{C^›ª¤§aSí¹A £¾éÓú´G1úY1åHF{FG—`Éü¾lW §9zKæ,ÇäRf½®6e|\×QucÅDÍQÜJMÎyB½ÉÚòÕ^{šÞèù–•¹ÂDtÕé`‘Ë?jâ°ˆZ-s:ÛÞ%Òšò V5Yd>É•0;,œÜ)¶cº+Å* XÚ¶ZkptfQWvº{Ffm;Ó³™%‰gqXXéƒçóüõcsŒ¹ó”á½ ãoõ3&éãb ¸èòRk·§iœ{0çù‘dONŸsN*½ÓjÔTo‚½3¸õ!BävF%ËÉ„” ýʃ-5Ò1‹Z ðÄ­=3R¯œ¦-ÇJ„YÒdmm_ÉoÁs,bΡ`’‹pÖpšW ä1uÇù[ýÝ*ýý3Šè!.õŸ%{tÝÑ0\?’×èM¬«CžšÈ¯‰l7*ÆåËãù<†ÒJ‘>¶5ùÃ1SÙ­ÀŠhW/]5@‰wr¦½Eä¥(â)¼¼˜ÒJ÷ V#fP?ž"òºZ…lZ $M Ys!¡gaµÜ.Áþb°«ì+¼(ÖŠ¡"öËY7µÄݨ¤´•ô,šž¾!O‘ÇÑCéÓŒD¼”˜-&N1ïI8Ù6{”ñâl+‘`å¼Í&ÇðÈèÌIjdjkŸ¾æ¨žHÚlFq4}%F.aâu¸•F™vµvœ`íâÈQ9uHÓJĆ¥õ¦w‚°ÍÒæIq`8““b·˜… +ɰV”–d–'¡[‡p€aP'¡Û‘ðç »áŠ€6†Î;öÚÆ^•ÁòI¤‘ƒpSÌ'\ýdRÓƒÞ^à›BlÏ…¡âZï',@ Fˆk¥9½·L€=ñ!ë3K0¢™oq»=ô%$µS²ø†»ržbê5ržoS¬±QvNéß*CüÓ«GVåš« È“—>ÏÍRø^o: /² Ï­ÏV}ž­JÞÛ&ÎVíÔµïˆEË*ð )Ç*Å ¸ké’õH±º‚÷À¨¤\Ëè£ñŒ,É3]ûä™'Ïì„gðˆY‡½ïÁïÃ8›!1]cK¤†«áA¿ØNÃÐÏq k„;ÀÐq`?ï1–Ò±7¸ kÇ€dL£ø}6lÅb ‹¹$]:˯ÛtufïR·9¸ãs–5XÞbZ~0Íâð`0g< ¶¬]9Xpp§ þÙ2¶°Ær§Ô” Ý\•L–9T„š'Nyw’nÙ=žKM`É[W8 n5.s °ŠX0nÙ._¢êaÆk$D¸kP J¬åø!ÿg“:d~#•”dxa@¹:lCv4Sÿ ±‹»o Ô˘„Q½”ˆ¡,íl¥¬9[\ýT0ÎTöVˆpN–óÃ(&än äý%˜™Gk?Ô¬ Vz!³¸ig –rÄýÕn¥«­éGŠpQ߯cŠòÒÁ“÷ˆ„˜Þ•-AФ–Q¸ö¤»$¡BAf–ÚsžVÊ à¼Ù+ƒÉNóÂ`#ËJTååo.Ô0±» ¶Ûb‚w…èy&Ì{"( ãE,i˜=îqËH⎑¦O‚8PPN¶8pµ„&cø´!cñ11C¬z‡Øøâç÷îÆA§Ç‡Zt·üvøêjyÄḅÊq9Bè"‹´eɘˆXgîR ŽbŽ_©B¿Z /c'Íïf2€×ªCKáúp“®ôFí«v™¨,(,0ŸÂí ÙZ¾B‹Ìl‰¡.[á55˜8YzNïéá=Sö®•'Y©¥DùÒj5Þ~ò¿;G”Þð Ý3›lKWz™›i÷Ì£¼û¼·3DPÝø»¬EëŶÀ8…t0§$:P-¢Ñ¹è0 s/ˆžíUЇëË·$Ðﺪ9‰Aû´÷h =¼r£*¿¤”†Ç/‡Çà‘| endstream endobj 7011 0 obj 6242 endobj 7015 0 obj [474 /XYZ 40.7999999 742.099999 0] endobj 7016 0 obj [474 /XYZ 40.7999999 742.099999 0] endobj 7017 0 obj [474 /XYZ 40.7999999 302.419999 0] endobj 7018 0 obj [474 /XYZ 40.7999999 302.419999 0] endobj 7014 0 obj << /Type /Page /Parent 2 0 R /Contents 7019 0 R /Resources 7021 0 R /Annots 7022 0 R /MediaBox [0 0 595 842] >> endobj 7021 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7022 0 obj [ ] endobj 7019 0 obj << /Length 7020 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨s€‘ÅE°Ûv€c ‡ ‡À“I0ˆqæ¿UIÕ YÉ÷øH©ÊÕ ¸ÛÍÅåíë›?þø÷Ã?;¼yüñ?‡/ëÏÇÚ¦íÛåëpüþáåôؽü:Œ]£§ã×áËׇo‡oŸ>Íÿ~{PýéÁõÇ!5v£=(¥çuvóqü÷?ϳ=-£™¬RCo‡6yÖùßyÚqR‡ièzÞ»;©··´©TæD“R£ÈD§©¼­©Öᩚ±×ƒíÚi„¿¶>®[ŸÚìSeNq2à t¯óŠTÞÖÖëLÕŒÖ(3èαâˆÝ8êù÷Á¬_„÷}¿l}~*sóOSåN4LB÷z\‘ÊÛÚù:ðT¢×1ÚiÙz§s7ÿ4UÞD'&sÇ©¼­¯Ã›ê“#ÓÏŒì[àÁwŸÞ|LûóÏó2Nœùñùëƒÿsäf3þéðû¶UãŸyPªél?Ýés§‘öÝid|þÇå£f–F¥_|Tëå£Í8µý<ð<¢´3‰R§?tç9^|ÔœFlcͼŒöåH§ÇÏôp?צ½³˜–Ižþ`uò9â×´O#CÓNËÚž§·§‘ŸgXʃŒ @Æ,¾8 Ñ>:{lßÂ…îùxÏ*t‡ëQªî¼ë”÷½C§mÞCøzëÞÃ;gêCôÞî#ÞÆW ¸p§Þ¡­0:E8Yà5à‰ ÚŽ0Þãoo/–s( Ùë­Fg„ñŒ5îK£«…t‡’/¦ôù„žWã•hªuÿÀ8mÿš=Ç7…ϹC =Ì‚ž€„±ó±ðô¼É0¦y¯1tÜð/Ö[+á>á¶´·ÖôYe›pÓ>xÚ(1w3†s&†l>rˆ¬Ëð¼0Ëk¦fè»×|܇|òé˜+2‰ö¸4¾ŒdøÔ<¨àp—â,cì§Ý± ¾…6Ã2¸Óð  s8¢?F™&:³¾Í.)--joåK†Þ™.º†j›~P‰Zˆ<ɹe¸-ãñ6ÆEù¨€ Óíè ÈP¼‚¥zQ¯ˆø$s嘂mȰô䢭†V72n9ÁœAÔç‹SìÑ-Üt'ÁʄڷڪH/¦Ð‡I×.¿+V*©Óì§Òu›-³ ¡`” ,¬—ë A (ÎT;8LŇ.ï8˜ô8¶N•%9¾ààu¶ƒbÆî Þ¬"¨@±D±&…”R¶ç%”…" lìLª ˜{>¸"^ª¨â(ë¥âã_I§î³¦SE4_Q™Ö_A7(¬6{‘î!¡èÂéÇý¹·a¡ñèÇ~-ÉqÑÂäæøE}åqj Ê® ÑJ€¸+kPhS×i—¾«ÈØy z‡Fô„FL‹FTߣKsµ^¹Äq“ m`–œ®šìÈ·²9‚`ÁpÐ1 ä‹Q²š)RÓÈËÒ¶±öJÛ. pÄÀµ½-M)'k.SÊ¢ïtïM@Ñ* jÓ`Ý%?Âë¼N Œ­º¤ÚžÆ_ü¥g#Cgί\¨¦²gB—™]ðLà‹›k}ž©Ä³brøÜEÀíŸaíÚ I0´b‘Á[C(ôe$,Þ¤ßâ ÉëÐŽ>qB×Eeð5&‰øŒn9®!1ž0³ùéblÅj ôëEÍ\±]¾\Tº0ÒžïtèœõžþÌJç.=3¡gVO€j›Å)äÁhߘäøðvá=gÌ ‰Úõ>­86Öå¥xÕªG³á÷¬ôÂNgÀ˜mõ”G=70AÚçI'*ǰŠIÁ£Æ âD8œxèÞ°Ç@期>¬x؂Ǟ=II$7“xÌŽùéB£~Ÿ,Ø2B„d"ù3î“lPFøOð~ óÜX (ÉÖÄÓg~@Q–DI9…ŠFÀStÚÊ®[¼â1ÑEœdwwh—‹¿€ôàÊj˜@õ÷öfe±—É€ô„1Ž.MÖÉ»ËØž©rÕ¢ïf!Êþþ8yÙ-‡Ÿÿ]ASµ¤O6çqx C¨ˆ›îã\I$oûË,‰{ür²~8ês°ˆ‘àM‘ K+©±i–àÃ8I0nÂ;¯Ę$FqØLz[!¾S'†Ã¶³$ôt+p³Ñ†Ñ¡ò>«©”Tš™qêkQåD²z¸Hî!ÎÀ¿6Ñêqe@ã%ŽA2t3J@D4Ô¾ƒd=§8YåÀf™âY7gÝR{ËWmÝJ(¢&&ᣔ P$—".WQÑ¡PòDœ`í.®t³ŠµB…‡é)6‡vO¹Ò+æ‰d÷Ä].ªÈ±X$ØS%¨!ê•îY¾CÑò›9Uû$Dêýùuslë» ,§‰§X¹ Jé†âžíµC„9ùo š•hˆØ-F=ñ\¦ÊÎà$qkç5ëŒ: ”° hVàÊÕ$Í?ÙŸ>œ7sú|FÃgÖ^´l?œ¹×ÁÙD³ û1¥ùÂÔç®*Ödñ¢2¥)dkí8Âx[>]^ÛÕHßê÷ùK)3í’% N2´Ÿn?Z‰^"_~ÉúÌãèàï„ ˆØnªl™Œ?wójñ„ˆ¶Œ´»k¨¾Y†¦o”rUۚˊӗ¡k“‰gÜÃÍ LCJqÑø—Î ð·U^ŠHŒéÖ#ì²VÝ,€šÞœ¸¢xpªWÀÖý„™ÅoV³í `Ýêè~êÜp¯ã7 /+V!:ç†ñ~Œ˜Ê˜p¾£Ê8Nœç‹WÀ¹{¼jŒï!Öá‚àxã£èN †K1µ" }Óñ½wèKx(«c3jèN \MW åãn†G°yDV‚ÂážkhÃ¥Ù๠}Xꂳa(dzɞ[Uø7gh@ækH™°ž¡®‡C‡ü¾ã Æ:6X óû7qÒöƒéØŽGp˜w ¿󌫄ÞÀÚ*­ ÿãÌ…:|à†dàZøx ø~ü™¡M8*>ìpt<Áô&w`é%psŠ}Åד²%R²ËJýä,ý ¸hÉ:¦wÎãî(¬a}Š’ç\$Ô§‘(Ç»Y]GÑô‚7—p¾î‚)y+·gVg$ÂþŠ890ÌÉUl޹Ám‡PW×õÎê|ÿ/‡¼è`NwÀ2òÿ½æÐó’Äš¸ÄLC£#_\¢pï.Ÿ2ç…§Œ|Œ‰K¾æ²²K5™liUÊ8älF§TÌÉš38šF ]ׯµ±*«”JáÑWÃÊՉʩm›£74'OÇIï_Âpª²tŠ•þ°Ö¥øœþÊ.Âù†EQë4v:§‹+ Å€{J‡s†÷?z4‹ÔØ“$~þM3Ø] ‚„³?Ž‘¤NPKË¥H@ eúâõDB ïÌãóGW¾jæ±U@âf*.+R*ߘPÁ¼38ØÇÁK:dROB4„'!¯ûÌæ=!‰âŽ«¯ÔÚU r´ßòèCì5CAÛ‹ÖЫT¢îû~}MgNïqkE2ÁñûD² r ~u“š+˜èú§†z.ìºtI»Ä&Áßi:!ØR(Œ"å&éÕ4E,ÔW¢D¨µû hób~% §Ëñ’.%KÃ\J 9!²TÔ{†È9Ï:IJ/~‚L%áž“ATÑÒ ‘åeä oY²¢õä…ôD(LФN6¦8ª²Ä}BB à —W!"‘ŠéF,ÿ}ÿÚFlŽã,Ž˜.вlϸ VwátÑo°8zû§ºƒÏ]ÏÛåË¥FÚó¦‡ÎyþÌs9ï™ =³Fb(Ó Ë麀>4¸»F{vœµ!BÛ,/F>Ò×öÜÇÈ{¼‡+XÃÆjg§xg¿n׌®W > ÖÖ£-_tÕ {{n®…}™[¥ˆ•-õ³yMœûƒOìÍ’1 %–)[¿m)¿²Ž}£µƒÈ^^б¨V‹{†=‘â!zftÉ×vJ>§L¼„¨Œ4%™FgÜc±‰V€gðø¨+á¼f%¤1öWÇürcÚDjHT2Ùø—#ÁËPí‡ œlm××OÓk0¦5±»¡†tñ³š•·×2Î¥}3Fç»á‚ÖBF'âì¸|>k§–ÅRûàÅ •áå Nž™h¡ Whâ aÙÀýXx F,$:’ºs¦nŽ»®´Îz†.²Ë›[F}fnnsÇÎÂôÂT”ÔÐŒzÔLº3R°Y4$7ðŒH\f‰Ôþí›ò­µ‡i¡¢Ýù ™§D"×$2´ª·sôè G³#TlɉF¨¨›Œ£¾ËÛ·!õU—©Ug(ÅûÆ'Ï(ñÉãÜ-Î{áN±L¸a ±¸«bñ-`™q .ŒU4 ŒM¸eÇÞ‚gÃ+`œÁ+¨¨õL:öaøïTž¡½âXh3˜ q 6–ÙI Ì7ûÁÍ9°ÌX5ç~4„Ö~8«†³u5ù¦™nÏ®@2"ÙÃ8öö[ÃZlûΰ¶£ë‘¹Ríˆ#kî…:Ô¤Áé=»ÏÆÐ‡gÃ#œµ1pFCÍ-àÓÄÐÇÐܰt¨ñˆòç€ÆÀ&Ní“;u@Ô!èAÑóâÎ&‘Ð#‘L%‘Jé›WãØÝ9Õî°{$ýbgErågBI+âجÍ*ÁK(’Ý.Q+X¦Xy<À°R ˆ§8½LcF]INq*úôŠU”ñŸa§SFõ ŠÃœ"„0Ùœr¤O!¶eêÔŠPûÛîõœß!"Ÿå4=tÏÛ.ŸÐÍr‡L¹Â0‰ð’¢aE›aY—^ßQ³j–©üŒñ;¿tCÓNèJ9Ísú!­…~•mÜìÕ@ªƒWë£H ™šDרÖ\ÓrW¼AŸj/½ÄÉ«ºEâ+ ÊWÀ¥5tY‹d|*ë ±“u€ÿªÃ4Ç26Ñ‹ù— zuîñ*§8žŸ^]ÙÿD½¤5ŒÏ¹K¶šR.g)# ³È ‰V ŠfžRlBö˜.[‰ÈŸ¸À”u%ÅU‡bŠÉ¬(“© Á]¨_¼v(ÃDèÁ #ƒì'åéžQòô¾â%ó÷áÛŒ¸3^§X|ùÀdŸ´Ï$àS×,ëjÞè¥r)“êÁà`Ú3 Y“Ûû¾é/§DM¶ño¡Ïzh†Ë©^Ã…‘å*Œiôt±Êv×5ý[î%]zÏŸ™à3 ˜ ºÑ­yÕ§i•%/ͶÀöË¿¼‡Ÿ])Î…~DϬ¬öÒˆBûXÅÚ3ëQö¾®í„Pwü]wjˆÞ¶Âw á`ÅZ¬.Àèj3K»¹÷žýY§ç×ENÛ¾QÇò~¯¯Aák˜àÈ‹‚îŸ$©ááÓÃÿN/M endstream endobj 7020 0 obj 5672 endobj 7024 0 obj [475 /XYZ 40.7999999 200.659999 0] endobj 7025 0 obj [475 /XYZ 40.7999999 200.659999 0] endobj 7023 0 obj << /Type /Page /Parent 2 0 R /Contents 7026 0 R /Resources 7028 0 R /Annots 7029 0 R /MediaBox [0 0 595 842] >> endobj 7028 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7029 0 obj [ ] endobj 7026 0 obj << /Length 7027 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾¿_ÑçÓ#.Ú€A€x™90Æ@A' ‚L'‡üýt?IýžÉþHV±HIýdö³ÕMq)Ö^_}ÿÛŸþ|úÛOß¿ÿéß§/óßïzjÎM×L¿N×ßß½þ=œž~ì‡ö¬Çë¯Ó—_ž¾ž¾>}zútùóë“êž¿8ÿuy¸¼bð¿_þõôýôò§é~zÿûËOÿ;éÓï.ÿúÇéºüõó<Þõ¿< cwýáŸÓJ+=\þñú§ëÿ?ýáW§]¦0<{ýó»¶ïš¡É›Ç×ÛWÕóï×_E/»ìnÔåg¥ôåö²ÿùËÓ_/£Ý¦q¬Q¦×­½üã®SÏKïý[H\û2Rö&ö¦“è:#•µ²å0àH¢W£)Nu*w Q ±¼ëŒ„8Jòj\øáø¼ô±Í\ûm¤ÜMTª12]g¤²V6Iô,Ô81—¶ÏÞÂQ†M)me„ÆóŒTÖÊ–³€#‰ž…íŒ*w ¶—‘Ï3’‘àþPŸDpý¢€ |ñÝç§ïTÖ W{ãó_/3y6Z¦¿>_–Ûž¾»j}.úùçÓM£Õ¯OŸÿñ4žÛÑôídåðŸ(‹ž4#|ò>1ðÉ;øä=|¢é³VܼҢ+ý12·Ÿ/Vœ^Z=¿Õâuã‡;¢!Uà7ð ç=¦¡S…Á§…OSì I±ø´Ì8%:k<ƒÀm‚7#pgð¾áÑð {`ð lÅûÜ«8ïÃôß2¸|Œ‘f`熹‡b{úJñÍÀr3°H},ZfÌšs>Rk=œYÃÑÚšrs¼ÍÒØô|kñhø gn .„閭·) µ8ZÜ·€DÅTÎÐ{€OA”8$ž5Öà÷9p¦x8¶\i`ßð *qbÎ{Rœ³op0d(cnõ0fÀ² jGûߊ%‹µå*²Z7cTO“õ‰OŽ'Ç“ãÉñäxBz" G m3 Ãn ÜÜ­}×vº}-ò&…xx‘ð“ÕoÏvš¶§×wg­†»6¡u•›þÜu¤==¨ofxÒ¹sÄõf"±—3Ûw†W“.¡ôò(°< g/1ÇÙÆVêÜÚîúê„Ñôé³÷ÃÀ9âÙ7éïÃx[îN o…C0q{M?%FÁ{]ž7³À`˜pÓ'/síl2oš-0™C ܺøFÃïRèè}q Ñ[GDàsñ& b̘sˆ×ý„w5¬†'†ç ™ëê.Ó*äÇMzçî‰;;ŸÒy›NN|Â÷rr8Êì´²öÆšØÞ೜ŸwÔžàs÷ÕUéus0mc θ‡áUé^ÈqÊ€oihF‡YîÓ×`7Ìý^PM늢ââoôN4 °xr›£®3.1G0Ö‹.Öå°¤=šÃz›÷DÙÎÙ÷"" BñÁÖp\¸xÊ>Gºå¨ã»v| ± A¥‚4#¢€lgðÌÀŽlüb 33àuqoi‚ûVȘ¢1—eGœàl½„O…`ÅHú'Vt/Åg½ ¸{=â#n\A¡Ñkëj1Í;P´vÎFq¤–7%‚Ÿ kexöB³—¤6ã‚å¯Ïóœe˜(ŠÄH¶B„U _Ó,y÷çho%´¤AÚôÎ~”J)ç>ÙbZdøXYQû!êñŸÏže©ûÁE75à~Â]£ˆ<ȇuäEU5k±z°S0åVœ „}pvw²Ed+‹:R)@ÒÞL”@m?ºR¯ ¯9âñ Lhµ¸cí;Áà¥mKÏq5;}}¡è‘–ÈÕI÷&z&%á@Q³¶“F·šî|ÚE-1㚦Ñ-+Ÿ~ltU"\"B†Ñæózo&¢j3Ç«ãNq5 i’S÷²Ðf1Ñ.£¼<ù ¤ŽwH´`Ó“B&2¦vVÀ ǘcÜÉ("w)QëcøìXÎЭV€%96=zÁ{ƒ¥§úqTé(½ØR\7b›~y+Î5?à.¸K欸˯«sŸuÝ‘}Â]>\• |õ{8ðL, Þx¦µmÆ­å<9@Ê ñ€:ôÒ-æò¶üçf`Ž ¥ãQÛ<Æ)p37 [Šç†éCƒB=SHÀºb$N³`Œñ{ö\2{Ä7ÙªÁÝÂ7FHŒñÏ\°ôºÐœücJZ¼l$Š£Ìð¡±æX¤p¾L’Kz$@Ö‹)Q•¸ÞUÊû—ö¥o>ÿµ¤¤è:GTTK±%°‹þψÝ{çÍJâÔ‘‹ìájWªy(“ò&ØÚ\Åù† 6x§âÊÕv üÔô>e—£MXùö § ©a´®* ÖGÈðò)KàßPc³RIvœ4\Áz6K@j—9¹•!Eëûò,7BA±Ä›–cL)+ÃG¯zJ÷¤ø“çP4¶ºÊ”XçC™–ÄM3Öá‡*w¨r{Rådg¾¼ãX¹…»9¤sÛ ZŠŒ“Ö:zŽ¢8+»äDE5%Á×:åJžÍ%ºòq*ûªým2Ø*›ÎÊΖpFúlÅ£Ùr8B¶4¬)~Y°ŠçŠP¼ãqã>p{rÜ騂c?f—¿NFÔ¤6¥;Â.ýS$Ö(GM®5,\Þ½~9cNY¹Dô:ëN`ˆ³¸ˆéã§UÎWðÏ“>Ç—Ó«FÕçéƒÌ¹ŠF¼×ÏÁ!äÊ KÆq sƒv—¯2ÅQªª$¸•Œq ­#pv•¹V[¥$h Ûëü˜þ^J÷ ØE«`èÕ“ˆö”×&áÂLP8¶”h¹õú'‡²KÞ½’±ÆeÕó)C'4²!Í]êà o¥H«Q–3TœÊ+ƒh²;Äq¢P†$½ùBȼHOšx0k®B ¬õÒÂÐñ°8Á£oã½î1ÑÑV²”¶”^—ãúˆÇx9«ðý`9ÄÀpÆÄû)&§­”·‰»æ‹çÔáåউ06¸-ÂÝ”PU$™QIXïvpI¤¼rVå©'Œ2DÝz~¢œÄ˜Í¨ªµÌÒSÞš“.©ª3Yë²l-NŽl,Ôc[Ò%€¹Ó©Ñ0ކ®›q Ub€3n7t®À3‡Çh7X <Àç¾qèã ÷j;$Eµ$ÙÎ.­ml•ಅU—uÜíLicUäÒ¬†Â"adHúq — ±"ܕ˶×ý𢨮Ó. h÷—ëï(p‘mÉ)ÿ+ìX­ßÞöÛm¦ B›Ãî Å1˜#´Vp’ >Áð˜1«H˜ñá@=1Øæƒíjmð¾áïàõàY‹ž¾Yß, òŽïöDÀ“ P"œ) Œ†ÁC-tAWñŽb:ÀT÷ÚÀóá´€ÀÀÍ®ŒWÊð‰N[®eBka~ƒî!`Xìá>#1b.¬"x:Bì^×ÓYzeâÒeõ'…#-šÉ–åh@xy'Xß-=pTw%¸‰ÂlpÖ@ÜŽ=)Úˆ»wÏiÇ xÂ.=àé%ÀT®ß8°¡²HY0¬jIÄ0º Ó%Ñulûl4EðGnz¼Þ…㌗hõx´kEôn¾pÆJu"Ù-˜Äs„v>b‘̘ÂÜ׎„Õtz Œhè:á<9úª5µÐ:ôboTztÃ=ºáþLÎcÌúè†{¸uîs;Æyß.»áNHS,vç1ºàa¹ùpýkq ëMõ¯ú¥BôèGü§©l`ï– íG¢ngÖíïGGáôÝrâM 4ŽõèJAsVßSQ=‚u ]À s:ÖÂÑ{Ͱ¿kí5ënã[‚×ÃÐÌdm£@šc¥³¿±ŽV2.aZÞŸãɆž”O4ÛŽøv;CËÔ1x1B¬¡VýWNUÄ¡Ú+UúáB#Ü»®]^C¹v¥Þ2ÈÕéñ×j=Ô÷›Âµt’~-jÿ”Îm«Ý=ÜcRN³ ÃÙˆïä*ÒrÊö%—Ýán.‚ç}4¡&¼ :Ozë!V_~²NінË)3&ù¨«é{Œ*gt¨ÆPâ)ŒERf9SrÞ›˜eÝç\¶œÞÉ,8‘9UXIÎAQ ø#U ·G0­¼¬Ú®•r醆±+< 4ãb‰Š¼‚\ƒ»SÅÅœµóNîêe ÊÌ c;!(Nt‡“ñ´3b·­q ï"Ž+1ÛÍŸ¯eˆ˜re‡çø˜EúvpŒ‰ `ù+cd®M¼ü„ÐÄk»£ÑVqÆÉB¼ãôFƒçZ²Œ®ô ãpn¦VõÀÏK¶ü*˜õÃ¥‡µùê ו,«×ÖÙdbäxÇ£*Ç—÷P²Ýí8Ï¢³<ñ˜“þ‘Nbœ0¾H?²¥(º$êúfA™s9YÜÛ®‘Ðnûq‘Ucõ·'DK=$Æë“‰ñ@b ß¹‰ñ@b ¯´#M–à3M?Ûž¡j:ÏþR߸™Êgá˜e[N«\Y¶Å 7ÞÁ×_.|Qðh 5 §@+œu€`˜ï5f#xß0›Ç–S³gÍ©Ãu§¸vßƬB«<²X7ðN»­À²[Û%óìª2dXIRHIüw£Éð“ç])³€@›9iüNzì[“Eé‹$ÑÏM´WÕv=s¬r0æånªk´ÑÎmÀƹÅ,aêd?ÖÚ K³˜uâï`–†×Ñð 0rZ[¼[¸é;ç|sZ}FÂÉ#ˆ‡np(”pçc×µ¤ˆéZg×½“-¤Á£‰¤UêòITIx±pB·Í•*~7Ð 6=â/©Ýò®pËQì·Z±_BÅ'¿¡EÉ2²Î52„5NNÊD*nwYsœz]çƒjœªi•{ÀqKÀTp´æ[òÀE~÷…3ÊÓ…¢H'å1©‹1A•/Y[fFçfòáìF.'#ë6 x‹©x;ÑЙ„UÕÊö§Ÿ"ÏÁY-á•Ðø†@ ˜¥²Ie­J‰´RQ¤„„.W#¬Ï;Bî/ãzo®š¾hqšr…Te]K$8‚ÙR´?VÙºÛÒ†©2&ŠˆtñGXùšFF݉:Á¾Õ›Õ±,½œæx1‡l¸¿%~l®\¡‚£®w6bUÈ¢^Á*Vqh½xq8Uˆ~Ãï?\ˆÕ]ˆœT6RšÝ‘×äõGVZ)¯?¼‰Ï¯”Añ3·,¯ è[ß"x¨ZæpÏ)he Ê)ÞC¬ ÷W<ÐýÖÑôÌ„¥óêz¤ ̺ ðåç!•D Š&¼îNyuÿ£¿ç5©SÂ>—d$%Ÿ}…ÑØ'ü¶WÛ *N9\y³wT|i û…ÒŸ]6­ûÈ,#Ÿ`¸&d4å Æq æ Œða×2Aã8”#Ë`ÕÀtsÒM+¥pâ(tú×°*Q™ŒŒè>´.¿OW|) IéjB6jõ˜AVλádTÍ©ÐÖ˦^W³Óoü(…„ô‚i„¯'­„è?Ýö”p!p2âeÒ2.#=K@sRã‹Ìu•âF„ðaFåã„Ýèð}Œw)ˇ àÌ8†’Бÿûfà;×JN­žVT@šÃe óDJÊÓ‰;€’ËØ‹@iá¾ÅËÝãö¼æ,K&‰™®Xz¹³íÕç?PæZAQ4ν/¢ÈÇ("Tv¥çaÉ–‡Ž’P»ék»QlãœäoŠr&R«*XýöL¢—ß§¯Z¼Úõó__~ §OÕÍ U Òuð«q°Öî¤.˸Wã>ªnâ§+î¼ÌÚ²;w÷SèG{ÊîÏý}óþΓi£9ëѱýf =wÓIº¼èÞ{ø~gÒûz}ÖÍ3ŽçË“wp´‰^|{ôÞggþrg…?¢ïÌ,èÞ…Ö1Ó=í;ó‰QÖ>ÏíùdPÝõgݪ>zÚ Ÿ)¤ƒ™‘‘èÀôˆFç”Ò´“û€èÙ%°ûpü9Ö‘»ûÃÐtgu5–¾=…aŒÐ̹áéÓÓÿÝž5È endstream endobj 7027 0 obj 5849 endobj 7031 0 obj [476 /XYZ 40.7999999 328.339999 0] endobj 7032 0 obj [476 /XYZ 40.7999999 474.259999 0] endobj 7033 0 obj [476 /XYZ 40.7999999 328.339999 0] endobj 7034 0 obj [476 /XYZ 40.7999999 474.259999 0] endobj 7035 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 258.259999 542.879999 274.579999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://boodebr.org/main/python/build-windows-extensions) >> >> endobj 7030 0 obj << /Type /Page /Parent 2 0 R /Contents 7036 0 R /Resources 7038 0 R /Annots 7039 0 R /MediaBox [0 0 595 842] >> endobj 7038 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7039 0 obj [ 7035 0 R ] endobj 7036 0 obj << /Length 7037 0 R /Filter /FlateDecode >> stream xœí]K¯#»qÞŸ_¡µëö»›@``æÌL€,\Ü dadŒc†¯‘‰ùûiné¨I}$«XÅ~Ù°gF-‘l²Xϯª~ú×_þëô—ž~zýåNßç?_y)ÎEWLÿ9]þûûûªá\WÓ_û¡=WæòŸÓ÷ß^~œ~¼üüòóøÿ?^Êîí‡óãÃëÓ€ÿüþ—Ÿ¦É_¦O~yý÷ñoÿwªNÿ6þëo§?þçøÇŸæñ._øíe0Ýå/ŸþRVe5Œÿ¸ÿÛåá__þãw§ŒKÞÆ½üÿïÛ¾¯Ìø”uü¸ý´|ûïýOÑdãUe7nBYVã:Ûñoÿûß/G»-ãH8”„‹ïa4ÎWÁ°òÓ#YEYž»}X®8[ïЧC…x0¸'.  NQ&õ]-“Ü—Æ›¯:ƒD<[˜@èžQsÀwŸ;^ZÊ¢-ïšýÛú ýV+΃)ºåðŸàÄÓsÚÖVÂ÷íù agˆí(g°æÅYüfõsŠ)˰²ç3É`k$ƒÍÙIú6A$„/D¼tö¼/GþØyÙÔ çª4AW¯³iµCOêOð7p´ê3zRÚ·¸ê{û«KÈñ¼­9YD˜b/({x¾f ×~R3úº[^›GdÔ@¢à“>1ð $~¼|É*8O GÃO8+˜·G¿Á×¼‚OJø$ÄHïS“«0|…O¾Ðw³G¼¶YfbzËs›Få›0óÇOdoÆÇ¡ ¼ø}æ'y(©ož”´!J*1—ÇÔ‡ƒß¯Zƒ–…è ÄR«¥«­­ï(œŸ6–›xG='‡çÁkÃ÷îgmpR•‡«â÷Ù°ÆSãyà̾œ<ßÔ;àø%<á£q|F‰©ï`{°e©Ç9L× –9˜Ûa †ß‡!)goð£÷ÁRþ¦Ä\ï~|Úxw8²J½S/ÇfçÜmÌ-wyë=wSˆèm<Žƒts M¿<ø0BHštBIvJ ^'FüŒ€°Â–«C{H œ¼B'ÏŠ³sÓpž°kõ ™gˆn´3ÀXlæ@À@Á½õ Îì‹Ì9Tü:œ'è–¡<rÐܳ8¶C€šÝÑÃÓa¾LÈÌUè”T†Œd½N|~”GVé¯s¥ Cy]¯ÅÙlÆ>±æ!$-H2˜ÇR Nà z8Nxs2œ{,Rl€£Iæð°î³ ƒ5I’f™’¾·WU5€a':‡á¢–4ÍmM™Ñu–ÐÀÉ’îYÞ‘6&d€q µØÔ'(¿¢"½}°Lä€ÃÔlØuJ—òÉŠ¸ æç–ÑYŸGKÜ]}O#ÁPQ$™¶¶EÒJ)})i÷tF™Á24†~o”­|Êåãè¹’µ'”ñæ”<Gü§¨bðØd£J[B1ûTŒ-Š‘NPç8Ævm9"@´ãካL¸q0Ï+9~œx–»@]Þ²€Ç÷.„ez]"…4»Ë`vÙÓ÷Ü?FpŽrL¹M)ƒÛ»\é‡Þ֌Ü”冫IO’˜ÍZ5ûDJ"yxY°Xd ±M¥oZ›òŠ£‘¹r˜ŒûCÐSê%¸Ó8¾©xãIŒ#b%ÊÒGkpšùù…±ISbDÊ0å‰Áq–ªRšëé{ÖAÀfWÁE¤í¡ä3«|“ V#¾yA˜yxó°'(ì¦ ½•¢,éÚÆ’%OïÓ±-.žÖ‘oÜpعf$¦Ò´7L%Œ î»”¥½µÍ´¢ê<]&w•êzø¼(ü+â:ǃ,eʉ¦˜ZñÂLþ=xÑ‚ÄTµ'(&‚·#P“Ù7ƒÅíuKø{„±}PîÅ‹¿Î¿…s‚F¶î:WN#˜¬G—'¤$t¹‹gØàaJ÷¯wæÂªA]Ç/’K¯"oM( DG¿‘7I]·Z©ZÛ2À%pq'õúÎæj¹¿¯S-qÏ",ÍÕ2b9ÚkH¨d0\û”X½m*!˜F ‡éN•*ê€6]+Éô¥è`17ã;uÌ r,ùÆ€&2r®wþ~ѳgŒKUd²Wò—`¡¤“¥z«4WbôéAG Á”æÔ<ú¯ÚÄv°ù!üxÛ<{¹yêÈåëyQUJ¥Ýs›6Fo<ûÛTÁ·ÛçÙú¤ž®è”$Ûï„S›“³xÕ ®‹÷W›‡ïƒ#[†+“{j§ÂßT°¾¯‡®·\¥Ÿs³rÍó¼ÁÏ̼Á5î•€ŸÀÑxë=£á'pGLœyà“:_¯ªèÊàiíó‰0·ÃõÇ3Ý3ÌQÖ—”;•`»<Ó-óÎó´#òÎa;Ün˼ÓÓµiÃ÷ìÉ;w¦›æÞð“óÎ÷¢2«s;aÞ¹á›î±¿E-fO?Üwïè†-Ù#%ž´#M;[–Fë?‘“F~¸^U¶×X=å# £ Æ–ãLÌ]¤’Jî.?øý0¨C´)?†uÔ¨î¬÷E-^¤„£æ” IÊ'"Sj‹*焉>÷Ø!¢çŽN Ñ-åï7½±ä k&"dºÈÑshXNK2YÀHBKÉ®à`ö#R4𠧈 Á+¡–$å&<Ÿy{ù"GO¨àÀñ)™³kõŸÒåîPveb;=F`Þ{he2¿_k¹¿åéÛŒ‡“Z†Ùäš~ª[ž…Bø; V3ìÍä† èþÙ³#y1”þ€"ùÛ+faÔW9uc-I•$z§¤T,Ò®{z Ms¡ i™]/K›£pƧïèXW #ã+“eÏI”uVê&Ø2J9PÜ÷‡~Æ^cË V!Báx‰^@,õ“À¨uéE2×”Û…'uù!¸IU¡IÞ¦ðk¦x›MIÂ;K($¹ æì`‚´Lq÷HhܺME‚–)ÈŽ¤áØX"î0WW¥,2û¸5ç¶×Ø0e³èÌŒ&?%Â)¡¢x¸ÇN’†sŸãõ…ˆˆ äÐR!ÑÓ2©`¸îÈJÆsµ!à³ͪÿ]m+&a5c›Æ»‘XÎå<êPxÖ¥Y»ñÍj}cwKÒ)"”*úöaUàs‡b5š8cmå†`{ ¾F€gDì„Òõtx”LïøíôÛ‘î^C@Rr:Ã@NééÜñ Ò³mP\‡,¶â'Q”m9ØÒUÔ#ႎpž`•&lãJ´zb¹¬ñð»!Á‰}t %Tý”g-@º/’‰_ž]‚ÃÐÄt±+ô’2­miH”NÞÄPJ¤<ä×È`eWm¥¹v¥•Kp´˜<î%J÷x7FépT~§î².ˆ$wÚ0Áóí96‚(Åo±ÈŒåÛ B¹mm>ÅY'Ž+ Ý\ ŇžÔç‚p÷U <”žÆ ã‚UÓ!Uüþ>QHð^JpN¥Üc¨x³àÖk{uðaÑ+!·RT $B!quˆ9îÓ\N7¯l®ã¿?ù,u†Si]£ª›®ÑP-‰×œß¨b±ƒðIq¥È9Dr÷_è¿©øç™~SÖçÞÚÂ÷ÎhI–íy¢È»T×Cœ wóÔ3WvÑ‹²ƒOðo 8Ï7Æô3•ÖÓëÄìA9ÑïpnlÒÃó`:x¯¤é¬ºEk»?i¯Kø¦xÕøLñÉUpßà „OÒè¬uëKØKÕ‹ÀÆg±qT"ea¼å2pñÂÑ=•¼2WSªíymÓ#E(•­ñøøÀÀÁje(¹iàÙÃ|B2™pX•ì ˆJÒc¬ÄyG,€C˜¤l—æ\€Ÿ€šÐ”*mo‰#Ta4šW.È«í»©œÁXɬIùüXxiŒùR ë²íLZü‹{ø`|œ—Sä𙎒ý§KУ× iºÐMeIl’à)Л x<ãÍ)Æì麿Ↄ{™ÓÑd«*é”Ly½u4Q1¤g>TôÖ•gIÞµ«°m‡]`Ѝ?1æQ¹ó”â‡á’˜™@kU4r•t‚U´RS™µk[øðç)%v mEŠh1¼0ôd0ÍB ÆæòÇ(’„sg—\‡„3ªóž¯ÖÛ±—ÚéöÌÁ\uûw\n[¦‚“NcœçW Í`!·mx™wGÈ!B›}+_…ºDð{BéhŽE€E_ Ï…å[ñ¦D/UXÇZ%å’ §0p%ëåFÁGOg¥„â(R‘ãVÚsí¸jçÄÁ"2=5öĺŸ!Kgy:’:‹°ðÃw¥‰®bñÉñE…±“"6¤ŠÁÔ ;Ö¡Y.äGy/ή[M(¢sî:©ó>@µrÁœ„Ð'ò«ºî2Ù¿MÇ]p?MÏf‰š;6#„3sDßí¾¾± xUæÄ:©< .qŽ;R¢äÞê2_¦œh|&.¾ ÊÚG„þõÄ5gÆ5gòD¯ÀïëÞké?¬””øâ4®¬_KÏ¡­‰¶¥ÑXš-ÃÅœoTŸílÓ¬±Õó°ñv4í(žzú7ªöpüE 0¬{D¿¸OE„ÑWôêļP Ã*§Ô´ÈÔˆLe©æ…6Ÿ>F¡á=`ÃöP,^…òTÄEè±þ»ó¸rCŠï>¡î§"” @Ðeª™Ä»ÌË?d¾’f¨pn“x'2ÕÏ÷4w&àæEo¡fN&ÓåPYãúfh[^Þ"øW?š¯Léó›b‹|2gĺYÖt´¦ ôD5UF;ëZ'Õ+ÙAÕ¤Â[q|ÉhêœH,¡ «D}¼=%ò¯žXæyóP·HÜ3Á´AÙ•»°@ðR3™´êmÝP%¯Ã圢ECR.åV" #e8rV„® Ç*%¼„žÖ E/Sç$¤”=œÁ*­"Š1&t Щm¡Ã%wåB/ú¨ì*‹t²‡°í,GIB­‘'K–eÉA‰dZ/æ]«Üö3°s‡@ò„£gƒWAšifôšÆœmáèê²åoƒÿÏ”ð%µÞÌù`»i³2XšÜ¥ º ÁO(ãáDpýJ…,ØEdYåt5Ú\d°ýš>Hö{Êz“C§K[iwãª9æ3tËE™óÛZç ŸWÑÔ·Ö“ò ý7•¿1ð7íõJ;ȦæiŠÊÜ­­ž¯Gå =;øä+c´þæýMg’¸Èö‰(ß÷à3mfxݹ~c÷—¡Dk+ðhð}ðªg½êÁùÔ_é«.fætnl$®g¯Í|—k/‡O޳x¼;Åó@JôìÎ+z2¯M‘ÑÔ]isš‰»Ž_OºCxàéUóhõ¹·wHl’ª«n)¯×°¯ïë1áazÅB|¼À€ÕÙ©Ñ^Gy‚ïl0dâCEn¥½ÙZDÉ®GÐ õâ„„ ‘É„` ušÎN@öQÊš“™Âè¯ËJÌZ±~[Ú’"ÉÏ¢ãÕHˆ9³ª2p²Ö*M•hZ×p¾øÚHŽDŒIày9‚Qu-“ÃNV§Ý16`$RuHDhÉ2‘ÂV¢Å}érS39¥.m#’*±¹œ4϶ï§ÛŒ4ƒ1Ë©|¸‹š£Ýôrكɫ¾Û=˜0ïñ¹ÈÔÊ–¾j¥»Áb>¬:¥„v á¬UÎ2³Eᩆ”ÇšÔ%Q½âVrJr0*)mîý«p®ÛÁ’r”¢^ïÀµ—€™X¡È\YY ^»ÉGcðstž6¡j¥H»¬*Æ;W(l*̦m¾YÛ…zœädJÒ]øf°QR`ŸÊ¦e°·êš1Ü:ØÇOèÉ|¢ž”ðÉgôd¶o=iàhø7}Õ\Þ¢§ÿïèü¦ºg_µ•uø5Ü,Ï–øä|=uìݵÑôaÇ;pÂj ¡>MD×*Zf°ôU‚D×½œ¢&Ù v¦¹’+L<ÉTúoûÆÑZÉ3GTQÜÀ[)˜®cBèb¸‚"8ò²˜YšÜ¹©-öìqµ§ ÙaüT8.¥ðÛæ‚áBw LE3/èÑëì¦rÂØö‘”†3¢>HJ£™LõŽDjàj¦_õçÝ3µrÁÔ¦O¢¸aIð½Å w ©Þ 6÷ãé:•Š65¾é#Ó ,çX¼ßÀËEz»Gí%eâôÛxúêþ“¿¿ü¢t‡g{³/«¬:¥ªV ÆÙCYœÀ…D2s8›:h³…)j<Ö·S­¯Õµ÷\è «À:ºóe KRÛš·JÑp¨ÊÎzyJ™N‚,QU@6À±îã£ÁÙ¶ÍI1't…OP44Emg] ¡c[;uÂ);yÊa„¸°@ðPË&«‹4ãqReãÕ ÷t¶·8?+jäãiGîÆ:uõE}œ "ÑÑ"¯¿PQFt]cˈpß ÂËgÎÅÆõbט@ œA8%ó®Å=•¿É”u´6¼v†tž]2šÈ*þ,aZä².‡òyfÕ«I¸Î:A¼V·ûŠÒªœ=mïÛOð“TNB<~ÈÓá&جžãs¹\xt‘À¨ˆ[Då:‚MÏ‹¦ÆŸ¬‹\$0þ<1­$6%Š™Pλ$Üœà̆£ÚÛ°2Lªäâ!·x¥šñ XZ¤çÚªe\tµ¶[©i‘"¢04‡nÃG‚ /R²‘ Ã‘Ê ñÅJWF¯kòÞÖØÌ7ÌÇ4åÌ–àGƒHUÄ!‹ «Š"HU•„Pí¤©¸Ã†ÇäÒ=ÈÒëÌ%)oèÍœ¥7ÿ{(ÎãÿN]ù£/Ëaú´:uݵ¥Öõ“ï/]{.K3þ£¼}«YŒÒÜÏ1~þ÷pùÙÉúußÛsŒŸŒ¿Y®äò-³Å,çøëËçßiávf-r¸¥œ7èè’|àÁ ¦Qd`ü…£´V©Eˆ/zv€ãP'l0£°¸OˆèiF.¿ÄÈŠŸ›|Òbjä"BŽNO!ŽCIz°vZG†.Zïœzà{7HšP7ýR¨›áP7ã7–×LBz!–ß¾Õ,Fiîç¸ uÓ=ꦵ…úø‰#Ô/ß2‹QÌr}¡nŠkr¼‡Á…ݨa3=>U3¢~…Ni¥Õœ+k¥Êx2tµˆl˜§x—Rú‚czã³^k“RÊsËr·WòR4dœQÃ`±û À%©+EÁMñ ¸"Mº6X[¼ØÁ›¾Ø±žÕPö–XkU#H Ôl¸L€ 3³ê©ÙW³ê,AãQ¹Iºr1sOƒ«mTY‡þ¨nñ>ùŸà6¸ç\Û\ÖýÑhð7þ ~FóŠÊhSbU6Ö)bE7"Bö ï”H"ÇP UŸ½[«Dm4Š+6RÌI«ˆ@P`€b¸º!‹X¥Ì \‚ÞC²å­Èà]Mû§73 ›¬½Œï:Ÿ)Éê©ý'›ŒöOtF%ˆÐU¬:c_çf¥¤Y‘v´RÏÚÚ>ùp_z 8 ¢g<‰ó+Š¡KTi¹ "x‡?lz2Tˆ§lÉ,[4/æL‘õµŸ]T#^/(+ F¸W³sìÎEcxê/ˆvð“'*_•ï5!Ó/žI½5û_v¥Å/8¶áz6¨Dô: *ÅH8Ș¶ZdL[?È´6xåò‰¹|«YŒÒÜÏqȘ¶|1­Âi  óö-³Å,çÈiû0'ÚÊí ‘yBdÄý‘ „¯£†éQu¨žãæÅo¡ƒ6!¨‚³GÅ ‡PjxÝÄÅW%5ñ¶Ecˈ]“JDødOHonÐ|™· ­ßèíî«0–µ~VåküÒ$Ò+=›D4åÍŠЪûb©U÷å#­º¯mwüÄѪ/ßj£4÷sÜ´êÎ<Òª»ÁžcüÄѪ/ß2‹QÌrŽ Zuß^¥ÂÕ‘íæKèjv”‹«Ú+áÖ$LQ‚:o¯Ð}&N"¢»sä§·3_O†%OÌ#žfJ›ßŒŸ8<íò­f1Js?ǧ ý#ž6töã'O»|Ë,F1Ë92ð4So•§éFuË+æï¶ó§ÅGaÜrf¥â°8¢‰£­0¦ZÁyæ³xô¤„O>ÃUÃÝa½žcÞ5ܹ¬!-² ×VÃ}kào<WPÃ=há™rv§„£áÓöP"Þ¼j|> ¼Æ>àÝ'*B®Ó‚‡E¶}o±È}™‡ àãb0ÏZÒ™Ê:‘]kßxñ¹MJ6G¼GC¤'ˆë¦À¹ ÊÕòuí€{µ/ŨÇ=¼·Æ?H©¯GJZêèoŸXvÀô­f1Js?ÇlŒÿ~R?~ÚÚsNJýô-³Å,çP·Æ÷¼¥ÔH;ànžzæSÏüz¦j«ÕƺeGU\p•1GqÁØõÿÛ{ŒÍ1×OË?¶Nô€Ð¤¼¦õørKm©êiK•±5™ñG[º|«YŒÒÜÏqÓ–ªö‘¶T5Ϋ-]¾e£˜å´¥º¼2|œbI€ù&ô|·wŽ_Øu&L&%ÞW‰>N{('w@›¦öX7ÛåàYX¹Ù0£½ÂáuN¹e!71;Šo2×T[|ˆ;É’~J\oOV Y$² ï„“éà£#jÝ´ªp 5Âèñ¸ó¨?0¢šnk³yÊEm”Ω&Å*Ù$‰àq©J¢ã Iâå™»\‰A=Ÿµ.à ü§„ÙŽ„Éá¯éª¥¿¦{7~êDž:'núV³¥¹Ÿãæ¯éäß:´Îɇ›¾e£˜åü5Ý-בyÌòþ¥¨—™½$ŽÞ€ãÖáÙ„j‹=¯ó©Œ=r¥Ó¥é5´wE[º‹ñ£˜›IÓð”LC±ÃŽñÓÚfу“À1}«YŒÒÜÏqýƒŽñÓÁž£w8¦o™Å(f9G10\8šQ'¯¨ùàpá§ïÿéûbƒOß?CÀ=}ÿŒdv„{ Åß-Ô2]µ ±„¥“\fõâàŽ÷•}Ÿw· KQ\šÎ±áRªæm°@Dá*Ug:磙ҦÉEÖïæ.›¬ÙhzbMgq{އÓFÅÅú‰´ŒÂrÀžO—s:.–ò“ýM:"—%Ϋjm–Å-µKVü®ñCq}ÓîÃw)Šušâk¬ì+<¹´¹fA˾¶XÌó uU-h¥¹a_NçŰ´á·Hò)ñÅŠ·£˜¹ÊMPý ÛÖžºÊÎW1<]¥PžNqŠœµŸrÞï8ëAè.>NKˆàr" ”HŸÃ…%JaGôÍc´*Lé"½–Â<ǵðÚ ÑÉï æ[U†éƒáxa¹œ8óÜÙ¹ãO?Æ_øò…ùï¿E…  7ý³ww½? ËÐÊñ5i½¦ì¦Î §ºh®0]ˆ®;wM[Óœ._õçþqWåþÁ“épêú|©Eø€õ´í¹›ŽÇ&ÞGó ð7þfb5}u®Š7§Æû“Ïp´é¦Ýò~wö¡G©»? —’—Lžå1”øLàÉ̹áéç—ÿ%ÎW endstream endobj 7037 0 obj 8550 endobj 7041 0 obj [477 /XYZ 33.1199999 470.419999 0] endobj 7042 0 obj [477 /XYZ 40.7999999 419.539999 0] endobj 7043 0 obj [477 /XYZ 40.7999999 364.819999 0] endobj 7044 0 obj [477 /XYZ 32.1599999 472.339999 0] endobj 7045 0 obj [477 /XYZ 40.7999999 205.459999 0] endobj 7046 0 obj [477 /XYZ 40.7999999 419.539999 0] endobj 7047 0 obj [477 /XYZ 40.7999999 364.819999 0] endobj 7048 0 obj [477 /XYZ 40.7999999 205.459999 0] endobj 7049 0 obj << /Type /Annot /Subtype /Link /Rect [346.079999 481.939999 382.560000 489.619999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 7040 0 obj << /Type /Page /Parent 2 0 R /Contents 7050 0 R /Resources 7052 0 R /Annots 7053 0 R /MediaBox [0 0 595 842] >> endobj 7052 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7053 0 obj [ 7049 0 R ] endobj 7050 0 obj << /Length 7051 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èó«)ê23v€6CCàÍf±X/âì!?R‹ÝÓMê“XÅ"¥· xÆ­Åb½?üùã?ÿþýøÃóÇÿ?ÛŸÏeQ6åôç8þýþúÝ•ž~m»ºÐýøçøùËáëñëáÃáÃðï׃jN/ÚÃÃóÓ€¿þíðÃ4ùaúäãó_‡ßþwÔÇ¿ ÿûåø÷ ?~´ã_ørèúfüå×饕î†ÿ\ÿ6>üùð·ïŽ¿ KèNãŽÿ~_ -ë&j_/¯ªÓßëWÑd„t¥*}TJë¬pü÷_‡Ÿ†Ñ.Ë(:3|£Õµ~ïÓ–u×éá÷¶²‚fjõ8•®«cß6G5¼åNäí7p¨Øª®–h\‘ŠÛš*M»À'>bLkTí0Í f.€¿uB]d>ÎFMåLì­¤TÓ.Š®/›Û3˜ÐYÕç¥×O´|‚û"€€s÷ gýÎ=7|Ä4ôÆèLg ôù»ó- Á‡ †ìõòɬ‡uxî­RÝÍÖ/ÁÀ" Zjï¾H^‘·=y‚OžášåÔºqwn:£(>•ˆÄö7ÿâyóbr±Ýa•lÕHjZD‹‹ŽáX Û’ íRcÞe m=]—îRð]^kÎ  +Þ`R0÷DÑIŽÕIJÀª*ë[Æ9·oÆ“øî…p“V­¼Ów¢;ŸÜdÄmrã †>aˆcön};X1÷N ßÁ· ®Zãû !ZÁýˆ!•˜:ËMužîÁ®4ÏzëÒÛFŒ:3^‘¨.~˜Â•ÌI°p‡hÄâ,êÑHç–H¶ç²˜bàÑ𓵵%Ä{])ñcìK ?‚oµå¸ªèÖDP᱆¢lq ·x²sà $ë•K×1Ô~3Žb¹nèá CÁº“ÌDqÆ\.S‰‡ÃÞ»øªˆØÉE¡qØÏ-AfG|ÂÈüið>“°ŽÙÌß0þ*\šãÂp.Dš­ßå\!aá–Ѥ,9!—ézWx• ái‚‡)Ii£ˆ·fÄëÖïU0ƒBZÕ‚(µ]2è]¬Kp¢•0"DN{2M8çYིA{±HW†^¸÷Ž"z¹0­f]Ê"Ge¥ŒŸ²Á¼¯$€r} “{EŽ""Yr8#[DÖ°Àò—Œ/´=0n)AŠg;®Ë¿>È×­.wdíÉcfÈd „ÄJVŠHr²ßÖµCöY‘Rxo™…³%Iö}͇#Þã ·žc}Eƒ“$2AxIcßâä‹H„$ĺÀF?s4F\Í•¯dê BE4ûM*ïÏ‘ž'©^9˜²p£ÃCø(Fm|–y8I61'«%À0½î‚ãˆ`Åd(áüPýó¤€çÕ«îµX·®œ@Œá„€‹ 9•’Êáds¯Ç=—ðN3”¤Í*¥Ôβ›æ¬]ØMŒë”åèZçÜ1嬫°Ž€tÃ'E),'ި܎$™bšÒ(‡÷Xï'SÕ™‡»h&g‰_›U`3(¡­bÐ »‰lï®`êè\®,îú’ö²PÈÊk¦éb‚É5TÞÃA$Eè…ì–˜oT™!NÁÌ^6ÀŠêŒÖ|d­å›È«ž>nÐåÝmSêSrƒ®vØÁfÅí(b¢¨xaIûóôì'ù;I½‹»$á¹å^0vC(yñîoŠ¥ç"½r•Š–M°LaÏXL!ÁɈ œ!„©3Š+XÏ2q¢\èZ¯»}][–VãIÒdå¢Ñx­"žV¸èêMLØËä-QŽ3¦"8+“³QB±p†E™àä¡K‡)#¡K—NHÄ.r•¢Av_ç,ÄXYÎíw2â  ‹0Àö°.>Dþ7%òoç ]ÄRF@—Æ!÷¿EZÊ’6îóù/8±ÄÃ?#ZŧÛZšWRµÂ Q·¸9W§Wkõ}` !+ø¸«›X_­Æû£iü\5† ¯×DR°ò†~Ï#»6 ·XãZvwpM¼ê® V´xRM3­s3 f>ˆbã¡oÎ!ç­ëkëÁ8]a^D”ÊØÍ•›O6Ë¥¬r]kñw¸nþ²?iy )’JÓfD‡(bpëŽHħZ:¾ØêÄ“‘]ºŽÉ­IÍÉ=½°OOi @/­²²§ }ïª*ßH€`—a@˜Ö«Í$+‚]ÿâ<Âý¬L$Bµ(°"º]&Î}~´œ €E¢zª"e7-²`«Î Šˆm ®›mì²`Y‚ºW-1)YG£]Þ±c%A¤zˆD­¨˜,3Ÿ†KVlÚM­DÆœÓ$´°–¨î¶Ð#Â$ Ø0Án= ôóD^Ùš¸ äì2Õ¨s'œ Ú­/ññ”î,¸Ë£« î]³°j±,¼(V—àEξ±õój|&x4ìùÆ¥…€®õê ËžëžàyðÙ?<§Ï©øÚžÓZsIƒ_ 5ø¦ã=@ú´Ê›òì»àê¹j´æ,-ˆ·IÊ[ËD‹D9å©ì*㟖(˜£2Rlû+ke5½ÇÔÉGÊ4u( .Û¬Þ””£o]–a­6~ê„âä®WÄM’¸ðPx~ëúÛ²ïDèàB?›Çö«UoÌöo™ËËFêß!¿%û…愇”!ä£6.?€*{‰W{?馶皎kúNíïÒªú­²J5ÁÙAdtˆúÉ ÔK#ð옵 ·.Ãq¿ë›-è 5é§L¼¨‡r w›ãk‘ЯŸ†DŽlø¼ªÃßu/h(^P¢ô3ô gä1q>2MÛ¤iÎ5QQ7Deú$ˆ)Bõvfu%Ga+:n{¯–OP®õ`ÉèCZö\è÷1e!V¾BlÜøißU1NõåÐVýõ¿>.Pø4¬a\‚Ãļ:ÝQ›Ùn1S³˜N9—Li—Ž_}bï]ãÞÌë¯ôÎWôtÞª=# þª¥mÑwÆÁ„'okÁ«ŠÊù®õE޶=sÂd<¡?¬¥sKðV[ÃhoسÿÎçs•¥\V‰ô.JÈ>¬UhÆ6ÔcfxüŽ%aÃÆ<ã(|â{‰†ÇçãÃÍÖ£œ1~‚!jyÁÜ;ïS‹VoíjãÜ‹tšdªÄNŒŒ›qF]~Ùæ6iuëLÅL(Eµ%ÌÖ!¾¥Ù‘á"ѹÚN›¥¿Ðo]†Ì‡+‘6Û ú@­Ð0üÎ9Îk‹n±?‰r†³ÀÃÔzå‰ì­ÌEºHdÄï'£5ŠWœ5˜NÝšfØÆË1YrŸDâWvš'ˆ@×u.øÖnØ}bÞú’îY+¸“AmÏ–*™¢Üárí»…pp)77X÷ÇŠj¾ œ2¦£ A<”P8Eô÷]9!uÛ:÷W8lYÄ«„­ú6‡_Pª«p®vž¡¹KXe_"â$=.ªŸ½{“ÿ¿WNý¹¾8­u†|Î<)ÏxÞÖîÆ;¯éKÞ;=z§²†÷¶èµãxB£Ù44Už“ã=Qg¼Ö^xe…±(èbDzù§7CÚ ¦òšÆÓf)e\ Áô±¦—Œ$l“wq*crZuÊG€ƒG¶íš¨ø•Z–˜åâN‘Á´žž(‚AÈ”È|´ÈÈ'´›ºuèÅæYdëZ8æF‰[Ü…Y×tk1Af/7ÊåCwÀ—i¥3à;¾SÂ’ 0€E5¶”3ÚºvÎwHÉ•Q:Q ˆN,ZsM–Hê‚pEõ{rAÈ0HƽäJ2è½M{KJw‘©œY¿m‚®8…–Ww 3V¤5iú}ŠÆ‹dšeÒwã&AREÊ4+];wd?r•øÈ“YÃÖÖ.Ýòî?/ðžê‡g±S7e{âÆÜ;¸ŒœÇŠùI†ºÂ\Ú(™M›£— ‰´aÀ½ÝYò˜D£ñGÝ®¼L=-ìµGqyÕ·FaYÎR,4*vƒêã~ÝÂ=Átƒ\ËA׬ ¡|‰hu$BªÓÛ¡]›Ú=Ó´îÇ€[Nù/‰\Äo¤û H‰‰õÛäÕ¾Àö¥ðb 2õr3ÙNUÏdê™ø"áúm:I’*F,+GUÒ}³AƒÔ̧)…Õ8e|$ žò Öª˜ÅsÒ’Ô݈Ù(Z®€]Sêú’[ì¾Àw`À®~­méFŒâàÛ=±Ç<|«ì=ªN¸{ý¤²xí‡òâa¸‚\A¾cq’ÛeΕÑ"Øu<(R=àMä¤>R—KjWçlv&½9éòMÜå¼u@S²¶qù@¸q›#ìøt„!‡™|ŒRgÑè9ZÞa QÀ W—éŒvwKiÇ' á«áÚð * ù\;…£U¸f.áWuÝ-Š ‰bÙJ?lU÷$Mäðnê²sPû¨<ɇ¹=í\¥iI+¬k—tE8 X„Š g†Kº¾Ÿjà 3…\YB(木6õ˜LŠNçõߥIUñwEH« 8לÊKù:L›áïd°ï2ç ± Êb5˜9À –X»¦š_•_0Dð çRvöw&jˆ!r¢V–w—YáìJó¬§ïão]z§bU_ħ͊ ï@§¢åüÊœëÞ¸—‰æì³­fœ}¾ƒçÁµ‹z8ž;<¡[sa4¼Ó×;2Uñï¯j´_Ëkk§¬ZÏrg2ÊàÉ4àÜ›6Ü„µP6¦â$¡¯ÔºX¢ jŒ'ÙÃŽd*Döh¬¼«:¡fªzE÷×mÆ")Ù”Ë*àω© Od tÛc¤ÕRúZ'.yʉ@Ic¥%TÛ[(ê„Sae™d’öŒQ›$Yã –‹ÜkîÓT¬fíÄÕWñÕ§DÅ=púÆÓ7Ò dôE –½Kéu:£ªóêöÆ'ÜÊ!œPøGˆ 6¹…yÓKóФtG§êLuKÃhpt\Šr”©¾ÝTõ¶$/‹åÛ4—Ì-èÀþÍðéh†ßDΰÂÞj}™òÅRÁÚf¦ðüN@+Žô'¡7¥‰†Ë™*ÓQ(¢¶L@Á)÷ȆÔ.­*UÚ‹“ÞH ë¢ì$ ï%Øéxo„ò¥<{½+—)O‚Ù{éí¤-R+‡¶³Ú‰6¯M!f‘êö, UËÊ ¥X´Ö ïo4§øc‡H,bˆæÊãy}¶&²DO 'dyûŒ©ÃšXÄ‘h1Uâ M­”‡Xô‹Å¢¤þLí0†$’¡¡(R.¯²–q/®ÞѨ˜Žu ð wD7y+ë! î³óz¯‡=|+òfî„8Îù GVàôUsqw3r­vØ]¤{°^™8‰i1ø$„ÃÀ îðÜí–eäÇ\–[òpçå[»–vÀ}$X³h‹2VíÅðb“”V|„$mo¨ì°ÄÉÖQ5<tOC(¸ƒH[;ÓR‡6î#§0NþhËÖ(‡¿ƒž«7Ëó£D€xÎÁ´É)…Š9桺Á sk¸wÉ´L ïýU™åáïñë@nj2~Áþøüeþø„«|%\I×â«ëù×ÍQ Û˜+Ô«fêgp¬ÊKu;[¼¸)šù–½)_ÕmÑΧïµ3O&@WU¡ûÙ8ߺ.šéÐÝÓš›§ƒïôðI¤hu¡Ë“!ïõÉmBòëO^àw­¦0³Ã÷èËõçž(´{EhïØ£ìÝ®ít"°nü]ת]=m…ÏãÆ‹Ê{GO°hJã!î`È.àÄ[Ì|î.`ì…óØÊ sïÀѬV;·6Œ]Þ]XÀ*ÿÞ൴è^êŽñÎ4OÝÕàðdamïÑ<ø 1uM‚aŒiÇuOÈ›ÛueS¨Ñbu{…¾Â=|rµ¤’œôøáð²é‹4 endstream endobj 7051 0 obj 5301 endobj 7055 0 obj [478 /XYZ 40.7999999 117.139999 0] endobj 7056 0 obj [478 /XYZ 40.7999999 117.139999 0] endobj 7057 0 obj << /Type /Annot /Subtype /Link /Rect [386.399999 319.699999 473.759999 327.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 7054 0 obj << /Type /Page /Parent 2 0 R /Contents 7058 0 R /Resources 7060 0 R /Annots 7061 0 R /MediaBox [0 0 595 842] >> endobj 7060 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7061 0 obj [ 7057 0 R ] endobj 7058 0 obj << /Length 7059 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsUDФH (É$úP H€>,úPd»-›E§ûп_Ù’l©—#’–=N€ÌÄ´(òðÜo|÷ç/ÿØÿë÷ý»_þ³ÿ6ýüðe×6­jÇ?ûÃß.?àºéøøk¯eÃÍáÏþÛ÷ÝËþe÷y÷yø÷eÇÔñÁéÇ08¿bœð÷o¿íÞ/ߟ|ùð×á·ÿíùþ/Ãÿ~Ùÿø÷áÇOÓ|‡/|ßi£¿ü:þÂ8ãzøÏåo‡Áïþö‡ýoÃôqÞÿ?ÈÞôL‹Uëx9=ÊŽ/E/ Ä…zÏÖ)pü÷Ÿ»Ÿ‡ÙNËhŒ`¬W¢o£gíùaÚ¾S{Ó«=3­3©³·È©ÖNd¸Ì3ÑaElÝÖX+zÿTëz.ÅáG µæÃï}7ýIÙzŸí8NS­œh@·LÇ1N’å8ðT9Cr6Ápxj%OS­¨A–‰+bë¶6‡g**c’¢›°Nòµ=Mµv"©3áaElÝÖfÐã©È WYeýiªµiÁòLtXQ&Ðã©­x/dk4ü=aë¦;n]ö«8Í´ˆF˜LÇ:¬ˆ­ÚÙ|öLŸ³ènü¬»½x|úº{÷ÉôÔ¯?«8*»ã¯ßwbøÏASÝþëOû?¶-ÿð§ý×_†•7jXS/ß;Ž´ü8Ò7­é†ÏÛ‹‘0ø k#ú<‰>~ ~|mõâq±âü²fåãrÐç5ãÒû¬?hÄø–óWyo¯U¢¯â]ˆÎ~ßš`|„ñã×1Ë ´œ×xF¡ 1.öù;0çx!PBRÀ§ë¬‘¿i5R¨W4ˆé‰ íܳ€0ÔØ¸">?Cá&8«¶¾'óœÚ/î!lâ™gõ¥ñÞ—°k“>.ÏvZŠGX 9³:Ï>C“ƒ¸v˸VP6)¡âeSùÝhÓªWÈãrèyïà·s O¥á4«Š¦Ÿ^Ù‹2M¯äë­F£#0ÑÙ“9¤ìA_g!YH y<’—`s²Æì°3sTq‡bÕÏzg|}¹9M;“ó Ï#ï!žÎé¾#9AcöœÆi 1%з³c8«ËÇ(\ƒ€~A)) dg‰‚0± N8ÌÆÉ9K!rWÙk”&ב1ÑipjRëÔ¸™¸´—Üi42‘øÒHq¼“³á´1‚–7#YfrïXR‚M”ƒG9H• ê„r•:AaõH]Ux3rе ‚–’WR"$(H¿º³9Çx â·ãA&ñæ§ šâ¡û®}UîîÎíxï‹«]£ÞFÉü´š…ºBúœ[ “`n‰GôãR‰ó*kál8V^Øp.-rÙŽ‘–:¢‡JC>5ãU³Îqì`úű Û¦ˆ…džxÐMJò'8΢ Ñb4¶wŽ™I~ñ\ŒÃc*÷ëPæ5ð–¬^82™K#-ap„Ñ.}-´ü¶üñ |æ|æ >= Ø_Wà9¼øžöSδnxðZŒ;xïÓwÚB¸ux?Øk„! W½Â;•k8›g§ ™¸xž¦õ¼|ÂÏég?‰ú%ªÅt–•šð3ã?Æ Èoƒû©rº=yåá™Gꬔ«0.R$UÖÙ(¸ˆ÷Óe‹ÓGÀWÈ5´‘WÞcøÖÒRðiaÞå#ƒ;½7éÔÕNÍ«ÄMc,–‚Xrbù˜÷)«ö̆±´ZLUñRϹaÎþ\o=¦å›ñWµ‘'?•,„Õ¯Ì~v}¼ñ÷5Ïö7²xËĶ’exç^¥%wäÇjT=¼×¼>ß%~H¡hX$û[zX¿!èkKo®+ã Ãú0|F@o'EëÍ«ùS´2’…A± Žáµ‘¼x6m|rwÄk<ÒÕË“Œw+h³–VÁ 8F’¨”XzV‰êáB˜ÒóæOa/ÎÊ#Ä"IûÁ|k<õ2‘$¼65=dàCf—¬z`ÕqCgž™t®âÑ{ÉÌ©r–Ë&T¹‘é`Eg–>dn ?K˜phœR%ß'¥ÔdE?£¯1}³}³ÂeT9èÑ“«ƒACi®á tÞÞŒø¼ § UI¶R¾›Ë%»ß ç" =ÕŽñMUÛH£â¢vÕÃðîç͘y Kß#)C0"„’¦µÕ¡g5§¹ LM×¥œ”BóP>G\Ã<€P¶ç¡ J S`I)êͺj¼JX”0õ̆W@€A‡W *Ò³îƒñà?v¦T*ÛÆ|¹Ã\ˆ‚±¸€ƒzÁzg?” ÌÕ‹/±ëŒ´Ÿ¬a.Y1É kO©WV8Á„Àb˜1eàJ9…£ô¹›NqIÃØ7££cÍê6Ë:±´—õŠüeÇ‹¦b–ƒtý© PŽ0HBÛé;ó½ç鈛Ќ w~Æ.è¬&‹¶:,K½œ1 û=fR(Ÿ„¢—l (µ·ˆ¦sy+÷„öÄ\­ƒ]ïn|Gûëwò,鯖ã—B ë§.Qq'¤ÙZøv°Û–5áÐËÔ-b‰j(í`sÄQ<Ó×¹øeM÷mOÛ[¨ EÜQGá² œ$É=*‚OèÛpSñr.Mh½^ç¹MEÔ{£m¡q­ˆz­kÁ¤`sE˪kÁ*çw¥@2áâЄ Epƒ“;Ù)2î.T®:Y”ëŽ"Øk™Ûš3öF*k w¦³¹!Ìá ÐÂJ’­ÖEB¢Ý YoΉnñfèÙ‡´´m¤¥ î¼\±;¬ç0üMöÚôø#aЀœó¬‡…p’NÖÊÄŠ=0¥<…“7ÑSÊS`éÍÉâkc‚¸í.½ÎQ_T¸{î[§º€{E±ð­ë[3š”±—þÖøtA¼`JZЕ߇A“p=·ç 6ìÝr¼0e.ÙŠ·—<œw’÷Ü¡„vÏ„PÇæâñEcÎMÚ ¦t‚YŒwO¸ªÞCjkÂÒ <ŒPÝ—'ø¾{…ÅDº‚»L~S‚ã8!žâeVÑg¦”¨(…æM+'Jk R÷lãkÜ1Î^1Öp ö 4ã'Q0e AeÑÛRaÄ1Ö6ªg‘‰`$Î@äÑ${oQ¾ûŒÒžxň×lÂëöŒ×ôPŠ÷ÒœÒ.þμ‡ ­šBóP—õêDäe Eù{âß·¦tTÔ01…`Ó¦hÈ+šúU¨Ž<ïm©jdw<ãójjõ1*Rdì0¥j‚+ZƒÌ)Íÿ7– w‹UÖjj¶tÆtu±á›qí¤™F¤ÍÂò%¥ÿPÎpIMŸ½ásB§´áÆüã¶¼(×`|‡¶¬§…/ÁwB±ÚIûÙ>ý¦á¶¦q{í¬M„ßÎõ$m­ª;£-‚‰ ¹æ±(¥ˆ«H‹ÊUePkZ2å°‹°—%E_ ï“’jãˆð„x,î„l RÓ8 µù)U SCI9Ïb‹¶¥3xB¨•µ7c ¤)Ýÿµ×õ˜Vht– ÛoUÙ#…¶AD¹È?õOäkMø=Y¯“¡\+GŠê`Œr 8žŠÿ–´~·0 {IJ‹;¬(l±ùYs¼íá./©-ˆø¦³?ÁC™RÝ¿á°IÞ,cÈ \16TŠ3¾Ù,=gSQn<,ioGÖHtc\Xgskq&¦¸µ1b8oFÚ r ‡A#%7ÈôÃl!OuHzŒ¬d£’ÖÆùêõJo&SÄ)ÁÀàsÔJô„[îMH$Ü·ƒµòøýݧŽéŸW;JÑ%¯îÈJHgsïÿjÄm5kîPpÌ¢K‚ƒÕ e·G<ö·fÉOP4²öò%4²\ÅJ@‹°Ë9åîè¬ÍAW]~Î 6ΣâƒMÐn)ư÷Jvà{•^ “«e²8 L8Ì„œ3‡zâ lRÌZ­5¯›ŠßKeáÏ­Ù½6ÄËî”H|á²­,íØ²d†† ìáµÞŒ×:=·¨mÎ:Û ¾!ƒ%_¿ÍÝš%ñ‰ÛJýzg¦9®q5-Œ´óÖziž9'¬9ÏôÌD]¬kƆԎ¾°0ÛtB¬mFO÷ň™¤³5– #T3e{9˜ö<\”|D#ø=S¢n·`ßsîîŒ|œu@ÍO¡‚‹ÌHg™vcóî=¤^üÌŒz-³b)x¤–ÿ›bÒ&xñâËW«*) -RJÇš"ß,ghª¹Ž±í“Ðé2¨”ávÌ™û§'h>kH5koowú;®ë†Ü]‹½{¨5ØY7%å"KD¢l"Áñp2Ç}¶¢·ìšÌƒðšÐ|î·(üÉ 9+— {£¸´y.®‡eÞn„" O9|ñû•zÃ-x Ó.{.ºµUwŒ!¼<íæ²Õ«!HêNÛÆ‡S4¦ëö¶¤¸ï° ³@…ûzºRºBâB?BÏ{xit3}B·{½µµD[ûòN ÆDpgÛl?üÝ¿ û¶wøÂôãÛ÷¤[¸..øúì…¥÷Ѱ[TíÙ°¥ÃÔX~²?TL˜vªQËzŠ´ïyßôË™ýÂȈ÷]×p³ØoSÊF‡péá{4|ÆÀgF5§ç oÞI›.Í6ÒÕå'Ïð»“=¿°ÃOè™Im\ahE¤=3XÊÞ§µ `Ö~çò|k甤ûÏ»ÿT¸ª† endstream endobj 7059 0 obj 4217 endobj 7063 0 obj [479 /XYZ 40.7999999 619.220000 0] endobj 7064 0 obj [479 /XYZ 40.7999999 619.220000 0] endobj 7065 0 obj << /Type /Annot /Subtype /Link /Rect [253.919999 653.779999 295.199999 661.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 7062 0 obj << /Type /Page /Parent 2 0 R /Contents 7066 0 R /Resources 7068 0 R /Annots 7069 0 R /MediaBox [0 0 595 842] >> endobj 7068 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7069 0 obj [ 7065 0 R ] endobj 7066 0 obj << /Length 7067 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ERO 0Ûr`Ø@‹o6Áb½ˆ³‡üý¨GRO›ìd‹”z¦m`íµFÉz¿ßüùÓ?ŽÿúýøæñÓŽ_–??êªîêù×ñôû‡ËÐCeôü×~h+=ž~¿|=|;~;|<|œþûí º§—?¦‡ë'æÿòÛáÍüñÃü/Ÿÿ:ýíG}üËô¿üûôÇOËz§øzÆîô—_ç¿(­ô0ýÏåßNÿ}øÛŽ¿M[žÖ=ý÷‡v¨G£tÒ>¾_UO¿/_E›nHwªkŽJéiŸítÿýçáçiµó6ª±Qªïš¾Ž^µ×ë²cßU¯œE³E.•º1B =ÝYÚÑTÝôþ¥ØWßË1I=èy©Ô…ú ·D:íH¥m½z¼T54F™^·Í '´Ã §¿÷fùE9z×ÏGWMò-®K¥.4 µ\§©´£­àÀK‰‚clƧ£÷.³#ž}])õûZ QÙiG*éd+0àJ’°èUÓÉÀâ¼R2,´V2 v$ ¼’(,¦ßB°XWJ¾BÓȰ»§ÉÀ®$ ‹fúéÓÁÛ>õäëJÉWØ BÌî´#•t²p%®æÔ·M-DëJÉ×Õ©Vf¡ÓŽdhÀ^飈5£Ÿ­™ožß~>¼ù 3œŒ·Ï?Oy²ç?>O‡m?œÔê±?~þéøÇºV:~þå0Víhúv6—'=|ÒÁ'oÑ“z„ï Œï4èISÃw4}5 wPÃÛÑ-Ü›b¼cà“yoï?O–_ôéé‹Äõ>Á;xŸp°ïÄ ¼ÆŒc\ÆØ÷Pû&­!aˆã†=Æx‹xo†±õ#|±¯Æ´É  ï̓}p× ¾HgÓÞüÞ›‚XÎáœ]c¾Ñàw0ßÀw€¡Í¹k·óà\ÍÃ9<ßäf,ÈíF½~Cž»ÆT o¾ÆO 1ò|‡¡qôÎw æë ž'X£dì ë®VcRwŒÝÑIY{ƒ8æÑ7°DÅ;€ºf ¥°gÚð<´ u®rFŠ¡õA¬×CjĘèÁ ø|;rüiÌ©©gæÔµëffÔªa¬'›âò³z<Øgm+£õýÎphl쫘UÏ«.ÎÅ?ÌHªtÕ\G„®Òj°®Ôذw„WUp¯ú}øXÎ À½:öÜ+á{316ëñæ2D/’ò=Â)”ƒs8¼µžÂÙþQ|øg÷Î÷œk´_ñ« 2‘.^b? O%ãÙ€¡oͽ-¸üâ5¼¶|¢?\?NNa2hKšxŽ4Ú§·ÿ£ˆ˜uBþëb<_PÄþQQz®1žAÄ5‡—bL¤0›#lyX§ž;¥ª¶éNX—ÄäR(æ&`)ÔÆ Ž\qéˆZ®ÅçuåN8Oð=„½ËÞKrôJ{FGË&pB:bF3ªÑ8¬}bÆźk $A˜åѹ2º¦é`Ö=Ì'»fšÎœPµë…=?y€õ2ç”{ÂXÆ`Θ°TQÉ۬×å7ñ–'Gm&È‚®àQà <ëÏ[qg‰ «ºêz !Œ–ñÒÝÕxdU’–”‘Û™^YìÎã‡zŸ“ž8ö·Ý5l)Ì;ÂÝ]KÚ”®fîÈt ÞÉ/¹UùÕ˜F­É„æ1. QÓ¼—œì‚°ôˆ¶[ðñÅ»…vx[¼ª1žï…î$o¼\›Î¢˜ÂÁâŒÌ@u6 \$âBû‘˜{GQ¨© ƒ CÆß‹Ç“äoôøÀÅõöbÔÄâ:^¿e)óÎNp·‘–c:³ÌCçÃŽU@ˆ³rÜ G ~’ÂA~̽šÛ™³Ó”Ž–¶8E;˜þ”‘ŸH, S]W¿M+ØÎÑò¶ô‰÷co]EqÅäËàý^&òýþ\-ˆ£!Øâ—`çPø!'K fÛb¶{üMf-æè»öû`°:_[/às0$‚«á•š,GÅÁ€3ƒ¡C 6œpˆ'§Ý[FæÉ3õÌY–"2!~Ó.cÎÈÏYÀÑŽ%óè2G6€e€ "­Yr~㬎KjWNí½ŠcŠ ·– Ø…àÚ*æ¯/½Úd‰FŠÉ²Ú™+Ï×­ÜÆm§[{º´¾:öë¡m‡Ëøõð)[ÉÓ,Hf2“žgçïÄ'Á»úˆhŽG¹TÞ Ûߢ>SÚ….ªL;¾$BZ8+Œ&’±”b­ãï…ßå˜ÑŒBŸ$ÂM ’> e¶kO'äŒ9ÎÒÍ“1E;œâ™ü5£²¥ÉþJ–^ Òg™JáÖ~âH8`Fpiǃ LV¢8“­ávb\„r¥Ý)–$’Ñ—rœ¼e/%VEÜ]9«@I[ÅûÊYwðª4ó6¯99lxzÈ‚à„¯p%h?²Yö/.•°,borÜÁ £5¾ ‰#„ÂâÇ•<ãðª"8îÜÍfµH ¢Æ•é­©T2o5ŸžGŸ“c7ƒÅ²K7ëÈ”ŸPØÍ—9œÎ1XZûÅdò‡‹q7Ë,Sìé{à1»(&É(SL`O VTM „º=h"¦žG5^üÏÉü­î¿¿ý±zÚÉ•]yR¯è[û ãÝÀwFôŽz–жT‹V[:¦¶•¶S©ºš\ŒcKæ$~g½ÜZYWˆŸDH;BÂEÞïýµdØIŠ3,¾AZDʘ„ùšâàr$HÄ2)"ô˜›µŸ,*/Œ{\Eöl–™B0 2ør&p¨Ö’&C%èócÕÇwS¡Ô[ãŽN_ɲ”Üm=R¢ÈYŠÅY…c"¾ |k¶  4H¸`?+™b£ €¥Žé²ß€¿–ÐHPÖw+AŸ¶±-N”33+yu¤–îE:êwÏ-5po8­ÂÓ:OúÁ=Éñ”μ%øŽ†ïxJ0ñànò¡ó”p»öõóLžÐè gš§'¿g>~‚§é0¦7¸Ú}΂8Lñ®9<€SR'ráéZŒI?wÜáᎬÌñÀÏé)8×¦ë› eÈÎŽñÐ&æƒø¸Œ±w~+M3þ´g`'´9šÝЦûx0exø%¤Ú׎Iè^ßôߣÑ×6Åm® Ùo‡p`@¢3û k"%ÓÐK4ŽÚ²M6¯©Á­¾u?ÍBcVDrŽ qOV;òœ©°Yþô–€ðDâ#w” ÛFµ†)Aô<ƒôŒSHÌ)‰•ðz—ôµ… ×t+Æά]–Ÿk¸Ð¾béåwòŒ/§,Å¢ø‚-"Ù«7ákïܤWÝ3±ãÃÿcðÄ{¼ÎŒz<ŸÞ›gMAz6C6…éùõÐÙæÞTŒc-¤ Ï`?ÃåÁìMåH{ mÓËYŽ‚±ª(whÏvÉ;s‡=ûsK`_Àg:*µ &ýfj”"’~–y(ÂËéANšÅß-œXXÈ¡”btoÕ«¾iÐ"ê!¤(§iŒóöOØÿ¾Å”ôŒÌˆ¼î®=y%)ºž6H9GsrTÕÛ,õžy É~á(f"‰e„œf Œ&’׸—uظ©ÊiõVfžh("e¼<%Œí0»Ô”R¶©Ç¹µÅ@iƒœÃ>òödy9Ãiô˜³É ÍÍ],/T‘(=QfQª ˜Õºƒ›"ø‰dOñѯœØ„DåBDÁ3ã|¬¼9‰bedÿeÄ]]wòî&ªHÐu<Ñ[‘Ž›)Áa¸² ~=“3H.œÊ[ç`’¨.Ä1˜^}´s?&£l.©Hra{¾`ÑW¯úÒ}8÷\ôÅ™ów½m_¬Ø«ñ«àp1.3Á….ž¢øŽç .tÁ“™0ŽahaçÈ;Ìoøèv­ô4p6§G©ÇŒ’>¤“ÛŸ'¯Ž è<ëIÂ,sáI¡;ŒŽýžøÓ-+]Û€¥TijOa¯ñ!Â`#Bžœ¼½UsߺM„ç60×wŠ9C•ñø]zCÈ»WD°ï^»WàîD—3ÙßÎ J çDôQ˜ú\£z÷Qgï> £×ì~·é`xðjœ'xFg×gkßôçÑÐÚw=#ãO$¿W´tB&^î,›}IØt°"gk¥þ2Å*ŒP3¡h%¬´q<.ñfkþ[‚÷ÍMÜ •A4„ïîÆ¦J¨hÊÚœÃØœÛÁ‡ø4«¤$A/Úª¶ánP‰T¥ë])¨•×e| öÖæ¾ãbÅn:§£ÕUÙJ¤+¼àÛ'¨fQœ±5vn°GÚJÖ‡a¼Á32Ôj§9Rð“Û–D"Ý_h‚ß-¤e§D¡£=øy}+ƒ³‰ÚuUw=‰dl*`±ë¾êíû/­¿òd¾yc*=^-klÛª›!iÃäÚwøÎß™å@¯+]›Ó£ç'oáj3\þË;ø³ í\9áôÎ"ò¯=Qè · ½³@ŒröeoO€u§¿ëVõAh+ SŒw> endobj 7075 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7076 0 obj [ ] endobj 7073 0 obj << /Length 7074 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWèÀ4ûA² üš9x€‚o6Á"^d²‡üýP"©ÑtëëGuu‹Ë½*ŽÏ_EM+$‡ÞLCrú§›–ã¿ÿØý<µvF3j!†^mt«ƒ<4;tí~ú½’ÊiÔ™[\S"³!ÓN?8:ŽHäMM´zð7E]úé¿fž¦Ð¹+vj*·!¥OC‡‰¼©-Kïiª1Z 5ÈN¶á°1rú}PËŸ”©›…ê:™½Š†‡€M7Í€g_§‰¼©­Û›bÝŽ^ŒÇ©.Ø%Î}m){ûQ354HdÍlÝ Øë^LèvœøØåÎ|m){ MÇ„x‡‰¬™­{["KˆQ/«5¶¹Ó<5•ÙÐ(¸ é0"‘7µuå¦Y7ù¢¸={^üø´{ÿ0”Ô§Ÿ§a5ÝùÇÓ÷ÝÔ뻃ö6AÇÓOûßOênÿ‡ýÓ/ÇÑÍÈùƒnR‡ÝQW^¾úéøD¿| ç­&}¤=ûª¬V[yü`hÚqþ.nUŒÖ»b@ÝÜ*žŸ½íôU!ŽO„\ÛÇÓÑö×Áy}´WNÔùªVö»öˆä{žx Úúªú gƒ÷Â&á,4@|«Ë<¿Ø‹DwSœœŸ¿!›™ÄãÈ1^xà‰;ÓKiÕ™–³pc¨Q´öº1QÄo°» ö‡gQ+aC=ÍE¼»9ñÜÇC$ðE”@}ol ¿êîÊÁw凙DÓéþ@$%ЦUwÛãï(-œ€©šî jiÄÐ0ýa¸`Ñ‹!:$pœ£V:”!5jCE¼³ ÖdÔ Fc3ôÝkMÆ]q<y±•üŠG”Ñ[†Ä㿇¾_JÏq=¿ª°ÐvùÒY ŠêI.‡A€/¡U‚¨ñ  ÃA]K/c½àÊS ‡f<[¨éÙ8Ahe3 ‹I¨uþ‹2ß9=¢'‹ ¼ôkk¢‡O4z‚ç³[ª¬¯iåk®¼0žiÓf÷¶ö ®<Þ- [ƒýà¦ì–„T±07Ó|<#€»°ì\z‘b)¤ÏŠÀ½§Ì[á|L¢áð;¼k T™RÖZÀÖl̓5N‡ÇƒŸx(¢ˆ­ðná~°ÔÁë )i\KØõ)©×^?Wìu*K较ŸÜ¥ú-Kõñðt+’†¡(Rw 6Åg¶.ÕGÕýpR]À}Äxé9cûœ~6ÆH*àÔB_…5nVNÇ|&Aç'ðfMmhìÖHÆšÚÐ8Ê"{G’TXÞC*õÐ|%*½ÑS&DÊSì‚÷³q)jZ!‚ãá}r£’öƒODª¨‡Ò¦=9“*¢´iõ餌­ÜlãñûÓŒhÕë…¿àºõ¸Aâ=§9a† É›…¢Z9ÝÍž!<á®§·lpXD"&Gü$,w¾ÁÖ=îpöÁoŽ78%ˆ<Áe¼½œ³„8O–D‰œô‹2ùC%"2KŠƒéèðZP¢ Ü„‚ýz‘‚Á¥?pÀCNþ@Xx•)Æ€YÜ©"àˆ'9žƒ’Ýnâãó"v  rbŒcM>»qT)™cV2¨°5¶D ¤wzê58:n> 1Ýî`kFÚ iѰ Š×mk¥N³Zí$<):”$b Ç&Ї.^i ÚäiJ¼,@Q]ËÃÔœV{ŽíB°)vôPÔiAøSZY3(cÒ*)ù&)*0&;BÒJD¤= ) ä*9‰h„/]#.9€9'x/5ëgÞìÅë)NHѶ¯·PÂ'íŠÞË®; –ôާŸö#VÁ?ËpgúF÷çüÉL<¦Ñ g]P#ìÖZøî·æÁì‡ÍïRWG³†žÌkí¦dÍyì=Vdœ–°æ™’FG0P»«FÈÙJтʸ*È(LI b(ìZ!Ô¾J9æÃˆn7 «B©‚i!Ãz]§ÌRIl׃î.©&”)qô[–4jSD0“¤¦—°¢)N€cŠß5ËñÀZœÁ“›L)‡_&ùî—²Åv•ÙŽ„à9Ž…C¸<¡’„ =ƒšqàežPIBè~Í`@9D¬"!8Ý0Ã=q0 o^yBÀ)Ã'µß©@(•ôVt<ƒ­ê­lõÌ91<9V)ÇžxËÉVïÔ?ÃÇ,8芅!ŒkN® <ñ`1!pXR$–G8ؘ’Ì(Ûâ þ K^O2›o9‚–•Þ -ã}ÄÔÇKÿ’@c55aÝ©[Ø-œȺ[ó#N;•wk•w˃«8I¾Rª/ßS´Z^Z®6‚ššÍ(2xKbiK(Þ !ý±8m˜gðL+b~'r°"ˆ"åON]º7î&oNJ9Ta+#ÁþHñFTª us„Œ##âÜžàÂá¬d™R)8£ÒtV@B…|ìÕHè<ßI (¢„a…ËÀ'±ÝZ>Ô*Û^DÃÕý¸¤€q6yH†n/¬&E&°x ƒ ãŽ9¡±2X¹:¨”Õi¥=/G¢’7°*»Ï{žÍíøž‹$É…òÁ¢ÃëeCP¤`.ùŸÀqœ¥%ê\¶FCÂ)¯¦Ë¬ïî¦Ð3(e“y+?¬&=O-:‚Á~Ë®5æº\” #l&Ôg£„—xܲÇ0¢Â•)‚ŸÀ~°¡›v=cÃè€Ë˜7Ì% ª–?¼r—¨}á솮Ö+c—eãÕ¯¡¿É„²7 %˜yI.† “bÍu÷1¡Õ„ˆµÛmÂß^>PѤc¡;ɹ>˜§»3Þê”5ã Y©8‚:qÁ Šq(Áø•b0¹'jn%ÏíÍŠ^×X²ß«-”&fâ¥ÉMê¶áÝÍpñg)½6RŒÝž2HùÜøÜ–’YQ+jÐu? *BЧ§r©®,,^]t¼RnÁ,V¹u×,¯]“­¼,’£Ãµ¶#qT`b­¦”’.ÆpØÛŠï¾¬7G÷Mâ¬Wl&Æ1ÕØè\<@£[j¡žÍ-Aš`V!·<Ž\›#R¢î%¶}×·N7]ÞýÓ´4•­‚NxïÍéÊ»—ÓG—7àå¬C/Š!ý»ü™Óœª'`’bdQ•-Œ_!ÀŽåô¾¹¹0æÍ8[ËZ 6X\.E¦T¸Î¨[ÌS¦¸LmŽÈMÊÁ"£8{Oí‹D ‘/« Š/sÆwhž%á(OU°ÒA(‚ ,é/1ÖÔîÙp`x«ÎÚêrƒõZû=Τp9ýx§]س”'Jº|ð‡Ím-)Ò”²ñ¯ˆœT(5>ûåZvwϦRê¤føˆÊ.ÉÛ€¥¬âœ P·ã.Doá¾ Úc…ÄìàϽà„l‘Œb¤%•O!/kŸEû´wÔ…Lë‡âÅV¥„°Ä»Oh>¡qX}B·YvZA_‚ÇŽŽÁ›(=Ž}p<Ÿö^…žÔ˜ÝØž ËRf÷ÃI¸K­Õ+O=¶§Ò©$Z¬äËõ”PÄ# aßð“{oqé`ÜÎíÅ´ŒßÁE±–b¬„ÜD)׊ÑÁ³¸ˆ;ÎoÆ­áÕ¡ËÆøßUD”Sy_ •{´³Ä ÙõnÂtI(¾ü?•÷e–ÖwÉZùS™Ú·¨ŠSÁ×ë_{1Š— }s—¢[Oe6ÛG®r²‘Ö\6•7P¸;øœ wáº7œ,qé¶,ß´;›ç3."'E|$4²™¨'æ ATSŽK½7ãSsFæú«âkzPª»S<½µëհ܃EriS’P¡vUŽ…µì -ŒÄFP¬óáã~2ü—tŸI[®à²“½Ýg²{ªðÁ@+k„ØPá1E•w¸`÷Î|‚*Q ·*Ä+Q™š¬¡éÁâXáLÑÙ*§=d9pÃö• ŒÂœ"ð/Р€kÜ/zéQ¤À^ÊA.§\! Ý¥¿:É ž '¨¯ló ):›X$ ±aìÒ$³pHjI»\ñ2?Œqeƒ¦¶2ˆI)p7£®eÆw·>Ð…OêoÂsµË ÒeF¯™A‰1¦6¤©Ê¤×­ÈéR/Î¥Å$é àê7ñ`` Rg1Eh×P¾à¢€‹=e]1_;1ê/'\ä˜sо»çˆòÓßýóçZÚ\~|ûîÁwW0´/‚áÑ+¼¯eŠé÷bšù©¢FÑÏõ8÷ªµnKíû¦¿ ë£n€m\Íp¹~ÃpáɼJ5r´Ptaå®égj°™àR?¾3Âwf0d#[uxôòä#lm¦›óO>Ãï.üpa†è…È.=h 綠³ìXÊÜÏ ƒê¿ËN ÁÝxO1`ÚYè@8ï,•lúÖ¥xH;xe=´)e©ds‰0õÂ~–x­KïÀÖì¾46L]/x¨Êå<–ñ¥4„wæ~:Ó¨ÙñÄ3¶ÔÞC¼‚KÝ¥¤'x1v,k.çÓö8Æ|ͳðøäÌ&üÈ)I÷»ÿ‹µ— endstream endobj 7074 0 obj 3896 endobj 7078 0 obj [481 /XYZ 40.7999999 217.939999 0] endobj 7079 0 obj [481 /XYZ 40.7999999 217.939999 0] endobj 7077 0 obj << /Type /Page /Parent 2 0 R /Contents 7080 0 R /Resources 7082 0 R /Annots 7083 0 R /MediaBox [0 0 595 842] >> endobj 7082 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7083 0 obj [ ] endobj 7080 0 obj << /Length 7081 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ER¤( X`<ž C€ ääxw,âE&{ÈßÔ’º{H}¤X|H=nðŒ›ÍR±¬bU±ôáOŸÿqüçïÇŸÿsü:ý|ü|¨«ZÕãŸãð÷‡ë¸®mµ¬x7ü9~ývx=¾^/ý¿¯¦N§ýàüˆàï_;|~?ùüø—þ·ÿùñÏýÿ~=þíïýŸ&xþt§†_þ=þÂ8ãºÿÏõoÃà¿ýÃñ·}‚;üûƒÔBH¥£ðx=Oe§¿×SÑÃz ñŽuêÈïñ”=9þûóá—ÚªkkUÓÖ«¡¶|ËUsìZuì¤ÓZÚ:H,:  #µ2V7­R¥ÁDËe3ð` ¿Ôš÷¿·bú€oSwãÂY»ô3¨X@’ó4€ŒXÜÒfn`PIÙ!»qé­­n¡DìQ©6[{ŒXÔÊff@Hä-©mÙ¸È6z™gP±€úµ¤4`Äâ–6SƒJª]'©Á )’ˆ¢®U" 1`”F $¢ˆz°õ)è~MwÖ[À4€?&Ýꀨy£ÒXæ+P±€„LbâGŒ’Xf(²4r´¼wÎ#:ƒŠ¦˜j‘~ÀˆÅ-m&½ê%Éá…_/¯Ž‰¿>hªfüæå«G._}<}ðô¥'Jž%öa,ñÙDW°ÚüÆ£6&S-ÑÚY>b?ؤ5f Óæ*0ÍÇ`ZIJæÚÔQgÚxîzŒâ·y‹õ¬[M#ÆF–óìXàM\›WY ®—×s-Bc ` 8ç =K0ZO-¿˜`uÀ Åb‰çÀ…6Òþcî]iÞx›fFó!ÃäTŒ’`™ÁD†¤´u oÁ2°PŒ‰%£ë ™ƒÒP}lð˜œÅDÂì‚ÐlãqD¶|Ò˜)x„²ÿ­§pŒÉsX‹ç°ÌÖq+ñ°‰„#@VØÒ;‡Án¢-\N£ÑhÓj¯ÿk‘ņn1Êr},zl”Ií>·Éî;¶´fB­Ò]­ÜTt `©\…0)ï]¬&/Þ¿ÝGYZ¼àU€‡À‹•"ìhÍSª]‚5B£3¯÷‰®}‹OWI`U—FÑÿGºðçL›ËÒˆ„О±ÆÏÉÜ}?OÄ0ê[wÒ‘ò„¤‚‚‡#Óvº4ò¾Á#p¥¢+Èa!ç§~Êç€)t7³4ós{>"â‹X!9†\Û[Ž9'˜ßð䛎t’ÎEëOL±¬¨˜+¬ÑAF¼û´Þ[zÇ>QÓð·z»d{#ïB,&ÅþÂç`ûëð£ íšöó¥‘çpÜjè¤õþÄz:b•‘>Å KŸƒ[V¥yჅ³e¢=IêXù~o›¥Yyÿ‚ÃZÙ#}o}9GË ëA‰Ô“DÑ’ð¥„4DŠ I µ©âât7–eNЛaØŒšç8¨«®3”oÛ¢4ØÅ‚kO–Ëáe$Õ¡ÕD7·ô_x~0…Z7'Z ÓœdÞ'Öß™¥ÜÉ 1'þ‹¬8 ¾cåq “øê¶±òîlŽÊXõƒÅ3û"»Ë5ž×[v¾¹Õ!ŽrŸ=„ê;°?_˜7 `+ëúí|óÂ<·¬mÃ_b⫫Ȩ|:\tƒ²±g€`½3ÄÇ@,mŠ8ûL7>öʈcã]Oq 0wµrD#K:î¡CÛúÌåhVUä¶'Éù£Åb@)b’fWëÝÚÌ‘fR½vŒqËßy±iLS‚«ò1Öûð!õˆyÒ0Û_‚÷–HÈLâ}ÂZ¬>«•óMìø‡¸1e–·X“9¸w/ÌÔ4f'™L¸_Ü¥ D V$)Í"[!÷μ§BJT6êB£o9 Χ½Xœ[JyK©ï=ôhг0ò EŠ^£Iº mÝÆ< ‰ðݘSŽÑònï¯ ×u󟰚ÉÍ›2 \§+~)õ©›2j.¼ølß`߃(ÙÞPŸh•ho¸]ß´>½Ç&§úÜV‡¢O¥v\5_R~;¦ ê“'üÕ¯'ŠÇÕö¥Þ…¿[ºçJ’<Î-…¨SÖkæUY.;CMò¦¹2ŸÂm,v„£JÀ›BjvÞnÁ!¢iMy [óŒ2$Zµ,C9Ÿ©M“r?41úŒú{ëZûî®}‹¡7Qaníù w¡ÜmOöÎßë~‡•ï”öQ¿6ã«71¼ø-oòß•`Â’‡,©¯÷‘¯Ùü¼SŠ6û{ܶ‡a©fDà%§#ÙtËêœó™R˜Ï,Ýy5sáGép•èaÄh•Ý÷hÌgúà¥[u§’çN?Žÿ’ô·Ô:2¢*…VY¢§_ÚW3îÜù‹ÍËøï9˦…e{àU¹¨‹†ëwï’¡vé^Z*3µåò@ýº/©—Bù/¾yG8 û}ažpœ±Å_¦oŸýØ(µø518@¡M}²Ã$1i5©O<‚¡aŠ‚§¤€+Ä`’ƒüA7~‰L?B+EÈF\*åyÍËŽã>;ŒÃìíøºÝiè¶+KË\^Íô"|Úô{Ô„ ÜiO82¸¯3,ÄûhŽsÁ%àÖBHÝ;Tɨ7ê·þ·] °žkïýE9™ßõœµ³Ò~Þ2v¿¼´ o³¾—ó^ï’–[çVsÛsË[‡4ó$­Tp‚ôÝG ŽP^€¥ kñ†ÂUX;v!¤#\¯Áëq„~±c#hVÚ-ìùZ’ƒ¢8‘B¡(¼ÚâxU¾ƒ1ÀÐJ LöP\Ýë?I:s¹ñ‘2z&JWÅ;^­v÷!ï#w¿Ó7ÛJ¢ûOX·)Þ öà/TLŒÁ-û ¬Do"ºåk“£‰èæ«8õ™ìõøgaã4Gê9LÖJs„0‡k8§Cs¦,Õ˜S¿‚6>‡ÕÕ\\3‚Ÿ3±JW 7žÃæL7‹UGë™âm%Ì )™Þ&º„A™Ûï¢n«½ µ b–öšäÀ#!™JJËMÊ%ì$Õ§”²ƒ€”NG TW´([¨Êá;¢²vkÿ~OÒ˜äå"”úpüBj\8ŽO²˜Š©(O“QmðJI7ç½4Rð"‡<7È£PQÂú€;}'ú*AßRÍ)±GtŒPâØS`t óž-í5-ÇeJCFJÞqò¯c¤O`)§Äs —ŠÒ^Ïñf|í}wùßüÇ5Ý^þ •˜'k¼Rüœ»üï_þÕ¹a,EþwÍGœíÄÜ"ìåÅ|@m'’$ÚIÚ' OÚŽ+Æ J%Ï\”r®ƒY×Bºÿ{|íܾ0ýøú͉½„ú²„ç"œSýù]udý2–z4uLUc¦P\B9#C”ªÔrŽ¡kª‘2W#ãFÁÛª5cÆ£èµ #ã1]ˆŠw‹We¤¬Ô¦¼Œ´ð9ÎéàœQ\[^ñZ C¦K°mÜ®¯?ù¿;e´VøŒæLÑ쥆Ö1uÃæL Yû„ÛI"¤nøËË‹Ã!·æ)–,;“0ki¡j[â¡ì`Ê:dJ ûuK/|Îr]š¡MÙ×%ܰtYºà*[o0.-ÒË©þ#lÎø©ç‚‰#ÜžÑs01¹ Á4Æ{Ç”“Õ\­kU±¡œã­ 3¬Âp䪽ÆKJKz|9ücƧ endstream endobj 7081 0 obj 3392 endobj 7085 0 obj [482 /XYZ 40.7999999 383.059999 0] endobj 7086 0 obj [482 /XYZ 40.7999999 383.059999 0] endobj 7084 0 obj << /Type /Page /Parent 2 0 R /Contents 7087 0 R /Resources 7089 0 R /Annots 7090 0 R /MediaBox [0 0 595 842] >> endobj 7089 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7090 0 obj [ ] endobj 7087 0 obj << /Length 7088 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`Û|³  Ø3ž9x€‚ïn‚E¼Èdùûi©»%¹©Ý,>º5#ðŒE‘,²^¬bUñß¾ücÿÏß÷¾ügÿuøùðeÇfXÿgøûÃå¢m¤èµ­n„;üÙý¶{Ý¿îžwÏÝ¿¯;nއ]ã8E?àï_Û}è'ßõŸ|yøK÷Ûÿöbÿçî¿îÿö÷îÇOÃx‡/|ÛµÎ~ùwÿ \´Ý.;4þk÷×?ìë@hãþýA·Jg’àx=uåÇ¿—]ÑdÝIf¹Øs.:8u·ÿýy÷K7Ú Œ¦U’K+´ê~wFY¦ÛVt¿[9üY4“Ç©”Ù;kö‚9o"o½Ë†â©¹neY:@ÄÓ–Æ™²á¡§8·4,Fò:άî—Ù!,m¡ç¡RÌæèO[Ú°õ¡rrºí—ÎUò.ŽC¥$-Ï„×"ž¶´x¨¬èPº§Dë Àȵ#%o¢–"Ï@ˆxÒÊFdÀ‘ÈRɈA”Øäež†JȺL âiKw•• ÚQ©¦££Í¤Ÿãy:B” x(*'fz¹Ñ±Xꆙ<¨;µÊL(4¹‘²²a㽑ž³œ£Åùýèøée÷áÉl†—_:(ކGÿãåÛNuÿ9œÜD×úÓþŒ‰§÷/¿¡ë?`fògÓo<?PçäñÛ0'­î­¡¯@-ÌÎêÏÛ?0àíd0<«î?hTÿÍ‹¯*Ø1Èì²ï¿Ñ´Žuòò¢¯ ‘ð¦™bmÁþZ¸¸<ñ85bç#Vƒ÷Ò€ú|lùüÒq[ïp%[À>Ý©ûÈ>Ö}M×èéú)-\¡ößGˆø>ÜÀÑ0lŸaË#l‘„•BØb¿Ò¢ZØÇÁÜ둪"]ºv3t‰q‚wžã‡-ªxȉGõ¶ày´Œç©II-·wJªNIÑ'jö b¶àÑ6B}ÒÜ©¯¾ÃPc i™°žPŸÖ·@}”'ЋЛÀ‰UìîÈúÒs€­ÎŽ8Y›Jñ™K(ŠŒ$Ø-$"œÎPC~ P¯G/Ž‹÷¦â¬’§SiHgüa®Eþ`²rÖ{t1œQý%/vYáÏQãyäð|ÐÇèãÍ×ï:ã(SJ¾æèƒ}Äç ô—QÿUÝHÑòï\c1»E>bsðW¡4Ð’—r0z<÷`N—fŒg/Â_׉q@!ÝúqgG¬Óeõ-ç,â"pð–Ãåø}ÌXyƒPØÓÖ§:*‡3>ú¼ ‰sŒÌâw=«éÇÛÖW®(=úxjùXÄi"ÀjÞÊ)ºu@Kà›¯ìLu¬GIy)Í»Y4‹A‹P9kÝW‚XQ ,ËÀ„= p8x•Ô/VNÌZ(”ð$ð0‡mïJÒé¡òÍútdŽs¢·‰:o_Ìïk„昞=1íËíö^®ˈ\Ê©{µ!ÉäJ`?ŸÔ²ø+†`Abúó¦Ëq±™boå¹ã-œÁCð”ùx¤_’T-Ë3gažÂ)g“@KDžåÒ8«[p4(k~çà€9{1ÎÝ—RÊEáú^óâÊH˜v‹÷,<°…³±…œ³S¶ÎåÂq¡8¦½3êpT2ާ%dÔad¶–8vvu8²ú¤%cðq Šz‘ëœ+3O#8®™% ܇°‹ŠÃPã¨z<ŽøÇ;Šç!´Ìfw^kqiÌèwGcµ2 2 ï̇¨Jí˜3#¡ÖÈÏŒõ!䨬~´ÍOX`6T޾_§yŒ¸ÈQä^ Ö›J(X+K€±å¿cS zȾ³¼( aºØg¸÷õé&Œ=á2$’Å!ßX)”j†(<ü¬(§I-89{uGÃÔ»sªŠD‘—RPÔXí¦çÝåæÑ=Ãtæb^¹è÷7VÞ\Ð@^ßdØÉNÈn«ÂšÁJäšµ›Ò]OÎï§4§LµÓæ°þÏ™t` ¥­ÕÓBŸ3‰z}ê30=—Mÿºƒ'9kz…½¤%0ô¿˜ži²îFë.È£–µÛF‰ Ô£7ñJ †€êCöËñN¹WvCÍ ÔåýY†Š·¬VR/‡a‚/Ùü3"á®2Å. $Kåq¥”eÚ^1$FÂ&Õòé§XD *˜Ã—vä ÄøDtá–”{¥<ñ|WºÁ>¾¹,p,ƒº¨SeDHœ½årV¨Q•Åû|Ã.*f‡Ñ·PZJ§y)‘ËÛ( eì©€~¸u®¥¤îäݯP^e+Õ Ð,Ç4Kp­i”BH.Yö¾¤€ÕòF¤€µ¢¢˜ñjÇkÜ"5JßÊI©¬é¿*éy#Òl戊±1‡Ç¼µó1î—G/(×~3ï#…ñ6ÁÍ?΢´™êˆ¬N RÔáýçÕ+ï~}üîÔËSñž!_à½tè€%•ký!æŸXŠHë˹ŹÚcSe#KÉħ'j+â 1FQûsæ#}_'êÕR,8 oçe¹Å­óÕÚÚå·° )sY¸¬®·mKk]íÒ97]Î(¸¡¨T^7eMs|¼’ža¬3ë9&yuʦ\P\æë_\`nÈ,=ßž;ªÊAVÝ9hC”™~ ”™‡kr/Ä„,mrõ—I‚©Qí)‹Lâ/HwÁ6©õ¤ð; …z£fø=4*,‰g'ù·ú+_ýT«0x¥à A(Xãµ›j·ZÕÚ:šïÜ™ªAYj_€Hof•]Ë£'bb2ð½ïò¤]Rô‚ÐZ¹绉° DPâDæí´JYì—"¬û»ídU'Š_~|ý^¾Ôcg©÷”{Á®ó5*Ìþèh¹r0sÜ4}ÉÔ÷ÛiLc®³¹S‡¾žn„mìuQk¯´ôÄ e#ÜÕ ­ÓãmJ°×æiaûôD`E#ر¸Ã”®ÖSßå'ð»C5º++|B})x­…£u ×gÀXÌÚØŽ @u‡ß…>]„clsŒSL˜v:à^ŸáÄ0Ÿâ!íà ФþyS/œg¸ì»ÖŽ6TN¼¦.Tåó †Å"¾-¡O?nÙë‡-ØžÐ<‡x‡+쨼ÇXv\¾:“À¹mËLÃå'¾gaŽYø#d†‹GÑžsjÒýóîÿäFóœ endstream endobj 7088 0 obj 3173 endobj 7092 0 obj [483 /XYZ 40.7999999 458.899999 0] endobj 7093 0 obj [483 /XYZ 40.7999999 458.899999 0] endobj 7094 0 obj [483 /XYZ 40.7999999 785.299999 0] endobj 7095 0 obj [483 /XYZ 40.7999999 785.299999 0] endobj 7091 0 obj << /Type /Page /Parent 2 0 R /Contents 7096 0 R /Resources 7098 0 R /Annots 7099 0 R /MediaBox [0 0 595 842] >> endobj 7098 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7099 0 obj [ ] endobj 7096 0 obj << /Length 7097 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9Àx¬‡eÌô#@Ó@AÁl6Á"³Hgùû±Ëv=¤úd‰’e×£˜®i¶^$ERI}þã·¿ÿü­øüôí?Å÷ñçÓ·]UVª¾ŠþûÓé/¸.>6º.yÛßì>ŠÝÛî­û÷cÇÔ¾áø£NC þöý×ÝçaðÝð›oOî>ý¯àÅŸºÿýRüõoÝŸÆþú?ø±Ó­ê?ü{øÀ8ãºûÏé§ø¯Ý_~WüÚMAïûíÿýTëºÑ\FÍããДí¿O›¢Á: λÉ1Æ»yÖ:þûÝÏ]o‡i”­d¬Q²©¼{mxß­¨xÑ6ª`BXZkóì*¶#)dšŽú±¸¥±J6î®J- ¯eO†žµÖ¼û܈ñ+`Æu%†¥×Á‡ªÙCdÙÔ&„ІmZÔ†}ÝC+ëVôÐc›¯¨7&öºìN*ŠŸ¶aÕÐ[U€ÛCT)Øp2Îë¢KÉ™>›{‚a=M)Úê|cãŽã˜[“r=Ž6£¥·¤x-ä! ñNõ Wši=ŽYc¾~³Æyyï„Ö2"¨³ äXÞK{ãX6$[uÛ{!/¬ZVâ;KsDô—‘¥úãû9K L Í=#/0jö«?2÷´ÄŠŒŠ!R˜Ý[ãÉ‘ù¤hÎÅ·æÊGÞ®Á|²¬¸`ÜÆœ [¸ûAÞ3>­Ôg`üuŽ~£89ù‹"X¡eaHbX$†Ü`-tÔí½ž–êŒQ1>môéQi;ÆÖÔ úF±©pŒHâÊâ†Y€ùäɧ„%1Ænƒ—£ý%O›˜8±·êÓ⪢Q†®H"–¨lÍE›;€5°-žæ&JY{ƒ¿¿œ0 eÿB)4Fús4ët©MƒÏÞûxcY¸ëæVÇTr°–Å ðLäKªÝ¤Ð`Ã4õ~¿1”BO†žE߯Ò"ȸîK {Ã3ò!ÏÂkpÛ8°!âÃ6C0}`›õ!Æ5„àÞdEà̉‚g ¤évð^ ìS¼RÛÀõ¤Óó’«–w'¹¤Éú’«†¼ü\Éu"‚$ Ü8'…ÂÆØá˜UFi׈»“vR K;L-‡L#ì‡vÄ»éÆ$ñCÚ9-ù sâCGHâvò0Ý$–l»vçýX—»“&‰û¯çÎ`Nf‘B’±û“BXÖlX IˆQ ©p’+±‚¶¶*Èo¤“,æïàÞ°P#cËÊa‘BrÜÛËyHuˆ®‹òàZ.\Ù7äñ³—Í×â¸T÷°Iî|]„kPÇÕ)¾ª%ÜÁ¡+lR<Н”ЇíEV`ãgnˆÙK¢ˆg´Ë0ÄqÓm^ “®Ø ±NŽ¥ÃqwÞ8šB,™‹Ää’ê¥f¦~ÙŒ$^80o~'ÎŽÏx9¾ã¢ñ¸Œ?Á³ŸL9XeØ|k DPò–´ P“±u”…cf˜·Þè\/Ö”3BH’ ×n¤¡hDLJµÎoJ'„Òù«Íyʇ_\Ƨ(‡Õb…%c4ÆXbg¶]GÆÏp^×Ó…tÏÜ£›‘ÕN|Æ?f©Ñï¶Ü™9Ok6¤g€°¤XØ«±&Ix¦9^¸7°åa"ØJ ¸5ÒŽ‹ë8Q1sóXsËð›ú Åæ°ºø- ,›l¿ù»ÑV ²` ‚k,$ƒ` {œ(jÅâSËšµ(mé·Ë›pZ¶3X–õÙ(± Éÿì2ÒÅq:16=ƒ³¯å 3EùU%÷Åœåñ¸¹|).Q’è’›""66é& +À>ö7ìoÏ$9)àÇš!óQö&âÑp-©”6Âm„<Ýz>nºœ†ù³TÓýÁ(V¯ø›í”E©‡ŒmÛdÏ‚xP«n2S ×ÖËF-J ØmP«Q™©µ¾ƒãûá­S«=hÉ W2¼£}O¸ýËÁI3§o-[‚•á‘;Á.`”“ß>Æp Çù[‡Ke7|PHPÙp†”Áøùð^†‡¦McÈÈuƒy±(W¦,_þ°Î,ý±™²2óÞ*Ч9M_@ŒKƒB!–(åѓ핳]Mö_Áy@"Bˆ#r°ÌíÍ]¶ô–U˜¿€²-øµOFQojö§¨4™yw/¨Nú ‚çê$Ä´OqäÀe&íÍtŠ÷'EÝÚ-Þ³E\¶….¼®pê䯰åq‚UC@&E]Î%‹%Tº`íÅ›€APµ¼>_k[î|& ¤š¢©M¡Í1ÕÚj£!¤…½ m˜(‡çW,éÆªRcaçµfÎíø­5ëÑQ]JnÌ=AȤH¸éyÂ3`B^¦•yÍ ·ÁThFß ;ióŒz­Kã`ì04¼Á°\Aå­â¢Ì‡„Ä´€ŠKÃùógH wÞæ¯*B(#Î3WNóTŖЏ¿µ1¿Ì;k„³É’Nð`O‹Ã( žä„žäùÆe½i› ý“µ6Ew@xÑü+<)²‹’ ¦/Ì#î.ÓÃiâ wW\!ø¥/ÇöžÜ‰qó•ò½'":ã{’8ƒ–R R/+Ly$m÷M䉋nwGGGF<¬¦èÈùÆui UCðÜÖÏ•>„ÖVÞÊd^5’ªó¾ÐeNq±à89ÄGœhí­D9Ç,"äš5íÁŒoîLËØÆFtŠúuŽL2Ч+"/*dë\ÉÁ¹æ4~˜Ì]²7›jÄeJÖ/W{J‘Ýk6hóì@³Ï¶¼%ä—X¦”v@à¬ñÜ6-6¼¯ú(²üƒ3yŽŽ++þàø2‰¡'Ñ“Õró¾Å|U\WS]P‡xÄê ‹GBUÃõkŠ|¯½örç;ê’ZÀjŽb†@ ;hŸÑÐU=K¡´õß³Îé\Þ(~uW]uW7Â}Rdæ>üÎ,$F×>Îuß Ù!Õ ÙºÌ5ƒãZÇZP2KR®7ã÷Ȳ÷‡¼yS;£'[ªöœiVô£9|««8еÏ×úÊój¸X;öoá£>b®ÂO¥aÅŽý^‚GóH‡Ã}¶§) ü²eéðxÎ2£tÀ”Ç4úÝÀòæo-¯CKddn9£%e®ùÃÍ—)î8ov$ŸsÖ!iÙ“H’B ŽàcBȸ¼î8#XåÎ(¿ÁILDUÚ¤»¨júIÞz D‘“Æ™£Î¢o6†FHSà IÔjYVkçüÅ8H¥ÖJAZÆ•6>‰ÅË­4„XI«wØÕ“ü£Bm“%m¤GÆÎËè\«ÛíäÈäzçî¾²gÛNöÌ(Œg€ƒÙ0v ³o]®˜9´«ca J³pfÃÙf83W0%ÃN½L!“8Æ3»ïâ£#GÚþÆß8øÁf¤êÈHoNVr6¯¾¤ Ö-ãÒÃx-SƒQWˆÊàTªT—³¯ZYZj| 5oÊæ²[¦¹˜@ˆ’·3ÓêºTƒYp„4p Û´°Í`a7¼äÕ¾dÉÔ—zØðô7ÏðoGËó _Q›Ñâ¼ah£Öf¤XÈÚǹí7@×õŸyÍšYj3LS̘wF>`V>àBU6ÇCÞÁ˜uðäö ÷æ^8Îøw© ìm<%]šæ.k/8¸ÊÞ7x. Ú—\Ú ãÔºÃÊâ˜Û+Óc×áŒc,;ÆÛ“Ø«u¥JÖû"Ï·0Ã[ø „¨SmšP“o»ÿú$éÓ endstream endobj 7097 0 obj 3741 endobj 7101 0 obj [484 /XYZ 40.7999999 499.219999 0] endobj 7102 0 obj [484 /XYZ 40.7999999 499.219999 0] endobj 7100 0 obj << /Type /Page /Parent 2 0 R /Contents 7103 0 R /Resources 7105 0 R /Annots 7106 0 R /MediaBox [0 0 595 842] >> endobj 7105 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7106 0 obj [ ] endobj 7103 0 obj << /Length 7104 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ%R@°€=9x€{ì}`/2ÙCþ~¤–ÔÓ-ê£Ä"E©»ežö°I‹Åz±ªøño_þ•ýúgöñá˲¯Ýχ/‡"/Ê¢ý“5?œÿ‚›\ðö£6*çUó'ûúýð–½^/õ¿oV;v?êÆ~ŠvÀ?¿þqøØN~hóåáõ§ÿe<û{ý¿ß³ª|ëÆk¾ðý`ª²ùðïö㌛ú?矚ÆßÿüKöG ‚9ŽÛüûA™²ª‚ãíÔ•ÿžwE“ÕBK™1Æk8UŽÿþ|ø¥íF^IÆt)u1{TÍ›aKc²J—Y%­1­¥Í‰…¤ ‹3P Z+¤vŽ”›’k©ŠÊÀÏóá5‚®íýõ\y?R0 «BǨˆ­¬ß 8ù Tª£\|NC$ é4±°¥õ˜ÇCQQ/ç‘Pÿ>Tè@\¨85ÅA½c(2êe=X³LQ/´*x ­# Ô@Ä–֣•)˜Ð\Éfš-PÆðús}VÚ?ÞR7*tñýP¡XT¬¨âlG [Z¿x(êIPLwL[TÁÓqø¿µ’gõ‘i‡,­C½=ÔKý˜¿ëÇoŽŽŸ_Ÿ™¦1^©!9Úí×z¹*ûÐhµzý–ýµ(„ù!{ýýP媪Û!mKñ¶T¨…iØ"a ž‡Ð"œGÁÑž`˃ÿzÔ'[ [àh¢ÅõÓkMGaTQ’Å‘$ ãý¢Û¨Úô¬©Î€á%jé%ßñÓ~Õ¼ƒ¡óÂB²@-9É\¶ g-x´'££Dó ¶X ÔÃ_´G«Ì93£d%g|•ÃQ!¶¸€µ)°BdÙPæÃ}æ/‡UH¬_ài(¤%ÅICXùó€!ýØ;mÑLÆr%Ëm3ÈÔq„`‹h9cñQò Æù+§ì–}Rñ)~ÕF…µ,ÖÂÊûÑÂŽæ ˜‚=¶ëaqñb†òÅAxpø£ï’h Üù …Óz›)Õ¥|Ñ8Ô%zÎ#lúTñ u#[õC¬Sp=jt‚ûæÐPYTÍkÜX¯Æ} ¶‰×#ážrØ"ñžR0 iÛ#ª‚¸Æ4ê°-àž:¬Å"§ÑLñ˜z!HPcÅ<„À‘°…瀀€UA\c;Îq0íàýÁ-X.`‹iö!Sx9‹9$âíÀœœpêEJmÁÈ][˜¡-à–][Ø‚¶àÀæB¾ù i4 l FÐWÜó´¨:ö…’dÁúºå4ôˆŽ'.ﮄn•.UyéH±| –ã{Œ¡©-&],K[ôI¼y†9Šï;Æ,=FÅî¨I*q8 §ûb×§EGÖj¬Ñ1j<üM£Z})X>J¼ßäôú<¨dr0;¦8§!ŠÿÖ‹SXèÄ.ßÏãŒiIi õ@ÈnE¹©Š)qàAø·–8 ·}!„Ðpø”žÞªbýú±‹b™bm„ áyH^š¨ºÃþ›«ôm@ÇÝ0ÞâÅILžMY+w—’ÏÏwMƒŸ)¯zü¬ç³úMd£ <ÅŸ4Õ’†’äv"Æ6@IÛç„‹S_½¦°Åáe„8À÷¸ÅáSÆ;G¸Ñ Qo\oæ½iS‹{¾$+N‘À IÂq™êc=À–ïÀV§Ù«æßihL÷7„[×dY%výcÎzvMv‚’ø)q§¤«à„W¦É2M³¾LNt{(yY^’ј»¸Ý^¦zOëQc~ãc!ðQ®Rp¶å¶Çõf¨5FI»°ð˜çÄ`7¸5ŸÇ_À] ¾ÿ±¯T­»˜³z†#OÁº¾›Äц¯¨lX­]Ã}£¦a¬™óÀÔ€ Ú$Ä%P.¾øÓì‰-œZ[—<ƒn~žœOZÜÂ×ãó ŸóåœϱókVbmØ!à1ö<–µg°Æ!,”qËü½öá¬þR$$2iM d´êᔌ[.´LÏ0ÎÎ#Wº­‡lÂÇÈ’õ„™ÉÈ¥†ç)燭†D‡q¦(!™óÙ›GµOÜlH‚]¦F‘©©ëD Â¾`ó¿Ld¨fame{J°ˆÊãyx˜¦Ã£=`Æ¡˜”‡[¢PóüàS’Ø·§‡^ÀîIžÚúÞ€ù¤ì#è(¥FMŸ )™ÄJoYœ‡kÆ<œ$§^5 ïĶn :ÉË&<Ùóaå+jI§éL«e$9%-ÍAuxå!BþþTãù›Aó©ä¡Šß‹Ë ™¡.XPÌá 1Å—AE¹Uvp›(ÚkHöä"ìU>v˜VâûÙW׊ˆ{IÑ®y©Ùż¢×(ØÀé„[Øš/—=î–|Ì‘ôé ÿ€„AÇ]Ý2Y½óÕ·( Žl@‡‹å%EB©2Á!ß-ãh:õ>àcËQ6]ñļÉX5¶§¼l·TéË¥VùÖù8ÒRôˆÓjØBèÃ>¡>¸¥Kc£µ”ÁDÞÊ‹×âÁ :nÁó¼GZxãýh­D9ëÓð¹äغ<ޱ±Ã:Õɧ9°9æITÑZŠêä†òš$àVIñUÛ¸n–RdÄšwþIdÙCAYØg3}eh‰[/‹G¼Ó¤N²b4|´ ÖTºaË)Á‘?ØA&+¸eórÆ÷Y›¨.Ë™E|¿ES¦]¼a`wBøÎd‘¸ jö‘ý·„Úñ6ô{Möqf3O&eoá8*ìâ ^B68%O\ÀÜ#G†Q¢:¯¸­c=Ñ Ø;üD‰×3ß5”Tk”NÕ\Mƒ+£&÷ÎÑB¨XÊñ[P„JÔ¤|v¼÷”,NJ%®K©\› ꄙ«‹KI¿9‘ð¤*.NêuÊÇëp7ÆypN¨r+}S8Ï•âš×”ÜvJŸõåAÏrÔ¸NéH¨þA¡O–£ÏcB9%ù$<÷#§ºÞG‚%Iy á:qMyÉïÂΣ4Š%ÿúë¹ùAÚŸõ×s‹²­d“ðìüÖ¹lÑQÞ $øÝ(š°]°KþmS"Eò'õsUÕäêîgoo(‚§aç([ ÄT¶Äú{š’Û•ïÃ;·»#n·ó´-ÐÛÎÓáiBObä~hìÖxÇ÷;O۽후ץvîpµÜaýxŸ­sÅ.g]T·š¨ua u¹q#™Í>½J‰Sj%Õ³¦óÎÈ8&ÔDõÁÀü”î wWçìÚ)ýÓ•—B2Ö=ÊsÞýJ™"lÔ Öác'´P„hÜd•ëtc8Ü’Ø"K¸s"¡‘k´NL}”§Pwê«é%j‚/ÇjIJê«ÊÔÔG0{H‰z‹CZ&OS’ݪ˜ÚÌnQ’E\Xið+z(‡O ãPŒ‘®Oš5(q 4²„## ~5Ÿ¤/;¶A#KL#q¹1E$äÓª6µ6ƒßäÓª^îµóiUÈíX7ȧUQêIY—O»†ŠÉ±2æË y/Rwò– å= ÔOÅ{¸)/6MW¾Êò·W]¬8êCÄøiUë]¶igz”§´=¼êUŒç“xœ×Ó×z$[‹¾Ä ¢!î«óŸu ½?óiüЇÇ[ÉA5•×.Ÿ}#2d»Ì‡ôÄá|"-’xÞ®›ãüjɤWõæë—!ÕÜCžz#í’‡.ËÆ%ŸïZPªS¥Êê%°÷šíA5Ûq„Á|êPàóîY¹¸öÔÙÕ§ë~Òö>Ué׎‰Y½=‰«†³“;z¯Ñ~‹5ÚÂÏ ™ÐuÏå©B!–ÓQ…_{cZ$jÜ•ÞZæ¥jÆ–cÕI¡/[Ž!¿±ó³\­´úoöV³Üš6_è~|ýîàÁ6ó.Þ™÷‹“};»N?ƒYf¬^ÆÛ+[ <Åàeª²ÌËñ·¨+™[ S»Õ\çzÜÚÔ#-­ú%DÎ«Ñ e¥ò²Uø†ÂplûT°OKšç¼8¾9$÷±ÑZævþ›GøÝÎq8²ÂgÔ§3+ÆZZGgWøõévÌgílÇ@uÍg®˜žÜm†÷Ó¦Ž˜Õ§»Õ, ›â!í`Ì:hR {„gS/œ§c}àh“{ 6L]ÖYpP•}n0,Kn}Úy”ÉEë,™Ñâ€í̓÷c°»÷jÁ8Ƽ£»Ñ =¹ÆeΚ—^/0ÃGøl9³k^bJÒìåðʨ£? endstream endobj 7104 0 obj 3341 endobj 7108 0 obj [485 /XYZ 40.7999999 656.659999 0] endobj 7109 0 obj [485 /XYZ 40.7999999 239.059999 0] endobj 7110 0 obj [485 /XYZ 40.7999999 656.659999 0] endobj 7111 0 obj [485 /XYZ 40.7999999 239.059999 0] endobj 7107 0 obj << /Type /Page /Parent 2 0 R /Contents 7112 0 R /Resources 7114 0 R /Annots 7115 0 R /MediaBox [0 0 595 842] >> endobj 7114 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7115 0 obj [ ] endobj 7112 0 obj << /Length 7113 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWô9€ÛÍw7ÏŒäÀð99Þl‚E¼ÈdùûéV·¤™¦>>еdÙ€GŠd±XU,ëññ_ÿÞüó·æãã×ÿ4ß–Ÿ_w]ÛénþÓL?¼ýï[Áç¦W-¦?Í·ï»×æu÷e÷eü÷uÇô¾ãòclþyüô¿†7ÿ÷Kó׿?~ZÆ›¾ð}×zúðïùãŒ÷ãÞ~šÿµûËïš_Gúý¸Ó¿Tßó®OƒãõØ•íÿ¾íŠ&1$Ÿ€e|üGèøï?v?£ÁhɘÑÒtÁ£> ËLß F7L Ö ÖÚ‡JHŒ Ì2ÐK[ë¤qEF½Ðf¿Le’¶Œ”Œ0ÉE¦-!bI+; ŽDÆ»æl^äÐ¥.ó8Tê@=ëò 4AÄÒ–vÀ<ªí¥`Âp%§m˜¶`ê>~6bù³tm;ŽC%¤;•i;&ˆ2mŠÊ šu|¿LÞ¥ ÿãPɨ™8aK[Ú‚zÇPdÔËaÆ—0ɨ? •Œ±ÞdBýK[ÚõÖP_²èdü¤“½::~zÙ}ṳ̈è'ôåç’½;ÿx—«š“nfdóòSóûQ™5h^~Ù ­„Q³âØòü2®­8¤ƒXfO1ä‚gÀÈnŒ·xAÜO)[9Ãr†ÏÈéOØâû_˜¶x|óÕÇyÔÓ/Øü¶:ÍÕÛ¾óš™: {jyØ·¨ñ¶Ò³÷}>Í}X«äÈ;ªsL¬Ðú˜\m­B¯ñ !¸é÷-ºå¬_µ„ÊwÉ„…ï³Ö^la]8E…cͱàõWù¢Ç xÏ-zÁزP¿&>öiú5ð²ƒD¿ÞGÑÖÆ ´Þú±GÅ»† 3¨‰o‰Ør¼±l𢠋<},~h½>,"²ÖJà5aŠ»Rø¸†?{y#\¶òϾÂÏyl> ?Ì€+{^ 2KÀ`îcé0„ºíM³úF‚t²É5ürH ýFà3ljq줞|FH ¸³ŽsïyÄ9 ¡ˆ²X6œ)ÇšÍ)ïúu¥Ëu:Bg-~Ê Ì¬O¸—ÂÒˆð¶cº¦D…Àáås.¼øo…²;®–ñçn©¨eQàϵôp´gØï¥x!`ËœçS<œ§ƒxÃPs û@\c¼1h_p´à=…}øq×[»q1ŠiÔAoœœGÁ•bŸÆpØ"0v4*0½Á•b ÁëqH ÜwÃv¥ò¶(¸ÌÕì{RÉ5Q­Þk 1÷QŠÝ+BÕÌ1<Ŷcß«"Œu W!Òð)|»RŒ‹Ÿ5ß5Ú"ÖV3Ã×Gbƒ^Š0œZ« €qO]モ5«YA)‚I¼‚¥O­û‹ÁK°hoÝ4긜)Æ×ÇhV­Â¡?nt,Û+&¢!e†>lab ZL:”ã>« &Âê·Å(ŽÇrR^èseûúˆUA¿í‡÷*õ9µ›~°¼[cƒðÀE%ÎüRYDU$écáG0é:'v›`>¿NE7BE´Fõ¯åü ÞÎcÓ¨‚rA œu¤È[œ‡÷¿ì¥Ü39ôº±çPÎÈE´ÕêdÈùFB{l#xCÄx_$§ÿ8³%ZÄs1–h˜¿¬ù"T•ˆ¯f¹AîI~/3,ëb^Ì®á÷3kËgÖŠÿòÒ¾†•´wå9 çᣋî,~ñŽž7¹ÂþyàúTþ©:ã_bakò]¤û† çÀgÿ¿q·ß/dhg øVÀ–î°Ï‹Ø´„STö€ú°'8ÚG›9‰‰Ö̬´–h¬kç iqÌÓúÌïk–9õL#LÙó,‚¹•|õrT˜VXœ xDóx!¨À™ý!TbƒaY$ôåÌ;)o0O:Ó3K[Äá¿c«GfÜbáÂJQ™ÃÝ{@±VÁ‰+{/ß,‚7³PÊ]Ä ¼Ý%G0Ð…ž°K>R1¶>=R,»Eœäf©€ÞЊђBnn ÈýV„R„·LÖ¨Â2Ù\ŒÁù£ö{XÅÓ¾Tc³Â?3ÿÖ[{ ^%ƒÔp.¤<…ó¨­ç]œ¼ýºlž‹¢îXNin‘¾ã,² CQ]5Î'$oCA8þ—*ÈÅwÚ•b/câÜ1ÖÜñ x·¶ëؼa•H0àk與Àñ8žÇ]¼q¤ÉC’¥–Rg‡þ^ ÎsDð`\Apt‰*0õZqGÙžRü;ló¯Ó<ÆoÖH,æ {!ÀqwÕV G«£@/"` ˜^¸Âñ“ø4 ì½c=9F€Cº)"‡ª µl8ÖíŠw‹;‹ã9)£Á>Uå‹î¨¢Fžº€5ô¦"<ƒC/|–Ì-¯›ðë½}Ê’qÎkÛ»°wYæ`HǕٲPüž,3+Þz|­˜˜¤äû}>'ä-õ—tå#ÿ$uæ~¹ÝÓËÀDez¹ÌŸëƒSÂ\üZÆ!ÔËu©%‰ƒ™DªŠ³*V™~èÅjåmJ¨8>ÙðÒ‘«&™ŠÍKËx)Iw(ô¥†M²Š»uŒa¨¦iaNźQ%“‰’ªí–Õóì‹ÒzJz¼[¥ÓUñ+µîúã•:n~Ðpp³ÜWÂkl—Jjì’ð,ãÑ¡|ñüv—+ð?.ìÓà“QxåÙ#¼êÈLðb %¨ g;)!/åpƒ‰`KÀ.·´‹ø|ËA®‘"… R’¼d.aŒÈrä—¯š4¬¬‚¤…^QÍ$_.ÈE¦k.º;"W^Ïè®™P×CQæ¦à•âkjV'ŒJÆí¼8èðõžâ1’;õÞ‡53¢2•oÙ«N`»V¯:ÍN~“•üaj»ªñ£Ï,}aæG¿ÉÅǣά'?«»äÈ}BoBrð$ÿ§»ä¸ɱö+o°òâëKE Ým¿?¬í·pú±¢¯6¤l;)SröEDÃI+“Þ‚’â½B&X½–Ói,ºÃb,p²4¥¶Z„N(æåõ·­p95RæœÐüTY)¢Õ‰‘`ÅÖë5e±¯—­¡Dcò³Ö›ÑfTì€2˜Ð³)¯JYŒ-~ÎÎà´“B8GJ¡2ùʳ`"Bt®_u=ºxñŠ\Z²k¨Èåíò¹ØB#bîò¦¬m…+r9ªk´q®WµpÝ- lµêni©Žò —z¢¨Ì9Þº2[l¯ (i„Ý#¯ÐMðŸŠÉtnj–ù6â˜Íi5²K:PjŒG„û—±#WòJðo÷\‰$u4G™ë”¢¨¢+{¶–ûá¤RÆŸ*©ÞÊö÷.è8FÙ”+áõ¸µ'Ñ\Ö·—kÀÅ*£Þ9ô8´¨~PÒSnÉÍp:“bÊÇåxhÍlŒ w'H(«yÝW« 7[·;ÂY®(O@ 6²SœàYãWËÉþÍÚâ?(åB«|*¬×ÄäÒ¹ŒïeÙØMnÌŠ+éNpp,³Îš£Ö6냭¤/ŸkÉæg/J¼å±–"Ù¢Mñ•¢îÙŠPìµâÙŠîë®7©¿VÒ_“°f>¥—X­‡’Á‘®Ó"¦_ -J¼RJ¦¼Rœi W‡‚éƒeŔ̪ç~*­˜WFó›P^ÎaÒ…ƒ°áì&„¢ §†‡9oH5¿®ÒA¾à<#ÿº!¤XvÕªjXKo#¯Ò(rý:Ʀ8ÂYç8S)ç0!E¾ª³RÎnJÖ)B¬¼;W3ƒ”>ú¶Þi™vNP²”‘Jõàõày0Þ~,*t•ßš„«‰yÃTÌß?VÝ!ö¤–®·õÜ‹æôD{•XÌKÙ$M+«ÄUy+X_%v°Tt`'ˆ›Æ¿ÍëÈ6#KL_X~|ûîà#›»~q² ³«?Ä@7l\ƹg£éÙ¡¸ÝA.f<­[}þùq팋}¹iÍyÿ s¦e&]!Z>œuáTªÕó“Æ©ÅÀyzØg€}f"0¼åÝÞMÔçF›EËÛß<Áï.N¿gVøõY^ƒÏµ0´Žå})®Ï²c1k_`Û3@ÕMŸ¹bÆ»Û ï)¦L; 0«ÏR‡Ow6ÅCÚÁ˜uФ”¥Šé9^ÀÔ çYÌ\çúÀÑõs°aê²xÁAU6ß`X âKÞúÌó¨¾óûo@‹¶Ïh¼‡ƒËñÕ‚qŒeÇÛš˜ œÛ÷nÙôž…fás/§iÆ“´ù²û?Чá@ endstream endobj 7113 0 obj 3515 endobj 7117 0 obj [486 /XYZ 40.7999999 609.619999 0] endobj 7118 0 obj [486 /XYZ 39.8400000 588.500000 0] endobj 7119 0 obj [486 /XYZ 39.8400000 542.419999 0] endobj 7120 0 obj [486 /XYZ 40.7999999 609.619999 0] endobj 7121 0 obj [486 /XYZ 39.8400000 588.500000 0] endobj 7122 0 obj [486 /XYZ 39.8400000 542.419999 0] endobj 7123 0 obj << /Type /Annot /Subtype /Link /Rect [381.599999 627.860000 429.599999 635.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7124 0 obj << /Type /Annot /Subtype /Link /Rect [219.359999 552.980000 294.240000 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 7116 0 obj << /Type /Page /Parent 2 0 R /Contents 7125 0 R /Resources 7127 0 R /Annots 7128 0 R /MediaBox [0 0 595 842] >> endobj 7127 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7128 0 obj [ 7123 0 R 7124 0 R ] endobj 7125 0 obj << /Length 7126 0 R /Filter /FlateDecode >> stream xœí]Ko¹¾Ï¯˜s·›¯&  X² ‡‚ä°È!ðf7X¬Qö¿ŸîiÎhDöG6ŸÓ# Xòpš,Ö›UÅêùòÏý/ì?ÞùÏþ«ùyÿe×wýÐÏöÓßçPÕ1:ÿ*•訞þì¿~Û½ì_vO»§ñß—šãàq‰yÂ?¾þ¾û8/¾›?ùrÿ·ñ·ÿíéþ¯ãÿ~ÝÿøñÇOf¾é ßvJÓ/¿Í¿J¨ÿsþÛ4øïÝßÿ´ÿ}Aæþý ”æ´WYp¼œ%‡¿ç¢ÅF ±AÊaOá#:þû¯ÝÏãl'0:Í ‘—ýêY%¦åšîõ85“Ú™ÔÙÛº©HîDjÜE‘‰&ˆHÞÖHÏ¥ªNqF˜¤‚Od˜H ”¢ãï’™?kJæ­ š»ùÓT™É^¢ëÉÛÚ‘xªTIÿŠy›#Á21vš*w"ÑË2M‘¼­Ô{¦JF½ªêOSåN4è2JèQ!Ôã©’Q/¹Ñ„çnô4UîDjT¥E&š "y[;¢O•ŒzMy)ÔŸ¦ÊœHõ¬Â™ *„zBlS4Bø ܇0˜G`Ã<ÒŠK=ÏÀÌ¿X›I]ÂN‰Š§)ƒP{pPJêK­"ËûƒÈêžÁütXRtŒ*BÅùäaDÙ´ãöFT§t?¼y–>ÚÏθ執|öUg™ÁþÀþh§Üôè„Ȗ2’ÂlI ñ.Aµ`…ˆT•ï+¢ªßÀÖ†_$kÍ/#øú>)¼ôŒ¼´aK2Ô6Š]’ÃÆ±)â eFÓÍÈ æ‚5i W„‡˜—=!oùªÍª,‡ª­è)äÑ„˜ ÷`’Ȇ4áú­N¨î„JÒŸLåL8B:Á5"á¡–ïg°uæ äY:Ž$éígçɆ޵ˆú%Õvm9³ÜbÇOŽq~gá—]ŒÒ’£ŽŸq ÁÈ‚¨p&!3ƒzœc¼ Ð}îzÏBðþˆ¶9 ² ÁûKÉ=z}BƒQŽAr÷eàa›…N"Š#4§˜¥ÃgN~Ãë®ÇU–ªH—嚺}`–rÇ\ÍlNñph ™ôˆü]H‡“Û„‘ZYégÖ…â‘È<ô­7ÆßZÂt†@;Î@ŒÂ QÂn‚£•Âv§‘!à éç¢Lœ„Y§Èz0él#…æìDÄq ¯#82y•³#FëÙ õ¤,gD·oÚïa»¼›Àü¶S½:ÿà·Ý—J˜ž²0=ÇUHß ’¼Á ;ž@F]ö–f$¼Qk_ãúLÚ­•]„(A°P°^Eø®K”âÇaç,h<2äh0ì¡GX Ön>¤RÄþb¼¬¢S¬WÊA£XÌ%tÒ¦$Ìvœ±?Ãã¦'88`×Û•g)ülÊéß­Õ™4¤Ë ðµÚ½Ä×Ô8ƒ¥"tw€þЇ#ýQRØ# ÏOgÓp¶Yë¤uÜ0&k4ð3Ö׌àuŒQŸ™}‡¼£cfÏF(Ú¹7&ŠÛ‡$£2†ŽÍ“­ÂÁ«›g»†wf˜’–“c¼ú…z`{„ûÁ;-–ÃG[ÊÌO{h)H¡ŸÛà7 ?ŸMJ¢9Òöõz§Ø»y„È™^#˧7ܬlÒ.­!!hza&Mêu *©:·­lväz8j-³…,c4¸ô>êiK»Ñgë1hûx‚x8¡~„möé(;U ññ‚3 ‘~\qTƒ«+Ö‡o“^Áã~Šó¹ÞöäˆÖçºbÂ… ¢Ãž|#eÂâß`*§F—žÁI`<‚!€ÉfO‘LúãÄ1ÞÁ%8© ñV?0ÝŠ´è»þÔ“äXÔ‰À£.™T¶ÌÄÈ;V8X8š'Äða‡Þ#t!ŽFÕŒŸŸíâÙC×—v>H0e)…Úɱ”h¢ƒé›‘³¾èíõ•Ëlˆ- OÍ.I0¢7SyYS©¤²Õz0 £†"ô`õ½Nwô-·D-ÖÄ8˨x¬•#²$u ¶q‰áHZ„`¥çÇÃX³4nFk­«ªÄ1âô*wïÂþ&ùü¸0©J€¢hù„7ƒ¬%êRäÏö7씟AùR0 çä`†/˜Ç[™Ä>”¦]å57É¡VM3‹»¶›¦Åõ[õO—Œ áãPØÃÃÊ©¨]X}Ñ$sÙä«s.J¹X…CçЭ¸Oˆ1^"PäžGLÍnD¡qƉ'|Y0â<]¤®9©Rƒ”l©‹\Ú[ÏŸ1¥ù볕YwŠ¢¯.Õ4"ʶ"ͯ„椄m¬gyîör¦-Ú’–O¨ìOªÏÀ ÿl6*˜]Æ»•H€ÏÂ^攽´ Œ-;ËæA¹Ã†8@¡RJÍŠ2hå.E|‹ˆ+çŽp¼Œ£ãQÅZÆd :(5s½LÙ'œŒ\¯Gƒ}/Ý» ξ§®z­ÝÊ÷ZEuáª^Â¥MX\ª„Öá’(\Ú“Ð×5¥)"Å#¸‰Z¨“pEI£µ)R$‚ïDhK¨ç"Dö ’÷*ÈeWÚÙó9nn–.$Ä Ñp#CÜê2¡]Ü–wj|À8®J(ÀļÃ1¡bʨÚm)ªÊ3•aÌã¢X|%4Òfw|ÈØ–-á}ßü‚­¿a@òA¼giPGÈ ëŸw;º e.k®½Ó°æÜqw£´áº Åõc¢—OмwÏœµ“n¡O-7ìÅ1ü–›„Ë?Ûð¡¶äîÁs S RØCûvÍå@uB­Þ:âñÕ6ás \]®<\špÆÚº8 §7;5xÓTÀ‡’§&ffÉ5—Dn)Ó¬^bžš‚ ççqžâëZ'É*_˨\öV¤µ^DÃÜ” ‰ˆŽÛ›ˆøJÉß2Ø»‰ÀáˆoY/uË/7bŸâñæ‰J•È¥B†Ï§NñâðNáÈuÒÔÓÄ ¥õ樑<;Åð:x§˜>X¶Svš õIÍ,Rp×iøš-)õ©CöÆ#´£ÃÔÿ)qw|Ò-kM´jØ“qK×â5ºùÖ%{½î2+øaè†e§XóÎ1l³j¡²“Ë=ŽåÂÈL6Æ:ªkÌ„è†ÙPÚj|iŸÑð™™Ù$íh¨H³Ùci¶YDÎ?ù ¿k‚ ;|DϘ3ÊÒAû0^KÜ3†b1{7° ƒë¦ß© 2Hm‚iŠùóŽáâ> endobj 7139 0 obj << /Type /Annot /Subtype /Link /Rect [373.919999 662.419999 418.079999 670.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types >> endobj 7140 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 625.939999 112.799999 633.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 7141 0 obj << /Type /Annot /Subtype /Link /Rect [128.159999 625.939999 182.879999 633.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7129 0 obj << /Type /Page /Parent 2 0 R /Contents 7142 0 R /Resources 7144 0 R /Annots 7145 0 R /MediaBox [0 0 595 842] >> endobj 7144 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7145 0 obj [ 7138 0 R 7139 0 R 7140 0 R 7141 0 R ] endobj 7142 0 obj << /Length 7143 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ER/AÏØ ‡† ä°È!ðf,Ö‹8{ÈßÔ¢¦{H}¤ªøhõLÛ€gÜjñQï*Vßýùó?ŽÿúýøîñóŽ_ÍÏÇχºª»zþsœþþpù*%ç_û¡­¤žþ¿~;|?~?|:|ÿý~ÝéEóc|¸L1øû×ßïæÉó'Ÿÿ:þö¿£<þeüß/Çÿ>þøÉŒ7}áÛaÐÝô˯ó/B 9Œÿ¹ümzøïÃßþpüm\Âpwú÷‡V×R]Ô:¾?¿*N/_E“RƒÔò(„×ÙŽàøï??£=/£:óþ¾e¦aš©©Õ8SÝŒ‹w¦Ñ}×ôõæÅ÷r³ëÄQ÷ÝQ(å ê€pãP±õZ¥hZ‘ˆÛÚîÞ?ôCÓœ¶©d4è—¡b!¦ÅHI@?­HÄmm=ª%T/ÛfBÄ‚väø{¯ÌÂÖe+O[—ËÅD(.CE££}𦉏­tx†JŠŽv˜·®Ûh ‰€Ø iÜiE"jg 2ì‘>%QŒò¬¿{^|ørx÷4…>~ùy\ÅÉ’˜|ùvÝñ‡‘yU=>ýéøÇÑœèþtüòËAWíÙô˜ŸHø¤îOOšªoí'ŒwÄ{¸‚ަáhÃé‰PU/†ééy´ybd!ÛzÓÏ<§'CÕHkžú =ó<]¥æi6½Ã™§^öÓvÖ~£axF{€˜û€Ö†W-n! ð~àªE‹Fk:úÚ0ÜðNżê_Fa'ô䬈†¦žECÓ™)ÕÂÌ}7ïÚf˜á¼#yú ¯j­ú5Š;­ûraÂvbÛŽÄöuÚÚÑ™øºY:FÊ’ÞáÌS;(Sð«!d6[é¬ù {ž5†1›y¬-+ö4îíoÈÖ¤ÏëÙ8ÞÅð’…g‚®Û;Òí‰lûI'¥Ý^~ðëás6»±Ò´‹—_î&ÇœÿF<¹™ S-|âЛCÅÖþ[Òš ‹vYþù ŽÄ>À%mw\BÝnÐ;¬ºÁ¨Ù~ÆO9ò&$Œ9”ålzàŽUÅ:¤Žw§sž/7Êê¾ j]ƒsÊ;˜‘_Yi¥IÚÙΓ°®Ò"ðUD‚ÁÓáè~Ь‹àÒ$fAøp¹!G±_Ži%ŽÊ´pŠóŒ¨¤‡cwä%1 …$±Ónâ‘àŒ&ÍÌõ¬1I°=ohŽpŠâ‘Xo:*`¹…¤„7rå<Þ''Ó€pd—Çò)’/‘QKuŽ•’ QrC®ž€õfÃèH(w°“RfT{­ô¶^ M‘ÚÚFž ÖðmS—‚H5Æ1 šmН™Õw6}ásê5ãÁžP9<aa’DñQàš3bb® ±JÂImé×-Ï7–¨ùóM“[àJe“d”E|„ÄÏ›õøî:¥çd×Lìm†K¹óÐùv˜¤¼/M:ö!’Ôxb³3'6ã¤í7C'a9D Â…µ aã˜`9Ç'73BJ(XåÊ„s›ˆ~ÐýÎ(L5X´T‰Ä]f»„À·„€ 'Ñ:iã…‡× ¿ˆ)MœÔ]oóT‰y×Xö6"ZBèI­á“'øDÒGC*ˆÀ㚺·àÁ9.Ô %Ik’kå±_Ó¢±±|‹ÉLi B[pzUž`íîb÷PÁ†w¢Ò è9“¹Å!#Çjâ±ääp,ÇË|ME#9ÈZmë ,ìû—à·$9%1šÈž ‚+Ã9éâØe¤ˆ…݆¦K“ZØ_ÃfEÓ'm¿‘$äŒ{‚€Ha89²6¬×éf`þÍö¹ÉÁlÎ]m‘´Àú3 ÌIëZ’ê³V٠Ʊ¯v·Â]+±i!´Â©œYRÊ\zq¦IQG¶<1B¡Í¥×)“t ±iÍ–„rêA[ЧT¯‘›öD”[å(ÜyÚ•€îÛ6wK°Ùn¾C{4s?Š/-9k”¾Y¡—€cV®V¸I?Ús¸ニo˜à{ïrÀ Ôå׸`ZBˆ÷oÀ Oš»ë»c©,-šèŽ%ãL$ºcÉsÃÑùHÈŠ—xî$‚7è¨ø® ÆÍCb1P¤Í¸B¢y ÷•²Ý3üÄsóP©›z:©–Åì¤]ìUtÑ ,h`ÿñjg¦np™ã|2rƒ^vXð=·1ªHôÃå×PEÓ,ÈÕ®45ËZӞ‚&½”k3YO€~A×ÓU¦W¦ëi º&ô“ „“Òv4Š:`¿éì¨ ·Re¿ÃÔ®4 dòŠÉëÇòóg,([¯ßtą́4EòœtB–v™ iÛ¨áDyN =Œ- ŒÉïH’®øÊMþµ¤Î!nøâ“ˆ‚FJó Î 6±7¥Y¼²ý6ƒ¬ùDyÑúùn¼N[Åhç^á“þD4è‰jáhø>ñÌ“,܆|/ÔK¾!Râ“M¶ †=¸OÖª`D” b(í“àé,é¬Ï#1Å%‹?o€o+^)|=Òò–Gv}€ØÂ£%ݩڽôy¨ÂƒÇžý$¿¡3ÈçæUINa‡=;,ãÔñn/É\:M‰ rZÆdDÔéQº©r\Å2·]½™ˆjLq_’ÎßÅoØM]'´€"]YS;Kã4=T1}º! œôu>’tîÃ7Ë<£ÅSØá”ЬÁf£À®|"pŠlÒb›´ûpÇÝ×“ØØ…8ñ`º ž„f<#“˜. …|8tYÒÕÒ¢}iÁ”™U-úEa'•‘(/°TÃt…ßa„º8„ßÙô¼¾>«޹d×­ S_Ú'{¦e¼jŒá’’°_‚ÀE%¡~>Ä*²LÌÑPBáÐ3~§~Ÿ’ïR-ÅêÑ‹¿Û«QR — ž‹6¶sSA©k©ËËH]7KçÀë[‹»–žéµIOx¸výÃBõâ#Aha9†±½{ÝÒõÁõ$~RHJ{¨ü6)©¤Öy.‘,©uDÝ––…tËõ“î„G!,0|* ±°w=!žÏ§î>H9ív}¹q}ú/©÷Æo$×{þT#-´Ó.=ªo}ŠÛ>ŧThE¤lÅ\vBé¾%i?ãB·ÞJ!ï‚U@CèG´‡N¼s8HÑI®ÆÁí=x´ó}еïÓ€ê£ÌWkÌ à.”ö5°u„}eŽÍà±@Bç[µjÛu¤poÊt‡:^>W;CkM³r—ÑÚ5‰8¿ª¯ÖÄ!‚ú`)ñUy® /t©ØnìŽÝô›{÷›dÏnka©lü°²ºñÞ K”=4äQ1½D³ÈO= ¡Ö;Ø›r©ýÕ žÒüû†k´·P’Ç ÙN8I$Ï¡ûÑ.6×9.ý L®ë´Âg],ß‹çæœ‹¼uÿ3Œauî•ôfÚ-xÎí <ñІ5£»`K­šÒ-8¹Ëø|‹%+°Lâœï2pÏY›‡Ê9ù`XZ12V‹RlWºÉD±³çBxô´:À×LàÓbLÿ ÍÀÉ’ºi«€„ŸWZ³YFn ûáô»ÜàÉ õa*/$…L–IZÖº4õíØjK\ w·ÍØtÙˆ¡4]–’±Ø3`Pù]bó$vQZVÅk^Û“·c—ï¹ûêVþÛ‘v%ý™¦-ÝO¦” ¸ƒüóRV§åê¹ñEµpß–¦ò{¥É]§'׎{®Ò{Cúyÿò¶ŒTÕ¥ëêJUL{xc S,ÍÃŒŒ ésí]§–Ä;èdÄOw:ؤíÉ’LjDÚsËBhФÅëgRÊË’^݆7Î4§/zÀG¸×+"[ÙͽwæMÒ¶žƒÂEáúÖ<5ªŒÊ[Nù “V‚%½ÞwÃýv½t#ŸCeig.Ùl´%×Yw¡äpDz–¦ôÖ®)Õ)¯eu¿ÁЕnU!§Ömûu‹iÊâ8Ê3"K?“2c œ±qü¥¿Ãv5çTû¥½ æl'IÕ½gõXR3.6IbU21X2"{Ñ ®m?cÇÚ5½n©:þU6;)àŸ[QîYªÄ”ÍÁb¼°¯Á⫘–/ä[’. l|…Ñöâo6q‰ ’…¡™›y²šÇbp…Üöø+Ý2 Uk[*82 C›APÀÆÜ+NQmŒ«ê)%Ð)Ì¡e·Ãh¢§~z»0wqàì<\Ï̸ȒÓÀR*YóÜÉçeà~ÎŒ'œnœ‰ëžîç;»¯:ê”Þ õaÈ—:—+á»v( y|ŠŸ˜ï96WÏ2j ðcÀ×ëÅsG¼$]o žVÞÈE™8Ñ[4âà#ŒJòÆô ÞM¯ÃpÝIø(œÒ@‹sJÿªâ톷rJù¦µÄ«Ê+î’œÖn˜f»>£&#Y…àæzlÂ,'ŠIÍéKYtñ˜4}"¬q®˜#ucó166;JÂ>7ÁÆd¤RgqÜwã»ÙiŽÍ‰sÞp®gÓdº+É'åz ‚ê §‘0’En1Ê’´1tº‹b†£Ð«²ÉXÅ~¹e]@ó:ðI½à©oíwýñ¾£á<í¢¬ìš‚sµÁ忘G°Kû@tð‰0,¡Nˆr©xå‰gž­ ïÔ(ÕžëÿÌI8aŽª1> >> endobj 7146 0 obj << /Type /Page /Parent 2 0 R /Contents 7150 0 R /Resources 7152 0 R /Annots 7153 0 R /MediaBox [0 0 595 842] >> endobj 7152 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7153 0 obj [ 7149 0 R ] endobj 7150 0 obj << /Length 7151 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès€i‹«H à5@ È!È!ðd2Œqæ¿mÝO"õQb‰¤Ôí¶¿g‰"‹dm¬¯þüéŸçÿ~~õöÓÎ_†Ÿo?ªK¥«þϹýûÃø7Áû_k£.ܶÎ_¾ž¾¿>ž>6ÿ~;1Ý}8üh^^‡è;üýËo§Wýà§þɧ·m~ûß™ŸÿÒüï—óßÿÑüøqè¯mðõd¬nùµÿ…qÆMóŸñoíËŸOûÃù·ÓõÛþûƒ²ÌH-7Áñíö)ëþŽ?Eƒ5+$¬©Ì™1ÞÀ©šåøï¿N?5½ÝÀ¸)˜¨¹’ÍïV˺RÆðæ÷Z VTóv(ËäÙÖºNzyó]ÙÕ¶ŽdUñ:EG=DlÛÔX%ëpW+«ÛmX½ÉLÊvžZسi eŠoÐéksOµ­õÔÂÄ6ήb*Ü}ùdýD› oê­¯­=±J¤Zþ&¶qvÃòã®ÈËÏ*Ó/o8ñæE3©–_4¬7ÑFšvA¶Í®_~¿«I„Vß¾ù|zõÁ¶‚ùóO tï|þz’ÍZ‰Åùùóç?V•Ð:þåd/µVš«Nèßðº{cn*Þ=¨/•µªFM«·Ý›÷Ÿ›™nƒ›IaèÚ: ó·èÊ…ç6)ï ƒÞT¾ùßðøÞ˜IµVh™ÔÎJ û#_ÀÓÎÞ2ën¶ì?¹ÈþÑÔ|ãöZy(äâû¾{  Ô° >ú0÷[ó øÜ÷ª/œ™Y,¿DrM¯h¹¸œð[®á2âíh:‰z a¼YÞ{< ÄŠÀD½=‡0Ö½aü 5iæpùJ0NÈð9s™F8¼ IÉ. °„00@ ‹œ /8_zå¯û`%uË)Ö`/^OwÛ"HÎg™Þ `„÷p`=ÿeoÜaÜq±Ê⓼Çsª%ž#*0`vÑ&‚լ؛,ØéK@ŽMYé" zD ï×/ÞL帷ˆ‰f—*Æ Gªl‘ÂUtø:ïa5À0¹â7™5Èxš÷PÓgvXôÃUÃX,ÞtÌ:»Â3œp%[&CÍb4R¸ÉR, °Àb˜‰ìƒ_z8hˆHKüÝIѯ–GîÄ@Ö둘Ÿ{Ò6Éx«w|…2#/•v™‡!.Ó”œ@œX³ˆØÔ¤x!ƒð¸X»ÛBú…TðeÍÍ&BiŽ8 aaˆÇê»z3sÞCI† ǾŠA­®Àô¼‹©+œíŽV¾Ó˜8Ÿšq¢³à2"LÇãS˪_ 3‚tYfKÇÿ§ÄqdóC¡·F> GÈxKö,Õ6m]»¬ œ\­L¡ŽnÜ~r•ï ð²•YY_W†yö¾Á¬ ¾"æ"éì GÒÁ7B¾±|‚Áùàø?;pu®X_´^Ü­Äoêøõepãܳ(ÃrLpE1Àk}Œ5ª4ÆzSj+HÈcÈøO Ó …Ò1ÇÆ»€eà;øÓ&Þ¼§˜CR0sUÌk ÉgQŒoÈ–I†ÒŸ|ƒÆ7؇±¼âªÈ­Ade¦K˜ÝÕ¸¯•¦ O{wÊ™ù»=[ü=÷àOHa @B1&S ˜I=±Y"¤)94ë¶O­Ÿ ŠÏË 3‘=•¿§ò¦e‹,ùÀì'“n= „yx½öäÁª‹®Ù¤©¸¢FÅœ¼ü¦Læ¯ÇKŽ©XhY?¶b¡ÖË£ÌG‹—q›k%Ým^¯K¤qÜæ áGAÒLÓI’[¾=¬êqwi§˜§ÁHL õÍ{x?Y_´|Õ-IZ»ÏöÈ‚ hPL+m,‰:‰ ¯Ñ ÇáðOc…Á阗#”«´©âáQ[#É©é~"Õ„·¯OJÛ—Ò¤uyßëR)k’qS•·©4èˆ) å½C1¥*E1!äڬ׶3ÕÙ9K@-.ÆVKUeî(•i9õ`°}ÏYj"μª{»ç…{ç%¼hy“ç3;b’Ø‚„Y/ØjŒ.ë.ËéÛmT'Wÿº“@©¼úí5ô öoë€y`¾XÜGˆb{Ò¥HVÞM' ·$5R2¿0Þ¬JXSÖ—ù5èjè‡q}iùzû}1ͱRw?jÆLÿÔžu×°ƒoxòå¤Õ…1Ëa·VrÒ‹Ñ´þß}vv¿–Þ²ýƤie'½Øé?ŸÞü!W%²ž52q­ð’² ñÞÚif£ ªÝµ;¤XaF;p>Ø~E:ëúÌPJ}ßMåm–‘™²®)6Ô;û  x¶TSž-õÏ–Æå§Íg·­ä¤9ãÆ³¥œãÙRxcŸg·­ì¤;£ÏVÑ*ª÷t¥Ò¹Ì‚ÆXgÃã8@ÆÁá¢þ”t¿@`ÿÓ’¿«%_ÔÜÁ£§ä¼É©åTr6âlFrêÚ•jÍOr¶­ä¤9ã&9µ˜“œš{cp_r¶­ì¤;£€äl†,"9 x”IwÍzʬg/pÞ³š’?Šß²³&We®kù<ï4B¶ ëîzž:w{Õ…,ãS}Ìo”ò0>ˆ)j §q"P²0ŒØ‰{_ż%W. XÎÅoVÔæ»&zyågÍÖýk6e¢A¬%E°Ðõ¬{ÅJG(ѹ ÊOÛ[˜<ãé“\W–Õº’óf£ÁÙ4’2ë·!MÕQ<Á+ƒq§KµËQ/œ‹)%>í¯;Ù_™RÎŽ¬¸ëh{ªBfû}¢Ù±ÐLT.šågûby?ƶCß´AêäpÚwÄÍ—¤ S"»¡²¹\j7¥0WGºŒyëžÊûÝÞp;ALnÄzcY`I’¤æ/! ]hìwq9>E`è FYl X¼ˆÍçòn•Ú(ö¸{^awRÁ¤…7VlÎÒ%­Ü”ÞL*@Ñøò*k‰ïóÞ^Øîþ’–”Y•Òµå”Ç$7TF0ÊI*‹¤CyÌ‹|bë0…Å3•ZÃÍÆsÆ+èbÛ0Å9ió:þÍdŠ Q+K3¾Ö¡¶¹2/^iAsÐõ¾˜VßQá›Ý½- ¾€¦îd2/)»˜D^×C¼¤õøÁ¯§O«"1)’ Oy_ O0…ˆ€B-"[jÁ¼+—¼¯ÝÖ¥g13‘‹L@$í ˜‰+¯øfØglyðäâ\S ÒpºðæÊçWq…ººÊ†²q·–)w0U0ä`î²>ƒQ^Ií¬Ô2Êø‚ Œ9$pè_ŸN¹¯®xÕâˆxï¤âˆœ¶²$aÅI÷¤æxS Á]˜iʇ0s)¸)í7å£k%'½Èñ×”aæR>„qS>Ú'nÊG×ÊNz±Ó1ò§|c‘”¶ ˜õò›yòØûÖ‡Ò®à=Ëe8õ#毘œ!&; •Ì ´r{`;4gÂ8Ú=å¬ybL¾>ùÒè®õ€ï/­ô´=¦ýbxÐ}xv:hpÔ¦yÒ~4¦mu…vèf:›–bòV°­O·/¡ï Âz¤ŽÓo]öN¬ËE·RÖ]¦²Òá@pVB9°·ÜŽ%-ºµ×3+¡f%ê9f%¬ËE„õ™U×JO»Ñãa^˜•PsÌJHoé3«¶ÕZ5aVBYÉkÕ“ïŽY1ÏQœ—Y-´HÝ™¹WLÈ%(íûâk/ÝGÔÞNcHJ‚ ™»ßpû»AñucdwÇÞÂa|‡„5$$ŒäÀñb·„ …,³‰lQüd[v=Göè5U´ÿvmðHn±lÞS¸i©ûT6„˜íã¯_–QÒ9Ë(5w–Qµ{ÈPµ–éZéi7z<ÌËYF‰¹³Lsp‡áþY¦mu…VLÎ2Já,£nFÌÇ:Ëø®ˆÚüy£äbªŽ/ÓlÞ3[’|“eÖQúž5ÉJtIc&þi쌿¦½ÃuêKiŸ¸þš®•œô"Çc\ý5ÒÔ3þÙ(ÃÎF{þš®•ôb§cä÷×H{Ë X_†Ÿ)á²Ä¸ãêI¤Êlþ·)@ý¹<Å"–YNÄ&-k2×bd9-ÕÅØoRª¬‰kËJ$Äx-Àƺ+çS­Yq1£5+®u¶}âjÍ}+=íF‡¹iÍŠ³­Yñʦò´æ®ÕZ6Öš_†ÙSkVüz•IžÚö.±˜Üä,Ñ)”Ë{2•Ò!PS`¥)æ¸$çôïMÌ­W ÝòWúmÌJlôIbùVÔwNqÏ!‹)»Yï<¬yðYêNæÁÛz(uÿ²G V_©ðT=ê£Þª×è ƒúqÍ\‡ávXé†RîC¨gwWá T†Pv#à™›ÛXæaòòU’¯!Õ§¨™CI‹&ÔâÍ,R"* gßäÛCjx;çÉÔµ û]²Ú' <* CIþ†E:•®sˆfsæ-\;…¾9¤k¥§Ýèñ0/æeçÌ!ʸÃ(ã›CÚV´×n¦³ÙÙ¢ÕoçÎE¥ÒiðáHûÄ7íZÙI/v:FþxSÍìag®ÃünÒT" A ]ÿ™bÐcL}ëëù’.Îb!%‡­êwL™N‚ [ªjÙ†;I*£‡a«RЬ`«(o©¢ŒW<" EÝÌÌž›ýmî»{{J´cWƒv@ºQß 1@ƒ®„µ‚ï'xåæqÆ„X\ìÀªZý(Úx‰¢·%QÅMÃOJ¡Q FÙ¤PÜl#,¡b0%88mäh` l÷´äñšÕ¥ F>™@j&p$ãUiËò“û¹& l”Ð2Êš¼ÝàƒùÁ¥I*MŠ7#YI-—k½ˆ?ŸÒþ”ŸTï)‹õæZ½»Æ5Ïßš‘›^ÛÃ/_£n—ûœEðÓÅé}fÍ4æ.‘°L÷µŠÎ¢’S<Òú¢çƒq­¼ô+ã©6¼¾Ôó7ŠÖ3oz%Nˆ ·³6l¥.º7+½¼©á8~cá7=îÕüÂ+Ѿr9û\o=ÅŒŸ¼ƒm‡Z-33ü€¾ÌsošÇ`„‹ûfر˜¹°u°ëÚß¹bõân3¼§Æˆakv©úW+ö–½C؋ל3Æ8žÏpÏ}Ü8ì‚84XægÞ0Ÿ~0}.abÔ.§Ý—À8ÿ•;wLIWÅçg½Ã˜àõ³Ï(ÜBKƒq6 ûg$Á‡$üјJ_X›}8e”˜µ±×ðÍÈ þ1¥¾rþxú?¼­fŠ endstream endobj 7151 0 obj 4961 endobj 7155 0 obj << /Type /Annot /Subtype /Link /Rect [268.319999 383.059999 300 390.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 >> endobj 7154 0 obj << /Type /Page /Parent 2 0 R /Contents 7156 0 R /Resources 7158 0 R /Annots 7159 0 R /MediaBox [0 0 595 842] >> endobj 7158 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7159 0 obj [ 7155 0 R ] endobj 7156 0 obj << /Length 7157 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø¼ÀzDŠ/A€GÈ!@cÈa‘CЛÍb±³Èdùû‘,Ùm“úH±T¤ÕÝîƶ|‹õ®â»¿|þçþßìß}øüŸýÓôùáó®94¦ÿöÿï//HwhåøÕ:}Ýð·úºû¶ÿ¶{Ü=öÿÛ s|qúèožºüãé÷Ý»±óÝxåó‡¿õßþ·—û¿ö¿~Ýÿøþã§©½á¯;×™áËoã!…týËoÃÍ_vÿnÿ{?wlwøÿ{ݵîäªq|;¿*Žÿ._EõR¢•j/„ìÇ©{pü÷_»ŸûÖÎÃ88ÕŠÖJ­úïQ¶ÑÎÉþ»m§¿E= ¥Ž}i·wVö]É §`ÂKÛZÝ’n:¦–†1‰•³k„Ž7uè”vXŠÅ = ÏôMsÿÜÖê–¬1L- cb?nŠwG8aÇÉ µzúç¶V·Ô_`ji“X9»iIpS¼KÒõ¯r-ɹ­µ-ɦãÚoؘ–7E&R²mÔ8Ñ~ÕÖíÜÖê–TËD¤Žc+g7‚?ÒüÊMlÕ2Í1±hi¸˜ýqLbåì&ðã¦X ’´Jq¤ç¶V·ä4·9މ‡ …M=²HÚòYÒþyñý—Ý»‡nÐ*¾üÜ㨚Œ_zõ ÿ1Èu­Ûùiÿ§¦ïÿ¼ÿòëN ·^h>xäÃñ‚{~ÂxDã?á·Ñ´Ç öÐt­Õ£N5½+ÑÆ¦Zþ@ؘÕ½Þæ„Ô—Ýè±Õƒ_‰ 5˜°B­Ê U<w¼cR¸D¢óZ W-cD\“KY`‹ú,=ž8¼£Ú$"ÿp¼ ÄA+3¼MZ8Ѱ‘`‘Ä8yjv(Âu ¦õiš~BÛ"²8|…­…{8€M2ËöéKOØËiå„G§1|Zå"`È>uÀÄ ²ºIª >qAN¨4óÀÊŽÀëÄiŒ³ë:€È¼ó Þqùw„BwZ‹îLÔhæŽjòߎ ÃmÚ”s0há ïàõyGaݼ!ÀùL»ÎT"½˜ïÀí„—K`ã~>äßÁKŒ2‚•(cÛ&BÔð€dú…¯Bó‘@¤!‰¤Œ@B|‹0Œ!plx>[Ù겫½ÕkÝy3\£ÁÄóNî6@î6Cl*‘åÒ›óEÞ©…dxCcÎQ!àØH„¿ƒ·:«õv{„ÜñJPUɃ±¯T¹h0* €H¶.¸áÕ™ÍðfNƒ…#¼a$æ4¸‚QìΣc»9y¸¤óK\˜" 4Ý1ê­Õ‡¾åý×óosp®Ù;|X!ÜxÕíþNWžvF„è¤sâü”ºjE]öÑ??ýVÃk{ÿí6è£ÞñFÒ?Õ]µÒ]÷ñËîýwe·Z—ar5cÅ•¿*bé·Ö"gôýPü8 ÜRË­o tÚQú­·¡ßÈX±“%p¥PÖŸŸR°Œ/A<€ïo ž@ŽÖ²¼\N>³çíA2Zà;XaÇb!Ý Rл8Dõ^CJiˆ~RŒ¢þæt¨Þ4Acpk)ÁN·~Æ–ÄC\îæž¶UA<8ñ«Oüä$XX£ÍõŒ’NxL¼#ñøN0„©6/I~A±=áreÄ0ÁÁ§hp7‘ðªádœñŠçDÄpylM«5·Õb‰¤ž|°••j”n}"M±t€‘ˆ’×±óCin¦[Ÿ¥éUFÐWz×°Ð-H%râÓ2$¤ $^ÎàœŠ 䀑G—CÑ|'YdYJcUw§4ËäfiCòOª¾$-«akäÜÉ4ÝN­`‘‘a¸ Ð|M¾Â=ñ†€Ë·ôÙ-•óScÏödá gì-"Ø:#\œàÔ&öJE|i”`8|‡ŸÅg!ŠCİ«]§¿C’ªG€—§>Eöö ¦“Öçª&«˜s¬ÛkKVÙŒF7S6ëû’Å?G2a2ŽC/ZBHcýjFä˜ê9o·ï4¯D ¿®êŽyxÛUÜœ¶Ñ÷ÍYhsÞEü;*@ ðÊáÕ†£¦à&]$ˆVZíºdUª$H˜£ƒ1¤îT‰jO+rùÖ(a>´½ÞîàºÆ ”#ôI[õ™ÁœkDæ9C3‡Mšä_n5 MŒË}Š”z'¤Ê•¢„˜b§"!|®pÓ ðËŒ¥MÏ‚#|:²ï‚þÖ„ñdØÏ7W.jyë$œ(î°ê_3-ÒnJóAÜžWåÀȪ[§Ï°"¨E :¼ê1~'"\ã~ð|p^NšÄ+V p&+Ns¤¬\­ìä­˜/*m'ç’ ‰EÑíHö[[ü,댂ïH<J~4Aû§JB'ÅJ±sàÕ†3Å«P5=¿klrâÊŒA‚Q–À·(hA![&j-F² XM‘m‹‰ Æ7œÝGñààwðLñ|0¾Á~4œODR£Ì‡BºXͺª|¼ïhþëÌ©ž(Γ+“ßѰ–Û6äGÿÑŒdT¦˜ÚÊdd(›y\”pEJòvFGmS[~nŒª!y ‡H]oÔÊ\·dζ•ÞÜrr¶·ËR›#k ™êKFAÚÖÇÏ5éW©äkJ¨¿ 4… Eõs&ÚQÒMH•ö±_ R…§ƒt‹…—ˆœS¶žÍ‚ÌöÚÂD°‡ ›ê9‘½ˆ§ƒ0#ÁÁM©„¹ó ä$¢ÎxüßûðÅ«ýñ–O@´>ŒÊh%5}8r8°éŠŽÝ}8wãúlÆŒ_i;é6¹·7wÞ}84>u†T}œBV!ܶáóM¯¥§èâÛñyDP ÃRÕAñ“¼ Ôh—Bž³r¬à1‡¡zMp^F`fڜ¡ñQÎÓ‹¨~kÊ Ü­ýéåº[ûñ§Xý™nðWj’¼MmɸÖFx|`ÃVWD  žAÿ1l‚³1ÇVåa|FB'o‡2ÂwÓÉ ¼ßG:LýeW«ÛzMº¾O_è|ÉŠxIéÜu>Y^¿á Ž·k‚ñnß˵ú¼ )´¹<ï¢ÿmÃó.ú«ÝõYÇ+ÞyãSêªuÙÇtÞEÿ[‡ç]ôWUЇòÏ»Ÿê®Zé®û(~Þ…Ï^˜BùJËKãôÈ ~=Ö)oP^šP09$@·ÊšÔ–JŠ 9f) [%ñmIÌDN,G?à™û[6Gå]!²e¸ç#šu­çü$Ë˨¼K-¶&–w‘£GÔ}ŶåA@FÌ8‹N zâºFN6öòÂo»Ï‹d VåÞXoQp”aݘ™²z†i”7o‰ ™à4Jd=.ÑFˆŸŸ„‚r»q"µm(ë7 Q˜ü\1abø­›q´Ú Ës†Ô!ÐV<Þ}*DFù["´9Q²@°A‡En/R\yU˜k†±kùÁ^¥EÓ"ByXÇžB@dqÌŸD8—ÆÙj¦´•åLÝÆä`‹é¥áŒW­Ép>³¨g9æ˜ ¿Á¿•a)*xL@öUlötÂ6Så˜Ü›lp«ÊfóqÚ3z®PG{³lºIÏ=]ÍÑh-Ún²8WeÅMvéÓ•§híd½~~Ê\7c.»Þ˜.¸£ÝÚk ±~7ý•ᥫÁ O†?5s=›Áþ]_Mzt‹Iq*É‹ÅB$—Û¬YÂar‚•8=¿ál2|FŠ[xs0¢´c#C&ZÎürÈd:¸ˆÃž®ËÆ’pœÊ™>ô‰G†© ·a7ÊüaÉn¤Z)5Ç”ñÙD%àFǧÌu3æ²›gn¤ä7êÇàw#Bn4YÆA¬"+Ê:— oØs³3pIi<ºé´{¶óÏÎéÎ'<àB!,¦ûôæÈ.t‚%¨nAÔÅrßX8¢@ö x>G®ÖíÉ’„섇᪼•¾ñû\»Z&l‘¥$âÛ£üùl¿° Ü¶óè='¦¦NÎ+YuÍÈÔ–¨Zs¦mOu‘#ŠV6\×%’ï1#R¸¡âÑ[²ïû¬ ¿;ÙÕ˜F@YâšÇâÊöù´èŸS&•ØÎ9eR='¼™„B…ÎF·±bqø„V©,ÁàYôù厥­HE)Æ‘¼•ŸÊžSáö9· ÌIå`Ù(¼É«å-¬Sbõ3«ˆ0<ëåç9VQIô‰ŸgU^ãÖ:è“51¦°²œqkñŽ|„Œ¤¼gAÁˆåwC:nªŒjy>ÓâÍ(£X‹Úˆ2ªu—^”­¸‹[’¶#ÜO¥åz>ásöRÉEB”–bo pl(ÅáÀT §{FÖBcÈÝê3m'#LzçoÃêcÚ“ÕpVã:e säTèyìw¾V‡¯!d’Rû+²ÁH´Â±8Eô§—è>¯´XìV̘…=´Öz{y%Jz[ßgyc–š-.æy«pï r_Ïâm`­¾LPÞˆg¤ßgµø7+Ï9|,ño¶)V'D†!‘ÁŸÚÕ2ÒÆÓ±ö,^5–ªæ/Ah¸Udôá„€jÎЛÔö®~d¥€Ý‚=†Ã•—GÐæäH¦Äý’>¢Öz´þÍ%h²f1dDL,@ÄŒRŽ,@nêð±öô"--|Ì`uæE‹Op^,תkÜçriPÜXøà3Òé[ðÅ¡p{÷†NÄ í˜/ÓåÔâsÆR- :µÜ:-vë\”ÿíÿí¿õt ßãÃÓÇÓ׬ju£4%újú_³ý4æÒ_:aÆóSöms&G£TdÌÁÌ+b:2ȸ¤=Øy9ÒÎÜ´m²› GÑú`FAÁG¹~|§ƒïŒî+²i‡[>Ç™kmDÝË+᳓’=3ÃôÎ$WÎÝh“|—÷δb9sŸÆvÜ+°nø.µ°ÉÕxM!Œ;&K’‡f¼µ`mÅG„½æRÀ±a|€ýàùˆO„~(ØqhŠŽœ¹#Âýƒ÷g ³V™w]"ý< úÙ6þÜIcb…JHÏ"k‡1!h%g1Q¨!e/MâgöÏp‚úè\cŠÁ5tI(1i˜]]T8ä”Wö»ÿ—̸] endstream endobj 7157 0 obj 4014 endobj 7161 0 obj [490 /XYZ 39.8400000 767.059999 0] endobj 7162 0 obj [490 /XYZ 39.8400000 767.059999 0] endobj 7163 0 obj << /Type /Annot /Subtype /Link /Rect [199.199999 451.219999 324.959999 458.899999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://docs.python.org/c-api/typeobj.html) >> >> endobj 7160 0 obj << /Type /Page /Parent 2 0 R /Contents 7164 0 R /Resources 7166 0 R /Annots 7167 0 R /MediaBox [0 0 595 842] >> endobj 7166 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7167 0 obj [ 7163 0 R ] endobj 7164 0 obj << /Length 7165 0 R /Filter /FlateDecode >> stream xœí]I¯¹¾ëWè`äæÒðÛäÀ°9žL‚Áxgùûi©»ßÂÒG²Š‹–'ð{Õl²X{«>üùó?¶ÿú}ûáþó¶_—Ÿ÷Ÿ7Í®éšùÏvÿ÷‡×èagôük?´;=îÿl¿~Û|ß~ß|Ú|šþý¾QÝáÁåÇ4¸¾bžð÷¯¿m>Ì/ßÌŸ|¾ÿëôÛÿ¶zû—é¿lüûôã§e¾ý¾m†±Ûÿòëü‹ÒJÓ^ÿ¶ü÷æoØþ6-a8Ì»ÿ÷‡v´º×iëøþü¨:ü}ý(zÙ!«;-QM¨vÇÿ¹ùyšíy»ÁezÝÚé÷±³}Óƒž~ïÍò'êMÊÚý»úéÇÐëé}–¼‰l8v®ä™†¶Ï4Ó~M*qwjýSíF«T¿?Šèƒž6×[Óh³ûn«ÆF¾>gªÔ‰&ÚÈ3Ñ~E*mkª±½ªLÔ°l½³óÖ[ ÅuªÔ‰ì„|yε; oÊÖÖãÀS‰)¡»Ã6­éS7ºN• 1«L&JدH¥mm=žJ z«†US˜¤3UêDzì3áÿ@O§ú”EgÐ/:Ãwσw_6ž†½~ôåçi%kþñåÛFÛí{±9ší—Ÿ¶œ4­îOÛ/¿V7 Ýšþð}ù† }C=ð¿1:ß0÷‡”ÞM8ÜÎêâò~=?»ƦÓí«‘æé0ÒïšÑyFÝÃí¬DÍÛk'UtPo§¿s¿ g%Û!Ϛх€dñóaÙF¾µ’}>"0ªyiÝN«!°-:kg…ï[f}ü2J)´ï¼Ç{äÀ¢ „M ñ I‡ Ž3ܨQ|blfLPfîyĹ0a˜0YL{D'‰½l`>îq×wíÛ èÞ¥P wtïžþ*™ÕB|káÈ#ÄŒø5Z¦_‰øåÙ"‘`õ‹ˆÁl6`àÇv,,†£g;d2|nƒàâùx™ž”5¹šÎ¡)}¿ÐTë.è™ÚȈ¾C# 7:6òG46UœùL¨)zì.Ê(¢'ÔÁjÏd˜ÄO²H”#êÝ0&¬!š4I6Z²Çjçøé^1)C(dá?žó`ˆ2Ȥ=çpç⌋DXBÓý%pQ‘Iû­ A"§Lx%¿㟕èä}gTS»Övûi"Ž@?ÉO:Kà¶4²ob€…wÓòŸ!‹–P¬±îê% Úþ*]ôá•—3£v*( 3xpÅhµ”ŽÃ+‹×™1gñà–L.®fAÞ,ÚSSÍNnU,-è¾iµ»˜Êþâù¹ù ]=¦ž²/ûZu.¾ôž¯ÃxÄ$ÛJ‰Q<܉¡Gþ\ßn2Ú¥ºµJù»Ä€eï¯Öˆ=‚“±èà† Ä©:€™äý&¼xOB„‡‚—c·…ñ k£„ŠãÝ/ªx¡Ã -É#ßÈb13¼¶˜pñáàé±u–Å+H\Ä<,ÎÛ÷Äàðvȶ†Ù 5Z1Š(ü!a·–!Ïe°ç, "`˜ƒVféaçµ1a ×løÄÁ¹1Œ\prŒÐx-‚á å Á]šŸ¬vk7¦°ì-`ðrÈÆñŽ4Ž–!­Øžœ‚'§lç}Xð·5‡ÅDñÝx¥×#2áôxI¬’!¾0õÅïâjØ×ư;RÔ´ŠªÙu½z#ÏÌn”ëÁ#’ª„ô%ÖaJ@BpÓ³ þ0”xL0A²àG‚ô°.!¶2¶µÄ;žN—yz;ñò·<Ýj kƒ˜x$ú6È$yW8?)^!åa"ãªýŽÖóKt Ê&“*äæVŠy”ű…Vu>*FJÒWÈ}QÜP3ÓÙ®ˆ”Âpò%}œ{éËÃA‰¡&ðDx£q.õâ+j×µ½Œ|„Dz¯w`Eà<ñ‡¡¬Hˆ„߯^lެJ®9’­ ›Z¢à€@ÿ¡þ©¬ê‡Ä°8g™ÀÖŠf½*‡Ó_‡e›MpžœÚã^Ú÷Væ*„ ûØ ùý>>åSb(R«5œ>BÂp%X89AÊŒdé .šJÁg¢”ÃØº’{Y$ Þög>æÚµçFU¿ì»íÖ“\z„#d &±p¤—½.X»æ©–i¦‘9·—qõؾÀ!0a©ýã™RÉ·L-ò÷âÅÈZSq$¢ž9²¹wDUjrÜæ‰(*. –;"¥ÁŒ£ÃK÷U"ÓÃÒ¼ÊÀØÀ+øâ‚°´Kœì–Ðqê,—­0Íi±VGìà§ãN¹q~üÌ•VÎö £Ñl{†q«kô>Y}`BÁ‡ÛâaÀ†Î­dùP=¸|¡Vå ;8¦Ë1и2 —#b\±ôhò~—~=^ë]üo¼ü7jI ̺ß@JJYO…{;¯3¡»*Jv]‹{t¦Ô —P<ŸZß’L­Xˬ(\JyŒ¯,²ýµ3 ìÅ#{ßÍ5%Sœ¤»~tÙsB I}?ªd‘9œB"o ƒƒ'H(*ÿr’¤U•hOQ²BFÛ9rjíê@×%³OU?¨Va~cÇçJÀe4X‰ç9Kþ¥$ª“%H•ĹbOjÐȨW(Yt ¡¨¹¬¢¿Ý±Š‰¸cuS®Î.t|Ó|R˜k„¥&àqY(¿˜© J‘ φ%}°*_ÚÝê¢s•FV”èz¼¤.º#Yu-ïÞΡÃÏH2˜³epâB’ÄøH)Þ[‡’Ov_tÅŠô'“Hø í‚W+ÊÛšõÂp?b+y4ž]Ès?‘;|/2‡‘‘§äÿùåÆWß•´7‘Äñiúš\D¿ 9¡Ý¥HÄ•®äpà[¯“zØæO¢8šbÔIXrè^X.!X…wo>òG(£$`[8ÞÏZ™6¨Ÿ7Þ†"©'x4žD$̉ ™žgIŒ)­n‰Tq9¨ÕÃܳ`…ÇóÔ¿ÕPfzV =7/ô¼'ËU¶»ý1|ÛtºyýÁ¯›Ï¦¬òÓ ëyf¹ØQ6Œ™'u¾È•ü,§ Eæ¬Yziå¹Ér«À­V{Úš[€, Ð"%`‚êѵõtL"ÇÆolg9 ‰X^k æ|eØ™pIì¡Mp&pRn¬…!N/ ÛïùRŸDÈèê*éYWBÔKsç«ùŠ»f-Í%‰þ}ãK5û¦œ3G¼$}$œ™@×,o5X´Pnïð);¯óÈ•TIâ„„°(è$þvx£Ï>,њÀ‡C–u`›÷ù>ͧ,ëC°#z1†¾ÎQ“:ÁjûÏ䜄„" ª)£©ÄnÈ2fè"¡(‘ña{!!¥†¿È—²5(WÆ4 Î3’Ÿp‰DO” -JÁ²Z¸S§Icø=žoY¯ J`­ñ3‚’¿n’ä4\òWÒ©G”î'H‚35Š:¯6§V gï)©Œ/…ââÄx÷àÁ©„‚U_V§gŸÁÐiáÚ0ðpUÌñlpÚ%m¶¾s輂8¸¼…ïg/ËüÌRå$û)˜°íÁzɈ@òáýHJô{ôâÜjíœÕU´¡ Ér­JPf%¥%öœˆ¼—ØÚ#k8n³ÔR¸’$æ³t0öƒKê'Kù­ôiŸ+Ï­ê/ ú£v†‚ÞÍú®‰z^“…åhoG…ÏRÁMàÅÊS€Õ’Ä®$Qââ# ϤY^‘›±‚zBÛb •%§P]I|yê­Ä;S’¸¸Äù–Я•“;˜ñ î…~mgÉ))O1I–;èyÕ'F.Ç%«Oˆ÷ñ=/%«Éµ.Iä±ç‚¬¹¤»DÏ-=’¥ÎFXõ9UQ9h`½ž*WOËûí¼¥=OPƒiP%Ãfpw-DîÚëµò”Á=8%dAívOZ6ÀpztZAªÞTqÃõøÏßIÌ:#èê{^H^‚^LqÄ;mqÒFÖ35’ÄAR–w²uü‹à]–'Ǥk£ SS:ÏN7, fã”c%:Jö9 D†¦ ž§s Þ·D"â:¼6¬cR@=}Ë1ÕAY“w ÚÞÎ1é ¾ Qó­I9Gl+…Fêì®{¾¸Ž/vT„öØ<¿_Щ(ŸFõÜ¿KlL˜V‰ÿÓ¶Þà©*¼j|]_0€´Š/ZáëGx?XÏÆûi:†8îôæ™ ë6’gðe3ø 楞÷ÈGêЦ‚÷pf,-±µ/é—'Ð73_ :¹'³5Ýìs¯ïM‚!g|ÖÃU±•µë‚¦¢Å8¶«—ë(ÍÜã;è*î®ï‚˜pm\þôÖßÇÞxìǾâBã³WNÀc1öIb©£—vBî[ÑR·¹&¬T´»+óûcZ÷ð”¼]ÏÓd›VWÆO—08âÁ>—Å|È„t½cïÉkÕ\žxÖ†õ>‡¯5Õ¡™^Õ¦A^JæüIãr%Nªá~°góô¹“H­ÛùÔ‹Èy`K|ašÃþOÄ+À#5õ1I×|¨·RÕ„3ó­Ç ªnUëq‡KF šË¯*S8}»LB É5HF²}Þbð8Õ;%<¾Š#q=¢áu™ê­ø*¿‹ôôãR¤fj¸nx‘{=]žœQgYÔ¤4T©$÷ï ûÞðì>çe–ÚÝÛ/ïªuB wí0€q rÇ4gæBœWÑ'=X] §ã¼Õ‰a°›÷w½¸ÄãHŒœRÖðuç¬ýb %ÏrtÏÒÖ(¬½Ø¿Zõaœqö€$:íÉ«”Ü@Ä‘ó[yŸÿgPàSÀ+ÀM*•Lö¬ s$•x|ô‚¢GÀ{YûñÄCòÒ¦m‰ß¸bî€6)9fWx/Äê6åšÈÃ[HÔÊRÆEÔóæ•Iðå–'j£qÎ#8ëCӼ̢Ìö"ìSòß.O2¢q“y¼ãŒ:ÇZúY4‚ ~=«\dwO¤ž  d¸•ιùž¤b|Ÿà2uá©§]âé‡ï­:ÃVY ß’P¬ Šê)*&)ïwÅÅF–D‡³4[d´m¸hyÎ’"¢mÁIˆMgé[«nÍcF®«±ùùÀ. bœ%(YKïb´Ò‘´÷݃hR´R8áó’~AD]ÉÁwóô”¯šžU:²Hë’½iÑZM/qAU©ÑH!ÇNb©à-°½€`²à’ºÖ‚Ö[¯¯bN·ß'˜M Ùaùñõ›ˆúÍ ô?yáï}4xpC·ðýxUÕͶÐÖ4ö-•wÝ®;šÑû]Ü¢ëŒÌgoÌNG›¶í®›ÁÅæcïà3#|fö!õz§³z¹ƒ³ÍØ÷ú“øÝÅrd‡Oè™E¨Qh šóžYNŒ³÷emHÀºýïº}É»€§­ð™B> endobj 7168 0 obj << /Type /Page /Parent 2 0 R /Contents 7172 0 R /Resources 7174 0 R /Annots 7175 0 R /MediaBox [0 0 595 842] >> endobj 7174 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7175 0 obj [ 7171 0 R ] endobj 7172 0 obj << /Length 7173 0 R /Filter /FlateDecode >> stream xœí]Io举ׯ¨s€V‹¤¨ ÐݶäÀh99=™ Óƒ8sÈßTRU¹Èú¸<>R²]6Ðv-Š||ûÆþúÏý/ì?~ùúŸý·åç—¯»ºªÛzþÚOß^~ ûJÉù׮ו¦¯ý·ï»çýóîq÷8þû¼íáÁåÇ8x|Å<áß~ß}œ_¾›?ùúå¯ãoÿÛËý_Æÿýºÿû?Æ?-óMð}×íôËoó/B ÙÿyùÛ4øïÝßþ´ÿ}\B˜wú÷ƒtÓ7}Ò:žOŠÃ÷ËGÑËF5Òí^9®Sàøï¿v?³–Q ]Ûtuð¬ý<.ã ÛÎ?ž¾ïFiõaRƳúiÿèà~úqÿôëNún/¤>(ÃóˆlÑH£#Íéƒú‹ùž?¨Æ7éEÅ^FºÃHþ ?|ÐVRô‡¿=4pyéªzP—Ï<Ò/öïB>˜k5çµùÖ3|…¨tÓN Xª # òøOÍÅ[ÏZ r#<51˜0ÂûÄkUèiÁ†gRçc–¡‡ Ç…˜W—2 \½}l)­CŸV)¸`¿Ÿ¸ïHîŸFù‘IŒ‚óR4ó:…:rýq@áÆ<·@wÿ⦲ën9­Æe£Wz[8ÓÜxkÎÚàZ1 &>ûh±YöWõCÝ^ž’µ4| uÂVM°˜ÁœÌ–UÀ×î¹ÈT4ª”Úé¡6£y»ìFΡÒÖv?Ñ,GrmD¢ ß³cÔ ”B#Í'øøŒÄÏÀýÔŽ`ˆöð™Žàgà™âàý`¸)xÚ®Úq ¢ð|ÄÇ)`Å…³ñBÓ¦Œ;r P#J05JV•:¹R°v`Æ8¢ºø“SÖ˜SP`Mábxä.~§º.ƒ;J—Á5Ô Zq\)ƸR‡¶€e<­k%X'€ø"ðª1†k§ ¸j‰gƒûÁ¸Œ÷£!Ž98 †(|Fb‰ò –ð…%~}¤ öT+ ÌÀ’Ó³ƒ`ìÃï!pÌÿ××+À|Ë@‚&ï°%>Äåaðã%Æ ŒI—½²©È¾µêüÚw!­ë­i‘Žý”ë¼›pÔ¶É0‚‚ÂÑ´LîQF¡ëÞ1ôŽwo®,ôr¤³DÀYT }\Áy¦U.êå59~‡žÁ\Ç‘ae=˜82zü)t«Ë ,¿×ÊbIÑW8Dþj*M@¦p!⊴Ž¡å€cv1èÆÚ·¸kx¶,³˜%¨/Ž}Nf±+ ˜w½á3 ÑÒœ (Éõ)¦Î:twsÂŽ%Ÿ¯Þâ+P±°W‘¸M¡#‚í›;O+VyH̯¢‡%)<&Iâ³æVž¬‰…$…-¢BÅgæä¿B XÞƒßa!Dè‚§û*«o‹^lÙÇÊ}²PÜÍðr¨ƒÖ^óÊ¡ìSД"9±2³°FQZ°ÜëXéÕ‹22÷^µ¦vÍ‹D˜©Cô²ÄKŒ½UÈ›•‡Q¾¦ê°ˆ2£—¦}ö„b¢zÏI~c¸«•ŸüÂîmÒ™œúz‹ßÑo_¾[?¿ä’ª3Há59 ø²2}œâ”’‰3bȃERl²$^4 ˈb„ëÔ,–s1o3ÁKúHÞL&Ù(“NnEÁ·¢`ç~¼E9ÙzÛøšÔC%¿÷°·Ö[Úv"D"K(6¦¤•É”6M0w™´jL„lÌ0ÌçÖâgð pŽ4[E"¾Nh~f‘ÝàZ+™ÁÁÂ}U$ë>c»Ù솑÷ W¢Ù!Øu…ÚõüeòÜ+#õ”6ŸñÏà,q噥DVtÕ0Û¦.ÐWÍbd˜ç0âWo:b?£,%*Wf“ð¼j¼‚sáµµ‚ÙÜu5›uAÏ<ÀµQ Ÿq¬Md×jaF9àȆ­ƒ€Â…]<‰ü B‹]>ê¸^ª÷{?™Gè7¼ò¤÷À¤€Ò­"´^Å$ÂÖ/¤+­Ý‚¦.R®Ê w« /JÎLø¡ &ù¤Äœ÷"?ÞBk¬7x{ŒKŸBÐ~Ÿ„¹¡#Γ= X‘EòîÊÊÃýY°šƒ¾’*.‘ ž"èð|CG ÅZíJ‹Ì×®UeùV±›”.ÃÜäý¥tÙnÝÉbG][åÜã {â£Àl>©¼@x—Ñd­º“‹ûM.MÖj8q“[4ù‘æÜ»µP´Óá ó”ˆR…!RŠÒ$åêH'>„ã­7ZÞ¨á"ÝÑY\"Šî_Ϩi±yõ€ã-<ì=­¶tx˜¢é” ým†Ë–9û¾)}öŠ0€êíæH¤àå-`éäö|‰­*øVÉÔÎof·'c2ÆßÇÒõÔºÝ {ÃCœöUí,wÍF”f°4ö¤ÔKšºgª“Á+ wØÄ$¡.'&œ\¦•é öYJ“Âýì¤:±ˆh©B—B?,½ qŽ[ùSRŒ£eTDá8)jšÓ˜²ô–”£×”cÅ_{S­,r6ínZST–й»slW¾p£ˆ×ÚºÅô.K!°œé²ÌåS ÄvC@ήe‡yï®MémçÐ"p˜p©åF‡€Ž$ÖÎýé¡ó_Èj&?3¤äÆÛª9{gkaÍfúœdR'–´Ýè#{ð&›¥”6l§[gp_û á Ù¼Ý¡ØÉcóbÇ5•Þ–ß6áÅ[lÛKÇŽé£a}²’yz—6Þ&‹yWUsø|ã´ÅàBÞŒÚL·€½êªœL¿3¹þ«ò#±xR´GŽ+©³–,pç%rˆ ä˜? Â*ŽUz ¬jf¸u> >> endobj 7176 0 obj << /Type /Page /Parent 2 0 R /Contents 7180 0 R /Resources 7182 0 R /Annots 7183 0 R /MediaBox [0 0 595 842] >> endobj 7182 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7183 0 obj [ 7179 0 R ] endobj 7180 0 obj << /Length 7181 0 R /Filter /FlateDecode >> stream xœí][·~ׯÐsŒIÎ( d×v>0l A §i$AÝ<ôïw¤iµ¤>’çðiÇâÍŽÄ!y®üÎ…ïþüùûý¾÷üù?û¯Ë¿ÏŸwªRšÿì¿»ü…ªÚÌ?öC[™ñðgÿõ×Ý·ý·Ý§Ý§é¿ßvº;~qùgzxzÅ<àï_Û½›_¾›óùù¯ÓOÿÛ›ý_¦ÿûyÿÃß§~\Æ;|à×Ý0v‡~™ÐF›aúŸËŸÿ½ûÛö¿MSŽãþû];vÝØwIóøvþª>þ½ü*zÙ´CM;ôf¯µ™æÙNÛñßî~šF;O£­û®éUô¨ÓxÓ°ý`ö‡_Õ8ƒ:k‹J§4­Ì@‡é´¥iÕôþ¡ª¡©uÝ›¶9á@‚v˜>¬ª¾^þÄϸSu7/½O]üËP©%4ÐaF:mi 9ÎH'­l!†3Ò'μøsß<_|ú²{÷Q7õpp_¿ü4MäèÏÿ|™Ûî¿;øuÃôôÇý•ÒÍŸö_~ÞU;Ö};;Í9ž¨~g€ß1’3¨ñ{>À'ÑógÐÁÌ{ðáËĹ)<ª¶0…ëî"Ü+ü„3ÓÓy SË`^†|Y”¦9½õý*æÓ™Âœ€é­4ÞX hÌWxn Ýeêütu b§ôÉ0, [·•šgcoû`ËCúäÅž:}>þ¢yìûù5ºj›n˜¾mÓ£­j3hs9 ß§Gë}Î/ð\ÎðÌUÍ|ÝTÍüUÒ:gŽªar _­Æ|´¿Û ×¸;ïÌÙþDSÛ‹pVUÃÁt…´Áûk:HOeS­‡íÌÞÞóÁÞ’Y÷w•ÑÃU=NZßbI†˜M‚tô0R  ‚¯ÁLÙz8Ûçù(~B˜c¼,±ùœ]/Of×RÌÇc hjLL(?®: çèáx5D¡”óÑ&~°žˆ¹$Û(!5:Ú« l#Cí6 ~/ä FYéx {ö‚Ÿ`¹pø“Àa‡ïZð»žp>j/£ ƒ|#¢ö)V ¦vrœåàIã…>]÷Ù2š™aì-3ÓôÈauy'^çàE×áý™}imN›ŠÍ gû›R»<4wª_® O<ð ç Íâ8À â ġࡃwõeAõ›‚Ü7 «á>¼ónÃ0†›†ñÜ ¿,†¦µ´êO;ß|«éJóȃiy‘’xfHÐ]¡Kõæž”ÑÍ)˜´Ù‰;°Ý)0´ʼu¨Óy$€ÃÔ'#ª¾‡§–0üA€è%àFÏÀ½#¢³9ÕªêzýlÌĸ´ ÀŸnÌŒ;§Þøh‹ò$ -²±’H1¢GXqŒE‘TÂŒV.±ÿ+Tâ^@#\ÒNžÃtØ`ÐÑÏŒÀ®+ÔØ rF1ÚѶ˜%á7·D4ž–Ê-(Sâ(kF˘mA™•B«”©Uéà‚„lÜ·q_7Y‹Õè¾ ê R«¹EH°îJ‡±†Úx$H­¡½4ª¹=Rª.HÖŽ.ÒP†ŽF ¬³Éz)j5§¬’¡¿¦Óé<’?ô×ê“"ÌtŒÎjð Î\9P¤ó>ç´ÎÁ8àû°›,dC h†1BI^E|±g“RP}À‰.¤”¨Ê`Õ#q(šRH(™qBo„ „ÃtAhqÉR»F'DÜó–° å‘Ñv´j´Œ‡Œšç× IÃËÄ#8’PÉ)I ë²VãrN%léêÒÒEpŒÊÏZˆò:â‹·Ü…âæN&èRѨ¸ˆûÏâ’›ÑDŒMc›ˆ›×²¦ŸM œÇê±Þƒ”4;ËÂaôÇ,νYD›à¢3Íâ0 Szv$™øø³ˆH:a” 8¢„Ó à‚Í{êû²êKm+̼©I%“-Ús+:\'…öžð0q1èazGé8ì€ÁbÜ^í©Mº´æqZ5nǨPóð 'ƒÃüo©q`×ÛÊá4 ¼La C:z(\0%¢kêiðp&áf™ŒÚK¾ÃÔÂëOW 'cߎNª9<ÊH?¼=µeƒêžÅÒˆG{_P?o²óâ zèI™Õ úõžfµÈ¢¯OŽQ=«Á´pÉ›9èe‰ŒŠXý  ”d)èz ¨²ÏKž-ûâým°N¥^±?Ld¦­t{¢4#A¿ÆitЃçtƒñøµ ÏÍÓu†!Yždû²RRDÛ /ý¡J¥ÜÒv¥Ð·Ms­âɦíX2— eôSùNrx¯ðÙvC˄ѥ‡{ÂÐOZ0W­•+£7ŠwŸóìâV‚¢ÖK÷¹‚åfƒD÷9šD3üKOùqˆóc›ãÖ/-'çÁ;Éå¹xÄy"ˆÅŒrº ñ¿íwæie¸u|#ÝóŠH½49za×ü&¢îìwæÏz«ûÚ~'!«Ãr…«L»Z+ªÉ¼}Ðãœ<Á…&[ˆöªéÎQ””Päáf¾Jvà-sÛíÜÑLŒUº3 §’Öqfnp‹QmeÎqž¾k­`zÞ"5™Ž‰ Ç‘õ¤pºd¾¹RD+Øu5'AÂKëÅPqj¼¡íKLPš[QÙ£C709Æ47c§6ˆ¿ 9åöǤ~4 ½×v²®ìj˜Ëµ°„nÀ÷Ô`<ÞÅ+ŠŠ¢ÎÅï:9'Ì+m¹•øÉzxÀ= pÄ!¡<÷fW–ÓE6£éèzÇt@]¡q;¾„5lK(m n‚ŠömomfþÀAßÙï¼gN´@…h]?§e=¾fÇõ¡vMꎸ°„“£eç6~¡œaEeF[%a±‰7ÉŽ^GW›8Â÷-ŸžëÑ•]ÅR.~"´í!´éÑ„ñ­(37œ,Þç,¾˜ÌcâOëAÌ"»°öê|¯ÅSV”N«Žk*ÒÚ0¬rb}Õb¤ˆ4£`žüŽw$ß$Ì1ìY1úÕzúÅ_X¨IŸG‘1ú EàÑ…0å;ïsêö¦·”;‡þ„–ÔÛeÁ l‰„ç^›>lIñ*%)>ñb¡ÓX¯õ†Â9Rwà3x†ã”oÞþ¢ ,âHœÚ)>ÃÖp;Å£÷±¼]îœ{\ã:TΙ¹<Ö¶BÆ[éäþ:Lôò wx¸Éœ äSÚ{&íœìíèW掼)8 K8$ÀÜŒçÖû™$drìhJ’qzÉP“o?^M&êf½Ñ¶¯ygò*ÕüçEoÀ'ê´Q}kG‹~gDßÑ/‰øVòþKA±=ڢ˺ª>nú¥²Y´œªf°òš×àwð¬ßÓwÇóüCŸµþ@_Ï"ACÕ,rh [[ÿõÌm\¦¶Oõž'5zžÛš×³”ï^›A¡„½OÇþ›ÕÎp¼ŠJÈðÍ[¿ÚãX†M"àV"µ1œs6'Ïp<æ9áV÷ÏHuóŒà‡g}$#¥•##=+»KŒ¨? sÊyŒ#§õó‘’Ò%ÑVDEç¹C.©È„µš ­C)üíañîi[]¥V9,ÿ±õ7SJO¾”6çxum™›[é:Rùls—Í)Î'"î®N©aQW˜ 85Ý¡´Çü^£ñ.àã¦HC‚d^¶jƒ²L”££ãƒp”ä-Ñ“°Hk ʈdè’ÃÙ°½¤´Tà»9ÃsΡZ°©áˆ€«}D 6UÂQ%í-ÜëŒàK\ÎQMŒp Òæ-QÈd8é$­d-º¾!—ã»Âà &Àß¡TQ† ¯œ}LkY4Op°(‚U žn‹8p%t£ øóxTΖHøŸM),a )áAï²À)Ñ á%rBr˜îØÊ‘8d‰…¤EsÅ+"R Öç\²\‚ü‰£‹(´ž1ÚȲȜ8Û Ïof袅Þ5àác´Dnžºäâ­¾8úxµr@ TUgî&®-NéÅA¸äR¢Ü56zx”ïKÖ¯xþM”äëxÉo;cI>†c8OÜ€í"æV¸6!¾bN[}çÝ×Ëî«—Ý?lâqYqûC"uù‹_vŸ=š9J?Lá5a3»*"WO„ LˆÐrÂ3„RÑéðgî®[¬i‚9—Y¦4M T6Ht–ñãA¥bph^‘Òç›`Ò±…`¤¤tI\MÂÑ]æ~­ø:ƒ›5}§tøIh¡ÄÂü9yS7<Õ¶ÊX'ñåœ?=1x/ÃV*þDSºðúP)ÞÇî}¼(ƒk§W ÷Ç=D¢XæÃ‹H"”D·lNëôÂA¨RLüaµœI›Kg™tGzªÀIpà¸C <‘P¡O¹.@¶HÚ‘‹¼­ÒWt @ž,,:~ËHËe(n_ˆóÑ{Ádí‘b«ÕRí?8Ý¿ Á&Ñ ^–”w&ÇaZ ö7#æá3Ø å,ä=×¼™\.œ±³U«µcÎ4Ê¥™ê…«¿š,ŠB- ·òd’E8~;nÉÇ©PÈSp)›Ä&±¡¢W/払Ë8t"-IòˆLÙ¤Àœ n- À:~Æß8O¸ÎIä.Æ{U"¡Ó5³p¶È£–òd$ɶªO83ºqJ¯ ‰ÞÑÛ­np§sÆ‘†Ñ².¬%‰Ô#¦ÔžæÁßRš=l¥hç󔄲µÔœ~ú»ÿ6qöĸ‡,ÿ|ý•Ôéà'¯”x¿¾»ÛëiW‹FuWÍHw­ÎÜrstWu×mÉØT`kL_õ׬ý•'óF×ueÆ«Áú¶­º™p6Ï]{Ï¿3ÂïÌÎVo*£Ž×d¿> endobj 7191 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7192 0 obj [ ] endobj 7189 0 obj << /Length 7190 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹¤ p»Ýr`Ø@ƒO&Á Ä™Cþ~T%ÕÒ¢>’ïqÑÒ²w»Tâöö•ïþôùïÇþ~|÷áóŽ_‡Ÿ>ŠSQýŸãùïH}R²ÿµÑÕI¶ç?ǯßßߟŸº¿D}yqøÑ=¼NÑøû×ßïúÉý'Ÿ?ü¥ûíGyüs÷¿_?ý­ûñó0Þù ߺ­Ï¿ü»ÿEH!u÷ŸÇßÎÿuøëŽ¿uKЗqÏÿþPµM+Š2hßo¯ŠËßÇWÑdÝ •Òú(„ìÖYuÇñß~éF»-ã¤ëáüÝg&}ž©lšn¦îiNÓ–B4uÙÞ‹oäyL­ô±mêcÕc'è7’¨-# Ô­Hí¬ûÑXGbŸ{[«~“J…nó6Tà@ºh«8^‘ÛÚõäñPÜ£×¢¬/ÛlLj%Øu¤à“—RÄè¼"´³áàñHìsW²§k©«Ðm^‡ >¯ºˆÃ´.+a[»ž<ê¤K%T#«ò †3*­e÷{£†?”­WmŽ¢ >Åa¨àSÔu ®ÝŠDØÖ®à0†úEùwåã»åŧ/‡w/íYÑúòK·Œ‹¶ÖÿøòíPvÿ9ë…<~ùùøcQñÇã—_BžJÕT½z×?)äåIs*ÚÑüŽüxy¢=)ú¯Vꨅ¬Ÿ|¸<)ï£Öè«¢Ï׌?Ppe?ÍuO*ø¤vΧ/Ô')ôèÔžFÛ2öY¼‡GbLcœQ}ÒmQ¿zW¾Œß…—Æ4Îýªg›£¯`|£TÎ#"¬¢žy"ý4¿t”š†îd+F„‡S`šq£ÇïZæÅD„ŸàÑ ‰Xž`fd ¨±/=þ¤oË$ÁDsTŒ cÑœ“6–„¹!æ @ ZøÿÎSÇÈþÞIþìÅM[p2$?F 2æÙ®œi„Éc½0&£ŒÁM|ß…–‡Ð⬄0ˆñÕrŒ&˜Ç‹7àgA1<ꪵ~ƒŒWüÍ ïÁ£Ž`šqst²èHÈÙ®–«ô€—¿Q†Ïš¢…søÉølË‚’Á`œ'„”õTitåUêæ68àÍÌßÊÊ¡G@'}”å$: –s­_/Wȱ¨xødØA}ÿJi|¥}ePDsÝåýI3Qœêòb Üy+úaÛ‰£‚OÌ¥ÔNÔÕÅð0Pûqž± uR=dïO^Œ=?Ãïšãšo¿Àco@J4ÑĉÁÍJã»]‰öÔêËÀ¶q!Ôðꔀ¤ H0\?f’Š•¸©ûÐf%è ÊP €%³(ÇE¹ а~&ƒãF±xŒ¯bç>A?%Hd[Ó¢xÚ=–Ù ;ÃÃöwÚ7¥dh ‘AøqÔC-ÃjE€‘+{g•§ªïÜCÖƒ¸"íNH®¹—M='x†Œà ÅR‹jž¯RZ¹½ÝªEE‘á„GÅDÁàTaˆkÍœÆ-ãá`‚†cÀÂsõpß(7•p[‚#=Ž‹À3!ÿo 9âÿ‘™žA›0œm%åj3wfd#^ñTÕóãöTˆêµ­…ŸlŒJ&—ÁÂUŒyÈFúSH¬×Ýy!¥{5  u×ofIÆñ'‡ì&—ªédÐ'dJŽyA¢ÀÂÎñãDþŽJB%l8dêﱤ.¹yKšì4ˆÂ' ËñfÅ`Õ{Jðm­Ñ‚g.í©.¯|ªøTSø”É1ñž£Ø7Ú1ø†‘ÞÀÉgã!%€( 1¸Þy\ŘåÆd"Q3åñréŸ$O™eY;c@6†4!ÌÁñþº…›Í›Ê´?VšÌ*ƒ¯_ŽD‹äýÝ‘Á -«÷÷»šA «æ¤ÅG b%¶'w' çŒEaf¬ˆÏ%Åü9eŽ2°s7 Ç PX°éCÉUqqË”QUŽ$Oj‡KHmÂL5@*›2˜•ú'Šâ‹á˜ß˜Ó ïœÐ~H gcÈöJMEóçLä ÉRÊ‘Jus§ÖÒ:<,²K0ØÑ\\›PÕa`™GBÅìnÑn,28?SÄ¥™ª\ãx©¶‘gH2ØØÃñŽ…ÊðÏù;ûè•»)kŸ¯­»Vê[ã „Y÷ŠÁ@È3Ëbß-@môðë` Åi‰g:qLÓ̈Qüüæ]jé׺Ø(Å%ÎV¢”ŒX<ÁSNR¾xxÊþQ¢!í *U’ëú„XÝâìÒ›¹´Ö£Pð­Å•†Kš”¹J²«û[Ï®÷è2kHÒ4X¡(Pd{&ƒ©XI'鈆ièÏ MÀ#®L葌EçFyb¶@JH‹Bæ‡os*ð#qyÚŒòH͘§ü  â´¸Í ÃqÔ›àObh¹ÛY–èð”£añûgœn½¦~÷½§õ½³ÇÔ²tct:¾K9)ó¤*5’!oFÜGѪƒÂ ûY‰{bQT=uA2ƒRÍGBZr$]Ôf°Æ›(tœBI¸yÝŽ7¿ç¥ø vÔ”oBÜÂ}7KŒ.:{Í®ÇÏv™Ñrko3„œµØùñÜü8uúè·w>¼FŠYÑbľ ¹Yû‰­õDý¯Vf´¦]ôvãlü ¶3®Z;g“£&J-ÚXùÙ^T>[Q9A£5U\#5½T(>gcÕ¿¥éàŒO—އd GÑ[°½r øž˜Êº¶©ÿ€f^fñÇ{Y¯kl À©7&´'_Š¢2Ûá1òÞÍÌxžnš±l ñdìÞ [Bb$þj‚'¸_ÝvÇÀôö`SÔnÝ®˜~ÏÍF]âX~„ƒdòä<5ÓgBp‚ÎÞg€œ–ô$5¦ý½.ÉýŽ;ïeåpoL1ýnûI6¸˜;’‚.NqvâC”\K’IMÝŽeRܼÍÙ5‰Êá”ê’)‡W;ÉPšÐ¬ Ñ8Mî5¹'rÓP–îuï—3šÛѺGé£h'ûøÕ=€jõõÚÓei¯VŸ×5Õø’þÎÐÜgê½3𬎸ǪÓ@9RÕûu ´š˜GTð«\“ã¡à¼‚úN‡æHS£áôœGŸÊ,îó¼À'ð‘Ö'u!ŽÇwžà‰âÑÚL€šà3ÍJ[$˜¢îÛáñ}#„uÒ£™ºêT'—éµòþïÜ?»×2‰/<·ý·ªx¾¥{«¾¼/|Ÿô*ägš²Æ$ŽÖ-,„4¹¹nœ¢”#1ªtÌA¶‘ýœ¡Õ‡RcÙ3ŸzþŒ?‚ÙÐÁ†R&–ÍX-¯ eM— ”,ÕLj4ÌÖ³zŠÓ*ð$Jµ»PXí­»Þ„ãÙ§'I¥,ŒkJ¤´û3RÅ¢ªjœ¾Ì!¨’6‹òp쇑‰`™gj^î"·qÖ¤¨îAØ„Aض­_¯t*ðŸX‚o0”Ç Šáw,AKHƒAKËÚpòÍ{-g€ça¬À‚U¦8…‡gá<–³Æóàµá`/ãð±`ˆˆJ?xŒyãtð ðh:Åg`I``/'½Á‚;<`$K 8šC‚éB\=w8ó'ËY1ðß{ÇÇ F8QfkÒˆ“¤àÚ,lÍOòÐYu«ÏÝ5Å]SÜ5Å]«˜G« íËÆh ° 0&b®ì¢¹<ò£¹^­¹ëiÛ“qS·pyú`òh¸òêè+‡f …·(Ù0uÌoÏ÷[E¾Ÿ;¿|‰±ï=#pMäŽÙ¸vÎö¥lF<{‰H”¦m>ö2Fm×îw“%´ \U¤¸›*¥¡xh„Û†÷¢²X­¢i¯ûß­ÖÝjý1»ÕšË[½cù}4ì—ãx-wʈLööâppžN<ÚtxmduušÎVb¼î2áU˜ã+²¤÷±7ýèø;8ÛY“ áš„EY›„vzÆ!¹Pþ¶§+!¥ HzSmÿ‹Ç{‘¡Ç4^‡y—0Õ·\çº0]·4H§á°O¼hz#é·Ûî„ÐÕ5Ž;†ã¯d´‚ ¹uš"T.>10É£üÞ¿ånœûI9'O Žøs{Cq§pÀI¤ $ác‚šÎÒ° }aGº;e{Tk.Oy”ý—ݱ.æYLS°DíÞŒ½Ô%ð"–bàrH[}>–¸á>O'½M]̪ý™c$ÎUN¸¥"ʶð ¦}Z¢¦7¤UQB¨g¦O+GlDEHË“|åÛZUÍ0ë¸ÛƒpÊߦÂÓª©Ý'¿æ Ú<‹6T{kø éÓ½%芡!l}Æ2ÈR”NÅ}™n!9¥RœV¬@¼Wp¬P*7Vl¬ð°‚Xž ÿ‚I·€ÜŽI¨SZŠN±Tg®/co÷øì»ZŒÅv ÖáÖËcÛÛ¬°Ü=çz*yM¿]²}#°f¤PâTM –.Øy[vaU6+€IN»°ªk7íRp­R72aø׫ëUúÖl-ƒät„!jÕ¾&ôÀ_@º[¢(!ä>Îä2³¥"…•Õ8tˆ“Bn\c_”•<'ÒW¬ê`€$YÈ¿n¯Î ‹ˆÁ×nb×#§û§ )\›„¡–Å\#šÂòP«f7E>_2ËåF_3ŽM½ç‰|¢®ª¾<ø_¶Nì‹ü+ªXd˜‡+ª˜ÇrBBŒà8gm äte¤O(Èíæ~e¥™Z禙LOv^ÎÃK<ÏÎ…6Ë…òð}u< œ6;ß`ñˆ/±Ó›ã|Ú)=ŸL·`ƒJ lß1ú¡[¤¦ŒôSŒqï±ØÅŒ°¿Å.Æ;…'Š9+e5êNçï ?4¾¥isq{›cŸÑÇ£ïwoÌÆÍ•x“M·[„}§ËÜ)¯Ùt. á¸: ÃW“ÿãb9‹/ãÓÁïà›%8 ³sì> ìþ¿w¤Ö‘Ñù ïß,´gmq'ÚOV²µ¾ê¤w]E·© ƒ[QŸ.Ñ»ãC…Whu}ª§[¿¶å©?l²95Ó­™š‰'½B©“l' íªêT÷´û“Σá;-|§h#O²P¯¹è15ZOŸ<Ãï|;|Aï AÌ©'íc^ÒÞ FÙû°¶ `ÝùwY‰Æ ma ñ`P[vZÁwàÙâÓQ…qƘú0ì ¼ñj¥€£A›ÀˆQhKë¢>‰ss‹×D&0‘áÃx°P>Å”uÇO‡ÿ¤On5 endstream endobj 7190 0 obj 4551 endobj 7194 0 obj [494 /XYZ 40.7999999 475.219999 0] endobj 7195 0 obj [494 /XYZ 40.7999999 785.299999 0] endobj 7196 0 obj [494 /XYZ 40.7999999 129.620000 0] endobj 7197 0 obj [494 /XYZ 40.7999999 475.219999 0] endobj 7198 0 obj [494 /XYZ 40.7999999 129.620000 0] endobj 7199 0 obj [494 /XYZ 40.7999999 785.299999 0] endobj 7193 0 obj << /Type /Page /Parent 2 0 R /Contents 7200 0 R /Resources 7202 0 R /Annots 7203 0 R /MediaBox [0 0 595 842] >> endobj 7202 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7203 0 obj [ ] endobj 7200 0 obj << /Length 7201 0 R /Filter /FlateDecode >> stream xœí]K9r¾÷¯¨³©I>ò¤î– #ÀÃcÖkcáYXÞƒÿ¾«:³ººÉ ’Œ ™U)#Ø™ÉG0ÞñůÿøÛ¿þóo‡_ŸûŸÃïëŸÏ¿=uÇnè–_‡óï_>þƒžŽF/§þ¨çó¯Ãï<ý<ü|úþôýôߟOjx{pýã4xùÄò¿ýþ×§_—?-ÿòÛó?Ÿþö}ø§Óÿýåð¯ÿvúãOëûÎ?ðÇÓ4ç¿ü÷ò¥•žNÿóñoçÁÿzú—¿;üõ4…éí½çÿþÒϳÒFgÍãçû£êí÷ÇG¡vÈNsgJéÓ<ûÓvüï<ýùô¶÷ig«Ô8رK~ë¨O¯§Îæq8ènö^ê­-íU*ïE}×)Åñ¢eF*oiª³cøUÇÉeFÝÛó1œ Ÿ&}úûhÖ_˜¥›nYú˜¿‹—Wå¾ètK™ÎÕ¼QgÎҖ㽊xúÎL+Õ›»Ð÷W徨W–çE穼¥]¶Þ{Õw.©¯\ògàÁ¯?ž~ý6Ô|øñçÓ4ÞÄÊòÇ?žôpøåÌ*µ:üøÓáïO²eø‡Ã¿<ÍÇþ*‡– ŽtãÛˆ=޽ûŒÅ?£^Àgfè™îËÛˆ2ÇQMçÑëÛÌÛÈI\ý ?<¿LG«gºoàøŒRo#ÃÑ(ÝžÛWh=À+…g0€+Õà –ïŒG3wÎ3à¼;ë3¯?NžG®óY¹A®¶[ȵŸÖOÚqÌäMsÙŽéú¯ëþ=)}ãTíõôºøn6o'ànå‘Î@#ztgâ}|V]®‰]’f2­¤¸žOÒˆ7% }Ø[N`&àK¼ïaÞš¾ åAÎ&™VŽ KÄqÁsLßXýêþ(H}â®Ïw®Þäx‰Ž¢úËw\Žk×~«Ô±·ÃyßäaݳH߯À‚Jº),÷~‰wé Õ_";-) úÁ;½ÁîD ³H5¥¿>}“ôΞ£»ÐUýRú2ëÀ÷\.çsäôcË9òÀîmAA€%it“´v¯ã ,ø¢ÀsõÎ>:ùÀ¾z—Ú{{c¾êÝI»k,ðµ‡e=¬° eÍÈ€©°ÒÑÉÒñ–7€#38ò±øû•0ƒghDëÑðÛ48ÏM\’ϳr%y{ìO})±ær £k~c?<5-®Q­¶õ8 h‚-%eûŒ‚ýP}(Šaq …±dÒíalxqþ©‡Þ½¸÷zÅàu!ìö¸=®“ D¼ ìü=ýÓ2ñÌ+W?÷<'þ;ÒÍVïs¾(Âb„Œ¶%¡ºã°D%®ºÂEÝꔣ+À#—_‚y•nã“´Äu,C&2'¬AÇ¥3nÄÃ…ʨFG¨øFfºwÆxÜ"έ6)ÃJ™ w©#mýðžmCÐâG½{Ž -w§8hÛ¤€¹<÷¬"†ro½#ôÄ}Ü1I‰f!”Ñt’ñcrâÂNÙÑ9ËÊ‚=¤ó¸ÖŠÕ„+Fáç¢~pL<,úv’bê-/]¦ÄÒâ&O,†âëd ÆpøÇHÒž rd½` ßaj°#—#¦ŸYÂ&ª«¡@Z· Èè§ÉÿpBJŽôeͳAˆ* GaaK„X1üŠú‰Ðâa…Óàg(ÌŽQW.žÔ`_ÖíלÙR„ø°¨’SmÁ9l³Y0ÕÃl |ã—gI¡D»%M’NçÛ—âÖïÜ)s™C+Óî§LxfÕ˜ ˆ½ø…2õY…³¯Y–$̆ )V+¥@’µ ~Ï.‡¡Ëvr+~¾w'~å9 œŒlRÛ¹ìóÍÙ“Ú¶—Ôf†Á9Å%‡€¶+)R¼›Ñ@ÎUûf†¡"ø6£OÏ.—L±©ËX;³eÛáfǯ•£'õn£$žÛ Ÿ¡; i±‚ÒbÒ½«G¥»]a!`f^ŽÌÝ`õ;êÄÅ„ò7}M¼ˆ<Ï•@òEǵ.yؾQ\©[ý'}yý¤WdH!Zp³ý[Ê¡P<ŸYù¸tS¸×˜ zO'ëPbј•Pÿ0i"²faÖË¡R`²1r¨)'¡—ôÛÕ;ÄX eÅu|u´¸EåA$—ä'Ã%9Ày7ÎêÀ=ÏÐãb³&`Åp±G®2)§²V8âºx”ð¹ð–±ä…¤‡‡â £}"<=4ÂZ0“B˜a$)È»VOÑê9* Iç—Q¥ 3YŒøfÑ8Üöˆï­L²€µ|²oðò²°sŸ'ù.Ǽ串rÀsšÉ´IçéYõG{þ¥V¡âpTë²Hà¬òvVX&o5Uæ_iI9qq€½ |9¡µp¦!÷”çJP¶œÓÌnÅÓ»G¤Ä„G­‚ó@ÅR´ÚiÀwA§’˜mÝäÊ—ê¶rẤ¬D/°©çÓa1«XnMu°ºYuºúkÏW³äÄÀVx^†aˆy–bÄrÜI„JKéBPÊé² £]²gÔÏH1L)¿Ü¹P}.„¨3 „q ¥«"î_!ùÙžÚSºq L qK˜¶Ë—·Œó舤¬¸u: a ­s.@)}8æ…QÊK*ÍÚÞÕo \£/6œÉN)ÜNpê_r·¸¯jº#)[,%Û|lB¬‡T?OqÕç7e!7ýB-Ì|è>Ö|8–˜ç‘á½ÑV¡€©ˆ$%Yаw(ƒÁ ’ö2n•dzµµ®Â´G·Áæéo™ã•C¤±¥Wç 1’8dº*ì»øx9D†LŽJC‰¾¤hܽËZ¬§=Ždfá\þè”yoHñˆøV Hë¬õNŒvOÅŸAeî Ãïz×ÃSÃà[€Â®î÷ܸÖ•“M#ãî„ßšîð÷ž¢ÔDù<&÷Ñq\$¯3Ùœb”j|ñ§ctcr¶(~ °d:H$/8"-t±ßGˆÇý“$ˆPcE´¨’LyG‡&´z¢ôp 5]Cáåg(ÅW¯É:YÃ%ˆµbX 9^¼52Yn…‘ 0í?(XÒeŒ4ž­€Ã!ˆ,'\–ñBq›Qš2ФßB¹Š8_‘âh—)(¥8À½ïÅù l­ÔOF‚ùB$•Šì§œñÓûÌ*dÚÁ(%j%#ÃWÄ%!!iVws2Ñîì%Oål¯N¸½ôûFj·ÊÙÀ{ÝVõº-!÷a³¢yLž8A䓵׿ aíÑnÝÊRÛ€©åæ­åz+»^y[Xw—d‘¬ÉzFw<cÆmN!`RF)½åamœöì@*ãV””„;›3oµÈÑ8¸X˜LV…‚Û%À·>@·”DDðÑL0ü—ˆK›~…×ÿ n Ýt8Ï^”|GRg‘!¼!Zoˆ”âê–H³F¦²±­Þa²H§VH1L(÷ƒÏö’Æ%q.‡É•*øúþ­ôJ.椎wDÛ]>FííRàP‡Ë'Í3¤×á{!}àQÎx™Ï5–Qíª”;«þÎDļ¾ e£¥Bˆâظ`x¥]´{p4JÄ5ÝlÅ´GÜ–ÚPé÷Í@šölÐa:&xêË1IZ¯Æ82Dº­\‰±>.›@ã#˜.bžò5;d|†$IQ/Úϵ€mtü¢4,Úª©Âw µcÜ'ŽU;X½”à¥0ÌnBqQŽ£»µ-Ii2*Gœìåú)w¾z0F&ûF¶ÆTÕWXn×ÓT8Y˜/È=µaËäãë 1J,ÅoAÎjíl#³mŒÃåïŒW×(jžA>’áƒ;gnÇž Éý»Æ·Ã½ÇúäÐÔ*•#ŠÔ|k¥Í“j%³žíèÜ•]6Ôsm³B=ð¿xÚ¬Êf Wfõ‰¼/ß^3EêíÝ VK[¥„è&GÖ¢K96œhljÞ*ˆl>Ž4/„O»–ñˆq’f|—a˜DÞ÷ ÌkãÚ¸§-Æõ»µK™iÎ0ò‚2éUNC!ÅûÍQ*•B Tè0O‡)NKqᘟÍ"ézšœ¥º4°dýÀ7‹#t‰ñ·d`îf5=*ÜsíJçÚ5œƒpoQ ­ÚQ§Ý"bȉv]“ÃK9¥ xû…u½j»0iX˜p„”x\øuâR´b¦ µ\¸Å\+ʤ$¾ro®ßŒó´áF‰œjcky¢‹¯ÝŽ^<$°KÃÒÒ°æ¹QÑC>B8%€y$a•Gí²¶ÝŒ…º·m#_ƒ‚‹ ÉfdÙt°•ÉŠÎR ¾ hîçno](ë÷” Øtã.“šNŽž¸ªáÇ­C¯¶3³ÁË Œ@)9¹óRJžÖ^”¬ ÙzÌYÊfN¾çg à ‘;ÄSÈ{±÷¼µVJÎ[+ XÌ»—Ü‚&„ŒçðíTóˆÅ£Ã𜞪Bí\3`nq?Ä:9"þ*rí é#±@Á,”1ŠÈšp.^TÄ'|J”B´t“dØýìpì{3›ë£tr$°Â<P*ám9Iþ¬n`LÇ«‡;Øœr™ö`‡0Ë©éÁŒ#4‹å-T§øÇe»öTJJˆR3 T'qή˜íØÇ³pꕌè¾{vÖ BµL%ÂxÃXІ„ЭÈyÉL=8ì‡WåæÝ)"ø„HÉ9Þ…ÄpÊ꬚bÆWÎŒëMèÖvkD#382‰‹ÐI¹DÜ\‹lž—€×©¹þ8)é42Etˆ·fåædp öaV4í«•Ä°0Þmݶﭒ;KT4ë†hКÎÁ²´é{ƒP½w²dÊ‹EP}z@J¦¼$@ÀÖp Œ=Ad¸Oya·&½½ É⊅K$»]èÙ=»V¬I& Žê”É‹„V·Ó(L.Æçh`/ÃèÞå®×³#^Á 0àb`Á×—¸5"žjFK ’HŸë=ìVƨ…êðô††C žNñÄ ^J‚ Æw­R|* Ò¼PùVô¶‡¯R6iá«t(•ѱV%äÊÆ]Ï.k†Y¦{B~~u¶Î£7JXlÏ£Áa¬‘’žrЇsDAzè_¨3b{%å†Üž sxÕ™V‚áçIž½dfz?8’hC¶ÓFÊ™dE™Jל¢¼•œŒ$-}}V»W*Nneñˆ˜Î¥¶-é ÕœŒ² šqï]÷õFˆÍÃ%±KÆÁ¹·q¨3„‹3$ %2˜ôãE^ oK–áeæ[fvÂ)€ˆ|.J ÅéÀ‹9˜p‰(³÷2ó(I2äÀ3–­@ >I¦½÷½«eV7LY²{eì B Ó©½ÀG¢5ÆGHÀ¸-ä¯Eì /)ƒ+Å;R²€„®s.`ëù²×Â%J…|œø|q*;8g¹)w†¿—”ájœk![ð¡N5ß´—Wº¸vp»di¼MþÓüÁ‘îrúcï>cñÏÀ3X“!o]!•aèz‡$ìÑÛŠqš®^Ço’ƒ1õt‡jÖ8‹y–žÆ"kÍb¡ÂË! ¶'¨"0 ¥Á…ÚUR0ò ꫌¿ªŒQ$Š{j]¦½íDÒ9™•÷€¯\ÁàË#œNÑÈj;ÝS·]¢„€Ú‰‡Í`’ÎÁ7‹_áÖÚKJÖu½#wêç³cÕy«€éÖ5 ë71µ†¦¾×äF/9¹V'뜔 ‚ÕÞ/:rbä°€ö yxFq—UƲø 䋬r¹RóþÉyhZz×/tú«%äÛQÀ›aú VË3¤$¸­8*†Gbo ºÝþ†iöŸeÈ2 ? ¨ò©a³«áîÈ ÛT kéËÚZOH³`Ð Gl2Ê51ÕP„lZÎ\£6³UñÙ! µÓ¡¼³ ¤8X}‚j"œóŽ€d‡CÛéŠ:"] 6§S."≔Ü3^>žîD+Ö]vxÇ]*Þ»`o¬™Ðc",㮕Œn²Òm²)Qٜ໻Yvoâk«iÆII0ˆž¬1Œh)lG3÷_]óùnô° ŒŒÐH´#έ‘¯àÈÎ|e=Æ€#âJk¯\I×`MeûÐ2ç¬JÀ#\¡uo.ðiɺàï^6±Ö¾îk¸˜Ï ÒöCV¦N“ÇÁaù¨Áz—9^™*™Ó1Yˆ‡kÂåf±)!ɶŠö³'@aè«(à˜m\ŒîÙ÷ D&Y@ºv%¹Ò&qþ_¸ZF¦`UÖE³q|e„8Šæ„Í™i{* !¥P£®]ÖȃÌà žVÄ-³–\/H-ƒ‹‚Hˆ@àgïªÄ®JÔW%r¼‹,5ÖÊeõíª„¼A;*~p”ÈQ§&Ñ­é‘nï– ŽwU/Øyeràb¦_»„Þ;¹%IY2ÍŽ0¡ 5°ÿæ$í`ôcJít¶O«¶K›«â™1¼ÆBΰ‚s` Š'²ØÐ©¸>/%$~°Ä£ªbVƒ¿}Å4âi¦¾qšHâ (= „³™M!´ERÀF6 ŒžRÄ‹W"¥±Çek¨2@׿ ¢'¢Ü&'ù»á6ìYêbê‘K·\¤’'qZ;BæaªdùGBqÙ£[†a;ÇÆê]Ì5Cò€ 渀·dMo f¤¶ä/ìÁ‘,ñ׳+2Ûˆbî¬VE”Ôt–äxss‡2¨šþ$ôM xsXƒ"”z<¯¤:K±Ûq¸¤Àþ°„,c^(̪â妈pΛ½iáŽGJô1ìáVø íñ³-†[V|áª;IÙ1*Gxl¨°O¶¬W³³5{uÝëÁXçDxS$î¢ä“…Õ !¯ŠDGV6Á!œ€ z÷ÊW¾Š%S'WbíZ\-.§¾%ã.0'“qé¶u¹Ûék½ Yý¦`zs1¢(Ö¥~ÇÃ£ÔÆ ’‘âð\uyœdŒs6ÎÍ–†xóÉúÙ¥!—'«/ô«AHHÀ€ÐÅ[ÏŽ$+Á,¾<˜·s"þb °ä¤ÜÅe „Wj'ÅÀí%ª w¤„»ñY2(©<ß^]*F1áHÞ`6¡\é(¬ë gŒÇHÛ¡8ଠ|½}åâ¯î¸ fNføL·\ªßÀ‘WpvÝÂnX ˜|ìGßa‹Q'ì|ÿŽº’5¸º¹§žpàìٜ٠;2Úè ñŽPíb#evd¾HtóRÂ\n>óµ(ïa¸…ùBà0ðz4awÀ½„´`þ»šà‹³qZ <<_œ{î8oJà¦R—83xoG˜9ú-¤§hx¥ð™–”üKòÏ;2M IòÓg‡‹f¡A”^ÊH€faþ?JË]úsKÿ - t9éÂt4-Óeì´PœpOèj…þU§ Ó@Ç…Ox“Ú<ë¢'¬sΑr°M´iWæ´Ì|¯§ë»œh_NôSaº|9ߌ¢'<Žû Kð®‹o›ÇŠÞÍ`’lß髃zq$¥ü×®ÇØDà;šÂF©q(ÏËܯŒtáê_»¾ÕOÁƒüu‹KUuÇaTŸ©"žfG•F¤o?#…0…ChW¥sð£meD!p­#hêåóq²éŒ?‘ò§,¾G*É@£g.±f}Eäÿ¦w}(γYR[‘ž—ÏX\ˆ ðŠŸA¹–Yuˆ&’ JUïÌZa0¤›¥Yl–&°½xÅYÅc;¾Â8Ç¥\¶Xɇ6Ô|³6rXˆù=5çêÞê–_.cº1Ò]Ô±wŸ±„gøÌ =³&ˆÉµ~Í+ø¶µ|òhW¿Ž|ƒFÖ ÓÉÊ^ÀÔË¡ÜMN4†ú5΄¶c >A˜_Rܱo6«ë˜âèIGöK(½†˜XäˆYYG "MÕÄkqî»°X ˜”ÖD÷Ç9qÝ–%Îûp¨tÈÛ<¼°‰—Ó "§³ÄnS±©yé— ¾Ò™*”— Ìðy§C¥%âv¡x6g¿!³Aiˆ~#9})N$#Ìø²R0@w j9Kâݼ–Dãî´+w–oö¡:LN mÆD’HÁó 'Il²o³ö“2ûtNEÁr.—%‹öí ¢çqoö{?œÎÑÛ„jq(iî°ÃÍè|N'kß(ØR7ÛBÉæ )sáð×·2#)\›¥• µÐ3öe½$ýš* -9WWÈV”,Í]á½·=¸¡[ðÃZÂeÁ*$|+WŸäŠó·>Ù@æÂi®®ò•nFcz¤{A-Ï1í 2Ü10QÈ‚œ_¦;KÀ“îíKkŠzFi“ >S¼ï¬zo— "¤*ëF‘í@´×5€Z £u€(Dõ#!)æÀÚ€1 »ÓÁXšðÜ(Ž0Àx\àJáóñÒЋO¿?O׿t%Î?°þñû{ä_Àîz¿¯`ðÑxÝÂpP§eÜŠrÍj8.9ë¦{oÿ·fáÇá6 šíàíz<Ž·“zÆ# +7æ¨ç›U{}fç2ù[ß™Àgfð™…> endobj 7217 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7218 0 obj [ ] endobj 7215 0 obj << /Length 7216 0 R /Filter /FlateDecode >> stream xœí]Y·~ß_1ÏÜj’}A]  ÈC‡@ޱÅùû™ÙîžÝ%§HÖÅ>46`­ÕÛlźë«7üü÷Ó?;½yÿù?§¯óŸï??ÔUÝÕÓ?§Ë¿?¼ü ;TÎN?öC[ÙñòÏéë/ßNß>=|:ÿ÷Ûƒéž^œÿ8?\>1 øÛ×_ÞL˜þæóû?ŸúßÉžþtþ¿ŸOýÛùçñ.¿ðËÃ0v—þ=ý`¬±Ãù^þtyø¯‡¿üîôëy ÃÓ¸—ÿþpž»soß®¯š§_¾ }ì¼CmÝØóÍå?íy;þû‡ŸÎ£]§Q1}×ôuö¨½½ ësûîd\ ¬-s(î@­idºÌÈð–fê¦EÞúîüÇÓ2 {ë¯Cq:_E™.32¼¥-[EÝúó1v3Õ;æBŸ‡âÔôƒÌ@—ÞÒæ­ EÞúö<²ÐÖ_‡âÔõ£Ì@— m=ðJa>Îæn,ÈÏ*NYþä>\ÝhÄ¿:Ÿlê§O¶M»|r!˾k;Û¾$åéb Ï”Õ>ýES5Óf½ ¹‰²ºÊšáæÍo|bï«`®Ïß3þ_Ì×áÖ»þgìÄu©Ú¦»Ì)c3'@=A¬/ÜOx9ð üA‚ 4Ð\1ösâ¬C5ŒµG&þ¨ˆ 'üF°ÄB>D­‘àˆÄL:_£PBEGh|:t^ÃtN‰JøJaóúUøIýˆÿð½bfš¬iRÏ™’¤s÷® Â}h'Ë/%èEbHûƒ©•t)V]ÀT–@ñjáÍȯ· fIˆ{d¨šùQ#Œ…Üë” P¤ÓŽ!°¬|-ÔÉcüÀÄ$–©—¸—¹úAß‚ÓDXþƒ$}=XÞ-=‰â„u]•åL@NÔò{_G”’Èמ S8YaÐ1˜úv¸‘Mƒ~˜Ä¥"y&ªÉÆa< 0D=ék9ù9!vJ̄΃ÈŸj`rTØG¥pðɆó0ñÐfÔI½$FÍ—’æü™Ôî)òg9D\¹iåÖ ÓZÇ„ CCøYÁ×Ân £ŠŽ* ,ÂOà CÓÏçyðuØ*-‚Ž_x»Ž¿5«oúfðõÊR®Y•Ô·íTžrR-9b4d\iþÌ8þ'DÑV¸#…qIƒ Ω±I«ë¢ùƒ¦˜Ú.‘âŸeG×K¶è¹ÅU~8£@šA?zÄCÉ7Á(šŠ….†ƒu­·W0 È>!Z`0šÈÜʤhìÁ]ív ¹ÂiU„ èf²#B½I­s¦¿[‹ ì/BÅñ®¡5Uūю5ò5‰ˆn¤[Ç•‘ü*fÈ¿y¡ œ SLf׎©4n˜—ÏÙýE ©úúŠE€£<<Ú6À {[òÞ_P[´ Üarq¡ ]Î7HJc.EIçú¦4¬hdçÁÓ‚Ï$2Iâ½–³2¿°Íˆ2Ì;Áõ0 Œ…@q |ç`ègøÎÁSÌCà“凃©jÜ»³â_Mx‘‡ËÓ铈 H%H¡¼×{oÀ"µrZCZñ„R%ŠúõrÁöéRöÓ.W˜÷%ÞOÇ…×LÉnçÉ LbŒH¹à¥Ãgy—lwxŠM‹ÖŒÜ^ø¦èäægüiÃËËQ2 %UEñ1ÖÆLj\dD:§¿¸QßIaËÒ5úúI‹|m:¶™‘ A™m¯ÂzèjÊB€rÁ$„›@Q®&4è\Qÿ|Mïªî]ÕÝ´WbY¥»à5øÍÐõ4y ¢¢¨…"¶D2 ·•º ‹nN^{!,a`|w"J¡†EgŠ:µh H†“H˜æ!ýHÜV Z_°¢aIÑ‹D0ƒ©ÁÉbbÃÉŒ·ÕÞ‰‘õîõNŽÕÓú^ÝðI½®¾õßiDß¡wÜûE£œ5ºç'#8Ú¬+T¯…Îi7ž8³ÜèIoÌÍB30ÁÑÀ•FF«¡Ñ(ß©Á=xN[A¬ÜÈJ[p= ß±¾ú™¼oF[]˜=@£¹’h ʉ1©Ù¢•‘,C¸ž•ù*À˜¬ÿíÅ×ÃŽF@)#T6‚r¥Ül5£¼f ˆ‚û¾Å›ƒ&+ùÙzbD ÙF6þ^FÂH>2`dYº 1›%ÀòÉ^{’gÍ´k¶fuSdû0{B@£!…Àö¶ÄbJßÊèæp`H¼‚Ì¢ÚÕxbEëæûUà0”„ãdñ! z‚)–J˜í°¬ aéó jëX‚¡Ó;º×L¤p9Â+e¯"¼[ù¢†4Ù”Ï5b¾vøºD6DçÝA’ Uo徸* Í;`V‘¿pmÁšÿIÂ?é¬Çø6Ðú‚&<©k~iˆõÕ£›2vOaQ@r‹_Vï9Ïé}ÃiÀ„ðªQBeºšÊÁ›³á½k{Àí,—Ÿ2Ù†ôXŽoQÖÇÑò3/îÒ$ÝÒNé|OF–€¾ÂQUxNz¥Ä8‚æ!SGš6È)uZør¼ÜÑ mãK‚ØùÛ‘óšÂ±%QäbR}ó}À¤£Hz6d2Ãó/ f÷=Ã34yŽÂIó›bËÆäÒ2RFq"¸IúfjJª©·!ÙÃ1¸ ¡•›¯óFøÝ?ÇŒ¶ÓUÉÏ>¾¶ë8$)ãî¡$w /`5=˜+¼ùBA$¡+±¾¶¸òÙkv$4>{(œ·–6£–è îyIÒ­tÃÆ²n?‡H”‘ã eÏl&Š€ìW€ŒÃ‡°¬ÒDêºE`ãåCÒ#22 ø£foo|Ýs3”H&+¸‹pfYÜ„˜5ÝO$­g­¤ÏÄ…H"ÍQÖdEHÏÍ9í³}Bêv¯©¯Píß½Q:ê©™¼Ûôþ銔>Àì–FÛ1¢µ$!=Ô‡0FDô°Â &DDUcäEFÍOM£{'Ë%‘IxéeKã0ãX0 YˆápôíÚ®[ŠêwÆxÒf ? ÊðÙ êóK e ÈKWÙëdglN³,”´ šš†8qŽ÷“U­»çLé²¼¾€e÷ ¶OQÛ%œHÊp%²!‘Hax5Œ¿‘æ’™G/ËGˆh§¤‚Òyt ÷”Õ&k=IÔ”}㋈RÎÙ½Rr±[¢-s¯ƒ¾q ÊÐK,Òg:#"„ÇÛ#å a•!LI(fî!Í1‹LĸÕIÑõœ¦ƒÝ%ˆnÊ­Ömr€á£úò°ë=ѰÇß ¢ið ‹Ur²+¸Ç#nÚìå Ú`¢Õ2˜CøKŒÈX’ÉxX¿ø8ð…¸Ä[Á E3ë Ù`#x.#…á'âÀnDÔ|PßPGÒ` ­C—¤}V†q:ÉÑe&–è*9lŠì[;ö¶½(Y±ü«2Í+ëôšU*¶õ¹ÄtJ;R$ß%¦`2àzˆ ˆxÀ¬›„á˜Û©,,Öî¥-V)Í$Zè© iÖ²,.´!ß‘qùY@~ ¥¢©Ï‘’’œ4'ƒÅß›ŒœÚ;(pds™H"±wtI‰¾áiꤿ]{]×7·DüéËZeLÐ ¡Ù—ËŒ7Óþ·ìåóÄá’f ‚ŽDxwçhüxPBøVE%g9D )wÄïPÛÇ„ÚÖ,U±'v£¾G4o¹Ä¾átç7»oNgܸד«§É¿š?ø¤^®Kßúï4„wàïŒÐ;³Öufž#Ⱦ×3“©«É-òâ;ó¡VMÐuuº ¦­&Þ¨3¨ïÌ6tKäŠúq1zÝQÃá%[,u¡å%ôFÙn13ÑUqp0$"øŒ¹ê•eÒ^Dà2áõ•éŽY5N“ 7­Ç…·hqrçú9S"„V¦J£äs¼ýpÀ>YJ"¿ˆ¦/ÅÒÍÔN”R…i(åpY¯Èõ£ÔðÓÚ`¶© òÝž Q%È÷œcº„#Ênîšzæ»lËQ·ziÛ²P3JÀYÇÒ è ˆ×ÁíÆÔ) œˆ…´ý¤ÆºÛÑÝ$äšhh¥¼!Re&)²$ÑHDƒm¦½±Õ0ûi#wqWvo¾ÖoA¿ô°ÛÇÐw8û) ´iFÙ†ÖcÕG= × ³iTˆ¨¬àßv扊£•N¦]…˜` ßRó×üeÍSÔ·w-ŒÜ¹RÔHÓ£dRk–Y”?ÈâAø‚8 T:‡½ºñÅ(,‰4³šÛ«¦à8J}q€Z>5:°ù-Ì:õ†k±(³^Q¸´¦ó¤ ˯ˆ0<ïRX(QÝPBsR,‹¦¾føá§4! JŽ€KåxÚ¶}½Ä5s<ð0ÇÓÍy”}5Ú×9žÆÍ'd}ã|>ݾrAc¨‰ˆnåx‚ÙŸ¦¿?óBgÚÄ埂٬ϥЫe™ÚѾ^ÕnŽ=*ò¥²gÁyØw6_ÜOŽšc¦<Äî·­'ÁÁuj%\ø‘4?ŒóŒ°¼p7-íÔÞL™¦0'M”Ðt€Ý9€À*>TJ‚|pìÍGèWá'˜$=]9žf0«m©|A"BMh¬Ijv‹mß¿ÈíG€û":ÊbBâã!˜4›2®|UhÐÆ7DtvI“=fQ9»xÆf ©[÷Î_ˆOàTÁÔ³EûÞ[Ñ=ÄžgîhÖÞPÎOk$û·z.Œ¶rÓ ü¼DÛÉ5›L7³Oö;$/vG&‡„bÃù õ\(4y'(Â4úý” èúq™ñ8KÄ6˜Ï#øä#ødÀ?1 ôĵàhïðO"ßÓµ2vþšƒÙÙr_mLŸÜÙ'¦˜âÞƒO,ôÄ”S)HÙðz"÷¦8Âm€W Ï ÞÑÈ Àï´o §ÝN"€v‡dQXÍ2 ÕַΓ/JÉ»ðEz"Š #¾G¸àxZJ»Ð$jOHecŒ$á¿u·¤¿;)+;d2Ü.k£‡È\U‘dvDB'¢Û—Ž«ƒP“æYh`Pµòƒ7Û²ðÀJÚÞ9^ÀXµ=ã|â—Íã;VÄsÃ(ëiáÞÌŸ “bYZ¸ð‡›‚1"âS(«]hbé´Ç¨Š+0{Q4Û(…Ás`–½–¿a}Ãaÿ¢ýœ…;Æî9o6rs|5•äv &­ì ;f¢Ë ÈûÅ¢¹ Lű¨Z*ƒƒJ(ܦ”ÏÀA"?­o(…s¶¦‹‰w¶W„Ù{ŽJÙ•v\ü(%ãÛ’»pÏQ)—rÏö˜éÒõk܆vÉ1Ù@¶Go®ÇâñèSÉ Òlÿç êÏA‚9ëÖ½f„t£Ù.ª•ËûoŽàðÖíèIŠ}÷ëÝPõÐR2$ƒè¥Àœ9%’ÑyI©ð®tÂ#5€âê†ßÁ3"à·¾¶¼5ϯj5·/¶VªämÿAR$kÞmsë¼Í„ûÒ·ÃëC5ÖßË3¯º‹ýÊèýÊ,BL¿lïó¯¾ ^žþŽÕ8<ÑGΓ`”êÍUn"2xr3Í™ºêš§”ç' AÌâ[ 53Ÿô£+)ÉÂà°téuVÁL» ›A©‹ŠwãF"ð9 Ÿ"®Lø¸EÙ¬Œ](<Ýóð’I8X0.×ï5kSÓçã|¥´‡-â}$”çk+gh庀yiaUÖÚ½Qåuœ²‘žrð!ðû u™ Õ¡&ÌóuSUY@¾Á–ˆÆHÜA¤T¬p['Ò ùýq×Dås]ë±0Œû$nâk,iD:VY§CRZ”¨ú@(ô˜"Z‘©1ŠŸ0# äØUB²Sà0!cs•"¢ž­ˆÆ\D\NÅåL©N"­¤›ÄRtë4Ó\Qb sŒš¤ôŠìl.*%§¯PR BT|'v¸Œš@š@Y)RÀhuCú 7ÇÙ1ø5ë°ÞˆÇ[&ÚW^úà‘ð¯RP 6&ÚN7ÔïŠíœwYöqßµg£à*ûB88pÁk¾Ý•ac¬©ÚW‚ývó]•Û%ŠT/éöEÆx~ÐùõšP Îøê!dy·Göd°"°ù` ¤F(à¢ËF|‘ú=ʇ¾½2©å„wÌ[ð°Gù’ZîªÞëÜíµ"ì¾33SWÓõÍyéŸn–wòûÃ}Í­%ŒözÙÑ9Á¿rÓB_¼w<‡;«ƒ3˜ïØïÀÝåánì𠊥y_š!&µàƒÆDe™’|Y¤‘3ŵ!tâu«Ë¬Œ\BC¿bŸŽÿí;Ž1¸$jÐŒ6jŠˆ®ñdÄžÜÞ«4ïx¿:ìx—HYFÇ\ÝsÒ¢ª/r®A/ >ZòÄIÏÿž¾Y¦éž¸àüÇ×_"<4d¾õ3óýe¿ÑWÓVrw2çeÜJQM7%Í\í)ø]Wu·½–cS[3”í«þ¶$îo<™6ڹʎ7SD۶ꦣõ)ëÖwð|gRì{[ÙÚÝ*ݾ5ÚDZa%õ­ßµ‚+|„Þ™/ï­'ZÇÌ5pïÌ'†Yû<·§ À ºË϶5}ò´ |¦ DÞé`æ8:€Ï~’ÚYõ"(Ñ¿ SeÍ055mðå²ÔŠ£„wà®À7–°žÈI}¹"<ƒ*>ã^CÝUæâ6|}A |AáÍ%+åäéÓÃÿ,¿'W endstream endobj 7216 0 obj 6200 endobj 7220 0 obj [496 /XYZ 40.7999999 306.259999 0] endobj 7221 0 obj [496 /XYZ 40.7999999 306.259999 0] endobj 7219 0 obj << /Type /Page /Parent 2 0 R /Contents 7222 0 R /Resources 7224 0 R /Annots 7225 0 R /MediaBox [0 0 595 842] >> endobj 7224 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7225 0 obj [ ] endobj 7222 0 obj << /Length 7223 0 R /Filter /FlateDecode >> stream xœí]Ýoä¶ß¿BÏNÇoQ@ >Ÿ ô¡€qúPô!¸$-‚^P'ù÷«]jwmQ?JR\ÉÖpÞ3WÔp¾ÉÎ|üë—«ÿQ}üôåÕ×þç§/V3ÃÜŸêø÷ÃË_[Ká>6V×¢=þ©¾~;w0¿p€)!ÀÜ‹é#àˆÄÜûo ®Gq8qw6 ×#Ý3ŸŸ:Í™¦[ ;*AÁ?£PŸ^©jå`y\Gœ`ª+'8ià¼ÖÊØîÛׯ:ªÚ+1Ùð z >ë¿÷óðNÈ›šer}–ã¯JžÍéDS ng@¢x+Æè‹À…p˜Öµ– íkÀ±²N¸8ƒxŸûª­mËÌ«YÅâ {¥i1Dlø %€Ls”ǯb;&¦@³CÚ`1ðI‘Sü<ÚøÔó³dÊØŒåA­–‚´ÿ ,i¬Ú¨âð¢*k'/CÔ{•yî-÷ˆ¦ñ±m>'ö¶ÝÎÁ–É6ƒ’Ÿ¡ë<^4ÖŠÓ“qäkÃù:Ö›, ƒ"47EÏ7•¯bŸÀ[9f ì>Ü'hìk†e®O}Î¥ì&ÏkÔkOdlwC ìT{2wúð™^ß•Áb+_ó±uF»TÂÞ» F(;hOÖ<[`—ZP9Ûæ¤¼ÔÚ$_®„“$ß9iã|¹NÒ)ü²sÒø2p¢›í¤u'™¶´·¹Ç•ŠÅ•JEh0Þú3‡2¼líY‚0¤Ú W…ˆ2Þ#Y†a#dtÔ\îƒ#;º37—Œ’Þ²â3´bÖ¼jLá€ÇƒßC°@ºXïF”ârüJ%«¼yïšâõ`\ã›W„}h /g7b? s"ö1_oR~(?_ ²šX\N³E_f¼Uï0ݾdàþÁÎF6鱬Y¶òÚ&œ¥½f«UÔk3)7•JÉY€ök×Åö|C¥¤.ÖL¯Fß^´tÖÝoMãbÙZóI|©p¤óéMB-±ñnj"c=ºv ßÙ  Oј/):s鬘Âÿ˜ö= ­.Ñþ’ž„›–ÛU{„j÷»÷±{»÷±Ëkù$0nnPLY10 ¥;¬ctøìÑm4½LiZ¯ß,¥j öan¢v_$jЈ¢„Ó%#j,ãŠh 1²ÅzqÕže«ÙŠÑÍ·2Óê°O‘SÐì’ÑñmG„s€Gpø.cÉÙ¥KF“X+:¼ yi9š—Âζ÷ø-¥è]N‡ëV9…‚ï½w³ü&·½¶çÅhb4¢.%¥¤¸?}tÚ¥œ›ùûÆ<] "Ô_–š–9Ž3úãà8u»LõЈJË} ”ÒŠSŠ{É:’B ÔÉñNQ–96‰§d1Û$Ÿëc¡9(Åh×Ví7ÇÛꘄ:R­Õkm5 n[»-âKGØ™îý¾2í~Ÿiá{ݹ¬‡ÃëlŽW8«]úY#²ç/1¬jßk¸±gâ¡æ=“jÞ3˜5sy[>¤ïô%͈jž^ö-N ŽÈGÏRøq²@áÛLb^ôî©0Ózj˜½»„mÿ®³—­L¹Èq#@¥ˆ²]“uûRnE”aÆ×«×«BJ0kD±¼ˆÌñ=ï>>ï~É+¢¾‡¿a¯ù†{Bµ&f .D–Êj”jÇhœ2öº†O£2¡¾yÉk)Šo-W(‰DLWR¾¿¸ƒcJ9a‡-2·“[sH ž l8©û[=w,Ó±Ãñ ý¯ß<ä3»2ßcý‚N׃4ï–1VµåÆÕÒª$»”äîëê™ÚŒ+ûVÕžÎuèMÝŒßÖlFF³IY‹vTij]g<†"2ö Ÿiá3Nm7¢ìTDð:rgs†èåoîáwû-ØÈ Ð3½o;6ÂÑ:zï*b1kïa; @×? }½U©Í1M!ž|Ð;zq|€i‹G¦0ǽœÈ½ïbΠ¬s“ÒÞ›Ërk'ÜA¬`‰%¬'@©{¨1/6 ri-35?r|-  (Fþ‹«„9ídõxø?sQ++ endstream endobj 7223 0 obj 3643 endobj 7226 0 obj << /Type /Page /Parent 2 0 R /Contents 7227 0 R /Resources 7229 0 R /Annots 7230 0 R /MediaBox [0 0 595 842] >> endobj 7229 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 7230 0 obj [ ] endobj 7227 0 obj << /Length 7228 0 R /Filter /FlateDecode >> stream xœí]K¹¾Ï¯Ð9ÀÊÍG¿€ ÀÚcÈ!€a99Þl‚E¼ˆ³‡üý´¦[ ©d‹ìÖ¸í…gVT³‹¬b½«øæŸþ~øço‡7ï>ýçðeùùîÓCslºfþs8ýýáú=ží‡ö¨Çӟׯßß>>|œþýö º§—Óàùó„¿}ùõáÍüò‡ù“Oïþ<ýö¿ƒ>üiú¿_ýÛôã§e¾Ó¾> cwúåßó/J+=LÿsýÛið_ùÝá× „áiÞÓ¿?tî» –8¾]UO¯E/›v¨5¶Õ¥ôg;}úß<ü<Ívã8X£L¯[;ý>v¶oÚaÐÓï½Yþ$½©×§W™Aƾ;¨¡õ^ä­7qªÜ‰Ú®•™è‘Ê[šjlžê8Z¥ú’‘ÓÁg4|æý™?ƒ1 ¡¬ç-|`Ø!]BŠm fcP9Þ7c+Ò²Õù´,éÀ´Í æxV(ÍŒ¥Ž­í† ÷( ÏÌÐ)}´îÞÏÆž®F,cd>5ý±§ó ¤M¢?8_µ3…Z—ÌmDºw& ,x>ŠÝQ«áæ±z~Ÿþm½ÿ¾ô…ãÝóŒa5h4Œ-L/é0êyåíÑèAéöú«îž,àÖWÓ·O¢ðBG;îzq÷sápƒ ˆÏŠ7ËEy„»ça n ‹n¼•cÚÆ¸ð`ôfuw E€$æ±³’’¢bteg±9«&]¬Ð¥‰Gè¼›ƒC™s›Îä +ýÜÆE–‹ò¹zþ@5Ç®W/Y ÞÆÉö¹cú >› ѽsE¼¿wv;Cg0ÒÔ.oóð8Ÿáá8ŒM÷’~<ÆE8 ~Œõ"α'p• m$ºÑ¹ü0Z×"x‡Ä½ ëÆû‚1Y̆)qeÍà«!#q= åMÓNýнoœ~ŒªÓqdc´À¾˜¯§[³fHWì ¿=7ábùÁÞ?žÃPšŒÑ›Ê› ‚ù¿j< šaqû&*ÇÓ r£;‡= ñ0DgßÛ#®Ê¹(ôˆ*®*/‘Œ‚-Gõˆ/sáZ5÷« ,Ý[ö"­í¼‹ƒOPnÒW˜$~<±©ÇPt=èÖö‰ºD½T9çà¥f­³¸äèûÑ•Øc‘A’ú}ºRã†Ä"XçX‘fn® ‚G ª%ZÝËž MbÌ0 ➬yêÉ[úûþRÁZ4šA°„ƒ‰=­KB°ú±O—ü)Ì ;TÒ(ϺU׺XƬ[D†Kļ—|šx©£ä>Æ;hœÃ¸XKØË%ñÖœƒú®í"Žçà)°:8î)ŠÁ-Æ)7êìxFÒ‡I~vÌOZ”#ZöÌàÁYU8{ëBZ”l4 5Ì·Z (xj´UF²’^ñ’ÊÇ'Á›\; œžyÁâOX•`È4_§'èN„gq¼`…D Û»§†âfh*ˆåÑM¨²£UúU Sjñl8Ᾰ­Ö©ÁÙ÷¸ëØó¦ä8(ñ& ÌÒó%\ª…Œ`oûDøwÜZÙJ,? ã<ƒ‘iDÐ*VôŸ½'žŠPÁJ H¹‘§¯a¥ÈS…Œ¡å5Y.MàR¯˜$-é@jŒ+z(>†â ÚjN‹K'Åi!b}/¦F¡Ô$‚ '0¼óèLP­C·`á"ˆîœ¼¼Œ zYön‘ìvR;É6³ï )6éé#¬ WÉ$‘—U§TG—Éí!ÀJ(#‡èÊäçÕÔ.ŽóJ•to˜ÑTe(šÃßá¾¼…*LÜC0ê‹ø´­…_%9œ4W¶$ꦃ Íp ¬W0šÀܶj7×7 ®P<™Lµ´ˆÇŠ‘EÄÉšŠÅ±Ë›Û}Ï+ÌQMPjxÉ”ÉÁYYuG‚Ç00mDó¢ —…Êæ5GY§¿5„“MHØ!àóßø™ÏȲ¤äÊE'óAgµ"¡éU ©›"T‹y£@“b&Š&¶g¸ÁåÍ÷ T–— §ÞFŽÀ#4ƒ)›P°+²«+²eŠ„ŒR´Â¶ô›‰`3ò†Êhe²Dìä¬Ú“"ü†¢óÄÅ̹ ¼åÈ›ïÝRÁ˜Õeëi¶ãU =E?#ÝXDŒØG)ô‡’:Z—ÍCßÁü l÷hì ßh ŒHžÁà„~ÎzpËSFkU¯e5„Õ¥ù’é´C•Ëa莭yâ 5E’éË&Q2ÙôÐÒvåúUX}Û/¯”©Â"¥ô¾«)Epþˆæ"ft£ €øÚ[[¤ÇÁ@Î3¨‘Òñv+–è"è®°æÆ7–î÷¥¼Æ„<‡u³lí’÷Ìþ‹èX=à*bÝvÆ][ù:«®wÞ)¢œ³šŸ§{˜Ëtɹ£â 冿EûNɸ1Ïø*J7YJ< ÑAÑÔì‘ Nb'!Þ'&#X@ _½vÅV¼÷hPê¬ÄÞeRtån$‡ÞQ#fk&`Ø\ …ëÜ8…Ý5Ø‘ÃØÅ€ó‡‘öp€Al`jŽn a3X·ÅKý—ž ¯ÞnØ78X†€³RÌÓ0%rfÃw€1(QásÊ8Áb`ƒw¹±î cð7|êñ`™Ã¢xøŒ\Ai‚”°c\jÕˆÛœáú(<»^rÏzÉd‡Ÿ!Ýs{`.Œm¸oÂß»XœvX…¡˜ÛqŠIÅ:®%pÝnø6P 9¶ÅïÁôuÜŽ‚³R 5áÜaŠg[_'­¶ÒJ®ìzX7 cm ž¬Û¨6|#ø=¶š7ðŽöR´TA/d.ŒãðRÁ^±ïåæšÞ³¯9°PñJ[z\ÈY)Ed3IžT‰>œÆ×x8ç\;HØaB4zsõ'÷Ý|±`×ûPêÇÒsïY~l³¿Z»t¬¹‚sµŒïz1@Û´—黌üGø=²Ñ¬c¿/'-†Ï‰ãC ¬‡ákx.ð{°?Ž`p`¯ñ3˜B8v'f€}N6† „½Øœ]ònHþ…WŠãx=Ø—„y¦k<‚߃é { ð¦*ÎÊØ#gÃgÇ90¯1ö‰Ä¼ uänνáÈ]…ã¢ñð O1ílâÓ„³9ð9ÃÏÀÓ´ŒÔÁýؼÄ}•·ªfÌ 8‹Ï #ÿ!àådè2¬ü!(_ –T í0 å`©#›ÿ ›ñ³zÌk³8Q?.ÏØ·@–'¾‰%>"kß1N0‡‹ÕÚkNž++£é‰Æ:5λÂZ’h.j`=§5µ}vƒq´…jù«[•ÂY# í= Á°ÇCÍÁÂê2”…Yüpò7*Ú›êrkÈ}úy÷J€½ <²WyôêYW{%@â·P `õs²=/{ÏËc{ÏËþ¾ò²­Öf3xÜó²÷¼löJ÷¼ì=/›™mõؽ$þWÉ&áº<å'ÔnÌ©•³‰÷Yáyo×ñiݻěqÕÇ:‰¤º^íT®.ßB4DUœ»HÊwOkZîí$vsºrÆï¦áÜúJ¿°C¨«!î’‰ë¼û‡%jw(×äH´W/ÔÑ­LaŒw‘bzÓØ@í—‡G‰þt9×qÊa-Â8 3º²yXB¬¢°ÿ “E·\ x%ÜèBS^ä +*7¯oz‡%#­xê©G³à2Á«ౄJ2¾s¯ü¦HWXV(ArÕ8ãhÝQœY©iîÞtSq5îòC5Ö}i!ݨÒõ¬Ö¨–Žñ¸q°Šß:L‚Õx–SÇIé§»yÏÝØ¹4X¼$W7î;E(FäN½œn;/ÊÀY„)g8\ñRØe;ʱ†¶xÖ’:ðYOIçØØº†ptúÝx„ë¤Í9[ˆG2.÷ pFŽ7F´¹;åêÄŒîù•º½ˆX:äé»”°¿/Ýû” ÿ0:º×v›XN‘kV¾]£¤ÏA[Wÿ¸‡Û³c·œ…8 –ጫÔsä@Na=MÄcKîŽ/…Îopîˆ!®ÄâD¢±Òå®Ö˜K¢ê®UíZU¡Û×3â}’9žÏ'#ˆuÃ`ºÊQÈ@{¾¸ÞÀaî$9w0'D¼_yöAÝ ¶â‘oÌHBƒ¾šû "qx*¡5$‡1§çyö¯H˜ž~¹aAñÒÍ÷Y&‰ÑûåïÛ¸ò—MéžËö®ötYŽƒcî18tÆ­ž{‹W‘{ý#Œu:ÔÒŸõYJÊoQX†—Ègå.>“£‚ŒØKïÕ»`}Å%ZR®öEöºOÌÔ87»ÒÙÝ–ãÛUCB‘ƒÝ“@7wåÇÉÑÓµ÷ñȸZ‚bÞ¤h$“$€ÅIN,g^’ÏEÉnð­'¢áF—ïH oO·â7Ž/*¼9B2Φ±zÛrújpzRpº.ˆöì T3ú‘D+”K¦ÔwƒƒyÛB‹'ž·ýªâw%ÒuSòe-KJèVDq#H 7Ê Ž¶qpÙ%kû n:ébº‚¹|i™¾¹€÷n×ä‘Û«µk24圈¢H*§7^‰œžûœe?æ {¥§›{»)+kËWÀ«Ñe©éæ «·ŽƒOU‚°¼ ‡1µlê!ð•söî*ȽVQ|;WNìå9Óé'ç5,u\T=!äã¨âEª‹‚~ꫲȌÅN¿asº4ä4Íâ° Y³X¤™GçzƒÎ°D× —(dÅÅVësB`F„¬L¼p‚æ$}ÝB&! ²ÉYKg¯gŽ^æÎu Õa° Ô³ä2Ôó½ ¥N/Rƒ¶–­P\zøõ]ëp­ŒÜ³Zz®D -ÊÉå„Ã9Þþœ´8‰èna=¾Lùæ¦rGݺr§L­›Ü‹zy){#Ò6àªM×ßýÃY¼qéÙ^½ô³í§ÃÚkBŠý=vÚ)sŒ×K؃zœ¼¼õ<ì €>΀I3® }`Œu™g{›W÷D DŠ=CùIàçTnÔX):I°yªˆÜo,­õhº3£Þ‡âÎã¸cÓÍ#m¦=1÷Àí¡“t*ÍéÖ±=K‰²¢M‰[GL`#…A$%½¶½8pœ’FŒî"}Þ%äQÀ,H¯ò ð†ÜÍrK¬–½@ëœ*:2O«`ÜÚsjÏØ£„(R@âcÛKžö¡DºL«½û(OQ‹ä;*O©rW¡ÏÝ îó– "7L ÝŸ¸9s,„­Öî¨cPˆ-^m³pøÖ/Iï–Œ™“ÍOἇ n7ÁùŽ®ZñZ²*$R_³ 0yÆíâ"ZóvšU•é5#R|÷ëÈ–zp<.U®÷*YúÜŒéâ¥l˜%€Lç’-Ò(b/Þå(#àÙëÜ)Ö Ö%S¾WÒ±·Å_Áù½å5mÆž#õ)ME!ÖP—-—Lû1ƒsFVK3á÷éáô¨™TÁŒìú8Ú ¿]¢ ­Ð«~èB.X‰ „h}ßÚYnq¡h{Èg9UêŒÙ„4Â/€ˆ_B´`Ÿž[ôšs—Q޷߄Ұ†ðJ ÖZ¤ÊF2 °Qwö=\ŽŽÞ(Àž~Ø¥ Çu4§ƒ„À@S”oáô#Ãf2^)\†z9ÿ%MëA;Ô’%Ì·àTçÊœ=À»`}ðvZEY:rˆF€™#ðˆâÆ„˜±á=€¬(ºž:nÇ—rú¤p$°¿˜5bÁÁiJ‰Ã×PØpèÅpÄ„ (ƒwÓå†S,0ÔEꜙqWœ^‰âDã˜CbØð>Ï«s!V\H£¬½†'ˈuÚ‰Ÿôþ4šÆyh<`u k|ÎïiÜSE#fÔ$`Ø´QœàvÝ ÞÐ *%²4 ~ƒm¡ÓÄ9µ¬6çõ’é¿Ê´¬±U¹H@ïÔÄÑÅ*Üv¾7•w~ç"õ¸H@[Å{À°>«xÏ;žû¡4­Çzð J•>ý=|›ö{ÚÎÓœË/_ð1×> endobj 7236 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7237 0 obj [ ] endobj 7234 0 obj << /Length 7235 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àhø)A€±ÇCc ääÌf,2‹8{Èߺ¥î¶I}|‰dK¶l`ºÇ)²Þ,V?ÿñÛß›þÖ|¾ÿöŸæûôyÿí@Z"ÉøÓ?½þë[ÎÆ¯ªïZ¦?Í÷‡—æåðtxþ}9Pyê8} çWŒþöý×Ãçñå‡ñ/ßîÿ<|û_Ú? ÿû¥ùë߆Ÿ¦ñŽü8ôZ¿ü{üBeýðŸ×ߎÿ:üåwͯÃúÓ¸Ç?IµbÑ<^.]éé÷uWô²Bвo(eÃ<»ÿýÇáça´Ë4Z-(UR(<ªbð¤ÑJ6\RkPkmaC-HLgD—-¡ÜC%ƒ^(š ôç¡ÔóLg” ôx¨dÐkÚ ïÉÒ…ž‡Z 1É´ÊúãŒè²¥A‡J½‚–)”^ ±óP‹A¯Ysš]¶´ ôöPOY”»*£GÇ»çÃçG}T¼Ï?Ó8iïñãùÇa…ŸŽ©gÍóOÍï aâÍó/JÛNÈ^u§çÆyjé]ßSÖ‘k ûˆVð¡yÝÂN-ª%zlº¶¨SKýÃý8HÀ¨Ìê‹_cŽJµÙ÷.Kraü=úF‰Ù×Z‡«Âï`‹¹š à ` ATPŒ¤ú¡Ör,Ð?Dc‹Ðñ‰¶×D¾]ÖH6´;ÏäÚò‚â±’ýbŒ¶þÔ"[F{i;ÎJ‚›“öBܦqŒik0 [&ÆíÑ-°bàAˆÐ‘(;7aÑA”P€ÔžÙ_H’ËÎå_ý9XÑ¢‡pŒ9õ2+ž‘Åè~ÎwÈ-ÿ`áªdÉzÁ"Á)ÃÛZÕÏpEˆÃ~ ħ=çpIGMm^ÉIÑAÐ…QɳP!˜ð£ÀuL‚B¾W½)ä·l`Zƒ_>[š•ÞùÌ¡ UgMófŽÀ|!P ôžò⾸ sÚž^zcƒ|É6‘öÁJ)ÆüßäÖ°Mï©T&ÆGbÖmgéú/¨eZÄ\ …-w¨eBß\8· Xs£ÉøÑp<·i/R9™f&®Šë;¦¥ñΈ­KAýì iÎø–Hú!Ø7F¸G\Ínë$«?˶ÉònÂwˆ1;§ˆí—¥G-ôoáÂ-ÿ« ¦m¼;'ÄQ]oc½Ï½~ç@'Mæ\³ ôœŠš¹±­Pp±±tÃÌ‘:Çù ´yñ#ãåríãê<¿Ú,Ü:Ìqa:9pqv™#¦¥zÈC–¡?Æ1Å+“7Œ Ŧ5¹ ûv&wâg¶|„Â×EA# ö!pCDÄ÷a°Ã|Â0À†•o=U0L)}k9ÌͶ`ø ìTƒ¸w´`œ¬ØÜƳf:'Ϥпxp4Ž¥˜g …pˆSŽùYTäq¶¶±T¤Š)°‚ØrÈË·6†¼ÀÜ´bÜ€Ó? Ö^úŸëƒå:¦Ü‚%ÊÍ¥RÕA!“` å¯hµQÙû퟼-b1•§è‚ñˆ)ÚfNO‘O)Ô‡á–ÀM)”Âé Ò1k¸ÒöÁ-I––5xoóX‘k{å—"_ë͇±n·r¶aå¬Å­¿Û2»-“[ ±Û2ïÖ–Á<ã°Xàz0ÀZb·XÒySú½Ã5-Nè¾_…o‰³ºÀØÇƒù6Á™W;ÞSQÓpÂ×à° 0¶ †¸¯I‹]m?B^«çöþêZëÁgVØòãº"%©ËÞZ0ùæã 8ü¬&øˆÒ¹@ ë0>¥$<Šp4+€Ã9F¤9¤Ò.ÈžÙRÂ*7ˆbßéß6€%^cd{a¡Do‰ªÖJV4›TÌÓ[… Öë;·•}žé˜c–ð6¬SBðR&›µjVDxb‘À˜BbÛUúRX* G,j±ó*ÁQH²}áDYéS¬›’B¹´ÙÎŽ }Ìq&ûPÄðŒ(?ƒãIË×§âÍܬ‚U…'EZ'L¨ƒ5!8ŠZQ«´¦õĽñÄä|r%å(±™R|Ê[+¶iÔ Þ…o=R*9d­ˆáÈoŠà®)žÓàrŠK¸<‚ˆuįy—÷|R¸ªPÒJYŒ¿v÷Äñ:ƒwAÒÜqa ¦2UŒ"Ä{R–¬•¾ˆÓs}õ*‡Ǥ[/×ìIQNŠêĹïž•[fïIQNžÙlRT×ï¶Da["ŽúöPÙ*Ûiíé*»ÕPÙ=íç}ÑJz²[G­ìä¶õøZÜ\»¶Þµµ‹ÏTçé®­·ª­÷Ä–Mëdí÷ðÕÔÉŠ³%|¿ ÿ€ê¨Ÿ.öÄ–WvÛ‡JlQ}íòžØ’¶žµ'¶ôä²{»}bK/Ïj¢tbK™Óˆ‚›×à¬$¢Õ å H¹3"'k ö‘(i¥¢opÃÏJ†PãjÜbC/¥ºfn'Îq×wÀ¥ƒYiÀ~_ĵ¨áúCdóðX–\‚t<½¼7„»?uQêž?Úu-… mµc“í¾ DB@¸ëê„TžºÓáë´SP±(J W5 Ë1|„xïª gKys)1üYí¨,Ê´ÒÊH»•¼ ˆuÛUKn*°9>oú‡Ï¦©°}»DЬXP²~s\ê€ZÄ¥(fp[趯÷•é'Æ×„8<ü)P…s–#n q˜F)nÑ”q\qCÈE(ƒ˜ m°‰cíERR« $q̾¬»eY.øZ¤?­U„»2 ùSœE–ªµöpeo¶±W7u)VG¤,¹î<â¶2|‘tìû½=¯Ÿ "¼2¼-q›ã´"Kòs‚k5Ïö¤™ÜÒÕïï+C7YíBÇhÐ܉RÀ9É’Â8éì*lÜuŸ•Ü>ÈÙP÷kAôÓéªÙ+þWì¸ ØCO¯›©ì²Ä}QÖµ“å  fö°¾ÄÁíÙÃä]fëÞ¸Œyn¦{öðž=ì­röp ΃Fó˾Sßž#ìl¹yÖÑÊs~$Ò;Ó=çÇÉ3+ÎùÙ3tõóº³$‘þ‹ð*fIJ.e_³Ý3tw]é§rV4çmו7Õ•{~ì–5â±$êª4âÅ»ç–Ö•ÒŒžwô{né^{·ç–¦­gå¹¥’uµ+„¼7JZ Õ¥šÄÍs„%g½‰%“ÓEgÕ ò$šFDXG„g†8ú¥riå˜#×/€ÃtýY+)a‚6V„WÊå (÷óg$ƒTÓó5öGA"ÕÛyRŒ?&yÏ´31©.C<ƒI£Íô™x‚òvŒ5±¯k™))Cï™DŠj¹;[ðÜ&ë·o3æÆà èDüD*A£MdKI;.4h=AçºW±æ߃aÀÄœ†§ñ3SТ^^²Eªxìq)r?™És±›7J,2­Áœ%;"d>oªRŠR̙̲­´“Õ=b¨ýV®åÉì¬\(K¸z™;Ð""!“¾âÝB¸XIghÚÙ+º7eA¤‰áSV‘r?_ÄÆ·p†ž¶pÃÀ1µ ô˜\M34[²à”øë$Í¢nTîÆ…ŠJæÔyÞ¯5À­ì\lc¥¤B-©NÀà=Äë-i¤¿Â½¿Ž<¿Œ¹öÅ—°”=±e‚ÌtÌ!”?LnOlqÂ`abËðÛ¼ ¨Ðt|`úøþÃ[›(È•(žœdáìê÷.ˆ˘«¢©lG¿*‘É‹&[9oŽjÑZl1‚“©V™tD›šiÅç-Ó³udº®•#›™jlî==ì£aŸÑüT¬eää24Ydn´Qw‘Í=;UŸ™Yá#ê3í˜æZ(ZÇ$óâúL‹Yû4·, ºãwÖQåÅ6Å8…tàèé`²îâèã·ø G½”H­g1e¤¬S“è¬7×¥Ö8J¸ƒPÁ›°¦¾B©ˆgðj«±€/ûžÈ–€Þ2(Å Šÿêlô)§žlžÿ&¸ÌU endstream endobj 7235 0 obj 3172 endobj 7239 0 obj [499 /XYZ 40.7999999 249.620000 0] endobj 7240 0 obj [499 /XYZ 40.7999999 249.620000 0] endobj 7238 0 obj << /Type /Page /Parent 2 0 R /Contents 7241 0 R /Resources 7243 0 R /Annots 7244 0 R /MediaBox [0 0 595 842] >> endobj 7243 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7244 0 obj [ ] endobj 7241 0 obj << /Length 7242 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯Ðyш/‘â×{XÀ{ö°˜l;Á:9äﯺEµÛ¢>R,Rlɶ Œ=f‹d=YU¬*}þÛ—W?ÿQ}¾ýò¿ê«ýyûåÐÔMÛ _ÕñûÓ帩~ÕFÕ¼;~U_¿ž«çÃãá±ÿ÷ùÀÚÓƒöG?8.1LøÇ×ߟ‡ÅÃ_¾Üþ£ÿíÏŠWïÿ÷kõÿú?ÚùŽøv0]{üå¿Ã/Œ3núÿ\þvüåðÏ¿T¿õ[0§yÿ~jÅŒæIûx>?ÊNß—¢Åz ©VY1Æû}ª¿ÿçðS?Ûyu'Ó­ÔÍâYûÓJ^uº­¤îœIØ–MÅR'êz(³LtÜK5Rû§ªLh®ä‘ G(cxÿ»ö+tÍЙLÆâ8UâDºé9/]õ‰çS@ɧ¢J‚f¢=É›TI8O•Œz!ó þ´#–šE½gªœ’ E§ÐOÆâ8UêDJæ¢k¿#–ÚH<Yôfפªsa¬™hxÜKmD=ž*«$tÆâ°7OR±hòÃ0&2ÑÕœp˜ÚHgªÇ,æ1ßž=Þ<>?0)ÌÑZ}ú©ßÉÉä~<õàªêÓÑŽèLõôcõצßUO¿ºZuB«ÁF¶#7§‘û§‚µ÷£˜¶«²ïÑ~š0ƒF8|¦p󸎆#-‘hDbH!< Ü[s¿·†ž¹Ï‰æŽÀÙð®-FËplo%è®à~´ s§–lÁu°40ÿRvà‘ ˆ¼ë¢:²a,â,O˜ÂpD`‰†Ò@Ñ‘cë!<Ô¸¤Ùà3¢+Ç-㯵͵÷£Î«8ÓÛ£S0_AMè9«>4öm— ¡<¸‚'>¶F(¸â˜+ðlØ‚ÉzSv !Ч('“ÀI”µ0÷ág —cþß²Ìx …ú²|)¡rG0—ýIìC@Œ–ðyƘCJž®¼ b>óéŠ-+L-¨×q\Ƴæ—B¶]Q K•@­’q[ÝÊŽÛ¥%ñ‹Ü-²žn;ÅátÛFTE›¤„7¦Ÿ(q@A8E9á6Ì£;ßF)Ö¶>pl [Òx„p÷é‰HàÈŽ b­ŠµÎ_ ÄQ¶Ìoob~†ix—óŽ`ý”ןϫí<–UIjq¶ojáxc^ja°$µäJK)jQ¢Ajm"KÁ¨”›á÷qÁËÆÁ=ž•ÍCñŽâÙsMÇ“‰©†X·gÕyĨ›N¢!úáô)Ž­Go8*Æ‘ã)é\]ç̽óö†Üœ¢A=³†Ÿu0a–Ÿß=¼à¬—¸ó× rD!|*H$„ãg"˜N–Ó"æ9L¡`S]æÒ#ÀÙ€ƒÀ‚+*r£ÔT‘¯{Êûþ€õ\ع,lþ@\\nþö&RŽ4K+äÚ%~IÅ‚”¶ YË÷™BI9ò¬ƒ÷Fi•AH\Ù†Ôòâågûä±M\×j^¼œÃï|Š%í³d†€EI‹¸ºîË\XVRÎ’ŠJŠÉY©4°}Ê;ïHζڧyZIT)9+•À·O9#`çÉÙ’25/^ô‘”I§–H*&(˜”©Å9‘þúI™º_w\rpÌ%e®¸c’1#bÑø _‰9÷¹9n–we–|Œ4Ë=ÃñJ†%A›‘mn?—´ ¿H]˜_>²…½çüG¶ð;Ëh”m[XJ¹ÿ‡îTI-)²‰×#y×ñèš’òlTP6ß]öTœ£)hÿ¨sµÔ[“îÌ'/\ÇsŠæ]CZPºÕºµ=E*”>—‹n?©@e >"2_#2SRÍ= DZÜpF¸hÂ3avkñ¦n5{ MD~«“cÎô…ëŠQ7L½ÎÅ#õ+n&¨³WœÌÏ·ZçÒÀ³&~Ê+ܽ†ó‡#ö¼¼ôÄUŠaÖ Ü*1UN‚—R鯬Yñ.n—×ó;Ðá”sGÁI—Ãpb_ÎÄ)} ²rQÊ;œYí%Ç é)#ëðzDY¥ZÅ%V˜öᲊ¥œ,F.Ùqq]PÙ{ìš †r«FrŠVNÖ[ñ|èzÇõõù°2ŸìSÄ Úð÷èK¬ÊC–YêöžZ7G]ÞžˆÛž_ù³m†¯)Ð3#Í(ÛZåx†Ág:ôŒUð½æØÝ÷p¶[ËÆÒª•—‘4b£Ó½}?˜ê¤bVG‰C\ŽË,¼Ú÷7hoVͬãÁƒ{ãñë°{8Ò"x0¤žuâ©Ííl¢Öúxvéƒñ†w`_?ÑËT˜gvÍëgŒ´êü&MèeF”!G”«F Rº$¬ðœEA‹ä^¤X”)6Æx„ͷܤMj¨@°)"àÛn q„W¼ø?kEÿò@œë å(þÏgL‘ÐzkFNOŠkÉ×J.ÈÛl¡øFŽs¾Ê‘ŽŸ_„¡ë*L×¥ÍÊå9AÖiÄ•¥™ÖÖã4žkW£¦Š2ォ畩8ˉòÊHœí€_¶­û# „)Ça ‹3–@J§²¬æz„’/Nhµø`Þü)¢`7"Êîá¡­Ët$´=óˆDDVDŽ³Ž éÏF©ˆ¹âÅïØ„%]žYÙ3rËãL+]’;–q„9Tª¥YJR_{š×9ü’£Í[¡¬›¼ñˆ7›ÞP˺7£ pî2°Á1ò'™¦òå3ÁñxÝŒ…}ž¬¯„¼°ƒìØuð;âøÉ’%’ 5b<ŠoOïÇòÃ)³ 2g(^&níÈž>"Ÿlsɇ¹Ù7ÙSkkž­šR,Íp/¶§¬BR19B$a(\# :Ï1oˆ0YRZý/¿ ·„`c Å‰¡ãwŽõqh­›0¶`¯”4´å÷wîzø@AÞ…Ø ÛœGÁZ–v YÌ„ÍËÖÉB¾ÚË ä¯Êé!•öÉšp¼ù~î¼Ís3Õ”7š8VQùY7q¢d·­×é ¿ƒK•¸ ÷ ¿ê~½ªu—ÒaÞÓ]â—Tû~ÕK¸0 Kéøíé©€¡ÃÜåQú=xä¿Ðw*ÀüêÁ±Y 2¢tÿpÙ@Ìãþ¼X‚p¯Â{Ü¥G%žÍ£+òö.Á=}¡4å¥é´ÆAp—"L|Šz’”âQR¿J70ÇÜKè»Ké—åákl±à½AH== ¶Ùõ9ÓŸF%»Ù_xUöÌñèuL{ÌËøm9ødÁƶ<Ö(Ð)JGÒ«½dWbÓ‰+¬Ú±±k³§Ç<æ |>ÞVæy#Ò†½Ll¥`ûãÍÓ—ŸAyûïânâ8ÞÏ-Bç)Œ·gC þÖ›‚¦d{\«æÄæ’œÐÔWÏ=>zpsÚ_¿yäb¶yÁ죷ÞGÃÕømÅzÈgÈ":ÖÖCů8w ´ÖRÛÖí|C'ë)6m”ëZÏç’虑!b,DÍ»Ù&dJÕíáœÒdnŸéà3j^óæTÆ<Ões³ Üxù—;øY{±:ázÆZ2s# Áa-™¸g,Åb`¿¬ÒNàºãï\M{@Ì­‡i ùÀó ä« âøÓ„0ǽœÈœÏbΠÀŒ¹i¼ß½·ÆqÂ Ä –X<JÝA­ˆwpq­™ —Æ4mÍŽ ”¯Ôš£sˆÄÂvÞ~ÌyNV‡ÿ÷š endstream endobj 7242 0 obj 3177 endobj 7246 0 obj [500 /XYZ 32.1599999 89.2999999 0] endobj 7247 0 obj [500 /XYZ 33.1199999 87.3799999 0] endobj 7248 0 obj << /Type /Annot /Subtype /Link /Rect [355.680000 99.8599999 399.840000 107.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 7245 0 obj << /Type /Page /Parent 2 0 R /Contents 7249 0 R /Resources 7251 0 R /Annots 7252 0 R /MediaBox [0 0 595 842] >> endobj 7251 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7252 0 obj [ 7248 0 R ] endobj 7249 0 obj << /Length 7250 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhÄ—DÁ±Ç ‡† ääÌî&Xì,âì!?R‹Ýn“ú(±øpKî`Üc¶¨b½YU,~þóÓ?«ý^}¾úOõÍü¼:4uÓ6ÓŸjüûéò\ׂO;­jÞªoß/ÕËáñð8üûr`íñAóc<½bšð÷o¿>O/?L¿yºÿëðé¯þ2üï—êïÿ~ühæ¿ðý ûvüðëôqÆõðŸËOãà¿ûCõÛ‚>Î;þû©mZ9ÂÇËùQvü{ù(zÙ€!¥ÇÏŒñá5 ã¿?~f;ƒQk)˜è¸’Ã羕]£´æÃçN˜?«ÞÔñáU]¯ÛªïÚjćý"g½+§ŠœH3&’Lt„ˆÅ-5²óOU÷’±n$Ãj"›e¶rZf±ÓT± ‘h¢"·4ƒzÏTdÔËA¶ÆeŠFÆ.ô4U4Æ:ž†ë±¸¥P§"£¾ë§e*Á£1Ö§ÁX/x"®!bqK;¡OUëÖüŸ×¼H+—Z –f ïù5Iì µƒ/žïžŸ¿2)ôhöŸ|ô¦ÏVUõi´‡LVÏ?VlÎ~¨ž9ôõ@´NMÎ}„I4Ò<„?Ãyø3¬…³`k¾ÀG¾†ÃÖt0ÔÏÈÄ[FÄ€”ã𙽈‰ßž ]žuz«Ä\~ÎI˜ö˜—ærÂ{D®0_z¤ ò£áA?a*x4 ,)Ô‚´Zȃ7<†€€!()ÏŠ/[:Ìÿ ®Ó‘`µ0òO6¬…(‹í&–øì×xÖCðk<¼L€šB9„´ Ôp6Õ”³alÖ 9ÉãµQ¬ äyŒa©ÅÒ„G°5-Ä¡åö@Ôã÷Ø@ìíbØ }Ê~òNa~+#g}̮Ҍ$€´`Êæ&“ò-±U-¸f\]Ó¢ƒjùJɉ›»ºT¹øê¤~d-§o^|U¡>©jm{B3 y Ïð¯öôÐýjšÖúª‘M½bÌ~¶Á«™fmkÎôÆ=_u`øñlk ±ßÇ¿¬^°‰hœÕØßaS¹¿6dž¯˜Ñ#΂ /`OÏWÂ:ÔZ>‡°=àÎêÔs…lù0Ö‡±ZÉv@ -™’Âf“ûì¦C Ëv¸ŠÓ¡r³(Ï";@8×$߭דîûœuâÉÖkRãŒÎYÄQ„“°»yzý…4¯©uß´ÉôÆ€°å™"ŠŽ±öN/ÊùŒ¬ïNë'Ä&p´ŸMóDûáŽÅkÞ:e¿,îÊÑ„£ ðxv„„ž'ò˜óe°(T=Ѽ:B¬Ü# „¨#Ä#0í=#”è!&#ž¬¦%Ê[RàXʈ„Ñ£Rq2̱ 礰ÌàÈŽ“a ‡×CˆÅâÈæå´ô!YkLlM–—dgѽ÷òRbÿŬ%^ŠiŠGp6ó5Î…'µ¢/¨ñ;±Lû´#X«âø:֪دÁ܇es!£Z”Ž}T&ùK9HcÉߺïíÉ7iéUá('ÊŸÆa¸§Äî)qO€ÑYàb¤ÉI&ºïÃÀ¯O ¸qSœ“pÒa9MóåH.µ--“Q÷)-좨õ*öƼ“GF°;Æ€ˆ# ¿/Ÿl@³!˜EºpÑ‹ÆdÈ<JŽg‘º¤ŒÜúÄ”›Kpô*4®™Œ”–,4³àÀÈÆÚ±¦n;ö†Úâ¤ë¦Þf+ðHLrÂC†õÜUšb!µ˜›ê= gâ<¨'S,—†ÄèÅR uŒ’[g}•ëMS,"ÉóZÒ9 C×Ù–ëc‡0;Ù$lNMT–*Šã[2Ó-Õ)ÖöáöYa™OB–5Ž*js¯#ƒ'»˜8 %åÉ]Fz‘[ýóŠÅ`Q$t~ ŸaųNxN+¦=µt²-ˆ_„n®(Øe¥m3uYÁpB[ümÆC=ñÊî„Òƒ‰Ò¯$é`ÑÉï$i°,ÀÏ{Òî·™ë øÒî%õ}²@éÿˆg#Èœy¦ŒýÐ1Ïki¤ÈêºÆòW³úÜ …NÝùš@¦N9bÛP&ªÉ¥ÔVS ,S¶uh8c¢3,nýF@¦P)¾Ê²6BÏ8h„õË;ïÞ¦¡DÁŒGá Õ[Jæ–_ðú@ïž_H×[ÙŹmx6]«`*RôÐZ¶ žb¼àÝžhËÇŒ&VêëëN=…r8 >!1ŽP9of7³µµîNcÕµ”VjIK-3ŸC{]k7ÔW)+)]캫gÍV!²¦;m;±ˆô¨ÊqǬF§ð®—µzƒžÐg_¥ 0ã]^Îú³¤CÕÎ! ›²¤£Ìb—:Ó‰þh~Ê^s-¤ÔËP*jq4–Ò—„]ö`§l5Qî“jÛÜGÉSS:é”ÊSì‘ÇÚ<Ñžb<†iŸ4rƒ3ÿ¤ðkéU†Ç´Øá÷` °†£Ð‘RAJé±F©#Ø!_ö ß6_â*@\o°G:r¶i:nºž£ …e³ {já7NRªÅÓfž0®=P§­^Û£¶RýxgH·ÁRúQ,®èô¦¹b§§ÆÊÐþ|ÇÃFi«'÷G­¾a›ˆ ö…Ws÷b:ŠMDW“ÒÑs~…â‡b]u>Á‚N^øÒÉ[ÚS•áØL•y‰9–pß(Á7ŸS¨µK=Öm!ºz»Y¸0Wô[ˆmznGÆVçúo)BaƶõL|ÿuÚ¨áÔW±| åÜÙ¹\4àrÏWóî‘Zr±Mœ7KZ—â©£¦ä>–uk7½Ý±v-ü¢7C¥œ3K{Ò=m4g‡œÄ›-Äw1'y`£h¬á>Rަç| Ñb WzRöG{ä ¹‰ˆ,ž s¡[â.)Ün!ºÊ±'@¨P%õ8¥t©Ù#¿è-Ä]Ž–aÿîY={E{Ñl!"«(gµ˜—„AR==å™~úg:1Ü uòjo]Ñ¡kÆ[ ‡îAâ¼w´?rgŤîmèæäž‹†- B®°‚ ¹“ÄÓKp&ŸÔ"¦) ¥}D’+Èbz3Dʸ.àˆzH{Œ¥Óú9ÛF(mk0§ŸnZà öÒÃÍ ÍÙƒ¹éï '0ííŠß¢·Èè+n»$è$×;K'Yß–Â¥ðzå³âÒÙ<Š‹Â„V:€“ßû¢Ú»e³Üš¶¹ÝgÌh*ú†Y¦âÝD¾˜àˆÛD\q54^ų 9G/.k¿x©ÉÞüj€ìŠ—HÚÑbÔRZ 'mgL`;‚Ïc8>“¤å±BYß“dYðÅÈjµÍ‰1‡™œ‰ˆ¾ßžYqÇ.Ç£ÅÓÐ2êqŠãœHñ®ÕyúÍݶE+´^Òö‘ØAK)Ø…²¾õ_&ž»š~ú‘&‚IôH#IUiæ]PLwÐbwEl¶ù>²@]Çm t5r´‹F¿×²A¿ÆôKL÷zw/‰÷Ù­{ñ¬ØÇñì  ZO6Ô¹Àöö|žo y$ö±oÙèQ ‰¢§2\e”3¿Ý ‹ó6`•J¿£2šY‚Ñ!Œ¿Þ´Emÿ°¬àøÊbÊ ?ëî#Šr7”¸W€âC¸Ó')DYÈÊ[Ô¤³4– œðýèÝ‘=h›ÎöDœlì²ÔsÂÍ·ZxÜ)‚Ç@Ú%P"üØÁ^Ì(¸NL@ `I»òåýQ’HÒ;U ÜbÀQò·:²ÿ'ùé|kž‹ª<;ij¿|7 f®õzÄÜÄv“β‹à4ÅxB)îÀ)âNq&-ÖÛ©Ó4÷ >@ý²gÁm‘V,nìŠbcá3Ëžå,RÖ¾L¾ƒm Ïf-ÿåŸmà‚·(ë 3T»È¯xb1‹™OÙ8¥ò*{ ðRØØa›~³JJYÀ¶[ÛRún…öçS]ŽçùÞVç¬%'ü3ƒÿæÿ#XÔõøü˜tU—¿øõðäÑ£ypgÎ:†>k®¹·ß¹>:WL[U‘l›¥+.g³SèPv§æ/Fë1nû/¿1а}ýŠv¾Ò[_1ûvña´§‘ª L¨b¢ò­<Ÿ£ºòì¼Û0S=7íq§e†Œ½¶¿:Éäx Q”­QfFƒ a`!ÞLØwn_à„š]xüÃßêeà²#ùšÊüøö=Hw\¨¥G/Çz]fõ¶bÃçv=k룥®Ds¾3{"A;àsÞŸéeíÈòDÞÕÝ|6·›™l…5ï-ƒc6ªn'Ý` ÚÜ{4|¦‡ÏLưã5ï ƒÞÁÙ&ÖU+Í}ר¼™~EÏ6ŸahF²Ãž1 Y»í(\7~æŠu‹Ôf˜¦Œzø@9ψ j0EÓÐ ,q¡v9r ‡r˜Â9óæD—ÓMÞ? ZŒAøŒG¢°ÜÜ'áM­›¶fã¡ù·Lj¶òs A&5ÞØ‹„¶¢z<üt¢ endstream endobj 7250 0 obj 3608 endobj 7254 0 obj [501 /XYZ 40.7999999 759.379999 0] endobj 7255 0 obj [501 /XYZ 40.7999999 759.379999 0] endobj 7253 0 obj << /Type /Page /Parent 2 0 R /Contents 7256 0 R /Resources 7258 0 R /Annots 7259 0 R /MediaBox [0 0 595 842] >> endobj 7258 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7259 0 obj [ ] endobj 7256 0 obj << /Length 7257 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯Ð9€µâ›;¯9ì99k;á5<öÁ?RSÒôˆýQâCluv€žf³T/V‹ÅêOûòŸê¿TŸî¿üV}íß94u#û¯ê~¾;}ƒêšQûRiQSÓý«¾~;¼V¯‡çÃsûÿëÈãÄþW;8<Âüã믇OöáûΗû´¯þ¬hõ÷ö¯Ÿ«ý»ýõC¯ûÀ·ƒ6²{ñ‹}A(¡ºýãôU7ø¿Ã?ÿRýÚ¢ p»ÿ¿“’ÝgRðx§’ãÏéTô°–Cˆ– „ÐÏîÕï?~j¡hÔ†¢$WÍb¨Šv`%ç•Q²2Âé¶ I¤˜Î¨Ãˆ$QF®¼¢ù®´ÉÄ÷R2»´f™Øb”‡ïR4ß –HÆRÉA¥j-¢TyßaDÒH8AÕš3¼C'¡5m_+Öÿ ~­«d.Ž RQ P‡I#ÍŠÃ*r%Ȇ©^}M“Jè*Y|ˆÅˆ¤‘6°ƒŠf½$"‹ñƒ”Ì0Õdñ"£Æß)šïퟙø>@Jf—¹(I&¾CHY-¿i¤%œðTÒGP‰€HC2-‚#’FÚ Ôs–M }Û”¼z&Þ½>=™nöòS‹Æqg½|;ðöngÂÚ¿~¨þÚ4Ì|_½ü| ¤\j%ŽŸ;Žuá5oÍi¿!´# G#ÔÎÑo•“7H3}ƒOÞpaÜÛǽ½Aì'jÝršŠSÌzjDݘ#no#Ÿ#¢ÝÁjò~Îâ€û`Y¢#²¦D‡0ÌWB#j@þÈ#ÂÞa_àÓ§9–cÔbíp•Á ’Ðá³KXÁcé0³©ˆ™({„üÎÔJŠ÷Q›£qá ±îCVw€ó‚žÖ:q³£žs‹lEc=ñ7èE-£œîÅã#,Ê‚ýËì¦È³®–®É5£‹~É5D*f'ã}cüdŒ…v`ÁÛŒ#Æ$Eñ¨p¨D"8¾`KꬢeÀsæYâyžÃÇfÙÜE¬%—¯P)¸p‰\¸kãS'+Z2&ÄÄ”aߤ»û•¼Öhv)DqG%!jLðºÊ*Oæ# c…ÔìF"€NYË5×EêË‚ aÁz’%÷ö:G°8òÖ žo6öÌ£Ñ1«î&’,½Êà"tEÌ9A¥õZ½'ÞÔGºÞI Ž4;”˜ÎÑásÈg8Ç 9£u`Ó3“~A“¦¶>ÜYûgFš4Ò QÖì¨2‹pëéz0näâ†ypùAO)îàçxøf·®y¿bÌé—;µ]í'#O¦ÏÁ¸™µã½~ç*)"XxüyQ–-vJz,ÅǤ œçëW*âWЏÁAÞÜH–Üe@°íŸÝÊü}àÄU/²îÿ’’#Lˆ6`|ïM<Ø@­]ûcÞb$S]HYçSQ¼GíLMPÊR±3*þ˜KÑ g躲y2©†]÷-Ž|ïàˆA#DÁ¡=F@ƒ#ŒE`y@Ãé¡p„aJ1wJaýù*±†zЛ€sÐ$œq£x-<…Óà =˜R–-A²À:9‹Ï­ÉÄCOV€çˆ^ãU›m>¯/Šˆá©kkýÎ_I“!,© Ä'œ)çIºœ”4¥…­sÌÚeÐlÀ³CËv¥>ÓƒíÊÆ}—æ$ÁwEy(Èy‡ÂÏΫ—b¥½–ãSKyCÆÙ²uÌîçIQYšËç‰.AL†ƒ`+1àØ¢49¡á\Y¹|‰ì,,­=#|ZŸéÌ:–Yû®s=_žoV­7ߨ.Y3^cÂínfË-)l¯ã&Ý:9ˆäíÅ’¥UOÄÍdϖΩÁÅ÷ŽÊ.™Ìß.Κ“Z¹l0Gú±xÝôÊP”"å¸hµ'R¶H‘ Ãñbo]Ï9ˆ‘¨íLÖ’•RÛ&ŠÃ¹J9ä(ËÖ>aV¨ÙGi}áÁn±²’ëQu@œ–{*mtayãMPf+PhƒÆ³¦!¶a(U»˜jEÎó¡`•–|ªéò^3ÉÈ`"Ù=ܧ8!bÖîœ!÷ü~Ó³ÛºÞqÂéDX…!+êa׿ý=mûý=Ò^.Y‘r×7‚[-Cjº7³gÏ[Éæôíº`›@ÎäÔZm÷ÒiˆÇTAÆôCœG:¸ ñ•ß ]·+Û*ä±ìÝ:ÝÊqéŠÖIq±Ç«ûM¦ºå‰ÿ#:JGÕçðÒžçèÌPBí?ßk%5|üàTwG|©H¾_s;^1V<ÀãÓšãdÎuQóǨö´¶²X¶r\ɉ>VU<Ç<Êì ´CñÄ T²ÉBºl#dj$fƒï~Öw]‚Ñ©8>@ÇŒcÍ3ïùÞΛ·)ëªSm÷”‡Ç”,G”ÅÓl…ɰ£ScæT'¤ÕrL(…cáˆÌºÛºv¿q³ñBÞì7n™–+½qÓJ˜î7nœU‡Í}„÷7³Ú7>oÆ¡‡•.\¾Ò|+1tXY^éæõuvþbÐÖ”¼¿ÃõæB÷+Ó¾Ëß)‰¹+u+ýuÂÚ„ucW·ýæmv­¸N]Þ;¹n “kQ0ö¼ÛoøîžnOwù±Â ÛÝ,Gºgüª{¶°ü ‚WêæÐ‰ª_U{©JŒœÙ$TÔE}!ù:ߨqÕH¼ˆøÂú ë^EïO(‹„rüòÓËoMØ<¦s#e0eÛɬïát¹“¿¼uÈé1Ö»Ínrɼ æÃ|kêͧ‡–÷†KºÈ…rî;9wj3~·í­Ý=+}¿lÍóš››©ÅÞ˪ße† ·Mo­ÿÞu†xžn~;oQºÛ–;o•ì¿gÆ/’ö|¡\Á¢|3~umjO®ö§zmQj×} ÿõõ›G—¸æ¸g/yÞ©³|iÝiÉ8ÿMKÒ^ ®X3^†²dJYËóIMÃkÇü[…§ªVS·hQ±™0ÆjjÎö¢–Ö¼(ø ç8ÇHEkÚ°nèmäB³Š|úÎülß•ç …OhNØœ!ˆŽÞ·‡Íé%B{Ûq$h]÷š ¢f¥M°L¡ô1‹G„3§w`¢^ìÐ.Q±v5j GrXÃ5ëÖDWÓ{†-æ œãYQxÝÜgÑM­YEºÖ8§JÚG¾çP‚JJÄ©¿Èè+ªçÃÿ\n™H endstream endobj 7257 0 obj 2896 endobj 7261 0 obj [502 /XYZ 40.7999999 264.019999 0] endobj 7262 0 obj [502 /XYZ 40.7999999 264.019999 0] endobj 7260 0 obj << /Type /Page /Parent 2 0 R /Contents 7263 0 R /Resources 7265 0 R /Annots 7266 0 R /MediaBox [0 0 595 842] >> endobj 7265 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7266 0 obj [ ] endobj 7263 0 obj << /Length 7264 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâC",Ø3ã9Ø@‹ov‹x‘Éò÷#µÔšREŠ-ydžq³E«Šõfñý_>ÿóüËç÷wŸÿsþ:ý¼û|ª«º­Ç?çáï»—p] >þªtSñnøsþúíôt~:=žûŸN¬½<8ý误'üãëï§÷ãËOã'ŸïþÖÿö¿3?ÿµÿßoçÿÑÿøišoøÂ·“îÚá—¿0θîÿóò·að×Óßÿtþ½A_æþ}×ÖZó¦M‚ãi~”]þ¾|½¬ÇPËjÁÏŒñΦGÇÿuú¹Ÿm£ê$cª•ªžUñaZÆô¹Smÿ«5§µ´°™XòDÈ4QKZ«¥rÎDÆ;—͸H!R—9O•:‘P*ÏDD,miWÌã©*-E2oä@†Mÿtÿ»ÓŸˆ%×¹È1O•:QÓ‹§, e"žŠ¼úÝuYf£R×y)am›i# ±¤•]g"ã]±l,¯r‰~ÝdbyŲ±<ž*«êê\Ûà:S2»&Ó6 ʳ àLÔmЛ ]¼Ï3¥¢‹×m…~( ÞñLd¼÷Öö¸È®N]æ“BæWÍ…ùYÃ^­«+§Ð“hdâ°¥gZ8‚Ÿ¡@p†Ú1òG>ÄC àlŽ•ÞVÊ!µ?Þƒ)¡ÆÏ8 €4˜«0ðz0®!l ÀÙ0Ôò¦…¯Kí` 5‰ãñžûD †ï` ¦B©<*åðÎâ6<’WŽâõ`4Ås/†Î6iÍ2ºZù9‰²7 Å¡$Þ©^†;ÝAƒ9x™ Y8漿ÇCýAáø-¯ÔÁ»Ô[Y].í‰$p.MÃÎÊ”$Ÿp‚R¨àÏû…‡|°¿k§…Sª‰vULŠQSjoÃëvéU¡Âƒ,ÅÙ¢ÙÃJÔæÆePþs(y$”<²&϶¢´6V]¼ \8Xõ{vd-ühJ¶­©„2ý†óy›\]£ú‡ sAq,a+ŠQ‰gc»Љñ®§ …;å§0Á˜v¸hX9 DHBXÐJ„v˜æ˜_0aN†>vO }&ìá>ÁZ?÷Q0BØu˜Â[v37cjE­GÂü·Çõ>]zp"(›³ Dã—V¾‘26²0/¡ãúS­Õ]†Ž¿7黀ª¬õk"²æêUšhŠ)•9‰ã?oÓÚb+G-ã~û ÇÄòqì7GEá†j[ÃO!ä)1ňÍúùGº&Û‰P¿A)ÛkÝàík˜HFÁ.U²Ãø8Lô ˜è8<×Àð„c¥8°D©rÃÁì>jAÁaÈ!o"[6,@¦ÍÇZ.¿˜/1~³îç-Ë´º$…»ÎO­¬#Žp.ÞA…V¼ë"+ ôm|’´W4Lû9K\‚-ÉóPχðóHðp2™”°Åå%ûL@cŒâ}Z*sìPΗRJAò`Ÿéùv«óN¾!¡¡?On›„–h~­Ü°dZ+öz#÷lþèPˆ…mcž’|·œbBÖßî#iR«¤‰§æ¶0Çé §³ÛÓjn&pœžpÇé‰U¸Ow~î;NO§'6ëÃ}úþܧ­Ÿ-ÑÏ¥Ï?[¢ù|óáÀŽpàÖ%ö–õÙ÷¦g6¦ÓzvæÃ¯}Å1Œ¤›·{¼¥`t¥òõj—ø“0BiKÚ£X‚å-P?´ù´¹Cû­Þªh’`ž[´O¬®ZÅ[´Çt‚Roí•ҷԬh_ùJk š YõáµXI7áîé*·2ÝØZc·¿¹°ìª¢”›ØÈ“N«æ)Û»áý£RZü˜p§\ÌÍ*–Dò‹,h#rºëŠoÒ…ëø=ámÿì…Zi_JÉ.á™”[ãk/_|Û'PHLª-õæ·ßJÇX{X„âkÊïéÜŸ³¦„¿ÌkɯÇÍ#Ìø¨8‚½.¯ã)ÕÓgËÆÛGÕxÝÍ·’¿[’rÈ)åBÛ½ºŽWNÄ(I¸Á7©Õf¨³v8å6¶ˆ¨¡UyŒ>½­É;sçþeÆ®âº5±ë5»m‘–åúðtɹªW©MýŽЇžtrB/µ)»K¬ž¥XGŽóB”ÙnÞð>¢$Ù{Rm]©Ù ËÞ¡›¦+î«¶éL8³õÃêqÓ-j”Qä1Ѿ&^€züc|a¤¾ò“jÌgtü3ì>Ó¡g¦¦¬®Æmòb61ñ·vÐHjÖT#S¾€šÃÙZ8ÛdWrïPã÷<û[&ðz¦m¾5›4õ”k\)åŸ0%®`~ še­Äœ&‰ðzð9Œp!kGZr4yŒñ”6s¡PR&ÐÂøÊ^Öš–äͯÆ*þpeälYR¶xmU¥3׿M»ÞØ“Ì$‡£r·|ÃÑHBû«„ëT×ÔZùˆáÚø£”Êuœñg ­tCD2“þ%ÊÏQíLŠ*GŸñXõm°U„vqôë8Y~Ä®F:•n?Q‘Tqnex" Ö Ýür‚œ"(1¬Y–?ý“§†ë +S—µvÀ’;„ב )% –’Œ¿õ=CÕš¹d) å’§,ƒrB'o¡ŒÇî,bp2çó®è«KëýÚjå{(òè\‚ ¦…oyصi¶r㱄ÚóM^°ïe)X±ÑÔ×|~©,©Áåæbœ…%´éÍ;½iT5€+xéSÅÚìBÌ;.WØ0¿Ü>7éÈoƒ—·Ô’*–(n”XÿÁÿkòÿ÷üÔ3zÏÄæ_¿98ßÞ2õó–ytnç£þÓåí™õËXЏw¬ÏöœÅ³I1Gn«vÙ&ïdeYP#©¹ªÔr{@µ02Ú·BT¼[<=Û4U;ZÏ# ¾GÃg:øÌ¨<¯x}9|mŠ–¥ÙÆmõò“{øÝ)^¸°ÂOè™É—Xah“÷ÌD±˜µO°]6@× ¿ó†)/µ¦)äƒÉÝwðAc=3 ª¦wRÆ¡,ñBmsä@å0<Äs:æ̉6§O=Râ Å„Ï8vÞ7wYxS뺭ØÐúû5“Nš~ $̤/*¼sêŠóãéÿ¨ëúœ endstream endobj 7264 0 obj 3544 endobj 7268 0 obj [503 /XYZ 40.7999999 202.579999 0] endobj 7269 0 obj [503 /XYZ 40.7999999 548.179999 0] endobj 7270 0 obj [503 /XYZ 40.7999999 202.579999 0] endobj 7271 0 obj [503 /XYZ 40.7999999 548.179999 0] endobj 7272 0 obj << /Type /Annot /Subtype /Link /Rect [71.5199999 557.779999 115.679999 565.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 7267 0 obj << /Type /Page /Parent 2 0 R /Contents 7273 0 R /Resources 7275 0 R /Annots 7276 0 R /MediaBox [0 0 595 842] >> endobj 7275 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7276 0 obj [ 7272 0 R ] endobj 7273 0 obj << /Length 7274 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÑˆIÈzì9Ì99³Ù‹Eœ=äïGÝ’ºÛ¤>R,)µm÷˜EÖ›õâÇ?}ùÇñ_¿?>|ùÏñÛôóáË¡®ê¶¿Ž§ï·¿¦RrüØ™¦’ýéëøíûáùø|ø|ø<üû|íùÁéÇ08¿bœð·o¿>Ž/?Œ¿ùòð—áÓÿŽòøçá?ÿö÷áÇÓ|§?ø~0}{úðËøAH!ÍðŸÛO§Áþú»ã¯ÃÌyÞÓ¿ZQ×Êè¤u<_çïÛGÑ˵²Ñæ(„ÖÙ àøï?? ³]–QõZˆ®Õ]½zÖNž¦Õ8ö]{J;“:{[9UêDm­y&:­H¤mMÔºóOU­„êÐpBAcŒ>wjúŠÙzÓŒ[ïÒ¡8O•:‘‘LV$Ò¶6£OÅŠÓuãÖE2w\¦J¨ïk&¼+i[›Ñ§¢ &5<ÅÄ ×©R'öÉ3ÑiE<œà™Š z¥úó6;WÏDîsž)`Zð¨„óŠDÒÎfÀÙ8%Òf¾L†¡á‘ãjøfª9Kñ”­ÍØÀS‘ÙÀ¨Ž‰ æ™’Ö É3ÑiEü\ î”ä˜Ø‹¬ØZƒ´ú]ƒ·îÔ1ñÎ3#Ï5ˤ‚zÂÔ2Só»gL3›%Ø=ƒÞY¼!ç,½žsEo¿»Eða» Bì¼$%”²¥0Ïay@ 3Qä5–.X"á¸j´ÄR †°^ÀÏV€%l‰3*’J6¶8pXûÑb1—×Kð‚Òý›åõb°V=Ö„„!WÅÅzñ`CŸwCAÅŒ|ÚôÆ¢þp„"?ÞãvfÅNvü>hx94ûªGøûGÃNÈyl)Qì wÑpç$ oލO_yc“åPÄÚïÅj›žë\¾ãÓo,âmÅzÙ—¦¤wÿ⮹©(õéâ1Õ=ûwL5æÀû$‹Òr;G[ùü~~oš8`(LXòoÛäØœÁr»oádH‹uëÖ‹õ¹]4ó®#8£l¤Ú¥Œ*Ç"Ÿ‰µkëÅØ µ}!ØV÷Óøˆóô’^Gð ·À¶?¥¿@”Õéñïaôí/~9|É–úŽ{Z‚…Ùõg‡x1ô/ï)3"ÿ,æà–’Õ†ge¡Eçô>Ö½E3nî"^8ܽ‡õ g{Τð„ËwÐ4Z¿ ÙŽði-šë«ó—­l{¤ž·Ö5ö3&þ¼‚I^/<3i¡ªn„¡Mí¢®F|3Ò ‘«×YÁ'8~Ï#|Ïäç®´´WŸ0˜,Ôàgä„Û\‘v DE¡tñAÌF›Ç pbŠØ©Fá@yO„o0Âþ»Px;’ŠÙƒGö®ä¥²?—Ò@…d9Æ=©ÚwsPCû¯@c-\P7Ék]g!›êÊìîRíXŒƒ(98÷˜¢­qí{!¾/J¿—ŠB>º øø{n~åŒR7öö1â¦)¨ëj+Ü9#S‚uŒ¯º³Ž *BöMØ1œ‚€Üþî×رk«‡N䕈1¶ɯ¸Œ±ñF*O+’ì3ç Ú–"­ÃÚè çË5ATª»ôÇE$„°¥ÔÜS*‚Ãϸi .ý‚â않Z ƒ24Ö‹0mß;m›À²Þ>•BS°ÍJÛ÷¼Vúâ5Çν٭mo/ý×ß[¤ø¡³Ë)ª¶™0¢ ©…¶^Ãîʬخ¥T;p8'3ÇbbRû)žÃ2µ~ñŽ÷œ„jaqI¸Ä=܆2NAçú¾¤|üÒÅöZXM5èqH©SIp‘äGDÇ¡„ÈÓÛ«(Y¯U(\·uiË= öc̨ zmÊ\U’÷”Ówm–­ÀȈ1QOeâËÙ/y¡>‹/©F؈ӫ±wQáÄ0xæ£ø  PR[ùÙ#$!$c z7n~m!Öâ¯éÆPF𕦷iÒöÂYôôÛ éï÷Þ¼‚!°FïYGp°mßùr®yÜ’róÑŽG(8¯n»ïqhwsõp#oã,(wJ©~ÇB*å.„b•¼ø€€é€Ð¹Rêe´ž*}—`©šXJ )…^<¼I¨Nòؘb Ô·gе^½½6Ú±Ö›ŽšqRˆµ¯Š‡ƒ A^Oíâæ½‰‹Êèëm:ØáEÙžÊ1¶x+y³œ§Êà¾+~OèÛéš©’ú²½Y†.ûÙM‡oPФ‘P,«V¨tΟnØ^Ýs¦î1ÍBb¤­%¬†»»IÀð¬ñž²¿Â);¹P*isÁ{æ*sæj¬Í¶µ°H Õ°Z‡£¡d¨œ"_N¡Ô˜Æ¸¾SM¹bŽ’'sO™;y”tªöÉ’éÅÓ±ïÓôúPû~lŸýX8áœÏÅ<á5ïýžØN+tq*Ë-žô<‚œ%ÓÚÑEaÝÎeáHo²ë/#¢p‘›¹^¨;-GV§ó­ÊðÂrK)\AP虇Pnaß·•ï¤nZº2•ÖLXGÄ4îˆhµS$i˜'Y _ª¢¨“‚ºp¾¼g᪂<ñ5y¯Ds`ÎTÃYá\Ø(s.ÞV—«ogur(ÎWå¼Ú.ïó.ûÏ(7B­oÿâ¡ }š»a®€#F¾#‘aúÔÑu ù”–?fµ@ °3*‰V7¶’H1­8ú…®(â¨)MO9*0§xž¬F1E³þ­íÌ Twú,ѱ-0N!LrÃCóÌími0­€Òt±åÒª] èÁ¦ƒÇxJÇt€)Ñ¥ôIñÅ­C>ãá(Ì7,´iLÝVâQzI¤“=´´$H¤“};é F]qü|ø?¡Õ¬¹ endstream endobj 7274 0 obj 4123 endobj 7278 0 obj [504 /XYZ 40.7999999 604.819999 0] endobj 7279 0 obj [504 /XYZ 40.7999999 604.819999 0] endobj 7280 0 obj << /Type /Annot /Subtype /Link /Rect [449.759999 777.620000 493.919999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library >> endobj 7281 0 obj << /Type /Annot /Subtype /Link /Rect [251.039999 577.939999 307.680000 585.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args >> endobj 7282 0 obj << /Type /Annot /Subtype /Link /Rect [168.479999 569.300000 203.039999 576.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags >> endobj 7277 0 obj << /Type /Page /Parent 2 0 R /Contents 7283 0 R /Resources 7285 0 R /Annots 7286 0 R /MediaBox [0 0 595 842] >> endobj 7285 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7286 0 obj [ 7280 0 R 7281 0 R 7282 0 R ] endobj 7283 0 obj << /Length 7284 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘ÅM °Ûv€6CCàÉ$ŒqrÈßTRmd}ùøH©zdc¦ÛÅâþöoþøùïÇþ÷øæåó¿_çŸ/ŸuU7õôç8þýáöÙUJN¿¶©d?þ9~ývø~ü~øtø4üÿûA4§Žó¡ñ<Å4à¿þzx3M~˜>ùüòçá·ÿåñOÿ~>þõoÃçñÆ/|;t}3þòËô‹BvÃ?nÿuøËKèNãŽÿÿ¡B!“ÖñýÒUœþÞvE“ 'ÔèºÑÇá£af8ŽÿüãðÓ0ÚeU¯…¾ÕÖÁ£¶rVtͱo‡ÿŒ3¦³µ°‘Dê@²«yW$’v&jÝzGª:­„j¥ÑãŒçoºN¿·jþ±^¥Äiã¦MÝùy¤ä#T]Ë4á2eg绀#‘qÀɄ瑒køË3и"€#±â@Ó·Lwq)ùÛž ™Æñ܉õ.:=C³Ð©[¿ •:Po Ï@ãŠDÚÖη‡¢’$S×Llù2RêQó°åÓŠXÐĉf¸˜Ðà:Tê@rynÕ&4ð EF]3qƒËHÉfj¦+WăöHŸXÔyU[¾{:¾ûrxó±U´/? «8éyÓ/ßzøÇ¨»´ÝñËÇßÊÞÛ?¿ü|0ƒî× «:)†S‹lPKýrjÑׯ~<}Ð]¿ÑXˆÚþƇàÑEÞ×™W÷òÔÒVu¯ZSß¶ˆS‹•¶Zܵâ¯:K³?¨Í4عkÐUÀ>5ÜNÝZšJŠna;µ†KjíÕãùœQñ¢íQ»w .qð•3ƒ ž¯ž°6÷¤‹@;ç¤1ܰÀ†Šð+ö|Õ9 §/>ÂýÅP<—¦¥}ø2pŽL|`ÚïCŽ<È7 ûheŸ¶sü Îç\s`Ì T¹ô—ãb°&‚ :l,'¥f€;¡U@¯¶ "'ºÜWG-¶¼À8Àó¼…-íÂ<Ñ·é[Žs±…Ð…åŒ ÒîãŠ‰Ž It< IbˆFhLÁ0‰¸ ,y,ó¶pZ“ŸùtFÛÐËM½nW&½J„mIDliØŠµ¥I쪮¯›û+ŸÈƒ0ç-ØÄ昼›úˆÊèf;(«™. ŠhC†µˆ©éü…ëŽñtŠU­Gß`ߊÛ~9|.®2KX µñðõ¨ŽšËªˆwÙeʉ¯ ¡=«} a®0æ †I6>}LKSÕÍ«#7$f] Rô½i RÀ–ñä,‡?h™!:#zIÓZ»ЩXtjöÖØ}:B ûô¨Ï,· UµÓ^[fȨ´´ZfvÔTêt.>ZÁä®u5Ép0•tòšï¯@¼Àý|Œ_õ ”ÂTL[ ÏîT”rèÞ8›n&˜¸2γ·v¢>lÉNè‘•Âã”cŒ¯"ü>&=¢ú™sXŽ|±Öú«™*öä‰ ^ŽÅjGiÈ*Zw.wñaJÀ8±z^é"tºÑ6u‡•8v:œ [º{kÝ·uº¬f®ug:uûÁµîÆ%X‘‰¯p•µRfFŠŸl;©& Ö¤ËW@<@A9£­ÄíD aDò”/yß"Àód7Ÿõµ±Hšg„+ÇwŸ&IT.cþÞŠ9:¿ªm®¥'éÉ»¥¸ßlð[s¿‰ºy|¾QQy'Ç1qØcŽ£¤NCè‰ÊƒNC‰ûà¤;ŠsÇ àûér£©ì:ŽVTád/­Õ<7·ò(“˜²á}YqƒP·ñtŠzÖ­Tcn?XC·—pµËjŠœ×]ël¡LîÌ*@ãÕÊèS„'Š Û£"ô¢2…éRžè‰)í)O„ܺ;6ò+Wm-lšö”6;çvm`%IèGÅkey&³è×f ¾ ÞÚxÏàGcàt¿d­]ɲø–ÇÙµ2g¼'1Wó¼^E¡pO"”pŠI¤ð¸ÝÞ›ƒ,ue7Ã$–u:Ý"œLy­5¦Æ+‡.B1?–L>6¹¿+¦tl,ó$ì²þ4‰i¸M¨?¡Øb'—朗õâzÖ¯·@IyÆ-8í»XýJê.aœ¤LIVÐÄÍïžhȦ¬€÷Ü(&{a× #Td*Y]©‘—§ T{Zÿ›ö\@ÉlFñÎ\Fò ÍÏà°%½«‘Nã@2eEv6Qv´U6f¯\Ã+îa¡“zœ:ZJ ¢|ÒJ)YØÇàr 1›Ph×S‹qeÅÓÎ㉯Àkƒ}A¼òˆd¡‹˜X')xÕ˜R„iÈ\V0.ÃYô¹ õÎY rc¯Žçìœeç,ìœãÏÎY6ÃYšKyˆ³ã,ÕFO\ØŸâà-Á¾s–³dÐYFö-s^—b±$•NJ{Ó õמ2Zr/ °b…•jlÆç²¡¦¿ 6L½È,)b¥xùú"2ö|c&¦°ÈOL0ãóˆïleÀà¥O‰=!Å«lü þ³_Ê8ŚиŠ`#Qð (¯Ó°:x#x<†&¸‚õcaJR«þÕ¼¾I™—*ÔaÏs+؇ç!ðqG{Ê$m¼Ÿ,éÛQ<9ò·ì\‚ùU8¬ÉF; }w~y|cä+N¨q[*K""dk{e *†f¸ø3ȃ’„Bý$ö„‘ˆð‚Ø^e ì¶Sõ¼ßEÕx1¾mÜÂ̢˳›úZ)|O?ÚFú‘©/1ý{úQ¹ýìéG>ž±§má©`#”¸ßt\Õ+œ Ìâ˜ÌS$¼oŒw3¢&¡\(O ×ð” ˆ’šn}£pŸiŒ’åìæÒĨ—ËÐñ¹P¥_Zíïå7Aõ¤`E€8ÁÓPòòNRþ—[½³ ˆŠ„rÑ éÈ÷7TÖ*iÿÝÙÑ¿†Ô{`È"¼ÈºtÄÆCŒ”ÅÏ{`H1—Ÿ¤¾ï¼óÎú²—œTJ%°›P°É‡œb£ÇÛìð7ƒßõ —© ï{=y™’˃ÂC‘˜™åñö”([ÁGOæÅQÙÚ¶çRlÁ®þlïËjÓÙp”¥†w=÷9M®›y ¨8× lÛìb,€úÌÝ2!¦9_ìl¤MŽžÑм¶Ù+¿3M]*E«„ ®1‡Ã$Û”3ß²”ÃÝFŠFüð•» Ÿéå˜õÊ.äÏÄ HQ­7æ‡ÉÉšÎâR“`Áf–Y0>À£4×ô0çyH¢Ê²ë;®àfó*¾ƒì{™»dñ§°2Ü-“º,:2æ{YS›‚‚,0–³?ÏàùÜœ¿8žfä*½²µ‹õÕñÂXºzÚhüþ h›Í¹6ÆkUÜ3Y] žú2®M÷bw÷Å¦JJŽÂå‘˹%cì-á¬ìˆˆS,NPˆf á ü²F¨ÏñÈïj²kL%”°ã„2+A­ZÂ#q4J ð¢Ï&F¾æÈœ Ä!爧™áþ‘œ]¢súÕ4V ÓšäŒØWÇ"¤€³¿!Õ¢bÄbaŒeX.OŽ­J)Ñ¥Œ&‰¼4TÍ9]7À¹;×wçz4‘3ÿ‹ N"TóÉüÎÛ²A\¼‡|‰bÂÁ¶Ž”()¹l…‰V‹2vÌâ™sŒe®ü`1L‚ãám"ã–œ›–69Z;ŒÓ³ŽH?×eNˆB¡u˜ÃSdÃÞüÒ‰¢[KØËï+5F »ÜN"|¡°‰×‚°µàœþO¥mðÞn¿ÞdÜí–Ø¸MÈþ¿6Ðø…ùÇ×osaµ¾Âê'/´z».›D›£¶ñȺЋ¦:íò¨êK•†é‚›¦jlÒ:«Ãºrnmd[µùsû e"zJU²XlÀ˜ª™®Ç¤Gót°OûL:N++Y«;»î¬ã<m‚ÏÛOÞÃïÎ2߃~D}fH}Ô"Ð>fŒˆë3ßXÌÞçµ êÆß¥íâm |§f•ÓÆé3{ÅÌ@ Ú{û>>¥Ù_öhÕ.„@ô܆ƒñŽáC¢ é3Ç[->AØÇƒQo^X`³ëꦣzp¤3ky´$¤âæ%¥Oœ¼âøéð"|€ endstream endobj 7284 0 obj 4425 endobj 7288 0 obj [505 /XYZ 32.1599999 785.299999 0] endobj 7289 0 obj [505 /XYZ 40.7999999 707.539999 0] endobj 7290 0 obj [505 /XYZ 33.1199999 783.379999 0] endobj 7291 0 obj [505 /XYZ 40.7999999 707.539999 0] endobj 7292 0 obj << /Type /Annot /Subtype /Link /Rect [303.839999 742.100000 337.439999 749.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7287 0 obj << /Type /Page /Parent 2 0 R /Contents 7293 0 R /Resources 7295 0 R /Annots 7296 0 R /MediaBox [0 0 595 842] >> endobj 7295 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7296 0 obj [ 7292 0 R ] endobj 7293 0 obj << /Length 7294 0 R /Filter /FlateDecode >> stream xœí]_Û¸÷§ðs("E‘PÈî&úP H€>}(r½‡»CÓ{èׯdÉ^/é%‡”ì*²ӢșáüŸáû?~ùûñŸ¿ß?ù÷ñÛôóùË¡®j]ŽÃßw×H[5rüÕØ¶’Ýðçøí—Ã÷ã÷ÃçÃçþßï¡ON?úÁó+Æ ûöëáýøòÃøÉ—ç?÷¿ý÷(êÿ÷Óñ¯ëü0Í7|á—ƒíôðËÏã/B iûÿ\ÿ6 þëð—ßí—`Oóÿ¾ÓB*­ÒÖñýò¨8ý½~½¬‡n[Û/QÈþŸ¶Çþqø±Ÿí²ŒÊêéü}É›ìð&-Tÿ¦Zõ‹÷^Ó)!ŒV¦^¼x#‡9m£ŽÑGYwÞ¤—M%'Òµ’,V$Ò¶ÖƒÛ„§ª¬jDcd«4 (h­•ý蓮þDl]èvÜzêD(^¦JHË3Ѱ"‘¶µ ©¨'A7M=žíŸâÈž§J†XÛ1ápX‘HÛÚôx*2èèÆmvuêF/S¥NÔÕLT?¬H¤mí z<ô];Á«õ…J,ÄZЛ^Æ1á°=Á+ekgÐ{S}fQAä« ò=ðàÓ×ÃûOö(Õñëý2N:Ûøãk¿Dq|7hu{üúÃñ÷½â¦ÿpüúÓAÈaüô‰ô>©Íéýú•ÎûJç|E¨ñ+W=yo’ã'Mըƴ'sšîÓ8RW=œ´l¯F>Ž#]ÕÙÓC¯o”Ëçãr?~íQ“ènÐkoºGï Ъ›^ÙŒ`íªáSy½9‚×¾î±=} ªqÕ×p±#˜+)ìièuäy|fÉWG°˜ªîg¤# . /V»ûò6ê.Zxàµâýá]ŒÄÓöF‹op€w!?r,ÉݨswçòÃH¼¢j•¶×„îOöin2QÏAMàýÎãSLgò ×À=Ôc”h„FÞ>ÇÙÊvõÛc8±0Ñž7ú:ò’ÍB’×(«‘hTq0L0þ<ªže|þ=jÄ„ _`»F÷ƒrésJyä”Ö:‚ ‚¡x\"'»,Ua¶è!’YʬÞâ<‡À°ùúrQMŒxCÞ͸üÌÓ¤ÔÂÑ ðÈ<›€žcÊ3»õ'‡°ŒAW:3PK6îI>¼O6#Tc—1vÕÍOù´Þ‚$™8÷­g4"4|æŽ|œyOF~lMã@*¿ °Æ8ïŒPv ¯ï‹,…žÜ#äž©âfÇ$I*0–Ƕ#Ä ÷^Œò¹°‚µ§?ŠÞ|O§HÄÒÁôG|X,f*ŪÀKÂ,ø^q¹’cñPÞ7ËR6¦— Ã/mçœ~ oÈ{Œ÷3a…ÜXB.ÞMÀaÀÂ"Sxä‡1Ëê9Éy‰ë‰Ä×Y™M€y.‡}„©Säêå•¥\ó á6Ä2f#–3›Ö´®ª¡z&ر:ó§·o™ñáçž Û<í²7žê!F+}ýÁχ/ÙbJôÃÞ‚~"]µÍéH„¨ªn1Î/ž¬y²jòëɦ–çÍ?CEpÇøæ"8¬u<«·‚¹2kÈðø„Uã’hç]n`9¯àD8î}ÐxÊCD€+"Ȉ!A¡=‚­C.k[‰y\¬œ¢)ÑMÂÁo|µÆÃ#‹]ž?&ÔJ‡ÝSà3e7„¢¬NÅùSãÇê(qj¼˜9–€›‰)Š?7/èÊH&mo o“dýöbÏ<ñ€—ú¼Úåùî2 “N4®0Ip D$ìt?–´#Jfv©§„¬6¢œ°Le)%oÖ™‹¹ø¼§>F꧘„Ôµ,Y}XXÅ„9ì¯YË—‹‚%ö—a/¨¢‹°r"LåcŠà/Tm¡PÔ»õ£ÊtÆ“-7×I›¥¨dË=Ly’æ Œ®Ù'D±Y2ô—çæÞeáÛ|ÀAMÔx#FœbðÃ5žåFÑ`¼H&e.ȽÊâa^uˆðª±ä6äufÅÈz¼¥ˆÕÚ‘"¶´q€¨g$|&PŽŽa âg÷SÃÝ¥Á×]7¸1Ò`ÈwpmΆ) Ó á=Öø= ›ó½H5¶àˆ„4&[ÂlX±RÆ…^TÎ^æ¾øøñ WGjøžR«ÆØÆ”H¢ü,Ï´Ó°µ#\pÒU“pÒrÓ /¿„ÇT¡0ýC Ð$ð~° „Ï4ýêYÌáâ”’nsøH‰ýÎÖ¬0~Z ÌU1Ä8e•Õá\úœáÞ¼|«óš4å4°ÎF±•ð~ jžÃU)¶…§`þ°>'Ä|k `IÐR iÒ¬µ‚|H×b¾É‡ { umÎêÜöËT6PCLé¼BIPõ}ã,  ”ÁG´^ ôÚ¢Ÿæ{”î¨U¸ÒãQc÷Û­`á©Ïš‰•SXéH‹GOöšÏ²TÕ³öÏbÉÎ,T&›’ÁÐ9ìVèå!ш®S$&žÄ_4Fé‚WŽl¦Œƒ,´~j¥}!×#Zxål=P+GªÄ$~{ùb^²K7,‘fë•H\"";«Ð[ý‚RýótÝ]|umÆÖÜC¾)¸F„4¼E ¥'MwyÊiÊ4Lº#úKaf9›T÷A\ö=Äèö¥…4¤;Jí£¸XúY§ôÂLiòEÉeŒð¯ñ^ËÁâæòt­µa”R‡R¨@ç.“B-¶Ää‡ÞhŽÔ_Ý^Œ0n–·‰0AíYz¥=†S·¬6â€{¤¶Ü$]Ec)Îòµ‚,×+d¾“0:t9[H—ß°nÙF¨cu\ò6L"4?_ÐCpeK»qQ2-9§Õì‘Añ¸}­¥¬^œ—.d£nÓÎôËiV·Í,Å܃-§œ/7zx9å‚VÄšG¦›†× Â/®…)&¼åY;ÿoÚ΢ا…èÖ½ð­±.×ݤ^ׯ= $‰µZ.‰ W%ð±ìÄω£]<ä‰'¬ê÷Y»‹\% È]=³ð~¥N']©C©x8—VrL=>™ª÷(µ Ó Êi{÷ÖÚmaYÀí£Î]ðåD1jÂ(ÃÏd÷pÉéz®+x$81¹ ”Ë y®Y”¨½¡Ò6*™v>U}o·s¯ív¶ÑžÀ1¿‡½ÕÌÞj&hëí­fh´S²ðÉt ¸¡%sC Ì ä­60ýø2‰?áÆ}Pwnñ{ð Äg†Ð–Â×·AåöÒgµd©µ•vß{©u|•™å›±l·©‡xÊú·ÇåZÏ®t/çQy©rþû¤eŠ8+SãÞÃ:RCMl%Ì0¬±FÈ*ïÓÇBº'Âwk£4ºð·9)^F~ØK“ŸõKt—¾¢ÃÕÓˆ2·œH ´b×0^ô|&‹{HLnãfÒ.dì0&,^A`yû|Zk1¦\*µ¼_GLÚ %zåå¿ÂL1õ^QE5Ëz­uçpû=0WBÔwݘK3_H]È±Ú »h`@éBB”48ÞÄ¥ÌÒÍ:¼RÎñhz®5»ž-‡GI½Æ7ÜU7l¹åî¡Î„SÛÌŸ Ê©Å×}ï§–vj«Æ}ó±tĽG÷ÓD?MÊ ©®½kR0D9Ä’‰@O}JúÑ–µbÜÝ’z°þ~v-¿˜–Í7ú¿Çï=ƒèÿð…éÇ·_Ãg5õ+«ùd6ÁGg¹”ÕGÑoãfi±ÐÕÉ5tljõ–tµ®ômÏ]§ª2ž(‘¦2·;Ƙ#£YÑ4•ìn^3Þ¶•]'¯#¾ÇÂg:øÌ¨Yɺ†\Vyk¶ñˆ\ò¿;¹ÐoìðzfR2n´É÷Ì„±˜½Ok;€ª~—­0³Ø§ć9:h½g&Õ?SC¯#µ‹íɾ5?Ä)¦Œ9üñÌ‚kk]‰¡‰Ê[tLþÌ[Û€è˜5qFF®xü|ø¼Ûw endstream endobj 7294 0 obj 4440 endobj 7298 0 obj [506 /XYZ 40.7999999 213.139999 0] endobj 7299 0 obj [506 /XYZ 40.7999999 691.219999 0] endobj 7300 0 obj [506 /XYZ 40.7999999 518.419999 0] endobj 7301 0 obj [506 /XYZ 40.7999999 213.139999 0] endobj 7302 0 obj [506 /XYZ 40.7999999 691.219999 0] endobj 7303 0 obj [506 /XYZ 40.7999999 518.419999 0] endobj 7304 0 obj << /Type /Annot /Subtype /Link /Rect [222.239999 586.580000 255.839999 594.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7305 0 obj << /Type /Annot /Subtype /Link /Rect [438.239999 491.539999 471.839999 499.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7297 0 obj << /Type /Page /Parent 2 0 R /Contents 7306 0 R /Resources 7308 0 R /Annots 7309 0 R /MediaBox [0 0 595 842] >> endobj 7308 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7309 0 obj [ 7304 0 R 7305 0 R ] endobj 7306 0 obj << /Length 7307 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹½€ ÀzÆCÃrr¼Ù‹õ"NùûQ·Ô!õ‘¬bQRÏ´ xÆ­&E‹õ~¼ûãç¿ïÿùßý»§ÏÿÞ~>}ÞU‡ª©Æ?ûãßn?ÐÝÁèñ×¶«º?þÙý¶û¾ÿ¾û´û4üû}§šÓÀéÇððüŠqÂÿ~ým÷n|ùnüäóÓŸ‡ßþ·×û? ÿûeÿ׿ ?~šæ;~áÛ®ë›ã/¿Ž¿(­t7üçö·ãÃíþò»ýoúӼÇh”iÚ¦ËZÇ÷ËPuú{;½l€PÓV}³WJë¬pü统‡Ù.Ë8ôV©¶±m•LŠô#pÔ¡¶Íqý ³y2 ‚_.SˆgôÚaÀî}Õ½ "ž~Ÿ(ˆ ‚MÞuų¦ÿ¦1`ã-M·³;t}Õ¼À|ÍDÇ;‚¨à Ñ\²¨û5ð Üz#¿f\kh›Úš·O^Å ,ìð ‰aeXf½ŸñQŒqöãb 4~M”DyØOaDhð1’©hA^2¨ž/ 1<(ý̇‰%.¶µPTã+A¸“Ñ¥M¥¤Ø1©ªu_V"æ°Ø(㦬Õ[‘«±„v†ÂØ0FDŽÀ]DÛóP4°Qü>¼Q|µ¯F0±¤î“²¦Wª­OWJ+ýR4ìµ§0žL·`îIgƒc&ü™{ò Ÿøä#}mÓ5Ÿ[uǼ‡càÕÁÙ4zbàNk¸j¼S<ÆÀSÀ§g«+Æ)À“ <Á°Æ8 ñÏ6!¾aèàS° RsQóëßZçPžé‰ÀJ‡eösËÔÍi™¦ºH#„­Æ?×ÅÀ'ÕYÖhkwLO£žá˜ŽQù¨ºæþ÷h¶éb4sbY·h9qØê0êÈsWÆ›­‚cðªá 𪵆; .ËQõaäΞ8EzÏ$Ç•‘mÎB°ZDdÏ\ϰ¥NL.I»ò$9‚¶K0̉š”dÍ p2Ž5ˆ>¼?†ª!"3S¬²QÀÚçiçµqn8ÁL˜äž}n˜w&Ýߥè½ðiGÛä\Ù¸‚_Þíb;‡º? ùYö Sí¤qL¾iÕK^Ü“Ð_D.×ôîQ6ßYîLŒÕ BícV0‰{è±ÍÎxŸ¬7øÄ^ÈãôÆG‚íøû·A²€¯FÕ.rÉ|u(ã3Ü ' Ü•(šSÂÙ0^¼/.‡LJfcϼ½EÀÏ’áÁ!ˆžS…율­!cÃ’rNd ”(~ ïÅØá ñÎ+(`OØ÷h—MŽr]œá[;¤f3t~;Oœù ‰ÛÓ| ›¦Üëåž@`6#y-eŠƉ×ize¡AKºø­jÏÒv’BçòÜCr°¸Ø]]üð=ØñÍq½ìØQŒC`XÇÅßcÄ„þL2Mt=²O4ÆXèn`„|+w&°Æ %ðÝTø=샰65ý|!:X¼jN( „¦(Zà =á¬Môþhxrø=FÌ‹@kêúüÖçÒÊÆdÖ¨/;}ºpÈAÀcÞß,‡*CÎb¹E]鑲dmy–‰ô{2Çc…6GiÊI” 8µãé&ñ«DÑ8—1•ÛJzK*•—m®Òh¬¢ÐXëYJžÕêúh÷’ðQ~žã6»<Æ€UÇjAvàg7üºû¼|¢ÿÄR¯ § °2=óÓ‡§hÁbŽÚšó汄@È·#DÈ1À²Vb9…F‹ˆx’8]ÇÆ}‰ä©©æžÌs^'ZÆÙÅBñš8É/'3þ.}¤û'L~’L+ÉÚÎá”Èè¨ID±xDd¬‘AAfN\#§ N±†/N¶©¤üeBjÿÂ>Qáò ¢,Þ\›+p(×Gð´ã’ôaD( MvËC¤Â×2BÕxÚºÈB…wòãßN)¯¸*4aÙªj£Š¢¼¤YeæÔãÌhr‹¥hàñ—2ÆJJžÆal>(#Îq’äîIwM§4ŒgB&_PðâU6”dÚÖ¡4,Ý{íÊR²6Šƒdsþ¥ÄO™è.ÏÊÈÉJ…c|:Ïîú¹™HÖm:Ì91q«‡c}0=^>¡’\b%C7B3 ²•¶7.[aøßY&‰K)“}Á© ·eТ1àk¢lz$9ÅàþcŒ†+Ïšê}ãÉý†û9GyUÊq[J|­Uóy³Œv¸íãȼ–0X8y5«¾d‡T©‚xpl¾ó(>Ùð·"Ù(+'XP$#®L!‘2êÇ„-Xžýšáwð×È)·D0` 3)À.ræ œ’Õ”e’ƒ ñ5²ÅÍ W)=:%©D[ÌÑ l¬8oª{7I ¢l˜5'è+æéá2r#Æ&]H¢\–t>çóô®9Ñœ4e鉒SZTÈHó:-®Ó†iÃ[kF4V<H$6tÍò ª²½Ëoµº”ù¾…'-€Øbz‚\/Ë·2ªÇ°î'‡º„;‰r‘aéÚ ö{ß-ð:}B…Ï‚›^+ƒr ×v`Sîô:ù˜%‰~S;TŸ¥ð‰D»sºí0¢~,’,ƒB<ñˆPeËë}ƒߨ¤ÊŠùM×AK@k. °Ý&Áþ”58žÚ\*/ü-Á¦†_Ãq pIJ~”W˜fXž(^F3>aŽ‚»v˜ºˆ¹LÑ9J©hŸ®(Þ”$ò“ƒòJå—ñ¢ôft½'Iü%¸êwm4,/d\Û¶(g¤ä¾‹ ©‘ÆXMë¬aÅÆXxSöÌ&Ý*Å[n1…÷c Üð{Îhì¯Z™ 9µ«xf«ÑªUƒfÃp[¬™V[µ/;GÙ9º=¡„è«29R´ÓCS²P¢‘r¾U‚†"´H|‘X\Jv+ð%ìT¸Néêm„¨‰®zÂö9Y¯Œ8ï¬.Ù xR+m粋Ü ½Ç¢$Âur¬Î¾ÙˆÀn[´Ý–ˆW—BÚî²Îæ[¡ÇÚ•›‹”Z³veW×1bûjW·yÚe7Õ®ì…þæƒ5jWö“Má ú×Y»R(B[¢¾ŠL‘–²9iQV¸€q@Ÿ›!*ò˜Vš^øLF¨ èõ˜¤M/½òJD•EÇœ1¼qxn#P2|ô‰µý¥@ºTOè7Gqg1¤Ã·cõÈ \ÃÛá$Ál_ñ¦ŠÞ7Dë¢å´Š,ÃA8&#ì¬.“ y§µülå’´ÕÌ´¬Ð—œ´Çè•eùg=õ:¸áY÷Üy­dÚc§Ü«àQ"ååp 9É)M¨pX¦¹2qyÝœØú…cr2´hñ••Uî‚—³«Œs9Ë´z~ˆÞ¥Dï²ÕÉDªHS hÄLëFÉâ åÕáNYt”¾É“Óœb|9nYlõÜÓÃ/ ¥®“K²\PSuÝ:¨šÓ×ú!‹l_)y͈]¦äÉ™–î_ð`éÛ¯Ç$ƒsév6JnÞ¢Ð+Èwš©€ìˆ´RC"¹ˆû¸³¦³ÝË=Iõ¤‡¶¦@Ït½”Ü»¡DBe¡ëœõ°š¶Ãƒ3Ьgœ ŽÑ X-íÛÒ‡­ºÚ.#˜¢Iºv(&“²âÍfÚ²ÅÛßY O@Ö[œ™Ö8¸»¡àè7¢ÁçXË_™Eð~ cÄ% ^%H@OtvYAÙ( Åü}åe£¾Þ–lt]ÏC6’—®Ð]ÚdPXÛ®ÍéŒB%Œ%¥¥ÚºØüFí#ë‹í‹²î.κ§HÓ9ú‹™:6kà (£rîu•¾°î"ÕÙ}«+GÎgd­°ŠøˆäPò=8«_çB¥R¤÷«ò;^=¡†x:Ñ]^uUídú Ñ«"Á€ Ы^—¥W÷ŒLˆwJ/ É©ÿU4,ú¾hB\ÚÍé’¥Vl·jË’„T]’è„ é²ñÖåI¬ºtà Xsrì¹XàÔõÜ"éRÏB†Ï —¡Û`>éƒcmžc•4ËôÖ!BoŽ)úA˜¸ëìÚ^]-S>e;•‡<Œ›ë'Å©†×hžÑ FE“lñkXR ¡Û¥hÙ$Á¬™¢é>µCå7$.®2@!¿œ ËœNÁQ¢ƒûo°êÌB¬0¶ÖT¹KË5VíN”I¤wÉ$ÆxãG–qn¡|w–¦˜Ÿ•®U¤æã¦|ĺkkTH¨äxæ9¨’qõ^·U£°R»äømûrl×»÷*£ÀªL‘Ô» ?]‹ô¯œE_2£§¶.jÞwXî2-«9=ÍÊYDšqÅëÚÊÖrÉê•+AÊr ôœ< V3ò2rwÔE²Û}+½±&A (½}G‡q†1ºhïôŠ¿¥À©qÊZ­ßq×5Õ)]7ÊØáduÿ]Ø6»Ñ=môK`ÒR{°Ž†ãƒï3ÚX7ç`Æ2Ñ{ÛÉ;]:xsq E‚´zQøS¾$[2¤3µÀ–£ˆ¦ä<áæ—©œ¶+6¿Ô ŽÁÍ"§æ—æÐη]lÆ+;†[5¶“Ä1õêð­%$nÙyí¢;¢Â°eçDãgÖ6%ŽÎ5ÙijUp \õÄÿfV€~Ï<¸SÜÌ“³Ó¥svÆš—ÀiÌIá“q2.ÑÒœÁ|9%!Ê´ûÞplÞ2é 6)'vŽrHioDp!ЦµâÛ^®#¡üöª‡gì"ÅcJðIé¼Rðí¨‡Û)K„)‹hÜAq$´äx~=Ðsðœnï¿+Õ²lºn‚Å1Ç\º—É1œPŒàjJ_YIå5(W·íËWΑ‘÷îºÚ¢¤½ò&©àW{LLîò'Ákœt×9ÉÈ»ø«O«ÜÕ_ŒÑ`'onõ8ðÅxÇ“Î7wŸÒOENÕ XòÛ1 Ýš ~k•£fž°`€W€}x Œy30N^«p5è±xÕp¶ÀN!Ü ŒÇ $‹®c^cÌ’·Öö›ÕúO¶|k-¾›ð=ëßÀ/ØÌMo.0œã ˆlùÉ–oºÁQ ¢Xn ÷yíûQk}›Ù° ˆ•¨é “”/÷Œ¡24$O}tw쯕³¬ó>”Òl¦W·ç¦ˆÂŃA@Yd( »-+²x |‚«ŽcÜÁŸƒYµ‚x°UoB$®{{°Ú²H¼eêÀR˜ïò¦?x[*Eþc Ç/L?¾~ ПUW"ô)H†‚Cã*@³?&±ÌVúRÍØûooªKÛÎ)|¬94ó~¯Þ<©mD)ÝÚù¢BíÌ“ñÊsÐýlHH]šQ¦¼>iá{:8¦‡cF¤nõAW§X9÷’ÎÍ6ƒÛOžáw'wäÌ?¢1“¸;÷D¡}Lª mÌtb”½Ok;]€ ¬;þ®kÕFO[á3…x ~ŒáAí™â0¦]ŸTîiOµææ‡gŠñŸ~z9…®«šƒ:Fý¾<ŽI‚™Û<õ‚2 RÅý§Ýÿi’«£ endstream endobj 7307 0 obj 4534 endobj 7311 0 obj [507 /XYZ 33.1199999 120.019999 0] endobj 7312 0 obj [507 /XYZ 40.7999999 77.7799999 0] endobj 7313 0 obj [507 /XYZ 32.1599999 121.939999 0] endobj 7314 0 obj [507 /XYZ 40.7999999 77.7799999 0] endobj 7310 0 obj << /Type /Page /Parent 2 0 R /Contents 7315 0 R /Resources 7317 0 R /Annots 7318 0 R /MediaBox [0 0 595 842] >> endobj 7317 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 7318 0 obj [ ] endobj 7315 0 obj << /Length 7316 0 R /Filter /FlateDecode >> stream xœí]KoãȾëWð`8ýb?€ ÀØž °‡Œ1CC0›M°È,âÝÃþý4ɦ$“üZT“¦šTÙ€%«ÕŪꪯª,~üë×ÿþ½øøøõÅ·ðúøõÀJ¦YûSÔ¿Î?¶”¢}klU Wÿß¾^‹×ÃóáÙÿ}=pÝt /¾±»DKð÷o¿>¶?´Ÿ|}üÑ¿û£Åþ¿_Š¿ÿÿüèÕ_ø~°N×oþ۾Ⴀëÿ9W7þçð·?¿zlC·þûAse}§Y|¼»òæ÷¼+º˜×¶š‹‚sáù¬¼:~û×ágOíÈFéçF+Ã&S5¢&[)Q8£ Îì€è@¶‰¤æÒÊ-C¨æˆÏ3e⤒Uo¼é7bJ9WÐ#©¹„¬\h kŽø<Ñ:ÕcRɪ÷r6b =t¥k5HÍÕ˜óÿ/4†ž#>O´Nõ˜TªêwÁ¹+1[cnœp²ZÆ}Žø<Ñ‚ê#¤’U¯oÄ”b.àIÍÖ˜ ¹OÍŸ'Z§zL*YõƨFLWÍVX 4[aV/ƒ7 G|–dâ!¥d½{7j„¬Ì\);J³ÕåLµ!^#ÄÉ:½CJ¥Õᾟr[Ä…¿ˆ¿bqD´çEÒkqJ¯_#^¿p%m=›xùÙËÛLIÚ—¯ÓªøPçžÂ·þTüÙÏKÜ_Š—_®¬œ4U;‡i[¸E-LÀ>j‹-Š¡ñ µÈ jç ly€-Ÿtýyƒ\3©i¨h!êMÊ%uÍ¡F%äZ.*iŠÅ yƒ}dËÁçó0€b-Ø£Q]iQ жؓ¬­N«R Ëß|5hÛ–Ö±·DØ€ƒ_m…W}kù*æ$x…)Ù`¤Z›T¥jØ–‚åYÌ£ø‚ÔÇž U¬Ì=–Êu…îùb†w9ø?Ç%0˜ˆ°æÁp‘”`ÞpXÂ!ó†CæÓµƒcÄÞ õFÒ(O®knT‚pƒpã.qCa†Ô8´ˆ¤k±ûÂFÑK ©E&}+M°1x|0™ ¾á+k1ç–ûAüÛãeÙ`€Ë'f¬ÕBY_,ãa8ãÉXRšü±Æ2GùÆb m˜:\Ø0±º[´ÎxÃD´VÄY© ·^S'"xó£%¢KÑô8oÜÓ.ÈüXãx·Ož¦…cæ:%zø! ×X£,a6ºÚR‚F“æÝYd{NV”ímÜi¥(ôNYýN±ƒLp£R4ö[Ç èϑȯƒç¶¸¾Ü¡$Ê…Rö×ÊàðÚCØiäÊɹe£Ø™2ë!ì$ìÜ.v&pMVµe};ØæÄÊ›sËFcƒ÷£±-ã=/ŒÁ(‚Q£ö^Ì1Nç-·Á"ç¦ðþRÂjXʹsŠ`[`4>w $ýÖcÁ»x¯5¹ðÈÑ.ìþâÇ6g@kq­*“X è\ôæcÁ²»6 (dŽª4;ËÛâó>昶«w«#u-hGi«ˆ’nXC¸±uÜH9Ù¾ìîu5B!B¡…8£»â¶ŽB)•ÖÎxð~fB-$B!B¡# º3pë(D5òF”Û×tpÜtÛ×tº©é€K+Z¸•Ihík¤èU{˜Q„¤Úµ3#ÊÍ3Dªã`³u œ¨èÔë~}“*D䀸™xº¡1Ù±§SM‡ÝÙhÎ'52¯µà„¥S{;F;ªÂ@h—Úщ5ºŸèb4’ÌÒØï7ÑFwd½t|=®s¿7H :7¸_\§]ô¼‘8ƒ]ti»í“ŒwÑÃSA8/+¥'>ávÓ¢ÿUÈÉ@±´Y??¤)Ižg†4¸ÒôœÍG¦**«»u‹¥T+oÌÄÓ ݺ§ÓÖÍþÐOÈi{$o¼k‡F!qp,ÁVÆ:È#†::ðI1ô14çÇãR|_/¾G¸†ž•R€>I˜78>‘X€=˜r‚úÂs‚ŠÏBUÊ 2È 0‘X·Ki^Öмzqô^6†æÞ‚Žºzß½iF·U\mF··YSˆ¯özœãî£j‚]âUÂÁDÌÃÓµÙéhݧsèé)+FøXt$ƒ#tØ':ؽ ½#t Â Y[âígW¤Ñ}Îâ4«v:„Þy£7­Ûåà%·,tƒ¢Ñ1‰î¾/ÚEÚj4J¹ïKà›üéÑI`t’FB±VÙÛo+B¤{0^A£]Òø$ù€ÜêÈ-zj2e <“,KÉ9–t7¸¾Íü‹Êmç€O¹ïÚhMw1oÝÓ¼"ˆ-ÇÀ„u?B‡(:@]S>˜¸–{ÎeéŽ×­ã­Ä;Jxÿg¤Ø7 U U³Ðh„ëŒ ¶â´…µ²™€!yD0ÃöêwtR`¥½}:ë¹ÅUƒ efMÕmÎf\f[ÅEPy$ka#õm¯'Œ¥À®H µêR4O«¤‚÷Q9Õ·±Ô²½ÞQ±V}[Y]K.ÌŽ9Ày!Îð)ç•$TØ…à|?~žãÜ8Áv8Îõ³Èš­ÐÙhq­–½yºJØñ¼½×RdÉTuqìií7o  ÚàäéæÇÖu%pÄ#š òêÂôclÖ†ç=x®Ô€IÊ´j0Ó“A.ÑM´&È¥4$'×K0ÖRƊ瀘|ÊDÜÀ›><á«*W…¤,‡§¸:†b¼¼©hÅ"®^߉0Tç^Q¦>äþVQ\œ0jð kí@÷aùü+®÷• >?ëô0¸R«V.KÙúcßh8+µjLüÔÒîÛpWú´D¾&qý>»ò©ÏnØ :#7¼f_:Œ±.ÃbÓ¡—[Úq±àíBwK¤Ç(:\"5}ßo±slõÊ" ^¨¦|U@h‘°EA–0³º/×@ÐӘؠ/ä5 ìغ.ëá±n¦«žc"ý¯  !‘,F–ú„DBzd'0bàXï¯NcÕ/¢ØEEÔ7è -8,W[,f>¢Üg@j ,f),–2(uºßçÉÊÂb]CuºlÛN•¥w /µžßÆ—Fj€~× ;fÞ a8ñcÀ—Ý °àé¢xxl§³Á‘à‹Ä¬ù÷ÛP î}çÚ¸žãïH9|Šß•r/9Þ§Ç}ðÄéÓ{£„i¦qçÚ ƒªËJrÿˆ·ô }˜FÝʬèƒbäˆ6¦”â)ÅÔð Ÿ)øî3ç?îiŒòëº&Ó_‚>~Òê–W•¾ ÁöÃä$=‚ãPIáþ¬)iXÄaŸaJü°”yyçucæ%Zëâìh]GocíO?XŽ´°N•¦ê÷ùt}Žû8Ø'œú‘¥i#ìHÀéS ‰geC:ÈA¡R‰ÞuÂòãX î¼ó¬EKƒCR·Ó†ÁÚ9yEÏ“Öä:l?Œð–¢ë×jëͯ“`IyDž¸”4BM\߇A«Â£€¯ƒms *D-´4àä‹WBÍÂ#+ÂË·ïXâ;áÙsÑ¢]/C¡.¸c ¥¶e«yÄ`ºÔã+zN•ƒÒ¨0¥é¨6ˆš‘–VR–ÂõBWp„ªÔm0éƒèØu,ìã`Ÿx(k,¾oîcÔZ“:ÿä ~7DÏ ¿ >8ÆZ8’#8Àu}ˆ]#{à­q€VW¿7G›ã1…vÀñÈ;¨}·ïÃÚ¦S 붨 }8¦ØðÈE®í9œñÜPçhÒ•1·˜§*Y¶ôÇE¬ÉZ¦K^gAoͪÛš?›*?/‰îÅóáÿpŽ endstream endobj 7316 0 obj 2901 endobj 7320 0 obj [508 /XYZ 40.7999999 200.659999 0] endobj 7321 0 obj [508 /XYZ 40.7999999 200.659999 0] endobj 7319 0 obj << /Type /Page /Parent 2 0 R /Contents 7322 0 R /Resources 7324 0 R /Annots 7325 0 R /MediaBox [0 0 595 842] >> endobj 7324 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7325 0 obj [ ] endobj 7322 0 obj << /Length 7323 0 R /Filter /FlateDecode >> stream xœí]I䶾ׯ¨sk¸KÓ[€4¦‚‚±Àðnûà¿UIµ´Xß“øôD©ª{˜î)–(òí?ýí˶ÿýcûéþËoÛ¯ÝÏû/U¨ Ú?ÛÝßïÎ?0UaMûkYùÂÔ»?Û¯ß6¯Û×Íóæ¹ù÷u£ÃþÁîG3xxE;á_Ý|j_¾i?ùrÿæ·?·fû÷æ?oÿõïæÇÝ|»/|ÛTuØýòKû‹6ÚTÍÎÛ þoóÏ¿lm–PíçÝýû]ÐA+ã&­ãõø¨Þÿ=½¬P©v‹ÓÚ4ëô 8~ÿqóS3ÛqEí´.ƒ+ÕèYK³Ÿ¶ÒÛº ÛÊûhÒhoã¦Ò'ÒÊz‘‰ö+ÒÓ¶¦•+驊ÊYmKãÝ ;øª2Íï¥íþ¤l½ íÖk5Ї©¦NdJtìW¤§m­C1—´kxk·M_NÝça¦És¥ w+Ò“vv<œI” |#ìdpq˜i2}å„&Ú r\ôgzQW椮^‰ï^6Ÿžêj~ù©YÅ^¿·?^¾m\óŸÐtfûòÃö¯JÙúûíËÏ­ ïBUúý÷ö#ê~?âNØýe¡jÛ|Q}5ìGªãZ·³šÂõ¾ŠG¢ITÙÿ ¿"]÷¿ñ¸ÿÀ7L¥§f7ý5·¯s‡…=kÐÆ‰ÝDÐópúá}bpÂ¥E³š§¡×¨‡ö5ª¥¦ia äµý,Þùj? ³ß' “84‰‰‹±% `‚Qñð†ñÈx’Žq1bÐ7œY2%0™ŽpÑ®õñ¥Qóˆt¯lO¦’,A%Ð*þ*æì>Ah5SÄÒ¢]@æÄdílŸ¼ú6Ÿ‘ÒŒYCm<‰ÄSÚÇVŒ6,²!Yâ‘a¥ J6‡·X]Hå'иu0tð‹b‚P·÷ˆÉ¬E#º©‹2øðvp$A¡,„Á‡ÅX‚úÄ/f,v%U—UOI,‡·„ÉwŠ)‚…ÛÝ&°‘2þfòÁ¹ #¸-²‹Â9æn¨eMÅ–¥ª¢ªU—;oÖˆþ4ò‚â.zŠ@"‘„dàx‘¥ƒ)‚ãH'è°¹)u¼çGÀ>‚#$ÙX‰&ø“Œ Ç7àˆêaS €q†A7˜È‡–6« ®{’˜XÍ jK~Š¥Ë²¹“ÙIcÚÙ úÑ¡¯>ëN¹ûhAŽ<‘{4Òi¼ #Çã‘9ã ¥íñzyº³Ôæ¥Òïb´;XOÙpä’F6|FÁèNnâí « #¶Êˆô+<\)ÁqVX`±Q1pbÒ1Œ©‚a¬­Ó.—F t4Þ•„ÁgœÙ°ðÆXÀÜ„a€UÁú•‘”¬áp œx¾GaJ„Ø&ðƒG0 °\çPÖ!£ô.õ°F…úã°¶‡”ä2yïG8¼œ³^ñNo-ÛúaÛÝ m·«/èÁÝ-?b!³qꋇê ×kUTëÁV¶H&£ªY6cÌÉ dåîzJÔšGX¶ÖÖØ.Á4ƨq`iëwcgaüF}0aíâÙDk±eé“·áØ2Ã`ñºRlk–žle+Þ)Ž?1V@dNÌÊC-.]ðÚ0®Cïz»V2ÛH®3sX»bNgð –iYéÅæ®¸›à…åˆÏ]»–uweîz[‹Í®£ÂÒ×Sj>¢Cð :wNòï\ƒå÷áW¾'¿’ FüžðuV|–ríM°Ù³ÖžÆxôSò=9mäP.ñÖR<÷[ëÄCD®]˜YŠ¥gÕ˜eûí0jX°^ü¬„p·ŽÅg#l8¼6F®ï:ÏNyŒ9NGÜdO•p𓉃ñN±DÂ’S!OHÆ X²ŠOñytµ9DMßOߥ\Õ½9ËÓ¡9ãf¥›=_¼âæÖN¡ÊÆå×(Ã!‡‘Ó?«Ô!",ëŸ ÅÜ Ú£–cóò[´ê᪭¡•$›aœµÎ°¬¸N=Lœ ž£C¸%•›ÂðzXg0?º5ñqRNêV‰-N|Y´/?q¾3?ÊV²¬ž»ëì—וŒŽFD¥óât‰­.ëÍU{EX¸p§¿‡Så+{F3Ûâ"+¹rjºZ¯§¿$«£QNXÙ)‘¼œ‘™ÚO©ieÝP‚cûœ&çôæ´œ4Rº%ð]"qD„@l=ô¥¡Z[â;4Sî³¼ˆ0åšCÎÍ„ÑírøÞè.Ôèƒè’k‰+.E¶E\–í_pß¿C[örÏžÃ7¬§PGÂ-œøÖOÆõ×ñÍã§\Þr¾VE(5}--q;ltýc=Κ˜pÓ/$¿‘pWëà…„ (áë–_‘1‡&™óbHåz*cE÷L®{̦êµÖ‡Ð”Á$Έl šHÔ1Úärð8Æ%QlÂh¥Fì‡ß¾3]Ú*3]® еâ¤VàPŽcÙÜEÙ`1#`C\Z¶æý0èh²–i?ž‘žä$ÔW°ÌYXò1‚±ƒáÆ<ºÀ—èR64‹ŠÙZWÎ!Uóà± ëÁ#>Ÿ+Õ2‡6ɃÇÚ¯»\|-šF»ÕàÑ`m› ³Xyðhíjðè W€G¾Õ”þPhÚ…¡çO®XÞ’Á¥H™hÆ$! ¿ÚŸg±;ΟZà$&å p¬p0Géaä‡@‰à(#’rÃÁéð=õñ—äÀT1>©".çÀ3š>J¦à¥OütZ‚¶çLËàÃ[ÒšÀ÷î¡[¼·{ˆœ}§wúï#&¹&ÌÌΩLªª§Mæ¡ÈÔ ‹Pçáœ$~g¬+>“eX]g£XIFˆ/Ë9RPGª>ªxÀå³h¤È àñEñì äƒi=Ac²‘Ðç#ŒžÛq|K732ò±2Ô¯[RU­Þê×fɬÙUFml_eD¹ô>Àb`h_rP %[œ%E”Éˈõ`r ²Dņ:«¸E´H¤ºoý–Ðua8ÁFZ˜K 'Ô%Z(Of1™·sF™jkÛªØ=%(ƒã°`B—0Æ?¼ìëüX¼ËJæÆ rVå7§€5ÁÿXÏ‚¥U!𱨛™È®CmTJ÷ÔFBJ„ÄJ îˆÚ‘ë‡)#Sîé6Ï8h±£êÕvW8Ó¬ -ÉûvQu±_ëö¿0¢½ôýg>§?£à35z¦;ÝÖÈÆ>þO%~Ñ~ÌfÚdH¤l.<Ó‘È¥gáˆíÎô³.ÄlOé0À«&ži l—Ól)ú;Ý©¹Î†<ƒµFûQx6¼jb6fs­ºë°Q®ÓÛ}ÙqaÀ€5‡ð{ ¸u4ꋪoþ?À¸j¸6¼S‚çà{üˆìEâÑiÓ“„lÀÔ‚¹ÂÀ„‡Ž´ "”N7Ãäq²hødd¤D3û,×+2J"³|ðäp቞nÉáÏ[†'Òš*·¼Â€”¤ö3ŒÝ<õE¬z´ñ 3Tš«¾ã²Å.b;®'‚3>äƒ~‹çKŠ-WG;Ñø>[Ïê;Äèè%»Ól}®D¯B̵jâš/Î¥°¯`®ýwí?5ï úx^!='è85Ô ç¨rס¦ô4À5¥£-›Ga’®¶ÇíÛf4°|FG¤98QÏ ‘a”OÃYÕyŠãz¦Kã5Ϩvè4¢úØîR#—æ‡8Åt€1G¼Ò³ýŒ8׸þ>ð›ñjñš:Ëâ5aJ¿¡¦ªR¡Ð»sToɪ“ð—6ÉêüÌý³¤tß>oþŽ€ endstream endobj 7323 0 obj 3879 endobj 7327 0 obj [509 /XYZ 40.7999999 208.340000 0] endobj 7328 0 obj [509 /XYZ 40.7999999 208.340000 0] endobj 7329 0 obj << /Type /Annot /Subtype /Link /Rect [162.719999 377.299999 271.199999 384.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading >> endobj 7326 0 obj << /Type /Page /Parent 2 0 R /Contents 7330 0 R /Resources 7332 0 R /Annots 7333 0 R /MediaBox [0 0 595 842] >> endobj 7332 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7333 0 obj [ 7329 0 R ] endobj 7330 0 obj << /Length 7331 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË|‰¢€ ÀzlÈ!€árXäx³ ëE&{ÈßÔ¢zzÄþJb‘bK3mžö°IëŪb±øþÏ_ÿqü×ïÇ÷_ÿsüæ>|=ˆJX1ü9öß]þB¹J«ácãêJµýŸã·ï‡§ãÓáËáK÷ïÓAÚSGÿ£k§üýÛo‡÷Ãä‡á7_þÚ}úßQÿÒýï—ãï~üäÇë¿ðýàZÛøuø •T®ûÏå§¾ñ߇¿ýáø[‚;ÛÿûÎÊFËZ%Áñtî*O/»¢É: 5Òs”RupÖ:þûÏÃÏÝhg0ªÖHÙXӈţ6j¶mì±Ö*4XÛ²¡dâ@J6u–œ¥-M ÓÐCUÎh©U›ž = jçT÷¹ÑþOÄÒUÓähR‘8Ž”L ­óPã‘LZ™'‰+J;{ZdŠV,ºüHÉè2Vf" ëIYÙˆw8ïµT§E¶uê*Ç‘’ÑeE&öɤ•x‡#UΪÆÔ¢uðsÄÂ;:-¼IÇá8Tê@Ne¨‡H¦-m¤Š-m·¯gBýy¨Ä´hó t‚(êñP\Ôki¤ßqE*ÆÆ¡’QßÈL4ì!’iKó¨‡ú’Å8VÏÆñÑñÃãáýgi´ë}ÇŸ;HNÅðã±[n}|×[iMs|üéøG!ôç?9´UÝê¦<¡E(Ô¢~€}4j‘öù[>ÅÏ£a‹h!lŽf`Ø’L ·Øiª Ô΃aã ™s=M|K^Œê¼üöáÔòé±Ó4«ëÖÎÂCðeybÝX ANÂZˆàrÁX)–ô9G“8Úèƒw lFÈf]ŽÿY§ðV®ÀûŒ‹wnƒ©•—ÂP_Þ^ž1Fƒÿ‰=Ïùcï[ßMm¤)³æµÀ0÷µñ[ëÂøÅr¢àÞOŒÆÀü>uŸ„PcÞÇ¡V|u®¤45j3Ò¤9£Á/»ôã8;"+>¥ ·@É lF„££kLØãš°åš˜£1®±%¾OYàX‡Eµj+ kULaÌš°â€Yµ·ÂÚjÍáe†~Ê»¬ípËÖ}-'W’¦¬-ë]b+ ÛÁY# ™ãYŒXÐò”8'LxØBôaœdíÔïâDб­º {év3ÚnŸ‘b"V¥ Ÿ’q¸öËè2Öøûí:ã6#M·Ê¼ÛCN2…¼„·£ †Ÿ£nx¥¯íðnÛ½BÛnVŸmfWwû yŒ s,æ>¬íàh±*\JþѦ[8±GL­¬'€Ø®Ù†t·"%+gË-,Û ïÖØ.Á<Æ8³fíÖoÆÎÂôQŒ¬YÂÚÅ£eÍßÎËoœ3Ž-c0nžëˆmMÂÒË›m‰WŠãO ˆSP†åÀVH»`Ø0ndßU¥ó÷Šµà½ G ±œa­ŠwW,é ™Á:­(¿˜Òùˆ ^XŒØÒ9eEWçJçv¼¶ØìlG :öÕGÒ9.ŽÂo)ª¡:úîW.Ù{ï~åݯܭ_Ip#~Oø:¾ß·qF ]üÔúîi¬AÇ:å¼§ ¬Dco0«”£çþvê?”:aÉ\+€Ã¿÷ ¼ØæÍokÜ+PÌj.Cºù)ëk»E”7³ +°/Ï”{OnÁ”Fœ¦Tb4¼Š–u%LÉ㦚¹¿yAýà«;˜é.eUëºÞSžª+­œT—øJ¦2Ãt-¶à>S=+@K¼àૃÌH5NüÜ"¦ó69—åÝÖEÃÃåx¾»BnbC@lÅðÆÖ”:ø«^k8ŒO AsÜg:¼ÑSXàñ`Yµ„RÌg'ßPJh¢#´Iòù€‚­”ts`­27Èšº¼¶SeŽu)DA]†ìÇÈ/äQ‚ã§¼n4Ÿ¦Ü;e‘$5ï¦üÆÁVæ˜JÓeqÔ|È×{•¢Q$³¶žHÐìmàåÙ:3•çYÝLpY 6b9½¾"5E wÀˆÝõ|i·±µ}ÀøkÍ¥Y9åíÚ4!ÛbU?eèPÃçPg„ÊÅ ^nYÏï1Ä.‹AƒóÊ?‹Q3o#®bçE°XÈsX,Ñ—±U~ÉêptïÕ9C}¹ÁB°[` ä0ª ‘ˆ %ö$ ù&ËM¨y&&ä k´±¼"ÿ)¡& ¨¹Êµb²¿J3‚@ÁÒníÔ¤6ŠaRã ®Ff‹_Ï©zLôÁQ>NmA ¡ðþÐ2TSExóøÃJ¦V®¡8¡'ŒŠù X¨,›TD :¯ –Ãø ÃÕ³¡V¼<d^Õlƒ11«¦Ã <' ²~¨Mé©FÐc ‰ ì(lp0P7ï¹¼3Ï‘eŒ£”E¬³íêp$Â9tìòyó†bøù,QýE>k€¬å’ı X‡¢ö,?1EB1Ê9+f ¬¸‰8k¦›ÈŽŽËöœ×5þη4>ľä¨VjŸƒègýæS.>ŸÏlÑrÌlQ0§ˆÓ’¹Ú.£3¾ÅEdäg…ÈmÏzW5ådƒ•‚š¸-€³Uñz`Îp©õàZĸ¾5èµÑú(mÏÇU?@dyz ' °\{c@ؽŒ8 a–1›Y,┨vy–Lj]1b÷O‰”Ì#zÐRT¶‘/¢HzÔÕBNüܲ ò…Åãn©d³TŒœ„ÊW¿³PÊR¹ßÁØv®û–ï`”Ì‚7绯MKàwÆ3í¹ðG°iÌÚfø†ªó€É±ÅœäÈ_pöÁ“Ùü|)y/1‡½²°"ÒicòO‡[eÒiOÒ{)ž/Ÿ¹~³H®eD¢…“Á^)I>"í—3ÈÇYs{GÁÌ•Lõ=9eÑׯÎ{ß #Òˈx–‘žÕOœ®«~ßµp—¿øõð•Ø×ÙV{&â·£Üú’ŽUmÆL°Û_ý縥å¸}a\hÇ@ÊáÂA¸œ~¥Î:šÁ…ÀÅ 0v$vH1_ã•r(‡×ƒaƒ-x4Ì÷²÷E~Œî·lDmSJÕÞŸ5'åy—nmúqÖŒ"—îùÙDÓÚ¥cŠ•õ°z¬Cv³ãÖÀ?¹U¼1v›·®Ô´¤•Ï>‘¢.Z>ÇÃæ]q[éÓ±øUƒ4ÀµBxcÁUFMVê…^ÖÕpþ~ŠŸã³RWJŒöW q@@ð®΃ù€€⚘s„S›Àækˆ7Yêl+ÎÂì â^©šR¢ _+à Nñµ>R.f¹ùSu;¥ÔÆò‹²¬²å¥=òÞà »ð-= W@ŒÈBc/Lxƒ§tI{εÒoGÅ­#XšóR¾PQ]iyFà êÔ×BN6„¤ºÙ»¬!á ý”'75â–t-”RfëFEñ7$á7×Ô Ä)e,öT8®liÔ5«é¶nªÂï5ÍÔø˜U[ë— ]#"S8ˆ#Å8&Î9·dœšpbâDÎy/Ž˜r°ÃX)>»åd–gœ\L¼R÷ôÁÜËÈV¸=®Y²5‡ãsM•u}´We])~±žs‚"²½\º`ÏiT'±îøÊ%J·`Ì3¸¢Ô>ÆçqŸ8Àó¼z£ö¾ãºÜþ±õÂ)m+çiuÚ\YT ‘éÅ8Ïë`ŽÍœÈxƒ#sÖ/ÃZ p6>¿•&-äMzsmUª¨+Ãs€SèïŽåJÖèNì€_XÞÑ+ãb‡/É/&å, ¿…âˆûŒü¥½o –*o¥¥’/º(}Ÿºm®€4ç9Æùc¸”üð‹ñNã‚yðY×lß”óݲ„:ð¼ƒÞ,8¶á¼·™£øtJÕtV¶à ?¾èËs¼îïñ©Snîê{øß¾GU%¿(xþ…T”d×ùm{”ݺ®èXÝJ;T¾;ês²»wÿ¬­ìu.iM |àFÕTÍ”žƒ\4WZ1кRí„&ž;êÊL6ækó8ا…}®hT¥Ä)Aõ¹åmàŠËß|„ßõJøÊ ?£>^ù^k‘h^$ãúxŠÅ¬ÝÃv€®ë?«Z6³Ô–˜¦$¦œçƒ:èãÃü]14=·ˆ)µ½Óvm|HS̘rÄ<Ÿýu»+’ëKÅ,šC‹aòúü7aNÈÂMÎ [É>w÷%[ùÝáÚÄ.Ý]jøŒÚýøåð.SÄØ endstream endobj 7331 0 obj 3697 endobj 7335 0 obj [510 /XYZ 40.7999999 285.139999 0] endobj 7336 0 obj [510 /XYZ 40.7999999 285.139999 0] endobj 7334 0 obj << /Type /Page /Parent 2 0 R /Contents 7337 0 R /Resources 7339 0 R /Annots 7340 0 R /MediaBox [0 0 595 842] >> endobj 7339 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7340 0 obj [ ] endobj 7337 0 obj << /Length 7338 0 R /Filter /FlateDecode >> stream xœí]Io举ׯ¨s€V‹› `ÚÝC£ ääôÌ$¤qæ¿U‰Ue‹úHññ‰’ʲ¶Û,RoßH}üÓ×ÿùûñãÃ×ÿ¿ÙŸ_eQVeÿu<}xýÙJö¿Ö)d{ú:~û~x9¾žOÝ¿/Q'ÚÝàåý‚¿ûíð±ø¡ÿËׇ¿t¿ýï(îþ÷ëñoï~üd×;}àû¡i«Ó/ÿîRȦûÏëßNƒÿ:üõÇß:šóº§?T¢1²Iƒãå:Uœ¿_OEë0T+qVÈîÓ¡ã¿?~éV»‚Q´ZˆºÒu9yÕZž—ÕâØÖÕÑt3‡‹:{›¶”H]¨%ÏB'ˆDÚÖD©kÿRdÔ7ÆnSèÔ^—J]¨­ÏB'ˆDÚÖ.¨ÇKVBÕÒèN$0M#»ßke¿¦C¬KcÙ·›•¶ùÛR© ‰†‡gˆDÚÖ,9÷cýÉ<Ú®i.¸"Ø ŒEŠ×çÉ:üN…ñËšáš%b¸·ÌÖå-<úéS>IWeæ$l îóhRˆÅ5Û Ì—H°é¤ç`½‘ ‰)×fäeY%ð2Å”N¢ÈŒÂ1¶ÏïÚ@lØnªÏYÜža¯K“ÄÖbûYåL›9ƒzYP¢0‚§g0µ°4­8GCñ ¤¡Pa›¥hü\¶kb WóØ6œeÂÚó³z»•ÂÃ;ò~øŸ”%Êiµ•@G…«óx5J_A×![º”™e+—'ýŠþÆtÆY+Jöûò8ŸÅ+ˆ·{ó$¶k+µ ²™kdÏ@yík& ¿QÙÌè}h½™¹7:.ŸŸ[³MÇQ¡‡r”L×ʳVÚ´«‘³÷Ã}žê8æ>,µ¸ƒƒr:Ætwç…Rê@8³JXT½Z‡Þ¨›àîxGl®!ÏîÚ”ú/o Ww ¿[ø0/Ÿ®¶Ø­õn­Ótͪmå:äL¥ÔymÆžáðú}9¹ÂìµµInq_†¢å Ôc¤ÞGŒk\Óá­g*âž|.¡£Šbµx;ýHÖq¨N©åf«3@¾Ä½l×Ìðs0íñjØ—çåËuðK›»6½óË–õK%RjŸ9ó7•Zä©Õ%'æéÁà=i†W£œè!Ä’Û×%òÐìx\ì;px 1úº€®H:,çz#8BhX—OA‹¤ aõµ+›b‹Â6Wj(ä,ú‡·X»PøB0ÁÈÏ£h·à%²hÊFWâÍÌ(¿²ª†ìÀ;=D ˜ I7—–’`™¾¿\B‰Œ’"œÅ‰Ä±Ž+Ó-³G+LšÝ籉‘§¦ª›f(I‹;m=£þè¬â`×¹,EŸGDBËÇl”ò¼$3Ò½ÒíÛßmäµµíå!*ÁzÜã7LM"Ò!ÂIÁ%ð7)&Êcm7hÉ&ÕðàcHe°ûÓ ¹8ÛCw[ æâi;·™-º¿žä”ÀY­Ó¡Äütm®o´ýQEí]„ÑO)]p$é–J¸lÚÚx‚̈Je„+Gè ðŒDôÊDÀ*ÕiQ†ã|¹:‡à(Æ”¼2·ñÄ8¦÷- 4k˃Ï)Tfñí#ÚÔm;ôï<„ጌ\…â€ÊR—¦ä/8ªù âÎ'‚ù‡X$·yñηÒÍµÛ ÜŸo¹z`zÂ>Âaš³6œ³ØÔvfæ­¹qE"¢g7¼ù=%"{ɘ*ˆnʱ^ÏÉEdÝÌ”F¤°å[o7"øŒI¾×]„½¤Þù„|¦£]Hɯ$¤ ($˜ßð(­êcKçtHláÊADh´éLßb½!Ó›ÛkëÐ_¸D/|Ú¼¹¾¹á½’p®žtò•rëÆå6|ß á¬ªç'Ì!¡6˜ý,ñ=%¾·XïRôè*ÊM(ßWÑ&½†ò6>Þ›Ü ¶S¹(œñ†öúv¾{k)€¶½\P({K”EU‹7^h8ýæIOw÷=¥FÂqYhÖ^-gJDb7S€ib.Â[ŠÁ] öʲåëúï% 2Óé ܬæpvÂù„ˆLú„3I¸g&âΖ¬%Üð"5e5ÐÓ>ˆ(‚Ú:2‰þ6ël'Ò ™B–Ó˜.âk™Ù±@„ :Iƒ±zì}D5ÞlêF…µÞì©.oÍs™º¾Xû´"´öôKÒx.ER Rx5žµÇQEkÜ9KþiΣéJ å+ÜÁgc2sÁúrþ|ç‡á^›á^÷Ó< ‹ËÂÒÆÎÑòøn;Ú2¹<˧$äHXz©ò”˜7ÒYŸLÃ¥ä‘èNôŒö¦.Û¡mÝ;ç.죰œµŒ¹op}g_÷×÷g–6Àp9%xÁ"“©`<‘!èW"ŒüûºÄ‡Žok¸·sè0ë§)Ùuˆëà»À£ ^óH OžãÏsJV ¦ÜqgLÑ×ÌûÁÚ~×·Oèêz9Ïekõ0_ÅÙÛF‹×¯Æ]ßÝY‡Á=‹‰já0xé»I—¿ƒ-sµ…þŸE]-®‘9¯9¥´q@ ;i¼GØáòì”ÕÄ¥fÓ9G“Kå4Å$Øn‰C ›è¹H;(ßx.Ì×S_‡Ý*,õ!Yȣ픹h”ýªD_ð}gû1‡Ø÷–šÈtZ®DGð½¥&¶I0RÂÂE¬¼eò#°{4ÆárPR:â NÐ|yü£ƒXôÐ>W»:Öù®²ÔºVóàŠ Ë=íº¿^ã–å9<ä±(u ûª8Æ%h_ñæ9¶€ußâd{Ê'ë¾àWë6å‚ß5˦á•ZJç*à ÉŠJ&Ëë§êJ^sn'`ÁPö“íRíÃf°üÀ(n›ûÁGÿ¶¹‰5Òfí»"Ïò#‹,ž–<ÂÛâí;Î÷óaÆŸÕcÂôÁM8bðxL„C¨”Ì;/¿›Lf÷02WjâlÔëØx³ ¸Æ†óOo{¯*û(çñNC ‹y¬«š@“åG°Ã<†eëNlC±Ôâ¨ë[ÈËYi¯ÛÌtä{©Ï„ÝUMæÝí/‹òÕÒðµ$žZgNihêtΞÝÖQòaëˆãª²Ê,{LæõYö˜lÉØc2ÒA:Þ(Ç"n|ûîyž hyôÉ ªwjøÂ°ê(:älQµ¢*úk}Ty}­‘½©*ªñc9­.zz8êIÖE=À”ó<ò³m{‘\ëvMz2†ÃdKŽcÜ„9ý…›šFèBœÞeö–­¬77ö`{B°F#VÃ3j÷ãÓáÿ)†”í endstream endobj 7338 0 obj 3979 endobj 7342 0 obj [511 /XYZ 40.7999999 681.620000 0] endobj 7343 0 obj [511 /XYZ 40.7999999 681.620000 0] endobj 7341 0 obj << /Type /Page /Parent 2 0 R /Contents 7344 0 R /Resources 7346 0 R /Annots 7347 0 R /MediaBox [0 0 595 842] >> endobj 7346 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7347 0 obj [ ] endobj 7344 0 obj << /Length 7345 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ!’‚<¯9x€‚ïn‚E¼ÈdùûQKì™±?J,Rl©—6ài7‡T±ªX/–ª>ÿéë?ªþV}¾ÿúŸê›ýyÿõÐÔjÆ?Õñï§ó/¸©?jÓÖ¼;þ©¾}?¼V¯‡çÃsÿïë©a¢ýÑž1.øÛ·_ŸÇ‡Æo¾Þÿ¥ÿô¿ŠWîÿ÷Kõ·¿÷?~´ëáûÁtêøáßãÆ7ýÎ?ÿuøëª_{̰îñßOŠuZ6& Ž×·©lø{>=¬Ç–J«Š1ÞÃÙöèøïO‡ŸûÕÞÀ¨;ɘVR7‹WÕü¸¬0¢êú¥…`΢ÎÞ–-½f‰:BÄâ¶Æ©ýKÕF &4oå‘ G´Æðþ³öOÈÖU;l½ÕÑH´+E#Ñp–ˆ¬=D,jg'bÀ•ÈÇ SjؤÔmì6OKÅâ«•²Iƒø#D,nk'Ì㥨¨oeLJmjWª…"Ì®ùVéD$ì!bQ;³ˆÇ+‘ñ®ÄȧJðØmž–ŠÅ—â©„ˆÅmí„yg©ç$V· ^=ï^ŸŸº£ôòsÆ`F?^¾zñé(¥¬^~¬þØ4BýP½ürèê^B*Þv×8Âõ0bÞ¾hÚá YK¡[k¢Ù3Œ¨š33 ½ÜsÞ¾`|øB×M'>þ*Óhy<Ò¨ ŒüËðcu+Õ ŒÎª¬™¢âqø¢í RÃ>`Í.öøÒ=Ž„¬· û¡ íuЪÐHÃáœ{8¢ájÁ«AØ8^ BíàB`R‘ 8®Ì”VS~ã q“ËxΡè<5ž|§œï>Ï9,ø1ÎbÎÆ§¿¥ƒû\¸ñÄ"¯6¿?HXq„E?Á¶‚¬êBò óòS›®™è‹§): g¸ª%œï0•$½‡@6£žäcÓÛëá;ó‘ð—d5a„I(«‹&‹ÑdF„áp¤x“ø9á|@Ï!AÐ^ÈoìÈoÊAØìÈšÊgôULËO[ƒºÇcÑLÆG¼‡p¦É ‚÷X2Ý€é(± è3ò0ÒL’B…‡X)¬Ë¦ ¶ˆ1‹D8²{'À¾r¬¨­Ø„xuç|ºˆà¸È¡¿)€6ÍÃ(\šZiöÑâ\ß{h»‰÷Žå%Á«9|g5œô +W¶Cáà2qé"æ.P'1bã×gV™z|¯Ù³â¢Õ™‚ObÒ€¦áaOa93ºˆ^'.âÌ]nG9<èò‘cè,'ßÕDLóBÍáWW–Í1ÿŠú¡ãj¢Öa h§˜Þ”@Ðr<ÁÜ´\C˜H$5ǬüEM16W¾Ûº)ýŒaå‹…WˆR°ª1 îRñŸ©Xwù¦gà¿®é>"®« ?Ž4'¢Ûéœ/„9ÎéÐ&bºîøGq¸~ò2ÆKä%#LXzóéͳ•D—æ<…ïÇ5] 'jdUm--w¾ãà AðîO9#p5¼{.Ìñ¬†÷ƒqÀì1ÃÉ:ŸsGÀèx¨™¨õj<òƒ8ðŒ`N„û±x[_uRÐ# âކpÄ0–­^ÉréÑ;”cÞ·R—«ªïš¥[àmÆDu¼“€Ð&Áñ²PÛےȸú*ÁÜc ãÄ,7çY: † !S~ñû9ëÄAc’BäÎl”"b7k*ŠNN5Å\˜vÓˆ´‡`™Wõ<‚¾$j% VÊâðÇݤ)Œ8=t>s~#B}&ñØÌ˜'žx+„ÙÑýî~l,ìÊcÇè¤\gÆÜXa˜ÇUì ¸s_²Éõ¶gÔ!®ð™ñÈA,£1µRꜪK‘8­sŸ\.qR2N¡…úPB$Ä5¦Ï–ñæ‘8¥žÂñ;˜rî'f'N÷‡ûÁé×!œ9‘ìÒrìz^d²^(ÏÉîwàªUëàŠ`µaÉÓb.%ø ÎÙ©%e¶±×CyH@Œz^ÌÁv åâç@úàS;û²Ève_ÿ“~ž)#¤Hx1ÍóÊ!œt,‡«y¼W¼ —CŒâs––>òGrAH¼ZR&-¿akÏ¡¼4'“Ò‡‚·´¯|Rø:mäðÖbp˜C<,§uÙÉYš$Á[µ˜“0XÆâÕàÙLÌ—9å²ÉžñPn~ÊÍ—>åæÇ;Rn~ÊÍ•sÝü`ض·'ª™É&Þï †hb2áÊ­‡—_6~ë!xLnáÖoJ„Ìtý731Çá·¯%ÝrL¿¥ì‘ù„[¶\ïï×j^%椟Xƒ+ô^nîEssOº3N*Ù[B®z¶Š”·þ3r©d:9Çùk·RŸÌë¾^*1Ñ·iBý”Þ±”jË ºì< ÚÞ´V-©f(.Vˆk†:ýF®ZÕ×B»ë& ¼ƒ|™UÛT«éhn¶N9c§4ñ•ÚEõ&Ôô1ŠŸã‘0~tÝ“>Cnß®,p¿¼— ;0WoD¶U€€Æ¬ï\NÔáNé—' ¹àÚ‘Òíks}Î( ÈíP F)‚9‰tOz#•‚çb¼2O(6¡ä\Òƒ~³bmÍX©fS=‰C±H–K¿í]5xŒ,()—óF.¥ñ1Á0޹¤#Á8ߥsÎ+\ßÏULÍ"nïÒ£©çÓá6¢ ðŽ,ïë_žÚ˜Ð¥À‰ó˜+ú¼•Ó“°ƒîæ9/i”:%ãv9_þWæMõSJîQ^rïu¦-¶•´-•ç%QB;T|ÝáIuƯ^HñÍó¶ º<)…ªˆõÂAû¼¤ñP¿êB( ¶Sâ†|™šùn½LŽnJûÄŸâ¥}âžßtÙ…}躾vÜm!0-K“ĸó\ .ùèSš$ú¬ÝRV)5_—²J¾Õ¶^RH«Ü%=Z‚ ñ=¶~æ1,íæJ­ç¡–ÙK+DÓ”Vˆg#¥¢ÇkÙ§Ÿ‘«áa‰ Y‰ÂK‹Â³‘â7mÚo*…j“{T·ù»ºÄ÷@€¹s†šr°Å!À¯BmÜ 3r V¼°U¨Õѥ]÷¤òQñN ØÉfÿ—–qs§©+-ãéáÒ2n¯6éï¦eÜ"K7Ø®c1)[Ž—ÆpÍòNn°1\'Jc¸³ç”ÂëkðX[Ã-)ñöo'[â·o/L%ƒÉ¿ÓÒn+ú]ï¡1\¹sˆ pwÃíßTò·KúfYiò–Z—&o>Ø6¡uT#vá!–&oy¹Bîäv\5*æv|§Ö 渜%än33¹c‰žÛSœS‚9Û(˜+(Ñ)Ì/Ø8ó¢ú¿ÕkO°žÇ_°?¾}÷PÐ%}óNúg/ñ½Sg¹Æ¨ŠõÛ¸À4¢cªjóV¢99,6H©Z].vÝÉzÄŒ#4¸®õåæ úÂÈ(„¨y7)_jk ¶µKM¾høçtpΨ<4¯y#ŽCSu|iµ‘ Ï¿y€¿k[–\ØášcÓ¥†öaSØK±½[؆ÁuÇϼ}ëÄŽ©Í0M!0L9Ë­3Çš ýœfzi¦Ô¶jëÒú¦˜0å<Ïül˜N®½Ö_ôd -†ÉV-¾ÄM˜Óï“p“1ªÙ±gëG¶²¶Â¥K8ÒžKø„Ò½z>ü#¤_ endstream endobj 7345 0 obj 3569 endobj 7349 0 obj [512 /XYZ 40.7999999 740.179999 0] endobj 7350 0 obj [512 /XYZ 32.1599999 257.299999 0] endobj 7351 0 obj [512 /XYZ 40.7999999 127.699999 0] endobj 7352 0 obj [512 /XYZ 40.7999999 740.179999 0] endobj 7353 0 obj [512 /XYZ 33.1199999 255.379999 0] endobj 7354 0 obj [512 /XYZ 40.7999999 127.699999 0] endobj 7348 0 obj << /Type /Page /Parent 2 0 R /Contents 7355 0 R /Resources 7357 0 R /Annots 7358 0 R /MediaBox [0 0 595 842] >> endobj 7357 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 7358 0 obj [ ] endobj 7355 0 obj << /Length 7356 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès·Å‡( ì3@^ ‡ ‡`'0b#ò÷ÓÓR÷Ìý‘¬b‘RÏʼãÑŠ"‹õ~~ÿÇþ~øço‡ïßýðŸÃ—åÏw?(¥OûìOàøï?~:­vÝÆq²J Î]öªƒ>-Û»ÓÿLƒ;8£ƒEƒ³å-¥ rÚ " w¤Êަ:;Ä—â‚Þ9gæcÅ».UºÐh„zÜ‘*;ÚúÈRlÐc?ótÜRˆ]–*\hè” ÖŸw¤ÊŽv=^Š ú¡s“蟖*]HwJèO;’}d©ãè–àÏ9¿bôéÔ§OäøÚ`9Ð¥à´Be°'á)³ÐY ”œìr¿p%6Ü]?Áý²R1¸%#NÎ;’»¿Ò'O?éx_#/¾ýüðýGeÍø¨Ò~þé´‘³^<ÿñùtØþðÝ£Ôžþxø}×)û‡Ã矦c?™¡ŸéÔóþüäÃçÓÙªïT÷;Õᓞ±š¦¿Ó¿AO:¼šƒï¼‡O zbxüÎï~jx÷ÖŠcÜé“Ó­OžÄÔã'Mg.½^“…¹€ >éfPÛãÐûï¼a¼ƒ¿3¡wÔÛó¥.7÷ôÎ[´ššÑàd"»Þéçï¨n^­;Ξ=Qç'îhÔùÁ³ïÌ$7­V㋨wè >Qpžïú|â 8Ðù(…® ÛÍèj¯Èb¯oÝ#t}Î0;À3nÄQ¼oHá"÷¤rî”ãH¦È6}¥2 œd¸0•¾ŠT«ÇÉ'[/ƇÇ,‚ÙD+%o iR``…ÆAר¢BxNe¡N1Ä ì½"×à ¡†2‘v¬«ˆ‡.ŸÜ#Êvµ–ðEŒìⳕ°Š‹Þ~’ ‘ÀßE¥›ôe0¹€ŠXÅ!ä>Qð þ ¬.1°[U(~K‡O"Áe¸7 Q á†ßÁß18 ¿£!Ü þƒo¾£!Žr0QÃp=ÆÎyÌúÞ0Vá½E(ž”Ü V±p”·à S#Æ*Œñ Æôƒá†i!²'W«0O´ äÔÉzñUý g!Y+Q‰/2Üž#3&#vÅÈHôùz­.›™cª;ºA%L¶Ö_++°3¡s;4 vÚf ÔéÀ|÷IVCÐpR„j#œE›ÁG=¾Ø¯éÆqÎß§¤5LÀÔiVwfå3Š »€Ó­+B ~®[QÜXÔñ¸r"ž¿üd™Ë`/E£hûët#P"HÁæS]ÄQ,šÖ–á!÷×c n˜›ÕgîƒR>sÏ2°‚h"Š(]WÕ†@Õá[êñ`ì|UIÒºð•õá•2-kBؤ(ÂÚ¿Ùµ­s×XÊa^‹Ó׃ãs.˜ñÖ¥Á‚÷ê ªÈ°*ÃE8É«0$eœ߯¾¡Š¨£FëãNö¶ýÈ4%Ï=ø«ùÛˆ£/â'„dð|+¢vãEÞóÕít†JÉ=¦-èÚ£ ':Ÿ½qüÏqJJ|¯Ó‘‘äõC‚wI$¯¤Š…¦e2*!Yu 9‡+4Šxx ]Üw¶8N&døÏ2ÎÖÊüjÚÇnðH‰ª\B™MV*;€óÌõ/°bÎ3ÂÙDx®fqx‡ñqR<^­Çáuœ_WÃp‹œßnÛÒÕ¦[=+kèÍu Ë\<…;eU£,‹30Ü80€÷SŸìä’´°RP9¢£a)DZ.Ý7ZkS0>R18÷H¹â –ºä'=D¤‡¨±T"¶7à)'ŒN#ˆÞã•6±žÕ\œC °ÚÜ(OÌTJDâPQ‰ã«¤š/2ÔF›ÞLàù'˜£u::Ôm2&Ó˜ï‘ãð)qcŸžˆûnP•2XIß^‘¼ÜLÖr†‚~í±$Ð2R‡(ñì‚‚a£o_AMkHùÜ£>ä'¶r7Ê6à«1Œô[zSCq[Y£jR9Û«KW…½br ^/ì§ŠÔáÂ'‘j[Ný%§,ŒQ=,‹U¸FxËÕ©{ j줯´•†!÷\&Z¹Ú¶·žp‹4F‹õëIûþÚ]­qÒ?EK *%gç[Ós³eªÛ¯”¹'ã´vxTùä¸ÉÂsQêŸöÙà›Öÿæv“×îŠè^gÛyÔ—°.÷]€¥+–BõÚܦӻÈÝ«¦rîbkUS+UÄé•T•Ð^AÁí¦±–ÒÁwu¦V…·¤›ðn>5p²£OÂ|[ºfNÀR^[¦RZ"Ýg°¾4Ô¶9ÊFu$BJ;Á6hÔ¼€§”ÞöŒ=J–äÅ¢t„wÓNBjæVÜD”´‡ &¿óQIA°Lòèž_²Rߨ ûDäቑ î:ÞXÏàÉêÛH¸Ží¡D‚ð]%\, †ý§ýô¢œ2ƒ*öfë9­’ì©S"5öX HÔÚ6v³U̓3—­cmGòöç©êÒ+Ì)¾›l™ˆ³ý•BZ4¸Ä×HP?ÑeI'‰4­UDjèÁMÚ˜kº{FëòM‰VĹËd»%N§« »PÕ‚g$µÑí*ÝV€³œ*ެ|Ý¥í”ò=•t÷;‹{CS¾ã&¼5ðˆ„±XMºÔÌ  Á êµê”PàÒ“±ˆó­8–!LHß›n2B|˜'³ºéâ3n,oI%Äfj‘A]›8â`ƹqA~‹·WoÌ€WÃ…ò¸‘}O‡Îú0ØGÎÇîGã‰5œzüÌ…àyXÃÛï²q~bp£_ø¤Çm+0fÀºmãfÇó*¼7|§˜N9|GT"sîGcZÀôÃx¡ÆM¡.’ߨ4Æ®ŽËYIáƸŒ¥§ n‘á`ÊÀóÓðÞpK¦ ë+˜Û 7ÂpÃ|?Á7'ÚàÉbpÚáBP×P¦ˆ;úah=Ö0°ž¡Á7 ¬ea fÀŸ”¥É0x/‡æ8-Yz8ÖñyZ5.ÃÚ‚¨Æ„9EDÇi驸Öü.ÙFm¾:©¤†üí´ÎŒèÛœ¦ ±gTuÎ"òëkS{kRiªèλwa÷.4’¯‰èâè® Â¸º¬ ©®Qlž“p,¿§+x¦ÎëOWhÜf…Ç¡ÕH*kŸ'„Ž }|à¾cò„BéòdÚªCÌŸí×ai÷]œ½]U’ÃÌâÐùéò¬‚›I—®7Òc'Ÿ†êbÄØÁÎDŽ»¿Ã b¤\Ô5S•‡Ñ»«t-xdfÂŒCNÑe@Ùòi™B5]Ûíì"oäÅŽðˆó›a˜F. Vøwý¤´M„¦OßNî‡5ËbOdÛÙâ4³'²í‰lqÜe"GÓe99wºD£^ÓÕ|·‰lSï’û~²ºlÛ“ßbÚÜžü¶'¿¡³'¿íÉoÑ“îÉoÝžüåÛH~›†>—x§ æ¦ÉŠ5ž¼0tv|‰Ê7üº”u„€W£ %'˜ĨÖÊkøvDšh•LBúí°pf§$óJrÒãNk·±½›D„: ¢®4²Îz²+µ»›)ê>­>’ª'_Ž‹4ã刌t«]…¿ÎüÈ=¿‰Hü ºË¼³=¿Gâ+á˜VÉýì‘ø=‡Á‰ß#ññ›Û#ñí"ñ»¹ÅÑÕ%Äã¼ç¤ô›ÞÏž °ç$ö¶çì¹qLÜsö\&ïÝs˜|gϘuœ~*ÐWæ jÅ¿šÈÐF¿¼’[ÓØ±Kˆo¥+Ä}¯tÆÄð:ø;šÅœ“2l1¿§¹hTô•NHgU—`%'‘ƒä|‡<1äWÁD¨t¦d KÕ†“ÇþEÆ·2ˆ( Bd‡ß1†³ILtˆ bç̸͟mGèà°eɇb$óôÒ# )ŠÄ.Î$Äj’£v²&Z2ZÉŒMZcìœK6YODèYDÜHS ¡]`däT!õ ÷%C!Áɘ™%Ú„)’-FH™ýu3A*·/ŠÐ f–Œ[N„äU]ƒÒÖ»­õ=ð{žÃº‰¤z| &ÌgkÎ7:`W™Õ2Î4] ý¾$mvË ?Á´ÎÿØÌ­\7’,Ÿ°š=ŽùPàDeYâ%.Ks¥I³¼ÎøÜ…¤Äa«êsSÝ<í:& X×/Ê0ÃÍ`BkÌïœí*¤C?ÁWqA¬£þãöÔß}v@×lv@}ezЬêl`Æ»)¹ ·Í×¼„ýûkÙõ!W „H CcfÁQЬ¨i©v’~s>À;2)–ÔJšj—ßq‚R|I¨Re)"}¾mi]Ì»;´½é0œÍ£†—ø¦´eÏ~³ð1÷´Ï7Á_ƒßLÞK‹*¬†Ë¹}UæùË3r¨îèìÙéì_ýtxjø4Ηá+k·V3 aºþìÚ„¢2Gã¯ö1yÔ…ó({Y÷é¯~„[Ñþ²ø@KÊç­ÍÁ£F¾Üh¾Î`Ü¥ŽrQén9 Ûôp ¦à˜eâ-ÊúÓÇ"È•‚ŠýÍ„#w’¶ˆ [ «:£cÇžNQòÀŸ!$<‰h¡éÄ®µ7ÏJÌK»èñÖ8-ynýêzß)OÜ÷ýÚf’s7“Ô³=öÄG;±šâÕ™›W%ÞÃaBú=ÿ|g8a T>[Œl€à*OFiL±]úÐÛj'dbéùí!)0mS=Q' ^9Q³Y¥“.®CŠk&?¿;#JW`I†°Æ7X—‡UJL¾Kç9AI$Øß„ïÝ›:´nóÙT„Ú8¹²üÛ©™—6Ï}ÆŸdMœ¤ù˜Qš“§Ù*膋h8l)<×ëö’EJ6X óa>¢-™K³‚!ð¦§òäcm¾ßB.„Q‹ s®d‘ÊLÈ^ݺ„´´ÄZTY?µðU×/¸QÖ÷ I$o¶ªã_)E@4äèS‰(ùŸ‹X{ùYAœ†UœÁ9“-%:±öÂ)ãràÚjª«•nÄ‚äÛI¬ŽÛ«go­!Q“ò00‚"7ã°uý^œÄº¹n²ž|v›'á}¸1-ÎÚ•mˆ%ÜŒ°Q+³HKaØä,²\:ˆËM× id}b!’ÖîZMšîɯ!ã½Øt?×û¼O10fFeÈúò51ŠÈ„¨˜Ñ'M"M‰`bÖ“H¸8íþQ¾9‰º2žršlΛÄñùqxè}·ß‘tQP¥|:R}Úªë\rFnPF÷HB‰rÉ ¼Ýüºî¨ ‹G朸iXÃÁSöZ´„k9wqÛõH£ÛݪlfU W×âvõ¢0ší·æ ÑmiÍ3©ÀÙ„(®×ð~,ã «½;¾†…5ì sXÎÖ¿…-ÔzY¯ÜÀä-ŠCc§Ãrˆ¤´è-Mk¿½9Þ½6YÔÊ'(â»àáV7±°"•›Ó &X„C³ðvÒaº:3ã9±fQGVICŸê®\ë|ÉðíÉ\.?‘!«9B~M[ˆK„L5gäxÜ“3O¤ìN´hQÄk”f0U»d²ù–ª{ÌÓiÁ^G™ÈG{Q2éÉ%Œü¶JfBq G¥™~qT¥°8ã4Õ;°]ìU«Dñ¢uá÷êfÀæ’qCE‘Âc£Rôüp9¥]¾hÛiŠRU³t¹f½•q›¨¬o&!8BÁK’M}™íOX& æ‚}ÔÔt3çsA·ÑîéxÞý ØÂ'ÝåÐCï=Qoà;£èjzÇ,íȆã4ßøÓ;oÑjj¾Õýnj—†eáua´JvA¹Œ]Gvw½ úï,X:M0ùD-Ô`Έ÷ü ^Í “^zÍÝ€ÎÇFê•»6ÜL³/á\L‘*d‚ à•vœ#@ Ê°‚’šªˆœ“©š¡³zƒ˜&%¦=6Ôáä}œð_=©Þ,³uží“º`hµ¸(”óeC>EÉDpªtdÌu©ís hÛ²Í]†µH'š’p‚¨ß]&<*Í.I罇Æù5ÙBN¹|5 Õ(¯Í4 XsÊÛ¨Là ‰²MBÉV4ÄŸ(EBpJÀ„µv@½Ù$Wg.»ªä¨3éêÍ:’+µ1©Ò8±$+¿1þ^Ù`µwÂà‚ŽH± ô'à™H)Ž«Ï¼'!ÓEY‘)šyEЗӽÛìYAz(%”Ë HKļZV¸¹©»R$ÕpáDjwRS\iõr¸Ï§R V]áZÜ£Æâ*2þŒ[¡j5ÖjøðLPˆU‘:)ø®åãT-b8‡J"pÛ0m÷˜‚òíðLõ¸&í®1þ,)Oÿ¾žD¢rg·üñå—ˆŒ …k÷$\?EÅkôÕtƉ;¨Ó1n©È“rÇ9§Àtö% sîèn›~“=Ÿ°ŽÃmƒy¸ñdÖìŒ9êɳös¤?ºY]yz2ÀïŒð ¾3£î º3·æÞZm&«>@²[w±»oœð#zgq_Üz¢Ð9Ý‘öÎrc”³/{;@Ö=þ¬{^ä­ïá;…x°°–[st!*ü ¾—÷ˆ*ðaœYâפ3/ÃN»Á›ª‰±–˜n0 ";x'‚›ãع£ÔcTþ9’.òüÖ‡1½‚²âðéáÿá Ì6 endstream endobj 7356 0 obj 5679 endobj 7360 0 obj [513 /XYZ 39.8400000 552.980000 0] endobj 7361 0 obj [513 /XYZ 39.8400000 402.259999 0] endobj 7362 0 obj [513 /XYZ 39.8400000 552.980000 0] endobj 7363 0 obj [513 /XYZ 39.8400000 285.139999 0] endobj 7364 0 obj [513 /XYZ 39.8400000 402.259999 0] endobj 7365 0 obj [513 /XYZ 39.8400000 285.139999 0] endobj 7366 0 obj [513 /XYZ 40.7999999 676.819999 0] endobj 7367 0 obj [513 /XYZ 40.7999999 676.819999 0] endobj 7368 0 obj << /Type /Annot /Subtype /Link /Rect [458.399999 258.259999 491.039999 265.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt) >> >> endobj 7359 0 obj << /Type /Page /Parent 2 0 R /Contents 7369 0 R /Resources 7371 0 R /Annots 7372 0 R /MediaBox [0 0 595 842] >> endobj 7371 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1738 1738 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7372 0 obj [ 7368 0 R ] endobj 7369 0 obj << /Length 7370 0 R /Filter /FlateDecode >> stream xœí]_ܸ ŸO1ÏnÎ’ÿEìnR ‚èCч"×kq¸šö¡_¿ž±=;‘ü“DŠ’=³Þ·{£±L‘I‘ùã?ýýøÏÿ|þôïã—é÷ó§Cq*šbü9žÿýpûîN¥ÿl»ú¤ûóÏñË×÷ã·ÃÇÃÇá¿ßª¹<8ýçWŒþ÷Ëo‡Ç—ÆO>=ÿyøëG}üÓð¿ÿú·á×OÓ|ç/|=t}sþã×ñ¥•î†ÿ¹ýë<ø¯Ã_~wüm¡»Ì{þïÖªiª(8¾]U—·¢— ~Šî¨”à¬tü營‡Ù®`œúJ©¶©Ú"xÖVŸ§mêöØ·ÍqøeÎi--l&;Q«J™‰Î©¨•©¢j3±ñ>L9.²ÖÑøš§Š¨K†‚D*ni3æñT\ÔwzÂWko#Ú:¯3Å"¬+«Bf"}AWÌÊ&Äã™N]Uª²Õuu¦Áÿu×éáï¶œ~( ïÕeá}Âi¦hVQû3_Ƭl¦œI”MY Ñbž)…­îe&:C$C 8“(-ºJ_®»hbÌSÅâ°WZF=\ RqK›©aMõQÄdÓ¯&Û7ǃOŸ?~èÏæéçŸ0.6îøëó×à Ò8+°ª:~þéøûÁÐíÿpüüËAÕ§¢/Ûúb#º½Œt× }ù ¿ùúÕÂúêóåƒêu²æ7ãUxç0ߢ @ª ‡Ý|R#Fô©2¿jÂ\¼¿|P‡†Né[äÞWTãóëÀ öS Òè56æGì5'­:ã5VŒ·pÖŽ¸ÓÂ8ŽÖ³7Ö¬”^{¯%ÜZ±ö DšÛ¤!Ò8ëûσèO$ÈýaHr, 1œ›m&’ ¦Cb[< ¿ªß› Ar³$ f?NÌUè&\²l‹ñTUv€÷eZ则þT[½À‘'42QmaDÃg ÁÄY ÷bÓ¶æ^´Tœ¥0ÿq„$×wM„õdmNÿ¦¡Øá‚]UÞ÷JØ„ŽI0M0…-)ødJ‰äš¥«{ƒ›« ·§®/7¼K b®4IçP˜0½9 Öpúê}qÚÖ#¾ûÎ+M±dœÌÒ–™=|¦c¼§B#–ôp¥å;øLß!Pïሆº¾G•ù¸¢Sí¼:ˆ¼îBIÒ±†t¬!¿8ô?ærL-u!€P;¬‰gø Þ36Œ7ŒküŒ·âͼÓ1Wá÷`Øð¦ƒÚ¨K:µ°ÁÝè˜ ã îÇzà{îs—phº¾>d=ƒu¦6æ¼Rƒ¦ð™Kå*£>,›9¨ñ®åð?´tĺ@VKàÙ0_Âõ°$$¦Gz3ÖÃÑ`,ýgcØÑoÞH{¶|1Way‹ñ†¹ŠÁñ%–v ‹–e•`*p´£ ÆÙ§ÛƒÃñø\uÄNűšßëW$í’é —GSÖõŒEÆtÄË·Æò`¤/½ÙŒ¿zi7@ „!pØ5˜çe-Q YCÔË´5†[ŠŒsäÄ!{sؘýÒÆÔÍecöµž¹21þ¼GŠÙ±ÛÖÆˆzŸé³½ÀgzôÌ$ð‡Õ[µ9•ÿ¸-ºS5Å=ØÇ|óäÿ^šm„V§ú⳿yæ½CPÖè=Õ‡ë{ªæüPÔØðzž Þ£Ùð3Ä^O™<8egõ]?¿rÊÎR0ŽYxœ ‡D#f´Îm†ù Apz %cÀгE„<''ûRx &×M n)NöInÅZßÁ¯22"ñ1 ÓVl•„¿ c‡Ž +æBtWtƒ$Mì¸!>Ì,±ãéÖkDÓìéM²"$‘ùe†#a“Á76M,Y J©ºÒÐ Vx›T`Å×ý9QÃØµvlÞZ CJT"GrRXfíäÛêeš¤žì¨×e¢ž#-ùÆØ@WÁLH3Ù*JS1X°šYèóÈÉÛ!,ÞS+¥G¾ÎZ¾ ,LãY-ñé/᜼‚šé«ÚP3¶ò³$u‹Á1á$D¶á‡˜ªfb¿Gˆ¸i§'?˜v 5ëeM:–1!rI%ñEº­¼Ú‘1ÓÝÊõLûpâ\­!L¶­Hè¾6¤%-;<ÞöÉà¯zÉÀ9ãÛ[ñá¥^¸.ÝÊ«›Y¯^å¦UlÏÙv޳áwò\xpÃàÆFž#/mSïß´©%a¥ÉLB ãU‡ÈÐÒœ 0‰oB¤W+mÙj%µœÈ»K”yÄïç°â11Vçnáp/#¸Ë 7ðþp솴),@$¬]¨Ïèe;ë9«*ÆoûÙDÍE–!Iö7é:Xhô™î ùAµ½ÁŽM‡q‹·c’1^nãJHB‡ø«UÄ”úppˆ—»l%‘éöñÝz )˜e_ÛgÉâL{-–? żÖ&œ'.§…ˆ™Øyç‰xéî¸S–mRJ`œn£$dͺUá'Æ#—ÔÉ¥â.¬È,ÛˆCx÷bFbxs ûNsÁD¬H 4ÙGˆiË]Wñ3›+qG´,¸µ£D‹DÏéjé³¶â ÷qQrͬc„ךrzáUt()ÍP”î*xØIÜœ2ù<–à¶Vƒ'c@ÉCFJÒw†‰ºVñV’ý9 ïENêÇMH¥„¨MÐÄÕXE×¹Ÿžd¢„áQ)aʈ¯® E@ã:lŒí$‘BË’e]ز +ýýÉ2ŽÓŒà¹*Ãù³í¼;(Ê•·ÕÒɯþÓ\Ed¦D?BñD·”"N¸áKU;žÃ¼1ŠeAÑ£"[ƒÛŸþnëZÀÎÛ½³ÅŠzq‚i¼Dy¨´Vö£*MwÕšÙµ…6¤ü]û c’ï(Pš£ïJ—£Öj´=ÈJŠ‘ƒ ̘Ê7æ Žm8Š=í  GÙ¾ñ£Ô3b\¶ä$„Z€`VúWÕ¤l-ŽÎßPämfmàÀÌ$ðw–LKPh"æ’¥Xüçwº˜M“Ô¸‰d¶4U^É”¦QøÑ§‘=x¬£!°Q ;5œî0K¤´F][‰¸‘-sà « Yþ+tI*ÜÓ¥E\Çâ!§bœ„zCƱ‹mT0D92RÊö¶4„;áÁ¹@è/F Æ âœ~8>o*bÎŒIª¥2®P¤ýø0%R<8¥¥(æD(î᪣ñ´HY¯=Q,G>Š©xR\¢Ø]'5ÆhºG0Ã)³êèüëIŠ—§¹UDQ‰³Þ¶Ÿ‘sO!+¿ð­d’¦Ì])-²Vjh½÷ÜKY)+‘¢“Ã@rÑJ)“_Äys“¯MqÙbykåA¦N³ä$‰æOŽoëÖÐQáa‘J—9Ert“ªÞW9Óå(JŒ…ãE‰8)Z§è€Tý4^·”–F†3l3çHؾB‰ãçvŒ/%{¦î› Ä8êb©VìãèÖŠ;\6hwêuôfôæt-­p7vÜÁÑÓ¹•Ó7¯‡Ó¹[°Wp‹Ë²Í¡À+ûá֫ަÏ-ì—£r¥•±<Ò{;mU‘é<aÞEYºÛuÐ \™ˆ‹»™z`J¸ºá¡h‚'ŠáCàÒˆXÛ_´Ø¦hÌÅ&?î5ÊÚ|iÈ”û`¥z¢ÂE›‹ÁS$çÄD(¹$z"<Í:˜á^e¬x÷fê¾É%³"3`*ƒ ‹’À£ËÞ-/Èõ¨üåš´7¾17oL¦^bƒžCÕ §*8É´:;YyK_\ÂÞhÕÜkÜÊóµ€u€„—ñd®ø=šÄújŠ®LÒÚ”„ÏZœ„¿š«y§«úû…,¤w纫Ø+ž[šœ)Òsõ†k]OI”&‘¹\ÑäM<~¦AÚÖÏ^ 3íÙ°šÒænd²u6¹Vp"©{£5ÁLŸÊ^+ã1YÎ>»Ç3Ü=„û6“}ëwN&æ’s³©´@dh‘æs‰6›‹¹¥éxOé¥×™‡•»® RÉ9šqH¤›÷ê~ÎzÙã.¨ß\¼q FKøžR,¼àçòRͽDḴ˜Âxï¸n¼›0MºŠÄ¾ÄÏ0 ÀA_üŒC:¼Hît¼Rlo˜¦s9cfƒZTnL.^¡¥¡„äì,XOpÒ§bŒp¨ 0ðžƒ;˜C‡„å@°>2h0¾l•‰Ü¨4ÿ5ü­ÔMIÓ™Z¦@¡wôêÇŵ®qïws_%LÆS]¥+ïIÛSŽóÞnÕnÀªÅZ™£a‰ž¢– †”PÇ¢V Ø~ ±ìôªôïMÑ|ÖçŒìr#£Ü=¥Êž×?»±¨©À9A¯~rÆCºh¼%ŠQQo_„LÌ£%YKØFñ¤O­õ|žÞL¨õ=ôí%€Z¬µк1²'€.jOÝ\èãg;fMyM›ÛXNIƒ7âÆÌmœT³*NM«B¯æà»rÉ÷åd|Ý,)Þ=šÞ©]ô+¼¹¤Ìž±8𘋎úÿ¥šíBù:9êÓÖú‹1Œ8j…¹Oâ”iÆD0{=h£jRÇ”Ra4Õ’ÉŸeTGCÅ~R&mV©ïéÐêUYÃoÇäßPÏ6B±J†˜ „óÅ bßÙ; ù¶H!Šð"h°Ä¥ïתfµ•ä™z÷øè 캄|¯‡óá÷Œ‘m#L¤'Q}Þ{’Õ€³÷Ó4>­xSŒQ¤¯s8kQ %±‘Y•aíɮֈ¯WšsœP׳4>¤MPÛ^5g/×§¬ÕZªˆ`ðŠ4ñ¼ÝŒ1–i³T9rË:‹÷ñå@ÎÕ¼$©P)ûÍ®Š+>Dº“¦.%ïeŽÞ`™#“O6Pæ¨+®sgÃÏJyÜcñÙÄ ¡þÐý{„Hëæj…Üa+&G¤{ê“$sƉøÌ=„+mmSÔ|I)äËÖ”òo¥¬ŒD8€R^_2Á=&ÈVLœ møÅqÖÅ7IQ.S`ç±z.äJ7ä$ZFey{é ”$÷ø¤™‹&ºU5ê;U3~¤£¡Rß:ʆ7\¦Y,bZ¡Âõª—Ç5«iÍÅëšÏ _ ¯Og*~=ôMuûÁ¯‡OÍFåŸA0Ð)QBÏF#ǰóß»Q¿”ý‘’ñcÎJÎèZ#îf½°Ìëpuuaö:s%V¾5û#SÎOæä±”¹ª2ö>á:^Î\¡ËߣkÏz ˜ÿž+Tì¹BóNï+ÿÞÜJ®PŒô*w²]öe”}¢yH{Û0é¼=Ÿæ.òiòHâZù÷Œ¬nÂ\Á± Deš#?ƒa“ëƒâ§c›HorvÐcŽä¡c×禣ÏF¦å·ñ³†sà·6enüâsË#âWç¾!kÑqh’+ç\‹åбÊ+k•rè˜+Ÿ=+»Ý÷ð=FT‘Û÷°nη;FÖ«zØåÈÊA¥49Áû˜r³"bÒ ö”# ÉžMóÙ42}& ÉSjà0šD¥}…ç;;y§…sª¶1”FšºŠ”Û I2ÅY}­éãì”J’Ë …£6~.ýÆh@Dh*Sî%M‰y‰ú~Q•ÝÞl-gÙ„‘â߉ìÙG©±Ö—æùâ®ú›:äïÞ|&¹™1±Î5C*w¯TJ*æjl™2Êϲز 9'&,‚97„$$nšãä=ܼ# ŒêÙ²º ½bC·²jL1„=91 =¦£ !=˜p¦éÃ~N¡ôþ$ä{g2ÊýˆÆ9ˈ 6—4 §MÀaRÂsÆòU|°8­}»uwý×/r»^·s5%½¦h»ÊÔÛ:¤¹Z7 {Þru éÒÕ­¹¶7çË¿½Ò2ü;~Ðy)–T§__¾’îZÞ\ãüè$óQ©ªæ¨†e,Ùe½jÆÂ?Çòõ®æˆè¦95Ë&K_€RÐí©]V1íÂȨbÊò¤ûÅ i]Ÿš‘<¦¢\zOŸéá3£éßê“..¶þëÈœmdûÛO^àw§ƒæÂ ? g&%º4¢Ð:¦MC{f¢eíl— Áuç¿u­Z/µ¦)äƒIH.=³‡(ûL—´+0Å0ÏLxÒšËq¤Q§b áZâ}ƒqà€àY„7»®hNêìÞÿžIçJx /† wÛù£¤®8~<ü_gyó endstream endobj 7370 0 obj 5095 endobj 7374 0 obj [514 /XYZ 32.1599999 130.579999 0] endobj 7375 0 obj [514 /XYZ 39.8400000 577.939999 0] endobj 7376 0 obj [514 /XYZ 39.8400000 577.939999 0] endobj 7377 0 obj [514 /XYZ 39.8400000 387.859999 0] endobj 7378 0 obj [514 /XYZ 39.8400000 387.859999 0] endobj 7379 0 obj [514 /XYZ 40.7999999 298.579999 0] endobj 7380 0 obj [514 /XYZ 33.1199999 128.659999 0] endobj 7381 0 obj [514 /XYZ 40.7999999 298.579999 0] endobj 7373 0 obj << /Type /Page /Parent 2 0 R /Contents 7382 0 R /Resources 7384 0 R /Annots 7385 0 R /MediaBox [0 0 595 842] >> endobj 7384 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7385 0 obj [ ] endobj 7382 0 obj << /Length 7383 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâC/ 0Ûr`Ø@A7›`/âì!?ê5Ý&õ‰d±ÈV÷h ìô[Yïb=øöŸÿ~üçoÇ·ÏŸÿsüj~?>ÔUÝÖÓÏñôïÍõd_)9}ìú¦’ÃéçøõÛáûñûáÓáÓøßïÑž4¿ÆÁùÓ„¿}ýõðvzùaúËçç?Ÿþw”Ç?ÿ÷Ëñ¯ýdæ;}áÛ¡ÚÓ‡O„²ÿçúÓið_‡¿üîøë¸„þ<ïé¿oZ©T7Ȥu|yTœÿ]?Š^6Bhü$õQ9®³Áñß~g{YF5h!ºVwu𬜧ºö84ΜÎÖÂf©)ÑóLtYÒÎD­»Õ™ª^+¡:ÙèNðoú^ŽŸ;e~b6ÞçËÖEp, ÍTÉ0lVlj´­ÍØÀS±¢£ßvFGŸÌóT‰PìëZ tœV$Ò¶6£OE”J}-ôDu]"#\fJ†¼,5­H$ílüÊLŒlÐ×JOâ¸éRw>Ï” B]3!õ´"‘´³p&V\覙6.t2 ç©R'jZ.¬Ž+i[›±§ªúÖüÀÏ!/êOoi¥ß1Ò¢œ_ó‰Å`”ƒñûʃï¾Þ~Zõ'ûøËÏã†ÏFöôëËÕæøæd»ŒDùå§ãïGÝññÇ/¿†ªT×LVù4"ÞÁ‘ÔàˆD#¾§~Ž_RhD?ůzemp?5†[ÿŒâ÷£à~„&Ìwºò |šöóáËÈÙ©|”@>*_¡KL/ÆV8ã=gà{(T^Œú î1õÕð=¢Ç~$¬ ïTBª’ |–ix§˜B UaJÄ;ÅT¥ 8Y¡ƒRÜHX/¶Kí”®àÙæSLñp§\ §·çà%,ix§x¯[Lp6#•ËØC3s–(˜.ñ¶½1†±®&@ë÷û–·ç&¬õno•P,ùb«fõ?”·Î’PR8‹´¬ßk8‚¥a„‚±€y[ ,¬HXÊ n…žðÔ—®ÏêKéáG6•’½+ºª ½­¤è-$N ìmëCWzšÃ±·—F8ÒÙÓkëï:|²"æ‚®¥×[1­°Ý‚ X¨QT=VÁŽWG‘5«&Á›?º §KáçMÖ|å)gß»ìÛ„ìcuTxˆÛ›ï$lc,Pœ¨›ÏÌ0à=¼¬¥ø”‘Ä]_Z7aª X¬2må€?ƒ×ÖÄãÐÆ#åøÿ®GŠàñ”¡[„gö`¹£Õ=4ÇM½þ*#ŸTã‡/¯|Âü\–7ËÀ·Ñ…áËëQpÂÔñžn•Ác§ ã‘׫£à‘7,´ <¶âuÝ!pH=£{AÜDn—0‹´ÿ`‚)—¸‹x²¿Ñ{yïû†qׯ¾1Xß0À9Wþ`,¸&×{!ÀeŒ «8“€“˜EWýP·?Œ˜S»¥ø|±‘Ž ïÑç÷œŸX[ìÊ’ð6ÞÙ;þ€&q¾ZÃâEkµ.&á³5â¯9™? ÚÕs@UÌÆp×6m`@U8¼¿ŠªvèSOtÐV:#»vðU7 ºÁ€1œ>>¼J† γö¬F”.ÀÓ»D_C‰®¡¾1ØßÀÔáÌŽ—þU“­Ù¯¬(‚@À Á³b`9³b¶ØŽT±U~„T‘¶Dr‰“ Û‘ò®”§€‘CðŽìÁœîçZ¹‚“Ò7‹]Ñ.K“%$ä¼^y!l¤8XpÑM"Ø)A/˜~GÄt@âüò”k•PÈ……Ëèñ¸:“…+­}ƒ7 ‘⊈ìr¿oZ[îÛÚ}e'PÌb “‹å±EIFÑs°Qdg5~ Å Q5º=Á<ÑÙ´¼e9°ñâÚ}™å æRвã k<‰²Ó)’Äa6б…ÂA«Zù˜…ÓØÌÈRi‹'ܤöƒUQT‹kw%ø2îd+OPXB2ì¡ _/Zà"/t£ë­½ÄÅ·÷„mçáî5{ ÂÌéÃàçÍŠcú!Ò‹Ò™¯»ì+'ûö¢lZNÕ틲÷Ú-äØì5"{È‹¦lJç¤ï5"YðØÏÝÝJíF©‘2xJçc+çs°Q:w÷uå¸J†ïžãžMéÜè=Ç= ûýlè"ýÉ,+ ‘ŸÕúFrgýàhalöVYÿNq>k^Žtáøà,™è$!c¹@ DÛXÊbE*àMc±ÇÙõóf¹?^—Ž¡öñ§_a´Ep)e’2Yç+ÂÀY€@æŽ+ã"NÙ::—XÏIö\ßxcɰgVŸáEª¼‰Æ~M[ÈÜòòTFÅ3ÈÁV¢à8KÕ²[ßàÈ L¼µάï² ÆY•s@¬†Ò;@ BˆF”˜¹ìé¯fð›ÊØ@ GO û}­ˆz„ˆÚ‚ &M: °ÁHòŽÄÞÚì¹+xÓžŽÒ%iV0F)9Âu ÅO§D·:’!ùë~Ì«u?#JO\VwˆàãTÿ$t`‰P/” ãB•éw%©_ÉÙeFuÒµÂR'~<ºÉì/©^‰xeé|°Þrµ‡#íwûåâ!«Þ/¯/ ôXò´W²Ë1¬)› Õa­tc¿}ÕÃío‰!Ðn;®Ò(Û5†še˜O…††"Ξ¦\ºSIrñVB’.zÅ—~ã > M”Ùn_[úpÅ#l’k[Ãb–m{[²™Ë³.M êéç²582§ÈV]cˆ'øL?^Ûœ¸é>3çâ¶(m+Óðêj–9÷QOñòŒDo6^ÑÒlS…¨«©ñòÕ3Ïè=x&)wá=&cóôëtÏä¨.¬à"0Hµ/¯«Èè]XÞ©QNM%í¾Ôæ|h nѪ1 Še­Êa®,2:–ó„ÈöözxÆäúiîé2=^´ÅÓ©˜Š°ð¬H„ýEÄR2*Ý×8Ô÷§qÄô)‡ÙI’бåtN¹ÝØ‚›t0£§ŒMeI™‰Ñ„Ó{—(j‡ÀKòot{òÊÍÕ¢TO$äàP‚-N¸ &@ž`D$ÑúSSº8nïžUŽüi’½‚§ÏÛZ3ù{÷Âö!²ÐÊJ³ç“v3lÌ ÷”Cå›Ñ̓腭¨Ûã++QX&FÔ/8*.ÀºÀ5 ^Ýs㋚Špò=/¤L""ƒÅž³ß÷ÐZ,ùª€ç∕%^šàËØIA”DI š³ÊÜóyIµŒ¬÷Áø+]’ŽÐ^™{øÏá°Mè¸lÏúMA~ð&çL;UÚÖ3)Éý”3'Bf#Ï©'ÅâóU™, –rx¼Çe¼¦L© Žò6¯'RÀÛ”½ýá•1àáèØ õÆèšgD²h•…å×çÀ8“•ñ}ó˜îÀK‰mÄœªäm–Õ”ÌöxL&ç9¸c­Q ð 7ݰ£1Á•+3€ñvJæƒÛâW?’)Ô»d+*ƒ‚é¤Ö\˜&Ú”ï-—ß^§Ð ÝYLíõ¼Ѽ‚­øÜã¶Ílòl¦zžŒ‰ˆðsLÞXD;hìl$øC± ÛgJgÉo ((¨ÒÁÕ¶3·re„ ñÍ•„£s:Ü>YbÑ”ö¤µ[¼YÄên{m‰ý€¬YÊiP‘“S”PxÈ+(×ÂøÓ Sºý†ßâ?‹¹e!!Sf鬇Þ, âYrlïI­ú•'¶v·³ ¯ÍyÓŠîmE±9¹“{AÉ: \¬÷PzmŠ^a÷Ò’Œ%ŠS(á1 …&9Ž”%)]°;aëi‡ñ6,ÎS¼¤—«ã;çŠ#(äˆ'³pÝ þ(­lÉR¨c…zÍ¢Â1Ý‚ãõE1@û!._.]5q—"Œ§X:¥W夂âkDH¹BeÛ™Ýê¼ó1zoèýôõ`i+^µsÄU†"‹ÝÙØ ·Ì^­’e=.ÝLˆï.µz‚JéŽnÄ"©`É!Ol>@ØEE‰+3ºë,€o¨ñ¾Y&{J#k1üEÉï.ÍòÞh`æ[Yb¾þ]ðšqš´å´h‘߯Ðw,áýí4Ãc¹g2 Z°‘N·9]¬VÛÊà­Óð…è’›ÿûQQàÛÓ{4ÍpTWzš`x…÷°¡#r*bÒ(-Õ ‡¤ƒ¹ß "„ˆ}‘í¡y#åÑÌwdê°SÂ7QÒæú{óMTÓ[;¸o’b«â˜¯yº",U‚ÿÄ!ËÜvj"ääéx´9u°Äœ—$<ʼn'|˜Ý{éaK ö°F^³æœaÖË«—{1ܹ^î›n+z9ÀÑÂ-ä ÇpòË ûKLûp¦üñßñûHâ¢=S­ùõõÛ Í»ÌR_˜åÓ*»¬>ê/tmbÜù’<ˆ¶š*¡T­g@˜ûQÛª]. tåÀy´ìªnYbw #‰)UÉañˆ¦iªv›-°–ÞÓÃgøÌ$Ê:YÉú|Ïeäœm"“뿼‡ß5´°Ãècû,´ÃqÏŒÅìݬíÌ Twú,Ñy±-0N!¡§;w6O!¦yTmÓ†µñ5–Þìƒ5Ój1…¸ô¬¤³3ø´1–æÅþÌBE}_·•èF%ô#95¿ôbHâªýÁ'N©~ütø?‹c—c endstream endobj 7383 0 obj 4020 endobj 7387 0 obj [515 /XYZ 40.7999999 480.019999 0] endobj 7388 0 obj [515 /XYZ 40.7999999 480.019999 0] endobj 7389 0 obj [515 /XYZ 40.7999999 216.019999 0] endobj 7390 0 obj [515 /XYZ 40.7999999 216.019999 0] endobj 7391 0 obj << /Type /Annot /Subtype /Link /Rect [262.560000 540.500000 379.680000 548.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages >> endobj 7392 0 obj << /Type /Annot /Subtype /Link /Rect [388.319999 524.179999 488.159999 531.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search >> endobj 7393 0 obj << /Type /Annot /Subtype /Link /Rect [193.439999 549.139999 224.159999 556.819999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0420/) >> >> endobj 7386 0 obj << /Type /Page /Parent 2 0 R /Contents 7394 0 R /Resources 7396 0 R /Annots 7397 0 R /MediaBox [0 0 595 842] >> endobj 7396 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7397 0 obj [ 7391 0 R 7392 0 R 7393 0 R ] endobj 7394 0 obj << /Length 7395 0 R /Filter /FlateDecode >> stream xœí]K¯Û¸Þß_áuш/=€¢@r“è¢@]]™N‹Ádд‹þýÊ–|íKú#y¨CŠv”¹7¦E‘‡çýâüô÷Ã?ÿ{øñùÓ¿_–ŸÏŸžÚ¦íÚùÏáø÷‡ëäÐ(9ÿÚ¦‘ãñÏáË×§o‡oOŸ>Nÿ~{ÝéÁåÇ4x~Å<á¿üöôãüò§ù“OÏž~ûßAþ4ýï—Ã_ÿ6ýøi™ïø…¯OÃØùuþEH!‡é?׿ÿõô—ß~›–0œæ=þûC'µåºu|{yTœþ^?Š^v„PÛëi‰bú@˜ ÿùÇÓÏÓl—¹Úf”ÂtC'ûé÷¡Uó£æïåé½9Œ}wJÙÓ»»ŒœjíDcÛóLt\‘X·5ÑêÞ;Ç!Œfà:„—©VN$¦S`:ÍiEL‡€§jF-Dß龦¯y›ÚÈÓ6M¿`ç™VCÞ´LGx\‘Xµ³ðx¦d¸wÝÈ÷óL«ÁÕKþuZÜÑL LGôÓVy˜Îeªµ\¨ßŸ&á`:x*†C˜T!Át—©ÖNt\ ËDÇñ‚gªfÐJ¨‰võñ8ŽœÈ ƒœ~ïÕò‡²õÁðp¥—™VQj®c WrfúÈ¢0Ë‹ÂüÍóàÛÏO?~ÆÁçŸ$x|ãüãó×§I[þᨬMÈðù§Ãï'¬ÿpøüËiuËýéÝhÕ›ÅFYFäi¤oÚqzi1h¶¶·_¬­Úçù٘ؓ-Ͼÿ<Á~$…V¦4ç׎±WˆGÚ>3Пi%}žµõpD¡ù† ô‰åôñk¸;¨"»Óf2¦!MFbÌo1â9/žw/Dct7L_Ž!F¤ƒ×ñôD!ç«]ü{ßCH§ð ŠÖY|±ü`}Õà“µwN9 <.›ù.z——ƯÕsÔ3?êšIÀ…&ac¥]!‚A"f”ç%E,À%6±‚x›q%4\ž‡Éa2ÂÐÆ„¼ât=ˆŽ×øàìH¼µáioX/`l†±í^ï"þ½î±A(›_¤ÐA•Ä+Ñ*›<ÚCK6Ä=2Þ°=I’ž@W™=,ÛÙVY˜`rÓV cŒz_Àè͉kOÏëy5ç·P‡Ú¶4ujè‘}p=ª…{x“8²[g…Ï^wÕœ=/=*xŽÕŸIgê9ÖxÎdçµ`ß wìËÄ“ ¶:¬¸¢GuV™\+/Åò%8Ȱ2YÚÑñX#r¶o˜µŽL«ƒ7aWhÅþ¸xÜ#ÄC'ëj2ìsP.h:&¹ÒáÆKZpã( K¨7öê„5~Ÿéâs¸urPwóàœ cÈBU%°\L[ZKÐAxõ° 0vÇò²X.Ç<šöÎËkÀrÞ3…Ï´ªÀe=©»Ç.äK«/w\ÎË]ñ˜ÀæÚG)jÂ^ —¹}WBȳ±¨Î`ï;cy6XÓ†âc´Î³®›{Q\Ç•„]WÕçsvö±îñ"ùœ]gÁ½ž|ÎÜÙpØñj–z‡@Àã-v¾º&K)%? ¯l¶PN¢´MñÉZI8š’!è@Œ%ˆ,AòJ#Ì.6Ýï€سß#^ì†ÒV€‘ Z<ª(-mhÝ6"™‘œízXóÇ]S$…j+¥§æ‡+~žVÀ¢×; S7ܳwÔÉ’"P+¼‹äŒ°MÔB(&Oz]?ŒI$Ç>$ ¹d Zf^ƒDéÁÄnIP4ÚFÀ,Þ!Bžž‡‰Å#¼óUõ†®Z¹Nˆö溳”¼ˆÔ6ü,aÎYàB¸cÞWBRhØnÄÎJÞ¢ÞûO½²ÙCÅŠK&¿6AR&t?ð¸ö0϶ÄInÌ0×ÑZ3…è(äAï,ŦNYÀ]¬/–žƒïˆù>ZÊšöÈî5Ûº#NFy6„v˜éåUñ¥T6RbÕçWà¼OœE•r™›'bíZÏ4"›ùÒ8±6ˆC…Íw9 Ú¦ëÅkÖTXê—ºª‡]¬ ˜bÆŒ’œ×vyeÂ[$êVÑ1ALb¯4¯«™`ïÜᎩf)Bk¯Å¯WÈ}Ó96]X§Ù®ðˆƒnbˆ¯£Ä’*}'ÝÙywhÕ¤ô°Ä4 Íu’t§M<ý 9ðnÌ]Ó CصY°3E´§äÑ„uΜԼxwìjüúf ƒj¶<¼,%{ Ø×ѕ̄îwmX„Ž÷&"¬‘WHHElR~˜ †wÂaQ¨« DW-šf éŽ&0ŠÖo7$õ¥%00ì^á [µÍ Áx ŽÝlîð/ã€èl:¹7Dßö6¥ghŸ“ÙWƒµ‡Ý,*;ƒÖÜqH¡@"·Q6&?„2Ã’ïšh›Ô0m…Þ“§hÅЮˆ*PžMÈÉê“Ì–¢0¤äq±Ôàé­ïº&À³X–ÆŽ+È–RE@GŽjwiù¹MgÑ ëérIæ ÖêÀtK 4ÏE NþGœ¬â$ œõT‹}v¥$R!y½ ÷78‹E——äÙR ·Ê`W"ègᔆ,^7÷gE(—e´›Só®Í­¸<¥¥+º–UlrW¬ÿçi3V¾±³î¥Í¹3‡øY&Ëô„Ô+Ö2ß øxÖtNgä—tØmŸ³_LÊ‚'/®šBÈ-mþÞ›a$ÄD2ç™ñ¤µäéìQŸSt¯§pæbÅ ÊXØ:?¢ö ³õb]{ýÁÖùØ9–Õ Œb¹l€Å*K°‹µíW­’%‰’ㇰ†ŸÔS`Šö’RÍ“P‘‘Òaµ@'’ÎØØ“@()š%§Qœ0y³;‹ù¦”2Ë+ó\¯™G¥¬ÇçèGIqvd.»JoÞZ“7)KÖ„­bÏ vP‚„¼‹„Õoæ#fIŠKt(´žQv˜ÖXÂÃöø;(^ª­ Í©³û|&Æ¿¦n~ïãæˆøîx€=Ž$¾•® ?¦‹¥sÖwÑ8 OBGÔ<òØ*œ©ÜzÕ¡$%ádÉ¡Ü#€!’ê•`v§$¤ÖtË™ên°• Z‘ÀÍã?ä°!r7NÆ-Sl‡ Ošçí¡–)|jNj8GèΚ»‘‚ã¬âš0°ÃIWo×,ÍÜp´¸áØœvñ »àH{>öÞX#â z¤Ì¶øo<³8ËDÛÌŒÒÑI‡F/p·eiר%Ĩ…~¤Í‘«ýÆ Äú~ð TÂN=ï¹xc-îEËwÎ4emx67¼j)!¬%„õ3‚ŽRôÙш#+0‰U9/.tK@ü†ë.ðLo ê½+Ï_ã»EeÎÒÃK2iýjà-ƒ›Wõ^·V ш†³µx6MŸMÁgÁïYø†u~G†Qç~”xæ-,Y»„l5ޤ-OMAª%÷h\‹QZ(·å}Ðr¹új5›µ6d$Ìþcl®#¾ ‹L,–°`„L4ÿMAJ:(½¦ b·]ªÎ&‹ú/Èœê%TElK+ã¶b[k.p™pT"y¬‚d'ø¶ªÖØÌPOJq&4.å(®x ïPE¹›²jز¢w8#‹…ÙN–´ò‡S"Î+ªl¿óºN×܈­%ÁFÎÉä 83ÌD™Í:Àåíç¬UPsØ•ƒ„ÓO“åá#ØH²Õ6º¥tËXSc°&#¥Å!X¨ ä8}ÉS6Ÿ³ÕaÚk8Ô9Xž´ž¿!›ù%ir“²HJ.v„mñ1ú½ž%b$$p3Žz¨Òb&¿TéξÕ©ò`q…™;™ï'„€x™áT,زDKÛp•q*S|\òM.Ìê2$²@KÛ&Ø8—»€µÝ÷õêŠwh7Pj” M­.þàÍÿï©¡ï]hxñ@Ú. •§wSá¸QýúUN¡²Ü2v%U2߀·UÂV=4_k¢¯™J‘Œ’šsòY{¬Ê•w yÛ``ž—Ô…"!=aM’ óêyÕ­,PH*g÷3-l!’|Tε–¥úZw⥰c³Ž°¦úd‰gT—”;/[Û(VuHÖ;¦… jËòÝ÷bÕÆY³²Áši¼œËѤ7/þ«¡·ÎûûöejãðƒüÖŸìwÆc ÅŽ-l>ìDu¦w›ï€¶:éàyáD17qPCl.­2%Äì2¾ú`©ìcL(3Åu$u–ŒN"ïã´ ‚¥öÒXP ¤ˆG(ayw&ðB³OO^ª‰—•y¯cç¹E'~ÑïŸç¯ðÕQÒ~óÞ„V ¥’i h³‹š¡ÂòŽBÇ™­\ ØVZ³p ã“ö$XŸ‹Þ£R‘åcNG‡-Ú¨'‚5P"0]ñ¶¯¦•F=qÉL·®&x‘+¼£i•®%5¦¦!l)QÅóOïŸ5ŸÜæîw©ßŢx, Ž+XòŸ”ÜW‡°@÷ÄOᬞj¡ý­\Lf- ߸¹+Ïý"XgÉý+VÞÜé—zÓÏá­Ï¤+Ö ,ž7,Vfîäcáž§ûLXÔ¬œ¶ìRqYç6‘¹ôgŠ‚×G²§½$9\àEp$­ðò{d¹Ãü×$7žM°ÏVh²Y›·ÙD@È¿rÓ9+ììOPÛYK;Ã*¢^0?âÆpJÙÉ=„x‚V6K7‡nJˆ[¯ ÌQXkx+«“4ÅübQµ ·YÍœ ]'¢¤ŒlØ{²ï[¼äïê6ØúTæ”*ý¾–ÌJußÊ37¯?ãpï/OÜ©gÕp6iŸu*)]ñW°Åüž–ÞttÎQ_i{’ZN¨ØHi™ËYsxßJ„ó<Áû™¢&‚¨;Â$„RJ,‚;=ãô÷ðm:°é0Ž_X~|ùê9A÷èÛËÑô¾÷ÑpØ¢;ˆi·°yÝÜ{ã Ú„^Ü¥]ÓÝö!Žºq¸ü hÙ7ýíæý‘™Å(ÕÈñæm»Æ4Ý,zl¦pë=|f„ÏÌ좗lO¾a›•Ýšm&÷ëOÞÁï.œàÆ? g/ð­ö±øÙhÏ,'FÙû²¶¬ÀºãïÒˆ>xÚŸ)ă…èÞMÓ1D|@´°ˆÛ(X/Ý¿n½9k¦Õb qñyQ LÌÓ‹À½5/Æðg,†¶kÄ1ù]ãÖ‹!ˆWœ‘«>>ýì«î endstream endobj 7395 0 obj 5094 endobj 7399 0 obj [516 /XYZ 40.7999999 92.1799999 0] endobj 7400 0 obj [516 /XYZ 40.7999999 92.1799999 0] endobj 7398 0 obj << /Type /Page /Parent 2 0 R /Contents 7401 0 R /Resources 7403 0 R /Annots 7404 0 R /MediaBox [0 0 595 842] >> endobj 7403 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7404 0 obj [ ] endobj 7401 0 obj << /Length 7402 0 R /Filter /FlateDecode >> stream xœí]IÛȾëWè`hÖNÁî¶;@6CCà™I0ˆéÌ!?”X”ÔUüX;‰6à–›b-¯ÞúÕ«WþôåÇþ~üðüå?Çoúçó—C]Õ²îÿO¸ým*FûªmOŽß¾ÞŽo‡×Ãk÷ïÛÈó‹úG÷pè¢oð÷o¿>ôúß|yþK÷éGzüs÷¿_û{÷ã'ÝÞé ßM+OþÝ ”ЦûÏí§ÓÃþú‡ãoÝšs»§T45o’Æñvy•œÿÞ¾Š:;QˆR!„Ðnœ¢#Ç>üÒµvFÕpF˜¢‚wŸ[ÉU-š†vŸÓ¼z"œŸúbÝFÑc+¬Ž¬ùz6E’[â¬ÉÔÒiL$mr5“-å]ÞÖ¹Öch*Тɶ²Ý˜ò¬l)ïzH&s­ÇÐT:˵²§1åYØRÞõhj=u“'i+¹¥–°L-ÆDg§W7UµœuZ oÃÔMî4O)Ž­’iã3šJlˆÕªÉÒÐyDɤçjº©XÒw"TŸ§™"«ï[J¦<¥¼´§èîë/Ý0Î!bÿãë÷ïþs {:þúÓñ]œØþxüú눪n™ç˜R?¡ç'jxpóäùü„{|•Èó“æúUÑ¿[ñþ›7­rø¤ïïó׎id!§pgœ2-7)Ãν¶•0'Åjô¤þˆžPßÁO>Á'Oè QpÔ¶ßÁ4 s­ bUZ·æŠ˜|G0‹*ƒïlF4Ó3"¤\6]s1Ý8™˜û|Õ9V,E„ô³ Ã£ë“ÖlÕêæóù¢b´!T„È&÷€ÕŸµ&¤6¡`¿.íTV[°ÖR¤Ë«‹¬#˜P3),*·¥°„`.…5aý,Mb½ë/®¶²ÃÒ‚e>§ÂÊ3"¬õÿæ-½/ax$–æÂZÏ"#ƒÎÔv¨Ÿ¹¬(i¼ŸÌ¡!'†40—¤”M%M}MžÌu±*‹kŒW;À«È¶`ˆ> 5éƒÝ¡Ðþ´Ä³|ÛÙ å€w±FÂÓÊA Ú뛦jÚZ¾}ñvI©Åg––v[%Èßnw/DŒR 'V„˜¡ 6øyUZ ‡@¿i›— )9s©Ó ;ˆøCŒ›ü‡—Ã?hЉHøçëjÏ øh»Ç(&PÜ–Ù%0µ%í™9mÆ 9ÃêÁ_é“Ù,FåŸfpºmyk'&,XƒAãô|ÇžÀ@Rm,ø„­iÃWwê~ýž†zéd%ØYM©#ÈL¶.õÇŽ°æ²”\¬ã­Ù.ƒ¿“F?{[ÛwÀ¡‘‰åq5-½ß…ýäo¬u ð,eaèü¬W9ÅÅU/tJ½·SAjcÜC@ö> ÙÊM[ ÙX)b!3ùx%àÜyØ1t‹Ùï>ù Ÿ4áO&ÜœÉgX4v–]Á„å{«!ø$Fu%ðõ’Á+—ˆAŠŽ:x½ér±àõ:†Ç ^¯óަ밆àõJÃ=x½¶æ^÷°÷‡AYÎk¤Èþoø¶vY5È-Tı+™Q›JÈ6(2“s 3•­¦rî#­fÏM{A71}jÉCÑÔ¹ ³m†·XðêEôÃ|2'ä%Ì­™uâ;äå\HN7í·Þiô>ÓâK2t»NÛf˜îYî‘ì–d³Ã¸ç¦ËÅàžë î±hfèð;P7$@7a’¹I7`QøªeOl¾šˆrïLYïÁ¤ÅÙ¥HEbLyÚá•ðŠ•sT^É,øÛ…JäuWn‡J¶ •ȦYÏ·|:ýy†qT=ä>Œ³ƒ(÷¢¨ I^J{™D¹ér1å:Ú¯õˆà=æ87mÅS1›bQ' ªSì»âKMøä„°V'B!ÀA©]äÚ]¼Òò#J†® h¤$˜ZXw6Á +pŒÛÒüO¹4g=Ë©ëÂÕ†{(¥m›÷# Š‹æò –e 'Y7ôa¤ØeÈkú°‡G@ ›p@"œ lư«5á€`£ˆ±8S 9‰ÃÖæÂð°2³Î#MLº¥i“ñÒ-îcŠò9¦aíÅ%ï>¯=Âóv=)îZ3R_²´Ó³àË.“TƈWø—‰PaÎún<@F$+#qwÄTl`|÷w0Ö\¡^³: >¬å™Ö—¼ŠÇñCèÅù¢â«+©È;sæ>Ò°Wót'@±€+ï uçh×pOâ–£h:šÝ}pÐ O"áö?3“•õrdý¹ï§¬n ’r²˜kÁûûX_â–Îú×JYÇܺg"ñ?"M2ÏÖ@ƺ›…ë(2b.çZP–’¶¯q3q@RaD™Š¼g'R’JR3ås~4-©ó²C6DJ #éÏsY3Þ‹x£·¬dÔ75ìqzƒ ¸+}érÈÛ9ÂÒX¶›b% Ÿà0;*wû?6ÀY5xl`ÖZÅ\f-ä&J|,?™§¢KˆA(ïLè@ZqHIËÂ9™×~-œvBƒª»ªº'Uu «ÏÎV¸Oiö GVx–:À‘\ Ù ?åwDÛ¿Ú½² 4h?ÖÈ&‹ýùóËã…ÎC~‡íŠ”øXÍA31lpÔÄprܽ`}C£>çÚÊ›E,s•°¤+])`î=ÈPÁ(|m‰d•+múúà¸ÙÒö’äãÚÅ ÖÖU^`º[t² Ø.ÕT2ŒQsŠÔ½ŠÚ/ÈrÕY‘éL Í‚UöÆó2É¡:fü¡u·žˆݸ9®Íã¶´÷ÈÿÀ‘ vK,_Ãò(œlzOçŸR¦Ú[>_¢x¶°`œuùšm¬5ú\}&¹¸ḆÎTrIù8sdŽg*?ä¡G³xî}ì½n½=ƒ{9•¶ªLiÚ÷H&5ÊÆöHZjrÅJkëª&ÅÆ”?ô/Ñ8ÑqDåi§'>Kn;ãjm’–Cÿ0§1¶wñ§‡â×c+»D\Hs€Ë‡* ¦vÊLzïÉùäµ¥½€ÑqwN”ɘ»#™Ï‘äb=Ñâ ië¨È·yu”fÃ#ÀÕè0u°Ó„džGû™h ÓúiF™¹fà9`Zí+œ²ÂAÅXã1e&*yBïf¢ÄPÖÖ(µ«&æ<ÒtÝïˆ(OõdyK·×½^oÝkÍ—‚Йùr_áÊ;Ó`Æ")‚]Š»ÇÄî1ËŒ¶EˆBd—á]‚»ÞÏŽ­z„líqÂÒ‘ c#DÒÁqå½DÕûÉšG—·šP@’šÿy~-᜙¬W³FÔýˆ¹ŸoîŠ +ÊUÍrb-âäyGåÈS·ó³p—ä+pGJê¾k=K*aÎ -Œáù¤4µ,©º‡ÉRîÁˆP”Yn «TALe¦Í’£ùQÏrl#¦¦PŒúƒï¸wÛÝŽKÌQ³,òç1ø2je÷>Vç}ÍÃ$†µŠ)ºã‘a“R ,ÇáÁ(g_!ÑöMàŒÓ Ñ%¿ä;DdMMÈGLá‹UàºXYaQ¤¿ü/vðo=æaf·—ňòê¹àsɦ`;+H¬°b@HÁ¶€ ³‹0&™¡–b– Uã•œ× ½˜bn1ï”­²âsÈn¯Å£Bý}f.‡ d›.ö^„)æ:Û4s~ù:s;c`X„(À!àÊØ¿&@•úÛý„ %ÅëmÜ©^,épÇᙂTѺG·˜Ç£þ 6 1Xˆ»Ä¯[÷ÏïÞA´\²Ö,S&Ãg-ye{}›ŒÜ%Åîä~Ž’ —þѵ®©*aÁÀ6ç×WÎäýÉWÝø†<’ncGKdÕC¬¾˜P 1ÈJŽûÁ-¯€;JU¥Æp5ò¤g$Æ*ÚŽÖ¢’ý"˜|3ÖOßiá;½>V´¢õO¹>y‚­õÜwû›Oð»ÚDŒÌ𽣋±'ÍC³lØ;zÅBæ®Çv€®;}¦Â„ÈÇúÃk ù@;ª\Ù­ñpѦlDtY)/ZkÛ=Ö³‹Ö™F‹9Äæg]üJø¼­Í±v1‡?gᢦ©eEN›ïÙIëü±Ž!Üâ ¯9µúñõðÎ-­V endstream endobj 7402 0 obj 4022 endobj 7406 0 obj [517 /XYZ 40.7999999 602.899999 0] endobj 7407 0 obj [517 /XYZ 40.7999999 602.899999 0] endobj 7408 0 obj << /Type /Annot /Subtype /Link /Rect [452.639999 726.740000 479.519999 734.419999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0328/) >> >> endobj 7405 0 obj << /Type /Page /Parent 2 0 R /Contents 7409 0 R /Resources 7411 0 R /Annots 7412 0 R /MediaBox [0 0 595 842] >> endobj 7411 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7412 0 obj [ 7408 0 R ] endobj 7409 0 obj << /Length 7410 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•EŠ"E °žYÈ!€a99Þl‹õ"Îò÷#µÔ=ݤ>>ŠVÏÈ}:´M+ÛùÏqúûÝõ>4ŸUCßp=ý9~ùzøvüvøxø8þûíÀäéÃåÇØxbîð÷/¿Þ̓æ'Ÿžþ:þö¿#?þeüß/Ç¿ÿcüñãÒßôÂ×àåô˯ó/Œ3>Œÿ¹þmjüùð·?ANýNÿ~'¹j™’Ip|»|ÊN¯?EƒM+Ô)ÅŒñÎ~\ŽÿþëðÓØÛŒfëïÅø»–Bµý0ðñwÕ-‚FLJZyÔãƒ^YãXÓ ë‰%w$y¦ŽÚ©“”™±V(gOY÷Bw<Ó^œ{J^B= ™:!ʳ°§F 6¾;îA0µ`­hO“Ô}â,/=¥.—`ÈÓÑKšÙ²î°'6­ LË^qkû0ºTB ‹+Zeä¨!óÜà®õ°k0‘ÃN¬YÄ€–es¬^;H}æ;6–ÀqíõÄHÿT\†Œ6έ±¸ ƒ®àòçàN©Äß›{hmê÷p?¬U7¿å3MÍ [yó-ÿÀ.,Ä÷Â~ð½á V.…ðKÌP°úŠ{³W/BIØ5š]£¹»l‚€¸{ßÀ'vÍÏ™e©²0AÀÂÁ0C`~ØÍ‹ª%{ƒSÂoü\Ž=¸aAÍ“fv$r‚ýºh¦!¿´h¯üzøTÝò×–u&zH{^¹ÖI´â~Ö’G³ÃL²N[‚úB„ت+¦Ë›ïš1D^pkESte,óülÕTÚìÞ-z÷ÏÎ'Y%¬µvÞmAn`ÝÉî•›1†1^`ÌE0Uût§‚Ô5â´A^)N4޵ ga޵¬°bwmǵ±h»¿6#ÃçÒ\ÝŒ˜Aøi ¶’enÜ#lïR„}¾°×2Ùq¯–p…&Š-²(ÛŽbíl„“5bÑù4â¿JU†Ô¥2I=F’Tr9X޾t«ã£u¸r"¨»ÌN*Z8OµšÖÊcˆ"X7¯ ,ñ[-{¿dÅu‡l‡ã8Z ÃõÇ7™u>puS_[„ÇJK×má’qPȉ”=ÝÌþwlˆQÀd5šŠH˜6ÖplÇ“%È,ý0"!¬9Å–-.±x¶ ²…<Âà0ï,ØÅ²–KfP ?{×mÒÅ-E,*MIO‹ÖÆ bô8lŒPREÄ-nÌxÈú3H!ã½Gºf€ñCÿ–äûÌDeŠO2+3ñ`7&n±¬p šd@Ö!ýÎ’!žkðÕ~2vPùórÏ(µpaQêƒÊ,V€±úÙb¨¡ú¹@P=¨Öd6uZ¨‰ñâZ¤Ä±€ŠP‹¸#7ä@‹zYæ¢UçPûNê¤e¡ãí²ÅMvXó[Mo÷Cí~¨èuÛýPÚŸ*|ƒ]Â0>öœ ž½nêÏÀ(CÂêæ$xoж´gy­z£…}¾Á-¸7Îà7}sѯ:Ë@ž k4gMåjœ XÛ̉mkHeÍgI%jÄ¢o¼´°Eéæa®ZºEYâfÝöZ€}ˆ_ƒEŸZƒBgŠ× Cз¨7ÜBZü Ü l…¸c¦ŽsróVÝjbki•Ãê…REjX팙ËJQK(ª¯C bÁKm›>\&MtŽ0Y)¦¸7@‘µh¹ |ˆYÎaûÏY€xSk#@Í“ØY4§Ä$%âÈ)Ž˜Å)Sá^o2¾ížÃó¦òfXD2Iô„¼ãDÁ–eac8[oúvÙ†IÑìf8AWÚŸÙøæ§cÚ}ÞòâD÷¦mMI!ˆ” ì„\ Á HD öäȼOu©`¦réÝv[.&ìIYñŸ!+’O@9‘ߟ7!Ç)6?±¦Ø1š%"¢ÂÅ’À§[Â俇ç—WàhÑé}ùV·¤Å½0®˜,œ”b3YO¥ Ç‘Âû¯\U È¢+’ו7£±LtŒ5í!v0¢°ÝJXS¡$Á5Y(¯½œ·¦sõÒäÐ?°£ E¦e=7o›LY8G9˜³Y Â!·,‡>"Š‹ä¨e@rˆyõ{¿ ²!OY4T°^…ð«M&>ØÔ»a];Ô”–<§ý#:yำV¦íqçqç®íŒu÷«íiÏ1•g±ŠbŠ:J<%Æõá;ÞTáªË¡‰y;ÖœØ&¡æÙÈ]ü?oxØQó‘Äù›9bñ¸Â‡ËΠº]øT>Rë^)àà(=ÙQÆòu%ˆ&.'D‘²Xà½?Åy˜#ó„ÄG1·Ìê)K‘r…²¸¿`½!é¬yv ¡§×–Gö:])5ËÛ¸oÕJ\·ÚTžî&]RÉžÁ2…Õ²Ôñ·z}]¥™×Ád d.d•é¹ÜC ÉRs»¢¦LJaL¤ 'b4Ëð$Ò¬™zwÓØ+¤¤0“+TÏìÞŽ[)K•ŠŒéÓe=4¢3·~÷ÐÔðÐô4q„•P¯/FLš—E^¹Ôݹâ[ …#p1\NÁQR"|‡Ë–`Ø^Q™˜ˆ#úu"):¦6Çôô#åxcÚ~õmÁvÖ6R±[)MQ®#ª"EœË‘?d*ÃŽM=!0)y0"‰ ÓŠHÌP„>Ñ¿îür¸á „ÜËç»mŠ8ËM¸Å&@/Ïè£)œçÒ*sñv]àé¼gÆþÆ¡pË0ÂI“rÍ!z{%gcòò±|6E9fÉ1j%u=¿¥µ5mÌ/L _<#v·_wò©uÐø¶¸íÞí¸O©bVÑž/‹ÁÒ³kQ .hº/Ö¾-»›®u¶u7}ÌÂL;¸nM’¢/â2®ê.Û‹ªåÂ;‡ZT›‚Û;ߨßÈJµ›±òÖZ…·Iå…q9kÌÓ(EÎ)OÁª»ûv”Æ~JÔXUJˆÎ é’ôk†óbE½—|ßû‡àÐÄw ¡š†°.TT6yŒ=»T¡È‘­WÝ¿W¸hÌ«84ž·õµK ãÞ Ò²iÛ¤•ú8¡žè§¢õǯ—ÿËfÚ£TÓÅØ0?ŽRž«ÛŸŸ|9ȾaLóa`—·ÄM/âzŒñýåÿbúìh~ÝYctÓ7$ã[ú¦};ÆÏ‡÷(§N Åöe„ùcª»ÃÁ%FÚ&sl\¶—½cG晫Yf”åg³üþ®¼XyM¦×v÷Ãí[tF*~£ÃHÕ­è0Rõ†~1=1u˜Ó[â¦q=ÆY‡‘Š­è0RµÖ­¥ÃœÞÒ7½èÛ1ªè0R)/þ¼!¶¿aC´ª¡ºóus»ñà¨T a.¶Dz‹’Z‰U'ʰa(›Bp:¤4} Ò¥§ÒúFzm»"=‡–’mzbJÏÓ[â¦q=ÆYz*=¬HO¥•1ÆôÄ”ž§·ôM/úvŒ*Òsh÷”ƒRÚñKÏ¡¿²Ü¥çc£R%„yÑÂÒò«†²„ÌŒ²‚…¯’és€iË*Z‚am#1iì([ÍFÉ«vw˜ mJ!O#hO´X_ì­n9p*â ožÊxY—RŽÎä8r‘·ÖBtí­:eÃ_ði×@6ÄÎKZZ¾ì|@ÉÐwšQÎl‘‹%©}±JeÒ’rÃÚnÇùˬ5*žÜ>;d8Ìù¦´¼¶PÝÎ.pìªx}ñnA­[eøÌÅO‚ÇÁ+OÊRÅø±kÖ,'Ô ì‚#¿ƒµÃ:Ç ¶Ûa‹cÝòzàx-¹:ô,¸wEH!%‚—Åc¹"æBŒÅ¼œù„e­c>ûH¸L€š²?X:’æCc/Æ÷ÆÂ1Ç'Ђ;u¸ƒdÞU|LîàÐÍ*E†36µç†º­¯{c Ù¹÷pïÁ¿Š™[öôåõ‰¤¦/Çe­ðr×D^Ÿ&²™,™7 pìƒÛõ€ÍëSÚh]=`ϱ©È£÷›=Ǧ ßèΉ™‚R ·<XÚ;ø2Öƒ± Äœ‹Pi›¤½p¬Ç<`Ã2Cí &LµXGÁ‘mB$Œ‹Ã5Ø<À!ÛÕæPSj¾?&ÕS(«’tí+]—Ø3ÍnÑu¥D²EK·Ä\CG¹:#¡ÄuDnRJZXÌõ‚•¯–¡Ü\mï=¥´Ðã^¾Á3éä!]}¯Ô0)™-ª{sçý×aþD¨vå¨F¹•v¸eáÜLm,nüuE÷« GIvO)çæ¿A…„ø~΄k§²$LÇ\‘…×·à]Š8¬Péø´$ðGâ3Fòøk/HSâ®á ’‰¿þÍ]³¤¸cb.(<ÍMáq›\DLkë¶r‹L¡KÅsÏÖxÖZ–n‘„…—YÏsà̯gï)ÛMy@ ÂÜß7fk¤Ü?[Ø ­½Ù1ö”Э£¤™,{_(lo‘®iÆü'KIñpÝ×q†5‚†ÞžX–õŠï|¨°¶³M. ¸4vyJÑ™b0ƉA‰õ„ßlÓ½÷–âS@hƒÅX«íX(Ë«mÙ‡ ÜIA°×|„Mk‘SÀe›KŒˆ‰DP">vLqv¥ø@ÍðP/‚g –õgHL…d mf†½rà•W!cr8…ç“rûãÜJ¸ ŒˆoÅø,Ïb¼Ÿåþ糄–ðÁqŠÃ­²v+9$!CRü õvòÿ«'Õmýh‚`Ò`Å{JðÛH î•)„ý&Ö&ª×,Áù(á–B@Zþ}TäùðÆeÞf*Þ™<éN'¯¯oáÿ¿“až^X~|ùt‡üyy®îÿè\ ç§Þ•ä‘ÓX-IÂdsR.ŽÝË=ì³T”²‘ëz‡µÎ3‚pÕ¨ui¨VZf†Ûu ׫úxß7rÞEׯà7~3#¯â oOº—–÷°·®Ÿ<ÃwÜZ™áôÍ¢®µ04…§Å}³ìXÌÜØN€uÓï¼gÊ»Û ï)ă…i e÷&â1„}@´°(Ak½ó_Ù·Ö™ Åbãó¢"õ!_/ì­_ŒáOY°hZÙ05ÚF·è´˜$kC`WRìcN®~üxø?ò¡h endstream endobj 7410 0 obj 4716 endobj 7414 0 obj [518 /XYZ 40.7999999 645.139999 0] endobj 7415 0 obj [518 /XYZ 40.7999999 645.139999 0] endobj 7416 0 obj [518 /XYZ 40.7999999 188.179999 0] endobj 7417 0 obj [518 /XYZ 40.7999999 188.179999 0] endobj 7418 0 obj << /Type /Annot /Subtype /Link /Rect [347.039999 152.660000 411.359999 160.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 >> endobj 7419 0 obj << /Type /Annot /Subtype /Link /Rect [117.599999 618.259999 148.319999 625.939999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0420/) >> >> endobj 7413 0 obj << /Type /Page /Parent 2 0 R /Contents 7420 0 R /Resources 7422 0 R /Annots 7423 0 R /MediaBox [0 0 595 842] >> endobj 7422 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7423 0 obj [ 7418 0 R 7419 0 R ] endobj 7420 0 obj << /Length 7421 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsUDR¢$ (L’}($@}(²Ý‹Í¢é>ôïW¶$‡ôGò‡”ìÑ ™Œ,ÞÎýÊ7þüã¿~?¾yúüŸã×ùçÓçC]Õºž¾Ž§ï®ÿ ûJÉé×®o+9œ¾Ž_¿¾¿>>ÿ~?}~qþ1>\¦˜üýëo‡7Óä‡é/ŸŸþ:þö¿£<þeüß/Çÿ>þøiïôo‡~Ч_~~RÈ~üÏõo§‡ÿ>üíÇ߯%ôçqOÿþ e/UÝ$­ãûåUqþ¾~Mv>!Ù÷G!ä¸Îv<Žÿþóðó8ÚeUß(¡:Ù6ãïƒnººí{9þÞ©ù+h¦N.S >vö<ÖvÃF©)­x:cÒÎDÝtΑXaшæ¼ñ¡MÝù2Rò¶5PO+I;[`F'HÑê^Ëî™ZMÿ%¬RwŠ ËHÉ×éŽg ÓŠx €Fâ€À %?ZFJ>¸a`‚ÀiE<üÄ]7Lá2RêÁi!yˆé¼"À‘8 &9p)ùà”båiE,\ŽÄÕçí¶]òÁÍ#%\Ó´L W$’v¶@Àé‹ -ŸUèïŽß}9¼ù(š/GùËÏ'°Ÿ&~|7Û8)“R¿ütüc]‹w:~ùå0Tí ºv²S¦'õ|‚ßyžˆ¾ÓÁ' =Q5|ç-z"uÄÚúNñªç†ÏZÒW퀩ïɇ/#¾fǾæ|¾á“ðIOâ8Å6bŽ bE´HÔ¤ð~"æQ˜fð‰âw0ÍÄC›—€È#Ÿyh–)'æÒ›ë.BOÍ(x¶ÏÍËf‘NeðEë;À—]ú?¦ôoúv—þűÜÁ—wýã^õQy¹é¦j¦µ\¡Dgj&OéªÀîê£B7æÙ&Nc ?:CùyT?*Äù‰ËÚžŸ æ ÚaÑr"B!ªQžö㇟? tÁ¶R²²½>µ÷æG'ÔÑ•½gŽ£?µº…GatæŽÓA‹v™'dFYóM ï«~¨õ‹su¬ä-‚ÅÌkn´Q¾ËæZMµw7  ·p/œ„m¼ 'T[àGå‡äÈÉ™òªAM§ æ-±þŸ,éct'¨gbXa­ ¯m+uFÙ¬Eg g Y-î`Š(•bVjѯŸƒ†³ÿ&°˜³¹&A8+'³˜‚Cšö šM}‰À[mLKØM•Ç¡œ`\ð‹W À~éF&†Œ\dPÉE0Ô5‘dyb „ =üâdßó-®á.¬\G†0"aD¯ƒ1F-1ËÎdø †Jšgjâ¡eê(CšNAØES§Íœ÷¢OTyåi[_ÿá×Ãçlɤè€OKxyÀ‘Mx˜ &ˆà¨™£…xxJô“:Á¦Ë|p‹ úå˜È°ð„íÉñ¤¼óŒ+xuHþX1ŽÃúEnçb{í0˜lÏÂDK˜F2Áã‚©? ð—îŒcgŇ .¬ÕÆÀ3–)*bÃÒÒ=-„I‡÷€YÔo¨Ù×"‹.·°X¬ÖV-l×´ ¬?PLÁvè_€m¾š|Ä6°-ŃKŽ, /°)ñà˜øccïòƒ²ò”| ˇB਑£¯„ó±(‰îÖqÀ‚Vе;S¨8N+"})Sš.öú ˆþÔ‚°ýAðü–G³x´.Ò$Æ$Ø ÏÂo,6"!w—içMÁ2®Ö/‰”V,‚ÃÅ8d Y¥d¸ dÀмÄE)ø oÉNÌ p ÂGÀÂÇ "Šófµ¦ ÆÊöÕa¬Âi&¯cg°uŒmšW‡±Ž¢ÄWƒ±1…™%0Öã¹èžv ¿žà‹ÁÊxSs*ãsÏ­Ñžà;e … à?Á¶ŽIxåHfö›îÍûyi­2RtÔ[4ª§p‘ ¡2¯©3']9Ù> >옹¯ðL—&Öêz}wN92˜‚„œ±þ`–÷à’¦óÖ&ðú›S–êÍ1s¸›#|ò_§ë–âøÆŽŸB&+Nb9Ü-dâ³ßæP9ñ!–.™ƒ ákt)Å=¸ZØ ¦ö×b7V'×s–;¶Â”óbÉìeë æ1÷z¡ý[Ä'ÈÁ¬£j/Š@¼é9 áÒYFÜÀ•ä%"è9ŠP£ørJ×»ð,:[Oåì‘HÑåW,siº!˜Ëïijb¹â%h* (zÆ28ÆÞd©kLðÔ:´RBÇÕ’ÞYŠg²r½ˆ’ÖHŠ]U±ûo s$‚µÙœ\Ë.ˆ2›‘œI Ž4^l{YÍ›K׎ùL£V f‰ë²è¥„ Ö=…Y ]̶›0o8ÜÞ\ÒfÞ1–dxM(…áGT`z[v¹2FŠ4cÏéXmƒÅì%é{Iúbºy‰)!6²g†tý&1X°šY¶GTrFT2ʤ¾¦LJp«D¡¦•Cfñ^ÏVÊu$øÊ=öÉPËyÊ¥")ÓŒ5¼·?ÔíRnS ã˜*Šw%BoÂSô˜p~=A‘:´¡õWN:.8‹¹’µ ,ª · ¯@áUGÔâEµûŽnŽWçÁïàëù"Ú—;j 7^Õ9tþªÎšvj:¯ ¿³e:óaovUN×rѹwUnWå6®ÊET;®v„ ˜(>h†>°^­ë^ìšÀ® ìz5 5‰: Z¥¨ ÏA3ŽÄàØNé ô]çG<À£ó‹v1¬- š=k>²?©±VeDék1c‚§„®O[D,ÏÍx Iøyãá… Ô{Ä3¬û*í<3ï'îµ·~[KCRðÜu6%¿Ç¥‰3V'¢ kž–ÃÛ¥,.) ³PP¦´pxüކOð;pmÒ:‹ÁÀÕFŸ#ž¦þˆp¦ÉÌ6PæÇÝÈÜÌÝÈ,% ¿6½AójǦtÁ.tYŠ­,1k}(Ú<ºÆp »ä,Pš%¦U_<³õôe²íOê…kv­ñd6 n¼ƒŸàÑ+Ð;3fˆºš\– ï«f¦ “n­ú ½SÃ' ®`ÖrÚJšþ‰YVßzç#ý f©¦«9§ÍÂtÚNñ<̓ÏCÏ3¤£’Û™ƒ«Æ0ãkÃO¸ã;·ŒÄ¬êΤæ ÷ëtFä?À]¿‡X©&Ï'•?ÎÒöúåAß`ù·ßfd%²¾þÅÃîø ]÷KضjÂ+' ù)÷ÂPT-V¯.>¤ÌÆE©Jµ€†ØàJèÆÂšŠ$`{Œw©f½ÏXRc3í3Ö¯(æ°YúªmYÒÙg_(Ér°,Up)¾,}øvÞüв6ô1-ÇÅ œòÒËÅ}RôºŸ¬q”)áw›Ñ*›ÃOrôªÌoLêz©0ÂZ ¥´û«Stu‚qby'Ã!ÄÅ`Åê¨(uÙ^x½9¯ï:%]‹Àï­š2K²–"p¾L×åœ]€dkp ,h2u*è›Õ!q- Rfž®} Ü€åâSG¨)¦ùáóðŽO[Q*mËR=BÏÛ¨î­yœiàלO¼à|Ó_‚X¦g™Z7¦b…Ýç1¶}„J%ÕMðñ6ððN™(\,ÒX÷"“'3‚ÕÏv“3š´§ÀÔñÛ¡†ë?üzøìÚyÄýi /q·PJ¥WŒB£òã+œZ;Biæ$y SÚëî!“4ÄaédáÛMPG ø.ÕÁZ ¥7'AÒ0{v/nDº«Ù0ì~E0B21×Ì%àÞ†A^:ø¶=»šçþ!‚ÿ9Ühæ¼(g©¡ì ¹C V»F‡ÒYªº^·Vg$†bÏ=p¹N¦®âJN€8¹ëE¶<Ü z¦T-„û(®€œõ¬99zß,=Sœ“ÀóPÞvRcï2Å ª.A¬¤KJ’X€¸¡‡4J·Ng©‰tTt²ÜaD˜{iRúÙ¹¢2k*–6yyŒÅK¸.™ÐÒ$ËM,v»}=W‰¡Ô]‡§2y³ Xv]ƒ ¸¡Âà]ߌ&Ťý…¯îƨ”»Úî´—ê,ž“¢Mê½b8™ß®Ì„vWØêŽ Üæ ïñ8‚”»çkÃØ˜»†hÅž+½T†< $øDÝ¥IÉâ œÏçR:GJO´«ûe¯ÙÛñëÞœ¨#9ÅÜö…zÑëÏ2+]@–ö¶^"ê9Ûõ‡p fÍÝGÓåL®hLiPº'H&lŽèX‘à–v‰½í:þ ˃LÚøî°*¤¿m‘s÷eDÜœ,-Lë‚£#&kƒ¥L)…À8¥X[Lj/Vq>;î uc¬_·äx‚/;ÂeE\#æ][Îؽ0¡Lp)aºd5žº-Äpk£—Çu9„Læ„ðB’[¸ˆšd&@³Ú1¬¾3(c;îœÂ•,ôœˆŒ{¸”'I#ÈAŤ°¯êZWi¯eÂÙÔh­[ˆþAÍ#iN/§v¬L3o«ŒÒþˆR­]2îyuKD|3¾i†väŬƒ(Œ‰‰Ñ:Ú­¥K­ÞLjsã”%†ý¨í/áõ1·µ„Qó¸íÖr ¬z¥l7L~¹K«¨º}ÂAØp^†iw¹b¢ŠÞj¨Üe³,î,ø8 eo‡¥g&Î2-R> endobj 7424 0 obj << /Type /Page /Parent 2 0 R /Contents 7434 0 R /Resources 7436 0 R /Annots 7437 0 R /MediaBox [0 0 595 842] >> endobj 7436 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7437 0 obj [ 7433 0 R ] endobj 7434 0 obj << /Length 7435 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsuDR ( $“I> ‹>Ùn‹ÅfÑé>ôïW²d‡GŸÈCÒòŒ 3±,^ÎýÆÃwþòý¿~ß¿{øòŸý·ùç×]u¨Újú³ÿþpù¶£§_;Ût?þÙû¾{Ú?í>ï>ÿ>íT{|qþ1<üøioüÂ÷íÛñ—_§_”VÚÿ¹üm|øïÝßþ°ÿmX‚=Ž;þûC«ûº6:iOçWÕñïå«h²B­­ê½RzXg3€ã¿ÿÜý<Œv^Æ¡¯•êÚº«‚GíôqئÛ÷]»~¸c’­…¤Rê•‘h\‘JÚ™ªênu¤h¸÷¶>nRW}2¼æ¡RáÕ©^ apX‘JÛÚ òp(5_«¦µ­î†ßme¦ÿ26lLÜpߤ‚î4R2j#CüÇ©¤Í(€#I` ži7YüœGJ\SWB¨<’®€ø#I` 5œFJ\§…˜i\‘  ‘$0ÐÙJˆN#%ΚV•¶â4’z£ŽÛí¨aÅÜïi¤TÀÙªÂÀ¸"•´³ÐH°•”z)JÈ =®H„ÈHŸEüýìŸ<­¼øáëîݧ~ôžþ<â|œqúñõûnЙ?Œv²²û¯?íÿXU¦ýÓþë/»þеM«›£8=ÑÝñ‰=P5ÇêCmºfvç'öø¤=hežŸÉ7ˆÄÆ:„ÈG¯À”îêƒK îâ9¶G¸Yá-"œ#Ä(CÁçW@Ý`o¾T@Ë„¡‰@W3”­V„ ‘ÈQ»" #ä²_õ Q‘›P`(#cù&†£©ÚXëdÚÓ¬gñÕØ}@Of»ðDÃwªOp´¾ÓÃ'xÕ†¿ŸkKOÄp‚„Ÿj#^Ó…Ê‚bæëi¾ •ÓmÑÊœ 9Ÿ— uí"Ý@öØ ƒfÄ¥QÚÇT¥`Ê–…Dð–²ñ&€~?YbêÐÔí¨èBvÌ ü2N06 ˆð¢Ò ãÏ/ #üØcãžaÓmÇ{ 7€Sìl¿ÏTÏ”E=OÎ>³«˜Vk nÚ¸¦à „£=Æ™­ h°nV`ýyÿÛW` O ¶7¼êÍØÅK;…Oê÷·¸ŸÙÅ[zGSxO0Ü ^~¿¶Œ’vvKûº>m-OTíZá•eè'VåŠá"j‘`MTŒµ„c¥:ã’Þ¾^Êé$Æñ7DòVQbÃ]).“,šDÍ©aLïp •‘8äó ÚɈpÄÓUuh;õrõïá ø“ «”£™ñ“ fü¼Õ81þÛŠSfÜùJ¨Ã¶n]¢Ïa´ætÁmíS`9W&ø•WŒÉn…«Tªü[1d7À3{tª9½Wªu‹õT¶s™ŽìyE¶$DŽB5*DžÀ<)ùôZCcS¤"œ‰èW±æa%ÄÙÑÑ ôyv7ää…´FTîf”¹‹D¢0¦*r{Ê˾åˆÊF²&žµKÍÈ\Q„FZ=ÂeJ+ú«uRê-·åR®ØÆ4-Ü@$« '¼ñvùü7ŽA#Y¥Æ1ypò2'ŒTÿ«É*+b ݳÊh¦¬r7,Ð+M±dÄyÓ•Ì@΀7̾¼j¸Ó®ZõÕxÕx§0ŠW]Wüý¨G8Z]ÆÎ5s~µÌ¬MóR&ò²ÔT“Ùn0¾ñ<˜· ¾1GíæÉñN±­´²È÷c.¦6%Bò¬Ìƒa°»”µêÈëbÎ*#kºÚËM[®¯¹ —Ácoü8Ù°ÎÀÖÃõùqE**¾>«°Ä–Õ@uð’ÒJ)}{Lå÷40ä0¾1âý–2i{/D6#—¤Í½¢·XEïÝ› ðf—VðÊêv;­Ïáï‰À–ª ˪8yÖˆlY=­D¦*UàAý$ÂÎÐL[DTW¦ã #ðëOÞ@Ôr3öL¹TØÁàÌa’%êøÎáÔ¸ÒS£ÄQØ^ðÉÈÎÊ&bK$ƒÅ4êI•œ*ÃvŽÎÀTLéÀx”àG¢°n%yMæó'®0¢ò4šéóFSj°ýrvQL ¤€%œÕît²t~# R•ODç=*8pm¤¤üÆõ2eyäCh'ŒZa,–}©pw²ÙM[:O BòÒ5 ú2xm˜ŒcÖ6Ÿ(àÀÕ§8X¡ÊÌLö0;›þ†¢W?¬"¡ë¯ÖÒŒ¡·E‚FRLé;+©¹9~j!£jãUš°·mÇ0‚¢hˆèmç §Y) &ö($3¹0ÜkB”Å–Êß¼wáæ~@^‰tŽ®\Œ1!rá¸äT!–èõ_4'#쇕¸ÀŸð­Ìi¡+[z„ ÿˆžÌ²i‰ô?AyÖCè"Dȸ•ÊDñóPWO‡‡Û™–Ô«.!#|¾9‘³„ 2ßuί… ¢ˆpùTÈœ5ê”ÄœK²–3¼Û¾¿‰Ú-™ˆQ]CòØ{ž(#ÔÏhÄ­fý1xª¡7QLm:ý3B…˜+©d8ÏJʦQ5\éÚ•\$Š“ón¢ž*Œ7]°XÆôêNI¹( ÷e-íÃXÀE1kÛ8-×*'wZ–¦åRòÒwL!¿ Z·çVv8³qeÍvšÉ¦tÿÏÑ㸈ÜhÎGÓVhËü,ó[)¾I¹±²Ÿ Anµ0ÏKkºsçâ­ÄÒ\‡Š„)p9ÈJF“VA0ºS"ÜFð³Ùp[~]ÙªÓ©Èõ1Ç>cζô/¸‡¤Qo qDžVJX0ÎäRë\òžI|¾pýƒ ¢# ªšEo÷‰YRÆû¡øoˆü/ÔK ÂÚ¹×"âNo¶<+ò3Z8ÐJõH(ëÙŒtÚp}Q@wF]ž„EÅQPŒ›ÛýžZ™²´i`§ËW/%ºDÏǨ+šòt;(S wý@ªôfÞ(à@¶Ú¿×”Ž)ÎÄÛuõdµÄæ.5æ :æ Kløamq`;)YÇÄ£šêäï4]åx!}¢nαkƒ»PK)NxNäöâ×.wKõ1Ni}vuwõßU+9ܵ¢¨J®&Y"ŒÆêQ6¼H»Æ-¹A]c\»ôêôANÈÅ Û W/¢HºIÊë~‚±­,Q¢¨kb®u¯³WbZ])DªWªÄ<…^Ÿ¿~Ô^Ò<üUxö÷·Cõ}¸¥÷’8që iqbÌuع7å[©ÏÄu d±ó,9yÙk]~uÉ{³µ®ùCcº>/_ãD½ZõãÞw'Ü$µ“©¹O›)ù‹”ÐfJñƒDlÁ¯ß)> D"*)nÜç¿RYÍõ} p•)&uîkÝWwÀ> ~ŸB¦êÓlDÙ0wƒÂׄñ¼¤Êqx™Èm0)ØLÄvåJ@,Q¢âµx=ÜjáD¤b¼çaÏ'±®±zo,%Ö×Ds0ÛµLÑ<–RÑ®IÉæÔäæúòVRe*à¹+òW¥Èý© N=rLŸhx@RÞMŸ 3gEgÑsµë‹KÝ%šÕ»¸wx~˜ßÞ½†™ƒ¯²õ·’;‡€ü}بI^Ûâì"¦*æçÛº[ÖNíR.ß¼Y©k¼:ËK®Îg¬¾ž¥ÃsYÛº€xn?~SÆ:£ âhÅÐ¥¶s8z%®qõà ®„›à¡fxTÏð·uÜUwwð}×èüºû’  ãDŽˆT}¦Æ'19F{¦×¿ºËÍàtN(<\›aP2!k-ÀÊÞŽòøð ½08‚/ÁÞJ•{ÖšºÖu2Ê#d’# c?“d¨ †fŠ ê]xŸÃßýÓ@†Á€éÇ·ï,Ïþ"hðy•œV_õŸ«k÷jØÆR=N¯ÚÃQžíMunð5Y m{h—}}Á&ݺå¨t·ðd"zcºw”ʬšC;!Áe‡¥y,|§‡ïLj­Ó]™¥c„K£MäùÉGøÝ™êvø ½3“ûÒ…ö1Ó=ïcœ½Ïk;2@Õ¿ëç[Ô1¶Æ)¤ƒ9LWwt´šO!ó" ¼0_eëÙó]šÙk¡Õb ¡ôl4Ù|{6 —ÆÅþ BEÖVíA6æKrš%ûÒÄ \ìE_»Ï’R}ÿy÷µyE™ endstream endobj 7435 0 obj 3831 endobj 7439 0 obj [520 /XYZ 40.7999999 246.740000 0] endobj 7440 0 obj [520 /XYZ 40.7999999 411.859999 0] endobj 7441 0 obj [520 /XYZ 33.1199999 530.899999 0] endobj 7442 0 obj [520 /XYZ 40.7999999 246.740000 0] endobj 7443 0 obj [520 /XYZ 32.1599999 532.819999 0] endobj 7444 0 obj [520 /XYZ 40.7999999 411.859999 0] endobj 7445 0 obj << /Type /Annot /Subtype /Link /Rect [433.439999 735.379999 478.560000 743.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 >> endobj 7446 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 660.500000 132.959999 668.179999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/2/extending/extending.html#methodtable) >> >> endobj 7447 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 651.860000 132.959999 659.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://docs.python.org/3.6/extending/extending.html#the-module-s-method-table-and-initialization-function) >> >> endobj 7448 0 obj << /Type /Annot /Subtype /Link /Rect [189.599999 256.339999 220.319999 264.019999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-3107/) >> >> endobj 7438 0 obj << /Type /Page /Parent 2 0 R /Contents 7449 0 R /Resources 7451 0 R /Annots 7452 0 R /MediaBox [0 0 595 842] >> endobj 7451 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7452 0 obj [ 7445 0 R 7446 0 R 7447 0 R 7448 0 R ] endobj 7449 0 obj << /Length 7450 0 R /Filter /FlateDecode >> stream xœíɮܸñÞ_ÑçÒ#RÔB à÷lÈ!€a99ž$ƒÁx'‡ü~¤–z#»DV±Š¢úõ˜÷žŠKíëüü÷ý¿þ»ÿñõó¿÷_矯ŸwÕ¡j«é¿ýøïw×t¨õôk×7mÇÿö_¿í¾ï¿ï>í> ÿÿ¾SíñÅùÇpóô‰iÀÿ~ým÷ãôñÝtåó럇ßþ·×û? ý²ÿë߆?Íã|Ûõ¶ùuúEi¥ûáë߯›?ïþòÃþ·a ýqÜñÿ¿këªmÚ´y|?¿ªŽÿ®_…>6îP?lÖ^©ñͰÿùÇîŸÃhçiúvþü=æKýø¥¾&¦*3LÞûŒ5Ju­éªèÉwzÓª®ÞÛ®Ý77¦·ƒq#©Ô´¶<3RI+6»[‰¼ïz8Kž}?”¼]uÝ1à§,ûŽDÞ÷¦·Lû~)y»ZÓð 4ΈgßÁ‘ÈûÞÚ ¸l“¼]– L;Ë„8ãŒTÒÊNûîŽô‰…Ïé Ÿû¾ðâË—ÝíÈÓ¿üs˜ÅQ0˜~|ù¶3Ã#³«ÍþËOûßWUÝþaÿå—=tÔts”$¦;º;ÞéÏ*}¼Ð*[wMuõhõz¼c.jðÑÖU¹0Ÿ1Ó…ƒ™ž\øŒ÷®ÿÝà+ðçü½jÀ™õÇ;íA«>´<–Aà£øp¼Ó rb¯nŽ>|ðhÁ-ל'ôÇà)©é‰Co«[ˆ®ìñŽjN3¹ÜynÅËôŽ:4¦÷z¢à½qÁ#¼ð„³ÿðe 82䣮{‡~À‹V•»ÆxlUÓ*}z6 ὑca]4|'j3Í$öÑ£)´S„Ï,P;\ø0 †q{ÑøÌÊÙé•Fü°àà È0ao®þ1z,FTxŠ%t‚<©¯´Ë“às÷`AãU/.yHjA±ÂŸfÔÇ£ LýвäRIXdvoÞŒŒ4Z4ÅF?i˜GÎ×&0ÞŒŒ°ØÓ (B FʇÁœ‹âÅ«2U(Ýtb-Ì\죪A ˜¯|è÷tÌ2M4;ä1­ÅºÁw(¦<ä’0Ä£ÀÁs[`q„©ùg–Z<ù­a¡-¿-EP´mír‚§­ö|GÖV›WL’V6`|{™¤VOýÕ fúËK`Zóz3è±Eò!ÐI˜R+ÏdYIw™ n¿RÊÙ(°•ÇóŒjÎá­Æl ‚£È(ñï.X.Ë&]QU‡¶Sÿn!"©‰x´6î)QÖÀwfÓ·²šeÈ\Å`_tååñª8N I¦q8f_V§²>"מDãßUN@ýtdÊ/12îüqãëÃ8ÍQ™¬®/üºûœ=«Ûz:Æú ¹)™œTÁÈ Šµ9ï>EÍ“ 0N{q ÁÛè3W§Îe\`Nn(¢B2¹¢6 8›©0¤Š ݽ¹hß|1( Na«òw0,íçÖˆXØB¾¸xm8ÉE Ö>rY&Ð"¹8ãÀ i´ƒ T!Ø¡Ë5I’pm]þè)q<—"®VšéÁ…±MG1g7>Ã9aCŒÔ«‡Îá ,I†£TÊX4ß&ä¶J!Ä ¼`ŽˆY ’ö j§=‡Ö°ØR ¡ñå'!Š£˜ô bƱËãÍ,]L§zXŠo]² §QI–¦"ÜG¥àªz >Á™‡]κ=tC(â¹TžN&˜açdòŸzºÀîygñYü+sD 1ì6%&‚Œ¢ëZ‡QÕ©iË2הϬGYl„â3H!_”Z<…á„zÙÂ5#ÛõS7šâï§,±4Š Ósø]ŠlÐÀdƒX2„C¹,Öâ7%b®µWHø—RÉ¥`LQRZ;´4¢‘Ì[=þAñj"~Þ`*‚ÿ@¤o1b\OLöÓĪ֎iTMwÊ«:ým}_íÛnüÑ)ÕOWÛ}ÛŽÓ­ªÓ•¯»¶9(eõØaùô”¹Å\cx~þ[¯íÝ·•÷ 5¾ãÌdxÊÞŒbo¿ñóîå‡üù³ÆÓõ'§ƒh›_*’¢Ö†Mܬ2|‚ åɲf5± /ÉJ6Ë<ƒVÞr¥­À°/B·;Ov:‰ÝrNð•„ó”c’Îì‚g_@›’a,cšCQÒÛ'ÿ±VÔTö®j¼NçÕ3…²4‰“d&}ãp“M«lÒÛ»0è`$ËTua][ÍFø´ F—©|²iÎË¥ÙC!¾º»¯£H~³VÎ7•×¢³àÅ}tB¶;:μ{9ж«Ýí,T%jªfP¢{°Õƒ{T¥Ó%8=ªB²ûZQ¼Oÿªl·Kј`åÒ§×UFVG;%3‘ Ïbà§xHþŒðaÄÇ8¬åÄ{s }m °à y„Épá®uøNŠ<Å›F$ƒ½®õSËÁc¼»Vyøµ¡dRˆÎ„3/(aÉ«¥}ÕBkÊ Èý“«®¨É±Ùwú„”¾¬È»2O¼½Ìóûˆzï½dÝ—f×¹9x!/Þpj>EÛ›[×|=ÃD}¨;•?J>ëNÎßÿøËï¡;ZãïÜYǹc,›9ÒnwŸäùˆUíí6ä§àqmÈ¿}äé&áèvV®[Ô;=×R{}kµßb\¢ã&×2hP}«U(EsAT1$£"0«ñç]‚`>N³Ìùù²Cå07Õg2á —•M‚É™Ú]L$Ufg„pÂhDÉõ¹­]ÙËÌyzæÝP¦†RNÔTÎFë×Y2l€(Õ;wf¢|ïN®€[7¬|Ž¥³kظÏa§ÁÈÞxü<“G&EyÌ$Ó¥´Ä~«úŽdæBÝ:˜ž½V“liŠ‚¥Ãp/<Ø ƒb2)]9 é” ŠæÍÚ/\ÅBT=}tûÈ‚“œâ äl7(™KÐz2_¼=ÙßÊöç.‚Èt‚)VŠ~Ž(q@+RBŠì©»èáEp@^·…´fÝÔ®¸šã»'u¸9GŒ©µ·ÖfaªªàÚ•êÅ“âãã•‘jNp@Kû›ä=³^†±Íˆ8]xje„[e’¯ÊUõÃV0„ð £CØú’P9J–å6Z;ô¶¡k Ý©>‚w>€wzÂpš­ÂÄùë²ýlņmoYeH–mÙ°/oK¿ÌýËBM lw߭߃‰÷PÀƒ l/˜A`àó¶">ß6¼÷ ,=¥Ä|ÁŒûÃ…´Â´óBtÕLt« Ñ´´nX—êã¾ÿ¶‡¾¯öm7þèFuf¼ªÕ¾mÇ… ÏW¾îÚæ ”Õ}¯ÎO™›QÌõ7†çç¿»ñµ½óö@âo W†wng2>eoF±·ßøy÷òƒTÆÆ‘Ý ë¬Oxý £°žVLñðrÂrEÄo8Rv«“aÅ“#êºcTèȈ„W 4Þ³F gð‡‡Mzø ¢-CCÐöb 4î‡k ’ø¸2M6œTËR [héGRšJ1^ñ ß./é¥DÈvá)WDºÖ>ÓD¤º½‘êT[W|®x"Òø”¹Å\ã,"ÕÍ=©6Þ7Œ/"OÙ›Qìí72ˆHøÏ4lC^ëÌ}!\6Û€.™…; yhÖv%S—¼«U %<ƒ.¨t•rö=Ì52…ÕÅ:·á;u «v³æñ÷ª¾O)D¿Ù9ߤäJ‡#<’Œ4 ÉŽ˜0IΠÙ‰°ªb¤ëÌ-Ë|¸É z}ßNR6‚-PDt*Dtw‚%aAKIЇGõZ‹{Z EÛCd}±–©§‡` b“îzMµb‰| ;ç3…µ²ÁÓ츳#Gy|Lb0KN¯Ÿ£´(àé϶%xI¯è&©RO%ԯŷµâÌ×¼vÎÀB?ÌšXÃÒ²UD1úTÖh¡ÀfŠsQ)W®@ŒO®Z ãl Š5˜°Ï-“þMžLéT’ÐiÑ«ª¼ê¡*Žä(Lädëиò\Ž~'¢žÏ;—9¸õ|´cŠUP Õq1ǵ蹈ª©ªë ¿î>G•gå¥é.QÏVäôÌ—Yä~.òÑœ¤n7Öf¡ÈG7ã¬_’¼3û´î•ÿ ƒ,ìK_,ì iPæ¶°`)¸Ê<ƒ ‘=[⃬`ÎJ)Ü…¯cŒñKI·A„{+û”B±ža‰b§{Ö9w)h±^OÝ&˜.“Z_zÞ‚B””§ÍaØ"¡.¼zùAÑjÁ.Ijã,RKr“ÝZX]å¨ 5”#s`H k8*Å· ¹H®f߀JFóørÒÉ"d`H—<Y‘m\V”½ðŒ¤L›£#½m.¥K ¹Èpr”†ÓÍ(wà0E8Žl飼f;àew#z±!bÌ`ÐIéä “(DÁµ w¯÷W—'$q4¤h³Iq^,²QJ@ c?@ÉúÖÅ^–‰ü ]°¥.¢>ÜJmVxÂJ]PLéÞàKòk/èÛ”T?Ñ>ˆ›öû®VY&­ ”ò¢’y¦wI‰#(î˜2; ñ))¥XÕ}ë£×q]àB`0(CÞ-ØÔ&¸-^¤Y„­ÂÀ3Ûí}&A(—½PüÓ~ºšý4[ðbsIf ^Ä :EŽoŸ¸Ð\}k5ß–:7Ú9W8gvÁèVR„Rƒ ™¾àw*°¢,\å©çdú$—ÁÕ6­)øè„¨…$Ò²N¨– b,µý(ÞùXƒˆho¹Æ…wλRf,%ûÑÃzAlÛÐÂr®¬Ì“’­>OJ?JÏY_äê)È9+H¶úÜ\-S=ö…š‚oF†Ñà¾Á£ñö@X(ØÂ\A²w…ΊLËÜ—:lU%ÇYr)3#ÖIԖÚ»)_Š·¬‡l¾cz4„$™¢&ñ…U·Ô~ æÎ"’| mFâ,$•é,E¸Fä©„õÝb1áô/Q¢ßÕ`¯¡ Í5·¯\E)¹ª!I+UíÖX $"b Þ"†ðp´yÖ¢.gWŽÎ$™eð¦w­»4Ž2P2%«„’#VbMÉçú Û8ºúÌ:Àr¸”.~ Z<ø…€fJ7X#'X?4@ûÞ¬UFè36 }v& ¶·÷øY/ØÞ@VºÐo.‰ ã¼BÏX¦ô…!äÁì”Ía³Œ gÏÚÓʾIO+{ Vöþâ»ÅR*f³¨š„Ü–ð+2ÖÌRl*k&í'ÓvŸI ËKêªw°sÓ¤\2óªoÜŠ÷É•Ö(S’Ü¢XRë„Se½c²ƒèÅqÒ1üÛm8“ñùÇ×o¨*xWö>-Àâ«ábví^ 뺛ݨÚÃTz¬®Ì-j·í¡½-Ö¼£˜0Qw‡î¾¡«»sg:غ>h{·AÓÚéT\Ⱥ÷|Ç‚ïLPÑ郮ŽuÛ.w^ÀÑ&Ðò ãÝ{v¦wVøzgFÞ{w´Ž†qïÌ'†Yûu¨×ê‚§­à3á`–ãïÖà!D}„pa׳ yïË¡½ÆÁ3Œ7ð;0¶ƒp­Á„ï,¬ô=D”b·¾¯Úƒs¥ooP ¢®×?qÒÿý§Ýÿ>æ endstream endobj 7450 0 obj 6413 endobj 7454 0 obj [521 /XYZ 40.7999999 238.100000 0] endobj 7455 0 obj [521 /XYZ 40.7999999 238.100000 0] endobj 7453 0 obj << /Type /Page /Parent 2 0 R /Contents 7456 0 R /Resources 7458 0 R /Annots 7459 0 R /MediaBox [0 0 595 842] >> endobj 7458 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7459 0 obj [ ] endobj 7456 0 obj << /Length 7457 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e¾D‘@À3cÈ!€árr¼Ù‹x‘Éò÷#µ¤žnR%–Hµº[3€§=QE²^¬úXüøÇo/þù[ññùÛŠïýÏçoV2ͺ¯¢ýþpþ aJ)ºµ©JaÛ¯âûÃ[ñvøzøÚüûvàúø`ÿ£i^ÑuøÛ÷_»—ºß|{þsóé…(þÔüï—â¯k~üÔ÷×þÁƒ±ºýðïî\˜æ?çŸÚÆþò»â׆sì·ý÷ƒ–ÜhcÑñvz”¿ÏE/kgÈ© ÎECgÕLÇÿqø¹éíDFi”䲕j>[­jV#šÏµì¿f½©ëlݾNy/òÆ;³«¥YeÓttœÇeCãLÕá®J«8¯Ûe˜½È¼é¬¶Œ[e [- ï²«SÖ÷ÄLÔSK_4¸fÖƒ%’„ž^!U7òæ±¥c?õµ¸'©u¢žZšø²Ñõ ‚{¢ ƒªD*aºZ>e•J5ù-MI„v”V*['†S_‹{ªE*5×Ò”FpOahí–å¬yâh-[fϺZÚ‘¨’åŽ"¾lhQéêk'N¼;qoŸ^¿p%Më³¾þÜPrt|»¯Íp«âCë9h[¼þTüž1ÁÿP¼þr°eee]už2½…+ÔÂdü3BÄ?#5ìí¤ ¿öÆ>ÖgB ì S-ጊ ¶Àgd7£Ÿ_~ÍÎ} û¯Ì}p+Œ¹¯#œß¿À÷08R¼ö˜‚5W¸±Š›Ñ/©³ð=&~µ6¿&Bï:r†¨jHÔ«¶°'B ìã÷PæöVÁÕØZc{[ð\§“ ÄB±N,ŒÇµ®´¨ÎБi\i¨Kf[½/Y§Ì¸(•»˜¸ [ºe®J) ¿ ‘i—ÆN‡éRp3E£÷,$MhH@ÇMjçYËüéó)qiyÍó Úµ™\‡°º(*¬’¡šà”¬¬±šÀ ÑæRÑìgÙõ˜‹–ùò#ȉXæÏÔ°…2@o ŠÍ´ÈÁg}Å¡…"Ö`c2¯„u¸R@W’\ÉÄ.+vê®(Ù¯œ9TŸS½®[kòmëF ¯ì¦æ˜ßë²[SË'àÉaµÞùSö‚Zz)‘Xܾ@kùŒZ*æÊE7¹\ýÏ!–CbÅì¹è-ΘìÂqyÔº—Pm2øŒG=œGoÑ{OdN0çD¼/“ª]¥h]Ch‘ªÅ“$>CJæ¯Næ‘÷¾QF]T‹N/({ùʻ٠xö ˜Zå2mn<…Epfì¸A}ðiÖð"¸.c`)ð("f<ÂÿÂàWÀíì‘SÄÁïÞcÂÞ¤ó²Rºåœ€èb·ʇßI )÷‡±yŸ¿Žž€zR‡·÷’ý‰+~÷%sñ¡o*˜c–¨Ehî2(Agl°vHª#TÇÞ^ï;<Šò›Ïˆ>­óíl¿›3¬ˆÛ´UóÊSË«l‹kåŠ )†7¿/ÙÁÚ¸#ˆ`{—S§.ÆâP}"x¬û$~v]\WÉ34Y„ªÒtYÅréÚˆ;Ò™E¿ßÒæ’¹£^jäNœ¹¿¢¦â•qæ°ú+¼Ø}a,`å1J„çÙOzZ€²p¥ Ê1%éB‹¡L´Ç%áB ð%žÝn3G¬—xª‘q(Œxv\Š¢¼‡›'($ ç' ؆B[̇s I3$› º¾ù!@×¢Zb°e²,ѵªø¥—Ъ×$U/Ò Iy!ðž«Cæ° Ú5Ù®É2h2ÂŒø {Px ñ–Т‚d« #=Å”r8. ,@ÐoÀºJ¹81{8Ø–NŠÔ¤ªô!yI1õ_•óÔºaŽz%^Õˆ¹tá=Jº <¹2Ð>J»%ltâdçÚ¡ÎøÄÏ*) sª¿º+ŽÇ4!´³òI7Ò·vðÓæË‘·•Xß(Ú n˜uyö¾S3›Œä@~z#ÒŸg¹:6Ïu¬iKpùWìá•Åq½iï%Oxk/å~d¿¸EDZkÏÖ—PoJ(·¶â­íäÙÓˆ-îôÉÖ›q÷ôAÚˆ=Þ„{ƒ˜a è¬|÷«bÈ—ë ß{E¥ÕÌ– ö=P‚y¯Éúþâµò­VêËWîùVš=ßó­”©ØŽjY¥<®÷fŠfî9a×(së(Ë[K‚ yÒ³x‹¼gÅ=+ViÏ)؃Ûw—{„“‰µu99óñ…;ßø®L0ž…ÂNiÖ0ВÖ!YaZU“t0k÷šY”QˆŸF?è8)™îÑÕN¡ÎDµsÓÖ•óÎǸ'jÛQìD°V].eã²îËÚH „ 7 àz†¿Ä÷†iŽûøÏ Å¡dÙÕ†:£ cIÎÊ.ªzÖbû¥’àž4]ÊãBù^½)•pß# Õøø<ÒÀx x¤ýÎf„6LA`<ƒX7„M¡B5Ï^¸Kqvº•×%›¡Ù"Âvø€66Nž[7DaÊÌ¥ÓDíÌ7%ðAÙôÊyã2ÛÙÙ[åÎGÞÃ%ž§GýBÞ)m~^ÆŒk„DA;‘=)}›_Âw )¸M£ø¤uW8°5ŒÐè¹)o’#P¤)wU”#–Ó›7B5’€L±Z3T¼L 7 ¼¨~oÁ)'4Ó×ä-©ŸæcXT Š’Âf ·¤È@oï‚<̧‚Â%jYb*"rÓ•M¢q èábò]>ðܵÀ XJ+ÆùNeLÚ&ÂWÀKE±t+Ù“i­æ—ÞKÂØÑ{€vÈÕŒ9žFeGÔèŒx …ïRWñ3WIñH$Lß‚“I$KaîîÜÍ=£BG^oâžÑkJÁÞ›§(v×ó Ã{—EФÀÅ@r“¢*1£®qÕ[}¬8ÃGqTŒ#à…¡Pøž¢ ß1†ÑTø>·¤Á¶•Åc½%»Ye¿±ó‹këãŠybÚxÆvã·ÎcŠï<¶>æš„KÝ:÷Jà’Ê]@I œñ{g0—Sø21÷aþOh™±ÂÖLÒ Ë ¥Ê=Öìxí1˜/ ´®ÞÃ2L±GX¿À|ŸtÚ N1Õö&K\ 4)øN¿twwOK­àõä¸w© I-ǽ¸BÊZR¬ IÒWòeÖÒ‘À÷3fùO?vaOSpµ4– ‹@)P ½×J'øKáó“V‘ÓxÉãÁVA¡iåÈØÊn]Ö n„3¶%aä˜è?åx?%=°ä!"2¦ø¨Ç:Çúk×.`.ÃG}±{@8¶ ATÜ‚o‡-[>"½@CeÔ6Z˜)m³nùþÝtfvˆ•vüöV9Qg\Ž @Öwº¦`·è ,zf»Ýmç$bë»Ù~$³Ý>£ž©p†ƒPE†’Ìí¢°Ö‘‹t{gH£:íÝ>î!ç9V»óeÆ‘$ì£L{x›»x>O½kW”Ìa©*‡±Òç (v0&*º¨çŒñT|Jl#Â’¤°kþs„FŽ«ê›*±s"xAIõE×-Îׄ¯;ËIÎÓq{-JÁäEñøÞ+ë­ãËóß¼À¿íµâÈ¿ gzqkáh=›Ç=Ó¯XÌØ{ÚŽ°€ëÚÏ¢:Á‡ðjs¼¦ú(ÝXoU<‡ô׌Ȃd.à¹î÷cožšë8~ÆrƒŸÁÒùZÀ™Ä-‘¾ =p ]ÀoÆ0]òÖ&]2ÞpG «ô-½ H¨ÿ‹¯‡ÿóf endstream endobj 7457 0 obj 3760 endobj 7461 0 obj [522 /XYZ 40.7999999 733.459999 0] endobj 7462 0 obj [522 /XYZ 40.7999999 733.459999 0] endobj 7463 0 obj << /Type /Annot /Subtype /Link /Rect [182.879999 743.060000 213.599999 750.740000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-3119/) >> >> endobj 7464 0 obj << /Type /Annot /Subtype /Link /Rect [276.959999 215.060000 303.839999 222.740000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://www.python.org/dev/peps/pep-0383/) >> >> endobj 7460 0 obj << /Type /Page /Parent 2 0 R /Contents 7465 0 R /Resources 7467 0 R /Annots 7468 0 R /MediaBox [0 0 595 842] >> endobj 7467 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7468 0 obj [ 7463 0 R 7464 0 R ] endobj 7465 0 obj << /Length 7466 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâCæá C€ ä°È!ðf,ìE&{ÈßÔ’ÚÝd¤X,²ÕvÛ€§ÝQÅb±XüêÁ÷þøý¿~ß¿úøŸýçùçÓÇ]]Õm=ýÙß~!M¥äô±3M%ûñÏþó×ÝÛþm÷º{þ}Û‰öðàüch\^1uøûçßvï§—ï¦o>>ýuøô¿½Üÿeøß¯ûŸþ>üøyîoü…¯;Ó·ã‡/Ó!…4ÃN?ÿÞýíûßÌ¡ßñßw­RµhI¡ãíø¨8ü=}½làP/T#÷BÈÎføö¿ÿÜý2ôv$£êµ]«»zu¯\ºí»vßtNŸÎÐÖõ$R;ÒµáéèÀ²¤‘‰ZwÞžÈ|oº‰[R'3~é*™_F01~¤H¤ má<îª2Z ÕÉFÓ0NAcŒ>wjþ3ô¶? ½o’™8÷”ÌľULÓ:P$’F¶Lì‰s.d­$Ï\{Jeá°3´<±Ìî‰u.D×Þ¹[N, çž’Y(™ö™E"idË\ÀžXçBÕzøÀ€Ä¡»JíH7 OG#E"mhËlந»µlÅ,s}:ÐcW©™Zðt4R$Ò†¶°Þéê•Å‚–ß,è7σŸvï_„Vf<0|úe äpê˜~|†Ûì߯œiöŸ~Þÿ±®ÕËŸöŸ~ÝõUÓ«®™Ž)SK­P‹|€ÏHØ"`Ë#j>óµ¨RÝÃgàHUÏQÃH曂#:~¤˜×5–Ø‚Çã¡Kj„à8§žÙÆ|Ãã!È(…×Ìò¥JMóóáÓ ÑÒôS”“®ÊI«~~¥ž&ÄT¦¯[Ùœ`š±¹ÝTJqþ«O‡m³ÅØÜèªÚáÓÄ ]é©á„·ø™>Ó¡–YZÛJ cõfSïŒ\¶ëG‰–lž`Š Oðx¸¥âyïŒË¡Þó><.üŒ3h<Å$’`‹V6IÎ\÷6O°ôAÒró‘ÒI¨ûƒ‚:Õ@Â1­Ä:Õ%Ö«.%•¥»¤@ºë¸ÍtmsÞ‚Ÿq§×ù‡Ðª>Wà„ ÑŽƒÇ¢ëj¤aéN¿ø²û˜Ív… H8g°xäÚc¹¿ôNÙN¯ì̹îí«Ãú9ÓŸ°¥^–]×X-â=#žã{“>ÓÃg¦­JȪí+ð‚ÁãÐ&æ5«*Þ5^L¥ç异‚YKu•²%¿G<¡÷5o@Ò^Y³‘$>4œ´¼Äó­†Ü©Ÿá{àx¤DÏPzóP ù†Çƒù¦zÈ(ž™Ãrç4Hu~SµË9Z>-Œr–Ò‹mZ%¤ØØÃ[õÌU–´¹Vxcîl“5ÈÇ¢sÁæ!‹B°r±åïp`>¼{8 5— {à 9l|–ãS8FpàIwÕ¥u—{‰Ê¶³Æ>KO‘™§Ã›d cÀ#¼€0F ÷žxÚ1Èãrr‹ŠêµÅwÝä¼·([ °XR  {?ðtoë-ÏQÑYKŽNÇ@&Àîu6|“U•ûÑz²·dE°æ5j1Pja™.¸%kpyl9¯Á{×zl*†€,à ¡g_OyR¤œ~=¬EB_ìNfç†U£Ûsñ\άqWõŒÖÅ|b<™¶Çň ŽÞ¹%ñL73î.fv~Û]Üý€ËE Øp¸Ó¾ ìËfõÊ>æakÈã"ÂÖnÁ½aç+6ñ­ˆÝJØy„y€˜6è|)(pŠW:,oØ Xo¼DXÎRˆ8^;‰ýÇ8Ô¤ˆå½.@ \ãÐêüFŒ·÷>ŒßÆYžc­ŒˆÙÙÔbÔúúÙǦnIÚ‹8L»‚!)˜kŸ+bf8Âú3«§ÀÃ`¼Ã'ò«£¬è–6oœMf½¼z„"¯A>SòêÕìCkÛd‚|ŠÁ™" › ½Å"¼Pvb4h©ÈŠ¶Í¢Û²žútcçðõxàŒñ½ g0–èÀ+ÊV¬j©Ô°0Ò„[VK=¤ÄäÖË™²‘ñ‚a.:¸¢Çv€9KŒò gä±Âbr„Ùçr+ÀÛŠÃÎÍ£#=~—õv¼G2œ€Ô¸ú8ä5–›—³0ç[ËdÅ#$:edÝ©)ÁÓ7ë§8æØ¼Þ²JRŒ¶’s5B^¼Û39Û;];ì%B’ ÿì{ScÚÕ{SŒi†)âåYÎC¾zòð{XÃô®åݾm±þÀµ8Ãm½"ò¶àŒ4J%ë ly²òpvÏa@Ç]p#á桯ŒBºÏS•€0 ž•Žóá±à•^r=+–Ø›lÁRAÉé§„¦yV-¤Zãj®SM°p5¡²‚§ë4} xø°ÄÝ$bÑbÄzöo²×™Ï¶}¯ÏEâRðXDt%­ Qû`3KJ¬IDè¥tgLÐh¡ ®,g’„˜ª4(b»O÷°ŸÜa?åÈu§ì !ÿa©…JÈdñœ¡7§„(ÉQ™-72˜B eò9âÄ ©… ŠkŒ{ö`’jØböàMš!Ù÷¢^hk/J²V8Šùd.£å@ÁÎx3Ûîég°ìgU9 r”púr[5JY‚í¥¶l·Ö@A¨^Öí±Ôk!8—ðBõ”+_<Á¬”pÖ0o c¨“vÇà:ä1m”«Œ<.Þªj—–Q}¯Wº~\œŒ–sÌÈÚ ¾²š¸ÈèD­Îß·Nî£÷€Qï¾YÊi$Å1&tfÇ%¸-ÅUÃxLåv+…ƒ¶(u ص>•˜§ÀrØ ÏO8’ÊcÅ‹ŽFà‹ #Ž:Y‹$¯ž$LN’ã‡PB†„XÁ•ùÚæb‘¤9Ùÿ(+?§Úo„¥÷yoÎsâ\¯,p}hæÚ,ž’ˆÝ$³³ï&A°8ñzÝ}uwgD8uR¥m×stîb÷¸²§Vù Á´ÆÞ"ÇQ+ίFØW„«…ñG%ñh)ŽS{u<ÚƒðÛ-ãÄ ƒ€’ʨ`l"ÛÀí¤ìÃü…rÙb$èêˆS 9ßRpø-£:ÒáÉ'hWEèî”bŠÁ3éÇrÌ€»kš"OPÇ›ÏÅ’ |ý¸iÖøð{ôXŠ-}SÑcYâG³†Kk£¡Ð©%ݬ“·"«Ÿ’Éd•Ánán>©õX¹­¶àªéç90eºkMo:¥ò-KÎH„kæ~yÔ±·àí8ieSw°™ÆÙ@Ö[¸×» ¢ t¤ÔÑ3_*³ƒCº+ $ðP€»Pž!J„01ÊÞÂbè=€,nN1äF¨rÃ9ë‚ ™jÚó nõ±×¯ÍHÉŠ§Tí…ò×&–Rð-¡š(¥Z‰'ØRPð^.Ëe(=æiBmQ¬‡(•-zÄ2<7sG•3ÓºcŠFîòˆ¹Ã9sáLÊzLs;M8®=÷˜…Áã0)÷’û»Â)Är»oHñ.\Ýàžoꞈí:ÌÊf½K¼³v‘«Wß _1S¬°BÑ7ƒ‘ùß|ÌÇ.í‘¥àvÒ¥M¼Hqže?/ëgØx\Ïy¡©ÅTï—Û¼ΈÃyå¨ Ĭ4¤@ÃØ4œ—ØàñÀÞ$~ÇÞbªq ŽèÆ4·ó¼S £>)¼öd^@ ðxðÌi<¶:ë«{kÅðž&òDu8ÖaÄ–Ä[,K­¨<þ¬’EGZ½$ƒ+€»áµë§_`ã ®Ç|à §û`— =°¼Œôµ:(}žûöð0Gx“:1Õl`ç .K* 8nRj¡`oBïÝ(¼…w£pèê%yÚ£“ž Ò£‹ïÃØ ¤ 2§h*9éIðÂ¥ VÜòÌyJCQJ‹Ü­»¦ÒÃ[hË%臔Ίg«/ÈùnñMói€+ÚkZ”†…)®LWD#Ï-„á ç2׌y’+×{=Ý4, ynÀㄊxîHºmR"à·ëjÚÞ-`7ä‡Ìê ––n¿š®Ý—k´ˆm Ø”@ÖGXnªÉW'8bý&ëJÔUÛ‰óܼH~f±QkaN¸eÃñ1+‚ì8%9¢³†Ôf¸X K°3––ÿNòûqpÄÍAØÆ¿e°¹íºÀ9´¹om[ÛÝ÷ö]ü:ㇿû·a-Km|ëüãóרl‹“DŽWïºö>T¦Ý‹7—"IzÑV9Û«cîîŒè¶mÕ^äïuåLë$5²«ºËk¼»Ð2 ‰R•ì/^OÙ4U;I¡=k—Þcà3=|fÒþ¬d­Æ¦o-°·ILN¿y†¿;KÐ…¾ gfcàR‹@㘵VÜ3óŒÅŒ}¦í°¤nü,Ñg[à9…r0Û‡—zkâ%döÅ^X sÙþU¼žUÚ¥7‡x'ÏxÝàgðj‡r-!'q‹g¤ÏHÁ"oÆÔm%Fóñ\ðfs-NTN2y_9õÿþu÷ãâj endstream endobj 7466 0 obj 4232 endobj 7470 0 obj [523 /XYZ 40.7999999 420.499999 0] endobj 7471 0 obj [523 /XYZ 40.7999999 420.499999 0] endobj 7469 0 obj << /Type /Page /Parent 2 0 R /Contents 7472 0 R /Resources 7474 0 R /Annots 7475 0 R /MediaBox [0 0 595 842] >> endobj 7474 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7475 0 obj [ ] endobj 7472 0 obj << /Length 7473 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨sË⢅@0@ìnÈ!@à ä0È!ðd&ătæ¿U‹¥ª&õqÉ¢ªÙÜe«H‘oç[>þùë?Ž¿ü~üøùëŽßäïÏ_mÓöíüs<ýùpýtl?c×Pqú9~û~x9¾žOÓß/Ò¿”¿¦‡çWÌþþí·ÃÇùå‡ù¾~þëôéGzüËô¯_?þ}úõ“œïô…ï‡Qô§ÿž?Jè8ýãúÓéá¿ûÃñ·i ãë¼§¿?ôŒSÁù¦u¼,CÉëŸë¡èe„ûñHÖÙMàøï??O³-ËhFÎhǧϢçCÛ#>Lþ8½i çW‰¡?’h/Òöë8ÕÆ‰XËâL4ÃqÛÖHËóTà„ §cp>äy›„÷ó6E»bËT['b¬‹3ÑiEdÛÖ$è SŤÆÆ>%\¦Ú:Q×Å:×±D †©‚)aèļM·nt™jëDãô+ÊD§‘m[;ƒO•e±(a™jãD¼q&z]Q$JÀS…R'¼‹$.Smˆ1g¢ÓŠâÈ}ª§(꽨o/†Ÿž¿>©)“zöüó´’W•wþõù„ž´Ÿá<æÁTÀÙà~ÚGÿU¼ê¿S<ëáNÿä¿gkGX·ÖðäZ€°6`Èðúäñy¢ÙäH·ÐYæÂŒ/üdzÁUüˆÿ â¦&Ž© à ®ÏÆ0ïÄOàl†1]¾aà¥`HJgŠcÝǺœ|¬++ˆÍ­¢ò1Šõ Q¸SVaÝ RmåŠV¾1 gÃÁ»ƒôŒÏŸ æË!ïa­ÿÙcz6èËX+À$^bK[ §`ÀË]Ó3–_üŸà†gÃ+€æÄ-ÏHÏ¢ßÀÿÔI –$>“îktQ5,3B86ÖŸ û؄˫9 1$h?!«†³u}6:c“ùf•›;ÊÙ` Ä”âÓÃc8JÜ6ø±î€µ6¬‰‡èš/á˜jC™ ÄQB ×FC<ß¹4+ȉ ÐÁxŸàÙàª#s¾‚)ËêÅÆ«Ž §R¼…T¿¸¼æ Òt¼§å\¶6ƒ}T¹Àsÿª¤ m¿iÕ3Ê©‚úû°×ócÌ¿ àpêóX«ìð~àlÁœ ¯ëXbc»Ê Ã{ðª¡T 5Ö¹ ÷ÁXÓÁÅûyL-+:BЉG¨øòN±0«Q}CÉhCv®¬ ` ÖŠwÁüÅž]`ãÁäñÒ<4¼,Ö#ˆ(]îxàË]ªú7ð1âð8zLBT=¬ÖYÁÖ“ ‡FºŸ «ÁÕCûÄ_µò›rÐæ1™¾†Ä€˜Ô8E ¨‹ð‚ál=8€ 8mEœ, €ÙãEK[=ƒý8.A³"äb?JÛí«˜`UÚ6€r(éèA@‰Y$4î¸j`ã1ôiz~ä2rÞ ™£mÒ‘Ag¹¡ÑzÈF G‹ÑOãrQE VOµ±ø,•„ŒŠ±AáTºFááÃÀ{Tåáxaîà×”Yˆfv”ñ1©´¯jû ÁwW—PlTÕfÅ" ¸û{°)Ÿ3û3Œ Ñ3B³‡B5c?i›~ o`/%kKÂcÎ×-éÞjËøÉ}˜¦wÐëÛŠá 1þìØ¸Å%U U˜ÝI°JAÂ3¡Té9Q¤JTDÐðû”žÓk–¤Ð¡W%8Àǔ‰*«ó±CNòOzíT2_¬ÄŸ)ŽnËmuÕmœõp&ãm%¾ð ˆÑpÓîü1À´|Šl¨‰ï)ñ—A1À `mÖ§ð¤1`Ý[‚à zUk‹êÊŠT¨ñ;M8x0ϸ1%iÌÌ$Ú†Lö dX’+qU†€ª1øŽÛµÇ>c>BjwbˆS»*.‹ÑŠË¸:“¡öÎZ°êh ;)Y\ÖX|‡Ô*ÃtŸ©êKUe«*[UÙ|ª¬¯aç:_Þ÷q=ßµöRÇãö;-&Nq ûp-Å›Ã-†@¸…ÔmͪËf× ¢Öª4T ¨UT] Ÿ–ÈyFhtþm¹mcý"Làm›î̈‘ÂèãÕÀù°QQr„s7Jz_WïÀ p-7ü$( , ‡SìOâtHü÷¸(L›W:&xà½PDĦpù¤âåÄm©ÀâÓXξµZ-bNÄ[x¬i’wÖKkŸ–ÔzêýN®væ²Ñ3ËÝÑæöÔ´O¦Í¢»àÔ^7åà[ŽÒ VŒÝm0Ƈ³†^ùeÙü²ö8lkÃ4<@Ø»’Ôn^míæªÿ×n^9»y±Žp+Dj7/“V\»yé¹vóšéŒo»k7¯|'\»y¥Ö.­žÚÍ+P³ªÝ¼L¾—›{rEŒeë ÖÅT€ËÛ*ímtZu…tT9¼™ÿž"ókw+onG‰B1)b1§–Wª×T_óqJå.C'Ê´Wê(&ZË?&®·Yñ¨£L܈ã$ELÊ Ú‹(¸³êqa7ˆ(¿qNf&ÞˆZŽ{ký)K÷í±W’-¸1CÂ?ì"ʹŠöúW·íeMúnsý¢Cãö².%&;ke£‚™xœŠ…v(&qµ”w“³§£wöÝ¥lתbãÞ܃1/ÆíÜÊc{›,œ]{…vD’>Å/«ƒÇaL áÈÝYÆí¼D\3dIþXÁ®^ê!–ìpy^'J+—Ugñ~P¼}îŦ½Pkéî*¨ºäêþÈàþ`b\G•¤²D;ë=yX<ºì1èÁêŒñб=n‰u oÞ•:g“Ù!"éy£.ÀÚ`½á÷ùÀÕã}XÁ…'¬§žì‘’¬¡ˆ%8F*f\~ù…Ä™ÑÒÔYJE×Äè°Äh†a°ç´ä”Š» ÿ»àž‡ÛÃGý°'Ðy¸±Ótµ7ÈBß}_í¤a®TÅó}'I¼évãæ¥“r_þäbiIhß iXâ}V' q{ßêZ»œb(ï5K!ÐA,U¸8k@ñhìí2%ŒZŠw§ t°®^[Œ ±ŸI^w¹¾¼›Ò¨†:ŸÜ~[̾žÚÂ8 äùÙA•­…±hÙÛ:…çhªTÈå6~²Áù}³ }Ñ +>™odbèKÄÊrLm½F%©?m1êÕ^N#Ht¹;‰Ý¾“j5Œ°Naù)6µ_ªj‡nm†Pm5êLF]æ^~ypLœûQí¶O&o «tRÓ=8ö±³ƒ¹vh¬-ÔT;4`PD‡FÞvÄ ‘Ú¡Ñî];4Öv:–®k‡F3^ÖkÈÚ¡1¾fU;4@Y%÷T䄞Ý#’dIw¾eQ—Y^œ\âšIs þ+ÕPýª¥g¥Lœl• Æ*\Šñ®ég$Wií=##à˜ÙhCÛ×–é—'Ÿàl3~^ÿÏü®+;ü‚ÆHæ¸ö„ }H–à7Fž˜ÏÞåÚ^ `Ö>ÓŽ ÖÓ&øL!Hª]›­óÇéÈ]¡™#ákÉm×Þlƒµ>cºÁc0µC¼¦’ø‰a§ˆHˆnÅ·qlû†œªº½E<)/½P…\J?ÅäÿǧÃÿù0 endstream endobj 7473 0 obj 3772 endobj 7477 0 obj [524 /XYZ 32.1599999 668.179999 0] endobj 7478 0 obj [524 /XYZ 32.1599999 668.179999 0] endobj 7479 0 obj [524 /XYZ 32.1599999 518.419999 0] endobj 7480 0 obj [524 /XYZ 32.1599999 449.299999 0] endobj 7481 0 obj [524 /XYZ 33.1199999 516.500000 0] endobj 7482 0 obj [524 /XYZ 33.1199999 447.379999 0] endobj 7483 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 623.060000 84 630.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 >> endobj 7484 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 614.419999 128.159999 622.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 >> endobj 7485 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 605.779999 149.280000 613.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 >> endobj 7486 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 597.139999 113.759999 604.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 >> endobj 7487 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 588.500000 137.759999 596.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions >> endobj 7488 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 579.860000 105.120000 587.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 >> endobj 7489 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 571.220000 110.879999 578.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 >> endobj 7490 0 obj << /Type /Annot /Subtype /Link /Rect [356.639999 545.300000 413.279999 552.980000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.r-project.org/) >> >> endobj 7476 0 obj << /Type /Page /Parent 2 0 R /Contents 7491 0 R /Resources 7493 0 R /Annots 7494 0 R /MediaBox [0 0 595 842] >> endobj 7493 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7494 0 obj [ 7483 0 R 7484 0 R 7485 0 R 7486 0 R 7487 0 R 7488 0 R 7489 0 R 7490 0 R ] endobj 7491 0 obj << /Length 7492 0 R /Filter /FlateDecode >> stream xœí]IË举ׯðy =Öj B ¿^9šnÈ!ä¾ÉdÒC:sÈß\–]¶äÇ–dɵt} ]U^´¼›ÞUúñOŸÿQýë÷êÇwŸÿS½ÚÏwŸOMÝȦÿ«ºo¦¨ªí¿¶JÔTwÕë×Ó·êÛéÓé“ùÿÛ‰Èó‹öÃܺèüýõ·Ó}ç§þÊçw1ßþWÑêÏæ×¯Õßþn>~²íu|=)-»/ÿî¿J¨2?¦ßº›¿œþúCõ›‚:·ÛýÿF2!š–îÇ·ñUrþ7}uf ¤9S¼"„šq Žÿþóô³imF­8#¬¥‚›ïZò¶JQó½eö/¨'ó¿íJ·ÒôD½Ž¼ù6µ·!ÁDž†ÎpÜ75Òðv½©Z4ÄPW«8üÒ‘êz‘0ˆoxuP7>„óv#éÆÌ¦Ĉù[èæÓ¶¼ˆÀEšÐ©4¡¯|‰NÁ=Œ”4-îáƒÈ…†JC¡¹@Z( ãh«é¨Z#Ç?ß$è•hò€Þièj W‚TÓQ‘›ýnª_Bàà®ûÉ(v=ŒèadÄ]Sü üÏÀ~ ÿZIû¿Ó²n±‚‘¯Aˆ^醶\4ZÁïÁ ž m¯r¶¾–Lló–ö꜂r§¡nDd×̬îŠ[ÊŠ f¬»<¸ZÚ BÖæ1$Î#ʃ ØRV\pž‹/†–vƒPL|Ñ(.`KYqaŒóL¸ZÚ B)Y&¤šåÁl)+.ZFÏ×bï̇–vƒPQ™§¡nDd×Ì\¸-è]^gpÑ‹klM¹|ùrúñ#áLužÀ/?›tO¼é?¾˜ÉŠêQd8i«/?UhJþX}ùõ¤k¡¼ïýéw‡w^Ðæ¼ƒßy? [# ö£akð5iá ï`èàQÓXÃù¬@çmüØ0~ð0¶–@;n+TÕãôÃÃ珖Ƀ¹v…Êak͇Èß0-3HcÓ?†nñiLÛ«€Ò*evâH>1Û“On‡OðÊû¤ÙÝs t?e©ÃäM?L9,ˆ¬'rBjÑ…3Ä ½j¥.zZà5ï‡íñP[7€‡x@#V!¸ôGp«x$nÄ›l•öŠšQE¨˜¶*`î #µRQáÁÓîá8ñÀi[/ËÄððœÀHe%^/°> e%Ö÷9ÿïÀKàùÀÖ(~ŽšaÀw(\}VFûapUÀ3娆ӥeÓÜ¡=_`‘âq§ÇjGð§âÉ?Yøà @Í2…KVúÁ£9aM°žŠåœÆÇóùPšëå.®W$bVÚu¨—ز¦D-RÜB#–ï †’WÃLžŽ±‚aá7âÌóö7ï^«Ü·™×3ï¸#1O±i+óy¼ž~9½ü0ƒ ñ`Bˆ“„KÕ›±-iÑzæ›Z¶dŽeWqñRÍy‰ š^Ï‹BBÚé…Y¶qq06'Æ—ˆƒIqæŠGæšE¿meøÅæÄÁèq0âõA|âèžbÓVæó¸2q05p/ƒ:w;p[Â3‚¨³°r×÷«¹éI8ÃŶŸË·pÕ}‰ã¦-5ÓFO/ìçAæ|"èŸîÒ°¹âñ‰¹f9Á¶2ü"s>ÍŸpíöa®x|ÂGΰ­Ìçqe>N¾Ï¹`U,‡>}e¾Rˆn) vïzÒÄ“DY­tkW³C;¤ÕÓ ûÙAµsvPj‰tã’ªn|vÐ#ØV†_휔\bcï;}˜+;tO±i+óy\™ô·4Fˆ[)d ½n¯9¾É‚‰Çúq”¿Ôcÿ·Ê¶›4réу­E©š^ØÍkª™›øªY2ñUãšøÝ—׺kRM[~ÍM|Õ,™øªqMüîŠËkç§Ø´•ù<®ËkŠŒ~Ô6äÑ4ÄáB|'‚’4>lX¦¸Æãh[‘ÑC!ÉôÂ~Ú¦s…¢KŠ®\Ê¡;ê{(ºk–zéÔC1ô1Ò6]òP(êz(º+mÓÁC1´2ŸÇ•i›ŽŠ­#¾äõ‡”Dƒ=ë&Ķ¢zT‘ØôB(i’v;E[d…cÕ~PqÇV?ÖnxWZ÷# ¢¹w•§{úz„–“ôúõ‚ÝØÿ‘ž44Ê˨)ù Q3.§4&P‘7uPè0žÆž’¦³m¤¬Fá‚{z©]%Sal¤ú"æW\äîLVo(ñšŒÝ£G¯Öᬸ]ŽáKÙðT¯˜•6AmOÜŸ^–Ô¹m%H¸ôŒ^/à}„v,õxd8œ4—rÇ—!óØ{È“;²U8…`O‰¦DË™ã¤B½\ZÅ\ –áÙŸp¹p żœ‚к1‘(Ãæž²»'.&F‘˜´-öhY ”ˆ¡×|‚ôKQÄ´Øp%ļ¨å{u“Á§o„í+à×Q!3‹‚+äTÙ:È(ŽñèïQ†vè\¾8Hð¥îI‰ö×Ï1•ÒIb6kÎV)¶KvŒl—‰Qô“R×A‚-¤%(KEÛ&†Ö¬Ã—1º!c²¼³ÒiÑ ‚Íð’…¢œºzB?EÂa›G|`¥,\kŠpƒ§ÐÒvÆ«þðWÈ”²¯èí*&óôF„¥ö<¦p..[a¼ˆ¡½pv¤ï³‰­ $ LIª‰Šp[‡ƒsÅYwT¦&Cœx%m{ÝG©n‘yIó¦8b ‚¬9Àï¤9Þ¼ "Ý+ç*»Ëʤ¹ò;óôL/š€Ä§˜8uŠ?.BG®--]‚d¹µÂþµÅO K„P i¥dÁìIκJʦ/1iy7³ÉáÁHÈ݉p·ûJ|Då·§—†C‚Oö[JL‹”]ž¾hÆR7û›Û:‘v’Œh®ÒJÊIÊâùÊëIŠIbcÿŸµÂ§}˜çío[m2›µn¬«6qFÒ=¥g­èyç´È2뛲ëß®)I 1]=y>iy9(•`´ÅXHPKòI‰ 9eœGkGEö§Y³û$×X7üVK’K6®T‘/¹ä(«†Vø´Qr ¹$¹„pû—\ÝSzÖŠž÷q€ä’c"ÔÌ}Ÿ–†êa‚ξ’vµ©n¯(ª)Õwž^¼ öª7;!“Gšï7ÍNë#&í]bzìÌêÏÖ»ê©çA&«?”4ïÑa?ÒótÇkvØfáѾCê­ à9Ê'ˆtìðÞöÃf _?öÞKBiO°6Ü)æ ÛZ;6­ Øš2|±"&é¶ÈFõONž‘”œðm.wجdÞæ¨÷¿æª¢i±³ñ_‚÷&sÈ‹Öb:+³;b™­$#Rزl¹¼Ç¼½™v³ä…´p4ø}Žv¶DpÛ5( I¶ów6O ´içZ:Óžn¸ræ>µŸÂ÷ïÇg`­œX GMñ†øL¯”3 áY xl >s*[|4€*èxî>‹BŸÝÀàìVNlÁ†'A¬œO¶Ä§•ÀÓ0úVN+Å‹ßÁóÁ£†‚Ïè{4,l ¼_†ª‘e‹$"Æì”7ó' mnaV8Ï1aÓ†k«JYа 'XäÊ™wqÈÏ›#ü&5?,õ>Û ¯éž+­¥è9w¹ŠÝ§.±Ò>³îÁ0w6c‰ùÓyÚ O¹qó˜+·ò¶o¾—S¨ÞE/) aŽd=_hO™þ®Âö» îDÁ÷öÁ¾†+Õ~¯!¿’‹ˆ¤Î*rx`Žy® ]‰ÝGdu…¯{¶—»OQ}«LròKÌ>);/ãb‡Íl߀-´²®1nYoðÛ»“SY†~ðf‚Hý*¸ (%ájŽüœjjÌÖYØâ7 õI6aé*Ó‰¦ÿì_Ê7¡r;rx;Ï·PPê§e—ûHfÛ=ËÛ{Hz†îÕ™øtß+æn#|Äõ3…mr'!|ô”B«´ŒW½ï:O}¯˜»ÓP£¾™¡Êl-ø =lèìöý±W Ä”è¦à³0H‚ßí Âê¬Uè%’p‹ÆáÜ%¢Lžïvè6â«ÇH}(½Š©;S÷ЍɈ {ÎzŠkž²ý2ÉcÛDhøvoÏè«/¸¸hʜťP 3Çá{W:åëOª¬“/³ÑGV'¥Â-6†¿a7{ÞyXJ‚ºG‹°¬Rr(n¦Ä-†v”¸åIÞaEœOr°²XP2¥qx­ÝúcþNñ”D¬±e zPÕîfÔ퇰§Ž2ƒ÷¸›Â³í(àD‚»1%‹+ü8¢‡ø”Ì3$·² P¸a¥ ¶p[JîÑÊÉbXÑ{‡ô+¼»æ‘ÙS’’9ŽžÙSÏì)tç™Fæ/\Œ|â£TÄyH"c ÒXæ¬&8j [ãXv>%aÄóÁwVà†yó™“÷ÌÉK]Ûm>¹V—H½}xÀA›ÔÝðvâ¾û%ü 0¯_ßÄL93=ËÎ×fû]n€µñ0ì%y~˜,)m)'‡;€b\›)GZmÛ<0^íªÛÉtÁnÞ„„ؤÍ÷¯àåZ9ëË=ÿù"%<:àº~ðÒIzþÒ—@ÖÛpÍšj°'”¥¾û¹ÁÉ=‰Ð;çPL±{¶WºÂŽÚn!tYo"ŽVZÁÇAõ9ö¹¾FβZ[B·!‡³ŸRdaDÔ׵ﶃ÷W;&¯AŒXQ²Ön<oû{€ÃÛ‰¼˜iŽ¢%¯ö¸ãh2Ž+AŸ%ö)c/#5Kˆî­x3ñL±ÇúSñØ-*„çÃb2˜ªpÜp…Þ0t0N1â;Ø{±@1¬óò)†ôÅ3ˆmŒŸ$ê…XH¢3Ãó¼×]á…䮊o S9M ÿ•C–ž²s›àØ6iìJR ÛÄ0†ïÊ;$^d–n'–Dà0aDÏpçVž*°”Z؈€_J¢NέŠn'jxW© ‰^E*¶VyÇMQ.^Š ¹>þbÀ˜U%.¼-þ]§¹å±âw‚ÏsöÄžPëáS¦ Þ[´¶‹5Ãs~bv˜”Ù™Õ7Ãцa»ìÇë×÷eCs‘ ŸV¥Ãê«›bEÉŠ˜i,äk"ëÞeÍè±ë¥±”µ\– š×~{î mÝ.‡pÛ…;=µ0VS½( „¨e—–úQð ßéETKkj¬-êy.µÖÓÚôÊ{ø¬åî…~DïXuréAó°¼÷ŽÅXÌÜíØÎ °ƒêºïTvÛV3Š¢ëµ¢ëÓZ¢xˆ[»¼-ú]()ÕÈšt–ÿ\Vì/u,àv*¹2J­êÓéÿ>›ÜÀ endstream endobj 7492 0 obj 4629 endobj 7496 0 obj [525 /XYZ 33.1199999 529.939999 0] endobj 7497 0 obj [525 /XYZ 32.1599999 372.499999 0] endobj 7498 0 obj [525 /XYZ 32.1599999 679.699999 0] endobj 7499 0 obj [525 /XYZ 32.1599999 372.499999 0] endobj 7500 0 obj [525 /XYZ 32.1599999 576.019999 0] endobj 7501 0 obj [525 /XYZ 33.1199999 677.779999 0] endobj 7502 0 obj [525 /XYZ 32.1599999 531.859999 0] endobj 7503 0 obj [525 /XYZ 33.1199999 574.099999 0] endobj 7504 0 obj [525 /XYZ 33.1199999 485.779999 0] endobj 7505 0 obj [525 /XYZ 32.1599999 487.699999 0] endobj 7506 0 obj [525 /XYZ 33.1199999 424.339999 0] endobj 7507 0 obj [525 /XYZ 32.1599999 426.259999 0] endobj 7508 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 327.379999 108.960000 335.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 >> endobj 7509 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 318.739999 151.199999 326.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 >> endobj 7510 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 310.099999 191.519999 317.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 >> endobj 7511 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 301.459999 194.399999 309.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 >> endobj 7512 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 292.819999 161.759999 300.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 >> endobj 7513 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 284.179999 143.519999 291.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 >> endobj 7514 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 275.539999 200.159999 283.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 >> endobj 7515 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 266.899999 222.240000 274.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 >> endobj 7516 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 258.259999 224.159999 265.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 >> endobj 7517 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 249.619999 160.800000 257.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 >> endobj 7518 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 240.979999 130.079999 248.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 >> endobj 7519 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 232.339999 132.959999 240.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 >> endobj 7520 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 223.699999 156 231.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 >> endobj 7521 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 215.060000 132.959999 222.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 >> endobj 7522 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 206.420000 128.159999 214.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 >> endobj 7523 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 197.779999 133.919999 205.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 >> endobj 7524 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 189.139999 139.679999 196.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 >> endobj 7525 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 180.499999 153.120000 188.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 >> endobj 7526 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 171.859999 186.719999 179.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 >> endobj 7527 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 163.219999 149.279999 170.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 >> endobj 7528 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 154.579999 155.039999 162.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 >> endobj 7529 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 145.939999 148.319999 153.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 >> endobj 7530 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 137.300000 222.239999 144.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 7531 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 128.660000 160.799999 136.340000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors >> endobj 7532 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 120.019999 159.839999 127.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators >> endobj 7533 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 111.379999 163.679999 119.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 >> endobj 7534 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 102.739999 228 110.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr >> endobj 7535 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 94.0999999 208.799999 101.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic >> endobj 7536 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 85.4599999 200.159999 93.1399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 >> endobj 7537 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 76.8199999 200.159999 84.5000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 >> endobj 7538 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 68.1800000 93.5999999 75.8600000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 >> endobj 7539 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 59.5400000 155.039999 67.2200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 >> endobj 7495 0 obj << /Type /Page /Parent 2 0 R /Contents 7540 0 R /Resources 7542 0 R /Annots 7543 0 R /MediaBox [0 0 595 842] >> endobj 7542 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7543 0 obj [ 7508 0 R 7509 0 R 7510 0 R 7511 0 R 7512 0 R 7513 0 R 7514 0 R 7515 0 R 7516 0 R 7517 0 R 7518 0 R 7519 0 R 7520 0 R 7521 0 R 7522 0 R 7523 0 R 7524 0 R 7525 0 R 7526 0 R 7527 0 R 7528 0 R 7529 0 R 7530 0 R 7531 0 R 7532 0 R 7533 0 R 7534 0 R 7535 0 R 7536 0 R 7537 0 R 7538 0 R 7539 0 R ] endobj 7540 0 obj << /Length 7541 0 R /Filter /FlateDecode >> stream xœí=[ÏÝ8nïçWœçæŒî (°I&úP H€>,úPdw;XL݇þýʶ|‘(Ú’,_¾™d€I-‹2ER$EQ?þÛçÿ~þÏ?Ÿ?¾ÿü¿Ï¯þï÷ŸäEþ<»ÿ~X˜yq6üSùb¶ûóüúíñëó×ǧÇ'÷ÿ_Tõ/ú¿ÜÃÅÐá?¿þýñã€ü1@>¿ÿ÷¯ÿ{²ç¿»_{þé¿Ü_öýu ¾=ŒUÝ?~þAeÆýXþ«{øóã?ÿðü»‚éûíþÿƒâJ»!ïǯӫ´ÿoù*†ÌQÈJëþM)sÿ“ŽÿøË㯮·i/£˜’Xƒþ;¢ÇeÌÓhö´ ß›ÙÝÛ“"†µé©Ý÷q„ÊÕžÝýôß9xL÷áT 7óD8f: ×ô 4Bñ3ÐH)Ï@£ þ5’PǵÚôßÙh47§¢2Ö=M'œ‡QŒº? 4Ÿ¶×ŒÂÌ+ [®(ì)žpUÉ×a= µ®GH£|Mè&2ÑÑÑT 3˜§‚ëÖøiT¬[Ë?ß‘ôF Ò„ôqGW‘Þƒ>—£¢w%ý~®OMàt·wd·ãˆnHsDG¼iŽ÷Ê ¾ÿu<ýKÜ6»k“öîËãǶs±¾üÕ­c½Ÿ6üõåÛÃ}Ï™KÅóËŸŸÿ✵?þëóËßÒùn†2Ù;væ°'ä}ÿDÌM?ö3·P€’¸EÜe=@¿ˆåZ’%ºŸÐàïÄÝŽ6c¥=€²—ˆšR…ÐŒ-M5ö‡èx$b‹j%Ÿ ¨W3Áø¬™þ‰z1j"¼èˆpr°©hÓ˜òàûˆ@g p2 þÁ-y{¾%/¥{D+lƒãÅ¿ó¤i}ÂãÏß…Žž>V߬ÎVºšþôÅ­¢­!JF‹ÈŠ ¢ãdÃÂCéK µÁ­³ºG pÏT@—¢¾2©8>t€´_±­ÄóµÞ ’  ~š™7Ç4¢0"«lÇüÕuümú-^ƧÒÝ_šR3@ÕS©—ôlùúPòE©eÆÐ©•zK®½ÿͺמñÛà Ý;ÑH\+ôbC??Þýá 6Þ(f\I†³/­¤ Â5ڒ݀嵇UqAŸ×VC èõ ³‘ý”-_5Ÿm?@Ï|ªá¶u#­Øq;ôrÛ¡`Bñ¥W¥Lp¡| )VPãF(´)6N` I½ø3î·‹O0ù,‹–:Œ†Šñ#gšrÔ°„ß¼Œ%ᲂ/8P pïülóé…kÈM,ŠmÄçXõžáÕåŽÒ mj”>¤›GŒkH“Ík+Þx¼ÆoOJ‹˜.}+4ڔ˪)ÇUö¶áP)YȪ™—ËUìE|@ÍP`ÍãÇô‡|µ–ù|íÇßcË·Ø“•ÅQ=£3§Ô&K"ß5«.P|‡¸?P!¥ÌWÝ'|î ¿Û\0QCkeî?ãA=|Ûl£Š¤ÀÀ;)P£8­¡Cd{ÌÅç#] ªb…•/êMhÚØ£(vñD;µ £†¤¢†Å‘HÑή•zKS´S›T´S뇃€hg×ʽØÇ ÑNs¿-pÀ Û¶gËË7dÈÞ0ª|]xëäðëJ÷€ž`UÄ× 0ïâ®aÜ·ã@¯Ìg¾½¥ï`•q¡µ!‰‰µMH'Ÿ‹«Ò`šì Åî±ÿÐÄ¥¢ËNÒ— ÝÑWFÇq ,êvÄ+O=y‡=ñäLV#?(up>ÀyÛŠ~Ãü{N51¤Ý¶Çj&òû‚Xµ ®ÌN|Ô‰)ÇG€‹ N|¡ÂG€óA…ØVy mMç»5ªë4ºáê»BN9º$¯Ðºb ûÝ-ˆ»·6±l¹µá~s¸µá 2Üvè!ÑÖÆÐJ½ˆ%¿µá~S¸µá à ñÖÆÐʽØÇá[—'MDÀ£XàhßÎpÉù°|ǤàÕ„  k_U$Ȭì{3·Ë8þžè¿+ÑϳyÓŒÇôÜ<5pL>DIž€Ç%§ L<¶øìã¡{%2^N.˽ƻoqhïûbñ}±(9>½k[¤»U(ñ•}ß#¶™«Ž¬îÙUÞqŒkea¾cýn[áö†Ë‘‰ãÊÄḚ̈v[ìÝ€ÚæÉD2ìK{bS!C””ÍßjbˆÿsÙÄFM|$ȹžñ‘.}í­èÓ“çN>¢OðwÞ¡ ³HíËšžÂó— 3Où‹¤ŸÇĽÀùÁ‰H=Áß!(žÛ„òøeœ” D8qã!pOS= ÂÊhµ&Oë}$ÅÇè—Ü#N ‚aÆí<-tûRÕÁ¦šTª|ë_ÃÏ.r¹ùv]¦&¾F´Hkrš¥íAÍCž»ÄÍ¥ü×å%|ªlÚ“*de7-Vs˜¶>?úÈ#2REk°v·íÓŸµ&~ð¦«è]¾"áçæj¢Ûiø5+Åæ±Ã’²A-VÂcŽCO²@QoŸàÙS@¥\êW¶&:Ðö<Ü]õd{ðÈX ¡ÑJq°µ¢ã>b*­†‹V”]¬–š¨Ý…µ§„LþzZr@'pñîØá7#zóƒn`²àžU¾¹[sÓ„Çf€zú ÎxQî«ÈêÂó°ð|"%'-SUj£ÂÛ<„t¸-ϧŠðg‡‚ª OÕ˜û âSPZ®Å>[Û‚{6%n Þ‘Çó&¶ +âœU̽'ê=JÇüJ$ÂKH¢n][¶(ˆÆÚê¬Ò kÐ#·Ëx¼½É­ÝƒwóKÊ:”¤I{Ò@¿oP¦¨Ø öÚîø¤B®XH㲤BFA“8ÛÌ“ŒT¸’9†&ã­¼ƒçÕÁ<<›->ž³kòñ,IÖŒÖoìðV¸Zê6öv‰“¬Üü­‡ª§í}áÛ¿¸á½Mr¹‘æ´Íû“Îi~ÀÌo_!54ü1BBh¤xð'%&\AªæŽÜŽªTèŠ3Ò×t´4œžîÔÔlÚ§ÀS(8tŒ–Ý´ÏK®‰Å'+¿PjÓ¹ÁW± ǤâläžûœÚè‘ò;ªÖŽ‚ù¬H ¿]>æÊâï-É­,8æÈZqX}e>óÏ–0Gæ·1-%»ŽâÅûÝ;.Ï.Ệh‘ê8œ+R„ÓR+  p¶ý=t*¦ÃÒÉ.9¨÷m ûÝsú®ä¬#þãíD9CX!õ¬Sp¼¯d”Çëãvº¹° ‚P³ð«ŽÛšm/|¸Œ&À¶«ù®§´…ƒ¹'õ·Äã(ˆ¿ŸcÌ®ÜÞ‹/¿àìIþÞt$J¬Çm{k´‰k¿co¶ÄÅ*Øñ¨¨o„^ùh{BåYF‹*œõB£%£j‚ïž¼÷ž[Ccu„?)0-ŠªŒ¹_ØÅމ'Wžì÷&€´g©v\5€`å bU|¢IŒ¡É¡ÿŠ-MØ«Éõ8ö2Æ]5›T5Ëwî.»×¸éVY›B;MB´oQΫÎ'Ä㎌å¹F(°HàYw59;ø Ì]ÁÑäû»ms§0ˆ`’Þxö{÷ÛŸ¿^Ú x€ÓôÌÁ{Ý·¼wØ(+ü{°&#X6ùÅÒ«8á¾6ëžòøÝæ|<´¤ß›KóÇoJ?Åp:ÞëUÄ´ úw/'ÖÁ^Æ!{Ñ—-¦×¯v'çùÝÊÍá„ÅZá»þÝ  Vx‹Š<U)mék¯”eÞÿöé›üÌÞ’,•“f›Ìå&µWÛž·,¨T$ª.øຣÖ=‰ñ%e^ ü±ù÷+¼Šןsÿ…èMYÐ÷‰Ó߯]M6pÁQ‚L•à Î1S‡ŠFɹ³¦9UCò½Ë=¥õ ¤uóÐÌBUÌ"÷+½}–>ÏÏx‚·Áí¨K{ŸÍµc¸»ÿnI-Ëw9Um494¹½åKT›;+šcØŽ…€h~æØòÐO‡Sz_?l.¢ñ[o*&fê=šŸ_Ô¨Ào%IÞ9þÛ|ø°wMè­mÁ«Ëå5I™Ë7ë«jÅ´õljhqÌíE‡øIGÏu“•îÐzãmŽ9²)]’a¿# ÓôìMç©81ïÈEĈxÙSü¢Iøèܺ6S×dÓ§m<úþ9ƒx.VIdkϾI[ÖÛîk»k[ ›Ô3½_dâwlŠîX¾÷Xß±UväÙª¢ååØÛ–öD2ðÍÔ–Î9gx)fm#¢,|h_ó|! úç?@¿\_¡ž(È^;Ÿ„Lòð¶ØA,˜Óëp„£W =}8_¯<5¸¸[Ÿ‡Ëø‹3V’D÷{²¬¢‡ÏÎ<­ÔO+™§Uóg׫0¯N³|›~Û—1ä©i÷—¦ŽÅ;¨¤OM^=ó¹Æòõ¡ì‹RËŒ¡#L™e/㯇kïëîµgô¶P1ùúˆFÒµâË^ÂïøúøùñîM(  ÍcuZÃ;œFòq‚ðtΦUoª tXW5žÞ}ö–ŸÖº§³ð\K•]~y|^çúîºñ®½Rc#@÷K÷ì6@Ý„ æ™r„|u/QϺs+vC–hº7<@öLw Ñ¿¦k%Ãndˆæg÷ýgó>õ—‚M·íâW‡æ4á9Û^aS92çü¿~û]&×v$ê)Ä<×±ͶFDlkdŠmŽùÉAÛö­HØ Y¢™ÙÖðÛÐ0ȶ}+v#C4—²í|Ïú;Ì¡©*Bò–/¢¬Ñî`¬pé(ùƒ/©šÝboî´Ûr×ÄQ»Xâ•t ÈÕ.–°P»XÂÚʼn}‰µËЊ„Ý%šI»XBÚÅР]†V2ìF†h®Ô.v¾T½å«KnÍRrUiõõµgsŽQ:[Æ-1“Œ€lg$’qFS2Îx,|d¼oEÂnÈÍ,ãÔ¦dÜ9u2Þ·’a72Ds©Œ39¾µ j2â*ÊÎVäåd¥ÜT(ØèÌu×°-ÙBÁM$ܦ„Â-«· …¢oEÂnÈÍ,\§„‚« WP(úV2ìF†h. 1†BV|®šë‰jÌê½ßbÕ„¸õ.o2¿]B&èÍü2 …X™ …X‡B:`~9…BænÈÍÌü2 ±2…tÀür …ÌÝÈ̯ͥ¦«¬ocõ]¿g´gCïàÊ*/HíÚŸ0–¯:Ôèïqi–€_"Ñ)ÞU°zTJão™ØU°ZGÿï*t0e–½Œ¿ÆèÑø›'v¬f» }+¾ì%üŽkwìt¹,~·!4ëjTÄ¡·ŒD…A ÌvÿJÍ·'ÂY9Ÿç\ u%(ßSÝõ¨0V À¯õáï±øcå¹›UÖŒ.·  ÛB³q\Î&ãrÄål".g縜 ãr6ŽËÙd\΂¸œMÄåì—³a\ÎÞ".gǸÜïl³*%Pî‚T¶‚›=ЫmW¢þùIÀ%7pÜ¡R 2k<`/)XœsÔhZ3i(³ì5µûŒ¥!è~Sh:(´‚=L™e/ã/²4µ“h:¨‰q‚C+¾ì%üŽK A7Š)ÐxHe“¦š?1U–ztâÜð¦>Ÿ®%FËd~’_û¡Á•q™†‰c§9nª—€LÃDÆM 7ÕŽ¯B‹¡‡D†‰oEÂnÈÍh˜8@"nê *FÃ@ÜÔ·’a72Ds¡aâÈÀ7Ùé¬{HËâ nèS(’²% ›Ÿ„ŠøI$B‘j㉠é[‘°²D3ó“H„"T4 é[ɰ¢¹”ŸäгBn{%a>ëÉ)³ª[³g@6ë)±žJdV9¨ŽyBÌ*ߊ„Ý%š™õT"³ÊA@2«|+v#C4—²žãVôfà·M0-(YÖäbfª:a†Ýs·H=ÚãL€l91,’“ˆE8¨ŒØ€X„oEÂnÈÍ,'&‹pPЀX„o%ÃndˆæR919B%¡ÃšmÖâ£ùiQѨd›³Å‘©íÊB¿åˆ#ÕÓI N—€lQ¶±k“^¬^¬Mx±vöbmèÅÚÈ‹¥&åÅR{±ˆ²™¼Ø¹¢¹T”­¼\”[dTåêT|*åu;¹Ï’-¹¼ÎHä>3’rŸÝçóúЊ„Ý%š‰×I¹ÏŒÄîs‰y}h%ÃndˆæJ^g”ŸÃëGßuƒ— BJ³´-_ž-ŒNÞ¹’K@¶°È;g,å3{çH›¼ó¹²D3KKyçŒÅÞyRÀ&ï|îF†h.•~–w^S/²Å…âmïU,fz>—¬ K@6Ó‹È‘g"åÈ3;ò0½˜ù¹²D33½H9òLÄŽ|L/&G~îF†h.ezq–#ßöèÞfxUõàM7O–{[¢Ûb÷­1BÑw¶ÏiZ¥ø}ªèâ$²PÑÉ9K_.ÙŠNE¡¦R¡™Îvˆ4‚¡™¡ »!K4³¢S©Ð Sqh¦ƒE§¦ÐÌÜ Ñ\ªèÔI¡™¶¼w} ä8_©i÷~HÙrb¢¸‡QJNL÷è @NÌ÷˜»!K4³œèT܃é8îÑA€œè)î1w#C4—ʉ9)îq°œ¬l4͸Y|…™9[,Ù2eãøŠMÅW8‰ã+$–©¡ »!K4³LÙd|Å‚øŠMÄWì_±a|ÅÞ!¾ÂÉYñT¦ªnD®¹ñ„7ƒ9@œLá×€‡œ|ž;§â)ÝÿøËãÝéüʘø•ÑMU¼«$ §kr LÁ>“ؾm¾"mè¾r¹Íâô,0tÐt בöÜ×! ¹ïvºc›|µœ HuL¾‚³h¾«ÒéÁ™ù5šn#˜¿ÑsÔ&bª':xz# ×*å2Šˆp™ŠˆpGD:°Jå™»!K4“UÊe*"Âeé ±U:´’a72Ds©U*3Î äÒ¯ÉÄÏäâžÞ o­Ü!ÂxÄÄ? J&®¸«±}SrÕ¾½J h9e¼H»4X•¹Áò¨§Óõµ„*6žKÌÕ–ØVª“‚w ê|œr¿Wþª¥UÄ¥ZíåÒ¡7ÁU)îwâªÍmtUJ‰kYt°¡ZÅØËø+¸*ÅýN\•â *ÆaÀU)C+¾ì%üŽkkYp;†WðBK«?ï,—Àí´“ÍÕk å’Êÿ$Îÿè ±=4´"a7d‰f²‡IåtŨb40ÿch%ÃndˆæJ{HÐ)ÿ£¢ˆPM)ÿck>Õ\ªWsúŒC ‚N¹#J,À|z|zþêæ¿¿g‹<ý__¿eéhq~Z½§lõÕí ÎÔ“ºa§Â–ª×Pœƒ“éòA9)õRiÚ:½¸¿L¿tÚ Õ‰'üsþbñícž¯åKÅ—iAß±è;Ã~f/F¢ ×Þ¡½ ,/@KµõÙ ‰/üˆ½ãÝ…ÔŠ}‡—“²wüŒ•|»[/A;¸®û7“Toζ·4Ëøç”èGŒã}凢3˜àœ›Pa¥ :s~=H<ÁßÁùÍ—°,¢äÊpEi¼2œúèØ¸D¥ÿžwåòƒÓ`Eêß7‘,gø¨íâ)¡ˆùÅ7…g³Årù©åJ÷üôøÕª7P endstream endobj 7541 0 obj 6476 endobj 7545 0 obj [526 /XYZ 40.7999999 94.1000000 0] endobj 7546 0 obj [526 /XYZ 32.1599999 171.860000 0] endobj 7547 0 obj [526 /XYZ 40.7999999 94.1000000 0] endobj 7548 0 obj [526 /XYZ 33.1199999 169.939999 0] endobj 7549 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 777.620000 159.839999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 >> endobj 7550 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 148.319999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 >> endobj 7551 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 160.799999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 >> endobj 7552 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 751.700000 155.039999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 >> endobj 7553 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 743.060000 128.159999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 >> endobj 7554 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 199.199999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 >> endobj 7555 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 173.279999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 >> endobj 7556 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 717.139999 160.799999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 >> endobj 7557 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 708.500000 156.959999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 >> endobj 7558 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 699.860000 100.319999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 7559 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 163.679999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 >> endobj 7560 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 682.580000 151.199999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope >> endobj 7561 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 673.940000 162.719999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap >> endobj 7562 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 665.300000 162.719999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap >> endobj 7563 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 656.659999 174.239999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps >> endobj 7564 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 648.019999 151.199999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 >> endobj 7565 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 639.379999 178.079999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap >> endobj 7566 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 630.740000 203.039999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap >> endobj 7567 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 622.100000 181.919999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap >> endobj 7568 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 613.460000 192.479999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap >> endobj 7569 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 604.820000 193.439999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap >> endobj 7570 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 596.179999 189.599999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap >> endobj 7571 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 587.540000 191.519999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ >> endobj 7572 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 578.899999 193.439999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ >> endobj 7573 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 570.259999 197.279999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap >> endobj 7574 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 561.620000 203.039999 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 7575 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 552.980000 187.680000 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap >> endobj 7576 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 544.340000 191.519999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ >> endobj 7577 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 535.700000 193.439999 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap >> endobj 7578 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 527.060000 195.359999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap >> endobj 7579 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 518.419999 199.199999 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap >> endobj 7580 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 509.780000 209.759999 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap >> endobj 7581 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 501.139999 174.239999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap >> endobj 7582 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 492.499999 190.560000 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap >> endobj 7583 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 483.859999 161.759999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 >> endobj 7584 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 475.219999 156 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 >> endobj 7585 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 466.579999 227.039999 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 >> endobj 7586 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 457.939999 227.039999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 >> endobj 7587 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 449.299999 199.199999 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 >> endobj 7588 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 440.659999 171.359999 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 >> endobj 7589 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 432.019999 162.719999 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 >> endobj 7590 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 423.379999 163.679999 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 >> endobj 7591 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 414.739999 217.439999 422.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 >> endobj 7592 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 406.099999 198.239999 413.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 >> endobj 7593 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 397.459999 154.079999 405.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 >> endobj 7594 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 388.819999 216.479999 396.499999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 >> endobj 7595 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 380.179999 216.479999 387.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 7596 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 371.539999 126.239999 379.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 >> endobj 7597 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 362.899999 157.919999 370.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 >> endobj 7598 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 354.259999 166.560000 361.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 >> endobj 7599 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 345.619999 214.560000 353.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 >> endobj 7600 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 336.979999 214.560000 344.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 >> endobj 7601 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 328.339999 214.560000 336.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 >> endobj 7602 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 319.699999 214.560000 327.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 >> endobj 7603 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 311.059999 239.519999 318.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 >> endobj 7604 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 302.419999 170.399999 310.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 >> endobj 7605 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 293.779999 122.400000 301.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 >> endobj 7606 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 285.139999 168.479999 292.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 7607 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 276.499999 204.959999 284.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 >> endobj 7608 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 267.859999 185.759999 275.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 >> endobj 7609 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 259.219999 136.800000 266.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 >> endobj 7610 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 250.579999 213.599999 258.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 >> endobj 7611 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 241.939999 158.879999 249.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 >> endobj 7612 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 233.300000 153.120000 240.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 >> endobj 7613 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 224.659999 152.159999 232.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 >> endobj 7614 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 216.019999 148.319999 223.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 >> endobj 7615 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 207.379999 213.599999 215.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 >> endobj 7616 0 obj << /Type /Annot /Subtype /Link /Rect [473.759999 112.339999 515.039999 120.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 7544 0 obj << /Type /Page /Parent 2 0 R /Contents 7617 0 R /Resources 7619 0 R /Annots 7620 0 R /MediaBox [0 0 595 842] >> endobj 7619 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7620 0 obj [ 7549 0 R 7550 0 R 7551 0 R 7552 0 R 7553 0 R 7554 0 R 7555 0 R 7556 0 R 7557 0 R 7558 0 R 7559 0 R 7560 0 R 7561 0 R 7562 0 R 7563 0 R 7564 0 R 7565 0 R 7566 0 R 7567 0 R 7568 0 R 7569 0 R 7570 0 R 7571 0 R 7572 0 R 7573 0 R 7574 0 R 7575 0 R 7576 0 R 7577 0 R 7578 0 R 7579 0 R 7580 0 R 7581 0 R 7582 0 R 7583 0 R 7584 0 R 7585 0 R 7586 0 R 7587 0 R 7588 0 R 7589 0 R 7590 0 R 7591 0 R 7592 0 R 7593 0 R 7594 0 R 7595 0 R 7596 0 R 7597 0 R 7598 0 R 7599 0 R 7600 0 R 7601 0 R 7602 0 R 7603 0 R 7604 0 R 7605 0 R 7606 0 R 7607 0 R 7608 0 R 7609 0 R 7610 0 R 7611 0 R 7612 0 R 7613 0 R 7614 0 R 7615 0 R 7616 0 R ] endobj 7617 0 obj << /Length 7618 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“ÃW𦻧 ø``0ø`ø`ôîz±ð,Ü»ÿ}‹zPd”HŠ™R=º€®ÊH*B#‚ŒŒàÿòëÝþû·?ÿú¿·oóïÏ¿¾;‘dúw³??ø¦ïœM* wfì¿Û·ß_¾ß¾¿üòòËðÿ÷*Ç ç_׋ˆ‰á?¾ýíåÇIøËDùõó¿ ýßÝþuøô×Ûüçðë3?Ûà÷m¤ýã¦?(£Lü¿ì—yù÷?Üþ6Ü‚ùÚÿ\>´9rßÝ¥tüñ/Í ÞQbx ”²á>aøëïzù³}ªC7Èüd7q‹o2¾<'P7)55G¶Ü^=J)I0:þœd}N6?ç,‰Y¥pr™íü_Ïy}Z ÒåõaF{}ƒ$zóåÒó^ßqíKuÂCÞ™t;:³È<å½eìíâš7ü[_àü©û;¼k9ÿËþ]¬SŠ™Áy‘xÃ;¦£³—ˆQÌÊ1œÞŒ’7Pí=r¢‡iÕ‰·ãå‘':@¥8å•tÕæTÀ803¸‘… ïZµàö·Õs êÂlÓqÎ3Q¾ Ñ;¥†i½¶"!⋱WÌa/¼a<ÃNj›±­ d¡˜¿ [¢‘-Ñ`šÃÖ7ó}ãÂO¿½üøÕØ)Ýo¾ç…ӯ߆7òöƒ½ >|üãíŸaôŸo¿ýõEßµ!’Á8“œ¾!?ßÀ0Ô4ü†ß¨;1\ñ¾¡râ¶6…‘ îbjé1áY&YöDd¹å¯ù<]³²Ÿn‰Š;£Z•=W^0Sø‰ñ+ˆß‰ ?ÿ6ÆÚÍ)zkì,:Sà¬7.² A7C "eABbÕ(‘­HȆøbV ˜%,h˜Ã`14¶ ±„l sª ½hÀ¤`”Ü¥ªD‘±ÖP•äõ«­0‹Úñ Åj+)R[ÉRj+Ö§©íØŠ„lˆ/fU[IRj ‹(‘Úª§Ž „bNUÛaV5wç§IŸ†»2PÛ}jòÌùfR5¹¨ú–7¯°±H£13’ ¯òNÊÍO*7j(ŸP:‡O°V|d¤Þ?k2Ú“¢³!Lö¢‡Y%™Í…,”o/ÒÌFEšÔ>—ùÓ,ch?Ö£1¡«í“…2Ê·t'¶÷¹„Ïa-òÓžn’ZL9üž{ø§lßGªl0`ÝÎ+ßcM(GÊï¬ïSEÌŒ. \eË­stƒ‚z¶„QL„ãþÀ¨Ðð¶Eh«³}mi³ÅÏ\–O*ôF¦üìJäl+îs Ÿã\„ÍÌ'ë3w%!x4[ÌS±6 õÌGq‘Cˆ&–Ø0£©çÿCUÃ=g&ߥ–d §1>¡tb !@SˆPŒhX žØN­HȆøbÜÄh ÑŠ KÁÛ©„l sæÄ˜3žØæ§•Õʲ5VD]å°…˜nžòe$(`òªýD –ÔUm¼Š†ç£:ݳÅÓu`K°ËAù„b§ÂÈ<òÇ ¥DN…;geC|1«Sá)8y,%r*Ü<+ÅœêT¸yLΩ\eôÚ°$N³ž`³Ÿ1áëîxžÇ¿òÙvÖÙ—ƒ8ð%\å„û„bË„C¤p(ŒCYJdYàp¨• ñŬ–) Æ¡,%²,±š8Ô*æT˹¯œyËÊ[Ç“†ø·1äÖZ Hi![’4È’IY’bXÅ‹-ilEB6ijZ’Ô)K’ ‹‘*¶¤±„l sª%©?z£ñâÆBav|Ùpy‘ÿf[¹©„1>á0:a@'A0&˜vY¸,ŸBt „AKÁ ÌØŠû\Âç8„1„‘9£ŠfF±4 ‡ˆcľã >¡Ô{K‚` IR°…$¶°ì½§V$dC|1Î{K’‚-$Á°…¥`ï=µ‚ „bÎôÞ’ºÞœ# Xz~U´ À¬ošCU,T "g¯ôâ’º šû„bKb(V—,«K†cuK‰,‰¹X}eC|1«%±T¬.ŽÕ-%²$æbõ• „bNµ$¦_ËŽ¬"okù)Z#dž¢\¡ÙºU# +´@!²©Y "[J¤ÐÂ…È+â‹YZ¤BdÉqˆl)‘BóUƒE"¯bNUhá¶j|É…Èûªã7=ãà×ìÿË­C¸°WSŸPl€Â^)Sa¯”8ìµ”È:¤ {W6ijZ¤Â^ 8ìµ”È:À…½+ÅœjÒm›øšƒf7Ô&L¶Ì­>LªÖ¤$ “’PgRJ!“R:eR#%ÐuMb“òlȱ!¾˜Õ¤”L™”,FAlRc+Ù@(æT“ÒKЛßÞ¹´€M-Ûk"(©"Â)›©%ÅË›a;Â+õ˜p>¡Ø. ÆL#0F`Y1bc&‰˜#0 ŒÀ¬ 1sŒ@¨>t!ï é±"4 hœ•Q6r”†Ÿ¿ÿéåÓÓU‚ Aî¨t vÅ—9€>º©¦YÉ“Ë+ɾNØ—6¾3·L¹Oè Ì\@'¸Üï·ôÞÆâ}ņ§òïC]ù2Ãå|Buêê b¿;l&JËt‹3ê:(‰„ (‰b»ÝÙ´¯? ÃË˦ï\• ó ”Qó (£ÙïÎxÓjöõæ#Ì.ÁþoÈzçÊhÜ~Z!|ÂqeÔä€&ÀǼ¬¿biâ®|BÅ¢#4Û#ú ¹“»Mc.Ô'tÐ4~@‹ý`†mÉùÈ÷M~Z)\È1¤ ¡ƒVÂB-÷CŽ8&ÈÏò¦¤îÄêä³Tû}h¥t±0ŸÐA+Õb»ö±;*7¬™å¯‰šrÔ?0èPM5 A½…ÐAMÍ¢³•D©’-cï‡b!Å2kTÂ}ÂqÅ2äQ‰¡QIÅúˆJ¶5ÍP•,„šÆ.•^°.Q‘á_®iù©b~—ðûP9!–·:¨œ¸@Èa` 9®Xó º¥ƒò[ÒNX—=ŒOè ò¡‡Qämhç‘ý-©«B…FBuÕAŒÖoB]OÇØß’Îk©€ÐAçÍùÑ‘úùˆ"¿^‘ [ˆð ‡U@z~Ø¢ 9'PQ†'ý6: Gí¢·¤`î˜ÎO(Ü:¯ SZB"¥ERZF Ú:?·"!â‹Y¶Î„DJË@,†G)-s+Ù@(æÄ­óÃkx u¢°Ç"¤yn±ù·äÉÕíÕúÈ•ÓTÚ'2Häœ T5¢œ“¹ Ù_Ìj8È9¨<åœÌ­ d¡˜S G.ÝÙTN³eÓ[ÅÖ¶¨6æ<®$òÕ¢ùn4u­Ù½èÖÐ.•E„u~¼6Üįm¤¹GÓ„lÎoKm”–kåK”X© %Ÿ\öQäº b&XÃ(Òb–¥¦µLÙÜA‚‚Oè`Zú a¡)(²ø¦UáÑ&öÞ\V¹i¹3Ó2½ÂmJ.nSêÂíì¹LMñåðu…Šol5«ÀÏ£0åKN£y¾Z2Ï…aùyæ\ײX÷¨+¯?!ÜŽÐA÷ØùË…šò7vBD¥o¡®Ò93Æ'tè_qþ‚›¦àÞLþD ®GÉ4¬ðµ k}=êJ*Ãúz!Q_o ¢úz##S+²!¾‡P™¨¯7Pi$&ª¯7·‚ „bÎD¨|õõ*¡Øc™°‚¢f$QAq ¢ Š#{¬© Ù_Ìê±L¢‚â@UØc™¨‚âÜ B6Š9Óc1â*(VÔÍ×kùúbï]}Xù&›xåâÁÅë*°­Kñ©Æídož•†ù³Sad ó…O(u*Œ¢÷á–RN…áwK‰œ s^deC|1Ω0šZpg/¸[ v*S+Ù@(æT§ÂökHÆca…–ö=Bõ M¹X…+-Ï$ó ÇÁÆ/Ž0ñœIå+‡ë£ÇÉž.ÑtøqöF·ö ŸÑ!æjÍsÃ}B±ß„1H¡C¶r$rÈ£CS+²!¾˜ÕïC b€Ñ!K‰ü>8the¡˜Sý>8tè .âçì5‘ád‡±< –_ä¨XC9/OâõìAȯ3=$ò/„]ÁÿÅEÁájbä²7–Ï,>æk Šð®‘‚ŽùiRû\–O  ¶|&ñ1_z<À,”! >ækjÅ}.ásœzÌ×p´Ë"P~TéF`–7¡Ùtûn~‡\SMœüD'Úo×’Pu°ÙЋî|>¡xB 1ºd’è’‰Ð%“@—ÌŠ.™]ZĬB—˜Æè’¥DíÐ¥• „bN˜ý 1º´›®Ô„2íŸ,þzl¼| r•øÏëJ­‚p’‚G8Åðˆ¥`«˜Z‘ ñÅ8«à$ØóÃ#S+Ù@(æL«àÔ—šôˆòE)ÖÉF~³Îõ\µ¹kZªÖd'îúŽ £Îß«€:«ãÔÁ/‹â÷‚_8»üÂ9ùPàW¥ÀGsÑÔ0{-gè:ØÉ âpî@m|B;ÈjàBØÉ{±úÓãìDd'¢WЇ ¤(p)?ìäÝØÉçÇÙ‰TÈNd¯|®.oÀµø°“wc'QÖT?;Ñ€ìD÷Êàæ¹‚|ØïÇN^1Ž÷ãdÄXšÓJ!?AQ%AS•Å•,C~S+²!¾ù šª¤ (®¤`)ò›ZAÈB1gB~‚‘ôa©!L(˜Ëp2Ê'^ .9nù, Ä‚K´xk)xØÒ¤ö¹,Ÿ–-'Ëg–X œF2h´@<¶â>—ð9Î] Ümkɧ´FeEùžŠj$yO°¿ #»U%å+vrí™lé®ànýu¶^—Ð$%4 H%4 À M–[àšV6ijŽ[Jh'4YJ4n‰u ‚ ¡isê¸ 2“/ïP³#ñ´äÓÝ£Þ»$]UÙÛ˜žØ]»>,À횘ö(-„b£“hׄP©]Bá]–r»&V6ijLíšïš°”Èè¤Û5±²PÌ©F§ rrælM6Ö5Ñ&_%£Ç‘–ù{å_²{¹})ù”‰–R"ÑñŒ~'ê¿nÉÊB9ÀIŸPìf4Ú†"tjŠ0xŠ¥DnƬ~EÛP1«›Ñ©m(Bãm(–¹í¶¡¬l sª›1 J–ßÞÜåü÷¼]æCÞxÛïsц9rZtÅ <ÉíÔZ°qçÌ0“9¼¥eŠñÀeð-Ÿe"V¢Qi)8Vµ4©}.Ë'bU "«á‘ Ūc+îs ŸãÜXhŠ5d\T̵ rõ[ªe•'åU d=“tK] öaÒ'”†ÀPê°Tê0œºd)x0œZ‘ ñŸÁX*u N]²<N­ d¡˜3C`úˆræÏ¿j2¬w“K+•6ΕÊßÀš;äS/hy%é+¦±•/X!ã’‹Çt`ë¶"劑@ˆˆâ#n–9"á·• ñŬŽH¤7àq³”ÈñÕóˆq[ÅœêˆÄ>âv^AÕŠ¢¯yS~nòn5¹|‰’yzñé‹Á‡–Ís>Q‡– ´ d -‰Ñ2K‰ F:´leC|1«Á@ -Àh™¥D-[Ù@(æTƒ‘âÌÆ"L 6^Žû<Dé’Œ$õ Åf¡º*…î€ÆèŽ¥DfáÙ ÐEÌj*…î€Â莥Df¡º³²PÌ©f¡Ýq’OžÐ¾ås@»ÌÐ>¡XÕ Ú\&µ¹ Þ\c)‘ª·¹feC|1«ª›Ôæ0xs¥DªnÜæš• „bÎTuIöU¯)¹yºÝåÜ‚¼>yK´4ÊãÌ…}Ú}=•Æ– -Ûšñ¨XíÝX}©P—Œf?ÒkŽøcÀò¹MÉì† ’ý$ÌØìîM«˜ î?oÅη³Šnµá$ã'¡Os-Yvå=Ü‚9ô9ü5 UW—¶²´Iñ´)ç)èÒ ¡Ø¥_Æåa¼ºçÕo_^xÓw*‘ßpY±ºÂïí=BèVb[ÆÏŠ”¶¼2Gr[ü|Ë&ÚWOõÀÖúœ¸u`¥å”‘-mÙÒ’cß•íb=Ðô91Èö£›ˆ²ëoñ¢ù B›žšÆZ3õ8 ^kÁpš6¿ŒêHV÷£ïu¸.“>¡*,û`E8VwÖ¥ ž /Å=W~ÜN“gë›}^GÇO‘w,…‰Z&3k&g.5õkÊSû-¹î]š.i›9JbÇ 7ñ`è,RÄŠœÔ.ðåiÉ×Tÿ-ÿªŸ22w:ܶ=qþ˜W¯ÙCYî æÖå×Ö”+ë¸[à‘#ƒdhhذ¸ý™~ÃÒªÚäZêTµ 6=Æ™ ŽyŒr…Ø8‹°Â¥=f ±Ç¸]° ¤Á§¶žIûÐF¤“_‡Œ€’Š ¬õn‹±Nÿ쩾ÍN€|µÑhxyŒ o«ý³³O ‹žñ´Ùòº¯l·x“GÖ75SÅ$M]–+¡àSÎHzï!ìË|eãW9Ž?kàb_³»D4=–Ç´¡ kÀ/7ÔiêšÒÕ„^>|Ì¡°>E~ðàÜ#´¨é².ËÌû°Æ³¢ý­ûÁj_¯%¹pÿ{–€¼Ú®º.YHÔ$Å™R†µâá³›¥Ô¡ç$Lî²  Ð7ó†ù^טÜ5sÚ+åw… º$Ú\†QÕ7|VåRå¯ùZÿ<„æ¸ÍÆ8ôfdü<“ÇûøYŽq•%+hÁ~[ÖµŽÌOžœ$S¾œñ˜Ê¯ûðÈÆ”z¿˜Åe–Sjö÷wX:ÎÀ:X5µ§—d6©q…,{ª7–¹¡Ä7ìSîç'âk~z´ÓâóÌx}¶‚# *âÑ„W¦qø¹}ž’ÊñÆç_ß~¯‚<¨á—Í7¶yéþôBÞèð ©—mìÑ^£ s‚ò]¥¼Ët:÷Ì—©»JÇÏ*ñÍԜߙInƒ¸ËÉÀpŸ¤äèì5&{ͤ͊ÝáÁ‘^³»Jq›´Ñ§|ɶG™Ä~Í]3{¿Ô74÷óYwÍÜc5Ï>ßÛh´ÎþÍ€ªÝÞž'›Uz0ûù*=˜' §_²:šíÁ9I¼ÙwžÕ”ü5š’ׇìólÜ[^W?wÑ­‰¼S;e cž$¥Cö¯>À/=ýóí——ÿ„´§ endstream endobj 7618 0 obj 6027 endobj 7622 0 obj [527 /XYZ 40.7999999 672.980000 0] endobj 7623 0 obj [527 /XYZ 40.7999999 582.740000 0] endobj 7624 0 obj [527 /XYZ 40.7999999 153.620000 0] endobj 7625 0 obj [527 /XYZ 40.7999999 672.980000 0] endobj 7626 0 obj [527 /XYZ 40.7999999 582.740000 0] endobj 7627 0 obj [527 /XYZ 40.7999999 153.620000 0] endobj 7628 0 obj << /Type /Annot /Subtype /Link /Rect [452.639999 171.859999 489.120000 179.539999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 7621 0 obj << /Type /Page /Parent 2 0 R /Contents 7629 0 R /Resources 7631 0 R /Annots 7632 0 R /MediaBox [0 0 595 842] >> endobj 7631 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7632 0 obj [ 7628 0 R ] endobj 7629 0 obj << /Length 7630 0 R /Filter /FlateDecode >> stream xœí]ÉŽ¹½×WÔÙ€RÉ%7À00ê– ø`@>Áh`yþ}gv²6²É’¹´JÔ¥f%“AccÄãÛ?úÇñ_¿ß>}úÏñ‹ùùôéPWu[ÏŽÓß7׿}¥äü±ë›JÓŸã—¯‡oÇo‡‡ã¿ß¢}yÐüO¯˜;üýËo‡·óËóo>=ýuüô¿£<þeüß/Çÿ>þøÉô7}áë¡Úéïó!…ìÇÿ\šÿ}øÛŽ¿Cè_úþ}ÓªAè¦MÇ·ó£âåïõ£èeã ý äQ9޳§ã¿ÿ<ü<övFÕ·²ÓM=ôðsÌ›:9¿J‡®=6ó‡Ü¸žDrG}—©#5Íz e¢Ö·§œk1ÔjȳçžR§p¨‡&SG㈲¬î)ëZÈQ^L„wîþ#R~ê)y •Ê´ÓˆDe§µ€=U½VBu²Ñãç¡Õ]Ýô½?wÊü‰{ÖÓkôøh?=eÈ·]%L¢é©Y0OOÓ˜R×C4Þž2í 3à¶îgÒ…N&þÜWrO™zšÆ$©3+‚»Ê´Eæ-Ý FùŽO%J‡sW© Råéh‘H#í$°pWù´G?Ú¹BΤ§°ÕUjGBæPfDÉ»c\oWùvÇø¥ ÖiÚüº«ÔŽtŸi9¦‰4ÒNËátõ1‹S$/NÑ7σï>Þ~Zõ“øùçq$/ŽäüãóHns|3Ùâ­>~þéøÇº–þtüüËa¨šAuÍìyÎ-B£–º‡--l`ËôÈ'Øl‘ïP‹‚£–Œ± ÜžÑ÷°å¶(؂ׯOX¹÷ŸGNNãË0å¸cÞLN‰èoY¢©”ìG‘{=…-j1 ¯/_ç´¿_[¿¨›ù‘JÏ$_ÍS[ÚèNÌ”ö6ÏôxÌB¾ü¢«jÀ×Úf QWm'úñËv>1úh>µ7s„[ÜîáH”C…†3€É±çÆÈ”¶’/Ä\O°³v¯ZÙdÅϸ³ÒîÒ;“gB:ô†V:Ã~óè9jÍÛ=‡Eª„¢»Í´J4¶Ôp–ÃYÁ!žuS¸îý+ØòGæujò¶{Øß»-!dk/H×Z:Ï•ÉxÏcíäû{h»`%„ÕGëÆ“A°D<6ÃÀZY1Ц³hŸ{P`©†÷-~ÓƒG ¥€,.ä ¬Ut¸Vg³P<ܤj[=¸©7‘fT7Ou£ïs`Ñwöö;¡&8ÒæØbvJåé…—Çôæè†‡¯½a_»‰ç¨x?™e%p°;Yð5ž¡Åói“Ì®Â{)è-SDDÆÀOð8ëHx aˆñÑ"ÊWã§Óå×âZe¨m[j©Èj‚ÄVIlg¬5&â[Ÿ ì|oÝÍðvÖ‰ã2ŠwöÊ9ŒÃh«¥9¾îÚ2‚®P} ‡e”Èê<>ƒpNp K)±âÚEâ-g¡AW~›tUöïsD(Ž×EéoGZ„^¢|rî,Þÿ0¡!ªF·7Ö§û°ô/dŽ3â×¶$¸o ž G¶b:&tD~Öy¯£á³ÏK±w¹DwÃÝ ë|„,z}KâP½¬ç Û ¨¥>mã®±ZÄŒgžá3zÆ0¢Ð'ðÒbx§Ò†{íio+õ²Pq-Ê,¯´-Mã³27\µ| ÓƒGpqŠì÷`J=ïy‚³ƒ)…ôà±azðØ8”šMvglâ=£78;ží¼Ó¢ÏØ–:…•Rœ3º\Ã5(þ=‚’Š—ò‹4‹ýూ8šÏžw’²¬}‘dØ'\?¢º7§ŒÓKHöØMŸVÊÉ e7y²Dq=dòª5g¡¹¢YØûu8ê,šp*F8x!hˆ0„ð=–ºxn.u„Vq†æÅ8îtƒÍ ÑÙJé\Ùa-á×Àgp-€éº>ÃI×]Sd÷½¾¿VEßÙ[ïĶ*%& ÷}D¯p¤7Ë*éƒôÎv §PxÅ{!T‹O“£°ÞTÃÞð3,ùöØÛ½½ß½+Ÿ8(XR|?2ÛM¶z§°µ­Ä…‡!¹<‡„˜c1r¶á{ð:bÉåáK,7°„„<æÁ™Áô,´Ÿñj+¼ÚÉÓƒŸ²3¯v}ðhnõ S`i‡µ+œQüŒ†ZÂã}Ãyc­œkÏìà±aK†1‚‡t9K—òE$ª;g{¬^D‚GàIÝŸL¨ª³ÓýßÁÞLYASÍqÂ+Jçå½W Á(X¬ðPxž¥ΛgÔxp®ñìÔŒüÌžò’gHi¨ì£|‰®OÀ›°…ˆ£ÉÍÕ¥çä¤}Žø3J|˜H'‚ƒwp:›7»/å(;õ"/[–)9wsµNr²&/Q×ÛÊcq,°2YY6ƒ(èy±d Uòxß8ò¯H™–ó¬+³ãyÍ£¸w ‹òì!ÌŽÁ4rNæ—gÊ ŸL¼¯ú¡n¹ƒݾz&T¼áìá NŽnù‚¡³ÕH ·¤$k)Ø È_çÙÍàx…²èpc/ÐÌ}û2,=kLÁ1ˆQãQ, å…e 䤸ûžŠ2@r„rä¥k ï[Q)SY¯#P·‹æóêþ8ÐÁŽ9‘=2u8üF(Õ*RŽîé•s‡!±Ph¿hÉë¸2`掀瞟ÉâsB|ƌϲÏ4ðD4ßÅHb¶°%æf /–±ÎJ–q(›uˈܲ‡>”ÊSŽìÏ!F][ªømr¥nŒ…;ÕøHíétÞœ§—½ýJÈ)^°ÉÆ€làR¯(…ÕÄìRÑU°®}÷nÖÚfoœ„“¹aúÏbåLŒ4b“UÒ«›`ƒf •¼(×­rj) ~ç¬Òyß:!ì’A?)-Ù¯œ„]¤´Tè9êÞˆævÁH±¸>Ӌɨ3È\ sr¬…ÁÏ`ÁºHÕÂy!Õ ºÛ£7ì)sÁE@x¹pÂ/¾þÁåòŒ€Ã˜ŒkLæÇŒ¹Ï %1=ê*ü°’»Óôý-ë•ww®^¹š»sƒ)œ·ö±÷ëPèyÏVº°mõ¼† '/j±µúlîî äá$—a‹¶Na‹Ö×B„wÃÖ§€Qkç©ÆÄÕdØPÄu€Ù PbrèÃßR>ý¨kΕãÙ…îê&¤‚0²–ºâ"KJÙ„¤ë+n#à²{âä9R³ ÅVáМH¦ç«ñ›+"2GµU H?¨•‚¤¾&‘pÃ:fà…0„“j¹b+ýŠÑô–î(|5ü¾ó&“.̈¯/pcòá|ͪ|X›`b„wž1ÐK÷0™Ãµð~¶Âwm.„Ë›5‹8þ½á”MÙ¥«*–=˜ß)GŠñUF…럓êY÷q0:4í¬–’ÑŒ,|©šñá:k¿?âT8R¨ÖšÝ¬ÎQTUÚ—`kdQŸŒ¼ª”Ëy¯ðu÷K‚l÷ò|õ5Þ\  þà&Æ'ħ”ïó”ÜC)NÒgLãÙñŒ€kôÀÓâD<£œ¤“lBGì­‚Ô­;®°âÃù08(¹\-RÚ·2H7Qöì |€áýP¼›>a‘rd‡—=pÑ ÉãÆ£å-Ãÿ½óÿÆ÷ðPŸßú\Ú7ÞÍМœ¸Á1á9ÎÕ^N°„pî¶-/ß{rÚ[ËúpZ3Þ̧µ½iÖª¹Y*è[²Äœ#[æˆ5²Ê¸âGv¾ùa¢uí})â;µtRàæoÈjž$7zWê&J (UÖ“g¡‰†THAIâ€íD@6ƃ<$çÓÎâ‰â=–ådxÇu„$¼ÐŒ À”»-V´¶º«ä‘]¢ûRÀârºTœ*Tç5”3dš´[9É-nýÆRøuC§‚¥Xâ cŠ-T™²ïŒ¦°kg.N»‡mšâ•å@%AލCVTI§¿×ÖVd¹†°ÅMwÉaY„KÎrHR6üÍíÝúý½d¸•QÛYÓªpè9),V6<ݶŽ,Ýe»çN­l‡í®±MÃph°'öp] %œ…“WeP¸BŒY€âSލé–N©Ý:IFb¦ÙÙ–qݶœ­ÛO¤œ`ËXEÿ¸|8‚‘gç¹øvŸ6Òë¥2b'¾lu _âëƒ!÷áÖ¥á83£½qÞyYã\N8•urfôµí™|ŽmÄžéÕcÏ<öÌNöŒÁ’‘3í¡:´ksñ®Â€×Ï{2ä±Í…g_sÏMòd³B>ÀôЧ‡ž…¬>¼ÚXVyø ÓƒŸQËiQŸ  w©Y<{Vnx$J¨rƒÆå¯L®{üFeÍ>ç`˺³ žõݬ©gF±ty—KFûÂÒ“€nNy`ŠS.6š'™Tázp…çN™à±/rõåÄ>ï©4›eæ»{Ñk<Á„©OI£p¢¹„ãÂ¥TR  çx˜ ‹p.ÞÄ”h||¦å@,á5I…+%S¤JŠýv°ä¾¹¡°¸Ö |&þ rL_+R”‘C‘$‡Æ©º CªIðÄ Ü”“äN` Ž@΋ÂIHÏ↥g.<µ‹+!½ºé³ ²òäZÑ K'Ü„°®~¡¬_¬è=ÔÊREI—‚æ(¹d•G_ æ¡cí³8R®›¦gYîÎ$lëÐÆ[ÀIît¢Ò·ß&l™ì}·¾„PÏ•ƒ1–¹\ºxZ#'ɹƒžãÅb€ò0nwÎë“Öt‡T-¬îÉ1$ॖ1Å 3‡y‹FåLDyH@^ÌP<εƒîl¸ž_NRúWVnM¸Á—·–ƒËTŸQL.§3¬EpkÖ¼WǤàÖâ—,8j»hD‰”â­Î`Ϧ”Yêó&ø§ :¡Œhýã1±ÔI£¬ûà0)X)%«a_Ú<¸¶f…ïA!@´Äó=å‡]I^O–Ê7‡àñ¶-ûµ›EÙ¹ù}Áö=^lmaÿ[ tpßH`w=Á ØkùX÷‡1ŒféΪK¥ßb‘íJ%x,MOÀ‘ßJ” Š;I@waÂ^ xq#àçßDiA*œ`n5öcÌM~͉„K öppæš3—¸{BÕos«KçfÆêËŒM„¿Ð=TÓ«¾†V\ÿâ×Ã'¶-£¦§!X‹±PÞGÊÝG g½eÌ>³lÄ8¦ba¸¼¼@áeÈ èb¸‹8glÖ¶¹ÔËþ¬oÅÀ€Zê“Þé«år Lü3RÀgôŒÉúªšC<ŽcÕUÊ–´T¥©¤ômŒQWsÃUËúØ.5TÎ3¸åŽàÉh--Jñ «Bæô˜ˆ÷hž±µhFMí@y©¡ÎEWJœ†é„ý‚.™m¸¢S\˱1 Ï+{{‚¯D‡Ÿ9±Jž, gcÄÌ­Áã$îg–”GüP÷ ÷“ÁýPjyÓû°…Ù@Šã¦Ôû¬9v«Ç-œC€=%øŸ9Ë~rZÖ%•I#÷¦MtßÕIÐ÷å‡hFq4Ž1°îIÇâ§Q;Ò8yJ.6wLžäÏ¬Õ ¬¬\‚ô^‹¥"®èÂ'†"-ƒù…‡×œÜŠ2²é‘'‚‚›ÎðkŽÎÀë)ùA8XG²á‰=9­0BZørû< å! ¸@ä@†C9¿'BNÒ=c:"¥s;U›9‘N7%.e­mv³Å¥‰å`å¶Š¸”²·^þJZïä¤çr¢öYjJ—ĤU—k87¯g½¥Ûƒbƒ‘o0† F±¨a¬[á9ô`ög‡Í3£øw²ë&yÒ1ƈÃ<ÊÀFò<0¢¦”s˽Eó^¿±P ðÊaŒRæF› µ,#£¤ÓÝÀöH;Ì/Yå`ÃÁ£ÄÒŽºYpµ´:ÓÀШ ¼˜Iþ{¸‚ Ì’¾ù‚‘éh¨ž9à >ì€ïÉ`Ðãá7Œ«[B’…ð¢%Æ¿Ço£:EýôóãËWRÞáUJãG¯jñ>Ž´G1’q¯Ví tTµ¾e÷¶­ÚûGƒ®œðÉÌl²«ºûQ¨îNËŒQª’ÃÝô馩ÚÙùµUÙ½÷ôð™>3 ªNV²VS“­îõ63 Öxï»&Vv‡Âè!¸×"&A{Ƭ…v3¶— ÀuÓgÙˆ.¸ÚÆ@"ñ $>0éww8^> endobj 7644 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7645 0 obj [ ] endobj 7642 0 obj << /Length 7643 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó“#RÔƒ€±@wW— 4¦ ŒÞ]/ž…Û{ðß·T’²2I}$#””UYLU§RÁx~ñë?ÿöŸ§ÿúÇé×/¿ýÏéÇüûËoOÕ¹j«éç4þ÷Ëõº?×zú³ë›³¶ãÏéÇïO?O?Ÿ¾=}þÿóIµ¯7Ë+¦þãÇߟ~^þ4}òÛ—þú¿“>ýËð¯¿þý?†_šŸ7~á÷§Þ¶ãÿ=ý¡´Òýðë¿Æ‹}ú·?œþ> ¡}îøÿ_ZSÕMo²Æñór«zýïúVô²á“ª2¦?)¥‡q6Ãrüþ2<í2ŒsojUwº1Ãß¶5]Õô½þîêù'éM_U›êd»ö¤Œÿ"o¾‰Ê}é™#RySS•éÂ:[£T7nCò&O£kšišM—;ÏåIÙ Ö*%ó qD*kfËÂÃ'ûVw¦©lÿN¯­êiâÊäNýò¨Ì©j8û"›1ŽHåMmÙ ü(I®4ð>ó:uÛä.âò¤ìÝЪ—yÐ8"•5³y3ð“†#0ÿÀ¿SÞÓ¿Î{µÞ8ˆ·’'PÕ­Ô–/OÊÞ)Ómù8"™-wŸôMDkÑoZËÏÀŸ¿?ýú¢LÝJÚ÷¿ yÕô¦_߇É6§_FñÝêÓ÷?þiP÷ê?ž¾ÿíÉžͤNWôgt¥ÒðJ®(ƒ®˜OðÊ |[`Ô_èc«#¨à|* GÀX7|Oõ^y†Oká=xø \ƒ®›‚«ƒéMã{:úþÖSüîRÃ=OÖ×ïÊã(°“AãÙÉh̓Y–°k›V7×S›®ôîy4.óhσ_%As6Ó ¯–eÚ˜î\y¤ñ}_îõÇÚ¹à±6h¬œùUp~þðCÜ™ë‰0”:7¦Ç’2zøxíÄ[i½œåsß7³’«§N±9׺W7d‰ (@x¥ñèñÓàLí®£·‘‘»”«*þ±ó7'útÕÁ“=ÿx+ðS1%S8C:eá¯ú4Ç¡,H?ºEgtóRȤVŽjø­ ˜%YÉw:ìí;g[;}Ÿ5Òä€/ ¿ÀmƒW楿: ÒÚKiiÝhëî’G*jZ½¬aàìg0ƒÀÙðNœË„l>ý}›ËÆiÐý¹·•£1M¤¢šeÔoW>!f0úÊèÍ´]ú<‘E° dÈ$Už‰uj¨ëbm[AK `+ÂÌT_ð”v]=¥ž,Ť 5–|bh>³å’"Õç˜Â³Õi‘£|´ÍÜmæpž€¾…™/Añò´GLž8€Ü8 s‹jÖ…2 jŠ”øXnu`sŒ41…2æX¨›œeÁÊ:AUᤧ³˜íÔói©Îm§n w¬ú«ûAÜx¨uÐ~¢œM û;öô‚§J÷{¬à ÖÉŠ8©8~³¨7.Koˆú%Êaå9GÃsGpNmÜå;«n&…²>TGz¤cÜ/ø.4³;°D| ³t‹nogŠ~,¢˜b××*4ÏóV7õë˜Sr õ¾¸)izíH³‹Ç‚^´3Ás„?{dÂÎvÕ‡ÒNtß«[’T¹júy#D‹®Tˤ»Æ¹ò†œK¿çMiõî±èžêrÀ¦]öö®=Ïkëɉ•÷î©g± =@ØD“ýÙÌr6aÔªEOÃï™ìÊLë®ãiªxü~V܆¸LÀBÅ=C7e©Í ÷çŽ;RÇã_éX3_¸0Ü@9h»¸¯Ów¾0‘Tœœ7VL§ézº~vç'ªãK sö“£•{ •¯ësÜñ±1ˆJh’%y|Û8L~7÷5…³q87GdìÖ*ð{ø|¶÷ù`™QÀ’ÁâX9ƒ £8Â& ë'ì§a1|Áxhñ˜æ6Ù E¡e­#CîZŸå`üE ýHKb-Šóž¾¸j2›Ÿõ—J8地6Þâ„éãþ¸—ˆ‘'˜g “‡e…1îX@¹œD;ÑHÝû°{Ó2Bžj÷ä=uã1B8.ã@.B蘮*³ø$c¬cœsŠ8o‚f@?U–5ö·zü¦øL<–pÏeõ[‚XãØ’éáåÍ厷÷oµ„Ì"„Ð(:!h#ESŸz‡Ëû¢†áƒbárò@2Vâ-*c~c®¨.‚\ pÙ¸çŽC/xwÕ $÷W` µ1­{ JPç6®Bð<â‡ôn©ÆÝå»önùÇÓc7ÃwRHÀˆàE⨢ªC¡Ò8Ê[™…·-®îx‡¬ˆŠ.‡õŠÉ“·DXÞ*KåJG ì"JxWäx,ü©\£Lâ^VìP\BɽK§N‚J}¼¸nŽo½,䘲óžµè-–=K“ÔÆÈ'L°eíqn*í0ÿûÁ'ñ‚›\¤˜Ý=0ÖŒ´- Z+#V™1¤ðÒ)ªs:Y9^iЕù˜• d¼Ö¥9\oj—Ãí•H~xæPp¬6Î6”±xXº:~4XÞúì«.~²d‹G-ü_x§˜Öm`(›ç†‹sB"VÉ&¾’5¬qØÄ‘s>[2m³ÄÑÞ\Lû'ŽÂR0'N¨êsç¦m~†O›–_5çÞÉ×ÕzÙCB &N•MP…óÁI „[ü´³ ³ Ææ­5¼õ|Nü$Ýú+}­ñÓiµvæYµ[6Lvç”XÁò˜>×׈L,Ž—¾›î{QïÚ—Š{FÂäÒ±¦RnAxå½jÁÇ‹HäylÜç‚P´n«œçŒ”¶÷P>©$Ó·ÃõKsšt”b*[7çG1ØfÞÝ”J®ï¬놵í«q¥BìWÇ­é°·rà Ûàôx¾§OÃW8#¨ðØ`4 ÆÑ ÆêÜAýKZK?1Ý=ád4MÎÉ€»µõ)HcG¶`üªÞèl~ZÆk€ç3_Ù†þ;ó ÿýgÒ¿ÂÒŸ|žu‰(E£ \BI€µ1¼¢ð=œµ6½vð|pýð¿ÅóÙHû]ãÝÆ4ŠçƒïC”$H {qrÞ¥”œÅàBø¤c‰©üÉ‚€^yÀ;[ƒ#ËCÎ.NÖ‡ÙÓÀŠbî²QN‹ªÌ.+€P> ÈnHšS¹5¾€½Œ2Qš|äqYi®ZëP‹,Ì6 b66íG«eÅÓ•õTëóú,ðûØÏÏ tJÊžhA+ìL´ p×òq+Õº'ß É˜'$[S–œ=W–³šÞ=û5æQP•©É.É0ÓËuhZã’÷ÓÜó8 nÎñ'q$]À]xò8f^2•Hw®´àÔ@¤cÀ·n8i C\0J9‰›vÙÁÒÊ@ ™&yùvËÃåÔŽéøÚ-O`®ü3RØk­Iat :TA¬*厳h†@ù¬Âþ‰¦MÞ¸hè äÆ-Ú>kãDrÏðF*×mŒ>ÍÁ zc‰”ꓨ.U¸—ín¥`9 h:¦­Ë¦)'0¿Â¦íhE¸Íz H0îÎqù‹z$<1|übäû5ù–¬Á™•;ñð5'\Iè†q¸™iEjí>šíí±+a"µñ_Ú›táhõ œz£–¶ªê/ zèðâ´¬ ˆ©2myr:²Ä+½Æ Šnn­$Ê*'­‰@O`¢½Aö&A#Br(«j}\€‰ÖeÉÉÐÛØ½Sׯ¦Â[2%è?;j7u˜»Œ«øà™ÀweSõΊ`,"íã{ÊWÄ–;ƒÃ)|X¸s”¡UÊ]<P^ `>0fÃÌ1„¢A0‚§L°`Ì8iúÿk¸nuqÿ· ýXdž£(ÅKZdÄÖ³p}©) Wð·#®ZÒFQ|ˆ¾ì{ðeô¸X ©¼®*ß²MKLgº$÷®Œú¾ðˆñã=Ç%S÷P>œÓqžÇ´äz€<°™œõͯUªqÀÐ$s Šu ‹ƒÃ9Ù­Œƒað%le<‚mö±‹×Y6·°)ˆ³9aW ‡ûaÚÀ´ÝŸªj8SL;ο'ÚIƒ„åäÔÀ£–s0$pÛDgÇáØŠÅܓ³ŸE:›XÒÝg¾;žý÷'mV£æ“gU·—*›Ó0•vûÕ'³~ؾÍíÙûŠu¾2^Q­»¼ª>דJúö¸zVb[¯Øt ¯|e<­‚÷¼D'4»yT·X)kЕ™ _øì®à,"®nš<ÝÙöÎ fÂ=YæµþgÊ*,Ú·‘ášVÞD8Ï÷&XSüxHÅø‚®øCšØ·6y”†é­¤®ÉVr ¢_=Ö¸ŸÌÕÙV&b4Bñ`ÀìO«/ ;ôÛfÅRŽ×…ƒ‘ŸNõZéÞ™77ËSÞ®Àê$ ]%.Þ‡÷B4@S6Ý#iEé('ëÔsòbOº3´öÖÙý`f_+c®¿ àÕ’¨‘¤\xpß=|~Îî¡JbØÖaÜœsÎIŒfè$ U»Ås6nHØHBtCÝ”¯c$rPvÉãS5|_:ðί¢TB'‚õ,œ5‘P'‚°9LR~1¥„YÉSE;¶º|¿ŠƒàX-GO›»8Œ<í_Ù½f'sªÚªŽB­/îÚ2mrŽX/­~®"²4œ¤y—’-¾v¸~?²Ò¿¼È©Uï° áÞÜE¤6¥+žÎî 30^¢œd¯z[[c ‡ø½i\P•a%è ùÒ»=ûZBF f\#-`”xr ˆ•eˆoä ߥzs×Gh<ª7K&¸<%ûv¯êÍ„Šxt.ääÇîîH;Jpb£Ö,¨d‘ªf‰ªñ Dœwwܸh©¼.™†Dò¬EÃ!þˆÊDð7.MCè)LPªwòÇÊqaäÞKhâœPIw»æÃª¶—šøŒº¸ÚFm‰9€ØÀذþ [‘`ù^~äæÃ܉Ÿ™±_ÇãÌ”93˜^Š€Õ·¡—ºyÐËû ÿg´oå¬[ !–’TÞ>5½uE›§¬m]™UG4Ço ‚»£~¬ZSØðá”pe@| –Wá`ÛûŒ5‰ ÿ²Ža‡1‹H7õDj0 XHIÖ][‡wo•N0',­¡îº%^Ü«Tó>²2DüØEKšžYÆ–ò>N`Ê[¤ôª³NIÀ™<3–P²Ÿeغ—®cÔ°{X¾4ù©!žÕ+­ÊvƒêÀN¥+Š\©§‚ˆXÆÃõôÏ/!²8l`6A›*Þoî¥W¬g¶&`Äç„S" “désJµà@…N¼ˆ½Àq6Ð+‹Ø…"·Þbá±BrÁ`š¸4 ûíÅUÝz\‰cUƵt‡Qø÷nÑl“Ô–Ñ©$´7¾’#¨r€ 9Ø®ôÔiÙž$e„¡m ×ÂÏ£+Y¼«ÞKÑW9š0Ò2í(5/î1YÌo¨ÃVzÅ\šqi ƒþ@²ˆJrßœ’Qgf@°>Yk™Þ 2'.’Oü0Rts è(ŒJmUV±j­{ šU!ÍŠ´¢ó•’ÍbšÚÝùx…\Û'Š:3Ó7ôy"sŠ5]åZ"‚€Ë?£ãÃÕtÙRò`NÙU=T2 ©¡X¼P^½Ùñ|† ÚÄWÐ g ÈÇšŽÈ§à1ËWê´ËcÊ–ßÏÄ•ˆ–gA³9e2™•ñôÁh O Ôiuƒ ê´^AuÚE팟¸È ×o™›§˜ëw,È NW+È N¹è£ñÔ]°@—§ØÛw”GuzéŸà¸Çƒ÷=°Al¸ß•möÔͲÜ­‹Žqbªe`6„tAÀ§JÆCE5<î%›’”WÆ•wM* a¢{‚¸—áæy^‚¦v«ÂÀ˜Ýþɵ_Ò‡&‘eX¤ƒåß hÕµ½ÕªMµ¦Uíj¼Ã'žV=~ËÜ<Å\¿ã¢U×ýšV]wî;†O<­zü–½yн}ÇZõ¥‰/®X^X³£ìÔ^ʩɨoRã-âå@Þ0ÃÚ†“ˆèåå<MwËÓš~§µ•ËoÚÊçií…‹-O1×ï¸ð´¦]ãiMã¾cøÄãiã·ìÍSìí;6ài­>*O+½VsO“·تÙ'ng©qT^ÙªÑq`l¸51~ŒÓ×0Jn`ëÐ@4¯l…jpÛd¼Ûp5£í,gu|Z *|¦ª@sY¼? ŒÆkà½O$‡ÃkØ]Ót»»O" 0¼]ðiduqM»Ò.;rך4üÖf<%%eï&C FŸžãèô˜â.×ùˆ§ ¨öj¿BÈ÷¢42Î*”¬Ö^)×d p!\ÃSUù±¢ªWÑ=­oÇI|Ë)¾S(†…¡qü„´1–”a–ç[°æÖ·`›5ß‚õ|™¶ó} ã·ÌÍSÌõ;.¾[¯ù¬ç“µÚ÷-Œß²7O±·ïØÀ·``ìGõ-\àaï>ìÝ×+ÍÞ-™¦j甽W —lLï[æk„žgT?ë]޹“j›åkK½ªo´¥^™m©WnùÔñW[zý–¹yй~Ç¢- ‹¸¢-õÊ-;~âjK¯ß²7O±·ï(¯-õjTÒÓ :1<ÍÀÌǃÏÝS²L:^W‘†BwP›ó’ÛXR'mz‡™jb|‚Ë!ZGƒ°–Ÿ¨WªlÁ·‡Ò¿Å)¤u 4rD‘lÓ0¼Žq¶—ž¿?—,ì‹õJÜ´¥i[™›†~l~ß÷Æá÷cKê-˜Ž¿dÙË„{eP–±Fá³Oè¤ˇ/!ëë%$rÉ(­V)k楛2eE¢ÙaÛÌ'Ù)éñ½=}–ºmÊ—š¤·Š ¬6gÅ$Ñä¬`A¶á¯æp\¬mqŽkF#E†v‡s7pkX¬¬à˜C}i”í§P`V5äytêÚ‡S×Ó¼ |éæ˜Ø•|¹gu¢ ORWH©S¯„¡L™ö‘»µÈ-ÿø0¨Ê¾1p ²ñŽ›—pû‚w%Âqv•#6Ò•¬ˆúEŸm§áÅð!† ½»¹Ç(V8ý=Ës¾±ÚÉ!†ÃŠ ^ÚýÇe÷[À±ÚÛÄø¾]KŒï;71~üăcuV{¿¼ãÇj×ãûÖMŒ?ñàXí’yн}Çp¬î’ÿ€cí À±p¬‚¸Í-d¯wä` lBÔAç;£$ð6ÝnMàÞtÛËs0p¨Ý绌eô§åíã]¨½«„Ãæ~bŠE“¯•Ë s L™¸ç™gP1òœvlw¤Šäa="Æ>&›ø‡&—ÂAâ½"p(è­çVž6œXÇq0íÎEöW”Èøž¢½G{Gð˜™ÐW9Îô;P½áð‰Öõò¹Ž{|æ¢5oÔb%™"v“½´¬#àû⺊—§k÷žŠ,!ž¶®¤( >+Âu7]U•«ø"c,,xOÝ÷9 ’™ Mì¤'rúá†%Þ´$Ìeâ{ÆÀ¢‰á÷o»ÏÃV„ûŠá¬ÓZÕ®¶Vµ^kU»ÒZÕ^Z«Ú›ÖªÖi­jW[«Z¯µª]i­j/H0{ÓZÕnØZÕ^Úæí^×¼°§æ05×'¡Ì®›y×Û ãÅÎe/ í§8æ/À(9¾›ƒ98 ›ÒC¨" 5‰÷±‚qHè^=w+ Så!@†Â/›ŽÁÀùp–\4'Æo{àqGωŸaÅc²¤XÀÌ-Z÷V;òE¤r‡ç*z($›*$¬„W?Ì?é( v”S-ÑÁ›àFÛ(ºb¯h‡P§Åaà«)%|Æ•¬Œ ‚i€'Kðå”×/¡Û¾îÐðßéç°ÃJ_˜ýø=É‹Rù^”oÁm Þ¥‡¾=©akŽh«ÚóTǧ®Ìí¢µí¹]Gó[sŠ¥îλhÓNw+W¦­ë³¶«æoÓœÛiwÜ-_{Oï±ðži«;}ÖÕk”ÓÝêµ§M4výÉ3üî¬<­ÌðÝ3¢µ+ Ícf½´{æ£Ì}ÛëÈ ºñoݨ.ºÛs8”Ds…*Ìaø5Ї{‹×o–T+Wæ6éi˜4^<ÓR<œ©†£®+ï,à7Bk<Ã~’¨–un¼›AûIÏpLOøùpý«ñ y+äîê Œ®ñl¥¬P'eÞþ¹GO›]ó+cšJårþ¯Ú³Ýþ·l³8u£¡j'§oOÿ2)‹b endstream endobj 7643 0 obj 7359 endobj 7647 0 obj [529 /XYZ 32.1599999 626.899999 0] endobj 7648 0 obj [529 /XYZ 40.7999999 582.740000 0] endobj 7649 0 obj [529 /XYZ 40.7999999 157.459999 0] endobj 7650 0 obj [529 /XYZ 33.1199999 624.980000 0] endobj 7651 0 obj [529 /XYZ 40.7999999 582.740000 0] endobj 7652 0 obj [529 /XYZ 40.7999999 157.459999 0] endobj 7646 0 obj << /Type /Page /Parent 2 0 R /Contents 7653 0 R /Resources 7655 0 R /Annots 7656 0 R /MediaBox [0 0 595 842] >> endobj 7655 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7656 0 obj [ ] endobj 7653 0 obj << /Length 7654 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâK¢€ €=cÈ!€a99Þl‚E¼ˆ³‡üý¨[Tw›ÔGñQd«g4xÚM‰zW±X|ûÇÏ?þó·ãÛ§Ïÿ9~5Ÿ>Ú¦íÚéçxú}sû×àÓÇ^«†§Ÿã×o‡ïÇï‡O‡Oã¿ß¬;¿hþŒóS‡¿}ýõðvü0}óùéÏã§ÿùñOãÿ~9þõo㟟L§¾ôÐ>ü{úÀ8ãzüÏí§Sã¿ùÝñ×q úÜïéß7dªgÚ·Jk>~î…ù ©çãP¼eýqè»#ß²rÖØUnGL4fÄò–ÆZÙû»jtÇ{©ÚAÃÏá3¹ä¼ôÞE{äÚçž²È{EÔÑ8#–µ²°§ææ~GŸ|™°•#_;à ’±þÄyÁ|=@vì KÕçsî)+ŠŠkO3bY+›Ñ {J†»Ò=Üçž²ÁÕIA„@ÝÁö” ÷^p"¸Ï=eƒ«×š¨£qF4p‡=%Ã]Ë–îsOÙà-0¢ŽdKwØ©J¤&ÂÅÜS.E;j5\œfDƒ Ø%.DÛK\\zÊÆ4 vž .pO©òHC¹ƒÊ]¥ â)iÊyF,ke3Üíž>‘¸¤üê’~÷¼øþËáíÇáä~ùyœÅ©ùÍôçË·Ã((ßœüÒ^¿ütü}Ûò8~ùå<»é‹–Ÿ¿è›v½š¢¦E[d#§†›–Þê„I»×§éÝëpÖÚïJ8ngËÎ_0>?0ž§{¼`g×Õ£Þp ÿ¸Ç¤h»3|ü9˜˜ý®;³p´¹Ô1ØOLdªÁ5ãÊKÎAAìyˆ?œ€]HؘÀÃðw³FÉNmž 8èÄ3ÂЛ:éÎt0·;èsÖç@À¡´Îhz÷×Qj–’Ú‚˜Ty8êœE{p ñá6K¸<’‚gÒ1 °üòÈ÷6‰Ø3ÓL†¦ïTçgy—Þ0€a°J¼®^—0á/#„Q„mÓõì‡G¹:@€ÒSŽâÇZ“«’"RJŠ5L×c‚8œ£÷))¼,µx4¥c¢Î.¨ ÆåZÚÀ &ƒ#€PÇ€ƒI¡D.mýødD±fàB‹ú€Zø{ÔÒ°em)dØ2~AfNà±ÇÀŠÂ£‚gpS\iû [%-›õT¡ ÖöÜ-à;(Bˆx`•€-ü‡T‘"ÇRdžQ>qÜ´6ƒ:”Ä»un€|W瑸VR¬Pñðõ@Sí¬èÿ1¥"Ö¯´˜K(ÆÂ؆tmz+îfûeÑ3pÝðwxx4&0}ŸP–´é,ÄSõx ŽÓÎa'a>ÄvÛ1p‡Iq€Â'@ã†ï*WÞ.qã û.™®nXÆDtpr@ÄÂSÕYV8Ù¸qCL)SÃÒˆ4ìŽÛ4°·C"Ä!•TJXš‚t+¨Œl/¼‰&;LÄX>;;îzÄ"R[`˜·•¸°mìÔ¥½éiÒ asã«.ïÑË÷Srr•Âãö¡5C\ˆ‘øÃ¦w‹]Jì~`÷Ï ÿxœw—38iðSÀYó„àÑë ¿rÅçQ7hà î7TPÔG.—@ÈÎ[â\p‹M¿Nb°¿1îlÞ¾}d°1€a×of[B4b…Žvµ†<«Ü­˜°ÇúYH;ªÇíž)Ôb¸ãvÊh˜AÛ½0ÔÒÆô¢Ñü\î6yǘãÊlu‹[\NÄ͹}£noiƒCPÂ&àÂZøÎÇâæø·´%²·)´›’œ”âQæ»VÕZRJqã>æ DvÊd;A¦”¹&œnˆYytÊ·'«Ãí,<ûF„15/Ô6 —æú>xà¤ü$Çì€8všHÃ[p1›D£ª´<=ØR!`"µ%¢c¤ŽåáètB>ññ¤u‰übÁwãì¤ä¿ã8'”¡¢8íT-Ÿ‹Bµ®Ÿ) ÏŽaL¼ÞˆpŠå‡·ßS ïÑUó$»³ì–­ø‚£ÓÛN?W¼ ¨¥ ±Wv ì ¿sÍÊqÞÐ;Æ7]¯[ªù=ê}˜iÔöw®Øñ„f6åΦ±¡ÚF,Ú&GyIÊ 8"|¤ˆàt]uP6FŘ´†³´p¾Ráày­åˆ¤!¦™‡ØÂÄÊ1:=Äå9Š—“’ÜA½]7ÚÝìI8`3^†Kü8û²E]¹Þ¼Ä×(sŽ«˜Êge6(6ܼŠ{™r¸Äl·¯ZãÒIñ®àVÒIË››JÒ–wXO!9zžãDsb,¾tɶÅvŠcT²! ÷äÌ­|`ÿÞJµ¶¥V°ì€G ‰AY‚ꎔ”Û·wy‹²ëÒ•ERоL¾v„K 0fÏ zå9uWNGì.Eìu”9sá”ÀÒÚq^Ã7¡#ÎkÜ]÷Ôh¡é’à”%T 0EÀÕ˱"¨$ãÄSÉš2ÜÖ;1b#ÂÎ)1µa¥RUJTðU»ùÌ7éñ‡ 1;©Z&© ï­‡SL¿‰g=¾J²)ª¶RXkÜ»ÿ’ §¦  JÛBh•]5›’çWÀñ½pÎ5rÉÒÖƒÌÝ%Cþ¥™ñ {O…¡”úÀUPð¡ .Á•0fà94„ƒ/ ¡œj• ºþ²[2@ÿg=ñ;Eq‘¦ÐEˆú¤#”ÉÉõUI» ýÚlÍ2eÞ_¶¿ô`W”Ó×^UXêÁÒ#+Ü„rU&¡žÙo)¨V•ê-x¬ ê˜E¯o¸W‰ûeü?Rç„@„îʹ¹!k¯"¢Î¾B!!ÔáÞiAì${†éÙ`ECÚ¶£ðÆbDb æžœJSµë>WU*üÒAd`ޤÆ\ÌÑá"R-†2¶«ËÞùUh‡{÷|¶'…)·ŠÆˆ©¥îìÞµ½«ˆw—ÔN½´àñ™Q…Î+í'È÷äÛ¹XЃôU#ųŠè’¥ÏèxÛÒ箢-ÚJá,í•B¢vD"²žË„#nŠvl_ÒFÉZ«¼Ã|ºy|×~/TûÕ^w³ùo¥x5‰{ª¸)e¼p€°2µ*p¯˜2±ìÂÆoxa¼€\uünJ RÖ3Y\w…š8»”Ý„v2mR¥L“;UsuîÀúFG@p«h jû%Ôƒ…ùUvitWFÚID”+¥ 6ˆ6u‰“´¥ÊÞ½avÝ’ŒñÃJLäL>É–Ù W$(3’}˜ÍÿKƒ‰å LP–=ºÆvÑ$f Û€k¡I }GÕR.ÆÆr´níÒœX©cñR³‰Ô—tèÚÈ¥ î à«P([ÐPNOðf¹ñÞgàu¦ô25X¤°''m5h̵´Ù¶¸ãfSëfÌÍ\8µŸÂ’·ê™!ꢭûžu³¥ŽK–SmÛc(>§#)é&…-±å¬Ä;º9ýT–ïVA.f\cU¥:wPÄ(<2æ βѦÿ>@LÐV¾Ç H‰ö“Ä ªÜÜýÖgÒœegûvÅë!Í®b«ô·¾OAø” b’Ò‡•³ð"è>`[àõ¥°Þ&Ò=„3ß#ogÕÛtÄÁm²ô }<•h]ð’§ì6>X$>4Òoym@-íŒ)C)ŽˆŠz‡=ÃwôŽ¡Þ“T±“§Ÿgž˜.ëuxb¡Å€n¤ÁˆÞ®gêºm†ò¸}+ð5Œc¯Ï€Õ:+%®e÷`.ùÝI[/°IšI›eãF¨& ·¯p¤(âdI€AIaâ–M ¸{D㑬ðõ½0i† ¹¦.Â;… ßþ=pEÓg¸%íÝ€(ÉéWWšb¿ê+„‚Ò¥]éƒOÊæ‹ýÐ}¤lé{fÁ°bm`!ôY{iåª`X^ïeV.Ú 1 áËq 8!_k¥°7«×rMåå–ÚtÙK@Àöb²cs¶Tv5l!œMw"Üb|ûÂ/J óâLÃM…Ã+ oÕðø{ü>v>¾{zÞüùúÍ3š;Íö:ÍOÞ‰z_]UvG6‚n鮈uS8ú(ÚËy0’ëšnyßl ØÉà}Ó/—ÐîZ&¾¢áÃb-!¥šnâ› –ÆÑð¾3y,=ox{Ž?ÚvÌRoÿÞ~ó Ÿ5A‘…~Dï¹·ÔÂÐ:Œ8{Ç`,fífngÈ ºÓg®X¿ŠmS.<Ž0í:PÎ;ÆnèXÓNMW1Ã`oƒ˜ÞÌ]“KôiÈÖZDëP"ä(LJ‡½™ÈÂÂ:¸FãxÞ™à¥t#¦`C@‹Æ ñæ®â[0ÿ`æïHøGë¶kØÉÖú‘‘Œ9²„JÌúV§ê³ã§ÃÿÆm…µ endstream endobj 7654 0 obj 4086 endobj 7658 0 obj [530 /XYZ 40.7999999 624.980000 0] endobj 7659 0 obj [530 /XYZ 40.7999999 156.500000 0] endobj 7660 0 obj [530 /XYZ 40.7999999 624.980000 0] endobj 7661 0 obj [530 /XYZ 40.7999999 156.500000 0] endobj 7657 0 obj << /Type /Page /Parent 2 0 R /Contents 7662 0 R /Resources 7664 0 R /Annots 7665 0 R /MediaBox [0 0 595 842] >> endobj 7664 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7665 0 obj [ ] endobj 7662 0 obj << /Length 7663 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`4|‹‚=3=rИrrf³ ™E:{ÈßlѲMê#Å%?ÚÝ@Ûmš%²X/ÖƒüøÇoßþó·íÇÏßþ³ýî_?Û°†Öÿlw¿N?¶‘¢ÛZÝ·ûÙ~ÿ±yÛ¾m^6/Ýß· 7ûŽþ¥k<<¢øÛ÷_7û‡oúO¾}þs÷î[±ýS÷ß/Û¿þ­{ùÉÃÛ}áÇÆ:³{óïþ \ØîŸÓw»Æmþò»í¯Ýìîîï£DkÕ¼q¼ ]ùþ÷´+zX÷ “ÊvCä¢û£;tü÷›Ÿ;hÃ0§8ojÙd¨­8€u­Ùr)# ÑÜ&‚š ÈpQÐg󦯙jÓ «$—­Ðj· »%ÐÖŠî}+ýOÉÔ¬µ¨¹€Z§+­k7¢JËA‘9Á1ÓOÓ±¹@ͤX-ÔïFÄçMí€z ª&'(®z ææbñjörÈnfUíFÄçMÍ/GTÕåPÌS"Ws'?€š Hs[ÐnD|ÞÔËAQ“2|ÍÖ GPsµ²­Èôøª  È¨·Ö3¼µs':€š H³–×AýnD|ÞÔ¨@½T±œÅÑr~Ktüôºùø•+iw…ן»‘ìwýËk7]½ýÐ).Íåöõ§íï»-‡ûÃöõ—k´“­î·'} ·¨… ØGÁ–OÚ3jplxRÂ>kÍB“¸l‘=Þž_;:Zœ*¤È϶$ð ×>1o¸Ž¿š€ëˆ[ÐàØü ¯³ZšÏY­Ï°)ç¹?‡²ŽbÞ­ˆùv‚¸3ÌWæÇö5ž©€¸NP,Æ5nY“Ê­;<õK­§:ðÈÎÚ=Ò¨Á,áûGÚÆv{l¡c5ÃuÃzì[žö-º‘Âòó>=épÞhel×)du\¯'øÕ~%U£úE9¡‹¶¼%z°'|Rh{˜çIßvúWŸN8î£à qŸh:_íך‹Ã§<ŽQDÈ1Á^ÌÖ`¢V"Š’“ôɼÄóÓø1"äM¡]8“p1kĤõ-XI±ÆÂ¹hºáÂIîåskô¹pâOp¢%PÐÈpÞ¢÷yéÕ—ùÕOð/`½“Xø–˜9‰²¤~â:ÄÂt²%IÚˆM$’Ÿe>ñ<]“DË.ëÍ#Ón§Êñˆ âÇ`‚€RG|¡O+1‹p¬ª÷å­1ãÌar_3¶sñh…XÁ©`< Û˹]÷*˜k;Þ=“£E{% ÷d OÓ—ò Å;…÷ Œà»H´À= é9ü¢ô+:z9' L¦^i´hì6ÂÈ"0 ƒÏј014‚¡.™'p-WRe#ØSqÏ‘ŸƒÎ;÷/éÆÅkÃo q“b€a»‡Fc>Ð7)à|8µ·ÖÖaüVd XñZãéãFéÍìcå!<Á‰ÂúŸ#rja«¿Õa „FêãPÙ—MÛoF´u÷äf%Â>½tЈ\Z¯á9kú.‘6æ™ddx¦^ruûwÓOuʨ›×c£&@ãÕØ'ãz¶ÆžË³n0!:äÜŠâ>‰Ú-çù¤qKÞ7œØ‡›Ôh‹ý%Þj;*vA'<êZ<ŠÃïñ üØx^Ó½ ‰pÁsÏ]ˆœðƒYž˜…ñ}5š î‹Ðx•"ÏOÄ:fz_Œé¾ñ6§ø£Îú/š™äS\ÞéÛò@5$"xÝG@fFÕÖñÊ{ïè$çvž2 ¸ 0'[à»_f§«àD€:râ z޼\%;©®T ½#e–e¶ sý‚šÃqn*±± ƒ ÄçS) UùõI™£îà„eľ˜¡v‹­FŠî’9Ü\$m!·‡µCŒpº¡BJ^Š„'!k*oþÆH¿TVXI‚ %{ r^È„(†©%SLA„<¸‰ÂDD]w??}㛘yÖW]Rð@–<ŒªÊF¤™5óIœtçˆ( 1'²´a,†ã0¦ã9¥…Rçƒsòq~}ÕLu<R®<޼áøa ã“Ïr!ÔJ‘DÿÄañD”3—©5öL£ø98ʉq ¡%fJ /íÖ‘iú°Ý’x…q´'oàˆ0泪܄ûLÿ˜^0pŠGn>ë¬pÛžÛÝEñ{ß²ÎH‡üÈ-R4UUhZÄóY±VU±cú¡ÄOumBÕÜZÌ÷¦ƒ®¢jT±!µðýP,ÖœXÛbZ—*£¦d´]1ýãl°UéÈ?Lhj•¦Æ3dË]Ö–H;uƒ!Ñ“Ø?QÂ¥TP_yŸ¢ÇDu6£KÇO}ßHÎVü>>«3媾wñŠÎ*Å[wŽx,Î×(~:Ï•?)î†ä£àQüäkNÈâý?ÝfÕÊÅOJðÁ»r«ÅOJH“ÇöCཱིâ§²¸M1€·}Á‰­<^bLæ˜ñ14ÂLžú ‡0«…Ò'%­Ï™k§¶*¿Q˜jÁn˜…YÜ›(LxÍnRrŒëº¢`g+ŒkÜ2@‚Ñð†E_¡p2?¼÷^Ä5Õä"O‹uhI˜&·«ŽdñP7¡ÖCõþµ ¼LØDZ}ŽÐ"Wyœ9ü³5sy‰ŒÓ'™Í9ŽyH´Ì)™q¶ä' W)À&&Ç…Q©¥.xzÜ+_~Sƒ/vÔ/©Ò€RÔ§2Æ¢beIi¯e(î¯Fr‘˜„ÀȉšŠéåÌjÀëuï¾5»´Ô. ÏôvwiG²xìÒnb—¶¸ÓNb¤¬îC(L’Õ™› 0õ!h­0{ãyã´œ8J̉ ×RˆqR7áz¦½T-.ÁÏI\íB(0K\Uƒ¡a¼a%H(Å bYuÔ :À²“@U‰²EBÉ^BƒÕ½ÀŽÂÛK¸&yPÒÒ’âiE¹Þš«Á<åRA’‘N0‘)æ.©T BÓ˜ÓßM!¶!õzE‡J9ýà™é<³|b·±;ó¢%‡gÞ—ë;(8{ô–Ž–Yô<Öe¥‘à< þºFtÖZþ6´“¹M8+Œp:Û2ð8nxN€G)Y*Š˜ŽB_=9)ŒEô XË׺ݶ®ÉG>|•ì×`þ%õ„1àkI6á¤ÜÇ '.nƒ¶Ð¬ŠËȺøq»·®ÆÑÊ‚³¥«hÇ|–È5´[gC¥q©€6¯vœKn—déÃ6/ºYuŽDZ&½ª“Ó%`¬˜)5àw®²KtÜ]˜\ë$D-sÇ,éÈÏé—°ÆÏ«q/í¢gP,»ûVB†R•^K„ñ`Kâ4< XÂu» ÊÒÜØàf¢ÜNCÉÄöRLÀGŠØu¤ˆ9á˜Ëûdì1h+ae†\“Ç¡Ž‹à÷ó}7Gä%\ã¸ÜŒ=MŒr†cx„Ü <ŸUyxˆ‘^Ç1t-Ÿ`¦½sÉœñ´Ã5;ØpmVºqáÐß›._.¸Ñvß‘^r3%¾ »o"7C+f†O82À‰u×-ï(8ò‘r»Îµœ ªÊµ ¶‡[=<{L"”[ØæÄ] d¡z¬Ntµª¿nþebËju­Bê¼i£nA>6"´Ýê…›ºÕq£¹;fÿHËÑ1 †õ?Ç%p¨…˜ Õa „†ûËË¢>õñÖ—MnñIŸOšg2ΚÞ.>iqžueè³ó.3ÓȽöŒeFÙs0´µö VésÞ9ûY>AƒûÐÎx°ëÀ-Á— ÷¤VµñJ¬•*™Xûú‘Ùvéû½ß—ì_(8!šN±_ý±=E'IL¸ÌyF.Ù•ÅV¡ñ»£™%@¦§è”ô%éþK§ÇMÈÚœ‘K”eUóIê þÎEt>ù¥fÊÇÒNÊ|’ŒË$"|„‹?³‘ÄeªõÉ*'¦ùŒ<»k×, °ÆˆÀžƒ•«iм Ù›è$&§UŽ˜îÕí¿DnÎ r£²3{Ÿ9>n¸ŠãôCQ¶Â„SNçÀÎM|i/å€jÂÙ=jÅkOÜp¿Å½Ñ >CŸÃñz¢PVĦ¸>”ótÇ ­xV‡kó9,7m´­ðj×ôâýq`‡p%=>Û"Aå8× B;Íê~·oivd·û‚ùþ#A«1‘³#‘¿$É<Ù5n2[ÞMc,Xí¸iúdƒ©ã!¦1ã{S§šÈ(éÙ\´MÚ¢ý´#-=yHÙ7z]¨ÖéœPÐŒ=ÇÂ>öéEP+ÁöQŸåÇ õvëé'_àw}€zd†_Q¯ÆZ8š‡W e}üŠ•ÌÝmÏ3¨n÷^èã]npµ½©PF˜v<è¨? Æð†õMGÑÂ!4¸‚˜Þ¼@£7HC>Éa¤E²ˆ!Ga:HP:„æ}#ó='ѧǗ¶‡ï„–Ž9â9Ì%Þ°)jÁüƒ9X> endobj 7673 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7674 0 obj [ ] endobj 7671 0 obj << /Length 7672 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`4âSèyÈ!@cÈ!È!˜Í&Xdéì!?r‹²Ý¤?>Ф,w»˜~ȤŠÅªb½ùþ_ÿ¾ÿçoû÷¿þgÿÝ~ÿøu×w½îç¯ýáß»ó?pÓ >ÿ8Õññðµÿþc÷´Ú=î§ÿŸvL?´ß¦‡Ë+æ ûþëîýüòÝü—¯ÿ<ýô¿=ßÿiúí—ý_ÿ6}ûÉÎwøÀõá‡Ï?0θ™~9ÿéðð_»¿ünÿë‚yž÷ðÿ;-Å8jSÇÓq({þw>½lúK/§_öŒñ N5¡ã¿ÿØý<Ív£%cƒ–CŸ<ëÀÓ#÷ã0MmŒ7©·¶Ä© 'RýÀªLô +[ë垪3R01p%ÛpØe Ÿ~„ýÊX:ã|^ú4ª‹Ç©J':¬¬ÊDˆXÙÒìv¦¢r‚Z=/sð¹+sËLÅ“²¯3Ñ"V´²ñp¦ªl GVi/–™ŠQ¨´®´©#«´p&2èqfõQ•®r™©]Ã$r«Lt€ˆ­lÁ;œ©*Ëü¼K—n*É=ƒu6ã+[Ú²x**h¦ìÑ9ö¥;NU:‘uÙ3D¬liõ©È¨—ÚʾT¦*Hé:Tÿ +[Ú‚zoªÇ*¶ ?Ù*O¾íÞaR˜ƒiöíç ’gûnþömZ®Ú¿;(òlúí§ýïû^|ùÃþÛ/»±S£ÔlÎOøˆžôÐfàü„Ã'Ÿ ï³1¹Ý•’`cùxë? àl‚Þm¸žlŒÊ‚ïtØmˆküžr#¦Ä…à]€ïÁØó{>›$Zsù4©3ÛçÍÂVW>1H/ó3–U¹‰kH/p¶z”42š4ϱž/¯œ… ë;=03ãnÈÐõÞ¢íÞÉË›˜5†Ïb&±|«:Á ãÊ—)òô‡ycäòº³j÷}îXÖ»Ÿ˜©VwüEI ΀È$Ipg•ŸÑ¬ø‰š‹6V؆ÇdlNÆ–+8«‡`w,fĘÄ~bŒ)õR`=¡Â'k¹ýŠúd ì \´P(õKOˆë¶£5"Œ‹Ê“ƒæ{1<7•gígø„°¡NqHb¯BUï4ßኑ„A£¸ý0HqÚ§…]x€0â1‹4˜l‚—<Ÿä¸¿ÜåäøSÓ GJH}pG=×I†—e{Èð@VñxRh;°PF{ÎóÎØ“-Ʀ^ÄÁ9=ð’„çˆó èV ˆ!ìÞ%ˆ. A\ 1O"ãÝ…@<«Ué˶fÈÄG–EòýŒ`³Ú’{GÏÅÔ²àÓ“8ýI/t”š"”TÕ¬’w¢bÆHžàŽÌÅX±SÉ»_YÎz+~€ä@Pk|—~ÖÅY4€ŠôsÒ{ å4 Œi~™Q¹g»$O­•œÀž˜¡0³Ã}HР°˜sט¹$¬žqØÒ?r,Zª¹Œb´TqJ) 9c‰›¡y¤on”§ï'ò+>‘ëæQPŽŒ­Mÿ¨Ÿ2Óü|Œ¹ò!а;¤M2Ù­’ÙŽI¥@4Û|ºUÂb\Ò|ŽY『uR’ÙaØ‡á ŽÁã°a=ø ŽˆâH嚉ܒ-ЬÀ)ÑxÝ8B ÷1® !¸Ñ¾:ÏT^é Ñ{å°ÄIål±TI×öÏ3,Ý3Çøøªš©šå˜}’×Oƒ@ΤqvÜ*þg ¸¼ÑY‡´øäªC}Dõqfûs¨ÃWËã€IVõ;C˜§W &rèÂóîÄ¿7Vð3½¶p†±õVçXÂkXˆ¾÷ ›Œåhly¾ðÁåž«…ìÓC†§$¸”Qê‘aåÕµ­ \Ù‹lêZ¤XlÂBTüž:Æ[÷Ôyã…e©,£.`î²Uão&Ë“R |›•˜Èªî6‡x³bx'—„†kï±³cc;50•Ä•ÄOpÿ¼,d1Ïà‚|hTu«„,Æη&”àã1½MÉëÆP³æŠ÷ìØQãÑi£x0"×–é•vàáà9ÔdìIC„ÚêËÓn*]9Ã^®a°Ì$˜›H7÷Œƒ O %±ÎÛHŠ;…Rø^ƒ â†ZÕ%Éc[1&æˆ@ˬ„VS³°øwåÿ ¾žÞ‘›Iâª×0 Rb¥…³øk–Xá1°Äª?²dzQ.}:•h¸³õ¸\ _ÁÙà‚­µ‚kúÔaƒU.oxÀåèE ª&\Þ‰I¨HÇçkwá¶éd BýНPel5f7JXŠ‚á‚,ëÇQcœÒò°„sZ\½þ—êÖéZ¶REnNÅqºi—È÷RÔ†ñ˜QúÓ¦ˆ¡n(·j8¾å¼Eµ­†8oÝG´ –§ff\ËR*m\«ãv*|*%ÒUI!¼»'ô¯™”1œª)]ý ÍË]À)ý´a;+&@@‰òc¨Åн>©ãXÄOp‘Þaœ޳5pRœ €ã±ó”^ê›è£?è¥NKàekùÿÌÁa\ÑlJ?ÃÞœÿjöõ1ÛJålÇ·"r›fÈ+gÕôümÏ‹×Ø×úºâß„k0 Y¤µ¯|‘Ê}'b¢Æk×ìòÚ/ÉÎj5T+Æ=Õ¯„c\¬<4_ûè¾³…µq"/ãí*Ô¤¤‹Ñ¸#êh nGÓµï娾T., wIËðJ6WĆž»ÄT㪣„rÃ6-N¯̼§`NqfA«&Å’ÂBx9ŒX­«|W±e3"e¤ —ÓÂöÏ&JâÌ ^nÀµŠ±l&ø ž­ßÃcÆûµg˜¿‡,î÷ðô›.M\óž‘+õ«†²Ö¼‡g ؾ ¼·vω,põ轚V ˆVbà(:®‘ÆNL²X_$´Å«Ø¦).ÈäÑ’§ÔHýÇÔ%aêÜAˆTS*®7f«%0Wª„Œ!ÜoŽk¤¥Z%t7é¥íæ]- ÚA®Ý¾Zp$‹€ZY@$TU%Œ¿¦fm¶Q÷…T÷½¾3{³cŠ»]f?#‹f_‡€ùñÞq|®bbÄ·Z®t™‚î‡c”ß-€+™°3ŸÐ$ŸT(zÛ¡ª*>2:axA ㎭qùEBw‹6F^˜-£ê äƦ%jîðE£1µÊׯ];œyS¥OÊÝšæ[i÷4iÜá깪”“¡^ƒ“PÎÙ|°3vŒÄbհ᫪iY6gœ¥½yž¦Ý"õfdÚv!µ-KWšlUL’ŽTp¯QÂyó¬vp÷ºj2cÓ òÑ‘ª”Býœf#åù™µ ‚ý×6á²%¯C,%w„“ï©kc~5öI1íp²ÀN2¬b)aÿ:ÓAkAQmKå“ñ¨ö™ÑK–¢€PÚ`Žçú¹bV¼\Ò¥4VJ¸‚¦ªYz¢¢QH—±‡G¼¡\†‡C$8Ѱ9c²é%t»0§£qŽFQE©½ÏŸ‰%§´DÍhS¶‚»T­ÛüçÆîÞ^/Å_3£^nxÞ©õ+kÝL¹bKÍ{…'p÷(N°‹=Ygu\¬îÍéÀ—f[¯­‹æ’—Ð"!ׂ" u0jü'ÜÌpKLx N2ÀÊ!%0é'X0JHÅc07fÃØÁw5SîöV+ò¦f¼8‡q6mÆÜD1Z4¶ª$5 ²‚rîÝϰæÇ±ó[×§[ri¯ßxM‹Á©{ej±o\¶O2SÛPˆ5ÜYËfDeK¿‹¿ƒ¯,€wÇ'às3áø 7R¬Û9ùŠ~zÙ+—ç1yÅ3*)Mñ3&ÙÌ5uSÏ<î$‰ÙÍÆ¯=È|G|Æ-ñ„ uJâF£Ûèë^™àm%C¥Ém‡ë÷kÙZº2’Rt„Í7B™o®ÎîêÀ+DçûüÎßy[B†ÁÜô B쨸¢Ú'7 `÷΢k0 ŸS’®D%TJTMó‰k+é gŽÎVEñËg–„B£Íûö o­Ñ9;ààº5èP°#.­ù4"šoårÙ¦;öÆŒ–PÓwòÁÁì»QÐÛ¢šÓ=g£KøQÖö¥m›ë] r6š:ýÞà_<7ôãµÇU/ý[×íØZŒ»nØÁÓPëÅv:Q§o•›W/ d¨‘<`mnªÉ¯ÀÎqæ§³m€^<Ü\m’cÈ;2–……@Õj“*Þ¥­êÿ. ­r6U™$Õ„KºrµÉé•!μ×ø"½ÓŦ® e½ðÏoìq@ß,k†K—f9ÕŽªT2V*ÐuŽðBÎã%w@ÔÈ÷/:Z±´ñjš3bµ„Êú&ÎÒ‚)Ç1¤à ›`.@ ãWÇ€Çozx-ê§XA^Ê%Qß&Xee+Pò‚Œ4î7¹OЗð¦PDK“8ò†ScÚÜËò:jàï%oÛ¿Œ¾éM~î¡‘á‹ËÐ3Ö¬”ãm_Ï~êÁéßþiBþ„ØÃì·ï?»áocÚÆÇàF‡F)Àè=›–q&ûUwÏ<´ÇrE¼ÕºÓ—mˆQvKÎLÀ‡n¸¬%žÌÛ&DÇGç´Õé™1\É}é=Žá˜ùxÇ{qxä’Ç¥Ùfr?ÿË'øY«w]Xá4Æšt—ž0´+ðóÆØËYû¹ £€ê?sņènÛ»òèÓŽ¥å±­©5ëúùÑIP18ÜALoVP]¢7HCVw¿ðDô%BŽÂt t8›=«/¬ƒôžÀ˜_ÊtbV˜žpÌÏa.±}¢³ž`þÁ|~Ñpÿ˜éÌîØ¡WÊKF²*Û¥­Ä,vVéøXó<Û?îþ*á endstream endobj 7672 0 obj 4010 endobj 7676 0 obj [532 /XYZ 40.7999999 442.579999 0] endobj 7677 0 obj [532 /XYZ 40.7999999 442.579999 0] endobj 7678 0 obj << /Type /Annot /Subtype /Link /Rect [355.680000 672.980000 418.079999 680.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap >> endobj 7675 0 obj << /Type /Page /Parent 2 0 R /Contents 7679 0 R /Resources 7681 0 R /Annots 7682 0 R /MediaBox [0 0 595 842] >> endobj 7681 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7682 0 obj [ 7678 0 R ] endobj 7679 0 obj << /Length 7680 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ÐÙÀjIŠO 0°³9Xì99ãØ†á52ñ!?RKê©)’­÷ 0Ý#ŠE²^,«È·ýò¯æç?š·ï¿ü§yž>ß9–H2þ4Ãï›ËL·¿*-Zf†ŸæùÛá¥y9|>|îÿ¾¨ú¹‰àϿގÆ'_Þÿ½ÿö¿†5ëÿûµùáŸýǼá…omäðå·ñ e”éþŸËoCá/‡|×üÞwAáßH.1rS?^NUéñ÷²*j¬B¤ ¬¡”õý=:þûïÃO=´S7ZÃ)U’+²ªbX.yc”l(Pgl+Am$¤ÎhèÝ64J¸òƒJF½¤æ8L³ó3¤ÍS´ËhèÝ4²ñR2Þ5Uã Õæaž@mdt&@C趡͘ǠRQ¯H§3¡þ j+ F2z”õPɨﺑÃXßÂÆÎ 6cLè<êæØ#ºmh3ê1¨VóŽvŠ >a Кõßû:ãODU7ªìŽð­ƒŸAmÅ¢&œå!ÇÐ#ºmh39PŸ³Ødìl“½x*>}=¼ýDù ²ùúSß“£;~|í‡+š7ƒÁÂúÒ›¿Bù÷Í×_¦¦Sb4|C%ÄÀ:Öañí0XÂ,é 4XÂáxº±äãמŠÅiÂÅÜê‡òý1 3œŒé—6yÆ&õ™’D¿Ò”‰KKëUê< 6°‘(ª%€a–JF&“-£Ú*y,áçö0ûUT1¾ÚòÆE‰²ÇÇí Ö]ß5Ï(0úò"—Ø$ö°‡=.&Ñ«.ŸØ˜öŒC”cB:£pÚsˆ‚) ›al¨ü ‡Åœ¾âqB:òõ4]?ýÔžIà|Ñ ØÎS| }?—á:ä¬#ã±ÓÁù/3¨@ µ=#ýëÀ¾u ÖN÷TQ2úÔ» rR ¿0L{ܦ#îu%Ú3,›4^jkZ†ÒœZ½½e¨8¿VO Ó7žØ]à“=y…mFÆØJ[Áå0¯­±œœI› ë§b׎ˆ03q_×w-fÀu±MK04—äNOF¤lñ $á:ìãz« gZWrådlÓaCÔc¢:lépÆ&A˜û‹HŽƒWgÍê>€¨YÁ!£½¤…ù‡ -¢;r쉸™E,¥ñ¸b–F61]oF*0¸àæqø jÙ”3¡<,¶[½ïàËòÙKLØ«GHDÏ£o7ä|º]‹Ë+²…™7ılòÅ”…£øŒÄ›«ŠýÊå«ßv¿§9n3ÊŸ}Í]PquRÛš+‡›¤ðÂ4"j<ÁIsbVÊjàŽÌõ°ÛpKêÂ=Øyù'e&zLñw0Å™£ ê}e„¥÷÷? f0,o^À† ³fPu§NlŠSŠ`'ì‡ê$„Žr ÷:ëA÷5ƒ¾:m®9<*h}yè±èá ^#œè …nÏ=ž‹öpܹâLmÀ¢€¡ŸüNøå÷pùSRèsB°rÊI^˜ÂEÎË–êárLŒkœ‚¹.—›kož–$g)2ƒ“4܃ÿwÃÿšß7ÿ§$Ašà^ã‘âvü¿þ¤ÛÀÿ»¦c¥ÄÙZ–†¶Nbl'U³—ñ•X+<=€<æ9 ÛË5©Å7]¡–r0–{\'Á“±ëÙkl_f• ¬Çnï•óèò„”ϪÒ$O­ÞþÈIO©‚·º*Á³oU”sæìüäù EK©aZÓÓ[ü ¿l£ú¿ª5vmæ´Á†:VOú·ÌsÝÆ/‡§ïJ]@4q"7aZ>ÂñÒCr¨DÕ!*Òñ•K2R[¡(H¬ïìÑuÈ4î¥ HR\vÚ}Æsg1ÒgA¤Go¿GÑ“#ß®(½¶G_éZ†îÁ Æ$ƒs³eà)`ª• ð¯u‘ž5¦·,ç u‡‚…›UŽ´>Ù"ˆaqqêŒÝ=qq’ñ6{H²k{HvKö¶­Ò?qì¡á-~…_¶q²‡$]²‡úÕ¦Ýqí¡á-sÅ\·QÁ’*¬ÂöÐîí¡3©Ù@ºb5à ÆQ!UÌ azïs“l§tºX—fcX¨û© _Þ¶åʲ˜“­³\ÆŸDTäâÈ’®Lêa™Ó ì ñ¤¬k'I'"$¼êÉ*eÕoaÞ¡*y£ŒÐÁé¢ì±÷ò†¯–ëï Þ¢/WÕÛ–š\/4]ZèÎ6Ñû'Î2`x‹_Aá—mœ–Ê,-”¶ÛèŸ8Ë€á-sÅ\·Qap:/“ÖÐCZY­ºj¨[í‘‹ñ=_ÞRÆì¡=rì*-¸X¬`±P"bùÝoEOŽ)¼“d·¬y°•®pL²ñ©èY.Wup“@‹J)Þz«ô½å»¸ˆF)ë®÷¨Ø@£Ú<qàhŠ„xr¼p„Ž«Ã±k8~Ç“ãx·„8ÌKW~i®ÐtEO³”Ÿ4!¸o7ÏàÄ×[z.¼Á#ÍçÉ s×Ašx.ï¼Ëœ(c©9n'cq;]Åh}v=(<ÛOqÒ¯SÅ3/„¶®ÐòÁkæ <ï¥dýÀñìƒ+ 9¹ÏîÓFÀ»ã|ˆ`ÎAÚ3ì¿{Îv ÿP¿|Îô\¢U©$sÞ¾à òKÊå¹O8(…“RÖÆøú3O.–@\‚¡a¼¥h8<ïa\gµ RN7 f‰ÕÑröU¶8êŒî|ü~]+»ÆèôÐîæUbžž6&ØE«ýoó҃﫯OÏßVmRw“ú³·«Þªá+ eCt/…ÝRÙŽ—ÝuÄÊ>”²•Ë>pÃÛ‘ŽaªUËZj¡dÜB躖™ÅdC!Z9zÌÏ% ¶£aëŒ*@±–‘n(²Åg ÚÈ®—O>Àw§-¦…~Bu&a_*¡hÓþB\‰b1c§Q9¸nøÎÄé¬PLmú.0ïL| œ:“I+iKÆ¢³²¤¤ æ·éÞÞ%~ƒ<4mS.”tÄáD(Q˜<œ¡M›› 㘮]hÇSgÄ—Ðóœ+J<8¦Hæ°”0_‚åKð´¥¶U~´&²¥Ãþöµ Mëƒ%Rb¡¸šÓ2ÎgÍçÃÿd§¶q endstream endobj 7680 0 obj 3375 endobj 7684 0 obj [533 /XYZ 40.7999999 769.939999 0] endobj 7685 0 obj [533 /XYZ 40.7999999 769.939999 0] endobj 7683 0 obj << /Type /Page /Parent 2 0 R /Contents 7686 0 R /Resources 7688 0 R /Annots 7689 0 R /MediaBox [0 0 595 842] >> endobj 7688 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7689 0 obj [ ] endobj 7686 0 obj << /Length 7687 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·Å—(AÏØCÃrr¼Ù‹xgùûQ·Ôê1Ù%‹zôhð´‡#Š,V},Ö‹oÿøùïÇþv|ûüù?ǯýÏçχêTÕU÷u<¿yù Ùœ”ì>ÚÆœ¤;¿~;|?~?|:|jÿý~õåÁþGÛx}E×áo_=¼í^~è~óùùÏí§ÿåñOíÿ~9þõoíŸúþÎðíиúüáßÝ!…lÚÿ¼ütnü×á/¿;þÚ¡¹ô{þ÷M­k-¥ÎÇ÷áQqù~ù(zYû›ª©ÚÁ !Ûqš–ÿýÇáç¶·a§F+¡¬4ºýìjm+Ó4²ýlUÿ5éMV¶¯²V¹£³õQU:xQ0ßi]‰ÌŽšJK–Ž.#yS•¶ñ®NN aÏË0y‘»i eºiÚlŠ ]åv¤*¦ŽÎ#ySëIéŠLzej&®ºÊ¦Xm˜Äç<"®tE&½ÕešÆæÎóÚS6ÁlÍ´„牬™] {"Ó½ýê&)²Y~è*³#WU‚‡ð牼©])»:5µ´ÚT®Ÿ¦î:æµáþžJDÇ#NÔ<ؑȚY¿¸'Öµýî™ ICOÙ$”ŽG2.#b$Ü’œºêyÙtë*·#m˜Vð<"H »úÄrV‘·³Ê÷ȃO_o?¶˜èŽ_~n‡q9Üu?¾|;Èúøæ¬±Ûæøå§ãïÛ^ý‡ã—_îdn§Á®E:ÔRÙK‹>Yã·ÀÞð3‘÷8ôŒh.-B¬hέ·Þº÷ˆY„4Õ¤üžJ]ZìI¹ª–/ß#ªko¦þ±7%PKõñÒÒœ´ôF-žaK7‚ö^oÝ{ê“ê¦ó¢E"ŠâQWpý¨?|iÙ8)ÝÙXp‡)uuaJ!Ì•„W6²þ¤ûEln£“ý µbgïÍHß~!ú)6þbö ̵—[Ë»žüJv\skyêž'£ë3Å"/Ö=énˆ/¦óÑ›Žp“ç§Þá)ôL ùp'ï§wòŽ1 ’ADªšžÑ{ÎŒt"kô¾žó_PÚ¢÷á–`¹‚H ùñ ~&B¾¶¯½Ac"…Ͼ¿âEÝíûžz­„'¢¸%eÍ}FMá\L5ü>(¢‘Õ †EV<ù4ñ‰Ä†NŠð‰ÏR”?ó’M«¥ÿ¸Ó`ŽH’|úèöá¯%æ»^ù¡íE#xˆ»ÇÈŒ[(½0 YЄm+ad°é\œ/´jó[Óñ~}UýoŠw0ÿ°åliÒ[„F-º"Œà¾§†-xÔ2}ÔýÖ7Ï:6vt<¸¥ß»(-³ÌNVõjî=j»Ç£õ¤F½ƒ½ ØB˜€<á8 —*Ô"Ÿ  ¬GÖÒ¯öŽ]ÒT«GÆ®FΈ]#F¥êp’è÷uîQuϲÇul'ÀÝGÎ ¾=)ÁÀ$.È8¿cî ™-â£Ç¨È ëHZûéÖ¸qûRŽ1çf˜ö9ÁñT~HÙcHwJFF™½¼CøYm?‘£7Á–€"rÒ bàºÁ„žN’²»a8=ÌÀP0)VÎ_cù½¨±ÊÛ‹HЙqp uØg"Öħû?B«s _ã§/ qœIp|Îi±V»Ûª ýÛƒ´.Uðܱà`K´Ó(‚µLb›n1¬ï¶ÄÞfÃÁF#P‘-¿xl apâ/>|Fb³'fLüÃPL²6 Ëù„XWW·“€ãQØŠ˜`R%1=6÷Bq ¤†-C04†c®ˆŒZÌÈÒŽJÃí±Mý†ölA€B ¹Äþ1ü †+ü ž„ECôA̘kÙøæ=ØÇ°ÁÆþÇ~Mæ™CmFiºÃg´{‹7 Ÿ[HÌÚ;|ΟX¯Ð¯žé*Üߺ¹†Ê`½4˜/q@ÌŒkªkè¹4ÈÅ' Cî-x!+†5Ì~»î× ±¼FèlW÷3Zì@”Dx¦¢- ˆ^—eêá­Û…(»;n2!ê77¶XCà »¢ºutCÍBT-vD&D=¢âÆ«†(‚ûuAT} <Úœ-j$±£vƒöDa]‹”àE–(?B RÑ\ò)á¶™è’31½hFJØ/!à1ä…à}{&88Z}µY*¼ù`ØÄ[%;or¸qÞÖc6™µQOp†,Î++Ñ:K§„l„y‚Ø7ˆœe‘Eé¯ïâ‚­ØðÔ ®NØŽ1PÊ 阙Æ"áË²Š¬G´Õ pAVQRù³£Ø• !'«%çZûs ¹3˜KF1K=º2 Ë„”ßåkƒù`MHL8÷Œç¨GŽwxhÁ±_çÀJc›Wˆ•gã‡l5JFôÓF %<:é»—–H”¿(Õ%(Y¹Óç•’06n¡)¢¢NóœnÖ *¡")Ë‘$GX¬tnˆïX”F@ºû yêö·iG®„‚Á‚Ž_IX“éCŒd…&ðÍ‚ ÓYº$È×ÖCù½Ã€NÀ„ÒAeí¨eÊK“êSöþ­ Lu†é ~Ƶv ¶>ÿŽ :Ç “`„Ãþ0ֲϼ.yÂ!¿¦ÈL©"‘Ÿå c¸Æßf©;ÅëÊŒX&¦›…! Í㬋?ÃáÕLX -Õdë›… —bl±V×B†¯;uD´ ’`,i~¯äCÀIP†9ä&2zÌ‚˜÷§3g–¹‰EïY[™Ì˜,xM]ÓQ r ýá6î|>°P©QEŸGÔ{-¶R0¤Œ @j ^·¿Rb«Hö³•tÿ4k$8‡gª»B^I8¶óŽžR5{ž Qã6ªŽˆ¢S°8Ù§KôÌ`Ö‰ÈY~¼"(EiÌàN–굜›â ‰áΩ&Ý"QÒ Øx„*})$†= f¡\fÔÈæ¹½c|Ï*Ÿh”âñ,vŒ q›ÜÇ2ò[–»÷w©`FŠOŽ¥€ÄæH b¹5‡R*}<íhAÞÚß,vO ãK sr¨!³âËõX¤XœÎ†“ã"a³û‰±«ý(Õ¼ «€«l+øžÖ4Z«kÉ;=¼uÆK+qãÔÞ쥕Î^•‰å/­tÕƒkd…3Ï|H ”!X0– ²'™$â¨YÃBƒ\`ñ˜7‰`61Hš¯ØN$Ô _Úׯҕ Ø0O3Ò(à2WË1xæKî0ÒyDÞ²=¬¬€êÆz´šYs/iDQÆçƒKÞ=3Ÿ'‰Äw‹ïUã~‚ˆí–%¢x¦<³-Æœò&¾'_ZZø¤ääBpÈw¸†þÇðä…™8ÁÛF X„Ï$$ø$7UÄ'agÈ©8g ÖüofáÍ`¿0ƒ}ñm„·j@ÀãÑØÛbàkfð®ÅªXiã-ãã½pÊ›[ù3—pÖ§'‡jÊ¡ß÷¯1ê"“`‹#Íš–;Êñ¼V¯^))<.yåæ ¦¹/©™.-Ü"8?aMlü¨µDâ„° î¿Úç¡>ø'á\uG4UðÎ߫˫¯[Ì`,k´ÿNJ¨Å20³úœà÷ÏNPú|9¥Î"„&X‡±YzbÀ;Þz¯‹, ¸cz²-³>Q6){E\ö`Ê B›î5.¸±8áïÓ„zø|ÌãØ¢ÈO™ýp?!e $ˆ'p•Ï`A±Ã+ &D’_ë/#a•ËF¡Îꄼ^ñÛáø'BMïH…p=9â8+劣O —GFâÆðŠ”r®8Ζrÿ¾ã_K×_ý¹pm§hìþ"Ü‚çó`QÕ$™É¦»ü°dEâU1&bî¥\#C)J½†ˆY'ôP#ŽG†Gâ¿1Rnœ#ì”®ˆ¬=¾ÒQ"tÃÑþpÔ‘X{VºQ2_HrFÁLü̉¸…€‘ùðfå8>²r)9$"1ŽœÓ„»^°±¸QB(u°9C¾çN(]Î`é»2®jMñìýE¯q¤ÙËÿïåÿY­é …›SB²ËVíŠp%>sMõ¼Œ¶Œõ_¥PFž¬TêB• ‡õŒ;>å3Ú‰HŦ×Öç)ŠXæšé%¸³vÇ5¶BÐ0}+"ÛžŽ\Ò iý-iCÈ\þp'…Þžc׋0DŠ_ÐÀ?’àO(_ÖwÊ«?¯'>÷ü¼š •²ªñL—p÷ñ2õ;KB¶°fGôJ±x,$ ±¨|­÷á¤ÈköY`/!Ñu½%û80eŒµ dûApôÌú}uñÐjíë°…P#ÇÜ’‘ÔØ'Ü‹9å8Ú-y-M.ÌBùœÁsr¨Õ)±Cžàˆ­°XR8p@rì(7°7ÜB ^§*il[†ç4×öc…–·²(9á®yB!‚Ao‚Λ`ÉL°ØâIÆí«)–ð-õŽcÌÇr}óNFp-ïùD“…,þÁœ kã\ÂҲتÊ[w¬ööнäû^òñ|ÒŽjTŸßK¾³—î%ß÷’õŒ%ßrWkÑŒ%ßjœÚ[-ùîôPëo%ßu3„`pƒcqë`g¼@àjÎ;»»Ö!ï OÝXðAíyE/›o<îî–éü½|PÃ5@tïå|Á2,1¸É°',WnŸswœP#|ém$¡LÊ+¹¥£°n(|}l‡î’q6@©¥C•²¢æ)¡_ØšÏQ.,ÜœÊÇ X_[‰ÔMÝ@èsJÕ×2‰¨ó¾þ¢æåOÙ¦̼Yõ>âãJˆ´Çܼ/`Õ`6K$¼ÄŠ›[á±Âã\ê#…óæVâªÂÖã‹êöì¹p}\ãϳ`laíŠ{á ‹R&9ù5M!RŽö˜uS K:ÊÌJx ¬Sò!ôŒ¦Q?”dÒ¼bk2Žç’,| Qi«Ì ªö·Ãå…oþ`É=Â@O adM£ ¤}< pn“«.ã²²zZSzôïã˜EðE"tŠkpNøÜz ¥“ð¢LÁ{Jhâ w½Â šª*XÖ×z±è F9IJ\ã@lmêìPà >ùä+Ÿ¸ÙŸ¥Íâ¬Â£ÄLà¥Dn§x¡ƒ 5ók›­¹n_J•Š­}S–j”x×è¥'|½-^x3W·ç½Ìôž7ˆãæÞ`YñV±6 *+pÆÖ¸Zho+ïǰJ.˜ÎdesŸO×duÏ‚D˜Ì]¿ŒT£+¿F…‘Ç­›SÖ¸H,Ä£OÊÚX×sú!XT9o×½Àlû}üÞâi —ç?è|ýØ™«2ŠbsôÑQPoê£h§qOßw¢î”Σª†ý»ƒ™º>Õ÷ÙÔéS°zÝ H{²÷K7Û;-Ýš(u’îƜên|.¹÷ž>ãà3ÝÊ“¬.qX·–'Ø[ÇZ/óþmo,¿3Ãè™~'¼×"Ð> >> endobj 7690 0 obj << /Type /Page /Parent 2 0 R /Contents 7694 0 R /Resources 7696 0 R /Annots 7697 0 R /MediaBox [0 0 595 842] >> endobj 7696 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 7697 0 obj [ 7693 0 R ] endobj 7694 0 obj << /Length 7695 0 R /Filter /FlateDecode >> stream xœí]Koܸ¿Ï§Ð¹@ñMÅIè¡€a=,z(²Ý-›EÝ=ôëWrFcR?J|ˆÖØ“ñdhññ?©yügóËÍÇ/ÿi¾ÙŸ_]ÛÉÎüiÆ¿.¿ ºeÔ|TZ´´ÿ4ß¾ž›çÃÃáaø÷ù@äñAûc<-a&üãÛï‡fñƒùæñË߆Oÿkhó×á¿6?þcøñ“oü…ïÝËñÃoæ¡„êá?—ŸÆÁþþ§æ÷a ú8ïøïÉ•d‚fíãùü(9þ½|-6|Óõ‚ó†:ìS àøï¿?³·ÑjÎSTðás?<Û ­éðY1ûgÕJŠž–ê•l¸ðòλn*’;ÑHE&:Â1ïh¤ã*ð•Ö2î癲áNH±ÜÉ:™…»7ÓC·…NnËsàÁÏO‡÷„3=ziO?9ºzæÇÓpXÑ|me¥š§Ÿš?wíhž~=ô­è™Æ74#Ý=ù GtüápD”Ü‘h„šu¾> ¸Úò½\>7éîàÈg8›‚ç†Ï`Üc(ÎCÎÃöV[’ˆ l‘OñÏpŒG yŒGÈÝ$Ové…x¯ÓaŠ%%90E*âÎóeá™:ÜÄx7aºÄPTO'XŽdOàÔÝe>¦Òw&óƒð:(N‘JxkV£!Oû›w5=†¨nVÜî8õfÅ]¥§¤ÊᦽëTåŸß¬¸È|݉+¡8ÍY%Ô²âR4–W˜OXŠF«‰-IsäÃÍò«+4¹IóiäÕ£t†õ¤¾¾[“õUó.Þõ‘œÅûñz¯À²¹yÊWé)÷,+î´s¿¥9q€7§Ý®WO(¹ ŠëÁ6ùðM`Qj@H+¸ÔÃv&dCB»òF¶”èY‰§ÚX#¢eT*|(è5“Ä] ƒ·ÜüæÅ¦•3+Á³ÂI¼õð$T¢ó¦O€Vbñ,¦†„“[nÑîÖ¶eZJ•Ã{•<ˆŸ©Î |â5*ŸÐ>¦í¹@÷°@:÷ •@ÕîŽLã‘ÁzŽpºGæ Ò!<_`zÌ xÄÛ’€€]šdSuÁ]ñ0”"ña× o'œ¹0òze©UL §g<6ì®.Ö+!Ÿ‘+)°«âl ¾S 3¢ X†õÈ> ¨¼ûe²pãf†nÂ2ÛVÚÓ×zKAN¤ã{Ú¿)‹[lK¦ø2•U:Þc†n¯iàýòfRô G®žHRëWei$ÌÆ ßÐÖ|_[/ CU\›´$š¸t½¹F´p¡öêSزa6¹{üÎþª`G©˜äòÄVX½¤H¾õ{$® œ|}Ð$ Å0½,[óXoocí¦X‹ª%óXoøûžÞëú°˜õè*(v}ê?b'ÃZI!_l&Ç“'ýê3cÀa9PÅpzïnÉÛt¢0 ™j5)™À) yBï–NQ$µ±s¼¬f|Ýá­‹„€½Mâ1ŒR""SæBgiÑ€‰xŽþñ6âI¤”xSJ (B1¸„„ødK¡”£!bÒŠ ¶R#­†ÿ#¨p@s}×2 ´ Å\´/§—£ó}ÛâGvô•ðS®ááG ×pÛ(µUB!¨§Ö#Öƒ§ðµ\ a¿ƒQ¾Fܸnª—U^A¦`C.ÕrQŠ(Ä _¸K„Ý k¸þµÉJΡ¸x–ay‹ aaf‡&´Ú^5Ï­ƒË9Ö骕 Tq.¤-K"';cZbÇm")W ¥4E$•Ö§àïSyJÃ)n-Ä;X*Ç‚[ í¯“rq ^S"†[ŠJvåÒ¤+$×¹tü&¹ªû]ÛK®tê‹[Bg±í nÜ-ž=KÕ-4ËöY:í|‚æúbgŒWP¢T&à—-Ú¨“¥.“/)2Ér€­D×KD`¥p¾|±˜!&P‘a\¬JM)¢°]€#ê·!Ûe¥T\PpŠÀÖJ‡mT‡àEW"‚†5‚k\0GK\A8bËõ´¦Wë“ï*ƒMJe6Îw¥´Hád­jšˆ zŠÑ‘c/,—ä¹%]þ›,W¸\Eí\Dµøz•¡­}Ïaî* J;’ñí$¦{*—¤~DJåu:•Çû!^?Û'¦ÉÀäKâ<^@øÍmX{,öÁ•¯ÂSu:ÜŒ×{á×ú.]L¡qyÜ—oÑ1߬‚‰H³jNšé{d(ùÎgFÑe ŠvÙÍÈ/?Ó¤5ñ_ð9€l„˜èÚqscW‚¼üâ·ÃãfïàÁÒE£@r¢\aô £ûù»Ìfô9/}ªù3¡´G#ÝÉcP³ágè'øLž±–4a­2F¯+ H×j‡Gð^‡ üDñÓ†Že…–Sgo6/17r2þ¨ËXS¤Ú]gêJòF¾žNj&[µ7ü „¤Ž‘%Ó3wh6+æÖÁÐ!VîY±w1Âàw`eÖöªQáJJžìt€ÁŠzy4<²¢>8ÂÅåm8bà­q›NôÅ;kœ§å û¤°^FµsNÀ?àß%Ôl¯pú×§VVl>ßY“žÉÁ@™bÏ‚Ѝl+RæšP8W;%¸,„€¶”ÜB»¢;£P×·Ž#ð_ðê²@8hE˜X…­ûÎÑCöBqÚÉ4‚3ÀŸ¡ ³èørw’qYW„[Ps¸»Ï#Š„ô\Î}Rù%Ÿ–“œÞuåu‡³ ïÄÀð%øŽ» 2<5K»™:¹Ð8ˆËŒ·á&: F¾º"á_\´ÄàyX1Gl{õîð¸W’áˆ=.ÂÅm ø'8__^w.N¯áÝje²¬“jÍ–+æ"êŽ*7ˆÇTeÜýh Žg¢+lRìߌ•©[KñVºšWdú1Q”¸G[n)î²3”t%‡“¥5-ÑÛù°~€²>Pöí |}Ö6 6ÖøŠDе'IxR`¶¥ö¿T!8¼¶›i‡,¬ÐŒ+˜ÃE¸ ’E¹ätèÆuÛî{qð¢mWm­×‘D”-žá&‰B#)ïÄÚ¿$:“E-I„;Öîì"!@̘”ºéªHIfë¶/r•Ròª}áí=^¡ÔKpÌÙî¶KªT/š«ö¼[,ým½®ä­·Y=LNïÞÚñ+ªv·TD`bey+ ?UÅb••Ð{ÀÄp÷)s^ªX–F°±d†Ô9¯h¬«]aîLØ™}}™" I¼JRÌ ¤½ßc¢ÎU< :þÕ’JJD~ Óp›\R v¢l[ÜzskãäÎúúœËßšZ1]¡]´`nAÂw—®˜È ;xpŽ‘ŸÁÑ­„`dàb ¬:qȱXgd(ȹ ú¢¡@†—rÏæUl/&ܸåj 볎Ì=׿Üdî-13É܉,0ß›ÌC PWÕIæ(ê ²šÇr S}z:i{o®ïN®%åÈgÚs^F›vÑ»ì7j‘Ùÿ•vöïÏ¿­c]䪡@ÃDB›‹ÿÒõ×>y—k™ë—r^c^´QxÅ]"8ÛqéPÑ %­³„-‚TŽFØúõ@EèyãÎÐ×îS®ý¸Wk›Ü&2x9oÄ­­V6!º "îò¬ßdI¡†ŒëÞq—kŰr/öÓ×HmbŸ‡Epªë]uüõj?;À0Þ®Lx!ÇëREØi';°€(=îaøÛ<‹ sÏÛß¾G]*vq]ÙCpãÁG—o“ @9ìé‰4ê»aS˽cI¶r¾7°ç­'° QQÕªy\ÍŒ…ËXKûÙ¾I!Zi€k„Ì­£á3=|ÆØRж´;^(å’õÜl†¬/¿¹ƒ¿kmŒ™Þ£g¬m17BÐ9¬6Ž{Æb,æìvoGÈ ºñ3D-bÛÆãèÓŽ¥á=cE¢$mg†Î#6ª>7Ä ¦7›Ó™£7HCÖNaG‰£0(Îf½¡™sPÖ kÿšG– endstream endobj 7695 0 obj 3290 endobj 7699 0 obj [535 /XYZ 40.7999999 490.579999 0] endobj 7700 0 obj [535 /XYZ 40.7999999 192.980000 0] endobj 7701 0 obj [535 /XYZ 40.7999999 490.579999 0] endobj 7702 0 obj [535 /XYZ 40.7999999 192.980000 0] endobj 7703 0 obj << /Type /Annot /Subtype /Link /Rect [104.159999 500.179999 157.919999 507.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7704 0 obj << /Type /Annot /Subtype /Link /Rect [303.839999 202.579999 400.799999 210.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading >> endobj 7698 0 obj << /Type /Page /Parent 2 0 R /Contents 7705 0 R /Resources 7707 0 R /Annots 7708 0 R /MediaBox [0 0 595 842] >> endobj 7707 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7708 0 obj [ 7703 0 R 7704 0 R ] endobj 7705 0 obj << /Length 7706 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨sËâ&J@0€×90Ü@ƒOf‚ÁxÎò÷#•¤êjR¥÷¸”ª»lÀÝ.–(òñíßþåë?¿üq|ûáëŽß¦Ÿ¾êªnêñÏqøûæòÙVJŽ¿ÚÖT²þ¿}?<__ú¢9=8ýèçWŒþñí÷ÃÛñå‡ñ“¯þÖÿö¿£<þµÿ߯ÇÿÑÿøišoøÂ÷CÛ5Ã/¿¿)dÛÿçò·að߇¿ÿéø{¿„ö4ïðï›F·­nãÖñx~Tœþ^>Š^Ö"D=,VÈþÓƒã¿ÿ:üÜÏv^FÕi!l£m½yV+OÓqìlslü9½­m›IÄN$úý%™hX‘ˆÚ™¨µ ÎTµ´ÚÔ] 'l¼±§Û賘gŠ¡Ô2Ñ¡ö+Q;›ÏÎĦÙ©q“BGÃkž*v"]'"‚aE"nk3äñTlÐkcSþÐ÷#! TGàlj„õ§‡²cE¯/Þ±"V˜wûÄŠ „®O(!z¦6mzÜ€©”8ï%Â7hd”~‚ÏøÕöéòô­jÈ Lè¤+=\ŒàÙ>¡5žÑè=µ#Þ­ûÁHZM%E»ˆVzÃWEíÎ ¡%½x‡‚!@X+–¿Îûð3Û·#:g%Þø5ÔÒÊ’»VùÙ]€‹?þI{sŒ„)Det3€mšHŽø€ÖÛ“·ïœsZ>¥b*w¿êƒÂÛ–×*çÙâÈsŒÁ„ãú]¼´®| <ù‘º%ÈÏA*§·õ–÷sùº¤•B]" ç|„#PŸª?CÝ®­†ú!Ö)k¬CNIúl U$Õ±Æõjü Ô6ñ~4SD!î`{$€UÖG¶<Ó€uׯ±ˆ05`€1c/„kÕG1ap$láVÀ€A« ¬± Œ;ø|ð– ˜ÃbÜϰèR£dp±€ÄÀ³q¼˜“3¨^•ÔDw×6h xä®-ìA[À s!߀|5gm ÆÐWÜó´¤:ö…²dÁõu52ôˆ‰'æ÷K«Ü£²iž;R<¨ç¸Áchj«UKn‹¾ˆ7/àÁÀkNâ{ÅŽ1o„Y±;jKNÃõg±ëÓÃ#o7Þì4aVïYÎ<%> Žor},YŒcJC Iü·„•xœÂ'vù¾_fL9¥µŽ8ÐÓŽª¶«×Äñ!l=qÀAo? „Ðpú’ž^%›yÿ؇űL±6ÂЇð{X^š¤ºšÀþ››ôí@ÇÝ1ÜJfÏ(mžK>šï"™¿a¥Í~²¿v€¿…l4…ߣ ž}»Ÿ¯œýþy ¢Øg G>>¸5À#.>F<…‰i}‰¯M—Éïwêõñs¢÷ÔÝ™:±þ½çÔÕqö¦yq3õŸÛ»id{×%¶ìçê‘æœ¸w?û›à]WÔ#Î$¹¾D,9kjñ%–\¥ãQ 3{]@-ùLGp,¥' #àdÏe“Ê[WgKRrà-€ð\‚]ÀÞûÁ­ˆ8Ž}øáD/®ëB®^ÝÈÑ÷BW«0ÚqxÆ_«wjøÙ¤%×Ì÷Æá‚>1yNÐG~Úüb¦ÞѯÛ^#F) ËÞNh,xn—sžã×–\‰µ$p@Àcè¶u¯ÞLƒX(ã‘ígMá¬t)“•sM ÔZåêáœjSÊ“Ãâæ˜jXÕGˆ2Þ$S#o E™¢Ûd&#OÖ3’CV³v žç|œ²“Å™’¤#ngo„bJÎhLñý]¦&‘©¥kû`aFÒWÂ¥ýA“!Dã(Ÿ¢szH¤u™.æIŒjž2ãí:u’ 'öj¤Ô•‘gN®êG~öœ—L§µÇÁÆ]àfÍH£|¾Õ®:­õÙ‘vh¤žg;gÃψwð™Žtp¶ñ¡ªQpy¼¸—i­#³ñ~qTè9ôó4›œgÅàÅl“Ë£ÒÒYÛTw²4" &>ÑT“ âi KÏà÷”êmåì|ÉTà^ºY!o`©{¾}ŽÌ‡ïÛà¹%–ÓÅ{ïö(Wb¯é“ä̤PŽ(éf«fËH‘¡¨$ÞZKii /)§9rÇ_µ«â]Áƒ¯[ã‘—aooˆ¾f¤²Ì]tái ÀÝó{î#‹»”бtj]‹‰*RHjPÊÂ8º&½"SMÎ ?ýÅ[ëf¯è¦Ä×k™™×»ñ’ãý"”oÜ|®×?%©/À¼eÛOk×@Ò™g±¿V'ù'r%CŠÂøÄÊØû¹=nU,¹¸;÷|ΔÈP¨>â&KžJ…ý¦ ¶d5‚† 6WG DÊ8ºP¦ú Iê’’V· GZX•DŒPd’HÝ—gÒäò²Sk‡áߤ/:wiÞzüÕË&äa…ϨÖëa–+u£K^gGNŸIc]ŠºËwr&kár˜õ@pÚ䚤]-)ñÓümªjãêëМ ° wKNÈq™l¯¬`5MJ>s½L»w.¼È¨#ïîÊÍ^ËœàÇñìñ À X¿ç[oXf×/ºÅ·’BÇÑzÖäá_Àê$ÞÒ$סîÿªQN6,ßòËH+RK‡X|-.¡ÍíC¾M³§l®}9,!Qsµi¨ÆHÈ Ø`_%ìÌ¡8ÂÊ’¤1sòl9þLm«2ì~ïl|Y«{ï,|Oà&<aÈCÜqþëFÚ{¶ÖkÊÖÂôójòwžË&ks#7ËÚêŠ#w®øòÎôÎ÷ËÃA)ž®®œZ£,¸v=£†õ6„‘#r’Z•ëKMâ·Ë“å¸Úòö‰-i„‰ö|s ƒ½HÈþ îøšoÎUÚ…˜U×ö˜/VÚ°a€Ã|V«8"Pâ”»ÚVÊúüV츸ÓÙÎ Ò™†×³è »©àõ¾E)ð\܉Ýfw áåÝ­tk2ÜÁ,“®€<[1t¤=sGÒºr»)æéDK‰I1ºÚ³’ÐS´üÈÛ<¶xêhҜιҷÑ'$2| +™ƒÔ¯÷®˜»£­Çî )¸Œ;¤)i㌄· )[….ÚåfV”ÏÇÍÊ*LšF¢KÒêU‰ð2†"'€Ì—14Z_~0\Æç,š±àæò,n’ÞtOe²³ŽQõÆ©m]Œ*}½Ç°‡ÍjÂ/•¸…&üöüWoÂ?‰Ì…Vû¸mþDHÂøïÁíù»‰n”›‡›ýV›ð¯® ¿u«ôÕ;+'©â X›ÐÌÜ+=êúúÌv`æìåíÍ•gÀ¹œ‡׃¶ëUû„:ð— àÝltw=Õww³zFáa„p¥ÇNŒIÖ.~K$B‹²Z‰º-º¿¦Dð=í°“]J¿ ¥Ôgô±°Lù,ЧÌÀ(æ)„„{…×~µ+OûãÍ©L¹sç,¡ïާç]ü HŒ†bc^q¸¹‡úYäEÍ8¬ú^‡ëà"ro3ßâÍAPa"ê© b”SÈ™DZrêo)§t°JÅÈÖ³£´<!.ÆÄ960/çÿHœËÃÈË daqróÊfa•9asnÿ_¨@6p±#W*µÇÁ Œ}Œ‘]\_!µj/á‹Ï‘“‰áË8{¼‚@>^©ÂÙöQ©»&_°Â¥XpÎ>°㬀Sþ¸.b„‰À ÖÎ8ÆXGp~lZ½" ÌÉžOZö)qÆqAþb”ŽÀŠ—ˆl؃Q¤õôý‹ûI‡/L?¾}'eu\$Œ| n"øèzrFsý66¯:ÑŒý¾ª>7äMšål°NWžq3 ai+»ÜÓÚ.ŒŒ¦’R•ì‹g©šÑ8{±ð=-|¦ƒÏŒÄhe%k5 ¹ ii¶‘­_~ò~wò·-ìð3zfr,´Éf§=3eïÓÚNuÃï½ø±«§=%äÐðã΄Æ{fR!QÕãЃp6x‚ß”øqhbñ #ªö0Rƃ¦ÃÙ&¯ÇÂ>d‹Þxf„—i眣 # Ds˜J¦Â5Ò¦LÁ“𥟶­›J É1Ï iÒ¯–Ž“X{)Óʳã—Ãÿï] endstream endobj 7706 0 obj 3852 endobj 7710 0 obj [536 /XYZ 40.7999999 484.819999 0] endobj 7711 0 obj [536 /XYZ 40.7999999 484.819999 0] endobj 7712 0 obj [536 /XYZ 40.7999999 133.459999 0] endobj 7713 0 obj [536 /XYZ 40.7999999 133.459999 0] endobj 7709 0 obj << /Type /Page /Parent 2 0 R /Contents 7714 0 R /Resources 7716 0 R /Annots 7717 0 R /MediaBox [0 0 595 842] >> endobj 7716 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7717 0 obj [ ] endobj 7714 0 obj << /Length 7715 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`5âS"˜g€4¦‚‚Ùl‚Ef‘Îò÷#Y”Ý-ê#ÅâÖ×3‹íÓ¢Šõb±ªXõî_ÿ~üç¯Çw¿þçøÍþüøõÐ6­n§?Çñï¯?à}#øôk׫†›ñÏñÛ÷ÃËñåðtxþÿr`úô ý1 ί˜&üõÛ/‡wÓËÓ'_?þyøíG~üÓð¯ŸýÛðãG;ßø…ï‡Þèñ—O¿0Îx?üãõoãà¿ùÝñ—„þ4ïøÿ´jøû$8^βÓß×¢— Ÿ0®:}dŒpªÿýÇá§a¶3‘ŒuZvíæY;>N+úîhÆ©MëLê¬mãT©KÍ2ÑK[ke矪é¥`¢ãJŽdI úž¿wÂþ‰€Xó ‡|`ÅÄÅÏS%c±V–e¢"–¶´™x*²$˜vâ:ÞšÔ…ÎS¥bL0– õ#D,mi3êñTTÔ n&|‰>U §JF½îTž‰FˆXÚÒ,ê=SåTBÃ4:Óžp™*u"Ã2‘c„(ÏžàNõ”Å^à{áÅóà‡çû/f´žÀ8XÓçï9ücT“mw|þñøûÁÊR8>ÿ|²™‘päã4rþ€¿?}ÀX£¤î‡o_¾ªO#ýåƒÏ§Ô`ä;ú«Yù§åWûÓºá¬?A€ð¬¢[κ|V° ø¶Ñ{Ç·<˜XƳé<l‚¶'æ ã³1ë †G]àG"`Þ™j9ìéA‰€#ðkÈë­Üy^E X©xbÈ8!ÁÛÅNJ(K¤­!:Ž‚µ§Cüš’{ˆ‘ËMÒ!E=8)1„´HÎxAÁ=ÉH³Ü“ö’*qpÖ ']cU8jq3’tõ<‰,fåv•_x9y6¬28yœ3 çLD‡E‹  ÂÖivÑX»iI9 ÷ Ç™4)ÕH²d]ÀXäê\ÇøÓ¼èe_1'q·l±h<“ S6Ö•ÙcqÙQqA¯¦œ¾Á›Þr8E=Çø=ò*Ý„ü)•™Žû6b›Íé5rl?Š9æ~?r¥¬„°“Ñîy[ª¢“Ìш¼Xˆ¾ öitiõ’j8Ö-ôþvV)“O•’:¹ƒàÞÇ(ÔI9î'­=‰ç²Æ^b¼×J{Hè.$´¨}P2SNèÅža f ´fvFnO' {G« 'ÛN…i‘¬W”çB v²SœY6ËÏ»¥$¼l8§øwñº¯l×ÄÔ¸¹NîeÙ»›¼ëRé)C‚/Çâ+ÓYkC{®Í†`+™Ë§ÅR³…Å‹r_‹¬¥h¶hW|¥[*BèîµàªaQÄÕ@p±P\[„PÚÝs¿—i¿•Rõu(¬» …kÖfý¹B nˆ@¨Àà)¾×íieEiKìã•R*=jLãâ½-,M,ëÕú² ›5kÄH¹H¯ß§ñ²†EÈ# òÀ†«›Àá*à°~À¬ðl»ÄnåV±†š‡× !ź kiJÃO=žJºø6j$És> ©Fæ8Â^çÙS)û0¡FE¿xð†m\ÊÞM©:…g«D¹š¤Æ#߃—Sö J•2R#,¼üŒ·ß—3“Àå÷¦áªb^ôE0oòX•&—à"EçW²õn½ö¢ê’êå^‹y9›dieÕ¸ 7åÌ{š½aì`­èÁÎmH“Q Ò¤p%Þ«ËÙmàW³¹¯¢¸…zòB«Ùãq§ÁÏ(‘¸C}^_6~ŽPz0T“:ÂJ)•¨);H^pÄ|RÈ"êÚÙàñdRï vïÖ8y!η)VÅxo§L §>:•zl·ýv*}Åžž÷ÐøRx!˜4p“c…ÏFéÉž•Í=¸ÎÖkuƒ²èf·GÞ°MÍô‡Îtal?žgÇö¬ð.l‰’µÛºÇï|Ãê†Ã÷à=‹G(Û¦%' gÈ`ÊaKÛÚoøü„=ô˜r_ê)Ùž…sº0W0È—7“©¥ünùLRÙx¥P™Sìg‰¹jH 'jˆóI*fËôB%Ðþa˜œoÃÝ—aòŠ-0Q°ºÂª‡²ÁB”XIAQò-Áë¼µñLO¬š÷,ž¶ ˆ§G °Iˆ÷{ö¾¾¢þ–ÊÞ2ê\äð† oyf»zá­öìÙvJeÁ²WžRY-œí3Á³Múv­¼œÍƒÑIo0îøð÷Yb ¯ÔjÕ••2aSp=˜ Ê]¼„ÛeÁ6®^Ãæ^HmŒQ«Â¯égG«=k­¬wLˆ¸gL)ÕQ©"Û† Á:à…ÚÝU¥DÛƒRd3L“«µ>£T°wjúRZ6Àg6-OiœHáŠ,3RN¸Æ_Dæ,EV¢ óíwjÁžÚßäéñ\¦ ¦ƒ§FA–jè(qJo/"EjûàLõ¾F÷±á•-¯{gÛÉxÄ|B©µ³ímjrT­6·PBÓ‰„ž…e=;ƺÁ.û))‡Z ¾É"iš%r ‡¼e¤žé¬)…y;¤ËzOœ”«š­Æ$·ÔK¼hY–uØTìë¦xG佇ù-”Swx/x·1òµTÔ* žY²6®$ã!ÉQIo—öÓž}{è†p¥ÃßU&Õ´ WÔ$t~.ãÝaµÝ+ ÐFÐ ¶´rÊ£)|1!" ϧ”uº‰Dtp-" v¤øò¾'•M&¦É/¡cV‡| ûD8.Ò–§ŒG/O1äÐ^U<+ô lÜLìˆ ¶¤m$"”P”¼‚›EéM¯o]çìÃÓ'âH-zåuC4n9‡ä„SÊ[ÿ6üĉæ=áã2A ÇJpŒŠí¡u·¶&¡Ÿ'«¹“ê•n7 -£b»‘Y(ö\$SS?ÂuQVwßP¼Ð,É –ì#Rÿh„‹# ^9#·¡£©”aB9‡”ð†ìÐçÖÚ=2n¼\¼¯Á…¡tººI™b't+-“'‹7çp%o3§Í>œ‡á™—Jî%†-6“ß5/)ÛŠ ‹ÖòÖ(^Wyþ_2T¿`|ûî¡«Ëí…!ž¼,á}4|ãRÙ°Œµöu†éi9ŠölØ›kºÑëöƒ‘ƒ´‰³x×të}\»•‘Iq Ñp³ÚJ^©FO„[j°µ÷ôðŸ™6ºŽ7¼=]D»Œ|€³MŒúú“Oð»Ö¶XYáôŒÝ$ÖFZ‡eó¸g,ÅbÖna; @׿sź µíýÛ8>À¼cù@9ÏØýš5í4tÑB Î)ˆùÍÞz\ã7ÈCÖ>]±Å†^Ï% ó‡ÓálÖXYïÑ{<ÏLøR}#¦³ç†Ž’9,%¶ MÔ–,Áü}ùéûV7l<@½$»1®‘‹Ø«ª­O9÷³ãÓáÿ2AÛ8 endstream endobj 7715 0 obj 3747 endobj 7719 0 obj [537 /XYZ 40.7999999 183.379999 0] endobj 7720 0 obj [537 /XYZ 40.7999999 183.379999 0] endobj 7721 0 obj << /Type /Annot /Subtype /Link /Rect [404.639999 192.979999 452.639999 200.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 7718 0 obj << /Type /Page /Parent 2 0 R /Contents 7722 0 R /Resources 7724 0 R /Annots 7725 0 R /MediaBox [0 0 595 842] >> endobj 7724 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7725 0 obj [ 7721 0 R ] endobj 7722 0 obj << /Length 7723 0 R /Filter /FlateDecode >> stream xœí]I¹¾ëWèÀåâV  `»í90Ü@ƒOf‚ÁxÎò÷SR±$5Y—ÇE%YÝ€»-6·Ç·ñm|û—/ÿÜÿòÇþí‡/ÿÙÕ??|ÙµMÛµó×þðýæò>4‚Ï¿öƒjøxøÚý¶{Ù¿ì>ï>Oÿ¾ìXwì¨LËó€|ý}÷vž|7òåÃߦßþ·çû¿Nÿûuÿã?¦?éñðm7ŒÝá—ßæ_g|˜þsùÛ¡ñß»¿ÿiÿû´„á8îáß7b¼]Ò:^N]Ùñû²+šlú„Évä{Æø´N5ã¿ÿÚýýÞ ý±b9rØ:ŸfMÜü2T2û‰5fè°"–¶µå8ðPdJè¬ëÓ!– G‘i ÃŠXÚÖÐ㡲RÂ8ÎX'ÚdÆ´ • EÅG‘é\Çv&mm9k¨ÏY”~V^ß?ïÞ~š8öpОžVrT°æÏÓvÕþÍA”rµþiÿç¶Ÿ~Ø?ÿº5Š^ÍÙÜÒ>Á–÷¨…õ¨…Ã>-\ë`‹ŒïÃaŸö#‚¼ŸÏN?áN,³ OØ+Zí@Àx&ž  ¸ ׆WŽÑ µxØ"à Ô„! WíÀªpm°åúxÍjQïâñŸ‚cmp§˜~ð™bLxÕc.ž6†&Û#Cã¬_¦œÁÎÚ¦ëÙ0-ç¼µù¨ú¦È/97\j&¥Á<ïµAæsPàÃ$Amü•”ù‹¶–fN£±éâ/:_—HàýšÓ°ÖüÀ\™=zÊÊ0ÌÌQcà=ã×ð#ZµhN¼²èˆ5Zàä]0¦ñ™Õ0Ö(Ù½¢Çñ)¸hxŽ>„-¬´ð6çå“> %Ž»"-Ñ1HZ~27>ã)ÓLŒ/ÃÀÆ>|­ˆ1”dÜÊäÜZi^;vkyR 9ø4†ONuôÅKƒ-x4 ³r‡œ5¹=ÿh~à_™uÀ–$bMGÂÌí­µ†3–x BkExñpÌ\€üˆþ·Ä!¦ö ÁóS‹NÚ2Õ½jÁ8îÖ–FCÐ%刖$…y€–·(Æ«cÙX!ÏÍ †a4ƒä߬M0ߦ´ˆQ#ˆ2Z-k ZnNB½Þe&S×ö Zl:)~•eJ™'ba&z6?ð_Âr\NCÄýo«Î5$0Ù¦}ÄÄÞÅ Æ¡™Xèk£‘—©eÂsË;xJ3ù¬]‹ËÑ ƒÈ Õ/[$hѸ%“µ^Tłχqa§Í]úhïý' Å"öO8D)Å^ŒÂÙ?T:*HöÉnÈÕ=)áÃCH¥¦‡‡Ð¹¶ïÇC(ÛÓ”9-—r†oæ{ƒ "TÜÅì¾3lFL –,N ?ƒíxHq…CÍž7âÆi*áší{Wø½ÒEï}=³ÎïBÁkÅw¯Eï»jT—bŒ'8èø‘²˜="Ì,>”zŒ{ ¸A1S0DX׬&‹Õ s#¼FÜÒ/ÉG pë%ÜÅvDðeÇSK¯‡‚ „ÐÇbq¸ÌûZÊ ^Ëækán¡Ûsè]ˆ6‹-ϰwØ+ÁI­ýÂ] StÈ ,¹-Å–à ©i–ÃÉBˆoàðæÅ ¶†ûP¬Ðs}»¶Âá:nÆíƪí°ÛK–Õþ®e^9Ší»Ûà˜¿¿êÄxnÑ©!…[PøÁ+îЕ°7ë0˜ò ¼gËüŠÂ-tKÐŒ9ÁÛ]•_õ}~%!e8€Ö«Y¬µÔò õbaùFƒ›MÝð­Z¡üÛ‹YÜ ã(ÂëEqÓàá³fæpŒÙž‚]›â;ócr«å@#Z™àn ž9¬}Ѥ‰/†¦I)â°AÛŒ´Ê&=¡A°øÆ¦&ãµ6Zúø…ea½¬fPÙÐò ÷–XLIÂA ÐMII‡ÛL ]“­ÇD¶Xà€õ¨Eez$Sž0!SH˜¢8 ï&FR`Í`˜“À ˜+JØGâfŒ” ‚kŸ·Ûå—[ΗÒÀ¹úSXæ¤ÃLFÖy×C rÊ[ƃT„Ën,ù  ¹’û!¹¿/É]­tÂØŸ¦Œ|ÃöóÇfê‰VJ¾Ë­ãŸfÃÆ±„RËþpŠÂÁ›‰ˆ0Y=üÒWvc+vI–®++žyzžÖˆJ×g,5K$äM¸ Gø ä+Bà½.«–‹×€ˆº<(œ©ˆ¯XA'¬À‘ùCÈŸ¾þ¥xËW8 Ñ:x)¹¾·Yaôa’ À¾:86À*kõŠÇÙÓ8ÏÍÖÂPí8&àX暪޾óg;W« ÿ ÎCÈÅù¦ù2D /Rjòä…<ÖÁõ*ùì”z¹5µÖ/•a(š‰C6*<;èÄçPŒÍ!iðÚ*ž gþê-Õ8ÔJ>®ŒDǸ[bÖZ.ú„ëìûdתUç ¯ÛŒ´Ì4Ï È L;eÐñˆy’ƒó`=Ó3å´q] <¶ŸàyðhW¯ì¡—¯A¸bµÌº• ò.O²ŠJ?t­žÅ=‘‰þ¶cLîaíŠÑ)©û¸oÙb©¤tŽp˜ÜÔëe²büþþðÌÀ¬~¥x¿Ñ ƒÁíó°Ã,ƒÞ@ic¯ËÌm0#“KçÂŒ2Æu5ž…T„©NlQÌ»Ø ¥rÔTI‰ÊYðèÈ.Ù {ÅnæO‚ø çSý M>u­Êp)oœFT/9•–´^Æ6³€fh3 íö íÐŽ0SÍ¡ÿ·Ý0¨Ë~Û}qÈ2ç°ã Ã)=æYKE¡èUXYÊ1ìÙ¸(ÞÍp:Ut>·ó×,#jiÎÛ+³ކûœoóÖ m„£Í¼Ÿ‰¦7ÄŸ>æ‰(f¨‡´àyÚS˜ÒLG+‹n`Ÿ¶'¬´àyôÕóÀBL¶óWТMC#Må@k4]#fXLlå­–=áü¤ƒsG<‚ýýVˆÐ™6¢2T{Õ/sÝȈkŸ¥æ¨3Rä1¶€÷âp~>TySÞ¹ŠA(ŒÑÕEsGq ZDÞp³Z­×ç"^KôA¼¤PCªPª0‡[œó¸RJg§˜<ü—ÑxïÁ¥S–‚É#8Lu$¼qºáŒë.]zKHHªè›R®Û´(÷çúí‘sC0`dáÿ9jo&¥r&”…Îû¦j»yÄ1è±yÆ:YEW¸ŸâO)µÇb´ç*ëÜØ”#ˆ†98‚Zp%,RgÓǦ½rеè…Àþ·S2À0^äõˆ+$>'—^œeÞÚÏöm3K^(öK¼ƒƒÐ}+-7­S§”ö-T5âj–±ð5lfg—2Bß Œ„ÂX“PeÞ#<‰Å½ëe$Q/--Â…i#¢þpø¨1Á*dqßM);\ÖËqo­œl‰âw‰Ð,³Ô4N°%ç‹;ðÝV•ð¢lŠ#°pÑ¡ÂnFB ÂA´ß½&øðžâíe‰Æ½3¡“ãmÀœ¯4”dé7xºÃ±b™ü|«ˆ®xNÄk¹˜ ?_œðX°ãlêøfI1e Ü×)¯fyQ…’õnËõ¿o6F(çh„dºVŽ!ÝÚWÒ­*:S„D`"¥~%‡" åp£X·Q>«¼u¸% °Ž—Æ*ÖöæmSÓRÙZî¸=OO®ÂÅü±Ã3¬à±Þ€TÁGü6ñ÷à«FRðÄ(7Qjªm“¨'QlžUy'«’Æœ²´Ê¢ô¤´H©áÊ•”pÇx^<¹•´òÛ„Œi.E3wL–B҇åÃêYHd¹E£¯I·¤Ä«QáB&ä?Ë•á—;6ï^oj“jÒõ¯ ¿GsÔÜÆ¦+Q‡E¾¶¤]RpÃnî2Á;qCT²åËă~béGv2~²MLu‰(®áÝFñlÑÝR?ßñ6^Åo´½üB¨¨ FË⌱,"ß3:ö¼áí±Fß¹å=mƾËOžàßê»çÊ?¡>úN¶ÖÂÐ>4ãŒë£O,fïzmGHÀºÃï\±Þ{ÚºŒe`ÜÑx ¬>º‚@Çšvn:³Gƒ'ˆñMÛ¨×ð â¶_¬´ˆÖÂDHQ˜GÓbceúê»2£Ï /54b67´8`ÌÍa*ÑÓDµ`úÁ¬Å_*ý CÛ5ì`CMHZ¦­¥Ä´LË(ÏöŸwÿE*¼ endstream endobj 7723 0 obj 3862 endobj 7727 0 obj [538 /XYZ 40.7999999 506.899999 0] endobj 7728 0 obj [538 /XYZ 40.7999999 506.899999 0] endobj 7726 0 obj << /Type /Page /Parent 2 0 R /Contents 7729 0 R /Resources 7731 0 R /Annots 7732 0 R /MediaBox [0 0 595 842] >> endobj 7731 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7732 0 obj [ ] endobj 7729 0 obj << /Length 7730 0 R /Filter /FlateDecode >> stream xœí]Io»¾Ï¯˜s·¹³x CÃrrüò<ÄqÞ!?=êž‘DöÇ¥¸Lk<`Éâp«½ŠÅâë?~þûñŸ¿_¿ûüŸã×õç»Ï60Ö¯ãéûÕÓ?ˆqbùÕŽzÓéëøõÛáûñûáÓáÓüï÷7×sãyŠeÀß¾þzx½L~XþòùÝŸçßþwÇ?Íÿûåø×¿Í?~ZÇ;}àÛaœÌé—/¿pÁÅ8ÿçéo§Æþò»ã¯óƇqOÿ¾2Z¨Ñ¨¢u|¿tåßO»¢Éæ¿pmØxä\ÌëÔ38þûÃÏóh—e “âÜeYò¨Vœ‡¬9r)½A½½%U:U¬Î@0+Ûgʆ‡F%¹´B«N(Ðã(æß­\¿r¶>ñ‡­Ë‘CqªІÛJè8­ˆ—míŒ<•æöa›Öç®L€G*†¼Ö¢Î@§ñ¢­€Ç#‘án%«$‡*h4•ZQ ª¦2—[Wr*Ýüy¨R(Z©+‰²ÓŠxÙÖÎèð†úTÅXÆÂ÷@Ç·_¯?r%Ç“môåçy%Öòã˼]}|uÒZŠ¿ütü=còãŽ_~9Lƒž¤Õ‹E¶´°÷°å-jáµ؇Áp[m‚}FØGÀد &—µ}ø2ÓDs Û)Ža¬ìƒñˆqé…‚{ù.[µæ¡Ð ƒ+À˜¼Ynã4†á‹!‚%̧>ö¡æÚ$\Ç£Q¨U•:¥ƒÄƒ*qÈ{Ô¢ÜÞ ^@`a^ΆxKÍ1qGuä .œ{èÆtNÑ.C°úP –q_mªÀþÑÐb Äu°ýC±À •£ ¶ÙõcAëªûà^Ɉì9âS×ç.Àp<މý +…q‚!¹›"(Q"ŠgŒW€#w˜*(R„€‰±€©zx?¯s:¢®¥È‚žÁø¡xúu£D:€´£±Tý¤ÐÄâ4ˆI8}Ï‘U£§PßêWôÁ#Ÿ ðˆ£©”8«Ð÷=`/û–­‡IÛÝì[ô¤skžï»Æ¬Z!÷õ<ë¤Ïv<1ÂgI FÖ”D G{q,΃Ï8I£Á=ÕOs™àö3ÖË‹—â…àÑ ïVòÝJÞ»•Œ1‡OñtMÐaœà³V^5–ø˜çàÚD¿|"ôˆsàÝê/±ú³,„Î4–Çé8Ò„=XÂi9%ŸS/^A])„OåIZ÷!X ²§5v9ß!íî¥úŸ†MEX}©þ§álÚ;;úŸæt{ìÙ¾{øŸ†«³·_×ÿ¤x¦Øû»¾gнæzžéL Óª„y@•`—Å…1Øòµ¡†Ý–ÕQƒÕn  ÷ytŒ½(8ÚG[Œ!.‡%ÛæÉhË 8–ü”<»¤õh#¶D^¨%0Ï91@NÌ<Ë;XsÌ —E?鳦 J80X y«E Xæy ûày:¥q9¾È~kôs¥©ñu‹£‹<—¨Å§Š¤çÔ2®pÒŠEãâ÷.`£ÙZµF³Ò9}ùjmÒ¥bzàÄ É 5B†0)“)ŽkˆJaÔ„±œ4¸ÆÃ{dáîÜ£\œëå&’ VNäMs]=só|”úêMƒÃ-ŽYTR:¡÷ΡÎH Å ýºÄÛNF^pAf´ß—²-¼VŒYB2óêïŒO¹ÉéÅljO¥Ãµ†êÃÂ*ܬc‰íV=7ÔR]-…a‰å '±<¸@S ±2î•/ï³K†"­+cªe’Ägã@ö¡àa «÷*‚îV-ªtiì›Q >޶õgkwb¸75]–6ÅlCI&µvEÙ­O§ûʾ˜Šp åâà~…i†g„ï{ŽPo1z‘¸Q°stwC‰;{®Rû¦U6‡kBˆ$à ®r'’àÆBÁÜV• MMzm¨‰F&]Mt7Êîz5ÊÐ. U(—×3®µ—+Þní¥:Ý]ùöV¾«gÓÉ’·=ôo[Ì¥qJA ¾G ߺ†oé¤6~˜-C c²ó,ãkÎÐ5‡ÚJwÜ×%¹œS•{ŠA‰™@`ÿœÌÖÚUåë î’CCéî5AæbsëĶa‹ äbÏ 'ƒr"„G˰ýªòØòrÎ[¨W:§‡ÜUOŸP¨ öI83§8mm³á(9Á!S/ˆ‹-"O(4d›PîúÃרEÂ]ǶµSº¿ªFqy£¶…Ý‘µÖRgŒÆQ·=èÄÞ' "Åmr;n4`SH ýü­²yJÈ™§ÈÒ„÷›Ä1 ¹Ý”ŒÈÈ⤟Œ‘~~–q^Ý#¾ézh”Ô:*¨V×sÀI‡$Â+'š+ý•ŠÝX妙Rƒƒ ‘Ð:†ñ 8Á&Ø•‰¯ʯ%¦vìZ¶4$Z†MGíʺ¶‰Tñt7e‘2*:JŽSu†µ´cB,(BÖ;²sÛ{Ýu3oÒùØ' H”dzKbø×ÍÀ7£g7Á*ë4¯¢àúë—‚{eBãÜe¼¶:Gz4Â¥£sgΫ¤`Ä/ (!vÃ\F!0×U_« Í]ªìœ(¿¿³2ÿ¨£×ɶº<§Zçd»JáùNåP2(¦Fý¢Ä¡* a52EkÆã6VR¯$iüI#Í/빺^¼k²Fš,ëÁ¨Ày·“x´ºxá#n.‰>-¸ÕÒñS-.Þß%×]rÝ%׃À㘃ñ~ðÕÂsÛwüã?XÁgšïZ|¿Z<âxë±ñ[‚·‘p[Eûz”E X|Ú£¼ó.°hB.õÞê†Geœ]·¸þÕsÂZwøÕc‚ò‘X¼Ì{¬H°°¾&…H+·)¤éœ.F)·M{?—ø¢Ž¶kfa­Ï‚'U3®R+§ZLÁݺ^™7b¦ô¾Û]55‰r¨–^%0ü^îtû U.’D׌2ÛÚ£¼-³ú1‘â©=?pôRm½ "éçÝ 2 {h÷oâ–@tôöî¾axçÐn4yÏHÀTGQ^-Ñ‚¬Ò–~1sIóVŒ±‚çƒv[þµ–Þïå¨ ˉ’»éÑ쨜}Ržô»;)%9p{ ÝÊ ÖJ/.Û¸A@M”‚ØýK ÕŠ‘žZyÁu"’˜…À¶ ÕÚ¼me\}ÙO¨Œ‡2Úföq­…tˆ_ÃÓÑüRò¨„³šnyÅFÖÍ+öˆ¥÷CtwK£ÈÒØ]%‚ë»ÎT§8½½Ó. It©•ÚV9H;º²GJq& ÌžÁ‘Ò@¬öŠ‘R¥´ŹÖ'Ÿžà– ¼‘|íÂSuü¸š&¡XGú“0¤xE†ø¬qŸR¬ê%µ@ȵîe¸Œ°KÍÃ8’as‹JÀJ×@0½“5OF´ž8ì[l£åÖÖgážh—èáZÆc˜E5«dˆÜˆ«PP|äÊé”Óú0Ûžì9±ËÌirÅÌe–Å̱mJì­’ó¡ý_§o¯m¸ä°±’㤧V9' PHFU¶Œƒ’ ÅK¬ú%ÍòêáÒ^À’Sþ¡Ý=~wO±_÷!rø®¦Žê¸frDx\?Îcù3í&ÏV9ãncØ’¡wy˜K=¢ÓñÄÒô’à÷H[–iÑà.[Ò`” ,›¼myk¥¼Å—.’‚ 7žÀ™puM4ú˜u±º^NC¼¬¡±ú9Åå]Þ‡…S…p‘N€"^õ›Ö6Æa·Ì{©º•aþedÇ%prú3”9ïEÄ£D8/k«‚çÊâ^`åù’ZÛ8“û£u•S[&×ð¯ÞPŒðŒ˜t3+°ñ/Mµ1CzV´æRÌ×6Á•ºpœ*çÀ­8¸‚@í¨Ðñ (7öpʪñiKà|„Pi¨GµÜ8ŒÇiŒ`lPêôN¦ ½P¨T ¯WÍÚ %mµtHH >9Å©R« KE|'™R?а6|bª0¯.9Á±éE˸îV/Àð<¸&ØŽ¥ƒÄ÷ów¬¹t—»Õ_§Ëõ|üv•'ïoã4§Sî{hþ-ƒ8]ù8jêÆ­õO<â®jB”âvÊÆOÊ<ße–èÓÐD ¸tX™P BE§±é¼ce²gõ¼B´]¥——éîÙÜÞ õõ 1Ë.o]ö;ºÜïÙÕÂaJÍWÖã¹²3]†¢Ðvˆ®¦XÝqߊïfß²Ç9îyß&A–öÂwO:ŸÆózª÷ÆgåÜ>Ÿ5/ƒ Îp7„_@¶SägÕPbeˆbÙŽç!è·ºE÷ÐÁv$Á' hXlžeÐÆ†5ö )|J€hÝCÀ‚¼—<ùGë&<š„#4áQIÀ‚ÆOèÐx´˜½ƒ÷Zoþ>~ŸÕÛ¬ºNX|ýÐw¾¢dŠòSPU»FuìhŽ|ÞÆV‡‰›á!x”L g‰«3˜íèआ2± ;Øí´ÝhYLU)1mV.Ôz0KàÌe‘­yFØg‚}öµbLžš\1±5Ú¢€Ÿþå=üìvÜØáGÔg]nµp´5~×gÅXÎÞ×µ=0@Õ~úbÖal¯_`ÚYé@{}ÖsSö4=ŠGƒÄô&5¤7HCkèz£e}Ï/*°ÁQ˜”G[O66ö!F4O Ï/=r¹ŸŸÐ€1G<‡¹duš³Z0ÿ`oªðÏ823ðÓ™ÇsFZ­ž-Tb{’Eû©¦>;~:üˆ É endstream endobj 7730 0 obj 4172 endobj 7734 0 obj [539 /XYZ 39.8400000 583.699999 0] endobj 7735 0 obj [539 /XYZ 40.7999999 650.899999 0] endobj 7736 0 obj [539 /XYZ 39.8400000 629.779999 0] endobj 7737 0 obj [539 /XYZ 39.8400000 583.699999 0] endobj 7738 0 obj [539 /XYZ 39.8400000 629.779999 0] endobj 7739 0 obj [539 /XYZ 40.7999999 650.899999 0] endobj 7740 0 obj [539 /XYZ 40.7999999 72.9800000 0] endobj 7741 0 obj [539 /XYZ 40.7999999 72.9800000 0] endobj 7742 0 obj << /Type /Annot /Subtype /Link /Rect [214.559999 594.259999 289.439999 601.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr >> endobj 7733 0 obj << /Type /Page /Parent 2 0 R /Contents 7743 0 R /Resources 7745 0 R /Annots 7746 0 R /MediaBox [0 0 595 842] >> endobj 7745 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1549 1549 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7746 0 obj [ 7742 0 R ] endobj 7743 0 obj << /Length 7744 0 R /Filter /FlateDecode >> stream xœí][oä¶~Ÿ_1Ï¢åU"¢@l¯ ô¡ÀbèCЇbÓ´²AÝ<ôïWR3cR%‘c/;Ãyxî7RþüùÇývüðøù?ǯþ÷ãçkXËÜÏqø÷ÝõÂ4R¸?;£a‡Ÿã×o‡—ãËáÓáSÿß—oOú_ýค›ð·¯¿>¸Åî“ÏíÿúßQÿÒÿßÏÇþÞÿúÑÏ7|áÛÁØvøã÷\˜þ®ÿÿ}øÛŽ¿ö ˜Ó¼Ã¿kµl­«àx9?ÊOÿ®E‹õŸðŽ uä\ôpêÿýçá§~¶3Q’ËNhÕÿm[Õ1mŒèÿî¤ÿY´R'ú¥ZËåÑvíQI-íwÙT|åDÔ¼ÈD'ˆøº­q¦ºôTUœwÙm³•ÛfO°•;Oµv¢®µe& âë¶æQŸ˜ŠŒzÓËV!ÔŸ§Z;‘Õ¢ÌDD…P§¢¢Þ0æµW+7z™jíD¼×²E& âë¶æQŸ˜ŠŒznÚR¨?Oµv¢Þ(DCÓ–B=žª¤é5R—RB—©ÖN¤L%t‚¨ŒJLU”ZªÓÖu·vïãL«‘¨m!²ñU;‰Îô©ˆÛ,.nóKâÁ‡/‡Ï\I3D _~ê9…î×—~³úøÝà>÷_øòãñŒñïÿtüòóáã—Îê«öHq«2{ZÕ6ÚÊN»ˆÈãЈùÏHƒFXŸiá:p„}GðN͆˜ïEdn·Ç|68ï6Ä¢Õã0'ð|N`ÏŒ@ÌSdKË’´÷PoBÑû ³ðP¸ô#ZE%(Á/XwÝxØ…{eÿÖeµ§Ø¿}TMÇïpé-mÝÜ~¶¡pÇ7¦pÂ^Cš Á–Ò`ïÅ‘̾¦P‰Uµ²3«Š1rÐgÀ#L£…åî ®Ãò×áÐS§Ì–àY¼SUŠZˆTŠ9R™Q±ûðD7=õ¸Ð×hÑ{<¨ËWÆ2—o´Áœ(÷ ј b5`ðr^uN@Æ«t ‹îP«å®öÙ…ëáIàÂ1JÂY1h^g, B…‹)Lc,k_AtŽU»V¿áÄÓKt‡ð™ ÛhÛnPf‹ˆá˜œóF«vør(‹ÛÈa˜YnÇ“E°&Ю‹]D?Âö(ìO‘»k 邤V2ÜqÝ£®Oà…„äÍWÓ´:01¶ ù.CÛÛ}ÂcÒ½«ôâšgN@äÇn t’8„M`pÈ gãб×ÐÁU`¤p8‚¡†M̆Sb6Ì!xðN%¯à~0lš@¹YY¨¨´ŒhC/v¹ÅÏq÷¢¯fx¢‘Q‰&‹>X®4}HN3Yg(Z?”"r¯˜í‘=•8Óøt3÷sÙ‘E#l´µ>Ȉ¼¬g.bžÍÂÙ…¸l:G¢E9kS-Áëø¡Æyû‘?Çu4ÛE“†ûñ:É4JP{K×6ÒM¶g^tÂwyæB ½Ì‰(°ah§ Øžá~ðN‹%UW"”cþ6`þ+ßßN«“+ 9rá7Q< ‡öƒTÛ¸5!»aR}µ–ßË 1½G='+Âõ$4_,Ÿ N¨•¹,fcr'srÜ™ÈGx‚¢:bñ`=<©†XW,wRpÚ #?…²‰g±#7›Žä‘*ƉŒ¢(÷‡}°åùlj¬nL-¤ø—á2Ž‚aŒÃpj`p[.Ñá—†pÌgc¸\ñV?i$;ÒwMü…Ø}Ž'Y)?]_åëPfrä+¬N–WæU`"˜¡ } "F`†£H5'ÚÅ#²‡±/}@0eézŒ›Èúàür‚ÂõÙŠÍÆÈÁjD)WÅEP¨\|ç¡ã~QÓg‰‚}7•·5•¦3¡Z˜æMšÊЃÕ÷jÝ‚(k±¼§ ŒŠ§Ô•3*²Ø¸•˜>2Ñ H°å êÅÇ6%ÇI¥à Bl1.)9’º(•¡gU!~¾ÈPÅÙI¤xœGÁõ8Ëe6 ±K"7,*DüŽy ")Â8©>3O¿5Y‡x²¨6ÕTB9D%  Úcn¼a$¬drMc …Í2št©íDäO»& Γñe´ä)cBZ.ï¡)kp#J©PÚãŽJ–w&„s”ÏÅ—g‘udæñmµNÄâC¹íØ[Gk¯?øå𹟠½æ“˜‘¤e½Ëmk’¾´R!ÖjãDø@äîMØ_’#Ó‡u²E{"Rea­-êVeá§ðaÏ£|*Ä m°l7[œ›åA6W{]ä5oR­Z–wí·ö:5R As!£¹$¡y+§¢>%e°ú¢•ã²Õ(."˜ªD>|E+:©¿`춈û–WeHšµ•O<ÙŠx:'H~g_2BIR™æFŸb?›Ýà[Óˆ˜ÐŠ$úq)š+*FºtM—ùĬ.'Ÿ –Dzˆwƒ¥”R!ÅzòÕ2ìÍÝK& eaoegöŠJg ”GlˆÔê¡èÑ8 ƒFò¶ÀëÈÈ%ñ-2Ž1D ò>0Ž2ŒGk™Sâ+è Ô,àJF8+ ¸ –áü\ôŒŽ’dz[²~ìÛò6_PЏ•oµ5êÆ­º\u!aqÿ>–Šûœp¿îÂý:6|0Àn¦Äý%Õoè­)R$ƒehK¨ç"„*Öì13NÛÍsY‚›á}3‰î3x„–"6‰ùœp»`6܈ï>‚½†øP2–ÎÄ ];Þ)¾" ÁU„®JÌ;ø€þl‡dÖNe±:Øy6vó¸Ó1™Ùdw3+v—¸ŒKÞ÷»_0ïL”»mž_D÷–¥A‘OÖw ;“±È Ì¥–Ä=uïg»U^?'kpûÍ[÷ÌåvÒmôx—ïž½8 ïn¤œèÙ‡e:ñZ¢¦l"ÜC⌦¤p‚öÅ"ï±unÅÅ·Ã&">ì«íÂç°|Aìss\%¸”cíÝ´bŒŠ$¾!w«~)käë%—y/™®»}÷T¸Ÿ’Ö•Q¥HVùXFå¶·"wÝ.?eGêˆ*‚˜Õöñ5½êÍ`o&‡3¾e½TJ&6‘*û~üv%¹óÂù¢TXásäQCoοKú$n Ü€i µKb§ø¦¼á&˜«þ7†€ò.#ÊmÀuÊÕtX#}~Oؾ³­†uãÛ³YBG­e-ƒÀzùöZ±¨e Üñ"¶äy;€›eF Õ)ü¶¢’±›ÅïZ2VP¡z.Å íZ˜ñÙ¼ù(½î‰ƒ{ê@Žž-z Ì‚òÞU݆Ç7(M¹”ŒÂ~n¦Y~!RÑWþ¿í£šE—­ ôÐ]'Uj*lÅLm±¦×Üa‰¼äMJ•Žk”È~âÃl¤.ôŒÛZç4må*Ù Wøt…¥¡*‹¹+¢vhü«)óÊ8„kIæ/äÉ\"¸Äª­é<ÁºÈ–¸%±ÈkÜ2üº7ÓS. ©rV©®.0êÝ]Ⱥ;5¥rê£ëß$U—1läGJÜ,tÏ5*² g:L äwn²h[Ä{$YÔ;-rYÙ¼qVŒh3^‚/£×µÕ=F‹!Ù²Ò/ø¹ë ‹2V ¸KÖcpW$V&‰z$®ŒÀgoÇJ«¨r,§èPXž¦ï¼z&ô7lyµä{öúªW)p=æ÷sšðö½LöçÑ>ÑôØŒë&e@ž%ý¤8#¶ê‚¼ÝnŠœ~ʸ·H ­è{„£u«¶ãT[N`¼¼(ƒï–Êh®N8̽áõ¶ô¡¥™ïÕHhq‚o@²W„>le]2¸¿`{EYg®÷¶Wh/#q7B]³& ܸÂćÏàÊaï²LÆ l®“Ám¨Ø‘"´Õ& 8›ÂT8ŒÅÁ*ĵ7wuU\¯¬fNø×„²]÷:ò¤žÝ¢Ü_—ˆƒ±â(Û—H¸õâ®;Î7ñL³²‰£HŽOï%ƒ–å1à‘7—ب#4áƒávp—;Á?T¸_îC8Ý2—ÙFžÅù-‘ï‘)Ò„·¾î>Ò¸b LœÐÆ‚_4:áÅ. J5[²PR û«7ïµßòŠRçU·ôZ.¯jz×r´| Á;Ú¿–»°AËá£J‰‡R·ÊÏZN/¸Éñ.µÜ®Oi~ÎìÁ#ß4W¹´¯—Ñ—´æâ‘5o8¢tJmÔCu³w(Ì ¼®#ãÄTÉ:Û=Ý.DjèÆmÓýâ%ßϼø]F•³ÒR†Šøý¦Ý›ÞÀ¯• )’Ѩ@yÓá,¶Éw}è´Ò«üîæ€åpŸùkÞãØ¥Ç#8÷G©Màªî™%@}K™ïü©µ„Ì“^“Áx‘£}úÌ+¢Åè-ï­ì[¤t{>Òñž6"¥paäŽÓF¶HTùŠ&º)é)Ž‘…Gp•ç|í1o¨oÝÐÂxÈESg·†`7ç ¡C‚-—·cð:e]©DN7QšSnž(}ÅLÑèåÂN¿Bí$­8wÙŸIÅÜÏ‹FØè"t:³ág.âA`àlÎæžá²éÂÃþÞ=Sá5R…ëxï¨kdèÒáo1ÚÆ7+GF´÷¢>|!pZ™³ÆÝeu5ò ±óŸÁëàÙž!Þ0.7 9_‚ë1lÑkdà3Þsݘð-ÇxȾx4·Ë Š£Aà+w¹ÿw|éå¹7cÃü¯¯ßkvÑ Ÿ’º!ùè¼Ri¼ßÆT¥Êò¶qÈ”ì|9¦CZÛ6ít~ª&Š1:E×tÓ×Ñw#Nà¤l„vb‡Ïè¯8¦F8Ú‡WyÏxŠåìÝÃv€\7ü-4ïf©íML`Þñ| £g| Ùò†¹¡‹jáp6HAÌoÞ™â7ÈCÞ!Ÿ‘,âD(Q˜œgóþÎÄ>¼éŸX'ñŒÃ—6£Æ]0’À1G2‡¥Ä70f`ùÁì=âµòc k>¸"¯É;öSÀb¡¸zÏö§’öìøéðŒ´xN endstream endobj 7744 0 obj 3953 endobj 7748 0 obj [540 /XYZ 39.8400000 758.419999 0] endobj 7749 0 obj [540 /XYZ 33.1199999 614.419999 0] endobj 7750 0 obj [540 /XYZ 40.7999999 384.979999 0] endobj 7751 0 obj [540 /XYZ 32.1599999 616.339999 0] endobj 7752 0 obj [540 /XYZ 40.7999999 384.979999 0] endobj 7753 0 obj [540 /XYZ 39.8400000 758.419999 0] endobj 7754 0 obj << /Type /Annot /Subtype /Link /Rect [135.840000 768.980000 156.960000 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python >> endobj 7747 0 obj << /Type /Page /Parent 2 0 R /Contents 7755 0 R /Resources 7757 0 R /Annots 7758 0 R /MediaBox [0 0 595 842] >> endobj 7757 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F1549 1549 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7758 0 obj [ 7754 0 R ] endobj 7755 0 obj << /Length 7756 0 R /Filter /FlateDecode >> stream xœí]I¹¾ëWè`äâR €ÝmÈ!€a99žLƒñ Îò÷S%•ÔY—ÇGV©-p·kaqyûúæÏŸþ¹ÿ÷ïû7OŸþ³ÿ2ÿ|ú´kMלþì§¿?\_ÃAÉÓ¯ýФ™þì¿|Ý}ÛÛ}Ü}ÿý¶ÝñÅùÇxóü‰Ó€¿ùm÷æôñÝéʧ§¿Ž¿ýo/÷ÿ÷Ëþïÿü87=ðu7˜núå×Ó/B 9Œÿ¹þmºùóîoØÿ6Na8Ž;ýûC×j#dÞ<¾]^ǿׯ¢WÄÐéqŠÓÑŽÛñßí~G»Lã`´}§û&zÔ^Nòݛ¾Û›ÖÓYZÜH"w # Ï@ÓŒDÖÊD£{ïH‡¡›ÿÀßc¾3Œ1×<~q®ã51<Ç{)÷TÆÓU<M3b9^<ÒxŒ²×mcø{ü|•ÐÇ…·}îÊÏ#eo¡Šg qF"keç³€#‘q ºã"•v+q™ç¡²÷ËÈžg iF"oiçÇC‘·Þô'¢![•½c= ý‘T‚é û‰jd-í¼õÎPY$ù"y|ó¼øîóîÍ3IYŸ§qÕN?>ÝbÇ“øÑêýç÷å5ñ§ýç_vÃa0M'Û£l7ß1Ç;¢=4#e¹¹óöx§E¾AܾóîôŽ8´ºÆ—.wtw¼#ÓÕY†œßŽwºƒ§{/wžŽwôå‚:MV4‡®7Ë洌ËùÞ¾ðÁºàŒ.æÑåA+k"õ®p.ØßýiôóXWƒÉãþ¼­žõâ­q¿gBœE4ïá1j8ùøÃj\'þ°3Gü=xG=£áñ¡|(½½±:xöp0çÝ`(^žü °ŽOË™‘´÷ªiÓÉ35{K´†SÃGðÎD>Û{c?‘0˜‹•ÜÍ ÁÂûÏ#')ÃÚ¦·ƒ~ž¨UÇ­½Z´!ø”1¦ãÅbºÉRmƒ€‡W윪ìÒ×å!1p]i¡l¨ná;ñ Ÿ±_ñ;BŒ—t. d ,åDS@)¨UÜ“X'ád]¡-œ:Ûç<±9 0ÌO<"0SxPø r'Ó¶¶Ú‚¥a€Ÿ²#wãcÇl²<‰IP0’!£à)ŸuÓQn˜=;*ŠÑŸt xöÊäÿÉ “ä!À+1:€ÔåEìkøŽQFľˆ|)[ òërÄ NŸ–&\O×4ÃãÕašÌ8å¾¹¾ðëîSuSÖ4‹^Ä› ¸„‹zÊ ÑU«ËO9a‚¾¢ð*mœRK¨Q8:^_¼ØîÎÈ™3LN‰‘êy|H˜åR´c?sŠ¡°ò–󍆭УåeñÎaVî1àÅçˆJ½ã HA ø¨<)Ì j1ÉŠ‘ ¶Û ö`œ³pÒ)t#,°&PÝxÙϵŸ¯Í,ïʘ žÍIØá¢¼ÙXÂ@ë$bê#©ë…€ˆç‡}W'Ä[{Ð!ù•ÙªwµÓÏh§•C Ÿ ¼|€¤ïc ʬD/©× ‚Ô;À× ùòj¡a8ˆÀ+vfÒAŒÄwàB=SúPšqÏæ•i‡n¶rÁœÅ 0ÙsÀšÃÖï!¦oÀ8q:vshD{{.øNŽì¼E¿X¼òLòÞùî”â\~YX «¬uä; ãNX§‹Ä s—P-+A¦DË–­ˆÏRí’¥ú]JÀÎ$Oˆå Ó¤„ä%Bw±²Aiîè ' n©¡sb;§ö‹œ…aRÒ 9äg^wÏ ålÚ¦µ8DVÈ!¡/.½zgýÐð†¼z»²zÛ«³p39eµ‚>…Ê·R ÎpÈEÌáÂe «{tW†Ï’}'{ÃÉ›XR16Ë­*(‘½ ïO‘¾%a_aJª ¡7uŠ~ÂÚ2¬0èy+\_9ݪ%HJÛV,Œ]e{Ät?\h¬(T·![È~n¬x¹0îçÐì…ÒÓÏ©ÍtUMWŽ-§yÌW¾Œ/ɃFÃËSâvqý™éùB7½¸·­ý™ñÊôÒÍdŽOu·Ãt·Ÿùy÷î¹­†¹ŒúXÆb\ð¥o&ŒuW-¼ó]p^Íœª›tGáðÅE@=Ñ+òÔÌèj³<é 8Æ›xFƒŒßñìÂñ¬=!éxÖ„Ñ<éx4œˆ캈U&IÒE’t¿D’&ì¼¥ã‡$Ÿ·Ãˆëϼ$Ý.‘$­Ïh—$Ÿên‡én?S‰$µ"H’prždMf󤑈„GhkKî”ð@nàATIºCRѵ©èº%RÑ 6WRq|JÜ#®?óB*:½D*:å|F¹¤âøTw;Lwû™J¤¢8+Ìô0rÃÑ<9|„ì14*ØÊGøÈ‹RÖ6n™¼ÑqÍÁOXì“È;Suž‰URŽ*‰¬ù3< )aýé.^§C©cH¶wß}âÉzBÚÝ9#ñÉÃdCv;£Õ’ÝÉÙ€øªc^p}ü„2ñI"¼g ¸P»à:‡­~3 M^eØAI`‹ ”©ÒqPez.„3¸†4k5!RŠm',áâ+rBLg¥²˜›ñESzþUê½IòE;ŒZ¤p>ŒÅ-ÜÇuŠVG%®QjÙÒ‹ƒ•tK›Á¢eð XÛ;„ùVJé ±eíÁ j§>{X´F[º~Ÿ©„@JÈ•£I$0Ä„€’G°[®Üu°›n.ñe‚„»¿”Ì]ͪPŬ’E-0NÈYw ¡TCY§ƒ´ÏŒƒ‹ã'ÇDñ 1#>34Ež¦&•s^x#8 ²Jî@8e7ï€5 •³•YÑ,m³ˆ×YËîÕO¡,clMÈGÁD×ÔÇZ±a-Qiµ*e¸.‰Q쯕* æ8Gêö,iCRÍ6îÑ´A¶§É¦Ëp4Ls±%®žÖ³Í¿’í?Œ_ Y<²O|9¶ÚY.…”Þ²TÉ5PÒ Ü”ˆ(Y¨ÓAyÔ\È’ŠŠÖ\x¤PU(mo”>òñ´À‘›8’µ†'4P9×zÅj%ïÜ`„¨§iŽxem4T$®5-²–Ð̇27OSJKŒP~JyIY7Âd'¬+"¢6¡5,¦ï؈ïøb8\ŒëÙß9¹ÿö{°ÇxX¹ÌÃ}S©†f5_¹V—Ž®ØÌƒRˆ8°ý7bÀŒÒűMÜù^üfU 4Ž×ñîÛ"½vÃvz°”»aí8¼Ò,­­ÂÕËW°kiÓųVÿb¥Úô<Œ‡¥E\<ŒF8â£â W îi/Ó{K õ_w¨bظz®Ñ½0e޲k,I¹Û'.%àBZ4§¨¼ƒ¬-Ù҄C‡.j?© J¶ê®‰÷Jª>+Ii£V»?-aŠ–¹(lÈ]ÈÒØB˜Å’)³ mä-0™¹fÎ5t§9oaßÚïˆôwÄ[øŽAïÌRŠP‡“GþêÎ,´´îÌßæ~˜WwÔ FÒv#œÛg4§±åé+½k +œž›D3˜)SPެˆw´–ǧ•æöà“JL°t#LhEá?”ÜØ2欵ƒ¸¬‘býàmÛÉbyÎQàî°k¶ëøtX?!ï„ÇAÇÒ¿»l–çÈ•$ûz°è>©H‚£kQ( |'‚ÈæüŠ'‡.Åvì õ§8ò)§UKÆN)X‘÷â~퉃 ùê÷ v³69e¬þëù¬”ËT|!^ëÒÁÐ…x§±­Ìs ÜÒ6;Ô´‡£b~"à;l¡¬¸!¹°°ˆû(ŦºA~OÛË¢„œcö.nG <µ÷ðlœmu L`&×”Æ"Ñô¶A¡ZTT{ AÇ6Œÿ§#}†ëf$DtdTÌYA_²·ö˜¤/<ÓeáïVÔÿNØ©¬k”haÚÀÒA¬R>¯Ç ›c}+œBÍaL\_«Ä‡ŽcÈÇ’e\:aóœàÅN°fgù«“m](É£VÈÝgT8¡Qi Lq«2R†Ì¿£äÒÍ¡¤bÜØh›•éE‰J`õ9¥Ä”±¢k|@TDJÍ:uñJªµ¶·>+æ·üÕv]8W÷4¬oxÏ8KRA‚BÀZ6jõ ˜å0!§*!µ–‚9ñ| JLÉœÅJ®£’EYZeÑ´»ðNU,ÑщK‡ï ÷aT°ü.¡ Å;“^èŒ3á¥pc7ÆTŒu”rT”V³˜^°”rTй(aG=3À|ßaÝ·ZM‚ï—ÆöJ…ñl}ûH‘ vd„å,ÄRè¿§”†ÿJ2`UÞÔž“à”ǪÎÇ\¾º}—Îw [mCkœO5ñ>ÏSÜõežJIòÄò ÁâB±Ðy Kß¹üûø­È2uh§ÂôÚ¤ÕJ³~m’çF¸½Î±“ œP<{}«.ãîá&æ3¸ì¹Äö…­P_&|®© ]–u÷¹âL‡v…¯šÆ²´–Ð1íp Q½Ù*`­Ö Gš8aYñ}°×¯õtב¿Œ!=eR*a£%n¡„ŽU&ÈÁX«þ~qµF³±ÂùiÒ¦=Î`%c…Kò“9Sü v¶ç_« NB•¥pïtRX ¡9ž‡;´äb¦¤Û$ToçÂ),îËRdÕ ËOææúá— B)GJJ-}R`Šœœ‘ÑëI¬J*§ ÞîÙÃýñp0ŽöpÜ-ÄoÅW‡ªK£¼­( ßô5˜¢Üeˆ>½:gÁ3¨gšñ¬{¤®£åpË'<RW®îlÀá<ž‰nowþøÕñïþÛ8üøêôøüãËWÏ÷܉6/ýèª÷Õpn/ÆÍ[JG6¢;™¼÷êâ7žEÀ®;tËn:£§óp^ö‡~¹C¿pçDâ•:H³Xv°mÝÉ´ôr§‡ßà;¾sÊ^dsìb3Œ¥ÑNÀ}å>;›Vø½3›M—î´ŽÙ—öÎ|b)kW•93 nú]¶¢žö¬À'ÁÀ°á`ŽáY€¼³ølñÎâ³½f2;; Mw“óév‹gÓûÒãÍ¿¡vŒ”nÿq÷•X'M endstream endobj 7756 0 obj 5026 endobj 7760 0 obj [541 /XYZ 40.7999999 628.819999 0] endobj 7761 0 obj [541 /XYZ 40.7999999 628.819999 0] endobj 7762 0 obj [541 /XYZ 40.7999999 312.979999 0] endobj 7763 0 obj [541 /XYZ 40.7999999 112.340000 0] endobj 7764 0 obj [541 /XYZ 40.7999999 312.979999 0] endobj 7765 0 obj [541 /XYZ 40.7999999 112.340000 0] endobj 7766 0 obj << /Type /Annot /Subtype /Link /Rect [107.039999 638.419999 185.759999 646.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7767 0 obj << /Type /Annot /Subtype /Link /Rect [107.039999 322.579999 185.759999 330.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7768 0 obj << /Type /Annot /Subtype /Link /Rect [81.1200000 121.939999 159.840000 129.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7759 0 obj << /Type /Page /Parent 2 0 R /Contents 7769 0 R /Resources 7771 0 R /Annots 7772 0 R /MediaBox [0 0 595 842] >> endobj 7771 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 7772 0 obj [ 7766 0 R 7767 0 R 7768 0 R ] endobj 7769 0 obj << /Length 7770 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€•ERÔØ3v€6CCàÍ&Xì.âä¿uKêî!õ‘,²HuÏÈ<ãf‹"‹Åzóã»?~ùûñŸÿ=¾{úòïã·ùçÓ—C]Õm=ý9žþþpûì+%§_»^Wr8ý9~ûõðýøýðùðyü÷ûA´ççcãòŠ©Ãÿ~ûíðnzùaúäËÓŸÇßþw”Ç?ÿûùø×¿?~œû;}á×C?´§_~™~RÈ~üÏío§Æþò»ãoãús¿§hu+dÓ'ãûåQqþ{û(zÙø‰¬…nBÈqœz$Çþqøiìí2Œjh„èÚ¦«ƒ{íä±ÃÐ Ç¡kR+«Skna]‰´Žd-•àèh‘H›š¨›ÎÝU$éÇiöê>2MR%²üMW©u\{ç4"‘6µ…ò¸«hÒ÷Í4ÍA§Îsé)™`CôwN#I3[{ªúF ÕIÝœÖàDÝ÷rü½SóÊćæ<ñÎÖ&TÎ=¥’PÔ-×¢Ž#I3[Öö»F#£åÙ—ž’é®úš§£ÓˆXöî)šîÍlU$«ÛKOÉäjzõq‹ºÅ=EÓ½U³€’§yé*µ£^2ut‘H›ÚBy««Ï,Þ‡¼zß~øzx÷i\ýþäl}ýiÉÙc›~|§«?œ¼qù¿þxü}]‹æǯ?†JªÓ“‹çk©5½Åñž°¥…E~€Ï<Á÷ô4€#¨}>Ž÷À±Õ¤AE#€¸…•nx¦˜:Ž@ê`q´ÀÞäûsËǯ£ȾŸû!e?—â1LEÈŽQŠžé{NŽU ¶D¬Äüw ž)n3UC9^§å­ÏùÇ3€Á4õ4˜V.T›hªÑî8æJêúÜÒ_?èÎ4U3 û†Â lѨE áÝO ØU5`͵øUG÷xŒøÅ·µ Õ‚‹Ÿ1§Q+8 Ü}gÔêun=/aÓÂ-­98á¨ÕÁüˆùÃ’E¾I– Qé¦=M(`Œx$Ò»\ŽùY_D¶Ë{B–˜04“6Ä2yM~òÎ×”³¢+%{!µ‹f½Ð‡°5v¼z&!fe–²h9…»V†twl+‹‚…-p²³Ž[[ºÉië LeÈ3¥ÅEŒÂqÑRæÐd ãµêOL-ïºQäbÍî°,Û¡3ö»‚΃Ã=ÄÏ`÷Öç–rÖ¦”³¸˜ ⱎÁ‹‹¥jŒ!l©.øâF™¼j1/Þ¿L"™ºlþFoHZï‹eI¾«êP‹„w‡‰Ð¬=ƒ£ÀëÓà÷`>€~9ŽGฬƒ8£Op¦óŽã÷DŒÚ±çp<®O JEú0W‹Ü¨KŠ£™­‘ªêö¥æ"øMØq$x6^WÖ¡K-Ë"v%¬U”U ‰ÕL#‘ÕÔW¤%aÑ(mQËv¢Ü]<ÄK„ÅŒŽ°Îx–ͱ#Ð˲ùÔêÕ¢´Çj±MŒ›—`ecÚ8|SV® |ËN£ 1O Úâ-‡C—¸·yϲùc¤9a$˜&þØ!T•ÕŒpAY¬Ã¥€Ã±5=N‚sš‡£ü1hL’€ xxÂ, zhEšc—9c[!Ds쓘Œ…õâE€Ë’ð 7 8ÍôŒ*iô. •“tì…˜89=1ãà–ìÏZá«uÊçö—"ƒI¢ µp×u<Ïž5ª®Õ/=J¡à¦-s¨§xqcéÈöŠmLŸa[D~¡Lúû³2EøB490a ìÁ9e€›÷#Ü‘ÖR|0?À¿ÎÍKR›K†¬£œƒhµ1ˆ¹Z+Ä\Žñ6YGÄÆ•ÀC£HôBþO‰¢SsÜKB&k¥„ôÉëךC$8p„xK(Ö"y@”qÒfkAðY^éå=¦ºY[®PpùÙÃú &°aJG0“àõd¹à%ã.m‡ÖÜ¥ uš#BÍ[oÄR©Cî¦å‰28¬Šˆ5ˆÓÅÄŸÃ yj*Y¢œá¡G¶‡#¥BPv$†•ÙJQßHµsþ|uSwþýËX>³ðL3rpeÂæˆ o^íMØõÑ=ùœ ½Qù"q)Mfy츋‚63nÉÄ[ËêH4Ùä– Jæ:‡ž•U‘.a9GÅWúéSX&ÿÕ%n8ìåÌ&Ò‡€„ì̵y! ÑkcÖ{()äZfác…—º%Yj„°k²³PX,Á1ÌZDÕ[»yžG£Õyj7Â8¢þ,F? 3”©vOÇ{/7¢” Gˆ<ËþLñî_{Õ ¡š”ã}1çOâœP9Ç*’q’PwÄq82O®†RøJ!‚ªáÎOyþú*ij+;þA`Ä„XMJÌÿ•èQÖJ_oº€¿Ý^,„Ò)¦Î:‹ãMé•Ã"±s>1‘†áåŠbß®¼°pôDË‚GÜ6&Ï`«rjuÕvâ…K@Ñ.áÙ\‡!c‰šS𤷱ÁqvåÌ16ñ¤°‘åO¬uæ¬Ñ…¬O0÷ãëo?øåð%l$Ýö&»ku—`Ü8¸œÐ+Á²&¤œcN+∶p1³ÁÕá‹^÷G1¬—CN¬2 /×c¨¦°Ç­ÔPK½LzŽ•Ü<#èψgøÌŸ¹rŒàÏŒaØW 7ÇuWZf„ÓQL¹¨›5/•4ÓT5|h>bÉ ÍJ(dl˜jzèªA¾Ô\Ž™Â(hpÅ °æƒéVê¹V­5¯"ôz LuñQŒgÑôœÈsöñToadTŒ?¡ÛÊŒDUYôå(Õ‹ D²vFÀHaiŽŒ@Í÷ÓV ?ÂÍgÇvò§CúÞú1§TjZsô nGqX #â<„cÚ„ (fÄ„W–ºáûUÉþSàØ-«þé~ji \w†ÝžaôiÖÄ‚2ä~q0¢˜c^£%¯Ëâàslò–‹ûz+àê&‚£c(gå>AH*o¹nß™Ó6«uïèÄ3,„Ùp͈Rf'X2ã‘d¯¦½4×ÁŠœÃ4åho„–óãµß‘C_ øÊQP*íe¼÷€º§Akf?¼¢¤% eRâ1^]Äѹà³&(5g5=t”@‡-~‡¥¯É†èW^]¯ûf]Ùç~mo¼vÉØ k¾”ç†0Ÿàak ¥+ÛØ GÒh:ËÞjkçjÀù1+þ¸FìFNç×-»‘sÿFNo/ãƒ9½6%!ž±9€;3}ýFÒjÔ™Æã49ÃAÚtr“½ &WÞ¨SïVp8òRŸ‚xXà  æ„zóíwÞ %GfÃQ˜R-ŸâˆÅU‹IÖrlu¿OZúö¾Qê¬i ŽÞ¡F%¸£)i}¼k½ c•Ú«˜à¶ÚK“X..)Œ„žtkmæÚ”£áñ‹”38Ñ™öã^g°½”/ÏÒ^Ѻh.e9µe‹ ¸€y5ü<7Ï¡iÂû’¾L d©ëTYhî[±8‹9'“w%eq8nRÊ 7%|¸½´Ï_÷Û™Bçv šÒºíEr€oÁ4BÔU¬¡æOJ´Jôx3°\Ysê.O$å†2kz˜ øÆ„³&3÷Ét‚&3~„Ø|ŒkwŸ?ýT[»t¨ªP@B›BæÐ#]^êÕåüdp”*‚,,Àç£Í#Y}$ÖDÎÝÚ¡Ršœýhå,r.g¹™Av¥&[i¾“œ­Í¼®Ý`J,¸FQà¾Ð¿(Q¥Ý­Ï­|žŠ¢û9—ØðáÞcvëf#¯¿Ìÿþ½Ù•¥PKó¾Ã\ã=iàè ÊeGotÃrÓMÃL·y‡¬½¶ì´vñ(¦¨b˜ñË€ÑXòËH_‰÷œ7¦–¹é [j¸ŽØ2Â4àÝÙ‰¹|ß.m©ƒ¥dÕ‡x¦~‹Øx¦2â¼0uf0GÒ{4~OÌL#ä­cl1\…eU_&"h€çSØGÁš’fɔԮúâqîÿØ\ž d/ŒW†ÜcK)¦ÁA´Ì°É];³u ÜÖ4Dæ˜æöÀš[ö1ÑŠö¥ŸÄr1Bû—‹Á]©ûfòõe &ëR*xÂËë’ðYëÑ ÜÆÝâ¸Q†PŽ’¤že!5iv KmA–Ò•{©Iä†Ö$Pàu6Èy˜¿Ñ†ªØœ›6KÆå)faÍðr¹€‹¬ þÃ#ä'Uî=²øÉrˆà7Îq9ë:ÇrxD"Àê Þ9®x/™·î{¹ì‹·æ#î±À‡Šúyy~úîâ×ÅÍ7t ôZ&`ÁÙf:•·µ1z7º8å8;åè•eiú{ÂivØá0IøQŠ­0ÀàRä5œJÅ-h¨‰qÄ~5•ŠßQ%DŠ« œbÇ¥ ŽXPõgʨ)të°Uo°…£~ ×`ëuñk\߃[þ^Øâè z*ŽÞp ö•j:Ý4“ùEOó¨'$&+PˆÚ’ƒVà¶IÜv0‡þÖüóœ×.´Ú î[Ëár—kà¡å¡æÆƒOÁ»Ú&6Àójdclm|§»Ã‡‹¿ÛøRòµKëY¢áàédÀ±Cp—yo /Ç+…Ži”›¨0Rž!ç„{XE2¾t†£p…–ä¨LŠŽ¥ä¹­gY6WóÊ#ÄÔVv¸‹Àˆ)0º xð¯D”ˆm»†³s4¶€Û+–´?.¢Œ*ÞÊŽÅ"±Ë[2×ô‡VÒŸãvåÅ‹•Ÿ> bAñˆ“g°U9µ„¤"rNá¬æ<¬ç#5`$-gþ¸ˆ±‰'ÅÌ“õ•'O¬uâ,YW§wž*èûÛ~9|qº<ò4ƒÝË3]„^þÌrg=%ÇzC¡Ã¿h„A›öÇ3¬AÞL¬¢û—ë1TSØc5j¶ÔˤçXÉÍ3‚þ ÁâY{^øË’Úõ6‹QÒOÑò›–Oô¨é=¢«ùróIÖ¾jæ•7wE[ÍJè¦7ÆvÍwYóùçS¨"e8Úš@áÓ[ƒ»o~…GÊI“˜ëŸV‹8ó{np/œ9­ù Ë5 îZEa²œl‰*²vF¸œ.÷²†ï¥!& •ü¼¢1‡9]ˆÜ·¼X„õàU7ŽbƆ'œl°nN ìgoÀøŽµ·ÿ“ŒÁ¯ÌàÜkì”pVðµ³\þhû’¾*_2ïéƒÒ怄¹,K9ŽU±$Ü¢°Å¾~ü­­}3:¾îÜ:M€obŸ{ùE-,r‡És^7žß͔«eJúÞ–'JµÐÅÙŽt,!(†-ÖÔq‚n‰¹ç5ªÔŠ£PìÁ9h^7Z”‘Œ9öfãÄ{-2œ± p>0«D >*!TøXåäTüMÊy-‹¥ îF¼ Ë"§jzƒ¦þ›”ËØQ¥GůÂÈ B9¹fò]À¹8²öÍySX+Ì=øc+EVFð–/Ö¼C3ŒPÑs»SBé ÅBŒ1&"j,Ú<Åê¯líÂQÑÇÌQÌ¥Wbk½ÀUÂEvQ§nX áþ¸ûS‰wƒ;tC!Á©MÉÓáú%¯£°}ø}¯×ðñmÖ««{CÈßQYG¡ðÞÝÔyà ì«{ÎÉ]#r2vOÀ§'à œí’&“OÐx#D'X.)µ|¯uÃouþqîlZcÏa¼ æä@öÃh€ÙóîªiŒ¹½]´ò9•…æê²à'¾ŠÛ²Ã^ù5 yË®ñd±J)PDb=b b<¢¼ç¥jlF2sÔVªúR(8õmÕ® ±¡©@JvU·®y»•–iÙ”ªä°ZX¬uÕNìoŠýµ÷ôð™>3Yh¬d}ö`LöXëm’·Ÿ<ÃïÎ&èÊ ?¡gfÕ¾Ö"Ð> endobj 7778 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7779 0 obj [ ] endobj 7776 0 obj << /Length 7777 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àhćø‚ãÇÈ!€1rrf³ ™Eœ=äïGj=Ü&û£ÄE©mÙÀ¸§%Rõ®b±ŠúüÇo/þù[ñùþÛŠïýßûo§ª¬TÕýíï§Ë/¸)ï>jS—ܶ?Å÷§—âåôtzjþ}91uØÿi.è&üíû¯§ÏÝÃOÝ7ßîÿÜ|ú_Á‹?5ÿû¥øëßš??õóµ7ü8«Úÿî>0θiþsù©½ø¯Ó_~WüÚ€`Îó¶ÿ~RµB«Ep¼ŒCÙù÷r(zXó gJó‚1ÞÀY7äøï?N?7³`”V2¦•ÔÕìY›ùÚi…(ló³Ì›ÔÃmæTK'2<ÑD-Dlj¬’:<™ôÆÊ3š¶^L°~¦Å³Æ$ba[„Ù@x8•î¼öŒ¤öÕ(Ëq¦¥ä⌥aà"¶³žîx¦Ò¨þ~žósÆ[™Æ¨U²±“ÉØË{ë±X­Æ™sE0f¢¢$j…g"Ó](“ˆîÃL‹É%OÄÀVN“ÐÎD¦{=ØŽÆC-D³Ne†”Ti&j!bËP(§*Lh^Ë– - jcx󹙣û‰AÝöº^û6-–Š6‘Ù02‘Bµ±e¨ ìÀS‘5ÁŠºe«¥ˆŽS-œH0žH¥ZˆØ2ÔÒ㩨¤o\G/cL'¢95½qý ,)¦<æ=¦ˆ&H,–—wfrYÕíµ)—µÛSl70Ôü6yºw;¨ø€7Ö@È-¬›$Êcc›&3Òʰˆ·—ùɨ ·LåèÓªðXŒ¬:`ê!ÜàqXU*ÍLÎ+©;&Wï¤Kò‹;:ùÐeåñ­»µ.7Œ×—ÜcXåLß&²”ÝžÚ]¹"…´‡EźǔÆVê h½Š°z€íõÊ„Np1VÖR½¡§÷`þÞZ#t0 Äñ0†$ï]þÉ­Ëbç~«’ŸÅÇ·WãCùÇõlK ë¤ñ”9“D@ï’Ï×!ŒÅ|ªù\rÇ †ôÞS;þè~1m(LºÏ`Œe%˜8{}M^?¸¦±®IÇ:üL—os•Î×±¢Vsæ’)í"y/¢vm6½¶@(¦¯ ᅵпºpÅ8<1ó=Ó# f„'0˜ÿ¯æé„5ÆŸ{*Hpžž# ‚ÈùaŽQcˆt„6Û„6+Ú˽U“ÅèÆÖÑ7r‡³lŽÇõ–k‡ hñî¢:cÔbh¿ˆ‹1»-{¢ÒÄëÇH̨)žŠp­ê·ÉϾS\x„ ‘2q\†u'âW®\¦ >–ƒ¿Ôx_?¨\ŃdúVþ° ¨ˆ`#vîò1ƒùîå–ë¸E·€ÞúÂJ”ífÂö ÞP­ð6#„:pVQžÃ ¦é6»j §0ŽXô*·„SX CÈ&`ƒ¡®ÑÀùÌ@…ó>"Ï£øRŠ¿Hñ6oXñG±H¬ø8·ˆSJ¶ÆXU“%ž±(ÁªúPâeÞ{ª¸ä&•øU, SŠ‚½VU8Û;5#«WðŠYWO§Ó”冿¼p)6?)•vé-½/¬ä)™Ñˆ…íüô.sSÒ+ío¸³Êx&†רÇíOÍÏe‘r(ÓÂ)NAjC «‚KŠæïcfLðJ• ZXJŸD º‡ 0Ä Tã5âöéêl›wxáð'påèMÊYåÊ+;Ô$Z›O*ð&Ó»Óç£ÏèÝÕçç°\¦hì®mŸÍ«‡•MÆ3þŠ’u¿éÃIõz‹ôn±Î-c;‹_»T¡n›¹j}åJoÚ®\éãW]ZãŽqAêƒà ¨1(ì‚âazçƒíʸãé¯PåµEBž;÷ö:Ã샫3×fÁ`ã1¦L=$í©OoÕtNÏC`éâí.ÕXL5ãdÀ¯±Â+2¯ÜÀ]¦¶})+ΔuYtÀ|ÊÇìH?ŒêÔ%eŸ  ‰b„#rT)]1U7“EW”"BÈc_æ´Ì¡T$`‹à_ -ð¬ë”¤lÚ“ƒœIÝÕì]xJÞ2à+<†Lô ‹‘ñóLu&aew®Åò²®=hWZ!—TÀG<¬@çÌlòzØÐÞÁ¹x7ϯl¿šåx-‰1ݼGžã,Íž¡Æ»²”ó‹ ló‹pŽâ³àT“<ÖA/9óë6y’ö”lð˜šBk¬µ3îÜMIéÎi™Xù i&‚,˜ËjØkÈvÒAH%M›[ðõ£Ÿ´û ýäÓð¼·“)rÉ!$©ÈhÁ¥˪rYpiÇÜmD%WŠWR¯¥)³ÍïVÃídéJ­E­O™òƒ·xtI€æŸ>@êÄžÞ©Èœz^"–IºêV--\×’ Ë»p¢¸ê„gM)aÀ'ÇðÂrý G£]êFœÝA8K-ྎê.r¨µºufX5p• Ž @=ŽåáZ Ǿ”¸€˜Â'‡•šæ0a]Éq[¥ª gÉ ¼ÇÕzÎ`êd‘>UYµc†”¥Ù>O´=” ÃVB ±E½n”ÙöQc®¸ÈÌ­“÷eØÏ@IJ,c·©µÛÓ-ƒnNd•OnÁçcç=@nÆùšëžœsC'`ILF¿ìÒKø$M'­\E—"s˜½äÌmÓ$ ’Ç6aÈ>r ZÌX!$­¬¸ÜDÜZ3ÓÊ éA‰v$âÕ}€a®lâ‘„¤âØ^:ð`ÏPŽZLñv²‡sP@à ú/ÎeÉz\&V¼–9¯â¼B…šbïŠp¸«ìîàeÇ‹y ¢ß &øX%ߤ×’œÁ¶ï´åJ8Šô~²¢? íÂHLß9ül¨@p— ŒÖµæ¨ôbU ŒKúÝ[©•_X(µC‘@55¥Â—°{ÃW?¯¾®ê)«ñ^è>Š3öQœaÇmâ£A%hZn¶AÅš-HGƒÊÑ ²†ô‰jÜšÞC¿µ’í½DåqåXÓwLëÛ<|J@[“±ÝE4brhú2Mß¼9ã½éó:j6ÀŒ/C:ÚQ#Cûg¨o2BØEÛ«`Çq‡‡?[îÏ6o¬ß›bÃ7¢Ïêïx‰ü¤]Ê‹JprÔïêoU§‘ôõ¨Kêí(gÁ­ôˆÛ¬UŠ áý#üaX¬ÛÊÝohž dó[¼4–©³qëÿ|ÿ0¾M­^mêSЪ‡N¿ûL¬Aãú±uª+X)ÄxàMÿJm¥Ju}‡ÔÊÒ#ZG®KíŠKÇ}åJÇ!Êv³Dûý-u]ªŽé®Ñ¸öÇX8¦s?š—¼o_2|gë„îò›xo_~ïhLo˯]aÞ\Äé9ƒ{ÛYH]û™×LOr›}‰—ƒÞæÄÉ”^Ì ^Ãç@yÀÜÀ°x‹%å‘@,ñ|rQ?'@·dwð’&c|ð Û}Ý3¦R%kÏUy«„Xm6Æ›­O)}añtú?ÁÙÑÏ endstream endobj 7777 0 obj 3012 endobj 7781 0 obj [543 /XYZ 40.7999999 179.539999 0] endobj 7782 0 obj [543 /XYZ 32.1599999 206.419999 0] endobj 7783 0 obj [543 /XYZ 40.7999999 179.539999 0] endobj 7784 0 obj [543 /XYZ 33.1199999 204.500000 0] endobj 7785 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 144.019999 119.519999 151.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7780 0 obj << /Type /Page /Parent 2 0 R /Contents 7786 0 R /Resources 7788 0 R /Annots 7789 0 R /MediaBox [0 0 595 842] >> endobj 7788 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7789 0 obj [ 7785 0 R ] endobj 7786 0 obj << /Length 7787 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ) ¬ç ‡Èa‘CàÍ&X¬™ì!?R‹R÷ýQb‘b«Ç=xÚb³HÖ›ÅbéãŸ?ÿ£ú×ïÕLJÏÿ©¾Ú¿ŸMÝèfü©†ß縩?¶FÕ¼~ª¯ß¯ÕëáåðÒÿûz`úØÑþé§!F€¿ýíðqü0>ùüð×þÓÿ*^ý¥ÿß/Õïÿüdá _øv0>ü:~`œqÓÿçüÓÐøïÃßþPýÖOÁáÿ~ÐÊ(ÕȤy¼Î]Ùñ÷¼+¬Â3¦bŒ÷óT=:þûÏÃÏ=´yu'kµl›ÕP[~Ûªªkue:¦·´uX* ®E@ÃŒXÒÊX#Û $2Þ±Õ©ÔUN’Ñ%›. aF,ieÞ!¤ÚHÁDË•h0à_ÃûÏ­°?1 ïõ@ZL’Q¨ú…å!ê ã²ÐB"ˀ棠·¾>‹\å)]º3™õ3bI+›ð!‘ñÞ*Ë¥L¦.s• ÈäRúÃŒXÚÒ&ÌcPYÕOǬ¬+žºøT" ÙèLFe˜K[ÚD Š* ’ =.³'X"ÆfP©€¸Î£‚Ž3biK³¨€Ê) =¤ÑQmêÚ'HÉH™¼ÚãŒXÒÊ&b@HµÑö~^3Ž‘¼¤±Ê(mJNö>u³1ƒJ%‹Œå¡ï0#–¶´‰À¨—,ûP~Ú‡¾:~úrøøÌ¤0öûËÏýL†o|ÿ|é—«ªÃ.­áÕ—Ÿª?60ª¾ürèjÕ &ó¸Ù[šO°¥C-¬…-¶À0 gðly‚-<~!8ÀÅ3€Øá£ö׸ÏHí§/=¿nÎ}œm²î4 æâ¹"/µDW&rõ1ר²ê8d''ä<‡4'IÑÎָߩ#OF¢´u㑘£–¦]‚ê;J·®93¥ûÒ0èÈzÇâ-VdzÞ@qx†} Z“rk†aºuÖæj$¥¬å8»3ì+ÔÂ]â.‘ðŒÝ$„ê1œf&ùTNô…4“èCêṠ}ÌeÐé¸Ð|cå.±¥÷!àÂ<\ìŽ`§â ÓÔb§ ÷õ²½8Ó¥–235úî4¯gÏNsa›x%woÁñ’Òa U nWQ®‘`Ǭ©u{4_ØiâOî×ᓵ¯ž_o›™Ÿ,.ž6ãñ`ì?0סõ'ݹ./žÀ¢îƒqpz Åsó](èýø.”‹>k‹«•Ôo˜/à /:÷ b¸0bÜ7£“@6Ÿý1øå­‘YͰØ9÷g„|ZRÒι6]£ß®Æ¿6…3²ª|°Jòäïd ø’ÛÙ‰E·!o$†A·GU. v¼±ã]€€»…›tÞ8î“-°Ì}ŠñejÁÈ])´)(JLÑT±´´ÛÞµTFML1±K«Õ[eì[÷®¯â±AÆ~Íú¨¢¢Ä*>bÒE#’OÄrÌ* £¸O«€@|ÏCÅ$‡<ŠëƒGw»±œ[â>‹~p` â9Õ&™¦DW#PïK¨Û×còˆóo[HBV¶ã¨Üµt´;V¾~ò”0LLåešƒb¨a^v¼½‹0Z”UlƒúÅe­`—oä¾ÞÏx1‚Ðë}9R´ û ”q2š6´]cnÙfìXSï'ЈÝí'p½µ\ ¾n¿¿ÕÍü D )F`ý6¡xú¶7U”“ Ü’bD#B Þ0»ˆüj¥ß-îèGËñÐ@ •2DdqÄ·àX-Œïbµ„ø;ŽVŠÍqºSŽî˜¤©À\…q€×ƒq“™p N€s $&NÒXH‚ñ¬IOàœº†[òjŠÀ N«Ëš€õs…)G—¥Ÿ×Ÿ…37+÷63z¯tæþþk•G˜™õÅBò-O¨.¸ýѬóíÏUhDÙ“õnF€E¶©—”¥ÄH'…_PâOÙ4ÉK—.`6VÀÒ}‚rt’Q!?jÜÉ26õ÷’¥·eå7ã,ú¦¶s½æ÷õ—ëC,ßàÜÈ”ïëwˆ§¸ì\¦ŠN°ÚVÔ¹ÖÎ ßÓ–i9¨Èt·¼îÛ¼ñµÿ×O”¡°¹¿'ÐÓ†q÷_dîãM»Ì}eõêæÕßÏ ‘ÅSß®Ié¥Òn¯ŽJ Å’)²–äÃÉ._á-9Ÿc.û¾+¹œ}ä«¿I•’E°¯”d gf€µ/%uÚZ±Cx½% ûò$ý5ÂMjìïÇž½7«uý»·’ws¥£Ý¼o¸\-)_”" ß’Üï¯ß y:w‹¿‹°ÙN(LÅå%Ádcž‡äŽ©bÜ®³'–¡ôé+^'‹ÕÓWìÆ€=yò:=ÌzMÇ\¶¿Ðb؉ZŒ§'"Z²­;ã¶Œ¤Ðµ­‰é‘ülNV£^€ï/‘Á©ðõ`ÙlÑhÚxAqžóñë.ŸŒ¼¥Û·¼Õ3z3þ\PànK3zµÊí¡á>§;,^Ÿõ±BØ£p4¶ž9hkážåZ‚¨š»eW'‚4µGªçø¹Y×µ8úç³fh+K¦–ÜYdž7{:/C9popdm’ï ø‚kÇØ?©twn˜.ì?Á¹aúp€ñFÁÀ²–M%,¸Áj¾¸²Í»‘ 'Ylë;3&]¤œ@ì ’nˆbg‡"èŽÖ–ÇéÌeI?1ÀKêÁÙ•”䨬¥w"ŠÐF¼—+¥_8·pNƶ ]o( äeDÔ®ÊQ̸@eîj­<ù5PÀìãRzma EÔÎs³f}~6å2“_¸¿PE°«¿M<¢èué·eo¢©#”}ŒGØŒ× ™ÇÑFqËlzÍ]'8gü½êÔ¥âlû2íÌÖ¿¸%æU2y¯¼,V0<Ï8ghö†¡Ç'«$Åo¡çº X«Åx\ë…=pá²*W{µ¥›1«ª‘@̨9¨ÇóÍrˆ“Tý6\´ç~=|ÞˆÀÌ^:Q8ð¢,#_ª^}›"ØAh¿ð޹ÆÖb33LÁ‘®œNRõŸ;Gq¿#b+º~–IÇbkù2©¿‘óD'•]ÿÞ3ÿº©g =D縯ï;L‹÷zRös)A¬ˆ×»m½À›4ÊUFzM‘ ýr¥]w$ pØ=xLð(ïWùçñ¯ò—LöQ프K¹ÖH›Éš°,qò®¶ [p,J⎤ÔHÄ-£”K¢\uo©ºùªcÖzo”kBªmà´¬\õ[©™\¤ÝõÓk1´’×´H©=Hj»ºæ %6SÎtqgI:žÒJñ‹«²b>®¯`\S®KRŠ9檂××u·ów™$4ï«¿ô2/qr:y×ÐÿV¯=;S›Êþùú-*è{O~ ŠF°ërг®X¿ŒKï0ǤLqJ!³i™ºÖ—cn¬½ÝüÈ8¼­Û˧âí…–Ñ QóΉØø…ªõì8µ´pût°Ï(-¯ysÌAu•Á%h£À?y„ßµÖ +|F}l(òR Cë°q·¸>–b1k·s; @× Ÿ¹bí"µmÂ{0X'ïÇ[s¦?¤¥=8,E—¨5s¡an¼ùq ÑzðJñ8ç•8ИF×l›¿eEëI]Z fÒ3ßç%§E¨^ÿ.€d endstream endobj 7787 0 obj 3494 endobj 7791 0 obj << /Type /Annot /Subtype /Link /Rect [412.319999 61.4599999 484.319999 69.1399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 7790 0 obj << /Type /Page /Parent 2 0 R /Contents 7792 0 R /Resources 7794 0 R /Annots 7795 0 R /MediaBox [0 0 595 842] >> endobj 7794 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 7795 0 obj [ 7791 0 R ] endobj 7792 0 obj << /Length 7793 0 R /Filter /FlateDecode >> stream xœí]]¯ã¶}÷¯ÐsÕ’”HQ@Q ûU .îúô¡Ø4-‚lЛ<äïW²d¯-úŒÄ!EK^îk¯iñc8<3<Žßþýù_Åþ(Þ¾þ_ñy|}ÿ|¥0bøSôß\~ lY©ámcu©ÚþOñùËáµx=<žº_Ò_ºÂSC…|þíðvhü0|òüþ‡îÝŸ…*¾ïþ÷Kñã?»—ŸÆúú/|9ØÖôo~ÞH%•íþsù®/üïá)~ëº`õöÿ¾1ºmL¥‚úñz~Tÿ^>Šë>Qu#êBJÕõSwâøý߇Ÿ»ÚÎÝ(ÛZÊÆtßZ\k£úju]ÝGEcZ§Rgl˪’éJÊ({$Æ&EÝÐUqE¯++ŽÃTVKl¬*XôÆÔ‘æÐöâÚ(z¢*¶è;Ä9³2Á=UZ‘‘uœŠŽ=’aC;‰Þ©ê) "ª¯ˆøJ<øîåðö“¬+Û€—Ÿ»ž­ÈðòÒ Wozd”¶xù©ø«²þ[ñòË¡-u[5z0;k”ˆ –(XòÞ¿k#zma‰}ƒ%D; ¬í,©pß>ù§Æ}ƒÒ-ìõGF`mÕPòñ¥[K«¯ŒªI¼2í‹ªå©æ1éli ùêCžv¯WýIÓj[‡`¶ö/ÁµÕÉ”Å:˰Ê~Ç^Œk#ƃK`mãH“hŸ•U€öi¨cX“6`G9³ÅŸÇ[ãžVÅÁÈw õ¥s‹Û^èõ˜ÄÐ ŒVø™T¾tJ{mµ ·×ø™4chîÒªm7cÉ%Ã+Äš‰‘™Øÿq,,^2êêdà€8Ïî5öÎpÉýeý€^S+B¸¼—#tŒ³›Ü°–ï×jUjöÀØ c9~&¥7ÓÖ{aZsö¡µÛa$Ä–×þ˜¬@$KÃÙíˆ9ß>–¬ñޱß"ƃñŽÁ^sÊÁx0øެ1¯GpÞXß>%®­Q}+ìÙ4ɸk7„‰Ûò¹±j1¦1?Úaß5™gWƶ½g-Tjþ˜Æ®™Ø·p´#)ÄKι¢ŠºÛÒpÕâŽD9r«ñÄN·“ÎG×¢adó.5OODh@]ÞDL…&¹&1| Â'5 eÕ„ðüÉÖ#ƒ•ãœË³¢¬ðž™±_äx‘ûŠœ];­8 hRDhC8î„Ì™–rÂȦiµ a#3gp?œ™³Ìœq= ÌœeæŒkyS2gRëYùú‚G‡5ËŠ³9±í™£X0ŒÆ Ú‹­+ìÁÖÙCÙ„œVfö0³‡3µ= {(Û s¥TëlÃ<\Ü;>‘;!# dòØï58ÂÍZ7Uí‚çϼbæC´\§ÖØ”\¤2!gI{jíu««êE :S‹cgªZ]ƒˆ-m+LóUåb´.ë¡—%ƒ¹·So¢)@¯[%ʪ§†Ä”JÚ¥•Œ`b—´7 ’.+eåÕ@%®¾"˜ö^r”êôÝ%]ªQõÊ‘°™| §âs$í1³Î³}ÆÍxôªž<¡DÃQº„Ž*X¨ÊŽšŒ\¼”¥®M?0BƒC:Ÿ`VŒVÞ.¡tΊ™–2‹MÌI¸ ×4ƱÔˆÅÒMÛ"Í„²Å•Œ¹(Xtú:ip3‡µšc0UWÓ5éhó'éy˜9¸ðä\@ÃËÙ4Ÿeµ¼=⫎"E1¸=X›+Ï»[íDÆrï²W”¦‘×z3UzeÜ…³:,[c§°ìab±y¬<ÛQMìRa/Âã>s\ Ǩ8S®Õ vç DG‡p»ñnÉÃ-*ô r‡=Úå¬U¨æxY®Ërx%ûX_`ÃõÇXkcž±©Ï¹z*ƲbÄžü;ç¼s£œø›MpöuP>ÎÙ'š-©D‚òÇpJ> Â1Œ(™ýM#ùiÖ›ÍrÏuP¦bîðù¾i‰¼cÄ#í0Гu/Ÿ›QÏàè“­GEé l4,»ÅÉùÈX›DÖSF´†„ç\8#` Gª°g‰$Áú=­¨‘ÛqWSܘâ´# î#£ ×Έv%ÚÁ~Ö†ÿC¬`Ïõ­ÆØ Kj‰ŽKîo%ˆ‘2bŽ#ë5~Gý3ðšu'‚qׇX§w׃mÄÒè å"ãh,ç6± cà-Ë_ߥEæàF» ì8Q£‰d- röcˆ²—|yZŸóå¥lÕœ³4Ýß#Ömξ¾yžÔeBÂ3[’ftçœ5ˆ.5­žªrcôutiÈYþ£F›9œË ¨&âp-ê +–ï|Īnj§JaÄ"ÁŒ3^WZεó <>Ü5α0Vºù¨Ž8gæóRsTÚãœ?jpyL­XÓ;õÔ9ñ7DŒým]øå,¹å ó!£œ¥d úŒ´(ä9n×¥>u–eq×ŽÉæ;Ä|ÇX Q쩇Aç„yÀ¯Ó“ù`h–—ß» ¾zï‹&nýœ¶¢uiÅÔºpí@xÔóuìVæXε·ùÐó9iý]`3ý©»%«#n˜¢‡Ñ焵.pj9å`óò­ÑpŠ˜ù‡wâì29{ƒ¸X~;k¥Krx†Ã銱®jÌìÖ¹¾âã«sôœC8È⬸åþRA\N‹z­+jÈ>çF«ùQYŸ7Œ{5ó×ÕBÜÛíü½<Ì»mFd´˜9g°>ENŒ§·tÉcg¿:Ÿ9Pæé³ ¶‘‰Ñ~×®Q>àˆŠ°¬›xálÀ˜vgk¹l"lnY»Ž(¹dÖ¹½z'ö|M³ÐÚ‰]ØA?OëáƒΉ›‡_…#ØPº€>‹ÔŒdMxÝú˜5Ÿ01Ž‹‘çlÒcl\¿‘Ü&¾F”t >ËmE«¦¶‚CWÄ9‚ºoJˆGß;$؇ž£Xwu\âðÎ{3!žiÐÁJˆDpx…‡ó̰…‘m®‡ýÚ\ JÎî]}ðEÅ5‰ÿª™ÊÊNsÊÌ'VžsÕæÌ'TTø.Oyñø¶ ¹K÷ˆ™\¬¹ ”3¹H¾ úE+ÆJË9UDΩB—|S9Ul›ü—¦rN•œS…|&çT!½âœS%çT‰¯×9§Ê7–S¥†‰¯oùsN•ZäœSe ÞË[x0m¿gÚ  Ê)s¿´ZÞ£ÕiVß4­ž3ôfÆ·kß2Zl‚c1"(oí2îF$Ïç—÷Qò1òžùI>3î™qî%ï–q7„œyeÆ=3î)÷œ™qÏŒûñ™Ì¸gÆÆÌ¸ÏY~›ü¬=3î;µÈ™qß‚÷™qß%‡¶[ÆÝHr™û6òœ#;^«ô…#s½œoÝŽØÞï[s2ó1nææ»L@±™÷ºüEÌ'N͸kå¡ã릕ØÕÝ«ð|–kÚ…á—ï/ Þ2Cø¬Íå`ÄÑ®§Žp$t3½Äw¬¨Í¦ÖSyls9sj†‡—cØþbÅ9mêj"TiÔŒ’§˜ñ˜Ñ–¶†Î€á»¹8†{sѾþ ÊiVêaÊU9+Ó!ÊŽíf2«EÉA%ÿôÊÇmð-×#qò{<¡N7ÎÆ$Q†ÎÆÈ‰fÝæÙd‘ÚC>:«vֲƭ¤S­4Ãö·¨Ä)ˆc4¨Æ”æöާ­KGœƒ=SMÙÜþ­ÊæFÉVUUªv’¸xTv]šaz¦¨u« Ÿiá3kШR‰ª/úZòÖ6èôå'àwÇÔ~BÏŒhx«D¢qŒkÅï™qÆ|Æ>öí¸´®¯´lfg[~篒¡cxà /BÑóçr4î©æÅkÌJÂÚ°6aÝüe`ÐxðHq;ã P ´V˜RöNáµ*ŽöâÖ±’^¤}ŠiЧÃÿ±xÁr endstream endobj 7793 0 obj 3145 endobj 7797 0 obj [545 /XYZ 40.7999999 785.299999 0] endobj 7798 0 obj [545 /XYZ 40.7999999 280.339999 0] endobj 7799 0 obj [545 /XYZ 40.7999999 280.339999 0] endobj 7800 0 obj [545 /XYZ 40.7999999 785.299999 0] endobj 7801 0 obj << /Type /Annot /Subtype /Link /Rect [170.399999 289.939999 202.079999 297.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 >> endobj 7796 0 obj << /Type /Page /Parent 2 0 R /Contents 7802 0 R /Resources 7804 0 R /Annots 7805 0 R /MediaBox [0 0 595 842] >> endobj 7804 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7805 0 obj [ 7801 0 R ] endobj 7802 0 obj << /Length 7803 0 R /Filter /FlateDecode >> stream xœí]M¤ºÝׯ¨u¤Wƒ#E‘æ3R‘F3RQѼ¼DOÓO™d‘¿(8@\nÑÕÝR7…ísï=þ8ØæÍ¿üýøÏÿß¼ÿòïã·øÿý—CvÊÊ,üÛߟðëO¹ ‡•/N¶nŽß?Ž?ŸŸ›¿?¦<ßÿ5»,B‚ÿýöÛáMÈü>ùòþÏÍÑÿŽöø§æì×ã_ÿÖüû9¦×~ááàë²=øŒ5Ö7'xÔ^ü×á/¿;þÖÁŸÓmÿþT–Y]•ÛÊñ£¿ÕœñV–Yó‰-­mŠhÚ?EcŽÿüãðK“Z_ŒS팩JWe‹S­l›l^ûcóÉ1ÏÜ,ѶeI™­ U™ÑI¨-‘ÙÍd®J'uò.7ye ׺¡uAá½mŽ«<þ¬^ØÝlvGŸÔÖ„|Y(ùµ)‘Ù­sOJÌ„º¡•º¤¶Z¬²¦Ö1}["%&ФLk|kŠ&`lÕò"ËÃé Ày»Ìoµ]—Ôf'øLÉ›m‰Ì6hÑ ‰¤NEfš†­òŽcF¾hÀ¹æÏC<,]Óú5u7ÿÎ_ù>|»m LM[ÿÕMôx”i“¢±eó7äÚ7ŠYMOÎ…ðp<ÎyÜ./?ÉJî`͇pÌñÆÜÐþ› í³&™ú ·=,²6Eg«ôǵ _ù>|{£}Óh1ÅLKŸõŽƒé»oë" AâçCUœƒâ1CòB³oêlæ;¬á8¤Ye¹Ž]qøþF¼¶mÖ‚cCšcÈkt|¶øð}m¼Ñ¶~8ÖÅ;Øó!3¼!/´ÿæP.‡P®€´¶‚¹Ô!­Hë!|GÇ™¼i©H ù¨âÌØ‘–!-´•iKâ H[iKb¼gbx ­‡À‘¶»vŽ×i1/]¼ƒ=;Ò2¼%v»Cü¡\ik ­‚Ù«ÖdYÏÚæxàéIO¨îXn—&h¬ w°fä.ÇsCûofÑ\{k`¯‡hV@Ü2¤óð9Ñå9·éÉÀ* Ï@÷Æ"¡Uaf$æ¨cn舭qݤm"'!ÜúØîŽ·sÙ—-Æöø¸lU¸<Æl̘—.b°iÏgŽ9Ýùaspw¨ã‰8=œ¸,Ü£Bk‹´¶àã¤õvw_Bn‘×£ü”‘ƒq{jsäÙÀm ŸÇà†@Ï‘Ü9’ÛB¨[%r; ·Ã؟᜹³rc^ºˆÁ¦=¹9f‹äεÈm1Äs$wŽä¶â Èq’ÛaTOlÛÝ} ¹CròSFÆíÉÍ‘[$÷vŸÇà†@/Ü’ÛA¨ëè]&+Ü%Æöø§#z1—@nÌK1Ø´'7ÇìÜJòW‡:žHîÉí0Ä•4°ÎÙ1Õ£z|‚dSÂ&ÈK$÷(?eä`ܞܹCrëHbMè’»Br—ê:º˜É<ÛclO€p:âØ³rc^ºˆÁ¦=¹9æÉ­$“u¨ãI…ä®Ü%†¸’VÖ9;¦ê1ªÇ'H6%Ál‚Ü#¹Gù)#ãöäæÈK$·ŽtÖä^#¹k$·‡PWÒÏ ègõ¤ÉÉ@8££Ÿ0Ð0/eÄ`ÓŽÜsæ‘ÜJ*Z‡:žÔHîÉí1ĵ¤4ƒRšAQirdSp÷äµ´Q~ÚÈÁ¸¹9òÌ#¹•5â’AA­? ±7„ºQÔ jõ¤É [IPaAm”—.b°iOnŽ5£%¨”• jý‰ÀÂ=*äFAÍ ’49Ark jcä(¨óSFÆíÉÍ‘£ ¦àóÜè(¨Ô ÈKFIP3 ¨Ô“&'@8%Am„µQ^ºˆÁ¦=¹9fÔŒ– fPV2(¨Ô ÊJÈqPP3¨$MNlZ‚Ú9 jãü”‘ƒq{rsä(¨)ø<7: j5ò’QÔ jõ¤É NIPaAm”—.b°iOnŽ5£%¨”• j5ƒ²’ò@Ô *I“$›– 6FŽ‚Ú8?eä`ÜžÜ9 j >Á Ž‚ZbB]IP3 ¨Ô“&'@8%Am„µQ^ºˆÁ¦=¹9fÔŒ– fPV2(¨õ'n ÷¨5ƒJÒäɦ%¨‘£ 6ÎO9·'7GŽ‚š‚ÏcpC £ fPP3 /%AÍ‚ fQOšœ „³J‚b¶ ¨a^ʈÁ¦¹9fƒ‚šÑÔÌHVBAÍ  fPVÒ@~&ŽEAÍ¢’49²)¸ûr‹‚Ú(?mä`܎ܹAAMÁç1¸!ÐQP³(¨Y—¬’ fmó·Ë¹ež3Ÿxß“/ëbîÆÖ~’—.b°iOnŽ5«%¨Y”•, j5‹²’òÀ¢àì˜j7¾tÙìäì¸Gy7²†,:¦ë"ãöäæÈQPŸVY8n‡…ã?7¾ûzxó©_¿þÒ.Âls ÿ¾>lyü©]=žWǯ?ŸeYù‡ã×_u¿_š®Øš]ɪówªŠé=45~ù@ï©i>áÓ\*‹Òše©™,ÜÓxº½¯|¤WžâdC6p%§Wx>ŸÖ#Íß…ÔòSÕôP1Ÿìͧ`Wì;­cjöT†",°NÆóy¾âO ]Çxòœâ eûøµ!Ò6ZÔíÞhÑ÷L‹Êu ](Œ9®Žì‡BÄU§¬Î«âV7|PNîµsëÍØ‚³{]t ¹€ƒ6”h~oÁ²1nZøé½¦b÷nI•ÏüùJyŠ¡t#Ëç¦ Ì²iª§|𢙦n¸³fö‚˜'f:®ºib³{¹ñ¸ÁUšÆ„ŽÇø¶ø"qïGf“Pj„‰ }=¤ž]á?Åúî–-GUMšŽY¥½OÓ1 ˆDTÍ"2gEŒ}°%8]>E3+â[ÖÞ®h¡e%²¼æÆZaFŽo§†ž5QP‡.¨¨/xÍ"*#o+xœÌ‚üjxljè¸)®DoÖVMk¤Ý͹¼ÚWíÍK¦Â-À7on꼘47sc êÇXI@jóîjñžvÃwnÎÖtxª›w@âе¶×{{·®êu•f8á¨õ5D¢^çLX^gÍkôÔ„¼ð×ïå%âÃz:bÎ6Õ€{iAÏä&ý«9,A%(±ô¼Yœ** ™Ö_y™O*°Dì,'Úmj²™mç]+®À¬¨%T ”OØfyï61pRåFì:ܾÍmÙæ-%Ìú¡Ä}HÞ)U 7ç=«úôŒÆ3ÝmÖ€®°Ä£Ç®î`Q"é.ï-&ж"¢Vx‡3~VëÎZßék ²\ÿ~ Êš€A+x²¡ë+Ñá××%·l¼™´ ‰áËÌê~y‡qyÿ Q€Y·ð)?·tÁz&ïJ° ‘|f2¯Xö ç]žºd .©ÛùèoÛ<ã'ðh ¡Ýs HÌ|¾‚²+žÙ®hñ7<6QR4º·›žŸô³m¦êcÞÍuÉÌd ¿²ƒPìÜtÌòè]BžÂç¯Ýà=Ƭ®ŸÒD«1‘—5úˆ¢ZrEk7a ò]ˆÇ`<ù:›P~ËHhyŸ&alIvCC¾¦bÖ˜A2ùžX%BtÅŒªÚ¨G¯á¯Vt Wä»!7žÞöÌÈ c%§Ö–—{RÓWá¹»ËMXýôøÊOôÊGzů¿‡—®š-µáùT4µwôJ¹£OŠI‡{Ÿ\Ëzï¬`©}òR=Ôw‰Xt;ZÄûë‘yÿ1{É[ÔÃ’²ev½u,½’Ó:…§¶[©ß>ÅR'âàžKMù“óØQ[Xs½v(²ê*†ºbý•Dj¼vP½’(¯…¨ï¹‡ oMÞ ÊöA Ô܉Ú[ÐR¶½gçxÛ‡µ½|˜Ó¨Øµ)ÝUÞKjÇýÍÙ-á=_ÞWäýËÄžE*iu ÏGPIO"Ѿ ú؉šGÒŽÓRK"D„‡×±ª=–DjªíÏ'ç²Óx¼Ô‰‘÷œ l /P6ò)Qjž¤FÚ³¥óyIœM4.ùøŒÛ*Ág^¯sûªFÒÓ§g¼z’xµÝŽJW™ÙëQÁã_PûŠêyüïcEk6X1‹‚>¡gѺ˜+–FpO¢M´:y¶¾l¼oÆm úf‰º‚—ú‡{.¡òâm×úÅ-huT¯èFùãM|Þi4qcYÔ¢"*û”´Ÿ1¢—ë•I*Un§A^M÷mZ3û`ööú勨¶ÌZ¼¾ªuSQWÌ´¼É´ùùö.+V)î³ÚT´¤sùÌþ=øW¾x…Ä#I xjyÇDðÐL95ŠÇQ©X·ŽÆŽ¥²z¢òݪ{ >¤¢-vlî}æ®b<æål’Èu’¡ŽH"È÷9ˆÂKMóáÃ0‘0ÃyF½àv¶x›ï}‰á´$’x›¡ú8Y—‰ÇJ\²ç{­ Ü'^\ßÿÞ«Ëßî5‰q›y鳿Ңý.K¥æeœÍ^^>çû)¯Ì]1LX±·˜dµÇ‚m2”<à9ý_I?›OþàeÛù±­ÖxK2 hÇeµ¯î‰uUcÊ›°Ž?\Mð‘3H0k/6Üõr’{xWeýªu>‹ãN<¥–OhT¡MÔ‚øßK´èDÄržqH"V°`.Ñ‚p<yO„¯‘Ä}ïh,[þTPR×<>Ÿ¹·ÏÜ ÷ѯ7Ù¦IЂE™‰Q‚䙩Dyxlú'›VÆö¹î7q´2E?qTu™Rb<"éWÔ—={ϦڲÁ«R•ÄóºñÉëH=Y¶;©ßG RO6W¸ùŒ Êö{eÝfFКÐj¼/jÅcåÄN€+ÞÈ!y7ÍMv½[0ë)?Xß2±J4hÑ\$Ÿ‘/|²ˆµf9kmSCŒi›X»s'.ë+±`Í‘ æhQA™öýðÇð(øàûáK¢š»Mý_C–ž×mjÔ¦]¨/º;zÛ×cN×§3;/÷Ù¦W²nÂIULï¡©ñ{x b_êÂ=±'oòSØ*ýRßcššÉc•k§qã¬:åÓ†*qOèa˜ì.À•OëñÄ1ª?9;Á3ôAg©½g÷ðÔâóªK¥6±FËÏÍÑ" c‘™­¹uÔz?Wú!öô:‹oûîI®ÊŠ™ˆ’üV¼TK°ü|>ê>o¢½»^²{¸Æ«´ŸÔfVl¤Î{ÎÍ¨Ï ³€`µó^¯A¨òrA/uÃþö‰8”¼ I² úmªÒ£ÚÞÿ©¸¨â¶RŠñå$öêßpŽkb|nƒàiÔsÛ&ìôa ÁÊGѺóGßÜOT6¾ÏŸe YÊw@à³ [mêÍ0aÍ_Þ uÓ¢ÕîM欯#yÓìÅ’%Z‚7˜Ó¶-Ñì®xWëŠ^m¯¯&Më±_%¤"ÎG2[bàŽÇ+á«—¥ ˜¢³Ö´¾ºT’w4*–D@—›@åMÚ›ÆTûôvF[; ®ªúª½ž‡þ°Ë’FcìÙ¬nØÅãÑÇ ¹dGÞWÌoã³Ëø“ùĬT~åZÙnëüÂú‰óu'é%€‚ɰºañ¬Ù³Øù»aq"5>'ç99¥gWØõâMß󡺟V-1N¢‚H”-Á žUXôŒ¬önï^ÿèÎïë„úI´‘’9å½ýY¹¸çw}G-î«#å\-îhTê$/åì³ð¬Ù1²Ø}„ùê®-¼»£q$_Y!YM*Y¬¼7ßk›f!yéµ Û‰ù»~ob¬›æó¬GîiüM¥ÉÚóÄ“~ÝÐ_FÃÓ×w42çÓ¥ZÒñW}š :χ+4tt™Ø…O²óª`7ÝmùtŸçØÒT»«G¯ä|%§>9±­k~?v4‘ß~!þûö°j—6Øîs’iÉ[¯ï­VMãÒoµ)OaÇ­¼sx\»Y–§òòƵ;ËÀ•ЂÚêTM×E†‡!Õ…+APÊó“­'«:ãjÕâT†µxÃ•Šæãé=5½'heO6;o#6¥È¥ÔIñ“ô»qi䄟Ø=±gséŠa8bÏfÝ=Ñck°Ç² °!êÚc[˜êª·ÍÛõq`q¿eå¥ýO}i‹]ý² ³545M<6?R” GÊó‰MÊÖô>+O¦]Ù<ÅX÷_ȃöøü¬Ù"?þ¡à endstream endobj 7803 0 obj 5083 endobj 7807 0 obj [546 /XYZ 40.7999999 630.740000 0] endobj 7808 0 obj [546 /XYZ 40.7999999 630.740000 0] endobj 7809 0 obj [546 /XYZ 32.1599999 345.619999 0] endobj 7810 0 obj [546 /XYZ 33.1199999 343.699999 0] endobj 7811 0 obj [546 /XYZ 40.7999999 267.860000 0] endobj 7812 0 obj [546 /XYZ 40.7999999 267.860000 0] endobj 7813 0 obj << /Type /Annot /Subtype /Link /Rect [299.039999 302.419999 330.719999 310.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7806 0 obj << /Type /Page /Parent 2 0 R /Contents 7814 0 R /Resources 7816 0 R /Annots 7817 0 R /MediaBox [0 0 595 842] >> endobj 7816 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7817 0 obj [ 7813 0 R ] endobj 7814 0 obj << /Length 7815 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾÷¯¨skÄEÜm;@ È!È!ðd ìAœò÷#©ZH}¤ø¸”ª]mÀ­.·G¾}áOüô÷Ã?ÿ{øéåÓ¿_Ìï—OOmÓö­þ9ÌÿÞ\~ÀU#¸~T×ðqþ9|ùöôýðýéãÓÇéÿïO¬?64¿¦—˺Ãÿ~ùíé'=ø“þäÓËŸ§§ÿøáOÓ_¿þú·é×Ϧ¿ù ßžÔØÏ_õ㌫é˧ù忞þò»ÃoÓÔ±ßùÿ7}Ï™R*ißOMÙñßeS4Øô ÑãÓ<» ÿùÇÓ/Soç¾Úfä¬ëUχéYµBÿ¹©ÿψ üãÐd«ìîÝUn능v¤Ú>OGóŒXÚÒX+WMײéL JÂçËT×Þð~šà·å¹—ÓÑÚ«?¦_ú[_/ZÌô—‹‘ÙÀ;9NÃÀç«‘§>»é<éq;yèòqzÿõôM{¼´•êaÔÕ(¹×xÅoúõu.c]A= ¸j:7â¸Ôù‰ÏýI¦äéqäÇ÷_OßLît=ȹç#Zf\Ý rf×קǹ€òõ£dlèåÐn–Œ,0hY ’¥Š!“T1NKÌ#ç;IYÙ"Àž¨pWlj1/’óT¹ðÔU*¼”‡<±#8’–f ïéªQR01ãï¼ ótJñéyæ'bÆR*½ôާ.þÔUjG]&yÿ8#–¶´e;pWêÍ|Þ2šGéÕ0ie­<¬ CE¸±òºSOÉû2ö"SGÓŒ²:ØSUxœÕìãr'ÌL[ð¹«ÔŽx—‡×gÄÒ–föÀíêcƒ ?L¾{>~úé“b–]Ÿ™w~Tÿú<Ír’ÞÌ–“núóçÃïÛ–µ8|þõilºQLŸÍRæ ƒo8|#à›ô†+ؾxÖ°Mû ßôñ½±öWêyƒç¦Û¼ÿ<¤bÇ¢›8ôõ±ÀSX° ÃmÞÃcAâÙbx0[¼]ï³~M›¢ C·€~€ —è„oZLG €[ŒwxSà <ã”Ø®¨¹q|”>À7i0Ü(õ´Á»çF!²ˆžÙ@Ào1H0#Å ! '¦Ùü-j‰ „Cæaظ9̹„ QÊ9ÀãPœÇdŽãÙS Q‚\‘Kpofà¡.HÒPHêª$‹Œò~øcŒ³í¶`ŠÁ>£Cßõ¼»<;š¾){û‡¦ÄKÚ é›I7]=Ckø¦·gbO9ß°gd0ޱ¦“ý<'›“¬ŒË?„zm5æÉFꦾ9;mõ¡êÁ»‚<žQÛÁñ(w¦„¿ 'ëyã€ÏÞ™#9÷ÍH+*èË?>v¶ßÞ8ƒù¨‡Èb’M ²ó7'nË”X>Är”0¿öÀ 4·Âæ¡¶·&¦ Ú$æñ"Ûò‡í:i¯íÙ¦>s’ˆ9ñ÷±‘R®"”ÒËœñ´á‹µM?°«Uˆ±Zf øMÌrI¯~ÏB-›ÑðrLjMqæºÇÜH[§±dª ÷lhPàs—çjHKÜ–ãßHBs GÒtÁq²ªà}A:¶6 ¥ ´GÚÜNI˜ƒÛU˜=ĘçŠé…«·d]0>Å)c:nTP›»>õ~¥Ø8lÖÎ#†M„Š˜FLÌŒÚÃø FÌGðLÂ8ÀŸQa¶‘¸·¼žbK¤ßg—ÅÞ—Å ˜#Ô ›£œî=zÿöx¾ËUÐæãºÒl3Š £¡‡ḭ̂+kp›cŠÉjÀªe€Ä–:g·(’2ÛöJ­¦Žy:"¤‰â0A¼$Õï¹Eö]?†-å¼À€‰lÙxgcºZ sÒ9"ÎÌÂŽÕJ†!OÁ‘íćä7Àaã [‰"÷{#1õb±ÂDMn@ÌJþ»òH£Í°Û@cø»ÍhÎÉ!79ÊzEO±…Í´õצyWα+ˆOÇj‡Wû÷FJ Ê2™ÂL··uõ’Ƙ7C°Ž.S&Sè˜^o¯-·‘d»Ô‘¦$&WäÌà¸G¼SÜè¨ZvŠT\8ct$±^°°6–ÃŽæ‘ßRäý¥á>Ò{Üó´l½oÓ áô{ôliÏ™+’׿£7”7³hêNRŒ@C pT0Ù,ɺÑâ÷é|rð7L6¶ÓXA‰Á š»«Hï5G«¬þÜËÞ:¬y+î9 ·|2ú ù:t·è4®DaÒ+"„ãßË”³ñè(™‚’ÌZÞrØÛˆHòA8ùŽÏk»Eܪ¥=Ú öÏ 7­†éRµ¢»žàƒòæ0Š~º÷‘×÷:µÈ26dei"¸–Øx[3HI£ P6Ü•¥%%¦ˆÂàƒ€ùä[³–KIIŒÌ©’î/‘×Q’Ý£Ž ØÂç*Þäìà9Êj„zÝÈWR¸ÍÊàw({:Ã'‰z\-¸hd¾SÝïsÊj«ÎKÑ›vAcå¼h{ó´a°ÍˆÚ4œXSÈí=ìM ÕH»Z‰qù¯¼á|AL­«_l3›hÊŠ\¼†Dp§ÔÉ3š›Aó•q0 ðzXfpNåqf0šã*ì´|üÃUJ_Psõd3\胖7à2Þ>ŠÃ=ÃD°ØýÔIykÃÆVV˜Ãão¼ØLñÙú ©ô]‚|R–³GÄe8¶ž˜Ô–eµÝñ³—ÃB#ä^Œ•·±T6Œ±Á" ¾×Ô×éûY.ÙÛxT-ÇÛ˜P.&€±Wî&s1ƒŸ´Î˜âfž‘,•D·ÇSä)ú|û˜}zzIoÝà°íì•a:¥©VGà,)¯ÄTÁpÒ7Å)€’•;À{’Ì{H¹ß\¢êýÝh3¼cr=´™×¤Í}ËÏ%ñüQ´™Úô/¦jØÜRF#Ù­£,¨¡X\“à{Ï IН¹pa]}O£KÄ2£=. ÷¾©pax(îô¼óy£|Ë` eØ8¸‡e׉-y 1¯\ǽIpnHî »‘‰ö'ü¥äÁQtРΰh‘«dìp?Xû¿›ºK?] šŠ¸YÇÕu"œY"ÊT6ÈaZÊYÁSæ‚b‹¨&H!’”;Œ'x&Î1¡Dlß(!ܳ÷ØT‡/J–úA•=“6§¸•?.S¦BXe/Ì‹@$ŸË%x›âí©HñÃ0\Û0¼67\·V«Ç¶ Ï 0DqoØVQ×"Q´ª÷œ‘ag 醡¬½yìGøŒá[‰jÒ¤>6kF„ánß°‘6ÂP¾_@J¹BÕ|*Õ)Ìr•S:x.9ÁŒ6¢„ßv©Îsp)¹áĦô,‘’|@)‹D”ˆ*y6)j[¡,{ò¤*ÛSz)"  ÌeSÜÚœ”LŠ«±Hë¤JY?æcÃØÛâ&ŸÃ†hlÀ„F\Y =Á›¢4=Vƒ° U£”Ý`¹ÃŒå,åjöWØ pu„ "ðö¼ë6qQ]h´àS.IÌõ0‚^üŽëÕQ DYîš‹PS)Zžå*Ü&¯Œ¸]ÈyTæÛ†ü\öÎSÝ~ñ± ‰]+íØ P¤%u;Køcž2fE®C •ç$Ô  Pêõê€\^Dk_vEô'›(ÛNAº¾³)Sî7ÌQqÇ®ƒ©ÁÁ 8Ú38æUÅçktßžzÁ/?øúôÉCrËÐêy –¤BßtæÊ"ÏIÜ^Ã0ÀY¹ZÉçátW Š`×-S5&¥ÖE‰)K•`ÛÙpAT‹‰hGåo·Æo(PNt¹'åìíæ2ê2ª_¡»x3òªDÛG‘*UÑ^ñÕ¸JRûŽ[äž²àsUdµnHЏ]žr½VzÝÞ8 *9•ñí±”7…T´‡ÏºŠÏšÄë÷çPÎcäO&v” pd+ÈLF&lf’`ˆ©çñ:{ÉtLÊŒj¤a'6:°®Ql+Dñ8’U’NU¿¯ÀÞú»²¹–Q}³fËæ4KT¿ï ‹y?!žïf¥ä#¤áùÑ7¿!"Í5K*uuÇ0”$Ëb´è2i±”„ˆ+‹øÃzn U(¬öQÌY"k·‡ßÝeÂJÞØö{$ïqlYÂV" nÖ2/dÉ&ˆàõyK쥗̹Q6·* ’#ªÞ• wsû¦”›ªtÈ@Ç ÕrÞx]A¡VC‚Âw÷ ‰ˆÍ Ãt/ÛUeU¥*4Y¸­ìjV¾åIºçäӨʡžº‡„;¯Iw àêž„{$l# Ü(0 ÌÚSS—rË¥!®¢ˆgMx#)7PjsÖÂFÂ].”Š•¤;†(øWšñ®…Aøù8.w-,¥¯`øZœ’ìD ØA©f?‹¦Ì[K¬žØ7@ðG”Ü“nMÊãݱéô®ŒkeÓDË@Ø­ á4 Û`£í8%£X\*ô£¹còˆ²:sD‘Ǩ¹U:‚v`Oh')4ÒueÍ2¿k.Vç:œÂJº )?3\Ÿro¾êꈳW²:K›;Æí„Úåöƒò0V­Íò6dÎF§”ÝerÙ7í¶a+À«Ùí±µOrŒÙ¿LÖO³ÿË«h7û-;ey”-³Y݉ˆï{ƒöðºNü‚›Ëdgï®cRp„?ìÿu´‰ž­›yéóf™E6RBR×5Ö.x×UÙSn»¬UU*_¾@Ðl<¶r¸^®0æX|·pTCvâˆ=4S›0ýµ5§±­ ±êVèp,ì=û­c¤±ŒR.º‘æ_+òª­#å’u=Êj‰¢sÈ!ö8b-‘àåÇ7Azn*¤Ì z])7‚–×Feß…Èm„ãaêÀ¿Y¯Â@mµpèTáŒjJºlٲȅ2n–4±=lÒ½àPî–eº‡ìGx‰ Gµß>±ªRÌyQcªR$”‰!>‚EIM8%$8"½,.ŠN ÙèO÷úRŒAGxŒ6¡J„E'&n&Œ9 ÔÔ4–Ì&€ .½ ð`‡+¬}u„݇øÖËJ: {>·л#Ͷti›Â÷º,%ˆ :“ªÿo÷AÝ>ò>n Yì0[(íþÄCÒEåY.éÈ«ED”i{¤A?Ò ³°ö›ñëG"pD"pŠ‘u§r?LfR»ç¼-ØÆãuÀ9Œ:„\<ì­©–ÝøØÏ.< º ˆfÍKõ`%c5_®d˜³ŒìqÆ’hçžù…â{Î%Þ9Êžâ8rœiadE<ã,<ü¦#P‘ÛŸ±Zq#S¾›SÎÇʧœTä‡Ñ¡Hçå3W83ý;|Ÿc:øó̯/ߢ®"½¸åô£ѼMÃEÑûÃÑ\¼bMYßèò×¢=%5™BÛ}Ó¯Q²Ñq6”ͰîTVÞhÃ’ -óŠ1ôtM¯íEç7GÁ6#l£{à oUÅÏožao¦—süÖ¾kÂîWVøµ1.íµ7 ­ÃX×âÚ˜‹Y»™ÛNÝüÌ;6wÛ”È:Æ á9ÓÆª©M«_ß´önóö÷Ÿ¼sxö’e”jû†ÍÏëí0ÒµñF]QÆŒTñðñéÿ»É× endstream endobj 7815 0 obj 5372 endobj 7818 0 obj << /Type /Page /Parent 2 0 R /Contents 7819 0 R /Resources 7821 0 R /Annots 7822 0 R /MediaBox [0 0 595 842] >> endobj 7821 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1739 1739 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 7822 0 obj [ ] endobj 7819 0 obj << /Length 7820 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€mó)J@ÀÛr`x€‚o6Á"^d²‡üýH-u÷ ÙE’zežvsD‘õ®bUñÝ¿þýøÏ_ïž¾þçømúùôõÀN¬aãŸãð÷‡×_ˆö$ÅøÑ´ú$ºáÏñÛ÷ÃËñåðåð¥ÿ÷åÀ›óƒÓ~ðòŠqÂ_¿ýrx7¾ü0~óõéÏý§ÿÅñOýÿ~>þõoý§ù†_ø~h»føðïñ\´ý^ÿuøËôKhÏóÿþÐ4R±~-)ëx¹>ÊÏ_?Š^Ö#:¡Å‘sѯS÷ßþ÷‡ŸúÙns±S'¸nÚF˜þsËäøß ù^0ÌÝ™æÈ¥´§ww8UêDæ³Lt\ÚÖ8SÆ;U$H­ÏîtêŽ/3%ƒN©.ÏDÊxÒÎ.(€3:Źi”aÁÌ5®M³‘bE/·y™*^¦§¢, +âi[»@Ouj•äÒ­4 (Ðm+úÏFN"VÜj–‰ .3%±çƒ< +ÊÃp¦Ó ”f] ?Gl¼‰q´N4»,"I2fr!µIÊÎ.¸€3E’d\ˆ<"é6U2àe]0®(‹HòME½2rܦIÞèuªÔ‰•i¢aEt'ÓèFè³78Žpq1'ÖI£Ù«&шgko¿útþBݾPã'5>úêÙÏÖ³¼³'Ã+²_ã<ëÙ \‘gÏöé<¢{ºåoàÉæa£áûÚóHs¼Ù¹gixzŒgÑ”;Ø G¤gçp;œŸG¸¸ yÈÂP\‡¦•´_³ƒ1‹hÀ¿j;oî³ì§ç^¤Ђ[Ú³^Èq\Ù;aö¹P: H¹lák(K›gæà²ˆ¼òpEºGØÞŸh‚÷Wˆó"”†MŠE¡¼œY¡ã!¼áˆ'àÑ#±þÇtŠibI~„’hÃÒ« ˜o…±Ä|ôP~Æ™Ò5ÿ0+vßÓíaÏm&q55ÁØõ<ãLo/>@áݬÕÓ*i猎¨dÚ”[ðØ(ZbvVñ)Áº#ÀYm³ÌHL*4œ-\¸Èç'­šAü%‰˜y¶µ5 2¥0ÂæÊÇ2gIŠÒŽáž…ùéì’H›Ç=~?œÍL$¿?Ü-P 6‹˜Ã ®Qi8Û¬-$G¹kMñT\PØÖ²ó´½´O“ǽ˱‹g»‚zÅ0néŠVÅ»öÀ#§m…U:kx„ÔCEQ‘ S†ËaA4È·®cò!ir#ç\©ß‚ ’¯öï(ëOå™ÉZnBc¢wеñXàX¬cRÎ?,£ZœÃß ©pGÐa—!#T£Ú Š-@"¬/»ÞèXR ,Â!*jðHilŽ|ŒÅcÉ8—¶ôǼ«5øÛ”ìXCxŽØ¢X_Ά)ÁçäÐ6¶R¶•Ù;̦ý¹’-2ôHñm{Ùî(’º“vþpG8¢à{à~Fâµá÷ÀUSF#! <6!¤ƒõÆB5=ƒá†1‡Ÿ”˜9œ­)ˆaᆩWbœfÕ‡+‘\ârüQ3Xß4Í,¾IÜu6Š?2š®ßVÏ®4³OE‘CX¦,/=1t°•%‡çh[6•,\ÏN ^TMÙe˜šçºZG+F_)ÎO^<¦M'eåæƒzòaÚƒ'ËÆ ggž81iBj ©škCe;à#ÕPm;Ç¿'éæÙq¥Ú¤’‰¢%•ÅTvÓ1§¤9ºÈ$HBEoÙÚæÂg4‹õ3HIRHÉdT§µjyFE 8EÜx’ˆ“bÎZ$m¬à*›ò”$P¹áG­üB‹¦€ôätåUP«t½#ôV«ÄäÏ>F$^l²OI%†ƒY9ò=œ?s C0ny™x$_Øœ3l®ñ½2źŽ\'h Ê3Z¨• ð©#Î  Ñ¢‚„Ò“¦½Î2}‹h¹-Ó_Š0+Ú4CZc1¶}™Ö?Yƒ—%ü³x}yLÑaDB9¡ôÖ 5·ð}[kim ~8‹fªU„¼&!o˜°µþâþb„sÞ¹Ä#´SBµ¿‘ ZÞªÿwH-Ü%Q]•U)Áò¥9(üñ˜ý‚*¸Ü†HÍÒ¤´ÙL:‚ ­*é­òÎòÂn¾´±>A¥$J«ž4PÄdªk”—¥ !Õ}ºÀ©‰%}z-g)fÛÒ½Œg¥ëAœŸá•DXfáfO–$ëªÁ”Ž* oüB9~þí˜Z•­ý@›Ö–º«<h˜±9á4q£Â5qå2ªž]ã/Û*Ö46Êf,”gP¸÷†£8ì9” !i²Ú‰}+-aÄõe$BY_q­‰ G„W#Ú÷k5SMHÒ‰—•Ažœ§Ù xÌ5U«KA}¨fšESÉÉãüë‘hEÎzjöÒiowáúEXó¨q 6Ûqõ ažVŒ„f¦«é²ƒ÷S…*:Ág÷@éoÁ•°ÒËš±åi©¹xÅ­š«â/o w†r¾—ÅhZ:Û’tv‘ñD¸Ã³žÂ‘ý&¯µb{c•5´Ødc•í´/€bÕ¥·ÂÂ7¯’UDªì%‹¸mdKm ±”︥Üê_ˆuõÒ÷·{OLÅ×—àÞÞŸŸ=`þÃ]À 8$²÷ç_CçOBè±^×WÉó{Ø{úï=ý½ØÞ{úOÜ$y7=\O‚ì#É€½ÿ{]*××·VëÿÞ¿õzéîÞÿ½|eÒe¸{ÿw/tÏFYÞÞ]‡ì’׋‡ïÿÞ/æv§â–“¼Ÿí¦„7Ô¼( ¦ˆ¡ãp+åH+¢9Üê¾½¡ªƒU”OÃ?7²|#ÿs·IÅb),Gi°'t]T5üíb­®QU´®Z[{à Ù+ÕJ¦øõ„£LGàÚ‰PéÈámÖĘi[2­RÚv?ê1[LÊs{“cY<¨V9›`Ɇš KÏÄdõ8D#*M#šFoxõo–ÎjyÌð”ë½p9yí UBFcØãI¦€Ô=y±˜ žÿ†·ƒGÖl9¬æ‚DOÎð¶0Oí ½Ã2y¯,‹Ž×”¼Ÿ§ièÊi…w<œv/'öŽñÅ«¹ R΃%Ay”*1דRhËÄùâuú¹ˆÏê‡×N»P‡:g_β‘>)…Íý«,ð‘ ·Ö‰ÎÌŠ.¢ •ãóÛd‚õ_½Á®p$^lƒ?µ¶ù³lÄiJžóE(U;y£ ‡¢‹µ-…àÀð2·”s4RG Ž7m{Ò£pi –YÏëÖ)ZÕX0,{%GÖÌç¦`¶*Š{®QÀØÂio__ŠaVÔPrYÁÛ 2µ Î< ð3ÅÃB\w6<Ê_$ÔHë1©|8ç€rAHÞxkÛi¯O^G}²fó™Ö{õê^½šDcBÏïa¯^Ý«W½ØÞ«W'nR*›öêÕ½zÕ/;WBå͵«FÅêÕæÖƒmýÔ:mÍ/ß·&e7b~¥{5®ÊkUãn“–‹TýÆQÔ-xÄÓÞs-†¶1²öئgLámÊm”µQº}y$ÒœÞ-­nÌÅ\Ÿ„SH»SO ¥"ÒÕa¼l©–MfHg¨Ï*|g8ç nÀ¬-ykùùþÜ7ð¨[þ^½yDîBD’d<ÐjôÇ‚XYX9Ȧdü*¼“šü&$DT>V>oReà–¶“àÛL¥ü¯wýYÉ«Ÿ…´à`®QRtÊ4–qxÓ!·›}˜Ö†ízr€÷>4Yå¹í$¥Ô½JJ±ýÏuæ;v]g3^­²1ú镞Î%‹ëïÂ-ßRD±”ËžO·¯‰ #lȼÌi‡½‚@xñí¼ùžDŒ)b7¼_^Lº>%ýÎñh\LdîÁµsÝ´¿¢]I´¥CöÌ‹)=A¦¹$Âî™…¹3 =ùSø‡`@8e0ôK)ßñœÙòaj]“nÚÉK!¯Œèþïñ¥géž]‡_˜~|ûîáqW8°›pøâÞGgåJÛy¿{ÌoNgur”L½%ê¦95÷µ}§NàtH˜“¹ß¾ÆÜ•»”'ÑÝ=»ÓúÔŒâÖV˜÷ÞÓÂg:øÌ(8 vîõxùg™çõ7áïNf÷~FÏLvŽŽö1龸g&ŒÅì}ZÛ™¨nø,47³Øæïãé`Òé:ÐÎ3“èïŸaãÐm„ÙØž’üîÍqŠéc¿‡?eÁBÛ²æÄMoM¾EÇdÝ{ñ¢&ɘQ*¿þ ªðq endstream endobj 7820 0 obj 3816 endobj 7824 0 obj [548 /XYZ 40.7999999 652.819999 0] endobj 7825 0 obj [548 /XYZ 40.7999999 292.819999 0] endobj 7826 0 obj [548 /XYZ 40.7999999 652.819999 0] endobj 7827 0 obj [548 /XYZ 40.7999999 292.819999 0] endobj 7823 0 obj << /Type /Page /Parent 2 0 R /Contents 7828 0 R /Resources 7830 0 R /Annots 7831 0 R /MediaBox [0 0 595 842] >> endobj 7830 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7831 0 obj [ ] endobj 7828 0 obj << /Length 7829 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhÄ·,¬=ž90Æ@‹‚Ùl‚Efgùû‘,©¢>J,>¦»-{¬&Yï"‹U¥úò÷ꟿW¿ü§ú:þ|ürhêF7ÃWÕ8ÿokÁ‡_M«jnû¯êë·Ãkõzx>-ÖýE4F·c¼ƒSuäøï?¿t³Á¨­dÌhišÍ³þ6-·•5º›U8“:¸mœ*v¢¶ei&ê!bq¨±FÿTu+†+Ù³¡gj[ÞýnÄø±UêÆeq îÓL±Dd ×i¸ÑCÄ¢0›˜g¢ªcl]ÑÈXzMSE^ržf¢"‡ÚHyÏTdÒ+6*×±2œ*šbƤ‘ù7ˆXjéñTdÒ·zUebñœfŠ&˜å*ÍD=D, ³‰ðp&2Ýí(^ñt·‰•7"‘±&IAw8•î¼iÅ€$‹µò§©b'b6;ˆXj#åÝ©ž“l„ùi#üêøðrøø™IÑöûþ—_:HÞ×]U}èwdÝ&ëåçꇦaòÕ˯[++ŒNkOøgøDfãácXƒž4p¶æ>±pŽùŽùÇ<Á'˜¢pžÈ¤Ô"\HÅë@`|”1ÀöôÒifn=k–EÏAg(z†yOâ0[ºAmÂÖARfƒPs¸ƒt»7mâÐnpní°MØÕg~\Zù¢ð¨6‹>z¬\§råña[%Æeûd(Ùêl_(´.…³8çÙc¨SJâ[«û Œ†lÞŒ†eü’„LÕÍÍœñíœrfúä}œl–sº4Öùè ØŒ×rÙ©Ÿ–aúrúäÙ¬>QèÉhÏU-xËø9)<Ð?Á1r¬=D4„ÒÑ9añGÇ}Çhv3ï=ìÂcœéX!—F«£kÎÚ5IÒ›±àñÑÉvq ‘bŽp·3@¯X’XNÀ/ ù°)âC˜€±ZIÝÿa6G!WIÓgX>sŽzÈî|t® #¾]ŸB!‰49êŠgÝn@\M#ÐÆMŒÚÙÔÚ°Kœ+2šÿÁDñ9+œ9$' !àh&ØÃšMÓnÍh¥/l€kS“8 ‚¹ð°Ü¡4´,0æñ3ØŸ:2ç:ï=ìrLجæ=­·Ú1¢eÑ„eΩ"»S²LÎ×ıê-›²'p+ß÷vhžmîv·œÒB8êŠ)þ>F~—wL‚ÊåÁv,À®‚æ¡q¡3e“²ºõ Õh~¾${G^ÂX€(G–,çe×`DñzQ ܃³B4‘OÜøt·­¼TòD—,8¤ê¹ƒûŽš8DŒ¯®ñE !<ÚÀ°ò5_/( ‡à1”7žMá«HÌ|ሟ`ZcÅ—XKp²–7LÌYÌn°nµiÕd»ònI»´$×Ã’ú¸A>ŠA3|-¨ÜüI3ùv£æcÚð1§¼gŒ…cääƒæÑ‹“Ò;ø ÄeM=óÑik9ºÃ¹Idªüг[ãcG_'l£—œúltL³o°Ycí¥¿YÚ‰œñ6ž·ß‰-ÞÒÅ !ÌN$„m;à€Y±áóˆeÒÐhL à’8Þ¹jÆXä<úf´©¢3¦—F5ÀÈaÉð?éÉ8S€6K4›„ÅõÔ6Ü~XèžoÙãPf]¿ÖЉ“|àõîeJ9g,Ä&±C¥dçádt-Ÿ; ÊDñk·ˆÀd€ãHMˆÙº!gçZ(‰W‘Ò(V}†ñ¬[ç´¡ê"ád@P¼‰Ã m †“Sü’¿KA/B]qrX»„üž0"¥Þ ÎUAÊ›évPà€çMR1mÝ¥:§Tv¶x((/vEðõÁÚ“"ØñfÚ@Œ¹ÐeV•¦°Ä0|é5Ís-E¸H*U;'ð:XJwTÔõ=)ÊÊ?®\ÆRޝÖJI¹§F ËÿWaùßõù–õ¹oï³Sþ(±É.º7Pž¯×÷Ýü¾›_—ÓåÚwóB϶wóâ„,µ›Á;sBoJ¬ëØ>ìgƒ›µÅÙ *ÆÌ©&w’YpOµ= KÉ×q¯îr–ïl¹¼\/É“!Kשžk,Î]·³LDdÀýjH‡€$¢Û¹å¹Á¥ÓŸ®DsònT$³3óŠO اx’ëñ†Ð-„%Û1BoÓê=b2-ï5 Ý•æ•U¥wY=§‡«²š¦r»LQgŒÁ%)ÅÕ@…^/Ä Ø®–1f”*cÌLªvƒWjß’Ÿ–Ò¿ˆÌ¤,¼ ¦çö­/©…†3I’®9¥s)Å©ñ[ƒsl1Ðx¡§ ÉPa–Â~·D~ÂN ¦p'¢È!£ì0­gÂs-uûù¢|•Rx:lÞŽàr&ïû€#,›këjiB@ýˆg3ÿ)BtRì°¬·)+Õbìž#fH"•4s‰¼¥pöÕÄŠK—¦åV×÷R*›„™¶MŽøo¯¡Šé$Œc5!Ø$‘Â<÷uWh œi)1KÜÇ6à@ÁælhÚ™#»â¢Ë¥Y–­¢ú>K¼”œ’B=…8i§©à” B/1Ó{pÉ¡TÉ$?¥Å*<·›ä§Ž¯q»Š×Ñ0}z=Ξ‚»§à®Ë‹°w¬úør¦’)¸ÚêU¼šXÚ»÷O†© (e(=$±•…ý ¯º˜lO¥NìS=øP^oFéž‹e‡ÒçÛA<áõ®”bdì1>2-lKË1ðLBoaKZ’♂)~B)q‡Úè‘x‚¼y ¦xñB»…[KlÅp×n  ö06B®R¤˜×#ø’×£Ø'JükÁ³Pzk{Ö¡h-Ån`êÜYDÁ£?Øvî~·è Þœï Ä×Vz¹·ìzz¹c<½Ï‡u˜¨M‚ç¸ÿûøîuUóù{ÞÆKÿ…ÙØg>œ0f0‰ºC›ù-øîgŸÿž¨•öRwî­)mš÷ñä)¸Œéüþ~È â”E¢‰ïãqßMÖ¼oÇÝ›x^Ç ¯mÖ3XosŸúýo¾ŽãRb¿˜n ž1ø,…cÌIۜڂ$Û³®¸z«ŽÝíbŒMæªrv‚7§&›»ØíÄ´&…¾íÍóÞA|‚%ÄÒâ“ÖºqÜv sG<(·ˆïÆÂóæ˜`åy¿zÄ -É ×ÓdÎá¬ÜˆÞ”µ½ºÀ=Ë>+¦HÑNóâ´5IÛ[ż ã¾ß±r±"\çVô$ŸÓ1L[Ý£g؃—‡ÆÖSôöCÀM¤É†ÁFOX ƒ­\º)gB½?Y&¼ŠœÒ£u—ò«‘r%ß” ,I”ÄÝþß§f˜÷×u?±fìÞä®tf%`ÆùôÂ+0ÛÐ>$"; &s'¯òNÒÇì£ ß­{cÂ^ ¹Y°¡ \ÂÆx™;l)5·:”|PB>5Î;œÓÔ21Ã:cgg3 öTœžÚÝwõÚ‘µ£ZÿñÇ×o:» jN zö²È;t=%WW¬Cc¹U›®‡¤Ë³W~éºÖËfÀÊÚ!Ú AÜÔfùÉ,<÷BÔÜÎLäèIU­&Ì-ðÒ:-cá˜A‡ ¯yó–Ëzzòg$÷ü/ŸàgÇû£ ?£1£U^z£F„9‚ûÛ›DH]ÿ;W̬r›ý.£¦{ä@9cÆCR7¦ž4sn¯á[šòËæ^‡=&áBÛ6ºf}û%;F˸´0fÔY±ùsJ«X=þ*°]F endstream endobj 7829 0 obj 2967 endobj 7833 0 obj [549 /XYZ 40.7999999 679.699999 0] endobj 7834 0 obj [549 /XYZ 40.7999999 679.699999 0] endobj 7835 0 obj [549 /XYZ 40.7999999 503.059999 0] endobj 7836 0 obj [549 /XYZ 40.7999999 503.059999 0] endobj 7832 0 obj << /Type /Page /Parent 2 0 R /Contents 7837 0 R /Resources 7839 0 R /Annots 7840 0 R /MediaBox [0 0 595 842] >> endobj 7839 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7840 0 obj [ ] endobj 7837 0 obj << /Length 7838 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhÄ7 ¬=ã9Œ‚‚ÙÝ‹Ì"Îò÷£n±õQb‘bK¶Æ€í1›Y¬?V•>þéë?ªþ^}|üúŸê›ûùøõÐÔnúÕñëÃí¸­ï5VÕ¼=þ«¾}?¼T/‡/‡/Ý÷—Ó§ŽîG×x~D?àïß~;|ì~èÿòõñ/Ýoÿ«xõçî¿Vû{÷ã'7Þñß¶ÕÇ_þÝÿÂ8ã¶ûÏíoÇÆþú‡ê·n ö4îñû­•å†'ÍãåÒ•¾n»¢‡uœ[Y1Æ»yªŽÿýùðK7Úeu+3Zšfö¨Ýw7lkteü1½¥Í‰¥$T›g É’VÆi‚#‘éÞuËD÷óHÉä’Vgˆ±Lt‡#‘é®LÏ\­J]åy¤dri#ò tœKZÙ™îp$2Ý W™øý ?‡27 û`ºá>|‚-xðΩø–ÀÜ ¸s˜GIœˆ¥Kl¹?Çã>˜:˜¢N„\EÒ;”•bÞÙ´Ô~îlÑâ–Eèݲì–åv¥p·ñJy[°^Çv Îz·”»¥Ü-eYK‰¥1À‰xì½èQŠdáõ0³a­œÁ“i#›Þi½i­4W·‹îIh‡NkÛ6:‘äpFXTÈÙ&‹­o‡ '?`^‡¯H)×f·Vy:ãпŧŒ€‹ÏøŒLmÇ‹ÞÕž®/’xÖbÿ⨃giuÀ2‡W ©ã(ZÆæh±i›#°<㽇;XiV†ñ¬…l¡ ðÅTŒòbŒÎ@` Ìj]w® ¶º)*Æ£x48Ž×©CâÞûrbÀ—"œÊVœ`ez‡r¿9{ÎD¢-µ¹<ŒÎ½hGQÉŠUœ{NZÓÿQ©Ã–æ|`7jØÇú0اE}Ü&2Q›,2˜­%´°3hƇ· >ýÜt-N˜Ém‹@£9D‘5ußpÓò¿Òë2¢œõ•Å½ÝæhÖ˜:Nü˜ª{HiάÝs–¿NRª}­‘aoG…ë‡0«Xîã ïÍUÀ¾cöÀ{Zþ<{Y>¶íŽxy”p÷æOirÁÞNG\c8s=vM“žZÄ.à*|þ™ÿQ6}ºz£Oîÿ -‚;wä}È»fg7eÓ·FQ'YÊéŠr‚É{Š[Á©ï6áÌA:YdóZ3÷W|†Â-”ø+:÷–Ñ\‚íškš‹‚€á=ÅèžÜmÒÜðs0JÍÝì¶`ó¶`×¹õAëª.٭몭ë[‹,™´mË›¦¹„£eŒ“_Vnu;œ:Ž6À·JKØî÷‹q3Xõ ¸ãiFÂ{‹Ñ1Œ¥bÓÆ2Õ,°š€AnL¥1Ú¤0ü-]2Ü'}Vx¼÷QOι“7$ m€œ—´'î2øªŸvT»„÷j”]›¼çyëîh#Ä ¼~ˆ1ü ŽP*ë»Ô ‹@ƒ `et™®:õ~tÍ›;®«zs´nsI-Yw¾·—«#éb²F—†>ƒîØôyG,Œ¬È÷ ô8#‚Pð17ℊgââÇÔy”!÷Qýmì5'¯ûñ„š#Ì'àlG$Ec !!´ÌïsõÎv˜qR1xÔÂÛ#…ãâ¶lH1\ÅòoÑõâýᱜ|(N@= •?/Ä/o Oœ SÃBâãožäþ)öy ß'HO‚îzC’®ò€EY0ž™†¦èÕx> •”!Uf**N òŒm†¼=CzŸ TÚñ,>)Hßc³éÉç­¸q…áy4žAñ&Ÿã®(0ÅI·l=.dŠÕxLLÑ*L×)…²üµ½Up“õ&\ìˆÃT`&.âzdr²?#…‡"ÐyË.nã¸/Ëœ»ÿ¹Ê›’gc"œ\Ǝ¾@‰g³r±ÈD¦²µíëIµwÌT–°ÎŽðç#r~{nËÅ%déòžq3Ì-dkìc'…Q£m »yŒnÙ®&üŒ–_Þ€Ãïî+$¸µNÑÜ¥UjŒÿ´åÔïRû—~ÇÊ”Îõ@טº¿ÞÁ> \‰ù5"){¾âA@}”³[ L1y6^Ò01° .z©3Sº¯Ÿr™Í¥*WÃ6·LŸî3ãòÛŠ(ñN¸3žæÀõ;ãnÃì|C£…y-¯5!ÀŠ{±ˆu„Õ¶æRðgO ÛhR˜È+Ìà—ÖNÎ'@Ä6ÕRbu¢¹¾nôSÁ§*5ÍôÒ»QÁÁ"„p8–Tž"„—”Ñ™ 5”Pã¿`úRÂæ)q:4EcâÄïlèÑŒnEÂï¶7»í]1_®C'±K™0 ǾEëÏ®±#ôâÆefªîòT{öýÖl‘NsËšdSRVysöK)éYâÝÂÅÂñÞg‹ ™A‘ ,GÒD…¬jÀ/Å}%þ{BIOÊ[¾Ð)XQ’ªîO7ìs`DáÊ ŽeÚ)gÁ’~:—j’+v?=Äÿ¤4À¼§Þ]6‹ÉæJü‚Ÿ¼Å³ ·IxCÁSƒhøë§.jÂq>B¨Ëm.ÌO 8Èzç·â(åˆ~ï,b®ËV¨Š¹»¥¼¬ "š'gÀ‰˜Žù¹æ½û÷tØ%!&žˆwéÇÙ/#]ËGï(9Ô÷„@ê@Þêñé_¤R„Y²jS rú,””²¼BÅ0RDÏWâ«ÍgSW edò®ËÎOºŒ˜"éÙ´ªYJ>â`!…úL‡XqüŽ/O¸pX]D‘‚7ÃŽfæMR§†&iC?É›ˆ°?c™Hñùá”<– ˜:à^"MJGš'9„XÓOçvS\± $¸bÓ8O1r‚ÙXÚ*eÕÚ9ªHexç]¸LòóUï œÛfƒ¥L¹º^sèÅšƒ®J^2J½_2Þ¬g\}0 ´ûÛkЍf+l××Òç{êÄ)C™Ë6‹oFIG&dã¾ÛwD¿Ñ[ÈeÞ¦²8¼òÂz=#O곺å 6ë7é‹*[= ûŒ¬YWƒf¤‹Êô-¹"9\Q PôÓiâ)µ²s”Òš:¬§:m1ð¦`´Ðb†¨ïxˆñ–cÙcº'¿ã-ëÇ[´NIJßñ–o¹ÑIq+…Éfø}=¥´ï¦Ýê8i  j!k&gº]<Ì4)·%ñ0ÃÕ=žªÅ4o¿?Rà$\Â;×áG›’0¿û‘é~d÷U½t[ÙmÓñîÇ·ï½õ™¢¹2Å— [»NWhÖë–1§µL÷ï1«Äõ%ç®>¯®õxþVÖÞºsnj3^ÙÜŒ´ô‚)DÍÛQ|H©Z÷ÀÐÌŒ=ÇÂ>-ìÓoµá5oNň‡ `l´žÙnÿò ~Ö…fެð õqÐÒX Cëp€Q\·c1kws; @×çêRß ï6û1žbàåõqÇ”®OÓ7][šánsLJ{Šùï~{̲ Ö6ºfÇ’Ž¯·Ãyñc†-Nøœf̨«/‡ÿ"¿¦g endstream endobj 7838 0 obj 3038 endobj 7842 0 obj [550 /XYZ 39.8400000 650.899999 0] endobj 7843 0 obj [550 /XYZ 39.8400000 340.819999 0] endobj 7844 0 obj [550 /XYZ 39.8400000 200.659999 0] endobj 7845 0 obj [550 /XYZ 40.7999999 688.339999 0] endobj 7846 0 obj [550 /XYZ 39.8400000 340.819999 0] endobj 7847 0 obj [550 /XYZ 39.8400000 200.659999 0] endobj 7848 0 obj [550 /XYZ 39.8400000 650.899999 0] endobj 7849 0 obj [550 /XYZ 40.7999999 688.339999 0] endobj 7841 0 obj << /Type /Page /Parent 2 0 R /Contents 7850 0 R /Resources 7852 0 R /Annots 7853 0 R /MediaBox [0 0 595 842] >> endobj 7852 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7853 0 obj [ ] endobj 7850 0 obj << /Length 7851 0 R /Filter /FlateDecode >> stream xœí]K丑¾×¯Èó“#>EÆî—=,Иö`ø`ŒwÖ0ªŒmûà¿oI$%¥˜• †”YÕ5 LSRŒƒäÏøåϧÿûçéç¿üÿé×ð÷Ç_žšscÿßiøóÓò¤;+é›­3gÙ ÿ~}yú~úþôõékÿÿïOÂŽ†¿úcà?ýûÓϾó'ÿ/¿|üï¾õ¯“<ýWÿô·ÓÿÔÿõ—oxáåÉuvh<û†BºþaÙ~üëÓÿüÇéïýÜwøÿOÖ¶nêÆñ}úTŒ–Ÿ¢ÎúQÊõm!dÿ?Ó“ãÿûô[mƹÓB´V·ÍÍP[9€5]{êZ{’K€&¸ÝJÔræ4ŒHÔ¡&ÝæAQI¯…ñhv¦Ï R-Á´ÔŽÐ0"Q…Y <„$ÊKa¬³²íÛ®Qþ±Ý^ãŒè¶ºšrT- ÝÿÅ3—ýˆDjq0¨³iD¯F[§a{Ù‘3ö¤›^½„¦Ôƒ"¶›Û"¼ò<¿=¨ãߊVÝõ=ÀöE§VŸŒ22tj”mbG—íþ•çùíu§U˜Née?ÜxF2¾ø6Â4v» {U¿®éÁ˜Õ±iˆ½Jts»µþ•çùíJúºú ®B§r„è;ºhk7vêb“S0rý°â9“ñ%´¦MhÏd¯AU´Œ¸†öÓ§çv|çyñ~%¾ƒŸ&Öà D6I{¤øü>7¾¶ ø¾Í‹ïLÏ—ÐFø¶Zпš•e+'VvÍÄ=±=rX+#3ûfµÐjëQ}GmÏ^ñm^LuÀÈ]ôÊçLÆ(´SÚ3Ùë™ØãÚ#ÌÀX¡ßy^¼Ï!´:(©f ²IÚÞLïsãh»€˜ß™žQh¾­ô¯feí&£§»YåÇöÈaÎEföÍj¡µ×¢!úŽ.ÛM&ËŽ©u_NAª%—ÎòFÄBw‰a ØHøÕÕæ?Ì jiɳ?ŽHÔ¡çƒ"lŒ aü‚#´GeØœD|ëyñEý>°u±g99v¶z°~zj×n_à`œmÖóPí±F¬§‡ia=?L¯=/¿apÓãd¨ææÊƒ™Ö¼Ó} ó@éeáóq_âÆ<ðÛrBê}`§‰Ñž™*>xÞkíÄê¾]/ÜA‹0½ ]>X7 Ü5-^‹sPŸ øAÐY1^ÐtnŒsÛÚõ<0°¸Ç:>8=óR|˜^{^~Ã"ÜusçææÊƒu³°ÕO÷5Ì¥—]DIçÅ|AÜI¸1æß–RÏè]7ÙÏ!O{bªéÁó^''V÷íjá–rÚ·RÍ[8«9m)Å6/ÎjÚ½ºè‹ãM£pcœCóÀÀâkÿ z^š¦×ž—ßpw˜ìйš7tVrÞbâ˜îk˜«yGë²?nÌÄÂ1ü¶œ¿Ž+0ŽÚ9×&|Ï|øáÛÓÏ_„Vn(ÅøöÛ°ò:õ}ë—›æôÓ¸/ôéÛ_N¿k¡ÿóôíoOÝÙtª5¾dëõýÒHô‹ü=üFÁXøÍ'øËçò~ü¥éàØ„F h¡aŠ69GÝÀùÉðÁ¦rHK„ÖÀ±e~Á£~c3‡iæçó·^oí®…”ªÐB Æaë—c°ë—”:öÓ#m{¯èR7c—4—ìkÎJ:!M:Yn-7z-–ú¬=õ_|kЫA‚íY wUNýyCÑž›d"%ú%~£ÕºãÌñÐ>CÒãoÖ#É`Î>ƒ¨g!ÎFÛ´ó7v“qàD&ß á»‘qó/ÝúÕòF⇿ÁýÈ/[˜‹„6ÁÀƒÆÐ¾Äs€Á°ÇšÉteŒç“€/Ð+·KsFÜn§ZLŽ˜oOkbíÚœ`*lk…w]s/]#-²øfÖè§{k¡¢õÞây¿6ÂâG`çü5/¿vTrm§×t/pÂÖ¾¼ã¤Yáð¾t?‚w:%Vt×éFñawsvE€kŠº@ûB=™®…‹ÛÜlW‘àÌ‘Ÿo×í ›C%YïŸg×3cΓ±b+~; ”x_‰i¾}19$Bo»%î'$šü´zõ†(ƒ÷GÝÙu½œO+a"]×:íÚ¬}€X$ðÇ2ë†)XSo[`3³v)Ü×ÄëM\h÷ÀÀ¥ÖX'“ËzÌLûA«‘Û/cK⊉HÂo36¥ UaD3’ŽÀ»Þ ‘ðMc ,°)¡AV/pÏ(ƒÝô˜™Ê{ í±GƒûaÓÔ?ü6Ìž«$™˜.HJµöô(,ÂÎãÝ%bÙc±t‰ºMþèîV®m‡4SÃc–%›…‹IQÃÈk.H®7žüm¶>Âm—B®X[BG»Á‰_8í ;çð—W(µ£®J‡/gd ¨Ôš ø¢=çuW9oÜ»ÓCÆç…DôDoü³nëÐ/M”ðÖ¬¿q„oà«\ù&dÁ un½R›¿ñ1ÑœÍ=Y°—A¿Èå#~†=«Q_ÝMJ4‚ äî¬å/䜽bL4cQ?ÁÚÝhç1†©ŠÓÛZsϪ1ž!ÍŒ=Â`A\‰ÓÓÈŒˆ7e¤ÆòC¨[ GŸÁ˜#PCšüÄSK¸sßA¾ã§à$“CY´P-‘÷„•7)ˆ”ܸ(ßÛÓ »²%˸šáš ÛÉ3û«Ñ[ï­ÌH¬)AsF¼6%£ Ô— ‰|ftZ¯/—´ç Î Ìd¢…Ú57¸Í7ÀÚpAê߯ßèVoèèǹà0Îß*hˆšøÍzÃCK:\pm òÚVõ¼P¼>ïýí­§ðû»˜BÅzªÙç_ Øöz_$|Á€¿Ýöì«&R‘YÃв\öIùÄÇl—øåId8±PÉ)T–ôìú`W]aA²ªI­ Å,H Å;<›[0º…ʰ&5æ5ìd°™íÍb'ÝÏKÄÿ½Œ•»Œ•OÅ™Â[…§‡ð‹lìæx2…–Ç$ÌÍ@#ÐJ6ð<÷0G[á`™#Ðx†!/cŠ’¸÷ƒs!¦Xf[°óŽs¬*çÔrÚ6x±bg¤ mµ$1 ;j8ÒIR¦Úz¹BJÁ!Œ1Y.Š¡Xrïö­ -¡0!ª½3…ñê„ó/µ’qþ0bç}{Ù®Çø(û—ñ !4½ã„(ò¨3¹ ”QÃd*‘ ûe*ߎ:°CÃë ìÁâã_àüdhó7ÇÌ`®¢Œ-ÃUxlØ»Æy/x¥ˆsX0_cLï{@ʤ³M€µ}•™5‡FEµ™ 1y-À±éNÙ†‰X÷· ”J×Ìš K1a¹‚µEÆÒ¨Ã¼·A¡aµüÖÖ4ïžÀ„éÎG¢Êf¥†ÞÝŒG€ÝÍØH×3ZOï ézsBL’‡Ó°6KMX’ îUÎWPpÇRšÍs–yÁ “œÊš) $뽦Sè^S!vIY0¡.™¥¬·DyݧÌzOKÑÙ•©¨9Ýø 2ë}jôv.~Ú»"­€ févJgðÃ×Aˆy {Ün½vªÍ¥œ·]9¹Usx€C©bQ]Í9’}¾}°E7Wý¨+º’"ÑOa²ZÁTàed€¼f§‚ùè‚¢ ]Nu©¹=  î¹Ä®”לStw=ÍxÕžÊWÙ•ö}c5ó¼'ø×ÜÎq¯B=Ò¢²ÀŒ¾Jð‡˜n5­×¢ƒ„‚q\FÚ^‰ 8·Ž5ýÖ’µ¼XÛfªÑ~?ø"WžG‘3œˆKà±ûd©ºÂ‚ççÉÜ„NHÈ>,-ó „y’³òÁ‘G½Xé6ÇóÈG½¬£šá9±z:Èé¨cNÚF\"z-Àrmì>›¯„HeíwCll×>Jô¸` ùl*â$[‚oýȼ‚íîÌ.þ6»ÔÞD¨Šõ®‡Ü±¹­†ä9èØÜäÇ‚csw>×ö#úEák8)Ђö~ÆoÖøï|ÆYfSfŸ ¡ê*ÁI®›}››N<m¯ ?‡À‡! ¿&T,ð˜ üéÄ®qXØ‚‚ ìªÛ^Ó±Î,Çì%®Ó6Û:¹2|™HÕ}Ÿ7õP(@ɬÉú<ØÌíÃðod©wŒAÊŒµàÈY˜íQÂ7,Ù5Ñ„Š»S`Ë‘*KqØ2àYÁ=o)6fmÞjîç ¥Ây¬P»v³3¿Â™ ÿgïû |xk148¢ìØS©¡Œš”ÿBÈ1¡Œ ³Çi-ðœbh˜« ­q9¿†¬ñ¨1WAY0¬Ð4Î(Âü†%˜p¥uf~ð7ø¨Îö82›ÀÙns<œM p?šÁú‰õšŒÞÀVâ])“É¡qNઆÂב;â\Ìô9,w¤ÓÓ)fû¤T¿‰M¢šëuîU’e’(Zr7ë»:gŸ=0JøéJBX"¶áÉ{U×ÜKJÊ3I.Àb‰qÞ.Ä<÷¢Ó™{O«Ò®Í )~L¨~[!ÖX>µN Iû/Ø}-°Û»’¬—Å•_¡û¾‡Qµ‡±O©îî‚~#†ûæA—Oìžû=M¢â ²M±ÐPî,¤dºUsÀ®ã܉‚"÷Ô Mò=i¯°k;ŸNuƒ&ÆCÃç*¼Ÿ~ÁóݼÑ*ÄúR»5ï‹5‰ß.aÊ/{K¨líz˜âv»ßQs"aêùa{L9Dj—\Ó».}µží$ñó3·ƒo÷2‰ïŠÚž B°*#3Ûý=®¥/‰‰J9±‰×­Ézæ<é‡/ ÙÑ–8›xïò‘ò½…çf¡ãÇnf¹Ôþv……)Î{Ý=Kœ?-ݶbl'Ño­P;½ÍÄ»T–g´‹b/8Нf£Â´eТDßY©¿þá åÎ>–Z®ä ›¨L-èãš‹=J¯Ê@#á|äeYÅVMb}5[RI¾žÞ4J!Ü©§OÅõözúf])2£¯$Æàró÷šõŒG`šV^ÒV4gÛŠK‹y÷ƒ* vn(®)v/ "~Û¾Âí)=_!QÁâºb‰Y²†ÇŒôªë”Yón'g8Ûã 9%KŠ_7¯¿Ñ’àƒæ†o›n3»Óô¼©ûãTû°žVøžÃ8IëÍñPrø)5F™39ñ øŸ·Š€·†E Qê °œU±%ðÀÙsÁÞ1¾ßV±V¯“FMa2ì!Qno \çMº×Ž:s7ëý”YÈŒs<–9¼²¢Üz©C¡Áw[L:ÛÅbëŒÎÆj/ùqÙ>&=&ãÖµ"ió™XpÕT“fÉÇß`®§œ©‘Ñ0øÂ2·frûzfÔ¬·ÉgFM‰+Qî¦Ç#À¶rË;!Š(º´ÿsúÞë^ƇÂ_¿¾dCªQšY£|Íê”ì§ÛÛ—ö$z4®è"Õ ë÷ìNªÑ—lhíÙ^ÏXèô9Y4xrÊöÜ^ßqj¯üâÅJ©³ììµÍ0cÎÖ/BÖæìZ?~ÓÁo<ƒ¶ò,u±Yî4φËùß «®+~Aß„ ‡k¿„GX÷•}f¬÷0¶Q*¸nhK3E˜ðl‡ŠÕ">– ˜ä›hì¿iÚËMãpÜÕ²fÓ@øpN1à™Ãýˆ,³à\cÏbØîºœŽ å®uŒY$×}åÔŠ§¯Oÿ +zÿ endstream endobj 7851 0 obj 5156 endobj 7855 0 obj [551 /XYZ 39.8400000 329.299999 0] endobj 7856 0 obj [551 /XYZ 39.8400000 722.899999 0] endobj 7857 0 obj [551 /XYZ 39.8400000 329.299999 0] endobj 7858 0 obj [551 /XYZ 39.8400000 722.899999 0] endobj 7859 0 obj [551 /XYZ 39.8400000 614.419999 0] endobj 7860 0 obj [551 /XYZ 39.8400000 447.379999 0] endobj 7861 0 obj [551 /XYZ 39.8400000 447.379999 0] endobj 7862 0 obj [551 /XYZ 39.8400000 614.419999 0] endobj 7863 0 obj << /Type /Annot /Subtype /Link /Rect [408.479999 466.579999 491.999999 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args >> endobj 7854 0 obj << /Type /Page /Parent 2 0 R /Contents 7864 0 R /Resources 7866 0 R /Annots 7867 0 R /MediaBox [0 0 595 842] >> endobj 7866 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7867 0 obj [ 7863 0 R ] endobj 7864 0 obj << /Length 7865 0 R /Filter /FlateDecode >> stream xœí]K䶾ϯès·EŠ’( `ï#@»@AÁ:ŽaÌÙø¿I¤Mê£Äb‰ý˜‰,{$YÅz±X,~ÿçÏÿ<ýû÷Ó÷ï>ÿçôÕþûîóSq.êÂüïÔÿ÷ÝòRŸKiš®Î²íÿwúúòôíôíéÓÓ§îÿ¿=‰zøÐþÓ=»0ÿúÛÓ÷¦ó'ó—ÏïþÚµþw’§¿t¿~=ýýÝ??Yxý /Oº­ûƳi)¤î~,[ýÃ_žþö‡ÓoÝô·ÿÿïêZ˪{'eߦOÅðßòSÔY÷—²*;"!»qV]ë¿ÿzú¹ƒ6Ã*έU­kÙtm]”æç.øì;esj›®­]ð>–;A¥RRñêG$ÒP…j ÎU!:žj´‚íeGºª» Ýó¤i\Ùÿej ûÊóüvÏ›?/:¬TÛõÛÖê¤UaûÔJÝ\4Mçʶ.ûKBrìE-:áFp¤ß‹i¯ã8vº vR¯ºcQÖ}§CsP%¢é$pjw|<¼ò<¿HÛŽE­mŸ]gc7Ëf= ißdEÒô2ƒî[¼Îô{1íumOKj§ )šVŽxÚ¶4 Ú ojï’ʲ«i¥ ££©xC'˦KÍŒŸ–êò –ŒØM”³Â¸Ž_m›•“ÙÔ`hšå¤ªÇ¦}áy~—Aµ˜GKÕÊiŠÉLŸFKK͸‘KN,'Za\ÇÒrÏLîË.[%ºyVM±;àcbÕE*5üQqdêªàT™(J jc@ƒ"“¾Q•A³,S@¥Ò Óö#i¨¤Ç ¨¤¯…L¤ŸA¥’Š' 9Œˆ‡ôPdÒwó9 )‹6ÑT2Å:è‘HCm$=ņ¯ûàdp›Ìþ#¤dÒ5³É¨‘HÂlœ‰žî`çдÃÔûÚó1¾õ¼ø"=/D/ŶçasgìÌù!Ì0ÔÔN É_à}Ã!Üv² Ô‘æ•yrñÃZ”ÅfÌ'J{ýqc¾ î(Üó‘ß–ò˰ãÈ”“s¦Ü·À‡?~yúþ£PeŸxrúòs¿ìî;5ÿ|鉢<}×§Ì•ÝÏŸN, ùñO§/¿>µçª-›Êä#Ú'zR4œO„ž|øÒ‘ê0Ä¥lÄÕ;8TüäH¬á7ï!âõIÖ IøBOJÜ|R´„±Aêà±xx>À'eü“À,4s’ȪIH‰˜.LÆ-–Í$«3IŠˆãS(ß?ÁР‚uÔ˜:¦ã°äcMF™9ܦ(ì§Ä4À£Æ†tK“­@åÔqkt„ŽÃ #!3o„L:n"‰Â<—I'HÈsc€uœü€|| Ìõ±aÍLø&ýâæê_Ò¨1P8ë+‚ÇŠ)zÖ6fÛ­œ^®â ¡Ý±m˜‰u}ÛP`O…àÃVŠ„å ÖKC öÖ²ŠY–B7ì±â±=ØšæÍ˜0=V Õ²pÔЛ›q ðÚÝ h6•a×zêÒ ¦]ŽÓî Ôü†Þ|Ãê¿!Ü7Zç eÌ’>ëFËÙηÖåiÎ…7qÝW íÕY™7¯cmQËjùc°¨Î¥Ôââxo¬˜Ú",…Þ˜ÙQJ÷|‹Çê©§ýtõô¥ÿ-aDþ"¦Üƒ5²râ\‹R‚kx‘v{ËØpüÊGÉØ€ßÆl~mFZ#vFc¾½Ýí¤8uÂ|FdT܃vÉIQUŽ–¿K~ËV;ÿ:£µM3®]^O$€tâ˜p.4"Ðú–#ê`Lñœb®¢D…3Fš¶Ù¦Õ GŽ©BN*áØpER\SöîG÷±F”œ1¾4¾í•-æ±£×rtDÊ(åi5Ö&¸½HxBª ÂñÅZ–£Í6jhOnyÔ×·©ØãàÓj±¬v ­Ëò+x)“’ˆÂcÂ4¬ç"bº°dè¾¶È\RÈ óáxPŒ´E,Ëa[Lº½÷ª·!!‡œÝ²¦Hˆs¥ê~Òw+%Ÿ0"Šç+]Ci íXˆ;ŠÞ{°8å\K„R¸V–1fÆù!Ú÷ΰœYø13Œã$X1Ÿz˜, ¶U<>ÀÖHŽ<}$…c¬Á³Aºî×'vK?êdsD}–”¬©Ybк•î ã³FXY¢”Õ&¥àÎþ²I§y÷Ÿ"N©fpõàÛ•JhL-]cr{1“€JH"õÊ ìàó·]Šcí oU’‡ò52¬P•ÚæˆÃôŠ»tòþ‚1E¢ª»Tù÷œòÌ& × ª‹ùÐÜ•jyoì¯d§xí =v­q  ­DÐÞ Œi]4ãN@î@1ÉK–{+æ°wṖ3ÿ+%âú—eÞsAûo~‰ðöc1 ‚t|=ˤÅý®ßƒ^ Ä{í KdñAMØ­íDr”©hJx­kG ØPõ‚¬?¬ËxÜBóD³í—0¥RŽŽaY ø^…ÓSª»a¿–åÎÎZ0}±ŸX¡tìþÀІ¦<ÙQâK!óÛcö¤¢š)Ý+)Ès*Ãóçöô«+ó^v|d¦±®•yË 5¤±{¥eë0÷Ú>7!§ ƒ÷Æ)9Œ8§€áÉœ“‰³ïp^…8wç×ÀlƒÀØ`ŽQ€¢¼«x¶ Ù‘¤¼—\¹¹¼˜Rî %dòº)´ÆÜKàxœÁΜ/„G3£ ´Óæ%QôÖñÖ.d±Fª˜R^ÍŠF¡d:bh}{ˆ3qÎ9ofy¶û ±lBºñz׿É;—5ºõJêÍñ8‰õÔålG…ut®Θ3«Ô¸îÌ™ÿªôë;éÇ»âÕ«$kÍëcL3­é°®Àyï¼³À¼dz@ˆ;`_ž$spl”3oþO^ _IçG¡ÇO§£0—cMLàXÌ/¤óL·¬7nølR.¿‘7¶…džõ`@wRVÉ/‹´ÖÂ|€yçú«~Bܯ$œH¤Œš7îÆlC1_ãY ø¼øðî„Nç¤ÓÚú_y< ™R¥àÑô-%ŠqÓÆ]®LµŒIѼ®†ûì {hïE@=P}~Cñ4I1Û›8S_©ñL=_|p#©»šî8&Qú†.àb­|­{Šy.㉸$p4,s¼?E‘åì, ¯ˆ’ÎûËRF‚éˆâX óÝ#ÐyB”ƒªÕXžã ø±$‘MíD`ïàêž ÅÆù+%kFÒ¨)L†}'ÂŽM`MÌ[á‰7› CcÝ…cÎÅeŽ ðan³’T&]Oׄc2æM ʤ™'ÄñzŠ9Ó˜²ó‹õ"ŽcR¦‹°q§9Õ÷iÑ2íP¬S^}ÕŽ)0}…Ý&JºEh¶’/2鸙X0þ“€“ÜQêãoû£˜-X+[R*Ðv÷ ³@Ú]Á£&ø¥X—Fk’Ŧ䴑ò%2hÙ8b-Œ3‰¼—幤+Ó•n wøuf÷²oe2^M™Œ<%(&%ZÐ* r@ï†PÊ©EÔcï#‰VŽ5 ˆé«þísùÖÑY+Œ9ñŽ‹`í2ñ7\nìfêjeßI;¤|¦*7ä˜Â û«Jl^sUóö™ýȪ„Eí×+O~^¯ç‘P‘*©J«—©±­ÇCÛZ WÍ6iïº*æÕ¯àî<ÿž âòewl B;evDÖ‡ûvÖZ“àa–úÒ™—ð, $Þ«›•ûÖöÌEœ#\W½Daº”*õûÍe€+8jhÃÊ”eu@ýî¿_ƒ7‹iq¯Ç5Ã8Uã€;²>Wâøò}‚{c&u­š¢18¢¡ÌO`¤ÇnÑ­Ø^åê ›±°rk€7K^ž©§||è-t]\ÝùÈæpiYm³¦äuê©›ÔÐ —2wYé$•ƒ÷~ÙN® ¶ët„K]ÝéUí¦„Âà7ÛnÒA÷¸ÜA­ÙÍ›nêþ;}ëØ¦ãŠþûÏ×—ù XÌ ø)È‚ÁO·oê¬O¢Cc­æ|+jsÅ䩜ŠlXÅY×çz=îܪ³GN#¶²97ë±µfå‰áþ²<ËÖ9§d™¯:×fz\Q_ëGÃoZøQw<Ë¢¼¸ÛÒz kÐ O/ÿò¾k¥xÃèkTמ„‡••¸oìŒÅànÇ6@×õmY‰fs¶Åñ|`u@€*ï{,³û¦h.ï8- w¶í¡Ë5øpN1à™Ãýˆw,³ uQŸE3°åtX¹Ö1~²¨ˆú‰S+ž>=ýôôö endstream endobj 7865 0 obj 5335 endobj 7869 0 obj [552 /XYZ 39.8400000 785.299999 0] endobj 7870 0 obj [552 /XYZ 39.8400000 209.299999 0] endobj 7871 0 obj [552 /XYZ 39.8400000 785.299999 0] endobj 7872 0 obj [552 /XYZ 39.8400000 605.779999 0] endobj 7873 0 obj [552 /XYZ 39.8400000 605.779999 0] endobj 7874 0 obj [552 /XYZ 39.8400000 416.659999 0] endobj 7875 0 obj [552 /XYZ 39.8400000 301.459999 0] endobj 7876 0 obj [552 /XYZ 39.8400000 255.379999 0] endobj 7877 0 obj [552 /XYZ 39.8400000 416.659999 0] endobj 7878 0 obj [552 /XYZ 39.8400000 255.379999 0] endobj 7879 0 obj [552 /XYZ 39.8400000 301.459999 0] endobj 7880 0 obj [552 /XYZ 39.8400000 209.299999 0] endobj 7881 0 obj << /Type /Annot /Subtype /Link /Rect [60 428.179999 166.560000 435.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 7868 0 obj << /Type /Page /Parent 2 0 R /Contents 7882 0 R /Resources 7884 0 R /Annots 7885 0 R /MediaBox [0 0 595 842] >> endobj 7884 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7885 0 obj [ 7881 0 R ] endobj 7882 0 obj << /Length 7883 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWèÀr“ìnvÁžO€6Ã"‡À›Ý`±³Èdùûi©[ ©dÝ’ÚŽ“oÆO¾>þmøí[¹ýëð¿_·?þcøñÓ4Þþ /›®o÷¿ü6þ"¤ÝðŸóßöÿÞüýOÛ߇%t‡q÷ÿ~hÛ¾n›6j¯§®âð÷¼+šløDµ’[!ä°ÎfÇÿµùyí´Œ]_ ¡ÛZWÁ£j¹¶—jÛëv+«ÞÔÚ[ØP"r -”H2ÐaE"nk¢ªµ{(.èµì»ôà ‘; ú¦®Ó ´_‘ˆÛÚzÇPlзýHa}»ÏãHј`šö+Q;;ŽÄ…{'Ú ZJEnóm¨ØdŸ†mV$â¶6AÞ1ôêx²û:v£*“è¥Ó ´_‘ˆÛÚôÖP_’(òM xut|ø¶ùøÜížo?Ë8hMão/Yo?ì5zhýiûçAujØ~ûõ°ºñÙTúðAýöÎû sPûÖ,½ñúyüÆ®ÓÍQÿ[Ä8X3(ÍyËã¡Eïª^z½ ÿLoÒX#^<_Å«·6*ÚŽ|0q#£öUûý}>´uïoþó·`ãȯäWW#ù ‚jœR”Òïôp Þo^›"áMÚy:|Ðîu€èÙ¨-ö§K-xbØ"p8¨M"‚Û°v\}ë]=Nw¶c“4…uôð.FÒò8lÀþìá­µ6h­U7mXŠÎƒbQ™Óà¾x­Ÿ ‡«Å8í¾ Î«á¨Š2OŠ?N’Ы=/¤Ç™²Î=Fµ 'ŽmÁQ¤ý`bØBù'ÈDÂw‘ä|ØäiQ $B‹eL£ç mgH†B\Žb× kÐgâ‘"€¬¯ÎWLßk:›x>HïÖ.lœ„/Àêë8è–†®{8F…Î!,ÆB…Áë¢D#GaÂgØbÝÖùÇóA˜°VBЭÂIŠÂÿ Œg&ÕF~¦Œ²coW}/;fÓ¼bðÁÐÚ /¨J]!ûJyàá×ÂuÉÁ¡,ÌÁ{¨Í÷,cv‡4Ö)½Š¢MÊØŽyñZ!kö+à«=á^ì YŒª¥Ác—›'UÑÝlf‡ëͽX(îFi¾›k¥ œP²>'¤BØœï6D„_O¨§_xI±0îÓê2J¢®ê IDнÃ@¶@ÉõçTpµB/™º!Ӵ塚ß5ÖQ-“€¸Ô¢`K ç‘ôy&ê¢õy†-=lé’®úöÁ-x4¸jÁY5ÆÏ'FŸGDËP¹>=˜bÜCˆH¸ïŠCåOtZÆó(ØÂ¡ …Ïs)êƒóL²vj9TŽñ÷ƒW­ Ry_ûùòìxtŒ¶`áñnîd˜¯¦¥XǪñ}Bt½òxþ"n…ºêú´Årî#X+^†´U—\ÚºÝ:´hO~}É7ÉûÖži(žÏ„ÇfŽN–§Á4Þ€Y ¯Ûž„V >Ke¶·ú„…Z„OX­L<æЦˆ¨%Ú%x€àAîõê8„÷eÂyÆø÷û÷aà¥Yž'ø8O| j8æ‡à7“Òç×¢(‡È€–O^Å–Gþ0¯ú‡lñ•ÒÓé'|[i=c“ÐpŽdŸ“9£ „)fÒÄ«2üáŽö|áŽ<žxBÐò#—(Š EçGEcÄ@Çrê²fF½qX1g¶d8¥ã Ȩkåë¶ßÁ>‹(¶G:^¨Uî³!¥0ÇÜqu›…ß™wQ¡pª2é³TžO÷‡ª'Q9Ã/ÞK6‘…k™‚“I‡ãÂqÒW#Ïìy"“S„bëƒ!úÅFã“?¹½®MkÓ,ÃLÂa\iL+ -ÖæÐÉž&Ý9Ô´”\ åPûd~ƒC­:¶„g“â·¥2²­YÕ\÷PÙÊK¿ä‚CK)ô{o§Ë˪s[ˆxé <-Nùr¨»Œ$ 6#ÈiøÏk•Q}k2@laaÄ4T dû(†g¥Ã–”_ºôÒ€n·^ £6SÁDÏIOwžüaÏŒk 1w»ð¤IL@ɯÇÐD7`¿‰´T*Ç¥dbXoBÞü#ö[6>(7²;YÎçàº7%ÁByEƾ93 Üyuç¥ß»LŒ¡•:-ÝQxJRå¾Xè'<…„âá»àdœÐÇE„š¨Æ¿G Þ¦>Ž+#ü'mÐvÉ Õž.õC>Uw }¹îéOšê`åje¹Z]鮿H§Á‚ÃcœÀĉP*úI°ÏhÎà IÇ|s®%C'm(§„«–Ќͽsiy'†#4uA«µ<&,©/Ôõ)÷<èöµ”YiwLñsw$4ms5FKÉÐTòJh±‘" ÷Z€æ—–z8Ü8ÅyLpÍ)7å”3æ’á§qnÛ=_áûŠ¥ã'A[á[kµ±59Âù’ÛŠùê€ ??úíæØc ‰5| D”E%~}=‚‘R„]U½=T+nt»Ûïðe#…8ÿà·Í×L”¶Ÿè=©MY/¸–%q³²©¤ûQ`€|M_™8ÈU.b§·x\ø=“8ïåˆá›œ'Ž‚ÇɉÿÅL„BYÌO¸5XôJ¨‹è¿–)eB8 ê\îs|t«„¡íá{õS O¯K(˜z7•ïSΫwgŠ›âåEó²š"ýšrþkf/¤©™½‚Šã^ÊøÓ7ÐAu.ãU¥ºŒñ§2m0“t»`ƒÁ†œÕä<¦ý QWi ²ž-ÍrÍÕ<äЪVóŸöåk¯Zé_q«ÐMŒ^÷vndõÑP†¨X ‡,&pÍV½LŠSÔ8!x8%µ]7S_-9Ží$´ä¼}pEf–œEyd,MVKŽ_©Í~EìrñÒÍjÉÙÚ–œ®ª5ÂÞ\éã¬.„ºÓÐ:¢ 5Á¶ã(QÝ#²[m;΃ÛÒ©—.*MPòÃm;Ž 쩹yð ~;ID\T©Ê‘….&³Å‰ûyª”…Ãrßj8*YYææ˜È·„¥¿s&ö3ie8 OÁ‰–´9g™ø[ь玃‰Ê»MH#•$YuÊ:ÞJSíÃYp½œ%gpÁ£1jÁLÈÉé£zR÷B†!²LÚÁüñ:aB³ Ž­2+ÂùËü™ÇitnU&A¢Èüw\Q#¥ÖÀ᳈9üäS4RÆÍÙ±ú2né¥2dÆ?e<ñJtÆ‘¿ùËd5•%¹#(’âlÁì·ÎÃ;ç!z&MáFîÔ…ïd~ &ÇtÃɵ¿æó´o×3^StëÕ ç½J`E¡”Ù²_åÉꡚЄ_à>(•`W%c‚¶çrŽMšv(*œ—Ü7#…ÊJ¯$:“†¼ºHÔðm]U lÖaB, Ùd‰i-Æ›"Ü•«œG Ö{A-ß{Ù×ZÕš’hÁz}+z·éœ‹àfŸÇ·*SD&#âj7K¢BEœeB¨ÇÀœ©ÀR«øâ”Ö`<¸o×8YA’ÆÒÇJðoÍC½•;žb?)É7‘›¥ì\ø“™c˜µbKÁÎî¤)`ƒð,œÂÚÉòãq^ wg¢¸íF.%et~ ¨H5[ì÷USTš‡»òϵ® 6£E¥¢JRÁË„ÑgÒIyMô¿-‡óRǼV¢è!n@g•‹bÔ™HZ+bM½²èÙÝOògÄ«-yá8Î’Ô¶3Óöðwû:ì{ØÖþ Óï/@Ø¬Þ øÅ CgW¦¶v+†m\ +ìE;æ۪ꄑtÚv×^¾õõ°c©wú²Ë£¾Ð2²¥v²7ÎÕt'jvíˆ/[—æé`ŸöO¶–;Y©w‰Ë&EõÒhã™8ÿä ~w4vøŒúLöÍK-íc:Ò´>Æ({ŸÖv8T·ÿ]6B{±=¥ð#ÑÁÄÄtÐX}&KÕЧÒïØ©ÊÄöd]¿4>Ä)¦Œ9> endobj 7886 0 obj << /Type /Page /Parent 2 0 R /Contents 7894 0 R /Resources 7896 0 R /Annots 7897 0 R /MediaBox [0 0 595 842] >> endobj 7896 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7897 0 obj [ 7893 0 R ] endobj 7894 0 obj << /Length 7895 0 R /Filter /FlateDecode >> stream xœíˎܸñ>_ÑçÛ)R$ Àú ‡† ä°È!ðf,zqöß$»(‰¬Ötežòˆ*²Šõä£ôæÏŸÿqú×ï§7ï>ÿçô~¾ûüÔœ›®±NÃßâ_p}n¹•–gn†?§¯ÏOßNßž>=}êÿýöĺñEøÑ?t]X„¿ýíéíüÉþæó»¿öÐÿNüô—þ¿ž~ú{ÿãgÀ74x~Ò¦€‹g\÷ÿ‰¡á῟þö‡Óoýôˆwø÷‡N5Ò¢jßü«lü¿ŠuÖÿ¦Õ­Ð'Æx?NÙ³ã¿ÿ|ú¥Çæ‡q6‚1Õ Õ¬Æª¸E+NFu'fD‚4¡m%ªZD²U4ˆ†±:ÒX#TU1ëUÃG2¬¥Óaªf˜2¢~D¬Š2Çx 8Ï™ìtÇU릵ÿÝ0J-¬ ñ¦š`‡ª‘iˆ#bu¤¹9ÀQeÃz3:´Çà¸#-»“hzûõ ƒ!î`M.¡õ`މ:eŠKaúPxÒi'Nr Û©”ªsMáN°pà´Ó*J}G"NÇÆg c”ºn#¶Wõ«›IÁnÀØ›D`ÕÙ&—к’¿ºÇÎ…vò£íh‹‘Ù®5-¥(Ò“~Hé l|£´8°½†T¦ w´<âÔR‹»6—¨}%½ºiÜÄZœÀd™À#ÇC{jz·~ ÓÒøù 0F/ˆUÄÿjQæ½§p¢¬/=%¬or ­ ”VXZŒbÄh;šÀV¼\kZJP¤'ýÒØè”£”Ø^/Ä–V€Gœ X»6—¨=…Ò 0RN`²L`ë|{jz·~P`Rz?Òbô‚XEü¯e¡½Ó&˜|¦µf V+mgi0v#FÛÑnœ2uä”vZO‘[ý¥¤3°Ñ)-F©8°½^ˆ-­›`éìÚ\¢öJÛ‘p“e 7^‘ê§6¥xá&¥7ðÓ)-F/ˆUÄÿjQVwzŠ“ïàAª†&—К@iµñ‘ªiBÃÚøV“Sj1E>‚¤t6:¥Å(U˜±½^ˆ-­³`éìÚ\¢öJ«MSÉr[އöÔôo#ü¦¥7ðÓ)-F/ˆUÄÿjQ6Ü;=ÃÉwð(a¼qÂlÁZ¥•Œ¹HU2îãð)Ì\ !¥ÐQ„|TZR:Ai1J¡¯˜íõBliup°ôvm.Q{¥…‰q:&Ëf>|%˜Ú„^ÇÛ¿UZZz?Ai1zXEü¯eÉÚ΋²ð&ßㄵnÀj¥m¹‹TeÛú8| sÁHIiÛvSäV)é ltJ‹QÊÚnÆöj!ZÞÒ{ص¹Dí)”¶å>LuL– Ì}øJ0µ)½ÀÛ?(0)½ŸNi1zA¬"þW‹r+½Ók;oò=°Vi5ó ¿f!õÂ>RÍ|ÂõCKg`#(-F)ô³½^ˆMH€'VHø}¿®VZ˜Ø§c²Là„LmB¯ãm„˜”ÞÀOPZŒ^'VÿkEY3Ÿk~æa«•¶õ ¿nCê;…}" %¥­Oøã~Hé ltJ‹QÊBÂl¯b àð{ص¹Dí)”¶ ¿c²Là„LmJoþI_´ô~:¥Åèe!á'˜_+¿wz­ò&ßã„uîD€ÕJ+;©j{pÖv4…] %¥pZ7 ·úKIg`£SZŒÒ¶Ó3¶× ±¥`å-½‡]›KÔžBieçÃTÇd™Â>|%˜Ú”^àm„˜”ÞÀO§´½ Vÿ«EyÀåDÙ“ïàQ´;‘`µÒ*å#U¥}>…•`9¥J‹)r«¿”t6:¥Å(•ZÌØ^/Ä–V€M°ôvm.Q{ ¥U*„©Àd™À*„¯õS›Ò ¼ðƒ“Òøé”£Ä*âµ(ô<;0˜|R54¹„ÖJkŒ‹TMÓø8<†Ç&—К”Rè(B>‚¤t6‚Ò¢”ꦙ±½^ˆ-­–ÞÁ®Í%jO¡´Æø0Õ1YÎ`àxhOL¯ãm„ß´ô~‚Ò¢ô‚XEü¯e·½F{“ïáQ˜[ 1×î{mWZéÎ|>…ÁHI)gÝù’ÒØè”£´aÝŒíÕB ´̽¥÷°ks‰Ú(-L¬Å L– Üøð•`jSz·~ ÓÒøé”£×]— ü§ÙÄ–ÊnWJU½ñ©ˆ6>»–mŪaÛ³†2·Šb*æ»r[þ¬¶ø@@U‹H«–‘÷ü«HsœOP}")LÁCaŠo™ß~yzó‘‰Vu8¾ü2Z:µ?¾ôäÊÓC…„ŽŸ¾ü|úcïeÕŸN_~}2giZ%mõ•O>|éi»ùH5s½rt<ï°'üGì Ø“öí~Ô‰fy<™‘v(G>lçUÛ¢Oð˜yÕ»@èõý޽ö @–L·Q™Í`cÛg¨[‰Œà²˜Á[›FßÁŸ ÍŒ µd §Õ-\îĦô^¿Ü¦dìÊœ‹8¶Œôá’„JEf¶P¡¥C)å%š{Aœoï Fc+™m”ÒÌ, |ËÈ5©>ïêÝú0¶\kYƒ>Aí?Ã-)ª3þâ3\¢éïbNŒ|ˆCö©Ã=Äæ¦hì0;µV(;KÑé~8a0Vétø…•`qv؉]Sç±bpô¡?†cÅG’ô'Ñþ,}òÜr͸Ì!á笘ót8jña5vÐrÆÝ×ðu=Ó±&kVwæL/L_únò‹d´a:7 ¸a½†› ™xÓ„š„^ô]pVÑ»-Ú N–YÏ=TöÓ)X& ’tD8÷p‚Kô§í§È¨Pò1µ%åfî–ŽB³™§ØbrP’Rê),̆‘áfyÞ ,?]óŒ¯TåQ íœà„Ö‡é³6M7å«<“Ž®ðäGt.Þ®g}‰¦'”“º¨÷›±oµe÷¾Enqª•.ÕS\~ñ'j=[q²p™ß`jŒ NÚAÊ•Q)¡P•JX¿!Ø\ ‚nèSŒšg©jÑÝD…G¿ì²Õh‡„Nw˜tn°ƒ‰Ngôó&)_+ž£ ï¬p[Xw§<ÒËXHX²éÈÖI[/]Ì-kxñjÝâ…êäÔ*=T¨S‘WVi >ækÂΗöˆÂ* k›Y1Ÿ÷/Þ6[íaé·$%u@yïm.ãñ/.OŸov5ûý¦ŠIcÛðÙ¹‰2²­5l]–‹‘O½©BãåDºÔ\Ñ’•¤¤Biwý8ï–Í_1óW>` ¬ñ_a9¬ñ_›À _ñ M¯è83Øp^ #áó‘pŽbÅYð3màô·éºÎo%ØŒ’5çN±…5úDÃ6¬‚âY®üë—Žq*Z·ýÔ°yL>IÑ'zýaö Á ‚Ùƒ¸'ëã 8Ž ŸYZÊkÓ‚]üdò‹Ä>‰¸Ð¥ètÿ'™¿]ë)¬X¹—°$™“™õ(õòJNf¡ó%Wø ›û\Ü6ÓúöDB’œ'MËÐÔªf™f{6žÑ$[IÓ— °™\Íà7lŠß†â=°B¶cÿE¹sÉ*æµaŸ3³î»>Ë]^¾*é&Ýž \“(’W Oõâ³Uã+–Yo¹\ߊ¹ƒØ`.JÌSÅ!\ð2%þ:!™uÁõqdUÀµÙìîªjw#%cy—L¡”½{N·Øµ|Qµþô#z3s¿½yÓà§Kñû,è æÌéRü> >ü\eÁyhœžÌm ü|wÁj|Ôø ó’û %ý”ÜäØó…’bq<™;'¸ÎÈ ~ó¿C€Ÿ¡.ºCSð~œ£çÕ>÷Ø8.娦gnY¡år»6íy’]©ÖõJv’}Á¡kî®!ùë4É~oM–—‰×o¦f¢æ g¢H³Ÿ—:#KrÂ*Ù*(Šu Ƙ,êåC±—ÐEqx| ‡Isï¿2ÖZ ¤\JñÎø¶,á½1ž²¿•xÏQãw6[üi|^r§6Ãk<Ú)Èð(S!uÉQAýžAI5 ¼~DÁ:&ÛÓ–îô,\T\>ǧx»%µ*J=>U#…1s;šæ¨ßWª‰kN`”8Œ“+ù¸ é‡.ŽoyÕaÇ·¼¿=µË&‘:>°n‘ûž?@Z0†øc ;nxêðÁZ.–Ôõ$-¡ƒ|ßP»ç-ÊLM€‚[L™»+„Žvóò5~2DûÏ,Ÿ ÉimÉõþCkË´6¼2I,9Äq|¢¦ðèÉ]|ÖFKßkôY›þïé[¾uh?¾>gúKÚ„~Ê5ûêò‚Vwb=ó®ó3¬;™Ñ©mÄÔÐtݹ»¾êmÄ9IŬ°puV×ï´©+O¬°´í™›ÙÇn Å”çÎ&Šá‰BûÑè;}ÇŠŸyÓNØÀE\ÃfSü›÷h[HÀ¯Pø{’èkOF(þ¶w`ƶÐc Bê˜K¦g–Ó7É,Ÿeä@&ëßiÔt¡µmæ³ &î~tNq9Àg#™­›î̆KmÓé€ÌýZÇø“¨ú×'J«xúôôÏv5* endstream endobj 7895 0 obj 5262 endobj 7899 0 obj [554 /XYZ 39.8400000 178.579999 0] endobj 7900 0 obj [554 /XYZ 39.8400000 600.019999 0] endobj 7901 0 obj [554 /XYZ 39.8400000 637.459999 0] endobj 7902 0 obj [554 /XYZ 39.8400000 600.019999 0] endobj 7903 0 obj [554 /XYZ 39.8400000 637.459999 0] endobj 7904 0 obj [554 /XYZ 40.7999999 563.539999 0] endobj 7905 0 obj [554 /XYZ 40.7999999 563.539999 0] endobj 7906 0 obj [554 /XYZ 40.7999999 258.259999 0] endobj 7907 0 obj [554 /XYZ 39.8400000 178.579999 0] endobj 7908 0 obj [554 /XYZ 40.7999999 258.259999 0] endobj 7909 0 obj << /Type /Annot /Subtype /Link /Rect [426.719999 536.659999 460.319999 544.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 7898 0 obj << /Type /Page /Parent 2 0 R /Contents 7910 0 R /Resources 7912 0 R /Annots 7913 0 R /MediaBox [0 0 595 842] >> endobj 7912 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 7913 0 obj [ 7909 0 R ] endobj 7910 0 obj << /Length 7911 0 R /Filter /FlateDecode >> stream xœí]K¯Ý8rÞß_q׿´H‘ühÈ"@ò²zÒ |qf‘¿I,>Dª$‘,éè\°©#‰d=øU±X¤~ùç¯ÿùúßýåÓ×ÿyýþÿôõ¥¹5ª1^Ç¿ àúÖrSì´¼ñ~üóúûÛË×/¿½ü6üûã…©éEøo¸i›0þý÷¿½üb1¿|ýô¯Céÿ^ùë¿ W}ý÷ÿþû3Ô7>ðö¢{5¾›ãŒëá",7ÿòòoÿðú·¡ zªwü÷Oªcºg¼ª?Ü«lú¾Š56üÒöZ‰WÆøÐO9°ãÿëå¡6×[/ë”èšÝµv|¬¶x0ü3T-’JÚvVU[‘îZšŠÆ±:ÒX#ºÕªØÈ|ΤҊwCY7­¹ÌègÏÅD0°’d[U%ïD3¨Æ±:Ò¬ðªn²aÃpî´@ËaCZªWÙˆ ÆÒÐʪѮÈÌýïîÉþÚc—¢*G˳ö†ÁËùÀÓà@Ac›™—;Ó¼°Åy£5DºvDØ -‘ÀÀ7SĨ„6=»«ê•b"r,ɱ>6rÂ{>ÝÿdªÖ¯]« ½nªoj$,÷¿»')é뀴AIãÜ›).Ó'¡è¸\C Ó MqªQKW¹–¾Iûl%•zÐB#Ä©FàªtTšâÄa÷,-•ÀM_ùT$¥Ò±ðÍ—©í‘$²œTT5VY•¶jb‹cÛªu5¥ÚÁØ ‡úú©¾©‘°h”ž¤¤¯JtÐ%uŽs0—éë è¸\­¦†B(j«¶è›´Ï F#Ä©FàªtTš¢Asû,-•ÀM_¹—”T:Â`\¦´G’ÈrRÑÎZª^;̶űíNºšRí`dÌ8T8NGl3ó²Q$û4%‘ÐNP÷4: ‰t „1‰QÙCѱ»Z_ •¦¨fÛ¢oÒ>K0*AšS•–µÒ eíîyZR-OƒêÍ8¥$Öq'F+(’$ªÑ×Þ¯afïpÜ•§ö{Ú Åê1ÚjëN²¶wNò¼¬­Ÿ EJJÛžÏ+7ã•’NÏF;N1JYÏ#¶W«/ÐjʦN£V¶´ëž§®F°¦N`²ôôBY;Ç“@´)½ÀÛ ~»¤ôz~Ú!‹Ñ j%iä;©§hœÌÁ¼+­Ž|÷O ZÕX·“©Æ9ÓQÙú£P¤¤T5z^ùT$¥Ó³ÑZŒRÑèˆíõJlh…2s@ïÊA»îyŠAkkê&KO¯-;•@´)½ÀÛ ~S¦¥×óÓZŒ^P+I#_£¿Ü=ÕzÈ·å©ÜR X=h5sž©æÎéž—™óX59¥š‹yåfüRÒéÙh-F©â"b{½Z¡Üz¤·å ]÷<Å 5‚5u“¥§ÊÌ{®õ¢MéÞõÃ&¥×óÓZŒ^P+I#_£¿Â=-<äÛòÔa.P¬´¼i­§Êáüðy¹µ, )…†‚ÊÍø¥¤Ó³-F)´²½^‰ ­¶ì‘Þ–ƒvÝóƒ;Õi™,=½PnûJ Ú„^ËÛ ~À¤ôz~ Åèµj%iäkôW*§ÊÊA¾+O=6"ÅêAË…õT9—Ο—…õ`¡HI)—j^¹¿”tz6ÚA‹QÚH±½Z‰V(+‡ô®´ëž§´F°¦N`²ôôBY8÷•@´)½ÀÛ ~À¤ôz~ÚA‹Ñ j%—å[Ÿ ¦HÛ”Ðô•y®ªÚ„ÖvЦ¢±G¬Ž4“°VUÁZýP©SVn•Ü_0ûÔ÷àúÔÆ—›0”ýR}|áòl¹6?aF³kLÌÛ"§Øñ2Vh¶m‡r¨ööÑ»‰acÒ!¸lUp!<õ=xƒ`FÚ(í\ꡬ}cÑ… ñ@™–fÓXX¿)ÓRðôÍ^à4›öfr¨!zlO5\˜Z¥TÛ_ÄïÔR®¼°¡VC,´]4¦qq/Qn94Ä”Ì}³8妽™@j(—ªWŽr¸°V£‡í.F×Û5îÞ©¤¼k„“9Ô ãÌ´]Œ2Þ¡§86Ä”̵AŠÊcBÔƒ[׸ [ÓMIm$öb‚˜®q‘7(׺`µ­ÇìB÷.üeZšûFDõ›2-ÅO ã4w¡aíª3 ¢:°&Ê‹ðÃ^Äïº1µ ÈìB[L¥÷å–ÓApALyÀ\è8å]haëeÕ5é½&~Ø‹ Ylãî@×!¦ö¡™]ïÐSœ›€ bÊæ:@Ç)ïB [/s4îýäžk$öÂà wQY(×gP1æ2%¦ý¶±è‚¹Ð0”Ii†ÆÂú  ÓRðÔ:N3´7“¬ªÝ…öøa/bƒw(„mjbM{ÑxŠFÜ ”;NM S0×:N9´7¬ÊÝ…_ƒpf q÷ ƒÌM­vœ™\•ù…q'ü;ä”[N‡M S0×娡”[Œ RŸÆZŸ%Ê„÷ Ý…Á›Ö  \èhšêŸDʧÂ…™f4›ÆÂúÜI)xê§Ù´7“C=¬ÕöBx‡Ð]Äïº6Ôjˆ…öæÊ»Ïâ^¢Ür:h¢;-ås ã”›öf©‡5 Ü^ø=-þÂÀLë”ä42‡Zaœ™öæÊ»Ï2_¢86aÑ–ò€¹ÐqÊcBÔƒ›Ð~«A»uo´ËP„2Åï'‡!äøÂ{ÐD1ôÍA }Ö-ÅO ã4 ­c9Àš¡Ú^![w¼Cèa …Áãø"pŸ©bèsÊÃú¼=bÊæ:@Ç)ZÇ!€5C¹½B¶îÂÀ 4îÞ!ô0†ÎÂàq|¸ÏT1ô9åa }Þ1ås ã”Æ„©· žÌÂ: cè,ˆ(3¢:o\öƒä ÓXtá{l™”f—-¤çmSðÔ:N3 cèŒ*†ÎÂH2 cè,Œ¡»ÆåÊ ÛÔ Äšö¢ áÑ–@Ü ”;NM S0×:N9 cè2ˆ #É,Œ¡³0†ÎÂH2åX‚ÌM­.}ªçÉ…ðhK óÊ-§Ã&Љ)˜k§ÜbL(¿L M qÒ•?~{ùåK?öôí1‹mlÑü÷ííE ã 0C?¿ýùõ›¦Uÿôúí¯/ý­SRq91eîðnº£Ý Ÿ~ènMßv² m>Mw„×Ô*o-×lVk£¢Z™iFÜ„©´Ùq'©„˜~`ì&…ÒÃÓþQ‰VÓÇDLpLV£§Ô3=çë÷3«Eï }ehm+LŠ{ÏtL0ÞÇ_Qùô‘ÿº[æ+lCyŸZB×~å^F‡q>ââX Sɯß¼ªC&Zc­A ÑÛ¾’çî0…¾£±;ü#úÞ~K8ï#–°_/BøRDþ; Cï ”žÕœ£x;0º–Úé)•™ãµá”âÒÆ{€SŠÖ†kÃ5±„ü‚¬èN Ø ½^sx;h¯alŸ„ÌÚFfT(+D´Ì:á8þâ]mñQü¡@ Úi 0®dDâ½Æû¶2†JT©„£8&à½Æ{@kp$»¿­{d pbŠÚ¶g ªÌÍçÅÄ*¼6uʆÌ:„"”ŵþ9"©}2˜ I»h‚÷õôÔ â=@ýҕшºtøïÎÄìÖ ³9®˜ø°àÎ)ÆÊá¯#\àÇï :·âÄ—`6©çuéùôK>+xÆÉ®ãXI âòÞ§gIóô>‹zsç½Y Ü»ÁmC‰äðvpŽâñ!œx¯q×dË[[ê8ã´]ɦŸ•Ð.>_ßrzOÂ8ÇëÜI˜PbWW0ÇTø+ã»À[[Yù)XÉ*y§BýòdŠâoQ¯q=(ÑDÒYyQ|þ,k{’I»=çcÇà|Áøå-€gÖý->¿]¹ƒ£>V &%8&¬Ø“îà>ÙʈÄU¶„o´kå9syÚ{Gé±0¤8`èéL\a< ëL O”³~eÏ ä{"p`“¨.àwˆü¶˜µ4ºðôGÒô­cUb–ñ;g-%{J–~ž€ïеÅçN¤Ósœ–>†ÕèÂY_âéãsT„£ÆD¢µ]I·Ö$;[`k"Þõ>Wš<Á>ÄÍ&•öñ+o—öV|Áî032–ö$Õ£B|2è«Q}Ó}3ßC…÷Fkmý¾a¾\=¬î CC6<8ÖÜÆ½j]Ø»‚%+»`’=XMüC¢~ɦ¬DcñÍgû÷©%Iºº²K <Âw£!Cdð’ÍLh×R‚ñê7»–±je»SÒ£­ÍaÇ%Wòj@™4› Ù—X ÕÂژĠ-)¼VÖn‰x9ŸxÜ´n—.xtK õ"|*Ø-[̸J±&îHξádßäs£-)–ö‹XªŒz‹v.—ÁnÌŸÝîXd¼u2~G“¾Ócï€â1žè¨_ÁNèáV¯ÍnûšôMÀçšäͨH¢ yí ô´(¯ñvÀ _è5€¾¼ñø`•Ú$Ök¦°Úp¾ëxN눹ƒ¨`XíAVÓöÃsΦø|ñ%®ÄþsÀ€ÃEìž$Õ‹6îk Û³´Ï Ô®*Žñ¤&óy8Žmæ®Ã)aLãVæ­%¢Å˜ÌG’tÉÉ+ˆ—=¼ŽŸ±šC>@â‘VFÅm¦\)ÀÖËs:‰•8Ç l„®À>8/KzXô):œ(a#þ(>Dp@Á'o”Öä§Ác3–©Že¸5‡gmF)·¼Æ©ÌAòý Ÿ=¤†˜É’ÒØ>°eûÁV·l lWŽL»·{ÏÝ ð§ñüÉœ¨dã,ìõí¥oxøÃ÷—¯§ŸM7vaÎzPu“m4óÍƉ&æðÛc¬XÆi|%¶#cì“·vySxBp ï7»[–8n¤KJ$œÄ§‰uÂ!-£Ó”‹M媜rh©h·0ôú‡Lg ÀàÀç{õ9+ûJ¼ÃŸ'êQ +ä”,kgľ6&u™IWÅp¨ÝvÕ± %!£ýy$å˜4]ÈwbH»[˜veZ‰ëwEdð*óÊcíçøåãÈf»£ìrù÷ØPšÅC!A¢ ä-±¤[‰í^,›?j½à‘a9+†`ÑMBKûçwJÿZò¡7× i–_O™r88uÓFƒ3gõézßßõÞ¯Æ+„f„HÆî mæïpìñŽÔ¸5[þû óc—­ŸBTÆç56I­Y)ZåK2ùöçc¬ •¤¯×5dç: j*—]¤ª;Ö®ð9åÓ9¹¼srt”b6pS‹'§l¦È0_¸Ï°¹OÐÊÿ…vôdsï@c¢tì÷Ô>“°´·-fX"Ë4ØH¶Cs{Fòí#ïþ®”vOâæZбBÐ:êC£løÁÊßiŽo><}ü®øœ¶ÕH'”ë)9qŠc]R`Ù‘Á×!8ÊVÚè…s€‘w<­’10¼‹©oMÜùÅÖî8Ç©èw8ïè;Œî†â×r7|ÞŸ»ái»ûL—Ö½¹n¨äbGL±´ÿŒµùgñ4zØ)¶RÇœ2|Õ/flYÃÞYÃC>ŸüJ\ç‚-E§flðÍØŒPÒû»Rt*¸R}ÆVƒ‚M2+½ß¿g$IÏÄ«®ê+f÷õ‹ ¼êÜéLáÕ#dÊf$ã$ª[⟼C³ûX˜°íÂî3W¸îY§©Û¥õ³^bbukÏ$[ ÔDpqg¿ƒG “åƒý^ÏI±Ä"·²€%LÖœFsÌV•§ÅúI-Ö‘{t˜Ž íÂF1Mؘ¼û‰_wŸs¶ÇuŽÅÙ±hw§#Àãž‘çNÚŒ]4S¬ÈªÚ±uè kr«òøJÖÂKäx¥|ìVŠ@ÞwTãà$áøç^˺µ«âôOš<2£ó^ÐÿÜâ}ú¦ÙG­é]¶ žáùá%YNdF(å¡> E2ÔKÒÖ¶Op)X2_ÁìS\'±"ê…ò°Çžôâ=:mý²cù<¦ F“ZKDº÷~†;Æ}äñpê—צª©iÆ'!މ¢R®ùHÀÙáß‹æèõœ33o· >GÃóƒ3Û¸¶Éc²÷ÞŸyvfïå’3žnþ·€2”•ctHÝSœð7œ4ÿ@¬ßøžaßõsQÞó{†x;ø÷ÿà{†í­[þ’^wk‘ª.}}¯ŸnHLMÞWþÐ^2¨cTaO; vT}‰†Ñƒé°A¿‰÷ଯ²†©9s¾Z˜c¶Ñ*±¡ÛG‚Qؘ’Ch–(Ùzû,2 ñeÄSH`k&69ßÉXþ"Ý‹†ý§7ðÏ›R»Þ±ÌU‚=帒#ÜL˜ÿiŽžÁá‚4‘(cÒ“ñ±¶’¥È„õ%Ê›ïá?Ô´èØý£;B`5ñ»{™ŽšxeƪHA¶oÎW8·ÏËEÓãið €òã DÏed ÞëxN‚Dëo;É:áCÁ0±sÙÃ9ŸY£Xý}~KuËS¬8t-z²R§" hØn/Â8”tŒ9ƒ¿û!~”c ~'Mâ®%p™r)’”-Wö™JŠøqB],Âãó9‹ÚL‡\ÂçÄ1§‘;" S‘/Ú³kvž±3§f‘ñ=L’ÃQ(³ø2vw§•Ø’ŒsV9žì¹íËà…Ø•‡îÒÚkÿA¬(ãjrÔ=̈ç³hpu Ù„xð׆q5ßÜg’ñÁ±¢$YÂpï>\pzŠ˜1KwA—hV0ããnHÍHÛ,Ú¹D1¡®œ¬ÉŒãŽô*™ÚXÓ![”I¾ŸãÌlï´À2‰„fÌv3Ð2¾WT’+“q6.”Aâg¢áµÑ ¤íàŠÉq8CÉ:&#%;„ðƒ‰ñHÁ;´_¸$p­G™…Ëg#/)'(+àÁ ì—óà$Ë.ì‚ÓY–W2¼·ùOË~]Ëî@W¨CˆXaÖW†ÃÛÁÏu-‘*Ç*f« bâ ƒºœ8³p¯žÇœY!.g¬:skQ8–øÜ×ýà(Q?|t;¡sâzNèNñÝ•ìú“@Í.Ã’ Oå`fõ> endobj 7923 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7924 0 obj [ ] endobj 7921 0 obj << /Length 7922 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ߯èu€éá[_Û²`Œ,‚,O&ƒ=ˆ3‹ü~ôàC"ûPE©ÕmÙ€oùª›d«N=H‘ßÿùÇ^þýûåû×ÿsùd~¾þøB®D‘þÏ¥ýûÝðL_9ëÉJË+«Û?—O_^¾^¾¾|xùÐüûõ…ªî‹æGóÐvÑ7øû§ß^¾ï;éóãë_êvùKó¿_/ÿGóã'Ó^û//ºV-ñ¹'(£L7ÿRíÃ_^þö‡ËoÍt×nûïwªâ”ˆuãøê¾J»¿Ã¯¢ÎšßÊu3DÊšd#Žÿþëåç¦57Œk-(­”¨ÈìV+Ö6+šu¥šVYÔhÄÛ̦Ö6¤/ÓP;"ºŽµæg•lжÂgT*­XÕКðþ¿‹ÜÔëe'ÊÈ®æÅfS4¬bÍNnê* m̹ÒÒÃŽ´lk¹ûbÈæyŠhOSó‘ÏþÓ-,ü<è”VLŠºéÒ£N•¸ˆF9L§Bb;ÑíG>ûO‡®âÔu$†ý”æÓŠñKO#Nm·±¯ê·AHFhÇjG²¶EÑþpt£ÔÝG>ûO¯”¯ÖÆL§¬k±ïhDÝuª-Y’Sf8Ò£~ŠòéÅøÅЈSbh/ö5¬ "´åÕÐ]›ZjáézЯÐeømŒÁLlߦr×׈î$î?_š_+[ß~O—å×Ëó‹¡¿F­ò_­ÊŒ3§Ê‚8í±t§aœYeîÉÕF+z^ÛE×bßшîÕË~º,§Âp¤GýåÓ‹Ñ-â”Ú‹}½÷¼ºkÓ(–¡ëA¿B—á·5 a@ªmÓ¹ëkD`?_š_+[ß¾1à¢üzyZ£EüµÈµ* ᜞ò-Ýi˜ÐV™{rµÑªž×¶E%´ëhLkLª8§Jèqã½ý–äÓ‹Ñ-âTÚ‹}½÷¼Zz¤·t=èWè2ü¶†¡ H í„Üõ5¦‰3¤õSókeëÛ7\”_/Ok´ˆ_£Vù¯Ve¥œÓS•‡|Kw¦„Uæž\m´ZºHU+‡hé"X]œS­Ä¸ñÞ~KòéÅhqª”ľ^‰{^ ]y¤·t=èWè2ü¶†¡¥S»¾F´ôáëú©ùµ²õí.ʯ—§5ZįQ«üW«rûUeí!ßÒ†ib•¹'×-'•T9Ñ.Ó•` YSÓÑ ñÞ~KòéÅhŒqjúŠ}½÷¼ZÚ#½¥ëA¿B—áW*;±]›VÈm_cºrák©øu²õí.ʯ—§1ZįU«üת2'µuzmÓj£; «mÆ«–i©rV»8|LkÁ²$§¬VãÆ{û-ɧ£5ZÄ)©U öÕJlxíé¾Í^±,]úº ¿­‘0íÂT+䮯­]øZ`jc~­l}ûÆ€‹òëåiñkÔj ÿժ̩szœ9Èwt«UíG>ûO0ZIl¤Ê%uqø˜&6‚5dIN%eãÆ;²(Ÿ^ŒÖh§œ²@ì땸çÕÐÌ!½£ëA¿B—á·5 I\˜j…Üõ5¢‰ _ Lm̯•­o¿§ËòëåiñkÔj ÿÕª,™sz’{È·t§aÌh ¹Úh+æ"ÕŠ¹8< ][ç´bzÜxo¿%ùôb´F‹8•Lb_¯Ä=¯†æé-]úº ¿­aṪ©FÈ]_cÚ‡¯ë§6æ×ÊÖ·o ¸(¿^žÖh¿F­ò_­Ê•pN¯’ò-Ýi˜°C®6Úš»Hµ>ÑÜE°uqNk!Æ÷ö[’O/Fk´ˆÓJˆ@ì땸çÕÐÒ#½¥ëA¿B—á·5Œšû0Õ¹ëkDs¾®ŸÚ˜_+[ß¾1à¢üzyZ£EüµÈµ*·æ¬*+ù–î4LÙ!×­ ÒFª‚*‡ii#XCäÔt4h¼·ß’|z1£Eœš¾†b_¯Ä=¯–öHoézЯÐeøm·"QéÂT+䶯1-]øZ`j#~l}ûÆ€‹òëåiŒñkÕj ÿµª,h¥œ*kùŽî4¬²C®6Z®l¤*xåâð1­lkÈ’œòJïí·$Ÿ^ŒÖh§´RØW+±áÕÐÚ!½£ëA¿B—á·5®\˜j…Üõ5¢• _ Lm̯•­oßpQ~½<­Ñ"~Z äÿK·;µÄæqæ7M|ñÍÇ—ïßëv£üÇŸÛ-Émý_^½û®ÝA^‹ËÇŸ.$„¨?]>þÚ®ÿ«ƒ_ªû…ðŸÐ“Ÿ˜lƒ¾ ?QŸàoº_Pz•BéJÿQóÝ«®‰b’ø'T¢'ìÍd¯}ìÚL¨$³Z½ðä•3MGOÈûîIu%uÐyEO(E­Ñ~°êʨZ ÙÀIP E~”ü€>JYÐM‚­ùæ14)XôFŒï>6¹Î¼j`^Q·æ%8[Â-‘2¨!ïàÂïNÐkh“pÆX*F¯ðÂZÂ@‚z’`' ¨‘x$ó[å½îPrUk$ uç]ø‹÷a¿aë4¼œéÓÐŒ¡Ä#|&‘Œp«‘ä34 ÏV$×DóÑ ÷QŠhÚ(ü.Ví˜Ïˆ¦ÏtÎäðŒiƒŒFf0*ÛL¡Ü žJÛJè‘°ã»…Á¯›;„&&{„ç@’X¯£_D“u}*Ó ÷bzlµ°õGÂI `1x:ñX‹ð·@î Ð ­˜Öhlká<.ñÓs&g‰(à´ÅÆ~?Á#Áú2_“„(…å X£ô¹IòC8ï»­¯2š-ŸPø„Á'>y…OÞ£'âíÖŽ¯]öKJH„zôÍd˜ÝþÞÉ‹™»e‚/r¼È|¼ga gx à€c4ˆµC²,Y,^â„VdÑKâ]Œð ücŽ;Äzû Ê,cœ=‡ÝÄ“SÒ '˜Àˆ''ß•nh+l±DóA£r,Ö*o MŒš_P‘˜oOYÑO‰È>æoÒÏÚÞžeA‚žÀšP6 –Ä#HàT4m992~²@ž f©h|›071{ÞpóÓž.1;;£$ájßí®W²MI¤é•ȘÀÈÛ¸—[ßÁ1¹‚ßy Ÿ¼[Þ‡OLÄ|kl¶†sø„ÀÖðäË g9xæð¨ËÊ-g¦(ykl0oä{¤¸Öf˜˜ä¡,w¸5–!ßûgßk,Ô$šƒÓ6s`«Å¶É0zçX-îjobÔX:PG%ô,˜S&—£7/¶î=7ÄŒÊÆ p¥GCÏVÃÜ5½ñ*›ÀÅ+sΉ«™ÈoçO‰¦tgã Öˆ L°ìEÖ&V²Œã`'Cីý½V®Ø{ŸÛßã X¢ÛØ{ã¹qá[tixâBuø$º }É ë=7snXO b¸Çß[×s¿Â'=ŽÜ¸òÚXñïìrÂ[Yk&Þ Gê/T&ZËxq3ËWe +AâÔâ²Y^1G×”U¬ŸxÁÆÆ²ì6µèæ¯èÆ£·ðEWIEo¬zŠ›ësnκ7ÌÚ>HãO™z6¤):ê§Cê·—NßÒ7_w³.œ‰ÜªK§ïlÏ¥‡6ÿ.¾åWâí‚=TÈI»K,Ýa„ÉhMdä¶»Å29gcatøŸ±ÌÝb™œ{¬sðÄŒdøhðãàcg³¾9x¥(Ëg—m’bW–N@ó£sèòæ_Wœ°Ø|ÎýØ3r‘¯¯´;LñÀxu€„ê1ÃNÝÞõo$¡ÚÙH¿±ü)½Á¸?‹é>K&xH-E¼E.‚‡/E˜õ [jaÖ3®º&j<_Î$‡ê-AØüwá§Ák[Ÿã¸Î„úðêëýw‚á'9·Hf¼yäÕäÄ~ƒoæÒ›ŒË¾·›s´ú‘÷fla*¼1ï Êx²[Ø'¸­£'2"(á@‡4¸5ü±Ûtñ ~—GáΓç§á‰‹/Šî¢zâ›­(ŵØX)9ŽÖ$ÎqÈ™ Q˜¶bÖƒ‘°Ñqf;G¡ðôm‰¦DHWq„\ê2 @]0ûzâ)ds¨ã:ĺr;®pŸ*èsdÑéÅ@¬5˜r”A¦_rE1'7Z*yXK ›rÿ•1³±zÜ«@;¿v2†4m2 ‘ÏŸ7s×ñ-Ë)œ¯·mj®ê:„Cœ+í´3Çï8ËÝ!F®"³Ã™Ú‰PÏZ;Idk8_ÄY{ÆŽÿÄk2g~fàû K•JòløüÔ-'ëJ¬fà}:ÏY Ç]~sãabåoŸŽp9ñ|ñä,Ýn`õGY¥¹ÕZÙÃÙrÎò(ûžÆ7x>K«v+yki»> endobj 7934 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7935 0 obj [ ] endobj 7932 0 obj << /Length 7933 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€í_zÁcÏ8@Œ ‡ ‡`v7Á"³ˆ³‡üý¨-õÃ,}”X*²¥¶ÆÀØnZT±XU¬7?üéË?öÿü}ÿáñËößúï_vÅ¡(‹îßþøõÃõº>ÝýXÕî ›ã¿ý·ï»—ýËîy÷Üþÿ²Såëƒý·vðôŠnÂß¿ý¶ûн|×}òåñ/íOÿÛëýŸÛß~Ýÿíïí·ŸúùŽð}W7åñ‡w?(­tÝþrýÓqð_»¿þaÿ[ Bý:ïñÿÊÊUÖ³àx9?ª^¿®E/k?±º…v¯”nát-:þûóî—v¶3‡Æ*U•¶*&ÏZévZÓ˜rßTå¾*,™”¬mÚTjæD¶4ÈD¯©yKS…­§z¡ }¡—Àƒ_wž”5õ‘¾þÒBòÊOÝ·¯ßw¶ý¥¥‘Fµ¿ý´ÿcQ˜úÇý×_wÍÁ5¦rv#ÅiЈªàˆ…³=¢SÂÙà3г¿Òâ1pä B WŠßƒŸ à®Ô@¨M·sŸ¿¶”<.@”-¾¥u§Wª×WªâPVªnÁ¹,­[@u(ÈÒÜëˆ=Ønàj¤CGyЯsQt ͆ŸéHÏNéQ sŽVºñ°§ IP˜9, 0CA–Œàõˆ¡­6ÎÃ;¡ L^=OÕ>ƆˆNÒãòj Y3GéORùeá×Éȳÿ½ŠL†Ÿ…Ø 0'^E†FTeZmÆ£*§&ã,vúî’÷"j +PzÛYM'<†Ì§ç¯BwáZƒ¤VÚ]?[Œ²æðLlË9 É$ä5Rƒ©^Ч!,ôDwNC§ 2Äž¦3ÀÓõψ´ÓÒ–Y½;I¼aB‚ÔgÓŸHlÆÇ&<]jíkÚ1Ò^B~D°/ç4Ã:‚àÂç!ƒB2Ñë³²xo&:|Fc°ÝÀ0iØa˜Î¼1fëé2êéBˬ7…:›õ'Ò«JW¾a9jaaƒÏ–éb(à`ð9rКœá»ÙÕÁÙòÍìœeQAœGeWÓ÷„Õ£j”„­ ¶Íô 5¬Ä  &°“õŠ<±uÃE×…·èþ¸ ¨›£mú¹l¬óñ m½:XÞaxÄÍ8dR¯µÊgÙwâN õ¸KŒàˆá ¨àØð‰p`˃¡`H8>°ã»A¹ÅgÕ~*‘`*§¤Tw]åI°€5ágð-ž^»xÁà ¸w-eS¸37Ý™¥\àƒ[‰ŒÐ8¶”5V F6´¨u€M‰â C€)ÓŽšbO„:@‰6ÎH>oAíÞåqfž?1aÆ$ ¬b6î`©RXÐ…"‹©7ÅÙ˜Ÿh^o²‘D—#ËâÄ8›¡XGD0¢ãþ)å¥õäǘ£QrÈkŽ© Z<õw´â¾]¬›‘Ë— ‰äbpl[L Ñ¢,­—¶TÆgaßKÛŸ.˜s‡´ƒäªJi*ð´NŽS‚C™Ó DàXL©K’ b kp¢ë¤Î#Q˜Ä3'mOÖëF²œå$ÉÔ  |ú¾å ¦uÃ4ލb8òŽ}²1yhß2Ñ]Fù‚)££ìXÔ/us”±e,"…±ÀÍíÜ…Íí–Ïí¦œ{‹¨”€Í—¶ùÒ6_ZÀ>HêK›çXŠ£+eIQú¢ìV¾´9pC-%iQÄЉá}âæó1¯?Mæ¼ +ÎÖLk6”Æz¥Ç4ð”^7çC“÷Â(3 þŸÍE/ “¸ÈSÖÈÐc䮽ðµ%À:¼ðuI6jóÂÏQ¨Wì"Ï` WvŽ)´¹Ú7W»€F¦UãQãæj˜jJŸoÅ<ípw:U«óæÃ…ðXåS)QàÈ_ŒÏAd}㠃ئ—×CLÿøŽèáã`húÿOñ¬MVëc&Ú™ÍÞ[Ì„QR¨DÂ~|ÔÙ‘ë´nßõªåƒúĶݢ‡<ïÕ÷7 Þ“7qŸuDzÓawߦFRµg…a8*$G/œáVéÔA^÷ðGνÑúôV±´P:ZxFi8‚+EoßËtNKûEãë×oã ×¹f\uZÀGÈÐI]ÿ1ÇÚj|òÊz“pOÊ$¨VáñD$¶±…D‰wþ-NUYq{ŽÖBö)@Œê‚¯uþk‰yêüžR³Ã©­ÄCçT7š÷§nšs`ذÅMqZ×:F_ ù1—"buå ‰Î²Lšé ‡…hÕý¬ÆléFÿ‹é@œÆq°YØs,ìYQ°…+ó¸Õ³/Ÿb“À&pÞqhc3xƒ ®mpi;RÑÜÑ¥åz¸>BuEr¤/žßãNÁPQ!¦§Bx{c÷ Þ$¡á˜Cþ.Ò&Æ3ÙzKHÙú°â#¡ˆ4ø¦Ë™ÞL:*˜&?Ÿ‘#„ÒySjÓ/;ˆn³‰ïœfm3TÜ‚„£(ÚÉéo°¥:ž«³¨ï ²†~ìÀÇnX²ô~ œÔÀ¹^*´ß>o›òôJXbÁq<ÇhíÑmSß*Uz¨ t,Çž6\¬š¼\@õ ‚®V X•“ûµO˜™}–IïÍ*Æö%©9š~ÐÞò—¤éªæ¢%8ä"”µˆ Òwî/šÔ‰ysæ`¢‡“8LH36T¦M£ |ÂM5£¬±÷T”._B$©oM©›þ9¹d›yy™5Šßåå½ÈVÐ‰Ü †ÉôÎ.Œ›ÁSÈ5—Þ–vÊk•šÎºŠbºÜÊéér¶9½uÉ9«,)áÜ‘†ß³Îlœ@ó0ÜhŠq™|ÀïƒÛ}a¿ÏX««•íOjFó°Û¯'WöWà^Â5ã-q?–¾5ÅåháÛ‡0VÊê«$ÌM@ñ”Á]!s…¥\mß‚y« š´IIJ¹¤ n3óÂŽíbÆqõAò¬ÿc[oÑ·îK¶üD¦Ä—ÆVÅÆ'Çyʄ҂È 0¾$Hê,N\mT6£bͯ6:õé€N²=C«s©÷ɵ·´ ñ(ÍrDÔ­ñyã~"ê¶&‚+¢“ßô~§Q~ëÜòçœÓ›åý¼I£ÕÄQ8G}hY•¾X[©€®”Zšv™¨zñ:ë$éu£þ®7¹Ð/pH×O¶÷sH7ÆW'T'I_c2A9W°¦÷¨”…ÇÆBGb§‹ñ1"jìêämYUßý÷jK3w7öo]²GT¶mî2±²ý›¶û’‚à€0îb°ÏüÎ" ¬;§/'º¶ÅÐÖCKî;­ã8 4ÐŪ죵E· Ý=ý+O’‚ÞB<$.5Ý ä¤Ô%*!˜‘¶(zÑí^§²JÏ÷[ÕÖé¢ñˆ$³j•²âÉUÞÚrªåUqnõtoͺ9Yx …_¤º)ß›ò½i I´…ÊnÚ¦-Œh "É|dÐ.k½¤¥|gç7¬jýv™-ŠâíÎ_ätåÊ¡'–!!ñÌGøLƒžé§Ò„ø/¢Ž¬GŸ¦.DpÖëw{ê…­r‡Î~f¼®Ç|Bë¹lþ{0j ›:åHhÒbGî&œkóJ®µ:§|G\1)Qo' ÊÔ 4¢ãø‰(ˆNss7£Ãl `FÙ€n‰ô|›q‹L7wÒX‹ÜÔ%zQ$_b>šŸg{¾8ÔMQ†óÀ"ÚÇ¢³JÜß³:E);lþùB[ Ž_ù±íØHñ7ˆg5iÂã9orYÂòIsÕ`±m}ÒšxUÄ… ±ÃDs꟠›'­Ä¹R8¿ÊÁF‹8ì&í—¤wKûb‘ "H0­rŽ6Ž =ýLMØtÄð®]óÜÞ Þx6l’wÏ(s¨|#šäýY:`ŽŒlŽ>ÂÕË\ÓÙÃW#¦§böbØÔ;ØXÇNˆÑO6‡F°c„u×x»L8°Á=Åô&»?\éÅ7Kö‡Q uh6›¡ ªh—î±c5N¼fkX‹°®ÆË?#®'*³D¤˜ò¢9-º–6™õ_¿ñ, H'aIÌÓÒFGðæETõÛÜÃ(ƒà£ÞøªñÍño¥•LË®@v…ñdz@’E¡{¯hšÑæ{¡câ¸Ö;ͽ J¼eØKK¶M´QÞø¡µä£ïíV¡ž¸ZÏ5ž¬Ô°ãN ÂéD6y QÝTÞ ÒŸ0M¡üwÊ^Èp½Ó“—ãàžÃÜXdà÷aö›£JÍ¡ÅDæ“·cíÓæÜŽ5 -ˆ^ÇéC@¤§Àœ¡êvô>·ì­qw¢ÈËn§õžs ‰r8ÞÈÛr¬˜ˆFK 85¥&ÉÕÍ[ÌÑ•I{¢$àçÊ­E0!㌉Q%8,EËoaeÎ1Ÿú®ÎZ¯Ó•°.¸Ä@'ïkáúk!/ø˜`¸ø¤j5ã”`H³Ô"U]0¿)Ï›¸­.Ì3:hãP:'˜Ÿ­Ñª\ѱ=±Å¹>,ªG0F,ÆXlà:üN}L—x„›ÂwYBì(¼\ÞÎÀN€Ï8³aáws—Á*ëÝðKÖp¸„Q#¨GÄ”ˆS—ðþpj€±\çP×b5B¤·>Ú±|ÂUѸ•c'7Æ"ã\Î-ɸ]Åû‘&Ÿ¦g ëFá ȨopÖ87¼°Î@|¦stMŽæŠ%6–œõ`¨±V!«oÈ⚣×3îhÂ’˜UE/–ç5ÓK;ο¹n¼Ç³á´r¬1(I3 VÜ‹?ÙÍBYè}5Înã÷`Û~좒¡Ùp:>>íE%±ÁØÉÑ8ëÄϵ§ËÛó3nL&V~<Ž+Uè¸Â|¢þŽ|aõ¯Y°îËÑòYV ÇKÄihȱŽ2tï¤Þ€ôźL¦õpôÓuòO u#É)UµÚlÇ ôÂÑB1-|mØž=ÓYMêÞ(–•,ª£à÷pÎ)–GÓÖƒWk£*;úVÙŽÕt™«ÙìÚ÷d׊ÒÎ2ìZu®±fɼ' IʱÈÚ.Žï`ûsu§c%¹4~Y`{pú“Êò& jÿäŒ=©ªžÃé7·9 ŽÈ0zãž±½‘Ñs™sÚÏht>í±t`Ø]«Ÿƒ7˜#Äát–ŽÂÀµl^Q.? ‡ObÛ4Õ8%‰ŽpüÖã î°eh<+å&Q4§¯·ÅŽð%AÆ<™7¶F´*gp ‘»¬{R3'“gɲ"Ii®”!ëÅæx"9™©²9> ‹ðM‹8áµ³·àûFÒâ:ë:%'΀mxÆ}.¨±ŸI6û_4Þ´ä8¨pîýíó<á L!?ž ÈúiÇ(>‹$6ê—•Ä·9,?cøXçá:’±\¢<4f'TfÞYI@Vp$G’rjC·J–¬ÑSΊ&d¢1N¦à’©‚Eå _Ã22ÞL}¾£óÊÂk¿ö/íôí£Ç?ï¿}ûx´¸ú5øèxƒór¯Zä µJiTÙ] ·7…}K`ey(‡{i4öÐíñº:T~•n«‘nã9èÆëÊÒ7îq‡²k–p©à{jøLŸéy¥ºxíIí«C³u¬týÉ'ø·}߈>¡gzWøÐˆBëè‹Ïãžéw,fí=l¯ 0ƒêŽ?k§ªÑÝîÛÝGÑAïN Ð#Ïôb¸}¦è†.#…¿Û½¸šî)¦¼sø=êQdêº(êØÐéívôÖàЋñÈ•<~–”ŠûçÝÿŪ endstream endobj 7933 0 obj 4431 endobj 7937 0 obj [557 /XYZ 40.7999999 536.659999 0] endobj 7938 0 obj [557 /XYZ 40.7999999 536.659999 0] endobj 7936 0 obj << /Type /Page /Parent 2 0 R /Contents 7939 0 R /Resources 7941 0 R /Annots 7942 0 R /MediaBox [0 0 595 842] >> endobj 7941 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 7942 0 obj [ ] endobj 7939 0 obj << /Length 7940 0 R /Filter /FlateDecode >> stream xœí]͎ܸ¾ÏSô9€Û"EJ°=v€6CCàÍ&Xdqö×z¤žž!û#UÅ"¥î• xÆÍEV«Šõûö_þ~øç¯‡·¾üçðmþùáËCslºfús8ý}óò펭ž~í=êáôçðíç‡ï‡ïŸ>ÿ~PÝÓƒóqðüŠiÂ_¿ýòðvzùÃôÉ—ûßAþ4þï§Ã_ÿ6þøažïô…ŸÜÐ~ù÷ô‹ÒJ»ñ?/; þëá/¿;ü2.Á=Í{ú÷M×[«‡.kߟUO_>Š^6~bŒQú ”×iGpü÷?޳=/ã8¥úÎôÍâY{=NÛmwúîÐ7&˜4ØÛ²©TæD¦k‘‰žV¤ò¶¦Óǧ:Ž£ªíµ5'4œP`Óãï};ÿ¡l}h¦­÷ùPŸgʘm'4Ѹ"•µ³ðx&Éc`•™9€ÊåJ—©r'ÒVO+Ry[;cOÅ>m«¥@ÿ~)¹8]Žblzkû‰¾ «Ft6L/÷x?íûŠðíL4ß´päƒ(†ñÚð{ ‰¬íW´‘3¬$WáØ=}Dn-†æ¤øœÕø CžÏ’ ˜“V:sG¶~º­V”Ä¢¾õe%Ô1õ,W§K¬u)ø ¦XY~ÑpáN-~††(ç…Ï3g¶Õ)D–sU•t¦ âàÞÂgðHUXÙ!cßícÅ•ö.Cø€5ÈS°U"ò|kæð”š42ô+à»SgK\ÄB ¶ž,fd%O‹é=”({l¦Õ\ˆbb¥Î§ŸþüÍx ¾:‘¹|0Ñ„9šéÑØk,úê,.»£Vî*™^Þ§&-^éó,—¯vÞûTðAãÐÃaØÖ¬8^{_° 5,†8gç ¼ùĀކ0À«ÆïyDk›™½²Gç+žn‘b¸ óm †ÖˆâgZwŠñw:ÏVÁæäl°Ÿý’ÃJ—\ľF©‹¡9ÍJ®Q²eÂââ»fè1¾0!7¦LŒÃ*µîV?¥s²âWÕñ­mØw`)ŒÿH”³4…µlÂ$$Ü?wÅŠyjÀj|’/JKF(çñ JÉ'ÎyâÄ03¼n Ôº%â!Ü9‚üae“ðFõÅ#(‹[7àü<\/¤¼Ñ×õþ‘¸E&CqÂ.DÌÛ”k±lä°k%ŠÜF´@7ø"æ¾ôMœ JÑ %r8AgPÆ+E8qŒIÒ¡™¡I=Y“bAÁŽŸÿ‡‡t9¦±¹’’U);&Dz¤aø ÑÅ5…ùέušbñº9´Äq2¬è&qÎÔMIN|g__™à|C\>»hÄDÖN4t3BÀ¢Iºiõc.>r-/'cã>j\@~^¾Òå–ËXäè§_¬„ˆ0XEE,.J¬i}¡›¡›.Ù½zøý† ×6eä¤ÇoÀHZÄ¿-¢Œpn¬•HŠ –V˜—xBMùd=z–X±Û-¿¸aذ4ïònz§—_û{cÑ7c¬‚8X³^½{ÛôÏñØØOÀ¨][·EZ 1*&Gjž?ÒWiÊŒý+¸}öÖpÞƒŸ‘mjËhs-Û‚{Ë wq-ÿÂDàÆÀ‚l«@Ù·‘Ù8G0¬qícˆ¹H× F£zæöÌ;Áx„E£PÊÔ¢ƒZ'Ã-¢90¤&>s,ˆVhm™ði(.³Ä(+w—Ö.7Yx«”¨„Ì*Ó[0'j“ª%¸)ábgUÁ!$SÕuŸ0)q‘W+Â<[’)·n9WÆ>«åYŒ‘Áéc˜Q¥%Dûò°9 K%¸Æ2À÷øë[ÈS©U‡ÓÒžÍåã0ðT¬ØJÚT§œg$Ý e e‘–l°ÑSäŠw2Ú &¯‹UèR7êõ[iMU°© à S9¦XÜ´›$ %áUsZÎhÜ$__ál¿RùF(I§÷Í¢$Ì+ UDšü®Ž{Ü SEU<¶gÝZ®™cÂÈ¢‡sDÞ—2 5ЏÎN—¾}†£YzDaE(X5Å`Õ³|Sk5;/)“–;·Š¿æj \/= vSV¹IìÖͤ±w&¸kþ¢ÍÄm,ÚÜ\`k‰žÃ‘Ü%Nà0%ÿ$e;/Z¿Ôyì‚Cn²a-”†vµ^2¢£Yç;œ±;yÃñB{œÀöâD’Ã3æ á¤bþ[«Æ{X8JN}”òùG½ÝÉÊæ‰z ;rRŸ Œ(·ð¶›Å*‰¢¢ÊÇ4öægÀÊ.æ÷#;{÷ÜŸ¦H:hш¥%¼S›=ÅS¸úË‚ö„«£- KG.’ñ_ aÞ%bÅ`t˜è"üÉf ã5È/ϸˆ°æ@7'Ø€Y˜œ?"µö%j‘‡RX¶vZí;Ç -\퉗B±%Zq“tzNÖjET*V7’2!W¯¯ÇrË%^_"P7-ó !Qšˆ_bûYk÷f°,&€ýšƒòï‘H>ìø-žà>ÌUØ/ëÄÖsÙ2;"å)YvNo€‘ìLÈ'YPÔ!ÊËdhÞ€Ÿrެ¸’GôšpEÒ5ΖťˆÓW}ÂÝ¿¬­5ëæؼ‚ZŒXõ$@`\J˜†8{†/Œ$í<£Ô;`p˜Û.5['»Nû……)VBMn‚Ï5¸{­^ý ;·p‹sª‡­mOH»¤ÂCžáC—©Œ Ò~!@E@·e RÄO’»­Ð-¬wÝbͳPÑiz¬—lå!–¸Û ¿,ÄORµÊLëeP…Öõ‹È ŸK?‡[ê•¿¥å¾#K»µ”=X^ ºVÐM²ùF…Kºfª»95\ Uæ1¢8ôR>X2x~¶¦]ð²  `¢ÎºÐ4‹åQBB”j')#FYƒ¯ŽdFjÉj‘]@¢åEœï5+®¸ÞÌoÝ+®Äq¯¸Ù+®l ÒÆ^qe§ƒšÜe¯¸’”®CÚÛ½W\‰ê{Å•½âŠ8UÝt~SW¥ÓØÙ‹0ĤŽ×bñAüƽ€sÒ1D1pQdÌ|φÏfû¢±Æø÷ð}3ß^uÓž†.#ïál±½üä~wöî]Ùá'ôÌL²×FÚÇl-£=3cŒ²÷ymO ƒêN¿k«ú$¶Õ;:ÌÂ=B6xff¼ã3Í4ä‹‹—AgÎqŠéc¿G}Á‚sMwT'ÃõktÌÖk/Æ#ï^rFA®xøüð·eœ endstream endobj 7940 0 obj 5135 endobj 7943 0 obj << /Type /Page /Parent 2 0 R /Contents 7944 0 R /Resources 7946 0 R /Annots 7947 0 R /MediaBox [0 0 595 842] >> endobj 7946 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1549 1549 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7947 0 obj [ ] endobj 7944 0 obj << /Length 7945 0 R /Filter /FlateDecode >> stream xœí]MoÜȽϯ˜sÙß$°d;@È!È!ðf,âE”=äï‡#r¤1[¯8,V÷4Gm–¬6««ª_UÔÓû?~ùûþŸ¿íßßùÏþÛøõþË®94¾þìßÿ@·£‡oCëº;þÙû¾{Ü?îvý¿;埿ô§W þöí×Ýûáå»á'_îÿÜ÷¿½Þÿ©ÿß/û¿þ­ÿòÓØßñßwmçßü{øFi¥Ûþ?çßÿµûËïö¿ö"´Oýÿ}çƒVÛUr<>?ªžþž?Š^Öÿĺ®N)ÝËézuü÷»ŸûÞžÅ8tV©àmh.î5èc·­Uû.ø½²6ê4Û…]­í¨k­LGG‰Ôº¡©Æº+®ê}ã†ajkVô¹«µóºó2%Rë†6ªžèŠ­zãÝÓ0M³Zõ§®VkÌû ÓÑQ"µnh'Õã®Øªfð0cõÚžºZ«±Ð!Õ%Rë†vR=ú t7¨¾[­±SW«;rJ¨££DjÝÐFÕÇ]=ˆäú%x$¼ûº{ÿYYÓÓž¯?÷’<åNׯýpÝþÝ1Höžñõ§ýï›FÙ?ì¿þ²ë®3Á ÉÖê–O_ûQ¯ƒ³ƒRf:ˆÏH «PKãà3fù3&À–µèªñ¶@Ù >A `‹ÒðØ¢ ®)Ô¨‚ãiZØõÖ@+àB;Ðßhb<ø=P; ¶6Ô5ö^Yk³t€[>,—¿ÛÔàñ0Fj±åàx°úÇÚÚKöÆA>g0nÁ: ZîÅÂÑ|Hõê4†RoEÐ6ÇWú~tÑöÐv×îÜpƒ±Û)FÚéÔkñ#zpY¥Îú¶W1îŒøè0[á¨}ÖÉÇ©D’"6CŽbvãÌ]¢×\.s$âóÎ~0ØHéÓ‹§ tÑ{‡ºƒÑ­úÑБD‘ŽüÅÏ*,ÔÑ‚…vÐSDú$Þ‡¥àÅ´j'!ãnª¾©NÌýr×6ör¡“L¥xæàga‹šÇ<¬ùg¡ÄÂãbà3ØÉÇüaQoÚ-Wl#Ÿ`¤hí4T¤?8±ˆN l‰œ&B×Y·" lygK”†}Âà*>OGÓ]lF’ˆ¹u¿@óXS \> ‹Œƒa;ðt|Ö.gqxÁ žD‰¦0îG¢yÇr9Õ|PtbÆñ£`oÑŒÁ¶—q¥[‹C`ÚeIׄ òãý& W]v®%aì꬛Ʈ´ ωa—çsÙ/|îQ¾º`Õ†—‘ê?%Ï{Ʋ±¢9:mˆ,‡‘³ÆnIŸÇïâ5ºÞ¦àª>ÂXÄëPÆjsÉäÁ±o:`"EJé §±îÜdGâÕubÅiv£Ð7m8!>FÀòpû˜Øv‡¾cv¶èP¿Çàƒ3¸¬ðV0ãüQVlâ÷†5 ßC´0Žº ô}ÇÐö*lS|Ô5ªñÑ”𰂍µ Ùð¡ö|ì‹%ÀG]°…å£)ªäClS|pFØœar¬-w+d6ºªÆÏc4#~(èÿÎZ¼xÆ n…= K¯W`ÄÇy– Ǧá:äšDteHýv¼êæ´#Š·¬\÷.#ªj7o-уñ _3Ã~‰g-ãžÅñYtu†£¾òÂÂAüƺ€3Ó±F±´F|÷†çæxÁ)Ï ´6ó $®Uá‹„¸7N¶Ë8° ®£a ðn ö1ÎÎx WáÜ$²wñêŠψH÷f0MÖÚÂù-^ÅaÃs_ƒe¬2X²áx°®sv'ð®(§·GµËtPFÔó&eÔËR§r>qÄÄ¿z ë¶¶Ü¬à““´jvܲ-„ñJµãœ».³‰E§®‚Q/Ä©O#LFÍ‘va•Ûz˜õ ­Bn¯E„LÈŽ½ØÐÅI?Nñ‘$NÏDý’8έ ä‚È¢Ö[®j5¬ŒÛôÑ+WžÍ#¤qó3ãê-×ϙXõ±Šv7ˆv¢þV<>9;ïË¢-6_ݯ×á´ºÏV÷kôó “[ï~¬û]rß0½ü>0«xC¤ûÛ®Äŵ7".‰ªN/¯ì‹ƒo^ÏWplê’½¨;{ëõSÆÎO‚H¢Â¤5,Ó’Ò%µþ‘Ò˜éð¢÷®!,¸z­.\Å%‘ÕpÕYûe¦œ’»éÃðÁ¸‰åO0°:W©iQY^ë&¯%ˆ7>Á–3ÙJÒ²f3U\h®ƒ®!Û,H`μ`XB1 ÕÖýè6ˬ¸Ø:Jp÷‘ÂDòïˆÈhô®˜’!’5Jjâ%B9,’Ëî-­ÅT\gEKZ† çò“„dFª‹"’–È0œGI®(Ÿ@ôºéj]fÓ,͈ÃùÅàOÊÍI´„Dm…¦Y¼€ÅDˆœUþ¦kOá¶Vù×*ò=µÊ¿ìêîZå_ý 'ºÔ*ÿ¹èjŸ/…Ö*ÊZµÊ_z¦ß\{­ò¯Uþ'T5k¸Sj•S«üIk×*ÿÙèrólÔ*ÿZåÏgµÊ_ÚڵʿVùÓÈw‹Uþ6”ÃmCÄ«G=–ísÚ±KÊÖ°,{Áè[í8cG§’þvØeqg9ŒÜL8ÛÅkTN)|wÀ•Ù+¶‰ì„÷mò‰ã—¬gÆ:Ÿ {A¢è€õ–+÷%ÎÅ`Ë6}´ô<Ö¹rp°äœéú÷7*ÚU´“÷·âñÉw³¾œ¹%1Ÿ1“[C ±EŽeÃ:À‡nXÀˆ²p˜KX|ø=˜ñ‡-_¬µ…9tðlIJáÅ ÔµÁœ3™K@,e9ì„øšÑ[6þÉ"l\» BÆUNdáð 3yá+ ¶EŽÔx3‰Ã€†™¯dǃ7‰–ÂùAýó/|ºþ ,ƒ‘Êçÿe-bÌWŒîùadãÛò/µ<°t–(øÚ™Ál]WÚ¢~ÕtEùÒYélŠ*ÿW*ëLT¢ûaª+ƒž[:¤ò‘¢Ö—ø&¶íÈ7DØv„Í”¿G¸±+ô&B`· žW0Ök#Ç„A¸3bH’% Zÿ éq]rÊÚo§¦¾¹ ô9-{PTB—–3Š£—ð5ÝMe˜IF•Ú®ñ+­|Qx¨MÕ¥_©ú|>m¼r]4k.òš¢|Œ[åTúÏÓõIðœrÈYWͳÅ4o íÂtus‡HÐEHųÿ8äŒX€sù©Àa£™O"«\éÓøXRÛôÛA=ï¬]ÎçÌvN¶'¢‘$óŒV¢´H‹±ùz <¹À$)úÚL}7MøHC陑 (<߉¨EÔuŸJPD¶T‚¢ˆiJ¾´[ ŠòùA×g+AÑ]ÛvV‹• ˆÌ#*AQ%(÷ª›ÓΛ"(j›5´o• ¨©E¤µ+AÑì Ô¹)Â*A%A%(¢âY%(’¶v%(â•-V‚¢-µ¶Z¾JP´Â޾¢©JP´ÂŽmn¢©JPTþî@×䦭Ú&²o“ü¥RvTÊŽÒ}´ô<¶ÓÛ¦p«EíÞÚ½-‚¢Î–ƒBoçœ[;ëîrÝ]æZûÖv—s!EÝ]fî.çŒm®8ò½Ex‹óNdae<²û¢Ø—p¤6œˆÌȉeÇãà3¸¥øÃ°æ¶f1-‰É4ž(K˜"¯`*Ki'NPñ{°Þ$ŠÙð’÷Ö¨S9´‡DÂ]Qa×m¨Ó‚²Xô¯c ¾LŒ”Ñ›ì<#0§ùo†jW;³`Í\Ò•û*háÔ„¡17L¼úü^ü­4APÍ3ñâi¿$x7ÇòÕjOyÇÔy¸dóŽÁg2Ö,¨EôQœ³6!˜0ìô5xx+h§bZ KR‘´“Z5bµÔ…Ø–’+…<€­ŸX$vZ¥ÁÝ‚ YV0–\‰Êºi¸XBX3˜|c¼Á¤e˜ŠïÚ,0Û&ÖºœÜ‰PV¤õ¹ñ™wâ‘,Ñqhö!õœô>Ì¢Ùb¦bQÉ«3x]”PÜÀíÔ ^vã»8xy„Ïûñöcò%̱fdfd¤{ ÊŸ.GWº'ò˜Ÿ³ ¿úuÁJ÷Ô¼!šŸ’¯@Wº§|~PÀeäJ÷4D×vÍÅúJ÷DÙ±Ò=‘ÑõÖ*ÝS¥{QU7XKö<­î¿¡Ëë•îivªÜ—–+Ý%A¥{¢âY-È‘¶ö­äTº'iä»Aº§ Mîr€ë“‚Ü MPÐ.7]ìõ© nÒŽ!÷MÓJ÷´Ý.÷mÛm"û6©t*J%@)ÝGKÏcÊMw¹Íœéú÷7*ÚU´“÷·âñÉä¦q­tOÒØYw—ëî2×Ú·¶»\鞊ؙ*#¶¹-QWº§J÷Dçéž‚ [ A¾~®Zr¦Èɉ‰‘⹉ecä(Ùˆšä[™ÈÞÀ-$èÊAa¬½‹Z4Öpvš±vð)è<#‹³c+Yá{æE`m6A1;×’…ÆòLYDÉÞ@â,Û±›BH \OÙX.ÚGy¡¨7‹T`ox»Pá `_—¾mŽ*2XÝÎj~›-u>SóY–H3Û|ÆXƒ7jñ†=F|8ˆ·//šÏýßýc?qûIyüÀøåÛwb&Çм@À 䣳èÑú½ê‡ñIU§üá‰odošÓí‚1£õþà_§NëìaÐL”êpS–¥! ¯´ .eÌAw ¼‘³ÉüÀqòÒà{ZøLŸÜ0èƒṉé¥åö68ÁùO>ÂÏŽT…¯Œð3zf¬.z­E¡qŒµ'Ëž-¶dì£lO`…׿×N…Yk«Ëý` „¸è™qÔ?Ó MS@<ûɸSûZÿЦØ°åð{Ô½ˆÚ¶ñÔ‘ÎçÜ#óÑk/Æ-gÛ½’¨¸Øý¢c endstream endobj 7945 0 obj 3787 endobj 7949 0 obj [559 /XYZ 39.8400000 69.1399999 0] endobj 7950 0 obj [559 /XYZ 40.7999999 402.259999 0] endobj 7951 0 obj [559 /XYZ 39.8400000 69.1399999 0] endobj 7952 0 obj [559 /XYZ 40.7999999 402.259999 0] endobj 7948 0 obj << /Type /Page /Parent 2 0 R /Contents 7953 0 R /Resources 7955 0 R /Annots 7956 0 R /MediaBox [0 0 595 842] >> endobj 7955 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7956 0 obj [ ] endobj 7953 0 obj << /Length 7954 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹)J@ÀžG€6CCàÍ&Xdqö¿uKšž!õ‘b±H©{džq³EñQ¬«¾úðÇ/?þó·ã‡‡/ÿ9~>|9T§ª©†?Çóß^ ÛS-‡_M«O²;ÿ9~ûåðýøýðùð¹ÿ÷ûA4—Ç}ãôŠ¡Ãß¾ýzø0¼ü0|òåáÏýoÿ;ÊãŸúÿý|üëßú?Žý¿ðË¡íšó/ÿ~RȶÿÏëßÎÿ:üåwÇ_û!´—~ÏÿþÐÓi-“ÆñýåQqùûúQô²þe”RG!d?NÝ/Çÿqø©ïíe§N aeªÅ½yîVÈîØ™æXwÂéÔ™Û²®’;Ò‚©£óˆDÚÔD¥Œ¿+òÒëþ‰ó4•h“Wlì*yźÖ0íáe9’¦6-=ôm¥Çi •8ÑkW© ¦=¼ŒH¤Mm\zOWä¥oêf˜f]§Nô¥«ÔŽLÓòtt‘H›Ú´ô¸+òÒ·r °N§Îsê)yÁºž´X::H$ÍlZx»§Ï,J€¼*ß=~úzøð,TÝžuž¯?õ¹(Nïýdõñ‡³2 Ûã׿¯*¡þpüúó¡;é®6zд¶ÒR?^Zž¾ök˜}EŒ¹çÙu û[;ðJU]^©õ4Qe.¯lOmW5R¿Z‚J_ZÔI kóªe|溎òò9UÎ Ô n‘ÏV÷ª¾zÀƒõüxù@ˆ“VMÛ÷wý*šÓIUÃYàN쥈èµjìgumíoà<]Ztowµâí>*¸ÎXáW¥3O<’aÐÍIŠÖjY¾µ6´:5F¼ÙPQY#‘Oö6ý¸ó´WÞéCI¸hxx§ñàÅr½ü–Ü“.%øÈ£U`®¸ïI`OŒH òȬIôfÛt.½qËØÔMÂß&÷ôPÒMÞ‡PhŒtsJÐËñ݆ÇÂzÒñº•Ò=÷;°å6itëzŸÑz3Ü®”^²~LÁιvÎÅOo›ç5Fæ5÷vÊËw/éî%¥îö½yIKqŠÝKJô’–”S]\æÌp AJ4^Ÿ ¦KÂ(£®)Ò• «òÎGÃgpËÖ=m­H‰ì»MrËEWõÌŸ3<6‚î@æƒ÷f1ðF^nC>·uJìZ1¾ÁO¸i¾Añ²âÕÁ·M¬gÆÃ…(>è;³™c…·Á7txÞë·ì±µåäs©hXÙêé E)÷ñEÏf“´ŸÍMœMÞ ŠBg³Æ1ðœiì·æ¤ÞÆÙl7‚Å1o­ÌÆ Κ8VÌñÄ&+vPc•’©ÂN=ü ¾HÅIÆ„ùüLÚ„Ë’ × Âj~auð5³Âl»Uð5vR²ÓxÍÈ,ºÊ©oýÏyÆ)Š>Ï‚ÃJ†GÄ#€TŽO9¥ð€"'#(F;Y:°´$rb§RÉŠŽ´Qìoõc<¶•hߩкѕ|!ì‘¢< G®^ˆµå \9HSþ-ArAƂȊCu ð³pÌ£õ@XŽÆ\§‚0bÂ`š.¡Çå=²²?«ÖºÉ`G>ÀÄij%ì•Zª†¢t¶ß=ŠH´˜Ÿ/V´»ÄÛ¨ŽÊ&rÞ)± zˆ§0¬£K›˜œ($¸Ð2Œn›•õ¾ Ô"à9Ów‹C˜“F;Â@ØCv¦ûqž+ÍIÔ'Hq&7 hº.Ľã‘^óî†éÍ™ÀnŒšÖÜímõâ9¾¦æ)x•}2HÙ¬ïԋŃUÕ^F‡5QØ( nr)Lù“À‹“´¬n9·vP‡€z ¦í $BØr€øÇH%Љ IÍ]à0ð¿óˆb ÙÕþÉÁPO^Wõ8Î]×—åz%´±’@Yc|D8¸žFŒšbëgîöDrîtÏÉJí_~‰&+cQm„ªI2QnÈdðXœ#X–‘Çžcqbb¦QÖ#ì ½!B¢ÔÁð`ï?Út£zêEÈìÇulk'¸^U’bN io^Hæ´®›Î–7k¡ Ç8ç"Ø/EÃóÃkBáݬª¶ÿððt‡¿`=‘¶ê¦·¾Ÿz"ž HJ?ž%»†×¾eô‘½¢IõŽ*Yli¯hRŽ6€m´ýŠ&qœ¼\®t+ª¤üˆBÒÕAÉÀ£Æ´Œ9J!4. šã&âü{ý9)Χ± ÐÆÐÛ©É/|)+ñv¢3f$)¬&\Ê{ìËDÆDÜÀ¥Ü ®~Ââ"ƒ®»sŠGÌö{Qü³aÇ"ÉóÃqßÎr„XFsEoŠ×ÚâÂõדB@hNTQß`•æ¬õ´µ%"Š_Dròܤș嬓Gê âÄFz,¸µ¡Î ˆ;§6è]p_¾`N©“ÎHz¹uUe±\PPb‡ ÁQ…]çh ‚»Ã“3‰á´0,  œïUÀ8‚ŒÂªka•]@vãÍé«“G ìÀKÄýaJøMQ#®€õ+­“0Ž“?ÂÉ‚&B8'b®áí'\;"׎ø} *†`s÷²«›Ï˜¶]woÕ³¬jøs]„µT“Ýb´ýLÿŒøˆž¹&Û;½u°·+áÙÄú ¾§ID6ú-éûÞWCƒc—4§1ÕÅíITz}æµàù\Í;gÎú ¶4p («ó\ŠuSÖü¨iÍq,4( {ã"s–âÛ… lІËb+Å$€P’·1ݼLI:LB¨ULÒ†CãN %p,‚ÃÙö*Å1±Ü›í¬ ‰!8ZJaŸP‚Ï+§¨h„-+"ØoѦp£I+ޏyIÈv‹ñ_FçMr&-þÈk"e ϶·o¼sóÏß+%QrÄ5…§rdÈ’˜kº1ºa œœž­ªµdÆv’™(Za —£`Pp¨v•'ânÚ“¼ä¨ÌÚQˆÒóÛÀµPÁÉÇÄDÀévrK*wÄžnîï^eZ„r›4·fzsÛÙÇ6â––àÉ¿SH ÇHÈsß`“®T(ž¨$¡ ÒT’k‰àóœŽDÝòâ¡ãˆ‡ ÆE­)¹º0OüO‰ÏI¥S"lþ¬? ÷ŒkWà÷àLN\iO²£pL?¥š,^Q×’ùèÉ€ÅÀã¸Ä®CW‡R—’úSCª"Õ£Úp‡§*=ç¢Ð¥–^7|Jp#¡Úc©LuÞZՔмÚ¡¬NòJ°f„«]A„áMÁ@ „Á4ÑœhrXÜvªA=‹Î„ÿ¯!›%'#o¾ƒk+Û}Œu>â¼R!»3/«”µM52®´iCÛdé‘ÊØÃdEÏŒp·áCuKÏ쮬ZÙ„ãvŠâk\¾ËŽ÷Âugð:HY.ØâÆ=üAé*ÈêŤ:Ú~Yó²~æ€Ë)¸•8͹ðĴć퀷EWްßô¶h©ƒü»4°Úæ¹s!Ù–>¯¶Étë®4j ‡;¼83ŒTÄâÅ~âÚÙ.\¼bãfÜŠ6È€1uf°èMlkxIaÞ;.d\Üpa~φò¤R”plyòÂÜea °e èżڹú%Ü‚»P"RÂ…Îe‰¢5Rh‹7Åðe-ìá­t^ œßW÷Ï(k!(…Õñõ˜Êž­] ›Ý±Æ7å†ïOˆ:/à•j+û˜,×12g”âΤn?šˆ%¡*¢FÒz¥ÓÏ" .犕èÝ8Z¼K„Xé+€¦³\èòd p ­Å%3B‰‰FêÈjª;š[ž µÍ±‰[ŠðÛ¼}Ò™ }2Šæ¹ùÚn¹ÍOóK•ñ„ˆ~äÉÆM÷„„Ô¦/œ_)5<”ÓŸ;!¹Rx¹ei–/ZB*QV€± 1Ÿ¡Þ…“)x½±)YæáÁSêåM;g±ÃnÁÈaµ^y˽:—Vx‘"Ü& ˜+ÇÁåõÚ馱X—Â!±¼Á¿8d‡ã–P)ƒœ—íÚÑC ¼ÓÞ·@_BzÌ5 'w‰ÉÐe„”x’üX.cuD]ì©)aM—ôÊF²¼}›¨Õõüagvç®n}Dˆèt‚wo—,É xSEö£0™ßu¤Ì‚¦_BUžéUÉVÏÏÌŸú#'çßõ °¦ßSL+–x‘ ßöà’9R:¨ÓÅ@9gŒØ’Ö—â,Û¨Mïwavlþ–A×­½ð[Š‚Òcù ¤kÅ™] cæÊuì·¸ÔaÍ`zf›eTu,HbÌ Â¶|´;aõ¬JîPeW6¹ ôœˆüÁ~G@e&°°-¬o¤`vê1+`‹Çx ÀŠPÐÆÀ%†)p,7Y6w‡VñÍt‡V¡­‰ ¡ŸxÎÞ¹õ‘LôKåzè%j€77OyÙ媥Ç_[ å¦úÖsY-àø©`ñqÞhš"‰³uÝØ‡{ÓȵîìñæÏRijû,¹[YâŠoêÔßgy£"W ç lÊõWëùsʹ—¡0‰w–°U9v´ã;Í _=ËuƒT‡¶:SËÂ[XD‘ÔVymŒÅÑ•±;s8jMQa{*;àÈ#ì(æÁ¦(ëÊš„UÙSЏ§Š0 (vòºmb€+ cÌ“¡›2ÃË’”ncT4"Ç#ÀS¢Ä¹ú®•{X,b¡#tîôÔìÝ¿Qª~áúeÐS}ÞÐ[äÆï„ z+Åþ+”¡ºr¤?Æè¿,DŸ’‘bFxN)Y,X$anÛÇim4e›ˆ-Ý ø«bÂCñ½ì>¥Y¹©K Žs¢ÝCöq®°IžÊ•¼àAËCû‚0Ñù«újó"ü€ØFDÔö´rކ;-J‘ŒÒö7º+@Ϥ°EØjŒY|<Ôò“9 ›gd•o0s2YQ[\¶tÆÁïvxë$þÇ[A‚%ŽáNWš5n‡d°B ÈA÷Sìñ§;—ãaô¯¯ÔZÕ,4)Ze/ƒ. Ši¶àeùm(©ŒÌö,›Ò®ÅœALßnÁzž4Ð,ÆL£slÑ¡y·Â()øˆ‚‡@A+.'2IÛXç–eÞ/®¬ÝD<<ëÍÌöïÿ™A_]¢`É} ºXc¼˜:XOY‘•°,nܒĈX" Å)8ïÎ"|Yñ#„%UÔ8“÷c‚;*Æ{[@pÒ ŠVk'j=ž˜4dzúvNûÜØº k!®Õ#éo!ßa÷;/™‹é–j4á›s+˜b;«!´F³”K=Š9i=K©6‹x¹G2„#¢©á ÕS;"}6Íä3.,o™`YpKÝ\Ŷ}Ë_v ÝbèJ\EÑÁïÁ çCþ¹Mè,ÜRcà7Ø¢1p/G!ìO)~€Ëœ(HñøÌy€ùðÙ¦ð*V™CÙ G€)±¤d1òE­Û0(£gO(p€%×÷aÍ:Å€×Ö×*vÐ˪è%–Z»ºC ª÷•C|,¦{ )Â1¶œ%çòx()×®N÷»Óö¥å½8m §½R|‘ØÁä¹Ðw¼”´à >p۞Ɉt‘ô‚œ\¿16ÛÏÃÒn;Ee»2*%’ƒÄ¡— ‘ÂK\=7c Ä+Ñc'!v`Óã:ÃF6Ü)ufñ3 ûkÓÓZ{ΈÉÒQ(ŠzîœlÊñ)y‘t.$:λØ!MñV ¨ «¬‚~6Ô). Šƒ{Wsxl%*ÔL4fdp<ë;Bö«9ß{ö«¹ýjŽªc‘Ük».—¢ËqíÂÆ¯ÙÚNLoeC˜G¯”CmÉNC5T:f±´Oé$>ØßpÊÖ $2øÈTºÞösÑLHɵH§Ü½ý¾*äÜz5=T÷ˆ¯:#šRòfl‡g¤u»³:é©Áb0œvÉp˨›x‚Agžy¾Ò}ÿ÷ø½'ðˈ«ãøãÛ/ŠwJu=*Ÿ½‡Åûhø”5Ç3¤ð\õ“N4§‹{éXWSiÃ^¤iNͼ°S'ÇÀ–Sš“™O23-Õ×õIvÖI#õ©vß>sïiá3|f8;FždUŸ›l¦?×Û@—ûîèà™™á3zf$¿¹æ1žˆ¸gÆ‹™û8¶ËH ºóïR Üí‘ÛFÑÁèðÐvžÕÐþ™jhº¶Tönbz®¸§˜ðÎá÷ˆ–]hÛª9‰s¢ÖÛíõ·¹ã#ö* ý3'W<~>üuÞ_ endstream endobj 7954 0 obj 5238 endobj 7958 0 obj [560 /XYZ 40.7999999 684.500000 0] endobj 7959 0 obj [560 /XYZ 40.7999999 684.500000 0] endobj 7957 0 obj << /Type /Page /Parent 2 0 R /Contents 7960 0 R /Resources 7962 0 R /Annots 7963 0 R /MediaBox [0 0 595 842] >> endobj 7962 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F1738 1738 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 7963 0 obj [ ] endobj 7960 0 obj << /Length 7961 0 R /Filter /FlateDecode >> stream xœí][‹ä¸~¯_QÏõXWÛzºgy43‡‡0»›°d–tö!?®¶]Õ-Õ'ÛG«Êš†é‹Ê²ttîGúôáO_þqüçïÇ_þsü6~ür¨«Z×ÿãé뇷àm%øðcÓªŠw§Çoß/Ç—Ãóá¹ÿÿåÀôëƒã·¾qzÅÐáïß~;|^~þòåñ/ýOÿ;òãŸûß~=þíïý·ŸÆþNø~h;}úáßÃŒ3Þö¿¼ýéÔø¯Ã_ÿpü­BûÚïéÿtÓ1Ýúãåü({ýzû(zYÿ9 –ñþ?Õ“ã¿?~é{;£ê$c–M½¸×†÷Ýv¼eÇ®ÑG!¹Õ©5·e]1ߎ4ça::ˆùMÕ²qwE&}S·¯ÓTï<§ž¼ ÖO#PGýˆ˜×Ì&ÂÞÈto™z¤d­ï4§®<é¥j.±üiDÌojåqWDÒ÷ÓlŨm”7ÅÆ®¼I¯yh û1¿© ¤¿ÒÕsKÄ/–èÅñàǯ‡Ÿ™íÉð~ý¥É«õ¾}ý~ý/'‹ÔÈãןެköôãñ믇®RhÔ`î‡ù[ZÔÂa ë`‹„ïùˆZêO°…¯†Á™2{ƒÏ8Æ&#¨ 3…½qHQ׿GàùdÌUŽ™~&¬)n˜á¨~–L†0¸ÚöVC>pPrˆ€² £Þž¢˜nŽùäÏ;Ÿ¾ö6/šÓR&ŒÂ˜ O«b½¾¥0fFŒ¹NuÁõ¡^L4: ½#Û‹E×Óç= «”Ôm?œË0Õk‹¬ä0Ê7„¤5çÚTµ5ׯüè0yyé ?k}´3;Óæà˜íHøQ<¢OÁTW#ᆙkÄ BŒ\·d2LÄf)ÖIs¼æÂ9hm­ õìÀlºâ¬5VÃ|vôß޳dI­÷ Ϋ+ݰ÷añ£5ü¼@ð)Ì¡­“Ý­±®X$nÉÎ9#²›P– ÀÊm–£5X´¸ƒZP•à-ãêí>-îÄzßžð£‹6a‹c$øÅX䱎¶eÖz`ÒÛ3¯—[€fÓ+.s\/ž…cÂ>'¼|‘Õ¡õ>.ÀÖXKa¨›q„הʃIˆÇUl=©=g–×›¸´nj“Ö–ç3 1vt®1ê§øþœ’°¬•ÅÆ Iô¼àÐÙ³4$îÞ߯›hk“ð‰³™ªUõSmoQ–ëqÁÇm1¤åOñϳ‚9_«ÉÓ8>c6).ßË‘5d)ݼθàÌì '˜¹¿RºÙ_é&Œ·„$]4!ê5Nmb’àéáŧ°l8’8”Ÿ”In ß—$Š1“$¥BW !Ä™–"ZF¼×¼´Sþ ˜—‰$Ý” º8×;*6S°)†Õ¾’#%—­x†V”|bü스䊱£:aõº"!§EIºZÝãÀw‘¬˜§+|Ö"›RÞšLŠ™Ñ°«Þ< ú‡e6¡ ±·s± *ƒË‰õ ϪvGOÛŠ~ÖÆì­´­OuË(nÁÛ1¬Êá °BÓॠZï’cÜÇÖ%,¶ÍzëˆÒ¦o± ä„?fËã óåŽâ¾Å~+$rù„IR®¢²Äp¬AÙ ”¢RÕ(a Áæiñr¢ÁõG>!z4ÖqË/ âw,ïĪŸÙ;m–ïMYcLæ#`X$`‚ àÞÄ(çêN œš„ê4I*·!»Oå ¥ ’¤©Ùióµ»_ )„A’%U™ìÞ«ˆk¹*ŠS]hìc#½â¼G”¸Æ'µH!…QYñ8‚@œ÷É\ÞP¸æ“÷Í?cÊ…!ӻʘN–MqIÔ,mm¼ÓÁO+ àcD‰’•©‹Ûl‘Œ+޲kçÄqû:+óŸcó°â¦'÷”×m%J ”@›:Å™ ÝYü›uÉ¡aÊo¸TâtWãïÑ4¶íû•é#zøwáçµÔ“÷Ø(ó™vý3ì>Ç6n|ºÒ›xš,¦é®^¶¹™½1ß3<ÃT5ðþ›™òÉ-Vú} › ?×CÓ¥·Ñ;¬ä¨g.FMŽ H ¯Y2ÓšÁHD.P‹ƒ¢C¸ÎDÕ£ÆóUÕ–Ñ£¹6Óp}`oxÔ”÷8hðÒà ®‚B-œ0þˆF€©ãhσ© è ž2çj".ÜÄe0Ëøñz—›8û\v–{½qŽHáàÁá™`OyyÔf;[PØ€¥qù¢˜ˆ@W¯ª{ˆÑ^û`(LIvë¤Ç¦¼¸§ý( ” ó#IŠHqÞÇÚa^F?©­Ú®~ï«dé©k¢V‹=Ùi D…ÏYŸ½­ÇPëñ“kËÖìuà#l¾"îFç»×V µ˜Ì@9ëb_5iWÿ¾¶u®¯Ýý7ŠÚÔ1mXˆœUxžñIÅîÄi —z›‹{¥˜u?¼ôP”5R¹Ôgž›E·ÙÅgRð':é#m—ˆ½‡ Öã×3´Ã °ÉyÀÀ5Î&Ec À·yem9MØ­|]ˆ4îΦý§Mã|Cú8N6u>ðélŬ «Ö°+jAμ“Ô…¥ -ÅiòE¼Êb9Ü®ƒy-¥`Ú†tÃm>_±ô‰Ê ó¨»HG|h©cŠmöQÇsR Õ,­Â÷Ê nô‰‚«tÿa ·\]˜(lAJû¼2³dÛa U)â`«,ßiSq…–K“™¼7cÔ‡¢ð.ãâg°äÄÝ6º½Ý8› O1Áà…åwÄ-Ðg¨Ö ›ŠÎ2ÅaÉfؼ,.§V!¢­Œƒ+R@ñéjüŒ ©Jø £œ¿‡'Ìñ±[ñ@^¨IïÁ4€#pœ˜Wpl„àÓüêÀ6ó5Á4Šq6G¸ÆRïx–9Œœ@€ÉÝuR HO6GœK蘊Ë9ÔÈŒ„B£Æ’ޱ0Þ –ZŒw‚µ7ò¹h¡tr†×GA¾¬¹àú8h€[0’PáÄ»ãDÇš¦@ßšì‡â³ãq´äŒE¸Á}µAj7„»j(3Å–ß™tM½$‡zƒÃˆc`8E¬7 'rlY0 æ ×µ»âlÞhØ,—«•·Õª±~Â-„UpŒ€¢Ó‚®¶CGSî¸"Ø‚T:ÍaYðúàøy$i;‚¿î¦–FÊõ1óAXÖ4¥êx±¸k” ºÆ¹:GÅ@’¡°Ï…õm"9 y¹4—ÂË„–ÛŒSpNÑ‘Ä>¶¨8C4ö¤ØÀ °´ X½+ëŒy” í–BþiG¶9˜wÒÞV»nå°7¶}o%×ö3Ï‚HÞÎË&Áãwø˜—q^ÛBÍ0p&4¬¥L¹ö²™Þú”ð­ZOo-õÞRïÝ•µ.µÛÂUá¹*:¬lÕìxJ¶ÔaÝ’‘sÇZ¥Ú:§T= O±3yÛ™Rm½Õj«#KTjªwWSu\ý¶«Ê©âb–¾¥rZ*§î–<*§Jzír-•ÓR9¥zI¥rZ*§÷Í”Êi©œúXdí³¼TNƒ[Ê”kßžßš°rªºó¥ÎøL|ØX–ŽõëL«óÁá)®AÝ-G\ñº}a9ŽK´Û8¡2/3Ñ«Wœžâô¼²ßClÅ!,Í É40ð@½û¿ÞC n¬˜êE¹µlE'Ö2îï!])ä4FAÉZ Eè¾ëa¯”Ãà_ð¼5û‰nÎ MoãlnoZ›äø%CK}›^$twŒoOA{¤h+kHË_ùð3É¢ŒóåÚ¿p’»¡«ò¹‹'ùe7-qrœŸ¼iSÚüCÐ7Î]Éû»!J‘N´‘SŠ´ÀoºF]à7]-ûߘn”Í(øx¡PƒüËlq€|ÊKo…"P'ܶŽײéηZ㋌W$…ã^Âã°²>—ÛÍß/Fñ )¬È3ÌM>ù’ëŒW)lòÄÇC.7µ/ðrÍgã^È›Q"& ¼ûVžƒû;û/N`:‡»7·êpï§ð[ðîÔI¸“»ÕgÔ…ýàPΕs‚7*MÕ¾pâírbh m«gÇã)¶TUÌ/xÓÅ÷kÛ(gÿ)vŠt⟠¡œ÷Á’qt–Ç.þ®öA-)Z>o-ËaW.칈°è(…{óæÞ¤ÚŽû °¬#å\PØÓ-ae“`·/zgíñàõ¡Ü{”w’ʦ¼m´ŠdÚ#já¬ÎYm¤ƒcC͇€—AÊÛ%Œ¬;I#klCŠÔ•ç¡䙄V³¬·é!EûÊ$ïÐú ¼w¼I×ýqo”Û™Âz/˜cq î GÖþ'd—ú‰€ODB§ì¡ %bZS6Íâ4–tœß è'ÇšbÜ\¡" |`NTx»K¨«9j0xß lÁÞjSiïÓk#yŠAµw©ÑêC©|âdµ(µŽøkâ <+u ƒËæ~rÕ”J‹Ãž2¤Qo¯r‚=ÃÜ’T΄ÏÍQ”– p-){ì0¿ÜzeÎvs?:šBÛÔÑ™øª™§oЖ°u{R•-Ê2Ö8‚ÇÒD‰SèìEfè2ÓxínL†¹Ù¿¶óÙF¹½!¬çVW¤äÆäëÍÔTÜÏé GöRË"hfÞ/®emn9ËŽ7¢Ý*çC 'Þ,'æ°‹¥·SWý8U¶ŽpÇ[Xo*©ÇÒmá¡òº ÂŸAuzrè3¶sÕÁP›Õ‰ ã¦ÆW†½Í$5,ïŠ%¸Sà! d8I.°BÅÔŠ3/•a=,àLÊd×Àea|USZlõN–M³¤z­5¥ûîf)cHž‚7ê¤NÁÝQ _JÆNê$ƒ?êm˜ *ûI°“6cJx%ݘ·œ•ÄwáÄÛåÄ<ßBù@d}3èu¨åÀ%-ÖÇ“åBoBÉ‚´! ë ¼ñ [¡ ëš1'¦Ñ(ðB±g9سk.ÂaJÙÒ¡£)›Óƒ‚v8²aa9$Òv›ƒ×GŽpZŠ zŒ=pI÷&ù , Hkšp{è¼€K6r<³=O"9۞DZ }.É’Ã_Üd“ê …#w4*%yÞþØŽ»(‚5䤦2,%„ÌÔŽ" ls0ï$¢)‡½±Í{sdë±,`  T=ےƾ [í##HÁ|IBJqÖî¦\{yÞœp´ÔóW¹•º²ÓŽ—ìçÚþR#.\ž«–Õ{û¯ãK¯À{å|úÀøíÛw‡F·MA}1ÏNcà|tÖŠ´úÈúi\1"¢cºzÝ!{õT`Ãe­+mn‰YJVe,5Λª¹~褹Ò2$E…¨x§ßmê‹‘JUzØÚ{iià{ZøLŸÌ_Ã+^‹S“)"×zDDYLví³ãY„+3üŒžCÞk- ÍcÜo½î™qÅÖÌ}Û«xpÝég®X3»Úc車Æ->PÖ3£«Ñ?SM—–Ú\í1•­¸¦˜ðÊá÷°Ç «Ð¶µ®Øé8Íû峸×^ EìmÝú9¤V<>þ”Ò" endstream endobj 7961 0 obj 4256 endobj 7965 0 obj [561 /XYZ 39.8400000 89.2999999 0] endobj 7966 0 obj [561 /XYZ 33.1199999 684.500000 0] endobj 7967 0 obj [561 /XYZ 40.7999999 489.619999 0] endobj 7968 0 obj [561 /XYZ 40.7999999 312.019999 0] endobj 7969 0 obj [561 /XYZ 40.7999999 312.019999 0] endobj 7970 0 obj [561 /XYZ 39.8400000 231.379999 0] endobj 7971 0 obj [561 /XYZ 39.8400000 231.379999 0] endobj 7972 0 obj [561 /XYZ 39.8400000 89.2999999 0] endobj 7973 0 obj [561 /XYZ 32.1599999 686.419999 0] endobj 7974 0 obj [561 /XYZ 40.7999999 489.619999 0] endobj 7975 0 obj << /Type /Annot /Subtype /Link /Rect [138.719999 696.019999 239.519999 703.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 >> endobj 7964 0 obj << /Type /Page /Parent 2 0 R /Contents 7976 0 R /Resources 7978 0 R /Annots 7979 0 R /MediaBox [0 0 595 842] >> endobj 7978 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 7979 0 obj [ 7975 0 R ] endobj 7976 0 obj << /Length 7977 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`ÛM6û<3ž90l ‡ ‡À›M°Ø]ÄÉ!?-u·4CöG²ŠEJ xÆj5ÅzW±êÿü}ÿÏÿî?<~ù÷þÛòóñË®®ê®žÿìxùªFÏ¿öC[éñðgÿí×Ý÷ý÷ÝçÝçéßï;Õ_\~L×)æÿûí·Ý‡yòÝüÉ—Ç?O¿ýo¯÷šþ÷óþ¯›~ü¸ŒwøÂ¯»aì¿ü2ÿ¢´ÒÃôŸ—¿þk÷—ßí›–0Ç=üûC7ÔÍPIëø~zUÿ¾|M6}ÒÖ¦ïöJéiíŽÿüc÷Ó4ÚiÕh”ê;Ó×Ñ£öú0¬šý8 ݘÖÔÙ[ÜP*u N÷2V¤Ò¶¦&Àû‡ª†nù™h8ÌÒ«~:äÚLx³1îM[ü=0£ªnûT¯#%ŸÕ8ÁIf u ”­gG’< U«^æ,N#¥‚PÕ½ %W$rx$.çSjh…ྎ” .m”Ì@‡ÉÀŽÄ†»äj]&G…×(„§Æ¡b"ik+äñPlÐ÷õ ¯ÞU ˆû\GJXßBÕp¥ìl<©L£š^·æpø·Ã §ßûfùCXï G¡³XGJáX QÁaE2gaôYD#×gü»çŇ¯»ÏÊ4ÃÁùúÓ´£3ÿø:m¶ÝÿpÐÌÇé?î_×ÊüaÿõçÝXµcÓ·³Ù|ò„ž˜Gød@O4|¢FúÚêOð \~‚çÑš±68OÓÁÑðª;Õéó(|>pÕ5|Ò@¸5 \õ3|ÒÂôð ÜO ñMCXcàý4CmÙ²Nn,(sô¢«bî Ê70=ïpô[øN‹õ'Ì; Q“ðNá;ø‰çJêO“‰˜€ËŒ'·isÔ—1ÕbýIÑ©VÖŽäH:ƒwÊÑ’ð 0·ƒpcip˜CâÔŒbL„åX{•Áí¦üë÷cÍ`™ƒq§ 8T¯±6vñÑZˆ‰ZÀ~ˆ£,ÿÈuèª]— «±•àÑH1e`+–,x«‡ã#••»%Ï~h×YŸÊÍÚÕfž°e̱K¤ 2p 34Œ^¡1ã„RUkºaZÍ[æUçfd4•™Wí }_ÕåLÄ <ϧð¨x% óÕ-u>þ®ÒjíObE¡TzÅs(xT¸ó3·`òlï, ŠO6ðÝE*Åœ=†Í"öIAXâzþ ­=(Ý2‘Ï´³x¼Dð;Îðod<Ûúˆ @€‹j6 £ÆƒP‹É¼Á¼(h*ÁL\º|ÌÍɲy¹ 0̲plʨ3Õ0ÖÝ+L9ù[ú®}ýD5è 3< š°Qg;Ÿâ;‡²ÄH_|`S‚iB(A<›!°‡9k$$qü|tm<€¾b¢ã( ñœÔ=XŠEœÜ‡ê•­z”aU9Uü®±V„ \6å92Æ1s˜<]Š*ß µ†™¼‹šÎÚ¿ËkRvC02$‚Œå×g§ž™v:'fˆ­°¶Ý,çTW]¯^35&Αú’ò²¸dÃ@âñì±³ó°ÒàQž +çX»HØf¤/­ê Óç彜_9YÁ*nኰðÆY¸s OˆT›Õ•\+KÀOŠÈ-©oXib¹<â>,"ÁàÁ*ß…•¬5ÏD¡ÜË«Ü>¢ö¤[Õ‡›´Æ¼úà—Ý—lYøÐ¿alz“óŽ{m¶æTê8e_¯©T WWú ÓÑþd!¤Î÷•ÑúÊâBSýzhç'ÎË'®bŽto#ÿ¸-jÁ–q˜‘îüÖ,2tÁ_GïTMÕØ£=·º ¡2•CÏp)Úoheº‹ƒ[õÌ, ƒx=£ußžB0 ²kIqýpqÓÑ4¯Á Tú—0ÅM!8E½5^g4Üž ¿Ã(Î+¼SQÏÉáÂópÕ¸x8.jÌjÂ(­î)Œ á†[¨a¼æßÇÔð-¿N8Žk' OÝ{Ó{Þƒ1ð,táâ*’H½*»nÛ7¥^%]MÏDº1]MÕ­Ó7£«yÖö®?„õ‘²FjÜ,]vtí)uêJzÞt=ÿÙ@ ûI½’àb-¥½sîÖã¼3¢w–ž¸ª¯FmUB|@£©ù¨&Ø.jt6rG+ÛÕ bÑP™Å+±jÏ àªÔÛ˜g}ÕØž½E:vUs.òoÖ ®%Ÿ6 ó,…®~ÕU)³z¢3¥‘„dI è3I‘ÑëIÆ&@ O7‚•pÇÙ'áÆ á £˜ƒ·…/Ä^OJ á¿™«ûð5nÙ“­Çã Ø$98o¸I§zFC5—àÛ©Aí|•Ñ¢†â0.sݳTÎ"´–éz6‡^81ÃB55/X-Ê,¶ö N^¸ddæêTžâœN®'7:€É]ø½:ek7`lg¤Å®ïmZ¼¿—D$€¢ræÇ넬þi„ûå[  íhaó»ë²„ë²Ñ§Ü[ÌË gô8KùþØLç8e æôp§ 4úvAr*hÀ+|×γ¤p—Á Ó®»u~rα…çØb·çî+>-|s¯»Ã0e@×–çþvü1î{\uX×Ân* Žsσ׆ŸàS`œ¶gÕØ!‡™xmYw˜ •°î¥Ý$•È:ÁKÉCYW7'°áÙ)\çLá; æÊb7ë#äá9·€Á5¦ZþCÝÁsŽXÈJ <šl¨‡a‘³¸7c? Æ’x4†á¤@Ú<Œ*+øF-+”ÍÀøs;N¸˜£•àSàH#D=ŒC§݃ƒñØ®À2BÇp´…B7ß1•,6\I9¬ª<þ†îàÁX¾6V"F« D®Æ_½E ïÉa¾ä°·éeÚZ5#íœܲâòWÉ0Ãi1—¯’ñßõ&¶>íÑ"ÈʸžÅIì™q OE X¯ iÑ<æù4UQ¯Ú³6¼NUFM¼Ÿ¦TV«Ö2qž»R„Dn"dÆä¸µS)<¢‚†HÙX§¯g°¥Ü¹H>Œ ¹‘T‘[^’S75#œztñR"0Eã ; f©»Æ^J/© W8È)–¬‘³ˆ¸6Š×ËÈ™p¨U¦™Æ{±÷ˆár% õá‰àF™S3Ek-e‘„:ø,V*ÚxV¦¸OJ¡† !"×8ð,Út8gÙ¦³åM¼ŽíQ’0´ •&÷ lUšU ÈÑìçŸTCа+`ª6kRÞ²”^Z„R6ûÓB‹ YÂ7Q$¯µ\¼–¥OžÈ£÷úð!3gùÓZÜ‚r½„sþAO(¢“@OE#cîÇQ4'©ÚAx‰N…LzNB¾ëü“PúXuŒ /ËÞ>E'¡´ã1ŒWøDØ/Å!*‚tQªÏ¡j»SûB!Ü*Œ@œ™«˜_º _ØA¹jäÄ(°Š%8s…÷õ±SnBeQ¾ÍÓÎv‰²Æð>Bt&ˆâ寕rœ Иµ: `ÜËŒèò-NJ ™ %F[·–È ì1Ácβ¨8öÚ—ªMPY‚p ·'(5E+1»ìsëëœ+à· §=:§/‹DU‘Êëo<2籆3wBHgZ9#ÝhK"‚CòmŦ“šIô¹Ojµ2‡>¸Å$tÞDJÀ3Þ:¸XO™Âd"i:ñ11BÌ/“›§+Aæ ÷µÆ’r†+šÆb:·” ÑièþrS.• q全\'5– Ò•îô%[9‘àÛJ1ÓS2ÂO<£é—2Œg!’‚TጢÓõçÞî+ÓËOÄ‚Î;¼‡µ¥Ôfåôs“¸Õ‘д̣®•jüBH­Ê:¹p(#¿IÜÕíë)…3µ)BŽ 0Á!ÁI Ìã2.­e[jTveê™ =”ª§ýÆŒWØl’Ò¼›Î%<ƒa6ëS.å¶›UÊÎÀ¶nÚ‘î½ •à7¸ ûâíoŒÖ7Ö{ï â-txÎØdY´›|´\wßÂP8ñrÝ}c³^‘w’œÅz–„·ñ`ïøÄùj 7Šmì£uO¾[ÛܵØÕùîTÚ¦Pû’Ò:e„™ëi)ÑYôúô’@¬Ò—ô®6|pOÞð¼·œ‚ÆŸD¯¾ÁíN›ó«"Óöö´@v¸kN)88«J¹yuCqX,†òÞƒ«Ë¶¥8?9Ž£„{ûï}t“lýP–®²Ëàˆ—[ʽBqÈeQ3Kö\雈ž+¸®$®‹+ýkô„SgŸS+÷ñÔMgÔ@çÔKåT+õ´‡eÔËÆ£iDq¥ÎF¬¶f–·§ò cñ sjØ2j0cóô1À5l1^ŠÖÌW˜6qu[N¥³*ïB¸qjËr(°ØªEùÆâK¢,-[ž³,§`Åb ÏWkÇOXÝð)`šƒÌ9‡å¬àò§P@‚¼ýC=ÚÀMÊ~ ªÏ™‹îõ$ܼ㴾M©èPƼ‚KlïwˆÎl£ ©6tk;Òw²œ )«Úɪ\¥Nó7Ù&N¥” árÚTàUãV¦¸ñÍÝ2ÜnPaüÇ&v°„žäÏk Ôw å59ßxÏkº¿¼&'»í òšÆ~|½‘·–×äýnóš$ÊZ¤‘¹:ÎOàh3Ò½üä ~wÑ£7vøŒÞY¨xë‰BûX°›öÎrb”½/k;@Ö~×/zÑÂÓ^|7$<𼓔û †þÂ}|.34cÏK.E§ªz~ƒ› <ÃÔaàYÁ£CÝUêàxŠ«Ï}cbÈ^– E*J„ýçÝÿè/ É endstream endobj 7977 0 obj 5075 endobj 7981 0 obj [562 /XYZ 40.7999999 353.299999 0] endobj 7982 0 obj [562 /XYZ 40.7999999 433.939999 0] endobj 7983 0 obj [562 /XYZ 39.8400000 523.220000 0] endobj 7984 0 obj [562 /XYZ 40.7999999 433.939999 0] endobj 7985 0 obj [562 /XYZ 33.1199999 378.259999 0] endobj 7986 0 obj [562 /XYZ 32.1599999 380.179999 0] endobj 7987 0 obj [562 /XYZ 39.8400000 704.659999 0] endobj 7988 0 obj [562 /XYZ 39.8400000 658.579999 0] endobj 7989 0 obj [562 /XYZ 40.7999999 353.299999 0] endobj 7990 0 obj [562 /XYZ 39.8400000 704.659999 0] endobj 7991 0 obj [562 /XYZ 39.8400000 658.579999 0] endobj 7992 0 obj [562 /XYZ 39.8400000 523.220000 0] endobj 7980 0 obj << /Type /Page /Parent 2 0 R /Contents 7993 0 R /Resources 7995 0 R /Annots 7996 0 R /MediaBox [0 0 595 842] >> endobj 7995 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 7996 0 obj [ ] endobj 7993 0 obj << /Length 7994 0 R /Filter /FlateDecode >> stream xœí]K¯å6rÞß_qÖ|Ì—( h÷#@ È"È"ðd ºéÌ"?’ø¨’¨Òƒ,éž{ûØ€M^±øÕƒd‹ÔÏÿôÛÜþëï·Ÿ?þö?·?Âÿ?þö"î ÿÏmø÷'üåîZùbëš»ê†n|{ù~ûþòë˯ý¿¿H;¾þ×?Œ$|ƒÿão/?{â/þ/¿}ü—¾ô7uûç¾ö×Û¿ý{ÿ¿?‡ö†|{q _}A*©\_Á¥áá¿üë?ÜþÖwÁíÿýÉ:ÙtÚVõã{zUŽÿâW)bý_Ùuê&¥êûÙôìøßÿ|ùKßZêÆÝ-u«Ó—;kZÑ8§úr«Ã?»(µª'¥„Õ·®µ·6§“ÁÝ×’¬mHjÇÓÐÐ#Y…L Ó®¶Ä* Ý·ÕÐSSµ 5’©¡¡G²Z”ÝÔ½3R¶ƒvœïÕ‚É bKÕ ëU‰§¡¡G)Ë@EN¤**0VœÀÆ(T i Û«¡ªäÞu ÙT{¼P¬ªNŽl§Á¥›–“ƒŠœHurd1VœÀÆ(T i qÛ«§›€5”Á‘Me%€.@¯ž^ƒ`}›œ¹iœKÑæx#o¡}_æÅ ü Ó+‰7ªð¿Z•MrïúbçSyЪÿŠÅj£5ˆDhRNƒ¥áž0Rã¦û"'N`c4Z)8²íõPÓ>eg`G6•Gªi§2«…jÓŽlgaorZN;¥¡È‰Ô¦YL‡'°1 •Bj`G6°½ªMû”…ÙT{v*C±Z¨Â-'eX;õEH,„VœÀÆ(T ©…ÙÀöúéÆÂehÓïvd]€^?½:Ø‘LiMʰKÊ Úoä-´ï˼xŸqz¥ðFµþW«²ƒå¿CŽN,ÀRBNÑvÉÑ‘cÒu 4©Œ?ú ¿gÅ)¡Ö½ sBN»]ë·ãx¶eÜP†mÙTVèøzËí`[6ñy 6©®Ã̈½@ 2+d`i0ÞÈQ»@µ*Ý·Ÿ<½¾ N-T¼ª%w/–kmX Ùeé±i%ùœ±Ì‹Y&÷vJ‹1âi²esŒM!9TëvD+àèBE Dq¡Ú¤£°C«Ò!zÓ ø â^B9H„ 3rÄÜdÚ4ò¨oH õŠ®’G8”(•ï×ÿê+zƒÃ¸cªÉئÁĦ‘ Ž'Ùd†9¹Á3Z¬ˆO“q¯`o8Êtòû28ÄPñ¤“«Ëõ‚Žé C›F#bÓŠ‚Q–'AaŠÙ$×xJ‹1âi4YY3—C=h“<Ǿܠi€—ìõ½Á!h+€²•ˆØ´"Àâx6µ§˜­´³öƒÐY#ž&AÓ˜qs90LZüÈØj˜ xÎ@qaº¶·Ñ›VÀ§å÷òÈiD"T˜‘#æ¦éšFnÀ“æyPnä_Zƒ¦‰Xñº—|ÌX®7î9Ôû˜“JÛÁ(˳ù=Å섘µ 1âi2nsŒy"90¨¸Åަß*J ∠ÆÝbÿÚagsRiÁçå÷r.öŒ3rÄÜdÜ4ò¨oH uŠ®-Òt šäšIÅ`óNïÔ"7æ®AÛ½I%¦¡ 7òÈéœ7r`î·X¡‘âX õƒ›C‡ƒ+±âÇjpLÁ•W:[˜VPÀƒ'ñeйCÁL‹1âiÐiÌ1&äÀ0¬9bp8¸+J ∠z‡ƒ+Ž*L+8ØQ/î%ä‘ÓˆD¨0#GÌM:<êHµ¢¡Ù¨èR àJª ê&„B¹Ú¸¥´@YZDlVI«©PæÅ,S²ü”/bÄÓhÜ+˜ ®Èú¬E¯®uªÀÊ?U”@Äê;;´*-¢7«ÀRŠAÜKÈ%$ÐÏè1#GÌÆ½‚<êH½¢±Ù¤èJ¯{.…—B¹Þ¸µʺAĦ•”é˼˜uJªŸÒâEŒxšŒ›Æ#÷H *îQÇ ¤×CE DqÁ¸µAÄuƒèM+ùÎ!î%äígô˜‘#æ&㦑G}C©WtòÐû2¤ÜCÅë^JFåzãnP\DlZQ0³ú2/fO · 1âi2n³¶n.÷¨c¥…U`ª(ˆ#.0·vh5ðÜÓ›VšV뎄ŽO üÁ°w%Ýì§t#í¼'%d=1þøòý窱¯û{¤ƒ,Äݶ#°ôDŠY«êóü_¶úœµQÄERä/sÍ; <ÿÞñ9&©œžÙd‰¡)[`œ%ñ_“?ݯùr?=¹mœt²wŒ,´žeد½+bÛÆI“¡QdèÀ9CºÝÃa&ØmQísì qfŽÚ­Ý½!ôxáI³ôÄ‘­}&Ÿ|Ú sâðÔ¸vÆãiª»×­2½[±x–e­fs¤{"[ÊÀ²¹tNÁüt¥)Pr·]6-•`$Çâíõ‚1”"èh]­m¦+‰|ùÅ2H²4’u-á÷O1%J«>øa[Þc§ËKzY‘-+&š/Eé)»dyA÷‘|BOĹ­“¦Ì­çëöœû•€èßM}*—ðç‘ea5oueùTï²8¸F7\5ÛL ÇžîÓ£Ãæ¨+h/6¸­‰ùDVJ¡wó²Æ9χoò]mÊmºÈ)§ÇȵÚá$eÑ/†^ÝíÞ29-¿8B¹WºùÊxGÜñk—Ëmx%³ñ¼ó+žÙ×lD3Íþ9ár¥GÝýíáœ3Tí™VÖ‘äì"»Ý ¢×œ†d¸éݲÌ/ËjÛ«@±WhW¾ê¤‡åU6,gáæŠîµl&Wê’xIÈŒ5rp`z]áãÜé˘S4Úp_ æ¬\ø×(Žù7zd8’ù‡ùôFþtÛ.r\´´+ÒJÜŒž)NŸ†{ègŽBI¤qPcì){ bû;ÖsúlyDØè)É=û6yÿŒô´XH^çAŽ}f–`¥ùÌ%¨•M‘¶ñ²êRÚ€_9/ìH(ò ½ó¡:êIàóÒú‚Hz'çŒýš…'ZGºÒ7’oaM¶$ò‰&‘Ò­]Ö뜽ÖÍq­ZÑ7’m?%tÍ7š×´ýû%•4Giû¡­‘–iY%t.ã(Í7Zãé^KV¾•èè—ëf#)›mí£Ç§¶ø : š2Zk¨¥Êv¾dßü…Ì–3ó_äëÁnî÷ÇÀÎVKËé/Ôj)xÌhe'ÉFB§ó‰0y/-ÆHšŒš/‘Î<™uv¥K4Œ_æˆ?Sd?$PºÓ&m&Ið\OèŸêÓQ‚¿ ¤ž‘MdXÀ5Q´“ÂçLƒa–Œ –ŒÕù‚¯}Æ-ß}ܲ"$vRQ¾åñŠ{5¦igƒûU¶_^;gó®>hWyƒÖ!ÚH+ö„vèHƒËVÇ´mîÏå<8À¬.ÛÇ<^mt:> ÔÅd‹4ø•† –ì²XÙé¦Su^mÚ>ót“Ñsà%?}Ú~—jIãxFÛé‘ãyŠôä©öa|Þg(|­ ?s'«kf#æ3Úþè‡>µ›-©Ÿ‡>Ÿ‡>_»×ÏCŸÏCŸzúŸüP‡>tqœ²ç×WÆ4úºo´ö™ 9¯Ûm»“Oè9°ÄO™¯‘pcF&Ì&× ?˜„Ûš#óý„umÅ«ëËk´¢3#GÖ'¼ëC^­¨X#ŸŸe×4é”ý+eÙe›Ï,»/ËŽ¥k!è½Ï%™DKT†-Dz[mAóHë$ 6š h‰É¹%qü,4}ÕÆ-Ç·gÎþ´MÁ–MÑÆ!ÇÜH\ÑÜßæØŸñÄœµD'Ôk‘9³û€¨Y·ÉÏ9ÿ}’žÔ_êpj^b3›,çÞˆÇÙd.±õªÍÅí{`\÷qÀJ9>»zηB¤­žü•ÕÌ÷¡AdcA¦â¬9BE‹€Š OX’¡˜çÄ·m”LIÓçEk¨MC93GQºùlrJöXÉxœ7ʹ#^–Öš´òV|vµêaWy¯Vnsô@2~nžW²5Þöú—%‹¼"ÿ*5ü@šwÁ@ÌóUªS>åúêk™7åæ>´û¢C4F‹’Ϥ—8šGRìÏÉ*¼&ÎÂóá½§OÉ{ óñïÎ<0½¬¨XÉ·9Ï𽩑ú Hž8´Ùâó½Ç<gdÞñ¹xz«f1öNS^yÀÚ˜ ÉüV:g%û‘Îy s)éS+9¹ø†Ì£{½Ò7útÍ·öø;ôù OI®7Ýš$9Z’9»’ïKóº$oû¢Ó'´¾=@~8Ù7Þó"+ç8 ô­„oO]ÕÑî™ÅŨ°¦9Bs‘μ%ÇΧVp\¼ç¿T‰äÈU‰"{`豆”\Ik¯¢îÝq”~Â6rõÃV·˜)ë¯ljM¼”W¤¡Aø–bó'1ïõÞ6 ïÐ=ˆ9—ù;1¶›˜öî@­Ä´EüAxGQ”ƒï³ÔšOâÞØå;r:tB>íl9ЙÅðBzéB`XÌ8Iö-ørí]ɸ }£‘†)¨¹+ÛÌZ$ß¾P½¦ypYÂiÛÆ“{âC€¶ãº™Á±í½‰’M'ÖûÂö‡ëÞv¬ñ}~©èÈýœ[¥™T€ïÀŽBM2äÅ÷uqìÜ—„¬«F*:ÆGëÂ+\JÙÌî¢ð3½GZ°±³}?Ó‘íÈæ+ˆÑ¹Ñ²`+êÒ6ÐǯXɴ)ÙRÉ6ŽlƒW¬Ž\Ûº™=\sÑÒã}P‘' •#õ¹h½B7 Oé’;òÎü*›“sâêkøj–´³‚=pwà›Ê”Ú‘³ÊøE„ |åΞªç5§²)nÇê‚>y°9÷¹s‘eš:àä½÷ìkÒ Vì'Z¤êìÌ$ßÇTpD t§ø«¹àW+üåw Ó‡’tÈ1´¶#(ó–¿¼Ru ‘õ‚î\¶=µ³×É×lÇáè5aæ²xw{)Hn?l¦þž™\ªÍ|ž©Iá/‰9ä/òD=KVüû‡ùg/k`1°šàñs_fs)sÕ9ŽCl›žÈùÞ¦“f[ü×|ÒéM­Þ]ó…,­žIùÇs`ŽûŠE¸çl0½EXÍÞÆ‘¨Ê¹w~I¶;8ÝM™EÛôamgÕ”R’nþ— ÍpïaøÐOºùO¼@dQÈ¥ïÚL£:£´ÿEPo®Y1c:<ùB=¡û’ Z‚nŒŸsC¬STs!¹ÊÞm–øEv[^•QØÁ'¼x3 ?GÒï…:°°äÙ› d!ߎÎ,¤3äJrɼ¾•œC)Ýš¦åS‚4ú¥Y.à š;dÖcEÎáù«ÔΤ=úþr—g%çþ $‡s»âöfŽ*½€=pÃÌö7¿®Úz¨9vY‘4Vr?SNï€#òÚXíˆÝÜyöJß*~0l刓víl [9=Kž0¢ÏÞ•|odå»Xços7f>¦_Îèæ4Pçj‰ 'áöhIÉ çS¾jv¢Ä£–µdÏÚ‘ 0J®ÆØ)œr+Ü‘ËØ^k1ôZá–šû¹Î^ÀúÙä·¹Ä;p…ü×—ŸyÑ¥˜»,áãÛ$Û–dQWÜyÄžÜr»3Q‘c[¾(­ØEÏ4ÑÐßæà»j¥1½úèŨ «EAá6‘öÞvÖ- å O¸uìE¾ó‘|Â|GÀKtßÃØU²CôDÐý¥wtAk[OÎeVëWºˆY¢#;äHxô’%4Ùîënjô‡fIá<Š–$–¬€ ÇŸMf]$ׯUÈuE9?ÁƒÈ5±DÓÀI‰‡©÷"é9Yc•’|ò¹À’ÉÖE®‰Y§¿FâR˜ ‰¯LZô@E¾£Hf­¬ hm,*/ÕÄú7ÉÆ†-î´½×2MŽŠ^No-=)¬WZûp¥QŸ5 Ó£Ù—ãOÅ ³N~‘y€‡JšÇŠõ—˜é»®Ìl´éx2|»#;LJÕù»´ÐðH6>ˆáKxá­h=ð^¹fRu¾+ô¡ ´dÆ!ßY¡CzY¢s‰õ†KÌ•q0U5ÕÒCåS¶u!±~SèEÜ5Ó³JÓ³¦§ç¦ öQ@¦ã¨WŠtÝ„Jû84ƒé'¡ÐÀ’Æ\)‰“B±ô^‰¦W" ð6¯ ›$Q7™ÃÄʮգ{gÀuår_WBWvüÈùH?úrX6¹¯‘„© P®LtdíÑç `‰æ‹1ì„jÆ&Þ§\Á¬‹4«Ù-‰c ZzÞ{ô°„è]:#šV×Ȉ“l®dQЧ]à‘xb0½M¬¯\¸ƒ5Åç)ñ(ñÄ`EÇÛÿý¿·ï=åñ¬¥¸…ÿýñm¥+9~]E±úêöÑJ{“=Œ¥#´wR§…L¼µw?“bgîYΫ÷UϵåoÕ· OüÒUë»òœžÏMs·>!ž´$G¾Ó‘+¡'€ÃlµÔš×Jü—Oäoñ¡„_¨w¹¡¥'’ÂLÇÞ ;‚=ôm4€ ­ʪ‘í¦´ÃAÛCz iÉ=Ù;JSŽ….´¦>Íõ`E ¤L´‰Ö ²/Y“! _%jÄ]´n§”UCö€Ö™ ½+tÅ9aﲕÃY1¬4aM¼ÔIz @I¿rŽÝ·__þ¯ï& endstream endobj 7994 0 obj 6680 endobj 7998 0 obj [563 /XYZ 40.7999999 570.259999 0] endobj 7999 0 obj [563 /XYZ 40.7999999 570.259999 0] endobj 8000 0 obj << /Type /Annot /Subtype /Link /Rect [95.5200000 543.379999 166.560000 551.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules >> endobj 7997 0 obj << /Type /Page /Parent 2 0 R /Contents 8001 0 R /Resources 8003 0 R /Annots 8004 0 R /MediaBox [0 0 595 842] >> endobj 8003 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1549 1549 0 R /F9 9 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8004 0 obj [ 8000 0 R ] endobj 8001 0 obj << /Length 8002 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès÷ò- ø ‡† ääx³ žEœò÷#‰d•D©ô «5mϬu¹Õ]ů^d)é§?~úûåŸÿ½üôöÓ¿/_âßo?=ˆ«p"üwéÿ¼ üU«@6Þ^UÛÿwùòøðíòíáãÃÇîÿߤ~ÿê.&á¿üöðSþ>ùôöÏõ¿‹ºü©ûׯ—¿þ­ûëçȯÿÂãƒo]O| „TRùîcª¿ø¯‡¿üîò[7?ðíÿÿÊyå…3Uãø?•ßñO)aÝ'V[á/Rªnœ¶SÇþñðKÇ y‰k«¤uÞ©¦£½Ð៻ø7ª Z×\ÚÆ]Zésös”ûXÉJFÚ{ÃÂh‘¬ƒ&…iÖY]­O5Ý )z,Èw}e´0½StÇ»÷KÛùåèé[_G¿èô—‘dÙ(kÚN IO$w¤ZŸw±§’¨)í©éÛ¹Ð:¸IrïIv¨¨ÌÇð -H«¿J´V—Wj€ÛS²ççD1’ݵþúWøf¥‚M—´‹ò¤1IȘԃSÅorâ BsOq¢Í=r_3Òr @'"†ÇH½– H%@$à­Ci|4âÀ1jµ—3&up ø]^”I›À| YQ‚ ¹Œ2y¨»ÖY¥ÉYOn’ÈÞœˆî¨Ú`ìAyZ )b Š_‚œ‡°dDš‹Á¸Œ/Èi¹ÚMÂHúä‰TDÞê` F8F­öŸLH‘‚¤ÞŒ9ʤM`â’%¨0ã2Êä= îZgÕ&ÍÚªä&‰ìý(%‚HÕ£Iž• dLŠ4ÙúEÇ_‚œ‡°dDš‹Á¸ŒO3Õrµ›„8÷‰¤ ðVc0âÀ1jµ—3&L^õfÌQ&mó—œ(A…1—Q&ïu×:«U>9«†ej"{?J‰ RµÁè|’çZ2&}š¿Ň/AÎCX2¢ÍÅ`\Æg•Ÿj¹ÚMÂ@jX¦&R  x«ƒ1qàµÚË“&¯z3æ(“6yˆKN” ÂŒË(“÷€ºëœµc‘¼U'ïðvD ÇøÝZ”Æ@@ê䱃œ1¢Eɉ2is*‡eRác —QF‘¨îÚÄÓHO£`1œÈ.4)©Gª6±ú&Éó„ŒÉ&­EŇ/AÎ=ʼn4ë2¾Fª©–«SN@HkàD*"oub F8F­örÆd ‘z3æ(“6ù@²¢ÆÄºŒ2y¨»ÖY}›šc­€Åp"{?JI=RÕÍ8a¡×7‘SY<¡-4äÉ2Êñ¢“$(0õ䔾uSuWûk@9ãà&‰TDâú®\°f¨º£j‡ÊxB[ìÌÕÛ3‡ :Eö!N9Á‚&SsŽÀš ô^ݾúsÂcƒ.уSyhb²:F•¡Ê  ) =´@r" ‚FÌC¼râD5¦8¥ /2µ×7³ÖDcÓ.ÑJ \„^®Á°gTò kJcO­Þ´s¼I·È?Æ.+^Ôg Y or+Ôµ++;@ªÅЃ‡¥¤‘Èê 5£m'‚&´‚ÉÏ,lXÔ! ‚FÌCürâD5†T9“©½Þ‰ÖH7°Z ”‹ÐëƒÖŒ÷¡4ʚР'ÁzÓÎñ&Ý"ÿÀ¬xQŸ° FàMn…ú¯vec<¸²…µÐaO55Å"Y´N€P‡;àSZÀdHN¤AЈyˆ_Nœ¨Æ´Rc|¦öz'X#mau´(¡×m0lÜŽÂñ)-p&¬7íoÒ-òÌŠõ™‚–Â›Ü õ_¿»«¸²í¬–ÒF"«ƒ¶iA¨(hL7-L†äD˜‡øåĉjLAK!uZejgØëÕ ØŒ6Y@ÇÒÐ|aÁÛF0là•<ÈÓAãø}n¼I·È?0+^Ôg Z or+Ôµ+{ íg“€<,¥DV­Ç¾“ud&4öh ²IɃ¬ Å%ƒiçx“n‘ `V¼¨Ï´^……,ƒ}ƒÿBy§ ²@^$«ƒÖB!«–tÚBIN¤ Ù±Vœ¨Æ´ÒÔâDµ×;±ÁÂ.òŒŽ……,ÈEèõAk±MJdi‹Å%ƒiçx²Y¼xQŸ)h)¼É­Pÿծ젼S Y ƒ/’ÕAÛ4 ´¿žMè&Ã@r" ‚FÌ’'ª1-…4µ8QíõNì¤C'Æûm€Vå"ôú  † <£’YºÁ™°Þ´s¼I·È?мxQŸ)h)¼É­PÿÕ®Ü7·‰ë´D÷^ý¯DVm ·!u$ šÒ0¶ 7°Ô! ‚FÌ’'ª1-…4µ8QíõN°&—g‰Vå"ôú mñ¾¤¤äA֔ƙ°Þ´s¼I·È?мxQŸ)h)¼É­PÿS¹­‘²q¦»ïönXïVþz¸ó]Uyï;°ª½‰Þô›á,ŒúÉ:hñnüVŪ7ýCzÕ»zEVÕŒ¼fbd&UÐ’êiV×þ1ÆŠÖ“ôè>²H£ûø/ŸéŸÓ }îGÙ\^õ”éfÛÏ?_~/„|û‡Ëç_škÓÍmž×³uE¼'ãÉ+Íq9ñÊûÏo¦’ÆúL%öõ bÁÝüUn eH½!¯È9× {†X°„³51ñë€ÛöL}{_¡ï•LãHK¼¾wK€J9 ûáD9)kbBD m×û°ªÄ’É÷\is“¹\Óqt÷6•TÀ;ÉzݽÂzíñü¨K2'=uï¾ ¶öL»úÝz`²ëý[Âo•ž6•uŽ]¡kV-ô¼÷¡`®$“ÛÝûª‘×¢‚Oòåjj72ÆW€dhZÍí^¼|7ÊânM»åY0ii[PÑs½"'û3ôoVü‡æ&É+$Ò•ÐrHn†™ƒå»ã¿¡åDn'%©º…=-ÝýÀõ™m$_µ@XqÁ{OÖ\ÓéUi‰ªé™Ö·¥Ûßwb œ6É =צj»lÛÝ}BàJž©ï¦fSa¥Mz÷9€+röåóü¶=ÅÂhŒÓJ;MˆR^­FƒºõøAh*š«Ñý¨—œ]´á^ ìÍ&ªÉäIš+=’\Í$.Ж˜ìãLIRä˜ìƒ9™Ž‚ƒø«o…S ýiœ<2ìU+/§¿yCZx&8¬ÎÝUIŸ)k«Ýú`î?ïÉ!Òö$GTãY›þÊ–ƒPµyÆLÔ^íÌKé+ŽºWǸ±§R6>C=ÖàøR%î ã<¾byµäLzÃì{F²â;5ic,7·‡1Mný¸H?¹’•#ÂÜ13Ýì·äˆV@;ÑÌ–û¿:÷ÕýÓÕ\î,Ò8ÕÖ,Eƒˆ›]NAϨ`ÑAz`•1‹¯ÙìD3#]­hA²ß“ÎQÜfŠ£C适i§?0co¦Å+zðó¥ÊY¶ß¯Ïg0ß´ÂfóÍmòÿ‘:böÕ™žè”v8ís,*Mª×›|:—ûƒ–Ð÷‚ÎÌ›ÍIíuþA[ D:ªØZÔ[E2Õ ³ÎuÇĦcžW×ÈI17›ÒÕûüƒ›«ŽLY’¢Ÿ¨ÌÛ³vÒ¹{Ï—%* ¸Ä×fáÛœq”•yœÌ2Î,äß0dßÂøäê±O–3¹1:ßdè$Û!Rfks(øÎ†ÑZÞ{·nsÚ¢± Y ”m?!½aÓOFʳyJd›™I…537b;â/ý nä‚ÈFOóC{ÒÆ$g¶Ô‘V>Íóúøoâ¾òÒoZò7Ѱú¦ºÑ•þjTv%nR.\‰³0‚¸övW=8åøŠŽ«œ6bãlÛ9]¸0ºòá8RÆ&›þ}ÉS~GÊqäØ ðĹeá7+c{Cjô=5ê<´MW|›ÞY£œöAz•Öä¨i¯¢ý€öQ¶ã‚ëK[Óùo‚–RC“«½j9E®uTgó…VI¥½¿p¤VQËEòØÓyÃ'»,'÷[NÎL·²´¿|Vïò¯r¶3ãT±´÷TPùmïœÅ ^šë,Ulv@æ[\%íÌlü@F?è½9kÊ>A\úõf;þàëç›Ý…I/yÛÜŶ›ë%@2;ÌûÒ%uRy™yË… mråÞ¤’•ý›ñR“îb¨ás/ZéîŸZJêð¢¶.놽åy ŒU¿£´µÒ‹>)‰VtgŠÖ³pcìÁìâúÔóæY'N¶·¸jšõGv©Ö–v·™šÐ M<íÖ’<µ¦ã·h°'usé9¢&Jé=òýG˜wOJG7Ù¨£pd –÷t[u·òÛ~0[Ï,Wà,vV¢5ß[:rà¢"m³xfɱ³ÅäÍg!váGžXtÈkÉöÊ÷6©ÿ@JûΊWñ«9ÙNŒœÚêX:,̶ñ•N]:S¯[rÁ¼š»Íá»ùrAÀÍ—ŠÛqÀì{\8•4rYNfg&pUWw9J\ûH%ÄÚe§SéJ´qœ”)9ÛËÒ¬0|§½è[tÓf0:ÃÂÑþXÜ/]!oˆ&8tÛAô¤¥+·ß×2.×ÇÌ.v9û&¥³¬³ÄÚÌvGm²t­9:E ‚] óþ„4фž”é®[ »Ò3 ïÈ+o¨+’ŒxEþF# 3K,&–¸›õα–5›ÖÒÌ“Yœ#’¯I͵¤æH )ò7´Ð~Eûb‰_iÌr÷9Ï’#0ÌŽ]õ—Vmû/ósFÖÆ£tÇ­ØŽÎ=äÚãžÞ¯è±™m<—€Æ ÈÛXé¹J¨ãYñ—nt†g” I¿Îoû"}…Æ@jžÎÙšÎq¬«E¯h£=‰ŒnÍü¸¿U;úæùÙ‘^|·vÔÂmcxÉwåúU¶&Nž|VÖôo¾Ï¦Wôc+žMÓ´vÎÌIÆlz,¯éúq%'™EœÞöÅÌK]Ó# ç K϶¤ÑѰ[´¿Ð½ƒ‚JŽFzj¤zõâ—U~ièÅ‹_û¥éUšì+óg㘀±ðHú4ëá’àÐ;›§XÜ2•?¬‡Ö³y ËË.¹Ø¡‹ïg—\yŸ%€•,L_!«ï’~ò}îŸkg3MÝÝvùMç •¡ÿ.wädpžƒWû·2/lßÅñ¬öê­Hû?Ú^ýÝäÞsìhšM;ž¹¯f»ùô9òÔhhjN[ÞóœúróÇËc+ç0Ÿèø¹³¨Mk¶5ÿ£Ù„õ„›¤WµO?[¿œ±+Ž /á­ÖOÆÎ»fê ‡ÎØÑÏ8YÙâ§!8¯Fž:a~ãæ¶ßÎ3F·øÑj<ðDç3òÅó^ âÙgnÙW÷<U“WdþvÅôºÅ…§©~¸u8*«rŒ?èÓtïïAM'žjU–7Ž­/è™^_Ðs+½Z¡gꂪ͒Üè+%#X©( V†tñÜw6Vm“½bêü÷¡Ïç·Yïé·ßääè棃 píx<ÇŸì˜û_©}Ã׸®«oó}ò„E¿Ù~eJ+hc¯l¢Ð[êtɼ՞»ešU:³bŸ;é°àè-o#{åø$]æÑÛBl‡ýÈWv…W>³hé–¼ Œžâ‰—PžPÿ¶ðÈ‘oÅ{ªæ-Ëʤ`.`yd>oÝ=îv.ß:Wè,Ý!þõåñлG¯ü¸êV«?Ýn›»‹ì`,ÝÜJ¶f.Zd]ç®nù!­¹ -Õ\›å­“fáJp-­¯*¿wœíÕ#äξ$Ç“¿iÉß„–G£®J ïGγñ·àÜóW9/}7Në ?P¿‰9a銤pD7?ö›h±#Øã؆¨ðºžVV6›ÖŽ7¨òI[.úœýFiÊããû·ø~]»Ë ¤M¼‰ö r, ™!‹ÛðV\E¸´ÃÊÊ’# }f†C¾eñï…»Ê~ý> endobj 8010 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 8011 0 obj [ ] endobj 8008 0 obj << /Length 8009 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâS°gÆr`Ø@A7›`/2ÙCþ~Ô#õä¾¢X|´z¦mÀÓ¶¨"ëÉb=ÞÿñËß÷ÿümÿþáËößæŸ_vmÓÚvú³?ü}wù Ù7JN»Þ4r8üÙû¾{Þ?ï>ï>ÿ>ï„}ypþ1_1MøÛ·_wï§—ï¦ß|yøóøé{¹ÿÓø¿_öýÛøã§y¾Ã¾ïúÁ>ü{ú ¤ýøŸËO‡Áíþò»ý¯#ý˼‡ßÙ^·bIp<Ÿ//E/cL+õ^9ÂiÆíøï?v?³Àhz­„ê¤ÑãçÁê®5}/ÇÏšÿ¬zS'_^%Ô~èì^¶Â{‘·ÞuS%O$sMt€H¤-M´º£§ÊŠiÍ´ô.}S¥N¤U¦‰‰´¥ѧʊ«ÄÄã[œ*yû®Ë3Ñ"‘¶´#:ðTYÑ1ôÃ,¬†ÔŧJÝE+†Lè8@$Ò–vDž*':¬Ô¹Ðqš*ÚäAÇ DyÐALÕ Zˆî€†Õ‘Ó2¥”© =N•¼cîóLt€H¤-í¸õÞTŸ³˜yòlæ=~üº{ÿIhÕ¬Ú¯?¼˜ÆÓ¯ãrÍþÝÁ¶¿ðõ§ýïGûøáû¯¿ì†Æ ª3“-=‹FÌ‘ÑH;ÀBCØ:øžG4¢Úøg\é ÁÓ×óÅñ8ÿ χø½xÝ[¢‡¸ÇÏ0ðØJ8"r¾ïÀï° ÅX)¤ÌM ľaÄTÎÁ¦,à¾#x6¸£xwˆõ|ŠßQ÷€ JU‚B8\÷±£Ä{ZïÛ¼Ò:Ru0)Rj ÌM˜Ê „|†!À¼IÐ?C m@®— ¾7 7œX)Ô6lsUÓ9YíNB»BŠ'lUg1l¶ëó)‡KðîÌPWÑBè-AHUö뿊eŽÇØ·BšEúŒa{;€ ³Dо*¼óµ%a¾Šç%™oѧ çÄ^‡ÆàzOìAªëcР4%Ä.Þ ei€{Ì]RÌ]y}r(I÷#͉}KàEˆÊС´pŒüàÉ‘«»¬œóIEÙÎ%³Új$Ò6ž#†&Æý“ÕVÆo¿êÃ,h„G,Áëákñ•_‚6ŒÙèõdcw‡íµõ>îÙÓ¿ôÕâÚÂZ™ÁèŠðbgq°×NÁó×q”ÀÈ9ºFä FÌ"a½pl«Ò™~·+œs &‹ˆüžhó´/)^[fnÈ:O¸ .–{${gW×’ò "|zYBê§Ò2^Œ«t÷¡¸b­t7ÿêÆÁeÂS©šÐPÑN‡#†ã²EèÃWöî+ÕRÒ»é.;o*þ4YßôC븣'FæHç‘P˜} ØayòÝý#G„¿==Yæ|DØÄŒ…úöFDØE„ò+rÖð^£kD+ãr.ÊH°ã¤GÜfHàuƒÀ¡³}N@;ãû~.+í_Kož)ˆògâÞ}åõôæ¹VhŒZ/¥k¡Í]Vd 5¸ˆÃÑ•ŒBd„ÈÊ[;‹q>Uù‚*ʸ$ùº*•‰-™-Šƒ,|ˆ8Á+x>,H7ñÂGg^_ú™ ¤zï”Ë­¯ªÌá›Í”›ÅM†=˜ ‰@†ˆÃ F:#’’°'ð{jh~«]sé­WÂ@r¡›KXZ|+Žá·sº…ó•9VËÙªB…ÎWçW^ï|u‚aNZå—¼—H[a ¼¦p­- Ç,%e_…Ø ‡@†ñ™TO3=̨¬Y¤…q¤ÜÍUÜ4Ê]'FЇÉËá”ÒÈÛg0¾˜x椤”B˜8H’ŒŸÂLâ‹)¢ž,¢­Öúè<Æ7s'S*La9ú°Œ¡ÜcÊTåìx‘Õ¶$̤ b™J„#™9n'ÎÝá ÄnÓâñƒéÝýˆ0œÊZáþXÞ/‚m7fÇóREh t+œíÜ&O¯f6ÈsXÌ+: sJ‡•0>"2SªDh‘²Çò ê¨ ·Vg¥Ìf©ÕPüT¡æÔÓ³d s(ÓNA€ŒuEp)å BøaYî/á´-¾µƒ'´SŒ×¬èËT—¹ºV_¡qÖ7âò½ŽÙêï†ì¡ç ß.$.Dñ­]€·r8@ˆšª—’f[-ÂkÀ#!zi[äøn“qZ .ÝqH~Ó ¦1ÜŒÎV1@Á¶v†áˆÁë†aÍÃgp 1oað°ÄI*𔣳]‹­Àp7¤p7Þy¼‹ù, ðê†þÇ5Ty«]ÊžV’˜oàÈ,ýêŰZ¡ì]*Gô’€á¨½V º4¸×øBf3¢â‰eä‹Ö ¦D¼×9ИܺÖÞ¤´#ÓJy*Ÿ¥JW¸ ïfË&f¹»$š?$TÀ{×7Rº4‰#ˉëܾ£šìXi_³Š˜Öåøí]7g­ÍÈétøŽM*Ƶ¾öRÁŠ{¸Twç2d„r}€KLäQB=güÕ}j³] ´ä-þQ?+ î”võ»³ŠõЬìïŽèô]TíjGtªrðp²9å pÅÂÉͨkƒÆÄaWãÁ9gø=œœ>ŽÓ¾^Æ¢Ur^Ý-x¿H)‚{•äf¿»9_åå‹2} î7îFSÝý¤èþ)× w™ÒÞ¯NÈgîW'%¸öÐîõÊ|­nâêD÷§ÎÄ0xE>KDZìuZ®¬Jmå´sJhRs•7š8¢±]‘¾¢…]j¶–r-&¡,ÌqÏ#°=Ó\`!q_“ÉŽŒ^Y+2¬ÚÝ^ßùÖZÛÅäÏUh%è#w¡"n§–ÂUo ‹ð¥ð½F1fìàb,œ§ÂhÓF ÷Zmýò^ºb!¢ñÞ FžZRÇèk)âNc$Edt¥4Á}[¹÷%[ªYW)\?Þb»Y´éHë÷&läÅœ=Ê”ÃXo¡&DŸ•?/›¶ “ÁëªÿP"¹½^çòõ[îážd¼Žûm`ýÐ^»ÜZÉ'P¨¢ £À(ƱY³8Ø®e=Hàœð‹ËeÑ»ž#ÖgˈšÁžqþ\§ÿ§7kŽ¡¿G«¢èÆ¿ûçQzÂéð…ùÇ·ï„8óå`{–ƒŸIIH>.×k÷b\ÆbÅa§ðú½jOmC'¢´¶±Ë®ªA7€Çd×tËå»…‘ J5rp$ìÌ妱Ò]–ZzOŸà3“ôïd#Û—J»®ô_šm"ºËß<ÂïÎæÆÂ ?¡gæ3ÁÒˆ@ë˜åXÜ33ÆbÖ..J`$PÝá³4§¼QŒí¹ŸMŒ¹™„÷Ì\{âçâÀ ³ÍrʬÂÄé5aÊ€°Wf¼•ÍÅñMÛ´ÓÐ ,ÏMe— À4ã­C> endobj 8012 0 obj << /Type /Page /Parent 2 0 R /Contents 8020 0 R /Resources 8022 0 R /Annots 8023 0 R /MediaBox [0 0 595 842] >> endobj 8022 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8023 0 obj [ 8019 0 R ] endobj 8020 0 obj << /Length 8021 0 R /Filter /FlateDecode >> stream xœí=ËŽÜ8’÷üŠ<7Ðj‘”(X,àrÙ ìaÃæ0ØÃ³³Áx°Þ9Ìï2EåƒTPŒ`©¬’Ýè*'“ï`¼¿ýÇ×ÿ>þï?Ž¿}üúÇïîçǯ‡¶iu;ý9žþþzû4’Ó¯ƒéiOŽß~¾¾ŒÿÿyúÜÑýç)¦ÿñýï‡ß¦ÉÓ'_?þaüíŸGyüÏñ_=þé¿Ævã¾ðã`¬>ýò·é!…4ã?n;5þ~øã/Ç¿K0çqOÿÿU›^ŽkÎZÇÏKWqþ{Ûšlü¤×}7.QŒˆ~<ŽÿÿŸÃ_ÆÑ.Ëhl'Ä »¡Muçaåp´ƒ>J)ƒAƒ½¥ %r:Ã3ÐiE"ok¢í†øPä£7#蟶Ù¹ûœGÊ>°ñ?¦ÚÓiäìl>xp¤Æh÷ü=esšÄj5>®¶;ò]ï0ˆî|–jDky§y*÷Z̈@X:¯HämÍ]p8Ô¬+¯X÷g¤ãË·ÃoŸE§Ì‰È|û˸’3¥š~|·Û==ÿ¾;~ûóñßÚV}þ÷ã·¿lÓ[5ôi›ZÚW°ÅB-²Ã÷lG-Ø¢ÁHü<ݰa?òÖ‘ý|[>A-  „xðé¨ét>}¡¿8,[9Ÿ/x'ðîà³jÁ{„[±ê¥ÞÉk!æ•*<ÌS`1‚yà»ï*žˆJ€Göø–$€¯³ïÆ]‘×B)Œ¡`¨ˆÜ#<ŒW?V¼ûÎfÜ=/~Pà{T0¼TÄÙZ›û©3«6ó: Í0ÖgåHó(_äÝ Â~`Ìc‚+ˆì>VJNâ Á>0µ%A•©÷j‡Vg¼ZÓ-^`Þ~ ¼tø|Á·¡‚ Än粟g…¡”m=XL×N‹.ÄzBÞ¢k¤0§Õø$Ùø·ß5Ý´ì€Ç\jé¡'A& ?¡¡i'Ú]™àCÈy”ëWµ?_ðbÃðЦ§ç㌬ÕI ƒxøÁ[c0ªüäƒåôÀ{t¯+e¾àÄÃ#§ 7ÃÜê4‘óE\‘áaèH‡›à†åçÕ ûÍáÞ¾QÒÙG߉ñûÂo:8ùôû¡o­$ÞÖCœ0`„'>«H ¸YG>–®†!øMh>ef"}àWš&"ˆ8øpà5ØÀ_šÔàel4» Þ |'ðâYHa2‡ûÊ€fTÀ 1NP(‰lÆüPuƒðQgð4t&\ð娚¸ôœ¸S>¬'TF„ ~Ô/þ=ø4XTT§¥¶ö*6i∘`EAý¡@ñ<¢n€•„àY3Ï\Xç¡3k WsÑ«  Ñô>ÑçÉ%0q9dšÄN>/[ äàßÍV`A€¦÷výnØŒÚÁCÃKƒ¥L%I6@¨srE_nŠœ'§ªÂ©©Mcl«ïÁq:qÑÏÛ¹¶|AøBÕÝt²™6ƒœ’´¦ë¼§Ý½ºÕôê¼µä Ðð½èC Œ*¼AŒ€€ª0Ä3xs´Y=B_,z]ʇṪ† eEÌj”Új›t€%1jé Ì‹’aíee»†(eоf ú¸pUÊó¸ÖPZYéS+ùšˆÁù 8¸ íò¡£"ò®é̬³˜•—·íÅ{£ëÀs"<ÿ2‚7fTŽ$4KR4 9È 0§ŸãöæEŸ Ò@F $bÝù0s•S‹h=ˆ;‘C]Ò­.ÏÙs"žN½Õ+ tî òÙ3aK46Á¤#O u†¬¡9Íùã0NûÁß_‹…ã@à~Z‚î=¹Ë`n&ZÒE®+¸(0÷5B0‡ x;|V"s™±%Ô8™í%nË݇Wˆ°þ' èë:?_1Á'Ö뤦㕲ÑÝW\¿úù‚ƒý– 8„m¬9ŸðµåÅŸP|„F‘Áw‹sPq;Ñ„‹„jTw¯yZøîç`jÊfÁ>‘µˆZœ™}ð~|É’à e0óeX6 vcq–)ë!E û$=;¬æ ˆ;‹+ Â2¸át_L hóú}=£ž=ÁË6GEs$¿Ñ"<“É’Áq5Ã2V„ôbðhH–ƒmЗCÖ¥¨~YøßodŠB¡U@x¤—5]Váë™ÝoÝß#°J*0Á¾ O0ÇÑ~û³Hà7‰å­Ñ–§ƒJ0Çõp•öЊK@bºú"Â{ ø]NÖQ~€˜= æ­bü".Áû£ðóëÆ–ýf&‘Ü£“øgLr#[_|}dqÄYd)Ax]ä)ûJy€¶– ®T½ð.I5“îûPš16:ð´ÕìrÝ W†[6ÏYK(`1P”>‚Ž`ôG:êM‚(BD \¤¨Ò(ÆÄOWd–b \03j{JØv½³2ÎÿÖ1íQ§ƒfúÔµnÎënÛù“ïÝ7BXiŒ¸|«»¥»cü¾ûwwêvô{«`uêã­dü–½ÅÞÏñûáå—RñZŽ©îyÿÎX­¿ÛÄjµOÀO/-±Ä —Q"GF¥=Á"Ná Ë8V­q›I>Ñ;+±‚%™u#=dþ ÄÈ@õº§áº[¢áZûôuü$ á§ouw£t·s\h¸–K4\‹`ÒðÓ·ìÝ(ö~Ž 4ü’Õo§á¼8ÄsáqfdÎHBY±«j4o§[on=ÅKÅ$#d?c‰œ©á =‚@’î}‚Â!" p¦”«…åâ¡4qW—P—?’E8/·UÞ+Ú9÷?Ìq&„Dzøi"2 ÀÐFɈɑœ„9Ä•7Š ÖØ饞‚UȲx²#"î8TÝq@R–Å97]½H +-­÷CĦU¡s²>™®«Ò#A‘ל¬ôì³´„ ˆ4>\?JDð‚=ĸé”õS'Çâ’\¶XRˆÁØi…çM.E‰u)Éâ ·ÎAs$àqQ@À|€:'Ý/;L ¸”t€í}1#v¾ØÖv•=Æ Òtº9Šuw4Š­ eÊ„ ÛNdÖ3ú½RP•”þҢě.‘'ç¨ØmÝ ä3(átÒÛQ¬#Y©ÖŠru«QÏñ—²ÊC`ë0A»v˜@(jÁÐþ@Qz¼‰È, ÞL¤g~a—^ºœ n¢·÷˵³ßÈÍê,ÔÒΠ9ô^‹øö1¬£Y¨Kô!†ÆJñ–Ðh.³ˆi:¿´—«•6²ñ“Þ(e‘yZh4ñ ?O+ >ò’4dðöã,ìnqìnm.SH7›Y²na.½¶pnðhŸAØÏ¾Sžè ¸‚™ KßÒ·DÖŸŽp˜Î¥>KZ[y?'Ù9§¬F™Çá¡ãN¢‰0Í4#ˆ¥qfŽð¯„u{QPr…rz«7 ¯‘c(¦øðÓ–õˆ,Xgaõ×u¶e$ŠÍƒXI„­‡±ß*#”J æ‹§g7Ž„eì ,>uežz$alº® áÔŒ({°!W”2°nŒP ¦,[Q5ÝRAr×]{%ëà¹Àù+Þ,8$Ë!ì+êYñ2€6dÒïC÷Ó±ß~u$,Å%%o:_…‰oå°y”¡§˜K7@”öt ’Þú˼æ³*…‚LöÚaϸ9d¸„„¯ Z—Ð#ýsD(Šï ¢Àâ fpéæÅ8îwªyûj7 z¡¸s²äÜæ¾Žª¼ )ÒΑâJŠ"®±„4Z9¹6rÊÿa4d,I³– V¹›R÷ƒ¼"5ÍT æ–Ù™¦]*–­¡öiÁÒÛWÄhpf°Èxd?mé÷ëJÜ…§›åŽ_ˆÝ oò¨ìÝ‘ýgSAÌW \C¿æè;âà+ÒÞ«åÓåN°–CÞYK¿c*¶’²±„rX,✱acÙv(M™ Î,1p ®P%)Û VIÛf¢å1—[&Nƒ¡Â<ŽÐ÷sDçФH,4L!8'æQ‰.;¦fÅÔ˜ºËˆ wRO2-¥‡Æ>€xÛyÄ“$+ÃE°4g—~ê«õ`™çw‹Qœm¤‚pß_â»3ŠOòTÁö§Ið¨(“qçýñ;éÅ2ÅžáMò¢¶M–=S­ñ°BN?hRÊs ò”Í–™åÅR67ÇvµîNX"Æ3°¬&‰â¶AÚq‡ý xðQÒG%.ökßÿ¢Ugü‚DcP>+©,„#l¯'`%W¢ÚºvŸóèËø#Q‰=ºœá†‚C+_uB $œ¢©€¿@ÑwØo=AÄ.Á”•4[wÆ¿Ýgä©Þ¨™·ŠÊ{S»nGÐÍ) ±û_—B/h¢<‘Uíìvø”…±àÌÜ [ˆ?p^L˜µZå0™ÓjcÍ!¨8ˆ )EDÄræ[Þ`.Ù²ÑseŠ7'ØÿÖ³*³D~ Ÿ!x¼WÔ%Jy{§Ó¥ètFœ”zM§·óGé<IDž:#?k\ËÅ>LçñF¯|]&?BÌä˜nÐ}:¹Ò‹±b¢™Yˆ+‡fü™`µN‰ Â¥”9WÈfëüŸú¡Ó9ïBº©eAVŽ´TéûK:=Pl] £9¢ïu†×¢p LJŒ7‹SÏÛ÷Ê+’½†Pý½¶óß»)nŸ“|åNÖí´ôüEu½Gy"b)"m6"n{Z×]Üß ?ý°lû=–UÛ` ¯—‚9§u%2 Êàðç…ï3!4=Ÿm)™)¥³¾|óÖYÎuÀcàÍ*H¤Ã%·Í0{ëÎ Lm­ÔPŠ%æˆNï>¨N¬<×°oeßß§&¤¬¸ù%ã­fÁF`áÙf¸ðÂG„ŽÒ‰›(q؉µ˜0³qäLzn\ðŒN‹ÕnŽ7((B’ FÛ¼_JI»­Å};!÷ÛgïžAÇñ Xò‚Uךy1Ÿ!¤ý¶ÀmzZgñ8&wCA°ÖYæês MP?>Z%'€‘Ç]a:ÌN[qo§xNÌYŽ6­PT/ÛÏQs%2(ËMá–ÍšŽ'wʃXŽ, °.‘S˜õÐv§­õ£ÈpÚ*Z; ¶wC›ñaqÀˆp"#!Ìí¿gEìH½ºµ'PZÖv8Ê °æðäÇýî¢vNsD¨æÛàð åÔÙfþBÕyHg;âŸÒÎ…]¬9ìt¿\Ûœoèî>-ÔÒÎ<ô^‹øö1„Ñ^Á>ê3‡Rt³Ýu´~æ¬&&é†ÐiŽŽÒÞÌãn¨é¤ú€ºÐâ@ci4ªåD:„jžÚ¼j¯Ú:PW~â«JÏŸÇšô <k…÷ôízB9ŒjŽEÁH‘hagºt*ŸN³î£œ“2j38—'—"5Rº©”áÀ™Ãø ²I¬«*ìÁA—§DR0±¨UΨsêu`{XBâœ`/­GCxŠ•Q„pØd<´œÐÝt*CJtQÇ¥¯–þc× SØ®F¯=˜÷:ZÛ쓤Z²®úÜ|ó^"`ÆESúf)SîÄ}'{i”¿™'¿›ç2Ìs©ç †ÁCŒ»å®’åŽä`0Š Ë[}#'ˆ¡L¤Ø¯"ý„ ö;Ìÿ‚æ~“TRù)õKÆ«¸Šr;—] ×í\6‚=Ù¾ ­‚¬¶ç,¾‹ EƧ!.ød§’ŸB±áa•qvd—A8e ôj˜õæ;¸…Š*›»( ,’²”Ê9G¯—»qî\ý¼”k \g‚®%°ôû‹¸H¥—åÂÈf_ G°ŽŽ›aw÷­<‚ŠHáC½«f½,é+Ôö]A8,EФ€#J¼NÑ€%¡æÓྂ†p Ñ^ACÛãx¿º'oóãË¿ecL{ÔÃéÇ „™>íŽZÏnéó'ߺo„°ÒqùVw7Jw;Çø}÷ïöÔíxß»·Ö›ãôÉØçn%çoÙ»Qìý¿^~)¦¸;¿ Ý^’a‚D›7õ3f6d©aðÖ ¿ÓJÆÇ1503PYzÞ‡yÕVë~þ0ÛRÔ*³aiáaéè˜ëeÀ‹ ÐW}ýZ¯œìzÕÍèU¹5”¬Ù„|QY0”ò·oÃz¿ÖñÝPœ€çÐEIÇæ^{X~·E_? 3þEý3¦“Î Ï Ý«á^ºWfIºïZ_ºïÚPºï.òü çÔâØ¹…ŽÖZ°å38Ư ûöùîôܸ Ïî§…÷¶8@]êcÀ>p‹ ÜWö‘àý´à-´¯øP`§á>T;…ß{su^º™“‹K ŒÜúHx|›mE|iÚ‹TUsV©V_wEî~Ñ0ô°…½'œÈEÃR([ ¼EY<[å—„óÕ"ã|{ð|÷“_=yãͺ´[o=V˜õ—ÿpº!`¸‚WÀ&4%œ¢ά½Îxżo• Â<‘€tÕ÷4\мì´|:‘«J¥/Ÿ‰¢´”UׂlXfƒ±, c9œ™â?+]7­PPsT‡ÊÉGΦÜé#ñ}6ðžAŒ¹…šP®¶#—Qô–-¬ß¡@¬³c…—ǿڈv’pn0ÿCÑ‚î¯võÕö9Òþ;zµ¼<ÓŽ¶ž“CÎÄ5ãßãÏ©Œãô÷ãû¤¯6ŒñúEPÑ®ëõTõQŒÛXJ…o…ž¼UŽê¢²wf­½œ<ÇvÍt27-Óã‘C3,gXZ¦ Uª‘ÖsPp.y}£'Sñµeç1` ö™â ÙžÃ}ÀYmz<·Ÿ¼‚ßuîs ;ü õqÎ K-Ú‡3¬ãú¸ÃìÝ­íü2 îô»ìŰzÛ®"/ Üó]êC€œŽºÁÈ­Ã'û ½ÕðFXmB`xûHø^(§B ¹hL«qò¹I']/M ‘¸)èô…“2¿þáSQ endstream endobj 8021 0 obj 5608 endobj 8025 0 obj << /Type /Annot /Subtype /Link /Rect [186.719999 509.780000 293.279999 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership >> endobj 8024 0 obj << /Type /Page /Parent 2 0 R /Contents 8026 0 R /Resources 8028 0 R /Annots 8029 0 R /MediaBox [0 0 595 842] >> endobj 8028 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8029 0 obj [ 8025 0 R ] endobj 8026 0 obj << /Length 8027 0 R /Filter /FlateDecode >> stream xœí]I㸾ûWø Õâ* L× ‡…. ‡AAO&Á`zÊò÷#Y’ËEú£ÄU”­* Ë-YÔãÛùòóŸ¿þãø¯ßŸ¾þçømüûðõPWµ¬‡ŸcÿûéòU£ÃÇF‰Š¶ýÏñÛ÷ÃÛñíðrxéþ};yzpüÓÝœ^1 øû·ßŸ‡—†+_þÚ}úß‘ÿÒýï—ãïþü4Ž×áûAµ²ÿðëðPBU÷ŸËOýÍþö‡ãoê4nÿï'©$ç\Áñv~”œ~/E/ë®U y$„vpŠÿýçáçn´3UË i$oêÅ£6´¶i?¶<²ùú ÆÜ– ERÝ4£ t‚ˆ„MÔ¼±U)Îk¨à=z¥h÷¹aãËÔ%;M]4ÁHG ¦%m$²v‘ ™ÄÀ#E¥£?7¦¸9Î|)…=ÿňöì2³‰p¤¨´u,ZL#£P4‘hÑC‡p¤¨´jPÏ­ù4R0 ›œõ‘ ™M´€#ùšjÕuš¤¬Uè4§¡BñÕ *â ¾‡ˆ„Mm¼1ÔK7޾»qo–¿¼>?ÎTïµ¾þÜArr}‡?¯ÝtÅñSïÎuäýéøÇº&üOÇ×_m%ZÖˆÁWž»ÃºSwZøžÆ‚B@$|†Âgà<;ŒÁ;"æ{0Þ(ÆuÜ™úp•Ç|,¼ƒùà9*ïÀg,PGÅ5æ^†enuØ,<Šq j¼±ÇÓ§×Nß'×ÞªýøV<‡ð´^Ÿ€éÀ_ÉaT•jkIÅ%ªõÆ+>@yqçétGTŒ*òñ™AÅËŠ¥Ž£Ñø `ùûWô Ã7šª6Øadõ~¡Ñ/`ˆàüˆ1*…`T³€ Ðõx:úû9] u%›Ó—ßçWkï£Oú…g¢š8 “?åHÒÊ4ê3ª’ŒëdÔØôú8g2“ºêkzåPÞ !Z[±ˆ¬OððXhæ¨ÃÌ1h· `¢it`¯YxÇ…o’PË ‰!0QÌÆ€Ir,dhü:»¤5Œ7šú ÐÆ µ$k¤®& žzD²z^ÁÕD|tñxØ‡ŠŸ0}Jiœ@(k7$ ƒ†‡7€†ï‹ªßMàc4‹Œµ(Ö.ká*ƒ/À˜ùrÅK…JpùAÒ²è,I‰&8ÞmB—Âpí ¤ë"bxœBvÀ´õÖ… ¤H¿Î{:v—J¨”°œéoqRBéƒ7x-0D5ˆ˜`{¿ƒ½ù/饱¦2DÈ"Ó8ˆàã$:¨(¬¶}"†²ŒºšZGÑf[©£§BLÙF°“(.Q:>fß²Ž 'ÈvvjóË%/aÿeÖ‰7BXѺˆäJ’g2šË)o56Î2l„E¹@½` Ýâ·6)FTÇ ùØé¸Q »V¨¯ãpÓßR7_ËÕ4$³Ä êrIY`-ñâc¹ƒåpU“O±,פ\ºK¢»Qk1m6ÆËºiH£áµÌpsÃ¥'¤Vƒáé_8¤6Ï%É)4®sXÍ'Fz€ ‘Ì ÿk/á(&ƒ¼•" &š‰pÁ¼“« ëYØJ-²X@­f%1Q9 Skto§^™g²;œ-ð±÷r(3/&Àv·å:.iäUŒ¦Ó|`?ãXîBm)8ƒ$5­-æ„\×¢%¢”F¥Q:> Æßóó¥åç ˆhšúà d”Lêmfâï,·íœù­¥EBOhfZÚhfæ¼Îl¤æy…TUÎkj¬0ï#ŸaÊ[ÄŠåè¡=iƦ’ö{ƒGŒjíR;¬ý#\S7e®°XÃtµ¸!-Nð/ÏZû`‡q-½•-OÉÕ9OÉëcÈ‚°å©X— Ceùô¯x) µºV9n“KiŽ 8dݱË0o°7¤b\ ò‰OÀx1i;i.^M”‰¦‘‡å¥1HŒÏy 3`˜ µ+,í¹š±ìzâ`<¶È9‹?Û‹?.ÞSxñ‡{ñÇÅ\97®¸ï"I4RíE&—j~¥5Âr¥¥F——X˜)Œ$ÃsÈÄĨäò¡røDÝIb/¼‰Û5§P“.ݾDQüBµò˜þ>iæ$[c8¤Q÷ò„Æ òœ‰Nc™¾Ü|ÎÅâVĘ yèÔtÄ¡DfôØÿÔÁ4Öù ¦…mq¹±áDýΉٔE%cð˜£YâjîÕGóÕÀʰD¥ ²Þ¼´\ø< œË6pQ³øi¶'€'lÒ>huÈ2•ã ˜Œå³kw\±a Ï,Z´{ÔQ^š‚K¡ÿxØÊpe‘¶ åŒhê‚rÄŠåpÞºV–fÞE¾M½t6œƒ(óÌž£O ÝV= ¿„à—~=|MvŽ’²„R–)¢eYÈ8ŒêàŠ/·×Q&lIXúTÈ„Wgpì$õp‘H¸V@z“á{4sé†eq{£tÆP^õWúJ©M‡93müTкÚ'阱¶¤!â£Ö/³Zá.NoY@-v®ðÝ+ʧ–`I¨e©¶¹±£!“̘ޯUõT°gñ3±Er0k³™©(þß‚­Gàl,k#ŒC›u늨Älk+J‡(|”’y‡€å-ž^™ZƒÇpž*³è¸TΤ]鮼ã{J{ÓJÝà”Úž-L¥a¦ÌžQ1–I]PpCE4fÄ&Êæ³³qs‚Š>0ÌfÙ‘…”{¸‘åû\Û»$ÍŸ§/¿0/i’›ëøˆ±õKP¡\¦ÍJ·x¢óm÷«/Züì}æIM%Þ¾dyhÜbº°oïöʶ»Å…z|FÕÒž›Ýp4®{³œtìÀ#:_»7I{Ú˜Oɰ–S§FÁAæ(›B[°PrúÇZ+€ÌékEï°½E̮̠î¾LÍ»ì=C~˜sˆè4¾ñ š]$ƒJj§ŽýµNär©¨ßvWëZç.çqº†ål+â~ ªœiþ¢('*l›C löϳHÓ£¿È²ìÅ€¨›EÔf%Ý9VjöÊ'ʳ‰¾ä#¤×©q³OÛ{ ï<Ã÷àíîq+7lO¦¸Í¾‡âà ԖMú}bª¸©Ž6s7*à–fø …T°4‰?ºCàÃ!––s8˦x4‘QjÕtLÃ܇ñ‹·¾€³Ã2³Kí.µR›CfÚNtge†E[Ð.€‡ŸKÍ —Z4äêa_±laà#ÝËã.÷÷'÷nÖbg䪺‘NÍÌ8Âc›$³\ß§í"Ç2¯å;þÍ÷ÁY^w{Üaù¸\5Ìv9\v{u¿Ç·N»uÊ«büóí»Ó™®ÇžX5¥õÑY«ä‘t½vìrKduâ#«'_x¬3’²’×å¿å•¼´©½‰cÀbsåÎ@ Æ*Ú^Ý´YˆJÕ‰tí= >ÓÂgþlhEköñlâ/p´A]^y„ß%äÊ ŸÑ3£˜]»CÐ> endobj 8035 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8036 0 obj [ ] endobj 8033 0 obj << /Length 8034 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`4|“‚3=Ýö°@cÈ!È!˜Í&XdéÝÃþýÐ&ÛÉeiZr«˜ö˜&Y¬úêIŠþø×¯ÿlþý{óñáëÿšoñïÃ× k™aá§Ùþ~8~C¸VŠðÒ:ÝŠnûÓ|û¾ym^7Ï›gÿï놛]ÇøÇ7¾MüýÛ¯›aòMxçëÃþÕh~ðÿû¥ùû?üŸŸâxÛ|߸Îl_ü7¼à‚ çÿsüjÛøŸÍßþÔüêIp»q·ÿ~0ÎmM¯û®|÷{ÜMæßѶ¢á\x:µgÇoÿÚüìGÛ“ÑvŠsk”eêÇóãšÎ¿Á…VƒQ‹»p¬¼ ë¸-1P ˆg®3eGÆj’\Úm“—ÄV Ú9á_[¦,Þ¸Ýâµ¶Ù|ŒCå „kQJ²ž"ž·´ 3C=ÑVqÐÖ×DÇÏ/›Ož€®yùÙ“±3oáÏË÷0͇­Ê:ßúSógoãÌ_š—_6]«ö0´ˆµ0»kQ­Õ½þ öqÓGô±õ‘»6BѦC kwïõQaÓJ¾k8šçi×âZ%¸ÛÎuhy@-œÃÑ Õ\ÚDkìn¸C žG@îÀ>R"ðÐâÝ]`ÛQ ƒ}w_<ÀóàÚmé¸*¶ƒ«ñ° xƒ„í“)ŒÜ ?¶e´ú ÔáǸx)?ÅìE¦ú-xb» ”ÀQ>Áãðúx×ï‚IĬP"á–â´éQ" œoÐ0”=æÞZñG1û$lÁìÃÄö¹5„IŸh,0ç­VæÄ’ài¸Þ2Äë“Fa_ŽÌ'Œ ¥”`/ôr°%8 å&û,€ÊKQxñ46¼¾¡tŠ @~M?ãcÀSG3ä-öXt}9ò‡Vaз¨ªOÑlL4šx´Ëu¸…õ ú¢„—¢xRÜg}Ì‚ÁBa@B b† ˰¤XiæàU  Ê‚¯"„¡wZÕË!úü¨5ÁÃñÏý÷9p¥ˆ}.üŠN©“ªç”$L°1C[Mqº‚®Ë'4üè€hsõp%¦ÅJÌèxôp•˜{‰‰ð…àHŠ %‘£Mp89Oôà4eÊ c¾š¹’Úêèξy§è5ô`Q_`ËgÔ!p¦EÀ> RÀ lQpžÇéT³Šœ·Rr^Ö¤GïMÛ'ÈŸÊÁA9À>XÞ#WŒÄÒõ9Úàz˜€-x4ß”‚àQa劊C \ž'±RŒ$l¡ m5Qá8w¨PXéžæ\ ¤šñÚêÈ^îµû­/é1.= Ë[fl0z Þ&<^ŽÈðzŠm^ ·*+F0{ËÚcØ_ÈGc«Ÿà6´íØöÄ„£¯„Å,nÁ«Ø@™$¬1Å‚c€×Cˆö0m σcŽG8šU;ÇœB?ºû= ½ gÇEõTv-ס·Z®——xÔi-«š Ç„Øb½Z‚ç)ºÒ»´BFŽRš=–#ó”8€b¹ªÆ§NdXùÕ*Òjx=sæ[=½ß>°ÂW½¿&Å~kÆyÜœ÷ ¥T8 v'0†sÌš:,»QÆUe‰# l» :\Së´ËÑ:=½%±û‚}εZŠ>bTlqQ?¼L¯ž ë¥îE¨ùPFKÐFÜUìr‹bíøê¿Kì30•,Wâ4 ¦ cs[H\÷ºyô!)¾ÐgÑÎ gÌk‰c®jûÉÞruæ”Ò*³ržµW4ã8^À>×Õ)5KJ”CñýwV#Ñ8—}WÑ—9{D«§ùñDå`7°w«æÃ ¥x·9£ {Þ„´±|fì%jaŸâÃ8Àˆ/[Å àZbªqŸŠQ×òtV¼†:ôt|\ïo~*Qžì¨÷Œ„a‚÷,TYÅx}xÝãÉ௯6ß~'g=‘—ò|ek½eÏêÍ9C›Ç.¶0½êlYÝøùì÷µï&Ù|ª>ë¾Ír$$‡‹m Ž8'W—út¬× ‘SÁɈk¯^˜G•[*y)ëÐcrÎûa{G©c%,!¥æQô!’í"TCë¹³š9®ÔPâÕˆÄ::ãxŽÎP<4åÌ:![æÉŠ­)ë©(yn"‚º½µ#<=q{¬'DRع·"5+“Š]À«¢-÷¶ËS6®™³7šó šµ.Å» ü×Ìɶ¨Ÿy)sR³l *¡OØkPN*¬¹RéÓÚ„ýÛŸåš{LY“¡›‰{KðêpNVVÏ(ú|gÙÀœ£Òù¯9Kaî‘}—³DòÜ3–V"³Å•7žbbìgð®<¡*‚³nɦ[”9Ë4ãlY ÔóXDÛœ}¥Õ:­¾—pc:i€‚òJÏH‹±{fí·áÒ¦°­©XiÕÝu¬Ãû¹ÁŒâMÊ®tµó¶8ÿÅÙgEooÏx®¨Š}2,g'h¡÷Q*°”û®)wúSž¼¬e%a‡ˆñWſȹå©ìm»«ý/mÿ ßAK¨;Ì@kç¡g*gG½fMϘœýÅ÷sžhÎù|Ud»œ]ªš5rË.®æ×¡G\ü¼Å9é¯÷ûT;’ˆdñJñ”¬Œ'NÙPÎß,26¢DæsFâÜO'Y•õÌÖ2wun~ÇÅ -sG0ñ¬ü{»™©Ž>›Úû~ Í©3‰“S•,ñU.åUóžîâwzŸÏÍò Í{(•h\‰£œü¦x´²ÙÍ"Ÿ.¨vOý\üQ‹"ïõfù9ß¹:ŒMŠ+šc=9¸f7Ñnèu¯cQÞdú®rjîÖ±³]Ên‹ëÔ鬘§èé1Šíˆé׋¾9k´z¨f¶e¸†ªV…†#¸¥­ XšVpwV5Õå$ôÁáQ‡Ÿ0½78#Fž®uë1+HŽë7Òúчn¥pü´O°Vœ·Z™íJCŽÇ€èˆh>:EÊ~Àµþ Üô§Áòdýe §ÉáÑåó§yDòâg|0 ÆYk,?G<Ès¦E=V3gœí¿äSŒ= _‚­Eófõ”žÄ¡b8ˆŠœÛ}g"$ <@™ñ)åp+áð¥À¤â\ò¢Ì3VN¸.~…ÇË),'öa&«qf™EP”Äih8ÆÀ$ܧ›8©Wæ ^ËŠÆbÿ=¬øÙÒýßEo®ø½Eü𭉫ù¤™O‰e¿`óy€áúƒÄøxÙ¨ðjh$¦ _Ü»Hó)à<¸Eâ­,Š´ñJ _3ž¸ Ó†%‡Í<”‚Äx›±.`ªÅÑV‰ÿm^½…ðÚ¿ý@üóí{Âd m ;ؚ礵Iv5SÎ4>9g¥dÇM¨‰4rê6VŒiM?ìTí ‡b¶µýjB›=Ó”GÊVt½:Cð†Z·&dÂ}àœ›ÇÁ>ì€cE+¼ØÅqŸÏp´ ŠÇï|Ÿ ªáάð õ‰Ùú¹ŽÖa>­O”Ø”µGÚv ºík¡¹•6ÿ4Ñ»ŸëC@H4“$˜:æì¤ ñ.¡LjÁxƒ}– …+t]ÈE¢sÌ´|[®:…dôç&† Š`Þ¡ ghž7ÿðØR˜ endstream endobj 8034 0 obj 2795 endobj 8038 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 340.819999 534.240000 358.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 8037 0 obj << /Type /Page /Parent 2 0 R /Contents 8039 0 R /Resources 8041 0 R /Annots 8042 0 R /MediaBox [0 0 595 842] >> endobj 8041 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1549 1549 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8042 0 obj [ 8038 0 R ] endobj 8039 0 obj << /Length 8040 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ%Q@°€=cÈ!À`Èa‘CàÍn°X/2ÙCþ~Ô-ªd¤X"ÙêÙ€§ÝQdÕWVÉyþgõËÕLJçÿTßÌχç]S7m3þ©ö?œÁu-øø±ÓªæýþOõíûîµzÝ=힆_w¬= AúÝÿû¡ÕZw\4Ž×ã£ìð÷üQô²á›–5ZWŒñaœj Çÿµûyèí8ŒZKÁDÇ•>÷­ì¥5>wÂü™õ¦Ž¯júVW}×VJu΋œùÎëŠ-ìˆ).“tt[65ÖÈÎßUJv0Õ›©÷Íb*öi¨È:-ñu[65ÃOWu/ëöl˜-s‡ÑñF°Ã4¹V 'zìj)Ÿ`*MGû±eS3¤÷t•R¸hÛQ1饒pìj1{™ˆû±eS›Øátõ”Äñ“!{õ<øùe÷ñ+“BïíöËÏÃHÆüñ2LWUqe ¯^~ªþÜ4œÿP½üºëkÕ‹NÞ‚ia¨…IØò µˆøLGßÓ|-°EÀ–¯pl-| ¶HL {ƒÔñÌSΚCºaþˆ*)ŠiÍq ¤g>#⿼ 2›]å C¼`* Œr ^àØ0bA2<<-ê'Ò{BÚ.*”ì*ø€ A‘aÒCÅÌ  xLP#xx¦ 3S GàØ8 þµ ²P}s-1Oà{<ê c ›QÈ-®£.Cù¾ÛÔô"5÷=«é#,$„)½G0è1`à3‹÷ç¤ê“LÊ…ïÁ-Š@kðz›‚*]‡qáûÖm-Xx-¨ðذlâ–5¯Þ0­!ç°V]ÇêmRÛÜ‚E«7Èá;v N°Hìàõ!¤äiÁ+>üÊ:ƒ»Ø4`¸ùº¨!ïDCN Nœ·`lSÆË”1^í߯2>Á¢˜2¾yð‹a« !{ŸJ¿£^ǪJˆã[“*c+3‡VoŠuS¬Žb=Áâæþê#i(­” Á3õ˜¬Úñ¢+}Ì…»4s€©SÒPè)”¼…ß¼’±•b” æA©õ䄱œá`õ æI®67g‘›ƒùxÇnÎ,Öìæ¬x5úK1¤œB¼[)FÙR ©yxÞ›šö­Fßb)Æ,n®¦Isð= ›æ#¬fþŠ3+Ø$–4ª™‚̉Wo8ÕOYQàŒ_›ŠVHNe3J©KrèZ÷MË•Ëì®nKµsyz¶·~wf(¨jÁ5»€A¨¬åøÈY‹‚-½‡5ö:Ô i° p'x^¸÷ÖÙÌ ­µ;qzµççyÓÙüg¹ó^:ˆ}!¨AbaÚ˜¸ãÓP(/³0I^K“q†8ðc’gq˜£àÔ™(–²²&=sÜ©·%.ŒááB à%’ c¼¶p†&ƒ"ðˆì˜œÅ†©Ëåªi)°vîŽÕæ«1\Èc;Sš“WÚµá\À¬œo= ñí’¢WWVð,"$ÐŽpxÔi&XÎðˆ&=XäƒgD /Œ¦‚—”•} _'S”l«WõªWZV¼A"©wáÆ‡—Ý)ÍsáxŒZ¡ÁÙc+j†Å.J ©ÇœKä)lr"CB œ¸­êí±oÁ“dÈ蔃 ǬRð o›Žp²#R¶Y‡ÆlNÚ%4nR’yÆïºEÅxTxâx6ñÇùšïì¯ß*V?ñZzÏ]E•²ì8rf³êÁÓ ª-̾¹^¢¯cÒ´ð ã®25íÔò vÿyòûŠÆz¦Qh@Ùíš'Ï6xÏÞ?=?SíédÁÐ"<p9ÛÁ-¶|ñŸSë÷ÌRû1Jˆr%¤Ԝۡ1އ•:asJ98 )iîö½l„^ä–8ÐJª±×{2YNçY–N±5<¾â-g^LÙÆ$ž”eÒ•zÚh)B…ÌqUb¸”ÆR,uÇàž x«¾óÇy1 tn0±VY¼ŠHiÍ(½¥Xß…)”(2%ð3ã¼Ìù+EÒÄŠ–`±“,ß—„ön¶ÌÄKs‹ÇMlwƒ9Ts~ãÁ¶"ôH?2çúEIKK<Ƥ»AŠÅêz΂ L‘Ìãå5ôÌÔŸH´YúµZz.˜ çÂU|1[=æ_pzŸ±àVјšéù±>J.ñáÝIóýÈ+`Oò“—œêL"z3Jˆœ¹M¹El…âù,¸Ë¸î»)v»U`w œÏˆâ>@Ðßñéà9〦ÎìÌ¡‹Àl’(AÒŠÛÛ ¸ÀúQÞÞ>'eÔ{ÙßG¾C>wÉ>¿šÌub([SR”IÖ O'ÕÀ¹P&H™ó¾Ò{-—ä?×f7i¢¶Ê\áy 2ø«áÊ\Ï"`IÀ0I á{“Á€ä®?t{ Ÿ´a‰_lD 3ÑÊsÄ{³îšµ'“ »#;Þ»[w"JËÖ2k®‰OÊ;Qiösy¾p¢ÚáGœ/–àÃã%SB|ôÍ^i’Õ,ûºiÁ¨4}PÛ•K”öÇ›‚q¶$‚7½ˆÈ“õÔöt·¤çj“ž²¡™'éIQu)î8É|°Ð’´k™£óŠºýlYÇg¿zvÊβõœ‹w׿¿†šµ¥np¨‡äÒ÷»:KG/ߨÕv1UšI®ÒK[Ü€ÃìÁB˜}þ‰·¤:Î$:8Óó“x1 ŸX좤ˆ3ø(… \JÁxLeV 0H »§hÖ> H´ÎÚ'òž¯…"ªdrŸÏuä9ØÆof±ŽÅ죱×òÑ€O‰ÃÌΦ+db|ƒõyžíÝ*¥Jˆ—¥ld3¬jN¬ÚSü@pQïq³¯¾üæ·Ýs&f! >vâ5¾óžT«l˜öóçGÒ³ó/ö”Ç*0îÜÁbŠ è–œ;¡˜ ‘[–éhšõíZ]PÎI*JÊZC¾¨åæ;³ñ©pA¢çàˆ›Ï+ XÒûòÆ cj‰ð)#à‘Š_RžÎÿbJ@ê9Pç·JHËvdZà`VsëvÚšçèØYÁÛ¾yÓoÅ©|Ã;,(—„y®]Øá¾dp@£çZÈÐ|Šp˜5ဿH–X1žc‘7Ã÷÷î?õ¤íà¼11~)X”„£GWƒÒ¸j`ÂÕР ÆŽE5Ì?&¾_vO§ÃÁÔÆ|b$dËÓG€/•„«?=¶_XŽ%•p5«Ùxx¦¸`ó‡26¬_ðÝå8ÅJ¹k<ÞÖLkÏ=ñx>xððØ0uð{°m‚½áË{=cÃf¤ëÑ"7ŠO¿ï¦ñૉ“òñ>¹¥0·-j!ܲfrŸÚ›§«g Êjó¬Ê{VŠJ Eq î2Jq+ä‚g¦[‹¯¶÷Ì”"ÏxÔ¸âÍ£…ðº–à?aÛæÁ¥7¬½ öcŒBºág8ÖØ`Taþ$‹||JÜÓÍóÊÊS·PÖ8N»rŸ˜«ãMÕX§Ý\G¯Ú†¨Hès£k|Îv‘-‚»Ep‰Û¯¸í%ŒÖtNeÞs×g\k‘d_xíÒ(¢rÈ×üš~J@ɪèû‰XK˜Ù^Zãñ¸çxON²½¡aÊI¦/å<ʸ{výQX%L™Àª»ñgc'šòž¿\h ”œ¢¬8‚âñìp´÷FØ$—æZ‹‚ÊBLu쇷æ‡ôõx+;d§Â¼ÛÔ§§E`Þß±ú<Á‚’ À¤ÇK ¼0&„ô$!4ÅïR}RÒU‚’.•¶ÇþoÒT'‡\Àç=¬Yð¨ÍŠ¢Œ9é§ð\Z‹ËüNbâä⚃*³%1 (áiŠæÂA<Š„Ï`c‹]Op ¶H¼À‰¬‰Y9 T‚‡9¼9t¾‚l®Þ¡;ÁBRòÇ”\ýæ‚yZÒÖ,ÝÞi*éd(u¼cds2Š9аƒÇÓ²f·Óãë´u¸úÐßÜ’[à Cܱ[p„Eb·¯kOË}·bXq„áÜī׺ö¿`~|ûujÆÙyO^4{ Šn+6Lãêû¬­™âJ4SàÂÔ.´mÝ^O"÷²)ã0‡wugoÌ™Ó]iNˆš÷WoøQªnǤ´ kïÑð™>3£ã5oÄåéáŸao#ÜÏ¿y„¿k64_™áWôŒ)*¸ÖÂÐ< ˜ãž1‹™»ÛA nÿ™+Ö¹müÑ(ëqíBLP1Šƒ®cÊ>"Y0Gù.­!oðŽùB¡ ]–"Q릭Ùþ¯KH yíÅDççj?¥´ ÕÓîÿ®’ç endstream endobj 8040 0 obj 4000 endobj 8044 0 obj [569 /XYZ 40.7999999 473.299999 0] endobj 8045 0 obj [569 /XYZ 40.7999999 473.299999 0] endobj 8046 0 obj << /Type /Annot /Subtype /Link /Rect [288.479999 187.219999 398.879999 194.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 >> endobj 8047 0 obj << /Type /Annot /Subtype /Link /Rect [178.079999 168.979999 256.799999 176.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 8043 0 obj << /Type /Page /Parent 2 0 R /Contents 8048 0 R /Resources 8050 0 R /Annots 8051 0 R /MediaBox [0 0 595 842] >> endobj 8050 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1549 1549 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8051 0 obj [ 8046 0 R 8047 0 R ] endobj 8048 0 obj << /Length 8049 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘ÅE ¼ÌÈ!€a9 r<™ƒñ Îò÷#µX]Õ¤>.O$¥êR7à.·Zùö÷ø–7þôó¿~?¿yÿé?ç/æçûO§¶iûvþ:OßßÝþ‚«Fðùã º†ëéëüåëéÛùÛéãéãøï·ëŸn4?Æ‹—WÌüýËo§7óËOóo>½ÿëøég~þËø¿_Î?þ}üñ“yÞô_OJ÷Ó‡_çŒ3®ÆÿÜ~š.þûô·?œ— žž;ýû]¯ÛV ¾jßžoeOß··¢—¿éyßÊ3c|\g7‚ã¿ÿ<ý<>íy’‚‰wrü¬{9´R|ü<óõ¦O¯}ÖCîTë¼ÈÙoÜ£ØÚiÙåyд"¶nk¬•ƒÿQ–Œ ¢‘l¶© ¼˜\ 1ô‚µ:õôU[»€?*''Áç­K1¬…âåQ«Ñ1ôy8áiElÝÖ :<¢r‚Ð#[MÛìõê^µöA²ò<èiElÝÖ. wõ1‹ÒâW¥õÍsã»Ï§7?0)Ô¤£?ÿ<®äIÑÏ?>ÛíÎßMÊ‹©óçŸÎl[ÎÿtþüËI7C7[æ CW˜„WºÒjx凧+ß!U|ß]^Ï{tEôðŠ€Oû¯|Ÿ+ _qÒÂ+®_‘]Ö÷„h,UtRªà#½Xd1Àíacп…ÛƒlÇ ùµô¯ ߯0HæøŠaâ¤bè`¦Á+À¤äÁ¾bQ( Œm(8C§¦Q.c Cs-Ì÷˜307„¹Ä0 (eŠÚ‚;%©x€T…´GnÀ+Ëh(8„›¡ø*80q˜9ë̬µî×̹!‹Í͉U/#ð=fUl¯To‡‘É|sXc“²¦Y0ŒNo ³ Å¬Š÷ý. (ê@dˆPć˜ö]Áû¹c1}%‹ÍE‡GLgõFI^•®ÈªJ—ñiv0S|8DÔ*% ^ÞîEÔ•,°&嘥±…‡Å ~v|±e0Td!Ù?¦èPò1, •"¾çžEÇ•,6·n(+OÔîÇ™=vvO1™ÃµybÆE‚n/ˆ¼¢Pbœ`Üc¡„) ërìjb;ùmEÈsÞ÷!Œ}¸ÄÁgÜ#y+ÛñÃÅú³¨QÒmÏ»Û ÌèU6†ºFpÅ^þéL#ÒÞ¼lä¼CÇþSž×ÌHíÎÔ"ÛM ˆôº>scM'ûé1) °Æð{1Hâ×jüß`µÎZ!\=〰fCØÄ¤&ö-FUÝ<ƒ@!༭xÚÆöP\’‰b) ¥è¡iÏÃ0îãblÆ/—®W´½Ö@Qðñäç`&‡”]Écª1¥œ[JJùŽYbžÄÐ 'i ƒÜ¶éöBv³6$°w)Yr0šKÕ ÚË¡]Y á*Øx Šßç`‰"6R`ã€"ÌùŽÀÆ»qÈ4«lO°¾("6ÈRa¢4~À‹Kè°eÝKƒ_qñj+w‰›]qØ»e«¨ ¢m~KQ<;uCo9v\|Ø‚;‚½°Å2¡,əܖ¼™‹–Ü«·BrØjòû\´ #ˆ–ë—ëI ¹`ÇŸ¦á8X€SÇðªá9†'(~8jßÂ+8ð…3;`€ç|0 „0À ƒež„D 7xEâ0”âBœ ˆJp ‡qà¬âó9O® ÷²pć`XÓ›„åð Nö@‡À?s=æ9ÂÅ©±X&ÖK£#*îZì™úG³xV©*+½á÷x¨ Ë|´€%>–ª‡fñH;mXSöCº<ìèW(í°ÂÇÑøð¯ k#\"sXå$;«JHehòév4ÆNý¢$¡`XÃ÷lïbÎ:ä`9èOÞLZ dÝ%Hn**œ¾æ1|гŸãÖ2)x%„¼¤+åÝàó Hkž“Œ™ùÎE¶ƒTî‘Y;’2ÇðA#Ɔ(>! ÔL{ä`¶”ô@±à {›ýœéM"nêŒv\fR¦aåBµ²ÌÝ¢ë„^× @ V§t¡r:÷­i9·5~ï§w‹èK¤¬H ):ü±·Ö¹ã®å5J… ¼ÎpË0ÜÃ%¾º¹Ì4RëYÜ@ŽPûšÒc§N«cÌš-à©KM°®º®çí @ƒ•­ø"[Oy¹cMb›1aöB|­¿ÛR€R€^iàX‹A·ŽêÙKmPÉÞJf¹ÏþÈÑ ¥Z‹Ó"ÎQ5X±ËéÆ1éç˜ô“F:ò’ç<Ée ´ÍÚ==EÚÀ ;Í3VM^ ¯µ1wÖ± ÛFø ,^#’âS‡âýàëíÜuSðŒ#JB]wÔS”7^8†66ª:j­€ž†àÎkWdMKì„ðMñèæ-µ°Ô2ÿ&ŠÌX<™u’Ûd6ƒƒÉÆé4Yd M†þÂ7ø˜ÓBû,R“@LÍα³’wè}»sþŸ¥ØL^ÌW{%¯‰J&"éÚ©cèùëi`âö¿ž>¢ÏéE‹êsÁ Øc€4m ƒÜ‚ð‰Á9V-etÒ´„€%@j£YÙˆèÂ×Ba‘>£Œ¯ãi2èÈ& ä ÓŒ"¡ ïÇ4´xb@¾c…BçLcQ5,t7̬åÌN )á$&%y¦…›$;¦”Èœ¬34ó2{‚ãV[ØúMñqÊžÏî)·ÙÁ”麠T¦Ì™„WCª³1ôZcÇk"P[™0Xnã o!—Àȃé§Á›y3Q´é¹Çñš>˜‡tfÉU’(Ù‡)CÁS¼Á<Ó…âG˜§xŽ”'é8aîIãmsŽ¿n„¥©~Ê‹fGÒßWt\—m@ÜLpñœ•W°ã$ ›âIÉŒSÑ+„ Ô¥YiBv| ?ÆÏÃpÃA XŸã‘c’0üuèP×jØjòr!%C‰»!\Ê ®£ÉQÈq“3ÊÑØ²ˆÇƒ§C)6FüyŽGŸâz—“_³’=ã‡îIÈúŸ²M¤õDYÊœ²É¡¿ýŧlÓ,}™  VL‰ª=}0%¡%kYe‚»é °dÊÕJ×ÔüÒ¥M˜°¬÷+<å¼·Öso)mfìÖÍ^Õq …[\“¸°Û‘9°Â%#¹U »Àž³Çã+Í[[…QàZ)XOÉ)pÌê„S‰!è 2.Z'Ëm¡·¢ˆ²óô(%«J²fÇN³‰?éâ‡Öf‰9cãRp0éË“ihß–Ëe’S\.û5k&$¹­`\¸Q”öaR×'Oo3<ÛwIÂO«”•€»e‰líëòRZÓ-öU>q¼)¶¦^+¥QÅÎ’ä³ß&B]U­@WËèŤE×rDš³ô¨ÊSºZÝ:”Ÿ¢K³ôLÙ°¿77d¼3:kß’”€À‘œo’–QÌ…œm)³øfÅH§’ZªwÔT‚ Ä&<ÅŽH°06òÞ ©ž¼ ¼2žÖ$¼¾,ÂóØÁ>Ž™kІsx +üÝ<)$w´Ë’êHQØ«²Y`1A„î¤îýÆR€‰aþß1NÂѳ5‚/¢ÂÞÑw@V–¬Ûj¹¶ÍŒ,4*#©àßwÏ]”¤]¤»4l¥ð ™_†C’ÕuÎRóv±ÈÂa!þšbö\q‹˜ý¶1{¡ #áp™9¼”Ø´EÝ(>Kïí­…S (no|ç¥,qÛ×Z¸y^-%ÓEf3`‚3qdË.3¡HÕϸ*N—¡LñÌiÁOðÌ¡½LŒ¯ƒáŽ1,²#Ö3UÙjjéi³¾¾ýÍø·ÆòZØáèãô.]ahÆfI»Ç`,eïì&Û~ÕMŸydž ¶¸O¢#R—î!Pˆ Ó$aЃu ÙˆŒÃ¶rµ Áôïá/¨Ðya-%*Õö ›p/IÒèò¥ëyíQ3œ?žþªiÂB endstream endobj 8049 0 obj 4654 endobj 8053 0 obj [570 /XYZ 40.7999999 209.299999 0] endobj 8054 0 obj [570 /XYZ 40.7999999 209.299999 0] endobj 8055 0 obj << /Type /Annot /Subtype /Link /Rect [376.799999 148.819999 455.519999 156.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 8052 0 obj << /Type /Page /Parent 2 0 R /Contents 8056 0 R /Resources 8058 0 R /Annots 8059 0 R /MediaBox [0 0 595 842] >> endobj 8058 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F1549 1549 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8059 0 obj [ 8055 0 R ] endobj 8056 0 obj << /Length 8057 0 R /Filter /FlateDecode >> stream xœí]I¹¾ëWèÀrq«´ÝÓr`Ø@ƒO&Á`<ˆ3‡üý”TÔÒ¤>²øøH•ÔÕ ¸ÛbWñ‘|ûÆ÷þüí¿~ß¾ÿøù?Û¯öçÇÏ›f×´ÍôµÝ¿»ü@ö;%§_»Þìä°ÿÚ~ý¶ù¾ý¾ù´ù4þû}#ÚÃöÇ8xœbzáï_Û¼Ÿ&ßLŸ|þø×ñ·ÿmåö/ãÿ~Ùþø÷ñÇOö}û?ø¶é‡vÿ˯Ó/B Ùÿ¹üm?øïÍßþ°ým¡?¼wÿï»vrÿLßOŠÃ÷å£h²ñ“V 9‚xøÇŒÛñßn~ßvc7h!ºVwÍì·vr|­úf;tívð^ê­mÞ«r_¤ÛŽçEˆDÞÒD£»ð«v½VBuÒèý1ìÀô½ï”ýJXz×éÃÒõ swñøªÜ]4²íxÎu‘È[š=ÿUŸXHUžIõ{àÁ_6ï_„Výž3}ùy„äÀÞ¦_Æåší»=É*½ýòÓö#3Ú~ùe3ìÌ :3ñÃiDvhDh4¢Ÿá3múH£Ò!h$ùG~€{0 Õ`ûŸÁ#ømp¯ñzðŽFàˆ>óGà3x¥Š‚;o ŒPÖƒwR#~ÆÀyðH«ð™(KB¼Æ”˜ƹžç…@?ŒG§g~ø2ʈâߨøÙÃu°œ %æ·_02(œÏ£Dú ób9‰j)’…ÂáÛ{@Á7 5žKJ,õ wÐ3Eû!ð[óêãSô"¬ý`~€÷Dsø 'bmÛÊ6)aô‘£9d5yxŽÕQto¸‹ã2æ·O˜ «â=h ”ëI{)fhFɱÛjéˆmÌ+(zÆX‚´_yl=»tN*åç¤+àÙcà—_ wÀz=Å 3¬6wÀJ†T[m¯!¼{€WZUδÝlMüG«=Àǰ¤#ðrå –t½šÕBÐeìTÁ1Õ˜8ޤuÀV"àK€‹`? \úPqõÑ3Dòýaü%h˜î»Hð}xA+®¦ÝÁg †ïöAþRk¯)¶I€+ìREðW¥ÚVFáÁ#¼øB9-‰)ƒA`‚ ã­}£`3þq¹¯WWeVÝ̰šñnóÆÍ)|PâæXP"[mˆ¢©ì¬ÞeTèöQ»løä°ÆŽ-•Û{ë°G˜¢ÏðCÀÃ<„rr¼qP [E‡Cty1–bQÕŠåRðŸ4ÞÆ|™¬¹MÌqYÊŽb ™"« Që€OÁw¨%?VÿRã¿qn7þA·£P§Qä%ÊE‚ò «-,q6æª}#°;˜£`¾Wгj½Ó¦äá“Ãú„ àwÃ¾ŠŠvº6Ýk\®3k×fð$,£úeÒ Õâ}yxyÆE¨Á‡p{É@ÙJ7ÞÑ¥{®õ`¢ððŽh‚<ª% H‘ŽK·U3¢iFK>SŠÔ[†Æb„ŽâóÜyÌ…°÷_b.E ߥ›Â7ox=xOÁ’¥V †šP«DÉóàõ)WcÖ×—Ìo—Á;•S1VgV““×Àìµ"øw—Ü×ÀõPør o–Bu Z† d:QËI”Aˆi4\(Ãr¿­RÎÝ}ÒóB$ÈPcÕs½ÕµMNd¸*¤²¿Å¬:^À*ÇÑ͘®92\ëVbgtÛàœÉi"ÁþüÁtzz§'°=Êëv à1zÆK¬ë§ŸÿÖ²ç6 ÎVá±ÏZ¨Î]{r:c³S²Òø&ãÅixÇ£àñ`D1pÄÃ6o>•ðË&í©ÝIÑGðQxóB¬³>†YêŸ0¿p¼Þ–vñnRIŸí×À¾*hÓkìG&Tå½9GA^jF!ÂK-Ê y¤¤9t“@|.i{,E+—´=sVãð…É|mñÂÛjmñXvæKYN®ЦN.¨ò´HœÞqótK6LùZ^!ÆÕc\,zTŠ.„éö÷O»t“Ãã\Öoà‹Ú‚¸ë‡¦}MóÄì!A $¼5Á´ÂçèÖû@Ãë#q® ÓÀJ¾ v³„Æ U)%!(¢cžx>MΟSá¨a©@³Ûô®HÈÕK<(_\\w?l)žï´êås÷½Õh™N$$?$_`¾“€¼BN0ëá”æ óEJQr½x«€¢zâÈÂßry‚üi†kÞÏå>Æå«†½`‹Æ¤ªÑÑ3LÁVÔdQŽ1 ‹Zõ<ÔZV¬z®R‹Šï;¶Ÿ a'ìgÔ˜f> ‚#6s JäªoŽ‘+Ës-ÛKnÐ<Ê~hr[ßP“ÇZ@Ö!« …§Ä¨µ8¢Þj(ÕØuB™'Ö¡,þJÕ»hËñ õ­ûpS3¼¸!!)‘ei5p<‚ƒ"j qâÝ!¤{`Ã'‡&<…@{Éãu UäKEÑ e?8q0Ê®®À½ átKnÔHAK.}" 4œP…“á-0$VEÍœXT¤À^ÅOxUÎB#Ú\¾rvB‹·£æ0÷£¾¹bRSͱBcäõ9oçÉE‹^œ-†ñ ó€û­C3z‡[Eo`›7w,zÏh¡±ÝÍzAöqš®jÁªÄYœ9–ìjÁªÕÂÕ š¡¸µ`8vVµ€¦¼«ËW NhÁ¬`WÁMÁºžçæá…@¯¡;÷+ŠxÓˆcYÄÓkÿë¬ÛM×YÙt*›~@Çé%Z,˜AðÚ‚$6]¯å€iº“3ûM±(!Dž•Eœ‹ø™;fQg´À]ÇÇ ÷íX!¡¢×¾­ ©æm²=¬¬#‹u<¢oú-n®ÝÚ@±j7ÕÌmÂî.•x0sgYÔ4vE{lš´ú³C¸¼æ«-"hþxùjF6k1A¦bòˆ6ÍZ,Y1¹¹ðˆxJpÚ—~6R–I/ׄ€<%]r?[€ðŸ*î¼^½ã™lw£³éâUÌF½{ˆ]k^רßwy1¥ A´Ûë‘kMmVÇÉø³Ö@1®šÖÎ|ê ‚¬Ü—àsL(õ¦tãÍ ¬‹³« ž†Ôå‚o¢rO-Yù:DŒBu¸ªå¶ÞªT÷¨‘Ñ7Ó×yã4Ò1²3ÎÈÙûà=Ó§¿ílÝzÏ ð™—ñOgv†mâ ýN[¢8¿í…0B€À*¢ÙMbÌCÅ+# „ÚR»S´¾Qå¥+/ϹyîŽb[|5"ðUwÔôìMZ#0m'^qpÑä4 °̸]¦`ÏGÄ;‹Þ®-fy„îg¤ÆumA{Í Ÿí[%¤øAê/ˆ›@¬Áx•^­Õú÷˜ä µ»ó°¶yJ *Ûà '(“å{ êA:"hA½÷ÊôéŸo«´o¯¿,Fbw>CÙ·ÇY)t\œtS<ó÷³–\{0é…‰ »8Ìü¸Î[MFé˞ N”+VÔѲi„C)x¤¼\äråŠMš–»Þš°$1’àÿ¤4ïœï“"ñ‡„æÜ•šwÝœC¤Õ¥ôMÄ  Ÿtp[fX²øØç÷¿¤ÜøAáÊ¥mÏ Û^OP,¼½Nxo#¯qÿfYËŒ•³lEz;Ö£d~T„d¿äÜÙÛù’LÝH‡«ÚO'܇†1’@®…ÏCÍ ¦š‚Îuܸx¸'‚!ä4‡"¿á!'œ‚ØAPö^”,ŸÙü½aYÅîô\å)Qà }ç*ü t5×rQñÞ¬ÃA• ŽÑ1cC‚1Yüzµ£|êèí;¿<õØ §%¥«Dïkä=ÁÂ[)˜HgDò*†[h¤.Õܳ£ÝwLQ\•”ª„›X`õX2Æâ…ßêHðÖÖ9~F[|í).& !RÚíá¢%8½¯¹ä=ÊMïìá ½Ÿ÷®^Vv‘à”®=-K mcVRÈ$…vp¥à›!…B™OeÃÚʦÄg<ŠæÈÐÈ’÷¬nÈJ¶&%(x†EOgÍ.õõ~z»À òé¾µà[i219НÐgÄUㄜ–®•Û‚÷ˆ—SFC…çc¾ç|>*óräùþnÞ ®26茀 ‹¿5­e!®ùxd)X’×K¶ñ‹š‘ƒ#UD³&Øäx`µ†Ëâ-º­$¬8ß÷LÉÊá5Ày ´KR¯Hiúd Šù4ØÉΡÁ€OæÁ¦ƒùa‘€ÜÇ®ÃÉ'X=ÌÚþÅkꞘ›klL8),N6gœÜ£Ö³Ú}áçöÛ¦Äå¿n>$G‘ÓÝ5gt7ó…v]$€åEòÎKcqÉ ¦ëéÎ=Êö°¤ð–kÞ,^Tƽd‡U+t¬5xqÖIWiKfR·K®U쪼ڎ¬\†G° Ê&gª^ºHÑXE;¥_º„#°×2îÿ.pWt˜œ‰{aã+Øñ<Žâ„K£¾íΣqÿl¸o¸ƒ7¾ÌYÁÓ¦týnØz§ÃDØF9øz×nº”PzNÝDB“±Ÿ½¤ †tÊÃ{IÍ .û®>áu„ø¤/J¼Ÿa‹´bÙPe ŒD¦ô€‘¥ù”5žÍébðu­Ü¯3e}„NÌ)ª7l«0Rðl¤yóˆ¥,kï5Ƹswõ­Î à;ò­fnðÖ·ÈbJÀd~á|™tN[2§]+GPX6ÎÂÁoóUß¶›çÀøj™Æ”Ð\ë¥Ï³äœ”å&)õhÑþ”¡(š [ÁQÌ++yÅRzýaœ&ôκnÁêYN>&…àûìæ+ü~EMÑ"ÚÊi¦%åL×;‚æ®\ä˜UÇ]A¸Ëx‚nR»êh¹iã‹£š‰únõdQŒ£°æÔ…f]׺¼~¡…üËÊ€·}Ø*ê k¥À5X¯=•¼e¦‚­ÚöèŒ×õ»Œ´ñvš+ì,“%–By3<ð†A/Õº¼'åJHŒ‘ ½u MoØ‚ï©õ¸úŒlXï&EOvpD–XË™XóÕJošZ•¸Ëõüd…Áߊ¨O‘Á‹oS]²°«i£ÊîÚ {n†yßIw7;K< 9Ç Î9Æ-ƒqûßâ¥Qƒr•–”#t5Ä‹ ( gxÖYR/)j v±Ìw.Yè+˜Ç}¼·;žê€WV+HÝJq}¸KFcÒxRU@Q‰ææ¼,ë‚•2rãnx¿:{ÖÖï‰({åìá îü­ßã¦%)ã¢p}*ŽWb`ñn¹žJŸÄ é(ÈõTRŽ(é¢q‘>ݾk7C!Ïêyçõ.¥ô¤æ¹Œ '‚NÈ÷»G³ôø®]8Q¤¶·õõŒ¸¢µ§C‘T?Þ^£¾ý“‘•’`±°ä r¶¢(éTi]C¢Zªg\0Ae]˜à¥üEjuêT¥ptüÞ~‘qĵýØ_¿%uú½h"ü)ˆØÁG£Ñ·[1.ãZdkí¤knU£ËœÎ³mwíuqÐ;Ë’Ý®s fÚ´îÊÈ´ÑJíäp5Ùܘ];¤‹–׿éá3|f2Â;¹“Í¡ øyä|Û„/—Ÿ<ÿµüöÊ _Ð3VC¹6"Ð:,Þ§=cO,eí¶d`ÝþwiD=mñ”Ž–ƒ^{†€!6¼žt‚SÇ;ûŒhÁöÇÈ„6€!ßà3Ÿ eWè´‹‰}ß´;±º½FI+ž®M<À‘WÒQ2l?mþ"ï"é endstream endobj 8057 0 obj 4610 endobj 8060 0 obj << /Type /Page /Parent 2 0 R /Contents 8061 0 R /Resources 8063 0 R /Annots 8064 0 R /MediaBox [0 0 595 842] >> endobj 8063 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8064 0 obj [ ] endobj 8061 0 obj << /Length 8062 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÕˆO‘@ ~È!€1ä°È!˜Í&Xdqö¿uKý°Ø_I,QÛ£10¶›&Y,Ö‹UdÕ§?}þûþŸ¿í?=~þÏþkÿýñó®®j[wÿö‡¯®?®R²û±q¦’þðoÿõÛîmÿ¶{ݽ¶ÿ¿í„=v쿵§)ºûúëîS7ù®ûäóã_ÚŸþ·—û?·¿ý²ÿñoí·Ÿúñðmç¼=üðïî!…tí/×?ÿµûëïö¿¶ ¸ã¸‡ÿ°^šÚ¹Yp¼»Šã×uW4Yû‰5VÙ½²…Ó´èøï?v?·£Á¨¼¢±º©'ÚÈã°ØûÆîeíƒAƒµMJÌÈ5>Í@ˆÄ¼¥‰Z7ôP•ÓJ¨F}؆Ãçdûs£ú{U—®U3wñ§¡æb±%<›f;‰yK;mŠË m}\¦k‡ž‰±ÓPs1Ö¨Z¥ÙÃDbÞÒzÔ‡C½&‘’ò"%߈Ž_vŸ^üA#|ù¹ã¨Vºo_¾ítûËWMûÛOûß·ºEýaÿå—]SÕ^5¦ÓC}‹=¶¸ËÍð}ü@Wºëzé+$Õ >áðîø­¤pïÝ —?}| :à}Õ´‹m±}é+ƒi0D€`>!Žyåò§’¦£"€oJ°r8Èœù0*úQŸ¿´¬2ð…VоTCâ7O=•˜ F‹f´<£Ñ0Zó8ØÇÃŒ78Oý’j‹‘lS­Ø·!±ÊN,˜Ö°vâXõ¨´Ã’s –-ãÒ5à4(BNŽ,¯'¢[²;€,Àâs,cO”„4zF»&Ÿ&C2aYì@•Ñö€á)Û!ýT¬+·vÑP´õ Þj©aË l¨EÖK k€XtN7œ“ÍËQýtgðV8|™Å(¥´41/î‹-),Å¡ü µGIÐÃù>¨Ne0?Ët¡ˆù¦›æ8Â[l#V[ú9ƒiÌQ¶5µ.ƨ6¶$…M)Øa°E=dÜ-©Fá!Z 5Pc;ÁÂ>ðТ!=Íß î †¯”8%])†@ây0Ôx åE¬%\Äó”rZi Ü S¦L½p¥;)¤|FY£å&k¦¬÷{O¸‚6‰r§%-/¬xO}yfuø·pìXHÙx‡rY k‚-#ñÆ‘p‰¹ŽQÃhÉF!¥Ÿg¼ŸÃÏŒ)vu­#VAÉZ4­-ƒ±“YÞfá '\fÎ lRŒ+¼÷¸cOî“þ³Ò‹jfì½zÊ©±Ég¹6ãÅ`ë…9¹n‡âe’#|4DH„$g¸× —õôQÓDr’@xć~v-¬Ä4œHNÄ5ˆ{PAߎ*nćT¬+ÛˆwôÒŸ¬o´,Ct¬…- #F#&ï劷gß8>×cÏÔJ½­’E6zwò¹: Û'PgUŽÆãx;ñ ‰OŠØ;‚=^œy ÷*¡×S¶Tn@„[º; 6¸`ÀÃ(„{ö0aâÑΚ´dNàZe¶Ý‹ÑãÔ(Gè¿_A²1¢üøÞmâ“jÁǶ»ŸWd¡¡ "Ξ%p4 ö!âU < çÁ-†k–{Œ0®±(…x“É®HOqæäJ+ôĈÂSH/’á¯!(sÇÿĹ™”én!J±ïÒ玆GψѰtyÆŸXr%»ZM?±Ê7Cö›`4âÖ<#Ñ2#±TD²Ð0[Óô”es2Ƥœ‚9ˆeül&µ67^w¨;µö=â–<ÙX9`©bžà-™£T IÉÏ™"-E°-ÌÁJˆ'Æ›!”ÔmI-!ý`wñ[ª¤ïï' ³öbˆ"ÌŽcw"ÜJ#7F]‹Q'¤w÷ˆ­ˆÄ‰<2ž*S÷>)¦Ø¾rlÉËYë>žœ°Ý a,Dd7 D Aïø5­ã¯4O€F÷¸ªKR´€ƒ5V Ø‚CCȆTé%k>,4×ÂŽoFÜPžs z¤)’§˜Q aú‰˜£lçÔn ×9ž Ðz‘›Õ±Yk[&ЪË+D£õdM^Š]CýFC±@ãŸÄsÙѶ«œ¯®l˜@g÷ío=ÜŠÊ­­g#\B8Gq@ŸÝê¿rmŸþƒ¬:"ašã!éã{u¡qb<©s|‰{‹%Ã2†éi¹¸ºµ/¶Øôâ¥hfŒœ3œ’ÍéaO_g×".‚ŒÚì}ú—[:!B¹G8ôï@Ah¿ð²š¢æg9Ÿç À;ʹcÆ ÃðrLÓd¸Ð æEy±VkFܬ°Ø¾‹íÂC£¥ÃÑÎy‚¯ß‹ùs[!韈Â:Â/¸åU1œ;4¹A°Ñ÷nÐN63ôÂFÄ Ÿ–ÈW÷Òšúü{x9Çñ}ÎóÜ´Õ°‹IHšg‡µÝጕV­±ç³pÒ*ö„G×9eÐ/‡5NÀQ>•F%íÀYŠzä¡1§Æi>_¥ÉC¦¹÷záÖ~3jîâ˜%Q6‹Ãüˆs\ašç|Âéhé+°vâÔ÷fÔö­q ã歷<#…§ˆë!?†Q/„€ ÇïI±YxÃëIÊYM7ã-vÜzðÎqÖàkBZr·'½_A$übXõâ–´¼½~xlñ˜Œv„>[/˜^𺱠Ȱ9ú=×+-q¸ac¤Ãô¢±´Ã+eܗ•x4\ ‚!£K.”Á±¶ïSr)\˜(c’hÛœª¦=aNçX—X§7g‰bî2Þ£ô<–IϪ¸Ï½Ï)šË×Í'RÀÉ¥prY†¼$ðÆH*ÊâŒLiMˤÍ9n†%)‘€•ãÁ-™öïIÚʺ¬X@.\ÃÑÒâ¯4«žñr”Ê·xÓošCcNÕã4ÆÐÖ,ŸçMœ‹ˆ;íG!%,›Õ“¢sô‘ÂPcYŒçáXÒLáò ¹pÍò:aIÊ8åâÒ£¾¿<œnÝ8]&mIKcœÎ3Ã5–ˆ½‡Ô— oŠMÌ3­U_ÛÌôŸØË‘¤¸…s{Ëÿ¤÷4879>FÂnü`‘Š2¼"^šÜȉð3d9AcI½/,Ø8}’êM 9W‡#îY`€Wʈ—·©qù¨»¼›AD-°]íšœ:ݪQZNÜÂѵØþa”K+ˆyÒJLI 8P+†½±¾\ç`Ç0Z0FK?×z'GáY¿%q$–oeI†ÖÚl稼i!,†–·{i%¬g³øI™v—–8Ç,ÂoÚÉŠ‘B¹´pÑÙW¿õ”+çæ}ÞM$d4öU¬N! î)çóÑè »Ó䎲Z¶ Ã%èœò3 ÇÙ\%[ŠeX}>wLµ«ñ2xáÎxeCœ‡78±Ûõm‡Þ¡dz=œ6â8CDÚ|ËÛÒí4!rÇÖ7;<•bZ^]z¯ÿ²3­ìÜ,¸rCs†e’×Ù¡Ú¯ý[»ŒÄÃôß¾~#Ö"¤¾ ä•D Ùu—ÎîE»Œ[o¼°]%½ªÏ ;fmeo'…ôºê0sÕÒ²lªf˜U´Cgs£¥S2JUÒ’T÷ɇMe»|‹—–Îã`ûtŒÙÈJ¶Ç9yÝçŽÖ šëOžàßö9Ho¬ðõéÍ­ÖÑ+š¸>ýŽÅ¬½‡íÈ3¨îð³4¢Ýí>`ôì{«ƒBúC~Ô»Ž1û„x¡WE3¡%(Óì#ñ¾p°Âç…¹”è\m+qÈGüž$û×·&ö°åÊf~M©ö¯»ÿO|úü endstream endobj 8062 0 obj 3474 endobj 8066 0 obj [572 /XYZ 32.1599999 76.8199999 0] endobj 8067 0 obj [572 /XYZ 32.1599999 76.8199999 0] endobj 8068 0 obj [572 /XYZ 40.7999999 409.939999 0] endobj 8069 0 obj [572 /XYZ 40.7999999 409.939999 0] endobj 8065 0 obj << /Type /Page /Parent 2 0 R /Contents 8070 0 R /Resources 8072 0 R /Annots 8073 0 R /MediaBox [0 0 595 842] >> endobj 8072 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8073 0 obj [ ] endobj 8070 0 obj << /Length 8071 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤(Q@ÀäÀ°‚o6Á"»ˆ³‡üý¨GìLjú(²X¤¤Ù€§=lñY¬úê©wüò÷ã?;¾{úòŸã7ûóéË¡:UM5ü9žÿþpÿ iNJ[£O²;ÿ9~ûåðýøýðùð¹ÿ÷ûA4/Ú}ãeˆ¡Ãß¾ýzx7 ~~óåéÏý§ÿåñOýÿ~>þõoýmç/ür0]sþðïáƒBšþ?÷ŸÎÿ:üåwÇ_û)˜—~ÏÿþÐtª•ý\Ræñýú¨xù{ÿ(¬ÿMÓ -BÈ~žºÿíÿqø©ïí:SW Ñ6u[÷ÚʾÛþ‰úصÍѨÊéÔY[XW"±£VUŠ¥£—‰´¥‰ªný]L­Dÿ}]Ÿá|ÚÙn•ý³t=ìaÝÕÉ»¨™ŽÃô;Às®ú¼‡IK³Ç»çCB7¦‘íùp*5ü7|ž¦jÍË‚¥N\ñµ§Ô­3¢’<g$’Vf÷DåE¦6öÞ‹Tâ¿u•ڑÎ3iK»ì<îê¤+ÑKµþÊÂÏ!™ó(M¥û1ªº—aE†qw˜w˜¦Ì0ú|)r!ú?Ã|fÁ)ò†S¾{üðõð•9ò¯?9îyÐáÇמÜõñ‡3^1úøõÇãï«JÔ8~ýùÐt?/=€Á-•F-²ïMVpœ°¥!ŒÓÁÞža˧øώ• [$lQ°å ¶À•J¸× îµ|?Ž€½Uãé@™øqjL×pß0…`ªR˜®á3®§Â{é ßÜ‚iï¤Ñ Ó5åã{JX©gÈÅ,ç{þÚK‚Ü|]ö2´,_ßùÓΟøù“‚tPáÌQà(¸oª+xk¥ÚÑXšlÂÜC˜Á£I-| x=ø¦{Ð2ÞÊÜð8¼ØûÍЖîOK=ŠÖ„å!^žÆ-ß9¼oøLñîP¤+aßV‚bkYÅb©‡¹æ(øL}‹K‰¢ˆ§ §¥>œ©¹Ž Ï[A~g×À0ÓL³®^¦©ÔEñSƒhâ¤ëÆôÓ Ts£Ÿ÷ð«C'uÀW-˸õji¼=Uí9_ ÆÓ븫’Þ 3pÂæ$…™¼!½VÃQÖ§zø&mXfâœãóèµDsõ £` \¹g9Τ5ìd–*¬ž¨OJ!õýÍP¨Ng›ö+²|B-yˆŽt²°¥~fãpºF¬Ãr8eÚËÅÁ Ûe D“²—®«fùa+”½;ãP¶PTÀYã…Q)eœ9}//eËž^^“&Sl„Ò¬Aó å¢à`3Æ„‰{#¨³¼dîÙkUYÈ‹óSbæE1X ØDm‚2;Ò¨ù³ÛÙ§¯«|fŸW²¨!#¢Ø»0[«1Á`‹õ&ž„ãàM±-RìØ „÷³RìgúTÅ™‹M‰—é ìÃÂ6blA'Xh=‹oÅvE`¥šàÿô´PX)¶"A:À ïžö"xzÃÜA”»3Zp¸xZ<òl»°àŽ,°  ,Ü®¯jÝ”;È …¡å´ñJñîÜ»¥ ‹Âô¶â»€g]‚iÕí¬8«ñ,ïÚ_Ðá[ ×SãˆåÇœP/sÛvþ„w@çtØò»a@w% f;¾ø¦äiÁB³8˜ñDo¬J ÝÅ}à (‚¯àº›k0ÇΦ‰lú½™7²X³9žÄX †ž5Z½M¦Ò‰©$1l3Ù2S¹’vE{¢‚1£J0ZÃü¼-w…ZQ½IÖÑÖfgixäÃîÈbÅ Åúä±ãD|(†ç¹ØÚ¿ G{Û\ÃI ‰¹¤´‚µÒƒ“ ,ÎÓBñR"< À„D>JêКíÌ”„'J²Éà…ENʃ³ö¤¯RÄ™“Ÿð¾RÞEIàgšÙ]¤$‹z¸Ã\JQœâ…mÐDðŒxä3êá}Óøðm¢¤øQ8$Áçˆç¦ ÞS”˜ÚïLÊ)sŽr7F‡p+ÏiåðæO)5íE½‹H)õä â@œy˜%=Sà^ñìñ†c0'ÓUÍ«œDKŠB_ú‹“‰*8óDR­ºHåJè××·¬9±ÙÉŽ`"áIÑÎú(¹Âèr甉›ÿ4ÅÚ Së\뢬ñ&G°E÷r¦ˆ™ˆ2Î0øêãÕà›NÉMŸ¬gJëšåœha²B^šHÐ~U9“e¬Á1C9”ëã‡B¸±—L«+øo›ëwe,…xᑳ=1b¸ ‹‘y‹O Å”bp®„‰/øøª÷ñÁ¹Æø1Cq®1i®ëYW8OuhÌ‹x˜R¾O  3(ØoLÖE7é|m&«ÅëIu§—¹¾:±µTÒlõ¨å–Ká\„EA”`<Ù…4êµPaF6¨ŒñÁÜ‘5š!ݰ±ì/åu6U}Ý–¯3‹‹5ïæÑ3"”?O¯„N^5&§POü‡JÁ—gÚ½ ytcàSáäˆ^­cŒvZ[ RÔõH2¬Ð¸’Ù9QÚ´në‹ï#…<¦ø‡ðÞ8«`¥(w&ãkK±ÇxÌgØ×âÀÖ`¦“"vÂ:""Bß‹¸mYø~Ê[¾bTÒ èàÇ*ïlxB¾‹cIÕÍtc}#Ó«ñXdy¸÷"°*û=$%ÌW°½¿lNuÕóYëÆŒ¯¨›ËA5UwÍ%†¹¡¸þD 3@%ÎÇù¤8k¿ZgÁâšÝl5ñfÈO¨ë[~ìOä4¦øE9ã“yý^™óñÂqZJ‹4ˆÚtPMq+°N¢Å‰—EñB„‹ç€½y¬APo‚\sòXaFL6fK)—… íy”;Ø›-j—•ÇB—’8›öNaâ,ºæ ƒ*ä}N8"E¬ð::WŠTÌ@YÈ„Á‰üœ¼°ÌŒG¦ÌÆ…ä4?H=’'[Ò“€)ÁÙ8oÌl_öèQ¹Q1Ë‹¸fQnúmÁ¯å©}Ä­é°M0Úv’‘ð¥¬G”O2«ì‚£ÀÈÙÒÅ'6ÍA–“1y£câÍýA_utgFK©W¬öÑL1½yÝë‹ß˜â&Õmļžß»,y ‹èRš%¢:KC–ñJmc%Ž·ªX±@ha.¾Ò·j~a•æ±X†Ç3‘¨+%ë0K!–ž¨³%޵|Úôg BA+IºILý _Å:Í»µÒ#&¾iµ2%õ€®Å0ug\ÇL¨ÖêáòYCÂ#Z1“¿Š¥ˆÑÛ-‘5Ы°‰*§¯iGLž†žQ.®L–Fž«€ŸáÌÓ‹A°xoXkGñ½\uFi••Êzì~"(z_‚Yã1 ¥)šÅŠoëRoXÒ„+;5º­á É”žK°€dufñœ¤rXÌ\Å!œ+E¼z#©¶eYy­‰<’hñÜÇ¥ÏtYl¡÷4qúŸ2™¸=_!À½ÂªðTN—ó99¹³ò»exÐ ¶k„­6#‚)͈ÂYœÜNŽ(ƒ˜ À½Rá|¼ÆÆgÒC(Þ–ùº/øÎSž!˜¬å¼åˆïï·t¹7qRêP† €$û«­Åñ—ªõ¬ª–€?Ó+¬n‹{{¼½Y‚á ~kÎí w”ñd…«}<’4Ð|ÛŒ¯Þ†Rz×Wg‹äRO øÄŒd-–ŸBZe'ŠëX¼."™7'Œp‡S°Ëc–ªZA¶@(zᥫùg΄ËÂÝsWìÁ£L«õÔŠ+<5&ƒU{a€@+ ‰J=;ïR³•ûR ¾¾nGg¸Æ$šM†A—eÎŒ÷ðnQlÛ¼ÑhóXd>¤†ãýL1ÀfëHPXöêLoÆûÄk£á‹ þ9ë _T'9_u1-À¾D3H?àˆsCk„ÙšÂÝ)–¢]Jm%àPG='ÐY2å •L'äôðèÚËç+}ñ/—¶—§Tºd üÊìãIg‰Hød‰ðæ $)Á)Ö´”Âõ¡ ™Ròé6…‡ß¬Q*^_Ì);=¶”ò†îB:+NX¼0 /δŸáùB”Ñ, |åOw)…‘O@bWD ¦Ì”Ñ< ¯ëgé$8¿ß}õeÀ[ ~ .¾]ÈI8kmóÀÓù"3£äº±ÚF“Ü]á RË'ž=-@ºM¾m˜Ãª»|mBÖèÛ<8óé»y‚9Љ²ª(~­ßõR’ÖMW€¨'Ȫñ3ºÃãN<™-ðõZ†‹ôhƒq~p] ±4‰àØ#ì¬÷¸þá3žÓÅ´{[!Á•rãq„Ìli®°äfÊ RbºyÌÁë{'ü¼Ù|:¥ œC§É'›QÄi-Æ2. z-QتXº¨üÜëól0ň@y›Gûc}—q 4~H“ËF€Œqù~W«1ßô˜;Ž85fíÓS' ¨Îò‘³ZLºí\LÞ;ÎaÛÊÞIØ×€¢RkÉÜÈxã•jFW~“É!ž58 Ãë+¡Qãéí >óžlÁô†OÛC;ø ¾%ð|(-VâGµxz#¬S¼„·Ä3L!ª$|¦¯ò¬Ó›ˆ_©gœsKÊ)ðî¨çL 3-a ]S¸¼ÁžðJ Êù`¾ÓD?ê’yNA?ævønRN ïüŠyÀŽ˜vÄĘxч¯ãõàÞ(·ž‚0vÄ´#¦1íˆi ĤëÄ´Û‹ªbè§”=boYw ³½hG +à.´íé óÌ«`Ë Nn-™ KyÆ!h)ËcCfË!Ëà¢öj±ã¢{ì-«oaÆE…dèÛÑ«ÍÚI’ü¯Pd(³í¶Æ-h Ç•œ|ÿæ ¾itûš&{4tÝûño*'öÖÆ¶§¶¥¾ ÛÑ}ýP—§Z«sœÙ­eØnY_Jàm×ÝœlhÖÄÄ3œ\Ä:lµú$«×³¶±øu .AÚ-îôõí û¿Çïý‰¾4WGûãÛ/ž#vi£ºÑÆg/ux'«æ(ú…MÅüw¢9½ÅUU¿Þà¦95Óñr]}®À]˰Á²?”éJ°íD˰Jäø mø±>5CdÞ­¥…ãøLŸnM+‚±Òeª·ÈÜ2Sßµ±§+ü„ž±wdªE uXR{ÆžXÌÚŧK ºóg©E;{Úâ}<Xy0õ BlÖ[Ô zNïìGt¬tIœ­‡B0½Ág$>Ê®ÐïB*%S5'qÎg|M’âO ÜÁÞåd~æ” Çχÿâ‡~ endstream endobj 8071 0 obj 4947 endobj 8075 0 obj [573 /XYZ 32.1599999 327.379999 0] endobj 8076 0 obj [573 /XYZ 32.1599999 250.579999 0] endobj 8077 0 obj [573 /XYZ 33.1199999 248.659999 0] endobj 8078 0 obj [573 /XYZ 33.1199999 325.459999 0] endobj 8079 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 768.019999 108.960000 775.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries >> endobj 8080 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 759.379999 116.640000 767.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig >> endobj 8081 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 750.740000 173.279999 758.419999 ] /Border [0 0 0] /Dest /#83#bc#87#1d#ac#e98#ac#dens#88#b3#ab#a55#92#1c#83#7e >> endobj 8082 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 742.100000 166.560000 749.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module >> endobj 8083 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 733.460000 164.639999 741.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module >> endobj 8084 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 724.820000 157.919999 732.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module >> endobj 8085 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 716.179999 192.479999 723.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 8086 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 707.539999 168.480000 715.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 8087 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 698.899999 132.959999 706.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview >> endobj 8088 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 690.259999 134.879999 697.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers >> endobj 8089 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 681.620000 132.959999 689.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions >> endobj 8090 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 672.980000 193.439999 680.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 >> endobj 8091 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 664.340000 219.359999 672.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 >> endobj 8092 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 655.700000 154.079999 663.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables >> endobj 8093 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 647.060000 189.599999 654.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums >> endobj 8094 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 638.419999 167.519999 646.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants >> endobj 8095 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 629.779999 180 637.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums >> endobj 8096 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 621.139999 128.159999 628.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers >> endobj 8097 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 612.500000 188.639999 620.179999 ] /Border [0 0 0] /Dest /#87#2c#98t#14.#c0#ab#bc#a1#a0#03#e4#d0#26#18v#7c#7f#5d >> endobj 8098 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 603.860000 180 611.539999 ] /Border [0 0 0] /Dest /#23#c9#7f#eb#03#a9#ca#d9b#07#23Z#9e7#0f#cd#86#cc#2f#19 >> endobj 8099 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 595.220000 133.919999 602.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs >> endobj 8100 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 586.580000 139.679999 594.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes >> endobj 8101 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 577.939999 153.120000 585.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance >> endobj 8102 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 569.300000 155.039999 576.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading >> endobj 8103 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 560.659999 222.239999 568.339999 ] /Border [0 0 0] /Dest /g#08#7fK#d2_#3f#8f6e#aa#5bHz#83#c0#7e#97#1e#ed >> endobj 8104 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 552.019999 148.319999 559.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates >> endobj 8105 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 543.379999 147.359999 551.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators >> endobj 8106 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 534.740000 155.039999 542.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces >> endobj 8107 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 526.100000 151.199999 533.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions >> endobj 8108 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 517.460000 132 525.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl >> endobj 8109 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 508.819999 156 516.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 8110 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 500.179999 203.039999 507.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 8111 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 491.539999 124.319999 499.219999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays >> endobj 8112 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 482.899999 161.759999 490.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers >> endobj 8113 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 474.259999 130.079999 481.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices >> endobj 8114 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 465.619999 116.639999 473.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 8115 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 456.979999 132.959999 464.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 8116 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 448.339999 117.599999 456.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 8117 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 439.699999 156 447.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode >> endobj 8118 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 431.059999 145.439999 438.739999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode >> endobj 8119 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 422.419999 122.400000 430.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts >> endobj 8120 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 413.779999 145.439999 421.459999 ] /Border [0 0 0] /Dest /#b6#18k#3d#d6#e2M#a2mW#b2!#d9#d2#97#e22#e0u#5d >> endobj 8121 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 405.139999 143.519999 412.819999 ] /Border [0 0 0] /Dest /#23#d3#f1#ea#8f#db#96v#c0#c6vp#dd#28#9d#c5#05Z#80#f8 >> endobj 8122 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 396.499999 116.640000 404.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources >> endobj 8123 0 obj << /Type /Annot /Subtype /Link /Rect [264.480000 260.180000 364.320000 267.860000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping >> endobj 8124 0 obj << /Type /Annot /Subtype /Link /Rect [284.639999 361.939999 332.639999 369.619999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.scilab.org) >> >> endobj 8074 0 obj << /Type /Page /Parent 2 0 R /Contents 8125 0 R /Resources 8127 0 R /Annots 8128 0 R /MediaBox [0 0 595 842] >> endobj 8127 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8128 0 obj [ 8079 0 R 8080 0 R 8081 0 R 8082 0 R 8083 0 R 8084 0 R 8085 0 R 8086 0 R 8087 0 R 8088 0 R 8089 0 R 8090 0 R 8091 0 R 8092 0 R 8093 0 R 8094 0 R 8095 0 R 8096 0 R 8097 0 R 8098 0 R 8099 0 R 8100 0 R 8101 0 R 8102 0 R 8103 0 R 8104 0 R 8105 0 R 8106 0 R 8107 0 R 8108 0 R 8109 0 R 8110 0 R 8111 0 R 8112 0 R 8113 0 R 8114 0 R 8115 0 R 8116 0 R 8117 0 R 8118 0 R 8119 0 R 8120 0 R 8121 0 R 8122 0 R 8123 0 R 8124 0 R ] endobj 8125 0 obj << /Length 8126 0 R /Filter /FlateDecode >> stream xœíɎݸñþ¾âÌî °Ûv€6CCàl2Aœòû¡6.ER")Jz=i7àn•¨*‰¬*ÖFòÇ_ùãý¯ÿ¹ÿøòå_÷oóï—/7ô@MÿîÃÏ>€¨%ÓŸRñÑÿû·ŸnßïßoŸoŸÍÿßoXŒοÌÍ…Ä„ð?ßþyûq"~› _^~kþúïÜc®þ~ÿý̯?Íø†?Ý”Ãÿ˜þÀe.ü¿†›»ýî÷šWP#Þáÿ„fš2¶ë=¾ÛGñøã?š#f B ¡îóžÜtÇ¿ÿ|ûËðU»^ø/Hîì¿düxŽ Z^’˜Ÿùõê±`ŒQÑþïDî;Éü %}÷éj3ø_®é>sÕ§û ¢ãºÏ`òºo¼º¬ûös_jé;=¾®Ô‘^h^Òoy{rÎ3ÿ\ÎWÝûða:eú—ý»˜§—Fy#–èáždÎ“Ñ c)˜é²ÒiG’§Æw-ÅÍØÌ!*¼‘D„눦7Âû>Ít·L¢ÚÇú86$™^ËGã/×ê¡”1¢ððKb<ªB9˜Uhh8ZX3äÛMèÆš(…˜P>–åj¢aÚÏ×bxì>-44È·[ø&c+êc ¿ã›1µÞÿ"èõ  *âúäûʃï¿Þ~ü¤ãñë_Ì­Ñ~}5òÂî?Œ=@î_ÿtÿ%Bÿêþõï7Ó  ÂG“uºƒ>Žw¸±WïñŽ| M%GÞ,Ç;ìÁ¦Þ3#>Mw>~5|îF(Áµ¦£Ç~¦3×b¡}@©ÆÎʃÄ<‰EJÌ/ Ƀ åcY®x ³„ƒi1×RŽ&6cÂDÀµ+ª,âÖº¢wYýTÐ"Y2¤âû^ …aèù±ãõÌÌ„s°HCÿ1…c¾2o Ø겕‰›ö 芟nÑTßlj ަà$¥)8ƒ"l ‘¦[¡ òÉ8MÁQJS0 ÉH¤)˜S  É\ª)ÌïY*^Ê緼ɖ喈ӞVØÖg¤EÉðÅã±¼,ëIh HÆLK’ñ ‡H$Hc+¢A>'HB¥IHHÆ@"A[ñ É\*H’-MÇáÔ)80Ç"&ÉûKoâÒM\$·âÂ}@±¸( ÄE©”¸hùX£X\´“‹ùdœ¸(‘ó€Œâ±¸Œ­xˆ†‡d.½Ä(ÍZ¨“K-dœ^ƒ¡øü o‹HäJ…A! ƒB"! )À¥ ÃÔ …hOÆ ƒB,! ÊX’ „ajÅC4<$s¥0(\àÊÓ,ëµXcYF&7å%ÿ&#g…`åN¹_O’‘6„kÜߨo¢ÐY‹÷}gôŠ¥ÑÇY (¼¸R”°;ü¨È¢`–k–?*"@hp€ÀðãÊDz\-A–åš$ŠàˆŽÂc+êc ¿ãÚð£"‹SOuvš„L‰ðŠHµL±yù/ŸZcA‰œÌ|x~Sêˆ(öCÎí¥ï²/Ÿæýlû# lÿüxüÞe‡º!Üi X%U[S¥ÁaEl8LPlm0òQ,òQ †|Hdm0òqhOÆY,òQ†|HdmPg^° äãÈ\jm0òa9Fê|Ìód„¤!¯6 CùÌÆlpkPÌrG”HG”€Á‘±œ°Á‡ùdËñTpDq ËqqhxHæR–Kp$ŸwйŠEƒQµ2G´¤ó³U­i&l¸‚PÌÀ„+ŒËŸb`Ã$b`ce®XÈ8–©p…Q+ŒŒÃS+¢á!™KX-á &sZA8o9=‡W (ÐjwQÁkzçæçß¾½?}‰±¢‡QÔÈZcyk:?ÁHR¦ÉÇ|ºè²È»L»C¿c”­ HF­ ‘ó?¹ØÏiÚh”ë9 ÛdìÔ‰˜-ý»Â>ù`Eƒzˆ™c+ˆØàˆ´^ö]ã7*6æýƒôr .UÈ‹˜`›2×Ú”ÚšÿIÓ”ÿ¤)ôŸ´¦V(Dƒ|2ÖÐ4å?iý§m©ÑðÌ•¶€¦‹ÿ”/®Y‘µ(VQ­YÁ‰ô½úÖAVÄ›ÔN¥ábž_ A|@±œ0àôižrú4‡N߉ä„[§Ï¡A>'',åôi¾É ³NŸCÃC2—Ê ·N_6^Vlæ̓üDÓQW§WÌE¥)‹rVçÖ=äÈYa†à€V|p—)ö¬2Ã~.3ƒS‡k§¡+øº’ü „¼Ü “ÖCÖØtNõ ²¶òÔ‰©*¦7yB[_KPh|h„ xHTÀ(¨€!Àø˜[¡ òÉ,Ƈ$*à Gd¢ ø¹Ñð̅Ƈy‹Å_YÇ´£Æn…õŽ›¯³y5¤|Àn5¤—~¹Òˆ,.ÖJuXKL¤¥$_ö©Õ–›4‡ùLë¶Hæ´å$=œÏƒ¼â€6èÏÁúŠ:x§œPùr‹œ¾dCåaÆšøBTDðlÊ4aL²•òɬñŽ…(žÙ¹3;O¤â̼„à”+¢TÜÜ …hOÆÍì<‘Š3PÉð(7·â!’¹tfÖãÈÏìy†Ê›™‘¶kPn5UL½¢_æã­SB°(fSÉ›ÊDM¯*È?2ªé[¡ òÉ86•‰š^¥™¨¦wnÅC4<$s)›*;œÇV‹åÙ´¥ü·)OØ“ÕâJJ}@1'kèJé¤+¥#WJ'\)í\)ºRºR:éJéÈ•Ò WJ;WJ‡®”~ WJ«“8¹Üb¨Y™Ñ²ÍC—¨S~þ¨[´aFÀº{ù€R±À8L@" h  8B XL­Pˆùd¬X`œHjŒ4$ƒ¢4àÜŠ‡hxHæJ±ÀXœ$QʽKqfy†òÐUŠÅB€±ËñqP,D! ‰ŸÈ4ÊñÍ­PˆùdœDŽÏ@%$C¢ßÜŠ‡hxHæR! ‹úŠÂl)ÏB¡‹¤°Á_)1myûŽSO•å·Ý9Õ+Fiä;ó®]×—µŒcC¦#5VZÖ˜..CÜkOB˜¥B˜ÃPƉ´'wê’¡Œ…ŒÓž,ÊÞaq(cjÅC4<$s©öäÛÉÓ>&Dƒ]Y¡Y^YØ”»ëæNbn#ù€b¦ 0‚E*0‚ Œ ˆé… Œ84È'ã˜^¤#XÀÀȉ˜^ØÀˆCÃC2—2½<+0²½÷¬lt4tËbi#&Lû€bW b‚U*b‚Œ˜ ˆÅ•˜84È'ãX\¥"&XÁˆÉ‰X\Ùˆ‰CÃC2—²¸:+bR¾ÛeSMFÖ̪YyÐn‹–KÒÀ7Tu‚@€„ T€„   P ¦V(Dƒ|2V JHt щ‰¶lïÐðÌ•R@ÐY’,Ñhó—f|Î-L÷Úx—> ˜ç1ˆ‡’Ї «Ï“82µB!ä“q–ð;.Ý$ÄôÙû(€Pc —ïmuî6EÄÇÆ Êâ–Zœ 7/7 gýj!|@ñÔÃ_Mxʯ&úÕ$šz¸õ«ä“qSOùÕ„C¿z€DS·~µCÃC2—N=ÂŽæ$ëU{>¯TæEºËÖíʲ–õi-G´”V¤â*öܯ¬Ë'ya«×ñÇÕ „BŽ}Ú e»A¯™¯,Õ›*Q‚8 ‘©8 ‘03@"•(mÆ¡A>§e*C$ŒÃ H%J‡qhxHæR•( vO{®< ‘®²ù€b>Ò0’¡“‘ E2t"’¡]$C‡‘ #:É F2HÄGÊ1Ž#ú)"ÚË¿‚,7ýåèòuÉóW~— ›vë/”(6Š@…âT…bB PئV(Dƒ|2VØ(J…P(‚!”…mjÅC4<$s¥°Ql7RÏoÒ’„iñ˜Nˆ]Sì¢,Ä3!™yó)&¤03?@"&¤ŽëH™_È8&$©Ì<%03?@"&$63ïÐðÌ¥LH·ô ´QwÒä`/€Ý6Ê‚ÃÀÌuâ00‡h`BùX–«à0°áP¿D 2ш›ZQKø×Ú(G›ªéˆÝÝ‹¼ÉŠI·¯ ÜõÌ?³ØNY^£ö,¢i«< Ø/²‚†"+h¨€â$¢ ´GØ,”‚ù"+h(²"±¶âˆF´öÔŠúXÂï¸Xd…]þšÏ7ÚsšD·°/uÇ)áŠ-|SªR¾)UÐ7 ‘¥¢¬oêÐ ŸŒ³TTÊ7¥ú¦$²T¤3MTà›:2—Z*Ê.•Ï.®ðîâí»ŽŽïî¡(7Ñ”[}Šy_W‘¡”«Ètäý© Ñ ŸŒã}tuä*ê„«¨«¨CWQ?ƒ«È»J¹¿6þeöؘØm¯0æòNåò¹üí•6Y$ –å*Ìå3œÊå3 sùÚ+c+êc ¿ãZ{…ëx¾ª“[+–ˆEžK>wŸ¿´ä+ê¸ê #fϼÁZø€ÒÉQg4•gæÃH49P›whOÆNŒ¦òáŒÂ|ø“ÃÔŠ‡hxHæÒÉ¡×<9\-å3 Ã`fau™OÆAæ“ñTæ“q˜ù ós›ùthOÆ1?Oe>‡™Ï1?·™O‡†‡d.e~n÷?æ4Òÿ/·G†}À~ãÉ.ßX®IÊx’ 6’ÅÆ“ÍæÑŒe¹Â¡ñ$QÊxÒ:6ž„5—f,áw\l<Éí“úœöYÁäí¥cϱiG&³fCÈ=Je“)P9S°q×bÍ©ý˜×p¸f>jإĵ‹n©0½ìȦŠÓ ËÅnåMòú%{¬_S™oE¹vÅZäC¹µ…³Ëßu¥c+Qn¯“;vËâvìrìCŸ³ywœÓrÑfÍy­h§®&¡À SS»¼½«O~ê96×´C³ÄŠ2–iƒ\UìU[#4{ŠG ùt"Ù•9jN~¨8þ³\Lb2'ºvÐ UÑ¯Ñ u9ʼï4×UíT¢Ò_ׇRoâÍr.±]6Wi4íÉÞ`E³jû87–©Í‰"M½qŒKZžël: &ËD¹MúŸ »2bŸSÕ*šo9aÓÊWMæ×çlVÙ&îä±­¤‚ÞC¶(ûš‰¿xá^MB9ª¤bÇÝfOË:¿ƒôvÅ6Ú;Œÿ8àwH(dû¤Ž][nÍ#Ïžóç”nΫ³–;±Bèjðu ÇïX!‹¥I0>Â홂rpElx…pðç®8ÁS»mT”Ü—ÛP+ÁÙŠ}À*ª`ºä¿Ê7g곯d…3\Þõñ€Vº*vãÜÖÒ‘¦o9–¡|7!4›R|Áâî¼Ëò@¾rí¤`Êó%ú¶ÍË£µ!ÙÔGv+lývw¤Ê^l«³û¬M®ˆêo›j'Ÿ¡¶½Cvì2oDy.u[•ÖœX¶©0÷XàGŸrÞub¨Hº>_•ð塉ËfÀšZç›ÖŽWáŠc¨Â+¶ûì;?VXÙ')îXrÌRâ{£bâËÖÈïªù.ûåí;qïM T0tWm%ïCÖ­[Ô}Ø)5QÀòìvOr¬ÖÆ¡ PدJ)4Aöœ¹Y¡ë+aE¢ñ)+VeÇ‘ êS‰;ë´ Ò}{¾YÁy¶Ç.4\‰f•¯²ûyM÷çÙî$ˆ·Ê[¥FÅfCå'ßÔhÔ(¶R®b+žÛ¦ÓѧuuQ¶%æ-lÒu‡×]ùÏ'BÕZ~×òZ¬%êra î~qÎÊ9›1§&#±Ëºÿò²‹ší6zÚ¯'ç=KtÚJ…FCàøˆÓ|¶K›ù×¸¢´yx`Åi]hŽJ¢À—T¬ßîKè²MgÅæW-û"4¨›Q¢ã3ô íËЈšÀ ý¬‹°\Æ(Òl‰,x>?ž¿Ó’mÿ´ùúó4ŸxxæUöë,³ï4*NÂþH¥Q%?Õ#Ì¿Ãdz«î‹¨«vÙ´«é Å'n×2Ÿ†¼{Í®Õa€”«,«íåS–c¼®1­qK*D^á|<]š·&ª×#/¸½ùì5/Gl6Ó¶aV$8yžlò€IMù9Ì<ö=süœ%4GjpN¡ ﲄl;×õ|fÎU%—°—dÚr{Óþ¾ð‹Ëv[K•\Q N¨¦Cf¼¦NÿW”’6ì†wàvjx<Œ"½°k $IðúÁ#MÄrwf†JÝù½C³w>åîäßmœÔ×L(-áä 4Ï1íI5"}µ{6Çiño+@;JÍØÇMN[¥h²–E³\¾"3ï³’‘å’}¦EÎpV¼½qÎ ²=Â:û¦ªþëZ°µŒpþ{ú-Ô,è_…7y>/'yi ù¹¥«œP^ÿÖ+rŸ¥CHÃ3 ó+ÉÊ#í6ónq…âX{d«¡¯p~´²Zdß-ÿ4¯ïÎúÒ,6š&Ïÿ§é ÃTm]×;+cÒ Ãù±_Ñìyl/ !/ÝÏ>ö\ž<ö§ñX~óú;+÷+öažN÷=ÉU§Hü4ZàM§4ê¡lTá™ýîü—’l®hܼ4yºØüÜ¿±Ábƒù×·Ÿª 㽚ûÏ«"¸úèvͲ¸có©³4S ê¢Å$˜óÊB˜ëÖ?ä§x4;‚sÐ6ѳ+}žå”ü3+œ’ç‡ì÷¬¼[žW_ºðƒRH<ðP„2ÆœOHÖÙ;^fésOý|ÿ|û=¨ô endstream endobj 8126 0 obj 5863 endobj 8130 0 obj [574 /XYZ 40.7999999 723.859999 0] endobj 8131 0 obj [574 /XYZ 40.7999999 489.619999 0] endobj 8132 0 obj [574 /XYZ 40.7999999 366.739999 0] endobj 8133 0 obj [574 /XYZ 40.7999999 218.899999 0] endobj 8134 0 obj [574 /XYZ 40.7999999 723.859999 0] endobj 8135 0 obj [574 /XYZ 40.7999999 489.619999 0] endobj 8136 0 obj [574 /XYZ 40.7999999 366.739999 0] endobj 8137 0 obj [574 /XYZ 40.7999999 218.899999 0] endobj 8138 0 obj << /Type /Annot /Subtype /Link /Rect [334.560000 525.139999 383.519999 532.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes >> endobj 8139 0 obj << /Type /Annot /Subtype /Link /Rect [293.279999 500.179999 382.559999 507.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options >> endobj 8129 0 obj << /Type /Page /Parent 2 0 R /Contents 8140 0 R /Resources 8142 0 R /Annots 8143 0 R /MediaBox [0 0 595 842] >> endobj 8142 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8143 0 obj [ 8138 0 R 8139 0 R ] endobj 8140 0 obj << /Length 8141 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ðy•Å7 Öã™90<@‹o6‹Åz‘Éò÷#µ¤îiR%>[=Ó6à·šT±ªX¬7?üåË?›ÿÑ|xøòŸæëôóáË¡k;Ùšáï÷¯? ºetüUiÑR3üi¾~;¼4/‡Ï‡Ïý¿/"§ýÃùã„|ýýða|ùaüäËÃßúßþ×Ðæ¯ýÿ~m~üGÿã§i¾á ßÚÈá—߯_%T÷ÿyýÛðð—Ãß¿k~ïAÐÇy‡¿—F®h/§¡äø÷õPô²þÕÍBh§èÑñß~îg;ÑNˆ’\u›gíÿÕÒhC£däq&uÖ¶m*’6‘ê¨09&!"iK#Wþ©Z-©â¢3þ¾}éLëãÒ…JEâJ¯Žu·29¿õ©< ¦G`Ìé•ÇWÒ .uÎ ˜NŸèó#õxËG°_}•Ÿ¨¶³WÄá˜ñÅüÌp竃_µ&Î*^# ðÊž5`5`lY.ìMyȆXÃ1Yg›¨Vp#Pª,|¸äÁ“-%ÚZ&.æL¼{0›9Ì»ÊwžÉðrìIè£ýší²€®o cïQŒÎÑ2ª ÛVgseA®E“Þö¦?@é 1‡×èÆþ ·SѧUf&ã7Zm:yIþ2"fHÎO~€,ó!‹3ûÅ#î\‰‘AxÓDœàI›f»ÈÉ"·R쉶]…ØÏõpEÀÁç¨W ~ >ð)áôöDEpýÇ\¼WÈÌ¢"²œ1 ·½6Ôl&ZxÒÍKSÂzB>EŒÁï1hÌ´mHÿHŠAFŸŸLâ½åÙLCºö8ÂÕ"—Æ<À'AMÈÄÇìÈ*¯Ÿ°‰èôØÈÓ v 2 ™ŒÈ3·àµ1Ž]}çƒvÜoÎqº„÷GÁ'ˆ]‰(2A]Þ(fò䘷¢²I9 &’: "X]•³1B­Ì¡;9u6¡${Çc!õÆ9â0n¶ë.ÖJ*$e} TrkuØO áè'˜Tú‚€uÔ^Cˆc° är$?ÞŽ‰•EJÔ²}ðî]FeÙ›S›½édUÈø³7~‚jè +î:ㆬnçür •"î°|jûºC¿W¢fÒB2á€G Á 0qXp Ž¡˜ ‚î|ÂÂWŠa›Xc´¼ÞË{†×{³økâ8Pyö<ÉypݶšB¬wbgÖº÷·’ã/t E÷Ó–Ð:qŠ¥9æàu|°y›o§ÿ÷ƱCzÔø©j¤œãù“¯)ZB Õšœ¾Å/fá¯ßÑú?†5öh꼃c,Húo™‹YÌå;~9|ü®Üy©G1#:sÓ’šàóKw<¯C Ï Zü¬ „[T,Ú?yˆ¤"—2æî¦ÎšážRgHÄe¯Î‘+FkÒQRR=TÆÚò•ònòêm˜>xÃm—,.åPþBvüÛØ ÚJ\É9¤ÖÍxjW¶.vŠâl×P<^Šž0¨ÕLîÓ‚‚LwÂdûLüñ)ÑLZk`RÓ4› âZ\}§}PìóU-D·)“ö‡­\‘ËÊ¥ìÒÊ¥|ÉÊ¥Ò¶@ûO+wø¿˜…¿~ÇÉÊ¥tÉÊ¥Äyq­Üá[æbsùŽ:V.Sç=~Ï™K íçñ-bë{#|¿å³u‰’v YŸ8á+]@/ÄìÅ0bMC²I‰™§h~¢u»kÿŽÖXÄw“J²ÝÏ€¨VÒÈõ•³ÜÞ‹ (ù’ÍÊänÊ€0*=šZ%£àl2LöírÇc„gõ¥Å8(ð‡_³c¼*Øõà9ÞÎZŽPæÙ¶üzâ‚$òrÙKÊ6.cê>±Ã«¨ø VŸñ˜¨).OÃÉ) QÁ((ƒ.Œ7å0®cÊú°!¦JÞšcÉ|Ï´Ò:2€‰ÕAñî2à.v.®Ÿªv{rcÅ\úäÓñwn7b=¦Ñjͨë@ PðÆâLn¬õåðŠT²uj•Þ†øe°eèÐ-&­ŽÙP¨œÅpqÈ`z§Øª[®†¼¦#ÁS0óxB¸n2úi•$7”åS)èY¼NY:# |Ï|C¯8¥ãó¿GäB:‡DÇìƒ(À™ápµ¶ùïâw‡óì« È 8VíeEµ×ÀÍÊÕG)þ$Wp§$îæˆÌÓ?""Û/Æ«•Ǿ‹ mXQ>›ûqž_‹%Ô<;l?áØC`½IH©Ö[ו¤2 SêDR"›yÊ_"™¥ß•"âµ3IS¬üi÷ð¨ÐÒ:+n*rŸÐ1ÎU¬b  •×;vEùV®ãuq’õˆ“¬G¶±&ÙΚ²·G/Ys*^0Ù³Ó^«LfdÇì@EÅ)›ñâƒß_J!ØØ.z¶m@…±P¡xg£¢TÏa„$å(Óo£ g}8„+²sŔʬû«—›ooáâ±qÔ©rÉÒ}%KÐ Kù÷Îü¦¤§’m‰ãÊ∠¦'(Ÿ]Á1ÁÙ*¯¦8õ<,ªDC¶²L9•¢œA¿µVX¤Sö î­° ·åé}“ï/²öñ`kÝAŸå ðÞR™ˆèvH;™½4âªÑ² žœX,&TÇÏ›§Pf=éñΫ¸-„ öñtÓA‚½ˆ¨u÷Á€ù#âõìI‘ìõ=)’Y4gbtƒoç’ßjò{½"NußÎìaÄšd7 ž5$Ü_Y‹¹EßNùöøútW×Úãã1°}úTGÓËl§n…Ž›ÓÃ&é¸åz‘V÷KØ)ѾdK}Íl{?­îµp&#¬ˆ'°vËÔLjiúZ1 ­ç¾e.åÙ³g¦ÎI“Û[›îïN’,Þ¤ºI7®oaiÕó$ø2Ú²1`¦µ%»pñ..S.ßÓ›eÁ‰~-evùœ±VG,T@{W=2”ؖݨB›å"®1÷\Vs“Dõ-(®J㈇¥ bÕlÉd8½Üaí>âO—°f(°\·Ḕ÷ŠÎz›Uæ•âÖ*°e–'÷o(ÜÆ·æŠè8ëi“‚~†-¢UŒ6ÆuTÎ&^ÏŽϼµ;ÒÞÇÍ;N ™tãàÕO ´ƒm-<ÔÂ2sRDó©ûžÉ½gbšy¸*b¶»šï¥ÏÕüÑíK:rº“r7Í<®©n7®²î‹ p_+2à\y·5^HŠj(PÇãåâ&Vä±Ýs‹ƒfTp×2nIê1“éñêù˜rÅ\@1zL?ñ˜úã€Æ.%v¹J²Ì6w¿ÉÝoŒƒ¿IÑûæÏ Q˜pãÌõó5‹¶¯*rH)CmJÅ”yeiã› d‡ÜpõnĸÚEDwÈ®R—jÒ+úëØ›½@qø>o6p ±=>¾^­Òu(g¦m€œ ÉXÚ^E¿aye:Ѱëuêà &Ì{—4µ ÀH§ØåšÍõ À0ž06ÓÁ)ÃEE>¹—y²ÑÄæ£wSæE±ØcK™WH¹UÎkèBª9vW¾E%rñ»^ žP´Á‹„süV#;âÎÂ2ìÊE‰Y*Yösëï[« ¬—HÈé&VO"~‚oÉšÖà‘(r¿ =ûOÉMuÅÙ‹ `C;(l 9QÏíck•ÜqÃǵî-Ž2qñ1Š3ðQÐîN_ó˜¡ÊâÒËÅ‹ÀWÂ+ÅY`øb¬˜‹:¯~â1ùöøòt¡¾x,&ÊpõVrbò#¸¢Z@„ú_=¶#²C\ÍE”yR®n@«ÝÝÖÕ”0*ð“¬g}@ë¸UiÝå²Ã¾H÷òØõ Y»<µ|-yš(n'e:rìϹÒOr{¦ã•/ê¡qý.àX 8›r˜»·Èy0“lê bÕ{â±Ð·ÃrÑlYM¦tç½×Õ"ôLÓK6»b„þìwÆÀˆöTBX«¬èôäÚS-³©zÓÑö¥Ì†÷çätw8¾øö7üÕ~Þ’vT£ÄŒ—~¾â4Ü;ó˜ ?…z–xRp ˜õàr ãáÌp=Ø0¯>dá­;Ù’!ÆuÉ“²¾ôbŸ\ÈèŒò¹ù|ø?LG- endstream endobj 8141 0 obj 3901 endobj 8145 0 obj [575 /XYZ 40.7999999 486.739999 0] endobj 8146 0 obj [575 /XYZ 40.7999999 432.979999 0] endobj 8147 0 obj [575 /XYZ 40.7999999 362.899999 0] endobj 8148 0 obj [575 /XYZ 40.7999999 362.899999 0] endobj 8149 0 obj [575 /XYZ 39.8400000 128.659999 0] endobj 8150 0 obj [575 /XYZ 39.8400000 128.659999 0] endobj 8151 0 obj [575 /XYZ 33.1199999 511.699999 0] endobj 8152 0 obj [575 /XYZ 40.7999999 687.379999 0] endobj 8153 0 obj [575 /XYZ 40.7999999 687.379999 0] endobj 8154 0 obj [575 /XYZ 40.7999999 486.739999 0] endobj 8155 0 obj [575 /XYZ 32.1599999 513.619999 0] endobj 8156 0 obj [575 /XYZ 40.7999999 432.979999 0] endobj 8157 0 obj << /Type /Annot /Subtype /Link /Rect [263.519999 459.859999 326.879999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting >> endobj 8158 0 obj << /Type /Annot /Subtype /Link /Rect [78.2400000 372.499999 135.840000 380.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore >> endobj 8159 0 obj << /Type /Annot /Subtype /Link /Rect [132.960000 85.4599999 182.879999 93.1399999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps >> endobj 8144 0 obj << /Type /Page /Parent 2 0 R /Contents 8160 0 R /Resources 8162 0 R /Annots 8163 0 R /MediaBox [0 0 595 842] >> endobj 8162 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8163 0 obj [ 8157 0 R 8158 0 R 8159 0 R ] endobj 8160 0 obj << /Length 8161 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès€m‹¤ž@ÀöxäÀ°9Þl‚Åzgùû‘ZTw©d-µg Øãf‹*ëÅb=ÞüùÓ?Žÿúýøæý§ÿ¿èß:T§ª­æŸãôç‡ÛdRrþµë›“¦Ÿã—¯‡oÇo‡‡ãßߢ=?¨ÿ—WÌþþå·Ã›ùå‡ù“Oïÿ:þö¿£<þeüß/Çÿ>þó“žoúÂ×C?´Ó/¿Î¿)d?þçö·ið߇¿ýáøÛBžwúû‡vèÔß.ŠóŸÛGÑËÆO:Ñ¿ !Ç¿šÿýçáçq¶ §¾VBu²©Ç߇¶îª¦ïåø{§ôOЛ:9½ª­šãеGYwÖ‹¬õ†M%b'ê‘f¢ "·4QO;§:õ­ìê¦zø{0ÄR óÒ›ØÝ¸Ì‹D9­9ÉDD"jez3ðL#Îõü=ä=ýôU/ß8òµõš¡¢›8/˜¯g´#Ïž¹m”>‘Ø\¦ŠÞ–¾OD(D"niËã©R ?9Œß>/]Ô±‹¿L9‘ªê6ÍvL‰¸¥-ÛaMõ1‰²”WeùÍñà»Ï‡7Ï¢Výd|þy„äl`Ìÿ|—Û˜”æä矎¬*ùþOÇÏ¿†S3¨®™-ïˆ@#¢F#ªA#Õ;úˆ€°U=|¦…ÏHµB#5ÄÂ8Î#>4‘}‡;ñ¨;ü–½Ãe0?\ÞúB ©ÔA¿óxD\w?j >¤œ̃U—jÝXt]Í‹õ©&ÿ™`…85uÛà\™É²¿~0¯¨>Õ3Øv§ÊZëøÌüâúºéóûšñÙ ÙT.H>À¯š³V fÏÚ™àg¸¬™Ú“ý*3¯Íf½OGjeâÄBý[Hs‘hQ83×¹àœ£c߬=°ž…ä/ ûgÍŽùÁ| ƒÖ´híñk(tŠ%‚µÎyûúS?TíK–ep™èà^¹…¾Y!,ááÛòœB½Q†TÇÐh3¯@æ81˜“Àý`‰²ÖsH!±fau‡ó’—-óbœ€Wm²Pbó$~– –"^“Æ ÁÓèÕúª€w¶pgˆTã$]"‹=0u† j?Dtó!£Ôï‡Æ”úÛÓ±â]*4ŒÇ¸a ²=caâ%qŒÇ«jþ¹B÷TËZ»ÆOôgd ŸÐ3zïDujÎ[g1YªµØ¾Â¦´’mór¿E G$‚M4 5„íê"±p0ÓˆhN³Ô q@]!¨Åúzxø†TÏ;É\j-iòÜ}&XáЃš7$ø=޽J†ãchoZÄDg. ÆÆ#˜ù®ø'÷p]%Ì3Á ¦èŽÉJ0 8>lÚd9PÛSæç…yBt¬œ±›a*Àï‰qàC2)d%¬U]Z°¶3†ÈïŒõ1dNåÑv†öˆq$+ööã÷æÁz¸°³'+äV±´WG;>Ü'‘0Xº‹¬g¹Ž¼… ½ƒVÀöÙW_å½ì«gé0ž™5ÅÁ‹Ú‹ah_Kâ áŽ<£-¸iÂÙER)qåe4–+— È¾[³-›r%B¸¿Åjã“!»‘,!–d%»b×bi 6ÀPCØpd Ž®áD¦¨]®GG?åW7ôªcÃV”C€-kòz³lH%LŸäu|äÈNÛ–ÄfËݪ͜ÿ„t+Éö¤d’œ÷- ¹kK±œ2i3 vð{Òú. A]ÐT»p™ãs»é5¥Äx~ƒLVÆ~PRl ·ï…­¥aåÂ;’Ï>uαA¨pLŸÒ(áøÙ2¯`Žá#Á€qøW0ô„Œ¶pÑ¢ÌôVBº\ —…GüÉÖºD D[>b‘fz©¬gõq¨ˆ'ÄŒ³à6pSq€íü ¬ƒ­¾-;ÁÊÙOW×õwÖBæ8å!^#×ÐW$ Ëèœö`' úº¿+¨”Ã'¢z Vu‚åî üXQ,ÛË’y½œôYyõù¶Š°å-6<߃½WZ8ÕIë‰Ú%Þõðð5,´Ï ÚrJ~MˆJÆJ» œîì°**«ÅÖT¤«L®®Gê(ï°’¡N)àÆñÜÝ©š­»°íAðˆzWãðà퀜k‹¾1Ö¬ñBu¤¸ÔuMSw!É1zs©“ž`GUݲx”‘^€å-°è>¢²SfZ$Çu.h+¥¬_bˆd€:®ƒ±aˆvØ0ÄÅ‚(Ùˆ ]ì¢f­—«f\kY‘¤¦ÐDB6‰Ù%ù’$„´øèú‰G­IG·_Œ¯h”‰n±ŠñWóIÔ̆¦ä¸yXhÁ¶µ•U-¨¾%ªS[ŸÝ¢P„–?Co€²œ!n–üÁ¡=­–£k XÐöÇê-B~FK¼q=m'^ÈOµGðlŽbeð=šó›Æªk_êƒòEA2•^ßÁ…’mòãõYÇë ~ðJSÙ{ÔÀH ˆÎIR”-¼`zB˜ßPœÐÓE™Ê,¦V,ÇŸ‡ã¼Á8¬àï]ŠdÍ4uƒ#5…ã Ê7¹þe ´ù“ U ª‚F¼Û}ʺšØÅK¹ýô^ZS® ƒþçývWÌiÏ»ØM–Øñë¡•òöƒ_Ÿ²õC¤5`V!ñõ5ïäSž¥ä¸Æ¦:à´\Ž1–C‘Æ\ªøeþKΦú‘!qžŽ tÏRn8õ€-Fct¢¸æ·ÛÅaFZ1Q„ÆY¥‹K&sŠúNñC@ö,^qhNüƳ¨êû-Ë1ÖJ1®ùô¿6’̃à猾1ôÏéäå³ʬ[æáûG“ú-I¥—&Qúd]æ­—»‡½™ ·o©aÅp‹%nĜĻ÷ê¾¹»û&Y¼ŒƒÍdÕ¤½e» ½ ܹaõ˜JÌ;pÔ–ôw í’X„í8Çãìsj®!Ô%O_Cßx×íðpÎ1ØžI^æ]·ªdŒ'€3¢ `JЂ#ÍEõº\«gtôFg]+ÞRHþ$zÊ7„õ–ÁTÑ3ÿ¯%⿇”•²ô嬮¶ñö §¯Ðlú.bÍJ±Ö%á$fù}ÉÖFÔúd f݆³òRtîîQ¯á6°}§éoÐIÂßÃ]XјØ]›éµóIkX±"gÓV·Ê’ãC‰á#tV+T¢‰SWÔÁJÒ¥¤gÈ/Éš,(L%’·ñ+æ)¼BVÚlí¨DFSÁÔ2¯(ãX%Ä}!œ. „Ô›«²k½–; øsÀÊÐŒJy„ho‚GLžQ„÷ƒ)Â{j¡…A“…"zÓeš2>³68æ¾hJuCƒòB¥n”¸Þj ÉäoŒÍ±Ö#²>Jëçí„’Ç´•¡ØèÖ,uÏ(¹dX÷`M†g‹H€#´ÜËtĹcfÕÔ†hI[»n{WH[ÙTža_¸Uh¡#}ž†‰1²^{óEUfÁÛ–By%±q ]-8]… •Ä)y²92ç™JHSÍìˆç dûn<ÅiMŒ,å¶8>Ìü?Ë9°é¼;—Çvñß±Qša†ãD,bOAø©$ ±–SÇën7Zåk0–.$Å`òÄw{æH¢SÍ&»°ŠÎ„ù3â{]EGÉúöƒ{TÑQ:tè†RX­¥¯3Êy‡Ë5¥ö(6ËY‚ÀoqqþšÀ+Ú`‘ÁCK؃¤å’â>x?-ճǼ®Å I˜Ž|bËÚ¯7å2ÃSs¿Š_XOÆ0 6è Òr„nκ5¤R-„’n²Jlùä3.P0uPíNÓV‚š#xÂ2‡ñÅD˜X朥EÃ'Ø#"4#2» î‚Ó¦ÀØL8Ãâþu| ËUÛE¶?¼…[ê²$¼\µ‚ j.µò †> ©G ge¼/ ôùÏŸ²b¶,) wè¤ Òq)î¹(æzL¡ß-y2ãß•ÆÜ“øqÙ†·hs”‡À¥Ép93\Ú §`Â/Uöb§ªîLì†ûð)—œ–îð¿óâµúw€#•à_ÉÛåÎQŽÛ¿ÓyýoËãŸã·‘×FVš¾ ÿùò•丿¹øèä[ç£þláö(Æe¬±ü ÚÓ\¼YU—{º|s{j׉q¨OÒæ–Ý©[—ìVFæ-Pê$ãô¬i 9µ3å˜|¹öž>3ÀgfÑÉ“¬ÔË,áwp¶™èn?y‚ßÕ2be…Ïè-ÖFZ‡–c´gôŽQÖ®a;3@ÕM¿ª¼óî¶À»€éÓŽ¦a=£{Ï·•Mñv´ü_ƒï†E;Ž]°é ‚wÙAÇjÅäKÌIð=º|ÖÚ3·âKÙ3ž™ßÓô'5ñF°=£÷`¼aŠÐ¹¤L3Xvhk8–sû¾jOb ö~ÉÂÚ.\v€#7×åSjÒãÇÃÿ!^ endstream endobj 8161 0 obj 4673 endobj 8165 0 obj [576 /XYZ 39.8400000 479.059999 0] endobj 8166 0 obj [576 /XYZ 40.7999999 119.059999 0] endobj 8167 0 obj [576 /XYZ 39.8400000 479.059999 0] endobj 8168 0 obj [576 /XYZ 40.7999999 119.059999 0] endobj 8164 0 obj << /Type /Page /Parent 2 0 R /Contents 8169 0 R /Resources 8171 0 R /Annots 8172 0 R /MediaBox [0 0 595 842] >> endobj 8171 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8172 0 obj [ ] endobj 8169 0 obj << /Length 8170 0 R /Filter /FlateDecode >> stream xœí]Ío㸿û¯ð¹ÀhÄo( $™¤À&@EÅl·Å¢³hvûïW²h;!õ#EŠ¢%Ç 0ñ˜"ùø¾ùøøôù¯_ÿ¹ÿ÷ïûÏ_ÿ·ÿfÿ>|ݵM+Ûágßÿ~zûÕ £ÃG¥ECMÿ³ÿö}÷ºÝ=ïž»_wD:Ú?]ãqŠaÀß¿ýºûýö¯ÝÏÝh'0à Q’«vò¨Š†do”Ü3ʼA½µMŠÌH(Vf "2oi¤å*?™Þ@¿üÜq°òß—ﻎy?õª“uÿûiÿç¶%ì/û—_v¦QRH*nÁÐÒÒC‹jZÔhß¶ðC oøÐpnáòÐB=4¼é£-²¡D;£= £Myƒ„[¼á!ôTZôùQMYŽtGõ¦IñîÐBH#¸ìgL“€W¸NB†ùè±éÜbœùˆ‚ÈšN:¬Btލ&ïØ‘´Q4²t† P8N6ˆOþGüøÒé„yN8Ó@ȩ֎”[PM#\ÔÐ{ÔÂ$la°…—ZR`ŒIwmAIpÈLþ î Àt=@´ 8U.\yñJ¡¯K¦÷õñä †÷µ ìƒ5bŽÁ ô°qæ*ö¬B€ÙXVC E\ö1H§¬»`ŸKj(IŒ³¶8Á.®²Šh¨hÛÍxv7ÙfßtÐR:豂–Pb$Í”BbÝ~-ÐÁ±k’SÔBt—OïCaK“4@u]O 3Jã.j ðº1í1¿äО=@Ø(„í.¶¿`Ü©ÐB¼ašRR‘ûä,y„Ô `Òór€“0æ±ÃÒ„¹ã Òö2Gè×C1°l¶¨…à ¡æ˜ÚP6ô¹ám«xÃv*…1Š[LEí­ÌM{ÏÓÞ•¶Þ+¦ -TV7ª….¯½W¡k8QÑ} »¯“ëÑ"ÆÄÖd›Òw•Û\OÀ>c›žÁ½8†€×ƒõXÀC¨©Q„ˆÂsm4 ¬§’ÞŒ†ñVVÒkZQuŠç~©8«a뱕Æã¾6[™ÎÑI8»v "ÂSM{^\‹¢8X÷U´‚‘ Ø !NkÅ{¼bðDò4e{4•í`ºGŽb'¤‡)ºÑ¦ur:0NÈa¹ö#ô2©_xøéI—)¨Æ@gdí¢ä#އ>źXW`Êj¬ì%àAîc¬| sx9Ö~bNBóZ’]lÔ.Iü&ç¡eeÍA P¢–Ϫ”ÄQû7-XM f ‚%Ìã8<üt%—’2‰| W$F0ÚCpàþÁt]æi|!¡Ö®êFD^Šã) ŽžZj¹üÙÇiÍÑŠ!(–$=ZJÆñ‹W‡ã>gñÑHBŒ(Âg@šÓÂp$@U\· µå¶R–Cض+·J‘›Ü¾ÃˆnMe¹åä^2ä⥆®Óݸ¿¿›òùâ>aœ'¬v#âèµ}ýÀ˜u´ñØ1ŒAÿ¦Ïcã¶c¾›»@{l¥§¬ BaÌ̓ÑîKÞ¸ëp“ã…x VÁv„`úŽnsÊrH±°w$àkÚS†Ñ0åØMooã1à‡´T$üè¦vÞ:!éwc³nëz¡Å”ÝoN|4a¾œèÞ1¯6Øøb•Íñû2r˜¦ŸÎÁÞIBTv ôRGÝߢS`½XœpF¹—ËGq͘ é)`÷‹Yç}[öOÊpÿúë|_Úâìâ!Ë  ”4*¢*0- VLZÐ6"×k›.}ØŸÀg½ì¹ÙØÚ§Â•Šè7 ­Sj®Ìqk=Ld”aóÓ%xTGô%– Ÿ£¾úpZj¸‹ÝÅMõ(0ué}?$Ã]Å}¼}n|“0/îä˜ ,Ç9ÌðRH½Ç©HšÕvêñÄâêõ_‹ ²NJÞÝ/YkϨÉ.i€9Ù‰ÓCÖ ‘Çô »äej!/“O¾ÍýjŽGb‡vƒ§êY ¥¹ÃG™»Êa™…ÊXOùÀ| ¡bÒ‘0d Ÿ Ó,“B\Â@–Ñœs|¡â€¯Ç).±é(Û 5®£Þ34†9–bã[Œz¹ì¼%§ª·Ú·×Xû–·‚Ä)|«}{­‘_œÉ^‡û´™Ác9µ50'a[r견¸êmÍõR0®× õF«®Þ0zµ%9¡«ª-É ßË»<ÇݬÉÍš¬jaÃZqÍëÉ©å¸òÚdœÈ9Õ- ëA¼×¸Â;Œ*„Ž–U7-öÊ­õr…®}ߺle<¬yÊVÆË©noc´¥ôEŒ¶l5´/\q÷â\=ÜÕsSݲšÕÉ©¶Œ#o8"\ôMꊪæñº…«oÀXdNôŸAX0•| ¹Ö¾¶oL.±$Áyl²üXŒ[…äÒHë3Ì#tÆPì„–lOhŒ7Ì6%)©ó ÖÖ Î•\­[Ù¾ˆÞ{¶¦y Xi±Ö´ %Ý?ïþ‡åz endstream endobj 8170 0 obj 2907 endobj 8174 0 obj [577 /XYZ 39.8400000 262.100000 0] endobj 8175 0 obj [577 /XYZ 40.7999999 282.259999 0] endobj 8176 0 obj [577 /XYZ 40.7999999 282.259999 0] endobj 8177 0 obj [577 /XYZ 39.8400000 262.100000 0] endobj 8173 0 obj << /Type /Page /Parent 2 0 R /Contents 8178 0 R /Resources 8180 0 R /Annots 8181 0 R /MediaBox [0 0 595 842] >> endobj 8180 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8181 0 obj [ ] endobj 8178 0 obj << /Length 8179 0 R /Filter /FlateDecode >> stream xœí]Ko7¾ëWì¹@Ö|?€¢@ü*ÐCÃz(z(’¦EÐusèß/%r%e¹w—KÑŠ¼6`ɦ8œÇ7C.‡C_ýøø{óç—æêæñŸæ]x½yÜ–(⿚í÷›ã?0Óræßj#[f·_Í»O›çæyó°yp?Ÿ7Tí:†ר á ~y÷ysåßø¿<ÞüìÞý×°æ'÷ÛÇæ×ßÜËû@oûOcÕöÍßþ e”÷Ëñ»mã_›_¾k>;ÌŽîöçe­cU-âãyߕ¢ÁÜ_´Ðœ5”2ǧtêø÷ÍGmÏFk§\3)Ü{«„&ÒæÞk¾&¤Y7”ÕªáDDEòN#E’„Ë"„¼—‰F‰ÐiR­”ê­&Ù‹éH{Õ3¾Tc©ÅªL•!´åˆ.-¨>Aª¤'H¡õNtfäb-R‹µ¨-dWÇ]&ZgL*Û\töbêÅ‚îI-$¤ˆ*ä [Žè2Ñ:ÕcR%=A9#îD7î×…ZìH-6‡5¦ ¡-Gt™hÁ1©‡"kvXC<':^?m®î©àf»dzúà8Ù­»üË“W6o¶—’ÍÓûæ{BØÍÍÓÇm¥ån’Ý-ÔF[(j¡¶(H-§Ï¹‡-װ厣çsM F ¤FL† Ü÷¹{r¨<9ÆŒ¨Œ±T06¿—H‚-£âmÆ <œÃ,iE¼Æ*㥚¡—µ£€:8 « v#%Ùé Æªð.AY×4¡OŸxœ¾Eê‹”Çc÷}sE:ÃÞ&ÂvÒ§>ÝS1æÃ@Šœ«Žc†8iÄúŸà·ˆú…ø”“‰’ýÙä$>‚(î ?aoØ’ˆÝ}AÜú~‚é>Àé¨/&ü#k ŠBòŠÉC–ø[ØŽƒCXBX)¸¥Äœ‹×L,Šn8„@]ÄDŠ8Äôé2ÆcŽÖ0¦2‚t4“b–ƽ) lØ2ŒA¯Ç‡ h%ªâ싱BÞ g)'zo–šUcáaßð°>åi¯¢Y1kå?ãù,cu2Z}Çž+<ûî%4²VvñhUž³²~µSg¸‹xŒú´Ë³˜ÕÈ­°ùf<ëÃÆ~==®Gò†•y•-<Ê» vŽ“Î·°oÃ41ÃÛɼ5\6·o:€[УòÔ±°–ãÆi ¼m]”ZŽ…±<üº¢~­X¢ÅŒ¤>ƯÀ^Ó; 'i¡<S±’Q>SpÂцãtSÑ8Ä` [K@Tœ‰M$íFÅÈÆqû >ª„cvŽ×Á>ØNiæ´À™ã' Ï" *™~‰øËŒÅHaôdÄl׈Z(Û¤¤•»Š°£?Žny¿X,$aTËw)¦ã–1¦9Hè ‡ƒ;ÔBŠ-!!ôéc/Ô}´‚õ¬ˆ%'ù‡Z‚l²õùÀ£<Î lÁÚÅVô./[¦dÏŠù¨,c‘ÁU;ƒÞ QÙKt»@âèÁ¿Ÿ Ñ(¶ÿ‰àïyáë^ß®:;®ü ÊÂÒ`8T_5‰<&RÌ’#Ùx£»ûýñx݇âœ$Õ˜ì:^s êÄP?·Tµ¾Ø‚“ýåû¡¨Bµjø_ŽYÑFs¼w9¦[=|ãœhñ+0Î[f/˜“²U~ÍÐ7ÁÐ8ö±°;šµŒì*HúÓá5ÄŽÿr ?CHxú„À:ÔB‘!èÏë,6GöÀÛΠnûžIªG­M±00vhÔ'Ô*#b'tâ[#ÂN 1Î /ØÊ CÔÒ[è—Ø“à8át×P¬[ü’™Œ>~iºŠ¾ - ÞîÑ8XoáDÀ¬Œ;ØÑÍÏ5†¨–në ¾váð$0Ĭ…-G,=”œI›‡Íÿ`Ë endstream endobj 8179 0 obj 2470 endobj 8183 0 obj << /Type /Annot /Subtype /Link /Rect [430.560000 389.779999 490.079999 397.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features >> endobj 8182 0 obj << /Type /Page /Parent 2 0 R /Contents 8184 0 R /Resources 8186 0 R /Annots 8187 0 R /MediaBox [0 0 595 842] >> endobj 8186 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8187 0 obj [ 8183 0 R ] endobj 8184 0 obj << /Length 8185 0 R /Filter /FlateDecode >> stream xœí][oÛ6~ׯÐó€*¼‰`Ðæ2`‚ØC±‡¡]7m±¬ûû£,Ú±E”DÑ´œ0bÅÉs>ž)êêç‡?꿾×W×ÿÔÜçõCE"IÿSw¿oö¿`ºá¬¿Tºm˜é~ê_«§ú©º¯îíß§ŠÊME÷a ·]ô ~ÿð­ºê;¯úo®µWÿÕ¬þÅþ÷¹~ÿ»ýøèÚënøZi#»‹/ýe”iûÏþUWøwõÛõ7K‚Þ´Ûý}£1F‹Et<íªÒÍï~UÔ™ýFI&tM)³t¶Žÿ¬>ÙÖvd4ZpÊk…½6R(ÒjÍìµâîgROŠu]Qªj£¤½d^G¿Óš¢K2Z§i¨£ˆ.c¡ÂM5FØÂn&ò†:E)ٰɈYÈ让¥ˆ)NÓ@¿¡ˆ.cÍAh*¥&(.Ó²E×ÔR5㉆££ˆ.cm;^S÷I,'{¶œOŠï««;*,.Ö2>~²”l¼MÿñhÙmë7Õ´~üXÿH»þ©~ü\™¦5\µ½{-¡¨„ TÂ[Xò¶v) °,6 9%˜6 ë0È)‡%7³)¹}´rtj©àd|É-DDÃ:°÷ƒKˈˆ½!žÒ˜¥‡(ˆÔ-v3¿W'¾Öxg¶CP£‹Z2m±CˆªåµCLdäNeFVl°e.öÁÉ‹)qÊ!"-Ó™5Köù5¨è‰“ ;#-zr€ˆ,Ò–´X²±ÄA= ”¼‹ ê=n`Ý‚´Q•o„%ÛFJÅ–Xb‚¼Vlä!"ú4–—(qÅzî¬'Æ-‹T(š=Â4P* n ,/X‡‹%ìG˜—hq€ˆÊ- ¨'8“‹óÂJ\L?®Nä5ÍÅhm, xmÀ–£X('¼ÄjDTîXA¹c+WY1${œ­@±k±†•Øf€ˆÌÛ`˳².1(A: ”‡lvË€’­dí>™=z¨)ª!@ÊÚ†3M ÔéµX<ÑÃ"Ñßé ¤lÕ#PÜŸÇŽ~!i ðhíG›²m‡˜4êÑšW­a]ÖTJ›VÈû$¸Žhõñˆ‡uýáóÃbGzŽüÀFÒÈk Â㇛Ç$¹ä…Æ_`Ò| žÅtCŸ¹gŽ1ñ;P’!Ï”>Z¯¸dšbø›·"BN?Hœ¾–?gÄËX\Ã{nS9„ÑMÒÊÞ±µ8„ÌÂy¼á?:Š…9§À6mœ§ŠØ ÀæœFùÉ3ºd§p“UÄ›÷WñPˆbd0‹˜¥©­Ã: G I”v§-Ácö.²aôa^žïAÅžw¯)¿ÔjW\òª,Uìù@Ø¢MzÀâùu&p\Ö™±:yä¿UEþ/\þ‡‚­Xþ[L5”ƒ¬š±;ʺhF°dÅÇå_þË!iärISìùàòb.Ô¬Ù;l¤ºØ8»ƒh:[3²Ã„‹]Rç´O!–4ÏtöÁ¢]«=òàå?è¸d¿oÊÝê'ߎ±#$ÍÃ$Ó7Åô—sÝUíAÙq‹X ÔÁQ^]ðŸ#Ë"¢Ì€ÿ„­Å¬b r®þ –û¥3«YG˃¯˜ ó¯éÈ=%Tî—É­c²{Io^M[ÍZ^|yy]Ú•ûui¯kTÒWû¶<øòâ;ˆÈܾ3ã •"å5¨ç‰M»4ßië'˺e«»Á}Ì|›øÞs†÷AƒUGñײ¦–#ðsCe³ÉÔœˆ-h½ KÙÈãÑx  >­ÄT£†9°Nu¤¤w¼œ7Ì}®»mÙ'@†nüX?Ö1°N¯dŠ5Œðƒ§vÝdÿXk½ØÿæÞëryG8¼Cuœª+¡ˆ7¥WÇØÞmX uÝ5k©mŠGË–'Ô«Ãz,$ñ%ÊŽËÓ£†';Qðå Ò‚G9 ÇPjé ÔK¬I°÷(ű:[…ô’éˆ:}?­nx¿Þ0¡$@Ûêã†%ÂM>f•`™Á¶ƒí-‰-Ð\­‰l¨¢Zª°Ës#ÖŒ(·ó¦ =i}_ýÐSHœ endstream endobj 8185 0 obj 2159 endobj 8189 0 obj [579 /XYZ 39.8400000 547.220000 0] endobj 8190 0 obj [579 /XYZ 39.8400000 547.220000 0] endobj 8188 0 obj << /Type /Page /Parent 2 0 R /Contents 8191 0 R /Resources 8193 0 R /Annots 8194 0 R /MediaBox [0 0 595 842] >> endobj 8193 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8194 0 obj [ ] endobj 8191 0 obj << /Length 8192 0 R /Filter /FlateDecode >> stream xœí]KoÜ6¾ëWè\ 2ß (¿ ôPÀ°‚Фi4AÝú÷K-©õ®¨’(‰I³²¬,ŠÃá7‡³ÊÕ¿Õ|®¯nÿ®ß†Ï›ÇŠ4DÿS·¿¯No0Ópæ/µ‘ ³íOýöcõ\?WÕƒû÷¹¢êÐ1|¸ÆnOðóÛOÕ•¼òwo~vWÿÖ¬þÉýõ¡~ó«ûxèµ|¬ŒUíÅ_þ‚2ÊŒûãôªmü³úå»ú“cÁè¶ÿ¾Ò„1JÙ">ž]éá÷´+ÌÝÑZ+Q»¿ŸÒÁñÏïÕ{GíÈFc§\3)ܵUBi sך‡ŸI#iÖÅ•­­Vî’DEóFŠ.$d7«:pD—M¡Ó¤+(Õ­& ÙO³T;M‹x&`¥ÅÈ ²òŽè¢™à1¥5ÍÀéu—3¾C¹’hCW’ªluwÑÔ:i`RÙf`‚òZ¹tžf-3°L¯CÈ”wÉÌ:à!¥UÍÀ åÍ@°ÅRK1´Ì¬$Œ–#ºlj4"R«Dì%zxNt¼~ª®î©p«¤‹žÞ;N—ÿxrÓ•õ«6ŠÐ¦~zWO»ù¡~úPÙFZ®¥ÑF[(j¡¶ÔÂ_Ã>÷H #°%l}dGýäQ(‰Fx‘ã1æ"ÿô½䠜vÁï[+yÎ Ó}Ñ1„SØÝ(†W.J)Ô™Pƒ€†„ä,ß ¢ßŸt¶Ï|l* ñ÷ÅEŒa墬›EßS«†,$ÉFbˆ,Q Ì@Bô“écò30I(Aä'¡ŽÇ˜pÈð¾f óP~ ("òHB×ýùE0Þ wÏîÇ “FÀÙ`i%t-2H €Ø„ s„À–>]ŠžSÿâ^(¡fØ6¾âå÷Trç/Z˜*6[Ü’#®é2Ò±Ø×`7ˆ™Æ+Ý×9îÁ„†Áç’…Š€÷eŸ³ZÆ:Ž}$|Û$ÃÄÒšl” Tf,õÆÀ`+6µ©qí† ¥¦Ì“ážnw"ʳ®TçðÁNöãDNeàƒ=||S&‰ ìÃ2R_ à±Æè|ÊHØÈsÝBãÙ%deŸè“sxŒ©ÁtdBû „1<‡kœ^… gÇá˜æ'1n8Á ¹Îâ ë[n¸%Qlƒ¥¡!9‡9%¸(‚—J nÇÌ}7²ñnd0:+¾ËšçhÅŒà|ÝoÁF~£ æÏêçøŽ)¬²“v“X£"š‘^’]_q»·¡oåÖôœë¾/*5‹cIk±B„ŒýJ¢މðî''îÀQYÆ. QÚ ©áÒƒƒõ¢¥q“”–Ö±U÷K —¿cÙÃÝ)‡{^î+5FN(龬Òy,g.V:ƒs-å¾hbQ¥í¶ÐŽý²,ZM(¨¾,‹VÇBçb 5»¤EkR|%þòy®‹²u=¡ ú²l]ËÒ«7‡:²ž­ä(ݶcfÅbÅmå¥lŸu¼OËØ ᯚ$öƒÐRxÆŽt“rú/ä‰þ1Â{Rœ“ÌIìẽ(ã¶FÕ*Å¢9 ÄùU3r›Yyt\mØO›çT×lšpÞ2ÛiDßJ.6Û‰õºdÔìõ!“Ö½ÿo}ˆ9Ö‡ìqÅÚqÞÝòœÝÁ7TK0®—–ˆQä÷º¥”çÙë–öº¥Ã|.¼ni‚¯ÑÝéú~Ú›”Ö~Ú›¯c¶ø« ò=v D¬Sšq-½¤œ¬%²øË¾†Uë¶Ô¥mc‹X¢V”î/Ëé!"·±¯üÔÒRS|E)åA‘‘}ê!"J¯BÓN×ÿß8R`%»Ž¿LGÕÔMc°¢—ªæÑ­ùKŠÃ£RêbhDã‘9iñÆÈt£û‰z´hñŽ‹ó†ÙÞ· l”Op÷E04Ž},ìãS6š5Œðó·ê\CjÞ‰Þ¹…φó“Þ£>áä`¨…¢y„ã€y}‚ÄæÌž¸ÂZ×^3y ¸±´)–Ö¬;AhÔ'žŠÄu'œ q¥éNB ±žA^°”z µ6¼ÛjÈ.±%ÁqB²p¨ÆV#» aï¼>~iîßl0¡%ÁÛ=ã†5"o³Z°Î`ßÁNÞ,¼Àr!ª¡í nÎM8d\†˜} М®¦+®¤õCõ Û¬ endstream endobj 8192 0 obj 1918 endobj 8196 0 obj [580 /XYZ 39.8400000 334.099999 0] endobj 8197 0 obj [580 /XYZ 39.8400000 334.099999 0] endobj 8198 0 obj [580 /XYZ 40.7999999 772.819999 0] endobj 8199 0 obj [580 /XYZ 40.7999999 772.819999 0] endobj 8200 0 obj << /Type /Annot /Subtype /Link /Rect [367.199999 653.779999 431.519999 661.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 8201 0 obj << /Type /Annot /Subtype /Link /Rect [316.319999 712.340000 329.759999 720.019999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/tlist.html) >> >> endobj 8202 0 obj << /Type /Annot /Subtype /Link /Rect [277.920000 686.419999 297.120000 694.099999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/typeof.html) >> >> endobj 8203 0 obj << /Type /Annot /Subtype /Link /Rect [411.359999 686.419999 447.839999 694.099999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/overloading.html) >> >> endobj 8195 0 obj << /Type /Page /Parent 2 0 R /Contents 8204 0 R /Resources 8206 0 R /Annots 8207 0 R /MediaBox [0 0 595 842] >> endobj 8206 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8207 0 obj [ 8200 0 R 8201 0 R 8202 0 R 8203 0 R ] endobj 8204 0 obj << /Length 8205 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èón‹Q$Ïxä`àrXäx³Y,Ö‹8{ÈßÔ¢zÔd¤øl©§mÀ3EŠd½‹UÅùòÏý¿ÿØ|üòŸýWýóñË®94¢ÿ쇿æ¨<0:þÚÉö@ÕðgÿõÛîûþûîe÷Òÿû}Gı£þÑ7NŸüãëï»ãÇwã“/ëûßžîÿÚÿï×ýÿèü¤Ç^ø¶“J ¿ü6þB(¡²ÿÏü·¡ñ—ÝߨÿÞOAÇþýÐ5ŒSž6ï§®äøwÞ}¬Ò)*û)ÚÿÓöÛñßí~îG;Mã 9#¬£-ïW‚wM+%íï˜þ³èKí?%{Õ‰}ÿØúµÞeC‘ÄúåwY:Έ¤-4¼suPœnÃb Ëœ—I•ºcÓPÉ[/[šg aF$mizëC夥6‚£ç ‰‹Ÿ†JÜEÙÖäÇ0#’¶´ x¨Œà oÉȘ(KÝÅi¨dpt]&¸3"iKÁqa¨—,‚Œ¾ ²ïŽŽŸ^wŸåž¨ýëÏý4Ž’üñúmGÅþC0ÃÜ^Úÿ©ÿâÏû×_wêо© c }@-Mwlᇮ5[àh¸Å}êC>[9´Š ­o}>¡Ñ;¶ôºŽh÷!Í8Zsf-äØ"Œfßy>¶È§DžÍ€<–q=Ÿ_{„H¯t² àí‘ê^qÚ\¢'#Us¾h *ùö Õ»ÍY×^‚ÝìU_¥Ç–îÐŒp™µ|ÖÛϨ$ç3‘z“õ~ÍZÆ­äo;3<îcg¢QDš°t<°7O1b?‰5¼¹úÙxƒ>ûº4]Æå‘všÉ[Ë\Ö•r1l¨I¿Ï„)Ô×F ÿÎ_ µ­ fžxxkŽ^H‡à| áÀM²èÄ1¼µ¬\ð3x樚Û:­+Š=gòB™\þ \=^ÁÖ–©æi¶¢#gseôpŸIÜ7Äê¸%ylt¶´ƒ“`vdmŸù=Î|œÓ!NñŒdU ìøp0Å-’bZpj¤ƒ-pJ6C¶–#M"‹/xÒ˧†×‡AíÇÂqæÇ› 1Ž_ =úÚüÕZ&ÔâÒEÑÖ.1˜I¸oa  ù6j ü•!™mN §H—+@z£+X޼ËérZ[8å!Æ všL©¹ÄšÇrT (ú´œù/Ÿ‘ Á„Õ„˜[•,ì;oñDH·(66 0±BÒ·Y2‚äËU‡Ì[>i YUa²Y<‡¶®nùÖ¤ŸñŽ|ßÁ¨L‡_€%÷vò¿%\åÝ«îÓÆÛárðRKLçt]Çø"^1e“‹×ɦüþÎÌ»OÑ]mކ¦uXâM ÈÛÊá)‰éÊšòRFXdIy¡VTzg`±„3‰b·„4µmª©¤µ&ô [l‘°…–– Šsm’Ö,ë%‹ú›%¡% G O:`åa¨ xD¢ež¿)‚µÝ‡âZ’F7ÙÖÕ²8ïG)y}së³îV£ã®ø`?¼ÞJA~Â5JJI—¨Ã¨¼G¿×ÊÂ_-ÐDŒø_@¹ÓjÇlµ´’´æ’?Bk˜áq‚BGhµ‚Ì\#Bk˜‚±k[Χ¯]q$æÀt¹Hó—‰á=eÊÈ…_©cÞo„ouJ™èõ&Åh³‰!ýÁ°ôóÉaGÎød?׿“Ã<|2ª”A‘ ϯ†ƒ•ÕªQÒÅhŸdPù 8YŒIZÿ|™ »‡}DÞ–Ë) [ÿ_¤lö¢~t„ÈãÓ–ì…˜ŠÐNO¾îD{ DQ)Éé-~6 Ÿ£_ÿ¿ºíÞ\˜ßèŸô}Îg2¼¥ÎFQçßøe÷é‡RÄ¥áß2?SÏz¶rµ¤÷¬0@Î0ökÇYßKàdBå¬e²äÄÔxÎâ”1€ŒI¢…£Ñ6_Ç­PRWPb¹°HñK§œ_èxQÚÑ–!Q@1‡V×É=¿ŽaÚt¥‘0„O[æÀkou¬˜‚²ï×× ¼_`“7ÝhŠðÉ&çtþà*69§¦(HÈ›Š“â³ôÅwg°F…8·FGãÏ´FûFÃRìŸXÖèð?…Ï¿q²FÇn¦5Ú7šßà¶5:¼¥ÎFQçߨ`vįã&§‡Ô6õßÈS&æ,/Gåy̳ÔZPyWwíÁ¦¢!®žAäUTm7©ÁX)jiJˆNÒº wNA ´¥! ¶é1Z]æÏÍ+ó’!¥NÊÕ<§Y¢Áó”´Àº{v×´”Šn•î5¸æe_JX2éŽoyµ]Ÿ¸,YÃW[¤Ry7 k«Z†g– }Œ€§6•‰oªœÈ°%Ú¸_ýtS§wD¬lK‡K ”"Y¬µÙ¼<†ÿ[·f‰~)cŠVÎÂÛƒÞ”«. àxD¸HµhFA§S)ÞAUÜ:%Åzöòm‰Šñˆˆ;Ëíàüª¸ÖˆÊ¶hÍrb e”ñÌVWH²"áê¶ßnY¥fÔ`?¬Õ:‰•åO`5+XM€–¯´ILÖZCcåÆ7W,øçáëÅ0LgBˆ®› —žx‚-Ÿ ‚uÁ`\ü‚ØÂÃûPØGÃ$lXôzª@¸#­Â,›:µ`>ŒO»ðw²'YÅRàº1.büÁE S¼%hnŽ"1˜êðh/§¸0þ>UœšœóµD2Æ+б÷@NæÀy¸GsP*¦GL'1„wÏ RƒCj@ºÏ ÓÞÓùˆ¿ÃàhQð¹ãŽwòêp˜b¨êñhIR4‰Ø;hóA܈»óÛj4ß֬¬„6©Z mÆØ ý ÃóKHµï“<Žy)OfA–Óº˜“M§ØœÉe¬«–'_9¤LM‘’ñI®e\½#keñ€#‚Ø¡"!5Iuà|®úEyîɾ­é\VlªÐK¡bæh া—Z°ÚŠÕ¬"a¥ŽæPCV¡4ªŽ×Æ$la…)¯áxuG‡z†]Ã&%k"faœáѸoެƒ2«L˜‹P¼¿ëpNÀŒËŽ>¼´äÀÐýû‹1;Â)ãà<>>VgGÚ”™bÉéÀ8اˆÉ]g¥¬ÌÖìðÄ<»…’ÆÁ‡°+(ÂIäØQìðÄû†ñë¡Ð­“WÚz9îU%§lHÓ­†fÖ숼.nÀˆât_¶ÚhÀm\Û¾­¸ìuwU¢'Éñ^»9r¼=Ñ µˆe}—wÄ Sˆûy¹/r“w fMˆw¤:Àd¢#ë†u¨Å±Óuò;z’P“‹²PÒWޓа×IÜ%dÉK‹¹ôø·/€á&Vâ_ŽÜ—2…Ô¢Žfb*|VJžJÈXvdøËWÄ”º±R;Ë”î,^[µ¤àÌ[HY[P`ëgIÞÌIhW/³PcÆùø{y¯hËr4P52æ ;k‘ëµTJÏ,pYANáÆ(šéñ…ƒ;Ê*`úÃEš1׬©Çg§‰R myÔMRe}K4Äd3CQ»¬jsè—Šò#ä(ƒ7†iæeY.ÝÑ|ƒzß ÖW”ñ†Öj.ޏ r*[pø}¦d; à•ä´Ât ¡µnm»R&^tÁÉòèAä ínÌ Â.ï‰Ô^z çÁõþ Ý,ŽGÅÚLÌeõ̲*Ê1WIz?cWõ¼֚bЉ²¾øÉe¬Y”¨œ5z“$²u%Þð€x/±ôÁnù’ܘ1ƒ¿›«p7åÑÆ~do);Šåk@Á)ÌísÜi›rÙÄ/c€ç&KEö˜l™˜C¡Ú¶o3 (@Î`Þ´ƒ1 [«H9EG—¢N jÈ™2gHyo®¤±'Ý>´\Á²Ï-ô¶´~kî ë®v¢Ïš)özwÏbý3‹ÈYÎù«»¿q_<“›ºOÉfç1W™DœâÄÞ¨±•éÚ÷ž…°nvÑÞði]´×?íÎü¼ñÉùE{ú-~6 Ÿc¼hoø¿°.Úž¶æ7ú'çíé·ÔÙ(êü.ÚsÄ[JÍy9=Çš  wGªcDˆ¦#¡‡Ùã ìˆ$„|iEHà)Œ} RŽ9Çõ˜μ‹xO ]í½7s,A€ÏÛ´¼cn±ÁV§ò# 3H•VœK•Ö¾¾uxªLŽßš×·ê·øÙ(|þ“Tiíë[‡§Üú†y}«~K¢Î¿QGª¼ñ__ªà´,opÁ5eG'ŒÝ ‘1Ge1QüyíùàBÅ"iŠœ¤¸ÿî¢×œtÉ[ÊÃjRæn”×Ì(ÄNš.CäH(›ÍG‰‰·wE S`0v÷&"n‹ 9Ã,—^’áSe¶NqH¬‘¿ _–Šr\jœáV¾Ì¡Õ÷«‹kÉöjçWœ,²Û¼q,&ΤP^m%ÿâýH(eåyãïüƒUBŠ€ÌÕeù.†Pµ%[H€¬Vè´çÙò^žr‰qt/OéÚëÛ+O)›¶©]žò^˜ÎÙWú¾Š¿µ”VÆKGYO|ϾÏÎ-3ÿ¿¾«íê‘ë(Ûr’‚c7X:¶íTÂL£V Â3\‹ã¸X=–Tp¸¥Év¥¯&‚Ô.ªéÐ6oV:t¨%©Ö¡ ˆê—Tl³€:žAM)(ÚÖ¥7(ëÄ©ÌÌLœ#âNѨÛÙ0–Ö8CÖ»Ø|ëwkÔeñ½Ÿ"å^®veéÔµ ð²ÆÞr‘òþïþ{°à úÇ×o‹B~;ä÷Å |gW]±'ý2.s("Gçýž5“KZ›ÉBÄå“1ÅãÎXdA»CgFŒÛÙ]h ÆT]Œ&kÛƒÝôo-üŽ„}ì3²†Žhs¬(l¢á¥ÑFâ™?y‚ïêì +|F}´Ùp©… uh³!¬†XÈÚõÜŽ€uÃï´=~ÚCãÆÄê£ÍgÑØqG'\š5††…;(Øxç‚¡ìÀcˆµä Ò%¦$ø­œ\êƒ÷¶CtIeDŸñ;­<°1.bA‹cnÏè;xß0FhgOP ÆÌ;´¡˜J¹ƒaq Cý¾sžê™]˜ìl™Y/9%éþe÷ƒ– I endstream endobj 8205 0 obj 4351 endobj 8209 0 obj [581 /XYZ 39.8400000 785.299999 0] endobj 8210 0 obj [581 /XYZ 40.7999999 677.779999 0] endobj 8211 0 obj [581 /XYZ 40.7999999 677.779999 0] endobj 8212 0 obj [581 /XYZ 39.8400000 785.299999 0] endobj 8208 0 obj << /Type /Page /Parent 2 0 R /Contents 8213 0 R /Resources 8215 0 R /Annots 8216 0 R /MediaBox [0 0 595 842] >> endobj 8215 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8216 0 obj [ ] endobj 8213 0 obj << /Length 8214 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè¼Àjø@ §{:@3@AÁl6‹Ef‘Îò÷CY”m‘ú(‰¤dÙí`l‹â«XŪúX$?üéË?ªý^}xþòŸê›û|þr 5‘¤û«Ú?^>`ºæ¬ûªtS3ÓþUß¾Þª·ÃçÃgûÿÛÊcF÷aû*ºÿöÛáCWù¡{òåù/öÛÿ*VýÙþúµúÛßíÇO®¼ö…ïmdûåßÝÊ(ÓöÇå·6ñ—Ã_¨~³MÐÇrÛÿTDH.uV;ÞNYéñßeVT™}¢‰2²¢”Ùv6–ÿýçág[Ú©µœrÅa¿)i´fö»âîoVMеUiE*£lu6—_QÐß™EeD aE :¶ˆæu¡âEÕFPªÚa˜=È]7©lŽÝd–3)Ö•MznÊþØ"š×5GúHQ%%JÒÑ‘Ûù¾¨l*¢ËÔ¶ˆæu­\T²$˜Æt’ ›lй¢r)Æ˜à…ÆÐ¶ˆæu­'=.ª¤$0&»I€Ùêr©(ËÌ'¬ae”˱E4¯kn8¢>±!ØÙ†x‹düøõðáU·öÒןm3ŽFW÷ñõû‰êÇVkQûë§êÖò’¬¾þzl]÷€=yˆ:>̼Á&ß /þÆ{C°ãJëFH­r~Õå­µ!’5äœB»zE-¸Í@f¥¸Š?}µ£´Í)åÑC= =ºP»D è1¥±Æµ¦Ãâ_)ª&¦+îœç¦t’5£z˜"D)Ò@:A:Ê ãªär…FÍ$ {åS[ølùì3¿@…1¿0ÂIƒR/ò~‚CK¥Ú/wÜО™æó¹Ô¨SÁ¡ÌXÛn8ò®…¦n‚~S˜Â` ‡)Ï(…ÀÒl›]ÆR4Já°m|ucŠzty³u NØ‚w¸uwÇ;0O„«`i×än´G]Áý92˜4ñD§Ór¬• 5>¯ãvNM‡±¹<\X‚cŸ|©S°ó5Rd`€P_äå°šµ†Û¸@õæOgsz¾Ä:À…VsЀ Í¾bÇÜᛟot% #f$(BâÓÊGuv‹!¼38‹GR°VË5 ÎÃ°ŽƒyÞ.eSZv,¥˜79ƒÇÛ˜Çv0öW·Á1÷a®H‘ÀÙt» ÷ :='}‚}€”ÇcáË)únCe2Zš’R€±]3£þ l»F‰íû@ÑÛÆîïLê'”Ò£µjüXÎÃ4Ìc`=Ýä@IÝ¡²`â’5?šá$¤ká,‰si/¨4óàzpi‘¼ÂzŠ) 8&G‰åúqÇÐLlÙAû-D¢°7‹Ÿï®a“``Š{8åàÎò’“9ȋǓÖñ µ7t=×`ìPï$FRÑ!2¼š2Z»a؈Úà]O{¡k7Pœ‚£ZŠW"éˆT|u!^°¶ŽT­Š¨)O7„kE]ú+3È,…JØ¢óo§iÓ÷øœò‹ïVGV¹D3»IÎâ ¬'Î pèÁy§Ñ±Lq î¶õ ý8¥ž–1¶Öz_Ê7,¤ˆ"-±˜àœª±1À4ÙT¼WT'Z ßÕX !ñN.~aaé La32¦üŽiŠ¥3_÷.þÖ-"))ÖN x´ä?å ›Þ†pš ¸*e†Ï1ðZIÆšn¨Y0ßM*¡û gŽ©_ÆSše,1ÙojrX]_1c¼É Ëâ]'Ò z)…yB›8Ž Úès`ä|¾‰ŸJ±`Èñ87 îßnŸVA?ý>qÙˆ¸½®(éÍ­¨q•žÆIA}B6Æx ⋊råÀMWws"Ã÷i5¬X¢’„Э¹„,^Ö Íà褖,x\ß[¶–] p¡H&¹K„¥(°]ÐÌ_qä¨ó‡îú¾‚fÍbw88³vY§µ¾>2NÉFε³ YD×yVw+î´à&1 LËW*—˜rñ.‘…leÚ³Èn„ Gù¶½™%+B Ü8æÂyqK¦-™ÂP{Ø8@©é#-ù«›NÃÙ˜ò¥81 ‘…yl•0‡±Â<,!€8Bº=ÕŸMF˜q9=Â0d=8]´´”ÆýáŬ‘ôUb8 ŒqÜÓrî‰PÊV$–T, xì6¾`¹gxÃD¦„MÇþŒƒm‚Ÿ$©)[;ö°åˆrÊMƒ7#Ág·) ØÓMG˜÷þ=‡6"ëÍr˧lÚoy:bk±—Rí™ð©;- ãõ£q?IAdóc…îJÙ:?ŒÕXàîê"ë2—ÞÓœã®hxd¦•ÍV*Öîùª¾Ÿ~óZkRIÕ~(Ju÷´©¤ì7‡õO¾dS[çŠÙß§·Ä qY‡}ßý¦m¶ÊÏM‚:Žy¼–Ø·Ì 3¬ã—ÃÇÖŠt3I£¦GyÁù 9bt5å½€Á[®Ãºä.+Á‡$Ø/ÂõËÚ×Pµ@Õ”Çã»FÕRÜw‰pÅ=º_ U£WÿÍPµ»á™Vzúh[T­°xÀk»ƒ×˜Ç`[Àk~·¯ù“ùðš_ç^‹ˆë^ˆ×|9}ÀkxmùðZ)‚³¢|ö€×Nf3<[¾X[#š!ð&äð&´ŠÙ'ðÖ¾%¥ˆË:NÀ›cÀ›àA<ÞÚ·Ì 3¬cà­™1½SÓ|­°G£ã±c£ ¸åμࣄýê)gADöá¾ïýœz#R H‰dßê&ÎÐ;s±Öܳ!¹?ì׋Ûìä²F÷ µn2[·Â¬a¹Xvw‹§smy’<]<¹Ù· ³$Ý£|ŸÛ&¯|Œƒ<í¼ÙŠ_+…1™áø`,M¢øFîßÕMå9æôÁ—›ÅøGø²˜‘?cìÏaïé>lªøÖ‡q•9ʇ=ƒVŠÞéüpoeu>(,—˜ÿaO#‡‹íB?*3ƒËüÿЩŽ_41“ô½Gª…ÊhiRï¦ôãê-HÑ÷×oÇG²^½mXOlióèþ¶¶óXøÈ™ÙWµ&ÀZÃû Ÿvä ¢Çd}²ïéèøÇM‘BŠÜË6•¨ÌEª+Ÿý™²B·àœwÃ'û9ÍuãÝêZ¦p±à‘gk꓆û %?²zÖõ,)!€Áz]@õkG{ÞÇ™‹[®iÓG0>®x!1|äV¯xa„“é~\ñ’N_©‡²>Æq+^îñŠFtö®®ka”œN‰K¸ÌƒbÜ!ÓÞ´ßâqÔ{¨ÌZu.ÊóŠ@®ØTN4˘nö²ÆØ {¦Øe?3Úc¶FÂ1ÿÝf”ca]•MfÿUo–1ì ·/¸oßgmž"áæ©ÏQ&‹fäN-+j»1¶MÁPÙݾ\qrR¨³IYËñÐ~#êÀ!ïÈÉT­|­#§Ié”óš™Ñ£„š¦–ƒNQ° ó˜§3«­?×&ù“ØXiK]>yﺕ‡‘¾¢<K¡¨ Y–ÇØ’¾»¶ ƒëÚﬡjr´)̘wÐ [—$äxÈ;nUi¬Õx4Þ‰ŒBÈg°-x”#| ¹–¾@¹Ä’ëqèXL[…ä’é„<]=®ywÃÞŒ”HÛ^Q=˜n˜#\xâÌ3xî¸<§#Crµ&²¦ŠZ} ÂÎ7kìL¹8êïsIMZ}>ü@¾Eþ endstream endobj 8214 0 obj 3231 endobj 8218 0 obj [582 /XYZ 40.7999999 570.259999 0] endobj 8219 0 obj [582 /XYZ 40.7999999 570.259999 0] endobj 8220 0 obj << /Type /Annot /Subtype /Link /Rect [207.839999 670.100000 232.799999 677.779999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-3.0.12/Doc/Manual/Scilab_wrapping_pointers) >> >> endobj 8221 0 obj << /Type /Annot /Subtype /Link /Rect [231.839999 187.219999 256.799999 194.899999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (file:///home/william/swig/github/swig/Tools/swig-3.0.12/Doc/Manual/Scilab_wrapping_pointers) >> >> endobj 8222 0 obj << /Type /Annot /Subtype /Link /Rect [152.159999 178.579999 188.639999 186.259999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://help.scilab.org/docs/5.5.2/en_US/overloading.html) >> >> endobj 8217 0 obj << /Type /Page /Parent 2 0 R /Contents 8223 0 R /Resources 8225 0 R /Annots 8226 0 R /MediaBox [0 0 595 842] >> endobj 8225 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8226 0 obj [ 8220 0 R 8221 0 R 8222 0 R ] endobj 8223 0 obj << /Length 8224 0 R /Filter /FlateDecode >> stream xœí]Ko¹¾Ï¯ès·›o6,`KV€Ã"‡À›Ý`±^DÙCþ~º‡œÑ¨9»Ydszä±k<_õfU±øñ/Oÿl~ù£ùx÷ôŸæ«ÿy÷´ëÚNwîO3þýpú·­àªåýø§ùúm÷Ò¼ìwÿ/;¦÷ý¡ñ0…ð¯¿ï>ºÉwî›§»¿ Ÿþ×ðæ¯Ãÿ~m~üÇðã'?Þø ßv¶×ã‡ßÜÆ·ÃN?ÿÞýýOÍïÃì~ÜñߦSVö:k/Ç®lÿ÷´+šløÆrÁxÃÖ©pü÷_»Ÿ‡ÑŽËh­L®äð¹×rìmùðÙÿgÑL†SqÍ›Þ膫>˜(Øï²¡Xî@jØy‘Ʊ¼­±NšøPEÑ¡Œ‡¡É‡¢)„#KáÕŒ0ÌÚÚx¨¶—Œ™ ‹yέÎZ³ß¦°]îFCåBLp­Ë€~\ËÛÚôx¨’œ s0ä]®`:•ÅU™Æ±¼­ytD†*ŠÕ»­óaÖ\(ö… h%+„×aE,oktC=±+ø«]ñéøùy÷ñIaG3êùça%{[Ìýx¶«š£}Á‡ÖŸš?w¿û¡yþu×·ªF9ãm¶…¡&a‹B-ÝØWÀðÚð `ŸÎÂ>öá¨EØG¢®€Ãtކçé÷-_žJ^.µ¬M—ŸÓûpùÈ<ƒ-˜–æ3¸SÜ¡åmЋ•é¥,|#x$ྖÃýâ·ÝÓjI¨’†%¼¹7ºOˆgJMÒ,GJ‚ü… ÷ÆÛ먘癣ƨŪˆ‚Bs°YIàQ¦Û TnÂ4Sôq]@}¾wxUFÜpDqb,×U!ô¦Ìé;‡“Mwc¦r2bù`t'0I±-EÎg¶³“]á9‡Çû;pðÁ»ª>¯K«§¸œ—ëEÌ̈8Š ¬"z+ßbÀ þTYÅs ;uØK-$Yì‹øÞîÓ™¦{H_öÊ1ì{Æž¦¶Püu›ð½i^;®ñ¬_e\³¬ïyóô"kÇ57£zKyãeEli>ßïÊçnºœ•’ZpdSéÒ¦|Y_Y>0˜9áu‚-åÉþ¨¥5.šÃ0KŽX¼wÍ(ÞÎý9#ä§-ÝÁâ7jÚGÃ}xûô¨L´Ær^Gsó°®u'š%-xxÛJ>™‡ŽN\«·>ÇWwºï˜1­˜ú)q‹g˜s+(F,3áAËgz@¨ܧ²àÜñrPÅ-ëDWæ;$!šáYŽœ‹)žÈü8ÌI_ Á^L8…€7ß|¨à(•Í”m³¼ÂØ‹yU|Añè.‡RÄûƒ=ä8²ÄO–(+G(¤" p×4’³¾S[Z=Ñ8EÜœ[ Ú`J˜•aì`s2,Áá*îáþqHo-â=<|‚< Ç-enFd»ÝCÚ ¤ …ذ–vÌ·õ‘˜KÑÕC‰‰Î«œ„`L™k-Óduµa{>U¥‰û¤„“ç²rHßûΩo,M—‹®Y$XêäH‹i_ÀPÎÒBÌ3Yñœ•eò·†Ž›.½éÒÒÇ7äêY‘õE§&¼OÊÌÅà( ÜR¼"AÀñ–´ñ,ÇaŸ)K£ˆ® óâvíúya›An+Ýk“ÙûÈÛ ÷ÔLÚëù‘ aø9’‡ÓS`œã+Ñ”dºkN¬ƒaeç1 “#é6EG£`ïGÓ? àÛ‹áTL +LqEd—ÎÃ$ª ”O¨‡-ѽì!ßb …W(Ü¡—zéxb°dæe)–˜•hËlJœ¤Y1mu8ûŠ È_ž£q‚W-ª Å ÐËöƒ)–µ”„X QBÊhd´ZœNYuQ,¬gî+J!3ŸŽMItÅR¨¬~% ðª±N&p:%[x§˜–#6>»,OŠ´»¼S¸ –8u&Šc¸eÈ:Ò¡góÜT´%R‹ñ6àyç+ŒaEH'Ù\¸À"Q°®Åû)Ê3¸,kY«R¢ ¦(¼P §Pn§Øæª„ÓM\rŒåHÕš%ã}ÎJ1P¬|‹ ËËGÜÀ©òvJވŤÍàÒWÊÅv %Õ”‘ºvñʈæ¤@q~IfuDjj~,9"`|®&äø±A$6U >ñÜÁ•\7XI*H@$\ßZ£–â¦ïð…`ÄÙ¸XePÀ³Hm»ž„Û™„PóGœÂ5Cðñ Þ»/[}æò·Hí¢•q"GÝ¢¯ÊÈmWÆB×®|©¼Ök 7*I”jN“šTníf¨C»¸¾ŸpE:T¬M%dg2`uµ¨„”*c¥¤Ýay¹ABÞÂ/E` íG«ßê/o]gªËënŠìŠhÛMèGÕñõ½[껬u6ã„RêàKÜÎû9Õ½&¼VŒ}0Þ+—M¸Ž²þ۹،¯¡]¨’Ôí= ÷óäj"ðßÕ{@ãöö»3‡÷€Œ9ýâ"ï Kx ò¬Y„«òÒ!’·Žˆ ¼¼°cB-­²WÖ¯àpBa»”` Œè”%vOØ7á²oBq»åá*R¡ˆådB)×¶À7K,ý¥U«a\ë10J)Ü9_ò±1#'°k%`½‹¤€’R¯‚ƒÀÈY¾ó,••ª^£Í"%Ü_BêÉòJG†c4úØ[íCWý”i‚%˜ÈØÇ´¼*K„v24?›ˆx.!²ˆòç2!Ôé—8—Kx‹%jZýik¬iÖåcR!îk/ÇTÁZ%Aº/GJó¶2ÁהƕOÁjSë†Ç”{Ãú”QëF€V4¯4çSU±úùG»'t–Ùtﯘ–мv~_|¥äúDrŠŠ^0§{*û–ÙåcÀ”ýâÆóª´4µ9£ÖuuJa8Œá²”Dx#Ráì+ØáM܇’‡J˜GBˆ* 7|™¿è~¶,kð…¾ˆ|Âå4Ê^œ¥dÝ¿7ü`X_'~6‘)§õ1z]KOá<5l%áìºk¶«`Øtµß¿‚B´IRäöJ½§$^ýÕq|ž)zƒªÖ+õ—ׯ›¹AU‡bå‚—× 4¶;,ÆÎŸTjaUV”C–U÷:ݲûëe÷/ÒuÃßæe ¦PÆ_ð?¾~KŠ}„Õ£„í:ÿþºnذs³ži—J؈£™æS.´nõù˜{/[™œÜ´æ|Ùœiq¢Aˆ–÷gï'(Õjç’~m1p ûô°;žÞòNŒMS=7š#÷ÓoîáïúTˆ3;|@}|ì\ CûðbZ±”½ûµí ƒêÆÏ\13‹m†±€éÓŽ§ôñ—uR<¤ŸærnÕíD°Ò\ Ær„Ž!Õ²{È—˜“à<þ|®†­A|É-¡›GÙV¸²-‘µ= y0Ü0Exó(©Ó –Þy•˹Övºe†Yó–…½}rn±Ÿ ž<ÉòXR“6»ÿ žÐ endstream endobj 8224 0 obj 2950 endobj 8228 0 obj [583 /XYZ 40.7999999 769.939999 0] endobj 8229 0 obj [583 /XYZ 40.7999999 769.939999 0] endobj 8230 0 obj [583 /XYZ 40.7999999 197.779999 0] endobj 8231 0 obj [583 /XYZ 40.7999999 197.779999 0] endobj 8232 0 obj << /Type /Annot /Subtype /Link /Rect [97.4399999 170.899999 110.879999 178.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods >> endobj 8227 0 obj << /Type /Page /Parent 2 0 R /Contents 8233 0 R /Resources 8235 0 R /Annots 8236 0 R /MediaBox [0 0 595 842] >> endobj 8235 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8236 0 obj [ 8232 0 R ] endobj 8233 0 obj << /Length 8234 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€eñ%R@°Àxr0ð9,r¼Ù ëE&{ÈßÔ¤º5b”X¢ØêÙ€§Ý’õ®b±H~þË׿üQ|¾ÿúŸâ›ûyÿõP•U]Ù?E÷÷Óð nJÁíGmTÉ›îOñíûáµx=<žÛ_¬>vt?ÚÆ~ ;àß~?|¶“ì7_ïÿÖ~ú_Á‹¿¶ÿûµøñíŸÜxÝ/|?˜¦î>üf?0θiÿ3üÔ5þûð÷?¿· ˜ã¸Ý¿Ÿt¥«šËEp¼žº²ãßaW4Yû¦Ž1Þ©Zrü÷_‡ŸÛÑN`”F &4W²ýÜÔRWÊÞ~ÖÂý™5“æÝTªQE£ë‚KíMäá;o(¶t #Yš:ˆØ2ÔXÕöU6’1ݱa6“ÐÉJ‹#šJð…ˆž†ZJ1YW2Í@DljŽô¡Rj‚¬µE]ÔË©¨ÓPQU";:ˆØ2Ôzvà¡¨š ˜± Ï[“·býP‹I/[g•d "¶ 5Gz¨ç$N‹ŸÖk ã——Ãç§Ö15ÅËÏ-G/o¼|?ðºøÔ™n­‹—ŸŠ?·®¾þ¡xùõДêØ~‡Z*}l‘¥Vã8A}˜9¶0QjfºÖóhvÖÆU5«%08¶´±P­j>œ‡Uýh¶áÜ"j©žŽ-¦”|5»‡-;O] ‹Î …#Šb¨+ƒúñ¥ãeBÙtQã¡”ÕQ(&û)ïÒ‚[^ÅÈŒ¹zþ¢²Èë²j„~‹â#U9¶Ë E¢†çñ@ðWñ –rŒÆ ‚ã\hø«N2Î@³fê §ìf!1ØxxöeŒ‡sBlšê­²8gªŸçÜ‚eÍÎÇX©dÝ‘ OÌƤðd`Œ3{—Fà'¤kŒ^DˆÚÇU? =–`M€k ¦’§ˆ  Hù „Óøà~uÏ Ç®?Î8¬X÷ðhç ”@’ˆ`û€[£9{›ÁñKÓÇNÍ|“[#…ô\YŒEXGýÖqæ“óbéâOS 29_ÑR8’Iœn?Ÿ¸§@2úcôÈ﬚e! þž‰iA1AL„ÇPOå ŽVËÌ,aTžá&´™^§¡+¥tå}/@WT0®ôHÃÞÇ7_"Oq7¥tÐ]¨9]RGeOx¶ƒ°Ñ“‰‚ÃÏØ(#ŒŠEFZzòÒ2=µÀtô«{“˜¤IÇNòz7¸ØM ®L ƒl]­G*ë,ZS* [a‹@-ëJ‚©nKVj3‚lJIít }óËŒ5Š=’5dáõõ’n¯«ËR˱ÄÔ˶ܣŽû<]OËUŸw^UË×圪Ål+¬ ­å_ör{}ÎÕœÃÅÇ ÄÖÖ+°ªß•Pz«ØiíÌP¦ôçR‹ŒïÃaŸ€„`@ßžÃÌà°”Ó†6Í9Æ(ì(£Q8ŒñÉÖx3èkz½¥x†€ÄaÊc*bmÈÏÆñ1#·xÅ&qÀJ@ì(Ú™‘"|†ôàhç±oHK_ŠÄa  ÌFƒñ¥;«–‡¢YÀG­ öרÎC©À¬– ûÀˆ. ©Xb±¦b a ¬:p<©#°-¾IÝÄœK«µïŽ:Ø Qì–D‚U ôÁœVB°­"ØõløLy–8ž>dôFÊLãMñF„Œ ¶Ä¤\Öçwfk*,ÿi=2a5à6–¸†'áC€ ûê\6z2Ó•Jð<„Õ+Çt£ÛÁkÇë§ûÕ¶O·O4í^=±™\~œÖ´{Ëù‰=Ï4©MBÞs晄 "BR†š‹â ¼ÆÄÑæ öœx¥ŸÓh¾€[[¶Ò8Ë%cHxËÒ—Ö»mSìuÞç(k‹D« ›Ö³=¿°çˆQäž_øHù©àXöEÖúø˜3û"M=-=×ϾârŽ}Îd´ìªR (¿e‹»éLJ.IJëurAMÉp\¢·›­P\NËòž­Ø³ĨkÏV|¨lŒåçòFcqÜΘ+PR¼õÚÞÄô¹ïÀ ˜dô™¸å }x‹¯+q?åœiŠ«K]낯.ð¦\ó³ÎÅI/ÙOHוOøWb,®[Ù£^ó—š°ž¾ƒôð•7ÈüË#ŽÞ'½’(É=W[×x)D3Œ›ºÜ'Ë=ÒŒH´ŸP A@9¡$’e@὆¹¸U˜øq™”—À­«iµ£÷sûŽfÍ·+]ǺÀ¯¯I­Çú¹Ê˜+y{ü«„ç§Ò<”û!㜀ui˜çÇ÷L^îL^†<„:=ÿ{{‘ìŒä F,±>ZTrR ®weôæÞžÝþå|[ºÑ2çõ^ºê a8N]áÊFå =e럲ÇÛ~صm%Måv9a{=熖*³\n 4ŽPZ±'–h‰% 5åª\êMº.jëºYË]7ÏøPŠÏ’.0IRž±´T›éƒ½ i Ô§bŒ,1|Éá4R‰¶¸:#ÞªÉl9¶å²{jû6Òèéë°>–lØ’ $ìà!?|`ÿÃ}\y^*ª=VÛíêǵ«ÞcÏ7QË{Þž]mIØ\.—³$Ô'0O*SÙ?g0ïPKÕ§‘µ·ÀÑp†ç1°¥£Ù>L”¶°`€…€U¥MËÏiÁóœ“9cØÎµÞÔî ØRòlÎ_jé7ǸWr !`¶<ö˜ÚÁ-ÍãÜá¥>O©Ä5¼ó©Ø)Çïˆ{©Ä#b{)âY¹ùOĶPVyô8ÁÙGÎ YÃÞ°Æ~3‹§,bRÊSÝÝ—÷œìWoEςɘÕÌn¶ãd¦Ó†¢^ó῾„s©î@xKŸ—Ìÿ=E§ª‘sËSaãñ ÔšõÙ´ÿ õt*°cê½ôím”â=Õˆ-ÛÛ_Ýô^¯õl‡‡xÄ>wD®§X²¯>Í ÊÀó˜êëçszÚŠÞTmÍ|¹Mû"Æs ̘FX~<žPX¡WtW1y:—$ÊëiŠæ½'뉊W)† |#4aÚ GRX¨RT¶Š™ž& ÁÝMŸZ§¼ê¦œË|éð^¸)YŸo”|MJáÔ‹xÞ=á$õä·§ík ªøÈelÏ ¤9aj0»#œfŠA–öˆIa` ·®Ÿñ Ì{ÒöW×ýÐn)êÏq¦¤+y™œêÆ›_x»ŠpóÃ%|wk›R£ÆÑ÷úæÛ(9žó–â¤Uá<‘Ί¸"`¾ˆ9þ¶½³“QÅÊgàZ×#jæÚý_Ó|˜jk$…Öå³g‹8l¦nÍ3ZöÄðëŒjg3^SDZ.rÇâøV±´/‹Â>¸: Ú˜øÖÐ R5ƒÃªùfo"o?ªŒ*Úòm¶”»óp™Ðõñù@o"(ðm¸”žp¿ã‚›,óX;»\lË:C)•ÍuK&Å>‘ÖnY›òƒS¼9ͺ…[?U»^Þã’•â’ͬ›Ré=†àêøìqÉ&,鸤ý[¼¶f­5YÝ/¸ß¾G• *Ÿƒ&2ØuºÜ».X‹Æåk0ëÒ–‹êtå‹uõu]Ö—³q,-e-Ö´p]êË¥iúB‹Mb Qòæâî¶RemsOç ç1°OûX³§yÉ+Ñ5EêÒhV¤†ß<Àßµbn.`ø„ú¸%⥆ðp™º¸>Žc1¸³A]í©ë>sÅô$·æ–,;N˜×Ç•ו/ñPv\{ jÌ Ov\ðå ‚¹c(µìê%Ö$8sC—ú`Új¤—ÜúØy”)…-b›Ñ€í ̓é†%ŠjÁ2ƒmÇp tæSÕ%ëÎμUaŸ\ö¶ ršÏ)=iñ|ø?£%ÆÏ endstream endobj 8234 0 obj 3309 endobj 8238 0 obj [584 /XYZ 40.7999999 603.859999 0] endobj 8239 0 obj [584 /XYZ 40.7999999 139.220000 0] endobj 8240 0 obj [584 /XYZ 40.7999999 139.220000 0] endobj 8241 0 obj [584 /XYZ 40.7999999 603.859999 0] endobj 8237 0 obj << /Type /Page /Parent 2 0 R /Contents 8242 0 R /Resources 8244 0 R /Annots 8245 0 R /MediaBox [0 0 595 842] >> endobj 8244 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8245 0 obj [ ] endobj 8242 0 obj << /Length 8243 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àhø&æaÈ!€1rrf³ ™Eœ=äïGjQm[ÔGJEŠ–í¶qiRŪ¯,²¨üö÷柿5¿|ûOóÝÿüòíÄZfØøÕ ßžþB¸VŠñ£uºÝðÕ|ÿqzhNw§»þ߇7çŽþGß8=bð·ï¿ž>Ž?¿ùöåÏý§ÿ5¢ùSÿ¿_š¿þ­ÿñ“oøƒ'×™áÿÇ\páúÿ<ý44þëô—ß5¿ö$¸ó¸Ã¿,sÂj‘EÇÃ¥+??íŠÖÿÆi©TùèéÔ=;þûÓÏýh2ÚNqn²lõ¨V ÃrǛΚFô#Ï æ¶n(ž;ê1Qd "ž75ΔÕ:%¹´B«A ƒ´s¢ÿl¥ÿÚ4õ‘‡’©|.‡íi)$ׇYS›Ä‡"k‚íìyšŠ»lŽù¡r9f/Äú"ž7µ‰õx¨’š`„Ñ£ab]6ýPÙâPV’kOÏ›šGd(ª&-FÔu:wžÓHÙ 3=ÜŠ 4Pijf61ŽDæ»í 3ä]6ä§¡rùÕÿ¿)(âyS›8 uW$NqÚC¤ãçûÓÇ[®¤ÂÒûŸ{Jαíøã¾Ÿ®n> ñšvÍýOÍïãêÍý/§®Õ´z †÷haµèÔ">ÃÑ`öÒfàs`Á·?ÓÆ-ìÓx9Š¥ B¤M€3e†Ÿ¥ ÇçÜÜ÷ú·»6Y;=õëèQR¥‘MÀ| X·°EÀ: ¹È$l¹ÝNǶkÔ:¬ÃÙÎGB¾UE’–•‘„íC¤Åvaë ñÂH’ŸxÁÅ}øÇè¸Ï1pÙ‡muqIò¶Æ%gÇÇ"V[ÒCàRóè+‹Kì+±L M¢x7 øœˆåÏ‘8®Æ¨aËÁ=¯]e$ÙSa;Á2¶—Ø.ãçx½GÒ&UË*mˆpÛ$‚ONzë:q&ƒÒÈð: Û»ŠVÍ0}õYþ1bÞ•4¢zŽãÀóü#A3F,amÑŒŠ¾Î(™DÒûòuÆñ]|^ Öðuý¤»¥I sž´Uáâœ_ æÞÂÆÀQµVÏ[àh¸‡ÏÁ-lwF97c”÷“œOb{$æ3œÀ(iÝ Ó{„§}¼µæ¬ž´Œ¶ß´’Ÿžª1®o Õ”ç`Äã8šÀ\ÌÐtÀ õælh.›t>$Ò­Ž?ü(*7G¶Z€†±çÙ?Bpš"ã38á–px3#À‡H¿PÂËR®-ˆÚlË‚ØAÂGsÞªx!Lj†ÃsLR’ÓÁÌ#ó›÷õ rkÁóÄ-p4>—_zZâ6ÕÅ…kfÃ-’§·kØ©ä\ÀIþ¸e+<Æ –Ú Rá4ñ¸/~ž0ÛûPž2«n†üBqaZKx³ØÓX>óò0[` -`”º©· sòâŽ`þ=’+ƒy œãŽä>(;¯ùìI —”°EêÐã. FØY™ÊÎÆ"Æ/‹’‹Ì·`,b ¼ŽœÉÃ{[0·ê³®UÐׯÂÒÚðµ"=J%é!I¨èh$ÌÂÚtNd؇ˆ?(š‘•p¿%rÆÛ.üœzœ7=I«„í¯Ä»dGd_oÀ0±"j©„‘È~IQ™)Þ…Ã< TPöA0oµæ#±Lëù-Ãd—åZ‹p¾Þž´a—ªšCÔÖ]b ÌmlS°ìpÌL8?‰e «4|¢!rª´’WÆÕ7øŒÅrPl Er¯så‚q ðy¼Â‡2Õ„’„Ó=‘“G„“1ï&±äp¨Û…+±ÖÃ<š‚§ƒª­-p ŸÂÜÁzJñoWÅ’ÄiÊùtbñýøÐH•Å‹ûP±|õ¡WZчâ è[ó”WJô¡”“¼Øº¤üá¶ç,RÅÝ,Ã/5ìïÇïFªn_ÜïÖò®W¿{õ»W¿{õ»9~7â1ð|(gjúÃËMïÇ*˜‹:²?T£*U{õ‡WXo¸ #ñuz×Âþr á~Òšk=ÅÎeH\;‹½8åÖ7WÑ»vÓ–§Åâ•*F¨)åœU©2ŠÉµn^äM0×ÓåÇü¼Çâ/R0…ë8‚š<`÷t&ð˜§XÁv1auÁª“*®6`E]6ÄX±ÔlÔ"v>"â¤2†>"­¿ÌQ뢌è¦3{Õî‘¡œ;ðM’µÎ+W¼ÅÅHn+£âÈç#“{?ud"§Ó¬¢bÞUêê7–ø”ÏA`ÕK ¡«}ö‘÷ÅÅ AIþF‘@Ùq94+Ž„DžN³É EÖ¤xå9öábjZÓ‡°Z͹Ú!r!Æ<Î,cæ×—lHë„·–¬ŸM¸ŒÁËC|ƒÍÖ¯#‹ÛŒ›9H)R¼0Þ0ódÒ¦ö6XéÄ–ßO[•ØÚ H«Ü€6#¼ñˆ›X‘ʇªt€þ ±’Vû`Œ ö¤3v½cÆÌ<fO8×OoHõa”a¤|]¯Æo8ñ¤õå¥Q/^~X-¼ÄÉc_7m´5•¥… ]ªI‹RJ{ iuº²´°t;èKÆ‹(£ºç\Ø[„„%¶HvÞJÝý¿êX ²7NYÐnì×=w–çNͲÛ9Ç!6p€pœe i„{9WÜö›ZDíë=Ós›LwŸ{º©ft†(K.ó±»Ùr¬ˆSyÕ¢0u/è™ÀëFU;‚Yw6æ9¸ © ®ïp\‡Ç™pö\ÝWU+áØ\“Žé¾œ4)ßÞ,â­Òa[ÖuüuÆñÿú}×rH^qQþz•L¿:à­.&@ŒQ!÷p¹1{ç¼ò›÷tžì(e.Ý\ÌÇ ¤Ö[^Ì!ÅßYf,³ÏU²;ä;˾ÂÑðkŽFrÙÚÙ+‹¼zsÖŽ[ÓyáÕb4\‡ˆ‰‚àUOðÕU‘:Q^{V+ loG/²,Ï©/ ÜÑÎåkë÷T·DÁ¡‚¹±Šeó¾”|x:6z…YŽ»HKÁåV– ûžN)²—ÉW)=Å'’Í ¸•Žæ1‰%: ì®§mº™©UûüŠË…)n§0Ûß'´Ä°}Oz'MKœ,Ê)‡‹èX‘ÏÃy·°&-“'ù‹ ›Ú„7À­°ì/ôÒsS$·K‰ñÖñÞù”ý[ ­j½©ñ‰c9PÚŒAÿ3-+öÀ§ÌŒç¶o_ï¼ìì ‘×¨Q®”/úÚÇÈNsжõÉX9×§œûb(«¢¢Ëö¬p¯ÈEAðºÏ+£÷©ª²å±ë6ªžÁ9ô…ë3ô+ÖØ»\£óŽ«*[89Õ _ß~uO»½ý¸ÿnzQöbþÀÿøþ#"ÛìwQXD»¦÷ÉLÃûi,ÀIvܴ㉜WÿÓšeÃЩ,G„míòâÆ.´ŒfXÊVt‹i­[3ªÙc‹…Ïq°OûŒ«a+ZÁÎÛHsYm´M:ÙÒßúäÕ oQoã—Z8š‡·yÛúx‰m™»§í¬¨> ÍmRÚKãcÇã€}üŲ†…ˆ‡Øñ‰É%ª±4ìD¤â Ò‚¥Á1D­ß‘^ÒK¬Ið9Þq,õÁ¼µH/…#ôŸ£]+ǘdEK„¶[ôÌ7Œ}ѦŒl;|Þ/Wsc¦åáƒç*ìã†%b?Á–'Ç¢îJzÒæîô¹)Ü endstream endobj 8243 0 obj 2977 endobj 8247 0 obj [585 /XYZ 40.7999999 444.499999 0] endobj 8248 0 obj [585 /XYZ 40.7999999 444.499999 0] endobj 8249 0 obj << /Type /Annot /Subtype /Link /Rect [211.679999 454.099999 240.479999 461.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 >> endobj 8246 0 obj << /Type /Page /Parent 2 0 R /Contents 8250 0 R /Resources 8252 0 R /Annots 8253 0 R /MediaBox [0 0 595 842] >> endobj 8252 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8253 0 obj [ 8249 0 R ] endobj 8250 0 obj << /Length 8251 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àhø@°ÀØÈ!€a9,rf³,vqö¿©)õCÔGI%6-u· ¸ÛÍY¬ÇWÅâëó_^ÿYüòGñùñõ?Å·öõñuÇJ¦™ÿ)šßO§[Jáß[•Â5?Å·ï»÷â}÷²{©ÿ¾ï¸Þ?ؾԅ]¾Â?¾ý¾ûìßùO^ÿV¿û_!Š¿ÖÿýZüøúå§¶¾æ ßwÖéæÍoþ \ØúŸÓwMá¿wÿSñ{M‚Ý×Ûüýd˜SÖ.£ãýð(ßÿž>Š«?±Ú6ÄrQÿ©jvü÷_»ŸëÚd”Nqn´2lr­F4ÕššéÎèZ.¨4èÛ´ªøÂŠ ³&IE{Šø²®q¦L¼ªÒ*É¥•jÄЈ ²VÔïlftK»ïº¬?\ÈÅ®ªÅâ¨xqì)â˺֊#RÕŒvž_ÊTK;ÚUµ”c–×/IXßPÄ—u­c=®*¥%Xî¸ïº[j Ǫ–VÔè[¹º=ú/éZ+ްª—$NKÖ{äÁ‡·Ýçg®kÔÅÛÏ5%{Gï_ÞêîVŧÆyU¼ýTü¹ööâ‡âí×++'Må#_Â5*aO°DÂ’gXò–h“¨D¸¤´Ùù%\¡KD{ iÃíl“êÁíð@@|_òõ­Fš‹ã†“ãý†ÒbØ6ÒÂè¹H¡a hAUBäC>Ù;.FéI‹p‘v ¾D¤…%LÐeé2r^ò‹pãjÄ‚0ªa„Â2r丳 ™T´4)ΓP§´“•p^»œß¦°´¶EA´˜_}!ÈFg‰ãÃsc9…£¯n†£‰)Å<Ë÷Y»oct&‘#%fÂø©Þf––o¢ðíÊ´*‚(ù¢1ØY`éò)#¥BŸ·úÑœÓ]Vâ¼Óµeg!×Fð÷Ø«¯:Ê¿ñ 6ŠP¢Õk£@@ï–í€:ÅöPÇyB\ºÑ•Õ)™ÞmÚ~LÉ‚¾_õꤎøñ¥*•tÖ³ž_¶´Ž“ØZÇE°½6*ý_{4ª¯ùÜ7]²Qàt=.ÊF°´S$ Å†Óq8¼»²XÂ*ijAap£$*ðd+a3†Œ‚¹Ì¶y×娥ø4¦á$UR{ góX†ORá¡ %ÙHî¶^+G´^@)©wX¯L¾~KÖ «ï¹Œ\uºòŽžÞf„ÕòÛBO©—,¹ - ÀIèœèéîæªÐóã'-î¹· Åïf#UöŽÏsb¤rÙ#LlØÒÒ"Ô=–Õ†Jr%ì+u;or\•‚Û†šc<;N2éýªR ËÏç8•ßϾó Vü¬çÓ¬Ô:%Qß"´î8¡>äÉøtìî9÷ÂE÷бÄõÚ£Ì?PH û¹ÆYŸÆ€èþst çs"¼h0{3ƒim e¨[}\ ( M)é4ä󜙼Ç# "vÃñiPǧC´¢‡u×bŠöÜKxÖñp÷{Ã=jWÚ­øJÉÓ~Û½^l"t@5 =©Œ»ˆàlØö@ùÍ™¦x",Yl•£î…'[ZÁnH@B{ùXsNÔ^eØ9|A%¬3SõK`møŽÛÁµ9X›7.KÓ‹xZ`ã¬ôà<¥·sLe|]m~DœÚRõ£±6 *¨V÷u)=ÑSh‹´“+8Õâ°yù©c”ö²:#»Ôìù"\2Í…q 6o  aFü3=ZP’$” ¥=Lâv".–ˆçÑPh}¡.æ@ ÓýÞA©o†ó²RúÌÊ6aãVmSôƒö¦ gF€Þfbj Û•Á³¸] /XZctIŸa§qekå¨ýö ‡ŽÓÇÌk ˜u÷ÎЈbiA%âM—p›h">Sº K’€z¤½c4UMÖŽv5àz)¡ÔèfçŒðãâÎIr݇9À($%74ƒs”„üô¡nD#¡v…êU8¶‘$ÅÖ:#â¿ää"mº“’æÀ‚  %³ÃK‡1‘åQšÙÌD6¶ãUCx¥^5„7©ÃÍðm;„]Ý®;ò#ÍÈ/¡Å]°÷†›ÉNg‘QOO¾S87c¸IÏ£W3⟓ĺ¬{O7©=6z2‡ÃLºu{Á>uÊz4å±F”^C‰üULRç8}|‘;NX²NkÆtEg,ÿ™#¥¾«¬›±Ü²2 «ãt^Q\‰)m2úÏ0) ¥³=È­2äÈúmf˜ä¢ïZfŒ’ê]V4Jº>ÉpÿÞ‰ôÆÇºQÖÞãöév!áV]båÀ©œ'µ˜Ã±Ð‘q> ï¤…ÒÆ2¥H.²ßï &ì½J{ Zºqã Ž:ÞÀHzÞîç#ÚûC:R ·ƒ¯Ã˜†w'ŽÖ‹Ð†õö´ZÅ©6æpÀìÕi9AŽ Køã}íÝšH»4W ¹±(éƒ1ÀgÅ@91im”X÷'ã!ÞÆ›]óõGž(±ÔKDw³"ÏUÓ^;Q9Úï´hƒ-(¢cOlplÉ…EÛÔÅÈË+öN‘è÷QN~Ü(w°á#Î)1å‚ä"~{QlYÝÁ–•ô çR`@DŠð “†Hl «8lß© pe¾àvÆd‘<Æ&/ÎÚ¦¾‘®îÂý!œ|FÑÑ•_¿d\µäº;RÉ6c!J¼­–2ÓA:ß/S””øB«§#þš±†aËÊ-猹Lî‹ãîÈ•¹2mHY_Ü>—‘r©#;3ñ톰3×(;'vº%×ê‘.ݤ ¾tŠ2³v33isV+ð¹¢Jn›½ﺊùgËø’³¬3^cj™¬– ü•eþ¶9 ¬Æ äÞ¯ÍÛg%¯ªÃaV„Hc¾¤`>áÌøŒ«,3ãwÛlEVc'yäè–¬æØ¨¯odk9?ìZXÃ̰åj|}Nl"÷í"x&ß·²Í›y¯-[ø.ݽ‘d‚eh±Ë™î¬Þ¦ÆFò¹öýÖ}Ö Þ‘‹†\ø¦í\÷v¯Ó$›€\I1m›šDº!q›{¬(ȵ†­äã+•nê†D+«Ü³xÓn‘­‹÷ºƒ5ñÍÚ—oßgÝösr‘ÐK”YÑGÇï¡Ño@rè ®ý‰:ÅñÒïvÒYëRŸ’ãTé9€˜0¥>ìÓ ”x—#e)Üày!UUjÂC_CíXøŒƒÏx 7¢lKĆjó0zúÉün{¾Õ@ŸÑ3í‘[C%õ£=cÞ3­Äæô½¥mo ´®y/*nF¥Í±°`Ýiõ€ÏÏ ÍB‡ºÓž]6D5–F ;)„ziÁRŽè1ÔZþí[l§uúCÏ`Þd—žñíT¶”þ\ï %ÚžQ;˜oX#Ú°{V ÖŒíäñR˵–é’7WQœ›p›"ö ,9¹cï%¥'-^vÿ$ŽEà endstream endobj 8251 0 obj 2760 endobj 8255 0 obj [586 /XYZ 40.7999999 774.740000 0] endobj 8256 0 obj [586 /XYZ 40.7999999 245.779999 0] endobj 8257 0 obj [586 /XYZ 40.7999999 774.740000 0] endobj 8258 0 obj [586 /XYZ 40.7999999 245.779999 0] endobj 8259 0 obj << /Type /Annot /Subtype /Link /Rect [77.2800000 255.379999 98.4000000 263.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace >> endobj 8254 0 obj << /Type /Page /Parent 2 0 R /Contents 8260 0 R /Resources 8262 0 R /Annots 8263 0 R /MediaBox [0 0 595 842] >> endobj 8262 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8263 0 obj [ 8259 0 R ] endobj 8260 0 obj << /Length 8261 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhøDÛã90l ‡ ‡`v7Ábggùû‘šRw[ÔG‘EŠ­Ø=¬{›C²_‹d±üùOÏÿ¨þù{õùþùßÕ·ñçýóÕ¬cöO5üýtù…еö£Òm-Ìð§úöýðZ½žOý_¼;vôÓvÀß¿ývøl'?ØožïÿÒúo%ª?÷ÿ÷Kõ·¿÷?~ÇþÁ÷ƒ6ÝðáWû .tÿ?—Ÿ†Æþú‡ê·ž}wøï'Å™bL'ÑñzêÊ/»¢Éúo´–ª«8=m/Žÿütø¹íDF­É¥mÓ6]£X«µè?+9þ šI‰a*nxe†é s&rø *u ©YžŠxkœ5Ê?TmÎÕ †`%[ê#ŽlÊÞ†J–˜6™D?PÄÓX›D‡Êj ¦±2ý¬‰ÌOC¥JÑp­ó¨c ˆ§±6©Eµ#‹:ÁR-á4T²è›&èñ4ÖFÑ{†"‹¾5Ò²©’= •:ê2 4PÄÓX›D‡Ê鄌ÒÖs˜6Yˆ:“Ò9YԪǑÂÙ¤ŒùHOYb7qŽÝ^=ï^Ÿu T/?÷Tƒ]ûãåûAtÕ§aÉêö—«?öo÷CõòËÁÔí9:¶-â jaêØÒÔª·ÀÑpçŽfàhúØÂe­¸ZÏ£Y xo\´,¨Å3›ú´ÝÛ>\@ª¿Ú>­;Ïã±EטQÍ-ª–†':S-Ü£yV)øúÒÃ8 ”fØ<-€²_5Ž låD ‰Ñs¦G…ô"dF¾eÀ¨íwrVºç–;Û‡×mÓ ¼ÍÅÑœ¿hG}7ÒjüÜbqÕÕ£x<ƒŒâW‰ŽI-P‚ûŒ Yâ ÷qø²v©Ï”tpT§ïijΚԩEÞ8c¼}«&Üâ¯f¤aQp .&õ„ˆêmÄuÈÄLÂÂÄœ‹`.ñuN›}ÁTŽsÝ;` 0±®Gwšš~1!V€­;œ4å8 cÓuF…žâ1Úó/zž9Áí¯ý[5Ÿó^—¼5jÚ±yÎ`p áDóúçPF¼%ÏTiÖ÷™8þÅ;PÊ$ަE1‰&·Ù}5؇ª‚Ü©{Êji’rŽ”õ~Êsb†wøŒ`ÇçØÛìâœÚ0m £oÏÚÂÃ'¸Ïêéz¦u Û3éœÓϤˆƒ} œ3}CyÊቛå¸O)”—‹Î ë÷z+:ã]ÊÝŽ‡œ_“-:óŸåõ;JóäKÇ áÏþ݉ÕÔû˜ÇÎAKø“Q>O\'=‘Æ{iGá;ô˜×2áòœ2†Ÿyø»¥Òg9‰i›™sg>ÌŪB)/§˜+x¶n„ x‰²„FíÑ8>QÅö©y_~`PòèóÊ€á]&% -¯t žàH~{]t!yúíoÜ<år쌔¶uõ×EÅlkç÷²9EYå²sÔêæ¶Zmwá–òàæÊzæüj¾P~¥iÔÉñX(/•´ˆ¨¼·¶#(]ÿè(ÁK½-ín¿ ’-—-gr&܈ÊZ9OöNø±ìk›ˆ=b_QŸ—¢œÕqµßkCÉzÀº‡£ÅØb„f E?וaê)¿Ÿ$G>‹‡‹ÿƒgºûY›ÖW \–<ÀÁ]mÉݾ¿T³E*o*ž'hÀ똳>=raÔˆTÉ9ÛŠµc™ÞSJIR-òý¹³[ÎÒ>r–:1ÝËÝê#3Ò]ÞÎë#›®kÖ5|«L—¯>eýaYaÌcYj>zÞ“Á·nž5L5å5/Á)y{ÄÒÁ/ô°‡ÃïÖ·û{Ö©§²–¦-k‹‡‚æ(uþ(U[w^ÇÙ(–R™áúˆõÔ†À¯ZaÖ•çõ,L5åͯ'Æ ¬-´t,·’yIê\'©`v¢j"Ž‚ôh¾M ŸØí-zXÊ`L®W+¢ø b=ÚÂè£à’4¶Õ–2z<×=f;\G=ØNà:Š)ðDq¸ï?qEXŒ$Ê‹ HÛ{óI”ߘqÛ”ÛxjGcŒâЇÄk:®xõÞ‡‹ÒëGÿ·zíŠ~þÁøãÛ÷¨\é‹4ì'ï¢ãíºžqÚU¼gc©Ö§á]m³%›ÑMt]Ý-_›¦¶’q\¥PµZNÍR -RRÖÂ,¾7hÛº³‡ôççѰ},t•¨;¦jÎÁ¶4šÛå7ðߎ·/ >¢>ãb½ÔÂc¸×gÔX ï#mGH@ÝðY´\­j›c-``ìŒ8àNŸ±4RÇ\ÄCìŒ7kKTcm8ØñhÁŤkÙƒcˆÚ±ÔÚ’]bK‚óŒ‹ÚR,[…ìRhB;O«kio4Z<´=¢y°Ü0"Æ_'Õ‚1ƒ}ǸH§Z®Ö¬«ù¾ÿÖ„ÇÕt‰Ø/°åâüê)çJZ=þv$ endstream endobj 8261 0 obj 2811 endobj 8265 0 obj [587 /XYZ 40.7999999 356.179999 0] endobj 8266 0 obj [587 /XYZ 32.1599999 318.739999 0] endobj 8267 0 obj [587 /XYZ 40.7999999 292.819999 0] endobj 8268 0 obj [587 /XYZ 33.1199999 316.819999 0] endobj 8269 0 obj [587 /XYZ 40.7999999 292.819999 0] endobj 8270 0 obj [587 /XYZ 40.7999999 356.179999 0] endobj 8271 0 obj << /Type /Annot /Subtype /Link /Rect [47.5199999 365.779999 531.360000 382.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 8272 0 obj << /Type /Annot /Subtype /Link /Rect [248.159999 329.299999 261.600000 336.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl >> endobj 8264 0 obj << /Type /Page /Parent 2 0 R /Contents 8273 0 R /Resources 8275 0 R /Annots 8276 0 R /MediaBox [0 0 595 842] >> endobj 8275 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8276 0 obj [ 8271 0 R 8272 0 R ] endobj 8273 0 obj << /Length 8274 0 R /Filter /FlateDecode >> stream xœí]K¯Ü8vÞß_QëS-’’HAÛmÈ"€á²dô¤ ®qf‘¿©ø:"õéARºuËuhSE‰‡ßyñФ~ùçoÿqù¯¿_~ùôí.¿Û?}{i®Mߘ¿ËøßŸè\]7E©º+×ãßå÷ï/?.?^¾¾|þÿã…õ·í?C¥#aüûï{ùÅ1¿|ûô¯Céÿ.üò/ÃÕ_/þ÷៿Øöƾ¿(Ý…WS`œq5\ÐÒXùß/ÿö—¿ ]P·vÇÿÿI2¦™è‹úñÃ?ÊnÿÑG±á¥•æÆøÐÏn`ÇÿþçËCk¾WÕ &$ïÚ¡¬ûV6R|(Kaÿ6Q’|$¥Ûî¢eáN%x·5ÅÊÒ ëD†LX4Ö´r¹©«n“£6 ÙÀä¼½ÁM[Ê1×T1ë;.ë44öˆ•A3¬_jª¢% ÐÛÞ@—å\tM•6$Y¥†Æ±2hN¸©«êí,o!¤F*ƒ\à sž’é6¸s©ZX¦d†‘g0àF Ã)<}}áãm¾¬¹¹å5Ü= ¢lT³Á7iXž»¯‡þª#:îHÅÃ]¯ä‰˜r\G‹6?–ë Üünʯ¥Fù_ÄèvlFðî­ØŽ#:›”;nny wòxhQÑŒ!:•#•ÇbE¤–PD§.ÎÀÆï¦ŒZZ”í%PG V[¾µÉeß² tC¹ ïàk­`omZŒ7ZQÙ¨–»¿2^ÏÛÐþ­\oàçwSFx--ÊÿRUÆõÖ«rÐ_¾io­2Ûb±Ñ2íí‡7Þ;LÊã-¯/¤X)ЩŠ3°Ñ-BjhQ¶+±ÅjËAiBYº¡\n´F°¦MƒÑТeÃñpm¼œ8J«.ÞÀOg´¯¡Eù_¬Êü6Ä›"ÑW¾iØmL÷wW0Z¡¼ý¼Ã¤¬ZgL¦X©–JèTÅØèŒ!5´(ÛË•Ø`µe¢4¾¬ÝP.7Z#XÓ¦ÁhhMʪõ†T.Ú¯ †JiÕÅøéŒáå6% ü/VåÖd·"ÑWµª5Á¤»»‚ÑvÒÛO§‚w˜”eïŒÉk"í‚¥:Uq6:£EH[ζ—+±ÁjËDi|Yº¡\n´F°¦MƒÑК”eï ©\´)ÞŽ*¥Uoà§3Z„·u¡rSC¾75éCzÙíéIÖ›`ÒÝ]ÁhG0–¨”Á;LʽO;M±&R,•ЩŠ3°Ñ-BÚ7MÄör%îInÙ¥éIÞåè†r¹ÑÁš6 FCkRîCÎY.Ú¯$†JiÕÅøéŒáí›&â±*Ë^*¢=Š$]R» [,6ÚñÕ–%ªûà¦eŸvšbM¤:X*¡Sg`£3Z„Tj±½\‰%É-QEr-G7”ËÖÖ´i0ZÓrÈ9ËE›âÕÄP)­ºx?Ñ"¼RóˆÿŪ¬Cz©‰öh’tiå'hôL²ßhYÃ:g@C¹÷þ!¾è\êéÊá:Z1©ºp7­íb¼–å¹6k’dj¢=š$]Žn([¯“ð­Q‡òF-¾è|ZCÆ èÀaBÁtUØ­Öˆ1jK ¢T¯‡ö}Æ9”ƒ"… £nÒMÛ¸r¹-­9Ê¢ãØô¢m½±™r]Ì‚ø J«.bÂSoÏ3“},‡båv¨ÝEP%r¡qrQÁ¬°m«¬¥7½hÛ`tåâžC.¨ç˜Ð«Œœ0×›6FÎd ¤\Ñ…ÏL‡2U*wat¯W^ÕÅL “cÜ&ֵēL/Dï ΔëbîˆASZužzãÆ˜E¯b9TPqRUתS¹¼â䢂qaÛV XKoz!ú`låâžCÞQ{žÐ«Œœ0×7F.z ¤\Ñ;ŸÁŽe¢TîÂè^ßxUïfRã–<˜˜Ä“L/¸ògÊu1KbДV]Ä„§Þ¸1æ®ob9TPñ.¤´®U§r!É ÄÉEã6¶­°–Þô‚«`låâžC.©=OèUFN˜ë#ïú&H¹¢K’èJªTîÂè^ǽªË™$(Ǹ5&¦9ñ$ÑEÈM¹.fM šÒª‹˜ðÔ7Æ,;Ë¡‚ŠKšðJªKþBâ䢂qaÛV XK/º ¹p¹¸çkjÏz•‘æzãÆÈeÇc”+º&™¯¦Jå.Œîµ­Wu=“ e÷ðçMì¶U‹.˜Ï‰m¹*fK,¡U1á©3nŒÙқȡ‚ŠkšöjªKþBâä¢Ü¸­°M«¬¡]°W÷ rÏiBÂYz]䄹θ1rKo"bEg,d¾Œ¥òF÷„Ÿ^²årãM01Á‚'‰.ŸÛr]Ì‚8J«.bÂSoÜ3},‡r·¨ÝÑ¥p¡qrQÁ¸°m«‚g]4!!® î9ä‚ú ½ÊÈ s½qcäLô±@Ê]„Ì— ªT‚d·»^É5Œ»ÕÁĺ†x’ÉÅx×ë -×Å܃¦´ê"&<õÆ1 ®b9TPqAÒ^ÛªS9’üyâ䢂qaÛV XKora$@ž©¼£ö<¡W9a®7nŒ\p ¤\Ñ»ùe¢TÉow½’'jw¯‚‰õšx’é…ò9±-×Å܃¦´ê"&<õÆ1w¼‰åPAÅ;’öÚVÊ‘äÏ'ŒÛÛ¶jÀZzÓ â âžCÞS{žÐ«Œœ0×7FÞñ&H¹¢K’ùJªT’¦„’ùé%[.7n¥‚‰)EÚ¶·ºë=°‰!ïè#ë×lqÕjÚ °\ÕéXMŸáV Ë-1FÜÂF`OX7=2n÷>‘uç ?Øv,²a«„s¾¦E5 Ï`ÿ¤ö{;쉅€5íÑ~°2âaÛm×o¬;«Þ Ä&¾Ûñ‚«NÐÀ[­6™l„鸑c,cÀ >@Ñã¾&@ÞìñuIB½í‚M½!v¶X|ëm¸Çصkû±Ý-ò„|Mìc‡õ¥Ï¾mÀª„ˆƒ­/d†ÓÅλㅚï˹k¡×‚\Þo!­z› bSD©Žæ­K‡y·ÊÉÙB؉²¸‘,w“Œ¤ñÈÖ~>ÁÈÎðN*‡gœ¸†A£Ï‰õÞe|ØÉ :oYŽr‡ÁÖr¤€y½àâ!߸ƒe yÀ ´Wÿ.™ 84bÇ­ÕOžÚÇ7È¡OôvZ®J ó ëö5 ~Û?‹#z`WÐÓœšê|NMÏá•'•Ͻfˆ¾Aš?ýÄ#LãjXƒ-k6Ž?ºý=XqM† l9…}{´Xóû—œ8gÁûâˆ;ƒ×9<Èòÿ¸oÝ‚ï„x0j2Ƭ½ çq96½ ~ç»Ð7ÌQlÜÁ¾ sg!ïµÆ©Å };’À€³ç SCGNê>È,ßc®áZm {ýh<ÈñÑYÛ€3fÇ0ßr‚Xˆ.súíëÎ=1ŒÊÏòŸ˜ Ÿ°TñÌæ™ý‘ÚÙàY‡ ¼ýXyÇó—gZ@§Õº¿zÖ¬o‰Ýg3oÀÎ:¶ãc^NÑåžù<ìyàÄóÀ‰Eý¯{àÄÛ¿»ùyŽaX}¿rޝéü•Uc¦»ŽŒžï&î`®`áØ¬oØfî" íe»j÷ÏšgÍ}Ô<#þ»‰øµ[óöŒø«Güxínƈº°†G"˜;'YFßž³âK‘âO7+~üFl^?çÄZ·_#tfÇÞ‹›jðV–'Ü$G2¾:“î²IúZ²çï Ûñ ”Çý4NÞ Ÿv Ã>ì!¾jA;0ªØãcœ“öØJ~ä€ U4"cGuïzÏ›‡βÎëIô-ã(§ {’wl¨.ƒwì£Þ3(Òƒ8׳ú»¿îù`ꎽèÛîZ8ûèü1Cs~Θ±~ª>5KìYn:Ę2œ%_ gÛ$ŶKŠ .(Õç·ze3˜…зžÜ:¢®ccßZMy}ùv\ÒÛ»÷ov„5×^²‰5 7w2$ÆÑ™°&õÉÀü°=;&”¸‹TEÍz|q±eßÞ ²ZÂôU«[+±Ô6Ä5ÖÌûkŸ„¹ |æKLÙ/ŽIu9á\ÒíBŸ!“f{ˆ#ì áOH@3ÝÇ÷BÊXXµ…®+¢ýÔF*eˆa5ùögp†¸Ÿ}p‹ó@Ë\umã…'ÖiõWaÒÀD¬s=ð3z‰ú¸„'c'Ct0g¢3t>A<õÀ¹.Éxñ3¸×ø¡!ß ê, Uœ‹HÇ1¶°¦-Ñ~(‘UlsúŠ%u÷`A[°|øÌÔƒzîheFCûoŸ3£±#ÜËIŸö¼VÛþÎ:=6{û{¤Ÿ#ªó"³ä3RÉwJpܹ#à­±¦ã˜Oµ•,ÎJ˜•õ)“*+7Þϧ¶NÿÐÜAß{Á¯?@)ñJòÈ¡×шðüæÒA M«¾ŽsQ£,Ù`±SöÌŒ‹Xƒñ3þëñ,^X€k\ˆkÆÜ¬öÇxTçÐÁ}9š•LŠˆ— îöÄÊÈŠÝ-Q¾¾sæâ9SÃ[Ÿ0¤ÉêÒ vø ¯º¹o>}-\8A4ýz,±gy_µt¬ +t7бâ¡3Iw¶ßÖ ¿3µñ¬\_ô•dǤxE‘뎕Ú8 ª¯¬èñÀ}˜˜íøößSÓ·h:aö#húž}V÷¨ú‚¯*v:)²ûuþzå‘<„^UQ#û¦…à<~ÉšÕ«®‡ò\ê{·…ÀýG°…c|ì‡Êr†ö(l)ïP{ê(Këø™Q£,ܯí~—žôœ°ôü ÷øvï¿×´ã ìÌ‚xuâ•ѼwíñßJ|þòh|÷P¹ÖÃ9PÙ?²‚¿ó òYO'w¬ÇxÏ[6êöñV¦ðD&ñ¦•z߬Zñ¢Ážð§2ß½G |z”§G¹Â]†WÆí°¬Õ¶g˜?uÒ൧¦­gˆèa9I¾êeö¿äÝ’µlÕ#r¨i4ÝGXsx æuQ®¿X=qÐðßåǀ궅±¹Ø~ÿ¾k¯.Ùüu‘C‹®/‰ì/lŒgRæ Íú«Ù‚#‘'v³OícþÚ­6í5á•Q@.¯r>ô35†óB\¹ŽöxØ1®»öFKc™ÌÑQð Ÿ1o¬$¿òæ¶³)Ô|„­§¿ü ïµ.páôŒõ£s5 á°6½ï+±=ØmßnP uc™wþ_XÚ Kêúcõ Kž±ŸažiLU¨ibiÛϯ̵eº PC°Lqp –6Ö7»k®µÔ ÂÝÄšþy?'m\<‡bçŽý`ÂŒoZÀƒŸÁ¶†ýÀ§*¶¦TÓ_Ù¸sejt6›#ŒÅþŽǾË×—ÿŒA% endstream endobj 8274 0 obj 5321 endobj 8278 0 obj [588 /XYZ 40.7999999 305.299999 0] endobj 8279 0 obj [588 /XYZ 40.7999999 697.939999 0] endobj 8280 0 obj [588 /XYZ 40.7999999 697.939999 0] endobj 8281 0 obj [588 /XYZ 40.7999999 305.299999 0] endobj 8282 0 obj << /Type /Annot /Subtype /Link /Rect [283.680000 621.139999 302.879999 628.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types >> endobj 8277 0 obj << /Type /Page /Parent 2 0 R /Contents 8283 0 R /Resources 8285 0 R /Annots 8286 0 R /MediaBox [0 0 595 842] >> endobj 8285 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8286 0 obj [ 8282 0 R ] endobj 8283 0 obj << /Length 8284 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès€‘Å]‚~‹äÀ°‚O&ƒÁx—9äïGj©7²?J,.R÷“=˜÷ÜlQdíU¬*~øó—îÿýûþÃó—ÿì¿?Ÿ¿ìêªÖõðgßÿýáòÞT‚¿šFU¼íÿì¿}ß½íßvŸwŸ»ÿ¿í˜><8þè¯&üýÛo»ÃËwÃ'_žÿÚýö¿=ßÿ¥û×/û¿ÿ£ûñã8_ÿ…ﻦÕý/¿¿0ÎxÓýãò·~ðçÝßþ°ÿ­[Bs˜·ÿÿ† ƵŒZÇÛéQvø{ù(zY÷IËdÝìãÝ:UŽÿþk÷S7ÛiU+3Zšzö¬†÷Ó6’í[£;t(gRgoó¦b‘uxPI&:¬ˆÅmÕÒø§ª)˜0\É = TÓðîw#Æ?![—r@G÷ÖX(ŽSE£C´u"¼v+bq[Ñá™ŠÊ \1sئÑMìFSÅBLð&û±¸­AïLõ9‰”äg)ùæyðéëîç¶×_ê–qP+ïßw²ûG/*9ßýqÿǺÏÚýeÇX¥¤nŒ:|ï0RëÃHsþ@>•Ý÷•5ŽðÈ©êv:4‡]qÖ\È×ÃÈëW/¨ÏP`®®ÐíAì«níu¯·ŽÿæUÓÔ{mú†±føTîµ®Ô¨[ÇO¾í´ªkyÓ°Ó·äÕ,òòÝ÷Ç×ýc{ëiÙÚïè>éž¹^Iÿ­öj–öú?ïžþ ÿ͈¥úx@ƒêL¦Ó*—¨36þR‘çØðªik}ý¬€¡1G yñ×É5B¢åÎþ0?Ÿi5/LŠ †ieáf„H[)gAOh„áálŸÐÓ©6Ž’saSd ?Y(dm(N/^) 1g®;a"®_! ÚÓ³ã?.Ò#­ñ¬óaÂj{V 8+s–Á¤0NÊ«€gÊ !g!ÅÉä|Jž¢ŸŒì+;ãÉbß,ÜÊžlðÛø8‰7£Õµ2r} NO#.>"ëËYôCQäO6³Üc 8bŠ`:K“²€Ö×­õëjãjpí¨õÏ-:÷ÞÚ›·Ù8/ŒdÖ:°•ô@ÐoۙпàF[ÌN ÕrÚ§ám2SdR€=„…“#‚°ˆµí!lÕy¶ƒ§Çjze$¡ Gf¨*ì:Æ¢cÚƒ¤‡( 0ÂŽu·µZg:¯,> Œº^éC;¹L4Ö®ïÉ 0R=ïÞYÖЂ²i"h± ðZ)ò5FDá…g£ó–+Ö^†¯Ö•6ì:¾œÇ¹A{Ïiï¶E<è Ü¥ WŠ1­ K“+Š!5'Hbé¥4<"*‚é<KgŸX1¿d!¬ŒÞ#Ò!ülͽ>ñQƉfŽ6}–›1âŽ-·ÌÞð£zq…ì„'“2 ±!´fÐ' aç ^žp+§ "þä$>ÏBÕæ*ÏBÕÍ< Åj+¢ÿÄγ8|K^Í"/ßq̳Pµ¾‘g¡je¿£ûÄγ8|«½š¥½~Gþ< ÅŽy6c\™©#†HÜžòˆsýÌ7çü(ÍY\‰°’a@1ç Ïéh>†' PHM-倥 —OÌUyŽ»nïÆA3ˆ# ^‹Ãù3a‰rO1 ]f>ͺþ^Š«ÇÐ1BкE¤Ÿ‚lóÓ»òP–‹Ç€œ_‡Lâ€Î_Ö$.W“cu‚èdœÃ{.IàTätç9³5¢ÃÛŽÁí;@Ü bÌø÷XÞP×cŠsBÌ/Éáîƒ9ïΊ„½"[Ò‰è':xN¹‡xX!Í‘¶kAçºQÊR!!J±§«Sp¼'Kˆ8ŠÓç'o…¸¤…+q3¹$y=¬ÉL“A m¢*EÜ/mJLSHÀ8O•s€P DKIé莖wÈ¿¯Œ1á!­é,WB.«'A~Ae'¸¶¹L<5NæOæ*äpt˱¶E8BnÍl.á œ9â̵á(ì gV“ñ[¨Hñ"¥õE&.Oc☲lííÐí'um®!ØÏK.V÷Ôǽe?ßa/ð™¾gl`&ª¡Ôåb¶ç«’ÏáOhd”G9åç`€kyLöx×1^=%]Á™~=Âj¾cëYIf6'äöM{ÿI_VåÈâÒ“¨àªºH™:Š÷„×8ÖXxÑw%iíhŒ··b135”ëâuV0[•­Ê,œ/ÝGE|„ÐÛœˆc ‡T é$9BQn–rœ8Æv^=àï¬9²ÚV`´˜~þ¹W€·}TL£T·…È”WRÀ×ÕÓå6þ )¦!$ÑN§È”Þ…pPÊAE(¥ŒÓÕÇØä¢¯ch`¶ðqÞb:`i7¸€°i“´Ã/SÓºXiçâ¶ãtê]šòÞù‡nœk}½¯pm;ÌŸ h!–æè‹’£š¥™à± t˜  ¡„iIS1ìù*aÃIÊþVUŽ'UcëŒùž…'%§Œµäú:óëô<¬>Ý—$ ØD±5ç ÷«žuÏݾz™zR,-Hʲ·:00ƒ:‘ÇM}Fu4XÊhDlž3¶5¶Î€ÙÂ$?,à†ÍNyâk Éu—‡åð¬ò;¯†bž['Ê¥ 2 H@É:1eHš;¥ádxãtž¶G+áÜ⺽%ü`ƒæz ÑZ‚$¤ã?á¤Ï$O!r ¿lcì(Æ.Â5§¾”•‡åÓR,» ˆ0óN3e‡?V`&±˜§¡'Ž‘NiC’_óPC@úÀ–Và,`ßtÝR!Z3ö9´ùBÒéÜÅœÎ]lpÙ|àªñŽÇ3p= §_¬úù]ÝêdÖoë°«vle¦Œ¼üà×Ý—YMÒRÒq¿‹ŽWr+nÎ X˜³iJ>P’`já R ¾´~€LJêüè³õ…‹”)7Ì–Ãïázžf¼žÉàÖië9yÌdÎ?h @pt-çý3Ùt–!Ù«@”ä\€¿]r£›£H»ô•˜x­YZŽ-I XÉd|)'ì™"“uz>²n-™½UMÎy¿U“„{p§ÛöÁ¥–º—)¥9²9’3îyÕ¶Øyޤ9ÆÖp‡ªõ8’Kd°q›*Ę ;#S2M“ÆÒåVëK8!ETkÒŠÈQÌéFÖ)58)½4 B6غ,àö7ǼÓ½É#üò÷{2’1•%¿ˆmÀZfÓÓ;° ¸l­]o‘\ü‰"¹yLû‡¸é²X&]Ù͎I3锩u@Í]LZÜüºI·…ÒWÆñ¶StLÛ<Í%¥¥ºÀ§(^HÒ.=s`Y&»ÔÐ5šd7æÔ¡·¨~#¸y543°11i2µÜÆÏpܦû•±¤ 4áöt )Æ0ƒ-ÍDz· öä>ƒ!‚©S…*Æ È­µávë<|mn˜gj<ƒpc)IÕ“”D¡Os|Âl$ª€+ÉŒ¸ðmNV˜z0¬0aIˆ¥æ î!oIüÊ”ìÊ>at§ºÄ³aME‘±Ø‡+ª$„Ž€«öPb!X“¬¸íŒír²†×µ™\Ï p‚ߟá„÷pÈé"ÙU3pÂuNÖ xÊK•R¤bYle§1lE“/Iwªà3xdõNªn¢HÅÅm&,0×Jlÿ`»[ß›bŸRÖæÙiR»Ë4ÏÄ‚ÒïÇc›aOîÔ󞤽OkÓA);˜Boiµ‡ò«¤t5–‰y˜0Å—´.µœ¤1o¾\i#x+«§ã¤E×cÌ4wá1\³ý²æ˜ÖXw{|(=&e?ßÁ+¨³ƒÃ48Æså¾"c@Îy1Oh™l iUq»e¬:`u5 \Œ €Ò•8\¾g,õ«ä˜.~挹÷7fó¼îÏ6ž²ÝØÏš¡Ã’‘‘¿<‰K}:ÎIRž´ØÝ™U:„iÜŽ9 ‹/¡Ñ…§º‹r'x™vÅ¥¯ó.Õ³zþ=TIêñZñ- %Ÿž«Ö»ó¨Æ…ayº¤­V8æÔ3FXŠ&Ó¥ 5Õ¤«­ïH^¤¹áï +UæÍe{JÁPX Al d—¬Í¿Ø“t³¡§ é=«»Ð&ªÁ.6Iz ¤¹¹4 ×â7‰ztB bËsŸÜ½â¤Ñ–†Ù‰œß7ÝH$E/¡€F—Qsî²é‰ƒØ€Ë2¦WWsêï·^÷Û«ƒ+ÝNcxë°@†¯®­ÛnA„rz†Ï-qήڡÔëbÜjõðÚp' Ux8s7^!óËÏy$–—I³úÓžºSNÐ='õ³[ôùr-Í+Ãp‚éàþAXàý¸É³SÌg+ægœ­³öJvWÉþnxFà‘’Ò*ªÎrùÎ*Eauªô$e&Q2­(]˜pvÖûá- -S´öTð†5¦r¬ (Yã”k˜Ÿ±v£øØï't y4Š÷Ôæ¯¢jßœªÒ·žP´ Ú5÷„Jëû½¯þNæÔõ¼T'lo¤í³Y/©eùf£l6Ê:èzõö†Ì#;——ª”š¬b2º?öƒ-„ˆº´2´¬Ú÷GËò-ÓhyÒF/C˦‰¡Ë‚}ËLÕYšrºQè$•Â÷%i¤az|7êïN|¦Ží;%¬úŸõNç°GC¢_Bd‡ÔûuªŠ;l¶²dËð™9•¬Ø¿ñP9ì£@áçG;ƒ¾Oœ&>¥]óí wy§Ib©Z0ºÛý·Y‘§‘RÞ#¦—ud‚µìtÓé……ÛýÝ¿uÓwö_|ûîyŸ»Ðú¼ÐÏÞ¥zn¹¡÷¬Þ-Š–éjhÑ ê“I=¶|Е¾]¾ÔÊjÀÇÅÈ d¸©ÌíÊ;scd0Ð…¨xkUJŒ©öªÒC¢þyÄÀ÷4ð™>3˜†W¼>ô·°à­Ùö»üä~w¬Û¼±ÃOè™±šìÖCû«&ž1²÷qmˆ ºþw®˜™Ä6ÃX€tÀ0íŒt œgF©{¦†Î#µí1Øuk~ˆSB Á8Å+À#Û˜ÞÆJ¦[³¹<wè¡MLé¯á“oíîÃ÷°$›<ûÁÏ`^Ãrà9 ¯5M­+Ö—û]3Ýhûßz1Fû…-ö9¥îÛÞý·_2ß endstream endobj 8284 0 obj 4283 endobj 8288 0 obj [589 /XYZ 40.7999999 452.179999 0] endobj 8289 0 obj [589 /XYZ 40.7999999 452.179999 0] endobj 8287 0 obj << /Type /Page /Parent 2 0 R /Contents 8290 0 R /Resources 8292 0 R /Annots 8293 0 R /MediaBox [0 0 595 842] >> endobj 8292 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8293 0 obj [ ] endobj 8290 0 obj << /Length 8291 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ÐyË⛂ëñ8@ È!È!ðf³XÄ‹Lö¿ªõ‘ÔGI¥V÷h xzD©ªÈz’Uª~ÿ§/ÿ(þõ{ñþéËŠoíï§/—ª¬dÕüõ¿wà T—Œ6•%5õOñíûå¥x¹|¾|¶ÿ¿\ˆ¼>Øþ²ƒŠàïß~»¼o_š+_žþb?ý¯ ÅŸí_¿û»ýõS ¯¾áûEYøwóPBµýcø©üåò׊ß, ú ·þÿ"œ1CWÑñÒ?J®ÿ†"döŠ¡†ò‚jév9þûÏËÏZOFi8!JrU͆ªh VU% %u4˜Û˜$aª"ct›íÅ¥: )÷¤ ó^í¸¾|ÍF$²¾Ø²ï´¾Ú—]×WwÅa»ÙȳÌ<ÍÞ%ûa+r{h¯>D<„Ít†fäÕ|€|ê̽ê ßQbÙtIB¤06¡ 2É'ÓWDí<›´wæm'mÆ&MåuÒ’u¢×J±ªùyeÂh¤êÎ2”ðŸ!YŸ1è™6$%ª4Í!Ðë²S4xdÉ®§r¡Ô%oO”^GV‰’úǨ|¦­!ƒ–Í5MœKÕ…g9~ÚA¥ñH?² ÂIµ9 —þJe9Öõñ9vÊÙ7ý䃈6³ Nò[Ç4çô8<OÉ,HçÊ)YœîÀûóà ˜%Çó>ûBná4Dcx íÀÎXµü|^´Ž‹Rpé8‡%IxÆ –>uKgx‹Ð윱Z,ŒØ¸5±˜AsЄ™Gl'ƒìÚüVr¦‘ˆÑ,ÈÙM£pá‚·Yó1Y bkmÏNcI^‘lŽ¿ù¢½À Lgƒ#œž/Ú'Û Û6´åZû¶<ÅëF ‹%¸Ð”‹d+¨Ø<©ªK|·‡mc“N°|8œ^‘b6ÌWæ´M|ùÍ‹?îaÔžq< N¡‘\À¥û‡%38ÎÅÕ.A·@úк̈́׈t–iPñÙ+,Ôwq âèeAÒ1Y°Q²ƒ„²Pße(ÆÅ±,ôïD¬¨ÕÎÀ=M]îi6Æ=-ü•µWîÕwq âè¹§É÷êû=UȽú.ã@1.Ž}¸§»JŸÈv×ââ-GB»ª2É‚©ˆ# ¦¢#²`*îñ©¾âËÂõ.î@áC,˜ª“c|Y¨¿Ç—Óq¿‡b\»È‚é߉Øá”–!ÙZ†Olñ ïNÚ7íÇ»5a1ÎËù!Rd‚ã9?4Zqš3+¼ÉÞaAÕÇ]„¶‹KG¶=H£mµâ«¬¯u»Û¨$Â×ÉÉcýHFuÁŽxArrÁ¡ÎN[ä{<Ü™ÁØŒ–fK7Â|™]RhXï ™›m?k”ù¨ÑÈG‘‰|Tù('òQ^䣯"#ýȧ¾âG>×»ŒŸ8ö‰|^¿h$¥ñ_Ö¦¸½+Ð(l6~è¦ óÁoçà–°Ÿà–˜ø"œ©&8ŽS@o†s)kÍqëÙÛsnðîÒ:kn*ך2fÍ ó-­½Xóú.î@áC½5×fÌškíã°Wk^ße(ÆÅ±5ï¿DäöÖü´q§{Hw`ÎeŽ 2Ysnç?´æÜnBkn¯zy ëÏš7wq âh­¹ý[‡ÖÜ^U>ŽJùÖ¼¹Ë8PŒ‹ckÎ_ tsk~Ææ‰~ ?ñÜùjª%j]¥ÚÕUjÆt•_ uµ¾‹;PøG¯«Té*•>*C]­ï2ãâØGW;Œ®Þ©Ø&lçW×Ée<+Ä«>A÷Å  fiþyßÎ ye”k㌱q¤ò²Ù×+¾»ÞÅ(|ˆ£·qFŽÙ8#|gDhã껌Ÿ8v±q¤êzBÝÞÆ¥|ITÊááöY×àܯŸÜ~È=~®hšéxBÔ˜§!Æ÷4Ä„ž¦¾‹;PøGçi#ž†àà§¹Þe(ÆÅ±§¡}õ{šÓ–ž¶ô´¥ÉíÝ¢Èlž† ×Ó09æi˜ö½Ó¡§©ïâ>ÄÑ{ÆÇ< czšú.ã@1.Ž}< ï9q`OsîiŽ`™ïî,—îÚ1ò޽êçDê+Mª³B m‚à®M#ïøØ«~n§¾ØA;+ ØÐ&ˆ=ßñ±èÌØ„‡“ú»´=·ˆÖÉÿÄ™11}Ò1G³ÐSJáq©,¬Õ]R_gÍÒ‹ë|÷®^ÆÝ¦!Ëšþk+êìÔ½¯jÁºàY,É)’µ`)ž&Y°æm I•jšª”Êm[½CÁ¿`ž¹ÙŸ·ÏGJ¿¬íŒ&›ÉE^ãÈÙ8;éå$—¼À•Òïsy[Ñ<íÚV´^½‡·WuÙËÊ­óu®,žþ6ý 7m"j|q-÷ëéÆ)ïZDú³á®e Õp‘É6!‹6¼ø™H4ܯ>`™Õöds÷ß‚~và‹òñwà›–$öú}äX’ð*b=IÐ Š“‚)_³uóC¸³ý,xDÎ=\)@Jç[ìõîÒVÙ‡Y³Ž¼n/ƒã/L5Žñ!´“sûqÛÑÉF`¹l"þbÓý¾î–3Þ¿pF´÷šV>°Ý8@éÃ9¿!nŸÑöãEÛ‘8<¡I3¦a<7qîSëßÎÝÃ)!ç.e³]Šî±fÍààµJ–”§ÁÜÊöåˆÓëËI×c€áµÂ‡× ǃ ÈH[ïªrtÛ‡uøÀ‘Õ‘OuŽìÏŽ¼ng$ò–8—9BÔÝØÅ‹u.ÖqÔ7´¿¾}Ÿõ6S¾Íô9ꨢNz8-‹º…ˈƒc†ÈòZuU°ª+jKõ¥,åøWß^6+3iÌ8U¥òË<†ª‘‘¦ Š±’šÑ¯Ø¢”MÔ눂x4|ÆÀgñP´¤«‡|ñƒÖõðÊGxo[62ÃOè™¶Frl„ y´)ÙeÏ´[2÷–¶«¬ºú3DMr›`.@9 XvZ9Á3mbŸ©š¡×‘Êç6>äiD¡„`žb ðæ6–·6á0-Ô8ÈlbI^¾’m¡ùØ áÜ)ÄC>"Û™~ë¶OYtMëJ–¤~÷ÂUºvï±LéôÐÿeô}ÅçËÿ¼D ç endstream endobj 8291 0 obj 3448 endobj 8295 0 obj [590 /XYZ 40.7999999 552.980000 0] endobj 8296 0 obj [590 /XYZ 40.7999999 552.980000 0] endobj 8297 0 obj << /Type /Annot /Subtype /Link /Rect [448.799999 182.420000 513.119999 190.100000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization >> endobj 8294 0 obj << /Type /Page /Parent 2 0 R /Contents 8298 0 R /Resources 8300 0 R /Annots 8301 0 R /MediaBox [0 0 595 842] >> endobj 8300 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8301 0 obj [ 8297 0 R ] endobj 8298 0 obj << /Length 8299 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯¨óSc=-A€yÈ!À`Èa‘C0›Íb±³Èdùû±ËvuIò'[”ävU×°ÝmË”DR$E‘Ôë¿|þçñß_¿ûüŸã×ñç»Ï‡æÔèføïØÿ{uý€›“àï­Q'nûÿŽ_¿¾¿>>uÿÿ~`úüáø£{9u1üãëï‡×Cç‡áÉçwë~ûß‘ÿÚýõëñÇt?~áõ ¾ŒÕý/¿ ¿0θéþ¸þ­ùËáï?ï†`Îpûÿ¿j™RŠçãûåSvþwý)ê¬{b¥”ÝY÷€©ÿý×áçÚe'+kµl›ÕP[ÞƒåLm«RÉh0·u X. ­Û2€ú±¼©±F¶qP'#-ï^udèI ŒáÝï­ÿK™ºÑÃÔ»¯r±8Êd˜)DWÓÉšÚD Šº””âï¹#o¶Ô`Òfh0Œß÷Á5Ù%¨…õ‡Ð¦=Åï€çCÀÁ½I®‡–¸U-Qv•(ø ~³wO¦Ò&GªRfeÚc—ã‰G û‘þ¿·}þfxƒþñÈ7p-àoA³¼ú4×xÔ/;›Úë¦ÍÑï·©nôsô*§Xí— ÇÓ2»¸R"oÒ¯.lFvêûb=àÝ=¶lð*Ž`” ¸"|G °Eѽ%):ÎGbú`‰)7\bÙÇk&âóoHg|CŒ´:c¤¤Ùaÿ aw^xlpu?ÿذ¬Ƕ ¿Xµ5M°¦zvš`鹃±-­³üb³ÈæÌ,æâP¾˜­Vš«Ð%a|» =5Àî—¾¨V'Á s b l ã'é¿ÁÃ~ø{ôƒ&Ð'ÎÌÂè)#M#¶0TÂÌÙ@79 þêßú ¦1ʃ¹¦rÖC¥  ‚Ì`L@L >ÀVBÖû6|Gb  p‚H HùáIü­IÄ`a†¦¶ç”·Öœú.¿]þ¶'cš£nû-cæüÔ°£Ö§3šfzòõ Õ‰1Ëû?¦VÒ"¯ûèÚ·ýgGïëΊóúèžt߸#é[YŠuûøåðö‡J*ÁŒ*ÁLq½uTÂh£›5L Y”5ë°~ù ."ÉJèŠÑQ7'ðªÁ²[À~Š wpCðí€s2¶q9)2hØ_„-°Tÿ@—¥¢OÔ纶Ç\eô£ÍéBëJ¹!CÇ'|›bgQèG1\ý!~=fµ«Çl;§Ç¬õuL_ŠÁ×c}+é@‘×}\ô˜UszÌÊ ê±¾•u X·úzÌ6S$v=VD`š ˆƒA/Ú‰ Â'„NQRëEZh[ÑŒ”Ô=."Ô"¨ˆ:";ÀZ`å8 £~½2ýwÔuF Öz«lˆœŽàxI]jâHôˆÑ÷4ë›21» SÓA%}1žb€â™`l넲b!¶G[@V@adö•G^Þ2TÊ>·´ koDú<œh°â ®$mÜ«ë퇈# mŽÀ´ pƒ§•@j¿ße§&AŠ™‹Žô|„´ó«¯{ŒâžüÀLEZ­ë ÙeT²b‘²±sèàzÀ†d.±ì´ ¼b’7èM3IÑVùß0Â7~cÑ7£Š5§a¨~ÆOºeî–CÔæµÉÌi§¸‡JqЇûc½ á¬)tÉNk"˧XSF°¤XÞëÏ€"¿mv¶X½E¨”`ºµºCF]ï6Œ8ÿKLgÙ’Éò¸'X4»‘"RBŒã ;J5Xe”óögØ$³Z{.Ö—5óÃu‹¹h7 F*ÔmþI g­“¨TE¶äìgVv¨ô¦H`BÊo‚Ó:XmÁqßF˯²nÚßi𸉊,гœ~ÊSQWX¦=]q“Fûæ!VYŸpêa.N8Î.áÑG’zƒ®Õˤ\Œ^K¡B·˜>uÍ›¡üN§h$mÖ66ùéjnTÜo¼ælƒ^ìö9]í×”P–Àªžl e¯ƒ4U£›0H³{ÊÝÊó/Hsh%(òº1H³ûÛ„AšÝÓÖï£{âi­¬ź}ҌĦ˜Qœjé²@Z&:gÁùÃ8ƒg Ã@\C2Rc©ÞZntS_º¿gR_Tã§¾œŸÜ8¥¾ÂÔ—¡•u X·m¸ñ’ýòüÜ©hŠyniÔ8˶.gY3ÃY¬káR œâðÆ¹•t Èë>.œeõgYåsV÷$ା•u X·M8‹5|7œ…¡a9§`ÕX?Ôo´É™˜ íŒe9æ QÂ^‰â„Kp6RÜÝG†–¦þ0@wn€2íd uÏd uO­/˜u%4´’yÝÇ$˜™žÉêžÊ  Khhe(ÖícÁÜ2—žSå ÐbŠåòÑsücŒOÛîIÀ?}+é@‘×}\øÇÈ9þé¬0¿òOßÊ:P¬ÛÇ6ücW_õù–ñ‹”ùÂf&ÞÀ Ðu\ÕLà|ªqÝÝÐKåTÈ œÈ•OîKdúÕ©XRçð)a¬c¬N`J>!àάÉmNx#ùf¥¬J®¤cp¥f¬¸ùàrtôú¹•t Èë>&«€+1cpå»Nû'¾Upne(Öíc«€+뮵dÜåñB+\^hå/?>8ü\jö­¤E^÷qá…–ÏñBë;.û'/ô­¬ź}là O!W+ ³Tš¹Å-w)nÅÅGq.ÍúVÒ"¯û¸Pܲ9Š[ß¡Ø? (Þ·²ëö± Åíäʸ &Ÿz¢×ÚWÔeRO0·Þ?ñ©wn%(òº‰z‚53ÔïuèŸøÔ;·²ëö± õÓ®~MÛŠŸGxáM)^Ë ‚Íñ‚ðwÞý“€úVÒ"¯û¸ð·s¼À}Bÿ$à…¾•u X·mxA[Æ ½$ï ÐUºÇÎBÍ;‹Àv*·’yÝÇ…®rîØYHßìŸt•Ó±óŠuû؆®êrìŒË°bꕽ¾sVý¢f2WGR'ýdØÛ܈mSþ/ÄM‘ÍÂþ’PÜ€âÈzöíæõ2–Ëm%„ØáðÅ ×g9.Á7U" hE’Œ€¾"LÏ¢^¤«.ùÃ#ä‚y5¥¾6¾Ø/Éæ YB”š×a)’œj›ë³_˺²ë„•/§š†.ôœ 6EÓ£º²ÂX_¿~EB%£HuŠB\O¶NÄø$— ù ‚ë§œŠÖÓ2[m#[-”úAf-A1m–c#ù% ÷ ÄÓr¢ùÖå¤_lBdѺ0+ªeT™ÅmæÃcó5L{JU$ŠÍÙm$pn‚€ë‘$ì_/gn§@TM} …€«‡Œ¡ßjèÓ¬D6ç±ÈÁ6¥&8«™PdzL¨QÑÊë×±*yl´x=ž’—ëñ•³ï~$ Œpõ*%A#r1!>‘¤œob¼.j«Ö7)Uá´íåJSu‚ þ²”ÊÀ/-.¯ˆ™n~ÙÞ„}”ÔÉr•·6ø“­ëª·B´ž0O‘t¤ö£ø{ë–í[!†îg ±ý”¶>ÛÐSuj^\a?ÎEgDäS°Ó3€E7[î”™b"Ñ:8¶æXEâxp?8ú'\ãý awP6k-² )æ<^¦°nÄâx _þNÈ¢‹ð 䱿à,ʼn'MÀ0 Âc„uV¥Ë6⪿í¥TMš¿¡hÜäÓÍ!Á솲†ó­iÿ5$Ä\Wɪz’ë6eÍnòîö+¹.7:—C×÷Âj«Ü‰Î]©¸›O#%Ø9#¨Žt9 |^ñ\ÞB¼A\$AÂÝ•Žc‹ò©¬<Ž PÚÆá  §;,‘ >á>“mÊ–gÅÀ¦"á.Z•Ö›„°Alú“ªØaÌÉÝr_•U×[ÅÐÝyUË¿¬)=“q8±‚_÷·@W„ÖãAc"=OàhôÌ‚¤g¶N­°õjÅ´ÚS+l “ÓâÀ,ò0oÉü½' ¥Î÷Ìpæ…©b&ë6C×O~;|^•–_Òð9ÁeÑ"wlc¶×÷´l:Ô©Z•°.S^/!ç h$妴ÍR?Z9•ÎáÂæ’Å(Û!,âêdZÜסÌe˜XÞÈH1Î n„íyÝ‹yêˆ»ÐÆ¤`BÝm}Vx€KzsSoø®¢ªi!­§,î=N9'xE6êså¶”¹{0ÁÉQ¢BsÙÛÈrrDK¤hîȤØèæ»egŠl!¶rr7E¢¶Õð5P§|< $%¢Ãr• @C©s^6ü’0ëð ìŽ`±bT°ô—Hµ~}íï¾mÕjµL…ÝÛ’/'!íaæÜ§™Só"ì¦õ–úó;gÉvD;Uªs?ó£Ö»ª(éB É)x\:S溒õVIÈ ݬ—ÒYÝ=ðÆ²±háÆ2 ° M®7¤’eìñn!ÝÓS7XX2îÉÕÜ; *‰ÉüqHO0åïëø&Ç)½";#Z¬HÉË„ûÈŠ5•9[È‘Ëu¾÷+ÒíWÜÞ›±L¹Î·ˆw-EBù…% 0t³$”!-Ra!ÿ¸¤fÔÆ×  6Ì-쯈RÄ•ØêÆ÷fÅ/o¼Q•uý­²afû)!Ú~Ó0æ÷–õfCŒÊwÆÍ-+Y%¼Àut_IÁRÕȽ…½µt¾Ú=E¹…ÁfECCö»qJÉú¥„ãl£„(°JåcŸIõÝ’ºe%)Ó^2èqE \_ƒPÿW( UªÀÕ pí\IŠP3‹Rcäú>ãÚ¶]¦ð£^p¬ªÇN믠ý%¶çQ'ŽFûÜ:qÝ¿ã÷Ž”™úã¯ß’r³®ò¾>EÙ"úé"?}dÝ4æ¬rËôiÈ0ÍåÚÑ‘µ>éùh+Oò˜€·§vÞ{ÒμT©'n½íÖ¨ÔÕIªÙ_˜sýø…ß ¾–Ÿx#úW¾œƒ6ˆ ë'ïaÛÑŠŸ™áGôÍh¶Ì½ah£iœöÍH±”¹c;/€ ®ë犵‹Ôf˜ æ‘TðÍXÌ«û¦^=½i|j)¤sð!M#9Ó¿ÁÔÆü6ºCæ …kÎ0›˜Ó?¤crÜÌÍÎÃ~ÆBi3²)2ü ^kX¼+²ÖŒiô‰õYŠî¢õ_Ò¢5ã¨ÿ ê¾ã§Ãÿ‹1_< endstream endobj 8299 0 obj 4413 endobj 8302 0 obj << /Type /Page /Parent 2 0 R /Contents 8303 0 R /Resources 8305 0 R /Annots 8306 0 R /MediaBox [0 0 595 842] >> endobj 8305 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8306 0 obj [ ] endobj 8303 0 obj << /Length 8304 0 R /Filter /FlateDecode >> stream xœí]Ënã6Ýû+´.0 ߤ€¢@'Éè¢@]]™N‹A3h:‹þ~)‹Ž]I‡´®hZN”±cŠÔ}œû M^]ýpÿ[õÇ×êêúþïê1¼^ßoXÍ ë~ªö÷ÝáÂÕRto­ÓµhÚŸêñió\=oî6wþïó†›mÇðâw·èüúøesÕÝ|Ó}rý“÷o%ªýŸ«_~õ/ÃxíOטöÍ_Ý.¸pþŸÃwm㟛Ÿ¿©¾xÜvÜöï;Ë5ÊÍ¢ãù¥+ßþvE7óŸ4ºÑ¦â\x:µÇ?¿o>ùÑ^ȨŹ¿Þ²£Gµ¢ÖIW5ÖTŠÉÁ ÞŽŠÏÈŲ ´¥ˆÏc3eãCÕNI.­ÐªUC«íœðï­ ?SX×Í–uéma®ÃP³Õa´Í¤WOŸÇZPGd(ª%+:6­sÝ 5WbV©L&ÕRÄç±¶=*§%Xe:j«gKÑäQ‡cŠgÒ«ie8‹µ ŽáPwY‚–Ø­çHÇ÷›«\µÎÑTŸ<%Û@ß½Vß2ÆÕwÕÃçMSëFZÝe©ùµ0G3°Ï l‘°Sp›“6 )àx4G ÊÓ&šé÷aïaË5”!P à¶0HE§‚C ºûÜ>xßprKwÍî®7Åîj˜I)_!ߤG™&¿Ï©ýf!ßb–ÛéV±Aˆó?Øž Û –5–h°§2x1:ß‚öÄý<'{)Þ+ëh$”.Â?pŸH¦lÇl5Ûä›"EœõP"qÄnqvý*%»b” kËmÍ`H %ó#å‘%}€™3'ÂÚŠØ–<¿Œ©>»aÉp !‰ô9û,[ƒZÀ1'‚ĬYq„léP¢_ƒ¥‰®Ø~°¬ q*p¤„´á>OÌtýD<¶z,QŠÍa~ÊÍÛ ·ç˜· ~ļ½$=ØéƽH !‰dw„–wm3â»pV@Y§$ä±K·')ÀKV$EfØÏcmaÄRfx¥t™+ÞKDzq¥½"–"e¦‚=)Î6³ÚŒ€Ù ž©¨‚ëÒÙÒ.Õòf¼ö¤8öGæ¢X:XÛØÃáÈ@˜K–sfK™a¿± ­Øîû§ó籤ynIY)UXV¯mõ<¹[FFÎ|$òêdöPD"šñ”’vêàˆm]É‚‘Íjë³l]Öÿ(y1c‘û@NU*’—Á¥v3ô*}WcfPú}—‘¥óÊþ Êj"å;¬uÝèÜëF €«b\ÝÎ¥…¤k)zhX®Ï«ÚÐ1¢jÕñq äAßN¶¶f@‚£v@0µànTAcƒHØbú”ôIãƒ+ÁûU /ås±“Ö¾¥éb‘\1%ÁÙ)Ì&- †Ã÷%2€1N p‹†ç¬¯{ ¤ãùS%’áLÏ”\y!嬨ã=«îÔþK*ÕçZ UˆQÕDt“óZ+Ó^| ̰WØ~ÿlqÇæ>à”ñDòž>B “Ï@”Ðì‡v9(CÅúOF‰¡;=^QÇ7 £ F– °>qtˆ ùÂ*¦L=kZ“ã䶳Bn„ÕG ~h÷xø. ƒ}@kØytEÙï¾ÿ âz' 1í SÒ;a¼q¶ÿ±—˜€ó<69#9?ÑTŠbœÇ>2O™0˜ã©»Èçj×0sdìÀ÷Ãì`$ mþ$I'϶¸—X°Ì¦•Ká¨Ììp˜” ¼Ù¸aš)Ù ”ºÍ¥Üô:¥}9×9;†÷)N+RvÔSN=]À^Í2n\ZÃoæt+åLKä¤Þ©¾ˆ“ªNš¤îKž¢rzwrv=iMÄbÞÓ}P EQjU¥Ï4\$éYÏSϯ>`‹¦|LJ¥¸˜uõiº/©aÓ$é¹Lù.ùTú’ãI„3Ë”<=²*ëžbÒ¾‚t2ï!£œú¤ìè)¥S¼¿íüxËzú·Ô^Â%#Qâ+P?%w­7.½cpÑu.3²”²çrH²l¿KAR¡¨•Ù#””¯0Kò–)ÔƒÀk)Ø›ãÙ#eõgÒ™åGvUcé\$§˜6Šg/j.]õ®àª‘å‚'¥7îD€g©„œ¤šsYs–E¬jX®ŽÈ9ֺȱóHoÆr §¸~JÖY‰ÈéÛÑé"j6[®ÏPûÉò&]ûiýN„._!uÚÎ>Û_=GnÏAªªC± |*rÁZˆ žEƳa…©~eõ‰W ^‚SV_ÎoYKþ6,2ë!PÙ\¦Üðz^ÏÊ+·eWþÞ> +«/ò»›5”‹”‰‘Šo&Ï+9³6]“êüU0×¼sÙX.åkHú¡ìƒÌ[ß*oͼœf­"{™Ùÿ«{r¡fp^ìh\ÏuEÕž¸Q!#Ó¶ô¹ÑËJÕ}‹ø ”^-xoé™ 8Q²…¬;²"‘R@òvK^ï! WÃûà–¼è]1›WdÆè‚×Ö–Y$/] ¹Ôœ]Չ僤ñ¼µ™ O1*åUK®†íŸ‰T¬¦oÁý,RÍ9¡X”R3ëìÈE>ytõ«Ë_-ß?…¨¤5(1íÙëþ·zö7öƒ¶„—ǧ%CØž…»(Ñ®Igc¬ÊiÃM½­TI¶û:2»2¦6ã%ÉUw’9héB˜°µí—#êŒÑŽ´t[m¤¬EÓ«" 1éÚt…ú~ì>öi`Ÿ.õµ¢L¶M}ó­3ÆÃOnൡhׇPŸ°Áw¬…#>BÕ®i}‚ƦðhÛÀ Ôµï…~yè'Ö6ÇZ€8à;zÐ'$`¾ëšö-¬¯í𰊱ñ¡N#„Á:Åà¬mŒ·°áml´¡ @#ØÄH¿.ÉP¼mŒCÈ»€÷ ÿG|S„ÜÛö×YlÍ9fjn¹ªÿ3º¡L2º°72Ä¿Œ±¯ºÛü!q endstream endobj 8304 0 obj 2268 endobj 8308 0 obj [592 /XYZ 33.1199999 362.899999 0] endobj 8309 0 obj [592 /XYZ 33.1199999 501.139999 0] endobj 8310 0 obj [592 /XYZ 32.1599999 503.059999 0] endobj 8311 0 obj [592 /XYZ 32.1599999 364.819999 0] endobj 8312 0 obj [592 /XYZ 40.7999999 278.419999 0] endobj 8313 0 obj [592 /XYZ 40.7999999 216.980000 0] endobj 8314 0 obj [592 /XYZ 40.7999999 278.419999 0] endobj 8315 0 obj [592 /XYZ 40.7999999 216.980000 0] endobj 8307 0 obj << /Type /Page /Parent 2 0 R /Contents 8316 0 R /Resources 8318 0 R /Annots 8319 0 R /MediaBox [0 0 595 842] >> endobj 8318 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F1739 1739 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8319 0 obj [ ] endobj 8316 0 obj << /Length 8317 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ÷WôzË|I$ €í{ ‹† ddx2 2ƒ8³ÈïGj±"u(‘")©-ð½Öƒ¤Èzœ*Vßþéó?ÎÿúýüöÃçÿœ¿šŸ>ŸHEÒÿ9wß<^`ªâ¬ÿUªºbºûsþúëéÛùÛéÓéSûï·m./šíÍk}ƒ¿ýíô¶ïüÔ_ùüá/íoÿ;³óŸÛÿýrþÛßÛ?šöº~=)Ýt¿ü»ÿ…2ÊTûŸÇߺ›?ŸþúÃù·vêÒn÷ïI¥–²Y4Žo·Wéåï㫨³öŠ–B²3¥¬gÝNÇÿyú©mí6ŒJ N¹dµhפVе¿KnþÌê©í£ëª‘gÝ^¨eítä|Fè†4IC—ÑeŸF‰þ¦*Õ˜?ð÷9©Ë—ëº]x"ZZʹꊵ?úU_ºV×–/:o2IC݈è¢/3kŽ[J¹ä\1kÉ?%‘Dì.‰¾y^|ÿåôö#\u‚÷ËOí÷^¤wÿãK;§õùMGþª½ûãù„°<ù夫ZsY÷â~òEw¨€wØ|‡¼Â;/ð‡w>†Â9  ÞQpÞ­qø=ÎïûyýÒÒ^nJª™(LI¾CÞG¬0ì‡áÆT×€DPŸ ýÀÖ¦X<£ðL±âºS']S܇ÅCoÄÖySð¼‰)‰ÁuôP^-Ìg?o€Ÿ)üžRtV0¸ X:lD4¬´~Æ‹ñÄfÔvpú8½.³Úiùkn¶qÞ\›V§Ã9805â±a  kaÏ—îÖm¨.Ì%ÅQæM¬3<^•¹GAÿXBÆè¦õm¨ðsûÀÁÏ?ïŸÓú+7›µYî»;,Û9ÕCó‘A1Q>1º. Õb …w* V÷hš‚òN 9¹ZÏ(Õ”ªŒ4êNÙÝö"³¨YiœrÈÈç“‘QÑe¤&´fD•Æ„ bK̈j—¹°$ÄþGGDW{¼–Ǿþöõ=¾™¾ uîBË]¶ ´g‹[ ƒ ¡ìNôïì+Ƽkîçm=b”cU#HÃj‡^¦½¦¼ââ2#¶²¹c«©šºkÝe&JÜžíARŽ1T2Ö1~§—²Òjþ;Ì™ øa¸ãñùä‘ö#F9²d$¥j À¹P*å7Šº²§4ã»~OŸÊæWY „Cí´ªE£ä#µô“ZWœ):èÂæ©¶Fâ\ÀC3 ¯ðXÍÒQV û³ìwÆÌ‚=\è'M\Ûr¤ÝœÙ3BnìQçkœEhx~I í4¯ 53ª&¾ÂÓŸÓª3#©Àïxˆ¯,lÍøCÆZÓ1êdáphùЦi·1LŸeïéÆnL¼ÞEêœäFê¦Y7ºË¢¤u -H—òmþßJµ–A#»’RÕ_e禩.ƒ"äzåë©©+J5SŠÞžƒVÄcíóæÿª{íl½]K»öJûÎp$ÝSzЊöñóéý™ÔŒ2j¦ß C‡ˆwøKT.éÕ˜ª”&CEn­¯­Üï¼CBàŠMF¸Ó1ÖèÓ’$fE±¾†³e‚ë…ç+¦>l,À%XB».«•èä4ÀªxùðìÍ«‡Q>Æ#ÂmV±rd/ñ3m<#>L9Í Í-€-‚¡7 k°á1~ò.”gˆšÏ½µÕ ¶()œ‹I9ÄbRa±îÊ')âb±;úº¶"û¸a1ÙŒa1YÛ}´W,Ö=¥­èa°˜báÔ|`±(æx2—¶ùcœ  "‹³ay( wµ"ÐiÌÈciÌø|¬‹‰Ó¶çË1®Y‚¶‹hå¼»sBIKÔsŽSºp˜yL:Ü*Æîž$ B^XšßEϨ´'j†‹Óê|Î~z|p8_— S’KŽ ÀÍ ‘ýºÀ|rÇ€‹ÑkÎ2FxJfl]År!û0-hÄ:?àCíùôxØf:¿3ÅÑžÉÅÒO!ÈŽW Îö´‡5€]Ó¸>×¶wµ £`±c°ÎöñºìXc¸›ø3s1©Jruóü•6iˆðjM#ðj7í3•¦ÔEš{þX£œ)Õòw㾃Dáô‡gÏ3¯ÖÐp`G">¯›„+nI¬Â5•s cNío{?̲B[ƒ†G‚ìeq12ÌE\¬<#ò`ÞxzWÍê ~+º ¯Hl¤Í±;(ŽŸQ‚IÑØìµÀ2˜ôNJEÙÁj‡¥ ~G!L¤£pyÍWKGq^r2=ŒÜ¦½ôa87¦°Då˜|œü CÓT_ó8îwBòk`® M¶öÖ¸ˆÚ=J¢c"ãÌã[^žÑ§Dguï@…<»Ó›9û iƒ=¼ x·ŠÖâz@H7vhaÈkáú3¾/À‘…7Ò"¨"fÝfOKŽíbn g³Â¹»•V·F íL¼@Âräлq ¡1ó>Öµˆ„€Ü0ßUkKF\3{¶ó«eŠxžÏ¼¥ã™)q½ˆI<ØxðXønOÍ_G! ®^⣛-R:äoƒ{ž¢‹Xbä{ÌëÄPÆ—ô añŽÉ’µ&jJPÇ오åRQCò*µ±+nE"±)9Ãr¢0„‹FH°i=tPÊ-BÉannV@cëGïGä>y\îoɶ[Èܤˆ>K‹{J$wJK1xæ2À:‰HUÆèß Àv1J>é6kJÔ·$UØÃáêâTÖ*=Q³˜ªnˆPt«*ÉUJXy¤Ý;Wõò”´"û¸æª EFrUE Ì­>Ú+v®êå)=hEûÈŸ«z? >¥ËköP"¬±{¶a“')*â< ϦjL=Åìš…jgýËÈ´p!sÖÚ¢óê ÚÅ€0À星ü‘IÚîIZÁE>¸Úî碪¶EnŠúïf.Aùxo{5d}ÏËivK7 ^ï>zóÁͶŸܬ ›5áì®Øpóò”´"û¸ÁM­Çà¦V6Ül¯8p³{JZÑÃ>òÃÍúo·?¸yûw%µ×² ˜Ö¦´xS ]´¼þnB]e¯ìsbÉZ[ò£”§kÃ?Ý`«fôØ´°>¾õpÑôU¯?É;t‡\gCÖö;°5üÅýhôŽ0¡I¼’=Õßßy[« £ð ->ŽÀ„=·Å.éþ‚åºbNU¼Þy…ý˜íÆJ0ë{èt‡$Œ;'*™M-¯Wõgè9ó>ùÕù·¼ë{­¼CwOêî<‰ëñÙ£ûòT-ÂFy+;ïb¿|»‰ô{Ø'©Û3…ƒ»‰‰ÏY#® *Ôv× !1+a<Óq°ñ“f'*Σ½V9œ—½¤ÿ€âqyRìÅg\Æ;@ÇîDGã©ùSãµ²5aGYT>àxÉo:6„B¶X;âÙiuƒaÓþË$›ñ#zŠJ¡!ÕÓ"jm¦ ™ý>rg3Ê .jKí }ýIëöËÏi¸³\¨Pøú1U«»x ܈‚ÈÓê1{¯tcñZ9D®É? Õvè¹É|œëY.åÎ)rÊúFZÂ~u·™Ô4´ºÄ 69Åäz…lÃì ‘gYœvÁVS*®¢‘bø­kÆU¼Àw`\ŵ«š>°âþÎö#!F¾g§ñ ’Þì½#^aÚ§µÀ­`è†Dzm´[äsH|ó[ä[ˆ*Ùœ_<Í9“b¨%íKa¸$\³Y‡ìvL2]™ëm‘Ú²Kž`sUÒÚšw\*mY,!JÇÜœ©Ó˜‘ÌTÃm»aÒ9e$Z)ßÔSoneJz3DRÀnæ·ÕÀ©G˜b±ñ`ç̯ÅãRÛøŸçì°ÍŠ‘ÌÙ¸æH©;AE• ßÁè Ÿ±>b[óm¦•½"ùÃ/³ûLþ›$z B °³äíêîÚ«Qúè£ôsÔq·…ªÏÈøK*wò@ä­Ååçô4­w6ëÈÊúOœ™8BÿVLwð ðN†ÉĈ¢Éib?<ž¦C;oÆíæ<àyÅÃÕìz’›bÎ#ôÈ ÈÏ߃ܠæ4Íû¼»rcýs¤ºÆâxÒÿ’ر!Ìõ¬gîòµ óm7®dõ°ô¨@Ø€AÏo$`Ù’ÔâN¢þNÌdgIî¾YÌA]Ó¹ï)æ™5$ÃÖ«…Õ&5É' gþyŒXôbÀvLÀ!²1ªG';S9pA„<6VÕ”X38 ïã­ím]}O8m¸é|eéÖ)ÂÝ9ý,T[Z¥PÞÊv·oãÂV>±:¿Íª›¦×µØ ‡¤=äx¥ ¦_}Çq—öçqVýæv΀S5ï.¦ö„§“)–ØKKJÓÅ”ÐNbÒÏØ#Îb~†ø†Â«´zvLÒ¢ù”Gk ª]eiloã¸Ø€â×c„Rž´O:Ø“Ýʘf#@bÈ~Mž"^ØûãÀMš\ex6v™¶Y˜m8.vÍsr¸)$rŸ©µ3Cs vÚØ»R¥ã” iI±VÒB€¿0·9éáïk%x¯V¤,{\“áÆWˆû¾Ì!‹|ò1eÚ0¬w¬y‡JòçAJGîùÉdg–«þÜÆÛ!’ª?³Ñ:DR5öyâÝûÉËSbЊxìãzˆ¤ê_;ÛoÛç¢wWìC$/OéA+zØG‚C$i-&ΑT’™i c2ˆ kˆ aÆ¥žÃÇßÁwàØŒ. ²ø{<ýDŒÚŒ-g.ÖúN[L´dënFµ¡=–­ÙCÉ¢¢>Y½^µMÕ0x? ŒìáÅ{š¿ÓR*q* ‚ Üòi¶;Jq%]üLþµˆæJÇF.&¶>,Tõªf *ûÜïîŠ »§Ä ñØÇ *1 •}~ywÅ…ÝSzЊöQjk¡Ÿâ´>6O‹Xü™’L÷UÜ#øóœÿ¥å:ŸDWhvçÉ­™ -jfqëj”?£hEŠ@Õ%aRžïÌ›²a¿äsÔŠ>!Er§SIâû"BŠÓøJñE$s»Ží!vT€rT‰,MÄÀ"Ф±4‘Zï®ØÁå)1hE<öqµ4á#AW›Àîƒ9Áå)=hEû(bhrK„~6‹ ¢Ÿ'²Œ£ø¾¾‡­ð\¶BéËCtÙÐÍ ó9µíÀÒi¸æÀÒÏ…¥g„ßd·à¸¯¼ebJDeGΙD›ˆâšûI¯ Î FaIÑO«úň\¨ù$–`X(Yl;’{:* æôË¥‡œ±÷<ésžÀv~:wq€-FlùÀÂdäÞÁ¶äTi´œá리ó}>Ö@Ÿ¦Êä}™Üòó ¾/Š ÍS§' äýC• WÉ Y)Ïñ÷! œÜ'‹ÖÒrìÊQÇ®t»rı+oŽ]9pìJ˱+G»ÒqìÊÇ®¼9våÀ±+:v§¼ºòæÕ-\O};R1D~DTv/‚¹¨³ž8eЃ¬à†ý÷0eДoÍé»æÊ¦â -sh£³®Çû+®grjåV/˽€Ùg À[7áY=ÜŽRYplñ¢w WC Ñ]1TP/j,âyZL¹‚ùôí¢Å‡Ààöïù[K®-5vo˜_#‰ #?yIßûê$ϨæLÛïuЦ÷lž9¹ç½ÅÝ‚ÈfÜjÖ¢r¦µ_ &+i/_¿räN?œWLZ¼u]5ýÒÚÔ8Ö‚ïhøNosKV1»[÷;ïak=‘?^yÏkmä ?¢w ;Ý¡è;Œ {ǬXÈ·›±]`Õu¿³šÊÉÕ¦x «:ˆ8…ë„çâöéÁ8ŠÆæÒ5^A áw"(ÓþRÜÚõLƒÝÒuk_7•-Ø8&I?¸†?¥Ô3çO§ÿGõá endstream endobj 8317 0 obj 4706 endobj 8321 0 obj [593 /XYZ 32.1599999 225.620000 0] endobj 8322 0 obj [593 /XYZ 32.1599999 144.980000 0] endobj 8323 0 obj [593 /XYZ 32.1599999 144.980000 0] endobj 8324 0 obj [593 /XYZ 40.7999999 672.019999 0] endobj 8325 0 obj [593 /XYZ 33.1199999 223.699999 0] endobj 8326 0 obj [593 /XYZ 40.7999999 494.419999 0] endobj 8327 0 obj [593 /XYZ 32.1599999 716.179999 0] endobj 8328 0 obj [593 /XYZ 33.1199999 714.259999 0] endobj 8329 0 obj [593 /XYZ 40.7999999 672.019999 0] endobj 8330 0 obj [593 /XYZ 40.7999999 494.419999 0] endobj 8331 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 99.8599999 108.960000 107.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn2 >> endobj 8332 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 91.2199999 191.519999 98.8999999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 >> endobj 8333 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 82.5799999 194.399999 90.2599999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 >> endobj 8334 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 73.9399999 143.519999 81.6200000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 >> endobj 8335 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 65.3000000 161.759999 72.9800000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 >> endobj 8336 0 obj << /Type /Annot /Subtype /Link /Rect [80.1599999 173.779999 113.759999 181.459999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://help.scilab.org/docs/5.5.0/en_US/api_scilab.html) >> >> endobj 8337 0 obj << /Type /Annot /Subtype /Link /Rect [82.0799999 165.139999 99.3599999 172.819999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://wiki.scilab.org/howto/Create a toolbox) >> >> endobj 8320 0 obj << /Type /Page /Parent 2 0 R /Contents 8338 0 R /Resources 8340 0 R /Annots 8341 0 R /MediaBox [0 0 595 842] >> endobj 8340 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8341 0 obj [ 8331 0 R 8332 0 R 8333 0 R 8334 0 R 8335 0 R 8336 0 R 8337 0 R ] endobj 8338 0 obj << /Length 8339 0 R /Filter /FlateDecode >> stream xœí]Kä¶¾÷¯ès÷Š/‘‚»3ë9Xì99ë8†aÙø¿J¢Ô"©¢ÄE©{´<3$Åg±øU±XõîÏŸÿyý÷ï×w/Ÿÿsýj¾|¾T·ª®º׿¿ïÆ TÝí~•Jܨnþ]¿þzùvývùtùdþÿíBêöCûÃdöMtþþõ·Ë»®ñK—òù坿·ÿ]éõ/毟¯ÿ‡ùñƒ­¯)ðëEéºùå—îB UæñoMæO—¿ýáú›é‚jëmþÿ$šèНêÇ·áSÒþ7þj̤hóŸºBM?…™Žÿþëò£©mèÆMÕTrQiþ¾¤%IMSºòªe}5?üv‚á.«‰¬­ˆ–§¢¦GdÕÈHÅe´&3çöøû’vT;îÚ4bZ4„4£9!²æ²ZLHݘ­ÖÍ%ckgs¨jmEœ‘<5="ë†Ö/0\zê¥ù£&£«§¾¯jÝŒiÃigꛑuCë§®*Ûæ2#'-KÞ\¢"æxŠƒ¿/n¦¥£‚Í„ ™³fìÍt›o³#æßD3ŸæüÄÜáÃzå×,ß(ÝR(£&æhùv3 9QÑÖ³PÝgÚYèûA®ã^Ä>qê å4ËÔûí5õ¦ì:î;êÔ¯§ú©ÜaÞu7j¦]÷=:àœ<â¡)Þ2ÿnòí_ÛÏÿ™‘„2c­[ñOKÓn#¿ö«›2KRËæ‡$¤iº®›‚­`mS¾^jq#DSe8j_Š;µðq¦¼ý»n>»:_›Tá¶Ñ¦˜oÆ=éJi§í¶ñÓåÃ&¤ezyŒ\?|¹¼û^7š/?š¼U/t?¾˜nþhÇI¯_~¸þÑt“ÿéúåç ¿q&…ÕGt9T¶9jH¨h› o•îÊÞs^ºJ†"¡Z+¶÷Ño¯K7F¡bT”À=¿¡ßûÕû†»V©6§¾Q¢&Gþñ‹Ù­ëVŒp¦€E#º{«Ö FßD0Êa5”C>€µÍåd8Dª”rÔ +o‰…¢<è²@L-s(˜¶sÌÅe”Ì-.çàV^Ι`NAêåì d*³Œ/) ²à*è#Ü“„fÛ Ðêr0¬ƒíTn ÍíÔ¤và#‚((‡‚ßÀGûfáÁTN½5m íÓ&gþV à Ì|ê…vÛFð5 ÎIgÏ Ûva-’ûí°<.ÝpË+!fÁ†ØüL´TÁ¤Çe-j,¾ w‹úÛŸ6Ð~ç,ÉÉÊ ÿXb [zÑšÚY¤xð0­@I Þ%ÕûôЗô¾Ez°|=MEŒ® !˜ñÌ—©ÚÀ^¿‘ÂT9™Tï˜â1«@gðÓõÇ#ÞôžCµsàÝÈÁÚà•ãðüvöi^]1mÀ”˜u` yC»¦x°×‘ñ`Nt¸×ˆ]¯B„ï€9Þ%à*À#¥0UÁãûVjÌ« Í…Wœ7Ë2H«êJùäÝ`wB„ê›ìºIè}êÞû)¶Ãõ½ˆ Šh¯ˆ½¥ êæ«+씑êVóªÉºOYÕå°ëDü%ß¼€9Ôï¤ÕSÈ›VËëÿöÉ2é©>T²Â„s:š«ûùÑ6…ºd£¬…½+Í::šÒ9ŠVîSÏ"3ü5<÷§g¥*¾˜óÛë÷¹ ^7ó¡á"« ¾x*¬ˆ…SÂÓ¸\E˜2¬„›VpÆ#ëO|‘@I`ÃáÍG0}•_b9Emd˜Ør….æ‚<²lðT¬¸Áª:‚U7¥+ãJ¡Š×íÜgÕ0}ÃÓóAx‚|6YU°K$›µ‰º=i—Ó]ùRNܪ{[½Ñò½‡rªž¤ð¿Qé߸ ¶#zn\Kâ2¯=êð±…EâF}Øf7ÓTÎG¨6 «ÔÛUôqÏDNN <½¼Äš]Ý××Ò¥¼±€ €ý„GÏaÜ&æäuÌŠÅB4ÙƒÿÕYÀòB“¼½ áµ7ï9mI·†áE-|Þæ€*¢=ãĪ­g 8¢Cœ†Y Àún'ù[•½@FI[b<Î|žCÝn-‰è{ÏEøî|˜`np%*þxÇà–Ž’ÌOÆȰËÙšòCÊý%HÆËMœB‚̪`«O8Ü µN–,&¯+ÐŶо’æ_Œ â4Æô s¹ œÀ×zˆë”yxm„¹²Ћž¬« ÏË&2/ r1ÍyÏÆ¬×À(êOçg£K˜oDLMáoàñÀ½F\ëÀáÝTrgÈmöýèÿó«´‹/ÒÌ\ºØ¹‡á<0÷…ÍY`¾ ö:rê LS"ãÙ'EÐÔþsàŠ c²Ï"LÈ"gúIo‘<ÝÊ™zØî¤ÞCPo©•ƒ©÷¸ˆWƒÞnw½ÃþšTË»ÏN)­ †×ì©1½Þ_šëBò!ƒMÄKð'knÀëãèEÍŸN.tr¡çåBü8Í&6¡Ýüí£ÔO ׄ0Y-' \e3éÂé='‹½OdUáË×ÂŽ’Vl›Ç6IJ™×* ì 6vŽØQÁ†˜7 sr|>ÔÚ˜e±Û„xÐDÚ!Áœlç´PÞ)²Ñ&)dÀ»ó¸ý›C®ÈüB=‡Gº5ÐðxoÆOyÖ8õÖ¢yRQ N½Íßd©· ÌsêݤøN½ÛRÜ©…Û°N½µ¨tèÔÛ¤*¿ “â9õîJi§í¶‘Á©7|Ư· Â%4ü&r NÀøU|̼ߚ÷ô^¶ïsh ™ÀçðЗ…}G¾¹£fyÃ7Œ‘i‚ùó¥€y æ9žÝb`Þ>ÚTÅ|ŽzFJJÀÞ`ÂK˜¾œïèS0Hµ Y5õšI À`SŠ;µðq¤j Ré·aR0Ø”ÒN-Úm£ dÜÝ?I㊶ÊöèiTycKiÇÁ! ²PšED§CÎòHï®r®EˆCüó–SÓÅ ïåWYÅt« /Ü`QMô.N¸ÇŽ"ëÌåh*¿ÇºõZ ¡ÛÿVõÀŠ+Xq=¬ñAI €USŠ;µðq°âr XñÚoäÀª)¥Z´ÛF`%ØA8Á< )e²ºÂEp¨8¦¸dGß¹íC!º¹€*1+gÐCx ÉÌE>f‚¢¥ì½œû±¥‰~®Lfç]òï5hdx+4yè5Žö|Ýð`Pœ<óÁP@~Qýuñ)¿,¡ƒ"ò˶Ρˆ ÞÒGüÑ ü¯¾íS”+véªçpa10/^0^0^ ³Y.Ü—Œœ!™tgfjŸ9_Üð ÿ™sæœ9gΙ“#§Ì)!êMN Œi؇& ]Â~7aGpß`ä ûƒ…ý¢Â³ƒ©í(ñôJaü©Ú`?¢°'xøE.Æ(LoºŽøE…gö÷×û­…© ³³"Ô‹èAÄ .è>'ÒDü M<Ú–9%äà€ã”%Μ3çÌ9s)§È)¡È­3ÆëþCƃ,y Òk„c¡¼ÑùòÆBE™ËE`ÿõc`a¿µÛ¡¤ÙÙ9ÒKÏUï°ž«¼» ÖAÀ&&šcd¤ˆì6"-ž9¨x?—Š8á(%ùÆ=¦øîkò˜9‘u|ÈX¢¡Kyœ~ÌœÐeVô~º"¡#©¾G Å n„V=‚“7f0²/­ïÔ@.>¹e8)$wŒA„œ Ÿ^Žˆ¦ˆÒ\œt€šƒ¼+wê*¢#ͪ«8†žJÓmìMaÙðgžeµÒ@!& ßÀØ%abÃ8¦òBÑ…1Z<̌Ԇà\« îg^Ïö'³¼Ó Å[>qÀ$†¢§V-ž”ÊO4…DS%©OñG ¾ó®þQ9œ®šAm‚ËcÛtæœ9gΙó¬9Ûž³ˆæ”ƒöæÍÜ6•¬‰Ñ¬Âó£ñ¥Wx¤˜ñD$ Œ”0§%Ý2NÑþ^ê¨2âÎãî$K¬ˆ#…÷‰Oè E·9")cv½§¯þø¶ z˜à(|G~‚RŸð<ˆÀüƒÍ’5ŠâŸ˜ËÝP§8bÉè=â ó9]åå‰ÓP¸EŽiÿ"Ç4©Ú‰cSœÈ1})îÔÂÇm´‘cÚ¿ƒÈ1mªðÛP^䘾”vjÑnÛGŽi‡J]ÚHÓ½7 ²3¶„È1)¡2À½’%ŠKdå`nfM0³” yj9LĬҚl+0Ê[!åM};2ëh·¬àÙÆÕÞ8¸æ&¾¾ñ|9ÔÛ-®9ç`—ì‚ñ¨ðy rsàãG’ªàíÊÅrL°MhŒ5*€ýÁÁáf–ïÎlÂ)©jG8%•œNI¥=Á±Iñ…Ó¶wjáã6zá”TbB8%ÚàpÚ–ÒN-Úm£ˆpJHÿP2â q)1™„ öxÊ”7êSl}6±u>ö{XZÞtyÅÇp¬¾¢RÜçy0ÎFBÁŠ5à4!X bËÍÇOo$Œ’ƒFó!*\D@ë)D@•Z›”4¥¸S ·1 ʧeA,DM)íÔ¢Ý6Ê æ‘|Ú5<Œ¶WJå åt?µŽ')¥\€Q6‰Z³qÈݼ”»|œu{´Iv™ÎqV=þýõº5TWʧŽn ¥v;Eh@bÔïg}/¢ƒ"Ú+ÒKêæïj»ÝäM«nŠîߨÈnÌ˱æxº’·”v¯íÊ º) WßßI‡»øC0¯P÷#-ãû´6fíÀFJôl¤”x®Iñac[Š;µðq=l¤DNÀFjX‹×†Iñac[J;µh· °q3R:D[ëñ_pn±@PGœ= ²"®kæxŒyâNb~äP˜ æœó'ÓÆž3Þ9mkÖΘ¿- hEtè·½°˜ ¿æÂ¼»DX¼Ï¾ïßsJî­oœ+•OS êX¾ÚKÊô]ÙôN”¹f’”M™IRî›I6)€àd`c3ɾ@°)3IÊ|3É&%¬7“jÑn§îîÉ-øbtEÂrmDxœ!îSS¦àM}´ÒA½¡£ót ñ ~´9|1ÏÍ0ãyÛÀ@(ú+lù"§’>HÚîñîácg^"‚›ÉñêeÕ­2v‚Ú2¢x+â>D+\Û**¦l«¨ðm«š”ÑŠÞ¶j¨…Û­˜²­¢Â·­jRD+zÛª¡í¶QÑÖ½‘AND¬% Ö’,I¸Wí1UíÙŠúŠÃº™™¸¢pï= 4í‹fJÚ¡vc4w£„_.Ÿm¹¬×ß2X¦ áùBvù8ªºÑÀƒ ÞX‘÷r!.˜ñ„wËËŸ°¤ØQfUè&Ptá«‚m` FÉp,›°i!(ñX(lZÂIæøm–k³'{¦³Â63¼@Lø6ž–ÜÅÓRLái)}¬kR<Ý”âN-|ÜÆ€§%›ÂÓ’mÐO7¥´S‹vÛ(€§ãŒΙ¿ëEíM1xíŸfÃì_Œm*¬Â]¾÷P-Ãð÷§Í5E©GözVòä*£àÀžFAVc+úžÜsÞƒka ŽAÓ”©aÊÎ<hÊi0ßÄßžÉZ͆ »V£NîfåvËS‚çƒö#y“Ú[ºn¬ŒúsÙà$ÁˆcÞÑ5åýÀ Ú)õɲñ‰.`ç‚jmHh oíØùVn¯ÉÈ©J¬‘Èx¥­ˆfÿ&U«d,Às#ÏÉj,æ7)FÌ×ce@“V«q-ö/Û†)oÿVV à|]I¿ªQWx=iJ±q-î8¬*¡´àm_sÂ]ŠžÚÖˆsã«#‹6u¼ÁÕÏðóšÅ;úêŸæ’N“Ô'4Š…(Õ.ÚòTš ›Ð™GÎ,¹µ©¬I¡–(û”¯æ#bI÷^ªr«©ÆÍ4_Ø„ÎBÒ«€ ¿*ڜ䥄[p›ùÉS¬Q:‰ps6 Á‡*_äx(¿›®±M‚¾†Hp?¶¼óD‚bl9ô),>,P[Jn ™YæÀ8',æ.\xÜ…×SÜ…+Ûsr—¶TåVS›¹sΧ¸ gA3,ä.m)áV#Üfvå.bXNØËZi÷Ø9ùOÊ%ò#yŽ/ª¡\¾Çö¸“°x×ÌÛã5ŸÚãuío¾º÷x[ªr«©ÆÍÜ÷xM§öxM‚fH¸ÇÛR­F¸ÍìºÇ|0+c¼LfÕÝ68Ârâ¯{¡ÚÎ&,&~E<âWtŠø Z÷¨RñøÛR•[M5næNüªš"~©ýf¤‰_Þ©}¨F¸ÍìJüªkƒîLÁgXšó( “5–ãr" Ñ hg‹Ù'4›âÓåÓõ›YãV÷S]í¯¿&ÝbÚüÕE?Wº™³Ät{ê]¯&@¶*&Vq—ÕÖõ­ž6@Óü0G#vÊék9‘ÓQ¨ÒÔ׈Y9@ÜêŽÙú´;ÕŽ¿Ñà7XÒ@fÖ©Ú:ê§¼‚e­"ub„ßCßX‚žÊ!Ð8ìA—ö]±”±“QÀìT×üN‘³«MàUéÀâø4:€i±N‘o^!ŠÇ¬`¤és@BºR"ý©‰ m¾d¡3sÔ×7Òˆ„.ÁÙ#"‰àÆúõO9ùþõÓåÿÀ• endstream endobj 8339 0 obj 5512 endobj 8343 0 obj [594 /XYZ 32.1599999 380.179999 0] endobj 8344 0 obj [594 /XYZ 40.7999999 223.699999 0] endobj 8345 0 obj [594 /XYZ 40.7999999 125.779999 0] endobj 8346 0 obj [594 /XYZ 33.1199999 378.259999 0] endobj 8347 0 obj [594 /XYZ 40.7999999 223.699999 0] endobj 8348 0 obj [594 /XYZ 40.7999999 125.779999 0] endobj 8349 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 777.620000 200.159999 785.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 >> endobj 8350 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 198.239999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 >> endobj 8351 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 177.120000 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 >> endobj 8352 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 751.700000 159.839999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 >> endobj 8353 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 743.060000 226.079999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 >> endobj 8354 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 224.159999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 >> endobj 8355 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 151.199999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 >> endobj 8356 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 717.139999 168.480000 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 >> endobj 8357 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 708.500000 130.079999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 >> endobj 8358 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 699.860000 132.959999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 >> endobj 8359 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 154.079999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 >> endobj 8360 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 682.580000 168.479999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 >> endobj 8361 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 673.940000 128.159999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 >> endobj 8362 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 665.300000 133.919999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 >> endobj 8363 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 656.659999 139.679999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 >> endobj 8364 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 648.019999 153.120000 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 >> endobj 8365 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 639.379999 222.239999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 >> endobj 8366 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 630.740000 183.839999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 >> endobj 8367 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 622.100000 147.359999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 >> endobj 8368 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 613.460000 155.039999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn26 >> endobj 8369 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 604.820000 148.319999 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 >> endobj 8370 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 596.179999 163.679999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 >> endobj 8371 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 587.540000 191.519999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 >> endobj 8372 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 578.899999 144.479999 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 >> endobj 8373 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 570.259999 170.399999 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 >> endobj 8374 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 561.620000 155.039999 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 >> endobj 8375 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 552.980000 128.159999 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 >> endobj 8376 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 544.340000 100.319999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 >> endobj 8377 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 535.700000 163.679999 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 >> endobj 8378 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 527.060000 144.479999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 >> endobj 8379 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 518.419999 161.759999 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 >> endobj 8380 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 509.780000 204 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 >> endobj 8381 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 501.139999 197.279999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 >> endobj 8382 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 492.499999 154.079999 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 >> endobj 8383 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 483.859999 161.759999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 >> endobj 8384 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 475.219999 154.079999 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 >> endobj 8385 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 466.579999 205.920000 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 >> endobj 8386 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 457.939999 205.920000 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 >> endobj 8387 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 449.299999 144.479999 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 >> endobj 8388 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 440.659999 108.960000 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 >> endobj 8342 0 obj << /Type /Page /Parent 2 0 R /Contents 8389 0 R /Resources 8391 0 R /Annots 8392 0 R /MediaBox [0 0 595 842] >> endobj 8391 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8392 0 obj [ 8349 0 R 8350 0 R 8351 0 R 8352 0 R 8353 0 R 8354 0 R 8355 0 R 8356 0 R 8357 0 R 8358 0 R 8359 0 R 8360 0 R 8361 0 R 8362 0 R 8363 0 R 8364 0 R 8365 0 R 8366 0 R 8367 0 R 8368 0 R 8369 0 R 8370 0 R 8371 0 R 8372 0 R 8373 0 R 8374 0 R 8375 0 R 8376 0 R 8377 0 R 8378 0 R 8379 0 R 8380 0 R 8381 0 R 8382 0 R 8383 0 R 8384 0 R 8385 0 R 8386 0 R 8387 0 R 8388 0 R ] endobj 8389 0 obj << /Length 8390 0 R /Filter /FlateDecode >> stream xœí]I¯ä8r¾¿_‘ç:›ûÔjÀ*Àãfƃ{àòü÷M¥(Š 2”$E¥òU½. «2$Ep‰2>É_ÿùË^þë—_?|ùŸË7ÿ÷‡//äJ™ÿ»L~‰ Ì\9›ÿ©¼2;ýwùöûË÷Ë÷—ß^~sÿÿþBÕíCÿ—{¸ˆ˜þãÛß_~…¿Ì”/þÕýëÿ.ìò/î×ß.ÿþî¯?y~Ó ¿¿«¦ü÷üÊ(3îGü¯éá__þí—¿»"˜ßéÿ¿hFálW9¾‡OéíOü)&Œ\,!’ˆ ¥Ì•Sºæøß?¿üeªÕ®²¸€ì".y!óÏ1f*$7®cÝ_¼v.”RR`´¿žd­'óõ\$ÑK,—ºÎÿrNóQ&ØæƒŒŽk>'‰_b¹ü¼æÛ¯}¥N8¤íì\\æšÎ.2Oi7ÄÞž\óÜkú_ÃÛðj”ÿýwµNqÃóvc…}ë@Dó y›ïS~•d XA\¦K›þÖó8T°éÕ)”ò”oî#z¥Ô2cÖ·HʆÄb¦/Ìß⟰™ ]|nœ:ÇܳoÑfäïoOìÕ *a‚?ÉÙ£mìÞXxgmcnue·ÊŒjñ™ë§¯Î#¬ú]²|§¦7-µÞò¹41ašÝV¹Nëà¬ä:¸€6í(™ë¸½ER6$³ºNJ®ƒY(ÆQ2×ÁV_ØÈTÌ©®ƒ«§sJ ufömmÃê3 ÿTí ‡ù ü#ÆŒ}ªn£ ë‡%ÊZ~¬kÒŒ¸Þ4û®ƒ/1¡Ú— |‰$%_"4rGÉ|Éí-’²!±˜Õ—Sò%ST‘Šq”Ì—ÜÞ’)™Š9Õ—¸®ðÝ9w´¹KÀXØ3-è™0´{Š ³¸olø·{Â>V3É ¿£¬nåºaþhø¹L½MK¹Ø4%1¡Ú¦•6­Lɦ§P156Mr›Ö«6$³Ú´R%›VŠq”̦ooÉ”LÅœjÓ.žôÝ9+2u³¡ÒùAÏô²Ý>óOp{ÁÜpÐZ ±ö»‚ëíD/4Ó"&Ô¢Ä֚ߙŗßê¦øšzÛé·&^¯ÉBùö¢¬×~ºÐ”‰¹,¿¤Wëå·¸i=üšg2¸û–ĽÅc.i=&Óyÿ‡‡Û޳éØà=?`SkJF„ÚÙ l¤ÙqåãZ­`\‹*;^Vþ}‚ÊÉʼŒûöÔ%®Ù žéMÖ±™8¼zõq™]!• —.ËŠ–A5ï:ÆšL)`1HØPÆX¼šÞ÷ÖföÍvÁ,å1¡vR£ÀK)᥊@¼t¢ÀIÍüIÙXL˜Ô(RÂKxéD“šù-™²‘©˜3'5Š,x)§õž93׌0t¶ƒ‡P¸ ¾C ù=jP € î'ꢼ¢ŸÑ¢áó;SíÜ6`¦¬ÐY¤4Äeâ‰E™òµ ñµÊO'YALL¨öP À²Š•`YÅ ,;Q2Å,»²!±˜ÕC±,«(„e'Jæ¡"—ÄXvsª‡b ,{zØ……tCÅR‚õ‹}#:°êF½eK´Ï¤Ž »Ã Åm)A a „(†AM™˜‹ÿÅm)n aâÊà: ƒnoñ˜KZsà %Ä]­È&>Kϼv6P7øæk„Œ¿ ôX*Ž$4¬V¢܃W87&ðøê>†gLý2æñj'ðJ,˜³,&T ’J–PI¥ *9Q²áQ­ã¡LPÉEÌ:<Ê*©$D%'J6<Ê€J®ld*æÔáQ-¨$>åŽâ®çؘ+Cï” èe1¡ZŸ´ú¤UIŸ´­M®O··HʆÄbV}Ò¢¤On¨bx®O··dÊF¦bNÕ'³t§ÐØl½" Ä]ö1)/­ªghP=ªUÏB,±›a¶€EØ‹°)a!a‹X„Ͱ[À"ìŠEØ‹°OEØ»…Æè 1lìdƒk7Âx{c®ƒÏ¾ph_w̪óm—ù?S,&ÔÚ‰¦ "Ö´k #â‰íd~‹¤lH,&؉¦¥ˆXOh'ó[2e#S1gÚ‰¦‰J-;Æ4¬ à~¾Û¯——ÃBõ©†9³l:4,]GSN¢BµE1®£y)]Gs˜®3Q2‹â!]geCb1«E±RºŽf0]g¢dÅBºÎÊF¦bNµ(¾æ ‡(w,-v­´á£G«Êñ·ªUN€¸M‹RÜvÛ˜ê‚Ìã¶ù-’²!±˜UåD)nÓÆm%S9â¶•LÅœªrr‰ÛzPñ è ››wLÅ[€¤as -C8ÈhL¨VSÂA­Já V0œ(™šª®lH,fUSU µ‚áàDÉÔT…ppe#S1§ª©~LÖ“AÑ3âOÆi²Ñ%ç1¡Z“ ˆ.µ)E—ÚÀèr¢dšlBt¹²!±˜U“M)ºÔF—%Ód¢Ë•LÅœªÉæþΠ1š\?/`ÙDah09f"/¯Þ,ÌL’˜Pk†€`ÒR0i &' 4‹ù-’²!±˜`†ƒI›“¶LÚ`+™Š9Ó,¦ ®¯nê[ðÞ‚C3Ììrl²wOéZ]Ó w¿q`­ñ8›6SÖ‘¨@|×±pÇநÖI…ó(!9EÆ„jïIp`X 80 %óž,+‹Y½'-†Bà`¢@ï9¿%S62sª÷daŸÏÁ“ŠlÅ®>ïkC]2ÂpPŸ^{ßq‡ûú »z˜ˆ ÕÌcx ‡1â0%³`±š,Op˜EÌjÁ¼„Ãq˜‰’Y08ÌÊF¦bNµ`Áβà9–]g 4ìömUq0acBµŠK€áYÂpŒ„ÎDÉT\ geCb1«ŠË†c$Äp&J¦â2`8+™Š9UÅÕ£0œ·mi³¨€ÿ(ª­@üÇèþc4Ä&Jf:à?+‹Y­@—ð£!þ3Q2+ÐÿYÙÈTÌ©V …ÿtD¼ ÇH >gfœÒë€îHª•ÞBtÇÑ›¡;¶€îØݱ)ºc!ºcKèŽ1Ý™(™Ò›UËmŠîا@wìýT1J‚GªÝz×òŠð¬z#³!{Àð˜°;Óß’4ÓßÒR¦¿¥0Ó¢ÀLÿ‰¦LÌÅÿ"i¦¿%¥LK`¦ÿD™þ··xÌ%­Ç¹™þ–.¸@Ke‡ÖYAÈ@±†³=k ='!Õg õœ6¤Ý/þŒK¦;Ö¾Æ:Ò Ü¨?¨Ýaiv µS˰ãœaaêc9v& œúÌo‘” ‰Å„©e%`Ç2ìL8õ™ß’)™Š9sêcùìlLê·ñf§'ä€þÚç°Ù½å+°ÃbBµŠ ìXQv¬€ÀÎDÉT\`geCb1«Š‹°cv&J¦â";+™Š9UÅeP|ïOSÞ·‚®ùTXæ„ [õ†#duLØ?cÛ§–ߢ4cW Φ•ÊgìŽæçäžËò‹§3vÅJ3vE34Ÿ±Ooñ˜KZ“gì*ÀCøÑ™ZfàL6§o8¶rh²ûý½ÁøÄ}h­ Ùžý°=6}NïçŠjM‚JûýAØÓ¶üf%àŠlÕˆÜ8š·xÏeùES`HÉh eh›û<€ç’Öãd`± 'ju,.äË€9< l÷øŸ‘'W[’ X±1a¿%Ù £®¬¹%9*ÀÂn`I7š21o9`a¶ˆ…Ù ³,Ì,Ì&X˜},ÌÕ;œzŸk§‘ ‹ã=Ìœ}“wu ÑŒ¤1¡2¢„¦¿#"~Jˆøoù·HʆÄb–pÈ ¿£J(†f¿K¦ld*æÄpÈ5CHå@Ïkñzõ“œ '7d³c\y¶!ñ6`ÁuZ Õ–Ä%°$^Õ@ç°àß")‹Y-‰€G噘 XðoÉ”LÅœjIâQöó*r#BæÚ,ú7„,ªYr È²ôᨠj˜Ì’>ü[$eCb1«"ËBÒ‡£ÒLL–ôáß’)™Š9U‘¥¹«ÈçkÚO}Æ„ë£kª GS`8º8â¨j´ÎGü[$eCb1«áèBâ%ÊB1*KñoÉ”LÅœj8zÄC’ÔŸï΋ƒÅ®`ºã4=G îš½â÷€4ÌÎë³\=¡ÞCépÅŽÒ1¡ÚC <”-l½qT]‡Í¶Þø·HʆÄbVe [oUC1&Ûzãß’)™Š9ÕCÙ+ 'Ww¥­4¤åzìõólÉÛ•æ1bÃ]ÖX-ô <³¨ÞcØ"YL¨õ”|ÈY]ÁcLWr§¦+‹Y̓•@Ê è3Q2ó`ôYÙÈTÌ©æÁCwöœÓ¿gõ¨gH¸¿þã`K4\÷êCä…Pm/`KT”°%* ¶4Q2{[ZÙXÌj/¢„-¹_™˜[šß’)™Š9Õ^Ä‚-½Š?Ðúïb"=œ4ö.Sª’T ÷»Jᨠ•âF ÀM™˜Ëò+I¥p¿ ©”J eÈ,•b~‹Ç\Òzœ»LUH¥@“牺pŒ³î%jÈÜ<è¤÷còþG‚Lct¸ËžûoéûJ:ç4Ðpg,×$&ìw§:ͧ¡¦”OC ̧™(™;5K>ÍÂÅÿÒ6u§ºOã¨ÊÐY>Íü¹¤õ8ÙšpXík¾L3w x€_¡’ÙevAæžËwì9k¸>çè5öjOÖ>àR´Wv@šc;PÈ6·n*æšÆ„êØÐB¨Ñ– FF ÔÈH5Îo‘” ‰Å¬±¡-B6ƒmj´+ÔhS¨Ñ>ÔÈÈÛæ³qŒ¤›Ïa÷Ì„…›ËïÂ5ߎ ®ù¾QàÌd¢)sY~%×|»ß…k¾•g2²k¾ç·xÌ%­Ç¹3ÆŽñˆÇÜ”=ä6Ò,c¦1‘˜­7†zí`mÛÃîv#É»Ñ Ýèüò­õ2ÁôK¥{x¬÷G4 ¢è4€£cî{$lÍÙo 醛/s<œCËèQݒ烂½î”~C0laÆÚ[Øß(\²6´Hy³ i\?Ю¥ŸP R/üU”ýF'ÀþÚh6T°Þ£ßÆ1Wímœ“ŠÄÈ ­!R‘ýÓ²iê˜Qzšú²pýˆùVUï<Ósƒ²ë\ ÎÂâf(çý{SNÅlH©{\À£[¤Ÿ…g·FÇ¡ÜC2€ð†Åb±#¸PÀ‹wnŸXõ¨áŽ j,ûhô>›^BãàÙüöþ)S ÃIý:ÆÃŽ{l¸*¼£ï{V™ºàˆ{«!þßèÝ• Ò³$þóvσ°öóƸ盫4Óàˆf¬¬ŽKÆ Yvu6@ÐõþÍ$ùþ©'§´œI8$0Â$+ÚýEýúK(*–ïyЄÖLÝm·W`ó0{`Ü8Ý’RX,¡s{ipù*ePóbʬj-ç»ì _ñnZ\³}]A·ñ`eò{â[J-Ì¢'{âûŠÚ«5·N©øÆëåW.ÒɼQ•ñzl” ¯¡}©ZáíïßsßëÉ~xÞl¤ÓÂöܾV±áifq-@ÝÐd™ç0k*8¶†Ä¦í³”ìU")…'Ì¢ß|>Ú7qÅ@ zîòyÌ!^bؤf£Kõ<5:ä4|ÆzÇkr©ß úD¡Op-x×^‚Cô°©­)ÃÛíúä#ú„w”ï}§ŽŸ'ÈuJzñàQ†³òÒ¾ê-I~b‰l.lbïºÒ=׌æs¨=›ÑžlgZ›Ã'î%êФU t§zgÀ9^Kºé¯w¨ÝÛŒáç˜1(^qèèƒó[ºfޏÓmði”3¯ž‹~Îþ¨Ô@^§ RÜwáv‹ƒ×/5êØá^€Y zqÀúýÁÀ eoŠ÷ÅkjQvø|U(UVÖ#ej8N6D(cÎLÆÇÉû8ØÐKçZ"Ά  öîíIu8äN»†nk¹EpÇîЖ<†æ”‡1‡#¾­Pý Ñó-¼aYm–¹ծÅÛŽà¡åTr'ø#ÀÄíNÿ±¸äÏb.)\Y6÷ý›´4x‘Z†ñú»é‰÷Ïˈ{0°qÐUpCÎæÂ¶Ó ã»P9uåm¸?L¤ƒýýQä iøØýÙÐÔã[6UdÞ¨þ€…|`záÈ\Jj‹€—‡,8wÂ.' djPz²x -Áúnè7ûÆ+"ËTr}âuç*à ·¾ÙÕ•ß:ªî ÷Ý˃è(¹fù˜ŸÛ냗`=´ÉË,ÔtCδuðš¢õÁˆ×/[OM)ÃÊæ÷„·qC[g£Eu‡î(ìÉFÙµ"¦™] SÁíÔ¼þiØÝô6é1ؘõŒ|÷w/ éûC°ÇŠÜåÓ‘ÔÓ´±¡sŽ zÞ_MŠ•àºä¡ù$ùtTõÐÑÆPX·Ì÷ÔwGCÞ˜C±ñWlF~pÚÊiXǘ»Së÷eä8âÐ%¼='ó¿ð¹Üq€æ1l ÒÞ§ô\²R?}fÃ6ºÜOÕ@l¥è=öd#UÏë@ål kh 6I<—ƒ— •CÑ6èÀñ¶¦èÐîµýø@Òp½sÝuZñZ=ÖÇ(]×rI…ÁºúH ¡~GïFrëç1 øÇÜq׬8ô襲·9ýé+Mw³}ŽübÝ:8<³¸‹]4Ü/™Ÿ<äÀÉžq¥'8¨?ó´T…c©8ìpÄFÒ×yDσṈ̃ç„=(ƒ§!mlG¢REòÆŽEí< Ÿjg¯>Óq—Æp8¸tܘ§° IÈiPìÚɆAeÈ{8bñФ¡®ÈçÐ(í`¼ßÎR¦š÷ÀýÆÀªÝ÷`Ç܉9bªtÇ,>¹Ã<Üß3†ÐªUoáåãrȦ£8}ÕÎÏ!ûˆ~ƒgîø3ùUÃlŸ÷(7ŸU$¯sFfíÏÚ+äBuä=,ï ÍŸÚøͬbh»m”/ÚÖxëŽ .\®ÙeÑšÞËú:’·|IûlY6n˜þ6D!øüw”=~¸ç0…æ*RœÒ‡à1¯q‡âƒŽÄºßVoûÙ`õhÈê‡JúÃÚSâña‹ÒCSʯ’“X‰xB8sÒR7øÃœþv>wßä0>ŸÛý¹|wjFÕMmü_ß~ßл\aɪ°¿mªìæ§÷—´Õ…ºj”†|KÕ|Éø…u÷y1J]U9ñЊkfås0}ÕåëötáÉlæœ_™þÍ{/yU³³‡S’cÐo,úÍlVš]¹d±>yr›ÍJfŠYz×C˜…~ƾñî±ô„bõðÃxÛ7¾ÇZêîËv3€Z7ý›IªSS,µÞ§¨xwÔ¤>‰  ñ>Å¢¤£hú±·Ð²mŽj þ͆¦àú€Ög£l¸®~¢Æu¥S> P ÆUTÇ>z ¾üöòÿ?òE endstream endobj 8390 0 obj 6236 endobj 8394 0 obj [595 /XYZ 40.7999999 309.139999 0] endobj 8395 0 obj [595 /XYZ 40.7999999 309.139999 0] endobj 8396 0 obj [595 /XYZ 40.7999999 680.659999 0] endobj 8397 0 obj [595 /XYZ 40.7999999 680.659999 0] endobj 8398 0 obj << /Type /Annot /Subtype /Link /Rect [201.119999 716.179999 237.599999 723.859999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (https://github.com/swig/swig/wiki) >> >> endobj 8393 0 obj << /Type /Page /Parent 2 0 R /Contents 8399 0 R /Resources 8401 0 R /Annots 8402 0 R /MediaBox [0 0 595 842] >> endobj 8401 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8402 0 obj [ 8398 0 R ] endobj 8399 0 obj << /Length 8400 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€‘ER+𠇆 ääx2 3ƒ89ä離¤ªê&õqy|’ºË=°{Z-ùøöõÍ¿üýøÏÿß¼ÿòïã·ùß÷_uUwõôçxþúáéôP=}Ûm¥ÇóŸã·_ßߟŸO?¨îòâüÏéáõ#¦ÿûí·Ã›éÃÓO¾¼ÿóé»ÿõñO§ÿûùø×¿þùq^ïü ¿†±;óËôÒJ§ÿyúÝùá¿ùÝñ·Ó†Ëºç¿èµêT—·ï·WÕåëé«èÃêãXëÓ×Q©ó_í ÿùÇá§Ój·mTc£Tß5}½j¯O˪±WDZïN§oE³E.•¹®Ç–e¡ËŽTÞÑTÝôþ¥¨ ×Mm.ÇÔ'´Ë„Øu©lÐw¦æYè¼#•w´ôž¥È ï=³Ï‡Øu©Ü…†–i¡óŽTÞÑ® ÇKQAoêa˜ŽiLæAïKå.¤5Ö_v¤òŽ6ƒÞ³ôzfÐc.«¿­” 0Óñ°úËŽTÖÉ®€‡+‘áÞ ýtÈÚ܉Ǽ-•»P;òp›ËŽTÞÑ®w–úÌ¢é»þõÝó⻯‡7ŸTc†³ºùõ§ÓN.:ëôÏ×ÓqÛãgåÄ4ǯ?_×úÓŽ_>ŒU;š¾”Üé‰jГú-z¢Çô'øsô{øÎ;ô¤©á;=1ð<”½QNª:¸¾…ðÉøÄÀ'àÞê>ƒ_OØ/ŽË­yàò—3qYAÔÿñ;ø™iªfzàÛ ^¤³w2ñv¥¯ËÆ<Á»·Á§ìÏ›ñ «´ðÔÓ»meô žÝ’sŠó—~Õ^ÕÝ‘óƒÚ9ž}±îUÀ[sQ n<Ðf+ Õ ÐfÆs,ÏÝૈÇ=÷X£ýn€å90¾ TK8އ–Ï{Y ˜­úÆ>Ÿ$ûï;‹ÿÏ íP cýœÿÏÆŒj¯ »?y á2I©ªmº3}’î“ f øzãF*:r­ŽŸx‹›Ïä„»p@án A~;œÒ¦yÏb]œût¶˜ œß"¤O¼ó«$ðiÀÉ!X´ϪpÓ˜U{Ø;|‚Aî¨?ˆ!ßÀ£-cš‚ïð(€pùÆE£ê-QäªZÎ9<ÕaÃM=BŃž ÿ§Pi† â¥825âÊÊl«6Mð(¼Ñ¥Ø ìqï4A’Ú‹yHºlç0Ò=¯œóho RIÀ²vÝ´U(„ÎjàQØ Ã »å·ì Ãn8àp †qDå`áD„«S A ¹êâGB‡55l£Êð]Šâ£pJ{¯Í´ª®¦_¤íÕ#Œ.öƒ½5 ˆ6Z"E‘ ÙB%H“x»…AäNýUÑ¿s'‡ñh àÈQŸX‚æ…«>a8®w}J&æ@!ßøÕy¢=އ‰ÀH濃b9Ñ%g1¼×xÍÙaØ,çdu¼zvTÌdíLðdûöÊb6¡¥ÛÊ‚wªLo_êæ|Òa}xNQ×r¼l…ðâ"öàlXƒ€r%…Œñ"WwP<%å¨8*RñTd:‡5®yÄËCìuo¨}Îw&ˆ)·ö|ð˹›êüQ'aú§?øåðE¬ÊŠ)—¥Ê8IÆ$x,D¸-‰Çd8%¥³ (‚9|ÅrÙÆ>HجX!Ez­T+‹×Õ!‚JÅt {‡„ôíÞ€a´ëXQXIÄÑEÇ“ÿnŠ\âµÒNðøJ9âåõ *®|žZ7Ú¼ýAØ/“§o/”óBñGØóº–5·:ËäØ5¸x¬'™`èÅfwPk#™“æšà^ºª5”}(§²\XÞ~Ôª{Ž”1Ñ#g¤¤O`Ç®ãYÞ²E<Îí´~Ðhå(õZÍ4À×çbu† ‡øœ»H8D£çú“;Íí@à즸ÓôÚæhñâ«Tòûë_»0Á„ªD„E0àX Aäd[¹fÒV¼²l¿mÆdpwÌ ]O<]iV´3úv\fÔ’ŸÙ™eÑ»©œ`¬¨ÙÅÜ9,Ÿ%5ikD6tuÁž6¯€ÈFÔ†¶ÜB$ê˜ñ)“äÄ7>ʸh„Ì6H{£“[L=ý±%ùÒ“ëuô­õD½MçÞæÇyg„ïÌxWW“6î`dWÍ:¾ƒ‘ ŸãyÇÌÌRÛjÿŒ3CÕÌŠNÄ®U‡Vß3+X '5€°š*P©3¡ÞxÍ»1³s|ÁÑÎC $¨`š¥$ò²TÁˆÈ|pœp´ÃØú¶P²ý2Ê#¢ÂŽ}ëÄ}X,nÌâ±PÝc& ‹)œSÏMé`û]•Rç´R¡ ö;aT ¦èI2ùV[\>ECceÐ)¬Âº9Š?JWõ ÇÁã‹êIpMh°’Si°}eV*qÑÚʼ>9ù1e<¹›øÚEJ»ÞH;]À Êa0– ÙµBKj ÃjHi´Èk»P>gWM&ûÓ(9ÅŸËÚÙN¦KgX*¥øÆrì3‚ÍC2Ã(ÝžÖn¥—ÓÃç…¾ñ Y"ÑG2;¡u˜æŽÊ–q AžŒJ䕊Â' {õqQ¢ šK¬"£Zc‡«Ã?°aŠi2Áe ï|µLRŠ-‰ñÓ¡áÒr§P Algièñ(†¬YÉ4ƒ~°¸¼+jXÛÿx Ù°º˜õ•² b´ ^;<%ûª1— {î(ø‚o'a´gdŸ££YÙäª![w*2 „ÅÓšàyâ›ôn©Ö¾å]{·\òt˜oëÛÒS(A#™@*oç@BKÇÕ!̰ÂV¦ðµ½¼d¯<¹uº‘©bHÈO°‹ÍäpEŠÇ"ŸÊÁ5vÕ†(=»Ä#Âl…C¥Þ^\7Ç·.’)BòN»æ¢=,|LMŽ)5¤yKq°'t3Œ–¬'¼kV Ê`î-\ ÂÍ`ìÃZÎ:À’®Æ ·¢øßFè<%º¡_÷3 ":%Å……éS…ˆó;)%ÇÃÇ6üdö`$=ñ|!CiËØëÙ[¡xôüKaŒøÌ˱V÷Fɯ#ЩGk#PðË Ì)#]§ìKd(“n.om}Dt\}gÃãÚÎ*HHت Üüª„šQ–ikõZaÍ›MèäžßŒX7©Û…|ýÜÂõ„;ä”D 7§I@oÙŽ,.{b)Á&ày‚ðMÈ]y¤¹äœ“R[߯!g0×k¹‚UtR˜2(›Ç>r>nO ѲýPXÚ5åôpñ<Œøkõ7•f$;Äéö/¢½QºU”Ì4éUûáÒüئ¥$Ü<'žÑT¬Öû®3ZVò,D`Ÿir°â ¾aüäõÜðëŽ{zø~ŸïšõZ]6[ÆŠ]>Á2£-”Wgj=¢.ø¤$zÆXNˆyä3Þ5%÷’á€ù«d)JÏ½Þ –¢çâe )÷ÔP+¾{œyƒ1Ç¥á® Ž¦ã˜9î‚9$æ\.÷†³<±_Lé˜ áüÌñqv!ÿÉó9xo»Ìâ¡d|å£ îgŸO<Ó̃i{ƒ;Àù,$ÿÞA!ÏioX†²~Ž'§‡pÒ’\hPÛ᥸'ÛP;€m—guï63òyuÄ<’pÔƒ2J“Ò¹TXš5ÖÌ™“ÕZ¦åaž)V´ƒd2Oð†%•ªHPU˶lßA£”²©’‚¡k,É ÝÌX„ Q²4Iý!Xºa²NïÌÉÓáœÛ‘7Ë-B~m86a,ŽsN ®QDëC€&¨bYcYè{•µ‡f´x=É$Çf ÁÍB m±™×H*Žº³í%>&{c£±¥3ɹo,À”„ñ #a¼£VbêÄV—oLösgûþô_˜~qX‡WpÉ!dŒ]«³L’,Sšï穈Á°ÿ®Gí,œ˜B*„Îb,Ãҽ’Mtµ²ÁcïÆ×¹y¢8os­q»2}X•R¦Fe;#—ãéXÚ<.:PS¨Ó-Ï`Ê„Œ„.À,ÎŒǰq'Ø3˜Ã&¡+ÿŠå†m)¿'ößÞ’4B/aÆâê>hòœ æ>¢¤b$ŽQ¾üY}ìÆv„YýÚÎ'À87·‰Js¡…ñÆ 7Rxd3j˜||Ô*¸ÝÇ $¦-±µq 9?ÚkmÚ,ì—ØÍ»eø(sÝxÌ“O!õÈmw=óä¥ÂÔFé•2€\¶A ðNz$¨Ek¶ïr7»â.¡f_$…%§ÃOŽç±”‚“xS¬ä„ÊlJo^“OZh›ã‚™gs}weFl&xŸ"Z"aÌ X ä›5…OÅci4ÀÉüÜ›&ˆ;OŠå|“Nd²6d܈,)˯”fÆ’ ÷Ï„Ç92û‚„G„;ñe™¸¤T ]8%zñB}e: ¦0xÊ^)÷”^|XK‹S„l‚°ËÑÁæ­˜ð7%3œ%³»©Æpl=Ø4ÿÀQ—nmîÃÓÞ3C™s¸]„{aûÚV^RpiUˆ#çÞ4G¡n$E㢸UYØa‚¤ÅÖkRZ%²¤säÏ⃮zªdûÐÞVCIájŽB“ ÇÉãI|ŽÉ¤‘Zlòn íWâÃÆ$6˜P6Ea6AAåüÆGxj9ż‹D„Œr–„–ÐÕ0…o­URÒŠžïâ“ áã´v¬ q›$Üî; er²{·“¥ïŠ‚„­Åó°¦…ÄΙ·1.¦à_nΜ¾®¹•™ÔÓ¤KO®Ü·Öõ6ýÏFôÎÌZ•©úé¾mªë+㤃˜ìÚÎ"Ÿï]ÕÕôàÉ“Oé{»÷^rÞÁO>ÀLè;T¶NŠwpM£i« ¿bv >¢xöÖ!ˆÊ—²MRËÔ]E‰ŒÉ21ÙDÚÕ3N#ƒîÌ/åÑ,DÊ_dk#õ8XäIé·fÑ¢1}ç¶QrrÌÞB–¼‰%’˜ìKu}Ÿ"#ÙHÑË$T¾°Ò–„«ÕêÔ¶=½Ä¨[Ú?i~ÄîºF@¤¹ v D$ähÚpßNÜ=x—³)<' 5d)ƒIí˜Iž¹ÒòªÃ=Ìáš’T×WXÁÝÏØ?¿;y[Y··‰Ï8擄’ËZªë±žãsSjY) s”$ ¬UÅgøˆ$Z¬ßÐS–Y¨ o#¿œÅ_^¼{¤ÃW(¦CBþ\F¦LIMÚÔ×Il½ñ¡7fa’¾5JÃún,ˆñ…Ðë7Êk1 º¦GÛ%Lj!á?Æ1Ü`ÐÞÑ3kÏæ"Ló|¾<›kÃôŒg-y&7aJÙPex@smÓ”&ò–‰»ëf ÷MÞ1!œÛ€•¨"Y”y{ÄÚ[J¡dZPz˜•i¡A‘¢Ž¯•$ŸZÆbŠ•ÊKbiSžvGp<¬1è Õ{·µh4d$¼L8\,"÷bXB665Óªºš~‘È»)Ñj¼|FÇ÷jf¹vZQÇdæD„Ñò'A)(S±µ©šÌaèm Û’ÌA‹öºÑûÜIëR–ФAÆ€ØØò³„¯$'xÕý8Žöu‡¥!%P¨çYJø…Í¿°¥Õ>¿iÒ¼A–œOl&AòîÒ­†}á :(}¥YÊų:íPº97»¢ôÒ½¶I.aÜÇØ¾W£ÖËYKN_‰#ÁgÕ<¬üÕ,çˆY…8(£þW¨ÙÁ›1h$Ð([­åÁ^ÍÇñå$Ùx*ÐwÔ-K•éÃSH(ä6™Mºf¬¡tæã9$y,Ð#u¹ º@3ä°dOÎX÷ž’yœ17˜”¸½.$[ëÝ#ã„ ¤3h„$ —P×¥µr0ÅRìL^¨­Cáî”pK’°B;Œ¶"°¶[ªœÿÞÕbG¶ù£Tȳëÿ*ËÈc›ÀgYÛ„JÐYÐsƒI56©YÑ­¾ ãGͦsòsklN_Çï'”9¡Ãùæ¾ýêÁ!ùê;ò}ö¢Ÿ÷Õp3·î¨NÇXêR3ªnJè;ÞËÃf_P×Uݲ×vl*`¼è¾ê—Ë(û…'JSéq1¿ m«nâRöµ-}Îßá;Ãéu¥Ï&Ü¡ƒK«M\²uPvéwgïÿ ?¡wfMsé‰Bç˜åOÚ;ó¥œ}ÞÛ…2°îü½nUÿœH—à‡ïâÁÌÜ’ð`nÓ·€ñêÄQxƒ³Ø\€¬æSð;LÁøÏãÙÆÕ÷,ø0 uW©s'F 1zøÁE‡§<š‘??þt"öz endstream endobj 8400 0 obj 5289 endobj 8404 0 obj [596 /XYZ 40.7999999 368.659999 0] endobj 8405 0 obj [596 /XYZ 40.7999999 368.659999 0] endobj 8403 0 obj << /Type /Page /Parent 2 0 R /Contents 8406 0 R /Resources 8408 0 R /Annots 8409 0 R /MediaBox [0 0 595 842] >> endobj 8408 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8409 0 obj [ ] endobj 8406 0 obj << /Length 8407 0 R /Filter /FlateDecode >> stream xœí]I¯Ü¸¾÷¯ès·EŠÚ€ Àx CÃrr<™ƒÌ Îò÷Óý$u¿GöG²ŠEJê§10^ôDq)ÖúUÕÛ?~ùûñŸ¿ß¾ÿòŸã·é÷÷_Õ©j«ñ¿ãå×›çÿ ûS­Ç?v}sÒÃå¿ã·_ßߟŸÏÿÿ~PíÓ‹Óoç‡ó'ÆûöëáíøñÃø/_Þÿùü§ÿõñOç¿ý|üëßοý8wù_ýÐ^þðïñJ+ÝŸÿòüO—‡ÿ:üåwÇ_ÏSèŸÆ½üÿM§u¯û>i߯¯ª§_Ï_E«ŽCU7u{TJŸçÙœ·ã¿ÿ8ütí:Ó`”êZÓUÑ£vú2¬é»ãЇ®ÜAµE•:P3h™.3RiKS•éüC±·¾kÛ§evÉ;?”¼a½Q2]f¤’V6o<‰½ïýP‹T&y¿æ¡2U%u‚ç©´¥Í;‡ân½©†æi™çßR7l)yçU?áyF*ieԯû®»‘57]ê*ç‘’·«®…®ÎeF*ieó¾Ã‘ØûÞÔJˆÕ܆J¨5Ff ËŒdXg(öÖwÊHmýu¨Ôz-ty.3Úz<w뛪šHµMeó·¡RºÌEd ËŒTÚÒ¦­w‡ú,bo蛽ñÝó⻯‡·Ÿ”©û‹yõõ§óLžl´ñ·¯çå6Ç7e¼9ÿíÇãï«J8~ýù0œš¡îšÑ¨ŸTïÐ ŸTŸÐÕÁ'=zÒÀw* G3ô¹á•Vë3Pø;øð޶ô˜àwð^7ôh| pG«ðI-¹;ž•BJÄâÙQLxwöS`g¯1ÃÉsëñmdÜzÏ ðw ïµÆt )¤Æ§Íœ3õì5¤x¥Ìǯgž]"·Ã¼‹ø6©ù `2¦zšL«kûH»¶iuó|ÛFrëmeNfœ¶CeíI«ÞÚá÷ã;ö–w§ `sªu¯^ÌÄó¤µçˆÔž‰ªìwá*œUpÓ%½³Iø‰þdÏÄÙ5¼õö))gKð»5\>%GÃïÈï#kŽö÷Ü­··Ï%gŒV€<§«ï™aUžuFM 5ýà[à\%gFø\¹bÂrŽQ=ýƒÒó”Xß³GÕ­0šq=à6<§¤h[KTxèÒ &v‘ÂÿñÔàrœóö\hŽ ÃwOd·W;1.ç œ¹êñÏ"Û ßy| Êl>qŠŒÄDˆu› ðXá +W¥øÚd»ÏößSf>Úˆ•»Ô/AI®Öà—üBªŒ-¤:@ŽW+ÔÍ•XBÒ¡bçÅ+.7*ÄÉÆÝëOýP½4>'ωjæQnO~€„ø.»N4YÏFÍ‹'£Ô©1íå %11‡d\âðó¥øËÞð†­X Ë-~(Š%Þ4G¹ (& ƒ»áýÄ{RÜÉs([])Êi‚yë¡ÁìÒª®Å?vUnW嶤ÊÉ:Î\yDZrãí_Y¯í,EÆIk'xTþëð6çs²*?%X¸¥´&x]Šë#ãå¬Âõƒ¥ÃcêЖDÃVòÛĺÆâ9yxa×4~W„±IÜЬ•PU$™QF QMo“H¤ô=™—’yê£Q·œŸ(³UµÀ,òæ9ÐX¸¤ª²{Ìd­Ë¼¹8)²1deÒÅS“¢Uƒ%`pQ Oé"XB—7ñ yGks ܶomf¢0XYçnI‘R<Àå¾AKY§ž «ºKŠb ÙδÓ'M•༉U—uØ¥ëÃ?çœ ²Åª°H™®Ã‚SÝÆá#ø$53ŠáÜÎÜ!vB„»p@„S?³‡8!M6)Ç›ïÀÉÉô;›ëo(p‘mIIÿËìX … åuÃðr›i¡M‚Ëâ'žâ’ÐZñ”·Tð .ײФJ×>Z‘Q\üóÁö@aJÄû†ßÁëÁ³=|³ ¾Y°x®çÎaO<9%ÂࢩžÑp1S|> ÚñÅ;ŠéSÜëžgÖ¡‚®4®ŒWÊð‰yN›#Kð™bêe<Áskt9Éß«>Ì£â9­W#sŠ{çwõ~© Ò¢QÛõêw½µþ&‘3º]uö9m¬&ìþØBí¹ˆ’…sö:JI¤,ˆ›*š>Ð6ÃÃ>ÑøÈ”ËÖ MÇ£,áÏ„¡ŒO†aÕGr°!?*Å‘Pôιx¹ ¥ Š10¹¦ÈÌ”R~Y@ycQ‹mJzr=ûðƒ-OhÖw¡v^{³¦ªˆ=AIfÎ}ßÛÙ•£ÿ½ÝÆï&mG9íìd=¤¢>Í4 Ã·ßSÜŽ3kßÁ£AºöÜm¼FÓº5GP=1øRÑåy|%ÖÚ.B[hͼWý´XͱîwŸýâ§Åâøžáõ`×øϬˆ!c¥“=_†ÊûkG†uµ'Ù#E¦ª;›E¿º6˜2 M‚ÛS‡X¼HæëÒJ}pfÈ=Ã_ï‰-%¦\;‰¼6™2ñüb c·ƒŸÚf>-j#g”ÎM£í=ÜbT5\ çöè8i9y›°Êîp 7)ŒãühD\鮍ނÂ)ÂÌ÷fíÙÙœ2!­Ö(Z¼j°Ã¨RF‡j …ñ ŽÂ˜óÄ)¨!çŸYÖM›pÙRE²r§SäTf%9%e”à ´#ÜA\`^µ]+eÓ- #zÂÉXiÆ ñé/¸î{{§²‹9=hë›­dóT=VXÙ AqâŒL¤­»ij›ðöª‹a%f½ÌRÖ‰ˆ)—wxŽY¤HyBk뜕+[ÆÈ\›0€™Ð±d½Õ‚}©ÂŒ“UÞ‡ÓžkÎ<ˆÜ' \tl5ÉF{± h˯€YëAµ4}¡2=9ó"µ±6Y†9Þñ JÇñe„ý”°¬D+ŽÇ3k9=žxLÄ“'Œ/Ò|%Big”O›Á¬®™FPælN6ÆÖ«ADô}ܲSFéþå Ñ`‘{Ù©½ìÔåÉ«)²—ª|î̽ìÔ^vÊÏ•÷²Së(;e”é‚óYþ >­Óƒ’pÂV “i<…‘â¡Küs̹ð­e¤æì²`—Û•EùmÛç³ü“½Ì_µRxøä‹ÖúJðŒúNZìmâ8ï±[M¤-‚D;ÑVëõU±¤6Û'Ð\«µu°¹j0ãb¿ g›ã ¥¬(âw0KÃëJ,žÁb3{³Ðºk­ó¥ä’:lÉa$œÈz8˜‘¹[zþ.mcíº³s²©%x4@T¡&_îrš_9ÑaB³­…r`WÐ .>N(Ýñ&3¤cO[,ý-"’_£;gbUkÂ'D[ 5¯Æ9Œå»wóA5NU5Ê>à°¥ dpÔÃKòÀio÷™1Ö…)nˆI-˜žðª|Îl«z°nV&ÁŽ` 8Tâ-’¶áì@B?GV¬ª¶?]Ð8§âÆbÐx;W¤}*_)kUJ-EkDÌ(sa}ÁöͬUÛÉ/Ïš®¥l!UX× Ž`¶ä¼KGŒ§d¢æ°0üH…«„ˆHÊ™0|¥eBx‹wÕaÙo ßKêJPô,ᦠÎ_Ңʸ¢¶³WD°d«;*_ÌV¨•uÁ…Ð(ô£ûî,0ˆ´³¸coìoc˜EØ6“§’¡Ôf ô®œ Gƒ SŒÐÝ‚…Ê' º®÷Ì’ò”ú&ñN7l®xðÀ©obà‚·îÎêk[4pÐ%“ï;]Y*§Àâ„7AEÄ7šÅ+)åM×Á%L)ªW&DKM!•©€~í«–$©9xá$q&Í@‘ ‚Q‹á2B zbÉŠgãq¸ ¦ÓwŒÖóq\=wÕøŸ½€{Oæ»Ö5Öõý[Æ©óο3ÎMÕ§nÜÝÛ;ïàhãPÍiÜuG’©ê4Æ@Ÿ}§žŽJÛáQÕÂ'Í`"ßöTˆù^ÏÄaïÌï›g´Ís Ó%?ÏÍÙkøÄ3ëIÚœŒ¶¾S¤ï5 ïèÄ"ºSm;@eOnúN~©bš+NåÃ<™vJ¶r!PñVB„D€|/UÝdA5À Åõssš h;eoׇ/™Ù\u5§kÎùÁ9f!|½P•qœ/Ðà@Ù:ç¢ùU¯¨6º¦ ‚þ¯`5ýCŠ-Ec8gÇâlߺР|=´ìé^‡wÔ”£ÿ¶Ò;ýïôŸHÿkîe—p¥h”Q?@ãüD¬sáåäšÃx´F•ÏÜ=¶8šÞkOGN14}Ö³I¹M½wV]ƒ&òzº.­YÉvV}=gºêNZí™Q¿`¶1®d³ó ãxKÊæ4A_¸ÆŸÅ†dlW¶¡n6[ºb"%VØe ú”>~ãÓ¬â™Ã–[‚JTŸõ • ½˜ìUì%O`)ŒŽÀ\!>³LDœæí+òÁì˜Ä”pì2™œ°ð¦±•ðMGÆ%Zx2•œàd·r²IÖÏ)©²|`V[s¨!¬Î6(8ÇB`g‚åqôà×­‘û/«Á"hŸ zŒpÄ{ô<þþì#ºëìkœ]BžÏÛú&‹Sì…Ìž‚€©ÎÌ0ÿ0µ¦ž)ÌKºÀ ¦º¶M Ì®e¡žÉ YÅ®ÕõÍNå;•GÍmÍáæüäûÎ~Z?ø©¯RJqbïæ£q»`´nŽ/ 0Â-Ã<œ so¼†”P¸aæX/ÂPD¼¢-©–oµͼ7+4“Úë‡qvN!‹¾é_ü?¥p)!¼G(hÄh½OÏïÝ£¬äâ0Ò]ÓDÊwe‰¦³b朢näzX9KMmyo Ñ\ƒýõx[ÈÏÄ©(Q/‡ódÓm>d‹ãJÛC”QCqßç0_ŽçyyºH•@!s–_¾·tÅübžúaΣ¦`¯8›Í©¯Èù¡b$ƒE/YŠÃ `ú>A¯¤êv–“hÌÃÒˆVWRM.R@›"Í µE“t %üp:så)g¶ÕZamk ½ô¾°ÝGÀW?X.À^uŽ‚­ßRÒÕ^¹ô!+—f4ƒ,A³TÒ]JbárP,pöØ©¦µžÑ12W“1cšbJE÷3Žo*Þx’…؈X‰ž;@ƒË™A_ 6iJì‚H¡¤2‘5ÎT³ÏÚ}Ïyp­ÅUpÅG?ûPò™×O±–¾k ÚЪ2Ê’¶1–,Ù½O+D¬¸(YG¾qÐÀÁ¹Ê"AŠá‡öŠ„‘¾m—´/šg¤O#ù3y¦¨ÖýE¡Z—´pkù$*>îWÈk³ßxBÈ—V¶C]"Ì ¤Öådö¦·¸}ÞÒùk”{ñâ¯3Åá\€ é,‚‘.Uü’,à&ëÉËR’¯ÜÉ3¬Aœ0‰ÍÓ`ž@saÕ ®ã§ÉÆ¥W‘Õl©}ýºîžú=ƒnlË—cÀ¥†²×Uf{ü6Ï< g‰{Ñt~±ìUŽö* ×^%,`¡Ê̾äÖx0Aƒ¥DâXSQ7g` úVò ,WãuÌ ò!ùÆ@N¼ãTgüvÑ‹gwKÀOd2uò—`¡”'£ô!¬ÒRI̯¤÷)Âmé—bä]ÛÛŒü!üxëƒ ì=Ô<5ßÊõšhÎË~yUIÌmÚwrô´xÚßó¯ã÷óFž7éòÓoß~ñì¬{$ÕíH>{Åûjð4ûö¨Î˸§€ªƒ„ÇúZÌxªÓ¶§ö>re0'‡(Gª»SwÛÚÝy22¦º>éán¾gӜڑÈmuï;=|g€ïŒÚé“®êË£Û“wp´‘3<ÿ—ðg'ÍõÎ ?¡w&.yï‰Bë˜8íéÄ(kŸæöt¨îògݨ¹Y§ÏÒÁÄ Ht >!ŠW œâŽwvÖ³çRð;JÁô×㙦Õ÷"ôÐ÷U{R—ȉEü0&Ñgýf>KòçãçÃÿÒ†´/ endstream endobj 8407 0 obj 5504 endobj 8411 0 obj [597 /XYZ 40.7999999 461.779999 0] endobj 8412 0 obj [597 /XYZ 40.7999999 662.419999 0] endobj 8413 0 obj [597 /XYZ 40.7999999 461.779999 0] endobj 8414 0 obj [597 /XYZ 32.1599999 356.179999 0] endobj 8415 0 obj [597 /XYZ 40.7999999 558.740000 0] endobj 8416 0 obj [597 /XYZ 33.1199999 354.259999 0] endobj 8417 0 obj [597 /XYZ 40.7999999 294.739999 0] endobj 8418 0 obj [597 /XYZ 40.7999999 294.739999 0] endobj 8419 0 obj [597 /XYZ 40.7999999 662.419999 0] endobj 8420 0 obj [597 /XYZ 40.7999999 558.740000 0] endobj 8410 0 obj << /Type /Page /Parent 2 0 R /Contents 8421 0 R /Resources 8423 0 R /Annots 8424 0 R /MediaBox [0 0 595 842] >> endobj 8423 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8424 0 obj [ ] endobj 8421 0 obj << /Length 8422 0 R /Filter /FlateDecode >> stream xœí]KÜ:vÞ÷¯¨õ·®øÐƒ@0@ÛmÈ"€q ddxf2äâÌ"?ª–TU"õQäá!%U— ¸Û¥‡‡çýøõŸûÏÓýãôëçßþçôcüùù·—ê\5ÕðçtùûËý²;+9üÚvõYšËŸÓß_~ž~¾|{ùÖÿûóE4ï/Ž?ú‡ÓÀÿøñ÷—_‡É_†O~ûü¯ýoÿw’§éÿ÷·Ó¿ÿGÿãOãx—/üþÒ™æòË¿)d×ÿçþ·Ëÿ¾üÛNï—н{ù÷—VêJ÷kIYÇÏë«âýïý«h²êdªºªåIÙ¯³î?ýß?¿ü¥íºŒ³ÑB´n«àQ[ù>l%N¦mz×ΠÎÞ‡Jè²–.+i[•nýC‘Aßôÿ¹l³nS÷9” °æòƒe q$egàáHd¸w#ž¦Ã½ãÂø®_ Ï@ïhÊw8Ò¹kÆ?ð÷yºË$¦ë'égìé$×ñ6ÚŒ‡¢t"4oC¥ÔHÍ3ÐeE"mkã»C}cávòÆí~z^üôýåׯB«îÂÜ¿ÿ¥_É»„0üøÞo·>ýr!»=6}ÿÓéŸzò«ÿxúþ·s®jëA¤8ò“ê+|bÐÕÀw:øDµµè‰„+¨á~ðù¹ ðªu çÁ0€ïàýàwð<ž“û?šÂ§Ï¾#¯1Üð~0 0î`XóÞ¬Ró=Ú$a±1‹tÙ?»X®Ë¹XáÈzìrL 2dçSjäS7Òâb>^ž9ç]ŠÄ "€Èq¨¶/ R.t¸æRÚô£iSNüN8R´+ÐÕ¹UMÑì±%™°O’±’…$Ö0Š˜¿jöÎÈ+Zmó ŠÇCdÅ’3EüŒ TXÔbqÖPè‹X½¦îød­3iVch’µi}›)Ö&GRâ°ÎzX…-Ÿ¬¢\uVÉU\Ž1÷pHÜëF²êžK rGˆ*«ÞSW  èXÁ£œŸ] ÓYh–Ù$–¤99:'AÀ8³îOç9îÑ*XñÄ,Žr0'GeŒ Ž”³N #l4”û./¬ÓX‰ƒ\ „Tt œ"àJ%ˆAØCQ­’ÖÊ¿°¡+¦QÆ7Ö…/ŠÆn"™ŒËø?Ž›Žª^LÐ’b¼‘ r)r£K˜m®BÂS#Ÿ»qNîyQ@Ü Áý³*åÐúêBjrF ”;röÉ¥Ã–Ž·³Jà׃žX|^<þŠ5þÈ ŒäÊ‹àSxz¼§Rª7¸Øð‹A =`ã°uÐb/ÖŒ¡Í]Y ,†å“iÖSF†oÈó{šK2Dãá)zC‚iúÑÍ&1è'?£H¼ù,ùpI1a³”À‚$–×îNNE£¶5 JÌÉŽñ¥ø¿×ì´ì¦KÀ4×oÎ"´R‚ )¦ŒyÉãds¸`¸#u("¿M˜2‡†”Nް|{Ž-‚•â]l:á»;JÜq]ÛtвNJ-¯Ûó@A)6ôaË%w?K`N„Þ£âh߬IŽYìþ>Va½ä œ™2Š#FÅÀ‚ Ïm Ìc€_g½,þx(h4°‡Fã!ºX´oº{ÃÕdf¦xÏdëjar¢èá‡C(Rº(ádçQ…´»VâàH¨)'C1 Ç&¢†ÇÑžÚ °˜:¡Ç|,.·DJ‡›'ô4þíÉ'®kÔ„YºF²y¿F—|Íq™×JwÕðdžÂÒ“ #GÉÝ^ãß‘ |ÇÀy†µ un-Þê :£ ()êó€‘w+Ó! wó¨¥?)ø¿SÁy¾`ÐŽXª†í„À@ øÛµzx|>Ü©ÑÚ&䂵€;Å«ÆgŠONB¸Á0ŸÄÑQêÎÏaUs-ß)X@ü`xnE$ÊÌŒ÷\Ü-œ9ºg%[Ì•””=¯­áH‘˜zUþøpÇÀƒUÀŒÀd­áÙ‹‘^u¦jü·tÍ)nÕhc@Pêa%N˜wÀ(H€QÊ6iŽÅü#¢&rr•ºµØŠ‡‚EÔýÀ–,¬Œ³¨X”«Íb»c©‡AXÉ(IùìXxi„ùRBÖcÜVëþA'&-|ã:î祔.|¦£Ž~ ˆ§K£·@ËiB7Òâ ¤°É KÙÝÁã)ïN0. Ow¥„d×”7b­•”§(`Êö¶uÐùžùtÔh¤ªµ®<‰ón][m?äc„z%Ì“åÎÇ”4\/tYØ´U"WHЊ6j³um _üyJá܈2µ,¥±V˜ød°œ…@ŒMå£HRœ;!pÉ5H8£:ûül}°}‰ îO,UÿÀE´yê2å©KìáóôúŸ4dÓ­/óÁÍ|‘?+ÀÖ×òUžÚ`5–I)^Ãs‰åÛœð¦x/³ÞBqIn ‚©79kÛáÚGORq°Åð:бè&$ 醕Ct+,þÓEws‚ütŒX’ÈÓ$”Ô=˜…„?|™—)fŸ ÓzD$‹f˜ENjfjÈéïï”Å!2× èr»MB¼/L:sœ‡%ÁñKv±cÔjëu>:ã~ª`±ª¡FpÖýÎêS·oøöÊBwjfJœ'A'ÁÐM12rÒÛœçó ϯŷ!³ô =£• G+²/oà–oUk3Š­äR¢IxÉ—¤TU* ð4õ6õîÙ¸ú dM , övת»‘+ó¹·²&g±%JUN úÍò(´ÄZžvZ1SÕz±–zÍ…Ä”õèØdŒi Mèr˜_N®+eóŽÜ‡®ž"ÐòÐŽšG°×'T2(»*Oz «˜òUäXt'”°ÅÛÄdû‰ÑÒæ »)mt(‘0  ¶Œo•_ɬ«”üüu#pL©s1K½ÚfTÈÑc xÚŒ¶±ÑÂîòv&Û€©ZÙ´§°M=&»ƒ?¢iúîCW'iÄÖ¡ò¹gAÊ[²t©pž#X­Hé»p½4gDª—y Õ×SÉ3\kq[8u&W-|žŽÀ$Vs½ó&c{–ê ¿TÃÊ]¥ -V„¾Öb¢Û¡ÇóÀãcYÜ…ãÕ(1»¾=…Äñ“Råeü;ž2ëx´Ï:JÅæÙ)<Ò~àª=§ ‹Ãã3U¥bæëvJ»OÊ0É„'t8*"œ‰»}x‘bJmÊGרÊ8ÿH¹ëŒ7Bó§4‹Â‚]„Æ¡ŸáâícŸ÷z?Dö„ƒ%+«+1O ¡‚䆞zÝJ‹P³ÐGIó;¢8C³¾Ç¬’PW*f²¤Nm’ 4:\ˆ;ªC')„¬L× Þz³¶ÈÛb»vI‚s‚Ó¥dåäÄ=Ðt‹ZÖ‚éÍ6ª&œ©Qx¢ÒŽxÉV5]£ã] h”¦Y‡µ/ Ût¸$Œh€Ä¦y ­:”¦4ô n´™/Мk}¹ôÄÀ'¯èÉx«žÈÏp4 ßÁ+øÊºŸÀw„›øQ W÷£j8^|‚çÁ;Å«IçÒ“7Â)àÓÆØÛ®œB~JÕVj~a¶Oœ)S•ëH¿CÌß s1¶°¹¡“ÂXï]vÉQŽŽÎÛ:Gð4çZYF“ìa…‚··2iQDHŠ&¶UÐÝÉÙ99°ïÄnDù=&®—5»~ôæ1If"²™l))Ž)Þ,˜PÂÎyk|Å[b"ĹÌÙǼ†Ô}W2lÍ:žHGl}YÙÈÚ–•yµdhاLnÝËäÅB²Z=-f!Y¾ÃwFF+Ô¹µCqÌx•­3 ¯Â£áP©/“>ÓÙj:‚;å ÖZ]A3ε“2HzðSJžX¢ë±|nó‰è–uä8Rå$6‹ŸÉ‡”Y0ÉŒ°}…½<ùbéñH!.ù„–.9izm,¢þab<ƒóÿƒÒ®",3„êOžž¿Î¢÷sWÓitk!2öo ìý%øé<>7<öíÁ`ï︂œu>µ²ÉÄnc2JFtJ¯Ÿõ3¢àQoÜ3n „ÂÙuÝÁz]ºL ¼;¢ŠšÇe¡ÒÁ­\¥Ý)×Ç„À~¤Þ#Öî{´rtUÒ2ykw¢ãçä*FYl%óå°÷9™­~cùB­‚ï|]ÝÐhϸßÐͤß#Ö­^áâœñ§bxîrÅ•î_þbïh¤níÙtöp_áF0Ä& ÈõKAøO±o2i|góÄÂÃCôñž·»¤:K†•x‘$å8J;,’ÉM-´Mo^•kû|IF…ki—Ù^ƒÝ§©ÄµÆô»œžâÏ ¯–˜9oh³X¸ÆCµ|àLõãé/ÚÒ\ÎÉ)ñ½n¯YOÙ¢¨Ë\16FܜՒP,¥f” #ià9›ÏhìÈb™‹ioáXrì+ì†ó‡§1äÖ몶È?…Zx4L ‡`¹5»K K°âæ¾GôSò6‹´Ü¬^^auEŒ^'}¶KRx棄rÐ1oëjw£oœLÃ5Îô#ëÆ5ºöq5ywû³šÁ'ë|Œ´èdc0iåg+mk‹–A»%–Àª,ΓòÃÌXW…r„!»ùÁoße w`z„‘£ ]@¦ §"¹¨YBõmRûvŠm|¿Ðc$¼„,™ccØß]¦k"9‰}cljO)ÇèX"âÿÉm›õ婚¢aGpˆÕ–Önx\‚¥8K…øËu¸GÏc§ ”¥`‰±ÝK*-¯Ûn¿v½ŸLÎ ªµIúÎBïnÆ[-òXãÖÉ4<JˆMw¯!­%ÞÝ ,bKuK/Ñ\6×Ö3Áé÷ëÿ›s×U§¦½üh…è†O»SÓLö„é“/M}ÂÈ®×oéÙ(ú~Žþûãÿõ嵓ý¶ræP—w¬•ôß2³QÌ|Ž¿¾|úC®l¾!n5_5º')­“Ö}Êîè)AømôÐ…í.<Æ•´v“sÌÛ ‡#²¸PD‡§ Ãzÿ0BúƘe§Làxᔈ³õw)ág %Tjo£939„M©SdÞR%`îÝeiLݨ9S7z‰©›Æf¸ý'S¿|KÏFÑ÷s\™º‘KLÝgá2õË·Ìl3Ÿ£S7“à!p«¡ÝF‹§u¡º!Gè†ÂÚׇR™§ë­€¤k4Ϻ­5BLêû±ª ¸Œ."n½L?K4XÀßu¹/vᡲb×V}wŸ5Ý=/VGÜÁ, õ›1 ÒIbÇ,D¿}#ã”DfBÇ«²¢gÖÒÆb4‘ sW ~¶'O¡·Q7’·<ØC6•Ámƒ=Í’ð;x?xÕ°­ÌÞÖFšîN º¼Yû x:‚’Q8ð6Ëßbͤ ‰(L¹Z/‡Å\aŒˆ›ñ´2ÄHÁ@]!§þ3´µ¿#Ê& –á%CRÜÞ,ÕpžÒÀ±ñHÿ¼‚ncìkø”¬2IVQ-ÐW¥VöɯÊ\Øý¶d¦‡oÈó€æ1ÊsÖà+[³`‰ðXø×UO‚ñä-…yK΋9b¤ª¡QÒ³Æ ªVâJY”ú.)íàV§±Öõîà'"yàœ† Ø’2 ;2©†àÇ„_æ¯Ô:4&Bd&¨žÛ©¸,m=R"±Xº&R€´ž-¸ê²c ’º›Imdmé\>±Þ¿¥g£èû9¦@ ©Û…@ ©í`£Ë'v Ðû·Ìl3Ÿ# ¬¯=×°3bÑ|ÏP g(»Ý•É숛yn w꦳™¢j"²)ñÎQrÝU^Xš³[@Ö ñÚæ‡F•7Ñ‘"ÚóPý6‚ Vvè³Û>—ösøÒ8’j=@ÚYº-ƒT=²7©zbm©ºhI¼ý'ŽT}ù–ž¢ïç¸JÕÃk¶TÝ?´çЮT}ù–™bæsªÛ©B—š ön^H^É.æb{cnÍþšþ²˜C)n˜`mÔ›"»SøgFKA§ç4­«—hZ×Úô¦ÿÄ¡i—oéÙ(ú~Ž+MëÔMë¤3‡tiÚå[f6Š™ÏQ€¦uf¯4-¯÷ZŒ±7ÜŠ+Fø¡¶zEOöÜb¯²„ïà`_8e°Ó­g4¸}Ẃ+ ¬M 8îÜ‹! W  j|rè8šÀØ G“xÕø|‘8*Cô˜ñ¼·d{<ðÜS Q8Zï©ÊÍÒ4'ˆ²÷/ãâÅï ‘Q4šP }ÝxçÉtÀ¦(“¾iû^¸J’¶U5OÐWÕR‚þ¥}Ì\¾|bKÛïßÒ³Qôý“´­ª¥}UÙ¾¿Ë'¶´ýþ-3ÅÌçÈ/m«êš ÿ1¥íž²áS6ü²aÎĈ1KêvËUpÁ5ËÁ–91¤áï–(ÿclй}’ÿcËD ˆÆf›TRÎ¥%©–¤%YÛ’Lÿ‰#-]¾¥g£èû9®Ò’KÒ’¬œ9*WZº|ËÌF1ó9 HK²>NØŒ†·ùéBþx%GÊËãÉËÄpeé¨q€ât6–SzTÚ"»”¨R¦7̗؉M)r„¢ááÔgUlñŵqÌDõ"B퀼’,Éü$jK!vlŒ ^oÎjóö8Â] H=Û³ïNÙ2sÌõ¡¤eQ/JïÎ2Ñ/„ —Ìñ[Iš’9”–HQ‚öJïóçç*ós?.ß(a…©ç¹dª^Ê%SãOjÜ\²÷oéÙ(ú~Ž«¦^Ê%Sµã«Ý\²÷o™Ù(f>G+L3å è ã:;+ßp„€§)çiÊá‘/Ÿ¦œQŸ¦C = (Âï–[j ¿-©3óˆi3”Gä§ Ƕ£dQeuÈWq5"§ž0¡PJ¡¤–Œ¨U’·«3¥3s(©Ù5ºðª1ë4Ã#G§È+ážPJYû˜NÞk×!gQ6åh-%âÛúZÓòflH%% ‘Hxß6r‘ŒG'ú½,Ÿ7gƘî–ÍÆ¢N®¯Ž£»À³§F&¬séœ1jzHÑýx¾èB¼9K©M÷Û ÿðWð€^½ "5«Ê ëžÈÜ"Þ¯Ãg\=€êìÂ= ‚%zµƒ÷ÂÌû\+³ÔçZ»ÏõåÇ{a¦>××QôýWï…Yês­ŒÝçúò‰ã½0SŸëë(f>G~ï…®®”eëd·ÌêûŒ¶|ý~VÚÝ_BÙF²ƒ#‡.KÁ&5·#Ä€¹¼3Îþ-¼¾¹˜Z»ŒGÒæ#‘þuŸãV%(Ù1΃†ÚOD1oð–$óº¾SjÜ"âu ¯WÀ !ZÆè9å5¶ZH‹¿P˜úê]y $e’‘Ò9ÜúãÎvø:GÐ.…\¦DPï°‚î³|sâi“CLÉéÒ6‡ …äD¨x³¦ÿ”Üï²m±žŒ®1¢j!më)æÆpÕÝŠ¹I~ñiݸÌÂ.b¿„óa/pÞúÈ=JoÜø“x§HVØYDðÙô­¸ |`wÕ:íÁ^Mu*¬)æ!™}},…'bŒYÈTRº¾ ¼ÆŸŽây£ÂZÓØd–5*ÌS±Xäf!ÖöÞò'¹j‡mELæ=ñ®©—WWKnÃs5•Z>×\©]F8¬IñâLæÈÑÎ7¾ï¸&¬T7Ø õµ;ÆŽ«º>ƒ³c‚‡¾”à‘Á¬åÕcÖ,/‰ v \Žæ)Õ K†âw ³|Jðx™ÖST·"4&ÈB£V€Ë‘J¼jBÙSOiQ 7,dàRҾėF&à‹ `…ç>âÒºpúNTëÿž~ö@é7|ùÂøãÇïAñ€•øÍ `ï««'Ó5'Ñoc)^Ùˆfèð~R•ž“¦97ËâšÑg`;–í¹µçÎváÉ m*u–f1«®ÏÍÀÓlä_š§ƒïøÎ`{håYVïé(6 Zmà©÷Ÿ¼ÁïŽ~ˆ…~EïŒLlé‰@ûŒ¸wÆ‹Ùû¸¶÷ €u—ße-¦²FŸ6>Sˆ¢ŽÇƒQb[Âxx¶~£µqá‰ø?ƇÑræÙiíîTØ{®†G¼Æû„ä0~#œñ•tî >Wt#cÂpÒs pO‚Æ÷P'Œ{x|ˆah¼A:Œ×9“=«†0‰ ´;ÆŸa g†Ø?¤/¬IÝ‰å ”³ëªæ,.Áî …‹õlðõ^ša”dNß^þ¬g:„ endstream endobj 8422 0 obj 7344 endobj 8426 0 obj [598 /XYZ 40.7999999 749.779999 0] endobj 8427 0 obj [598 /XYZ 33.1199999 259.220000 0] endobj 8428 0 obj [598 /XYZ 40.7999999 749.779999 0] endobj 8429 0 obj [598 /XYZ 40.7999999 208.340000 0] endobj 8430 0 obj [598 /XYZ 32.1599999 261.139999 0] endobj 8431 0 obj [598 /XYZ 40.7999999 208.340000 0] endobj 8425 0 obj << /Type /Page /Parent 2 0 R /Contents 8432 0 R /Resources 8434 0 R /Annots 8435 0 R /MediaBox [0 0 595 842] >> endobj 8434 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8435 0 obj [ ] endobj 8432 0 obj << /Length 8433 0 R /Filter /FlateDecode >> stream xœí][Û¸~÷¯ðsUÄ›HEÌL¦@  Ї¢E¶ÛbÑ]4݇þýÊeÏðè#Å#жgœ›Ù¡y;÷+ýá_þ¾ÿçoû_þ³ÿæÿ}ü²k›¶kÇ?ûÃß^þBºFÉñGëL#ûßý·_vß÷ßwŸwŸ‡ÿ~߉î8Ñÿ3 N[Œ þöí×݇qóÝø›/~úß^îÿ4üßÏû¿þmøçG¿Þá¿ì\ß~ø÷øƒBºá^þtü×î/¿Ûÿ:Á×=ü÷+4Z¯:Ç÷ÓTqüûr*Ú¬Ý÷mg:·Bç48þûÝOÃj§c4½ÂvÚ¶‹Wµò°¬îž·Ý^(M%w[¸ÔÚ…:©Ë,t8‘Xw5Ñj_Š z«ÌñšÎ˜µ–Z 1k\_ô‡‰uW›@—j\çÿÀŸ—lä7ïúa—aËeKaØö¡i)ÃfâeZi5‚û^Zh8‘Xu3_¼î®Õ£1vå-O+­—ƒž+²ÐáDbÕÍ<ÜÉJŸ‹h;yÖvß#¾î>< ­ÜA¹ýi8ÈÑBÿù:\Öì8h='÷_Üÿ¾m•üÃþëÏ»¾1½²f4)Æ-Ž#Ÿ¾7Øú<]+¦ó<—ÚuزŸÛRvã–ÝtQ)&œ­ªq¤upÄGtcM0"žŠÎéÑ¥#B5V¸ÃèyµqŽmÔpMùjDG³p°{^´ãjm3¼yÎ?›–èlžÜ„mzy:ÈG4ǘqdØh<öyµ§RÄÒúÔíH,½¶/-Dct÷êbB¯é 4‘UmÈ}í'*%x…*OFî¼1^olЈpÁòøŒøÆò9XD”§Ï«>†¿¹Ð5.¤ZOgÂL'8|„@z@h¢Ãûysë¢Ë •®`RÚ.\$cUrašq‹pUùi1ݤçzqä–Ð+‡í’ L§|„†Y#˜Á©Tz A0ùèIêÊP¿ÀEäÓb]>"¨NÝkKaC¹ácL+!BÔ#Ô<UX[‰F”õ ß#á!%ÄU‡æÒ›‚#ŸHNÁ\#‰¼Âl%gZi‰Qi 9-[–Iè…áY©ÄÄ”•±_€3V]®f¨5‚ñˆ/œÔž9Š}¹¾!׊f†6‰Ñ´™ºÜÖØFb‡­HïcÍék?Ò6}퓨/Ά_¯†G¶W8}'…âž S{tÌPë[Óq†yD$F·¹]1šV˜M…ñ ðÒ}DÅIø‹…,—gsZ†±OE-qY2lrñ~9§/§Ó%´zÉõ°G–6ä|ÄjN ajÉp8kyE„ßæ*M¹>vÊTØeX&Ú›òõ’EàÆ«\–m}4ÊÉŸJk:ma;7Aõ£×a$âƒ23#'G›Œxž›ÓÂ}:8ò÷éáÈ3cxÓÈ ðÈ#¢ðl², 0æàjÂÁ9ÚÁ«AÚÁÀÂ-Qx¶…`ºp¦.}ž+ë,`ŠÇ7…s"XÀ˜Ã7Ågƒ4Áæ 7ÎÙ0õâ&÷©¢%\Û¥©K|L—x5Œáw3"1]–¥̵OpÊ'ŽÞm!§Ë¾"•ËÉtÇrY™|Y®±ŒÅºöâÔw§òUT^‡bµNRŸ„2VcøbºÄRr††öBD3\1gp(VBzQØÒ»¸R˜›RþCúïTÚÆ†‹éRCž¹Ëÿ;ýç`¨¬ß„5ÐUØLý©ì•?Â8‰xíØ‹bxŸe}²ˆoŽWÃ# µÅrõ–†„N$Þ‚1‡í,Y‚”hà<ÂÂ'ZoʉFa©*!àBzN¼2B!Œ}"ˆÄD(R<'NåõGI¬ú´]¹ ŽDôæ=zó…0g`ù„e –Ñs8²Š¥CÅxco\’–±õŽ-þHTâ$ÂMoläFb²lçH^ ëçb _ 8ÞÚx •‰ª\œÆns¤–Ç{yÍ=^¬86 ö¡ð>½‰y“¡é°äªÛíû.GNÔ[¸ç³ËÜ9ý8=ÂÏŒ}pÅÑÍJÛŠt®Ël!`J’pDãÄVÙ(ÄUKì§`̽‰ÂágŽ€#>I_¸?«)“‹k*9yTƒc4 ¹q›ùªÂ/œc0ÅB›K›Š4f§'SXµ¾eó;8çV6çHŽ—Ì¨–dÕ7­‰ää)®¹B™“%ˆÐ(<5¦^]/j…(pÒ,9&`výýD–8š‰ÇUð+ËAÌ霸&CFs2à,Àé`äö"ÙÅ‹CTÔË.Z¡×ô áê,Žý‰Ñcc`8BËE1\Ö®‰@´, 5(¬þN ûÜÉÅ©ÎÂ#eOå#ºvÓ6q9Ø^¬`tuE¢òEí´ËÛO—·Æ8}¦äôÉa>cD?/ooD¼+\űӰì,O¾âepºêñ–e+·ÀVœHyêŒ{cqëZþ]YÉ)ÛgQ4ÖÍéKàt,”ìV|ÀJ­’çay0÷Úòk¨RºâŒC¤7¯( ®ÙÏOÂ Ž põ­õbyýœl¶Í*u!Ö”ÿª]@ٸʈó6Á®ãtép²ókq?îZìSÔfºj¸aÍ€ç` „%Ãzǹˆ´ƒ(R+†¹žQ/Êy]$R±ŠGzªl„Ã:Ò׆»×¯D:ëŠV¦*†þ‰ô2$R[±–O‰©Û÷6ëE#’‹a£ß& XL­1£n2b-à—vŠZ œ÷hY^ösðkC:¸?ã‡9ÄÔËðf Înbµ’}|½ºV™S­@¥zëÂ1[F–ÕÍð¿#ï1cÜcžÁ2­¦/Ý›$î#v0¶i1|±ýsñø+«BÇàŒ¢ûDìFN=;¶‹ÚÛ Ãgù¡Ÿi1å±NætHb+ç6{4ËÊ€Z½“«€ÓŸXô5ÜyÍQIŠí¬ÈM/ÿz<®ÝaH»;íT¤~ÝK‰¯NYê¢ÿ^µ[Zâß9°:^%D#p»Ùš4mÅ&Pl+æúu=ò¥ìH„®àH„OÊ®†ý3Îû«œÈ'ªÈ‰qNÀ¨ì+\ t“oÌW« z7ßMQñ½ßaã>‰­Ûae¯aÖ¢ÿkŽæÖ‚Á=ÒÆ‹´U“Ñ•¾×í ªvoYW×Ñ,Ò%qr›#¬®JF£l\ÇQÞÑ;WîÛm¯†Ê/oÕz±¸šõR©¶½lEë›1â³Ý¿€ѨÄYœ.»Ûô *wW½^À2wL(l{¿1¸]ó·®À\‹©æ’næR'Éalg:i(]9}&OÁ'¼<{1ednÝèñ¦DÈÏ$÷õªpf®´áÜQîØ¦t |Ô "·à‘ýÈÑFaÙ5R¸à£j'áªZ…×"÷±f%x…qŠ>ræp15þBˆÆèîpP® =Ýï<§Gs¼ÿ13rª,§dÉ«´™ûyé08)ÂÕ}`CÈ 9¡Š›A=Ý—à$ƒnáÈÆI3{Q²ñ©ïŸPðVáG1œñ1¯ "Ãç¿¥Pv2ÊþiŸ¹›`ÙÀ¸=&ÿ0úºRë*Ÿñuð¡ i–X$BVä£}x z¼*æE¬Þ’‚‹§–#…#ý°¦§§‡:#"\Ÿ‹NWEN÷Iëà–&²ÁQk„`0"GŒ˜ppd*ÄtŠA’!+2 ´¤u Bâb½ ÞPñô2tÈXŒPhË£ÄX¦ö'–WZGú°¹0Ój« Mw\KuÊ^aÑÉáqŒe†ˆ^£Ó#T­ØÈ½0,ðjkTO>/êñ²o™¿\ëe˜ƒ6Ž;F,†å¦•äDøâDÀQháª+g¹¡ñÇRˆÝPÄ(!ó6‚6÷´X_žÛžä¤0bééU9±Tx¼—¿oÐ…w|ù‘>øˆO” ;&þ¨çjÛôNÊñì3r³P >ë=yÑ6n»è†tYOæsG §5ð’,;eË©VQž<+¾Zr,™±OçÌ,çx«b¸XgÅ«p¡hoÑò?n¾cÆxCÔk¸¹9ÅÞ'H˜IV…|ÑR(§Ý}"Z8޶k—»|‘HR:"=²»k\ßj[É¡–ó¼LƒÈ9Îö°œÇj$C¯Ñ^*“:#_†‹Æˆ§GŽˆý =†Kaob- ¬{„c*at1$Ç÷)ËKŒ–Û§¬ ÔÊdQµâM9°à9S6{°v^Ó&¡øÀH%À]®ØÒ±m‘~Yº*ëÒ¯prÄ.'A8à#Ô£9ÆW2bÒ«4Ðrxf„¾¯˜L˜[ mÂ0)®;ù³TûöIâáD0•Ηܭ–ó‘²­Ú ~ìù‹I©gVº¹„›µª„Œ‘£"†f‘tÆ6Qa9Ïš˜ˆñW$ YD“ŽKÊbó!Ê0§œŒ­üIó˜Øx˸¿Ò°¹Mæ K§8÷«m릆E£uÍ¿¦®%Ãù-$»¼2¬Ånv ÖAEÊ×8"a¹Àâ»:‰ä â‹­ 5ŒU.Ð0Õý¿E%³Ä‡/6 ð‘Ý7µÙÊS“Q;þ Ñ872±’5áH—?çü¨7™Ó£9þi7a›^yË´š¯mC³OhDL¬#‰éåE£I‰k¿5‘{—;›3ÇÚÈüuÓyÛö— ¡C á&TΗlâ§ O?‹b-÷ˆ†„<$¥9= •ÌÏ[k¹ñ\F«ÃC³ÚC¶ÍN¯ËãZ‘€QàÈ6¸µB¼Ãƒ¾¯¥@1ÉÜ^N™ÉŠ4 Ö1øß¶”ýbr#í¿šbæIDÛšÁ¾¼9mûÖí7u³Bë×–/Hd‘Åé–9ÛT3q¦ó+ׯÓ3w]èµäDÒp{Àrÿ›¥ŠælWÔ1­Ê½Þpq}7Z«$•U²}ªx½ ¯}ýª,ïÅ–Ô·0mêV»º+Z˪?(nÓÇôg4aU`ܤ$®T>Tó¸Ó¦[™¾½"¡šŒ2ÞŒê±Oͤ¹‰¼þ­éŒnmz2NVîÒ7[Ç*ǬŠT¸f4jlÓK‚‰@=A®Ë.n¼Ý¸šíl ;Ê8; i›.}*—uLYÚö””ég.´Bˆääb±ãôוhŸ_Õå“Üœ†©K1“_õ"Žç,¯§+óÌÔ{³˼ãEÎH"oX˜·ÈÜ¢Q42…` B1ç% Î[w[¦H6mnS¡x¯Y˜œVÛw'i2žbÁÈÉv2·ºuS½Å‰ößZF ŸŸÍ¶´Ä§Lä î7ù´§P$¿ç¡dËÒEü.7·OØÞ&\‘ñ8TD6¦ñq½NcZ),Èie<±•6àR&Vÿ¶ŸªjY‘6Ž­ô ®¡^‹á%ý½B½™vÅj7¢Ú°ªÆÊfȰ:d}«.üÞ ùêòm 0ÜMßãù¾\Î7ù`zÁxÄߎ¡(ó©BàS3¾­œE—˜^XÀ§Æ)Çð…gã¾ à à`:À|†)¾Òs±®•S¤{Õ7‘0ì\ZÃR¹«iAÛò¬eºÁhMóâ嫈8¯ñ–x1„öZ-ç•éY\om«GeoNÞÄìÙ´½Ü„7¸L(©žè©gB»ÖNÞÍÝ„®nBWÄ ÷ß’Ý‘ü?ß~‰Ð%¾öL|Ÿ£äšntíöb¸Æœ4èE7†ãöª=ÕB¾ëšnÞ1ïuCØo´ÿŽ;32’”Rìg=fcšn!yÌíãàœÎ}v+Ùª×Ï4?ÀÕüÛ „”æ>ës\37|Fs¼Îè^ÙçÍñ˹»?Û‘VPÝágiÄé[Œ1¶1N1àÕ<2Gúד[Jñv0d#´)EsF6 endstream endobj 8433 0 obj 4618 endobj 8437 0 obj [599 /XYZ 40.7999999 768.979999 0] endobj 8438 0 obj [599 /XYZ 40.7999999 600.019999 0] endobj 8439 0 obj [599 /XYZ 40.7999999 97.9399999 0] endobj 8440 0 obj [599 /XYZ 40.7999999 768.979999 0] endobj 8441 0 obj [599 /XYZ 40.7999999 97.9399999 0] endobj 8442 0 obj [599 /XYZ 40.7999999 600.019999 0] endobj 8443 0 obj << /Type /Annot /Subtype /Link /Rect [386.399999 213.139999 473.759999 220.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables >> endobj 8436 0 obj << /Type /Page /Parent 2 0 R /Contents 8444 0 R /Resources 8446 0 R /Annots 8447 0 R /MediaBox [0 0 595 842] >> endobj 8446 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8447 0 obj [ 8443 0 R ] endobj 8444 0 obj << /Length 8445 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àhćø‚Ư90l ‡EÁlvƒÅzgùû‘ZT·›ì‹”úá¶§i«ŠÅ"ëÁâ׿¼ü³úåêëý˪ïîçý˦©Õ ÿªþëËǸ©~Õ¦­¹íÿUßß6ïÕûæyóÜ}ß0µíè~tãÀ?¾ÿ¾ù: ¾>y¹ÿ[÷Ûÿ*^ýµû߯Õÿè~üäàõð¶1Võ¿ü6üÂ8ã¦ûÏÇßúÆoþþ§ê÷³…Ûÿ¢¹’Jó,<Þw]ÙöëcW4XSÙÆ4FVŒñ϶cÇÿµù¹ƒ¶C£¶’1­¤nfCí¾÷`¥¬¬VU«˜ió ±\@¬‰"€zŒXe¬‘: ‰ÌwfÅ–HÎe*»¤lvqe M`‡Ë¢lä;„Dæ{§s"…È%s*ly@=F,´‘ó™õ­l2u6¡;P¹€4+¨Çˆå‘6²ƒ"³^+µ%Ó¶Ù s²fT¡ÕÓcIJ(!‘ùn+Ä÷R.»lÓ’ø£2|‡¨|ワFí4k.¿lål¹,³Oo1by¤9ÎG@‘Y/zÈeX¿• HÚ2'›-F…X€z.blð½±ñéx÷ºùúd*f«×Ÿ;4¶ÖÙðãõmÃUõ¥?| U½þTý¹i8û¡zýucëvoÎ --zÛ"kÝú-*½{€},êß¶-ŒÕ­}ë¾Ï5u«x{0NƒZšûm‹©%g渣jÁ¶]>´ˆmKgݪÜÚ¢cÀJ_;QÉ›xÛ[ÔG&^6ÃÄkqˆfÏB©zª÷ÈŒS%…>$ÚM¯ÙÏã÷ãÛtÝ ó2 êÀ~¹‡ªo7ì€·ŽƒÆ«„@#!íl‚ÃñŒ“':²0ošGDpƒû\û†&ƒL—õgÖÿ£Æ®%°b>?ù€P#¼ñ¡ŠQ…é`aCÑJ‘í`Å" ¥12 ”mñE K}ÀØ€õx•ùsïT(ãã8sZ°xø¨…²ˆÝùTødI½6¶ñæ>/ÙûÅu¹b¾2‡ r¾†Æó(,‰¼¥øÂ¤0€5ºÝr†óñ|#žÆÝ8¥Ør‡ZÝGZ8ìÓ@ ˜‚-2½‡}œ¬¦ñ@éYg†e{xJ<†4pçñ CþrˆÆ@`ίE)„&`±Ö –[;½ ÎS‘=Kc"_çáᢎ÷Å6óˆJãñD{]³àÚäRù‹382ÂùáÁ™Ž²Ì¡ùg9þ0ût\âLF‘w¼ÒÛ$f˜a-WQȤ)¶ $ŠN%1$:0Qµ“!¼ š1d\0.6%„&Rða“ëöD;:ø83øÀŠúXÍb ‚ìã&ø2úi”â#êÝŠ’¤y†$­e` $[‘W–¼‚˜®‰dMŽ€ò‘f áÕ™U¬SN/qPCÉb&ߌ¹çöpî Œ:#“ÆŒ =yŒ,ÒÆÈÜ ÉÑ“í |Zìjƒc±+ûàq ÖÂBhx¿ƒQº4L)¦ç b°–_¤å;‡Ø.ª4;°|Ä7xhÄ}F‘èsH4n  Åsê£óqͲÁ°7 {[p(* ‡àK¿E)QÇ€õÓöðÂÑÀÛºXk]\Oð¯Õ¾¾¿„àߊނV›C9L³»ñù½- ¶à7´»#6LÙ¶{î×±GHPŒ¶{І`Ì7‚åÕ`ÙÁ|K§ûº¦û“¸À2ŠÇ’á5„¡”âë2+ê4«Gn W™Ð Ø˜²ñ¡Nµ¬ƒ©h§e‘²S…F‘ELXÑG­Z™³6Êî÷˜¿xEc)…:k›²:›‚u–eÜB8#p¸ß—K»™!—z: ç2FÖÁÇŽ±œÓjÌ Çœ–»\Äa™ÍIIHHXNp„ÃLF ‹äb¤„Ï绞öͤ¤8Q2ÄpÒ Î¢ä‰œ…M®­¿I³wàÙ-rJÅaOãë‹Ü7"ûàçi¡pÊI‹ÊuaË›@)É›‚¡áL)aNoÞ”¨vY›²ÊžcØ.€ýÀØÿ±âu#¦½;§Ïl¹¶Žc¤TBJ%ÁŸÖ-Žb틽ܑLK,!7Š×gÝÝqy‹Óì÷£’ŒŒ0l^ šr×3=¯|–Ù:}¹•ñÆ-ÉÁcš zeü"7Æq ¦Ë™‡7Ž¡(GÈ™ï1pûH$Q¡ÄzŒø—7Èr2^"LK¸âpÁË}Ñ‹âÜÛHÂKX`‘D“ù°nÎNá›[W”Pc庙'Íjæ‰$¦#Å® ‚“Ãá¶Žô©1ì¹Ø@0"Z"HßZRŽ¥â2å?"唋4ØØÇã`ýh:KÄù†[°÷!\P$%øFºš„grkŠ‹LhX3ñÇïòäâ® Ûì qe$ÔÚ¸2û9âJH¸K’pqœ‚/{UeÑ*t aÌ“þˆâÄþFÊæ¾|©Öz´M{<Š”A(².éºS‘"‹“sÉZ†û›@ÑÂN #õŽ&+eU]¹è½fÚMã²­¼~ 9U >—ø„?ÈôêÄž¸ÀõxàYhZ IZ6A“ÌòÈ!ðl¹ªº¬Ï›tÑ»V}P*»• 5%{ßÜ4´5þ¦q*?+vi`ÊJÒ»J-8'6C#-£Máä| nÌ”Ü+ß²Sö¸«8r­U½Êp\<{ «¯`Nþ²Ö°°Â×r„›b‘›°…”Ó{¦ù’p 1Öãî qé`FS<å4U´ll ûo!ì3a[ƧאַxÇÓ2yÙw<#þHB¦g7ŒÊà¼^Œ¡>Êw/-Sgu÷Ò2?ôyöâKoØMsÜ4Ç|yáÍôJýä«n½µô Ü+çf4)ë£þÙôô‚rÁTëqwF¨ü: šÐÒÀÎüBön^˜OU΃f#QÁy'eçmÚ!”P€ò@̹Åã9 i'˜Ò f1¦‹íYaéF¸ P&ø<ÖÈr£P ‰Üâ å7%8Žâ)ÁŽUÎ3.%jÖæSN”1§¦ÎT9æ„Ä2{ÂXÃGÖ¾`>|2‹§,!¨,µ¿+À‚é«=>—¿d¯-ÊwQÚ®äš9¹nör­‡wç¹nûç ª·åöã¿m^{i-™… ‰Ç<Í€s^/Ì9h¤¼‰ˆ¡Q³Å¢2S^;º´SÒÊ 6%Éä™*$¿<‹ÂœMÉ!'Žš%ÞpLɧ(Q§ðü²§®²D„y~¾9Å,ˆ'Åü½²Ý}¾C$"[¸%X‘w\ BgÜïHHv¼2‘u^<ámÙJOïŸáu«Â†Júñ+!½“Rëâ–¯sù:Âìè?‹|±šûu¿EÝ'åEîjOžG¾ŽœQaòJãÀiå®QÛ yYÄJÝNÎÝMË^„–MÂúô-…_ŠÃEFÕ¡#o4 ÇPÞß¡”¯¸< áÍ)’.ÇÒK©,~Û7G[dñ··m+Æ ÁéßÞŽ`_±v‹Œ‰Z{ïAG^Ø\ÇÞ¶Î$¾Éé,>U‹­}êiã`hƒ(<¢–È;çøím8Î>z´8 Úz0Ù,ïøo÷7±Îï%ïˆ{vÚ™S4U0ÅÑ6Ïe§ä(å©ÁɋϜÝóØK¿~Ù„\Ý5R4‚/šWs^·¬áΣ•·õd­š_<#¥/A¬I³ºpÍŒzJU>"+o­Äµe‚Ü—x0™–,þ°´Oû:¤l­bÂÃï“Ï/¨S —?Ðl/;/Fp^õ #n‰ba ÈIFATv:Ç ':{^»xd²-«°ßj嚢i>ÏV(eB™’·k½Þ·ZvckwK÷–PÑ1»ûªÞ;®vLëÿÀýøþ–”·ý!%ü9:CÑ®ÓÎ[Uukäx©&¦êÁ 'š]Þ·s+ªZ?±XYL×µ>žä¬´ @ˆšÛ£Ïk·m­†IØ·h8Ž},ì3x4¯y³õ¡úõ´Ar?~òÿÖYéG(|B}ÜòX Ct¸‘ÖÇÍX í·íȺþwÞ2/mîÿðœb9ÀМ° {YR5¡ÄCÙÁœÈ”ö×–^8Ž;üë¡9Ò1ܰtk!"UáºÁ¸h´.¹!ôÆiÍ ™ÑÁí ƒçsнt›Ô‚yŒuÿðPÆÊ5¦Q5ëãÞÆ uªÅí¦wÒêyóÝ+ý° endstream endobj 8445 0 obj 3241 endobj 8449 0 obj [600 /XYZ 40.7999999 365.779999 0] endobj 8450 0 obj [600 /XYZ 40.7999999 365.779999 0] endobj 8451 0 obj << /Type /Annot /Subtype /Link /Rect [253.919999 653.779999 295.199999 661.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 8448 0 obj << /Type /Page /Parent 2 0 R /Contents 8452 0 R /Resources 8454 0 R /Annots 8455 0 R /MediaBox [0 0 595 842] >> endobj 8454 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8455 0 obj [ 8451 0 R ] endobj 8452 0 obj << /Length 8453 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË"©'Xí9Ø@‹o6Áb½ÈdùûQ¤ž²?’U,Rê™±ϸ٢Èz³^|ÿç/ÿ8þë÷ãû»/ÿ9~[~Þ}9ÔUÝÕóŸãéï»ËôP=ÿÚm¥ÇÓŸã·ï‡‡ãÃáþp?ýûpPÝãƒËip}Å<áïß~;¼Ÿ_~˜?ùr÷×é·ÿõñ/Óÿ~9þø÷éÇOË|§/|? cwúå×ù¥•¦ÿ\þvü÷áo8þ6-axœ÷ôï»^÷ÝP§­ãáü¨zü{ù(zY}ëi­Ó•žþi'pü÷Ÿ‡Ÿ§ÙÎ˨ÆF©¾kú:zÖ^¯ÓŽ}wT½r&uö9UêD}/4Ñ#ÌÒ¶¦ê¦÷OÅýØ©y›ªIÝèyª´‰T]÷ èO+Ri[[A§b‚^ÕJ·2 ¿˜*u"m™‰N+½o*6èM=oslS÷¹Î” °¦Ö2V¤’v¶ÎĆ{Û,Ð2&u›ç©R'šþ'3ÑiE*mk+äñTlÐ÷FHÐ_L•:ÑЈúyEBÒOÅý¨Œ´YgJØIÇÊ@þ´"icÏt/b÷ê'»÷Áóà‡¯‡÷ŸU3i¿É®ýúó´Ç³Âüãë´Ùöøîd€Mùõ§ãëZýð§ã×_cÕŽ¦oçÃÅ2ÒÑŽ|@#õŸïiÐHSÃg4}6 WPCèè®M1ž1pd^Û§¯…e§—V¿PzQá^Á'8¡¾Ï*ðl˜þ!~0yhSß©oŒÀ0¤ i ãÓ „"^›aPl}G õÕ˜7œa Ü<ÔWÝ`@>3˜Ïð à{ðÚ¤rŽ à¬Ë?ƒå†Æ6Ö iç¡8›Grd4†”f,'íz=¬oņû®1×BÈ×xâK!Ï{Çà¼Ç`¹±àÁ%cmØn4p¶¢;|Þ(v?;e­ Ò˜ÇÞÀ¯Úš5Ôž`lÃýó&´¹j(Q<)Æ6¶±]¹S¢‡B0à{0tääÓ„SS? §¡VëbfÒªa¬;Ý^n`6{¯meô žuÆCc“`_ÕàXõ4ëbá\|0©ÒUsºJ«Á©±`¯ϪàZõGx[àZ {àJxß̌ͺ=G¸ Æ“¤¼° åÐFN¡ÖÂ]8KÃ_Å ÀÏ8«wÞç€Ñ~ij­2(ÈĺxVHý,:•DŽg†¾4ZpúÅkxm8¢?_ßNNe2hK›x¶4Ú»·?À$âÁPþºO±¿J`Jã$A]sd)¦DаI±1ЖGtêÙ°Sªj›îDuIB.…cn÷˜Cmªà葎ª…èZ|^W`ÂÁp$({W¼;@rìJ{ŽFGë&rB6bF…3ªÑR8¬ubÁÕº{ h‚°8ÊcsePtަŽ—5Ì;»v4%¡jW€=ü9êÎ)pÂTÆÎX°LQÍÅ8!…E¯+oâOž³™ k¶‚Ç€cðª[ñ~ì-pP WÌx³ ÙOUa&ß_àϵ‚8‚­~ çŠÜ#ÄádY!áØ¶Û=þ&³sô]û ÞµGDs<ŠE &ZƒÃö·hÏ”v¡‹ÓŽ/‰Î £‰d,¥œÖñûÂÏrŽÑŒBŸ$ÂM$}*øè͉‹ çÞæñ÷ÄGJ<®~Dz-à†:£ëm¥±¿Ê¤—Ái„,G5`b Ç©ö.Âq1‚ç:eꬵ–l CØ eª’ú´KKT§pµÂfÕ2ežÂ0Á:1 o2IJVr´–¾I‘O;Côh@p7z(±Ø°9ÛG#d¥p(‹“õ N¾'é1IÂ=Å"Ö¢6Êö%7i®‰x“¼–œ+VŒcó&œö‚;Ï©#´²”Á,• Æa†qžà‘¢X€ÛrrùeŠd§µý`S%n%Åhät ½‘SF^ì– ø‹]"‰…È)iäôvIñ“¤péžÓ[_‡”‘]cŸo’ Û ¹{>4ãzQ²ô‹È¬ ¤¡08 œ²WºõœqBoœ ’“¾Æ°›—š½"}H'6yN­´>ŠŒžˆž~²XýbeŽ3£›%îßûg+€G5-Ã×ãé¼3ªTÿá281:',(BNõtp…°Ú=|[õœ;s;MÕ¤Ûç,CjÓ’Ò.Åq½qœÌlB'!Nˆ‹ãvq=‰v~t¾Š·•&”är~Y Ù^#"nHN¸)HsI°x£×ƒÑl+Ž Ø¢‡©#÷)8 ÷tv”bI©‚ ;M8 ]êÚ_Á]°”ÕGÒ}„¸Ê#ŸE²jU,/ Ô:Šø[‹Xï=Z X¶`¢”á1RlÝéóû ÛS?3é±ULÈXØ[gÚT¾ÉsŒÄ® <‚¯±ÁW¬m…^çŠAÆ•døŠ5üÏg¢Wӕ‚æìgM|Ö¯×8½´K>K]« Çsb;¾l)4Rd¥Z­êÊÓ…C=˜J ¹( Ö-›Ë!ƒGÊ\Ê4!¾ŸƒãJ­+ÅÆMðr…›4Èzóò–‘%µf'˜ãŒ²t¹ö±áÚ¼IeÛgnK9WÞ´)™µ•uk˯øxÈÁ‹"Ù2ŸÞ·Lél „0Æm $µDRœ#úwÓ1“âLéÄã ¸p7±ýø29ùå" [Ý_·—Rj_t˜àß°b{h;[ëBÊp½ÐŒÈäXþ˜Þây"Ou0ëv.NÂ!…‘Pʉ¿fÈÌ,p:†àÎ^c†§šv­ž³Ù[†çMfxš.¼ží³ ÷ž3húñ9¾ó‹¦Æœ;Qoí¸Kqh½éW¡ª§,µ¯îi#’Ð%¹ *ìÂÛ¸(V¸3ó ZâF1BrŠÇÑŸÝ›I¼ˆX\œ#Ÿ`³vÜê,åA©aÇG={No´ÜmRr¨_¬}3¯ë§©GBÙÖ/©Ãœ§I5¥LQÒGv“0Q÷:Ecœdiõ-{/ƒˆMð#?£q"7g—¨ÕÅÚ÷R«˜cªVÚÞöËîùPàÞêð^³† ÷ܲŒR AÓFtL=^ÍœX ÛquK곯žÿØ$~md•É}ktôgžò¾œgFôŒzº<Àòå< {6eý«mm·X ª®æ‡ÉºÊ<»}·^S‚=»ž>†{Ÿ?Ò<½ã°¥¹Ÿ/m§¡~ue(i0)”Ä8eÈžš<wìöœÙ¡§{h<~oÜP ãî§)x2j@—Û{À£R‰rÀç\-q«fJo€L7’gNâ*œò‚ì)Lö¬™|EšÜ!´è6DËÚy@Ûšqì#îG‰/dFek¾Jã¤×èÎ&DnÄÝ)©ÖY\Ï”¬ì¼…éa]õ2ʼR‚;¬½ We4šiNTc7¥v›%*o!Õ`«ŽéE(âŽ"]> G™ .G"Ç÷¡ÖÚþ*èSàˆ:ž¯¶.Ýö·Mò4T [³¢e6yªr“ºž%ØñæZĉ ¾—rbãÔßp4˜H»CÎé¼Ps'F£7Šw'»²3²DXfYÉ˜ìØ¬wf±"i›Ç%öá÷»óÍÂøúèÃÖŠ Œ+7Š>ãÁxÄU 8N‚£Žð™,¹šep?Dg5d7³T}NÛ/Þ”mÇçôÝu^Üßíò¬ /ŽW6ÅjÝï <,ßB8¶vjŠfÏÆs,&!Éú_R:uBïXϼі¤~©‰À¥Ãf„lKBo€E½¿Þ`”øË´šu4ìÇÉ\¨™tz™ÌoÓÛVæ^J¬rÞÂU·Ö®e["oèÚ[E´èIé(â8atÈÈë±Ù›ù½ºšµ'Oú¸vZX‹„ŽxަçªU™Ð<ŽzlfrÔn¡»nètþ"Š ðÓ¹÷²¤²¹ËüÁ•\œ…£ Z ¹iZ•É{‹‹tÚÍ“+µ·ÈZ^ÿtÑäs邯׸‚!4’õªúÑÚÁ¥Hžþ¦É§gOß_~|ûîy›»Ìúi™÷Þ…z 7ßïŽjݵ=Žª›MÈ£©×ðÃÒî¥ëªî:7MåPÝ,–u_õ×=÷WFf6¦ÒãÕŽ¸m[u3cÙÔ}í=|f„ÏÌyo½®týØQÿiäœmæžËO>Âï.ÂçÊ?£g–ĵ…ö±hÏ,£ì}YÛ#$PÝéwÝ*ËŒ¿?ŒSLx¶…”ó̶ìj—â!í`ÈzhRŠúyS/|Ï4¿ö œmQ”×Ö†©ËáU¹|ƒ×Ò#¾\Tí™ù=íP™¹*?bij¶Ïè=‡‚K(4‚aŒeÇÒ1"•s‡¡î*uŠuX,ŒŽ\Ʋï%5éñþð×<œ endstream endobj 8453 0 obj 4337 endobj 8457 0 obj [601 /XYZ 40.7999999 545.299999 0] endobj 8458 0 obj [601 /XYZ 40.7999999 545.299999 0] endobj 8456 0 obj << /Type /Page /Parent 2 0 R /Contents 8459 0 R /Resources 8461 0 R /Annots 8462 0 R /MediaBox [0 0 595 842] >> endobj 8461 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8462 0 obj [ ] endobj 8459 0 obj << /Length 8460 0 R /Filter /FlateDecode >> stream xœí]ÝÛ¸÷_áççˆ%Q@Qàv“-Ї‹èCч"×kqhÝÞCÿýÊ–¬xIýHÍpHË»N€ìÆ4¿†Ãùžá‡?~þûþŸ¿í?<~þÏþëôóñó®:Tm5þÙÿþpù¶‡Z¿v¶9èþøgÿõÛîeÿ²{Þ=ÿ¾ìT{ê8ýÏSŒþöõ×݇qòÝøÉçÇ?¿ýo¯÷þ÷Ëþ¯~ü4wü·íÛã/ÿQZi;üçò·cã¿vùÝþ×a ö4îñß:mm?|'e/sWuú{ÙMVí{5üi÷JéaÍðÛÿ±ûym^Æ¡7Ju­éªÕ£vú8¬ÖîÝ׺öõö¶n(•:PcŒÌ@Ç©´­©Êtá¡Ø oûjܦ2©‡JÈVµÌ@Ç©´­A‡bƒÞ6†ÕÉX?•:Po[¡3V¤Ò¶v=Š z]õê´ÍÎ'b´}Î#¥L«Vò§©¤M€Ç#±á®›‰:·)q›óP©#t‚Ç©´­!‡bƒ¾i'¢Zu©‡J¨m{™Ž+Ri[;ƒÞêYDþÒß寗@LJ/»OýQÖüò󰌓À:þøòmg†ÿ…°zøßOûßWUÝÿaÿå—R‡Æ´¶kNß;µTöÔÒ´:~^]´<žZÌüRã ú`ê×_UÕ©Å~ï[Ÿ>èUï|UwîW½i4êKX«~r§iü5¯ßoÕŒ_=7\@Â8£úû5¨¯¿‰On_ ·/^bå­–êà „áᢕ{&þ.0°¢}Ççá‚7Üž¿Ú ê hÀe‹‡rÌö¾ÚÇð—rŠxEŸÐ>ýµZœøÄ!Bùב,lð¶ð|ð~`Àâ"4ùôe` ™ØU?ÀXwkðsO¨ûö‡®mÚ×£2ˆ©]2Çï÷’˜ñú0²–u§ü[Þ¸ÏÖ#<¡oí2¤Àåô`Ĺ˜5bñA/|V»žá¥poO 0éõ¢Ž¿=oÍëE÷@‘#ÁÁ–×Ä´ c!™0¯‘FR.3gçÒ›8#ŸéëÆá3"²|°H‹G¼‹Œï-fgDŽsî9_¨éräR&ÕX:£ò©4GÌcÐ&WÝ•$­Bxî ÖŸ"ð}W ]e¡À]¥Ùh8¬È«!.xŒQŽ¡ÌQd>‚ŒB+ø‚NF’S×Ê¡9™8<¾5p=âÊ’Å.j&òoÇð&ìí‘ã»ar%uú1;@ºE]Qq²¤¬kµ+`®—{ü[»e S8e ©±ÞÚq_L¶0îºhG1—eaõGHH׫#"²÷ ³Ì eÛ¢K ‡ Ü À‰€ëmêÆÐñÁç°ë™qÜêîû+×ûI·) © œ0  QUWÆÅUÜa+aTjb¹q1Ed8½XTôÚçnxKãªþxíÁöU»örrâ 8$Lˆ³%f€,æŽD `£§G±”±ïôÍ2c½“° :Feä@­î\” úcøÌZIËÅUŠzÆPÖ{ìXÞïõb銥12r1#"€£äÑ]³ Z@´áÅ,꟬ÉM"œÃ,WÜ É ‰#xT?æ¦égØš¸|Žã?R¯UN.eI„ùRb§|†áA¤H>qhk޼€”Æ ña"¬']_K±ŠëQ¬ð*Òñ;Ė´“ÂÀã6îRÊŠ¨p3ÒZUÚN½‚Mý01áJ9L·l8T‚nÌÊÈTår§A°…‹°&•¸R–ÅÝ*F[ãþGC–”†Lk²œ‹Sa~±4€ó…°ôFµLHTžcdÈpxžÍsQ[G×#Ûr£œ΃5¢V¤ÒÍìu)I¥=kÊØÊ]*Ƴéš×€_pÝÜ ëÝš+<àŒÒ™Y#l7”€O‰^϶"™S"~ "–¿ßèèw<‹á7ÇL D—(svµ¼5Bœ§H²…dù™¤™9ÙA¯~À‰.ð“^ôëE &dJ¿ã€‡Æ~­’#:ìU"ðØKB=‘¤"@)'‡rb'šÀvãT%gžZÎ ÆÊºS×|ðd<|ÊÓñZ#Ѫ­)i+²E ²íù*äõ"“¢ÃID–¨¼á’òÒä:ó yËãmŽºæ5†ÕUãRjBXŠ=u𳬩ä1ie") ù&£#i…S³CH²”Jy”I$#w9rÀåÈK¿X­=ÝͶž©Ëìe®*ç-l9SïéÔ=€‘úhܧ‡ó¨3ãy¸wí¡>Ïeˈ<ö`¦›µ F¸£U°žXÁœGÌïWÛn^ÌV²u9Ys{G+´%,yRŠ1 Ô„—e¤ <®Â22c Å]+ŒúYÄ•}8,ɦ)š÷HŸäTZÈâ}apÎïâ¨{—äÍÊ%˜C –ËÔÄyÈ»Ò,[€ˆÉ†PÌóö‹ØâoAqÔúíU]óX¡§GŠ”+È‚?":/£Ü‡2Ä™ß:3¼Bq¡¾ênõî]ÌE¢ó:=[óq°8²Gc¢žñ¶ æ'àRÎ QÏŒ,œ’q½IÉyÅy&ܹãzesù0ä±ã8£†5ìS2¸küÕ¬ë‰Ø¨lížH”Ñ$ÂñRb%)ŒõFj–ÛÍ+eˆe{¸è’5^¬=çòáhñ7Ç ÄÊ.Åá;ÈR ð­ùørüœòx\†sŽ~„å$OÖ˜‹Bnmpæ1gÕ8ÇŽfðmÂ9ɺàÍÐñêR\&ߎaˆ0î™gb0|eï3Æ F>—ìm28ÿ÷y?pøs‡[nP–Çp›îišfæ ñŒ*O;¸6<.hWéÛ³]%ÊM²ëWzPÎÀ¹ÉçÖ(ª6wr¼‚X‘#ÄȾM¿Ã ·DÖ ížàèI©-M@BÆ£#yOb`÷ a>N´Üz÷ªpÜeüÝBÔê­%@Ž|ê’50âDX&0Nnl,U±mÎSG÷îòûnÇ™–וm¬‘3ò!DU½;g&Q$!ÙœƒÛ Ú ÄÅoÎ;‘Gø’¤_9sU¬G´7ó¦S<¦IÃÒ4wƉОÏZGåt™7YO0®üŠz3×ÎWÊœžT*Ýžª.BSÒ’6ü>VJ=ž2BíDêÊäg"v|ïî’‰¼Ñ”í…ÙŠ¤1Ц$Æ–…@/2äžP›çxNBŠë¬êd²¶%‡tÓZ;G(ØÝ9°Œq #¿l]´ËÏ'ŽÏÞ9¨ÎA( äÛ{™)Ÿà¼™v¯ †eÑrArZé¹ðõm†ª¼›,ô‡”Á>3ŠÆ0·B4q ,Sn |qè@`mø„q!ÜJ˜j~ùOõÝëK¿À(:LfSCÔÊÊbdˆÿ¬"Ô¢~!‚ÀPÈ$ÆÑl9®K¼Ñ, :^ë‚¢ââSbX•-W2¡f.‰°Ùð¬5Z‡ª²òª{9Æ’¦{=âK _Üó‘'Ìû*¦,œr:øÌ%ÊQ ³MÎ…/‘!;ɨz~ËS6W)šQÓya­Ýcõ8·öNÔ…ˆºh•c0JüÆ«{®-âöÏ)ôÊ»¼Í*¨Ö.ýËâQdÕ“Y_†KÔƒ)Æ)'“ þäÉÛ KI!†¢ÚÒ¶´Ø)[µ}Àž”€=?Ž‹íß .Â/¨’5rF/KŸYçtOÔ';×92Cv XöÖ«²w/ì6¼°Ú:o‡ÑîôÕKg•zâ·`±+]W&ºž€g»Šµ”ÙNy¢÷Ýq¸¥Ñ úÉë¤Âk¥¬”Jc”~¸Í– RÂÀóäx\ã2îƒËà˜ޱÞ&N±L0À…èpÉ%<†'ÆÓÿ¦ E™‹öq°< =àX$ˆ—œBgÛ„ñ¯€cEé¿M¡In}ç¼1È÷ý–²g˜^½t§6ÝYș՜µ2÷Ú¯2þ\åq6«½l†Tæ [÷Oð-8î.Âunø-Ÿ²/Ng%Ú{çÞEdE|ÉáÍŒùŒ27þ£Æo nƧæ­Ì÷W‰TÁÆ|†§—S[;åý.‘ZÞ,—6'í+WÔá˜YÊnK#±Ë|X}Ã-1ÃN÷™veà.»ñÕÒË9Éî©ÌŠÁøæñÅ £/0/k~‡kNïÂ'h E¨ùHx—7.z@*™ð^+‰"KBR’×[‘7X©Š´¦Ÿ#pEZhPTà{€JD–ZhE.!9!âת\z‚òÊ6kdjÕ¸Èêe x1Kò˜i šÅCRsÚå²çü½ãÊMmy(&§ü+®ÈXÔ2`Ã….®©¿  ëÕXŽœn¬ÈÈ3Zãñ Ñ´eVuÃÒÏŸÑó_SjÊr^¤öàÆ_²l7kI{ R1­: ˆN)ªN Ý"¼IdµZÖõ*)(&¡n2ᙉ-Ö7»‚ÒùµØ¦:Ç`JCÉ."‹9·Øõî×Â]XÕ‘RИ@ÄSŠ®JÔOb¬˜Öx‰g*ø'˜³X3æ0ãõÅø’Ä®«§æGï\‚LDθG{”RJe*áf à”´ö˜cB=õÛzÝ,åQ¤[o°ÌÜñZè‘G)ápaJ˜†çŸ#s¸œLÃX—kðΞØã‚%î“Ùò±G¸î©K©q u §eÄÙÈ<»RØVS2±·éÛ×ë¹±Ä^…{EcÔK&ö¶ª‰ï[6)°P&'5ÐDÆ-p§—i$ÃßýËp”Ã1¿0ýøú-p¶>RTß‘â9ˆÁ®Q|²í^ ÛXz¬Wíø\Ðþ{®øƒÒ¶‡vY–ìÍÁ#U#ÕÖÝ¡[®QÜ-´ŒGP×Ý/>ìÕ4‡v$Â.É_šÇÂ>=ì3ªË>èª>6}oy€£¤áò“𻓩ca‡O¨Ï$6-µ(´‰ÓúL'FÙû¥)9뎿ëf~jUáÓÆgŠñ6áòúL5ÐÛÊÇxˆ;²ܘ2Õ@_º {á<k]êG›ÌrKkÃØåÝ…Vù÷¯¥C÷R[FŸqžÆêQÜ^ÑXÛšŸ!†àÄ H-ƘvL®†Ô›kmÕÔ±ö¯s…ñE…-ê"UüY’“îŸwÿ[µ¾g endstream endobj 8460 0 obj 4333 endobj 8463 0 obj << /Type /Page /Parent 2 0 R /Contents 8464 0 R /Resources 8466 0 R /Annots 8467 0 R /MediaBox [0 0 595 842] >> endobj 8466 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8467 0 obj [ ] endobj 8464 0 obj << /Length 8465 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e¾$J@`=ã C€ ääx³ ñ"“=äïGj=z†ÔGŠÅG·fÛ<íæ¨H‹õ®ÒÇ?~ù{õÏ_«_þS}›>|9±šµlúS?¼þBtµÓGÝ5µèÇ?Õ·ï§—êåô|zþ}9ñöüàüc\¦˜þúí—ÓÇiòÓôÍ—‡?ŸþW‰êOÃÿ~®þú·áÇ3¼ñ¾Ÿº¾?ü{úÀÝðŸ×ŸÆÁþò»ê—a Ýîøï-gMµŽ—õQ~þûúQ4«z.Z)*ÎŰÎf@Çÿqúi€¶.£îçºUší†ªÅ¶ieÕë¶âL[@­½í ¨mû4€Æñ¸­q¦´õz8Ìó6¹ŠÝè *P'á¸"·µõõ=›¶©í›¸ÏR4ÂzÝ%ÄFJÙÙ‚x‰ŠwÉ:1mRÇnó*hWÄã¶6cÞŠŒzÉT’_!E#Lê4|þ¼¢$$!‘ñ®$O„÷R4ºÖ¦4®( Þ!$2Þ›F'’®P±€ZFLŸW”Fº:@‘Q¯å|¯e"r£+¨X@NtyÆñ¸­-¨Ç È¨ï…L…úT$ Åš& êÇ%B½ê9‰©'.¦Þ‹ãÁO_OŸ¸’ÝhÙ~ýiXÉø¦_‡í6Õ‡ÑRÃèÕ¾þ|ê릗º™ìéy¤?|þ:ì n==XŒbçÅh¶LÉ~8OÙ ö{7F¯#Z4ÂÎ#jý‚‹óºf掘$Œ`hÝy¤­ïv@h|Ú`‡÷Åšé‹ZM¾‚ª}ÏÊv>eÝ6í[ôÁsæSÒ\š9Ÿx2Wdn3ßšÅD œ×jG<îÀ^3±M8>Ljµ¯ÏæÎá³Â§âq~ž«¹ÜÆ'Äs¹‚# ™Ookä!|ž™S”ÁÈ |é™9ׯˆøŸp¤ _Ò,A=\ÛœïÔ±H/ã ™–°ƒ^z¾ì¯ê3Ó ¼[šÂÏnªâð´àN1ý;ž4Æ!ýÏ”Tä„;¾Þ Gȯ—v­òªOI¤-e{Ÿú¢ BêÃû5‡‰Á{Ö%É=ÇB ëðŽ•`ŒûUgKMô˜(¼Ïb[Ì¿2‡¡…W ÉZóí¿tª¦ãñ.¬ù ©Ìù,~@±q–L9¹±;vÜ ^ð3ØÎ´¬­öÌóŠÞ†q¿t-!LßÔ¹i§iLQn‡Rˆ˜”€Çoñ9Ìföߺâ¶õô,gu«ùˬÜnqøO& Ÿn¶Ü6á> <ʅË‚Ÿ°_ØRJ)¸µ­°)“ÅQ°fŸpyšxõú€32’Nhƒ‘ä!@‡hƒ#ší†µV2ž\,g·ã¤ð3!Z{€Ï1€Ûî7‹¸©dE j‹$¹“8º]‹qìõnq°Î޹®îzÖº©K7@a'\ÛlÅ‚/éÐîåD¼a‡¶(è ì›&#ØLrC'8Vâ9vœœÓ7<>GŠãœà¶¾;õw8õÃî3eã¨à3˜â¡" ÒÞ9Ç™bz#@£¸ûÁ#¾ÐâÖ<ðÎQn°„U;NÛ·êì*ørV•ç† •´>|ìÙ³ÌËp ˜L*¶?¹†qxÔ­òfY)m¶Žkº[þšýÞÛµcÙ#Øü œlH’uìœâÇŽ8”4†^€ó vöd÷]™õåZÒƒâ¿&!ˆrKÂ=7”ÔÁ**DS%x‹ÏÜœ)sØÚtNf¼yWAÛ÷Æå‹Ð‹32 -:cþØCËHz‡R䨛çÕg úQËââ¤k¥)N2ó KPDÑ~RqˆoHÓ çXyÔÂ$ºº-¬¼Ü‚/^»(¡t¼[fW¹f{}`ªób®eÄ9XÖQ°ÀýQ´¼^û²îgçWOWsœ–Å6ü‰¾lƒŒWC,ÖÈz7(ð§@&ä!ê<bݦÛg®ßÛà ”ãÝo§(þÊÃÀX¼RÙ¡úÚµm.¬ •©ò#‰#¿·8@C HÐ Ð5(éã–Ý‘×ÓLÊbŽnÙE‰VÊ%8WŸÃ~>$K/Oæú%ÍÞÄÁšqXK…‰µTÖ’´ÿe PñQ;b’˜9HÃÐ1ýáp€% e6$ñ¤$Î5‚›$2!¿¸SAì:SN4 m…Tcy­BŠW6ªÌÏ·ÏœgñÓ®çHÁ!o‚±«&å·›ì¿Øî1kE~¢ ”¾dé&ÓJ%I¿’ýA„ßŒØ ±*îg¶¹½7+]rÞ¼]OXÎ$Î†Ù”ŽœIB³Ä•8ã—’ŸšÌäÛq&Ry×ãÈp-T ‹+1Ò5‡Û«Kã¤Íêv¬gmCsÌûT¬•TÁû$øŽ}_Ãà¬ù’ô+D_ð>yÜ_b-Ú“»$¬K½ }·t'’$qœ#¹¨Sækæ½²¢ék’ß1-ZsÎÓÆdG0Uº½… Èi¸ñ&zJ›ô@—æiHêv›†rÎÙ™"ån4’•)õ"—o¸¸»`·R)›˜rwGùeÚrß{ɳ£ä+àéú˜z^Å t#[žÒˆ‰  #ý=ï _~öölò×WpiÑC–pÙûˆñ\ÝF*…›FÌŽ€Âa i]ÍgMNåSõÛ×9çœ4ç,ÝÃ4s²H@~<®è·nÃu)z1(:™ ueÎéš—nzHž>ØgHì© cD& -;Ew<k‹H÷Ù]Y\ZÏ™j--ÙË뢊÷sï’îuéZÖÕq娑º„k ÅÌDÒÞP‚àNh ÛŸ‰£ë~Õ‡/:˜¿[¡†_žOÛá¾bJLšAAê­FYÁÐ0F Î=’C®`¦ƒüN·fõfÏÞɸ(³CYÈŒ¨¼ÛQlãö!ÄrCЦ°©Fñ Q:úøõ³ì/šú~ûxZ^Ì»¾±æ¹£•wæ>äY˜9Ú‰z;RSç¶Û­ö¼7ÄËíˆlGg@SûÓ-ð] ±3RøûóhÙ dC—÷ÞÅzÑ=% % O?%"põÛ;ªyÖziŒxxÌY[Ý#Gõ®ßFÄ£»T;Q"ð™{,$âLÖFP"Ù v̪ŒØW~¢gâí£æþ שן»à\ε@½~cÎy„ñ[+­Íî È1 xx@Öt ÷ò{ÍxF¥¬M¡Ìk[:\Jz‰F@l–âè4=3ðÎýež”7‘á㢴¯Éã•»¹”àÒέ#f_ë °÷Äßô‰¿B™zÜôì‚fa¯—~ñw7ØŒ‘^E`äîc7àX¹ 7˜b\FPR17îÓ€i™Pk©÷Âwð ÅúqaÐ+¸8G0ßÀ’÷ÀtŸÁIÚ”î˜ÛzH¤½Á~‹éºT· ¼Ÿ¤ïapP•$œö!;yÈd¾ÔòPÆ„\ïÚ˪½$šç®ܸN@‡÷G*THã°‰«*¾Q¬kßNI (&É5ÍÛË&M”&IíÍ;‰2ìëÈ×ò&S¦yÝ2ÞeÞ¹7Û=wKØÂîsõ8ŸA#Ï$mñánǯFÅi÷¯ÈN¢÷­(kñ 7dEH”-O%e@XÑßÄ_Á€&xY7þG؆Ðlcëõ¼­Ï»¬äEO§mëv[UëUm!mBе6YÁt&zcd:)kÑo¦86MÝN‡nÒÜÖ<|¦‡ÏLÖžµ`gwÍeä„6ÝëoáïÎoc‡Oè™ùZop´™Ÿ„=3ŸXÈÞçµ/@ÕŸE×¶xŸ6>SLÚLÜzf.Fk™Mñv0f´)…?»€©Î3Ç-·žÐfílkm˜º¬»à *ûÞàµht/EGxfš§éj9iw;Fk{Bóà3ÄMøÆ1æâUœ2âævkk>¾lË¸Âø¢â‘Wé´Ï)%iõ|ú?ŠOƬ endstream endobj 8465 0 obj 3556 endobj 8469 0 obj [603 /XYZ 40.7999999 412.819999 0] endobj 8470 0 obj [603 /XYZ 40.7999999 412.819999 0] endobj 8468 0 obj << /Type /Page /Parent 2 0 R /Contents 8471 0 R /Resources 8473 0 R /Annots 8474 0 R /MediaBox [0 0 595 842] >> endobj 8473 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8474 0 obj [ ] endobj 8471 0 obj << /Length 8472 0 R /Filter /FlateDecode >> stream xœí]Koä6¾÷¯ÐyÑðM ˜ç90ÆÀ‚‚™Í.‚L'‡üý•ZTÛ#ê£Ä"E«Ý²w»Ù,‘UÅb=É×ÿúôsõß¿ª×ï>ýQ}v¯ï>XÍ ~ªþ÷ÕÓDSK1¼µ®EÛÿTŸ¿žª‡ÓÝé®ûûpâæÜѽtã#€}þýôzxøiøäÓ»ºwW¢ú¾ûï×êÇŸº—/^ÿ…¯§¦5ý›ß†7\pÑtÿ<}×7þïôïT¿wChÎpû¿¯¬ä’7*i—®üüû´+z«Z®¸j*ÎE7NÝ¡ãÏÿœ~é ]†Q·Šsk”e«¡Z1‚m­©´õ`zS[‰§LåtFYÒÌ8S6‰Œw¡õy’Ö§e,º¤dtIÉ2°OšÙˆw‰ŒwÙðLü>BJF—’6ž‰ß!$2ÞU㤃”Éøj2 #21|?"ž6µóõÆòL¢f„”Œ0«L&ZžIÔ@Hd¼ÛÖfÂû)]Mÿ’…€ÝˆòàB"ã½×#ûIŠNKœæ*_ZˆL ߈§MmÄ<EE½v`TÁÚdŒÙ<<¯U“G?:ˆ§MÍ¡>ŠŒzmÝf¦“'z• ÈfÚ`Ï#âiSQïºËbä‰G#ï!ÐñíýéõÇ^¿êmÚû_º‘ôßx5¼ÜwÓÕÕ«ÞÞèô¯û/ÕwŒÉæŸÕý¯§¶Ö­´z°¤‡ö¶´¨…[Ø¢P‹4ð9aËØÂás$lÑÀàlúwçÔãlÍ<$ÔÂìP³ªZ kZü+ôUá Ïo U xÕµ úéÐ<{¨Àce¶L)¼‚Øbß‹0°F›o& ðzjXlƒ¦¼!Ç_›oÎp^keúÁ­´úK8,o&¢3)õ ÀˆÿR¶à>GK°å Ú°[fsа‚€Õ ?çùù÷ÁŠ•„JÆŽ€J_תœ’̦H¡BJè!Ÿö …#ÐJ°%°jáš ðErí_:Äa‡"! Òdò;ØÈà É%oLBiFÿ{•almDX ëÕrŠ¡ïÙ=ÞóÚé7¼.:n¨V–f€J‹8Œî¨(dtûC$°˜÷' C<° )œÈž#0“ K7‡ Œ' ççÆº¥çÍD†»m£YäÀòõy;%÷”@Ê!¹nZfÂ.–ETÒSxõ@rÇø/±¸€@JºtW£2x•Æ”‚žvŠ™Pß°ñq@PˆtŽP ‰€j UX…c>‡9w˜YA\fVô=˜Yó­ 9̬¹.7kftL%žŒŸvÃùà>»ß“ÛIþ×öî9£GÃ"`+FãYƒæ^®¾’KoŠ“ÊwæPR­ñ°…íys¼"…áÚ³pÙ“È™_OYì“Ø¸Ž`yéì¸2÷Å¢)KRÇúÀ<ɵ÷Ș£²å®bäd[Ù‘ òp±{áeWð<ÕËq“å%1_X¢y}±”ǤðïÅÁ"kó%›ïçŽðYc©ˆ‰E¤š[в•Y´æˆx&%îF"¢Ò†DÓšõvGJžÜ@îLKË’²á ‚ÎÖØr;a¢«Ì sk®Œ2A Qh3í\Ý‘® È4ùßµlï´vôE¢m¸Ç4’%p̱o-Ǿuì[ÉRH¥0)Ò!@ xãQSÒ(²=ö –]Ô…s…qÞîD°ü%¶Æ‰¶ñé>Ëe“…œ.Å#\a¤MÜ2˲1ØÃÅŸäËZ亯SDMGŒƒšà¿ôÅë#1üqV–Øš¿>pV»çá*ï,T†OöW8ç,Ĉzn‡/%xè³Þ+ºbCÀΈ"< O,å°EÔ±G´òJ»¬Ç®çORvDD¡œ'ÖÇöHå7â6BüEDrDÁòÙ,ÁÒΉL1„WZ%Æ1\ 56üLñ4×2ÎÈêi‹‰ï#ðsZÔÇ¹í¸¬í@Ä) 9«­iÁÏqÌÓÔJLžÃGÕCLõ|.Ð|ܰµœîN¸Å™fs#(u8nkGëÖy>;šï—ÁÈцe|‚ÜCÇÙ Œ"Ûs”SÒØ|%k‡„#e’õrÊäÆøÌ™@AJ ˆ8T%ëF¿MªÁr÷ÍbJ¢ä*J‚=þrju­n×j±œ8žÃ ‘#Ñ,B“÷ Û72usœ¹ñü{¿ãÍäEÿÆAÊARYüQáx%RÅx¹ Žf9É„Š2Ò`„Z>·.Ë`Ä.Sèù¹'pé æ«l¶Ó ,6m5LQ8ð;à—³&¿‹~²J²Ì§oN¸ÈÂ…Bh”QBà0ÐàBbD |ü/l÷=ÿåX¤HY3„&þ¿þWæºùŸ’úiHÖ"¬™ƒÿ¯€ÿNàÿ]Ó1ëé>˜—‹é€ÚN8©Q œ´MšÆNÖ%H]’Žâ1/Ë®BÑC-ô¨žî·Ìv£CXs¤œíù¦IB±;Êg.é‚å–Zò  ãÏï—½R¤$×S.CسEà mi_,CG•r‡êíБã«—,žW†ö&åæÊÛ¡}@²c›‹b%•;µNËÆ”¦}©Sau9,*¦_°|P"åø‰ç?ô†.cÚ±­ ÚØJ6¶(¨C)#¾]'ÛÛïšâgÿKÏ],X¤”5úl[ªã•Øå­æ*˜sB ·æMì^NbNqÁltD¾óeã# sÔƒå)bÜ$Õ‹¸ÛI£^ºO¨À–£'{ý\Ò3EœSªð0ö—ÂzìWÇ~•Iú ØÛ¿xtéBÅõçkïðîò„êÿ˜=ïÆn®Ûô,v²÷¢g *#垃˜ð$E÷ÈzJîŠRL÷éDW]E\•Q:v=…:Öë”#†8ÅT¼›Æ CË–›z8‚C^NKw cj3¯m´ª.ak;ˆŒi6#)kÑÎp¨um†íï±ÅÂç4°O û ¡+jÁdß4eœ9hÃöûô“÷ð»Î¤˜™áGÔÇm.s-ÍÃ)4q}ÅbæîÆv^ \׿š_J|0µ1M1`hޏ×Ç]h˜Ïñw0f¼9…¿‡ks/|ŽÛŽçú@hÎüæ.o-¸Ê_7x,­Kw°R\Ÿá9ºO"ZÑÛGôLCŒA—nÕ‚qŒe‡xr†zÂÊmfjÞ‡&K/TØò4Oï.çNZÝþú>Ý endstream endobj 8472 0 obj 2839 endobj 8476 0 obj [604 /XYZ 40.7999999 124.819999 0] endobj 8477 0 obj [604 /XYZ 40.7999999 689.299999 0] endobj 8478 0 obj [604 /XYZ 40.7999999 689.299999 0] endobj 8479 0 obj [604 /XYZ 40.7999999 415.699999 0] endobj 8480 0 obj [604 /XYZ 40.7999999 124.819999 0] endobj 8481 0 obj [604 /XYZ 40.7999999 415.699999 0] endobj 8475 0 obj << /Type /Page /Parent 2 0 R /Contents 8482 0 R /Resources 8484 0 R /Annots 8485 0 R /MediaBox [0 0 595 842] >> endobj 8484 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8485 0 obj [ ] endobj 8482 0 obj << /Length 8483 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÑˆEJ@°À<<r`Œ9³Ù ™Eœ=äïGjQÝ©‹%Jý°±Çl’Åb±Xo¾ÿÓ׿ùýøþÓ׿ٟŸ¾Ê¢Ôåðuì¿ß½ýƒlŠJ¿š¦.dÛ¿}?¼_χçîß׃ЧŽöG×8N1 øû·ßï‡ÉÃ_¾~úK÷Ûòøçî¿ü[÷ã';^ÿÕý/ÿ~RȦûÏÛßúÆþú‡ãoÍiÜþßw¦’u%d¯ç®âôý¶+š¬<¶¢ÖZ…œu‡Žÿüãðs7ÚŒ¢UB­L¹xT#ûaë®Gkt?ª7¨·¶…C¥d$Ó@õ€Ž”¥‰R™ðPdÔ#NË4þvÆ"ÌŽ”Œ°Fi¦-4=.RV6"ŽDÆ{[µÃ"Mò2ÏC%¤EÉ3Ð "‘¶´óx(*êu÷}Zfm’¦yH^Ka˜¶P÷¸HY™E<‰Œw©-y •Œ/ÍDòU#™vPŸè4ei#æñPdÔ×%êk&&¡µdB}êñPdÔëÖòˆªJÆXËÄnY1ía{ S–6¢EF}cÔi™mŒ0;R2ÂZÝ0ma‘HZÙˆx8ï¦??,2åy¤TtÑðp­D,2¥7Ò3‹ž'/zÞk ãÇ—Ãû/BUM¯Ö¾üÜÒâÝðã¥[l}|×ë{¦9¾ütücY õÃñå×C[t™©ez®¥l`‹„-O„>-j‘°%5îCXž§Ò|‚£ P?½tt´:U´fœõóúð´Už€16l‘óá4e]T²²~‹6sji\<*3Œ®õÿ÷­N-¦(½­FU….-ªr†÷æ+ê+=X%Àu P]HÑ8…ó <<ìSÖ°bËVˆÓ„GY°bÜG>-GÛ¤¡x¡ÕÞB1$[¸†AÂ-ÕzîÌÖµ9RÃÍpÀç ·xƒÈIQÔJ÷À-Z=åã­M©F–ô%þN%¼9*Âm¹»€÷øG#´P¤Ž]·|Øïž–X"°±îv×S©Œ'°SŽé'ï‰ÄÁ’-”81C½9wà•y'0 £ §©;JíÔQ’z8J‰RŒÀ”Ã׉{-ã­nj·EÇ÷¹¨‚^Ÿõ± Ÿ¨ 3È—цyDY RË’–À<•‚¤«}XÒëFÞl¼@-åÀšBIj{0§Z0ŠEÕ°Os˜À(†º„X¨×WÛžd‡)…¦iKGé¶JÔ£l{iÁJæG(Y®¢V`ÉÙ¢?Mr¶×IþÇBv@gÀZY„ì‰ûX½`ÙØâíIoó`$ )°ùÕ?Aa Œ:ß÷óÈRôÀ‹/Œp”«Já°.ܳù®=&Æ@ƒ· ÏG±Ôx ÌV–­°‘Œ'˜Ÿ,7P†Gæº5ï¢N2r.#H<ÌgÚžÅãKÞî^bº³òÍVI°«’,NÛWŒq›žð†~N@[„áxîBË¢N·æ¬@ÇJ UÖ€ƒ1¥¹ªáh¬f+{%åÁ|{öŒ¸†¹–êŽ+øÉàPZj®€f¦YVcJÀüÇj ˜20®Y]¿7Èt©ÍµpFgäa+Ê™rJ¯Ÿu+ûú¨ë¦T2^Ó H÷XÃbU•±â  ¢•uÖ¥5Q×Îþ&°ÑÉP4Ê3F‚ŽÐ=ñ?‘î Þr±Šã›—VÖCc\à9ˆ¹’³¢ß`+s¥ÚYb¦›D×\7.àpÇ­’Æú(}ù š7í({p&LáoS#EˆùñPÆ£?KHóF-3Œ&fGFŒ¡“½æÑº;_ÆP -Ús(Ö1WÇú”öI¡¼¬.ð@H&ÝLbì`Íkz¹ôy6Yð„–Ϋ6«D°^/Ȥ¯Hw·?ŠlÑXˆ¨¥ð¨z«¨Z_ŠÃÄÄœƒª¤Ñ~3³×5evYÏÑNŠL›cçàÒjã,ͧNoiË=Û]#FHpÿGX4æWvàzôÖça€5¨ BX`~ÁZÍÓvpöGX÷ZݧåD—Â=ñ[éò|„7 ‰#¸%§ÞV•£Ç›@žë"ÆÚÌÒ$X÷+Ø'à ¥„Uã$P8Z@ã†ó¬B;yN† '#—¿û¡w@ÿ“A:Û:ùœŒ‹‡’t”É$p¥· %åî‚úœ‘*êöª©bלt§T1cçUbÌN d¢DDp8pY”nOÕ‹G¬BDQƒˆ¤йšÅúH‹Xâ¢ÀÐûhóö S–š`SÂY¡ZÕ;Ê ýûàlÍ ]´D£Q2Í͘0®a MáZe¹Ré¡Ñ_Lî³@9§” ÎØá™ÑAXë³ëün8W÷d{ÎUCZ~p®çzÃâ‚0%Îq¡¸y vetFnל÷än¸„»µ=·»žöàv4n8§x=0œ‰ÉÊ…Úv~u7Æ…”€;¼c.¤ FÜ…ëä\Ì\ÊXª´@z#ÉO˜B´¨:ï]x°d(6Wå}}×¢®Ýè[9,å…Y¢å< çcÕ"²Ã(qRØìO°ç.x8&"G‘J“©´¹—îŠË‡’ürøÃD\ÅpZ¬Þ¹RÑ4ÔoQÄX5îµ²UEýyJ¼,µƒ)5Û1ÃØŠX)¨`áX)µ#îëåAæ^üåžæjRÒw3•zÁqÔpYã¹¢#ˆ!X`ðˆa¹Ð–7<`šѭ{#\wÚøõ‡#ÕÃÁxõÂ{XïªùøÇ˜Zw  –A7bve~-V.BÜ®*¼1Zî]tõeN”c¹“HA½}z×,V5î©¡˜&"‚Þ"äì”,Dï¬ÌŒ¢Gf Ç32å±ÛG¥”lyT±¸âú.F%=»y@ìƒìá<ã* š ¸Ô!wZjtJ½²íƒA§öžN­À÷æ#¬rî¤7)õ×¶„|œô»:éBV )ÄPg9›MY^ÁÙÄá³yOgsσ8P•¤ù^¥ ôÁUôRÖ,Ö¢Áº1šz4áb?p|¥H%Ñ|¹‡7âý»¤÷˜"œ!îi¯/á- ßûƒàxå)iÁ”°Îå^ÏÀðó¡}î–“\¨D„–Gõ›ðð3¸Ä×¼ìS‰— á6üË·²k@§-Ç·¨·/0‘McÂiSslMµ°U¡[°[RgÞ-œTŸm·(ÅRö±[ªÎ¼[;°FP DdØ­©=ç•fz«qí@óˆUPäõ{ ic)9ͳ³;V¯"jùÝÉ#yŠŠx~mã'íqxä>fS¥vyùú*–ðîÝÔ>œ·1PìƒëTð_'Ÿ…GOé/ ï2îðòó,P ²Hl×ò @+’tÍtV¸2ëã*s›0ã–Ð@aé=E¶7¢r˜:³´¾Ü%À[¨wA‚è³ÜR½à‰`–tŽô”ì¦y‘Ñ¿š`3¦ ¶/·ÅÄ%Ø(®Ê6Pk„äW‹ç‹L¥ÏilˆX*ANƒGa‚Šˆƒe±Å¯ûV¥¿Jñ­=ÙÑUݸ¬;ÂV7_=.bÿW1–{ Å#vÞ—Ãñå÷_žPv,pÝa ß7lž¯¸”êl¾ùë8–’‹ƒ[yË“ì"°Ù­ïn¯HÀì@5.eAHœÀ°-£—îûøÚF·éýìoß”â“Xy!±ç ‘»ÎÛïôQt˘ŠSl….+HU:)°ZzÚOÓªÂc–HS˜i9ÒL´ ¬·ª ÙN^”u]èÙ»·ÐÔ< ìÓÂ>ÃUmd!Ë“ÑÇ%÷©Ñ2|û—Ïð³VÚXáÔÇ^ôS-­ÃŠ8q}ìŽÅ¬ÝÂv: T×ÿ.k1^lï6ÞSLx4KÂë#\èÒ§xH;³Ú”b«„LL½p[%dªÍjfS°aêòÎB€ªüsƒa1è\Ú8Ǹ>Ã> endobj 8491 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8492 0 obj [ ] endobj 8489 0 obj << /Length 8490 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhøH ÌØã90Æ@AÁl6Á"³ˆ³‡üý¨[RÛõQb±D©Ç²w»Ù,’Åb½XUúøÇ¯/þù[ññîëŠoýëÝד(…ÝOqþýðúåJ­º·ÖÕ¥jÎ?Å·ï§çâùôxzlÿ>Ÿ¤¹tì_ÚÆaˆàoß~=}ì?uŸ|½ûsûî…*þÔþ÷Kñ׿µ/?õðÎ_ø~r9¿ùw÷F*©\ûÏëwçÆþò»â×v î÷ü÷ƒÕÚVUÚ<ž¯]åå÷uW4˜(i¥k§(Uû§nÑñßœ~n¡]§Q6•”ÖTV,†jÕ¬¬ŠÆšÂú0½¥-ƒ$“¹† P;#™´2)*„DÆ»jÿáÁû)]ZÖ<€Î3âÁ;„DÆ»6¦[d­’ñ5€JTKË´ƒæ $iiæ1(2êkã˜H~€”Œ0Si¦-lgÄCòï¦ábñ¤dtµ˜6°ábñïNq±øR2º\ÃÄâÏ3âÁ;„DÆ{S&¼RÑå„’M ž&!aËØrGàÞ6~n|§vF½×•y‹WºFŒ4G¬%a¥÷Ú&I±ÐÔÃH©ôXË\®ÝTº1o\‚uä)›5½LX¤r¥häë!ë÷¸Å›=6[ð>ÞÓ±cb3 ®¯'Ï,‚Z7Í<{Ä‚ ³G¬ ÀÌ8uG!Пóa¾’î퉚 XÌQ¸Ã½Ï¨4¶G$³ºÂKWXõÐxMFüÖæÅo€~1 p(l\mÏ»j¨zï„úÚ×¼Ô' º=Û’#M5ìÃýú;4£þ×Õ Ž8ÔÖuœúØŠÍ‚€†ÈËUÁµ½ìˆ¿)žc7BýÿÁèŒ~c#ä@ OW.á€},;ð-Ì5 û¼VØ ÀFV‡÷xœUÎOîp½3ß3w¬^Ûœ™÷ÓÂË0UaÓ‹N;ë+µÆ¶ªêã6%8Ÿ}= ;p= nyŒ…¥Iá©ó²™û "|! fGÄ”,wûf„7×å3RjÖôY×¾ yνUÀ;‹ÝµGjØFø2Fa¼up’¿$:ÓGŠÒXù†™èƒ 92qKÏ C·QøBÎã.øc *å¾¾;k cG%–/ÀöXè™<+IøÈ™wDDœÊåã°!qðÉêDž¬ø/-Ÿà¦|FJÆ:²ªÃ´*;´ÒP£u`‚íê ‡ˆL_e¡Pžô,K®ìb–8ÄU,ºŒûzAçt®Y5Üj|'ƒ>ýÿ#Ïða× öøç ÜøVÈ^£ŽŽ·¨aì@gß¶T1c´;1ÇJ³P¦«õn(3Wˆ¤ÄÇL8®eüÊYuPÅJTˆ`Ø”*føU£®³Ð2ˆˆ¹Çå Ť¤M\>W÷Lʃq¹WcË·i×q9±x8òÆÃ¼ë÷¥¤x͆b³DQãÀJtúòø ß-ÏᵈˆÖæMôO*ç ³O‘⬈خõ]–n,_Ž0²ÞÖØ!·&(Bh¶ò6#ÀA8bq.v{j¥P£ÓÐ2ÄÐ*obÖ¸)žÂÅu…¯ÁaK…÷”‚QH;Ø Pö’<غÁB<`Š'ø\¿Sª~§ÀYÀ´ƒ÷·`¹€9,¦œÐI9§ð4RÂoC£x;Á†øüèœÚBãæ©âÐ-‡¶°m’ŸIℼ¨4ÊÜ(Œ ¯¸æi¬:ö…’dÁöºG¦[M¾Ì®°?؉Z·ÊOš­ÂðCSÛÌÛ&s}eo^ÀƒAÆä‰öšBÅP#‚—ïç<…E„Û,ˆ©åˆTK ¡L ¢¸Å79¿¾*™qÇÄsn(Ðt­) ¬‰ƒ#f,ƒíæ¤òÌqÊÉ2ÅÚAÂã¼4¬ºšÄþ››ôí@ÇÝ1Þ2FÏ´¬ì}¿ïÚ ®ýÆ€ŸÍã|v@¿y#Oã¼Fô–<”dö1¶JÚ?'\úöšÂ–€—âß[à–€O™RÑ÷v×›ùÞ´©õ=_J^#!7ŒÜvÊ ± `Ïw`›ÓìMóï<4æ®Õw®ÉjqäPš, %©#Wë¦8ái²GÓl/“sÝj7"£ rÓ)W)8ÛsÛãÀúˆR<iÞv\ñ'á.0PåÅ»RõîVpÉ­3|"ê!¤<Ûhó+ª¤G˜±¦al™ó ë|Çå)RÎWÄsÔ"ÒâV¾Ï]ü…’ð8ž‰Ÿ_³k‹À¤bmË:2Xyˆ ååe¡cžÈZn0!2iK ä¬ëᔌÛ.´NÏ8Î."·¯F?E2Š©€‰—CQŽÑm#d>Fž¬§Ô8œ‹\Ê`x^spØjJtXgb ÉL¨øˆÓ¨câfS 2•E¦æ®oÀ@…+}-ÇgÈÐÍÂÛ Ï N©mqŒ6*9Lzü2O)B¼Jð)Iì{‡“¥˜tеLÈ0ØÞQ*:BÐmU7“φ”L⥷¬ÎíT#N’S”ÒëÞ‰m Ü’t’×Mxâ©ëKÀð‚GØ®"É)iiªÃ+OòïO5^¾ùxj1•‚"Tñ÷â2Èf¨Wz(Vð†˜âƒàeP,·Ên⽦dO®Â^«ûÓµ¾ÌýÕW·Šཤ`}rF[ËårÌÖ#Ìú BÂ`à®n¬ÞåêË‚™ èt±¼þcM^É„€|÷Œ£ùÔû„kŒ=GÙ$\tñ‰yWÈfjO•é¶ÔU×xBÑýŒóTË€8[[L|Ÿ—ÇÌûà–^,MAëf-uÙÉ·âÁ:nÁã¼DŽçÖ?Ö«…ÖI”W}z¾¬Ôhn}ÇT‹‚Ø‘½€êåÓ’¹ÆÉTÑÚÕâê†òš$àVÉ~žÓuÛ,/¥Èˆ7îò;f9BAYÙg3eè‰Û/KD¼Ó¬N²b4b´ˆå¯cÖÝ[N)ŽüÁ2ÙÀ…\õ1/¯ø~&kóxÐV’‹7" ,âNß™¬—QÍžÙK¨ïÏþ¨É>ÍlæóÉjsµpp6.Îà%dƒSòÄIËÎTç×  ¬‡Í€]°ÃnÁºq框r€*pÒ¹š«ypÕ4³{h!T,UøYP„JÔ¤|v¼÷”,NJ%®K©\›kÖ3Ýt³«ã¥$Œß€œÈxR¶ 'õ6åIàép?ç <µPåWú¦pžÅ5!×”ÜvJŸíåAÏ Ô¸MéH¨þA¡ OV Ï}F9U›Ùù¼9Ðð>,Iʳn×”'¹â]8xtF±äß~=ïF~ögûõüˆ²ÍÖ³ó9ømp=Ø¢£´Ë²]ÆTÆe#MÙ…õhq-†Þ‡ ™ÒLÇW7UÙaÆÛjeK;ec'Zº !­KÕŒ¢~ûÀ˺4ÝÔX°Mã`ŸöéÈêR‰KLԘܧ uÌàõ'÷ð»ýmúÄ PŸ>^aªE¢uô—Šq}ú‹Y{?·ËH ºó{UKûöÈOáï)¦ ­§éõé]5Føic6@;Rä=< ˜zá8½“mª„ÖG~LÍ S—wTåŸ<‹Î¥r„>Ý8µ+u´± %0·4ÞCŒÁþ‘•Q-ǘwô‰´©'×9aJyŽ^a|PaKß§—¦Œ’´x<ýf(s endstream endobj 8490 0 obj 3250 endobj 8494 0 obj [606 /XYZ 40.7999999 255.379999 0] endobj 8495 0 obj [606 /XYZ 40.7999999 255.379999 0] endobj 8493 0 obj << /Type /Page /Parent 2 0 R /Contents 8496 0 R /Resources 8498 0 R /Annots 8499 0 R /MediaBox [0 0 595 842] >> endobj 8498 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8499 0 obj [ ] endobj 8496 0 obj << /Length 8497 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsË")R$X{ì9Ø@A7›`‘]d²‡üý¨‡’fLê#Å"ÅV÷ÈxlQÅb½«X|ÿÇ/?ÿó·óû_þsþ6~ÿøåÔ6­jí¿óåëÝë?pÝnìµl¸¹ü;ûåôt~:=ž‡ÿŸNL=?8~§WØ ûöëé½}ùÉþåËÇ??ýïÌÏ~ûùü׿ ß~ç»|à—“6êòÿíŒ3®‡_^ÿtü×é/¿;ÿ:€ Ÿç½üÿ®‘JgÁñ4?Êž¿^?Š^Öž Óʨ3c|€Sèøï?N? ³Í`4¦c¬W]ß®žµç—iå°fÓ«³Æ›Ô[Ûº©XîDZ©2] byKcmׇ§"£Þ°Þ.³Ï^è0õäv™Bä.tž*w"©»2] byK›P§"£^IKaFæ®sš)a}WHp] bY+›g"ã]›[¦Í]æ —1E1ŠaÃxÄê€6ÁÒÏ“ c“(n@–n‚emDßÐtMmÖº€V²ç8ø&þ§ kòÐO¼¿¬w¦r¼ì弄·Ãë]CŠ+m½[—àÅ\¥¨ÞZƒZ7z!ߣýZ1Öoõ|¢ñP”ÝýG,2ÁêAï­/AòÁ×ø ²ž‡‚·Ô!}ï*‘ƒåá³s WÒayA ï.h¬X\Äc„аpx—VüBW â)ÊÏó£[FÑ&Ôh _OÁwi¼±\Bã ý“ZöI¼$¢SHb&ˆÙUÅüÛPÝæú,8ãØMªª-3 ÛzÌ“Ã)¦8ȽÕEãx²½‹Ý Á›"Îüìf¥HÑMc½1Æ'fY1}Ž¿w†›ã}”|Š…âÉÉí€øÃÈ÷¾=W‰Î}§ü¨ŽÍþ­lç(8ýÕLwBtޤ•‹J _ÄU0¤ì$¹«ŽßFê ±ºÔQV/c„S‚\”ðW†û:¦—fuCô¤PyFPÅIº¢Ì7n¯äaGEÚÖ *S]_öÊ}çn•”PP•ýÒtpÇ7zZºï\U¬S¤ “ÆËFÁ‘7tˆj yk9ÿñB±ˆâúa×!%©„ŠWŸ7Î1ß‘‚ز²!×dû|•¯ŽYÖ55üꇽ \Í+ÐwâòyÝÊ” ‡töoú¤dü1&pHz=¢„%S6½‰óù„è<©<¡D(—Bõ5œè²+åjœ÷t=åÅmâÑR_RÞ7L5—5AËÄ?ãB-]0&ˆ°Úˆ"áY„¦ŸrǘÀ‘ázÇ osŽÜÛa‘;<d8Ï9Jpo;|‡Ç ïTÆ¿ã@¸±MFN%m¶=@N?ZíÜö!½q;7Q¯u’á*çÆb Á¦rBƒ‹b1 o¯Þˆ‰"o«­‡Ð:¯gÜŸ:´¬ãð2ŽU¦éçŒcQ´sC”=[`„>µ,°»³¦ ¬vóÉ:œÎù¡û³$Ê®u?e=7«ûEÇ¢\‡£[…u?Ö lçº_Írès©·FŠ7:6m¡K™“œ|qÙÃø”Cÿ8æO8%™u.9¡ùYÁJ“»+yz«©rÌ~ÅJü¼f©ÞÛéÈ4€ÈÀÖ–šAuŽjXÑA¢D‰–w€’ñ,zô+Pœ’Ð!'£þ?§âÕO¶AçMêý ŸÂ¥>.ŒF 0ÞP]o‘£´¾ú¤ìRF{¦w~pÐÊÕ*”V+E;xÅËÉFÏÉ4ȱ`o¡r(£ÿsõú*0Ú‹.«I±6“1¿Zð(™¯(N8z~Ã}¬«W:=¥ZivÎ ­ ø·“fïz¨²Ã²u–¤@ß8RR>%ùp˜8@Á!lœpÆ´H(c»7*½·ÔåÎï=ß´# Þnôœ;㟲wcV¼KÏÈn¶Óö®3Ô”b»þM9F±É˜*ã~î·I¯o“'éØ'Ý$NãÛóÑÀm µ>[µQX>§gW|×®žŒÛä|nÀõ¦dH3¢Í9ÁtŸn+§jG»+ÉiH|í&¿[j Ý»*£ÄÅaÙŠÏ—™­è9Œðr¼ñÌZÙŠ„d‘Fº˜ %E×gÆ·>Ÿ½^­r %{)¯·P'¦‡iñþÃR,D舯&X%nu¼Ù ñÁ-æ’㉿ŽÁ㛾@‚$ ÷p"·dmªÐªà¨ AØüõ »K5…Å*½Ê^»R¤áÅ&ý&³še`|&HJ×B¿Ð›vœê¦Ô·l8͘+@n!k_±ß‡Òñ^” 7ƒií?Wª-L½—îˆJæ¥I—û {€³8›…š‰¦·ÂØ’¬m춯 ¼§ž±nG+KP[ÊcÒÏhH7w é¹o„›'âœÁGôž(Û;]z¾6á[Q¬jíP¶ *£]AŠéø0Ñ™²,5ˆ)$Ñ2Ç7Æ#þôÛ^Šœó&Õ˜^\¹tæn¼›…–¨»¯Ô\æJž÷–¶õX¡ðJ{dTÓlã''Üé·«Y_ê”Ã+Yžä~/BiÛ‹—‹TÄí¯0m‡üQ»ùZ ÃÓ3$¿$*£=Þˆo{½`Æë¦iz!§Jv=úvÞÕ!#IÑ«º‹9н@tE‘æét‘¤¥ˆê£ßÒ[뷔К5ç¡ë\myË]—°ƒ^¥tÊðåøÀ¬à"T\HRô Rb‡PÚœQäRg‡ÕTW«¤;P’„q!\KB¡ L}„‘}tÜ2ZÄ×M¸î @/„Ò²æ {!À…„ÕV gÛCa/¿,*‡^¸Â¡XPö>°‚£@@)ŠÝƒá—TlUFv\Ø(ßÅ»E)Ƈ(³ÁgªÊ—.‡*jôÕZ±i* 8ðÁéO?–8î茰޽÷ý§"íN¢±=\M©ܦ23௿ á*”À†b'³ÚÕ~UÖ}ÖØ1%˜””F«SNð†Ëp?ÓVŠÍ¾ŠF Ó97õÖrA ºšãÏ[>7bîäË[‡¯óÓ0ýðèåãã·o¿ÞçÚ¾ú5øh¼ŠPÙ€¼¥¾†)Û¤ñ,^úMÛØ°Rr%ô¸U]ãÉRË>¼oúåÊø~aÄ¢Sˆ†›Eý)e£¬þpké=>cà3Và÷¼á­¸ ¹Ì¸4›ÕR¯ÿò?;&†Vø=3F¬—FZǨmÓžw,eí#lÏ Au—Ÿ¹dý÷bt xO1àÙF:`Þ3㵈ªõ)ÒÆl€v ¥Œ~õ/`ê…ï½»¥gàl£Ï³¦.Tåó †¥G|É5áû©§âÛ#Ø>£÷à=įöNÁ8Ʋƒ¿º>5ƒsµnUÃ.õ£ cF…#¯ ’KjÒóãéÿÚ1Rm endstream endobj 8497 0 obj 3416 endobj 8501 0 obj [607 /XYZ 40.7999999 591.379999 0] endobj 8502 0 obj [607 /XYZ 40.7999999 591.379999 0] endobj 8503 0 obj [607 /XYZ 40.7999999 251.539999 0] endobj 8504 0 obj [607 /XYZ 40.7999999 251.539999 0] endobj 8505 0 obj << /Type /Annot /Subtype /Link /Rect [381.599999 269.779999 429.599999 277.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 8500 0 obj << /Type /Page /Parent 2 0 R /Contents 8506 0 R /Resources 8508 0 R /Annots 8509 0 R /MediaBox [0 0 595 842] >> endobj 8508 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8509 0 obj [ 8505 0 R ] endobj 8506 0 obj << /Length 8507 0 R /Filter /FlateDecode >> stream xœí]ßä¨~ï¿ÂÏ‘ÖkÀ€-E'ÝÌìFÊC¤ÑŒ”‡S¢½ÜE§ÛS&÷?vc÷ôü(0íîë]ig¶i (ªŠ¢(>>þååŸÕÏ¿W_þS}™~>¾šºQùS?œÀ»Zpó«îdÍûñOõåëá­z;<ž‡ßL+N?†Â¹ Óàï_~;|4Ì'/~û_Å«¿ÿû¥úáçöÆ/|=t½ùÕüÂ8ãÝðŸó߯Âþþ§ê·„îØîøï-S½J¢ãíT•ÿžWE5UÏ›ºŠ1>Ð)vü÷_‡Ÿ†ÖNdÔ}˘V­n‚[Õ|l– QõZULØZc l*µ!®º< ±´¡±¦Õî¦È¬Äÿ8LÞô©›Jæ˜ä™X?RÄÒ†6³7Ef½f†_Ãç©›Jmˆ5:ÓŽ±´¡Í¬ÇMQY?˜06‘ʱSS© q™Çr)biC›XïhŠÌú–é\¬?5•Úlû< eb=nŠÌúÁíÉÅúSS© iÁó44R”‰õVSÏY\0þ9*>¼>~f­èFóõ§’£Ûj~¼ÕՇÑ?áCéÕŸ›F|þ®zýåÐײZ?×”°–<Á…JxJK`Éc<Õ¢;–|zfdsþ¶2¿¥Quü…\d¸ÌyÜÏ÷6Ê+’ó\bÃ5©oûåšt G^#î ¶ãá¤[¬ûA­w£IÏÇÈâV†›ü‡“gÁÚ†'÷}&aŸé ˆ°ØÄ#ØÐ`‰9hv²X«iH9÷€íÀ¹4ö‡ 7ɬ ¨«m¨þ°æèF¶X¨íˆ× ¿'n'Iýæv¿kº¥§j±ËލÒd¹$èà6¾–_¼ng€O1šeÝurOس9’L±X:‹°¥á–Ì¿j‘„b~7Ïéœ7§½„’y#+t„>vŠÁaìíFX°ÍÖ©¥e‰¯Gœ­.\PÌX„ý,uf´ÛtzÖ%%àT)K°Å¯Ù’6l·’âá‡OELÎDD98a:Û/‡»qC&[ÚZW±~ÍØrck•hgÖ-îëã¬pa­dÖ-—%*¾ûÖÁ­õ°5C5µ6“·MÖÔf‚BJý°IF„©rVgÖºå &aÒ¦€ÏHõm ›½q®¤ZÛ®p‡BË–Oçq•žSé§„ÀaÐÊÌÕ‰1'‹7l1h\“ ³íYWæˆmĵiËÄy£š­ù¯»IÂ)æ9&î‘×è&äO9fÉŸùh…o#–ÙœQ#Ë÷£Ä‘c®ûoG.”•à2NÙîk>¦ÅzŠ;‘ ÙàŸ†çïÈ”ëØÒÊ6ùT)©“Wp¸wÁÄ1Êì¤l ¯'­=I沞½ÄD.•.v×ЫÐÐMýƒ-3å&l†÷5)ÂÌrК9žN@"ö¶Vv¶]ïŸÃˆd8¢<JpÂä„Ì¿[.æ@^AüËAÀ¦8%¾‹Ç}a¿&Kç2¹—ÛÞÝäZ/´Òw‚/ÇâkÖð:«ãr,¦_›õѶe.ŸKËæW/Ê}-Êa-ŲE‡â Ý ¸£¡»×º @+ªˆQG (©~ƒÓR°0ø/¾‘O¸]O1GùLKÀ +îá’xº;m D/Á9 ÇeË/E[g»  âB6 è"ȹ*³oTÙ|dX¸ Ðæ๠¸ØãéèÓ'ciÅ&F5ïŒÇ{®c*ØyöÁ¯‡—8=!ƒžsšŽüâèb\CÿB/Š×mœ‘„ ­QÌ uË%¢øqØ9ó£ôb²,XðüÒn~øƒBy¼¬Ð„{Fe¢á^böãŒÅ\Š' tæÁÂÝ( Ë òb{RŸ-Ûk‰vXîkÏAÛűö¦Ee#ê9Ðñ§%ÊÆÀøy˜ïnÞÒ5|€ˆI(mL¿”„é‡GZê4SèÓ5¥„ÓLd3{ƒ²  ~[œÃ=¿:€@A¯Þ&”œÇç‹pT6ßxÛàB² H_QˆÝäi‡<ÀÆeÀÇbbRÑ¡¯M±—«È~ð²Þ›^r=à­,ªËî¦Ã5+Ÿ´ž©öò¦}š*ÅÒ Ìú¦ Ë¿ÂF€žD 2eÅf³b5–[bˆc—æ²)Ë* Ÿ‚gñ-"Ž,­ ü‡˜ÅãÒNætP6Åì–;œ„—”"ðo5[ ° Y`ïÛ«xEÉâV:âŠQSbú+dœGkõrbqZ'á®®#á“pCÂAF²À%83Þw'gCMãŠ/g$<Òìx@°ÐëáðÈ‚©ø­ôKÙ•Þº5Œ!¨×‰$4ù€qR…i# 0´˜BÐ.uX«z?çqê{DùP =ûÙ¦Þ>Ly 1åÌhã7Â/׉\þ€æÖ=sQN»Õ ïgÏ^œÀxx "à‰•ô¡Ô Õ¯äRà5ÏœaÇÜgÛyp$ ¡'ëý}‡¯¶ ŸC%ᯔâ•CJ {¬½û:³eø[½ Ž_˜~|ù•T~–¯þ섳ª?5QUlÆÚÓ=SæÑÏJ4‹JÕjý¤¥okkA4ÓËu­×OXõJ‰Y„¨y¿úÌ¢”µ2 ú{‰†ýt°Në˜<ÍkÞC— ÐZkFÄÏ?y‚ßÎþWFøÕ™Üʵ†Æ1¹hqu¦‹ûDÛQ¤nüKvÚxáÙÆsŠå·6ɳêpÃ ÕØesÖ!;PRØÔ,½°ŸÉõX«[›òTÖhÃÒeé‚Cªl½Á´h¤—¼#Ô1ýÈ®æ:J@‰ƒ¶Ï¨<‡˜ƒÄ^T æ1¶üì‘„ÍíºFÕlÌ_]¨0VTXÂÎHzι’Vχÿºç• endstream endobj 8507 0 obj 3323 endobj 8511 0 obj [608 /XYZ 40.7999999 425.299999 0] endobj 8512 0 obj [608 /XYZ 40.7999999 425.299999 0] endobj 8513 0 obj [608 /XYZ 33.1199999 483.859999 0] endobj 8514 0 obj [608 /XYZ 32.1599999 485.779999 0] endobj 8515 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 398.419999 112.799999 406.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 8516 0 obj << /Type /Annot /Subtype /Link /Rect [128.159999 398.419999 182.879999 406.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 8510 0 obj << /Type /Page /Parent 2 0 R /Contents 8517 0 R /Resources 8519 0 R /Annots 8520 0 R /MediaBox [0 0 595 842] >> endobj 8519 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8520 0 obj [ 8515 0 R 8516 0 R ] endobj 8517 0 obj << /Length 8518 0 R /Filter /FlateDecode >> stream xœí]Kä¸ ¾×¯ð9Àzô°-ÌL÷È!@cÈa‘C0›M°ØY¤³‡üýøYU-ùÓƒ–Uvwu]Õ¥2%‘I‘õáÏ_ÿQüë÷âÃç¯ÿ)¾M¯Ÿ¿žXÉ6þýï×]J1¾Uº.EÛÿß¾Ÿ^Š—ÓÓé©ûûrâÍðàôÒ5Î]ŒÿöÛéÃØùiüäëç¿vïþWˆâ/Ý¿?þ½{ùi‚×áûI·Mÿæ×ñ \èîŸëw}ã¿OûCñ[7=Àíÿþ ¤’ZT«Æñr~”¿×¢ÎXÑ ®ºÁq.ºqÖ:þûÏÓÏ´ó0ʶâ\5•bÁP•èÁvô(ZÕ\J ¨5·@Pk))ÒêGÄ×M³J¹A‘Q¯´§É«Õ›A­Ô­‰D4ìFÄ×MmF=EF}Û4©Pµ`ªMƒú~D‰PAQQ/¸¥D[¯EØ i5æE÷O@ýˆøª™MˆÇÈxjäÓZ­F—JÄñ2‘œFÄWÍlÆ;„TêfúïCúÑüu/yXÕYÉÈ[+žH_@­¤X­4Œ(w€"£^Õ£øb5êgPk1&Yª5Úˆ¯›ÚŒz ŠŠzÉ…§©Öêñ ¨µ€d"3x_7µ õ6¨§$;qÙÙ¼8üô|úð¥íwqÏ?wö‚ãËó÷SÕýÓy,ž*þȘlÿT<ÿr⼬«F«zøÞÐÂ>-Õå=|ДáÚ}‘]¾ÊùD”•4ZÄТJÖ-ìqh©»}©æ¢¾n©ÆŽg`Ž!ñqôúòÆü †À”ùUÜ/eæXÅGˆisМ™(44nMØê÷Ñüž…_s ˜0Tÿcˆd=û0¢••â¯Ð*? -mÉxݼ¢ n±1€‘…Qa‘ \b‘S¶X@¬]lòøÜI«u²‡WRñ£êAüè¾õšÁÚ²¶Ðû[aËgØ"PK…GŸÁýHÜRChŸâ[G-¼‚Ðdü3â?#?Æãm’qÔÆcƒÐÒRABŒJŒ6£”†g [ŽIÓI0ÆaGøJ$ÇLá:uôƒgŠéƒ×6e¦„UïÀhZÀ~¦5—GƒÉúµ…²4_Kž‘vû@Ÿüp c=#2‰¢M–å™$é½åÞ’U×&µQ5^s9%©š] ¯g¬[(Ú2i%WZy+)ÖÞìØr½·Üå“»eÅZH Ó<¾ÕV(s˜ª1ÝL~¯vá@—#öUÙ~RËŸÂrÁao]¸KlËÏW 1½g•4‡îøÆ³p¸ÄMZࡉ/t²9ü±£Õñ8?]ê–4˜" õÜó¥å#âÜI<„D!0“ÛŽn¯_="Ô³@|öm +Y›‚èÐ^Ö-%v‡¡×˜ÊЧäfŸ¡E K„Kgx“Ù¢; WN€›ˆpˆ|€ºƒÇ‚UOÇ+i·µ6™p…Q·ábi¸)ÊlmªJÄ“¯IÌÍü“Ïà#’y5/Á­ö@_#Žˆ½¥ q ;¼?Û^ñkà5†!h˜Há’Ía`³ƒ§däZÞÍ…0iÔ2`.Ð&Â}Ú‹[«f[Æh-;R~‰'‹#6†™ z§=¦¸!Ëðn³êÕ`Äæã›}Uƒx¤#“Z§”2Kù•s¥àŽÖ2qó¾0*¤¹¨î›Î<’œ©?ý±3¯0Á‚Ú¢8 @`ûŽÀ‘l€Ý¯ð*u­¤Â1 óRXt۠ײd¯¡qÁäWlQŸC[}›‡)pXÌ!ÞFožÜ8… óH‡Ú°‰n$Çܦ›àÜ OH‚9öˆDC޹Iá«‹°2ÓDÑB·!Ž»ßM`_[ÌÎ8<*S=L@j9æjâáÇ-6o¸¿ŒF´à—ã;Øä#dj:Lš¤ù/ø™ Ô=g §UÕ=Ïæ=µ²Ñö¼òöCÊ*ÏdBã\=Çf¯ú´9Ž˜¦˜Ž|&"vÕb…vx#O9ùÅá ÃúÀ— ʇc …8ÀÙ²”3×Þ½å¨-ízóüÖŒù÷½¿v7Ò.mŽû¸ïÞro¹K;OËž³ù…¨Ï=aö²£¼Ã&RÛ:5íþ"RÖÁ^?ﳎœ¤)}!W>¬Å7þL]wÄVHéá>R¥R.%ÎXŒHÕ çBÝ te[3µ’ÒÄXû`›“à)¡øÅcûXÊiPßùÍ 5c]i“"1B¼ô(¥¥°4‚:ùÐç½’ä:ðÙ¦F·ïq¼ÿÃ-¸b Å£Š=JØGGõ-×¼jkßšÇ+€¢õâÖÖ ÅsC´èÚDË=‹4‡ÓJ2éíàŽåO€§uµ½±¹ƒp:Á-Ãq°”À£¤P âõƒÅ”pUR~ö¸ )\{s'œƒ ɲu!ªÅ/|ÐjN­³Ö1Ùçú“qXÍeœöC­ù•‘œ¼*­T©"¬,娾L!Ñ׊­ílêFU¶ÚxFrmb¨%h°kÓ:;)ÿ+¼q9í&,Ykh©eæzÛ01‡?n¸êÁ YsOŠtü¸ øÕh1ý!2ì)€,Ðâ8ûâB*`¤SøyÑA¬ˆ7õ¼½7¿s°ÓQ‹Ä_rz®åá$¸íöÄø#>mŠ‚pÆ>b:ýŽGÁòކçs[ÎmëÙý–¡¨Hœ…‹à¤l]‡ð([Úc¹ksÙ‚ e ~E©û-%wU¢;‰ $ ¬q¤`·Õ;‡ßÑQ-$ ¸ÐÖ$Â}K~A†)Jîêx‡–0iê†cœTs%€Á@0-,SŠRO(Iž¬E¿¶tµ«Æ4áo_7mc´'©É”[”äH9HbêeØnÊv7¼JÚcàÊ4kª’í¦b›£æŒß(ƒŒ·IcõZÖYøÞ-&I,‰Œóï3“ÌÞ\?‰Všk>…¡a8¤vøÞvã­óÍ’ô°±OÊà甥T)$ÞøÞ¸ýT†^“@Q)3ÀŠÈôß¡DÈP›³¬IÀýzÌu‘ ,+6ߦ÷*º˜rŸ„Õ~ƒ}ªµ¡g¨Äß89…ÑS½ÒÎ6Æ"ÖUÄX-N ßQ4zŒ¬[±J“c (b©¯qYù­{]®JsÛƒ:Áñ¬ ÝZAäZõÜ‹ÌS ßN™šΈÙYb„ŸÁ[ZŒ†$ùmýw¡Ò©‹L!¬ÌÞ’#ä#¼[-çñ<)Iq½m ž¥JøÏYÄ d_çˆà­"ÒÒM+VžucM`ýP‘«mJ,òd·Êè‚·‹®Ú)’ØÎ^/ç,Ùøcbc©e¦”ª4øÌ刀õL Ÿ¹¸Æ wÚ”¯©Ëʼgæ’4nö#Q‹€Ïà±18>Ë&aZ\ ~¦å©JiºqË”Sº4‚dE„=»¢Zž¯¶ÝI¶é0çëIñW“? ˆÜs¸ˆêÍ|Ç–IB·XÍcÓB›°tfÓ‘0|" »¦Ãï€Þª_8E¿õÒ×üzúêàã­vÚ\[e›äæfÁÚý³sÚûû¦ó4¬líÙ˜5ã†,Ç-ÁlÝ#ú_K!oÍ×ý<|኎¹¯7mÅ,tü>ÅC»qîÎÀ÷œ ¹­˜¼ý¦.ÃÎÙÔë‡ÎTÞ8õ2£ ¯‚×,"Ä’ÔË›66À-Rc4ÖÚ6Uw,ô%)ûóÆMïÅŠ¹*6Æ 3Â}³po]ï(?ÂLÛ&9áÙ ,ÅsVÍÄUß)×Ñ%-’«$†LænÀ¼¯×MT¡G\L-Haí3Vo*ᥣSÚÛ4|õØ—h’ñBº¦áÀ•C àûR× âjxigŠ/~ÌJ{íǼƒ&{¾ÀPÉêµàYéðTv˜ NIµ&Š/Äænx Ö‘wᣤ(msˆdMQñ$éFyŽ®¿¯åšŽ$¹ÿ¹jíçd/eû~ƒj­•® s¯ÖšÃxQú|ÏzÞ:‡qÕ&ñö W*ÅÅšÓÞ>î+ý¼Û-¯fwá®Ahâ½î;jO% v®'$;ǧî{|ÚíörãöüŸQïIVÏþÃtzÏj$9;"#êѤ½CâmEñ³©IZ½Ç>Y’´¾ª¿HDb–]B8¢‘8µe‚|å†Ã31HÇVÂSðҊ©xþ[’-ž§dpy‚¥Ì¬ÙR1t[òךáÉ;Þ£O)N-9Vàšì[JQmBýdÊs[¤®í¶8öËçm¯ʘó%ys^6”ºñ¼·À;[‚'Ü‘íj¼Wž3ʱ¡D»ñL}ñˆ<œ¤Þß]ïÇÌR¬2îy«WpÅ®ã\I³ÞCŒ·Œ«[ðóEá2c¯²9÷äòH­à‘8hÍ…ÂÝoñÒ‘r¸›ÓË·ïQ%®ªE=9ÙÂù¨¿ŽdSðnKõ ZÞ”cuAy>U=/kš²Yv µUim#A…*Õ²…«ZF6”²íbùͺ.›Ñú5•ýR?>ÓÂgFQ¥D)ØPûÌd÷%h#»×c.}wªV²0Ã/è™i_³ÔÂÑ<¦½BÜ3Åbæ>mX+¸®/jnV_¦)ä4ȓ۸á%›hË÷bœOÎû¥±a~€ýàùðGB?î‚<4‰Ê…n¯¼>}œEå´t™û©mn’Ó mn²æŽñäÀJí,(1”Á”§È/ ÷OAº(~]Ý_’H4­YSò¾º¤!Ú°ƒ-×ÖëSJ £x:ýÑcd endstream endobj 8518 0 obj 3800 endobj 8522 0 obj [609 /XYZ 40.7999999 723.859999 0] endobj 8523 0 obj [609 /XYZ 40.7999999 723.859999 0] endobj 8521 0 obj << /Type /Page /Parent 2 0 R /Contents 8524 0 R /Resources 8526 0 R /Annots 8527 0 R /MediaBox [0 0 595 842] >> endobj 8526 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8527 0 obj [ ] endobj 8524 0 obj << /Length 8525 0 R /Filter /FlateDecode >> stream xœíˎܸñÞ_¡sËâC¤ìyÈ!€árr¼Ù‹x‘Éòû‘Z”z†ì¢Èb‘£iË<ãf‹ªb½«ôñ_ÿÞüó·æãÝ×ÿ4ßìÏ»¯§®íT7ÿi¦¿^~À‡VðùW=ô-7ÓŸæÛ÷Ósó|úrú2þû|bêü ý1.KÌþöí×ÓÇyñÓüÉ×»?¿ý¯áÍŸÆÿýÒüõoãŸì|Ó¾Ÿ£¦_þ=ÿÂ8ãÃøŸ—¿Mƒÿ:ýåwͯã†ó¼Ó¿´zÓó¬}<¯²óß—B‹uá‚KÙ0ÆÇ}ö#8þûÓÏãlë6Z#ÓJê.zVͧi×ѪaZz“zg‹œ*w"1ÒÉDÓŽXÞÑX'ux*4è{fá%DîAשr'RÒÐL4íˆåm=<ôz¡°ñÃ̃j*bzF3Ñ´#–w´ôðThЛŽS~*s"Ùõ‚ôÓŽˆ@O…½ì4'b8—©r'â$¡æD '0ô¢³ Út¹]§ÊHE3Ñ´#–w´ôðThÐ÷R1œËT¹)3ÐL4툆á¦Bƒ^[m‚ólª×DŠÉHôD ŸvÄò޶€Þ›ê ‰áÁ/†ÇsàÁÏO§LŠa²³ž~wr6ÖæOãqûæÃd€ôCóôSóû®ãýš§_NOã>‹¯ªµ]UËàÍ»ð>¬+ÁøoúÍÍ–ñ&‹–{ëÂ{ž¬ZΆ×ЋÀZÂ`²ñf >5´Lðù#îî$Ææ;Å—=ÅŸ¸,oÜåb¦ÓöÞ†>oŒdhb”+¯÷™Â`z\¢s)~6ž¡$0£Í½–”lp€Øç6Ïò˃óä ÆàuÁkà‘ñ¼#‚7Â7Ê<ŸÞ0çó6 ®ç‚«ø­y Àì5C,²Ï[¢F(Ë¢´êÕ«ÓȺ¥BàHŠ*¿ÇÝÄMg(<ÞùR´Š†+ 0U˜hnâ]?”Zƒ1Yz<ƒÒ®t¿-¢õ¸ e÷‰ç$><ï3t”œäÝþ±âO÷ÅU/«†÷¬<¼oÈÊxhP\€ µVF|Õ—á s[_Íp.”1q‰ Ùýaô¼‘2Hp'GÛØ\»“\Íwr0 .™eç½^úµ‘‡ºwF³Ï°{ð=#f”1Ýš—gf?äÐJ‹çËÈ,mYßÎFÁ5'€»vÍÆÁgà]Ã;°´m³ÊĺvæßQÏ<‚{Ã@|&°7VI¸È‘ -IÀÞ`ŒÌ»«0+€eWö…‘€¯)\>Þ°œ„ãözóÁΈx»Å7d2p±e?+A¢'!Üj :"*“¢ŽÁ·Û#—?B òßÎtÉŒÃh»UîxgàˆGpvÍ+hÄÆìJÊA¹ðÈqØ%(În8å§óüŸ n$ï’‚ä];^÷F7ïrDðÀžÍ‰ià'#|äòŠ»nwqé/Zpžæ#8òŽÀ¹àˆõÁ]Éhâ¶™%yµÔáXÙpe?<Ã*ÏS°b8€{Y"ð‰!ÚZº ¼S¾ªÓï¾uàÛs¨»w‹ÇKáÓ}ùýløtÔ°Œ¬n;[hÍ“šT‹Åá-@Æûö„ÎÅ‘žg@„!N_ŸÀÙ`–¹v2“£d&‚*ôÚ»¯b“Bmº Z ¨ª¤Ô RðkÝ Z*+ á3æ°²ŒÀÉÁ‡öχNß,uCE†E òq¸~e\Cñ mR–IhØ–$߬qÙöƒWJÔ¨{«<~šºnŒGñ6ÃCY™”´fO¥Ä4Ü“„°<í˜;\ó¢a/æˆ DºÌ㞌¸QÄŽ¼øQNë«2<„ª)îWV®"fASKŸÜˆž6D%E5MuF¿’úw#!Xé²· Œ‚rÇHíš*=xF ÞÓ uŽøo s؈¥àèˆÿÖÿš^¾ç?|ü×h±‰!Ú‘t¢nŽÔˆá•!Rë¦q¾0çïI€ÁÒ}Gyå(eŽÛð"bÅC…¸÷ö~X·ÈÎ#ôk!ÂeDª…Ûm¸­«ˆ“ã72pÄ!°uâ‚\d8ÉÔjjŠŠ«,–J‹%_¯Ú/úIx§LB€ÎmbB5EˆïIHL¢gx¡Jx'ñŽD"*OR‚¡%;_îªÐœ¤ø&ÞŸLórŸ²%±;}!w}Ve)æþ´FøóoV´‡¢ÕQʯ0ÑÁ„ˆÔö+‰wœB’0óž2„Hû²ÞR †’ý¯¥rEEe ]º«Ä~å[7JXÑŽ,¥WVÎ+™ìYÁ\ît¿aÇ·ÃG¸n“÷ÐvûMyÁ…A“cÙ¢*k0ÐJÈí.S•,¢pUî†ØwJGД~(iÿnÿÝ{)é*ìt…ŸIéVjÿè¿6X6¯&8šÓ—ÇåU¯ö;B*Y!•2=]I|z®xÊD‘’•&BÅ ž²qŽÀ›b1Ò|õRÈõnÂu`¾` ¿Ì„kàJ8×.Ç >ÃáR2óÛ—Ë¿‡€KE§v¿¾càh´`!brº^=ö»›,©WŒ¾·uĪBgÐbµ¦oîªÉT¯þpð—*ôÚì¯V"³ææ5 ^T'ë!ÓÛ‡ð EøÁ—ªß#m̼] »Ø2Êa}{1Ãn#îLê-ö±…HO¡MÚ¯Ô¦ø­)66xK˜|m`IÎ-˜Ãº}×gB!N¼ë"Á-p®ÄU¢pÈ9vãÕ`Û(«^^ó@!z/¡"U˜è]üµ£í[_ä ._„v! Â~T%ý‘¢wùÿ ŽÆC™NÛñoóºIªƒjØxŒ+Ä* S³¼nD·6TŸ¡¨T«®›bF¶ÐffÀu«¯·­ÓWFf†%DËc Ù«Þ·jF‚+믭3€Ïð™YÛм嘆.#ŸÁÙfÊ}ùÉ=ø]{W¯œðzÆ2Ïk# :‡½iÏXŒ¥œÝîí|2¨nú÷lMú…± 㤃Àl Ø„6ÅÚnŠÀ-»‡¨†9gàÞ`z×ÏÃë`¨ ¤!+¬¯Œ0ÿþÀ÷s‹“°L‹—eÞ§&aOèS“wvN¨$ÌÀ7K f`Ìcø†úmÊ{½^áÝ$m:Õ²ÉÅè°6Y'Ìô¬–A¨a4_NÿÅRÍ endstream endobj 8525 0 obj 3393 endobj 8529 0 obj [610 /XYZ 32.1599999 361.939999 0] endobj 8530 0 obj [610 /XYZ 33.1199999 360.019999 0] endobj 8528 0 obj << /Type /Page /Parent 2 0 R /Contents 8531 0 R /Resources 8533 0 R /Annots 8534 0 R /MediaBox [0 0 595 842] >> endobj 8533 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8534 0 obj [ ] endobj 8531 0 obj << /Length 8532 0 R /Filter /FlateDecode >> stream xœí]_㸠ϧðsõê¯eÅ·³3úP`±ô¡èC±w×âÐ=tzýúµc;ÉHùÉ%+ÉLv€™ldSE‘ERÿôõÍ?o>>|ýOómþûðuÇZÖ±é_3þ|8ýBô­ÓGÓëVØñ_óíûî¥yÙ}Ù}~¿ìx·qþ34.]LÿöÛîãÔùnúæëÃ_†OÿkDóçá¿6ûûðç§ÞøÀ÷]o»ñÿ§\pÑÿ9ý46þk÷×?4¿ (ô{¸ãïFÚžõyx¼^åûŸÓWQg¬±B™Y.†_z ÇÞý2@; ÑZŹé”aÑP؃U¶±¦kÄÙê-Ïd»¾  #ž74Δ ƒ¢’^3i¦aj‘9Ð#¨\@¼/Cú=F†M(Dò0Ià ¦á£˜é` gñëƒ÷pÄìH c`F1-< »8ú’ã.çz_$LõlÒ–ݬÄ9oµêFRã%$~„bB÷ñÈÃyDÂcCÝ¡™u”G1OàU_m Þ¾ [8╘‡R‚t5p¥Á–u•@ä O0ȇ…wùÄ-–µ×?KžèôN‚Õ%´«¯ýÇkXïÝ''ÈÒx#ÕgŽmÌŸx/¹b7TV)WE@q˜0Ë>åâÍÃ{“Í÷cz˜E‚…QD¶@)—bŸ¹¥u*:ˆQ‚n_52ý~/”€R÷‹µ?Ög«fçF[ñ°iN™L5d}€š£âã÷"¤U—1м¥•°øœÚߦò’»3Aœvîê±ÔVš™êØí Ù3·¥¹j×Ü®çÌ BÃ,¶Ž7d½PÍz»ŠO Ζ„ã–Ð8¢ÁüB9B€³%1'aîƒ4ÀÇax¤ÒÖ›{ΖÃËY<'Ïp` Ãy Ìp½Í…ÉX î!³d >Ò#V©nŸ€t€<¶ÚRgt~MÓMõãŠËBðÅ0’“Ì;.y7½MNÆÞoûHð$¦8¥âÝ ¾ÏÖA!™N;|Ê‚GQgÓ]sÇ(LVØñMZX;‘vh÷–kh!„ÚIø%˜2`©a%Øc¸ŸÕ¸¤}Så\GÚÙ%œž"í.ï·¢Ìð½å ¶Ü¥i•d¬Ó*òIòÃlQ¬1Šü/êϺf?ÆÝê»nùÄ¡v-›ÞP™GëÈ qp¥PÒi)gx÷4•kOØÓR-§Oö´ì¢S¦¶÷1*Á_³å9×z ж n%RpNlÌ&ÎÆë‰©*oXÄ8ÌXN þçÖí³LÊzF‚»Øs‰–tý–J‰d—€Ã¼l€v‰ ¸‘ËÛ.©­Ã®ró%";·Ïí£Ï¤‘nŸ Ñ•xÒ(,W9ÛãmgM|1Ù˜ç‚pçñé¥Ãc 6N>Áf$=¤Ø"«>!™c‘”‘láG ®Ž*ÀaF)éÒæèFŒU$#ÎËEÂòŽ’Ñê3@ˆm¨2zéneð¡öÆÉb Aðë²uëã|JÎ?ÿ ÄIl³ÖÝG}y˜°nkK;BêgVÁ7¡(Êç¤l½uÇú5ŒíȈ=·—š° ß\£ Õ» `›j/‡âáRAzéÈëêÕ0—/þ\LR¨˜ÅHÑŸñsâOA¼áVËÕYÔ—œ Ø&…ÎYÛþJaÂÑwL&Ür=<àÛ÷”å‘üJ‰S-bøå,Ù?ªçñV]|öæt‰aÊÑ%)E.âëëã;(onråöù68ým?ÍšP¾3gƒœÀž •Aµ²ìºUv"„‚8jzB´ÓtæžÅçà'¨KO¬{ã\7™¢ISa3­ʼn/%Ç"êieÔÆJ)X¿1(#¥â‹0n\j±z…¯ø4ª€ÀŽß¬¯ú*,´ãÍ Ø›qD”RcÔ³L‹õ[¯wkGV;²‰ØÝ–ð¢9M¢X.eNp\·z•Zr\˜bÄ•=1Å‚ŒP(ÂW\Éß{ÃŽõ-e»2Žp§ÌB1æ‹Õ2Ã[ EJc¯Þ7a«z•ãµ>”;¨8Ž“p‰„k¹CàÞr­É#°X æ÷RÕÊòN•Àix-PÒpùLœxA)Šƒáýoø ûÑÅ’"ämçÜÔqAy‹ÓprÆïPî9*zgѽ¥ž¼Upæn“wÞ¨ôÞÞÔŠ8b˜oÀÿ^ÊýÝ{ âH“Sâ¬2ÅÃp¿˜"bR Ö{¾\l»ïÜ¥Luìñð–™EVº“ÒËÍñ$XÑKž|ðÈø$:pFŽ@Ú;pCe6®\ŸsªàbxS€¹ãº.÷)k2!»ƒ¢G3LñunäP@pôPg3…§È î¶/–î÷ô›‰0ÝQ¤(ïëÊS4¤|@Cá~(!f¾ÄچĵU‡úÆ•´M7ßOY¥¿â·§$ Þ÷—­qu+ù2·‰¯(ZkúSÓM‰2láZ çêµY«Jµa˹P¢8 GÈce ¯Ý \> OlŽ­åÒl©´¦rç§ÔÏ.¤äèÔ×Ýß{ þÞŽéõ´‡ÀÒ ÜÚDñÎ’ðws€X¬§Î µ>Ä}eàžÊ(¥Òc‘;YBö({JVèzTÆ5WÅx«fæ2P'òÿî«a" Ù¿^U…€Ë^«®° è–7`¶Qœ4°z‚ª¸ z94Æî—€Ë×Õ¡×cÝ Ï?ÍË0tÞí‡2ÿùö=@ ŸˆìHÄ/A2_]Omì> ãüIO7Uan$[<”sA®k»ó§]Vµž ˜¦M˜Öœ¯naδLªCÊVسENµn»Ið¸Jå\?=|ÇÂw&ÒˆV0ÉOsäfoØ9h“´>ýæ3|vÎþ:3Â'ôÎl¹œkáh³H{gž±”±Ÿ–«Îàºñ³Ð|YòÏ6žSȳàLãȽx6æ;ÃÏõùÏÆ-0·˜S 4ÀOO-êà~tûŒä~‡´’ñxð;·‡"k¯ï¹j¹Ùß¹ýjÂ¥6kJePˬ êÂæËîÿ`> endstream endobj 8532 0 obj 3331 endobj 8535 0 obj << /Type /Page /Parent 2 0 R /Contents 8536 0 R /Resources 8538 0 R /Annots 8539 0 R /MediaBox [0 0 595 842] >> endobj 8538 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8539 0 obj [ ] endobj 8536 0 obj << /Length 8537 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9Àhø’HA€'@Œ1CC0›M°È,âì!?zÛû£Ä"EKmq»Ù¤ªŠÅªâÇ*öÇ?~û{ñÏߊwßþS|~ß}»°’Õ¬ÿW´?^¾!L)EÿR›ª¶ýW|ÿqy*ž.—‡æÿ§ ¯»ŽÃ¯¦q|D?àoß½|ì~éßùv÷çæÕÿ Qü©ùë—â¯k~ý4Œ×~àÇÅØº}ñïþ\˜æ—¯ÚÆ]þò»â׆ÓÛþÿA+Î3QtR*5A.æƒa.ÜÇ,‘˜`¢<êÁ•˜Mï ²e5'H0Ô¢`‹0°ÚZÛõkÞœ‰âv6OÇ}×R•R.ª-¸ç½ÊˆQÖL;^ÚX/ÿºÜ,¬‘„[¢–^êÎò!H‹«õk ÖŸY­Jy²õ¤­ŸYûëØÅû70XгÈzn­0nÁs¸(¹-ÆPô;†hgÙÖëWÀ|.\íÚvaol—ÅùN£Š†‘ù:ýJŽohUñÆæ>Àð¹nyâL'Áz’$•Äð8–€À¦Þ :ððŽ¡IB’Cš'àÄü}Þ<.6ÚŽÄ|BRð§âë’ópgÎQ*ÇE9o̧TõŸe?ë€C;tkþ5ày1!®+EB<¸©·VXF‰Á’¹Ú6nh–Ðl!Ý!9Ÿ‰Åà;‡ŸõL‡”b>ï Œ“Ö±æó‰Rr>sdz)ÛªŽªæÚ.¡ê Z~­EZ°Š~ÚZu*f—TÇuÈxOL ¥p,L@ÖLË6^ZjPÑÒXV¿f'Øî©É9ÌGq•î†  pxuŸaÅ =JÊå÷¶|F-ß×–샗Ⱐ®µ@oûØÇcZ° ¦e -Ï Wby†-¤zVûxL*A_(s¯>AÚp€ˆûÀÆ´yô…â¾à,0(7<§*™c[¡}ÓAònz&QVÖ1üõ/1t?¯ôËzÂV:¶OGáGB[#m¾•Þ³çJZéyÁ‹°hêÆV:Ž%ÔÑ]ó5~'ÖAéñ©X"Ø^bùâÕDˆò=£Á‰íS.­8¦.cÝ3Õ‡Œ$Öœ6 ®3Ï–G_’—pw`NO—EËŽtk11âH7àŒêž-8àRxùÈØåªñøÜþ­21V0pf‘Qç™,€Œ“›ÏF Æõá$ˆ/jp”‡µò7œPf j=9¼ùV;-OІb o`xkABÈ£}V,kER‰xF£Ì Üf`}I;9· šóñ©_2…pº®Fá$H¨Ã¡UHbÛ–é"Œ‰¹T)(gÄÈ–cµ™ñvóaBÆÌÃWœ'œçÖç¹õ6Ú×|`‘Ò¥–<”VûAÖÏp:ßÉ_Ú¼€`gvŠõ0v¶M m{ÑÂë¾8ƒ^zEæîzç¼C”k¹$ñöA'†‚áOTyf¶äT19•²ZøÞ*ÊrÖŸ™ÌûÈd¶µz­òaQÁŸ{òp„c€ÇNž˜öQa"kFHïE<'êP"MÂYÊ~Ë!ÝÐ1ÒC‘, ÝÙiVÿ8:‹©rôŽ¥\±ÔsBl`ˆÎ &:‹LR{–„ \.îÄU”B)\EcÇ–z?0ß¶·3…CŸö·z„ž<øoÚëRß>ö¦ŠrN€[bœh”àx¿ë ¿“jè(Œš"ënÔyqíëu+Ù|áîæ¾¶-ï<®ÌŒëì¹ëƒû•D²oí¦ßb¤gÂ~ÇçyMQM_Hx^{‹Wãj¡W\~|–ž%†ÛhŸ]q1óyaæy5î.d}Ì-ýÎ/ÍÕò¹æqßeÆZÊܺxBÇ섎©Ñê!¡ã[³¾;T¥Q¯'‘Wã®r.öU˜RžJœ´ßüÖ%òÛ|µÝ‘ Þ„#º)òw”±q=)q 62õæeiò<‘F®”šYwÊE[”ZÐt_»r·À/=&…Ü„W´Ÿ<#ðð®Â÷aN1ìDÉÃPÞ\2E=Ð1Ô,·Œ·h5½äZÏ{Îõؤ`<>']抩¦l”á&>«Æê*³Æs£{j9QËaÅH:-_*1]3jážlñÞ¯4[ÜmʆÞë $7¶ŸÜóÎý[Ý$÷DÀpÃíï¾ÛÄ Ä/§ì 8Ù¥oˆeùÌeœ‰X9¢ÐÊL‰o~Ã1e?qÌDH^¡ ž,ÜB©¦¢Á=ÄÒ!Ü{èÁðÎ"é—‡xªRy\‰%Š×)aGvLéPª)‰ƒ{pÌÃÜZ.ß#¹Ãê˜,_Ýå9Mñ=6ž½"ÞÍ£—߀k^v_h²&Âv%O9Ô ¸u|ýþÄ™­œ!^mV|ÙË™kà\{ÍÌò Ÿ¹ög®ý6Ú7]RtæÚÓ‚Ö3×þÜ>íC:ÇÜ>í½A?_ ³óJ„ç¯[<á@?'èõé'xú³ô3ë`ºæ§xjŒqchÛ ¿¾ÿðXg׬³g³þà5ìÞ®‹ÁÔoظv …åuÙ?…dSGTÕuY_Ç…¬*{É8a¼Ð¥ž6½8õ•–Z‘²vº ðOUÖ=V4w“מc` ûôÎG‹R0Ù6ÍôÚhýR¬õ»öÙáâŒ+~E}˜îZ G| àjXŸaÆBxhë@„Öµ¯EÅÇ %dzçêÁàèÃôj/ž!óêÚs >àÙÀ´yækÊ=AXã üä’~ŽGn_ÝÁ}H+óƒû`Úî’¬=cX]rÍž-B¸ÔÏ­åÅÅ›)}añpù?u+u endstream endobj 8537 0 obj 2903 endobj 8541 0 obj [612 /XYZ 32.1599999 714.259999 0] endobj 8542 0 obj [612 /XYZ 33.1199999 712.339999 0] endobj 8540 0 obj << /Type /Page /Parent 2 0 R /Contents 8543 0 R /Resources 8545 0 R /Annots 8546 0 R /MediaBox [0 0 595 842] >> endobj 8545 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8546 0 obj [ ] endobj 8543 0 obj << /Length 8544 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9ÀÊâC|A{<C€ ä°È!ðf,âE&{ÈßZR÷´Åþ(±HU«;²±;ãf“"«¾z²D¾ûãç¿Uÿø­z÷ôùßÕ×ñçÓçCS7¦þTÇ¿?\~ ]­äð«um-ýñOõõÛáµz=¼^ºÿ¿„é;Ž?ºÆÓ#†ûúëáÝððÃðÉç§?w¿ý·’ÕŸºýRýø×îÇOãxÇ/|;8oŽ¿ükøEH!]÷Ëߎÿ<üåwÕ¯Ý\?îñÿ?X-¥R&k¯ç®¢ÿ{Ù=¬©¼´ÖËJÙͳíÈñŸ¿~îF;O£öZk´mjåqX'Måm÷_Œ,mÙH"w ß-²È@lj¬•‰FÛèHµ3ãøû’ç¸~ÝVwntšRìuv=-mõ1­ÎM@ÎažFfð¡äs0ä§thÏ(Ö1KFƒ‘„¥‰‚Lyˆ Ì{ŒrLIXÆ —F‘j¸ô–—£bÇåpÙ®KWI} ”Bô ô¦ýÞIrj.?cÞV`‚¯øÉWÔ@qñÉsÐiô!›ÚèÞC›BëJ‹B¨Z ŽØÁÅèÔy7m©MÛûñ¼˜“hÐøáœŠ\>¬x†-M/(òœO¥°\G¨N‚kÇy¾q1pÞ±GþÄ «ŸNk ‚6Šhd¬ù¡õÂ6!ÃK\´ê¡š˜ÆŒ‘¸Fh )Ø¢ásà FŠ%€W/˜‰ÀƒÌGºÏô㢯•‹î*ð®M>à_°pLèù¾˜}0Dç˜@OM†$MY;‘´"ÜÅT­üµtIÀU8üèM\câòì&{ 8““"Èð«JOWŽá‹A꧃U(Yóšd9]CLG"4–è’¹AÌ“ àda€dùS, šr )f 3‰Ó`&õTú°.ÎÇúŠfÆ)913cPíðâCC” èc,ÙEƒV|· ÞC²à>'W¸“¨·„V>@^N@Š¢X`ˆžâöÓÒË`'ÃKÃÑ^Äéµkcõ”ÊsvøÁU‡ø0eÿrF¥‡å…-j õЏéRÌ ¾ör9‹:ÄϘa,üä;˜kÆ@†sYžZ‚ÝX¾ŠžƒUPè9ŸZ¢°š@¤Hô©5_F³ ± ˆÂVd:j ™CUš’jÖKð,s¢н™ „×IœåXkJPKqSCö­n¬òt—âp‡¢Q$ÁÄãµÏ¦+…a%BªÙ(!M/cå“`«0#±ïõ1Ç^EÖ#þÐòŒ]„ËëýŠæ€Ëî\ãÄiqx‹ —C<Ö¢%Z?¶DŠÄewSKEZà¦%¥ôJÁÑ,âPEKi"¥d°$·D L(¨Â<Å…9x¥˜sEyJÁudÖûÖ>YC ág)r{ © ¸”Xo`ÊG4ECâHQ‰õúœîäA’ró’Š5–-L+ˆX…ч‹K61^4#}[›A_Oå ¤WàhНà× k˜é)\½¹V‹x)xÖû¥›•÷¾Í‘¸î²ÜÂò±ÝŒJ Í­¡Šúß Z؈‹ùXÔÒ|i‚Ƭ§èÜnïEüoÜB‰œ°Ô"JTGy=MbTF¢³FÙ#˜4)lá™|ÅU°|m¥ìpF[²•ÜÞjÙ¨ŽàF|Ò¢QGY¸e/?ò’ “œiÃ3úÿÒŠÍÈ ±E%ƒMÇrrØsskÜ`Yz{qä.#/ìuEt1Á¯ ìY‘b‹¢ûÌQbeN¶˜ÒÒâ×·wŸŸäóoÝGVš;c^6 Ñ}$Î:Ým®WîÃ<˜^9¾º¢è™ówN ‡3 1–sÎ:ž@‰›[nv´ý:Ѧvù…ixlø:Âm NÁ¿áí²ZÛ‰ž»Ô2.LH¸k,K®æ/½¤Áwô&Ü4Š ïžžŸëü…9EÌ'ËM6‹f‚ÁO ŠþŸ¿pL,‰öô@Š‹¶’U¡ŒŠUÅò‹ oï8ä\qœëšwÈz½8h ¸O7¿,Â墶jª~çõTDK—¢ÒðÕHм„“N¾)ˆ!¾=—ï÷4M©ƒ[†˲E.P#x‘<EœŠˆrKåòs^ÅåÏG*BÁÃ]_ä³ÙMŸueƒtë—Øxö#ã$ár¥HAáÍñ»·l¡eËGŠPJhqRÉåèX‚ÌE^ü£ÆH(%Å4([¶NÑHê R"è-Z¾eÝ™¢c ÝÍ:”“s»×g°Iâ– Ê‹„2Ƚìdó¥Ð¾a?ÚQSPŽõ7.›-ûÚå€Y‚÷Ñ«pnl¯P^þÂ13åå ¼RŠN£¼êÑÑÐÏÂ:@CvûÜ ¿ØI8®;’õ&!$—SµâŠúD);Q(+{ÏŒuÇ^¸SeÉ^wÍéßå5)Û¨½MNMÐÖQ{)¹«Qî Žš‡ò:g7s?Fšœ£½’ަ³÷JºY\:î#‡÷Jº½’®Ÿõ^I·WÒ㑽’n¯¤£jÿ½’n°üªYǾï•tPI×ý­^;˜u:~aüñõ[w!`›7À¾D!í:‹ug*qó•dŸ¦îóq•:¿22:ÆÔfšíÁ¦ë2#mm§àöJË,Tª–þêgÛÖfÈ€¾µXøûxØg¨•µlÔ±ijV®6ôò“ð»caÑ•~B}FÅ|­E uŒJ6­Ïȱ”µsë uÇße+Î/×cncžBFEuñ£‹ç?ä¥lYù’´æñF‡k£a4al>C´¼RüœÑÏE s©ÅñÄÈ !xFûwÄ—m¾”´ÕËázðਠendstream endobj 8544 0 obj 3278 endobj 8548 0 obj [613 /XYZ 32.1599999 446.419999 0] endobj 8549 0 obj [613 /XYZ 33.1199999 444.499999 0] endobj 8550 0 obj [613 /XYZ 40.7999999 368.659999 0] endobj 8551 0 obj [613 /XYZ 40.7999999 368.659999 0] endobj 8552 0 obj << /Type /Annot /Subtype /Link /Rect [415.199999 464.659999 489.120000 472.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization >> endobj 8553 0 obj << /Type /Annot /Subtype /Link /Rect [292.319999 403.219999 324 410.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 8547 0 obj << /Type /Page /Parent 2 0 R /Contents 8554 0 R /Resources 8556 0 R /Annots 8557 0 R /MediaBox [0 0 595 842] >> endobj 8556 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8557 0 obj [ 8552 0 R 8553 0 R ] endobj 8554 0 obj << /Length 8555 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨sËâ"R‚¼È!€áräx2 ƃtæ¿U‰ªª&õQäãR*[Ý€»Ý*RäããÛ—×ùüÏã/_¿ûüŸãóóÝçCÛ´ª¾Ž§ïW·à}#øô«î»†§¯ã—¯‡çãóáÓáÓøïó©ó@óc|8¿bšð/¿^O/?Lùüîoãoÿ;òã_ÇÿýzüñãŸÌ|§|=ôƒ:ýòÛô ãŒ÷ãn;=ü÷áï:þ>.¡?Ï{ú÷•–BJ%“Öñ|ÊÎß·CÑËÚãÀÑöGÆø¸ÎnÇÿuøyœí²ŒfŒi%u<«æ§iY'ŽƒVGÙrgRgoaS±Ô‰ºNæ™è´"–¶5ÖJ퟊ z%Ûó6E+S7:O• ±Af:ÃÓŠXÚÖfÐ㩚^™/ø{È‹úãx»Z9Œ÷k|I¶-WÚ|$,Ið¼N•x0#•g¢ÓŠXÚÖ¦öME½b^,ñrÝL•:‘<ÏD§±´­Í ÇS‘A¯û‰|sÑ&C¬Ï kYº6­ˆ¥mm½3Õ§,⿊ϞoŸ¯?2)ú“tõôó¸’³ˆ6ýx·Û_ÄÎO?ÿܶLþp|úõ04Ý t7ÉtkOÄûó“OãÞŠ¯T²{¼Uó[?Bø(ô„CÈñ!~¶VÀ'>ïißÂôñ˜Ðâ1x?”UÃ1ž÷¼'`öÛŠ86ô wÐÅwûÞl"’éˆPžpx»Ûñw¸È}¬y¡„È®K9o|ð¼ñ©zfc(B:ÏðÚàLÍ[L -ex§Úxž@œÇc/kÒ.-+Ó.IÁr,Í@ȳ6'Ç¸ì™ â2ǘ„);\¾˜~{îEfÁw®M`ˆh …¦yh'Æ*Œ½:žHHÓ$…>á'X* ÈV¬b:}ij6x³gEáH‘‚ôf²’|Aõcà ]#ùúH¦NeHNÄÝ 'Fì*xtA¢ÓöéQl™•ýO±YÉΆÇ6¯£çL•Vö¶ïS,x¦Z ,›{EZV¼}y­ˆ"&—®<ä°x‡Ï86A¦ZgÁž»à|‹_Îk0©_˜" én2<«ç}©2œ¶DiÃÂκ”çIêߪvâ¹8ýÚš1ªȽÊFˆƒwÚƒ$ö©¹*$–Ú ålËA’6ÊPI’oŒ2Wšï"&–6sB#†*CÒ@Qï<„͹´o×.¾4oú¡UþÉbÔôðËC‘ï4§Xä‡ R⌭z6µ{Âò2ìj"¹èð{°‰“±3…cÇ<%ÁûÙŠA½& ³Ù¼fˆfl¾«?-îÆòWòrH€bMÇ‘V)²{È_»‡ü•Á˾v¸òò·‡üW½‡üí!^¬ÚCþhûÙCþö¿uÎß·)é2{Èßò—„}<%ª¦æÖKy·ª+!Ö{(|˜ns¬‘¡e ùŽÒ™·NÇOv«òFhöpñ³í7Ð{·ü³ßÀ ÞÀ•Цá’kLKŽÚp¯6%,Ýuîâ•L`aÝ<‹Í –|ÇÓ5d¬é¤:ù믈6!4o&/¾{Ù‚âI÷˜ý”˜ýœYb÷c¢=¡aFÜ_ Øq Nï‰V‹€'žÞÃ!E?T ó`%%:o5X<>ȱ$ ïlN¹hž°BŒLx×wÊ1"k¥Ù */f1¬eÝKn‚ŸìT~3T~=ÂÌ#.àÝd‰ŽLIõ O®ò°E M–ä¸x “7æ­[2÷²Àâô— úÈÂécßj[Æ '1r@8Ý¢[ÞÁó§d椞àNŒ´„E»‡AáîV Ñ„pÌ­Z}›3ÚtÍi毇AñÛ?üvø\¬B%ÂåÓ^â²¹YªéÄž{ë‘bp=¸1+/.%!é×ø±Ã˜Øä³Ž÷G.—ÆØ°Sè úÌ{µ—wû—i“êŠsîGë#†×³›AoíA|–ÆÿñBºå™øØØÆ†fèσìó šŸÕ1ÁŒ€î/¾ Ù¦•%ª§@Qmk§ö®ç{Qj?P’0‡¶fÒ’V…s7Kn2z-˜¶)ÿ*œäIõ[-°ðPöÇ,f#Ÿ³±ÂÃÍÂS=ˆKHhs9n,µ’| ï-FAPbÔE'Ÿ1‚.‡Ë……¤M{ñ$Ó_ø†cô¿cÔ¸€²,×ZCQÃ(yÆë)¤9˜å½’4sZ‡ ûÛe‹›„°pÚ‹çDZ'ŒZ”¦Ç½¤Êó€^këÂÉ’UŽwY æB«ÝêjP¿a™ÙŽ`ƒ9œófåµ`ÖŠuüs !èáÍ'Ðt’6u0þa‘#±Sê†D¨©­‚`'ù6óʈáBNŒÆCy_ÖÒœätùy?X·ù£F¸hÇlÈrë#Ð _>­8fY}×*©J^Ç) ÅàpD<^ßÓËÛu,˜„¤(£´r§õAžvuÞ”4>HÅúÛ?ÜÃyZ‚%ªDqJ>BD¥ ƒ#HÅœ1oò9—%0ÚDa¨‡WŒ"EG•%wÊ~S"â½n5ùÂÍñëñv1n«×!¡XI!8/SbËè~e §9yU¢ñc#a¸eõŠFìr‹ÜSàcb|¾Š¬¦Â€²ŽŽ‚•êÅÞËSPÉ«Œ3 (O ©h»ÓºŠÓšÄë·çQÎcå0”¯‹]6À‘E® 3˜°™I‚a &š“"ûe &¢Ä«­ERÒQÎ*h¦×¶Â……¼²Msr¤õ¨„€´2ý ³ŠqæÐcr·rX‚xbí6"£#B¢¯ˆ8Н¿8ÿ´(LŠX_HP°tÕʰÌ„²†µ†Â®ºi&«Õ—¢rb+2¦r°aѽ:…|±áXz©[ÙN_6¡Yz2™î¬'œ0†½c4Æ€pÜãõØŒ®æ9G´0¿¹†ª1®‰7›º"]Ãm7”A7¨óK³ÁµyÆÀU_kÕÙ³ÍI-.tLÒLßHÃOìëÀº¦g¡Å’xʯ½S¡»þ¡Œ®etßjLÌ¡ÉIÆ$Âz±] }Òo@þK„$!GL”þCuòÄŠ"KlmxüÝC¦¬ì ±Ê´UO±"X#4ç,þ˲ªm ¯ÇÛ¹#镲¸ˆ‡,Et«ÃÂf¸é?m£H©«J5×(Áûëþ²ˆŽÊ•ò*Õ(ÑýÚy*‹Ü¹9e–’ÃÁ߇³£0Aœ®×áQ´#v̤ §mâtJ\‹Vh§ô"ux$Twö¤‡bàêÎkû©s—‚;˜»TÍ8k/)J÷³Ì=«6ÐemÄ—.¥O!©× †"¦/„¾[Õº¹QnÆ ü„€c¢ƒcà~<½q…v7Ü?JÀîgßO×8O·TÊNq:B‡1Ê~:È?ðN9ÄQ 昷(ñwÔaIVä9:¥ãìÞlÇØó~ªõ—1v¨Ý‹Ö£g`Þ”—;BŒõÈ\¸Ã¡K-©û#½o<ÇZ%©cO-‰‡Ò› S¼JO=Làùt9:o?ѼOMj'Ùܳ^_Áñ­¢[=oÒmÈ:Å6…÷SSÓ—\݃ÇV–U‹Ú%ÄtKj¸W5¡Z5-ï”`«J‡ôz§Ñ|jÅ­ÒñYÜ~Bϲ­)5j(é&®/2 ("ŠTPjé–T½¢X團o5j»¹>yòë‹Æ³–dš[Üâ[™ h­…ëd­4–%ƽRBqJ[†kK¥µÂCY"ês‘ˆxÄÎ׉AxD7)¨DL\¦¯Ê-çjHR ­ÿ£™WÉ" ­´¸JLúŒuëçe©{„9’;œ¥¸pDì_¥ w÷† Õ* vòb«‹(³žPÚç¢ö«4``\['`-*ˆ(#jÚë,“”X§´Ôá_ 1+Y¤Ûôø"¶=ÄÈö [•$¤ ¥¦˜²TþN©šRÔ^:ܾ–·-I3—#kÝF)Ù|•Òœóôr©T,jKD^·Üæúw×#”›ð¶8"è{‘ªr߆Q-oq‚ˆ î Z¸Jú"RoSŒå÷rrdiDQ¸'£Çuhäj:rÅZIxtY —™‹PÅ—‰¨¶xgM[ØGb–\RkvРºß¾ˆÔRW..‹\Èe¼À‘~%ÕêN¬bÌãØzÂy¸Ò“—R¸°"šqä< uZ¾§Þ”ºa¦ñ£v¾7i'è2–)¶ºu+|§{›ênÒ ¯Zmß„oˆ+Ή+çSÖ°±ìÿ®å…´Vö9”ñ'ÜÉÕï’vûp%'îÝ# —ë Üæ:ÕjdÍï÷äLéÒ·–µ¬[f‰Œ;Ã\k7kŠ¡Û3ô>@ýÀBa&îðý‘ú˜§ø’²TÌYÁ´p½ˆÂÑ®M+GàZÝBÅG°¶¼¡æ”0ê,‰;åͦɕÌG˜VHQŽ„Ã96Q~Nuëåç<  X¹#¤l’Rûᘦt?@aº¸bu¹b2³Ò,“j¥øzÊ´ds Àj¸¬g/±…Ôó‡,ÂQcu;sP‰Óçq©%QIŸÓJ¼<¸ÇˆÆy%í^éq»›ÇºÝXÚJM3²„3Çäþc½Õ1ÖbÛ<%Ôù÷u ÙHƲKšø‹^°IO ì¹½Îo"é% UÊt­–”âø¶¤üð„.Suš$²Æ"b !`°R„»¬½ìRðhÝÌW¦=2¦dÿ¡-’çrV«gÞbyÂÊ#ŽŠ°ú½Q•G‡©hXíÙ¥8ÙÞ×ã.}=Æïãóx”ã1>`~|ùê9[)Ú+R|ò¢…wèz£gudã6–º©L5SK_Ñ^ÂZLó`Õ¨åðA6ε˜ÀÉu£—ó±ô“‰ ÑðaQPëºFM×̦oKïéᘎ™Ì8š7¼=—¶±¯ÈÒlmê$[ú¬‘ivø1¢ËÒ†öah^Üsb1{7k;_€¬;ýλ cø´ñ™B<0´Üƒ3Æ”æÇ´Ó£ë“Ö>mâ¿4?> endobj 8563 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8564 0 obj [ ] endobj 8561 0 obj << /Length 8562 0 R /Filter /FlateDecode >> stream xœí]Io举ׯÐ9@«EŠ)`0@ÚvÈ!€Ñrrz2 Òƒ8sÈߪ$UU“ú(ñq)©J6ÐvÍíñm|?þéË?Š_~/>>}ùOñuøùôåP•USõ_ÅñûÃõ\—5ïUZ–¼=~_¿Þ‹÷Ãëáµû÷ýÀšSÇáG×8NÑøû×ßûÉý'_žþÒýö¿‚îþ÷kñ·¿w?~Æ;þÁ·ƒn›ã/ÿîaœqÝýçú·cã¿ýCñ[·}÷øï%D#[´Ž÷sWvú¾îŠ&«Š¶®4c¼[§ìÀñß~îF;/£lcªªZ<ªâÇa•E«š‚ו5¨µ·eC±ÀXÅê(VĶÆ*¡ÜCQAÏX­zÐWm(ÄÆ¡‚A_ g ãŠXØÖÐ;†"ƒ^Ô¬ßf]‡nôm| ¸s1Øg€uùÑ©PtùA’9òí &<A¦?öµù°¯e"“°lÂ2#®Ô‚ØçÐ… ¾Pð’ÂIñm„)(MºÞi\ùL‘ZY±¼®ÇYŸ3Î*ùüí“B QGÃ<Ÿ‚¿9o^­b³{à˜wEÕ„)œ#Û KhÈ·B¬#纩l+áCí ŠÆ¡Z°QÃ:ju/&dYs͸¼>„^i“Ä僰¢ý>®PÈê+ÑŸVý¹5%gz’â®æë‘L•0L´8†‡}DmN²s¼4Q?£šê’iXo^`|vÔìá—ŸEÕ˜k5?ðI¼±`Ò z-¼5º÷àyâÇhâ8gŸÅr$´ÁèŠÄfŽ~u•ùD`"Y ÁÛò@¤ådOЧäì_6&ÿ‡ë¬­ƒ! ¦ÑCHŽÀÒ`÷ ¬h'äP¤hÍCÊ«C%D@Ùjco,Ú­aNçQíˆÙ£’¯Ù|ÇŒB¤·‡4µ?€Äà€mžgVzÎ \Þ@-ÓC†lZ_ «XBylËÁ£áÑ;Ž€–öQ[š"q)}BÐÃC]p,ÍRîT·Ê Ñ(ƒ»Û°%z”ów‰µFmÂÔ¢ ("ì¾QÃÆÂUˆ€q.¿ºõ¼h€§å‚<(<´u<È`ešâ7Ó«=(ÅÜ(ÞnY³æE¾Ä H,ým1‚™“÷5/¡°Ðãíã",–#…*-duÈj ……Øy¢ì<Àœd)í)M—º­¾¿Á We&ÇQ.-ØÒí Úªy°0 Ã\Å&CÌ€(ˆˆyâ'óP­S†géƒ;³* K÷2ùÝüU/ˆt©Jb—Øô…ÚFý4‡=¯®¹Iýt{^B&U7ÌXgTGX€E|›šÝ åÎê-ëù‰”ë$)-ŸÔ4„ž¹L;ýÈE’Zê©eÔ ]vð•>·‰|Ž¢¦ªZ5±AÙÒt¼c‹>8\!9I¬Ž˜'œ‹ƒÙMT¯Ü:žÊ€á…> ØÈÁÎæN0å&¡ö=€hCìÆ7Òô·}ÆÆì@» Å’f»[{:c¬”¢9‚l-Œ·ådreàâØzGŸäf!&[†G@F*ŠWq5ºÓ¼ÄÃ`†Bo+XpAS‰½Jâ%‡"%{üUçýï¹ö{®}Óíüö\û=×þ‡=×Þ½{®ýžk¥fLµÜ_®=ã•{®ýb_¾ì?ƹ Á¤=×~ϵ'J­¬X.F;FÆ\{Æ9{Þ{®}|µ˜å«±Ö­ónõ~åÐ0Ç%Ü:rrŽºªgWº×spay®zÛÄå$u#’ß ø†m,°Å¡óc€a5¨2p›vc §ÀQŽÑks´P4ž9)žG~ðùzKÙª«Ôç²°ërÄzøl± É#ó z·n¬°Éd£©Îié3fàà”ö„$É•6á‘·<Œ=:NÆ|+,;«“ä§€6Ë ’2baœºOL%yŽP%$&"$ÖΣÃ}¥Æ%Ùo9Ön;¹2ÍP èŠp×ßL»Ík Ô5J´kšÂkmZèvÃÒJ›°]OÆÎ^§-jÁ?‘—¨jL–èZeÞ?×™:p|ÂÐ ¼\Ø‚uƒEÀn.¿—D ɵÀ\/z>™íÅ—¶©^ÆÔî °¼Èļú„Œ!lwy=YŸä:J°¼u£!Üà|,sw.ÑU5%³W­Áí÷<€VxÑŒ‘{ͳH‰9wøwa´³*‡¦_J&¬#"M•Ë3ïˆâÇæï¸’1&Hèzv=q[(Qqq£ 7šÛQŤ@5áèÈ;ËÙ3+ºyð V£*«s¤Ä—¬ë¹%¥ÖÆ8R†Øšu¸R,÷í÷³ëfÙt³x|cÆŒ)[ãiˆÔ5=£Žûìò²±›‹£®ñ&-*[ö8Gq®Ø´{³ ¹MbòjJZS80æSÂ(½5t¨ºs!õíj[£dP$NlŠñ.À|¸h”ç°§’RñgׯôÆ NØåI°Ù 6Ÿ—›¢H ¿ÈS§+µ ñ(þoK‚ÌÁQcc‚|ÑhžIÄSd0eHR‰Øg:är?%;ØrU¢ôˆY£¼ŠåA“³Ks0”p¶‘þZÛ0>ªÊò7q³µœ±QKç‘TpBõKïv’·w¥Ä­ÆxEH“œÎófAƒ5uN=BÚ'.©!¡CËáÃŽÜB((À°Q—P¾Ça¶„FÝny0ö\bpÁF˜µ›²Ìãêó”ýÎü êªÿ2¹ÓTË(U”4Z8¡{†}ZØGŒÜ¯QlJ@ëR LÕDkYrëþ‡ça‡®O m’èÍU>qV•ý4"N¬m'L–=ç´D×<,—ý\éqÊDo[R‚õÊŽ!\~Gò¹‰x˜BV“ÿ桬Pnê>àÃû[Í[o!±àâyع¬ ÷0Œ9Ù²—#MÞ/ÏNÇ£:æ‹ëU{v\“̼ñÎF‚õøM×뉟7à/ ݈.””fúZ,¾½Dq z¼o»…=‚}ði'xà#Ãí²Õ³;[Q‚P@(ËaÅÊlH¸T„‚ªìPn–žÃöo1Qlpå-Ë!˜61˺¯Îi·ÉͽAË%ÀÃørEy¨Ç–ÇÓ£Zç]å8n¹@1À«Ëc¤#RØ•3;ÔÆ)æ _™=ÿ™gËC+}Âã=®¥!a’I46-¶‘2Ô Ñ&g¹V•EÔ1¶àì;uø•QJý¼Uߟ˜Îæ×g81Ÿ½k;@Öç’E Ÿ6>SˆƒžâÀiõØQ×§ê›.-•yÚCTúÔøðL1à“Ãó°§(§ uՔ쨀Ç>(1S-êš3FäŠÅëáÿÛlê endstream endobj 8562 0 obj 3445 endobj 8566 0 obj [615 /XYZ 40.7999999 486.739999 0] endobj 8567 0 obj [615 /XYZ 40.7999999 181.459999 0] endobj 8568 0 obj [615 /XYZ 40.7999999 486.739999 0] endobj 8569 0 obj [615 /XYZ 40.7999999 181.459999 0] endobj 8570 0 obj << /Type /Annot /Subtype /Link /Rect [438.239999 459.859999 471.839999 467.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps >> endobj 8565 0 obj << /Type /Page /Parent 2 0 R /Contents 8571 0 R /Resources 8573 0 R /Annots 8574 0 R /MediaBox [0 0 595 842] >> endobj 8573 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8574 0 obj [ 8570 0 R ] endobj 8571 0 obj << /Length 8572 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhćD ˜ñxäÀ°9³Ù ;‹8{ÈߺÅ~˜ÔG‘ŇÔî¶qOS¤Šdñ«b±ªøñ/Ïÿ¬~ù£úøðüŸê›þûð¼kê¦k¦Ÿjÿûáò ÞׂOUßÖ|ØÿTß¾ï^«×ÝÓîiü÷uǺCEýg,<¾bjðo¿ï>N/ßMߢÅäKÛ±»|¹Ë—RòÅßÄàxÔ_\Óö¬¨ðÚ›ø=ÚðÖÀÑ´ê4P¬`ñULDtâDæd5íë~hºhƒiKd&A@A[‡YÚÂÄ„˜YईOz‚€sÈŠÚ²lõ¸Ž¥è;X¬E£ÉdýG×)"ºîxäsCSǪõX8¨ÆïÙ´†›•xWda€uꈷE–ù`¢;°NEfkJI›¼Ç“«ÛC‡-ƒ…S[Íꦺþíàάgnm1gB%‰1ñ×s®i³jãd`'uYç pf>ÙçrpÕ7ÇS¡Û+Š•Aí ÓÆqÂXƒ¸^O•ëhY‹»"L€üð‚¶|=°–±aDñ—6.ìPŒÀïÓ›¥1%×’ôI·,tëwF¨Š™XcÙ=,w«,úeMjûÜü—Ýêxàv;¢ÛÑ6‰ãžL%¸ÎD÷(¦ßvÚËeŽ‚„­¼C¦ÂÖx ñ;@y¸yåxÔÈ-mu…Çß$ŸF7Ê„üëüœä”Ç­4$µÀâÒÉ%¼ ÆëaÑØë|ÖåÈ–Nw@³¬‡AžÓq'l¹§ Ã'd¶}†n¼%ÍXˆyBdˆ9Ó€á@½¥h[|`iœÔŒ™(/‡†€¡?à@³£ÅtÖF‚âkæ¿?ÆÃ·<Ž×àÃ^8j– I1ãÞd˜ƒÞM£Žç|ütÐL?æ8Í•{¤Z£„ê4¬3 :Z…× eÜÿŒZã󰦞°ôâ=zj©YœoÖÖÓt[¬öØ1 Öð{Ø¢š ͥ܎ÖZD5ëPkxÜôšÎ.+Eú·ƒ;N•}$–d—…`H°eyÄÈùë•F_)Ì×Dlc2üR4rp”C0ˆcðÛú–ç+r€½7@©Ø×cH :eæ—«RUäc‰ æðîdÇ…>&/Lst[dËqqö0gÈ9ê]õ^_õögcJ¢ 9ͯ'Î$²>V}sðzèñŸ<-fI]/°>åHöðñÃpã~#îó¥åVY½ #§òV¬êqTUè6€».’CÉm”pÀ–¬Ø%I"óñ•"¬ø.ÒWé™Îõ7”<¿èèe”;Ý ¹“6kÁ0_ÁNIþñ )§óÁy+’å•[ÒmOÉêzòNBßôèØÿ°,HpâŒZf°Žã.œm S­rO)S­1†6|&ÝÀ¤<– 1wäUMr§’^L$'9l,­iu_â¬Ù.LT»ï©£2м/ÝJæ…"Ú çÚ ‚ø, ê5Y·òë5¼Û–^s¦ç®×Põšó–ÞªgÖ£¶kë¹cL£ANEJ“›oÔ.‘Kå.*v‡e±«ý6ÃЛ° ÉÒuùÅî8 ‹Så*gÙ0)::!„”‡3IDr@ô…úÕ%)Üs’î¨H˜é Þ?È%JKâ•茸ÙDx•ŵ.?^Éæ”Ú1^]ƒko€÷PÂ;SÂ’+Å;_&,ë°Ëáã™6 ÛÍRHå)$-1–õ^.±ê¤åcKLŒ-–ra6IZþZO!£å†rÊߨ^+ÙÛÁ ËÁ{4ì|ÞÆ­::3æñÞË ZÚµwsÞw=ßG/HiË ‘:IõSÜqŠžÔ?#Ø»oo;9®~{£ƒ|{ãô&jeÞ·ooÔ‹dæ~B|w¢ã~ÂX´ʠ¯®¸(Á·*BÚÎÑ”£Ã uà}˜ î)¾×¿ÖqŒÎ W0s¡á±vP€ë@ÞI;ÖxDuìÀ÷`NÄȵ&³çú×Êf×zJ“òÌ—ºƒ"bG”Ä2êèMJË(ÉÔlÕ#t &$f/jé iƒöÞE&¾˜¦Ü9™vNÑcö)y‘)Á¹WÎ ï:‰ôÓI÷=å‰w»ÆsÏ匡xbwpÈ/}<ãž‘Ä*ʰNÁ¸O³‘ŸÅIˆrÿOŒ'V ¨‹´È„@%ìèbÙîpIHN Ða ŸyMù…Ô zCH•r&õPE0¸%u;æ¹ù¸¹S«- s‘¿£)• AUœ–Ô\zv½›mL.ù‡â3$:Г‚H©›çÌÞŽ#¸$°IÕˆNÍrkæC¥õ.;_)«wˆÇÍ–ä dÌÀè4 o 8¸»Ž°Å`JœÕftœ:ãŒYK WÉ]Ø61šñZ ‹89èdŽŠ{Üׇïу¹GžlB¾Rœ³…yè´!’wyÌÉ9%! À%xDpÊS`Ø€Î*Ž9! ŽÌ·˜/ n9˜6-ÀæJp:V܈AÇ:£´†ÁÏ^Mx ()v·"ŒRa e•ÀÖu÷^àÙvÌ.Ác€qÂ!”±Næ çÞý)—Ý5߀;'a å>‘øfpCÔôúÆCt‡«N—TâÐ7ZEÚSÆ@à8ä¾½™ûH÷=ô’M—àžbî£èÛXflƒ“D礨<—ó8þV¯ã„“±@ÿùöÝ1ƒöÔ7ç©rN¾³ê²oW탪f3ϱnºÙ±§;½µ²Ðuu7ošd=Œ¥qU«ù$Wj¦dÚ¤ QóÁ°ik+~[w“aè\¢à{zXg€u&uRñš7OSÈ̵6 çËo¾Àgµl¦‡_Q½Ñž+a¨z£VGÏXHß5m‡ÁuûϼeÇð>†gÏ)äí_áàƒÖª£U÷±N3Ks¶u®Š¹öáœb>À3‡ßÃ’ÌBß7]ÍöŽ“ÆtÀAט9Wraÿ{J‰ŠÕÓîÿ!xü endstream endobj 8572 0 obj 3495 endobj 8576 0 obj [616 /XYZ 40.7999999 406.099999 0] endobj 8577 0 obj [616 /XYZ 40.7999999 100.819999 0] endobj 8578 0 obj [616 /XYZ 40.7999999 100.819999 0] endobj 8579 0 obj [616 /XYZ 40.7999999 406.099999 0] endobj 8575 0 obj << /Type /Page /Parent 2 0 R /Contents 8580 0 R /Resources 8582 0 R /Annots 8583 0 R /MediaBox [0 0 595 842] >> endobj 8582 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8583 0 obj [ ] endobj 8580 0 obj << /Length 8581 0 R /Filter /FlateDecode >> stream xœí]Ýoä¶ß¿BÏNÇoI@ ¶ÏúPÀ8}(ú\’A/¨“‡üûÕZÒzOÜ߬8Q’m8ûÌ%9œÎ‡Ãýücñï?Š·ŸÿW|éÞ~>¨RÕ}Çïç0uiM÷kUûÒ4ǯâË×ÃSñtx8<´ÿ>txîØÿh‡)ºÿøòÛác7ù¡ûËçÛ¿·¿ýY˜âoíÿ~-þù¯öÇOýxÇ|=ÔM8þòßîm´©ÛÿœÿvlüÏá)~kA¨ŸÇ=þû¡r•ª]= ާSWýü}ÞM¦ŠÆÚÚ‡BkÓÂé[tüþóá—v´eã´®BÛgò¨•9]4U(*ï¢A£µMJÏȵ_"=C¤ç-M+WÑCqQï\ã»eZ;cÃPs ¦¢a ‘ž·´õÄPlÔWí>:.ÓÖjîB‡¡æbÌ«Vü‰ þ‘ž·´õx(.ê[áÕ-³%êL„ #ÍÆ¼ Vf #DzÖÊzÄG#=ˆh"󢉞ˆŽ7‡÷ÚÙú¨xiyÖÞÝÇv±¾øpÔH-í*¾SJ»ï‹Ç_Mé[ùNÝ_kQ ìs“>šµ¨ÅÁ>B î!·pž:}¥ ÷1› °EÃÑ Þ4€ƒQ<Ï]zÍÀ(¦æ*‚{94Å8€ü¦ löSúþ1>¬•BØ ÜÛ;œõøPcîåPr/Áo¢+Å{NV")HSŽD²; -c Ô¸†u‰…TÀzë,G5æÜ‚e/ìÃÁµíøàÓck­,n{ÔÍ Ûƒe¯`j14%!ñ<˜“Þ9VÙ&÷5ªžÁIö.#¤­?χ[ÆKÊbŽ]OXïP·(È=Ä®Ãë©Ò[8r•°$ðz°îÇ-P&a\cúà–-[`Sr<¦)æÂ΂80X^b`_[m»Üs˜ DKNáÂ»Û K‚!o ?PTâ,Qp ¶ ¼mY¦Éâ KHܲuo¢ >³7Á±¬Ö&Z.Ó®ÍeŽWªô>DDŽ)ƒ^˜…|@@€uޥЯ“ ýñÊ¢Q²»‘³ÅšrOífHÈŒ^²kg{—åÓ-°<41f N':`ùˈ}`ýHxN ¹HXtøœK%<Ö¶ ذÖøäs6¶0v°¦áèT|>)k'a*`}WJĤ%ÖƒcP*r0JØœhC’*Lµ >`ìz–½Ì¡¶hŒ’àÌ;;x—0Ω9§ø²ÜËÙ%x¥X2„í ö‚Ì<šÇ*©†ÓN‹áÁgXós¼iÎi甀×ÄüÏД„Ÿ½vŽÿ°á¨:nÙDäΩfÎIl®Dއ¸ñ˜é1ûwæ…Ï@D%B.:æô¦µsú”Ó×Þ¯1k3D€dý~ƒ#̘›9¾#~Ȳd9Ù­oÆö챓…c>ÅÇdswEGãx$x=9õ›±zËBtaËZøœ Æçµ¬9Yúû´¬…=Ñ|ê¬;Ð/dG®¿kßÔIŽ Ùsµ±ýÂ9máD#9V™ö½ðÉõÖ¥H='Bc××ãŒ|P‡µõ꼌­H|Rë„°Øqf2žcc”ã/Šf¯¬Ï!²Ò.§Fµ*{ìMÔšbåæÄ¯™•«½ñ›u¹³]÷ywŽw9y1ì%‹ÎÖC •ˆàd„Ç©e"dœL"ž)šóBXdx?qrQ°…‰=,Ž&þAŠ_À,NuÌR B±72|iM­På{aïdUðáÛ¾]• 0€+]×p¶øOù6‹7õÕͲi÷eõ0äUw÷’¹ƒ7 Vr8ý‡“zÉ)Õ)‡·8ã@(©Ã¡)lÁ 29Õ•wÕ"Ëqpà0—‹¼ÈÎÈCǶCG|!3Ë—<®ýf(l!M²]ýË+¥³P8¨Áé2AjÖvÊæÒ”&tS†Á{2'1¦º¯ ÆGÔ2‘•µNû4¨Ooäh[Vº®¾1};ƒ².µô·;BiŸ íó>âÕªììèÈл4š‚}loÒ›±YNô¹gà A}^n«D-Á†q@`´éÝ Û¨ÑhjvˆÑðJ1å0®1:á¢}Ùyi“°ƒ© 9Q‹Åz®x •ºîEšÈ5È­Œ|Sw×/ÑÛÂ4äò…{}pIý¡GöÙ'tt!hÑ*ð }rf=¦Üdõä×fvnâá#X±Ï1~5ÆÐ—añ@L“ºÇ|¿UÔd)@¤ˆKâ¾åˆuÂùâãá¯bž ZôÑzÌŒ0þ?€ÑxámrøÑ{²0w$ 퓌Q 1(úù–Ô µ)†Ä«¹*b|(·X¤‹8qÎF›®¢u´LÇXÔÜŒ·`¤ûÁÊ:2Îvk´Ó!ð6B GŽÕ–W)ÆHÆÐvå—Éíw¢·:·|KïpN¯8F}-NÕ‚rœ€¤ì­uF}§'ïŒê¹2dªWO4Áy°taá ÷1dASƉ±ð®çTï˵·3U`ÉN•‘kwÛóX Õ„¬‘]jñ\™çDaÎëœL4Æ14† KUÙ›Ä YŒrl8™MœÛñªfÎ ¿l/eßûå¾}ÖÅw² I [£2s6Y“©¶ç~ë"Ôz‚6Yc÷ù¶ެï?ìó¥²÷÷È(2{#B+%êoCBšSí±ŒÉu8%C¾Çl…c¶¬}ÏyO&SŒfÕceã:X7q^5”­šõ³ŽÙæzÙ%ó;žy´D}JµÕ^¶j¶9õµ!íYÖjVmN.ÑJȬU²Õ†eµ'š{­r™”Äç@-{*¼~•æ Ÿèà·?_i­¾,Ú¨Q§Ê•oç䈱79zŠõjÆÁêoš Ì!Œ÷~ÞÏÈ^á–»¤©ð;ˆ¢»$çydcæTúXÿ­fϨ=!LáŒqÑÆªdŒ‹6õpfývêTïÚòLÃΆ³5³eÜa*p^¹Æ’}u Ÿ±Zøó¼3èÈÉu„ò›ãép¤Ð«³“ _²<ª]â€ÈCx38x;>ÐÆ-v¯ôœÊÖ¹^âäýópªà‹úd×e”kÙ¨f$ 0ð×-®"Kd?.®·lhÆÒˆSº[J‘˜Àêò÷õðUBMQÙ×^YÉÒ„ÊÊ’2G&6Á¨½«hÐt‰BÈplEq,§›`æî*Ÿbˆ°S*‹Xh Ëz3áÁ-'È•œÇæódká\xü«g²®k¾µÄZ¡C{Ö5WÎEhŒWqÞ)\rÂå%d/i¿UåkJ3\[Áé„fÉwÁÆwÚ ÷R³Ò/yÓ ä^þ °~õª#Ü…—¿ˆ×¨ðMUo를 †ßÐÂïTqæÁïaá·­ðËRðÝ­µ;¦ñ‚U®ì kO©J‹šG8Q@Šãxáx|¢Ž:vd£§žXoo$„Ó"Ç9ᥜñ‹G„¿<=Ž˜rÌ’ðvÏ+}Gg‘ì+VX]"WíúÁÖêO¡%pGB((Aîdx…ªs¿ˆ}Î1±¤ªkziQcj÷·¨.iŠùSÏ£oE¨P×*”ú肎È‘ÞkK-gÎÔƒ¤T,ÿ.¼· endstream endobj 8581 0 obj 3271 endobj 8585 0 obj [617 /XYZ 40.7999999 363.859999 0] endobj 8586 0 obj [617 /XYZ 40.7999999 363.859999 0] endobj 8584 0 obj << /Type /Page /Parent 2 0 R /Contents 8587 0 R /Resources 8589 0 R /Annots 8590 0 R /MediaBox [0 0 595 842] >> endobj 8589 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8590 0 obj [ ] endobj 8587 0 obj << /Length 8588 0 R /Filter /FlateDecode >> stream xœí][ã¶~÷¯ÐsÕòN d.[ ;@Š>›¤EÐ :ÉCþ~%“’½¢>Ú¦84-s{|ÌÃÃÃsçEÿúùÇæß4?ÿ¯ùâ^?ïHK±?ÍðûáøfZÎì[md˺á§ùòu÷Ö¼í^v/ýß·Uû†î¥Ž]X„|ùm÷Ñv¾³Ÿ|~ü{ÿîφ5ëÿûµùç¿ú—Ÿ¾á _w¦SÛÿÚ7”QfúŽß Àÿìþñ—æ·ž³Ç;üý …aV«èx›šÒýïqSÔi:.¹f ¥¬§SöìøýçÝ/=¶‰Œ¶”j%49k¯G+ˆj†:éáô†v&º‘ìE" ¢"ºjd”ÄÍw)i"¾˜V³K ™h%MÄwˆ)šïªK%ï#¦ÕìÒ]"y(JÃwˆ)šïFX)e½]9ÌÕZ~)¢LÆÑuC9QŲ^QÚÙaR±–cªµˆgi ÑuCs¬ Šf=—Ž_’­è„j-"IÓ˜›=EtÝÐFÖcTѬ—¬Kcè'L«ÖK}¢)d]C1Eó]i‘Jä'Tk–&²ÙS”Hä1ªhÖáøEÖsL$b}— Ñ@]7´‘õª—$y;äyo†¯»ŸÌÓ¾þÒ“1€?ؗׯ;Ñÿ3${¦‡þÔ|×gÇüûæõ×j5ZÚLÚB(ÙCLk:¢˜<†Ð=Dö ¶¡ß@ȧ=D·¤ã3lbÎùê#„t{ÈókÏÑuü¡‚#i¹g‘àëUˆ}¯]+çô°AÜè ntK؆+¡¤:Â4‚äâ#° äÊ Ä@l¸MÒ™ãR9E5–ƒ'ˆíùò9e—χ´ñœ6@š±WÌ_8ºÀlAmJ«µ¹ Ù,dŒ Àò“6`kÞ{¬YQ…– ÓVímf{«unÎß$$› €Vèúö–KØŽ'à«¡nή§õzXð,`©Šð1v½úÐíùÐðœBIÌáOÔh$§ãÐF1ÒJÎ*1vE+,•ÞÄê-Nï>€Ugö°jB^}ÇòI¾ñ€FáÓCͧH#6jIî§$p,!8²Æ³)®NeŠ9p¢Ôlé„R„½ÖêÔÖ ªÚž-9¿M‹°o÷eñËœU• ¹Í*XÉ¿ÖÔ"%¤ÖÔª¿+Œ¹OÉÕ6¥§QVX.Ú÷ز”¢––sß“f÷·ïikµ-œ£b¯ð-1±æ×öýùØÙ–Þ` J^•‰ò:‚2²0-L12– r} ™x/BÁ²faeÇ%×÷ XmߢÅWã¾´ºÒ’OŸEDµ#P‰>[òE¥±êÀxð­t a½ë°p£\D êñÚýÜ«Zré'@î'¢4‡ÓjŽ7æJ)«­Ù¦­éN¤ÕÖ¤ŽkKûÕÖT[³Q[ÃÈýª¸~\ƒËë§}¤½¥[!¼¤UmÀ Ú€ÞtK€)kÔôˆ ‰LbÄÕƒXF‰VË„¥mÓ¡6N-(iå¾âu4½¢Z¾/Q-*æ¼§~KØž!c³‚lZá®7?)ÏÁÕÏ)` öó ÑæÌ •­­í3RÜOº‚`®r"皨•ü¶ êôúð¸BçÀpñSÚâ ªša¥£„û÷ÝCˆ‡„Ù˜ÒV õÍuúDB$óñ9gð°ˆ@Èx¶ã9Üs²ºT¢Æm<ôÆ ¼÷pð«þ”_ÀhOR"Ü÷°úm9”[¯­'æ|%x†2‰ŸÓŠgüƒH.áøù\ 0„œf½?à§ù7.Ðm¯» ôÅ“[ÌùÇw7àŸYpŸ¼çÙ‚A>aqÃÓ¥ù|žz4(ÁFK3Ɔ!'ûJÌ­€»@÷O‹³'´Oc1ÀŒ÷U—,-P&¥h… ÷]3TýK,öë›B€7ãq3Éã8Ž4ÎçÉå†2{´P~œö޾£sßà©'!Pî<¿,dª‘œØæÁùT㈭ç±Ãx›‡÷ ÷ÀWáŽ1mOýÒWæò ‡Ã=Q‹ -ðŒ1ø\2Dc–š,ïÆ}-µE†× b®Æ„WVªŽ°Ÿ´µÂÕ³\Û£¶<ã~p…¯öá-Üi©Æ’³ÎeSÀòi  ô$=lA9þ‚õkmÆõ(ÁO;ŠóXJ±Ä]½#íeÆIXmíÙ6é´¨çýFì¹ ŒÒØšÔɈKØÛÁ‹Äpœañ±ÝÁ;DWáa»ƒ%φ`ËÛ8^çñ9¢;ÉùćT"ÖåDt¸ü¤J_ÞˆgZ€‘$låôÏ1Ö*&JŠ¢ {Ç«çÂQùæct3^2ÄŸòõ*ÕVEbNáD<̧ÖK’S}WõiÖÔK²eÓpoåõ³é\Yn +Œ‰Iñù¬Ö;FseúQYaDdTÆ~qE¦^“ùþ+bJŠ9Û¼Í NDÏZÉaóðaf¸>XóVÓæ+c.È^hëÓC^¬ktÉô@OmÞQ4ši.p•QDTsZ<Æßàs1Q<öú1,#JÔÓ5ŠQÕ´›äïó½êz©ºF’ |>õúR^Wü"õ¹®øÕ¿ ¤®¹ä]ñÓJœä|]ñ»+éË?¾B’êŠ_P3êŠß;H¬!ÓÚ[Æ?£ï°Ærõ¿Z}¹Nõ¥ÿmÞzµéUbø‚{ùò5 G¾’ƒ¾U0ØôtÅ^5´Æ‚êòŽªÖÞ'ÀÉd¹…Z¥Z5? ä„@´–3žò0Ýêå£Çzb ç-ëþHÙ*[{>@4ìÇÀ6lcŽf-#ûkæb¸„Í:ÀãOžàwݽ…~Bm\Y| BÑ8Ü"ÉemÜŒ]2öã’ý ©Þ3Iõ·ª¸Ä?<§P\péµq¾oC,è!óÙv¡Ñ~8§XðÌá~èc’Y0†¨–GsgÓ™î,ãä‡c˘Ð*6/»ÿäÅwæ endstream endobj 8588 0 obj 2751 endobj 8592 0 obj [618 /XYZ 40.7999999 607.699999 0] endobj 8593 0 obj [618 /XYZ 32.1599999 231.379999 0] endobj 8594 0 obj [618 /XYZ 40.7999999 607.699999 0] endobj 8595 0 obj [618 /XYZ 33.1199999 229.459999 0] endobj 8591 0 obj << /Type /Page /Parent 2 0 R /Contents 8596 0 R /Resources 8598 0 R /Annots 8599 0 R /MediaBox [0 0 595 842] >> endobj 8598 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8599 0 obj [ ] endobj 8596 0 obj << /Length 8597 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€•EŠ) `{fäÀ°‚o6Á"»ˆ³‡üý¨[Tw›ÔWK$[=­À3µø(Ö»>’ïþøùï‡þvx÷ñó_íÏŸŸêªîêñëpüþáúÒTÕ¦­dü:|ýåéÛáÛÓ§§OÿߞDwzÑþN]Œ þöõ×§wcçOã_>üóðÛÿòð§á?þú·áǶ½ã~y2}wüåßã/B i†ÿ\ÿv|ø¯§¿üîðë0sj÷øïZõ­¨Õªq|;¿*Nßׯ¢ÎêCßtƘƒrg;ã¿ÿxúihí<ŒªWBèNézq«ZžšUêÐëî já5êÍmaSkêS5t‘X7µá‡¦›b“¾ïÛqšB­¦ØÔÔʆ´¨M¢5F$ÖMm"=nŠKz-¤NDúKSk’ªN´†ÃˆÒžhª2ý‚¿/éhà¶ÆÔzèåø™l…Í %OÔlõJrž[Z».FÖi8å4"±jfv}qKlºË¶?MrÙµä²-­&WÓ6‰p‘X5³‰înKŸ’8òâh|#^üðåéÝ«P9úU_~rrÎÆ_†É¶‡Žj·–‡/?~_×Býáðåç§¾j•ÐŽÞ\艂OdžÔ¯°ŸðI Ÿt° Gý¾ŸHø¤Á#À3…ïøî§ðIçû©ñ*à™šxºaêà•k^âyÏT¶°ØZ3òõË—Aš³Ë¦S¯Ï©zE]nɩˡk»#S™Êôu'ÛkROÚ!²3âû'#ëèªö–gdDU©ñ'ÚsýŒ g.|1Ò^]>1²U«:34ì ²YÐ]Ñ«n^á,ðüÆFºJ ³tæhŒ%xK×ClçÏCù¾5¡=žá(︬ójh“Ô_XÛ>¨©‰™b}ŒG ãßi>ä¾ÁAâ{œuļLôñߘ“ÊY]Ÿ¾‹I´Æ |1¿’£­ð| —ŠßÁÒÍâr¨—¸rİï5v)ÿ5±À«©ƒ-ÃKm±EM«…¶àÙêÚLnf:Ï6Ü«èÎs}Ÿ‡Ѧ¿yLS3…º¢[-"jäP¯Ö<˜C0bÍÐ"„”ଠ‘Ý–A`]Ž¥R´”ulðú$ TRO¯Ü[‹ŽXù%<È!„d%`¶LëmD¢B÷+"¥û̧õÑ–™Ûç‹&~Ømè¶m(æD¢F³[ž/U ÚD,-ús&?e•¨ŸëRv§.¥žÒ‹ò¼Øõø5ÃnÞ“qáT¥[ç‰ä¼ÓÃwzôŽ ºŽu£qåfËmͪĶ’]ëÔ©FE!êj|à©Þ®jNu2ߘ™JÙ‚‘«`gžàùXã<7 çƒGýŸt꼦bמ,jêF4ß릙* %®h§ÚÞåÉ{;5¯ÜY_ØÈ-?Ž‹xU©ôŠŒû‡Ö®®_'ÔîGüè¸Ü3J«{çfa,“z¥Kœæñ;^ó–å4±{„õ)ßõÖÀQšE vsv»µ+=ÖIœ¼†ýy³À+Œt9M¬ñ6^Ã3÷é¹|-ŽXê5ðæ Ç*½~—‹RÄ»;DBØ<ÊãáåƒÔcÉH rš—¾wì‹õ¾Ñ|‚ª°T(þ¨Çšaí‡YÓ…æÄhÝn7ËÕá*‘˜œ_£¹” Ö³›Ûˆ­Íy)õž–ÏGõ°bÀÖË)Ô‹ûÄzY!Z9ñlÖ¸+üb=þAhŽšWU%ê/£-éÛÖµ%¼µ,m÷ è‰µƒ)®<£ØJ!Ò6åÅÙWFN²OXu\{.”Ë-VJ[ÁaäX9Ø çŨx`Þ!ª XNuJL‚n¸"ÅáD݈:–9̽ÕÁÓ´+b }M u°æS¬Ñ"9æˆ`?éYLVÊ rÊÅøTP™Ñ5Ôr\^3íÔ³µQQWßG–ÁÌóÔXþö&“$“KçG½ÐÝ •d¸Ïœà:YœAè 9„CñyF¾—Êcü”ÁrÿwG…”x˸„·„yr{¬òŽ!Ý@”Ð%!Q¦´ NH–)¬)±¤±#ØZ¬É2FTñ"Ì•Whĉ ŽMØ~•2nXaúc]žýg寣s«¿~ˆn=?„çô¿kÄ2ZRŠ^}íÒ+Íe¤Š©û w–DïFس[¡{òJ}RD”ß195"\²÷¦a`–+Þ´¿ÐÀÕüF8%¨";Fõ¥jñ}¯¥’&•Ðñ¤Äïç–ß©Ü>“è¹í——=7oM —ð¥"4>Ç«ÃOÖh(¨BbœcÜÈ3ß)cHÒ–â½O$‰"¼tNÈa–9y½àËš4ÁÛ èÈ1‹‹HÐðÕxFsÓjÏÄáÐ2Â'ádÌ"p¶P»{qæd+Sº\Âú0w¡äb`y}Ø£ìC½¤ZóÝH×\6ÛxÅF¦%f VÀ)o¶ÃyÕåtÂ21R¢ÄÄ“$â»õnNßs)Ÿ¿¤¬äÍé’x=Õ*Ûëãà´n”œ³ àÉÇA}Úë_êT´-câvä5Ó7Š|‹ã{§eÆø)嘰B¾)3ÑCqn¿Á%OMkyŠŒØpVPwO5ýí€ÿnSU–F»B¶É*|#:wœ÷‘ÀkšÖøÃi2mr¼5úY5·`ej—Ánˆ ™6Åç‘ÓìÈB²`-îB’‘Ñ;ã¤7ŠRY#{+Ї›æÚ˜“n®Ô²èdì’fØóZÎ~‚ò\DGÕ¡c²³Ð±©q)QdàâÓåP©„¶žK|Uæœ0·¦v(¶²ÏOî§ÿtÅVMp9pѾÔC·½T5ð(ç61OºàŸxð…ýÙÒF%åþ˜¼sf¨$ùGýÝ,ŒÏ©dífí‹–ÍãÍ–í_û®“Uú/í ŒI’yo”ÒwuªmÄr-o5IÐÀ96“'´Ü¤ú"o Ìò'¿¡1ª[nhÖxEœµ niáì&Z°•ey6O«o—iµ<žå`œï$ÈL}»¼ÁNYž`*É1ž1ûG8ØïÝ9|ÎËÀ/·ö®ˆsÊë l—¶dw‘Û$z\¼±;t ´;uïä³C¡¤æÂÉ$¸'ˆ_m¦Âc-œˆ?Y¥ˆ’l½ÆýqœÁîÁ ¹ÓJ8VE̤ٙW¤£b²·eÐDññJÞz¾‘ÚY âRÊ›rÆçÚõ]Âîß=ÁIîô³ç—L'Iè–S3…ð—ûŸ——ëüB“B舄œ#œ¢^©­ÜyNCŒˆˆ·s•´z)`p-ªª;_ZSØÞFmV,s)¯¥Hs΢ã͆Œyã­¿-Þ&zó-à¸5¼»o™Vøjð Ó`¿8‡¼êïYålÖÅý`-çúœæ.·ès®TÇý´xƒ<ÖÑ Z—’m|hˆÂº ¯)–SŽÞIj‘9ë#±,`ùaAqpЖý∤´G•`ºa=ˆŸà•Kz”ŒÂ4à°‚*¾.!YX~ ïòÃð0Zìa`?R‡à7Lìea fÐÏ”åÉ0t/GæˆCκ— 5öñ|J‘„½…¤Ö„S2S¡Ï½>—ëUŸw•=ÎQ|%WUKäÌÄóµI/g?œ0µd>íõïQ!»¨úéǻ¾V€Ý ÕÌ9@@¯ùFà„ oFà/[‹IÔ1WÔ\‰8,yS¯nQÒ8Ï%BÜw­]ð7{%~¯Ä3i°Wâ÷J<½r{%¾\%~wH½¹å'2Î; 䯘U‡ÍìX€ p|²cv,͉;`Ç0uïŽ`ê pôq̱_¾¿R `S‘¼Wsjözv1vÙë=S¦×UXוAçÊÙõGzç#–´âò—铦jÆT±k¬×›¨S&ÜuæÞE£«ìM£‹Þy [?bÍLûVÄ¥WÐíáÅ?ÂTîU©~‡£Æ}Õ›S®t^V¼ÀÁaòwˆ”ÖÛYŸpœõ)©§yQã¬Ô bNÃD𚵃SÞÒÍŒ vh}ä9²x­Ì0.^™ìWŠŒx"#Ä”ôÆ×þ€†åÌ¥·iÛ-­‰0€#ÉõVË ¢þ˜×i¬€M½°Ìa ÆÒÈ(»º ä87pFðhÚ2®‡K¶¸ Ï(‹²ŠÓŒb; Â\…WÒ .tº‘ÍTD´uÝ™„‘†àÄŠ›J½W=/;ª‡VoußàU«{nÃk ¶—B+Ï(±ü€`˜æ§•Âu©5¶,•«鈺 #!àÓ(Ež+´«Àe´c0©“C\w‚÷ü`Ì)F–b‡…±/@fßÜÕ³"–ºªm„ pbDªG6œ½ÇžLº±˜“£ZSŠÀZƒX~ ǾÕ8FA že>CŸá@ &Dʸœ-mˆL„”¢Üš4bÚûÂJhìÖŒÅ}8\} À<´¯³ ÿŸSþg­I•Ÿ?UÑ\²˜°êê{ÝØÕXŽûØté=|%æ8/FÆek¡OLºâ¨Ä&áæJœP`|w k §wV$"ôÁ÷ÅÒ¸¯_’‹ÇŠÊ²Ô #TŠÆ\8kuCp‹RÂU nÉ‹vÊÀàäF#ŽŸÜîbÝ*mìAT±î½ÃtL5 ùa@B*0Q®3€9‚K€‰ÉŠcl]UaÀ®ˆø%Ɉj"#X Bçø†!Ëxébb-¬Ã'ßz™Ò±P¼u?qäð}ø6°Þi;b}°?¾þBð¢ÏÄõ…‰?‘lL¾Þ>ÜÄ0¯ hzÑU' šú,£î뺪›·Ç½ªÀºJ]éyd€žy2rIÓT²wtu–Ûª—ÖÕsýøNßYZËJÖ§àâòälmd ë¿<ÃÏZ13ÃWôŽU4sOš‡„¸wìŠÅÌÝŽí$+¸îø»lÅt§¦À«×òxâƒÖ{ÇîÞmM2>Z°¶âq/±‚æøœO ?²PJêñ°´`Ž|3…+gCñ9·RIК±¦X* ½³bµ1Ç×>Ç{ú Ó+â&b´^Ï4Ø.y›¼ªW»ëWè3cê®Çý¬ŽbƒêËÆwsO®ŠŸRú‡OOÿ¬qä" endstream endobj 8597 0 obj 4589 endobj 8601 0 obj [619 /XYZ 32.1599999 512.659999 0] endobj 8602 0 obj [619 /XYZ 33.1199999 510.739999 0] endobj 8600 0 obj << /Type /Page /Parent 2 0 R /Contents 8603 0 R /Resources 8605 0 R /Annots 8606 0 R /MediaBox [0 0 595 842] >> endobj 8605 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8606 0 obj [ ] endobj 8603 0 obj << /Length 8604 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWè`5|‰¤€ Àö+@Ó@AÁl6Á"³Hgùû‘-ZîõQb‰¢$º¶Û´Èb½Y,?ýñËß‹þV|züòŸâ«{}ürb%Ó¬ý)ο?¼ÿ@ØRŠö­±U)êóOñõÛé­x;}>}nþ¾¸¾<è^šÆëm‡¿}ýõô©üÔ~òåñÏÍ»ÿ¢øSóß/Å_ÿÖ¼üäú;áÛÉÖúüæßí.¸°Í?ïßÿuúËïŠ_ì¥ßóßLÅŒboÝ£üòûþQ4+jiS碳jÐñßœ~nzëÀ(kŹÑʰɽqéVÚ¢6º¨+¯OojÓzâs;ªš’tt†ˆÏšgÊ{"ã]37I)çN³ëjnGFª4!âó¦vÅ<úFݤB}×ÕÜŽjnѰ(êqW¥Õ2P£/dÍX3ëfÈFU¦¢pÍL}Á¦fv&>»®æ¦ÖV§éè Ÿ75Gá@WdÔÙ2²”s J×ÕLŒ)Æ Oƒú3D|ÞÔ®¨÷ºúœÄ×7_ã-ðàÃëéÓK}ö«^nÀ¸8gíËë·“jþ9Û0—l®ñp÷>Ъýà Èí«¢?Ðêɨ`µˆ§éøT“aå} ôWn⥭™Õ{Xu˜çËU³8°üãW=DCˆdx ßø7ˆ°tTíüž_Ÿ'¾üâ”J°©Z nôÞAªËʰB-\£¡`oÏ°å ¶HØò››OüÖ=i‚ôh PX2øÌp[,lüOâr,M6Q¸|uÊmºs|Fašòx ÀöÇ¡ð‚¿=´*ÖëX1ÔXá|$–S$ÖH£Øêáq2ë·,–²bõvôÆ–[öésa{9–A ¹*Ü[Ë–-%Öƒx¬!!_lÆžÖÄXJ°•Xݺ4–S8ŽÀÞϘvI`FÂZ•–WÇQ‰v9´ÒˆHÁpn/½îUËÐØ )f…z¬??W‹@’Lš4 Lvâç!Ú Dy˜Pí7D٢̗ߡ˜ÕŒX§›>½À¸Þ0¸WL`„#˜ÞŸŒhúHêÏOh«Gá€ÀàiyDhA#‚ʘlÓƒØ^ðÓGôtñÇÀ#õ¶¤¨xÏBÀt^$=FÒ§kß4š%³n]fd—ÑþR‹ç>Ga¬S1©§ïÖLPêIô”M¡ýà3>QRp6IBzþ vÌ2íHîš?ÀÒ74[5«zfkŽS„Q°†»3L„Û‹{M"»ÖÑã-¡½.‹-ÿ8jª=,õ€Ïà=¼ @Š®Àgܞ‚òÌ•îãÝã”è܈e9…kÓ¢6‚ì5aââ@6!¨æB› ’]Tr˜ì‹ŽÙ§›ç5´>Á‚–MIü)ìTf"ÉVµp^VJŸŸžâU|'‹ñ=É(§éÎÈ„EK„ïé‘1E¼éH7\&k3°&ó˜žØ÷:qÆ"štÎdB-«QÛŽ·Å°K‡7¶É-xkoq%ukÛÉ|ˆ 4©ÔÕ®’È(¾ÆU q{b”­W<BbSEñ`“¦Ví:$—9ƒË©x.lÈãTŠœ¡W\AHsÂc8ÿH»å7ø®>ª—¡è4¶öÛw‚®CD|ÞÛÀJ¹1I .œ4ÜòÆÒœ(é2ûsp³«I‘+Ü}ïaŒ/W#äbBd>KØcIaúŸ´÷eqÙGGÀ DDcQûÌÆq´v€,Fâ^1)RÄ–V]¼Ûî,ï±xgY¼[if,k³ÃK@¼ÐÃyÓ”hJò}n%ÅáÀdä¾JÏá¾#tt„ŽÂ|°‰ÐQcâgpù÷:²uLÎ: âÔêê°vl#vP“$ç-{*$í‰À‡gzP¼iožíxCçpí«ë4úêˆJ_vù‰`rÂB-å¡?‘"›|û»æKççÉžFÜó•!ˆóGj˜S’o ‚pðdBÜnFzÔB…š™÷ÙêÓmÅêÆÄ¡°›1ž×$f¡œ)G§F£Ö^–`:’Ò„(§¦ †ý#¬^ŠÄÅ{È^[ÖÛÚ³Ã8GX8òdÁx„DòaËI:h›Ý¬í1èï,n¢ÚB¨Á¤|GÓúLWì÷gÿþ“Aú&l?z_©û_iÑÍoŸ¸°—¥TWg® ‡.uuñ"< µ<zcð™—Ñ á‡`sVjuqƒnHpϘ«rÇÝK™t>;WÏÞ77}®KãRœÒ1emû8ðÐ¥<ú?"4a*ûÝRÁ!Ôr qàý=Á^#O'¬ (4¹îT>ʺiŸ4\"3ƒ©™º¦§¹¸øPØhNRŒ—ö==ñl¡ÄþÜÁ½$'S(Î6ÅݧÔB‰ÏŽ£¬Dü3@i³Ž"Ž3xº;¿iœÌO:"bžÖ¿\-,$%fû•bR£ó;—´¶o<—ôÀICÞ{m¨éÆ0Aç±óœôèCº#庚%Tð¢ØÀ$w<ÌH¿^ÚFÄéVªà㮦8Q)Ÿ ¶ü’CôÍþ%£}‚÷­ÔZ ILÓ 0nûZÖžÕµ&vL‰BO–(Îþ";LÇ50s’nbJ²zׇH±W“ÂÅX|̪¬aG¦ÃLI©Ÿ2ÁµvÔZÒŠ¾ÚŠ(û…K&DÄ5¦ë„ûШi÷o·l„#€%œŒÉEØdñšsñ‘Ó†R¼(·ªÀÞrÝSÃ'ˆ(Ý(õáðÍ2/ Þ'¢ÆngËÃc²wT?î$@Þ{¶Ì/y¨¥ëqja^Ä'à’öF¡žL–M1¿ÖŽò/æyÌÙ –iïÿÂÖ€rw †Ÿ[Ú0Þ$N¡¦È ádOà *>m‹“ÇðL ö5§œ fFáÙg åD_àœ3¶•x,é˜öø$ð†å™¢)’ð°-*!4pë´Lº&àÇf‚ à…bNÜ%Çcî ´$K› ×Ew¾ü)㨪;ïK¸y0`û kkÊœ¤Û)wÄÝ™×¶e¨Ië~¨û6ïÏi5.ûl¡x`˜+(kWdÕù¶+Ô™QçK&v­(•L:ÿÐì )I³cóN®h%öG¿“|‡vO > Ï>[öÇÀr¦({7™¸\áÕ}F;.U7jN;Þ%¬¿vÃñŠÃ&oêÃ&g´Éìì“w‰÷ݼ/cì8wÙro^A@Û4Jb.Ïé±tsz,ŠëÒ=‡µø"…iO¹è(¢²Øô¯.RùsI½¯d_ñcÚQJ cÛàUäJRêÍ+÷»Œ JQÙ;gÝ)czôŠ(QöâwáRjõ$­ú4ºvŠ‹ÑáêR”ÛØ×Ïp‚ÛXs›;vœ8ò…ÇÁ²‰ï§Çq`,«g œ÷³ºœ`Ë$*ãzزÜ9⹤)pƒ;¡Æé´AF­hÅÝÖ_Ê¥}±Ý#ŒãŠ´§â>‚.O\0iœ’¤})Õ±Í ì’ hg²jlu·1÷õý, áŒhay&Ù3A 7ŒŠÆò¼º·Єõf`‘¶S ëPôÆÁá°¬:Zßí)ÌåXGc]ƒW{øèY‘df—^_Ö•…½ÛJ`¹d&m^0%z¹Ë¬Ä@œ G/“f&`Ãv3SøNch«ûÞ˜r|ÒŒ¹"5“£ø=Z¶°Ž<ôí&ôm¦¼äCß®£o›ßâ­Q¬Ò<Á½|ýд¾Šf7ý9¨¤ƒŽjw« ÞLcèÚµšëò’PHvu¨ÝrAëR'¬Õªl1ãT˜ÒôÓ0Zö0-í²\ÊRÔ½twÁZUê6CâÖbà8>SÃgZ&0¢Lž›n-°·– +ý†¾ë²çfø‚žqTC-ÍÃe Å=ã(3wÛEfpÝù½¨º´Ž©i ù€cÊA>p íCi‹ñç®háÏñ½a~pjŸþ€Õêà endstream endobj 8604 0 obj 3444 endobj 8608 0 obj [620 /XYZ 40.7999999 481.939999 0] endobj 8609 0 obj [620 /XYZ 40.7999999 481.939999 0] endobj 8607 0 obj << /Type /Page /Parent 2 0 R /Contents 8610 0 R /Resources 8612 0 R /Annots 8613 0 R /MediaBox [0 0 595 842] >> endobj 8612 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8613 0 obj [ ] endobj 8610 0 obj << /Length 8611 0 R /Filter /FlateDecode >> stream xœí]ˎܺÝ÷Wô:€eñ¡ðø ‹† ddøæ&¸ˆ/2¹‹ü~Ô#õôXìC‰G¥’ºG`fxl]0"1¶ð¨þ¯#õl£,õ( ó £Uع¢è¬°¯Å-ƒ¼ÒçO¯4ùÙè±AÉ _Ö-.¤ÎŸZê¡|,2gkc‹Z~¡efM}u1ª,â÷Z÷E×}æ»G^Œ±ŽÑ£c4¤‹kïƒ-y9I“W!N@Gnñ„­°·Ü_KÄfÜ}›w‡!¯AIY=ç)`닱˶ì¹b|Žpµ°íÏÐ b›£vŒ¿M”—e©¡äˆˆñü2¼)*Kõåá$%“•Bxó_mntäî"6‚Ž4jî5O!‚ëLlXIRÊJ#,%r¬Y9=î³æìêÔË»hßêÌmócã:¶‡¸ê±Ž#P«cÅÞ²·l]ëC>ËÛjùˆÈc?D|°·HF7“m%š.œëÍdÿbºYE‰\hËPìÁ¢¼Q²zFY=‚ð;ì~ø½åv[„%2ÞÛÄ>x ˆLb&kUK'Ø¥^/õêsnÑú~ø×Mg4R†ÖØÞÝ¥ëÞr»RïîbæJV-žOG7Ëvyuž÷ËÞcÙ$Çîë=b½ ¶~,s¢¢eâl¹™µW‹ ‹ÚF7/Öá1Î׌ýºÒß+'0mâ={ËÞ²·èj,{ì7ÖÛûÍoØ îêsâú¼ZTXVÃØãÅ{ËÞ¢+‘‰z»DÞ%ò-Hdo—ÉÞtÍÓÕñioÙ[^W‹¬DöDhlqPyZ8.Çä©(Vïð^ÛfÙeÁÞ²·¼¶–ñ9ëLNŒÔžóÍ9<öì «Ê¢ü¡â•í »RîZ…­ f®6,•PX+|G ë×åÃö+GF³G§”ôƒ“Xh¾5Õ‚¢a@\¬. Qg.œp@, $P<2‹„ƃžÞ‰éŽí{þìÆý0}·‹å›‘ùÁ–w- ¾­~þ#ú& Rdý‰‚‘¸Ð!Uôqú2'TXL©uŠ·)®°¼/àÞàp¹ð´"f }âg&|Ã"¡!ÎKàDXSm;õRáüú,i™ð;8´QÁ&¼wáÚ÷9¾±Yû!œÞ¡ °ÂtÂì²é[g¾`õ*y ³¥U]ù´J‘®"´ít“gee~\ÔQ¨f´1æ-€œÁfL-»³x.Ù°6O0GHP^pytlÎÂ!M@ÞKpú†ÃÎ,?RÌõ?àjY0º"U½G÷YŠª‰óÀKx a<";zA,pÖÀ ex)1ˆNg™âñ„ÂT‘ïóè¯0nYši$½\ j†ˆ…¡F=ÆÙƒß3ꜘcQÈØR£fI¸äÁ#Ø` px\ '¨œ„ëdîoSåœZ30qAáQ•ð L kGñŠ™½Ÿíºß-ê~¦À–vcè‡6~‹eŠcÀJ¸‘jÜ“µ„V¢`Å: yIY¤Óƒj27…3¾‰x‹øxß‚,cJ7ä™Z€..ïÂØÌÄ1 þYºÔx¸^ÂÕ3'"$ÈÜ&™Á°å#棼.›˜1jG„·§y´®Ìå„¢6s0ßYI"Ik]›ÈøWF.ˆöEŸh;IC`îPLH…˜®C2ë ÝgyN]š2nÙ„.I)3ad¢&xS·w¿¥{J}gü …FõÑ4×ÐÈ–•çÛ«íó}y÷o8k-gبŠAË%÷uú3?ÓÀgžÑ¡[‘KKÇ uæ{º_z{@ïqQ‹…Ïà±åp漓íПb,zOÙUæš|ð léOK\X…À{¸ÌÏe¤úÄïk@¾¬Ç„Ñ(»¯Y&¾1îÕ “D nœœ”‚3Ck™•ú3ƒ\`Œû .¥¦3ÁØ„›®emµn¯0L?jÞE”Ü9 늾-ß*?₽ü–BÊûàüQ­1ZæDOBÞ6“Ó°š R @ÙÊá*žn º°±ú5=˜7ÁO0Ô,Æ%Ÿ;@Úx¾8‰d<;«ûõœUB ‰ˆ¸}Ч\?-¬qn MR‚ã¼ÓmÒ:«Û lzˆ8ܤÄû̉l–r`‚zxŽÆÄ›‚•i'œššs˜û¦Æ3›¦¯~ïK0ÅyM/-øLÈÅ2¦ïh»R%“Q–­aj7à#‹ wãããĸܠ#.®Ž±_|+Ú*Ø‹ãþñ@ÑX$CR!oÙ4ƒÉc{oÔè ×NBfl$-sú9wJ±]ävŠQÌ"@zæ\Ãßéq§`ð}•ï´% ÎŽQ­eN¶ÎqçÝûYì9N¬µ¤ì¿q&Ÿ£ƒ-Y²d"sQ ¤‰lî…wÃ9« éI © ´k°h9œ`P¾‡¦Åtïݶ܎ KÐOT#i ƶ?WkOw,.}gT™Q?žœ–½d.rQ WVkOØ/Õ“ ŸŠŠÞHÈ ›>P¥ŠhÙ<;h™êwص‚«ùa—tî`JG[r\7VŒ¸p>é­ceŠëèá]59¤|ÄE&ZIž© IÕæg¸¯=¬$ŸÃ[˜Z¹‘QoÅ…)4ê'b®â«ö§õ†¹—¨*;6L·Èý¿øöv†Ö‘[" ÁϼSDb÷\bIöÖ0¼71W@¬)°¤cPW Ç+Ì`XQUË÷ý|Ö’tvSá~ÜM:omη©D¤5¡E¨á_boEnçÞ°&á±lÁ7F÷@Eö=œ)uÆeF;Ä<ŠQ„Ð#{¯¤ÁŒÛÓUС6v­l‹ìéxí1¢àµgd˜’妅ZZÛë±ö°.é Žc4…øxg·ë16*CYyèo:ªm3¾WÇ[ Uñj~ˆÁÛÌ‹cô¦õ'Qko}äŠxfÝŽ¸] K#Ùõñí¶Ìo„¾™©¢^ûzŒÖ™]YÝ€ò˜{°ŽHŽŽøs1"¼›CÍcDD#(­‚±‡_å‘ÐÒøoÓº•g»¯Þ%JQ©òÕŠ2§.Ç÷Ùê2GmnYkÛõmŠ(ù޹w÷SºÇ.Ûb£Æ´f¨£»>*ò£É‹ñ=³¾üØq}Û¸ŽÇÆì"gÉ„ˆ ³ x§3¹b¢tc¬&lF¼ÁÌúˆp˜€vÏ'¯´Ð.bKC€,nDƆý=[Æ[Ùl…­ÌT‡ÿ/Ç@îÐÿÚ”vÙ¥iθXßÎÐÊÅØŒ=£³3js¿ûޜޫ<;"8²S™–õ3h#tSÊ8p•XÝí hgVÊsÒ™[)C íœÉ)оŒõ¸¾·e{uy][¬”ù¢3»J;ƺþy¢õ ç–"(‚O˜ˆæ?¬.g®oé`NÜÏ¢E×óä7¬áâUÐÚ?÷†H ­µ0ÄkJ×f¥´ÊìŒÑŽ8Éæ çjY [ÎÄø2֢ñîŽcDÆÚ1"Ɔßt‹ ï­×“qs£Úhì>²³DÏ‚a;cËÙ¤ÛM«Û@_ï6ÝÝá¶Q5-SÝstÜ4 ÍA6¢‚yqõsñ°g6¼‡™æÔèúgGp5<ÙÜÈ{0þº*ÃñXÖjUv®¯‰9Dö$°hoŒ·/Bkì§•­ŒÊìm)öóتÑ_›ßsFеÚ)[®tÓˆ¿øs.DoÝè¼µ>GQÖÏؽ"Ò^‘=Òýšì¦ˆn…5BF‡#òÛ©}º¾~ÉœÂÛv}Yãò•"Ë:³³+E!ÓÖ›¨Ç`¬ÃùÆö—ìùÆ÷'›(ÞѪ©&{~’ñ^’[+b,[m-W´mœ_é\¯ÎìJíèS¤*-ámöIu+| ÚÃDö²%< pƦ…#°¸7ápo˜<ä‹­~ø‡}°7|/ŸÃ{㘨þ>°¤5ݼ T/„ÿë·0µ‰ÿ“w9-²{þ(+!g8„ÐO…ëÃÊæabìdîÝ­E5ùÁpïJJM» ÑŽªjÆ«¼Yó&€öëøØN£âéýoß#ó ’_ò9J’裣´¬Ë£i§q…”®1eötÅøñâ î·OYfåðFöv|ÖQ&P‚m•UÃê;rVWZº«ËËlóô¦KK·}Š"+»»Ñ/-|O Ÿià3Ý‚V6³-@Û—Ï<ÀÞ:uçå_>ÀÏvpS_™á'ôL_âZ‹Aóè¯øJ{¦_±”¹÷c{Ú3¸îô»-Ìó¼ÚxM!¼rz³ïÇõÅô³%jéST“zÃüЇ@“fŠ{ÃÙ Úk»SÔw 3ýÂ]ˆw9äˆ>±åÚ3}oE83׿9Ë»¦2`Nˆ¬C'¸Ë#8ó¡/¦ Æ™+¨ˆßœ°v½SêÊ(:-½ªþÅ!ËøX×y™™ÊÔÕ(!š¶ø—:‹ ¾rü|ø?âpÃ; endstream endobj 8611 0 obj 4039 endobj 8615 0 obj [621 /XYZ 32.1599999 142.100000 0] endobj 8616 0 obj [621 /XYZ 33.1199999 245.779999 0] endobj 8617 0 obj [621 /XYZ 32.1599999 247.699999 0] endobj 8618 0 obj [621 /XYZ 32.1599999 142.100000 0] endobj 8619 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 96.9799999 106.079999 104.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 >> endobj 8620 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 88.3399999 108 96.0199999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 >> endobj 8621 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 79.6999999 116.640000 87.3799999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 >> endobj 8622 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 71.0600000 121.439999 78.7400000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 >> endobj 8623 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 62.4200000 146.399999 70.1000000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 >> endobj 8624 0 obj << /Type /Annot /Subtype /Link /Rect [234.719999 213.139999 355.680000 220.819999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.tcl.tk/doc/howto/stubs.html) >> >> endobj 8614 0 obj << /Type /Page /Parent 2 0 R /Contents 8625 0 R /Resources 8627 0 R /Annots 8628 0 R /MediaBox [0 0 595 842] >> endobj 8627 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8628 0 obj [ 8619 0 R 8620 0 R 8621 0 R 8622 0 R 8623 0 R 8624 0 R ] endobj 8625 0 obj << /Length 8626 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ÐyË|‰¢€ €ã9Ø@‹‚Ùl‹õ"Îò÷Cµ¨n5©K¥÷pw‹Åz³ªôö/ŸÿYüûâí‡Ïÿ)^Üç‡Ï'V2ͺ¿¢ý÷fxA˜RŠîkmªR4í_ñòõô­øvz>=Ûÿ¿¸>?è>lc?D×á/¿ŸÞvƒŸº+Ÿ?üÍ~û_!Š¿Ú_¿?þÃ~üäúkoøz2n¿üÖ}á‚ c ¿µ¿œþþCñ»‚9÷Ûþÿ¦®$WÆ,šÇ·Ë£üüoø(ŒâJê‚saçYYpü÷_§Ÿmo—i”ö^kU³Ù½ÖÂvË´–ESÛ®Y]½‹›Ù×ÂŽx-›U::ψ/\gªžè‹ }^7ì¼PiQ)Ì\WKa&¸ý±Î.6-8-ÍÁ>ÒôB8j)Þ_ºZ zeªu:jgÄ—-Í>ÒUi´ûƒßç dÚQªÆîžÒ2Ì`˜ŠqË©k£à÷ÙÃÔ•Ê:L¸‘ëSå¦a3ˆqû72Ìó´ìMœÀU2‹¡d…*Bé<ŸPÎ02²²=†0šOnv#G:Ú ì á ÐÏCÃYi«}>"èe­Å* ÷;Ú ôv²ÎJô˱~lw€{Ó-¦¶`oúæ€GÜ5Æ;æßßýÚþ)書šo±M{ÿåôö“µÒLk­~ùÙŠ²³ÉÛ}|±ŠYU¼i͸Êþú©øc\ý¹øòë©)«FÖUg#oÒòŽðÌlѨ…}„-ïQ‹4éãàY3[øªãàõÀÞ$a¢I_idÖ¶|H_)ž[¢5ì ŽƒçæÆyúbùÖæT«›}¨6Ïê,“Ï»ºfC΃q>Ò¦:87IÇűÈá"+…œ”­ħtèà¹áõ`êfp”õàý‘n®% 5U¬~ż¢úôq$¢¿°4"‡úË´þ’cUõšéQ«Ü«ƒ|þ´%tD …Æø–ê+b=ÿ•jyèÌÈt -xnëí>鞢Í“øÞm¬ýNB'.«äÑ!ä°®vò¤éÅØ‚ÅÚ"Äy,ƒ"V/ÖÌ ãD,e 7Ì(–?–œ„•bX“øåª–Å3™Ö†0 poß3É›CÁ*‚Ÿ'¬Q|j~€qc<–@¶+ø nÉåýf˜#áÞ(x@ðFf`2ÊÃ:·O9«´orûø"'$³ š'åD.2Î]JÇ;°y)6Cʨyï^ÏNnÀÖ 8Y_·N­+-ª!ºãÃD]ÁÇü;º}Ó¥àf§ê’H_{e’©Ruw¬öǫЭ‘™øã‰nU)…á·€Ý;4.TI¡ÁL:vÌyY)ÝN›>¼r¼œŽF¹è›®-r¼rÇ"ø™šk!j=Á]’6 PØÑ1¤<ž¹|’¸ðä¥òŸÅãBØ„ÆëL#Þ‹`‡1Îá–%žÏð­!Ôà‚Cf•€.SsÝRBÔÚ꣛M%Ï”:FÌÛ"ÝoJ`xÜðY8.EP(-H‘î§%ú¤‘34ñé Ã32U8—ñä]P‚0 æ‡xÒ˜û¼ŸÒ ”Û‹Ò4lJ›Ãu(»´ŠŽ‘°¡ê)Ÿo„¼Åý1‹¶D<0϶± [UMF(*Ñ£^7ÁkIŠ¡\5þJá=¡ïcž=Ñ|rOržˆs6ö'â“Z|^BðGü1„sßöà•îÏ wGeô-š¦™ÆÒŒ1vìMä_Õ·9‹$œlF0óìUý°ûŸ˜D"™0D)gt¸åÁÿº¤ðÕD(~î¼R9 /3JΦQ“؃%Žë£È V¨lŒËiŠÞ{$Ü-‰ñŠ«†9Ôª2 óbJt)‚ÿϪ0D)go”¹m¡æ¡@)àe±ïµÑæºHÊô X ”([ŠNJ Í;¦™Š/ ŠmLÑl(‰Ëcë†áˆé™ÒÛº1dÚà8þ$2ŠWGÀLq»<”Q/Á˱—Sö­K›jÂ|™ éMw©!sÌowǃ;Õ)U!U;rÉ]JÔp¶LÙûլ̒|”ÈŠýœ©ÍC~d”÷Y‰hwÉG¡ä;P¤ÄÝòNΖä.™à¼J=æƒÙ,sØ[.n·nËʼ“P W6!)ÇŽ¢]*@íϽ)ô³ÿþÜ1ÇKò¹à‡¤Dà¹áS-&™ßîß²òigUJÇ:¥’ãÊuõ(ìÀôC©ã…µÿ‡”X %”ž;Ÿ4?Cˆ:9´W‡’…¿ªtÅ6ËþT» G‚Þ¥WG±½ñ€ÂU#²íÀVSÄAÉÁ§D"Q¸%ÅÎyÈüòP÷‘±‘Ê»«™Ç«Á/aó Ë<òâp’zBº¦k¤ NaÆib ™ç8C'ÈÍOpLÉO¨¦€³Õƒ<Ø Y|I½…Uêƒ^)ù›psp9‡:JɘèB¾"ê>’2 õ¶H+ÖɰF´&¥þÞî™›û{cHgå=›R»‘b½­K ¹4¢£äÅæáv Ÿ¦ŠMBˆ&%íž5>Á|Sa=”Œ¸W¥¼„PíÈ-¹¸Ç‚#ÓÂ÷ö‡´=%xÁ£¥¸DÓeŠòÜßé Ÿ¾ª¸‰Ô^$pÒ#G¡Srš°>7¿–guýØÇ«Žã½o%àùª÷ iôc¯-„sʹËècQ¬Úf‡·ý9®ý×Ï”‚¥«ž¿¬ŒIGŽÉÀü…a›_ô%Ký.ß糞V:qžT] YÃãœEg ó«Ë†åf‹DÖ<ˆÁçA-Êõ’ç<å.¸}—å$×Yù|H“ÊnRÕ:rà;¿¦¨øèßšP O€°¾Eu™ýggÔ<ïÎY©k~3ùËkÖ÷x$nÉPþ¹’/?PeÜÌ€˜a)ãNóñ³“¥•¨ÍÀŽÇUóífÆ«~&¾25µðkÛBö8Ž <1)ß0éÆKááÿ˜†®è<Ã"ƒÃQ(uË·©é,”ðn ’LÄxì[€Û“õ¶¦PŒ…“ºjä$ûhÊ›Føò&!j V(åêŸCpÌx…‹Ïå)æ”Ð7Lòf>¯™_~Aà^ƒTªIL9N`` /_˜ÄÈܯs '¸DáÊl6즭-záǤ0Úæ!HùÝ'HUùLa¯U’"JQq¶^2îÔKNV@S´Žþ8ïðÀôn]Ñc´?½á•nIú:Ïw3jü‡:8pío@ëPg¶á“¦.`øÞ¡–°—¼Åe)•Ç{üÉ96r«#ùºlŒßÉGøL[rå7hÑë”Û¼'TöÖ[à ie¾)j›{}>YG •ù`%É“Mì½»ôÈ'Çë?p9B¸®ò"O¬FP,åÝ” ÞJz™ê6œ™î«ò®Ú]™ÅŽy;–>?ÑÞßÖr¯ü¹ÕI̤l?PZB_^1ºÁ ëÎ5ØIßLÄt›oëà P”ì%œ*ØœôHGÏ‹ÒÑ-wtË®tÛ’ß™úê²åM_OÚj¾ƒ ¿>G­m4´v ·,a=½J+Ô i š%œ,ñÞîvÀóÎ×V‚äÅ@· îðûþ¡Í ·‰¢jÐ þ3‚9¿î«IghèøLó¼-Ρx›b¿<„<_UNIõNðÖÞÕ°%—×Çæ†I’r¾? EÒæùøG Ûµj]{ô!`d.Žñ8Öf!rßg€³*aÔ0ÎÃãàYãD`€ë;±­ùŸqîíëþæÓ¬›Kq›‡f½D³öÇšõC³~hÖßfFKÄÙ¾¡ ©Xå ‘‡ÚüP›¤6K=ïRmV¸´þw ×ñvq:Æë²jÁŒÔ§–1¥A¬ÔôYó–±…[/Áþ„k]%Œ•Úð¹½ÌòS"Ûð‚±DññÍݺ½‰Ysµ*PJl¦Ç‘,‰ÐŒ+»0­Ü¯Ÿ ßSbq„Ô4|×HÎ ¡G‰Ò$˜3ÌÒdüÙVƧƈ"@©S…UÊ»Q)¹p-5\ÑŽPa ׌˜|·ü–ÌV(o·HÜGUUÍÆQ‰•ï&•i¦0ñUX—ÂGVŠu±!qYŒxøUxßÛqMÚܰ…-y\tÏï¬ö&`o îœÀE¨piaÈ€Ü8[æšr9ÅL–¤ldäÝ‘“’k˜œ<”Á¸”rÒyø]7Œh_¸ÔÞÆä}IƶBŸ»úb×Õ=„þCèDèçÚÓãÃmKëFpŸ¿­˜ý*Ũ‹ý<¢a—T'¿ÂÌÖAf¨/ÉÜË«’;åSЀ•Aiz®JÁ$¿É}í@Ïë²n¼3—'ØÒ±®‘#ñHoŸ&—Úgņ;Ñ,ù¾ò¢ T· rbU¨~vxÀ¼ÞOÎÖQÍØ >¢u8.ÔNÅÑøØfâÓ‡;…qÅ‘©%ït¤H÷¢ˆÖ“‚4¶#ý†Oc2dJÏÉÐIþ©e›êc´r¹?ýïª4†5o?jÎMwµ.jVž•%Æú+/'Ý”œ7ÂÞ_ÓfØKÿ«ÃÞï~Ëö±ÂZcûŒ?{—ör»Ž—Ó/§÷?dOd4[ÔèþÕ‘Á„ Ç„üîé“_J]½dp:éÌ‚ª…T·Õ︖à ssÎ0Fq‹ÑFŽa´©|l³WŒ¶×κ^ú_⣠ÃèvTo bt{—ör»Ž1Ú\^B@©h¶j ”Eµÿ(Ö ¥´‹I#c.dP/,&ƒ†±2h!ƒ†IEÛ+>´×´öÒÿb·dÐ4cdП ì•€ ڻ䰗ÛuìKÍ¥Âÿ6¬ÅµØ‹*q M–ì‰,á´}Í8ɹôaçÝÓ‡eŃ Ë郛[úàÍ}X;Ì£{% {ÍQ„ë¥ÿen裱z`HÅã+WÒ![wÕn·%û+/ö!î÷z»í† ‡iŸpª3Êú¨`u~èv2í]Õm7Õí0¿xÜ æóªsA7ŠO³[‚¶$Ž%¼¶˜ºD?«¨ÞÂõ Ö^êæB‹ëϧçâ›Ýº³­Ì ÷ñò5©ZÅ`Ìç¨×,úè´»MÜN{¬î åéeÇL$»> endobj 8637 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 768.980000 138.719999 776.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 >> endobj 8638 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 760.340000 169.439999 768.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 >> endobj 8639 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 751.700000 149.279999 759.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 >> endobj 8640 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 743.060000 173.279999 750.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 >> endobj 8641 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 734.419999 155.039999 742.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 >> endobj 8642 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 725.779999 155.039999 733.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn13 >> endobj 8643 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 717.139999 146.399999 724.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 >> endobj 8644 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 708.500000 124.319999 716.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 >> endobj 8645 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 699.860000 125.279999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 >> endobj 8646 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 691.220000 117.599999 698.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 >> endobj 8647 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 682.580000 165.599999 690.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 >> endobj 8648 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 673.940000 198.239999 681.620000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 >> endobj 8649 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 665.300000 112.799999 672.980000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 >> endobj 8650 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 656.659999 192.479999 664.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 >> endobj 8651 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 648.019999 141.599999 655.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 >> endobj 8652 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 639.379999 107.039999 647.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 >> endobj 8653 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 630.740000 178.079999 638.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 >> endobj 8654 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 622.100000 158.879999 629.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 >> endobj 8655 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 613.460000 133.919999 621.139999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 >> endobj 8656 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 604.820000 177.120000 612.500000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 >> endobj 8657 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 596.179999 127.199999 603.859999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 >> endobj 8658 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 587.540000 155.039999 595.220000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 >> endobj 8659 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 578.899999 102.240000 586.579999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 >> endobj 8660 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 570.259999 156 577.939999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 >> endobj 8661 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 561.620000 155.039999 569.299999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 >> endobj 8662 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 552.980000 138.719999 560.659999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 8663 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 544.340000 173.279999 552.019999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 >> endobj 8664 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 535.700000 204 543.379999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn35 >> endobj 8665 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 527.060000 196.319999 534.740000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 >> endobj 8666 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 518.419999 205.919999 526.099999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 >> endobj 8667 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 509.780000 184.799999 517.460000 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 >> endobj 8668 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 501.139999 161.759999 508.819999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 8669 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 492.499999 154.079999 500.179999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 >> endobj 8670 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 483.859999 168.479999 491.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 >> endobj 8671 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 475.219999 148.319999 482.899999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 >> endobj 8672 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 466.579999 233.759999 474.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite >> endobj 8673 0 obj << /Type /Annot /Subtype /Link /Rect [137.759999 457.939999 204.959999 465.619999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite >> endobj 8674 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 449.299999 150.239999 456.979999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 >> endobj 8675 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 440.659999 328.799999 448.339999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites >> endobj 8676 0 obj << /Type /Annot /Subtype /Link /Rect [103.199999 432.019999 175.199999 439.699999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 8677 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 423.379999 129.120000 431.059999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options >> endobj 8678 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 414.739999 146.399999 422.419999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 >> endobj 8679 0 obj << /Type /Annot /Subtype /Link /Rect [68.6400000 406.099999 172.319999 413.779999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info >> endobj 8629 0 obj << /Type /Page /Parent 2 0 R /Contents 8680 0 R /Resources 8682 0 R /Annots 8683 0 R /MediaBox [0 0 595 842] >> endobj 8682 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 8683 0 obj [ 8636 0 R 8637 0 R 8638 0 R 8639 0 R 8640 0 R 8641 0 R 8642 0 R 8643 0 R 8644 0 R 8645 0 R 8646 0 R 8647 0 R 8648 0 R 8649 0 R 8650 0 R 8651 0 R 8652 0 R 8653 0 R 8654 0 R 8655 0 R 8656 0 R 8657 0 R 8658 0 R 8659 0 R 8660 0 R 8661 0 R 8662 0 R 8663 0 R 8664 0 R 8665 0 R 8666 0 R 8667 0 R 8668 0 R 8669 0 R 8670 0 R 8671 0 R 8672 0 R 8673 0 R 8674 0 R 8675 0 R 8676 0 R 8677 0 R 8678 0 R 8679 0 R ] endobj 8680 0 obj << /Length 8681 0 R /Filter /FlateDecode >> stream xœí=É®ä8r÷÷y ³¹‹ µðÁ@£ðÁðÁ¨™ñ`à¸fþ}‹)‰"ƒ¤Ä H)ß«×tUF2Z"‚±ÇÏÿòëÝþû·Ÿ?ýú¿·oóߟ~}!w¢ÈôßÍþùÉ0}çlúç åûßíÛï/ßoß_~yùeüÿ÷ª?œÿ¿\PLþãÛß^~ž¿L_?ýÛø¯ÿ»±Û¿ŽŸþzûÿÿú㼟]ðû‹6Êþã¦PF™?øÿ²_þååßÿpûÛx ú±¯ýÿOƒ\×rä:¾»ŸÒÇÿ§9däf3’Ý(eãuÊú÷?½üÙÞÕ¡ dþ²›¸Åÿ<‡PÛ‹Ô\Ž;²åòð»PJIb£ã÷IÖûdó}.˜ÔÍǫƗÿë5Š5y|p£~oÄÄo>^~Ýã;N}©—ÐåÙ™ér‡ñÑ™ç%Ï-ÃoONyãëœ?5†w­æÿ²ÿ.¦)M‡Qx‘xÂ-ÑEO@#ØÈå!šük^Ÿ9C*äãhSô.‰=›€Ýµ:ÁíßÃôº#„Ù¥Vk˜!߯Ñ;¥†i½®"á6ÄGc1ˆýá l D3Bì‚‹y¬’á62Dó@4¢F( l}2ß7~øñ·—Ÿ¿«ýöçñ«‡f5ýõÛø¥ºýô¸Šñë?Þþ‰FÿùöÛ__ô]¢˜|èbÓ7”=¾îÄðAïòåñU4MƒßýøFÝÕà7òñ¸‹i3ï›aº‚±x¾ü6ÎúR2ÞÍãf†™@ØHuÀò{… P˜&) Ó ¾úQØc ·!>š•¢°a€hFHDaU2ÜF†h.¥0-Φ°ünŸ&Ús®s” /iq~ûü7IÉ£©3S2§> ˜’Í(Ù蘒¹½Æ€Ä@Éó*nC|4+%•¢d#!%ˆ’«d¸ Ñ\HÉãc` Ù˜Ç뤣ÊRßú¢EVºå¿É“ZVV²/PVØÀWαHÎþ–NÜMÙ‚°œ-š•ue æDˆFDõ¼J†ÛÈÍ¥¬+ƒš|ž˜ŒÜÕ@C%1:X"ºE¨h³ºh~„ìÈòI Ûoðcô$7Hgü+éйAÀ CÂø¡ ’éÿó*nC|4+7¨„ñ?BˆFEÆÿ¼J†ÛÈÍ¥Ü0,Æ^E#³1%BZ¿ù•Ñy¢Î„r.ˆÙ0Rëd/¿‹-³~Ñ„<8Û_ PêµNl=Lçƒ^Xdù<óIj¢<3BÈLxd|{ j"OºÀ”öwY>-¦úòy²äÁ¯µ„8´u€+±«¸¿Kx–¶?þátâÖb¢m³¸òŽ­Ó~ÃÎKφúGÑ¡ó5Ë5Ê qþQWøWb-´BÃk£Ê–šmz Æù#ÄàJ;J€?‚’”?‚è°xØM«H¸ ñѸÎ’”?‚è°xØM«d¸ Ñ\yØÙÐf*ÅGL4ž®æÃ‡Rç ÔîÊRîÊ ;ÀB"ÂbΰnC|4+a±”;€2è°ˆ°˜s¬ÛÈÍ¥„ÅwË:ž7dhÖÉŠq!`éˆGGÌÓ‘¶©} :Ð6µˆŽ„³M×mˆf¥#‘²M)‡¶©…DtÄWÂmº¢¹”ŽÄb›Î:i*î•6ù€[^¨aÉF¸°•|@1ÙH`ÄQ•2⨂Fœ…Dd£œ·nC|4+ÙÈ”G%4â,$"錸u¢¹”l”3â.¬»¡ßf|YŒŽž×µqà”VÎDœÙD¡ÂÜ`“!¦†‡-$b/°É06áá*!š! Ï«d¸ Ñ\Ê&z±7ü5AÙ³Èt_™Üç>„M™×w#ι§Uê7]½J¯G«Ó‹rÏ¥ðÅrÇ@³Ó$ÍN™&avšÕì4¡Ùi Ùi’f§‰ÌN“0;ÍjvšÐì4Ï`v2²ï/år4Ïp9v#6§—ƒ8ìdt!®å³Hx'Ùø0BÏ¡…@串)íï²|Zì¹å3Kx'Ùøâ!y'«¸¿Kx×z'G±°¼ûOxéËñ¼ž—ŸJMe󆋯åŸ^”罉ù$ë4"I«og•[­gçä¦eÔEèóÇ…%§¡°ä,%,¹€‚Œ‹XXްYλ,Ÿh(,9I Kf fbaÉœxœw ïãbaÉ]Ð>ŒŒDE–²Øçbþ¯à:ö!'ÏkâC±¶ˆ§¯;ÙÉËÜåpåŽó²0!/K’âeÉ ŸIóò›¹uÞeþ$LÈËB§xY ‡b^¶«¸¿Kxó²\¼U¹sQV(Âk=yK ¢©2J÷2®‹ X:ÛkJY¥ÆSÀiÄTÊiÄè4²h¼M«H¸ ñÑ8ã©”ÓÈfù4*vM«d¸ Ñ\j¼ Îiô<1Èšn>€¾ŸôÖÕ5µ‘ÙZ®MHg œ³…rP̯8[˜N9[,?FÒ±³eZEÂmˆfåWr¶0 -ñ«vΖu¢¹”_s©œtº”3T.¬€;nú&ËtLeÆ¥. Ì”ò ' u“Tê'0uÁB ¿L«H¸ ñÑ8~á$•ºÀ L]°È/Ó*n#C4Wò '• Mù¥ÞèÙæÄ%D0ꊩ“„ˆÑ¦NQ'ƒ Q's ë6ÄG³R'K%Dp ",$¢NY±¢¹”:™êJˆ¼~„zÒÔ¿‰Pº0¥Å´&?¡"«kFuË©_Ô3,©(\¤RQ¬gp’ˆSQ¦U$܆øhV†å©TÎa*Š…D Ë]*ʺ Ñ\ʰb1îó1á(v±æÈûÖ#e§™^Ï…KÞ ƒ(&, ìp.Sv8Wзˆ°ÔJI2°Ã4+aÉ”Î%´Ã-$",éìðu¢¹”°”Kæ9÷*Âë¸ÖÙÐ,"‡oöhˆwEÈçÈdâÊ%²OÅ. à°W•»2šå³JxUù ÇÓB WÕ”öwY>-6éòY$¼ª|¼ˆƒG^ÕÇ*îïÞǵ^U®56íâÒ¸ŸDÓô*d€€k§ K鎓² 3#¸IeFp3#,$"e³dF,»,ŸÂÌnR™ÜÀÌ ‰HÙ,™Ë.á}\LÊf1I7‚}Mõ׳²Êóæ0&D”ße(äy8ºÄÅg *÷=Ɉ$Šb³`frãÌx¥|@©ò&(0ãM™ñ‚B3ÞB ò6­"á6ÄGã”7ASf¼ ÐŒ·¨¼M«d¸ Ñ\©¼ êÌø!GñAŠY £ÅQ¢Ê“Ž´ H«  Â~Ó>±à)‹Xph[HDûÜYÄë6ÄG³Ò>KYÄ‚A‹ØB"ÚgÎ"^·‘!šKiŸTØ×xVò'àU¹åæ+§_6Õs€búÀð"ex o ‰èW®+Ã{A³Ò¯HÞB@ÃÛB"úÎð^·‘!šKéWºxß⢶Y¡y}¢œ0Qý2§§0ç…t1ë©ìs³˜1k¡R1k¡`ÌÚB"S.f½nC|4+‹©TÌZ(³¶ˆÅ”‹Y¯ÛÈÍ¥,6<‹ÅÞÿ|€‘^Þ+áô¼¾iä¿Vä%c6‰®¨¾Kf*.zA{瑎Ó‰«P,\4ð ð ü íüë6ÄG³  ð ü íüë62Ds©pÑ.ÀŸµ½b^«H?‰“)÷yì@†Â?¿±t?üz$_áLAX¿o°7œÐ®CP*9$^IR^I ×ÆB ä˜V‘pâ£q’cü’&òÚ˜„ׯ8Q±n#C4WJI\7ŠS]}Eúv}%åé=é6êAjÂ.Qä²ECLÒ|TšUÊДLRè³(e¦U2ÜF†h.•2l?c$Îϲÿœe© bD´K@ô×)6xúx´wáv¶x*8|@1·sàM”<åM”z-$âv±²7¼‰ š•ÛyÊ›(9ô&ZHÄíÜy×mdˆæRnÞÄwWGÕ Ÿ0œ@ —4hPÌc¸¥L¹¥„îD ‰xL:w⺠ñѬ<&SîD)¡;ÑB"“θn#C4—ò˜r‡!ÍñXAbZMÇÚš” rÍ36%öuaÄù‚ôvI7íÎÎÑóÅ´?o—RÞ.9@o—…D´?8o׺ ñѬ´?¤¼]r€Þ. ‰hpÞ®u¢¹”ö—;Ô6ÚºköU%×u‰cÅsrj¶~¾§=­Üô@f˜(æX½L&ée2‘—É$¼Lfõ2™ÐËd —ɤ¼LRC/“…D«W5¡—É<…—É¸Ü žõ“Ô´ Aø:²›DII5é°ñ)u­»ù‚LPJëŠ_‡¢)_‡¢Ð×a!Ö§U$܆øh­+’òu(}i}Z%ÃmdˆæJZWt¿õEã*Èý L5]$÷øˆ„¸&î˜ÝT*5ö@|ªm½ ¢“ОR^,m”›žÈâiÓž§,¢§Îª,λ¦KUšzi*4x ¿¿¦á[©,x`ô¡92ëfÿüýO/O§l¼›Ç«çnÞëC·¼`M–dCv<¿ˆþùIÍ”í†\re|@±º#€#J‰”#J 舲HÝεnC|4«º#RŽ(% #ÊB"uG8GÔº Ñ\ªîH÷:³ãˆyP±û§ï9ýd9Ê ƒdSùÚ(&qüMJ¥üMJA“…D$®œ¿i݆øhVW)“RÐßd!‰+çoZ·‘!šKI\¹É/53Æj¬×|‡ ù!‰kòÛB/†)×µc^×þg˜™jåšÂF® V¥WkJ–ôUúQÈTU½•Ÿ¦@ò@QX§¬©#‰}Ù˦Ž"˜»i—¶N]t;è€ïQS»z‡^s¥S^s¥¡×ÜB"½C;¯ùº ñѬz‡NyÍÕ½æéêhèÀk¾¢¹TïÐM¦X7µt+Ø$îÝÕB̤zä]›èòÜn5fH¿rÃùÔ¶hno¡LØÿz ©þ×ý¯-¶·°0¥ý]¦O Ž¥½…2©þ×ÊÀþ×Û[®mo1ç°Ì[Åyo÷ˆ©?bݦÝîó혞¬rj1¸ÁºŒp˜MNïÅqŠMœÞm!›°…1–]–OáôwNï¶È&UÜß%¼‹Ù„¹LÁ¬V×G®7U›À,ûæë‘,g$·»iÇL(pœÛyؾlà©öe‡íË,$âv¾´/[vY>…íËžj_6pؾÌB"nçKû²e—ð>.æv±¼`1ä,BÌ÷&Æ*"ƒ¤â$£Áì ë‘Æ]îá«j(qª=K"7/›OƒÛ@©$Úå:s¾Ùêš„I\§ ð^S¶>½2ß°ÚZbÀ²ÔôäZcR~ç"ôïÌot¸ ¿ùäl]ñ+žÑõÉí¿X̉o²ûo\ŸÏæ9‘góšHH2õ/6'NÅ”¡]Ó–¾Ùˆ¸w¹×>¾‹ð!j÷<‚´ñ(òU]-œMb*g¹[Åô@Ù}º Ê‹mÒ  †>”ЍúCœiˆ‘å\Ìdö.®®ozÚ ¸º1—õv1¾狆L$¨ ê²AJÌ™T~Ðt ¨–Ð]Um"òˆH5}MÕZFrFtŠ8ƒŸ?«1…~„ÏÞ^ÞJßàØÿV–´ß»FD†¢djãþZÌŽÙ7ýaÿŒDOßëx¨®á¡’} UîÓ–¾ù”Øšo.ËØ5öN0R×¶‡Gfè5év‹8Àò'hö›}•s:DÒ:EÑoþþ¡€ñ5 ˆXoÁ¡¸E%‹øˆUôƒ9‚:Š:®9”u-."µ°F·:"Éö›4´¯"êð+hg_Ë<”µ×…i ’8ZØ\UšØŽÚ·Õ2¿­à¸+ŸeéÑW3ìˆé“?3d™·—¨ƒÒåõÀôs̰涩ÃEþv*¬Ô’¾½ßêl—ÇMŽÄ6| ù§ ßî¾\×—JòšÜùn~FòU¤;`|„çt>äyDÈþ#J¼‰¼“#f„ Û7g=¯#´¸&-5jû*JVжQôúÇ›C•=ó¼S”Nê‰_`ÇD–Ýþ|'DÓè}P^ñÖvšGä :D2þù<¶_sÔ“ÁĈ#m_I>`à!¢$¯+¥¼½XcK⸠ê(ÚÇWDûõ³'X@;)™fU¥d~Ž–À”ÌùV¨¸GCgóé•_sßÔü†Ïß`R3ói–³¬O¥˜æ“MçܸSÓ]Ù™ÂuDDäRJ7C¤?"lÃ#Åæ‘Ù‘R0?ëÄÙwLÔ4äèb¸Ç aERþÔLjô¦Æ7Âß‚h„xNš""ZÉFLâxníCP „-BïßðÕAE<¾µrKd¿w]$·Ä—õÁU–·=ú§ â¦g,Ÿç´Á+*¡ú¦”Wzö€|{QÒ+P›V‰`áã×ÏŸçò6ðká°åmðJÆU&ØÅ„8åmTÙÇÁ-w§TÞﲟ ëUçu[?Êþ5v=±û4²É·á(wÊmôË«çôÍ:»å{ÊtÍmùfê1ñï»,ŸEJü E³P±ø·«D°‹ðq8ñ/XJü á ±ø·«L°‹ qœ þ…Þåð‚!]»Î¾÷g¹Ò±AÃygÈ~FÏ+’Ï|âs'¦qd¿Á\tÔâ‘ ‚p°Gþ妩I‘ÍDŽ›§³|f)‘3Ê ”ˆEŽ]%‚]„ÉER"GˆCšXäH'd–]Lˆã‘£ÜðŒwó5jœ„CMžr¼}“0p…;­í*ìbB'‰Zìóm³áÉ®âU£Ò*Ò‹ª*Ë4Lc ¾ý"ÞŠéëU!–¦ÚF_kEˆ,¥¾"gÇ6Ü~žê‰ò)øj®1_,Õ1$§xw|œ&8šT4-l*}„Ì ›“Ê „UOvu‚&U$¯ ó}›œý¶}kš$à·Í­>’ÉÙ¡צd¬é3©i-uÄìí³-/C wm<â8{Ôœ”(Tãe*0Ðõ-= ©Á)ñžØt(±édß&ÙÑ¡Ïüh„ToÚ‚¨s¶1ÿºEö‘&a5ÕDZ-½û€7<-(÷P)k í´Áäê®° ½‚Q%_7o´¨”.È l:c!oÚâÏí¬`žMu­J”êÜ“ù¥ÔÜ´ju㢸ŠÚŒ7ÉSB*<_ÊÑÓ&ëÔUŒ÷o–%Tú²÷Šr]ÿ™ÅWTQØ‹ [¡œWÕ„ rZôniÛ-ãiLýCMwO²^kDNtBTèûÎ.ñy~m’Ó°Ö³SWÊò|ÿªÉà‘&Û"¥wã-Uä!ÂùÍŽÈ÷<™‹O9¡–íy<cÿŒ3é[;Ù¬®*+m Ø‘™VógB>úŸÕ0òÓyù‡¬ÊâÉwÞB0ç®o1³Ñæx‹9â½B–dĸ‰ì°‡hÛ¹ÂÙÛvcºÄ×ý«ÌáÈn;aj4E~œE~ Fv·ù©œ ;›‚¶ ¯ ›­÷߯ö(¯¯*tVÓâUÁ]!kSÏSó"–ÎÉG{ #Vù1ŸG“oavæá=Ï•aË«°¹šÔÛÿhVQAÐ$[ø±Ÿ£QÕö‘×qMp¡êÄyÓ®æŒhé‚8¤uT\"b"è¡XÔe¾æÎ|qaxÌ,žÉÕ*A0eã!÷˓؎äÊWµãA4|ܳAú›œœªÝ;zUi/=5µ'Nˆ)Rä_Q/ÛfsÛ¸ç¶q‘šÛÆœÛf!°eøc•v>Ž¥e8©¹m\À¹m[†?V™`âhÐ2\o· ç¼±EÆ5),{ÝQ‡¬7n’ãˆJ¶ï?‡–J ŸËeû̸hYiR“p@Z>åXU>Y—aqOáæ”*oÔØÊW6ÎTÏgl"ÚÉÕ$j´¬ÂCd§êÓÙ§Ãå‘dê«BUò)çj7ô›ˆ0Wå87I²ê:¡¯k‡öc'M Ø^w@3м™y[=é|ÖšT÷íy-Š#M¼0ÍJ›¨Âù"ûÂ.j[kÑ$o®&=Цi]s4{š?\AFþáGg65È_·Xà©©*8ifIŸq©˜Š—çâ‰I!:«¹ô†UWߤÜ´W„¼*DXþ80Ô[¡io\ýÕ™wm ‡&hô@Øl55Ô-rU!Þïêrö(”g Éž`jµóÇ9¯¡W@ƒ@± gK ’š--œ-m!0PüX%‚]„ÊMj¶47p¶´…Db³Ì–v»˜Gÿ@± n¶tžÛóÑßO;Ò%¯¸{äœß$ZJ³²‘gI2ê´8ŸYGš'?åžI~“í£+ÉßNÏ;?¡v%«¾I­˜¡À5â 1Ý­­Uöž&p‚½†Œø® šøJ¢ ŸÝ"ã½f¥Iòû§Í¡)$¼Zæ¼y›èUWWn¸ÅóÛ×8ƒq¦.‘þ÷96'NF1p8Ŷë~¿ªsDèÙUWó®ý=‚±%Â__Óv#ÿœZT&Åtд½wt¢lôxßOu)wc4]{Zž94þ·E4ÿH;„w½µ+íõ¬§b H¶Nä]C‘ˆüÙ&èK+ð=âòH±aÛf×rOwmåß÷í!ÊkÂþ‘ýtN ¹#âø)vÉôß'Á¶ãÀЃR{ª·Z‚S`ÈE(ˆØû®µIç&Ê Q3`QÚ%öÞ¸ø¥i H“`õ^ªó vœ(8^A,剳K0 ºg×d"ò|* !d²?èÈt¯+Ë*)dÁ§qð»•üª"&GœØggžlÙÔdünì†È³mqÎÄövͬ¼¦Ê_Òµ°*ýºÂ)}hbE‹\ü§jR8Ì3мƒ¬œÕ ^÷ûa±onŒ+~ϵ9r*—ç½ÄÞÄ8Î&B¡ÏÑW®”ÆZêçÞ²g1cåRÎÑÆ]s¹Ð5ÿ¶¿ži«„*:T߸Û`mà ? ›ûÔOœžyÚtPg×Îò7q‡_s¿™EPêš»™‹q¿™ßæÞý²„TgÿÍ$BIšÂ'ðt°ñ›<d©·êm|ÎÒuþÉ~É^užº"J|Ê·­5QwjMðÚ³ Keö–•/JßÛ//ÿ ãno endstream endobj 8681 0 obj 7908 endobj 8685 0 obj [623 /XYZ 33.1199999 722.899999 0] endobj 8686 0 obj [623 /XYZ 32.1599999 724.819999 0] endobj 8687 0 obj [623 /XYZ 40.7999999 552.980000 0] endobj 8688 0 obj [623 /XYZ 40.7999999 90.2599999 0] endobj 8689 0 obj [623 /XYZ 40.7999999 552.980000 0] endobj 8690 0 obj [623 /XYZ 40.7999999 90.2599999 0] endobj 8684 0 obj << /Type /Page /Parent 2 0 R /Contents 8691 0 R /Resources 8693 0 R /Annots 8694 0 R /MediaBox [0 0 595 842] >> endobj 8693 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F1738 1738 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 8694 0 obj [ ] endobj 8691 0 obj << /Length 8692 0 R /Filter /FlateDecode >> stream xœí]ËŽä:rÝ×Wäz€É+JÔƒ€a ªoµ/ 4n^^=¾·gáßwfJÊ©C2‚AJù躪S)Š ãy"øË?ýö»ÿúûî—/¿ýÏîÇôóËooÕ¾êªñÏîø÷×Ôþ©Ç_û¡Ý׿øg÷ã÷·Ÿ»ŸoßÞ¾þýù¦ºÓÓÃÅùã€ÿñ··_Ƈ¿Ÿüöå_¿ýß®ÞýóáÝýÛ¿~üiïø…ßßÓùïñU«z8üçú·ãÅ¿¼ýëv;La8{ü÷}Û¶½ÖIóøy¾Uþ^ߊVíŒÖºvJÕ‡y¶rüï¾ýù0Úyû¡›þÀßcž4ŸÔÕÇ'Uú0yç1F+Õwº¯¢'ßׇ1Ûª;üè»i1 ƤRRm'3ÐqF*éÍÄî½#±é^×ýé%µÑ©¯9•L¯þÀÄ"g¤Ò^m¦¼3Ô·¤­¯Ü­ß™Ó.îû}[ÅÐüÿa? Õ®ë?z¥N;P?éŽ_<ÉÇé“o]»WÊÔàÎßÒ7£èëg¾?ý¿;Þ¶³îî[û‡O÷ÜÎäø-s3й}Æ_Þ>þ° ôêË›ÿôìãûÛ/_‡£€ÿþçÜ´ÄøãûAþszÏz÷ýO»¨*5üãîû_ߔڷqØ·§ïWºÓ½×MßN gºRŸ® —Ìéƒn_«áô݈+ÕxE_>øzú ßW¦¹ýjói?O>hênPu{=*DUã ûÁdB5GÕ Tö”Æá?¿Øl~±?Pè¥'ò«v¦ÔåÊ;$îâçÁ‹,­CÙ ^©:‹Úõ;œÉÎ!NØ#|/σñÎhñ¤®z›Im:º4ÁÏÕpu>ÃÌ{.‚äxxwø<zz^4H¾Ú–Tž}É-0tg {<›FÛÇTHá7,´Å{¾…s…oQÛsuùÀùœ¼gjÎn%²ªç)ÅЕð6]º®$Y<ƒaVcÈÌ Îæt% ‡éãé©5œ4a… H¥d@öêV¨4£Éeö-ØÓ Wj®L¯Gm²a—®ô¹…ìP[ÈfìCÓØ– ³ý°HähO†ÚÆ3˜–+†¥u M‹ íÛÌüÒwí­íëî)L­øÝíŒÊ²ã­ºdÐ_­;Dq|E˜qœÉ:Ö—}‡–S[©†¥MzÍUÆŽ1W†«ƒÌ û¡ØÛt&ORÛ;-Œv—c2e×>u×Ù›ƒã.™Ö±Î<{@¹¼î3)Ä?FÀ«Ô˜ŠœhDÄ‹'8Í”Õ#lV¼Ï8Û*žâ“m»$á•$Y'ªf°–÷ kùµ2Õ¯#É«}׫€gŽy¼KÉâ:ŽÎgv2™sFœ&³©iÃÚ`ÿIXçwFd¦Ä€'ºâY:Ži@ØÚ¢› þxÚȸ?x§µ “`²”„#RO—ã–ÇGÆe³.õ× æ–Íòl&{Åqu9 S<µÁÞ±ý(I5³}k+£é|#Åm('XÄ‘åd$SfÂak‚ÅmV‡Wƒ>G¦qR7ñ*bŠw@#8˜±] o²a*Ëá`[õ¹ïIx |qWÃrÒï†Í›ê³‰%œûãxR È’Q­,䱦9‚Û•’ß`ÄŽãáÁ•ùây0>{VavÛnF$5ÅL§èN”‚‘ä„P) ¿†c p¸W2iÁ‘õ¯Y÷~ž4Ê(HÄ'>(ä,NØòÑ]|`B0*»²kºÞ’m¬Çä&ˆN¼  ‘ß ð:TO˜e1@9bÃ~-˜X÷zéØÇ^Ûàêã'6ðùô-s3й}F~àsßžíÁ ˜x´/Xž{fó¸R¦_IꊀÙYvslÔûJSÅP-OÇ‚öpxšp:YÞ–<÷}>Cô;ΓР;§£^)K%¬'T%Œ=‘FÂ) ­Ü½Ð·—k[ílá=ìnµB9×+vG)F q•Åç„F·ÍfT‘HF|ÈM±Ùë“䡈'eWÎ㕨#‰ÃÊ ƒqJ—‚Ì%W9ì Ú(÷Ðáà ô9k6ëFBØÅ÷…ñ,]¡"þ¼l«gé|Á eŠ€EN~+•å{¬"™W‘ĦœÁ(KÍ܃âî}‚!v ²U´±]ÖÃèXÒw²# 8{éŸ)Í2D°ÅöX™ƒ1ÚL™AîVÛ›o_–>`ÙÀ„ìWˆÒ9kIuk‰ –Yôc(UöÊÚtÐu‚H\‰uXDé“ÒQ8yºZóaØ”¨ “S$äȧæäK+M0N9˜‡Bm8e öñ¾ •º U½:*mÂŽŸØ ³Ó·ôÍ(úú3èl¨ª%Й16èìð‰:33Ìì<й}F~ÐÙPu3;@gYÎVÀû‰rÌæ`¥Å…„É|&cŠ—ÄðõÀ;™,ŒÇú±Ÿ$ñÿŽæ GçréÜs¯ $‚å¹pdWØÔOq` b¸‚ÌÅ7%t+ÏËdÏ*e£R"²m^ó•žÓ½ÍÙ÷»±EÍzçrâÅ$d48 Ž …F@á.ט [@¶!9EêÃ/ìˆÐ0 $>æÑÎ|5.ܽ-s³QôŒh–‹Õš&)|H…Lå §Ì‡Į̂pú¡·Σ·XÏÔQ±ñ€¿ÕauZÇ+_‚¿‰›X|6Òz¤H:ÜŽƒ+#ìbÂ[­è^ù¥K#ŸÑ[2oÏ=V’*^WªÆ³^¯VH¸]9ÖÏy1;)û‚åØ'À" 0ÅÌ… zfF·1¶t–Nû¼z:‰àDýÆ fùEâô¬áï(Ș”1Ø’¦i²mû‡ í*› %°&Çö­eÇzëMI‹uáRº ÝŽ¼gÚÙ¢'hf ª#®L•^ WjxOŸSÀçôðJ¯htE¿Ã¹Á÷©às0u*üø>¬Àçà7ÅÔy]á]™DéŠç9 }ÿTpÿ4˜w>éÏñ̺‚W¼RÓi€gà‘;XºÀ=§à=œ]åÛ¤iëéæ™[ˆEtŽRsÔöétŽ}{H_Õ+‹À„™ 2Ȧ “n|XÄ3ÀâÏíWºJ­±øs <¥©ìòhš\V[jl5Aù‰åK‚c9WŽ!G<ö!Ö–˜Íñ¶Åò—¡ñs^šü®5yÓ<«&_šCÙ²8‰AQÌc˜•ʃ€g€ýd8Ú}jJa}Èð9œèyŸ§áQÏjstöº³n8¥¦ÕÐÏB]°":¯>êŒ5õ»ŽäåÌnëΦÔf€EIýó9Á,h7µE8fÁ©5xÕi…WxÛuZM×Û;îiOÁË‹|'4«w3”²‚”ØÞÉUëáI7Ó´t™dDñ׳– £ÿƒµÙ¬Ó¬!kÛ^Û&§H®B |p:Áfît›ysZÿ8ëjªæÑ ™Nz\ uDÁú`ø|¡*¨BÝ@À½yÝçÉó¯+«•îË}¶¥ToS*¥ÃL¸/öŠ'ªÎ披ü)‰³«»–])3ÓÞÜÒt)NŠ3*0Ú0²#²™VLg1é,™>ZLš‘QñÄØ9™e Î*0¨ƒïÁÙÏ›bÌžÎ3ÞÇ“•åp/ž†Ë0P œ|~Óï¼ |-5kZò &ðÜÚrú£QgWgb9r‘MóHH†þð¬Úf½ÏêlÎYÔH)]Ý@™†±ësˆgnº thÎÎÄÓHÌcÌ%á±à°6áà^ÒAX:Ü'‡lD¢´sÛIìY0*}8ÔáØèë_y"‰²aÙˆÜèçÚŠ'’æõ¿ä†¸Ü¸KÙˆD1s5ÄIÿ3bÃëË€—DaJ”B²  5ÏT4{¦±‡È©ºcdM8ùÙ>_‹yËNNƒWölóù}>1ò¥…+O\_ñT‚aîƒ6 §÷H¨ÖiE-ŒW›ã?cº±ªîà dõó£ñŽÇBÀ‘N0Ôü±Q†áù$ä]rì–ý”—„|* YP>µµu¢™”Å©Ç~ëÝ#½E;x¨ÃèE‡¯pzÞá¹5¸³ƒ¢œ¬®,W±üï»õ Ûîùr=¶Ï°æ®1u^Ëây4Þ Ú5$i±\gÜÓ˜‚rpx¾ •GŸq0ýwÉÿ/Ïï%¹r°¤|êê<Ù3VäKH†Dápì+µ}Ï¢k_Ù¦;Ù3v…Soà¡£ƒ23îñâî’ßJÆE»þ ó6^{Vïü8ëR‘ç‘5‹ÿ>9‘‘¥öXV!®*#í̹_âª3ÝrûvvY$»åÆ´åcõ©"t1Šo¾"r:¨ç@ÃøZ¥º4ÓHœÜ¾ýx8VóÕרŒÐ©s{=ó$WÍ©,ÚÁÒ”¦{˜¿vÒñxFá{ñ20Ž1&;ïéQ%D‡Ö<ª 3)ðÚsŒiÆž³½÷¦µ~fA€¥l¼çá¤W7S<¼`7ÓŒºÉTÆÖM¢íù)›ƒ°Ì"îIP^sMºxNtŽL «Ü®î¹²Æ³ëí£\­d@Ùìw2Ülµ¥oÏ”ƒA’T&¸CNŽ)ŽÍ ‰HžÏ3‹8ÞsàÄ}8;M¥my¹ˆãöâ·Î«YÂÎM’º 8âñCÏ1c8&&èB8±ˆµ xk»¼{–œá]É“'üCP˘°®¹&xþBÞÌAk”%xîÄ–QDwÝ`‹è ¹¡™øLôân¦‡FÆ%ìÛ΢ÇÄÒù¡šË)è9/ &éÈ×­5Á)!óÔÀé“WOeôº÷œ‹£÷¸çÈ»wÄ|ÓAKK½VLuŠf¼#þ:nØÃäÙEuß÷¶ó:nK’qt¥çMÈyaŠü%ä$Pk¥ÍÜo8ä„y’£‘ ¸éõ¹Ú—uP‚ñiMƈâ·`Iãz{ù=Ú—µå€cfÂÁu†šŠH¯òs"9½mÕZ> endobj 8700 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1738 1738 0 R /F1438 1438 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8701 0 obj [ ] endobj 8698 0 obj << /Length 8699 0 R /Filter /FlateDecode >> stream xœí]K¹‘¾÷¯¨ó®I2™/À0 µ${X@{0|0Æ/;Æj}ؿ类̮Y“Œ`fUsõt*™d0ÞÏŸ~ÿóŸû×á§çŸÿ÷ðËüçóÏOͱé›Ë?‡ó¿¿yû ;[{ùq»£Îÿ~ùõéûáûÓ×§¯§ÿ~2ýË‹ó§‡Ë'. þë—>ýtùøÓå7??ÿ×é§ÿ?ØÃžþï‡?üñôÇŸçõÎá×§qêÏ?üÏåcOÿóö§óÿ?ý÷þyÚÂø²îù¿¿º~›µï¯¯š—ß¾Š>Ö&×M£;cOûìNàø¿¿<ýõ´Úu­æ8YÓõco‡ÓÏcÓ^þ7iýÓ'×7f¾<™ŽÍIŲ]“ò$sy÷ó·‘êœ=©!?ÒœíLƒí±ðÙ_Ä^°Ö˜cw’^oq“9ܾK%ûL&‚×ÁD‘–À÷Ù‰¹\Š]>øúÄ}–BI3´#ÀÊ¡;#eßtæÇ­OÇ0”[O z2ßë­w>Â'Ïð‰D„ˆqÖÉ|Ý‹0ÿY oÓ@Ùma75[ÀÎ6Ág1®~†Pà;èXÌÂ|>…éÞ«ú-îµmüÏ6ª|‚ßÁðæÜƸšxZâÆñÙQ;¸ñ‹]Ò›¦{Wâ錦|xššˆú…U¨@éù”¬~Ù/é (Aaª»K8ø,8G‰nm>P3 @[ƒ¼2·v>ÖHEST%ðj˜VfF§H+mÓy§v­% ßšÖ§YÌä×Ô5Ú;P±b¼B0û€þ0ùЇð²X`cÕâþl8ÒÞù¨}/Îõ‰÷òæé̸Ⱥ·ZLQX‰ÇrcÖ 0}~ѾÓî)¿Ô£5¬¬uníÕd…ÝmýJõ›þí•VáB>¦o¸5ì·Š‡áž‡$wߪ·œã«æ¼h¾”˜IUg$˜aô;Ìä#ö´Õ&ìÑf²_É:¶>h#’ËB|ƒ:Ð_ÛÞFŽ£¯£Ü›,œL 9,ò|Ì<Vz>gðƀÌV%)y¶ê*ãâW³nù¤õOäËVˆ ‚4+Ã×€w°êЏšêI–ô ¶v× _•XUqYˆÎv­OuØ:Å$,‘7TvÚÆxgÛ½²ÓZëm™¥ì|a¸.;ü™ùi^î4yÚF©rKøãºוsD4>{Ú<¸Dѳ°ÿaí{š0|¶¸E$ô† ZÔs££ESRÕ2¼0í'(«pNkNî"0Ž„¦kQJ©˜ébh¨¥#_1V„§aHs\Œ½8ÃZ¢'Ê&ɼª¿ˆsÉš%p­FxG¢ø¢ûÄ©"ó•%Ι)³¡‹g 0<®]?+>æ8˜r™1gX¹ë¡^|ÐP¸öZ8ñ?!¤Íá׸€Â·†\Á §ë/Ú%o`èýº ò†¡ ü3¢Zñ)«?BKZÝBp|KsàNHÂeɱƒÇÙ-̸±êÆók^Íën¶ÉwrK‡Ê–ðÛ}Àk2>¼ CÇAxµ8cºzœz^×N‰0N2dk]¯f.raÝà#x A¼Šà·®?Á^;~þÁ­ï¬eú“’ ±'³µ8¡wÍ !ªˆèCë‹Eÿ4Ü„ë|Ä\@hrc½ˆc}ˆªÖ”p¹c`î?Ç‚’Yè'ë±ò$ËSd¯XÓÆOpVbP¯,éŽ !ÀØb(¿‹ÔÍÞÛóÔCÑÿÉaç’ëŽÑ檯|àsÌpB„ƒn$&ùd$ ÚðJ0å¸Î fùúÍsü¢.Ã2‰1£O²-'ÞŽu`Æü9¨™oá& ƒæ+˜†ö*’ð Î>Éø©rGÖùr¤¡vC$*›~fEâs@/…°éUªí§Ôi'µ–÷A¸%Ãô•‹Ï¦)%ö‘Ì$¬IPtB¸ŽEP8u‰ƒÃRrܯ,jÉÑg ±*üWÓc$<17@‘GaÑœ,BTž¼ ÂÈ‘L+ß a‹%M$N@ŠË^¬¬UBS¾@³Â¬už´*u»µ“Ñ t=Ùc)ŽÇqjú$_ß´¦[…ñ~RQ”‰„D1ÈI7$d|ìr¬kT2Æ|ÛŒ;¼íœMçÄÂ#›&p°@õ Rnüs&¤ûç¤éme¤î©-o;uŒØEŒ>,PXŸ–éö âM<^€UÔôþseòSÚ@ŠŠf‡DüßûolE:OáâX¬Õ•±aîòDCM`^•F„&¥£PðÝ€Mpºvcɵª“Ï5˜·tòÙ™Ö-¼>ùÏ÷JuY6¾,cå6H(ð Š` ë Îe|,ŸÜeU{¼üEž5°¢—±d ½2*¶^üU•¸€yÚnUJ[zÇHc%5” .Û~u!™ë0Qš uRÇd+a9X•ár)콯¼œlKŒ±Œðå ¥CÇù…›©lÒnÁÄC4@ßz€Óà€£—Db­»½h7µÐn¯’‰PgaΕ` Ü0Ç Ö ÜgNÝŒŽ»ï0Ah/g1³E®…C¬çïÅ‘ÑÚ×Á?…œªœR¸Hã7ØÞ ¶¸Þ WHqÜ­œbIN©">†Û³èy ;,TÝÈh¡¼iÕKï‰JÁÖi!Ûâ«‚GÖ2¯±ËPÊÈQBú§—‡§âïää¿z;1a&ˆN¤  a•ûð}OFEÞȆ¶2ŽTºE0+û×ñ½Êm,1ÅbÞU.¡ 3£ësN·"Ц…+T6ï=!‚c E¼÷ÝB =¹)!¨¤9)Gµu£ñXfNW¤œi²z{Ž~’Ðý©ŒŠµ’È]Á21Ò^Ã1%lïÒ­­":?‡=•)(åuHßóçõd¤î—‹LK[{þ­dNç̇÷géD‚k®EM ~”Ì©Œô$%ê*=`ŒŸ’A³Ó2JoË5»J NK–ÊÃÜ´QUÝæ¢g»4ˆ³Ÿ’@®[£3÷Jf’ŠDÜW§5 ¡K¹°ý·y±¾:Ó[_Õ¯½ád<2ý$òÕ¤|7œJÇPè ) Î1Mxô äÎàˆ^N®V!.Æ¡ÅЇß%KWBZ¦€Š:±ö“ÿ˜“ÑÁWgT;n™Uê‘mhÌùK‚z:7Ýn>ŸXEÀz{ЮŸ~´0ôÛƒÂV‘¦™kM&ií4ìIûÉᆞx5÷̸SŒ!Œ¥ñjœ¦³‘60¸E*ã~ð-Ì7W†ÒÇq¾Å(ÓN®&{ž=óší)O¥³Œ s‘Æhð~"ܱƒÕBÝ–ÒWÌžÞ-U~:™×Ús¿U Šƒw7f·ŒoV"žFÁŽ/xóù/’9ÕWG*x¬ wbí»¹óËUh°JõD³ºIÈå“í0¿>^U·;Íîë1Þ¬ª;ñLyðz‚c˜“:¸ž­_¸Ö0!]™“*QK+SL˜íNhª"1Ç®‚jGŸÝ³Rl8úźòžƒÎû•ÍÉa6 €©g¤xK|íûå“ï8BS›C˜éƒy!e䂸Æ-8“p¾P„ʦ#±¦Oó_íÚ—5ÞÜùâÑ (²¹¿ŒG„‚a‘4ìP2-z‚![ ¸ÉvÇ ¤vG°[ë„P©²¤tÇœ ‘vîæôœÁ‚WÒwDiðÁ¹aQ. 2h"$!J'? ¥2ô'Ùq·8³RB•Θ'ОKš“dæä–7a«¼ç ÿe¾ÿúók#ÍR¢M%g¹.†Ö«ŽÓ3ÖEd¬h 5%Ý~u£ÈijÀfÏåÖ 4EÂ:혥$Á ­'Dr\-!WÚ, “`àô ’K±nU2Zsv³dÇ^ú„ibr=$Ñ $8x(•KŸ7.Sç|á"âÆZ·<ßmžJÉRƒÁ ? ΰyZb0N‡O"éÌ0]§ GV‹—%@¾ï¤…[°Z{Rf§ã2µ-åÛ× \I¿»õ¬’p†<تMÈ{µÝ„“„"V:Ã{EHÉÙ½jéÜáX»ë;rŸ†ñ¦‰³½'<”]œ6:¢Òî åT)}4½–冖˜ Ûš•î}ÐÕûÉúš¿P3ÜhÏ$V=hsEÜ-H Žl'$AÄÜ]ghÍ”ÙÐJتç.šƉm­—¢—!ûÎIx#H Bˆ°tÒ©é c72.¬Tž9'êQÁ9‘9•!F„ì¹Hƒñõ¢m²è4»òt­G{;òH&æ­bˆ®fÙÚÁçq|Wµffób~^ñ!CiÏ M±>ï ‘}—Bý\?Ý&sÕŒŽà› ¨¤ ·ÎøªI«Þe°³þ7%5>Í;“¬ÇÝ¥÷7=”«Q;aât»}Þ¶×á f‘ÍåŸëf> 'Í¢:÷¯†ßizøÎ„Þ1W‹Û³Ò…ç¹`îxt~×Ì€‡cx¾ w"{s ^ùþ?¼ƒÈwà“y×úÕԾƔ' ¹ŒŽˆŽ$+ ½©€Ð5cŒCï‘"®æ£Ä ED2cò¯ˆÑ³žêDÁoUÖÆ™œ`—ŠM3rpr Y“’.ÁQw9ÖBúð¦„Âßô˜ %ÿ“`çø Æ Ã’’DoôìÁšªè7å™{P¿Q7³·d³ÔÑ‘Ìv«“’à±U—Q&—U¸¿U¢q$÷ŽãD”RåÀ‰¾Ví` 1 Q‘Ñ+„Öªë¤Oix¹‹Îp‘$"ãœwi ®ÁÓÆðt"Î<¡gøž÷„ËÔá<» ïï-2» Oƒƒß™oAÓòFŸ\k§l—k14öÕÅŒ§ø9±ýtú¼·ŸÆ0°7ª`L|‹ð w½¹î=%uk–nU÷xWºÇ]F#«VRµ’ª•T­¤j%jZ 滈‡ÚÖ­ÃjíI™vµ#ƽkV5rãn•!v¨1îÎX0À4ÃØu¤;%ƒÎ*Gáq”vñ;ÕêüwÉQ,S9Ê^t”Ö(alå(ÇQö ƒÊk¢¼f’ÖÖ»{§³  8ç‰p!ŽÖWygÌ'Žon¼ÓÕj›÷È7* öÍ;YwŠcëð¤øI„V)QLJì£V¬ík­Ø{ä'%"çáäoà'˜¶qÜ+3Š1'§Ê)¦œÚE«k]Ñ{äÑ'§8­Ò¨J£—“Â(Îs/)§\SkPÞ#®0x<9ñ 1`ÍN•âRb94ÎÞ÷ÓÊ!+ ª”¨R¢J U)ájÕÕ{äUJT)±)± ×ךÁ÷È!+ ª”¨RbÿRbÙÀn¬u ï‘CVT)Q¥Äþ¥DZ6ðéßÃ÷“88±úó_˜ÿøå׈|Ks,_£¢%úêªLûƒ9ã†Hj'ÓÇó)mã~gßûñ¶ˆqÇ d‚«¶ÃqíÂ+n<¹\AÛíôò¥ë“ tݱo^.ÁG‚[ßá;|çÒÊj°GÛ´çG¾È¼µÚ%‘äío>Á¿{!šñÆ ¿ wLŸtcïÌ7F9û¼·ÈÀºó϶3Ã$ë{ŽŽx5Œí„ñ3CLº9 f¨Ü íÌâ&þÎgø•YéÎÅ™qlú£Ì8xÈÉÞtðÉ›~m_%yøáëÓ¿gŒC endstream endobj 8699 0 obj 5741 endobj 8702 0 obj << /Type /Page /Parent 2 0 R /Contents 8703 0 R /Resources 8705 0 R /Annots 8706 0 R /MediaBox [0 0 595 842] >> endobj 8705 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8706 0 obj [ ] endobj 8703 0 obj << /Length 8704 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ÷Wô:€Û"©ø ‹†/Å ‹À“™`r3‹ü~Ô-ÝGÄ>”T¢(J:¾€oÛ§E‘EòÔƒUÒÛ?}ýûù—ßÏo?|ý÷ù[÷ûÃ×SvÉʬýs¾þ¼yýÚ^Œn?V¶¸èúúçüíûéñüxúrúÒüýxRåíÂîW>Ý¢mð÷o¿Þ¶7?µÿóõÃ_šOÿ=ëóŸ›ýzþñoͯŸºö®_ø~²uyýð¯öƒÒJÛæ¯?]Ážþú‡óoMì­ÝëßoªÂÞú;§Ï—ªÛÏëKÑͲsWEóY)ÝüU4âøÏ?N?7­=wãbK]åEV[øyÌ*Ýܪ¬ëæWUž­ÒΜñŽkJÍl¨²™ ÒЭGjÞÐT–Wþ¦BNGUÛV†&×ù\1>µ5SŒ…ʳ"ÌÄ^{¤fŽ­›;m} ²ƒõË~ô\øþáôö³Ê½ÖÃÏMWn¬×þzh\œß\w²ÊÏ?ÿ˜e*ÿáüð멾µ¹nðÛ÷nHV!Äs†È{ˆÁ}$}«á5!^“}†×À‘*Üë’2ˆ%Éx²OrÃH¬ñHd-‘î›Á{÷KÏÂÇéìâ잟LAÏ\öÚ´­}zhôÊâZÂj‰2$e¶– «ÊXUÃñDeÕB“UÈ(”AÚ¬*šSØ7vDq¯'ãe‚{âÎ=9¾œs¼pnÍ@^Ó=¨9¾Øœéɳ‚&L1ž7|cÜü„K6ì’Êú“WlÞmD"‚ ›‹àÃâ*ÁèžNÀŒ!Yœ1jw,BýžNë­ÏýoôU€»T&èÌï}¡¹3AÁ@˜þm:òL–d_½bÙ¼çÅÖYÎP˜ øÕ…uî 4A GÒ^ð«úÓàÆ™`_:£Þ…x :“5þÚá9òÍâLn‹¼ÇäX¯8ƒv'L –§P-æ/ÌŠxoâ ç¬G?ôE7º+¤ º¬¿š=ÞÒàhÜ­áð&îó2j™JÜÛ—'ó‡U_ÎJ,HŒ¸Æ†#õ ¶ÔZǶ¾Fàå¹+Ñ1·úûkX$!Û²áyå½Õ‰ãWúBöÐ`ŸB'øx—_ã4Īp¬¶Aeâ.ú ªbÈ®[ãÊ\÷ígŒxÝIBX#ÉC<>ì¸ †Ì“rŽ4渺s”‡($>¡‘ 41ÇÕX&„àèDI0®móŽo¼oì† &|ð†œa(OP/sâéX®Hw]Wµ¦/íôŽ#¯ñixQx&xh%Gð‘_Þ>䬇 ±š ™Eˆeµ l‰Õys­h§—_ uöôP*ô…¦„Ÿæ8V<ë® º¤Y(aÒ_f¬àÁÓ‘l$±ÛX>” ’3]À‹fÔ=vEº$ûÊÔ‰:O±ñÉò;¸Šú~°èÁéã2IG’xÂ ç½ ßkuÙD3×(\ölg­„³ ÎL"[6‰rÄ •`|®/)’ÄT ±Ëô-™.QÙž*š’:e;lKò'\%1EæDUÛyçXfD¬F`ANØ‚© oΨŽ}¯ùù!IaöxØã„d´gÄåîÏ‚:£Îúæâ”g‘àÁ.|ªTyàÉÞò[,ÎñTh,9~òi_©=þ±onPΉ&©y‘(¥ÇÊ!À ;™yÞŸÆÅWŽ*ú÷ ›Ó¼…xõ Ú W@2ø(d›©çÔ.ÁNSŽWàG¹°5ŒHzòÃ+J!”Ã9Å×ìîÑÁuD¶3ïÑ]‘ð“„¹öö8t. B„Èž‘8ú£~ÁîúHy·†-yí aï½!;ÛƒØÚ§Õ‡eg?×ï‹#’„­ºIÿ.íH„‘Z¤J¥£ ¶‰ÐZN¡µ×òUºNfî·‰ãÖ*·ÉŒ{›HÊ1uÏ«2±gOÂà "ý"Dˆ¬â§”U2º`›ˆÄOñœÖF:“ÝÖO)°®Æ6ÎÚÙy>–ÎÞ×?m†4pDOü%ÉP$k÷@rvfàþ‰5?úzQµ^Éz!"[Ñz¬eJAë¥\Ë´ÝÊÍÂò]DVdâ(«¼ÌX±Gd•Uñô@àe3ÃŽ";GâXš•DV´£']à »"ž÷¥Â¨Á±òGÊœ•D¶ÂªÇa;²ê¦Yµd%*‘­°ª(J%ˆyö³à½”ëË:«Áû@©è2Èš±6+/ªR¶ê-¸íUûšÇrøùËé3+z endstream endobj 8704 0 obj 3495 endobj 8707 0 obj << /Type /Page /Parent 2 0 R /Contents 8708 0 R /Resources 8710 0 R /Annots 8711 0 R /MediaBox [0 0 595 842] >> endobj 8710 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8711 0 obj [ ] endobj 8708 0 obj << /Length 8709 0 R /Filter /FlateDecode >> stream xœíKoÜ6…÷ó+´.1¢HEÆv tQÀ°.‚. §i4AÝ,ú÷«Mb#žC[´†¼”N Äc“züH]Ý#ýtý{óççæìüúŸæöðýüz£¶ªSã¿f÷õêá/LØZ3~ôÁmM¿û×Ü~ÜÜ5w›«ÍÕðÿÝFwû‚‡oƒøec…Ÿo?mÎÆoÆß\Ÿÿ2|ú¯1ÍÏÃOš·¿ ßÞêÛýÁÇMè»Ý‡¿ÇÚh†~Ú‰m~ý®ù4ìBØ×»ûÿ•wýþo^²w_‹êý×âhcªéÛ^ 'Ak3ì§>ýûÇæýPÛ×ÝØ†ÎøÖ©>ÀÏÏÙ’7æ|†o¾klkÚG[ztÀÏ«K¿¬"§[忍hÜ#ýÂcÓªõÇ뺚¥Ë˜û.s)øúfsöF·6ìFÈÍûaWöÃlüv3°k^íºŽ~z×|¯”nhn>lú­ë­w㸤BåTŠë§—Q)æGXæ*x¯ávÔåôíè®ô¹ÆŠ9Ÿ^¦M9ׯ‘bá¹Æçí°—7SONȶÓZTÖ¤¤r=ä"!Ų bZ‹Êš”$Búé£ÉÀí¨7¥ÏAye^BjÌA;½M1U Þì‘Ö†e,œwSú¨€ãÁWgp¯³ÎFÁ‹TÖ¤$E4 Ó"ëuÈÛÈê¯!‹Ÿ·ò³‘hÞÖ<d!¾V˜ÞGeMJñ 8j€W¾ŒÐÌ|ý£-˜ ÷kbmœ˜Ö¢²&Eò]¾™·¹ŽWòxeUžÎ9SU'Ôæ`m8º·ƒk{jßò¸mÅŒM*kR$ÎÓË;+温¬Iq³*‘Ù1aÅŸëþží©P¡²h%ÏüŒâSY“"9ž°žÜ»™sâîtⳃkËq5J‹i-*kR˜5,A!!Ÿ$¤‘ÓZTÖ¤0kX‚R>k8×~鳯ÒáF¥3cV‰OÂÎ<´st«Q©†vxœá|#<11;ñš«ÊëülÙ¢xõ[çã6Å-¯2²®.=ýXTjámd<'Œ3׸ ì;xžÊJUKg•j¨Ê¬TÙTÅmšÀÛ¬ttQ©†ƒÌ#ÀA摞„Äž>)*Iœ§—÷ô­,W)Ÿ«‰cÝ‘(FÂݳ”• *‹V²Ì¡^Óq´\Eòuñzò€f~òQBäßûJºÓ/µî-]dËU˜Y(A!¹NB.GÌr•¤§Ÿ©é#Ó.’ñWüìÔI®ò1¢¬|òô“,WIâÎÈOèå)ùýåÏ[y>Õy¯´MØNÎ{¥¾—Ó+¨H Ýz26H»Œ´Ãn›‹|´ Šå*hGª.ŽvO®ÓŽÕ†³ÌsÒ®eF2•"$žU‰ÐÒǬ"O§K¸2g^*Tž­ä™ù;fÀS)2óóþŸefO&~÷)~ªl¹¤w]%¼o>ç=ÃèÅ R·Yzy¯˜-M¥H/ÏOà“ë©P¡"NÉ3¿z ¨\ÅN«~ÙQ€íy')¾ŸƒŸy("Ÿ¸oéw R U‹_ç,M™—ªYÉÕÑ A¥rñÉž²ÉÅ÷ͨä´0•5)YïõÌ´§R¤—ϪDÖÌ=¥B…J=J†™جæû@¨\ßN*ÃÜSÙQ¡™76 û-KÃf-½|T R5O/wô­P)ÒË3E "÷Já|–ôNjü„|•€ãðx¯g}%ãT¨PùFɳöðôpQ)¸ÂžT†ï)·àÓ¾Tíé¤R U×C;RµfªjM§•Z¨y~¦*váU,ŸŸ«MJþmBZº®¨ÔBHº®$2â]ÀÄ)¼=Vž«á^g]ß::ϨÔBï¤{º Ä/vꤷŭk³ð*#+½œ6¡²&Eò=)¾K#ZFð»4j}sÐ@â@?#•‚$ÎÒË¢w‡J‘^>«’r­V>'&ߎ * Ìq5†.2*W±“Ê0ÇUB)*Õ²xTgiJù̪ȱç> endobj 8719 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8720 0 obj [ ] endobj 8717 0 obj << /Length 8718 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯èsËâS°½v€6CCàÍ&Xdqö¿õHÝ=#ê£Ä7Õ]3€§=ßˆâ£øU±XE¾ýã—¿ŸþùÛéí‡/ÿ9}›~øòÔ6­n§¯ÓùûÍË_ð¾|úØõªáÃùëôí—§ï§ïOŸŸ>ÿ~búùÁùÇ^^1øÛ·_ŸÞN/š~óåßÇOÿ;ñÓŸÆÿý|úë߯?Îåÿà—§~Ðçÿž>0Îx?þçå§3ø¯§¿üîôëX…þ¹Üó¿o:ÝJ®tP=¾_eÏß/E/kOƒj•à'ÆøXO5vÇÿñôÓXÚµM¯y'U;ôðóž7uü4ÈnèÇ> É¥ñ&£ÁûÊba)&[£ ©F,°m¬•ÝFYÍ ë´ìÚÝã<5´kåÔPÅCûìZThA½ŠÒùSXXÓ¦¾·q2(6È©ŽKQ¡½È¥Ž4ç±°¦]†Ã(êsòä7òünyðý×§·Ÿ˜ýYW|ýi¬É³Â™~|›«NoÎ$*GôÇÓïÛ–É?œ¾þü44jš4!„¤BÔðŒ|ü:΋äR>ÒC-í&$º$EEð{ø€öD>B¤wG,uû@!„<$’G‡ö²Æ'$‘5æô ÖSü|æˆàZcM‰µ+|Ó¥ûÚG‹ãg$ìkÖÂцýÆß{ô5®5ìë¹ÖY˜K·¢š&¤æzF!æ:4sq^ÍRs 83Z\ö't¥û <—¹Êûˆ²ò“dÕŒ#!UðÔ›>R޵°ô˜ˆ?qÌiÌ£4KÃö|äï™ë–‡ít=RAH lÙås'æÛò=JlçÇvJÈŒäa»n¨F*¹C¶#V½;¶ÃÏà÷lò`¶ëXWÍÜ$ä‘\ÑK˜í°Ï #>+sŠk"„Bv#y4¿ xBŠh~Úÿ«‰»ÿ×ÂuŽ5À#'|âTàzªŽ˜†NQ.!ù6”w-MH)ÏäO°ø°U=‡q3ä5 „BHý>PN!­X·Ò(ß¡n¯ÞMñ°²,;Þ8%£ g”Õ@Èa¸³øjæÞ¸Ü™•¹å;ræÂv€%Žî_Õ=Ë[p0—g¹Z2o°Î©bG¨WõŒ0!„äÜê5ÅÓRDÊ£"{ƒ"L !„ã y4ßW£ y$„"Lk@rE˜Æõ àÑÆ6[N¯ÁÐRÆ!Y5”sÊN!¤ˆ”gòXöJ¡>³Ä³`GEàUöÃãZã÷à*}Ψe E!„Ü¡ßb”©EHA Û麠n¿é=³ª¦Ì@BŽÂªÃv·fÕžò±9 «ZN ñ˜+–NI·•VKüm†dcÝ«-B ¡¬«Èv'æAœAR ß®•†u5¬uFû–µœ2Ï9 {{íéz0~ùÞ9&{ < °4WYyPÖ3&„<Róžݘa}¦â3{?'D5s“GB2Æß²¶£ÜBŠHyTÄg­VÞWM¼!„r1®¬(‹Œ‚V¬Ó3ãZƒ?Á’›5~ —–ÓãÊe r†|æ"†¬†!åIr†,îÕ¹7¤|d•åž@ëïá÷«=JŠ)Ê­"ä(LLY50qîÌÃvå<r¶ó9™ÇãÄ wb›ëëüÈ1¡x|°õGG/ùdŸÂUFVër  *B÷tûKÕ|[s6TNVåŒ2›9 «RD¬JýI˜XÔ37 y$$gD?—”·BH)ŠX´#EôB!µ!yô»¦Œ=B Z±NÏPD þŸÛ¶,Q©xW ÛR}½:>uËêóí)늣pôãp'q4qô…£EKy_„†£‹{¶î ¡¬†¶’¬Á)¿Œ£01e5ÔÀÄÇÍj’r¸9 ÛQVClGY |«)‹ŒÃð-e5TÍ·”Õ0³jO¹b„†U)«¡V¥¬w&ixX£a®ŸiXÊKr¿6 ¾nò!³ûW6Z ¸4¯gøÌ$FL4ëÏè­ÖSiºŒ«×íÁÈTZßH¾,mÕp­4…LÂÂÚfŒ‰¹‚àÌj{¥¸æ+Ž×ÞÃaNÀTÓ³E­a ØTƒ®Cûº8÷¨ìëÍD˜°Nd;M‹ë­bz%c’ú\›%‹ËFN“wòq#Á§~¿! =çgúåx÷{ÞÇç!k¦ÑÍÜÇÆÀÈÛ/ôâ}\ÃV,ŸG¬_ ÄZpßàºâÒŒVø .ÞáÅÝr¸–ýÉ–¿ˆ2l^=íÐ,©ð‘O£×6E˧Yf!ûkä0læŸ.[3Ûwk<™÷+ßî½ÆÏΊñK•‚DÚ…<„÷LM©Mz¶P'³¦´¹¥s;(XyàI‰Åʃ8æð‰¥HÎRÔôKëÁ`ËD6dÖuZ“ZSñÀâ¥Øê—‰¼ÞZfË}›.‰Xã‚êõ¤>tŽBBúë½ì)ÝV·9F»ç]¡Ñ®Æ”PB.$$†û°$)ƒúëA¯ 0œ-¥&ß‹·àzGîuþi9ÊÐè0Â\0b+d÷à2%ÒÃê1g¶²”–”¥½g*ŸUŠaˆa¹«SÉ!!æbXHqjʱp÷YØK‚úìi¡ø:Å5n ¯–¼½µ¸t£x׌?Ý/v&Ëø¬Å}<ûÓc‘fMlÌ@ƒ+á{ e´â6*âïŽN8T¯öÓø£˜¶˜¤ÍaƬ }‹AnÖ(ªÔMÜ Ÿ÷a¯*6+Cfå}¯D"ñ‘ƒçÞCGXìšméó$¯ñóh—etðœÙÔAÞô%ïß{ò¢‘ä*‡]·Ð9©­bc%ì PÀP¥÷¨Û ¡õ,}Œý KÅãc85ö‹ô 0í¾ãvî…ßöï¯íŸ àÎY.Ö¤‚-Ÿk¶ªë¤¹DûuFЗÏÐ9,HÌG¼Œ‰eì•:ìJ;4k¿Kp;F&Ê2ÔeÁïá¾Ü¶x-ýº%µ0õb8EqRÐ 7lÑQ(2ͽÎ)Y¿[Ò¾Eªp1‚' ~f?ÿ' ©Æe™iÙãjYóøøh–‰.Sص@;œïЦ rtìo©‰úYÏ#a ˆ3ÇÕÁ(Ø4!ƒ˜Ê‡3÷ù’4âE.ÔMˆwˆOL;[Åô¿s£0Ãøz@¸Ãü§ó¸“ÄKŠ£„Üx¸qâLñL{"‰…-¦e³RaðaIQgä9 ±«)½"À[B§Ô¹üBæq>9ÂQÙ0ŸŸbÉÀ9ø\¦-$!£hf0Êv|P†P‹@hÓzŠ{ì6<ÐåhƒÛ±nÑSñöv6Ž;Ðí5¯üq>SýgVXI´¿d”Sý-GÀÒØÅz1B°P / @O§4,•ÆÚ{`Ý,5(p€–êueV¼‚æjÐcéá€I‹P×{ñ>`á®Å7ªIì¯(Oc{+ÀA‘hyY³¡’…gX.RžUaJÅ0Z9¯5Ã}-LP22—÷…I³~9¯·C Úݦ‡)Ty¸ÓkM[zûd¢[&š¿âÌàÂè™ÂÔ¡ºEÛÌcsÅ‹KêUÆ YjÔ¤Ÿ´\÷£´‚¢÷="B‡„Å øla逬‘x÷?‚3ɲb27›÷h±¤²‚Ë9´x£«Ç»…bØ-1ì3˜óÍ‹¸ÖtbíTrVíî¼Vņ7 Ÿ;ò¢Ö÷Žåöz;ºqKE´XÛ²¬4Ér,ãûhk–åšoÑ­df ×ý,ËxL0WÀž//÷Èp=7Ž4»7¥BðÇ“ x+¯E'c½‡oƱ¨Tl¸.û^/«‘ør(Åïß_òJ±ÚÞ5({Ù%úê6ô–ù‹e"˜S[¸9Å“ûR8“‹Vo;hÊó¶’2¿œÿûÃû·Ó'Ì#Ã5=5ªÇ:Jª¢ÃUIÒbsÅi/š|Ñ·–ßQtd×uµZHN¾ËJ ¯—¢MØ"š:±\}à%Žub©Uå0~»…”¹ÜzÙÅAiØ+ Ûc©›‡Ï¯õëÖyE?´ ‰f}럋_¢œÜ76¡tD]œ†=l%ñ–¶?ÒõgJo€¶&Kñs/Ï¾Ž \“Jñ»G’¸–ï3ý.¥6Žsj[ùÜw’ËÙ`YN5dbA¯,ù1Ôš/ß™!ˆwËwzÜÎç–$'r€¨»\EgLOŸÕ¸w§lŸ‡Tè* Rö5î5Y”X²°ÇÜ'_9ÀSm™ÌQcÔËkA‡iîsÐKríÁZ)‹¨ N~MU$eƒ‡#Fò>TÆ0 ièpƒŽÇ®Ó´TZÛ ™O{P—!¸!ïà¿G4š3 ~èº×#ãä7Äi»-Ž6ƒQWØßj‰Ròˆè­ÀKœb‡c‘ðô|Kî,Ñà¸=>¾íÇJfŒG½]Ÿ-$GMyËÔ¶$bATTÄÂp>QªxcöõàÌp„BÈ]#yô”¸|Rœñ‰(¬?<ìúÇSå(XÖ)ØzÇë¡â¾sÝž9`ü>}'û8‘Ï0ÿøö‹eö›´ÑÞh㳕8¬n_Œ¤OllÆÚ™˜ÓÍt]Žh¯Îži¥u£×Ѓl Ï´°á]Ó­û+»dòSÑðaõÌ&¥=ùnHßÓÃgøÌ4 oFÎ=CKÁY+mœ—¿ùþíì Ziá'ôÌìðYCjÇì?ý‰¤; endstream endobj 8718 0 obj 3976 endobj 8722 0 obj [628 /XYZ 40.7999999 382.099999 0] endobj 8723 0 obj [628 /XYZ 40.7999999 382.099999 0] endobj 8721 0 obj << /Type /Page /Parent 2 0 R /Contents 8724 0 R /Resources 8726 0 R /Annots 8727 0 R /MediaBox [0 0 595 842] >> endobj 8726 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8727 0 obj [ ] endobj 8724 0 obj << /Length 8725 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯Ð9€e>DR‚~Œä`àrr¼Ù‹x‘Éò÷£n©gƤ>J,QÕM𴧚ϪúX$«ŠïÿøõïÕ?«ÞúúŸêÛøóÓ׫™fßêü÷ÝÛ_ˆ¶–bøhZU‹îü§úöýô\=ŸOý¿Ï'®/Ç=ñÚÄPáoß~=½? ¿ùúéÏý§ÿU¢úSÿ¿_ª¿þ­ÿñÓXßù ßOm§Ïþ=|à‚‹¶ÿÏÛOgâ¿Nù]õkß…öRïùßwFs-ÛfU?ž_ŠòËß·EQc¬ê”`M[q.ú~ª~:þûÓÏ}m/ݨ[-L£X×ÂÏKZ2¢oŠwMSuFWJ§!g¼Ëªâ++VQ*ºôˆ¯gñWUw çF7†-fò0L%ÇaªµSÿZÕÚŠt«ãTtî_7´qê=UÅÔa¤†.åÚÁ¿Tµ¶¢Vwq*:÷ˆ¯Ú•¸*²&tZ^†)Y³v ×ªÖΘ:’&œ{Ä× í:õ¸ª˜š å(¾‚ukgQFÒ©š8wé_7´‘nUQlñjC<{ ~|:½ÿÂÙžM¦§Ÿûž\ì®áÇS?\U½;ÛZTO?U¿gŒ7¨ž~9uµê¤Qƒ¡V(óÕjk…=@ÊgX›Þ{ö§ˆOáeš°ÌGÈelçá©G€Íõ¹åÙð䘒>›pݰöeï9ØŸ’JŸ¥„\Àr€Ñ[Àv`¯””¸ÁY>¼?&…‚ K¶ f` A‰ÝÞöÇšžF7y—Íü“BÒMˆå®3XŸ‹{M—X7±Žå U¸ÿB.Ü:&…¤éP’<šŽ×ÚTí@|¶ƒL„BM;FN¨MÁÚ0×) ^?>'De²ÑÍcRFDIÃ-£³÷1)**ŃVK"ÕYFßB)”B¹iJšuªSÙ þ1)9ïSîçv2ç[CŽû–ÅY…àM6|<&¥xä@É’ê³”Ùð䘔â9eÏÌS¬é·åÀÃmX&w?¡Š?â;‹â‡ eƒi4ÝOÅ4½x5d é÷åÕ º|¸uLJΧ…Å«Á[¦x5l€(’È(ˆ’†[¢xµ­äVTŠ­ŠWC¡J¡äFI³N5ÅW2ŠU‘å>å~nNËæ¨ÏºxÓ¦×çûѳ¢Ï‰õ¹-^‡;èóî;¿[£ìï¡à¹ïÅ܆爔;âÜýV¼wØ ?„ °&®¦{úfê³(Þ;èsñ6È@ŸïËÛ iŠáš^¼ 2ÐôâmŽ(€“† pÒ]堜תÑmßøšºz¹„2L-Ùº¼µÆ:ì™Û×Z–qq­öõ«ÖW™¶ËÂÉaJU-EË…r•aŠ20ÈÔ ,SsËŒj?5[¸{€îÄJØžSÖX¿ÜÃY)¸'xäP,œz&ÖWÔYÃâÈ»ÅÒçé<žO{XOãíbË{ä̸SYkW†çj¨GNö”l9OÆÕÊ#jÖ€‡E»1†+ƒn­¥Á ϰ ®Á¸Y$‹7-\ {f}»»¡ i¦ì™rÔÂV~bXu‰ ™ãóq³ûÚŒâV·Ó?*ª#™X§©@~¬VÖKÏj+ ^Ϭᮠ§sx÷Z+¶YŒÁ€ecTä »8ê*g@Úe=ŠÃTÙsíi;aᆫá„fÖ<ÚvÝèDco¶à=¡ç¤ï̶:tŸ[B°Ñ)KÙÏÅ0FI¢¹5ÙæŒ·<MK¦cs>êæ9ÄwØà@8uCØ—`Ò¦Ÿ¶8ãú˜ÇÃk¥¯¡À©ÃQ|yÕí»xŽZ¥gÂ$û?6!†ý¨ÖY>¸,ã+½ƒ¦?I(ÿý>øÚj¢kÖýå¥`ßÈû¦¹;ÞßVä!IZÞ¨$y¤"­Z$¥Š™Ý§áæGöruÝàØC£íKEûzÁ½×ò3·ìüư¡œ:n†3Â> Œ":u€I¾g¡òâ3å×—Q˜åô,àÐ×9S8"sÕ<¤ƒ\c¬¹ ì¿Î0¬ahÇKޱÀ±Úq,)a»åñð&,Ñž¹N¸D›¶»íYœ¢`2,哎›Cž‘â >¢À¦ ä%fŠd%ŠÍ"E_à2Øë÷ oH±$줘ߔã-¬ )ÛÂÈÛB<£ãÖ ÉšÓ²v¶§w´æPâqm,¦>{¶í´ÃRNŠi+ëGìõƒÂ…»9œÍ;…™—òûÁN¬MÅ^/özîx[ìõÛ;|O¹4z^ïg-(vt±£óÀõbGïlG÷ÀÙM§ÐàìØÕ»E¼³áÏk7? »ºleQpmž2–éP™q ¹¨µá?\`ÉÑ[•Õêr·è(f[7ã5Ü‚vÆÔý\Z`¡ky¹†\T?pŽ9¬í3Ç(ÚSã Œ?ÀvuPµÐêÇkZR`<¸²ƒ2ó%– ÍÜãw/™*phù·kû67$:œâÃ?{'î @Êæ"?$¢•„J‰ô†=‰½Xî(à‰÷sàp\†€‚}ƒŽDkl5$àxsàI¦Íyl@la¬mˆq²•Öì?î›s{HXe· 4$EÔdKXŠ5>t“`Ú(q°8³ ‰÷ËWƒÙô3Û"ìÙ~1Âb¬ÂhIØÚz6þs‡B‹ab-oÔbI›\`KvÚæáBÖS:Vv »€A?žÄÍÛ”ž”‘„« Ï% î5ÅÞÅf¸xP¿Ä’ç˜/]L²dv°{ï1ñ£?æ¤3"óIŽ]Ô1*z®2Ýe.à‰Z“àYâø`“Ö#\LÐéÄ.3$Á=‚‚„¤Ë²¹ |±Â䓎ØsYöí¢+¤îüY(n½:8Õ^.¸6,ò’øRq.D26áKؘ9”MÜÎlΊÐQd¦m™®ùùiKx Ú·MQÞäŸzŒ‰áÕãéÿiŸ endstream endobj 8725 0 obj 3251 endobj 8729 0 obj [629 /XYZ 40.7999999 759.379999 0] endobj 8730 0 obj [629 /XYZ 40.7999999 759.379999 0] endobj 8728 0 obj << /Type /Page /Parent 2 0 R /Contents 8731 0 R /Resources 8733 0 R /Annots 8734 0 R /MediaBox [0 0 595 842] >> endobj 8733 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F8 8 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8734 0 obj [ ] endobj 8731 0 obj << /Length 8732 0 R /Filter /FlateDecode >> stream xœí]K¹¾ëWè`å&›ý‚üéë?¶ÿü}ûáñë¶ßæï_7Õ®j«éßvÿõÃét¿«õôc×7;=ìÿm¿}ß¼l_6O›§ñÿ—jÎ߯Æã+¦ÿöÛæÃôòÍô—¯úßVoÿ<þöëöo¿ý4÷·ÿÀ÷M?´ûþ=ý ´ÒýøËéOûÆmþú‡ío# ý¡ßýÿ?t­î¥£èxy}T¾NE/«¶CS7­Ù*¥G:›q:þûóæ—±·W2vƒQªkMW-îµÓûnÇ?l‡®»6N§ÎØvÛQß52í)RqCS•é¼]©ýäkÕ´}«»ñ羪§_ t㓇wÑC~í*²#S 2(RqC;.ìJ`Œj[¡Exë*¶£ºêhO‘Ì"à®$aÜûÓ€‡*zîz¡ÐtR«ÙØ7fhÇEÀ]q%éÔ4_¦Š豫؎%ÔÑ"7´ãÔ;]=‰h úMKxñ<øð¼ùðeØkDÏ¿ìwÜþÓ·çï3þ²Wº~ûüÓöÕHñÛç_7ý®ªV7=lj©ô¡¥ÛUCÝ5ÕI‹‚-•9´˜™Nž©¦÷¼}ôóáͨãõjá‹«Ç©û·?tV¯˜4¥-Ji[ò¾þÐÒî´ê”xæDd 5ühkO¨ìvh¹<¤Á%ö0 |þb³…ÄÄêÏv¯ $vÏ")f —ÛkNéÌa-¼gãTÆ&ÃIÎp QfÍ&ÍÁ$z†å‘ÇÙ»Î9[v¢èóó(ˆ‰•QÙx/W0`VÌ™Jwc–ÁF?0;Ëà,?<ÀÌMa ðì¯ð³¡¥¥;õtˆ‹ÃÀ­[ú\Ý µ|ÙôrJ¢ƒ%ú%þ8\íÓî™›…fø}ËõL:×'„ýAõ6ìsX’ Û:8ìL2\nÝÀ×`ް§ß^z"qØumóÞ~rØ™"«œsðB'û³59´aF&ð-ƒ‡ˆ ŒAµƒ M_·0`!.ÂòìR[ÃsÊ0@)Ü@°ùÒ°D05°­aF½œ“8›8ÆeèÒX §—zµé,Øs§ÐQe× Ç_„&9ËÍØÙ ìñ ´õx+ RÄ™8{µC"Ǻ“p»™:47Åš”ËçÆ£ÇáYs,CÌs˜³‚Öd”?Õé]Bžºž ç½}ĪIˆ7ÏGa÷"» ,ÍV§g&7½ª-qã~ c×E‡ RF {Zb<©•«ìx:9îÍ4ІuÎ)Öì·j8Çšº=pf[7Ç©œhØFñŽ˜¨¥:â@×X-¸7Ï3=|f@ÏÌH«ê]7ÍáÛ3p<x¨j7™ý'ÏÌl¼3Úî R0³†2G7Â‚Þæ]I¢@= Gªf«›ã´¥ž7޶}žy«Rãåì”h;ýžÌ3.šrx´€¢å ƒG.-—½úSH 8ªÓÁ±\‡cIƒå^È0c¹ã%øÅƒÇ(,XnJáÙ ÛÈ<³ä¼ø¡…» ‚JZÐ#âa¨˜ÎVu Ñ(üoý SBÍåø¬YóJ8#ì@ýÝE’nîÁ³ =Èåý«?ÁÞ8¾=LuÄys”Ã%dü$?¹c,ÊU ø+v¥<ønÛÈÀÓî°³ƒ$A•W&‚ì Î`¥ QC¼†£Ç<"†uº n—!Ò¸äa=ÁÖ¤H8NŠÑçb‚Ã~[Æ !—`F`Å„#¿G%žîóœÉyeÐÚis$æ#ä¡ðnâ’pfŸsra þK’R|„×p. d:>‘TyŽ^S.¿vãñ5B|LãV"8“eb‹—ÇC¹çá8ôBÚ£6JJpŸƒNÐ}mvKsExØJ*Nökv²ËzhDÐ^¢Ê%F%Z3ânTqP¦vPfêKTxä?6tº{p®qOø¦îr òè¶WƒÄ¿² Q£ƒC½ª@[B”¿CQøQäDÁQ;¡Ì ]:_À‰ íÓLt3_xZ½ cø<$eåÄ7OóÀ5A´p’qPnSdrJÝheN·Ì¾@ÐÂhÒ)(1 6›>B  I‡ßÃ1í9-ãìáÌhС–‡“º!ÌIX[‚†èåWxÍœtYÍtW ¯9ô°£ë*÷ýš¹"ÂÑ•ƒ+Ìs)ñn•ëxy®PØÉŸÉeŠÝŸäƒòðemÙŸB.i,Ý8‡TknÉŒV·|Njšà ã1x1a¾„òuÍR”¥ ­ÿh.÷u&È}­ £^“Óù¯O÷³™}?‹L'þø&.òeÀÊ|2GptÊ^“#/^hÏÞ §Û•¸Øëz\ã¾eN\Ý€Ó,§Š1Sx×Z~«1ã«K2É IÇq?àÈ/–;ùR9Wžn¬^GLåŸ$}UwõÒ_Išòæœ tb…UÂ.3¸®ï"¤GË·G“º®Äjîê/V}2X¨¦ N\”ÜJ“k/âvø©SøÖ«ç>,!)%Gt_<=ºHݤê%Ü”º­³ìÊ[‘”1Ñ»"ž(±\ÒiÈ"tÒ‰ªs‚¿ÒfÍ”¬‘GzFVÞv²¸Û¹—iÔ° l«–À 'l椫< \3'­<ÐèúêU3†Ôàð%h•) ç:[j&¢-ÉPÑ¥°'ˆqŸ³³<HÁˆO~ eâp¼§7¼Ú£9!Fø=ªS rÉÒ¼ª-AÄ%ˆØ/Û2ë® î“D,®ñÜ`±Âaœ%ˆXÜ¢*AÄî«Uä¾D|[ö|àˆ¶nÆülsî/φ¹Âئ˜ 9Øç-1%²Õ n+2,(›«äµDV7Æ ißôÓƒò’Ve¨-Ø_oJ¨ëŒM\aÜúN_Ó\:(1ô",{ôOˆ“¸—zmœB‡ÂÛlyjŽÌ}°z©2–´º&I@að’kÜï¹0ÚÚ’$ïX‰i©JLË‘“ê’Ô*?'­=¦Å4%©U~®=áYÇY¡éJ"¬üœTΰƒ|9”DX{™ªÏàJžU`Ôñì3ûµ–þUrÕu¶äŠ4ø,]r×ó æ^Yµ9<»?“QßnTI¦wiTâ`&î«_£°B»6Œxao[€îÑ*81ÆŽåDSã8%Ìc¸ŠGw`<ã±98’ⓆÚ%¶F<òÆõg«æ&:;5ÃV»N]hÍHá¡MÔ_ïÁl™¤Ð!óH°¦Dr^@’µæ1BŠâíåuÕÒ²î–\LÁ›¬òì†nè¡úâȷ께bR/©ÞVÝ{2Ï…¤ˆ¦” H-AiK&4L³àú@0:™E™Hó i„²îˆÈ—H ¸OH+j'QÃÙC '?#ž-‘XiÈI‰3Ê.à rê±”R¥ïl±æºâ äWŽœIVºÖT]'OïÝåÁŠƒ“5ŽpÛcyYÚ5d÷Þ/ÛQnšI$3vK>ÄŒÆ!ž|+eœzSÛ²ª”e—VŽHæIÉ!ƒÃË`9ê&LÌÞ¼ðšÁ¯‘¬ä Y’@tœx:—otÎ}ÊDi—Ã)³ž ¯òð©§ÎÔ´ çJÉL*½jŽý¿µ`¯ÖC@YL ¡ZY:;~Uµk;o`r#=)‰ ¤ —†i`o ö¦ñ3²é7a+¶ƒ<)–ðÊÁÕö”“ÁësͶ - —ØÑþ‚½ÙA®ðDIã¹ÂÉR9%/½áÄ•˜jÁüöýUﺜsÕ¿^šg¥®[Jk©ñ` 8eºðÚãä x¤ŒBÙ ³0 SÈ&Üã¤æôôM’ gÔ@ œœXy¾¨šQtœßûA”\EV<à;Mx :`ÜÀšt®TÓx×®dg˜¦ìŒí \N Ϧmià±t”½sÉ(¸È)HP%ˆ(­‰àÿ‚(ÒˆÂ*·Àð¨y…ã—ÁsPåÞ¥¯#ø¿ Š4¢xf”c‰âU€½qüažQåÎe¨tA”! « ÂÁ+WС Ã+:hUÐaEèÀ*wË(ÄÚg7¦ áxŽç9{eÐVÐ. Ú™D¶@A»›C»[ó%´»;´k†ˆ½YÐîžÐîÖÎâ ÚÝÚ½ål*h·´[þ„u;ŒväÂk )(øtwø4”Hß5á‡û ºjj*U¢ƒ×„B—¿X0àî0 .qÐÞц皡UxjÏpn á›8x?sî[ræš‘ÉV2!›×½&„dQÀˆâ¬F!ÎjËÞ—+ˆ(]‰ë¾DñÜÇñŒ-© ÊM#Êøµ}¡c„…ýæoß¾{°Ä¡ê „ž¼0ä}4ˆ_}»Uã0ÎÀW=¨vwÈ£´­«£R4§hÛ]{¾nÏ`vÓÌ8›Gw»î|>ÀîL˔ǫ®wz8[¤iv픵ꭥƒïéá3|fJÐé®em6<×Û´Oÿò ~vN|f„_Ð3sâµs- cÎñE{f^1ÊØgÚ ‚ëö?ëFuï·ï¹÷:àÞ0ÔÇkã¬6\9 g$YÚ˜äMüžÏð=pVt+Â3}_µ;Õ©¾³˜o{Ì'•cŸ$1|û´ù?_8 endstream endobj 8732 0 obj 4455 endobj 8736 0 obj [630 /XYZ 40.7999999 742.099999 0] endobj 8737 0 obj [630 /XYZ 32.1599999 688.339999 0] endobj 8738 0 obj [630 /XYZ 40.7999999 443.539999 0] endobj 8739 0 obj [630 /XYZ 40.7999999 742.099999 0] endobj 8740 0 obj [630 /XYZ 33.1199999 686.419999 0] endobj 8741 0 obj [630 /XYZ 40.7999999 443.539999 0] endobj 8735 0 obj << /Type /Page /Parent 2 0 R /Contents 8742 0 R /Resources 8744 0 R /Annots 8745 0 R /MediaBox [0 0 595 842] >> endobj 8744 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8745 0 obj [ ] endobj 8742 0 obj << /Length 8743 0 R /Filter /FlateDecode >> stream xœí]KÜÆ¾ï¯˜³Sì'» €¤•ä@€‚9ŽaDFò÷CÉÙa?’ýÎ,eC»"Ù¯êzWuõ›?}þÇé_¿ŸÞ¼ÿüŸÓ×áçûÏOuUëºÿsêþûñú7•àý¯Q·ÝŸÓ×oOßOߟ>=}jÿþþÄô¹áð£}9Ñwøû×ßžÞôƒ?õO>¿ÿKûÛÿNüôçö_¿žþö÷öÇOCÝßžŒÕÝ/ÿîaœqÓþãú·îå/Oýáô[;sî·ûûÇF˺ý?jß/MÙù¿ë¦h°úd•ªM;EÆÛ¿T Žÿþóéç¶·Ë4*+k›4õæ^Þv+Öœl£O²f¤S²¶m]Åv¤X¢ŽÎ3bqKcµl–»ªŒþÀß· dº•‹n”vÈoRí°Òœ÷ÐT´SϹtÛQÓˆ4u3bqKv˜võ) õóêÿ¾ÐðÝ—§7™¦cv_~ngræ˜ý/írÕéÇŽ XyúòÓéu-žÿxúòë“­”êYìðÆžß|øÒ® n>L¦…B7&Í8¤&ÓèŽêj2¼9¿1—5??hªÚwýþüF¾<øp~ ZAaؤ×Z;½²~YɾÓ:h<·W®áH[‰&às~£+ÎŒófû*ð¤Yí΄LMÀaàúj߸ð¤ãáãa¶wÂÈŒBö #,œ=ÿ°yJtöHpÒ Igxòpï1Ùñ.…¾KÅ•Ziç¸×=W2Í86²È-t˜Ì[ô¦WÔ(ç îm¡…m,jS÷ã°ºêY)aíê * [ë¹=crdÉFf«Fsbàlá8rèMTM¦/¢kXaSÙƒ_ ) 5ÎG ËÔBîL“2RÈ(Ý%•:=®˜Êýï¡ÏÔ8¥—7oa÷=‰2V)©'Зý”xe†Í âàHž˜á7˜•“=ÀÂŒH ëò1< žZˆ\ǽå‘jPB1¹*ƉòaÒø<0ÉCvy, kî‚ñ*°Dô•t‡™ÀÇÆ  PÔ˜ÙŽä¸û½…(A$9ù#à!` be˜H¶ó4ŸuL$¬:€£Pz"´èŽ+ä(XL‹AŸ!V©‡ùF ÌÃLÅ$ንÄÈE–Ò6v$„=ð$d¶v°£$žãàÿ™#ì%ñp_ß‹Ë5¯+Á¹É;ÜyQâXa\‰³n¥{ëèÛQJ‘‡(Šñ©¬‰±6©äëŒÏú’µã¥† Aˆ3q»æë ú @~H±ÆxÓø€áçáÖ ™’‡÷fqy°P¸Ðu”JÂãòK2Ñ2¨)£Šòj­«íX¼`ÕûnÆ= 1®CHo{Ì¢Yˆ=›&ÄV\•Ø àUBYÀ`ìA 1B FØyà¡WÅøm’8"²j<”²svJ¿ ¶$ŸXç“a)-3qYë¡Ìêª;/qx:°=6!’šÙÊš3Ô6´6¯›li3FƯöÍ–,yÐNY3Œ‹r×@Æ“#ßÒ†=•pãn!ÔëgÔ[w Žƒ{[˜„1+uRE¨KJA*“äZÝAvož³ :u̹[©û1)·JšóѸòFp}´´Øà =,×â–ë‡ßKé0ü´ð"Ï[ŸÐký$9‰X:–‹­ó!o)(H‘¡s0·ÜÌ­xšèÄÒO’B´F9‡0ý¥ÍiÈ.‚ŒaŽ 9 •'híCÀø´P-8ERœ€{p>TÀ@n.ˆ·=øËLz)Enð:¡•ª@û!5ü­Ä Ú\ϯ qìÊ,çbä0çwŠGZEþرUIúÐHÞ¸HRØã& xáqØÅcyf9Cë“Çã* ÙW„J›|BhRB!|sÃ/¯a›É¢O‘íNu!Õ•°Am×ë"¼ç!jªØ.‰n‘ëÊW2`/©¿ã‘¯z#’J©Z”„1®âªı-r–¡LE®Üž¾íEß(ö{ÐÀ{áΈ²ß7Jº¬€OÖ—ÚË$¡ÀßféRtë9l!Q µ˜3Ñw]àÎ¥nžL–7Lùà­H®±®JlG ›Ä‡’6Ï;lU4޹ ¾^æ •?Ê›]ãã³ðð8¦pÓ%›{äMÇ”MK¡²¦)ÈRŤ˜)ÆÌRœ‚æ#€×}ü÷ ÐÜ*g˃°‡0=­JŽû9ëR8L=ŽhàâWgSœÉ[Õ|ñ Â…œCß¾ç¥p;Æ]Uº,BMKºÜ6"Bà™ð8‹øN¦,5Ć È3†l¹+‚Ñ›b´íéŠqŸ¾]þݲ/SŸÚÇ톱ó­!Ý ZU»Ç'_Ÿ´ª³¼KH¿’“^äõí÷ÿu×ìä´ÖÊ£}Ò¶™Î¤ûÊNz±Ó1~yz÷C¾[2Ì ¥4|º¿3·d Û9÷æ=|cÑ›ÆæÚ¼ÍÍ-ØPFðjÕ5"3{"ÒÊ"Ç\ÕLòƒ&Ä7ò.Å=¥xÓÌQ¼±.5¶OÅw_ÉI/òzŒ Å5GñF’1$¥øî+;éÅNÇ(Cñ– ;¡0Å€o0õ²ìÔËŒ³‚¤Ô[*Ìüx”¨j5¡DUëJTµq¨¤{âRâù+9éE^1R¢ªå %ªZ1¡ÄóWvÒ‹ŽQ„»ì8¦*(G(‘—¢Ä—$¥Äb -¯6¹œÒ&Ws´É—nÚ'„6»¯ä¤y=Æ…6¹˜£MÎÉœÒf÷•ôb§c”¡Mn÷¦ϵÁã¼óŸîc.Äà¬CäO eÒÝÅCÏ/ÌÁÖ§æ)àbZ` BZŸ²PÄMJH“êË5óT”@*I1•JRÎI%©]‰Ñ>!R©ûJNz‘×c\¤’äsRI22£R©ûÊNz±Ó1ÊH¥Ë5¢ì#‹KÆ}1“Á6 x¥ß!•V¤ÒË.ÆH¥;²4J ©Å/»ødŠÜM 4ŸÊ-ædñª«Þ«>åæÝWrÒ‹¼ã" 4›“ÚtOˆ,è¾²“^ìtŒ2²@—·îFðÜ_­:%ïÜp´q¿ÌŸ Ú¡r«ºjpr6mHÉ\K–¿B•ß`8Ó¨®/ep‰­ˆ#˙ʅ‹ Éb‹©c»ý޳4…× ¥¥ÜêrŽ;(Úê‘Úí“ur~¬tÂIH’.PˆˆcÔ|q=sÈÇöT±WjíJ‘$„•¤h”Ç]´I‹Â$¹ª:ÉÍ_yNË®+ó¸Âgšëep3¦…#Œ!Å·Ÿr»N§Ëf€®­Ôàs&# ]Õ½Áè¿6ÐåˆÝ)»ù…ÌBg!½Î@b7TÒÝÉJoÀåF>(.gIòòÃË€72dÖ˜ŸwcV8ö q,Kr×q¹aüÀåá2dzÆ0€hQìÀ±áÖ/vrÅMÂ`!œU/Õú¼,(Ç Ù#{ÅØ]ílºIïG3õ%gí²!uÿçeÑoÑ›zô=4ÊyÃ¥›…q,j3ÞñSWà^#]‰³_æúM¯¦™J‚ ÜTÅÉmL5ç#„[:¶£äJTÍÈÑÝ"!;¨1£ÀÈ‹IInð‰Í‘)&<&`¸ž=C‡°Ñ±°w„ÛàÛ1DY@ žîma°‡3¹0tè‡ãY8%ŸrÎ✼ghÆÑ»kÏ6MÔ $&.#•å>EhÝBÁ‰;:—T6Ã#îÈOuKQš…„î‚ÂF$àÖ‰³Æ¡{m,(³³'!—?‘ýáÊÌTö>hÜNSÞ,ï]Ú·%©¤³×U®Q  Bà6™uy‘Jå€w7‘íœW~K1TYÇ$2c7ùârk`š®GYÏW“„\ÿåSˆk{šÓ†º¹!•K-1œp{Zú‚ß^.5êV©ÝbHR%žðx:Qƒ«sÛB‰¨iL•dEY×ý¨–©>{ök~Ô%è,„"ïÒúgïâ‚ʈƒ»÷†¡Ï7†¼)æß´ÒNuø7_£“š‹Ç×< ~8<ýž›À—ùòž5k%§£N7§Z qlîx\Æ×®OËTÓ^·ó|¸æóE|ˆvÔº;upD5ûu j¨~µêrƒžs ¹Ù1‹ t™³‡Sd¿RÖÿxn^ŠÓCJàÅŽÖR!sj¤µK##XøNNW/Æ:ˆ8ð‘Y ñ§Qs"® 9ïá5ÍrÖ9÷e·ãDU.È«Çl½›1/Û³–ÝÛc5¯ç'ZÆÓhÆ_{ö¥eœ$¤ãØ4FìÍ{4ˆbb)•nõûqÑý˜¬HútžËçeòqL1í…IÐ"¢òv‰³{ø´¨v˜ÍëÔ©¸=;ðcâTb¬ëà7ž<ëØ~袇.ЉØ#XLµc˜g!éÉÕâÒ&¢ÜØ[.„ˆù’Œ¹m4j“zœv£Ç” =7ÌE–ü¡gãŽYRe|ôß^ec!B #¬²aÁ6Ú³àßÊV(H¸Yv(§»ÆÑC9Ý…r*ô%®ïqa_Èa7¬„§ŸgÖ[™ua”_oådÌw™·Š›¢š`]þ¼ŠéNÄí~Û ŽxŒÎ…O´Jè4.àñ™D|ˆ ¿&Þ4Î<7Ü/<òôÆ­%eÿy§MºÉrè&W .ÕN4³ã”°dÌÂWhz\”t^º­û,㠺ǥ}e9MΣØ}½AJds7>æ½µñž«Rä>³ìªB_«èà«B¶›pÍqØ›Ì^? ëÊvÈÕà«Që¨jµ)ÊÌ­³â”%ãòbµ‘ò.ôLÓˆUl‹ IxH,i‚ÿáe+3‚ßRsÄÃ.åñˆ7꛵þ‘®N+³ú…#fž£Më’J¨Ko¯®°›r RÁÕŒÊIv¹&¶Pü$q„Gÿp)Á9’Óñàˆ¹©i&îoý“òRk×/$Å5¶—~¿™³¸ztãHåLtµŸùãj–ŒqõÒÎ3‡¨8¡ƒì6 î˜néèIÎTÆÖz«²RÎc `<¡mÜmËc~ݶ¨«jžªç„IÀ> ×Lauª¿‘¹B2BÇÛý™Ô¡JP&ädTLÁÉ’6§á«[»g›san‡5zØ{·kôÀÄ}`"„Û*&æ•SzÔ‚Š ªúv ¨JõŠ]Š’Ý¥QÿØýs;Œ‹0c·åϹd;Ï×Waç)•0·±&{wøáÐôW9SÐd½É‡Œyw~8a•»†ì~8Y»c>¦.{ŽÂmdª¶ó$—ÈI¶PÎãaÜgŠ’_þ„aëîÛá¡#ª‡b«˜}{û1±}à{8Ê“’øîL̆‰™}jµvDËšcæ‰/’ÜÌÜu]ì£èks .]õpøÑOCܶ¸‡-¹·£Ã²q˜ÉÂÑ"Ì'³û2D£ÝyîýþTaÉ”³»ÊdíŽy¸|‚ÈôÆ.VÏ£N"—OÚÞnêØ1„=J^Tûßé{ ™vá]ïß@Ea\¿ÀøÓ"”›®nO }Ö.t– 2]õ÷,ŠZNYŽÖ•ž?lheE€×ooªfþ°a3ó¦ß !*nõ\xX©J÷[ëîÉÜ8¶±°MGoxÅ[5_·y{ë1øúÉ3üv8g=³Â¨Í€ösoZÇÀ«ýÚ ;æ³öangˆÀºîw~÷€»=Ä×¼ð`0â½ð`(60ƒñìáèüà®ã6!û4Ü{º «Bh «`›…@~³0Ü—j$”‹ûǽ,ŒŒiú}º1¦ÖëT‡€0ë[#­A–%”c§OOÿè0²µ endstream endobj 8743 0 obj 4883 endobj 8747 0 obj [631 /XYZ 40.7999999 606.740000 0] endobj 8748 0 obj [631 /XYZ 40.7999999 295.699999 0] endobj 8749 0 obj [631 /XYZ 40.7999999 606.740000 0] endobj 8750 0 obj [631 /XYZ 40.7999999 295.699999 0] endobj 8746 0 obj << /Type /Page /Parent 2 0 R /Contents 8751 0 R /Resources 8753 0 R /Annots 8754 0 R /MediaBox [0 0 595 842] >> endobj 8753 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1549 1549 0 R /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8754 0 obj [ ] endobj 8751 0 obj << /Length 8752 0 R /Filter /FlateDecode >> stream xœí]Io举ׯ¨s€Q‹; tÛã9h´9=™ƒô Îò÷£²¤ª²>J|")©Jm ]¶,.oã[?üéËßÿüíøáéËŽ_ûïO_uUëºûw<}}wý n+Á»ÆªŠ7§ǯßoÇ·ÃçÃçöÿ·Óï/ößÚ‡ÃÝ€¿}ýõð¡›üÐýæËÓ_ÚOÿ;òãŸÛŸ~9þø·öÛOýx§?øv°>}øw÷qÆmûÃõ§ÓÃþú‡ã¯íìû¸§ÿ¿3Zq£í¬u¼_eï_ׯ¢Éêc£´jô‘1Þ®Sµàøï??·£—Q5’1£¥©'Ê„>kkq´Ò¶cKoTosSÇš=RÓî1ÍH§5±y»k¬¸9Òç$èÁ/èñxñÓëáà S²9QÃëÏíJÞIªûöúí ÛÚEêº9¾þtü¾¥+ûÇãë/‡¦R0ª£Áî kГú ¾Ãá; =‘>1p4ø$°ÂNñhüÂmQÇϳüN)+à/ïO~xm9ç<>ˆ˜ á”rnvVWÚ0Û.ç²nÓ¦ª"ËJv®¶Ö•½üiÇ+T«ÊXÆ•OuÖ˜®øû:üƒ‘îyÜZš÷§;v¡Ðnü%€…!à®50¼·èéïroÓ¡Ç5\<†Þ0>a¼so£(Ü|ƒ§ø †£r¼Æé‡áí¹`òàÖž­lS뉘ÞkvŒÀ¦°‘!M—ÀyÄMý •‘¨£´¸:·h«„P¥ä¨Ñ¼‚™áµt¹T~‰sšËáŒPþùò=B"c¡Y§”x"ïS27q;@ˆp± \m15ÀkÇ—klzÀkƒ¦l”XóÅ?íE¹ØõÑ01ʱ}9àÒˆ5K!H$$ìþPã˜GûrìöÆ?v`d•’zŒx^ж AîIÏr»½÷d×S¦ßüØøÍ}‰k]@ B¸Dž]Ò›ÓS[ PÓ^ng°{‚u: ~Œ†5ÁÆPuá v¡›Ü:½ûIv?I1ÕcÚ†°Þ4öæ•ÊG줱nÒŒF¢$Ò(¤.0¼6ŠèÇ¢rwMˇ!¸*ý[ ¼Ð%¾ß,mK¹¿á‹cZÊ"^k‘0•„+Ïï\(wÓÍ«€]EŽÃ°ÛÛ¤)s^Iëzì8â]_WïR|ᘲæ£2´ÍüF3z‚ÈM—Ömý:n!ú Wam'¿+TÌ!›,!@ñ홤¡ƒµ7u†H’w†¯)‰qÁÀ"ïL°Æ†óÞ†)’“`ÇÇI‚ÞéÏéCþP€o1Ñ…9X¡‡i!ßbo)xwaX€¼ß:%œGÂ;¬ÄÞvÈS~L8ž‡ãUCˆ2lXñŽO†ñ€àϦÈVl¨ØYðýËp¼6ÔNñ~O°¶‚m %ÇPN!î3…E*µ³ÈY,ó]œ©­€E>'e6øä°É®-€!˜uQV@`)€>¼Ì) Šà›¥°ü ôús!æi†¿yÒ˜'Ö"1Ü$Öy0úáÑ0ƒÂûYœyb|£“žìyÃM7“®S÷Å£ØÂ«&œià|.î ’Æ—S ZÂV8…å7b”w–ÚÀÎbŒÌx§‹kÅ»I!¸‚NJŠ ¤ˆ°Ý QZc¿õŽIÅØGB7šsäÔ&³Ì3ÅŽ{^w71N¨$içs¼C„ìèÅbrHé“5"¼—p%oç÷›Žt½ÐŽŠˆÀ‚À1¹àëãÆ.¿ M“.â¿Õ>››±(]dPcÖ%_®îþ]ó=©ì5ÊyÂeü;ó÷Nçé“°ÚGZr‰o¨~Þ~šþÈ„›~|áÕïcùÂÆV²Çpw´É¦æç€@¬laÇÉbõˆ‹*ðÝ f¨R•Ú)Nè(ïijuνÁÙà©C ÂHÞ©2]¯4LÏV ˆ!/7+C.G÷£""b \Q´â} ÏçiT˜ Ær©i¦nJó ÷ d}[ð•ó«5Cgù`¦åšÃbÔ 6'ÚÐe²ã¬t…‘|9™{æPtkbÈ_Q‰7îœ%¥SCñÓå+ƒ`ów@C¦¤I4ñ]®PåJs.ôY&WSÌ„3´÷ÌN/.]`eç;L¸s–ä;œÛq’4CR<žx;? ò®¿îîÀ+Ú¶ iA¢€>âØVV“’åPCEÓºseøÍ`ÅÃÁcGøRÔ<Ìð)UP°i{)*(¡f¥ØÄ½ °M×-¹ƒ½´ÈªK‹ààØ€:‰Í–¥Ô/!ÎY¸Ÿâ¯ci\Ý®õqµÄÕ~$'Üþ(¥_#X±Ú5=ݸPe ábI~µ„¹s.“ƒÏ9sÖE fséÒ" ¼TížQŠ`’ N»ˆ‹Fþnµr±&…a¡R¡fÓïli €+ßN÷ “ÌvEzW ’J°*îb”³G_Êf”e¬‡$Æ%lÒp$žºÕ—í¿ñ„ Z{Å5åI„é#Ƥ3Z»;¦äéC£eû½ È’F ¡‡8ÁRVìÀµp76ìÆ†ôXµîÎØ°iìÍ\âWY‡±¯ÙZ½“F(l…’[Ì'kö{Z¸Ñö+¦û#¥'áÂ1L;xèÇ •䌓Ê=±µ{™ö–œ?œÄ¸s.cÆcV¸hµN3óAN3^ÎHëì$ÞR˜Úˆµ›ñîÚŒ'é¢Ü#˜ñ”Ë2&4ýˆðná¦RÒ“ëÿªvQ-Où⤶Q’`Ê>á$ö-€”fÒ„®l«q=’¹)—‹,"RŠ1VÕ³ð[vð $ã ˜%´±AžÂàáàäø4a˜¥K³ãApÊé±±¨Òqz¸}Ïw•—åݹÜNº¬j•y{ÖU;òëmM3ß‚PÀ"ÅËïÌÞ³P°MÈÛ†ï’8IÄ}j=,Ós|ö——ÉE䵯8Î)}œ=`¥Ðªfļ±]z¼•­ ™3®Kig×sRpH%>ÒsNc@ªy( M¥p$L`3súbm(I}Ãö%\v³R{Œ6£ "….¯5áZš'åp½æŒ4 Ôôâx¥’ÌQ¨ZTö=ms$Ÿ7ãÓM[‹¢Ë/žÃKA€çS’x#k( lç¶ãŒáѹəm ¦Ù„èd-‘¸WŠdÁ²cÖ1Ô™Ùdôv_쓤âf*È´Ê[ Há|Üã5®(¬nùš›*sSU܋ӄMP{uHWâÍýwŠU­· T·:-´Ó´:5õ¹ÿÏÞêô>Z–Õ%U{#LaÚÜhËÑC§^ÞékÎ11{Ëѽåè¬ûP¡ê e?­KzÓ%ý]öÑk´tïOÐGÕܳ‡ÌððŒú© vô¹¸f’kÑÞ-o}ËïÆÁ°üÎi^»sú@Ç "„ZDè õuÊRº¼Œ—Ê+‚º“J¤¸ÝI¸ñ[q|¬sÎ^§ƒž~!ФwKR²R™>CŒ UHÊ (¶Ðá’ìÒç}ñˆƒÄéì{ÄÁE\ûlÛ¯ã[K-âŸþ ÿöõ[€Z|2«/dö9HhÁWÇëÚé#k·q+½aºê ̈K©­¾²›®ômþÒÈ Xe¸©Ìm¹`n<éŽ@ˆŠ7+ïrªÒ'sôÖ<¾ÓÀw:R4¼âõ{;uoÖ1÷ëß<ÿíeƾ wz]öÖ†öÑK‘¸wú‹Ù{¿¶w˜u§Ï\±³îO»Wb£ð 'ß(<`/ãÙ3ÂÑüà©ãw(çÔ|š„U a|'°ÈoóÀs P£G¹x|> endobj 8764 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8765 0 obj [ ] endobj 8762 0 obj << /Length 8763 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èsËâK¢€ €=öÈ!€a99Þl‚E¼ÈdùûQ·¤îRERwË{ÆÍá»X¬úêÁ÷üú÷ã?;¾úúŸã÷ñûÓ×C]ÕM=ü9ž¾Þ½þ€ëJðáÇV«Šw§?Çï?/Ǘ××þß—kÎÇo}áÔÅÐàoß=¼:? Ÿ|}úsÿÓÿŽüø§þ¿ÿú·þÛOc{§_øqÐ]súáßÃŒ3®ûÿ¼þéTø¯Ã_~wüµ‚>·{ú÷]Û4²¯5Ž—KUvþz]uV;¥ãÇþo?NÕ/Çÿqø¹oí2Œª“ŒµlkïV™húv»ZÊ£–ºßeµjMγ-Ý’è·"MK§1±¸ÙuZ̶ô% yð+y¼8*~üvxÿ܎·ŸûaœÏÓðíÛCËïN4ÂûÒŸŽ¿ïÕóŽß~90V)ÙèVo(áç’¶ª;Ñ^_KX{.‘• |êÔ’PGŸKšŠ3m”< ­]?P°yBÇŒ ‹Â§JfÇŸ¿õ{·CL 6‰©ÆØ%¦Su‹ƒ5fŸÖóæüêÙqÿkêõª|†%Cí¿´Òcçxk´ê !³Uñb„Ç(…9k~°U{~phŽMÁ„'jv̤9’dQ¢¨;“Kn~ÃLº¶€ŒÕÚ]næØn«‘€C"` …9Æ[ƒ„?›$ùqé`‰a‘ºªmTãfG»þ5¸6ctl1®}w{u¼|Dïürbµ9 ÜÍ:”›ñ j…0¯ ÌÓºlî.>{Z±6S›<”ЪMvÈ!%ë^Å}»IòãÈ÷•5«gT¢jXç –t¨„ÃÖÆ±e$Z­Û Þºö°H_bs;&‹«@·úL¶iLIÔ­ɸ¹ìƒ„× ’‘µÌÕѰŽB%–ŒdVòŽ­ 5‡ýc<2‚eÑÌ+ÚXT—ßiÓ¦ôI6?²°÷@oà:VÇÀS'3ò(µ¹ðØÄMù „·­1Îï¹($k Ë[JQé @e7fBÚ¢Ãì4%:«Ï¦CÐõ7ä88Ö€C€–G` Ø=,©Ÿî¦¼•Vó‡l÷ÜŽ7`c‰Bí ØŠea`ÀÖ¦Rƾ7H-åMÈ™º‹Ôc;¸±n; ýÓ­ 9=Wmu$@‘.…xÄ+u‰ÕÚpŸ¥ •áºMß§{ u±:–JÊøNÉë!KgsËŽ]bþ0d…J¬>ïÀ±+'À[sÁvß±Ýwl÷»ß1eœÜÇð[dð»cWIc”„'Ûäu£vß1Ÿï¾cn‚ëùa7/nžéMð ;¼0½zøsÌTROúL«Œ. uàêÕq]&ªvà ×:akî2U ÄäU[¹««Ï÷5nmtä™km´5T’3aÚ¹GÍF–*†‰¾*ãYãV"ÂŒ:cNn ãK$qSn|ê°`õ? “NVŽ¢ãc}ƒrÙÄ eIDöVÚ4…à\ëR#åôI©Vlq¶¿š¢³c¨Ð2œ.¬'ô+ÝE<ذï)ÅW“cOVì߉½“¡ {œßÛŠb[\1ïWÉõ´!ج€L4Ç?ÑåƒÈßÁÅâG¹£Çv´ªBn’ ÅîÊì³ä%!nipL5mÌq …©bÖ ëìWAÉ« k§ÁÜr¶çÌþûchñu±òó*&Ì>Kò*%Øfx•#äÀwvÃîS²s1Z`á–L÷à=×ù)vgò[ŒÀFÊýà©‘Epè Øí›r[(%er­à`eI½åó„x€ê"+¢²E×óW@eëÌ>=bG\ë„òœîS£nüŠÑeI¿G2MÀÃfãB†8’˜BŽŸ„å[ŠËu@>Eܼÿã.Ž_Ý„ßÔ· ’ |ü±ëO›ÖŸŠIÔPo„íõ.Qï5I¢î˜qþòKÔ¢6û,zÍ6ÛÉÀ–Xt\r`¿S?ŒP(7n­ØuÞÖ—XÏûÈH¾_16yëZ÷> YŠ$ß/þ;»ø§‡,¯'µÀÅÏÌ>”V 2ð:ˆ2h]î—,v(m‡Òâ8ýý@i­Ðoé)»Ì•âÚ%yÚ.lâj[ñv0÷qí2ñ.߇LÌÌ“Z@&æfŸÅBJ5ÛPH)®ƒƒ3§c!LhM®œéÁ|&¬ õl°x\L¼¶"{}Ö  ß9\ÇtŒwïÂgTâXƒA[brŠeõœ`pxç …ïju% ßJ™GñÍNß0c%/M"]”~½’b~$Ù7’›¶Z†¸ð, ¤ùY¤E‘q‘çCÛ™ã¢=ÒW•ö¸½ü¯9¾B|½pðÊÙyˆ¬ ¢ÀŠ÷‘è KŽ&ù9Õþ/ƒyú’i ?XF‰òsxÌÁH‡W!þÂdaÀ €¸ÂãV;4XìØ„W_eS›¢@ƒöáÇ,% [¶¬ DˆZ2E6¥hJò²V <Æ[ÚM”b…+‘sBmgp»´‡ß¡ƒFäì8%ñÞ5¿›{úÇ•,W3óHaI ÇcÙèSn¦Ð0‹)$yN!iŠR›î,Á* ž¸RJ ¬¯E°øùÓ]Ì$fΩ¾–˜l_K4,%$-ß‹c¸Âœ/÷F䪺hW?wJO¸ eAíÌ)$3Ç\`f„¿³>s\›„‘ýe­4úÜe¤õ ©»SZ€qĶZF´Q#‹)(mÎäå¼¢;Ú¶‚Z£„u ¤x™d xþw™xS¾gK~ÀflÓw9Ù3÷Ï`|ûOW;„¼Vµæ¹¹1üªíÔ¼ø—4è(óC¾£CðÖEm­ÀZgí³{Q{3>+â Ý 8Tóâbñ<\µdÕ2  ê’Çm»R}ˆÈä/¨:h5É3Ô‹ÑI¥Ý¡fÐ/ÚÅqS”̓.oóÞô’5Ý£É&D@Û¹·ŸÜé)Ñã¸4 J®#UMp\|œµÆN¢¥\»š_Òkì.QbùváÝop#H¦Kz€u……Ç%ñØõîÒQ/ghuElØcÔ7®v`v„#Æ–™œ?÷¡ä§ yŠ5ÎelÞ²aÏLúåpþÝÀ"Ú u•8[ plK€™ÏñC¤õ3¡5ÂV`ðL± õ‰ Œà¼ðp ÒîÀ«“,‚avÍÛó—Ê`…uG¨×â~›ûql1ÜÈ¢Kz—îÍí}âŽs—$ñÉǪ>á=.Ò¹ÃkOþâYMD~¤Dztkröù¤¥N±åâQS(3L!ø <\'„ëÁ†”X.‘88>¶˜`(‚ÎmN3p?øpâÀk̾1ùaÜïDwgà(¼°Žc„ùlšEnCpcíô¶HæäÑ-g*Á'KxøÜá7,(Š ¥µ{Sdp²Œ¤û³‘óÀùÅù0ŠŒÀ›Rtéãaí¼$£È8È"©"ƒûÙÀ-t>·©®è`ëê ×Íâ€vuå‘Ô‡D!æ›T˜(¬8Â7~ÅQ?˜š'êémÁtjž;z'šËKJë§So`B:u1E¸Z‰¼Eþø‹óÚÊš½U¨frØîBwuƒ #´¬ð¸ÆsöøaÿçìñþYÄö©Žæ³¤HÉü›$¥3)}pŒÿUÚÄ,)â¨3Ÿ¿R‘˜rôÈUÀ.7ã|²È4rº­ A¯î¢O)¸„„—ö<\Ç)f|®‹¤¥cÒX*Œû`Ø»ü0Šé4{† Õš²åœ1I„ð›¾Iã\ )îcÓ>Sb+sæx÷ºöfO½{ý5Ùµ"aéEù51ëþ»…Ãf'±“ð&†×¹-¬až…ŸÔ XH¢çPÞ衼q“½( ‡ –¾òªíZ,çGAx¥XÀ"&°N:Õ³}á‘M"óeÖRA*.ªÜIu Ò)ô”²À†mìtl "ü8¸XRúI;lµÁÆ}BØ1n ÛfpèµÀ¯Éà°pÂ+/xO±=Ç`¹ ÁíŠr~c#¸X^/"ì¶(Q,qŽÕÁvJBI±pzyÉ‘$ ³#Ä.mv«¼¼4Vë°,Q"™“Dz®ý´ûÊ8"oƒúžrØ dÃ.*£¹^òÛç·@i³Ë¤¯älH%Ù®Ãß³ˆý×ñ¥ßç~O¿0~ûþññ6ÅÔWŠùâ¤gÕådMͱ?³HÇšê<Ë£¨åÛóØ4U3Ÿc£“•µhÃBó¶jM*º)èGˆŠw³žJUͰq&eÍõ£aÖê–W¼§¢kÉGØÚ@¹¯?ùw¤á™>£:ãý:WÂÐ<Æë-¬Î¸c!sÇv>Twú™+vKànl#ˆFå/ˆØ3¢xö Ѩcýà®ã:”}м¨ŠrHTë8Fù£¸/ŽÓh\Ü>nÅÑ3>ÓOIÎÖuS±Sð‰q€0ëÃŒôU^†/)ï±ã—ÃÿcÌPÖ endstream endobj 8763 0 obj 4324 endobj 8767 0 obj [633 /XYZ 32.1599999 311.059999 0] endobj 8768 0 obj [633 /XYZ 33.1199999 309.139999 0] endobj 8766 0 obj << /Type /Page /Parent 2 0 R /Contents 8769 0 R /Resources 8771 0 R /Annots 8772 0 R /MediaBox [0 0 595 842] >> endobj 8771 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1549 1549 0 R /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8772 0 obj [ ] endobj 8769 0 obj << /Length 8770 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯ès€ÕˆOI@`vlÈ!€1rrf³ ™Eœ=äïGÝ¢ºÛ¤>J,‘”Úæ 0î±Z|«¾zòÓ¿þýøÏߎŸ¾|ýÏñ›ùùåë¡®j]ާ¿?Üþ‚·•àÃǦUïNŽß¾^¯‡çÃsÿïëéó‹æGÿpìbhð·o¿> †ß|ýòçþÓÿŽüø§þ¿ÿú·þÇO¦½Ó¾ÚNŸ>ü{øÀ8ãmÿŸÛO§‡ÿ:üåwÇ_û!´çvOÿþÐ覩¹\5Ž×Ë«ìü÷öUÔY}ìT§ûÁ1Æûqª~9þûÃÏ}k—aTd¬Ñ²©·Úðc¿B©c×è#¯;§QgnËšbkRZÄiè4"¶nj¬–¿©ªÕæü¼¤£öÔ‹Výîõ]ötcºyŽB‚üJ‚¯ž|9|zbJv§÷òs?áó±~¼|?Èþ?'R”ìøòÓñ÷ýÙ8¾ürè*Õ‰F ç|xÂô¤ÆOz"¾À~à;ž~Zô„?Âw2Íupuêð~$aÔŒG] ßað‰nM~†ïÀùL;°5Ï.àùÀ=åOç'/=oXwÒÑ1ï™çù˜÷,ØL`X¶j»Zså.{SÕ`Ù¯¤½ðz8ærAóæœèгv¦ChrÈÍRÄÙR†V? ó«+Ýœ‡`5Â1)Z°GL7Ö&±ÃO'ÇïÀóÄ1§F¦¦Y.¤M´öŽñá°©w¶ì-×68„! a@ê2Ç~ꉞëÏlf šç Ë-ä$rãdÉXÐÁx¯‚‘ƒ8aE={ ×€2SŽw¶wu²^(Rð Æ#È© @Ú;@ºÙ$|¢¡zé¡L|:a?{H7ëQÒB€Ôt™"ÆØ˜!b"Æb©À ƒ Ú z (¬Áß'¨j™, jï êf“°ÔÁœJL›B'®¦g] Ótje›:a†ˆpTWQN÷ ò ¹V!·{!wÙ$kÓ9wêZ¹!Ú"þ–‰¿Ž5™ÅŸ€$D¹Df‰®(àƒA€Nñö®›„Õ µë#€)mr.à`!8hõÛY&±„Ù+|"¡8/ºñûŒ{6œ{öŽ?©áÎQàðž×ÍãÃŽê<À°Û¡•ˆé“ó«±}±7›„U8ÌpDæw›;ÞÌú€ª¢ÊA:¼«íEÄžð„Bˆæà%$!ÛiÒIÙ§r8)¦–ÍšCöyÁ,ÝàÚEý>¢óéŽÈ>@øl»lÀ‘›í‚Uô nÒ6GYÕá#FAñ]csªN}¬”v˜C:QÎÙ,9^ÁÄœ–t4Ö"zT¼Ùð‰„1; GFF “ƒŽ¦¶ÉMŠ-{SÛlûXMÁ(à1ù޵6LD;æ;ìs‚*ín·Ì¦ºíw·ÆáØd4Ã!Úí¶µU!Gç³^öÃP—8ò9ˉžØ±ˆ-6ØÂ·¿Ø5ß]3Ÿ©³ j±3íÐÎÔYcSïŸÂŸìÂÎÔÁ}¹C;SñÇø ŒÙž'e™’ßC`{‚âðƒ„Ÿk¦ž8!Šñ¯vôdŠ-òDÏcpUüÅÝ9ÏZã œõû!9Õ íhïÅ wO1|ôÐ5}çÒJ]k[´P“ÀØs±¼ôÙP8SÝ[ºžBœØ$‚ñ9†º|r·¿jTÑ íc+CNëÆèš~mç„ä„n( ÒY>«b}PoJ»Õ”ºRbo©Öùðx> •¦(²bKÕHˆÚæéý¨çD‹7{€Ï%$S×I Ù™‡«Àw\£CôðÄzÌp¢ž'Àyý…‰®Ñê-+t_ OšÇו–õ2G7ÆäÇè=ÅÍeÙpóöŒ=²,.jeó ñ†MÐ4ü"Oȱ´ñÕ9\r‘‹Ú9ƒ+Ä' Œ5 û›_ŠÐ“䂪aÊT½˜mS çÛˆC€2f°¿Úq–„"æ¬+ôbÕ©±Ãë“ÏŸœ±JI=eÿ_rÀD²P8€€Ò J2µ] H!CüŽ =È Á7cI‰!Çrç&ï‹» È',Ilè+¤Œ¨(y[%•™ˆ+ x”TlŸ‚¾8’A;+æ §)={ZZ+•&vУÑ9RÈaÎk„:>4+Þݽ ­lz§cªÎtz A%¤w)máà’j.¹ü m+[›IòB¡Ølš¼’öiþ8ÑÞ›Íâ‘)Wá[€M'Ä 2«eRî6³š€¹ *NØÖº6w—-ØkœÑ⸆ðD ö Ï c•dyÌÅnîXðsÆMq6Ö‰(qS±gê À¥3Bõeû8°jì5‘pÙ¼ÝÄäKÊî8ÈŠصèÛ¿ˆ’üJ±M»¾¿ÙPäy„°Æ9ƒWB8!"quÍõÁ*‰-Mgq¤àíwÃæÃûå#ñÐßôkGèÇâL`Fjój8aÉ4è "À“ê9ý˜b¸¸ï))$®é{dð.9­bRK‚•rY$æ`˜¥…h¦ Å hÔ™œÅF%®ZCHQ£Ô¤¤\u…­Âé£:¥ÖºÞPhì\e@Œâl[îAËf­£ð²ÍsM K982@Ù W„Ì,àpSæ%@1à{:Æú;¡ãÒ š¡:i±ÙððÅ€®y Ä[B[…!6˜† FYiJ˜lx,[z­_Ôc¹šÄÎâlv !ÆÊ71#çhÉj) ³¥æ?˜Â]iálv»‚ïÁ dSækjžÊæ»6ŽÄˆô£ 7ŠvYÁ+xÀ ÄÈq˜OŸ °ì´<Š`h¤XXB§Ãè<¥ÈжÌX•Ž’)åb>fÜÓj”t«(qIËS=Ƀ™ ÌQ#óȳ6)L¥´ý °ÅÈ1õÌÜñÚPʳh+ªù†à¼<{á á€5¢ä²e 6L(E:&,)²YA‹LB©{ð@ï/±%_F+ì«›<„‹‹Ö ÇAQ×Â¥½ptΧÂÎ&\6j?žk"ðð•æøÊØâ®5£œ‹žI[$k–Êe=FÖxjWÝç*âX'ÜáÌàRÖ¤TŸïvEã0büDÀ5Wïæ¡>Þ¸¾Œú8}"pR¼[ŠBå„*¾Xf(¼np vO}RÍî½§H.\‰gGH,ˆÌ/qba”Q ºqŒ3ÍGÁwðLåžÕ‰—Ä4OÿZÎŽg×HzÇ[à5ˆ™"óX –Ç—3ïƒc·bìõ!_¯§{»ÌúPî-§¿`¤öÕuAk¾Kýó>uýlujv®·+¹£“A‚žw2IA|jw 1FÈ gÂvT7‚6Zb%8“âÅXžÐ¿ Yšˆ'E”øЈãbÈT¡!ü½D4nLJÜ „iS|ã8ÇSŒDåĩ‚ÝÄLyê功» 8‚8i§{8&Š¥ ´¼Ä¶¢á:ˆÏöoÌ¢j{¥n¿ÒY_1Ùr¬WÓ&Λ—½ƒ0KdBSoÞ~r¾ë´gÄ]Suí°-KÚ•°ßqzt&;1ÜÜ#zâ4këÆ‰Ð:„s6–Ä©¡<ÀÖ4\Áí÷Ohbp‹:‘g e³àn‚<¡wêh@\Éëèz–ÎÍ3ø„%¹CvÝŽn!N¸c22Bˆ‹£dˆÄÈ/$­E@ЙÇî†íPÄbÀ½7‰+¿-Â%IùýFKT¶zùq H¼HÎ|µ¨G+•“Q'*¼–Çš0¶Ä%–3„¯sfË•÷N¼1¯I%¤XÌ/#é‚''ùŠ’1’ùÎ)’ºUm^ ë)†ƒb:ï½3+-–µå!Ú Zp¡D FL|ÍHrÆßš~®Œ¿œ°Þ$ôá¤ñ瀛3Œ•¯Ì¹ ý¸É 1ŠæÔÉïÌM-Ñ&Ä9·Í$›™?Òê8ÁÊ]BjcJ[ô–¦"ƒG¹bqŒ „J@„d.JÎ')å< ÏþQm”òio8 Hg^SHc7µ›3E3¼{Ñ‘ó"ˆFŒ\’ŠkE{® Çýàˆ&ÊxÔ”ûå(Z8ÚßVG¸†_“w¦qw!Û5 Ms)xmru+]ËÄ\`#MÕ¹´wîíYÅ·ŠìÙÈøñ„ä¼Òà¹%08'%ÜV6»¹/ ¯6ïÜ1›ß*É,ÿÀ!ÎÑ‹q/KädAŠ’²"t6+¤l.µ v ?5ì§@×]»z,#Y +–›¤àÄåaH œ¥1¯­,€¸â%CKˆÍ­ÁW&Tñ{åJf{Îà–0»“cI¬]C%\FI K1ÌÆ ¯äRJ*`Fی٠ä^ß%Ôð ¨÷8äÑy8ÿ|€a÷[&˜&Œè®0Κó('¾ŸÛ£_™ K~Ç¢ÐvŸ9Àymõ‰ÃÕ³G4A4)Fomͬø!ü$$+)…Ç’r¦¸LŒäwO&Ĭ²Šáï'0ì=„e$Є´‚2󔙃µ-V(wªáwBR~°¾ŸOÿf=×%ÔŽµ8#—ñ-ZöÒ²Y}¹-¤hÙ©wÑ¥Qw¦Î8 A†$Vâµ²•kw º¥¹>3ªßV‡ÇYµÅ¯ÜºCá$CRŽ(d«cܯc H TÀN9æÑ;÷’жà2é4šâšLŽ€n6×y²‚ýæn³c0éɆ`Ÿíæ‰ô‚Or­[QBåªQ»„m5 KJR “ϧ‰i½7\j‹JÓ{o¸rúœÏƒ˜Ü¥& oR*ÂÙL…t×…™÷ÇŽ¢x¯6(lÓÿ=¾öDÂôyßÍoß=Tã’[}%·g/Áy_¿É@Y?Ie•éê¼¼GQ[[i]éiÐÉÊYè¡ð¦j¦‹˜6O†£/DÅ»I›ŠR•6Á Sý´ð¾3 £†W¼‡o.aø¶6Pßíoàw·`b†OèsЧž04s¾ÂÞ1;2w3¶óXAu§Ï\±±rƒ»mŒ^AtÀtÀ¿ :À+kjkª%+jìS3Œºs˜vððªxƆiô‘p á)!ï‚‚cƒ'Ø Õ©µÞñÎá™zFý€¸1s9ä^j«{öôƒùç À[Á£Ú¶Ö;)–³Âì³±›‚¹Ï11Ãñùð®5ÕÞ endstream endobj 8770 0 obj 4079 endobj 8774 0 obj [634 /XYZ 33.1199999 479.059999 0] endobj 8775 0 obj [634 /XYZ 32.1599999 480.979999 0] endobj 8773 0 obj << /Type /Page /Parent 2 0 R /Contents 8776 0 R /Resources 8778 0 R /Annots 8779 0 R /MediaBox [0 0 595 842] >> endobj 8778 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1549 1549 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8779 0 obj [ ] endobj 8776 0 obj << /Length 8777 0 R /Filter /FlateDecode >> stream xœí]KÛȾëWè`eöƒd°g<r`x€‚ïn‚E¼Èdùû¡DJ3Ó­¯ÕÕ-J¢ xÆ¢HVWW×ûñáO_ÿ±ýçïÛ_ÿ³ý6ÿ|øºivM×L¶û¿?¼ý@š’Ó¯½iwrØÿÙ~û¾yÙ¾l¾l¾Œÿ¾lDw¸qþ1^<¾bzàïß~Û|˜^¾™>ùúð—ñ·ÿmåöÏãÿ~ÝþíïãŸæçí¿ð}c†nÿË¿§_„ÒŒÿyûÛþâ¿6ýÃö·sxîþßúÎ ¢•Yp¼œn‡¿ooE/k¶C'„Ö[!äg;¢ã¿?o~Ÿvcgºùü=æMfÿ&#äø¦FÀ;¯´}§û&ø^žÙî»íþCû¡ #•ù ÙˆåAˆDÞÒFt÷þGQQ/3ákh³f˜0/ŒdÚB³GWÎÊfÄã'‘ñ.•ž)tî2OÊ}Ú/–ãA{ˆDÞÒŽ˜wõ……ëÊW®ûâ¹ñÓóæÃÓ°—0Ï¿Œ`ÄÔôãùûFÿÙ³ÞÖlŸÚþ±iT÷ãöù×Ͱ뻶“íA®MWd¸bN4òðA¿kÕ·Í›¯6‡+úõÞé©í(GÞûö©Mg=UL¯Ñ;==´‰¸âÄ^ŸÐö‚íe 1½FŸözãFÁ+Ÿ£‘Ô˜ÃÝnd4Ôã÷y`t¶ÚÙÐÏtbMüjàS…ƒgá:š\朂,º•€4Œ Êqìœ |bãÃ2ð‚]ÚsxˆI}ïçç‘)b±JY<ÖC2˜fñÌ6 ¯sPèžIü> =<Çâ“M3öv«È±Ó LáÇ”ã#Ÿ,´ ­çe‚,v‰À /L/Xâ:;ë¼/^Îy> ñX Ú@.—‰Î±CVˆ¹ñRïå4`ÞXTAÉ`Z[ûn'Öìº^¼ã‚¼z§ÌB!˜s»DLÑí`t”‰ÑèÀúäp%M—’ZÍLº£©‚;…tPë°®ðÆU–.Cv>`=ˆøa bÛ X›t¨œ m刢°A—n¯<;rä÷ïC)…¬ÊxC‚F2KN„‰Vøl†ãŽNcص@:seV_ÏÝcà=-¼!h>Â+=„¯ßWêY„M}†OûŸïÁï‘ðUi¥xO5~„M5ÚP{V !ðP"¾ã߃÷GÎ~&œŒ7~šgxÏC:³Ô+(lz91N­+Û ¶u3¬j»ú ̶"ã»õ(è'#ùñ².„Ϊ*C߯*CÌ{°‡Oóˆ ˆ7‰Ef­¬BdU@–½R|Jª‰K%ä{`ÌÎ MËVãݵd¼W9‚;xìWH=<aõ£¦„Qº½; ƒ ?)€MBüŒ̧ØY%Ù*ÉnS’ ˜ë’d®ñD0sÜ|ø˜tJhv•gå£êîä£Àœ ¯Ë‚ƒOb¨ Ò K4¼ «tZöJ±“³štÒÚ¼'ñë’Nž,IÌ›) - O]Å0z’â¹³×ê(ÔFܘò*0š± £Uݤ0Ú—^±0ò0mJFñ*rÊ‹œýîNäà”BÃæñ§a¦Z‰A®ÂhÙ+Å4ZOýþ`^™0bÉðO¨PLXð2¥E@Ttb-Ñ¥”è&dïtRÉA0Óy-Ñ"±œå×SÊI•˜Ÿ×Äþ9Ê/–0§5<Ät±]Rδ%h(%6 „— ‚ý(EИ¼œ‚Ýra?lví‚ÜØ ˆ­8BI€§Ä»…V—"³m³ûûÖìHJ/Ö²W;stžªñqW+ˆOwuÿ mk.Ìd­’CieÀ®Š¡±¶ÕC—ŽB9›²4-Km¬UGt.)bŽ{,…²‡(Ù2*¸ªuˆ°hQOJ•06³ˆpoJ\f &±râšáž^žÖrqÕž¤a¥…"òT"¯aR†;µTǾ=ÖO4OHu¤´” …G8XrŠâYV a§~B+ˆøÞ<«3‘Ç™Q|ù“’4¨ :ö6o¡ìP¼–ç®1â)1››(Càaª×@BY‰Ãì-Ün޳[ Ë ú •…K–e² 0n2œ@ez¨-™1—½q´OV]lÁqñxb ¤Gµä•sñ)>SÞl¥>ë’1UÐ&ä+íOftw¯¨3ÎWë+óªå›³úÉyÓÜ2¹Ùuúvº¢&< µS>_ïQ3UÎ¾ÊÆ¦’s÷<Á•óÍý‘b^(æŒõB%(΋gÊ}‹øXψIø-òbBpTçÏ@0”f„³sÊècŸOÂaSÒ¸ÚÅ&(P8/$œ‡!J˜g@²Ó!ÐáÞô÷7 º FQ‰( ¯˜1²¤,ê”%ŒRØÁâÚšW Õ·²µqFhšÓàÞÇ÷à+0%@A¨UñvæÝQ³?á±Í²{Ù‰á<ý¯{oØ7öyȱÎŲ„Ñ;Zº†ý=„ñtÏ„adg[:åg|(Ǻ*ãO®Áɘõ4÷Z;g_ÆÏzrv|‹COrž 嘢-]®Á*&ö74ÇÛ7ç†Ib^…3Wq² ¥ï‚g#ãî‡8ã'Â@®ìáä+ñz0v(É&¸_!!Ï_azƒW_RWøœÉˆ“¯à=!HWÒIÇü¬ûèÑ09iŒ÷ îñéyÚ™_ž³‰ù ÄŽÆôV‰v0˜×(67|GQC-ßGñ4Âi•˜*.ΟVŽR£ðÒŽg,Íʹ&Îõ:㘗sa*'¤¤k|61UPúS¸ði—,éj{eíüuÓ‰oÃëázŽ +sæ \¯¦Fv}ðˆàŠ%Om 6ùW¦³¦sùÜb^Ó•4O…’ïÇŠ…±C9³!1F1Þ`½)rÙõiR¾Î2¸¼»WGb.毒.—î QM›Cc “(yÅZ-KWõ§@êÜM®Ùu½ð'Z¥4±p<–Ú;炎”ã=ÃÅ’>%9(† aÎê­:{ˆ€Ã D¢i–©»9éqùÝsXÐX’/Ka3æøFϤ ¹-“LÓSÍ*%Y¹Pð”’s›“xAÉ>/Z)HªÚ¡ ‰Â ¦ýð€ tC–­}äV3;ï”°8¦(l!è1¢ìE–àhX°K.gNsÝzŽóXžæ–“¥—ãŸ%Õob“0œ®—ìt-Ú@¼µµ#L« ÖY†KTVgtÎT*hMé'â(n…ýלtM¶þ‚Šþ9ÒP5›1g,4 ]j9¼ßÅ´²P,þ\Æ ¡†ÍSò…KËð˜÷€Ç×S†­{ò8CÐ=ë!ì6B¾ˆÀ{Ê:ãçbT¥ó¼8 ¬t¥DvJĹS¸Ï*.ç¤ÓuYùÑ-@VRZ4) \UNax°á 3“Æõ¸=òסSš¦øšîô{?Óœ"Å^®ÂIèÇd{}"ü4e*÷nÔ®Rj&–‰nkõþ–lr †Œ±Öv™!xò(L«ãXo”¤´ŽÄqL†¨çáÖ³áJ“Ø„œ·IM… NõpžBK†ß[çÁÄÉãSèÊæId¥L—É/¿W‰YØAX2ꢕ}&(ÝÞpàÊi±Èšž¡²FjXé¬ îŒêY¡É²i³ëM°5X2_<\–÷ìs&9ßjïÈ”&Ú”&@áÓJ¾«à0*¸/$8Øáqß‚kBÛ‹¾š&+B vUVœzDÛÛ˜äPfœÐ°«”­øX›¸SœK—¸|!Üý=Þ/È\àWãä+ÓÙ'¿Ò¤6ì¤÷t߀!ìî¦ôñÌ1ŵÿ„+;Ê’E{t‚D„›ŽFX¿#h:4»¤q=(kke™]ÈJÔ³ÚªƒˆˆQ3a‘0dÀó¾»ñMqŒFÈœ90x¢€œ¥(¬ù%ç{˜&Úö«ä³ ¦¨—·„ÛFCJ¡4H¤L›-R„½åk°ºoÕ±Tz¡ ~$,(ÉÁØ•ž=b©8½Tíä5ºß=œ ¡àWòB!¨a•Œ×öÅÖïF‰[^l—5wÿˆÖ›‚ Ž®÷¤°0AÃÔ証V$ 3_ÜœæÂîØq¡†¤â}B·±°o7b*i(5Â’!GJåxl+;x_‡í`ÕhÛžÜXwS5ê)úÁ!B“§XŠ®A½ÎÇje:­9¶ÁS3_<“R¼ÀFSm…Öœâ<Ä^ÚµøUœ®Yc®œÑ’cD®ýhZ‹%®Ù0UF} aã5ŒäÇ ½•ÿ§ðR¶2Ê:D<‚ÎI"uâ-áêºê ^élÅså²5¸¬éŒ…÷ ½¶#ã:³€ØUïBÎû:}VË›½]Ó¾ök‰lþ¹ÐjAP/\j3‡}^a_…_ á'›ÞÂûB+}Í3æ2­EÑî…!¨4^u™”¨îu7=Jq Y‚÷ê‚1{=O|s)ùŒPÆOsýšñhÏQ|Ëô}MOÑfîí•’´K Àê½bñœ&ºgt/b™EáÌ_=×gꡲÕàÔJÓÛ*YŸŠqöºŠ`­ž¿’ÂÐy&ôÝ`®\‚(qü»}In¤¨ýæß¾{hÐ%Þæ•x¿xÉ×{kîM·ã2Ω΃èv²ÝªÆj.Úu»î¼F2èØ`ÙïzÛÃ3mRæÊ´ÓJíäpvzcÛîºi{l8÷ïà=îåN6‡¢‡×+ŸàÓ&{ûÉ#üî¬(žYáºgf0ç®´Ž™˜Óî™w,eí3l‡Auûße+ŽîBw{>àIt0k¢it0ÓµtéãâQïܳÁ5ÞíÙ¨IZǬߡgBæÁI(_8Æë™³sPÃsŠ!ðœÓ–³`LÓíÄ>;Ì:˜áãòN>1ʦí—ÍÿË©| endstream endobj 8777 0 obj 4375 endobj 8781 0 obj [635 /XYZ 33.1199999 569.299999 0] endobj 8782 0 obj [635 /XYZ 40.7999999 519.379999 0] endobj 8783 0 obj [635 /XYZ 32.1599999 571.220000 0] endobj 8784 0 obj [635 /XYZ 40.7999999 519.379999 0] endobj 8780 0 obj << /Type /Page /Parent 2 0 R /Contents 8785 0 R /Resources 8787 0 R /Annots 8788 0 R /MediaBox [0 0 595 842] >> endobj 8787 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F1739 1739 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8788 0 obj [ ] endobj 8785 0 obj << /Length 8786 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾Ï¯ès€m‹½€ ÀØ3CÃrr¼Ù‹ì"Îò÷£nIÝc²?RU,RêÙ€gÜlQ$ëÉz¾ûãç¿þùÛá݇Ïÿ9|~~øüP«¦ÿNxùîŽF¿¶]}ÔýéÏáë/ßß>=|þýö šóƒÓap~Å8áo_}x7¾üaüäó‡?¿ýï þ÷óá¯~ü8ÍwúÂ/]ßœ~ù÷ø‹ÒJwÃ^þvü×Ã_~wøuXBwž÷ôïm[ _I[Ç·Ë£êü÷å£èeÕ¡otsZ¬ÒÃ?õpÿýÇÃOÃl—e{«TÛØ¶Z<«2ÍyÞ¾>t¶àQ{³z›[8—Jž©o{¡™NkRi»ë;žéØ5Óøû’÷tÃ[Œ²'8Wv@ç5êf­ê¦kt{š¼2ãMÞêÓìF‡Ò6]õüóø~ªÕÆÊLtZ‘JÛÚpðmp* 4¦7ÜW©[¾L•:Q'ÍÓŠTÚÖf À©$€ÐÛþ¼áºMÝñÀgàˆÂ+èàˆ†#ï%W` ±RpDX¦µ‹fjÜ›u·ô⃧óª:6­ê†_÷8žX{¬¼Ý·yñÈ™æ¨ÏoñOùÅ’ |1\RÕÞ¦šë¬úÙýžLŒâ¤Œò‚·¼<|”˜«``~ó5šUÏÖÃõ´Sº•°?Ö™À‘6=£}éÎ6â¦G®¨Ô±¶ÍwØ\@k—À@Œ)$‡×:ñÂnÁk”OÏÛ¸Žôî$˜ûN Òv78LˆÞû ,¼÷yª~„¨µÂI¯I8=L0Ÿ™Ô”.€•˜›` aÊñ¸¥÷¾ØÉg+mí©qzð•Kœ>è–£7]ìÚpñÙ.—oö¹€>­L†D«»¨r¬Jë£[j&ží™®èTz8›ÁêùGºB]ã‹\>ÑID­ Ÿ¾h¼xÁ«ÆkâñlðÜ œ-€‰ïKšm£ Œ¬Ûe-&uÎýÔÂUï,e ,%¼jŒñ˜Ô³áµa¦ñ3Gñ¹ÉžN`?ðÜûy‚# øh¾§Ô¹aᦠX†Ð1}IÑÒ4yD 6I2˜ga°8bè²P Í;eèØŠÁ ÐÆ;ÅÏ0p‹þbÂàí0ϰ®®¾­ØbâÕXì®þÂÏκޔ» –ÒU6e+Lh±‘BÛÓ&a{+nXÜ‚qÅ4tŸ*,},3ø àý›ò– |:ð= ÜBHmydrqFæLŒŠSÖu¡=ÈÒv{q ¶‚•Uà «w•{ [Ťýx„#x1ÊÊúêDýG¥Ñ]€H ¬²0¯zû_ˆ7êU_Uº$Üæ¨ ‡cÀ–Í0°T Ùµ‰^ä+èJ¢Rß¿fJéU—°½ ¼²PxNœÉÛÑ:öiÍKá»Æ†é'p:Œ÷p8K+d˜±„£á{4ް‹áA!AeR¢ØXb_'9ÈŒD†xUЮ†£Iþ-¼jl_Å–°’>—¾ž#PÌ“Økk‹ÂÈmuz«È?®ÙrT?ÈÁ-à ÐÇ1Ê1 sÉ##–bøD+И2nl˜bC7ÚµaY…‰ŸÆ7Ñ30øžW`8‘Ý ×ìpvºc¢8&b]ÇLa¯óJ£F×®8ÚQiÓ¨„5-ãÀ^vƈ0“ÆÙþØïúQŠhÂÕ&LeçH‹Û¶mêæû|f/µO"ixÙÇÞ³”¬^BniB¾ý$ߥL⼯ÒjŸ§,?M_­ÍyÍׯN(‰+Dk«gáU/ðöýx oIK±ZrÐûU5Îz˜~ɹãidç=ó™KI0Mç.cùvØxf¶ŠyØr×I!vWFÓÎ\¾­ÊÝ*%œ*§ö ιoĦ]àÞÞéøbv®¹+£™”Q#ö•QmZÙ·­Œj8S”Ñ]ÉÚ»ˆ*Ú²é䳆”k+ÖW~^Y>`~Uªn=Në1Üh‚P‡^$x/ámÏæß” ·—„êýœ6>¬ÎBY”ˆ€:#êGJjz“$%$Ï=õôPbÞÊî íÍL¯Ñ*©Ì\±BÏÜ躈G÷“iÍõL{ï+½ó• Ô‹‡Þ»Mu%•9ë8tG^rêfÏ^àÀ‹f‰ç_D½âïNL¹=öÝò¥d׃§9ÕÎÕU³8ÇõÛÁ‘yû&±Ü/„P$‚ ›åA±MgîP%rY€mþ̬ãUÊÉ À#x ÓfB¯,‚’Ã8϶§ÄÌa ëA^ ‘'½ i €õ×ÌÐÃ!'ßïŒËø—6…1¬œ‘„–^G3pVXý†lbýЏVÈ6ƒ”€lÊáˆÆÞ%x)êù¼Ä8ÁZ”k=cçq/•Á=Q½/—,X$t:§“Ð(G&Q4Œ½X7!(¶š„(ªà¸höñ fŠz±<uA˜MÞ„aÂåÊß–(bún‰vÃ2Z!fH)í© }€%"rðþ¨¢ë©„‚>ŽÈÁÄi‚A$ã;§a$goÓ:LŽ`pŽ÷*`FžÈ1µHÄŠ¬ú›þù1^H›ÙÉ¥/µMªê{DVh¤šlÂýhÓÓŸ ¼§GÏLÖTUG»“' šãmðbdÄÓîh§s¿Ž˜‰b´[übÒdn½ç#cÕá à{*¸ê«ëÕƒÜ3\u©âµµ>x6 S ß3{(nœ(†‚Xžˆ¶¦›¹P¾æ°…¬®"u^âJûj.“årÙßçB#,rÅ¡$ßy:®l.zôr/›ãWÈ-!këÊ㣠¬(íßFÙ!ÈökãðýRî°xð'³™ã‰$Ô”ÉâÙÍ\·e‚'|y~b‚ã8KtuŠ­:C>³hµYïb”ÅÎòV ˆ@ì\!˜c|&£êzëH {. |uyˆ …ƒ¤T‹s= ’¸ov-¤>F «² Cí£=7oä;Á•ñS™2÷èjÃúÄåÌKRÖ]g”<£†ôÌ…J{´êÌ0 ÷ètjÅmX²s,Ý› (b„jÆûe*Π^©ÙK&¡!2IÐM—8_i!\ î1lj»ËwǨU&¢ø ÌY‘ÀjWh-¿¹òž(|Ÿ`K(‘› l¯ÒÛÚµÌ&HVÑ=T.^»KÛáDù/ÕGò›LÕÄ©æ~ìô9Ct•{`ytq¦ìy¨/%„€à*‰°‹ÃÊðJFõ7޵%0i‰€Ö¤°Õµ¼x2º°QÕx 5™&2°øj!–êê:0ZêL} ëÂ%[pËQlÝÃÍ;qaÆ37‡ÄÍHÍ©÷‘}ä…jqkD¶¯3^£…ª†l…Ð6Ç]Âà.¸´«ì.<%º¼6¹‚P øzÛͰ‡ûÞGö‘×8Âáëë¯zÙG^Œ”‘½@Ä6õ´}d±X륟é=Ex€UM–=d-î<¾:„÷‘}„Íð}Uö.½ ¾aæÒ,,ëÞ(¯ÙyÚ>²Y¾Qã~0p¶õéÔ`:}²¶YöÀ±˜bþ¤ñlˬèN Är–OªlÄ9éD×çOëÈrH…aºc¯0ö¾JîÝš,{à?ku($$@¬V‡T$‰ÜK É ‚,=‡…{mÆ«G2P›U£pwJ–!-}y™t?›0OŠk¼v ¡ãv!6ð(PÚ*‡í'1œ1ö„ Í±â]–~Ì¬Üø<™¯Ë [¼B"!¡„ §öŠU.(HÊ©‚ç2B ˆxöêäW¸¥të”ñJGc&—µB1¡~“}šˆºžàyèi$R sLù¦”µw÷yOT>Š47²5:[Ÿ"DbHéÚ²)È»¡¢\’LWe¯ú8_f»Kß ;j)¿ õU\›I¬^ÿUÀk„Ë¡ÈKvy¢§vWºÊ̬åúbE8E£æ®<%D ¥ÝXý8ýøòÞ®ï¡2ê=šÛ6S'ŽrÃ^©øÓê%ÀW*ì¶rœ¦½,ÆErêÉjNpêã0|FëûçÞΈÁ~gŒ!8FûçøõJÊPS7×”ÚL6ý>R`D–šÖßÏ>²lj¤÷n«¹r+ëfu)¼laÄÂ:y-V6Vœ¡•ãýDµò2´©/õzy øYqÁ«ãØ>¤M|+åŒ@LĵYt†3Ññ>F|8ޏçTÞ dÉ‹fãÎ@¬tþþd›8¾ìe ŽàJÔ5|x Ö0¥cÚä袵|å:Ý- ôkÔ#C)1í¯ØbÊྻƳ…–Åã¦&Ù»¾¿Î» i¶Â´]†Ûus%V6$ÞÖ’øõÅwž¶Ñœ—‹+¸°júcz–­Ö–£À®šãv8•Ïð3ž„ϪPóúûÚF,¶U`É-Š;X~žáÄ”j˜×Õ“$¡ãæòÈ/Þ†œdáHJëZ 7½×:rºj·=Öâ}ç¼ÈÜ”.ÑœØ2áóÄØÈ‰{Ã͵k8[BT›Œ8üX½%š®±¢0tO‰¢„äŠd!ó'ÉšªÙ¸²boÙ+Baá¿„ØlV¾øfj"¼vôöDÿ:hÞÛë°‡óqЏLwØÁÉ ˜.°¹Oå–]ß;gˆänÎn×Uë.bª}àç©°ÒpÎ6Ö %2×D’áðxK—H ñà%°øA(vo›¼#ÈÏ]gË{+JRnð%…`a`ôh(˜‘D‘U²èŠÈ«e–ËÝÜY¢:‡\S\Ä'M«]FY*7·¿ÔòÄÆQBñŸ¹ÄKDysÀôZJ¡-ÌLEKÜà¢Lžx—ÈÞ p¹ÌÊÂr(q¬Ýq«C¼çtå$»Šhg\Úø³§¯j m]Á€ír)…\' GÃ@Í¢¢ËZZˆWºs­ÚHÚBœK‚HQ,ƒE¬„’&mÊ °~ZŽ xñ„é—^ë´Šüä˜):‰é ,¡€½R»‚¦œqcæQü9ÕÐ) d¸¢ê>9‚܇'I ×Î3óâÕ*‚{TÄÒÁE]†XºÇMª2¥»Dd@–Àóº²ôW°\SßÍíÅjNɱ_ršÁá nÙfpo¦êî”ÓB+ÀT¢Æ”ÅÙ4¾­Þ¢ðN›ssÖÖ—Qkme..®Ò!˜Ë ×=BÔM¾ :·gÑ „þ‰º|ò˜ÐŽ–»Ü!˜¢=û^jÏV婯ËÓ'(7oe±ö2¡Âß 3+„S¶pJ^J9 ÜV—©Æyf×G¶ Ü©Ö±æÅ¸×Y¸Ó œÛމ[ÀÄRúïÀ¿å­P†ë‹"g N¿,m½òè’ ”iŽ–àèÍ‹)R%_´gŽ"6÷]—ŒÃ/%§;IÑ'D”{¼Ãs{ˆæCXSz(AN‘Ñ)Gfhí®Êc ŒôãtÝ#` pjÌdÝËp©lãRòí®ùÿ[ɘØ|G9fväK ›)TS`Í$Ý;ReÇY ÎÆ4ÙwÈfŽ è<ž´Àá…o¥…}ÜËÏ_î#òÃ5×Î"¡D3ÂÞ3i&…<Áa¸Z@!:¤{­r¦ vµÃõ2‡]Qâ-—{ôÈ]~?"ˆ8ND¿ì¶Õ ânh‚_"86`ˆX.`ó®•1Áb(yc·œÔ½ó¬×ß6Źb®^§µ#íÍ ×ŽŠæ0ÎR¢æ%¾ÑF;®oˆŒR²SdG”p3R1W²þ¾ ô9ßiŠéÇ×_ëSzu¥ôOAZ>e]sPÃFoé½jŽgd9˜j.?™:šæØÜ¾™ôöèÞx4º=¶·³ Ú##(Œ9êþæE²®ÍZ&·ÞÓÁgzøÌxÇlõQWæ4tygIçå'O𻳸±Ã虉ãÜQh!О™ FÙû´¶3$`Ýéw]«K12í‰Å‘ð@=Æð öž™¢.†gªqè:R¹Ðž\D·æ‡0Ũ> endobj 8794 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8795 0 obj [ ] endobj 8792 0 obj << /Length 8793 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨s€)‹»Øîv€6CCà™I0ˆéÌ!?ªÕU&õQ"ÅE’iîv©¸èñ-ß[H¾ùÓ§œÿùûùÍûOÿ9Ñ?ß:5—F6ßóõïÐöÂèð«jÅ…v×?ç/_O/ç—ÓÇÓÇþß—‘·†úGÿpbèð÷/¿Þ ƒŸ†O>½ÿKÿÛÿÎôüçþ¿žÿö÷þÇOº¿ë¾žÚN^ù÷ð ¡„¶ý»>ü×é¯8ÿÖO¡½õ{ý÷¥ãM»j/¯MÉíïcS4Xsî$'Jž ¡ýÿÒÏâ&IÃÏ_O¼ÿÏ•;ºþ?ÿØ‹ýñüùדº4Sb=ý„ßžð <”¸‰åluî",žhÑM™©6=Ñ„˜êí=á° •𠃽Á7e]jµ¤-(íÔR6˜R5››ªÍ¡À,!‚ºÀÁ÷xjúÑV\1핇ÕÌ4E5Ø };Ørr\^_Ùg•ðk¨î嚇QÍ[H“¨P!†8ÌZ+¯Xôƒù~&“fŽz€²Íc² Ô^ã›mÆóÈÂ*[i":c„¤!0–a¥€!6ìM·I¨”d‹•Â<.a#Å”sáK|qüã¼L^aÁIkÙ‡L/G䨂½ó<*cA¤,‰ýpôŠÝ‰y¶ŽàÂÖÂà ØC±Sh9-T'ÍSË“öõÙõé̼íÅõðx×8Ö˱1ãÛ!±¡YŽE|VÝCoY/lQo޹¦†Á¯µ~j)ãé¤3¸Ù‰˜Ô†x꘦C戴2¦ Ýä ø“ 1Ê1^3ü¹Oæ-zÒŒ–X ã íüÛ'ئƒmøˆÉ¤"ß>úõF‡Å$Íe€€ãhPpáZ4Ì@ËÐT8­y&f ±º03ý¨Ñ§¼hÐûðÏà ¾)lã‡iD-ì<÷¦ÌeGg!þªÈÆ´–ÉÃ:F®–_Œ]L[„_˶ŽËµq¢4Ýf¤rȳ<‚Ú«Plb…ðM¦`Њ”o ÄúGññDl%6Û»C!Í{‡1X==Îä­iâx1’ Õ±>¾fˆBÁŠsJMÆÊÏÎèEõ$W;Õf1#œê…’=437°!×}¹ †d•£V²avq¨Æh0|ÆwàÔv‚jñJŽ8r©=Á5K¸jÊ‘žÉÓMäì ¶iÞÂÞ E5ŸzÑÍñƒß4dMñúà'˜:pMi@UÛ>9Ä! x} ðÜ´L™ª¤ƒ:‘¯$ìK`ÙIÛpFñvç‹ÉÖ¤BB«µÞè&mξ_c}±ÀéðMÒJuiÌ&«Éìx5™ÙM¦ƒ:X½âR¯j2wÊ!‡3™‚v# u‘Mc%tþ,̱=’×$8MŽ9d¿×®±#l³|ƒƒorà ª˜ÁüEñDgŠbN‹Â.Ùä„/-‹É¶œ±q€ “6 “0Ý@ B«B« ,v&· ÷–ªqOÎŽaâ-[ú˜«;iH´[Ðjf޹*éXeÚˆÙÖà#UÊdŸ¢»,f.™ßëš±Þ±æ÷*¼õ†ŸTXà&஫/Óêu!ZC±o9PpÐÒN/± Ùc…UJ6稻ßX6}ê†ÇS~ ;8 3^/ƒƒCÌ1«ƒ³„‡jä|¶j´1«¤ë£:s6éKo—‹V¡}p Jˆ'–2ïA[S1æôSÕë](ÕOÝ‚Ÿu‡œÀãy87Gý;æìQà•«GêìÕƒýN|A½Åú®<«/è\üâ¾ V„¹üºžg^ï}(¾w®Ð¡Äú>W%UÈ]jø¦óëÝ ´ãYB >ÏÉQ>5ÇÜü®3Ê­)—tÍGña6èz†Ôk›Ÿy”9¦ÏÉüÁ5Ê O à¯ûtP´'qéŸPÆÚp¼»[oœÃîßܵÍSv=¹œrÊgyÕû2áÄ·hs±x &:öM>x-´a&‚ã`xšž!„eF2FeDdGá«Q™ÃEepÞáõãÜ}ÈQ‚¸M=PyÓÜ[£?NÞÉýa¡¤kôǹøÅ£?̉çß4_ĨÏÙ^ÄhOGp¯¹|̇$©ö=ítxÄØï 9Q¢l¡ x{>‡Œ}¤äÅ-Œ cž›Í]ïð6¦\ráâÆlrºx„Ô«ÜRäò.N{ãÄ{Ðùî¸ æ0^¬-8X —f„ iRp„ ñÊÅ=6Óºx…® â•P›Ã建Âyëx…tÂXð¢¹DÂÙÊ%RS ÒIRf™$—8+iIsÅæ;†ÔqèÃÒ¹óv)ñ!XW‰{lYˆº²!«4Á¼â™ßù‘æNú(rrߺc-€i{ø dwT”’8oJ'4²µ cÈ:G~þM¾?ežÍæ.WÑãë].ãÚßr nƒwËa ǰ}vL߲Ɩ“挼5VWYvóËeÐJ2…Üú¢—g¨‚@à ՙ3FM›z}šI£)Áq”.aäÿCæVcÔ5F=³rßOŒš²íÜÔåæ €ã¶R‚Ü·¾–/” _ c6¥Â×̤J†ðµ5æÃ׿;Öðu _×ðu _×ðõ)jøú¾¶ c _T™×ðu _GÕX¼h!ç—¿†¯=ô`Öðu»àN—ï&x48Û!{XqÈ®†•wzñœ`tÍ=#ÅoÒMä-ÅݬÅÀÇÃÌFÕ¯¤øV§®R\³eÁÑP!÷ E©ÐÛØ=B\1sY1ÎÁ–XC,Á!š¡„)‚Ë1ÒšS™S ?á©…S6jZ8³x’œ.¸„â»Á»G£A®,×–ïÔuÅXýì½ææ®‘HMÂ=ææâ^àS+…ö¨å\î6ÙU¬Û½óèÞî!òyÜ”ÿ-øU³IŸÏ“³æó¢Ù{ÄʤþÚfC¬Î‡ûPmV¯©¿%Ñ (§êõWThà)2Óî†Ôz{ìÄ3álŽ6AË–Ce+7$ª1zc£KêÃ…<íb)}Ó}ªøB#ìB9Axéç‚G^ÎUÈÜ(tï"Ï »¸¸ /:Š ­Ó_ÝÔ5¦Ð/Ð`Q’|+8µ‡‰a‹·l†@Ãýÿõ&NB˜ßÈâðê÷„ȳ; ZƒðUÇž[z-J;S||?þnkn·¡Ð½›:áÇ·qÆü;ŒÍšì¿Å!1¶EÁ¶Éô˜Zé""+´•¶ìIÙ ÁMq˜ïÎJÒôÈ™]¯×ÔÔŒÚñhP>»\/ÊÙ+ï.#-î׺+#½Ã°Àá’¼GLåR}¾ ØÄõ8LŸ/(Ì+b’ŽÙ™cz¤‡Ü§iÅ¥J•vXçôÍVgè‹Ê]A¶÷%rʯI™ƒRr§¬;‹¡ Š´ í´H×”uMY»f²ã”õ˜$Þ†Ž9Ù4˜˜’:tŸ;$96žb,j )(C±³PV+L}^3³{tÁ’&R38ú«.¥ÙsfVß z'ÀÑ4b†¼hÓ˜LTó¢«9³Ÿ…IÕ’¡„ù5®yÑšÍ+"\˜"âÈ‹î ¾†J5cÒS6ãFÞš´9 p2’l[uÜ)Uo*;^’P²ñܶ$á1öYÍß„ ¶x’Ï]=¥ß¦†‡fª3ôPÙÒÖœÍnÂÜ(cî‘ë ·\Ú¾3ÿ@pÓúÆ ׈nÝ“g‹c³\çìLF•œµejTk½hFµ³ xšš†Y¥³çª‡Ñ1àÄ:J:êÿž_zÕÑ«…ëô/_ºÄVBÍ] }tª!gÓYýÕÊ3é_cÒ+#òr³gÖ¼Þó0°»”9xéøÅÒË{PuQ¦.ØCM<–± í&‘¤9èysÙ¦Æia›¶XJÑ mØõ‘)VS½ æóñ“'ø]íšxèVSOz­lüÚèóyw=·›¬àºëïT×Ë¿ájë²c/> oçø@Xm´›Ý·i†G÷'¹ÚzßöTÿpM1‹›ìíïàUuÌá9ÊÚµm#/äÆ6‹^ÞîQŸFÔ¥ç§ÿƒÜ/ endstream endobj 8793 0 obj 3999 endobj 8797 0 obj [637 /XYZ 40.7999999 768.019999 0] endobj 8798 0 obj [637 /XYZ 40.7999999 400.339999 0] endobj 8799 0 obj [637 /XYZ 40.7999999 768.019999 0] endobj 8800 0 obj [637 /XYZ 40.7999999 400.339999 0] endobj 8796 0 obj << /Type /Page /Parent 2 0 R /Contents 8801 0 R /Resources 8803 0 R /Annots 8804 0 R /MediaBox [0 0 595 842] >> endobj 8803 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1549 1549 0 R /F86 86 0 R >> /XObject << >> >> endobj 8804 0 obj [ ] endobj 8801 0 obj << /Length 8802 0 R /Filter /FlateDecode >> stream xœí]K㸾ûWø`4")’˜~L€4f€‚‚Ùl‚Ef‘Îò÷#[²­&ýQbñ!©‡Ý@ÛmšT±X¬7‹ÿøåïÇþvüøøå?Çoãëã—C]Õª~ާßÓx[ >¼Õ­¬xwú9~û~x=¾^/ýß×SçŽãKßxyÄ0àoß~=|~>ùòøçþÝÿŽüø§þ¿_Žý[ÿòÓ8Þé ßm§Noþ=¼aœñ¶ÿgúîÔø¯Ã_~wüµ¡={úûAk.¥PAp¼^»²óï´+zX}ì”T?2Æ{8eŽÿþãðs?ÚŒªkÓªÑõâQ5ï‡UJvÇN«~èÆÔšÛ¡BÒ§— baScu£C±ò9“ªU\÷ïÛZ ÿzÀÙr1LXˆÐ)_‡ ¨“2Î@'ˆXØÔ.‹‡Š°šõ=Ï–:pÊ·¡BâmœÕ†=˜1ŸÛŒ«Vµ]­ÞÎÆœ¸cM¬Ù@ˆ,„c±qð N0˜FØÃ4b7˜lfiàùkÏyÂøkD X‰­ÁKÆiv•´vŧX!Æ&´6¡YŽÉYÖ““2`o>!LÖ¶hØòŒZMàµÄ}lja-ìak’Ó™äÌ\«ù-ì!®è4z{f ¶|¶þRߴž­çYÀKÈX%õV!1³fƒ90³±‰ ì)B9xŽêº–ç¤çº“v‘”v•{+oC2ºå¦õSFO4ÞY.‡µ:›ÉXœƒ¢áiaÍÓ‚ä!ÖõäÒÝ[ >ê!Íe}8»PK=üÜ€ù„Zê ÖÒháŸq=îõéPÖ\V×´iùëÐÛÁòlLž3š>U3RÞØH¬âL‹Fí ] Ó£}îÙ¦H¢†{Y­ä[0CloÇÖ±¶òسìg¬eà­jq‘Y»}Wš˜‡ÿ‚æp6Ìk~Ïtú±Ñ‰g³œãzhò6~=úâyâYàÑBüZÖf[îæqŒJ¡W N²ºÍR2]¦ ®k+£„Ð'‚ã/†Š+›Õ²«N m†­Ü"¡û@ÛaIA;F@KŠ=ÀÑ`ŸZyŒ Æ}0ÔÊÿ9¤•Ã3Å6„ú½­¶ƒ®ñú@`ØFþ‘ÒÖŒÊV² ˜OUÞRÿ=4T¨âð§Åi«Î|&´‰ÅL*š4ŽÐAóP†}ä;Ô³æõW[x/÷nØ ìW}h»¢>„«7,nA}¸A³¶ú€‰J\h¿fF`·DÉÂr Eñˆ`âíb"ªæâ-¤EX×Íñè/ñº K¡"×w*×U-Û"×Cåú‹ëËõ)4¹åúl6%á0›±ô¶ rJÈŽ ¹! ‰­e1J²|qLPn`Š¼Ý­¼=â-ò6TÞN°¸y;fm;zO™Á9%2Sìí,‹D^U"Kl™BŒbËŸöt¬6ö ãù”ù%«»kòo‘ÕtYÝmáàUVw‰ zÈjn Dëà1ö÷â3I™În"–­¸XÀé‹\Ï狦Œ†Óôð|°Ä/Ñç÷'‰¹’o‰¥Hb‚$ž`q’xÍÚ’Ø1*„$q§ÍÑÃK §¤?ÁÈ;fÒN’£¥”#>5ÅbP±Mft·­Â ô¼îšªRô¼-èy0B‰g8žSb ïO›⚀\´9Àçµ¹ 7 ÍM Y]›ÃqŒj%Ë+cì¾ìª}‹Ì"nW·Vmµ(åáw"Ö{À‹XßX§Î-Á9ØŠÀ߯À×ü-Oø7,nAàß Y[àSNËG‰°<ù˜Ì$-IùÏm(îºÎJ² ™­_×C°~]göLè£ÇÝhW|Æóápj6ü1ò\n–lÆÏ¹Ý åƒGØ‚!Àµ­ Ø©!urù<ªî'Ý~DašJÙË+®XqÄ(M;Ï'_ÜãJ&‰ÕF‹6«xé¿”›£O4AÃöL˜ø°t kù º%I ˆ›óΚ(JZPmñ(å<Ê‚Ï^ÅC©°½«ë2”ú¦Øˆ›Kì@!$ÍÕ.ìó â´åX)Ô‹îK+Á¤lö'Áîµà°UÔâðs58(ÏÁÞ%ì³Ä}’ó!=:F\’›ùXµœHQîuHrÿ«ƒ‰zè<òvõ yî Ó¦Nùcï´Î23ÕíÈ¥>„\î´2­²^94‡.~RzŽë¦5wÕ|†¸·C"ƒ»ä–ÀD1L0±SîÇ!”Æõá÷1¯'JäŠ^.è|`õÐë­¾ Zô˜¼Àfòý{  {äÞ‰ôG"„4)>ŠÛÕ2Ò ô/Êóð.úì‰å9¡qöà5 \rG‰žÍßÚ1ïm‰à ‰èÝöjQðµÊ÷5‹` 9`ÄQxÂýï§tøT—ß­Û¤‹ÂglÜÐGM(4”R†ÐØð9³¸‚?‚CضöðI*0¥$¹z×<¥ÕÚ[>³*I»€5W•ëÌAñ„T,£»ÀÒ[ΪnÐÞ"Åy }‚²H!ãi$Ü1És½/¸Ï2N˜73|,çYÇg@¾Ôé!­³$[¦ÌBÑÒÀJ‚Ý€vÞ$Y4Žš<¥’HÖW\OÔ³It%ÒýtC$)g&O )«Eš*xÔàõž,aJ [¦³Ò!ÅÖV;*1 ,§^Úsë³BÒª$ Ü-®g°¾FRŽÐ’Òï•QéòјfìÒØ>×χc¼ír¦ ¾ %ÚÆžóîsÏäâË®=Ç…¢`é-q°uî[x†JxÌE ¸PÆA<ª˜qݵ×:‘A›4gù£$kààs@²dfÛQ'Kx  Ž¢4Ïù¸_+¯Ñ¼¿K˦[²ñùÒ’oMqéÏ=Û yxš–›YÇÒÒ‹@‚¥½ÏÑJËZdN^Ó5›™÷Ó‚‹OG¦$¬YÅ}NÑÆvÚ"3zª:&63ï÷Ö’‹£¬Ïk ÚkKV^#øfæ¹eûVr¬™fòËÇ]Ÿ-Ç¥ º°MNÓé®ÇBÒ±I!BR83-à8Aâ{àç3 ·|ý{ÉJôÈJôoYk° ƒ¯p’2,q2¼—㊚¤ë¨.c…™=ªp§!¨ˆuýSJ Å Q‘ætkÄøîÜ…‡úTwu|j¹€îÝáÀq#áª=XÅ} žˆç㸗S k·Ø2¸.×A¾»ë u-/r$’>³×AN±8—\™þ:È)4µ¤jÆ{Ü)džH’rR@qA);”,ßo-ü½Üp$dmPµÇes«ßÅðž?%‡O8û˜óË=8 ¬\Š .½Á=j/¯^÷mGû9©Y(±ö œÞ;¥=ñˆ–^ÔÂ.ª²åãu´dª ¢ëvÁM¦k³Ö8å(ô6[¨Àö–Ôã܃G?q}´Õ*Y®­ƒl§Œ^ö*ýIŠ“ALRžÕjS2w) î¾–"òÃW†ÈcJjBº*-QxO€~™?¦½Ô!€ì:¸æsíOÜ¢ÉDUsp-4ŸýÖ e5L®Lé²Åuûŧ‡mˆŒô&$«5DÂòê‘ÏŸG¹[{(œóA–\µ§=λtó¨Þ)ŸûCVºíÉ!À¬ÙxdÝÔL·÷pJ:J’{ÊV-" $…}Ë$Í) pi"ëÄC",÷6ÏëZ¼Cx%i}QìˆÄÃ{$F uìÀ&ß°Ì'ÑÕ#Ís¶†wÈ`¤*õ—Ï,÷y$®d¬h£™ºÒÈ`0xaÀù_ŽÜ'Jýœc¡vœ^ÌU¹lýÓ[»lið‰"œ…G9ÏC8¹´Óªwxc`¼á}Š×îSGsÔ¶ƒ%yÞ©/Þ%±XZJKüÇyÐÕa+-;oÉÃ;;ã&y?}põÓ»ëkI¥%vK@eÈóžé¯ýæè ÿô…ñåÛwÇn±·Y}Ûf/Îæì:»C[udý4îy%;¦ª³Ez× ÏÆÃAJUê~€¼k*ËŽ”4®+}?Ð ï´ öºïîšÚRVjpbÜZ4|N ût°ÏÀ&4¯x-NM·–8ÚÀ&¦Ÿ<ÁïŽY wføõ]à÷ZšÇÈVýúŒ+æ3÷¶ó ºÓ{.Ù5NW{ܾ^tÀ>ÍÑ´úŒ&Fß§šn-µ¹Ú\Âñášb d5ÙO´¿ƒWÕÃs”µkÛZUìtÚËXD¼ýðòNŽ7½Ää¥Ç—Ãÿö5EQ endstream endobj 8802 0 obj 3712 endobj 8806 0 obj [638 /XYZ 40.7999999 594.259999 0] endobj 8807 0 obj [638 /XYZ 40.7999999 419.539999 0] endobj 8808 0 obj [638 /XYZ 32.1599999 180.500000 0] endobj 8809 0 obj [638 /XYZ 33.1199999 178.579999 0] endobj 8810 0 obj [638 /XYZ 40.7999999 594.259999 0] endobj 8811 0 obj [638 /XYZ 40.7999999 419.539999 0] endobj 8805 0 obj << /Type /Page /Parent 2 0 R /Contents 8812 0 R /Resources 8814 0 R /Annots 8815 0 R /MediaBox [0 0 595 842] >> endobj 8814 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8815 0 obj [ ] endobj 8812 0 obj << /Length 8813 0 R /Filter /FlateDecode >> stream xœí]ϯ۸¾û¯ð¹À:")QPHò’= ‡¢‡"Ûm±è.šî¡ÿ~e‹²Ò%‡”äÇؼ}4iþÎ g¾™yóÇÏ?þó·ã›÷Ÿÿsüjþ}ÿùP*]Žç¿?ÜÿBv'%ÇÛ®9Éþüçøõ—÷ã·Ã§Ã§á¿ßB_:š†Æé+ÆûúëáÍøå‡ñ7ŸßÿyøéGyüÓð?ÿú·áŸÍxçürèz}þáßãB Ù ÿsÿÓ¹ñ_‡¿üîøë0…î2îù¿?´­jµ®£æñíÚU\þÞwE_V{Ýʪ; !‡y6Ãvü÷‡Ÿ†ÑncU§^ŠFwZ¶ÃÏ]¥Æÿ]4~+Ï_ †ž}«‡ñ[{xw• ‡ŠHvŠg óŒDÜÒDU·Þ¡8A©Ú‚Œ]òu¨Øê®áè<#·´éðP§¾¢Õu[-¾_ãìºán]–©TìB¯CÅÔ dè<#·´iëñP§N›?ðç%_Ô ßÒ5•Ø]Uf¸f]3ìéy_û&rc¯#ÅžP§[š¹ÌHD­Ìœ4‰ãZi(»¯b|*v ^žÎ3qK›ÎÀê‹N"o:É7OÇw_o>ŠZugìËOç“?éøÏ—a¹Íñ‡³˜&ùåÇãïeîÃŽ_~>ô§¦Wm3*~c‹R¨EjØû¨µT-j¶tp4ÜκzKèóö+--¾–ª'Ÿö‡/Ã-K~gj1}+¤òg£åº Ÿ[¹ï Ÿ”zóð]v¾Üômµä¢Äuås.f]].¦õ$²Æt§®¯´lî'3rwûŨû6'%;ñýGGÊ®í kO•³D{T!.¿òTÛûÔÛçZOŸ¼µ-p&†U<šc Gƒ}„³[ΞÀQåG{¡öÊñ÷V#1é“¥Œ({3j—OÀÕ<¦gÓ0ÝvÀÓ²œ`=dâl’=ªü@ßF)m¢¨ìÁ0ÑØÝ<¼½pÃÑ:|°øêº}—ß1ñnŽÄåHŒBœšZŸ‰`ÉN`zeÙ½9ªLÉþµ°ø@ÙB÷t‚ÇÜ<>‡ùÌÞg§‹1í,‰>â-ÕÝgÎkï‘Ëþ1–3#ƒ´Wàº_óO¥ÛåÑ0¶ 3ã>Ÿ> TyUø}î¯A‰²×Ï>p$þ¸ÅàýšZ*Êh”»)ŸON#¹êt‘EJ)‘PJlÝQVWMf±#ån–»ùšî¦¬ËÝ\rޝæ>—˜ùÖªÜÀD7pý•–›q3´,7ãioó òÒ(-¥…½…da$P¼ql§‡ìœ£âÌežÄ\«›ï!;rTuy»7O q²8äáGcz¯Âƒ^ €˜`‡èrB€×š€¾Ë!eNqØŸA¦ûð¤H‰í\ó4x¸>Ï}‡ÀFÏÉ@SRHP·\¾Dl¡‡é€Åðýu 9XÛê9±¹k¬eX˜kbfîpèõÙn~6à£ÎŒ˜fJŸȈÂjê9¥yø€ùVüÎÅ~l9€oÏ[Z\<(h»6ôAK ­`϶FÂ2Ù½H3À–ÜÚ<ñz°¯ÄC!x4ì÷ÀVW¼×”óÁè8ŠEøÙ(žrë)wÁð÷„jg+GÝÍ"½>• C„€Ç¿ ´²Î_£A&$ÑÙ”¢1áÝ_¡† à úâ|Zx+YóÜõb£Úœ)!É()l’ÁG¸œ¹P.ì|„’2f‚ê¤[±4B _Àr(oÌp*Þåe;/å>`•£D§˜žg§%¨c¢°‚SñÁbË%$s¹sÇs/œsd5ÎòQ¡1h=ý#¡!õEfè+âïöâ©Æ?·É¼E-ÕDÖmcµÈžÐ§†}zØGMÛn‹gp{]:-ÓÍ’¶)¸z™ÄÖØp×bèëT›S´ -½¯TkñýF‰f"¶ÛFزçƒ10Á!BÊ]ÀjöÆò0i7ÓCKJ“•b¹¦» ÏE*0”×$âË”Šâ\ #ļ(2ãˆ÷©*Pßrß,‰Á¥÷•vÊ–/›ËâZ ðÅd³!dOH“n†ð^÷<àÕ äFÄë|t~£ ¸é•+Çż Å›àï£Û8gBy¹Äµ¶Ï¡ý8hDʯº&ÌPEBÞõÂbᩉ(à>—cM²[“è(ƒ×`ŠÀùWæ5e‡ Š P§(§`™{I®n˜×l;ž^A|µÚT@J¤µj“Iɤl-:Ç ÓC¢Xa£´Œ–—¿¶±&ÃÊßæßÔ$ä.A?qg‚.&¨Þi|/”'Ælˆ)î€!€YH ÿË,y¸e!zÞ€´ kp@jRolB¤ é&‚òتŠêC{÷³¶óþ›}±œI&Ã\ øX=à#'Ô¾S:‚º}¾=ð@¹1`;¿À¿w ÿnëk–ä+žÄA΃É8Œ“ÌâáÜ„þëE}7ö‘¬Šú®íÙpºø·ò¤ÉíßÞ{#) ¼²h¨)±hV4Í*—dáÓQfr½ö]7-mý\¯ö¹^Õ¸…¢ž<‚·>0;«±é铺X]2z”Ñ•0žµQÒõÁßSÁ¹{ð(Û,œ›‰ÿQVÛwà reµí*ÙØo‚R¡í¹vC`¬™Ìg³Û¦©d– ¾€(¶–¤4y¹7‘’ÃÖãG·CÁH.¢5 Kɱ‡ÇÚ÷,Û½ƒÎöãMv¼m}ٰɳ)ºª™ô)Oà56B²=¦6“®„óW>Užpr%4Ÿ;4_ÁêS®^O0¥R(ij;æžzŒxß°yï>ü䯆Y¼;Å;Š?ø{ð n2È)­KPIlUÉ”£”žiÞÁÑ®ȱÄât»„løÝ‘R¥Øí1…0B&¦u¼¨Ê¹ ØÁf³œ)jx?Æð¯”Ÿ^׉ǠÍ$ËOb™!ÅÏ^> RÙc{ËÅú*¤ÎbŠqÝßޏükLá¨i<¬±éí;½f²(]õ Y㩾˜6ƥ࡛îñáÂ,¡î!E%X¾nR†"BÔ hŽÄèŽ1'ÉF”Œ¶Ñ+ߤÙþ5WˆáFŠ5ìÔùµW0‰'NÚX…¼Qæp†‰9Ý8SqÍŒñ¸!6ÚZ0ºÏ-bñ RfÒl;kß=j k ú«ç_,;«QLÁÔ §¼Ú®mTk(€Æ#J'T…¡ ¹·ÙÔêÕÈ\ÁZ#_"¸D@B3Î$l,FjOŠÔµ!7<|™#¹EH ×$7ÛE@–ÚЍõ¤èlØ·\P(^8j^ð)ŸB¤‚Oy…ø”ÄXÙØâhüòˆA­OÝT);÷ãŸg4¹ã0¬šàNäI1”ÁÇï3Eö­E.‹|1C¢­&D–’¢*q"Áò‡$¶=¦·*%¬SŒq­SLì!xŽôØ•ÎÙŽÜoÕ4ìkƒyéÒ¼Òw]ŠwÞà1ÕøÊ’˜jVÏúk”Fy‰„H@ÛÍnŠ#<¨ÊÕa¸: …S'z[8³y€¥£ÄÚº ¬ÿÇ\S§/AzDM`!•Ål)Å*¸e“C1[Í–ø…€_CV1ó¨ÿnóè¾Í£yÌ–wâh+±Û4žÓî˜i–ð=üQR½a V‡µ^è|°Q®ãbÅ¥m¦Öôúø0(âNÞ‹ªÓ6ÇJYm)­»¡½˜#jÅq7V€%!3Ï.m\ëú6RÙ§·b NS;ŠEÓøk •Ãe~óSÆJö¦®ü)%(ÙqAÇ—µZ¯ˆ¯^[©Ÿ2ºŽâ°¢Ó+GCLþ™%ÞLê)ozC¨ ±~¦JŠÍdwNH«Rhë|g#ÏYë§%^ÙÔÖêÖTIe«ìÙì—/Ⱦ·Tš4áO·˜ÀyãÛ_iàfÒ|°­Ms{ŽmÏ©]=m[ÆÔ46c"é%«WùÁ‹§Ë&Y°n›Å,8'VDUS¶‡-û_ VÄëƒÆë)X‘MŸiÁŠx©ª`E^VäN¬ˆÏ¥Ô”wº`E|‚‰:®‚‰ØñaE.WJ;• ü¼cn%œgrDB˜kJÌÏ¿¡©3è³^á–¤;–#P3¡—ßcMÒÒ¹–k¦h®µ5›u >ÚøUîveE¿Š6~•»Ùlê“4I³°]ÐDyÄDú¨Ed?Ô' êD5í¤®ÁúÝMf¿n{aR·Åx*Ö¤Ï3!}Z›ŒŸ é£Lñ’»Kºj•©îyX†š”ýËØ¤›Yuj1¤ÏÆ‘>­¤OAúXD¢…͘¶¬—x0@…”A<´-“7‚Bê§¼C[öì’ðB¸”S äõ,ø$ÚiçÂ'eƒMÔrJ¡\`¾bÓ[À#Ø1õ¬t ŠWlWÌU}')ød6¬1“C8ñ_; bEkë”,øn6Îe-°VXCnÖ0ïR„[âVÚá„>Qªô„xØ,¸V`Œ"ˆ)¶$ @,‰õ„b–"ê“m1ô}ÿ#…œ \õå1ãù¬áB¢?õÝ…cÛ§ühaX‹é²¨žSŸšf €¦¹E@áÇæšÑÎ8j†A¶áIˆ¯Ã-غL‰ðóôJøL=±Œ¸awrÑ(å|pD©g¥p8£¶×{b¾3À¾Å&p.9)O¾clY©¼p®Â¹¨œ+2s.ÌkpÃÉY÷ z'³r®ú=ù†b]– ¯‡§ñr.rŸ¦rÊÍ Ð Çd3s»L-…s±?ÉÛjJ2áñÍ{™±±Ô‘bY¢}zï$‹”%-&Éé›ÄܼÁô§ËÛ®© Ÿ%Õl„‚Û`Âx´~¦ö,ùŠS †¶·$C¸;!­Æ]÷Úš!ó“?Äæe%<—Æd[¼;—ùøù9_k⊋æm”ÿ jŠ¾Î›»-Cv{iín h>»9ö5QT9ùÂÈÊŸ_·[ ‘0:Òke3:‚îÀ‚âÕs8RáGyã9ˆÈ½·,GêÜ{ëð÷øm A¡/deþùú‹‡(]j®nÔüÉKÏÞ®ó±ú(†e<¬ý$ôX騪)âÀ€Ùµ>éÇÖ×'ð —í©}ˆÝ>h@©“ì-lÑÿš“ýÖÒÂïé`Ÿö%N+O²ºdâ¼µ¼ƒ£Dwÿ›øYó®y°Â¨¹ðZZ‡‘,a}̉…¬ÝÌír"¨îü³lÄ5Á2付ªOœõøéðÝÌ endstream endobj 8813 0 obj 5067 endobj 8817 0 obj [639 /XYZ 33.1199999 437.779999 0] endobj 8818 0 obj [639 /XYZ 40.7999999 370.579999 0] endobj 8819 0 obj [639 /XYZ 32.1599999 439.699999 0] endobj 8820 0 obj [639 /XYZ 40.7999999 370.579999 0] endobj 8821 0 obj [639 /XYZ 40.7999999 324.500000 0] endobj 8822 0 obj [639 /XYZ 40.7999999 324.500000 0] endobj 8816 0 obj << /Type /Page /Parent 2 0 R /Contents 8823 0 R /Resources 8825 0 R /Annots 8826 0 R /MediaBox [0 0 595 842] >> endobj 8825 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1549 1549 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 8826 0 obj [ ] endobj 8823 0 obj << /Length 8824 0 R /Filter /FlateDecode >> stream xœí]Iܸ¾×¯¨sË"Em@`ìîCÃrr<™ƒÌ Îò÷£*QUÕd}$ßã"U[Ý€»Üjqy|ûÆ÷üü÷ã?;¾ÿøù?ǯúçÇχºª»zþ:ž¾ßÝþBU#çýÐVr<}¿þrøvüvøtø4ýûí ºó‹úÇôp™b𷯿ÞÏ“æß|þøçéÓÿŽòø§é?ÿú·éÇz¼ÓürÆîôáßó!…¦ÿÜ~:=ü×á/¿;þ:-a8{ú÷]ß«±eÔ:¾]^çïÛWÑdõqì†^ª£rZg;ã¿ÿ8ü4v«®F)Únèd?}êfþoÐø½œ'˜~ôÝQŒµ9¼½ËÀ¡b…H3ÐiE"nk¢V½{¨jèôü2Ñ0Í2ª~˜Ž»VYÓŒJˆ¾S}ŒAg Œ};ž¡©Ä ÏËP‘Ó×ÓF’œðyE"nkú„í¡>%áòʾ9^üðåðþE¨f8±½/?hû4éüãË´Ýöøî„†m{üòãñ÷u­ê?¿ü|«vlúvf¶ó“ú>ùŸ<¡'B¡'²‡£5eÖVèI3žŸ<™N1û™ôê¡Ï¤(¬ÆfÙøRü C¤Á¸Ÿ8à+éïl†­:íhia- DçÁ«Æ+À”¡ÓÀÔ/ôÑðNëRÒBƒ) Ÿ~çC9^3éÇüŸ0>GxZøLÆøŽƒšàÚX2⩵%挵a8¸7~?ŸEµpm: Ÿi!<À+pp¡‚ÚËЈ<…i%k? ŽâX¦&¬ïåA9J)<ØO9ªÅÀlf¢jÕÉI{‚]†ë/f«JÍÀ²è®¯j ³žá;óÄ*`xÍBoVÒÂQgZê*)†»àf¾-ÚÚ¹°@7lO“d­p>M 7kÅKÆ =<”&1J€'„Þ¹3’Ëe)œ‰€ ?HmuÞ!7 &Žù0!ZóY§dáví;G¼fÿ`lš²n­ Ù€?xÞaH8pSÐÓýùr²ÿ®7ø¿ÃÑnæåmÕÈAÈ6Œ’ žO˜ØâF1ü³§ddŸpï»×:Ú=ʵö.r07µÉ!¼âK¤†óLëøeñÏZt rJ,Èj‹Ô³h>ÒóÒ1~9%ŸM|ñãv8w º¶\ïI£Årí»¶{Zð‰•mpâ¶Ž")–b¥ã¤ƒ,‹™)o¨†±6G€ÖÀ zè›g1«I[âì+üŒ±ÄqLŒaÑ Æ¼#ØÏXcÀØfq“šTc®¨ŒêP¬cóã´¥~`û+œõÓO`naBó²H•¬$ædüMkp~-Z#0|pý$±fkxT‹j†`Eƒ ú¹×€ƒÅV¼OKè<-iåv&‹Á§=È)<ñ­ò©{jÉñlp¬grâèÎ|lÑ…³þpŽ޳ሌ•‚„kÛò)`ˆJ›Ë.¾z9#r?¼Þ´¨«®ç­Å²±$Já 'ÁŽQ#T ‡²²›c&ƒ(€…XÒÔJ‘¾#øŽ|‚Ê;£/ëõÊ–±jÓ‚K¨î5pLpE„U(>S†«‡"ÒöÈËåp‰Èb€„î—T,Gš<'á r²·Æ³~‡Q„ƒa½KÁ‡•‚R,u¹€RÁvl‡%æ6®ÅL‰_–=g¹À ¶B´IâR»¸Êž(àÕ§N„·òìü©FƒA•ÒKê8Rõ‹ü`h2IÉјpZ;Cê½5ÉïÐ¥8£ábÑ]—zX]j¯âQ°u +$ÉáÏ™3O¾W·ÏE’T8”™ .cl'DW89Ù1™æÒ̵j‰|/ςޚŠRgqŸ%<„ÔkNpËŸQ•Öá/=áäG–8&‰$<Î.5 …JV”è(…l-ií¨ËåT{3ê™YÉ•Á¥öƒGã¬Úa²À@#®Mæt˜bÕµ3zB¥«tFÒbÊÀ~Mt]Õ6gVr³·‚†p#–hÜnoÛls˜¶1ÁÔÈIIØMñÝ?³“ö’ݳlÀ*CúÞJÃóªU¢m È—jôª0‘à('GÝÁkcŒÆi£‡Œä#µ×ýzŠ1 "8F¡°7&Ñò «-ßàÿþk¶švõ›©[‰*"Žñ BªtvXðˆj¿ë ×sú?ä-ÇáTšp*Ô’:È(¯™³W´jóŠ«sh_ÍNÜSÌÖ †›€Ðqt¯Ä0€ k-Våð 00V€ý`»mù°¶¥’î)sXk{ä”9Ž~§û˜ºbNIséýZîš„?Þ´Ý02(úF0á"*Ð9ÐTëÁœÆ]ßüƒeËY!ÜpBKS’3Û2¯JuµqZÔåìòЛs¦Sp‡£Tw}qbžòÒËV.(qE’Ìßè#é\2X¿—4ŠÉ3åãEHªsÅõI£1I{f-­²¯ÆaFwf:MÕ˜ï¼x—­)Ñõ'RÛ¤®—Hkx‚kk¿ý‚ j-¼ÑG"í?ý`MôŒåXn‡ŽD/2ó¬V,ÝtÔ5¨!A»‰Ñ%òè[Xøq\_i« n+BN¡iP ï_”O{7,im9xýÍð8iŸIó‚bœœXÆÍ§Â“³š&2 F„^x#2[’Æi‡“é%«ÖÕ‚ÒCΤÀ¨.›uEŽÃåŒá¦d@K¾íq¸Kyç'…øIæ¬â̦/+hÓc/‚Í }Þ8ò¡fÀTa1LÌ(\Fqcu\mÜpGpKMŽQp¡4µk0뾘nòziaŠæ% 5ÊäʤÖ1,' Ï:YBh"¢ àOj*ÄPÊD¥"¬Ïœ‘Ý ø† =k Hç—ƒ°ºV¿)>¼¾öN¸Rj;íÈ wøÜ¢IZ7H),,V’=e®þË™„Ò)CV°®Ä*Ý-Þb%VΧ¤KsÜI?抈˜«_AõY=ˆÃŽU„ývAð®•^Œ)5©Ø{JŒp5ú—ée$i³öqÚ“ÍÁü\pÕâ-ýi[&øw…:F¡&¨Í„ð7Þ3˜ ‹e„»ýÖãvîCË$9évhŽÌI{] ¶·ÂgE)I3obî¶^!®Þ¶Ò™#Ñio^ËìƒÞ®¹•äZa–*Š…„¬ÿÕ›õ•ð”ØÕM8‰&FÜœ\NF¥µAµÃæÙ¤cÐîÚ í!ö±7äŒî&qÏì÷Ê„ópÿQ®ÃërÃi±œ»¥0…«†“¶md'IÊRumw¡à¸Ã ž)Bè#mO…Õ5¡˜ó#”™wŠþ­ôq(–Žb¼Û¦;s˜®^ú³ÉK p=]ózR/ÀîÛðw†¤£èíá›Ä«™»uíUh¦5€Jé1ñìÞ“K—\PíÔUºßÍ“Fã³4›W];Z§P£y0 4݈¶Œ€Žyžá<:Åbw¹^•r¹W„w…BÍ)øÙê6ÄêZévùðÆah¥ˆúCQ–&••k®,¨æ4ÇIYÞTÜ_ŸÐg‘¹€Z{u4ßÃÝ@ñ;°“ îçëh&ˆû²d—CmÝš‚(Ü©ÄÒM1;„Oœ«x„\“%TeD8ó‰uGe ? ‹ékiŽÀ}Dí¿q%‰›£ãFE¸Ñ£i¹ã†E¼FÓrÍr¶oºûì/眖îO([bñ(NT'¼Ô‘‘FiK€£ê:[»]öe Ô{ÃëNw2¼câûœJ¼µ‹ã·¯=0¿»åv$ýkY+è'EN„$·bD´8…Ÿ™SQýi³e„ÑßœµÛÑ$ NÆ ¡*†ãN&4på?Bl¡-î.¿p#"w?ìðc£´«#]Ù•õÅ¥)ÄǤ”ö„ §Dp/3È ªO(JçUåL7šrælÙkßÝ‹ÀÖ­ME{õ‡òj¹ S´Ž‹Êty ·CJØáO‘"dN¬ù+–ôpòEjˆn9éá ¾ƒþ—Îå„d a“8© 8A¼0v ¼ ùý$}³¤7âkÊ®jÞ 7Û;E¾­R6€…PG¡ÓÐúÉúYäÓé³²ÐÖà¡{ÛÁ ”`8~ |R‡|鄿ð¤rÎ¥tIp-‰Ÿ7Š y…¡ƒÃ5õœŠ¸š…ŒŸ<´é9W§ãŒµÇžÇ…Z0Ò¯'Wx§Ø‚3 ðNñ<ðj*N†„ã*xi•†Aš¬px¡ðiÁ'¬€¹6 ®MÁÑZ8šÀøßÁײÃ'Žwà%g˜Œÿøäài;òðù<²?”´Ó&Ý5~Ú¼V³o+êd·?@dè½'ä8;ÎÜ0/ß¡ÍÂRœ/ÇÙ^¦n,Ç1·Â²±à»Ç9£9îRÇ;åÜ ù\uƒù%\›ƒ6ñŘŒý8V€µœ¤pÃ¯à †5‡‡äÿ㥸‘Ãí8OW¬âÓJKXžÁµa›_@ÛbŒÅ—ýb¸Áy0²¬#¨…JlÏ0Öæ°tÚ{Z‹*qÎ9œÇqM3æB˜saŽ2ä(²õž–ƒ÷=\i×ĬôizÅ´Ì+ðN!_Æ[ÓŽÀá¤Xcqh¡[×A3»¾p‰þÓp KD,u0t0ßÀ´É(†ÇÎHJµß“LîOjXiªÅ>Ž Äó0´H\o)°ŽñS:^5ö5C ·(&ɬ(§ÝM+m‡×³® ¹±óR€dhM À¡ ƒORp÷ó/úaìb±ÊJÅ81sDV÷0`®”'|ÛÀ„IúþôŽþÔ÷¶~ ÚA›ÐqE»xsÒiÎæ~Ö*Ä9Ì1½—µÊ×Umcö¦Ã]\q‚0ÎM²òšb²oͮ۲rl å$).´!Ô‚pÒÓôŽÍR,êHƒ#¤ØFô[â¤ú7Ìh}PºkšTOÿÆczam«Ž²eÕ|™Búi{’m·–=ª¿À¶Á¡´0pá¡ ËœeÓÍ`@*ê¦1Î!ÛëHIg\ʼnçõÅ2*\×½ÀZHÎêp9šÈœâ¦,Ç-p乨ŠPž¢¤=Óe2áÍáì~<)åXæ2ñ­V^0‰åÅ˽zç<ª¬fÇcûNMÁ˜Wò•2@ó\S¸þµâ„æ¹k4MSÊ ¨<,y5SŒƒ…ú?ÝU»£*­àCoÎE)yftÛ ÈöÕÛ}¤½!¢mgîiCÏ8IlŽ–-§•C@·i¡…sw¿bÕ|„‚6œKä¹Fm3'þpŠSÛp÷£êL^ñ ïcBÎ+*{ÓØ‹º±am¯ Á(×{†íô}ü6q‚Ñé ýãë/¨ÚÇQ_ã“ó@œ¯ú»½uG1íëÎY6£èf ùØÔê5Öu]ÕÝ—ø£ª¬sQöU¿û|çÉŒ%MSÉñ.kÛª›OÅ<“{ó ð¾3›2½¬d}Vò¯O>ÀÑfºýÍü[í9¿³ÃôŽFî{OÚ‡ÆaÚ;úÄ({×k;@Ö>ËVaº{ó):8Þá`ˆÆxia¼î>x{1d9§ñAâ¤ý`LÁï4W1ÞqV éÏã ®Ú±SéÓÄ3}?Ú<¹G{/I(lê®§{ Rƒ$€‰ðöÒœO)%ÞñÓáÿ3&¿³ endstream endobj 8824 0 obj 4367 endobj 8828 0 obj [640 /XYZ 40.7999999 466.579999 0] endobj 8829 0 obj [640 /XYZ 40.7999999 466.579999 0] endobj 8827 0 obj << /Type /Page /Parent 2 0 R /Contents 8830 0 R /Resources 8832 0 R /Annots 8833 0 R /MediaBox [0 0 595 842] >> endobj 8832 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F1549 1549 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8833 0 obj [ ] endobj 8830 0 obj << /Length 8831 0 R /Filter /FlateDecode >> stream xœí]K¹¾Ï¯Ð9€å&›ý‚ž± ‡† ääx³ ñ"Îò÷ÓR·F2©d‹Ý”Ô6à‹j6õøêÁâÛ?~þûíÞ¾|þÏîëüóåóSµ¯Újú³;ü}sùî÷µž~íúf¯‡ÃŸÝ×oOßwߟ>=}ÿýþ¤Úãƒó±ñôŠ©Ãß¾þúôvzùÓôÉç—?¿ýo§wÿ÷Ëî¯ü4÷wøÂ·§~h¿ü{úEi¥ûñ?—¿ÿõô—ßí~‡Ðû=üû¦ëZ5è´q|}Tÿ^>Š^V톮Òf¢?P͸ÿýÇÓÏco¯ÃØ÷­îLS =ü=æM>¼ªiÕø£Ý5ógºq=©ÔŽZÕÉtt‘Jš™ªLçíIt/ÚvÚ‹SOÉKØéFhSÇÉììIt/Æ„öâÔSòöµÚÔc'{{ÚF©®5]-ù¦± ôZmoR§yê*u½TÛ qÓaD*mj§•wºú$¢¿ôY}÷<øüåéíÇá «¿ü<ã¨ð§_¾=ÊëÍA‰5f÷å§Ýï«JwØ}ùå8ºéƒJ?èöÕPwͦ…[ÚèNªÇ–f½ÒÍeË˱å×q¹òL¾ïìÉ·p0ͱÅìÍ4þ‹¹v¨Å3éþØÒîµê­–iÒæüAÝ;;…÷wâ¼ÏÓ Þ)üŒ3¸Ž•Cxx‘àt<$ ·‰³.ÛÕïŽ(µoL{ÌÄïu P¶‹±Ò˜N”‰ bñÎâîÞ±‡¦ªhî"LK=Û lϦž(kØwmÓþ°zyøÝCBª 2 ~ žŸþhõjêкJòGF•ÔT¶Nòh5‰}j:· 6©pdìÞ³@ÎZr¦&L¬…%¦ýˆGû/$m§ï÷ýPýÈûÕ´¡ª9õrnyý 5£¬à‹N£Ìœ¾'š³;sT°+±9È,^<…çK‘ (ìÞÍô ½Ÿ†Á“ö¢z>!¯K`Ùeì µ%c öŠ#Z Âb9ÄUïb¡(b€0$+Y:fÜí“…;Zõ… »âLí‹¡­n‹"e‚èòØmØ®‰—ñ¿]áT›±N°ß[ÀXWÊK±Ù?¬¯œê®³äÕz¨áÂ`¹YâყûxäÈq,‰Œ/(ÁÔ%¨îÕ`†ÀÓtDÇP½e/Rýr7Ö§„ f@M`ð¼Ç¡†iƪڷúsêw°{üÌóŒ*e!ÜR>zË(iD¯Ã.?G;ÜHñ“®¥…9áð䨭x¿˜KÏ'ؤaë ûŸssËlqÖUÞmÌ, î3=Scã–4%ÁRbM “,¥FÏÁ²FÄkÀêH]7,ÁqÉ€ƒaeâr †ZRf˜KÈ(Í`êd ùÂykÆÿL_ÛÊc Á‹ª„°cQ¿ Ã!‚õâ=qîT~|œ5%fºTXWoA³gVZ2C"«K8í*¨{3¹Õ1å ÝœN5XZÄr´%¥+¡ƒ²Ô¼Ÿ×§©¯½Р6Óv_1—[†OÄZD— ’7! ²ÕrÃ//§Eää/Îw:lBp*A&ÀQ(AYyŽI¸Î׌:¤U˜X¨lébY~f4þBSËs©I&Â]¦tž25›rºå´LV£peèpQ(ÖŠsÕ¨ÜGd{KâÈbÉYón]Ì|ÄQ\=S°QÆZwB‘0Q3–`Œe¶Û—.ä´žhYôŒýZùm¯mÑRÑYÞãS…i˜å=I j©¡hñ*,Žð|>2FÝçT½jm œÝîèµ Î)çÓ9¦ÛÚÇ ÊËq]í‚ ÊVs,nFY¡¤r… >Á”2rÕR©…ã~†©+>ïœbáe"§Ì–ì-ƒ!<–‘Bõ dŸI”à‰_ÈÂEÙM)®ÕÕT'(,M÷ËÚ‡;3iîø0$å5›£m!ÙšP-*eðœœãeïŽÉéè•¥)vä5Å»ªµ¦ww¦8L°ªáLñž)>GÍ1ßó©ÄÜÂÐüî6‰Fl è…“Âèá„8W¦ó£7T˜/ˆÅ°0ûð Å$ûŠï¼ÎzIª5ùõïHM:ˆpWå*Š­DÉ‹“ôÐ[Lww8©”i>KU¼™± ởhõ)™¸ïÄÙ¾³U¶,§öÖ])3‘êþ2žUÎÕ)Œ”ÆÁkJ%Ö GÎõ ¯]T;OD¸ð\üíæ²7í¬t/pANɈHä<Ä+§¤q¯äHÎ3•nl%WàÁ®æ|“s1Æ0.;Ïiá¨?3ÍXï§•`ò®h:Ga9f.\:Ã$)‘’!ëvpPx|.1¯töAcüÁá…"XóD 㽸.b!€*‰ó(º%Sa=ú°ÉTuú™F5†Åb¸²qáaTߥ- Œ]'Ç>6€Ÿ URrÑxœQ*·zkæã«K@1ÚqîZ$ذ¢áCNEBBˆDJŒ°ù¹‘I0¢ôa”Žn„•çá”Úc Åà̇„x7YÂÍpºâUcG¿\IŸÆÀB5Æ'ð€¯Áà‹Â¨<<¬¡°¶3ÅèfÑœßÌjÍ)C$³™U>VËËJõÖ‚ã@çø$+á‰S ó`öó º2Ön¸D—×-ß®Ÿ‡2'=±ú}ôû mtÕëEÀE óxXhËZlb´ÓPà¡|ŒC0ÞQØîÎ^"|Æ]óZŒpæÌ+^³ø0­¬Lr²¬òx•Ö2oVóS.Úñhçó’ÒQâŸ]R]ôÕðãf®¬.Îãñd‘AøkBbó Þ¾­O j 7æ¹áI¢˜>ëf‰º"IF—sR• lm{&å¶»¤z )=(ègLFÅ®_ßná4Cì^Z&ß0ë½–¶ŠØR&¥ñαr8µÑc‡&»¤ÔåeT©±½ÎÇ}åH›¥n<Æg, r/¹*"žÇáÏiÁá«ì¡¨¡36µ82&¡ŽR¦´mŽ`Æç2E ÙKÉìÌþÕÏ‹M¶,7yåÕdy.s^]?ŒÊ¹'ÌQ~:eJð•byÍ£N®/§ÓàƒV§µ~UÕôç<˜w¨¥:-v×Ä?ÓÓ{;+e癎`zª÷J;«§·iCF‹¹·KæÂ–s„ÃY·‰6UµŸTÀEËÔâ™ÏI¶i[£¨¶Ą̀~oì@#^·ùÒÒk3U3oÏ5ˆcFßãYÑ¥2T†¦ÿq¡®¸W(*>l®åßáäo³2ü°µ™P¹êá¼E{(5Þó {ÙzDåsQT¾Ö89PnNAÝô–¤Þê¦àuYcWä*‡d±XÆ¿4›GÎJÆ"x%Bö­3ê‹/^ÔQ.ñ>+ÆÌØ¢q¾Òˆ>g©²¹zæY„{®à$B¼}gÔqª˜€]84“7æÏ ea&±¾Js±óçCwJb Vè÷Ƀ[Šçç¶ Žgý]â¤>ŽtX]3à™Þ°ÎèÛb(iý–Åh™¡Ï8åõ=xŽíî8 Ögx¦²èÛ]X§3,?ÎÕ xu8Ò#+æÂt]¸$VUSŒ¼Í– ‰øÐ.¶Fn½(mŠ¡¾ÇiyM'ì`\Öˆ€yªæ00$kO±LÛd§GvÖbùáÒÔAºÜZÄ[0oÊéÄ<É´ÀÞ<×ÌâÈr:Ãk\¶ºº|œ– à@ŽF-„k{U-?L‹p|gAzÑU9«x›-5”—žÞ°,Ç•Å9µK‹ðvh5³[Ô²>’Õãø=OŒ§…‘5‚1F¨@×I6[ËIÊ/³[Í-äOlú•ékÞ"òE{S ˆÈãe˜z!UÕ˜ð.0¸d‹®gÑÝ–ç”Ö²E×-º®‡-#e>+XkylGÆé&Œ…¶ˆ¼WÞnùŽÈ×jËYZ¡e}/Þ,…ë-'fãÀÇäÀÛÈ×Í–G³‚5r³ùºÛ28ÒZn3b°¤‡¤ÊÙ­jYIlùBP©¶œ)¿Ìné-âÖõëRq -VïÓw«ÇëÆÐg[¹pl÷w/=ºhÌ–•Ö²>Ïx+ÆšXOqêÊÆC»–áŒvËUIlYßBÜ|Í¥Xˆý–ŲÙ‘´¼YwgYxd'¤DÏåÆ˜8URqÚ;³Fʰ9šj˽IkñTçH|×zòïîÐhô–«²Ù‘úl³BÜd¶’͈¤å͸;[ßoÁ¢k¸ zÏ"½Û-£+±£wHÄå ãfŽe!{£G q´„çö(Ñ|ŸB0W_ý¯Þ²d¶M3l¹Q|‚K¨e‘ÝjÕ-äF-I¿m’!°èH›Vü­þKxU§^'J¸ñžp&üê¬V¢ngÆ—vN\»9’p%'çªåà³zú êšÍâ.§uoc¿ Õ|ÊÅÁñCŒ˜¯ýÈ QjߘöÐ?¦yuƉ{ë­³óέ·ñc&\ÐL!lüÕð-ÏÎ7Âׯ®–XÞÐe¸9EpÓ[2Øspðvbgjž+¶1ïÚ÷Ä»ûóŒÈÀ枯Âýð\çŽ/AŽ¿]ǽó†;óL3̈y.Ó†¢! 2”¯ “îņ`†¢sœ¯Úhª¼;Ñ)CÌ+02ÑOv…1hI…áYÓеÌíò®LÀï% “]çÏf×ù“3U8\tXË™Xs¸‹€ç1¡âɳÈÒB]9Æ¿»ï#Trèbþñõ›‡®\‚¬ÎùÉK’ÞGƒ´Ü·;5Nô 5׃j÷GòÙÕ¯9Qst¬m÷íuh1˜= Ýí;{§§­è®´L[Q×{=\ÅRM³o§­µ÷äÚ{zøÌŸ™Ð\§÷ºªMç–gØÛÄ—Ÿ¼‡ßˆº¿2Ãè™é]kQh3#О™wŒ2÷ylGH ºÃïºQ¯^=¸Û³X$Ñç…̯ŠWïõâ•å즇Ù!ÍS ~¦Æ´ŠéŽ3jÈGø=žÞà¨=3U_1O| ÏgÖ‹×xõ}ÕîG˜Ùw«A2á¬õ5ÞîÓÓÿœ`ñ endstream endobj 8831 0 obj 4836 endobj 8835 0 obj [641 /XYZ 40.7999999 759.379999 0] endobj 8836 0 obj [641 /XYZ 40.7999999 759.379999 0] endobj 8837 0 obj [641 /XYZ 40.7999999 474.259999 0] endobj 8838 0 obj [641 /XYZ 40.7999999 98.8999999 0] endobj 8839 0 obj [641 /XYZ 40.7999999 474.259999 0] endobj 8840 0 obj [641 /XYZ 40.7999999 98.8999999 0] endobj 8834 0 obj << /Type /Page /Parent 2 0 R /Contents 8841 0 R /Resources 8843 0 R /Annots 8844 0 R /MediaBox [0 0 595 842] >> endobj 8843 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8844 0 obj [ ] endobj 8841 0 obj << /Length 8842 0 R /Filter /FlateDecode >> stream xœí]ˮܸÝ÷Wôz€‘Ňø‚ö}È"€aYYžLƒxgùýH-uß©C‰ERR·Û|¯E‰,’U§$‹ïþôéÇý~|÷ôé?Ç/ÃϧO‡ºªUÝÿ9v¼~ÀM%xÿ«6MÅm÷çøåëáÛñÛáãácûï·S§‡mṉ¾Âß¿üvx×7~èŸ|zúKûÛÿŽüøçö¿ÿö÷öÇOC}Ý _ƪî—÷¿0θiÿsý[WøËá¯?kI0§z»ÔZËZš$:¾]>e§¿×Ÿ¢Æê£ÕL7êÈoélÚáøï??·µ]Ȩ¬dL+©ëŵjÞUkkÙþPGÁ…W©×·eU±ÄŠ8ç*KE'ŠXZ×X-u¸*êÐseûñ’ºI±sU©#&˜2yæ°£ˆ¥umz¿ªYÄ’¿‰å·À‡>Þ½Ú‚>ÿÜ’q±þÇç¯Ùþ§“Ívî?ÿtüC fïÿxüüë¡i±Í0Þœ€¯/á •ÔO§yyÀøé®j+tS_e§ŒWÒ}µoϼ½ê=¨Ýº¯ý\×UeË)ª_`?q%–xDKçA­Ý êo`3˜4s*Qgfn.p%Þ¨yý´î'Nì°W«Gˆ.!e¸vL‘W Eî M›z,1G¸VÞË4cU#UGþ‚Úø«KÉr>ÂÒ@¡> Ô}Ã/Ÿ[@MƒG&…)¬p r˜O[5@اJ,,yJØüæ–¼ÀX›€ý P@h÷TX"sM1ҀЮ ôøãļ¼Bý@[¨øó,CZ} ŠÐ‰¡{ŒŠŠÐsÆí –p·|;åìŽÊauù=«‰ü:psÞdA.õM̪ý™U)®qÆ8Záµæ.>QÂÃ0@Í *Ù2l+…‡ÊÅh)¤Óf @•KIóî!P”g VïK{‚äÜåw°r¬g ˆF,'Fh‹ŽÀõ¬F)²ž [½îæíš ~ {·c"«æOËW -­e.ÂoWL)¨H܄׽e „} ŒIÝ Ê#¦"Œ”ÅÂåÈ<â ˜—â¼S@{Ñ òbÖ .°‘¤(³t¡Ñð”Rb 96 Òò>¨ÇC[ö(˜çyðÝ*Ìk/¹¤'à¤é^q´}=ôªÞÂp>š†%Ö¶¹—H©­æ„žfݬÄ!Õ¶ƒiõÕ,g@ÞÉ¼É Î©„H<Ö°?¸§"ÛÊÓIoÔ,=ŽÅsB(!qF!ŒDÁ’N´WXBÀ·s(Àã†qbZ`Û(l'€¸§%8q9³2EΚxT ´ƒ7ÒâÁ}†¹œ gM‡yk¼ŽÇÚS ¥)Ж&Œk ·˜SØS< ã–M<Øv Œ(Æ4<¢޹ (ñ)² í4†esoV݆9$`Á¬>ÊüìÎf5ýÁÛ©HЫqž­Ûä Œ5ß ra¿XÂo°ÖÃíúƒ=L‚u‰©Æ¾š°+JzÖâÃR¼}Kû‘¤Ô†Ñ!ÐLÁ_%E)6$¶Ê1ÞÂ(H@ïbÞ¼{ËJÏSŠK$>dûýp9ÁÞ XV8e-‚O£ØBkÙÞ˜%”M ùºÁTÃÚ8þc´WveýbnàÆV«ÍlVßÃêÛ»ÕGY© 1jPâ +­†ä”2:ØN#¬"íÂc\ÏÕŽcc{–™€¶÷Ý[ü)°‰¿Ázögïq.ö¶9õû±xà7¾$X¤=Sy×znÒ‚ ìÉÁž9FŒƒ„}c/›bÛFÎ6e—ÓNl“²/c{ÛáF…²N˜Qîͪػ¶çõyýZ<çj5| €ó沉žbH9/HJéœñöµ»©Ýv¸}~>YŽ$w”S1£G8³”%OWÌžÿù\pišè.É“i–r|ÊëåpÖÔh1œZæÔáòRz½)ŸJhpku“À‡$ý¿œu† %q†ö|² åú?O’´öÆ|~ Êý 2÷E¸éûË2]è¼ý†Þ×Ü‘[L8%J™,ö·ä1Éͼ ž5ÇÌ#°BR×pQ¨§® ‡Õæý­K+«O¹Ù#%Ýj–Ä'yô&Áؼ¹ì›H)m¶2×È,ªkájدÔÙÿSy´µîèîæš¡-!DÒ”Õ«Y;"¢[y|õ‹ž~JËùY¦ ´ºÿµV ëó^àø¯·žI¡²ã˜w’“@Ž:-ÂÊumÍòü ÞîMéûÊêJõì8×^,ˆ`Ñ•n)ˆWx’"RçAnXý/²&‚§¯ì=l1wbG0RÞëË"î÷HÈ?\f„rýeŽ5»Íî)^¡)©: stÇ]äOLz»u¢o¼j”sçfÙ „®U" i!DñÙª±®Ü9®ãåùÏŸ äy¾$ ‚|oBÉ}ý‰×Üû¸tcNŸ®ïæÝ¦QDCßÈÍCÙ½zÊ$í®àÂK=;’Â8Â阨OôzPYÂÕÜ«ÇêF¾x©5Î访2üÌâ½4/‰g’–ï—#ꂽXƒÄ;¯Cˆ¬¦ØW…}îÚ+s Èâ .\NÑ‚Hýls…Ï”Ó9®ÌeÌ𨭿\6ÊAãí·Õ’õ%â#ÌõÂ&ép‡×ÊV°»tÀ ‡¼Z›i,:·i™â\g¯(¾Ý_KáŽnÑÍ«1»01—9‘/R*l ±Ö@[»îÑm¢Ê>ý]k]s'Ÿ¿ÛΨ<Ñ7)ù…_/SP÷Þú=*©Ïüª›åߘøÚÞ ßûÆ¢o«¬µZÜý'P±ºê—¯“‹– Ræ=làMùÝ”²1qóÔ@¾ÈFø89Ž¢f^ëŽ?üØÙEÉÃ>{v?obª¢{KîQ®aºUèi£lêeCÒFhwxñæ|I/ox6¦qû¶ÿÀsŠóî_Á+¶Îñ”()¯ƒ²à\çÊ7ÂD¤ïôg»ìžØr P¯X$ÚÎ+|ÆÊ—B:Ä—Ì%Ë´KçÖ»ÊÄó,˜l•á-Ư¡8 Ôm‘myòrgqª)#ŽUç’ÌîöG<‡Õœ5‹zÖöX äÃ-˜.`î$à’5ÒüP*°?—êâ÷D\ð‘õj:ã\• ÁNYǬ½‰ÅÏlñ«,ØÚKÈ‚~íÅ¥©ÇàcØøáCûÄŸî-9ªE^·qm§ÀG·ö‰>Ý[vT‹·±ø˜Ë!øìÞ~ÝÔý(|Wx>a±f,,ÖN‹ª™ÃÈÝWXNoÉQ-òº‹°X=%,V¹ÂÒ>ñ„¥{ËŽj±ã6Ê ‹ªÅÙ=:§ðÂ@¤‹„×›z—KMÖ#T·i´l3*£ÿ³!‰bj„$Šé)$é$vŒ$íIº·ä¨yÝÆIk&D1éµ!=$9½eGµØq+ g·„$ Ve¡‹ª ²ãïo ÎVDˆ l¢Å.™Û”•„£’h¦PIh1Ú'*uoÉQ-òº * 1…J‚{mp•º·ì¨;ncTç“DÔ¨GTaÇQ…ý¹Nyïy&ìp$]×à‘6½ÝZËÖJ_ü 9tÞüL‰ Q.îKQ“ÑŠ»ð¦En™¸Ÿ<¦µÛ·ŒYžHÒGæˆ S.ŸÍr„r¹ùK²\#²]/Zý)& CBÌöï™Bþ,< f•5*ÙAfJHu d%ápÜ=…™6̧‰gŽãÚp†(XnGdÓÇ ø_5³ôà’5ãÆ ·çÏE)ÒDá—@2Çr,M¯9© Î{šWÎ~[G2ŒL †Ñ sß,¡è&¨MH#“¼Ì è…2ƒ¿!pÖ›Ýi X/˜«V LÖµƒ»¹ n˜KÊê‡FÍ®Q!nÓ†mMBmYÀµA\èô"²)Y‚lÞNÏ*MÛsùCÛ¯§ío“wvo;h;ϱkÙx¶—”¸ƒ¥ Î=®cþ§hTÜ8 s,æ>(éø®˜@²Ú¸6|ɺ¤P— ±TJäo'V’5ó\g ÷a®d•ÞY¡öƒ±öìÏÜf,ˆdoߤ>#Y¡Y±/€p”vVZÅYcm“´î²wŒµ"¥wy1sÆ1‚Üï™çþ.Þ'©§xšâáa.ÇTãq£àØPD´nH‚œIBT› hx¬©p¤ Çev¼{â'¬yu³EnU‰Zí'®"pL`ïR$5 ˜7_ÝDöŽÒæŽýiÁx’?MÐ׳œÛ!ð^ bx½[ŽXê0ÕP‚$´j×Ô'Lžý›á†ÐâwE ^Ÿ7ììú®h¿ÁwE÷¬Ãteùø®hÒ-ÅϨ„7û·ún6¾œxî™ñµ#z†gò|üpA;û‹ñÍÓxtð­ØCm¢ÒîVÆwlnß&Üî7 çG( ðå.ïµn‘ü²W pW4áàkJ %ÿ|ÉV\ßij”[;²ÌË’Fµlõ!øHLôåZ‹n*Ç•¤H%,>Š^&ÃÂæ·äȲ[˜Q¥ŒgTÄ%µ‡f®úˆ¸%-âÈ:¬D^¹¶íßã·¶3-­Ý Ã/_e¯ý³ìƒütÞ¼WGÖvc2M&SUo:ˆ‹‘?¨>¥*5ͳVV?ô‚Íu¥§S½ê‰’~8…¨¸u4ÝM¥úéqùnª¿±ð›^×j^ñúd)¹ {ª¶žÑ¯Ÿ<Ãw‡C‰=|Eß fØT Cý"î›aÆbú~m"&p]÷;o˜ËæT{2žßP8dàxîq<{FÜ‹G–2˜K1ª?˜Sð7ó*æ; ÕPŽp;Ú Õž2(¯X&^âû3˜†S²÷šEÂŒ©UÅ:oÚ5(!i½ŒïøñðéDM endstream endobj 8842 0 obj 4750 endobj 8845 0 obj << /Type /Page /Parent 2 0 R /Contents 8846 0 R /Resources 8848 0 R /Annots 8849 0 R /MediaBox [0 0 595 842] >> endobj 8848 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 8849 0 obj [ ] endobj 8846 0 obj << /Length 8847 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯èó+‹I‘@Àã™ CÃrr¼Ù,ñ"“=äïGj©û£Ä"EQ=òî‘"‹Å¯ž,©?üéË?ŽÿúýøáÓ—ÿ¿õŸŸ¾Ê¢Te÷ïØþüx{ë¢âݯµ–7í¿ã·ï‡·ãÛáóásóÿÛ©ÓýGÓxž¢ð÷o¿>t“º+_>ý¥ùíG~üsóׯǿý½ùø©¯íðý jùw÷ ãŒëæÛßÚÆ_ýáø[C‚>Ûþÿc]kÅjDÇÛåVvú¹½MVM]ñšã ²aÇÿyø¹íBFakz‹ºœ=j3^3¬ªùPÍÐÒX£Z‹›9Và@B•"Ê@'ŠXàÚX)êûc}‚³á¡Ìi§5+dÙBõü7/´.ªn?jÆtwU•j;žd¨¿òí dÁ˜áZ³K/1EÜÎÑôïÿ.ÛÛŽ£»k3ž£¹ÒÜ3¤¤íe£˜á¿ž~¸#üºò7Ëž¾>¼šV |ý¹Ù“&é>¾6ÒÜüqš«iýéø‡²ä/<~ýõ´/Ý…’Ÿ.ÔEiªZvº¨kabÜUž.ˆBt=¯]ËzÔU¼À®Ÿº–Ë…J.˜¢VRqyÓ•Gu O-ªàLWaÍçè YQV°E@’0±j¼.k¡Ñ1VÎðú¬®fD«ŽQ1×à=öž™å Äâ+&­Ã§,Z1€ÎbW°«5ßüQY9¾—K<Ÿ‡<`[뛆‰µ,<ºE†‹…öZaWÀS¤½|mLå2ê_4ömýo_˜¯=¯Åýñö;dtÉ»õùt•…ªOw5oáÂñ=O½I,ÙÈ$â[ou³ÆËj0ŠdO—GQHÃóyø$ùW®v8˜¦Ì̾ÒyÑxÜ<¢ÇÄ6·T¬7 AE5^Î2Ä%-Ž4#“c>ÓÔtYC”B‹ùÖ$g!jñyvÆc¹Á˜¯›Ìàn[OfdÑç×l{ìRzö|3Ë/ØH¢À05²;›ÐO9Ô^/z ~~êçË Ï¸P˜%²PEŒ‚Õt#Å÷ç|,OV6ó„kÄ0ŒJ™¤c<â¼ùÖÀ#$\ݼçb¨’g*|¦ËÇp\Žt·|Rm>†|Êï²yl6(ÜÇ.¢Å HšsLLüK,¼1Qi¹ºG\mÎk1½· -J_aË lÑþ-}@x§E”°Ò&àhŽÆàhßç)a‹ãž Rð„Z.~žÏÎÁÝÆ8pìÞmˆ†ïùèÏáh ò ¯´ŠæÆÏM£'QÑ+œ{-˜WÜŸ#í@­7Xf’ðW²zr¿’*!¯àêóÀvpkR¬0^°A-âÐ}XÇ:ô2Þ‚V¬XüS,CÃvË™‰˜ÜQåØ9¸ Žy0±FÁöŒ`ëÁ8 àÍ1¦S€¥>*wHˆÇ;'Ú‚JMKö  -Àüu`™€ ‡ÍÁš¢ëN‡eÁ¨ `¬2 ÷^Ê}ïgè l›ºë$Ìgî$ÅK-v¼Y7GTˆi#ø´IQaªWÚâF 8þ%ÄM ²°GŠñIAÞƒc¥Ð%Ýa9ßõó})s1J™Ì—8†˜jI²ººgã½GÜ€)EyšR]^"Þ :c…J7L›dUp¦ï©¢×nZ:ÇSqq½ÐƒK\/4æ˜Ó:¾ÞsrÐÚ×.Þôè'YT\3.ƒuŒ®‹Èè½¼¬ù fxøqW®àr ëûXã?=&þQH˜ØA’Å Ÿ˜h ޏ+„…c30.çóÑg¯1Ë Ô[’a‹ [«TTc­aQb¡a,ðc6êx\[ÒŠÈzdF|´ø£ct-]f›ËÃÁøë¤Æökr^’+ïÁšr’%â˜Ì‡´{ÿ˜ñ33Zfì…EQ7˜.´)Õ%|0y&öÚò²ñ ¢?„Ö²¢ØÄùNI™GqPbPïd ¤´&†ƒŸ³rþ Éoh1Þ|¢"H«=È|&™ |½ÔuR<ðe¡xçӪעiÌSŸÝ›EâZιM£Ålžæû¶øzȳG>b2ðñwBœ48C✷Qª8‹ j’# –V *󃟛š³÷Ž èÓÜ.ù²‰ËWHÐ59Îßq¼,‡ÿ7ãIEûÞë)WåòBÜË!X­ä0ÎJOø£AYóÇʱ¾ãTW”ˆ¿öXÙWÒ*æ«lÛfx0§€0*à=ýë–’eë·d-ÑYÀ’¶C«‘ñX=à0óÖ^b„Pdß#N Ho[p(WCšE£=© ÉRÌ·ý6< ‡nM3À©ë-œJ㮓I þ<éQü£h:ÏQ£…©=\lF)½w¼)Õ«7ùx .ìËê4…¬±Ì#P,sF’¼ijåcÓúòå ùÓÇ”QN{×>[ q@|‚ù–rÓ>yP¢¸5 J×ÕH¬ÌÆRDaò|É{ð­‡;í3M”êŸ|ò8׿—±ÚZ‚"ú¬R£±p᎗-ÙTíôôqê2*/|Å Je,[Ñ;ÿtÆ þ’sÔâ¸kƒ uÓf)Ë¥éþ  q¸ J­EÍ,”,©’•ðxx—ó ŸDÓ8‘GŠh À™¡¥ Тԋ8d5}zÇÇz žÐ##7ÃéqlF(µç[栒ࡉ—ëÖ5?Ç·fš-h;ôß¾;6ÍÞíòºÛŸûí¼u(ZY³Œ{uW†©â´ÊcUžŸ®îKÔ•*ÔýTˆPz¼.êû5€õ–n ªªàæ®&e¡ºMÇ{óhx÷tú¢æ/«¶éÚòGë@w{åöí-;¢{úï^ Cëèu˜ß=ýŽù¬½§í$¨kç’]Žàn÷µ,^8pÜCAHxn!ž=#ôbÎRvã¡·v^ëÁHÁ÷T«wª¡áy£Aª+eP^±L¼ø¯§GîÉÞk ÓºT«65(X{eÜ[½ˆïøùðí€Î© endstream endobj 8847 0 obj 3867 endobj 8851 0 obj [643 /XYZ 40.7999999 488.659999 0] endobj 8852 0 obj [643 /XYZ 40.7999999 488.659999 0] endobj 8850 0 obj << /Type /Page /Parent 2 0 R /Contents 8853 0 R /Resources 8855 0 R /Annots 8856 0 R /MediaBox [0 0 595 842] >> endobj 8855 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8856 0 obj [ ] endobj 8853 0 obj << /Length 8854 0 R /Filter /FlateDecode >> stream xœí]ßÛ¸~÷_áç¢EIÀ¡@6»)ЇAôáЇ"×ëáк½‡þû•-Ùk‹úHÍð‡d[ ÝX9$g¾g†ïÿüåûý±ÿñËö߆Ÿ¿ìD!Œèÿìß]~ š¢Tý¯uSª=üÙû¾{Ý¿î>ï>wÿ¾î¤9¾8ü螺èüãÛï»÷}ç»þ“/ÿÚýö¿½Úÿ¥ûßoûŸþÞýøyhïð…ﻦ5‡_þÝÿ"•TM÷ŸËßÝýí‡ýï ͱÝÿïêºmJ¡ƒèx=¿*/_E‰}[ëºiöRªŽÎª›Žÿþs÷K×Ú™Œ¢ÕRÖF×bv«µ:5ÛÖ¦[ŽÊjÔÛ¼¦d`C•8þo¨Ÿ³°¡I¡kwSEcT­+Ñ6ð÷ùC—ªì—ÃØkLœÅSSÁËQÆZ×E2lhÃr8šâJBe”<Sס’pn*tÆŒh«8S H† í4õVSŸ£ ¤zCÉWÇ‹O_wï?I]6¥ðõ—Ž’£fé|í†[íßuâÚtD~ýyÿc§^Ú?í¿þ¶k‹ª-;h9ª¢þ‰lСà;=Ñ=Qèý Ÿ<1Æ©ÆO$ìG1(Pps€ßaP ñŒ~„O^à“’þD:%lMA~sÌNM§ s¼Â­ÁU(1¿Á'e?ž—¯Ò$Ç í§?c®p?Nb —À¸9IÏwìÁð\¯) œâ•sìs°…ÁÐü¬Ö;G‡äò¢sh[Þbb!¶²Ö±{®ôf-Y Ž=ËšOà7^>#*Ȉ#ZžGWï_lUn85¤So‘dñx ñäQ ÂOÚ'Ÿ€Ú,†¥Ž0p¼Žpµ,ù·¯´è”ðß”#üw0<ñ¨e¾téJVæº×Í…öè.4N29v°pÒæAŽôoNª=#ÆqX‹9‘ÁoŽcüÎâ´±Ž~¥|€Ýv:#ÞÖAáƒódÍ’¸x»j´ã”Î`„x+Ĝӹ äÉÒÛl¡ÍZ‰-´¼æÆ)B˜jÆñ¹6‹‡iñp©1Õ ´Ä…8ºÍ1×¾Ñ<š¥ rzœ'cõ9´#Ë‘0‘ËNãh×S­°ÖƒúᣠÇkל¶wíçÿÍövY"÷f{ߦ½±»3®½Ž°6{ý.=”ª *Ûø0OÈVåSaµÔD\ËÊO+ÖFqmïDZÊ×èXªs™·ÍòÝ,ß7¯³ÇŠÅéæu^·û8^g_ÒmÍ¢ƒJ÷=Ì“²ä7¯óª©fÙ·Œ¹Íë< ¤9Ec ¬g|O"PÚ‘ÙN‘©Ì‘L­´Å¢ÿó¶pÐq A®«ùï4ôÖ~§…ïôÂ(Uajyjþ„Zêlɲè_¹x§9S”Çðl[‰W…§î Š¿)´µöV§Ñ|ÇÑœƒA|&ZÃs {a”¢è»™C¦à-ë‹0RA§@‘¾e±Y#•hM³ƒû‰.ž¬1mä5MeSÌO#$‹ >+½‚“âO0™?GjaJä°ÈM+&EMV§öÇúh*ƒã ®a- õº7B˜k…­\&«1댷ótiO”¬8œ%©‘C=a""%5 gû½Ì^ Çœp¦¿CŠ£²=%ûÎÇ—)UD¥F:Â5BÂ-?{N;úùn™‹ $Ž3lqk~4ɉSqÚºZ è~ç§r89¹ŠÍìáP°gu{SÄ)ób*1øfñ”fÜCó´/~¨DXq¿•‡Üäé ˆªœ±E8_"ì¡c ÷‡Ä1$¢85c„TE‰ Ò‡MÖq!ò‡pÆ´º½©Ã‰0OJDã1ñayÈÚä9^â»8l$+‡o’#:«éƒ\u¿­ùîõžŠ@R°cÂIg@´Å—f óo.°»ÁÌ$ÖŽ®àä éu /ɲc=1%œ%`8ï–Šü¾‰£‚ÞÂ=„ã÷‘¤×/ÓŽôK?î YŸ¿!ÀSé˜dÎêÆØß´ÃÊáâɶñ}»S c/oñ‚@­Íˆ´œEí範Ĥ$9п3ýqÛÚÝBwdŸ¦ŒñRíQËjcÄ5…`Q xûG?I7hqÁ6J"Î!X”=r_SP¾Ð-B)£X©bQ¼‹„=ù²–)#°ê±™ÚbÔLt*Ã91öîä˜à€Ë¼J!AñM›¾g¨ÊÙÁ´v–¦ŽÁ«ÛúeÛšqNÔÃþKÏj66„í®#j‚`ñÝ©ÓèÞwâKI<NØ”§…bƒ¢ÓÒF¸è—X ë¯g*}M)©~ª£f£þðª+ ãúÃø £ŸÀ:­ÖÞ•°ê¥âÜ|É©ÎüL_ÇMÃwV'WäÌÆ¸V'£fq.ª54}•ícUŽ®2bt}¾¯ ^ù÷£ðjA©ÍÅôÆ:'“žâThßP5:ªâ9À’Ũyï@¡hè¸Ñ†Ü½¹¼z¬;¸k)o`µ°æ}¬úÙu9Cë,¾Z,+cäâw^e]aÓ¬0ç¾\z‹…¸XC3npÀºÛaóp[Œ[–׈œ[0’ræÚ1£ß Ö ˜ßà\gE‡¦ö{qûßv±Æa¿slqÎ Kx ;×q§^#Bn>Z³ÖbYž›ÖZÁÎ`ÓZkÑZªüã^|·i­|ع­eʾ\ñŽóòæ÷uâeT¿o6!ãÌ,›wl’ÞŠ/罡|…ÏWŒi˜j—GµÍ§vœÛ†ñÊá›ç£òkÞàH9÷ö:øcÖ`;9V5¾ç“3R¼>œ‘2ô{V¼-[ïŒÄ½ƒš£éVãŽW޽Gʺes9¶ÑsrEä½äè&l!sâçÞ¼£Ò°5üÄaUc¯ ´Þ3®½2ÄË+2„Øæ™‘R‡ÌȆ‘÷ˆ‘FTÙ}‹c¤#¶ó%~¥¿“u…ëS|Ôp3`ò´&#Õéxfp±Ó®µ ¸ew=Õ*ãÖ… d‰ÊàŽË ²—ìÔÐ$åÒgNó—Í&d‰e*¼È)„À©—‰™Ð›J­ú&îØ±—ž [œQäÑÞkÚ_È=”>K© j5Ò÷Zµ,¤ŠoHÕâÜu©3_(”½}Üþû-"9¤èH¼Œ¹’á4gó˜Q§Î¡$ÆÈÊúY«%W…øzå;§ô¯5÷Ð2Ä9äúü¨¥lúOÕÞ˜â8ÄîËÃ'ßv¦*d÷[ÓÈó·ôU+ú²îûÃÿ›ÃkûÑÛM=î£û¤{皒÷ګVÚë>~Ý=ýª¤íÐíɃH)³D¸ì„2‘+^û ˆ¿Ìßû¤©ÒyCÕÖo²°IîBðœëϪÑ?,Û(Øøs4>E`ü¥ËbTz¤ jÒÍ´á2¡j˜Í™1\_¬‹ÜiáJ^‰úJÉ+ÑL(y%ÅH>+ùã·ôU+ú²“’WÂL(y%ªqÝ'c%üV{ÕJ{ÝGz%¯äù¸ ’¿'噋ÏG·§ÝÿF9;Àƒß›ö?ʹÑ|[t8Ï£ùCçû¢lç)—.£ oú¬ ¡uQ©z¤>ˆB’ÞѨôéð!ŠãÜ'÷ö(®ÇÛ_Zxóïeòïå1ŵ”gi¤ ç^€SÌ–³ A¸¤TFŽôƒ3­{‹ç»–8Eâíæ¿Hʨæ<Z·rozó6!#䈜ãfù¥©{¼´²M?6<µ”cT¹·L]‰³ôV\ç—Ѳ°G»ñ„mŸxñ%±‰œQÂ…ñÙg@ìÎŒ¸ù¸O¨Úï ˆ<{Ø A)Û1»µ#ò†‹¸'FR~„V]r91uã““ì›,K‹a³„p4â’÷ŸÛr¼¾Œ°ÑXPÂm¹Õµx4’^æ¬Ç‚Æ0K-¿®=FBŠÂü€iVˆsæ¸wº¥½0ñuƒ2Ó½]FµçtyÂM<‹(ä*cŽ5…}#„,¥$gt²Û–t—qfí£ÔýÝ¿v×1Ôá ÃoßgEf;2㳓{¯úí<³—Ý0¦6›­4Åq”ûRœ£ezõoLa¦=Æ­.¬îáQÕE=}ª^O<éYº, ÕNÆàVUaú…ãäT? |§…ïôöx­ %Êã·'O°µžs/?y†ßv#ü„ÞDsê‰Dㄇöΰb”±´ €ë¿«JÖ×ò<ÕŸ¦ó㇠¯,Ž—Ïˆ{ñÌrVóð›$s ~§Ä¼ŠùŽC5”#Ü£5Hµc¤Ê+–‰úx½?%{Ÿ¢HXÓåù©#Qƒ"àBs©õ"j¼ýçÝÿºi6’ endstream endobj 8854 0 obj 4271 endobj 8858 0 obj [644 /XYZ 40.7999999 89.2999999 0] endobj 8859 0 obj [644 /XYZ 40.7999999 89.2999999 0] endobj 8857 0 obj << /Type /Page /Parent 2 0 R /Contents 8860 0 R /Resources 8862 0 R /Annots 8863 0 R /MediaBox [0 0 595 842] >> endobj 8862 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8863 0 obj [ ] endobj 8860 0 obj << /Length 8861 0 R /Filter /FlateDecode >> stream xœí]I‹,¹¾×¯ÈóÀäKíÃëÍàƒ¡y >LÇÃà7¸=ÿ}çV[*?U*¤ÎR-ÝÐU]JI!EÄ‹–úò§oÿ¨þõ{õåñÛª÷ñõñÛ¦©Ý ?U÷ûãáÜÖ‚oU5wÝOõþ}óQ}l^7¯íß Ó}Åñ¥-Üv14øûûo›/Cç›á“oißý¯âÕŸÛÿ~­þö÷öå§±½îïët÷æßÃÆ·í?‡ïºÂ_6ý¡ú­%Áöív4–5Rð$:>vUYÿ{XuÖTÎhÑÈŠ1ÞÒ©Úéøï?7?·­íȨdÌhišÅ­Þ7ëú—Š Æ¼V½Á-l+±!cš< õ±Ä±µoÌ|[¯IâÁ|ñЮZ5¨nÿ—µµM¥M÷b³Ã§ºÒº{°×¡ñ“÷V5cŽ[ËvOÉ£Väaíóãÿ¼«VMk3¯ÖÕ™PÒ>åŽZqÇ}ü²yøaF1ø~ä){xÛ|yq¼ýÜr G’áå­ÕæöŸ¾/[½ýTý¡iØÓ«·_7ŒÕJjkTÿÜPÂûS7N5€ÒPÒ<÷%ªE$˸:,Q}‰¬åPeIk|hÍî5¨‘“ô8ÔIkÄL)‘“‰ZåÓº>Eýê“yOàùÕˆ[˜"Ö,ç œŸh7m• b¢Ù Ê|KÊ–cê)âoû’ç· r.Á4ÁŽ1Mð9LrŠ7í'¦uOÉ£Väa;Lͦq7í£ýÄÃ4¾C±m+î¸0Mè‘ bxW­ôƒøËT§"`»€æé>¥‘§i#KàÔ§‚_Ń ¨ŠÚ“ôÌ£hJ3½˜©Á 4ðˆˆ°?غºtfƒ:鎡N5sP§ø†ÚO<¨ëž’G­ÈÃ>vP'íÔµŽë¤ö꺧ÜQ+NÉ-_$tßlE ˜ý©Æìòr_å4ö¼™© úêÅ; h…=Z½þ²éH+‚G:¢íœŽ´ÑìD~MãëˆÙiŶyØÇNGÚ¦ftD«ií'žŽtO¹£VÜq+èHÒŽlø mÇ1Oª=¡ŠpwsÚÜ€¢/'ÑwÀ†wZþ1zx~Ø•Xå…On&…òmT/ß’«­»kGwWy¤;XòK8*á°Î3,yA%#³¢¨fx¤j܃ãÁ#Åp<×¶ŒÂÇmÌ9_Ât<¶ÆÂì˜xÚ°„pÜä‚ÀòKÄʸ!åiÍÀº©s…[ûJ$‚¦ k–npë&F\‚1¢€s)ææ)æA7G]G›´HÐ&†.+vk e,)”¸€vt˜âMôæ\Iýò§çÏàÆ³D8³$3Jɽ—žYRƤxù¹@âÉ•é Å3Â+%Ú0>]¤ì`?« C3u’w+\‚¾¶uaJäv¡¨Š¹MÐ’ó¯L”á‰h‘²b|™k\£y¡dUVÊ×3¬µkÍ–ª‹D;ìñ´$ë\âs™”•¬¼>egRæ}u}¦ø\”|aN@7áì` ð\cÎ`Öô\ÊZMB–—¬2nÃ]1(B²T”ìXÁñÙeZëÛ‰7óÚ@<;$ô-xvÊ@y#SV‹+òyc:È-ìIüå‹DŽK0ÞfÕÀ¼ëÔ ·%$° k ì'G‡s)Ð ÅZ‚GJ™Q ΟßÈ+UXë%¶Õ˜¬Á§ 'B>Û‰‡‹wC•õ«OŽ{5ë3ö'Bþ !ޤĔ(yµ¼yBv!à•g¥-p”²×‹@5ÞÙe•Žrr‹²>D¨C²»Yun­(=`ß)ëj8Ö»ØÕ3Û$­ûž³2åüÛ=7FÓ:’mZi§zÀ>S<ž³ÛÚÀì@é%ÙZè§ÎÚRVA Ü&í !ìÒP82'd×Ú'RˆÑI§öž„”|Ag°Ä²€+É"y‡g?Ñ7—Tr^µŒ,†khíù÷‹fÝ­/p6ŠrKÆÍØÚ2,cIëä…G:N¥œÇ¸G:¹­hÀ†Q,Å_ ¬[RÖ Ñn“”U¿ÔÝ?¦Ô]ïÓ|„¬gH»Æ1"dÝ{p±¶Û´0w›Úm’ö4æÝ!Œ5(o ~ö,åíìxËœ‹$¬‚/.%š-9;u~é[놑{6‡.ÿÝw¥•bgHg|)·BN|eÞÙñ2`g(1oÖ]>” …(·®JÙ6ʤÒí“IÙ ‹õ—™-烒£áÊ‚QnÃÆ»÷/x“”'ºXDಜ3¶kí¡ øü„=ޤ]½X·0ŠäÍÝ­ôM «ê°¾É®†»rN¸ l)§º)»„ïù±Õ2²ž§)_¾vù~¶²è¬ålåZV4óíÀ™ Âg÷ðé4\¸›Ÿá„‘—€r pŒI¹;ù~Þo@UUÐy¿‹<ÅCñD(kê”|,i÷=r»±È­íú<‘Û*£“¬œSV÷øì–â3Òík¸„€ò—íI‘’½G{!‹xön)Ú ÜŠƒg—`OßjPpLh ƨç§ú#QiÈòZ»IóÞ›—÷Bt¸W„²S;¯ÏUòMþ+Ý@D±Õ”Û (;j׺“¦¿Ó^ñ9<£x9çð$eï Þ±CÈÿÜ#^’Rî/!}ç}áX¡dJîü2¿)*°ËS°VÌ}e‘5%2ø%Wö ý–EÄ3Êtö•`p¾…²'=óÊMø¯›”•ìÿ´²ÎFØ›MAÒ›úv£yR~:/ï/Ò“¸:k]†\ê>•n÷‡cÍÀyÒÀ-埱Ói©0۬ƘÕÎЫ]ʦïÒì.E[cm´Ò\ù*c§²dêèêLÉÈýƒF†Ve-‡'=ç`®ÄLaióå‚nø´±@¿ƒ¸ëš3;«"rÁ Œxy@üôƒÀ¼N»;Æê6¼íhZ0ŠÑUŒ*ñ:שˆ ]Õ‚[v$7§ì ž½,sie°yoÀþ `ÒðÜ,—(<œ †ë7âàiž,Ki_\<éÀÓéÑü¼˜æ+Ó9Rò™È­ÌºñøÓb~0OÆpÛN‹™Ç²“‘cLÅiY]NkL¿ê„[}¡#Úèª1¾m–‚ X^¥˜Žâs& IÄgqð£ÿ(‹…¨Ž§Ôp}àYÎH¿Ï ñžðôñ! ·>»›ƒa®Þ}ÿî~U3üì‰ùŠJš-[ŒZ^ÇÆ·¶_òê8HÁеds_çŽt€AÖÔC á  ®E/(~$§j> <öñšGõìg[K>¡zKzT³xÚ(s˜kÊìhHÛ œƒlÑ쉸Ò6»PÖA8)×D ÀW—oyyÚ³]; ¥DS+%ê_à6°Q%¬k&Ê2ʧÚòm_òŽïÎÉr﹌ "Íå80ÑÞÉrå ÄW8è†N‰ç¢Æ¨XL£7ÐåÞ³ï`/l9žŒûâ‚y‘°‹vÅ?ÓvX61gÏ}Pà>‚Ë1º¸÷DDÐØ$E PBz4B'cl‡¨c>žŒCà!”„Äi|\>%BVDpXyš?×òA„ÿ— ½ÄNëIcBÉŒ“ôqi^ðÍŒnjf(sJÉ—ž=ñu1¾JÏÿö·úhÝò±«1¾¼pÞ™f/2¯A¡ V='ÒkÇ5#oÂ1]q¸ØÝ 7$Z×zjùÇ<…¬#ÃMmæ½}3S2°5w³Ù<¥j=peÊà¹~,¬ã`Á‡3¼æMŸÞØ—<ÀÖ9=üä >;®ÌŒðÕt®„¡qŒ2WgäXÌØGÚzHºî=Wlw’r{ÔÀ(9Ô¡HÈ(ñÜ“xö„¤Ï,…XÆ$jQ5¨%<8^ôšÓâU¯›ÿU\ÿQ endstream endobj 8861 0 obj 3163 endobj 8865 0 obj [645 /XYZ 40.7999999 230.419999 0] endobj 8866 0 obj [645 /XYZ 40.7999999 230.419999 0] endobj 8867 0 obj [645 /XYZ 40.7999999 184.340000 0] endobj 8868 0 obj [645 /XYZ 40.7999999 184.340000 0] endobj 8869 0 obj [645 /XYZ 40.7999999 89.2999999 0] endobj 8870 0 obj [645 /XYZ 40.7999999 89.2999999 0] endobj 8871 0 obj << /Type /Annot /Subtype /Link /Rect [66.7199999 585.620000 93.5999999 593.299999 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://www.gnu.org/software/autoconf/) >> >> endobj 8864 0 obj << /Type /Page /Parent 2 0 R /Contents 8872 0 R /Resources 8874 0 R /Annots 8875 0 R /MediaBox [0 0 595 842] >> endobj 8874 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8875 0 obj [ 8871 0 R ] endobj 8872 0 obj << /Length 8873 0 R /Filter /FlateDecode >> stream xœí][»q~ß_1Ï<§Éf߀À€´ZÈCAò`ä!c†eDñCþ~f¶{fwÈþHV±ŠÝ³Ús€#é6/ź×W¿ýë×ÿ:ü埇ß¿þÏáûòçãׇæØôÍüÏáüïï_`Çckç¿cw´ÓùŸÃ÷??¾<|9ý÷çƒéŸ¸üqzxyÅ<à?¿ÿãá·ùåó'_ÿýô·ÿ;ØÃ¿þïo‡?þçé?-ã¿ðãaœúó_þ>ÿÅXcÇÓÿ¼þÛùá_þãw‡œ¦0>{þïï‡ÑÚ®/›ÇÏëOÍ󿯊^Ö¦áô¿§)šóºÓvüï?üù4ÚuÇÉ3ônh²G5ÎÆÝèã`¶  Ö–9”)©kF¡‘Îs2e‹kL‰¿÷½1R{ª|Çú¶“É¡½÷Gú"r1íËÅüùáÇo¿}žÎLèÛŸO³xædóß~<¸Óÿœogëßþtø—¦1æ‡o{0öèÚ¡›Yßü¤éŸŸŒ×LðAã0<à.c½Ì>?ŽÍä¿f|~Ò­½'óh/ Þû"£Â'Á*Â×8¸Šäoíüî$,Fc»èvÂÍŠl£?ˆý0Ÿ9v®?ï_dYx£ƒ©a¢À;¼¯…_ ¶Ñ?X3æŸt@øøºüƒ F…»g>ú ÷w¢GŸŽCßõ7Da /ÿL þê$ÜÔðOßN N‡]µcëñ«V}&„Ï?r¯0eäŸPš³PŽ›9ÇM`1áåtÉub®„7[¸kù›²ã„Ý#0L¼`|¡ñ“V°k¾qmŠ/ÚÏÜ/XƒÄ(ƒfHëOšºG(4ó©%¢Œ0Ž~K‘16Î"ÜABüþ**å:%Ù‹·£«Áò5_šá»²6¸Yi>¹‚ùG ñoíÅ.í¬äšÃSHkÁÏNÒÁ(Ã_­­+I¬)Mþ†@º OOSïS$n럺ý]ˆa@²Áo9„‘$óˆF¸}‚)B: ï*ÇAìos#W@T0@ÆþòÊyK»¬1Â3!ad¸.KRçbÚŃØ"ÇkDðGï÷– ›Ýƒ Áq­'M¬P¹ (Î%:L›5ÃõM¸±Áè„©J íMä³çw1¨&âözÊ&ñ- r7ô·§h¹˜v’®¢ˆ5&r'dP\ /ÁÐá0Á´¡ðÚ|>-"+keÏø3rí¼¬E)¢z¤}ÿaÕáµÚ1ÄôÂë•"«!˜%G9‹BQLÖyâ@$äã:xÓ)Chw!˜Fu >›kSãn_¹æˆLjtÅ<íƒöU å|‚³V&¯P»‰I•÷#ì0GÆb&ɱeñ.›•¬(öv:®؉*é ¬ä7ýŒF7ùœ+˜xÀŽ8,˜ã'ÀšD…‰’ˆ¹çØ&u7¬gd…¤д®,{õ Ú'   -…³/`ÌL$kKey‘[¤=à9s–xJh3óñ8NMÏM,øÕàÖsôUBêIA"ªjjãàÉÙ|~÷¤/kG´¼¶ó—7“ètì‚奞hCï¼y"f¢¼_ƒõæq-4 wå >Ñ7¯³‹ýš_õêà®XH_Ö¡'îþòDs»€5Ô ™Níä“_QSR¿ëÇEúqV&l¤˜Šµ#"ùÁ%Z¥à;'ÂI¬»GÝ+CgIlÒ-”%¤|³joô£§nô?+Œ áÇ.IÏH'Æ^¶|Û;]óUÛ™GñP3ü´”˜DJƒŒ-ÊpADF² vé4I«Hl™"#“ÇZA|\sŽ©QÍDâ#%˹¢˜qì<)r×™ ÚL¼ö ˆBDª Ž"¬žÔ5ŸÅâ=Û`vEÇòˉ8e‚ 1‹Ñ‹Ü¯|¹ÌÒÔEsCèõžšÑØÆ¿Ñ¬mà¤9¼0„¬-B0”qe´:†ëˆ“þ’¶ eŠ¯Óž"‘dB‘8°h„8¤†tNFIšIú=«–ñ,b²¤>³b‰ôr$Eq28牑n%<¨ý¦›Qüò*E™²¤)YÃÛ$ÑöÎo'HÄ(=i?AÊÐ…­‹¤I½³ˆj,âå"½±¬Ì]-×ù¯Åë6¯`áì¤}à¢è¿µ~ùáD‘Z8‚],?%˜ì¢®ª ´WÙ £ÔCÎñíàåúŽíí¶¬M30â°-AÓµW[äxŽŸ7; ¦š)Rã¼Ù¶1^IðòI8½8!Eí|’¢°|œFYÿ”ޝ0Йì+ïÑk’»m\=’E«†N«mw{_²Š >þOë!KÌ›`ÂVîã¹+ûi)ýñL#?LÛ¿þàï_«÷¢>Oáv"%š‰6?_ŠŒ'„,Í| z1î¶r0åbÛÑ; ;-b„´ä:­=ÁðBø=Ð &³lÖÚ Ô!cÚõ6zý8°tÌ|DHÙnÛ"ÕW"ZÉnúŠ˜„9oG§4w®/jº~ð廉r˷͘EÉçtÊ üºº…12þ:¨ÿnÕÛ¬>§m‡`·*a#ä r”A]Ž"L,‰¤/–Ï’PlDвÉ¿4mšö5ie|*BéÁ†PÛ¿sôûGX’? *K¡‚ÐWºí3%ƒ” ÷ß[ÑåãV­Šî¢l§$I:¿í^x=I©uà4ã¨c—dº›Ç£(Œ OV"¸#ŸÁ%Øû²¥òº¦fˆùeá,ÇïVÔ§“ZPRR”+ž<ò"Hâäè‘ ¤‚RŠÙÎ ~ vœÕÄF7­/VJšp:Ç£„•±Êå0‚ÒWpë™rƒMÓ­r†…° p’¶F-Í]ÇE3²0‡¤e‘zVRÁסßne¾¾ms)îi[¸û"HÓw7­õ¶ÆÁxr £Óþf`ã”%¹ôžE®=±pn° K×hSä%ûàÕ¾oÒÐÆº^õü¯•áoÉóÇsëð{`m):#Ñ™M­T3CcòYß6tÖN½‹Ò¦&‹3t:úhN½*Ð ·S¼fÃä½óB¡²Ýèó‘³LRˆ" v)ƒ­³ÈñÑ|ÞhÔ̤¾’%&µœá± «çIX…÷ÀbŽ®³§òÚ©÷ƒvu­nÉ9°Ê"—³ûwÿzâƒZéÙzØܦƒÆ°À.uEi$š'qÊÉ(y(ýZ70É(dvó7ìq¦…×›D(¬—(Ò¥ÔøUr(¨ä¾g”„êzsETŒ{/Š˜²¹~PlD.€HPœ 'âqþ:Ù®…º «üÝtÄŒ@;Dª`Øc¹€ŸøËéÄnzóؽt5˜wÐt—-ôi÷evKýÍšA¡‡YhÈ=Ü0Ä1^½NdÑ2ÝKƒ%lJæ7+W…RweÞw H>ŒfÞašc?˜›'.Pú ½à8ûˆ†Œ3Š8alн@ST†Â¯…‰-â/ç@¿ˆº ”Ôöý#NíÊÝÔµ'qÞ±ðä·ÄJ+ K6ýZûw¢¨úº&†hª=©;‹×–ÈŸ’<¹÷ÌîHoÈJ-Ê(Ý)9½àñ‹4öÖk Γ3•pˆYª&Ò@zHr¹dø¦‚åÙ»ôÍ©Äè šÅN¢*ì¥Þsìf²Z'w‰^ZÎ*ÚÃȵΪ,õŒÝµ;U“ö[˜šiÁ1,,(è Ô n+b!8ŠëéO ÍBØ ü‡AEð{àîX Dƒg€áF>ÃßàS€ÒÁ'¬S`@”D PàÜðzn¤)>²£¸¸†A‘&?T¥Ë†ºÅ;ÿ†î“d1‘abfÕB1HI¿àzÑÁºöÚ¶rc"N‚Ý*‘í¢ ÓÔŽ]H¤÷ÔN`ÅäBnÙ•üR’É*‘¢H€¯M瀤!ëƒü6øFºåָʷ¥gM¿»<^_D “Xnàu•H^¸Ê6ÝÔ¥˜2N –R®¼—òìïSèjI'0l<¥Þ¡N-[%÷›0OI*¥M©æöû ¾¤s8‹9a?ßçÊ^‚D¯\ŸŽ¢‚× Œ¸Zñz7]<ç)çͼ·ÃÍ¿§Í' ÖÀÉù)Ð@â.bÕbó* æ2ÛÈHÄ©i ³7/VOc䈖²ˆ$AèT»–krª%ê„Øª¸["Í>S¤W1ô€é¢¥ß[¹LYW®öv¼ê›‰®ÊFJ- í´p¥omG9a§¶VzMß_ÓŸ.„vX 6$ò§ Ç´€j»[Q*“çË \e˜±?Q>6ó>rÔcýDšÁ»?³ Ü2<f‚‘ÔÈÐÈ 1KmqL§~0~ƒÁòD³Œ¸3ÞùnÓ·ÆuÓÑYä=P(5;Œ q~N ¨ÖÞÓ)Í¢ AN¤%?‰–Q^)Õœž ¬oM›Þ„ü6äiâZ8´Þˆ"ª#•G O9YŠI𠤾§KŸú¨›C{I&n!`ì‚_F¶l©i/{ú²ƒËWW`£šËY®lØR^¾2Ú;š¨¯ì.Z‹ˆ+„b%ÓeZ䲂ST¢ ˆ¨œkN±8‚D¥â0bñmÕ1™¢I©4Î(,*Š(T‚÷ÕEW1•ÔêÈŒ’†[¨Çé'}7£'3vˆñšï‡b"§îa¼ÝªÈ­ýe]õÌ„áb¿Y3á3Ôý?¡'ÁŠ—ZÁÈx i®Q"†êÇæ 9‰÷>b|À½_nI³äZW´ìO–YR#óÉ4Λa$oæFâ2ÚEž@”«HÉÌU¹q81˜†s¯à¬·Ï„Œì5#Ï“ ™¤͸¸ëü[¨«ﯦBE±•­Þ)‚_rÀ׸*YùV-35>!æS…žß|Ú¡t- ¸ž$z!ˆÔ¼WÓ:Gs=ŽiM¤ƒzÛŽµ@¨Ñ…êµAa òªä8õ5å_^SÖSÊßÚ{L:¬ub[ਮãK=rª%­RëNJ&&Áê½Le­¡ÈVàvÆ ¬j~â¥AðÛÈR 6‚öDX¶JE¥}–ù^E´Ó*¢nh½³Ê(RЄR.Ï4þr#%°ð(±ƒ!Rž x"¤Ép=°JÔ?kà`f‘ó¦Ü§žÂ®98 QI¢Ãë^ÏÑ:,ÇoªŸ‘ØlD?!¹¼wxEŽó:,8?hÇÔÚ$ߪ•Í ª%dÎb¿n¹ªPÁ’wCšîÎ*`Ùm•>ÇðÄï!¤Vò Ë"XççB00Ž7k²ÓèÝ-ÜÖ'iòi†À– ¯xÀÖ8A!#…P/£8b †­“ü´Ñ£zŸ 8MØhc ŽEü#û75·Ú+²ŸÞNµÙœÛÀhîϰç·.ÈKb ‚¨.…Èùû‘a÷`ÀÑË]»³"z’rÝK~Ýw`‡¤=yº‚…ü)vIØIŒ° é0ãµ…:Îþè'Ì[ÁY"8y8’žÂ(À &kžàºð2ÞëHËêHA–¾>˜{Ù0Ø!ˆ‘caén“ÿ$á·`2 İ·¦ZT.Œ%¡× ¡lU"íd3"Èðq]œé®Óœ‹i•"Ñ¿¸kkqÌöª2MHmÝ0i3€µÊuBÉ·`÷Œõ²¹ìHç‰hö¬Â ºÔa÷„€–L“Åʨ¤µ‘ñáàD¡ 5-Î÷]åÙ2pxñOÐ!D0LDJÇ9`ùÛ’I„Z¥Ã;KÖKh‰J´&Šå}W¾Û"ØGRÌú²ÆçòÁ$dœUÉLFV('h®`µÿºÀ­,šŽžTs*ŠÝÕUÌiιIS£iò§¾yÒüöXï=º¨7ÀŽÖ§£}rÿXWÂ¥€d³» ¼¼ÞxËÛóE{o_&i¿vÉËÄU›‰oPÙ¢¤¦ägVsŒýp®Áš"_K%#ñ—Õ#¸Y8¾Oè>aö¢éÓª†0'ÓNÓUú\eL3ÿó2™èÉ%Ž~ºüߌôÑ,mB¿iç-4íqð Û›+z߀k|R\{b–ónŸï×ë'ír÷¬Ï» ýuÇùRJãxt~Ñ=^χc ÒBVf½ ’ž¼‘tðˆf­ 2gÿLM›jÇñ(á]A¼€Á*É”{ìL€¿šîÁòØdºÊ°¯Š„º£¤KÖ«˜áã&)ÁGVàNS‚ÆÅI†0ù£-¼GÍX©°Ðv¬uòÓÖ5Ù~?ø|??²›‘éF ŒüB$}:?o(T“Af‘®—¢ëŒw;T°—[ÛàzZ ¼ÊQmᓈgƒá'q*•Q’ÖÂ}kÕÝëÃ})ïι8Ì­»¢kËpUb\†½1üe‘¢EŽg;ô¡;ƒTµð|¶¼%§7¦n ¡’W¶]ì!á¹r{¤‚}Ú)ïñVêèö‰ÛçÜ1tg™ÜLåFN%ìà5Ⱥ½'Ÿ@-îÔŒÓeãvìÃe½¡ #¤yj-Üì÷}‚OðhØO G‹ø}/—!ð/cÏóÔueÖxnŒõXè+ެg€çƒ×÷{Òõ›å.2ߨK‚¡´G$—Õ'!©.rÀn‹:µá\Ô ‡ O€1颊ñ_Eë!d§³ZpÜuŒ™pl’nËÇ=¥ª&¿†˜Ò 4Ø_B+j|üj]Ëdú ‘Î2á€HIh„¨U‹1 í-1 n˜†Þ?èÓ'1¿ånFq¯ßq%¦Á®Ó`‚w˜˜ÎßšnF™nßQ˜†1ybÕ-` „Dk̈TÒ™én2·t7Ù5º›œO§Oº;ËÝŒâ^¿ãJwS³Fwãä¿ãôI@wã•Ò.£L·ï¨@wSZ–ÐEE™Tîl3ÝÐ5Í ÝÙ“êqKçO|º{þ–»Ž~Ç…îl3®Ðmÿ§O|º{þÖt3Êtû}º³Æ•ÐÖ6c§¬äUXVä®-? ?`‡0|_¹(û­ !ôÆû<ë¤Ý6M4W9 ksŸŽêj¡h;^ÐÄï3y.4Z:‡…F‘’¶„ÁÖH0ŽÖ>Á•Âp/.[ÂEC»жö"òÛK{ƒÀѹ³PN…’D²0FÉzG\k‡HY„0W ªn`»`Ï3§ ’R ¢Ï"ÑøÕý€°oéâ«Åª1ÖÑãö÷}˜;Ïè`»¦¡¯)õ‚Æ!êÆÊL’@7—1ó°Z"KtYÉœ9î0á]GÔÐUq'W¶WC%™êvÎޱ¥Eëó±Ÿþ=ü<ïéøÎC,|ÿ‘å[oBßú—(­DšvŸôsZèØdú³ÿÐ6^‹›¾?öë"xrÇàÄg{ÕÇa=ò?¬<™eFÛíäÚÂŒºc?“Hkïáo&ø›™¢{´Ísb¸OQk£Íõú“Oð»K*ñÊ ?£ß,wuí‰AëX˜í7ˉQÖ¾ÌíùPÝùï¶3^ Àµ÷9:D~á…âm@ñæ¢^¼³œÓÀô°¸IëÁ”‚ÓbZÅtÇ™5¼Gø=‘Ñà¬#+5ð¾â;ñD_Ï¢l­Ý½Ï"7l›þhΞaïªÁ+¹„¯pC¿HJ¼Ã—‡ÿõ=Ì endstream endobj 8873 0 obj 6938 endobj 8877 0 obj [646 /XYZ 39.8400000 385.939999 0] endobj 8878 0 obj [646 /XYZ 40.7999999 690.259999 0] endobj 8879 0 obj [646 /XYZ 39.8400000 385.939999 0] endobj 8880 0 obj [646 /XYZ 40.7999999 690.259999 0] endobj 8881 0 obj << /Type /Annot /Subtype /Link /Rect [91.6800000 699.860000 148.319999 707.539999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files >> endobj 8882 0 obj << /Type /Annot /Subtype /Link /Rect [143.519999 341.779999 162.719999 349.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out >> endobj 8876 0 obj << /Type /Page /Parent 2 0 R /Contents 8883 0 R /Resources 8885 0 R /Annots 8886 0 R /MediaBox [0 0 595 842] >> endobj 8885 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 8886 0 obj [ 8881 0 R 8882 0 R ] endobj 8883 0 obj << /Length 8884 0 R /Filter /FlateDecode >> stream xœí][Ü:r~Ÿ_1϶(Q7 X`ýýÃíêáÐÔ—oû¡=ÔãéÏó¯¿?ýxþñôõéëñßO¦;púr|8¿â2à?~ýûÓ/——?]~òíõߎßýßsýü¯ÇÿýíùOÿqüòçi¼Ó/üþ4ŒÝé›ß.ߘÚÔÃñ?·ßþ÷Ó¿ÿÓóßSÎãžþýC?4¶†¬yüxÿ¨9ÿ½ý(zYõ<öcÓtÏÆÔÇy¶ÇíøßÿzúËq´÷iFkLßÙ¾Jµ¯OÃ}wüÒ=·½7¦·´´‘Lî@cSË 4œÉY™©lé0tuoÛjà÷©óªf¨EÎâ:Ræ•m™N3’8‹ÀH¢ga‡Qè,摲·°µ­Ð¡g$sp$ѳhlj³´uöŽ"Lj¨ú3c8Õñ4HÖÒæÓÀC‰Ç‘ž—>fŸÆ?éÕØ8O>ŸŸ´G­n0u{ûŽf›ó{ýÕWçõggjþ\íå#{™Pì‹ûÙ.6º½üF}¸ÌüftÓ£÷â'þŒ:¸i-¤w'í®Â{ Þ£Ú púFÞ‡ Ê;-|ÚÃËq'-r ðzÃÈÄ;a®x„dïÒçïGî¥Ã‹š£~é0#šáf›!ýWñf{{;º?0ç˜zþp uytž~{WPòê& –OfŸI€O 0ùÀåñÎs}©¹àóLÈÞæ8&do¢›¸Q„qhÐ;ñ—˲̡=ªTÇ_Îâ'ŸbÚŠ­àLâDè]‚NžÀvT¤œ¾\èÇÑ‘ x6wð±Ãàs}}ˆs4Ì<"ÂZE%óGM?”€€X\Ü\¶q8 cÕý¼ãª0í¼Àë“xJŸ´/ÇlÀuÃ.•Vsk=M,]© 3ž«ÇÀ£Â©±¬?üoO<š+uWlUÏŒé2‡ñÐwm—ºx(Š}æ™Á"—“[ŠL¿,ÍÏ_½æ Þ4xnqÒÄ ÂEÆ[µéd Äœ=Â',+í D—a:Z+ÊÓmÇ1ˆé¶MÞ‹À‹Å”sŠ.¶mÄ·[ày¾ó¤©Ð“é^Ü{ò ¾g„O¾DÞ£)àFWÂŽêÑÃUÖïÈ9JÇÇu € —¡ „.' "í•´Ú¥-Îõ¨S‹›8Y,®S”ˆSDá†2âF¾›ÌÛFT 0‚òŒy #ä›*a>ŠJ¿q­ÏUÖ¤–ðUÐùo3¼6q)½z ã¥à„ñûð¹x¡«ÕIj™{¼´8ŒGrš)ªyŠ÷«n{ç‚åÂ2ª?°´€NœÎWW@" …%}—?ÃïD1É YØÎQ D^ì2(?…ÍÛh†§>0WŽtL' ¸JÐÓ¹… N]ïV×X‡[è[ª-z‚ý^Õ|ÒÀ'1Ö½Ï ðI‹žXìǃ3À+5x/p£¶4îûÁ•Æq[fÓL A£š©È‹»Qn§H¢§²Çl'*e„iXÁ¬dpB:˜Ø6é¾´ùÃl Û8eø—ƒq (J­ê†s–ˆ ËŸ]†Ñ×b=}Længh±¬*F¹…ˆk/‡U%¸ZÒSº;Pf”(¡ì ‰=™Î²œ@"*‹„d9•e Ë É”¶é¡bߦÍm›óâóôe½"0Yï@.¿jªC×›Hœ| ÕB%.9B9pZ‹«â"”Ổ.•q¸~²IêÛ£×)úÈQy !'†ã/¡X0ä¥(›ÌQuu-žµÝm;(Û 1Àl4ß-M Q³$N¦ô؈®‹Ù4µs"ÇÅŒgPC§ðtEî=1ð L ¸¥ñ¬ñgpâ©Æ)h–{ÛÆ¡J ÕP÷f5½ÝoÖ¦nVÍHÜœžºã¸í[—öŠUPͼ¯È¤Hˆ §G~9yØÇ®’ÈH–A…Y>ug‹fÞzRx@‹8ÉKK!ˆd$I°(ä¹P¶‘6N–º‘jmíðrB2ªŸ)οŠÊÅcƒ+²:•lñÔ÷:Ô‚ð{ðhÓ¬UuÎÙÝ[B8‘ÀÒ³òJÇMD§u±v!¿htk¨Œ{¯Òõ\B;pB²è W6G}Ž¢ÌÂX|<GÎÁ—ÿé@E¬úXN`,î§å¨l¥Üç­©‡+R[ ›IšQl·†ƒõÛ0˜®I;9Cˆû4{téO¬r—hÏzð~–®ïy¿ÂB0~‡†Óyž³9œfsª¬2·?øíé[qÀæÓ~¦19¯ßцï¾ó¢ä·í{Áæ»™R]þ\Ïã=©æ“êÛôÏ ’£™78ÚG³³‚ä%ßLªÆÁN ÔŽý¡q““ºÕ¦T¤\.¬©kéæÉ+œA3ݤÚ5±šî^O…fÀ™5~knZé5làŽV×pnÓ¬ÛÃàæÒ0v‡uÚ5¤^ü¼×bÕ-ˆ5̘ÍWÞ€WÝ:Mv ï®ìÍlÑ<Ú5ÑÊ;+x3£ë) rÃÏW1 ›§¨t<|ļ ä˜ÓÍÁ®<0µ R QècÝvœ¡¾S¢9¥:fªD†6…´s5—«d6 Æž³ŽÙÙaVð¾Ø^<`c.WÐØƒ§y',"Ø3ª0»`Öq2°uœ%XO <|)„Gå, ZcºïŽè"0L/À-^B Š™(ÊŠ±]Y‘¾" ZÂ2`ú–ZWu×Ã'qî˜,l#PÊð 3K‚qSôi<È[ú5¢$µ³"×wöYbwOkÁ .oÊ4cóa¹,¡ÿ A.¼l9õŠ9Y¢"ã?CaÊûÍÊt­«ší€2Ì÷< Lg ÏŽÖÀÑj5 Ÿ¦QHoø{€xÔ}ÞcßE•ƽâ2a/r+.uŽw6£ÛVUÇIôÍI_&ð­‰Q1ÛÐïG·\i~F/HJÝ¥˜k©.µ5.uL}Ü›yÇ\½äÎöOúÏ=ßh“IÝî’¡:ˆƒ&"ÍÞ€j † …õ>(K{\gQ‚Z4¸¬kÀµ­½Ï2vÅ}CŠ{7xúÁ®¸«Û˸ý9™B1IéX”Ó€P7ëÛŠEM ±¿ÄMÆj†/m0þ-vNaþ¹DÀeÃphìlÛù{œ¿ë[ác׸µÉ†X[ˆî•®dQî¨, ›¼"ØÕ2–LY«vž•YÆI”­ßÌÈW›cM‰’·É i”—¬)3¦\É«ÐÐ.°Ëh‡ÍFT¶h§)7kp0è` :GƒÃëi°^ƒõAl·2ž°fý¦}ºath‚âî‘…—‘ìD­é]Xîb†€ï ¬Ããµ'+qÑj&Ç®ÔY¾qS±(é8θZJö™,¿‰WÆÖ{"ÖBXgþ¦é…2ÔཀD”o…>G¨Ñ?4ꌪÙT;¼|yB ˜KœΡë4%BˆC´/ƒ ï^‘»Lt³r4‹AE çx“>GÄ™r©wÙN »b©$bœö‹ã' ¯…Å>œÆ Ÿâ4x`TŽ»Ç'‡G $ºÃóÑï~9K•Q§+æ>2Àðrõ‡ž·'{n81Ýz5S›ÎÙÝMb#U-+­Ýó.œ)€ô©Ëoês?Á4†³5ÒØM_÷8æ6›Þk¥~²¦%RÞüØñ‰­0…¤Éh…šQ½Ö8ܨp­V({×ÚDoLœžÀmדs¯r³§Èó=¯,>aשAé…‘¯¢Ü°PXèå{ »Gçå;æí^”цX;ðñi‡l‡S¤6õ²j"‡g2ŠÅ”7·P‡ÅAFY¬e='Ù–­^ˆ¼PV!ºAHEd¯ëšhêÞe”;ZËŽÖrR‘ ý´Y%9;^ŒpÙé6Ãj*ô¦¨ÔõÃàju›sLfܹî_&¢y-ö^±dÁgù-žA…ù‡§íÒh—F)4ªRë:ç6Jq?¾rôÈP4ÅÝw†y)r"±³•Tb”wžL…S$dVßçÄ(‘éˆ"Îñ)7`OUSÞAB¿êŸ(=×xíŒöPdÐ[òK_Q묱ï–CÂïœw@î´{“`¾·¯_ ˜hüÌž:˜žm½–(iô‰H"“r}ýÞd@3Œì„"™¥04³’_VÓÓ•ñ›žø?!llFãJ܇q Ãgà4øÚøÂ¡"ÍÊå¾vy7¶48ªãº$07/ÔÄaĺêRBæNX‰f¡ðuê™El;‰P(BêÓ7ñM5ÄÉœ.97ÉÕR Ò-¨œ|"™è=Á0”°fs@™YÉÓ˜mtwfÉÄTp½Š¬Tef&‘¯â§ª«°ä@~“û>kÑ*Dúå6Is ¹ýL“6]Ï1KD[Ñ‹¦•®; p»¸òtñèšêÐõ&ÜíÁ:ÖËRãvR.5“,Aò¬ÇÚ–Í$ vŠ€ åÃ#>|}jŠ–x1‡™y·^¬“­óX gxAã´îâKÄRN­¿˜#ÿ$RƒÕ-„ç1¾«‰_0åõ¥bñúeY‹„ ¬ JV×’É6!4÷(iSÊPÙŽ‚¼&¿Ò54¥@îVS`!-y=Qø%ï¦qåUa~DP¡Õ\?DN‹Á(°üØÂ„T7³óÏ3” $$¾0x*aj²î‹¸Ç)Îây–8qƒÓíLÂÝé«þéG½žLŽÑPugP¶¹€TÙÑ+©\ €›ÀÚ¸:$8Ëpð¬ç:ô#Yö"‰¤Ä”7-k6å,•+bÁý»/Üaxo‰d\–õrmà7<_[ô#æþ·ÑxƒsGq£qœŸàìlüOÍvg?1˜{¢gØÂœoý|v3´éàrÓcÞ±mŽóîñ,Lø4cëÑ—Úu]ϯÌB# 4ŠpðÇD0ü€egft@ÍL?óÚ eH‹â8ó¼0œñyp¼™,R~°ZP;Í’ã±sXô–pó–B‘ÜÒm:[˜Ò‹„cЉ‡eö  G&rpЩªé09 iXX{ыɲ‚ã›÷³q"}©qͬ®u ­÷!(EƉ¥ã+À¹P¶DKØnR²ù¬êr%Œ !áè|+ˆ“ºô ©”K) ›ÒèI®h ¦ RÈ‚–S=ôΕ&èp"H²ñÞ±’˜ÝI,×ÛF ›"Cs ÷ã!¿ ̃ɠh[îj¼p³.ì5Á¦£ØŸŒlóŽPdJ;åL6û.#ÔHÁG#¤ðÉ*¬œÒ†UÛCý„¢t£êø©>¼D¢øµqÅ¿«¹–núñ‘§¥Ýèâ¿%ûÖ Øµí§jÝÎ5 êÅ–¼C«–_fª½»hdNº±ˆ*@÷Þž7ùvÍO»xùIÒö‚ééß:æ´cÚIw²˜Kùñ éÞü«ñ òƒ9…eµËS3ÊÊ׉eô$†çö{5g@[Ìwl„¼9Œ—´Û+ÊÜòÖáŠí9Ûù}¡ï›Á–Þ œ\Ïn…´BÛ~nõÒ¼B] ½)Öš+pëÓt½’É´÷V\tAbõJÁf‰¶º ‘hÕêíÛô¾¶9_ª›M‚!âVN¾ONÕ@íÎ_êÒðT•ÅŠ»Wf¤Alç!)ŸTÓ{Í‚r\–éy.Æ%V`ó ¥®¦@’i³WA#¡Ÿæ6ðz*hr`ƒl7®$«„{f‡ÕP,Þ+Žà+¦ÿÀ¬wú× ÿ®ßé§ÿ4É uüŽîx¾›ðäXëa¼§aìµìÉám ÅWx Îàø´á^c®ºæû3Ù+e¸÷ÐÅ©|çÞ;÷.ɽ×|>˜¯ÃÝ èvxÖxn8°?S‹µZŽs”¾jã”´s”£ì…ÍQðzð“À¾á¹A^³kŠk¸Y%5žž+Jw¾¾ ¾±8õ-Ï×Y3ÀéOðIƒ÷ k} ºÞ¹êèZŽ«FR³ú~p lqíN›„Ì ´Âää¿çdöxyÚœÒ 7 O”Rä[ȶ:,6J;6ÎS!WÊyn ]'5ïÞšªámß;"c%zx éš2T´tO=JNWzϦo¡|7'M§7G=`áëqÐ[Òá¡X‘„ÝÚPQpÉlÀ¡1ó|֜ه3øž#—°ž3õÿ>ÿ8’Ù‘„N¿0}ùõwRG¾›f_ƒ$üh”Ö‡îÙ—q1h4Ýá,?ž›êþîâÐèºCw¨q´ÀÎêþÐßgŽý'æØ4‡z¼[\Õ¶‡îÂ\Æsï=üÌ?sÑ#úúPWç$ûë“Op´©’üæ'oðw'ãèÎ ¿ ÏLŒóÞƒÖ1ñVÚg¦£¬}šÛùdPÝéûº5ýÏ×êÞû,ŸáPÈDñµGñæ Q/ÞYÎi`z˜´`Òz0¥àÏ4˜V1Ýqf ï~O`48ëÀJ ¼¯øN|¦¯gR{ïݽ/"7lªî`ú£ià\5x—ð&⫤Ä{þúôÿ–‡ë endstream endobj 8884 0 obj 6700 endobj 8888 0 obj << /Type /Annot /Subtype /Link /Rect [177.119999 169.939999 203.999999 177.620000 ] /Border [0 0 0] /A << /Type /Action /S /URI /URI (http://valgrind.org/) >> >> endobj 8887 0 obj << /Type /Page /Parent 2 0 R /Contents 8889 0 R /Resources 8891 0 R /Annots 8892 0 R /MediaBox [0 0 595 842] >> endobj 8891 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 8892 0 obj [ 8888 0 R ] endobj 8889 0 obj << /Length 8890 0 R /Filter /FlateDecode >> stream xœí]Kܸ¾÷¯ès·ERO XÀžÈ!€a9,r¼Ù ëE&{Èߺ%Íôý‘¬bQ-ukõŒ[-ŠdëùUéý_¾üsÿËû÷_þ³ÿ6þ|ø²+E] ÿíÞ ÛƒÑïM[twüoÿíûîyÿ¼û¼ûÜÿý¼SõéÆñGqzÄ0àß~ß½¾>ùòð·þ·ÿíõþ¯ý¿~ÝÿøþÇOãxÇ/|ßµ]}üå·á¥•nûœÿv¼øïÝßÿ´ÿ½ŸB{÷ø÷»¦-ë¶ŸKÊ<ž_nU§?ç·¢‡û®-ÚJï•Òý<«þÓÿþk÷s?ÚË4m­›²*ºþó¤FÕôßîšzßiç9ÎrãFR©µm'3ÐqF*ieª(ïH¢´8Ñ¡ÿ¿qiN\ù4RꪢR2´IYÙD 8’$-N§ï´‹UêN#%ÓB«Rf “dIZÙH <’(-ŒBÕ¤®|)y M¿f™ú©¤•M´€#‰Ò¢<>L„ÓHÉ[XFf ãŒdhG¥EÕ+$ZL#%oa]ʧÉÐŽ$J‹º“’QÓHÉ[ØTB2ê8#ZÀ‘DiѵîžFJÞ®2Ž3’ÑÝp$QZt“Ù/©{(d‹ê¢2¤Ž3RiK›¨‡’$‡V’S/#%SCk;à4#1…G¥…îj!ZL#%o¡©dì€ÓŒdhaôY$N£_ã4Ïž?~ݽÿ¤JÓÃR_î'rüÆ»áÇ×~±ÕþÝ1bQ÷WÚÿ¹(ŠÇö_Ýu‡ª3M5ÃÆ+OèŠ)ÐUÃ+%º¢;8ƒOôçàY«Îà])úÜ83(>ÀÀÝÁ³.4cßðÜàhžà½þïÁ|ZÏÓ×þ”¥™˜²8˜N¿0ÿ´…M]Õº:_ÚÀ,­=ïæP8+v®|ý`8塾é,þÒ Ã&×­Zë Í Ç½:ݪ7³Ç£©Â^W'ËY†³}UáAœ½·GÕO ÔyB»æîMp"žÝ Þ;n€¿«Æ –׺²x¾P—It6ÓÖÊЙӳ3ö𣰸ðÕQ$\ «vhõ Rå–8¦èìíwØ` ‡ÒÓò_—TÛt°? °½v]©CÕÛ,ý—Y¢žÂLJ Éí•!ÇçåT#Ú\>Sí¡íŠ·zdämUMcƒK{ù‘Š"ðÖ9ƒ@Ú™2ž5° w¨ÊP,ë—Æ^E¼v8Þ£‹B|–F ÑUˆ¨eWè@ù¤ºh[B5t’‡÷Æ3j¼^Ö‘Š:ÆRq%´¨ùá|¿LåegföÜu %TN.Í(¹[ÝÚ’{&[eãçpîÉ£;ò:' ^‚º…a‰x¸Ö™>‹Ø(‹WQêcH€™¨é Û(á™ÒUâ ~ºi³*A‡ÝLJu•õµKS”óh—x;@&¢¹¥u<|ƒBذ"sí²M‹” ^×K½6Ë€suIU ã„Å·èyÉãv¶+±Ì]È®ê ›»6¦m|¸0‚‡9™Edg¤‹šR?1„Á®Öùó„ÿWå$âòÀkL­E˜^ñJbžlo”ùÏ.îÙrv€›CBVt.Ë')a„8ª¢è¦ù\â8r iÞçÐáç@ £˜©è»ƒGÃ{½A%!ŽgF·Û™¹Ù3³™ïå¤û]DU´ú-©h)qÇØubäŽMQÏ;±‚ « äÊãT†)ƒ#¤ƒ‰ÊœM¦ŠCݨ· VˆÀ4Ï]ˆø„cœÓ@pHDÈÈqšðƒƒÔr½‹„|›Çq6Ú arb¨)N09ùšSøw¶ô§xÓ3Cd„CdðÌróá̽'ëCÀË¥dDøóÜ™PËˉ¦aáÖw×&p.‘P'’ÊZ\à6í¶$`sgl}€ë}dÒ3 °‰ÎB èyF~§PáÝX`âüú%<ËQ0¬¹9ŽI½à2° „—JÉÙ¼œ²ecK¬ø3èq,Ñ£<¥i ¦%_G@ˆ€x\GJÔ!½¡#|%!±ÇfõÔ%@ˆƒ<öì0¾‡°®,ðìL1އàso4 ‚±®îøRþ8#0@UfšÏÕ“œ8éd`ºÐà§ÇÒÕÓ’[‚/ —7zãò%q9„3h˜.÷€àz ȱœþgÛÙÌr6;uwgsƒóHKLïà³ ï٤ÌÐ]V©òôäx? ®™B'Jïós²Œ)i(#+±­ÐP^p‰H/•5µ@" æl.q‹‡®Ì ¼±pxðÄäöMkI{Ù~a¸È2X¤â2Ž4åm ±‚¼Z)š½fÊJãÕ„Ëj ª™p/£éQæÖV[óֲˆÙ6Hœ6ñFˆ“\@)¼¼Aƒ®ÿØR¸ŒûߨûÅ1ì³s:ócϯ‚Wæõ0órrñê28Ó,Þ+içS,”³2¿ª,ФÀoÔ Îž½Nˆ.°xŠE¶Øþ1õ.¢5úø1f’]…²N¾2ƒË¥”-} Ñœ„&ú¢žLGþ™qtho4™áWxÄ.ǯ 7ÂIz±ìa $ëC‡Ý­|!Q áI)h¨B”Æä …ç(c,Úx¼ð¹"#<|ž[~o_ëÎÚÝÅFësîBcóØmdµ Ÿ'ééØ!Øí x(YŠ'3•KÇ—cqÞw²‚ªÍ[ËsŠ8¿EaÔÔ¶*ËöÖy5%pâZ  íY6â;2á¢!Íô“ÈeEiçqîÇ4è ~Í'Íy°'ØÞA«?˜1Ù9Úµ–a½ªQ"xHwòú…•q¶fCÜ*Æœ´;ïÏ S_aT8vŸ3ÖAäŒîŽhš×³”7c·ã½`šéuä9Û/µÊê ³mÎÂi³Š’ROðŽvwaV’¸öÌ-ÇîäT”º~Kø%F*`4[tc‘ŽôÝX Qn2º‘³ùÖ覿ÊPNƒm|e º°Äù½EDšÒâÂ-"²EDÆê¹©´-Ñ3DDr. 5ö¶ ‹Åk º¤!c猈”m„ Ø""÷Áæ¾²Î(Je&|´ÇNñrµÂ^1ǯä´pMBáñL°)a~1-i¶ Û¸aõ¬s-=½ÝPNi>¼žüLœjµ< ÆvˆôYOy×A„Ì™Q%‰B(FZ`W‚ÿ…ó4kDß¾”¹D±åZ‡Î0‰dĽe†¸Í«æ!4.“5#ÚT2BïnM £ÓŠ›€Õ‰«éónûÏCȼßJ£CæÝóÎQ-„È,E«1‚Ϲ— éYÆf^pá-1sû¼œR¡¼ï,ÉÔa1h³¹#gº\U–¸ðDjݱ½r¥:A‚Äê¯AhT›7Ús?“¯~7¼R.rmx%’®;m `5ªœ¶ý• dç)yã‚p?Àh/ P£ B•6Ù BÛÊêÆ>„jÅme«FgºÁ³ÖÏRmiÓw]ð,=¹@¯ ØàY7nð¬ð¬Þ Š žusð,LmÄ]Íá`¥¹ĎǯéÂNR8Nï½²’óy_$’ô¦‚2”h%>wä–órYüE¸"o ¦Êœ*µ1[ ø=ªTÏÜ8>{èE!ù•SÓ¾‹À8TëËá´¡ƒdÖ·´±  |½–’{f…̯­È J„Õµ˜„¼·^¯²¯ú\1àìkD×Ä-üš¿•æ‰ÊNYzÁ<Â] `ÌÃÆÁq}sÚ„­™ü¼ëÛ„›Ç´âbˆà¾ªÝ¸oíÜwCA±ŽmšcWÁ±[ yž3ðÕ;ó’9Ä@D2o1‹ ˆQÂe$Tje®kKªWfì4áedsZÊ]ûRéruÉ/=-àhÉ‚¥ÍÀÑ4|‘°g4,Û°îòëÏÜPÄ5Èÿºßñÿ7þ¿W_UúV³g˜/=¸>Ž Í@ï݇ Á}¥ºQîó W9(dÌ—xÖØ·Å›n~§ä™ñûºè&ü ¥ÐÉFtR øo&ÈïÆ¿à5S¡»}É'‡Dé}!^ÃÄ`%£9Ð-ÆeÁj”PÆÏ+ñÜDÓÓ\E|û‡”(OD‡’ø ú„€^NUQW–®Xž´c-ãûQˆÊ8Ï"¯~Ÿ«ƒR|c!¼àlÅúÀ±mÌxÒNcåÌ~’RÖYVØéQð 6v¡\B×Fá`¼RfQ6mkK½e¥y¨ÝªÎ¦6t~5.©„²6š¶m@S‘.lñŽJRǘ,øSØ%j=cžT§7“ I~L~ç^©2…w3óAÞN“„¢Ïˆ‚ãLѱ•Spå0†oªi”×+ü?Fcšš/CÕÁúë²²þÚ(÷Üèèàì‚W)Ž`AÒÌq ;ze6½f'·Eoæ: ,Ϭ¢L» ¸~jáE /¥.µ%½·6=âTF2rk¥S¬®•N§Óÿj5é„ʳš'°R-œ=I¨ó£·v;Ás墕1Á tu—àûrFëè%º…ϲeªñÍÖ#ã<Ö?ö8ï!§_Á¶h,”À1Em^‰hçùá‰:¶ŠÒÛÚMêYà¬Ödu+ygþ¨q_Š×}9.ï´ºòp|T¿Þº9ÿà·ÝÀË#)S°DåLzŽy©JÄ»ðâk=8q'7"™€ÙˆˆNŒcDT8Qš5¯ œ(B¡®ˆÒÛ¹äð1V§¿KK ãØ…5ÃÁè‚϶PwÌ ×i1~=œ-ëÕ2s¿Ì-&¿¼šŠ*ÖýXëpØÓÔI—sò&¢Sš±"Xëb9Á[ ãÊkIÔ^ØíÒ àJKÈ;²RÀçxªÃ àŠ‚\Å©ªó¤¸D«É±DòÌ Ÿ ²Å2Žæ™>?P°*ñ0ǘÉ^Ñ/í²(€w‰X©'=ÏH#À†Ãû8)( |„óÔ— Å®<8†Û btsh.×b4® f 1Ý]¬]­ªC=˜¤¶:¿ôœÞÓÁ{‚6ú  s¼d‹ÊK£ ¬{þÉ#üîè-]Xá'tϨú/]Qh£ê§Ý3RŒ²vuVÕ–ÀuÇßu¥š·GñÒóJ:xîápÈÈñÚáø±<à÷âåPóÃ(ÜHëÁœ‚ï1˜W1ßqf Ï~Žg48kÏJ<¯øL<Ñ×3Æf.½O"'¬m‹ú šÞñ¶Ž<žCøFë j¼ýçÝÿlm# endstream endobj 8890 0 obj 4511 endobj 8894 0 obj [648 /XYZ 40.7999999 439.699999 0] endobj 8895 0 obj [648 /XYZ 40.7999999 246.740000 0] endobj 8896 0 obj [648 /XYZ 40.7999999 569.299999 0] endobj 8897 0 obj [648 /XYZ 33.1199999 139.220000 0] endobj 8898 0 obj [648 /XYZ 40.7999999 569.299999 0] endobj 8899 0 obj [648 /XYZ 40.7999999 439.699999 0] endobj 8900 0 obj [648 /XYZ 40.7999999 246.740000 0] endobj 8901 0 obj [648 /XYZ 32.1599999 141.139999 0] endobj 8902 0 obj << /Type /Annot /Subtype /Link /Rect [199.199999 533.779999 240.479999 541.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG >> endobj 8903 0 obj << /Type /Annot /Subtype /Link /Rect [255.839999 533.779999 303.839999 541.459999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus >> endobj 8904 0 obj << /Type /Annot /Subtype /Link /Rect [233.759999 298.579999 303.839999 306.259999 ] /Border [0 0 0] /Dest /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines >> endobj 8893 0 obj << /Type /Page /Parent 2 0 R /Contents 8905 0 R /Resources 8907 0 R /Annots 8908 0 R /MediaBox [0 0 595 842] >> endobj 8907 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F9 9 0 R /F1438 1438 0 R /F8 8 0 R /F1739 1739 0 R /F86 86 0 R >> /XObject << >> >> endobj 8908 0 obj [ 8902 0 R 8903 0 R 8904 0 R ] endobj 8905 0 obj << /Length 8906 0 R /Filter /FlateDecode >> stream xœí]Kä8r¾×¯Èó›#RoÀ0ÐUÝmÀnÀ‡…Ƭ׋ÅÌÂí=øï[™R>ŠÔG2‚”²;{€©ªTŠ¢È`<¿ˆøå_¾þçá¿ÿqøåíëÿ~]~¾}}©ŽUWÍÿ§ÿþxÿ޵í‡öhÇӿï¿¿|?|ùòòeúÿ÷Óo\~L/˜üǯùe~øËüÉ×·›~û¿ƒ=üëô×ßúéÇŸ—ñN_øýe»Ó/¿Í¿kì0ýqÿÛéâ__þý‡¿OSÎãžþÿÇižÃØ4Yóø~½Õœÿ»¿=¬:Œƒ­»á`ŒæÙNËñ¿ÿõò—i´ë4ŽCgû¦­Æþžò¤ÞžÕTÓ¾;´½÷ïuÓF2ÙµƒÐ@ÓŒLÖ›™ªéƒ#‰îEÛtB{q){ ;©M=ÍHf/àH¢{ÑõFh/.#e/ao{¡MíÐ^À‘¦5_þÁßSž31‚¡î§ßÍôĉÁjny=˜y}íØf®ðu¨Ü­jŒ‘!žóŒLÞ«-›îõEDtÚ›èü¸ñõÛË/ŸÇ“šðí/Ó4κÆüãÛï/ÍôÇI~öðíχªªzüç÷¿½sœØÆÐ·çï¯Toç+ÍõÓ?nß°çúc5ÖÓÕí^ûÉùª©ÜšØxôj½t¦Áض ̹ªÑ ß»3ñVÞkæ{›c3_¸u8_éŽÖ Îó¼uuŸç-g`m¼háŒÜ÷4ƒûwföcòD|jñf†ïů‡W¾'Þû9:Gï-2ˆ#~/e³¼™áðöÕÕ?¸Ú÷Þ³_ål=­©Ý{G«ƒ¼Ä[àÛùômâôJ|»µãÆ U{¬o™™¹¿½,ÝíÊè‚w7ù\ßã0.«k>I­­iê,oßžW·©ÛËÌgF7[ |V®Ôº²¼åÚ•>ç>Ú²k÷ÀÑj8šýÀm ¯[õÎà•±=md¬~~S<ÜmWÇÂçXHo ~\k|¥Á3€oÚ@Ú©0UÁÃ4ŠWÔBÅW4ŠïÁo ×mYMy1ëùÍ0^&3súá8ŒU÷^x-@{áßî«­ ¼×d«! 5úŸ¯õ`­ ]é°žbiºâÈ4³}˯`>T38{ ï|µ£a…ùæ‘x˺)ž4Û÷¨¥: &¶ðÁŠ-Xï#Ì5 Ä{zŸûZ# ¿¶ZŽ 56ðæq«7ªñâÑ«–n80Vz—}y/í™%ů7Î Ò¼‚Iþ ïÅÓÍv¥%%f‚H%Hn‚A险ÿc& î-É­ k()>PÿXb¾BnÑE °gÂùÄ»öê®;«©Ñwí{=Ùß<#¶D‘ƒOF‚«€–àކ=øžkg²9ncojƒ]“„7§¸§5M)}[·­Q–£x‹¨¢ðú#œ,ͧ^ŽŽBX ²§=‰œst…ƒ…mFu¬°+_Ô4ï' èp•rVˆË0ï$ÇuÐtbeQFºÊ‰”máÚd(ìÞÈÊyBh׃B<²Á)0f)p^°Ñã¶Ên0H eãÒ)žÈu¬b¬Ùùy8¸¡(nú®vÅŠëL–ëNgVÀTb(Tqþ»? K"äx¹ÒÅZœéÉØ¦ð«qŸäyX;ú½öÑ¿˜±¶£“C€Ï^± Raç~ ‡AKþrˆ‹±[øJITÛ_½~xô€¿<ÃÛ9ám4Ã_à SÛ(€uaÚÁ 78žuP)ƒë0| ¿O…r¼…g]˜ž5|ÓŠïÓ—ê]]_Ȉ`"ØHX.yNŒtËPÏ\,¥äH[陹Íx)?1 c‚pkP ‚q7, ñ#?&@Z=kwxÖ5ÄÃkìœýáÐ5~Œ=´u”¦j]®ñ*õ̉Q«Fý¬j×>öjUó¿Û|@Wª‹¯£oÓïDGëà•¶Ä6L}ìgÁ¶r¬¼Ñæc5ëÞ3³dSgýÛ;"¦=΢Ð#Ý•ÑMpe´Å‰Þëy0O3ZÛ9|O½Èiëš x ô+°/Òsèíû…JÒ¹‰ÜWŠÿ™]ËH) 貜\F‘Ò‘Æ vž‹XV”±·ôÞ„’º¹½;®õ”£÷ÍÁh'4Ê?^0Kµ™™Ë±4M5¡CÆëÇ6\%v7+,Âà@Ág3½duB$/]I<ÞI‚ø”!`Ÿ¡¥×áÔAŽfå„qj)sSŽÏ(Ö)y­(]5U²jì³µb¯wª|F¾8¥¸v»€ÃþEÎqB°œà˜ÏDp‹Ì$42ÞŒÅB,R"ˆ•ª¢Ûƒ/!”BhAãU@]OÑôãô6cC,²Š å”z"„ŠDmYº§6½Ëuv‚Á=¿ôý[™wo5’´†°­·›¥?̬™m}˜s‘7/·Y–»º-÷iÕ΋fN^ÔÃ$Êšæþƒß^¾èSIšNSpvR° ‘6K]‡©ÔÉëô¾ïÈ«mz—¼tVúô g¥¡3¥¾*ã„ê×ÄuÞkz~ßm}ŽÚ¤8GaOf$ý`iô¾ÇOŠ_E/Cµ•‰Kq:AjÆÎ$°9'ÀÈÕ²žAiÖ§¼ÂͬçCù°~>U“Í\9—ãû%§ ¨DšlMÿ”§æsÂF’5³|\†Ôw×~;„Z {Mà{Ï$œüÖÁ•Âõi¤€ÝÓµŽCe:¼÷%.6V3ÉMy5½>u˜«ØB†³-«@tiŸ¬ˆNH+œ¤ýÁƒx1 ¸·Ñc+’*·bž’òòU1ÀoL=j®Yì#+\‚8¡1"ß[»GÞ°?µà‘Ä]Vƒe‚ÔQnŸ‘®—Pµ¹T¥²œ˜+6A1I{Ü7=Hy_b:Åk¼âîÆ“ûyì/þèËßÓ±ªCן~ôÆ ó§Í¡ë.0úË'¿¾tíјÑƒ¹~«y7JsÿŒéûËßÕ鶃s÷4çÓ'Ó=ïgrúÖøn”ñý3þúòú-§Õ"wÜ*+>6‚Üa¹.éI®J óŒš?"-‚ Ù9¹ÊOÅóÏý¹hîUá<6=ŒïÙôX­±éѺ,túÄcÓ§o5ïFiîŸqeÓðƦ‡Þ}Æô‰Ç¦Oßß2¾F6=^Z#ÔoH#Œ³“@1«½¸ŸtOˆÑR —T„eR#8‚JŒmœ†GË(ä€|€«Æ‡¬\ÙªBÇ7¤“DøÐ¢Šà÷$„uœbÈ^¡èúikë0÷fYŽßÅ ,kVn„–1Çêk¬¢y)óÉY”9‹Ò ýTÓ™b<™],|l|“D²Þàa#ô#NqfÔA÷‰ Gö¯jfúÚ‘!:-sø3Åÿ\©£‰ ;ÛmõDé—ùçxÇHHïq˜ÛÅ[+Hxç)¼›·.ä¡â¤©Vñ‰|íÆæÓ-W[÷X*\Á:V*_¸BœÕæ8u78ïVŸÓ[w=-tH`Ý)ãâcp£qá:Üv0ZMµ H¿NI,'CoÑE9:ŽÄœ<ØlCÛŠg,µ/y à¯ÛF’Ç€ o£î½šµ =eùéHIaN9Ž”x"‡¥«ÔôØ¡Ó'Ã@J)Wïγ¾bÖqm.„òqYÀ¶vkrrÐH²X*Æh÷‰K8‚Ã9½k0 +Z¨dº„±vtŽãa ,!£fG’%¤ÉˆBX3 –îŸJ©Æ(±O9Q×_@ðòHDé“U—¶CE ËDÙUWMsìšþn}d×ô©ƒº:â »æo5ïFi »¦¿kÙ5}j½gXÙ5k|7ÊøþêÈ®éYã…0FxsÎ|¡¶tx«À”„w?ËQ¨rM d6ÁÜ“ð„”®öÉ©}®ã¹£(à„’c_Š£ãç==ú*+$CÐ#> ÿå$øaVÎyâB1÷V§ñ¸p}‚Ž‘á¯ä™ÐiX(ᕽíÑÍ逫B!¬¸Æðªå³[Wig€ó9|# ¦ë"à•¬N—®|2<'î;{üã]ß¹ ›’]ʸ“3Ÿl !•-)ïI!‡s ErÊa‚E‡]bž¤½j­Ã$JsWV¡8{Zv÷•éø‚]g{Êéþ³Û²ñÒë™ã"˜žYÖÉ—€û«ÂÕy;Ç×µ °LFÕ»A¸ÚLŽ2-+^TPs¾áJY6H(ˆš[¸!òÂM‹kS]jÉKø9x4¸öè¸m9¦~H•÷+Ê™u€7à¦îŒÑjC§·ÀZãÑæÝžŽŽ§Úøœlɦh. 9RÞÃG0ÏÆæ!_ <§ePÓC¶º¯MS_&AÊ |ÃY÷(¹œs²ž±žœŽ‡z¨ ßîŠÀí¦`¬ ˜OžáËÉŠ.è§û„F¶… p´Ÿi†Æaÿxq)1« ·-«ú[z(J® ÿ;,-¢DJzÇó½|75¡²‰ªñ¡dä“5<áLñÕ/M¨Äк;§¼ò6ÌÝ9€WÁÞ]"eï>€Bœ ñdJÅD_;°3Ñ#”Uä`W E7‡ Ëäí*(§¬40ä%㔦„ç¼ü%‰¨œªÃ@µ•}ëò–GÒ·\:] ÷Q’‡“2E•9ý¥)Ç8'WB" [´ÒÅ}ÂÉƠŧáÀá¾¢{ +C…íS¾ÀL ”Yj¹ó´””š9È8¦TŽéC*Yh· ØŒý}3‘–Z¬ŠË*!ˆRùÉe|zY T¢†<¥¥4Œ¬ˆÄ…ö¦w¦L­”RH!:@ GˆÔ Ïág„Õƒ ©~!UªV¹Ò1ÅÐB^ÝL·ËRæ †Oa•…"e1 e^"Z¤€Ù4qÅñ™üÿ@áß@LÙ¶q‰÷çu)ï ÒÙ ™¨#F/hë#7DƒÜ^kIpº§àbÞ™a/SêÁ@,§9-묌¨ð¿&p/ö`Ç[:*اïlhºÜUœ¾eºupnÑ¡’ÍjîjÊî‰AÎ[ì mSkŒÃþuâ¡QPOìD Õ êRjÑà¼ÿjÑu׺^{9BN¢N&²ïn÷ñ!è ˜µå<³pkNTF¤ÿ˜–g)Ü 90¼]RÝÒ“{éÛì ã “Æ M:7lìè°Ã¬£'º/ χÇ0E†qõDÄVn´æœ‰É,ÄT݈éDg’0ÇÓ)œtɾ»ÿà·—¯Å••ÓVU‡MU§ñšë¬^7è¢:]¹¡êtÂ)_ó(8hÑ$TÄå$|âcÆl&¥0Áô:¡ù²HI ‘ž´JÝU ÂÌKUæ(˜é>WÝ(åÅ DøØ-4ò=šŽ©Ú•"Yè+¸(ÞnÆiUöE‹Ú/²NÆ£N~¯ݧ{TÆ=š »q¼MŒ~/"ôšU“k'CÍü£Þ“ U•X]}D; 'Ÿ€’¤o÷5¦‹#EÉÒµû(0ÄxÛô/¢(¥uÌ]³ìöµËÃRèz͘Iï4$ƒýàø™u1²ˆì¸¢Y±ô€ÖΉ÷cÃqpÓ"¹y°w¼Q‹@ )œéGwªíÏåSÜ.ÃEf8gHD¿‰y°4ÅJïÊ•ýÔÌ$)E$ª¶j®Ê©L059¡ëý[û2[ŽßS·ºýBÈúÒ‘‘J¦éÔ®Ø= ×9\I”ã~f$qŽrvlwñ&ÕËÊù)nÏ"á«÷¢·ùÐÊ­ûÔ²°‡[+GÂ4÷P•RƒÓª-ö¬ÃÓtJ›n—°º?Šø!¸]Àg–§ÎéFQÚı÷D0ý*Û˜Õ¡‡ã¬$h0ñPDAŠ€"ú~­m`Áô£qåÀ•¨áT…+ì®yjkÛØrÃÁŒ«µfôw{«´}­§]Íÿn“ù€®TÑ·é÷ ’£ÝZ{£p´y¦>ön;÷W¸ó ›,Ý9£íîJ½œhë&»-âvížÏŒY éÕ^CS³Q}æ(÷«ƒß§C³^j—ÇÆkv/ÖðeU;TX©Œ»ˆß¯gçÏQo'¿¸oÚkõ”úRðÝËÓ,ThO7Ýé‡J2ú1zX%UÇúW_QkåÊ3{·tÕGJ WÑ@g” Ãü­ÎÈÔhç×Zñ5ohØÉ^ µà"o·ÒKóm–n/ò¨$ùv“_ËòúE©7ÇÑB…1ÆáO:7ž#¡òW:zùi®o.e 5©¸&³ ³"ØFÏ$ae÷`¼@:~* O0c8ÅãEqi|obÓT¥´–nϺ®q§[•áo¦‡WpG¾XS6Åý2Öºo½®ÌŠ@x:>Cr±Ðú…&sç-=àÏje’nͬªk㟟ÎVÚºKL–!ôÓ(+Z¼S=uœ±â>žXi¨¬ÌÊ€w’Tmg­& ¡sUbŠ•Q¨­UNÂ[\ð,„×$´D:½'QÕ2Gà5-7½»ŸŒ2# f“_æ8úŠˆúF÷`t¹6§(§JÇP Góïî$Ðh/îæ“Ô¶|Íœ®Ó™ö=w^ó24èŠÅ~ìÍ€£-{Í››ÂÚÅ¿1f-Võ#aåë&cå—ÜÚ•OèJ ×7àa‚3¨ñ=ð ž[`-¼‚÷ÓËxÒ  Ï Â{ÊXk×ÀÂ=mଠœu`4L-}Ö ö‚â¹ÁÑjÈk0ßÀü)@‰Œ=­°‡¯ ŸzL‰øüà5À»€eA)e¥ëÆ÷\Ñÿ(ÍI¥;9Õ!q J’†ˆ÷8'™@$þ¯â’ 8 ©m‘È2îדoÞ¢+€Aó„ÃÌñùÍydäå®@{ ì@S·ŽD 8« Uã@c$2¨d}1¯x&·ŠkQ¼ôy’¥Á!{Äm %î%ó–•±™ŽmÏqrêŒÒ=»š…YÇΑ*§¨²rVºIH²?6tÕc•ñ”ê½f.ÖëpÍkË)MɈÁûàU¬Èâ;H)á8åx‰Ö %ÐEÔègA ¸ké‘lÑÚ M Ö¸Ì!Z<‹“s¨ƒdyvOâ4åîI Å„%låÍ;±Ô̸ãSWîÄ1ª‚´¤80dó$œ³ªî0M¨WÛ:@ØA«“†U¤x‰mVÓføt__ñ $ÉmÜO–Wê_Y¹itnZäé/üve6ÂN^Žæ,ÎnÃÎËlêcÝ8Òì#º²¾¸ŸœÿI½lAç•À¨ÒÇõ^±^pwÃÑsŒY8¬YèrÜ+p’mS¦]ª:Fß_ ÿ HÞ¼òð®pa=/=ÊEÑ=r|}Œît²å Q?¥KNRBÙ£8Ó2 0è䃰zׯé'ÝJñÝ;ž[Àà 2¼µw6„Î7}ï°òÍ M™NE vŒ}öÂ8§1Ë7(aŠÌþ‘Ï­RâÕîü-Å[eÄß)™9X±(•¨6GÕ,/a]~óþ«¥` Ê3e«¦T<®¯ÕO÷ãÆ^Ý©!ýì‹n½*14žQ´' × Ø>1c 7NP¹1˜ $ˆ^ ì)¼§àçxÝjÉýÁ‰$N™¼ŒT$N'!&Á Ä@ЦxN |ÓÀÜðê8#%ç‡ã. ºÆ;Ç*s${N7§άw›“¸†ùè¶É‘Ýã–ãóºG€¯ož’HéÄk )Öâ3óÔ=x ¼;¦ÀºaÙ†O C¶±ø:¦7F3G/bi2 )˜¦QQ=´V|êÈCjø>Ûs1ßáÐK…3¨9sÃ<‘Ã{9góD|eÿ'ë¬KMÿ¾OJ“éÎJÐòã×ßZ”¯~U7õëKP ÞGãt3½Æ„u4ÝqngRW×JñK[šîØ­û Çæ8¯Œ'blìד¬û•+3Ó©ë£W1çm{ìfãíJŸ3À{FxÏL½=Úª~ z…£ÍŒêþ“ð»K”hå ?£{oõÚƒÞcñÈÒîYvŒòîËÜÎ ƒêN¿ÛÖôïÜÚó:,÷4=e4…À\bƒkÏ”²(£¤+x1 áÑð,•:VNð¢6”¢»µ+o"9 Uw4§G‡4!S íŠò‹¤„8|yù6h endstream endobj 8906 0 obj 8036 endobj 8910 0 obj [649 /XYZ 32.1599999 649.939999 0] endobj 8911 0 obj [649 /XYZ 33.1199999 648.019999 0] endobj 8909 0 obj << /Type /Page /Parent 2 0 R /Contents 8912 0 R /Resources 8914 0 R /Annots 8915 0 R /MediaBox [0 0 595 842] >> endobj 8914 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F9 9 0 R /F8 8 0 R /F86 86 0 R >> /XObject << >> >> endobj 8915 0 obj [ ] endobj 8912 0 obj << /Length 8913 0 R /Filter /FlateDecode >> stream xœí]Ko举÷¯Ð9ÀhDRÔÌø ‡ÆÈ!È!˜Í&Xdqö¿©Å–mQ_I*•(u›6àn7[d±Þ¬"‹ŸÿøíïÉ?K>ß}ûOòݽÞ};eiVdÝOÒþ~zû®R£»·eeS]·?É÷§—äåôtzjþ¾œTq~н4—!ºûþëés7ø©ûäÛÝŸ›wÿKtò§æ¿_’¿þ­yùÉõ×~áÇ©ª‹öÍ¿»7J+]5ÿ¼}×6þëô—ß%¿6 Tç~Û¿ŸÊªTY©WÁñÒ?ªÎ¿oEƒeI]™ªÊ¥t§mÐñßœ~nzëÁH«B—¹Íê ¾Ÿ3Ró·J•I]‰®­77ßy]©•åJ)‘ŽÎ©uSSY^Ò]5hw?ðýœªvæ4„Ïò†—è¦ÃZ+[´Dn;ÏL÷:Üáµ\M¢¾«µY!ZŸ!Rë¦æh»’ ‚­‹nÂÆ¬ÆÝ¥«µ•2”¡fÝv²jj"À®$ˆP)ÓMXåk§Üwµ¶£Z Q³…H­›Ú…°+"ØÌ‰¾-Wθïi-êlVȘ°3DjÕÌ `OPV é¢×®Öv¤ßG¤£"]äwõ$â,êWgñ…xðëóéó£ÊMÕúÆÏ?·”oí^ž›éÚäSë¡4~ßóOÉï³Lßý!yþåT§¶6¥í<ò®E•°¥@-¶è¯¨%ûŸ°e|ö–Ýà [–Ïæò0-Má39¦O½|¦™-ËqiŠç#Ë!µ1ÞàL ¨e9C ʽ˜Cî ã ·`}€eâÀ5æx››éÃs£ï·ÖÞu³¾ŒÚ{ÙŒÚûÚ›¡ í€!À¼!  f`kHB²0µ1v8¸NëÌ‚q¸W}*\ÆV›âªmµfØý¹/”¶ºàÆVgÑ~ Ñ~8ûaíUÛŽœíÏ}Ñ~„³q­GJÖþk=Y>ÀT`ÈÂè0V¢Ì¯ÛJpt¦ðî1¼h%Ä­DÌ1ðÖŸB@H=dž†Zçì¯]œˆqMðÖñ·¶ve@Mð(Ç+axf8šæ ã-ÔæF½‚ŽX{‹Ú6lÑ[ˆÞÂ1¼Yãì®]ˆŽe{\§ ¸ÞÍ3¥oÔ‚r)Läf0vpäûiq½Ì‚Þÿ%p€qÍñÊ1Þ8±\lÁdWp àè[FìSv½+»WTÛåRŸCdp¬}wÈÑ;Þ!pÍ€Àp`Ã:‘£{9²€½`Ür|É ãKu£¾‘¾Öë p¸/úRÒ¾TŒÄܼ×(«]„}Ù ÁUjØ´/æBøÞa)£÷ó`ŒˆUô~¢÷s ï'æB˜–E4rd-t•^Ô7j§š0⿜83' ” ‰vêZu'ŠxhîÝ]‡ÀE)d=‹<«®¼öp²žŒ¨N\ƒEÛ6Ë¿]FíýùzwM-ØmY°˜¯<;›/•ë!•…-´}ËFSVù–ipštì«Å WÕy|J§ùõð«Dù囯ÆËÏ §C laKGË"Õªš ’‡Ç!¶t÷M®Ô;rmDÜ‚Ñ7d5OÁkøÓÃÀ×"aˆ¼yz b¦‚HPÚæa>Stô¬ÒªÎÞ‹»ÓWÊ^Ð7ÔæcÝwšL©ÔæE;!‚˜8ú ¿êtj5HYÌŸ¸7ý ¡¾<¶öªÇ…kK#R«Á4TÙ¤LxÌyçNl1yb hs;œ?v…°ã‹†ûD,õ‰[b‘a¶æ®"r—sóƬ©Üu¿¯ìb÷^‘õeø‰ãÆ‚øŠº÷ª9C£ªtè€9T™Ôäï5²2ÎŒ¸GÞ´< gIU–ùYõcœÑ/Óö²€rLáóÑB­=ôÜ!˜ÔE8|£ 1<0Ñý‚3HŠ9ìl¿NÐæRÊgÉ:ã{Ž þ*6–ØãÝÆ›ó¼ï +žžö”à,<’GˆÏ5«F}xZÐ;&üfYÔ›èüe¿²å€Æ‘ù„dádÁÀú¼%™ˆ0-X‡,_¶ÊˆÖ@Sëº- €± @`3‡½æë2qÁ‰ö@æ‘ô;i3Ûï”p„[ǺɬÜ'¤n¬7±ýŠ„ÉÌ{0Ç‚7j%ýÕék°D‡{@§”À‰g¾ N–,%Ò`WI.oC[Tk5´EWIY›€Q°Â)Y"ÚAØŠÈ̲p£7wœÜº\«IŽ\ã7ñ/çèñÝùâV¼²êI,n6½ÛôeÄsœ5ÇÙy¼±nÄYs‚Ý·4ïß"»©S8\Â)+ˆ÷Up6…ÊÃÜ‚¯ÃHm_ÎËL¨ èQj¥¥VÁ‚i_*œ'\þk®<œ4å}iQ‚—G 8š4JS´!màþ’nD‰bTœB~ úÇ1!uZ_âð8¸â -”xk’å!d×H9VÙR޾Å|Í8ÞHè'Ù¢¡Œ£poœ2¹„=dØVQ1\¤–1Ÿë,b'K9Xæà|‚Z°¾LaÁd‹3ÊÒÜš5 eÁ . Î(éÅñÆ‚•T•åQш«¬ö¶®ø@;§À7G«Š^Ô¶?ÕÞý–\¬! ŒàÙ1lmÔÑQ{sµ7§ì5æQN!™PRr9„qE«ÐTâE¸ªoû‚ZXÛá‹>¯âŠô¨‰Ãfèæ\zÎ(å¿?'Fmw\m7qÚ˾–€ç³œiôºùǿܦ¬±ÍåÝù÷±:xà{4q˜ ŽãOcûƒÉeñ~F#šÌ…O35ØLˆ[Ö”YZrzˆqpÒ?~Â9m²¢¸Ð­ìt[qþ äÖ·BO/QãÖ·#´p\&Sd¢”# ¼è u¬e #ÆI“c‡…µ´ŸJT†Ñùô‚*¦ŽÐÂZPq´Ã5åÃÈLQNóeÜHw€–¸‘n† ÜZ‰ðx8Å97æÅd+uŸsÀ°sQ]Â1Íwì–˜æ‹i>® ¶óNjÔvev)æF膗Äñ^ˆ$–t Ö(œ;­v×Ѳ›ªY6±-•tÜçÞ¨78[9ÜËŠ§qøZV~8>±hPV9PcKi…ÒY>A)¥ñ'¥½$8Å#c^q§ýÉåóŠ2åoc1¦'œÂf<íÜÄ4âZb‘·dŒÉÂIPL/ cì-1 Ã`8ˆa°)mWM× ‹µŽÐk Ü^má`¤¨N#öõc*0.Y'‚wŒó!ugMWnÛÿtÄ­éÁ#o‘‰çtÄý´«ÔxëŠlªïFµ÷Ø3¡µ½ì{tN¯Òò¢Ë¥X9…PWZÖý¯[ð9÷TâÑBë N1yW,©Û¹ ®ñ¶Y>½þ3x!š°ŽžŠ´ñCD܈qúT¶ª±%Û.l¡[8?Ö ÜPØÁôáø‹S8ØÜ~Û¬®ÞOz‡ÅCÇè^…1õV™þ 5¾Ôp“Cº lä‚kƒYw^b‹ËÉi¯¸©Ê»Å»^Ä¿—ªC}{7z7¯9¨¸&‚®Ø%a¼ëfDnª[pIå!|9UÍØÒw/ %î^8Ä!hFÖ.ÄVÆiI×ÙŒ¬]¼3ä-ñÎ2RRftÌÖ\G KfpÁ…@” ÊËùô-7qׯZ>Îá%ƒ¥éš=½0ò\Lßðrk‡‰<$Öå°…€šÁœ¸¬Nû8z#zäI0±W—‘ !ô Öë_¤4äDLß(û…8èŠã•ÞÕÍ;fÞ­É/Çw+Éê"ó5gÚd‚³ø«8<½âÀšhh›ÈÖx_=ÞÑG¿FræÃ1ÐÛœAó›¼4ê¦Ñ&mîåûBÿøŠ+{U\O¤ê"ÖâE¢š‰Žh=S«"=3ebúÐ¥« Ui1äWgvóÔC^Ç„ºLË!=;R”#-)ŒIu]Œ%<­M‹Žs†4§‚ÏÔð™ÎP–:Õ™yŸ»û {ë¸þí'÷ð».ÿ52ÃGôŒͱ…æá ògÅ–ÌÝÁv€\×¾×Võûù µË¶ˆð3.|»ŒC0÷Bªc̺c@~À°aÚÜ {Ó;wÝ# V¾”ˆÎLŒÃJ#!% *¿­ ±B²ª*+RÕ:$ƒÊÑy›cÀ¾)jú$ié’§Óÿ"+“ endstream endobj 8913 0 obj 3309 endobj 8916 0 obj << /Type /Page /Parent 2 0 R /Contents 8917 0 R /Resources 8919 0 R /Annots 8920 0 R /MediaBox [0 0 595 842] >> endobj 8919 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8920 0 obj [ ] endobj 8917 0 obj << /Length 8918 0 R /Filter /FlateDecode >> stream xœí]Koã6¾ûWè\`µ$E‘Ph²»z(l€ŠŠí E·hÚCÿ~%KrbIßÐÑíp³ˆÓ̓3œùøÐÛo>þTüöoñöþãßŧáõþãN”ˆþ_Ñý¼yùre¥ú·ÖÕ¥jºŧϻ§âi÷°{h?í¤Ù_8¼´ã-z‚ÿ~úk÷¶¿ù®ÿäãýwí»ÿ U|ÛþõGñÃíËÏ½î Ÿw®1Ý›?û7RIåÚ?^¾ëß}ÿEñWË‚ÛÓí~¿±Îu,¯âãép©Üÿ¼¼ÝL«uû^JÕþª[uüóËî×–Ú3-Q6JÖÆeÛ÷NTýŸ'Ñ·j¼AcM!1%?—òDRk Õ® Ch¯½u¢I¡-I*„ŒÕ½ÀR¯ù@j-!ëlBGrh£ ©FpÝK#H­%ÔþC¨ã( ©F0Š@Fx&µ–tUBGaŒ€I…0‚j¿ÈRk UN†!ÔqÈT#hcöÛÙ°®Ä#¥Õª«u tÉU’&@”BX µo Œ”V+Ί@è8 cD)„¬ëõVÛÕŠs,àt˜¡}Ï‘\%Ùh)¥‡ õ‹z®_žˆ ïwo?H]¹®\{üµ3{wÓþå±¶.ÞtésU?_ ¡¿þªxüc×”uSÙº/ûéP‹x[ÞAjµèÜ¢î׈8–È;x nÁÔl‘!¹V ¼Ï†F±ÿà»oyÿØF‹Ç€Zy=°Â= ê Ç is ˆ*¨ÑX}™à-R¯"8¨Îp|‚–S0QÞ‡ð`hS¬L sMd Xµh’n>’ꈣ„•+851¼-èâ®t0ªž ½Ôò>”G€Z1}Ô¦5õ„™¾ÅÍ$zþ ¯Î¥*õ²¯.¨e±.+åäÑý$¾¦ï§z¼Í‹–¶˜ ³sqîâfVø3ç<ƒ™BK^¥K´aWé×àìWŒÙ¡hy8GÌnaàyœ‘¶òÍƉªÊ_#d<"…–ŒG¤]=d<Âktí5yÝZ-yÝZÄZœQnlWYì­ÙŠÕ{Éb͈Åd¤;í–׃toÓ2ž2 yðl'Ç%IÁ³e5¢½ÏÔú}¸@å€ó 7w‡Ö¯7*i=uwGC__2ûTIX1ûFøË¾\¥В{*q¸9àžãsf#Òƒ$6M6Ê_"Ä*«sºZð),üËY´Œ½‰µ³6ݲH@úœ ,ƒ˜@w£ýŠm}sŠxLÄÜ Lƒá¸ïƒõÆÉÆ¢Fã?žŒÐ"g gc[ŸàÀWø¸ØBp½ùá!œHœ4ÊX\À‚eÇ ajD&ÂðV%Ëñ¼ê÷Î!dÄÈòu¨Iƒ¯FHsÜÅ€ÔQsSÍ- «‚Û÷S*é&²ªÓo|È7¾8kD=‰˜R”ÆîezŽqc_rÏâ–°9Gr1&Ét²Ç`©Sn<‚K-)¨FŠ|>ñu´d•üèÛïÆ¥ã˜$`R#•¿ÐÈ'\¦Ð¶È§;2£P¤“ÝXÓE‘Î&e­äìó`œÌù£Æ[í?Qø:WÞÜZ$Np »Gû*ûÛ«ËãÄ'ã÷gΤî2öëÜZ¬‰6mŽÀH–KÀk9%R\–]Þf„ ä „ÏqlZÚ¥ ×=p¹’ú؈K¨5Dº‰uÇ|l+íŽE»°=_l ¡hb¥ð ×Sª³ûÎcêp½3¨c,œ±z¶¬9 @½þ¢+ê)´d@JÂê˜k ¦U ¶%ÅiH¬‡ép޹æ¬âÁi<‡hÇ9N""ÌVN ü8·<$ñ5.‚ÙÎÙ´} GÄ€ ¾l9ߥó$Ý|íi¬µw„"=ª.ê(Qù1CÈÀxœB ’¨ ‚Z.窼\5ì÷¶‡œkjÿ#L^,›r´KƒØÞr)g¤9Þ&o{ŶÏ;·ï×Ù·Cî±óL‰i©ŽfiŠ¢gsižcºÅƒ˜=Ã-}ö±4]s7%y)ËZ›£Y¯9XÐHg­Ç};ÃÜçß³0e žfscpl(û±žÎ;?hvãÙ>˜ o³ÓvÄqAŒ]5D‹¢’1éÈâ>™cžbÎiêfv‘qì\OÐùêUÎin`xLL¡–'<÷¤ û¬s *Œ‘oø}¤^Å©%Ïø26¡`j„Ÿâ}ýx4ì#<`Åz ûû°:Ø~, $UçÖv¬sYË8añJ™€ËLJhO™iÄXfâ2l–ÍŸS¿ÌʱÓW|£Â‰u\ím/BÕXrm‘oœ>Ìû 䨚.期1? –Õ˜]yuÓ+zá@•!ðÙÑëUÌLàÿàFîNfä|{^0U¶šD2,c‚Ág8žséAÃ?üéqà1µàáì΋SR(î$^úÌ)Ô8K…9G™1 µ‹ôÑ8hýð Ç&œ¢)Vº½7¥¼W{Ëm?E’áÀ¿œ#92XÃ‰ÞØ¦Œgàn¯Î>jÂ}Oá½<ðb«ð‚ŸÎ3çö_!±æ0?*~þPžB2-+ý51w?»æòjVÆœŽÌœs,$.t8EËéò± “$6Ö:é¯Qˆ“àù±P,ÒAÌ×Ùš€Â §7·\ä<èòã…³Õ±:–ÀÁ÷Ó`ÆxðöÇZÖ;: FµN‡H‰ÈŠãçlíŽwI׃à{³·?ÅSkßÖ|݆—OŸ ƒÏ{Šxî)d_!/õ;”)d+ÆzÚHSöpo%GŸô¾bLi–ñF—3ýö6Q¶´Ëا]hémRU¥jÌÒ”S]—¦7´7.ÝÇÁkxÍ€¾«R‰êØ©î µ¾·¿üäüî†$ü€®¢ÎR‹Dr ©Úy× ;Gö·½¬èuÝ{UK{.–î§Ïïøšá|¡ózî½ÐêX³Ã¸±Äì˜7l[¢÷Bj j‡è]ï˹—•ß™¸‡è„—0¬,ïƒx–s”²›Á›¸ ŽãÚzè|Ãhp¤+vÿ;ú a endstream endobj 8918 0 obj 2692 endobj 8921 0 obj << /Type /Page /Parent 2 0 R /Contents 8922 0 R /Resources 8924 0 R /Annots 8925 0 R /MediaBox [0 0 595 842] >> endobj 8924 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F1438 1438 0 R /F8 8 0 R /F9 9 0 R /F86 86 0 R >> /XObject << >> >> endobj 8925 0 obj [ ] endobj 8922 0 obj << /Length 8923 0 R /Filter /FlateDecode >> stream xœí]Ioã6¾ûWè\`. (Ð$“= ‡AE¦ÓbÐ4Cÿ~©²=–>J¦žÙÈÓ||ûÂÍW?=ü^ýù¥ººyø§z ¯7V3ÅüOÕý¾ÙC˜Z ÿ¨M[ ÛýTOŸ6ÏÕóæ~sïþ>o¸zé^\c?„øåéóæÊ¾ñï<Üüâžþ«Dõ³ûïcõî7÷ò>Àë>ðic¬êþö\paÜ?ûO]ã_›_¿«>;Ì Üîïml+Ýg–àñ¼íÊ_~÷»¢ÁXe²Ž œ ‡gëžþýcóÁAÛÁbµ¼UF íž “þßYðµè°ZUz}HäRCù\Ch°€}ØÝñÒŽðàúööÑÙßÉ­ÉyÑ)]f:û@ê˜8žW²X`’5qF)9,l›;ƒXÓj­¥G¼nÁòÁ`›³ÇS‘'‚ô·¾¥Ðƒ±–ÇcÍ4•WE.µaKÕLˆ¯ÈfGkx£6–)Ñîs¶Ššºñ ¢Ev‚¢VõîÖ‹‘ËÚåÜá¹CÓ k6‰=àÂð I¼;ø(ó^°‰ƒˆ° iÁм/j{N 4-‚tˆZºVšýUßs¤˵°Åk’ª…çÀ,d|¼F|äd¶1™CiΦ+ì±""Žƒ°%âÿpþ}ó¥eW´9ŽO‘ºb€ã`Ržr–úF£gX­(•Ïy´”Ê'MCJå•O©|¨+núÊ'8ÿ±j–3Aˆc}ë(~“©ò|ºò "ÃçŸZJIÈKÑ€‘m3æBÍX›À¶ýŒ€Ø»àX"qä ¸á(½åëç.)9Eƒ+5çÔ8Î¥ä! ±>%nGx€yM&✲GS"·Б ½¤Øx‹ ñ·pœ»LAR¶z:HbŸ>˜-Kˆ§=·Y¹ǬAôôÅÈãx‡ÇƒôE".Ä þBsΉ5|†¯/«ô«Žw²%Í*¾•¯žëF”|oMù^’–¿:w"Yݔ͜>×iÌt®Ìt$ìãeÍHjú±¸Å3%2-_’È4¹è›v-‡å8d8˜¿Vò–å½Õ%oYSKÉ[N¢å¦ä-%o¹è¼E5òkc‹åƒO¦à ˜©Óç-JOç-8;$#ƒuR|dŠïJñ6—+“–Ó1´„mÔ™â8ã+'!½¾¾e>º8Ö'ã6ð&í,eó]„¿%+.Þ!΃Lú–ÓÎ쌃/W7é[|ÆZ6ñ_šm&ÙY‚/X`ÊFyŒuÊvkR݉T…)xÂ$xÊö=‰ÿàCF)•>äud?öMFÏ5ãðOYY÷È¥egzd/ׂŽÝ.YÝØQ›|‹N‘K2ð7lÎ1—2Åv`©ù§Ø„OÇyÝ6ª;3‡b,ÈÉ‹ "” ¥4T“|††Í8™³æ œRª\`À_±¾}S††™wœezvž~£x+˽#ç{ïˆáLOÛf™z(S9}ÍyZm¦©ÃU¿Ûà¦"g’!ö“(~‚Û¶·®Ë˜ƒ8‡;8®P–Æ&ð]˜kƒy™×žÐxõ -9%‚5ß<³ûõsΙ)Ñ”ÚsM-%´R ñÈ‘qR0€Ö±’)ïÍÎËêN_Ô¼û†ÆƒÎ1D;l.!ÚFºê~ó?Ú˜|U endstream endobj 8923 0 obj 2099 endobj 8927 0 obj [652 /XYZ 32.1599999 699.859999 0] endobj 8928 0 obj [652 /XYZ 33.1199999 697.939999 0] endobj 8929 0 obj << /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_nspace 4443 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_typemaps 6095 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_foobargo_class 4609 0 R /__WKANCHOR_1b0 6414 0 R /__WKANCHOR_1b2 6416 0 R /__WKANCHOR_1b4 6482 0 R /__WKANCHOR_1b6 6483 0 R /__WKANCHOR_1b8 6484 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_anonymous_enums 4951 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_chosen_unignore 1936 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_allprotected 5215 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_testing 1511 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps 5304 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn2 2866 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn3 2937 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn4 2938 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn5 2946 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn6 2953 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn7 2954 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn8 2963 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn9 2975 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_examples 5557 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php 6718 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_initializer_lists 2481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn30 2292 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn33 2383 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn35 2401 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn38 2118 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn39 2119 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn2 3415 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_freearg_typemap_ 7869 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn40 2125 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn3 3434 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn41 2132 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn4 3443 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn42 2427 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn5 3444 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn6 3451 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn7 3465 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typecheck_typemaps 4403 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn8 3478 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn9 3486 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_basic_tour 4534 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting 1686 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn10 2151 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn11 2164 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn12 2165 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn15 2193 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn16 2194 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn17 2195 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_intro 3959 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn18 2205 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn19 2214 0 R /#90#b2#80K#dd#87#cf#7e#06#b9Y#8e#13#84#04#9f#28HWO 3222 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker 3232 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn20 2213 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn21 2228 0 R /#7fF#f5#5d!G7L#bf#8c#f00#e5#f5B2#28#a1#a3#7e 3093 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn24 2237 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn25 2243 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn27 2275 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn28 2276 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_date_marshalling 5515 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave 6288 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_stl 8296 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn2 1442 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn4 1444 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn5 1445 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn6 1494 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn7 1495 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn8 1496 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn9 1497 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absimport 7399 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_wrapper_split 7430 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11 2434 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_1 6798 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_2 6799 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps 8268 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_3 6794 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_4 6805 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6_5 6806 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functional_interface 5548 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_void_pointers 5481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_structs 8211 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variables 3074 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_class 6106 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_output_arguments 4619 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android 3957 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_collection 4351 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_source_code 5675 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn2 2056 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn3 2057 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn4 2116 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn5 2117 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn6 2135 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn2 2809 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn7 2142 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn3 2827 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn8 2144 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn4 2833 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nn9 2152 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn5 2835 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn6 2842 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn7 2854 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn8 2855 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_output 1805 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn9 2857 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_csharp 1606 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_pre_post_directors 4247 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_odds_ends 5538 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_generic 6391 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_class_code_typemaps 21 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_rename_ignore 1915 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_other_compilers 1642 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_stl 4024 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_swig_exe 1648 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_what_is_typemap 5319 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers 4976 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_runtime_type_checker_usage 3248 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_mingw_msys 1643 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_range_based_for_loop 2499 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_throws_typemap 7870 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn30 6276 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn31 6278 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_converting_java_string_arrays 5439 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_class_example 5657 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn10 6215 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn11 6225 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn12 6226 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn13 6227 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn10 1492 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn14 6228 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_nn11 1493 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn15 6229 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn16 6230 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_expanding_java_object 5456 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn17 6243 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn18 6244 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn19 6258 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_options 8152 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn20 6250 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn21 6251 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn22 6253 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn23 6254 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn24 6266 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_typemap_examples 4203 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn25 6267 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn1 4647 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn26 6269 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn2 4648 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn27 6280 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn3 4649 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn28 6282 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn4 4650 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn29 6283 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn5 4651 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn6 4685 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn7 4686 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn8 4687 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn9 4688 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_operator_overloading 7989 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overloaded_functions 5013 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorargout_typemap 7889 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_wrapper_reference 2592 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_structures 5890 0 R /#86#25#f6#d7#8e#8eQLKiwmH#f6#de#e8#dd!#01#bd 2593 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_directors 7187 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_test_suite 8878 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_matrices 8288 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn30 8809 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn3 3284 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn31 8817 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn4 3313 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn32 8818 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn5 3321 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorin_typemap 7890 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn6 3330 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn34 8829 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_nn7 3338 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn35 8836 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn36 8837 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn37 8838 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn38 8852 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_long_long_int 2555 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_planned_features 4464 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_gtk 5634 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn40 8866 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn41 8867 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn42 8869 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn43 8896 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn46 8911 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_string 2768 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn10 8715 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn11 8723 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn12 8730 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn13 8739 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn14 8740 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn15 8741 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn16 8749 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_class 4000 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn17 8750 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn18 8759 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn19 8760 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn20 8758 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn21 8768 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps 2864 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn22 8774 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn23 8781 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn24 8782 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn25 8790 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn26 8797 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn27 8798 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_features 4431 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_STL_Functors 7720 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn28 8810 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn29 8811 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_C_Iterators 7728 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_overhead 5180 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_struct_pointer_pointer 5488 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn70 7378 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn71 7379 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn72 7380 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn74 7444 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn75 7439 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn76 7454 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn77 7461 0 R /__WKANCHOR_9q 2482 0 R /__WKANCHOR_9s 2484 0 R /__WKANCHOR_9u 2485 0 R /__WKANCHOR_9w 2492 0 R /__WKANCHOR_9y 2504 0 R /__WKANCHOR_1o0 7807 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_using_module 8133 0 R /__WKANCHOR_1kq 7426 0 R /__WKANCHOR_1la 7478 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_known_issues 5609 0 R /__WKANCHOR_1o2 7809 0 R /__WKANCHOR_1ks 7427 0 R /__WKANCHOR_1lc 7479 0 R /__WKANCHOR_1o4 7812 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_javadoc_comments 5536 0 R /__WKANCHOR_1ku 7428 0 R /__WKANCHOR_1le 7480 0 R /__WKANCHOR_1o6 7824 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn53 7290 0 R /__WKANCHOR_1kw 7431 0 R /__WKANCHOR_1lg 7498 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn54 7291 0 R /__WKANCHOR_1o8 7825 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn55 7302 0 R /__WKANCHOR_1ky 7443 0 R /__WKANCHOR_1li 7500 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn56 7303 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn57 7298 0 R /__WKANCHOR_1lk 7502 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_class_extension 2284 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn58 7311 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn59 7312 0 R /__WKANCHOR_1lm 7505 0 R /__WKANCHOR_1lo 7507 0 R /__WKANCHOR_1lq 7497 0 R /__WKANCHOR_1ma 7647 0 R /__WKANCHOR_1ls 7546 0 R /__WKANCHOR_1mc 7648 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn60 7320 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn61 7327 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_heap_allocations 5295 0 R /__WKANCHOR_1lu 7547 0 R /__WKANCHOR_1me 7649 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn62 7335 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn63 7342 0 R /__WKANCHOR_1lw 7625 0 R /__WKANCHOR_1mg 7658 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn64 7352 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn65 7353 0 R /__WKANCHOR_1ly 7626 0 R /__WKANCHOR_1mi 7659 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn66 7354 0 R /K.#0f#0f#9a#5c#9b#14#17#17#1f#8b#13#a0M#f9i7#b0t 2502 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn67 7367 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn10 5770 0 R /__WKANCHOR_1mk 7669 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn68 7360 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn11 5778 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn69 7361 0 R /__WKANCHOR_1mm 7670 0 R /__WKANCHOR_1mo 7677 0 R /__WKANCHOR_1m0 7627 0 R /__WKANCHOR_1iq 7232 0 R /__WKANCHOR_1ja 7299 0 R /__WKANCHOR_1m2 7634 0 R /__WKANCHOR_1is 7239 0 R /__WKANCHOR_1jc 7300 0 R /__WKANCHOR_1m4 7635 0 R /__WKANCHOR_1iu 7246 0 R /__WKANCHOR_1je 7301 0 R /__WKANCHOR_1m6 7637 0 R /__WKANCHOR_1iw 7255 0 R /__WKANCHOR_1jg 7313 0 R /__WKANCHOR_1m8 7640 0 R /__WKANCHOR_1iy 7262 0 R /__WKANCHOR_1ji 7314 0 R /__WKANCHOR_1jk 7321 0 R /__WKANCHOR_1jm 7328 0 R /__WKANCHOR_1jo 7336 0 R /__WKANCHOR_90 2368 0 R /__WKANCHOR_1n0 7713 0 R /__WKANCHOR_5q 1937 0 R /__WKANCHOR_6a 2002 0 R /__WKANCHOR_1jq 7343 0 R /__WKANCHOR_1ka 7381 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_structure_data_members 1975 0 R /__WKANCHOR_92 2369 0 R /__WKANCHOR_1n2 7719 0 R /__WKANCHOR_5s 1946 0 R /__WKANCHOR_6c 2010 0 R /__WKANCHOR_1js 7349 0 R /__WKANCHOR_1kc 7374 0 R /__WKANCHOR_94 2380 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library 2669 0 R /__WKANCHOR_1n4 7727 0 R /__WKANCHOR_5u 1948 0 R /__WKANCHOR_6e 2011 0 R /__WKANCHOR_1ju 7350 0 R /__WKANCHOR_1ke 7388 0 R /__WKANCHOR_96 2382 0 R /__WKANCHOR_1n6 7735 0 R /__WKANCHOR_5w 1956 0 R /__WKANCHOR_6g 2012 0 R /__WKANCHOR_1jw 7351 0 R /__WKANCHOR_1kg 7390 0 R /__WKANCHOR_98 2394 0 R /__WKANCHOR_1n8 7736 0 R /__WKANCHOR_5y 1964 0 R /__WKANCHOR_6i 2021 0 R /__WKANCHOR_1jy 7366 0 R /__WKANCHOR_1ki 7400 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_carrays 2712 0 R /__WKANCHOR_6k 2030 0 R /__WKANCHOR_1kk 7407 0 R /__WKANCHOR_6m 2033 0 R /__WKANCHOR_1km 7415 0 R /__WKANCHOR_6o 2036 0 R /__WKANCHOR_1ko 7416 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_example_cpp_code 4574 0 R /__WKANCHOR_6q 2028 0 R /__WKANCHOR_7a 2112 0 R /__WKANCHOR_1oq 7861 0 R /__WKANCHOR_6s 2029 0 R /__WKANCHOR_7c 2114 0 R /__WKANCHOR_1os 7855 0 R /__WKANCHOR_6u 2046 0 R /__WKANCHOR_7e 2126 0 R /__WKANCHOR_1ou 7871 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_license 1447 0 R /__WKANCHOR_6w 2047 0 R /__WKANCHOR_7g 2133 0 R /__WKANCHOR_1ow 7872 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn50 6705 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_exceptions 2781 0 R /__WKANCHOR_6y 2048 0 R /__WKANCHOR_7i 2134 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn51 6706 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_generic 7734 0 R /__WKANCHOR_1oy 7874 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn52 6716 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_pointer#2dto#2dpointers 8278 0 R /__WKANCHOR_7k 2141 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_inoutparam 6089 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn53 6717 0 R /__WKANCHOR_7m 2143 0 R /__WKANCHOR_7o 2153 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_threading_facilities 2583 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_typemap 5413 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_pointers 8198 0 R /__WKANCHOR_7q 2154 0 R /__WKANCHOR_8a 2215 0 R /__WKANCHOR_7s 2161 0 R /__WKANCHOR_8c 2227 0 R /__WKANCHOR_7u 2162 0 R /__WKANCHOR_8e 2234 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_namespaces 5021 0 R /__WKANCHOR_7w 2166 0 R /__WKANCHOR_8g 2236 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_uniform_initialization 2493 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums 4974 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_name_comparison 4371 0 R /__WKANCHOR_7y 2180 0 R /__WKANCHOR_8i 2244 0 R /__WKANCHOR_8k 2251 0 R /__WKANCHOR_8m 2277 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance_mirroring 5090 0 R /__WKANCHOR_8o 2278 0 R /__WKANCHOR_8q 2285 0 R /__WKANCHOR_9a 2402 0 R /__WKANCHOR_1mq 7685 0 R /__WKANCHOR_1na 7737 0 R /__WKANCHOR_8s 2291 0 R /__WKANCHOR_9c 2415 0 R /__WKANCHOR_1ms 7692 0 R /__WKANCHOR_1nc 7740 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_unrestricted_unions 2534 0 R /__WKANCHOR_8u 2330 0 R /__WKANCHOR_9e 2416 0 R /__WKANCHOR_1mu 7699 0 R /__WKANCHOR_1ne 7748 0 R /__WKANCHOR_8w 2353 0 R /__WKANCHOR_9g 2426 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typeunsafe_enums_classes 5152 0 R /__WKANCHOR_1mw 7700 0 R /__WKANCHOR_1ng 7751 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn30 6615 0 R /__WKANCHOR_8y 2361 0 R /__WKANCHOR_9i 2428 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_nn2 6135 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn31 6616 0 R /__WKANCHOR_1my 7710 0 R /__WKANCHOR_1ni 7752 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn32 6623 0 R /__WKANCHOR_9k 2429 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn33 6624 0 R /__WKANCHOR_1nk 7761 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn34 6632 0 R /__WKANCHOR_9m 2431 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn35 6633 0 R /__WKANCHOR_1nm 7762 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn36 6634 0 R /__WKANCHOR_9o 2432 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn37 6643 0 R /__WKANCHOR_1no 7763 0 R /__WKANCHOR_50 1876 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn38 6651 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_module_initialization 8309 0 R /__WKANCHOR_1q 1554 0 R /__WKANCHOR_2a 1607 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn39 6652 0 R /__WKANCHOR_1nq 7774 0 R /__WKANCHOR_1oa 7834 0 R /__WKANCHOR_52 1877 0 R /__WKANCHOR_1s 1567 0 R /__WKANCHOR_2c 1609 0 R /__WKANCHOR_1ns 7782 0 R /__WKANCHOR_1oc 7835 0 R /__WKANCHOR_54 1884 0 R /__WKANCHOR_1u 1562 0 R /__WKANCHOR_2e 1596 0 R /__WKANCHOR_1nu 7783 0 R /__WKANCHOR_1oe 7849 0 R /__WKANCHOR_56 1885 0 R /__WKANCHOR_1w 1563 0 R /__WKANCHOR_2g 1598 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_operator_overloading 4473 0 R /__WKANCHOR_1nw 7797 0 R /__WKANCHOR_1og 7842 0 R /__WKANCHOR_58 1886 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn40 6654 0 R /__WKANCHOR_1y 1564 0 R /__WKANCHOR_2i 1599 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn41 6656 0 R /__WKANCHOR_1ny 7799 0 R /__WKANCHOR_1oi 7843 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn42 6671 0 R /__WKANCHOR_2k 1601 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn43 6668 0 R /__WKANCHOR_1ok 7844 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn44 6677 0 R /__WKANCHOR_2m 1604 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn45 6678 0 R /__WKANCHOR_1om 7858 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_building_alternatives 1667 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike 6846 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn46 6688 0 R /__WKANCHOR_2o 1650 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn47 6689 0 R /__WKANCHOR_1oo 7859 0 R /__WKANCHOR_60 1966 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn48 6697 0 R /__WKANCHOR_2q 1651 0 R /__WKANCHOR_3a 1669 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn49 6707 0 R /__WKANCHOR_62 1974 0 R /__WKANCHOR_2s 1652 0 R /__WKANCHOR_3c 1690 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp 5704 0 R /__WKANCHOR_64 1976 0 R /__WKANCHOR_2u 1638 0 R /__WKANCHOR_3e 1683 0 R /__WKANCHOR_66 1983 0 R /__WKANCHOR_2w 1640 0 R /__WKANCHOR_3g 1684 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua 5781 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_exceptions 4134 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn10 2736 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_coding_style_guidelines 8895 0 R /__WKANCHOR_68 1984 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Mzscheme 6134 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn10 6523 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn11 2738 0 R /__WKANCHOR_2y 1644 0 R /__WKANCHOR_3i 1685 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn11 6524 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn12 2748 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn12 6525 0 R /__WKANCHOR_3k 1707 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn13 6527 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn14 6514 0 R /__WKANCHOR_3m 1708 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn15 6516 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn16 2803 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn16 6517 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn17 2805 0 R /__WKANCHOR_3o 1716 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn17 6534 0 R /__WKANCHOR_70 2058 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn18 6535 0 R /__WKANCHOR_3q 1717 0 R /__WKANCHOR_4a 1816 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn19 6544 0 R /__WKANCHOR_72 2060 0 R /__WKANCHOR_3s 1728 0 R /__WKANCHOR_4c 1817 0 R /__WKANCHOR_74 2061 0 R /__WKANCHOR_3u 1732 0 R /__WKANCHOR_4e 1819 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_smart_pointers_shared_ptr 6392 0 R /__WKANCHOR_76 2113 0 R /__WKANCHOR_3w 1725 0 R /__WKANCHOR_4g 1826 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_introduction 3590 0 R /__WKANCHOR_78 2115 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn20 6551 0 R /__WKANCHOR_3y 1726 0 R /__WKANCHOR_4i 1834 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn21 6560 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn22 6561 0 R /__WKANCHOR_4k 1835 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn23 6569 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn24 6570 0 R /__WKANCHOR_4m 1844 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn10 1565 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn25 6576 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn11 1576 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn26 6583 0 R /__WKANCHOR_4o 1851 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn12 1577 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn27 6595 0 R /__WKANCHOR_80 2196 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn13 1579 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn28 6596 0 R /__WKANCHOR_4q 1853 0 R /__WKANCHOR_5a 1891 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn29 6606 0 R /__WKANCHOR_82 2197 0 R /__WKANCHOR_4s 1856 0 R /__WKANCHOR_5c 1898 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn30 7169 0 R /__WKANCHOR_84 2198 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn31 7177 0 R /__WKANCHOR_4u 1868 0 R /__WKANCHOR_5e 1905 0 R /__WKANCHOR_86 2206 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_special_variables 4398 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn33 7185 0 R /__WKANCHOR_4w 1864 0 R /__WKANCHOR_5g 1911 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn34 7195 0 R /__WKANCHOR_88 2212 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn30 8512 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn35 7197 0 R /__WKANCHOR_4y 1865 0 R /__WKANCHOR_5i 1912 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn31 8523 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn36 7198 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn32 8530 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn37 7207 0 R /__WKANCHOR_5k 1913 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn33 8542 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn38 7208 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn34 8549 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn39 7210 0 R /__WKANCHOR_5m 1923 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn35 8550 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management 5083 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn36 8559 0 R /__WKANCHOR_5o 1938 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn37 8566 0 R /__WKANCHOR_10 1480 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants 8174 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn38 8567 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn39 8579 0 R /__WKANCHOR_12 1484 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn40 7214 0 R /__WKANCHOR_14 1486 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn41 7205 0 R /__WKANCHOR_a 1358 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn42 7220 0 R /__WKANCHOR_16 1488 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn43 7233 0 R /__WKANCHOR_c 1360 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn44 7240 0 R /__WKANCHOR_18 1489 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_examples 5650 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn40 8578 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn45 7247 0 R /__WKANCHOR_e 1441 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn41 8586 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn46 7254 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn42 8594 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn47 7261 0 R /__WKANCHOR_g 1443 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn43 8595 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn48 7269 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn44 8602 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn49 7270 0 R /__WKANCHOR_i 1446 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn45 8608 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn46 8616 0 R /__WKANCHOR_k 1449 0 R /__WKANCHOR_20 1575 0 R /__WKANCHOR_m 1450 0 R /__WKANCHOR_22 1578 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_delimiters 2653 0 R /__WKANCHOR_o 1440 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn10 7025 0 R /__WKANCHOR_24 1580 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn11 7034 0 R /__WKANCHOR_q 1478 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn12 7031 0 R /__WKANCHOR_26 1582 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn13 7041 0 R /__WKANCHOR_s 1479 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn14 7042 0 R /__WKANCHOR_28 1583 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn10 8413 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn15 7043 0 R /__WKANCHOR_u 1482 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn11 8416 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn16 7045 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn12 8417 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn17 7055 0 R /__WKANCHOR_w 1485 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn13 8426 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn18 7064 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn14 8427 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn19 7071 0 R /__WKANCHOR_y 1487 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn15 8429 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn16 8437 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn17 8438 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_thread_local_storage 2560 0 R /__WKANCHOR_30 1645 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn18 8439 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn19 8449 0 R /__WKANCHOR_32 1647 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn20 7079 0 R /__WKANCHOR_34 1668 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn21 7086 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn22 7095 0 R /__WKANCHOR_36 1670 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn23 7092 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn24 7101 0 R /__WKANCHOR_38 1672 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn20 8458 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn25 7108 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn21 8470 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn26 7109 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn22 8477 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27 7117 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn23 8479 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn28 7133 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_regular_expressions 2597 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn24 8480 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn29 7134 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn25 8488 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn26 8495 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn27 8502 0 R /__WKANCHOR_40 1741 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn28 8503 0 R /__WKANCHOR_1a 1512 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn29 8513 0 R /__WKANCHOR_42 1742 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_exceptions 4448 0 R /__WKANCHOR_1c 1513 0 R /__WKANCHOR_44 1803 0 R /__WKANCHOR_1e 1527 0 R /__WKANCHOR_46 1804 0 R /__WKANCHOR_1g 1529 0 R /__WKANCHOR_48 1818 0 R /__WKANCHOR_1i 1530 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_faq 5530 0 R /__WKANCHOR_1k 1523 0 R /__WKANCHOR_1m 1550 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin 1665 0 R /__WKANCHOR_1o 1551 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_names 4531 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_interface_file 1671 0 R /#aa#ee#c1B#109#3f#bfP#3e#c8#d9#c7#92#bd#b4K#60#3cp 2506 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_importfrominit 7406 0 R /E#8fL#e0#d7#7c#a9#8b#26F#8bDn#b9#fd#5d#f5#1a#b6#0f 3028 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums_classes 5135 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typesafe_enums 4946 0 R /__WKANCHOR_2 10 0 R /__WKANCHOR_4 14 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab 8066 0 R /__WKANCHOR_6 1359 0 R /__WKANCHOR_8 1361 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_debugging_options 8897 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_null_pointer_constant 2526 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class_pragmas 5072 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn2 3743 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn3 3744 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn4 3765 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn5 3766 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn6 3767 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn7 3777 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn8 3778 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn9 3779 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_functions 8148 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nested_structs 2003 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_test_suite 4462 0 R /qn#ce#ea#a3#1b#20#99#7c#3dW#9e#17#f0Q#2c#a3#dd#8b#b8 2483 0 R /m#ff#1c#e5#de#dcd#0ev#197#b6#1c#dc#5c#96p#8f#8f#0e 2609 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_limitations 7147 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_Sections 1357 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_ret_typemap 7903 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_language_modules 1363 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn2 3614 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn3 3616 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn4 3644 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn5 3645 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn6 3646 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn7 3648 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn8 3654 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn9 3655 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_new_string_literals 2549 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_tcl 1646 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_custom_application_exception 4157 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_classes 5178 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_global_variables 8168 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_packages_classes 4924 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dpcall 16 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl 3683 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc1 7965 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_autodoc2 7987 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_swig_library 4112 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_warning_error 2666 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CONTENTS 22 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_jvm64 5315 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_ordinals 6109 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_shared_ptr 5035 0 R /#23#c9#7f#eb#03#a9#ca#d9b#07#23Z#9e7#0f#cd#86#cc#2f#19 8212 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections 1364 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_typemaps 5399 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn2 1525 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn3 1528 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml 6148 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pointers_refs_arrays 5001 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn4 1552 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn5 1553 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_commandline 6094 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn6 1555 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn7 1566 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn8 1568 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_nn9 1561 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_memory_management_objects 5509 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn10 1727 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn11 1729 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn12 1730 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_namespaces 2331 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_suppression 3495 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5 6415 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_symbolic_symbols 3533 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_classes 4547 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_catches 2370 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_python 1649 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_1 6819 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_2 6829 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_3 6830 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_4 6825 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_5 6836 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_6 6838 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3_7 6839 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction_build_system 1574 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nested_classes 2418 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_exceptions 6125 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_directors 4444 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_embedded_webkit 5623 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_hints 6123 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers 5037 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_ownership 3347 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_absrelimports 7389 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn2 6286 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn3 6323 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn4 6324 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn5 6326 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn6 6327 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn7 6335 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn10 5862 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn8 6336 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn11 5873 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn9 6337 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn12 5880 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn13 5881 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn14 5896 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn15 5905 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn16 5906 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn17 5913 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn18 5920 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn19 5934 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn20 5931 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn21 5940 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn22 5941 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn23 5950 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn24 5979 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn25 5980 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn26 5989 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn27 5967 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn29 5968 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_commandline 4065 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn30 5976 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn31 6004 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn32 6018 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn33 6020 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn34 6021 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn35 6022 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn36 6023 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn37 6032 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn38 6040 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enabling_directors 5169 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_classes 8218 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_executable 1597 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_release_notes 1490 0 R /#17#09#2f#d9#d95Z#bbEQ#90#b5#f5#ad#14#d2#b1V#e99 2512 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_running_swig 4495 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_helper_functions 5223 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_tuple_types 2574 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_cppinterface 6090 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_classes 4564 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_feature_autodoc3 7988 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features 3354 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_multithread_libraries 5119 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_attributes 5346 0 R /sq#b7#8b#aaX#cei#7fM#b1#1a#a1F#0d#2b#c2#fe#e9m 3337 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_in_typemap 7848 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_performance 5191 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_osx_installation 1510 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_templates 4561 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_commandline 4530 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_inheritance 4563 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_structures 4986 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_loading_module 8132 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_2_unicode 7470 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_limiting_renaming 1939 0 R /#40Yb#22#8em#c1Y#cd#fa#a6#8d#83#f1#aa#2b#db#de#b6#c8 2596 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_module_directive 23 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_classes 4993 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_flags 3363 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn2 2687 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn3 2688 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_binary_char 5287 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn4 2690 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn6 2719 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn7 2726 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn8 2735 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_nn9 2737 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_ref_unref 2395 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_advanced_renaming 1924 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_ruby 1639 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_globalin_typemap 7900 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn2 4266 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn3 4298 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn4 4299 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_overloaded_methods 2235 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn5 4300 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn6 4301 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn7 4302 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn8 4304 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_running_swig 4846 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn9 4305 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_method_access 5249 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_class 5074 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_primitive_type_mappings 5305 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface 1448 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemap_examples 4463 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs_nn10 3484 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn1 3588 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn2 3597 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile 4634 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn4 3606 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_typedef_reductions 3014 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn5 3608 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_properties 4239 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_nn6 3610 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_windows_installation 1481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_overview 4496 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn10 3546 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn11 3547 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn12 3549 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn13 3560 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn14 3561 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_getting_right_headers 4880 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn15 3574 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn16 3567 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn17 3568 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_implementation 4179 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_for_c_and_cpp 5375 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_generated_scripts 8328 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_examples 4494 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn2 6843 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn3 6845 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn4 6868 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn5 6869 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn6 6870 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn7 6872 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn8 6873 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_stl 8265 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn9 6889 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_non_primitive_typemaps 5318 0 R /#83#7b#e8#c5#3d#c4#072ls#13K#b4t#b3#b4#85#8aT#bb 4204 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn2 7481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn3 7482 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn4 7501 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn5 7503 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn6 7504 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_nn7 7506 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_external_docs 6151 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_1 6751 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1_3 6752 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_native_pointer_support 4468 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_primitive_types 8269 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_typemaps_arrays 8279 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_overloading 3247 0 R /#bf#13#c9#df#1c#ca#ec#e6#da#b1Q#e57#f2#3c4P#a79P 2362 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_exception 3287 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_configuration_files 8858 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes_gc 5107 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_preliminaries 4848 0 R /#bf#9cM#b0M#beuU#ff#1bq#ee#fd#17#3f#86#e0#05#c0#e4 4155 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping 8151 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compilation_problems_cpp 4896 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python 6883 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_introduction 4066 0 R /#87#2c#98t#14.#c0#ab#bc#a1#a0#03#e4#d0#26#18v#7c#7f#5d 8197 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_overloads 7161 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_check_typemap 7860 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_conception 6066 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_inheritance 8228 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_core_language_changes 2433 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_introduction 4372 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_default_arguments 5022 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ctype_imtype_dtype 4400 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_auto_ptr 2796 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_applications_webkit 5633 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_node_extensions 5610 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_sizeof 2582 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn2 6994 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn3 6995 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn4 6996 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn6 7006 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn7 7007 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn8 7016 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn9 7018 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_in_out_directorin_direcetorout 4407 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search_static 7432 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_imcall 12 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_swig 5593 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_out_typemap 7847 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_input_output_parameters 5262 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_modula3_overview 6067 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_dynamic_linking_problems 4899 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Copying_a_typemap 7827 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn10 2665 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_example_simple 3976 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_typemap_example 6116 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Varargs 3414 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_global_variables 4930 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_introduction 2430 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_class_extension 5226 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_other_resources 8325 0 R /_#cc#213#a9#ff2#e1#cd#d85#ba#5e#f7#9d#d9T#7f#e76 4113 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_warnings 3206 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_smart_pointers 2381 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_own_jni_functions 5546 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc2 7363 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_autodoc3 7375 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_overloading 8230 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_base_methods 4588 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_implementation 5666 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exceptions_from_directors 5188 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din 20 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_default_typemap 7862 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_starting_out 8821 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn2 1687 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn3 1688 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Placement_of_typemaps 7836 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn4 1689 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_importtype 18 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn5 1709 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn6 1710 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_constants 4548 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn7 1718 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn8 1719 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scripting_nn9 1731 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_fragments 3205 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_writing_typemaps 6008 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Typemap_scope 7826 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_typecheck_typemap 7846 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_visual_studio 1600 0 R /sB#f86K#a9#a9#cav#88#ea#2a#5c#b7U#c8#b3#16#15#ee 2528 0 R /g#08#7fK#d2_#3f#8f6e#aa#5bHz#83#c0#7e#97#1e#ed 8238 0 R /#23#d3#f1#ea#8f#db#96v#c0#c6vp#dd#28#9d#c5#05Z#80#f8 8326 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_cygwin_mingw 1641 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_pattern_matching 3006 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_preliminaries 8078 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_java 1602 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors 5170 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Introduction 1524 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_overview 5554 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_exception_handling 5241 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_equals_method 5482 0 R /#ba.Z#5c#b2#94#fenk#bc#ad#80p#bc#16#01#e7#ed#93#b5 2250 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass 5047 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_builtin_types 7136 0 R /#efjA#8d!u#87#8d#20#01#cb#c1#99#fa#12#ae#16#f1#0b#94 4132 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_din_dout_ddirectorin_ddirectorout 4409 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_default_args 3382 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_smart_pointers_shared_ptr 7738 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_exception_specifications 2371 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_inheritance 5003 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_null_pointers 5011 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_extern_template 2486 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_c_arrays 5279 0 R /#e2#8c#17#89#edj#e9G#15#c9#8d7#c4#a7#a4l4#ac#405 7429 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_default_args 7279 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples_cygwin 1666 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn2 3496 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn4 3522 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn5 3534 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn6 3535 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp 4029 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn7 3536 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn8 3551 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings_nn9 3543 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemaps_c_to_java_types 5325 0 R /#2f#2c#3d#c9#9b_1#2c#e9#87#bb#dcr#fa#0d#bf#f8q8#b2 2590 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn2 2631 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn3 2632 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_troubleshooting 5621 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn5 2644 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn6 2645 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn7 2646 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn8 2658 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_nn9 2652 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_commandline 4885 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_builder_mode 8315 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_memory_management_objects 4213 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_date_marshalling 4220 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn10 3673 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn11 3663 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn12 3664 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn13 3666 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn14 3667 0 R /__WKANCHOR_1yq 8879 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn15 3669 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn16 3684 0 R /__WKANCHOR_1ys 8898 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn17 3686 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache_nn18 3687 0 R /__WKANCHOR_1yu 8899 0 R /__WKANCHOR_1yw 8900 0 R /__WKANCHOR_1yy 8901 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_typemaps 4375 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varin_typemap 7879 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_basic_tour 4919 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_1 6753 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_2 6768 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_3 6769 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_4 6777 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_5 6778 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_6 6788 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2_7 6809 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_subclass 4587 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_directors 6699 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23MzScheme_simple 6136 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_enumerations 4546 0 R /__WKANCHOR_1w0 8585 0 R /__WKANCHOR_1sq 8239 0 R /__WKANCHOR_1ta 8295 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_performance 5559 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_compiling_dynamic 4884 0 R /__WKANCHOR_1w2 8592 0 R /__WKANCHOR_1ss 8248 0 R /__WKANCHOR_1tc 8310 0 R /__WKANCHOR_1w4 8593 0 R /__WKANCHOR_1su 8255 0 R /__WKANCHOR_1te 8311 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_memberin_typemap 7877 0 R /__WKANCHOR_1w6 8601 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_prerequisites 8894 0 R /__WKANCHOR_1sw 8256 0 R /__WKANCHOR_1tg 8312 0 R /__WKANCHOR_1w8 8609 0 R /__WKANCHOR_1sy 8270 0 R /__WKANCHOR_1ti 8313 0 R /__WKANCHOR_1tk 8327 0 R /__WKANCHOR_1tm 8329 0 R /__WKANCHOR_1to 8330 0 R /__WKANCHOR_1x0 8736 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn2 5713 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_examples 1605 0 R /__WKANCHOR_1tq 8321 0 R /__WKANCHOR_1ua 8411 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn3 5714 0 R /__WKANCHOR_1x2 8737 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn4 5716 0 R /__WKANCHOR_1ts 8323 0 R /__WKANCHOR_1uc 8414 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn5 5717 0 R /__WKANCHOR_1x4 8738 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn6 5747 0 R /__WKANCHOR_1tu 8343 0 R /__WKANCHOR_1ue 8418 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn7 5758 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_osx 5625 0 R /__WKANCHOR_1x6 8747 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn8 5760 0 R /__WKANCHOR_1tw 8344 0 R /__WKANCHOR_1ug 8428 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lisp_nn9 5771 0 R /__WKANCHOR_1x8 8748 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_attributes 2579 0 R /__WKANCHOR_1ty 8345 0 R /__WKANCHOR_1ui 8430 0 R /__WKANCHOR_1uk 8431 0 R /__WKANCHOR_1um 8440 0 R /__WKANCHOR_1uo 8442 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enum_classes 5136 0 R /__WKANCHOR_1u0 8396 0 R /__WKANCHOR_1qq 7981 0 R /__WKANCHOR_1ra 8067 0 R /__WKANCHOR_1u2 8395 0 R /__WKANCHOR_1qs 7998 0 R /__WKANCHOR_1rc 8075 0 R /__WKANCHOR_1u4 8405 0 R /__WKANCHOR_1qu 8006 0 R /__WKANCHOR_1re 8076 0 R /__WKANCHOR_1u6 8419 0 R /__WKANCHOR_1qw 8014 0 R /__WKANCHOR_1rg 8134 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn30 1949 0 R /__WKANCHOR_1u8 8420 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn2 3394 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn31 1957 0 R /__WKANCHOR_1qy 8017 0 R /__WKANCHOR_1ri 8135 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn3 3405 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn32 1965 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn4 3406 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn33 1967 0 R /__WKANCHOR_1rk 8136 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract_nn5 3416 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn34 1973 0 R /__WKANCHOR_1rm 8137 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn36 1986 0 R /__WKANCHOR_1ro 8153 0 R /__WKANCHOR_1v0 8481 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn39 2009 0 R /__WKANCHOR_1rq 8155 0 R /__WKANCHOR_1sa 8199 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxycode 5233 0 R /__WKANCHOR_1v2 8476 0 R /__WKANCHOR_1rs 8145 0 R /__WKANCHOR_1sc 8196 0 R /__WKANCHOR_1v4 8487 0 R /__WKANCHOR_1ru 8146 0 R /__WKANCHOR_1se 8209 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn10 2849 0 R /__WKANCHOR_1v6 8494 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments_nn11 2850 0 R /__WKANCHOR_1rw 8147 0 R /__WKANCHOR_1sg 8210 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn40 2013 0 R /__WKANCHOR_1v8 8501 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn41 2014 0 R /__WKANCHOR_1ry 8149 0 R /__WKANCHOR_1si 8219 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn42 2022 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn43 2031 0 R /__WKANCHOR_1sk 8229 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_overriding 4589 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn44 2032 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn45 2034 0 R /__WKANCHOR_1sm 8231 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn46 2035 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_integration 5607 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn47 2037 0 R /__WKANCHOR_1so 8241 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn48 2050 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn49 2045 0 R /__WKANCHOR_1wq 8697 0 R /__WKANCHOR_1xa 8761 0 R /__WKANCHOR_1ws 8713 0 R /__WKANCHOR_1xc 8756 0 R /__WKANCHOR_1wu 8714 0 R /__WKANCHOR_1xe 8757 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_enumerations 4947 0 R /__WKANCHOR_1ww 8722 0 R /__WKANCHOR_1xg 8767 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn10 1836 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn11 1837 0 R /__WKANCHOR_1wy 8729 0 R /__WKANCHOR_1xi 8775 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn12 1845 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes 8308 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn13 1852 0 R /__WKANCHOR_1xk 8783 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn14 1854 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn15 1855 0 R /__WKANCHOR_1xm 8784 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn16 1866 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn17 1867 0 R /__WKANCHOR_1xo 8791 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn18 1869 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn19 1878 0 R /__WKANCHOR_1xq 8799 0 R /__WKANCHOR_1ya 8839 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_typemap_examples 5414 0 R /__WKANCHOR_1xs 8800 0 R /__WKANCHOR_1yc 8840 0 R /__WKANCHOR_1xu 8806 0 R /__WKANCHOR_1ye 8851 0 R /__WKANCHOR_1xw 8807 0 R /__WKANCHOR_1yg 8859 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn20 1875 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_features_example 3392 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn21 1887 0 R /__WKANCHOR_1xy 8808 0 R /__WKANCHOR_1yi 8865 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn22 1888 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn23 1889 0 R /__WKANCHOR_1yk 8868 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn24 1890 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn25 1897 0 R /__WKANCHOR_1ym 8870 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn26 1904 0 R /__WKANCHOR_1yo 8880 0 R /__WKANCHOR_1y0 8819 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn29 1916 0 R /__WKANCHOR_1uq 8441 0 R /__WKANCHOR_1va 8504 0 R /__WKANCHOR_1y2 8820 0 R /__WKANCHOR_1us 8450 0 R /__WKANCHOR_1vc 8514 0 R /__WKANCHOR_1y4 8822 0 R /__WKANCHOR_1uu 8457 0 R /__WKANCHOR_1ve 8511 0 R /__WKANCHOR_1y6 8828 0 R /__WKANCHOR_1uw 8469 0 R /__WKANCHOR_1vg 8522 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23_1 7712 0 R /__WKANCHOR_1y8 8835 0 R /__WKANCHOR_1uy 8478 0 R /__WKANCHOR_1vi 8529 0 R /__WKANCHOR_1vk 8541 0 R /__WKANCHOR_1vm 8548 0 R /__WKANCHOR_1vo 8551 0 R /__WKANCHOR_1z0 8910 0 R /__WKANCHOR_1vq 8560 0 R /__WKANCHOR_1wa 8617 0 R /__WKANCHOR_1z2 8927 0 R /__WKANCHOR_1vs 8568 0 R /__WKANCHOR_1wc 8618 0 R /__WKANCHOR_1vu 8569 0 R /__WKANCHOR_1we 8635 0 R /__WKANCHOR_1vw 8576 0 R /__WKANCHOR_1wg 8630 0 R /__WKANCHOR_1vy 8577 0 R /__WKANCHOR_1wi 8633 0 R /__WKANCHOR_1wk 8686 0 R /__WKANCHOR_1wm 8689 0 R /__WKANCHOR_1wo 8690 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_preliminaries 6084 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_further_info 8928 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_outputs 4537 0 R /#8d#8c#eeX#e9#f0#7c#d1#8f#a1#13#23#ca#b2#e3#b4U#0d#ad#29 3038 0 R /__WKANCHOR_1p0 7875 0 R /__WKANCHOR_1p2 7876 0 R /__WKANCHOR_1p4 7880 0 R /__WKANCHOR_1p6 7892 0 R /__WKANCHOR_1p8 7887 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn10 3788 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn11 3789 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn12 3790 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn13 3791 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn14 3793 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn15 3794 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn16 3805 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn17 3813 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn18 3814 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn19 3822 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_interfaces 5153 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_remarks 6138 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_type_inference 2505 0 R /#b6#18k#3d#d6#e2M#a2mW#b2!#d9#d2#97#e22#e0u#5d 8324 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_static_assertions 2556 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn20 3833 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn21 3834 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn22 3835 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_adding_additional_code 4628 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn23 3836 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn24 3837 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemap_arrays 5986 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn25 3838 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_attributes 3094 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn26 3839 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn27 3840 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn28 3841 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn29 3860 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn30 3857 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn31 3871 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn32 3884 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn33 3885 0 R /__WKANCHOR_1s0 8165 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_enable 4572 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn34 3886 0 R /__WKANCHOR_1pa 7891 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn35 3887 0 R /__WKANCHOR_1s2 8166 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn36 3888 0 R /__WKANCHOR_1pc 7901 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn37 3890 0 R /__WKANCHOR_1s4 8176 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn38 3908 0 R /__WKANCHOR_1pe 7902 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn39 3909 0 R /__WKANCHOR_1s6 8177 0 R /__WKANCHOR_1pg 7905 0 R /__WKANCHOR_1s8 8190 0 R /__WKANCHOR_1pi 7908 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn51 3285 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn52 3275 0 R /__WKANCHOR_1pk 7899 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn40 3902 0 R /__WKANCHOR_1pm 7916 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn41 3903 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn42 3917 0 R /__WKANCHOR_1po 7917 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn43 3918 0 R /__WKANCHOR_1t0 8266 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn44 3919 0 R /__WKANCHOR_1pq 7918 0 R /__WKANCHOR_1qa 7969 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn45 3920 0 R /__WKANCHOR_1t2 8267 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn46 3936 0 R /__WKANCHOR_1ps 7929 0 R /__WKANCHOR_1qc 7971 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn47 3938 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_identifiers 8156 0 R /__WKANCHOR_1t4 8280 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn48 3939 0 R /__WKANCHOR_1pu 7930 0 R /__WKANCHOR_1qe 7972 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn49 3941 0 R /__WKANCHOR_1t6 8281 0 R /__WKANCHOR_1pw 7931 0 R /__WKANCHOR_1qg 7990 0 R /__WKANCHOR_1t8 8289 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter_states 5698 0 R /__WKANCHOR_1py 7938 0 R /__WKANCHOR_1qi 7991 0 R /__WKANCHOR_1qk 7992 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn50 3945 0 R /__WKANCHOR_1qm 7982 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_running_tests_examples 5592 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn51 3930 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn52 3932 0 R /__WKANCHOR_1qo 7986 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn53 3933 0 R /__WKANCHOR_1q0 7950 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Allegrocl_nn54 3953 0 R /#83#bc#87#1d#ac#e98#ac#dens#88#b3#ab#a55#92#1c#83#7e 8130 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constructor_helper_function 11 0 R /__WKANCHOR_1q2 7951 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_noexcept 2580 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java 4744 0 R /__WKANCHOR_1q4 7959 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums 4957 0 R /__WKANCHOR_1q6 7973 0 R /__WKANCHOR_1q8 7974 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn30 3119 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn31 3120 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn32 3121 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn33 3136 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn34 3139 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn35 3140 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn36 3150 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn37 3151 0 R /__WKANCHOR_1r0 8013 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn39 3153 0 R /__WKANCHOR_1r2 8031 0 R /__WKANCHOR_1r4 8044 0 R /__WKANCHOR_1r6 8054 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_code_templates 5681 0 R /__WKANCHOR_1r8 8069 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn40 3149 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn41 3169 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn43 3176 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn45 3233 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn47 3276 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn48 3267 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn2 1740 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn3 1802 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn5 1812 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn6 1813 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn7 1814 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn8 1815 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn9 1827 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_nn50 2049 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn10 2970 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn12 2987 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn13 2989 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn14 2996 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn15 2997 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn17 3005 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn19 3021 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn21 3058 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn22 3059 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn23 3067 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn25 3104 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn26 3105 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn27 3106 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn28 3108 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_nn29 3122 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_core_docs 1362 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_enums 8189 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays 4100 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_imports 6105 0 R /#f2#ff#e5#0eb#fa#0b#ddl!#fc#2a#de#8fn#0d#f3#b2#ebt 2527 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_adding_member_functions 1985 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_type_wrapper_classes 5127 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_primitive_type_mappings 4617 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn2 6475 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn3 6476 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn4 6477 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D 4345 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn5 6479 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn6 6480 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn2 8346 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn7 6492 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn3 8347 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn8 6493 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3 6038 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn4 8348 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Perl5_nn9 6501 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn5 8397 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn6 8394 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn7 8404 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn8 8412 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl_nn9 8415 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_default_args 1947 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn10 4701 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn11 4702 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn12 4704 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn14 4695 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn15 4696 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn16 4714 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn17 4715 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn18 4717 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn19 4718 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn20 4721 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn21 4737 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_variadic_templates 2544 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Guile_nn22 4738 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_implicit_namespace_packages 7414 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_optimal 3178 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nan_exception_typemap 5432 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R 7477 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_visual_studio 4907 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CCache 3607 0 R /__WKANCHOR_i0 3288 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_ddirectorinout 24 0 R /__WKANCHOR_eq 2973 0 R /__WKANCHOR_fa 3015 0 R /__WKANCHOR_i2 3314 0 R /__WKANCHOR_es 2976 0 R /__WKANCHOR_fc 3022 0 R /__WKANCHOR_i4 3322 0 R /__WKANCHOR_eu 2977 0 R /__WKANCHOR_fe 3029 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_cinterface 6064 0 R /__WKANCHOR_i6 3323 0 R /__WKANCHOR_ew 2971 0 R /__WKANCHOR_fg 3037 0 R /__WKANCHOR_i8 3329 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_pointers 5270 0 R /__WKANCHOR_ey 2988 0 R /__WKANCHOR_fi 3045 0 R /__WKANCHOR_fk 3060 0 R /__WKANCHOR_fm 3061 0 R /__WKANCHOR_fo 3068 0 R /__WKANCHOR_j0 3417 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_compilers 6085 0 R /__WKANCHOR_fq 3075 0 R /__WKANCHOR_ga 3123 0 R /__WKANCHOR_j2 3418 0 R /__WKANCHOR_fs 3091 0 R /__WKANCHOR_gc 3124 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn2 5810 0 R /__WKANCHOR_j4 3419 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn3 5811 0 R /__WKANCHOR_fu 3092 0 R /__WKANCHOR_ge 3125 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn4 5841 0 R /__WKANCHOR_j6 3435 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn5 5850 0 R /__WKANCHOR_fw 3095 0 R /__WKANCHOR_gg 3126 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn6 5851 0 R /__WKANCHOR_j8 3441 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn7 5863 0 R /__WKANCHOR_fy 3086 0 R /__WKANCHOR_gi 3134 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_constants_and_enums 8175 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn8 5864 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_nn9 5865 0 R /__WKANCHOR_gk 3135 0 R /__WKANCHOR_gm 3137 0 R /__WKANCHOR_go 3141 0 R /__WKANCHOR_k0 3531 0 R /__WKANCHOR_gq 3152 0 R /__WKANCHOR_ha 3207 0 R /__WKANCHOR_k2 3545 0 R /__WKANCHOR_gs 3154 0 R /__WKANCHOR_hc 3224 0 R /__WKANCHOR_k4 3548 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn10 6880 0 R /__WKANCHOR_gu 3156 0 R /__WKANCHOR_he 3225 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn11 6884 0 R /__WKANCHOR_k6 3550 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Pike_nn12 6885 0 R /__WKANCHOR_gw 3157 0 R /__WKANCHOR_hg 3234 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules 3570 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proper_enums_classes 5144 0 R /__WKANCHOR_k8 3552 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_namespaces 5957 0 R /__WKANCHOR_gy 3148 0 R /__WKANCHOR_hi 3231 0 R /__WKANCHOR_hk 3245 0 R /__WKANCHOR_hm 3246 0 R /__WKANCHOR_ho 3266 0 R /__WKANCHOR_l0 3611 0 R /__WKANCHOR_hq 3277 0 R /__WKANCHOR_ia 3339 0 R /__WKANCHOR_l2 3613 0 R /__WKANCHOR_hs 3278 0 R /__WKANCHOR_ic 3340 0 R /__WKANCHOR_l4 3615 0 R /__WKANCHOR_hu 3289 0 R /__WKANCHOR_ie 3346 0 R /__WKANCHOR_l6 3617 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Tcl 8322 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_package_search 7417 0 R /__WKANCHOR_hw 3290 0 R /__WKANCHOR_ig 3353 0 R /__WKANCHOR_l8 3647 0 R /__WKANCHOR_hy 3291 0 R /__WKANCHOR_ii 3364 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors 4172 0 R /__WKANCHOR_ik 3361 0 R /__WKANCHOR_im 3374 0 R /__WKANCHOR_io 3381 0 R /__WKANCHOR_e0 2851 0 R /__WKANCHOR_aq 2545 0 R /__WKANCHOR_ba 2575 0 R /__WKANCHOR_e2 2852 0 R /__WKANCHOR_as 2558 0 R /__WKANCHOR_bc 2577 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_templates 5033 0 R /__WKANCHOR_e4 2853 0 R /__WKANCHOR_au 2559 0 R /__WKANCHOR_be 2581 0 R /__WKANCHOR_e6 2856 0 R /__WKANCHOR_aw 2561 0 R /__WKANCHOR_bg 2598 0 R /__WKANCHOR_e8 2858 0 R /__WKANCHOR_ay 2562 0 R /__WKANCHOR_bi 2599 0 R /__WKANCHOR_bk 2589 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_void_pointers 4101 0 R /__WKANCHOR_bm 2591 0 R /__WKANCHOR_bo 2594 0 R /__WKANCHOR_f0 2990 0 R /__WKANCHOR_bq 2595 0 R /__WKANCHOR_ca 2654 0 R /__WKANCHOR_f2 2998 0 R /__WKANCHOR_bs 2608 0 R /__WKANCHOR_cc 2655 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples_other 4028 0 R /__WKANCHOR_f4 2999 0 R /__WKANCHOR_bu 2610 0 R /__WKANCHOR_ce 2657 0 R /__WKANCHOR_f6 3007 0 R /__WKANCHOR_bw 2633 0 R /__WKANCHOR_cg 2667 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_explicit_overrides_final 2515 0 R /__WKANCHOR_f8 3008 0 R /__WKANCHOR_by 2634 0 R /__WKANCHOR_ci 2668 0 R /__WKANCHOR_ck 2670 0 R /__WKANCHOR_cm 2685 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_default_args 2181 0 R /__WKANCHOR_co 2686 0 R /__WKANCHOR_g0 3089 0 R /__WKANCHOR_cq 2689 0 R /__WKANCHOR_da 2765 0 R /__WKANCHOR_g2 3107 0 R /__WKANCHOR_cs 2713 0 R /__WKANCHOR_dc 2774 0 R /__WKANCHOR_g4 3109 0 R /__WKANCHOR_cu 2720 0 R /__WKANCHOR_de 2782 0 R /__WKANCHOR_g6 3110 0 R /__WKANCHOR_cw 2727 0 R /__WKANCHOR_dg 2789 0 R /__WKANCHOR_g8 3111 0 R /__WKANCHOR_cy 2739 0 R /__WKANCHOR_di 2797 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_feature_attributes 3362 0 R /__WKANCHOR_dk 2810 0 R /__WKANCHOR_dm 2804 0 R /__WKANCHOR_do 2806 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_command_line_invocation 4373 0 R /__WKANCHOR_h0 3170 0 R /__WKANCHOR_dq 2807 0 R /__WKANCHOR_ea 2865 0 R /__WKANCHOR_h2 3177 0 R /__WKANCHOR_ds 2826 0 R /__WKANCHOR_ec 2867 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modules_external_run_time 3599 0 R /__WKANCHOR_h4 3179 0 R /__WKANCHOR_du 2834 0 R /__WKANCHOR_ee 2939 0 R /__WKANCHOR_h6 3193 0 R /__WKANCHOR_dw 2836 0 R /__WKANCHOR_eg 2940 0 R /__WKANCHOR_h8 3208 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_adding_downcasts 5467 0 R /__WKANCHOR_dy 2843 0 R /__WKANCHOR_ei 2947 0 R /__WKANCHOR_ek 2955 0 R /__WKANCHOR_em 2956 0 R /__WKANCHOR_eo 2962 0 R /__WKANCHOR_a0 2500 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_overview 4849 0 R /__WKANCHOR_a2 2501 0 R /__WKANCHOR_a4 2503 0 R /__WKANCHOR_a6 2513 0 R /__WKANCHOR_a8 2514 0 R /__WKANCHOR_b0 2568 0 R /__WKANCHOR_b2 2570 0 R /__WKANCHOR_b4 2573 0 R /__WKANCHOR_b6 2576 0 R /__WKANCHOR_b8 2578 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_argout_typemap_ 7857 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_features 6124 0 R /__WKANCHOR_c0 2629 0 R /__WKANCHOR_c2 2641 0 R /__WKANCHOR_c4 2642 0 R /__WKANCHOR_c6 2643 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_overview 8154 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_aspects 2974 0 R /__WKANCHOR_c8 2656 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_varout_typemap_ 7878 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_arginit_typemap 7856 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_directorout_typemap 7888 0 R /__WKANCHOR_d0 2740 0 R /__WKANCHOR_aa 2521 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript 5562 0 R /__WKANCHOR_d2 2733 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_stl_cpp_library 2767 0 R /__WKANCHOR_ac 2523 0 R /__WKANCHOR_d4 2734 0 R /__WKANCHOR_ae 2524 0 R /__WKANCHOR_d6 2747 0 R /__WKANCHOR_ag 2525 0 R /__WKANCHOR_d8 2766 0 R /__WKANCHOR_ai 2535 0 R /__WKANCHOR_ak 2536 0 R /__WKANCHOR_am 2546 0 R /__WKANCHOR_ao 2548 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_building_windows 4909 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn2 6172 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn3 6173 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn4 6175 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn5 6176 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn6 6207 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_newfree_typemap 7873 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn7 6208 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn8 6209 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ocaml_nn9 6218 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_standard_library_changes 2571 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_extending_proxy_class 4256 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_building_modes_nobuilder_mode 8314 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_pragmas 4441 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_multi_argument_typemaps 3192 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_nmake 4910 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_automatic_specialization 3223 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_clearing_features 3375 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_defaulted_deleted 2557 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_splitproxy 19 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_ctor_dtor 4573 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn10 6342 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn11 6348 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn12 6350 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn13 6357 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig 8077 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn15 6365 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn17 6366 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn18 6367 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn19 6382 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn20 6383 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn21 6396 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn22 6389 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn23 6403 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn24 6404 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn25 6412 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Octave_nn26 6413 0 R /#f2#ac#82#04o#d2B#b3p#f0#bfR#26#d8#c8#0a#fc#cc#16#fa 25 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_unbounded_c_arrays 5280 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus 2059 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_simple_example 5648 0 R /!.#09#d3#f3#3b#23#86#c8#c4n#25h#91#ed#c5#f3#9a#20#82 4068 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_other_features 4447 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_examples 3956 0 R /5#8b#0d#3c#a7#dd#24#fe#9b#97#1a#1b#0b8u#df#d6#c0#7fg 2600 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_arrays_pinning 4124 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_running_test_suite 8877 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_partial_classes 4257 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_condition_compilation 2630 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_operators 8247 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_pragmas 6118 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simpler_enum_classes 5415 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn1 6755 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn2 6756 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Php_nn3 6818 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows 1581 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_vector 2775 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_perl 1603 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alignment 2569 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_nn27a 7137 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_descriptor 3087 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_constants 4931 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG 1743 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_double_angle_brackets 2522 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_smart_pointers_generic 5031 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_director_caveats 4194 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_ret 3138 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_python3support 7441 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34_2 7800 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dinput 13 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_ptr_ptr_functions 5995 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_further_details 5050 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go 4465 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby 7499 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization 3286 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_installation 1608 0 R /__WKANCHOR_19q 6322 0 R /__WKANCHOR_19s 6325 0 R /__WKANCHOR_19u 6328 0 R /__WKANCHOR_19w 6321 0 R /__WKANCHOR_19y 6338 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_shared_ptr 7118 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Windows_r 1653 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_class_memory 4552 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_code_typemaps 5374 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_debugging_search 3044 0 R /#1e#b4#c5E#b1#24#fdC#8b#a92#a2#b0#80#7b#fa#83#8cO#8e 2425 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor 2607 0 R /__WKANCHOR_170 6087 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_proxy_classes 5073 0 R /__WKANCHOR_13q 5715 0 R /__WKANCHOR_14a 5843 0 R /__WKANCHOR_172 6091 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_emitter 5684 0 R /__WKANCHOR_13s 5746 0 R /__WKANCHOR_14c 5844 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_functions 4921 0 R /__WKANCHOR_174 6093 0 R /__WKANCHOR_13u 5759 0 R /__WKANCHOR_14e 5852 0 R /__WKANCHOR_176 6107 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_example 5177 0 R /__WKANCHOR_13w 5761 0 R /__WKANCHOR_14g 5853 0 R /__WKANCHOR_178 6108 0 R /__WKANCHOR_13y 5772 0 R /__WKANCHOR_14i 5866 0 R /__WKANCHOR_14k 5867 0 R /__WKANCHOR_14m 5860 0 R /__WKANCHOR_14o 5861 0 R /__WKANCHOR_180 6169 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23throws_typemap 3155 0 R /__WKANCHOR_14q 5874 0 R /__WKANCHOR_15a 5932 0 R /__WKANCHOR_182 6170 0 R /__WKANCHOR_14s 5882 0 R /__WKANCHOR_15c 5942 0 R /__WKANCHOR_184 6171 0 R /__WKANCHOR_14u 5883 0 R /__WKANCHOR_15e 5943 0 R /__WKANCHOR_186 6205 0 R /__WKANCHOR_14w 5889 0 R /__WKANCHOR_15g 5951 0 R /__WKANCHOR_188 6206 0 R /__WKANCHOR_14y 5897 0 R /__WKANCHOR_15i 5958 0 R /__WKANCHOR_15k 5969 0 R /#f9#21#80#b3#d7#88#9c#e6#f0#10#d2S#f24#25H#a2md#03 4148 0 R /__WKANCHOR_15m 5966 0 R /__WKANCHOR_15o 5977 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_unix_installation 1483 0 R /__WKANCHOR_150 5903 0 R /__WKANCHOR_11q 5508 0 R /__WKANCHOR_12a 5555 0 R /__WKANCHOR_152 5904 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_tips_techniques 5263 0 R /__WKANCHOR_11s 5516 0 R /__WKANCHOR_12c 5558 0 R /__WKANCHOR_154 5912 0 R /__WKANCHOR_11u 5529 0 R /__WKANCHOR_12e 5594 0 R /__WKANCHOR_156 5919 0 R /__WKANCHOR_11w 5537 0 R /__WKANCHOR_12g 5595 0 R /__WKANCHOR_158 5933 0 R /__WKANCHOR_11y 5539 0 R /__WKANCHOR_12i 5596 0 R /__WKANCHOR_12k 5611 0 R /__WKANCHOR_12m 5612 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_jsc_exceptions 5697 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_commandline 5842 0 R /__WKANCHOR_12o 5608 0 R /__WKANCHOR_160 6003 0 R /__WKANCHOR_12q 5620 0 R /__WKANCHOR_13a 5682 0 R /__WKANCHOR_162 6005 0 R /__WKANCHOR_12s 5622 0 R /__WKANCHOR_13c 5683 0 R /__WKANCHOR_164 6006 0 R /__WKANCHOR_12u 5624 0 R /__WKANCHOR_13e 5695 0 R /__WKANCHOR_166 6024 0 R /__WKANCHOR_12w 5635 0 R /__WKANCHOR_13g 5696 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_directors_example 4171 0 R /__WKANCHOR_168 6025 0 R /__WKANCHOR_12y 5636 0 R /__WKANCHOR_13i 5705 0 R /__WKANCHOR_13k 5718 0 R /__WKANCHOR_13m 5719 0 R /__WKANCHOR_13o 5712 0 R /__WKANCHOR_17q 6132 0 R /__WKANCHOR_18a 6204 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_const 2417 0 R /__WKANCHOR_17s 6133 0 R /__WKANCHOR_18c 6216 0 R /__WKANCHOR_17u 6149 0 R /__WKANCHOR_18e 6217 0 R /__WKANCHOR_17w 6150 0 R /__WKANCHOR_18g 6231 0 R /__WKANCHOR_17y 6174 0 R /__WKANCHOR_18i 6232 0 R /__WKANCHOR_18k 6233 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn30 7764 0 R /__WKANCHOR_18m 6234 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn31 7765 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn32 7775 0 R /__WKANCHOR_18o 6235 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn33 7784 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn34 7781 0 R /__WKANCHOR_18q 6224 0 R /__WKANCHOR_19a 6265 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn35 7798 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_debugging 5556 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn36 7808 0 R /__WKANCHOR_18s 6241 0 R /__WKANCHOR_19c 6277 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn37 7810 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn38 7811 0 R /__WKANCHOR_18u 6242 0 R /__WKANCHOR_19e 6279 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn39 7845 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Lua_typemaps_write 6007 0 R /__WKANCHOR_18w 6256 0 R /__WKANCHOR_19g 6281 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_dout 15 0 R /__WKANCHOR_18y 6257 0 R /__WKANCHOR_19i 6284 0 R /__WKANCHOR_19k 6285 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn40 7904 0 R /__WKANCHOR_19m 6287 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn41 7906 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn42 7907 0 R /__WKANCHOR_19o 6289 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn43 7919 0 R /__WKANCHOR_190 6259 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn44 7920 0 R /__WKANCHOR_15q 5975 0 R /__WKANCHOR_16a 6016 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn45 7915 0 R /__WKANCHOR_192 6252 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn46 7926 0 R /__WKANCHOR_15s 5978 0 R /__WKANCHOR_16c 6017 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn47 7927 0 R /__WKANCHOR_194 6255 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn48 7928 0 R /__WKANCHOR_15u 5987 0 R /__WKANCHOR_16e 6019 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn49 7937 0 R /__WKANCHOR_196 6268 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_multiple_modules 4192 0 R /__WKANCHOR_15w 5988 0 R /__WKANCHOR_16g 6031 0 R /__WKANCHOR_198 6270 0 R /__WKANCHOR_15y 5996 0 R /__WKANCHOR_16i 6039 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_pgcpp 5105 0 R /__WKANCHOR_16k 6041 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn10 7641 0 R /__WKANCHOR_16m 6068 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn11 7650 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn12 7651 0 R /__WKANCHOR_16o 6069 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn13 7652 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn14 7660 0 R /__WKANCHOR_yq 5104 0 R /__WKANCHOR_za 5167 0 R /__WKANCHOR_16q 6070 0 R /__WKANCHOR_17a 6110 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn15 7661 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn16 7667 0 R /__WKANCHOR_ys 5106 0 R /__WKANCHOR_zc 5179 0 R /__WKANCHOR_16s 6063 0 R /__WKANCHOR_17c 6117 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn17 7668 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn18 7676 0 R /__WKANCHOR_yu 5118 0 R /__WKANCHOR_ze 5181 0 R /__WKANCHOR_16u 6086 0 R /__WKANCHOR_17e 6119 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn19 7684 0 R /__WKANCHOR_yw 5126 0 R /__WKANCHOR_zg 5182 0 R /__WKANCHOR_16w 6088 0 R /__WKANCHOR_17g 6120 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_module 4879 0 R /__WKANCHOR_yy 5133 0 R /__WKANCHOR_zi 5189 0 R /__WKANCHOR_16y 6092 0 R /__WKANCHOR_17i 6121 0 R /__WKANCHOR_zk 5190 0 R /__WKANCHOR_17k 6122 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn20 7691 0 R /__WKANCHOR_zm 5192 0 R /__WKANCHOR_17m 6137 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn21 7701 0 R /#e4#7e#c5l#1b#03F#14f#de#19#b5#895#b3a#ab#c37#b8 5502 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn22 7702 0 R /__WKANCHOR_zo 5216 0 R /__WKANCHOR_17o 6139 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn23 7711 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn24 7739 0 R /__WKANCHOR_zq 5213 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn25 7741 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn26 7753 0 R /__WKANCHOR_zs 5224 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn27 7749 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn28 7750 0 R /__WKANCHOR_zu 5225 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn29 7760 0 R /__WKANCHOR_zw 5232 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Modula3_motivation 6065 0 R /__WKANCHOR_zy 5240 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Library_std_shared_ptr 2788 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Arguments 2808 0 R /__WKANCHOR_100 5250 0 R /__WKANCHOR_102 5264 0 R /__WKANCHOR_104 5261 0 R /__WKANCHOR_106 5271 0 R /__WKANCHOR_108 5277 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn2 8631 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn3 8632 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn4 8634 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn5 8685 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn6 8687 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn7 8688 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn8 8696 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending_nn9 8716 0 R /__WKANCHOR_y0 5023 0 R /__WKANCHOR_uq 4610 0 R /__WKANCHOR_va 4654 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_typemaps 4637 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_defining 2972 0 R /__WKANCHOR_y2 5038 0 R /__WKANCHOR_us 4620 0 R /__WKANCHOR_vc 4689 0 R /__WKANCHOR_y4 5032 0 R /__WKANCHOR_uu 4618 0 R /__WKANCHOR_ve 4682 0 R /__WKANCHOR_y6 5034 0 R /__WKANCHOR_uw 4627 0 R /__WKANCHOR_vg 4683 0 R /__WKANCHOR_y8 5036 0 R /__WKANCHOR_uy 4635 0 R /__WKANCHOR_vi 4684 0 R /__WKANCHOR_vk 4697 0 R /__WKANCHOR_vm 4698 0 R /mp#a4#0a#f14j#dc#df2#ec#22w#ea#cd#99#2b#98#5d#27 7425 0 R /__WKANCHOR_vo 4699 0 R /__WKANCHOR_z0 5134 0 R /__WKANCHOR_130 5649 0 R /__WKANCHOR_vq 4700 0 R /__WKANCHOR_wa 4847 0 R /__WKANCHOR_10a 5278 0 R /__WKANCHOR_z2 5145 0 R /__WKANCHOR_132 5651 0 R /__WKANCHOR_vs 4703 0 R /__WKANCHOR_wc 4850 0 R /__WKANCHOR_10c 5288 0 R /__WKANCHOR_z4 5154 0 R /__WKANCHOR_134 5658 0 R /__WKANCHOR_vu 4712 0 R /__WKANCHOR_we 4845 0 R /__WKANCHOR_10e 5296 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn13 8150 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_directors_threading 5193 0 R /__WKANCHOR_z6 5151 0 R /__WKANCHOR_136 5667 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_nn14 8167 0 R /__WKANCHOR_vw 4713 0 R /__WKANCHOR_wg 4878 0 R /__WKANCHOR_10g 5302 0 R /__WKANCHOR_z8 5168 0 R /__WKANCHOR_138 5674 0 R /__WKANCHOR_vy 4716 0 R /__WKANCHOR_wi 4881 0 R /__WKANCHOR_10i 5303 0 R /__WKANCHOR_wk 4882 0 R /__WKANCHOR_10k 5314 0 R /__WKANCHOR_wm 4883 0 R /__WKANCHOR_10m 5316 0 R /__WKANCHOR_wo 4897 0 R /__WKANCHOR_10o 5317 0 R /__WKANCHOR_140 5769 0 R /__WKANCHOR_wq 4898 0 R /__WKANCHOR_xa 4948 0 R /__WKANCHOR_10q 5326 0 R /__WKANCHOR_11a 5440 0 R /__WKANCHOR_142 5779 0 R /__WKANCHOR_ws 4908 0 R /__WKANCHOR_xc 4949 0 R /__WKANCHOR_10s 5347 0 R /__WKANCHOR_11c 5454 0 R /__WKANCHOR_144 5780 0 R /__WKANCHOR_wu 4911 0 R /__WKANCHOR_xe 4958 0 R /__WKANCHOR_10u 5349 0 R /__WKANCHOR_11e 5455 0 R /__WKANCHOR_146 5812 0 R /__WKANCHOR_ww 4906 0 R /__WKANCHOR_xg 4972 0 R /__WKANCHOR_10w 5376 0 R /__WKANCHOR_11g 5468 0 R /__WKANCHOR_148 5809 0 R /__WKANCHOR_wy 4920 0 R /__WKANCHOR_xi 4973 0 R /__WKANCHOR_10y 5373 0 R /__WKANCHOR_11i 5479 0 R /__WKANCHOR_xk 4975 0 R /__WKANCHOR_11k 5480 0 R /__WKANCHOR_xm 4985 0 R /__WKANCHOR_11m 5489 0 R /__WKANCHOR_xo 4992 0 R /__WKANCHOR_11o 5501 0 R /__WKANCHOR_110 5400 0 R /__WKANCHOR_xq 5002 0 R /__WKANCHOR_ya 5048 0 R /__WKANCHOR_112 5416 0 R /__WKANCHOR_xs 5004 0 R /__WKANCHOR_yc 5049 0 R /__WKANCHOR_114 5417 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_smart_pointers_generic 7119 0 R /__WKANCHOR_xu 5012 0 R /__WKANCHOR_ye 5059 0 R /__WKANCHOR_116 5418 0 R /__WKANCHOR_xw 5010 0 R /__WKANCHOR_yg 5069 0 R /__WKANCHOR_118 5433 0 R /__WKANCHOR_xy 5020 0 R /__WKANCHOR_yi 5070 0 R /__WKANCHOR_yk 5071 0 R /__WKANCHOR_ym 5082 0 R /__WKANCHOR_yo 5089 0 R /__WKANCHOR_u0 4549 0 R /__WKANCHOR_120 5545 0 R /__WKANCHOR_qq 4212 0 R /__WKANCHOR_ra 4303 0 R /__WKANCHOR_u2 4550 0 R /__WKANCHOR_122 5547 0 R /__WKANCHOR_qs 4221 0 R /__WKANCHOR_rc 4306 0 R /__WKANCHOR_u4 4551 0 R /__WKANCHOR_124 5560 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_macro_typemap 3088 0 R /__WKANCHOR_qu 4240 0 R /__WKANCHOR_re 4308 0 R /__WKANCHOR_u6 4565 0 R /__WKANCHOR_126 5561 0 R /__WKANCHOR_qw 4248 0 R /__WKANCHOR_rg 4309 0 R /__WKANCHOR_u8 4560 0 R /__WKANCHOR_128 5563 0 R /__WKANCHOR_qy 4255 0 R /__WKANCHOR_ri 4296 0 R /__WKANCHOR_rk 4297 0 R /__WKANCHOR_rm 4319 0 R /__WKANCHOR_ro 4320 0 R /__WKANCHOR_v0 4636 0 R /__WKANCHOR_1g0 6881 0 R /__WKANCHOR_rq 4321 0 R /__WKANCHOR_sa 4374 0 R /__WKANCHOR_1cq 6614 0 R /__WKANCHOR_1da 6653 0 R /__WKANCHOR_v2 4652 0 R /__WKANCHOR_1g2 6886 0 R /__WKANCHOR_rs 4322 0 R /__WKANCHOR_sc 4376 0 R /__WKANCHOR_1cs 6625 0 R /__WKANCHOR_1dc 6669 0 R /__WKANCHOR_v4 4653 0 R /__WKANCHOR_1g4 6888 0 R /__WKANCHOR_ru 4337 0 R /__WKANCHOR_se 4377 0 R /__WKANCHOR_1cu 6626 0 R /__WKANCHOR_1de 6670 0 R /__WKANCHOR_v6 4655 0 R /__WKANCHOR_1g6 6997 0 R /__WKANCHOR_rw 4338 0 R /__WKANCHOR_sg 4378 0 R /__WKANCHOR_1cw 6636 0 R /__WKANCHOR_1dg 6679 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_imclass_pragmas 5058 0 R /__WKANCHOR_v8 4656 0 R /__WKANCHOR_1g8 6998 0 R /__WKANCHOR_ry 4331 0 R /__WKANCHOR_si 4399 0 R /__WKANCHOR_1cy 6637 0 R /__WKANCHOR_1di 6680 0 R /__WKANCHOR_sk 4401 0 R /__WKANCHOR_1dk 6686 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn70 7983 0 R /__WKANCHOR_sm 4402 0 R /__WKANCHOR_1dm 6687 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn71 7984 0 R /__WKANCHOR_so 4404 0 R /__WKANCHOR_1do 6696 0 R /__WKANCHOR_w0 4719 0 R /__WKANCHOR_1h0 7063 0 R /__WKANCHOR_sq 4405 0 R /__WKANCHOR_ta 4466 0 R /__WKANCHOR_1dq 6698 0 R /__WKANCHOR_1ea 6754 0 R /__WKANCHOR_w2 4720 0 R /__WKANCHOR_1h2 7072 0 R /__WKANCHOR_ss 4408 0 R /__WKANCHOR_tc 4469 0 R /__WKANCHOR_1ds 6708 0 R /__WKANCHOR_1ec 6757 0 R /__WKANCHOR_w4 4735 0 R /__WKANCHOR_1h4 7078 0 R /__WKANCHOR_su 4432 0 R /__WKANCHOR_te 4471 0 R /__WKANCHOR_1du 6709 0 R /__WKANCHOR_1ee 6770 0 R /__WKANCHOR_w6 4736 0 R /__WKANCHOR_1h6 7085 0 R /__WKANCHOR_sw 4449 0 R /__WKANCHOR_tg 4472 0 R /__WKANCHOR_1dw 6710 0 R /__WKANCHOR_1eg 6771 0 R /__WKANCHOR_w8 4745 0 R /__WKANCHOR_1h8 7094 0 R /__WKANCHOR_sy 4450 0 R /__WKANCHOR_ti 4497 0 R /__WKANCHOR_1dy 6721 0 R /__WKANCHOR_1ei 6779 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_using_typemaps_return_arguments 5453 0 R /__WKANCHOR_tk 4492 0 R /__WKANCHOR_1ek 6780 0 R /__WKANCHOR_tm 4493 0 R /__WKANCHOR_1em 6787 0 R /__WKANCHOR_to 4533 0 R /__WKANCHOR_1eo 6796 0 R /__WKANCHOR_x0 4922 0 R /__WKANCHOR_1e0 6719 0 R /__WKANCHOR_tq 4535 0 R /__WKANCHOR_ua 4562 0 R /__WKANCHOR_1aq 6390 0 R /__WKANCHOR_1ba 6478 0 R /__WKANCHOR_x2 4923 0 R /__WKANCHOR_1e2 6720 0 R /__WKANCHOR_ts 4536 0 R /__WKANCHOR_uc 4575 0 R /__WKANCHOR_1as 6394 0 R /__WKANCHOR_1bc 6481 0 R /__WKANCHOR_x4 4932 0 R /__WKANCHOR_1e4 6758 0 R /__WKANCHOR_tu 4538 0 R /__WKANCHOR_ue 4576 0 R /__WKANCHOR_1au 6405 0 R /__WKANCHOR_1be 6494 0 R /__WKANCHOR_x6 4933 0 R /__WKANCHOR_1e6 6759 0 R /__WKANCHOR_tw 4539 0 R /__WKANCHOR_ug 4577 0 R /__WKANCHOR_1aw 6406 0 R /__WKANCHOR_1bg 6495 0 R /__WKANCHOR_x8 4950 0 R /__WKANCHOR_1e8 6760 0 R /__WKANCHOR_ty 4553 0 R /__WKANCHOR_ui 4590 0 R /__WKANCHOR_1ay 6417 0 R /__WKANCHOR_1bi 6502 0 R /__WKANCHOR_uk 4585 0 R /__WKANCHOR_1bk 6526 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn50 7952 0 R /__WKANCHOR_um 4586 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken 4270 0 R /__WKANCHOR_1bm 6515 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn51 7949 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn52 7958 0 R /__WKANCHOR_uo 4601 0 R /__WKANCHOR_1bo 6518 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn53 7985 0 R /__WKANCHOR_q0 4123 0 R /__WKANCHOR_1f0 6816 0 R /__WKANCHOR_mq 3792 0 R /__WKANCHOR_na 3842 0 R /__WKANCHOR_1bq 6519 0 R /__WKANCHOR_1ca 6567 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn55 7999 0 R /__WKANCHOR_q2 4131 0 R /__WKANCHOR_1f2 6817 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn56 8007 0 R /__WKANCHOR_ms 3795 0 R /__WKANCHOR_nc 3843 0 R /__WKANCHOR_1bs 6520 0 R /__WKANCHOR_1cc 6568 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn57 8015 0 R /__WKANCHOR_q4 4133 0 R /__WKANCHOR_1f4 6826 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn58 8016 0 R /__WKANCHOR_mu 3797 0 R /__WKANCHOR_ne 3844 0 R /__WKANCHOR_1bu 6521 0 R /__WKANCHOR_1ce 6577 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn59 8018 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Typemaps_special_variable_macros 3090 0 R /__WKANCHOR_q6 4147 0 R /__WKANCHOR_1f6 6827 0 R /__WKANCHOR_mw 3806 0 R /__WKANCHOR_ng 3845 0 R /__WKANCHOR_1bw 6522 0 R /__WKANCHOR_1cg 6584 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_nspace 2354 0 R /__WKANCHOR_q8 4158 0 R /__WKANCHOR_1f8 6828 0 R /__WKANCHOR_my 3815 0 R /__WKANCHOR_ni 3846 0 R /__WKANCHOR_1by 6537 0 R /__WKANCHOR_1ci 6597 0 R /__WKANCHOR_nk 3848 0 R /__WKANCHOR_1ck 6598 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn60 8032 0 R /__WKANCHOR_nm 3858 0 R /__WKANCHOR_1cm 6607 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn61 8045 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn62 8053 0 R /__WKANCHOR_no 3859 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preprocessor_typemap_delimiters 2659 0 R /__WKANCHOR_1co 6613 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn63 8068 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Sections_developers_docs 1439 0 R /__WKANCHOR_r0 4258 0 R /__WKANCHOR_1k0 7362 0 R /__WKANCHOR_nq 3872 0 R /__WKANCHOR_oa 3905 0 R /__WKANCHOR_1gq 7044 0 R /__WKANCHOR_1ha 7093 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn65 7966 0 R /__WKANCHOR_r2 4267 0 R /__WKANCHOR_1k2 7364 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn66 7967 0 R /__WKANCHOR_ns 3889 0 R /__WKANCHOR_oc 3921 0 R /__WKANCHOR_1gs 7046 0 R /__WKANCHOR_1hc 7102 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn67 7968 0 R /__WKANCHOR_r4 4268 0 R /__WKANCHOR_1k4 7365 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn2 7548 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn68 7970 0 R /__WKANCHOR_nu 3891 0 R /__WKANCHOR_oe 3922 0 R /__WKANCHOR_1gu 7047 0 R /__WKANCHOR_1he 7110 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn3 7545 0 R /__WKANCHOR_r6 4269 0 R /__WKANCHOR_1k6 7376 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn4 7622 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_simple_enums 4977 0 R /__WKANCHOR_nw 3892 0 R /__WKANCHOR_og 3923 0 R /__WKANCHOR_1gw 7048 0 R /__WKANCHOR_1hg 7111 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn5 7623 0 R /__WKANCHOR_r8 4307 0 R /__WKANCHOR_1k8 7377 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIG_readonly_variables 1914 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn6 7624 0 R /__WKANCHOR_ny 3893 0 R /__WKANCHOR_oi 3924 0 R /__WKANCHOR_1gy 7056 0 R /__WKANCHOR_1hi 7120 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn7 7636 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn8 7638 0 R /__WKANCHOR_ok 3944 0 R /__WKANCHOR_1hk 7121 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_nn9 7639 0 R /__WKANCHOR_om 3931 0 R /__WKANCHOR_1hm 7122 0 R /__WKANCHOR_oo 3934 0 R /__WKANCHOR_1ho 7130 0 R /__WKANCHOR_s0 4332 0 R /__WKANCHOR_1l0 7440 0 R /__WKANCHOR_oq 3935 0 R /__WKANCHOR_pa 3977 0 R /__WKANCHOR_1hq 7131 0 R /__WKANCHOR_1ia 7194 0 R /__WKANCHOR_s2 4344 0 R /__WKANCHOR_1l2 7442 0 R /__WKANCHOR_os 3937 0 R /__WKANCHOR_pc 3999 0 R /__WKANCHOR_1hs 7132 0 R /__WKANCHOR_1ic 7196 0 R /__WKANCHOR_s4 4346 0 R /__WKANCHOR_1l4 7455 0 R /__WKANCHOR_ou 3940 0 R /__WKANCHOR_pe 4025 0 R /__WKANCHOR_1hu 7135 0 R /__WKANCHOR_1ie 7206 0 R /__WKANCHOR_s6 4349 0 R /__WKANCHOR_1l6 7462 0 R /__WKANCHOR_ow 3942 0 R /__WKANCHOR_pg 4026 0 R /__WKANCHOR_1hw 7148 0 R /__WKANCHOR_1ig 7209 0 R /__WKANCHOR_s8 4350 0 R /__WKANCHOR_1l8 7471 0 R /__WKANCHOR_oy 3943 0 R /__WKANCHOR_pi 4027 0 R /__WKANCHOR_1hy 7162 0 R /__WKANCHOR_1ii 7211 0 R /__WKANCHOR_pk 4069 0 R /__WKANCHOR_1ik 7212 0 R /__WKANCHOR_pm 4070 0 R /__WKANCHOR_1im 7213 0 R /__WKANCHOR_po 4063 0 R /__WKANCHOR_1io 7221 0 R /__WKANCHOR_t0 4442 0 R /__WKANCHOR_1i0 7170 0 R /__WKANCHOR_pq 4064 0 R /__WKANCHOR_qa 4156 0 R /__WKANCHOR_1eq 6795 0 R /__WKANCHOR_1fa 6837 0 R /__WKANCHOR_t2 4445 0 R /__WKANCHOR_1i2 7178 0 R /__WKANCHOR_ps 4102 0 R /__WKANCHOR_qc 4169 0 R /__WKANCHOR_1es 6797 0 R /__WKANCHOR_1fc 6840 0 R /__WKANCHOR_t4 4446 0 R /__WKANCHOR_1i4 7186 0 R /__WKANCHOR_pu 4103 0 R /__WKANCHOR_qe 4170 0 R /__WKANCHOR_1eu 6807 0 R /__WKANCHOR_1fe 6841 0 R /__WKANCHOR_t6 4467 0 R /__WKANCHOR_1i6 7188 0 R /__WKANCHOR_pw 4114 0 R /__WKANCHOR_qg 4180 0 R /__WKANCHOR_1ew 6808 0 R /__WKANCHOR_1fg 6842 0 R /__WKANCHOR_t8 4470 0 R /__WKANCHOR_1i8 7199 0 R /__WKANCHOR_py 4115 0 R /__WKANCHOR_qi 4191 0 R /__WKANCHOR_1ey 6810 0 R /__WKANCHOR_1fi 6844 0 R /__WKANCHOR_qk 4193 0 R /__WKANCHOR_1fk 6847 0 R /__WKANCHOR_qm 4205 0 R /__WKANCHOR_1fm 6871 0 R /__WKANCHOR_qo 4202 0 R /__WKANCHOR_1fo 6874 0 R /__WKANCHOR_m0 3681 0 R /__WKANCHOR_1j0 7271 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_differences_java 4067 0 R /__WKANCHOR_iq 3390 0 R /__WKANCHOR_ja 3442 0 R /__WKANCHOR_1fq 6865 0 R /__WKANCHOR_1ga 6993 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Ruby_Deleting_a_typemap 7833 0 R /__WKANCHOR_m2 3682 0 R /__WKANCHOR_1j2 7268 0 R /__WKANCHOR_is 3393 0 R /__WKANCHOR_jc 3450 0 R /__WKANCHOR_1fs 6866 0 R /__WKANCHOR_1gc 7004 0 R /__WKANCHOR_m4 3741 0 R /__WKANCHOR_1j4 7278 0 R /__WKANCHOR_iu 3395 0 R /__WKANCHOR_je 3464 0 R /__WKANCHOR_1fu 6867 0 R /__WKANCHOR_1ge 7005 0 R /__WKANCHOR_m6 3742 0 R /__WKANCHOR_1j6 7288 0 R /__WKANCHOR_iw 3407 0 R /__WKANCHOR_jg 3477 0 R /__WKANCHOR_1fw 6882 0 R /__WKANCHOR_1gg 7015 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Android_overview 3958 0 R /__WKANCHOR_m8 3764 0 R /__WKANCHOR_1j8 7289 0 R /__WKANCHOR_iy 3408 0 R /__WKANCHOR_ji 3485 0 R /__WKANCHOR_1fy 6887 0 R /__WKANCHOR_1gi 7017 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Extending 8615 0 R /__WKANCHOR_jk 3487 0 R /__WKANCHOR_1gk 7024 0 R /__WKANCHOR_jm 3497 0 R /__WKANCHOR_1gm 7032 0 R /__WKANCHOR_jo 3498 0 R /__WKANCHOR_1go 7033 0 R /__WKANCHOR_n0 3812 0 R /__WKANCHOR_jq 3493 0 R /__WKANCHOR_ka 3544 0 R /__WKANCHOR_n2 3821 0 R /__WKANCHOR_js 3521 0 R /__WKANCHOR_kc 3558 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_installation 1491 0 R /__WKANCHOR_n4 3847 0 R /__WKANCHOR_ju 3529 0 R /__WKANCHOR_ke 3559 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_templates 8240 0 R /__WKANCHOR_n6 3849 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn10 4323 0 R /__WKANCHOR_jw 3530 0 R /__WKANCHOR_kg 3569 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Javascript_preliminaries 5597 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn11 4316 0 R /__WKANCHOR_n8 3850 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn12 4317 0 R /__WKANCHOR_jy 3532 0 R /__WKANCHOR_ki 3571 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Customization_allowexcept 3320 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn13 4318 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn14 4333 0 R /__WKANCHOR_kk 3572 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn15 4334 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn16 4335 0 R /__WKANCHOR_km 3573 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn17 4336 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn18 4347 0 R /__WKANCHOR_ko 3589 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Chicken_nn19 4348 0 R /__WKANCHOR_o0 3894 0 R /__WKANCHOR_kq 3587 0 R /__WKANCHOR_la 3641 0 R /__WKANCHOR_o2 3883 0 R /__WKANCHOR_ks 3596 0 R /__WKANCHOR_lc 3642 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_package 4532 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CSharp_enum_underlying_type 4265 0 R /__WKANCHOR_o4 3904 0 R /__WKANCHOR_ku 3598 0 R /__WKANCHOR_le 3643 0 R /__WKANCHOR_o6 3906 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23R_language_conventions 7496 0 R /__WKANCHOR_kw 3609 0 R /__WKANCHOR_lg 3656 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_alias_templates 2537 0 R /__WKANCHOR_o8 3907 0 R /__WKANCHOR_ky 3612 0 R /__WKANCHOR_li 3657 0 R /__WKANCHOR_lk 3670 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23SWIGPlus_member_data 2163 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Preface_examples 1526 0 R /__WKANCHOR_lm 3671 0 R /__WKANCHOR_lo 3672 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_hash_tables 2572 0 R /__WKANCHOR_p0 3960 0 R /__WKANCHOR_lq 3674 0 R /__WKANCHOR_ma 3768 0 R /__WKANCHOR_p2 3951 0 R /__WKANCHOR_ls 3665 0 R /__WKANCHOR_mc 3763 0 R /__WKANCHOR_p4 3952 0 R /__WKANCHOR_lu 3668 0 R /__WKANCHOR_me 3780 0 R /__WKANCHOR_p6 3954 0 R /__WKANCHOR_lw 3685 0 R /__WKANCHOR_mg 3781 0 R /__WKANCHOR_p8 3955 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_running_swig_building_module 8131 0 R /__WKANCHOR_ly 3688 0 R /__WKANCHOR_mi 3782 0 R /__WKANCHOR_mk 3796 0 R /__WKANCHOR_mm 3798 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Go_director_finalizer 4600 0 R /__WKANCHOR_mo 3799 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_special_variables 5348 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Contract 3391 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Python_modulepackage 7387 0 R /__WKANCHOR_1c0 6536 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_module_directive 17 0 R /__WKANCHOR_1c2 6545 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_namespaces 8257 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23D_code_injection_typemaps 4406 0 R /__WKANCHOR_1c4 6552 0 R /__WKANCHOR_1c6 6558 0 R /__WKANCHOR_1c8 6559 0 R /__WKANCHOR_1d0 6635 0 R /__WKANCHOR_1aa 6358 0 R /__WKANCHOR_1d2 6644 0 R /__WKANCHOR_1ac 6368 0 R /__WKANCHOR_1d4 6655 0 R /__WKANCHOR_1ae 6369 0 R /__WKANCHOR_1d6 6657 0 R /__WKANCHOR_1ag 6364 0 R /__WKANCHOR_1d8 6650 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Scilab_wrapping_cpp_exceptions 8258 0 R /__WKANCHOR_1ai 6380 0 R /__WKANCHOR_1ak 6381 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Warnings 3494 0 R /__WKANCHOR_1am 6393 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23CPlusPlus11_user_defined_literals 2547 0 R /__WKANCHOR_1ao 6395 0 R /__WKANCHOR_1a0 6339 0 R /__WKANCHOR_1a2 6340 0 R /__WKANCHOR_1a4 6341 0 R /file#3a#2f#2f#2fhome#2fwilliam#2fswig#2fgithub#2fswig#2fTools#2fswig#2d3.0.12#2fDoc#2fManual#2fSWIGDocumentation.html#23Java_common_customization 5214 0 R /__WKANCHOR_1a6 6351 0 R /__WKANCHOR_1a8 6349 0 R >> endobj 8931 0 obj <> endobj 8932 0 obj <> endobj 8976 0 obj <> endobj 8977 0 obj <> endobj 8978 0 obj <> endobj 8975 0 obj <> endobj 8933 0 obj <> endobj 8979 0 obj <> endobj 8980 0 obj <> endobj 8981 0 obj <> endobj 8982 0 obj <> endobj 8983 0 obj <> endobj 8984 0 obj <> endobj 8985 0 obj <> endobj 8986 0 obj <> endobj 8987 0 obj <> endobj 8988 0 obj <> endobj 8989 0 obj <> endobj 8991 0 obj <> endobj 8992 0 obj <> endobj 8993 0 obj <> endobj 8994 0 obj <> endobj 8995 0 obj <> endobj 8990 0 obj <> endobj 8934 0 obj <> endobj 8996 0 obj <> endobj 8997 0 obj <> endobj 9004 0 obj <> endobj 9005 0 obj <> endobj 9006 0 obj <> endobj 9007 0 obj <> endobj 9008 0 obj <> endobj 8998 0 obj <> endobj 8999 0 obj <> endobj 9000 0 obj <> endobj 9001 0 obj <> endobj 9002 0 obj <> endobj 9003 0 obj <> endobj 8935 0 obj <> endobj 9013 0 obj <> endobj 9009 0 obj <> endobj 9016 0 obj <> endobj 9017 0 obj <> endobj 9018 0 obj <> endobj 9019 0 obj <> endobj 9020 0 obj <> endobj 9021 0 obj <> endobj 9022 0 obj <> endobj 9014 0 obj <> endobj 9015 0 obj <> endobj 9010 0 obj <> endobj 9025 0 obj <> endobj 9026 0 obj <> endobj 9027 0 obj <> endobj 9023 0 obj <> endobj 9024 0 obj <> endobj 9011 0 obj <> endobj 9012 0 obj <> endobj 8936 0 obj <> endobj 9028 0 obj <> endobj 9031 0 obj <> endobj 9032 0 obj <> endobj 9033 0 obj <> endobj 9034 0 obj <> endobj 9035 0 obj <> endobj 9029 0 obj <> endobj 9036 0 obj <> endobj 9037 0 obj <> endobj 9038 0 obj <> endobj 9030 0 obj <> endobj 8937 0 obj <> endobj 9046 0 obj <> endobj 9047 0 obj <> endobj 9048 0 obj <> endobj 9049 0 obj <> endobj 9050 0 obj <> endobj 9051 0 obj <> endobj 9039 0 obj <> endobj 9052 0 obj <> endobj 9053 0 obj <> endobj 9054 0 obj <> endobj 9055 0 obj <> endobj 9056 0 obj <> endobj 9040 0 obj <> endobj 9057 0 obj <> endobj 9058 0 obj <> endobj 9059 0 obj <> endobj 9060 0 obj <> endobj 9061 0 obj <> endobj 9041 0 obj <> endobj 9062 0 obj <> endobj 9063 0 obj <> endobj 9064 0 obj <> endobj 9065 0 obj <> endobj 9066 0 obj <> endobj 9067 0 obj <> endobj 9071 0 obj <> endobj 9072 0 obj <> endobj 9073 0 obj <> endobj 9074 0 obj <> endobj 9068 0 obj <> endobj 9069 0 obj <> endobj 9070 0 obj <> endobj 9042 0 obj <> endobj 9075 0 obj <> endobj 9076 0 obj <> endobj 9077 0 obj <> endobj 9078 0 obj <> endobj 9079 0 obj <> endobj 9080 0 obj <> endobj 9081 0 obj <> endobj 9082 0 obj <> endobj 9043 0 obj <> endobj 9083 0 obj <> endobj 9084 0 obj <> endobj 9085 0 obj <> endobj 9086 0 obj <> endobj 9044 0 obj <> endobj 9087 0 obj <> endobj 9088 0 obj <> endobj 9089 0 obj <> endobj 9090 0 obj <> endobj 9091 0 obj <> endobj 9045 0 obj <> endobj 8938 0 obj <> endobj 9092 0 obj <> endobj 9093 0 obj <> endobj 9094 0 obj <> endobj 9095 0 obj <> endobj 9121 0 obj <> endobj 9122 0 obj <> endobj 9123 0 obj <> endobj 9096 0 obj <> endobj 9124 0 obj <> endobj 9125 0 obj <> endobj 9126 0 obj <> endobj 9127 0 obj <> endobj 9128 0 obj <> endobj 9129 0 obj <> endobj 9130 0 obj <> endobj 9097 0 obj <> endobj 9098 0 obj <> endobj 9099 0 obj <> endobj 9100 0 obj <> endobj 9101 0 obj <> endobj 9102 0 obj <> endobj 9103 0 obj <> endobj 9104 0 obj <> endobj 9105 0 obj <> endobj 9131 0 obj <> endobj 9132 0 obj <> endobj 9133 0 obj <> endobj 9134 0 obj <> endobj 9106 0 obj <> endobj 9107 0 obj <> endobj 9108 0 obj <> endobj 9109 0 obj <> endobj 9135 0 obj <> endobj 9110 0 obj <> endobj 9111 0 obj <> endobj 9112 0 obj <> endobj 9113 0 obj <> endobj 9114 0 obj <> endobj 9115 0 obj <\(\)) /Parent 8939 0 R /Dest /__WKANCHOR_96 /Count 0 /Next 9116 0 R /Prev 9114 0 R >> endobj 9116 0 obj <> endobj 9117 0 obj <> endobj 9118 0 obj <> endobj 9119 0 obj <> endobj 9120 0 obj <> endobj 8939 0 obj <> endobj 9136 0 obj <> endobj 9139 0 obj <> endobj 9140 0 obj <> endobj 9141 0 obj <> endobj 9142 0 obj <> endobj 9143 0 obj <> endobj 9144 0 obj <> endobj 9145 0 obj <> endobj 9146 0 obj <> endobj 9147 0 obj <> endobj 9148 0 obj <> endobj 9149 0 obj <> endobj 9150 0 obj <> endobj 9151 0 obj <> endobj 9152 0 obj <> endobj 9153 0 obj <> endobj 9154 0 obj <> endobj 9155 0 obj <> endobj 9156 0 obj <> endobj 9157 0 obj <> endobj 9158 0 obj <> endobj 9159 0 obj <> endobj 9160 0 obj <> endobj 9161 0 obj <> endobj 9162 0 obj <> endobj 9163 0 obj <> endobj 9164 0 obj <> endobj 9165 0 obj <> endobj 9166 0 obj <> endobj 9137 0 obj <> endobj 9167 0 obj <> endobj 9168 0 obj <> endobj 9169 0 obj <> endobj 9170 0 obj <> endobj 9171 0 obj <> endobj 9172 0 obj <> endobj 9173 0 obj <> endobj 9174 0 obj <> endobj 9175 0 obj <> endobj 9176 0 obj <> endobj 9138 0 obj <> endobj 8940 0 obj <> endobj 9177 0 obj <> endobj 9178 0 obj <> endobj 9179 0 obj <> endobj 9180 0 obj <> endobj 9181 0 obj <> endobj 9182 0 obj <> endobj 9187 0 obj <> endobj 9188 0 obj <> endobj 9183 0 obj <> endobj 9184 0 obj <> endobj 9185 0 obj <> endobj 9186 0 obj <> endobj 8941 0 obj <> endobj 9189 0 obj <> endobj 9194 0 obj <> endobj 9195 0 obj <> endobj 9196 0 obj <> endobj 9197 0 obj <> endobj 9190 0 obj <> endobj 9198 0 obj <> endobj 9199 0 obj <> endobj 9200 0 obj <> endobj 9201 0 obj <> endobj 9191 0 obj <> endobj 9202 0 obj <> endobj 9203 0 obj <> endobj 9204 0 obj <> endobj 9205 0 obj <> endobj 9206 0 obj <> endobj 9192 0 obj <> endobj 9207 0 obj <> endobj 9193 0 obj <> endobj 8942 0 obj <> endobj 9210 0 obj <> endobj 9211 0 obj <> endobj 9212 0 obj <> endobj 9213 0 obj <> endobj 9214 0 obj <> endobj 9208 0 obj <> endobj 9215 0 obj <> endobj 9216 0 obj <> endobj 9217 0 obj <> endobj 9209 0 obj <> endobj 8943 0 obj <> endobj 9235 0 obj <> endobj 9236 0 obj <> endobj 9237 0 obj <> endobj 9238 0 obj <> endobj 9239 0 obj <> endobj 9240 0 obj <> endobj 9241 0 obj <> endobj 9242 0 obj <> endobj 9218 0 obj <> endobj 9243 0 obj <> endobj 9244 0 obj <> endobj 9245 0 obj <> endobj 9246 0 obj <> endobj 9247 0 obj <> endobj 9219 0 obj <> endobj 9248 0 obj <> endobj 9249 0 obj <> endobj 9250 0 obj <> endobj 9251 0 obj <> endobj 9252 0 obj <> endobj 9253 0 obj <> endobj 9220 0 obj <> endobj 9254 0 obj <> endobj 9255 0 obj <> endobj 9256 0 obj <> endobj 9260 0 obj <> endobj 9261 0 obj <> endobj 9257 0 obj <> endobj 9258 0 obj <> endobj 9259 0 obj <> endobj 9221 0 obj <> endobj 9262 0 obj <> endobj 9263 0 obj <> endobj 9264 0 obj <> endobj 9265 0 obj <> endobj 9266 0 obj <> endobj 9267 0 obj <> endobj 9268 0 obj <> endobj 9269 0 obj <> endobj 9270 0 obj <> endobj 9271 0 obj <> endobj 9272 0 obj <> endobj 9273 0 obj <> endobj 9274 0 obj <> endobj 9275 0 obj <> endobj 9222 0 obj <> endobj 9276 0 obj <> endobj 9277 0 obj <> endobj 9223 0 obj <> endobj 9224 0 obj <> endobj 9225 0 obj <> endobj 9226 0 obj <> endobj 9227 0 obj <> endobj 9278 0 obj <> endobj 9279 0 obj <> endobj 9228 0 obj <> endobj 9280 0 obj <> endobj 9281 0 obj <> endobj 9229 0 obj <> endobj 9230 0 obj <> endobj 9231 0 obj <> endobj 9232 0 obj <> endobj 9233 0 obj <> endobj 9234 0 obj <> endobj 8944 0 obj <> endobj 9285 0 obj <> endobj 9286 0 obj <> endobj 9287 0 obj <> endobj 9288 0 obj <> endobj 9289 0 obj <> endobj 9290 0 obj <> endobj 9291 0 obj <> endobj 9282 0 obj <> endobj 9283 0 obj <> endobj 9292 0 obj <> endobj 9293 0 obj <> endobj 9294 0 obj <> endobj 9295 0 obj <> endobj 9296 0 obj <> endobj 9284 0 obj <> endobj 8945 0 obj <> endobj 9297 0 obj <> endobj 9298 0 obj <> endobj 9299 0 obj <> endobj 9300 0 obj <> endobj 8946 0 obj <> endobj 9301 0 obj <> endobj 9302 0 obj <> endobj 9303 0 obj <> endobj 9304 0 obj <> endobj 9305 0 obj <> endobj 9306 0 obj <> endobj 9307 0 obj <> endobj 9308 0 obj <> endobj 9309 0 obj <> endobj 8947 0 obj <> endobj 9310 0 obj <> endobj 9311 0 obj <> endobj 9312 0 obj <> endobj 9313 0 obj <> endobj 9314 0 obj <> endobj 9315 0 obj <> endobj 9316 0 obj <> endobj 9317 0 obj <> endobj 9320 0 obj <> endobj 9321 0 obj <> endobj 9322 0 obj <> endobj 9323 0 obj <> endobj 9324 0 obj <> endobj 9325 0 obj <> endobj 9326 0 obj <> endobj 9318 0 obj <> endobj 9319 0 obj <> endobj 8948 0 obj <> endobj 9327 0 obj <> endobj 9328 0 obj <> endobj 9329 0 obj <> endobj 9330 0 obj <> endobj 9331 0 obj <> endobj 9332 0 obj <> endobj 9333 0 obj <> endobj 8949 0 obj <> endobj 9334 0 obj <> endobj 9335 0 obj <> endobj 9336 0 obj <> endobj 9337 0 obj <> endobj 9338 0 obj <> endobj 9339 0 obj <> endobj 9340 0 obj <> endobj 9341 0 obj <> endobj 9342 0 obj <> endobj 9343 0 obj <> endobj 9344 0 obj <> endobj 9345 0 obj <> endobj 9346 0 obj <> endobj 9347 0 obj <> endobj 9348 0 obj <> endobj 9349 0 obj <> endobj 9350 0 obj <> endobj 8950 0 obj <> endobj 9356 0 obj <> endobj 9357 0 obj <> endobj 9358 0 obj <> endobj 9351 0 obj <> endobj 9359 0 obj <> endobj 9360 0 obj <> endobj 9361 0 obj <> endobj 9362 0 obj <> endobj 9363 0 obj <> endobj 9364 0 obj <> endobj 9365 0 obj <> endobj 9352 0 obj <> endobj 9366 0 obj <> endobj 9367 0 obj <> endobj 9368 0 obj <> endobj 9369 0 obj <> endobj 9370 0 obj <> endobj 9379 0 obj <> endobj 9380 0 obj <> endobj 9381 0 obj <> endobj 9382 0 obj <> endobj 9371 0 obj <> endobj 9383 0 obj <> endobj 9384 0 obj <> endobj 9372 0 obj <> endobj 9385 0 obj <> endobj 9373 0 obj <> endobj 9374 0 obj <> endobj 9375 0 obj <> endobj 9376 0 obj <> endobj 9377 0 obj <> endobj 9378 0 obj <> endobj 9353 0 obj <> endobj 9389 0 obj <> endobj 9390 0 obj <> endobj 9391 0 obj <> endobj 9386 0 obj <> endobj 9392 0 obj <> endobj 9393 0 obj <> endobj 9394 0 obj <> endobj 9395 0 obj <> endobj 9396 0 obj <> endobj 9387 0 obj <> endobj 9388 0 obj <> endobj 9354 0 obj <> endobj 9397 0 obj <> endobj 9401 0 obj <> endobj 9402 0 obj <> endobj 9403 0 obj <> endobj 9398 0 obj <> endobj 9399 0 obj <> endobj 9400 0 obj <> endobj 9355 0 obj <> endobj 8951 0 obj <> endobj 9404 0 obj <> endobj 9407 0 obj <> endobj 9408 0 obj <> endobj 9409 0 obj <> endobj 9410 0 obj <> endobj 9405 0 obj <> endobj 9406 0 obj <> endobj 8952 0 obj <> endobj 9419 0 obj <> endobj 9420 0 obj <> endobj 9411 0 obj <> endobj 9412 0 obj <> endobj 9413 0 obj <> endobj 9421 0 obj <> endobj 9422 0 obj <> endobj 9423 0 obj <> endobj 9414 0 obj <> endobj 9424 0 obj <> endobj 9425 0 obj <> endobj 9426 0 obj <> endobj 9427 0 obj <> endobj 9415 0 obj <> endobj 9428 0 obj <> endobj 9429 0 obj <> endobj 9430 0 obj <> endobj 9416 0 obj <> endobj 9417 0 obj <> endobj 9431 0 obj <> endobj 9432 0 obj <> endobj 9433 0 obj <> endobj 9434 0 obj <> endobj 9435 0 obj <> endobj 9436 0 obj <> endobj 9437 0 obj <> endobj 9438 0 obj <> endobj 9418 0 obj <> endobj 8953 0 obj <> endobj 9446 0 obj <> endobj 9447 0 obj <> endobj 9439 0 obj <> endobj 9448 0 obj <> endobj 9449 0 obj <> endobj 9450 0 obj <> endobj 9451 0 obj <> endobj 9452 0 obj <> endobj 9440 0 obj <> endobj 9441 0 obj <> endobj 9453 0 obj <> endobj 9454 0 obj <> endobj 9455 0 obj <> endobj 9442 0 obj <> endobj 9443 0 obj <> endobj 9456 0 obj <> endobj 9444 0 obj <> endobj 9457 0 obj <> endobj 9445 0 obj <> endobj 8954 0 obj <> endobj 9458 0 obj <> endobj 9459 0 obj <> endobj 9468 0 obj < D name comparison) /Parent 9460 0 R /Dest /__WKANCHOR_sg /Count 0 /Next 9469 0 R >> endobj 9469 0 obj <> endobj 9470 0 obj <> endobj 9471 0 obj <> endobj 9472 0 obj <> endobj 9473 0 obj <> endobj 9474 0 obj <> endobj 9460 0 obj <> endobj 9461 0 obj <> endobj 9462 0 obj <> endobj 9463 0 obj <> endobj 9464 0 obj <> endobj 9475 0 obj <> endobj 9476 0 obj <> endobj 9477 0 obj <> endobj 9478 0 obj <> endobj 9465 0 obj <> endobj 9466 0 obj <> endobj 9467 0 obj <> endobj 8955 0 obj <> endobj 9479 0 obj <> endobj 9480 0 obj <> endobj 9483 0 obj <> endobj 9484 0 obj <> endobj 9481 0 obj <> endobj 9485 0 obj <> endobj 9486 0 obj <> endobj 9487 0 obj <> endobj 9488 0 obj <> endobj 9496 0 obj <> endobj 9497 0 obj <> endobj 9489 0 obj <> endobj 9490 0 obj <> endobj 9498 0 obj <> endobj 9499 0 obj <> endobj 9500 0 obj <> endobj 9501 0 obj <> endobj 9502 0 obj <> endobj 9503 0 obj <> endobj 9504 0 obj <> endobj 9505 0 obj <> endobj 9491 0 obj <> endobj 9492 0 obj <> endobj 9493 0 obj <> endobj 9494 0 obj <> endobj 9495 0 obj <> endobj 9482 0 obj <> endobj 8956 0 obj <> endobj 9506 0 obj <> endobj 9507 0 obj <> endobj 9508 0 obj <> endobj 9518 0 obj <> endobj 9519 0 obj <> endobj 9520 0 obj <> endobj 9521 0 obj <> endobj 9522 0 obj <> endobj 9509 0 obj <> endobj 9510 0 obj <> endobj 9511 0 obj <> endobj 9523 0 obj <> endobj 9524 0 obj <> endobj 9512 0 obj <> endobj 9513 0 obj <> endobj 9514 0 obj <> endobj 9515 0 obj <> endobj 9516 0 obj <> endobj 9525 0 obj <> endobj 9526 0 obj <> endobj 9517 0 obj <> endobj 8957 0 obj <> endobj 9527 0 obj <> endobj 9540 0 obj <> endobj 9541 0 obj <> endobj 9542 0 obj <> endobj 9543 0 obj <> endobj 9544 0 obj <> endobj 9545 0 obj <> endobj 9546 0 obj <> endobj 9548 0 obj <> endobj 9549 0 obj <> endobj 9547 0 obj <> endobj 9528 0 obj <> endobj 9550 0 obj <> endobj 9551 0 obj <> endobj 9552 0 obj <> endobj 9553 0 obj <> endobj 9565 0 obj <> endobj 9566 0 obj <> endobj 9567 0 obj <> endobj 9568 0 obj <> endobj 9569 0 obj <> endobj 9554 0 obj <> endobj 9555 0 obj <> endobj 9556 0 obj <> endobj 9557 0 obj <> endobj 9558 0 obj <> endobj 9570 0 obj <> endobj 9559 0 obj <> endobj 9560 0 obj <> endobj 9561 0 obj <> endobj 9562 0 obj <> endobj 9563 0 obj <> endobj 9571 0 obj <> endobj 9572 0 obj <> endobj 9564 0 obj <> endobj 9529 0 obj <> endobj 9579 0 obj <> endobj 9573 0 obj <> endobj 9580 0 obj <> endobj 9574 0 obj <> endobj 9581 0 obj <> endobj 9582 0 obj <> endobj 9583 0 obj <> endobj 9584 0 obj <> endobj 9585 0 obj <> endobj 9575 0 obj <> endobj 9576 0 obj <> endobj 9586 0 obj <> endobj 9587 0 obj <> endobj 9588 0 obj <> endobj 9577 0 obj <> endobj 9578 0 obj <> endobj 9530 0 obj <> endobj 9589 0 obj <> endobj 9590 0 obj <> endobj 9591 0 obj <> endobj 9592 0 obj <> endobj 9593 0 obj <> endobj 9594 0 obj <> endobj 9595 0 obj <> endobj 9531 0 obj <> endobj 9532 0 obj <> endobj 9596 0 obj <> endobj 9597 0 obj <> endobj 9598 0 obj <> endobj 9599 0 obj <> endobj 9600 0 obj <> endobj 9533 0 obj <> endobj 9601 0 obj <> endobj 9602 0 obj <> endobj 9603 0 obj <> endobj 9604 0 obj <> endobj 9605 0 obj <> endobj 9606 0 obj <> endobj 9534 0 obj <> endobj 9607 0 obj <> endobj 9608 0 obj <> endobj 9609 0 obj <> endobj 9610 0 obj <> endobj 9611 0 obj <> endobj 9612 0 obj <> endobj 9613 0 obj <> endobj 9614 0 obj <> endobj 9615 0 obj <> endobj 9616 0 obj <> endobj 9535 0 obj <> endobj 9617 0 obj <> endobj 9618 0 obj <> endobj 9619 0 obj <> endobj 9620 0 obj <> endobj 9621 0 obj <> endobj 9622 0 obj <> endobj 9623 0 obj <> endobj 9624 0 obj <> endobj 9625 0 obj <> endobj 9626 0 obj <> endobj 9627 0 obj <> endobj 9628 0 obj <> endobj 9629 0 obj <> endobj 9536 0 obj <> endobj 9537 0 obj <> endobj 9630 0 obj <> endobj 9631 0 obj <> endobj 9632 0 obj <> endobj 9633 0 obj <> endobj 9634 0 obj <> endobj 9538 0 obj <> endobj 9539 0 obj <> endobj 8958 0 obj <> endobj 9635 0 obj <> endobj 9640 0 obj <> endobj 9641 0 obj <> endobj 9642 0 obj <> endobj 9636 0 obj <> endobj 9646 0 obj <> endobj 9643 0 obj <> endobj 9647 0 obj <> endobj 9648 0 obj <> endobj 9644 0 obj <> endobj 9645 0 obj <> endobj 9637 0 obj <> endobj 9649 0 obj <> endobj 9650 0 obj <> endobj 9638 0 obj <> endobj 9651 0 obj <> endobj 9652 0 obj <> endobj 9653 0 obj <> endobj 9654 0 obj <> endobj 9655 0 obj <> endobj 9639 0 obj <> endobj 8959 0 obj <> endobj 9656 0 obj <> endobj 9660 0 obj <> endobj 9661 0 obj <> endobj 9662 0 obj <> endobj 9663 0 obj <> endobj 9657 0 obj <> endobj 9664 0 obj <> endobj 9665 0 obj <> endobj 9658 0 obj <> endobj 9659 0 obj <> endobj 8960 0 obj <> endobj 9666 0 obj <> endobj 9673 0 obj <> endobj 9674 0 obj <> endobj 9675 0 obj <> endobj 9676 0 obj <> endobj 9667 0 obj <> endobj 9677 0 obj <> endobj 9678 0 obj <> endobj 9679 0 obj <> endobj 9694 0 obj <> endobj 9680 0 obj <> endobj 9681 0 obj <> endobj 9682 0 obj <> endobj 9683 0 obj <> endobj 9684 0 obj <> endobj 9685 0 obj <> endobj 9686 0 obj <> endobj 9687 0 obj <> endobj 9688 0 obj <> endobj 9689 0 obj <> endobj 9690 0 obj <> endobj 9691 0 obj <> endobj 9692 0 obj <> endobj 9695 0 obj <> endobj 9696 0 obj <> endobj 9697 0 obj <> endobj 9693 0 obj <> endobj 9668 0 obj <> endobj 9698 0 obj <> endobj 9699 0 obj <> endobj 9700 0 obj <> endobj 9701 0 obj <> endobj 9669 0 obj <> endobj 9702 0 obj <> endobj 9703 0 obj <> endobj 9670 0 obj <> endobj 9704 0 obj <> endobj 9705 0 obj <> endobj 9671 0 obj <> endobj 9706 0 obj <> endobj 9707 0 obj <> endobj 9708 0 obj <> endobj 9672 0 obj <> endobj 8961 0 obj <> endobj 9715 0 obj <> endobj 9709 0 obj <> endobj 9716 0 obj <> endobj 9717 0 obj <> endobj 9710 0 obj <> endobj 9718 0 obj <> endobj 9719 0 obj <> endobj 9711 0 obj <> endobj 9720 0 obj <> endobj 9721 0 obj <> endobj 9722 0 obj <> endobj 9723 0 obj <> endobj 9724 0 obj <> endobj 9725 0 obj <> endobj 9712 0 obj <> endobj 9726 0 obj <> endobj 9727 0 obj <> endobj 9713 0 obj <> endobj 9714 0 obj <> endobj 8962 0 obj <> endobj 9728 0 obj <> endobj 9729 0 obj <> endobj 9730 0 obj <> endobj 8963 0 obj <> endobj 9733 0 obj <> endobj 9734 0 obj <> endobj 9735 0 obj <> endobj 9736 0 obj <> endobj 9737 0 obj <> endobj 9731 0 obj <> endobj 9738 0 obj <> endobj 9744 0 obj <> endobj 9739 0 obj <> endobj 9745 0 obj <> endobj 9746 0 obj <> endobj 9747 0 obj <> endobj 9748 0 obj <> endobj 9740 0 obj <> endobj 9749 0 obj <> endobj 9750 0 obj <> endobj 9751 0 obj <> endobj 9752 0 obj <> endobj 9741 0 obj <> endobj 9753 0 obj <> endobj 9754 0 obj <> endobj 9755 0 obj <> endobj 9756 0 obj <> endobj 9757 0 obj <> endobj 9758 0 obj <> endobj 9759 0 obj <> endobj 9760 0 obj <> endobj 9742 0 obj <> endobj 9743 0 obj <> endobj 9732 0 obj <> endobj 8964 0 obj <> endobj 9761 0 obj <> endobj 9764 0 obj <> endobj 9765 0 obj <> endobj 9766 0 obj <> endobj 9762 0 obj <> endobj 9767 0 obj <> endobj 9768 0 obj <> endobj 9769 0 obj <> endobj 9770 0 obj <> endobj 9771 0 obj <> endobj 9772 0 obj <> endobj 9773 0 obj <> endobj 9774 0 obj <> endobj 9775 0 obj <> endobj 9776 0 obj <> endobj 9777 0 obj <> endobj 9784 0 obj <> endobj 9785 0 obj <> endobj 9778 0 obj <> endobj 9779 0 obj <> endobj 9780 0 obj <> endobj 9781 0 obj <> endobj 9782 0 obj <> endobj 9783 0 obj <> endobj 9763 0 obj <> endobj 8965 0 obj <> endobj 9786 0 obj <> endobj 9797 0 obj <> endobj 9798 0 obj <> endobj 9799 0 obj <> endobj 9800 0 obj <> endobj 9801 0 obj <> endobj 9802 0 obj <> endobj 9803 0 obj <> endobj 9787 0 obj <> endobj 9804 0 obj <> endobj 9805 0 obj <> endobj 9788 0 obj <> endobj 9806 0 obj <> endobj 9807 0 obj <> endobj 9808 0 obj <> endobj 9809 0 obj <> endobj 9810 0 obj <> endobj 9811 0 obj <> endobj 9812 0 obj <> endobj 9813 0 obj <> endobj 9814 0 obj <> endobj 9815 0 obj <> endobj 9789 0 obj <> endobj 9790 0 obj <> endobj 9791 0 obj <> endobj 9816 0 obj <> endobj 9817 0 obj <> endobj 9818 0 obj <> endobj 9819 0 obj <> endobj 9792 0 obj <> endobj 9820 0 obj <> endobj 9821 0 obj <> endobj 9822 0 obj <> endobj 9823 0 obj <> endobj 9824 0 obj <> endobj 9825 0 obj <> endobj 9793 0 obj <> endobj 9826 0 obj <> endobj 9827 0 obj <> endobj 9828 0 obj <> endobj 9829 0 obj <> endobj 9830 0 obj <> endobj 9831 0 obj <> endobj 9832 0 obj <> endobj 9794 0 obj <> endobj 9795 0 obj <> endobj 9833 0 obj <> endobj 9834 0 obj <> endobj 9835 0 obj <> endobj 9836 0 obj <> endobj 9837 0 obj <> endobj 9838 0 obj <> endobj 9796 0 obj <> endobj 8966 0 obj <> endobj 9842 0 obj <> endobj 9843 0 obj <> endobj 9839 0 obj <> endobj 9844 0 obj <> endobj 9845 0 obj <> endobj 9846 0 obj <> endobj 9847 0 obj <> endobj 9848 0 obj <> endobj 9851 0 obj <> endobj 9852 0 obj <> endobj 9853 0 obj <> endobj 9854 0 obj <> endobj 9855 0 obj <> endobj 9849 0 obj <> endobj 9850 0 obj <> endobj 9840 0 obj <> endobj 9856 0 obj <> endobj 9857 0 obj <> endobj 9858 0 obj <> endobj 9859 0 obj <> endobj 9860 0 obj <> endobj 9861 0 obj <> endobj 9862 0 obj <> endobj 9841 0 obj <> endobj 8967 0 obj <> endobj 9865 0 obj <> endobj 9866 0 obj <> endobj 9867 0 obj <> endobj 9863 0 obj <> endobj 9868 0 obj <> endobj 9869 0 obj <> endobj 9870 0 obj <> endobj 9871 0 obj <> endobj 9872 0 obj <> endobj 9873 0 obj <> endobj 9864 0 obj <> endobj 8968 0 obj <> endobj 9874 0 obj <> endobj 9886 0 obj <> endobj 9887 0 obj <> endobj 9888 0 obj <> endobj 9889 0 obj <> endobj 9890 0 obj <> endobj 9891 0 obj <> endobj 9892 0 obj <> endobj 9893 0 obj <> endobj 9875 0 obj <> endobj 9894 0 obj <> endobj 9895 0 obj <> endobj 9896 0 obj <> endobj 9897 0 obj <> endobj 9898 0 obj <> endobj 9899 0 obj <> endobj 9900 0 obj <> endobj 9901 0 obj <> endobj 9902 0 obj <> endobj 9903 0 obj <> endobj 9904 0 obj <> endobj 9905 0 obj <> endobj 9906 0 obj <> endobj 9909 0 obj <> endobj 9910 0 obj <> endobj 9907 0 obj <> endobj 9908 0 obj <> endobj 9876 0 obj <> endobj 9911 0 obj <> endobj 9915 0 obj <> endobj 9916 0 obj <> endobj 9912 0 obj <> endobj 9913 0 obj <> endobj 9914 0 obj <> endobj 9877 0 obj <> endobj 9917 0 obj <> endobj 9918 0 obj <> endobj 9919 0 obj <> endobj 9920 0 obj <> endobj 9921 0 obj <> endobj 9922 0 obj <> endobj 9923 0 obj <> endobj 9878 0 obj <> endobj 9924 0 obj <> endobj 9925 0 obj <> endobj 9926 0 obj <> endobj 9927 0 obj <> endobj 9879 0 obj <> endobj 9928 0 obj <> endobj 9929 0 obj <> endobj 9930 0 obj <> endobj 9931 0 obj <> endobj 9932 0 obj <> endobj 9880 0 obj <> endobj 9933 0 obj <> endobj 9934 0 obj <> endobj 9935 0 obj <> endobj 9936 0 obj <> endobj 9881 0 obj <> endobj 9937 0 obj <> endobj 9938 0 obj <> endobj 9939 0 obj <> endobj 9940 0 obj <> endobj 9941 0 obj <> endobj 9942 0 obj <> endobj 9882 0 obj <> endobj 9943 0 obj <> endobj 9946 0 obj <> endobj 9947 0 obj <> endobj 9948 0 obj <> endobj 9949 0 obj <> endobj 9950 0 obj <> endobj 9944 0 obj <> endobj 9945 0 obj <> endobj 9883 0 obj <> endobj 9951 0 obj <> endobj 9952 0 obj <> endobj 9953 0 obj <> endobj 9954 0 obj <> endobj 9955 0 obj <> endobj 9957 0 obj <> endobj 9958 0 obj <> endobj 9959 0 obj <> endobj 9960 0 obj <> endobj 9956 0 obj <> endobj 9884 0 obj <> endobj 9961 0 obj <> endobj 9962 0 obj <> endobj 9963 0 obj <> endobj 9964 0 obj <> endobj 9965 0 obj <> endobj 9885 0 obj <> endobj 8969 0 obj <> endobj 9966 0 obj <> endobj 9967 0 obj <> endobj 9968 0 obj <> endobj 9969 0 obj <> endobj 9970 0 obj <> endobj 9971 0 obj <> endobj 9972 0 obj <> endobj 8970 0 obj <> endobj 9983 0 obj <> endobj 9984 0 obj <> endobj 9985 0 obj <> endobj 9986 0 obj <> endobj 9987 0 obj <> endobj 9988 0 obj <> endobj 9973 0 obj <> endobj 9989 0 obj <> endobj 9974 0 obj <> endobj 9990 0 obj <> endobj 9991 0 obj <> endobj 9992 0 obj <> endobj 9993 0 obj <> endobj 9994 0 obj <> endobj 9995 0 obj <> endobj 9996 0 obj <> endobj 9997 0 obj <> endobj 9998 0 obj <> endobj 9999 0 obj <> endobj 10000 0 obj <> endobj 10001 0 obj <> endobj 10002 0 obj <> endobj 10003 0 obj <> endobj 10004 0 obj <> endobj 10007 0 obj <> endobj 10008 0 obj <> endobj 10005 0 obj <> endobj 10009 0 obj <> endobj 10006 0 obj <> endobj 9975 0 obj <> endobj 10010 0 obj <> endobj 10011 0 obj <> endobj 10012 0 obj <> endobj 10013 0 obj <> endobj 9976 0 obj <> endobj 9977 0 obj <> endobj 10014 0 obj <> endobj 10015 0 obj <> endobj 10016 0 obj <> endobj 10017 0 obj <> endobj 9978 0 obj <> endobj 10018 0 obj <> endobj 10019 0 obj <> endobj 10020 0 obj <> endobj 10021 0 obj <> endobj 10022 0 obj <> endobj 10031 0 obj <> endobj 10032 0 obj <> endobj 10033 0 obj <> endobj 10034 0 obj <> endobj 10035 0 obj <> endobj 10036 0 obj <> endobj 10037 0 obj <> endobj 10038 0 obj <> endobj 10039 0 obj <> endobj 10040 0 obj <> endobj 10041 0 obj <> endobj 10042 0 obj <> endobj 10043 0 obj <> endobj 10044 0 obj <> endobj 10045 0 obj <> endobj 10046 0 obj <> endobj 10047 0 obj <> endobj 10048 0 obj <> endobj 10023 0 obj <> endobj 10024 0 obj <> endobj 10049 0 obj <> endobj 10050 0 obj <> endobj 10051 0 obj <> endobj 10052 0 obj <> endobj 10053 0 obj <> endobj 10025 0 obj <> endobj 10026 0 obj <> endobj 10027 0 obj <> endobj 10028 0 obj <> endobj 10054 0 obj <> endobj 10029 0 obj <> endobj 10030 0 obj <> endobj 9979 0 obj <> endobj 10055 0 obj <> endobj 10058 0 obj <> endobj 10059 0 obj <> endobj 10060 0 obj <> endobj 10061 0 obj <> endobj 10062 0 obj <> endobj 10056 0 obj <> endobj 10057 0 obj <> endobj 9980 0 obj <> endobj 10063 0 obj <> endobj 10064 0 obj <> endobj 10065 0 obj <> endobj 9981 0 obj <> endobj 10066 0 obj <> endobj 10067 0 obj <> endobj 10068 0 obj <> endobj 10069 0 obj <> endobj 10070 0 obj <> endobj 10071 0 obj <> endobj 9982 0 obj <> endobj 8971 0 obj <> endobj 10072 0 obj <> endobj 10080 0 obj <> endobj 10081 0 obj <> endobj 10082 0 obj <> endobj 10083 0 obj <> endobj 10084 0 obj <> endobj 10073 0 obj <> endobj 10085 0 obj <> endobj 10086 0 obj <> endobj 10101 0 obj <> endobj 10102 0 obj <> endobj 10087 0 obj <> endobj 10088 0 obj <> endobj 10103 0 obj <> endobj 10104 0 obj <> endobj 10089 0 obj <> endobj 10105 0 obj <> endobj 10106 0 obj <> endobj 10090 0 obj <> endobj 10091 0 obj <> endobj 10092 0 obj <> endobj 10093 0 obj <> endobj 10094 0 obj <> endobj 10095 0 obj <> endobj 10096 0 obj <> endobj 10097 0 obj <> endobj 10098 0 obj <> endobj 10099 0 obj <> endobj 10100 0 obj <> endobj 10074 0 obj <> endobj 10107 0 obj <> endobj 10108 0 obj <> endobj 10109 0 obj <> endobj 10110 0 obj <> endobj 10111 0 obj <> endobj 10075 0 obj <> endobj 10076 0 obj <> endobj 10112 0 obj <> endobj 10113 0 obj <> endobj 10077 0 obj <> endobj 10114 0 obj <> endobj 10115 0 obj <> endobj 10078 0 obj <> endobj 10079 0 obj <> endobj 8972 0 obj <> endobj 10126 0 obj <> endobj 10127 0 obj <> endobj 10128 0 obj <> endobj 10129 0 obj <> endobj 10130 0 obj <> endobj 10131 0 obj <> endobj 10132 0 obj <> endobj 10133 0 obj <> endobj 10116 0 obj <> endobj 10134 0 obj <> endobj 10135 0 obj <> endobj 10117 0 obj <> endobj 10136 0 obj <> endobj 10137 0 obj <> endobj 10138 0 obj <> endobj 10139 0 obj <> endobj 10140 0 obj <> endobj 10141 0 obj <> endobj 10142 0 obj <> endobj 10143 0 obj <> endobj 10144 0 obj <> endobj 10145 0 obj <> endobj 10146 0 obj <> endobj 10147 0 obj <> endobj 10148 0 obj <> endobj 10149 0 obj <> endobj 10118 0 obj <> endobj 10150 0 obj <> endobj 10151 0 obj <> endobj 10119 0 obj <> endobj 10120 0 obj <> endobj 10121 0 obj <> endobj 10152 0 obj <> endobj 10153 0 obj <> endobj 10154 0 obj <> endobj 10155 0 obj <> endobj 10156 0 obj <> endobj 10157 0 obj <> endobj 10158 0 obj <> endobj 10159 0 obj <> endobj 10122 0 obj <> endobj 10123 0 obj <> endobj 10160 0 obj <> endobj 10124 0 obj <> endobj 10125 0 obj <> endobj 8973 0 obj <> endobj 10161 0 obj <> endobj 10162 0 obj <> endobj 10163 0 obj <> endobj 10174 0 obj <> endobj 10175 0 obj <> endobj 10176 0 obj <> endobj 10177 0 obj <> endobj 10178 0 obj <> endobj 10179 0 obj <> endobj 10180 0 obj <> endobj 10181 0 obj <> endobj 10164 0 obj <> endobj 10182 0 obj <> endobj 10183 0 obj <> endobj 10184 0 obj <> endobj 10185 0 obj <> endobj 10186 0 obj <> endobj 10187 0 obj <> endobj 10165 0 obj <> endobj 10166 0 obj <> endobj 10167 0 obj <> endobj 10188 0 obj <> endobj 10189 0 obj <> endobj 10190 0 obj <> endobj 10191 0 obj <> endobj 10192 0 obj <> endobj 10193 0 obj <> endobj 10168 0 obj <> endobj 10169 0 obj <> endobj 10194 0 obj <> endobj 10195 0 obj <> endobj 10196 0 obj <> endobj 10197 0 obj <> endobj 10198 0 obj <> endobj 10199 0 obj <> endobj 10200 0 obj <> endobj 10201 0 obj <> endobj 10202 0 obj <> endobj 10203 0 obj <> endobj 10204 0 obj <> endobj 10209 0 obj <> endobj 10205 0 obj <> endobj 10206 0 obj <> endobj 10207 0 obj <> endobj 10208 0 obj <> endobj 10170 0 obj <> endobj 10171 0 obj <> endobj 10172 0 obj <> endobj 10173 0 obj <> endobj 8974 0 obj <> endobj 8930 0 obj <> endobj 10210 0 obj << /Type /Catalog /Pages 2 0 R /Outlines 8930 0 R /PageMode /UseOutlines /Dests 8929 0 R >> endobj 8926 0 obj << /Type /Page /Parent 2 0 R /Contents 10211 0 R /Resources 10213 0 R /Annots 10214 0 R /MediaBox [0 0 595 842] >> endobj 10213 0 obj << /ColorSpace << /PCSp 4 0 R /CSp /DeviceRGB /CSpg /DeviceGray >> /ExtGState << /GSa 3 0 R >> /Pattern << >> /Font << /F8 8 0 R /F9 9 0 R /F1438 1438 0 R /F86 86 0 R >> /XObject << >> >> endobj 10214 0 obj [ ] endobj 10211 0 obj << /Length 10212 0 R /Filter /FlateDecode >> stream xœíZKoã6¾ëWð\`)¾€bØN ôPÀˆ=Ùn‹E³¨»‡þýR"娤>F²å ¬Ä2©y}óàhœ›Ÿ~g~e7ë‡Øcz_?4‚ #â‹u?ãJÆKë4—¾{±Ç§fÏöͶن¿û†LO˜ÞÂæ "2üúø¥¹‰Â›¸ò°þ%\ýÇ$û9|úÌ>üÞ>&~Ý O󦻸;^$é‡ã«nó¯æ×Ø— ‚ëùvßY/l«ÍEzì¤Ôÿ“"a‚yçZ%‘쀳ìß?šOÙ3+Á½$mœ‘6\;¡âÇIì­ìø+«™·†…ߌ{iã4Nt)£V‹euÑE–‘hmÓÐ*⦠ÿεwàt1pÚÓBŒT‡Û%– €œ¸3鯧ÈqÓ!AbÈß$f»H)Ï¥`_!\íš›{ו½Ý§.´:‰ñm÷Ô´áC—ŽØî#û1Ðû÷l÷¹±\øž±ØÆu×ï¸ÃQ¿ Céu$õÑ­˜ ­áŽèwîvËlõu[5éAM mm3[E\hyï<²2w›³°´‡…vÓ/®UOz¤šîwˆ¸n 'Дìo“ÒÆRÇ£r+­f/”âVÓÅ™Œ¯‚±d‘·è oUhpTh¸S˜CÂsL V¡ÄGOŸ áP9 Ïu¦C; ³± äfÐNEƒö[Ü‘ë3hÄë`5À^Pp§Bµ>K 1XÁè…TYæÑ`{`–,‹ö)¶GzHc—ª5ŽÉv¬Ðõ…Æ(3(Û’Ï&Ýæ+I-S»Å+>#’± ¡–mNà˜2¤¸Š:oPHpÓŠŽ(ow,÷.£Q„¸¥FhŒ”S˜!’ív8š&°W¾@«bRßP*²êˆ‹”ÐÔËä|¦HÐ ìÏ#VzŸ…lê4üHo€-°Ð‚ÕJ0@TSWrÌbFjº‡_­7î¬CI³yžÊ¢Q>§ÛÆ4y÷YiÛ\‚PƶÂDØIŠÜ¬4l-—Áäå¾»XÀívn %~Ð~Š®…Y×nÈK° © pSt…óø"‹§sÈdN>ÌÇf™À‘˜Óãf‘GõŠï1âÓ‹G8®&%mL;ÇY¿“Ú=h7cìÓÑ02hP¹àõÕÏ «òCÃ#õ$†û½^¥–éSp¿`T½ù|W,̨,%íeª’×x4ë†V•!àœ.o‰6l&ðÖJ“ÏÁÊpˆ¿œ/ò 3é·:e®¨x#³CeN›qyãsÝ ïð˜å^<#ƒ;•ÉœÅa9xv¥àô¬2ﺿv€4†N+Bç<¡Â&£RƧŸiB6þÝÃòÿ7QsD•ôåYŽaìñ¡òdxüÒI‰ö´†ÃM~¤!jË X£+¤åvüYÝŽìÄ`PŠKŸU·tükn¢kóJ3&ÇAiÒ7}’K¡N‡‡+È-ùñÊÞ›Z° ïMêÒÆvÙ‘ú™y4Écsl?]uݵÔdO«Ä˜¼v~ThpTÁIR†¸°Ùxz6(®±7ÒcÙ˜n8R œ³"Ê‘›"âñ½f~TIýÖùSÁ Ö5,G® 7œYØ—ƒo,ë†S÷?YúÃÂfF8•ÓI¼ì)\í–¶lÛü³öÖú endstream endobj 10212 0 obj 1264 endobj 10215 0 obj << /Type /FontDescriptor /FontName /QXCPAA+TimesNewRomanPSMT /Flags 4 /FontBBox [-568.359375 -306.640625 2028.32031 1006.83593 ] /ItalicAngle 0 /Ascent 891.113281 /Descent -216.308593 /CapHeight 891.113281 /StemV 48.8281250 /FontFile2 10216 0 R >> endobj 10216 0 obj << /Length1 21252 /Length 10219 0 R /Filter /FlateDecode >> stream xœ­| \cÕ½ð=÷&„-²¹! [„}öf !& 0ÌŒ3ãRÇw«¶j­Z—ªc§u·¶Õj­¯Ú¯í«K÷öW»=mk}v¸|ÿsîM3vyß÷ÈÜäÜsÏòß·s•BE%S')†¢†Ë*d‘Ò?BÏ5pNW¦žžýòÓÐ~‡¢*n˜ñ{}þ:9ŠrF¡Ï=“~î{óÌ\ôð™÷Õ—Áýw( ] Mzok|€¦(×<iÎ{xš¦ÂT ܳóÞ9ÿ†çYÜWQTΫb\èJLQâÛÅNXÁÂÿ2wSStÓt#‰iFDQGN¤È_2þê ͇¨&ŠÝX_õ#§Äˆžk¢ÐÆÆC£X3f( EåF¹¾PŽˆZc™¯­5‰©UŠ} ¶¤Nlü\$ÏR]p#7Y ð'_’¤LR«ø2I’TûMÐ/1ɤÛYáq»* ¬±Ëêqã'•ÇíaÎZ²ìŽc{-­ÈVÿ_Ïw´Y-hiå¹ÚJv|R«“fJ,miÉÞÝÁcÝúÜê‚Gíê±XÑ¡…/Ìñh´Y™iâY®äÔà€ÃŽ›œ½Ç¦ÜU]ÝÛï˜?„RDFC¦Ì޾{Sgw™cÛ¶Ýå•N[ÞÄxmuGûȳT©CHžY” z6Þa†™Ç(-e¦(E¸G H™)@íÁHZŒqÔHû}§vµn+5¨|SŸºq¡#‡Ÿ¼}rrýzP,Ó9*Ü#M-tíë‘hEùáìÓ ‡.=ñÃw¯¸ !ßôC5;Í£55cÚ¶ÃÞÝÌ9ªn„ ]•<™”Ùü=¡+U.î4çûÑÈýfS† Q¾wè7Þš¸þmÔ0ø'©)¦ö‰J“d"µô Æ‚šú=Å6ÄÜôhÿÅ‘ Q©–úÁ‰6[‰£â†›l¥ý½ÇÜ}N¹,%%9Ç}ó“®Jd±Úª ‹ì“Ÿ»¤·//iQǵíE…Õmeö®ŽÚê±…¾^¤ÊDÉ À«ßø…äq/Õð* %È„à¯J.£ÒÄ#€1Ûë†#` ßë’\â2ó²K¸+ ¹oq¯›¹¹Òôì|s ú‹Æ•“‹l(í…¬J›‘¥ÓdÒ2sµVWŠDˆ.AHš©²Ö‹{-Šl§éŠÕç˜Éµ;ESÇÕ–ì,‹E£É7_—ЧÂ{Ê ²2²’“ O[è<±n ß=æP))RdLÀÒÓ‡EY°¨6E ކ 9ôáõç#V4-ÏæpÐmå#°p©l‰Ãb±  ÃQ&8mÔfi,–rãÊÚÍ3¬N®Á¨sãâ‡Áºƒ~"殉åå^à›°_Œ>r¬µ,Ï[ànEÌÐ{D¿˜FŽ<Ï­]y¨§çÈÊÉîŽöæL¹Á8DKµ9ÙÑС«¸å×nõéæ×ºêBžlE†”>r÷öÅ×ýËwßÓÕƒ²³¬èª)°12«µÒä¼9¹k_þÛïÿz`,]Z¨Ì’Ub¨»6~.ΨKãP'Åô5Ñ~‹x¯ÃJüŽè»CC$z÷©¹ùúÆÚšÃKŸ¾Âï;b˜ºêô³Ü£OŸA{wßs×󟼾8KŸ­MàœßÞ»µ´ÝzëÏž¹òTggµç¡ì'‡GÐê³kÿqö¡û:A\²õ€H ¼z ´Äޥލµ2)®I’ œ@ÖbàzÃG<`¦´:³ lj–²Ô²A+¸’6Vé¤d™BËZS‘’9÷íבÑTR ×›ò‘¢h?×ÕgÕgeÁlµÌ$ÛŽ&ïbó2¤H°r&ðñ+ ?låœ òìd‰Ý‘I’Œ„2r¯ÅÎUNa¯“.DŽ»îœäEnéG'F{ü½¿;bAUl” ž`K¥­ýî{þ“{çùïOä"tß½H4÷~ˆ¢Á¯­37SeØfĘ¢›\qÇâ!Î*qã^‡€æb&“%òLµ¡ ƒûCér}C[¿§Zd–fès;PsiISq•»''w7sóúwç[¤rÓ¡O¥%í'ÑmM:-PÀ²~ÇÉÂ"¤×õÑ’¾\=Í<%§¨$ðÈO,¯›·Nê¸+y&y¬p¥À>‰šÇ?«ˆ3ðÎV\躜hЗesU:w4Ö«¦;Ú{»ª=ù*ÐJ½®«SÔä«ÒDúÂàDzi:-57§ƒ+ïÍÍ–mžÊáRâëÀ7è4‚¯ã-ù{¾L‹J‰Êû[-ëŽÚ£ÜÒ˜A!Gf3/ gBeMH«ïL+áz¨Ô™ø ŠlžT4¡›‡SîÖë±Áÿ˜3ŠöÊÆÆýcׯ{Ìiâ£:Áöž‘×y6ïĨcýB`÷cDÓ”I¦$ „œ(¦‡U*ºãZ³»þ@}C^á´ï÷%¥C+TZ‹U¥A»vÞµ2P“›%ISe²teÝ!ÙO— ÁzÛJªz®˜—éPsÓì¶Š–úºQóU•Î|SIM™F‡tZûŽ®NTÈ6Û®à^½"'/5 ¡di]Õ­Èd¼í«Ó‚Q¬î²;HAE‰ž­À"¡f=+¶rV® ¼ˆn5FWíÜaUŘ –ØdrÓtÚË'?ÓØàr¢e wƒ¥Ê°ÈÌͰ ¥ÊÀ®¬=2lP(jU] Ž´ë¹væG@Õ6j”šÝ… Œ…3Hƒ~˜Te“?‹³³7#&qR8VA±ØPð¼&&‰ΉºaD®‘ÒR4ã¿ç2ï‹ÅÉ& ‰Irɲ!ïÄýmí6¹Ì¡?ôzþ*ÏÁ;?zñŠž4™[rÀî0WT=å­•ƒ=åm•O—i4¨Ö÷üã£;œ®Û~ú {ºv]5áEM1I©*]ª˜a:NîÙ‹²­9y ¹Lž$¦Å)žª¡C“7•{4˶”É<šÍwØé«PMÝÊgǶUW¹k÷¶µK+Kl‡¹57v:ÕJqp,ôöàX9d*Äœ8qwsß%8Ä„çˆi_ÿPotp…0mH‘a)B'Ñ{èt²lÌ –%×2X¶þ5ǘIµþgÑâÚÒ%†bà Ëa–vå(–Õ‰,–J6¼vfóљիAOZ6~ ¹Ñu”•òlꉇ×W‚!Øb˜óãjñJkcs×­ ‡ºäØ×J’erµ®DŠä¥ÄêKÓ¸÷íIyyåNû®Ö½T%¸{º#—EÇ}ã¥ûïE½݉Ã5™iaõ'Ÿ,â«èí–jO^Î@à•o b¹¯ÅÎXõØ&ÿ“xû(ÊH×i;¹ÆFµ*C*IÎ` A@Ä×­6æäBT(„ÔLÓí–|²-¶­`ñ|Ž"K)ñXʨ1þ^ŽÎå*”Ê7ÞT!$I—É+Q‰KaÊáž+âžQ+² YåÌÍ=L.‰–zò¤©™I"Ð,±,¯}íŒØ­QÉS Õ¥7þÎu3Ï‚V•B¾K1§2fг…´4!ˆVmרz‹ã|q»–ÐHgmïj<³w]uè¡nwQyzj^NÇj=Š´T$I‘eåi,¨2EZåö5lG{šÇÊí¦:üæá Gðÿù‡ÛO"ef)÷»]f¦ÅB«Suj?3±S«IOGÒÜà ùµ%¶þ©g¾w¨_“…=Óûy’xóFÒ§ְ;!XèÞGÝF”–’—·—£€£HE©Éòl­µYôÊ=«§Â9¹2l|dþ¡|s±A–i€ÕoÜx…¨!÷¢,d^ˆ²C2Š F{™Áh4¼o•A?†ÌȰµcI 6…$ú „–Ð#Ö~ŽÆo¼a`pÎß¿²ø™é;îÍ!G÷Õ£‰ ­Ä”¯GbnÕ‚¶½ö­‡/ °ð´oòàìõ3SŸ{‚û£'Y¢ÓàÐŽÊ‚èôQÐü|Um ^ @âuñ£w!W`áD2ÉZOÐClR†v¡&;ä¹mâtÊ3Ø ßêqÑ»AÌd|§ªÔ抃k¿bä{NŽ6Ñ8úÞø 3 ˜Cd¬p{ø.["ØacÒf~‹•]±R‡2 Žr¦f×Î+îÛöì±æ¦…›¸wO—WhTùZ¬¾Nm)ö÷õ |ÁÖÝÓ™â€ÙÜÔ<þ™iQ÷U½]èàà®[î¬Ø½÷Èc—>ˆ€c9j’ˆ lRd“ÁO^!0//µÌÞÒ<8ÕÜøX$øõ @Š#R9½Int!'ü æ™'ï_‘^œ¿Ÿ3£¯ãnGS'™ËÖ®¡ïY?øN¾8Zĵ‰Q"â•$8YÏfЇ˜•~nfJ¹ã%¶mÛ¶GñT©Uf­RQÖÓ·¸kçÀà™ùçHÜûð“…wž~jvÏÞÆfk*.têÕJ$IÐv<:¨µ%Ó™8òN‹J U)Ø)g<-Ž9銸7ÄÆ–¬èî‹Þ_¹þxlÒƒËFzâ` ³s.ôJEUMSeqaÞt_Ù¼mÛHå}”[péX_Õ¢Àu®[D­1c{.6,˜X‚dÌÔAPÞ˜SH™Ùt0°Ý\…“§¦ïmiíºr:pæÌ׫kër…²¼¢ñÐÀ ŒÖ”Ù™s«S»4¯ƒfËSóôÁ Š:²ò­ßÞ|#’É 9æõ2ôh·­$/Òêž×i0-Ç6~ËœY0àL’×ü!J &$?ÂõĬOÈò™[?14²}¸Òm¾þ¦«§¦¦/ùÖ5ã_E¨»óô•—›]-ËœßQÑ=ÖÖ‚ G:f-±‰g,Ö¢Áí“þ«&;{õÃ{¿ˆòž¸ÿÞ“'l%h½õª¡ñ…CÛÊÐðЧÏ^r `(; —; ¹\&Îsˆg%ºÉi¾#§y¡“ÓVú÷(ùžþuî]î7Ïýä+{jî4º~îK_9~ ]Ï¢W^å¾Ï}ëµ×Ð7¿êѶ×Ïwzû2÷¥/žF·ÜŒ¶¡½g¯¢ø( ‚¿Róv ùJÉcT¢˜%Û›¶ö6=ÎA~“§Ð‹ “jývÔ°ZÔ²4¤å~cfŠÓ3ò]œeíûY²Rà ¬;ë_ó1ÒëÆµ4§8«6óÃxá4I©t*Ñ ½ Ãë?)*4B<þÅ/ÚJöî>4³«òÃ<µVg±æ±°ÐÒŒ÷˜ÞõNæÛpÇ”?Aïj|] j±{ Z½<³Ê•­Ðè*\olë¤ø •ùoðÿÛ0d IÏE¥'^·InOz.úBÍMÛú«<9ŠŒTº™kP6ê4iL¦Üh*«¨twA>£ïàjêM ⤥²g ,ñuë+æü۞懸/ï4h…2”¬µÞZf×B4 Õ p9±”e§äæŒ2õ±ðè…Hã~°i$Ò‡@XWðmú-®nÝÂ]}È1âÌ÷Z?úŠèe}Ù4˜ƒ3á;aNànL,¡ðe!ÚŒõ\4ÝO/IÓ ¶2Ýêp”SÓQF [RîXÿ²c¨@»~†¯¾”_P—q”°iéô[èŠé|RA*¹Áè[»…døJ º“›L¸ef· ÅœÜxGü8Ÿ]+ˆ$¡V‚[B¯ÊX21‚㔢“.™\þÒË•šu-z¼3/;ù;/("»wrß.ú÷g ÷ÃÜœÜZÀÄ™9lÉúŸÐNÕ©¥‹TòülåúhÕÍ*23i‹%cfí]ºký)†î‚,²œ£àGΫSN5 YN¥PDÇ%ÁvãìÇ"ä2ñlG-Z1K„Nßc/›ò?|¯ßçvŸ=WÓ;7ÿØ‹³£¨¡Uf ¸&;5ÕÔŒôÚŠûæ‡!ëïh›6C:bé Ï^180vÅø~„vî ÷õ<Ý7½pƒo îÞµóÍ`cý`tÖå´_ucÇöáñËzûQCýXgõAÀ'cCôkƒTBæFªÅ¼c,ˆ¹%k¢[‚ÁKÆC¹œG&î $̯éð65Ïzgý¤sÄ bOrËî{}·  ú†õ£‡½æÆž®‚ïÄ3þHø‰ûQ‰m|âºÆ›ž~™›SË<ñÁ­®ÿ¸B«C~ßWÏï×gcۚε1‚FV_˜ýÄ«§¼ë%‡<‚àcûK¤Â#„´é謲T¥6þìuÎ2ä%¨ØªÈÖ¤h¹«Ýc»ë,VHÆÆê‚´æÍ=}þš‡Î<òÑ/_|ùä,¢Ÿ¹¬ß{h¡® l¿óûK£H­ŒU-g@ßJqäm4"L°¤‚-¾Ôµ%$@’CTáäç³x†»•sU222eàUû\$&$Uô‡·f¦:ÛÑöᇑf¼­-´V¯È¦¾àó0—ÕNÐGhn邨ÐÀŽŒFïÙg᎞*±¥Ó7Óhdøòƒ R5û óÐS£ !°|YØî‘ ,wÇÅžt£Žöèîñ;.¹¨ÖÀ¬÷ÅKç_n«>䪭ɳ;ÌÕE5m•]ZýÙß>øÀpºëeîÜ{÷?ÐÕƒ~ýÂ_¹ß¢ÖјH5ªý/½´W¦Q(Á‰”9‡7Öfsõ9$+âs@a|*޳u¢)L¬*·™Ä#t‘Ž¥QqóÀ€²®ÔÖì^¶:W‰+¾e¿æÞ)MIÑëú8C…µ¾ÚÓ…š¸?Ï÷ôMБí9yŽïü©(-%]¦Rw¢_T›Ý¥¥Cô¹þ'ìåàªQZr¶<[¥‘u¢½Ü͵YÙJV©dÀ…Ëñ¹:ºº«¢ß«Ô9ÖvîUTîÎV¨²åÊ ¸u&S]PÀ<!z 05ÆÎZ°ä\P…ãc"‰I!º'Óš¦`+\Ã_Õã²Ú ¸èvïB—Ùšd•‰{¹GÌÕ¹úÕã•4Q:’f»<{PìU {={Uc¯DÂpgì•£¨òúãq2±€•ø_,Ë1àÐ#¨8RX V0Sª(,ÚÁ½™,Q*ªvU:ê·.®¾ë(³¤©jšG"efR«//ò‰éõßšìQ®p"7_©@\ón…¢:¹¬¬þ8÷ý¬ÁǺ4¯Ð½u°¨PIòÕ=¿bj!{±‘4ÏkÞÑ"{="fóãy˜jóü””b¾Q”¤ÓôÕeeµ´yw–W@2Π8ß„&Æ?ÿúD'2÷Üd0*íùdª4¨éøðÐ'êNôô Â"‡ÕåÎ1kta÷,ì;¼ë`woÿôý-m"C~¬°“o¸e ¿ÜR[1 ±— ­È™ Ò€ ­ÿ÷^ÊË™ävŒèœ è'&ôvu™}xýwÛss çýúÆ›ƒVV¥‘Ý5ŽOŠö®~útA1ŽÕªü’q$¥Íë?3ïР൬9&D7pÊAô®øºFÅcy³P׊öˆ¾Žã{‹Üè2Êr£ÒI —>Dré×¢ÿBâ2‡8)…6~µñ_â‡ùºcD›†ƒM_/Ö£¦>Ç:P†ÞvŒšÕȼv_#.3«jóØš¼qïš„É8Æ“ÒïêiQëÚó›åßs­jev ®¡“ôNZ± f¦Åë«´úS@a D'? ëq^«V@î§l ¸p9•&¸ŒŒIadF…1²ïìsm `{†÷ íÞá?Ó¾Á½¿oûî æÑp'w6½2„ÆÑ+\5¾¹‡†ø­Ec8£Ýø#çé ¸ØæÇ¤O8üÏkä¤Xc4mŽp¹‘Îh3èµ*‹^£B$»Á–½Ü¸²¸}ÿöŽ2{CgP*÷¸Ææ³äDóLÒôì³ÞX†$A–â·À“Ò_331ßA?ÐéË…EuÜ3ઇmë_Öƒ»¦E¥íRZèÖ¼2\óh@z”ZV[¯w‹{!#RCH¼¾Î=ç j¦«&uZSª¢ðó~®}n_™^­ÌHÇ•Pz€YÙ›äóOŒ(¤,;(Ê^ñ3þݦ‚„;áfKq,v&“<©ÐÄjB:Ù Æ™­>ÉckÉgMFµÊh¼¢ÏYÙ³b0óòÌÖú¢z¤2k4zk®R­’$‰ëJºÍº“Z£TëÇëëÜ=ÇrJÕª<Öj®òˆ²ÛZ½ÖJ½^ŸSnjÉwöƒíV¬9y9rUŽTÍ ò Rfw;lÕ-ËÅEº\”›]æhmÑi+ ÃJ9R«r5¹ú¬ôìt>S«2‘TJec3®©Opíèzñõàå0G+¶ž=)äÙÉTâ©6_(,Áïâ”7rNúüwí-±!ŒÚY…èQ«ÒSQÂÛ;×džÃ4Ž]›zïPØh4åë´ÒdÈq²³lÅ7Ñ×Ü;¢DÔr‹BQ‘“kµ¸›]NÔÞŵåw¶oÏÊHAŠ”ÜœÊrS>ª®Ý?3¶ Kó×M)ÑâªÏR™Ÿhn¾c VÑÇ>í»¡¿ÿ¶Ûþrt`Ü“Öji¬çB–Þ©_~é äBhc¾¸uiùñ'_zëÑ«‡vôöÁÊvXy”_Yá⌖Ð!DÞ›±jêº~ô©Ûþztp(iÔ™ êľ➩›^zù îUŽÛ˜³´./>ùÄËoÊËןݬ|0’štùærçAð²ïZ-!ÎÕo5ggq£‰•áîÍýöðÀ`T¨ŽW’&+†Ò@–·⽆±bÓy /é¹áHM϶M(ž!$ŽTço=#/¬™w1?^Ûqª§ Œ, 6oÃæ¦¨ £µ›qâ¦ZfÉfËL娜u0?hïlÆìt·´ñÛZ:Py~)*ËwØÍ‡Q<ûÑ>ñ½ ‡n8·ÿ€­dtÇÁÀ®¶’ªºº¯]ÓY•›…\½O|¥Ï¹>_jß1:}~ßTZ:2 ŒÚJ\îŽow¢ªÎ/=×ë$ñ9Ñ.ÑÍTÆÝ…ÿ‰v­¾ÆÜµæUÒ×röQtºuWŒë¹v¦ $¬B]"$µwóQ5éP ‰œ2i³ ƒéÁt=8SU×pð`C˜×Àôƒ‹î*°¨«û“×÷õ€M©rs“*¼pºs|¿»³±>³HÚXß]9¾¿ûªC jSnCsOíøDËÔþ•.u|¢¦¯¼íxžk§ÆÃÆK¿PWÇÀ!vx  Â!7Æàü§q¨êfgë0LhúàÑ*7tötÝ|CoîsW‰gMêС3]ûÇ+»ê›¤E™õîýã§Â*SNSc_ÍÄÖ©û]•^ËÄxmOsÈW7äL« iõT?µŸø±x˜£ˆ‘Pä÷ðÅ̽PÜâ©m(È,†"¡Ä…¥N¤D÷í,,Þ¹kngG{G›Ã‘m±nN^2á_¸ß;ÆÆÞwÈäǽǗz{:»Ÿ:qæÊSr—k¨G%¥Ûv–”ÊeÎ;®p:ë9ÚÚkk˜€%9½ë®3Âb«¹[-dá¥%³ó`CÑ®G9|étksÃÙÝííÓ³Û÷ÿò¹ïÝ`7ëÅi5½={;ËìÀúêŠÚ†Åõë:Ö>4ìݾñç W0&úˤRŸ‡«æÂÛ ¼ø0F†§ˆ`sè&·ŠF¹ú²’ÜE57áQ#½Ö^·A殑¡ÜòÑ îG¨p¥T0Jå×Q‚ýÛxÝÀ<&œ \øÎhÅá³qËIfib˜Ì<¶å\s=Û¸y‡Óš?rí¢,îv“B&ÊZý‰Èĵà·6‚>æ6ñWÀú¸ð ³‚œ‚Écêr*É=1…òØ›¤Ja>’Ç[±iჶÔÞž[~ÑãÚ»çᦡªœû 2Z;άu¶ƒ8žm:08äEþ² d+™oê.òEŸAý§»º¥tçÕ³=óG÷îÉÞ»7Iš\ϽqWwW':?4rìL ;yR”%+btè»éNW_wCsÇÚÛRM~§y[mÍÖAXz-ã²С&ÇñîöµOжí-ncÓêcÌ×tThtJkޏw5©ÊóHw›Eô&RiKì+h˜;Cü6¬Ø ÇÎãп®£Ëݞءòf,IBûЇGÇÆÆÖÖè´)i•œ¯§Û׿’POßf'õtÅ*jÐ+UåôÍl®tõ¨§ßç2•”B˜­Ð¨³³\èÿp=[œÍ”I+«³>Ϋ¢Ì½…y*>C§SÓ l»òiÂ_‚~ƒøU,õ&&.õ }Ì…Çé3ÖIÈdÄIÍo‘H4ÍWê­„,ÖMÉš•òbXj4lµó ¤DðÏ"ª\›`>»úý"úÞ7ÏÜÞĹú‘h/áßÞÇyþXDžÕWñÅD†>Âïw£kEôT.ÀíJP±—ôݤ^&Ê*·uøÊ*Ý?¾£©£¬\aKjmÙWR6}ö¡¶§“¾÷òÎn$ÏÜÝÑö),¨Ò<èp8’ë {š9ÿñïu3ÿ$2Cº-ÔÙ÷ñsؘ®²†VÿY܆3Ëz>³T@Œ0ŒþkS ‰%¢–Àä~Uº]?÷äsÑS¨«zÿÌóCÃ鬨²|ÏΩšæñë¯y9^}õÕoqßþè¹/‹þë²û¸óÜS_<}úTÿÁçO4ÔÔréq€MBN®p"l¤Ç¹Nô4÷S”Ï” ¿ãÞÃh†§0’´Ù؃:aÐOųã’ðÉÑ=\;õ¡@!¹Iþá°øº¿=-éIJGßÁÜ!žác òº4ú=´—û÷¹ýèœxfÝIw¯?I¿Ží²fcŸ¨WôŒMå%b@ÓŠÊWÿóäZ7U®¾&z‹«æj¦ÐitÍj×>°²@/‹ätFÜÊʱ•E/ãE®'ÛOXdÖýYøX¶üANÒ&¹ì0Â0 0GbäÚ¨1AI.!+%þy“ªQŽ(Bd®¥záj§«©l¸êDÕW:“Kù$×RzúaÊ)~…ê¤a’x”ê†{)Ü›` TMÉan—è—TÜ×Kr©|øm…uêáW.¢6þ¿ïÃÜá×ó²àw.® ØŸŒ‡k'ÞÖ*‚õà^ W/Þ.Ü>{ç k®bøàÚ}Žn“¿zøÍXà*†µö½ `aD—Sñ+¿‚µñÞÀ­ž) }#]½1 ðÍó¸ìèµà2&=LuâyÌ[HϼE\{˜Vê°ÞcÃanöÑÁ:ù0ï<–\#„Ž×á}¡‰ÐîaêA¸zÐíÔ=Ì 0ÆGi`?I•Ô'¨¯#U¡èyZIÏÑßcDÌø<È| *gŠ/?›4štoÒß%…¿äÉ_’³“‡“oL~/%%¥7厔RÛRO¦>’ú÷´}iËi?M/M¿EJI'¤ŸÏ 3ú2ÎøcfKæÝ2¥¬GvŸœ’×Ëûä~ù}òóòßedUd*Æ×)žSü.[’=’ýfö{Êåi•N5¤:¥ºEµ¦¶¨oQÿ‡úgê4fÍAÍŠæJÍ÷5¿Õ¬j“µyÚm'‘,/Àÿ5/yýu0»)1à?Ž|3dd¹ÃmšÊ “…6C…Á–ómQÂ1¥¡5B; hÞ)´%ÔÛñ1É”•þ‹ÐN¡®LÉÚ©âÑ”û„vÎøHh§SS™A¡-Mzœ>(´3¨½™ß‹ãrBfڈʔ}AhÓ”D^!´ªZ®Ú¢„1b*]^#´“(¹|HhK¨`|L2˜œ‡„v Õ’ý¼ÐN¥Ï*côL£ªÕg…v:åT¿#´¥Ìnù¤ÐΠì\oC"`K×´‘¶×45;H;‰ôûI[Bú‘v2i_JÚ)ø6Ï#¾Íóˆoó<âÛ¢„1<ø6Ï#¾Íóˆoó<âÛ<ø6Ï#¾Íóˆoó<âÛ<ø6Ï#ÜNMÀ7àr#i§'ôgö=¤-øhΓ6>ŸÊÒ|•´³Æ+É:|[•Я%s¿KÚz2†_37aŒ!¡m&ãFÚŤý{Ò.%íUÜNN€?9a¯ô„þô\2±üLiS¨j…Z üÔèß$ü²ÔCpP3¤ÝG…¨y¸¢Â(–j»0´ñ·úd =A˜o‡V+é÷þ®T‡Œ¥†áIZŒ‰@_üòû•SÕðqP¥B«‚ô6ÃŒ üÁœi€!Jf Áz¸ÂÔ|û`5GúXÈLýÔ2‚>/¬ÿ(Cçƒg¸/LÍB_¨õÿŽ ½~€)»F ,îñ˜¨°êÀš¥É|–²’ýúà{öž"bñ}¤w„’’7/S å“èEÒë穸@ \ ¸à±1Þ]Ì3^ÚB@̳˜¿’@〠?‹„Ò,5Až®ÀøÅøž“p·”ÀÏE2ßoÂÃó{ŽŒç!Áz$ôôÉö“¾i²ŠŸPtfa~ïv›çKd\àˆ¿9/ìý'”‰ñj™pØO$' @†aôÁ¾ ÁoŠPoîcéðÂó'¬²,¬ùqûù™ÃïÑgê 3óÂÊÇ¡‚ÕVJai³ŒT\¼3ßi½ߨ–xa× @íY-ú÷¶}œ'ã#d¥•‹xÁói«6cêð»FÈ:“Ð;E0øwxÎ ²8O,È<Ümî‹-’Pš×O/±uá[g‹'È-_ô_R*H´9çÉæzË„ÿ³„›‰nJ‹Í‘!ËÛ¾EBq¼þL®DéÆ6KO^«ùˆIé…2ôÏ0Ú”.‚ûÅœÃÆë‚~?Y;†Í$ù$\¿€á è½¹2Æ/D,©O°õK0Ž·¸1;ðïp?¶¯“XW—nlêXl½‹ùÈS‹Ç Jl@ôcõ8Æ1ï´žúA»Iå‹w˜<Ì„p—– šø Øó5Co)ñ5UT%åÿÂÂw9Ü•‚§¯„ËAáÈoÕ#ŒtÀÓrxR)´=”.<ËM¹ *À^s+ Õ@„QôÂ;àq¡ÆOË÷ünµí\ŽËµÅ0 Ï$F ¼ôx}‚VÌYÆÍ+xV[‚-X'‰tÈþËIJ¯ÑÞ[a­Çq\TÐF^{±•ÀRÆkã|ÜM-È.ô19å­Ö»±$!xÕIBl½§ˆn²[$4Lè³_ò°Å(4=·´¾-¼½ý‚æÍ ñâÖàŸËB@¡M³A¼oüçrÂLjó/‘Â<æHçã}abe¦ ¿x=õS‡‰fÎn- ^÷m<–b«Uy)Z"‘úR\'¦ˆ¥LŒBB ÍËÜÇ{ùOÇxì¶Éáå:‡Ÿ—Ë@Ü>E.¢8/s¾¸Eò‰Y¤E‚;¿ç YkD‹ÄNÆ¢ÂA-Çü³-.ñ1iž‹û–à "Ó  u3„1K<Æ.B8¿¸E0´Xã¶úäé8?0Þ˜.A²>ÏaÜš&ž2@¬8Ož/§[ýÉ4< YŤÀ›9˜ÃÓz ÆùÈ+TÌwoÚ“ 2wV€•§Ðñ^ꈣF¶Ø ,ë|–‹XB[l¨È×â.ÆVö’¬'”°,ž¬léâò(ÁóÕþ?ôedü¬^ßQb 0\e$š?@ÖæµŽ·áxþcÏüßÝq™p"fÿ7v‰=+»ÀãÇ×YYðOy'ýìCìÈŒŸÅÿ#¤(t±-¡ðB(ìBóìBpÒζz£Þ1¨ /Ƈ‚‹¸'ÂvÍüòêjG)|UØÙæ` LÏD#ì?â/ù}#9„í÷/³C¡9ïüƒìHØëóÏyólhêŸnƆýÓHÔöûØÀ<…¡;†ÙAo”µ²#}ìÀÔ”õÎûX0â_žaöØJ5l ÀL/½ášQ8‚W¯°WU°…}Ép(šŠ‘ñ0œŒîééjïjiéègÚÙÞ®–¶þá6¶¹c¨­­¯­Dš*M™ DØhŒ¼¸ .„C þptcÇ Èš{fVÄ ÏbÄÏN¬°+¡EjgwÁ´ï’Ÿ MD½y˜Ý ÆjÙö³þ,f}°2\a§Â¡¹M¸B°WhÚO†,ÃÈÍy> |80±…¥Ìм?¡‚H (Ä'E|2´½ì’7¸èØ‘ˆ?š8ÛÎî˜ú#‚<ÁpØ ÁÔÈ‚20˜¼s¨8 ÌO“¹^Ÿ/€¥ÅdÃDêl¸;Lh ûE/*˜ `„`2n9žDy›ZÎÐ2HßâD0™ÁûÀZ<¹ç¼+,À¬ZXÁ„Û¤ÐÖ=º¦6‘óί°‡ý²Ídh~Òž0 p“Á‘™ÐbÐR¿ÁÅ2p1úxpÒÍâ9†ÇÅq°`ƒ¨w2ºÉcŒ˜W€zêã—% Ç'L‚ÂLøc Á>Þh °c¸™-e «*=E¬§¼ªÔQép¤¤ìèNGyye%|{œÖãvU»ª¥©3ÑèBMYÙòò²}.ÆøÉÐ\¢NøÙÖ°wÓ”€‚•†£^?ˆ„æmìh`2 ôzÃ>L€òjg¶0±!DÀâR?G¢¬waÁ±áР74ïVÌû—# ^PV¡ÑòL`rT“]öFXŸ?˜µ²³lWØì]œˆøóX‹&ü€‰?¦˜¦ JA_„ ‘ÅÉIï©Å Ë4ì'2Õ0 €Út ­Ç>Â.ƒôƒ€ùü‚¸€  n¼c m¼€&`ãøñDó°èÃ…û!B ·¢¨ÿ UæJ endstream endobj 10219 0 obj 13127 endobj 10217 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /TimesNewRomanPSMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10215 0 R /CIDToGIDMap /Identity /W [0 [772 552 440 440 276 276 496 496 386 936 330 716 248 662 330 716 496 772 440 606 496 882 496 276 496 496 496 248 496 716 496 496 496 552 496 496 716 440 330 496 496 716 716 496 662 496 496 496 496 662 496 716 496 716 606 606 440 716 276 559 716 330 496 386 716 496 276 248 330 330 179 552 826 559 476 476 772 405 276 496 496 606 716 330 559 559 537 276 276 330 716 330 330 199 465 544 496 ] ] >> endobj 10218 0 obj << /Length 1036 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0060> [<0053> <0065> <0063> <0074> <0069> <006F> <006E> <0073> <0057> <0049> <0047> <0020> <0043> <0072> <0044> <0075> <006D> <0061> <004C> <0067> <004D> <0064> <006C> <0076> <0070> <0031> <002E> <0032> <0056> <0033> <0034> <0035> <0050> <0071> <0036> <004F> <007A> <0066> <0068> <0037> <0048> <0077> <0038> <0042> <006B> <0062> <0079> <0039> <0052> <0030> <0055> <0078> <0058> <0054> <0045> <003F> <0041> <002F> <002B> <004E> <002D> <0023> <004A> <0059> <002A> <006A> <002C> <0028> <0029> <0027> <0046> <0025> <003E> <007B> <007D> <0026> <0022> <003A> <005F> <0024> <005A> <004B> <0021> <003C> <003D> <007E> <003B> <005C> <0060> <0051> <005B> <005D> <007C> <005E> <2265> <2013> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 9 0 obj << /Type /Font /Subtype /Type0 /BaseFont /TimesNewRomanPSMT /Encoding /Identity-H /DescendantFonts [10217 0 R] /ToUnicode 10218 0 R>> endobj 10220 0 obj << /Type /FontDescriptor /FontName /QCDPAA+ArialMT /Flags 4 /FontBBox [-664.550781 -324.707031 2028.32031 1037.10937 ] /ItalicAngle 0 /Ascent 905.273437 /Descent -211.914062 /CapHeight 905.273437 /StemV 73.2421875 /FontFile2 10221 0 R >> endobj 10221 0 obj << /Length1 14568 /Length 10224 0 R /Filter /FlateDecode >> stream xœ­{|S×½ð9÷Jxaclf\ã·eYÞo¼÷bX–®,a £áÁ60HBÃÈÂh)’8Mâ Rš&iR’’´M“6«¯i›¦Mçë{ëúûŸs¯,ßû¾gý®ô¿çþϯsIFÍA;‹PCKj†ÿ§°r®ö~Ó¨þ†úr4À¿Dhñk^£Ó'V/G(â<¬e`!ðf`9Ü÷ѳc¤°{Ñ4BKdaÎdÕj xBK ÃfÍÈ ªGUpÿ<Üs™ÿîχûŸ„Ù |’#$H® â/{é™ùs䌟Œ!@}ÓÞˆþÍ!_uV‹#nfZþ¾Ð„•ŠBüt1Â333‡!JÊ a)Š Ž Ž/Œdhšc_.–£[ˆ“½ ,Ñš™_ɾ’¿J Q‡…ÃG™¡Î‚Of\¬û£Î¤+äi¸‚,­Pø„. ·ð ] ðQøÄùÔ5Ϥ¥ðº­–ö¶•ñ8>¡'ï­·J.*Ü4räìÖÍe¥ò© ¶Ž O54娿þªk{aAiÙ–m'Þܽ·¶d©¨LLŠäòrÊÊTʨ°ŒÔ¤¬–&ÞÒ×›‘Ž3UzýXà=•¸¸¤§1#33+>¯{ÓÙoÈÉÃ8/×i'-BH1$ŸB As¬ ÏRÃÏ|ø Qâ(ç£Àø¤°ùO£«ýpøoßkˆZ’ü«ï –…·ã C„ï˧¦‹Ž?ðU4û‰k±ð»¿Ü3É>y³B¶öžH}Å­³„ÇUøEÊ`eðÕkò©›°nžù•ü°&ñ¦*&˜˜e1‹ŠZPéeAjCòí¨„`¶–1ßwìø£^~ª»»»óÂùŸÛ¾º:ördzF÷ËžÞ¾ÜüÈì²Ò±‡·Œ2E±ë3(¿¶çÊåŸþdêùžn¥ªgÍiÖ’â¸0ÿªU ûN~o×xq Æ©Ù8d,ÁÏ33‘=DZÂ$àçŸ}–hÕ>ó…,Lþ*Ê–bA B©Hø(ÔbXdJrÇy´!Î'AªDA´O.¯©6mëêhjÞ¢¬]0ßϾ¦—–•!“‘Nç“#¼N‰•JÝΪ*|ÏŸ\Û¶ïZø`iîêØµ¥©ã“L~þVmI1^µjœ›äµJUg—n}}}ʲu뽺{vØAÚ)y/ºN} R†N]¿~1¨uæ×²`Ð!ÅA4pÝqÊ{GCB1̃ƒD}Ú²2 §‡º:ór##!ÌŒþhôðnoÙº¹½µµ}ëÖêµÌû˜}ôDGÆ)é=Ûw~(¸N<ÚÖqü9|B8:422‚ Ø82„{@Š“33ònˆ(†DHd†w¦Ðl‰‰ÓLJ´¨È“øïßêÞÖeÏˉ‹+(¬\ÍÆ…§pÎý-MåàËšº†‹ÂäS¡KkµÇ|íñ±±ÖöÔŒ…‹ñ¥ˆÅåNûã_lݼrð.›ù,NVˆ‚Q¤hå,gªû)Åc©c}ÊÎM¼þÑ{ Ãû?›ØÿBWçÄîîNŒ;»wOtv1!8öÞ!|è>×;Žáâ’{áÀë:½^ãµ~Æ:üÐ0óö÷À/ üîfâ‰wíQ`ãpˆràËæ?µlhäÉÆ÷àœ§}ÿE«™»¼¸°¤k_k;Æ-Íã ¿w‡?×of¾ÇÆJŠ;ºØ ÎÒô½ÿAo.)&±º ¸~&‹EK!ËU”'Í3HÆ^E nÙ¢­?Zߨ›0ÏoÒ/([ÝÔTY±| ž|d2:*[Õ˜é`»ž9˜^Ÿ°2¾ºb“së#B/B>± UÍðPwý£:…G‹9LòW¼‰¢é¼÷tzkó€³n5·õíímÏà ù)©«WOâÄ$]]Ѫ%Ke±GêÓRpzFÇTG׳®8æ„)-eÙŒ«kϺŽ1OäçÇ'ÔÖÝïú¼YÞ\rD h/û‰Ö ^ ˆ”GJ±ë¦’‡Fžÿrbßþ}ÿxï^<ýß®Î=}•®˜¦uÇÄÖ–vÜ~®«û¾CX†ý޲»¬ãæÉ ì¯(wÑ Jw ƒÒ™î*JŸq~ÜÛÔì;–™Uåhn•Å»¼"ZS«Üâ²3{ÌÙY‘Ëqõê·]/Ýè™?1+åº1áRëPG©”Áà²Ð¨`±&2A‹ëòú²²ÂÂñøø3Ï>‹ýæ„/HXzúT0ÆÜreúYF{+LÂÁ®oÔ……ûbè| ª›-©3ôêÉdR£RÔ¢|¤:&&ÕŠÖâ¨XVJR²Ä´ðaóùžµ®¬]£WäåTeš>4`eùÄŽ¼Â%W³Նþý{Û[Aÿ¹þ¾Q/- ë{Íš’ ¹‰³³ŒýÍM±Kð®öQí­{ê¡0Ç-\ígN)À‰)ƒ +Ëccðr.-£:uø·V•å«ñ' Á!¡1ñ)Uii85©±`ôš—äÓ®£ µ[ÊB|OLNNʾz÷Ý[¡²X]Œ>Ü‚ è™EZBE4P2·&KŒ-Ç6¦9d›‹ —?Y¡×õ˜Hd Ø3&42ö6+yW{OùRÈÓj&<º¥ñá¯ÛZkë6磌Ç/ÌߺåÆû›7GÇ4·}çLJêÒK—Š ´½½Û¾ë°é7ÔT××ïyÇbr]ìjm_»þì¾ÔŒ4Ðj1p­|QUTXIc€ ÆÌQ×8s⯿>)¨ðúo²ßž^ýMá4#cޏ@î6˜]"å‘Ì ýŠ”•»µÆ…D†F²4kC¥ñ¤íåкZÓÎînÜÖyOGEeÜ…Ċ®çv~u|ÛþõMèE;‚ö—Wâ>ÍÙ‡º:q\Baó§‹ÂPÞ½ç‡oÞ÷ ÆAæZà ‹FYà…§»-E­Dúa#®`wYr›•½õÌ¢ÄÕ:ŠÛÓ2pñúµ†gvlùý†ñÏÝ ÊÄ—Í®lœWYѰ±¥¹©ió¦¶vYKà†´ZœV44üsmZÚøžû‡†‹ŠðãßÄ[ðùkç5}ÓŸ¬mkOL^ÓsêXWGGØI“?Ž‚ÄŽOj„"Jô²†}öàÄþš¬y/°%Å›G÷Én^:pä¿þ[˜~ᣋûë¿8ÑÖ =uh»¥¡U /)´±^ŠJý…f¬‡øHŠJe1”ÓÙk oبʂ6~õU§gf™÷VVìÞóSÒðêª>\V:Ð_¶ —–ë ¥e¹86ºªªe¬µ·uìÜÑÜÊFÄ×Õ œ²˜­Oékêâ“5}/oß1¶ý;‡úzq«aÕªUŽڲÒU¥=®žºªª¸h+ccím­­¤:´IÚ¬D¹^q#¼T,ȼ&V…à wãÄRÑõǵÁKa…}ÍÅ ñ8kízÓ··mßùÆ¡‘¡Â‚‚ÂáM§/™,Ìš[í£]d”ØÒÜ€[‚6©³qlLI‘i`£ÿŽ̬ññŸ~²o×ÖºWø³ðëÇïèè]Ǫ‚±IÓ÷ÈŽ. ƒ©ÅEÐñž‚ªVäžÎÜÑî=£{ϘnaoŸÓ‰*EOÏ+/ݲ%?gÆ~½¶,¹<'auUË–ÞuÉÉÁWüsò [3U8<,5bü•ºÕI‰™*­nË»& .X2“£L//ˆ M.)®¯(ÌKX]PØ¿°)5æNuÔ’¥!~Q™ËWõt74&&µ·vƒ^Bf»*È«k1ô‘Ýg ²2‹º×®Z•Ÿ’²L{z0&:÷ñ8¼"º¨×æúñ_Å̯ÙO¡^„¡X±÷ûÜ1aCQÄ <Ó+!Îfó¯í0äæ©26ìê­©I}ÆÅµ· µ4·¶nmhÚsWVlÛrîä®±òòø•ÅLàÍ fþuûz_ÿ°_¾ ¼OB&¹€w™;`®sÛXÀ ÌsLÂýõ««“1Þ&ðæRRk3v ûäS8 $]Ù³ÆôÒŽ]Øu‘Ÿ²|GOiqXáS%aº)„ù‘tý`©–»Ïa*QCµ×HÎ&­¬©k}yb_vÖ€qÛk¶3®Èö¶Q{K3îèr:›Z#3'/.?†§vl_UŒ;t³”½ôoß|ß´ky©ãÿ4\$žl¤SŸÔïÝ~Ú;¹íÕ¡ŽŽØ˜ÉÜü •˖ɧ\¾§¤6·<ìZÏœÞ[X€ã+ª¶¸^mºÁjþp*ŠC‰¤zx:ñ]&ÜÓaXèoø§ ^šµ~ÍÒ%Í-CŽÚº…/,ܺùퟌmÇÉ);»Gâç¯ccôü u¹y‰0+§åªª ûÅìt>ÖÛÔl¯‰MM3 ÇÈù`Æ'ã.ÐOŠÂp"d#ÙH–ŒN,£¼Át~ü-×ç?Äz°2ri9×á—„2¦}~äà=`¡y`¡?Áä ÕT‰±’ …j5@Qlž‡Ç…??›¼41ö™„ûñ=”+|ÉÄcáï•i«”·×;xu—°¬²W0Ê"ÁÇ Q‡g-.ÖÈðP2=}ê^°¨´x¸vMDNzKd~÷]ö¡7¨*’çŸðÅ+¢zûLëÞ#íËÁ¿s©1˜( ?òËL½1-ȧnÉ¶ß¬í¸µp“̇¸öõ¼7 “?)˜^ùe4žô»‹,Ö5n°´ 3ä”Ä =ÐK—Ósn46g |‚hذR·TK©Ž“Ÿ´=¥éêÈQÃy`ïÞ—_ÞÀ`Uëá!¾-Îá¶v(%ÿy&¯Šjo¾~à>‰^m;€±AÿöµZ½XÊ4{¤/JK… §¯xØ8×/N](’)/¼pJUðíËÂä‹>éþeÐÛŒÅuüíëŒþÖGÌ–g§ß%Ô"…Fök ¶21nvP{Ì ÍsÛä&çGG‡ÅÉüóµWF-KúIÁT^PÔ¦ú/@a‰‰˜·TïzÐ9¶y˜¸õæ•’îø•ø‡Så<Ú?H÷ÀôÝT$ÔV n9Ž£qOjø"˜t±üE¡ý²Ð úóáʆGØiðÒÛ·T²Ïnq@Îì?1kIbDaœð_ ðÕO„ÓÛåSÓ/á+ÂKÇ,ß$ôÀ®4¨ÂS´òÑ)›æJˆ°T¶_ˆ\ºtó/eGgfd_Òwgñ(ÇÓáB¥—<îò‡Å·Òø!u>ï·G™Øóz]^ŽRÙ¿»ª޾Å%ëûî¾ Ʋ«ãb Ÿ¯:!ü ›×Å–&'/]‚W&V×Þ#\‚¾˜˜Ò³N·¾¹E·nývCGWZ¤Øæà0¥²®:[‚…rWžã·tIVfeSaÞâ…‰§!`7ô啞7.îé4<$Š•æ¤¨(·°´ùDžfö¿¦ç¡]éø÷kZëfþz­=+{eRrdÍçøôîšš¸¸šº3Bš|*.AËœØ`ZUï„“¾«²|é?…ËÉ*ñÒÅ…ù•ýe¥ÐaÎ8—ÖÔñ”†Õâ,BÞMƒÈžIÁ°BÅ©#"&•%ÇV˾¼qãï› „1÷°lÍ­G¿WËÃ1–A}Pƒ?–ÿ…Ò7YpŒˆÉ¸óm«:H¬¼âYœ¤—ï»XýÖ¹³ímÝÝß|ì•wÏžki}óÞC|tïÁüB»óþw8¼…M?¼ÍÅ'þÙå+Ýk0æu—.^þvìAüðƒxÉÓ{w¯®>x/ÄÌÂ'xºNÎ’äÛ÷‘ùÛ×ãÚ3r""Øë×7–WÆÔ-ÌH]øç!Æv»ë ‰0rg?žþ‚¹âj”O]r/¹ô$ãÎæoÜ1ìÆŒ =#‹ž>É&Nÿ˜'ØE…€K€}l±°#`«TŸ¥«î>¤ÆËz¯áôŒãï¿»s\}-zEgÛ¶¯é\xêã»[`Æ›Øý[¶aúé«ÝkàÔÇ<òºyåô Jª‰˜—JÌ”¸Þ|oMæV$㯻®A:~°cpdD–MÉÑÐÌ÷}NAµž‡8è*YCbÅ÷îó–ޔϖÀL_B{ÞÊ‘ÖªŠ¹m76Ý·¦»gíî=pÈ)KLNN^Uš’ˆ““K1»âðôçG˜M¸±þ8AZ³— å–S¤òd‚$ë>a1c¬Ñ½2¥ãµ¹y¤oÉs>˜—sÓî3÷ïÿ…°š%Ì÷½é¤¹³H`—s æ O¥!=6 ¾Ï]cn^»æòRýÓ “ò3®:À> >] Ør ;ôè5æ=˜(þr l<ó9Ì;û…¯H/g¡ú,—]Œ;wº­_ ûBĉÊm~÷Ëú¹ŒZðÿ5ömŽN+Ãqï»\Lâ…{9.cp3ͼ"L8‹:ñnWÝôß¿dUã2ÔZ˜]dW€*]œ¥&%+"C˜?4TO¿#[<ýý.öü$û-ÝêK—¦ý— çB¡ŸuG#ଋ j¨”!°-DÉ’ z/KÞ)D…‰1$²¿ã«…?àÔŽ£8¯ãXÇ¥·kp˜ðƒŽ£íÂëNœ[#|o~â8‚/ -ä:"9"´ã'„v¦ݳà4£)ý޹‹/.g§¼ËŠlµ®Z• ¥ïNLîí»Sû£ /â(./gûçéE/èô™*«•Єy’ýt³@ª¹O”¨y–224ž9çèXë;Ö‘üÕavŽÏáa׺Ís†}›…&¦´Ïøô%®R|„ñ§Gú ¸®û¥±M±…+’0Nš^tMãÀ¯?rݺѹÿèK/ Ë„H‹‡NH _*¥™À5†WâĨüøÑ±{jq¿AhŸâ_¼8ut÷{·\}-üyÚEg?r}/ fÙúyùÿ)ýÃ×m¤Ò*† BÒi@úƒ=ŠB¡•Œ'C”’÷_•,ÉÛÑÅA´ˆÉAW}r™y•Èì¨î§à· ~‘ü tà2Bð»Ëç ´~kàÚ Ï£áw5~MÀï§påõ˜ì…«. \-ô¡" ¿à àKhVpuËÛg\ð|¹Z»€§žð–]D6X[p¬=8„ö€}ŽYŽÃï„ì?PÐ< ë§ñ3g@-ìyÖÏÃú²¿sKÑ0Àç€ÆQ™}æs²8 p tÔpŃŒ[È6 EÛÐôÄ؆·âWá#0YÌFæ4óÍ6²ÛÙ¯XA.k—Ù!Ëò8ù!ùo}j},>}>S,UT**žT¼7gÁnŽnŽmÎþ9?Ÿ+›»xnæÜsÏýÁÜ?øúú.ñõ}Å÷~Ñ~ù~M~¿ã~ÏøGûçù¯öïðßéÿˆÿýg"ŠúD¿¢*TIj‹twç_[È¿x’?~³ÓJ0ƒåŸH0‹ÖÉ_•`™Ž-”-Á>(Ðg™+Ðk>I<Å*¶Hð\´?àœûÊ®QÎöC})ìô÷Ip€Ï¤Ï%8­ üÛ¬.Ûç5K0„ç¼?I0ƒóK$˜E©ó3$Xæ…#Gþó«%Øð5¬@}ó <…„Ið\T-Á¾ŒfÞ öCéaF öGʰ‡$8€ížÿ–¢”0òonXÆ‚lþa·(,8(ÜÂ>d=<‚ ºGá9VSx®ä#}$¢DXô‘˼pD‰°è#}$¢DXô‘‹>aÑG",úH„E‰°è#ûzéëGu©¤°¿×z Õ½ƒÂAD—ð~ ‡« yf¦ô<4lÀg@’V#Ù_Kcš“âÞm3åÝOWÅýÃðÄ(ùà˜À÷bŒXỞ IÖ)xrYC}%FGm¨•ô7R¯™(Î Í31-t§¨‰wtg#‹ƒç#’gÌT›¢ßìR&›få0Ó;Oô:î¨7ö;ôÓJ<ú('µ´î¶ØäÑFXw[–ĶvVC=mŽÆÀµ­Æƒz£ÖëDv1ßI.%Íf“]Š2O=Ÿš©G4hÝ/JMèjéSO¤‰ÜuÔZƒ4KFgµpó&û‡és µ„MâArH´¢ƒîwKì¦>HcÈLk¨[¶”»êjîm^#õ®ŸÆ?ñn.j—ø¹k-©•ÙðÍÁI¢ŽúÀFóAÌ£/Zuמ»'iœÛ¤¼7Sê³>þ­ù¢_ú¥JÈKõÍS§DªmÐ8ÔH÷s(–ò«ƒïà­§‘붉M;µ¶A¢–‚꯺G\¥ `•쯀ïZº^+-ðMr ¬XŸ:ºÚŠè¿_ûR-RÞÙCÝë¢Ä¢ç%ßzránûˆ=Ï 6°Ñè0Pl·>îÊ>útð³<µ³5T´“îõÔ>^ÊR¡<õZ¬F©6Û¥ÚÑO©ð³µ—ضKâFªÈT³ûf»žÈÓñ/,㎭áÙ*ÈK™ÍÏæŽÖ)‡T7ôRÜÿ#{¹³XŒ÷¢â©wóÓIñEb¹V`Qê>É3‰ò?òPÕêvK‰•ÿ›³»†’j©¡¸š$kÛ¥ZõÏx§ÐØ·xÕóÑ»|ÁKÓŒwæˆ]BC%¤–%}ËHóíßûœ“bÑâUCÝ|Iö먥^ÝÊæ5q%ÍbÛ¼âÖ3#ükKéÌ”¾;®¬·Ñ¦þ Þô®&î:ìÁ´®XgœÔℾaVQ.ïè6K•[´¿˜UƒR|x*üí1ô¯4òÄG5ÕýnϹg<ÒÛxiµçJ-õªåØî°·‡2ÑÏJ+¿Nª«CtFÞSÜ¿÷¾›ž˜“¼4kÜÞ‘Ýôîö£h-Ïd¬¥4ïÎc·Ç4wØZÿ?’Öcå»9Ü>WÜ./MËèn ¤Ë”Àj2"½1e"5ôC¾Óá.Ιp¥!rælC5f¨ÑE":ŒvB˜ Ú¬f+¥–âŽÕ\Qµf¾ßiÒØrÛa‰ÚŒ”ì .¾Î¨µY‰(V]+ý9ϵÚÀ÷fm€hü¯"té‡ ä!ÞhLj[ רqp±\k× ×§PÁx“6ZJ}CkuEuiIkuC=×PÁÕV—–×·”s%•Íååuåõ­¾¾­p…ÛÒÄ-„0(Z;¨få̳öÛ4ƒ†Qʇ?±Sß(7ju’Z¡ Ó¢£Ñ1EãbÂÑ èš~Ï“èMáº`›A¡cí#©;· C¬5LBgóÄ;6^ë€ØÐƒí=r·[ûyŠBÃbv¸"¾ÏéÒ ¦²ÐK¡8»[(þYSÌn&Ê iLNMD¥ÆQå½;…k³Ð8uk:IΔÐpöA^kÔµwkÎ-4BÉ^Ng$>†È±Ñ•D–mÔ¶´"Ü!”Éh6…€ ŶÚìb`Ó¦‹ÖaˆgŸÉh7>@K4·‚äW ŽrbÀKºµGµÞ£©x¼²Z©åmI›$7E¶¬N“buÈÈ‹%î.õ x’‡ª¡ó”ÅYA,ZŒµ‰bIjý?&KEžÝ Õ ‰ðÑ8r B[K —ÌÅggª8uzvrZfZÚܹm5°˜–žž™ ßj¥šSg©rT9¾‡c075uxx8Åìv¼ÖjöÎ ž+³i†‰- A( Ôlíƒ ­‡še…ŸD’ÔfÔ5\‹†æ†:VvÆ?¡jp˜M©fù?æRÍöõR'RÈâÿå†aÞ«ü¿ßBîR%;Rl†¬ôL tሠ™o€û/é(à~ÞB‡E2‘¡EÇ>Ä>žÌ^…ëvнèEKC÷ýç”6/þ6j”žl™,]V#«”Àw`kèQ'#|ŸfñÈKÏ „þ;»ÙH endstream endobj 10224 0 obj 8864 endobj 10222 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /ArialMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10220 0 R /CIDToGIDMap /Identity /W [0 [744 662 936 276 772 330 552 276 552 276 716 552 496 552 826 552 552 276 552 220 552 552 552 552 552 552 552 552 496 330 552 662 552 552 552 662 496 552 220 716 276 579 552 276 716 496 552 716 496 826 496 606 662 716 220 772 276 606 662 716 662 882 716 552 552 662 606 552 496 496 330 330 ] ] >> endobj 10223 0 obj << /Length 861 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0047> [<0053> <0057> <0049> <0047> <002D> <0033> <002E> <0030> <0020> <0044> <006F> <0063> <0075> <006D> <0065> <006E> <0074> <0061> <0069> <0031> <0032> <0034> <0035> <0036> <0037> <0038> <0039> <0073> <0072> <0064> <0050> <0071> <0068> <003F> <0041> <0078> <0070> <006C> <0043> <002F> <002B> <0067> <0066> <004E> <0076> <0062> <0077> <0079> <004D> <006B> <0054> <0042> <0052> <006A> <004F> <002C> <0046> <0045> <0055> <0056> <0025> <0048> <004C> <005F> <0058> <005A> <0023> <004A> <007A> <0028> <0029> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 86 0 obj << /Type /Font /Subtype /Type0 /BaseFont /ArialMT /Encoding /Identity-H /DescendantFonts [10222 0 R] /ToUnicode 10223 0 R>> endobj 10225 0 obj << /Type /FontDescriptor /FontName /QHDPAA+CourierNewPS-BoldMT /Flags 4 /FontBBox [-46.3867187 -710.449218 701.660156 1221.19140 ] /ItalicAngle 0 /Ascent 832.519531 /Descent -300.292968 /CapHeight 832.519531 /StemV 100.097656 /FontFile2 10226 0 R >> endobj 10226 0 obj << /Length1 20572 /Length 10229 0 R /Filter /FlateDecode >> stream xœ­||[åµøý¤+Û‰—†eÉÖº²lËò’ç;÷qÇ]Ê)9®«×]œ´¹ î\£Á½#?{Ïz€Çq%ÂXÀ?<ô§æ Ž+å¡­l â7(>„ç5ðœ96ÞsòPþ*xÞÁqhG04äÏû«u’ã¼OÃû'ü{¦¸íÜ ó0éŸ\wâŽàùzŽKû>‡ø3ŠÇ9Ç©nR•À zWú¹…V¥RÄÆ¬R(T VßwÅ¥ù‡:B“!Nà„ų*ØÇq1§£5Z\\$}Ü(Çñ£0±’‹J4vM–]cå¹³‚òé³5*î3NàŸæwÃâ¯ø5Ê;¹^X=Û™íȈ1¤RéŸ>%6ÆãÌvÆÄÆ83œÙ^o©¯¬„½,)ö•yaþ#íÅÐZFïz<P6ûʫ曔k›z¡{¼¢ÂäÍÍmkÕjÖc¶XLîÌô´¤Âúº«;³P©÷ä?zz·]üBS}MµN£NrYÌjÁ—m²(n±j’Z!U“d1e7·v‡Zv!M²5)& ¶ÖÆ» éR‹\:}~ª1'=M—ÖÖ²k¢u81Éœk³·7ÜÈ L: ¼yYy„Ëš•¥„?AS¬Ó•ètËZc•ÅØ5ÏÜSn¶ÀrOÁr™¦®ÎK¾´»Ãà–g ÅdñÞõ$Ú'^®xJi1åXÌfK¡ÛfCâ Æd[ms™-üB-–•oSi@N€ÞáE»ŒƒÆ!ŠûÿŽÔŸÀZ@ÑÂúV›Kr½«4¯¿.î_¨… ka1ô!½ãµêÄ^þåÝœ‡«µ¼ò: ¦/ÆéˆÐ ¢õJBg²ÕeSEЧPÙ+›ß§h8 ÜÛ.œýÅáímÞÒ†¦æ–—¯†/w®o¬A=}³s=}}=s³}=Ê®jŠÝBêD׆Ê*d1ZÌ%%Ãù©tä+?9sõU©±eª¯ÁÈ©éžÞÞÐÓÇÑŸøÅ·°Õ"»×Χœ½K¹ ýé1xä®>Íÿ„óƒc—ê+óamŒ‰•hˆ0°D¢G¯·K P”šrƒ·\^bɱš²_ûÕÁ§·ïh¥µ2Fî§Ô*žuz;jHCVkžËìvºPoÏô=ÚíQÚëQJ%ÆnzñMþ*°°Rx hÉÆáŒ28p”bßf1lñ³òd–3ÏŠµ&ϬOH(ÜpñW6£¾¾ï]ÒãÎÏs¸ë¶«Äÿ~ﲇ¾zÝ_úZ[”£È&´ä‘Q[î3yúîi\ÒÕÎ,xãj¨ÞІ.ûãG¯Aj àw4°4Њ¹÷ùºw漊÷ÙãÑJ§œgJ§àjA6;z±6;ø –s.Àp/¾ìˆW1HL‰åÇÏ>bëí>2ýD§5Çb¶ºnºåšOŽGèö[_>°s´´ÙmC¿u·wŒµw¸Ñöî¢b„Šu™A*¦lÁБ«žõÊ+P^~IëDÇÐܦü¼¼üM@q.P|'Ø?øy„$7'QésÆb4ä&À͇²)Ÿì bb ¾¨Gâ8äóYÌÀ›w€%†Tç·¦ê° þˆa1—#ø‘×dÁ¾êiì«|ö•ã‡'©ß@¯‰+Í–<ÌC³ÛaI?|8!-=ÛMxš þ8HÍÍA8Èú|û+‘ØAz@+*%N»*44ÆÜ”xœš¦ÃAïï7w´÷¼|üúû¾úHw{‡"%ÃÑØ¼ýÆ-kÚ¼ñà—6nÜ-ÞÏ,˜8då­Õ¦"£ñšk¿ûüáIC*º6·¡® Ít7÷¶wv´ƒñ¼¸øk¥’{KÜc(N’{U*QŽ«¹%ÇåÊiivåŒVe;ÙU•Nø‡½âq°Ácàup$ÒØ?—j9¹ó¢¦Qî;€2™cbTï¤÷ÁÀðS}»C‚ÍlÉIɺÔ?šåDkd?žt®@ÙyÙ–MÉ“%Ïc¶¢¸4«ß)ûòÅûN¨²ÅNƒ}Y CPƒ¿õ³›è²üH V£…ÌYHŒO€¸ P¥]"é6#ŠD¢¹ŸË Åšƒm-uCÖX…ÜìÜ\{~߯KVΖòÈ¥[j).Í· (; ••ÅçÏ™ î.À+‹‚s~a PÉL?óâÒ…_|‘Þ»h»ò½³¿Z2(3°)¸M˜w-¦ðYª“œûa¦>`¤Hf Ÿ¸J×¥gåFÅ1cŠ)3×jå?ùç¯Zoµf§{UW”jôÈlË2Á|Vˆ57‚_ÇܸÉÂÜQJ…ó‰"m|:µöïmîêniiÍd<`ûÕ-M;eÖ.Ô2ƒv»t)(?·­lz”’¹pk-`‹Ò µè›rì_ü5¿än &i‰ƒ$Ä=Ód%5»/œ`1[æ÷£šºƒ‡Ž\}É¥õ ¨¡þàÅG®:t°®î jüú‘­ÛÐ…Û¯¼òÂíè;óS5uµ5¡É}ûççêQãúðü¡Þ)´ió¬g^Àà ‰ë¢5OS¼ÂO–J.´xY\Œr¡7ø뺿³«o©sÌtoo.-ëé2±(è1t˳Ñc4¢© ®-ÑÀCuBŽÉ²I<”l­¤­>!Yv ®øöx‰l®LÒLCD¨Ò¸Õ+ã©cQ@Ï$ÌW;ÀŽQëÛ:zþxõÕèøõ?ïêlogÒuŸÜ´¹»ëØu6Dr™b—^ùá¾tì˜1ݳHýâÙ›.Þ¼iÓæý»›[jmÆž,8{àX‡1,“]Õ ocVð6¿’±GÇjêjvöö”—u=ŠþÜjñ!}Zz·Ü­†¯­N3a_ó𙳙ëtœ©˜ñä"Çg«®åü„gÑå ê€%Oa ›Ìéd̈ªzÐa&á0Î¥å¥âLS£:91™¨XËl囃»K½‚môË÷´ùÚ´å$U½ ]ù™Å&Výˆ_­·®­®ÝÝQ’áÞôom6”WRÍä_\e[¥âAë@‹MéÞŠWQ¶Õª·8š¶\wéPÀv/Õî{ÕY™˜üƒ¤¢ÏÉÕ zªr®-±Û 6Û@ÿüÜÖ ÒÊI^Ò™Ìë Ù ñ×®Œø$HÚc@È ¡f¥KÐ((»•¥œ±HPF·9o!ÒþÞ™-¥ÌW|ÎL°¶¶½û Ò³ðõ¥ÙÞÜàô`áÅNì9r±Eþj‰Q -¼ÏáúÇÿ¼GX¥ì*äÄÉàoE«bìÍÞÔbÀ ¥Ql3ÄS¿OY(÷ãIëùý ÉZU yˆ…ZÅS²‡¨°&C¾þ.D¤¯E"Ò²„Ü©wœ#gBË"nëlï~åøõW_ýÇÞ¶Ž¦÷—¦êÊþ¨€ÔÓÞ½Ô“nÇi2i5^Õ¡RS–ͪÕBô¼sñ-ð/nÈa1·å‚)ö¹±¥ÒŽ%†Õ¦øì™Ù_\Ô7ÐÞÂ3¯îèïl?³Í»c{åftaÉàk6!ŧoýð‘GPyÙ±ëîxë>Ræ»îØ'/nlŸz뮨cænÌíàö—ù7¸R[ZîÛäR ,-•Å¢VêFüõpÊ»t†Ôôê¾ÒÒããR\-m-ÛÚ;+«‚;ŸÞÝ]àµé´†Á–»öƒ·\(9ØyÆäpå8+‹‹ðnèëÈZŽAšsÒ¡I‘ƒ©¦¤4ZSp#º^ϼIÕR”'˜_Èxˆ¯ÕBY…-ýSüYˆýÜ2ÄÅ‚“Çþ—øZ—§«iHu£âT\ÐájAÒÏ‚¤[1Ö1‘:(QÂ,Ìæ¥¸1-މhq±Ï»b7Êï:²chêÖËÆ×¬-.¹èN”ÑÛÑÖ““O9+-%1Ym®oìß·¥Ö[¶cûËW‡_f 'çÅ¿¶AÐr;Ê}Á—_æö×Rk2²@`—á fHò–hÍÆTT”}ÁÖàõwôxEv³à8:¶èTîP^:œN÷x©@€=‹Iûå\iÆ…‘æfWŽøR‰¿¶¤§«µ(N!V?reW•»œÎœ…ĬŠO+ždk¦Ä.ÍRi²ùÄŠ'+ó7ÃÞ2+& Ã’ÖüLKNÝöLúðþÿ¸ì¶°É+ZÜ|Óí߸ù¦s,xEǾ¦Àà6ñae3JáVãL5„( (CZñõtgº6¡8”²ðJ1Ò¨S“ÓÿqŠ;•ñ?‡¸^aWJþ3ŒCqµ*µ6ͤÖðh˜¼c{U^Qašå45¯ Ü*cL­(é—{×mpå ¬ªõ­Á×Î(3Øw[”•]žßÚÞÒ¶sðÐP`]­ÅM9ì(\ß4íßѺ;?—Srà’øˆÞ—âl%JÍìRÁD.gD›¥³cé°k4öTVu±?ÇtN¡xd÷J3•î(ö  SViKkhá$ÓÇ·övƒÆ„ÄÑàR'jï8*~pFüÈØ‘†Ê5EUí]þÎúk^š‰Yê?ÐÚœµe”!Æ¡l“·ºz ðxà+àŸGö|ú/ÌeJœ2ô>+—‹ Ë’Ä×^Ú·åë[[;ö?ûäeÝëjgÿ‚nûÙ¹³Â©éo]е¦rÙz­­h.Ã(fäÏOàzÚ¹3Z$6}©ÓIÅgCñ“¯0 mt—þñßЧ¡}óOèR;豦-ˆ/-)æzHá–©gc†ø6²ªMiŽ‹I±4¼7ÝCxy¾Ü[®¿hTòæÕ«ø±„cÛ•ìÛŸMï+¿6<Ëø{‰»)ø,¬ŸëÖïÂq"‚@¤+>"oò‹r-dE}¼D¹^l(–Ÿ±-«„¼L[ô0ÃþeúÑ—Vs?c >_•I EZ¹&Â’ðWP~ÄÐúˆ\Õ%ßUÜ­àÉJT*ÈÎÇ5s›hF%f/¦ûÑèƒ^¤’sU_M²°þê–Ó;– Tò}ó{úèß3?Ðw±ÇSßXèñ¸ê=4µ`I0hµI«²7%µj„ã3µýÑcú/1 n6FùÛ=}øM~Ó7°§ ‹XñÅW¡E¯ILøx•.ÅdP'Å‹èþùeCB¼ëy;a.œOß"yºOñâòOZä§:Í}JƒÊýÙ­KÔk£'$[“–ªƒ`.BÎü’*‰d†Q«DêŠç0ý}5K¥‹ÏÚ©\cä/Œ°F6þNeˆÓ\ؾÄQâZíʯŽÖ³×³½ZN¼ìYñM¹„…‹ÞG¾IR‹\€ÜûEŠ»*Ê3Gâ®Bq€™R‹ø] ÍðÑðéƒò7DH«ùå¼ûɲËÅ»Ùe‹öÙõàbÇ”T«Ï†½Æ(HÙ}¦‚œŸxøn…>…: ·î¾í$z€w~ðµ0DÎñø":uhÍ+Èö¡§¨Q­æl£ûŠñnC– ª.µú‰Ø*ºTÛĤ¢·â =r)ã*tFs–K°ª+NSΞ®PCÇlcº¾â†r[¾cbþ×¾–Ÿ˜„k¾µ°½dñm¾ö·D}Þº°ÜA.Ñ3Õ[¶ñ•Ë7RÝCþcs¢*ØUÝô°Hº!)1ÉÜÖ²ùË›}Èdªv}åTÿÆ¢âýû¿ßÕPWîtÑzN¶Ù°:Am©¬j ÕÔšÒJ3n½e ¯Ü‡ÐÎkßèÚP*¬Z…>PªKÉ+P àÁjYÁœnËÏÛеý>ΡÖf:!ãÄ_º êÒbC–) •x}ÎŒ,]’MÈÌî잸`¬bñÏ ¿_[¸äœ/’Ü’ƒv+r(|ÒnôÉ?ìsXé4”÷»nÿùm »˜&ª¡1-½pîmEÓÂiå{1¦´\Ô ¾‡ÞŠêˆ³+Ž…,SÁÝ/ö*ï%çíô¼.bcç<§ô~|»¸e¡åGÝð‘»…{YÚ²ìHÖÞaàÁƒRfùù™ÃÔh~ùSæAj—•h¾ÏŠÕ?$Ÿ/,·%£OÅWΙBˆÿÉê3AñUVŸ!ÑŠÔgÐFðdóªd‚/ùŒu”– 5Ò×%©: דÙÖ])Qu$%"Mrn.lą†굅”˜Tè6¤ÃNÎè.ˆW£î®nÁj2åå¯Ö&&£r³rúÅÓ¹j­Re¶äÂæ>3cCi#ÏÕ¨cx³)¿ÀdŠá“tyh`¢§ Ymy8ªSsÄÓYNÀ¾°ŸbØT™y#'Ì4)‚(²K>áá¬:+ʉIÉ ¦í®_[í6ƒ±» ÒÆô÷j êê÷MéùyñZ”>ÈÉÉj@M9:µŠgß»2²º¼õâÝùÉZ^e2ä›Ì|LbJ®xÃT׫5?ÇjVñIzjêwf᡼™jßoXܹ-n].7Xܱ6ÓíÞÕVm ²ZÝ«MhUÑß°DrGI’Y§µÚŠSÅûÐŽfh² yñ1†…·ƒmªlêF°á*lSçúàR¢ñѬ%Їhy®çDO.ûðòþm¸àoký35´ŠOQ;,D,Äñ:꿽ôëËBÇÁ<“üEùÇâk²É9³ŸÆ¸BTåŸûoû—ÏÊßå̟6dýåôSñW4°F°jk¶˜«~ò„Oü1ætc¾õ‰W›­@Îä“`RþS$¦À3Þ[… ÅNqHa’¾®åYÌ Q”N Ò ;ú:„¬æ|æC&ñ÷¿7jLŽæjqQôö5ˆyýc¹HŒŽ:ÖÄFäÛxôQ§]Ô!rü™li¨ë¸mßÞ©ÝÏ|st¼Ô;>ví5·h*€˜k,0¥ Žïl÷ÆØÊËÃåe¨z]çÚ¦õŠÇ«ÑK.}桉P[Û-·<ýû›nèï+²—à#C‰ÈW>Ó-¶íÍË÷–nmj¬^‹s¬_¾€oùJÅ È'¯1¨£B1 Ø:éœI}•WtÔÔ6ݱÿ"HØ×ÞAN¾¥øŠâþw´¾ªd}è-Z5¥ƒKä·ð~n²ApÅ?]ü-Ÿ ™SÙÅʹSË–2båPèR'eJ”°piøÅ“Å(}T\„*×ìÜ=N1üúÆÛž™›mZÿ »££Óî@v¡»ÃaG¯W¥™pB»­¸ÈÛâ-E¥VïhI3Ní¾kO_¿hö˜­V³§§‹f®Å?¶ø–’WyÀº³pn#Õ•²ÎbΨ/ŠÅ `KY©BîÂõØ©dÙí•U‚Ýn[S™aã¾V”f2¥)vª;á½ÇÓ’üÙÏð>œ`æ V« ÿ7àSÖ€O1áL[Nƒ•KRmJ¾Ž^–*n[»ÅËir™ö –IÜ|F™qŒeT~ôCì¯p­æU˜»û‹+‘ 2ZîŸØÕ"—f èºó}(ó± Ò†Y¨ŽlݼÞG5ótmÛZ_E;ºÿ·ŸsªP| U¤êuÖB+õP…yž¬Ú»ïA:æÄ‘)o1Þ räúÑÂc1&¯ù˜ýG5Kþѳžª“Ð/FnDø¿´Y¸o´/…ßlz!êß&þ 7 × ü™Å³p¿®:¸8¸‡ëz¸¦á:ÈÚóàÚ }×{üô"<ø>¸Ạ®SpYါ®µp¥Ãu#? ×p€ë$Œý%]oñ]¸÷Àu®»Ù\5p¹à²°9kaMÀ áÏ(pÛ‡ßWŒÿ<÷Ñù ×Ëp½Ï p¥²9LpícxൠຕâŒD¶Ö\PܸK`Ž?Ãý~¸†¡ð m`s4²y_ƒëU¸šáÝ[p‡µÑã”§X?¹îî´Áßú¾B¯hP\£øT¹Mù _ÂwóßæŸWT=ª}ªÿŒ‰‹ŠùN¬>¶+ö[±Ž» îð*õªÉU÷¬W¯Y}åê‡V¿1þêøÚMx'Ñ’¸1ñhâ©ÄŸ%.&å'Í'ý89>ysò ÉW7©Oªÿ[Ó®9¢9«=¬}Dû_:½®BÐ=žR—r$å9½Y¿_ÿËÔÉÔç e†k ¿1Ö7ï3þ-Íœv”ê ·‰Åÿ¥{ZþïB~‡ÿk-üO$¿JÒ3©¬àâPƒ•°¯Ìs‚ÜGÅÑ ƒc¸l$Í »èÛÇe+~ÊàUœ9îŸ ^­°®Jep<Œ/ep7/MŒyHÑÄà$nkBŒLË% ƒ F\|Ÿ¬àø„O¬äŠÞb0Ï©å>*.!QÇàN—hcp,×›XÌà8hžÁ«¸$õ¯¼%«ÿÊàx®Ls–Á \‰V›¨Ü’xƒ“¸Bm0A¼pKÒ~›Á<—­=F`´¯Ö¾Ì`žËÐ>JàhÑ~Ä`ž³jß p,–‹NÃ`…öSÇA{‚®ˆÁ<—©K#ð*&_ SùR˜Ê—ÂT¾¦ò¥0•/…©|)LåKa*_ SùR˜Ê—ÂT¾¦ò¥0•/…©|1¼óJ×Ï`à•®šÀñЮÕíg0Ïåꆜ@xrƒÝÕN‚vµîEó\Žî«ÉI’’RÅ`žËOq8•ôe0ôOé"pé5ƒqÿY›°¤<Ê`Ð”Û l!øhŒu€ÊÚFú¿Á`Üÿ{ÎÄ:²À`Дß8óGog0ðG¿ŠÀx}-ƒa½ ÃqQü‹â\]qQt%DõOˆêŸ%—I.}Ü^nŠ ÀŽÓÏ Á]àNÁÕǸƒ q“p…Y/«‡§i€ñ¯ÚÇIZ‚0¾ ÒîÿÿœÉ-c&p½ð&ÈÍÊ}f ­ît½"ØuTp®€AŤµFáÞcF‡0ÕóÍÀ5ÍÍÁïð ¬* V³ð~œô¸N¸ÏýŽà0 =æÈ›_¼^9ü ¹v@ë¼ Áûð4 {¢óô_º]§h-×ê,éeÏ Åü†ç ¸Os»  ¯õÿÎkZÀ¥qÀ2L°Á¼à÷"-X¢Ò3ÆhZ(V3@O'׫·pMpÕï1Ü­ü6Áo;io„–^øÅÒY²h„¿ÒÚÇ%ÂN_˜†q"«ð Í”Ú)•S„ÏS »½2VRO5)bê§`<îí‡^”Jª³D3n¼ÝK¨”ÖÄ4ÏEqf–Œ¥"áC97AúSL° ‰FˆÖHÛ(™K/@¸ˆµu3[m ÞÏ‘~!ÀCâ9]3ü9œ‘´mžhn ºÆŽÃð„Û‡ -Hè!Ü›8'¿BŒ.̱@Ô,ólÎs­7Ì´ëÄ ±UŠõ “Ì$›ù\rª–rŠêÕJ­X¹2mǼžƒ_ì'ü°jq{†Ì>ïÚ˜ûýÐ$+ÎDI>" *§¥v¹CW!ó Aë¡à_‘¹Àtq’Øâ$Nä$3s{…S„š!¢{ÃQôçË•x(yrš ÌÝ¥v‰¨307öÁ,F¸H6!ÙÝ‹}ØÿÎ,ñEX÷fÉ’8ÇC„+Sä7“i2sˆäÔS† .t¾hÿÁ7Lx7Fü€Ä™aè5£$+ˆxÂÂÿ¥ž¹Iÿ ˜Õ ¿aâÑñ¬n’+\Èò)I;& …ò˜ÿ۵扦оÿ“U¤wîežDž»oïT`Ä?N }cÿkÂÐ$Ô‡¦§BÓþðxhR˜  þ°ÿ :¹ñdBo(8‹[f„–IWTQá)€ŸâB¡6zÆGÇÂ3BO`&0=–¦ª¬ÍN¦…ÎÀ¼P WΦgð¼Å…åÅBNÇøÐth&4v Dµ³A0¦»·êècMw }ÓþáÀ„z—ù\¬…éÀèøL80Æ'…¡ÀtØï¡ÙÉ0L5SØÙÕ×ÒÔR_Û×ÒÕ)t5 í-õ½BíúžÆÆŽÆÎ¾ÄÕ‰«ûÆÆg„°ÄL Ã’SÓ¡)˜n/FA^˜öOíü“°$pcv& îö†fñÈ¡ÐAfvr‚çä&fð$~!8>˜„îþÑé@`"0.6ð1ÿ\@ bÌadx 2˜móþ逇ɦ…áñéÀP8¸W™MDð ÁZ¡Ñé2=#ã†=Óンa˜Ð M¢ rÎHH¯dVȃö sþà¬0hÏÌÂÑ£ …þÉ``f†O¨š˜,Â!:3ZI¹\œ OŽ’±þááq,RP˜&:–›§ oa½ðr¤‚ã㘠X„ô›Mïš S­^ÆÐ<¨Èì`p|f ¯sQvOø÷ €?ˆjj/f\„CK"üh‰çŸÜ+ìž Ìe†B“ m“Œ‚i†7é<3š ƒj΃A`XI>î’ ŒƒQ‰á~2€,ö…#2Æ„ùÖ#çž– ,òO ƒi"XÇ®Äú{k…!§¼Ôç|EåžRgÕªþ6hô•–¯¯Ä'øÊ¼ÞŠÄÕcáðT¥Û=??_8! ~(4ÑL‡…¶@8 L7fÆG±úú±Êà>óÓ ¢ih1F½¥®#_<Å¡†jQ`b6èÇ A<4žš L¦às°R†ýƒÐê™7›$È ‡†f±ˆž‡gî±ðDÐ=Æÿ³2÷ÄÌ…C”“ùBüæ_5Bkà‹‡à'7SÒû¼%|§É)ÇçëæfQ"¡wÎÛc„$ç{ÛÄÁó¼W~Yù„ò9åSðûÀb:þ¹˜¶C ݪ„HÏÙóö\ORDi+‹“¤ócÿâ]Ü'0ë;ðæ|ýÈLç{ÛL’ 9©ó÷êf%¼ù£©ÑÞ‰#çÅž·ñkù*¾ž/ãËù¾šoã+Î;cßʹ SŠ Ïù{Ðtq×ùqBîm¥™óK1D6®~ŽãþÄ=ƒ endstream endobj 10229 0 obj 11042 endobj 10227 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /CourierNewPS-BoldMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10225 0 R /CIDToGIDMap /Identity /DW 595 >> endobj 10228 0 obj << /Length 973 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0057> [<0073> <0077> <0069> <0067> <0020> <002D> <0074> <0063> <006C> <0065> <0078> <0061> <006D> <0070> <002E> <0066> <005F> <0072> <0049> <002F> <0075> <006F> <006E> <0064> <0068> <0034> <0079> <0032> <0033> <0037> <0024> <004D> <0076> <0062> <002B> <0035> <005C> <0030> <0043> <004F> <0052> <0045> <0047> <003B> <003A> <0028> <0029> <002C> <0022> <003C> <003E> <004A> <0041> <0056> <004E> <004C> <0055> <0044> <0042> <0050> <0059> <0054> <0048> <0025> <0031> <005B> <003D> <005D> <007A> <002A> <0053> <0057> <006A> <0046> <007B> <007D> <0023> <006B> <0058> <0036> <0039> <0071> <0027> <003F> <0021> <005A> <004B> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1549 0 obj << /Type /Font /Subtype /Type0 /BaseFont /CourierNewPS-BoldMT /Encoding /Identity-H /DescendantFonts [10227 0 R] /ToUnicode 10228 0 R>> endobj 10230 0 obj << /Type /FontDescriptor /FontName /QMDPAA+TimesNewRomanPS-BoldMT /Flags 4 /FontBBox [-558.105468 -306.640625 2033.69140 1025.87890 ] /ItalicAngle 0 /Ascent 891.113281 /Descent -216.308593 /CapHeight 891.113281 /StemV 95.2148437 /FontFile2 10231 0 R >> endobj 10231 0 obj << /Length1 21612 /Length 10234 0 R /Filter /FlateDecode >> stream xœ­|`cÕ•è»O’ånÉêÍ~ê.jVuïul=nÓ‹lK¶Æ²å‘d{ÌÐf`20m -aH °Il eIB =„„dC²ð—”MÂŒŸÿ¹÷=Éž†ýÇ‘tÞ}÷ž{ú9÷¼G(DQT.u5% ¨¡Q·Wv•G#7Âgb&¾m9?ð›åùél$<ýfïç(ªæk0œ…’Êâr¸þ;\[fçÓ‡¯ú•æzõ…¦ã‰©0sÊé (ßÕpÿ‰ùðáEj?5MQ~?\3 áùHå¯Ë~×cp© à ýeJDQ¢»E>À`å~÷RQº‰h:W ‰hPxÙõ%¡þ &C1ëgEsl7ò‰è_[)´¾¾NæÐèé±€S”Qj”Zá é…ÔYFðµ³­"ê Å)D\]hÍQ=p!3Ûì6³Iœ£«”ÜŸB.Î1çØaÜž#Λ¥>ô)CÁ€Ÿ ’¿€?ôyUüàù‚ʲÅäñ™úF…¾Íõè;£#ǯûv[mý¸§\§7”Z­ÕW]~k¢³]£õ®yzÛ¶jÇÊòÛ›]]:¤¸xjüTl&XÛí2¹]Æ±å™Øµ®AÅEB2EMýd1‰š›¶yœÎÊŠ¶]m-ÃCûïO&%EåF$-iÆ|•®¿!~G4@ÕÁ…“ž#FfÿÃŒxH‘£B2žn„p.“ Ì^@üŽ]£“åÔ±ÛíìãìMV¶½S§k¥z•jäEù¯ÖºÕÚrc }KW™¢°Ðù·_˜òÄHoØ*° JK­E7¹OpðìÂч,&±ÕJËzÛ‘µšþðR¥]*A0”—["U¨–×®¤»vC…F)°bú+A˜~3EYÆ€ÏÂTI µf3‹õôJ‰ª|ô;k Îz«¦$¡ü£¹ÖIÃÙ`Ñ–æ›uV«UQdVG—Ïè4 \›ÔѳÇc­L»¬ÿ*Ç"ŠSí°µ4cDB¹÷Ü9AIáËlâÄ’„‚Fov®èZkçµ×}âôt¤ª ¹³ÑSž€/t™Ì5fú#ú2IÞ57œºóù+¯O†zÐ^C=Ó#ÕÓa™^­–ƒúM_FÇ'Nß}ï ùHWWA¾i‡4J9Ð-*‘šå}ìïôeÿÄøÜÉGQÍ_‘äZm Y=–›%èUºû72ŒôêÚÓtJ¼Œï×#8)š¥Bp†2j6‰íúxkó¿FgØ!e–/˜ŒÜIGµ±56ï<¶öZjø¼tߣ'¶ù{v#ÈEåLE[•¬Èb«o©r ººhtáÚ­ê"$äkôe>¨cØéÌ¿¬ÞnÔ8kNÞ…¾áƒÛÇnÞ3èPéKÕŠr‡Ýk4Û¬þÞöV,ÍP]{Õìím%¥â\dSo1B d¹Õõl †Ü&ðM›!û—@,Îæ3Ï¥ìm’Z ÙZ]N§»¥Íát:¾«Rv²â¦rØ]©jÅ3ãm-n'Û°¦›Ò°›•Ó´iÒ mØ_ÈU7\½C>/+ߦr‡x¨Y**´0öŠû¾T3Lƒs­×:’|4y²i‡Ò&`o¹ª6d,=óRÐðÅŽPY¿í”À±¼zýM¡ö3P¼cÆzåÙÄ›pm€‹m$‚rU®Ù„[¾qÿĸÇÓÔ™96XßPwI ‘À‹ŽçäÛ¬^›Y«ÚÛ'Dkk« ñú™Ùw_~ek»ZŒ–ë‹‹hëÚì«M ä úíão¼¶­$Q äY€²ÒMQu“¤¿p®tÎ,oÈSðb8#O¨ÛíPÅûy,¡Hgøv&7™(ÇØ¢JáS ×ååÛ×~Ò¢ÓäŸ8Ð\ì‰#õÈjk ”#,”* 29}Rе¶²_eÅEjÕ ý¡É.÷‡p¹CN£Q§3æ$yA‰ZãleS¶mý Ñv ÌÕôù•¥"[œ²¥ WFn·;¯ÞyulÎÓ‚Ü®ÉðÇ®ŠÇV’G®xà§zמèôgÿåù›îÝ­-×(s¡h¬zj2Œú¶,ÝõÔ—n»c`°6tré°?¸}âûŸ~î±Ï8€š,j¥Ÿ£é7ôÁŸ›.væáŒ‚¸*˜ž CM漓9ë éÛJLÍ­­Uzƒ¼ü¶¸]öŠîÞñÎDy¾Qi”˜Ã=n¦¬¬|æ´³½¿ï¦´´ _#xŽ}îTÀ¯3˜ušÊ©HgÏøÖþþŠJTÅ{ >ÞÞ^¦¯ö˜M½kG¦ævn·–äŠq ¾´<u!c+ÊІ³dÂoŽØn¥ï)È·˜¶–¯-6KqQ^œS|}¥èÏ¢Ù3^a2+UpöË,¦£ô³ûÔÊR *·¼ ~â>Hj2Wv¼Åæ Ë 3bH³‡A3]Y\d6íYÚk6›Ì{è!d¾úª‘Ñ›'g”®v´·w££ì‰8H­ÖR‰A¿ Xœ/Ó㣚™ýèñ}ûjú®µ/ÒhKï]wôtcmõ×  -O&óx¹BŒ+<øƒŠBE *›ŠøSziOOw[ÈlDåFWÀn–i* B¹…je+nT)¸ Tî<üÃ[<.d2·tâ*Älå(ÍÍ“éÕÖIt…Å4dî2ýe´hH¥+.á:2¡à£  ˆaFc€‚]9rì<•ÈÈ…2Ÿ`øì¯ÑÂðVÔÚ¶ïž1kpaþ–(Ž)¨/Âþ ²ÆåJ¹Ù¢DOÜuç‡g{ºî.ú$OÍÈXßu'žfŸÌËU)º¸@زP¬†T Q¦Ã5_ e´%Ã6±QªzC‚äˆÕÊZv©'TÛýÄÌ$‘=»fÛþ†¼Bµºýúþƒ6•M©Öj\ÊÊp–=ó™Q"o›(ÑÝwì+w^nnB]+ÒTéKŠPÕÚu7!38tïçÆ'¬rt÷Ø.ÁÏ@s P³í˼9êÂ7Öš/ÄG¦l-‰Ã—Fm|Uã›øÉkdÒh¶A 5|Á#W‡êö…ûr’Î2 Õ kþÌ÷‡‘?0vô‘«ffN³qÿ5(àO_רˆ->¾wKƒ½¡J{°¡²ÂÉÔ7Du õÜ0ºàµ‡ê#½ýU"¤/¯°*U´«íøDg'.­ÚQíqBðoMvµµÖÔ <n®oxêöP-ª }âóíž3ï" ã÷WTAÒíÔHË ò±MK×ß}ji8®‰À,ØÔ”À ûy×|;‚;z#Á›ëÔÿ?jíZ/ú±§´”ùÐñü2¥Ú…^¯-)1?¬#F)ÜZ]5ûžžþìÚýÐÝžò«—JÇÙ yu¿B–gµ ‹•ª-00Ü«µ—JEV«X£»|Mƒs&îD}ì;Ÿ*¢(ò‘ÊÊ(5†ŒR}ü²Ë/gßfat­ bgï|™ýò¼L«ðJ;»EG87¡^Úˆ"y͸QBrš'=¦@ \>V˜¯Qõ¬ý1“ûЉ_ßDtbÌQœîñí;¼¡ñ© Ù_gk¶îgèÓh I“2,ø)5Žô2.—L_ssz¥±™5^V7öŸïîªGè\9‚ü‹À›ð™Fpé. _Tä;3p^·å•®ÛRhÖ8ïí øÝèç¬å¢m—{gõeEy6ëè¶û€†.8­h¨À"0Š…\àØ¨À¸ÖŸ†€0«IŒjé#‘µ?øÐÎgN£îž£Gï~xG³±Üa«´O69ÊíÛêÐc³Ñ¡6b¯/þø5/\¹|¸µ­¹º®Ú¾ÜQ%)ll{,1öÔêõuQ1‰ûÒâÝÔzAäçTĉ¸DRb©B ™È˜àæç¶.¹‹}ãœ|pò÷“áÚBݽk¿¾©³Ê“¥½ãì¨Á¡.|]í¤_v¶îùðééËÐù9¢¢jdtïäÀ`)SÞP¿kgC]YZûÃVvÐÔÅÔÕ1ºo°¿¬ [᜖žûe¸3 ×FȘÝF’ç«´ƒÜ^0 žÿb|¡¥ÍT]ÖÚqçÌ4 ÕNGRWœ«o\ˆû%ö¥\Æmtº,–Go¥hVïîÙ=]–æ:¿øÕë½uu\{üž7¿ñõ¥ÔZâdëÉ£Gý6ô?ˆä±„ã@uB8/|‘*·’F)8Yzãô[~ [NÿýŠe޳ôsÞV^=åã¸a$űÌå:ÄþÇC# VÛ¤ ‚­Ó ÷W— ß» ë¶Ö<%š¢ÊÏÕ-±.c3Í/¢_§‘pí—¾BÈO?sS]èȯ|k~µ5ß~ŸÓÒ©—ž;8ƒKßç­¥¥(TÝ×érü÷¼ÈÊ%R¤V;«=}ÞD³±]{Ò.&§¦nŽŽtÙ:8{bvf÷Þ«ôõ‹kZšúuù‘ÇÛ³epxúƒÒÜÑÙ»¿¹ ”ôï{´ÚÜ|)£UßÅÛÔÉöˆ†ŸH'Á.ÔòP:ÕÙ¡k®vxî‰Ì¢ÚàìLbyî`KKtö[ßF•ùU—ÖîÕÛÛ«¶ØôzkßBüf¦°%ž¿öP’^GçÑ£þè…o,­Ð'O~|{¥²ºá!ö³8®³Ý‚·!®±~Þ7ˆÓ›‹Ê ÿ¡?±?è‚b½ë•ɽ÷Î×#µ¶ Õ¹õeì_#5Ý3£¾z †1Ð(W,Që*‚6úÉY,ÅÎ%Rµm‘½éîl°¨”´Õ**c_ëgÏ6Žy\õ6+BåL‡=¿ÀPuö Ðù8HÓÄu¸›9‚ âKªl’µ ‚1ÖXg@È­c›úÜ®nô[z«Ûij^[Ô 1ÊZð[ßCÇŽ·W×é¤b«5ßWs°þÌ#Ÿ¨`„U’2©<¯ýÏèÖÉrä`Ñýõ¦ï}ûÝÆ7­£=¤ïíüg]qô:iG×:è¯;šL0Po6Õ9Öf|°¤od÷l>KžÁÙ«ÑÕi¤ósÑÀ—\/–  Õ!âJ08eˆ4m|‚޳? é;&+«5Z½Y céÖg!¹é•‚1$‘YíSH¢;ûT·6¨Æ…”ÈùŽçÑÇ5ê/vlÎJ(s¶¦}ö]uµ•öB³Y>:qÐ~qáW×5Äï²k¯è´m- kÛŸknbÓ{äDG»7¨) œñ>ÔY3qvã1Köd…P¦Ýã¢Ïo©¯aFÖ=¦7 Ñ'•;ËU¹b72¢BOA>’HËÝ¢ka‡ï©3Ÿ7› XQJô¥jíÁµ½ôθͪ-S)‹ 'ð½©ÚŒt²@õ:™îÔ@[k׎–&¥ áö”­F[ŠÛSÚJ«½ºDÖÀÚøœï3 ‡‰oGç½ìGH×Ò"6j¢è¾T¹¾T¢3t²µYLZTs‚/fz–•%ž ñ‰½ŸÝ‚ä6ê%®%~ŽBßC‹t…£Ñ¢-Þd²¬Äµ¿«×þKTä¨ÞËzŠv»\VˆgåÕtúwÁ•`¬FÍôÙcç¨óí3ÕÂïœíŠ(½åŒÕJKK´OþÁ®­F.ôw‚t¯ËH7ÓÉÄ1±ŒÜóXq¡tŸûI‡T¢Tµ O6:]Ç¢??®5XC¹N O7Êe-¬!+Þ³Ç_m-Óëu¥¥¹Í4º«¦Ù¯~CeX,…P©¶ ’†G8¡o/ÐèYÿ•è ±çQ^¼*éF§…3I.ŸI7š?¶Œyxè/›‡õeî¡ ii90?4Pa…jZïA¯êë­vI1$W/{åñ׃EÅåÆq°RI©¾,µ6û¥ú»Ý[³}ûéÊÝv{‰ŽØ@]Æ‘µµÿspnÇNwKdêÓô]K¨eð376Jß*šÃ‚¯N¤î4¤H%¡ }ëlM—Õã¨î÷ïýÓC<ühÎÕÕºëÔãì7Ù}òÁé¿wøÌ?P'jùû> àÛÉá“qy‘{LbRäÍŒ·Ãî©vôö¼ûÈC=ôuuµíºñ1Ô€ì~2ÒðnûÇö+ì×þúwœ* ×þˆä>,—Ë ]çètÇ×p–¢×ß [@›ø9&º…í¸=+š{oYtëŸ\~Òª¦j߯S³ñÏåHÀçâÅ4S\h6í]Û²©F_þïd²·7Þu9ênÕU„Øq¶gÝ ]•öÞ-÷ÒÙãmߘ̻ö¹3Ü\Îv*ÚJ¤O¯}V«îlŸ»»¿ø¡†!KüpTBº¾PžH%bÚÈp¶.2qO yÚhr„P¡ÎoëΗØÛØ[¾ùñÿ.ª}&<Œ.?=ÓµJÉßÀháKßb_aÙ¯³gÿþuT„œß~ià«eÎ>øPÚÛzê†ß Âë׆ø'êÂ÷@bµÙêˤG.R„øÄü~yÔ¥»º¡Nj³Yí>_äi5 Û¾’Nz­Mgâ™l*,ÐÚÚ„Í਽²é·mûøZ}ª¿O§aRkK¤íÜñ»-“Sw+Mr½•MÜÚÖZ†[Á¸_*xl­ ÷(7:[P­Û7õOy…‡2 1ŸmU\]Ÿ±GzáþQ¯Î½ö·¦’"¨·u¹srv©ÄÁÞÚQš¼oØf÷Ð9:®ˆÖöÙ†’”:Q³?ÐN7±ß¹¯Z,aa¾\ßxW¤«H^¬*‘æäZ,6ë'’¨ê#k.Í-)‘äºN犒¢à&KÛêVv‹p‹à¨2øùÉÆ3TÞ¡A9çX¯4ûKÊ·xè§›ý=ýG·57Å®µ6¹>fBRÍðÚ›M=®d.µu°²½ÎÞlv;'Û4ôñË»åê« Ö×…æÏtíUÚ¬Öâ"µ²}½7à·É:fÙ·~´½i5 ïbð§§Á:ð{0h“¼±—2ͳL¡ì[#¤ÀÉQ©d™ê&û†„XFË{*íÁµ¹!•‰KBÿöò^µÚ­h[ûÛÇaTÄ>uÎyBBw= Ç=œ0¤2Ë-l :}»WWªÁÏ~hê³ë¿CgÏC\-¿ðmÙùoLtz=žì#ç¼K"xÞ³ù]ÏZòüwK•¤#‚›ÀŽðÃì‘ÐÆ›ÁÌ<ÓcɼK¶é-;ÿV‡= à·2W¹:z[(Î/7Ë+ª™òrFœ/ iÔîæ†êò2«­^îSëm[ªÕê†z éË*FsQn^A™)¿P\̘ª«ôe*Es£Jéœ3¨”uK™ÞÕÜP/U ~U_VÖÒbv™MþÊúÓ ,•ø:ÞPá`Œ$ôJå†2“ÖæÐ—YL{êõÚ@Poî1š¡<ÔÛ+˜2³Q*q ‘1åΊr=jl,’Bæþ7¶­‘L×Àõ[Tç‹Î‚4JÉÓeH¤<ã\XçÎ/qG®Íï<[z=Bjc\ –<¼ÿ§/L pc}ƒ/ÿ4Í~¹j2AÃã~n €¾»ã=üS²ªóÄäÈQÕÜ µ=R¼+»›@Î.wÀ¹›Q§Ö¿)N’ÊKN9©fj‚«ÀŒÞ &ئóúb™ãíùOÐCªM3}›fæXÏ6]'xþlëM“až¼åæ}ûÑä›UEÚ‚b$ÍW—ÈÅÊB ’h •ÂÖ[&ÃSÓ7Üx`rÿ¾›Š"uQ1*É×)d…<©P]åáÑÓ‘O<0 ß÷Àl4P¤Õ}²*Üz¤ß¯†³bl*rï‘h4rß½QˆØ…ª@íézýÊÂe ÷ööúù\Íô´p^x•ƒŸ(P¡Jaç™/ Ï~AxÛ1Â6Ý€ Ý0óAöý=Z##qÂäCßã{KÜÛ¤™Î£=“dù·&‚ô÷".Z]Q9L]^Ûg³Bôq;fÍÑÝ{\nÄ(Á¼€})d·7Ô÷EsN¹7ÐÖ9éëìî­1—WX}]ÝM/õõø27]ãìïé:¼£g¨6(m*i¨í˜Xnií쨪”—å»ÙIú:Ñ<>›ó–ŸyŒâ^˜³e޼¡`¦šæN¹|ƧûœÝS UV ú—®õ“¹ÔNçŒyzïn«\åõLNB0U•!kE}Cwˆt•|ím‘©-]=Ý^”¾®®æ¸î…ÔÖíñôötÞÙ=ª-i’Ö5ŒtŽnjoשּׁ’•àÞî¶õ_ål©ã'l{ȶlÊ)³/ÙùßÌ#µÍïŽÁT.QYƒÙ'˜œ¦Î{LoÞ„îí±W¶´¥"mG_SåèžžÝ[»{§¯œO,?›8„æ~W 6y(ñø©Ñ‘±‰/.þì#”Cl2f± z{N©¤ñ¿†nTØj­qÕýIPm/(cRéS{,Z„&•÷wøÙ¸g ä7½ñŽDb[kKSýs»{ö%‡¶u¼øÛVªÊôâ)»³ºuqÐgµ5{Cµ×>b¶Övíß³×ç“JŒƒ¸ó8ý}Á3$ø°Ávæ2Ä¥%´·fVŽ#‚Ý®FW{#jguK·ÝŠ4ô÷ÑÑþº&gµÓíwîc¢«wxꡆ€¥Æ2h×ßf»…2ö%|NF™Ðvæ§ìK×€]½Æž¤qÏGv%Ý8Ïæð•ÃkèVg»R_ˆD¹Zu¯“=™ó|UQ‰F?ýÞ_ÃEV‰Ô8:Ø“èU’fBüéÎ@¯² Îv•µÂ<µ¶Ç)øG³ é´Qáb“L‚*°l]_<+:ñ,Dµòϰ(ÌD÷ÒLÇ,㙟®¸CÝž ^RYæÙ|§cš‰=µ}nÛh¬Jæ¨noüÓÖa™~qû§>c7TT¶z‡¶o©îAÆò#ÛÇ++ɺOÐq×Àì©{bs’¥È\•¨#ÑÑi²ˆÑ;wìÙuøhdRëvîe_·¶8• Çèw»ÜÛеgÜ2¯{Ksm°çܘd…ˆ¤€óÖü™/ ;Ï~A0ø4úê6ôÂIöìƒ\×4g¤×Æ×ô|‘ 1ÿþÄE[Í|i‰Îét ÆÑ/¦·øך;ä2´›}É[X`6õ¯×`þd—E[Rˆþ«VMÐÒžŠª[]k^éd †/)VU¥ÑõUìMsm©ß\F²b£6ÊîBwŽû¬ª|!,‘)–ñ›ËPzéfÞ(0"ΨÈc á¯ÏþÑ_ܲ¼}Üd± Ê^Z²ö46WT)­VÑÀJežó þNûÆ1˜u{š–‘³ú¼œHð>õïò@½Ù«H{ä¢Õ”ž®L™ ÓßûÑ?­&pN"Ÿ‘ÊÁGö—4þ•ÿ"ÎùõW—ø°v„m„ÿkÄF¶‹Ú.¡Ö¿¶~µø‚ió¿9uH/LQc©À@UæÔQ£ô§)¯¢Œ4Eí‚ß-ðK‰¾Ié0,8Em…ù-9Ÿ¦¸æÛàÞºŽªMP[`¬àjo‡uÛï6¸½ð7”Öôì…9Cð;÷¥ðëƒk;¬Åxºà·~„7Sø>½ðiæK€ÆjÀ£|.|iŸ¢*á·®=°ï|40¯WÂGôÐpÏk‡%Œ¹aþV+ø ø5À§Ö=×IúÓëß¾Ûñ5¬½äsÐS)°SÂg7ð?"ÍÃBªJ½JàÏQ¿ÀÃBʦþ$ÅX/ê·xt¡~‰À¹0^¨‘ò°r¨ß%p¯_æôËÁœ~9˜Ó/súå`N¿Ìé—ƒ9ýr0§_æôËÁœ~9˜Ó/súå`N¿ÌéÃùXVš&Yi8Àx©fއ…”WÃɰó¢ùýš+\ŒŸk^æa!åѺƒ|t}v<·ð0àÑÂpî&ùçn’î&¾r7ñU¸i~á¦ù…›ôR˜Ñ˵J-R*J…!>E(†ú|ƨYR j>i~CuÀU`ü†ñ™ÁÀHÖ»ê$ãáÿOLî,e 5 wâÔRvN Æúà—Û¯†ªƒ?T¦ä%£m°"¿#°fhH“U#€/Ÿ$µ ßÓ°GŒš'c µ~WÈœŒ…ÿg ý˜ºi¸‡Ç’ÔŒ%@Zÿïœ10šb°kšÐ‚)aàÏIóXÇk†&ëÊFö„ï!Ø;J8ÄâuÀš"´ÏòØ\ÐT NªÈxfN,©,ÕXžµðÍP€7$áNŠH! µôfïÖaàÁ™Å<3·ýc »nøt€Ž0<£˜¯nø ã]02 ßX‹=€¯ þÉèUDÞ&Ì'ÒnÒXpfœ“ä"¡w‘p…çfôw¡Þ8‹K€n°Þaýê&9ÇxZ"Òf¨Irwæ/e÷œ‚«åM:]"kñõ=œÎçÉ|Žì+q"Ù±î›!X"D¶ ° ë|'¿Û,Ü_&ó@ö6l=Üžé÷‘LFk+Ä–#Äzb ¿“ħ9ª'yÍ,ð˜/¦!;áê\Ia»s]Ä*.Ü™Dz^†oO°kœ—vŠ`KÿÓ½]Ä'ÈüÁ´z.8=ëÑX:Ü®)‚g F£„ƒ¢s†·ÅEàjc_•¦‰¤9O “x—ÜïÙÙÉMvËñ—¾¤¤âįcY qœlà[!úŸ#ÚÜ墼]lÌLÀ\.þ-‰cü³Y~8º6[7ŽØ8ùs^µÈÛGÆJÏ·¡÷ãhÃ>úïjKã?ã‚;ÃÍù"Z]8OÉóä½ó‡¡8‘¦aæqQ7>ˆö3ø8ŸÄ¾ºÌkcÃÇ2ø.Ô#'-Žƒ4‰é‹úqFcáódýQ»!å w˜â³Ì$µ™"ŽlAõY 8ûµÁ¨“dZÊO… Ó0ð]WNÈö~øx(\áŽSýüLÜ­;~Q>øàUA*•þ`ìX[i ¬ª 7È ÿ¹€ó=~ŠD¾–'0ÔI¼s%k\vŽñÑÓ4JøäâÆ*/ý$±SŒ{號æu0@´7µ\Óø ûnD¶ä¦Zd#‚]ë£$–§œÍðÝðyÕF{æ:SÓl®8; ôNó^±@lG´0ŸY›ìh…Ð:E¬3Fö_!–!|¥ˆÇpÙ {=®åÒ¼7rÞ‹£¶2β¹h’xA‚Pv~®ÈØ)•°ß¥H$IðÀX§ˆdpôŽßdαÐ$‘ÏFÉÑ–‘H‚÷ôX6ÒNŸ£ûÙ;Â{Þ<_3ž[¼¿-Øy mdàL ârãûÛ W'^¨¿Íæd´ÀSºK’(3CôÅùi„:L0ßX.q‚ŸÓ0†fH¦Œ‘(ÎÕÀSDç‹äî¹ùdî$ø“ů›yXÃÉz;Ì›&;¬R™Ü½O&ÉÚ9žVNBó$W„©Ëø5uN¬À¶Î”2Kâœ:Mìké-f0‡ÉÉ'± W,¬ž3sš¯ËÓd§W×ÿ0¸ÉüyÀî†ï4‰˜.7©æ÷Üœ×qñ1™= ¹²+ÿww\!šÈÄÄÿ]2÷Üçeü,î±ÕÅH4<a>ÅŒÍFü$”†!¦#‘\L$ÃéXbYŒO¹˜Îp:|‰InŒŒMÄ—ðHŠé[€u5uu'|y]L[<ÎŒÄffÓ)f$’Š$—#Óc±ùHŠÙYaFóá…G˜±dx:2NÎ1‰èûnÆ$#3±T:’ŒL3±& SÇG™ápš±1cƒÌP4êb ÓL$žŠ¬ÌÂ4WSýy›2í‰øtýD$™Â¨½®Z/S1›J&R‰hº’L†¹dêð¨OÛ:4Ö×Ý×Ñ6Ö7´•êfú:º¶Žv1m=#]]ƒ][ÇŠò‹òÇfc)&0†ÈÅdb1’L¯bþ²¼à3Éðâì*¡9ZJE˜ÉUf5±„WN%– §K Ó‘$ÁœÏ§0’0ME`zx&‰ÌGÒ.f',› /G˜Äd:[€•ésˆÁ¬­„“&dIf:–ŒL¥ã«L4™˜ß +{%f"dÊ ÌÜX7 ²OÆ&—Ò€ÈL,D63dOeˆŠ¤\YQdf–Ãñ¥ðdÈN¥"éÍ«]ÌøB<’Jæ À¯èt–¦#S±hlêBÎâB:¶0CÖ†§§cØ^Âq&Iì·“D¶°_ú|¢â±ùf6!óVɹTš3¹(È‚ &VÀþ–&ã±Ô,Þpq➯2@?¨jq nCBçnDäÑÝ`.¼°ÊZФÈ6S‰…©Hrç ÉÓM&§fKñi°ûå˜.¶ ÙÇó@“‘ø§1ÿÝó©ýi¬:°Ç$NB.|ó.\‰Ä±%^z ¾róŽOf_²Å¼•¢IRD‡/9 mTÐ[—œ¥.ÝÊg¨n²oúRó'_|]ð,|îsû@ À}®å” +–.¹¢‡ 2­I\ì_šË· p›£þvy V_jþÁ|©Y½¤Ô^&’¾ôìaŠk¡/‘#ךüŸHò’\ Ë…ÍÂa‡0(¬¶ ›„ýºKî0öí©s‹j¾ôLîø2wiš‘”úµÀ W—¶’9Æ„)Šú¿áf¤· endstream endobj 10234 0 obj 12776 endobj 10232 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /TimesNewRomanPS-BoldMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10230 0 R /CIDToGIDMap /Identity /W [0 [772 552 992 386 772 330 496 248 496 248 716 496 440 552 826 440 552 330 496 276 662 552 276 330 716 386 496 606 440 496 552 496 716 496 552 662 496 662 496 565 496 496 496 496 716 772 440 606 716 552 936 552 716 330 330 496 496 496 276 716 772 662 496 552 716 496 716 716 330 496 330 248 330 276 992 565 391 391 826 551 496 330 330 496 565 772 662 565 330 ] ] >> endobj 10233 0 obj << /Length 980 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0058> [<0053> <0057> <0049> <0047> <002D> <0033> <002E> <0030> <0020> <0044> <006F> <0063> <0075> <006D> <0065> <006E> <0074> <0061> <0069> <0054> <0062> <006C> <0066> <0043> <0073> <0031> <0050> <0072> <0032> <0064> <0067> <0077> <0034> <0070> <004C> <0035> <0042> <0036> <002B> <0037> <0038> <0039> <0079> <0041> <0048> <007A> <0046> <0056> <0068> <004D> <006B> <0055> <0028> <0029> <0023> <004A> <0076> <002F> <0052> <004F> <0045> <0078> <0071> <0058> <003F> <004E> <0059> <003A> <002A> <006A> <002C> <0021> <0027> <0025> <003E> <007B> <007D> <0026> <0022> <005F> <005B> <005D> <0024> <003C> <004B> <005A> <003D> <003B> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 8 0 obj << /Type /Font /Subtype /Type0 /BaseFont /TimesNewRomanPS-BoldMT /Encoding /Identity-H /DescendantFonts [10232 0 R] /ToUnicode 10233 0 R>> endobj 10235 0 obj << /Type /FontDescriptor /FontName /QRDPAA+CourierNewPS-ItalicMT /Flags 4 /FontBBox [-67.3828125 -273.925781 800.292968 1000.48828 ] /ItalicAngle 0 /Ascent 832.519531 /Descent -300.292968 /CapHeight 832.519531 /StemV 41.0156250 /FontFile2 10236 0 R >> endobj 10236 0 obj << /Length1 13940 /Length 10239 0 R /Filter /FlateDecode >> stream xœ­; t[ŵ3zO›µY–—8ñòd;qï–mÅ I¼Çq¼Äk‰,=ÙJ´8’lÅ! k–Bi)¤Ð•­-ÿ°tùPÎ/§mXÊúKÓ¿m -M)¥ú9b)ÿμy’¼ý¿Ñé¾ûîܹûÜÂ! ºqõUÖ|éñ[®Ì 0F'½sîüÇ›FþB«§§D‡ËUÜõ*Bk†W?}~ ž }Ñ”/|ð¥MEJx~žòœŽÛÿl ¡œ½ð¼Ëç88jÐ2:‚×7o¿zd).¾;Êÿ¤¨D›Âj"@ Ës†,]heÚl–BÄ5 ù²@6üº°wïå3÷ºœ÷ÞÿÊk.ïs™ZµŠÇ8ÕlMçjuØœj=ðÇ Â7>rýuƒÃǽîä&¼|ïÄŸûú7ð÷c*ŽWkS2L&­Öß|“Vc¶˜MQÍUÇïŸèÇǯþÊ¡þ 2n»ø[ÞÏßJå·fJ²y9j.;5¢¬àUÅëêjí lIï³ø™V­Ñsb#Êšê=;÷MnÎ4R´Ù›î˜¾üh[‡*ršÉºNe2¦tZž›Àjmª%ÅÀ«¢ÿ•m©*.Áxu¶Õ Õ™2ÒÊŠV㦆¡lAQ)éðA®Ñ Õ´©$Z~Ñ’¯4C´ûÚ-œ¬DÂäV*n¹¯W\QQx/Þ¶F—f®’¹í¶÷4§(ͯ¼Û1ÿ‰ØÖL5)“Ö†È ÁŠðøÖd«ÔœM^6aK½¼[Lb/ñz¹@P˜Öøú·_z¸«óº$Ñ^g’uùxl«½|g[ÇÉé=Ò«Ø_Ù»=·u1ˆ›8v©ÕÚÚêÉÈŽ¾³Pt.3³»ªã‚ÂãÑwWÒêWMŸ­Ü U¡4ˆ,N ¤b) $ ™.ÉÑBHm,ÄåOÝ:Ba ¾De2¥ÁýyƒÉb=0®Úzìô®ö¦ 7œj.YëëSÎí½µ}¥àÖ²˜á¸¦¾/<²çò5¹öÇ®ll²ZqY©è:2ÚÞ•æ@€èÀRŸÍ3±V«7«5u…µ­5õõ«LfË›mKO÷¶ªªÕÙ5%z°…Qc~•N¯1™Ô ¥ ]]k×fe –Ò õ›65——⌠ȖõPÙN+Ž‘ŒÕV;zõü}«ÇþmQ®á{¡"! –ãcj(°âo¹Vé@_\:§âÁlÈj‹Î¢èÂéµ:ƒˆ ˜Íé©f¬^?†(ËãÏ£~Õ=‡úú@ôÚŸ—â cZyAŒi+øóóšìˆUƹ£C«Aºô”tEWL¥Ç:­)7 ?„2¥ƒ«õÄ×gÁ×_[­GÕ¤ÒKÙ¹Lu·3ÛØhŠ×KA æ¯¿Ÿ»ì²/ïöûú2MP€S+Oœ¼é1ÿ\U9Ð;%ú¶gó£ãŸ»åð‘F|—`:¹s ¹u  1-µ¦¢ û}÷C›ÑÝYY]â]uÆãc#£7M½íoshŒh/.I¥ã%õ“쟸€ÖJÂ&Zp¼ÚÛû‡qM‘V­æénú.óæ ± ±¹XU}‡ µZ£¶¿û[¡Z£RÉs´)dŽø:s‘-ÂTøFŽFeÅX„ÏÄnƘW§¤ÄÓ 7ÄžNä›Áh€ üÞÊqZµ\!GEìl–ò`Œz¯;äBýÄÛ¥tŸ¤î‘Û3¹„ÐµÄ Mò X²_$°ª…;k¢‡úJÚñ@SÙ†ôÎÖ-ÍÝ5ÕªÃ9:ê°Ó7ò9¹*«ÛÇ"lK=}sòŠË«»vÍÊT¯1];?ŸØJGB°YvtàêÚþôUÑï2‡*nOM«òrŠ'£/ɨ[,é6!¯)qÇq‹6WȽZØ]Õ¼5’z.YCŶOõ²je&êµ*KÍkÝì“/ßåva¼½÷úŸ97Yx&ÞÊ "¶õô·l)Û0&Î ·¶û¦§ ¹_¸xN©§ro$r'Üc—÷{É¥‰þjA=eí‚Rÿ!+ûO=ñÆ]"ÞÑÍÕŸùµ×5-µ\1´ DÞ\²~pøð#§nLÚ´î{ÆíþÆ5'¯‡Òø4~U–wÝÚÍ—ŒïÜ}thßxÓ#× “ˆ{"nž‹ ;ëÌìr'®’zz 6ÓxGNÚ‘äFìñò§wíìhÛXŸjÎÐ)U¦œÌU«FÆþ0Ã,`¢>bhbéç>:2¿øÂ†õ¸¢2;öo¬T¤ ¸´ì[±Z9&Ô©–TVÖï=0h«nkÆÎâßÅ ÍýY«N#Ní µoÝÚXXP”š…‡ëÖoënݵ™\ÇÝhÒæ?òðÕœ¾óÈáã—§iAË*þaXô¬–¤+–µòý‘J­Œß'³ú:»Š!Ý(>ºD ›<ÙW7áµ½N§Å)ú¼Ø¯#ÚT³%ÃtðÕ5™4OVÿ÷Å •ZWczŠ™»çç±{²Økã*­No1µãJOIä¾ùf.Ö¥˜RsÞ‡ƒ°œ£‚Æ{.žçßã/ ì>vè¯v‚ܪ¸(’ $@×%®SlJ¥”ËÄjIza†‹Ï³/š¨xr¼¡ Ã>~dgS£Ãé¿|{7Æ¥åmŽîžòÒ›Ò¤Ö¨5X«Îä¶@\iTR±ãMxb/4qذ·‡Ìª€YÛÊJÿƒ›wE&ö64Ù;±i[÷^rƒ»·]ÖYZ¶;ª„žV 6Ñj¢¼Z£Ñ§èTQ L?H¦ŒÙ3›·u;ZÙœŽÒrÈ¢×.¾Îß§TÒn3¾uÄ3¦FºDg— *é TºŽŠwO”8~3J»g Öhë8|ôø'·™Li©iŸyðÞ+®X»n{ï  ÖCÆ­é9¶ûR|É&ßXÿ€=ßbÖhqúæýûü'úq[»â[å[û÷úü­­c‚Åd2…1>8´¥©±¨´ÔšÉ}Úè°8ØÐ€sòa€-?£­¼÷l÷‰—ï½æc1– ’¯Ò$=ØTüö|°`JÑaýOÇÇv(A¸ ƒ6¯ÎVmëî™ì]eŒÍ“ŽÂhÆÚß{ýÙ÷LÊ4³I+<üèñïÜ~Çá#WM¤ê  Òþn¨FipÞDxé­·dÛçôEUBžµÐ–±¥*öýê–…m7‘'TÔ•”¥iX'ýìÂÆ‘¿©ÁøîŸ}ö˜šß'`[üTåÝP1RÅ‘˜üå*z"C‘òË”Sò¿2þy4 ã÷üóaàv€ÏÀÃxÜzøý-ŒŸÀxÆYß„ñK>y0raÔÁxÆ£0ÎÁ<-üNÃxÆG0NÁø Œ7áÝïà÷ÀÕŒfŒóðYfùçüo0öþ5Q2dNGcèßqÀ?PôÃç2ÅUŠïq™Ü5Ü·¹ø£ü”û”O©rUaÕ/Õê›Ôg4eš[4ÏÀ>Zª½VûVJcÊ¡”ïéx]Žn‹.¢{Q?®?£6JöBeh’š -±ù·‡?„È_ýÈ¿ýæ(e&Ne°éñzshŠR˜GEq%Z…Ý V¡ ø(ƒÕè^|?ƒ5hâUkQŽVÁà8Jæ1X‡¼ºfë‘['Ï5¨¾£èc°íÖãºÓïc0F:ý{ V •>Æ`Õêßd0Òâ4J¤7ä2X…2 % V£!Ã&kÅð+k‘1õ-§`Sê‡ Ö¡ú4 ƒõÈ–&Ï5p» ·0؈*Ò€$˜ç@6cÚ÷Ì£ui_¦°’âÃ`‚?Ca±¿…c0Ø<í- «)¾˜Á€·˜(¬¡ø!|…µÌ¿,ùW‚%ÿJ°ä_ –ü+Á’%Xò¯Kþ•`É¿,ùW‚%ÿJ°ä_ –ü+Á’%Xò/S’l•’d+àÓ™î:À—1Ýõ€OµDÌ£õ–=6^cù2ƒy$X®£p*áoù!ƒ¿å> [(þ üóNO²yz’Í3}ºŽÁ„þïΤøj>=›ÂÙ„OúƒOúf ¯¡ôW0˜Ð;)œ›´nnÒºù”ÏWLøœ pås†Á„σÞ@ño1˜à_¢p9á“af0áó!5Iö×$Ù_“¤—&I/}½>‰^Ÿä½ì—a4‡¦‘ˆÜÈœð+ ` Cü¸F˜Q ¨ ž‚“oà=”BŒæWÔNñŽÿ'§Ê¸d‚7^4§ ®~¥õªQ|ªàl+A5Û3¼ð;s&A†05üB0‚h¾]K¤j¤RÍÀ{¥PüFèzD'/à@5K߆â2“57·€ÖOB„7!n˜W‚FW _¸š´Öè[¾`½^°ÅJkµ,±› ž}ðDûGÖû¿Û\¬Öò€¤a*±‘Ï„ÆI1D*ù™HäŒ$UtêCý°z7ê„Ñ> p?`øî„ïíߘ!ø&^êŸtÀ§—b‡‘NÏ‹~š‹~xJ¬KrÛE--e©ƒÖ³`R=+‹S“âVÒ/ü‰–"Òù(9® øE¨ÿ÷So&× 7‹‹eh¥*2C-NøOÅõ‘äJŽnR¯H4Hö—²jšÅ‡¥‹cèã4JÄG7Õ}©çˆ… ÿ€)oY'ý•j›‘‚‹ìàLô#—ZŽÈ0Kk`$©|ïËü¤œ$¹:˼‘È1™ßR?JÖ’4Ó^6e9ÙÚýOI›°òÒœÔÂ$ËÅ%IújŒsúߨrDv̨Ùa—$w*ÕðT»y-Œ*D:ØÔÃ(«àm5¼©e°Ù`Yõ¨v~2wâ­0HÖ]D%Ø‹|*@Å洛o+_bS"g­aZ‚ÐˈtמŒW_G¼ÊÈ|"4F¬6&j±lõnÔ #¹º¸·ˆ0nrå$• ÂìH<ÔBqfÛN€¥h2¾Vò ¤O©ÜN–;N5bÒþ,P®²ìê7/åäA™†ÓT'=W’þe4seÊ•\ê"4v¥¨’0†Þ‚ Ý~˜WÝÐPU_5B‹×+ z&§Â!aP ‰ÁYÑ%³jl Ì=bPè#BwØáõ8gÅ`ˆp®©ØX#¬ïõ8ƒPÀ.M³i0k`¨\š×;Ì߆ƒ—ès÷ ÷ÇJ.ÅIO(,E—àñ N1vßÀŒ? ¬B}ýÃÝÝm-ÃÝý}B§°½»­£o¨Chéìèèíè6¤R†§¡OŠÈ%Éc„.®#ˆ „ÎpÂÇD1“Ú½<[*r|‚Óá&D™¬ã7‚‘¡¡\X¿±Ö^"Ø«7–WÕVUiµ#=€¬ª®®­…o»Í.Øëëê )Sáðtcee$©ðÉŽw|[ ©KèÃa¯lCžI¾2„&ÅDôîÖÞ2A® #Át€“ ,[\AHÛ„ 4IfI„!Ñ á„‚²CòYZwBÅí9 N{ÂÎ)ÁE×/¨„$È¡ DD⚨!¯c‚²pÓ2A|7 Ù'Œ„¤(}3^ €„à™ðôL˜J¡æ  ;&€NŠ7Ê7,:§üTWÀ9C\@ƒ°b›UN…}ÞJ_˜ü0•¾Ð§d¿© o>嬈è¬øÉSÈS% J½âuLņhÃìX‘j?ÅBo *‰×J4=I4Ú|̬DË}…û÷mîQî1îáOq$IV¢kÇ;€*ü1v$ÉõÉÖ"—Ÿ¤ãmL?Nòר&¿âŠüj¾ß·ðùÅ—\‹×ûïસ¥ö¯Èi°ƒÂüc?mP=èÏZ‰ªÖ;D[Bú_šº£ endstream endobj 10239 0 obj 7094 endobj 10237 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /CourierNewPS-ItalicMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10235 0 R /CIDToGIDMap /Identity /DW 595 >> endobj 10238 0 obj << /Length 665 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <002B> [<006F> <0070> <0074> <0069> <006E> <0073> <0020> <002D> <003C> <006C> <0061> <0067> <003E> <0065> <0078> <0079> <006D> <0062> <0064> <0072> <0066> <0075> <0068> <007A> <0063> <006B> <0031> <0076> <002E> <0050> <004D> <0054> <0049> <006A> <0077> <002C> <005F> <0028> <002A> <0025> <0033> <0029> <003A> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1738 0 obj << /Type /Font /Subtype /Type0 /BaseFont /CourierNewPS-ItalicMT /Encoding /Identity-H /DescendantFonts [10237 0 R] /ToUnicode 10238 0 R>> endobj 10240 0 obj << /Type /FontDescriptor /FontName /QWDPAA+TimesNewRomanPS-ItalicMT /Flags 4 /FontBBox [-497.558593 -306.640625 1120.11718 1023.43750 ] /ItalicAngle 0 /Ascent 891.113281 /Descent -216.308593 /CapHeight 891.113281 /StemV 48.8281250 /FontFile2 10241 0 R >> endobj 10241 0 obj << /Length1 19920 /Length 10244 0 R /Filter /FlateDecode >> stream xœ­| |Õ™ø<[’eÝ—uŒ,Kò)ù-ñ•øˆoÇvœÄqÙ–ma[r$ÙŽC„®@i¸i)%@YŽvhÙ¶”RèA›vÛm»ÛBË.m)--Ý^‰Çû½7#YNØBÿÿüÍ›o¾÷ÝÇ“~Pˆ¢¨ êESTß ¯üÁâS°r3¼‡§f—'é5OüEž'Bµ›¿MQEG`­j²Ž‹n‡ëÏÃuÞô\bÙ¼ôe¸þwŠB¥³Ññà#+÷ÜBQ%r¸v.¸ž ÆàúÓpÍD‚s¡gÞþ/pýu¸Qˆ [)E‰ÎŠ*¨bä"»é©I‰-Š2i!EIo¤ÒþõD#Q QÌê%Ñi¶ UHè…& ýËÏþLn hZ€0MI(Ê¡r¨\ð,BêCéR“ˆºH1Â/&U·ú6ý,}‚ÒPNA+KÄN±Ç]éTÁ«Ü —ø=ng®DlÐôò@ýl_ÿé[n8¹u¼åÔÑ£Ã[?Uâk¿ãêC¨Ô×yó¡«ýwÝqfë0Ú1|óíwžÞжmkÛU^váû¯ï©¨D¾»®ÚØNúë°kÕ»J`« ØJ‡7Ïõ¸=4ÙÍ ÁšªÇE¥F_QN–ð‹çL‚^nÞºc{S#zæÙßV¸<¥$—æ˜z3Ùé.‡Ýµ¢GÙ*»Õ©¿Ê_UYYQŸkGyîÒÙðL)}â¿®ñW´mžÿŸ¿%“ZY¶GoP¨$™.mÍ9BÏèr²³%žM§ÕR[ÓÕ191ÑW\xðÐ#`ÁÕ·ãÂk)HAWHœã„E¯É€? qvÚÞûT÷>aE¹©À8訮)¶XóèǤs#ÂkÙ÷WžÙcQef:5Ó¦c7²š‹«¢‚MÛ†Ú3Ø^Û`G¯HOeS¥°'èÈÀ+­Ò¨ÒÐb̤OÛ,É©Ï#–T¢× ­„,öüB‹Íj©þšÉ2Ùºê:gëÎÖúB“™¯³ƒ®Ì†‘Y¬…€g³ÂSlbeÓæ,U¦ !UÉ !ÜV‰Ì·k}iΪWd!$õC”gõ—ô“`Ù X#jήÀ 0¦Mg,×À|U&Mˆ_'0ê& úê χÆGËÀNÈr@—!‘ÊUþ&ûîºw1B΄>K¡¶º»ú¶l÷ÙËïú )5&¹Í-¦O°5H¿c»#׿a‚ÝÙ™­À<+ ‡5Ǫ=%îÒt{W¡F!7–L…žxD›7êUJ¡8X^}ôû6ð_‡ùwº×|ßÔµ˜¬95ØAõœâ6@Aû Þ®w‰ü•Ý yn”U~Û…ÐÖmG7ïv¨½zW½K\S3Þ]R„”Öí#&s{[Ôž“UY¡*²÷ߺ¡¡>×ésØlU·´on ÷mAN¹µÜÝØˆŠ <κ™«*ýU{[6!!­Ñú@ëwQ/_ž¡Ä¥A:ÿÝ%ô_£ï¿øMÁWÐ…ml„½jý0ûV)ŠNS ȇÄ1Ô4/BI«T ‚ì93B²L…Ú௱ííÛàw›Ì Êvh´£WtúâȈ&[*Cªümöýn³ÉéÜGŸ‹« ªl‰ {k)d—/ƒ6 9÷¬HzGŒ½ @ N¼â:ž;Ìýå—ô4’I²²tžæÜÖŽÎúâ"„ º£sý]þʽ»ÏÄ'ë òuy/7·Oöõ#gnñÜ‘ÇúÄÊÈNE†J–‰T–QãtU5BÅeý]Ol*G¨¡næ§ŸšBvGG̲aøSÞØâ)@ýàÍ­nE¯¾Ê¶ ‹€ÿª—Ú‹3•S¯ÓrîŠýÙ€­Í-¼ÅËÀAO\™øŽ ö$þ©@2ƒ!~aÍ‹„EÖG5ó±¯ÎøµjUçW¬¬ØÐ_8u(4UTlÍ)Î9ìCù×Gšš|½«´´¤•lÞ×Ñéó¶ø+J¹Z bù…¶>zzj¹Ü³ut×tÀ{tjZê(R)µJµ²Äí¯lÜÔêòØ,eUE>¯MÓî,Î/)©Òµ·m?µo>[i¿¯ÏçEó±«{ÊÊ‘Õâ/ïïs® ¸kê‹PyiÇ™kSë=¡JüŸðµ‹ß¤¸ú§Xï0ºݵ“-ı5ʶÑ×6[ùÌ¥áyez•R*^Kl¸’ñV ¹¸ô v‡B®(Þ l)“‰%›Fk4æ1öªª³÷üøîÍŒÞè°{4 ‰,3C˜!ήêÜã«VX¬ÍºªLúD]YÅV»ùÞîëûJ•4C,Ë4›ùfSž»±bòÂ÷þüDQ‰QÏx;ÊëM’åvîuæŠ]àáMàáû@&†òB쥧OnÊR2y8y±´àáÌ@#í-¯×ýöwttŽî¼ù¦;®ª¨Ø¸í±}/ÙuuC=2å”MÆh¹Ü1Rßh³LZƒFwΟ¹ïÞm[QQqí`÷x}a޲0ÐÓÝZh6¡ÙŽ:ÈÁÂ!ˆq?ÕÂE¹6-èpêõ“ K)—sQMÒù4Ÿ—“î*b?mE™i–:·?wsGg“³Ù<·/vöjöì¾ïÀt•Çã“fȳu£?Çå®>|ü„ƒñMÝ䉉½6YF&R÷êBõ ¥Å5{¾¹µ®eSâ̹OÏlÕÊÑhž!߬S(‘ĵoòx¾óÝ/vA$¾ù&…سà7/ƒ<½$iAÒ3H”ñ˜Êd¤_pÖº%)¯;^t{Ô·G:;ÂË»vn(dÙè6kÕ:BÚ¢R¯ÛåÈjøÌg¹ D_m cpËæ. ½!Qk‘"+Sal*kñçl¦÷md»ØŸÞ÷ÆPsž±ÀnÒC9Ré j…D*Ì@99UþÉ‚ßÙ(—æÚGöoÜî…äåò”8FµÊ¬4ê3³2¤ùUóu¿Æ1U…Bh÷¨: A¨`åohõ†àžsõmQümçÓtñ$j>L´—[p»\lhMšëÁ ªm¥{­üÒNMê¶}áºá†Ý;ýue¹¤oÿÄíýý^›©#y™"‘šr‡¹¡¹ØëÊóì´ h$•gyOîïoùØã$•)® »÷øÍ»Îœ7JFkWÔB°±õô¬†Bmw”•÷²¨ôà&dg6Ö5±WÉRH3Òuè ZÛfTêôÝŽš£rÚ½EÑ‘·î~G°+˜kVdó¯9²PÍþPp|H“©W+‘Ü…u †®'%¥qÑêµ ã3iÄéç3hÇ­Oݲ¥‚Ñjr%¥J(dJUÙ9þÁ`¡­PÌ|ü<´CZ‡>@o©fͨpÿ&ǵqCI¶‚Ñ@ë‰$Ц±{7 Äõ‡s3>µ\™ Ül€¬ðUà¦[i}Ñs’¢Ý $™!¸®‡XÅ“¬€ÄˆbÃZ· ¿ú‚¥Ôk†lýÕåžèj”]çb‰ ÏÎoÅë:¾ÃÞ5ÔTå2êQþnRÈuŽJÿȶºšf=½oå‰c¹ ÔÂìYÃáZ7*qæVwü•ýÕU3ˆ±—w݃*£9òL ÊÎÞ«W!½ÑUuûÅrµR¹Ã›ý¸2Lty_†ˆÌ¡Šy?LöïDá(Õ¯Ó|P’˜#×÷òÞÍm}símhçèM7»û~Tš‹”†]QÁxÏö=»Ú[K|õ»·¸D§WzÆÝ®ŽÎƒ=ðÐöû„†eI¡–¸ÿö—jÔÜôñß»³Ò:ºpTT?Ó o?E¹Öe¶ÏVZ2æJ-ñzCRôaúª™…[zû‡‡n¿å湪*䲿3h;z±ilþ±½ÁMƒÕÕ„º{:÷üøPm]ßñ»ï<³k'*ñ579‘VcW«”L*Ó)4¨µõš{>>U»ÁãšÄϽ%Ü+š¡ÜT穇¯iGª«à§D#‡Ð>•‘­qØ{e+¿–š -*ˆ.öàIŸ\n6ÕËØ¨¬£6°.ü»„¶Šf.ÞÝo,ÐÚ².²jŠm‰'^ẖz#‚qÆç½[ØË>»ò+¨Å¯¬¾)6Šº‰ýŸ Ä`ÂMB9y¿M2ì`' ºÐ'~aºÔ&Ï’¡çä-ŽR=ã`¿œÇÖÿ>訔VôYòuÊÊ/*Ù-u_üm\:_P | î¿ôìÞ ·F+µ,µµèú© =ûÆÕ—`~ýpç ª¿€ƒYk´ˆ‹%y⡤>Ë×: g.*–£§‘úØõý}%¾êºÅ¥›n~}å+Y}9­ÅõaîF=ì2©ÚTwß7l[îì˜ß÷ƒJ‘ÇÕØx㉳Çîê-,•¶‚#´oµG§s_ÊŒå¨Ja¦ÃÞ<úɇ¿ûëD 4úÏàƒGÀ»ùî†ã¤‚g; Iµýe-7®gÉÒT±Öã¤åÄ3Ûx©Y]°=·¢Ìc´™MÙV§ÎèS[ÔÐþh­³1Xíªvè6Þ»»¡º€1"ƒž±»LÙ2­w ßÜ(4¸Üí}¢²"ïãGK‹ UR`ÑáÉ2£L¥¥ò ûé~… ¼ê¥žâF*`ßë)·êÜ vd7 •ëšÃÕï+š,9åA´ƒ¤'IW¹–ŒÒFòTÏ›4—S@D/F›6G%É>h:ªeRäõÁÀP•2§mó}Ú×\Æns¹„îjèêŽí½tÒñ ã/°å˜œ¹…v³)×Yá÷öÌF>oüŽ`ÿý™ØO¾ Qõ0øI! (-öÐë"¨*9bI†°ú D<¥’+ ôàzú VýXæÊû²Žœ|­=ï]£ËÝ&GÏÿt,ˆ&BO---‘­lo*<4ê›:ŠwTìd Ð¨¦åJ›w?]1PâÅm=~ýlÄÂÆï(*»?ÉÜ»û–h]-$hÐÞ‰Õ7DA&('&_œ¸ä˜šxü¤É79kŽ!z(”'©ÕyyêÏÝðx°%bçOFfwù¢7{áÑkŽljAK‹ßýö÷ǯ®‚îB](ša;"|Þ<<½õ…/¿¼°„ê¯û§-ƒ¨½õð¡ÛzáÂþýÈ«E2©÷€ÃCU ÜÄb3/>ÿùÃW·lj*+Ÿ}öWn™”GŽÿà{燧€;ö¶UP+ÒQÙT휀 d²w¯µºÔèvâP‰þµÐ†ÏBl…EøŒ£Ž]iÝà¦&»²c1@ã! Åby]MÉQ(F‘.…_O³ —®}J§ÕR`‡r«ÉÖ˜52‰H„¨²üššÏ2h5´@ˆÖ¨è ž€šY3®:#ôÚ¸¾Y»ìlñe ÆòìÛŸšÜU ¡c9`ȔȳT5Õvg]Caq®ÛëŒëå ÕÕºÝx¼0§é.ÔáÔlj—NtúR%RŒ8»Ù]=E&´äE}šÊÆfƒyÝEËèÖÎbM–\_c~Ü>ð-áþƒ&¨”öàŠ–‡ÞG ê:äà,^A;*‘ƒô'W¯t#×”ÕbÔÛ\ÛVϱoŒª­f«ÅMï3­”fHrL­ì{VÁwPlÊÁ¤nb;é“ îv±Ã+j„UA tZtmî’¿ÝùÏè¬ñüÂí»v±#ÊŸ?uü$Ú¸ŠªQ¾óäcßgáõ§/`¥R«oŠ^…l%DÄwxN®¬Â‹FÉö7µ„P`^‚Îö<©À ÛnwhdÒ~j«!ܪQŽî––[ª+«V„vax«½Äfs¹Ju¾aòÒ>»!G«¹\"EŽ¿êÁ‹À3®ƒíØyipgnH·uu¥æ.úó:sž6~~ñ¶Ý»èjÍ/žáBШ5¨”R'™P~)ê‚ê€Ï'5UgºwÒ—nâté!3#z¤õ3ÓõR‘Ù*•ô®|›%Û¶m&º/àjfÇ‹3œÊ\s¹µÙ7¨!Èî¡O¬¨¿ùlاWeª•0·Ù :S^Y<|ü“'OÏ/žûË£Gâ¼M²Ÿº>Wð)àïøñ6Ñ4eMÍÆéå"5{\ô6öE+$ƒ=Ò•Å€¹PÇ8©Ð-cd¡-¢é‹L¹Õ¤‘«mÞ%ÚÕ!Óhs!bäy»ñù<ìô%ØÉµÉQIi’§gÝ™ràØ¯¼´²K@?ÚššC§v:+Æ‚ñ#;¶ÛK¯}™} Túù.ô,ÚÔ„nT^»¹ mßqxGçÂm?e†œ¹5Mêáyˆ€|ªŠÚD:'}*{§uPÎËÊ£XÃ% n¤irŇȧ@o-w—yÑÐð‹êjý•ýƒ±Á'Ùì¬k¾ÊPð¾=ÇÚ­úB“í;“Õ7w>þòLÃ=öCsþ)Æ ÝŒº›Zºvï)ñAC5¹s´¢Â¨rÁôbu +§Šò :´òºî81YW#_ùóÊ„íÙýÐÕ­­4ÄÔ «oÒYxÆiÖŠx»`Utúoƒ¢'qœT  ?õJÌ݇ÿ"ôØ(û0ûðnô”hfÅ/è\ùœà›w3ÄÔ¿ QÈ!q¬Ó ¤:Äå›0@‰^ö²á®‡Gnª¨ìèÚšXœ¬-@f“Ç¿1߬³ÎïÝPYEoïu¢îG5w-\¸9º¯»§hC±Õ—g6!®4sßüswlÏËS`«o ‡_˜ šŠµ)„2ê k\TÐÎÔà®KE§:BυùyǶS×µÂPíûæ¸Å‡ÐLøÑ@…m°Vœ¥¶èµV÷t®õm¹.ÜÔ\˜ÿ±3%E¨ª:4¹¼Á_¹/ßTç°£?wúNnÞÒwÕ¦š ãå[vœ†fIŹFDg+ÊÙ†:÷rO7˜¸¯½¡ùôm}[vNïóWʤÅÙ¨ìôE‰nñÔëÐðïLÍWôfŽ+»µÀeÏ ¿ bã¹Zu© WÞš[¦wäþzÂlå=E¯9_mòX¹éj«ÙÊXùMVŸÙ£5y ·‡G,ÝrHë-vŸÞ–'øê LZuf&?‚,^úÖTQrüPY=×£Ø`¨dm%ÿ:ºb¼2õˆÖQ² 2~ bz3È%ÝuY—y™¬xxÒ£¿ÊV.(†rŠôço`.#LÉeÍ6/LÖï0H!³æ¸ð~J»÷]ª4iT2n?—ûð¥oï³›•êL®,¯BUû>ìŒOOÑÚ—cdç+†5>°ÓBIÜTñœFý#uµAÙÊ‹™­V‹4³Œ}÷43åÊ/³zs°&—cÊéÐÊÑŠ´Ñ^¬ÑzÂèç{mjµÖ%EÏd¶—–—g?GÓ+½Éåq¹$У[­š>ôÛ8ëò¬Säîš|ŽÓ¼ã(ûI4³¹Ð¤‡qYìrÉ!eÊN` /€„Ù !ù®`½çƒ(4(üúe º†*øØ=×ÜØP_ìº)_”j¼öz-Bfeëþ¯,-ìr¹ˆÅËW›Ý¿…!ÐÒ­“ÓßrIÉÙTö„ˆ^ùeaþ>V[_ÖBÎ66çæh­­³7râ¥ËÇ*]‹=_Âø]^£búÇ«oˆ¯ÞI^á[Žäù~ùz? ¤#¤Mð·‘\P/Û‘ç1Y,7¹Åò‘w÷öVWù¼Îý%6fT†ž’õ0N£ÙvG{cÓâþ§¿uðL³X¬qQ·‹ÎÊv¹ÇYæH~sÕ!·«eS"¶„î?[ê0êÅØ"p–ÍüS|¡f‡øµ-Esè[>—N#Á®•E;ÈNJ¾~¯Í°àDYvè-Žâæ&?Ô$Ð_˜žB7^wý]{nuçäLJWþSvUa~Ùùkðkóms#Ûýe¸®n ŠºGF¯Þ;V×E†=}´Ñé°JÝyЛ|¹ à•'­%%#;Æ&`BX…T;M¿ ú”àïæ äÀ;K @çôì¯X ÒkÙi Ýúד›qT°Ó‚w8\„À ÞYù;¬CFô ö­hæ/+­âÅÍ@÷ˆ–r®ÛEÄùIÀs'!´ƒ%ÄNT,GÝšçÍ3ì+û€W¾òŒÌÜ[h1é‹iËb[GQ±Å%êfïîkØì¶\y:ßm4#ЬôÝF¿d³ÕÔ„¹ ñ]‰> ¶s3˜.ÍÆôe3z¶Ðÿ Éç¹äÐÄîôIìÉÛ–•rÉ}åLLU.dP–¥ÕŸö]:?ãâÀò¼ýôû¹rY† x~¼ÒGN% ï»¬ÓÂÁŸ›V+x‡„”öø%¢ÏR¨µ;¡ÀY»TR¹  c—'ߤÉ''GYýé­õ•–v3i7­ÞýtÍd©KOÕÔšüœS—þu4ϨÏÎË©²-•`ÝýŽmªÙ³¤o‚`ª/þ‡Ðɶ a¯ü‘írÁŸ§wŽŽ|rÿññ£ó‘¹Ð\{[û {÷¢ÁhddDéŒLÖÕ¢@Íö–ê¡ƒÓ KÇ"Í-¨¿o~h×Nü;>7í¤ïý«É¯ó’¿—H~©%¡k i|hÁV™(K—ÍØœø"Ëm:ÅŽáž-/·(W¯AÒìÚ› iË‹i!•жÙÌùá ö'(ÿšâzÒÇÙL–ƒÐÇ ¨=þAAãIöå»”5ìý¶5}Ù°VJØNúô ؽzí$+õ“IÈ×ë~WE~ð_}®ÙÓß`ÏãKêìåRÖ! š\f£íäÑØ–¶PyÅ®]w/îmóy öv§æÀ7"§£´¾'ÑßKŸ¸xW¯Þ TKä0øING½û•žj„·ì¹ëÑGfP®³{þᦂ|táÂó]OËÔÃR¸R’w¹è˜{Oö†ÿÆ?ƽü{–m…ZzðÄ©ExFâ`[©mGXxINJéÿºÅ5È"@HQ„ÔªMPC Á{;\{hë껢Iê.¸îƒëR¸ÿ*¾¦O­ŽÒ§¨&Œ#¨aªD¯PNÚJrt¨*¸_-üÅê½¢áÕWD¯¬¾Ï|ÖŠaí»¢aê$à€gÜØç q³ðˆœ[užpœpï¼üŒ fõz/Ф¨x+€æk€û% ÿ*Ü¿ô~Œ>‡²@–VàñEX{øÉÚÂ8u Ð? >·úEa|õEãw°ü¬>/>Gýž= oP«ïí¯Á»—Enx&h}®ïø,ü…BIéàÕõâ]TîCd ZŸ¤+é.ú³ôªpJø3ỢeÑ—Ä¥âýâW%*É^Éó¾ŒDÆ·3홑Ìפ…ÒaéÕÒ/J!k–½$»$Ÿ’/ÉOÉ_ϪËz2ë׊ŠóÙ¶ìÆìÑìDöײÿ=ûÊReHù/*Z¥R]¥:¯6«¨/iò4G4oiÚ)íí3Ú?èzx?馂ø×ÑüÕåÿöPøÎÄeÈ'M0mä ÃJ.ÈàaššG?àa!UŒ~ÉÃ"Ê(Ðó°˜*´ñ°„ú· ÊM x8“:–YÈÃRÑpæ?ñ°ŒŠe‹yXNMfïçá,ñs‚EVP£Ù?MÉr²–‡•­<ÏÃJ¬jàašªV¹xXHéU^QrU+‹)£jK¨Ù J£z‡3©MÚ×yX*x\§æaUcø"Ë© ßx8‹Q-ð°‚ò €$¤7…q‰‡…°¾À"²þãõ,Æú7~‡AçÆg ,!ë«<Œ×Fà ¼nªàaX7iœÉÛ—ƒ9ûr0g_æìËÁœ}9˜³/söå`ξÌÙ—ƒ9ûr0g_æìËÁœ}9˜³/söŰëÄ´‡‡A'¦FË`]ËË.ƒu?/»Ö•¦S<,¤JMsVÀz†é‹<,¤òM÷XIèÿ'cú/Xƒ×ÍÆëïX›¦smšÎu¿™‡ßì °ž¬Gy¯÷Ø„é˜ïãa c>Dà‚ÿ*cüÇlMÛך¶¯Ðù3c:?$p¦“ãäa “C¸¬oáa¼^FàL'ç:9DçiúÏHÓFš\irÉÓðåiøò4»È“v¢–©y*DMBv‡¿ õ¼‡¨i÷PQ*ïÅP›à*0þ Âz˜`0°2 Ï{j!ëÁÿOJ¾g 5wf©…NÖ:à/·_L©5ЗðP9Ym†'fáï<3<$ÈS@/ﵟ°G˜š#k Õ —NÖ‚@ÿ3„ÌÝÜÃk1jÖ¢ ­ÿwÉX OaØ5AxÁœ0pq<Õ­ 5Õ ?Ï@W„÷ëÏ>Ø{’Hˆ9ÄÏ…€jœð>ÍSó^ÁSí‡HŠõ‰m6 Xã€=L(ÅSœcVÃ'CåmŒƒ;q¢‰̤kÔ9Úk”ûAŽ’uÔ{»ä‚Õ6xo[a¸V±|mðÙMÖ[ae>±5Ûf+¼zÈê•EIÉ[!L¤J\áÉÉuN£ó„çy"ÆMÚñJûqžaûÍÃóËiúó¾´@´ÎPcäî2à/¤ö‡«Å4Û.gñõ?œíç>Ç ŽNG!âå!²6E¨„ˆ~#ð¶ý~·i¸¿Hð¢ÀÖ1ö"nÏÄßÑLÒrKħCÄ‹Â7‘ÊHÄG’iÈÎíÙOhÍ“aäÉdWز®Õçâ”Ç'½y.U[¢|5ˆIgy¯›&vLfÂ_Ù°tqbù…uñƒ¹Å·¾&O¥ìåÆz™%ô9 chŠTÊ0Éâ\O'Sp'ÊOã¼mæàN×Ûo‚ì°L%k÷Z>#ÏÎð¼rš#µ"Hà{Ôøº\}›˜’Kt] þµ°ÎŠIÊA2EÓ¨qÁ<±Éò:Ì ¾/O ήÞ°øþP÷Ág‚dÌ—tó{m.ê¸üKMCÞÔ“ÿ·;.K$sâÿÅ.É{¾Ë*~ŠöÐò|h28bc†¦C þŸ8$`‰ÙÍGcÁD8aægǽLK0ü$&Æ FgðJœéˆÀse55¥%ðQîešgg™ðÔt"Î „â¡Øbhb(<Š3½¡%f :Œ|šŠ'BsÁØ ü»›1±ÐT8žÅBL8Â$uë ÓL0nf¨‡é›œô2ÁÈš‡–¦Í›¤T{Ù¦LG"8¯Åâ˜x¹·ºœÉï Ç¢ñèd¢€ 6Aî,áÐ{†zû†:Ú:65uôõ2}mLwǦÖÞÁV¦¹} µµ§µw(Kš%šÇ™DRÉFçcÑùP,±ŒeLÉÊ‹NÅ‚óÓË„ï0hi!bÆ–™åè~r<ºH¤]ˆL„b„H?ÇD‚ pŠzp* Í…" /³›.†˜èX"ŽÀ“‰uÌ`á–‚± ±3Ž…Æ³ËÌd,:·ÆWöŠN…Ê`®=7ú…Ç@ØŒFBéyâI¦BqoJ©‡2‹ÁÙ…àØ,°‡éO{™­‘ÙPO†Ç¯”œ-FáÈy681Æ>œebÄ÷ŠñrŒèöK\ÎÔlx.Œ‚MÞR46Opn7 º ‹Ñ%ðÁ…±Ùp|ï´8uÏ—àL5¿Œ·¦¡õ}tL® Œ,3ûBq²Íx42ŠEx b<ß9>]˜ß_ ƒûb¸R|Œ– …!¾8‹a¼”ŒÀlŽ'ÖlŒ ò\O~0YÂrêq›±P’ìLÔb„­ƒÍL “_í0²ê’RiifæÖ.X,-+óûá3P`U•5•5YÒéDb¾Öç[ZZòÎ% ?K‰Ó .a]@HS@i0ßXöcáx4RÌ ‡Ç Aw06PVSQNœ-F2 q°”×O†cñœŸùÔÑñ_œm¸Ô:èŽF&À‘ÐR|>ÁZLt´4Ÿ†Ðd–‚qf"OAXyÈ `F0ïÂX<fŒà( $¡dT`‚+ÍNÄ™¹(0_÷ž\˜e8…ÆBÄÇâ@ 3¢M…±ÓNpÒÇ™%ð~p°‰Ÿ.Ó„À؃ /Ó äÅ”|ÃÀQˆF0‹.LMƒ2¡ý 0;xÂÉv‘d+Ì*¨h1:»ˆ-1¹ãÒÄÖ\ZÈ€Å`»Á8è:Šéƒ.ÃØŸâIÆAsØ‘&ˆ#-Äñ“ý¡Ø|(±$©°–Äs1VFø¨Ú^&ÃÉG‘ðM¾¥üPN„fá&a“°YX-,ÿˆ–üˆ>‚JSšžùPÊýT)|tùÚ‹:Lýš@†Ý | p¢¨ÿŠê’g endstream endobj 10244 0 obj 11970 endobj 10242 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /TimesNewRomanPS-ItalicMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10240 0 R /CIDToGIDMap /Identity /W [0 [772 248 496 496 276 276 496 386 669 276 496 496 669 440 440 496 276 330 716 386 496 496 440 606 662 716 440 440 606 662 716 276 496 386 330 606 330 440 662 496 496 606 276 419 496 496 716 330 662 606 716 212 248 669 606 386 386 552 330 826 552 496 552 440 826 716 826 248 496 496 417 330 669 496 330 496 ] ] >> endobj 10243 0 obj << /Length 889 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <004B> [<0020> <006F> <0070> <0074> <0069> <006E> <0073> <003C> <006C> <0061> <0067> <003E> <0079> <0065> <0064> <0066> <002D> <006D> <0072> <0075> <0062> <0063> <0041> <004E> <0044> <0078> <0076> <0052> <0043> <004F> <006A> <0068> <007A> <0028> <0056> <0029> <006B> <0077> <0031> <0032> <0042> <002F> <005E> <0035> <0053> <0048> <0049> <004B> <0045> <0055> <0027> <002E> <002B> <0050> <005B> <005D> <0054> <003A> <004D> <004C> <005F> <0059> <004A> <0057> <0047> <0025> <002C> <003F> <0038> <0022> <003B> <003D> <0023> <0021> <0071> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1739 0 obj << /Type /Font /Subtype /Type0 /BaseFont /TimesNewRomanPS-ItalicMT /Encoding /Identity-H /DescendantFonts [10242 0 R] /ToUnicode 10243 0 R>> endobj 10245 0 obj << /Type /FontDescriptor /FontName /QBEPAA+CourierNewPS-BoldItalicMT /Flags 4 /FontBBox [-102.539062 -376.953125 836.425781 1003.90625 ] /ItalicAngle 0 /Ascent 832.519531 /Descent -300.292968 /CapHeight 832.519531 /StemV 100.097656 /FontFile2 10246 0 R >> endobj 10246 0 obj << /Length1 9216 /Length 10249 0 R /Filter /FlateDecode >> stream xœ­Ykp×u¾ €ß‰%Räå[”I‚HB¤DI4P”DJ|éU9öXÜzš&Mmgšd:ÓªS÷‡ÓL®[O;î´3n¦N:LöÜsï )Jrbv÷Û³çž{ÎùÎ={‰RJ>CÌ„œ˜óx¯oö"H®Âq*šX‰øbÉà÷±Ä9úç#Á ²¡*Þ–nÀý¸o‹%õKoYÀýpßPCryuÅÛpîë’ò¥4©& [ú&ÜÓ”œTnü÷;/Áý?RßH$ËmÓwI !%/”øH£´ ¯'Í2‰˜jKJL6k™ÉTRf±R~…ýM©)•4ºv§¤fužë˦è!"½ñÎÏð±‰D ±DÁ°™ØñÕ4×´7×4G-ä5¿yçP ù9¡–7‰´öÁÚZÉóKä!’mÈ?äóºùÙåtØÌìbµY[[íCƒ­-6ëzaÇ&¡µ³Ã?àrÛ ðKk;äé铎Žì‹Øo“GvÔI#4ø§¿f©ªnhmì?SHUÕõÍ=‡ Ñ·×픺:'.쯫nš4_íwØO?ävŽìûÄ®¦ÕA§»ýàn§éŠ«Æ^UY[\ g½ºÒ¾sÜHngGg»$ý„¡ý].‰åéÊÚ;–ß…øÈ8!Í~kk ¸Ýnù]n8‰;EXðHÝŸ±œ·Ëç…ÇæÆòW^ÿâܼ´oúsW^ú¥\¹$I ÑGŸnjv¹%ÚôÌÓ±›ó³’í\k Ž…øz6þ¹äÁî‡#¡S}3GŽœ?6—>0*Iöþ²ŠvG}[µ$¹]mý-MM R`"DÛWÏ9,$µn²«½ÑîØÕà#9\v™¯’ àÒîB „ø;mëD,F©³C<„»ýÈ™ÏÎfVVûÜ®ýMÁc<46xùÚk¶6ÿ•ÝKm¥øßyn ¸ùÞøÎºi噎½MGß(µ´J³ú¡ÉénéßÓÖRyùrE­£þ0ôv´–H•ÿbr;[!@ÔDOìBSÇhW`Ok¾D¾¹ö–ïGPçãÃÊÓÍ?ÈÔimÁ‚cùÄ3ŸËuË>ƒö°¼ÝV› …Qæ·º½ƒûw£þûs3Þ~éůþÕÙÉ£þŽIW]Ù¶mm-žv‡½¤ýàèéçOwöõ½ð÷€Ï¹ü›ÁC‡öìjªsI’­¢¦¥­·Ãå6]k¬Ù&í¨¯¯ÝîÞ¶sgýþý“Ï>ö˜T³­±Þí¤ö=£´ Øéï²;%¯sW§ÛUãÞ7|þÄDÐ; ÅßÐàr7ºv{6Q· êóÙµ5K¸¤Öq [¡­~»Ypemm<ú|ö<Ëæï÷þWïë_þ¬}Dšö5ùé… 7-©ùñW?ùј(!`aR_XyzÇ ŽvÒÞ,ºKW³_j¶òµÀÝl3µIÑí­ÍÝ-˜Î;—ÛL_Xýa­}ÏH›Ë]Ög>Ùz{xÔäÜý‡·LΗ*™%áÝ›lí}ÖÞ[Àk+醨ša~žmýZd²N£ÝX^»ó­ª‰àÕÌŸÍRÈSçæ­+?Êd¥Ss×¯ÝøÞã—Êÿ¼~üp,¾pjLúÄÉ>¯äµCmµø:»hsâÂÍÏ_ýü¬$]Xz³Ë·<çéy¨û 1­½´:_bozÈ(Ä]XßÍ-›³ì³ñ¤7ý¢ÎŒF }öÈ'Ù €þµú­?€¿“-”ª¿~ã[zF:1óü OíÏ$.ég’êDàâêïñfä+æë+A9}ñ«ŸzâSǧoKçÏž D9yp Ø @…°6ntp׆ÞïÈCþ|w!£…‡>»šétYàÀèì‹33å3zð¬Ej욙ٙ™q6HìÑûìÑÆ¹ ûxhæ«Ä<’ÙÓ¿ú䆯ûd³ÓÝT_nõIi{ÝnñèP—½¨úLäeXíÿñ¸I'¼­¸v±0ã¢4:½"ã¬XÝ.Sè3ÑøÀ töôõk¿¥Ç"ƒ³s/^Ï^Ó3“G/ýöã‹ÒÔ±fiÐ{öLì³_úÒüüÐйóKWåWgçþR §.L¥OÇ"gÆìÝ)ñ£'øÚÁG·íÿm6þa­tÁª”ˆ5/”Ø[ø£¯ö:'k¤dZ*þ«°Ü&QËíµÿ„ëSp„ã›p<Ç«p<ÏnÂ5Ç-ÐwçÈÿHé=S£iÖôÓ‡æGÌ/¢Õ r2ex»ñïË"ao~ö·Šg3jº¤í›ïØL4ÔbØBzó:%¤NJ l%^é)mäÒw.%¦¸Œ4”9.75–õ \AÓW’H…1¶Êúšé1«ÉùJšåÓ•O,‘Š*‹À&ÀÛ6“áÊŸ l!î¼N ©¬ØJvTØFæªÎ \JìU?¸ŒT×X.—¶Õ8® Cµ­W_­1¶Ê|®ê«IoíUðD²˜Á·ÆÚ¿Øc¿ƒ¸ä;í¥[ˆ·öÄV;ì#[H·½±ñb \ا—¢ç;ö'— ~9æürÌùå˜óË1ç—cÎ/Çœ_Ž9¿s~9æürÌùå˜óË1ç—cÎ/Çœ_†ËY®ì?reÿÄ o³ßØBöÛßC\Ébwìbwp;Õ(¿ 0“Ï"ÞòÇ5-dÄq±åÄñ¶ÀÇëˆ opZ¶×ÉüqîüqòyÙ;¹Ñ© þ;Ï#ÞÁæuÞæuþ:âzæ§ó=ÁOç_ ÞÅjÀåjÀÉ9jyëa-¤ÏµqóÓ¥ ~ºÎ!îaq¹¾!0ÄåzšáÒ¢<—å¹´ÈÿÒ"ÿ+‹ô+‹ô+‹ò_i䞬4QH„È$WJ^&LC}ð®çÈ‹Ò1‘€ë,Œ‰‚:Žš{84² çð&¯FЫ,<£%ÓpÍÁõaô!Œ3³è ýeÔËä½g³ï…3%»Á:ÓÑàIŽŒë‚ïfw×_?/Ÿõ$DÞ“Ÿ¹xÞ)ÈκÍ-˜k–É0Ü'᪑%±yÿï,P*¿8x¬£g æ Ž:!”0¯Œ{æQ $Ü« Ä6MNÀì“$Ç8°Âð R8á|åÌÁ™ñ6,à3…ÒyREÊñ`1Ä‘E}SÍresžÞ­ä³°9z^c*DÈ¢OÃx¦-ƒ’WMk†’E|º‚Qs²˜—‹2“ű¼v xæ’¨Ï=a«ƒ3©`=+(‹¢Æž‚Ydu|Ṽç˨§‚FÎùœú=2cT^+‚IŒ+&| Ó‡@–Àø"˜½ä]󥊸XÆ”"+9aónó…Eõ°šXÄU̽^̤„å»1Ô‰Q­Ï¯«ÍU±yf.g¹^Æ•“…ó"\y¶3hMßrn–ý$pÆLó.8Oë×ËŸ5ƒvB `Â9µ˜Âµ˜‚»Â¼lm‡1Ó|•ÊØá´¢××ÖŠê–ǧß7SÌ»$Ú7êJ]g/‡ü/!›Å½""ꢠ©‚.ï"YÌ8³ËÇÃý*®nÖ¯X5ðüóU•õaTéÆºWD…ú˜ÄØ73Ç2Ìì_¹‚¶hBxå½-µmC¾ –Y| ñwóa{`®¨<û†=¾&ÙZ]lÖ˜ao3<[<{€~×ul0&oÈuäcy[ÈòæB˜a¶Ê•MñxXä-,@ÿiaoνd€øámIáÜw=ð~€£°½ë9&4ûài?<ØO|p°QCdöì`Ö[:x6û ä‹}z!Ž+>„ïÖ/Ë)óóv û€»ßÞÑ|÷•ó]ư“ÃÑEo,ôb#ë“ðNŸÂµºq·‘ÖŒÎÉ:ANä‘14†²¸Èm0ßEósÏÀvN úk'„U£½Ÿ)Z5|#o ´'—D„iŒ&„µ.Š¿W®‘C£“ó½@k—¯“Â5¶Y.x!…Ý„±îÒâÝÇúof]/bµ—EF¸[ÆUÌJÏ…œhhYÅ=ï”:úÂí÷·‚¿:æ.†}ÀÈL´B0ÊX…NØû1ë̃úI°ê³ŽYõà^áQ±Ÿ2ª#…qöæÇübçÊa¥p]å2‹ñ̳¡“ämϯ¤•ˆRèËt>¦PöoDt\ÕÒª&ëq5EÓ‰P/=,ëò}”<ÌSY&ÉÐÉŒëîë“·—Ž%t6é:«dmY ¦FÆÕ¬W4:­äèÃj"L'u9,+Z†™÷öîõÒÝSñ¦fÔˆÞuªH.ÆÂГs=l0;5/Ü¢óšV’²¶DÕÈ=C šgtESÂ4ž¢!EÓevU³)Lez§OÌO'ÇÇæ'OLÓAz|r<0= c³ÀT`z¾ª¼ª|>ÏPÝÈ,Ã0eZSÓ`n…¹Ÿ2¦F59[¡r ¦„Ôd3 ]\¡+j– ©ËèL6†ì0;à\2ÌȂTR .G5EI*)½—ž…a1yY¡ê"óFêëœaÉËÉšB•8Óh8®)!=±B#šš,ø¥Â\jTA•hÆ…!=Z|1«ƒipSM)Åuf § WùTä–鲜ÈÊ‹ p;“Qôâѽt!•P2 £€˜º C3i%ÄC›#§Å”OEq¬Ç¥r‚jXpÝL¬ana>}£S‰x2΂IP/§jKWErB5%’]LÄ316ØâéNÊ+üªÒ+,q… ­Ÿó1)'§VèŬ’ÁiBj ª-%"Єߨœ‰©YXš²‡ÕÁj`søL˜Tâ°¨8cL/#¸èrH/pÌ“…ב»›E—óBrŠ.*†!˜GÖG˜ÂÂÜí¡»÷ø»¨¿oOß@__YÙÂ1öõ÷ ÀÙïóSÿÐàðàpUyL×Ó#O.—ëMćÔä< ÓcŠ®'í°’‰GYùʬd˜NNŠ4ŠUÌ\Ÿ|xª›m#j¬85H‚² kqð6¨A+вQ|SPîTô¶ž)cÖã!(•HüL˜Žë¡ ãüÝ=dE] §0Np¡fò"šˆ`›`Ü¥aõÑ… ¯"%™MȬ Ž«Y=ÕÑMžÃŠR—A×ÚÕ•P,…΄ÕP–Q€EØ»EÎ<1=™ð$uöpO2óhˆ§#¥äzÙ“•S Uî?„ÝyD‘ ö–¿Ô°+ß©êb›¿¸°o[ÒIVª‚7Ôû€—Pãqò÷;“¥"û[éÅ’í&ï«m~Êü'æï›ß€ó«p÷5ó›_1ÿùÛpw¿˜ã"æñŠù8Hø7"Gf7øÇ¤[À½)ÿ%Îø]Š—Ú:ïƒÖù)X~Ÿ«“f@¢ßwŽŒÈžJŒß« ÿ¶yJ|³/äý&²•öô}@ŽÈIñ«û~k|/Ô îä„-Udð]±KÚ2&K“å€eŸeÜ2dÙk9dµ³ ƒt'HYÆ@¶ñ7ÄÂ|ó¢¶ß}àÚ~ŒLcÙ“úÙ^êË×ÂÒ=ôùN| c‡¹$ã·åÔ=ø<röE¿Çý¹LÈÿMOÛ endstream endobj 10249 0 obj 4348 endobj 10247 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /CourierNewPS-BoldItalicMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10245 0 R /CIDToGIDMap /Identity /DW 595 >> endobj 10248 0 obj << /Length 434 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <000A> [<006D> <0061> <0078> <0073> <0069> <007A> <0065> <0070> <006E> <006F> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 2746 0 obj << /Type /Font /Subtype /Type0 /BaseFont /CourierNewPS-BoldItalicMT /Encoding /Identity-H /DescendantFonts [10247 0 R] /ToUnicode 10248 0 R>> endobj 10250 0 obj << /Type /FontDescriptor /FontName /QGEPAA+CourierNewPSMT /Flags 4 /FontBBox [-21.4843750 -679.687500 637.695312 1020.99609 ] /ItalicAngle 0 /Ascent 832.519531 /Descent -300.292968 /CapHeight 832.519531 /StemV 41.0156250 /FontFile2 10251 0 R >> endobj 10251 0 obj << /Length1 22988 /Length 10254 0 R /Filter /FlateDecode >> stream xœ­||[Õ¹ø=÷jXË–,Ù²+˶¼—,o;ÞŽãxϘ d[¶Ë–‡l'Í&@ „$Œ  if …BY¥¥¤¬f×£¡…탖÷hyĺùçÜ{%yèÿ=çw¤sÏ=ã[ç[ç(¢(*ˆÚE1ÕÒ‘•«a²› å(Ýî-Cï*&Aý/µ²ÄaxoÕŠªXmù#РÚÂÀ »à9ad̳ùÓ­k2áùE¡Û]î{æOË_ ¨ª xÿ«1ûæ jŒ¥¨j-<³ãö1‡úûÖ×á9›¢Âo§ä5t%¥(éq©fˆá¿;5D‡J¥´œQд”–H(ê;{ñ’vøkr»© н4/¹Àí (Ùz¸‚B—.]"}hj˜¢$Ã01CÉ)ʪ3éM:Ó°„šg™çç+¤ÔEŠ•q¤§ç„ë ²¼šéW`¼¿^‹¢"Y:X¢‰O´ÔÖÎÐY2ýÉ)ù% ~Sœlñ´¤”$ñ ,A}p©›ùD:FéáÉ,2B äc&ó'ï:Ý 2}¯R¥ Ö«¥ _õ&a© Q‡I¿$W«`®‚K—$7ô°Mr†±0~ðÁ­×[õz" Û™}#Oþhä¡‘¢xbÞòèàn­ äÆâÆØdDG{ÿ‚ OEAB†hƒ÷oôñÀ6@‰P”úP”JüFêýc!yõËKï1Èìe$Š0žÁ°iÃdXÂÈ?^ÊÈÀú¤Þ€ßZÃAÜò„q<ú¹Ì6^Ì1¸J ’t\{ ¹Õg_ûp=;DãççvH¤ U‘]°Úß¼Æ}o[ jë8qGumbHÜ‘™´hB™›0¡TʨRK*JÏ+MŽ 6ÊÊW¹Ú;f…J¤}H«6dÅfDZ¨¼¬¦9+S§Š´å•ŽV®ÄîiÐ\áRh¸x¼‹Ì6½Î´dã˜t>.Ò7mÛ‰Vó¼ñFˆD«¿Ø&Õýö·\Ûüç‹Γ<îxÅí°ow³AóRÈæg”Ž×DQ2Uc³ñ:&ëU½ >1 €ÊÌîyé™Lˆ,(ÌÌZãÓ…ÿh(+NßûÖCÛvìØöÐ[{ÑàÐŽÁ ÒçŽób3ÿdgUFf¶Þ@¶«%%®N­œr÷ÎǸk'âo9|‹c¡@èÒHJú* —ñâ!2_ž·8I)ÚwýO^Ü·ÿ¾rý¾Î‰É»îvONºï¾kr=üü¾ýhÿ¾çžß¿oßþçON¸Ý“·ß>1‰Ðä8HãYàK3Gô/ÑmSð®Åÿ°ò’/êGÓ÷v´Õ6VV¨ƒCAB"£" ×´<‹<ûÆxR©ØWNˆ5¦ÿÍ#é©('/Ò ‚)mˆÖ ´ôû¹<ŸZÓk5ÀѧS°Öç€&]¥ãµ°±Ñ¯…ͺ¼%†o“-l[“6Uäæ˜ J K®È¯Cõ<ÇOX,ܼ֬Š:ñ1%;3­¼Jxû¾(õõ>ÍÝß5o®«3ǣ⦵Þ Ñ·U¤¦Æ' zßU§§¡è‹_Œy¤iê ÈA7‘âJЀ6"VŒ½M@Õ"ì¡Ù$#êÑž2½Oüêhg70ââšêÖŠÊýßg:¥©4ƒ··Þ¹¶Mðl{±¤ªªá‰áæÒâiׯõ[N ¦5î-ë®i÷ÕZ­E*ÐjU!Q©Í­ýÞ7 Ð=Z…µ”´7Ym(=m#æÛSÀ7x-±Økùú]h¹=ÿ¹°ç%.Ž]Æ‘€UžO yêÆ»]Ø(Æ0™_±;lð)V¿r [¤[ñ?¼­lIšµ —9"ØZ „H&mëØsC[2†[s²‡î¯ìÉHCÓžþpôH$ê5T­¤%×ßqrý(Þ\›sÛo®X‡F>,)æèmŒZ½¢£¦Õ­²[“S"£BtÚ˜hpG6ÚŸ €a ÛºÆ&„Z[\•6klXT|CýµWoÜ€ÿ ò)𤰥43ŒÙg) |$÷[ÊEíÌ;WúñÕÛâ|4/ä¹ð3÷Ÿw<ö¢¯9ŸoŽcVÎÿh阮A©žg²æÍüÇÂVÌðΙ2ËåøoZË“Çëò­ÎrëôÍü[Iù|øB‘`>Y¢vº$£¯¿ Û ˆªÇ,÷í–˜h YÞ<ÄÐúà´J1œä­$˾Á¾aïÐH]½%ÕVož=ðò$eTʦPù°s«gýÆÖü];ß_SYÑ˽çà ãäAJúwÔ¶bJI^µjmïuǯÛsUm­;[¥ ’žÏ² &ÕÊØ®ü|”c½qýì±_oÝŠt!)¨@0(Ý`¥Š!QD7xMkâ T.Ö‰:?Ïs‰Ø‡‹^µÅG{½‰·‚q“NçÂψòù¥´öä€ÝwUyYrJ[‡Ý{ƒøâE”²¡µ”^Cã,÷(:ÓVZÂÆ¡´Œ–Öë¸ßtúøÒ·nˉ YÍÍ:këÁÿU^¾9Ú–WØ\SÅ­ñ¾œ`Ë+®Àã±%ÇüËÈR)8Jvç‚Ø@& ïä"ç$óß óLž]?2\ImΖ­»ß½é0Bû÷ž{íÚ«»£œ£GŽlD'Oõ;bã¬! è´¹iéèà_<±ç*„®Ù»ûúžÔÕ}ûÉý É’¨|,K~cb„ª€—$ÐÁ>£¢Çþ™Œ×Á8Т‚=|~zØYZŽPy©sØó‡['ÄÀkÂ5vó­.ø»õæ1W€Öûî9T^291779^^†^B¿ãµßü¹»ÆÇ¿ë®1·{ $bX³ÔXõqb€õû–qbOo}]߯ւ¬ Áð¡­C•ceåKÃÄ“¸³$#9¶¶~•÷³ÅQbïÊ2“ùjï?.cÕødb÷eÚA‚{¨‹øüÓ×é ÑÎȰ¥1úe\‰1Í'Ϋ uàµ!w×Ò­ˆæOº6¡ªšk++Tð\›¸½«ÛÍ}ñÁؽ©ÉÝ›¹Wh%·ú2>À€c[_K[^ys‹¨[qã†üN°²ùù…Mk«ðGÀ;ГüˆLL5é´¢Ú ŠèHFPuíì–}¯?qâø+û6ÏÖUw¢Ù¹g~°mÇÕW~fn–®;sã¡–Ö@à¶ÂgKÛϼzê^tüö?|ró-èÔ=X2€š»šùD¾žšV¤[Æk“Ð.ï-"ù^ñ©cùþ@»|ÊçÉW/1Η]†Z/0/.•Õ#T…dTÒ$dsK‹…HFç=F%Éæ˜åü¿ÌÒH×s25®FÐ#è‘Ð(m0—¢ë$NF-ä£|.•¸Ÿ™¥{*gÞç2‚ß·¤…~"0Iý±šúàÒyæ#©”Šác]m@ÆŒ‚Û„ãy©1C¤–ùh·ãxcEUfL¼9ĸ{ð„½Y1à/…wšÌ)Q–⺑™M7¦­º¾­Ñ¿ÿ÷÷“ÛQlt>»zUy—çW(äÎm(:.ϼjuIÏŽÙGy|T<ºé¦çŸœ)5G$ Ã7á\ï ÈÇ&¦ŸX äW€~ñ@h¡ÌðÎ,θ%-I…!´$?øÓw¡Ý‰¼‡Ë}. ÐõÜ“Üo Àg˜ÎXw$¡ÝÜÙœîÁ}>àsŃhг`ˆ5(BHÂQ%ùòâºEQdv· Kjp°\‰×ûé¥ó’² GŸ÷îD[DBi^FSH6Ñ•³Õyþ| £Ÿ—mËÖM{2CÔJÖpü¡Cƒv”Û·n°K£VM46 5MÛzV§éäJØVêžÍ'îÊɥ﷭]g?:åAY™ÙÚPpgCþ8hª1~Ô'W+C@;È0íÛÁÃÞZ± Ci _À«? ‡_ýù lËhGÆ;;wz²»§¬Õó+êÀ7ìi¯«¶YOø[1œôV}óf”›íØL?‹©¬ÝÁª®ìGI‰­-äÍÂó~€»ðã@Å(ÈŸpÕKR—´’ÏÛÊzÖyÝt¿}x°Ã ÃÙ04xê¥W®Úsí5¯ü„ÑDóÄ}ï[µ2º®²bfæ¶SÎQ”ЪÐ4ÚôÊQ´g×¹—÷^CöÑÍÜÉQÐ(àu™bKÕ„?½NDÙ‚–Ú&íâ¾Iȇ•ƒñC!9ŠzP»Ïþ€’àcÛ ïßöú$ÚGr9£TDȶ·Ðß÷í~Ê¢‹/.<äÀXô¥×™$Fà.êøƒ–À6ìÚ_ÚZÑ1éXmyͯÝï“‚Ï„Èfëí¨¦w†Žåñèȳ=->ù2Î8¯EË%zz'>›Da&›D?ÿ]zçæÍðü!Øš  Aâ„ì³k²gI‚0 „/HÓáј}Æ ŒÞ™Ÿ‡&&ï¼Û=‰òóF×¥–€`Üzëè¦âÔ`ð/ffZÚZ›çfÛZŒ¨«gçî®îž®];{ºèëóÚ;¯¼el¡ñ±[6tµCXÝÖÝÈððÈu-%Ÿ¸š× ææMý «W¯ê÷žïhoï›ê„?Léÿ½û)PzÆùC)¹É†La¾xŠyÛ{=è> á¥è)ï?ù€‰éoô–yxšžk¤_˜ ýÉ ]ª{ÜF9äëÂ…¤î’\Œ@ þÌ0_œ—dñe$ñ°É¶ùŽG°8Ð%‚$Ug¤•!µZÇ”èÀÖÈ :Æ'VWæÜq²°%Å‚zûN ÛûĈϚáó-kmÞ ­-6¶"íšp>®£MòÐ&~;n’…è,‘j5༜œ(¢2-ùUÕíiæè¸Hsii×tW¯ö_¢µý—²/·ªšØSx Eœ­ ÕT¯-NK]¡J,+õŒv~< ÁÐà$ ^.mÕù÷¯)`S/ã["ôô‹Kî‘#Í·A5‘–¢ ééÙ:ÞÕ!S@”­TÛòÖ_Ñrré éY3Ü»Oušø-0³íƒÏÆmÖ”¤WG;Z¹r}„\ðé²:Ú³2ÑØøþ’¬ÜÂ’iî÷wQˆ^Ï]d^›ùSB Þqã7Bàö ×ÇÆtwYÔÁº`µÜ™••é–“‡¤Ž®8}>½{×Ù3f%Rk´*Õ+÷Þwïé{OýBMÜvUü}§víÄNf:w‘Þ)¬)ž‘‰~ÑYG„MHïŒíêNÒ{Ž‚Æ²3ÊÌ BÄ®k;;Ù8ôÏÎÝgÎÆ“H@©þÅ©{ï»ïÔ½¯¨TZ)ͧîÛ¹ Kö Ù°ú+¿6@Ì¿?s™ìÎí¢È­X(à!Ê8æ$¯™¼Û—¦v– ŠÀøs^'ìQP-žÊ%·2¬‚´k–ۤHÈú¯Üöîö\…®¾ö±?^fO2wŒ:Ì«ðÇÆÇ$¼oüüš½?yqï~ôóûoÀswºq*Ð}'Ÿ Ú¶ÏmkàÁŒÌßh¢€S³]mBWúŽ+¹g´'R¼ì;þ²‰µ×Q9*zWyubx* 'BÑFú½Ë&í½éô›âyÂ’>›bÀæ0ؤ4_æd±¶³.×J?r#÷ÝnŸ¶(á¡¿å%¢L_•òQM×¢[õb^HHѨàR*C‘;±ËÝ©`LHà‰îL,H±$§ä'ZRPJò:Ä}îp„V‡d‹oS¼Êe›ƒ!!a*`»ãÒ{’5’©ÚËi‰Êʈ£TáÆL¸¨­Ì¾ø¶@<dÞ ð\‰›Ùå¹¹¿«2±ÊƒÐþ}¹º»Zµá¡*%JëpŒŒ¬[ß™]]…PM•gzï¯$qí>&n§zEge/JcÓ[6Ô÷yúº :¹2 &×Fd®ËÌ2¯HHèî\½ªçþ­{vÕׂ޹…ó2Ű[J¯H'Øt1¹gÓ öÚ&j=]^ êå‡ Ÿ£G&67VÀD´æÕ›LÖ¥J¥ŒÉ3Å¡ÒÒN#@©Œ³Æ™@£Ï“â3˸cE IF;^©Î­@#I ø¤&L¯RJ$I …hdÃJ섆ªU´41)Ÿ;Z‘˜ |ŸYRÄç@ôHtÛUp?sC¸ "˜øù2Šx`­*LÔW KÚ¨P®•k5D`M‹ïŽáæ™"ÿ¤t}gº:ñê‡LD×à%?Aè£yZ£É”Ã*øÀ±ÅV¾»Éº‚gí k*-k"‡FlN|2èÑç‰æ´•Ò à¨¶Ö rG (¥J†=îèÆ²•DÞŒÄD^‰ï­ 4îMú×(“Â!2È·à¢ç‘Ž{':1JÊ Lﻹ¡Ú(œo‘RO]º 1H.R!·@,ÝË[‹lé=¬ É+’úϲ}šTÎøÎ„øæ€ØÉ£?ll]ÝØ¸ztScciQIk[Q B%Em­%EhÍü?ƒåj¹IôŒR£P*äH. Õ469à½Á gScÙÂAÌ—®5àØ5­q6566¶——´wãÅܽR¤P¨Áq“y%PQ)d2.ÜÕH†ŒŽ6­YÓ4ÚQR„‡Àœ%Å`'~šë ÐÃiTá7e½Iö4LK¢pÇçK¹œy#ì£@ýÇ'æ¬i)éâþ©×u´%%vuïæÞBâ<—QºCÃûÚ+*‹" ¨35¹¬´¼¿µ{ioco‰øøäœ~«îrÆA@@gF ã}½ñ° ÷ëDýNôwO¦s=h£±Ì¿*€Ã}±ÈEá5Á®{ãǼ ëG`ígò»û¦0$œØç0»½§…á Ã=¤PªãÔj™Ä•´Z¤É×^<·B,Ò)C±ùÎîˆy€SD^¥Š¢iò9ñz…ÎgLÐΆÚêò“®M›7?¶y¬¹" ¦Ön}ôÈ•W¢öÎW_ÅjôJ½ZH)決·û‡ç¶mG¶„BÖnYèÇàwoìéBµ:¤Vé ßùu䤔ÈÉerìþ®À*}Ó׿DÌÇ}O$̓‚Q]û£È4Çí÷ÕÍ`çt@«(ð—Óˆ¾ï—øòaž©ØêóO­â hA®æŽvÇ5Îa„6\yz|ýÆü´2»µÅåÜÞYíE°.¥ì§wÝ™ØÑæžhm v°m)­Ÿ*,pOÞ{+Ю¦ê†Þ8¹ßÙÚbÍAñ!‘ø†JÐéï]0ýúñæf´¶ç†«€¤¨6ô»`Ï ^¥lƒ}&Ç6æñ9™_Ä~ƒE®ª·oCO[GVö•îžÜ¸ÞV]”ÔÐxÅŽ}}EQFªë[ÇŽlÍ­#£mð7T\Rd5Ñ?÷ÀöÏÍéß8zl×TW¿÷Áim\“¹™ÁÀ)¥¡Ç.¤üö密¾¾×õö±q•˜ùtØÊ[@RÃJ‚_éCâýÑ?‰ZArø«ç^K?o,RàÞKzA¦Rˆæñgÿ–Õ=âBè-:Sð*¯EêÜ9Ÿªù àF3¹þËm¸Ü% °%œ—¾™ÇFê÷†ý—?¬ôÊW–»êñ°´’)¿ 糜À[%}šù‰ä7`‹0mLŒ° ,U%RÖÉ´ºˆ¨ óÆ(­N"ù •¢CH’„>ô×Aã:ÍÌX;$.¤ ù'œ¼ùé&èf1Ë :Æwè~æ\ÛÕ’ŠŠ®¸Š+õ]DF9›Ö_‘™P•PWßÊýÒ;¥elÜÔäôìÞòµU9kkú7n<ÚTÞÛ––”€5³ß„8óˆ-11Ëø~à—‹ÿñ!f«÷ÝIḘû¹\%šþÒ‡ÁwÑñJ¡ÃK¢f¸ëÈGqçÑ^îµË#½°HŸï¥¼'A Á¨Û¿ùôÐofüxømâ™±ðXuÝIâ•ü»tÍ:_æ…G,žË®©®H¸ÒÉw¹çê¾¾½èe¿Wä½HK¶p©++¦+ÿ.ž4:G†SÉù¢–œ/Ú°/•5ƒ•ŠßOÇŠ‰?7œ*k“)ؤ:Z.Ó/:¤§&Ú zºKMÅõÑêP€@ÞP˜ŸÖ°º6·ÞQfPèÔjã¿7»ùÄñW^¾ý8ºíèïœOš:µÅ³B1¤Zed\Z±Bª•ªÕ½noòéSãsËä>ç¾xàAzpÉÙe?pr8Y~9N.˵åé#‹Ì–Šýw0wÑ•íTŒ¬í"ã„ds.­åj‰ÚÓ ²2Å‚~»ôLsÀïø;ðîù†ˆØ/Цe[—Û\{¼ow¸?øry"üÿ#$ËéŒ çÿÂå G©Ø :Ÿ‹ýzIäÖ Ç]Å[dã…ó‰‡ùÛä\…CŸ!`ÄóÍ|Û2—ñ˜‡§¦On¼b‹×ÃhMSãê¶ÕùYÜ"Jôï%êØÄ$JOÏT¸ÏWÅ' ”ØúºvúÃ%ç&ï_je.H‡Ém $Þ<—Q1}¯‚¨­w½Šœ+¯V}ÕkTèð¥á$é™0|öà“Kçé÷ÁÖ‡OÕgŸ]7˜…Q:Î?‘„¯Èè! N¤#Ââ#Â‘Ã’ÊÆÆ±)–ô_“öö±<Yút„*Þ`FÄ«æ±ljz,XªØÔŒØXâ·UIÊ F´ˆæ=4ÿ)¥ßêúo9 iR Â#œ± is:Ž[ç{wJ¤Þ=e7øéøcôˆDO¿GeÁê"¢‹r¾Ëíþü8ïÛüˆØÓÓ‘™ÕYi.‹•+”¡JuT¥Íš›œ’¼r0*"¢®-Z¥ oW«µ -mQ‘­ù:-Ò†ÕÅã£ÆP­©ÓŠ6hB†e2Þÿbþ*y|G|–ç?.C™ø)|*膖rêf>M÷ûÖŒ¶ŽÝUÅ%‚|ŸÈjn>=<ˆJ˹×:Ó0çR;ÎÑt—H¸mm5àS†h“}) µjý ãèÆúÕ\Ç"N¢óôAú¯à©(Eß‚Pp($¼ÿ•ªÕé´©@{–$»`oá$ýò¹öå꿵Ž<†ŠAßç"×r÷qg®Zÿ›œÒËUJ+ºŽÛç»Æû¯U6 Tµa‘ödé¯w‘ö|–« 8¤W+% Í  ‹´Íztïâ]L—róô! ˜.`÷ÙD§¡ÀuÔ’‡¾Ú+B(ÝB@Ä>ÿ.F’OÕQme²øsb2ˆÜ÷÷Ý^ûÏTõ@,ÿ¥™Üï`·?ŒÏ³2}7n¾b*/s5jB&³ÉœŠÓ6ò C%gНµÚPßGeævr‘A©JÊ)+޹êΜ\ˆ@:Ü«®Þ¸á:gG;;kIHhl@J•!\¬S+UJst°Æj]Yu#wpê(`Lî0œ]×-ÞøWÊÊ»†êêw`Qù13Ï„Js(–ý‡ïB’Öü-œyµá‹")õiÌ«‘2%ζ^ Ã?ÜáoGÐï1K.ñ÷sÄ/ÞÔÉ+ ‡Ð$ ѹßp¿ ×ãá¡’K\N>ЊB»¸]+HÂ>æz "~$98ñ¾Íʧƒ ;̧Ì 7ÿ}Öûk^Ñoy»é«©øóŒÜwº…çæ«(‘D|——Û!9Ëì"ÊÀ_å,g…e¾8!W˜òÁG¢¼ÈO:!\§å&|·ÿn8ÿôî=íÙõÜ{7l½í(ÿ#º£·n¢qŒyñÉ2úê ü[œÝ;¹ÆCøxôÿó9œ¹´yGª£V“›86ñPS"ðÂG˜x£p2CbsŸÊÕùoï1~ÙÌ/`®ˆ2„…nmnEýö³¨ºf¨~eúŠìxs_ï±[µ:­F]j?ÞZU““dÑÑ~×íµµ¶<¤W)eø2_Í5 ¨0¿_k5 L•Ñ8uµum¯}¬¾.!ʼ²·ï*î‡/\}-ªeŸ“XŽb£mq«KZ'Q+¢î¹*tºÓû<ƒ#qÚ?Ñ•M¹VI±`mç>aZ˜A²ÃyÝd ÂLNëÐöÓ¹±qÙÙë÷ÔV•Æ™ÖнG=•%åíÖ²êùZæé\}Xâ¢9¤6þW;ºü’ç2'¡íkLq¥Uµ{ÖggÇÅZU¹½!‡yz¾¶ªÜÚQZ¾rßkw\z_2B=LrŠàÉ$üV Xºè9Ì´¨寯¦¦ÇÄÆÆ¤§‚Æ?›ßЖO· OÑéðÔàë8baÔ>ÿ;-É«¢r2û ¿Õ²¡oòë~Íå½oŠ€?S|DzžÌááfüô5¿ôºƒ~÷#£„1B¨Jî׃b©Tr[á[ß°71þÍPàÏÒû‹÷ ýÞCpn\Êèþ®e ¢÷­nãÓ}Õ€õ–2H®}U@éðí-†¥?…ظˆZÿ¿ˆŽMÌäÍG¹¢÷ô¿ ¡?*|5)ù–äJWI\Jé ü£"kSI Î2›Ø¬ý·ƒlæyµ:D’†ZÓPAR«t‘)Å@¬ì Öf÷_Ú!IK]ObŸE?àØÔ¹¾_G-üA9WRÌúùSØâÏd°eع'\¡P¨ ?5©L¢‡>¢’K%Ú¸ÂàÈ«aïÌm(Ì/4F˜#ÍÖ¾¾t,LƒÂ¸îÃ-­+r %g/ê\¡ ‘+røKÉguŒDNò`RŽè-ò$CV†%©Ä^Qš•˜„AÁ kÚ› -õ±)ä'øˆ/[ÿ®¨ÝRú…ðÃüüÍnDÉ|ÿZß{ hà?Éëd¦À¿aÉk¤tA9 %Còz ¾?„R(Ôa^ê(Û¡‚r?”0(7Aù1”'¡$BùÊ.(”¡¾Š J¯Ð÷á½Vh’ åf(aüý(?…ò>”aÍ[ \å)( ü§Ðï9(ñ}èõ3à@ÝÉãBE@)6À…Ú ßxŽ~ø†õPšÓ£PÞ†ò”ŸA9ïB¡èa¾2T E õ; è ¬`€2*À÷gèóW?]ðxtê­0Œ§8x~Z€ù->@´/ïCB;^ã~àÚN½Ž2Ñ0:€ÞAÿ¤'鳌‚)cŽH4·äi¼Ô-}X– ÿÊÞ”'Ëo’´9èí /Šg_)›•³Ê¨”ªƒª—Ô¹êkÔç5VÍ­šßk> n þNˆ>dsÈcZ…¶Z»KûºLÝ-ºwCÕ¡3¡¿ ýB߮ߤÿÜÐh¸Þðx˜,lMØÙpUxvøTøÑðŸ#ŒÓÆO#z#~™¹=ò®È÷£LQ›¢^ŠzoÅ•+®Zq1:6º&z&úõ˜¶˜é˜›cþ»2ötœ-îûDú†©M‚8.–EüWÇ4SXâ?Ž|2¤g8Ò uš F½B¡úH/\—ô‘RhH¨Ë¨h´C¨Ë©Óè¸P¢’èW…º‚Šúo¡®¤câ<*Ê¥ÊêjjH%ŽÕÈ£+„z0µNíÇe§zPG”Jý¡NSrMPg¨ õï…º$ ”RkB„ºŒ Ö¬êrªC“"Ôƒ(½æ¡® ‚µo u% ÑŠó¨¨|Ý u5e Çj˜>Í6¡Le†®H„ØÔ¡×‘:þ•„6ô8©ËHûYR—“öÇI=ˆÔNê G|ç_çyÄ×yñuI@žG|ç_çyÄ×yñužG|ç_çyÄ×yñužG|ç®+ðU\Þ&uu@{0©HêZŒKè?I]õP½„Ô ýÃÈ<|=< =Õ‡“ú Ò‡Ÿ3& O\@=ôO õTRÏ%õ R'¸À°–: ]-âÒIm¡&(5DÙ©øf©3P:©Ro¢ÜÔ8Ћ¥ªái êøÓíNÒƒ…ŒÏ„Z i·ÿ/gÊòAÆ‚wCÛŒ¯Ï4´5À7¿^xAEà+gµ<ÒZ #\ðÝc†ÕóMC™¢fásp TŪxï$½Xª¾ç }–ëàs i¯…–øÄ|©ÚÔ¿&ÒÚIi(%)'á’g‰LŠí<–„Öt[|TXŠ=/CnÀc?ãqo;ôâ±ä¥b†ÈKõ“·[–âšçÙÊ̱¼lˆðð”#ýyH°ô»ˆT8ˆ¼:HÛ0™sÏA¨ˆåt­°Ú¼Ÿ%ý܇Hs~MÏ×PF”¸9"¸ÅAð`„'Ü>m.‚ß¡Þزôr xaŠ9f™æ\n½AAz°Lô“]ÊCÝ/pf\˜y9YV )ÅËÕR©Xº2ߎi= ŸXCØaU—@íi2›ç²kcêwA‹‹¬8Ày?/x>-ܘ:üªÓdžh"|ž³‚,Ž“½8OþuñÞ$”æw©h°© –îë= ·<~žo¤†nŒÌ/Ê•{Á|s„ÿ£„›ºbH O7ôåµÈ ¡8žćW tc}…¥§?¿«&ù¥t± }F~ùh ¸/å¦0žÚdn›òÍë¶ñE<˜ZDoÿÌ?7Ñ烂֜%:p.@|î‹óñ{ïÕYþ=&η”<µx ý4™"3»‰OÀkJEôÁüúͯ‡Ðn„è‘2ƒÐkF‰»À¯ 3ÿM9Ë"ýÇ`Ö,øôŽgÍ"¾ÂFÁŸ¥cœà™éó»Ö‘¾¯ãÿdñ]Ö"Mâ›»sË„cÈ>à`ϰ#ÿ‘hb«ÝSî)»Çég'\™lÝcÿ†NYx2¶ÃíšÁ-ÓlÃ8ŒË)*Ê΀¼L¶ÒåbÛÃ#ži¶Ý1혚u ŠSW»g¦œŽ)¶Ù1W<똚ÆSæfæ²ÉMÎ)÷´{È“ÒîžqÙ§º^ Ã`TkGS§ðt–휲:ÆìS£¬{èkAf§ÃÎicÊ1È:ÇÙǔǎ¿Ý3ã˜j:³¹¥³¡®¡º²³¡¥™m©c×4T×6wÔ²•õíµµMµÍ¥FÙ9âœf="%q–œ˜rOÀt[0¾åBîá)ûÄÈÖ>K)f¦lÿv‹{pÏ`fÆxnlObg]ÎÇ8t·O9cŽqO&»†Øg¬»C#= €Á„›³O9X‡&›bSŽk ;4åóÃ况ÜÃÒezúÇ y¦œý3˜Àt;²L‹@­|¤ð †ºµ»fìý.{zÚá Év»ÓÓy‚à$ðÂㆡÓŽçs`)æ,PqÜã&c탃NÌR»‹"–Ž›§ma=Ïb \Î1'F!ýæÜS£Ó^*†€¤Ñ="2ÓïrNàu`.žÜcö-,À¬šØ‚ ç§ÐÂ…=†üÈÙÇ·°“3Ži²Ì€{¤m\À`J€›tžqϸA4gŽ9"KÑÇý€“'l"žc¸ŸG ðØ<~cÄìÔCËOK@ö °³ýq"XÇî)ƺ:*Ù 6¹0¯ …-È)ÌÈÎËÎV(º¡1;''/> ¬lA¾­ÈV¤QŽx<ÅYYsss™c"ãÜc«Üé Ûèðx\Ž©Ç´s‹¯‹ î37,šb‰cЪšÒYQMÌA7,œSv`ˆeåà” ­›Õ3ŒGñ؇ Ä} $ô ÞÏ,[‰gw€¨ 97ÂNÏÀ;HÖOg „XÈA Ì90OÈFvÙûÉCDM`ÞMÀîc»¦y)rŒfÂàÜ=㙘ñH¦ s°PzìýXƒy#óz#ã˜A÷À fÂÌËÐ,kÄ3æÊóàÿ8klzãOŽqÇ\&~ó-GÍ9\Ðêøæ!ø)KÒ›j&ÖyŒXáqâ'ƒO„4`Q6ÁóÇĉï;ˆ]Æ6œxqÌqæûÌ3ÌsPždžb˜ËN¬“ø|žÌíX°–cÁld>I¬$GÒ(©—”Ágô¶“sP°‰#èt7C‘È¡úO YûÿÙ ˆ˜ endstream endobj 10254 0 obj 12094 endobj 10252 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /CourierNewPSMT /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 10250 0 R /CIDToGIDMap /Identity /DW 595 >> endobj 10253 0 obj << /Length 1078 >> stream /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 2 beginbfrange <0000> <0000> <0000> <0001> <0066> [<0068> <0074> <0070> <003A> <002F> <0077> <002E> <0073> <0069> <0067> <006F> <0072> <006D> <0061> <006C> <0053> <0057> <0049> <0047> <0020> <0042> <0065> <0064> <006E> <0045> <0023> <0066> <005F> <0056> <0052> <004F> <004E> <003E> <003D> <0030> <0078> <0031> <0033> <002A> <0055> <0063> <0079> <0075> <002D> <0038> <007A> <0024> <006B> <006A> <0032> <0028> <0029> <0046> <0062> <004D> <0076> <003B> <0043> <007B> <003C> <007D> <002C> <0025> <0050> <0034> <0037> <0035> <0054> <0036> <0039> <005B> <004C> <005D> <0022> <0044> <0041> <004B> <0051> <0059> <0048> <004A> <005C> <0021> <002B> <007E> <003F> <0027> <0058> <007C> <0026> <0060> <005E> <005A> <0071> <0040> <2191> <2193> <2026> <00F6> <00E9> <00C3> <00B6> ] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end endstream endobj 1438 0 obj << /Type /Font /Subtype /Type0 /BaseFont /CourierNewPSMT /Encoding /Identity-H /DescendantFonts [10252 0 R] /ToUnicode 10253 0 R>> endobj 2 0 obj << /Type /Pages /Kids [ 5 0 R 91 0 R 176 0 R 261 0 R 344 0 R 424 0 R 507 0 R 590 0 R 675 0 R 762 0 R 845 0 R 927 0 R 1012 0 R 1099 0 R 1184 0 R 1271 0 R 1356 0 R 1437 0 R 1477 0 R 1509 0 R 1522 0 R 1548 0 R 1560 0 R 1573 0 R 1595 0 R 1637 0 R 1664 0 R 1680 0 R 1706 0 R 1715 0 R 1724 0 R 1737 0 R 1801 0 R 1811 0 R 1825 0 R 1833 0 R 1843 0 R 1850 0 R 1863 0 R 1874 0 R 1883 0 R 1896 0 R 1903 0 R 1910 0 R 1922 0 R 1929 0 R 1935 0 R 1945 0 R 1955 0 R 1963 0 R 1972 0 R 1982 0 R 1991 0 R 1996 0 R 2001 0 R 2008 0 R 2020 0 R 2027 0 R 2044 0 R 2055 0 R 2111 0 R 2124 0 R 2131 0 R 2140 0 R 2150 0 R 2160 0 R 2172 0 R 2179 0 R 2192 0 R 2204 0 R 2211 0 R 2220 0 R 2226 0 R 2233 0 R 2242 0 R 2249 0 R 2257 0 R 2262 0 R 2268 0 R 2274 0 R 2283 0 R 2290 0 R 2299 0 R 2304 0 R 2309 0 R 2314 0 R 2319 0 R 2324 0 R 2329 0 R 2336 0 R 2342 0 R 2347 0 R 2352 0 R 2360 0 R 2367 0 R 2379 0 R 2388 0 R 2393 0 R 2400 0 R 2409 0 R 2414 0 R 2424 0 R 2480 0 R 2491 0 R 2498 0 R 2511 0 R 2520 0 R 2533 0 R 2543 0 R 2554 0 R 2567 0 R 2588 0 R 2606 0 R 2628 0 R 2640 0 R 2651 0 R 2664 0 R 2684 0 R 2706 0 R 2711 0 R 2718 0 R 2725 0 R 2732 0 R 2745 0 R 2754 0 R 2759 0 R 2764 0 R 2773 0 R 2780 0 R 2787 0 R 2795 0 R 2802 0 R 2825 0 R 2832 0 R 2841 0 R 2848 0 R 2863 0 R 2936 0 R 2945 0 R 2952 0 R 2961 0 R 2969 0 R 2986 0 R 2995 0 R 3004 0 R 3013 0 R 3020 0 R 3027 0 R 3036 0 R 3043 0 R 3051 0 R 3057 0 R 3066 0 R 3073 0 R 3080 0 R 3085 0 R 3103 0 R 3118 0 R 3133 0 R 3147 0 R 3163 0 R 3168 0 R 3175 0 R 3185 0 R 3191 0 R 3198 0 R 3204 0 R 3214 0 R 3221 0 R 3230 0 R 3239 0 R 3244 0 R 3254 0 R 3260 0 R 3265 0 R 3274 0 R 3283 0 R 3312 0 R 3319 0 R 3328 0 R 3336 0 R 3345 0 R 3352 0 R 3360 0 R 3373 0 R 3380 0 R 3389 0 R 3404 0 R 3413 0 R 3433 0 R 3440 0 R 3449 0 R 3458 0 R 3463 0 R 3471 0 R 3476 0 R 3483 0 R 3492 0 R 3520 0 R 3528 0 R 3542 0 R 3557 0 R 3566 0 R 3586 0 R 3595 0 R 3605 0 R 3640 0 R 3653 0 R 3662 0 R 3680 0 R 3740 0 R 3757 0 R 3762 0 R 3776 0 R 3787 0 R 3804 0 R 3811 0 R 3820 0 R 3827 0 R 3832 0 R 3856 0 R 3865 0 R 3870 0 R 3877 0 R 3882 0 R 3901 0 R 3916 0 R 3929 0 R 3950 0 R 3975 0 R 3984 0 R 3990 0 R 3996 0 R 4006 0 R 4011 0 R 4016 0 R 4021 0 R 4062 0 R 4083 0 R 4091 0 R 4099 0 R 4111 0 R 4122 0 R 4130 0 R 4141 0 R 4146 0 R 4154 0 R 4163 0 R 4168 0 R 4178 0 R 4185 0 R 4190 0 R 4201 0 R 4211 0 R 4219 0 R 4228 0 R 4233 0 R 4238 0 R 4246 0 R 4254 0 R 4264 0 R 4295 0 R 4315 0 R 4330 0 R 4343 0 R 4370 0 R 4397 0 R 4419 0 R 4430 0 R 4440 0 R 4461 0 R 4491 0 R 4529 0 R 4545 0 R 4559 0 R 4571 0 R 4584 0 R 4599 0 R 4608 0 R 4616 0 R 4626 0 R 4633 0 R 4646 0 R 4681 0 R 4694 0 R 4711 0 R 4729 0 R 4734 0 R 4743 0 R 4755 0 R 4844 0 R 4877 0 R 4895 0 R 4905 0 R 4918 0 R 4929 0 R 4939 0 R 4945 0 R 4956 0 R 4971 0 R 4984 0 R 4991 0 R 5000 0 R 5009 0 R 5019 0 R 5030 0 R 5046 0 R 5057 0 R 5068 0 R 5081 0 R 5088 0 R 5098 0 R 5103 0 R 5117 0 R 5125 0 R 5132 0 R 5143 0 R 5150 0 R 5161 0 R 5166 0 R 5176 0 R 5187 0 R 5201 0 R 5207 0 R 5212 0 R 5222 0 R 5231 0 R 5239 0 R 5248 0 R 5260 0 R 5269 0 R 5276 0 R 5286 0 R 5294 0 R 5301 0 R 5313 0 R 5324 0 R 5332 0 R 5345 0 R 5365 0 R 5372 0 R 5384 0 R 5390 0 R 5398 0 R 5406 0 R 5412 0 R 5424 0 R 5431 0 R 5438 0 R 5447 0 R 5452 0 R 5461 0 R 5466 0 R 5473 0 R 5478 0 R 5487 0 R 5494 0 R 5500 0 R 5507 0 R 5514 0 R 5522 0 R 5528 0 R 5535 0 R 5544 0 R 5553 0 R 5591 0 R 5606 0 R 5619 0 R 5632 0 R 5647 0 R 5656 0 R 5665 0 R 5673 0 R 5680 0 R 5689 0 R 5694 0 R 5703 0 R 5711 0 R 5734 0 R 5739 0 R 5745 0 R 5752 0 R 5757 0 R 5768 0 R 5777 0 R 5808 0 R 5840 0 R 5849 0 R 5859 0 R 5872 0 R 5879 0 R 5888 0 R 5895 0 R 5902 0 R 5911 0 R 5918 0 R 5925 0 R 5930 0 R 5939 0 R 5949 0 R 5956 0 R 5965 0 R 5974 0 R 5985 0 R 5994 0 R 6002 0 R 6015 0 R 6030 0 R 6037 0 R 6062 0 R 6083 0 R 6104 0 R 6115 0 R 6131 0 R 6147 0 R 6168 0 R 6203 0 R 6214 0 R 6223 0 R 6240 0 R 6249 0 R 6264 0 R 6275 0 R 6320 0 R 6334 0 R 6347 0 R 6356 0 R 6363 0 R 6374 0 R 6379 0 R 6388 0 R 6402 0 R 6411 0 R 6474 0 R 6491 0 R 6500 0 R 6507 0 R 6513 0 R 6533 0 R 6543 0 R 6550 0 R 6557 0 R 6566 0 R 6575 0 R 6582 0 R 6589 0 R 6594 0 R 6605 0 R 6612 0 R 6622 0 R 6631 0 R 6642 0 R 6649 0 R 6662 0 R 6667 0 R 6676 0 R 6685 0 R 6695 0 R 6704 0 R 6715 0 R 6750 0 R 6767 0 R 6776 0 R 6786 0 R 6793 0 R 6804 0 R 6815 0 R 6824 0 R 6835 0 R 6864 0 R 6879 0 R 6911 0 R 6992 0 R 7003 0 R 7014 0 R 7023 0 R 7030 0 R 7040 0 R 7054 0 R 7062 0 R 7070 0 R 7077 0 R 7084 0 R 7091 0 R 7100 0 R 7107 0 R 7116 0 R 7129 0 R 7146 0 R 7154 0 R 7160 0 R 7168 0 R 7176 0 R 7184 0 R 7193 0 R 7204 0 R 7219 0 R 7226 0 R 7231 0 R 7238 0 R 7245 0 R 7253 0 R 7260 0 R 7267 0 R 7277 0 R 7287 0 R 7297 0 R 7310 0 R 7319 0 R 7326 0 R 7334 0 R 7341 0 R 7348 0 R 7359 0 R 7373 0 R 7386 0 R 7398 0 R 7405 0 R 7413 0 R 7424 0 R 7438 0 R 7453 0 R 7460 0 R 7469 0 R 7476 0 R 7495 0 R 7544 0 R 7621 0 R 7633 0 R 7646 0 R 7657 0 R 7666 0 R 7675 0 R 7683 0 R 7690 0 R 7698 0 R 7709 0 R 7718 0 R 7726 0 R 7733 0 R 7747 0 R 7759 0 R 7773 0 R 7780 0 R 7790 0 R 7796 0 R 7806 0 R 7818 0 R 7823 0 R 7832 0 R 7841 0 R 7854 0 R 7868 0 R 7886 0 R 7898 0 R 7914 0 R 7925 0 R 7936 0 R 7943 0 R 7948 0 R 7957 0 R 7964 0 R 7980 0 R 7997 0 R 8005 0 R 8012 0 R 8024 0 R 8030 0 R 8037 0 R 8043 0 R 8052 0 R 8060 0 R 8065 0 R 8074 0 R 8129 0 R 8144 0 R 8164 0 R 8173 0 R 8182 0 R 8188 0 R 8195 0 R 8208 0 R 8217 0 R 8227 0 R 8237 0 R 8246 0 R 8254 0 R 8264 0 R 8277 0 R 8287 0 R 8294 0 R 8302 0 R 8307 0 R 8320 0 R 8342 0 R 8393 0 R 8403 0 R 8410 0 R 8425 0 R 8436 0 R 8448 0 R 8456 0 R 8463 0 R 8468 0 R 8475 0 R 8486 0 R 8493 0 R 8500 0 R 8510 0 R 8521 0 R 8528 0 R 8535 0 R 8540 0 R 8547 0 R 8558 0 R 8565 0 R 8575 0 R 8584 0 R 8591 0 R 8600 0 R 8607 0 R 8614 0 R 8629 0 R 8684 0 R 8695 0 R 8702 0 R 8707 0 R 8712 0 R 8721 0 R 8728 0 R 8735 0 R 8746 0 R 8755 0 R 8766 0 R 8773 0 R 8780 0 R 8789 0 R 8796 0 R 8805 0 R 8816 0 R 8827 0 R 8834 0 R 8845 0 R 8850 0 R 8857 0 R 8864 0 R 8876 0 R 8887 0 R 8893 0 R 8909 0 R 8916 0 R 8921 0 R 8926 0 R ] /Count 653 /ProcSet [/PDF /Text /ImageB /ImageC] >> endobj xref 0 10255 0000000000 65535 f 0000000009 00000 n 0004924931 00000 n 0000000201 00000 n 0000000296 00000 n 0000022342 00000 n 0000000333 00000 n 0000005546 00000 n 0004882560 00000 n 0004843965 00000 n 0000005566 00000 n 0000005618 00000 n 0000005670 00000 n 0000005722 00000 n 0000005774 00000 n 0000005826 00000 n 0000005878 00000 n 0000005930 00000 n 0000005982 00000 n 0000006034 00000 n 0000006086 00000 n 0000006138 00000 n 0000006190 00000 n 0000006242 00000 n 0000006294 00000 n 0000006346 00000 n 0000006398 00000 n 0000006656 00000 n 0000006914 00000 n 0000007181 00000 n 0000007449 00000 n 0000007724 00000 n 0000007998 00000 n 0000008255 00000 n 0000008516 00000 n 0000008777 00000 n 0000009042 00000 n 0000009303 00000 n 0000009564 00000 n 0000009825 00000 n 0000010086 00000 n 0000010347 00000 n 0000010618 00000 n 0000010880 00000 n 0000011142 00000 n 0000011412 00000 n 0000011690 00000 n 0000011965 00000 n 0000012239 00000 n 0000012504 00000 n 0000012770 00000 n 0000013032 00000 n 0000013298 00000 n 0000013564 00000 n 0000013830 00000 n 0000014096 00000 n 0000014362 00000 n 0000014628 00000 n 0000014894 00000 n 0000015160 00000 n 0000015427 00000 n 0000015694 00000 n 0000015969 00000 n 0000016236 00000 n 0000016503 00000 n 0000016760 00000 n 0000017030 00000 n 0000017298 00000 n 0000017564 00000 n 0000017835 00000 n 0000018099 00000 n 0000018361 00000 n 0000018623 00000 n 0000018880 00000 n 0000019141 00000 n 0000019400 00000 n 0000019662 00000 n 0000019935 00000 n 0000020205 00000 n 0000020471 00000 n 0000020739 00000 n 0000021003 00000 n 0000021275 00000 n 0000021548 00000 n 0000021820 00000 n 0000022079 00000 n 0004854780 00000 n 0000023102 00000 n 0000028809 00000 n 0000022463 00000 n 0000022662 00000 n 0000049800 00000 n 0000028830 00000 n 0000029093 00000 n 0000029356 00000 n 0000029619 00000 n 0000029882 00000 n 0000030145 00000 n 0000030408 00000 n 0000030671 00000 n 0000030935 00000 n 0000031200 00000 n 0000031465 00000 n 0000031720 00000 n 0000031979 00000 n 0000032238 00000 n 0000032500 00000 n 0000032759 00000 n 0000033018 00000 n 0000033277 00000 n 0000033536 00000 n 0000033788 00000 n 0000034048 00000 n 0000034308 00000 n 0000034568 00000 n 0000034828 00000 n 0000035088 00000 n 0000035348 00000 n 0000035608 00000 n 0000035868 00000 n 0000036128 00000 n 0000036388 00000 n 0000036648 00000 n 0000036908 00000 n 0000037168 00000 n 0000037428 00000 n 0000037688 00000 n 0000037948 00000 n 0000038208 00000 n 0000038482 00000 n 0000038751 00000 n 0000039011 00000 n 0000039284 00000 n 0000039557 00000 n 0000039828 00000 n 0000040096 00000 n 0000040356 00000 n 0000040616 00000 n 0000040876 00000 n 0000041136 00000 n 0000041396 00000 n 0000041674 00000 n 0000041934 00000 n 0000042213 00000 n 0000042483 00000 n 0000042743 00000 n 0000043003 00000 n 0000043263 00000 n 0000043523 00000 n 0000043783 00000 n 0000044036 00000 n 0000044296 00000 n 0000044556 00000 n 0000044816 00000 n 0000045076 00000 n 0000045336 00000 n 0000045596 00000 n 0000045855 00000 n 0000046118 00000 n 0000046374 00000 n 0000046637 00000 n 0000046900 00000 n 0000047164 00000 n 0000047428 00000 n 0000047692 00000 n 0000047956 00000 n 0000048219 00000 n 0000048482 00000 n 0000048745 00000 n 0000049008 00000 n 0000049272 00000 n 0000049536 00000 n 0000050767 00000 n 0000058700 00000 n 0000049925 00000 n 0000050114 00000 n 0000079252 00000 n 0000058722 00000 n 0000058993 00000 n 0000059265 00000 n 0000059529 00000 n 0000059793 00000 n 0000060057 00000 n 0000060314 00000 n 0000060578 00000 n 0000060842 00000 n 0000061106 00000 n 0000061384 00000 n 0000061648 00000 n 0000061912 00000 n 0000062093 00000 n 0000062357 00000 n 0000062621 00000 n 0000062896 00000 n 0000063160 00000 n 0000063430 00000 n 0000063696 00000 n 0000063875 00000 n 0000064159 00000 n 0000064426 00000 n 0000064690 00000 n 0000064964 00000 n 0000065233 00000 n 0000065497 00000 n 0000065771 00000 n 0000066036 00000 n 0000066300 00000 n 0000066562 00000 n 0000066837 00000 n 0000067121 00000 n 0000067304 00000 n 0000067487 00000 n 0000067765 00000 n 0000068045 00000 n 0000068330 00000 n 0000068607 00000 n 0000068890 00000 n 0000069071 00000 n 0000069250 00000 n 0000069429 00000 n 0000069716 00000 n 0000070000 00000 n 0000070179 00000 n 0000070463 00000 n 0000070644 00000 n 0000070922 00000 n 0000071204 00000 n 0000071478 00000 n 0000071760 00000 n 0000072044 00000 n 0000072327 00000 n 0000072607 00000 n 0000072888 00000 n 0000073168 00000 n 0000073437 00000 n 0000073708 00000 n 0000073980 00000 n 0000074253 00000 n 0000074540 00000 n 0000074823 00000 n 0000075097 00000 n 0000075371 00000 n 0000075653 00000 n 0000075834 00000 n 0000076017 00000 n 0000076297 00000 n 0000076480 00000 n 0000076655 00000 n 0000076836 00000 n 0000077091 00000 n 0000077358 00000 n 0000077625 00000 n 0000077910 00000 n 0000078177 00000 n 0000078444 00000 n 0000078711 00000 n 0000078985 00000 n 0000080228 00000 n 0000089110 00000 n 0000079378 00000 n 0000079567 00000 n 0000109634 00000 n 0000089132 00000 n 0000089399 00000 n 0000089681 00000 n 0000089949 00000 n 0000090226 00000 n 0000090476 00000 n 0000090738 00000 n 0000091000 00000 n 0000091262 00000 n 0000091528 00000 n 0000091790 00000 n 0000092052 00000 n 0000092314 00000 n 0000092576 00000 n 0000092839 00000 n 0000093102 00000 n 0000093365 00000 n 0000093639 00000 n 0000093908 00000 n 0000094177 00000 n 0000094450 00000 n 0000094723 00000 n 0000094994 00000 n 0000095257 00000 n 0000095520 00000 n 0000095773 00000 n 0000096037 00000 n 0000096301 00000 n 0000096565 00000 n 0000096829 00000 n 0000097093 00000 n 0000097357 00000 n 0000097621 00000 n 0000097878 00000 n 0000098143 00000 n 0000098408 00000 n 0000098667 00000 n 0000098930 00000 n 0000099193 00000 n 0000099456 00000 n 0000099719 00000 n 0000099982 00000 n 0000100245 00000 n 0000100508 00000 n 0000100775 00000 n 0000101038 00000 n 0000101302 00000 n 0000101570 00000 n 0000101834 00000 n 0000102098 00000 n 0000102362 00000 n 0000102626 00000 n 0000102902 00000 n 0000103166 00000 n 0000103444 00000 n 0000103708 00000 n 0000103889 00000 n 0000104076 00000 n 0000104352 00000 n 0000104616 00000 n 0000104880 00000 n 0000105144 00000 n 0000105421 00000 n 0000105704 00000 n 0000105988 00000 n 0000106269 00000 n 0000106556 00000 n 0000106731 00000 n 0000106995 00000 n 0000107259 00000 n 0000107523 00000 n 0000107787 00000 n 0000108051 00000 n 0000108315 00000 n 0000108579 00000 n 0000108843 00000 n 0000109107 00000 n 0000109371 00000 n 0000110594 00000 n 0000118233 00000 n 0000109760 00000 n 0000109949 00000 n 0000138077 00000 n 0000118255 00000 n 0000118519 00000 n 0000118783 00000 n 0000119040 00000 n 0000119305 00000 n 0000119569 00000 n 0000119833 00000 n 0000120097 00000 n 0000120354 00000 n 0000120621 00000 n 0000120904 00000 n 0000121172 00000 n 0000121441 00000 n 0000121622 00000 n 0000121899 00000 n 0000122179 00000 n 0000122443 00000 n 0000122729 00000 n 0000123000 00000 n 0000123264 00000 n 0000123528 00000 n 0000123792 00000 n 0000124056 00000 n 0000124320 00000 n 0000124594 00000 n 0000124862 00000 n 0000125130 00000 n 0000125398 00000 n 0000125674 00000 n 0000125942 00000 n 0000126119 00000 n 0000126387 00000 n 0000126661 00000 n 0000126934 00000 n 0000127217 00000 n 0000127495 00000 n 0000127777 00000 n 0000128063 00000 n 0000128344 00000 n 0000128603 00000 n 0000128859 00000 n 0000129122 00000 n 0000129385 00000 n 0000129648 00000 n 0000129906 00000 n 0000130168 00000 n 0000130430 00000 n 0000130692 00000 n 0000130954 00000 n 0000131216 00000 n 0000131478 00000 n 0000131740 00000 n 0000132002 00000 n 0000132265 00000 n 0000132524 00000 n 0000132787 00000 n 0000133058 00000 n 0000133321 00000 n 0000133584 00000 n 0000133860 00000 n 0000134123 00000 n 0000134386 00000 n 0000134649 00000 n 0000134912 00000 n 0000135176 00000 n 0000135440 00000 n 0000135704 00000 n 0000135968 00000 n 0000136232 00000 n 0000136496 00000 n 0000136760 00000 n 0000137024 00000 n 0000137282 00000 n 0000137553 00000 n 0000137815 00000 n 0000139013 00000 n 0000146733 00000 n 0000138203 00000 n 0000138392 00000 n 0000167321 00000 n 0000146755 00000 n 0000147031 00000 n 0000147293 00000 n 0000147555 00000 n 0000147817 00000 n 0000148074 00000 n 0000148335 00000 n 0000148596 00000 n 0000148850 00000 n 0000149104 00000 n 0000149365 00000 n 0000149626 00000 n 0000149887 00000 n 0000150148 00000 n 0000150410 00000 n 0000150672 00000 n 0000150934 00000 n 0000151196 00000 n 0000151458 00000 n 0000151720 00000 n 0000151982 00000 n 0000152244 00000 n 0000152506 00000 n 0000152766 00000 n 0000153030 00000 n 0000153294 00000 n 0000153558 00000 n 0000153822 00000 n 0000154086 00000 n 0000154350 00000 n 0000154614 00000 n 0000154878 00000 n 0000155143 00000 n 0000155408 00000 n 0000155673 00000 n 0000155938 00000 n 0000156203 00000 n 0000156468 00000 n 0000156733 00000 n 0000156998 00000 n 0000157263 00000 n 0000157528 00000 n 0000157793 00000 n 0000158058 00000 n 0000158323 00000 n 0000158588 00000 n 0000158853 00000 n 0000159118 00000 n 0000159383 00000 n 0000159648 00000 n 0000159913 00000 n 0000160178 00000 n 0000160443 00000 n 0000160708 00000 n 0000160973 00000 n 0000161238 00000 n 0000161503 00000 n 0000161768 00000 n 0000162033 00000 n 0000162298 00000 n 0000162563 00000 n 0000162828 00000 n 0000163093 00000 n 0000163358 00000 n 0000163623 00000 n 0000163888 00000 n 0000164146 00000 n 0000164411 00000 n 0000164676 00000 n 0000164941 00000 n 0000165206 00000 n 0000165471 00000 n 0000165736 00000 n 0000166001 00000 n 0000166266 00000 n 0000166531 00000 n 0000166796 00000 n 0000167054 00000 n 0000168281 00000 n 0000175646 00000 n 0000167447 00000 n 0000167636 00000 n 0000196041 00000 n 0000175668 00000 n 0000175935 00000 n 0000176208 00000 n 0000176481 00000 n 0000176753 00000 n 0000177026 00000 n 0000177288 00000 n 0000177545 00000 n 0000177815 00000 n 0000177998 00000 n 0000178267 00000 n 0000178541 00000 n 0000178812 00000 n 0000179076 00000 n 0000179353 00000 n 0000179532 00000 n 0000179804 00000 n 0000180072 00000 n 0000180255 00000 n 0000180436 00000 n 0000180617 00000 n 0000180903 00000 n 0000181170 00000 n 0000181445 00000 n 0000181727 00000 n 0000182001 00000 n 0000182275 00000 n 0000182549 00000 n 0000182728 00000 n 0000183011 00000 n 0000183278 00000 n 0000183551 00000 n 0000183832 00000 n 0000184105 00000 n 0000184384 00000 n 0000184662 00000 n 0000184920 00000 n 0000185182 00000 n 0000185437 00000 n 0000185699 00000 n 0000185961 00000 n 0000186223 00000 n 0000186485 00000 n 0000186747 00000 n 0000187009 00000 n 0000187265 00000 n 0000187528 00000 n 0000187791 00000 n 0000188054 00000 n 0000188317 00000 n 0000188580 00000 n 0000188843 00000 n 0000189106 00000 n 0000189368 00000 n 0000189631 00000 n 0000189894 00000 n 0000190146 00000 n 0000190411 00000 n 0000190687 00000 n 0000190948 00000 n 0000191224 00000 n 0000191495 00000 n 0000191778 00000 n 0000192057 00000 n 0000192328 00000 n 0000192604 00000 n 0000192874 00000 n 0000193135 00000 n 0000193388 00000 n 0000193651 00000 n 0000193913 00000 n 0000194180 00000 n 0000194439 00000 n 0000194714 00000 n 0000194987 00000 n 0000195250 00000 n 0000195519 00000 n 0000195788 00000 n 0000197001 00000 n 0000205277 00000 n 0000196167 00000 n 0000196356 00000 n 0000226594 00000 n 0000205299 00000 n 0000205561 00000 n 0000205823 00000 n 0000206089 00000 n 0000206354 00000 n 0000206615 00000 n 0000206879 00000 n 0000207140 00000 n 0000207399 00000 n 0000207662 00000 n 0000207928 00000 n 0000208189 00000 n 0000208455 00000 n 0000208726 00000 n 0000208989 00000 n 0000209259 00000 n 0000209538 00000 n 0000209807 00000 n 0000210079 00000 n 0000210352 00000 n 0000210627 00000 n 0000210898 00000 n 0000211170 00000 n 0000211447 00000 n 0000211724 00000 n 0000211994 00000 n 0000212270 00000 n 0000212532 00000 n 0000212788 00000 n 0000213048 00000 n 0000213308 00000 n 0000213568 00000 n 0000213828 00000 n 0000214088 00000 n 0000214348 00000 n 0000214608 00000 n 0000214868 00000 n 0000215121 00000 n 0000215382 00000 n 0000215643 00000 n 0000215904 00000 n 0000216165 00000 n 0000216426 00000 n 0000216687 00000 n 0000216948 00000 n 0000217209 00000 n 0000217470 00000 n 0000217724 00000 n 0000217985 00000 n 0000218246 00000 n 0000218501 00000 n 0000218765 00000 n 0000219034 00000 n 0000219302 00000 n 0000219569 00000 n 0000219846 00000 n 0000220119 00000 n 0000220387 00000 n 0000220667 00000 n 0000220947 00000 n 0000221219 00000 n 0000221488 00000 n 0000221749 00000 n 0000222015 00000 n 0000222294 00000 n 0000222559 00000 n 0000222831 00000 n 0000223096 00000 n 0000223364 00000 n 0000223635 00000 n 0000223905 00000 n 0000224173 00000 n 0000224445 00000 n 0000224713 00000 n 0000224977 00000 n 0000225243 00000 n 0000225506 00000 n 0000225773 00000 n 0000226049 00000 n 0000226318 00000 n 0000227570 00000 n 0000234912 00000 n 0000226720 00000 n 0000226909 00000 n 0000257188 00000 n 0000234934 00000 n 0000235207 00000 n 0000235473 00000 n 0000235738 00000 n 0000236008 00000 n 0000236289 00000 n 0000236567 00000 n 0000236838 00000 n 0000237101 00000 n 0000237372 00000 n 0000237640 00000 n 0000237916 00000 n 0000238185 00000 n 0000238458 00000 n 0000238735 00000 n 0000239007 00000 n 0000239268 00000 n 0000239545 00000 n 0000239821 00000 n 0000240089 00000 n 0000240367 00000 n 0000240643 00000 n 0000240923 00000 n 0000241189 00000 n 0000241454 00000 n 0000241728 00000 n 0000242001 00000 n 0000242275 00000 n 0000242548 00000 n 0000242823 00000 n 0000243100 00000 n 0000243381 00000 n 0000243649 00000 n 0000243925 00000 n 0000244197 00000 n 0000244468 00000 n 0000244733 00000 n 0000245000 00000 n 0000245269 00000 n 0000245540 00000 n 0000245819 00000 n 0000246090 00000 n 0000246354 00000 n 0000246628 00000 n 0000246895 00000 n 0000247167 00000 n 0000247431 00000 n 0000247718 00000 n 0000248004 00000 n 0000248265 00000 n 0000248536 00000 n 0000248809 00000 n 0000249083 00000 n 0000249356 00000 n 0000249634 00000 n 0000249903 00000 n 0000250177 00000 n 0000250449 00000 n 0000250725 00000 n 0000250998 00000 n 0000251275 00000 n 0000251560 00000 n 0000251837 00000 n 0000252124 00000 n 0000252396 00000 n 0000252672 00000 n 0000252941 00000 n 0000253219 00000 n 0000253398 00000 n 0000253679 00000 n 0000253951 00000 n 0000254220 00000 n 0000254485 00000 n 0000254757 00000 n 0000255033 00000 n 0000255312 00000 n 0000255579 00000 n 0000255844 00000 n 0000256108 00000 n 0000256369 00000 n 0000256639 00000 n 0000256914 00000 n 0000258180 00000 n 0000267047 00000 n 0000257314 00000 n 0000257503 00000 n 0000287638 00000 n 0000267069 00000 n 0000267353 00000 n 0000267627 00000 n 0000267900 00000 n 0000268177 00000 n 0000268454 00000 n 0000268731 00000 n 0000268996 00000 n 0000269261 00000 n 0000269542 00000 n 0000269812 00000 n 0000270088 00000 n 0000270363 00000 n 0000270639 00000 n 0000270912 00000 n 0000271188 00000 n 0000271457 00000 n 0000271733 00000 n 0000272009 00000 n 0000272264 00000 n 0000272523 00000 n 0000272782 00000 n 0000273041 00000 n 0000273300 00000 n 0000273559 00000 n 0000273818 00000 n 0000274077 00000 n 0000274336 00000 n 0000274596 00000 n 0000274856 00000 n 0000275110 00000 n 0000275368 00000 n 0000275626 00000 n 0000275892 00000 n 0000276150 00000 n 0000276408 00000 n 0000276666 00000 n 0000276924 00000 n 0000277182 00000 n 0000277440 00000 n 0000277699 00000 n 0000277958 00000 n 0000278217 00000 n 0000278476 00000 n 0000278741 00000 n 0000279000 00000 n 0000279259 00000 n 0000279518 00000 n 0000279777 00000 n 0000280036 00000 n 0000280295 00000 n 0000280554 00000 n 0000280813 00000 n 0000281072 00000 n 0000281331 00000 n 0000281596 00000 n 0000281855 00000 n 0000282114 00000 n 0000282373 00000 n 0000282632 00000 n 0000282891 00000 n 0000283150 00000 n 0000283419 00000 n 0000283700 00000 n 0000283971 00000 n 0000284240 00000 n 0000284499 00000 n 0000284751 00000 n 0000285010 00000 n 0000285269 00000 n 0000285528 00000 n 0000285787 00000 n 0000286046 00000 n 0000286305 00000 n 0000286563 00000 n 0000286838 00000 n 0000287100 00000 n 0000287369 00000 n 0000288598 00000 n 0000296064 00000 n 0000287764 00000 n 0000287953 00000 n 0000316318 00000 n 0000296086 00000 n 0000296357 00000 n 0000296629 00000 n 0000296897 00000 n 0000297167 00000 n 0000297434 00000 n 0000297703 00000 n 0000297970 00000 n 0000298234 00000 n 0000298500 00000 n 0000298762 00000 n 0000299036 00000 n 0000299300 00000 n 0000299567 00000 n 0000299833 00000 n 0000300099 00000 n 0000300358 00000 n 0000300621 00000 n 0000300887 00000 n 0000301160 00000 n 0000301416 00000 n 0000301676 00000 n 0000301936 00000 n 0000302196 00000 n 0000302456 00000 n 0000302716 00000 n 0000302976 00000 n 0000303236 00000 n 0000303496 00000 n 0000303757 00000 n 0000304018 00000 n 0000304279 00000 n 0000304540 00000 n 0000304801 00000 n 0000305062 00000 n 0000305323 00000 n 0000305584 00000 n 0000305845 00000 n 0000306106 00000 n 0000306367 00000 n 0000306628 00000 n 0000306889 00000 n 0000307143 00000 n 0000307404 00000 n 0000307665 00000 n 0000307926 00000 n 0000308187 00000 n 0000308448 00000 n 0000308709 00000 n 0000308970 00000 n 0000309224 00000 n 0000309481 00000 n 0000309742 00000 n 0000310003 00000 n 0000310264 00000 n 0000310525 00000 n 0000310786 00000 n 0000311047 00000 n 0000311308 00000 n 0000311569 00000 n 0000311831 00000 n 0000312093 00000 n 0000312355 00000 n 0000312617 00000 n 0000312879 00000 n 0000313141 00000 n 0000313403 00000 n 0000313665 00000 n 0000313927 00000 n 0000314189 00000 n 0000314472 00000 n 0000314752 00000 n 0000315014 00000 n 0000315276 00000 n 0000315538 00000 n 0000315800 00000 n 0000316062 00000 n 0000317270 00000 n 0000323868 00000 n 0000316444 00000 n 0000316633 00000 n 0000344733 00000 n 0000323890 00000 n 0000324150 00000 n 0000324410 00000 n 0000324670 00000 n 0000324930 00000 n 0000325190 00000 n 0000325450 00000 n 0000325710 00000 n 0000325970 00000 n 0000326231 00000 n 0000326492 00000 n 0000326753 00000 n 0000327014 00000 n 0000327275 00000 n 0000327536 00000 n 0000327797 00000 n 0000328058 00000 n 0000328319 00000 n 0000328580 00000 n 0000328841 00000 n 0000329102 00000 n 0000329363 00000 n 0000329624 00000 n 0000329885 00000 n 0000330146 00000 n 0000330407 00000 n 0000330668 00000 n 0000330929 00000 n 0000331190 00000 n 0000331451 00000 n 0000331712 00000 n 0000331973 00000 n 0000332234 00000 n 0000332495 00000 n 0000332756 00000 n 0000333017 00000 n 0000333278 00000 n 0000333539 00000 n 0000333800 00000 n 0000334061 00000 n 0000334322 00000 n 0000334583 00000 n 0000334844 00000 n 0000335105 00000 n 0000335366 00000 n 0000335627 00000 n 0000335888 00000 n 0000336154 00000 n 0000336415 00000 n 0000336676 00000 n 0000336937 00000 n 0000337198 00000 n 0000337459 00000 n 0000337720 00000 n 0000337974 00000 n 0000338232 00000 n 0000338492 00000 n 0000338752 00000 n 0000339010 00000 n 0000339270 00000 n 0000339530 00000 n 0000339790 00000 n 0000340050 00000 n 0000340310 00000 n 0000340570 00000 n 0000340832 00000 n 0000341087 00000 n 0000341349 00000 n 0000341611 00000 n 0000341873 00000 n 0000342133 00000 n 0000342391 00000 n 0000342651 00000 n 0000342912 00000 n 0000343173 00000 n 0000343434 00000 n 0000343695 00000 n 0000343956 00000 n 0000344217 00000 n 0000344473 00000 n 0000345722 00000 n 0000353292 00000 n 0000344862 00000 n 0000345052 00000 n 0000374932 00000 n 0000353315 00000 n 0000353575 00000 n 0000353835 00000 n 0000354095 00000 n 0000354355 00000 n 0000354615 00000 n 0000354875 00000 n 0000355135 00000 n 0000355396 00000 n 0000355657 00000 n 0000355918 00000 n 0000356176 00000 n 0000356438 00000 n 0000356700 00000 n 0000356962 00000 n 0000357224 00000 n 0000357486 00000 n 0000357748 00000 n 0000358010 00000 n 0000358273 00000 n 0000358536 00000 n 0000358799 00000 n 0000359062 00000 n 0000359325 00000 n 0000359588 00000 n 0000359851 00000 n 0000360114 00000 n 0000360377 00000 n 0000360640 00000 n 0000360903 00000 n 0000361166 00000 n 0000361429 00000 n 0000361692 00000 n 0000361955 00000 n 0000362218 00000 n 0000362481 00000 n 0000362744 00000 n 0000363028 00000 n 0000363309 00000 n 0000363573 00000 n 0000363836 00000 n 0000364099 00000 n 0000364371 00000 n 0000364649 00000 n 0000364925 00000 n 0000365188 00000 n 0000365451 00000 n 0000365719 00000 n 0000365982 00000 n 0000366245 00000 n 0000366508 00000 n 0000366771 00000 n 0000367034 00000 n 0000367297 00000 n 0000367560 00000 n 0000367823 00000 n 0000368086 00000 n 0000368349 00000 n 0000368612 00000 n 0000368875 00000 n 0000369138 00000 n 0000369401 00000 n 0000369664 00000 n 0000369927 00000 n 0000370190 00000 n 0000370461 00000 n 0000370724 00000 n 0000370987 00000 n 0000371250 00000 n 0000371513 00000 n 0000371776 00000 n 0000372039 00000 n 0000372302 00000 n 0000372565 00000 n 0000372828 00000 n 0000373091 00000 n 0000373354 00000 n 0000373617 00000 n 0000373880 00000 n 0000374143 00000 n 0000374406 00000 n 0000374669 00000 n 0000376012 00000 n 0000383947 00000 n 0000375062 00000 n 0000375252 00000 n 0000404935 00000 n 0000383970 00000 n 0000384237 00000 n 0000384504 00000 n 0000384767 00000 n 0000385030 00000 n 0000385293 00000 n 0000385565 00000 n 0000385837 00000 n 0000386105 00000 n 0000386378 00000 n 0000386664 00000 n 0000386937 00000 n 0000387117 00000 n 0000387404 00000 n 0000387584 00000 n 0000387864 00000 n 0000388137 00000 n 0000388400 00000 n 0000388663 00000 n 0000388926 00000 n 0000389189 00000 n 0000389457 00000 n 0000389710 00000 n 0000389967 00000 n 0000390224 00000 n 0000390481 00000 n 0000390738 00000 n 0000391012 00000 n 0000391269 00000 n 0000391526 00000 n 0000391782 00000 n 0000392042 00000 n 0000392302 00000 n 0000392562 00000 n 0000392822 00000 n 0000393082 00000 n 0000393342 00000 n 0000393602 00000 n 0000393862 00000 n 0000394123 00000 n 0000394384 00000 n 0000394645 00000 n 0000394906 00000 n 0000395167 00000 n 0000395428 00000 n 0000395689 00000 n 0000395950 00000 n 0000396211 00000 n 0000396472 00000 n 0000396733 00000 n 0000396994 00000 n 0000397255 00000 n 0000397516 00000 n 0000397779 00000 n 0000398050 00000 n 0000398318 00000 n 0000398579 00000 n 0000398861 00000 n 0000399140 00000 n 0000399401 00000 n 0000399662 00000 n 0000399923 00000 n 0000400184 00000 n 0000400445 00000 n 0000400706 00000 n 0000400960 00000 n 0000401221 00000 n 0000401482 00000 n 0000401743 00000 n 0000402006 00000 n 0000402260 00000 n 0000402521 00000 n 0000402782 00000 n 0000403043 00000 n 0000403313 00000 n 0000403587 00000 n 0000403862 00000 n 0000404140 00000 n 0000404401 00000 n 0000404668 00000 n 0000405997 00000 n 0000413418 00000 n 0000405065 00000 n 0000405255 00000 n 0000435189 00000 n 0000413441 00000 n 0000413709 00000 n 0000413981 00000 n 0000414253 00000 n 0000414523 00000 n 0000414795 00000 n 0000415068 00000 n 0000415340 00000 n 0000415613 00000 n 0000415883 00000 n 0000416155 00000 n 0000416426 00000 n 0000416701 00000 n 0000416970 00000 n 0000417249 00000 n 0000417517 00000 n 0000417790 00000 n 0000418051 00000 n 0000418312 00000 n 0000418566 00000 n 0000418820 00000 n 0000419081 00000 n 0000419342 00000 n 0000419603 00000 n 0000419864 00000 n 0000420125 00000 n 0000420386 00000 n 0000420647 00000 n 0000420908 00000 n 0000421169 00000 n 0000421430 00000 n 0000421691 00000 n 0000421952 00000 n 0000422213 00000 n 0000422478 00000 n 0000422743 00000 n 0000423016 00000 n 0000423277 00000 n 0000423538 00000 n 0000423799 00000 n 0000424076 00000 n 0000424337 00000 n 0000424598 00000 n 0000424859 00000 n 0000425120 00000 n 0000425381 00000 n 0000425642 00000 n 0000425903 00000 n 0000426164 00000 n 0000426425 00000 n 0000426683 00000 n 0000426955 00000 n 0000427226 00000 n 0000427410 00000 n 0000427697 00000 n 0000427983 00000 n 0000428267 00000 n 0000428546 00000 n 0000428813 00000 n 0000429089 00000 n 0000429368 00000 n 0000429645 00000 n 0000429908 00000 n 0000430171 00000 n 0000430455 00000 n 0000430742 00000 n 0000431019 00000 n 0000431292 00000 n 0000431568 00000 n 0000431754 00000 n 0000431940 00000 n 0000432215 00000 n 0000432494 00000 n 0000432777 00000 n 0000433060 00000 n 0000433238 00000 n 0000433519 00000 n 0000433800 00000 n 0000434082 00000 n 0000434364 00000 n 0000434639 00000 n 0000434906 00000 n 0000436269 00000 n 0000442834 00000 n 0000435319 00000 n 0000435509 00000 n 0000463780 00000 n 0000442857 00000 n 0000443131 00000 n 0000443415 00000 n 0000443691 00000 n 0000443962 00000 n 0000444242 00000 n 0000444515 00000 n 0000444803 00000 n 0000445089 00000 n 0000445365 00000 n 0000445543 00000 n 0000445727 00000 n 0000446001 00000 n 0000446256 00000 n 0000446515 00000 n 0000446774 00000 n 0000447033 00000 n 0000447292 00000 n 0000447551 00000 n 0000447810 00000 n 0000448069 00000 n 0000448328 00000 n 0000448588 00000 n 0000448848 00000 n 0000449108 00000 n 0000449368 00000 n 0000449628 00000 n 0000449888 00000 n 0000450148 00000 n 0000450408 00000 n 0000450668 00000 n 0000450928 00000 n 0000451188 00000 n 0000451448 00000 n 0000451708 00000 n 0000451968 00000 n 0000452228 00000 n 0000452488 00000 n 0000452748 00000 n 0000453008 00000 n 0000453268 00000 n 0000453528 00000 n 0000453788 00000 n 0000454048 00000 n 0000454308 00000 n 0000454568 00000 n 0000454828 00000 n 0000455088 00000 n 0000455348 00000 n 0000455608 00000 n 0000455868 00000 n 0000456128 00000 n 0000456388 00000 n 0000456648 00000 n 0000456908 00000 n 0000457168 00000 n 0000457428 00000 n 0000457688 00000 n 0000457948 00000 n 0000458209 00000 n 0000458474 00000 n 0000458739 00000 n 0000459004 00000 n 0000459269 00000 n 0000459534 00000 n 0000459799 00000 n 0000460064 00000 n 0000460329 00000 n 0000460595 00000 n 0000460861 00000 n 0000461127 00000 n 0000461393 00000 n 0000461659 00000 n 0000461925 00000 n 0000462191 00000 n 0000462457 00000 n 0000462723 00000 n 0000462989 00000 n 0000463248 00000 n 0000463514 00000 n 0000464842 00000 n 0000472738 00000 n 0000463910 00000 n 0000464100 00000 n 0000491059 00000 n 0000472761 00000 n 0000472816 00000 n 0000472871 00000 n 0000472926 00000 n 0000472981 00000 n 0000473036 00000 n 0000473091 00000 n 0000473146 00000 n 0000473201 00000 n 0000473467 00000 n 0000473733 00000 n 0000473999 00000 n 0000474265 00000 n 0000474531 00000 n 0000474797 00000 n 0000475063 00000 n 0000475329 00000 n 0000475595 00000 n 0000475861 00000 n 0000476135 00000 n 0000476401 00000 n 0000476667 00000 n 0000476933 00000 n 0000477199 00000 n 0000477465 00000 n 0000477746 00000 n 0000478012 00000 n 0000478278 00000 n 0000478544 00000 n 0000478816 00000 n 0000479096 00000 n 0000479362 00000 n 0000479637 00000 n 0000479922 00000 n 0000480201 00000 n 0000480467 00000 n 0000480741 00000 n 0000481000 00000 n 0000481264 00000 n 0000481523 00000 n 0000481784 00000 n 0000482033 00000 n 0000482293 00000 n 0000482556 00000 n 0000482820 00000 n 0000483079 00000 n 0000483340 00000 n 0000483600 00000 n 0000483865 00000 n 0000484125 00000 n 0000484384 00000 n 0000484644 00000 n 0000484903 00000 n 0000485161 00000 n 0000485422 00000 n 0000485681 00000 n 0000485939 00000 n 0000486198 00000 n 0000486451 00000 n 0000486705 00000 n 0000486962 00000 n 0000487218 00000 n 0000487480 00000 n 0000487736 00000 n 0000487991 00000 n 0000488250 00000 n 0000488510 00000 n 0000488767 00000 n 0000489025 00000 n 0000489275 00000 n 0000489530 00000 n 0000489786 00000 n 0000490044 00000 n 0000490297 00000 n 0000490546 00000 n 0000490804 00000 n 0000492013 00000 n 0000498849 00000 n 0000491189 00000 n 0000491379 00000 n 0000505093 00000 n 0004924782 00000 n 0000498872 00000 n 0000498927 00000 n 0000498982 00000 n 0000499037 00000 n 0000499092 00000 n 0000499147 00000 n 0000499202 00000 n 0000499257 00000 n 0000499312 00000 n 0000499367 00000 n 0000499422 00000 n 0000499477 00000 n 0000499532 00000 n 0000499793 00000 n 0000500056 00000 n 0000500319 00000 n 0000500586 00000 n 0000500849 00000 n 0000501105 00000 n 0000501368 00000 n 0000501631 00000 n 0000501894 00000 n 0000502167 00000 n 0000502431 00000 n 0000502695 00000 n 0000502967 00000 n 0000503247 00000 n 0000503524 00000 n 0000503800 00000 n 0000504067 00000 n 0000504335 00000 n 0000504528 00000 n 0000504710 00000 n 0000504902 00000 n 0000505649 00000 n 0000511652 00000 n 0000505223 00000 n 0000505429 00000 n 0000514261 00000 n 0000511675 00000 n 0000511730 00000 n 0000511785 00000 n 0000511840 00000 n 0000511895 00000 n 0000511950 00000 n 0000512005 00000 n 0000512060 00000 n 0000512115 00000 n 0000512170 00000 n 0000512225 00000 n 0000512280 00000 n 0000512335 00000 n 0000512390 00000 n 0000512445 00000 n 0000512500 00000 n 0000512555 00000 n 0000512610 00000 n 0000512665 00000 n 0000512720 00000 n 0000512775 00000 n 0000513048 00000 n 0000513307 00000 n 0000513501 00000 n 0000513686 00000 n 0000513878 00000 n 0000514065 00000 n 0000514682 00000 n 0000521660 00000 n 0000514391 00000 n 0000514597 00000 n 0000522848 00000 n 0000521683 00000 n 0000521738 00000 n 0000521793 00000 n 0000521848 00000 n 0000521903 00000 n 0000522162 00000 n 0000522345 00000 n 0000522536 00000 n 0000523242 00000 n 0000530369 00000 n 0000522978 00000 n 0000523184 00000 n 0000534322 00000 n 0000530392 00000 n 0000530447 00000 n 0000530502 00000 n 0000530557 00000 n 0000530612 00000 n 0000530667 00000 n 0000530722 00000 n 0000530777 00000 n 0000530832 00000 n 0000531100 00000 n 0000531368 00000 n 0000531636 00000 n 0000531904 00000 n 0000532172 00000 n 0000532440 00000 n 0000532708 00000 n 0000532969 00000 n 0000533238 00000 n 0000533507 00000 n 0000533784 00000 n 0000534053 00000 n 0000534781 00000 n 0000542981 00000 n 0000534452 00000 n 0000534642 00000 n 0000543334 00000 n 0004867610 00000 n 0000543004 00000 n 0000543059 00000 n 0000543114 00000 n 0000543169 00000 n 0000543224 00000 n 0000543279 00000 n 0000543708 00000 n 0000548691 00000 n 0000543464 00000 n 0000543686 00000 n 0000549154 00000 n 0000548714 00000 n 0000548769 00000 n 0000548824 00000 n 0000548879 00000 n 0000548934 00000 n 0000548989 00000 n 0000549044 00000 n 0000549099 00000 n 0000549528 00000 n 0000554178 00000 n 0000549284 00000 n 0000549506 00000 n 0000556229 00000 n 0000554201 00000 n 0000554256 00000 n 0000554311 00000 n 0000554366 00000 n 0000554421 00000 n 0000554476 00000 n 0000554531 00000 n 0000554586 00000 n 0000554641 00000 n 0000554696 00000 n 0000554751 00000 n 0000555014 00000 n 0000555214 00000 n 0000555407 00000 n 0000555606 00000 n 0000555842 00000 n 0000556050 00000 n 0000556650 00000 n 0000564258 00000 n 0000556359 00000 n 0000556565 00000 n 0000571149 00000 n 0000564281 00000 n 0000564336 00000 n 0000564391 00000 n 0000564446 00000 n 0000564501 00000 n 0000564556 00000 n 0000564611 00000 n 0000564666 00000 n 0000564721 00000 n 0000564776 00000 n 0000564831 00000 n 0000564886 00000 n 0000564941 00000 n 0000564996 00000 n 0000565051 00000 n 0000565323 00000 n 0000565593 00000 n 0000565861 00000 n 0000566134 00000 n 0000566400 00000 n 0000566664 00000 n 0000566928 00000 n 0000567194 00000 n 0000567457 00000 n 0000567718 00000 n 0000567982 00000 n 0000568257 00000 n 0000568529 00000 n 0000568797 00000 n 0000569067 00000 n 0000569333 00000 n 0000569614 00000 n 0000569889 00000 n 0000570163 00000 n 0000570431 00000 n 0000570699 00000 n 0000570974 00000 n 0000571730 00000 n 0000578267 00000 n 0000571279 00000 n 0000571501 00000 n 0000580302 00000 n 0000578290 00000 n 0000578345 00000 n 0000578400 00000 n 0000578455 00000 n 0000578510 00000 n 0000578565 00000 n 0000578620 00000 n 0000578675 00000 n 0000578730 00000 n 0000578785 00000 n 0000578840 00000 n 0000578895 00000 n 0000578950 00000 n 0000579005 00000 n 0000579060 00000 n 0000579115 00000 n 0000579170 00000 n 0000579354 00000 n 0000579537 00000 n 0000579713 00000 n 0000579904 00000 n 0000580095 00000 n 0000580730 00000 n 0000586676 00000 n 0000580432 00000 n 0000580654 00000 n 0000587722 00000 n 0000586699 00000 n 0000586754 00000 n 0000586809 00000 n 0000586864 00000 n 0000586919 00000 n 0000586974 00000 n 0000587029 00000 n 0000587084 00000 n 0000587139 00000 n 0000587330 00000 n 0000587540 00000 n 0000588107 00000 n 0000594516 00000 n 0000587852 00000 n 0000588058 00000 n 0000599705 00000 n 0000594539 00000 n 0000596331 00000 n 0000596354 00000 n 0000596409 00000 n 0000596464 00000 n 0000596519 00000 n 0000596574 00000 n 0000596629 00000 n 0000596684 00000 n 0000596739 00000 n 0000596794 00000 n 0000597052 00000 n 0000597317 00000 n 0000597582 00000 n 0000597847 00000 n 0000598112 00000 n 0000598377 00000 n 0000598642 00000 n 0000598907 00000 n 0000599173 00000 n 0000599439 00000 n 0000600179 00000 n 0000605579 00000 n 0000599835 00000 n 0000600058 00000 n 0000605822 00000 n 0000605602 00000 n 0000605657 00000 n 0000605712 00000 n 0000605767 00000 n 0000606180 00000 n 0000610782 00000 n 0000605952 00000 n 0000606158 00000 n 0000611025 00000 n 0000610805 00000 n 0000610860 00000 n 0000610915 00000 n 0000610970 00000 n 0000611383 00000 n 0000615259 00000 n 0000611155 00000 n 0000611361 00000 n 0000615722 00000 n 0000615282 00000 n 0000615337 00000 n 0000615392 00000 n 0000615447 00000 n 0000615502 00000 n 0000615557 00000 n 0000615612 00000 n 0000615667 00000 n 0000616080 00000 n 0000621671 00000 n 0000615852 00000 n 0000616058 00000 n 0000635822 00000 n 0004891151 00000 n 0004905158 00000 n 0000621694 00000 n 0000621749 00000 n 0000621804 00000 n 0000621859 00000 n 0000621914 00000 n 0000622174 00000 n 0000622434 00000 n 0000622697 00000 n 0000622957 00000 n 0000623217 00000 n 0000623470 00000 n 0000623730 00000 n 0000623990 00000 n 0000624251 00000 n 0000624512 00000 n 0000624773 00000 n 0000625027 00000 n 0000625288 00000 n 0000625549 00000 n 0000625810 00000 n 0000626071 00000 n 0000626332 00000 n 0000626593 00000 n 0000626854 00000 n 0000627115 00000 n 0000627376 00000 n 0000627637 00000 n 0000627898 00000 n 0000628152 00000 n 0000628413 00000 n 0000628688 00000 n 0000628958 00000 n 0000629219 00000 n 0000629493 00000 n 0000629767 00000 n 0000630039 00000 n 0000630308 00000 n 0000630569 00000 n 0000630830 00000 n 0000631091 00000 n 0000631352 00000 n 0000631613 00000 n 0000631892 00000 n 0000632153 00000 n 0000632433 00000 n 0000632697 00000 n 0000632958 00000 n 0000633219 00000 n 0000633480 00000 n 0000633741 00000 n 0000634002 00000 n 0000634263 00000 n 0000634524 00000 n 0000634785 00000 n 0000635046 00000 n 0000635300 00000 n 0000635561 00000 n 0000636689 00000 n 0000643886 00000 n 0000635952 00000 n 0000636190 00000 n 0000644401 00000 n 0000643909 00000 n 0000643964 00000 n 0000644019 00000 n 0000644074 00000 n 0000644129 00000 n 0000644800 00000 n 0000650076 00000 n 0000644531 00000 n 0000644769 00000 n 0000650803 00000 n 0000650099 00000 n 0000650154 00000 n 0000650209 00000 n 0000650264 00000 n 0000650319 00000 n 0000650374 00000 n 0000650429 00000 n 0000650484 00000 n 0000650539 00000 n 0000651170 00000 n 0000657384 00000 n 0000650933 00000 n 0000651139 00000 n 0000657792 00000 n 0000657407 00000 n 0000657462 00000 n 0000657517 00000 n 0000658175 00000 n 0000662933 00000 n 0000657922 00000 n 0000658144 00000 n 0000663436 00000 n 0000662956 00000 n 0000663011 00000 n 0000663066 00000 n 0000663121 00000 n 0000663176 00000 n 0000663803 00000 n 0000670507 00000 n 0000663566 00000 n 0000663772 00000 n 0000670640 00000 n 0000670530 00000 n 0000670585 00000 n 0000670998 00000 n 0000676488 00000 n 0000670770 00000 n 0000670976 00000 n 0000677367 00000 n 0000676511 00000 n 0000676566 00000 n 0000676621 00000 n 0000676676 00000 n 0000676731 00000 n 0000676786 00000 n 0000676841 00000 n 0000677107 00000 n 0000677743 00000 n 0000683904 00000 n 0000677497 00000 n 0000677703 00000 n 0000684257 00000 n 0000683927 00000 n 0000683982 00000 n 0000684037 00000 n 0000684092 00000 n 0000684147 00000 n 0000684202 00000 n 0000684615 00000 n 0000690827 00000 n 0000684387 00000 n 0000684593 00000 n 0000691070 00000 n 0000690850 00000 n 0000690905 00000 n 0000690960 00000 n 0000691015 00000 n 0000691428 00000 n 0000696135 00000 n 0000691200 00000 n 0000691406 00000 n 0000696598 00000 n 0000696158 00000 n 0000696213 00000 n 0000696268 00000 n 0000696323 00000 n 0000696378 00000 n 0000696433 00000 n 0000696488 00000 n 0000696543 00000 n 0000696956 00000 n 0000701555 00000 n 0000696728 00000 n 0000696934 00000 n 0000701688 00000 n 0000701578 00000 n 0000701633 00000 n 0000702062 00000 n 0000706527 00000 n 0000701818 00000 n 0000702040 00000 n 0000706660 00000 n 0000706550 00000 n 0000706605 00000 n 0000707034 00000 n 0000711462 00000 n 0000706790 00000 n 0000707012 00000 n 0000712089 00000 n 0000711485 00000 n 0000711540 00000 n 0000711595 00000 n 0000711650 00000 n 0000711705 00000 n 0000711760 00000 n 0000711815 00000 n 0000712456 00000 n 0000716622 00000 n 0000712219 00000 n 0000712425 00000 n 0000716755 00000 n 0000716645 00000 n 0000716700 00000 n 0000717113 00000 n 0000722742 00000 n 0000716885 00000 n 0000717091 00000 n 0000722948 00000 n 0000722765 00000 n 0000723331 00000 n 0000732791 00000 n 0000723078 00000 n 0000723300 00000 n 0000733209 00000 n 0000732814 00000 n 0000732869 00000 n 0000732924 00000 n 0000732979 00000 n 0000733034 00000 n 0000733576 00000 n 0000739002 00000 n 0000733339 00000 n 0000733545 00000 n 0000739518 00000 n 0000739025 00000 n 0000739080 00000 n 0000739135 00000 n 0000739190 00000 n 0000739245 00000 n 0000739885 00000 n 0000744378 00000 n 0000739648 00000 n 0000739854 00000 n 0000744771 00000 n 0000744401 00000 n 0000744456 00000 n 0000744511 00000 n 0000745138 00000 n 0000749451 00000 n 0000744901 00000 n 0000745107 00000 n 0000749694 00000 n 0000749474 00000 n 0000749529 00000 n 0000749584 00000 n 0000749639 00000 n 0000750052 00000 n 0000753541 00000 n 0000749824 00000 n 0000750030 00000 n 0000754056 00000 n 0000753564 00000 n 0000753619 00000 n 0000753674 00000 n 0000753729 00000 n 0000753784 00000 n 0000754439 00000 n 0000758696 00000 n 0000754186 00000 n 0000754408 00000 n 0000758939 00000 n 0000758719 00000 n 0000758774 00000 n 0000758829 00000 n 0000758884 00000 n 0000759313 00000 n 0000764585 00000 n 0000759069 00000 n 0000759291 00000 n 0000764608 00000 n 0000764966 00000 n 0000768522 00000 n 0000764738 00000 n 0000764944 00000 n 0000768545 00000 n 0000768893 00000 n 0000772076 00000 n 0000768675 00000 n 0000768871 00000 n 0000772209 00000 n 0000772099 00000 n 0000772154 00000 n 0000772567 00000 n 0000775747 00000 n 0000772339 00000 n 0000772545 00000 n 0000776375 00000 n 0000775770 00000 n 0000775825 00000 n 0000775880 00000 n 0000775935 00000 n 0000775990 00000 n 0000776045 00000 n 0000776100 00000 n 0000776742 00000 n 0000781911 00000 n 0000776505 00000 n 0000776711 00000 n 0000782044 00000 n 0000781934 00000 n 0000781989 00000 n 0000782402 00000 n 0000787085 00000 n 0000782174 00000 n 0000782380 00000 n 0000788042 00000 n 0000787108 00000 n 0000787163 00000 n 0000787218 00000 n 0000787273 00000 n 0000787328 00000 n 0000787383 00000 n 0000787438 00000 n 0000787493 00000 n 0000787548 00000 n 0000787603 00000 n 0000787658 00000 n 0000787850 00000 n 0000788418 00000 n 0000794322 00000 n 0000788172 00000 n 0000788378 00000 n 0000794675 00000 n 0000794345 00000 n 0000794400 00000 n 0000794455 00000 n 0000794510 00000 n 0000794565 00000 n 0000794620 00000 n 0000795033 00000 n 0000800832 00000 n 0000794805 00000 n 0000795011 00000 n 0000813015 00000 n 0000800855 00000 n 0000800910 00000 n 0000800965 00000 n 0000801020 00000 n 0000801075 00000 n 0000801130 00000 n 0000801185 00000 n 0000801449 00000 n 0000801713 00000 n 0000801977 00000 n 0000802241 00000 n 0000802506 00000 n 0000802771 00000 n 0000803036 00000 n 0000803301 00000 n 0000803565 00000 n 0000803829 00000 n 0000804093 00000 n 0000804357 00000 n 0000804622 00000 n 0000804887 00000 n 0000805152 00000 n 0000805424 00000 n 0000805697 00000 n 0000805962 00000 n 0000806227 00000 n 0000806492 00000 n 0000806757 00000 n 0000807022 00000 n 0000807287 00000 n 0000807552 00000 n 0000807831 00000 n 0000808096 00000 n 0000808361 00000 n 0000808543 00000 n 0000808808 00000 n 0000809073 00000 n 0000809349 00000 n 0000809614 00000 n 0000809885 00000 n 0000810152 00000 n 0000810332 00000 n 0000810617 00000 n 0000810885 00000 n 0000811143 00000 n 0000811418 00000 n 0000811688 00000 n 0000811953 00000 n 0000812228 00000 n 0000812494 00000 n 0000812759 00000 n 0000813778 00000 n 0000822575 00000 n 0000813145 00000 n 0000813351 00000 n 0000823038 00000 n 0000822598 00000 n 0000822653 00000 n 0000822708 00000 n 0000822763 00000 n 0000822818 00000 n 0000822873 00000 n 0000822928 00000 n 0000822983 00000 n 0000823396 00000 n 0000829850 00000 n 0000823168 00000 n 0000823374 00000 n 0000829983 00000 n 0000829873 00000 n 0000829928 00000 n 0000830357 00000 n 0000834211 00000 n 0000830113 00000 n 0000830335 00000 n 0000834454 00000 n 0000834234 00000 n 0000834289 00000 n 0000834344 00000 n 0000834399 00000 n 0000834828 00000 n 0000839526 00000 n 0000834584 00000 n 0000834806 00000 n 0000840048 00000 n 0000839549 00000 n 0000839604 00000 n 0000839659 00000 n 0000839714 00000 n 0000839769 00000 n 0000840415 00000 n 0000845276 00000 n 0000840178 00000 n 0000840384 00000 n 0000845784 00000 n 0000845299 00000 n 0000845354 00000 n 0000845409 00000 n 0000845464 00000 n 0000845519 00000 n 0000846151 00000 n 0000851347 00000 n 0000845914 00000 n 0000846120 00000 n 0000851979 00000 n 0000851370 00000 n 0000851425 00000 n 0000851480 00000 n 0000851535 00000 n 0000851590 00000 n 0000851645 00000 n 0000851700 00000 n 0000852362 00000 n 0000856702 00000 n 0000852109 00000 n 0000852331 00000 n 0000857283 00000 n 0000856725 00000 n 0000857004 00000 n 0000857649 00000 n 0000861368 00000 n 0000857413 00000 n 0000857609 00000 n 0000863079 00000 n 0000861391 00000 n 0000861446 00000 n 0000861501 00000 n 0000861780 00000 n 0000862059 00000 n 0000862346 00000 n 0000862528 00000 n 0000862800 00000 n 0000863507 00000 n 0000870176 00000 n 0000863209 00000 n 0000863431 00000 n 0000870798 00000 n 0000870199 00000 n 0000870254 00000 n 0000870309 00000 n 0000870364 00000 n 0000870419 00000 n 0000870474 00000 n 0000870529 00000 n 0000871165 00000 n 0000875685 00000 n 0000870928 00000 n 0000871134 00000 n 0000875818 00000 n 0000875708 00000 n 0000875763 00000 n 0000876176 00000 n 0000879358 00000 n 0000875948 00000 n 0000876154 00000 n 0000879601 00000 n 0000879381 00000 n 0000879436 00000 n 0000879491 00000 n 0000879546 00000 n 0000879959 00000 n 0000885172 00000 n 0000879731 00000 n 0000879937 00000 n 0000885467 00000 n 0000885195 00000 n 0000885850 00000 n 0000890439 00000 n 0000885597 00000 n 0000885819 00000 n 0000890572 00000 n 0000890462 00000 n 0000890517 00000 n 0000890930 00000 n 0000895885 00000 n 0000890702 00000 n 0000890908 00000 n 0000896128 00000 n 0000895908 00000 n 0000895963 00000 n 0000896018 00000 n 0000896073 00000 n 0000896502 00000 n 0000900678 00000 n 0000896258 00000 n 0000896480 00000 n 0000900811 00000 n 0000900701 00000 n 0000900756 00000 n 0000901169 00000 n 0000904894 00000 n 0000900941 00000 n 0000901147 00000 n 0000905219 00000 n 0000904917 00000 n 0000904972 00000 n 0000905027 00000 n 0000905586 00000 n 0000911540 00000 n 0000905349 00000 n 0000905555 00000 n 0000911563 00000 n 0000911911 00000 n 0000914937 00000 n 0000911693 00000 n 0000911889 00000 n 0000915152 00000 n 0000914960 00000 n 0000915519 00000 n 0000920380 00000 n 0000915282 00000 n 0000915488 00000 n 0000920676 00000 n 0000920403 00000 n 0000921033 00000 n 0000925306 00000 n 0000920806 00000 n 0000921002 00000 n 0000925549 00000 n 0000925329 00000 n 0000925384 00000 n 0000925439 00000 n 0000925494 00000 n 0000925923 00000 n 0000930758 00000 n 0000925679 00000 n 0000925901 00000 n 0000930891 00000 n 0000930781 00000 n 0000930836 00000 n 0000931265 00000 n 0000936426 00000 n 0000931021 00000 n 0000931243 00000 n 0000937010 00000 n 0000936449 00000 n 0000936504 00000 n 0000936559 00000 n 0000936730 00000 n 0000937386 00000 n 0000941921 00000 n 0000937140 00000 n 0000937346 00000 n 0000941944 00000 n 0000942292 00000 n 0000946707 00000 n 0000942074 00000 n 0000942270 00000 n 0000946730 00000 n 0000947078 00000 n 0000951298 00000 n 0000946860 00000 n 0000947056 00000 n 0000951321 00000 n 0000951685 00000 n 0000955625 00000 n 0000951451 00000 n 0000951663 00000 n 0000955648 00000 n 0000956012 00000 n 0000959341 00000 n 0000955778 00000 n 0000955990 00000 n 0000959364 00000 n 0000959712 00000 n 0000963414 00000 n 0000959494 00000 n 0000959690 00000 n 0000963437 00000 n 0000963801 00000 n 0000966758 00000 n 0000963567 00000 n 0000963779 00000 n 0000966891 00000 n 0000966781 00000 n 0000966836 00000 n 0000967249 00000 n 0000971872 00000 n 0000967021 00000 n 0000967227 00000 n 0000972162 00000 n 0000971895 00000 n 0000972519 00000 n 0000975712 00000 n 0000972292 00000 n 0000972488 00000 n 0000975735 00000 n 0000976099 00000 n 0000980575 00000 n 0000975865 00000 n 0000976077 00000 n 0000980598 00000 n 0000980972 00000 n 0000985039 00000 n 0000980728 00000 n 0000980950 00000 n 0000985446 00000 n 0000985062 00000 n 0000985117 00000 n 0000985172 00000 n 0000985829 00000 n 0000989988 00000 n 0000985576 00000 n 0000985798 00000 n 0000990121 00000 n 0000990011 00000 n 0000990066 00000 n 0000990479 00000 n 0000994736 00000 n 0000990251 00000 n 0000990457 00000 n 0000995786 00000 n 0000994759 00000 n 0000994814 00000 n 0000994869 00000 n 0000994924 00000 n 0000994979 00000 n 0000995245 00000 n 0000995520 00000 n 0000996171 00000 n 0001000649 00000 n 0000995916 00000 n 0000996122 00000 n 0001000892 00000 n 0001000672 00000 n 0001000727 00000 n 0001000782 00000 n 0001000837 00000 n 0001001266 00000 n 0001005869 00000 n 0001001022 00000 n 0001001244 00000 n 0001005892 00000 n 0001006240 00000 n 0001010224 00000 n 0001006022 00000 n 0001006218 00000 n 0001010357 00000 n 0001010247 00000 n 0001010302 00000 n 0001010715 00000 n 0001013644 00000 n 0001010487 00000 n 0001010693 00000 n 0001014326 00000 n 0001013667 00000 n 0001013722 00000 n 0001013777 00000 n 0001014051 00000 n 0001014718 00000 n 0001019283 00000 n 0001014456 00000 n 0001014678 00000 n 0001019306 00000 n 0001019664 00000 n 0001023348 00000 n 0001019436 00000 n 0001019642 00000 n 0001023779 00000 n 0001023371 00000 n 0001023427 00000 n 0001023483 00000 n 0001023539 00000 n 0001023595 00000 n 0001024146 00000 n 0001029627 00000 n 0001023909 00000 n 0001024115 00000 n 0001040532 00000 n 0001029650 00000 n 0001029706 00000 n 0001029762 00000 n 0001029818 00000 n 0001029874 00000 n 0001029930 00000 n 0001029986 00000 n 0001030042 00000 n 0001030098 00000 n 0001030154 00000 n 0001030210 00000 n 0001030486 00000 n 0001030771 00000 n 0001030955 00000 n 0001031139 00000 n 0001031418 00000 n 0001031699 00000 n 0001031985 00000 n 0001032263 00000 n 0001032547 00000 n 0001032729 00000 n 0001032909 00000 n 0001033089 00000 n 0001033377 00000 n 0001033662 00000 n 0001033842 00000 n 0001034127 00000 n 0001034309 00000 n 0001034588 00000 n 0001034871 00000 n 0001035153 00000 n 0001035436 00000 n 0001035721 00000 n 0001036005 00000 n 0001036286 00000 n 0001036568 00000 n 0001036849 00000 n 0001037119 00000 n 0001037391 00000 n 0001037664 00000 n 0001037938 00000 n 0001038226 00000 n 0001038510 00000 n 0001038785 00000 n 0001039060 00000 n 0001039343 00000 n 0001039525 00000 n 0001039709 00000 n 0001039990 00000 n 0001040174 00000 n 0001040350 00000 n 0001041259 00000 n 0001048854 00000 n 0001040662 00000 n 0001040868 00000 n 0001049213 00000 n 0001048877 00000 n 0001048933 00000 n 0001048989 00000 n 0001049045 00000 n 0001049101 00000 n 0001049157 00000 n 0001049571 00000 n 0001054299 00000 n 0001049343 00000 n 0001049549 00000 n 0001054434 00000 n 0001054322 00000 n 0001054378 00000 n 0001054792 00000 n 0001058709 00000 n 0001054564 00000 n 0001054770 00000 n 0001059180 00000 n 0001058732 00000 n 0001058788 00000 n 0001058844 00000 n 0001058900 00000 n 0001058956 00000 n 0001059012 00000 n 0001059068 00000 n 0001059124 00000 n 0001059538 00000 n 0001062920 00000 n 0001059310 00000 n 0001059516 00000 n 0001063167 00000 n 0001062943 00000 n 0001062999 00000 n 0001063055 00000 n 0001063111 00000 n 0001063525 00000 n 0001066811 00000 n 0001063297 00000 n 0001063503 00000 n 0001067282 00000 n 0001066834 00000 n 0001066890 00000 n 0001066946 00000 n 0001067002 00000 n 0001067058 00000 n 0001067114 00000 n 0001067170 00000 n 0001067226 00000 n 0001067640 00000 n 0001071309 00000 n 0001067412 00000 n 0001067618 00000 n 0001071821 00000 n 0001071332 00000 n 0001071388 00000 n 0001071444 00000 n 0001071500 00000 n 0001071556 00000 n 0001072188 00000 n 0001076101 00000 n 0001071951 00000 n 0001072157 00000 n 0001076460 00000 n 0001076124 00000 n 0001076180 00000 n 0001076236 00000 n 0001076292 00000 n 0001076348 00000 n 0001076404 00000 n 0001076818 00000 n 0001080617 00000 n 0001076590 00000 n 0001076796 00000 n 0001081088 00000 n 0001080640 00000 n 0001080696 00000 n 0001080752 00000 n 0001080808 00000 n 0001080864 00000 n 0001080920 00000 n 0001080976 00000 n 0001081032 00000 n 0001081446 00000 n 0001086213 00000 n 0001081218 00000 n 0001081424 00000 n 0001087132 00000 n 0001086236 00000 n 0001086292 00000 n 0001086348 00000 n 0001086404 00000 n 0001086460 00000 n 0001086516 00000 n 0001086572 00000 n 0001086628 00000 n 0001086684 00000 n 0001086740 00000 n 0001086796 00000 n 0001086852 00000 n 0001086908 00000 n 0001086964 00000 n 0001087020 00000 n 0001087076 00000 n 0001087490 00000 n 0001091806 00000 n 0001087262 00000 n 0001087468 00000 n 0001092775 00000 n 0001091829 00000 n 0001091885 00000 n 0001091941 00000 n 0001091997 00000 n 0001092053 00000 n 0001092109 00000 n 0001092165 00000 n 0001092221 00000 n 0001092277 00000 n 0001092333 00000 n 0001092389 00000 n 0001092445 00000 n 0001092501 00000 n 0001093142 00000 n 0001098326 00000 n 0001092905 00000 n 0001093111 00000 n 0001102101 00000 n 0001098349 00000 n 0001098405 00000 n 0001098461 00000 n 0001098517 00000 n 0001098573 00000 n 0001098834 00000 n 0001099102 00000 n 0001099370 00000 n 0001099656 00000 n 0001099924 00000 n 0001100192 00000 n 0001100460 00000 n 0001100735 00000 n 0001101003 00000 n 0001101271 00000 n 0001101554 00000 n 0001101823 00000 n 0001102576 00000 n 0001107841 00000 n 0001102231 00000 n 0001102437 00000 n 0001108459 00000 n 0001107864 00000 n 0001107920 00000 n 0001107976 00000 n 0001108032 00000 n 0001108088 00000 n 0001108144 00000 n 0001108200 00000 n 0001108826 00000 n 0001114029 00000 n 0001108589 00000 n 0001108795 00000 n 0001114388 00000 n 0001114052 00000 n 0001114108 00000 n 0001114164 00000 n 0001114220 00000 n 0001114276 00000 n 0001114332 00000 n 0001114746 00000 n 0001119351 00000 n 0001114518 00000 n 0001114724 00000 n 0001119822 00000 n 0001119374 00000 n 0001119430 00000 n 0001119486 00000 n 0001119542 00000 n 0001119598 00000 n 0001119654 00000 n 0001119710 00000 n 0001119766 00000 n 0001120180 00000 n 0001123900 00000 n 0001119952 00000 n 0001120158 00000 n 0001126620 00000 n 0001123923 00000 n 0001123979 00000 n 0001124035 00000 n 0001124091 00000 n 0001124147 00000 n 0001124203 00000 n 0001124259 00000 n 0001124519 00000 n 0001124782 00000 n 0001125045 00000 n 0001125301 00000 n 0001125568 00000 n 0001125831 00000 n 0001126094 00000 n 0001126357 00000 n 0001127059 00000 n 0001131448 00000 n 0001126750 00000 n 0001126956 00000 n 0001134762 00000 n 0001131471 00000 n 0001131527 00000 n 0001131583 00000 n 0001131639 00000 n 0001131695 00000 n 0001131751 00000 n 0001131807 00000 n 0001132071 00000 n 0001132335 00000 n 0001132599 00000 n 0001132874 00000 n 0001133144 00000 n 0001133414 00000 n 0001133688 00000 n 0001133962 00000 n 0001134234 00000 n 0001134498 00000 n 0001135235 00000 n 0001141705 00000 n 0001134892 00000 n 0001135114 00000 n 0001141728 00000 n 0001142102 00000 n 0001146409 00000 n 0001141858 00000 n 0001142080 00000 n 0001146544 00000 n 0001146432 00000 n 0001146488 00000 n 0001146918 00000 n 0001151251 00000 n 0001146674 00000 n 0001146896 00000 n 0001151386 00000 n 0001151274 00000 n 0001151330 00000 n 0001151776 00000 n 0001155827 00000 n 0001151516 00000 n 0001151754 00000 n 0001155962 00000 n 0001155850 00000 n 0001155906 00000 n 0001156336 00000 n 0001159994 00000 n 0001156092 00000 n 0001156314 00000 n 0001160465 00000 n 0001160017 00000 n 0001160073 00000 n 0001160129 00000 n 0001160185 00000 n 0001160241 00000 n 0001160297 00000 n 0001160353 00000 n 0001160409 00000 n 0001160839 00000 n 0001165521 00000 n 0001160595 00000 n 0001160817 00000 n 0001165931 00000 n 0004910784 00000 n 0001165544 00000 n 0001165600 00000 n 0001165656 00000 n 0001166330 00000 n 0001171158 00000 n 0001166061 00000 n 0001166299 00000 n 0001171181 00000 n 0001171587 00000 n 0001175980 00000 n 0001171311 00000 n 0001171565 00000 n 0001176003 00000 n 0001176377 00000 n 0001179769 00000 n 0001176133 00000 n 0001176355 00000 n 0001180016 00000 n 0001179792 00000 n 0001179848 00000 n 0001179904 00000 n 0001179960 00000 n 0001180374 00000 n 0001187027 00000 n 0001180146 00000 n 0001180352 00000 n 0001187162 00000 n 0001187050 00000 n 0001187106 00000 n 0001187520 00000 n 0001191949 00000 n 0001187292 00000 n 0001187498 00000 n 0001192084 00000 n 0001191972 00000 n 0001192028 00000 n 0001192442 00000 n 0001196689 00000 n 0001192214 00000 n 0001192420 00000 n 0001197099 00000 n 0001196712 00000 n 0001196768 00000 n 0001196824 00000 n 0001197466 00000 n 0001202574 00000 n 0001197229 00000 n 0001197435 00000 n 0001202709 00000 n 0001202597 00000 n 0001202653 00000 n 0001203067 00000 n 0001206771 00000 n 0001202839 00000 n 0001203045 00000 n 0001209894 00000 n 0001206794 00000 n 0001206850 00000 n 0001206906 00000 n 0001206962 00000 n 0001207018 00000 n 0001207074 00000 n 0001207130 00000 n 0001207186 00000 n 0001207242 00000 n 0001207507 00000 n 0001207772 00000 n 0001208037 00000 n 0001208302 00000 n 0001208567 00000 n 0001208832 00000 n 0001209097 00000 n 0001209362 00000 n 0001209628 00000 n 0001210358 00000 n 0001215318 00000 n 0001210024 00000 n 0001210246 00000 n 0001215453 00000 n 0001215341 00000 n 0001215397 00000 n 0001215811 00000 n 0001219481 00000 n 0001215583 00000 n 0001215789 00000 n 0001219728 00000 n 0001219504 00000 n 0001219560 00000 n 0001219616 00000 n 0001219672 00000 n 0001220086 00000 n 0001223106 00000 n 0001219858 00000 n 0001220064 00000 n 0001223241 00000 n 0001223129 00000 n 0001223185 00000 n 0001223599 00000 n 0001227042 00000 n 0001223371 00000 n 0001223577 00000 n 0001227625 00000 n 0001227065 00000 n 0001227121 00000 n 0001227177 00000 n 0001227233 00000 n 0001227289 00000 n 0001227345 00000 n 0001227401 00000 n 0001227457 00000 n 0001227513 00000 n 0001227569 00000 n 0001227983 00000 n 0001232250 00000 n 0001227755 00000 n 0001227961 00000 n 0001249343 00000 n 0001232273 00000 n 0001232329 00000 n 0001232385 00000 n 0001232441 00000 n 0001232497 00000 n 0001232761 00000 n 0001233025 00000 n 0001233289 00000 n 0001233553 00000 n 0001233817 00000 n 0001234081 00000 n 0001234345 00000 n 0001234613 00000 n 0001234877 00000 n 0001235142 00000 n 0001235411 00000 n 0001235676 00000 n 0001235941 00000 n 0001236206 00000 n 0001236471 00000 n 0001236748 00000 n 0001237013 00000 n 0001237292 00000 n 0001237557 00000 n 0001237739 00000 n 0001237927 00000 n 0001238204 00000 n 0001238469 00000 n 0001238734 00000 n 0001238999 00000 n 0001239277 00000 n 0001239561 00000 n 0001239846 00000 n 0001240128 00000 n 0001240416 00000 n 0001240592 00000 n 0001240857 00000 n 0001241122 00000 n 0001241387 00000 n 0001241652 00000 n 0001241917 00000 n 0001242182 00000 n 0001242447 00000 n 0001242712 00000 n 0001242977 00000 n 0001243242 00000 n 0001243506 00000 n 0001243771 00000 n 0001244036 00000 n 0001244301 00000 n 0001244567 00000 n 0001244832 00000 n 0001245097 00000 n 0001245355 00000 n 0001245620 00000 n 0001245888 00000 n 0001246172 00000 n 0001246441 00000 n 0001246711 00000 n 0001246893 00000 n 0001247178 00000 n 0001247459 00000 n 0001247724 00000 n 0001248011 00000 n 0001248283 00000 n 0001248548 00000 n 0001248813 00000 n 0001249078 00000 n 0001250293 00000 n 0001257788 00000 n 0001249473 00000 n 0001249695 00000 n 0001258035 00000 n 0001257811 00000 n 0001257867 00000 n 0001257923 00000 n 0001257979 00000 n 0001258409 00000 n 0001263574 00000 n 0001258165 00000 n 0001258387 00000 n 0001263709 00000 n 0001263597 00000 n 0001263653 00000 n 0001264083 00000 n 0001268105 00000 n 0001263839 00000 n 0001264061 00000 n 0001268352 00000 n 0001268128 00000 n 0001268184 00000 n 0001268240 00000 n 0001268296 00000 n 0001268742 00000 n 0001272823 00000 n 0001268482 00000 n 0001268720 00000 n 0001273223 00000 n 0001272846 00000 n 0001272902 00000 n 0001272958 00000 n 0001273622 00000 n 0001278539 00000 n 0001273353 00000 n 0001273591 00000 n 0001280000 00000 n 0001278562 00000 n 0001278618 00000 n 0001278674 00000 n 0001278730 00000 n 0001278786 00000 n 0001278842 00000 n 0001278898 00000 n 0001278954 00000 n 0001279010 00000 n 0001279275 00000 n 0001279550 00000 n 0001279769 00000 n 0001280426 00000 n 0001286761 00000 n 0001280130 00000 n 0001280368 00000 n 0001287008 00000 n 0001286784 00000 n 0001286840 00000 n 0001286896 00000 n 0001286952 00000 n 0001287366 00000 n 0001290443 00000 n 0001287138 00000 n 0001287344 00000 n 0001290690 00000 n 0001290466 00000 n 0001290522 00000 n 0001290578 00000 n 0001290634 00000 n 0001291048 00000 n 0001294351 00000 n 0001290820 00000 n 0001291026 00000 n 0001294598 00000 n 0001294374 00000 n 0001294430 00000 n 0001294486 00000 n 0001294542 00000 n 0001294956 00000 n 0001299520 00000 n 0001294728 00000 n 0001294934 00000 n 0001299655 00000 n 0001299543 00000 n 0001299599 00000 n 0001300013 00000 n 0001303319 00000 n 0001299785 00000 n 0001299991 00000 n 0001303454 00000 n 0001303342 00000 n 0001303398 00000 n 0001303812 00000 n 0001308132 00000 n 0001303584 00000 n 0001303790 00000 n 0001308805 00000 n 0001308155 00000 n 0001308211 00000 n 0001308267 00000 n 0001308528 00000 n 0001309181 00000 n 0001314932 00000 n 0001308935 00000 n 0001309141 00000 n 0001315067 00000 n 0001314955 00000 n 0001315011 00000 n 0001315425 00000 n 0001319190 00000 n 0001315197 00000 n 0001315403 00000 n 0001319604 00000 n 0001319213 00000 n 0001319269 00000 n 0001319325 00000 n 0001319971 00000 n 0001323748 00000 n 0001319734 00000 n 0001319940 00000 n 0001323953 00000 n 0001323771 00000 n 0001324310 00000 n 0001329047 00000 n 0001324083 00000 n 0001324279 00000 n 0001329294 00000 n 0001329070 00000 n 0001329126 00000 n 0001329182 00000 n 0001329238 00000 n 0001329652 00000 n 0001333783 00000 n 0001329424 00000 n 0001329630 00000 n 0001333918 00000 n 0001333806 00000 n 0001333862 00000 n 0001334292 00000 n 0001338249 00000 n 0001334048 00000 n 0001334270 00000 n 0001338384 00000 n 0001338272 00000 n 0001338328 00000 n 0001338774 00000 n 0001345112 00000 n 0001338514 00000 n 0001338752 00000 n 0001345135 00000 n 0001345483 00000 n 0001349336 00000 n 0001345265 00000 n 0001345461 00000 n 0001350745 00000 n 0001349359 00000 n 0001349415 00000 n 0001349471 00000 n 0001349527 00000 n 0001349583 00000 n 0001349639 00000 n 0001349695 00000 n 0001349751 00000 n 0001349807 00000 n 0001349863 00000 n 0001349919 00000 n 0001350206 00000 n 0001350483 00000 n 0001351130 00000 n 0001355976 00000 n 0001350875 00000 n 0001351081 00000 n 0001357003 00000 n 0001355999 00000 n 0001356055 00000 n 0001356111 00000 n 0001356167 00000 n 0001356223 00000 n 0001356279 00000 n 0001356335 00000 n 0001356391 00000 n 0001356447 00000 n 0001356731 00000 n 0001357395 00000 n 0001362071 00000 n 0001357133 00000 n 0001357355 00000 n 0001363079 00000 n 0001362094 00000 n 0001362150 00000 n 0001362206 00000 n 0001362262 00000 n 0001362318 00000 n 0001362374 00000 n 0001362430 00000 n 0001362486 00000 n 0001362542 00000 n 0001362810 00000 n 0001363471 00000 n 0001367807 00000 n 0001363209 00000 n 0001363431 00000 n 0001368545 00000 n 0001367830 00000 n 0001367886 00000 n 0001367942 00000 n 0001367998 00000 n 0001368054 00000 n 0001368110 00000 n 0001368166 00000 n 0001368222 00000 n 0001368278 00000 n 0001368928 00000 n 0001373326 00000 n 0001368675 00000 n 0001368897 00000 n 0001374184 00000 n 0001373349 00000 n 0001373405 00000 n 0001373461 00000 n 0001373517 00000 n 0001373573 00000 n 0001373629 00000 n 0001373685 00000 n 0001373741 00000 n 0001373797 00000 n 0001373853 00000 n 0001373909 00000 n 0001374551 00000 n 0001378758 00000 n 0001374314 00000 n 0001374520 00000 n 0001378781 00000 n 0001379129 00000 n 0001382538 00000 n 0001378911 00000 n 0001379107 00000 n 0001382673 00000 n 0001382561 00000 n 0001382617 00000 n 0001383031 00000 n 0001387249 00000 n 0001382803 00000 n 0001383009 00000 n 0001387782 00000 n 0001387272 00000 n 0001387328 00000 n 0001387384 00000 n 0001387440 00000 n 0001387496 00000 n 0001388165 00000 n 0001393223 00000 n 0001387912 00000 n 0001388134 00000 n 0001393521 00000 n 0001393246 00000 n 0001393894 00000 n 0001398321 00000 n 0001393651 00000 n 0001393863 00000 n 0001398456 00000 n 0001398344 00000 n 0001398400 00000 n 0001398830 00000 n 0001403518 00000 n 0001398586 00000 n 0001398808 00000 n 0001403813 00000 n 0001403541 00000 n 0001404170 00000 n 0001408158 00000 n 0001403943 00000 n 0001404139 00000 n 0001408669 00000 n 0001408181 00000 n 0001408237 00000 n 0001408293 00000 n 0001408349 00000 n 0001408405 00000 n 0001409036 00000 n 0001413587 00000 n 0001408799 00000 n 0001409005 00000 n 0001414146 00000 n 0001413610 00000 n 0001413871 00000 n 0001414512 00000 n 0001418669 00000 n 0001414276 00000 n 0001414472 00000 n 0001418916 00000 n 0001418692 00000 n 0001418748 00000 n 0001418804 00000 n 0001418860 00000 n 0001419290 00000 n 0001423008 00000 n 0001419046 00000 n 0001419268 00000 n 0001423255 00000 n 0001423031 00000 n 0001423087 00000 n 0001423143 00000 n 0001423199 00000 n 0001423613 00000 n 0001428364 00000 n 0001423385 00000 n 0001423591 00000 n 0001428387 00000 n 0001428735 00000 n 0001435742 00000 n 0001428517 00000 n 0001428713 00000 n 0001436266 00000 n 0001435765 00000 n 0001435821 00000 n 0001435877 00000 n 0001435933 00000 n 0001435989 00000 n 0001436633 00000 n 0001442437 00000 n 0001436396 00000 n 0001436602 00000 n 0001442720 00000 n 0001442460 00000 n 0001443077 00000 n 0001446632 00000 n 0001442850 00000 n 0001443046 00000 n 0001446655 00000 n 0001447003 00000 n 0001450328 00000 n 0001446785 00000 n 0001446981 00000 n 0001450983 00000 n 0001450351 00000 n 0001450407 00000 n 0001450463 00000 n 0001450723 00000 n 0001451359 00000 n 0001457563 00000 n 0001451113 00000 n 0001451319 00000 n 0001457810 00000 n 0001457586 00000 n 0001457642 00000 n 0001457698 00000 n 0001457754 00000 n 0001458168 00000 n 0001463175 00000 n 0001457940 00000 n 0001458146 00000 n 0001467842 00000 n 0001463198 00000 n 0001463254 00000 n 0001463310 00000 n 0001463366 00000 n 0001463422 00000 n 0001463478 00000 n 0001463534 00000 n 0001463590 00000 n 0001463646 00000 n 0001463921 00000 n 0001464190 00000 n 0001464459 00000 n 0001464728 00000 n 0001465005 00000 n 0001465274 00000 n 0001465445 00000 n 0001465714 00000 n 0001465989 00000 n 0001466263 00000 n 0001466540 00000 n 0001466819 00000 n 0001467095 00000 n 0001467382 00000 n 0001467664 00000 n 0001468344 00000 n 0001474637 00000 n 0001467972 00000 n 0001468178 00000 n 0001474772 00000 n 0001474660 00000 n 0001474716 00000 n 0001475130 00000 n 0001478158 00000 n 0001474902 00000 n 0001475108 00000 n 0001478405 00000 n 0001478181 00000 n 0001478237 00000 n 0001478293 00000 n 0001478349 00000 n 0001478763 00000 n 0001482516 00000 n 0001478535 00000 n 0001478741 00000 n 0001482826 00000 n 0001482539 00000 n 0001482595 00000 n 0001482651 00000 n 0001483193 00000 n 0001486828 00000 n 0001482956 00000 n 0001483162 00000 n 0001487075 00000 n 0001486851 00000 n 0001486907 00000 n 0001486963 00000 n 0001487019 00000 n 0001487433 00000 n 0001492082 00000 n 0001487205 00000 n 0001487411 00000 n 0001492217 00000 n 0001492105 00000 n 0001492161 00000 n 0001492575 00000 n 0001496692 00000 n 0001492347 00000 n 0001492553 00000 n 0001497090 00000 n 0001496715 00000 n 0001496771 00000 n 0001496827 00000 n 0001497457 00000 n 0001501615 00000 n 0001497220 00000 n 0001497426 00000 n 0001502877 00000 n 0001501638 00000 n 0001501694 00000 n 0001501750 00000 n 0001501806 00000 n 0001501862 00000 n 0001502044 00000 n 0001502319 00000 n 0001502602 00000 n 0001503287 00000 n 0001507909 00000 n 0001503007 00000 n 0001503229 00000 n 0001508044 00000 n 0001507932 00000 n 0001507988 00000 n 0001508402 00000 n 0001512242 00000 n 0001508174 00000 n 0001508380 00000 n 0001512916 00000 n 0001512265 00000 n 0001512321 00000 n 0001512377 00000 n 0001512643 00000 n 0001513292 00000 n 0001517605 00000 n 0001513046 00000 n 0001513252 00000 n 0001519020 00000 n 0001517628 00000 n 0001517684 00000 n 0001517740 00000 n 0001517796 00000 n 0001517852 00000 n 0001517908 00000 n 0001517964 00000 n 0001518228 00000 n 0001518492 00000 n 0001518756 00000 n 0001519414 00000 n 0001524645 00000 n 0001519150 00000 n 0001519356 00000 n 0001524892 00000 n 0001524668 00000 n 0001524724 00000 n 0001524780 00000 n 0001524836 00000 n 0001525250 00000 n 0001528278 00000 n 0001525022 00000 n 0001525228 00000 n 0001530991 00000 n 0001528301 00000 n 0001528357 00000 n 0001528413 00000 n 0001528469 00000 n 0001528525 00000 n 0001528581 00000 n 0001528637 00000 n 0001528900 00000 n 0001529156 00000 n 0001529419 00000 n 0001529682 00000 n 0001529945 00000 n 0001530201 00000 n 0001530464 00000 n 0001530727 00000 n 0001531430 00000 n 0001535694 00000 n 0001531121 00000 n 0001531327 00000 n 0001535829 00000 n 0001535717 00000 n 0001535773 00000 n 0001536203 00000 n 0001541128 00000 n 0001535959 00000 n 0001536181 00000 n 0001541375 00000 n 0001541151 00000 n 0001541207 00000 n 0001541263 00000 n 0001541319 00000 n 0001541749 00000 n 0001546766 00000 n 0001541505 00000 n 0001541727 00000 n 0001547439 00000 n 0001546789 00000 n 0001546845 00000 n 0001546901 00000 n 0001547174 00000 n 0001547815 00000 n 0001553231 00000 n 0001547569 00000 n 0001547775 00000 n 0001553254 00000 n 0001553602 00000 n 0001558096 00000 n 0001553384 00000 n 0001553580 00000 n 0001558427 00000 n 0001558119 00000 n 0001558175 00000 n 0001558231 00000 n 0001558810 00000 n 0001563430 00000 n 0001558557 00000 n 0001558779 00000 n 0001563453 00000 n 0001563801 00000 n 0001567258 00000 n 0001563583 00000 n 0001563779 00000 n 0001567393 00000 n 0001567281 00000 n 0001567337 00000 n 0001567751 00000 n 0001571877 00000 n 0001567523 00000 n 0001567729 00000 n 0001572124 00000 n 0001571900 00000 n 0001571956 00000 n 0001572012 00000 n 0001572068 00000 n 0001572482 00000 n 0001577787 00000 n 0001572254 00000 n 0001572460 00000 n 0001582663 00000 n 0001577810 00000 n 0001577866 00000 n 0001577922 00000 n 0001577978 00000 n 0001578034 00000 n 0001578090 00000 n 0001578146 00000 n 0001578410 00000 n 0001578682 00000 n 0001578946 00000 n 0001579210 00000 n 0001579487 00000 n 0001579751 00000 n 0001580015 00000 n 0001580279 00000 n 0001580543 00000 n 0001580808 00000 n 0001581073 00000 n 0001581338 00000 n 0001581603 00000 n 0001581868 00000 n 0001582133 00000 n 0001582398 00000 n 0001583174 00000 n 0001589089 00000 n 0001582793 00000 n 0001582999 00000 n 0001589498 00000 n 0001589112 00000 n 0001589168 00000 n 0001589224 00000 n 0001589881 00000 n 0001593311 00000 n 0001589628 00000 n 0001589850 00000 n 0001594060 00000 n 0001593334 00000 n 0001593390 00000 n 0001593446 00000 n 0001593502 00000 n 0001593558 00000 n 0001593614 00000 n 0001593670 00000 n 0001593726 00000 n 0001593782 00000 n 0001594427 00000 n 0001599270 00000 n 0001594190 00000 n 0001594396 00000 n 0001599853 00000 n 0001599293 00000 n 0001599349 00000 n 0001599405 00000 n 0001599461 00000 n 0001599517 00000 n 0001599573 00000 n 0001599629 00000 n 0001599685 00000 n 0001599741 00000 n 0001599797 00000 n 0001600227 00000 n 0001607996 00000 n 0001599983 00000 n 0001600205 00000 n 0001608243 00000 n 0001608019 00000 n 0001608075 00000 n 0001608131 00000 n 0001608187 00000 n 0001608601 00000 n 0001616312 00000 n 0001608373 00000 n 0001608579 00000 n 0001618647 00000 n 0001616335 00000 n 0001616391 00000 n 0001616447 00000 n 0001616503 00000 n 0001616559 00000 n 0001616615 00000 n 0001616671 00000 n 0001616727 00000 n 0001616783 00000 n 0001617055 00000 n 0001617318 00000 n 0001617581 00000 n 0001617858 00000 n 0001618121 00000 n 0001618384 00000 n 0001619068 00000 n 0001627490 00000 n 0001618777 00000 n 0001618983 00000 n 0001627737 00000 n 0001627513 00000 n 0001627569 00000 n 0001627625 00000 n 0001627681 00000 n 0001628095 00000 n 0001633204 00000 n 0001627867 00000 n 0001628073 00000 n 0001633732 00000 n 0001633227 00000 n 0001633283 00000 n 0001633339 00000 n 0001633395 00000 n 0001633451 00000 n 0001634099 00000 n 0001641878 00000 n 0001633862 00000 n 0001634068 00000 n 0001647302 00000 n 0001641901 00000 n 0001641957 00000 n 0001642013 00000 n 0001642069 00000 n 0001642125 00000 n 0001642181 00000 n 0001642237 00000 n 0001642293 00000 n 0001642349 00000 n 0001642405 00000 n 0001642461 00000 n 0001642517 00000 n 0001642573 00000 n 0001642839 00000 n 0001643101 00000 n 0001643363 00000 n 0001643625 00000 n 0001643887 00000 n 0001644149 00000 n 0001644411 00000 n 0001644673 00000 n 0001644935 00000 n 0001645198 00000 n 0001645461 00000 n 0001645724 00000 n 0001645987 00000 n 0001646250 00000 n 0001646513 00000 n 0001646776 00000 n 0001647039 00000 n 0001647822 00000 n 0001653520 00000 n 0001647432 00000 n 0001647638 00000 n 0001653991 00000 n 0001653543 00000 n 0001653599 00000 n 0001653655 00000 n 0001653711 00000 n 0001653767 00000 n 0001653823 00000 n 0001653879 00000 n 0001653935 00000 n 0001654349 00000 n 0001658878 00000 n 0001654121 00000 n 0001654327 00000 n 0001659125 00000 n 0001658901 00000 n 0001658957 00000 n 0001659013 00000 n 0001659069 00000 n 0001659467 00000 n 0001665845 00000 n 0001659255 00000 n 0001659445 00000 n 0001666739 00000 n 0001665868 00000 n 0001665924 00000 n 0001665980 00000 n 0001666036 00000 n 0001666092 00000 n 0001666148 00000 n 0001666204 00000 n 0001666260 00000 n 0001666316 00000 n 0001666372 00000 n 0001666428 00000 n 0001666484 00000 n 0001666540 00000 n 0001667090 00000 n 0001674655 00000 n 0001666869 00000 n 0001667059 00000 n 0001687447 00000 n 0001674678 00000 n 0001674734 00000 n 0001674790 00000 n 0001674846 00000 n 0001674902 00000 n 0001674958 00000 n 0001675014 00000 n 0001675070 00000 n 0001675126 00000 n 0001675391 00000 n 0001675656 00000 n 0001675921 00000 n 0001676186 00000 n 0001676451 00000 n 0001676716 00000 n 0001676981 00000 n 0001677246 00000 n 0001677512 00000 n 0001677778 00000 n 0001678044 00000 n 0001678303 00000 n 0001678569 00000 n 0001678835 00000 n 0001679101 00000 n 0001679360 00000 n 0001679626 00000 n 0001679892 00000 n 0001680151 00000 n 0001680417 00000 n 0001680683 00000 n 0001680949 00000 n 0001681215 00000 n 0001681481 00000 n 0001681747 00000 n 0001682013 00000 n 0001682279 00000 n 0001682545 00000 n 0001682811 00000 n 0001683077 00000 n 0001683343 00000 n 0001683609 00000 n 0001683875 00000 n 0001684141 00000 n 0001684407 00000 n 0001684673 00000 n 0001684939 00000 n 0001685205 00000 n 0001685471 00000 n 0001685737 00000 n 0001686003 00000 n 0001686269 00000 n 0001686535 00000 n 0001686801 00000 n 0001687067 00000 n 0001687255 00000 n 0001688212 00000 n 0001694987 00000 n 0001687577 00000 n 0001687767 00000 n 0001697355 00000 n 0001695010 00000 n 0001695066 00000 n 0001695122 00000 n 0001695178 00000 n 0001695234 00000 n 0001695500 00000 n 0001695766 00000 n 0001696032 00000 n 0001696298 00000 n 0001696564 00000 n 0001696830 00000 n 0001697096 00000 n 0001697785 00000 n 0001703924 00000 n 0001697485 00000 n 0001697691 00000 n 0001703947 00000 n 0001704305 00000 n 0001708283 00000 n 0001704077 00000 n 0001704283 00000 n 0001709416 00000 n 0001708306 00000 n 0001708362 00000 n 0001708418 00000 n 0001708474 00000 n 0001708530 00000 n 0001708586 00000 n 0001708642 00000 n 0001708900 00000 n 0001709156 00000 n 0001709801 00000 n 0001715274 00000 n 0001709546 00000 n 0001709752 00000 n 0001715633 00000 n 0001715297 00000 n 0001715353 00000 n 0001715409 00000 n 0001715465 00000 n 0001715521 00000 n 0001715577 00000 n 0001715991 00000 n 0001720486 00000 n 0001715763 00000 n 0001715969 00000 n 0001721181 00000 n 0001720509 00000 n 0001720565 00000 n 0001720621 00000 n 0001720677 00000 n 0001720733 00000 n 0001720789 00000 n 0001720845 00000 n 0001720901 00000 n 0001720957 00000 n 0001721013 00000 n 0001721069 00000 n 0001721125 00000 n 0001721539 00000 n 0001727031 00000 n 0001721311 00000 n 0001721517 00000 n 0001727166 00000 n 0001727054 00000 n 0001727110 00000 n 0001727524 00000 n 0001732035 00000 n 0001727296 00000 n 0001727502 00000 n 0001732282 00000 n 0001732058 00000 n 0001732114 00000 n 0001732170 00000 n 0001732226 00000 n 0001732640 00000 n 0001736271 00000 n 0001732412 00000 n 0001732618 00000 n 0001736406 00000 n 0001736294 00000 n 0001736350 00000 n 0001736764 00000 n 0001740799 00000 n 0001736536 00000 n 0001736742 00000 n 0001740822 00000 n 0001741170 00000 n 0001743571 00000 n 0001740952 00000 n 0001741148 00000 n 0001744867 00000 n 0001743594 00000 n 0001743650 00000 n 0001743706 00000 n 0001743762 00000 n 0001743818 00000 n 0001743874 00000 n 0001743930 00000 n 0001743986 00000 n 0001744042 00000 n 0001744098 00000 n 0001744154 00000 n 0001744210 00000 n 0001744266 00000 n 0001744322 00000 n 0001744378 00000 n 0001744434 00000 n 0001744490 00000 n 0001744546 00000 n 0001744602 00000 n 0001745234 00000 n 0001750482 00000 n 0001744997 00000 n 0001745203 00000 n 0001750729 00000 n 0001750505 00000 n 0001750561 00000 n 0001750617 00000 n 0001750673 00000 n 0001751087 00000 n 0001755976 00000 n 0001750859 00000 n 0001751065 00000 n 0001755999 00000 n 0001756347 00000 n 0001758374 00000 n 0001756129 00000 n 0001756325 00000 n 0001758509 00000 n 0001758397 00000 n 0001758453 00000 n 0001758867 00000 n 0001761669 00000 n 0001758639 00000 n 0001758845 00000 n 0001761692 00000 n 0001762040 00000 n 0001764923 00000 n 0001761822 00000 n 0001762018 00000 n 0001766137 00000 n 0001764946 00000 n 0001765002 00000 n 0001765058 00000 n 0001765114 00000 n 0001765170 00000 n 0001765226 00000 n 0001765282 00000 n 0001765338 00000 n 0001765394 00000 n 0001765450 00000 n 0001765506 00000 n 0001765562 00000 n 0001765618 00000 n 0001765877 00000 n 0001766513 00000 n 0001771555 00000 n 0001766267 00000 n 0001766473 00000 n 0001772557 00000 n 0001771578 00000 n 0001771634 00000 n 0001771690 00000 n 0001771746 00000 n 0001771802 00000 n 0001771858 00000 n 0001771914 00000 n 0001771970 00000 n 0001772026 00000 n 0001772291 00000 n 0001772933 00000 n 0001778436 00000 n 0001772687 00000 n 0001772893 00000 n 0001778907 00000 n 0001778459 00000 n 0001778515 00000 n 0001778571 00000 n 0001778627 00000 n 0001778683 00000 n 0001778739 00000 n 0001778795 00000 n 0001778851 00000 n 0001779265 00000 n 0001784209 00000 n 0001779037 00000 n 0001779243 00000 n 0001785128 00000 n 0001784232 00000 n 0001784288 00000 n 0001784344 00000 n 0001784400 00000 n 0001784456 00000 n 0001784512 00000 n 0001784568 00000 n 0001784624 00000 n 0001784680 00000 n 0001784736 00000 n 0001784792 00000 n 0001784848 00000 n 0001784904 00000 n 0001784960 00000 n 0001785016 00000 n 0001785072 00000 n 0001785486 00000 n 0001790007 00000 n 0001785258 00000 n 0001785464 00000 n 0001793162 00000 n 0001790030 00000 n 0001790086 00000 n 0001790142 00000 n 0001790198 00000 n 0001790254 00000 n 0001790310 00000 n 0001790366 00000 n 0001790422 00000 n 0001790478 00000 n 0001790534 00000 n 0001790590 00000 n 0001790858 00000 n 0001791126 00000 n 0001791400 00000 n 0001791674 00000 n 0001791947 00000 n 0001792221 00000 n 0001792484 00000 n 0001792740 00000 n 0001792946 00000 n 0001793610 00000 n 0001800099 00000 n 0001793292 00000 n 0001793498 00000 n 0001800747 00000 n 0001800122 00000 n 0001800178 00000 n 0001800234 00000 n 0001800508 00000 n 0001801139 00000 n 0001805260 00000 n 0001800877 00000 n 0001801099 00000 n 0001805503 00000 n 0001805283 00000 n 0001805876 00000 n 0001809490 00000 n 0001805633 00000 n 0001805845 00000 n 0001809723 00000 n 0001809513 00000 n 0001810080 00000 n 0001813733 00000 n 0001809853 00000 n 0001810049 00000 n 0001822130 00000 n 0001813756 00000 n 0001821721 00000 n 0001821744 00000 n 0001821800 00000 n 0001821856 00000 n 0001822514 00000 n 0001825425 00000 n 0001822260 00000 n 0001822483 00000 n 0001825448 00000 n 0001825796 00000 n 0001828985 00000 n 0001825578 00000 n 0001825774 00000 n 0001829008 00000 n 0001829356 00000 n 0001832713 00000 n 0001829138 00000 n 0001829334 00000 n 0001832736 00000 n 0001833084 00000 n 0001836398 00000 n 0001832866 00000 n 0001833062 00000 n 0001858655 00000 n 0001836421 00000 n 0001851157 00000 n 0001851181 00000 n 0001851237 00000 n 0001851293 00000 n 0001851349 00000 n 0001851405 00000 n 0001851461 00000 n 0001851517 00000 n 0001851788 00000 n 0001851972 00000 n 0001852242 00000 n 0001852517 00000 n 0001852789 00000 n 0001853054 00000 n 0001853332 00000 n 0001853512 00000 n 0001853785 00000 n 0001854054 00000 n 0001854238 00000 n 0001854413 00000 n 0001854595 00000 n 0001854882 00000 n 0001855143 00000 n 0001855419 00000 n 0001855702 00000 n 0001855977 00000 n 0001856252 00000 n 0001856527 00000 n 0001856707 00000 n 0001856991 00000 n 0001857266 00000 n 0001857540 00000 n 0001857822 00000 n 0001858096 00000 n 0001858376 00000 n 0001859282 00000 n 0001864942 00000 n 0001858785 00000 n 0001859008 00000 n 0001867225 00000 n 0001864965 00000 n 0001865021 00000 n 0001865077 00000 n 0001865133 00000 n 0001865189 00000 n 0001865245 00000 n 0001865301 00000 n 0001865357 00000 n 0001865413 00000 n 0001865669 00000 n 0001865936 00000 n 0001866205 00000 n 0001866430 00000 n 0001866630 00000 n 0001866824 00000 n 0001867012 00000 n 0001867655 00000 n 0001876681 00000 n 0001867355 00000 n 0001867561 00000 n 0001877537 00000 n 0001876704 00000 n 0001876988 00000 n 0001877263 00000 n 0001877912 00000 n 0001882399 00000 n 0001877667 00000 n 0001877863 00000 n 0001883254 00000 n 0001882422 00000 n 0001882704 00000 n 0001882980 00000 n 0001883629 00000 n 0001888931 00000 n 0001883384 00000 n 0001883580 00000 n 0001889820 00000 n 0001888954 00000 n 0001889010 00000 n 0001889066 00000 n 0001889122 00000 n 0001889178 00000 n 0001889453 00000 n 0001889637 00000 n 0001890221 00000 n 0001896569 00000 n 0001889950 00000 n 0001890172 00000 n 0001897308 00000 n 0001896592 00000 n 0001896648 00000 n 0001896704 00000 n 0001896760 00000 n 0001896816 00000 n 0001897083 00000 n 0001897684 00000 n 0001903479 00000 n 0001897438 00000 n 0001897644 00000 n 0001903839 00000 n 0001903502 00000 n 0001903558 00000 n 0001903614 00000 n 0001904206 00000 n 0001908918 00000 n 0001903969 00000 n 0001904175 00000 n 0001909725 00000 n 0001908941 00000 n 0001908997 00000 n 0001909053 00000 n 0001909109 00000 n 0001909165 00000 n 0001909450 00000 n 0001910101 00000 n 0001916253 00000 n 0001909855 00000 n 0001910061 00000 n 0001916276 00000 n 0001916624 00000 n 0001919546 00000 n 0001916406 00000 n 0001916602 00000 n 0001919956 00000 n 0001919569 00000 n 0001919625 00000 n 0001919681 00000 n 0001920323 00000 n 0001924713 00000 n 0001920086 00000 n 0001920292 00000 n 0001924960 00000 n 0001924736 00000 n 0001924792 00000 n 0001924848 00000 n 0001924904 00000 n 0001925318 00000 n 0001930132 00000 n 0001925090 00000 n 0001925296 00000 n 0001930155 00000 n 0001930503 00000 n 0001934952 00000 n 0001930285 00000 n 0001930481 00000 n 0001935465 00000 n 0001934975 00000 n 0001935031 00000 n 0001935087 00000 n 0001935143 00000 n 0001935199 00000 n 0001935832 00000 n 0001939557 00000 n 0001935595 00000 n 0001935801 00000 n 0001939692 00000 n 0001939580 00000 n 0001939636 00000 n 0001940050 00000 n 0001943451 00000 n 0001939822 00000 n 0001940028 00000 n 0001943474 00000 n 0001943822 00000 n 0001948286 00000 n 0001943604 00000 n 0001943800 00000 n 0001949066 00000 n 0001948309 00000 n 0001948365 00000 n 0001948421 00000 n 0001948477 00000 n 0001948533 00000 n 0001948807 00000 n 0001949442 00000 n 0001954927 00000 n 0001949196 00000 n 0001949402 00000 n 0001955456 00000 n 0001954950 00000 n 0001955006 00000 n 0001955062 00000 n 0001955118 00000 n 0001955174 00000 n 0001955823 00000 n 0001960801 00000 n 0001955586 00000 n 0001955792 00000 n 0001961218 00000 n 0001960824 00000 n 0001960880 00000 n 0001960936 00000 n 0001961585 00000 n 0001965316 00000 n 0001961348 00000 n 0001961554 00000 n 0001966002 00000 n 0001965339 00000 n 0001965395 00000 n 0001965451 00000 n 0001965729 00000 n 0001966378 00000 n 0001971068 00000 n 0001966132 00000 n 0001966338 00000 n 0001971091 00000 n 0001971439 00000 n 0001975242 00000 n 0001971221 00000 n 0001971417 00000 n 0001975265 00000 n 0001975613 00000 n 0001981258 00000 n 0001975395 00000 n 0001975591 00000 n 0001981672 00000 n 0001981281 00000 n 0001981337 00000 n 0001981393 00000 n 0001982039 00000 n 0001986288 00000 n 0001981802 00000 n 0001982008 00000 n 0001986698 00000 n 0001986311 00000 n 0001986367 00000 n 0001986423 00000 n 0001987065 00000 n 0001992286 00000 n 0001986828 00000 n 0001987034 00000 n 0001992809 00000 n 0001992309 00000 n 0001992365 00000 n 0001992421 00000 n 0001992477 00000 n 0001992533 00000 n 0001993176 00000 n 0001996923 00000 n 0001992939 00000 n 0001993145 00000 n 0002002559 00000 n 0001996946 00000 n 0001997002 00000 n 0001997058 00000 n 0001997114 00000 n 0001997170 00000 n 0001997226 00000 n 0001997282 00000 n 0001997545 00000 n 0001997808 00000 n 0001998071 00000 n 0001998334 00000 n 0001998597 00000 n 0001998860 00000 n 0001999123 00000 n 0001999386 00000 n 0001999650 00000 n 0001999914 00000 n 0002000178 00000 n 0002000442 00000 n 0002000706 00000 n 0002000970 00000 n 0002001234 00000 n 0002001498 00000 n 0002001768 00000 n 0002002032 00000 n 0002002296 00000 n 0002003113 00000 n 0002008839 00000 n 0002002689 00000 n 0002002911 00000 n 0002009913 00000 n 0002008862 00000 n 0002008918 00000 n 0002008974 00000 n 0002009030 00000 n 0002009086 00000 n 0002009142 00000 n 0002009198 00000 n 0002009254 00000 n 0002009310 00000 n 0002009366 00000 n 0002009422 00000 n 0002009478 00000 n 0002009534 00000 n 0002009590 00000 n 0002009646 00000 n 0002010296 00000 n 0002015220 00000 n 0002010043 00000 n 0002010265 00000 n 0002016174 00000 n 0002015243 00000 n 0002015299 00000 n 0002015355 00000 n 0002015411 00000 n 0002015467 00000 n 0002015523 00000 n 0002015579 00000 n 0002015635 00000 n 0002015691 00000 n 0002015966 00000 n 0002016582 00000 n 0002023196 00000 n 0002016304 00000 n 0002016542 00000 n 0002023667 00000 n 0002023219 00000 n 0002023275 00000 n 0002023331 00000 n 0002023387 00000 n 0002023443 00000 n 0002023499 00000 n 0002023555 00000 n 0002023611 00000 n 0002024041 00000 n 0002030681 00000 n 0002023797 00000 n 0002024019 00000 n 0002034967 00000 n 0002030704 00000 n 0002030760 00000 n 0002030816 00000 n 0002030872 00000 n 0002030928 00000 n 0002030984 00000 n 0002031040 00000 n 0002031096 00000 n 0002031152 00000 n 0002031427 00000 n 0002031687 00000 n 0002031960 00000 n 0002032226 00000 n 0002032503 00000 n 0002032765 00000 n 0002033042 00000 n 0002033314 00000 n 0002033598 00000 n 0002033885 00000 n 0002034157 00000 n 0002034434 00000 n 0002034705 00000 n 0002035467 00000 n 0002043722 00000 n 0002035097 00000 n 0002035319 00000 n 0002047782 00000 n 0002043745 00000 n 0002043801 00000 n 0002043857 00000 n 0002043913 00000 n 0002043969 00000 n 0002044025 00000 n 0002044081 00000 n 0002044137 00000 n 0002044193 00000 n 0002044454 00000 n 0002044718 00000 n 0002044981 00000 n 0002045249 00000 n 0002045509 00000 n 0002045785 00000 n 0002046059 00000 n 0002046323 00000 n 0002046593 00000 n 0002046863 00000 n 0002047121 00000 n 0002047377 00000 n 0002047569 00000 n 0002048282 00000 n 0002055355 00000 n 0002047912 00000 n 0002048134 00000 n 0002057357 00000 n 0002055378 00000 n 0002055434 00000 n 0002055490 00000 n 0002055546 00000 n 0002055602 00000 n 0002055658 00000 n 0002055714 00000 n 0002055770 00000 n 0002055826 00000 n 0002055882 00000 n 0002055938 00000 n 0002055994 00000 n 0002056050 00000 n 0002056302 00000 n 0002056577 00000 n 0002056837 00000 n 0002057097 00000 n 0002057760 00000 n 0002063891 00000 n 0002057487 00000 n 0002057693 00000 n 0002065510 00000 n 0002063914 00000 n 0002064192 00000 n 0002064459 00000 n 0002064716 00000 n 0002064974 00000 n 0002065242 00000 n 0002065912 00000 n 0002070453 00000 n 0002065640 00000 n 0002065836 00000 n 0002071404 00000 n 0002070476 00000 n 0002070532 00000 n 0002070588 00000 n 0002070857 00000 n 0002071130 00000 n 0002071789 00000 n 0002076381 00000 n 0002071534 00000 n 0002071740 00000 n 0002078548 00000 n 0002076404 00000 n 0002076460 00000 n 0002076516 00000 n 0002076572 00000 n 0002076628 00000 n 0002076684 00000 n 0002076740 00000 n 0002076796 00000 n 0002076852 00000 n 0002076908 00000 n 0002076964 00000 n 0002077221 00000 n 0002077485 00000 n 0002077747 00000 n 0002078013 00000 n 0002078281 00000 n 0002078976 00000 n 0002084510 00000 n 0002078678 00000 n 0002078900 00000 n 0002088562 00000 n 0002084533 00000 n 0002084589 00000 n 0002084645 00000 n 0002084701 00000 n 0002084757 00000 n 0002084813 00000 n 0002084869 00000 n 0002084925 00000 n 0002084981 00000 n 0002085037 00000 n 0002085093 00000 n 0002085149 00000 n 0002085205 00000 n 0002085482 00000 n 0002085757 00000 n 0002086020 00000 n 0002086283 00000 n 0002086550 00000 n 0002086816 00000 n 0002087071 00000 n 0002087336 00000 n 0002087598 00000 n 0002087858 00000 n 0002088122 00000 n 0002088342 00000 n 0002089053 00000 n 0002097985 00000 n 0002088692 00000 n 0002088914 00000 n 0002105132 00000 n 0002098008 00000 n 0002098064 00000 n 0002098120 00000 n 0002098176 00000 n 0002098232 00000 n 0002098288 00000 n 0002098344 00000 n 0002098611 00000 n 0002098873 00000 n 0002099140 00000 n 0002099412 00000 n 0002099676 00000 n 0002099947 00000 n 0002100227 00000 n 0002100497 00000 n 0002100770 00000 n 0002101044 00000 n 0002101320 00000 n 0002101592 00000 n 0002101865 00000 n 0002102143 00000 n 0002102421 00000 n 0002102692 00000 n 0002102969 00000 n 0002103232 00000 n 0002103495 00000 n 0002103776 00000 n 0002103957 00000 n 0002104147 00000 n 0002104340 00000 n 0002104529 00000 n 0002104728 00000 n 0002104943 00000 n 0002105733 00000 n 0002111930 00000 n 0002105262 00000 n 0002105468 00000 n 0002112788 00000 n 0002111953 00000 n 0002112009 00000 n 0002112065 00000 n 0002112121 00000 n 0002112177 00000 n 0002112233 00000 n 0002112289 00000 n 0002112345 00000 n 0002112401 00000 n 0002112457 00000 n 0002112513 00000 n 0002113155 00000 n 0002120141 00000 n 0002112918 00000 n 0002113124 00000 n 0002120821 00000 n 0002120164 00000 n 0002120220 00000 n 0002120276 00000 n 0002120332 00000 n 0002120388 00000 n 0002120444 00000 n 0002120500 00000 n 0002120556 00000 n 0002120612 00000 n 0002121188 00000 n 0002126835 00000 n 0002120951 00000 n 0002121157 00000 n 0002127394 00000 n 0002126858 00000 n 0002126914 00000 n 0002126970 00000 n 0002127026 00000 n 0002127082 00000 n 0002127138 00000 n 0002127194 00000 n 0002127761 00000 n 0002132852 00000 n 0002127524 00000 n 0002127730 00000 n 0002133763 00000 n 0002132875 00000 n 0002132931 00000 n 0002132987 00000 n 0002133043 00000 n 0002133099 00000 n 0002133155 00000 n 0002133211 00000 n 0002133489 00000 n 0002134139 00000 n 0002138288 00000 n 0002133893 00000 n 0002134099 00000 n 0002139748 00000 n 0002138311 00000 n 0002138367 00000 n 0002138423 00000 n 0002138479 00000 n 0002138535 00000 n 0002138591 00000 n 0002138647 00000 n 0002138919 00000 n 0002139197 00000 n 0002139475 00000 n 0002140142 00000 n 0002145375 00000 n 0002139878 00000 n 0002140084 00000 n 0002146055 00000 n 0002145398 00000 n 0002145454 00000 n 0002145510 00000 n 0002145788 00000 n 0002146431 00000 n 0002150820 00000 n 0002146185 00000 n 0002146391 00000 n 0002151222 00000 n 0002150843 00000 n 0002150899 00000 n 0002150955 00000 n 0002151589 00000 n 0002155663 00000 n 0002151352 00000 n 0002151558 00000 n 0002156134 00000 n 0002155686 00000 n 0002155742 00000 n 0002155798 00000 n 0002155854 00000 n 0002155910 00000 n 0002156501 00000 n 0002162023 00000 n 0002156264 00000 n 0002156470 00000 n 0002162158 00000 n 0002162046 00000 n 0002162102 00000 n 0002162516 00000 n 0002165922 00000 n 0002162288 00000 n 0002162494 00000 n 0002167229 00000 n 0002165945 00000 n 0002166001 00000 n 0002166057 00000 n 0002166113 00000 n 0002166169 00000 n 0002166429 00000 n 0002166707 00000 n 0002166968 00000 n 0002167623 00000 n 0002174558 00000 n 0002167359 00000 n 0002167565 00000 n 0002180343 00000 n 0002174581 00000 n 0002174637 00000 n 0002174693 00000 n 0002174749 00000 n 0002174805 00000 n 0002174861 00000 n 0002174917 00000 n 0002174973 00000 n 0002175029 00000 n 0002175085 00000 n 0002175141 00000 n 0002175402 00000 n 0002175663 00000 n 0002175924 00000 n 0002176185 00000 n 0002176446 00000 n 0002176707 00000 n 0002176968 00000 n 0002177230 00000 n 0002177492 00000 n 0002177754 00000 n 0002178016 00000 n 0002178278 00000 n 0002178540 00000 n 0002178802 00000 n 0002179064 00000 n 0002179326 00000 n 0002179588 00000 n 0002179850 00000 n 0002180112 00000 n 0002180881 00000 n 0002187084 00000 n 0002180473 00000 n 0002180679 00000 n 0002187555 00000 n 0002187107 00000 n 0002187163 00000 n 0002187219 00000 n 0002187275 00000 n 0002187331 00000 n 0002187387 00000 n 0002187443 00000 n 0002187499 00000 n 0002187929 00000 n 0002194855 00000 n 0002187685 00000 n 0002187907 00000 n 0002195993 00000 n 0002194878 00000 n 0002194934 00000 n 0002194990 00000 n 0002195046 00000 n 0002195102 00000 n 0002195158 00000 n 0002195214 00000 n 0002195270 00000 n 0002195326 00000 n 0002195382 00000 n 0002195438 00000 n 0002195712 00000 n 0002196401 00000 n 0002203266 00000 n 0002196123 00000 n 0002196361 00000 n 0002204610 00000 n 0002203289 00000 n 0002203345 00000 n 0002203401 00000 n 0002203457 00000 n 0002203513 00000 n 0002203569 00000 n 0002203625 00000 n 0002203681 00000 n 0002203737 00000 n 0002203793 00000 n 0002203849 00000 n 0002204124 00000 n 0002204360 00000 n 0002205027 00000 n 0002211914 00000 n 0002204740 00000 n 0002204978 00000 n 0002211937 00000 n 0002212301 00000 n 0002215266 00000 n 0002212067 00000 n 0002212279 00000 n 0002215513 00000 n 0002215289 00000 n 0002215345 00000 n 0002215401 00000 n 0002215457 00000 n 0002215903 00000 n 0002222054 00000 n 0002215643 00000 n 0002215881 00000 n 0002223539 00000 n 0002222077 00000 n 0002222133 00000 n 0002222189 00000 n 0002222454 00000 n 0002222724 00000 n 0002222993 00000 n 0002223261 00000 n 0002223974 00000 n 0002229769 00000 n 0002223669 00000 n 0002223907 00000 n 0002252688 00000 n 0002229792 00000 n 0002230066 00000 n 0002230335 00000 n 0002230616 00000 n 0002230897 00000 n 0002231170 00000 n 0002231440 00000 n 0002231702 00000 n 0002231969 00000 n 0002232249 00000 n 0002232515 00000 n 0002232788 00000 n 0002233054 00000 n 0002233323 00000 n 0002233595 00000 n 0002233866 00000 n 0002234135 00000 n 0002234408 00000 n 0002234677 00000 n 0002234942 00000 n 0002235209 00000 n 0002235473 00000 n 0002235741 00000 n 0002236018 00000 n 0002236288 00000 n 0002236565 00000 n 0002236839 00000 n 0002237106 00000 n 0002237372 00000 n 0002237643 00000 n 0002237918 00000 n 0002238197 00000 n 0002238462 00000 n 0002238726 00000 n 0002238998 00000 n 0002239267 00000 n 0002239544 00000 n 0002239814 00000 n 0002240088 00000 n 0002240366 00000 n 0002240639 00000 n 0002240901 00000 n 0002241179 00000 n 0002241456 00000 n 0002241725 00000 n 0002242004 00000 n 0002242281 00000 n 0002242562 00000 n 0002242829 00000 n 0002243095 00000 n 0002243370 00000 n 0002243644 00000 n 0002243919 00000 n 0002244193 00000 n 0002244469 00000 n 0002244747 00000 n 0002245029 00000 n 0002245298 00000 n 0002245575 00000 n 0002245848 00000 n 0002246120 00000 n 0002246386 00000 n 0002246661 00000 n 0002246931 00000 n 0002247203 00000 n 0002247483 00000 n 0002247755 00000 n 0002248020 00000 n 0002248295 00000 n 0002248563 00000 n 0002248836 00000 n 0002249101 00000 n 0002249389 00000 n 0002249676 00000 n 0002249938 00000 n 0002250210 00000 n 0002250491 00000 n 0002250766 00000 n 0002251040 00000 n 0002251319 00000 n 0002251589 00000 n 0002251864 00000 n 0002252137 00000 n 0002252414 00000 n 0002253776 00000 n 0002261466 00000 n 0002252818 00000 n 0002252998 00000 n 0002267736 00000 n 0002261489 00000 n 0002261545 00000 n 0002261601 00000 n 0002261657 00000 n 0002261713 00000 n 0002261769 00000 n 0002261825 00000 n 0002262103 00000 n 0002262389 00000 n 0002262667 00000 n 0002262955 00000 n 0002263228 00000 n 0002263505 00000 n 0002263775 00000 n 0002264054 00000 n 0002264234 00000 n 0002264516 00000 n 0002264789 00000 n 0002265059 00000 n 0002265325 00000 n 0002265598 00000 n 0002265875 00000 n 0002266155 00000 n 0002266423 00000 n 0002266689 00000 n 0002266954 00000 n 0002267210 00000 n 0002267477 00000 n 0002268292 00000 n 0002276225 00000 n 0002267866 00000 n 0002268072 00000 n 0002277997 00000 n 0002276248 00000 n 0002276304 00000 n 0002276360 00000 n 0002276416 00000 n 0002276472 00000 n 0002276528 00000 n 0002276584 00000 n 0002276640 00000 n 0002276696 00000 n 0002276959 00000 n 0002277239 00000 n 0002277520 00000 n 0002277801 00000 n 0002278400 00000 n 0002284378 00000 n 0002278127 00000 n 0002278333 00000 n 0002284814 00000 n 0002284401 00000 n 0002284457 00000 n 0002284513 00000 n 0002284569 00000 n 0002284625 00000 n 0002285197 00000 n 0002291542 00000 n 0002284944 00000 n 0002285166 00000 n 0002292450 00000 n 0002291565 00000 n 0002291621 00000 n 0002291677 00000 n 0002291733 00000 n 0002291789 00000 n 0002291845 00000 n 0002291901 00000 n 0002292169 00000 n 0002292826 00000 n 0002300010 00000 n 0002292580 00000 n 0002292786 00000 n 0002300369 00000 n 0002300033 00000 n 0002300089 00000 n 0002300145 00000 n 0002300201 00000 n 0002300257 00000 n 0002300313 00000 n 0002300743 00000 n 0002306471 00000 n 0002300499 00000 n 0002300721 00000 n 0002306993 00000 n 0002306494 00000 n 0002306550 00000 n 0002306606 00000 n 0002306662 00000 n 0002306718 00000 n 0002307376 00000 n 0002311368 00000 n 0002307123 00000 n 0002307345 00000 n 0002311665 00000 n 0002311391 00000 n 0002312032 00000 n 0002317200 00000 n 0002311795 00000 n 0002312001 00000 n 0002317559 00000 n 0002317223 00000 n 0002317279 00000 n 0002317335 00000 n 0002317391 00000 n 0002317447 00000 n 0002317503 00000 n 0002317917 00000 n 0002323194 00000 n 0002317689 00000 n 0002317895 00000 n 0002325328 00000 n 0002323217 00000 n 0002323273 00000 n 0002323329 00000 n 0002323600 00000 n 0002323869 00000 n 0002324135 00000 n 0002324412 00000 n 0002324648 00000 n 0002324878 00000 n 0002325103 00000 n 0002325774 00000 n 0002332202 00000 n 0002325458 00000 n 0002325680 00000 n 0002333092 00000 n 0002332225 00000 n 0002332281 00000 n 0002332337 00000 n 0002332393 00000 n 0002332449 00000 n 0002332505 00000 n 0002332561 00000 n 0002332820 00000 n 0002333484 00000 n 0002339886 00000 n 0002333222 00000 n 0002333444 00000 n 0002340021 00000 n 0002339909 00000 n 0002339965 00000 n 0002340379 00000 n 0002344347 00000 n 0002340151 00000 n 0002340357 00000 n 0002345022 00000 n 0002344370 00000 n 0002344426 00000 n 0002344482 00000 n 0002344747 00000 n 0002345398 00000 n 0002349013 00000 n 0002345152 00000 n 0002345358 00000 n 0002349260 00000 n 0002349036 00000 n 0002349092 00000 n 0002349148 00000 n 0002349204 00000 n 0002349618 00000 n 0002353426 00000 n 0002349390 00000 n 0002349596 00000 n 0002353943 00000 n 0002353449 00000 n 0002353505 00000 n 0002353561 00000 n 0002353617 00000 n 0002353673 00000 n 0002354310 00000 n 0002358060 00000 n 0002354073 00000 n 0002354279 00000 n 0002358847 00000 n 0002358083 00000 n 0002358139 00000 n 0002358195 00000 n 0002358251 00000 n 0002358307 00000 n 0002358580 00000 n 0002359223 00000 n 0002363725 00000 n 0002358977 00000 n 0002359183 00000 n 0002364992 00000 n 0002363748 00000 n 0002363804 00000 n 0002363860 00000 n 0002363916 00000 n 0002363972 00000 n 0002364028 00000 n 0002364084 00000 n 0002364140 00000 n 0002364196 00000 n 0002364458 00000 n 0002364718 00000 n 0002365377 00000 n 0002369825 00000 n 0002365122 00000 n 0002365328 00000 n 0002370588 00000 n 0002369848 00000 n 0002369904 00000 n 0002369960 00000 n 0002370016 00000 n 0002370072 00000 n 0002370328 00000 n 0002370964 00000 n 0002375468 00000 n 0002370718 00000 n 0002370924 00000 n 0002376674 00000 n 0002375491 00000 n 0002375547 00000 n 0002375603 00000 n 0002375866 00000 n 0002376143 00000 n 0002376412 00000 n 0002377068 00000 n 0002383306 00000 n 0002376804 00000 n 0002377010 00000 n 0002384142 00000 n 0002383329 00000 n 0002383385 00000 n 0002383441 00000 n 0002383497 00000 n 0002383553 00000 n 0002383609 00000 n 0002383665 00000 n 0002383929 00000 n 0002384518 00000 n 0002389962 00000 n 0002384272 00000 n 0002384478 00000 n 0002390097 00000 n 0002389985 00000 n 0002390041 00000 n 0002390455 00000 n 0002394575 00000 n 0002390227 00000 n 0002390433 00000 n 0002395437 00000 n 0002394598 00000 n 0002394654 00000 n 0002394710 00000 n 0002394975 00000 n 0002395257 00000 n 0002395822 00000 n 0002400188 00000 n 0002395567 00000 n 0002395773 00000 n 0002400211 00000 n 0002400559 00000 n 0002403222 00000 n 0002400341 00000 n 0002400537 00000 n 0002404618 00000 n 0002403245 00000 n 0002403301 00000 n 0002403357 00000 n 0002403413 00000 n 0002403469 00000 n 0002403728 00000 n 0002403993 00000 n 0002404212 00000 n 0002404417 00000 n 0002405037 00000 n 0002412470 00000 n 0002404748 00000 n 0002404970 00000 n 0002412870 00000 n 0002412493 00000 n 0002412549 00000 n 0002412605 00000 n 0002413237 00000 n 0002418101 00000 n 0002413000 00000 n 0002413206 00000 n 0002418236 00000 n 0002418124 00000 n 0002418180 00000 n 0002418594 00000 n 0002422933 00000 n 0002418366 00000 n 0002418572 00000 n 0002423714 00000 n 0002422956 00000 n 0002423012 00000 n 0002423068 00000 n 0002423124 00000 n 0002423180 00000 n 0002423445 00000 n 0002424090 00000 n 0002428534 00000 n 0002423844 00000 n 0002424050 00000 n 0002428669 00000 n 0002428557 00000 n 0002428613 00000 n 0002429027 00000 n 0002432844 00000 n 0002428799 00000 n 0002429005 00000 n 0002433642 00000 n 0002432867 00000 n 0002432923 00000 n 0002432979 00000 n 0002433035 00000 n 0002433091 00000 n 0002433368 00000 n 0002434018 00000 n 0002440886 00000 n 0002433772 00000 n 0002433978 00000 n 0002440909 00000 n 0002441257 00000 n 0002444777 00000 n 0002441039 00000 n 0002441235 00000 n 0002445294 00000 n 0002444800 00000 n 0002444856 00000 n 0002444912 00000 n 0002444968 00000 n 0002445024 00000 n 0002445661 00000 n 0002451381 00000 n 0002445424 00000 n 0002445630 00000 n 0002451740 00000 n 0002451404 00000 n 0002451460 00000 n 0002451516 00000 n 0002451572 00000 n 0002451628 00000 n 0002451684 00000 n 0002452098 00000 n 0002457419 00000 n 0002451870 00000 n 0002452076 00000 n 0002458585 00000 n 0002457442 00000 n 0002457498 00000 n 0002457554 00000 n 0002457610 00000 n 0002457666 00000 n 0002457722 00000 n 0002457778 00000 n 0002458052 00000 n 0002458319 00000 n 0002458986 00000 n 0002466778 00000 n 0002458715 00000 n 0002458937 00000 n 0002467067 00000 n 0002466801 00000 n 0002467440 00000 n 0002472196 00000 n 0002467197 00000 n 0002467409 00000 n 0002472219 00000 n 0002472567 00000 n 0002476629 00000 n 0002472349 00000 n 0002472545 00000 n 0002477151 00000 n 0002476652 00000 n 0002476708 00000 n 0002476764 00000 n 0002476820 00000 n 0002476876 00000 n 0002477518 00000 n 0002481798 00000 n 0002477281 00000 n 0002477487 00000 n 0002482045 00000 n 0002481821 00000 n 0002481877 00000 n 0002481933 00000 n 0002481989 00000 n 0002482403 00000 n 0002486453 00000 n 0002482175 00000 n 0002482381 00000 n 0002486849 00000 n 0002486476 00000 n 0002486532 00000 n 0002486588 00000 n 0002487216 00000 n 0002490504 00000 n 0002486979 00000 n 0002487185 00000 n 0002491189 00000 n 0002490527 00000 n 0002490583 00000 n 0002490639 00000 n 0002490921 00000 n 0002491565 00000 n 0002495679 00000 n 0002491319 00000 n 0002491525 00000 n 0002497176 00000 n 0002495702 00000 n 0002495758 00000 n 0002495814 00000 n 0002496081 00000 n 0002496364 00000 n 0002496643 00000 n 0002496902 00000 n 0002497579 00000 n 0002502343 00000 n 0002497306 00000 n 0002497512 00000 n 0002502590 00000 n 0002502366 00000 n 0002502422 00000 n 0002502478 00000 n 0002502534 00000 n 0002502948 00000 n 0002506227 00000 n 0002502720 00000 n 0002502926 00000 n 0002506362 00000 n 0002506250 00000 n 0002506306 00000 n 0002506720 00000 n 0002510315 00000 n 0002506492 00000 n 0002506698 00000 n 0002510821 00000 n 0002510338 00000 n 0002510394 00000 n 0002510450 00000 n 0002510506 00000 n 0002510562 00000 n 0002511188 00000 n 0002515400 00000 n 0002510951 00000 n 0002511157 00000 n 0002515799 00000 n 0002515423 00000 n 0002515479 00000 n 0002515535 00000 n 0002516166 00000 n 0002521094 00000 n 0002515929 00000 n 0002516135 00000 n 0002521229 00000 n 0002521117 00000 n 0002521173 00000 n 0002521587 00000 n 0002525671 00000 n 0002521359 00000 n 0002521565 00000 n 0002526557 00000 n 0002525694 00000 n 0002525750 00000 n 0002525806 00000 n 0002525862 00000 n 0002525918 00000 n 0002526178 00000 n 0002526360 00000 n 0002526942 00000 n 0002534444 00000 n 0002526687 00000 n 0002526893 00000 n 0002534803 00000 n 0002534467 00000 n 0002534523 00000 n 0002534579 00000 n 0002534635 00000 n 0002534691 00000 n 0002534747 00000 n 0002535161 00000 n 0002540996 00000 n 0002534933 00000 n 0002535139 00000 n 0002541399 00000 n 0002541019 00000 n 0002541075 00000 n 0002541131 00000 n 0002541766 00000 n 0002547571 00000 n 0002541529 00000 n 0002541735 00000 n 0002549763 00000 n 0002547594 00000 n 0002547869 00000 n 0002548137 00000 n 0002548412 00000 n 0002548692 00000 n 0002548966 00000 n 0002549254 00000 n 0002549541 00000 n 0002550193 00000 n 0002558229 00000 n 0002549893 00000 n 0002550099 00000 n 0002561439 00000 n 0002558252 00000 n 0002558308 00000 n 0002558364 00000 n 0002558420 00000 n 0002558476 00000 n 0002558751 00000 n 0002559011 00000 n 0002559292 00000 n 0002559570 00000 n 0002559832 00000 n 0002560094 00000 n 0002560367 00000 n 0002560627 00000 n 0002560905 00000 n 0002561172 00000 n 0002561928 00000 n 0002571500 00000 n 0002561569 00000 n 0002561807 00000 n 0002572064 00000 n 0002571523 00000 n 0002571791 00000 n 0002572462 00000 n 0002576701 00000 n 0002572194 00000 n 0002572422 00000 n 0002577748 00000 n 0002576724 00000 n 0002576780 00000 n 0002576836 00000 n 0002576892 00000 n 0002576948 00000 n 0002577215 00000 n 0002577482 00000 n 0002578149 00000 n 0002584268 00000 n 0002577878 00000 n 0002578100 00000 n 0002584558 00000 n 0002584291 00000 n 0002584941 00000 n 0002589860 00000 n 0002584688 00000 n 0002584910 00000 n 0002590676 00000 n 0002589883 00000 n 0002590150 00000 n 0002590409 00000 n 0002591051 00000 n 0002596098 00000 n 0002590806 00000 n 0002591002 00000 n 0002596498 00000 n 0002596121 00000 n 0002596177 00000 n 0002596233 00000 n 0002596865 00000 n 0002602607 00000 n 0002596628 00000 n 0002596834 00000 n 0002602912 00000 n 0002602630 00000 n 0002603295 00000 n 0002608137 00000 n 0002603042 00000 n 0002603264 00000 n 0002608765 00000 n 0002608160 00000 n 0002608216 00000 n 0002608272 00000 n 0002608328 00000 n 0002608384 00000 n 0002608440 00000 n 0002608496 00000 n 0002609132 00000 n 0002613873 00000 n 0002608895 00000 n 0002609101 00000 n 0002614437 00000 n 0002613896 00000 n 0002614162 00000 n 0002614803 00000 n 0002618881 00000 n 0002614567 00000 n 0002614763 00000 n 0002619016 00000 n 0002618904 00000 n 0002618960 00000 n 0002619374 00000 n 0002623406 00000 n 0002619146 00000 n 0002619352 00000 n 0002624089 00000 n 0002623429 00000 n 0002623485 00000 n 0002623541 00000 n 0002623814 00000 n 0002624465 00000 n 0002629139 00000 n 0002624219 00000 n 0002624425 00000 n 0002629162 00000 n 0002629510 00000 n 0002632626 00000 n 0002629292 00000 n 0002629488 00000 n 0002632873 00000 n 0002632649 00000 n 0002632705 00000 n 0002632761 00000 n 0002632817 00000 n 0002633231 00000 n 0002638083 00000 n 0002633003 00000 n 0002633209 00000 n 0002638106 00000 n 0002638454 00000 n 0002642597 00000 n 0002638236 00000 n 0002638432 00000 n 0002642732 00000 n 0002642620 00000 n 0002642676 00000 n 0002643090 00000 n 0002646649 00000 n 0002642862 00000 n 0002643068 00000 n 0002646672 00000 n 0002647020 00000 n 0002650709 00000 n 0002646802 00000 n 0002646998 00000 n 0002650956 00000 n 0002650732 00000 n 0002650788 00000 n 0002650844 00000 n 0002650900 00000 n 0002651314 00000 n 0002656476 00000 n 0002651086 00000 n 0002651292 00000 n 0002656611 00000 n 0002656499 00000 n 0002656555 00000 n 0002656969 00000 n 0002660710 00000 n 0002656741 00000 n 0002656947 00000 n 0002661013 00000 n 0002660733 00000 n 0002661370 00000 n 0002666692 00000 n 0002661143 00000 n 0002661339 00000 n 0002666827 00000 n 0002666715 00000 n 0002666771 00000 n 0002667185 00000 n 0002671011 00000 n 0002666957 00000 n 0002667163 00000 n 0002671146 00000 n 0002671034 00000 n 0002671090 00000 n 0002671504 00000 n 0002675356 00000 n 0002671276 00000 n 0002671482 00000 n 0002675769 00000 n 0002675379 00000 n 0002675435 00000 n 0002675491 00000 n 0002676136 00000 n 0002680508 00000 n 0002675899 00000 n 0002676105 00000 n 0002680793 00000 n 0002680531 00000 n 0002681150 00000 n 0002686295 00000 n 0002680923 00000 n 0002681119 00000 n 0002686430 00000 n 0002686318 00000 n 0002686374 00000 n 0002686804 00000 n 0002692453 00000 n 0002686560 00000 n 0002686782 00000 n 0002692700 00000 n 0002692476 00000 n 0002692532 00000 n 0002692588 00000 n 0002692644 00000 n 0002693074 00000 n 0002697273 00000 n 0002692830 00000 n 0002693052 00000 n 0002697520 00000 n 0002697296 00000 n 0002697352 00000 n 0002697408 00000 n 0002697464 00000 n 0002697878 00000 n 0002702701 00000 n 0002697650 00000 n 0002697856 00000 n 0002709510 00000 n 0002702724 00000 n 0002702780 00000 n 0002702836 00000 n 0002702892 00000 n 0002702948 00000 n 0002703004 00000 n 0002703060 00000 n 0002703116 00000 n 0002703172 00000 n 0002703228 00000 n 0002703284 00000 n 0002703462 00000 n 0002703730 00000 n 0002704001 00000 n 0002704277 00000 n 0002704552 00000 n 0002704837 00000 n 0002705112 00000 n 0002705386 00000 n 0002705664 00000 n 0002705942 00000 n 0002706220 00000 n 0002706486 00000 n 0002706752 00000 n 0002707034 00000 n 0002707305 00000 n 0002707582 00000 n 0002707858 00000 n 0002708135 00000 n 0002708409 00000 n 0002708686 00000 n 0002708956 00000 n 0002709233 00000 n 0002710075 00000 n 0002717248 00000 n 0002709640 00000 n 0002709846 00000 n 0002718363 00000 n 0002717271 00000 n 0002717327 00000 n 0002717383 00000 n 0002717439 00000 n 0002717495 00000 n 0002717551 00000 n 0002717607 00000 n 0002717787 00000 n 0002717982 00000 n 0002718167 00000 n 0002718773 00000 n 0002724483 00000 n 0002718493 00000 n 0002718715 00000 n 0002725274 00000 n 0002724506 00000 n 0002724562 00000 n 0002724618 00000 n 0002724674 00000 n 0002724730 00000 n 0002724786 00000 n 0002724842 00000 n 0002725054 00000 n 0002725650 00000 n 0002730341 00000 n 0002725404 00000 n 0002725610 00000 n 0002731245 00000 n 0002730364 00000 n 0002730420 00000 n 0002730476 00000 n 0002730532 00000 n 0002730588 00000 n 0002730644 00000 n 0002730700 00000 n 0002730971 00000 n 0002731637 00000 n 0002735628 00000 n 0002731375 00000 n 0002731597 00000 n 0002737125 00000 n 0002735651 00000 n 0002735707 00000 n 0002735763 00000 n 0002735819 00000 n 0002735875 00000 n 0002736071 00000 n 0002736274 00000 n 0002736495 00000 n 0002736703 00000 n 0002736901 00000 n 0002737537 00000 n 0002741409 00000 n 0002737255 00000 n 0002737461 00000 n 0002741656 00000 n 0002741432 00000 n 0002741488 00000 n 0002741544 00000 n 0002741600 00000 n 0002742014 00000 n 0002745071 00000 n 0002741786 00000 n 0002741992 00000 n 0002745591 00000 n 0002745094 00000 n 0002745150 00000 n 0002745206 00000 n 0002745407 00000 n 0002745967 00000 n 0002749588 00000 n 0002745721 00000 n 0002745927 00000 n 0002749983 00000 n 0002749611 00000 n 0002749667 00000 n 0002749723 00000 n 0002750350 00000 n 0002753815 00000 n 0002750113 00000 n 0002750319 00000 n 0002753950 00000 n 0002753838 00000 n 0002753894 00000 n 0002754308 00000 n 0002756923 00000 n 0002754080 00000 n 0002754286 00000 n 0002757170 00000 n 0002756946 00000 n 0002757002 00000 n 0002757058 00000 n 0002757114 00000 n 0002757544 00000 n 0002761053 00000 n 0002757300 00000 n 0002757522 00000 n 0002761076 00000 n 0002761414 00000 n 0002763478 00000 n 0002761206 00000 n 0002761392 00000 n 0002763725 00000 n 0002763501 00000 n 0002763557 00000 n 0002763613 00000 n 0002763669 00000 n 0002764083 00000 n 0002767393 00000 n 0002763855 00000 n 0002764061 00000 n 0002767788 00000 n 0002767416 00000 n 0002767472 00000 n 0002767528 00000 n 0002768155 00000 n 0002771373 00000 n 0002767918 00000 n 0002768124 00000 n 0002774447 00000 n 0002771396 00000 n 0002771452 00000 n 0002771508 00000 n 0002771564 00000 n 0002771620 00000 n 0002771676 00000 n 0002771732 00000 n 0002771788 00000 n 0002771844 00000 n 0002772104 00000 n 0002772364 00000 n 0002772624 00000 n 0002772884 00000 n 0002773144 00000 n 0002773404 00000 n 0002773664 00000 n 0002773925 00000 n 0002774186 00000 n 0002774927 00000 n 0002780239 00000 n 0002774577 00000 n 0002774815 00000 n 0002780262 00000 n 0002780610 00000 n 0002783749 00000 n 0002780392 00000 n 0002780588 00000 n 0002784046 00000 n 0002783772 00000 n 0002784429 00000 n 0002789417 00000 n 0002784176 00000 n 0002784398 00000 n 0002789552 00000 n 0002789440 00000 n 0002789496 00000 n 0002789926 00000 n 0002793272 00000 n 0002789682 00000 n 0002789904 00000 n 0002793295 00000 n 0002793643 00000 n 0002796316 00000 n 0002793425 00000 n 0002793621 00000 n 0002797008 00000 n 0002796339 00000 n 0002796395 00000 n 0002796451 00000 n 0002796507 00000 n 0002796563 00000 n 0002796824 00000 n 0002797384 00000 n 0002802157 00000 n 0002797138 00000 n 0002797344 00000 n 0002802404 00000 n 0002802180 00000 n 0002802236 00000 n 0002802292 00000 n 0002802348 00000 n 0002802778 00000 n 0002807124 00000 n 0002802534 00000 n 0002802756 00000 n 0002813096 00000 n 0002807147 00000 n 0002807203 00000 n 0002807259 00000 n 0002807315 00000 n 0002807371 00000 n 0002807630 00000 n 0002807889 00000 n 0002808156 00000 n 0002808415 00000 n 0002808674 00000 n 0002808933 00000 n 0002809192 00000 n 0002809451 00000 n 0002809710 00000 n 0002809970 00000 n 0002810230 00000 n 0002810490 00000 n 0002810750 00000 n 0002811016 00000 n 0002811276 00000 n 0002811536 00000 n 0002811796 00000 n 0002812056 00000 n 0002812316 00000 n 0002812576 00000 n 0002812836 00000 n 0002813652 00000 n 0002817951 00000 n 0002813226 00000 n 0002813432 00000 n 0002824088 00000 n 0002817974 00000 n 0002818030 00000 n 0002818086 00000 n 0002818142 00000 n 0002818198 00000 n 0002818458 00000 n 0002818718 00000 n 0002818984 00000 n 0002819244 00000 n 0002819504 00000 n 0002819764 00000 n 0002820024 00000 n 0002820284 00000 n 0002820544 00000 n 0002820814 00000 n 0002821096 00000 n 0002821368 00000 n 0002821638 00000 n 0002821898 00000 n 0002822158 00000 n 0002822418 00000 n 0002822678 00000 n 0002822938 00000 n 0002823198 00000 n 0002823458 00000 n 0002823718 00000 n 0002823899 00000 n 0002824669 00000 n 0002830885 00000 n 0002824218 00000 n 0002824440 00000 n 0002831132 00000 n 0002830908 00000 n 0002830964 00000 n 0002831020 00000 n 0002831076 00000 n 0002831490 00000 n 0002836672 00000 n 0002831262 00000 n 0002831468 00000 n 0002837134 00000 n 0002836695 00000 n 0002836751 00000 n 0002836807 00000 n 0002836863 00000 n 0002836919 00000 n 0002837501 00000 n 0002842286 00000 n 0002837264 00000 n 0002837470 00000 n 0002842757 00000 n 0002842309 00000 n 0002842365 00000 n 0002842421 00000 n 0002842477 00000 n 0002842533 00000 n 0002842589 00000 n 0002842645 00000 n 0002842701 00000 n 0002843115 00000 n 0002847061 00000 n 0002842887 00000 n 0002843093 00000 n 0002847196 00000 n 0002847084 00000 n 0002847140 00000 n 0002847554 00000 n 0002851768 00000 n 0002847326 00000 n 0002847532 00000 n 0002852015 00000 n 0002851791 00000 n 0002851847 00000 n 0002851903 00000 n 0002851959 00000 n 0002852373 00000 n 0002856798 00000 n 0002852145 00000 n 0002852351 00000 n 0002856933 00000 n 0002856821 00000 n 0002856877 00000 n 0002857291 00000 n 0002861795 00000 n 0002857063 00000 n 0002857269 00000 n 0002861930 00000 n 0002861818 00000 n 0002861874 00000 n 0002862288 00000 n 0002865614 00000 n 0002862060 00000 n 0002862266 00000 n 0002865861 00000 n 0002865637 00000 n 0002865693 00000 n 0002865749 00000 n 0002865805 00000 n 0002866219 00000 n 0002870211 00000 n 0002865991 00000 n 0002866197 00000 n 0002870346 00000 n 0002870234 00000 n 0002870290 00000 n 0002870704 00000 n 0002874413 00000 n 0002870476 00000 n 0002870682 00000 n 0002874548 00000 n 0002874436 00000 n 0002874492 00000 n 0002874906 00000 n 0002878637 00000 n 0002874678 00000 n 0002874884 00000 n 0002878660 00000 n 0002879008 00000 n 0002884610 00000 n 0002878790 00000 n 0002878986 00000 n 0002884857 00000 n 0002884633 00000 n 0002884689 00000 n 0002884745 00000 n 0002884801 00000 n 0002885215 00000 n 0002889641 00000 n 0002884987 00000 n 0002885193 00000 n 0002890163 00000 n 0002889664 00000 n 0002889720 00000 n 0002889776 00000 n 0002889832 00000 n 0002889888 00000 n 0002890530 00000 n 0002893836 00000 n 0002890293 00000 n 0002890499 00000 n 0002893971 00000 n 0002893859 00000 n 0002893915 00000 n 0002894329 00000 n 0002898463 00000 n 0002894101 00000 n 0002894307 00000 n 0002899141 00000 n 0002898486 00000 n 0002898542 00000 n 0002898598 00000 n 0002898866 00000 n 0002899517 00000 n 0002903890 00000 n 0002899271 00000 n 0002899477 00000 n 0002904137 00000 n 0002903913 00000 n 0002903969 00000 n 0002904025 00000 n 0002904081 00000 n 0002904495 00000 n 0002907763 00000 n 0002904267 00000 n 0002904473 00000 n 0002908122 00000 n 0002907786 00000 n 0002907842 00000 n 0002907898 00000 n 0002907954 00000 n 0002908010 00000 n 0002908066 00000 n 0002908480 00000 n 0002912868 00000 n 0002908252 00000 n 0002908458 00000 n 0002913115 00000 n 0002912891 00000 n 0002912947 00000 n 0002913003 00000 n 0002913059 00000 n 0002913489 00000 n 0002918496 00000 n 0002913245 00000 n 0002913467 00000 n 0002918898 00000 n 0002918519 00000 n 0002918575 00000 n 0002918631 00000 n 0002919265 00000 n 0002924239 00000 n 0002919028 00000 n 0002919234 00000 n 0002925111 00000 n 0002924262 00000 n 0002924318 00000 n 0002924374 00000 n 0002924430 00000 n 0002924486 00000 n 0002924542 00000 n 0002924598 00000 n 0002924858 00000 n 0002925503 00000 n 0002931808 00000 n 0002925241 00000 n 0002925463 00000 n 0002932391 00000 n 0002931831 00000 n 0002931887 00000 n 0002931943 00000 n 0002931999 00000 n 0002932055 00000 n 0002932111 00000 n 0002932167 00000 n 0002932223 00000 n 0002932279 00000 n 0002932335 00000 n 0002932765 00000 n 0002937944 00000 n 0002932521 00000 n 0002932743 00000 n 0002938079 00000 n 0002937967 00000 n 0002938023 00000 n 0002938437 00000 n 0002943537 00000 n 0002938209 00000 n 0002938415 00000 n 0002948103 00000 n 0002943560 00000 n 0002943616 00000 n 0002943672 00000 n 0002943728 00000 n 0002943784 00000 n 0002944060 00000 n 0002944330 00000 n 0002944600 00000 n 0002944870 00000 n 0002945142 00000 n 0002945415 00000 n 0002945684 00000 n 0002945955 00000 n 0002946223 00000 n 0002946493 00000 n 0002946761 00000 n 0002947026 00000 n 0002947293 00000 n 0002947563 00000 n 0002947838 00000 n 0002948605 00000 n 0002955019 00000 n 0002948233 00000 n 0002948439 00000 n 0002957433 00000 n 0002955042 00000 n 0002955098 00000 n 0002955154 00000 n 0002955210 00000 n 0002955266 00000 n 0002955322 00000 n 0002955378 00000 n 0002955434 00000 n 0002955490 00000 n 0002955758 00000 n 0002956025 00000 n 0002956292 00000 n 0002956548 00000 n 0002956808 00000 n 0002956983 00000 n 0002957209 00000 n 0002957879 00000 n 0002966316 00000 n 0002957563 00000 n 0002957785 00000 n 0002968081 00000 n 0002966339 00000 n 0002966395 00000 n 0002966451 00000 n 0002966507 00000 n 0002966563 00000 n 0002966619 00000 n 0002966675 00000 n 0002966731 00000 n 0002966787 00000 n 0002966843 00000 n 0002966899 00000 n 0002966955 00000 n 0002967011 00000 n 0002967270 00000 n 0002967538 00000 n 0002967813 00000 n 0002968475 00000 n 0002976519 00000 n 0002968211 00000 n 0002968417 00000 n 0002976878 00000 n 0002976542 00000 n 0002976598 00000 n 0002976654 00000 n 0002976710 00000 n 0002976766 00000 n 0002976822 00000 n 0002977236 00000 n 0002988032 00000 n 0002977008 00000 n 0002977214 00000 n 0002988887 00000 n 0002988056 00000 n 0002988112 00000 n 0002988168 00000 n 0002988224 00000 n 0002988280 00000 n 0002988336 00000 n 0002988392 00000 n 0002988448 00000 n 0002988504 00000 n 0002988560 00000 n 0002988616 00000 n 0002989270 00000 n 0002995485 00000 n 0002989017 00000 n 0002989239 00000 n 0002996761 00000 n 0002995508 00000 n 0002995564 00000 n 0002995620 00000 n 0002995676 00000 n 0002995732 00000 n 0002995788 00000 n 0002995844 00000 n 0002995900 00000 n 0002995956 00000 n 0002996220 00000 n 0002996487 00000 n 0002997146 00000 n 0003001947 00000 n 0002996891 00000 n 0002997097 00000 n 0003005205 00000 n 0003001970 00000 n 0003002026 00000 n 0003002082 00000 n 0003002138 00000 n 0003002194 00000 n 0003002455 00000 n 0003002716 00000 n 0003002977 00000 n 0003003238 00000 n 0003003499 00000 n 0003003760 00000 n 0003004021 00000 n 0003004282 00000 n 0003004544 00000 n 0003004806 00000 n 0003005014 00000 n 0003005671 00000 n 0003011508 00000 n 0003005335 00000 n 0003005541 00000 n 0003017593 00000 n 0003011531 00000 n 0003011587 00000 n 0003011643 00000 n 0003011699 00000 n 0003011755 00000 n 0003011811 00000 n 0003011867 00000 n 0003011923 00000 n 0003011979 00000 n 0003012241 00000 n 0003012503 00000 n 0003012765 00000 n 0003013027 00000 n 0003013289 00000 n 0003013551 00000 n 0003013813 00000 n 0003014075 00000 n 0003014337 00000 n 0003014599 00000 n 0003014861 00000 n 0003015123 00000 n 0003015385 00000 n 0003015647 00000 n 0003015909 00000 n 0003016171 00000 n 0003016433 00000 n 0003016695 00000 n 0003016957 00000 n 0003017219 00000 n 0003017399 00000 n 0003018149 00000 n 0003024655 00000 n 0003017723 00000 n 0003017929 00000 n 0003025014 00000 n 0003024678 00000 n 0003024734 00000 n 0003024790 00000 n 0003024846 00000 n 0003024902 00000 n 0003024958 00000 n 0003025388 00000 n 0003032277 00000 n 0003025144 00000 n 0003025366 00000 n 0003032524 00000 n 0003032300 00000 n 0003032356 00000 n 0003032412 00000 n 0003032468 00000 n 0003032882 00000 n 0003039748 00000 n 0003032654 00000 n 0003032860 00000 n 0003040443 00000 n 0003039771 00000 n 0003039827 00000 n 0003039883 00000 n 0003039939 00000 n 0003039995 00000 n 0003040051 00000 n 0003040107 00000 n 0003040163 00000 n 0003040219 00000 n 0003040275 00000 n 0003040331 00000 n 0003040387 00000 n 0003040801 00000 n 0003046031 00000 n 0003040573 00000 n 0003040779 00000 n 0003046278 00000 n 0003046054 00000 n 0003046110 00000 n 0003046166 00000 n 0003046222 00000 n 0003046652 00000 n 0003051760 00000 n 0003046408 00000 n 0003046630 00000 n 0003052343 00000 n 0003051783 00000 n 0003051839 00000 n 0003051895 00000 n 0003051951 00000 n 0003052007 00000 n 0003052063 00000 n 0003052119 00000 n 0003052175 00000 n 0003052231 00000 n 0003052287 00000 n 0003052701 00000 n 0003056541 00000 n 0003052473 00000 n 0003052679 00000 n 0003056900 00000 n 0003056564 00000 n 0003056620 00000 n 0003056676 00000 n 0003056732 00000 n 0003056788 00000 n 0003056844 00000 n 0003057258 00000 n 0003063136 00000 n 0003057030 00000 n 0003057236 00000 n 0003070740 00000 n 0003063159 00000 n 0003063215 00000 n 0003063271 00000 n 0003063327 00000 n 0003063383 00000 n 0003063439 00000 n 0003063495 00000 n 0003063551 00000 n 0003063607 00000 n 0003063663 00000 n 0003063719 00000 n 0003063775 00000 n 0003063831 00000 n 0003063887 00000 n 0003063943 00000 n 0003064205 00000 n 0003064467 00000 n 0003064729 00000 n 0003064991 00000 n 0003065253 00000 n 0003065515 00000 n 0003065777 00000 n 0003066039 00000 n 0003066302 00000 n 0003066565 00000 n 0003066828 00000 n 0003067091 00000 n 0003067354 00000 n 0003067617 00000 n 0003067880 00000 n 0003068143 00000 n 0003068406 00000 n 0003068669 00000 n 0003068946 00000 n 0003069227 00000 n 0003069490 00000 n 0003069753 00000 n 0003070016 00000 n 0003070279 00000 n 0003070542 00000 n 0003071332 00000 n 0003078691 00000 n 0003070870 00000 n 0003071076 00000 n 0003079425 00000 n 0003078714 00000 n 0003078770 00000 n 0003078826 00000 n 0003078882 00000 n 0003078938 00000 n 0003078994 00000 n 0003079050 00000 n 0003079106 00000 n 0003079162 00000 n 0003079824 00000 n 0003084506 00000 n 0003079555 00000 n 0003079793 00000 n 0003084977 00000 n 0003084529 00000 n 0003084585 00000 n 0003084641 00000 n 0003084697 00000 n 0003084753 00000 n 0003084809 00000 n 0003084865 00000 n 0003084921 00000 n 0003085335 00000 n 0003089221 00000 n 0003085107 00000 n 0003085313 00000 n 0003089468 00000 n 0003089244 00000 n 0003089300 00000 n 0003089356 00000 n 0003089412 00000 n 0003089826 00000 n 0003093665 00000 n 0003089598 00000 n 0003089804 00000 n 0003093800 00000 n 0003093688 00000 n 0003093744 00000 n 0003094158 00000 n 0003098207 00000 n 0003093930 00000 n 0003094136 00000 n 0003098566 00000 n 0003098230 00000 n 0003098286 00000 n 0003098342 00000 n 0003098398 00000 n 0003098454 00000 n 0003098510 00000 n 0003098924 00000 n 0003103001 00000 n 0003098696 00000 n 0003098902 00000 n 0003103024 00000 n 0003103372 00000 n 0003106438 00000 n 0003103154 00000 n 0003103350 00000 n 0003106685 00000 n 0003106461 00000 n 0003106517 00000 n 0003106573 00000 n 0003106629 00000 n 0003107043 00000 n 0003111199 00000 n 0003106815 00000 n 0003107021 00000 n 0003111944 00000 n 0003111222 00000 n 0003111278 00000 n 0003111334 00000 n 0003111390 00000 n 0003111446 00000 n 0003111502 00000 n 0003111558 00000 n 0003111614 00000 n 0003111670 00000 n 0003112311 00000 n 0003115891 00000 n 0003112074 00000 n 0003112280 00000 n 0003116138 00000 n 0003115914 00000 n 0003115970 00000 n 0003116026 00000 n 0003116082 00000 n 0003116496 00000 n 0003120666 00000 n 0003116268 00000 n 0003116474 00000 n 0003134646 00000 n 0003120689 00000 n 0003120745 00000 n 0003120801 00000 n 0003120857 00000 n 0003120913 00000 n 0003120969 00000 n 0003121025 00000 n 0003121286 00000 n 0003121547 00000 n 0003121808 00000 n 0003122069 00000 n 0003122330 00000 n 0003122591 00000 n 0003122852 00000 n 0003123113 00000 n 0003123375 00000 n 0003123637 00000 n 0003123899 00000 n 0003124161 00000 n 0003124423 00000 n 0003124685 00000 n 0003124947 00000 n 0003125209 00000 n 0003125471 00000 n 0003125733 00000 n 0003125995 00000 n 0003126257 00000 n 0003126519 00000 n 0003126781 00000 n 0003127043 00000 n 0003127305 00000 n 0003127567 00000 n 0003127829 00000 n 0003128091 00000 n 0003128353 00000 n 0003128615 00000 n 0003128877 00000 n 0003129139 00000 n 0003129401 00000 n 0003129663 00000 n 0003129925 00000 n 0003130187 00000 n 0003130449 00000 n 0003130711 00000 n 0003130973 00000 n 0003131235 00000 n 0003131497 00000 n 0003131759 00000 n 0003132021 00000 n 0003132283 00000 n 0003132545 00000 n 0003132807 00000 n 0003133069 00000 n 0003133336 00000 n 0003133598 00000 n 0003133860 00000 n 0003134122 00000 n 0003134384 00000 n 0003135472 00000 n 0003142620 00000 n 0003134776 00000 n 0003134982 00000 n 0003143661 00000 n 0003142643 00000 n 0003142699 00000 n 0003142755 00000 n 0003142811 00000 n 0003142867 00000 n 0003142923 00000 n 0003142979 00000 n 0003143035 00000 n 0003143091 00000 n 0003143147 00000 n 0003143203 00000 n 0003143465 00000 n 0003144037 00000 n 0003149544 00000 n 0003143791 00000 n 0003143997 00000 n 0003149791 00000 n 0003149567 00000 n 0003149623 00000 n 0003149679 00000 n 0003149735 00000 n 0003150149 00000 n 0003154653 00000 n 0003149921 00000 n 0003150127 00000 n 0003154788 00000 n 0003154676 00000 n 0003154732 00000 n 0003155162 00000 n 0003160822 00000 n 0003154918 00000 n 0003155140 00000 n 0003161037 00000 n 0003160845 00000 n 0003161410 00000 n 0003167771 00000 n 0003161167 00000 n 0003161379 00000 n 0003168837 00000 n 0003167794 00000 n 0003167850 00000 n 0003167906 00000 n 0003167962 00000 n 0003168018 00000 n 0003168074 00000 n 0003168130 00000 n 0003168186 00000 n 0003168242 00000 n 0003168298 00000 n 0003168354 00000 n 0003168410 00000 n 0003168466 00000 n 0003168522 00000 n 0003168578 00000 n 0003169204 00000 n 0003176096 00000 n 0003168967 00000 n 0003169173 00000 n 0003176618 00000 n 0003176119 00000 n 0003176175 00000 n 0003176231 00000 n 0003176287 00000 n 0003176343 00000 n 0003176985 00000 n 0003180235 00000 n 0003176748 00000 n 0003176954 00000 n 0003180370 00000 n 0003180258 00000 n 0003180314 00000 n 0003180728 00000 n 0003185286 00000 n 0003180500 00000 n 0003180706 00000 n 0003185421 00000 n 0003185309 00000 n 0003185365 00000 n 0003185779 00000 n 0003189202 00000 n 0003185551 00000 n 0003185757 00000 n 0003189449 00000 n 0003189225 00000 n 0003189281 00000 n 0003189337 00000 n 0003189393 00000 n 0003189807 00000 n 0003193218 00000 n 0003189579 00000 n 0003189785 00000 n 0003193465 00000 n 0003193241 00000 n 0003193297 00000 n 0003193353 00000 n 0003193409 00000 n 0003193823 00000 n 0003198968 00000 n 0003193595 00000 n 0003193801 00000 n 0003199103 00000 n 0003198991 00000 n 0003199047 00000 n 0003199461 00000 n 0003202258 00000 n 0003199233 00000 n 0003199439 00000 n 0003202393 00000 n 0003202281 00000 n 0003202337 00000 n 0003202751 00000 n 0003206078 00000 n 0003202523 00000 n 0003202729 00000 n 0003206101 00000 n 0003206449 00000 n 0003209472 00000 n 0003206231 00000 n 0003206427 00000 n 0003210244 00000 n 0003209495 00000 n 0003209551 00000 n 0003209607 00000 n 0003209663 00000 n 0003209719 00000 n 0003209984 00000 n 0003210636 00000 n 0003215150 00000 n 0003210374 00000 n 0003210596 00000 n 0003215285 00000 n 0003215173 00000 n 0003215229 00000 n 0003215643 00000 n 0003218706 00000 n 0003215415 00000 n 0003215621 00000 n 0003219213 00000 n 0003218729 00000 n 0003218785 00000 n 0003218841 00000 n 0003218897 00000 n 0003218953 00000 n 0003219580 00000 n 0003223285 00000 n 0003219343 00000 n 0003219549 00000 n 0003223532 00000 n 0003223308 00000 n 0003223364 00000 n 0003223420 00000 n 0003223476 00000 n 0003223890 00000 n 0003227661 00000 n 0003223662 00000 n 0003223868 00000 n 0003228020 00000 n 0003227684 00000 n 0003227740 00000 n 0003227796 00000 n 0003227852 00000 n 0003227908 00000 n 0003227964 00000 n 0003228378 00000 n 0003232307 00000 n 0003228150 00000 n 0003228356 00000 n 0003232442 00000 n 0003232330 00000 n 0003232386 00000 n 0003232800 00000 n 0003236612 00000 n 0003232572 00000 n 0003232778 00000 n 0003237083 00000 n 0003236635 00000 n 0003236691 00000 n 0003236747 00000 n 0003236803 00000 n 0003236859 00000 n 0003236915 00000 n 0003236971 00000 n 0003237027 00000 n 0003237441 00000 n 0003242612 00000 n 0003237213 00000 n 0003237419 00000 n 0003242635 00000 n 0003242983 00000 n 0003246035 00000 n 0003242765 00000 n 0003242961 00000 n 0003246282 00000 n 0003246058 00000 n 0003246114 00000 n 0003246170 00000 n 0003246226 00000 n 0003246640 00000 n 0003251590 00000 n 0003246412 00000 n 0003246618 00000 n 0003251837 00000 n 0003251613 00000 n 0003251669 00000 n 0003251725 00000 n 0003251781 00000 n 0003252195 00000 n 0003255849 00000 n 0003251967 00000 n 0003252173 00000 n 0003256370 00000 n 0003255872 00000 n 0003255928 00000 n 0003255984 00000 n 0003256040 00000 n 0003256096 00000 n 0003256737 00000 n 0003260908 00000 n 0003256500 00000 n 0003256706 00000 n 0003261155 00000 n 0003260931 00000 n 0003260987 00000 n 0003261043 00000 n 0003261099 00000 n 0003261513 00000 n 0003266129 00000 n 0003261285 00000 n 0003261491 00000 n 0003266488 00000 n 0003266152 00000 n 0003266208 00000 n 0003266264 00000 n 0003266320 00000 n 0003266376 00000 n 0003266432 00000 n 0003266862 00000 n 0003274535 00000 n 0003266618 00000 n 0003266840 00000 n 0003281162 00000 n 0003274558 00000 n 0003274614 00000 n 0003274670 00000 n 0003274726 00000 n 0003274782 00000 n 0003274838 00000 n 0003274894 00000 n 0003275153 00000 n 0003275414 00000 n 0003275675 00000 n 0003275934 00000 n 0003276195 00000 n 0003276456 00000 n 0003276717 00000 n 0003276978 00000 n 0003277239 00000 n 0003277500 00000 n 0003277763 00000 n 0003278026 00000 n 0003278289 00000 n 0003278552 00000 n 0003278815 00000 n 0003279076 00000 n 0003279335 00000 n 0003279596 00000 n 0003279857 00000 n 0003280118 00000 n 0003280379 00000 n 0003280640 00000 n 0003280901 00000 n 0003281736 00000 n 0003289203 00000 n 0003281292 00000 n 0003281498 00000 n 0003290243 00000 n 0003289226 00000 n 0003289282 00000 n 0003289338 00000 n 0003289394 00000 n 0003289450 00000 n 0003289506 00000 n 0003289562 00000 n 0003289618 00000 n 0003289674 00000 n 0003289730 00000 n 0003289786 00000 n 0003290040 00000 n 0003290619 00000 n 0003296706 00000 n 0003290373 00000 n 0003290579 00000 n 0003296953 00000 n 0003296729 00000 n 0003296785 00000 n 0003296841 00000 n 0003296897 00000 n 0003297311 00000 n 0003300988 00000 n 0003297083 00000 n 0003297289 00000 n 0003301514 00000 n 0003301011 00000 n 0003301067 00000 n 0003301123 00000 n 0003301179 00000 n 0003301235 00000 n 0003301881 00000 n 0003305655 00000 n 0003301644 00000 n 0003301850 00000 n 0003305790 00000 n 0003305678 00000 n 0003305734 00000 n 0003306148 00000 n 0003309921 00000 n 0003305920 00000 n 0003306126 00000 n 0003310280 00000 n 0003309944 00000 n 0003310000 00000 n 0003310056 00000 n 0003310112 00000 n 0003310168 00000 n 0003310224 00000 n 0003310638 00000 n 0003314208 00000 n 0003310410 00000 n 0003310616 00000 n 0003314567 00000 n 0003314231 00000 n 0003314287 00000 n 0003314343 00000 n 0003314399 00000 n 0003314455 00000 n 0003314511 00000 n 0003314925 00000 n 0003318445 00000 n 0003314697 00000 n 0003314903 00000 n 0003318692 00000 n 0003318468 00000 n 0003318524 00000 n 0003318580 00000 n 0003318636 00000 n 0003319050 00000 n 0003324005 00000 n 0003318822 00000 n 0003319028 00000 n 0003324364 00000 n 0003324028 00000 n 0003324084 00000 n 0003324140 00000 n 0003324196 00000 n 0003324252 00000 n 0003324308 00000 n 0003324738 00000 n 0003332076 00000 n 0003324494 00000 n 0003324716 00000 n 0003335890 00000 n 0003332099 00000 n 0003332155 00000 n 0003332211 00000 n 0003332267 00000 n 0003332323 00000 n 0003332379 00000 n 0003332435 00000 n 0003332491 00000 n 0003332547 00000 n 0003332603 00000 n 0003332659 00000 n 0003332715 00000 n 0003332771 00000 n 0003333031 00000 n 0003333291 00000 n 0003333551 00000 n 0003333811 00000 n 0003334071 00000 n 0003334331 00000 n 0003334591 00000 n 0003334851 00000 n 0003335112 00000 n 0003335373 00000 n 0003335634 00000 n 0003336356 00000 n 0003343066 00000 n 0003336020 00000 n 0003336226 00000 n 0003343649 00000 n 0003343089 00000 n 0003343145 00000 n 0003343201 00000 n 0003343257 00000 n 0003343313 00000 n 0003343369 00000 n 0003343425 00000 n 0003343481 00000 n 0003343537 00000 n 0003343593 00000 n 0003344023 00000 n 0003347714 00000 n 0003343779 00000 n 0003344001 00000 n 0003352761 00000 n 0003347737 00000 n 0003347793 00000 n 0003347849 00000 n 0003347905 00000 n 0003347961 00000 n 0003348017 00000 n 0003348073 00000 n 0003348129 00000 n 0003348185 00000 n 0003348241 00000 n 0003348297 00000 n 0003348559 00000 n 0003348821 00000 n 0003349083 00000 n 0003349345 00000 n 0003349607 00000 n 0003349869 00000 n 0003350131 00000 n 0003350394 00000 n 0003350657 00000 n 0003350920 00000 n 0003351183 00000 n 0003351446 00000 n 0003351709 00000 n 0003351972 00000 n 0003352235 00000 n 0003352498 00000 n 0003353288 00000 n 0003358119 00000 n 0003352891 00000 n 0003353113 00000 n 0003378149 00000 n 0003358142 00000 n 0003358405 00000 n 0003358668 00000 n 0003358931 00000 n 0003359194 00000 n 0003359457 00000 n 0003359720 00000 n 0003359983 00000 n 0003360246 00000 n 0003360523 00000 n 0003360804 00000 n 0003361068 00000 n 0003361331 00000 n 0003361594 00000 n 0003361866 00000 n 0003362144 00000 n 0003362420 00000 n 0003362683 00000 n 0003362946 00000 n 0003363214 00000 n 0003363477 00000 n 0003363740 00000 n 0003364003 00000 n 0003364266 00000 n 0003364529 00000 n 0003364792 00000 n 0003365055 00000 n 0003365318 00000 n 0003365581 00000 n 0003365844 00000 n 0003366107 00000 n 0003366370 00000 n 0003366633 00000 n 0003366896 00000 n 0003367159 00000 n 0003367422 00000 n 0003367685 00000 n 0003367956 00000 n 0003368219 00000 n 0003368482 00000 n 0003368738 00000 n 0003369001 00000 n 0003369264 00000 n 0003369527 00000 n 0003369790 00000 n 0003370053 00000 n 0003370316 00000 n 0003370572 00000 n 0003370835 00000 n 0003371098 00000 n 0003371361 00000 n 0003371624 00000 n 0003371887 00000 n 0003372150 00000 n 0003372413 00000 n 0003372680 00000 n 0003372947 00000 n 0003373210 00000 n 0003373473 00000 n 0003373736 00000 n 0003374008 00000 n 0003374280 00000 n 0003374548 00000 n 0003374821 00000 n 0003375107 00000 n 0003375380 00000 n 0003375560 00000 n 0003375840 00000 n 0003376020 00000 n 0003376300 00000 n 0003376573 00000 n 0003376836 00000 n 0003377099 00000 n 0003377362 00000 n 0003377625 00000 n 0003377893 00000 n 0003379175 00000 n 0003386751 00000 n 0003378279 00000 n 0003378469 00000 n 0003387110 00000 n 0003386774 00000 n 0003386830 00000 n 0003386886 00000 n 0003386942 00000 n 0003386998 00000 n 0003387054 00000 n 0003387468 00000 n 0003391606 00000 n 0003387240 00000 n 0003387446 00000 n 0003392251 00000 n 0003391629 00000 n 0003391685 00000 n 0003391741 00000 n 0003391797 00000 n 0003391853 00000 n 0003392062 00000 n 0003392627 00000 n 0003398949 00000 n 0003392381 00000 n 0003392587 00000 n 0003399196 00000 n 0003398972 00000 n 0003399028 00000 n 0003399084 00000 n 0003399140 00000 n 0003399554 00000 n 0003405306 00000 n 0003399326 00000 n 0003399532 00000 n 0003405441 00000 n 0003405329 00000 n 0003405385 00000 n 0003405815 00000 n 0003411744 00000 n 0003405571 00000 n 0003405793 00000 n 0003412209 00000 n 0003411767 00000 n 0003411823 00000 n 0003411879 00000 n 0003411935 00000 n 0003411991 00000 n 0003412576 00000 n 0003421206 00000 n 0003412339 00000 n 0003412545 00000 n 0003421873 00000 n 0003421229 00000 n 0003421285 00000 n 0003421341 00000 n 0003421397 00000 n 0003421453 00000 n 0003421509 00000 n 0003421565 00000 n 0003421621 00000 n 0003421677 00000 n 0003422240 00000 n 0003427621 00000 n 0003422003 00000 n 0003422209 00000 n 0003428031 00000 n 0003427644 00000 n 0003427700 00000 n 0003427756 00000 n 0003428398 00000 n 0003432695 00000 n 0003428161 00000 n 0003428367 00000 n 0003433086 00000 n 0003432718 00000 n 0003432774 00000 n 0003432830 00000 n 0003433453 00000 n 0003438381 00000 n 0003433216 00000 n 0003433422 00000 n 0003438516 00000 n 0003438404 00000 n 0003438460 00000 n 0003438874 00000 n 0003442850 00000 n 0003438646 00000 n 0003438852 00000 n 0003442985 00000 n 0003442873 00000 n 0003442929 00000 n 0003443343 00000 n 0003446815 00000 n 0003443115 00000 n 0003443321 00000 n 0003446950 00000 n 0003446838 00000 n 0003446894 00000 n 0003447308 00000 n 0003450561 00000 n 0003447080 00000 n 0003447286 00000 n 0003450808 00000 n 0003450584 00000 n 0003450640 00000 n 0003450696 00000 n 0003450752 00000 n 0003451166 00000 n 0003454987 00000 n 0003450938 00000 n 0003451144 00000 n 0003455122 00000 n 0003455010 00000 n 0003455066 00000 n 0003455480 00000 n 0003458901 00000 n 0003455252 00000 n 0003455458 00000 n 0003459148 00000 n 0003458924 00000 n 0003458980 00000 n 0003459036 00000 n 0003459092 00000 n 0003459506 00000 n 0003463101 00000 n 0003459278 00000 n 0003459484 00000 n 0003463994 00000 n 0003463124 00000 n 0003463180 00000 n 0003463236 00000 n 0003463292 00000 n 0003463348 00000 n 0003463404 00000 n 0003463460 00000 n 0003463720 00000 n 0003464370 00000 n 0003468115 00000 n 0003464124 00000 n 0003464330 00000 n 0003469644 00000 n 0003468138 00000 n 0003468194 00000 n 0003468250 00000 n 0003468306 00000 n 0003468362 00000 n 0003468418 00000 n 0003468474 00000 n 0003468530 00000 n 0003468586 00000 n 0003468856 00000 n 0003469128 00000 n 0003469384 00000 n 0003470038 00000 n 0003474698 00000 n 0003469774 00000 n 0003469980 00000 n 0003475042 00000 n 0003474721 00000 n 0003474777 00000 n 0003474833 00000 n 0003475409 00000 n 0003480450 00000 n 0003475172 00000 n 0003475378 00000 n 0003480729 00000 n 0003480473 00000 n 0003481096 00000 n 0003485190 00000 n 0003480859 00000 n 0003481065 00000 n 0003485529 00000 n 0003485213 00000 n 0003485269 00000 n 0003485325 00000 n 0003485896 00000 n 0003490919 00000 n 0003485659 00000 n 0003485865 00000 n 0003491318 00000 n 0003490942 00000 n 0003490998 00000 n 0003491054 00000 n 0003491685 00000 n 0003495783 00000 n 0003491448 00000 n 0003491654 00000 n 0003496103 00000 n 0003495806 00000 n 0003495862 00000 n 0003495918 00000 n 0003496470 00000 n 0003500943 00000 n 0003496233 00000 n 0003496439 00000 n 0003501190 00000 n 0003500966 00000 n 0003501022 00000 n 0003501078 00000 n 0003501134 00000 n 0003501548 00000 n 0003506179 00000 n 0003501320 00000 n 0003501526 00000 n 0003506538 00000 n 0003506202 00000 n 0003506258 00000 n 0003506314 00000 n 0003506370 00000 n 0003506426 00000 n 0003506482 00000 n 0003506912 00000 n 0003514457 00000 n 0003506668 00000 n 0003506890 00000 n 0003515040 00000 n 0003514480 00000 n 0003514536 00000 n 0003514592 00000 n 0003514648 00000 n 0003514704 00000 n 0003514760 00000 n 0003514816 00000 n 0003514872 00000 n 0003514928 00000 n 0003514984 00000 n 0003515398 00000 n 0003521678 00000 n 0003515170 00000 n 0003515376 00000 n 0003521813 00000 n 0003521701 00000 n 0003521757 00000 n 0003522171 00000 n 0003525894 00000 n 0003521943 00000 n 0003522149 00000 n 0003525917 00000 n 0003526265 00000 n 0003531587 00000 n 0003526047 00000 n 0003526243 00000 n 0003531722 00000 n 0003531610 00000 n 0003531666 00000 n 0003532080 00000 n 0003535332 00000 n 0003531852 00000 n 0003532058 00000 n 0003535467 00000 n 0003535355 00000 n 0003535411 00000 n 0003535825 00000 n 0003539082 00000 n 0003535597 00000 n 0003535803 00000 n 0003539476 00000 n 0003539105 00000 n 0003539161 00000 n 0003539217 00000 n 0003539843 00000 n 0003543531 00000 n 0003539606 00000 n 0003539812 00000 n 0003543666 00000 n 0003543554 00000 n 0003543610 00000 n 0003544024 00000 n 0003547000 00000 n 0003543796 00000 n 0003544002 00000 n 0003547135 00000 n 0003547023 00000 n 0003547079 00000 n 0003547493 00000 n 0003551117 00000 n 0003547265 00000 n 0003547471 00000 n 0003551623 00000 n 0003551140 00000 n 0003551196 00000 n 0003551252 00000 n 0003551308 00000 n 0003551364 00000 n 0003551990 00000 n 0003556193 00000 n 0003551753 00000 n 0003551959 00000 n 0003557139 00000 n 0003556216 00000 n 0003556272 00000 n 0003556328 00000 n 0003556587 00000 n 0003556860 00000 n 0003557524 00000 n 0003562029 00000 n 0003557269 00000 n 0003557475 00000 n 0003562536 00000 n 0003562052 00000 n 0003562108 00000 n 0003562164 00000 n 0003562220 00000 n 0003562276 00000 n 0003562903 00000 n 0003567423 00000 n 0003562666 00000 n 0003562872 00000 n 0003568302 00000 n 0003567446 00000 n 0003567502 00000 n 0003567558 00000 n 0003567614 00000 n 0003567670 00000 n 0003567726 00000 n 0003567782 00000 n 0003568042 00000 n 0003568678 00000 n 0003573292 00000 n 0003568432 00000 n 0003568638 00000 n 0003573539 00000 n 0003573315 00000 n 0003573371 00000 n 0003573427 00000 n 0003573483 00000 n 0003573897 00000 n 0003576878 00000 n 0003573669 00000 n 0003573875 00000 n 0003577013 00000 n 0003576901 00000 n 0003576957 00000 n 0003577371 00000 n 0003581330 00000 n 0003577143 00000 n 0003577349 00000 n 0003581737 00000 n 0003581353 00000 n 0003581409 00000 n 0003581465 00000 n 0003582104 00000 n 0003585881 00000 n 0003581867 00000 n 0003582073 00000 n 0003586016 00000 n 0003585904 00000 n 0003585960 00000 n 0003586374 00000 n 0003590433 00000 n 0003586146 00000 n 0003586352 00000 n 0003590568 00000 n 0003590456 00000 n 0003590512 00000 n 0003590926 00000 n 0003594575 00000 n 0003590698 00000 n 0003590904 00000 n 0003594934 00000 n 0003594598 00000 n 0003594654 00000 n 0003594710 00000 n 0003594766 00000 n 0003594822 00000 n 0003594878 00000 n 0003595292 00000 n 0003601051 00000 n 0003595064 00000 n 0003595270 00000 n 0003601754 00000 n 0003601074 00000 n 0003601130 00000 n 0003601186 00000 n 0003601242 00000 n 0003601298 00000 n 0003601354 00000 n 0003601410 00000 n 0003601466 00000 n 0003601522 00000 n 0003602153 00000 n 0003607328 00000 n 0003601884 00000 n 0003602122 00000 n 0003607799 00000 n 0003607351 00000 n 0003607407 00000 n 0003607463 00000 n 0003607519 00000 n 0003607575 00000 n 0003607631 00000 n 0003607687 00000 n 0003607743 00000 n 0003608157 00000 n 0003612257 00000 n 0003607929 00000 n 0003608135 00000 n 0003613267 00000 n 0003612280 00000 n 0003612336 00000 n 0003612392 00000 n 0003612448 00000 n 0003612504 00000 n 0003612790 00000 n 0003613063 00000 n 0003613652 00000 n 0003618826 00000 n 0003613397 00000 n 0003613603 00000 n 0003618961 00000 n 0003618849 00000 n 0003618905 00000 n 0003619319 00000 n 0003623421 00000 n 0003619091 00000 n 0003619297 00000 n 0003623760 00000 n 0003623444 00000 n 0003623500 00000 n 0003623556 00000 n 0003624127 00000 n 0003628923 00000 n 0003623890 00000 n 0003624096 00000 n 0003629636 00000 n 0003628946 00000 n 0003629002 00000 n 0003629058 00000 n 0003629114 00000 n 0003629170 00000 n 0003629432 00000 n 0003630012 00000 n 0003635055 00000 n 0003629766 00000 n 0003629972 00000 n 0003635788 00000 n 0003635078 00000 n 0003635134 00000 n 0003635190 00000 n 0003635246 00000 n 0003635302 00000 n 0003635358 00000 n 0003635414 00000 n 0003635470 00000 n 0003635526 00000 n 0003636155 00000 n 0003640066 00000 n 0003635918 00000 n 0003636124 00000 n 0003641385 00000 n 0003640089 00000 n 0003640145 00000 n 0003640201 00000 n 0003640257 00000 n 0003640313 00000 n 0003640369 00000 n 0003640425 00000 n 0003640687 00000 n 0003640912 00000 n 0003641181 00000 n 0003641779 00000 n 0003648272 00000 n 0003641515 00000 n 0003641721 00000 n 0003648407 00000 n 0003648295 00000 n 0003648351 00000 n 0003648765 00000 n 0003652605 00000 n 0003648537 00000 n 0003648743 00000 n 0003653148 00000 n 0003652628 00000 n 0003652684 00000 n 0003652740 00000 n 0003652944 00000 n 0003653524 00000 n 0003657836 00000 n 0003653278 00000 n 0003653484 00000 n 0003657971 00000 n 0003657859 00000 n 0003657915 00000 n 0003658329 00000 n 0003662181 00000 n 0003658101 00000 n 0003658307 00000 n 0003664536 00000 n 0003662204 00000 n 0003662260 00000 n 0003662316 00000 n 0003662372 00000 n 0003662428 00000 n 0003662484 00000 n 0003662540 00000 n 0003662789 00000 n 0003663046 00000 n 0003663303 00000 n 0003663560 00000 n 0003663834 00000 n 0003664091 00000 n 0003664348 00000 n 0003664966 00000 n 0003669675 00000 n 0003664666 00000 n 0003664872 00000 n 0003678758 00000 n 0003669698 00000 n 0003669754 00000 n 0003669810 00000 n 0003669866 00000 n 0003669922 00000 n 0003669978 00000 n 0003670034 00000 n 0003670090 00000 n 0003670146 00000 n 0003670202 00000 n 0003670258 00000 n 0003670314 00000 n 0003670370 00000 n 0003670630 00000 n 0003670890 00000 n 0003671150 00000 n 0003671410 00000 n 0003671670 00000 n 0003671930 00000 n 0003672190 00000 n 0003672450 00000 n 0003672711 00000 n 0003672972 00000 n 0003673233 00000 n 0003673494 00000 n 0003673748 00000 n 0003674009 00000 n 0003674270 00000 n 0003674531 00000 n 0003674792 00000 n 0003675053 00000 n 0003675314 00000 n 0003675575 00000 n 0003675836 00000 n 0003676097 00000 n 0003676360 00000 n 0003676631 00000 n 0003676899 00000 n 0003677160 00000 n 0003677435 00000 n 0003677714 00000 n 0003677975 00000 n 0003678236 00000 n 0003678497 00000 n 0003679404 00000 n 0003685960 00000 n 0003678888 00000 n 0003679094 00000 n 0003704233 00000 n 0003685983 00000 n 0003686039 00000 n 0003686095 00000 n 0003686151 00000 n 0003686207 00000 n 0003686468 00000 n 0003686729 00000 n 0003686990 00000 n 0003687251 00000 n 0003687512 00000 n 0003687773 00000 n 0003688036 00000 n 0003688297 00000 n 0003688558 00000 n 0003688819 00000 n 0003689080 00000 n 0003689350 00000 n 0003689624 00000 n 0003689899 00000 n 0003690177 00000 n 0003690438 00000 n 0003690705 00000 n 0003690979 00000 n 0003691247 00000 n 0003691519 00000 n 0003691791 00000 n 0003692061 00000 n 0003692333 00000 n 0003692606 00000 n 0003692878 00000 n 0003693151 00000 n 0003693421 00000 n 0003693693 00000 n 0003693964 00000 n 0003694239 00000 n 0003694515 00000 n 0003694794 00000 n 0003695062 00000 n 0003695335 00000 n 0003695596 00000 n 0003695850 00000 n 0003696111 00000 n 0003696372 00000 n 0003696633 00000 n 0003696894 00000 n 0003697155 00000 n 0003697416 00000 n 0003697677 00000 n 0003697938 00000 n 0003698199 00000 n 0003698460 00000 n 0003698721 00000 n 0003698982 00000 n 0003699243 00000 n 0003699504 00000 n 0003699765 00000 n 0003700030 00000 n 0003700295 00000 n 0003700568 00000 n 0003700829 00000 n 0003701090 00000 n 0003701351 00000 n 0003701628 00000 n 0003701889 00000 n 0003702150 00000 n 0003702411 00000 n 0003702672 00000 n 0003702933 00000 n 0003703194 00000 n 0003703455 00000 n 0003703716 00000 n 0003703977 00000 n 0003705203 00000 n 0003711310 00000 n 0003704363 00000 n 0003704569 00000 n 0003711865 00000 n 0003711333 00000 n 0003711389 00000 n 0003711445 00000 n 0003711501 00000 n 0003711557 00000 n 0003711613 00000 n 0003711669 00000 n 0003712248 00000 n 0003717462 00000 n 0003711995 00000 n 0003712217 00000 n 0003717933 00000 n 0003717485 00000 n 0003717541 00000 n 0003717597 00000 n 0003717653 00000 n 0003717709 00000 n 0003717765 00000 n 0003717821 00000 n 0003717877 00000 n 0003718291 00000 n 0003725730 00000 n 0003718063 00000 n 0003718269 00000 n 0003726089 00000 n 0003725753 00000 n 0003725809 00000 n 0003725865 00000 n 0003725921 00000 n 0003725977 00000 n 0003726033 00000 n 0003726447 00000 n 0003730613 00000 n 0003726219 00000 n 0003726425 00000 n 0003730860 00000 n 0003730636 00000 n 0003730692 00000 n 0003730748 00000 n 0003730804 00000 n 0003731250 00000 n 0003734746 00000 n 0003730990 00000 n 0003731228 00000 n 0003734993 00000 n 0003734769 00000 n 0003734825 00000 n 0003734881 00000 n 0003734937 00000 n 0003735383 00000 n 0003739473 00000 n 0003735123 00000 n 0003735361 00000 n 0003739881 00000 n 0003739496 00000 n 0003739552 00000 n 0003739608 00000 n 0003740264 00000 n 0003743719 00000 n 0003740011 00000 n 0003740233 00000 n 0003743854 00000 n 0003743742 00000 n 0003743798 00000 n 0003744244 00000 n 0003748689 00000 n 0003743984 00000 n 0003744222 00000 n 0003749020 00000 n 0003748712 00000 n 0003748768 00000 n 0003748824 00000 n 0003749403 00000 n 0003752773 00000 n 0003749150 00000 n 0003749372 00000 n 0003753557 00000 n 0003752796 00000 n 0003752852 00000 n 0003752908 00000 n 0003752964 00000 n 0003753020 00000 n 0003753280 00000 n 0003753933 00000 n 0003757865 00000 n 0003753687 00000 n 0003753893 00000 n 0003758112 00000 n 0003757888 00000 n 0003757944 00000 n 0003758000 00000 n 0003758056 00000 n 0003758486 00000 n 0003762313 00000 n 0003758242 00000 n 0003758464 00000 n 0003762708 00000 n 0003762336 00000 n 0003762392 00000 n 0003762448 00000 n 0003763075 00000 n 0003767017 00000 n 0003762838 00000 n 0003763044 00000 n 0003767152 00000 n 0003767040 00000 n 0003767096 00000 n 0003767526 00000 n 0003771778 00000 n 0003767282 00000 n 0003767504 00000 n 0003772523 00000 n 0003771801 00000 n 0003771857 00000 n 0003771913 00000 n 0003771969 00000 n 0003772025 00000 n 0003772081 00000 n 0003772137 00000 n 0003772193 00000 n 0003772249 00000 n 0003772906 00000 n 0003776939 00000 n 0003772653 00000 n 0003772875 00000 n 0003777556 00000 n 0003776962 00000 n 0003777018 00000 n 0003777074 00000 n 0003777130 00000 n 0003777186 00000 n 0003777242 00000 n 0003777298 00000 n 0003777955 00000 n 0003783061 00000 n 0003777686 00000 n 0003777924 00000 n 0003784215 00000 n 0003783084 00000 n 0003783140 00000 n 0003783196 00000 n 0003783252 00000 n 0003783308 00000 n 0003783364 00000 n 0003783420 00000 n 0003783685 00000 n 0003783950 00000 n 0003784632 00000 n 0003789892 00000 n 0003784345 00000 n 0003784583 00000 n 0003790027 00000 n 0003789915 00000 n 0003789971 00000 n 0003790401 00000 n 0003793493 00000 n 0003790157 00000 n 0003790379 00000 n 0003794005 00000 n 0003793516 00000 n 0003793572 00000 n 0003793628 00000 n 0003793684 00000 n 0003793740 00000 n 0003794372 00000 n 0003797946 00000 n 0003794135 00000 n 0003794341 00000 n 0003798234 00000 n 0003797969 00000 n 0003798591 00000 n 0003801816 00000 n 0003798364 00000 n 0003798560 00000 n 0003802324 00000 n 0003801839 00000 n 0003801895 00000 n 0003801951 00000 n 0003802007 00000 n 0003802063 00000 n 0003802691 00000 n 0003807854 00000 n 0003802454 00000 n 0003802660 00000 n 0003808473 00000 n 0003807877 00000 n 0003807933 00000 n 0003807989 00000 n 0003808045 00000 n 0003808101 00000 n 0003808157 00000 n 0003808213 00000 n 0003808856 00000 n 0003814308 00000 n 0003808603 00000 n 0003808825 00000 n 0003814331 00000 n 0003814695 00000 n 0003818591 00000 n 0003814461 00000 n 0003814673 00000 n 0003818838 00000 n 0003818614 00000 n 0003818670 00000 n 0003818726 00000 n 0003818782 00000 n 0003819196 00000 n 0003822243 00000 n 0003818968 00000 n 0003819174 00000 n 0003822490 00000 n 0003822266 00000 n 0003822322 00000 n 0003822378 00000 n 0003822434 00000 n 0003822848 00000 n 0003825966 00000 n 0003822620 00000 n 0003822826 00000 n 0003826437 00000 n 0003825989 00000 n 0003826045 00000 n 0003826101 00000 n 0003826157 00000 n 0003826213 00000 n 0003826269 00000 n 0003826325 00000 n 0003826381 00000 n 0003826811 00000 n 0003832047 00000 n 0003826567 00000 n 0003826789 00000 n 0003832787 00000 n 0003832070 00000 n 0003832126 00000 n 0003832182 00000 n 0003832238 00000 n 0003832294 00000 n 0003832350 00000 n 0003832406 00000 n 0003832462 00000 n 0003832518 00000 n 0003833170 00000 n 0003838585 00000 n 0003832917 00000 n 0003833139 00000 n 0003839547 00000 n 0003838608 00000 n 0003838664 00000 n 0003838720 00000 n 0003838776 00000 n 0003838832 00000 n 0003838888 00000 n 0003838944 00000 n 0003839000 00000 n 0003839056 00000 n 0003839112 00000 n 0003839168 00000 n 0003839224 00000 n 0003839280 00000 n 0003839930 00000 n 0003844225 00000 n 0003839677 00000 n 0003839899 00000 n 0003844859 00000 n 0003844248 00000 n 0003844304 00000 n 0003844360 00000 n 0003844416 00000 n 0003844472 00000 n 0003844528 00000 n 0003844584 00000 n 0003845226 00000 n 0003850568 00000 n 0003844989 00000 n 0003845195 00000 n 0003851411 00000 n 0003850591 00000 n 0003850647 00000 n 0003850703 00000 n 0003850759 00000 n 0003850815 00000 n 0003850871 00000 n 0003850927 00000 n 0003850983 00000 n 0003851039 00000 n 0003851095 00000 n 0003851151 00000 n 0003851810 00000 n 0003858490 00000 n 0003851541 00000 n 0003851779 00000 n 0003858849 00000 n 0003858513 00000 n 0003858569 00000 n 0003858625 00000 n 0003858681 00000 n 0003858737 00000 n 0003858793 00000 n 0003859223 00000 n 0003864856 00000 n 0003858979 00000 n 0003859201 00000 n 0003865215 00000 n 0003864879 00000 n 0003864935 00000 n 0003864991 00000 n 0003865047 00000 n 0003865103 00000 n 0003865159 00000 n 0003865589 00000 n 0003870100 00000 n 0003865345 00000 n 0003865567 00000 n 0003870235 00000 n 0003870123 00000 n 0003870179 00000 n 0003870625 00000 n 0003875840 00000 n 0003870365 00000 n 0003870603 00000 n 0003875863 00000 n 0003876243 00000 n 0003880110 00000 n 0003875993 00000 n 0003876221 00000 n 0003880357 00000 n 0003880133 00000 n 0003880189 00000 n 0003880245 00000 n 0003880301 00000 n 0003880747 00000 n 0003886065 00000 n 0003880487 00000 n 0003880725 00000 n 0003886200 00000 n 0003886088 00000 n 0003886144 00000 n 0003886590 00000 n 0003890926 00000 n 0003886330 00000 n 0003886568 00000 n 0003891772 00000 n 0003890949 00000 n 0003891005 00000 n 0003891061 00000 n 0003891117 00000 n 0003891173 00000 n 0003891229 00000 n 0003891285 00000 n 0003891341 00000 n 0003891397 00000 n 0003891453 00000 n 0003891509 00000 n 0003892155 00000 n 0003897310 00000 n 0003891902 00000 n 0003892124 00000 n 0003898005 00000 n 0003897333 00000 n 0003897389 00000 n 0003897445 00000 n 0003897501 00000 n 0003897557 00000 n 0003897613 00000 n 0003897669 00000 n 0003897725 00000 n 0003897781 00000 n 0003897837 00000 n 0003897893 00000 n 0003897949 00000 n 0003898379 00000 n 0003905139 00000 n 0003898135 00000 n 0003898357 00000 n 0003905533 00000 n 0003905162 00000 n 0003905218 00000 n 0003905274 00000 n 0003905932 00000 n 0003911181 00000 n 0003905663 00000 n 0003905901 00000 n 0003911316 00000 n 0003911204 00000 n 0003911260 00000 n 0003911706 00000 n 0003916162 00000 n 0003911446 00000 n 0003911684 00000 n 0003916786 00000 n 0003916185 00000 n 0003916241 00000 n 0003916297 00000 n 0003916353 00000 n 0003916409 00000 n 0003916465 00000 n 0003916521 00000 n 0003917153 00000 n 0003922841 00000 n 0003916916 00000 n 0003917122 00000 n 0003923139 00000 n 0003922864 00000 n 0003923512 00000 n 0003927018 00000 n 0003923269 00000 n 0003923481 00000 n 0003927153 00000 n 0003927041 00000 n 0003927097 00000 n 0003927527 00000 n 0003930402 00000 n 0003927283 00000 n 0003927505 00000 n 0003930690 00000 n 0003930425 00000 n 0003931063 00000 n 0003935143 00000 n 0003930820 00000 n 0003931032 00000 n 0003935804 00000 n 0003935166 00000 n 0003935222 00000 n 0003935278 00000 n 0003935539 00000 n 0003936196 00000 n 0003940930 00000 n 0003935934 00000 n 0003936156 00000 n 0003941330 00000 n 0003940953 00000 n 0003941009 00000 n 0003941065 00000 n 0003941713 00000 n 0003946403 00000 n 0003941460 00000 n 0003941682 00000 n 0003946426 00000 n 0003946790 00000 n 0003950344 00000 n 0003946556 00000 n 0003946768 00000 n 0003950591 00000 n 0003950367 00000 n 0003950423 00000 n 0003950479 00000 n 0003950535 00000 n 0003950965 00000 n 0003955992 00000 n 0003950721 00000 n 0003950943 00000 n 0003968312 00000 n 0003956015 00000 n 0003956071 00000 n 0003956127 00000 n 0003956183 00000 n 0003956239 00000 n 0003956511 00000 n 0003956782 00000 n 0003956966 00000 n 0003957253 00000 n 0003957539 00000 n 0003957823 00000 n 0003958102 00000 n 0003958369 00000 n 0003958645 00000 n 0003958924 00000 n 0003959201 00000 n 0003959464 00000 n 0003959727 00000 n 0003960011 00000 n 0003960298 00000 n 0003960575 00000 n 0003960841 00000 n 0003961117 00000 n 0003961303 00000 n 0003961482 00000 n 0003961757 00000 n 0003962036 00000 n 0003962319 00000 n 0003962602 00000 n 0003962780 00000 n 0003963061 00000 n 0003963342 00000 n 0003963624 00000 n 0003963906 00000 n 0003964174 00000 n 0003964434 00000 n 0003964717 00000 n 0003964991 00000 n 0003965282 00000 n 0003965558 00000 n 0003965829 00000 n 0003966109 00000 n 0003966382 00000 n 0003966663 00000 n 0003966949 00000 n 0003967225 00000 n 0003967403 00000 n 0003967587 00000 n 0003967861 00000 n 0003968128 00000 n 0003969084 00000 n 0003975027 00000 n 0003968442 00000 n 0003968648 00000 n 0003976050 00000 n 0003975050 00000 n 0003975106 00000 n 0003975162 00000 n 0003975218 00000 n 0003975274 00000 n 0003975330 00000 n 0003975386 00000 n 0003975442 00000 n 0003975498 00000 n 0003975771 00000 n 0003976426 00000 n 0003980407 00000 n 0003976180 00000 n 0003976386 00000 n 0003981900 00000 n 0003980430 00000 n 0003980486 00000 n 0003980542 00000 n 0003980598 00000 n 0003980654 00000 n 0003980710 00000 n 0003980766 00000 n 0003980822 00000 n 0003980878 00000 n 0003980934 00000 n 0003980990 00000 n 0003981046 00000 n 0003981102 00000 n 0003981363 00000 n 0003981633 00000 n 0003982285 00000 n 0003987038 00000 n 0003982030 00000 n 0003982236 00000 n 0003987285 00000 n 0003987061 00000 n 0003987117 00000 n 0003987173 00000 n 0003987229 00000 n 0003987643 00000 n 0003990630 00000 n 0003987415 00000 n 0003987621 00000 n 0003990877 00000 n 0003990653 00000 n 0003990709 00000 n 0003990765 00000 n 0003990821 00000 n 0003991235 00000 n 0003993785 00000 n 0003991007 00000 n 0003991213 00000 n 0003994082 00000 n 0003993808 00000 n 0003994439 00000 n 0003996678 00000 n 0003994212 00000 n 0003994408 00000 n 0003996813 00000 n 0003996701 00000 n 0003996757 00000 n 0003997171 00000 n 0003999169 00000 n 0003996943 00000 n 0003997149 00000 n 0004000345 00000 n 0003999192 00000 n 0003999248 00000 n 0003999304 00000 n 0003999360 00000 n 0003999416 00000 n 0003999696 00000 n 0003999910 00000 n 0004000125 00000 n 0004000739 00000 n 0004005170 00000 n 0004000475 00000 n 0004000681 00000 n 0004005417 00000 n 0004005193 00000 n 0004005249 00000 n 0004005305 00000 n 0004005361 00000 n 0004005775 00000 n 0004009086 00000 n 0004005547 00000 n 0004005753 00000 n 0004009949 00000 n 0004009109 00000 n 0004009165 00000 n 0004009221 00000 n 0004009475 00000 n 0004009729 00000 n 0004010334 00000 n 0004013364 00000 n 0004010079 00000 n 0004010285 00000 n 0004013890 00000 n 0004013387 00000 n 0004013443 00000 n 0004013499 00000 n 0004013555 00000 n 0004013611 00000 n 0004014257 00000 n 0004017646 00000 n 0004014020 00000 n 0004014226 00000 n 0004017893 00000 n 0004017669 00000 n 0004017725 00000 n 0004017781 00000 n 0004017837 00000 n 0004018251 00000 n 0004021308 00000 n 0004018023 00000 n 0004018229 00000 n 0004021708 00000 n 0004021331 00000 n 0004021387 00000 n 0004021443 00000 n 0004022075 00000 n 0004024915 00000 n 0004021838 00000 n 0004022044 00000 n 0004025429 00000 n 0004024938 00000 n 0004024994 00000 n 0004025050 00000 n 0004025106 00000 n 0004025162 00000 n 0004025796 00000 n 0004028687 00000 n 0004025559 00000 n 0004025765 00000 n 0004029577 00000 n 0004028710 00000 n 0004028766 00000 n 0004028822 00000 n 0004028878 00000 n 0004028934 00000 n 0004028990 00000 n 0004029046 00000 n 0004029306 00000 n 0004029953 00000 n 0004035354 00000 n 0004029707 00000 n 0004029913 00000 n 0004035884 00000 n 0004035377 00000 n 0004035433 00000 n 0004035489 00000 n 0004035545 00000 n 0004035601 00000 n 0004036251 00000 n 0004040614 00000 n 0004036014 00000 n 0004036220 00000 n 0004040749 00000 n 0004040637 00000 n 0004040693 00000 n 0004041107 00000 n 0004044635 00000 n 0004040879 00000 n 0004041085 00000 n 0004045050 00000 n 0004044658 00000 n 0004044714 00000 n 0004044770 00000 n 0004045417 00000 n 0004049910 00000 n 0004045180 00000 n 0004045386 00000 n 0004049933 00000 n 0004050281 00000 n 0004052629 00000 n 0004050063 00000 n 0004050259 00000 n 0004053100 00000 n 0004052652 00000 n 0004052708 00000 n 0004052764 00000 n 0004052820 00000 n 0004052876 00000 n 0004052932 00000 n 0004052988 00000 n 0004053044 00000 n 0004053490 00000 n 0004058276 00000 n 0004053230 00000 n 0004053468 00000 n 0004060580 00000 n 0004058299 00000 n 0004058355 00000 n 0004058411 00000 n 0004058467 00000 n 0004058523 00000 n 0004058579 00000 n 0004058635 00000 n 0004058691 00000 n 0004058747 00000 n 0004058803 00000 n 0004058859 00000 n 0004059118 00000 n 0004059377 00000 n 0004059636 00000 n 0004059895 00000 n 0004060154 00000 n 0004060372 00000 n 0004061017 00000 n 0004066609 00000 n 0004060710 00000 n 0004060932 00000 n 0004077358 00000 n 0004066632 00000 n 0004066688 00000 n 0004066744 00000 n 0004066800 00000 n 0004066856 00000 n 0004066912 00000 n 0004066968 00000 n 0004067227 00000 n 0004067486 00000 n 0004067745 00000 n 0004068005 00000 n 0004068265 00000 n 0004068525 00000 n 0004068785 00000 n 0004069045 00000 n 0004069305 00000 n 0004069565 00000 n 0004069825 00000 n 0004070085 00000 n 0004070345 00000 n 0004070605 00000 n 0004070865 00000 n 0004071125 00000 n 0004071385 00000 n 0004071645 00000 n 0004071905 00000 n 0004072165 00000 n 0004072425 00000 n 0004072685 00000 n 0004072945 00000 n 0004073205 00000 n 0004073465 00000 n 0004073725 00000 n 0004073985 00000 n 0004074245 00000 n 0004074505 00000 n 0004074765 00000 n 0004075025 00000 n 0004075278 00000 n 0004075538 00000 n 0004075798 00000 n 0004076058 00000 n 0004076318 00000 n 0004076578 00000 n 0004076838 00000 n 0004077098 00000 n 0004078076 00000 n 0004084392 00000 n 0004077488 00000 n 0004077694 00000 n 0004084835 00000 n 0004084415 00000 n 0004084471 00000 n 0004084527 00000 n 0004084583 00000 n 0004084639 00000 n 0004085202 00000 n 0004090571 00000 n 0004084965 00000 n 0004085171 00000 n 0004090706 00000 n 0004090594 00000 n 0004090650 00000 n 0004091064 00000 n 0004096648 00000 n 0004090836 00000 n 0004091042 00000 n 0004097231 00000 n 0004096671 00000 n 0004096727 00000 n 0004096783 00000 n 0004096839 00000 n 0004096895 00000 n 0004096951 00000 n 0004097007 00000 n 0004097063 00000 n 0004097119 00000 n 0004097175 00000 n 0004097589 00000 n 0004105013 00000 n 0004097361 00000 n 0004097567 00000 n 0004105372 00000 n 0004105036 00000 n 0004105092 00000 n 0004105148 00000 n 0004105204 00000 n 0004105260 00000 n 0004105316 00000 n 0004105730 00000 n 0004110428 00000 n 0004105502 00000 n 0004105708 00000 n 0004111062 00000 n 0004110451 00000 n 0004110507 00000 n 0004110563 00000 n 0004110619 00000 n 0004110675 00000 n 0004110731 00000 n 0004110787 00000 n 0004111429 00000 n 0004114750 00000 n 0004111192 00000 n 0004111398 00000 n 0004115141 00000 n 0004114773 00000 n 0004114829 00000 n 0004114885 00000 n 0004115508 00000 n 0004119925 00000 n 0004115271 00000 n 0004115477 00000 n 0004120060 00000 n 0004119948 00000 n 0004120004 00000 n 0004120418 00000 n 0004124831 00000 n 0004120190 00000 n 0004120396 00000 n 0004124854 00000 n 0004125202 00000 n 0004128838 00000 n 0004124984 00000 n 0004125180 00000 n 0004128973 00000 n 0004128861 00000 n 0004128917 00000 n 0004129331 00000 n 0004132250 00000 n 0004129103 00000 n 0004129309 00000 n 0004132609 00000 n 0004132273 00000 n 0004132329 00000 n 0004132385 00000 n 0004132441 00000 n 0004132497 00000 n 0004132553 00000 n 0004132967 00000 n 0004136560 00000 n 0004132739 00000 n 0004132945 00000 n 0004136695 00000 n 0004136583 00000 n 0004136639 00000 n 0004137053 00000 n 0004140383 00000 n 0004136825 00000 n 0004137031 00000 n 0004140518 00000 n 0004140406 00000 n 0004140462 00000 n 0004140876 00000 n 0004144372 00000 n 0004140648 00000 n 0004140854 00000 n 0004144879 00000 n 0004144395 00000 n 0004144451 00000 n 0004144507 00000 n 0004144563 00000 n 0004144619 00000 n 0004145246 00000 n 0004148649 00000 n 0004145009 00000 n 0004145215 00000 n 0004149412 00000 n 0004148672 00000 n 0004148728 00000 n 0004148784 00000 n 0004148840 00000 n 0004148896 00000 n 0004149152 00000 n 0004149788 00000 n 0004153668 00000 n 0004149542 00000 n 0004149748 00000 n 0004153803 00000 n 0004153691 00000 n 0004153747 00000 n 0004154161 00000 n 0004157634 00000 n 0004153933 00000 n 0004154139 00000 n 0004157769 00000 n 0004157657 00000 n 0004157713 00000 n 0004158127 00000 n 0004161538 00000 n 0004157899 00000 n 0004158105 00000 n 0004161561 00000 n 0004161909 00000 n 0004164892 00000 n 0004161691 00000 n 0004161887 00000 n 0004165027 00000 n 0004164915 00000 n 0004164971 00000 n 0004165385 00000 n 0004168743 00000 n 0004165157 00000 n 0004165363 00000 n 0004169508 00000 n 0004168766 00000 n 0004168822 00000 n 0004168878 00000 n 0004168934 00000 n 0004168990 00000 n 0004169255 00000 n 0004169884 00000 n 0004174131 00000 n 0004169638 00000 n 0004169844 00000 n 0004174266 00000 n 0004174154 00000 n 0004174210 00000 n 0004174624 00000 n 0004178149 00000 n 0004174396 00000 n 0004174602 00000 n 0004178656 00000 n 0004178172 00000 n 0004178228 00000 n 0004178284 00000 n 0004178340 00000 n 0004178396 00000 n 0004179023 00000 n 0004182598 00000 n 0004178786 00000 n 0004178992 00000 n 0004182845 00000 n 0004182621 00000 n 0004182677 00000 n 0004182733 00000 n 0004182789 00000 n 0004183203 00000 n 0004186554 00000 n 0004182975 00000 n 0004183181 00000 n 0004186689 00000 n 0004186577 00000 n 0004186633 00000 n 0004187047 00000 n 0004189878 00000 n 0004186819 00000 n 0004187025 00000 n 0004190125 00000 n 0004189901 00000 n 0004189957 00000 n 0004190013 00000 n 0004190069 00000 n 0004190483 00000 n 0004195152 00000 n 0004190255 00000 n 0004190461 00000 n 0004195287 00000 n 0004195175 00000 n 0004195231 00000 n 0004195645 00000 n 0004199169 00000 n 0004195417 00000 n 0004195623 00000 n 0004199304 00000 n 0004199192 00000 n 0004199248 00000 n 0004199662 00000 n 0004203781 00000 n 0004199434 00000 n 0004199640 00000 n 0004205547 00000 n 0004203804 00000 n 0004203860 00000 n 0004203916 00000 n 0004203972 00000 n 0004204028 00000 n 0004204293 00000 n 0004204551 00000 n 0004204816 00000 n 0004205081 00000 n 0004205346 00000 n 0004205959 00000 n 0004210220 00000 n 0004205677 00000 n 0004205883 00000 n 0004222358 00000 n 0004210243 00000 n 0004210299 00000 n 0004210355 00000 n 0004210411 00000 n 0004210467 00000 n 0004210523 00000 n 0004210579 00000 n 0004210844 00000 n 0004211109 00000 n 0004211374 00000 n 0004211640 00000 n 0004211906 00000 n 0004212172 00000 n 0004212438 00000 n 0004212704 00000 n 0004212970 00000 n 0004213236 00000 n 0004213502 00000 n 0004213768 00000 n 0004214034 00000 n 0004214300 00000 n 0004214566 00000 n 0004214832 00000 n 0004215098 00000 n 0004215364 00000 n 0004215630 00000 n 0004215896 00000 n 0004216162 00000 n 0004216428 00000 n 0004216694 00000 n 0004216960 00000 n 0004217219 00000 n 0004217485 00000 n 0004217759 00000 n 0004218025 00000 n 0004218284 00000 n 0004218550 00000 n 0004218816 00000 n 0004219082 00000 n 0004219363 00000 n 0004219629 00000 n 0004219895 00000 n 0004220161 00000 n 0004220433 00000 n 0004220713 00000 n 0004220979 00000 n 0004221254 00000 n 0004221539 00000 n 0004221818 00000 n 0004222084 00000 n 0004223112 00000 n 0004231100 00000 n 0004222488 00000 n 0004222694 00000 n 0004231459 00000 n 0004231123 00000 n 0004231179 00000 n 0004231235 00000 n 0004231291 00000 n 0004231347 00000 n 0004231403 00000 n 0004231849 00000 n 0004238810 00000 n 0004231589 00000 n 0004231827 00000 n 0004238945 00000 n 0004238833 00000 n 0004238889 00000 n 0004239335 00000 n 0004245156 00000 n 0004239075 00000 n 0004239313 00000 n 0004245179 00000 n 0004245527 00000 n 0004249102 00000 n 0004245309 00000 n 0004245505 00000 n 0004249125 00000 n 0004249463 00000 n 0004251905 00000 n 0004249255 00000 n 0004249441 00000 n 0004252152 00000 n 0004251928 00000 n 0004251984 00000 n 0004252040 00000 n 0004252096 00000 n 0004252510 00000 n 0004256566 00000 n 0004252282 00000 n 0004252488 00000 n 0004256701 00000 n 0004256589 00000 n 0004256645 00000 n 0004257059 00000 n 0004260390 00000 n 0004256831 00000 n 0004257037 00000 n 0004260525 00000 n 0004260413 00000 n 0004260469 00000 n 0004260883 00000 n 0004265418 00000 n 0004260655 00000 n 0004260861 00000 n 0004265777 00000 n 0004265441 00000 n 0004265497 00000 n 0004265553 00000 n 0004265609 00000 n 0004265665 00000 n 0004265721 00000 n 0004266151 00000 n 0004271114 00000 n 0004265907 00000 n 0004266129 00000 n 0004271361 00000 n 0004271137 00000 n 0004271193 00000 n 0004271249 00000 n 0004271305 00000 n 0004271735 00000 n 0004275600 00000 n 0004271491 00000 n 0004271713 00000 n 0004275959 00000 n 0004275623 00000 n 0004275679 00000 n 0004275735 00000 n 0004275791 00000 n 0004275847 00000 n 0004275903 00000 n 0004276333 00000 n 0004280737 00000 n 0004276089 00000 n 0004276311 00000 n 0004280872 00000 n 0004280760 00000 n 0004280816 00000 n 0004281246 00000 n 0004285405 00000 n 0004281002 00000 n 0004281224 00000 n 0004285540 00000 n 0004285428 00000 n 0004285484 00000 n 0004285914 00000 n 0004290369 00000 n 0004285670 00000 n 0004285892 00000 n 0004290616 00000 n 0004290392 00000 n 0004290448 00000 n 0004290504 00000 n 0004290560 00000 n 0004291006 00000 n 0004296320 00000 n 0004290746 00000 n 0004290984 00000 n 0004296455 00000 n 0004296343 00000 n 0004296399 00000 n 0004296829 00000 n 0004300908 00000 n 0004296585 00000 n 0004296807 00000 n 0004301155 00000 n 0004300931 00000 n 0004300987 00000 n 0004301043 00000 n 0004301099 00000 n 0004301529 00000 n 0004305321 00000 n 0004301285 00000 n 0004301507 00000 n 0004305680 00000 n 0004305344 00000 n 0004305400 00000 n 0004305456 00000 n 0004305512 00000 n 0004305568 00000 n 0004305624 00000 n 0004306054 00000 n 0004311201 00000 n 0004305810 00000 n 0004306032 00000 n 0004311560 00000 n 0004311224 00000 n 0004311280 00000 n 0004311336 00000 n 0004311392 00000 n 0004311448 00000 n 0004311504 00000 n 0004311950 00000 n 0004316397 00000 n 0004311690 00000 n 0004311928 00000 n 0004316532 00000 n 0004316420 00000 n 0004316476 00000 n 0004316906 00000 n 0004321822 00000 n 0004316662 00000 n 0004316884 00000 n 0004322181 00000 n 0004321845 00000 n 0004321901 00000 n 0004321957 00000 n 0004322013 00000 n 0004322069 00000 n 0004322125 00000 n 0004322539 00000 n 0004327369 00000 n 0004322311 00000 n 0004322517 00000 n 0004327392 00000 n 0004327740 00000 n 0004331687 00000 n 0004327522 00000 n 0004327718 00000 n 0004331822 00000 n 0004331710 00000 n 0004331766 00000 n 0004332180 00000 n 0004336531 00000 n 0004331952 00000 n 0004332158 00000 n 0004336666 00000 n 0004336554 00000 n 0004336610 00000 n 0004337024 00000 n 0004340267 00000 n 0004336796 00000 n 0004337002 00000 n 0004340826 00000 n 0004340290 00000 n 0004340346 00000 n 0004340402 00000 n 0004340458 00000 n 0004340514 00000 n 0004340570 00000 n 0004340626 00000 n 0004341193 00000 n 0004348211 00000 n 0004340956 00000 n 0004341162 00000 n 0004349013 00000 n 0004348234 00000 n 0004348290 00000 n 0004348346 00000 n 0004348402 00000 n 0004348458 00000 n 0004348739 00000 n 0004349405 00000 n 0004356185 00000 n 0004349143 00000 n 0004349365 00000 n 0004356391 00000 n 0004356208 00000 n 0004356764 00000 n 0004361355 00000 n 0004356521 00000 n 0004356733 00000 n 0004362627 00000 n 0004361378 00000 n 0004361434 00000 n 0004361490 00000 n 0004361546 00000 n 0004361602 00000 n 0004361658 00000 n 0004361714 00000 n 0004361770 00000 n 0004361826 00000 n 0004362082 00000 n 0004362342 00000 n 0004363028 00000 n 0004371144 00000 n 0004362757 00000 n 0004362979 00000 n 0004371279 00000 n 0004371167 00000 n 0004371223 00000 n 0004371637 00000 n 0004375026 00000 n 0004371409 00000 n 0004371615 00000 n 0004375049 00000 n 0004375407 00000 n 0004378179 00000 n 0004375179 00000 n 0004375385 00000 n 0004378202 00000 n 0004378560 00000 n 0004380739 00000 n 0004378332 00000 n 0004378538 00000 n 0004827006 00000 n 0004380762 00000 n 0004380818 00000 n 0004380874 00000 n 0004826826 00000 n 0004597321 00000 n 0004597469 00000 n 0004598241 00000 n 0004601179 00000 n 0004603580 00000 n 0004607176 00000 n 0004609355 00000 n 0004619098 00000 n 0004627347 00000 n 0004635148 00000 n 0004637464 00000 n 0004640805 00000 n 0004642764 00000 n 0004654522 00000 n 0004657521 00000 n 0004658402 00000 n 0004660073 00000 n 0004663271 00000 n 0004664670 00000 n 0004667559 00000 n 0004677529 00000 n 0004678853 00000 n 0004684679 00000 n 0004688207 00000 n 0004692052 00000 n 0004696995 00000 n 0004700733 00000 n 0004721634 00000 n 0004725272 00000 n 0004727304 00000 n 0004735119 00000 n 0004738409 00000 n 0004739096 00000 n 0004744754 00000 n 0004749266 00000 n 0004758950 00000 n 0004763412 00000 n 0004765457 00000 n 0004782354 00000 n 0004783651 00000 n 0004801559 00000 n 0004809311 00000 n 0004817650 00000 n 0004826599 00000 n 0004598103 00000 n 0004597624 00000 n 0004597774 00000 n 0004597953 00000 n 0004598441 00000 n 0004598577 00000 n 0004598732 00000 n 0004598885 00000 n 0004599042 00000 n 0004599197 00000 n 0004599380 00000 n 0004599571 00000 n 0004599746 00000 n 0004599901 00000 n 0004600047 00000 n 0004601005 00000 n 0004600201 00000 n 0004600360 00000 n 0004600530 00000 n 0004600720 00000 n 0004600870 00000 n 0004601353 00000 n 0004601492 00000 n 0004602466 00000 n 0004602659 00000 n 0004602855 00000 n 0004603049 00000 n 0004603255 00000 n 0004603435 00000 n 0004601648 00000 n 0004601803 00000 n 0004601969 00000 n 0004602149 00000 n 0004602331 00000 n 0004603901 00000 n 0004605564 00000 n 0004606760 00000 n 0004606973 00000 n 0004603765 00000 n 0004605075 00000 n 0004605335 00000 n 0004604095 00000 n 0004604220 00000 n 0004604366 00000 n 0004604512 00000 n 0004604662 00000 n 0004604806 00000 n 0004604946 00000 n 0004606347 00000 n 0004606555 00000 n 0004605771 00000 n 0004605968 00000 n 0004606166 00000 n 0004607389 00000 n 0004608360 00000 n 0004609131 00000 n 0004607570 00000 n 0004607721 00000 n 0004607887 00000 n 0004608039 00000 n 0004608217 00000 n 0004608605 00000 n 0004608794 00000 n 0004608986 00000 n 0004610480 00000 n 0004611478 00000 n 0004612551 00000 n 0004615233 00000 n 0004616916 00000 n 0004617783 00000 n 0004618890 00000 n 0004609554 00000 n 0004609695 00000 n 0004609851 00000 n 0004610001 00000 n 0004610163 00000 n 0004610327 00000 n 0004610652 00000 n 0004610807 00000 n 0004610973 00000 n 0004611125 00000 n 0004611307 00000 n 0004611703 00000 n 0004611850 00000 n 0004612044 00000 n 0004612248 00000 n 0004612420 00000 n 0004612772 00000 n 0004612943 00000 n 0004613107 00000 n 0004613301 00000 n 0004613469 00000 n 0004613615 00000 n 0004614623 00000 n 0004614860 00000 n 0004615046 00000 n 0004613805 00000 n 0004614004 00000 n 0004614192 00000 n 0004614390 00000 n 0004615438 00000 n 0004615599 00000 n 0004615797 00000 n 0004615957 00000 n 0004616135 00000 n 0004616329 00000 n 0004616541 00000 n 0004616709 00000 n 0004617123 00000 n 0004617276 00000 n 0004617452 00000 n 0004617624 00000 n 0004617976 00000 n 0004618153 00000 n 0004618333 00000 n 0004618533 00000 n 0004618727 00000 n 0004619281 00000 n 0004619442 00000 n 0004619588 00000 n 0004619762 00000 n 0004620500 00000 n 0004621975 00000 n 0004622178 00000 n 0004622342 00000 n 0004622492 00000 n 0004622660 00000 n 0004622806 00000 n 0004622984 00000 n 0004623164 00000 n 0004623318 00000 n 0004624318 00000 n 0004624567 00000 n 0004624757 00000 n 0004624919 00000 n 0004625237 00000 n 0004625424 00000 n 0004625632 00000 n 0004625812 00000 n 0004626008 00000 n 0004626178 00000 n 0004626374 00000 n 0004626604 00000 n 0004626804 00000 n 0004626964 00000 n 0004627168 00000 n 0004619964 00000 n 0004620139 00000 n 0004620333 00000 n 0004620691 00000 n 0004620864 00000 n 0004621126 00000 n 0004621340 00000 n 0004621508 00000 n 0004621674 00000 n 0004621836 00000 n 0004623592 00000 n 0004623767 00000 n 0004623951 00000 n 0004624153 00000 n 0004625069 00000 n 0004627532 00000 n 0004632891 00000 n 0004634952 00000 n 0004627669 00000 n 0004627856 00000 n 0004628054 00000 n 0004628218 00000 n 0004628386 00000 n 0004628564 00000 n 0004628726 00000 n 0004628900 00000 n 0004629098 00000 n 0004629282 00000 n 0004629480 00000 n 0004629672 00000 n 0004629850 00000 n 0004630040 00000 n 0004630218 00000 n 0004630412 00000 n 0004630608 00000 n 0004630782 00000 n 0004630954 00000 n 0004631128 00000 n 0004631306 00000 n 0004631482 00000 n 0004631722 00000 n 0004631894 00000 n 0004632064 00000 n 0004632338 00000 n 0004632548 00000 n 0004632752 00000 n 0004633098 00000 n 0004633255 00000 n 0004633411 00000 n 0004633567 00000 n 0004633739 00000 n 0004633933 00000 n 0004634133 00000 n 0004634301 00000 n 0004634517 00000 n 0004634713 00000 n 0004635337 00000 n 0004635478 00000 n 0004635632 00000 n 0004635808 00000 n 0004635968 00000 n 0004636120 00000 n 0004636696 00000 n 0004636917 00000 n 0004637097 00000 n 0004637281 00000 n 0004636294 00000 n 0004636507 00000 n 0004637651 00000 n 0004638428 00000 n 0004639307 00000 n 0004640306 00000 n 0004640623 00000 n 0004637856 00000 n 0004637993 00000 n 0004638145 00000 n 0004638297 00000 n 0004638635 00000 n 0004638798 00000 n 0004638970 00000 n 0004639172 00000 n 0004639506 00000 n 0004639645 00000 n 0004639801 00000 n 0004639963 00000 n 0004640145 00000 n 0004640501 00000 n 0004641814 00000 n 0004642542 00000 n 0004640990 00000 n 0004641133 00000 n 0004641301 00000 n 0004641471 00000 n 0004641653 00000 n 0004642008 00000 n 0004642177 00000 n 0004642349 00000 n 0004644387 00000 n 0004645381 00000 n 0004646724 00000 n 0004648432 00000 n 0004650963 00000 n 0004651526 00000 n 0004651735 00000 n 0004651943 00000 n 0004652169 00000 n 0004652347 00000 n 0004652903 00000 n 0004653386 00000 n 0004653605 00000 n 0004653787 00000 n 0004653977 00000 n 0004654169 00000 n 0004654339 00000 n 0004642961 00000 n 0004643110 00000 n 0004643262 00000 n 0004643430 00000 n 0004643598 00000 n 0004643796 00000 n 0004643998 00000 n 0004644220 00000 n 0004644561 00000 n 0004644716 00000 n 0004644878 00000 n 0004645048 00000 n 0004645220 00000 n 0004645592 00000 n 0004645751 00000 n 0004645941 00000 n 0004646137 00000 n 0004646321 00000 n 0004646537 00000 n 0004646935 00000 n 0004647064 00000 n 0004647258 00000 n 0004647770 00000 n 0004647987 00000 n 0004648203 00000 n 0004647428 00000 n 0004647587 00000 n 0004648641 00000 n 0004648784 00000 n 0004648958 00000 n 0004649120 00000 n 0004649290 00000 n 0004649460 00000 n 0004649626 00000 n 0004649794 00000 n 0004649964 00000 n 0004650134 00000 n 0004650298 00000 n 0004650472 00000 n 0004650640 00000 n 0004650810 00000 n 0004651174 00000 n 0004651331 00000 n 0004652513 00000 n 0004652690 00000 n 0004653106 00000 n 0004653255 00000 n 0004656057 00000 n 0004656275 00000 n 0004657301 00000 n 0004654701 00000 n 0004654878 00000 n 0004655082 00000 n 0004655264 00000 n 0004655464 00000 n 0004655674 00000 n 0004655874 00000 n 0004656469 00000 n 0004656624 00000 n 0004656786 00000 n 0004656956 00000 n 0004657152 00000 n 0004657728 00000 n 0004657889 00000 n 0004658063 00000 n 0004658277 00000 n 0004658583 00000 n 0004658722 00000 n 0004658876 00000 n 0004659054 00000 n 0004659256 00000 n 0004659428 00000 n 0004659616 00000 n 0004659786 00000 n 0004659938 00000 n 0004660286 00000 n 0004660425 00000 n 0004660611 00000 n 0004660789 00000 n 0004660971 00000 n 0004661135 00000 n 0004661287 00000 n 0004661455 00000 n 0004662925 00000 n 0004663140 00000 n 0004661629 00000 n 0004661808 00000 n 0004661990 00000 n 0004662172 00000 n 0004662366 00000 n 0004662554 00000 n 0004662760 00000 n 0004663466 00000 n 0004663621 00000 n 0004663765 00000 n 0004663939 00000 n 0004664131 00000 n 0004664343 00000 n 0004664495 00000 n 0004664873 00000 n 0004664996 00000 n 0004665144 00000 n 0004665298 00000 n 0004665460 00000 n 0004665606 00000 n 0004665762 00000 n 0004665920 00000 n 0004666094 00000 n 0004666268 00000 n 0004666436 00000 n 0004666594 00000 n 0004666776 00000 n 0004666940 00000 n 0004667088 00000 n 0004667282 00000 n 0004667430 00000 n 0004668336 00000 n 0004669692 00000 n 0004673566 00000 n 0004675679 00000 n 0004677319 00000 n 0004667818 00000 n 0004667961 00000 n 0004668137 00000 n 0004668498 00000 n 0004668651 00000 n 0004668819 00000 n 0004668979 00000 n 0004669157 00000 n 0004669327 00000 n 0004669543 00000 n 0004669893 00000 n 0004670032 00000 n 0004670186 00000 n 0004670340 00000 n 0004670500 00000 n 0004671404 00000 n 0004672037 00000 n 0004672378 00000 n 0004672623 00000 n 0004672841 00000 n 0004673063 00000 n 0004673215 00000 n 0004673381 00000 n 0004670648 00000 n 0004670803 00000 n 0004670975 00000 n 0004671169 00000 n 0004671655 00000 n 0004671852 00000 n 0004672226 00000 n 0004674219 00000 n 0004675249 00000 n 0004675484 00000 n 0004673765 00000 n 0004673908 00000 n 0004674070 00000 n 0004674441 00000 n 0004674586 00000 n 0004674750 00000 n 0004674920 00000 n 0004675092 00000 n 0004675862 00000 n 0004676625 00000 n 0004676874 00000 n 0004677086 00000 n 0004676061 00000 n 0004676230 00000 n 0004676422 00000 n 0004677748 00000 n 0004678525 00000 n 0004678724 00000 n 0004677879 00000 n 0004678040 00000 n 0004678208 00000 n 0004678378 00000 n 0004679388 00000 n 0004679562 00000 n 0004679754 00000 n 0004680502 00000 n 0004681533 00000 n 0004682214 00000 n 0004682405 00000 n 0004684491 00000 n 0004679048 00000 n 0004679207 00000 n 0004679912 00000 n 0004680081 00000 n 0004680327 00000 n 0004680687 00000 n 0004680890 00000 n 0004681100 00000 n 0004681338 00000 n 0004681726 00000 n 0004681879 00000 n 0004682063 00000 n 0004682569 00000 n 0004682814 00000 n 0004683056 00000 n 0004683322 00000 n 0004683572 00000 n 0004683868 00000 n 0004684092 00000 n 0004684322 00000 n 0004685194 00000 n 0004686150 00000 n 0004686347 00000 n 0004687135 00000 n 0004687316 00000 n 0004687602 00000 n 0004687979 00000 n 0004684864 00000 n 0004685027 00000 n 0004685370 00000 n 0004685525 00000 n 0004685675 00000 n 0004685857 00000 n 0004686011 00000 n 0004686495 00000 n 0004686722 00000 n 0004686930 00000 n 0004687464 00000 n 0004687785 00000 n 0004688402 00000 n 0004688541 00000 n 0004689989 00000 n 0004690172 00000 n 0004690332 00000 n 0004690478 00000 n 0004690634 00000 n 0004691498 00000 n 0004691693 00000 n 0004691861 00000 n 0004688719 00000 n 0004688886 00000 n 0004689062 00000 n 0004689262 00000 n 0004689470 00000 n 0004689642 00000 n 0004689824 00000 n 0004690788 00000 n 0004690979 00000 n 0004691159 00000 n 0004691335 00000 n 0004692235 00000 n 0004692366 00000 n 0004692860 00000 n 0004696785 00000 n 0004692514 00000 n 0004692695 00000 n 0004693067 00000 n 0004693216 00000 n 0004693368 00000 n 0004693528 00000 n 0004694032 00000 n 0004694223 00000 n 0004695873 00000 n 0004696082 00000 n 0004696286 00000 n 0004696454 00000 n 0004696642 00000 n 0004693694 00000 n 0004693869 00000 n 0004694383 00000 n 0004694538 00000 n 0004694724 00000 n 0004694916 00000 n 0004695104 00000 n 0004695278 00000 n 0004695462 00000 n 0004695688 00000 n 0004697180 00000 n 0004697343 00000 n 0004697513 00000 n 0004698541 00000 n 0004698722 00000 n 0004698890 00000 n 0004699322 00000 n 0004699559 00000 n 0004699733 00000 n 0004699901 00000 n 0004700081 00000 n 0004700543 00000 n 0004697677 00000 n 0004697824 00000 n 0004697990 00000 n 0004698180 00000 n 0004698390 00000 n 0004699038 00000 n 0004699167 00000 n 0004700261 00000 n 0004700408 00000 n 0004700924 00000 n 0004702876 00000 n 0004707032 00000 n 0004710305 00000 n 0004711806 00000 n 0004712059 00000 n 0004713238 00000 n 0004714667 00000 n 0004716775 00000 n 0004719994 00000 n 0004720196 00000 n 0004721294 00000 n 0004721490 00000 n 0004701055 00000 n 0004701198 00000 n 0004701394 00000 n 0004701590 00000 n 0004701778 00000 n 0004701948 00000 n 0004702132 00000 n 0004702684 00000 n 0004702354 00000 n 0004702539 00000 n 0004703069 00000 n 0004703276 00000 n 0004703430 00000 n 0004703598 00000 n 0004704568 00000 n 0004704763 00000 n 0004704915 00000 n 0004705071 00000 n 0004705229 00000 n 0004705529 00000 n 0004705794 00000 n 0004705980 00000 n 0004706160 00000 n 0004706326 00000 n 0004706840 00000 n 0004703752 00000 n 0004703905 00000 n 0004704073 00000 n 0004704247 00000 n 0004704421 00000 n 0004705395 00000 n 0004706490 00000 n 0004706671 00000 n 0004707433 00000 n 0004707803 00000 n 0004709064 00000 n 0004709271 00000 n 0004709971 00000 n 0004710166 00000 n 0004707259 00000 n 0004707639 00000 n 0004708016 00000 n 0004708173 00000 n 0004708335 00000 n 0004708547 00000 n 0004708849 00000 n 0004709447 00000 n 0004709612 00000 n 0004709800 00000 n 0004710562 00000 n 0004710717 00000 n 0004710885 00000 n 0004711067 00000 n 0004711251 00000 n 0004711437 00000 n 0004711627 00000 n 0004712245 00000 n 0004712408 00000 n 0004712600 00000 n 0004712798 00000 n 0004713040 00000 n 0004713463 00000 n 0004713717 00000 n 0004713884 00000 n 0004714089 00000 n 0004714262 00000 n 0004714443 00000 n 0004714873 00000 n 0004715055 00000 n 0004715272 00000 n 0004715447 00000 n 0004715620 00000 n 0004715849 00000 n 0004716032 00000 n 0004716213 00000 n 0004716428 00000 n 0004716601 00000 n 0004716969 00000 n 0004717189 00000 n 0004717440 00000 n 0004717691 00000 n 0004717910 00000 n 0004718139 00000 n 0004718346 00000 n 0004718583 00000 n 0004718808 00000 n 0004719031 00000 n 0004719222 00000 n 0004719489 00000 n 0004719736 00000 n 0004720383 00000 n 0004720537 00000 n 0004720760 00000 n 0004720955 00000 n 0004721154 00000 n 0004721823 00000 n 0004722432 00000 n 0004723640 00000 n 0004724092 00000 n 0004725093 00000 n 0004721955 00000 n 0004722099 00000 n 0004722288 00000 n 0004722763 00000 n 0004723242 00000 n 0004723444 00000 n 0004722626 00000 n 0004722972 00000 n 0004723112 00000 n 0004723830 00000 n 0004723962 00000 n 0004724276 00000 n 0004724418 00000 n 0004724583 00000 n 0004724734 00000 n 0004724899 00000 n 0004725474 00000 n 0004726404 00000 n 0004727002 00000 n 0004727180 00000 n 0004725628 00000 n 0004725808 00000 n 0004725993 00000 n 0004726204 00000 n 0004726652 00000 n 0004726832 00000 n 0004727508 00000 n 0004728386 00000 n 0004732183 00000 n 0004733103 00000 n 0004733603 00000 n 0004734159 00000 n 0004734916 00000 n 0004727650 00000 n 0004727832 00000 n 0004728043 00000 n 0004728232 00000 n 0004728578 00000 n 0004728712 00000 n 0004728867 00000 n 0004729219 00000 n 0004729429 00000 n 0004729582 00000 n 0004729739 00000 n 0004729898 00000 n 0004730065 00000 n 0004730282 00000 n 0004730469 00000 n 0004730634 00000 n 0004730829 00000 n 0004731036 00000 n 0004731201 00000 n 0004731376 00000 n 0004732006 00000 n 0004729036 00000 n 0004731543 00000 n 0004731705 00000 n 0004731858 00000 n 0004732411 00000 n 0004732567 00000 n 0004732732 00000 n 0004732907 00000 n 0004733287 00000 n 0004733451 00000 n 0004733803 00000 n 0004733987 00000 n 0004734387 00000 n 0004734579 00000 n 0004734762 00000 n 0004735430 00000 n 0004735941 00000 n 0004736447 00000 n 0004737585 00000 n 0004738057 00000 n 0004738279 00000 n 0004735307 00000 n 0004735597 00000 n 0004735767 00000 n 0004736129 00000 n 0004736267 00000 n 0004736641 00000 n 0004736797 00000 n 0004736992 00000 n 0004737143 00000 n 0004737294 00000 n 0004737451 00000 n 0004737787 00000 n 0004737923 00000 n 0004738607 00000 n 0004738775 00000 n 0004738936 00000 n 0004740173 00000 n 0004744541 00000 n 0004739308 00000 n 0004739452 00000 n 0004739625 00000 n 0004739796 00000 n 0004739967 00000 n 0004740350 00000 n 0004740657 00000 n 0004741621 00000 n 0004742497 00000 n 0004744197 00000 n 0004744401 00000 n 0004740510 00000 n 0004740839 00000 n 0004741023 00000 n 0004741220 00000 n 0004741391 00000 n 0004741805 00000 n 0004741987 00000 n 0004742162 00000 n 0004742345 00000 n 0004742691 00000 n 0004742857 00000 n 0004743052 00000 n 0004743237 00000 n 0004743428 00000 n 0004743695 00000 n 0004743850 00000 n 0004744029 00000 n 0004744946 00000 n 0004745591 00000 n 0004749055 00000 n 0004745088 00000 n 0004745248 00000 n 0004745437 00000 n 0004745783 00000 n 0004745917 00000 n 0004746072 00000 n 0004746241 00000 n 0004746416 00000 n 0004746569 00000 n 0004746758 00000 n 0004746925 00000 n 0004747110 00000 n 0004747273 00000 n 0004747468 00000 n 0004747985 00000 n 0004748195 00000 n 0004748416 00000 n 0004748569 00000 n 0004748742 00000 n 0004748903 00000 n 0004747633 00000 n 0004747815 00000 n 0004749460 00000 n 0004750953 00000 n 0004751497 00000 n 0004753369 00000 n 0004753583 00000 n 0004753770 00000 n 0004754595 00000 n 0004755955 00000 n 0004757328 00000 n 0004757522 00000 n 0004758743 00000 n 0004749592 00000 n 0004749772 00000 n 0004749961 00000 n 0004750178 00000 n 0004750381 00000 n 0004750550 00000 n 0004750773 00000 n 0004751147 00000 n 0004751335 00000 n 0004751741 00000 n 0004751879 00000 n 0004752048 00000 n 0004752203 00000 n 0004752356 00000 n 0004752513 00000 n 0004752672 00000 n 0004752867 00000 n 0004753052 00000 n 0004753207 00000 n 0004753939 00000 n 0004754107 00000 n 0004754272 00000 n 0004754443 00000 n 0004754829 00000 n 0004755023 00000 n 0004755186 00000 n 0004755385 00000 n 0004755588 00000 n 0004755803 00000 n 0004756155 00000 n 0004756301 00000 n 0004756494 00000 n 0004756663 00000 n 0004756828 00000 n 0004756995 00000 n 0004757154 00000 n 0004757711 00000 n 0004757869 00000 n 0004758040 00000 n 0004758243 00000 n 0004758420 00000 n 0004758605 00000 n 0004759480 00000 n 0004761818 00000 n 0004763207 00000 n 0004759142 00000 n 0004759320 00000 n 0004759681 00000 n 0004759819 00000 n 0004759988 00000 n 0004760143 00000 n 0004760302 00000 n 0004761398 00000 n 0004761622 00000 n 0004760485 00000 n 0004760637 00000 n 0004760834 00000 n 0004761021 00000 n 0004761208 00000 n 0004762024 00000 n 0004762180 00000 n 0004762349 00000 n 0004762550 00000 n 0004762725 00000 n 0004762908 00000 n 0004763061 00000 n 0004764095 00000 n 0004765268 00000 n 0004763600 00000 n 0004763744 00000 n 0004763941 00000 n 0004764272 00000 n 0004764406 00000 n 0004764561 00000 n 0004764730 00000 n 0004764927 00000 n 0004765120 00000 n 0004765647 00000 n 0004767217 00000 n 0004770323 00000 n 0004771600 00000 n 0004773041 00000 n 0004774003 00000 n 0004775064 00000 n 0004775930 00000 n 0004777306 00000 n 0004778987 00000 n 0004781106 00000 n 0004782169 00000 n 0004765779 00000 n 0004765923 00000 n 0004766090 00000 n 0004766289 00000 n 0004766454 00000 n 0004766625 00000 n 0004766820 00000 n 0004767017 00000 n 0004767411 00000 n 0004767545 00000 n 0004767700 00000 n 0004767869 00000 n 0004768044 00000 n 0004768197 00000 n 0004768354 00000 n 0004768513 00000 n 0004768680 00000 n 0004768897 00000 n 0004769084 00000 n 0004769249 00000 n 0004769416 00000 n 0004769933 00000 n 0004770143 00000 n 0004769581 00000 n 0004769763 00000 n 0004770551 00000 n 0004771049 00000 n 0004771249 00000 n 0004771420 00000 n 0004770697 00000 n 0004770843 00000 n 0004771858 00000 n 0004772014 00000 n 0004772183 00000 n 0004772384 00000 n 0004772559 00000 n 0004772742 00000 n 0004772895 00000 n 0004773263 00000 n 0004773427 00000 n 0004773622 00000 n 0004773815 00000 n 0004774229 00000 n 0004774403 00000 n 0004774570 00000 n 0004774743 00000 n 0004774910 00000 n 0004775270 00000 n 0004775426 00000 n 0004775593 00000 n 0004775764 00000 n 0004776114 00000 n 0004776304 00000 n 0004776539 00000 n 0004776744 00000 n 0004776959 00000 n 0004777154 00000 n 0004777506 00000 n 0004778607 00000 n 0004778821 00000 n 0004777660 00000 n 0004777836 00000 n 0004778029 00000 n 0004778222 00000 n 0004778415 00000 n 0004779193 00000 n 0004779367 00000 n 0004779564 00000 n 0004779773 00000 n 0004779964 00000 n 0004780885 00000 n 0004780157 00000 n 0004780347 00000 n 0004780516 00000 n 0004780705 00000 n 0004781306 00000 n 0004781466 00000 n 0004781637 00000 n 0004781818 00000 n 0004782015 00000 n 0004782548 00000 n 0004782672 00000 n 0004782837 00000 n 0004783022 00000 n 0004783183 00000 n 0004783356 00000 n 0004783511 00000 n 0004784879 00000 n 0004785227 00000 n 0004788921 00000 n 0004789792 00000 n 0004789974 00000 n 0004790855 00000 n 0004797694 00000 n 0004799372 00000 n 0004800110 00000 n 0004801370 00000 n 0004783835 00000 n 0004783979 00000 n 0004784176 00000 n 0004784365 00000 n 0004784536 00000 n 0004784701 00000 n 0004785056 00000 n 0004785483 00000 n 0004785617 00000 n 0004785772 00000 n 0004785941 00000 n 0004786096 00000 n 0004786249 00000 n 0004786406 00000 n 0004786565 00000 n 0004786732 00000 n 0004786917 00000 n 0004787083 00000 n 0004787252 00000 n 0004787420 00000 n 0004787634 00000 n 0004787808 00000 n 0004788342 00000 n 0004788706 00000 n 0004787984 00000 n 0004788169 00000 n 0004788557 00000 n 0004789140 00000 n 0004789294 00000 n 0004789468 00000 n 0004789632 00000 n 0004790161 00000 n 0004790343 00000 n 0004790523 00000 n 0004790699 00000 n 0004791061 00000 n 0004791219 00000 n 0004791385 00000 n 0004791559 00000 n 0004791735 00000 n 0004795097 00000 n 0004795300 00000 n 0004796341 00000 n 0004796550 00000 n 0004796722 00000 n 0004796936 00000 n 0004797293 00000 n 0004797504 00000 n 0004791917 00000 n 0004792068 00000 n 0004792251 00000 n 0004792422 00000 n 0004792601 00000 n 0004792780 00000 n 0004792955 00000 n 0004793132 00000 n 0004793311 00000 n 0004793490 00000 n 0004793673 00000 n 0004793850 00000 n 0004794029 00000 n 0004794208 00000 n 0004794391 00000 n 0004794576 00000 n 0004794767 00000 n 0004794936 00000 n 0004795474 00000 n 0004795655 00000 n 0004795854 00000 n 0004796031 00000 n 0004796196 00000 n 0004797138 00000 n 0004797880 00000 n 0004798989 00000 n 0004799206 00000 n 0004798034 00000 n 0004798211 00000 n 0004798406 00000 n 0004798601 00000 n 0004798796 00000 n 0004799578 00000 n 0004799740 00000 n 0004799940 00000 n 0004800310 00000 n 0004800498 00000 n 0004800672 00000 n 0004800844 00000 n 0004801014 00000 n 0004801184 00000 n 0004801749 00000 n 0004802764 00000 n 0004806714 00000 n 0004807750 00000 n 0004807977 00000 n 0004808455 00000 n 0004808956 00000 n 0004809163 00000 n 0004801893 00000 n 0004802058 00000 n 0004802237 00000 n 0004802414 00000 n 0004802587 00000 n 0004802961 00000 n 0004803100 00000 n 0004803599 00000 n 0004803795 00000 n 0004804264 00000 n 0004804810 00000 n 0004805004 00000 n 0004805165 00000 n 0004805328 00000 n 0004805499 00000 n 0004805672 00000 n 0004805895 00000 n 0004806064 00000 n 0004806233 00000 n 0004806404 00000 n 0004806575 00000 n 0004803263 00000 n 0004803422 00000 n 0004803968 00000 n 0004804113 00000 n 0004804494 00000 n 0004804655 00000 n 0004806947 00000 n 0004807132 00000 n 0004807285 00000 n 0004807464 00000 n 0004807621 00000 n 0004808155 00000 n 0004808308 00000 n 0004808656 00000 n 0004808807 00000 n 0004810971 00000 n 0004811488 00000 n 0004814135 00000 n 0004814674 00000 n 0004814931 00000 n 0004815121 00000 n 0004816703 00000 n 0004816892 00000 n 0004817241 00000 n 0004817506 00000 n 0004809507 00000 n 0004809690 00000 n 0004809883 00000 n 0004810052 00000 n 0004810227 00000 n 0004810426 00000 n 0004810627 00000 n 0004810816 00000 n 0004811152 00000 n 0004811343 00000 n 0004811753 00000 n 0004811890 00000 n 0004812049 00000 n 0004812222 00000 n 0004812401 00000 n 0004812558 00000 n 0004812719 00000 n 0004812882 00000 n 0004813053 00000 n 0004813274 00000 n 0004813465 00000 n 0004813634 00000 n 0004813805 00000 n 0004813974 00000 n 0004814368 00000 n 0004814517 00000 n 0004815293 00000 n 0004815452 00000 n 0004815617 00000 n 0004815792 00000 n 0004816001 00000 n 0004816200 00000 n 0004816373 00000 n 0004816548 00000 n 0004817110 00000 n 0004817840 00000 n 0004817982 00000 n 0004818144 00000 n 0004819628 00000 n 0004820779 00000 n 0004821002 00000 n 0004821216 00000 n 0004822402 00000 n 0004822597 00000 n 0004825832 00000 n 0004826057 00000 n 0004826229 00000 n 0004826417 00000 n 0004818310 00000 n 0004818459 00000 n 0004818614 00000 n 0004818777 00000 n 0004818958 00000 n 0004819125 00000 n 0004819310 00000 n 0004819481 00000 n 0004819831 00000 n 0004819968 00000 n 0004820121 00000 n 0004820272 00000 n 0004820447 00000 n 0004820650 00000 n 0004821398 00000 n 0004821569 00000 n 0004821744 00000 n 0004821905 00000 n 0004822092 00000 n 0004822247 00000 n 0004822753 00000 n 0004822908 00000 n 0004823075 00000 n 0004823258 00000 n 0004823463 00000 n 0004823666 00000 n 0004823871 00000 n 0004824064 00000 n 0004824245 00000 n 0004824418 00000 n 0004824607 00000 n 0004824935 00000 n 0004825201 00000 n 0004825372 00000 n 0004825659 00000 n 0004824778 00000 n 0004826895 00000 n 0004827369 00000 n 0004828715 00000 n 0004827139 00000 n 0004827346 00000 n 0004828739 00000 n 0004829012 00000 n 0004842262 00000 n 0004842873 00000 n 0004842237 00000 n 0004844114 00000 n 0004844377 00000 n 0004853363 00000 n 0004853864 00000 n 0004853339 00000 n 0004854920 00000 n 0004855195 00000 n 0004866360 00000 n 0004866582 00000 n 0004866335 00000 n 0004867764 00000 n 0004868042 00000 n 0004880941 00000 n 0004881525 00000 n 0004880916 00000 n 0004882714 00000 n 0004882991 00000 n 0004890207 00000 n 0004890431 00000 n 0004890183 00000 n 0004891307 00000 n 0004891587 00000 n 0004903680 00000 n 0004904214 00000 n 0004903655 00000 n 0004905317 00000 n 0004905598 00000 n 0004910067 00000 n 0004910295 00000 n 0004910043 00000 n 0004910944 00000 n 0004911214 00000 n 0004923431 00000 n 0004923648 00000 n 0004923406 00000 n trailer << /Size 10255 /Info 1 0 R /Root 10210 0 R >> startxref 4930887 %%EOF swig-3.0.12/Doc/Manual/Preprocessor.html0000664000175000017500000003335313042756671017746 0ustar williamwilliam SWIG Preprocessor

    8 Preprocessing

    SWIG includes its own enhanced version of the C preprocessor. The preprocessor supports the standard preprocessor directives and macro expansion rules. However, a number of modifications and enhancements have been made. This chapter describes some of these modifications.

    8.1 File inclusion

    To include another file into a SWIG interface, use the %include directive like this:

    %include "pointer.i"
    

    Unlike, #include, %include includes each file once (and will not reload the file on subsequent %include declarations). Therefore, it is not necessary to use include-guards in SWIG interfaces.

    By default, the #include is ignored unless you run SWIG with the -includeall option. The reason for ignoring traditional includes is that you often don't want SWIG to try and wrap everything included in standard header system headers and auxiliary files.

    8.2 File imports

    SWIG provides another file inclusion directive with the %import directive. For example:

    %import "foo.i"
    

    The purpose of %import is to collect certain information from another SWIG interface file or a header file without actually generating any wrapper code. Such information generally includes type declarations (e.g., typedef) as well as C++ classes that might be used as base-classes for class declarations in the interface. The use of %import is also important when SWIG is used to generate extensions as a collection of related modules. This is an advanced topic and is described in later in the Working with Modules chapter.

    The -importall directive tells SWIG to follow all #include statements as imports. This might be useful if you want to extract type definitions from system header files without generating any wrappers.

    8.3 Conditional Compilation

    SWIG fully supports the use of #if, #ifdef, #ifndef, #else, #endif to conditionally include parts of an interface. The following symbols are predefined by SWIG when it is parsing the interface:

    SWIG                            Always defined when SWIG is processing a file
    SWIGIMPORTED                    Defined when SWIG is importing a file with %import
    SWIG_VERSION                    Hexadecimal (binary-coded decimal) number containing SWIG version,
                                    such as 0x010311 (corresponding to SWIG-1.3.11).
    
    SWIGALLEGROCL                   Defined when using Allegro CL
    SWIGCFFI                        Defined when using CFFI
    SWIGCHICKEN                     Defined when using CHICKEN
    SWIGCLISP                       Defined when using CLISP
    SWIGCSHARP                      Defined when using C#
    SWIGGUILE                       Defined when using Guile
    SWIGJAVA                        Defined when using Java
    SWIGJAVASCRIPT                  Defined when using Javascript
    SWIG_JAVASCRIPT_JSC             Defined when using Javascript for JavascriptCore
    SWIG_JAVASCRIPT_V8              Defined when using Javascript for v8 or node.js 
    SWIGLUA                         Defined when using Lua
    SWIGMODULA3                     Defined when using Modula-3
    SWIGMZSCHEME                    Defined when using Mzscheme
    SWIGOCAML                       Defined when using Ocaml
    SWIGOCTAVE                      Defined when using Octave
    SWIGPERL                        Defined when using Perl
    SWIGPHP                         Defined when using PHP5 or PHP7
    SWIGPHP5                        Defined when using PHP5
    SWIGPHP7                        Defined when using PHP7
    SWIGPIKE                        Defined when using Pike
    SWIGPYTHON                      Defined when using Python
    SWIGR                           Defined when using R
    SWIGRUBY                        Defined when using Ruby
    SWIGSCILAB                      Defined when using Scilab
    SWIGSEXP                        Defined when using S-expressions
    SWIGTCL                         Defined when using Tcl
    SWIGXML                         Defined when using XML
    

    In addition, SWIG defines the following set of standard C/C++ macros:

    __LINE__                        Current line number
    __FILE__                        Current file name
    __STDC__                        Defined to indicate ANSI C
    __cplusplus                     Defined when -c++ option used
    

    Interface files can look at these symbols as necessary to change the way in which an interface is generated or to mix SWIG directives with C code. These symbols are also defined within the C code generated by SWIG (except for the symbol `SWIG' which is only defined within the SWIG compiler).

    8.4 Macro Expansion

    Traditional preprocessor macros can be used in SWIG interfaces. Be aware that the #define statement is also used to try and detect constants. Therefore, if you have something like this in your file,

    #ifndef _FOO_H 1
    #define _FOO_H 1
    ...
    #endif
    

    you may get some extra constants such as _FOO_H showing up in the scripting interface.

    More complex macros can be defined in the standard way. For example:

    #define EXTERN extern
    #ifdef __STDC__
    #define _ANSI(args)   (args)
    #else
    #define _ANSI(args) ()
    #endif
    

    The following operators can appear in macro definitions:

    • #x
      Converts macro argument x to a string surrounded by double quotes ("x").
    • x ## y
      Concatenates x and y together to form xy.
    • `x`
      If x is a string surrounded by double quotes, do nothing. Otherwise, turn into a string like #x. This is a non-standard SWIG extension.

    8.5 SWIG Macros

    SWIG provides an enhanced macro capability with the %define and %enddef directives. For example:

    %define ARRAYHELPER(type, name)
    %inline %{
    type *new_ ## name (int nitems) {
      return (type *) malloc(sizeof(type)*nitems);
    }
    void delete_ ## name(type *t) {
      free(t);
    }
    type name ## _get(type *t, int index) {
      return t[index];
    }
    void name ## _set(type *t, int index, type val) {
      t[index] = val;
    }
    %}
    %enddef
    
    ARRAYHELPER(int, IntArray)
    ARRAYHELPER(double, DoubleArray)
    

    The primary purpose of %define is to define large macros of code. Unlike normal C preprocessor macros, it is not necessary to terminate each line with a continuation character (\)--the macro definition extends to the first occurrence of %enddef. Furthermore, when such macros are expanded, they are reparsed through the C preprocessor. Thus, SWIG macros can contain all other preprocessor directives except for nested %define statements.

    The SWIG macro capability is a very quick and easy way to generate large amounts of code. In fact, many of SWIG's advanced features and libraries are built using this mechanism (such as C++ template support).

    8.6 C99 and GNU Extensions

    SWIG-1.3.12 and newer releases support variadic preprocessor macros. For example:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, __VA_ARGS__)
    

    When used, any extra arguments to ... are placed into the special variable __VA_ARGS__. This also works with special SWIG macros defined using %define.

    SWIG allows a variable number of arguments to be empty. However, this often results in an extra comma (, ) and syntax error in the resulting expansion. For example:

    DEBUGF("hello");   --> fprintf(stderr, "hello", );
    

    To get rid of the extra comma, use ## like this:

    #define DEBUGF(fmt, ...)   fprintf(stderr, fmt, ##__VA_ARGS__)
    

    SWIG also supports GNU-style variadic macros. For example:

    #define DEBUGF(fmt, args...)  fprintf(stdout, fmt, args)
    

    Comment: It's not entirely clear how variadic macros might be useful to interface building. However, they are used internally to implement a number of SWIG directives and are provided to make SWIG more compatible with C99 code.

    8.7 Preprocessing and delimiters

    The preprocessor handles { }, " " and %{ %} delimiters differently.

    8.7.1 Preprocessing and %{ ... %} & " ... " delimiters

    The SWIG preprocessor does not process any text enclosed in a code block %{ ... %}. Therefore, if you write code like this,

    %{
    #ifdef NEED_BLAH
    int blah() {
      ...
    }
    #endif
    %}
    

    the contents of the %{ ... %} block are copied without modification to the output (including all preprocessor directives).

    8.7.2 Preprocessing and { ... } delimiters

    SWIG always runs the preprocessor on text appearing inside { ... }. However, sometimes it is desirable to make a preprocessor directive pass through to the output file. For example:

    %extend Foo {
      void bar() {
        #ifdef DEBUG
          printf("I'm in bar\n");
        #endif
      }
    }
    

    By default, SWIG will interpret the #ifdef DEBUG statement. However, if you really wanted that code to actually go into the wrapper file, prefix the preprocessor directives with % like this:

    %extend Foo {
      void bar() {
        %#ifdef DEBUG
          printf("I'm in bar\n");
        %#endif
      }
    }
    

    SWIG will strip the extra % and leave the preprocessor directive in the code.

    8.8 Preprocessor and Typemaps

    Typemaps support a special attribute called noblock where the { ... } delimiters can be used, but the delimiters are not actually generated into the code. The effect is then similar to using "" or %{ %} delimiters but the code is run through the preprocessor. For example:

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int {$1= SWIG_macro(int);}
    

    might generate

      {
        arg1=(int)jarg1;
      }
    

    whereas

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in, noblock=1) Int {$1= SWIG_macro(int);}
    

    might generate

      arg1=(int)jarg1;
    

    and

    #define SWIG_macro(CAST) (CAST)$input
    %typemap(in) Int %{$1=SWIG_macro(int);%}
    

    would generate

      arg1=SWIG_macro(int);
    

    8.9 Viewing preprocessor output

    Like many compilers, SWIG supports a -E command line option to display the output from the preprocessor. When the -E switch is used, SWIG will not generate any wrappers. Instead the results after the preprocessor has run are displayed. This might be useful as an aid to debugging and viewing the results of macro expansions.

    8.10 The #error and #warning directives

    SWIG supports the commonly used #warning and #error preprocessor directives. The #warning directive will cause SWIG to issue a warning then continue processing. The #error directive will cause SWIG to exit with a fatal error. Example usage:

    #error "This is a fatal error message"
    #warning "This is a warning message"
    

    The #error behaviour can be made to work like #warning if the -cpperraswarn commandline option is used. Alternatively, the #pragma directive can be used to the same effect, for example:

      /* Modified behaviour: #error does not cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=1
      /* Normal behaviour: #error does cause SWIG to exit with error */
      #pragma SWIG cpperraswarn=0
    
    swig-3.0.12/Doc/Manual/R.html0000664000175000017500000001246513042756672015463 0ustar williamwilliam SWIG and R

    37 SWIG and R

    R is a GPL'ed open source statistical and plotting environment. Information about R can be found at www.r-project.org. The R bindings are under active development. They have been used to compile and run an R interface to QuantLib running on Mandriva Linux with gcc. The R bindings also work on Microsoft Windows using Visual C++.

    37.1 Bugs

    Currently the following features are not implemented or broken:

    • Garbage collection of created objects
    • C Array wrappings

    37.2 Using R and SWIG

    To use R and SWIG in C mode, execute the following commands where example.c is the name of the file with the functions in them

    swig -r example.i
    R CMD SHLIB example_wrap.c example.c
    

    The corresponding options for C++ mode are

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB example_wrap.cpp example.cpp
    

    Note that R is sensitive to the names of the files. The name of the wrapper file must be the name of the library unless you use the -o option to R when building the library, for example:

    swig -c++ -r -o example_wrap.cpp example.i
    R CMD SHLIB -o example.so example_wrap.cpp example.cpp
    

    R is also sensitive to the name of the file extension in C and C++ mode. In C++ mode, the file extension must be .cpp rather than .cxx for the R compile command to recognize it. If your C++ code is in a file using something other than a .cpp extension, then it may still work using PKG_LIBS:

    swig -c++ -r -o example_wrap.cpp example.i
    PKG_LIBS="example.cxx" R CMD SHLIB -o example example_wrap.cpp
    

    The commands produces two files. A dynamic shared object file called example.so, or example.dll, and an R wrapper file called example.R. To load these files, start up R and type in the following commands

    dyn.load(paste("example", .Platform$dynlib.ext, sep=""))
    source("example.R")
    cacheMetaData(1)
    
    The cacheMetaData(1) will cause R to refresh its object tables. Without it, inheritance of wrapped objects may fail.

    These two files can be loaded in any order

    If you are compiling code yourself (not using R itself), there are a few things to watch out for:

    • The output shared library name (to the left of the file extension) MUST match the module name, or alternatively, you can also set the -package NAME command line argument. See swig -r -help for more information
    • If you do not set the output file name appropriately, you might see errors like
      > fact(4)
      Error in .Call("R_swig_fact", s_arg1, as.logical(.copy), PACKAGE = "example") :
        "R_swig_fact" not available for .Call() for package "example"
      
    • Make sure the architecture of the shared library(x64 for instance), matches the architecture of the R program you want to load your shared library into

    37.3 Precompiling large R files

    In cases where the R file is large, one make save a lot of loading time by precompiling the R wrapper. This can be done by creating the file makeRData.R which contains the following
    source('BigFile.R')
    save(list=ls(all=TRUE), file="BigFile.RData", compress=TRUE)
    q(save="no")
    
    This will generate a compiled R file called BigFile.RData that will save a large amount of loading time.

    37.4 General policy

    The general policy of the module is to treat the C/C++ as a basic wrapping over the underlying functions and rely on the R type system to provide R syntax.

    37.5 Language conventions

    getitem and setitem use C++ conventions (i.e. zero based indices). [<- and [ are overloaded to allow for R syntax (one based indices and slices)

    37.6 C++ classes

    C++ objects are implemented as external pointer objects with the class being the mangled name of the class. The C++ classes are encapsulated as an SEXP with an external pointer type. The class is the mangled name of the class. The nice thing about R is that is allows you to keep track of the pointer object which removes the necessity for a lot of the proxy class baggage you see in other languages.

    37.7 Enumerations

    enumerations are characters which are then converted back and forth to ints before calling the C routines. All of the enumeration code is done in R.

    swig-3.0.12/Doc/Manual/Java.html0000664000175000017500000106432113042756671016141 0ustar williamwilliam SWIG and Java

    25 SWIG and Java

    This chapter describes SWIG's support of Java. It covers most SWIG features, but certain low-level details are covered in less depth than in earlier chapters.

    25.1 Overview

    The 100% Pure Java effort is a commendable concept, however in the real world programmers often either need to re-use their existing code or in some situations want to take advantage of Java but are forced into using some native (C/C++) code. The Java extension to SWIG makes it very easy to plumb in existing C/C++ code for access from Java, as SWIG writes the Java Native Interface (JNI) code for you. It is different to using the 'javah' tool as SWIG will wrap existing C/C++ code, whereas javah takes 'native' Java function declarations and creates C/C++ function prototypes. SWIG wraps C/C++ code using Java proxy classes and is very useful if you want to have access to large amounts of C/C++ code from Java. If only one or two JNI functions are needed then using SWIG may be overkill. SWIG enables a Java program to easily call into C/C++ code from Java. Historically, SWIG was not able to generate any code to call into Java code from C++. However, SWIG now supports full cross language polymorphism and code is generated to call up from C++ to Java when wrapping C++ virtual methods via the director feature.

    Java is one of the few non-scripting language modules in SWIG. As SWIG utilizes the type safety that the Java language offers, it takes a somewhat different approach to that used for scripting languages. In particular runtime type checking and the runtime library are not used by Java. This should be borne in mind when reading the rest of the SWIG documentation. This chapter on Java is relatively self contained and will provide you with nearly everything you need for using SWIG and Java. However, the "SWIG Basics" chapter will be a useful read in conjunction with this one.

    This chapter starts with a few practicalities on running SWIG and compiling the generated code. If you are looking for the minimum amount to read, have a look at the sections up to and including the tour of basic C/C++ wrapping section which explains how to call the various C/C++ code constructs from Java. Following this section are details of the C/C++ code and Java classes that SWIG generates. Due to the complexities of C and C++ there are different ways in which C/C++ code could be wrapped and called from Java. SWIG is a powerful tool and the rest of the chapter details how the default code wrapping can be tailored. Various customisation tips and techniques using SWIG directives are covered. The latter sections cover the advanced techniques of using typemaps for complete control of the wrapping process.

    25.2 Preliminaries

    SWIG 1.1 works with JDKs from JDK 1.1 to JDK1.4 (Java 2 SDK1.4) and should also work with any later versions. Given the choice, you should probably use the latest version of Sun's JDK. The SWIG Java module is known to work using Sun's JVM on Solaris, Linux and the various flavours of Microsoft Windows including Cygwin. The Kaffe JVM is known to give a few problems and at the time of writing was not a fully fledged JVM with full JNI support. The generated code is also known to work on vxWorks using WindRiver's PJava 3.1. The best way to determine whether your combination of operating system and JDK will work is to test the examples and test-suite that comes with SWIG. Run make -k check from the SWIG root directory after installing SWIG on Unix systems.

    The Java module requires your system to support shared libraries and dynamic loading. This is the commonly used method to load JNI code so your system will more than likely support this.

    Android uses Java JNI and also works with SWIG. Please read the Android chapter in conjunction with this one if you are targeting Android.

    25.2.1 Running SWIG

    Suppose that you defined a SWIG module such as the following:

    /* File: example.i */
    %module test
    %{
    #include "stuff.h"
    %}
    int fact(int n);
    

    To build a Java module, run SWIG using the -java option :

    %swig -java example.i
    

    If building C++, add the -c++ option:

    $ swig -c++ -java example.i
    

    This creates two different files; a C/C++ source file example_wrap.c or example_wrap.cxx and numerous Java files. The generated C/C++ source file contains the JNI wrapper code that needs to be compiled and linked with the rest of your C/C++ application.

    The name of the wrapper file is derived from the name of the input file. For example, if the input file is example.i, the name of the wrapper file is example_wrap.c. To change this, you can use the -o option. It is also possible to change the output directory that the Java files are generated into using -outdir.

    The module name, specified with %module, determines the name of various generated classes as discussed later. Note that the module name does not define a Java package and by default, the generated Java classes do not have a Java package. The -package option described below can specify a Java package name to use.

    The following sections have further practical examples and details on how you might go about compiling and using the generated files.

    25.2.2 Additional Commandline Options

    The following table lists the additional commandline options available for the Java module. They can also be seen by using:

    swig -java -help 
    
    Java specific options
    -nopgcpp suppress the premature garbage collection prevention parameter
    -noproxy generate the low-level functional interface instead of proxy classes
    -package <name> set name of the Java package to <name>

    Their use will become clearer by the time you have finished reading this section on SWIG and Java.

    25.2.3 Getting the right header files

    In order to compile the C/C++ wrappers, the compiler needs the jni.h and jni_md.h header files which are part of the JDK. They are usually in directories like this:

    /usr/java/include
    /usr/java/include/<operating_system>
    

    The exact location may vary on your machine, but the above locations are typical.

    25.2.4 Compiling a dynamic module

    The JNI code exists in a dynamic module or shared library (DLL on Windows) and gets loaded by the JVM. Assuming you have code you need to link to in a file called example.c, in order to build a shared library file, you need to compile your module in a manner similar to the following (shown for Solaris):

    $ swig -java example.i
    $ gcc -fPIC -c example_wrap.c -I/usr/java/include -I/usr/java/include/solaris
    $ gcc -fPIC -c example.c
    $ ld -G example_wrap.o example.o -o libexample.so
    

    The exact commands for doing this vary from platform to platform. However, SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the Examples/java directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    Important
    If you are going to use optimisations turned on with gcc (for example -O2), ensure you also compile with -fno-strict-aliasing. The GCC optimisations have become more aggressive from gcc-4.0 onwards and will result in code that fails with strict aliasing optimisations turned on. See the C/C++ to Java typemaps section for more details.

    The name of the shared library output file is important. If the name of your SWIG module is "example", the name of the corresponding shared library file should be "libexample.so" (or equivalent depending on your machine, see Dynamic linking problems for more information). The name of the module is specified using the %module directive or -module command line option.

    25.2.5 Using your module

    To load your shared native library module in Java, simply use Java's System.loadLibrary method in a Java class:

    // runme.java
    
    public class runme {
      static {
        System.loadLibrary("example");
      }
    
      public static void main(String argv[]) {
        System.out.println(example.fact(4));
      }
    }
    

    Compile all the Java files and run:

    $ javac *.java
    $ java runme
    24
    $
    

    If it doesn't work have a look at the following section which discusses problems loading the shared library.

    25.2.6 Dynamic linking problems

    As shown in the previous section the code to load a native library (shared library) is System.loadLibrary("name"). This can fail with an UnsatisfiedLinkError exception and can be due to a number of reasons.

    You may get an exception similar to this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1312)
            at java.lang.Runtime.loadLibrary0(Runtime.java:749)
            at java.lang.System.loadLibrary(System.java:820)
            at runme.<clinit>(runme.java:5)
    

    The most common cause for this is an incorrect naming of the native library for the name passed to the loadLibrary function. The string passed to the loadLibrary function must not include the file extension name in the string, that is .dll or .so. The string must be name and not libname for all platforms. On Windows the native library must then be called name.dll and on most Unix systems it must be called libname.so.

    Another common reason for the native library not loading is because it is not in your path. On Windows make sure the path environment variable contains the path to the native library. On Unix make sure that your LD_LIBRARY_PATH contains the path to the native library. Adding paths to LD_LIBRARY_PATH can slow down other programs on your system so you may want to consider alternative approaches. For example you could recompile your native library with extra path information using -rpath if you're using GNU, see the GNU linker documentation (ld man page). You could use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    The native library will also not load if there are any unresolved symbols in the compiled C/C++ code. The following exception is indicative of this:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: libexample.so: undefined
    symbol: fact
            at java.lang.ClassLoader$NativeLibrary.load(Native Method)
            at java.lang.ClassLoader.loadLibrary0(ClassLoader.java, Compiled Code)
            at java.lang.ClassLoader.loadLibrary(ClassLoader.java, Compiled Code)
            at java.lang.Runtime.loadLibrary0(Runtime.java, Compiled Code)
            at java.lang.System.loadLibrary(System.java, Compiled Code)
            at runme.<clinit>(runme.java:5)
    $
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the native library file. Make sure you compile both the SWIG wrapper file and the code you are wrapping into the native library file. If you forget to compile and link in the SWIG wrapper file into your native library file, you will get a message similar to the following:

    $ java runme
    Exception in thread "main" java.lang.UnsatisfiedLinkError: exampleJNI.gcd(II)I
            at exampleJNI.gcd(Native Method)
            at example.gcd(example.java:12)
            at runme.main(runme.java:18)
    

    where gcd is the missing JNI function that SWIG generated into the wrapper file. Also make sure you pass all of the required libraries to the linker. The java -verbose:jni commandline switch is also a great way to get more information on unresolved symbols. One last piece of advice is to beware of the common faux pas of having more than one native library version in your path.

    In summary, ensure that you are using the correct C/C++ compiler and linker combination and options for successful native library loading. If you are using the examples that ship with SWIG, then the Examples/Makefile must have these set up correctly for your system. The SWIG installation package makes a best attempt at getting these correct but does not get it right 100% of the time. The SWIG Wiki also has some settings for commonly used compiler and operating system combinations. The following section also contains some C++ specific linking problems and solutions.

    25.2.7 Compilation problems and compiling with C++

    On most machines, shared library files should be linked using the C++ compiler. For example:

    % swig -c++ -java example.i
    % g++ -c -fpic example.cxx
    % g++ -c -fpic example_wrap.cxx -I/usr/java/j2sdk1.4.1/include -I/usr/java/j2sdk1.4.1/include/linux
    % g++ -shared example.o example_wrap.o -o libexample.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    % swig -c++ -java example.i
    % CC -c example.cxx
    % CC -c example_wrap.cxx -I/usr/java/include -I/usr/java/include/solaris
    % CC -G example.o example_wrap.o -L/opt/SUNWspro/lib -o libexample.so -lCrun
    

    If you aren't entirely sure about the linking for C++, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your shared library. For example:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    Finally make sure the version of JDK header files matches the version of Java that you are running as incompatibilities could lead to compilation problems or unpredictable behaviour.

    25.2.8 Building on Windows

    Building on Windows is roughly similar to the process used with Unix. You will want to produce a DLL that can be loaded by the Java Virtual Machine. This section covers the process of using SWIG with Microsoft Visual C++ 6 although the procedure may be similar with other compilers. In order for everything to work, you will need to have a JDK installed on your machine in order to read the JNI header files.

    25.2.8.1 Running SWIG from Visual Studio

    If you are developing your application within Microsoft Visual studio, SWIG can be invoked as a custom build option. The Examples\java directory has a few Windows Examples containing Visual Studio project (.dsp) files. The process to re-create the project files for a C project are roughly:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Don't worry if the wrapper file doesn't exist yet--Visual Studio will keep a reference to it.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -java -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to C/C++ tab and select the Preprocessor category. Add the include directories to the JNI header files under "Additional include directories", eg "C:\jdk1.3\include, C:\jdk1.3\include\win32".
    • Next, select the settings for the entire project and go to Link tab and select the General category. Set the name of the output file to match the name of your Java module (ie. example.dll).
    • Next, select the example.c and example_wrap.c files and go to the C/C++ tab and select the Precompiled Headers tab in the project settings. Disabling precompiled headers for these files will overcome any precompiled header errors while building.
    • Finally, add the java compilation as a post build rule in the Post-build step tab in project settings, eg, "c:\jdk1.3\bin\javac *.java"
    • Build your project.

    Note: If using C++, choose a C++ suffix for the wrapper file, for example example_wrap.cxx. Use _wrap.cxx instead of _wrap.c in the instructions above and add -c++ when invoking swig.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. When doing a build, any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file.

    The Java classes that SWIG output should also be compiled into .class files. To run the native code in the DLL (example.dll), make sure that it is in your path then run your Java program which uses it, as described in the previous section. If the library fails to load have a look at Dynamic linking problems.

    25.2.8.2 Using NMAKE

    Alternatively, a Makefile for use by NMAKE can be written. Make sure the environment variables for MSVC++ are available and the MSVC++ tools are in your path. Now, just write a short Makefile like this :

    # Makefile for using SWIG and Java for C code
    
    SRCS          = example.c
    IFILE         = example
    INTERFACE     = $(IFILE).i
    WRAPFILE      = $(IFILE)_wrap.c
    
    # Location of the Visual C++ tools (32 bit assumed)
    
    TOOLS         = c:\msdev
    TARGET        = example.dll
    CC            = $(TOOLS)\bin\cl.exe
    LINK          = $(TOOLS)\bin\link.exe
    INCLUDE32     = -I$(TOOLS)\include
    MACHINE       = IX86
    
    # C Library needed to build a DLL
    
    DLLIBC        = msvcrt.lib oldnames.lib  
    
    # Windows libraries that are apparently needed
    WINLIB        = kernel32.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib
    
    # Libraries common to all DLLs
    LIBS          = $(DLLIBC) $(WINLIB) 
    
    # Linker options
    LOPT      = -debug:full -debugtype:cv /NODEFAULTLIB /RELEASE /NOLOGO \
                 /MACHINE:$(MACHINE) -entry:_DllMainCRTStartup@12 -dll
    
    # C compiler flags
    
    CFLAGS        = /Z7 /Od /c /nologo
    JAVA_INCLUDE    = -ID:\jdk1.3\include -ID:\jdk1.3\include\win32
    
    java::
            swig -java -o $(WRAPFILE) $(INTERFACE)
            $(CC) $(CFLAGS) $(JAVA_INCLUDE) $(SRCS) $(WRAPFILE)
            set LIB=$(TOOLS)\lib
            $(LINK) $(LOPT) -out:example.dll $(LIBS) example.obj example_wrap.obj
            javac *.java
    

    To build the DLL and compile the java code, run NMAKE (you may need to run vcvars32 first). This is a pretty simplistic Makefile, but hopefully its enough to get you started. Of course you may want to make changes for it to work for C++ by adding in the -c++ command line switch for swig and replacing .c with .cxx.

    25.3 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Java interface to your C/C++ code. Functions are wrapped as functions, classes are wrapped as classes, variables are wrapped with JavaBean type getters and setters and so forth. This section briefly covers the essential aspects of this wrapping.

    25.3.1 Modules, packages and generated Java classes

    The SWIG %module directive specifies the name of the Java module. When you specify `%module example', the module name determines the name of some of the generated files in the module. The generated code consists of a module class file example.java, an intermediary JNI class file, exampleJNI.java as well as numerous other Java proxy class files. Each proxy class is named after the structs, unions and classes you are wrapping. You may also get a constants interface file if you are wrapping any unnamed enumerations or constants, for example exampleConstants.java. When choosing a module name, make sure you don't use the same name as one of the generated proxy class files nor a Java keyword. Sometimes a C/C++ type cannot be wrapped by a proxy class, for example a pointer to a primitive type. In these situations a type wrapper class is generated. Wrapping an enum generates an enum class, either a proper Java enum or a Java class that simulates the enums pattern. Details of all these generated classes will unfold as you read this section.

    The JNI (C/C++) code is generated into a file which also contains the module name, for example example_wrap.cxx or example_wrap.c. These C or C++ files complete the contents of the module.

    The generated Java classes can be placed into a Java package by using the -package commandline option. This is often combined with the -outdir to specify a package directory for generating the Java files.

    swig -java -package com.bloggs.swig -outdir com/bloggs/swig example.i
    

    SWIG won't create the directory, so make sure it exists beforehand.

    25.3.2 Functions

    There is no such thing as a global Java function so global C functions are wrapped as static methods in the module class. For example,

    %module example
    int fact(int n);
    
    

    creates a static function that works exactly like you think it might:

    public class example {
      public static int fact(int n) {
        // makes call using JNI to the C function
      }
    }
    

    The Java class example is the module class. The function can be used as follows from Java:

    System.out.println(example.fact(4));
    

    25.3.3 Global variables

    C/C++ global variables are fully supported by SWIG. Java does not allow the overriding of the dot operator so all variables are accessed through getters and setters. Again because there is no such thing as a Java global variable, access to C/C++ global variables is done through static getter and setter functions in the module class.

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
    extern int My_variable;
    extern double density;
    %}
    ...
    

    Now in Java :

    // Print out value of a C global variable
    System.out.println("My_variable = " + example.getMy_variable());
    // Set the value of a C global variable
    example.setDensity(0.8442);
    

    The value returned by the getter will always be up to date even if the value is changed in C. Note that the getters and setters produced follow the JavaBean property design pattern. That is the first letter of the variable name is capitalized and preceded with set or get. If you have the misfortune of wrapping two variables that differ only in the capitalization of their first letters, use %rename to change one of the variable names. For example:

    %rename Clash RenamedClash;
    float Clash;
    int clash;
    

    If a variable is declared as const, it is wrapped as a read-only variable. That is only a getter is produced.

    To make ordinary variables read-only, you can use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    If you just want to make a specific variable immutable, supply a declaration name. For example:

    %{
    extern char *path;
    %}
    %immutable path;
    ...
    extern char *path;      // Read-only (due to %immutable)
    

    25.3.4 Constants

    C/C++ constants are wrapped as Java static final variables. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    

    By default the generated static final variables are initialized by making a JNI call to get their value. The constants are generated into the constants interface and look like this:

    public interface exampleConstants {
      public final static double PI = exampleJNI.PI_get();
      public final static String VERSION = exampleJNI.VERSION_get();
      public final static int FOO = exampleJNI.FOO_get();
      public final static String path = exampleJNI.path_get();
    }
    

    Note that SWIG has inferred the C type and used an appropriate Java type that will fit the range of all possible values for the C type. By default SWIG generates runtime constants. They are not compiler constants that can, for example, be used in a switch statement. This can be changed by using the %javaconst(flag) directive. It works like all the other %feature directives. The default is %javaconst(0). It is possible to initialize all wrapped constants from pure Java code by placing a %javaconst(1) before SWIG parses the constants. Putting it at the top of your interface file would ensure this. Here is an example:

    %javaconst(1);
    %javaconst(0) BIG;
    %javaconst(0) LARGE;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    generates:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = exampleJNI.BIG_get();
      public final static java.math.BigInteger LARGE = exampleJNI.LARGE_get();
    }
    

    Note that SWIG has inferred the C long long type from BIG and used an appropriate Java type (long) as a Java long is the smallest sized Java type that will take all possible values for a C long long. Similarly for LARGE.

    Be careful using the %javaconst(1) directive as not all C code will compile as Java code. For example neither the 1000LL value for BIG nor 2000ULL for LARGE above would generate valid Java code. The example demonstrates how you can target particular constants (BIG and LARGE) with %javaconst. SWIG doesn't use %javaconst(1) as the default as it tries to generate code that will always compile. However, using a %javaconst(1) at the top of your interface file is strongly recommended as the preferred compile time constants will be generated and most C constants will compile as Java code and in any case the odd constant that doesn't can be fixed using %javaconst(0).

    There is an alternative directive which can be used for these rare constant values that won't compile as Java code. This is the %javaconstvalue(value) directive, where value is a Java code replacement for the C constant and can be either a string or a number. This is useful if you do not want to use either the parsed C value nor a JNI call, such as when the C parsed value will not compile as Java code and a compile time constant is required. The same example demonstrates this:

    %javaconst(1);
    %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE;
    %javaconstvalue(1000) BIG;
    
    #define EXPRESSION (0x100+5)
    #define BIG 1000LL
    #define LARGE 2000ULL
    

    Note the string quotes for "2000" are escaped. The following is then generated:

    public interface exampleConstants {
      public final static int EXPRESSION = (0x100+5);
      public final static long BIG = 1000;
      public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000");
    }
    

    Note: declarations declared as const are wrapped as read-only variables and will be accessed using a getter as described in the previous section. They are not wrapped as constants. The exception to this rule are static const integral values defined within a class/struct, where they are wrapped as constants, eg:.

    struct Maths {
      static const int FIVE = 5;
    };
    

    Compatibility Note: In SWIG-1.3.19 and earlier releases, the constants were generated into the module class and the constants interface didn't exist. Backwards compatibility is maintained as the module class implements the constants interface (even though some consider this type of interface implementation to be bad practice):

    public class example implements exampleConstants {
    }
    

    You thus have the choice of accessing these constants from either the module class or the constants interface, for example, example.EXPRESSION or exampleConstants.EXPRESSION. Or if you decide this practice isn't so bad and your own class implements exampleConstants, you can of course just use EXPRESSION.

    25.3.5 Enumerations

    SWIG handles both named and unnamed (anonymous) enumerations. There is a choice of approaches to wrapping named C/C++ enums. This is due to historical reasons as SWIG's initial support for enums was limited and Java did not originally have support for enums. Each approach has advantages and disadvantages and it is important for the user to decide which is the most appropriate solution. There are four approaches of which the first is the default approach based on the so called Java typesafe enum pattern. The second generates proper Java enums. The final two approaches use simple integers for each enum item. Before looking at the various approaches for wrapping named C/C++ enums, anonymous enums are considered.

    25.3.5.1 Anonymous enums

    There is no name for anonymous enums and so they are handled like constants. For example:

    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    is wrapped into the constants interface, in a similar manner as constants (see previous section):

    public interface exampleConstants {
      public final static int ALE = exampleJNI.ALE_get();
      public final static int LAGER = exampleJNI.LAGER_get();
      public final static int STOUT = exampleJNI.STOUT_get();
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = exampleJNI.PILZ_get();
    }
    

    The %javaconst(flag) and %javaconstvalue(value) directive introduced in the previous section on constants can also be used with enums. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is strongly recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. Using %javaconst(1) will ensure compile time constants are generated, thereby allowing the enum values to be used in Java switch statements. Example usage:

    %javaconst(1);
    %javaconst(0) PILSNER;
    enum { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    generates:

    public interface exampleConstants {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = exampleJNI.PILSNER_get();
      public final static int PILZ = PILSNER;
    }
    

    As in the case of constants, you can access them through either the module class or the constants interface, for example, example.ALE or exampleConstants.ALE.

    25.3.5.2 Typesafe enums

    This is the default approach to wrapping named enums. The typesafe enum pattern is a relatively well known construct to work around the lack of enums in versions of Java prior to JDK 1.5. It basically defines a class for the enumeration and permits a limited number of final static instances of the class. Each instance equates to an enum item within the enumeration. The implementation is in the "enumtypesafe.swg" file. Let's look at an example:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", exampleJNI.LAGER_get());
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", exampleJNI.PILZ_get());
      [... additional support methods omitted for brevity ...]
    }
    

    See Typesafe enum classes to see the omitted support methods. Note that the enum item with an initializer (LAGER) is initialized with the enum value obtained via a JNI call. However, as with anonymous enums and constants, use of the %javaconst directive is strongly recommended to change this behaviour:

    %include "enumtypesafe.swg" // optional as typesafe enums are the default
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    The generated code is easier to read and more efficient as a true constant is used instead of a JNI call. As is the case for constants, the default is %javaconst(0) as not all C values will compile as Java code. However, it is recommended to add in a %javaconst(1) directive at the top of your interface file as it is only on very rare occasions that this will produce code that won't compile under Java. The %javaconstvalue(value) directive can also be used for typesafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Typesafe enums have their advantages over using plain integers in that they can be used in a typesafe manner. However, there are limitations. For example, they cannot be used in switch statements and serialization is an issue. Please look at the following references for further information: http://java.sun.com/developer/Books/shiftintojava/page1.html#replaceenums Replace Enums with Classes in Effective Java Programming on the Sun website, Create enumerated constants in Java JavaWorld article, Java Tip 133: More on typesafe enums and Java Tip 122: Beware of Java typesafe enumerations JavaWorld tips.

    Note that the syntax required for using typesafe enums is the same as that for proper Java enums. This is useful during the period that a project has to support legacy versions of Java. When upgrading to JDK 1.5 or later, proper Java enums could be used instead, without users having to change their code. The following section details proper Java enum generation.

    25.3.5.3 Proper Java enums

    Proper Java enums were only introduced in JDK 1.5 so this approach is only compatible with more recent versions of Java. Java enums have been designed to overcome all the limitations of both typesafe and type unsafe enums and should be the choice solution, provided older versions of Java do not have to be supported. In this approach, each named C/C++ enum is wrapped by a Java enum. Java enums, by default, do not support enums with initializers. Java enums are in many respects similar to Java classes in that they can be customised with additional methods. SWIG takes advantage of this feature to facilitate wrapping C/C++ enums that have initializers. In order to wrap all possible C/C++ enums using proper Java enums, the "enums.swg" file must be used. Let's take a look at an example.

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
      [... additional support methods omitted for brevity ...]
    }
    

    See Proper Java enum classes to see the omitted support methods. The generated Java enum has numerous additional methods to support enums with initializers, such as LAGER above. Note that as with the typesafe enum pattern, enum items with initializers are by default initialized with the enum value obtained via a JNI call. However, this is not the case above as we have used the recommended %javaconst(1) to avoid the JNI call. The %javaconstvalue(value) directive covered in the Constants section can also be used for proper Java enums.

    The additional support methods need not be generated if none of the enum items have initializers and this is covered later in the Simpler Java enums for enums without initializers section.

    25.3.5.4 Type unsafe enums

    In this approach each enum item in a named enumeration is wrapped as a static final integer in a class named after the C/C++ enum name. This is a commonly used pattern in Java to simulate C/C++ enums, but it is not typesafe. However, the main advantage over the typesafe enum pattern is enum items can be used in switch statements. In order to use this approach, the "enumtypeunsafe.swg" file must be used. Let's take a look at an example.

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    will generate:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    As is the case previously, the default is %javaconst(0) as not all C/C++ values will compile as Java code. However, again it is recommended to add in a %javaconst(1) directive. and the %javaconstvalue(value) directive covered in the Constants section can also be used for type unsafe enums. Note that global enums are generated into a Java class within whatever package you are using. C++ enums defined within a C++ class are generated into a static final inner Java class within the Java proxy class.

    Note that unlike typesafe enums, this approach requires users to mostly use different syntax compared with proper Java enums. Thus the upgrade path to proper enums provided in JDK 1.5 is more painful.

    25.3.5.5 Simple enums

    This approach is similar to the type unsafe approach. Each enum item is also wrapped as a static final integer. However, these integers are not generated into a class named after the C/C++ enum. Instead, global enums are generated into the constants interface. Also, enums defined in a C++ class have their enum items generated directly into the Java proxy class rather than an inner class within the Java proxy class. In fact, this approach is effectively wrapping the enums as if they were anonymous enums and the resulting code is as per anonymous enums. The implementation is in the "enumsimple.swg" file.

    Compatibility Note: SWIG-1.3.21 and earlier versions wrapped all enums using this approach. The type unsafe approach is preferable to this one and this simple approach is only included for backwards compatibility with these earlier versions of SWIG.

    25.3.6 Pointers

    C/C++ pointers are fully supported by SWIG. Furthermore, SWIG has no problem working with incomplete type information. Here is a rather simple interface:

    %module example
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    When wrapped, you will be able to use the functions in a natural way from Java. For example:

    SWIGTYPE_p_FILE f = example.fopen("junk", "w");
    example.fputs("Hello World\n", f);
    example.fclose(f);
    

    C pointers in the Java module are stored in a Java long and cross the JNI boundary held within this 64 bit number. Many other SWIG language modules use an encoding of the pointer in a string. These scripting languages use the SWIG runtime type checker for dynamic type checking as they do not support static type checking by a compiler. In order to implement static type checking of pointers within Java, they are wrapped by a simple Java class. In the example above the FILE * pointer is wrapped with a type wrapper class called SWIGTYPE_p_FILE.

    Once obtained, a type wrapper object can be freely passed around to different C functions that expect to receive an object of that type. The only thing you can't do is dereference the pointer from Java. Of course, that isn't much of a concern in this example.

    As much as you might be inclined to modify a pointer value directly from Java, don't. The value is not necessarily the same as the logical memory address of the underlying object. The value will vary depending on the native byte-ordering of the platform (i.e., big-endian vs. little-endian). Most JVMs are 32 bit applications so any JNI code must also be compiled as 32 bit. The net result is pointers in JNI code are also 32 bits and are stored in the high order 4 bytes on big-endian machines and in the low order 4 bytes on little-endian machines. By design it is also not possible to manually cast a pointer to a new type by using Java casts as it is particularly dangerous especially when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
      return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return a NULL pointer if the conversion can't be performed.

    25.3.7 Structures

    If you wrap a C structure, it is wrapped by a Java class with getters and setters for access to the member variables. For example,

    struct Vector {
      double x, y, z;
    };
    
    

    is used as follows:

    Vector v = new Vector();
    v.setX(3.5);
    v.setY(7.2);
    double x = v.getX();
    double y = v.getY();
    

    The variable setters and getters are also based on the JavaBean design pattern already covered under the Global variables section. Similar access is provided for unions and the public data members of C++ classes.

    This object is actually an instance of a Java class that has been wrapped around a pointer to the C structure. This instance doesn't actually do anything--it just serves as a proxy. The pointer to the C object is held in the Java proxy class in much the same way as pointers are held by type wrapper classes. Further details about Java proxy classes are covered a little later.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    If a structure contains arrays, access to those arrays is managed through pointers. For example, consider this:

    struct Bar {
      int  x[16];
    };
    

    If accessed in Java, you will see behavior like this:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    

    This pointer can be passed around to functions that expect to receive an int * (just like C). You can also set the value of an array member using another pointer. For example:

    Bar b = new Bar();
    SWIGTYPE_p_int x = b.getX();
    Bar c = new Bar();
    c.setX(x);                    // Copy contents of b.x to c.x
    

    For array assignment (setters not getters), SWIG copies the entire contents of the array starting with the data pointed to by b.x. In this example, 16 integers would be copied. Like C, SWIG makes no assumptions about bounds checking---if you pass a bad pointer, you may get a segmentation fault or access violation. The default wrapping makes it hard to set or get just one element of the array and so array access from Java is somewhat limited. This can be changed easily though by using the approach outlined later in the Wrapping C arrays with Java arrays and Unbounded C Arrays sections.

    When a member of a structure is itself a structure, it is handled as a pointer. For example, suppose you have two structures like this:

    struct Foo {
      int a;
    };
    
    struct Bar {
      Foo f;
    };
    

    Now, suppose that you access the f member of Bar like this:

    Bar b = new Bar();
    Foo x = b.getF();
    

    In this case, x is a pointer that points to the Foo that is inside b. This is the same value as generated by this C code:

    Bar b;
    Foo *x = &b->f;       /* Points inside b */
    

    Because the pointer points inside the structure, you can modify the contents and everything works just like you would expect. For example:

    Bar b = new Bar();
    b.getF().setA(3);   // Modify b.f.a
    Foo x = b.getF();                   
    x.setA(3);          // Modify x.a - this is the same as b.f.a
    

    25.3.8 C++ classes

    C++ classes are wrapped by Java classes as well. For example, if you have this class,

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    };
    

    you can use it in Java like this:

    List l = new List();
    l.insert("Ale");
    l.insert("Stout");
    l.insert("Lager");
    String item = l.get(2);
    int length = l.getLength();
    

    Class data members are accessed in the same manner as C structures.

    Static class members are unsurprisingly wrapped as static members of the Java class:

    class Spam {
    public:
      static void foo();
      static int bar;
    };
    

    The static members work like any other Java static member:

    Spam.foo();
    int bar = Spam.getBar();
    

    25.3.9 C++ inheritance

    SWIG is fully aware of issues related to C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    those classes are wrapped into a hierarchy of Java classes that reflect the same inheritance structure:

    Bar b = new Bar();
    Class c = b.getClass();
    System.out.println(c.getSuperclass().getName());
    

    will of course display:

    Foo
    

    Furthermore, if you have functions like this

    void spam(Foo *f);
    

    then the Java function spam() accepts instances of Foo or instances of any other proxy classes derived from Foo.

    Note that Java does not support multiple inheritance so any multiple inheritance in the C++ code is not going to work. A warning is given when multiple inheritance is detected and only the first base class is used.

    25.3.10 Pointers, references, arrays and pass by value

    In C++, there are many different ways a function might receive and manipulate objects. For example:

    void spam1(Foo *x);      // Pass by pointer
    void spam2(Foo &x);      // Pass by reference
    void spam3(Foo x);       // Pass by value
    void spam4(Foo x[]);     // Array of objects
    

    In Java, there is no detailed distinction like this--specifically, there are only instances of classes. There are no pointers nor references. Because of this, SWIG unifies all of these types together in the wrapper code. For instance, if you actually had the above functions, it is perfectly legal to do this from Java:

    Foo f = new Foo();  // Create a Foo
    example.spam1(f);   // Ok. Pointer
    example.spam2(f);   // Ok. Reference
    example.spam3(f);   // Ok. Value.
    example.spam4(f);   // Ok. Array (1 element)
    

    Similar behavior occurs for return values. For example, if you had functions like this,

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    then all three functions will return a pointer to some Foo object. Since the third function (spam7) returns a value, newly allocated memory is used to hold the result and a pointer is returned (Java will release this memory when the returned object's finalizer is run by the garbage collector).

    25.3.10.1 Null pointers

    Working with null pointers is easy. A Java null can be used whenever a method expects a proxy class or typewrapper class. However, it is not possible to pass null to C/C++ functions that take parameters by value or by reference. If you try you will get a NullPointerException.

    example.spam1(null);   // Pointer - ok
    example.spam2(null);   // Reference - NullPointerException
    example.spam3(null);   // Value - NullPointerException
    example.spam4(null);   // Array - ok
    

    For spam1 and spam4 above the Java null gets translated into a NULL pointer for passing to the C/C++ function. The converse also occurs, that is, NULL pointers are translated into null Java objects when returned from a C/C++ function.

    25.3.11 C++ overloaded functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    %module example
    
    void foo(int);
    void foo(char *c);
    

    You can use them in Java in a straightforward manner:

    example.foo(3);           // foo(int)
    example.foo("Hello");     // foo(char *c)
    

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };
    

    you can write Java code like this:

    Foo f = new Foo();        // Create a Foo
    Foo g = new Foo(f);       // Copy f
    

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG cannot disambiguate as there can be more than one C++ type mapping onto a single Java type. For example:

    void spam(int);
    void spam(unsigned short);
    

    Here both int and unsigned short map onto a Java int. Here is another example:

    void foo(Bar *b);
    void foo(Bar &b);
    

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 515: Overloaded method spam(unsigned short) ignored.
    Method spam(int) at example.i:11 used.
    

    To fix this, you either need to either rename or ignore one of the methods. For example:

    %rename(spam_ushort) spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Now renamed to spam_ushort
    

    or

    %ignore spam(unsigned short);
    ...
    void spam(int);    
    void spam(unsigned short);   // Ignored
    

    25.3.12 C++ default arguments

    Any function with a default argument is wrapped by generating an additional function for each argument that is defaulted. For example, if we have the following C++:

    %module example
    
    void defaults(double d=10.0, int i=0);
    

    The following methods are generated in the Java module class:

    public class example {
      public static void defaults(double d, int i) { ... }
      public static void defaults(double d) { ... }
      public static void defaults() { ... }
    }
    

    It is as if SWIG had parsed three separate overloaded methods. The same approach is taken for static methods, constructors and member methods.

    Compatibility note: Versions of SWIG prior to SWIG-1.3.23 wrapped these with a single wrapper method and so the default values could not be taken advantage of from Java. Further details on default arguments and how to restore this approach are given in the more general Default arguments section.

    25.3.13 C++ namespaces

    SWIG is aware of named C++ namespaces and they can be mapped to Java packages, however, the default wrapping flattens the namespaces, effectively ignoring them. So by default, the namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };
    

    it works in Java as follows:

    int f = example.fact(3);
    Vector v = new Vector();
    v.setX(3.4);
    double y = v.getY();
    

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    If you have more than one namespace and you want to keep their symbols separate, consider wrapping them as separate SWIG modules. Each SWIG module can be placed into a separate package.

    The default behaviour described above can be improved via the nspace feature. Note that it only works for classes, structs, unions and enums declared within a named C++ namespace. When the nspace feature is used, the C++ namespaces are converted into Java packages of the same name. Proxy classes are thus declared within a package and this proxy makes numerous calls to the JNI intermediary class which is declared in the unnamed package by default. As Java does not support types declared in a named package accessing types declared in an unnamed package, the -package commandline option described earlier generally should be used to provide a parent package. So if SWIG is run using the -package com.myco option, a wrapped class, MyWorld::Material::Color, can then be accessed as com.myco.MyWorld.Material.Color. If you don't specify a package, you will get the following warning:

    example.i:16: Warning 826: The nspace feature is used on 'MyWorld::Material::Color' without -package. The generated code 
    may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package.
    

    If it is undesirable to have a single top level package, the nspace feature may be used without the -package commandline option (and the resulting warning ignored) if all of the types exposed using SWIG are placed in a package using the nspace feature and the 'jniclasspackage' pragma is used to specify a package for the JNI intermediary class.

    If the resulting use of the nspace feature and hence packages results in a proxy class in one package deriving or using a proxy class from another package, you will need to open up the visibility for the pointer constructor and getCPtr method from the default 'protected' to 'public' with the SWIG_JAVABODY_PROXY macro. See Java code typemaps.

    25.3.14 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    %{
    #include <utility>
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(pairii) pair<int, int>;
    

    In Java:

    pairii p = new pairii(3, 4);
    int first = p.getFirst();
    int second = p.getSecond();
    

    Obviously, there is more to template wrapping than shown in this example. More details can be found in the SWIG and C++ chapter.

    25.3.15 C++ Smart Pointers

    25.3.15.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Java in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    25.3.15.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }
    

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };
    

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo();   // Created somehow (not shown)
    ...
    p->x = 3;                        // Foo::x
    int y = p->bar();                // Foo::bar
    

    To wrap this in Java, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...
    

    Now, in Java, everything should just "work":

    SmartPtrFoo p = example.CreateFoo(); // Create a smart-pointer somehow
    p.setX(3);                           // Foo::x
    int y = p.bar();                     // Foo::bar
    

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    Foo f = p.__deref__();               // Returns underlying Foo *
    

    25.4 Further details on the generated Java classes

    In the previous section, a high-level view of Java wrapping was presented. A key component of this wrapping is that structures and classes are wrapped by Java proxy classes and type wrapper classes are used in situations where no proxies are generated. This provides a very natural, type safe Java interface to the C/C++ code and fits in with the Java programming paradigm. However, a number of low-level details were omitted. This section provides a brief overview of how the proxy classes work and then covers the type wrapper classes. Finally enum classes are covered. First, the crucial intermediary JNI class is considered.

    25.4.1 The intermediary JNI class

    In the "SWIG basics" and "SWIG and C++" chapters, details of low-level structure and class wrapping are described. To summarize those chapters, if you have a global function and class like this

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    void egg(Foo* chips);
    

    then SWIG transforms the class into a set of low-level procedural wrappers. These procedural wrappers essentially perform the equivalent of this C++ code:

    Foo *new_Foo() {
      return new Foo();
    }
    void delete_Foo(Foo *f) {
      delete f;
    }
    int Foo_x_get(Foo *f) {
      return f->x;
    }
    void Foo_x_set(Foo *f, int value) {
      f->x = value;
    }
    int Foo_spam(Foo *f, int num, Foo* foo) {
      return f->spam(num, foo);
    }
    

    These procedural function names don't actually exist, but their functionality appears inside the generated JNI functions. The JNI functions have to follow a particular naming convention so the function names are actually:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_new_1Foo(JNIEnv *jenv, jclass jcls);
    SWIGEXPORT void JNICALL Java_exampleJNI_delete_1Foo(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1);
    SWIGEXPORT void JNICALL Java_exampleJNI_Foo_1x_1set(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_, jint jarg2);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1x_1get(JNIEnv *jenv, jclass jcls,
                                                        jlong jarg1, jobject jarg1_);
    SWIGEXPORT jint JNICALL Java_exampleJNI_Foo_1spam(JNIEnv *jenv, jclass jcls,
                                                      jlong jarg1, jobject jarg1_, jint jarg2,
                                                      jlong jarg3, jobject jarg3_);
    SWIGEXPORT void JNICALL Java_exampleJNI_egg(JNIEnv *jenv, jclass jcls,
                                                jlong jarg1, jobject jarg1_);
    

    For every JNI C function there has to be a static native Java function. These appear in the intermediary JNI class:

    class exampleJNI {
      public final static native long new_Foo();
      public final static native void delete_Foo(long jarg1);
      public final static native void Foo_x_set(long jarg1, Foo jarg1_, int jarg2);
      public final static native int Foo_x_get(long jarg1, Foo jarg1_);
      public final static native int Foo_spam(long jarg1, Foo jarg1_, int jarg2,
                                              long jarg3, Foo jarg3_);
      public final static native void egg(long jarg1, Foo jarg1_);
    }
    

    This class contains the complete Java - C/C++ interface so all function calls go via this class. As this class acts as a go-between for all JNI calls to C/C++ code from the Java proxy classes, type wrapper classes and module class, it is known as the intermediary JNI class.

    You may notice that SWIG uses a Java long wherever a pointer or class object needs to be marshalled across the Java-C/C++ boundary. This approach leads to minimal JNI code which makes for better performance as JNI code involves a lot of string manipulation. SWIG favours generating Java code over JNI code as Java code is compiled into byte code and avoids the costly string operations needed in JNI code. This approach has a downside though as the proxy class might get collected before the native method has completed. You might notice above that there is an additional parameters with a underscore postfix, eg jarg1_. These are added in order to prevent premature garbage collection when marshalling proxy classes.

    The functions in the intermediary JNI class cannot be accessed outside of its package. Access to them is gained through the module class for globals otherwise the appropriate proxy class.

    The name of the intermediary JNI class can be changed from its default, that is, the module name with JNI appended after it. The module directive attribute jniclassname is used to achieve this:

    %module (jniclassname="name") modulename
    

    If name is the same as modulename then the module class name gets changed from modulename to modulenameModule.

    25.4.1.1 The intermediary JNI class pragmas

    The intermediary JNI class can be tailored through the use of pragmas, but is not commonly done. The pragmas for this class are:

    Pragma Description
    jniclassbase Base class for the intermediary JNI class
    jniclasspackage Package in which to place the intermediary JNI class
    jniclassclassmodifiers Class modifiers and class type for the intermediary JNI class
    jniclasscode Java code is copied verbatim into the intermediary JNI class
    jniclassimports Java code, usually one or more import statements, placed before the intermediary JNI class definition
    jniclassinterfaces Comma separated interface classes for the intermediary JNI class

    The pragma code appears in the generated intermediary JNI class where you would expect:

    [ jniclassimports pragma ]
    [ jniclassclassmodifiers pragma ] jniclassname extends [ jniclassbase pragma ]
                                              implements [ jniclassinterfaces pragma ] {
    [ jniclasscode pragma ]
    ... SWIG generated native methods ...
    }
    

    The jniclasscode pragma is quite useful for adding in a static block for loading the shared library / dynamic link library and demonstrates how pragmas work:

    %pragma(java) jniclasscode=%{
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. \n" + e);
          System.exit(1);
        }
      }
    %}
    

    Pragmas will take either "" or %{ %} as delimiters. For example, let's change the intermediary JNI class access to just the default package-private access.

    %pragma(java) jniclassclassmodifiers="class"
    

    All the methods in the intermediary JNI class will then not be callable outside of the package as the method modifiers have been changed from public access to default access. This is useful if you want to prevent users calling these low level functions.

    25.4.2 The Java module class

    All global functions and variable getters/setters appear in the module class. For our example, there is just one function:

    public class example {
      public static void egg(Foo chips) {
        exampleJNI.egg(Foo.getCPtr(chips), chips);
      }
    }
    

    The module class is necessary as there is no such thing as a global in Java so all the C globals are put into this class. They are generated as static functions and so must be accessed as such by using the module name in the static function call:

    example.egg(new Foo());
    

    The primary reason for having the module class wrapping the calls in the intermediary JNI class is to implement static type checking. In this case only a Foo can be passed to the egg function, whereas any long can be passed to the egg function in the intermediary JNI class.

    25.4.2.1 The Java module class pragmas

    The module class can be tailored through the use of pragmas, in the same manner as the intermediary JNI class. The pragmas are similarly named and are used in the same way. The complete list follows:

    Pragma Description
    modulebase Base class for the module class
    moduleclassmodifiers Class modifiers and class type for the module class
    modulecode Java code is copied verbatim into the module class
    moduleimports Java code, usually one or more import statements, placed before the module class definition
    moduleinterfaces Comma separated interface classes for the module class

    The pragma code appears in the generated module class like this:

    [ moduleimports pragma ]
    [ modulemodifiers pragma ] modulename extends [ modulebase pragma ]
                                          implements [ moduleinterfaces pragma ] {
    [ modulecode pragma ]
    ... SWIG generated wrapper functions ...
    }
    

    See The intermediary JNI class pragmas section for further details on using pragmas.

    25.4.3 Java proxy classes

    A Java proxy class is generated for each structure, union or C++ class that is wrapped. Proxy classes have also been called peer classes. The default proxy class for our previous example looks like this:

    public class Foo {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Foo(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Foo obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Foo(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public void setX(int value) {
        exampleJNI.Foo_x_set(swigCPtr, this, value);
      }
    
      public int getX() {
        return exampleJNI.Foo_x_get(swigCPtr, this);
      }
    
      public int spam(int num, Foo foo) {
        return exampleJNI.Foo_spam(swigCPtr, this, num, Foo.getCPtr(foo), foo);
      }
    
      public Foo() {
        this(exampleJNI.new_Foo(), true);
      }
    
    }
    

    This class merely holds a pointer to the underlying C++ object (swigCPtr). It also contains all the methods in the C++ class it is proxying plus getters and setters for public member variables. These functions call the native methods in the intermediary JNI class. The advantage of having this extra layer is the type safety that the proxy class functions offer. It adds static type checking which leads to fewer surprises at runtime. For example, you can see that if you attempt to use the spam() function it will only compile when the parameters passed are an int and a Foo. From a user's point of view, it makes the class work as if it were a Java class:

    Foo f = new Foo();
    f.setX(3);
    int y = f.spam(5, new Foo());
    

    25.4.3.1 Memory management

    Each proxy class has an ownership flag swigCMemOwn. The value of this flag determines who is responsible for deleting the underlying C++ object. If set to true, the proxy class's finalizer will destroy the C++ object when the proxy class is garbage collected. If set to false, then the destruction of the proxy class has no effect on the C++ object.

    When an object is created by a constructor or returned by value, Java automatically takes ownership of the result. On the other hand, when pointers or references are returned to Java, there is often no way to know where they came from. Therefore, the ownership is set to false. For example:

    class Foo {
    public:
      Foo();
      Foo bar1();
      Foo &bar2();
      Foo *bar2();
    };
    

    In Java:

    Foo f = new Foo();   //  f.swigCMemOwn = true
    Foo f1 = f.bar1();   // f1.swigCMemOwn = true
    Foo f2 = f.bar2();   // f2.swigCMemOwn = false
    Foo f3 = f.bar3();   // f3.swigCMemOwn = false
    

    This behavior for pointers and references is especially important for classes that act as containers. For example, if a method returns a pointer to an object that is contained inside another object, you definitely don't want Java to assume ownership and destroy it!

    For the most part, memory management issues remain hidden. However, there are situations where you might have to manually change the ownership of an object. For instance, consider code like this:

    class Obj {};
    class Node {
      Obj *value;
    public:
      void set_value(Obj *v) { value = v; }
    };
    

    Now, consider the following Java code:

    Node n = new Node();    // Create a node
    {
      Obj o = new Obj();    // Create an object
      n.set_value(o);       // Set value
    }                       // o goes out of scope
    

    In this case, the Node n is holding a reference to o internally. However, SWIG has no way to know that this has occurred. The Java proxy class still thinks that it has ownership of o. As o has gone out of scope, it could be garbage collected in which case the C++ destructor will be invoked and n will then be holding a stale-pointer to o. If you're lucky, you will only get a segmentation fault.

    To work around this, the ownership flag of o needs changing to false. The ownership flag is a private member variable of the proxy class so this is not possible without some customization of the proxy class. This can be achieved by using a typemap to customise the proxy class with pure Java code as detailed later in the section on Java typemaps.

    Sometimes a function will create memory and return a pointer to a newly allocated object. SWIG has no way of knowing this so by default the proxy class does not manage the returned object. However, you can tell the proxy class to manage the memory if you specify the %newobject directive. Consider:

    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    If we call the factory function, then we have to manually delete the memory:

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = false
    ...
    obj.delete();
    

    Now add in the %newobject directive:

    %newobject Factory::createObj();
    
    class Obj {...};
    class Factory {
    public:
      static Obj *createObj() { return new Obj(); }
    };
    

    A call to delete() is no longer necessary as the garbage collector will make the C++ destructor call because swigCMemOwn is now true.

    Obj obj = Factory.createObj();   // obj.swigCMemOwn = true;
    ...
    

    Some memory management issues are quite tricky to fix and may only be noticeable after using for a long time. One such issue is premature garbage collection of an object created from Java and resultant usage from C++ code. The section on typemap examples cover two such scenarios, Memory management for objects passed to the C++ layer and Memory management when returning references to member variables

    25.4.3.2 Inheritance

    Java proxy classes will mirror C++ inheritance chains. For example, given the base class Base and its derived class Derived:

    class Base {
    public:
      virtual double foo();
    };
    
    class Derived : public Base {
    public:
      virtual double foo();
    };
    

    The base class is generated much like any other proxy class seen so far:

    public class Base {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Base(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Base obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Base(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      public double foo() {
        return exampleJNI.Base_foo(swigCPtr, this);
      }
    
      public Base() {
        this(exampleJNI.new_Base(), true);
      }
    
    }
    

    The Derived class extends Base mirroring the C++ class inheritance hierarchy.

    public class Derived extends Base {
      private transient long swigCPtr;
    
      protected Derived(long cPtr, boolean cMemoryOwn) {
        super(exampleJNI.SWIGDerivedUpcast(cPtr), cMemoryOwn);
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Derived obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Derived(swigCPtr);
        }
        swigCPtr = 0;
        super.delete();
      }
    
      public double foo() {
        return exampleJNI.Derived_foo(swigCPtr, this);
      }
    
      public Derived() {
        this(exampleJNI.new_Derived(), true);
      }
    
    }
    

    Note the memory ownership is controlled by the base class. However each class in the inheritance hierarchy has its own pointer value which is obtained during construction. The SWIGDerivedUpcast() call converts the pointer from a Derived * to a Base *. This is a necessity as C++ compilers are free to implement pointers in the inheritance hierarchy with different values.

    It is of course possible to extend Base using your own Java classes. If Derived is provided by the C++ code, you could for example add in a pure Java class Extended derived from Base. There is a caveat and that is any C++ code will not know about your pure Java class Extended so this type of derivation is restricted. However, true cross language polymorphism can be achieved using the directors feature.

    25.4.3.3 Proxy classes and garbage collection

    By default each proxy class has a delete() and a finalize() method. The finalize() method calls delete() which frees any malloc'd memory for wrapped C structs or calls the C++ class destructors. The idea is for delete() to be called when you have finished with the C/C++ object. Ideally you need not call delete(), but rather leave it to the garbage collector to call it from the finalizer. When a program exits, the garbage collector does not guarantee to call all finalizers. An insight into the reasoning behind this can be obtained from Hans Boehm's Destructors, Finalizers, and Synchronization paper. Depending on what the finalizers do and which operating system you use, this may or may not be a problem.

    If the delete() call into JNI code is just for memory handling, there is not a problem when run on most operating systems, for example Windows and Unix. Say your JNI code creates memory on the heap which your finalizers should clean up, the finalizers may or may not be called before the program exits. In Windows and Unix all memory that a process uses is returned to the system on exit, so this isn't a problem. This is not the case in some operating systems like vxWorks. If however, your finalizer calls into JNI code invoking the C++ destructor which in turn releases a TCP/IP socket for example, there is no guarantee that it will be released. Note that with long running programs the garbage collector will eventually run, thereby calling any unreferenced object's finalizers.

    Some not so ideal solutions are:

    1. Call the System.runFinalizersOnExit(true) or Runtime.getRuntime().runFinalizersOnExit(true) to ensure the finalizers are called before the program exits. The catch is that this is a deprecated function call as the documentation says:

      This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

      In many cases you will be lucky and find that it works, but it is not to be advocated. Have a look at Java web site and search for runFinalizersOnExit.

    2. From jdk1.3 onwards a new function, addShutdownHook(), was introduced which is guaranteed to be called when your program exits. You can encourage the garbage collector to call the finalizers, for example, add this static block to the class that has the main() function:

        static {
          Runtime.getRuntime().addShutdownHook( 
            new Thread() {
              public void run() { System.gc(); System.runFinalization(); }
            }
          );
        }
      

      Although this usually works, the documentation doesn't guarantee that runFinalization() will actually call the finalizers. As the shutdown hook is guaranteed you could also make a JNI call to clean up any resources that are being tracked by the C/C++ code.

    3. Call the delete() function manually which will immediately invoke the C++ destructor. As a suggestion it may be a good idea to set the object to null so that should the object be inadvertently used again a Java null pointer exception is thrown, the alternative would crash the JVM by using a null C pointer. For example given a SWIG generated class A:

      A myA = new A();
      // use myA ...
      myA.delete();
      // any use of myA here would crash the JVM 
      myA=null;
      // any use of myA here would cause a Java null pointer exception to be thrown
      

      The SWIG generated code ensures that the memory is not deleted twice, in the event the finalizers get called in addition to the manual delete() call.

    4. Write your own object manager in Java. You could derive all SWIG classes from a single base class which could track which objects have had their finalizers run, then call the rest of them on program termination. The section on Java typemaps details how to specify a pure Java base class.

    See the How to Handle Java Finalization's Memory-Retention Issues article for alternative approaches to managing memory by avoiding finalizers altogether.

    25.4.3.4 The premature garbage collection prevention parameter for proxy class marshalling

    As covered earlier, the C/C++ struct/class pointer is stored in the proxy class as a Java long and when needed is passed into the native method where it is cast into the appropriate type. This approach provides very fast marshalling but could be susceptible to premature garbage collection. Consider the following C++ code:

    class Wibble {
    };
    void wobble(Wibble &w);
    

    The module class contains the Java wrapper for the global wobble method:

    public class example {
      ...
      public static void wobble(Wibble w) {
        exampleJNI.wobble(Wibble.getCPtr(w), w);
      }
    }
    

    where example is the name of the module. All native methods go through the intermediary class which has the native method declared as such:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1, Wibble jarg1_);
    }
    

    The second parameter, jarg1_, is the premature garbage collection prevention parameter and is added to the native method parameter list whenever a C/C++ struct or class is marshalled as a Java long. In order to understand why, consider the alternative where the intermediary class method is declared without the additional parameter:

    public class exampleJNI {
      ...
      public final static native void wobble(long jarg1);
    }
    

    and the following simple call to wobble:

    {
      Wibble w = new Wibble();
      example.wobble(w);
    }
    

    The hotspot compiler effectively sees something like:

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      // w is no longer reachable
      exampleJNI.wobble(w_ptr);
    }
    

    The Wibble object is no longer reachable after the point shown as in this bit of code, the Wibble object is not referenced again after this point. This means that it is a candidate for garbage collection. Should wobble be a long running method, it is quite likely that the finalizer for the Wibble instance will be called. This in turn will call its underlying C++ destructor which is obviously disastrous while the method wobble is running using this object. Even if wobble is not a long running method, it is possible for the Wibble instance to be finalized. By passing the Wibble instance into the native method, it will not be finalized as the JVM guarantees not to finalize any objects until the native method returns. Effectively, the code then becomes

    {
      Wibble w = new Wibble();
      long w_ptr = Wibble.getCPtr(w);
      exampleJNI.wobble(w_ptr, w);
      // w is no longer reachable
    }
    

    and therefore there is no possibility of premature garbage collection. In practice, this premature garbage collection was only ever observed in Sun's server JVM from jdk-1.3 onwards and in Sun's client JVM from jdk-1.6 onwards.

    The premature garbage collection prevention parameter for proxy classes is generated by default whenever proxy classes are passed by value, reference or with a pointer. The implementation for this extra parameter generation requires the "jtype" typemap to contain long and the "jstype" typemap to contain the name of a proxy class.

    The additional parameter does impose a slight performance overhead and the parameter generation can be suppressed globally with the -nopgcpp commandline option. More selective suppression is possible with the 'nopgcpp' attribute in the "jtype" Java typemap. The attribute is a flag and so should be set to "1" to enable the suppression, or it can be omitted or set to "0" to disable. For example:

    %typemap(jtype, nopgcpp="1") Wibble & "long"
    

    Compatibility note: The generation of this additional parameter did not occur in versions prior to SWIG-1.3.30.

    25.4.3.5 Single threaded applications and thread safety

    Single threaded Java applications using JNI need to consider thread safety. The same applies for the C# module where the .NET wrappers use PInvoke. Consider the C++ class:

    class Test {
      string str;
    public:
      Test() : str("initial") {}
    };
    

    and the Java proxy class generated by SWIG:

    public class Test {
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected Test(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr(Test obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    
      protected void finalize() {
        delete();
      }
    
      // Call C++ destructor
      public synchronized void delete() {
        if(swigCPtr != 0 && swigCMemOwn) {
          swigCMemOwn = false;
          exampleJNI.delete_Test(swigCPtr);
        }
        swigCPtr = 0;
      }
    
      // Call C++ constructor
      public Test() {
        this(exampleJNI.new_Test(), true);
      }
    
    }
    

    It has two methods that call JNI methods, namely, exampleJNI.new_Test() for the C++ constructor and exampleJNI.delete_Test() for the C++ destructor. If the garbage collector collects an instance of this class, ie delete() is not explicitly called, then the C++ destructor will be run in a different thread to the main thread. This is because when an object is marked for garbage collection, any objects with finalizers are added to a finalization queue and the objects in the finalization queue have their finalize() methods run in a separate finalization thread. Therefore, if the C memory allocator is not thread safe, then the heap will get corrupted sooner or later, when a concurrent C++ delete and new are executed. It is thus essential, even in single threaded usage, to link to the C multi-thread runtime libraries, for example, use the /MD option for Visual C++ on Windows. Alternatively, lock all access to C++ functions that have heap allocation/deallocation.

    Note that some of the STL in Visual C++ 6 is not thread safe, so although code might be linked to the multithread runtime libraries, undefined behaviour might still occur in a single threaded Java program. Similarly some older versions of Sun Studio have bugs in the multi-threaded implementation of the std::string class and so will lead to undefined behaviour in these supposedly single threaded Java applications.

    The following innocuous Java usage of Test is an example that will crash very quickly on a multiprocessor machine if the JNI compiled code is linked against the single thread C runtime libraries.

    for (int i=0; i<100000; i++) {
      System.out.println("Iteration " + i);
      for (int k=0; k<10; k++) {
        Test test = new Test();
      }
      System.gc();
    }
    

    25.4.4 Type wrapper classes

    The generated type wrapper class, for say an int *, looks like this:

    public class SWIGTYPE_p_int {
      private transient long swigCPtr;
    
      protected SWIGTYPE_p_int(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected SWIGTYPE_p_int() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr(SWIGTYPE_p_int obj) {
        return obj.swigCPtr;
      }
    }
    

    The methods do not have public access, so by default it is impossible to do anything with objects of this class other than pass them around. The methods in the class are part of the inner workings of SWIG. If you need to mess around with pointers you will have to use some typemaps specific to the Java module to achieve this. The section on Java typemaps details how to modify the generated code.

    Note that if you use a pointer or reference to a proxy class in a function then no type wrapper class is generated because the proxy class can be used as the function parameter. If however, you need anything more complicated like a pointer to a pointer to a proxy class then a typewrapper class is generated for your use.

    Note that SWIG generates a type wrapper class and not a proxy class when it has not parsed the definition of a type that gets used. For example, say SWIG has not parsed the definition of class Snazzy because it is in a header file that you may have forgotten to use the %include directive on. Should SWIG parse Snazzy * being used in a function parameter, it will then generates a type wrapper class around a Snazzy pointer. Also recall from earlier that SWIG will use a pointer when a class is passed by value or by reference:

    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Should SWIG not know anything about Snazzy then a SWIGTYPE_p_Snazzy must be used for all 3 parameters in the spam function. The Java function generated is:

    public static void spam(SWIGTYPE_p_Snazzy x, SWIGTYPE_p_Snazzy y, SWIGTYPE_p_Snazzy z) {
     ...
    }
    

    Note that typedefs are tracked by SWIG and the typedef name is used to construct the type wrapper class name. For example, consider the case where Snazzy is a typedef to an int which SWIG does parse:

    typedef int Snazzy;
    void spam(Snazzy *x, Snazzy &y, Snazzy z);
    

    Because the typedefs have been tracked the Java function generated is:

    public static void spam(SWIGTYPE_p_int x, SWIGTYPE_p_int y, int z) { ... }
    

    25.4.5 Enum classes

    SWIG can generate three types of enum classes. The Enumerations section discussed these but omitted all the details. The following sub-sections detail the various types of enum classes that can be generated.

    25.4.5.1 Typesafe enum classes

    The following example demonstrates the typesafe enum classes which SWIG generates:

    %include "enumtypesafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    The following is the code that SWIG generates:

    public final class Beverage {
      public final static Beverage ALE = new Beverage("ALE");
      public final static Beverage LAGER = new Beverage("LAGER", 10);
      public final static Beverage STOUT = new Beverage("STOUT");
      public final static Beverage PILSNER = new Beverage("PILSNER");
      public final static Beverage PILZ = new Beverage("PILZ", PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public String toString() {
        return swigName;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (int i = 0; i < swigValues.length; i++)
          if (swigValues[i].swigValue == swigValue)
            return swigValues[i];
        throw new IllegalArgumentException("No enum " + Beverage.class + " with value " +
                                                                             swigValue);
      }
    
      private Beverage(String swigName) {
        this.swigName = swigName;
        this.swigValue = swigNext++;
      }
    
      private Beverage(String swigName, int swigValue) {
        this.swigName = swigName;
        this.swigValue = swigValue;
        swigNext = swigValue+1;
      }
    
      private Beverage(String swigName, Beverage swigEnum) {
        this.swigName = swigName;
        this.swigValue = swigEnum.swigValue;
        swigNext = this.swigValue+1;
      }
    
      private static Beverage[] swigValues = { ALE, LAGER, STOUT, PILSNER, PILZ };
      private static int swigNext = 0;
      private final int swigValue;
      private final String swigName;
    }
    

    As can be seen, there are a fair number of support methods for the typesafe enum pattern. The typesafe enum pattern involves creating a fixed number of static instances of the enum class. The constructors are private to enforce this. Three constructors are available - two for C/C++ enums with an initializer and one for those without an initializer. Note that the two enums with initializers, LAGER and PILZ, each call one the two different initializer constructors. In order to use one of these typesafe enums, the swigToEnum static method must be called to return a reference to one of the static instances. The JNI layer returns the enum value from the C/C++ world as an integer and this method is used to find the appropriate Java enum static instance. The swigValue method is used for marshalling in the other direction. The toString method is overridden so that the enum name is available.

    25.4.5.2 Proper Java enum classes

    The following example demonstrates the Java enums approach:

    %include "enums.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following Java enum:

    public enum Beverage {
      ALE,
      LAGER(10),
      STOUT,
      PILSNER,
      PILZ(PILSNER);
    
      public final int swigValue() {
        return swigValue;
      }
    
      public static Beverage swigToEnum(int swigValue) {
        Beverage[] swigValues = Beverage.class.getEnumConstants();
        if (swigValue < swigValues.length && swigValue >= 0 &&
            swigValues[swigValue].swigValue == swigValue)
          return swigValues[swigValue];
        for (Beverage swigEnum : swigValues)
          if (swigEnum.swigValue == swigValue)
            return swigEnum;
        throw new IllegalArgumentException("No enum " + Beverage.class +
                                           " with value " + swigValue);
      }
    
      private Beverage() {
        this.swigValue = SwigNext.next++;
      }
    
      private Beverage(int swigValue) {
        this.swigValue = swigValue;
        SwigNext.next = swigValue+1;
      }
    
      private Beverage(Beverage swigEnum) {
        this.swigValue = swigEnum.swigValue;
        SwigNext.next = this.swigValue+1;
      }
    
      private final int swigValue;
    
      private static class SwigNext {
        private static int next = 0;
      }
    }
    

    The enum items appear first. Like the typesafe enum pattern, the constructors are private. The constructors are required to handle C/C++ enums with initializers. The next variable is in the SwigNext inner class rather than in the enum class as static primitive variables cannot be modified from within enum constructors. Marshalling between Java enums and the C/C++ enum integer value is handled via the swigToEnum and swigValue methods. All the constructors and methods in the Java enum are required just to handle C/C++ enums with initializers. These needn't be generated if the enum being wrapped does not have any initializers and the Simpler Java enums for enums without initializers section describes how typemaps can be used to achieve this.

    25.4.5.3 Type unsafe enum classes

    The following example demonstrates type unsafe enums:

    %include "enumtypeunsafe.swg"
    %javaconst(1);
    enum Beverage { ALE, LAGER=10, STOUT, PILSNER, PILZ=PILSNER };
    

    SWIG will generate the following simple class:

    public final class Beverage {
      public final static int ALE = 0;
      public final static int LAGER = 10;
      public final static int STOUT = LAGER + 1;
      public final static int PILSNER = STOUT + 1;
      public final static int PILZ = PILSNER;
    }
    

    25.4.6 Interfaces

    By default SWIG wraps all C++ classes as Java classes. As Java only supports derivation from a single base class, SWIG has to ignore all bases except the first when a C++ class inherits from more than one base class. However, there is a family of SWIG macros that change the default wrapping and allows a C++ class to be wrapped as a Java interface instead of a Java class. These macros provide a way to support some sort of multiple inheritance as there is no limit to the number of interfaces that a Java class can inherit from.

    When a C++ class is wrapped as a Java interface, a Java proxy class is still needed. The swiginterface.i library file provides three macros for marking a C++ class to be wrapped as a Java interface. There is more than one macro in order to provide a choice for choosing the Java interface and Java proxy names.

    Interface Macro Name Description
    %interface(CTYPE) For C++ class CTYPE, proxy class name is unchanged without any suffix added, interface name has SwigInterface added as a suffix.
    %interface_impl(CTYPE) For C++ class CTYPE, proxy class name has SwigImpl added as a suffix, interface name has no added suffix.
    %interface_custom("PROXY", "INTERFACE", CTYPE) For C++ class CTYPE, proxy class name is given by the string PROXY, interface name is given by the string INTERFACE. The PROXY and INTERFACE names can use the string formatting functions used in %rename.

    The table below has a few examples showing the resulting proxy and interface names for a C++ class called Base.

    Example Usage Proxy Class Name Interface Class Name
    %interface(Base) Base BaseSwigInterface
    %interface_impl(Base) BaseSwigImpl Base
    %interface_custom("BaseProxy", "IBase", Base) BaseProxy IBase
    %interface_custom("%sProxy", "IBase", Base) BaseProxy IBase
    %interface_custom("%sProxy", "%sInterface", Base) BaseProxy BaseProxyInterface
    %interface_custom("%sProxy", "%(rstrip:[Proxy])sInterface", Base) BaseProxy BaseInterface

    The 2nd last example shows the names used in the string formatting functions. The input for PROXY that "%s" expands to is the proxy name, that is, Base. The input for INTERFACE that "%s" expands to is the proxy name, that is, BaseProxy.

    The last example shows rstrip and in this case strips the Proxy suffix and then adds on Interface.

    Consider the following C++ code:

    namespace Space {
      struct Base1 {
        virtual void Method1();
      };
      struct Base2 {
        virtual void Method2();
      };
      struct Derived : Base1, Base2 {
      };
      void UseBases(const Base1 &b1, const Base2 &b2);
    }
    

    By default all classes are wrapped and are available in Java, but, Derived has all bases ignored except the first. SWIG generates a warning for the above code:

    example.i:10: Warning 813: Warning for Derived, base Base2 ignored. 
    Multiple inheritance is not supported in Java.
    

    If we decide to wrap the two base classes as interfaces and add the following before SWIG parses the above example code:

    %include <swiginterface.i>
    %interface_impl(Space::Base1);
    %interface_impl(Space::Base2);
    

    then two interface files are generated, Base1.java and Base2.java in addition to proxy class files, Base1SwigImpl.java and Base2SwigImpl.java. The contents of interface file Base1.java for Base1 is shown below:

    public interface Base1 {
      long Base1_GetInterfaceCPtr();
      void Method1();
    }
    

    The proxy class in Base1SwigImpl.java for Base1 is as it would have been if %interface was not used, except the name has changed to Base1SwigImpl and it implements the appropriate base:

    public class Base1SwigImpl implements Base1 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Base1SwigImpl_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Base1SwigImpl_Method1(swigCPtr, this);
      }
    ...
    }
    

    In fact any class deriving from Base will now implement the interface instead of deriving from it (or ignoring the base in the case of multiple base classes). Hence the Derived proxy class will now implement both bases:

    public class Derived implements Base1, Base2 {
    ...
      public long Base1_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base1_GetInterfaceCPtr(swigCPtr);
      }
    
      public long Base2_GetInterfaceCPtr() {
        return exampleJNI.Derived_Base2_GetInterfaceCPtr(swigCPtr);
      }
    
      public void Method1() {
        exampleJNI.Derived_Method1(swigCPtr, this);
      }
    
      public void Method2() {
        exampleJNI.Derived_Method2(swigCPtr, this);
      }
    ...
    }
    

    Wherever a class marked as an interface is used, such as the UseBases method in the example, the interface name is used as the type in the Java layer:

      public static void UseBases(Base1 b1, Base2 b2) {
        exampleJNI.UseBases(b1.Base1_GetInterfaceCPtr(), b1, b2.Base2_GetInterfaceCPtr(), b2);
      }
    

    Note that each Java interface has a method added to obtain the correct C++ pointer for passing to the native function - Base1_GetInterfaceCPtr for Base1. This method is similar to the getCPtr method in the proxy classes. In fact, as shown above in the Derived class, the proxy classes implement this generated interface by calling a native method (Derived_Base1_GetInterfaceCPtr) which calls an appropriate C++ cast of the pointer up the inheritance chain.

    The interface macros are implemented using the interface feature and typemaps. For example:

    %define %interface(CTYPE...)
    %feature("interface", name="%sSwigInterface") CTYPE;
    INTERFACE_TYPEMAPS(CTYPE)
    %enddef
    

    The feature accepts one attribute called name, which is the name of the Java interface mentioned earlier. The INTERFACE_TYPEMAPS macro implements the typemaps and can be viewed in the swiginterface.i file and contain the usual Java typemaps for generating code plus the javainterfacecode typemap which is only used when a class is marked with the interface feature. See Java code typemaps for details.

    25.5 Cross language polymorphism using directors

    Proxy classes provide a natural, object-oriented way to wrap C++ classes. as described earlier, each proxy instance has an associated C++ instance, and method calls from Java to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Java. In particular, if a C++ class has been extended in Java (by deriving from the proxy class), these classes will not be visible from C++ code. Virtual method calls from C++ are thus not able to access the lowest implementation in the inheritance chain.

    SWIG can address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Java implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Java and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Java code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions transparently takes care of all the cross-language method routing.

    25.5.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
      virtual void one();
      virtual void two();
    };
    
    class Bar: public Foo {
    public:
      virtual void three();
    };
    

    25.5.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Java proxy classes. The director classes store a pointer to their underlying Java proxy classes.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in Java via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its Java derived classes were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy JNI glue code that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Java. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Java, the Java API is used to call the method of the underlying Java object (after which the usual virtual method resolution in Java automatically finds the right implementation).

    25.5.3 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from Java types can result in large director methods. For this reason it is recommended that directors are selectively enabled only for specific classes that are likely to be extended in Java and used in C++.

    Although directors make it natural to mix native C++ objects with Java objects (as director objects), one should be aware of the obvious fact that method calls to Java objects from C++ will be much slower than calls to C++ objects. Additionally, compared to classes that do not use directors, the call routing in the director methods adds a small overhead. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Java.

    25.5.4 Simple directors example

    Consider the following SWIG interface file:

    %module(directors="1") example;
    
    %feature("director") DirectorBase;
    
    class DirectorBase {
    public:
      virtual ~DirectorBase() {}
      virtual void upcall_method() {}
    };
    
    void callup(DirectorBase *director) {
      director->upcall_method();
    }
    

    The following DirectorDerived Java class is derived from the Java proxy class DirectorBase and overrides upcall_method(). When C++ code invokes upcall_method(), the SWIG-generated C++ code redirects the call via JNI to the Java DirectorDerived subclass. Naturally, the SWIG generated C++ code and the generated Java intermediary class marshal and convert arguments between C++ and Java when needed.

    public class DirectorDerived extends DirectorBase {
      public DirectorDerived() {
      }
    
      public void upcall_method() {
        System.out.println("DirectorDerived::upcall_method() invoked.");
      }
    }
    

    Running the following Java code

    DirectorDerived director = new DirectorDerived();
    example.callup(director);
    

    will result in the following being output:

    DirectorDerived::upcall_method() invoked.
    

    25.5.5 Director threading issues

    Depending on your operating system and version of Java and how you are using threads, you might find the JVM hangs on exit. There are a couple of solutions to try out. The preferred solution requires jdk-1.4 and later and uses AttachCurrentThreadAsDaemon instead of AttachCurrentThread whenever a call into the JVM is required. This can be enabled by defining the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro when compiling the C++ wrapper code. For older JVMs define SWIG_JAVA_NO_DETACH_CURRENT_THREAD instead, to avoid the DetachCurrentThread call but this will result in a memory leak instead. For further details inspect the source code in the java/director.swg library file.

    Macros can be defined on the commandline when compiling your C++ code, or alternatively added to the C++ wrapper file as shown below:

    %insert("runtime") %{
    #define SWIG_JAVA_NO_DETACH_CURRENT_THREAD
    %}
    

    25.5.6 Director performance tuning

    When a new instance of a director (or subclass) is created in Java, the C++ side of the director performs a runtime check per director method to determine if that particular method is overridden in Java or if it should invoke the C++ base implementation directly. Although this makes initialization slightly more expensive, it is generally a good overall tradeoff.

    However, if all director methods are expected to usually be overridden by Java subclasses, then initialization can be made faster by avoiding these checks via the assumeoverride attribute. For example:

    %feature("director", assumeoverride=1) Foo;
    

    The disadvantage is that invocation of director methods from C++ when Java doesn't actually override the method will require an additional call up into Java and back to C++. As such, this option is only useful when overrides are extremely common and instantiation is frequent enough that its performance is critical.

    25.5.7 Java exceptions from directors

    With directors routing method calls to Java, and proxies routing them to C++, the handling of exceptions is an important concern. The default behavior from SWIG 3.0 onwards is to convert the thrown Java exception into a SWIG defined DirectorException C++ exception. SWIG 2.0 and earlier versions didn't provide any mechanism to handle the Java director method exceptions in C++.

    Converting Java exceptions into C++ exceptions can be done in two different ways using the director:except feature. In the simplest approach, a code block is attached to each director method to handle the mapping of Java exceptions into C++ exceptions.

    %feature("director:except") MyClass::method(int x) {
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        jenv->ExceptionClear();
        if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException"))
          throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
        if (Swig::ExceptionMatches(jenv, $error, "$packagepath/MyJavaException"))
          throw MyCppException(Swig::JavaExceptionMessage(jenv, $error).message());
        throw std::runtime_error("Unexpected exception thrown in MyClass::method");
      }
    }
    
    class MyClass {
      /** Throws either a std::out_of_range or MyCppException on error */
      void method(int x);
    }
    

    This approach allows a flexible mapping of Java exceptions thrown by director methods into C++ exceptions expected by a C++ caller. There need not be any C++ exception specifications on the C++ method. The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are provided to simplify writing code for wrappers that use the director:except feature. The function Swig::ExceptionMatches matches the type of the jthrowable thrown against a fully qualified JNI style class name, such as "java/lang/IOError". If the throwable class is the same type, or derives from the given type, Swig::ExceptionMatches will return true. Care must be taken to provide the correct fully qualified name, since for wrapped exceptions the generated proxy class will have additional package qualification, depending on the '-package' argument and use of the nspace feature. The special variable $error is expanded by SWIG into a unique variable name and should be used for the assignment of the exception that occurred. The special variable $packagepath is replaced by the outer package provided for SWIG generation by the -package option. The utility class Swig::JavaExceptionMessage is a holder providing access to the message from the thrown Java exception. The message() method returns the exception message as a const char *, which is only valid during the lifetime of the holder. Any code using this message needs to copy it, for example into a std::string or a newly constructed C++ exception.

    Using the above approach to write handlers for a large number of methods will require repetitive duplication of the director:except feature code. To mitigate this, an alternative approach is provided via typemaps in a fashion analagous to the "throws" typemap. The "throws" typemap provides an approach to automatically map all the C++ exceptions listed in a method's defined exceptions (either from a C++ exception specification or a %catches feature) into Java exceptions. The "directorthrows" typemap provides the inverse mapping and should contain code to convert a suitably matching Java exception into a C++ exception. The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The "directorthrows" typemap is then used in conjunction with the director:except feature if the $directorthrowshandlers special variable is used in the feature code. Consider the following, which also happens to be the default:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        jenv->ExceptionClear();
        $directorthrowshandlers
        throw Swig::DirectorException(jenv, $error);
      }
    %}
    

    The code generated using the director:except feature replaces the $directorthrowshandlers special variable with the code in the "directorthrows" typemaps, for each and every exception defined for the method. The possible exceptions can be defined either with a C++ exception specification or %catches as described for the "throws" typemap.

    Consider the following director method:

      ...
      virtual void doSomething(int index) throw (std::out_of_range);
      ...
    

    When combined with the default director:except feature and the "directorthrows" typemap above, the resulting code generated in the director method after calling up to Java will be:

    jthrowable swigerror = jenv->ExceptionOccurred();
    if (swigerror) {
      jenv->ExceptionClear();
      if (Swig::ExceptionMatches(jenv, swigerror, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, swigerror).message());
      }
      
      throw Swig::DirectorException(jenv, swigerror);
    }
    

    Note: Beware of using exception specifications as the SWIG director methods will be generated with the same exception specifications and if the director method throws an exception that is not specified it is likely to terminate your program. See the C++ standard for more details. Using the %catches feature instead to define the handled exceptions does not suffer this potential fate.

    Because the default code generation maps any unhandled Java exceptions to Swig::DirectorException, any director methods that have exception specifications may cause program termination. To simply ignore unexpected exceptions, the default handling can be changed with:

    %feature("director:except") %{
      jthrowable $error = jenv->ExceptionOccurred();
      if ($error) {
        jenv->ExceptionClear();
        $directorthrowshandlers
        return $null; // exception is ignored
      }
    %}
    

    Alternatively an exception compatible with the existing director method exception specifications can be thrown. Assuming that all methods allow std::runtime_error to be thrown, the return $null; could be changed to:

      throw std::runtime_error(Swig::JavaExceptionMessage(jenv, $error).message());
    

    In more complex situations, a separate director:except feature may need to be attached to specific methods.

    Below is a complete example demonstrating the use of the "directorthrows" typemaps. In this example, a generic "directorthrows" typemap is appropriate for all three exceptions - all take single string constructors. If the exceptions had different constructors, it would be necessary to have separate typemaps for each exception type.

    %module(directors="1") example
    
    %{
      #include <string>
      #include <stdexcept>
    %}
    
    // Define exceptions in header section using std::runtime_error
    %define DEFINE_EXCEPTION(NAME)
    %{
      namespace MyNS {
        struct NAME : public std::runtime_error { NAME(const std::string &what) : runtime_error(what) {} };
      }
    %}
    %enddef
    
    // Expose C++ exceptions as Java Exceptions by changing the Java base class and providing a getMessage()
    %define DECLARE_EXCEPTION(NAME)
    %typemap(javabase) MyNS::NAME "java.lang.Exception";
    %rename(getMessage) MyNS::NAME::what;
    namespace MyNS {
      struct NAME {
        NAME(const std::string& what);
        const char * what();
      };
    }
    %enddef
    
    DEFINE_EXCEPTION(ExceptionA)
    DEFINE_EXCEPTION(ExceptionB)
    DEFINE_EXCEPTION(Unexpected)
    
    // Mark three methods to map director thrown exceptions.
    %feature("director:except") MyClass::meth1(int);
    %feature("director:except") MyClass::meth2;
    %feature("director:except") meth3;
    
    %typemap(directorthrows) MyNS::ExceptionA, MyNS::ExceptionB, MyNS::Unexpected %{
      if (Swig::ExceptionMatches(jenv, $error, "$packagepath/$javaclassname"))
        throw $1_type(Swig::JavaExceptionMessage(jenv, $error).message());
    %}
    
    DECLARE_EXCEPTION(ExceptionA)
    DECLARE_EXCEPTION(ExceptionB)
    DECLARE_EXCEPTION(Unexpected)
    
    %catches(MyNS::ExceptionA, MyNS::ExceptionB, MyNS::Unexpected) MyClass::meth2();
    
    %inline {
      class MyClass {
      public:
        virtual void meth1(int x) throw(MyNS::ExceptionA, MyNS::ExceptionB) = 0;
        virtual void meth2() = 0;   /* throws MyNS::ExceptionA, MyNS::ExceptionB, MyNS::Unexpected */
        virtual void meth3(float x) throw(MyNS::Unexpected) = 0;
        virtual ~MyClass() {}
      };
    }
    

    In this case the three different "directorthrows" typemaps will be used to generate the three different exception handlers for meth1, meth2 and meth3. The generated handlers will have "if" blocks for each exception type specified, in the exception specification or %catches feature.

    Note that the "directorthrows" typemaps are important only if it is important for the the exceptions passed through the C++ layer to be mapped to distinct C++ exceptions. If director methods are being called by C++ code that is itself wrapped in a SWIG generated Java wrapper and access is always through this wrapper, the default Swig::DirectorException class provides enough information to reconstruct the original exception. In this case removing the $directorthrowshandlers special variable from the default director:except feature and simply always throwing a Swig::DirectorException will achieve the desired result. Along with this a generic exception feature is added to convert any caught Swig::DirectorExceptions back into the underlying Java exceptions via the Swig::DirectorException::raiseJavaException method, as demonstrated with %javaexception below:

    %javaexception("Exception") MyClass::myMethod %{
      try {
        $action
      } catch (Swig::DirectorException &e) {
        // raise/throw the Java exception that originally caused the DirectorException
        e.raiseJavaException(jenv);
        return $null;
      }
    %}
    

    See the Exception handling with %exception and %javaexception section for more on converting C++ exceptions to Java exceptions.

    25.6 Accessing protected members

    When using directors, the protected virtual methods are also wrapped. These methods are wrapped with a protected Java proxy method, so the only way that Java code can access these is from within a Java class derived from the director class.

    Members which are protected and non-virtual can also be accessed when using the 'allprotected' mode. The allprotected mode requires directors and is turned on by setting the allprotected option in addition to the directors option in the %module directive, like this:

    %module(directors="1", allprotected="1") modulename
    

    Protected member variables and methods (both static and non-static) will then be wrapped with protected access in the Java proxy class.

    Note: Neither the directors option nor the allprotected mode support types defined with protected scope. This includes any enums or typedefs declared in the protected section of the C++ class.

    The following simple example is a class with numerous protected members, including the constructor and destructor:

    %module(directors="1", allprotected="1") example
    
    %feature("director") ProtectedBase;
    
    // Ignore use of unsupported types (those defined in the protected section)
    %ignore ProtectedBase::typedefs;
    
    %inline %{
    
    class ProtectedBase {
    protected:
      ProtectedBase() {}
      virtual ~ProtectedBase() {}
      virtual void virtualMethod() const {}
      void nonStaticMethod(double d) const {}
      static void staticMethod(int i) {}
      int instanceMemberVariable;
      static int staticMemberVariable;
    
      // unsupported: types defined with protected access and the methods/variables which use them
      typedef int IntegerType;
      IntegerType typedefs(IntegerType it) { return it; }
    };
    int ProtectedBase::staticMemberVariable = 10;
    
    %}
    
    

    Note that the IntegerType has protected scope and the members which use this type must be ignored as they cannot be wrapped.

    The proxy methods are protected, so the only way the protected members can be accessed is within a class that derives from the director class, such as the following:

    class MyProtectedBase extends ProtectedBase
    {
      public MyProtectedBase() {
      }
    
      public void accessProtected() {
        virtualMethod();
        nonStaticMethod(1.2);
        staticMethod(99);
    
        setInstanceMemberVariable(5);
        int i = getInstanceMemberVariable();
    
        setStaticMemberVariable(10);
        i = getStaticMemberVariable();
      }
    }
    

    25.7 Common customization features

    An earlier section presented the absolute basics of C/C++ wrapping. If you do nothing but feed SWIG a header file, you will get an interface that mimics the behavior described. However, sometimes this isn't enough to produce a nice module. Certain types of functionality might be missing or the interface to certain functions might be awkward. This section describes some common SWIG features that are used to improve the interface to existing C/C++ code.

    25.7.1 C/C++ helper functions

    Sometimes when you create a module, it is missing certain bits of functionality. For example, if you had a function like this

    typedef struct Image {...};
    void set_transform(Image *im, double m[4][4]);
    

    it would be accessible from Java, but there may be no easy way to call it. The problem here is that a type wrapper class is generated for the two dimensional array parameter so there is no easy way to construct and manipulate a suitable double [4][4] value. To fix this, you can write some extra C helper functions. Just use the %inline directive. For example:

    %inline %{
    /* Note: double[4][4] is equivalent to a pointer to an array double (*)[4] */
    double (*new_mat44())[4] {
      return (double (*)[4]) malloc(16*sizeof(double));
    }
    void free_mat44(double (*x)[4]) {
      free(x);
    }
    void mat44_set(double x[4][4], int i, int j, double v) {
      x[i][j] = v;
    }
    double mat44_get(double x[4][4], int i, int j) {
      return x[i][j];
    }
    %}
    

    From Java, you could then write code like this:

    Image im = new Image();
    SWIGTYPE_p_a_4__double a = example.new_mat44();
    example.mat44_set(a, 0, 0, 1.0);
    example.mat44_set(a, 1, 1, 1.0);
    example.mat44_set(a, 2, 2, 1.0);
    ...
    example.set_transform(im, a);
    example.free_mat44(a);
    

    Admittedly, this is not the most elegant looking approach. However, it works and it wasn't too hard to implement. It is possible to improve on this using Java code, typemaps, and other customization features as covered in later sections, but sometimes helper functions are a quick and easy solution to difficult cases.

    25.7.2 Class extension with %extend

    One of the more interesting features of SWIG is that it can extend structures and classes with new methods or constructors. Here is a simple example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    struct Vector {
      double x, y, z;
    };
    
    %extend Vector {
      char *toString() {
          static char tmp[1024];
          sprintf(tmp, "Vector(%g, %g, %g)", $self->x, $self->y, $self->z);
          return tmp;
      }
      Vector(double x, double y, double z) {
          Vector *v = (Vector *) malloc(sizeof(Vector));
          v->x = x;
          v->y = y;
          v->z = z;
          return v;
      }
    };
    

    Now, in Java

    Vector v = new Vector(2, 3, 4);
    System.out.println(v);
    

    will display

    Vector(2, 3, 4)
    

    %extend works with both C and C++ code. It does not modify the underlying object in any way---the extensions only show up in the Java interface.

    25.7.3 Class extension with %proxycode

    The previous section described how to extend a wrapped class with C or C++ code. This section describes how to extend a wrapped class with Java code instead of C/C++ code. The %proxycode directive is used and is just a macro for %insert("proxycode"). The Code insertion block section describes the %insert directive. The section of code for insertion is "proxycode", that is, the Java proxy class. This directive must hence only be used within the scope of a class, otherwise it is silently ignored. There are two common ways to get the scope correct.

    The first is to use %proxycode inside a class that SWIG parses, for example a toString() method can be added to a C++ class using pure Java code. A C++ header file can mix C++ and Java code inside the C++ class as follows:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    

    The second is to use %proxycode within %extend as everything within a %extend block is effectively within the scope of the class, for example:

    // flag.h header file
    class Flag {
      bool flag;
    public:
      Flag(bool flag) : flag(flag) {}
      bool FetchFlag() { return flag; }
    };
    

    and wrapped using:

    %{
    #include "flag.h"
    %}
    %include "flag.h"
    
    %extend Flag {
    #if defined(SWIG)
    %proxycode %{
      public String toString() {
        boolean flag = FetchFlag();
        return Boolean.toString(flag);
      }
    %}
    #endif
    }
    

    There is some very limited support of typemaps within a %proxycode block. A useful trick is to obtain the Java type for a given C/C++ type using the $typemap special macro. The following C++ template demonstrates this:

    %inline %{
    template<typename T> struct Value {
      T value;
      Value(const T& val) : value(val) {}
    };
    %}
    
    %extend Value {
    %proxycode %{
      public String toString() {
        // Note template type expansion is supported, so T is expanded to 'unsigned int' in this example
        // and $typemap(jstype, unsigned int) in turn is expanded to 'long'
        $typemap(jstype, T) val = getValue();
        return "$javaclassname value: " + val + " Java type: $typemap(jstype, T) JNI type: $typemap(jni, T)";
      }
    %}
    }
    %template(ValueUnsignedInt) Value<unsigned int>;
    

    The generated Java contains the expanded special variable and macro resulting in Java proxy code:

    public class ValueUnsignedInt {
      ...
      public String toString() {
        long val = getValue();
        return "ValueUnsignedInt value: " + val + " Java type: long JNI type: jlong";
      }
    
    }
    

    25.7.4 Exception handling with %exception and %javaexception

    If a C or C++ function throws an error, you may want to convert that error into a Java exception. To do this, you can use the %exception directive. The %exception directive simply lets you rewrite part of the generated wrapper code to include an error check. It is detailed in full in the Exception handling with %exception section.

    In C, a function often indicates an error by returning a status code (a negative number or a NULL pointer perhaps). Here is a simple example of how you might handle that:

    %exception malloc {
      $action
      if (!result) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    In Java,

    SWIGTYPE_p_void a = example.malloc(2000000000);
    

    will produce a familiar looking Java exception:

    Exception in thread "main" java.lang.OutOfMemoryError: Not enough memory
            at exampleJNI.malloc(Native Method)
            at example.malloc(example.java:16)
            at runme.main(runme.java:112)
    

    If a library provides some kind of general error handling framework, you can also use that. For example:

    %exception malloc {
      $action
      if (err_occurred()) {
        jclass clazz = (*jenv)->FindClass(jenv, "java/lang/OutOfMemoryError");
        (*jenv)->ThrowNew(jenv, clazz, "Not enough memory");
        return $null;
      }
    }
    void *malloc(size_t nbytes);
    

    If no declaration name is given to %exception, it is applied to all wrapper functions. The $action is a SWIG special variable and is replaced by the C/C++ function call being wrapped. The return $null; handles all native method return types, namely those that have a void return and those that do not. This is useful for typemaps that will be used in native method returning all return types. See the section on Java special variables for further explanation.

    C++ exceptions are also easy to handle. We can catch the C++ exception and rethrow it as a Java exception like this:

    %exception getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
      public:
        FooClass *getitem(int index);      // Might throw std::out_of_range exception
        ...
    };
    

    In the example above, java.lang.Exception is a checked exception class and so ought to be declared in the throws clause of getitem. Classes can be specified for adding to the throws clause using %javaexception(classes) instead of %exception, where classes is a string containing one or more comma separated Java classes. The %clearjavaexception feature is the equivalent to %clearexception and clears previously declared exception handlers. The %nojavaexception feature is the equivalent to %noexception and disables the exception handler. See Clearing features for the difference on disabling and clearing features.

    %javaexception("java.lang.Exception") getitem {
      try {
        $action
      } catch (std::out_of_range &e) {
        jclass clazz = jenv->FindClass("java/lang/Exception");
        jenv->ThrowNew(clazz, "Range error");
        return $null;
      }
    }
    
    class FooClass {
    public:
      FooClass *getitem(int index);      // Might throw std::out_of_range exception
      ...
    };
    

    The generated proxy method now generates a throws clause containing java.lang.Exception:

    public class FooClass {
      ...
      public FooClass getitem(int index) throws java.lang.Exception { ... }
      ...
    }
    

    The examples above first use the C JNI calling syntax then the C++ JNI calling syntax. The C++ calling syntax will not compile as C and also vice versa. It is however possible to write JNI calls which will compile under both C and C++ and is covered in the Typemaps for both C and C++ compilation section.

    The language-independent exception.i library file can also be used to raise exceptions. See the SWIG Library chapter. The typemap example Handling C++ exception specifications as Java exceptions provides further exception handling capabilities.

    25.7.5 Method access with %javamethodmodifiers

    A Java feature called %javamethodmodifiers can be used to change the method modifiers from the default public. It applies to both module class methods and proxy class methods. For example:

    %javamethodmodifiers protect_me() "protected";
    void protect_me();
    

    Will produce the method in the module class with protected access.

    protected static void protect_me() {
      exampleJNI.protect_me();
    }
    

    25.8 Tips and techniques

    Although SWIG is largely automatic, there are certain types of wrapping problems that require additional user input. Examples include dealing with output parameters, strings and arrays. This chapter discusses the common techniques for solving these problems.

    25.8.1 Input and output parameters using primitive pointers and references

    A common problem in some C programs is handling parameters passed as simple pointers or references. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x-*y;
    }
    

    The typemaps.i library file will help in these situations. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Java, this allows you to pass simple values. For example:

    int result = example.sub(7, 4);
    System.out.println("7 - 4 = " + result);
    int[] sum = {0};
    example.add(3, 4, sum);
    System.out.println("3 + 4 = " + sum[0]);
    

    Which will display:

    7 - 4 = 3
    3 + 4 = 7
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter will return the result in the first element of the integer array.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Java, the input parameter is the first element in a 1 element array and is replaced by the output of the function. For example:

    int[] neg = {3};
    example.negate(neg);
    System.out.println("Negative of 3 = " + neg[0]);
    

    And no prizes for guessing the output:

    Negative of 3 = -3
    

    These typemaps can also be applied to C++ references. The above examples would work the same if they had been defined using references instead of pointers. For example, the Java code to use the negate function would be the same if it were defined either as it is above:

    void negate(int *INOUT);
    

    or using a reference:

    void negate(int &INOUT);
    

    Note: Since most Java primitive types are immutable and are passed by value, it is not possible to perform in-place modification of a type passed as a parameter.

    Be aware that the primary purpose of the typemaps.i file is to support primitive datatypes. Writing a function like this

    void foo(Bar *OUTPUT);
    

    will not have the intended effect since typemaps.i does not define an OUTPUT rule for Bar.

    25.8.2 Simple pointers

    If you must work with simple pointers such as int * or double * another approach to using typemaps.i is to use the cpointer.i pointer library file. For example:

    %module example
    %include "cpointer.i"
    
    %inline %{
    extern void add(int x, int y, int *result);
    %}
    
    %pointer_functions(int, intp);
    

    The %pointer_functions(type, name) macro generates five helper functions that can be used to create, destroy, copy, assign, and dereference a pointer. In this case, the functions are as follows:

    int  *new_intp();
    int  *copy_intp(int *x);
    void  delete_intp(int *x);
    void  intp_assign(int *x, int value);
    int   intp_value(int *x);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int intPtr = example.new_intp();
    example.add(3, 4, intPtr);
    int result = example.intp_value(intPtr);
    System.out.println("3 + 4 = " + result);
    

    If you replace %pointer_functions(int, intp) by %pointer_class(int, intp), the interface is more class-like.

    intp intPtr = new intp();
    example.add(3, 4, intPtr.cast());
    int result = intPtr.value();
    System.out.println("3 + 4 = " + result);
    

    See the SWIG Library chapter for further details.

    25.8.3 Wrapping C arrays with Java arrays

    SWIG can wrap arrays in a more natural Java manner than the default by using the arrays_java.i library file. Let's consider an example:

    %include "arrays_java.i";
    int array[4];
    void populate(int x[]) {
      int i;
      for (i=0; i<4; i++)
        x[i] = 100 + i;
    }
    

    These one dimensional arrays can then be used as if they were Java arrays:

    int[] array = new int[4];
    example.populate(array);
    
    System.out.print("array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(array[i] + " ");
    
    example.setArray(array);
    
    int[] global_array = example.getArray();
    
    System.out.print("\nglobal_array: ");
    for (int i=0; i<array.length; i++)
      System.out.print(global_array[i] + " ");
    

    Java arrays are always passed by reference, so any changes a function makes to the array will be seen by the calling function. Here is the output after running this code:

    array: 100 101 102 103
    global_array: 100 101 102 103
    

    Note that for assigning array variables the length of the C variable is used, so it is possible to use a Java array that is bigger than the C code will cope with. Only the number of elements in the C array will be used. However, if the Java array is not large enough then you are likely to get a segmentation fault or access violation, just like you would in C. When arrays are used in functions like populate, the size of the C array passed to the function is determined by the size of the Java array.

    Please be aware that the typemaps in this library are not efficient as all the elements are copied from the Java array to a C array whenever the array is passed to and from JNI code. There is an alternative approach using the SWIG array library and this is covered in the next section.

    25.8.4 Unbounded C Arrays

    Sometimes a C function expects an array to be passed as a pointer. For example,

    int sumitems(int *first, int nitems) {
      int i, sum = 0;
      for (i = 0; i < nitems; i++) {
        sum += first[i];
      }
      return sum;
    }
    

    One of the ways to wrap this is to apply the Java array typemaps that come in the arrays_java.i library file:

    %include "arrays_java.i"
    %apply int[] {int *};
    

    The ANY size will ensure the typemap is applied to arrays of all sizes. You could narrow the typemap matching rules by specifying a particular array size. Now you can use a pure Java array and pass it to the C code:

    int[] array = new int[10000000];          // Array of 10-million integers
    for (int i=0; i<array.length; i++) {      // Set some values
      array[i] = i;
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    and the sum would be displayed:

    Sum = 49995000
    

    This approach is probably the most natural way to use arrays. However, it suffers from performance problems when using large arrays as a lot of copying of the elements occurs in transferring the array from the Java world to the C++ world. An alternative approach to using Java arrays for C arrays is to use an alternative SWIG library file carrays.i. This approach can be more efficient for large arrays as the array is accessed one element at a time. For example:

    %include "carrays.i"
    %array_functions(int, intArray);
    

    The %array_functions(type, name) macro generates four helper functions that can be used to create and destroy arrays and operate on elements. In this case, the functions are as follows:

    int *new_intArray(int nelements);
    void delete_intArray(int *x);
    int intArray_getitem(int *x, int index);
    void intArray_setitem(int *x, int index, int value);
    

    In Java, you would use the functions like this:

    SWIGTYPE_p_int array = example.new_intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {                           // Set some values
      example.intArray_setitem(array, i, i);
    }
    int sum = example.sumitems(array, 10000);
    System.out.println("Sum = " + sum);
    

    If you replace %array_functions(int, intp) by %array_class(int, intp), the interface is more class-like and a couple more helper functions are available for casting between the array and the type wrapper class.

    %include "carrays.i"
    %array_class(int, intArray);
    

    The %array_class(type, name) macro creates wrappers for an unbounded array object that can be passed around as a simple pointer like int * or double *. For instance, you will be able to do this in Java:

    intArray array = new intArray(10000000);  // Array of 10-million integers
    for (int i=0; i<10000; i++) {             // Set some values
      array.setitem(i, i);
    }
    int sum = example.sumitems(array.cast(), 10000);
    System.out.println("Sum = " + sum);
    

    The array "object" created by %array_class() does not encapsulate pointers inside a special array object. In fact, there is no bounds checking or safety of any kind (just like in C). Because of this, the arrays created by this library are extremely low-level indeed. You can't iterate over them nor can you even query their length. In fact, any valid memory address can be accessed if you want (negative indices, indices beyond the end of the array, etc.). Needless to say, this approach is not going to suit all applications. On the other hand, this low-level approach is extremely efficient and well suited for applications in which you need to create buffers, package binary data, etc.

    25.8.5 Binary data vs Strings

    By default SWIG handles char * as a string but there is a handy multi-argument typemap available as mentioned in Passing binary data. The following simple example demonstrates using a byte array instead of passing the default string type and length to the wrapped function.

    %apply (char *STRING, size_t LENGTH) { (const char data[], size_t len) }
    %inline %{
    void binaryChar1(const char data[], size_t len) {
      printf("len: %d data: ", len);
      for (size_t i=0; i<len; ++i)
        printf("%x ", data[i]);
      printf("\n");
    }
    %}
    

    Calling from Java requires just the byte array to be passed in as the multi-argument typemap being applied reduces the number of arguments in the target language to one, from the original two:

    byte[] data = "hi\0jk".getBytes();
    example.binaryChar1(data);     
    

    resulting in the output

    $ java runme
    len: 5 data: 68 69 0 6a 6b
    

    25.8.6 Overriding new and delete to allocate from Java heap

    Unlike some languages supported by SWIG, Java has a true garbage collection subsystem. Other languages will free SWIG wrapped objects when their reference count reaches zero. Java only schedules these objects for finalization, which may not occur for some time. Because SWIG objects are allocated on the C heap, Java users may find the JVM memory use quickly exceeds the assigned limits, as memory fills with unfinalized proxy objects. Forcing garbage collection is clearly an undesirable solution.

    An elegant fix for C++ users is to override new and delete using the following code (here shown included in a SWIG interface file)

    /* File: java_heap.i */
    %module test
    %{
    #include <stdexcept>
    #include "jni.h"
    
    /**
     *  A stash area embedded in each allocation to hold java handles
     */
    struct Jalloc {
      jbyteArray jba;
      jobject ref;
    };
    
    static JavaVM *cached_jvm = 0;
    
    JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
      cached_jvm = jvm;
      return JNI_VERSION_1_2;
    }
    
    static JNIEnv * JNU_GetEnv() {
      JNIEnv *env;
      jint rc = cached_jvm->GetEnv((void **)&env, JNI_VERSION_1_2);
      if (rc == JNI_EDETACHED)
        throw std::runtime_error("current thread not attached");
      if (rc == JNI_EVERSION)
        throw std::runtime_error("jni version not supported");
      return env;
    }
    
    void * operator new(size_t t) {
      if (cached_jvm != 0) {
        JNIEnv *env = JNU_GetEnv();
        jbyteArray jba = env->NewByteArray((int) t + sizeof(Jalloc));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        void *jbuffer = static_cast<void *>(env->GetByteArrayElements(jba, 0));
        if (env->ExceptionOccurred())
          throw bad_alloc();
        Jalloc *pJalloc = static_cast<Jalloc *>(jbuffer);
        pJalloc->jba = jba;
        /* Assign a global reference so byte array will persist until delete'ed */
        pJalloc->ref = env->NewGlobalRef(jba);
        if (env->ExceptionOccurred())
          throw bad_alloc();
        return static_cast<void *>(static_cast<char *>(jbuffer) + sizeof(Jalloc));
      }
      else { /* JNI_OnLoad not called, use malloc and mark as special */
        Jalloc *pJalloc = static_cast<Jalloc *>(malloc((int) t + sizeof(Jalloc)));
        if (!pJalloc)
          throw bad_alloc();
        pJalloc->ref = 0;
        return static_cast<void *>(
            static_cast<char *>(static_cast<void *>(pJalloc)) + sizeof(Jalloc));
      }
    }
    
    void operator delete(void *v) {
      if (v != 0) {
        void *buffer = static_cast<void *>( static_cast<char *>(v) - sizeof(Jalloc));
        Jalloc *pJalloc = static_cast<Jalloc *>(buffer);
        if (pJalloc->ref) {
          JNIEnv *env = JNU_GetEnv();
          env->DeleteGlobalRef(pJalloc->ref);
          env->ReleaseByteArrayElements(pJalloc->jba, static_cast<jbyte *>(buffer), 0);
        }
        else {
          free(buffer);
        }
      }
    }
    %}
    ...
    

    This code caches the Java environment during initialization, and when new is called, a Java ByteArray is allocated to provide the SWIG objects with space in the Java heap. This has the combined effect of re-asserting the Java virtual machine's limit on memory allocation, and puts additional pressure on the garbage collection system to run more frequently. This code is made slightly more complicated because allowances must be made if new is called before the JNI_OnLoad is executed. This can happen during static class initialization, for example.

    Unfortunately, because most Java implementations call malloc and free, this solution will not work for C wrapped structures. However, you are free to make functions that allocate and free memory from the Java heap using this model and use these functions in place of malloc and free in your own code.

    25.9 Java typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. You are advised to be familiar with the material in the "Typemaps" chapter. While not absolutely essential knowledge, this section assumes some familiarity with the Java Native Interface (JNI). JNI documentation can be consulted either online at Sun's Java web site or from a good JNI book. The following two books are recommended:

    • Title: 'Essential JNI: Java Native Interface.' Author: Rob Gordon. Publisher: Prentice Hall. ISBN: 0-13-679895-0.
    • Title: 'The Java Native Interface: Programmer's Guide and Specification.' Author: Sheng Liang. Publisher: Addison-Wesley. ISBN: 0-201-32577-2. Also available online at the Sun Developer Network.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the generated code.

    25.9.1 Default primitive type mappings

    The following table lists the default type mapping from Java to C/C++.

    C/C++ type Java type JNI type
    bool
    const bool &
    boolean jboolean
    char
    const char &
    char jchar
    signed char
    const signed char &
    byte jbyte
    unsigned char
    const unsigned char &
    short jshort
    short
    const short &
    short jshort
    unsigned short
    const unsigned short &
    int jint
    int
    const int &
    int jint
    unsigned int
    const unsigned int &
    long jlong
    long
    const long &
    int jint
    unsigned long
    const unsigned long &
    long jlong
    long long
    const long long &
    long jlong
    unsigned long long
    const unsigned long long &
    java.math.BigInteger jobject
    float
    const float &
    float jfloat
    double
    const double &
    double jdouble
    char *
    char []
    String jstring

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    Given the following C function:

    void func(unsigned short a, char *b, const long &c, unsigned long long d);
    

    The module class method would be:

    public static void func(int a, String b, int c, java.math.BigInteger d) {...}
    

    The intermediary JNI class would use the same types:

    public final static native void func(int jarg1, String jarg2, int jarg3,
                                         java.math.BigInteger jarg4);
    

    and the JNI function would look like this:

    SWIGEXPORT void JNICALL Java_exampleJNI_func(JNIEnv *jenv, jclass jcls,
                    jint jarg1, jstring jarg2, jint jarg3, jobject jarg4) {...}
    

    The mappings for C int and C long are appropriate for 32 bit applications which are used in the 32 bit JVMs. There is no perfect mapping between Java and C as Java doesn't support all the unsigned C data types. However, the mappings allow the full range of values for each C type from Java.

    25.9.2 Default typemaps for non-primitive types

    The previous section covered the primitive type mappings. Non-primitive types such as classes and structs are mapped using pointers on the C/C++ side and storing the pointer into a Java long variable which is held by the proxy class or type wrapper class. This applies whether the type is marshalled as a pointer, by reference or by value. It also applies for any unknown/incomplete types which use type wrapper classes.

    So in summary, the C/C++ pointer to non-primitive types is cast into the 64 bit Java long type and therefore the JNI type is a jlong. The Java type is either the proxy class or type wrapper class.

    25.9.3 Sixty four bit JVMs

    If you are using a 64 bit JVM you may have to override the C long, but probably not C int default mappings. Mappings will be system dependent, for example long will need remapping on Unix LP64 systems (long, pointer 64 bits, int 32 bits), but not on Microsoft 64 bit Windows which will be using a P64 IL32 (pointer 64 bits and int, long 32 bits) model. This may be automated in a future version of SWIG. Note that the Java write once run anywhere philosophy holds true for all pure Java code when moving to a 64 bit JVM. Unfortunately it won't of course hold true for JNI code.

    25.9.4 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Java to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is a placeholder for a local variable of type int. The $input variable contains the Java data, the JNI jint in this case.

    When this example is compiled into a Java module, it can be used as follows:

    System.out.println(example.fact(6));
    

    and the output will be:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    
    %inline %{
    extern int fact(int nonnegative);
    %}
    

    In this case, the typemap code is only attached to arguments that exactly match int nonnegative.

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG C++ type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int nonnegative {
      $1 = $input;
      printf("Received an integer : %d\n",  $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer nonnegative);    // Above typemap is applied
    %}
    

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
    ...
    };
    
    int count(char c, char *str, int len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Java parameter. This allows the function to be used like this (notice how the length parameter is omitted):

    int c = example.count('e', "Hello World");
    

    25.9.5 Typemaps for mapping C/C++ types to Java types

    The typemaps available to the Java module include the common typemaps listed in the main typemaps section. There are a number of additional typemaps which are necessary for using SWIG with Java. The most important of these implement the mapping of C/C++ types to Java types:


     
    Typemap Description
    jni JNI C types. These provide the default mapping of types from C/C++ to JNI for use in the JNI (C/C++) code.
    jtype Java intermediary types. These provide the default mapping of types from C/C++ to Java for use in the native functions in the intermediary JNI class. The type must be the equivalent Java type for the JNI C type specified in the "jni" typemap.
    jstype Java types. These provide the default mapping of types from C/C++ to Java for use in the Java module class, proxy classes and type wrapper classes.
    javain Conversion from jstype to jtype. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). In other words the typemap provides the conversion to the native method call parameter types.
    javaout Conversion from jtype to jstype. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). In other words the typemap provides the conversion from the native method call return type.
    javadirectorin Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java. See Director typemaps.
    javadirectorout Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall. See Director typemaps.
    directorin Conversion from C++ type to jni type for director methods. These are C++ typemaps which convert the parameters used in the C++ director method to the appropriate JNI intermediary type. The conversion is done in JNI code prior to calling the Java function from the JNI code. See Director typemaps.
    directorout Conversion from jni type to C++ type for director methods. These are C++ typemaps which convert the JNI return type used in the C++ director method to the appropriate C++ return type. The conversion is done in JNI code after calling the Java function from the JNI code. See Director typemaps.

    If you are writing your own typemaps to handle a particular type, you will normally have to write a collection of them. The default typemaps are in "java.swg" and so might be a good place for finding typemaps to base any new ones on.

    The "jni", "jtype" and "jstype" typemaps are usually defined together to handle the Java to C/C++ type mapping. An "in" typemap should be accompanied by a "javain" typemap and likewise an "out" typemap by a "javaout" typemap. If an "in" typemap is written, a "freearg" and "argout" typemap may also need to be written as some types have a default "freearg" and/or "argout" typemap which may need overriding. The "freearg" typemap sometimes releases memory allocated by the "in" typemap. The "argout" typemap sometimes sets values in function parameters which are passed by reference in Java.

    Note that the "in" typemap marshals the JNI type held in the "jni" typemap to the real C/C++ type and for the opposite direction, the "out" typemap marshals the real C/C++ type to the JNI type held in the "jni" typemap. For non-primitive types the "in" and "out" typemaps are responsible for casting between the C/C++ pointer and the 64 bit jlong type. There is no portable way to cast a pointer into a 64 bit integer type and the approach taken by SWIG is mostly portable, but breaks C/C++ aliasing rules. In summary, these rules state that a pointer to any type must never be dereferenced by a pointer to any other incompatible type. The following code snippet might aid in understand aliasing rules better:

    short a;
    short* pa = 0;
    int i = 0x1234;
    
    a = (short)i;    /* okay */
    a = *(short*)&i; /* breaks aliasing rules */
    

    An email posting, Aliasing, pointer casts and gcc 3.3 elaborates further on the subject. In SWIG, the "in" and "out" typemaps for pointers are typically

    %typemap(in) struct Foo * %{
      $1 = *(struct Foo **)&$input; /* cast jlong into C ptr */
    %}
    %typemap(out) struct Bar * %{
      *(struct Bar **)&$result = $1; /* cast C ptr into jlong */
    %}
    struct Bar {...};
    struct Foo {...};
    struct Bar * FooBar(struct Foo *f);
    

    resulting in the following code which breaks the aliasing rules:

    SWIGEXPORT jlong JNICALL Java_exampleJNI_FooBar(JNIEnv *jenv, jclass jcls,
                                                    jlong jarg1, jobject jarg1_) {
      jlong jresult = 0 ;
      struct Foo *arg1 = (struct Foo *) 0 ;
      struct Bar *result = 0 ;
      
      (void)jenv;
      (void)jcls;
      (void)jarg1_;
      arg1 = *(struct Foo **)&jarg1; 
      result = (struct Bar *)FooBar(arg1);
      *(struct Bar **)&jresult = result; 
      return jresult;
    }
    

    If you are using gcc as your C compiler, you might get a "dereferencing type-punned pointer will break strict-aliasing rules" warning about this. Please see Compiling a dynamic module to avoid runtime problems with these strict aliasing rules.

    The default code generated by SWIG for the Java module comes from the typemaps in the "java.swg" library file which implements the Default primitive type mappings and Default typemaps for non-primitive types covered earlier. There are other type mapping typemaps in the Java library. These are listed below:


     
    C Type Typemap File Kind Java Type Function
    primitive pointers and references INPUT typemaps.i input Java basic types Allows values to be used for C functions taking pointers for data input.
    primitive pointers and references OUTPUT typemaps.i output Java basic type arrays Allows values held within an array to be used for C functions taking pointers for data output.
    primitive pointers and references INOUT typemaps.i input
    output
    Java basic type arrays Allows values held within an array to be used for C functions taking pointers for data input and output.
    string
    wstring
    [unnamed] std_string.i input
    output
    String Use for std::string mapping to Java String.
    arrays of primitive types [unnamed] arrays_java.i input
    output
    arrays of primitive Java types Use for mapping C arrays to Java arrays.
    arrays of classes/structs/unions JAVA_ARRAYSOFCLASSES macro arrays_java.i input
    output
    arrays of proxy classes Use for mapping C arrays to Java arrays.
    arrays of enums ARRAYSOFENUMS arrays_java.i input
    output
    int[] Use for mapping C arrays to Java arrays (typeunsafe and simple enum wrapping approaches only).
    char * BYTE various.i input byte[] Java byte array is converted to char array
    char ** STRING_ARRAY various.i input
    output
    String[] Use for mapping NULL terminated arrays of C strings to Java String arrays
    unsigned char * NIOBUFFER various.i input
    output
    java.nio.Buffer Use for mapping directly allocated buffers to c/c++. useful with directors and long lived memory objects

    25.9.6 Java typemap attributes

    There are a few additional typemap attributes that the Java module supports.

    The first of these is the 'throws' attribute. The throws attribute is optional and specified after the typemap name and contains one or more comma separated classes for adding to the throws clause for any methods that use that typemap. It is analogous to the %javaexception feature's throws attribute.

    %typemap(typemapname, throws="ExceptionClass1, ExceptionClass2") type { ... }
    

    The attribute is necessary for supporting Java checked exceptions and can be added to just about any typemap. The list of typemaps include all the C/C++ (JNI) typemaps in the "Typemaps" chapter and the Java specific typemaps listed in the previous section, barring the "jni", "jtype" and "jstype" typemaps as they could never contain code to throw an exception.

    The throws clause is generated for the proxy method as well as the JNI method in the JNI intermediary class. If a method uses more than one typemap and each of those typemaps have classes specified in the throws clause, the union of the exception classes is added to the throws clause ensuring there are no duplicate classes. See the NaN exception example for further usage.

    The "jtype" typemap has the optional 'nopgcpp' attribute which can be used to suppress the generation of the premature garbage collection prevention parameter.

    The "javain" typemap has the optional 'pre', 'post' and 'pgcppname' attributes. These are used for generating code before and after the JNI call in the proxy class or module class. The 'pre' attribute contains code that is generated before the JNI call and the 'post' attribute contains code generated after the JNI call. The 'pgcppname' attribute is used to change the premature garbage collection prevention parameter name passed to the JNI function. This is sometimes needed when the 'pre' typemap creates a temporary variable which is then passed to the JNI function.

    Note that when the 'pre' or 'post' attributes are specified and the associated type is used in a constructor, a constructor helper function is generated. This is necessary as the Java proxy constructor wrapper makes a call to a support constructor using a this call. In Java the this call must be the first statement in the constructor body. The constructor body thus calls the helper function and the helper function instead makes the JNI call, ensuring the 'pre' code is called before the JNI call is made. There is a Date marshalling example showing 'pre', 'post' and 'pgcppname' attributes in action.

    25.9.7 Java special variables

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation, for example $1, $input, $result etc.

    The Java module uses a few additional special variables:

    $javaclassname
    This special variable works like the other special variables and $javaclassname is similar to $1_type. It expands to the class name for use in Java given a pointer. SWIG wraps unions, structs and classes using pointers and in this case it expands to the Java proxy class name. For example, $javaclassname is replaced by the proxy classname Foo when wrapping a Foo * and $&javaclassname expands to the proxy classname when wrapping the C/C++ type Foo and $*javaclassname expands to the proxy classname when wrapping Foo *&. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_unsigned_short is generated when wrapping unsigned short *. The class name is fully qualified with the package name when using the nspace feature.

    $javaclazzname
    This special variable works like $javaclassname, but expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_. This special variable is usually used for making calls to a function in the intermediary JNI class, as they are mangled with this prefix.

    $null
    Used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example:

    %typemap(check) int * %{ 
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return $null;
      }
    %}
    

    If the typemap gets put into a function with void as return, $null will expand to nothing:

    SWIGEXPORT void JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return ;
      }
      ...
    }
    

    otherwise $null expands to NULL

    SWIGEXPORT jobject JNICALL Java_jnifn(...) {
      if (error) {
        SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array element error");
        return NULL;
      }
      ...
    }
    

    $javainput, $jnicall and $owner
    The $javainput special variable is used in "javain" typemaps and $jnicall and $owner are used in "javaout" typemaps. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the intermediary JNI class. $owner is replaced by either true if %newobject has been used, otherwise false. $javainput is analogous to the $input special variable. It is replaced by the parameter name.

    Here is an example:

    %typemap(javain) Class "Class.getCPtr($javainput)"
    %typemap(javain) unsigned short "$javainput"
    %typemap(javaout) Class * {
        return new Class($jnicall, $owner);
      }
    
    %inline %{
      class Class {...};
      Class * bar(Class cls, unsigned short ush) { return new Class(); };
    %}
    

    The generated proxy code is then:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), false);
    }
    

    Here $javainput has been replaced by cls and ush. $jnicall has been replaced by the native method call, exampleJNI.bar(...) and $owner has been replaced by false. If %newobject is used by adding the following at the beginning of our example:

    %newobject bar(Class cls, unsigned short ush);
    

    The generated code constructs the return type using true indicating the proxy class Class is responsible for destroying the C++ memory allocated for it in bar:

    public static Class bar(Class cls, int ush) {
      return new Class(exampleJNI.bar(Class.getCPtr(cls), cls, ush), true);
    }
    

    $static
    This special variable expands to either static or nothing depending on whether the class is an inner Java class or not. It is used in the "javaclassmodifiers" typemap so that global classes can be wrapped as Java proxy classes and nested C++ classes/enums can be wrapped with the Java equivalent, that is, static inner proxy classes.

    $error, $jniinput, $javacall and $packagepath
    These special variables are used in the directors typemaps. See Director specific typemaps for details.

    $module
    This special variable expands to the module name, as specified by %module or the -module commandline option.

    $imclassname
    This special variable expands to the intermediary class name. Usually this is the same as '$moduleJNI', unless the jniclassname attribute is specified in the %module directive.

    $javainterfacename
    This special variable is only expanded when the interface feature is applied to a class. It works much like $javaclassname, but instead of expanding to the proxy classname, it expands to the value in the name attribute in the interface feature. For example:

    %feature("interface", name="MyInterface") MyClass;
    %typemap(jstype) MyClass  "$&javainterfacename"
    %typemap(jstype) MyClass * "$javainterfacename"
    

    will result in the jstype typemap expanding to MyInterface for both MyClass and MyClass *. The interface name is fully qualified with the package name when using the nspace feature.

    $interfacename
    This special variable is only expanded when the interface feature is applied to a class. It expands to just the interface name and is thus different to $javainterfacename in that it is not fully qualified with the package name when using the nspace feature.

    25.9.8 Typemaps for both C and C++ compilation

    JNI calls must be written differently depending on whether the code is being compiled as C or C++. For example C compilation requires the pointer to a function pointer struct member syntax like

    const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    

    whereas C++ code compilation of the same function call is a member function call using a class pointer like

    const jclass clazz = jenv->FindClass("java/lang/String");
    

    To enable typemaps to be used for either C or C++ compilation, a set of JCALLx macros have been defined in Lib/java/javahead.swg, where x is the number of arguments in the C++ version of the JNI call. The above JNI calls would be written in a typemap like this

    const jclass clazz = JCALL1(FindClass, jenv, "java/lang/String");
    

    Note that the SWIG preprocessor expands these into the appropriate C or C++ JNI calling convention. The C calling convention is emitted by default and the C++ calling convention is emitted when using the -c++ SWIG commandline option. If you do not intend your code to be targeting both C and C++ then your typemaps can use the appropriate JNI calling convention and need not use the JCALLx macros.

    25.9.9 Java code typemaps

    Most of SWIG's typemaps are used for the generation of C/C++ code. The typemaps in this section are used solely for the generation of Java code. Elements of proxy classes and type wrapper classes come from the following typemaps (the defaults).

    %typemap(javabase)

    base (extends) for Java class: empty default
    Note that this typemap accepts a replace attribute as an optional flag. When set to "1", it will replace/override any C++ base classes that might have been parsed. If this flag is not specified and there are C++ base classes, then a multiple inheritance warning is issued and the code in the typemap is ignored. The typemap also accepts a notderived attribute as an optional flag. When set to "1", it will not apply to classes that are derived from a C++ base. When used with the SWIGTYPE type, it is useful for giving a common base for all proxy classes, that is, providing a base class that sits in between all proxy classes and the Java base class Object for example: %typemap(javabase, notderived="1") SWIGTYPE "CommonBase".

    %typemap(javabody)

    the essential support body for proxy classes (proxy base classes only), typewrapper classes and enum classes. Default contains extra constructors, memory ownership control member variables (swigCMemOwn, swigCPtr), the getCPtr method etc.

    %typemap(javabody_derived)

    the essential support body for proxy classes (derived classes only). Same as "javabody" typemap, but only used for proxy derived classes.

    %typemap(javaclassmodifiers)

    class modifiers for the Java class: default is "public class"

    %typemap(javacode)

    Java code is copied verbatim to the Java class: empty default As there can only be one "javacode" typemap per class, also consider using the %proxycode directive which can be used multiple times per class and offers nearly identical functionality.

    %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized")

    destructor wrapper - the delete() method (proxy classes only), used for all proxy classes except those which have a base class : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute.

    %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized")

    destructor wrapper - the delete() method (proxy classes only), same as "javadestruct" but only used for derived proxy classes : default calls C++ destructor (or frees C memory) and resets swigCPtr and swigCMemOwn flags

    Note that the delete() method name is configurable and is specified by the methodname attribute. The method modifiers are also configurable via the methodmodifiers attribute.

    %typemap(javaimports)

    import statements for Java class: empty default

    %typemap(javainterfaces)

    interfaces (implements) for Java class: empty default

    %typemap(javafinalize)

    the finalize() method (proxy classes only): default calls the delete() method

    Note that the default javafinalize typemap must contain the full implementation of the finalize method. Any customization to this typemap must still declare a java finalize method with the correct signature. Note also that the name of the generated "delete" method may be affected by javadestruct and javadestruct_derived typemaps. Below shows an example modifying the finalizer, assuming the delete method has been renamed to swig_delete.

    %typemap(javafinalize) SWIGTYPE %{
      protected void finalize() {
        swig_delete();  // renamed to prevent conflict with existing delete method
      }
    ]%
    

    %typemap(javainterfacecode, declaration="...", cptrmethod="...")

    The code in this typemap is added to the body of a Java proxy class but only when a class is marked with the interface feature. The typemap is used in the proxy class marked with the interface feature as well as all proxy classes derived from the marked C++ class, as they are all generated as implementing the Java interface. The default typemap used in the %interface family of macros mentioned in the Java interfaces section, where CTYPE is the C++ class macro argument, is as follows:

    %typemap(javainterfacecode,
             declaration="  long $interfacename_GetInterfaceCPtr();\n",
             cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{
      public long $interfacename_GetInterfaceCPtr() {
        return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr);
      }
    %}
    

    The special variable $interfacename is expanded into the name specified in the interface feature.

    Compatibility Note: In SWIG-1.3.21 and earlier releases, typemaps called "javagetcptr" and "javaptrconstructormodifiers" were available. These are deprecated and the "javabody" typemap can be used instead. The javainterfacecode typemap and interface feature was introduced in SWIG-3.0.9.

    In summary the contents of the typemaps make up a proxy class like this:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody or javabody_derived typemap ]
    [ javafinalize typemap ]
    public synchronized void delete() [ javadestruct OR javadestruct_derived typemap ]
    [ javacode typemap ]
    [ javainterfacecode typemap]
    ... proxy functions ...
    }
    

    Note the delete() methodname and method modifiers are configurable, see "javadestruct" and "javadestruct_derived" typemaps above.

    The javainterfacecode typemap is only used when bases are marked by the interface feature and the implements list will also then be expanded to include these Java interfaces.

    The type wrapper class is similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The enum class is also similar in construction:

    [ javaimports typemap ]
    [ javaclassmodifiers typemap ] javaclassname extends [ javabase typemap ]
                                                 implements [ javainterfaces typemap ] {
    ... Enum values ...
    [ javabody typemap ]
    [ javacode typemap ]
    }
    

    The "javaimports" typemap is ignored if the enum class is wrapped by an inner Java class, that is when wrapping an enum declared within a C++ class.

    The Java interface turned on by the interface feature is fairly simple:

    [ javaimports typemap ]
    public interface [ javainterfacename ] {
    [ javainterfacecode:cptrmethod typemap attribute ]
    ... interface declarations ...
    }
    

    where javainterfacename is the name attribute in the interface feature.

    The defaults can be overridden to tailor the generated classes. Here is an example which will change the getCPtr method and constructor from the default public access to protected access. If the classes in one package are not using the classes in another package, then these methods need not be public and removing access to these low level implementation details, is a good thing. If you are invoking SWIG more than once and generating the wrapped classes into different packages in each invocation, then you cannot do this as you will then have different packages.

    %typemap(javabody) SWIGTYPE %{
      private transient long swigCPtr;
      protected transient boolean swigCMemOwn;
    
      protected $javaclassname(long cPtr, boolean cMemoryOwn) {
        swigCMemOwn = cMemoryOwn;
        swigCPtr = cPtr;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    The typemap code is the same that is in "java.swg", barring the last two method modifiers. Note that SWIGTYPE will target all proxy classes, but not the type wrapper classes. Also the above typemap is only used for proxy classes that are potential base classes. To target proxy classes that are derived from a wrapped class as well, the "javabody_derived" typemap should also be overridden.

    For the typemap to be used in all type wrapper classes, all the different types that type wrapper classes could be used for should be targeted:

    %typemap(javabody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) %{
      private transient long swigCPtr;
    
      protected $javaclassname(long cPtr, boolean bFutureUse) {
        swigCPtr = cPtr;
      }
    
      protected $javaclassname() {
        swigCPtr = 0;
      }
    
      protected static long getCPtr($javaclassname obj) {
        return (obj == null) ? 0 : obj.swigCPtr;
      }
    %}
    

    Again this is the same that is in "java.swg", barring the method modifier for getCPtr.

    When using multiple modules or the nspace feature it is common to invoke SWIG with a different -package command line option for each module. However, by default the generated code may not compile if generated classes in one package use generated classes in another package. The visibility of the getCPtr() and pointer constructor generated from the javabody typemaps needs changing. The default visibility is protected but it needs to be public for access from a different package. Just changing 'protected' to 'public' in the typemap achieves this. Two macros are available in java.swg to make this easier and using them is the preferred approach over simply copying the typemaps and modifying as this is forward compatible with any changes in the javabody typemap in future versions of SWIG. The macros are for the proxy and typewrapper classes and can respectively be used to to make the method and constructor public:

      SWIG_JAVABODY_PROXY(public, public, SWIGTYPE)
      SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE)
    

    25.9.10 Director specific typemaps

    The Java directors feature requires the "javadirectorin", "javadirectorout", "directorin" and the "directorout" typemaps in order to work properly. The "javapackage" typemap is an optional typemap used to identify the Java package path for individual SWIG generated proxy classes used in director methods.

    %typemap(directorin)

    The "directorin" typemap is used for converting arguments in the C++ director class to the appropriate JNI type before the upcall to Java. This typemap also specifies the JNI field descriptor for the type in the "descriptor" attribute. For example, integers are converted as follows:

    %typemap(directorin, descriptor="I") int "$input = (jint) $1;"
    

    $input is the SWIG name of the JNI temporary variable passed to Java in the upcall. The descriptor="I" will put an I into the JNI field descriptor that identifies the Java method that will be called from C++. For more about JNI field descriptors and their importance, refer to the JNI documentation mentioned earlier. A typemap for C character strings is:

    %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
      $input = 0;
      if ($1) {
        $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
        if (!$input) return $null;
      }
      Swig::LocalRefGuard $1_refguard(jenv, $input);
    }
    

    The Swig::LocalRefGuard class should be used in directorin typemaps for newly allocated objects. It is used to control local reference counts ensuring the count is decremented after the call up into Java has completed. Its destructor simply calls jenv->DeleteLocalRef(obj) on the obj passed in during construction.

    User-defined types have the default "descriptor" attribute "L$packagepath/$javaclassname;" where $packagepath is the package name passed from the SWIG command line and $javaclassname is the Java proxy class' name. If the -package commandline option is not used to specify the package, then '$packagepath/' will be removed from the resulting output JNI field descriptor. Do not forget the terminating ';' for JNI field descriptors starting with 'L'. If the ';' is left out, Java will generate a "method not found" runtime error. Note that the $packagepath substitution always uses the path separator '/' when expanded. The $javaclassname expansion can be confusing as it is normally expanded using the '.' separator. However, $javaclassname is expanded using the path separator '/' in typemap's "descriptor" attribute as well as in the "directorthrows" typemap.

    %typemap(directorout)

    The "directorout" typemap is used for converting the JNI return type in the C++ director class to the appropriate C++ type after the upcall to Java. For example, integers are converted as follows:

    %typemap(directorout) int %{ $result = (int)$input; %}
    

    $input is the SWIG name of the JNI temporary variable returned from Java after the upcall. $result is the resulting output. A typemap for C character strings is:

    %typemap(directorout) char * {
      $1 = 0;
      if ($input) {
        $result = (char *)jenv->GetStringUTFChars($input, 0);
        if (!$1) return $null;
      }
    }
    

    %typemap(javadirectorin)

    Conversion from jtype to jstype for director methods. These are Java code typemaps which transform the type used in the Java intermediary JNI class (as specified in the "jtype" typemap) to the Java type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap). This typemap provides the conversion for the parameters in the director methods when calling up from C++ to Java.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorin) int "$jniinput"
    

    The $jniinput special variable is analogous to $javainput special variable. It is replaced by the input parameter name.

    %typemap(javadirectorout)

    Conversion from jstype to jtype for director methods. These are Java code typemaps which transform the type used in the Java module class, proxy classes and type wrapper classes (as specified in the "jstype" typemap) to the type used in the Java intermediary JNI class (as specified in the "jtype" typemap). This typemap provides the conversion for the return type in the director methods when returning from the C++ to Java upcall.

    For primitive types, this typemap is usually specified as:

    %typemap(javadirectorout) int "$javacall"
    

    The $javacall special variable is analogous to the $jnicall special variable. It is replaced by the call to the target Java method. The target method is the method in the Java proxy class which overrides the virtual C++ method in the C++ base class.

    %typemap(directorthrows)

    Conversion of Java exceptions to C++ exceptions in director method's exception handling. This typemap is expected to test the $error special variable for a matching Java exception and if successful convert and throw it into a C++ exception given by the typemap's type. The $error special variable is of type jthrowable and is substituted with a unique variable name in the generated code.

    The example below converts a Java java.lang.IndexOutOfBoundsException exception to the typemap's type, that is std::out_of_range:

    %typemap(directorthrows) std::out_of_range %{
      if (Swig::ExceptionMatches(jenv, $error, "java/lang/IndexOutOfBoundsException")) {
        throw std::out_of_range(Swig::JavaExceptionMessage(jenv, $error).message());
      }
    %}
    

    The utility function Swig::ExceptionMatches and class Swig::JavaExceptionMessage are helpers available when using directors and are described in the Java Exceptions from Directors section.

    %typemap(javapackage)

    The "javapackage" typemap is optional; it serves to identify a class's Java package. This typemap should be used in conjunction with classes that are defined outside of the current SWIG interface file. The typemap is only used if the type is used in a director method, that is, in a virtual method in a director class. For example:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    Assume that the Foo class is part of the Java package com.wombat.foo but the above interface file is part of the Java package com.wombat.example. Without the "javapackage" typemap, SWIG will assume that the Foo class belongs to com.wombat.example class. The corrected interface file looks like:

    // class Foo is handled in a different interface file:
    %import "Foo.i"
    %typemap("javapackage") Foo, Foo *, Foo & "com.wombat.foo";
    %feature("director") Example;
    
    %inline {
      class Bar { };
    
      class Example {
      public:
        virtual ~Example();
        virtual void ping(Foo *arg1, Bar *arg2);
      };
    }
    

    SWIG looks up the package based on the actual type (plain Foo, Foo pointer and Foo reference), so it is important to associate all three types with the desired package. Practically speaking, you should create a separate SWIG interface file, which is %import-ed into each SWIG interface file, when you have multiple Java packages. Note the helper macros below, OTHER_PACKAGE_SPEC and ANOTHER_PACKAGE_SPEC, which reduce the amount of extra typing. "TYPE..." is useful when passing templated types to the macro, since multiargument template types appear to the SWIG preprocessor as multiple macro arguments.

    %typemap("javapackage") SWIGTYPE, SWIGTYPE *, SWIGTYPE &
                                                "package.for.most.classes";
    
    %define OTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.other.classes";
    %enddef
    
    %define ANOTHER_PACKAGE_SPEC(TYPE...)
    %typemap("javapackage") TYPE, TYPE *, TYPE & "package.for.another.set";
    %enddef
    
    OTHER_PACKAGE_SPEC(Package_2_class_one)
    ANOTHER_PACKAGE_SPEC(Package_3_class_two)
    /* etc */
    

    The basic strategy here is to provide a default package typemap for the majority of the classes, only providing "javapackage" typemaps for the exceptions.

    25.10 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "java.swg" and "typemaps.i" in the SWIG library.

    25.10.1 Simpler Java enums for enums without initializers

    The default Proper Java enums approach to wrapping enums is somewhat verbose. This is to handle all possible C/C++ enums, in particular enums with initializers. The generated code can be simplified if the enum being wrapped does not have any initializers.

    The following shows how to remove the support methods that are generated by default and instead use the methods in the Java enum base class java.lang.Enum and java.lang.Class for marshalling enums between C/C++ and Java. The type used for the typemaps below is enum SWIGTYPE which is the default type used for all enums. The "enums.swg" file should be examined in order to see the original overridden versions of the typemaps.

    %include "enums.swg"
    
    %typemap(javain) enum SWIGTYPE "$javainput.ordinal()"
    %typemap(javaout) enum SWIGTYPE {
        return $javaclassname.class.getEnumConstants()[$jnicall];
      }
    %typemap(javabody) enum SWIGTYPE ""
    
    %inline %{
      enum HairType { blonde, ginger, brunette };
      void setHair(HairType h);
      HairType getHair();
    %}
    

    SWIG will generate the following Java enum, which is somewhat simpler than the default:

    public enum HairType {
      blonde,
      ginger,
      brunette;
    }
    

    and the two Java proxy methods will be:

    public static void setHair(HairType h) {
      exampleJNI.setHair(h.ordinal());
    }
    
    public static HairType getHair() {
      return HairType.class.getEnumConstants()[exampleJNI.getHair()];
    }
    

    For marshalling Java enums to C/C++ enums, the ordinal method is used to convert the Java enum into an integer value for passing to the JNI layer, see the "javain" typemap. For marshalling C/C++ enums to Java enums, the C/C++ enum value is cast to an integer in the C/C++ typemaps (not shown). This integer value is then used to index into the array of enum constants that the Java language provides. See the getEnumConstants method in the "javaout" typemap.

    These typemaps can often be used as the default for wrapping enums as in many cases there won't be any enum initializers. In fact a good strategy is to always use these typemaps and to specifically handle enums with initializers using %apply. This would be done by using the original versions of these typemaps in "enums.swg" under another typemap name for applying using %apply.

    25.10.2 Handling C++ exception specifications as Java exceptions

    This example demonstrates various ways in which C++ exceptions can be tailored and converted into Java exceptions. Let's consider a simple file class SimpleFile and an exception class FileException which it may throw on error:

    %include "std_string.i" // for std::string typemaps
    #include <string>
    
    class FileException {
      std::string message;
    public:
      FileException(const std::string& msg) : message(msg) {}
      std::string what() {
        return message;
      }
    };
    
    class SimpleFile {
      std::string filename;
    public:
      SimpleFile(const std::string& filename) : filename(filename) {}
      void open() throw(FileException) {
      ...
      }
    };
    

    As the open method has a C++ exception specification, SWIG will parse this and know that the method can throw an exception. The "throws" typemap is then used when SWIG encounters an exception specification. The default generic "throws" typemap looks like this:

    %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY] %{
      SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException,
                              "C++ $1_type exception thrown");
      return $null;
    %}
    

    Basically SWIG will generate a C++ try catch block and the body of the "throws" typemap constitutes the catch block. The above typemap calls a SWIG supplied method which throws a java.lang.RuntimeException. This exception class is a runtime exception and therefore not a checked exception. If, however, we wanted to throw a checked exception, say java.io.IOException, then we could use the following typemap:

    %typemap(throws, throws="java.io.IOException") FileException {
      jclass excep = jenv->FindClass("java/io/IOException");
      if (excep)
        jenv->ThrowNew(excep, $1.what().c_str());
      return $null;
    }
    

    Note that this typemap uses the 'throws' typemap attribute to ensure a throws clause is generated. The generated proxy method then specifies the checked exception by containing java.io.IOException in the throws clause:

    public class SimpleFile {
      ...
      public void open() throws java.io.IOException { ... }
    }
    

    Lastly, if you don't want to map your C++ exception into one of the standard Java exceptions, the C++ class can be wrapped and turned into a custom Java exception class. If we go back to our example, the first thing we must do is get SWIG to wrap FileException and ensure that it derives from java.lang.Exception. Additionally, we might want to override the java.lang.Exception.getMessage() method. The typemaps to use then are as follows:

    %typemap(javabase) FileException "java.lang.Exception";
    %typemap(javacode) FileException %{
      public String getMessage() {
        return what();
      }
    %}
    

    This generates:

    public class FileException extends java.lang.Exception {
      ...
      public String getMessage() {
        return what();
      }
    
      public FileException(String msg) { ... }
    
      public String what() {
        return exampleJNI.FileException_what(swigCPtr, this);
      }
    }
    

    We could alternatively have used %rename to rename what() into getMessage().

    25.10.3 NaN Exception - exception handling for a particular type

    A Java exception can be thrown from any Java or JNI code. Therefore, as most typemaps contain either Java or JNI code, just about any typemap could throw an exception. The following example demonstrates exception handling on a type by type basis by checking for 'Not a number' (NaN) whenever a parameter of type float is wrapped.

    Consider the following C++ code:

    bool calculate(float first, float second);
    

    To validate every float being passed to C++, we could precede the code being wrapped by the following typemap which throws a runtime exception whenever the float is 'Not a Number':

    %module example
    %typemap(javain) float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    Note that the CheckForNaN support method has been added to the module class using the modulecode pragma. The following shows the generated code of interest:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    Note that the "javain" typemap is used for every occurrence of a float being used as an input. Of course, we could have targeted the typemap at a particular parameter by using float first, say, instead of just float.

    The exception checking could alternatively have been placed into the 'pre' attribute that the "javain" typemap supports. The "javain" typemap above could be replaced with the following:

    %typemap(javain, pre="    $module.CheckForNaN($javainput);") float "$javainput"
    

    which would modify the calculate function to instead be generated as:

    public class example {
      ...
      public static boolean calculate(float first, float second) {
        example.CheckForNaN(first);
        example.CheckForNaN(second);
        {
          return exampleJNI.calculate(first, second);
        }
      }
    }
    

    See the Date marshalling example for an example using further "javain" typemap attributes.

    If we decide that what we actually want is a checked exception instead of a runtime exception, we can change this easily enough. The proxy method that uses float as an input, must then add the exception class to the throws clause. SWIG can handle this as it supports the 'throws' typemap attribute for specifying classes for the throws clause. Thus we can modify the pragma and the typemap for the throws clause:

    %typemap(javain, throws="java.lang.Exception") float "$module.CheckForNaN($javainput)"
    %pragma(java) modulecode=%{
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    %}
    

    The calculate method now has a throws clause and even though the typemap is used twice for both float first and float second, the throws clause contains a single instance of java.lang.Exception:

    public class example {
      ...
    
      /** Simply returns the input value unless it is not a number,
          whereupon an exception is thrown. */
      static protected float CheckForNaN(float num) throws java.lang.Exception {
        if (Float.isNaN(num))
          throw new RuntimeException("Not a number");
        return num;
      }
    
      public static boolean calculate(float first, float second) throws java.lang.Exception {
        return exampleJNI.calculate(example.CheckForNaN(first), example.CheckForNaN(second));
      }
    }
    

    If we were a martyr to the JNI cause, we could replace the succinct code within the "javain" typemap with a few pages of JNI code. If we had, we would have put it in the "in" typemap which, like all JNI and Java typemaps, also supports the 'throws' attribute.

    25.10.4 Converting Java String arrays to char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Java String array to be used as a char ** object.

    %module example
    
    /* This tells SWIG to treat char ** as a special case when used as a parameter
       in a function call */
    %typemap(in) char ** (jint size) {
      int i = 0;
      size = (*jenv)->GetArrayLength(jenv, $input);
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<size; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $1[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($1[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $1[i] = 0;
    }
    
    /* This cleans up the memory we malloc'd before the function call */
    %typemap(freearg) char ** {
      int i;
      for (i=0; i<size$argnum-1; i++)
        free($1[i]);
      free($1);
    }
    
    /* This allows a C function to return a char ** as a Java String array */
    %typemap(out) char ** {
      int i;
      int len=0;
      jstring temp_string;
      const jclass clazz = (*jenv)->FindClass(jenv, "java/lang/String");
    
      while ($1[len]) len++;
      jresult = (*jenv)->NewObjectArray(jenv, len, clazz, NULL);
      /* exception checking omitted */
    
      for (i=0; i<len; i++) {
        temp_string = (*jenv)->NewStringUTF(jenv, *result++);
        (*jenv)->SetObjectArrayElement(jenv, jresult, i, temp_string);
        (*jenv)->DeleteLocalRef(jenv, temp_string);
      }
    }
    
    /* These 3 typemaps tell SWIG what JNI and Java types to use */
    %typemap(jni) char ** "jobjectArray"
    %typemap(jtype) char ** "String[]"
    %typemap(jstype) char ** "String[]"
    
    /* These 2 typemaps handle the conversion of the jtype to jstype typemap type
       and vice versa */
    %typemap(javain) char ** "$javainput"
    %typemap(javaout) char ** {
        return $jnicall;
      }
    
    /* Now a few test functions */
    %inline %{
    
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    
    char **get_args() {
      static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
      return &values[0];
    }
    
    %}
    

    Note that the 'C' JNI calling convention is used. Checking for any thrown exceptions after JNI function calls has been omitted. When this module is compiled, our wrapped C functions can be used by the following Java program:

    // File runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        String animals[] = {"Cat", "Dog", "Cow", "Goat"};
        example.print_args(animals);
        String args[] = example.get_args();
        for (int i=0; i<args.length; i++)
            System.out.println(i + ":" + args[i]);
      }
    }
    

    When compiled and run we get:

    $ java runme
    argv[0] = Cat
    argv[1] = Dog
    argv[2] = Cow
    argv[3] = Goat
    0:Dave
    1:Mike
    2:Susan
    3:John
    4:Michelle
    

    In the example, a few different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function. The "out" typemap is used for function return values. Lastly the "jni", "jtype" and "jstype" typemaps are also required to specify what Java types to use.

    25.10.5 Expanding a Java object to multiple arguments

    Suppose that you had a collection of C functions with arguments such as the following:

    int foo(int argc, char **argv);
    

    In the previous example, a typemap was written to pass a Java String array as the char **argv. This allows the function to be used from Java as follows:

    example.foo(4, new String[]{"red", "green", "blue", "white"});
    

    Although this works, it's a little awkward to specify the argument count. To fix this, a multi-argument typemap can be defined. This is not very difficult--you only have to make slight modifications to the previous example's typemaps:

    %typemap(in) (int argc, char **argv) {
      int i = 0;
      $1 = (*jenv)->GetArrayLength(jenv, $input);
      $2 = (char **) malloc(($1+1)*sizeof(char *));
      /* make a copy of each string */
      for (i = 0; i<$1; i++) {
        jstring j_string = (jstring)(*jenv)->GetObjectArrayElement(jenv, $input, i);
        const char * c_string = (*jenv)->GetStringUTFChars(jenv, j_string, 0);
        $2[i] = malloc((strlen(c_string)+1)*sizeof(char));
        strcpy($2[i], c_string);
        (*jenv)->ReleaseStringUTFChars(jenv, j_string, c_string);
        (*jenv)->DeleteLocalRef(jenv, j_string);
      }
      $2[i] = 0;
    }
    
    %typemap(freearg) (int argc, char **argv) {
      int i;
      for (i=0; i<$1-1; i++)
        free($2[i]);
      free($2);
    }
    
    %typemap(jni) (int argc, char **argv) "jobjectArray"
    %typemap(jtype) (int argc, char **argv) "String[]"
    %typemap(jstype) (int argc, char **argv) "String[]"
    
    %typemap(javain) (int argc, char **argv) "$javainput"
    

    When writing a multiple-argument typemap, each of the types is referenced by a variable such as $1 or $2. The typemap code simply fills in the appropriate values from the supplied Java parameter.

    With the above typemap in place, you will find it no longer necessary to supply the argument count. This is automatically set by the typemap code. For example:

    example.foo(new String[]{"red", "green", "blue", "white"});
    

    25.10.6 Using typemaps to return arguments

    A common problem in some C programs is that values may be returned in function parameters rather than in the return value of a function. The typemaps.i file defines INPUT, OUTPUT and INOUT typemaps which can be used to solve some instances of this problem. This library file uses an array as a means of moving data to and from Java when wrapping a C function that takes non const pointers or non const references as parameters.

    Now we are going to outline an alternative approach to using arrays for C pointers. The INOUT typemap uses a double[] array for receiving and returning the double* parameters. In this approach we are able to use a Java class myDouble instead of double[] arrays where the C pointer double* is required.

    Here is our example function:

    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2);
    

    If we define a structure MyDouble containing a double member variable and use some typemaps we can solve this problem. For example we could put the following through SWIG:

    %module example
    
    /* Define a new structure to use instead of double * */
    %inline %{
    typedef struct {
      double value;
    } MyDouble;
    %}
    
    
    %{
    /* Returns a status value and two values in out1 and out2 */
    int spam(double a, double b, double *out1, double *out2) {
      int status = 1;
      *out1 = a*10.0;
      *out2 = b*100.0;
      return status;
    }
    %}
    
    /* 
    This typemap will make any double * function parameters with name OUTVALUE take an
    argument of MyDouble instead of double *. This will 
    allow the calling function to read the double * value after returning from the function.
    */
    %typemap(in) double *OUTVALUE {
      jclass clazz = jenv->FindClass("MyDouble");
      jfieldID fid = jenv->GetFieldID(clazz, "swigCPtr", "J");
      jlong cPtr = jenv->GetLongField($input, fid);
      MyDouble *pMyDouble = NULL;
      *(MyDouble **)&pMyDouble = *(MyDouble **)&cPtr;
      $1 = &pMyDouble->value;
    }
    
    %typemap(jtype) double *OUTVALUE "MyDouble"
    %typemap(jstype) double *OUTVALUE "MyDouble"
    %typemap(jni) double *OUTVALUE "jobject"
    
    %typemap(javain) double *OUTVALUE "$javainput"
    
    /* Now we apply the typemap to the named variables */
    %apply double *OUTVALUE { double *out1, double *out2 };
    int spam(double a, double b, double *out1, double *out2);
    

    Note that the C++ JNI calling convention has been used this time and so must be compiled as C++ and the -c++ commandline must be passed to SWIG. JNI error checking has been omitted for clarity.

    What the typemaps do are make the named double* function parameters use our new MyDouble wrapper structure. The "in" typemap takes this structure, gets the C++ pointer to it, takes the double value member variable and passes it to the C++ spam function. In Java, when the function returns, we use the SWIG created getValue() function to get the output value. The following Java program demonstrates this:

    // File: runme.java
    
    public class runme {
    
      static {
        try {
          System.loadLibrary("example");
        } catch (UnsatisfiedLinkError e) {
          System.err.println("Native code library failed to load. " + e);
          System.exit(1);
        }
      }
    
      public static void main(String argv[]) {
        MyDouble out1 = new MyDouble();
        MyDouble out2 = new MyDouble();
        int ret = example.spam(1.2, 3.4, out1, out2);
        System.out.println(ret + "  " + out1.getValue() + "  " + out2.getValue());
      }
    }
    

    When compiled and run we get:

    $ java runme
    1 12.0  340.0
    

    25.10.7 Adding Java downcasts to polymorphic return types

    SWIG support for polymorphism works in that the appropriate virtual function is called. However, the default generated code does not allow for downcasting. Let's examine this with the following code:

    %include "std_string.i"
    
    #include <iostream>
    using namespace std;
    class Vehicle {
    public:
      virtual void start() = 0;
    ...
    };
    
    class Ambulance : public Vehicle {
      string vol;
    public:
      Ambulance(string volume) : vol(volume) {}
      virtual void start() {
        cout << "Ambulance started" << endl;
      }
      void sound_siren() {
        cout << vol << " siren sounded!" << endl;
      }
    ...
    };
    
    Vehicle *vehicle_factory() {
      return new Ambulance("Very loud");
    }
    

    If we execute the following Java code:

    Vehicle vehicle = example.vehicle_factory();
    vehicle.start();
    
    Ambulance ambulance = (Ambulance)vehicle;
    ambulance.sound_siren();
    

    We get:

    Ambulance started
    java.lang.ClassCastException
            at runme.main(runme.java:16)
    

    Even though we know from examination of the C++ code that vehicle_factory returns an object of type Ambulance, we are not able to use this knowledge to perform the downcast in Java. This occurs because the runtime type information is not completely passed from C++ to Java when returning the type from vehicle_factory(). Usually this is not a problem as virtual functions do work by default, such as in the case of start(). There are a few solutions to getting downcasts to work.

    The first is not to use a Java cast but a call to C++ to make the cast. Add this to your code:

    %exception Ambulance::dynamic_cast(Vehicle *vehicle) {
      $action
        if (!result) {
          jclass excep = jenv->FindClass("java/lang/ClassCastException");
          if (excep) {
            jenv->ThrowNew(excep, "dynamic_cast exception");
          }
        }
    }
    %extend Ambulance {
      static Ambulance *dynamic_cast(Vehicle *vehicle) {
        return dynamic_cast<Ambulance *>(vehicle);
      }
    };
    

    It would then be used from Java like this

    Ambulance ambulance = Ambulance.dynamic_cast(vehicle);
    ambulance.sound_siren();
    

    Should vehicle not be of type ambulance then a Java ClassCastException is thrown. The next solution is a purer solution in that Java downcasts can be performed on the types. Add the following before the definition of vehicle_factory:

    %typemap(out) Vehicle * {
      Ambulance *downcast = dynamic_cast<Ambulance *>($1);
      *(Ambulance **)&$result = downcast;
    }
    
    %typemap(javaout) Vehicle * {
        return new Ambulance($jnicall, $owner);
      }
    

    Here we are using our knowledge that vehicle_factory always returns type Ambulance so that the Java proxy is created as a type Ambulance. If vehicle_factory can manufacture any type of Vehicle and we want to be able to downcast using Java casts for any of these types, then a different approach is needed. Consider expanding our example with a new Vehicle type and a more flexible factory function:

    class FireEngine : public Vehicle {
    public:
      FireEngine() {}
      virtual void start() {
        cout << "FireEngine started" << endl;
      }
      void roll_out_hose() {
        cout << "Hose rolled out" << endl;
      }
      ...
    };
    Vehicle *vehicle_factory(int vehicle_number) {
      if (vehicle_number == 0)
        return new Ambulance("Very loud");
      else
        return new FireEngine();
    }
    

    To be able to downcast with this sort of Java code:

    FireEngine fireengine = (FireEngine)example.vehicle_factory(1);
    fireengine.roll_out_hose();
    Ambulance ambulance = (Ambulance)example.vehicle_factory(0);
    ambulance.sound_siren();
    

    the following typemaps targeted at the vehicle_factory function will achieve this. Note that in this case, the Java class is constructed using JNI code rather than passing a pointer across the JNI boundary in a Java long for construction in Java code.

    %typemap(jni) Vehicle *vehicle_factory "jobject"
    %typemap(jtype) Vehicle *vehicle_factory "Vehicle"
    %typemap(jstype) Vehicle *vehicle_factory "Vehicle"
    %typemap(javaout) Vehicle *vehicle_factory {
        return $jnicall;
      }
    
    %typemap(out) Vehicle *vehicle_factory {
      Ambulance *ambulance = dynamic_cast<Ambulance *>($1);
      FireEngine *fireengine = dynamic_cast<FireEngine *>($1);
      if (ambulance) {
        // call the Ambulance(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("Ambulance");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(Ambulance **)&cptr = ambulance;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      } else if (fireengine) {
        // call the FireEngine(long cPtr, boolean cMemoryOwn) constructor
        jclass clazz = jenv->FindClass("FireEngine");
        if (clazz) {
          jmethodID mid = jenv->GetMethodID(clazz, "<init>", "(JZ)V");
          if (mid) {
            jlong cptr = 0;
            *(FireEngine **)&cptr = fireengine;
            $result = jenv->NewObject(clazz, mid, cptr, false);
          }
        }
      }
      else {
        cout << "Unexpected type " << endl;
      }
    
      if (!$result)
        cout << "Failed to create new java object" << endl;
    }
    

    Better error handling would need to be added into this code. There are other solutions to this problem, but this last example demonstrates some more involved JNI code. SWIG usually generates code which constructs the proxy classes using Java code as it is easier to handle error conditions and is faster. Note that the JNI code above uses a number of string lookups to call a constructor, whereas this would not occur using byte compiled Java code.

    25.10.8 Adding an equals method to the Java classes

    When a pointer is returned from a JNI function, it is wrapped using a new Java proxy class or type wrapper class. Even when the pointers are the same, it will not be possible to know that the two Java classes containing those pointers are actually the same object. It is common in Java to use the equals() method to check whether two objects are equivalent. The equals() method is usually accompanied by a hashCode() method in order to fulfill the requirement that the hash code is equal for equal objects. Pure Java code methods like these can be easily added:

    %typemap(javacode) SWIGTYPE %{
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof $javaclassname)
          equal = ((($javaclassname)obj).swigCPtr == this.swigCPtr);
        return equal;
      }
      public int hashCode() {
        return (int)getPointer();
      }
    %}
    
    class Foo { };
    Foo* returnFoo(Foo *foo) { return foo; }
    

    The following would display false without the javacode typemap above. With the typemap defining the equals method the result is true.

    Foo foo1 = new Foo();
    Foo foo2 = example.returnFoo(foo1);
    System.out.println("foo1? " + foo1.equals(foo2));
    

    25.10.9 Void pointers and a common Java base class

    One might wonder why the common code that SWIG emits for the proxy and type wrapper classes is not pushed into a base class. The reason is that although swigCPtr could be put into a common base class for all classes wrapping C structures, it would not work for C++ classes involved in an inheritance chain. Each class derived from a base needs a separate swigCPtr because C++ compilers sometimes use a different pointer value when casting a derived class to a base. Additionally as Java only supports single inheritance, it would not be possible to derive wrapped classes from your own pure Java classes if the base class has been 'used up' by SWIG. However, you may want to move some of the common code into a base class. Here is an example which uses a common base class for all proxy classes and type wrapper classes:

    %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) "SWIG"
    
    %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], 
                                                             SWIGTYPE (CLASS::*) %{
      protected long getPointer() {
        return swigCPtr;
      }
    %}
    

    Define new base class called SWIG:

    public abstract class SWIG {
      protected abstract long getPointer();
    
      public boolean equals(Object obj) {
        boolean equal = false;
        if (obj instanceof SWIG)
          equal = (((SWIG)obj).getPointer() == this.getPointer());
        return equal;
      }
      
      SWIGTYPE_p_void getVoidPointer() {
        return new SWIGTYPE_p_void(getPointer(), false);
      }
    }
    

    This example contains some useful functionality which you may want in your code.

    • It has an equals() method. Unlike the previous example, the method code isn't replicated in all classes.
    • It also has a function which effectively implements a cast from the type of the proxy/type wrapper class to a void pointer. This is necessary for passing a proxy class or a type wrapper class to a function that takes a void pointer.

    25.10.10 Struct pointer to pointer

    Pointers to pointers are often used as output parameters in C factory type functions. These are a bit more tricky to handle. Consider the following situation where a Butler can be hired and fired:

    typedef struct {
      int hoursAvailable;
      char *greeting;
    } Butler;
    
    // Note: HireButler will allocate the memory 
    // The caller must free the memory by calling FireButler()!!
    extern int HireButler(Butler **ppButler);
    extern void FireButler(Butler *pButler);
    

    C code implementation:

    int HireButler(Butler **ppButler) {
      Butler *pButler = (Butler *)malloc(sizeof(Butler));
      pButler->hoursAvailable = 24;
      pButler->greeting = (char *)malloc(32);
      strcpy(pButler->greeting, "At your service Sir");
      *ppButler = pButler;
      return 1;
    }
    void FireButler(Butler *pButler) {
      free(pButler->greeting);
      free(pButler);
    }
    

    Let's take two approaches to wrapping this code. The first is to provide a functional interface, much like the original C interface. The following Java code shows how we intend the code to be used:

    Butler jeeves = new Butler();
    example.HireButler(jeeves);
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    example.FireButler(jeeves);
    

    Resulting in the following output when run:

    Greeting:     At your service Sir
    Availability: 24 hours per day
    

    Note the usage is very much like it would be used if we were writing C code, that is, explicit memory management is needed. No C memory is allocated in the construction of the Butler proxy class and the proxy class will not destroy the underlying C memory when it is collected. A number of typemaps and features are needed to implement this approach. The following interface file code should be placed before SWIG parses the above C code.

    %module example
    
    // Do not generate the default proxy constructor or destructor
    %nodefaultctor Butler;
    %nodefaultdtor Butler;
    
    // Add in pure Java code proxy constructor
    %typemap(javacode) Butler %{
      /** This constructor creates the proxy which initially does not create nor own any C memory */
      public Butler() {
        this(0, false);
      }
    %}
    
    // Type typemaps for marshalling Butler **
    %typemap(jni) Butler ** "jobject"
    %typemap(jtype) Butler ** "Butler"
    %typemap(jstype) Butler ** "Butler"
    
    // Typemaps for Butler ** as a parameter output type
    %typemap(in) Butler ** (Butler *ppButler = 0) %{
      $1 = &ppButler;
    %}
    %typemap(argout) Butler ** {
      // Give Java proxy the C pointer (of newly created object)
      jclass clazz = (*jenv)->FindClass(jenv, "Butler");
      jfieldID fid = (*jenv)->GetFieldID(jenv, clazz, "swigCPtr", "J");
      jlong cPtr = 0;
      *(Butler **)&cPtr = *$1;
      (*jenv)->SetLongField(jenv, $input, fid, cPtr);
    }
    %typemap(javain) Butler ** "$javainput"
    

    Note that the JNI code sets the proxy's swigCPtr member variable to point to the newly created object. The swigCMemOwn remains unchanged (at false), so that the proxy does not own the memory.

    Note: The old %nodefault directive disabled the default constructor and destructor at the same time. This is unsafe in most of the cases, and you can use the explicit %nodefaultctor and %nodefaultdtor directives to achieve the same result if needed.

    The second approach offers a more object oriented interface to the Java user. We do this by making the Java proxy class's constructor call the HireButler() method to create the underlying C object. Additionally we get the proxy to take ownership of the memory so that the finalizer will call the FireButler() function. The proxy class will thus take ownership of the memory and clean it up when no longer needed. We will also prevent the user from being able to explicitly call the HireButler() and FireButler() functions. Usage from Java will simply be:

    Butler jeeves = new Butler();
    System.out.println("Greeting:     " + jeeves.getGreeting());
    System.out.println("Availability: " + jeeves.getHoursAvailable() + " hours per day");
    

    Note that the Butler class is used just like any other Java class and no extra coding by the user needs to be written to clear up the underlying C memory as the finalizer will be called by the garbage collector which in turn will call the FireButler() function. To implement this, we use the above interface file code but remove the javacode typemap and add the following:

    // Don't expose the memory allocation/de-allocation functions
    %ignore FireButler(Butler *pButler);
    %ignore HireButler(Butler **ppButler);
    
    // Add in a custom proxy constructor and destructor
    %extend Butler {
      Butler() {
        Butler *pButler = 0;
        HireButler(&pButler);
        return pButler;
      }
      ~Butler() {
        FireButler($self);
      }
    }
    

    Note that the code in %extend is using a C++ type constructor and destructor, yet the generated code will still compile as C code, see Adding member functions to C structures. The C functional interface has been completely morphed into an object-oriented interface and the Butler class would behave much like any pure Java class and feel more natural to Java users.

    25.10.11 Memory management when returning references to member variables

    This example shows how to prevent premature garbage collection of objects when the underlying C++ class returns a pointer or reference to a member variable.

    Consider the following C++ code:

    struct Wheel {
      int size;
      Wheel(int sz) : size(sz) {}
    };
    
    class Bike {
      Wheel wheel;
    public:
      Bike(int val) : wheel(val) {}
      Wheel& getWheel() { return wheel; }
    };
    

    and the following usage from Java after running the code through SWIG:

    Wheel wheel = new Bike(10).getWheel();
    System.out.println("wheel size: " + wheel.getSize());
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("wheel size: " + wheel.getSize());
    

    Don't be surprised that if the resulting output gives strange results such as...

    wheel size: 10
    wheel size: 135019664
    

    What has happened here is the garbage collector has collected the Bike instance as it doesn't think it is needed any more. The proxy instance, wheel, contains a reference to memory that was deleted when the Bike instance was collected. In order to prevent the garbage collector from collecting the Bike instance a reference to the Bike must be added to the wheel instance. You can do this by adding the reference when the getWheel() method is called using the following typemaps.

    %typemap(javacode) Wheel %{
      // Ensure that the GC doesn't collect any Bike instance set from Java
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    %}
    
    // Add a Java reference to prevent premature garbage collection and resulting use
    // of dangling C++ pointer. Intended for methods that return pointers or
    // references to a member variable.
    %typemap(javaout) Wheel& getWheel {
      long cPtr = $jnicall;
      $javaclassname ret = null;
      if (cPtr != 0) {
        ret = new $javaclassname(cPtr, $owner);
        ret.addReference(this);
      }
      return ret;
      }
    

    The code in the first typemap gets added to the Wheel proxy class. The code in the second typemap constitutes the bulk of the code in the generated getWheel() function:

    public class Wheel {
      ...
      // Ensure that the GC doesn't collect any bike set from Java 
      private Bike bikeReference;
      protected void addReference(Bike bike) {
        bikeReference = bike;
      }
    }
    
    public class Bike {
      ...
      public Wheel getWheel() {
        long cPtr = exampleJNI.Bike_getWheel(swigCPtr, this);
        Wheel ret = null;
        if (cPtr != 0) {
          ret = new Wheel(cPtr, false);
          ret.addReference(this);
        }
        return ret;
      }
    }
    

    Note the addReference call.

    25.10.12 Memory management for objects passed to the C++ layer

    Managing memory can be tricky when using C++ and Java proxy classes. The previous example shows one such case and this example looks at memory management for a class passed to a C++ method which expects the object to remain in scope after the function has returned. Consider the following two C++ classes:

    struct Element {
      int value;
      Element(int val) : value(val) {}
    };
    class Container {
      Element* element;
    public:
      Container() : element(0) {}
      void setElement(Element* e) { element = e; }
      Element* getElement() { return element; }
    };
    

    and usage from C++

    Container container;
    Element element(20);
    container.setElement(&element);
    cout << "element.value: " << container.getElement()->value << endl;
    

    and more or less equivalent usage from Java

    Container container = new Container();
    container.setElement(new Element(20));
    System.out.println("element value: " + container.getElement().getValue());
    

    The C++ code will always print out 20, but the value printed out may not be this in the Java equivalent code. In order to understand why, consider a garbage collection occuring...

    Container container = new Container();
    container.setElement(new Element(20));
    // Simulate a garbage collection
    System.gc();
    System.runFinalization();
    System.out.println("element value: " + container.getElement().getValue());
    

    The temporary element created with new Element(20) could get garbage collected which ultimately means the container variable is holding a dangling pointer, thereby printing out any old random value instead of the expected value of 20. One solution is to add in the appropriate references in the Java layer...

    public class Container {
    
      ...
    
      // Ensure that the GC doesn't collect any Element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private long getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    
      public void setElement(Element e) {
        exampleJNI.Container_setElement(swigCPtr, this, getCPtrAndAddReference(e), e);
      }
    }
    

    The following typemaps will generate the desired code. The 'javain' typemap matches the input parameter type for the setElement method. The 'javacode' typemap simply adds in the specified code into the Java proxy class.

    %typemap(javain) Element *e "getCPtrAndAddReference($javainput)"
    
    %typemap(javacode) Container %{
      // Ensure that the GC doesn't collect any element set from Java
      // as the underlying C++ class stores a shallow copy
      private Element elementReference;
      private long getCPtrAndAddReference(Element element) {
        elementReference = element;
        return Element.getCPtr(element);
      }
    %}
    

    25.10.13 Date marshalling using the javain typemap and associated attributes

    The NaN Exception example is a simple example of the "javain" typemap and its 'pre' attribute. This example demonstrates how a C++ date class, say CDate, can be mapped onto the standard Java date class, java.util.GregorianCalendar by using the 'pre', 'post' and 'pgcppname' attributes of the "javain" typemap. The idea is that the GregorianCalendar is used wherever the C++ API uses a CDate. Let's assume the code being wrapped is as follows:

    class CDate {
    public:
      CDate(int year, int month, int day);
      int getYear();
      int getMonth();
      int getDay();
      ...
    };
    struct Action {
      static int doSomething(const CDate &dateIn, CDate &dateOut);
      Action(const CDate &date, CDate &dateOut);
    };
    

    Note that dateIn is const and therefore read only and dateOut is a non-const output type.

    First let's look at the code that is generated by default, where the Java proxy class CDate is used in the proxy interface:

    public class Action {
      ...
      public static int doSomething(CDate dateIn, CDate dateOut) {
        return exampleJNI.Action_doSomething(CDate.getCPtr(dateIn), dateIn, 
                                             CDate.getCPtr(dateOut), dateOut);
      }
    
      public Action(CDate date, CDate dateOut) {
        this(exampleJNI.new_Action(CDate.getCPtr(date), date, 
                                   CDate.getCPtr(dateOut), dateOut), true);
      }
    }
    

    The CDate & and const CDate & Java code is generated from the following two default typemaps:

    %typemap(jstype) SWIGTYPE & "$javaclassname"
    %typemap(javain) SWIGTYPE & "$javaclassname.getCPtr($javainput)"
    

    where '$javaclassname' is translated into the proxy class name, CDate and '$javainput' is translated into the name of the parameter, eg dateIn. From Java, the intention is then to call into a modifed API with something like:

    java.util.GregorianCalendar calendarIn = 
      new java.util.GregorianCalendar(2011, java.util.Calendar.APRIL, 13, 0, 0, 0);
    java.util.GregorianCalendar calendarOut = new java.util.GregorianCalendar();
    
    // Note in calls below, calendarIn remains unchanged and calendarOut 
    // is set to a new value by the C++ call
    Action.doSomething(calendarIn, calendarOut);
    Action action = new Action(calendarIn, calendarOut);
    

    To achieve this mapping, we need to alter the default code generation slightly so that at the Java layer, a GregorianCalendar is converted into a CDate. The JNI intermediary layer will still take a pointer to the underlying CDate class. The typemaps to achieve this are shown below.

    %typemap(jstype) const CDate& "java.util.GregorianCalendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             pgcppname="temp$javainput") const CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    
    %typemap(jstype) CDate& "java.util.Calendar"
    %typemap(javain, 
             pre="    CDate temp$javainput = new CDate($javainput.get(java.util.Calendar.YEAR), "
                 "$javainput.get(java.util.Calendar.MONTH), $javainput.get(java.util.Calendar.DATE));", 
             post="      $javainput.set(temp$javainput.getYear(), temp$javainput.getMonth(), "
                  "temp$javainput.getDay(), 0, 0, 0);", 
             pgcppname="temp$javainput") CDate &
             "$javaclassname.getCPtr(temp$javainput)"
    

    The resulting generated proxy code in the Action class follows:

    public class Action {
      ...
      public static int doSomething(java.util.GregorianCalendar dateIn, 
                                    java.util.Calendar dateOut) {
        CDate tempdateIn = new CDate(dateIn.get(java.util.Calendar.YEAR), 
                                     dateIn.get(java.util.Calendar.MONTH), 
                                     dateIn.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.Action_doSomething(CDate.getCPtr(tempdateIn), tempdateIn, 
                                               CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      static private long SwigConstructAction(java.util.GregorianCalendar date, 
                                              java.util.Calendar dateOut) {
        CDate tempdate = new CDate(date.get(java.util.Calendar.YEAR), 
                                   date.get(java.util.Calendar.MONTH), 
                                   date.get(java.util.Calendar.DATE));
        CDate tempdateOut = new CDate(dateOut.get(java.util.Calendar.YEAR), 
                                      dateOut.get(java.util.Calendar.MONTH), 
                                      dateOut.get(java.util.Calendar.DATE));
        try {
          return exampleJNI.new_Action(CDate.getCPtr(tempdate), tempdate, 
                                       CDate.getCPtr(tempdateOut), tempdateOut);
        } finally {
          dateOut.set(tempdateOut.getYear(), tempdateOut.getMonth(), tempdateOut.getDay(), 0, 0, 0);
        }
      }
    
      public Action(java.util.GregorianCalendar date, java.util.Calendar dateOut) {
        this(Action.SwigConstructAction(date, dateOut), true);
      }
    }
    

    A few things to note:

    • The "javatype" typemap has changed the parameter type to java.util.GregorianCalendar or java.util.Calendar instead of the default generated CDate proxy.
    • The code in the 'pre' attribute appears before the JNI call (exampleJNI.new_Action / exampleJNI.Action_doSomething).
    • The code in the 'post' attribute appears after the JNI call.
    • A try .. finally block is generated with the JNI call in the try block and 'post' code in the finally block. The alternative of just using a temporary variable for the return value from the JNI call and the 'post' code being generated before the return statement is not possible given that the JNI call is in one line and comes from the "javaout" typemap.
    • The temporary variables in the "javain" typemaps are called temp$javain, where "$javain" is replaced with the parameter name. "$javain" is used to mangle the variable name so that more than one CDate & type can be used as a parameter in a method, otherwise two or more local variables with the same name would be generated.
    • The use of the "javain" typemap causes a constructor helper function (SwigConstructAction) to be generated. This allows Java code to be called before the JNI call and is required as the Java compiler won't compile code inserted before the 'this' call.
    • The 'pgcppname' attribute is used to modify the object being passed as the premature garbage collection prevention parameter (the 2nd and 4th parameters in the JNI calls).

    25.11 Living with Java Directors

    This section is intended to address frequently asked questions and frequently encountered problems when using Java directors.

    1. When my program starts up, it complains that method_foo cannot be found in a Java method called swig_module_init. How do I fix this?

      Open up the C++ wrapper source code file and look for "method_foo" (include the double quotes, they are important!) Look at the JNI field descriptor and make sure that each class that occurs in the descriptor has the correct package name in front of it. If the package name is incorrect, put a "javapackage" typemap in your SWIG interface file.

    2. I'm compiling my code and I'm using templates. I provided a javapackage typemap, but SWIG doesn't generate the right JNI field descriptor.

      Use the template's renamed name as the argument to the "javapackage" typemap:

      %typemap(javapackage)  std::vector<int>  "your.package.here"
      %template(VectorOfInt) std::vector<int>;
      
    3. When I pass class pointers or references through a C++ upcall and I try to type cast them, Java complains with a ClassCastException. What am I doing wrong?

      Normally, a non-director generated Java proxy class creates temporary Java objects as follows:

      public static void MyClass_method_upcall(MyClass self, long jarg1)
      {
        Foo darg1 = new Foo(jarg1, false);
      
        self.method_upcall(darg1);
      }
      

      Unfortunately, this loses the Java type information that is part of the underlying Foo director proxy class's Java object pointer causing the type cast to fail. The SWIG Java module's director code attempts to correct the problem, but only for director-enabled classes, since the director class retains a global reference to its Java object. Thus, for director-enabled classes and only for director-enabled classes, the generated proxy Java code looks something like:

      public static void MyClass_method_upcall(MyClass self, long jarg1,
                                               Foo jarg1_object)
      {
        Foo darg1 = (jarg1_object != null ? jarg1_object : new Foo(jarg1, false));
      
        self.method_upcall(darg1);
      }
      

      When you import a SWIG interface file containing class definitions, the classes you want to be director-enabled must be have the feature("director") enabled for type symmetry to work. This applies even when the class being wrapped isn't a director-enabled class but takes parameters that are director-enabled classes.

      The current "type symmetry" design will work for simple C++ inheritance, but will most likely fail for anything more complicated such as tree or diamond C++ inheritance hierarchies. Those who are interested in challenging problems are more than welcome to hack the Java::Java_director_declaration method in Source/Modules/java.cxx.

      If all else fails, you can use the downcastXXXXX() method to attempt to recover the director class's Java object pointer. For the Java Foo proxy class, the Foo director class's java object pointer can be accessed through the javaObjectFoo() method. The generated method's signature is:

        public static Foo javaObjectFoo(Foo obj);
      

      From your code, this method is invoked as follows:

      public class MyClassDerived {
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = (foo_object != null ?
                       (FooDerived) Foo.downcastFoo(foo_object) : null);
          /* rest of your code here */
        }
      }
      

      An good approach for managing downcasting is placing a static method in each derived class that performs the downcast from the superclass, e.g.,

      public class FooDerived extends Foo {
        /* ... */
        public static FooDerived downcastFooDerived(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object);
          }
      
          catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      Then change the code in MyClassDerived as follows:

      public class MyClassDerived extends MyClass {
        /* ... */
        public void method_upcall(Foo foo_object)
        {
          FooDerived    derived = FooDerived.downcastFooDerived(foo_object);
          /* rest of your code here */
        }
      }
      
    4. Why isn't the proxy class declared abstract? Why aren't the director upcall methods in the proxy class declared abstract?

      Declaring the proxy class and its methods abstract would break the JNI argument marshalling and SWIG's downcall functionality (going from Java to C++.) Create an abstract Java subclass that inherits from the director-enabled class instead. Using the previous Foo class example:

      public abstract class UserVisibleFoo extends Foo {
        /** Make sure user overrides this method, it's where the upcall
         * happens.
         */
        public abstract void method_upcall(Foo foo_object);
      
        /// Downcast from Foo to UserVisibleFoo
        public static UserVisibleFoo downcastUserVisibleFoo(Foo foo_object)
        {
          try {
            return foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object) : null;
          } catch (ClassCastException exc) {
            // Wasn't a FooDerived object, some other subclass of Foo
            return null;
          }
        }
      }
      

      This doesn't prevent the user from creating subclasses derived from Foo, however, UserVisibleFoo provides the safety net that reminds the user to override the method_upcall() method.

    25.12 Odds and ends

    25.12.1 JavaDoc comments

    The SWIG documentation system is currently deprecated. When it is resurrected JavaDoc comments will be fully supported. If you can't wait for the full documentation system a couple of workarounds are available. The %javamethodmodifiers feature can be used for adding proxy class method comments and module class method comments. The "javaimports" typemap can be hijacked for adding in proxy class JavaDoc comments. The jniclassimports or jniclassclassmodifiers pragmas can also be used for adding intermediary JNI class comments and likewise the moduleimports or moduleclassmodifiers pragmas for the module class. Here is an example adding in a proxy class and method comment:

    %javamethodmodifiers Barmy::lose_marbles() "
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public";
    
    %typemap(javaimports) Barmy "
    /** The crazy class. Use as a last resort. */"
    
    class Barmy {
    public:
      void lose_marbles() {}
    };
    

    Note the "public" added at the end of the %javamethodmodifiers as this is the default for this feature. The generated proxy class with JavaDoc comments is then as follows:

    /** The crazy class. Use as a last resort. */
    public class Barmy {
    ...
      /**
        * Calling this method will make you mad.
        * Use with <b>utmost</b> caution. 
        */
      public void lose_marbles() {
        ...
      }
    ...
    }
    

    25.12.2 Functional interface without proxy classes

    It is possible to run SWIG in a mode that does not produce proxy classes by using the -noproxy commandline option. The interface is rather primitive when wrapping structures or classes and is accessed through function calls to the module class. All the functions in the module class are wrapped by functions with identical names as those in the intermediary JNI class.

    Consider the example we looked at when examining proxy classes:

    class Foo {
    public:
      int x;
      int spam(int num, Foo* foo);
    };
    

    When using -noproxy, type wrapper classes are generated instead of proxy classes. Access to all the functions and variables is through a C like set of functions where the first parameter passed is the pointer to the class, that is an instance of a type wrapper class. Here is what the module class looks like:

    public class example {
      public static void Foo_x_get(SWIGTYPE_p_Foo self, int x) {...}
      public static int Foo_x_get(SWIGTYPE_p_Foo self) {...}
      public static int Foo_spam(SWIGTYPE_p_Foo self, int num, SWIGTYPE_p_Foo foo) {...}
      public static SWIGTYPE_p_Foo new_Foo() {...}
      public static void delete_Foo(SWIGTYPE_p_Foo self) {...}
    }
    

    This approach is not nearly as natural as using proxy classes as the functions need to be used like this:

    SWIGTYPE_p_Foo foo = example.new_Foo();
    example.Foo_x_set(foo, 10);
    int var = example.Foo_x_get(foo);
    example.Foo_spam(foo, 20, foo);
    example.delete_Foo(foo);
    

    Unlike proxy classes, there is no attempt at tracking memory. All destructors have to be called manually for example the delete_Foo(foo) call above.

    25.12.3 Using your own JNI functions

    You may have some hand written JNI functions that you want to use in addition to the SWIG generated JNI functions. Adding these to your SWIG generated package is possible using the %native directive. If you don't want SWIG to wrap your JNI function then of course you can simply use the %ignore directive. However, if you want SWIG to generate just the Java code for a JNI function then use the %native directive. The C types for the parameters and return type must be specified in place of the JNI types and the function name must be the native method name. For example:

    %native (HandRolled) void HandRolled(int, char *);
    %{
    JNIEXPORT void JNICALL Java_packageName_moduleName_HandRolled(JNIEnv *, jclass,
                                                                  jlong, jstring);
    %}
    

    No C JNI function will be generated and the Java_packageName_moduleName_HandRolled function will be accessible using the SWIG generated Java native method call in the intermediary JNI class which will look like this:

      public final static native void HandRolled(int jarg1, String jarg2);
    

    and as usual this function is wrapped by another which for a global C function would appear in the module class:

      public static void HandRolled(int arg0, String arg1) {
        exampleJNI.HandRolled(arg0, arg1);
      }
    

    The packageName and moduleName must of course be correct else you will get linker errors when the JVM dynamically loads the JNI function. You may have to add in some "jtype", "jstype", "javain" and "javaout" typemaps when wrapping some JNI types. Here the default typemaps work for int and char *.

    In summary the %native directive is telling SWIG to generate the Java code to access the JNI C code, but not the JNI C function itself. This directive is only really useful if you want to mix your own hand crafted JNI code and the SWIG generated code into one Java class or package.

    25.12.4 Performance concerns and hints

    If you're directly manipulating huge arrays of complex objects from Java, performance may suffer greatly when using the array functions in arrays_java.i. Try and minimise the expensive JNI calls to C/C++ functions, perhaps by using temporary Java variables instead of accessing the information directly from the C/C++ object.

    Java classes without any finalizers generally speed up code execution as there is less for the garbage collector to do. Finalizer generation can be stopped by using an empty javafinalize typemap:

    %typemap(javafinalize) SWIGTYPE ""
    

    However, you will have to be careful about memory management and make sure that you code in a call to the delete() member function. This method normally calls the C++ destructor or free() for C code.

    25.12.5 Debugging

    The generated code can be debugged using both a Java debugger and a C++ debugger using the usual debugging techniques. Breakpoints can be set in either Java or C++ code and so both can be debugged simultaneously. Most debuggers do not understand both Java and C++, with one noteable exception of Sun Studio, where it is possible to step from Java code into a JNI method within one environment.

    Alternatively, debugging can involve placing debug printout statements in the JNI layer using the %exception directive. See the special variables for %exception section. Many of the default typemaps can also be overridden and modified for adding in extra logging/debug display information.

    The -Xcheck:jni and -Xcheck:nabounds Java executable options are useful for debugging to make sure the JNI code is behaving. The -verbose:jni and -verbose:gc are also useful options for monitoring code behaviour.

    25.13 Java Examples

    The directory Examples/java has a number of further examples. Take a look at these if you want to see some of the techniques described in action. The Examples/index.html file in the parent directory contains the SWIG Examples Documentation and is a useful starting point. If your SWIG installation went well Unix users should be able to type make in each example directory, then java main to see them running. For the benefit of Windows users, there are also Visual C++ project files in a couple of the Windows Examples. There are also many regression tests in the Examples/test-suite directory. Many of these have runtime tests in the java subdirectory.

    swig-3.0.12/Doc/Manual/Scilab.html0000664000175000017500000014776613042756672016474 0ustar williamwilliam SWIG and Scilab

    39 SWIG and Scilab

    Scilab is a scientific software package for numerical computations providing a powerful open computing environment for engineering and scientific applications that is mostly compatible with MATLAB. More information can be found at www.scilab.org.

    This chapter explains how to use SWIG for Scilab. After this introduction, you should be able to generate with SWIG a Scilab external module from a C/C++ library.

    39.1 Preliminaries

    SWIG for Scilab supports Linux. Other operating sytems haven't been tested.

    Scilab is supported from version 5.3.3 onwards. The forthcoming version 6, as of January 2015, is also supported.

    SWIG for Scilab supports C language. C++ is partially supported. See A basic tour of C/C++ wrapping for further details.

    39.2 Running SWIG

    Let's see how to use SWIG for Scilab on a small example.
    In this example we bind from C a function and a global variable into Scilab. The SWIG interface (stored in a file named example.i), is the following:

    %module example
    
    %inline %{
    double Foo = 3.0;
    
    int fact(int n) {
        if (n < 0) {
            return 0;
        }
        else if (n == 0) {
            return 1;
        }
        else {
            return n * fact(n-1);
        }
    }
    %}
    

    Note: a code in an %inline section is both parsed and wrapped by SWIG, and inserted as is in the wrapper source file.

    39.2.1 Generating the module

    The module is generated using the swig executable and its -scilab option.

    $ swig -scilab example.i
    

    This command generates two files:

    • example_wrap.c: a C source file containing the wrapping code and also here the wrapped code (the fact() and Foo definitions)
    • loader.sce: a Scilab script used to load the module into Scilab

    Note: if the following error is returned:

    :1: Error: Unable to find 'swig.swg'
    :3: Error: Unable to find 'scilab.swg'
    

    it may be because the SWIG library is not found. Check the SWIG_LIB environment variable or your SWIG installation.

    Note: SWIG for Scilab can work in two modes related to the way the module is built, see the Building modes section for details. This example uses the builder mode.

    The swig executable has several other command line options you can use. See Scilab command line options for further details.

    39.2.2 Building the module

    To be loaded in Scilab, the wrapper has to be built into a dynamic module (or shared library).

    The commands to compile and link the wrapper (with gcc) into the shared library libexample.so are:

    $ gcc -fPIC -c -I/usr/local/include/scilab example_wrap.c
    $ gcc -shared example_wrap.o -o libexample.so
    

    Note: we supposed in this example that the path to the Scilab include directory is /usr/local/include/scilab (which is the case in a Debian environment), this should be changed for another environment.

    39.2.3 Loading the module

    Loading a module is done by running the loader script in Scilab:

    --> exec loader.sce
    

    Scilab should output the following messages:

    Shared archive loaded.
    Link done.
    

    which means that Scilab has successfully loaded the shared library. The module functions and other symbols are now available in Scilab.

    39.2.4 Using the module

    In Scilab, the function fact() is simply called as following:

    --> fact(5)
    ans  =
    
        120.
    

    For the Foo global variable, the accessors need to be used:

    --> Foo_get
    ans  =
    
        3.
    
    --> Foo_set(4);
    
    --> Foo_get
    ans  =
    
        4.
    

    Note: for conciseness, we assume in the subsequent Scilab code examples that the modules have been beforehand built and loaded in Scilab.

    39.2.5 Scilab command line options

    The following table lists the Scilab specific command line options in addition to the generic SWIG options:

    -builder Generate the Scilab builder script
    -buildercflags <cflags> Add <cflags> to the builder compiler flags
    -builderldflags <ldflags> Add <ldlags> to the builder linker flags
    -buildersources <files> Add the (comma separated) files <files> to the builder sources
    -builderverbositylevel <level> Set the build verbosity level to <level> (default 0: off, 2: high)
    -builderflagscript <file> Use the Scilab script <file> to configure the compiler and linker flags
    -gatewayxml <gateway_id> Generate the gateway XML with the given <gateway_id>

    These options can be displayed with:

    $ swig -scilab -help
    

    39.3 A basic tour of C/C++ wrapping

    39.3.1 Overview

    SWIG for Scilab provides only a low-level C interface for Scilab (see Scripting Languages for the general approach to wrapping). This means that functions, structs, classes, variables, etc... are interfaced through C functions. These C functions are mapped as Scilab functions. There are a few exceptions, such as constants and enumerations, which can be wrapped directly as Scilab variables.

    39.3.2 Identifiers

    In Scilab 5.x, identifier names are composed of 24 characters maximum (this limitation should disappear from Scilab 6.0 onwards).
    Thus long function or variable names may be truncated and this can cause ambiguities.

    This happens especially when wrapping structs/classes, for which the wrapped function name is composed of the struct/class name and field names. In these cases, the %rename directive can be used to choose a different Scilab name.

    39.3.3 Functions

    Functions are wrapped as new Scilab built-in functions. For example:

    %module example
    
    %inline %{
    int fact(int n) {
      if (n > 1)
        return n * fact(n - 1);
      else
        return 1;
    }
    %}
    

    creates a built-in function fact(n) in Scilab:

    --> fact(4)
    ans  =
    
        24.
    

    39.3.3.1 Argument passing

    In the above example, the function parameter is a primitive type and is marshalled by value. So this function is wrapped without any additional customization. Argument values are converted between C types and Scilab types through type mappings. There are several default type mappings for primitive and complex types, described later in the Scilab typemaps section.

    When a parameter is not passed by value, such as a pointer or reference, SWIG does not know if it is an input, output (or both) parameter. The INPUT, OUTPUT, INOUT typemaps defined in the typemaps.i library can be used to specify this.

    Let's see this on two simple functions: sub() which has an output parameter, and inc(), which as input/output parameter:

    %module example
    
    %include <typemaps.i>
    
    extern void sub(int *INPUT, int *INPUT, int *OUTPUT);
    extern void inc(int *INOUT, int *INPUT);
    
    %{
    void sub(int *x, int *y, int *result) {
      *result = *x - *y;
    }
    void inc(int *x, int *delta) {
      *x = *x + *delta;
    }
    %}
    

    In Scilab, parameters are passed by value. The output (and inout) parameters are returned as the result of the functions:

    --> sub(5, 3)
     ans  =
    
        2.
    
    --> inc(4, 3)
     ans  =
    
        7.
    

    39.3.3.2 Multiple output arguments

    A C function can have several output parameters. They can all be returned as results of the wrapped function as Scilab supports multiple return values from a function when using the typemaps.i library. If the C function itself returns a result, this is returned first before the parameter outputs.

    The example below shows this for a C function returning 2 values and a result:

    %module example
    
    %include <typemaps.i>
    
    int divide(int n, int d, int *OUTPUT, int *OUTPUT);
    
    %{
      int divide(int n, int d, int q*, int *r) {
        if (d != 0) {
          *q = n / d;
          *r = n % d;
          return 1;
        } else {
          return 0;
        }
      }
    %}
    

    --> [ret, q, r] = divide(20, 6)
     r  =
    
        2.
     q  =
    
        3.
     ret  =
    
        1.
    

    39.3.4 Global variables

    Global variables are manipulated through generated accessor functions. For example, for a given Foo global variable, SWIG actually generates two functions: Foo_get() to get the value of Foo, and Foo_set() to set the value. These functions are used as following:

    --> exec loader.sce;
    --> c = Foo_get();
    
    --> Foo_set(4);
    
    --> c
    c =
    
        3.
    
    --> Foo_get()
    ans  =
    
        4.
    

    It works for variables of primitive type, but also for non-primitive types: arrays, and structs/classes which are described later. For now, an example with two global primitive arrays x and y is shown:

    %module example
    
    %inline %{
    int x[10];
    double y[7];
    
    void initArrays()
    {
      int i;
      for (i = 0; i < 10; i++)
        x[i] = 1;
      for (i = 0; i < 7; i++)
        y[i] = 1.0f;
    }
    %}
    

    It works the same:

    --> exec loader.sce
    
    --> initArrays();
    --> x_get()
     ans  =
    
        1.    1.    1.    1.    1.    1.    1.    1.    1.    1.
    
    --> y_set([0:6] / 10);
    --> y_get()
     ans  =
    
        0.    0.1    0.2    0.3    0.4    0.5    0.6
    

    39.3.5 Constants and enumerations

    39.3.5.1 Constants

    There is not any constant in Scilab. By default, C/C++ constants are wrapped as getter functions. For example, for the following constants:

    %module example
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    the following getter functions are generated:

    --> exec loader.sce;
    --> ICONST_get();
     ans  =
    
        42.
    
    --> FCONST_get();
     ans  =
    
        2.1828
    
    --> CCONST_get();
     ans  =
    
        x
    
    --> CCONST2_get();
     ans  =
    
    --> SCONST_get();
     ans  =
    
        Hello World
    
    --> SCONST2_get();
     ans  =
    
        "Hello World"
    
    --> EXPR_get();
     ans  =
    
        48.5484
    
    --> iconst_get();
     ans  =
    
        37.
    
    --> fconst_get();
     ans  =
    
        3.14
    

    There is another mode in which constants are wrapped as Scilab variables. The variables are easier to use than functions, but the drawback is that variables are not constant and so can be modified.

    This mode can be enabled/disabled at any time in the interface file with %scilabconst(), which works like all the other %feature directives. Use the argument value "1" to enable and "0" to disable this mode. For example in this mode the previous constants:

    %module example
    
    %scilabconst(1);
    #define    ICONST      42
    #define    FCONST      2.1828
    #define    CCONST      'x'
    #define    CCONST2     '\n'
    #define    SCONST      "Hello World"
    #define    SCONST2     "\"Hello World\""
    

    are mapped to Scilab variables, with the same name:

    --> exec loader.sce;
    --> ICONST
     ans  =
    
        42
    
    --> FCONST
     ans  =
    
        2.1828
    
    --> CCONST
     ans  =
    
        x
    
    --> CCONST2
     ans  =
    
    --> SCONST
     ans  =
    
        Hello World
    
    --> SCONST2
     ans  =
    
        "Hello World"
    
    --> EXPR
     ans  =
    
        48.5484
    
    --> iconst
     ans  =
    
        37
    
    --> fconst
     ans  =
    
        3.14
    

    39.3.5.2 Enumerations

    The wrapping of enums is the same as for constants. By default, enums are wrapped as getter functions. For example, with the following enumeration:

    %module example
    typedef enum { RED, BLUE, GREEN } color;
    

    a getter function will be generated for each value of the enumeration:

    --> exec loader.sce;
    --> RED_get()
     ans  =
    
        0.
    
    --> BLUE_get()
     ans  =
    
        1.
    
    --> GREEN_get()
     ans  =
    
        2.
    

    The %scilabconst() feature is also available for enumerations:

    %module example
    %scilabconst(1) color;
    typedef enum { RED, BLUE, GREEN } color;
    

    --> exec loader.sce;
    --> RED
     ans  =
    
        0.
    
    --> BLUE
     ans  =
    
        1.
    
    --> GREEN
     ans  =
    
        2.
    
    

    39.3.6 Pointers

    Pointers are supported by SWIG. A pointer can be returned from a wrapped C/C++ function, stored in a Scilab variable, and used in input argument of another C/C++ function.

    Also, thanks to the SWIG runtime which stores informations about types, pointer types are tracked between exchanges Scilab and the native code. Indeed pointer types are stored alongside the pointer adress. A pointer is mapped to a Scilab structure (tlist), which contains as fields the pointer address and the pointer type (in fact a pointer to the type information structure in the SWIG runtime).
    Why a native pointer is not mapped to a Scilab pointer (type name: "pointer", type ID: 128) ? The big advantage of mapping to a tlist is that it exposes a new type for the pointer in Scilab, type which can be acessed in Scilab with the typeof function, and manipulated using the overloading mechanism.

    Notes:

    • type tracking needs the SWIG runtime to be first initialized with the appropriate function (see the Module initialization section).
    • for any reason, if a wrapped pointer type is unknown (or if the SWIG runtime is not initialized), SWIG maps it to a Scilab pointer. Also, a Scilab pointer is always accepted as a pointer argument of a wrapped function. The drawaback is that pointer type is lost.

    Following is an example of the wrapping of the C FILE* pointer:

    %module example
    
    %{
    #include <stdio.h>
    %}
    
    FILE *fopen(const char *filename, const char *mode);
    int fputs(const char *, FILE *);
    int fclose(FILE *);
    

    These functions can be used the same way as in C from Scilab:

    --> example_Init();
    
    --> f = fopen("junk", "w");
    --> typeof(f)
     ans  =
    
      _p_FILE
    
    --> fputs("Hello World", f);
    --> fclose(f);
    

    Note: the type name _p_FILE which means "pointer to FILE".

    The user of a pointer is responsible for freeing it or, like in the example, closing any resources associated with it (just as is required in a C program).

    39.3.6.1 Utility functions

    As a scripting language, Scilab does not provide functions to manipulate pointers. However, in some cases it can be useful, such as for testing or debugging.

    SWIG comes with two pointer utility functions:

    • SWIG_this(): returns the address value of a pointer
    • SWIG_ptr(): creates a pointer from an address value

    Note: a pointer created by SWIG_ptr() does not have any type and is mapped as a Scilab pointer.

    Following we use the utility functions on the previous example:

    --> f = fopen("junk", "w");
    --> fputs("Hello", f);
    --> addr = SWIG_this(f)
     ans  =
    
        8219088.
    
    --> p = SWIG_ptr(addr);
    --> typeof(p)
    ans  =
    
      pointer
    
    --> fputs(" World", p);
    --> fclose(f);
    

    39.3.6.2 Null pointers:

    Using the previous SWIG_this() and SWIG_ptr(), it is possible to create and check null pointers:

    --> p = SWIG_ptr(0);
    --> SWIG_this(p) == 0
     ans  =
    
        T
    

    39.3.7 Structures

    Structs exist in Scilab, but C structs are not (at least in this version of SWIG) mapped to Scilab structs. A C structure is wrapped through low-level accessor functions, i.e. functions that give access to the member variables of this structure. In Scilab, a structure is manipulated through a pointer which is passed as an argument to the accessor functions.

    Let's see it on an example of a struct with two members:

    %module example
    
    %inline %{
    
    typedef struct {
        int x;
        int arr[4];
    } Foo;
    
    %}
    

    Several functions are generated:

    • a constructor function new_Foo() which returns a pointer to a newly created struct Foo.
    • two member getter functions Foo_x_get(), Foo_arr_get(), to get the values of x and y for the struct pointer (provided as the first parameter to these functions)
    • two member setter functions Foo_x_set(), Foo_arr_set(), to set the values of x and y for the struct pointer (provided as the first parameter to these functions).
    • a destructor function delete_Foo() to release the struct pointer.

    Usage example:

    --> f = new_Foo();
    --> Foo_x_set(f, 100);
    --> Foo_x_get(f)
    ans  =
    
        100.
    
    --> Foo_arr_set(f, [0:3]);
    --> Foo_arr_get(f)
    ans  =
    
        0.    1.    2.    3.
    
    --> delete_Foo(f);
    

    Members of a structure that are also structures are also accepted and wrapped as a pointer:

    %module example
    
    %inline %{
    
    typedef struct {
      int x;
    } Bar;
    
    typedef struct {
      Bar b;
    } Foo;
    
    %}
    

    --> b = new_Bar();
    --> Bar_x_set(b, 20.);
    
    --> f = new_Foo();
    --> Foo_b_set(f, b);
    
    --> b2 = Foo_b_get(f);
    --> Bar_x_get(b2);
    ans  =
    
        20.
    

    Note: the pointer to the struct works as described in Pointers. For example, the type of the struct pointer can be get with typeof, as following:

    --> example_Init();
    --> b = new_Bar();
    --> typeof(b)
     ans  =
    
        _p_Bar
    --> delete_Bar(b);
    

    39.3.8 C++ classes

    Classes do not exist in Scilab. The classes are wrapped the same way as structs. Low-level accessor functions are generated for class members. Also, constructor and destructor functions are generated to create and destroy an instance of the class.

    For example, the following class:

    %module example
    
    %inline %{
    
    class Point {
    public:
      int x, y;
      Point(int _x, int _y) : x(_x), y(_y) {}
      double distance(const Point& rhs) {
        return sqrt(pow(x-rhs.x, 2) + pow(y-rhs.y, 2));
      }
      void set(int _x, int _y) {
        x=_x;
        y=_y;
      }
    };
    
    %}
    

    can be used in Scilab like this:

    --> p1 = Point_new(3, 5);
    --> p2 = Point_new(1, 2);
    --> p1.distance(p2)
    ans  =
    
        3.6056
    
    --> delete_Point(p1);
    --> delete_Point(p2);
    

    Note: like structs, class pointers are mapped as described in Pointers. Let's give an example which shows that each class pointer type is a new type in Scilab that can be used for example (through overloading) to implement a custom print for the Point class:

    --> function %_p_Point_p(p)
    -->     mprintf('[%d, %d]\n', Point_x_get(p), Point_y_get(p));
    --> endfunction
    
    --> example_Init();
    --> p = new_Point(1, 2)
     p  =
    
    [1, 2]
    
    --> delete_Point(p);
    

    39.3.9 C++ inheritance

    Inheritance is supported. SWIG knows the inheritance relationship between classes.

    A function is only generated for the class in which it is actually declared. But if one of its parameters is a class, any instance of a derived class is accepted as the argument.

    This mechanism also applies for accessor functions: they are generated only in the class in which they are defined. But any instance of a derived class can be used as the argument to these accessor functions.

    For example, let's take a base class Shape and two derived classes Circle and Square:

    %module example
    
    %inline %{
    
    class Shape {
    public:
      double x, y;
      void set_location(double _x, double _y) { x = _x; y = _y; }
      virtual double get_perimeter() { return 0; };
    };
    
    class Circle : public Shape {
    public:
      int radius;
      Circle(int _radius): radius(_radius) {};
      virtual double get_perimeter() { return 6.28 * radius; }
    };
    
    class Square : public Shape {
    public:
      int size;
      Square(int _size): size(_size) {};
      virtual double get_perimeter() { return 4 * size; }
    };
    
    %}
    

    To set the location of the Circle, we have to use the function set_location() of the parent Shape. But we can use either use the get_perimeter() function of the parent class or the derived class:

    --> c = new_Circle(3);
    
    --> Shape_set_location(c, 2, 3);
    --> Shape_x_get(c)
     ans  =
    
        2.
    
    --> Circle_get_perimeter(c)
     ans  =
    
        18.84
    
    --> Shape_get_perimeter(c)
     ans  =
    
        18.84
    

    39.3.10 C++ overloading

    As explained in 6.15 SWIG provides support for overloaded functions and constructors.

    As SWIG knows pointer types, the overloading works also with pointer types, here is is an example with a function magnify overloaded for the previous classes Shape and Circle:

    %module example
    
    void magnify(Square *square, double factor) {
        square->size *= factor;
    };
    
    void magnify(Circle *circle, double factor) {
        square->radius *= factor;
    };
    
    --> example_Init();
    --> c = new_Circle(3);
    --> s = new_Square(2);
    
    --> magnify(c, 10);
    --> Circle_get_radius(c)
     ans  =
    
       30;
    --> magnify(s, 10);
    --> Square_get_size(s)
     ans  =
    
       20;
    

    39.3.11 Pointers, references, values, and arrays

    In C++ objects can be passed by value, pointer, reference, or by an array:

    %module example
    
    %{
    #include <sciprint.h>
    %}
    
    %inline %{
    
    class Foo {
    public:
      Foo(int _x) : x(_x) {}
      int x;
    };
    
    void spam1(Foo *f)  { sciprint("%d\n", f->x); }   // Pass by pointer
    void spam2(Foo &f)  { sciprint("%d\n", f.x); }    // Pass by reference
    void spam3(Foo f)   { sciprint("%d\n", f.x); }    // Pass by value
    void spam4(Foo f[]) { sciprint("%d\n", f[0].x); } // Array of objects
    
    %}
    

    In SWIG, there is no real distinction between these. So in Scilab, it is perfectly legal to do this:

    --> f = new_Foo()
    --> spam1(f)
    3
    --> spam2(f)
    3
    --> spam3(f)
    3
    --> spam4(f)
    3
    

    Similar behaviour occurs for return values. For example, if you had functions like this:

    Foo *spam5();
    Foo &spam6();
    Foo  spam7();
    

    All these functions will return a pointer to an instance of Foo. As the function spam7 returns a value, new instance of Foo has to be allocated, and a pointer on this instance is returned.

    39.3.12 C++ templates

    As in other languages, function and class templates are supported in SWIG Scilab.

    You have to tell SWIG to create wrappers for a particular template instantiation. The %template directive is used for this purpose. For example:

    %module example
    
    template<class T1, class T2, class T3>
    struct triplet {
      T1 first;
      T2 second;
      T3 third;
      triplet(const T1& a, const T2& b, const T3& c) {
        third = a; second = b; third = c;
      }
    };
    
    %template(IntTriplet) triplet<int, int, int>;
    

    Then in Scilab:

    --> t = new_IntTriplet(3, 4, 1);
    
    --> IntTriplet_first_get(t)
     ans  =
    
        3.
    
    --> IntTriplet_second_get(t)
     ans  =
    
        4.
    
    --> IntTriplet_third_get(t)
     ans  =
    
        1.
    
    --> delete_IntTriplet(t);
    

    More details on template support can be found in the templates documentation.

    39.3.13 C++ operators

    C++ operators are partially supported. Operator overloading exists in Scilab, but a C++ operator is not (in this version) wrapped by SWIG as a Scilab operator, but as a function. It is not automatic, you have to rename each operator (with the instruction %rename) with the suitable wrapper name.

    Let's see it with an example of class with two operators + and double():

    %module example
    
    %rename(plus) operator +;
    %rename(toDouble) operator double();
    
    %inline %{
    
    class Complex {
    public:
      Complex(double re, double im) : real(re), imag(im) {};
    
      Complex operator+(const Complex& other) {
        double result_real = real + other.real;
        double result_imaginary = imag + other.imag;
        return Complex(result_real, result_imaginary);
      }
      operator double() { return real; }
    private:
      double real;
      double imag;
    };
    
    %}
    

    --> c1 = new_Complex(3, 7);
    
    --> c2 = Complex_plus(c, new_Complex(1, 1));
    
    --> Complex_toDouble(c2)
     ans  =
    
        4.
    

    39.3.14 C++ namespaces

    SWIG is aware of C++ namespaces, but does not use it for wrappers. The module is not broken into submodules, nor do namespace appear in functions names. All the namespaces are all flattened in the module. For example with one namespace Foo:

    %module example
    
    %inline %{
    
    namespace foo {
      int fact(int n) {
        if (n > 1)
          return n * fact(n-1);
        else
          return 1;
      }
    
      struct Vector {
        double x, y, z;
      };
    };
    
    %}
    
    

    In Scilab, there is no need to the specify the Foo namespace:

    --> fact(3)
     ans  =
    
       6.
    
    --> v = new_Vector();
    --> Vector_x_set(v, 3.4);
    --> Vector_y_get(v)
     ans  =
    
       0.
    

    If your program has more than one namespace, name conflicts can be resolved using %rename. For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }
    

    Note: the nspace feature is not supported.

    39.3.15 C++ exceptions

    Scilab does not natively support exceptions, but has errors. When an exception is thrown, SWIG catches it, and sets a Scilab error. An error message is displayed in Scilab. For example:

    %module example
    
    %inline %{
    void throw_exception() throw(char const *) {
      throw "Bye world !";
    }
    %}
    

    -->throw_exception()
      !--error 999
    SWIG/Scilab: Exception (char const *) occured: Bye world !
    

    Scilab has a try-catch mechanism (and a similar instruction execstr()) to handle exceptions. It can be used with the lasterror() function as following:

    --> execstr('throw_exception()', 'errcatch');
     ans  =
    
        999.
    
    --> lasterror()
     ans  =
    
        SWIG/Scilab: Exception (char const *) occured: Bye world !
    

    If the function has a throw exception specification, SWIG can automatically map the exception type and set an appropriate Scilab error message. It works for a few primitive types, and also for STL exceptions (the library std_except.i has to be included to get the STL exception support):

    %module example
    
    %include <std_except.i>
    
    %inline %{
    void throw_int() throw(int) {
      throw 12;
    }
    
    void throw_stl_invalid_arg(int i) throw(std::invalid_argument) {
      if (i < 0)
        throw std::invalid_argument("argument is negative.");
    }
    %}
    

    --> throw_int();
                !--error 999
    SWIG/Scilab: Exception (int) occured: 12
    
    -->throw_stl_invalid_arg(-1);
                              !--error 999
    SWIG/Scilab: ValueError: argument is negative.
    

    More complex or custom exception types require specific exception typemaps to be implemented in order to specifically handle a thrown type. See the SWIG C++ documentation for more details.

    39.3.16 C++ STL

    The Standard Template Library (STL) is partially supported. See STL for more details.

    39.4 Type mappings and libraries

    39.4.1 Default primitive type mappings

    The following table provides the equivalent Scilab type for C/C++ primitive types.

    C/C++ type Scilab type
    boolboolean
    charstring
    signed chardouble or int8
    unsigned chardouble or uint8
    shortdouble or int16
    unsigned shortdouble or uint16
    intdouble or int32
    unsigned intdouble or uint32
    longdouble or int32
    unsigned longdouble or uint32
    signed long longnot supported in Scilab 5.x
    unsigned long longnot supported in Scilab 5.x
    floatdouble
    doubledouble
    char * or char[]string

    Notes:

    • In Scilab the double type is far more used than any integer type. This is why integer values (int32, uint32, ...) are automatically converted to Scilab double values when marshalled from C into Scilab. Additionally on input to a C function, Scilab double values are converted into the related integer type.
    • When an integer is expected, if the input is a double, the value must be an integer, i.e. it must not have any decimal part, otherwise a SWIG value error occurs.
    • In SWIG for Scilab 5.x, the long long type is not supported, since Scilab 5.x does not have a 64-bit integer type. The default behaviour is for SWIG to generate code that will give a runtime error if long long type arguments are used from Scilab.

    39.4.2 Arrays

    Typemaps are available by default for arrays. Primitive type arrays are automatically converted to/from Scilab matrices. Typemaps are also provided to handle members of a struct or class that are arrays.

    In input, the matrix is usually one-dimensional (it can be either a row or column vector). But it can also be a two-dimensional matrix. Warning: in Scilab, the values are column-major ordered, unlike in C, which is row-major ordered.

    The type mappings used for arrays is the same for primitive types, described earlier. This means that, if needed, a Scilab double vector is converted in input into the related C integer array and this C integer array is automatically converted on output into a Scilab double vector. Note that unlike scalars, no control is done for arrays when a double is converted into an integer.

    The following example illustrates all this:

    %module example
    
    %#include <stdio.h>
    
    %inline %{
    
    void printArray(int values[], int len) {
      int i = 0;
      for (i = 0; i < len; i++) {
        printf("%s %d %s", i==0?"[":"", values[i], i==len-1?"]\n":"");
      }
    }
    %}
    

    --> printArray([0 1 2 3], 4)
    [ 0  1  2  3 ]
    
    --> printArray([0.2; -1.8; 2; 3.7], 4)
    [ 0  -1  2  3 ]
    
    --> printArray([0 1; 2 3], 4)
    [ 0  2  1  3 ]
    
    --> printArray([0; 1; 2; 3], 4)
    [ 0  1  2  3 ]
    

    39.4.3 Pointer-to-pointers

    There are no specific typemaps for pointer-to-pointers, they are are mapped as pointers in Scilab.

    Pointer-to-pointers are sometimes used to implement matrices in C. The following is a an example of this:

    %module example
    %inline %{
    
    // Returns the matrix [1 2; 3 4];
    double **create_matrix() {
      double **M;
      int i;
      M = (double **) malloc(2 * sizeof(double *));
      for (i = 0; i < 2; i++) {
        M[i] = (double *) malloc(2 * sizeof(double));
        M[i][0] = 2 * i + 1;
        M[i][1] = 2 * i + 2;
      }
      return M;
    }
    
    // Gets the item M(i, j) value
    double get_matrix(double **M, int i, int j) {
      return M[i][j];
    }
    
    // Sets the item M(i, j) value to be val
    void set_matrix(double **M, int i, int j, double val) {
      M[i][j] = val;
    }
    
    // Prints a matrix (2, 2) to console
    void print_matrix(double **M, int nbRows, int nbCols) {
      int i, j;
      for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
          printf("%3g ", M[i][j]);
        }
        printf("\n");
      }
    }
    
    %}
    

    These functions are used like this in Scilab:

    --> m = create_matrix();
    
    --> print_matrix(m);
       1.   2.
       3.   4.
    
    --> set_matrix(m, 1, 1, 5.);
    
    --> get_matrix(m, 1, 1)
     ans  =
    
        5.
    

    39.4.4 Matrices

    The matrix.i library provides a set of typemaps which can be useful when working with one-dimensional and two-dimensional matrices.

    In order to use this library, just include it in the interface file:

      %include <matrix.i>
    

    Several typemaps are available for the common Scilab matrix types:

    • double
    • int
    • char *
    • bool

    For example: for a matrix of int, we have the typemaps, for input:

    • (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT)
    • (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN)
    • (int *IN, int IN_SIZE)
    • (int IN_SIZE, int *IN)

    and output:

    • (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT)
    • (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT)
    • (int **OUT, int *OUT_SIZE)
    • (int *OUT_SIZE, int **OUT)

    They marshall a Scilab matrix type into the appropriate 2 or 3 C parameters. The following is an example using the typemaps in this library:

    %module example
    
    %include <matrix.i>
    
    %apply (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { (int *matrix, int matrixNbRow, int matrixNbCol) };
    %apply (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { (int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) };
    
    %inline %{
    
    void absolute(int *matrix, int matrixNbRow, int matrixNbCol,
      int **outMatrix, int *outMatrixNbRow, int *outMatrixNbCol) {
      int i, j;
      *outMatrixNbRow = matrixNbRow;
      *outMatrixNbCol = matrixNbCol;
      *outMatrix = malloc(matrixNbRow * matrixNbCol * sizeof(int));
      for (i=0; i < matrixNbRow * matrixNbCol; i++) {
        (*outMatrix)[i] = matrix[i] > 0 ? matrix[i]:-matrix[i];
      }
    }
    
    %}
    

    --> absolute([-0 1 -2; 3 4 -5])
     ans  =
    
        0.    1.    2.
        3.    4.    5.
    

    The remarks made earlier for arrays also apply here:

    • The values of matrices in Scilab are column-major orderered,
    • There is no control while converting double values to integers, double values are truncated without any checking or warning.

    39.4.5 STL

    The STL library wraps some containers defined in the STL (Standard Template Library), so that they can be manipulated in Scilab. This library also provides the appropriate typemaps to use the containers in functions and variables.

    The list of wrapped sequence containers are:

    • std::vector
    • std::list
    • std::deque

    And associative containers are:

    • std::set
    • std::multiset

    Typemaps are available for the following container types:

    • double
    • float
    • int
    • string
    • bool
    • pointer

    Containers of other item types are not supported. Using them does not break compilation, but provokes a runtime error. Containers of enum are not supported yet.

    In order to use the STL, the library must first be included in the SWIG interface file:

    %include <stl.i>
    

    Then for each container used, the appropriate template must be instantiated, in the std namespace:

    namespace std {
        %template(IntVector)    vector<int>;
        %template(DoubleVector) vector<double>;
    }
    

    Additionally, the module initialization function has to be executed first in Scilab, so that all the types are known to Scilab. See the Module initialization section for more details.

    Because in Scilab matrices exist for basic types only, a sequence container of pointers is mapped to a Scilab list. For other item types (double, int, string...) the sequence container is mapped to a Scilab matrix.

    The first example below shows how to create a vector (of int) in Scilab, add some values to the vector and pass it as an argument of a function. It also shows, thanks to the typemaps, that we can also pass a Scilab matrix of values directly into the function:

    %module example
    
    %include <stl.i>
    
    namespace std {
      %template(IntVector) vector<int>;
    }
    
    %{
    #include <numeric>
    %}
    
    %inline %{
    
    double average(std::vector<int> v) {
      return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
    }
    
    %}
    

    --> example_Init();
    
    --> v = new_IntVector();
    
    --> for i = 1:4
    -->     IntVector_push_back(v, i);
    --> end;
    
    --> average(v)
     ans  =
    
        2.5
    
    --> average([0 1 2 3])
     ans  =
    
        2.5
    
    --> delete_IntVector();
    

    In the second example, a set of struct (Person) is wrapped. A function performs a search in this set, and returns a subset. As one can see, the result in Scilab is a list of pointers:

    %module example
    
    %include <stl.i>
    
    %{
    #include <string>
    %}
    
    %inline %{
    
    struct Person {
      Person(std::string _name, int _age) : name(_name), age(_age) {};
      std::string name;
      int age;
    };
    typedef Person * PersonPtr;
    
    %}
    
    namespace std {
      %template(PersonPtrSet) set<PersonPtr>;
    }
    
    %inline %{
    
    std::set<PersonPtr> findPersonsByAge(std::set<PersonPtr> persons, int minAge, int maxAge) {
      std::set<PersonPtr> foundPersons;
      for (std::set<PersonPtr>::iterator it = persons.begin(); it != persons.end(); it++) {
        if (((*it)->age >= minAge) && ((*it)->age <= maxAge)) {
          foundPersons.insert(*it);
        }
      }
      return foundPersons;
    }
    
    %}
    

    --> example_Init();
    
    --> joe = new_Person("Joe", 25);
    --> susan = new_Person("Susan", 32);
    --> bill = new_Person("Bill", 50);
    
    --> p = new_PersonPtrSet();
    --> PersonPtrSet_insert(p, susan);
    --> PersonPtrSet_insert(p, joe);
    --> PersonPtrSet_insert(p, bill);
    
    --> l = findPersonsByAge(p, 20, 40);
    
    --> size(l)
     ans  =
    
        2.
    
    --> Person_name_get(l(1))
    ans  =
    
        Susan
    
    --> Person_name_get(l(2))
     ans  =
    
        Joe
    
    --> delete_PersonPtrSet(p);
    

    39.5 Module initialization

    The wrapped module contains an initialization function to:

    • initialize the SWIG runtime, needed for pointer type tracking or when working with the STL
    • initialize the module constants and enumerations declared with %scilabconst()

    This initialization function should be executed at the start of a script, before the wrapped library has to be used.

    The function has the name of the module suffixed by _Init. For example, to initialize the module example:

    --> example_Init();
    

    39.6 Building modes

    The mechanism to load an external module in Scilab is called Dynamic Link and works with dynamic modules (or shared libraries, .so files).

    To produce a dynamic module, when generating the wrapper, there are two possibilities, or build modes:

    • the nobuilder mode, this is the default mode in SWIG. The user is responsible of the build.
    • the builder mode. In this mode, Scilab is responsible of building.

    39.6.1 No-builder mode

    In this mode, used by default, SWIG generates the wrapper sources, which have to be manually compiled and linked. A loader script loader.sce is also produced, this one is executed further in Scilab to load the module.

    This mode is the best option to use when you have to integrate the module build into a larger build process.

    39.6.2 Builder mode

    In this mode, in addition to the wrapper sources, SWIG produces a builder Scilab script (builder.sce), which is executed in Scilab to build the module. In a few words, the Scilab ilib_build() command is used, which produces the shared library file, and the loader script loader.sce (and also a cleaner script cleaner.sce).

    An advantage of this mode is that it hides all the complexity of the build and other platform issues. Also it allows the module to conform to a Scilab external module convention which is that an external module should be simply built by calling a builder script.

    The builder mode is activated with the -builder SWIG option. In this mode, the following SWIG options may be used to setup the build:

    • -buildersources: to add sources to the build (several files must be separated by a comma)
    • -buildercflags: to add flags to the builder compiler flags, for example to set library dependencies include paths
    • -builderldflags: to add flags to the linker flags, for example to set library dependency names and paths

    Let's give an example how to build a module example, composed of two sources, and using a library dependency:

    • the sources are baa1.c and baa2.c (and are stored in in the current directory)
    • the library is libfoo in /opt/foo (headers stored in /opt/foo/include, and shared library in /opt/foo/lib)

    The command is:

    $ swig -scilab -builder -buildercflags -I/opt/foo/include -builderldflags "-L/opt/foo/lib -lfoo" -buildersources baa1.cxx, baa2.cxx example.i
    

    39.7 Generated scripts

    In this part we give some details about the generated Scilab scripts.

    39.7.1 Builder script

    builder.sce is the name of the builder script generated by SWIG in builder mode. It contains code like this:

    ilib_name = "examplelib";
    files = ["example_wrap.c"];
    libs = [];
    table = ["fact", "_wrap_fact";"Foo_set", "_wrap_Foo_set";"Foo_get", "_wrap_Foo_get";];
    ilib_build(ilib_name, table, files, libs);
    

    ilib_build(lib_name, table, files, libs) is used to create shared libraries, and to generate a loader file used to dynamically load the shared library into Scilab.

    • ilib_name: a character string, the generic name of the library without path and extension.
    • files: string matrix containing objects files needed for shared library creation.
    • libs: string matrix containing extra libraries needed for shared library creation.
    • table: two column string matrix containing a table of pairs of 'scilab function name', 'C function name'.

    39.7.2 Loader script

    The loader script is used to load in Scilab all the module functions. When loaded, these functions can be used as other Scilab functions.

    The loader script loader.sce contains code similar to:

    // ------------------------------------------------------
    // generated by builder.sce: Please do not edit this file
    // ------------------------------------------------------
    
    libexamplelib_path = get_file_path('loader.sce');
    list_functions = [             'fact';
                'Foo_set';
                'Foo_get';
    ];
    addinter(libexamplelib_path+'/libexamplelib.so', 'libexamplelib', list_functions);
    // remove temp. variables on stack
    clear libexamplelib_path;
    clear list_functions;
    clear get_file_path;
    // ------------------------------------------------------
    

    addinter(files, spname, fcts) performs dynamic linking of a compiled C interface function.

    • files: a character string or a vector of character strings defining the object files (containing the C interface functions) to link with.
    • spname: a character string. Name of interface routine entry point.
    • fcts: vector of character strings. The name of new Scilab function.

    39.8 Other resources

    • Example use cases can be found in the Examples/scilab directory.
    • The test suite in the Examples/test-suite/scilab can be another source of useful use cases.
    • The Scilab API is used in the generated code and is a useful reference when examining the output.
    • This guide describes the Scilab external modules structure and files, in particular the files that are generated by SWIG for Scilab.
    swig-3.0.12/Doc/Manual/style.css0000664000175000017500000000275213042756442016237 0ustar williamwilliamdiv.sectiontoc { border-style: dotted; border-width: 2px; padding: 2pt; } h2 { padding: 3px; color: #000000; border-bottom: 2px solid #dddddd; } h3, h4 { margin-left: 1em; } p,li,table,dl { margin-left: 2em; margin-right: 2em; } div.indent { margin-left: 4em; margin-right: 4em; } div.code { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #F0FFFF; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.targetlang { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #d7f6bb; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.shell { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #DCDCDC; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } div.diagram { border-style: solid; border-width: 1px; padding: 2pt; margin-left: 4em; margin-right: 4em; background-color: #FFEBCD; font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } ul li p { margin-left: 0; margin-right: 0; } ol li p { margin-left: 0; margin-right: 0; } dl dd p { margin-left: 0; margin-right: 0; } div.indent p { margin-left: 0; margin-right: 0; } pre, code, tt { font-family: "Courier New", Courier, "Courier 10 Pitch", monospace; } body { font-family: serif; } swig-3.0.12/Doc/Manual/Go.html0000664000175000017500000013142413042756671015623 0ustar williamwilliam SWIG and Go

    23 SWIG and Go

    This chapter describes SWIG's support of Go. For more information on the Go programming language see golang.org.

    23.1 Overview

    Go does not support direct calling of functions written in C/C++. The cgo program may be used to generate wrappers to call C code from Go, but there is no convenient way to call C++ code. SWIG fills this gap.

    There are (at least) two different Go compilers. The first is the gc compiler of the Go distribution, normally invoked via the go tool. The second Go compiler is the gccgo compiler, which is a frontend to the GCC compiler suite. The interface to C/C++ code is completely different for the two Go compilers. SWIG supports both Go compilers, selected by the -gccgo command line option.

    Go is a type-safe compiled language and the wrapper code generated by SWIG is type-safe as well. In case of type issues the build will fail and hence SWIG's runtime library and runtime type checking are not used.

    23.2 Examples

    Working examples can be found in the SWIG source tree .

    Please note that the examples in the SWIG source tree use makefiles with the .i SWIG interface file extension for backwards compatibility with Go 1.

    23.3 Running SWIG with Go

    Most Go programs are built using the go tool. Since Go 1.1 the go tool has support for SWIG. To use it, give your SWIG interface file the extension .swig (for C code) or .swigcxx (for C++ code). Put that file in a GOPATH/src directory as usual for Go sources. Put other C/C++ code in the same directory with extensions of .c and .cxx. The go build and go install commands will automatically run SWIG for you and compile the generated wrapper code. To check the SWIG command line options the go tool uses run go build -x. To access the automatically generated files run go build -work. You'll find the files under the temporary WORK directory.

    To manually generate and compile C/C++ wrapper code for Go, use the -go option with SWIG. By default SWIG will generate code for the Go compiler of the Go distribution. To generate code for gccgo, you should also use the -gccgo option.

    When using the -cgo option, SWIG will generate files that can be used directly by go build. Starting with the Go 1.5 distribution the -cgo option has to be given. Put your SWIG interface file in a directory under GOPATH/src, and give it a name that does not end in the .swig or .swigcxx extension. Typically the SWIG interface file extension is .i in this case.

    % swig -go -cgo example.i
    % go install
    

    You will now have a Go package that you can import from other Go packages as usual.

    To use SWIG without the -cgo option, more steps are required. Recall that this only works with Go versions before 1.5. When using Go version 1.2 or later, or when using gccgo, the code generated by SWIG can be linked directly into the Go program. A typical command sequence when using the Go compiler of the Go distribution would look like this:

    % swig -go example.i
    % gcc -c code.c    # The C library being wrapped.
    % gcc -c example_wrap.c
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
    % go tool 6g main.go
    % go tool 6l main.6
    

    You can also put the wrapped code into a shared library, and when using the Go versions before 1.2 this is the only supported option. A typical command sequence for this approach would look like this:

    % swig -go -use-shlib example.i
    % gcc -c -fpic example.c
    % gcc -c -fpic example_wrap.c
    % gcc -shared example.o example_wrap.o -o example.so
    % go tool 6g example.go
    % go tool 6c example_gc.c
    % go tool pack grc example.a example.6 example_gc.6
    % go tool 6g main.go  # your code, not generated by SWIG
    % go tool 6l main.6
    

    23.3.1 Go-specific Commandline Options

    These are the command line options for SWIG's Go module. They can also be seen by using:

    swig -go -help
    
    Go-specific options
    -cgo Generate files to be used as input for the Go cgo tool. This option is required for Go 1.5 and later, and works for Go 1.2 and later. In the future this option will likely become the default.
    -intgosize <s> Set the size for the Go type int. This controls the size that the C/C++ code expects to see. The <s> argument should be 32 or 64. This option is currently required during the transition from Go 1.0 to Go 1.1, as the size of int on 64-bit x86 systems changes between those releases (from 32 bits to 64 bits). In the future the option may become optional, and SWIG will assume that the size of int is the size of a C pointer.
    -gccgo Generate code for gccgo. The default is to generate code for the Go compiler of the Go distribution.
    -package <name> Set the name of the Go package to <name>. The default package name is the SWIG module name.
    -use-shlib Tell SWIG to emit code that uses a shared library. This is only meaningful for the Go compiler of the Go distribution, which needs to know at compile time whether a shared library will be used.
    -soname <name> Set the runtime name of the shared library that the dynamic linker should include at runtime. The default is the package name with ".so" appended. This is only used when generating code for the Go compiler of the Go distribution; when using gccgo, the equivalent name will be taken from the -soname option passed to the linker. Using this option implies the -use-shlib option.
    -go-pkgpath <pkgpath> When generating code for gccgo, set the pkgpath to use. This corresponds to the -fgo-pkgpath option to gccgo.
    -go-prefix <prefix> When generating code for gccgo, set the prefix to use. This corresponds to the -fgo-prefix option to gccgo. If -go-pkgpath is used, -go-prefix will be ignored.

    23.3.2 Generated Wrapper Files

    There are two different approaches to generating wrapper files, controlled by SWIG's -cgo option. The -cgo option works with Go version 1.2 or later. It is required when using Go version 1.5 or later.

    With or without the -cgo option, SWIG will generate the following files when generating wrapper code:

    • MODULE.go will contain the Go functions that your Go code will call. These functions will be wrappers for the C++ functions defined by your module. This file should, of course, be compiled with the Go compiler.
    • MODULE_wrap.c or MODULE_wrap.cxx will contain C/C++ functions will be invoked by the Go wrapper code. This file should be compiled with the usual C or C++ compiler.
    • MODULE_wrap.h will be generated if you use the directors feature. It provides a definition of the generated C++ director classes. It is generally not necessary to use this file, but in some special cases it may be helpful to include it in your code, compiled with the usual C or C++ compiler.

    When neither the -cgo nor the -gccgo option is used, SWIG will also generate an additional file:

    • MODULE_gc.c will contain C code which should be compiled with the C compiler distributed as part of the gc compiler. It should then be combined with the compiled MODULE.go using go tool pack.

    23.4 A tour of basic C/C++ wrapping

    By default, SWIG attempts to build a natural Go interface to your C/C++ code. However, the languages are somewhat different, so some modifications have to occur. This section briefly covers the essential aspects of this wrapping.

    23.4.1 Go Package Name

    All Go source code lives in a package. The name of this package will default to the name of the module from SWIG's %module directive. You may override this by using SWIG's -package command line option.

    23.4.2 Go Names

    In Go, a function is only visible outside the current package if the first letter of the name is uppercase. This is quite different from C/C++. Because of this, C/C++ names are modified when generating the Go interface: the first letter is forced to be uppercase if it is not already. This affects the names of functions, methods, variables, constants, enums, and classes.

    C/C++ variables are wrapped with setter and getter functions in Go. First the first letter of the variable name will be forced to uppercase, and then Get or Set will be prepended. For example, if the C/C++ variable is called var, then SWIG will define the functions GetVar and SetVar. If a variable is declared as const, or if SWIG's %immutable directive is used for the variable, then only the getter will be defined.

    C++ classes will be discussed further below. Here we'll note that the first letter of the class name will be forced to uppercase to give the name of a type in Go. A constructor will be named New followed by that name, and the destructor will be named Delete followed by that name.

    23.4.3 Go Constants

    C/C++ constants created via #define or the %constant directive become Go constants, declared with a const declaration.

    23.4.4 Go Enumerations

    C/C++ enumeration types will cause SWIG to define an integer type with the name of the enumeration (with first letter forced to uppercase as usual). The values of the enumeration will become variables in Go; code should avoid modifying those variables.

    23.4.5 Go Classes

    Go has interfaces, methods and inheritance, but it does not have classes in the same sense as C++. This sections describes how SWIG represents C++ classes represented in Go.

    For a C++ class ClassName, SWIG will define two types in Go: an underlying type, which will just hold a pointer to the C++ type, and an interface type. The interface type will be named ClassName. SWIG will define a function NewClassName which will take any constructor arguments and return a value of the interface type ClassName. SWIG will also define a destructor DeleteClassName.

    SWIG will represent any methods of the C++ class as methods on the underlying type, and also as methods of the interface type. Thus C++ methods may be invoked directly using the usual val.MethodName syntax. Public members of the C++ class will be given getter and setter functions defined as methods of the class.

    SWIG will represent static methods of C++ classes as ordinary Go functions. SWIG will use names like ClassNameMethodName. SWIG will give static members getter and setter functions with names like GetClassName_VarName.

    Given a value of the interface type, Go code can retrieve the pointer to the C++ type by calling the Swigcptr method. This will return a value of type SwigcptrClassName, which is just a name for uintptr. A Go type conversion can be used to convert this value to a different C++ type, but note that this conversion will not be type checked and is essentially equivalent to reinterpret_cast. This should only be used for very special cases, such as where C++ would use a dynamic_cast.

    Note that C++ pointers to compound objects are represented in go as objects themselves, not as go pointers. So, for example, if you wrap the following function:

    class MyClass {
      int MyMethod();
      static MyClass *MyFactoryFunction();
    };
    
    

    You will get go code that looks like this:

    type MyClass interface {
      Swigcptr() uintptr
      SwigIsMyClass()
      MyMethod() int
    }
    
    func MyClassMyFactoryFunction() MyClass {
      // swig magic here
    }
    

    Note that the factory function does not return a go pointer; it actually returns a go interface. If the returned pointer can be null, you can check for this by calling the Swigcptr() method.

    23.4.5.1 Go Class Memory Management

    Calling NewClassName for a C++ class ClassName will allocate memory using the C++ memory allocator. This memory will not be automatically freed by Go's garbage collector as the object ownership is not tracked. When you are done with the C++ object you must free it using DeleteClassName.

    The most Go idiomatic way to manage the memory for some C++ class is to call NewClassName followed by a defer of the DeleteClassName call. Using defer ensures that the memory of the C++ object is freed as soon as the function containing the defer statement returns. Furthemore defer works great for short-lived objects and fits nicely C++'s RAII idiom. Example:

    func UseClassName(...) ... {
      o := NewClassName(...)
      defer DeleteClassName(o)
      // Use the ClassName object
      return ...
    }
    

    With increasing complexity, especially complex C++ object hierarchies, the correct placement of defer statements becomes harder and harder as C++ objects need to be freed in the correct order. This problem can be eased by keeping a C++ object function local so that it is only available to the function that creates a C++ object and functions called by this function. Example:

    func WithClassName(constructor args, f func(ClassName, ...interface{}) error, data ...interface{}) error {
      o := NewClassName(constructor args)
      defer DeleteClassName(o)
      return f(o, data...)
    }
    
    func UseClassName(o ClassName, data ...interface{}) (err error) {
      // Use the ClassName object and additional data and return error.
    }
    
    func main() {
      WithClassName(constructor args, UseClassName, additional data)
    }
    

    Using defer has limitations though, especially when it comes to long-lived C++ objects whichs lifetimes are hard to predict. For such C++ objects a common technique is to store the C++ object into a Go object, and to use the Go function runtime.SetFinalizer to add a finalizer which frees the C++ object when the Go object is freed. It is strongly recommended to read the runtime.SetFinalizer documentation before using this technique to understand the runtime.SetFinalizer limitations.

    Common pitfalls with runtime.SetFinalizer are:

    • If a hierarchy of C++ objects will be automatically freed by Go finalizers then the Go objects that store the C++ objects need to replicate the hierarchy of the C++ objects to prevent that C++ objects are freed prematurely while other C++ objects still rely on them.
    • The usage of Go finalizers is problematic with C++'s RAII idiom as it isn't predictable when the finalizer will run and this might require a Close or Delete method to be added the Go object that stores a C++ object to mitigate.
    • The Go finalizer function typically runs in a different OS thread which can be problematic with C++ code that uses thread-local storage.

    runtime.SetFinalizer Example:

    import (
      "runtime"
      "wrap" // SWIG generated wrapper code
    )
    
    type GoClassName struct {
      wcn wrap.ClassName
    }
    
    func NewGoClassName() *GoClassName {
      o := &GoClassName{wcn: wrap.NewClassName()}
      runtime.SetFinalizer(o, deleteGoClassName)
      return o
    }
    
    func deleteGoClassName(o *GoClassName) {
      // Runs typically in a different OS thread!
      wrap.DeleteClassName(o.wcn)
      o.wcn = nil
    }
    
    func (o *GoClassName) Close() {
      // If the C++ object has a Close method.
      o.wcn.Close()
    
      // If the GoClassName object is no longer in an usable state.
      runtime.SetFinalizer(o, nil) // Remove finalizer.
      deleteGoClassName() // Free the C++ object.
    }
    

    23.4.5.2 Go Class Inheritance

    C++ class inheritance is automatically represented in Go due to its use of interfaces. The interface for a child class will be a superset of the interface of its parent class. Thus a value of the child class type in Go may be passed to a function which expects the parent class. Doing the reverse will require an explicit type assertion, which will be checked dynamically.

    23.4.6 Go Templates

    In order to use C++ templates in Go, you must tell SWIG to create wrappers for a particular template instantation. To do this, use the %template directive.

    23.4.7 Go Director Classes

    SWIG's director feature permits a Go type to act as the subclass of a C++ class. This is complicated by the fact that C++ and Go define inheritance differently. SWIG normally represents the C++ class inheritance automatically in Go via interfaces but with a Go type representing a subclass of a C++ class some manual work is necessary.

    This subchapter gives a step by step guide how to properly sublass a C++ class with a Go type. In general it is strongly recommended to follow this guide completely to avoid common pitfalls with directors in Go.

    23.4.7.1 Example C++ code

    The step by step guide is based on two example C++ classes. FooBarAbstract is an abstract C++ class and the FooBarCpp class inherits from it. This guide explains how to implement a FooBarGo class similar to the FooBarCpp class.

    FooBarAbstract abstract C++ class:

    class FooBarAbstract
    {
    public:
      FooBarAbstract() {};
      virtual ~FooBarAbstract() {};
    
      std::string FooBar() {
              return this->Foo() + ", " + this->Bar();
      };
    
    protected:
      virtual std::string Foo() {
              return "Foo";
      };
    
      virtual std::string Bar() = 0;
    };
    

    FooBarCpp C++ class:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    Returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    23.4.7.2 Enable director feature

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Second, you must use the %feature("director") directive to tell SWIG which classes should get directors. In the example the FooBarAbstract class needs the director feature enabled so that the FooBarGo class can inherit from it, like this:

    %feature("director") FooBarAbstract;
    

    For a more detailed documentation of the director feature and how to enable or disable it for specific classes and virtual methods see SWIG's Java documentation on directors.

    23.4.7.3 Constructor and destructor

    SWIG creates an additional set of constructor and destructor functions once the director feature has been enabled for a C++ class. NewDirectorClassName allows overriding virtual methods on the new object instance and DeleteDirectorClassName needs to be used to free a director object instance created with NewDirectorClassName. More on overriding virtual methods follows later in this guide under overriding virtual methods.

    The default constructor and destructor functions NewClassName and DeleteClassName can still be used as before so that existing code doesn't break just because the director feature has been enabled for a C++ class. The behavior is undefined if the default and director constructor and destructor functions get mixed and so great care needs to be taken that only one of the constructor and destructor function pairs is used for any object instance. Both constructor functions, the default and the director one, return the same interface type. This makes it potentially hard to know which destructor function, the default or the director one, needs to be called to delete an object instance.

    In theory the DirectorInterface method could be used to determine if an object instance was created via NewDirectorClassName:

    if o.DirectorInterface() != nil {
      DeleteDirectorClassName(o)
    } else {
      DeleteClassName(o)
    }
    

    In practice it is strongly recommended to embed a director object instance in a Go struct so that a director object instance will be represented as a distinct Go type that subclasses a C++ class. For this Go type custom constructor and destructor functions take care of the director constructor and destructor function calls and the resulting Go class will appear to the user as any other SWIG wrapped C++ class. More on properly subclassing a C++ class follows later in this guide under subclass via embedding.

    23.4.7.4 Override virtual methods

    In order to override virtual methods on a C++ class with Go methods the NewDirectorClassName constructor functions receives a DirectorInterface argument. The methods in the DirectorInterface are a subset of the public and protected virtual methods of the C++ class. If the DirectorInterface contains a method with a matching signature to a virtual method of the C++ class then the virtual C++ method will be overwritten with the Go method. As Go doesn't support protected methods all overriden protected virtual C++ methods will be public in Go.

    As an example see part of the FooBarGo class:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      ...
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      ...
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
      ...
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the virtual methods FooBarAbstract::Foo and FooBarAbstract::Bar have been overwritten with Go methods similarly to how the FooBarAbstract virtual methods are overwritten by the FooBarCpp class.

    The DirectorInterface in the example is implemented by the overwrittenMethodsOnFooBarAbstract Go struct type. A pointer to a overwrittenMethodsOnFooBarAbstract struct instance will be given to the NewDirectorFooBarAbstract constructor function. The constructor return value implements the FooBarAbstract interface. overwrittenMethodsOnFooBarAbstract could in theory be any Go type but in practice a struct is used as it typically contains at least a value of the C++ class interface so that the overwritten methods can use the rest of the C++ class. If the FooBarGo class would receive additional constructor arguments then these would also typically be stored in the overwrittenMethodsOnFooBarAbstract struct so that they can be used by the Go methods.

    23.4.7.5 Call base methods

    Often a virtual method will be overwritten to extend the original behavior of the method in the base class. This is also the case for the FooBarCpp::Foo method of the example code:

    virtual std::string Foo() {
      return "C++ " + FooBarAbstract::Foo();
    }
    

    To use base methods the DirectorClassNameMethodName wrapper functions are automatically generated by SWIG for public and protected virtual methods. The FooBarGo.Foo implementation in the example looks like this:

    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide.

    23.4.7.6 Subclass via embedding

    As previously mentioned in this guide the default and director constructor functions return the same interface type. To properly subclass a C++ class with a Go type the director object instance returned by the NewDirectorClassName constructor function should be embedded into a Go struct so that it represents a distinct but compatible type in Go's type system. This Go struct should be private and the constructor and destructor functions should instead work with a public interface type so that the Go class that subclasses a C++ class can be used as a compatible drop in.

    The subclassing part of the FooBarGo class for an example looks like this:

    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb
    
      return &fooBarGo{FooBarAbstract: fb}
    }
    
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    The complete example, including the FooBarGoo class implementation, can be found in the end of the guide. In this part of the example the private fooBarGo struct embeds FooBarAbstract which lets the fooBarGo Go type "inherit" all the methods of the FooBarAbstract C++ class by means of embedding. The public FooBarGo interface type includes the FooBarAbstract interface and hence FooBarGo can be used as a drop in replacement for FooBarAbstract while the reverse isn't possible and would raise a compile time error. Furthemore the constructor and destructor functions NewFooBarGo and DeleteFooBarGo take care of all the director specifics and to the user the class appears as any other SWIG wrapped C++ class.

    23.4.7.7 Memory management with runtime.SetFinalizer

    In general all guidelines for C++ class memory management apply as well to director classes. One often overlooked limitation with runtime.SetFinalizer is that a finalizer doesn't run in case of a cycle and director classes typically have a cycle. The cycle in the FooBarGo class is here:

    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om) // fb.v = om
      om.fb = fb // Backlink causes cycle as fb.v = om!
      ...
    }
    

    In order to be able to use runtime.SetFinalizer nevertheless the finalizer needs to be set on something that isn't in a cycle and that references the director object instance. In the FooBarGo class example the FooBarAbstract director instance can be automatically deleted by setting the finalizer on fooBarGo:

    type fooBarGo struct {
      FooBarAbstract
    }
    
    type overwrittenMethodsOnFooBarAbstract struct {
      fb FooBarAbstract
    }
    
    func NewFooBarGo() FooBarGo {
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    

    Furthermore if runtime.SetFinalizer is in use either the DeleteClassName destructor function needs to be removed or the fooBarGo struct needs additional data to prevent double deletion. Please read the C++ class memory management subchapter before using runtime.SetFinalizer to know all of its gotchas.

    23.4.7.8 Complete FooBarGo example class

    The complete and annotated FooBarGo class looks like this:

    // FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
    // drop in replacement for FooBarAbstract but the reverse causes a compile time
    // error.
    type FooBarGo interface {
      FooBarAbstract
      deleteFooBarAbstract()
      IsFooBarGo()
    }
    
    // Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
    type fooBarGo struct {
      FooBarAbstract
    }
    
    func (fbgs *fooBarGo) deleteFooBarAbstract() {
      DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
    }
    
    // The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
    // This is also how the class hierarchy gets represented by the SWIG generated
    // wrapper code.  For an instance FooBarCpp has the IsFooBarAbstract and
    // IsFooBarCpp methods.
    func (fbgs *fooBarGo) IsFooBarGo() {}
    
    // Go type that defines the DirectorInterface. It contains the Foo and Bar
    // methods that overwrite the respective virtual C++ methods on FooBarAbstract.
    type overwrittenMethodsOnFooBarAbstract struct {
      // Backlink to FooBarAbstract so that the rest of the class can be used by
      // the overridden methods.
      fb FooBarAbstract
    
      // If additional constructor arguments have been given they are typically
      // stored here so that the overriden methods can use them.
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
      // DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
      return "Go " + DirectorFooBarAbstractFoo(om.fb)
    }
    
    func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
      return "Go Bar"
    }
    
    func NewFooBarGo() FooBarGo {
      // Instantiate FooBarAbstract with selected methods overridden.  The methods
      // that will be overwritten are defined on
      // overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
      // respective virtual C++ methods. Furthermore additional constructor
      // arguments will be typically stored in the
      // overwrittenMethodsOnFooBarAbstract struct.
      om := &overwrittenMethodsOnFooBarAbstract{}
      fb := NewDirectorFooBarAbstract(om)
      om.fb = fb // Backlink causes cycle as fb.v = om!
    
      fbgs := &fooBarGo{FooBarAbstract: fb}
      // The memory of the FooBarAbstract director object instance can be
      // automatically freed once the FooBarGo instance is garbage collected by
      // uncommenting the following line.  Please make sure to understand the
      // runtime.SetFinalizer specific gotchas before doing this.  Furthemore
      // DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
      // struct needs additional data to prevent double deletion.
      // runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
      return fbgs
    }
    
    // Recommended to be removed if runtime.SetFinalizer is in use.
    func DeleteFooBarGo(fbg FooBarGo) {
      fbg.deleteFooBarAbstract()
    }
    

    Returned string by the FooBarGo.FooBar method is:

    Go Foo, Go Bar
    

    For comparison the FooBarCpp class looks like this:

    class FooBarCpp : public FooBarAbstract
    {
    protected:
      virtual std::string Foo() {
        return "C++ " + FooBarAbstract::Foo();
      }
    
      virtual std::string Bar() {
        return "C++ Bar";
      }
    };
    

    For comparison the returned string by the FooBarCpp::FooBar method is:

    C++ Foo, C++ Bar
    

    The complete source of this example can be found under SWIG/Examples/go/director/.

    23.4.8 Default Go primitive type mappings

    The following table lists the default type mapping from C/C++ to Go. This table will tell you which Go type to expect for a function which uses a given C/C++ type.

    C/C++ type Go type
    bool bool
    char byte
    signed char int8
    unsigned char byte
    short int16
    unsigned short uint16
    int int
    unsigned int uint
    long int64
    unsigned long uint64
    long long int64
    unsigned long long uint64
    float float32
    double float64
    char *
    char []
    string

    Note that SWIG wraps the C char type as a character. Pointers and arrays of this type are wrapped as strings. The signed char type can be used if you want to treat char as a signed number rather than a character. Also note that all const references to primitive types are treated as if they are passed by value.

    These type mappings are defined by the "gotype" typemap. You may change that typemap, or add new values, to control how C/C++ types are mapped into Go types.

    23.4.9 Output arguments

    Because of limitations in the way output arguments are processed in swig, a function with output arguments will not have multiple return values. Instead, you must pass a pointer into the C++ function to tell it where to store the output value. In go, you supply a slice in the place of the output argument.

    For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters):

    double modf(double x, double *ip);
    

    You could wrap it with SWIG as follows:

    %include <typemaps.i>
    double modf(double x, double *OUTPUT);
    

    or you can use the %apply directive:

    %include <typemaps.i>
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    

    In Go you would use it like this:

    ptr := []float64{0.0}
    fraction := modulename.Modf(5.0, ptr)
    

    Since this is ugly, you may want to wrap the swig-generated API with some additional functions written in go that hide the ugly details.

    There are no char *OUTPUT typemaps. However you can apply the signed char * typemaps instead:

    %include <typemaps.i>
    %apply signed char *OUTPUT {char *output};
    void f(char *output);
    

    23.4.10 Adding additional go code

    Often the APIs generated by swig are not very natural in go, especially if there are output arguments. You can insert additional go wrapping code to add new APIs with %insert(go_wrapper), like this:

    %include <typemaps.i>
    // Change name of what swig generates to Wrapped_modf.  This function will
    // have the following signature in go:
    //   func Wrapped_modf(float64, []float64) float64
    %rename(wrapped_modf) modf(double x, double *ip);
    
    %apply double *OUTPUT { double *ip };
    double modf(double x, double *ip);
    
    %insert(go_wrapper) %{
    
    // The improved go interface to this function, which has two return values,
    // in the more natural go idiom:
    func Modf(x float64) (fracPart float64, intPart float64) {
      ip := []float64{0.0}
      fracPart = Wrapped_modf(x, ip)
      intPart = ip[0]
      return
    }
    
    %}
    

    For classes, since swig generates an interface, you can add additional methods by defining another interface that includes the swig-generated interface. For example,

    %rename(Wrapped_MyClass) MyClass;
    %rename(Wrapped_GetAValue) MyClass::GetAValue(int *x);
    %apply int *OUTPUT { int *x };
    
    class MyClass {
     public:
      MyClass();
      int AFineMethod(const char *arg); // Swig's wrapping is fine for this one.
      bool GetAValue(int *x);
    };
    
    %insert(go_wrapper) %{
    
    type MyClass interface {
      Wrapped_MyClass
      GetAValue() (int, bool)
    }
    
    func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
      ip := []int{0}
      ok := arg.Wrapped_GetAValue(ip)
      return ip[0], ok
    }
    
    %}
    

    Of course, if you have to rewrite most of the methods, instead of just a few, then you might as well define your own struct that includes the swig-wrapped object, instead of adding methods to the swig-generated object.

    If you need to import other go packages, you can do this with %go_import. For example,

    %go_import("fmt", _ "unusedPackage", rp "renamed/package")
    
    %insert(go_wrapper) %{
    
    func foo() {
      fmt.Println("Some string:", rp.GetString())
    }
    
    // Importing the same package twice is permitted,
    // Go code will be generated with only the first instance of the import.
    %go_import("fmt")
    
    %insert(go_wrapper) %{
    
    func bar() {
      fmt.Println("Hello world!")
    }
    
    %}
    

    23.4.11 Go typemaps

    You can use the %typemap directive to modify SWIG's default wrapping behavior for specific C/C++ types. You need to be familiar with the material in the general "Typemaps" chapter. That chapter explains how to define a typemap. This section describes some specific typemaps used for Go.

    In general type conversion code may be written either in C/C++ or in Go. The choice to make normally depends on where memory should be allocated. To allocate memory controlled by the Go garbage collector, write Go code. To allocate memory in the C/C++ heap, write C code.

    Typemap Description
    gotype The Go type to use for a C++ type. This type will appear in the generated Go wrapper function. If this is not defined SWIG will use a default as described above.
    imtype An intermediate Go type used by the "goin", "goout", "godirectorin", and "godirectorout" typemaps. If this typemap is not defined for a C/C++ type, the gotype typemape will be used. This is useful when gotype is best converted to C/C++ using Go code.
    goin Go code to convert from gotype to imtype when calling a C/C++ function. SWIG will then internally convert imtype to a C/C++ type and pass it down. If this is not defined, or is the empty string, no conversion is done.
    in C/C++ code to convert the internally generated C/C++ type, based on imtype, into the C/C++ type that a function call expects. If this is not defined the value will simply be cast to the desired type.
    out C/C++ code to convert the C/C++ type that a function call returns into the internally generated C/C++ type, based on imtype, that will be returned to Go. If this is not defined the value will simply be cast to the desired type.
    goout Go code to convert a value returned from a C/C++ function from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    argout C/C++ code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. This uses the internally generated C/C++ type, based on imtype. This is only useful for a pointer type of some sort. If this is not defined nothing will be done.
    goargout Go code to adjust an argument value when returning from a function. This is called after the real C/C++ function has run. The value will be in imtype. This is only useful for a pointer type of some sort. If this is not defined, or is the empty string, nothing will be done.
    directorin C/C++ code to convert the C/C++ type used to call a director method into the internally generated C/C++ type, based on imtype, that will be passed to Go. If this is not defined the value will simply be cast to the desired type.
    godirectorin Go code to convert a value used to call a director method from imtype to gotype. If this is not defined, or is the empty string, no conversion is done.
    godirectorout Go code to convert a value returned from a director method from gotype to imtype. If this is not defined, or is the empty string, no conversion is done.
    directorout C/C++ code to convert a value returned from a director method from the internally generated C/C++ type, based on imtype, into the type that the method should return If this is not defined the value will simply be cast to the desired type.
    swig-3.0.12/Doc/Manual/swightml.book0000664000175000017500000000243213042756672017077 0ustar williamwilliam#HTMLDOC 1.8.24 -t html -f SWIGDocumentation.html --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --titleimage swig16.png --linkcolor #0000ff --linkstyle underline --size Universal --left 0.50in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=0 --fontsize 10.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --links --no-embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 Sections.html Preface.html Introduction.html Windows.html Scripting.html SWIG.html SWIGPlus.html CPlusPlus11.html Preprocessor.html Library.html Arguments.html Typemaps.html Customization.html Contract.html Varargs.html Warnings.html Modules.html CCache.html Allegrocl.html Android.html CSharp.html Chicken.html D.html Go.html Guile.html Java.html Javascript.html Lisp.html Lua.html Modula3.html Mzscheme.html Ocaml.html Octave.html Perl5.html Php.html Pike.html Python.html R.html Ruby.html Scilab.html Tcl.html Extending.html swig-3.0.12/Doc/Manual/README0000664000175000017500000000152213042756442015237 0ustar williamwilliamThis directory contains the HTML for the SWIG users manual. All of this HTML is hand-written. However, section numbering, indices, and the table of contents are generated automatically by the 'maketoc.py' script. The Makefile has further information on how the various alternative forms of the documentation are generated from the hand-written HTML. There are 4 types of boxes that code or whatever can be inside: -
    ...
    This is for text that shows the output of running commands on the shell. -
    ...
    This is for either C, C++, or SWIG code -
    ...
    This is for code in a target scripting language -
    ...
    This is for text that is not code or a shell The general format is
    whatever here
    
    swig-3.0.12/Doc/Manual/D.html0000664000175000017500000007456713042756671015457 0ustar williamwilliam SWIG and D

    22 SWIG and D

    22.1 Introduction

    From the D Programming Language web site: D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer productivity of modern languages like Ruby and Python. [...] The D language is statically typed and compiles directly to machine code. As such, it is not very surprising that D is able to directly interface with C libraries. Why would a SWIG module for D be needed then in the first place?

    Well, besides the obvious downside that the C header files have to be manually converted to D modules for this to work, there is one major inconvenience with this approach: D code usually is on a higher abstraction level than C, and many of the features that make D interesting are simply not available when dealing with C libraries, requiring you e.g. to manually convert strings between pointers to \0-terminated char arrays and D char arrays, making the algorithms from the D2 standard library unusable with C arrays and data structures, and so on.

    While these issues can be worked around relatively easy by hand-coding a thin wrapper layer around the C library in question, there is another issue where writing wrapper code per hand is not feasible: C++ libraries. D did not support interfacing to C++ in version 1 at all, and even if extern(C++) has been added to D2, the support is still very limited, and a custom wrapper layer is still required in many cases.

    To help addressing these issues, the SWIG C# module has been forked to support D. Is has evolved quite a lot since then, but there are still many similarities, so if you do not find what you are looking for on this page, it might be worth having a look at the chapter on C# (and also on Java, since the C# module was in turn forked from it).

    22.2 Command line invocation

    To activate the D module, pass the -d option to SWIG at the command line. The same standard command line switches as with any other language module are available, plus the following D specific ones:

    -d2

    By default, SWIG generates code for D1/Tango. Use the -d2 flag to target D2/Phobos instead.

    -splitproxy

    By default, SWIG generates two D modules: the proxy module, named like the source module (either specified via the %module directive or via the module command line switch), which contains all the proxy classes, functions, enums, etc., and the intermediary module (named like the proxy module, but suffixed with _im), which contains all the extern(C) function declarations and other private parts only used internally by the proxy module.

    If the split proxy mode is enabled by passing this switch at the command line, all proxy classes and enums are emitted to their own D module instead. The main proxy module only contains free functions and constants in this case.

    -package <pkg>

    By default, the proxy D modules and the intermediary D module are written to the root package. Using this option, you can specify another target package instead.

    -wrapperlibrary <wl>

    The code SWIG generates to dynamically load the C/C++ wrapper layer looks for a library called $module_wrap by default. With this switch, you can override the name of the file the wrapper code loads at runtime (the lib prefix and the suffix for shared libraries are appended automatically, depending on the OS).

    This might especially be useful if you want to invoke SWIG several times on separate modules, but compile the resulting code into a single shared library.

    22.3 Typemaps

    22.3.1 C# <-> D name comparison

    If you already know the SWIG C# module, you might find the following name comparison table useful:

     ctype                  <->  ctype
     imtype                 <->  imtype
     cstype                 <->  dtype
     csin                   <->  din
     csout                  <->  dout
     csdirectorin           <->  ddirectorin
     csdirectorout          <->  ddirectorout
     csinterfaces           <->  dinterfaces
     csinterfaces_derived   <->  dinterfaces_derived
     csbase                 <->  dbase
     csclassmodifiers       <->  dclassmodifiers
     cscode                 <->  dcode
     csimports              <->  dimports
     csbody                 <->  dbody
     csfinalize             <->  ddestructor
     csdestruct             <->  ddispose
     csdestruct_derived     <->  ddispose_derived
    

    22.3.2 ctype, imtype, dtype

    Mapping of types between the C/C++ library, the C/C++ library wrapper exposing the C functions, the D wrapper module importing these functions and the D proxy code.

    The ctype typemap is used to determine the types to use in the C wrapper functions. The types from the imtype typemap are used in the extern(C) declarations of these functions in the intermediary D module. The dtype typemap contains the D types used in the D proxy module/class.

    22.3.3 in, out, directorin, directorout

    Used for converting between the types for C/C++ and D when generating the code for the wrapper functions (on the C++ side).

    The code from the in typemap is used to convert arguments to the C wrapper function to the type used in the wrapped code (ctype->original C++ type), the out typemap is utilized to convert values from the wrapped code to wrapper function return types (original C++ type->ctype).

    The directorin typemap is used to convert parameters to the type used in the D director callback function, its return value is processed by directorout (see below).

    22.3.4 din, dout, ddirectorin, ddirectorout

    Typemaps for code generation in D proxy and type wrapper classes.

    The din typemap is used for converting function parameter types from the type used in the proxy module or class to the type used in the intermediary D module (the $dinput macro is replaced). To inject further parameter processing code before or after the call to the intermediary layer, the pre, post and terminator attributes can be used (please refer to the C# date marshalling example for more information on these).

    The dout typemap is used for converting function return values from the return type used in the intermediary D module to the type returned by the proxy function. The $excode special variable in dout typemaps is replaced by the excode typemap attribute code if the method can throw any exceptions from unmanaged code, otherwise by nothing (the $imcall and $owner macros are replaced).

    The code from the ddirectorin and ddirectorout typemaps is used for conversion in director callback functions. Arguments are converted to the type used in the proxy class method they are calling by using the code from ddirectorin, the proxy class method return value is converted to the type the C++ code expects via the ddirectorout typemap (the $dcall and $winput macros are replaced).

    The full chain of type conversions when a director callback is invoked looks like this:

          type              CPPClass::method(type a)
            ↑                       ↓
       <directorout>          <directorin>
            ↑                       ↓
          ctype             methodCallback(ctype a)           C++
     :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
          imtype            methodCallback(imtype a)           D
            ↑                       ↓
      <ddirectorout>          <ddirectorin>
            ↑                       ↓
          dtype             DClass.method(dtype a)

    22.3.5 typecheck typemaps

    Because, unlike many scripting languages supported by SWIG, D does not need any dynamic dispatch helper to access an overloaded function, the purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in D (as more than one C++ type maps to a single D type).

    22.3.6 Code injection typemaps

    These typemaps are used for generating the skeleton of proxy classes for C++ types.

    By overriding dbase, dinterfaces or dinterfaces_derived, the inheritance chain of the generated proxy class for a type can be modified. dclassmodifiers allows you to add any custom modifiers around the class keyword.

    Using dcode and dimports, you can specify additional D code which will be emitted into the class body respectively the imports section of the D module the class is written to.

    dconstructor, ddestructor, ddispose and ddispose_derived are used to generate the class constructor, destructor and dispose() method, respectively. The auxiliary code for handling the pointer to the C++ object is stored in dbody and dbody_derived. You can override them for specific types.

    Code can also be injected into the D proxy class using %proxycode.

    22.3.7 Special variable macros

    The standard SWIG special variables are available for use within typemaps as described in the Typemaps documentation, for example $1, $input, $result etc.

    When generating D wrappers, a few additional macros are available:

    $dclassname (C#: $csclassname)

    This special variable works similar to $n_type in that it returns the name of a type - it expands to the D proxy class name of the type being wrapped. If the type does not have an associated proxy class, it expands to the type wrapper class name, for example, SWIGTYPE_p_p_SomeCppClass is generated when wrapping SomeCppClass **.

    There are two other variants available, $&dclassname and $*dclassname. The former adds a level of indirection, while the latter removes one. For instance, when wrapping Foo **, $*dclassname would be replaced by the proxy class name corresponding to Foo *.

    $dclazzname (C#: $csclazzname)

    This special variable expands the fully qualified C++ class into the package name, if used by the nspace feature, and the proxy class name, mangled for use as a function name. For example, Namespace1::Namespace2::Klass is expanded into Namespace1_Namespace2_Klass_.

    This special variable might be useful for calling certain functions in the wrapper layer (e.g. upcast wrappers) which are mangled like this.

    $null

    In code inserted into the generated C/C++ wrapper functions, this variable is replaced by either 0 or nothing at all, depending on whether the function has a return value or not. It can be used to bail out early e.g. in case of errors (return $null;).

    $dinput (C#: $csinput)

    This variable is used in din typemaps and is replaced by the expression which is to be passed to C/C++.

    For example, this input

    %typemap(din) SomeClass * "SomeClass.getCPointer($dinput)"
    
    %inline %{
      class SomeClass {};
      void foo(SomeClass *arg);
    %}

    leads to the following D proxy code being generated:

    void foo(SomeClass arg) {
      example_im.foo(SomeClass.getCPointer(arg));
    }
    $imcall and $owner (C#: $imcall)

    These variables are used in dout typemaps. $imcall contains the call to the intermediary module which provides the value to be used, and $owner signals if the caller is responsible for managing the object lifetime (that is, if the called method is a constructor or has been marked via %newobject).

    Consider the following example:

    %typemap(dout) SomeClass * {
      return new SomeClass($imcall, $owner);
    }
    
    %inline %{
      class SomeClass;
      SomeClass *foo();
    
      %newobject bar();
      SomeClass *bar();
    %}
    

    The code generated for foo() and bar() looks like this:

    SomeClass foo() {
      return new SomeClass(example_im.foo(), false);
    }
    
    SomeClass bar() {
      return new SomeClass(example_im.bar(), true);
    }
    
    $dcall and $winput (C#: $cscall, $iminput)

    These variables are used in the director-specific typemaps ddirectorin and ddirectorout. They are more or less the reverse of the $imcall and $dinput macros: $dcall contains the invocation of the D proxy method of which the return value is to be passed back to C++, $winput contains the parameter value from C++.

    $excode

    This variable is used in dout and dconstructor typemaps and is filled with the contents of the excode typemap attribute if an exception could be thrown from the C++ side. See the C# documentation for details.

    $dbaseclass

    Currently for internal use only, it contains the D name of the C++ base class (if any) inside proxy classes.

    $directorconnect

    This macro is only valid inside the dconstructor typemap and contains the value of the dconstructor typemap attribute if the currently wrapped class has directors enabled.

    This is how the default dconstructor typemap looks like (you usually do not want to specify a custom one):

    %typemap(dconstructor, excode=SWIGEXCODE,
             directorconnect="\n  swigDirectorConnect();") SWIGTYPE {
      this($imcall, true);$excode$directorconnect
    }
    
    $importtype(SomeDType)

    This macro is used in the dimports typemap if a dependency on another D type generated by SWIG is added by a custom typemap.

    Consider the following code snippet:

    %typemap(dinterfaces) SomeClass "AnInterface, AnotherInterface";
    

    This causes SWIG to add AnInterface and AnotherInterface to the base class list of SomeClass:

    class SomeClass : AnInterface, AnotherInterface {
      ...
    }
    

    For this to work, AnInterface and AnotherInterface have to be in scope. If SWIG is not in split proxy mode, this is already the case, but it it is, they have to be added to the import list via the dimports typemap. Additionally, the import statement depends on the package SWIG is configured to emit the modules to.

    The $importtype macro helps you to elegantly solve this problem:

    %typemap(dimports) RemoteMpe %{
    $importtype(AnInterface)
    $importtype(AnotherInterface)
    %}
    

    If SWIG is in split proxy mode, it expands to an import statement for the specified type, to nothing if not.

    $module

    Expands to the name of the main proxy D module.

    $imdmodule

    Contains the fully qualified name of the intermediary D module.

    22.4 D and %feature

    The D module defines a number of directives which modify the SWIG features set globally or for a specific declaration:

    %dmanifestconst and %dconstvalue(value)

    Out of the box, SWIG generates accessor methods for C #defines and C++ constants. The %dmanifestconst directive enables wrapping these constants as D manifest constants (const in D1, enum in D2).

    For this to work, the C/C++ code for the constant value must directly compile as D code, though. If this is not the case, you can manually override the expression written to the D proxy module using the %dconstvalue directive, passing the new value as parameter.

    For enums, again %dconstvalue can be used to override the value of an enum item if the initializer should not compile in D.

    %dmethodmodifiers

    This directive can be used to override the modifiers for a proxy function. For instance, you could make a public C++ member function private in D like this:

    %dmethodmodifiers A::foo "private";
    
    %inline %{
    struct A {
      void foo();
    };
    %}
    

    22.5 Pragmas

    There are a few SWIG pragmas specific to the D module, which you can use to influence the D code SWIG generates:

    %pragma(d) imdmodulecode

    The passed text (D code) is copied verbatim to the intermediary D module. For example, it can be (and is, internally) used to emit additional private helper code for the use by proxy typemaps.

    %pragma(d) imdmoduleimports

    Additional code to be emitted to the imports section of the intermediary D module (the $importtype macro can be used here). You probably want to use this in conjunction with the imdmodulecode pragma.

    %pragma(d) proxydmodulecode

    Just like proxydmodulecode, the argument is copied to the proxy D module (if SWIG is in split proxy mode and/or the nspace feature is used, it is emitted to the main proxy D module only).

    %pragma(d) globalproxyimports

    The D module currently does not support specifying dependencies on external modules (e.g. from the standard library) for the D typemaps. To add the import statements to the proxy modules (resp. to all proxy modules if in split proxy mode), you can use the globalproxyimports directive.

    For example:

    %typemap(din) char[] "($dinput ? tango.stdc.stringz.toStringz($dinput) : null)"
    %pragma(d) globalproxyimports = "static import tango.stdc.stringz;";
    
    %pragma(d) wrapperloadercode

    The D code for loading the wrapper library (it is copied to the intermediary D module). The $wrapperloaderbindcode variable is replaced by the list of commands for binding the functions from the wrapper library to the symbols in the intermediary D module.

    Each time this pragma is specified, the previous value is overwritten.

    %pragma(d) wrapperloaderbindcommand

    The D command to use for binding the wrapper functions from the C/C++ library to the symbols in the intermediary D module. The $function variable contains the name of the D function in the wrap module, the $symbol variable is replaced by the name of the symbol in the library.

    Each time this pragma is specified, the previous value is overwritten.

    22.6 D Exceptions

    Out of the box, C++ exceptions are fundamentally incompatible to their equivalent in the D world and cannot simply be propagated to a calling D method. There is, however, an easy way to solve this problem: Just catch the exception in the C/C++ wrapper layer, pass the contents to D, and make the wrapper code rethrow the exception in the D world.

    The implementation details of this are a bit crude, but the SWIG D module automatically takes care of this, as long as it is able to detect that an exception could potentially be thrown (e.g. because the C++ method has a throw(...) exception specification).

    As this feature is implemented in exactly the same way it is for C#, please see the C# documentation for a more detailed explanation.

    22.7 D Directors

    When the directors feature is activated, SWIG generates extra code on both the C++ and the D side to enable cross-language polymorphism. Essentially, this means that if you subclass a proxy class in D, C++ code can access any overridden virtual methods just as if you created a derived class in C++.

    There is no D specific documentation yet, but the way the feature is implemented is very similar to how it is done in Java and C#.

    22.8 Other features

    22.8.1 Extended namespace support (nspace)

    By default, SWIG flattens all C++ namespaces into a single target language namespace, but as for Java and C#, the nspace feature is supported for D. If it is active, C++ namespaces are mapped to D packages/modules. Note, however, that like for the other languages, free variables and functions are not supported yet; currently, they are all allows written to the main proxy D module.

    22.8.2 Native pointer support

    Contrary to many of the scripting languages supported by SWIG, D fully supports C-style pointers. The D module thus includes a custom mechanism to wrap C pointers directly as D pointers where applicable, that is, if the type that is pointed to is represented the same in C and D (on the bit-level), dubbed a primitive type below.

    Central to this custom pointer handling scheme are two typemap attributes: the cprimitive attribute on the dtype typemap and the nativepointer attribute on all the typemaps which influence the D side of the code (dtype, din, dout, ...). When a D typemap is looked up, the following happens behind the scenes:

    First, the matching typemap is determined by the usual typemap lookup rules. Then, it is checked if the result has the nativepointer attribute set. If it is present, it means that its value should replace the typemap value if and only if the actual type the typemap is looked up for is a primitive type, a pointer to a primitive type (through an arbitrary level of indirections), or a function pointer with only primitive types in its signature.

    To determine if a type should be considered primitive, the cprimitive attribute on its dtype attribute is used. For example, the dtype typemap for float has cprimitive="1", so the code from the nativepointer attribute is taken into account e.g. for float ** or the function pointer float (*)(float *).

    22.8.3 Operator overloading

    The D module comes with basic operator overloading support for both D1 and D2. There are, however, a few limitations arising from conceptual differences between C++ and D:

    The first key difference is that C++ supports free functions as operators (along with argument-dependent lookup), while D requires operators to be member functions of the class they are operating on. SWIG can only automatically generate wrapping code for member function operators; if you want to use operators defined as free functions in D, you need to handle them manually.

    Another set of differences between C++ and D concerns individual operators. For example, there are quite a few operators which are overloadable in C++, but not in D, for example && and ||, but also !, and prefix increment/decrement operators in D1 resp. their postfix pendants in D2.

    There are also some cases where the operators can be translated to D, but the differences in the implementation details are big enough that a rather involved scheme would be required for automatic wrapping them, which has not been implemented yet. This affects, for example, the array subscript operator, [], in combination with assignments - while operator [] in C++ simply returns a reference which is then written to, D resorts to a separate opIndexAssign method -, or implicit casting (which was introduced in D2 via alias this). Despite the lack of automatic support, manually handling these cases should be perfectly possible.

    22.8.4 Running the test-suite

    As with any other language, the SWIG test-suite can be built for D using the *-d-test-suite targets of the top-level Makefile. By default, D1 is targeted, to build it with D2, use the optional D_VERSION variable, e.g. make check-d-test-suite D_VERSION=2.

    Note: If you want to use GDC on Linux or another platform which requires you to link libdl for dynamically loading the shared library, you might have to add -ldl manually to the d_compile target in Examples/Makefile, because GDC does not currently honor the pragma(lib, ...) statement.

    22.9 D Typemap examples

    There are no D-specific typemap examples yet. However, with the above name comparison table, you should be able to get an idea what can be done by looking at the corresponding C# section.

    22.10 Work in progress and planned features

    There are a couple of features which are not implemented yet, but would be very useful and might be added in the near future:

    • Static linking: Currently, the C wrapper code is compiled into a dynamic library, out of which the symbol addresses are looked up at runtime by the D part. If statically linking the different languages into one binary was supported, a tool-chain capable of performing IPO at link time could inline the wrapping code, effectively reducing the overhead for simple calls to zero.
    • C array handling: Many data structures in some C/C++ libraries contain array containing of a pointer to the first element and the element count. Currently, one must manually writing wrapper code to be able to access these from D. It should be possible to add a set of SWIG macros to semi-automatically generate conversion code.

    Some generated code might also be a bit rough around the edges, particularly in the following areas:

    • Memory management: Although the currently generated wrapper code works fine with regard to the GC for the test-suite, there might be issues coming up in real-world multi-threaded usage.
    • D2 support: Originally, the module has been developed for the use with D1, D2/Phobos support has been added in later. The basic features should work equally well for both, but there could be issues concerning const-correctness etc.
    swig-3.0.12/Doc/Manual/Extending.html0000664000175000017500000034714013042756672017210 0ustar williamwilliam Extending SWIG to support new languages

    41 Extending SWIG to support new languages

    41.1 Introduction

    This chapter describes SWIG's internal organization and the process by which new target languages can be developed. First, a brief word of warning---SWIG is continually evolving. The information in this chapter is mostly up to date, but changes are ongoing. Expect a few inconsistencies.

    Also, this chapter is not meant to be a hand-holding tutorial. As a starting point, you should probably look at one of SWIG's existing modules.

    41.2 Prerequisites

    In order to extend SWIG, it is useful to have the following background:

    • An understanding of the C API for the target language.
    • A good grasp of the C++ type system.
    • An understanding of typemaps and some of SWIG's advanced features.
    • Some familiarity with writing C++ (language modules are currently written in C++).

    Since SWIG is essentially a specialized C++ compiler, it may be useful to have some prior experience with compiler design (perhaps even a compilers course) to better understand certain parts of the system. A number of books will also be useful. For example, "The C Programming Language" by Kernighan and Ritchie (a.k.a, "K&R") and the C++ standard, "ISO/IEC 14882 Programming Languages - C++" will be of great use.

    Also, it is useful to keep in mind that SWIG primarily operates as an extension of the C++ type system. At first glance, this might not be obvious, but almost all SWIG directives as well as the low-level generation of wrapper code are driven by C++ datatypes.

    41.3 The Big Picture

    SWIG is a special purpose compiler that parses C++ declarations to generate wrapper code. To make this conversion possible, SWIG makes three fundamental extensions to the C++ language:

    • Typemaps. Typemaps are used to define the conversion/marshalling behavior of specific C++ datatypes. All type conversion in SWIG is based on typemaps. Furthermore, the association of typemaps to datatypes utilizes an advanced pattern matching mechanism that is fully integrated with the C++ type system.
    • Declaration Annotation. To customize wrapper code generation, most declarations can be annotated with special features. For example, you can make a variable read-only, you can ignore a declaration, you can rename a member function, you can add exception handling, and so forth. Virtually all of these customizations are built on top of a low-level declaration annotator that can attach arbitrary attributes to any declaration. Code generation modules can look for these attributes to guide the wrapping process.
    • Class extension. SWIG allows classes and structures to be extended with new methods and attributes (the %extend directive). This has the effect of altering the API in the target language and can be used to generate OO interfaces to C libraries.

    It is important to emphasize that virtually all SWIG features reduce to one of these three fundamental concepts. The type system and pattern matching rules also play a critical role in making the system work. For example, both typemaps and declaration annotation are based on pattern matching and interact heavily with the underlying type system.

    41.4 Execution Model

    When you run SWIG on an interface, processing is handled in stages by a series of system components:

    • An integrated C preprocessor reads a collection of configuration files and the specified interface file into memory. The preprocessor performs the usual functions including macro expansion and file inclusion. However, the preprocessor also performs some transformations of the interface. For instance, #define statements are sometimes transformed into %constant declarations. In addition, information related to file/line number tracking is inserted.
    • A C/C++ parser reads the preprocessed input and generates a full parse tree of all of the SWIG directives and C declarations found. The parser is responsible for many aspects of the system including renaming, declaration annotation, and template expansion. However, the parser does not produce any output nor does it interact with the target language module as it runs. SWIG is not a one-pass compiler.
    • A type-checking pass is made. This adjusts all of the C++ typenames to properly handle namespaces, typedefs, nested classes, and other issues related to type scoping.
    • A semantic pass is made on the parse tree to collect information related to properties of the C++ interface. For example, this pass would determine whether or not a class allows a default constructor.
    • A code generation pass is made using a specific target language module. This phase is responsible for generating the actual wrapper code. All of SWIG's user-defined modules are invoked during this latter stage of compilation.

    The next few sections briefly describe some of these stages.

    41.4.1 Preprocessing

    The preprocessor plays a critical role in the SWIG implementation. This is because a lot of SWIG's processing and internal configuration is managed not by code written in C, but by configuration files in the SWIG library. In fact, when you run SWIG, parsing starts with a small interface file like this (note: this explains the cryptic error messages that new users sometimes get when SWIG is misconfigured or installed incorrectly):

    %include "swig.swg"             // Global SWIG configuration
    %include "langconfig.swg"       // Language specific configuration
    %include "yourinterface.i"      // Your interface file
    

    The swig.swg file contains global configuration information. In addition, this file defines many of SWIG's standard directives as macros. For instance, part of of swig.swg looks like this:

    ...
    /* Code insertion directives such as %wrapper %{ ... %} */
    
    #define %begin       %insert("begin")
    #define %runtime     %insert("runtime")
    #define %header      %insert("header")
    #define %wrapper     %insert("wrapper")
    #define %init        %insert("init")
    
    /* Access control directives */
    
    #define %immutable   %feature("immutable", "1")
    #define %mutable     %feature("immutable")
    
    /* Directives for callback functions */
    
    #define %callback(x) %feature("callback") `x`;
    #define %nocallback  %feature("callback");
    
    /* %ignore directive */
    
    #define %ignore         %rename($ignore)
    #define %ignorewarn(x)  %rename("$ignore:" x)
    ...
    

    The fact that most of the standard SWIG directives are macros is intended to simplify the implementation of the internals. For instance, rather than having to support dozens of special directives, it is easier to have a few basic primitives such as %feature or %insert.

    The langconfig.swg file is supplied by the target language. This file contains language-specific configuration information. More often than not, this file provides run-time wrapper support code (e.g., the type-checker) as well as a collection of typemaps that define the default wrapping behavior. Note: the name of this file depends on the target language and is usually something like python.swg or perl5.swg.

    As a debugging aide, the text that SWIG feeds to its C++ parser can be obtained by running swig -E interface.i. This output probably isn't too useful in general, but it will show how macros have been expanded as well as everything else that goes into the low-level construction of the wrapper code.

    41.4.2 Parsing

    The current C++ parser handles a subset of C++. Most incompatibilities with C are due to subtle aspects of how SWIG parses declarations. Specifically, SWIG expects all C/C++ declarations to follow this general form:

    storage type declarator initializer;
    

    storage is a keyword such as extern, static, typedef, or virtual. type is a primitive datatype such as int or void. type may be optionally qualified with a qualifier such as const or volatile. declarator is a name with additional type-construction modifiers attached to it (pointers, arrays, references, functions, etc.). Examples of declarators include *x, **x, x[20], and (*x)(int, double). The initializer may be a value assigned using = or body of code enclosed in braces { ... }.

    This declaration format covers most common C++ declarations. However, the C++ standard is somewhat more flexible in the placement of the parts. For example, it is technically legal, although uncommon to write something like int typedef const a in your program. SWIG simply doesn't bother to deal with this case.

    The other significant difference between C++ and SWIG is in the treatment of typenames. In C++, if you have a declaration like this,

    int blah(Foo *x, Bar *y);
    

    it won't parse correctly unless Foo and Bar have been previously defined as types either using a class definition or a typedef. The reasons for this are subtle, but this treatment of typenames is normally integrated at the level of the C tokenizer---when a typename appears, a different token is returned to the parser instead of an identifier.

    SWIG does not operate in this manner--any legal identifier can be used as a type name. The reason for this is primarily motivated by the use of SWIG with partially defined data. Specifically, SWIG is supposed to be easy to use on interfaces with missing type information.

    Because of the different treatment of typenames, the most serious limitation of the SWIG parser is that it can't process type declarations where an extra (and unnecessary) grouping operator is used. For example:

    int (x);         /* A variable x */
    int (y)(int);    /* A function y */
    

    The placing of extra parentheses in type declarations like this is already recognized by the C++ community as a potential source of strange programming errors. For example, Scott Meyers "Effective STL" discusses this problem in a section on avoiding C++'s "most vexing parse."

    The parser is also unable to handle declarations with no return type or bare argument names. For example, in an old C program, you might see things like this:

    foo(a, b) {
    ...
    }
    

    In this case, the return type as well as the types of the arguments are taken by the C compiler to be an int. However, SWIG interprets the above code as an abstract declarator for a function returning a foo and taking types a and b as arguments).

    41.4.3 Parse Trees

    The SWIG parser produces a complete parse tree of the input file before any wrapper code is actually generated. Each item in the tree is known as a "Node". Each node is identified by a symbolic tag. Furthermore, a node may have an arbitrary number of children. The parse tree structure and tag names of an interface can be displayed using swig -debug-tags. For example:

    $ swig -c++ -python -debug-tags example.i
     . top (example.i:1)
     . top . include (example.i:1)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:71)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include . typemap . typemapitem (/r0/beazley/Projects/lib/swig1.3/swig.swg:83)
     . top . include (example.i:4)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:7)
     . top . include . insert (/r0/beazley/Projects/lib/swig1.3/python/python.swg:8)
     . top . include . typemap (/r0/beazley/Projects/lib/swig1.3/python/python.swg:19)
    ...
     . top . include (example.i:6)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:6)
     . top . include . include (example.i:9)
     . top . include . include . class (example.h:3)
     . top . include . include . class . access (example.h:4)
     . top . include . include . class . constructor (example.h:7)
     . top . include . include . class . destructor (example.h:10)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:11)
     . top . include . include . class . cdecl (example.h:12)
     . top . include . include . class . cdecl (example.h:13)
     . top . include . include . class . cdecl (example.h:14)
     . top . include . include . class . cdecl (example.h:15)
     . top . include . include . class (example.h:18)
     . top . include . include . class . access (example.h:19)
     . top . include . include . class . cdecl (example.h:20)
     . top . include . include . class . access (example.h:21)
     . top . include . include . class . constructor (example.h:22)
     . top . include . include . class . cdecl (example.h:23)
     . top . include . include . class . cdecl (example.h:24)
     . top . include . include . class (example.h:27)
     . top . include . include . class . access (example.h:28)
     . top . include . include . class . cdecl (example.h:29)
     . top . include . include . class . access (example.h:30)
     . top . include . include . class . constructor (example.h:31)
     . top . include . include . class . cdecl (example.h:32)
     . top . include . include . class . cdecl (example.h:33)
    

    Even for the most simple interface, the parse tree structure is larger than you might expect. For example, in the above output, a substantial number of nodes are actually generated by the python.swg configuration file which defines typemaps and other directives. The contents of the user-supplied input file don't appear until the end of the output.

    The contents of each parse tree node consist of a collection of attribute/value pairs. Internally, the nodes are simply represented by hash tables. A display of the entire parse-tree structure can be obtained using swig -debug-top <n>, where n is the stage being processed. There are a number of other parse tree display options, for example, swig -debug-module <n> will avoid displaying system parse information and only display the parse tree pertaining to the user's module at stage n of processing.

    $ swig -c++ -python -debug-module 4 example.i
          +++ include ----------------------------------------
          | name         - "example.i"
    
                +++ module ----------------------------------------
                | name         - "example"
                |
                +++ insert ----------------------------------------
                | code         - "\n#include \"example.h\"\n"
                |
                +++ include ----------------------------------------
                | name         - "example.h"
    
                      +++ class ----------------------------------------
                      | abstract     - "1"
                      | sym:name     - "Shape"
                      | name         - "Shape"
                      | kind         - "class"
                      | symtab       - 0x40194140
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Shape"
                            | name         - "Shape"
                            | decl         - "f()."
                            | code         - "{\n    nshapes++;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ destructor ----------------------------------------
                            | sym:name     - "~Shape"
                            | name         - "~Shape"
                            | storage      - "virtual"
                            | code         - "{\n    nshapes--;\n  }"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "x"
                            | name         - "x"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "y"
                            | name         - "y"
                            | decl         - ""
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "move"
                            | name         - "move"
                            | decl         - "f(double, double)."
                            | parms        - double, double
                            | type         - "void"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | value        - "0"
                            | type         - "double"
                            | sym:symtab   - 0x40194140
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "nshapes"
                            | name         - "nshapes"
                            | decl         - ""
                            | storage      - "static"
                            | type         - "int"
                            | sym:symtab   - 0x40194140
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Circle"
                      | name         - "Circle"
                      | kind         - "class"
                      | bases        - 0x40194510
                      | symtab       - 0x40194538
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "radius"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Circle"
                            | name         - "Circle"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194538
                            |
                      +++ class ----------------------------------------
                      | sym:name     - "Square"
                      | name         - "Square"
                      | kind         - "class"
                      | bases        - 0x40194760
                      | symtab       - 0x40194788
                      | sym:symtab   - 0x40191078
    
                            +++ access ----------------------------------------
                            | kind         - "private"
                            |
                            +++ cdecl ----------------------------------------
                            | name         - "width"
                            | decl         - ""
                            | type         - "double"
                            |
                            +++ access ----------------------------------------
                            | kind         - "public"
                            |
                            +++ constructor ----------------------------------------
                            | sym:name     - "Square"
                            | name         - "Square"
                            | parms        - double
                            | decl         - "f(double)."
                            | code         - "{ }"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "area"
                            | name         - "area"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
                            |
                            +++ cdecl ----------------------------------------
                            | sym:name     - "perimeter"
                            | name         - "perimeter"
                            | decl         - "f(void)."
                            | parms        - void
                            | storage      - "virtual"
                            | type         - "double"
                            | sym:symtab   - 0x40194788
    

    41.4.4 Attribute namespaces

    Attributes of parse tree nodes are often prepended with a namespace qualifier. For example, the attributes sym:name and sym:symtab are attributes related to symbol table management and are prefixed with sym:. As a general rule, only those attributes which are directly related to the raw declaration appear without a prefix (type, name, declarator, etc.).

    Target language modules may add additional attributes to nodes to assist the generation of wrapper code. The convention for doing this is to place these attributes in a namespace that matches the name of the target language. For example, python:foo or perl:foo.

    41.4.5 Symbol Tables

    During parsing, all symbols are managed in the space of the target language. The sym:name attribute of each node contains the symbol name selected by the parser. Normally, sym:name and name are the same. However, the %rename directive can be used to change the value of sym:name. You can see the effect of %rename by trying it on a simple interface and dumping the parse tree. For example:

    %rename(foo_i) foo(int);
    %rename(foo_d) foo(double);
    
    void foo(int);
    void foo(double);
    void foo(Bar *b);
    

    There are various debug- options that can be useful for debugging and analysing the parse tree. For example, the debug-top <n> or debug-module <n> options will dump the entire/top of the parse tree or the module subtree at one of the four n stages of processing. The parse tree can be viewed after the final stage of processing by running SWIG:

    $ swig -debug-top 4 example.i
    ...
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_i"
                | name         - "foo"
                | decl         - "f(int)."
                | parms        - int
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo_d"
                | name         - "foo"
                | decl         - "f(double)."
                | parms        - double
                | type         - "void"
                | sym:symtab   - 0x40165078
                |
                +++ cdecl ----------------------------------------
                | sym:name     - "foo"
                | name         - "foo"
                | decl         - "f(p.Bar)."
                | parms        - Bar *
                | type         - "void"
                | sym:symtab   - 0x40165078
    

    All symbol-related conflicts and complaints about overloading are based on sym:name values. For instance, the following example uses %rename in reverse to generate a name clash.

    %rename(foo) foo_i(int);
    %rename(foo) foo_d(double;
    
    void foo_i(int);
    void foo_d(double);
    void foo(Bar *b);
    

    When you run SWIG on this you now get:

    $ ./swig example.i
    example.i:6. Overloaded declaration ignored.  foo_d(double )
    example.i:5. Previous declaration is foo_i(int )
    example.i:7. Overloaded declaration ignored.  foo(Bar *)
    example.i:5. Previous declaration is foo_i(int )
    

    41.4.6 The %feature directive

    A number of SWIG directives such as %exception are implemented using the low-level %feature directive. For example:

    %feature("except") getitem(int) {
      try {
         $action
      } catch (badindex) {
         ...
      }
    }
    
    ...
    class Foo {
    public:
      Object *getitem(int index) throws(badindex);
      ...
    };
    

    The behavior of %feature is very easy to describe--it simply attaches a new attribute to any parse tree node that matches the given prototype. When a feature is added, it shows up as an attribute in the feature: namespace. You can see this when running with the -debug-top 4 option. For example:

     +++ cdecl ----------------------------------------
     | sym:name     - "getitem"
     | name         - "getitem"
     | decl         - "f(int).p."
     | parms        - int
     | type         - "Object"
     | feature:except - "{\n    try {\n       $action\n    } catc..."
     | sym:symtab   - 0x40168ac8
     |
    

    Feature names are completely arbitrary and a target language module can be programmed to respond to any feature name that it wants to recognize. The data stored in a feature attribute is usually just a raw unparsed string. For example, the exception code above is simply stored without any modifications.

    41.4.7 Code Generation

    Language modules work by defining handler functions that know how to respond to different types of parse-tree nodes. These handlers simply look at the attributes of each node in order to produce low-level code.

    In reality, the generation of code is somewhat more subtle than simply invoking handler functions. This is because parse-tree nodes might be transformed. For example, suppose you are wrapping a class like this:

    class Foo {
    public:
      virtual int *bar(int x);
    };
    

    When the parser constructs a node for the member bar, it creates a raw "cdecl" node with the following attributes:

    nodeType    : cdecl
    name        : bar
    type        : int
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    To produce wrapper code, this "cdecl" node undergoes a number of transformations. First, the node is recognized as a function declaration. This adjusts some of the type information--specifically, the declarator is joined with the base datatype to produce this:

    nodeType    : cdecl
    name        : bar
    type        : p.int        <-- Notice change in return type
    decl        : f(int).p
    parms       : int x
    storage     : virtual
    sym:name    : bar
    

    Next, the context of the node indicates that the node is really a member function. This produces a transformation to a low-level accessor function like this:

    nodeType    : cdecl
    name        : bar
    type        : int.p
    decl        : f(int).p
    parms       : Foo *self, int x            <-- Added parameter
    storage     : virtual
    wrap:action : result = (arg1)->bar(arg2)  <-- Action code added
    sym:name    : Foo_bar                     <-- Symbol name changed
    

    In this transformation, notice how an additional parameter was added to the parameter list and how the symbol name of the node has suddenly changed into an accessor using the naming scheme described in the "SWIG Basics" chapter. A small fragment of "action" code has also been generated--notice how the wrap:action attribute defines the access to the underlying method. The data in this transformed node is then used to generate a wrapper.

    Language modules work by registering handler functions for dealing with various types of nodes at different stages of transformation. This is done by inheriting from a special Language class and defining a collection of virtual methods. For example, the Python module defines a class as follows:

    class PYTHON : public Language {
    protected:
    public :
      virtual void main(int, char *argv[]);
      virtual int  top(Node *);
      virtual int  functionWrapper(Node *);
      virtual int  constantWrapper(Node *);
      virtual int  variableWrapper(Node *);
      virtual int  nativeWrapper(Node *);
      virtual int  membervariableHandler(Node *);
      virtual int  memberconstantHandler(Node *);
      virtual int  memberfunctionHandler(Node *);
      virtual int  constructorHandler(Node *);
      virtual int  destructorHandler(Node *);
      virtual int  classHandler(Node *);
      virtual int  classforwardDeclaration(Node *);
      virtual int  insertDirective(Node *);
      virtual int  importDirective(Node *);
    };
    

    The role of these functions is described shortly.

    41.4.8 SWIG and XML

    Much of SWIG's current parser design was originally motivated by interest in using XML to represent SWIG parse trees. Although XML is not currently used in any direct manner, the parse tree structure, use of node tags, attributes, and attribute namespaces are all influenced by aspects of XML parsing. Therefore, in trying to understand SWIG's internal data structures, it may be useful to keep XML in the back of your mind as a model.

    41.5 Primitive Data Structures

    Most of SWIG is constructed using three basic data structures: strings, hashes, and lists. These data structures are dynamic in same way as similar structures found in many scripting languages. For instance, you can have containers (lists and hash tables) of mixed types and certain operations are polymorphic.

    This section briefly describes the basic structures so that later sections of this chapter make more sense.

    When describing the low-level API, the following type name conventions are used:

    • String. A string object.
    • Hash. A hash object.
    • List. A list object.
    • String_or_char. A string object or a char *.
    • Object_or_char. An object or a char *.
    • Object. Any object (string, hash, list, etc.)

    In most cases, other typenames in the source are aliases for one of these primitive types. Specifically:

    typedef String SwigType;
    typedef Hash   Parm;
    typedef Hash   ParmList;
    typedef Hash   Node;
    typedef Hash   Symtab;
    typedef Hash   Typetab;
    

    41.5.1 Strings

    String *NewString(const String_or_char *val)

    Creates a new string with initial value val. val may be a char * or another String object. If you want to create an empty string, use "" for val.

    String *NewStringf(const char *fmt, ...)

    Creates a new string whose initial value is set according to a C printf style format string in fmt. Additional arguments follow depending on fmt.

    String *Copy(String *s)

    Make a copy of the string s.

    void Delete(String *s)

    Deletes s.

    int Len(const String_or_char *s)

    Returns the length of the string.

    char *Char(const String_or_char *s)

    Returns a pointer to the first character in a string.

    void Append(String *s, const String_or_char *t)

    Appends t to the end of string s.

    void Insert(String *s, int pos, const String_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the string (appending).

    int Strcmp(const String_or_char *s, const String_or_char *t)

    Compare strings s and t. Same as the C strcmp() function.

    int Strncmp(const String_or_char *s, const String_or_char *t, int len)

    Compare the first len characters of strings s and t. Same as the C strncmp() function.

    char *Strstr(const String_or_char *s, const String_or_char *pat)

    Returns a pointer to the first occurrence of pat in s. Same as the C strstr() function.

    char *Strchr(const String_or_char *s, char ch)

    Returns a pointer to the first occurrence of character ch in s. Same as the C strchr() function.

    void Chop(String *s)

    Chops trailing whitespace off the end of s.

    int Replace(String *s, const String_or_char *pat, const String_or_char *rep, int flags)

    Replaces the pattern pat with rep in string s. flags is a combination of the following flags:

    DOH_REPLACE_ANY       - Replace all occurrences
    DOH_REPLACE_ID        - Valid C identifiers only
    DOH_REPLACE_NOQUOTE   - Don't replace in quoted strings
    DOH_REPLACE_FIRST     - Replace first occurrence only.
    

    Returns the number of replacements made (if any).

    41.5.2 Hashes

    Hash *NewHash()

    Creates a new empty hash table.

    Hash *Copy(Hash *h)

    Make a shallow copy of the hash h.

    void Delete(Hash *h)

    Deletes h.

    int Len(Hash *h)

    Returns the number of items in h.

    Object *Getattr(Hash *h, const String_or_char *key)

    Gets an object from h. key may be a string or a simple char * string. Returns NULL if not found.

    int Setattr(Hash *h, const String_or_char *key, const Object_or_char *val)

    Stores val in h. key may be a string or a simple char *. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the hash. If val is NULL, the object is deleted. Increases the reference count of val. Returns 1 if this operation replaced an existing hash entry, 0 otherwise.

    int Delattr(Hash *h, const String_or_char *key)

    Deletes the hash item referenced by key. Decreases the reference count on the corresponding object (if any). Returns 1 if an object was removed, 0 otherwise.

    List *Keys(Hash *h)

    Returns the list of hash table keys.

    41.5.3 Lists

    List *NewList()

    Creates a new empty list.

    List *Copy(List *x)

    Make a shallow copy of the List x.

    void Delete(List *x)

    Deletes x.

    int Len(List *x)

    Returns the number of items in x.

    Object *Getitem(List *x, int n)

    Returns an object from x with index n. If n is beyond the end of the list, the last item is returned. If n is negative, the first item is returned.

    int *Setitem(List *x, int n, const Object_or_char *val)

    Stores val in x. If val is not a standard object (String, Hash, or List) it is assumed to be a char * in which case it is used to construct a String that is stored in the list. n must be in range. Otherwise, an assertion will be raised.

    int *Delitem(List *x, int n)

    Deletes item n from the list, shifting items down if necessary. To delete the last item in the list, use the special value DOH_END for n.

    void Append(List *x, const Object_or_char *t)

    Appends t to the end of x. If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    void Insert(String *s, int pos, const Object_or_char *t)

    Inserts t into s at position pos. The contents of s are shifted accordingly. The special value DOH_END can be used for pos to indicate insertion at the end of the list (appending). If t is not a standard object, it is assumed to be a char * and is used to create a String object.

    41.5.4 Common operations

    The following operations are applicable to all datatypes.

    Object *Copy(Object *x)

    Make a copy of the object x.

    void Delete(Object *x)

    Deletes x.

    void Setfile(Object *x, String_or_char *f)

    Sets the filename associated with x. Used to track objects and report errors.

    String *Getfile(Object *x)

    Gets the filename associated with x.

    void Setline(Object *x, int n)

    Sets the line number associated with x. Used to track objects and report errors.

    int Getline(Object *x)

    Gets the line number associated with x.

    41.5.5 Iterating over Lists and Hashes

    To iterate over the elements of a list or a hash table, the following functions are used:

    Iterator First(Object *x)

    Returns an iterator object that points to the first item in a list or hash table. The item attribute of the Iterator object is a pointer to the item. For hash tables, the key attribute of the Iterator object additionally points to the corresponding Hash table key. The item and key attributes are NULL if the object contains no items or if there are no more items.

    Iterator Next(Iterator i)

    Returns an iterator that points to the next item in a list or hash table. Here are two examples of iteration:

    List *l = (some list);
    Iterator i;
    
    for (i = First(l); i.item; i = Next(i)) {
      Printf(stdout, "%s\n", i.item);
    }
    
    Hash *h = (some hash);
    Iterator j;
    
    for (j = First(j); j.item; j= Next(j)) {
      Printf(stdout, "%s : %s\n", j.key, j.item);
    }
    

    41.5.6 I/O

    Special I/O functions are used for all internal I/O. These operations work on C FILE * objects, String objects, and special File objects (which are merely a wrapper around FILE *).

    int Printf(String_or_FILE *f, const char *fmt, ...)

    Formatted I/O. Same as the C fprintf() function except that output can also be directed to a string object. Note: the %s format specifier works with both strings and char *. All other format operators have the same meaning.

    int Printv(String_or_FILE *f, String_or_char *arg1, ..., NULL)

    Prints a variable number of strings arguments to the output. The last argument to this function must be NULL. The other arguments can either be char * or string objects.

    int Putc(int ch, String_or_FILE *f)

    Same as the C fputc() function.

    int Write(String_or_FILE *f, void *buf, int len)

    Same as the C write() function.

    int Read(String_or_FILE *f, void *buf, int maxlen)

    Same as the C read() function.

    int Getc(String_or_FILE *f)

    Same as the C fgetc() function.

    int Ungetc(int ch, String_or_FILE *f)

    Same as the C ungetc() function.

    int Seek(String_or_FILE *f, int offset, int whence)

    Same as the C seek() function. offset is the number of bytes. whence is one of SEEK_SET, SEEK_CUR, or SEEK_END..

    long Tell(String_or_FILE *f)

    Same as the C tell() function.

    File *NewFile(const char *filename, const char *mode, List *newfiles)

    Create a File object using the fopen() library call. This file differs from FILE * in that it can be placed in the standard SWIG containers (lists, hashes, etc.). The filename is added to the newfiles list if newfiles is non-zero and the file was created successfully.

    File *NewFileFromFile(FILE *f)

    Create a File object wrapper around an existing FILE * object.

    There's no explicit function to close a file, just call Delete(f) - this decreases the reference count, and the file will be closed when the reference count reaches zero.

    The use of the above I/O functions and strings play a critical role in SWIG. It is common to see small code fragments of code generated using code like this:

    /* Print into a string */
    String *s = NewString("");
    Printf(s, "Hello\n");
    for (i = 0; i < 10; i++) {
      Printf(s, "%d\n", i);
    }
    ...
    /* Print string into a file */
    Printf(f, "%s\n", s);
    

    Similarly, the preprocessor and parser all operate on string-files.

    41.6 Navigating and manipulating parse trees

    Parse trees are built as collections of hash tables. Each node is a hash table in which arbitrary attributes can be stored. Certain attributes in the hash table provide links to other parse tree nodes. The following macros can be used to move around the parse tree.

    String *nodeType(Node *n)

    Returns the node type tag as a string. The returned string indicates the type of parse tree node.

    Node *nextSibling(Node *n)

    Returns the next node in the parse tree. For example, the next C declaration.

    Node *previousSibling(Node *n)

    Returns the previous node in the parse tree. For example, the previous C declaration.

    Node *firstChild(Node *n)

    Returns the first child node. For example, if n was a C++ class node, this would return the node for the first class member.

    Node *lastChild(Node *n)

    Returns the last child node. You might use this if you wanted to append a new node to the of a class.

    Node *parentNode(Node *n)

    Returns the parent of node n. Use this to move up the pass tree.

    The following macros can be used to change all of the above attributes. Normally, these functions are only used by the parser. Changing them without knowing what you are doing is likely to be dangerous.

    void set_nodeType(Node *n, const String_or_char)

    Change the node type. tree node.

    void set_nextSibling(Node *n, Node *s)

    Set the next sibling.

    void set_previousSibling(Node *n, Node *s)

    Set the previous sibling.

    void set_firstChild(Node *n, Node *c)

    Set the first child node.

    void set_lastChild(Node *n, Node *c)

    Set the last child node.

    void set_parentNode(Node *n, Node *p)

    Set the parent node.

    The following utility functions are used to alter the parse tree (at your own risk)

    void appendChild(Node *parent, Node *child)

    Append a child to parent. The appended node becomes the last child.

    void deleteNode(Node *node)

    Deletes a node from the parse tree. Deletion reconnects siblings and properly updates the parent so that sibling nodes are unaffected.

    41.7 Working with attributes

    Since parse tree nodes are just hash tables, attributes are accessed using the Getattr(), Setattr(), and Delattr() operations. For example:

    int functionHandler(Node *n) {
      String *name    = Getattr(n, "name");
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
    }
    

    New attributes can be freely attached to a node as needed. However, when new attributes are attached during code generation, they should be prepended with a namespace prefix. For example:

    ...
    Setattr(n, "python:docstring", doc);     /* Store docstring */
    ...
    

    A quick way to check the value of an attribute is to use the checkAttribute() function like this:

    if (checkAttribute(n, "storage", "virtual")) {
      /* n is virtual */
      ...
    }
    

    Changing the values of existing attributes is allowed and is sometimes done to implement node transformations. However, if a function/method modifies a node, it is required to restore modified attributes to their original values. To simplify the task of saving/restoring attributes, the following functions are used:

    int Swig_save(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    Saves a copy of attributes name1, name2, etc. from node n. Copies of the attributes are actually resaved in the node in a different namespace which is set by the ns argument. For example, if you call Swig_save("foo", n, "type", NIL), then the "type" attribute will be copied and saved as "foo:type". The namespace name itself is stored in the "view" attribute of the node. If necessary, this can be examined to find out where previous values of attributes might have been saved.

    int Swig_restore(Node *n)

    Restores the attributes saved by the previous call to Swig_save(). Those attributes that were supplied to Swig_save() will be restored to their original values.

    The Swig_save() and Swig_restore() functions must always be used as a pair. That is, every call to Swig_save() must have a matching call to Swig_restore(). Calls can be nested if necessary. Here is an example that shows how the functions might be used:

    int variableHandler(Node *n) {
      Swig_save("variableHandler", n, "type", "sym:name", NIL);
      String *symname = Getattr(n, "sym:name");
      SwigType *type  = Getattr(n, "type");
      ...
      Append(symname, "_global");        // Change symbol name
      SwigType_add_pointer(type);        // Add pointer
      ...
      generate wrappers
      ...
      Swig_restore(n);                  // Restore original values
      return SWIG_OK;
    }
    

    int Swig_require(const char *ns, Node *n, const char *name1, const char *name2, ..., NIL)

    This is an enhanced version of Swig_save() that adds error checking. If an attribute name is not present in n, a failed assertion results and SWIG terminates with a fatal error. Optionally, if an attribute name is specified as "*name", a copy of the attribute is saved as with Swig_save(). If an attribute is specified as "?name", the attribute is optional. Swig_restore() must always be called after using this function.

    41.8 Type system

    SWIG implements the complete C++ type system including typedef, inheritance, pointers, references, and pointers to members. A detailed discussion of type theory is impossible here. However, let's cover the highlights.

    41.8.1 String encoding of types

    All types in SWIG consist of a base datatype and a collection of type operators that are applied to the base. A base datatype is almost always some kind of primitive type such as int or double. The operators consist of things like pointers, references, arrays, and so forth. Internally, types are represented as strings that are constructed in a very precise manner. Here are some examples:

    C datatype                     SWIG encoding (strings)
    -----------------------------  --------------------------
    int                            "int"
    int *                          "p.int"
    const int *                    "p.q(const).int"
    int (*x)(int, double)          "p.f(int, double).int"
    int [20][30]                   "a(20).a(30).int"
    int (F::*)(int)                "m(F).f(int).int"
    vector<int> *                  "p.vector<(int)>"
    

    Reading the SWIG encoding is often easier than figuring out the C code---just read it from left to right. For a type of "p.f(int, double).int" is a "pointer to a function(int, double) that returns int".

    The following operator encodings are used in type strings:

    Operator              Meaning
    -------------------   -------------------------------
    p.                    Pointer to
    a(n).                 Array of dimension n
    r.                    C++ reference
    m(class).             Member pointer to class
    f(args).              Function.
    q(qlist).             Qualifiers
    

    In addition, type names may be parameterized by templates. This is represented by enclosing the template parameters in <( ... )>. Variable length arguments are represented by the special base type of v(...).

    If you want to experiment with type encodings, the raw type strings can be inserted into an interface file using backticks `` wherever a type is expected. For instance, here is an extremely perverted example:

    `p.a(10).p.f(int, p.f(int).int)` foo(int, int (*x)(int));
    

    This corresponds to the immediately obvious C declaration:

    (*(*foo(int, int (*)(int)))[10])(int, int (*)(int));
    

    Aside from the potential use of this declaration on a C programming quiz, it motivates the use of the special SWIG encoding of types. The SWIG encoding is much easier to work with because types can be easily examined, modified, and constructed using simple string operations (comparison, substrings, concatenation, etc.). For example, in the parser, a declaration like this

    int *a[30];
    

    is processed in a few pieces. In this case, you have the base type "int" and the declarator of type "a(30).p.". To make the final type, the two parts are just joined together using string concatenation.

    41.8.2 Type construction

    The following functions are used to construct types. You should use these functions instead of trying to build the type strings yourself.

    void SwigType_add_pointer(SwigType *ty)

    Adds a pointer to ty.

    void SwigType_del_pointer(SwigType *ty)

    Removes a single pointer from ty.

    void SwigType_add_reference(SwigType *ty)

    Adds a reference to ty.

    void SwigType_add_array(SwigType *ty, const String_or_char *size)

    Adds an array with dimension dim to ty.

    void SwigType_del_array(SwigType *ty)

    Removes a single array dimension from ty.

    int SwigType_array_ndim(SwigType *ty)

    Returns number of array dimensions of ty.

    String* SwigType_array_getdim(SwigType *ty, int n)

    Returns nth array dimension of ty.

    void SwigType_array_setdim(SwigType *ty, int n, const String_or_char *rep)

    Sets nth array dimensions of ty to rep.

    void SwigType_add_qualifier(SwigType *ty, const String_or_char *q)

    Adds a type qualifier q to ty. q is typically "const" or "volatile".

    void SwigType_add_memberpointer(SwigType *ty, const String_or_char *cls)

    Adds a pointer to a member of class cls to ty.

    void SwigType_add_function(SwigType *ty, ParmList *p)

    Adds a function to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    void SwigType_add_template(SwigType *ty, ParmList *p)

    Adds a template to ty. p is a linked-list of parameter nodes as generated by the parser. See the section on parameter lists for details about the representation.

    SwigType *SwigType_pop(SwigType *ty)

    Removes the last type constructor from ty and returns it. ty is modified.

    void SwigType_push(SwigType *ty, SwigType *op)

    Pushes the type operators in op onto type ty. The opposite of SwigType_pop().

    SwigType *SwigType_pop_arrays(SwigType *ty)

    Removes all leading array operators from ty and returns them. ty is modified. For example, if ty is "a(20).a(10).p.int", then this function would return "a(20).a(10)." and modify ty so that it has the value "p.int".

    SwigType *SwigType_pop_function(SwigType *ty)

    Removes a function operator from ty including any qualification. ty is modified. For example, if ty is "f(int).int", then this function would return "f(int)." and modify ty so that it has the value "int".

    SwigType *SwigType_base(SwigType *ty)

    Returns the base type of a type. For example, if ty is "p.a(20).int", this function would return "int". ty is unmodified.

    SwigType *SwigType_prefix(SwigType *ty)

    Returns the prefix of a type. For example, if ty is "p.a(20).int", this function would return "p.a(20).". ty is unmodified.

    41.8.3 Type tests

    The following functions can be used to test properties of a datatype.

    int SwigType_ispointer(SwigType *ty)

    Checks if ty is a standard pointer.

    int SwigType_ismemberpointer(SwigType *ty)

    Checks if ty is a member pointer.

    int SwigType_isreference(SwigType *ty)

    Checks if ty is a C++ reference.

    int SwigType_isarray(SwigType *ty)

    Checks if ty is an array.

    int SwigType_isfunction(SwigType *ty)

    Checks if ty is a function.

    int SwigType_isqualifier(SwigType *ty)

    Checks if ty is a qualifier.

    int SwigType_issimple(SwigType *ty)

    Checks if ty is a simple type. No operators applied.

    int SwigType_isconst(SwigType *ty)

    Checks if ty is a const type.

    int SwigType_isvarargs(SwigType *ty)

    Checks if ty is a varargs type.

    int SwigType_istemplate(SwigType *ty)

    Checks if ty is a templatized type.

    41.8.4 Typedef and inheritance

    The behavior of typedef declaration is to introduce a type alias. For instance, typedef int Integer makes the identifier Integer an alias for int. The treatment of typedef in SWIG is somewhat complicated due to the pattern matching rules that get applied in typemaps and the fact that SWIG prefers to generate wrapper code that closely matches the input to simplify debugging (a user will see the typedef names used in their program instead of the low-level primitive C datatypes).

    To handle typedef, SWIG builds a collection of trees containing typedef relations. For example,

    typedef int Integer;
    typedef Integer *IntegerPtr;
    typedef int Number;
    typedef int Size;
    

    produces two trees like this:

                     int               p.Integer
                   ^  ^  ^                 ^
                  /   |   \                |
                 /    |    \               |
            Integer  Size   Number    IntegerPtr
    

    To resolve a single typedef relationship, the following function is used:

    SwigType *SwigType_typedef_resolve(SwigType *ty)

    Checks if ty can be reduced to a new type via typedef. If so, returns the new type. If not, returns NULL.

    Typedefs are only resolved in simple typenames that appear in a type. For example, the type base name and in function parameters. When resolving types, the process starts in the leaf nodes and moves up the tree towards the root. Here are a few examples that show how it works:

    Original type            After typedef_resolve()
    ------------------------ -----------------------
    Integer                  int
    a(30).Integer            int
    p.IntegerPtr             p.p.Integer
    p.p.Integer              p.p.int
    

    For complicated types, the process can be quite involved. Here is the reduction of a function pointer:

    p.f(Integer, p.IntegerPtr, Size).Integer          : Start
    p.f(Integer, p.IntegerPtr, Size).int
    p.f(int, p.IntegerPtr, Size).int
    p.f(int, p.p.Integer, Size).int
    p.f(int, p.p.int, Size).int
    p.f(int, p.p.int, int).int                        : End
    

    Two types are equivalent if their full type reductions are the same. The following function will fully reduce a datatype:

    SwigType *SwigType_typedef_resolve_all(SwigType *ty)

    Fully reduces ty according to typedef rules. Resulting datatype will consist only of primitive typenames.

    41.8.5 Lvalues

    When generating wrapper code, it is necessary to emit datatypes that can be used on the left-hand side of an assignment operator (an lvalue). However, not all C datatypes can be used in this way---especially arrays and const-qualified types. To generate a type that can be used as an lvalue, use the following function:

    SwigType *SwigType_ltype(SwigType *ty)

    Converts type ty to a type that can be used as an lvalue in assignment. The resulting type is stripped of qualifiers and arrays are converted to a pointers.

    The creation of lvalues is fully aware of typedef and other aspects of the type system. Therefore, the creation of an lvalue may result in unexpected results. Here are a few examples:

    typedef double Matrix4[4][4];
    Matrix4 x;    // type = 'Matrix4', ltype='p.a(4).double'
    
    typedef const char * Literal;
    Literal y;    // type = 'Literal', ltype='p.char'
    

    41.8.6 Output functions

    The following functions produce strings that are suitable for output.

    String *SwigType_str(SwigType *ty, const String_or_char *id = 0)

    Generates a C string for a datatype. id is an optional declarator. For example, if ty is "p.f(int).int" and id is "foo", then this function produces "int (*foo)(int)". This function is used to convert string-encoded types back into a form that is valid C syntax.

    String *SwigType_lstr(SwigType *ty, const String_or_char *id = 0)

    This is the same as SwigType_str() except that the result is generated from the type's lvalue (as generated from SwigType_ltype).

    String *SwigType_lcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from type ty to its lvalue. id is an optional name to include in the cast. For example, if ty is "q(const).p.char" and id is "foo", this function produces the string "(char *) foo".

    String *SwigType_rcaststr(SwigType *ty, const String_or_char *id = 0)

    Generates a casting operation that converts from a type's lvalue to a type equivalent to ty. id is an optional name to include in the cast. For example, if ty is "q(const).p.char" and id is "foo", this function produces the string "(const char *) foo".

    String *SwigType_manglestr(SwigType *ty)

    Generates a mangled string encoding of type ty. The mangled string only contains characters that are part of a valid C identifier. The resulting string is used in various parts of SWIG, but is most commonly associated with type-descriptor objects that appear in wrappers (e.g., SWIGTYPE_p_double).

    41.9 Parameters

    Several type-related functions involve parameter lists. These include functions and templates. Parameter list are represented as a list of nodes with the following attributes:

    "type"        -  Parameter type  (required)
    "name"        -  Parameter name  (optional)
    "value"       -  Initializer     (optional)
    

    Typically parameters are denoted in the source by using a typename of Parm * or ParmList *. To walk a parameter list, simply use code like this:

    Parm *parms;
    Parm *p;
    for (p = parms; p; p = nextSibling(p)) {
      SwigType *type  = Getattr(p, "type");
      String   *name  = Getattr(p, "name");
      String   *value = Getattr(p, "value");
      ...
    }
    

    Note: this code is exactly the same as what you would use to walk parse tree nodes.

    An empty list of parameters is denoted by a NULL pointer.

    Since parameter lists are fairly common, the following utility functions are provided to manipulate them:

    Parm *CopyParm(Parm *p);

    Copies a single parameter.

    ParmList *CopyParmList(ParmList *p);

    Copies an entire list of parameters.

    int ParmList_len(ParmList *p);

    Returns the number of parameters in a parameter list.

    String *ParmList_str(ParmList *p);

    Converts a parameter list into a C string. For example, produces a string like "(int *p, int n, double x);".

    String *ParmList_protostr(ParmList *p);

    The same as ParmList_str() except that parameter names are not included. Used to emit prototypes.

    int ParmList_numrequired(ParmList *p);

    Returns the number of required (non-optional) arguments in p.

    41.10 Writing a Language Module

    One of the easiest routes to supporting a new language module is to copy an already supported language module implementation and modify it. Be sure to choose a language that is similar in nature to the new language. All language modules follow a similar structure and this section briefly outlines the steps needed to create a bare-bones language module from scratch. Since the code is relatively easy to read, this section describes the creation of a minimal Python module. You should be able to extrapolate this to other languages.

    41.10.1 Execution model

    Code generation modules are defined by inheriting from the Language class, currently defined in the Source/Modules directory of SWIG. Starting from the parsing of command line options, all aspects of code generation are controlled by different methods of the Language that must be defined by your module.

    41.10.2 Starting out

    To define a new language module, first create a minimal implementation using this example as a guide:

    #include "swigmod.h"
    
    class PYTHON : public Language {
    public:
    
      virtual void main(int argc, char *argv[]) {
        printf("I'm the Python module.\n");
      }
    
      virtual int top(Node *n) {
        printf("Generating code.\n");
        return SWIG_OK;
      }
    
    };
    
    extern "C" Language *
    swig_python(void) {
      return new PYTHON();
    }
    

    The "swigmod.h" header file contains, among other things, the declaration of the Language base class and so you should include it at the top of your language module's source file. Similarly, the "swigconfig.h" header file contains some other useful definitions that you may need. Note that you should not include any header files that are installed with the target language. That is to say, the implementation of the SWIG Python module shouldn't have any dependencies on the Python header files. The wrapper code generated by SWIG will almost always depend on some language-specific C/C++ header files, but SWIG itself does not.

    Give your language class a reasonable name, usually the same as the target language. By convention, these class names are all uppercase (e.g. "PYTHON" for the Python language module) but this is not a requirement. This class will ultimately consist of a number of overrides of the virtual functions declared in the Language base class, in addition to any language-specific member functions and data you need. For now, just use the dummy implementations shown above.

    The language module ends with a factory function, swig_python(), that simply returns a new instance of the language class. As shown, it should be declared with the extern "C" storage qualifier so that it can be called from C code. It should also return a pointer to the base class (Language) so that only the interface (and not the implementation) of your language module is exposed to the rest of SWIG.

    Save the code for your language module in a file named "python.cxx" and place this file in the Source/Modules directory of the SWIG distribution. To ensure that your module is compiled into SWIG along with the other language modules, modify the file Source/Makefile.am to include the additional source files. In addition, modify the file Source/Modules/swigmain.cxx with an additional command line option that activates the module. Read the source---it's straightforward.

    Next, at the top level of the SWIG distribution, re-run the autogen.sh script to regenerate the various build files:

    $ ./autogen.sh
    

    Next re-run configure to regenerate all of the Makefiles:

    $ ./configure
    

    Finally, rebuild SWIG with your module added:

    $ make
    

    Once it finishes compiling, try running SWIG with the command-line option that activates your module. For example, swig -python foo.i. The messages from your new module should appear.

    41.10.3 Command line options

    When SWIG starts, the command line options are passed to your language module. This occurs before any other processing occurs (preprocessing, parsing, etc.). To capture the command line options, simply use code similar to this:

    void Language::main(int argc, char *argv[]) {
      for (int i = 1; i < argc; i++) {
          if (argv[i]) {
              if (strcmp(argv[i], "-interface") == 0) {
                if (argv[i+1]) {
                  interface = NewString(argv[i+1]);
                  Swig_mark_arg(i);
                  Swig_mark_arg(i+1);
                  i++;
                } else {
                  Swig_arg_error();
                }
              } else if (strcmp(argv[i], "-globals") == 0) {
                if (argv[i+1]) {
                  global_name = NewString(argv[i+1]);
                  Swig_mark_arg(i);
                  Swig_mark_arg(i+1);
                  i++;
                } else {
                  Swig_arg_error();
                }
              } else if ((strcmp(argv[i], "-proxy") == 0)) {
                proxy_flag = 1;
                Swig_mark_arg(i);
              } else if (strcmp(argv[i], "-keyword") == 0) {
                use_kw = 1;
                Swig_mark_arg(i);
              } else if (strcmp(argv[i], "-help") == 0) {
                fputs(usage, stderr);
              }
              ...
          }
      }
    }
    

    The exact set of options depends on what you want to do in your module. Generally, you would use the options to change code generation modes or to print diagnostic information.

    If a module recognizes an option, it should always call Swig_mark_arg() to mark the option as valid. If you forget to do this, SWIG will terminate with an unrecognized command line option error.

    41.10.4 Configuration and preprocessing

    In addition to looking at command line options, the main() method is responsible for some initial configuration of the SWIG library and preprocessor. To do this, insert some code like this:

    void main(int argc, char *argv[]) {
      ... command line options ...
    
      /* Set language-specific subdirectory in SWIG library */
      SWIG_library_directory("python");
    
      /* Set language-specific preprocessing symbol */
      Preprocessor_define("SWIGPYTHON 1", 0);
    
      /* Set language-specific configuration file */
      SWIG_config_file("python.swg");
    
      /* Set typemap language (historical) */
      SWIG_typemap_lang("python");
    }
    

    The above code does several things--it registers the name of the language module with the core, it supplies some preprocessor macro definitions for use in input files (so that they can determine the target language), and it registers a start-up file. In this case, the file python.swg will be parsed before any part of the user-supplied input file.

    Before proceeding any further, create a directory for your module in the SWIG library (The Lib directory). Now, create a configuration file in the directory. For example, python.swg.

    Just to review, your language module should now consist of two files-- an implementation file python.cxx and a configuration file python.swg.

    41.10.5 Entry point to code generation

    SWIG is a multi-pass compiler. Once the main() method has been invoked, the language module does not execute again until preprocessing, parsing, and a variety of semantic analysis passes have been performed. When the core is ready to start generating wrappers, it invokes the top() method of your language class. The argument to top is a single parse tree node that corresponds to the top of the entire parse tree.

    To get the code generation process started, the top() procedure needs to do several things:

    • Initialize the wrapper code output.
    • Set the module name.
    • Emit common initialization code.
    • Emit code for all of the child nodes.
    • Finalize the wrapper module and cleanup.

    An outline of top() might be as follows:

    int Python::top(Node *n) {
    
      /* Get the module name */
      String *module = Getattr(n, "name");
    
      /* Get the output file name */
      String *outfile = Getattr(n, "outfile");
    
      /* Initialize I/O (see next section) */
      ...
    
      /* Output module initialization code */
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Cleanup files */
      ...
    
      return SWIG_OK;
    }
    

    41.10.6 Module I/O and wrapper skeleton

    Within SWIG wrappers, there are five main sections. These are (in order)

    • begin: This section is a placeholder for users to put code at the beginning of the C/C++ wrapper file.
    • runtime: This section has most of the common SWIG runtime code.
    • header: This section holds declarations and inclusions from the .i file.
    • wrapper: This section holds all the wrapper code.
    • init: This section holds the module initialisation function (the entry point for the interpreter).

    Different parts of the SWIG code will fill different sections, then upon completion of the wrappering all the sections will be saved to the wrapper file.

    To perform this will require several additions to the code in various places, such as:

    class PYTHON : public Language {
    protected:
      /* General DOH objects used for holding the strings */
      File *f_begin;
      File *f_runtime;
      File *f_header;
      File *f_wrappers;
      File *f_init;
    
    public:
      ...
    
    };
    
    int Python::top(Node *n) {
    
      ...
    
      /* Initialize I/O */
      f_begin = NewFile(outfile, "w", SWIG_output_files());
      if (!f_begin) {
        FileErrorDisplay(outfile);
        SWIG_exit(EXIT_FAILURE);
      }
      f_runtime = NewString("");
      f_init = NewString("");
      f_header = NewString("");
      f_wrappers = NewString("");
    
      /* Register file targets with the SWIG file handler */
      Swig_register_filebyname("begin", f_begin);
      Swig_register_filebyname("header", f_header);
      Swig_register_filebyname("wrapper", f_wrappers);
      Swig_register_filebyname("runtime", f_runtime);
      Swig_register_filebyname("init", f_init);
    
      /* Output module initialization code */
      Swig_banner(f_begin);
      ...
    
      /* Emit code for children */
      Language::top(n);
    
      ...
      /* Write all to the file */
      Dump(f_runtime, f_begin);
      Dump(f_header, f_begin);
      Dump(f_wrappers, f_begin);
      Wrapper_pretty_print(f_init, f_begin);
    
      /* Cleanup files */
      Delete(f_runtime);
      Delete(f_header);
      Delete(f_wrappers);
      Delete(f_init);
      Delete(f_begin);
    
      return SWIG_OK;
    }
    

    Using this to process a file will generate a wrapper file, however the wrapper will only consist of the common SWIG code as well as any inline code which was written in the .i file. It does not contain any wrappers for any of the functions or classes.

    The code to generate the wrappers are the various member functions, which currently have not been touched. We will look at functionWrapper() as this is the most commonly used function. In fact many of the other wrapper routines will call this to do their work.

    A simple modification to write some basic details to the wrapper looks like this:

    int Python::functionWrapper(Node *n) {
      /* Get some useful attributes of this function */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      String   *parmstr= ParmList_str_defaultargs(parms); // to string
      String   *func   = SwigType_str(type, NewStringf("%s(%s)", name, parmstr));
      String   *action = Getattr(n, "wrap:action");
    
      Printf(f_wrappers, "functionWrapper   : %s\n", func);
      Printf(f_wrappers, "           action : %s\n", action);
      return SWIG_OK;
    }
    

    This will now produce some useful information within your wrapper file.

    functionWrapper   : void delete_Shape(Shape *self)
               action : delete arg1;
    
    functionWrapper   : void Shape_x_set(Shape *self, double x)
               action : if (arg1) (arg1)->x = arg2;
    
    functionWrapper   : double Shape_x_get(Shape *self)
               action : result = (double) ((arg1)->x);
    
    functionWrapper   : void Shape_y_set(Shape *self, double y)
               action : if (arg1) (arg1)->y = arg2;
    ...
    

    41.10.7 Low-level code generators

    As ingenious as SWIG is, and despite all its capabilities and the power of its parser, the Low-level code generation takes a lot of work to write properly. Mainly because every language insists on its own manner of interfacing to C/C++. To write the code generators you will need a good understanding of how to manually write an interface to your chosen language, so make sure you have your documentation handy.

    At this point it is also probably a good idea to take a very simple file (just one function), and try letting SWIG generate wrappers for many different languages. Take a look at all of the wrappers generated, and decide which one looks closest to the language you are trying to wrap. This may help you to decide which code to look at.

    In general most language wrappers look a little like this:

    /* wrapper for TYPE3 some_function(TYPE1, TYPE2); */
    RETURN_TYPE _wrap_some_function(ARGS){
      TYPE1 arg1;
      TYPE2 arg2;
      TYPE3 result;
    
      if(ARG1 is not of TYPE1) goto fail;
      arg1=(convert ARG1);
      if(ARG2 is not of TYPE2) goto fail;
      arg2=(convert ARG2);
    
      result=some_function(arg1, arg2);
    
      convert 'result' to whatever the language wants;
    
      do any tidy up;
    
      return ALL_OK;
    
      fail:
      do any tidy up;
      return ERROR;
    }
    

    Yes, it is rather vague and not very clear. But each language works differently so this will have to do for now.

    Tackling this problem will be done in two stages:

    • The skeleton: the function wrapper, and call, but without the conversion
    • The conversion: converting the arguments to-from what the language wants

    The first step will be done in the code, the second will be done in typemaps.

    Our first step will be to write the code for functionWrapper(). What is shown below is NOT the solution, merely a step in the right direction. There are a lot of issues to address.

    • Variable length and default parameters
    • Typechecking and number of argument checks
    • Overloaded functions
    • Inout and Output only arguments
    virtual int functionWrapper(Node *n) {
      /* get useful attributes */
      String   *name   = Getattr(n, "sym:name");
      SwigType *type   = Getattr(n, "type");
      ParmList *parms  = Getattr(n, "parms");
      ...
    
      /* create the wrapper object */
      Wrapper *wrapper = NewWrapper();
    
      /* create the functions wrappered name */
      String *wname = Swig_name_wrapper(iname);
    
      /* deal with overloading */
      ....
    
      /* write the wrapper function definition */
      Printv(wrapper->def, "RETURN_TYPE ", wname, "(ARGS) {", NIL);
    
      /* if any additional local variable needed, add them now */
      ...
    
      /* write the list of locals/arguments required */
      emit_args(type, parms, wrapper);
    
      /* check arguments */
      ...
    
      /* write typemaps(in) */
      ....
    
      /* write constraints */
      ....
    
      /* Emit the function call */
      emit_action(n, wrapper);
    
      /* return value if necessary  */
      ....
    
      /* write typemaps(out) */
      ....
    
      /* add cleanup code */
      ....
    
      /* Close the function(ok) */
      Printv(wrapper->code, "return ALL_OK;\n", NIL);
    
      /* add the failure cleanup code */
      ...
    
      /* Close the function(error) */
      Printv(wrapper->code, "return ERROR;\n", "}\n", NIL);
    
      /* final substititions if applicable */
      ...
    
      /* Dump the function out */
      Wrapper_print(wrapper, f_wrappers);
    
      /* tidy up */
      Delete(wname);
      DelWrapper(wrapper);
    
      return SWIG_OK;
    }
    

    Executing this code will produce wrappers which have our basic skeleton but without the typemaps, there is still work to do.

    41.10.8 Configuration files

    At the time of this writing, SWIG supports nearly twenty languages, which means that for continued sanity in maintaining the configuration files, the language modules need to follow some conventions. These are outlined here along with the admission that, yes it is ok to violate these conventions in minor ways, as long as you know where to apply the proper kludge to keep the overall system regular and running. Engineering is the art of compromise, see...

    Much of the maintenance regularity depends on choosing a suitable nickname for your language module (and then using it in a controlled way). Nicknames should be all lower case letters with an optional numeric suffix (no underscores, no dashes, no spaces). Some examples are: foo, bar, qux99.

    The numeric suffix variant, as in the last example, is somewhat tricky to work with because sometimes people expect to refer to the language without this number but sometimes that number is extremely relevant (especially when it corresponds to language implementation versions with incompatible interfaces). New language modules that unavoidably require a numeric suffix in their nickname should include that number in all uses, or be prepared to kludge.

    The nickname is used in four places:

    usagetransform
    "skip" tag(none)
    Examples/ subdir name(none)
    Examples/test-suite/ subdir name(none)

    As you can see, most usages are direct.

    configure.ac
    This file is processed by

    autoconf to generate the configure script. This is where you need to add shell script fragments and autoconf macros to detect the presence of whatever development support your language module requires, typically directories where headers and libraries can be found, and/or utility programs useful for integrating the generated wrapper code.

    Use the AC_ARG_WITH, AC_MSG_CHECKING, AC_SUBST macros and so forth (see other languages for examples). Avoid using the [ and ] character in shell script fragments. The variable names passed to AC_SUBST should begin with the nickname, entirely upcased.

    At the end of the new section is the place to put the aforementioned nickname kludges (should they be needed). See Perl5 for examples of what to do. [If this is still unclear after you've read the code, ping me and I'll expand on this further. --ttn]

    Makefile.in

    Some of the variables AC_SUBSTituted are essential to the support of your language module. Fashion these into a shell script "test" clause and assign that to a skip tag using "-z" and "-o":

    skip-qux99 = [ -z "@QUX99INCLUDE@" -o -z "@QUX99LIBS" ]

    This means if those vars should ever be empty, qux99 support should be considered absent and so it would be a good idea to skip actions that might rely on it.

    Here is where you may also define an alias (but then you'll need to kludge --- don't do this):

    skip-qux = $(skip-qux99)

    Lastly, you need to modify each of check-aliveness, check-examples, check-test-suite and lib-languages (var). Use the nickname for these, not the alias. Note that you can do this even before you have any tests or examples set up; the Makefile rules do some sanity checking and skip around these kinds of problems.

    Examples/Makefile.in
    Nothing special here; see comments at top the of this file and look to the existing languages for examples.
    Examples/qux99/check.list
    Do cp ../python/check.list . and modify to taste. One subdir per line.
    Lib/qux99/extra-install.list
    If you add your language to the top-level Makefile.in var lib-languages, then make install will install all *.i and *.swg files from the language-specific subdirectory of Lib. Use (optional) file extra-install.list in that directory to name additional files to install (see ruby for example).
    Source/Modules/Makefile.am
    Add appropriate files to this Automake file. That's it!

    When you have modified these files, please make sure that the new language module is completely ignored if it is not installed and detected on a box, that is, make check-examples and make check-test-suite politely displays the ignoring language message.

    41.10.9 Runtime support

    Discuss the kinds of functions typically needed for SWIG runtime support (e.g. SWIG_ConvertPtr() and SWIG_NewPointerObj()) and the names of the SWIG files that implement those functions.

    41.10.10 Standard library files

    The standard library files that most languages supply keeps growing as SWIG matures. The following are the minimum that are usually supported:

    • typemaps.i
    • std_string.i
    • std_vector.i
    • stl.i

    Please copy these and modify for any new language.

    41.10.11 User examples

    Each of the language modules provides one or more examples. These examples are used to demonstrate different features of the language module to SWIG end-users, but you'll find that they're useful during development and testing of your language module as well. You can use examples from the existing SWIG language modules for inspiration.

    Each example is self-contained and consists of (at least) a Makefile, a SWIG interface file for the example module, and a 'runme' script that demonstrates the functionality for that module. All of these files are stored in the same subdirectory under the Examples/[lang] directory. There are two classic examples which should be the first to convert to a new language module. These are the "simple" C example and the "class" C++ example. These can be found, for example for Python, in Examples/python/simple and Examples/python/class.

    By default, all of the examples are built and run when the user types make check. To ensure that your examples are automatically run during this process, see the section on configuration files.

    41.10.12 Test driven development and the test-suite

    A test driven development approach is central to the improvement and development of SWIG. Most modifications to SWIG are accompanied by additional regression tests and checking all tests to ensure that no regressions have been introduced.

    The regression testing is carried out by the SWIG test-suite. The test-suite consists of numerous testcase interface files in the Examples/test-suite directory as well as target language specific runtime tests in the Examples/test-suite/[lang] directory. When a testcase is run, it will execute the following steps for each testcase:

    1. Execute SWIG passing it the testcase interface file.
    2. Compile the resulting generated C/C++ code with either the C or C++ compiler into object files.
    3. Link the object files into a dynamic library (dll/shared object).
    4. Compile any generated and any runtime test target language code with the target language compiler, if the target language supports compilation. This step thus does not apply to the interpreted languages.
    5. Execute a runtime test if one exists.

    For example, the ret_by_value testcase consists of two components. The first component is the Examples/test-suite/ret_by_value.i interface file. The name of the SWIG module must always be the name of the testcase, so the ret_by_value.i interface file thus begins with:

    %module ret_by_value
    

    The testcase code will then follow the module declaration, usually within a %inline %{ ... %} section for the majority of the tests.

    The second component is the optional runtime tests. Any runtime tests are named using the following convention: [testcase]_runme.[ext], where [testcase] is the testcase name and [ext] is the normal extension for the target language file. In this case, the Java and Python target languages implement a runtime test, so their files are respectively, Examples/test-suite/java/ret_by_value_runme.java and Examples/test-suite/python/ret_by_value_runme.py.

    The goal of the test-suite is to test as much as possible in a silent manner. This way any SWIG or compiler errors or warnings are easily visible. Should there be any warnings, changes must be made to either fix them (preferably) or suppress them. Compilation or runtime errors result in a testcase failure and will be immediately visible. It is therefore essential that the runtime tests are written in a manner that displays nothing to stdout/stderr on success but error/exception out with an error message on stderr on failure.

    41.10.12.1 Running the test-suite

    In order for the test-suite to work for a particular target language, the language must be correctly detected and configured during the configure stage so that the correct Makefiles are generated. Most development occurs on Linux, so usually it is a matter of installing the development packages for the target language and simply configuring as outlined earlier.

    If when running the test-suite commands that follow, you get a message that the test was skipped, it indicates that the configure stage is missing information in order to compile and run everything for that language.

    The test-suite can be run in a number of ways. The first group of commands are for running multiple testcases in one run and should be executed in the top level directory. To run the entire test-suite (can take a long time):

    make -k check-test-suite
    

    To run the test-suite just for target language [lang], replace [lang] with one of csharp, java, perl5, python, ruby, tcl etc:

    make check-[lang]-test-suite
    

    Note that if a runtime test is available, a message "(with run test)" is displayed when run. For example:

    $ make check-python-test-suite
    checking python test-suite
    checking python testcase argcargvtest (with run test)
    checking python testcase python_autodoc
    checking python testcase python_append (with run test)
    checking python testcase callback (with run test)
    

    The files generated on a previous run can be deleted using the clean targets, either the whole test-suite or for a particular language:

    make clean-test-suite
    make clean-[lang]-test-suite
    

    The test-suite can be run in a partialcheck mode where just SWIG is executed, that is, the compile, link and running of the testcases is not performed. Note that the partialcheck does not require the target language to be correctly configured and detected and unlike the other test-suite make targets, is never skipped. Once again, either all the languages can be executed or just a chosen language:

    make partialcheck-test-suite
    make partialcheck-[lang]-test-suite
    

    If your computer has more than one CPU, you are strongly advised to use parallel make to speed up the execution speed. This can be done with any of the make targets that execute more than one testcase. For example, a dual core processor can efficiently use 2 parallel jobs:

    make -j2 check-test-suite
    make -j2 check-python-test-suite
    make -j2 partialcheck-java-test-suite
    

    The second group of commands are for running individual testcases and should be executed in the appropriate target language directory, Examples/test-suite/[lang]. Testcases can contain either C or C++ code and when one is written, a decision must be made as to which of these input languages is to be used. Replace [testcase] in the commands below with the name of the testcase.

    For a C language testcase, add the testcase under the C_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].ctest
    

    For a C++ language testcase, add the testcase under the CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].cpptest
    

    A third category of tests are C++ language testcases testing multiple modules (the %import directive). These require more than one shared library (dll/shared object) to be built and so are separated out from the normal C++ testcases. Add the testcase under the MULTI_CPP_TEST_CASES list in Examples/test-suite/common.mk and execute individually as:

    make -s [testcase].multicpptest
    

    To delete the generated files, execute:

    make -s [testcase].clean
    

    If you would like to see the exact commands being executed, drop the -s option:

    make [testcase].ctest
    make [testcase].cpptest
    make [testcase].multicpptest
    

    Some real examples of each:

    make -s ret_by_value.clean
    make -s ret_by_value.ctest
    make -s bools.cpptest
    make -s imports.multicpptest
    

    Advanced usage of the test-suite facilitates running tools on some of the five stages. The make variables SWIGTOOL and RUNTOOL are used to specify a tool to respectively, invoke SWIG and the execution of the runtime test. You are advised to view the Examples/test-suite/common.mk file for details but for a short summary, the classic usage is to use Valgrind for memory checking. For example, checking for memory leaks when running the runtime test in the target language interpreter:

    make ret_by_value.ctest RUNTOOL="valgrind --leak-check=full"
    

    This will probably make more sense if you look at the output of the above as it will show the exact commands being executed. SWIG can be analyzed for bad memory accesses using:

    make ret_by_value.ctest SWIGTOOL="valgrind --tool=memcheck --trace-children=yes"
    

    A debugger can also be invoked easily on an individual test, for example gdb:

    make ret_by_value.ctest RUNTOOL="gdb --args"
    

    SWIG reads the SWIG_FEATURES environment variable to obtain options in addition to those passed on the command line. This is particularly useful as the entire test-suite or a particular testcase can be run customized by using additional arguments, for example the -O optimization flag can be added in, as shown below for the bash shell:

    env SWIG_FEATURES=-O make check-python-test-suite
    

    The syntax for setting environment variables varies from one shell to the next, but it also works as shown in the example below, where some typemap debugging is added in:

    make ret_by_value.ctest SWIG_FEATURES="-debug-tmsearch"
    

    There is also a special 'errors' test-suite which is a set of regression tests checking SWIG warning and error messages. It can be run in the same way as the other language test-suites, replacing [lang] with errors, such as make check-errors-test-suite. The test cases used and the way it works is described in Examples/test-suite/errors/Makefile.in.

    41.10.13 Documentation

    Don't forget to write end-user documentation for your language module. Currently, each language module has a dedicated chapter You shouldn't rehash things that are already covered in sufficient detail in the SWIG Basics and SWIG and C++ chapters. There is no fixed format for what, exactly, you should document about your language module, but you'll obviously want to cover issues that are unique to your language.

    Some topics that you'll want to be sure to address include:

    • Command line options unique to your language module.
    • Non-obvious mappings between C/C++ and target language concepts. For example, if your target language provides a single floating point type, it should be no big surprise to find that C/C++ float and double types are mapped to it. On the other hand, if your target language doesn't provide support for "classes" or something similar, you'd want to discuss how C++ classes are handled.
    • How to compile the SWIG-generated wrapper code into shared libraries that can actually be used. For some languages, there are well-defined procedures for doing this, but for others it's an ad hoc process. Provide as much detail as appropriate, and links to other resources if available.

    41.10.14 Prerequisites for adding a new language module to the SWIG distribution

    If you wish for a new language module to be distributed with SWIG, which we encourage for all popular languages, there are a few requirements. While we appreciate that getting all aspects of a new language working won't happen at the outset, there are a set of minimum requirements before a module can be committed into the official Github repository for distribution with future versions of SWIG. The following are really a summary of this whole section with details being outlined earlier on.

    1. Demonstrate basic C code working by porting the "simple" example including a runtime test, see for example Examples/python/simple.
    2. Demonstrate basic C++ code working by porting the "class" example including a runtime test, see for example Examples/python/class.
    3. Modify configure.ac, Makefile.in and Examples/Makefile.in to run these examples. Please make sure that if the new language is not installed properly on a box, make -k check should still work by skipping the tests and examples for the new language module.
    4. Get the test-suite running for the new language (make check-[lang]-test-suite). While the test-suite tests many corner cases, we'd expect the majority of it to work by compiling the generated code correctly as most of the corner cases are covered in the SWIG core. Get at least one C and one C++ runtime test running in the test-suite.
    5. Provide a chapter in the html documentation on the basics of using the language module.
    6. Ensure your source code is formatted according to the coding style guidelines.
    7. Finally, email the SWIG developers with a patch and a demonstration of commitment to maintaining the language module, certainly in the short term and ideally long term.

    Once accepted into the official Git repository, development efforts should concentrate on getting the entire test-suite to work with plenty of runtime tests. Runtime tests should be for existing testcases and new test cases should be added should there be an area not already covered by the existing tests.

    41.10.15 Coding style guidelines

    The coding guidelines for the C/C++ source code are pretty much K&R C style. The style can be inferred from the existing code base and is largely dictated by the indent code beautifier tool set to K&R style. The code can formatted using the make targets in the Source directory. Below is an example of how to format the emit.cxx file:

    $ cd Source
    $ make beautify-file INDENTFILE=Modules/emit.cxx
    

    Of particular note is indentation is set to 2 spaces and a tab is used instead of 8 spaces. The generated C/C++ code should also follow this style as close as possible. However, tabs should be avoided as unlike the SWIG developers, users will never have consistent tab settings.

    41.11 Debugging Options

    There are various command line options which can aid debugging a SWIG interface as well as debugging the development of a language module. These are as follows:

    -debug-classes    - Display information about the classes found in the interface
    -debug-module <n> - Display module parse tree at stages 1-4, <n> is a csv list of stages
    -debug-symtabs    - Display symbol tables information
    -debug-symbols    - Display target language symbols in the symbol tables
    -debug-csymbols   - Display C symbols in the symbol tables
    -debug-lsymbols   - Display target language layer symbols
    -debug-tags       - Display information about the tags found in the interface
    -debug-template   - Display information for debugging templates
    -debug-top <n>    - Display entire parse tree at stages 1-4, <n> is a csv list of stages
    -debug-typedef    - Display information about the types and typedefs in the interface
    -debug-typemap    - Display information for debugging typemaps
    -debug-tmsearch   - Display typemap search debugging information
    -debug-tmused     - Display typemaps used debugging information
    

    The complete list of command line options for SWIG are available by running swig -help.

    41.12 Guide to parse tree nodes

    This section describes the different parse tree nodes and their attributes.

    cdecl

    Describes general C declarations including variables, functions, and typedefs. A declaration is parsed as "storage T D" where storage is a storage class, T is a base type, and D is a declarator.

    "name"          - Declarator name
    "type"          - Base type T
    "decl"          - Declarator type (abstract)
    "storage"       - Storage class (static, extern, typedef, etc.)
    "parms"         - Function parameters (if a function)
    "code"          - Function body code (if supplied)
    "value"         - Default value (if supplied)
    

    constructor

    C++ constructor declaration.

    "name"          - Name of constructor
    "parms"         - Parameters
    "decl"          - Declarator (function with parameters)
    "code"          - Function body code (if any)
    "feature:new"   - Set to indicate return of new object.
    

    destructor

    C++ destructor declaration.

    "name"          - Name of destructor
    "code"          - Function body code (if any)
    "storage"       - Storage class (set if virtual)
    "value"         - Default value (set if pure virtual).
    

    access

    C++ access change.

    "kind"          - public, protected, private
    

    constant

    Constant created by %constant or #define.

    "name"          - Name of constant.
    "type"          - Base type.
    "value"         - Value.
    "storage"       - Set to %constant
    "feature:immutable" - Set to indicate read-only
    

    class

    C++ class definition or C structure definition.

    "name"          - Name of the class.
    "kind"          - Class kind ("struct", "union", "class")
    "symtab"        - Enclosing symbol table.
    "tdname"        - Typedef name. Use for typedef struct { ... } A.
    "abstract"      - Set if class has pure virtual methods.
    "baselist"      - List of base class names.
    "storage"       - Storage class (if any)
    "unnamed"       - Set if class is unnamed.
    

    enum

    Enumeration.

    "name"          - Name of the enum (if supplied).
    "storage"       - Storage class (if any)
    "tdname"        - Typedef name (typedef enum { ... } name).
    "unnamed"       - Set if enum is unnamed.
    

    enumitem

    Enumeration value.

    "name"          - Name of the enum value.
    "type"          - Type (integer or char)
    "value"         - Enum value (if given)
    "feature:immutable" - Set to indicate read-only
    

    namespace

    C++ namespace.

    "name"          - Name of the namespace.
    "symtab"        - Symbol table for enclosed scope.
    "unnamed"       - Set if unnamed namespace
    "alias"         - Alias name. Set for namespace A = B;
    

    using

    C++ using directive.

    "name"          - Name of the object being referred to.
    "uname"         - Qualified name actually given to using.
    "node"          - Node being referenced.
    "namespace"     - Namespace name being reference (using namespace name)
    

    classforward

    A forward C++ class declaration.

    "name"          - Name of the class.
    "kind"          - Class kind ("union", "struct", "class")
    

    insert

    Code insertion directive. For example, %{ ... %} or %insert(section).

    "code"          - Inserted code
    "section"       - Section name ("header", "wrapper", etc.)
    

    top

    Top of the parse tree.

    "module"        - Module name
    

    extend

    %extend directive.

    "name"          - Module name
    "symtab"        - Symbol table of enclosed scope.
    

    apply

    %apply pattern { patternlist }.

    "pattern"       - Source pattern.
    "symtab"        - Symbol table of enclosed scope.
    

    clear

    %clear patternlist;

    "firstChild"    - Patterns to clear
    

    include

    %include directive.

    "name"         - Filename
    "firstChild"   - Children
    

    import

    %import directive.

    "name"         - Filename
    "firstChild"   - Children
    

    module

    %module directive.

    "name"         - Name of the module
    

    typemap

    %typemap directive.

    "method"       - Typemap method name.
    "code"         - Typemap code.
    "kwargs"       - Keyword arguments (if any)
    "firstChild"   - Typemap patterns
    

    typemapcopy

    %typemap directive with copy.

    "method"       - Typemap method name.
    "pattern"      - Typemap source pattern.
    "firstChild"   - Typemap patterns
    

    typemapitem

    %typemap pattern. Used with %apply, %clear, %typemap.

    "pattern"      - Typemap pattern (a parameter list)
    "parms"        - Typemap parameters.
    

    types

    %types directive.

    "parms"        - List of parameter types.
    "convcode"     - Code which replaces the default casting / conversion code
    

    extern

    extern "X" { ... } declaration.

    "name"       - Name "C", "Fortran", etc.
    

    41.13 Further Development Information

    There is further documentation available on the internals of SWIG, API documentation and debugging information. This is shipped with SWIG in the Doc/Devel directory.

    swig-3.0.12/Doc/Manual/android-simple.png0000664000175000017500000001726413042756442020006 0ustar williamwilliam‰PNG  IHDRÎv)r{IDATxœí”UU½Ço ©©é³Ÿýì­·ÞzÇwüð‡?¼þúë]Ô§>õ)µùý7>¨w¿üòËoºé¦t:ýàƒ®^½ú[ßúÖ7¿ùMIÔç?ÿù›o¾yîܹcÇŽÍ;rÄð“Ÿ0lð rGØ©NÞ 02Ž‹.ºhn€[n¹åÅ_üç?ÿù‹_üâöÛoFM:ÕåÒhpÙe—¹¨òòò7Þxã¯ýë»ï¾û—¿üå׿þµ”ÁÅ*eqqqìÙ¡÷!Ѽæšk¾öµ¯Iô~øay¾úÕ¯®\¹²¶¶öë_ÿú7¾ñÏ|æ3R’hÆ¢qE%M¾ás+î;ëŽû&訸ïlçYxß„›—ŸyÉôñg×¢ô£². ^_ÕÕ z_}õÕÁ¨É“'»\ãÇŸ5k–‹zÉã¹çž“æÈ³}ûöW_}ÕÅjà;ûì³;érCn¾ô¥/©WRwfjˆ~á…t¸sçΫ®º*6×–-[öíÛWUUež{î¹?þøþðÝ_ õ¹Ï¨Éᥗ^ZQQ!+@†Ciié%—\"W†Æµ×^k{F+Á¡\S&O™ûøûží·üùÄŠç<ŸyîîCw>:pê”)gÙ‡Œ™Of¢z«/¿ñÆe̼óÎ;ºÒ]…ŸwÞy.—ælúU«Ví‹cÍš56Rj{vèT}ôQ‰¬î…À†ÜvÛmo½õVccãOúS…k´æª¬¬´wð‹_ü¢ yöÙgß{ï=‰þÚµk—/_žû¤#FŒY¡û~×]w=ñį¿þúßÿþ÷_þò—O>ùä’%K®X‰{4ãy“λþ®1Ë·}¸z[BîkŽ™ué%Éä¬drvrÖœdòÒdòâ9³fNŸ9½èŒ"¥Ï[†Äqæ™gªk—¦>ýôÓê¶uÔ+H4ŠÉ°yûí·u!4&(z}—Ksp %%%jŒ®ò‹-¨Sq~õ%š@ŸvÚi±g‡ÎCÖ¶¤ݺurþóŸ»pÝq둱ºgÏyæÏŸ¯ýÝï~W~'Vuöºï_øÂl¬üšê^ËôÝïyO>ùdMùÔåÿñ”DmÛ¶M¢%÷•W^ùóŸÿ,C±Ã† å5bÄÉ¢÷ ªz&QõtŸª-‰O/ýÉiŸœ=köW¬yçÿÞÙ¹ó…ÊÊÏMŸ:}ÊESN;ÕˆSÇ(€¦#à4`©ºj§ì6Ín¥°¦OŸ®Jÿä'?QˆÒœ~úé­Õ5J×bµÇ† þ·Mÿûßÿ¾Í~ìã£|ît 7ÜpƒZ·5¨½“Éä—¿üe;J+Dcþ?þñ òë†J{ì1§ÿåÿñ,Wã€lãýž÷¬³Î’e¡þ^«Æù§L™"‰Ò$Xv„b‡L?|øÐqcO½å‘ƒïþŸßûTâž§þåž§so:éüIKÒé×_}m÷뻯H]9iây“&NRi#GÒ8)‰²}¦©jpœ1c†,6õ Ò{É®,Cpœ‡„Øå’Kî¾ûn…ÿà?pfzç× «ØÅ‹+¥¬Ø³Cg#kÛ*€ ‘aãn:c¨NB)ÅôkªúÈ#(Á½÷Þ«(« »víºÿþû52H$$ĹOªßÊ̲eËš››5åP‡¨ÙˆŒ*vðàÁÁôC‡ •VT®í·øÛN?‘Ho0ÇìkŽ¿éÆ›^ØþÂk¯¼¶mû¶]/¾¨š\TrÑØÓÆ=y¨ruŒH“ì,D›F¨t:-ãG  oݺUS7MÑÐÌ%Sï{ßûž:ŒçŸÞ ýo¼áüºè?ü°Ò(e¨ÁÐeD@]ò¢E‹48kœ×ýR袞yæ™ßÿþ÷êªëëë•K½Fo«wÞy§¬_¿^~W9Îxâ‰'Ú·ŸbÓ¦MÏ=÷ÜSO=%ÐDB]¡£½á¨Q#¦N›>;5¸ìþûÜc‰ÿ|,±øÛ‰’+Žqòˆ“‡Ÿ|ö¹g?ÞðdÍWª'Nœ4rÄÈ“†žtâ 'žÔ”[ uðwÙj2ߥåRwõ ÁZüñ.‹üj§¬Æ|ðg?û™ú_ýêWÎÿÒK/ÉpT¥Ìvjèl$pº/¿ür4J¢©(õúò«V'¥®:ô$CÝvMM<ÕÕÕJ¶qãFùeÇç8£dã„N°2£éŸ,u’%M!Ôo*P±AY 3z̸3ÆÏPù_ ‹þ;1ë¦)á ãYt¦ “aC‡§LÇ*,,ñ et±‡~¸j/#Rª)Wþ#Ž8ÂÅ*å!‡ÒI—zR€|ä#’Ýzý\¶l™:DM)e÷+ÄFÅ*€P͆fA¦—æ“ÇëÛWy+ÀÑq¨*z[oËĉïºë.Y~.D±cÇŽUÊ`®SN9EÃVl™A”æÔSO æ…ÞîµfºêccmT‡ÈCÇ(€l)Éú´ý¡4êÝ].‰õ9眳ß\– & z7îÑ£G“%Ž)S¦¨Cìå­‡ô"òV€€^ 4y+Àa½ˆ¼ vemíªZ\ÜÞá¶GªWV›ÌÞ!õ ÿ¨ZQ Ç¿çûóV€ê“Ó¹UË«ÒKÓUËZÜei£ ™iä*™Ñ7kÊY–öÝeUÁôÑÒ²¹¹Ï‚‹uójLN{È_¹¤²rQeùÂòÊ…•ò5ü-¯¦ñõd™¯!&AK¸ªZZeËÑáûU”Ó„@9¹ý¶|{È¿ßôøñç?x]²s%©ÍÛ›ß~ïm±cçI°t ½$mÜ¥ž,.1®Âeo)MÃÆ“Æ 7R¾$-åÑ¡Bö¾µWÇŽ—M!RM•Ù°¡Á/Е™Y²üpeaeõªê}ûö5nj4êä)¤IiÕ2³æ¸¸íU€ÀQ¿Öüé¡ik“d®isSyE¹‘¼…•ƳÐ<\ÉhÓ–&²lA™~ÚÃD-(¯[Sg Ùâ²Å"‘mÞÖœ‘xA¹óØ’Ûâ±çU”²¨(©™MïÒXÍ Užƒ#oÙÙ%pê°Kç”–Í/K]—Ú»w¯†‚²ËÔ—+J3c+”n¹õëë%ÓŠ²ÿ”·ÊS¿®Þ¦LÍK)£n[OãæF3>ìÝ«=oîQÞæ­Í©S¶äºµuŠRxåÒJUÉ(Àú†äܤ…›Äۛ̀#û*sv‹›ÿ°¼ÚZùÎ}û-cÿH¾ìÎ/3Ñ[o—Î-•ÈJ(5DHj•@ón#Óëê­¸K"¥ÐÔ‚”üJl Q·--ò`]½ ó_ÒWv™y¨«?êã¥3V…¤ Fз5KüŒKÓÆâÚР4¶äô"oˆÔ÷@vóVnêòKè%Uêò%vr%÷Ö(’ØI¦5>¨ó–\îÚ½K¹í­uÈSVaTE¢,¥óK]! Tˆ•{¥´¹$ÐÅïÙ³Gå”\X" Ç”° ÌŠ»,(JI” t;¯°ºaͰPýñàþ¼Àå´‡@òšœÜ±}Ǿ÷ö¥æ§di9ÞÖ¬~Z½µDVr)5p¢Y:¯T!J‰¦dW?•KÆŒ(åR¸¬—°¬­/™Z"m‘”Ë£~ÝW+ؽ+¨fv¬Z¹W¸õ„êÏq€ùKÓUK[ž½,M7mjÒ´U=´dZmºó¹¥Ö/¡—ŒÚXš`eZÂ* ±ÆIíªZ• ÑW®B¤ {vï1FÑÜT•gÊ[KÆz¤cVäñ ÂWɽòªLÙB.½¢lǯFš¹DMµ(‡êÿ÷ç?d–bì{ÍÞ{[‚[»ºÖôåóS;¶cF?ÍLÀ›†jÂêdº|a¹´Â΀nÔTK|m2‰xÝê:•à&ÁU-“Zé‰Q€Ý»ä±3oóòaI¥û÷°bíƒQ›^³e·ÅÊ•"ýø£þüG€àóø%iÍDÍÜ÷:s˜'ÞOç‰J¸Õ‹«c.™Q"¿(65Êcþ˜d-O<íRÿé§-Á{ j‹ÒØ¢\i¯¿7š6§ÔÔÁ‹²OE[ëИñŽwI» pøÒVxèz<¿ÐUlO|ÕU›ç¤ Êì«1‰¯Ñ“@ ¦k_Ôš«õ‘fù*Ê*R_UyýÒZêà¿ àày+€£ keNn(<6¥ÄÑØúÞ³|Y&ö•”a¿y£®rù¯½64˜ q‹ˆãâ¶ÝmÏÐîóU.ªtfŒŽÔu)¿ão—ìºÞÝõñÝ~5q?pnŒíÐÉ«[ãÐ>éOFžÊ¶?¸¸Q·KG\Üžævõ€‹Û£Ü¼|úè_<©89'Y:§´ó\¢=ÿÞèTúÔ¯zeµYë¶µ¹ikSç¹M››jWÕJÙº»Åª–WízŬ?3nç»}·ª&ÿuKÇ®—wííB¤ÝÝb€öOX{ßì:·»[ @BÙ*{:Ù}Ó,“îîPv1ÝÝb€¾Tîî׺»ÅöxÿеOi$¦î‰Mgùw3 †žD«ô¿²Ç=µì<¿t »[ ÀHçËæØñòŽNw=Mèîð¥çç&ú&† R8¨ÐìŠï×Óîn1@+æØî»ýêgý%SKjWÕºðŽqwîèî°BÙ¼½Yj]«òWy{5mn*šPdCRóRõëê›·6+’¿xR±”$˜7·ku »[ ÀHç¶æà!°ž¢ñE÷ÆMòسcܺú¦-M2“ä*$9#iT"³„¬Çvstw‹˜½ß¶íP§nÔsÍ`Ø©AÕŠ*…´*ÀÖf»e¢D_“¢y‚Ì$—w?î63tw‹H(ýË[|׎•Þ?tC œ“´ 0zÔè¶+€+ÙW0€žƒJ+[Œë+€ç/Tذ¡¡iSSÁQ6Jžº5uR £^³ôÊjù«–WÙ4A+³UPèQX¹4Çfß•XuMµú~ù%åR†â ÅÉÙIõ÷Ø4fÿÕÕÒ“‚‚…øž-M.$X²q·6uw‹˜ÿjYéÜÜÔ¸¹Ñz:ÉoÇîn1@óE£Ífû6}Xèî°Ý¿•ÎVIÝÔ þÍþ·Ãº»ÅZå~c—¸›»»Å¬ÞEÒïÝÝb€¾ôollØØÐé®§ÝÝb€þô—LÜÀï¡7v²Ÿz ëºbÜr4lhèîH/Mûo¬Ü“ÐÍî÷߈mijÏçœ:þýû×­©³«tÚ´¢³ÝîÖæúµõG±?.ô0 ’3’ö‘©ëRîÚ?ê… »»­kW×Ö­­+_PžèÛ1eŽ>utåBóÕ↠ukêt”W´µp—×Q4®¨uh{®ö•½YN_ó¼âIÅRfá`³£hFáËÚZ¸ËëÓ7Q»ª6ï´=Wûʇ^ƒ[—V:·TGÿýÓKÓå Ë­X$g˜ t7ݤb«WTW¯¬®]YÛ¯_?ý¬ZQ%uMµ~º2^2µ$á­± ^pT²ÛuóêzM5Õ•‹*ÍŒKÓG—×’šŸÒ¥Ø!ƒ‡ë#O°¡š(——+½,­:×­®2lˆMìÚ*8¬Œšï×TËüpHt¬4hXHx+…ê×Õ'<ù+WjÒ{â.IMÍK¹Ÿ1…{Ú¥XIçèQ£Ô„@ò§òÞ‚<¥ Ñ7Q¿¶Þz•ݨ¥gJ©œÂA­K*Â5 är*<½Ä, ¶1”8Ì@}êJ¿O•p¨§´Q2Z$¦Ë¯©–/%‘J(V}¹ü OC”×ýŒbæ«ë¤¶Sœ¢IHÑ„ˆ9Ðâ ‹u$= áš(׺zWBÙue}êéCmDtBKóƒYra‰™g¢Þ49;)²¢æÿ\S«¶põͲ4Vܰ(¬e ÊŠ'Dæ U}œ¨Ì”Q“`®©%f ®ÙÅ B@ œ8Щ_ŸqûeÈ\öýÌik?X+Å™:2WdB„~f-Ü›hJú•¾nm QÉÆâ œNÂ3jh& -‰eSW•Fkâr%ç$­u$ýBð¤W oŸ~D=Ð[É¡ Ï ²“NûhR?«Ãö©¡Ÿ9 —dÛÞ7u]J¢/ATmT® Øù«ÄÑžQÒL­‰Ëeû{)L6p)Íž§ž~F=Ð+ÐÔÓ.×±J41mcÆ6¦Ôd×Î_zb·C‰yÐÙ7|<’‹6§D çZz©A aCƒ{”.Yö³ªÖþ”†T.©,¯(W`(¥{:éVV–Î-µˆ@Ï¥jy•ÄÚ-ŒÉxìí­º‘ø*AÂS }4¥Yˆæ=ãwï¹Ì_;>xÉPèÑM(ò_-e*€ºy‰¾ºy÷þ(¸‚À¥,žT,¿:{öͱBR×¥l¬Ñ.z8~çëÖ%4 c^ f*@Æ ~/€v…O“r+ÜíXB]2”a­ñL –Ù@DÆT†™ªzÆ};–Ð$"K†-“`;if™ ôì“û† þî=ö…@—½íëŽòMÜ-ØE¡GŽláï‡ä³GFèt»­öCöå½}Iÿ>·½ˆYÒÒ×ÿ e÷ì¾û¯[[ç¯4ky,nÙïÕˆ¯yäŒCÕrÿï…q“²ÒöuGù&î&œˆôÐ?6A¶ðv#is²}ÝP«ýúõ³U’ Ù·õí&ª*PbíÄÑÿÃjߌ¿\çØs)÷Õˆ­yèŒFPì£LûÓÆF×ù8”2½4]¿¾^é º•B±¹B+‹r¯&RMT+ýTg¦kJìP.hÆ./Wë&g$]!ê Ír…•¥sKm§¢KŸ#*¾œU¶±î²8B«ž\'bJó¤Ó^UjZìé‚W2ØØ`2¹ºò**(—G¨’JúËhl×]ëmfŽ5]VF8š·ŸóRN¢ì_ÀMãÈq5²¥Œž±Ã*€äÌ ‘6ïm@hC6‰­Šî„.wp¥P|®Ì•E¹WéêÒ»\áEJÁm‚q™·U²oè”Ò¾wSU]mã£r–z±]õän˜êo‹µ’áÂCMËvºªÇn š‡vdÒe´;‹…@?ý“‰[ëlæ~×tÅÑ\½–}:œ5¨\V¸Cl¶«%TóNW€ÖMJn,S·]çãr¹•¤N¤\ÞØ\¡•E¹WÙaTꮢ \pú©K¦›¬’NjÛ¨yŽ’åˆÊ]޽,±'µBãn­[Bb×¶öy™MË}º­KD@eZ• )€±"âú×k½ÜÝϽ¤%·¸dºv¡#ÛÕ—©y§+@h†è:Ÿ v¬´ßóFsEWå^MdØI•¹4íUW¥¨d‹Ê]NhëŠ hP+U¡•T®i¹O—£u‰ˆ˜í½§®•¬#ÛqÚ¡#jpç^ëåî~Û jSJŽƒ!Ù®F0KlÍ»Z¢ë|Zé›Zx¹7Š®,Jä\M”cŸ‡?@·ØH±¶D; w9!ˆ®z &Viæ ™žn»ðPÓrŸ®õò¶Í²¸ÀZᱟå̽ÖË63fMW&Aq vêJl©ýoìmk©l5ïjHÄ­óññ.Š]J´q-¡\Ñ•E‰œ«‰rìó¬BëÞ½¡IpËCÀv(@îr¢›…V=ëŽJoýGC-áѦå8]èžHûU¹ª€?,¬©Ëèƒs®õrÍ µ.t¢8Úg:¬Å¯æÛ ëÈ6ȶµT¶šwŠ´ÕÃoUßÖ' öƒñÙ-ö;èã 4iÕè)7vKCèÙ¸…@Ù^ÚµÍ)íë=7= ]1ÐmD/¾Ì›,»  å‰˜#vÅ@·R€Ð‚“ض£î?´x&÷뀮&¨1/e²“B¢l/Ø#ôÎBÓbûH8ô&/Ç s€nÀÍÊ+Ê£ïÛcßÀ·iEÈÎA gòR€Ü#€#´œzí6rà$Þì}²Æÿ(˜]¨]1ÐdωL‚ç´Õþ±kBìBpkäw ­è*º~-P¶Ý]Ün6±i¢;ÌÈÜÖ7v'™þúÛ½rü±hºx-P"Ëî.ÁÝlbÓ„^¨÷2p®‹ÙIfEïÚ ]¼(·»Kt7›Pšè3ÁÄ:Eì®[ÿ€.^ d )@ìn6¡?\‡v˜1›²xªe¶Êü¿¶ÛIFu¥d*Ÿq@<]¼ÈÚO&~7›¸¿?w˜IÍKI²•Æý©?‘¹“Œ ôý}Ã+2|ºx-%(ܱ»Ù$²ÿÿ?´ÃŒp[n„v’‘æÖiÌdbèâµ@–XáÎ1äØaF:iwR‰î$ãO¼ÄŒOׯJ䯱;ÌØç›JcÕ#v'7iÇ zÁµ@9>‘ÔQŸ¾ò?0 g,ÁÈ› æxVÕ>ˆ~o {ÈxürSæç¢²}Ô©Ÿ jªo®Ï§tÙ ô¹¨¬Ÿ¸jÃgÅb?5Õ«¯ÚOp-PPBŸ‹ÊöQ§¶|V,öK;¬Ó„A¶ ü­¤,ujËgÅb@Û0€¶¯„?qՆϊÅ|j*si@·‘¯„>êÔÆÏŠ…>5Z=šÿ'ޝSé‹2ÃIEND®B`‚swig-3.0.12/Doc/Manual/Perl5.html0000664000175000017500000026167513042756672016262 0ustar williamwilliam SWIG and Perl5

    33 SWIG and Perl5

    Caution: This chapter is under repair!

    This chapter describes SWIG's support of Perl5. Although the Perl5 module is one of the earliest SWIG modules, it has continued to evolve and has been improved greatly with the help of SWIG users. For the best results, it is recommended that SWIG be used with Perl 5.8 or later. We're no longer testing regularly with older versions, but Perl 5.6 seems to mostly work, while older versions don't.

    33.1 Overview

    To build Perl extension modules, SWIG uses a layered approach. At the lowest level, simple procedural wrappers are generated for functions, classes, methods, and other declarations in the input file. Then, for structures and classes, an optional collection of Perl proxy classes can be generated in order to provide a more natural object oriented Perl interface. These proxy classes simply build upon the low-level interface.

    In describing the Perl interface, this chapter begins by covering the essentials. First, the problem of configuration, compiling, and installing Perl modules is discussed. Next, the low-level procedural interface is presented. Finally, proxy classes are described. Advanced customization features, typemaps, and other options are found near the end of the chapter.

    33.2 Preliminaries

    To build a Perl5 module, run SWIG using the -perl option as follows:

    swig -perl example.i
    
    

    This produces two files. The first file, example_wrap.c contains all of the C code needed to build a Perl5 module. The second file, example.pm contains supporting Perl code needed to properly load the module.

    To build the module, you will need to compile the file example_wrap.c and link it with the rest of your program.

    33.2.1 Getting the right header files

    In order to compile, SWIG extensions need the following Perl5 header files:

    #include "Extern.h"
    #include "perl.h"
    #include "XSUB.h"
    

    These are typically located in a directory like this

    /usr/lib/perl/5.14/CORE
    

    The SWIG configuration script automatically tries to locate this directory so that it can compile examples. However, if you need to find out where the directory is located, an easy way to find out is to ask Perl itself:

    $ perl -e 'use Config; print "$Config{archlib}\n";'
    /usr/lib/perl/5.14
    

    33.2.2 Compiling a dynamic module

    The preferred approach to building an extension module is to compile it into a shared object file or DLL. Assuming you have code you need to link to in a file called example.c, you will need to compile your program using commands like this (shown for Linux):

    $ swig -perl example.i
    $ gcc -fPIC example.c
    $ gcc -fPIC -c example_wrap.c -I/usr/lib/perl/5.14/CORE -Dbool=char
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The exact compiler options vary from platform to platform. SWIG tries to guess the right options when it is installed. Therefore, you may want to start with one of the examples in the SWIG/Examples/perl5 directory. If that doesn't work, you will need to read the man-pages for your compiler and linker to get the right set of options. You might also check the SWIG Wiki for additional information.

    When linking the module, the name of the shared object file must match the module name used in the SWIG interface file. If you used `%module example', then the target should be named `example.so', `example.sl', or the appropriate dynamic module name on your system.

    33.2.3 Building a dynamic module with MakeMaker

    It is also possible to use Perl to build dynamically loadable modules for you using the MakeMaker utility. To do this, write a Perl script such as the following:

    # File : Makefile.PL
    use ExtUtils::MakeMaker;
    WriteMakefile(
            `NAME'    => `example',                  # Name of package
            `LIBS'    => [`-lm'],                    # Name of custom libraries
            `OBJECT'  => `example.o example_wrap.o'  # Object files
    );
    
    

    Now, to build a module, simply follow these steps:

    $ perl Makefile.PL
    $ make
    $ make install
    

    If you are planning to distribute a SWIG-generated module, this is the preferred approach to compilation. More information about MakeMaker can be found in "Programming Perl, 2nd ed." by Larry Wall, Tom Christiansen, and Randal Schwartz.

    33.2.4 Building a static version of Perl

    If you machine does not support dynamic loading or if you've tried to use it without success, you can build a new version of the Perl interpreter with your SWIG extensions added to it. To build a static extension, you first need to invoke SWIG as follows:

    $ swig -perl -static example.i
    

    By default SWIG includes code for dynamic loading, but the -static option takes it out.

    Next, you will need to supply a main() function that initializes your extension and starts the Perl interpreter. While, this may sound daunting, SWIG can do this for you automatically as follows:

    %module example
    
    %inline %{
    extern double My_variable;
    extern int fact(int);
    %}
    
    // Include code for rebuilding Perl
    %include <perlmain.i>
    

    The same thing can be accomplished by running SWIG as follows:

    $ swig -perl -static -lperlmain.i example.i
    

    The perlmain.i file inserts Perl's main() function into the wrapper code and automatically initializes the SWIG generated module. If you just want to make a quick a dirty module, this may be the easiest way. By default, the perlmain.i code does not initialize any other Perl extensions. If you need to use other packages, you will need to modify it appropriately. You can do this by just copying perlmain.i out of the SWIG library, placing it in your own directory, and modifying it to suit your purposes.

    To build your new Perl executable, follow the exact same procedure as for a dynamic module, but change the link line to something like this:

    $ gcc example.o example_wrap.o -L/usr/lib/perl/5.14/CORE \
            -lperl -lsocket -lnsl -lm -o myperl
    

    This will produce a new version of Perl called myperl. It should be functionality identical to Perl with your C/C++ extension added to it. Depending on your machine, you may need to link with additional libraries such as -lsocket, -lnsl, -ldl, etc.

    33.2.5 Using the module

    To use the module, simply use the Perl use statement. If all goes well, you will be able to do this:

    $ perl
    use example;
    print example::fact(4), "\n";
    24
    

    A common error received by first-time users is the following:

    use example;
    Can't locate example.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at - line 1.
    BEGIN failed--compilation aborted at - line 1.
    

    This error is almost caused when the name of the shared object file you created doesn't match the module name you specified with the %module directive.

    A somewhat related, but slightly different error is this:

    use example;
    Can't find 'boot_example' symbol in ./example.so
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error is generated because Perl can't locate the module bootstrap function in the SWIG extension module. This could be caused by a mismatch between the module name and the shared library name. However, another possible cause is forgetting to link the SWIG-generated wrapper code with the rest of your application when you linked the extension module.

    Another common error is the following:

    use example;
    Can't load './example.so' for module example: ./example.so: 
    undefined symbol: Foo at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    

    This error usually indicates that you forgot to include some object files or libraries in the linking of the shared library file. Make sure you compile both the SWIG wrapper file and your original program into a shared library file. Make sure you pass all of the required libraries to the linker.

    Sometimes unresolved symbols occur because a wrapper has been created for a function that doesn't actually exist in a library. This usually occurs when a header file includes a declaration for a function that was never actually implemented or it was removed from a library without updating the header file. To fix this, you can either edit the SWIG input file to remove the offending declaration or you can use the %ignore directive to ignore the declaration. Better yet, update the header file so that it doesn't have an undefined declaration.

    Finally, suppose that your extension module is linked with another library like this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -o example.so
    

    If the foo library is compiled as a shared library, you might get the following error when you try to use your module:

    use example;
    Can't load './example.so' for module example: libfoo.so: cannot open shared object file: 
    No such file or directory at /usr/lib/perl/5.14/i386-linux/DynaLoader.pm line 169.
    
     at - line 1
    BEGIN failed--compilation aborted at - line 1.
    >>>                 
    

    This error is generated because the dynamic linker can't locate the libfoo.so library. When shared libraries are loaded, the system normally only checks a few standard locations such as /usr/lib and /usr/local/lib. To get the loader to look in other locations, there are several things you can do. First, you can recompile your extension module with extra path information. For example, on Linux you can do this:

    $ gcc -shared example.o example_wrap.o -L/home/beazley/projects/lib -lfoo \
          -Xlinker -rpath /home/beazley/projects/lib \
          -o example.so
    

    Alternatively, you can set the LD_LIBRARY_PATH environment variable to include the directory with your shared libraries. If setting LD_LIBRARY_PATH, be aware that setting this variable can introduce a noticeable performance impact on all other applications that you run. To set it only for Perl, you might want to do this instead:

    $ env LD_LIBRARY_PATH=/home/beazley/projects/lib perl
    

    Finally, you can use a command such as ldconfig (Linux) or crle (Solaris) to add additional search paths to the default system configuration (this requires root access and you will need to read the man pages).

    33.2.6 Compilation problems and compiling with C++

    Compilation of C++ extensions has traditionally been a tricky problem. Since the Perl interpreter is written in C, you need to take steps to make sure C++ is properly initialized and that modules are compiled correctly.

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -perl example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ g++ -shared example.o example_wrap.o -o example.so
    

    In addition to this, you may need to include additional library files to make it work. For example, if you are using the Sun C++ compiler on Solaris, you often need to add an extra library -lCrun like this:

    $ swig -c++ -perl example.i
    $ CC -Kpic -c example.cxx
    $ CC -Kpic -c example_wrap.cxx -I/usr/lib/perl/5.14/i386-linux/CORE
    $ CC -shared example.o example_wrap.o -o example.so -lCrun
    

    Of course, the names of the extra libraries are completely non-portable---you will probably need to do some experimentation.

    Another possible compile problem comes from recent versions of Perl (5.8.0) and the GNU tools. If you see errors having to do with _crypt_struct, that means _GNU_SOURCE is not defined and it needs to be. So you should compile the wrapper like:

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE -D_GNU_SOURCE
    

    -D_GNU_SOURCE is also included in the Perl ccflags, which can be found by running

    $ perl -e 'use Config; print "$Config{ccflags}\n";'
    

    So you could also compile the wrapper like

    $ g++ -fPIC -c example_wrap.cxx -I/usr/lib/perl/5.8.0/CORE \
    `perl -MConfig -e 'print $Config{ccflags}'`
    

    Sometimes people have suggested that it is necessary to relink the Perl interpreter using the C++ compiler to make C++ extension modules work. In the experience of this author, this has never actually appeared to be necessary on most platforms. Relinking the interpreter with C++ really only includes the special run-time libraries described above---as long as you link your extension modules with these libraries, it should not be necessary to rebuild Perl.

    If you aren't entirely sure about the linking of a C++ extension, you might look at an existing C++ program. On many Unix machines, the ldd command will list library dependencies. This should give you some clues about what you might have to include when you link your extension module. For example, notice the first line of output here:

    $ ldd swig
            libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40019000)
            libm.so.6 => /lib/libm.so.6 (0x4005b000)
            libc.so.6 => /lib/libc.so.6 (0x40077000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    $
    

    If linking wasn't enough of a problem, another major complication of C++ is that it does not define any sort of standard for binary linking of libraries. This means that C++ code compiled by different compilers will not link together properly as libraries nor is the memory layout of classes and data structures implemented in any kind of portable manner. In a monolithic C++ program, this problem may be unnoticed. However, in Perl, it is possible for different extension modules to be compiled with different C++ compilers. As long as these modules are self-contained, this probably won't matter. However, if these modules start sharing data, you will need to take steps to avoid segmentation faults and other erratic program behavior. Also, be aware that certain C++ features, especially RTTI, can behave strangely when working with multiple modules.

    It should be noted that you may get a lot of error messages about the 'bool' datatype when compiling a C++ Perl module. If you experience this problem, you can try the following:

    • Use -DHAS_BOOL when compiling the SWIG wrapper code
    • Or use -Dbool=char when compiling.

    Finally, recent versions of Perl (5.8.0) have namespace conflict problems. Perl defines a bunch of short macros to make the Perl API function names shorter. For example, in /usr/lib/perl/5.8.0/CORE/embed.h there is a line:

    #define do_open Perl_do_open
    

    The problem is, in the <iostream> header from GNU libstdc++v3 there is a private function named do_open. If <iostream> is included after the perl headers, then the Perl macro causes the iostream do_open to be renamed, which causes compile errors. Hopefully in the future Perl will support a PERL_NO_SHORT_NAMES flag, but for now the only solution is to undef the macros that conflict. Lib/perl5/noembed.h in the SWIG source has a list of macros that are known to conflict with either standard headers or other headers. But if you get macro type conflicts from other macros not included in Lib/perl5/noembed.h while compiling the wrapper, you will have to find the macro that conflicts and add an #undef into the .i file. Please report any conflicting macros you find to swig-user mailing list.

    33.2.7 Compiling for 64-bit platforms

    On platforms that support 64-bit applications (Solaris, Irix, etc.), special care is required when building extension modules. On these machines, 64-bit applications are compiled and linked using a different set of compiler/linker options. In addition, it is not generally possible to mix 32-bit and 64-bit code together in the same application.

    To utilize 64-bits, the Perl executable will need to be recompiled as a 64-bit application. In addition, all libraries, wrapper code, and every other part of your application will need to be compiled for 64-bits. If you plan to use other third-party extension modules, they will also have to be recompiled as 64-bit extensions.

    If you are wrapping commercial software for which you have no source code, you will be forced to use the same linking standard as used by that software. This may prevent the use of 64-bit extensions. It may also introduce problems on platforms that support more than one linking standard (e.g., -o32 and -n32 on Irix).

    33.3 Building Perl Extensions under Windows

    Building a SWIG extension to Perl under Windows is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Perl interpreter. This section assumes you are using SWIG with Microsoft Visual C++ although the procedure may be similar with other compilers.

    33.3.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly requires these steps:

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (ie. example_wrap.c). Note: If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -perl5 -o $(ProjDir)\$(InputName)_wrap.cxx $(InputPath)" in the "Build command(s) field"
    • Enter "$(ProjDir)\$(InputName)_wrap.cxx" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to "C++:Preprocessor". Add the include directories for your Perl 5 installation under "Additional include directories".
    • Define the symbols WIN32 and MSWIN32 under preprocessor options. If using the ActiveWare port, also define the symbol PERL_OBJECT. Note that all extensions to the ActiveWare port must be compiled with the C++ compiler since Perl has been encapsulated in a C++ class.
    • Finally, select the settings for the entire project and go to "Link Options". Add the Perl library file to your link libraries. For example "perl.lib". Also, set the name of the output file to match the name of your Perl module (ie. example.dll).
    • Build your project.

    Now, assuming you made it this far, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Perl extension, simply run Perl and use the use command as normal. For example:

    DOS > perl
    use example;
    $a = example::fact(4);
    print "$a\n";
    
    

    33.3.2 Using other compilers

    SWIG is known to work with Cygwin and may work with other compilers on Windows. For general hints and suggestions refer to the Windows chapter.

    33.4 The low-level interface

    At its core, the Perl module uses a simple low-level interface to C function, variables, constants, and classes. This low-level interface can be used to control your application. However, it is also used to construct more user-friendly proxy classes as described in the next section.

    33.4.1 Functions

    C functions are converted into new Perl built-in commands (or subroutines). For example:

    %module example
    int fact(int a);
    ...
    

    Now, in Perl:

    use example;
    $a = &example::fact(2);
    

    33.4.2 Global variables

    Global variables are handled using Perl's magic variable mechanism. SWIG generates a pair of functions that intercept read/write operations and attaches them to a Perl variable with the same name as the C global variable. Thus, an interface like this

    %module example;
    ...
    double Spam;
    ...
    

    is accessed as follows:

    use example;
    print $example::Spam, "\n";
    $example::Spam = $example::Spam + 4
    # ... etc ...
    
    

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %{
    extern char *path;
    %}
    %immutable;
    extern char *path;
    %mutable;
    

    The %immutable directive stays in effect until it is explicitly disabled or cleared using %mutable. See the Creating read-only variables section for further details.

    It is also possible to tag a specific variable as read-only like this:

    %{
    extern char *path;
    %}
    %immutable path; 
    ...
    ...
    extern char *path;       // Declared later in the input
    

    33.4.3 Constants

    By default, constants are wrapped as read-only Perl variables. For example:

    %module example
    
    #define FOO 42
    

    In Perl:

    use example;
    print $example::FOO, "\n";   # OK
    $example::FOO = 2;           # Error
    

    Alternatively, if you use swig's -const option, constants are wrapped such that the leading $ isn't required (by using a constant subroutine), which usually gives a more natural Perl interface, for example:

    use example;
    print example::FOO, "\n";
    

    33.4.4 Pointers

    SWIG represents pointers as blessed references. A blessed reference is the same as a Perl reference except that it has additional information attached to it indicating what kind of reference it is. That is, if you have a C declaration like this:

    Matrix *new_Matrix(int n, int m);
    

    The module returns a value generated as follows:

    $ptr = new_Matrix(int n, int m);     # Save pointer return result
    bless $ptr, "p_Matrix";              # Bless it as a pointer to Matrix
    

    SWIG uses the "blessing" to check the datatype of various pointers. In the event of a mismatch, an error or warning message is generated.

    To check to see if a value is the NULL pointer, use the defined() command:

    if (defined($ptr)) {
      print "Not a NULL pointer.";
    } else {
      print "Is a NULL pointer.";
    }
    
    

    To create a NULL pointer, you should pass the undef value to a function.

    The "value" of a Perl reference is not the same as the underlying C pointer that SWIG wrapper functions return. Suppose that $a and $b are two references that point to the same C object. In general, $a and $b will be different--since they are different references. Thus, it is a mistake to check the equality of $a and $b to check the equality of two C pointers. The correct method to check equality of C pointers is to dereference them as follows:

    if ($$a == $$b) {
      print "a and b point to the same thing in C";
    } else {
      print "a and b point to different objects.";
    }
    
    

    As much as you might be inclined to modify a pointer value directly from Perl, don't. Manipulating pointer values is architecture dependent and could cause your program to crash. Similarly, don't try to manually cast a pointer to a new type by reblessing a pointer. This may not work like you expect and it is particularly dangerous when casting C++ objects. If you need to cast a pointer or change its value, consider writing some helper functions instead. For example:

    %inline %{
    /* C-style cast */
    Bar *FooToBar(Foo *f) {
      return (Bar *) f;
    }
    
    /* C++-style cast */
    Foo *BarToFoo(Bar *b) {
      return dynamic_cast<Foo*>(b);
    }
    
    Foo *IncrFoo(Foo *f, int i) {
        return f+i;
    }
    %}
    

    Also, if working with C++, you should always try to use the new C++ style casts. For example, in the above code, the C-style cast may return a bogus result whereas as the C++-style cast will return NULL if the conversion can't be performed.

    Compatibility Note: In earlier versions, SWIG tried to preserve the same pointer naming conventions as XS and xsubpp. Given the advancement of the SWIG typesystem and the growing differences between SWIG and XS, this is no longer supported.

    33.4.5 Structures

    Access to the contents of a structure are provided through a set of low-level accessor functions as described in the "SWIG Basics" chapter. For example,

    struct Vector {
      double x, y, z;
    };
    

    gets mapped into the following collection of accessor functions:

    struct Vector *new_Vector();
    void           delete_Vector(Vector *v);
    double         Vector_x_get(Vector *obj)
    void           Vector_x_set(Vector *obj, double x)
    double         Vector_y_get(Vector *obj)
    void           Vector_y_set(Vector *obj, double y)
    double         Vector_z_get(Vector *obj)
    void           Vector_z_set(Vector *obj, double z)
    
    

    These functions are then used to access structure data from Perl as follows:

    $v = example::new_Vector();
    print example::Vector_x_get($v), "\n";   # Get x component
    example::Vector_x_set($v, 7.8);          # Change x component
    

    Similar access is provided for unions and the data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive. For example:

    struct Foo {
      ...
      %immutable;
      int x;        /* Read-only members */
      char *name;
      %mutable;
      ...
    };
    

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described later).

    Array members are normally wrapped as read-only. For example,

    struct Foo {
      int x[50];
    };
    

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
        return self->x;
    };
    

    If you want to set an array member, you will need to supply a "memberin" typemap described later in this chapter. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Python string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };
    

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
        return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
        b->f = *val;
    }
    

    33.4.6 C++ classes

    C++ classes are wrapped by building a set of low level accessor functions. Consider the following class:

    class List {
    public:
      List();
      ~List();
      int  search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int  length;
    static void print(List *l);
    };
    

    When wrapped by SWIG, the following functions are created:

    List    *new_List();
    void     delete_List(List *l);
    int      List_search(List *l, char *item);
    void     List_insert(List *l, char *item);
    void     List_remove(List *l, char *item);
    char    *List_get(List *l, int n);
    int      List_length_get(List *l);
    void     List_length_set(List *l, int n);
    void     List_print(List *l);
    
    

    In Perl, these functions are used in a straightforward manner:

    use example;
    $l = example::new_List();
    example::List_insert($l, "Ale");
    example::List_insert($l, "Stout");
    example::List_insert($l, "Lager")
    example::List_print($l)
    Lager
    Stout
    Ale
    print example::List_length_get($l), "\n";
    3
    

    At this low level, C++ objects are really just typed pointers. Member functions are accessed by calling a C-like wrapper with an instance pointer as the first argument. Although this interface is fairly primitive, it provides direct access to C++ objects. A higher level interface using Perl proxy classes can be built using these low-level accessors. This is described shortly.

    33.4.7 C++ classes and type-checking

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this

    class Foo {
    ...
    };
    
    class Bar : public Foo {
    ...
    };
    

    and a function

    void spam(Foo *f);
    

    then the function spam() accepts Foo * or a pointer to any class derived from Foo. If necessary, the type-checker also adjusts the value of the pointer (as is necessary when multiple inheritance is used).

    33.4.8 C++ overloaded functions

    If you have a C++ program with overloaded functions or methods, you will need to disambiguate those methods using %rename. For example:

    /* Forward renaming declarations */
    %rename(foo_i) foo(int); 
    %rename(foo_d) foo(double);
    ...
    void foo(int);           // Becomes 'foo_i'
    void foo(char *c);       // Stays 'foo' (not renamed)
    
    class Spam {
    public:
      void foo(int);      // Becomes 'foo_i'
      void foo(double);   // Becomes 'foo_d'
      ...
    };
    

    Now, in Perl, the methods are accessed as follows:

    use example;
    example::foo_i(3);
    $s = example::new_Spam();
    example::Spam_foo_i($s, 3);
    example::Spam_foo_d($s, 3.14);
    

    Please refer to the "SWIG Basics" chapter for more information.

    33.4.9 Operators

    As of version 1.3.27 SWIG automatically renames the most common C++ operators, and maps them into the perl module with the proper 'use overload ...' so you don't need to do any work.

    The following C++ operators are currently supported by the Perl module:

    • operator++
    • operator--
    • operator+
    • operator-
    • operator*
    • operator/
    • operator==
    • operator!=
    • operator%
    • operator>
    • operator<
    • operator and
    • operator or

    33.4.10 Modules and packages

    When you create a SWIG extension, everything gets placed into a single Perl module. The name of the module is determined by the %module directive. To use the module, do the following:

    $ perl5
    use example;                      # load the example module
    print example::fact(4), "\n"      # Call a function in it
    24
    

    Usually, a module consists of a collection of code that is contained within a single file. A package, on the other hand, is the Perl equivalent of a namespace. A package is a lot like a module, except that it is independent of files. Any number of files may be part of the same package--or a package may be broken up into a collection of modules if you prefer to think about it in this way.

    SWIG installs its functions into a package with the same name as the module.

    Incompatible Change: previous versions of SWIG enabled you to change the name of the package by using the -package option, this feature has been removed in order to properly support modules that used nested namespaces, e.g. Foo::Bar::Baz. To give your module a nested namespace simply provide the fully qualified name in your %module directive:

    %module "Foo::Bar::Baz"
    

    NOTE: the double quotes are necessary.

    Using the package option of the %module directive allows you to specify what Perl namespace that the module will be living in when installed. This is useful in the situation where a module maintainer wants to split a large module into smaller pieces to make maintenance easier, but doesn't want to have that affect the module name used by applications. So for example, if I wanted to split XML::Xerces into XML::Xerces::SAX, etc. , but I wanted all the applications to be able to access the classes using the XML::Xerces namespace I could use:

    %module(package="XML::Xerces") "XML::Xerces::SAX
    

    And now all the applications could use the class XML::Xerces::SAXParser. Without the package directive splitting the module would force applications to use the class XML::Xerces::SAX::SAXParser. This could break compatibility for existing applications that are already using the class under the name XML::Xerces::SAXParser.

    33.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }
    

    or perhaps

    int sub(int *x, int *y) {
      return *x+*y;
    }
    

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int  sub(int *INPUT, int *INPUT);
    

    In Perl, this allows you to pass simple values. For example:

    $a = example::add(3, 4);
    print "$a\n";
    7
    $b = example::sub(7, 4);
    print "$b\n";
    3
    

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT  { int *x, int *y};
    
    void add(int x, int y, int *result);
    int  sub(int *x, int *y);
    

    If a function mutates one of its parameters like this,

    void negate(int *x) {
      *x = -(*x);
    }
    

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);
    

    In Perl, a mutated parameter shows up as a return value. For example:

    $a = example::negate(3);
    print "$a\n";
    -3
    

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, along with success code */
    int send_message(char *text, int len, int *success);
    

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *success };
    ...
    int send_message(char *text, int *success);
    

    When used in Perl, the function will return multiple values.

    ($bytes, $success) = example::send_message("Hello World");
    

    Another common use of multiple return values are in query functions. For example:

    void get_dimensions(Matrix *m, int *rows, int *columns);
    

    To wrap this, you might use the following:

    %module example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, *columns);
    

    Now, in Perl:

    ($r, $c) = example::get_dimensions($m);
    

    In certain cases, it is possible to treat Perl references as C pointers. To do this, use the REFERENCE typemap. For example:

    %module example
    %include "typemaps.i"
    
    void add(int x, int y, int *REFERENCE);
    

    In Perl:

    use example;
    $c = 0.0;
    example::add(3, 4, \$c);
    print "$c\n";
    7
    

    Note: The REFERENCE feature is only currently supported for numeric types (integers and floating point).

    33.6 Exception handling

    The SWIG %exception directive can be used to create a user-definable exception handler for converting exceptions in your C/C++ program into Perl exceptions. The chapter on customization features contains more details, but suppose you have a C++ class like the following:

    class RangeError {};   // Used for an exception
    
    class DoubleArray {
      private:
        int n;
        double *ptr;
      public:
        // Create a new array of fixed size
        DoubleArray(int size) {
          ptr = new double[size];
          n = size;
        }
        // Destroy an array
        ~DoubleArray() {
          delete ptr;
        }
        // Return the length of the array
        int   length() {
          return n;
        }
    
        // Get an item from the array and perform bounds checking.
        double getitem(int i) {
          if ((i >= 0) && (i < n))
            return ptr[i];
          else
            throw RangeError();
        }
    
        // Set an item in the array and perform bounds checking.
        void setitem(int i, double val) {
          if ((i >= 0) && (i < n))
            ptr[i] = val;
          else {
            throw RangeError();
          }
        }
      };
    

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Perl extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    class DoubleArray {
    ...
    };
    

    The exception handling code is inserted directly into generated wrapper functions. The $action variable is replaced with the C/C++ code being executed by the wrapper. When an exception handler is defined, errors can be caught and used to gracefully generate a Perl error instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Since this is somewhat inefficient. You might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    
    %exception setitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    If you had a lot of different methods, you can avoid extra typing by using a macro. For example:

    %define RANGE_ERROR
    {
      try {
        $action
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    %enddef
    
    %exception getitem RANGE_ERROR;
    %exception setitem RANGE_ERROR;
    

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on "Customization features" for more examples.

    Compatibility note: In SWIG1.1, exceptions were defined using the older %except directive:

    %except(python) {
      try {
        $function
      }
      catch (RangeError) {
        croak("Array index out-of-bounds");
      }
    }
    

    This is still supported, but it is deprecated. The newer %exception directive provides the same functionality, but it has additional capabilities that make it more powerful.

    33.7 Remapping datatypes with typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Perl C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Perl interface.

    33.7.1 A simple typemap example

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. For example, to convert integers from Perl to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) SvIV($input);
      printf("Received an integer : %d\n", $1);
    }
    ...
    %inline %{
    extern int fact(int n);
    %}
    
    

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variable prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input object (usually a SV *).

    When this example is used in Perl5, it will operate as follows:

    use example;
    $n = example::fact(6);
    print "$n\n";
    ...
    
    Output:
    Received an integer : 6
    720
    

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) SvIV($input);
      printf("n = %d\n", $1);
    }
    %inline %{
    typedef int Integer;
    extern int fact(Integer n);    // Above typemap is applied
    %}
    

    It should be noted that the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, unsigned len) {
        $1 = SvPV($input, $2);
    };
    
    int count(char c, char *str, unsigned len);
    

    When a multi-argument typemap is defined, the arguments are always handled as a single Perl object. This allows the function to be used like this (notice how the length parameter is omitted):

    example::count("e", "Hello World");
    1
    >>>
    

    33.7.2 Perl5 typemaps

    The previous section illustrated an "in" typemap for converting Perl objects to C. A variety of different typemap methods are defined by the Perl module. For example, to convert a C integer back into a Perl object, you might define an "out" typemap like this:

    %typemap(out) int {
        $result = sv_newmortal();
        set_setiv($result, (IV) $1);
        argvi++;
    }
    

    The following typemap methods are available:

    %typemap(in)

    Converts Perl5 object to input function arguments.

    %typemap(out)

    Converts function return value to a Perl5 value.

    %typemap(varin)

    Converts a Perl5 object to a global variable.

    %typemap(varout)

    Converts a global variable to a Perl5 object.

    %typemap(freearg)

    Cleans up a function argument after a function call

    %typemap(argout)

    Output argument handling

    %typemap(ret)

    Clean up return value from a function.

    %typemap(memberin)

    Setting of C++ member data (all languages).

    %typemap(memberout)

    Return of C++ member data (all languages).

    %typemap(check)

    Check value of input parameter.

    33.7.3 Typemap variables

    Within typemap code, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that's supposed to hold an argument value. For output values, this is the raw result that's supposed to be returned to Perl.

    $input

    A Perl object holding the value of an argument of variable value.

    $result

    A Perl object that holds the result to be returned to Perl.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Perl name of the wrapper function being created.

    33.7.4 Useful functions

    When writing typemaps, it is necessary to work directly with Perl5 objects. This, unfortunately, can be a daunting task. Consult the "perlguts" man-page for all of the really ugly details. A short summary of commonly used functions is provided here for reference. It should be stressed that SWIG can be used quite effectively without knowing any of these details--especially now that there are typemap libraries that can already been written.

    Perl Integer Functions

    int   SvIV(SV *);
    void  sv_setiv(SV *sv, IV value);
    SV   *newSViv(IV value);
    int   SvIOK(SV *);
    

    Perl Floating Point Functions

    double SvNV(SV *);
    void   sv_setnv(SV *, double value);
    SV    *newSVnv(double value);
    int    SvNOK(SV *);
    

    Perl String Functions

    char     *SvPV(SV *, STRLEN len);
    void      sv_setpv(SV *, char *val);
    void      sv_setpvn(SV *, char *val, STRLEN len);
    SV       *newSVpv(char *value, STRLEN len);
    int       SvPOK(SV *);
    void      sv_catpv(SV *, char *);
    void      sv_catpvn(SV *, char *, STRLEN);
    

    Perl References

    void      sv_setref_pv(SV *, char *, void *ptr);
    int       sv_isobject(SV *);
    SV       *SvRV(SV *);
    int       sv_isa(SV *, char *0;
    

    33.8 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the files "perl5.swg" and "typemaps.i" in the SWIG library.

    33.8.1 Converting a Perl5 array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Perl5 array reference to be used as a char ** datatype.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      AV *tempav;
      I32 len;
      int i;
      SV  **tv;
      if (!SvROK($input))
        croak("Argument $argnum is not a reference.");
      if (SvTYPE(SvRV($input)) != SVt_PVAV)
        croak("Argument $argnum is not an array.");
      tempav = (AV*)SvRV($input);
      len = av_len(tempav);
      $1 = (char **) malloc((len+2)*sizeof(char *));
      for (i = 0; i <= len; i++) {
        tv = av_fetch(tempav, i, 0);
        $1[i] = (char *) SvPV(*tv, PL_na);
      }
      $1[i] = NULL;
    };
    
    // This cleans up the char ** array after the function call
    %typemap(freearg) char ** {
      free($1);
    }
    
    // Creates a new Perl array and places a NULL-terminated char ** into it
    %typemap(out) char ** {
      AV *myav;
      SV **svs;
      int i = 0, len = 0;
      /* Figure out how many elements we have */
      while ($1[len])
        len++;
      svs = (SV **) malloc(len*sizeof(SV *));
      for (i = 0; i < len ; i++) {
        svs[i] = sv_newmortal();
        sv_setpv((SV*)svs[i], $1[i]);
      };
      myav = av_make(len, svs);
      free(svs);
      $result = newRV_noinc((SV*)myav);
      sv_2mortal($result);
      argvi++;
    }
    
    // Now a few test functions
    %inline %{
      int print_args(char **argv) {
        int i = 0;
        while (argv[i]) {
          printf("argv[%d] = %s\n", i, argv[i]);
          i++;
        }
        return i;
      }
    
      // Returns a char ** list
      char **get_args() {
        static char *values[] = { "Dave", "Mike", "Susan", "John", "Michelle", 0};
        return &values[0];
      }
    %}
    
    

    When this module is compiled, the wrapped C functions can be used in a Perl script as follows:

    use argv;
    @a = ("Dave", "Mike", "John", "Mary");           # Create an array of strings
    argv::print_args(\@a);                           # Pass it to our C function
    $b = argv::get_args();                           # Get array of strings from C
    print @$b, "\n";                                 # Print it out
    

    33.8.2 Return values

    Return values are placed on the argument stack of each wrapper function. The current value of the argument stack pointer is contained in a variable argvi. Whenever a new output value is added, it is critical that this value be incremented. For multiple output values, the final value of argvi should be the total number of output values.

    The total number of return values should not exceed the number of input values unless you explicitly extend the argument stack. This can be done using the EXTEND() macro as in:

    %typemap(argout) int *OUTPUT {
      if (argvi >= items) {
        EXTEND(sp, 1);              /* Extend the stack by 1 object */
      }
      $result = sv_newmortal();
      sv_setiv($target, (IV) *($1));
      argvi++;
    }
    

    33.8.3 Returning values from arguments

    Sometimes it is desirable for a function to return a value in one of its arguments. This example describes the implementation of the OUTPUT typemap.

    %module return
    
    // This tells SWIG to treat an double * argument with name 'OutDouble' as
    // an output value.  
    
    %typemap(argout) double *OUTPUT {
      $result = sv_newmortal();
      sv_setnv($result, *$input);
      argvi++;                     /* Increment return count -- important! */
    }
    
    // We don't care what the input value is. Ignore, but set to a temporary variable
    
    %typemap(in, numinputs=0) double *OUTPUT(double junk) {
      $1 = &junk;
    }
    
    // Now a function to test it
    %{
    /* Returns the first two input arguments */
    int multout(double a, double b, double *out1, double *out2) {
      *out1 = a;
      *out2 = b;
      return 0;
    };
    %}
    
    // If we name both parameters OutDouble both will be output
    
    int multout(double a, double b, double *OUTPUT, double *OUTPUT);
    ...
    

    When this function is called, the output arguments are appended to the stack used to return results. This shows up an array in Perl. For example:

    @r = multout(7, 13);
    print "multout(7, 13) = @r\n";
    ($x, $y) = multout(7, 13);
    

    33.8.4 Accessing array structure members

    Consider the following data structure:

    #define SIZE  8
    typedef struct {
        int   values[SIZE];
        ...
    } Foo;
    
    

    By default, SWIG doesn't know how to the handle the values structure member it's an array, not a pointer. In this case, SWIG makes the array member read-only. Reading will simply return a pointer to the first item in the array. To make the member writable, a "memberin" typemap can be used.

    %typemap(memberin) int [SIZE] {
        int i;
        for (i = 0; i < SIZE; i++) {
            $1[i] = $input[i];
        }
    }
    
    

    Whenever a int [SIZE] member is encountered in a structure or class, this typemap provides a safe mechanism for setting its value.

    As in the previous example, the typemap can be generalized for any dimension. For example:

    %typemap(memberin) int [ANY] {
      int i;
      for (i = 0; i < $1_dim0; i++) {
        $1[i] = $input[i];
      }
    }
    

    When setting structure members, the input object is always assumed to be a C array of values that have already been converted from the target language. Because of this, the memberin typemap is almost always combined with the use of an "in" typemap. For example, the "in" typemap in the previous section would be used to convert an int[] array to C whereas the "memberin" typemap would be used to copy the converted array into a C data structure.

    33.8.5 Turning Perl references into C pointers

    A frequent confusion on the SWIG mailing list is errors caused by the mixing of Perl references and C pointers. For example, suppose you have a C function that modifies its arguments like this:

    void add(double a, double b, double *c) {
      *c = a + b;
    }
    

    A common misinterpretation of this function is the following Perl script:

    # Perl script
    $a = 3.5;
    $b = 7.5;
    $c = 0.0;          # Output value
    add($a, $b, \$c);    # Place result in c (Except that it doesn't work)
    

    To make this work with a reference, you can use a typemap such as this:

    %typemap(in) double * (double dvalue) {
      SV* tempsv;
      if (!SvROK($input)) {
        croak("expected a reference\n");
      }
      tempsv = SvRV($input);
      if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) {
        croak("expected a double reference\n");
      }
      dvalue = SvNV(tempsv);
      $1 = &dvalue;
    }
    
    %typemap(argout) double * {
      SV *tempsv;
      tempsv = SvRV($input);
      sv_setnv(tempsv, *$1);
    }
    

    Now, if you place this before the add function, you can do this:

    $a = 3.5;
    $b = 7.5;
    $c = 0.0;
    add($a, $b, \$c);            # Now it works!
    print "$c\n";
    
    

    33.8.6 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. To convert a pointer from Perl to C, the following function is used:

    int SWIG_ConvertPtr(SV *obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Perl object obj to a C pointer. The result of the conversion is placed into the pointer located at ptr. ty is a SWIG type descriptor structure. flags is used to handle error checking and other aspects of conversion. flags is currently undefined and reserved for future expansion. Returns 0 on success and -1 on error.

    void *SWIG_MakePtr(SV *obj, void *ptr, swig_type_info *ty, int flags)

    Creates a new Perl pointer object. obj is a Perl SV that has been initialized to hold the result, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and flags is a flag that controls properties of the conversion. flags is currently undefined and reserved.

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *f;
    if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &f, SWIGTYPE_p_Foo, 0))) {
      SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
    }
    
    SV *sv = sv_newmortal();
    SWIG_MakePtr(sv, f, SWIGTYPE_p_Foo, 0);
    

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    If necessary, the descriptor for any type can be obtained using the $descriptor() macro in a typemap. For example:

    %typemap(in) Foo * {
      if (!SWIG_IsOK(SWIG_ConvertPtr($input, (void **) &$1, $descriptor(Foo *), 0))) {
        SWIG_exception_fail(SWIG_TypeError, "in method '$symname', expecting type Foo");
      }
    }
    

    33.9 Proxy classes

    Out of date. Needs update.

    Using the low-level procedural interface, SWIG can also construct a high-level object oriented interface to C structures and C++ classes. This is done by constructing a Perl proxy class (also known as a shadow class) that provides an OO wrapper to the underlying code. This section describes the implementation details of the proxy interface.

    33.9.1 Preliminaries

    Proxy classes, are generated by default. If you want to turn them off, use the -noproxy command line option. For example:

    $ swig -c++ -perl -noproxy example.i
    

    When proxy classes are used, SWIG moves all of the low-level procedural wrappers to another package name. By default, this package is named 'modulec' where 'module' is the name of the module you provided with the %module directive. Then, in place of the original module, SWIG creates a collection of high-level Perl wrappers. In your scripts, you will use these high level wrappers. The wrappers, in turn, interact with the low-level procedural module.

    33.9.2 Structure and class wrappers

    Suppose you have the following SWIG interface file:

    %module example
    struct Vector {
      Vector(double x, double y, double z);
      ~Vector();
      double x, y, z;
    };
    
    

    When wrapped, SWIG creates the following set of low-level accessor functions as described in previous sections.

    Vector *new_Vector(double x, double y, double z);
    void    delete_Vector(Vector *v);
    double  Vector_x_get(Vector *v);
    double  Vector_x_set(Vector *v, double value);
    double  Vector_y_get(Vector *v);
    double  Vector_y_set(Vector *v, double value);
    double  Vector_z_get(Vector *v);
    double  Vector_z_set(Vector *v, double value);
    
    

    However, when proxy classes are enabled, these accessor functions are wrapped inside a Perl class like this:

    package example::Vector;
    @ISA = qw( example );
    %OWNER = ();
    %BLESSEDMEMBERS = ();
    
    sub new () {
        my $self = shift;
        my @args = @_;
        $self = vectorc::new_Vector(@args);
        return undef if (!defined($self));
        bless $self, "example::Vector";
        $OWNER{$self} = 1;
        my %retval;
        tie %retval, "example::Vector", $self;
        return bless \%retval, "Vector";
    }
    
    sub DESTROY {
        return unless $_[0]->isa('HASH');
        my $self = tied(%{$_[0]});
        delete $ITERATORS{$self};
        if (exists $OWNER{$self}) {
            examplec::delete_Vector($self));
            delete $OWNER{$self};
        }
    }
    
    sub FETCH {
        my ($self, $field) = @_;
        my $member_func = "vectorc::Vector_${field}_get";
        my $val = &$member_func($self);
        if (exists $BLESSEDMEMBERS{$field}) {
            return undef if (!defined($val));
            my %retval;
            tie %retval, $BLESSEDMEMBERS{$field}, $val;
            return bless \%retval, $BLESSEDMEMBERS{$field};
        }
        return $val;
    }
    
    sub STORE {
        my ($self, $field, $newval) = @_;
        my $member_func = "vectorc::Vector_${field}_set";
        if (exists $BLESSEDMEMBERS{$field}) {
            &$member_func($self, tied(%{$newval}));
        } else {
            &$member_func($self, $newval);
        }
    }
    

    Each structure or class is mapped into a Perl package of the same name. The C++ constructors and destructors are mapped into constructors and destructors for the package and are always named "new" and "DESTROY". The constructor always returns a tied hash table. This hash table is used to access the member variables of a structure in addition to being able to invoke member functions. The %OWNER and %BLESSEDMEMBERS hash tables are used internally and described shortly.

    To use our new proxy class we can simply do the following:

    # Perl code using Vector class
    $v = new Vector(2, 3, 4);
    $w = Vector->new(-1, -2, -3);
    
    # Assignment of a single member
    $v->{x} = 7.5;
    
    # Assignment of all members
    %$v = ( x=>3,
            y=>9,
            z=>-2);
    
    # Reading members
    $x = $v->{x};
    
    # Destruction
    $v->DESTROY();
    
    

    33.9.3 Object Ownership

    In order for proxy classes to work properly, it is necessary for Perl to manage some mechanism of object ownership. Here's the crux of the problem---suppose you had a function like this:

    Vector *Vector_get(Vector *v, int index) {
      return &v[i];
    }
    

    This function takes a Vector pointer and returns a pointer to another Vector. Such a function might be used to manage arrays or lists of vectors (in C). Now contrast this function with the constructor for a Vector object:

    Vector *new_Vector(double x, double y, double z) {
      Vector *v;
      v = new Vector(x, y, z);        // Call C++ constructor
      return v;
    }
    

    Both functions return a Vector, but the constructor is returning a brand-new Vector while the other function is returning a Vector that was already created (hopefully). In Perl, both vectors will be indistinguishable---clearly a problem considering that we would probably like the newly created Vector to be destroyed when we are done with it.

    To manage these problems, each class contains two methods that access an internal hash table called %OWNER. This hash keeps a list of all of the objects that Perl knows that it has created. This happens in two cases: (1) when the constructor has been called, and (2) when a function implicitly creates a new object (as is done when SWIG needs to return a complex datatype by value). When the destructor is invoked, the Perl proxy class module checks the %OWNER hash to see if Perl created the object. If so, the C/C++ destructor is invoked. If not, we simply destroy the Perl object and leave the underlying C object alone (under the assumption that someone else must have created it).

    This scheme works remarkably well in practice but it isn't foolproof. In fact, it will fail if you create a new C object in Perl, pass it on to a C function that remembers the object, and then destroy the corresponding Perl object (this situation turns out to come up frequently when constructing objects like linked lists and trees). When C takes possession of an object, you can change Perl's ownership by simply deleting the object from the %OWNER hash. This is done using the DISOWN method.

    # Perl code to change ownership of an object
    $v = new Vector(x, y, z);
    $v->DISOWN();     
    

    To acquire ownership of an object, the ACQUIRE method can be used.

    # Given Perl ownership of a file
    $u = Vector_get($v);
    $u->ACQUIRE();
    
    

    As always, a little care is in order. SWIG does not provide reference counting, garbage collection, or advanced features one might find in sophisticated languages.

    33.9.4 Nested Objects

    Suppose that we have a new object that looks like this:

    struct Particle {
      Vector r;
      Vector v;
      Vector f;
      int type;
    }
    
    

    In this case, the members of the structure are complex objects that have already been encapsulated in a Perl proxy class. To handle these correctly, we use the %BLESSEDMEMBERS hash which would look like this (along with some supporting code):

    package Particle;
    ...
    %BLESSEDMEMBERS = (
            r => `Vector',
            v => `Vector',
            f => `Vector',
    );
    
    

    When fetching members from the structure, %BLESSEDMEMBERS is checked. If the requested field is present, we create a tied-hash table and return it. If not, we just return the corresponding member unmodified.

    This implementation allows us to operate on nested structures as follows:

    # Perl access of nested structure
    $p = new Particle();
    $p->{f}->{x} = 0.0;
    %${$p->{v}} = ( x=>0, y=>0, z=>0);         
    

    33.9.5 Proxy Functions

    When functions take arguments involving a complex object, it is sometimes necessary to write a proxy function. For example:

    double dot_product(Vector *v1, Vector *v2);
    

    Since Vector is an object already wrapped into a proxy class, we need to modify this function to accept arguments that are given in the form of tied hash tables. This is done by creating a Perl function like this:

    sub dot_product {
        my @args = @_;
        $args[0] = tied(%{$args[0]});         # Get the real pointer values
        $args[1] = tied(%{$args[1]});
        my $result = vectorc::dot_product(@args);
        return $result;
    }
    

    This function replaces the original function, but operates in an identical manner.

    33.9.6 Inheritance

    Simple C++ inheritance is handled using the Perl @ISA array in each class package. For example, if you have the following interface file:

    // shapes.i
    // SWIG interface file for shapes class
    %module shapes
    %{
    #include "shapes.h"
    %}
    
    class Shape {
    public:
      virtual double area() = 0;
      virtual double perimeter() = 0;
      void    set_location(double x, double y);
    };
    class Circle : public Shape {
    public:
      Circle(double radius);
      ~Circle();
      double area();
      double perimeter();
    };
    class Square : public Shape {
    public:
      Square(double size);
      ~Square();
      double area();
      double perimeter();
    }
    
    

    The resulting, Perl wrapper class will create the following code:

    Package Shape;
    @ISA = (shapes);
    ...
    Package Circle;
    @ISA = (shapes Shape);
    ...
    Package Square;
    @ISA = (shapes Shape);
    
    

    The @ISA array determines where to look for methods of a particular class. In this case, both the Circle and Square classes inherit functions from Shape so we'll want to look in the Shape base class for them. All classes also inherit from the top-level module shapes. This is because certain common operations needed to implement proxy classes are implemented only once and reused in the wrapper code for various classes and structures.

    Since SWIG proxy classes are implemented in Perl, it is easy to subclass from any SWIG generated class. To do this, simply put the name of a SWIG class in the @ISA array for your new class. However, be forewarned that this is not a trivial problem. In particular, inheritance of data members is extremely tricky (and I'm not even sure if it really works).

    33.9.7 Modifying the proxy methods

    It is possible to override the SWIG generated proxy/shadow methods, using %feature("shadow"). It works like all the other %feature directives. Here is a simple example showing how to add some Perl debug code to the constructor:

    /* Let's make the constructor of the class Square more verbose */
    %feature("shadow") Square(double w)
    %{
      sub new {
        my $pkg = shift;
        my $self = examplec::new_Square(@_);
        print STDERR "Constructed an @{[ref($self)]}\n";
        bless $self, $pkg if defined($self);
      }
    %}
    
    class Square {
    public:
      Square(double w);
      ...
    };
    

    33.10 Adding additional Perl code

    If writing support code in C isn't enough, it is also possible to write code in Perl. This code gets inserted in to the .pm file created by SWIG. One use of Perl code might be to supply a high-level interface to certain functions. For example:

    void set_transform(Image *im, double x[4][4]);
    
    ...
    /* Rewrite the high level interface to set_transform */
    %perlcode %{
    sub set_transform
    {
      my ($im, $x) = @_;
      my $a = new_mat44();
      for (my $i = 0; $i < 4, $i++)
      {
        for (my $j = 0; $j < 4, $j++)
        {
          mat44_set($a, $i, $j, $x->[i][j])
          }
      }
      example.set_transform($im, $a);
      free_mat44($a);
    }
    %}
    

    In this example, set_transform() provides a high-level Perl interface built on top of low-level helper functions. For example, this code now seems to work:

    my $a =
      [[1, 0, 0, 0],
      [0, 1, 0, 0],
      [0, 0, 1, 0],
      [0, 0, 0, 1]];
    set_transform($im, $a);
    

    33.11 Cross language polymorphism

    Proxy classes provide a more natural, object-oriented way to access extension classes. As described above, each proxy instance has an associated C++ instance, and method calls to the proxy are passed to the C++ instance transparently via C wrapper functions.

    This arrangement is asymmetric in the sense that no corresponding mechanism exists to pass method calls down the inheritance chain from C++ to Perl. In particular, if a C++ class has been extended in Perl (by extending the proxy class), these extensions will not be visible from C++ code. Virtual method calls from C++ are thus not able access the lowest implementation in the inheritance chain.

    Changes have been made to SWIG to address this problem and make the relationship between C++ classes and proxy classes more symmetric. To achieve this goal, new classes called directors are introduced at the bottom of the C++ inheritance chain. The job of the directors is to route method calls correctly, either to C++ implementations higher in the inheritance chain or to Perl implementations lower in the inheritance chain. The upshot is that C++ classes can be extended in Perl and from C++ these extensions look exactly like native C++ classes. Neither C++ code nor Perl code needs to know where a particular method is implemented: the combination of proxy classes, director classes, and C wrapper functions takes care of all the cross-language method routing transparently.

    33.11.1 Enabling directors

    The director feature is disabled by default. To use directors you must make two changes to the interface file. First, add the "directors" option to the %module directive, like this:

    %module(directors="1") modulename
    

    Without this option no director code will be generated. Second, you must use the %feature("director") directive to tell SWIG which classes and methods should get directors. The %feature directive can be applied globally, to specific classes, and to specific methods, like this:

    // generate directors for all classes that have virtual methods
    %feature("director");         
    
    // generate directors for all virtual methods in class Foo
    %feature("director") Foo;      
    

    You can use the %feature("nodirector") directive to turn off directors for specific classes or methods. So for example,

    %feature("director") Foo;
    %feature("nodirector") Foo::bar;
    

    will generate directors for all virtual methods of class Foo except bar().

    Directors can also be generated implicitly through inheritance. In the following, class Bar will get a director class that handles the methods one() and two() (but not three()):

    %feature("director") Foo;
    class Foo {
    public:
        Foo(int foo);
        virtual void one();
        virtual void two();
    };
    
    class Bar: public Foo {
    public:
        virtual void three();
    };
    

    then at the Perl side you can define

    use mymodule;
    
    package MyFoo;
    use base 'mymodule::Foo';
    
    sub one {
      print "one from Perl\n";
    }
    

    33.11.2 Director classes

    For each class that has directors enabled, SWIG generates a new class that derives from both the class in question and a special Swig::Director class. These new classes, referred to as director classes, can be loosely thought of as the C++ equivalent of the Perl proxy classes. The director classes store a pointer to their underlying Perl object and handle various issues related to object ownership.

    For simplicity let's ignore the Swig::Director class and refer to the original C++ class as the director's base class. By default, a director class extends all virtual methods in the inheritance chain of its base class (see the preceding section for how to modify this behavior). Thus all virtual method calls, whether they originate in C++ or in Perl via proxy classes, eventually end up in at the implementation in the director class. The job of the director methods is to route these method calls to the appropriate place in the inheritance chain. By "appropriate place" we mean the method that would have been called if the C++ base class and its extensions in Perl were seamlessly integrated. That seamless integration is exactly what the director classes provide, transparently skipping over all the messy extension API glue that binds the two languages together.

    In reality, the "appropriate place" is one of only two possibilities: C++ or Perl. Once this decision is made, the rest is fairly easy. If the correct implementation is in C++, then the lowest implementation of the method in the C++ inheritance chain is called explicitly. If the correct implementation is in Perl, the Perl API is used to call the method of the underlying Perl object (after which the usual virtual method resolution in Perl automatically finds the right implementation).

    Now how does the director decide which language should handle the method call? The basic rule is to handle the method in Perl, unless there's a good reason not to. The reason for this is simple: Perl has the most "extended" implementation of the method. This assertion is guaranteed, since at a minimum the Perl proxy class implements the method. If the method in question has been extended by a class derived from the proxy class, that extended implementation will execute exactly as it should. If not, the proxy class will route the method call into a C wrapper function, expecting that the method will be resolved in C++. The wrapper will call the virtual method of the C++ instance, and since the director extends this the call will end up right back in the director method. Now comes the "good reason not to" part. If the director method were to blindly call the Perl method again, it would get stuck in an infinite loop. We avoid this situation by adding special code to the C wrapper function that tells the director method to not do this. The C wrapper function compares the pointer to the Perl object that called the wrapper function to the pointer stored by the director. If these are the same, then the C wrapper function tells the director to resolve the method by calling up the C++ inheritance chain, preventing an infinite loop.

    One more point needs to be made about the relationship between director classes and proxy classes. When a proxy class instance is created in Perl, SWIG creates an instance of the original C++ class. This is exactly what happens without directors and is true even if directors are enabled for the particular class in question. When a class derived from a proxy class is created, however, SWIG then creates an instance of the corresponding C++ director class. The reason for this difference is that user-defined subclasses may override or extend methods of the original class, so the director class is needed to route calls to these methods correctly. For unmodified proxy classes, all methods are ultimately implemented in C++ so there is no need for the extra overhead involved with routing the calls through Perl.

    33.11.3 Ownership and object destruction

    Memory management issues are slightly more complicated with directors than for proxy classes alone. Perl instances hold a pointer to the associated C++ director object, and the director in turn holds a pointer back to a Perl object. By default, proxy classes own their C++ director object and take care of deleting it when they are garbage collected.

    This relationship can be reversed by calling the special DISOWN() method of the proxy class. After calling this method the director class increments the reference count of the Perl object. When the director class is deleted it decrements the reference count. Assuming no outstanding references to the Perl object remain, the Perl object will be destroyed at the same time. This is a good thing, since directors and proxies refer to each other and so must be created and destroyed together. Destroying one without destroying the other will likely cause your program to segfault.

    Also note that due to the proxy implementation, the DESTROY() method on directors can be called for several reasons, many of which have little to do with the teardown of an object instance. To help disambiguate this, a second argument is added to the DESTROY() call when a C++ director object is being released. So, to avoid running your clean-up code when an object is not really going away, or after it has already been reclaimed, it is suggested that custom destructors in Perl subclasses looks something like:

    sub DESTROY {
      my($self, $final) = @_;
      if($final) {
        # real teardown code
      }
      shift->SUPER::DESTROY(@_);
    }
    

    33.11.4 Exception unrolling

    With directors routing method calls to Perl, and proxies routing them to C++, the handling of exceptions is an important concern. By default, the directors ignore exceptions that occur during method calls that are resolved in Perl. To handle such exceptions correctly, it is necessary to temporarily translate them into C++ exceptions. This can be done with the %feature("director:except") directive. The following code should suffice in most cases:

    %feature("director:except") {
        if ($error != NULL) {
            throw Swig::DirectorMethodException();
        }
    }
    

    This code will check the Perl error state after each method call from a director into Perl, and throw a C++ exception if an error occurred. This exception can be caught in C++ to implement an error handler.

    It may be the case that a method call originates in Perl, travels up to C++ through a proxy class, and then back into Perl via a director method. If an exception occurs in Perl at this point, it would be nice for that exception to find its way back to the original caller. This can be done by combining a normal %exception directive with the director:except handler shown above. Here is an example of a suitable exception handler:

    %exception {
        try { $action }
        catch (Swig::DirectorException &e) { SWIG_fail; }
    }
    

    The class Swig::DirectorException used in this example is actually a base class of Swig::DirectorMethodException, so it will trap this exception. Because the Perl error state is still set when Swig::DirectorMethodException is thrown, Perl will register the exception as soon as the C wrapper function returns.

    33.11.5 Overhead and code bloat

    Enabling directors for a class will generate a new director method for every virtual method in the class' inheritance chain. This alone can generate a lot of code bloat for large hierarchies. Method arguments that require complex conversions to and from target language types can result in large director methods. For this reason it is recommended that you selectively enable directors only for specific classes that are likely to be extended in Perl and used in C++.

    Compared to classes that do not use directors, the call routing in the director methods does add some overhead. In particular, at least one dynamic cast and one extra function call occurs per method call from Perl. Relative to the speed of Perl execution this is probably completely negligible. For worst case routing, a method call that ultimately resolves in C++ may take one extra detour through Perl in order to ensure that the method does not have an extended Perl implementation. This could result in a noticeable overhead in some cases.

    Although directors make it natural to mix native C++ objects with Perl objects (as director objects) via a common base class pointer, one should be aware of the obvious fact that method calls to Perl objects will be much slower than calls to C++ objects. This situation can be optimized by selectively enabling director methods (using the %feature directive) for only those methods that are likely to be extended in Perl.

    33.11.6 Typemaps

    Typemaps for input and output of most of the basic types from director classes have been written. These are roughly the reverse of the usual input and output typemaps used by the wrapper code. The typemap operation names are 'directorin', 'directorout', and 'directorargout'. The director code does not currently use any of the other kinds of typemaps. It is not clear at this point which kinds are appropriate and need to be supported.

    swig-3.0.12/Doc/Manual/Contract.html0000664000175000017500000001462013042756671017031 0ustar williamwilliam Contract Checking

    13 Contracts

    A common problem that arises when wrapping C libraries is that of maintaining reliability and checking for errors. The fact of the matter is that many C programs are notorious for not providing error checks. Not only that, when you expose the internals of an application as a library, it often becomes possible to crash it simply by providing bad inputs or using it in a way that wasn't intended.

    This chapter describes SWIG's support for software contracts. In the context of SWIG, a contract can be viewed as a runtime constraint that is attached to a declaration. For example, you can easily attach argument checking rules, check the output values of a function and more. When one of the rules is violated by a script, a runtime exception is generated rather than having the program continue to execute.

    13.1 The %contract directive

    Contracts are added to a declaration using the %contract directive. Here is a simple example:

    %contract sqrt(double x) {
    require:
      x >= 0;
    ensure:
      sqrt >= 0;
    }
    
    ...
    double sqrt(double);
    

    In this case, a contract is being added to the sqrt() function. The %contract directive must always appear before the declaration in question. Within the contract there are two sections, both of which are optional. The require: section specifies conditions that must hold before the function is called. Typically, this is used to check argument values. The ensure: section specifies conditions that must hold after the function is called. This is often used to check return values or the state of the program. In both cases, the conditions that must hold must be specified as boolean expressions.

    In the above example, we're simply making sure that sqrt() returns a non-negative number (if it didn't, then it would be broken in some way).

    Once a contract has been specified, it modifies the behavior of the resulting module. For example:

    >>> example.sqrt(2)
    1.4142135623730951
    >>> example.sqrt(-2)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    RuntimeError: Contract violation: require: (arg1>=0)
    >>>
    

    13.2 %contract and classes

    The %contract directive can also be applied to class methods and constructors. For example:

    %contract Foo::bar(int x, int y) {
    require:
      x > 0;
    ensure:
      bar > 0;
    }
    
    %contract Foo::Foo(int a) {
    require:
      a > 0;
    }
    
    class Foo {
    public:
      Foo(int);
      int bar(int, int);
    };
    

    The way in which %contract is applied is exactly the same as the %feature directive. Thus, any contract that you specified for a base class will also be attached to inherited methods. For example:

    class Spam : public Foo {
    public:
      int bar(int, int);    // Gets contract defined for Foo::bar(int, int)
    };
    

    In addition to this, separate contracts can be applied to both the base class and a derived class. For example:

    %contract Foo::bar(int x, int) {
    require:
      x > 0;
    }
    
    %contract Spam::bar(int, int y) {
    require:
      y > 0;
    }
    
    class Foo {
    public:
      int bar(int, int);   // Gets Foo::bar contract.
    };
    
    class Spam : public Foo {
    public:
      int bar(int, int);   // Gets Foo::bar and Spam::bar contract
    };
    

    When more than one contract is applied, the conditions specified in a "require:" section are combined together using a logical-AND operation. In other words conditions specified for the base class and conditions specified for the derived class all must hold. In the above example, this means that both the arguments to Spam::bar must be positive.

    13.3 Constant aggregation and %aggregate_check

    Consider an interface file that contains the following code:

    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    One thing you might want to do is impose a constraint on the direction parameter to make sure it's one of a few accepted values. To do that, SWIG provides an easy to use macro %aggregate_check() that works like this:

    %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
    

    This merely defines a utility function of the form

    int check_direction(int x);
    

    That checks the argument x to see if it is one of the values listed. This utility function can be used in contracts. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %contract move(SomeObject *, int direction, in) {
    require:
      check_direction(direction);
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Alternatively, it can be used in typemaps and other directives. For example:

    %aggregate_check(int, check_direction, UP, DOWN, RIGHT, LEFT);
    
    %typemap(check) int direction {
      if (!check_direction($1)) SWIG_exception(SWIG_ValueError, "Bad direction");
    }
    
    #define  UP     1
    #define  DOWN   2
    #define  RIGHT  3
    #define  LEFT   4
    
    void move(SomeObject *, int direction, int distance);
    

    Regrettably, there is no automatic way to perform similar checks with enums values. Maybe in a future release.

    13.4 Notes

    Contract support was implemented by Songyan (Tiger) Feng and first appeared in SWIG-1.3.20.

    swig-3.0.12/Doc/Manual/Warnings.html0000664000175000017500000005063613042756671017053 0ustar williamwilliam Warning Messages

    15 Warning Messages

    15.1 Introduction

    During compilation, SWIG may generate a variety of warning messages. For example:

    example.i:16: Warning 501: Overloaded declaration ignored.  bar(double)
    example.i:15: Warning 501: Previous declaration is bar(int)
    

    Typically, warning messages indicate non-fatal problems with the input where the generated wrapper code will probably compile, but it may not work like you expect.

    15.2 Warning message suppression

    All warning messages have a numeric code that is shown in the warning message itself. To suppress the printing of a warning message, a number of techniques can be used. First, you can run SWIG with the -w command line option. For example:

    % swig -python -w501 example.i
    % swig -python -w501,505,401 example.i
    

    Alternatively, warnings can be suppressed by inserting a special preprocessor pragma into the input file:

    %module example
    #pragma SWIG nowarn=501
    #pragma SWIG nowarn=501,505,401
    

    Finally, code-generation warnings can be disabled on a declaration by declaration basis using the %warnfilter directive. For example:

    %module example
    %warnfilter(501) foo;
    ...
    int foo(int);
    int foo(double);              // Silently ignored.
    

    The %warnfilter directive has the same semantics as other declaration modifiers like %rename, %ignore and %feature, see the %feature directive section. For example, if you wanted to suppress a warning for a method in a class hierarchy, you could do this:

    %warnfilter(501) Object::foo;
    class Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    
    class Derived : public Object {
    public:
      int foo(int);
      int foo(double);      // Silently ignored
      ...
    };
    

    Warnings can be suppressed for an entire class by supplying a class name. For example:

    %warnfilter(501) Object;
    
    class Object {
    public:
      ...                      // All 501 warnings ignored in class
    };
    

    There is no option to suppress all SWIG warning messages. The warning messages are there for a reason---to tell you that something may be broken in your interface. Ignore the warning messages at your own peril.

    15.3 Enabling extra warnings

    Some warning messages are disabled by default and are generated only to provide additional diagnostics. These warnings can be turned on using the -Wextra option. For example:

    % swig -Wextra -python example.i
    

    To selectively turn on extra warning messages, you can use the directives and options in the previous section--simply add a "+" to all warning numbers. For example:

    % swig -w+309,+452 example.i
    

    or in your interface file use either

    #pragma SWIG nowarn=+309,+452
    

    or

    %warnfilter(+309,+452) foo;
    

    Note: selective enabling of warnings with %warnfilter overrides any global settings you might have made using -w or #pragma.

    You can of course also enable all warnings and suppress a select few, for example:

    % swig -Wextra -w309,452 example.i
    

    The warnings on the right take precedence over the warnings on the left, so in the above example -Wextra adds numerous warnings including 452, but then -w309,452 overrides this and so 452 is suppressesed.

    If you would like all warnings to appear, regardless of the warning filters used, then use the -Wall option. The -Wall option also turns on the extra warnings that -Wextra adds, however, it is subtely different. When -Wall is used, it also disables all other warning filters, that is, any warnings suppressed or added in %warnfilter, #pragma SWIG nowarn or the -w option.

    15.4 Issuing a warning message

    Warning messages can be issued from an interface file using a number of directives. The %warn directive is the most simple:

    %warn "900:This is your last warning!"
    

    All warning messages are optionally prefixed by the warning number to use. If you are generating your own warnings, make sure you don't use numbers defined in the table at the end of this section.

    The %ignorewarn directive is the same as %ignore except that it issues a warning message whenever a matching declaration is found. For example:

    %ignorewarn("362:operator= ignored") operator=;
    

    Warning messages can be associated with typemaps using the warning attribute of a typemap declaration. For example:

    %typemap(in, warning="901:You are really going to regret this usage of $1_type $1_name") blah * {
      ...
    }
    

    In this case, the warning message will be printed whenever the typemap is actually used and the special variables will be expanded as appropriate, for example:

    example.i:23: Warning 901: You are really going to regret this usage of blah * self
    example.i:24: Warning 901: You are really going to regret this usage of blah * stuff
    

    15.5 Symbolic symbols

    The swigwarn.swg file that is installed with SWIG contains symbol constants that could also be used in %warnfilter and #pragma SWIG nowarn. For example this file contains the following line:

    %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef
    

    so SWIGWARN_TYPE_UNDEFINED_CLASS could be used instead of 401, for example:

    #pragma SWIG nowarn=SWIGWARN_TYPE_UNDEFINED_CLASS
    

    or

    %warnfilter(SWIGWARN_TYPE_UNDEFINED_CLASS) Foo;
    

    15.6 Commentary

    The ability to suppress warning messages is really only provided for advanced users and is not recommended in normal use. You are advised to modify your interface to fix the problems highlighted by the warnings wherever possible instead of suppressing warnings.

    Certain types of SWIG problems are errors. These usually arise due to parsing errors (bad syntax) or semantic problems for which there is no obvious recovery. There is no mechanism for suppressing error messages.

    15.7 Warnings as errors

    Warnings can be handled as errors by using the -Werror command line option. This will cause SWIG to exit with a non successful exit code if a warning is encountered.

    15.8 Message output format

    The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example:

    $ swig -python -Fstandard example.i
    example.i:4: Syntax error in input(1).
    $ swig -python -Fmicrosoft example.i
    example.i(4) : Syntax error in input(1).
    

    15.9 Warning number reference

    15.9.1 Deprecated features (100-199)

    • 101. Deprecated %extern directive.
    • 102. Deprecated %val directive.
    • 103. Deprecated %out directive.
    • 104. Deprecated %disabledoc directive.
    • 105. Deprecated %enabledoc directive.
    • 106. Deprecated %doconly directive.
    • 107. Deprecated %style directive.
    • 108. Deprecated %localstyle directive.
    • 109. Deprecated %title directive.
    • 110. Deprecated %section directive.
    • 111. Deprecated %subsection directive.
    • 112. Deprecated %subsubsection directive.
    • 113. Deprecated %addmethods directive.
    • 114. Deprecated %readonly directive.
    • 115. Deprecated %readwrite directive.
    • 116. Deprecated %except directive.
    • 117. Deprecated %new directive.
    • 118. Deprecated %typemap(except).
    • 119. Deprecated %typemap(ignore).
    • 120. Deprecated command line option (-runtime, -noruntime).
    • 121. Deprecated %name directive.
    • 126. The 'nestedworkaround' feature is deprecated.

    15.9.2 Preprocessor (200-299)

    • 201. Unable to find filename.
    • 202. Could not evaluate expression expr.
    • 203. Both includeall and importall are defined: using includeall.
    • 204. CPP #warning, "warning".
    • 205. CPP #error, "error".
    • 206. Unexpected tokens after #directive directive.

    15.9.3 C/C++ Parser (300-399)

    • 301. class keyword used, but not in C++ mode.
    • 302. Identifier 'name' redefined (ignored).
    • 303. %extend defined for an undeclared class 'name'.
    • 304. Unsupported constant value (ignored).
    • 305. Bad constant value (ignored).
    • 306. 'identifier' is private in this context.
    • 307. Can't set default argument value (ignored)
    • 308. Namespace alias 'name' not allowed here. Assuming 'name'
    • 309. [private | protected] inheritance ignored.
    • 310. Template 'name' was already wrapped as 'name' (ignored)
    • 312. Unnamed nested class not currently supported (ignored).
    • 313. Unrecognized extern type "name" (ignored).
    • 314. 'identifier' is a lang keyword.
    • 315. Nothing known about 'identifier'.
    • 316. Repeated %module directive.
    • 317. Specialization of non-template 'name'.
    • 318. Instantiation of template 'name' is ambiguous, instantiation templ used, instantiation templ ignored.
    • 319. No access specifier given for base class name (ignored).
    • 320. Explicit template instantiation ignored.
    • 321. identifier conflicts with a built-in name.
    • 322. Redundant redeclaration of 'name'.
    • 323. Recursive scope inheritance of 'name'.
    • 324. Named nested template instantiations not supported. Processing as if no name was given to %template().
    • 325. Nested kind not currently supported (name ignored).
    • 326. Deprecated %extend name used - the kind name 'name' should be used instead of the typedef name 'name'.
    • 350. operator new ignored.
    • 351. operator delete ignored.
    • 352. operator+ ignored.
    • 353. operator- ignored.
    • 354. operator* ignored.
    • 355. operator/ ignored.
    • 356. operator% ignored.
    • 357. operator^ ignored.
    • 358. operator& ignored.
    • 359. operator| ignored.
    • 360. operator~ ignored.
    • 361. operator! ignored.
    • 362. operator= ignored.
    • 363. operator< ignored.
    • 364. operator> ignored.
    • 365. operator+= ignored.
    • 366. operator-= ignored.
    • 367. operator*= ignored.
    • 368. operator/= ignored.
    • 369. operator%= ignored.
    • 370. operator^= ignored.
    • 371. operator&= ignored.
    • 372. operator|= ignored.
    • 373. operator<< ignored.
    • 374. operator>>ignored.
    • 375. operator<<= ignored.
    • 376. operator>>= ignored.
    • 377. operator== ignored.
    • 378. operator!= ignored.
    • 379. operator<= ignored.
    • 380. operator>= ignored.
    • 381. operator&& ignored.
    • 382. operator|| ignored.
    • 383. operator++ ignored.
    • 384. operator-- ignored.
    • 385. operator, ignored.
    • 386. operator-<* ignored.
    • 387. operator-< ignored.
    • 388. operator() ignored.
    • 389. operator[] ignored.
    • 390. operator+ ignored (unary).
    • 391. operator- ignored (unary).
    • 392. operator* ignored (unary).
    • 393. operator& ignored (unary).
    • 394. operator new[] ignored.
    • 395. operator delete[] ignored.

    15.9.4 Types and typemaps (400-499)

    • 401. Nothing known about class 'name'. Ignored.
    • 402. Base class 'name' is incomplete.
    • 403. Class 'name' might be abstract.
    • 450. Deprecated typemap feature ($source/$target).
    • 451. Setting const char * variable may leak memory.
    • 452. Reserved
    • 453. Can't apply (pattern). No typemaps are defined.
    • 460. Unable to use type type as a function argument.
    • 461. Unable to use return type type in function name.
    • 462. Unable to set variable of type type.
    • 463. Unable to read variable of type type.
    • 464. Unsupported constant value.
    • 465. Unable to handle type type.
    • 466. Unsupported variable type type.
    • 467. Overloaded declaration not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'type')
    • 468. No 'throw' typemap defined for exception type type
    • 469. No or improper directorin typemap defined for type
    • 470. Thread/reentrant unsafe wrapping, consider returning by value instead.
    • 471. Unable to use return type type in director method
    • 474. Method method usage of the optimal attribute ignored in the out typemap as the following cannot be used to generate optimal code: code
    • 475. Multiple calls to method might be generated due to optimal attribute usage in the out typemap.
    • 476. Initialization using std::initializer_list.
    • 477. No directorthrows typemap defined for type

    15.9.5 Code generation (500-599)

    • 501. Overloaded declaration ignored. decl. Previous declaration is decl.
    • 502. Overloaded constructor ignored. decl. Previous declaration is decl.
    • 503. Can't wrap 'identifier' unless renamed to a valid identifier.
    • 504. Function name must have a return type. Ignored.
    • 505. Variable length arguments discarded.
    • 506. Can't wrap varargs with keyword arguments enabled.
    • 507. Adding native function name not supported (ignored).
    • 508. Declaration of 'name' shadows declaration accessible via operator->(), previous declaration of'declaration'.
    • 509. Overloaded method declaration effectively ignored, as it is shadowed by declaration.
    • 510. Friend function 'name' ignored.
    • 511. Can't use keyword arguments with overloaded functions.
    • 512. Overloaded method declaration ignored, using non-const method declaration instead.
    • 513. Can't generate wrappers for unnamed struct/class.
    • 514.
    • 515.
    • 516. Overloaded method declaration ignored, using declaration instead.
    • 517.
    • 518. Portability warning: File file1 will be overwritten by file2 on case insensitive filesystems such as Windows' FAT32 and NTFS unless the class/module name is renamed.
    • 519. %template() contains no name. Template method ignored: declaration
    • 520. Base/Derived class 'classname1' of 'classname2' is not similarly marked as a smart pointer.
    • 521. Illegal destructor name name. Ignored.
    • 522. Use of an illegal constructor name 'name' in %extend is deprecated, the constructor name should be 'name'.
    • 523. Use of an illegal destructor name 'name' in %extend is deprecated, the destructor name should be 'name'.

    15.9.6 Language module specific (700-899)

    • 801. Wrong name (corrected to 'name'). (Ruby).
    • 810. No jni typemap defined for type (Java).
    • 811. No jtype typemap defined for type (Java).
    • 812. No jstype typemap defined for type (Java).
    • 813. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in Java. (Java).
    • 814.
    • 815. No javafinalize typemap defined for type (Java).
    • 816. No javabody typemap defined for type (Java).
    • 817. No javaout typemap defined for type (Java).
    • 818. No javain typemap defined for type (Java).
    • 819. No javadirectorin typemap defined for type (Java).
    • 820. No javadirectorout typemap defined for type (Java).
    • 821.
    • 822. Covariant return types not supported in Java. Proxy method will return basetype (Java).
    • 823. No javaconstruct typemap defined for type (Java).
    • 824. Missing JNI descriptor in directorin typemap defined for type (Java).
    • 825. "directorconnect" attribute missing in type "javaconstruct" typemap. (Java).
    • 826. The nspace feature is used on 'type' without -package. The generated code may not compile as Java does not support types declared in a named package accessing types declared in an unnamed package. (Java).
    • 830. No ctype typemap defined for type (C#).
    • 831. No cstype typemap defined for type (C#).
    • 832. No cswtype typemap defined for type (C#).
    • 833. Warning for classname, base baseclass ignored. Multiple inheritance is not supported in C#. (C#).
    • 834.
    • 835. No csfinalize typemap defined for type (C#).
    • 836. No csbody typemap defined for type (C#).
    • 837. No csout typemap defined for type (C#).
    • 838. No csin typemap defined for type (C#).
    • 839.
    • 840.
    • 841.
    • 842. Covariant return types not supported in C#. Proxy method will return basetype (C#).
    • 843. No csconstruct typemap defined for type (C#).
    • 844. C# exception may not be thrown - no $excode or excode attribute in typemap typemap. (C#).
    • 845. Unmanaged code contains a call to a SWIG_CSharpSetPendingException method and C# code does not handle pending exceptions via the canthrow attribute. (C#).
    • 870. Warning for classname: Base baseclass ignored. Multiple inheritance is not supported in PHP. (Php).
    • 871. Unrecognized pragma pragma. (Php).

    15.9.7 User defined (900-999)

    These numbers can be used by your own application.

    15.10 History

    The ability to control warning messages was first added to SWIG-1.3.12.

    swig-3.0.12/Doc/Manual/Customization.html0000664000175000017500000010036313042756671020124 0ustar williamwilliam Customization Features

    12 Customization Features

    In many cases, it is desirable to change the default wrapping of particular declarations in an interface. For example, you might want to provide hooks for catching C++ exceptions, add assertions, or provide hints to the underlying code generator. This chapter describes some of these customization techniques. First, a discussion of exception handling is presented. Then, a more general-purpose customization mechanism known as "features" is described.

    12.1 Exception handling with %exception

    The %exception directive allows you to define a general purpose exception handler. For example, you can specify the following:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        ... handle error ...
      }
    }
    

    How the exception is handled depends on the target language, for example, Python:

    %exception {
      try {
        $action
      }
      catch (RangeError) {
        PyErr_SetString(PyExc_IndexError, "index out-of-bounds");
        SWIG_fail;
      }
    }
    

    When defined, the code enclosed in braces is inserted directly into the low-level wrapper functions. The special variable $action is one of a few %exception special variables supported and gets replaced with the actual operation to be performed (a function call, method invocation, attribute access, etc.). An exception handler remains in effect until it is explicitly deleted. This is done by using either %exception or %noexception with no code. For example:

    %exception;   // Deletes any previously defined handler
    

    Compatibility note: Previous versions of SWIG used a special directive %except for exception handling. That directive is deprecated--%exception provides the same functionality, but is substantially more flexible.

    12.1.1 Handling exceptions in C code

    C has no formal exception handling mechanism so there are several approaches that might be used. A somewhat common technique is to simply set a special error code. For example:

    /* File : except.c */
    
    static char error_message[256];
    static int error_status = 0;
    
    void throw_exception(char *msg) {
      strncpy(error_message, msg, 256);
      error_status = 1;
    }
    
    void clear_exception() {
      error_status = 0;
    }
    char *check_exception() {
      if (error_status)
        return error_message;
      else
        return NULL;
    }
    
    

    To use these functions, functions simply call throw_exception() to indicate an error occurred. For example :

    double inv(double x) {
      if (x != 0)
        return 1.0/x;
      else {
        throw_exception("Division by zero");
        return 0;
      }
    }
    

    To catch the exception, you can write a simple exception handler such as the following (shown for Perl5) :

    %exception {
      char *err;
      clear_exception();
      $action
      if ((err = check_exception())) {
        croak(err);
      }
    }
    

    In this case, when an error occurs, it is translated into a Perl error. Each target language has its own approach to creating a runtime error/exception in and for Perl it is the croak method shown above.

    12.1.2 Exception handling with longjmp()

    Exception handling can also be added to C code using the <setjmp.h> library. Here is a minimalistic implementation that relies on the C preprocessor :

    /* File : except.c
       Just the declaration of a few global variables we're going to use */
    
    #include <setjmp.h>
    jmp_buf exception_buffer;
    int exception_status;
    
    /* File : except.h */
    #include <setjmp.h>
    extern jmp_buf exception_buffer;
    extern int exception_status;
    
    #define try if ((exception_status = setjmp(exception_buffer)) == 0)
    #define catch(val) else if (exception_status == val)
    #define throw(val) longjmp(exception_buffer, val)
    #define finally else
    
    /* Exception codes */
    
    #define RangeError     1
    #define DivisionByZero 2
    #define OutOfMemory    3
    
    

    Now, within a C program, you can do the following :

    double inv(double x) {
      if (x)
        return 1.0/x;
      else
        throw(DivisionByZero);
    }
    
    

    Finally, to create a SWIG exception handler, write the following :

    %{
    #include "except.h"
    %}
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } finally {
        croak("Unknown exception");
      }
    }
    

    Note: This implementation is only intended to illustrate the general idea. To make it work better, you'll need to modify it to handle nested try declarations.

    12.1.3 Handling C++ exceptions

    Handling C++ exceptions is also straightforward. For example:

    %exception {
      try {
        $action
      } catch(RangeError) {
        croak("Range Error");
      } catch(DivisionByZero) {
        croak("Division by zero");
      } catch(OutOfMemory) {
        croak("Out of memory");
      } catch(...) {
        croak("Unknown exception");
      }
    }
    
    

    The exception types need to be declared as classes elsewhere, possibly in a header file :

    class RangeError {};
    class DivisionByZero {};
    class OutOfMemory {};
    

    12.1.4 Exception handlers for variables

    By default all variables will ignore %exception, so it is effectively turned off for all variables wrappers. This applies to global variables, member variables and static member variables. The approach is certainly a logical one when wrapping variables in C. However, in C++, it is quite possible for an exception to be thrown while the variable is being assigned. To ensure %exception is used when wrapping variables, it needs to be 'turned on' using the %allowexception feature. Note that %allowexception is just a macro for %feature("allowexcept"), that is, it is a feature called "allowexcept". Any variable which has this feature attached to it, will then use the %exception feature, but of course, only if there is a %exception attached to the variable in the first place. The %allowexception feature works like any other feature and so can be used globally or for selective variables.

    %allowexception;                // turn on globally
    %allowexception Klass::MyVar;   // turn on for a specific variable
    
    %noallowexception Klass::MyVar; // turn off for a specific variable
    %noallowexception;              // turn off globally
    

    12.1.5 Defining different exception handlers

    By default, the %exception directive creates an exception handler that is used for all wrapper functions that follow it. Unless there is a well-defined (and simple) error handling mechanism in place, defining one universal exception handler may be unwieldy and result in excessive code bloat since the handler is inlined into each wrapper function.

    To fix this, you can be more selective about how you use the %exception directive. One approach is to only place it around critical pieces of code. For example:

    %exception {
      ... your exception handler ...
    }
    /* Define critical operations that can throw exceptions here */
    
    %exception;
    
    /* Define non-critical operations that don't throw exceptions */
    

    More precise control over exception handling can be obtained by attaching an exception handler to specific declaration name. For example:

    %exception allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    In this case, the exception handler is only attached to declarations named "allocate". This would include both global and member functions. The names supplied to %exception follow the same rules as for %rename described in the section on Ambiguity resolution and renaming. For example, if you wanted to define an exception handler for a specific class, you might write this:

    %exception Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    When a class prefix is supplied, the exception handler is applied to the corresponding declaration in the specified class as well as for identically named functions appearing in derived classes.

    %exception can even be used to pinpoint a precise declaration when overloading is used. For example:

    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    

    Attaching exceptions to specific declarations is a good way to reduce code bloat. It can also be a useful way to attach exceptions to specific parts of a header file. For example:

    %module example
    %{
    #include "someheader.h"
    %}
    
    // Define a few exception handlers for specific declarations
    %exception Object::allocate(int) {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %exception Object::getitem {
      try {
        $action
      }
      catch (RangeError) {
        croak("Index out of range");
      }
    }
    ...
    // Read a raw header file
    %include "someheader.h"
    

    Compatibility note: The %exception directive replaces the functionality provided by the deprecated "except" typemap. The typemap would allow exceptions to be thrown in the target language based on the return type of a function and was intended to be a mechanism for pinpointing specific declarations. However, it never really worked that well and the new %exception directive is much better.

    12.1.6 Special variables for %exception

    The %exception directive supports a few special variables which are placeholders for code substitution. The following table shows the available special variables and details what the special variables are replaced with.

    $action The actual operation to be performed (a function call, method invocation, variable access, etc.)
    $name The C/C++ symbol name for the function.
    $symname The symbol name used internally by SWIG
    $overname The extra mangling used in the symbol name for overloaded method. Expands to nothing if the wrapped method is not overloaded.
    $wrapname The language specific wrapper name (usually a C function name exported from the shared object/dll)
    $decl The fully qualified C/C++ declaration of the method being wrapped without the return type
    $fulldecl The fully qualified C/C++ declaration of the method being wrapped including the return type
    $parentclassname The parent class name (if any) for a method.
    $parentclasssymname The target language parent class name (if any) for a method.

    The special variables are often used in situations where method calls are logged. Exactly which form of the method call needs logging is up to individual requirements, but the example code below shows all the possible expansions, plus how an exception message could be tailored to show the C++ method declaration:

    %exception Special::something {
      log("symname: $symname");
      log("overname: $overname");
      log("wrapname: $wrapname");
      log("decl: $decl");
      log("fulldecl: $fulldecl");
      try {
        $action
      } 
      catch (MemoryError) {
          croak("Out of memory in $decl");
      }
    }
    void log(const char *message);
    struct Special {
      void something(const char *c);
      void something(int i);
    };
    

    Below shows the expansions for the 1st of the overloaded something wrapper methods for Perl:

      log("symname: Special_something");
      log("overname: __SWIG_0");
      log("wrapname: _wrap_Special_something__SWIG_0");
      log("decl: Special::something(char const *)");
      log("fulldecl: void Special::something(char const *)");
      try {
        (arg1)->something((char const *)arg2);
      } 
      catch (MemoryError) {
        croak("Out of memory in Special::something(char const *)");
      }
    

    12.1.7 Using The SWIG exception library

    The exception.i library file provides support for creating language independent exceptions in your interfaces. To use it, simply put an "%include exception.i" in your interface file. This provides a function SWIG_exception() that can be used to raise common scripting language exceptions in a portable manner. For example :

    // Language independent exception handler
    %include exception.i       
    
    %exception {
      try {
        $action
      } catch(RangeError) {
        SWIG_exception(SWIG_ValueError, "Range Error");
      } catch(DivisionByZero) {
        SWIG_exception(SWIG_DivisionByZero, "Division by zero");
      } catch(OutOfMemory) {
        SWIG_exception(SWIG_MemoryError, "Out of memory");
      } catch(...) {
        SWIG_exception(SWIG_RuntimeError, "Unknown exception");
      }
    }
    
    

    As arguments, SWIG_exception() takes an error type code (an integer) and an error message string. The currently supported error types are :

    SWIG_UnknownError
    SWIG_IOError
    SWIG_RuntimeError
    SWIG_IndexError
    SWIG_TypeError
    SWIG_DivisionByZero
    SWIG_OverflowError
    SWIG_SyntaxError
    SWIG_ValueError
    SWIG_SystemError
    SWIG_AttributeError
    SWIG_MemoryError
    SWIG_NullReferenceError
    

    The SWIG_exception() function can also be used in typemaps.

    12.2 Object ownership and %newobject

    A common problem in some applications is managing proper ownership of objects. For example, consider a function like this:

    Foo *blah() {
      Foo *f = new Foo();
      return f;
    }
    

    If you wrap the function blah(), SWIG has no idea that the return value is a newly allocated object. As a result, the resulting extension module may produce a memory leak (SWIG is conservative and will never delete objects unless it knows for certain that the returned object was newly created).

    To fix this, you can provide an extra hint to the code generator using the %newobject directive. For example:

    %newobject blah;
    Foo *blah();
    

    %newobject works exactly like %rename and %exception. In other words, you can attach it to class members and parameterized declarations as before. For example:

    %newobject ::blah();                   // Only applies to global blah
    %newobject Object::blah(int, double);  // Only blah(int, double) in Object
    %newobject *::copy;                    // Copy method in all classes
    ...
    

    When %newobject is supplied, many language modules will arrange to take ownership of the return value. This allows the value to be automatically garbage-collected when it is no longer in use. However, this depends entirely on the target language (a language module may also choose to ignore the %newobject directive).

    Closely related to %newobject is a special typemap. The "newfree" typemap can be used to deallocate a newly allocated return value. It is only available on methods for which %newobject has been applied and is commonly used to clean-up string results. For example:

    %typemap(newfree) char * "free($1);";
    ...
    %newobject strdup;
    ...
    char *strdup(const char *s);
    

    In this case, the result of the function is a string in the target language. Since this string is a copy of the original result, the data returned by strdup() is no longer needed. The "newfree" typemap in the example simply releases this memory.

    As a complement to the %newobject, from SWIG 1.3.28, you can use the %delobject directive. For example, if you have two methods, one to create objects and one to destroy them, you can use:

    %newobject create_foo;
    %delobject destroy_foo;
    ...
    Foo *create_foo();
    void destroy_foo(Foo *foo);
    

    or in a member method as:

    %delobject Foo::destroy;
    
    class Foo {
    public:
      void destroy() { delete this;}
    
    private:
      ~Foo();
    };
    

    %delobject instructs SWIG that the first argument passed to the method will be destroyed, and therefore, the target language should not attempt to deallocate it twice. This is similar to use the DISOWN typemap in the first method argument, and in fact, it also depends on the target language on implementing the 'disown' mechanism properly.

    The use of %newobject is also integrated with reference counting and is covered in the C++ reference counted objects section.

    Compatibility note: Previous versions of SWIG had a special %new directive. However, unlike %newobject, it only applied to the next declaration. For example:

    %new char *strdup(const char *s);
    

    For now this is still supported but is deprecated.

    How to shoot yourself in the foot: The %newobject directive is not a declaration modifier like the old %new directive. Don't write code like this:

    %newobject
    char *strdup(const char *s);
    

    The results might not be what you expect.

    12.3 Features and the %feature directive

    Both %exception and %newobject are examples of a more general purpose customization mechanism known as "features." A feature is simply a user-definable property that is attached to specific declarations. Features are attached using the %feature directive. For example:

    %feature("except") Object::allocate {
      try {
        $action
      }
      catch (MemoryError) {
        croak("Out of memory");
      }
    }
    
    %feature("new", "1") *::copy;
    

    In fact, the %exception and %newobject directives are really nothing more than macros involving %feature:

    #define %exception %feature("except")
    #define %newobject %feature("new", "1")
    

    The name matching rules outlined in the Ambiguity resolution and renaming section applies to all %feature directives. In fact the %rename directive is just a special form of %feature. The matching rules mean that features are very flexible and can be applied with pinpoint accuracy to specific declarations if needed. Additionally, if no declaration name is given, a global feature is said to be defined. This feature is then attached to every declaration that follows. This is how global exception handlers are defined. For example:

    /* Define a global exception handler */
    %feature("except") {
      try {
        $action
      }
      ...
    }
    
    ... bunch of declarations ...
    

    The %feature directive can be used with different syntax. The following are all equivalent:

    %feature("except") Object::method { $action };
    %feature("except") Object::method %{ $action %};
    %feature("except") Object::method " $action ";
    %feature("except", "$action") Object::method;
    

    The syntax in the first variation will generate the { } delimiters used whereas the other variations will not.

    12.3.1 Feature attributes

    The %feature directive also accepts XML style attributes in the same way that typemaps do. Any number of attributes can be specified. The following is the generic syntax for features:

    %feature("name", "value", attribute1="AttributeValue1") symbol;
    %feature("name", attribute1="AttributeValue1") symbol {value};
    %feature("name", attribute1="AttributeValue1") symbol %{value%};
    %feature("name", attribute1="AttributeValue1") symbol "value";
    

    More than one attribute can be specified using a comma separated list. The Java module is an example that uses attributes in %feature("except"). The throws attribute specifies the name of a Java class to add to a proxy method's throws clause. In the following example, MyExceptionClass is the name of the Java class for adding to the throws clause.

    %feature("except", throws="MyExceptionClass") Object::method { 
      try {
        $action
      } catch (...) {
        ... code to throw a MyExceptionClass Java exception ...
      }
    };
    

    Further details can be obtained from the Java exception handling section.

    12.3.2 Feature flags

    Feature flags are used to enable or disable a particular feature. Feature flags are a common but simple usage of %feature and the feature value should be either 1 to enable or 0 to disable the feature.

    %feature("featurename")          // enables feature
    %feature("featurename", "1")     // enables feature
    %feature("featurename", "x")     // enables feature
    %feature("featurename", "0")     // disables feature
    %feature("featurename", "")      // clears feature
    

    Actually any value other than zero will enable the feature. Note that if the value is omitted completely, the default value becomes 1, thereby enabling the feature. A feature is cleared by specifying no value, see Clearing features. The %immutable directive described in the Creating read-only variables section, is just a macro for %feature("immutable"), and can be used to demonstrates feature flags:

                                    // features are disabled by default
    int red;                        // mutable
    
    %feature("immutable");          // global enable
    int orange;                     // immutable
    
    %feature("immutable", "0");     // global disable
    int yellow;                     // mutable
    
    %feature("immutable", "1");     // another form of global enable
    int green;                      // immutable
    
    %feature("immutable", "");      // clears the global feature
    int blue;                       // mutable
    

    Note that features are disabled by default and must be explicitly enabled either globally or by specifying a targeted declaration. The above intersperses SWIG directives with C code. Of course you can target features explicitly, so the above could also be rewritten as:

    %feature("immutable", "1") orange;
    %feature("immutable", "1") green;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    The above approach allows for the C declarations to be separated from the SWIG directives for when the C declarations are parsed from a C header file. The logic above can of course be inverted and rewritten as:

    %feature("immutable", "1");
    %feature("immutable", "0") red;
    %feature("immutable", "0") yellow;
    %feature("immutable", "0") blue;
    int red;                        // mutable
    int orange;                     // immutable
    int yellow;                     // mutable
    int green;                      // immutable
    int blue;                       // mutable
    

    As hinted above for %immutable, most feature flags can also be specified via alternative syntax. The alternative syntax is just a macro in the swig.swg Library file. The following shows the alternative syntax for the imaginary featurename feature:

    %featurename       // equivalent to %feature("featurename", "1") ie enables feature
    %nofeaturename     // equivalent to %feature("featurename", "0") ie disables feature
    %clearfeaturename  // equivalent to %feature("featurename", "")  ie clears feature
    

    The concept of clearing features is discussed next.

    12.3.3 Clearing features

    A feature stays in effect until it is explicitly cleared. A feature is cleared by supplying a %feature directive with no value. For example %feature("name", ""). A cleared feature means that any feature exactly matching any previously defined feature is no longer used in the name matching rules. So if a feature is cleared, it might mean that another name matching rule will apply. To clarify, let's consider the except feature again (%exception):

    // Define global exception handler
    %feature("except") {
      try {
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    // Define exception handler for all clone methods to log the method calls
    %feature("except") *::clone() {
      try {
        logger.info("$action");
        $action
      } catch (...) {
        croak("Unknown C++ exception");
      }
    }
    
    ... initial set of class declarations with clone methods ...
    
    // clear the previously defined feature
    %feature("except", "") *::clone();
    
    ... final set of class declarations with clone methods ...
    

    In the above scenario, the initial set of clone methods will log all method invocations from the target language. This specific feature is cleared for the final set of clone methods. However, these clone methods will still have an exception handler (without logging) as the next best feature match for them is the global exception handler.

    Note that clearing a feature is not always the same as disabling it. Clearing the feature above with %feature("except", "") *::clone() is not the same as specifying %feature("except", "0") *::clone(). The former will disable the feature for clone methods - the feature is still a better match than the global feature. If on the other hand, no global exception handler had been defined at all, then clearing the feature would be the same as disabling it as no other feature would have matched.

    Note that the feature must match exactly for it to be cleared by any previously defined feature. For example the following attempt to clear the initial feature will not work:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") *::clone();
    

    but this will:

    %feature("except") clone() { logger.info("$action"); $action }
    %feature("except", "") clone();
    

    SWIG provides macros for disabling and clearing features. Many of these can be found in the swig.swg library file. The typical pattern is to define three macros; one to define the feature itself, one to disable the feature and one to clear the feature. The three macros below show this for the "except" feature:

    #define %exception      %feature("except")
    #define %noexception    %feature("except", "0")
    #define %clearexception %feature("except", "")
    

    12.3.4 Features and default arguments

    SWIG treats methods with default arguments as separate overloaded methods as detailed in the default arguments section. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example:

    %feature("except") hello(int i=0, double d=0.0) { ... }
    void hello(int i=0, double d=0.0);
    

    will apply the feature to all three wrapper methods, that is:

    void hello(int i, double d);
    void hello(int i);
    void hello();
    

    If the default arguments are not specified in the feature:

    %feature("except") hello(int i, double d) { ... }
    void hello(int i=0, double d=0.0);
    

    then the feature will only apply to this wrapper method:

    void hello(int i, double d);
    

    and not these wrapper methods:

    void hello(int i);
    void hello();
    

    If compactdefaultargs are being used, then the difference between specifying or not specifying default arguments in a feature is not applicable as just one wrapper is generated.

    Compatibility note: The different behaviour of features specified with or without default arguments was introduced in SWIG-1.3.23 when the approach to wrapping methods with default arguments was changed.

    12.3.5 Feature example

    As has been shown earlier, the intended use for the %feature directive is as a highly flexible customization mechanism that can be used to annotate declarations with additional information for use by specific target language modules. Another example is in the Python module. You might use %feature to rewrite proxy/shadow class code as follows:

    %module example
    %rename(bar_id) bar(int, double);
    
    // Rewrite bar() to allow some nice overloading
    
    %feature("shadow") Foo::bar(int) %{
    def bar(*args):
        if len(args) == 3:
            return apply(examplec.Foo_bar_id, args)
        return apply(examplec.Foo_bar, args)
    %}
        
    class Foo {
    public:
      int bar(int x);
      int bar(int x, double y);
    }
    

    Further details of %feature usage is described in the documentation for specific language modules.

    swig-3.0.12/Doc/Manual/Ruby.html0000664000175000017500000045711613042756672016211 0ustar williamwilliam SWIG and Ruby

    38 SWIG and Ruby

    This chapter describes SWIG's support of Ruby.

    38.1 Preliminaries

    SWIG 3.0 is known to work with Ruby versions 1.8 and later. Given the choice, you should use the latest stable version of Ruby. You should also determine if your system supports shared libraries and dynamic loading. SWIG will work with or without dynamic loading, but the compilation process will vary.

    This chapter covers most SWIG features, but in less depth than is found in earlier chapters. At the very least, make sure you also read the "SWIG Basics" chapter. It is also assumed that the reader has a basic understanding of Ruby.

    38.1.1 Running SWIG

    To build a Ruby module, run SWIG using the -ruby option:

    $ swig -ruby example.i
    

    If building a C++ extension, add the -c++ option:

    $ swig -c++ -ruby example.i
    

    This creates a file example_wrap.c (example_wrap.cxx if compiling a C++ extension) that contains all of the code needed to build a Ruby extension module. To finish building the module, you need to compile this file and link it with the rest of your program.

    38.1.2 Getting the right header files

    In order to compile the wrapper code, the compiler needs the ruby.h header file and its dependencies, notably ruby/config.h which is found in a different, architecture-dependent, directory. The best way to find the compiler options needed to compile the code is to ask Ruby itself:

    $ ruby -rrbconfig -e 'puts "-I#{RbConfig::CONFIG[%q{rubyhdrdir}]} -I#{RbConfig::CONFIG[%q{rubyarchhdrdir}]}"'
    -I/usr/include/ruby-2.1.0 -I/usr/include/x86_64-linux-gnu/ruby-2.1.0
    

    38.1.3 Compiling a dynamic module

    Ruby extension modules are typically compiled into shared libraries that the interpreter loads dynamically at runtime. Since the exact commands for doing this vary from platform to platform, your best bet is to follow the steps described in the README.EXT file from the Ruby distribution:

    1. Create a file called extconf.rb that looks like the following:

      require 'mkmf'
      create_makefile('example')
    2. Type the following to build the extension:

      $ ruby extconf.rb
      $ make
      $ make install
          

    Of course, there is the problem that mkmf does not work correctly on all platforms, e.g, HPUX. If you need to add your own make rules to the file that extconf.rb produces, you can add this:

    open("Makefile", "a") { |mf|
     puts <<EOM
     # Your make rules go here
     EOM
    }
    

    to the end of the extconf.rb file. If for some reason you don't want to use the standard approach, you'll need to determine the correct compiler and linker flags for your build platform. For example, assuming you have code you need to link to in a file called example.c, a typical sequence of commands for the Linux operating system would look something like this:

    $ swig -ruby example.i
    $ gcc -O2 -fPIC -c example.c
    $ gcc -O2 -fPIC -c example_wrap.c -I/usr/include/ruby-2.1.0
    $ gcc -shared example.o example_wrap.o -o example.so
    

    The -fPIC option tells GCC to generate position-independent code (PIC) which is required for most architectures (it's not vital on x86, but still a good idea as it allows code pages from the library to be shared between processes). Other compilers may need a different option specified instead of -fPIC.

    If in doubt, consult the manual pages for your compiler and linker to determine the correct set of options. You might also check the SWIG Wiki for additional information.

    38.1.4 Using your module

    Ruby module names must be capitalized, but the convention for Ruby feature names is to use lowercase names. So, for example, the Etc extension module is imported by requiring the etc feature:

    # The feature name begins with a lowercase letter...
    require 'etc'
    
    # ... but the module name begins with an uppercase letter
    puts "Your login name: #{Etc.getlogin}"
    

    To stay consistent with this practice, you should always specify a lowercase module name with SWIG's %module directive. SWIG will automatically correct the resulting Ruby module name for your extension. So for example, a SWIG interface file that begins with:

    %module example

    will result in an extension module using the feature name "example" and Ruby module name "Example".

    38.1.5 Static linking

    An alternative approach to dynamic linking is to rebuild the Ruby interpreter with your extension module added to it. In the past, this approach was sometimes necessary due to limitations in dynamic loading support on certain machines. However, the situation has improved greatly over the last few years and you should not consider this approach unless there is really no other option.

    The usual procedure for adding a new module to Ruby involves finding the Ruby source, adding an entry to the ext/Setup file, adding your directory to the list of extensions in the file, and finally rebuilding Ruby.

    38.1.6 Compilation of C++ extensions

    On most machines, C++ extension modules should be linked using the C++ compiler. For example:

    $ swig -c++ -ruby example.i
    $ g++ -fPIC -c example.cxx
    $ g++ -fPIC -c example_wrap.cxx -I/usr/include/ruby-2.1.0
    $ g++ -shared example.o example_wrap.o -o example.so
    

    If you've written an extconf.rb script to automatically generate a Makefile for your C++ extension module, keep in mind that (as of this writing) Ruby still uses gcc and not g++ as its linker. As a result, the required C++ runtime library support will not be automatically linked into your extension module and it may fail to load on some platforms. A workaround for this problem is use the mkmf module's append_library() method to add one of the C++ runtime libraries to the list of libraries linked into your extension, e.g.

    require 'mkmf'
    $libs = append_library($libs, "supc++")
    create_makefile('example')

    38.2 Building Ruby Extensions under Windows 95/NT

    Building a SWIG extension to Ruby under Windows 95/NT is roughly similar to the process used with Unix. Normally, you will want to produce a DLL that can be loaded into the Ruby interpreter. For all recent versions of Ruby, the procedure described above (i.e. using an extconf.rb script) will work with Windows as well; you should be able to build your code into a DLL by typing:

    C:\swigtest> ruby extconf.rb
    C:\swigtest> nmake
    C:\swigtest> nmake install
    

    The remainder of this section covers the process of compiling SWIG-generated Ruby extensions with Microsoft Visual C++ 6 (i.e. within the Developer Studio IDE, instead of using the command line tools). In order to build extensions, you may need to download the source distribution to the Ruby package, as you will need the Ruby header files.

    38.2.1 Running SWIG from Developer Studio

    If you are developing your application within Microsoft developer studio, SWIG can be invoked as a custom build option. The process roughly follows these steps :

    • Open up a new workspace and use the AppWizard to select a DLL project.
    • Add both the SWIG interface file (the .i file), any supporting C files, and the name of the wrapper file that will be created by SWIG (i.e. example_wrap.c). Note : If using C++, choose a different suffix for the wrapper file such as example_wrap.cxx. Don't worry if the wrapper file doesn't exist yet--Developer Studio will keep a reference to it around.
    • Select the SWIG interface file and go to the settings menu. Under settings, select the "Custom Build" option.
    • Enter "SWIG" in the description field.
    • Enter "swig -ruby -o $(ProjDir)\$(InputName)_wrap.c $(InputPath)" in the "Build command(s) field". You may have to include the path to swig.exe.
    • Enter "$(ProjDir)\$(InputName)_wrap.c" in the "Output files(s) field".
    • Next, select the settings for the entire project and go to the C/C++ tab and select the Preprocessor category. Add NT=1 to the Preprocessor definitions. This must be set else you will get compilation errors. Also add IMPORT to the preprocessor definitions, else you may get runtime errors. Also add the include directories for your Ruby installation under "Additional include directories".
    • Next, select the settings for the entire project and go to the Link tab and select the General category. Set the name of the output file to match the name of your Ruby module (i.e.. example.dll). Next add the Ruby library file to your link libraries under Object/Library modules. For example "mswin32-ruby16.lib. You also need to add the path to the library under the Input tab - Additional library path.
    • Build your project.

    Now, assuming all went well, SWIG will be automatically invoked when you build your project. Any changes made to the interface file will result in SWIG being automatically invoked to produce a new version of the wrapper file. To run your new Ruby extension, simply run Ruby and use the require command as normal. For example if you have this ruby file run.rb:

    # file: run.rb
    require 'Example'
    
    # Call a c function
    print "Foo = ", Example.Foo, "\n"

    Ensure the dll just built is in your path or current directory, then run the Ruby script from the DOS/Command prompt:

    C:\swigtest> ruby run.rb
    Foo = 3.0
    

    38.3 The Ruby-to-C/C++ Mapping

    This section describes the basics of how SWIG maps C or C++ declarations in your SWIG interface files to Ruby constructs.

    38.3.1 Modules

    The SWIG %module directive specifies the name of the Ruby module. If you specify:

    %module example

    then everything is wrapped into a Ruby module named Example that is nested directly under the global module. You can specify a more deeply nested module by specifying the fully-qualified module name in quotes, e.g.

    %module "foo::bar::spam"

    An alternate method of specifying a nested module name is to use the -prefix option on the SWIG command line. The prefix that you specify with this option will be prepended to the module name specified with the %module directive in your SWIG interface file. So for example, this declaration at the top of your SWIG interface file:

    %module "foo::bar::spam"

    will result in a nested module name of Foo::Bar::Spam, but you can achieve the same effect by specifying:

    %module spam

    and then running SWIG with the -prefix command line option:

    $ swig -ruby -prefix "foo::bar::" example.i
    

    Starting with SWIG 1.3.20, you can also choose to wrap everything into the global module by specifying the -globalmodule option on the SWIG command line, i.e.

    $ swig -ruby -globalmodule example.i
    

    Note that this does not relieve you of the requirement of specifying the SWIG module name with the %module directive (or the -module command-line option) as described earlier.

    When choosing a module name, do not use the same name as a built-in Ruby command or standard module name, as the results may be unpredictable. Similarly, if you're using the -globalmodule option to wrap everything into the global module, take care that the names of your constants, classes and methods don't conflict with any of Ruby's built-in names.

    38.3.2 Functions

    Global functions are wrapped as Ruby module methods. For example, given the SWIG interface file example.i:

    %module example
    
    int fact(int n);

    and C source file example.c:

    int fact(int n) {
      if (n == 0)
      return 1;
      return (n * fact(n-1));
    }

    SWIG will generate a method fact in the Example module that can be used like so:

    $ irb
    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(4)
    24

    38.3.3 Variable Linking

    C/C++ global variables are wrapped as a pair of singleton methods for the module: one to get the value of the global variable and one to set it. For example, the following SWIG interface file declares two global variables:

    // SWIG interface file with global variables
    %module example
    ...
    %inline %{
      extern int variable1;
      extern double Variable2;
    %}
    ...

    Now look at the Ruby interface:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example.variable1 = 2
    2
    irb(main):003:0> Example.Variable2 = 4 * 10.3
    41.2
    irb(main):004:0> Example.Variable2
    41.2

    If you make an error in variable assignment, you will receive an error message. For example:

    irb(main):005:0> Example.Variable2 = "hello"
    TypeError: no implicit conversion to float from string
    from (irb):5:in `Variable2='
    from (irb):5

    If a variable is declared as const, it is wrapped as a read-only variable. Attempts to modify its value will result in an error.

    To make ordinary variables read-only, you can also use the %immutable directive. For example:

    %immutable;
    %inline %{
      extern char *path;
    %}
    %mutable;

    The %immutable directive stays in effect until it is explicitly disabled using %mutable.

    38.3.4 Constants

    C/C++ constants are wrapped as module constants initialized to the appropriate value. To create a constant, use #define or the %constant directive. For example:

    #define PI 3.14159
    #define VERSION "1.0"
    
    %constant int FOO = 42;
    %constant const char *path = "/usr/local";
    
    const int BAR = 32;

    Remember to use the :: operator in Ruby to get at these constant values, e.g.

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> Example::PI
    3.14159

    38.3.5 Pointers

    "Opaque" pointers to arbitrary C/C++ types (i.e. types that aren't explicitly declared in your SWIG interface file) are wrapped as data objects. So, for example, consider a SWIG interface file containing only the declarations:

    Foo *get_foo();
    void set_foo(Foo *foo);

    For this case, the get_foo() method returns an instance of an internally generated Ruby class:

    irb(main):001:0> foo = Example::get_foo()
    #<SWIG::TYPE_p_Foo:0x402b1654>

    A NULL pointer is always represented by the Ruby nil object.

    38.3.6 Structures

    C/C++ structs are wrapped as Ruby classes, with accessor methods (i.e. "getters" and "setters") for all of the struct members. For example, this struct declaration:

    struct Vector {
      double x, y;
    };

    gets wrapped as a Vector class, with Ruby instance methods x, x=, y and y=. These methods can be used to access structure data from Ruby as follows:

    $ irb
    irb(main):001:0> require 'Example'
    true
    irb(main):002:0> f = Example::Vector.new
    #<Example::Vector:0x4020b268>
    irb(main):003:0> f.x = 10
    nil
    irb(main):004:0> f.x
    10.0

    Similar access is provided for unions and the public data members of C++ classes.

    const members of a structure are read-only. Data members can also be forced to be read-only using the %immutable directive (in C++, private may also be used). For example:

    struct Foo {
      ...
      %immutable;
      int x; /* Read-only members */
      char *name;
      %mutable;
      ...
    };

    When char * members of a structure are wrapped, the contents are assumed to be dynamically allocated using malloc or new (depending on whether or not SWIG is run with the -c++ option). When the structure member is set, the old contents will be released and a new value created. If this is not the behavior you want, you will have to use a typemap (described shortly).

    Array members are normally wrapped as read-only. For example, this code:

    struct Foo {
      int x[50];
    };

    produces a single accessor function like this:

    int *Foo_x_get(Foo *self) {
      return self->x;
    };

    If you want to set an array member, you will need to supply a "memberin" typemap described in the section on typemaps. As a special case, SWIG does generate code to set array members of type char (allowing you to store a Ruby string in the structure).

    When structure members are wrapped, they are handled as pointers. For example,

    struct Foo {
      ...
    };
    
    struct Bar {
      Foo f;
    };

    generates accessor functions such as this:

    Foo *Bar_f_get(Bar *b) {
      return &b->f;
    }
    
    void Bar_f_set(Bar *b, Foo *val) {
      b->f = *val;
    }

    38.3.7 C++ classes

    Like structs, C++ classes are wrapped by creating a new Ruby class of the same name with accessor methods for the public class member data. Additionally, public member functions for the class are wrapped as Ruby instance methods, and public static member functions are wrapped as Ruby singleton methods. So, given the C++ class declaration:

    class List {
    public:
      List();
      ~List();
      int search(char *item);
      void insert(char *item);
      void remove(char *item);
      char *get(int n);
      int length;
      static void print(List *l);
    };

    SWIG would create a List class with:

    • instance methods search, insert, remove, and get;
    • instance methods length and length= (to get and set the value of the length data member); and,
    • a print singleton method for the class.

    In Ruby, these functions are used as follows:

    require 'Example'
    
    l = Example::List.new
    
    l.insert("Ale")
    l.insert("Stout")
    l.insert("Lager")
    Example.print(l)
    l.length()
    ----- produces the following output 
    Lager
    Stout
    Ale
    3

    38.3.8 C++ Inheritance

    The SWIG type-checker is fully aware of C++ inheritance. Therefore, if you have classes like this:

    class Parent {
      ...
    };
    
    class Child : public Parent {
      ...
    };

    those classes are wrapped into a hierarchy of Ruby classes that reflect the same inheritance structure. All of the usual Ruby utility methods work normally:

    irb(main):001:0> c = Child.new
    #<Bar:0x4016efd4>
    irb(main):002:0> c.instance_of? Child
    true
    irb(main):003:0> b.instance_of? Parent
    false
    irb(main):004:0> b.is_a? Child
    true
    irb(main):005:0> b.is_a? Parent
    true
    irb(main):006:0> Child < Parent
    true
    irb(main):007:0> Child > Parent
    false

    Furthermore, if you have a function like this:

    void spam(Parent *f);

    then the function spam() accepts Parent* or a pointer to any class derived from Parent.

    Until recently, the Ruby module for SWIG didn't support multiple inheritance, and this is still the default behavior. This doesn't mean that you can't wrap C++ classes which inherit from multiple base classes; it simply means that only the first base class listed in the class declaration is considered, and any additional base classes are ignored. As an example, consider a SWIG interface file with a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    For this case, the resulting Ruby class (Derived) will only consider Base1 as its superclass. It won't inherit any of Base2's member functions or data and it won't recognize Base2 as an "ancestor" of Derived (i.e. the is_a? relationship would fail). When SWIG processes this interface file, you'll see a warning message like:

    example.i:5: Warning 802: Warning for Derived: Base Base2 ignored.
    Multiple inheritance is not supported in Ruby.

    Starting with SWIG 1.3.20, the Ruby module for SWIG provides limited support for multiple inheritance. Because the approach for dealing with multiple inheritance introduces some limitations, this is an optional feature that you can activate with the -minherit command-line option:

    $ swig -c++ -ruby -minherit example.i
    

    Using our previous example, if your SWIG interface file contains a declaration like this:

    class Derived : public Base1, public Base2
    {
      ...
    };

    and you run SWIG with the -minherit command-line option, then you will end up with a Ruby class Derived that appears to "inherit" the member data and functions from both Base1 and Base2. What actually happens is that three different top-level classes are created, with Ruby's Object class as their superclass. Each of these classes defines a nested module named Impl, and it's in these nested Impl modules that the actual instance methods for the classes are defined, i.e.

    class Base1
      module Impl
      # Define Base1 methods here
      end
      include Impl
    end
    
    class Base2
      module Impl
      # Define Base2 methods here
      end
      include Impl
    end
    
    class Derived
      module Impl
      include Base1::Impl
      include Base2::Impl
      # Define Derived methods here
      end
      include Impl
    end

    Observe that after the nested Impl module for a class is defined, it is mixed-in to the class itself. Also observe that the Derived::Impl module first mixes-in its base classes' Impl modules, thus "inheriting" all of their behavior.

    The primary drawback is that, unlike the default mode of operation, neither Base1 nor Base2 is a true superclass of Derived anymore:

    obj = Derived.new
    obj.is_a? Base1 # this will return false...
    obj.is_a? Base2 # ... and so will this

    In most cases, this is not a serious problem since objects of type Derived will otherwise behave as though they inherit from both Base1 and Base2 (i.e. they exhibit "Duck Typing").

    38.3.9 C++ Overloaded Functions

    C++ overloaded functions, methods, and constructors are mostly supported by SWIG. For example, if you have two functions like this:

    void foo(int);
    void foo(char *c);

    You can use them in Ruby in a straightforward manner:

    irb(main):001:0> foo(3) # foo(int)
    irb(main):002:0> foo("Hello") # foo(char *c)

    Similarly, if you have a class like this,

    class Foo {
    public:
      Foo();
      Foo(const Foo &);
      ...
    };

    you can write Ruby code like this:

    irb(main):001:0> f = Foo.new # Create a Foo
    irb(main):002:0> g = Foo.new(f) # Copy f

    Overloading support is not quite as flexible as in C++. Sometimes there are methods that SWIG can't disambiguate. For example:

    void spam(int);
    void spam(short);

    or

    void foo(Bar *b);
    void foo(Bar &b);

    If declarations such as these appear, you will get a warning message like this:

    example.i:12: Warning 509: Overloaded method spam(short) effectively ignored,
    example.i:11: Warning 509: as it is shadowed by spam(int).
    

    To fix this, you either need to ignore or rename one of the methods. For example:

    %rename(spam_short) spam(short);
    ...
    void spam(int); 
    void spam(short); // Accessed as spam_short

    or

    %ignore spam(short);
    ...
    void spam(int); 
    void spam(short); // Ignored

    SWIG resolves overloaded functions and methods using a disambiguation scheme that ranks and sorts declarations according to a set of type-precedence rules. The order in which declarations appear in the input does not matter except in situations where ambiguity arises--in this case, the first declaration takes precedence.

    Please refer to the "SWIG and C++" chapter for more information about overloading.

    38.3.10 C++ Operators

    For the most part, overloaded operators are handled automatically by SWIG and do not require any special treatment on your part. So if your class declares an overloaded addition operator, e.g.

    class Complex {
      ...
      Complex operator+(Complex &);
      ...
    };

    the resulting Ruby class will also support the addition (+) method correctly.

    For cases where SWIG's built-in support is not sufficient, C++ operators can be wrapped using the %rename directive (available on SWIG 1.3.10 and later releases). All you need to do is give the operator the name of a valid Ruby identifier. For example:

    %rename(add_complex) operator+(Complex &, Complex &);
    ...
    Complex operator+(Complex &, Complex &);

    Now, in Ruby, you can do this:

    a = Example::Complex.new(2, 3)
    b = Example::Complex.new(4, -1)
    c = Example.add_complex(a, b)

    More details about wrapping C++ operators into Ruby operators is discussed in the section on operator overloading.

    38.3.11 C++ namespaces

    SWIG is aware of C++ namespaces, but namespace names do not appear in the module nor do namespaces result in a module that is broken up into submodules or packages. For example, if you have a file like this,

    %module example
    
    namespace foo {
      int fact(int n);
      struct Vector {
        double x, y, z;
      };
    };

    it works in Ruby as follows:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> Example.fact(3)
    6
    irb(main):003:0> v = Example::Vector.new
    #<Example::Vector:0x4016f4d4>
    irb(main):004:0> v.x = 3.4
    3.4
    irb(main):004:0> v.y
    0.0

    If your program has more than one namespace, name conflicts (if any) can be resolved using %rename For example:

    %rename(Bar_spam) Bar::spam;
    
    namespace Foo {
      int spam();
    }
    
    namespace Bar {
      int spam();
    }

    If you have more than one namespace and your want to keep their symbols separate, consider wrapping them as separate SWIG modules. For example, make the module name the same as the namespace and create extension modules for each namespace separately. If your program utilizes thousands of small deeply nested namespaces each with identical symbol names, well, then you get what you deserve.

    38.3.12 C++ templates

    C++ templates don't present a huge problem for SWIG. However, in order to create wrappers, you have to tell SWIG to create wrappers for a particular template instantiation. To do this, you use the %template directive. For example:

    %module example
    
    %{
    #include "pair.h"
    %}
    
    template<class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
      T1 first;
      T2 second;
      pair();
      pair(const T1&, const T2&);
      ~pair();
    };
    
    %template(Pairii) pair<int, int>;

    In Ruby:

    irb(main):001:0> require 'example'
    true
    irb(main):002:0> p = Example::Pairii.new(3, 4)
    #<Example:Pairii:0x4016f4df>
    irb(main):003:0> p.first
    3
    irb(main):004:0> p.second
    4

    38.3.13 C++ Standard Template Library (STL)

    On a related note, the standard SWIG library contains a number of modules that provide typemaps for standard C++ library classes (such as std::pair, std::string and std::vector). These library modules don't provide wrappers around the templates themselves, but they do make it convenient for users of your extension module to pass Ruby objects (such as arrays and strings) to wrapped C++ code that expects instances of standard C++ templates. For example, suppose the C++ library you're wrapping has a function that expects a vector of floats:

    %module example
    
    float sum(const std::vector<float>& values);

    Rather than go through the hassle of writing an "in" typemap to convert an array of Ruby numbers into a std::vector<float>, you can just use the std_vector.i module from the standard SWIG library:

    %module example
    
    %include std_vector.i
    float sum(const std::vector<float>& values);

    Ruby's STL wrappings provide additional methods to make them behave more similarly to Ruby's native classes.

    Thus, you can do, for example:

    v = IntVector.new
    v << 2
    v << 3
    v << 4
    v.each { |x| puts x }
    
    => 2
    3
    4
    v.delete_if { |x| x == 3 }
    => [2, 4]

    The SWIG Ruby module provides also the ability for all the STL containers to carry around Ruby native objects (Fixnum, Classes, etc) making them act almost like Ruby's own Array, Hash, etc. To do that, you need to define a container that contains a swig::GC_VALUE, like:

    %module nativevector
    
    %{
    std::vector< swig::GC_VALUE > NativeVector;
    %}
    
    %template(NativeVector) std::vector< swig::GC_VALUE >;
    

    This vector can then contain any Ruby object, making them almost identical to Ruby's own Array class.

    require 'nativevector'
    include NativeVector
    
    v = NativeVector.new
    v << 1
    v << [1, 2]
    v << 'hello'
    
    class A; end
    
    v << A.new
    
    puts v
    => [1, [1, 2], 'hello', #<A:0x245325>]
    

    Obviously, there is a lot more to template wrapping than shown in these examples. More details can be found in the SWIG and C++ chapter.

    38.3.14 C++ STL Functors

    Some containers in the STL allow you to modify their default behavior by using so called functors or function objects. Functors are often just a very simple struct with operator() redefined or an actual C/C++ function. This allows you, for example, to always keep the sort order of a STL container to your liking.

    The Ruby STL mappings allows you to modify those containers that support functors using Ruby procs or methods, instead. Currently, this includes std::set, set::map, std::multiset and std::multimap.

    The functors in swig are called swig::UnaryFunction and swig::BinaryFunction. For C++ predicates (ie. functors that must return bool as a result) swig::UnaryPredicate and swig::BinaryPredicate are provided.

    As an example, if given this swig file:

    %module intset;
    
    %include <std_set.i>
    
    %template(IntSet) std::set< int, swig::BinaryPredicate >;
    

    You can then use the set from Ruby with or without a proc object as a predicate:

    require 'intset'
    include Intset
    
    # Default sorting behavior defined in C++
    a = IntSet.new
    a << 1
    a << 2
    a << 3
    a
    => [1, 2, 3]
    
    # Custom sorting behavior defined by a Ruby proc
    b = IntSet.new( proc { |a, b| a > b } )
    b << 1
    b << 2
    b << 3
    b
    =>  [3, 2, 1]
    

    38.3.15 C++ STL Iterators

    The STL is well known for the use of iterators. There are a number of iterators possible with different properties, but in general there are two main categories: const iterators and non-const iterators. The const iterators can access and not modify the values they point at, while the non-const iterators can both read and modify the values.

    The Ruby STL wrappings support both type of iterators by using a proxy class in-between. This proxy class is swig::Iterator or swig::ConstIterator. Derived from them are template classes that need to be initialized with the actual iterator for the container you are wrapping and often times with the beginning and ending points of the iteration range.

    The SWIG STL library already provides typemaps to all the standard containers to do this wrapping automatically for you, but if you have your own STL-like iterator, you will need to write your own typemap for them. For out typemaps, the special functions make_const_iterator and make_nonconst_iterator are provided.

    These can be used either like:

    make_const_iterator( iterator, rubyclass );
    make_const_iterator( iterator, iterator_begin, iterator_end, rubyclass );
    

    The iterators support a next() and previous() member function to just change the iterator without returning anything. previous() should obviously only be used for bidirectional iterators. You can also advance the iterator multiple steps by using standard math operations like +=.

    The value the iterator points at can be accessed with value() -- this is equivalent to dereferencing it with *i. For non-const iterators, a value=() function is also provided which allows you to change the value pointed by the iterator. This is equivalent to the C++ construct of dereferencing and assignment, like *i = something.

    Thus, given say a vector class of doubles defined as:

    %module doublevector
    
    %include std_vector.i
    
    %template(DoubleVector) std::vector<double>;
    

    Its iterator can then be used from Ruby like:

    require 'doublevector'
    include Doublevector
    
    v = DoubleVector.new
    v << 1
    v << 2
    v << 3
    
    #
    # an elaborate and less efficient way of doing v.map! { |x| x+2 }
    #
    i = v.begin
    e = v.end
    while i != e
      val = i.value
      val += 2
      i.value = val
      i.next
    end
    i
    >> [3, 4, 5 ]
    

    If you'd rather have STL classes without any iterators, you should define -DSWIG_NO_EXPORT_ITERATOR_METHODS when running swig.

    38.3.16 C++ Smart Pointers

    38.3.16.1 The shared_ptr Smart Pointer

    The C++11 standard provides std::shared_ptr which was derived from the Boost implementation, boost::shared_ptr. Both of these are available for Ruby in the SWIG library and usage is outlined in the shared_ptr smart pointer library section.

    38.3.16.2 Generic Smart Pointers

    In certain C++ programs, it is common to use classes that have been wrapped by so-called "smart pointers." Generally, this involves the use of a template class that implements operator->() like this:

    template<class T> class SmartPtr {
      ...
      T *operator->();
      ...
    }

    Then, if you have a class like this,

    class Foo {
    public:
      int x;
      int bar();
    };

    A smart pointer would be used in C++ as follows:

    SmartPtr<Foo> p = CreateFoo(); // Created somehow (not shown)
    ...
    p->x = 3; // Foo::x
    int y = p->bar(); // Foo::bar

    To wrap this in Ruby, simply tell SWIG about the SmartPtr class and the low-level Foo object. Make sure you instantiate SmartPtr using %template if necessary. For example:

    %module example
    ...
    %template(SmartPtrFoo) SmartPtr<Foo>;
    ...

    Now, in Ruby, everything should just "work":

    irb(main):001:0> p = Example::CreateFoo() # Create a smart-pointer somehow
    #<Example::SmartPtrFoo:0x4016f4df>
    irb(main):002:0> p.x = 3 # Foo::x
    3
    irb(main):003:0> p.bar() # Foo::bar

    If you ever need to access the underlying pointer returned by operator->() itself, simply use the __deref__() method. For example:

    irb(main):004:0> f = p.__deref__() # Returns underlying Foo *

    38.3.17 Cross-Language Polymorphism

    SWIG's Ruby module supports cross-language polymorphism (a.k.a. the "directors" feature) similar to that for SWIG's Python module. Rather than duplicate the information presented in the Python chapter, this section just notes the differences that you need to be aware of when using this feature with Ruby.

    38.3.17.1 Exception Unrolling

    Whenever a C++ director class routes one of its virtual member function calls to a Ruby instance method, there's always the possibility that an exception will be raised in the Ruby code. By default, those exceptions are ignored, which simply means that the exception will be exposed to the Ruby interpreter. If you would like to change this behavior, you can use the %feature("director:except") directive to indicate what action should be taken when a Ruby exception is raised. The following code should suffice in most cases:

    %feature("director:except") {
      throw Swig::DirectorMethodException($error);
    }

    When this feature is activated, the call to the Ruby instance method is "wrapped" using the rb_rescue2() function from Ruby's C API. If any Ruby exception is raised, it will be caught here and a C++ exception is raised in its place.

    38.4 Naming

    Ruby has several common naming conventions. Constants are generally in upper case, module and class names are in camel case and methods are in lower case with underscores. For example:

    • MATH::PI is a constant name
    • MyClass is a class name
    • my_method is a method name

    Prior to version 1.3.28, SWIG did not support these Ruby conventions. The only modifications it made to names was to capitalize the first letter of constants (which includes module and class names).

    SWIG 1.3.28 introduces the new -autorename command line parameter. When this parameter is specified, SWIG will automatically change constant, class and method names to conform with the standard Ruby naming conventions. For example:

    $ swig -ruby -autorename example.i
    

    To disable renaming use the -noautorename command line option.

    Since this change significantly changes the wrapper code generated by SWIG, it is turned off by default in SWIG 1.3.28. However, it is planned to become the default option in future releases.

    38.4.1 Defining Aliases

    It's a fairly common practice in the Ruby built-ins and standard library to provide aliases for method names. For example, Array#size is an alias for Array#length. If you would like to provide an alias for one of your class' instance methods, one approach is to use SWIG's %extend directive to add a new method of the aliased name that calls the original function. For example:

    class MyArray {
    public:
      // Construct an empty array
      MyArray();
    
      // Return the size of this array
      size_t length() const;
    };
    
    %extend MyArray {
      // MyArray#size is an alias for MyArray#length
      size_t size() const {
        return $self->length();
      }
    }
     

    A better solution is to use the %alias directive (unique to SWIG's Ruby module). The previous example could then be rewritten as:

    // MyArray#size is an alias for MyArray#length
    %alias MyArray::length "size";
    
    class MyArray {
    public:
      // Construct an empty array
      MyArray();
     
      // Return the size of this array
      size_t length() const;
    };

    Multiple aliases can be associated with a method by providing a comma-separated list of aliases to the %alias directive, e.g.

    %alias MyArray::length "amount, quantity, size";

    From an end-user's standpoint, there's no functional difference between these two approaches; i.e. they should get the same result from calling either MyArray#size or MyArray#length. However, when the %alias directive is used, SWIG doesn't need to generate all of the wrapper code that's usually associated with added methods like our MyArray::size() example.

    Note that the %alias directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.4.2 Predicate Methods

    Ruby methods that return a boolean value and end in a question mark are known as predicate methods. Examples of predicate methods in standard Ruby classes include Array#empty? (which returns true for an array containing no elements) and Object#instance_of? (which returns true if the object is an instance of the specified class). For consistency with Ruby conventions, methods that return boolean values should be marked as predicate methods.

    One cumbersome solution to this problem is to rename the method (using SWIG's %rename directive) and provide a custom typemap that converts the function's actual return type to Ruby's true or false. For example:

    %rename("is_it_safe?") is_it_safe();
    
    %typemap(out) int is_it_safe "$result = ($1 != 0) ? Qtrue : Qfalse;";
    
    int is_it_safe();

    A better solution is to use the %predicate directive (unique to SWIG's Ruby module) to designate a method as a predicate method. For the previous example, this would look like:

    %predicate is_it_safe();
    
    int is_it_safe();

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::is_it_safe?
    true

    The %predicate directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.4.3 Bang Methods

    Ruby methods that modify an object in-place and end in an exclamation mark are known as bang methods. An example of a bang method is Array#sort! which changes the ordering of items in an array. Contrast this with Array#sort, which returns a copy of the array with the items sorted instead of modifying the original array. For consistency with Ruby conventions, methods that modify objects in place should be marked as bang methods.

    Bang methods can be marked using the %bang directive which is unique to the Ruby module and was introduced in SWIG 1.3.28. For example:

    %bang sort(int arr[]);
    
    int sort(int arr[]); 

    This method would be invoked from Ruby code like this:

    irb(main):001:0> Example::sort!(arr)

    The %bang directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.4.4 Getters and Setters

    Often times a C++ library will expose properties through getter and setter methods. For example:

    class Foo {
      Foo() {}
      int getValue() { return value_; }
      void setValue(int value) { value_ = value; }
    
    private:
      int value_;
    };

    By default, SWIG will expose these methods to Ruby as get_value and set_value. However, it more natural for these methods to be exposed in Ruby as value and value=. That allows the methods to be used like this:

    irb(main):001:0> foo = Foo.new()
    irb(main):002:0> foo.value = 5
    irb(main):003:0> puts foo.value

    This can be done by using the %rename directive:

    %rename("value") Foo::getValue();
    %rename("value=") Foo::setValue(int value);

    38.5 Input and output parameters

    A common problem in some C programs is handling parameters passed as simple pointers. For example:

    void add(int x, int y, int *result) {
      *result = x + y;
    }

    or

    int sub(int *x, int *y) {
      return *x-*y;
    }

    The easiest way to handle these situations is to use the typemaps.i file. For example:

    %module Example
    %include "typemaps.i"
    
    void add(int, int, int *OUTPUT);
    int sub(int *INPUT, int *INPUT);

    In Ruby, this allows you to pass simple values. For example:

    a = Example.add(3, 4)
    puts a
    7
    b = Example.sub(7, 4)
    puts b
    3

    Notice how the INPUT parameters allow integer values to be passed instead of pointers and how the OUTPUT parameter creates a return result.

    If you don't want to use the names INPUT or OUTPUT, use the %apply directive. For example:

    %module Example
    %include "typemaps.i"
    
    %apply int *OUTPUT { int *result };
    %apply int *INPUT { int *x, int *y};
    
    void add(int x, int y, int *result);
    int sub(int *x, int *y);

    If a function mutates one of its parameters like this,

    void negate(int *x) {
     *x = -(*x);
    }

    you can use INOUT like this:

    %include "typemaps.i"
    ...
    void negate(int *INOUT);

    In Ruby, a mutated parameter shows up as a return value. For example:

    a = Example.negate(3)
    print a
    -3

    The most common use of these special typemap rules is to handle functions that return more than one value. For example, sometimes a function returns a result as well as a special error code:

    /* send message, return number of bytes sent, success code, and error_code */
    int send_message(char *text, int *success, int *error_code);

    To wrap such a function, simply use the OUTPUT rule above. For example:

    %module example
    %include "typemaps.i"
    ...
    int send_message(char *, int *OUTPUT, int *OUTPUT);

    When used in Ruby, the function will return an array of multiple values.

    bytes, success, error_code = send_message("Hello World")
    if not success
      print "error #{error_code} : in send_message"
    else
      print "Sent", bytes
    end

    Another way to access multiple return values is to use the %apply rule. In the following example, the parameters rows and columns are related to SWIG as OUTPUT values through the use of %apply

    %module Example
    %include "typemaps.i"
    %apply int *OUTPUT { int *rows, int *columns };
    ...
    void get_dimensions(Matrix *m, int *rows, int*columns);

    In Ruby:

    r, c = Example.get_dimensions(m)

    38.6 Exception handling

    38.6.1 Using the %exception directive

    The SWIG %exception directive can be used to define a user-definable exception handler that can convert C/C++ errors into Ruby exceptions. The chapter on Customization Features contains more details, but suppose you have a C++ class like the following :

    class DoubleArray {
    private:
      int n;
      double *ptr;
    public:
      // Create a new array of fixed size
      DoubleArray(int size) {
        ptr = new double[size];
        n = size;
      }
     
      // Destroy an array
      ~DoubleArray() {
        delete ptr;
      } 
     
      // Return the length of the array
      int length() {
        return n;
      }
     
      // Get an array item and perform bounds checking.
      double getitem(int i) {
        if ((i >= 0) && (i < n))
          return ptr[i];
        else
          throw RangeError();
      }
     
      // Set an array item and perform bounds checking.
      void setitem(int i, double val) {
        if ((i >= 0) && (i < n))
          ptr[i] = val;
        else {
          throw RangeError();
        }
      }
    };

    Since several methods in this class can throw an exception for an out-of-bounds access, you might want to catch this in the Ruby extension by writing the following in an interface file:

    %exception {
      try {
        $action
      }
      catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error.");
      }
    }
    
    class DoubleArray {
      ...
    };

    The exception handling code is inserted directly into generated wrapper functions. When an exception handler is defined, errors can be caught and used to gracefully raise a Ruby exception instead of forcing the entire program to terminate with an uncaught error.

    As shown, the exception handling code will be added to every wrapper function. Because this is somewhat inefficient, you might consider refining the exception handler to only apply to specific methods like this:

    %exception getitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in getitem.");
      }
    }
     
    %exception setitem {
      try {
        $action
      } catch (const RangeError&) {
        static VALUE cpperror = rb_define_class("CPPError", rb_eStandardError);
        rb_raise(cpperror, "Range error in setitem.");
      }
    }

    In this case, the exception handler is only attached to methods and functions named getitem and setitem.

    Since SWIG's exception handling is user-definable, you are not limited to C++ exception handling. See the chapter on Customization Features for more examples.

    38.6.2 Handling Ruby Blocks

    One of the highlights of Ruby and most of its standard library is the use of blocks, which allow the easy creation of continuations and other niceties. Blocks in ruby are also often used to simplify the passing of many arguments to a class.

    In order to make your class constructor support blocks, you can take advantage of the %exception directive, which will get run after the C++ class' constructor was called.

    For example, this yields the class over after its construction:

    class Window
    {
    public:
      Window(int x, int y, int w, int h);
      // .... other methods here ....
    };
    
    // Add support for yielding self in the Class' constructor.
    %exception Window::Window {
      $action
      if (rb_block_given_p()) {
        rb_yield(self);
      }
    }

    Then, in ruby, it can be used like:

    Window.new(0, 0, 360, 480) { |w|
      w.color = Fltk::RED
      w.border = false
    }
    

    For other methods, you can usually use a dummy parameter with a special in typemap, like:

    //
    // original function was:
    //
    // void func(int x);
    
    %typemap(in, numinputs=0) int RUBY_YIELD_SELF {
      if ( !rb_block_given_p() )
        rb_raise("No block given");
      return rb_yield(self);
    }
    
    %extend {
      void func(int x, int RUBY_YIELD_SELF );
    }
    

    For more information on typemaps, see Typemaps.

    38.6.3 Raising exceptions

    There are three ways to raise exceptions from C++ code to Ruby.

    The first way is to use SWIG_exception(int code, const char *msg). The following table shows the mappings from SWIG error codes to Ruby exceptions:

    SWIG_MemoryError
    rb_eNoMemError
    SWIG_IOError
    rb_eIOError
    SWIG_RuntimeError
    rb_eRuntimeError
    SWIG_IndexError
    rb_eIndexError
    SWIG_TypeError
    rb_eTypeError
    SWIG_DivisionByZero
    rb_eZeroDivError
    SWIG_OverflowError
    rb_eRangeError
    SWIG_SyntaxError
    rb_eSyntaxError
    SWIG_ValueError
    rb_eArgError
    SWIG_SystemError
    rb_eFatal
    SWIG_AttributeError
    rb_eRuntimeError
    SWIG_NullReferenceError
    rb_eNullReferenceError*
    SWIG_ObjectPreviouslyDeletedError
    rb_eObjectPreviouslyDeleted*
    SWIG_UnknownError
    rb_eRuntimeError
    * These error classes are created by SWIG and are not built-in Ruby exception classes

    The second way to raise errors is to use SWIG_Raise(obj, type, desc). Obj is a C++ instance of an exception class, type is a string specifying the type of exception (for example, "MyError") and desc is the SWIG description of the exception class. For example:

    %raise(SWIG_NewPointerObj(e, SWIGTYPE_p_AssertionFailedException, 0), ":AssertionFailedException", SWIGTYPE_p_AssertionFailedException);
    

    This is useful when you want to pass the current exception object directly to Ruby, particularly when the object is an instance of class marked as an %exceptionclass (see the next section for more information).

    Last, you can raise an exception by directly calling Ruby's C api. This is done by invoking the rb_raise() function. The first argument passed to rb_raise() is the exception type. You can raise a custom exception type or one of the built-in Ruby exception types.

    38.6.4 Exception classes

    Starting with SWIG 1.3.28, the Ruby module supports the %exceptionclass directive, which is used to identify C++ classes that are used as exceptions. Classes that are marked with the %exceptionclass directive are exposed in Ruby as child classes of rb_eRuntimeError. This allows C++ exceptions to be directly mapped to Ruby exceptions, providing for a more natural integration between C++ code and Ruby code.

    %exceptionclass CustomError;
    
    %inline %{
      class CustomError { };
    
      class Foo { 
      public:
        void test() { throw CustomError; }
      };
    %}

    From Ruby you can now call this method like this:

    foo = Foo.new
    begin
      foo.test()
    rescue CustomError => e
      puts "Caught custom error"
    end 

    For another example look at swig/Examples/ruby/exception_class.

    38.7 Typemaps

    This section describes how you can modify SWIG's default wrapping behavior for various C/C++ datatypes using the %typemap directive. This is an advanced topic that assumes familiarity with the Ruby C API as well as the material in the "Typemaps" chapter.

    Before proceeding, it should be stressed that typemaps are not a required part of using SWIG---the default wrapping behavior is enough in most cases. Typemaps are only used if you want to change some aspect of the primitive C-Ruby interface.

    38.7.1 What is a typemap?

    A typemap is nothing more than a code generation rule that is attached to a specific C datatype. The general form of this declaration is as follows ( parts enclosed in [...] are optional ):

    %typemap( method [, modifiers...] ) typelist code;
    

    method is a simply a name that specifies what kind of typemap is being defined. It is usually a name like "in", "out", or "argout" (or its director variations). The purpose of these methods is described later.

    modifiers is an optional comma separated list of name="value" values. These are sometimes to attach extra information to a typemap and is often target-language dependent.

    typelist is a list of the C++ type patterns that the typemap will match. The general form of this list is as follows:

    typelist : typepattern [, typepattern, typepattern, ... ] ;
    
    typepattern : type [ (parms) ]
      | type name [ (parms) ]
      | ( typelist ) [ (parms) ]

    Each type pattern is either a simple type, a simple type and argument name, or a list of types in the case of multi-argument typemaps. In addition, each type pattern can be parameterized with a list of temporary variables (parms). The purpose of these variables will be explained shortly.

    code specifies the C code used in the typemap. It can take any one of the following forms:

    code : { ... }
      | " ... "
      | %{ ... %}

    For example, to convert integers from Ruby to C, you might define a typemap like this:

    %module example
    
    %typemap(in) int {
      $1 = (int) NUM2INT($input);
      printf("Received an integer : %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    Typemaps are always associated with some specific aspect of code generation. In this case, the "in" method refers to the conversion of input arguments to C/C++. The datatype int is the datatype to which the typemap will be applied. The supplied C code is used to convert values. In this code a number of special variables prefaced by a $ are used. The $1 variable is placeholder for a local variable of type int. The $input variable is the input Ruby object.

    When this example is compiled into a Ruby module, the following sample code:

    require 'example'
    
    puts Example.fact(6)

    prints the result:

    Received an integer : 6
    720
    

    In this example, the typemap is applied to all occurrences of the int datatype. You can refine this by supplying an optional parameter name. For example:

    %module example
    
    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    %inline %{
      extern int fact(int n);
    %}

    In this case, the typemap code is only attached to arguments that exactly match "int n".

    The application of a typemap to specific datatypes and argument names involves more than simple text-matching--typemaps are fully integrated into the SWIG type-system. When you define a typemap for int, that typemap applies to int and qualified variations such as const int. In addition, the typemap system follows typedef declarations. For example:

    %typemap(in) int n {
      $1 = (int) NUM2INT($input);
      printf("n = %d\n", $1);
    }
    
    typedef int Integer;
    extern int fact(Integer n); // Above typemap is applied

    However, the matching of typedef only occurs in one direction. If you defined a typemap for Integer, it is not applied to arguments of type int.

    Typemaps can also be defined for groups of consecutive arguments. For example:

    %typemap(in) (char *str, int len) {
      $1 = StringValuePtr($input);
      $2 = (int) RSTRING($input)->len;
    };
    
    int count(char c, char *str, int len);

    When a multi-argument typemap is defined, the arguments are always handled as a single Ruby object. This allows the function count to be used as follows (notice how the length parameter is omitted):

    puts Example.count('o', 'Hello World')
    2

    38.7.2 Typemap scope

    Once defined, a typemap remains in effect for all of the declarations that follow. A typemap may be redefined for different sections of an input file. For example:

    // typemap1
    %typemap(in) int {
      ...
    }
    
    int fact(int); // typemap1
    int gcd(int x, int y); // typemap1
    
    // typemap2
    %typemap(in) int {
      ...
    }
    
    int isprime(int); // typemap2

    One exception to the typemap scoping rules pertains to the %extend declaration. %extend is used to attach new declarations to a class or structure definition. Because of this, all of the declarations in an %extend block are subject to the typemap rules that are in effect at the point where the class itself is defined. For example:

    class Foo {
      ...
    };
    
    %typemap(in) int {
      ...
    }
    
    %extend Foo {
      int blah(int x); // typemap has no effect. Declaration is attached to Foo which 
      // appears before the %typemap declaration.
    };

    38.7.3 Copying a typemap

    A typemap is copied by using assignment. For example:

    %typemap(in) Integer = int;

    or this:

    %typemap(in) Integer, Number, int32_t = int;

    Types are often managed by a collection of different typemaps. For example:

    %typemap(in) int { ... }
    %typemap(out) int { ... }
    %typemap(varin) int { ... }
    %typemap(varout) int { ... }

    To copy all of these typemaps to a new type, use %apply. For example:

    %apply int { Integer }; // Copy all int typemaps to Integer
    %apply int { Integer, Number }; // Copy all int typemaps to both Integer and Number

    The patterns for %apply follow the same rules as for %typemap. For example:

    %apply int *output { Integer *output }; // Typemap with name
    %apply (char *buf, int len) { (char *buffer, int size) }; // Multiple arguments

    38.7.4 Deleting a typemap

    A typemap can be deleted by simply defining no code. For example:

    %typemap(in) int; // Clears typemap for int
    %typemap(in) int, long, short; // Clears typemap for int, long, short
    %typemap(in) int *output; 

    The %clear directive clears all typemaps for a given type. For example:

    %clear int; // Removes all types for int
    %clear int *output, long *output;

    Note: Since SWIG's default behavior is defined by typemaps, clearing a fundamental type like int will make that type unusable unless you also define a new set of typemaps immediately after the clear operation.

    38.7.5 Placement of typemaps

    Typemap declarations can be declared in the global scope, within a C++ namespace, and within a C++ class. For example:

    %typemap(in) int {
      ...
    }
    
    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }
    
    class Bar {
    public:
      typedef const int & const_reference;
      %typemap(out) const_reference {
        ...
      }
    };

    When a typemap appears inside a namespace or class, it stays in effect until the end of the SWIG input (just like before). However, the typemap takes the local scope into account. Therefore, this code

    namespace std {
      class string;
      %typemap(in) string {
        ...
      }
    }

    is really defining a typemap for the type std::string. You could have code like this:

    namespace std {
      class string;
      %typemap(in) string { /* std::string */
      ...
      }
    }
    
    namespace Foo {
      class string;
      %typemap(in) string { /* Foo::string */
      ...
      }
    }

    In this case, there are two completely distinct typemaps that apply to two completely different types (std::string and Foo::string).

    It should be noted that for scoping to work, SWIG has to know that string is a typename defined within a particular namespace. In this example, this is done using the class declaration class string .

    38.7.6 Ruby typemaps

    The following list details all of the typemap methods that can be used by the Ruby module:

    38.7.6.1 "in" typemap

    Converts Ruby objects to input function arguments. For example:

    %typemap(in) int {
      $1 = NUM2INT($input);
    }

    The following special variables are available:

    $input Input object holding value to be converted.
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    This is probably the most commonly redefined typemap because it can be used to implement customized conversions.

    In addition, the "in" typemap allows the number of converted arguments to be specified. For example:

    // Ignored argument.
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }

    At this time, only zero or one arguments may be converted.

    38.7.6.2 "typecheck" typemap

    The "typecheck" typemap is used to support overloaded functions and methods. It merely checks an argument to see whether or not it matches a specific type. For example:

    %typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) int {
      $1 = FIXNUM_P($input) ? 1 : 0;
    }

    For typechecking, the $1 variable is always a simple integer that is set to 1 or 0 depending on whether or not the input argument is the correct type.

    If you define new "in" typemaps and your program uses overloaded methods, you should also define a collection of "typecheck" typemaps. More details about this follow in a later section on "Typemaps and Overloading."

    38.7.6.3 "out" typemap

    Converts return value of a C function to a Ruby object.

    %typemap(out) int {
      $result = INT2NUM( $1 );
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.

    38.7.6.4 "arginit" typemap

    The "arginit" typemap is used to set the initial value of a function argument--before any conversion has occurred. This is not normally necessary, but might be useful in highly specialized applications. For example:

    // Set argument to NULL before any conversion occurs
    %typemap(arginit) int *data {
      $1 = NULL;
    }

    38.7.6.5 "default" typemap

    The "default" typemap is used to turn an argument into a default argument. For example:

    %typemap(default) int flags {
      $1 = DEFAULT_FLAGS;
    }
    ...
    int foo(int x, int y, int flags);

    The primary use of this typemap is to either change the wrapping of default arguments or specify a default argument in a language where they aren't supported (like C). Target languages that do not support optional arguments, such as Java and C#, effectively ignore the value specified by this typemap as all arguments must be given.

    Once a default typemap has been applied to an argument, all arguments that follow must have default values. See the Default/optional arguments section for further information on default argument wrapping.

    38.7.6.6 "check" typemap

    The "check" typemap is used to supply value checking code during argument conversion. The typemap is applied after arguments have been converted. For example:

    %typemap(check) int positive {
      if ($1 <= 0) {
        SWIG_exception(SWIG_ValueError, "Expected positive value.");
      }
    }

    38.7.6.7 "argout" typemap

    The "argout" typemap is used to return values from arguments. This is most commonly used to write wrappers for C/C++ functions that need to return multiple values. The "argout" typemap is almost always combined with an "in" typemap---possibly to ignore the input value. For example:

    /* Set the input argument to point to a temporary variable */
    %typemap(in, numinputs=0) int *out (int temp) {
      $1 = &temp;
    }
    
    %typemap(argout, fragment="output_helper") int *out {
      // Append output value $1 to $result (assuming a single integer in this case)
      $result = output_helper( $result, INT2NUM(*$1) );
    }

    The following special variables are available.

    $result Result object returned to target language.
    $input The original input object passed.
    $symname Name of function/method being wrapped.

    The code supplied to the "argout" typemap is always placed after the "out" typemap. If multiple return values are used, the extra return values are often appended to return value of the function.

    Output helper is a fragment that usually defines a macro to some function like SWIG_Ruby_AppendOutput.

    See the typemaps.i library for examples.

    38.7.6.8 "freearg" typemap

    The "freearg" typemap is used to cleanup argument data. It is only used when an argument might have allocated resources that need to be cleaned up when the wrapper function exits. The "freearg" typemap usually cleans up argument resources allocated by the "in" typemap. For example:

    // Get a list of integers
    %typemap(in) int *items {
      int nitems = Length($input); 
      $1 = (int *) malloc(sizeof(int)*nitems);
    }
    // Free the list 
    %typemap(freearg) int *items {
      free($1);
    }

    The "freearg" typemap inserted at the end of the wrapper function, just before control is returned back to the target language. This code is also placed into a special variable $cleanup that may be used in other typemaps whenever a wrapper function needs to abort prematurely.

    38.7.6.9 "newfree" typemap

    The "newfree" typemap is used in conjunction with the %newobject directive and is used to deallocate memory used by the return result of a function. For example:

    %typemap(newfree) string * {
      delete $1;
    }
    %typemap(out) string * {
      $result = PyString_FromString($1->c_str());
    }
    ...
    
    %newobject foo;
    ...
    string *foo();

    See Object ownership and %newobject for further details.

    38.7.6.10 "memberin" typemap

    The "memberin" typemap is used to copy data from an already converted input value into a structure member. It is typically used to handle array members and other special cases. For example:

    %typemap(memberin) int [4] {
      memmove($1, $input, 4*sizeof(int));
    }

    It is rarely necessary to write "memberin" typemaps---SWIG already provides a default implementation for arrays, strings, and other objects.

    38.7.6.11 "varin" typemap

    The "varin" typemap is used to convert objects in the target language to C for the purposes of assigning to a C/C++ global variable. This is implementation specific.

    38.7.6.12 "varout" typemap

    The "varout" typemap is used to convert a C/C++ object to an object in the target language when reading a C/C++ global variable. This is implementation specific.

    38.7.6.13 "throws" typemap

    The "throws" typemap is only used when SWIG parses a C++ method with an exception specification or has the %catches feature attached to the method. It provides a default mechanism for handling C++ methods that have declared the exceptions they will throw. The purpose of this typemap is to convert a C++ exception into an error or exception in the target language. It is slightly different to the other typemaps as it is based around the exception type rather than the type of a parameter or variable. For example:

    %typemap(throws) const char * %{
      rb_raise(rb_eRuntimeError, $1);
      SWIG_fail;
    %}
    void bar() throw (const char *);

    As can be seen from the generated code below, SWIG generates an exception handler with the catch block comprising the "throws" typemap content.

    ...
    try {
      bar();
    }
    catch(char const *_e) {
      rb_raise(rb_eRuntimeError, _e);
      SWIG_fail;
    }
    ...

    Note that if your methods do not have an exception specification yet they do throw exceptions, SWIG cannot know how to deal with them. For a neat way to handle these, see the Exception handling with %exception section.

    38.7.6.14 directorin typemap

    Converts C++ objects in director member functions to ruby objects. It is roughly the opposite of the "in" typemap, making its typemap rule often similar to the "out" typemap.

    %typemap(directorin) int {
      $result = INT2NUM($1);
    }
    

    The following special variables are available.

    $result Result object returned to target language.
    $symname Name of function/method being wrapped
    $1...n Argument being wrapped
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    38.7.6.15 directorout typemap

    Converts Ruby objects in director member functions to C++ objects. It is roughly the opposite of the "out" typemap, making its rule often similar to the "in" typemap.

    %typemap(directorout) int {
      $result = NUM2INT($1);
    }
    

    The following special variables are available:

    $input Ruby object being sent to the function
    $symname Name of function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap.
    $1_ltype The assignable version of the C datatype matched by the typemap.
    this C++ this, referring to the class itself.

    Currently, the directorout nor the out typemap support the option numoutputs, but the Ruby module provides that functionality through a %feature directive. Thus, a function can be made to return "nothing" if you do:

    %feature("numoutputs", "0") MyClass::function;
    

    This feature can be useful if a function returns a status code, which you want to discard but still use the typemap to raise an exception.

    38.7.6.16 directorargout typemap

    Output argument processing in director member functions.

    %typemap(directorargout,
    fragment="output_helper") int {
      $result = output_helper( $result, NUM2INT($1) );
    }
    

    The following special variables are available:

    $result Result that the director function returns
    $input Ruby object being sent to the function
    $symname name of the function/method being wrapped
    $1...n Argument being sent to the function
    $1_name Name of the argument (if provided)
    $1_type The actual C datatype matched by the typemap
    $1_ltype The assignable version of the C datatype matched by the typemap
    this C++ this, referring to the instance of the class itself

    38.7.6.17 ret typemap

    Cleanup of function return values

    38.7.6.18 globalin typemap

    Setting of C global variables

    38.7.7 Typemap variables

    Within a typemap, a number of special variables prefaced with a $ may appear. A full list of variables can be found in the "Typemaps" chapter. This is a list of the most common variables:

    $1

    A C local variable corresponding to the actual type specified in the %typemap directive. For input values, this is a C local variable that is supposed to hold an argument value. For output values, this is the raw result that is supposed to be returned to Ruby.

    $input

    A VALUE holding a raw Ruby object with an argument or variable value.

    $result

    A VALUE that holds the result to be returned to Ruby.

    $1_name

    The parameter name that was matched.

    $1_type

    The actual C datatype matched by the typemap.

    $1_ltype

    An assignable version of the datatype matched by the typemap (a type that can appear on the left-hand-side of a C assignment operation). This type is stripped of qualifiers and may be an altered version of $1_type. All arguments and local variables in wrapper functions are declared using this type so that their values can be properly assigned.

    $symname

    The Ruby name of the wrapper function being created.

    38.7.8 Useful Functions

    When you write a typemap, you usually have to work directly with Ruby objects. The following functions may prove to be useful. (These functions plus many more can be found in Programming Ruby book, by David Thomas and Andrew Hunt.)

    In addition, we list equivalent functions that SWIG defines, which provide a language neutral conversion (these functions are defined for each swig language supported). If you are trying to create a swig file that will work under multiple languages, it is recommended you stick to the swig functions instead of the native Ruby functions. That should help you avoid having to rewrite a lot of typemaps across multiple languages.

    38.7.8.1 C Datatypes to Ruby Objects

    RUBY SWIG
    INT2NUM(long or int) SWIG_From_int(int x) int to Fixnum or Bignum
    INT2FIX(long or int) int to Fixnum (faster than INT2NUM)
    CHR2FIX(char) SWIG_From_char(char x) char to Fixnum
    rb_str_new2(char*) SWIG_FromCharPtrAndSize(char*, size_t) char* to String
    rb_float_new(double) SWIG_From_double(double),
    SWIG_From_float(float)
    float/double to Float

    38.7.8.2 Ruby Objects to C Datatypes

    Here, while the Ruby versions return the value directly, the SWIG versions do not, but return a status value to indicate success (SWIG_OK). While more akward to use, this allows you to write typemaps that report more helpful error messages, like:

    %typemap(in) size_t (int ok)
      ok = SWIG_AsVal_size_t($input, &$1);
      if (!SWIG_IsOK(ok)) {
        SWIG_exception_fail(SWIG_ArgError(ok), Ruby_Format_TypeError( "$1_name", "$1_type", "$symname", $argnum, $input));
      }
    }
    
    int NUM2INT(Numeric) SWIG_AsVal_int(VALUE, int*)
    int FIX2INT(Numeric) SWIG_AsVal_int(VALUE, int*)
    unsigned int NUM2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    unsigned int FIX2UINT(Numeric) SWIG_AsVal_unsigned_SS_int(VALUE, int*)
    long NUM2LONG(Numeric) SWIG_AsVal_long(VALUE, long*)
    long FIX2LONG(Numeric) SWIG_AsVal_long(VALUE, long*)
    unsigned long FIX2ULONG(Numeric) SWIG_AsVal_unsigned_SS_long(VALUE, unsigned long*)
    char NUM2CHR(Numeric or String) SWIG_AsVal_char(VALUE, int*)
    char * StringValuePtr(String) SWIG_AsCharPtrAndSize(VALUE, char*, size_t, int* alloc)
    char * rb_str2cstr(String, int*length)
    double NUM2DBL(Numeric) (double) SWIG_AsVal_int(VALUE) or similar

    38.7.8.3 Macros for VALUE

    RSTRING_LEN(str)

    length of the Ruby string

    RSTRING_PTR(str)

    pointer to string storage

    RARRAY_LEN(arr)

    length of the Ruby array

    RARRAY(arr)->capa

    capacity of the Ruby array

    RARRAY_PTR(arr)

    pointer to array storage

    38.7.8.4 Exceptions

    void rb_raise(VALUE exception, const char *fmt, ...)

    Raises an exception. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_fatal(const char *fmt, ...)

    Raises a fatal exception, terminating the process. No rescue blocks are called, but ensure blocks will be called. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_bug(const char *fmt, ...)

    Terminates the process immediately -- no handlers of any sort will be called. The given format string fmt and remaining arguments are interpreted as with printf(). You should call this function only if a fatal bug has been exposed.

    void rb_sys_fail(const char *msg)

    Raises a platform-specific exception corresponding to the last known system error, with the given string msg.

    VALUE rb_rescue(VALUE (*body)(VALUE), VALUE args, VALUE(*rescue)(VALUE, VALUE), VALUE rargs)

    Executes body with the given args. If a StandardError exception is raised, then execute rescue with the given rargs.

    VALUE rb_ensure(VALUE(*body)(VALUE), VALUE args, VALUE(*ensure)(VALUE), VALUE eargs)

    Executes body with the given args. Whether or not an exception is raised, execute ensure with the given rargs after body has completed.

    VALUE rb_protect(VALUE (*body)(VALUE), VALUE args, int *result)

    Executes body with the given args and returns nonzero in result if any exception was raised.

    void rb_notimplement()

    Raises a NotImpError exception to indicate that the enclosed function is not implemented yet, or not available on this platform.

    void rb_exit(int status)

    Exits Ruby with the given status. Raises a SystemExit exception and calls registered exit functions and finalizers.

    void rb_warn(const char *fmt, ...)

    Unconditionally issues a warning message to standard error. The given format string fmt and remaining arguments are interpreted as with printf().

    void rb_warning(const char *fmt, ...)

    Conditionally issues a warning message to standard error if Ruby was invoked with the -w flag. The given format string fmt and remaining arguments are interpreted as with printf().

    38.7.8.5 Iterators

    void rb_iter_break()

    Breaks out of the enclosing iterator block.

    VALUE rb_each(VALUE obj)

    Invokes the each method of the given obj.

    VALUE rb_yield(VALUE arg)

    Transfers execution to the iterator block in the current context, passing arg as an argument. Multiple values may be passed in an array.

    int rb_block_given_p()

    Returns true if yield would execute a block in the current context; that is, if a code block was passed to the current method and is available to be called.

    VALUE rb_iterate(VALUE (*method)(VALUE), VALUE args, VALUE (*block)(VALUE, VALUE), VALUE arg2)

    Invokes method with argument args and block block. A yield from that method will invoke block with the argument given to yield, and a second argument arg2.

    VALUE rb_catch(const char *tag, VALUE (*proc)(VALUE, VALUE), VALUE value)

    Equivalent to Ruby's catch.

    void rb_throw(const char *tag, VALUE value)

    Equivalent to Ruby's throw.

    38.7.9 Typemap Examples

    This section includes a few examples of typemaps. For more examples, you might look at the examples in the Example/ruby directory.

    38.7.10 Converting a Ruby array to a char **

    A common problem in many C programs is the processing of command line arguments, which are usually passed in an array of NULL terminated strings. The following SWIG interface file allows a Ruby Array instance to be used as a char ** object.

    %module argv
    
    // This tells SWIG to treat char ** as a special case
    %typemap(in) char ** {
      /* Get the length of the array */
      int size = RARRAY($input)->len; 
      int i;
      $1 = (char **) malloc((size+1)*sizeof(char *));
      /* Get the first element in memory */
      VALUE *ptr = RARRAY($input)->ptr; 
      for (i=0; i < size; i++, ptr++) {
        /* Convert Ruby Object String to char* */
        $1[i]= StringValuePtr(*ptr); 
      }
      $1[i]=NULL; /* End of list */
    }
    
    // This cleans up the char ** array created before 
    // the function call
    
    %typemap(freearg) char ** {
      free((char *) $1);
    }
    
    // Now a test function
    %inline %{
    int print_args(char **argv) {
      int i = 0;
      while (argv[i]) {
        printf("argv[%d] = %s\n", i, argv[i]);
        i++;
      }
      return i;
    }
    %}

    When this module is compiled, the wrapped C function now operates as follows :

    require 'Argv'
    Argv.print_args(["Dave", "Mike", "Mary", "Jane", "John"])
    argv[0] = Dave
    argv[1] = Mike
    argv[2] = Mary
    argv[3] = Jane
    argv[4] = John

    In the example, two different typemaps are used. The "in" typemap is used to receive an input argument and convert it to a C array. Since dynamic memory allocation is used to allocate memory for the array, the "freearg" typemap is used to later release this memory after the execution of the C function.

    38.7.11 Collecting arguments in a hash

    Ruby's solution to the "keyword arguments" capability of some other languages is to allow the programmer to pass in one or more key-value pairs as arguments to a function. All of those key-value pairs are collected in a single Hash argument that's presented to the function. If it makes sense, you might want to provide similar functionality for your Ruby interface. For example, suppose you'd like to wrap this C function that collects information about people's vital statistics:

    void setVitalStats(const char *person, int nattributes, const char **names, int *values);

    and you'd like to be able to call it from Ruby by passing in an arbitrary number of key-value pairs as inputs, e.g.

    setVitalStats("Fred", 
      'weight' => 270, 
      'age' => 42 
    )

    To make this work, you need to write a typemap that expects a Ruby Hash as its input and somehow extracts the last three arguments (nattributes, names and values) needed by your C function. Let's start with the basics:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
    }
     

    This %typemap directive tells SWIG that we want to match any function declaration that has the specified types and names of arguments somewhere in the argument list. The fact that we specified the argument names (nattributes, names and values) in our typemap is significant; this ensures that SWIG won't try to apply this typemap to other functions it sees that happen to have a similar declaration with different argument names. The arguments that appear in the second set of parentheses (keys_arr, i, key and val) define local variables that our typemap will need.

    Since we expect the input argument to be a Hash, let's next add a check for that:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
    }

    Check_Type() is just a macro (defined in the Ruby header files) that confirms that the input argument is of the correct type; if it isn't, an exception will be raised.

    The next task is to determine how many key-value pairs are present in the hash; we'll assign this number to the first typemap argument ($1). This is a little tricky since the Ruby/C API doesn't provide a public function for querying the size of a hash, but we can get around that by calling the hash's size method directly and converting its result to a C int value:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
    }

    So now we know the number of attributes. Next we need to initialize the second and third typemap arguments (i.e. the two C arrays) to NULL and set the stage for extracting the keys and values from the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
        }
    }

    There are a number of ways we could extract the keys and values from the input hash, but the simplest approach is to first call the hash's keys method (which returns a Ruby array of the keys) and then start looping over the elements in that array:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
          for (i = 0; i < $1; i++) {
          }
        }
    }

    Recall that keys_arr and i are local variables for this typemap. For each element in the keys_arr array, we want to get the key itself, as well as the value corresponding to that key in the hash:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
          }
        }
    }

    To be safe, we should again use the Check_Type() macro to confirm that the key is a String and the value is a Fixnum:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
        Check_Type($input, T_HASH);
        $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
        $2 = NULL;
        $3 = NULL;
        if ($1 > 0) {
          $2 = (char **) malloc($1*sizeof(char *));
          $3 = (int *) malloc($1*sizeof(int));
          keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
          for (i = 0; i < $1; i++) {
            key = rb_ary_entry(keys_arr, i);
            val = rb_hash_aref($input, key);
            Check_Type(key, T_STRING);
            Check_Type(val, T_FIXNUM);
          }
        }
    }

    Finally, we can convert these Ruby objects into their C equivalents and store them in our local C arrays:

    %typemap(in) (int nattributes, const char **names, const int *values)
      (VALUE keys_arr, int i, VALUE key, VALUE val) {
      Check_Type($input, T_HASH);
      $1 = NUM2INT(rb_funcall($input, rb_intern("size"), 0, NULL));
      $2 = NULL;
      $3 = NULL;
      if ($1 > 0) {
        $2 = (char **) malloc($1*sizeof(char *));
        $3 = (int *) malloc($1*sizeof(int));
        keys_arr = rb_funcall($input, rb_intern("keys"), 0, NULL);
        for (i = 0; i < $1; i++) {
          key = rb_ary_entry(keys_arr, i);
          val = rb_hash_aref($input, key);
          Check_Type(key, T_STRING);
          Check_Type(val, T_FIXNUM);
          $2[i] = StringValuePtr(key);
          $3[i] = NUM2INT(val);
        }
      }
    }

    We're not done yet. Since we used malloc() to dynamically allocate the memory used for the names and values arguments, we need to provide a corresponding "freearg" typemap to free that memory so that there is no memory leak. Fortunately, this typemap is a lot easier to write:

    %typemap(freearg) (int nattributes, const char **names, const int *values) {
      free((void *) $2);
      free((void *) $3);
    }

    All of the code for this example, as well as a sample Ruby program that uses the extension, can be found in the Examples/ruby/hashargs directory of the SWIG distribution.

    38.7.12 Pointer handling

    Occasionally, it might be necessary to convert pointer values that have been stored using the SWIG typed-pointer representation. Since there are several ways in which pointers can be represented, the following two functions are used to safely perform this conversion:

    int SWIG_ConvertPtr(VALUE obj, void **ptr, swig_type_info *ty, int flags)

    Converts a Ruby object obj to a C pointer whose address is ptr (i.e. ptr is a pointer to a pointer). The third argument, ty, is a pointer to a SWIG type descriptor structure. If ty is not NULL, that type information is used to validate type compatibility and other aspects of the type conversion. If flags is non-zero, any type errors encountered during this validation result in a Ruby TypeError exception being raised; if flags is zero, such type errors will cause SWIG_ConvertPtr() to return -1 but not raise an exception. If ty is NULL, no type-checking is performed.

    VALUE SWIG_NewPointerObj(void *ptr, swig_type_info *ty, int own)

    Creates a new Ruby pointer object. Here, ptr is the pointer to convert, ty is the SWIG type descriptor structure that describes the type, and own is a flag that indicates whether or not Ruby should take ownership of the pointer (i.e. whether Ruby should free this data when the corresponding Ruby instance is garbage-collected).

    Both of these functions require the use of a special SWIG type-descriptor structure. This structure contains information about the mangled name of the datatype, type-equivalence information, as well as information about converting pointer values under C++ inheritance. For a type of Foo *, the type descriptor structure is usually accessed as follows:

    Foo *foo;
    SWIG_ConvertPtr($input, (void **) &foo, SWIGTYPE_p_Foo, 1);
    
    VALUE obj;
    obj = SWIG_NewPointerObj(f, SWIGTYPE_p_Foo, 0);

    In a typemap, the type descriptor should always be accessed using the special typemap variable $1_descriptor. For example:

    %typemap(in) Foo * {
      SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor, 1);
    }

    38.7.12.1 Ruby Datatype Wrapping

    VALUE Data_Wrap_Struct(VALUE class, void (*mark)(void *), void (*free)(void *), void *ptr)

    Given a pointer ptr to some C data, and the two garbage collection routines for this data (mark and free), return a VALUE for the Ruby object.

    VALUE Data_Make_Struct(VALUE class, c-type, void (*mark)(void *), void (*free)(void *), c-type *ptr)

    Allocates a new instance of a C data type c-type, assigns it to the pointer ptr, then wraps that pointer with Data_Wrap_Struct() as above.

    Data_Get_Struct(VALUE obj, c-type, c-type *ptr)

    Retrieves the original C pointer of type c-type from the data object obj and assigns that pointer to ptr.

    38.7.13 Example: STL Vector to Ruby Array

    Another use for macros and type maps is to create a Ruby array from a STL vector of pointers. In essence, copy of all the pointers in the vector into a Ruby array. The use of the macro is to make the typemap so generic that any vector with pointers can use the type map. The following is an example of how to construct this type of macro/typemap and should give insight into constructing similar typemaps for other STL structures:

    %define PTR_VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size());
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size());
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, *i));
      $result = arr;
    }
    %enddef

    Note, that the "c ## classname.klass" is used in the preprocessor step to determine the actual object from the class name.

    To use the macro with a class Foo, the following is used:

    PTR_VECTOR_TO_RUBY_ARRAY(vector<foo *="">, Foo)

    It is also possible to create a STL vector of Ruby objects:

    %define RUBY_ARRAY_TO_PTR_VECTOR(vectorclassname, classname)
    %typemap(in) vectorclassname &, const vectorclassname & {
      Check_Type($input, T_ARRAY);
      vectorclassname *vec = new vectorclassname;
      int len = RARRAY($input)->len;
      for (int i=0; i!=len; i++) {
        VALUE inst = rb_ary_entry($input, i);
        //The following _should_ work but doesn't on HPUX
        // Check_Type(inst, T_DATA);
        classname *element = NULL;
        Data_Get_Struct(inst, classname, element);
        vec->push_back(element);
      }
      $1 = vec;
    }
    
    %typemap(freearg) vectorclassname &, const vectorclassname & {
      delete $1;
    }
    %enddef

    It is also possible to create a Ruby array from a vector of static data types:

    %define VECTOR_TO_RUBY_ARRAY(vectorclassname, classname)
    %typemap(out) vectorclassname &, const vectorclassname & {
      VALUE arr = rb_ary_new2($1->size()); 
      vectorclassname::iterator i = $1->begin(), iend = $1->end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %typemap(out) vectorclassname, const vectorclassname {
      VALUE arr = rb_ary_new2($1.size()); 
      vectorclassname::iterator i = $1.begin(), iend = $1.end();
      for ( ; i!=iend; i++ )
        rb_ary_push(arr, Data_Wrap_Struct(c ## classname.klass, 0, 0, &(*i)));
      $result = arr;
    }
    %enddef
    Note that this is mostly an example of typemaps. If you want to use the STL with ruby, you are advised to use the standard swig STL library, which does much more than this. Refer to the section called the C++ Standard Template Library.

    38.8 Docstring Features

    Using ri and rdoc web pages in Ruby libraries is a common practice. Given the way that SWIG generates the extensions by default, your users will normally not get any documentation for it, even if they run 'rdoc' on the resulting .c or .cxx file.

    The features described in this section make it easy for you to add rdoc strings to your modules, functions and methods that can then be read by Ruby's rdoc tool to generate html web pages, ri documentation, Windows chm file and an .xml description.

    rdoc can then be run from a console or shell window on a swig generated file.

    For example, to generate html web pages from a C++ file, you'd do:

    $ rdoc -E cxx=c -f html file_wrap.cxx
    

    To generate ri documentation from a c wrap file, you could do:

    $ rdoc -r file_wrap.c
    

    38.8.1 Module docstring

    Ruby allows a docstring at the beginning of the file before any other statements, and it is typically used to give a general description of the entire module. SWIG supports this by setting an option of the %module directive. For example:

    %module(docstring="This is the example module's docstring") example

    When you have more than just a line or so then you can retain the easy readability of the %module directive by using a macro. For example:

    %define DOCSTRING
    "The `XmlResource` class allows program resources defining menus, 
    layout of controls on a panel, etc. to be loaded from an XML file."
    %enddef
    
    %module(docstring=DOCSTRING) xrc

    38.8.2 %feature("autodoc")

    Since SWIG does know everything about the function it wraps, it is possible to generate an rdoc containing the parameter types, names and default values. Since Ruby ships with one of the best documentation systems of any language, it makes sense to take advantage of it.

    SWIG's Ruby module provides support for the "autodoc" feature, which when attached to a node in the parse tree will cause an rdoc comment to be generated in the wrapper file that includes the name of the function, parameter names, default values if any, and return type if any. There are also several options for autodoc controlled by the value given to the feature, described below.

    38.8.2.1 %feature("autodoc", "0")

    When the "0" option is given then the types of the parameters will not be included in the autodoc string. For example, given this function prototype:

    %feature("autodoc", "0");
    bool function_name(int x, int y, Foo* foo=NULL, Bar* bar=NULL);

    Then Ruby code like this will be generated:

    function_name(x, y, foo=nil, bar=nil) -> bool
      ...

    38.8.2.2 %feature("autodoc", "1")

    When the "1" option is used then the parameter types will be used in the rdoc string. In addition, an attempt is made to simplify the type name such that it makes more sense to the Ruby user. Pointer, reference and const info is removed, %rename's are evaluated, etc. (This is not always successful, but works most of the time. See the next section for what to do when it doesn't.) Given the example above, then turning on the parameter types with the "1" option will result in rdoc code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
      ...

    38.8.2.3 %feature("autodoc", "2")

    When the "2" option is used then the parameter types will not be used in the rdoc string. However, they will be listed in full after the function. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    38.8.2.4 %feature("autodoc", "3")

    When the "3" option is used then the function will be documented using a combination of "1" and "2" above. Given the example above, then turning on the parameter types with the "2" option will result in Ruby code like this:

    function_name(int x, int y, Foo foo=nil, Bar bar=nil) -> bool
    
    Parameters:
            x - int
            y - int
            foo - Foo
            bar - Bar

    38.8.2.5 %feature("autodoc", "docstring")

    Finally, there are times when the automatically generated autodoc string will make no sense for a Ruby programmer, particularly when a typemap is involved. So if you give an explicit value for the autodoc feature then that string will be used in place of the automatically generated string. For example:

    %feature("autodoc", "GetPosition() -> (x, y)") GetPosition;
    void GetPosition(int* OUTPUT, int* OUTPUT);

    38.8.3 %feature("docstring")

    In addition to the autodoc strings described above, you can also attach any arbitrary descriptive text to a node in the parse tree with the "docstring" feature. When the proxy module is generated then any docstring associated with classes, function or methods are output. If an item already has an autodoc string then it is combined with the docstring and they are output together.

    38.9 Advanced Topics

    38.9.1 Operator overloading

    SWIG allows operator overloading with, by using the %extend or %rename commands in SWIG and the following operator names (derived from Python):

    General
    __repr__ inspect
    __str__ to_s
    __cmp__ <=>
    __hash__ hash
    __nonzero__ nonzero?
    Callable
    __call__ call
    Collection
    __len__ length
    __getitem__ []
    __setitem__ []=
    Numeric
    __add__ +
    __sub__ -
    __mul__ *
    __div__ /
    __mod__ %
    __divmod__ divmod
    __pow__ **
    __lshift__ <<
    __rshift__ >>
    __and__ &
    __xor__ ^
    __or__ |
    __neg__ -@
    __pos__ +@
    __abs__ abs
    __invert__ ~
    __int__ to_i
    __float__ to_f
    __coerce__ coerce
    Additions in 1.3.13
    __lt__ <
    __le__ <=
    __eq__ ==
    __gt__ >
    __ge__ >=

    Note that although SWIG supports the __eq__ magic method name for defining an equivalence operator, there is no separate method for handling inequality since Ruby parses the expression a != b as !(a == b).

    38.9.2 Creating Multi-Module Packages

    The chapter on Working with Modules discusses the basics of creating multi-module extensions with SWIG, and in particular the considerations for sharing runtime type information among the different modules.

    As an example, consider one module's interface file (shape.i) that defines our base class:

    %module shape
    
    %{
    #include "Shape.h"
    %}
    
    class Shape {
    protected:
      double xpos;
      double ypos;
    protected:
      Shape(double x, double y);
    public:
      double getX() const;
      double getY() const;
    };

    We also have a separate interface file (circle.i) that defines a derived class:

    %module circle
    
    %{
    #include "Shape.h"
    #include "Circle.h"
    %}
    
    // Import the base class definition from Shape module
    %import shape.i
    
    class Circle : public Shape {
    protected:
      double radius;
    public:
      Circle(double x, double y, double r);
      double getRadius() const;
    };

    We'll start by building the Shape extension module:

    $ swig -c++ -ruby shape.i
    

    SWIG generates a wrapper file named shape_wrap.cxx. To compile this into a dynamically loadable extension for Ruby, prepare an extconf.rb script using this template:

    require 'mkmf'
    
    # Since the SWIG runtime support library for Ruby
    # depends on the Ruby library, make sure it's in the list
    # of libraries.
    $libs = append_library($libs, Config::CONFIG['RUBY_INSTALL_NAME'])
    
    # Create the makefile
    create_makefile('shape')

    Run this script to create a Makefile and then type make to build the shared library:

    $ ruby extconf.rb
    creating Makefile
    $ make
    g++ -fPIC -g -O2 -I. -I/usr/include/ruby-2.1.0 \
    -I. -c shape_wrap.cxx
    gcc -shared -L/usr/local/lib -o shape.so shape_wrap.o -L. \
    -lruby -lruby -lc

    Note that depending on your installation, the outputs may be slightly different; these outputs are those for a Linux-based development environment. The end result should be a shared library (here, shape.so) containing the extension module code. Now repeat this process in a separate directory for the Circle module:

    1. Run SWIG to generate the wrapper code (circle_wrap.cxx);
    2. Write an extconf.rb script that your end-users can use to create a platform-specific Makefile for the extension;
    3. Build the shared library for this extension by typing make.

    Once you've built both of these extension modules, you can test them interactively in IRB to confirm that the Shape and Circle modules are properly loaded and initialized:

    $ irb
    irb(main):001:0> require 'shape'
    true
    irb(main):002:0> require 'circle'
    true
    irb(main):003:0> c = Circle::Circle.new(5, 5, 20)
    #<Circle::Circle:0xa097208>
    irb(main):004:0> c.kind_of? Shape::Shape
    true
    irb(main):005:0> c.getX()
    5.0

    38.9.3 Specifying Mixin Modules

    The Ruby language doesn't support multiple inheritance, but it does allow you to mix one or more modules into a class using Ruby's include method. For example, if you have a Ruby class that defines an each instance method, e.g.

    class Set
      def initialize
      @members = []
      end
     
      def each
      @members.each { |m| yield m }
      end
    end

    then you can mix-in Ruby's Enumerable module to easily add a lot of functionality to your class:

    class Set
      include Enumerable
      def initialize
        @members = []
      end
      def each
        @members.each { |m| yield m }
      end
    end

    To get the same benefit for your SWIG-wrapped classes, you can use the %mixin directive to specify the names of one or more modules that should be mixed-in to a class. For the above example, the SWIG interface specification might look like this:

    %mixin Set "Enumerable";
    
    class Set {
    public:
      // Constructor
      Set();
     
      // Iterates through set members
      void each();
    };

    Multiple modules can be mixed into a class by providing a comma-separated list of module names to the %mixin directive, e.g.

    %mixin Set "Fee, Fi, Fo, Fum";

    Note that the %mixin directive is implemented using SWIG's "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    38.10 Memory Management

    One of the most common issues in generating SWIG bindings for Ruby is proper memory management. The key to proper memory management is clearly defining whether a wrapper Ruby object owns the underlying C struct or C++ class. There are two possibilities:

    • The Ruby object is responsible for freeing the C struct or C++ object
    • The Ruby object should not free the C struct or C++ object because it will be freed by the underlying C or C++ code

    To complicate matters, object ownership may transfer from Ruby to C++ (or vice versa) depending on what function or methods are invoked. Clearly, developing a SWIG wrapper requires a thorough understanding of how the underlying library manages memory.

    38.10.1 Mark and Sweep Garbage Collector

    Ruby uses a mark and sweep garbage collector. When the garbage collector runs, it finds all the "root" objects, including local variables, global variables, global constants, hardware registers and the C stack. For each root object, the garbage collector sets its mark flag to true and calls rb_gc_mark on the object. The job of rb_gc_mark is to recursively mark all the objects that a Ruby object has a reference to (ignoring those objects that have already been marked). Those objects, in turn, may reference other objects. This process will continue until all active objects have been "marked." After the mark phase comes the sweep phase. In the sweep phase, all objects that have not been marked will be garbage collected.

    The Ruby C/API provides extension developers two hooks into the garbage collector - a "mark" function and a "sweep" function. By default these functions are set to NULL.

    If a C struct or C++ class references any other Ruby objects, then it must provide a "mark" function. The "mark" function should identify any referenced Ruby objects by calling the rb_gc_mark function for each one. Unsurprisingly, this function will be called by the Ruby garbage during the "mark" phase.

    During the sweep phase, Ruby destroys any unused objects. If any memory has been allocated in creating the underlying C struct or C++ struct, then a "free" function must be defined that deallocates this memory.

    38.10.2 Object Ownership

    As described above, memory management depends on clearly defining who is responsible for freeing the underlying C struct or C++ class. If the Ruby object is responsible for freeing the C++ object, then a "free" function must be registered for the object. If the Ruby object is not responsible for freeing the underlying memory, then a "free" function must not be registered for the object.

    For the most part, SWIG takes care of memory management issues. The rules it uses are:

    • When calling a C++ object's constructor from Ruby, SWIG will assign a "free" function thereby making the Ruby object responsible for freeing the C++ object
    • When calling a C++ member function that returns a pointer, SWIG will not assign a "free" function thereby making the underlying library responsible for freeing the object.

    To make this clearer, let's look at an example. Assume we have a Foo and a Bar class.

    /* File "RubyOwernshipExample.h" */
    
    class Foo
    {
    public:
      Foo() {}
      ~Foo() {}
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar(): foo_(new Foo) {}
      ~Bar() { delete foo_; }
      Foo* get_foo() { return foo_; }
      Foo* get_new_foo() { return new Foo; }
      void set_foo(Foo *foo) { delete foo_; foo_ = foo; }
    };

    First, consider this Ruby code:

    foo = Foo.new

    In this case, the Ruby code calls the underlying Foo C++ constructor, thus creating a new foo object. By default, SWIG will assign the new Ruby object a "free" function. When the Ruby object is garbage collected, the "free" function will be called. It in turn will call Foo's destructor.

    Next, consider this code:

    bar = Bar.new
    foo = bar.get_foo()

    In this case, the Ruby code calls a C++ member function, get_foo. By default, SWIG will not assign the Ruby object a "free" function. Thus, when the Ruby object is garbage collected the underlying C++ foo object is not affected.

    Unfortunately, the real world is not as simple as the examples above. For example:

    bar = Bar.new
    foo = bar.get_new_foo()

    In this case, the default SWIG behavior for calling member functions is incorrect. The Ruby object should assume ownership of the returned object. This can be done by using the %newobject directive. See Object ownership and %newobject for more information.

    The SWIG default mappings are also incorrect in this case:

    foo = Foo.new
    bar = Bar.new
    bar.set_foo(foo)

    Without modification, this code will cause a segmentation fault. When the Ruby foo object goes out of scope, it will free the underlying C++ foo object. However, when the Ruby bar object goes out of scope, it will call the C++ bar destructor which will also free the C++ foo object. The problem is that object ownership is transferred from the Ruby object to the C++ object when the set_foo method is called. This can be done by using the special DISOWN type map, which was added to the Ruby bindings in SWIG-1.3.26.

    Thus, a correct SWIG interface file correct mapping for these classes is:

    /* File RubyOwnershipExample.i */
    
    %module RubyOwnershipExample
    
    %{
    #include "RubyOwnershipExample.h"
    %}
    
    class Foo
    {
    public:
      Foo();
      ~Foo();
    };
    
    class Bar
    {
      Foo *foo_;
    public:
      Bar();
      ~Bar();
      Foo* get_foo();
    
      %newobject get_new_foo;
      Foo* get_new_foo();
    
      %apply SWIGTYPE *DISOWN {Foo *foo};
      void set_foo(Foo *foo);
      %clear Foo *foo;
    };
    

    This code can be seen in swig/examples/ruby/tracking.

    38.10.3 Object Tracking

    The remaining parts of this section will use the class library shown below to illustrate different memory management techniques. The class library models a zoo and the animals it contains.

    %module zoo
    
    %{
    #include <string>
    #include <vector>
    
    #include "zoo.h"
    %}
    
    class Animal
    {
    private:
      typedef std::vector<Animal*> AnimalsType;
      typedef AnimalsType::iterator IterType;
    protected:
      AnimalsType animals;
    protected:
      std::string name_;
    public:
      // Construct an animal with this name
      Animal(const char* name) : name_(name) {}
     
      // Return the animal's name
      const char* get_name() const { return name.c_str(); }
    };
    
    class Zoo
    {
    protected:
     std::vector<Animal *> animals;
     
    public:
      // Construct an empty zoo
      Zoo() {}
      
      /* Create a new animal. */
      static Animal* Zoo::create_animal(const char* name) {
        return new Animal(name);
      }
     
      // Add a new animal to the zoo
      void add_animal(Animal* animal) {
        animals.push_back(animal); 
      }
     
      Animal* remove_animal(size_t i) {
        Animal* result = this->animals[i];
        IterType iter = this->animals.begin();
        std::advance(iter, i);
        this->animals.erase(iter);
       
        return result;
      }
      
      // Return the number of animals in the zoo
      size_t get_num_animals() const {
        return animals.size(); 
      }
      
      // Return a pointer to the ith animal
      Animal* get_animal(size_t i) const {
        return animals[i]; 
      }
    };

    Let's say you SWIG this code and then run IRB:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3820>
    
    irb(main):004:0> tiger1.get_name()
    => "tiger1"
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a60>
    
    irb(main):006:0> zoo.add_animal(tiger)
    => nil
    
    irb(main):007:0> zoo.get_num_animals()
    => 1
    
    irb(main):007:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2bd4a18>
    
    irb(main):008:0> tiger2.get_name()
    => "tiger1"
    
    irb(main):009:0> tiger1.equal?(tiger2)
    => false
    

    Pay particular attention to the code tiger1.equal?(tiger2). Note that the two Ruby objects are not the same - but they reference the same underlying C++ object. This can cause problems. For example:

    irb(main):010:0> tiger1 = nil
    => nil
    
    irb(main):011:0> GC.start
    => nil
    
    irb(main):012:0> tiger2.get_name()
    (irb):12: [BUG] Segmentation fault
    

    After the garbage collector runs, as a result of our call to GC.start, callingtiger2.get_name() causes a segmentation fault. The problem is that when tiger1 is garbage collected, it frees the underlying C++ object. Thus, when tiger2 calls the get_name() method it invokes it on a destroyed object.

    This problem can be avoided if SWIG enforces a one-to-one mapping between Ruby objects and C++ classes. This can be done via the use of the %trackobjects functionality available in SWIG-1.3.26. and later.

    When the %trackobjects is turned on, SWIG automatically keeps track of mappings between C++ objects and Ruby objects. Note that enabling object tracking causes a slight performance degradation. Test results show this degradation to be about 3% to 5% when creating and destroying 100,000 animals in a row.

    Since %trackobjects is implemented as a %feature, it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features") . Thus it can be applied on a class-by-class basis if needed. To fix the example above:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Tell SWIG that create_animal creates a new object */
    %newobject Zoo::create_animal;
    
    /* Tell SWIG to keep track of mappings between C/C++ structs/classes. */
    %trackobjects;
    
    %include "example.h"

    When this code runs we see:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be37d8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0a18>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):006:0> tiger2 = zoo.remove_animal(0)
    => #<Example::Animal:0x2be37d8>
    
    irb(main):007:0> tiger1.equal?(tiger2)
    => true
    
    irb(main):008:0> tiger1 = nil
    => nil
    
    irb(main):009:0> GC.start
    => nil
    
    irb(main):010:0> tiger.get_name()
    => "tiger1"
    irb(main):011:0>

    For those who are interested, object tracking is implemented by storing Ruby objects in a hash table and keying them on C++ pointers. The underlying API is:

    static void SWIG_RubyAddTracking(void* ptr, VALUE object);
    static VALUE SWIG_RubyInstanceFor(void* ptr) ;
    static void SWIG_RubyRemoveTracking(void* ptr);
    static void SWIG_RubyUnlinkObjects(void* ptr);

    When an object is created, SWIG will automatically call the SWIG_RubyAddTracking method. Similarly, when an object is deleted, SWIG will call the SWIG_RubyRemoveTracking. When an object is returned to Ruby from C++, SWIG will use the SWIG_RubyInstanceFor method to ensure a one-to-one mapping from Ruby to C++ objects. Last, the RubyUnlinkObjects method unlinks a Ruby object from its underlying C++ object.

    In general, you will only need to use the SWIG_RubyInstanceFor, which is required for implementing mark functions as shown below. However, if you implement your own free functions (see below) you may also have to call the SWIG_RubyRemoveTracking and RubyUnlinkObjects methods.

    38.10.4 Mark Functions

    With a bit more testing, we see that our class library still has problems. For example:

    $ irb
    irb(main):001:0> require 'example'
    => true
    
    irb(main):002:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bea6a8>
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be7960>
    
    irb(main):004:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> tiger1 = nil
    => nil
    
    irb(main):007:0> GC.start
    => nil
    
    irb(main):005:0> tiger2 = zoo.get_animal(0)
    (irb):12: [BUG] Segmentation fault

    The problem is that Ruby does not know that the zoo object contains a reference to a Ruby object. Thus, when Ruby garbage collects tiger1 it frees the underlying C++ object.

    This can be fixed by implementing a mark function as described above in the Mark and Sweep Garbage Collector section. You can specify a mark function by using the %markfunc directive. Since the %markfunc directive is implemented using SWIG's' "features" mechanism it uses the same name matching rules as other kinds of features (see the chapter on "Customization Features" for more details).

    A mark function takes a single argument, which is a pointer to the C++ object being marked; it should, in turn, call rb_gc_mark() for any instances that are reachable from the current object. The mark function for our Zoo class should therefore loop over all of the C++ animal objects in the zoo object, look up their Ruby object equivalent, and then call rb_gc_mark(). One possible implementation is:

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Keep track of mappings between C/C++ structs/classes
     and Ruby objects so we can implement a mark function. */
    %trackobjects;
    
    /* Specify the mark function */
    %markfunc Zoo "mark_Zoo";
    
    %include "example.h"
    
    %header %{
    
    static void mark_Zoo(void* ptr) {
      Zoo* zoo = (Zoo*) ptr;
     
      /* Loop over each object and tell the garbage collector
      that we are holding a reference to them. */
      int count = zoo->get_num_animals();
     
      for(int i = 0; i < count; ++i) {
        Animal* animal = zoo->get_animal(i);
        VALUE object = SWIG_RubyInstanceFor(animal);
     
        if (object != Qnil) {
          rb_gc_mark(object);
        }
      }
    }
    %}

    Note the mark function is dependent on the SWIG_RUBY_InstanceFor method, and thus requires that %trackobjects is enabled. For more information, please refer to the ruby_track_objects.i test case in the SWIG test suite.

    When this code is compiled we now see:

    $ irb
    irb(main):002:0> tiger1=Example::Animal.new("tiger1")
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):003:0> Example::Zoo.new()
    => #<Example::Zoo:0x2be1780>
    
    irb(main):004:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2bde9c0>
    
    irb(main):005:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):009:0> tiger1 = nil
    => nil
    
    irb(main):010:0> GC.start
    => nil
    irb(main):014:0> tiger2 = zoo.get_animal(0)
    => #<Example::Animal:0x2be3bf8>
    
    irb(main):015:0> tiger2.get_name()
    => "tiger1"
    irb(main):016:0>

    This code can be seen in swig/examples/ruby/mark_function.

    38.10.5 Free Functions

    By default, SWIG creates a "free" function that is called when a Ruby object is garbage collected. The free function simply calls the C++ object's destructor.

    However, sometimes an appropriate destructor does not exist or special processing needs to be performed before the destructor is called. Therefore, SWIG allows you to manually specify a "free" function via the use of the %freefunc directive. The %freefunc directive is implemented using SWIG's' "features" mechanism and so the same name matching rules used for other kinds of features apply (see the chapter on "Customization Features") for more details).

    IMPORTANT ! - If you define your own free function, then you must ensure that you call the underlying C++ object's destructor. In addition, if object tracking is activated for the object's class, you must also call the SWIG_RubyRemoveTracking function (of course call this before you destroy the C++ object). Note that it is harmless to call this method if object tracking if off so it is advised to always call it.

    Note there is a subtle interaction between object ownership and free functions. A custom defined free function will only be called if the Ruby object owns the underlying C++ object. This also to Ruby objects which are created, but then transfer ownership to C++ objects via the use of the disown typemap described above.

    To show how to use the %freefunc directive, let's slightly change our example. Assume that the zoo object is responsible for freeing any animal that it contains. This means that the Zoo::add_animal function should be marked with a DISOWN typemap and the destructor should be updated as below:

    Zoo::~Zoo() {
      IterType iter = this->animals.begin();
      IterType end = this->animals.end();
     
      for(iter; iter != end; ++iter) {
        Animal* animal = *iter;
        delete animal;
      }
    }
    

    When we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    (irb):12: [BUG] Segmentation fault
    

    The error happens because the C++ animal object is freed when the zoo object is freed. Although this error is unavoidable, we can at least prevent the segmentation fault. To do this requires enabling object tracking and implementing a custom free function that calls the SWIG_RubyUnlinkObjects function for each animal object that is destroyed. The SWIG_RubyUnlinkObjects function notifies SWIG that a Ruby object's underlying C++ object is no longer valid. Once notified, SWIG will intercept any calls from the existing Ruby object to the destroyed C++ object and raise an exception.

    %module example
    
    %{
    #include "example.h"
    %}
    
    /* Specify that ownership is transferred to the zoo when calling add_animal */
    %apply SWIGTYPE *DISOWN { Animal* animal };
    
    /* Track objects */
    %trackobjects;
    
    /* Specify the mark function */
    %freefunc Zoo "free_Zoo";
    
    %include "example.h"
    
    %header %{
      static void free_Zoo(void* ptr) {
        Zoo* zoo = (Zoo*) ptr;
    
        /* Loop over each animal */
        int count = zoo->get_num_animals();
    
        for(int i = 0; i < count; ++i) {
          /* Get an animal */
          Animal* animal = zoo->get_animal(i);
    
          /* Unlink the Ruby object from the C++ object */
          SWIG_RubyUnlinkObjects(animal);
    
          /* Now remove the tracking for this animal */
          SWIG_RubyRemoveTracking(animal);
        }
    
        /* Now call SWIG_RubyRemoveTracking for the zoo */
        SWIG_RubyRemoveTracking(ptr);
        /* Now free the zoo which will free the animals it contains */
        delete zoo;
      }
    %} 

    Now when we use these objects in IRB we see:

    $irb
    irb(main):002:0> require 'example'
    => true
    
    irb(main):003:0> zoo = Example::Zoo.new()
    => #<Example::Zoo:0x2be0fe8>
    
    irb(main):005:0> tiger1 = Example::Animal.new("tiger1")
    => #<Example::Animal:0x2bda760>
    
    irb(main):006:0> zoo.add_animal(tiger1)
    => nil
    
    irb(main):007:0> zoo = nil
    => nil
    
    irb(main):008:0> GC.start
    => nil
    
    irb(main):009:0> tiger1.get_name()
    RuntimeError: This Animal * already released
     from (irb):10:in `get_name'
     from (irb):10
    irb(main):011:0>

    Notice that SWIG can now detect the underlying C++ object has been freed, and thus raises a runtime exception.

    This code can be seen in swig/examples/ruby/free_function.

    38.10.6 Embedded Ruby and the C++ Stack

    As has been said, the Ruby GC runs and marks objects before its sweep phase. When the garbage collector is called, it will also try to mark any Ruby objects (VALUE) it finds in the machine registers and in the C++ stack.

    The stack is basically the history of the functions that have been called and also contains local variables, such as the ones you define whenever you do inside a function:

    VALUE obj;

    For ruby to determine where its stack space begins, during initialization a normal Ruby interpreter will call the ruby_init() function which in turn will call a function called Init_stack or similar. This function will store a pointer to the location where the stack points at that point in time.

    ruby_init() is presumed to always be called within the main() function of your program and whenever the GC is called, ruby will assume that the memory between the current location in memory and the pointer that was stored previously represents the stack, which may contain local (and temporary) VALUE ruby objects. Ruby will then be careful not to remove any of those objects in that location.

    So far so good. For a normal Ruby session, all the above is completely transparent and magic to the extensions developer.

    However, with an embedded Ruby, it may not always be possible to modify main() to make sure ruby_init() is called there. As such, ruby_init() will likely end up being called from within some other function. This can lead Ruby to measure incorrectly where the stack begins and can result in Ruby incorrectly collecting those temporary VALUE objects that are created once another function is called. The end result: random crashes and segmentation faults.

    This problem will often be seen in director functions that are used for callbacks, for example.

    To solve the problem, SWIG can now generate code with director functions containing the optional macros SWIG_INIT_STACK and SWIG_RELEASE_STACK. These macros will try to force Ruby to reinitialize the beginning of the stack the first time a director function is called. This will lead Ruby to measure and not collect any VALUE objects defined from that point on.

    To mark functions to either reset the ruby stack or not, you can use:

    %initstack Class::memberfunction;   // only re-init the stack in this director method
    %ignorestack Class::memberfunction; // do not re-init the stack in this director method
    %initstack Class;                   // init the stack on all the methods of this class
    %initstack;                         // all director functions will re-init the stack
    
    swig-3.0.12/Doc/Manual/Guile.html0000664000175000017500000007764413042756671016340 0ustar williamwilliam SWIG and Guile

    24 SWIG and Guile

    This section details guile-specific support in SWIG.

    24.1 Supported Guile Versions

    SWIG works with Guile versions 1.8.x and 2.0.x. Support for version 1.6.x has been dropped. The last version of SWIG that still works with Guile version 1.6.x is SWIG 2.0.9.

    Note that starting with guile 2.0, the guile sources can be compiled for improved performance. This is currently not tested with swig so your mileage may vary. To be safe set environment variable GUILE_AUTO_COMPILE to 0 when using swig generated guile code.

    24.2 Meaning of "Module"

    There are three different concepts of "module" involved, defined separately for SWIG, Guile, and Libtool. To avoid horrible confusion, we explicitly prefix the context, e.g., "guile-module".

    24.3 Old GH Guile API

    Guile 1.8 and older could be interfaced using two different api's, the SCM or the GH API. The GH interface to guile is deprecated. Read more about why in the Guile manual.

    Support for the guile GH wrapper code generation has been dropped from SWIG. The last version of SWIG that can still generate guile GH wrapper code is 2.0.9. Please use that version if you really need the GH wrapper code.

    24.4 Linkage

    Guile support is complicated by a lack of user community cohesiveness, which manifests in multiple shared-library usage conventions. A set of policies implementing a usage convention is called a linkage.

    24.4.1 Simple Linkage

    The default linkage is the simplest; nothing special is done. In this case the function SWIG_init() is exported. Simple linkage can be used in several ways:

    • Embedded Guile, no modules. You want to embed a Guile interpreter into your program; all bindings made by SWIG shall show up in the root module. Then call SWIG_init() in the inner_main() function. See the "simple" and "matrix" examples under Examples/guile.
    • Dynamic module mix-in. You want to create a Guile module using define-module, containing both Scheme code and bindings made by SWIG; you want to load the SWIG modules as shared libraries into Guile.

      (define-module (my module))
      (define my-so (dynamic-link "./libexample.so"))
      (dynamic-call "SWIG_init" my-so) ; make SWIG bindings
      ;; Scheme definitions can go here
      

      Newer Guile versions provide a shorthand for dynamic-link and dynamic-call:

      (load-extension "./libexample.so" "SWIG_init")
      

      A more portable approach would be to drop the shared library extension:

      (load-extension "./libexample" "SWIG_init")
      

      You need to explicitly export those bindings made by SWIG that you want to import into other modules:

      (export foo bar)
      

      In this example, the procedures foo and bar would be exported. Alternatively, you can export all bindings with the following module-system hack:

      (module-map (lambda (sym var)
                    (module-export! (current-module) (list sym)))
                  (current-module))
      

      SWIG can also generate this Scheme stub (from define-module up to export) semi-automagically if you pass it the command-line argument -scmstub. The code will be exported in a file called module.scm in the directory specified by -outdir or the current directory if -outdir is not specified. Since SWIG doesn't know how to load your extension module (with dynamic-link or load-extension), you need to supply this information by including a directive like this in the interface file:

      %scheme %{ (load-extension "./libexample.so" "SWIG_init") %}
      

      (The %scheme directive allows to insert arbitrary Scheme code into the generated file module.scm; it is placed between the define-module form and the export form.)

    If you want to include several SWIG modules, you would need to rename SWIG_init via a preprocessor define to avoid symbol clashes. For this case, however, passive linkage is available.

    24.4.2 Passive Linkage

    Passive linkage is just like simple linkage, but it generates an initialization function whose name is derived from the module and package name (see below).

    You should use passive linkage rather than simple linkage when you are using multiple modules.

    24.4.3 Native Guile Module Linkage

    SWIG can also generate wrapper code that does all the Guile module declarations on its own if you pass it the -Linkage module command-line option.

    The module name is set with the -package and -module command-line options. Suppose you want to define a module with name (my lib foo); then you would have to pass the options -package my/lib -module foo. Note that the last part of the name can also be set via the SWIG directive %module.

    You can use this linkage in several ways:

    • Embedded Guile with SWIG modules. You want to embed a Guile interpreter into your program; the SWIG bindings shall be put into different modules. Simply call the function scm_init_my_modules_foo_module in the inner_main() function.
    • Dynamic Guile modules. You want to load the SWIG modules as shared libraries into Guile; all bindings are automatically put in newly created Guile modules.
      (define my-so (dynamic-link "./libfoo"))
      ;; create new module and put bindings there:
      (dynamic-call "scm_init_my_modules_foo_module" my-so) 
      
      Newer Guile versions have a shorthand procedure for this:
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module")
      

    24.4.4 Old Auto-Loading Guile Module Linkage

    Guile used to support an autoloading facility for object-code modules. This support has been marked deprecated in version 1.4.1 and is going to disappear sooner or later. SWIG still supports building auto-loading modules if you pass it the -Linkage ltdlmod command-line option.

    Auto-loading worked like this: Suppose a module with name (my lib foo) is required and not loaded yet. Guile will then search all directories in its search path for a Scheme file my/modules/foo.scm or a shared library my/modules/libfoo.so (or my/modules/libfoo.la; see the GNU libtool documentation). If a shared library is found that contains the symbol scm_init_my_modules_foo_module, the library is loaded, and the function at that symbol is called with no arguments in order to initialize the module.

    When invoked with the -Linkage ltdlmod command-line option, SWIG generates an exported module initialization function with an appropriate name.

    24.4.5 Hobbit4D Linkage

    The only other linkage supported at this time creates shared object libraries suitable for use by hobbit's (hobbit4d link) guile module. This is called the "hobbit" linkage, and requires also using the "-package" command line option to set the part of the module name before the last symbol. For example, both command lines:

    swig -guile -package my/lib foo.i
    swig -guile -package my/lib -module foo foo.i
    

    would create module (my lib foo) (assuming in the first case foo.i declares the module to be "foo"). The installed files are my/lib/libfoo.so.X.Y.Z and friends. This scheme is still very experimental; the (hobbit4d link) conventions are not well understood.

    24.5 Underscore Folding

    Underscores are converted to dashes in identifiers. Guile support may grow an option to inhibit this folding in the future, but no one has complained so far.

    You can use the SWIG directives %name and %rename to specify the Guile name of the wrapped functions and variables (see CHANGES).

    24.6 Typemaps

    The Guile module handles all types via typemaps. This information is read from Lib/guile/typemaps.i. Some non-standard typemap substitutions are supported:

    • $descriptor expands to a type descriptor for use with the SWIG_NewPointerObj() and SWIG_ConvertPtr functions.
    • For pointer types, $*descriptor expands to a descriptor for the direct base type (i.e., one pointer is stripped), whereas $basedescriptor expands to a descriptor for the base type (i.e., all pointers are stripped).

    A function returning void (more precisely, a function whose out typemap returns SCM_UNSPECIFIED) is treated as returning no values. In argout typemaps, one can use the macro GUILE_APPEND_RESULT in order to append a value to the list of function return values.

    Multiple values can be passed up to Scheme in one of three ways:

    • Multiple values as lists. By default, if more than one value is to be returned, a list of the values is created and returned; to switch back to this behavior, use

      %values_as_list;
    • Multiple values as vectors. By issuing

      %values_as_vector;

      vectors instead of lists will be used.

    • Multiple values for multiple-value continuations. This is the most elegant way. By issuing

      %multiple_values;

      multiple values are passed to the multiple-value continuation, as created by call-with-values or the convenience macro receive. The latter is available if you issue (use-modules (srfi srfi-8)). Assuming that your divide function wants to return two values, a quotient and a remainder, you can write:

      (receive (quotient remainder)
          (divide 35 17)
        body...)
      

      In body, the first result of divide will be bound to the variable quotient, and the second result to remainder.

    See also the "multivalue" example.

    Constants are exported as a function that returns the value. The %feature("constasvar") can be applied to any constant, immutable variable, or enum. Instead of exporting the constant as a function that must be called, the constant will appear as a scheme variable. See Features and the %feature directive for info on how to apply the %feature.

    24.7 Representation of pointers as smobs

    For pointer types, SWIG uses Guile smobs. SWIG smobs print like this: #<swig struct xyzzy * 0x1234affe> Two of them are equal? if and only if they have the same type and value.

    To construct a Scheme object from a C pointer, the wrapper code calls the function SWIG_NewPointerObj(), passing a pointer to a struct representing the pointer type. The type index to store in the upper half of the CAR is read from this struct. To get the pointer represented by a smob, the wrapper code calls the function SWIG_ConvertPtr(), passing a pointer to a struct representing the expected pointer type. See also The run-time type checker. If the Scheme object passed was not a SWIG smob representing a compatible pointer, a wrong-type-arg exception is raised.

    24.7.1 Smobs

    In earlier versions of SWIG, C pointers were represented as Scheme strings containing a hexadecimal rendering of the pointer value and a mangled type name. As Guile allows registering user types, so-called "smobs" (small objects), a much cleaner representation has been implemented now. The details will be discussed in the following.

    The whole type system, when it is first initialized, creates two smobs named "swig" and "collected_swig". The swig smob is used for non-garbage collected smobs, while the collected_swig smob is used as described below. Each smob has the same format, which is a double cell created by SCM_NEWSMOB2() The first word of data is the pointer to the object and the second word of data is the swig_type_info * structure describing this type. If a generated GOOPS module has been loaded, smobs will be wrapped by the corresponding GOOPS class.

    24.7.2 Garbage Collection

    Garbage collection is a feature of Guile since version 1.6. As SWIG now requires Guile > 1.8, it is automatically included. Garbage collection works like this. Every swig_type_info structure stores in its clientdata field a pointer to the destructor for this type. The destructor is the generated wrapper around the delete function. So swig still exports a wrapper for the destructor, it just does not call scm_c_define_gsubr() for the wrapped delete function. So the only way to delete an object is from the garbage collector, since the delete function is not available to scripts. How swig determines if a type should be garbage collected is exactly like described in Object ownership and %newobject in the SWIG manual. All typemaps use an $owner var, and the guile module replaces $owner with 0 or 1 depending on feature:new.

    24.8 Native Guile pointers

    In addition to SWIG smob pointers, Guile's native pointer type are accepted as arguments to wrapped SWIG functions. This can be useful for passing pointers to bytevector data to wrapped functions.

    24.9 Exception Handling

    SWIG code calls scm_error on exception, using the following mapping:

          MAP(SWIG_MemoryError,     "swig-memory-error");
          MAP(SWIG_IOError,         "swig-io-error");
          MAP(SWIG_RuntimeError,    "swig-runtime-error");
          MAP(SWIG_IndexError,      "swig-index-error");
          MAP(SWIG_TypeError,       "swig-type-error");
          MAP(SWIG_DivisionByZero,  "swig-division-by-zero");
          MAP(SWIG_OverflowError,   "swig-overflow-error");
          MAP(SWIG_SyntaxError,     "swig-syntax-error");
          MAP(SWIG_ValueError,      "swig-value-error");
          MAP(SWIG_SystemError,     "swig-system-error");
    

    The default when not specified here is to use "swig-error". See Lib/exception.i for details.

    24.10 Procedure documentation

    If invoked with the command-line option -procdoc file, SWIG creates documentation strings for the generated wrapper functions, describing the procedure signature and return value, and writes them to file.

    SWIG can generate documentation strings in three formats, which are selected via the command-line option -procdocformat format:

    • guile-1.4 (default): Generates a format suitable for Guile 1.4.
    • plain: Generates a format suitable for Guile 1.4.1 and later.
    • texinfo: Generates texinfo source, which must be run through texinfo in order to get a format suitable for Guile 1.4.1 and later.

    You need to register the generated documentation file with Guile like this:

    (use-modules (ice-9 documentation))
    (set! documentation-files 
          (cons "file" documentation-files))
    

    Documentation strings can be configured using the Guile-specific typemap argument doc. See Lib/guile/typemaps.i for details.

    24.11 Procedures with setters

    For global variables, SWIG creates a single wrapper procedure (variable :optional value), which is used for both getting and setting the value. For struct members, SWIG creates two wrapper procedures (struct-member-get pointer) and (struct-member-set pointer value).

    If invoked with the command-line option -emit-setters (recommended), SWIG will additionally create procedures with setters. For global variables, the procedure-with-setter variable is created, so you can use (variable) to get the value and (set! (variable) value) to set it. For struct members, the procedure-with-setter struct-member is created, so you can use (struct-member pointer) to get the value and (set! (struct-member pointer) value) to set it.

    If invoked with the command-line option -only-setters, SWIG will only create procedures with setters, i.e., for struct members, the procedures (struct-member-get pointer) and (struct-member-set pointer value) are not generated.

    24.12 GOOPS Proxy Classes

    SWIG can also generate classes and generic functions for use with Guile's Object-Oriented Programming System (GOOPS). GOOPS is a sophisticated object system in the spirit of the Common Lisp Object System (CLOS).

    To enable GOOPS support, pass the -proxy argument to swig. This will export the GOOPS wrapper definitions into the module.scm file in the directory specified by -outdir or the current directory. GOOPS support requires either passive or module linkage.

    The generated file will contain definitions of GOOPS classes mimicking the C++ class hierarchy.

    Enabling GOOPS support implies -emit-setters.

    If -emit-slot-accessors is also passed as an argument, then the generated file will contain accessor methods for all the slots in the classes and for global variables. The input class

      class Foo {
        public:
          Foo(int i) : a(i) {}
          int a;
          int getMultBy(int i) { return a * i; }
          Foo getFooMultBy(int i) { return Foo(a * i); }
      }; 
      Foo getFooPlus(int i) { return Foo(a + i); }
    

    will produce (if -emit-slot-accessors is not passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> getMultBy getFooMultBy getFooPlus )
    

    and will produce (if -emit-slot-accessors is passed as a parameter)

    (define-class <Foo> (<swig>)
      (a #:allocation #:swig-virtual 
         #:slot-ref primitive:Foo-a-get 
         #:slot-set! primitive:Foo-a-set 
         #:accessor a)
      #:metaclass <swig-metaclass>
      #:new-function primitive:new-Foo
    )
    (define-method (getMultBy (swig_smob <Foo>) i)
      (primitive:Foo-getMultBy  (slot-ref swig_smob 'smob) i))
    (define-method (getFooMultBy (swig_smob <Foo>) i)
      (make <Foo> #:init-smob (primitive:Foo-getFooMultBy  (slot-ref swig_smob 'smob) i)))
    
    (define-method (getFooPlus i)
      (make <Foo> #:init-smob (primitive:getFooPlus i)))
    
    (export <Foo> a getMultBy getFooMultBy getFooPlus )
    

    which can then be used by this code

    ;; not using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (slot-ref foo 'a)
    (slot-set! foo 'a 3)
    (getMultBy foo 4)
    (define foo2 (getFooMultBy foo 7))
    (slot-ref foo 'a)
    (slot-ref (getFooPlus foo 4) 'a)
    
    ;; using getters and setters
    (define foo (make <Foo> #:args '(45)))
    (a foo)
    (set! (a foo) 5)
    (getMultBy foo 4)
    (a (getFooMultBy foo 7))
    

    Notice that constructor arguments are passed as a list after the #:args keyword. Hopefully in the future the following will be valid (make <Foo> #:a 5 #:b 4)

    Also note that the order the declarations occur in the .i file make a difference. For example,

    %module test
    
    %{ #include "foo.h" %}
    
    %inline %{
      int someFunc(Foo &a) {
        ...
      }
    %}
    
    %include "foo.h"
    

    This is a valid SWIG file it will work as you think it will for primitive support, but the generated GOOPS file will be broken. Since the someFunc definition is parsed by SWIG before all the declarations in foo.h, the generated GOOPS file will contain the definition of someFunc() before the definition of <Foo>. The generated GOOPS file would look like

    ;;...
    
    (define-method (someFunc (swig_smob <Foo>))
      (primitive:someFunc (slot-ref swig_smob 'smob)))
    
    ;;...
    
    (define-class <Foo> (<swig>)
      ;;...
    )
    
    ;;...
    

    Notice that <Foo> is used before it is defined. The fix is to just put the %import "foo.h" before the %inline block.

    24.12.1 Naming Issues

    As you can see in the example above, there are potential naming conflicts. The default exported accessor for the Foo::a variable is named a. The name of the wrapper global function is getFooPlus. If the -useclassprefix option is passed to swig, the name of all accessors and member functions will be prepended with the class name. So the accessor will be called Foo-a and the member functions will be called Foo-getMultBy. Also, if the -goopsprefix goops: argument is passed to swig, every identifier will be prefixed by goops:

    Two guile-modules are created by SWIG. The first module contains the primitive definitions of all the wrapped functions and variables, and is located either in the _wrap.cxx file (with -Linkage module) or in the scmstub file (if -Linkage passive -scmstub). The name of this guile-module is the swig-module name (given on the command line with the -module argument or with the %module directive) concatenated with the string "-primitive". For example, if %module Test is set in the swig interface file, the name of the guile-module in the scmstub or -Linkage module will be Test-primitive. Also, the scmstub file will be named Test-primitive.scm. The string "primitive" can be changed by the -primsuffix swig argument. So the same interface, with the -primsuffix base will produce a module called Test-base. The second generated guile-module contains all the GOOPS class definitions and is located in a file named module.scm in the directory specified with -outdir or the current directory. The name of this guile-module is the name of the swig-module (given on the command line or with the %module directive). In the previous example, the GOOPS definitions will be in a file named Test.scm.

    Because of the naming conflicts, you can't in general use both the -primitive and the GOOPS guile-modules at the same time. To do this, you need to rename the exported symbols from one or both guile-modules. For example,

    (use-modules ((Test-primitive) #:renamer (symbol-prefix-proc 'primitive:)))
    (use-modules ((Test) #:renamer (symbol-prefix-proc 'goops:)))
    

    24.12.2 Linking

    The guile-modules generated above all need to be linked together. GOOPS support requires either passive or module linkage. The exported GOOPS guile-module will be the name of the swig-module and should be located in a file called Module.scm. This should be installed on the autoload path for guile, so that (use-modules (Package Module)) will load everything needed. Thus, the top of the GOOPS guile-module will contain code to load everything needed by the interface (the shared library, the scmstub module, etc.). The %goops directive inserts arbitrary code into the generated GOOPS guile-module, and should be used to load the dependent libraries.

    This breaks up into three cases

    • Passive Linkage without -scmstub: Note that this linkage style has the potential for naming conflicts, since the primitive exported function and variable names are not wrapped in a guile-module and might conflict with names from the GOOPS guile-module (see above). Pass the -goopsprefix argument to solve this problem. If the -exportprimitive option is passed to SWIG the (export ...) code that would be exported into the scmstub file is exported at the bottom of the generated GOOPS guile-module. The %goops directive should contain code to load the shared library.
      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module (with the -package my/modules -module foo command line arguments)

      (define-module (my modules foo))
      
      ;; %goops directive goes here
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      
    • Passive Linkage with -scmstub: Here, the name of the scmstub file should be Module-primitive.scm (with primitive replaced with whatever is given with the -primsuffix argument. The code to load the shared library should be located in the %scheme directive, which will then be added to the scmstub file. SWIG will automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. So if Module-primitive.scm is on the autoload path for guile, the %goops directive can be empty. Otherwise, the %goops directive should contain whatever code is needed to load the Module-primitive.scm file into guile.

      %scheme %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      // only include the following definition if (my modules foo) cannot
      // be loaded automatically
      %goops %{ 
        (primitive-load "/path/to/foo-primitive.scm") 
        (primitive-load "/path/to/Swig/common.scm")
      %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (primitive-load "/path/to/foo-primitive.scm")
      (primitive-load "/path/to/Swig/common.scm")
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                             'primitive:)))
      
      
    • Module Linkage: This is very similar to passive linkage with a scmstub file. SWIG will also automatically generate the line (use-modules (Package Module-primitive)) into the GOOPS guile-module. Again the %goops directive should contain whatever code is needed to get that module loaded into guile.

      %goops %{ (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") %}
      

      Produces the following code at the top of the generated GOOPS guile-module

      (define-module (my modules foo))
      
      ;; %goops directive goes here (if any)
      (load-extension "./libfoo.so" "scm_init_my_modules_foo_module") 
      
      (use-modules (oop goops) (Swig common))
      (use-modules ((my modules foo-primitive) :renamer (symbol-prefix-proc
                                                               'primitive:)))
      
      

    (Swig common): The generated GOOPS guile-module also imports definitions from the (Swig common) guile-module. This module is included with SWIG and should be installed by SWIG into the autoload path for guile (based on the configure script and whatever arguments are passed). If it is not, then the %goops directive also needs to contain code to load the common.scm file into guile. Also note that if you are trying to install the generated wrappers on a computer without SWIG installed, you will need to include the common.swg file along with the install.

    Multiple Modules: Type dependencies between modules is supported. For example, if mod1 includes definitions of some classes, and mod2 includes some classes derived from classes in mod1, the generated GOOPS file for mod2 will declare the correct superclasses. The only problem is that since mod2 uses symbols from mod1, the mod2 GOOPS file must include a (use-modules (mod2)). Currently, SWIG does not automatically export this line; it must be included in the %goops directive of mod2. Maybe in the future SWIG can detect dependencies and export this line. (how do other language modules handle this problem?)

    swig-3.0.12/Doc/Devel/0000775000175000017500000000000013042756442014201 5ustar williamwilliamswig-3.0.12/Doc/Devel/index.html0000664000175000017500000000155413042756442016203 0ustar williamwilliam SWIG Documentation This directory contains SWIG documentation: The following documentation describe the internal APIs used by SWIG. These may be useful to module developers.
    Copyright (C) 1999-2007 SWIG Development Team. swig-3.0.12/Doc/Devel/file.html0000664000175000017500000001330213042756442016005 0ustar williamwilliam SWIG File Handling

    Introduction

    This document describes the functions related to file and filename handling in the SWIG core. These functions are defined in the header file Source/Swig/swigfile.h. This API is considered to be stable.

    File Search Path

    These functions manipulate the search path for locating files.

    List *Swig_add_directory(const String_or_char *dirname)

    Adds a new directory to the system search path. The directory is appended to the end of the search path. Returns a list containing the current system search path.

    void Swig_push_directory(const String_or_char *dirname)

    Pushes a temporary directory onto the search path. This directory is searched before directories added with Swig_add_directory() except when including a system file explicitly (either using #include <file> or calling Swig_include_sys()). This function is normally used by the preprocessor to add temporary directories when processing #include statements.

    void Swig_pop_directory()

    Pops off the last pushed directory with Swig_push_directory()

    int Swig_get_push_dir()

    Returns a flag that indicates whether directory pushing is enabled or not.

    void Swig_set_push_dir(int dopush)

    Enables or disables directory pushing. By default, it is turned on. However, the -I- command line option to SWIG disables it.

    List *Swig_search_path()

    Returns the current search path.

    File access functions

    FILE *Swig_open(const String_or_char *name)

    Opens a file, using the applicable search paths, and returns an open FILE * object if found. Returns NULL if the file is not found.

    String *Swig_read_file(FILE *f)

    Reads all of the data from an open file into a string which is returned.

    String *Swig_include(const String_or_char *name)

    Searches for an include file name and returns its contents as a string if found. Returns NULL if not found. All of the applicable search paths are searched when trying to locate the file.

    String *Swig_include_sys(const String_or_char *name)

    Searches for an include file name and returns its contents as a string if found. Returns NULL if not found. All of the applicable search paths are searched when trying to locate the file, but preference is given to system paths first. This mimics the behavior of #include <file> in the preprocessor.

    int Swig_insert_file(const String_or_char *name, File *outfile)

    Searches for a file name and dumps its contents to outfile if found. Returns 0 on success, -1 if the file couldn't be found.

    Query functions

    String *Swig_last_file()

    Returns the full pathname of the file last opened or included.

    Named files

    void *Swig_register_filebyname(const String_or_char *filename, File *outfile)

    Registers a file object outfile with a specific name filename. This function is used to implement the SWIG %insert directive and to manage different sections of the output file such as "runtime","header","wrapper","init", etc. Different language modules may add their own sections for generating Python code, Perl code, etc.

    File *Swig_filebyname(const String_or_char *filename)

    This looks up a file object previously registered using Swig_register_filebyname(). This is used to implement the %insert directive.

    Filename utilities

    char *Swig_file_suffix(const String_or_char *filename)

    Returns the suffix of a filename. For instance, if the filename is "foo.txt", it returns ".txt".

    char *Swig_file_basename(const String_or_char *filename)

    Returns the filename without the suffix attached to it. For instance, if the filename is "foo.txt", it returns "foo". The result is stored in a static variable. If you need to save it, make your own copy.

    char *Swig_file_filename(const String_or_char *filename)

    Returns the filename without any leading directories. For instance, if the filename is "/bar/spam/foo.txt", it returns "foo.txt". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.

    char *Swig_file_dirname(const String_or_char *filename)

    Returns the directory name (if any). For instance, if the filename is "/bar/spam/foo.txt", it returns "/bar/spam/". This function is aware of local naming conventions on the machine (e.g., forward versus back slashes on Unix and Windows). The result is stored in a static variable. If you need to save the value, make a copy.

    SWIG_FILE_DELIMITER

    This macro contains the file delimiter string for the local machine. On Unix it is "/", on Windows it is "\\".
    swig-3.0.12/Doc/Devel/engineering.html0000664000175000017500000003146713042756442017374 0ustar williamwilliam SWIG Engineering Manual

    SWIG Engineering Manual

    David Beazley

    (Note : This is a work in progress.)

    Table of Contents

    1. Introduction

    The purpose of this document is to describe various coding conventions and organizational aspects for SWIG developers. The idea for this document is largely borrowed from John Ousterhout's Tcl/Tk Engineering Manual. It is not my intent to overly managerial about matters--rather I'm hoping to make life a little less chaotic for everyone.

    First a little background: SWIG was started in 1995 as a one-person project and continued in this mode of operation until about 1998. Most of this development was driven by ideas submitted by early SWIG users as opposed to being motivated by a grand design. As a result, the code ended up being a pretty horrible C++ coding disaster. A mostly working disaster perhaps, but a disaster nonetheless.

    With that said, the primary goal of future SWIG development is to reengineer the original system, fix most of its inherent design flaws, and to produce what I hope will become a highly extensible and modular interface compiler framework. To this do this, there are a few critical areas of work. First, I want to restructure SWIG as a collection of loosely coupled modules written in either ANSI C or an scripting language. Second, I want the system to be minimalistic in its use of data structures and interconnections. The primary reason for this is that the fewer data structures there are, the less users will have to remember. This will also make the system more accessible to non-experts. Finally, I want to reevaluate the whole idea of a SWIG module is and expand the definition to include just about anything from parsers, preprocessors, optimizers, interface editors, and code generators.

    The rest of this document outlines a few general rules of how code should be developed within the SWIG project. These rules are primarily drawn from my own experience developing software and observing the practices of other successful projects.

    2. Programming Languages and Libraries

    All SWIG modules must be written in either ANSI C or one of the scripting languages for which SWIG can generate an interface (e.g., Perl, Python, or Tcl). C++ is currently being used to write SWIG modules, but it is only being utilized to avoid working with a lot of pointers to functions. Advanced C++ features like namespaces, templates, and overloading should not be used..

    Module writers should make every attempt to use only those functions described in the POSIX.1 standard. This includes most of the functions contained the Kernighan and Ritchie C programming book. Use of operating system dependent functionality such as socket libraries should always be included inside a conditional compilation block so that it can be omitted on problematic platforms. If you are unsure about a library call, check the man page or contact Dave.

    3. The Source Directory and Module Names

    All SWIG modules are contained within the "Source" directory. Within this directory, each module is placed into its own subdirectory. The name of this subdirectory should exactly match the name of the module. For example, if you are creating a module called "Tcl", all of your files should be placed in a directory "Tcl".

    When choosing a module name, please pick a name that is not currently in use. As a general convention, the first letter of a module name is capitalized such as "Perl". Alternatives such as "perl" or "PERL" should be avoided. In certain instances, the first two letters may be capitalized as in "CParse." The exact usage of this is somewhat inconsistent and isn't terribly important--just make sure the first letter is capitalized. Also, module names should not start with numbers, include underscores or any other special non-alphanumeric characters.

    5. File Structure

    Each file in a module should be given a filename that is all lowercase letters such as "parser.c", not "Parser.c" or "PARSER.c". Please note that filenames are case-insensitive on Windows so this convention will prevent you from inadvertently creating two files that differ in case-only.

    Each file should include a short abstract and license information like this:

    /* -----------------------------------------------------------------------------
     * This file is part of SWIG, which is licensed as a whole under version 3 
     * (or any later version) of the GNU General Public License. Some additional
     * terms also apply to certain portions of SWIG. The full details of the SWIG
     * license and copyrights can be found in the LICENSE and COPYRIGHT files
     * included with the SWIG source code as distributed by the SWIG developers
     * and at http://www.swig.org/legal.html.
     *
     * xxx.c
     *
     * This file defines ...
     * ----------------------------------------------------------------------------- */
    
    #include "swig.h"
    
    /* Declarations */
    typedef struct {
       int x, y;
    } Foo;
    
    ...
    
    /* Private Declarations (used only in this file) */
    static int  avariable;
    
    ...
    
    /* Functions */
    ... 
    
    

    As a general rule, files start to get unmanageable once they exceed about 2000 lines. Files larger than this should be broken up into multiple files. Similarly, you should avoid the temptation to create many small files as this increases compilation time and makes the directory structure too complicated.

    6. Bottom-Up Design

    Within each source file, the preferred organization is to use what is known as "bottom-up" design. Under this scheme, lower-level functions appear first and the highest level function appears last. The easy way to remember is that the "main" function of your module should always appear last in the source file. For example:
    /* Simple bottom-up program */
    #include <stdio.h>
    
    int foo(int x, int y) {
        /* Implement foo */
        ...
    }
    
    int bar() {
        ...
        foo(i,j);
        ...
    }
    
    ...
    int main(int argc, char **argv) {
        ...
        bar();   
        ...
    }
    
    This choice of design is somewhat arbitrary however it has a number of benefits particular to C. In particular, a bottom-up design generally eliminates the need to include forward references--resulting in cleaner code and fewer compilation errors.

    7. Functions

    All functions should have a function header that gives the function name and a short description like this:
    /* -------------------------------------------------------------------------
     * Swig_add_directory()
     *
     * Adds a directory to the SWIG search path.
     * ------------------------------------------------------------------------- */
    
    void 
    Swig_add_directory(DOH *dirname) {
    ...
    
    }
    
    In the function declaration, the return type and any specifiers (extern or static) should appear on a separate line followed by the function name and arguments as shown above. The left curly brace should appear on the same line as the function name.

    Function declarations should NOT use the pre-ANSI function declaration syntax. The ANSI standard has been around long enough for this to be a non-issue.

    8. Naming Conventions

    The following conventions are used to name various objects throughout SWIG.

    Functions

    Functions should consist of the module name and the function name separated by an underscore like this:
    Preprocessor_define()
    Swig_add_directory()
    
    In general, the module name should match the name of the module subdirectory and the function name should be in all lowercase with words separated by underscores.

    Structures and Types

    If your module defines new structures, the structure name should include the name of the module and the name of the structure appended together like this:
    typedef struct SwigScanner {
       ...
    } SwigScanner;
    
    typedef struct LParseType {
       ...
    } LParseType;
    
    In this case, both the name of the module and the type should be capitalized. Also, whenever possible, you should use the "typedef struct Name { ... } Name" form when defining new data structures.

    Global Variables

    Global variables should be avoided if at all possible. However, if you must use a global variable, please prepend the module name and use the same naming scheme as for functions.

    Constants

    Constants should be created using #define and should be in all caps like this:
    #define   SWIG_TOKEN_LPAREN  1
    
    Separate words in a constant should be separated by underscores as with functions.

    Structure members

    Structure members should be in all lower-case and follow the same word-separation convention as for function names. However, the module name does not have to be included. For example:
    typedef struct SwigScanner {
      DOH           *text;           /* Current token value */
      DOH           *scanobjs;       /* Objects being scanned */
      DOH           *str;            /* Current object being scanned */
      char          *idstart;        /* Optional identifier start characters */
      int            next_token;     /* Next token to be returned */
      int            start_line;     /* Starting line of certain declarations */
      int            yylen;          /* Length of text pushed into text */
      DOH           *file;           /* Current file name */
    } SwigScanner;
    

    Static Functions and Variables

    Static declarations are free to use any naming convention that is appropriate. However, most existing parts of SWIG use lower-case names and follow the same convention as described for functions.

    9. Visibility

    Modules should keep the following rules in mind when exposing their internals:
    • Only publicly accessible functions should be included in the module header file.
    • All non-static declarations must be prepended with some form of the module name to avoid potential linker namespace conflicts with other modules.
    • Modules should not expose global variables or use global variables in their public interface.
    • Similarly, modules should discourage the direct manipulation of data contained within data structures in favor of using function calls instead. For example, instead of providing a user with a structure like this:
      typedef struct Foo {
         int line;
      } Foo;
      
      It is better to hide the implementation of Foo and provide an function-call interface like this:
      typedef struct Foo Foo;
      extern int  Foo_getline(Foo *f);
      extern void Foo_setline(Foo *f, int line);
      
      Although this results in worse performance, there are many practical reasons for doing this. The most important reason is that it allows you to change the internal representation of Foo without breaking all of the other modules or having to recompile the entire universe after making your changes.

    10. Miscellaneous Coding Guidelines

    These are largely covered in the main documentation in the Extending.html file.

    11. Git Tagging Conventions

    Use git tag to declare some set of file revisions as related in some symbolic way. This eases reference, retrieval and manipulation of these files later. At the moment (2001/01/16 14:02:53), the conventions are very simple; let's hope they stay that way!

    There are two types of tags, internal (aka personal) and external. Internal tags are used by SWIG developers primarily, whereas external tags are used when communicating with people w/ anonymous git access.

    • Internal tags should start with the developer name and a hyphen.
    • External tags should start with "rel-".
    That's all there is to it. Some example tags:
    • ttn-pre-xml-patch
    • ttn-post-xml-patch
    • ttn-going-on-vacation-so-dutifully-tagging-now
    • rel-1.3.40
    • rel-2.0.9

    Copyright (C) 1999-2004 SWIG Development Team. swig-3.0.12/Doc/Devel/tree.html0000664000175000017500000002176113042756442016035 0ustar williamwilliam SWIG Parse Tree Handling

    SWIG Parse Tree Handling

    Introduction

    This document describes the functions related to the handling of parse trees in SWIG. The structure of SWIG parse trees has been influenced heavily by ideas from XML-DOM trees. In fact, the functions in the API and attribute names are nearly identical. The header file Source/swig/swigtree.h contains the functions and macros described in this document. This API is considered to be stable.

    Parse tree navigation

    The following macros are used to navigate the parse tree.

    nodeType(n)

    Returns the type of a node as a String object. The type is stored in the "nodeType" attribute of n.

    parentNode(n)

    Returns the parent of a node. This is found in the "parentNode" attribute of n.

    previousSibling(n)

    Returns the previous sibling of a node (if any). This is found in the "previousSibling" attribute of n.

    nextSibling(n)

    Returns the next sibling of a node (if any). This is found in the "nextSibling" attribute of n.

    firstChild(n)

    Returns the first child of a node (if any). This is found in the "firstChild" attribute of n.

    lastChild(n)

    Returns the last child of a node (if any). This is found in the "lastChild" attribute of n.

    Parse Tree Construction

    The following macros are used to construct parse trees.

    set_nodeType(n, val)

    Sets the nodeType attribute of n. val is a string containing the type.

    set_parentNode(n, parent)

    Sets the parent of node n.

    set_previousSibling(n, prev)

    Sets the previous sibling of node n.

    set_nextSibling(n, next)

    Sets the next sibling of node n.

    set_firstChild(n, chd)

    Sets the first child of node n.

    set_lastChild(n, chd)

    Sets the last child of node n.

    Tree Management Functions

    The following functions are used to help with the management and construction of parse trees.

    void appendChild(Node *node, Node *child)

    Adds a new child to node. This function takes care of adjusting the "firstChild" and "lastChild" attributes of node to appropriate values. After calling this function, the "lastChild" attribute will point to child.

    void prependChild(Node *node, Node *child)

    Prepends a new child to node. The new child is added so that it becomes the first child of node.

    void removeNode(Node *node)

    Removes a node from the parse tree. The removal process detaches a node from its parent by removing it from the parent's child list. Upon return, node will have no parent and no siblings. This function does NOT delete node or modify children of node. If desired, node could be reattached to a different part of the parse tree.

    Node *copyNode(Node *node)

    Copies a node, but only copies those attributes that are simple strings. Thus, the new node will not contain any references to other nodes, lists, hashes, or other complex data structures. This function may be useful if you want to copy the data contents of a node in the process of creating a new parse tree node.

    Attribute Checking

    The following utility is provided since this is an extremely common operation.

    int checkAttribute(Node *n, const String_or_char *name, const String_or_char *value)

    This function checks to see whether node n has a given attribute name and that the attribute has a given value. Returns 0 or 1.

    Node Transformation

    In the course of processing, SWIG often applies a transform to a node. This transformation process made modify many of the attributes--even changing the type of a node. The following functions are used to help manage this transformation process. In addition to provide sanity checks, they save the old contents of the node so that they can be restored later.

    void Swig_save(const char *namespace, Node *n, ...)

    This function takes a node and a list of attribute names and saves their contents in a specified namespace. For example, the call
    Swig_save("temp",n,"type","parms","name",NIL)
    
    takes the attributes "type","parms", and "name" and saves their contents under the attribute names "temp:type","temp:parms","temp:name". In addition, this function sets an attribute "view" to hold the name of the current namespace. In this example, the "view" attribute would be set to "temp". The attribute names specified are all optional. If one or more of the attributes don't exist, this function merely records that those attributes did not exist in the original node.

    void Swig_require(const char *namespace, Node *n, ...)

    This function is similar to Swig_save() except that adds additional attribute checking. There are different interpretations of the attribute names. A name of "attr" merely requests that the function check for the presence of an attribute. If the attribute is missing, SWIG will exit with a failed assertion. An attribute name of "?attr" specifies that the attribute "attr" is optional and that its old value must be saved (if any). An attribute name of "*attr" specifies that the attribute is required and that its value must be saved. The saving of attributes is performed in the same manner as with Swig_save(). Here is an example:
    Swig_require("temp",n,"type","*name","?parms",NIL);
    

    void Swig_restore(Node *n)

    This function restores a node to the state it was in prior to the last Swig_save() or Swig_require() call. This is used to undo node transformations.

    Debugging Functions

    The following functions can be used to help debug any SWIG DOH object.

    void Swig_print(DOH *object, int count = -1)
    Prints to stdout a string representation of any DOH type. The number of nested Hash types to expand is set by count (default is 1 if count<0). See Swig_set_max_hash_expand() to change default.
    
    
    void Swig_print_with_location(DOH *object, int count = -1)
    Prints to stdout a string representation of any DOH type, within [] brackets for Hash and List types, prefixed by line and file information. The number of nested Hash types to expand is set by count (default is 1 if count<0). See Swig_set_max_hash_expand() to change default.
    
    

    The following functions can be used to help debug SWIG parse trees.

    void Swig_print_tags(Node *node, String_or_char *prefix)

    Prints the tag-structure of the parse tree to standard output. node is the top-level parse tree node. prefix is a string prefix thats added to the start of each line. Normally, you would specify the empty string or NIL for prefix. This function is called by the -debug-tags option to SWIG.
    % swig -debug-tags -python example.i
     . top (:1)
     . top . include (/Users/beazley/Projects/share/swig/1.3.31/swig.swg:0)
     . top . include . include (/Users/beazley/Projects/share/swig/1.3.31/swigwarnings.swg:0)
     . top . include . include . include (/Users/beazley/Projects/share/swig/1.3.31/swigwarn.swg:0)
    ...
    ...
     . top . include (example.i:0)
     . top . include . module (example.i:2)
     . top . include . insert (example.i:7)
     . top . include . cdecl (example.i:5)
     . top . include . cdecl (example.i:6)
    
    Since many language modules include hundreds of typemaps and other information, the output of this can be significantly more complicated than you might expect.

    void Swig_print_node(Node *node)

    Prints the contents of a parse tree node, including all children, to standard output. The output includes all attributes and other details.

    void Swig_print_tree(Node *node)

    Prints the same output as Swig_print_node() except that it also processes all of the siblings of node. This can be used to dump the entire parse tree to standard output. The command line options -debug-module and -debug-top use this function to display the parse tree for a SWIG input file.
    swig-3.0.12/Doc/Devel/wrapobj.html0000664000175000017500000001663113042756442016542 0ustar williamwilliam Wrapper Objects

    SWIG File Handling

    David M. Beazley
    dave-swig@dabeaz.com
    December, 2006

    Wrapper Objects

    David M. Beazley
    dave-swig@dabeaz.com
    January 15, 2007

    Introduction

    This document describes the functions related to management of wrapper objects. A wrapper object is a low-level data structure used to contain the C/C++ code that is emitted during the wrapping process. It contains not only the emitted code, but information about local variables. These objects are a critical component of almost all SWIG target language modules.

    The functions described here are declared in Source/Swig/swigwrap.h. This API is considered to be stable.

    Creating and Destroying Wrappers

    The following functions create and destroy wrapper objects.

    Wrapper *NewWrapper()

    Creates a new wrapper object.

    void DelWrapper(Wrapper *w)

    Destroys a wrapper object.

    Wrapper Objects

    The Wrapper object returned by NewWrapper() has three public attributes.
    typedef struct Wrapper {
        String *def;
        String *locals;
        String *code;
    } Wrapper;
    
    The def attribute is a string that holds the function definition line. This line declares the function name, return type, and parameters. Language modules create this declaration by simply printing the appropriate text into this attribute.

    The locals attribute is a string that holds the code related to any local variables declaration. Normally, language modules do not emit code to this string directly. They use Wrapper_add_local() or Wrapper_new_local() to do this.

    The code attribute is a string that holds code related to the body of the function. Almost all code emitted by SWIG language modules is printed into this attribute.

    Creating Local Variables

    Perhaps the most useful aspect of Wrapper objects is the management of local variables. When creating a wrapper, it is often necessary to emit local variables related to the API of the target language. In addition to this, typemaps and other aspects of SWIG rely upon their own local variables. The following functions are used to create local variables, but also provide support for renaming variables in order to avoid name clashes.

    int Wrapper_add_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)

    Adds a new local variable to the wrapper object. name is the name of the local variable. decl is a string containing the actual variable declaration code. For example, if you wanted to declare a variable "int x = 42;", you would set name to "x" and decl to "int x = 42;". On success, the text in decl is added to the locals attribute of w and 0 is returned. -1 is returned if a variable with the given name has already been declared.

    int Wrapper_add_localv(Wrapper *w, const String_or_char *name, ...)

    The same as Wrapper_add_local() except that instead of passing a single string for the declaration, a NULL-terminated list of strings can be passed. These strings are joined together when producing the output. This convention turns out to be fairly useful since language modules often create their output into pieces.

    char * Wrapper_new_local(Wrapper *w, const String_or_char *name, const String_or_char *decl)

    The same as Wrapper_add_local() except that if a local variable with the given name already exists, this function picks a new name and adds the declaration using the new name. The actual name used for the variable is returned. This function is used when generating code originating from typemaps. For instance, if a typemap declares a local variable, that variable might have to be renamed if the same typemap is used more than once in the same function.

    char * Wrapper_new_localv(Wrapper *w, const String_or_char *name,...)

    The same as Wrapper_new_localv(), but accepts a NULL-terminated list of strings as code output.

    int Wrapper_check_local(Wrapper *w, const String_or_char *name)

    Checks to see if a local variable with name name has been declared. Returns 1 if the local is defined, 0 otherwise.

    Output

    void Wrapper_print(Wrapper *w, File *f)

    This function is used to format a wrapper function for output. The formatted wrapper function is emitted to f which may be any file-like object including a FILE * object or a String * object. When emitting the wrapper, the code printed to the wrapper object is automatically formatted. By default, the formatting is done according to a "pretty printing" style in which lines are split onto multiple lines and indented according to reasonable C formatting rules. This produces code that is moderately readable should you want to look at the wrapper code output. An alternative output mode is "compact printing" in which lines are collected and compacted. This may result in multiple C statements appearing on the same line. This mode is sometimes used when the size of a wrapper file is too large for certain compilers. For example, some compilers might impose a limit of 65536 lines per source file.

    void Wrapper_compact_print_mode_set(int flag)

    Sets the output mode of the Wrapper_print() function. If flag is set to 1, then wrapper code is formatted to be compact.

    void Wrapper_pretty_print(String *str, File *f)

    Utility function that reformats a string containing C/C++ code and outputs it to the file-like object f. The formatting process indents the code and structures it according to reasonable C formatting rules.

    void Wrapper_compact_print(String *str, File *f)

    Utility function that reformats a string containing C/C++ code and outputs it to the file-like object f. The formatting process tries to make the code as compact as possible, without going completely overboard. For example, multiple C statements may be combined onto a single line and braces may be aligned to not use up extra lines.

    An Example

    Here is a simple example of how these functions are used. Suppose you wanted to emit the following C function:
    void foo(int n) {
       int i;
       for (i = 0; i < n; i++) {
           printf("%d\n", i);
       }
    }
    
    Here is code that generates the above function:
    Wrapper *w = NewWrapper();
    Printf(w->def,"void foo(int n) {");
    Wrapper_add_local(w,"n","");         /* parameter n */
    Wrapper_add_local(w,"i", "int i;");  /* local i */
    Printv(w->code,"for (i = 0; i < n; i++) {",
                   "printf(\"%d\n",i);",
                   "}\n", NIL);
    Printf(w->code,"}\n");
    
    /* Emit wrapper code */
    Wrapper_print(w,outf);
    DelWrapper(w);
    
    Within different language modules, this process is obviously much more involved. However, this example shows the basic idea of how C/C++ code is prepared for output. swig-3.0.12/Doc/Devel/internals.html0000664000175000017500000011566013042756442017077 0ustar williamwilliam SWIG Internals

    SWIG Internals Manual

    (Note : This is a work in progress.)

    Table of Contents

    1. Introduction

    This document details SWIG internals: architecture and sometimes implementation. The first few sections concentrate on data structures, interfaces, conventions and code shared by all language targets. Subsequent sections focus on a particular language.

    The audience is assumed to be SWIG developers (who should also read the SWIG Engineering Manual before starting to code).

    1.1 Directory Guide

    Doc HTML documentation. If you find a documentation bug, please let us know.
    Examples This subdir tree contains examples of using SWIG w/ different scripting languages, including makefiles. Typically, there are the "simple" and "class" examples, w/ some languages offering additional examples. See the README more index.html file in each directory for more info. [FIXME: Ref SWIG user manual.]
    Lib These are the .i (interface) files that form the SWIG installed library. Language-specific files are in subdirectories (for example, guile/typemaps.i). Each language also has a .swg file implementing runtime type support for that language. The SWIG library is not versioned.
    Misc Currently this subdir only contains file fileheader. See the Engineering Manual for more info.
    Source The C and C++ source code for the swig executable is in this subdir tree.
    DOH C library providing memory allocation, file access and generic containers.
    Include Configuration .h files
    CParse Parser (lex / yacc) files and support
    Modules Language-specific callbacks that does actual code generation (each language has a .cxx and a .h file).
    Preprocessor SWIG-specialized C/C++ preprocessor.
    Swig This directory contains the ANSI C core of the system and contains generic functions related to types, file handling, scanning, and so forth.
    Tools The mkdist.py script and other tools. Win This improperly-named (spit spit) subdir only has README.txt.

    1.2 Overall Program Flow

    Here is the general control flow and where under subdir Source to look for code:
    • Modules/swigmain.cxx:main() is the program entry point. It parses the language-specifying command-line option (for example, -java), creating a new language-specific wrapping object (each language is a C++ class derived from base class Language). This object and the command-line is passed to SWIG_main(), whose return value is the program exit value.
    • Modules/main.cxx:SWIG_main() is the "real" main. It initializes the preprocessor and typemap machinery, defines some preprocessor symbols, locates the SWIG library, processes common command-line options, and then calls the language-specific command-line parser. From here there are three paths: "help", "checkout" and everything else.
      • In "help" mode, clean up open files and exit.
      • In "checkout" mode, copy specified files from the SWIG library to the current directory. Errors cause error messages but no non-local exits.
      • Otherwise, do wrapping: determine output file name(s), define some preprocessor symbols and run the preprocessor, initialize the interface-definition parser, set up the typemap for handling new return strings, and finally do the language-specific parse (by calling the language object's parse() method), which creates output files by side-effect.
      Afterwards, remove temporary files, and clean up. If the command-line included -freeze, go into an infinite loop; otherwise return the error count.
    • The language-specific parse() (and all other language-specific code) lives in Modules/foo.{h,cxx} for language Foo. Typically, FOO::parse() calls FOO::headers() and then the global function yyparse(), which uses the callbacks registered by SWIG_main() above.

    2. DOH

    DOH is a collection of low-level objects such as strings, lists, and hash tables upon which the rest of SWIG is built. The name 'DOH' unofficially stands for "Dave's Object Hack", but it's also a good expletive to use when things don't work (as in "SWIG core dumped---DOH!").

    2.1 Motivation and Background

    The development of DOH is influenced heavily by the problems encountered during earlier attempts to create a C++ based version of SWIG2.0. In each of these attempts (over a 3 year period), the resulting system always ended up growing into a colossal nightmare of large inheritance hierarchies and dozens of specialized classes for different types of objects (functions, variables, constants, etc.). The end result was that the system was tremendously complicated, difficult to understand, difficult to maintain, and fairly inflexible in the grand scheme of things.

    DOH takes a different approach to tackling the complexity problem. First, rather than going overboard with dozens of types and class definitions, DOH only defines a handful of simple yet very useful objects that are easy to remember. Second, DOH uses dynamic typing---one of the features that make scripting languages so useful and which make it possible to accomplish things with much less code. Finally, DOH utilizes a few coding tricks that allow it to perform a limited form of function overloading for certain C datatypes (more on that a little later).

    The key point to using DOH is that instead of thinking about code in terms of highly specialized C data structures, just about everything ends up being represented in terms of a just a few datatypes. For example, structures are replaced by DOH hash tables whereas arrays are replaced by DOH lists. At first, this is probably a little strange to most C/C++ programmers, but in the long run in makes the system extremely flexible and highly extensible. Also, in terms of coding, many of the newly DOH-based subsystems are less than half the size (in lines of code) of the earlier C++ implementation.

    2.2 Basic Types

    The following built-in types are currently provided by DOH:
    • String. A string of characters with automatic memory management and high-level operations such as string replacement. In addition, strings support file I/O operations that make it possible to use them just about anyplace a file can be used.

    • List. A list of arbitrary DOH objects (of possibly mixed types).

    • Hash. A hash table that maps a set of string keys to a set of arbitrary DOH objects. The DOH version of an associative array for all of you Perl fans.

    • File. A DOH wrapper around the C FILE * structure. This is provided since other objects sometimes want to behave like files (strings for instance).

    • Void. A DOH wrapper around an arbitrary C pointer. This can be used if you want to place arbitrary C data structures in DOH lists and hash tables.
    Due to dynamic typing, all of the objects in DOH are represented by pointers of type DOH *. Furthermore, all objects are completely opaque--that means that the only way to access the internals of an object is through a well-defined public API. For convenience, the following symbolic names are sometimes used to improve readability:
    • DOHString *. A String object.
    • DOHList *. A list object.
    • DOHHash *. A hash object.
    • DOHFile *. A file object.
    • DOHVoid *. A void object.
    • DOHString_or_char *. A DOH String object or a raw C "char *".
    It should be stressed that all of these names are merely symbolic aliases to the type DOH * and that no compile-time type checking is performed (of course, a runtime error may occur if you screw up).

    2.3 Creating, Copying, and Destroying Objects

    The following functions can be used to create new DOH objects
    • NewString(DOHString_or_char *value)
      Create a new string object with contents initially set to value. value can be either a C string or a DOH string object.

    • NewStringf(char *fmt, ...)
      Create a new string object with contents initially set to a formatted string. Think of this as being sprintf() combined with an object constructor.

    • NewList()
      Create a new list object that is initially empty.

    • NewHash()
      Create a new hash object that is initially empty.

    • NewFile(DOHString_or_char *filename, char *mode)
      Open a file and return a file object. This is a wrapper around the C fopen() library call.

    • NewFileFromFile(FILE *f)
      Create a new file object given an already opened FILE * object.

    • NewVoid(void *obj, void (*del)(void *))
      Create a new DOH object that is a wrapper around an arbitrary C pointer. del is an optional destructor function that will be called when the object is destroyed.
    Any object can be copied using the Copy() function. For example:
    DOH *a, *b, *c, *d;
    a = NewString("Hello World");
    b = NewList();
    c = Copy(a);         /* Copy the string a */
    d = Copy(b);         /* Copy the list b */
    
    Copies of lists and hash tables are shallow. That is, their contents are only copied by reference.

    Objects can be deleted using the Delete() function. For example:

    DOH *a = NewString("Hello World");
    ...
    Delete(a);              /* Destroy a */
    
    All objects are referenced counted and given a reference count of 1 when initially created. The Delete() function only destroys an object when the reference count reaches zero. When an object is placed in a list or hash table, its reference count is automatically increased. For example:
    DOH *a, *b;
    a = NewString("Hello World");
    b = NewList();
    Append(b,a);         /* Increases refcnt of a to 2 */
    Delete(a);           /* Decreases refcnt of a to 1 */
    Delete(b);           /* Destroys b, and destroys a */
    
    Should it ever be necessary to manually increase the reference count of an object, the DohIncref() function can be used:
    DOH *a = NewString("Hello");
    DohIncref(a);
    

    2.4 A Word About Mutability and Copying

    All DOH objects are mutable regardless of their current reference count. For example, if you create a string and then create a 1000 references to it (in lists and hash tables), changes to the string will be reflected in all of the references. Therefore, if you need to make any kind of local change, you should first make a copy using the Copy() function. Caveat: when copying lists and hash tables, elements are copied by reference.

    2.5 Strings

    The DOH String type is perhaps the most flexible object. First, it supports a variety of string-oriented operations. Second, it supports many of the same operations as lists. Finally, strings provide file I/O operations that allow them to be used interchangeably with DOH file objects. [ TODO ]

    2.6 Lists

    Example usage of lists:

    /* Create and populate */
    List *list = NewList();
    Append(list, NewString("listval1"));
    Append(list, NewString("listval2"));
    Append(list, NewString("listval3"));
    Append(list, NewString("listval4"));
    Append(list, NewString("listval5"));
    
    /* Size */
    Printf(stdout, "list len: %d\n", Len(list));
    
    /* Delete */
    Delitem(list, 3);
    
    /* Replace */
    Setitem(list, 0, NewString("newlistval1"));
    
    /* Get */
    String *item = Getitem(list,1);
    if (item)
      Printf(stdout, "get: %s\n", item);
    else
      Printf(stdout, "get: [non-existent]\n");
    
    /* Iterate through the container */
    int len = Len(list);
    for (int i=0; i<len; i++) {
      String *item = Getitem(list,i);
      Printf(stdout, "list item: %s\n", item);
    }
    

    Resulting output:

    hash len: 5
    get: hashval2
    hash item: hashval5 [h5]
    hash item: hashval1 [h1]
    hash item: hashval2 [h2]
    hash item: hashval3 [h3]
    

    2.7 Hash tables

    Example usage of hash tables:

    /* Create and populate */
    Hash *hash = NewHash();
    Setattr(hash, "h1", NewString("hashval1"));
    Setattr(hash, "h2", NewString("hashval2"));
    Setattr(hash, "h3", NewString("hashval3"));
    Setattr(hash, "h4", NewString("hashval4"));
    Setattr(hash, "h5", NewString("hashval5"));
    
    /* Size */
    Printf(stdout, "hash len: %d\n", Len(hash));
    
    /* Delete */
    Delattr(hash, "h4");
    
    /* Get */
    String *item = Getattr(hash, "h2");
    if (item)
      Printf(stdout, "get: %s\n", item);
    else
      Printf(stdout, "get: [non-existent]\n");
    
    /* Iterate through the container */
    Iterator it;
    for (it = First(hash); it.key; it= Next(it))
      Printf(stdout, "hash item: %s [%s]\n", (it.item), (it.key));
    

    Resulting output:

    list len: 5
    get: listval2
    list item: newlistval1
    list item: listval2
    list item: listval3
    list item: listval5
    

    2.8 Files

    [ TODO ]

    2.9 Void objects

    [ TODO ]

    2.10 Utility functions

    [ TODO ]

    3. Types and Typemaps

    The representation and manipulation of types is currently in the process of being reorganized and (hopefully) simplified. The following list describes the current set of functions that are used to manipulate datatypes.

    • SwigType_str(SwigType *t, char *name).
      This function produces the exact string representation of the datatype t. name is an optional parameter that specifies a declaration name. This is used when dealing with more complicated datatypes such as arrays and pointers to functions where the output might look something like "int (*name)(int, double)".

    • SwigType_lstr(SwigType *t, char *name).
      This function produces a string representation of a datatype that can be safely be assigned a value (i.e., can be used as the "lvalue" of an expression). To do this, qualifiers such as "const", arrays, and references are stripped away or converted into pointers. For example:
      Original Datatype              lstr()
      ------------------             --------
      const char *a                  char *a
      double a[20]                   double *a
      double a[20][30]               double *a
      double &a                      double *a
      
      The intent of the lstr() function is to produce local variables inside wrapper functions--all of which must be reassignable types since they are the targets of conversions from a scripting representation.

    • SwigType_rcaststr(SwigType *t, char *name).
      This function produces a string that casts a type produced by the lstr() function to the type produced by the str() function. You might view it as the inverse of lstr(). This function only produces output when it needs to (when str() and lstr() produce different results). Furthermore, an optional name can be supplied when the cast is to be applied to a specific name. Examples:
      Original Datatype             rcaststr()
      ------------------            ---------
      char *a                       
      const char *a                 (const char *) name
      double a[20]                  (double *) name
      double a[20][30]              (double (*)[30]) name
      double &a                     (double &) *name
      

    • SwigType_lcaststr(SwigType *t, char *name).
      This function produces a string that casts a type produced by the str() function to the type produced by the lstr() function. This function only produces output when it needs to (when str() and lstr() produce different results). Furthermore, an optional name can be supplied when the cast is to be applied to a specific name.
      Original Datatype             lcaststr()
      ------------------            ---------
      char *a                       
      const char *a                 (char *) name
      double a[20]                  (double *) name
      double a[20][30]              (double *) name
      double &a                     (double *) &name
      

    • SwigType_manglestr(SwigType *t).
      Produces a type-string that is used to identify this datatype in the target scripting language. Usually this string looks something like "_p_p_double" although the target language may redefine the output for its own purposes. Normally this function strips all qualifiers, references, and arrays---producing a mangled version of the type produced by the lstr() function.
    The following example illustrates the intended use of the above functions when creating wrapper functions using shorthand pseudocode. Suppose you had a function like this:
    int foo(int a, double b[20][30], const char *c, double &d);
    
    Here's how a wrapper function would be generated using the type generation functions above:
    wrapper_foo() {
       lstr("int","result")
       lstr("int","arg0")
       lstr("double [20][30]", "arg1")
       lstr("const char *", "arg2")
       lstr("double &", "arg3")
       ...
       get arguments
       ...
       result = (lcaststr("int"))  foo(rcaststr("int","arg0"),
                                   rcaststr("double [20][30]","arg1"),
                                   rcaststr("const char *", "arg2"),
                                   rcaststr("double &", "arg3"))
       ...
    }
    
    Here's how it would look with the corresponding output filled in:
    wrapper_foo() {
       int      result;
       int      arg0;
       double  *arg1;
       char    *arg2;
       double  *arg3;
       ...
       get arguments
       ...
       result = (int) foo(arg0,
                          (double (*)[30]) arg1,
                          (const char *) arg2,
                          (double &) *arg3);
       ...
    }
    
    Notes:
    • For convenience, the string generation functions return a "char *" that points to statically allocated memory living inside the type library. Therefore, it is never necessary (and it's an error) to free the pointer returned by the functions. Also, if you need to save the result, you should make a copy of it. However, with that said, it is probably worth nothing that these functions do cache the last 8 results. Therefore, it's fairly safe to make a handful of repeated calls without making any copies.
    [TODO]

    4. Parsing

    [TODO]

    5. The C/C++ Wrapping Layer

    Added: Dave Beazley (July 22, 2000)

    When SWIG generates wrappers, it tries to provide a mostly seamless integration with the original code. However, there are a number of problematic features of C/C++ programs that complicate this interface.

    • Passing and returning structures by value. When used, SWIG converts all pass-by-value functions into wrappers that pass by reference. For example:
      double dot_product(Vector a, Vector b);
      
      gets turned into a wrapper like this:
      double wrap_dot_product(Vector *a, Vector *b) {
           return dot_product(*a,*b);
      }
      
      Functions that return by value require a memory allocation to store the result. For example:
      Vector cross_product(Vector *a, Vector *b);
      
      become
      Vector *wrap_cross_product(Vector *a, Vector *b) {
         Vector *result = (Vector *) malloc(sizeof(Vector));
         *result = cross_product(a,b);
         return result;
      }
      
      Note: If C++ is being wrapped, the default copy constructor is used instead of malloc() to create a copy of the return result.

    • C++ references. C++ references are handled exactly the same as pass/return by value except that a memory allocation is not made for functions that return a reference.

    • Qualifiers such as "const" and "volatile". SWIG strips all qualifiers from the interface presented to the target language. Besides, what in the heck is "const" in Perl anyways?

    • Instance Methods. Method invocations are handled as a function call in which a pointer to the object (the "this" pointer) appears as the first argument. For example, in the following class:
      class Foo {
      public:
          double bar(double);
      };
      
      The "bar" method is wrapped by a function like this:
      double Foo_bar(Foo *self, double arg0) {
         return self->bar(arg0);
      }
      

    • Structure/class data members. Data members are handled by creating a pair of wrapper functions that set and get the value respectively. For example:
      struct Foo {
          int x;
      };
      
      gets wrapped as follows:
      int Foo_x_get(Foo *self) {
          return self->x;
      }
      int Foo_x_set(Foo *self, int value) {
          return (self->x = value);
      }
      

    • Constructors. Constructors for C/C++ data structures are wrapped by a function like this:
      Foo *new_Foo() {
          return new Foo;
      }
      
      Note: For C, new objects are created using the calloc() function.

    • Destructors. Destructors for C/C++ data structures are wrapper like this:
      void delete_Foo(Foo *self) {
          delete self;
      }
      
      Note: For C, objects are destroyed using free().
    The creation of wrappers and various type transformations are handled by a collection of functions found in the file Source/Swig/cwrap.c.
    • char *Swig_clocal(DataType *t, char *name, char *value)
      This function creates a string containing the declaration of a local variable with type t, name name, and default value value. This local variable is stripped of all qualifiers and will be a pointer if the type is a reference or user defined type.

    • DataType *Swig_clocal_type(DataType *t)
      Returns a type object corresponding to the type string produced by the Swig_clocal() function.

    • char *Swig_clocal_deref(DataType *t, char *name)
      This function is the inverse of the clocal() function. Given a type and a name, it produces a string containing the code needed to cast/convert the type produced by Swig_clocal() back into its original type.

    • char *Swig_clocal_assign(DataType *t, char *name)
      Given a type and name, this produces a string containing the code (and an optional cast) needed to make an assignment from the real datatype to the local datatype produced by Swig_clocal(). Kind of the opposite of deref().

    • int Swig_cargs(Wrapper *w, ParmList *l)
      Given a wrapper function object and a list of parameters, this function declares a set of local variables for holding all of the parameter values (using Swig_clocal()). Returns the number of parameters. In addition, this function sets the local name of each parameter which can be retrieved using the Parm_Getlname() function.

    • void Swig_cresult(Wrapper *w, DataType *t, char *resultname, char *decl)
      Generates the code needed to set the result of a wrapper function and performs all of the needed memory allocations for ANSI C (if necessary). t is the type of the result, resultname is the name of the result variable, and decl is a string that contains the C code which produces the result.

    • void Swig_cppresult(Wrapper *w, DataType *t, char *resultname, char *decl)
      Generates the code needed to set the result of a wrapper function and performs all of the needed memory allocations for C++ (if necessary). t is the type of the result, resultname is the name of the result variable, and decl is a string that contains the C code which produces the result.

    • Wrapper *Swig_cfunction_wrapper(char *fname, DataType *rtype, ParmList *parms, char *code)
      Create a wrapper around a normal function declaration. fname is the name of the wrapper, rtype is the return type, parms are the function parameters, and code is a string containing the code in the function body.

    • Wrapper *Swig_cmethod_wrapper(char *classname, char *methodname, DataType *rtype, DataType *parms, char *code)

    • char *Swig_cfunction_call(char *name, ParmList *parms) This function produces a string containing the code needed to call a C function. The string that is produced contains all of the transformations needed to convert pass-by-value into pass-by-reference as well as handle C++ references. Produces a string like "name(arg0, arg1, ..., argn)".
    Here is a short example showing how these functions could be used. Suppose you had a C function like this:
    double dot_product(Vector a, Vector b);
    
    Here's how you might write a really simple wrapper function
    ParmList *l = ... parameter list of the function ...
    DataType *t = ... return type of the function ...
    char     *name = ... name of the function ...
    Wrapper *w = NewWrapper();
    Printf(w->def,"void wrap_%s() {\n", name);
    
    /* Declare all of the local variables */
    Swig_cargs(w, l);
    
    /* Convert all of the arguments */
    ...
    
    /* Make the function call and declare the result variable */
    Swig_cresult(w,t,"result",Swig_cfunction(name,l));
    
    /* Convert the result into whatever */
    ...
    
    Printf(w->code,"}\n");
    Wrapper_print(w,out);
    
    The output of this would appear as follows:
    void wrap_dot_product() {
        Vector *arg0;
        Vector *arg1;
        double  result;
    
        ...
        result = dot_product(*arg0, *arg1);
        ...
    }
    
    Notice that the Swig_cargs(), Swig_cresult(), and Swig_cfunction() functions have taken care of the type conversions for the Vector type automatically.

    Notes:

    • The intent of these functions is to provide consistent handling of function parameters and return values so that language module writers don't have to worry about it too much.

    • These functions may be superseded by features in the new typemap system which provide hooks for specifying local variable declarations and argument conversions.

    6. Symbol Naming Guidelines for Generated C/C++ Code

    The C++ standard (ISO/IEC 14882:1998(E)) states:
    
    17.4.3.1.2 Global names [lib.global.names]
    
    1 Certain sets of names and function signatures are always reserved to the implementation:
    
        * Each name that contains a double underscore (__) or begins with an underscore followed 
          by an upper case letter (2.11) is reserved to the implementation for any use.
        * Each name that begins with an underscore is reserved to the implementation for use as 
          a name in the global namespace.165)
    
        165) Such names are also reserved in namespace ::std (17.4.3.1). [back to text] 
    
    
    When generating code it is important not to generate symbols that might clash with the code being wrapped. It is tempting to flout the standard or just use a symbol which starts with a single underscore followed by a lowercase letter in order to avoid name clashes. However even these legal symbols can also clash with symbols being wrapped. The following guidelines should be used when generating code in order to meet the standard and make it highly unlikely that symbol clashes will occur:

    For C++ code that doesn't attempt to mangle a symbol being wrapped (for example SWIG convenience functions):

    • Put symbols in the Swig namespace, for example class Swig::Director. Qualify using the Swig namespace whenever the symbol is referenced, even within the Swig namespace, for example new Swig::Director() not new Director().
    • Use swig_ as a prefix for all member variables and member functions that are involved in an inheritance chain with wrapped classes, for example Swig::Director::swig_get_up() and bool Swig::Director::swig_up.
    • Alternatively class names can be prefixed with Swig in the global namespace for example template<class T> class SwigValueWrapper.

    For code compiled as C or C++ that doesn't attempt to mangle a symbol being wrapped (for example SWIG convenience functions):

    • Use SWIG_ as a prefix for structures for example SWIG_JavaExceptions_t.
    • Use SWIG_ as a prefix for global functions for example SWIG_TypeRegister.
    • Use SWIG_ as a prefix for macros for example #define SWIG_PY_INT 1
    For code compiled as C or C++ that attempts to mangle a wrapped symbol:
    • Use SWIGxxx or Swigxxx as a prefix where xxx is chosen which would make SWIGxxx/Swigxxx a unique symbol in the global namespace, for example class SwigDirectorFoo when wrapping class Foo. Don't use a trailing underscore for the prefix as this may generate a double underscore when wrapping a symbol which starts with a single underscore.
    In the past SWIG has generated many symbols which flout the standard especially double underscores. In fact they may not all be rooted out yet, so please fix them when you see them.

    7. Debugging SWIG

    The DOH types used in the SWIG source code are all typedefined to void. Consequently, it is impossible for debuggers to automatically extract any information about DOH objects. The easiest approach to debugging and viewing the contents of DOH objects is to make a call into one of the family of SWIG print functions from the debugger. The "Debugging Functions" section in SWIG Parse Tree Handling lists them. It is sometimes easier to debug by placing a few calls to these functions in code of interest and recompile, especially if your debugger cannot easily make calls into functions within a debugged binary.

    The SWIG distribution comes with some additional support for the gdb debugger in the Tools/swig.gdb file. Follow the instructions in this file for 'installing'. This support file provides an easy way to call into some of the family of SWIG print functions via additional user-defined gdb commands. Some usage of the swigprint and locswigprint user-defined commands are demonstrated below.

    More often than not, a parse tree node needs to be examined. The session below displays the node n in one of the Java language module wrapper functions. The swigprint method is used to show the symbol name (symname - a DOH String type) and the node (n - a DOH Hash type).

    Breakpoint 1, JAVA::functionWrapper (this=0x97ea5f0, n=0xb7d2afc8) at Modules/java.cxx:799
    799	    String *symname = Getattr(n, "sym:name");
    (gdb) next
    800	    SwigType *t = Getattr(n, "type");
    (gdb) swigprint symname
    Shape_x_set
    (gdb) swigprint n
    Hash(0xb7d2afc8) {
      'membervariableHandler:view' : variableHandler, 
      'feature:except' : 0, 
      'name' : x, 
      'ismember' : 1, 
      'sym:symtab' : Hash(0xb7d2aca8) {......}, 
      'nodeType' : cdecl, 
      'nextSibling' : Hash(0xb7d2af98) {.............}, 
      'kind' : variable, 
      'variableHandler:feature:immutable' : <Object 'VoidObj' at 0xb7cfa008>, 
      'sym:name' : Shape_x_set, 
      'view' : membervariableHandler, 
      'membervariableHandler:sym:name' : x, 
      'membervariableHandler:type' : double, 
      'membervariableHandler:parms' : <Object 'VoidObj' at 0xb7cfa008>, 
      'parentNode' : Hash(0xb7d2abc8) {..............................}, 
      'feature:java:enum' : typesafe, 
      'access' : public, 
      'parms' : Hash(0xb7cb9408) {......}, 
      'wrap:action' : if (arg1) (arg1)->x = arg2;, 
      'type' : void, 
      'memberset' : 1, 
      'sym:overname' : __SWIG_0, 
      'membervariableHandler:name' : x, 
    }
    

    Note that all the attributes in the Hash are shown, including the 'sym:name' attribute which was assigned to the symname variable.

    Hash types can be shown either expanded or collapsed. When a Hash is shown expanded, all the attributes are displayed along with their values, otherwise a '.' replaces each attribute when collapsed. Therefore a count of the dots provides the number of attributes within an unexpanded Hash. Below shows the 'parms' Hash being displayed with the default Hash expansion of 1, then with 2 provided as the second argument to swigprint to expand to two Hash levels in order to view the contents of the collapsed 'nextSibling' Hash.

    (gdb) swigprint 0xb7cb9408
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {...}, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }
    (gdb) swigprint 0xb7cb9408 2
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {
        'name' : x, 
        'type' : double, 
        'nodeType' : parm, 
      }, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }
    

    The same Hash can also be displayed with file and line location information via the locswigprint command.

    (gdb) locswigprint 0xb7cb9408
    example.h:11: [Hash(0xb7cb9408) {
    Hash(0xb7cb9408) {
      'name' : self, 
      'type' : p.Shape, 
      'self' : 1, 
      'nextSibling' : Hash(0xb7cb9498) {...}, 
      'hidden' : 1, 
      'nodeType' : parm, 
    }]
    

    Tip: Commands in gdb can be shortened with whatever makes them unique and can be command completed with the tab key. Thus swigprint can usually be shortened to sw and locswigprint to loc. The help for each command can also be obtained within the debugging session, for example, 'help swigprint'.

    The sub-section below gives pointers for debugging DOH objects using casts and provides an insight into why it can be hard to debug SWIG without the family of print functions.

    7.1 Debugging DOH Types The Hard Way

    The DOH types used in SWIG are all typedefined to void and hence the lack of type information for inspecting types within a debugger. Most debuggers will however be able to display useful variable information when an object is cast to the appropriate type. Getting at the underlying C string within DOH types is cumbersome, but possible with appropriate casts. The casts below can be used in a debugger windows, but be sure to compile with compiler optimisations turned off before attempting the casts else they are unlikely to work. Even displaying the underlying string in a String * doesn't work straight off in all debuggers due to the multiple definitions of String as a struct and a void.

    Below are a list of common SWIG types. With each is the cast that can be used in the debugger to extract the underlying type information and the underlying char * string.

    • String *s;
    • (struct String *)((DohBase *)s)->data
      The underlying char * string can be displayed with
      (*(struct String *)(((DohBase *)s)->data)).str

    • SwigType *t;
    • (struct String *)((DohBase *)t)->data
      The underlying char * string can be displayed with
      (*(struct String *)(((DohBase *)t)->data)).str

    • const_String_or_char_ptr sc;
    • Either
      (*(struct String *)(((DohBase *)sc)->data)).str
      or
      (char *)sc
      will work depending on whether the underlying type is really a String * or char *.

    7.2 Debugging DOH memory allocation problems

    The DOH objects are reference counted and use pools for memory allocation. The implementation is in memory.c. When there are memory corruption problems, various memory allocator tools are normally used to diagnose problems. These can be used on SWIG and can be very useful. However, they won't necessarily find use of stale DOH objects, that is, DOH objects that are used after they have been deleted. This is because the DOH memory allocator grabs a chunk of memory from the C memory allocator and manages the usage internally. Stale DOH object usage can be checked for by defining DOH_DEBUG_MEMORY_POOLS in memory.c. If an attempt to use an object is made after the reference count is zero, an assertion is triggered instead of quietly re-using the stale object...

    swig: DOH/memory.c:91: DohCheck: Assertion `!DOH_object_already_deleted' failed.
    

    This can be memory intensive as previously used memory in the pool is not re-used so is only recommended for diagnosing memory corruption problems.


    Copyright (C) 1999-2010 SWIG Development Team. swig-3.0.12/Doc/Devel/migrate.txt0000664000175000017500000001122713042756442016375 0ustar williamwilliamSWIG1.3 Migration Guide (The not entirely complete guide to updating language modules to work with SWIG1.3). Dave Beazley August 15, 2000 1. Introduction --------------- Virtually all of SWIG's internal data structures have now been rewritten. Take everything you thought you knew about SWIG1.1 and throw it out. 2. DataTypes ------------ The old 'DataType' data structure is gone. Therefore, direct manipulation of 'is_pointer', 'implicit_ptr', and 'arraystr' attributes no longer applies. Sorry. Datatypes are now represented by the type 'SwigType' which has no public attributes. Actually, if you look at it closely, 'SwigType' is really just an alias for 'void' and if you look at it even closer than that you will realize that it's nothing more than a string! The string encoding of types is described in more detail in the file Source/Swig/stype.c and is not so important here. What is important is the functions used to produce various types of output: SwigType_str(type,name = 0); This produces an exact C representation of the datatype with all qualifiers, arrays, references, and so forth. name is an optional name that is given if you wanted to associate the type with a parameter name or something. SwigType_lstr(type,name = 0); This function takes a type and produces a C string containing a type suitable for assignment (appearing as an lvalue in an expression). To do this, certain things such as 'const', arrays, and references are stripped away or converted into pointers. SwigType_ltype(type); Returns a SwigType object corresponding to the type created by SwigType_lstr(). SwigType_lcaststr(type,name); Produces a string casting a value 'name' from the real datatype to the assignable type created by SwigType_lstr(). SwigType_rcaststr(type,name) Produces a string that casts a value 'name' from the type created by SwigType_lstr() to the real datatype. SwigType_manglestr(type) Produces the 'mangled' version of a datatype. Getting the 'type' code. Most language modules still operate by looking at special integer type codes. This interface is a little ragged and will probably go away at some point. However, for now the following function can be used to get the type code: int SwigType_type(type) The codes are the same as the before, except that there are a few special codes: T_STRING - The 'char *' type and variations. T_POINTER - Any pointer type (not char * though) T_REFERENCE - Any C++ reference T_ARRAY - Any array T_FUNCTION - A function (this is usually an error). Because of the special codes, it is no longer necessary to have code like this: if ((t->is_pointer == 1) and (t->type == T_CHAR)) { ... get a string ... } Instead, just use the type code above like this: switch(SwigType_type(type)) { case T_STRING: ... get a string ... break; case T_POINTER: ... get a pointer ... break; } There are about 2-dozen type manipulation functions that could also be useful. See Source/Swig/swig.h and Source/Swig/stype.c. 3. Parameter Lists ------------------ The ParmList data structure is gone. In reality, parameter lists are nothing more than a linked list of parameters. The proper way to iterate over this list and get parameter values is as follows: ParmList *l; Parm *p; for (p = l; p; p = Getnext(p)) { SwigType *pt = Gettype(p); /* Get parameter type */ String *pn = Getname(p); /* Get parameter name */ String *value = Getvalue(p); /* Get parameter value */ ... do whatever ... } 4. Typemaps ----------- Typemaps more or less work. However, the interface has changed slightly. Instead of typemap_lookup("in","python",type,pname,"$source","$target",wrapper); the function is Swig_typemap_lookup("in",type,pname,"$source","$target",wrapper); There are a variety of other changes to typemaps (see CHANGES). 5. Use of new types ------------------- When possible, language modules should try to use the built in String, List, and Hash objects instead of C arrays or 'char *'. This will probably require a detailed pass through the code with an eye towards cleanup. 6. Miscellaneous ---------------- Language modules no longer need to concern themselves with formatting the wrapper code they produce (provided you are using the special Wrapper object). The function Wrapper_print() passes everything through a pretty-printer that automatically performs indentation and tries to clean things up. This especially works well when there are lots of typemaps. swig-3.0.12/Doc/Devel/scanner.html0000664000175000017500000002420113042756442016517 0ustar williamwilliam SWIG C Scanner

    SWIG C/C++ Scanning

    David M. Beazley
    dave-swig@dabeaz.com
    January 11, 2007

    Introduction

    This document describes functions that can be used to tokenize C/C++ input text. These functions are relatively low-level and are meant to be used in the implementation of scanners that can be plugged into yacc or used for other purposes. For instance, the preprocessor uses these functions to evaluate and test constant expressions.

    All of these functions are declared in Source/Swig/swigscan.h. This API is considered to be stable.

    Creation and Deletion of Scanners

    The following functions are used to create and destroy a scanner object. More than one scanner object can be created and used as necessary.

    Scanner *NewScanner()

    Creates a new scanner object. The scanner contains initially contains no text. To feed text to the scanner use Scanner_push().

    Scanner *DelScanner()

    Deletes a scanner object.

    Scanner Functions

    void Scanner_clear(Scanner *s)

    Clears all text from the scanner. This can be used to reset a scanner to its initial state, ready to receive new input text.

    void Scanner_push(Scanner *s, String *text)

    Pushes an input string into the scanner. Subsequent tokens will be returned from the new string. If the scanner is already processing a string, the pushed string takes precedence--in effect, interrupting the scanning of the previous string. This behavior is used to implement certain SWIG features such as the %inline directive. Once the pushed string has been completely scanned, the scanner will return to scanning the previous string (if any). The scanning of text relies upon the DOH file interface to strings (Getc(), Ungetc(), etc.). Prior to calling this function, the input string should be set so that its file pointer is in the location where you want scanning to begin. You may have to use Seek() to set the file pointer back to the beginning of a string prior to using this function.

    void Scanner_pushtoken(Scanner *s, int tokvalue, String_or_char *val)

    Pushes a token into the scanner. This exact token will be returned by the next call to Scanner_token(). tokvalue is the integer token value to return and val is the token text to return. This function is only used to handle very special parsing cases. For instance, if you need the scanner to return a fictitious token into order to enter a special parsing case.

    int Scanner_token(Scanner *s)

    Returns the next token. An integer token code is returned (see table below) on success. If no more input text is available 0 is returned. If a scanning error occurred, -1 is returned. In this case, error information can be obtained using Scanner_errinfo().

    String *Scanner_text(Scanner *s)

    Returns the scanned text corresponding to the last token returned by Scanner_token(). The returned string is only valid until the next call to Scanner_token(). If you need to save it, make a copy.

    void Scanner_skip_line(Scanner *s)

    Skips to the end of the current line. The text skipped can be obtained using Scanner_text() afterwards.

    void Scanner_skip_balanced(Scanner *s, int startchar, int endchar)

    Skips to the end of a block of text denoted by starting and ending characters. For example, { and }. The function is smart about how it skips text. String literals and comments are ignored. The function also is aware of nesting. The skipped text can be obtained using Scanner_text() afterwards. Returns 0 on success, -1 if no matching endchar could be found.

    void Scanner_set_location(Scanner *s, int startchar, int endchar)

    Changes the current filename and line number of the scanner.

    String *Scanner_file(Scanner *s)

    Gets the current filename associated with text in the scanner.

    int Scanner_line(Scanner *s)

    Gets the current line number associated with text in the scanner.

    int Scanner_start_line(Scanner *s)

    Gets the starting line number of the last token returned by the scanner.

    void Scanner_idstart(Scanner *s, char *idchar)

    Sets additional characters (other than the C default) that may be used to start C identifiers. idchar is a string containing the characters (e.g., "%@"). The purpose of this function is to up special keywords such as "%module" or "@directive" as simple identifiers.

    String *Scanner_errmsg(Scanner *s)

    Returns the error message associated with the last scanner error (if any). This will only return a meaningful result if Scanner_token() returned -1.

    int Scanner_errline(Scanner *s)

    Returns the line number associated with the last scanner error (if any). This will only return a meaningful result if Scanner_token() returned -1. The line number usually corresponds to the starting line number of a particular token (e.g., for unterminated strings, comments, etc.).

    int Scanner_isoperator(int tokval)

    A convenience function that returns 0 or 1 depending on whether tokval is a valid C/C++ operator (i.e., a candidate for operator overloading).

    void Scanner_freeze_line(int val)

    Freezes the current line number depending upon whether or not val is 1 or 0. When the line number is frozen, newline characters will not result in updates to the line number. This is sometimes useful in tracking line numbers through complicated macro expansions.

    Token Codes

    The following table shows token codes returned by the scanner. These are integer codes returned by the Scanner_token() function.
    Token code                   C Token
    -------------------------    -------------
    SWIG_TOKEN_LPAREN            (
    SWIG_TOKEN_RPAREN            )
    SWIG_TOKEN_SEMI              ; 
    SWIG_TOKEN_COMMA             , 
    SWIG_TOKEN_STAR              * 
    SWIG_TOKEN_TIMES             *
    SWIG_TOKEN_LBRACE            { 
    SWIG_TOKEN_RBRACE            } 
    SWIG_TOKEN_EQUAL             = 
    SWIG_TOKEN_EQUALTO           == 
    SWIG_TOKEN_NOTEQUAL          != 
    SWIG_TOKEN_PLUS              + 
    SWIG_TOKEN_MINUS             - 
    SWIG_TOKEN_AND               & 
    SWIG_TOKEN_LAND              && 
    SWIG_TOKEN_OR                | 
    SWIG_TOKEN_LOR               || 
    SWIG_TOKEN_XOR               ^ 
    SWIG_TOKEN_LESSTHAN          < 
    SWIG_TOKEN_GREATERTHAN       > 
    SWIG_TOKEN_LTEQUAL           <= 
    SWIG_TOKEN_GTEQUAL           >= 
    SWIG_TOKEN_NOT               ~ 
    SWIG_TOKEN_LNOT              ! 
    SWIG_TOKEN_LBRACKET          [ 
    SWIG_TOKEN_RBRACKET          ] 
    SWIG_TOKEN_SLASH             / 
    SWIG_TOKEN_DIVIDE            /
    SWIG_TOKEN_BACKSLASH         \ 
    SWIG_TOKEN_POUND             # 
    SWIG_TOKEN_PERCENT           % 
    SWIG_TOKEN_MODULO            %
    SWIG_TOKEN_COLON             : 
    SWIG_TOKEN_DCOLON            :: 
    SWIG_TOKEN_DCOLONSTAR        ::*
    SWIG_TOKEN_LSHIFT            << 
    SWIG_TOKEN_RSHIFT            >> 
    SWIG_TOKEN_QUESTION          ? 
    SWIG_TOKEN_PLUSPLUS          ++ 
    SWIG_TOKEN_MINUSMINUS        -- 
    SWIG_TOKEN_PLUSEQUAL         += 
    SWIG_TOKEN_MINUSEQUAL        -= 
    SWIG_TOKEN_TIMESEQUAL        *= 
    SWIG_TOKEN_DIVEQUAL          /= 
    SWIG_TOKEN_ANDEQUAL          &= 
    SWIG_TOKEN_OREQUAL           |= 
    SWIG_TOKEN_XOREQUAL          ^= 
    SWIG_TOKEN_LSEQUAL           <<= 
    SWIG_TOKEN_RSEQUAL           >>= 
    SWIG_TOKEN_MODEQUAL          %= 
    SWIG_TOKEN_ARROW             -> 
    SWIG_TOKEN_ARROWSTAR         ->* 
    SWIG_TOKEN_PERIOD            . 
    SWIG_TOKEN_AT                @ 
    SWIG_TOKEN_DOLLAR            $ 
    SWIG_TOKEN_ENDLINE           Literal newline
    SWIG_TOKEN_ID                identifier 
    SWIG_TOKEN_FLOAT             Floating point with F suffix (e.g., 3.1415F)
    SWIG_TOKEN_DOUBLE            Floating point (e.g., 3.1415 )
    SWIG_TOKEN_INT               Integer (e.g., 314)
    SWIG_TOKEN_UINT              Unsigned integer (e.g., 314U)
    SWIG_TOKEN_LONG              Long integer (e.g., 314L) 
    SWIG_TOKEN_ULONG             Unsigned long integer (e.g., 314UL)
    SWIG_TOKEN_LONGLONG          Long long integer (e.g., 314LL )
    SWIG_TOKEN_ULONGLONG         Unsigned long long integer (e.g., 314ULL) 
    SWIG_TOKEN_CHAR              Character literal in single quotes ('c')
    SWIG_TOKEN_STRING            String literal in double quotes ("str")
    SWIG_TOKEN_RSTRING           Reverse quote string (`str`)
    SWIG_TOKEN_CODEBLOCK         SWIG code literal block %{ ... %}
    SWIG_TOKEN_COMMENT           C or C++ comment  (// or /* ... */)
    SWIG_TOKEN_ILLEGAL           Illegal character
    
    Notes
    • When more than one token code exist for the same token text, those codes are identical (e.g., SWIG_TOKEN_STAR and SWIG_TOKEN_TIMES).

    • String literals are returned in their exact representation in which escape codes (if any) have been interpreted.

    • All C identifiers and keywords are simply returned as SWIG_TOKEN_ID. To check for specific keywords, you will need to add extra checking on the returned text.

    • C and C++ comments include the comment starting and ending text (e.g., "//", "/*").

    • The maximum token integer value is found in the constant SWIG_MAXTOKENS. This can be used if you wanted to create an array or table for the purposes of remapping tokens to a different set of codes. For instance, if you are using these functions to write a yacc-compatible lexer.
    swig-3.0.12/Doc/Devel/parm.html0000664000175000017500000000507613042756442016036 0ustar williamwilliam SWIG Parameter Handling

    SWIG Parameter Handling

    David M. Beazley
    dave-swig@dabeaz.com
    January 9, 2007

    Introduction

    This document describes the functions related to management of function parameters and parameter lists in the SWIG core. These functions are declared in Source/Swig/swigparm.h. This API is considered to be stable.

    Parameters

    The following utility functions are used to create and copy individual parameters. In their most basic form, a parameter merely contains a type, a name, and an optional default value.

    Parm *NewParm(SwigType *type, const String_or_char *name)

    Creates a new parameter object with type type and name name. The type is stored in the attribute "type" and the name is stored in the attribute "name".

    Parm *CopyParm(Parm *p)

    Copies a parameter object. All string attributes are copied in the process of making the copy. However, no complex attributes (lists, hashes, etc.) are copied.

    Parameter Lists

    ParmList *CopyParmList(ParmList *p)

    Creates a copy of a parameter list. A parameter list is merely a linked list of parameters created by NewParm().

    ParmList *CopyParmListMax(ParmList *p, int count)

    Copies at most count parameters from the parameter list p.

    int ParmList_len(ParmList *p)

    Returns the total number of parameters in a parameter list.

    int ParmList_numrequired(ParmList *p)

    Returns the number of required parameters in a parameter list. This pertains to invoking a function/method in C/C++.

    int ParmList_has_defaultargs(ParmList *p)

    Returns 1 if the parameter list has any default arguments. Otherwise returns 0.

    Code Generation Functions

    String *ParmList_str(ParmList *p)

    Creates a C prototype string of the parameters, but without any default values.

    String *ParmList_str_defaultargs(ParmList *p)

    Creates a C prototype string of the parameters and includes the default values (if any).

    String *ParmList_protostr(ParmList *p)

    Creates a C prototype string of the parameters.
    swig-3.0.12/Doc/Devel/runtime.txt0000664000175000017500000001753313042756442016436 0ustar williamwilliamThis file describes the necessary functions and interfaces a language module needs to implement to take advantage of the run time type system. I assume you have read the run-time section of the Typemaps chapter in the SWIG documentation. Last updated: February 23, 2005 The file we are concerned with here should be named langrun.swg. A good example of a simple file is the Lib/mzscheme/mzrun.swg file. First, a few requirements and notes: 1) Every function in this file should be declared static. 2) It should be inserted into the runtime section of the _wrap file from your config file. The Lib/swigrun.swg file should be included before this file. That is, you need to have %runtime "swigrun.swg" %runtime "langrun.swg" 3) You must also include the swiginit.swg file in the init section of the wrapper. That is, you should have %insert(init) "swiginit.swg" 4) From module.cxx, you need to call the SwigType_emit_type_table function, as well as register types with SwigType_remember or SwigType_remember_clientdata 5) By convention, all functions in this file are of the form SWIG_Language_Whatever, and #defines are used to rename SWIG API functions to these function names 6) You need to call void SWIG_InitializeModule(void *clientdata) from your init function. 7) You need to implement the runtimeCode() and defaultExternalRuntimeFilename() functions inside module.cxx. runtimeCode should return all the language specific runtime code as a string, and defaultExternalRuntimeFilename should return a string for the default name of the external runtime header. This is usually "swigpyrun.h", where "py" is replaced by the language name. These two functions are used by the -external-runtime argument. ------------------------------------------------------------------------------- Required Functions ------------------------------------------------------------------------------- swig_module_info *SWIG_GetModule(void *clientdata); void SWIG_SetModule(void *clientdata, swig_module_info *mod); The SetModule function should store the mod argument into some globally accessible variable in the target language. The action of these two functions is to provide a way for multiple modules to share information. The SetModule function should create a new global var named something like "swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION is currently defined as "2", and SWIG_TYPE_TABLE_NAME is defined by the -DSWIG_TYPE_TABLE=mytable option when compiling the wrapper. Alternatively, if the language supports modules, a module named "swig_runtime_data" SWIG_RUNTIME_VERSION can be created, and a global variable named "type_table" SWIG_TYPE_TABLE_NAME can be created inside it. The most common approach is to store the mod pointer in some global variable in the target language, but if the language provides an alternative place to store data (like the chicken module), then that is good too. The way the code is set up, SetModule should only be called when GetModule returns NULL, and if SetModule is called a second time, the behavior is undefined. Just make sure it doesn't crash in the random chance occurrence that SetModule is called twice. There are two options here. 1) The preferred approach is for GetModule and SetModule to not require a clientdata pointer. If you can at all avoid it, please do so. Here, you would write swig_module_info *SWIG_Language_GetModule(); void SWIG_Language_SetModule(swig_module_info *mod); and then add #define SWIG_GetModule(clientdata) SWIG_Language_GetModule() #define SWIG_SetModule(cd, ptr) SWIG_Language_SetModule(ptr) You would then call SWIG_InitializeModule(0) 2) If GetModule and SetModule need to take a custom pointer (most notably an environment pointer, see tcl or mzscheme), then you should write swig_module_info *SWIG_Language_GetModule(void *clientdata) void SWIG_Language_SetModule(void *clientdata, swig_module_info *mod); and also define #define SWIG_GetModule(cd) SWIG_Language_GetModule(cd) #define SWIG_SetModule(cd, ptr) SWIG_Language_SetModule(cd, ptr) #define SWIG_MODULE_CLIENTDATA_TYPE Whatever SWIG_MODULE_CLIENTDATA_TYPE should be defined to whatever the type of clientdata is. You would then call SWIG_InitializeModule(clientdata), and clientdata would get passed to GetModule and SetModule. clientdata will not be stored and will only be referenced during the InitializeModule call. After InitializeModule returns, clientdata does not need to be valid any more. This method is not preferred, because it makes external access to the type system more complicated. See the Modules chapter of the documentation, and read the "External access to the run-time" section. Then take a look at Lib/runtime.swg. Anybody that calls SWIG_TypeQuery needs to pass along the clientdata pointer, and that is the reason for defining SWIG_MODULE_CLIENTDATA_TYPE. ------------------------------------------------------------------------------- Standard Functions ------------------------------------------------------------------------------- These functions are not required and their API is not formalized, but almost all language modules implement them for consistency across languages. Throughout this discussion, I will use LangType to represent the underlying language type (C_word in chicken, Scheme_Object * in mzscheme, PyObject * in python, etc) LangObj SWIG_NewPointerObj(void *ptr, swig_type_info *type, int flags); Create and return a new pointer object that has both ptr and type. For almost all language modules, flags is used for ownership. If flags==1, then the created pointer should be registered to be garbage collected. int SWIG_ConvertPtr(LangType obj, void **result, swig_type_info *type, int flags); Convert a language wrapped pointer into a void *. The pointer is returned in result, and the function should return 0 on success, non-zero on error. A sample ConvertPtr is given here: swig_cast_info *cast; if () { cast = SWIG_TypeCheck(, type); cast = SWIG_TypeCheckStruct(, type); if (cast) { *result = SWIG_TypeCast(cast, ); return 0; } } return 1; Either TypeCheck or TypeCheckStruct can be called, depending on how the pointer is wrapped in langtype. If obj stores the void pointer and the type name, then the TypeCheck function should be used, while if obj stores the void pointer and a pointer to the swig_type_info structure, then the TypeCheckStruct function should be called. The TypeCheckStruct is slightly faster, since it does a pointer comparison instead of a strcmp. The flag argument to ConvertPtr is used in some languages for disowning a pointer. If the wrapped C function is taking ownership of the pointer (that means, the wrapped C function is responsible for deleting the object), then that pointer should be removed from the garbage collector. We do that in the ConvertPtr function. The pointer is still valid in the target language, but when the target language type is garbage collected, it will not call the associated destructor. Languages have a special typemap called DISOWN that can be applied which passes this argument. All the languages have the flags argument for consistency, and the flags argument can be ignored or used for some other purpose. void *SWIG_MustGetPtr(LangType obj, swig_type_info *type, int flags, int argnum, const char *func_name) { void *result; if (SWIG_ConvertPtr(s, &result, type, flags)) { generate runtime type error ("Error in func_name, expected a" + type->str ? type->str : "void *" + "at argument number" + argnum); } return result; } This function is optional, and the number and type of parameters can be different, but is useful for typemap purposes: %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 0, $argnum, FUNC_NAME); } swig-3.0.12/Doc/Devel/cmdopt.html0000664000175000017500000000433113042756442016356 0ustar williamwilliam SWIG Command Line Handling

    SWIG Command Line Handling

    David M. Beazley
    dave-swig@dabeaz.com
    December, 2006

    Introduction

    This document describes the functions related to the handling of command line options passed to SWIG. These functions are defined in the header file Source/Swig/swigopt.h. This API is considered to be stable.

    Initialization

    Upon SWIG startup, the following function is called:

    void Swig_init_args(int argc, char **argv_)

    Registers command line options with the SWIG core. This creates an internal array that is used by other functions to mark whether or not a particular command line option was used. This is ultimately used to issue error messages about unused or unknown command line options. This function is currently invoked in the SWIG main() function that is found in Source/Modules/swigmain.cxx.

    Argument Marking

    As command line options are processed by language modules, the following functions are used to mark the arguments as used:

    void Swig_mark_arg(int n)

    Mark argument number n as used.

    int Swig_check_marked(int n)

    Check to see if argument n has been marked. Returns 0 or 1.

    Argument Checking

    The following function is used to check all of the command line options after parsing. It looks at the marked list and issues an error message if any unconsumed arguments are found.

    void Swig_check_options()

    Checks all command line options to see if they have all been processed. If not, an error message is generated and execution terminates with a call to exit(). This function is currently invoked in Source/Modules/main.cxx just before SWIG starts any processing of input files.

    Utility Function

    void Swig_arg_error())

    A generic function that issues an error message about being unable to parse command line options. SWIG is terminated by a call to exit(). swig-3.0.12/Doc/README0000664000175000017500000000040013042756442014014 0ustar williamwilliamDoc/Manual - Latest version of the SWIG user manual Doc/Devel - Developer documentation concerning SWIG internals. (not necessarily up to date) Open the index.html file in each of these directories with a web browser. swig-3.0.12/configure.ac0000664000175000017500000027212213042756442014731 0ustar williamwilliamdnl Process this file with autoconf to produce a configure script. dnl The macros which aren't shipped with the autotools are stored in the dnl Tools/config directory in .m4 files. AC_INIT([swig],[3.0.12],[http://www.swig.org]) dnl NB: When this requirement is increased to 2.60 or later, AC_PROG_SED dnl definition below can be removed AC_PREREQ(2.58) AC_CONFIG_SRCDIR([Source/Swig/swig.h]) AC_CONFIG_AUX_DIR([Tools/config]) AC_CONFIG_HEADERS([Source/Include/swigconfig.h]) AC_CANONICAL_HOST AM_INIT_AUTOMAKE dnl Some extra defines for the config file AH_BOTTOM([ /* Default language */ #define SWIG_LANG "-tcl" /* Deal with attempt by Microsoft to deprecate C standard runtime functions */ #if defined(_MSC_VER) # define _CRT_SECURE_NO_DEPRECATE #endif ]) dnl Check for programs that a user requires to build SWIG AC_PROG_CC AC_PROG_CXX AC_EXEEXT AC_OBJEXT AM_PROG_CC_C_O # Needed for subdir-objects in AUTOMAKE_OPTIONS AC_COMPILE_WARNINGS # Increase warning levels AC_DEFINE_UNQUOTED(SWIG_CXX, ["$CXX"], [Compiler that built SWIG]) AC_DEFINE_UNQUOTED(SWIG_PLATFORM, ["$host"], [Platform that SWIG is built for]) dnl Checks for header files. AC_HEADER_STDC dnl Look for popen AC_ARG_WITH(popen, AS_HELP_STRING([--without-popen], [Disable popen]), with_popen="$withval") if test x"${with_popen}" = xno ; then AC_MSG_NOTICE([Disabling popen]) else AC_CHECK_FUNC(popen, AC_DEFINE(HAVE_POPEN, 1, [Define if popen is available]), AC_MSG_NOTICE([Disabling popen])) fi dnl PCRE dnl AX_PATH_GENERIC() relies on AC_PROG_SED() but it is defined only in dnl autoconf 2.60 so trivially predefine it ourselves for the older versions m4_ifdef([AC_PROG_SED],, [AC_DEFUN([AC_PROG_SED], [AC_PATH_PROG([SED], sed)])]) AC_ARG_WITH([pcre], [AS_HELP_STRING([--without-pcre], [Disable support for regular expressions using PCRE])], [], [with_pcre=yes]) AC_MSG_CHECKING([whether to enable PCRE support]) AC_MSG_RESULT([$with_pcre]) dnl To make configuring easier, check for a locally built PCRE using the Tools/pcre-build.sh script if test x"${with_pcre}" = xyes ; then AC_MSG_CHECKING([whether to use local PCRE]) local_pcre_config=no if test -z $PCRE_CONFIG; then if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config local_pcre_config=$PCRE_CONFIG fi fi AC_MSG_RESULT([$local_pcre_config]) fi AS_IF([test "x$with_pcre" != xno], [AX_PATH_GENERIC([pcre], [], dnl Minimal version of PCRE we need -- accept any [], dnl custom sed script for version parsing is not needed [AC_DEFINE([HAVE_PCRE], [1], [Define if you have PCRE library]) LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" ], [AC_MSG_FAILURE([ Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended).]) ]) ]) dnl CCache AC_ARG_ENABLE([ccache], AS_HELP_STRING([--disable-ccache], [disable building and installation of ccache-swig executable (default enabled)]), [enable_ccache=$enableval], [enable_ccache=yes]) AC_MSG_CHECKING([whether to enable ccache-swig]) AC_MSG_RESULT([$enable_ccache]) if test "$enable_ccache" = yes; then AC_CONFIG_SUBDIRS(CCache) ENABLE_CCACHE=1 fi AC_SUBST(ENABLE_CCACHE) echo "" echo "Checking packages required for SWIG developers." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" AC_PROG_YACC echo "" echo "Checking for installed target languages and other information in order to compile and run" echo "the examples and test-suite invoked by 'make check'." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" dnl Some test cases require Boost AX_BOOST_BASE(,,,) AC_SUBST(BOOST_CPPFLAGS) dnl How to specify include directories that may be system directories. # -I should not be used on system directories (GCC) if test "$GCC" = yes; then ISYSTEM="-isystem " else ISYSTEM="-I" fi AC_MSG_NOTICE(ISYSTEM: $ISYSTEM) dnl Info for building shared libraries ... in order to run the examples # SO is the extension of shared libraries (including the dot!) AC_MSG_CHECKING(SO) if test -z "$SO" then case $host in *-*-hp*) SO=.sl;; *-*-darwin*) SO=.bundle;; *-*-cygwin* | *-*-mingw*) SO=.dll;; *) SO=.so;; esac fi AC_MSG_RESULT($SO) # LDSHARED is the ld *command* used to create shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) AC_MSG_CHECKING(LDSHARED) if test -z "$LDSHARED" then case $host in *-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then LDSHARED="$CC -shared" else if test "cl" = $CC ; then # Microsoft Visual C++ (MSVC) LDSHARED="$CC -nologo -LD" else # Unknown compiler try gcc approach LDSHARED="$CC -shared" fi fi ;; *-*-irix5*) LDSHARED="ld -shared";; *-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";; *-*-sunos4*) LDSHARED="ld";; *-*-solaris*) LDSHARED="ld -G";; *-*-hp*) LDSHARED="ld -b";; *-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";; *-sequent-sysv4) LDSHARED="ld -G";; *-*-next*) if test "$ns_dyld" then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind' else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r' fi if test "$with_next_framework" ; then LDSHARED="$LDSHARED \$(LDLIBRARY)" fi ;; *-*-linux*) LDSHARED="gcc -shared";; *-*-dgux*) LDSHARED="ld -G";; *-*-freebsd3*) LDSHARED="gcc -shared";; *-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";; *-*-netbsd*) if [[ "`$CC -dM -E - &1 | grep -i clang >/dev/null && CLANGXX=yes case $host in *-*-darwin11* | *-*-darwin12* |*-*-darwin13* ) if test "$CLANGXX" = "yes"; then PLATCXXFLAGS="$PLATCXXFLAGS -stdlib=libc++" fi;; *) ;; esac # Set info about shared libraries. AC_SUBST(SO) AC_SUBST(LDSHARED) AC_SUBST(CCSHARED) AC_SUBST(CXXSHARED) AC_SUBST(TRYLINKINGWITHCXX) AC_SUBST(RPATH) AC_SUBST(PLATCFLAGS) AC_SUBST(PLATCXXFLAGS) AC_SUBST(HAVE_CXX11_COMPILER) AC_SUBST(LINKFORSHARED) # This variation is needed on OS-X because there is no (apparent) consistency in shared library naming. # Sometimes .bundle works, but sometimes .so is needed. It depends on the target language AC_SUBST(PYTHON_SO) case $host in *-*-mingw*) PYTHON_SO=.pyd;; *-*-darwin*) PYTHON_SO=.so;; *) PYTHON_SO=$SO;; esac AC_SUBST(TCL_SO) case $host in *-*-darwin*) TCL_SO=.dylib;; *) TCL_SO=$SO;; esac AC_SUBST(GUILE_SO) case $host in *-*-darwin*) GUILE_SO=.so;; *) GUILE_SO=$SO;; esac AC_SUBST(PHP_SO) case $host in *-*-darwin*) PHP_SO=.so;; *) PHP_SO=$SO;; esac AC_SUBST(PHP5_SO) PHP5_SO=$PHP_SO AC_SUBST(MZSCHEME_SO) case $host in *) MZSCHEME_SO=.so;; esac AC_SUBST(LUA_SO) case $host in *-*-darwin*) LUA_SO=.so;; *) LUA_SO=$SO;; esac # Check for specific libraries. Used for SWIG examples AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX dnl The following three libraries (nsl,inet,socket) are needed on Sequent, dnl and must be checked for in this order since each library depends on the dnl preceding one. dnl dnl Most SVR4 platforms will need -lsocket and -lnsl. However on SGI IRIX 5, dnl these exist but are broken, so we use AC_SEARCH_LIBS which will only try dnl the library if the function isn't already available without it. AC_SEARCH_LIBS(t_open, nsl) # SVR4 AC_SEARCH_LIBS(gethostbyname, inet) # Sequent AC_SEARCH_LIBS(socket, socket) # SVR4 sockets AC_CHECK_LIB(swill, swill_init, [SWIGLIBS="-lswill $LIBS" SWILL="-DSWIG_SWILL"]) AC_SUBST(SWIGLIBS) AC_SUBST(SWILL) # check for --with-libm=... AC_SUBST(LIBM) LIBM=-lm AC_ARG_WITH(libm, [ --with-libm=STRING math library], [ if test "$withval" != yes then LIBM=$withval else AC_MSG_ERROR([proper usage is --with-libm=STRING]) fi]) AC_CHECK_LIB(ieee, main, [LIBM="-lieee $LIBM"]) AC_CHECK_LIB(crypt,crypt, [LIBCRYPT="-lcrypt"]) AC_SUBST(LIBCRYPT) # check for --with-libc=... AC_SUBST(LIBC) AC_ARG_WITH(libc, [ --with-libc=STRING C library], [ if test "$withval" != yes then LIBC=$withval else AC_MSG_ERROR([proper usage is --with-libc=STRING]) fi]) #-------------------------------------------------------------------- # Target languages #-------------------------------------------------------------------- AC_ARG_WITH(alllang, AS_HELP_STRING([--without-alllang], [Disable all languages]), with_alllang="$withval") if test "$with_alllang" = "no"; then alllang_default=no else alllang_default=yes fi AC_CHECK_PROGS(PKGCONFIG, [pkg-config]) #-------------------------------------------------------------------- # Look for Tcl #-------------------------------------------------------------------- TCLINCLUDE= TCLLIB= TCLPACKAGE= AC_ARG_WITH(tclconfig, AS_HELP_STRING([--without-tcl], [Disable Tcl]) AS_HELP_STRING([--with-tclconfig=path], [Set location of tclConfig.sh]), [with_tclconfig="$withval"], [with_tclconfig=]) AC_ARG_WITH(tcl, [ --with-tcl=path Set location of Tcl package],[ TCLPACKAGE="$withval"], [TCLPACKAGE="$alllang_default"]) AC_ARG_WITH(tclincl,[ --with-tclincl=path Set location of Tcl include directory],[ TCLINCLUDE="$ISYSTEM$withval"], [TCLINCLUDE=]) AC_ARG_WITH(tcllib,[ --with-tcllib=path Set location of Tcl library directory],[ TCLLIB="-L$withval"], [TCLLIB=]) # First, check for "--without-tcl" or "--with-tcl=no". if test x"${TCLPACKAGE}" = xno; then AC_MSG_NOTICE([Disabling Tcl]) else AC_MSG_CHECKING([for Tcl configuration]) # First check to see if --with-tclconfig was specified. if test x"${with_tclconfig}" != x ; then if test -f "${with_tclconfig}/tclConfig.sh" ; then TCLCONFIG=`(cd ${with_tclconfig}; pwd)` else AC_MSG_ERROR([${with_tcl} directory does not contain tclConfig.sh]) fi fi # check in a few common install locations if test x"${TCLCONFIG}" = x ; then for i in `ls -d -r /usr/lib*/ 2>/dev/null` \ `ls -d -r /usr/lib*/tcl*/ 2>/dev/null` \ `ls -d -r /usr/local/lib*/ 2>/dev/null` \ `ls -d -r /usr/local/lib*/tcl*/ 2>/dev/null` ; do if test -f $i"tclConfig.sh" ; then TCLCONFIG=`(cd $i; pwd)` break fi done fi if test x"${TCLCONFIG}" = x ; then AC_MSG_RESULT(no) else AC_MSG_RESULT(found $TCLCONFIG/tclConfig.sh) . $TCLCONFIG/tclConfig.sh if test -z "$TCLINCLUDE"; then TCLINCLUDE=`echo $TCL_INCLUDE_SPEC | sed "s/-I/$ISYSTEM/"` fi if test -z "$TCLLIB"; then TCLLIB=$TCL_LIB_SPEC fi fi if test -z "$TCLINCLUDE"; then if test "x$TCLPACKAGE" != xyes; then TCLINCLUDE="$ISYSTEM$TCLPACKAGE/include" fi fi if test -z "$TCLLIB"; then if test "x$TCLPACKAGE" != xyes; then TCLLIB="-L$TCLPACKAGE/lib -ltcl" fi fi AC_MSG_CHECKING(for Tcl header files) if test -z "$TCLINCLUDE"; then AC_TRY_CPP([#include ], , TCLINCLUDE="") if test -z "$TCLINCLUDE"; then dirs="/usr/local/include /usr/include /opt/local/include" for i in $dirs ; do if test -r $i/tcl.h; then AC_MSG_RESULT($i) TCLINCLUDE="$ISYSTEM$i" break fi done fi if test -z "$TCLINCLUDE"; then AC_MSG_RESULT(not found) fi else AC_MSG_RESULT($TCLINCLUDE) fi AC_MSG_CHECKING(for Tcl library) if test -z "$TCLLIB"; then dirs="/usr/local/lib /usr/lib /opt/local/lib" for i in $dirs ; do if test -r $i/libtcl.a; then AC_MSG_RESULT($i) TCLLIB="-L$i -ltcl" break fi done if test -z "$TCLLIB"; then AC_MSG_RESULT(not found) fi else AC_MSG_RESULT($TCLLIB) fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; *)TCLDYNAMICLINKING="";; esac case $host in *-*-darwin*) TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' ;; *) TCLLDSHARED='$(LDSHARED)' TCLCXXSHARED='$(CXXSHARED)' ;; esac fi AC_SUBST(TCLINCLUDE) AC_SUBST(TCLLIB) AC_SUBST(TCLDYNAMICLINKING) AC_SUBST(TCLLDSHARED) AC_SUBST(TCLCXXSHARED) #---------------------------------------------------------------- # Look for Python #---------------------------------------------------------------- PYINCLUDE= PYLIB= PYLINK= PYPACKAGE= AC_ARG_WITH(python, AS_HELP_STRING([--without-python], [Disable Python]) AS_HELP_STRING([--with-python=path], [Set location of Python executable]),[ PYBIN="$withval"], [PYBIN="$alllang_default"]) # First, check for "--without-python" or "--with-python=no". if test x"${PYBIN}" = xno; then AC_MSG_NOTICE([Disabling Python]) else # First figure out the name of the Python executable if test "x$PYBIN" = xyes; then AC_CHECK_PROGS(PYTHON, [python python2.8 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0]) else PYTHON="$PYBIN" fi PYVER=0 if test -n "$PYTHON"; then AC_MSG_CHECKING([for $PYTHON major version number]) PYVER=`($PYTHON -c "import sys; sys.stdout.write(sys.version[[0]])") 2>/dev/null` AC_MSG_RESULT($PYVER) if test -z "$PYVER"; then PYVER=0 else AC_MSG_CHECKING(for Python os.name) PYOSNAME=`($PYTHON -c "import sys, os; sys.stdout.write(os.name)")` AC_MSG_RESULT($PYOSNAME) fi fi if test $PYVER -eq 1 -o $PYVER -eq 2; then AC_MSG_CHECKING(for Python prefix) PYPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` AC_MSG_RESULT($PYPREFIX) AC_MSG_CHECKING(for Python exec-prefix) PYEPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)") 2>/dev/null` AC_MSG_RESULT($PYEPREFIX) if test x"$PYOSNAME" = x"nt"; then # Windows installations are quite different to posix installations PYPREFIX=`echo "$PYPREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd AC_MSG_CHECKING(for Python header files) if test -r $PYPREFIX/include/Python.h; then PYINCLUDE="-I$PYPREFIX/include" fi AC_MSG_RESULT($PYINCLUDE) AC_MSG_CHECKING(for Python library directory) if test -d $PYPREFIX/libs; then PYLIB=$PYPREFIX/libs PYLINKFILE=`ls $PYLIB/python*.lib | grep "python[[0-9]][[0-9]]\.lib"` if test -r "$PYLINKFILE"; then PYLINK=-l`basename $PYLINKFILE | sed -e 's/\.lib$//'` else PYLIB= fi fi else # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. AC_MSG_CHECKING(for Python version) # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PYVERSION=`($PYTHON -c "import sys,string,operator,os.path; sys.stdout.write(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))")` AC_MSG_RESULT($PYVERSION) # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 AC_MSG_CHECKING(for Python lib dir) PYLIBDIR=`($PYTHON -c "import sys; sys.stdout.write(sys.lib)") 2>/dev/null` if test -z "$PYLIBDIR"; then # Fedora patch Python to add sys.lib, for other distros we assume "lib". PYLIBDIR="lib" fi AC_MSG_RESULT($PYLIBDIR) # Set the include directory AC_MSG_CHECKING(for Python header files) if test -r $PYPREFIX/include/$PYVERSION/Python.h; then PYINCLUDE="-I$PYPREFIX/include/$PYVERSION -I$PYEPREFIX/$PYLIBDIR/$PYVERSION/config" fi if test -z "$PYINCLUDE"; then if test -r $PYPREFIX/include/Py/Python.h; then PYINCLUDE="-I$PYPREFIX/include/Py -I$PYEPREFIX/$PYLIBDIR/python/lib" fi fi AC_MSG_RESULT($PYINCLUDE) # Set the library directory blindly. This probably won't work with older versions AC_MSG_CHECKING(for Python library directory) dirs="$PYVERSION/config $PYVERSION/$PYLIBDIR python/$PYLIBDIR" for i in $dirs; do if test -d $PYEPREFIX/$PYLIBDIR/$i; then PYLIB="$PYEPREFIX/$PYLIBDIR/$i" break fi done PYLINK="-l$PYVERSION" fi if test -z "$PYLIB"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PYLIB) fi AC_MSG_CHECKING(for Python library) if test -z "$PYLINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PYLINK) fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHONDYNAMICLINKING="-L$PYLIB $PYLINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHONDYNAMICLINKING="";; esac fi AC_SUBST(PYINCLUDE) AC_SUBST(PYLIB) AC_SUBST(PYLINK) AC_SUBST(PYTHONDYNAMICLINKING) #---------------------------------------------------------------- # Look for Python 3.x #---------------------------------------------------------------- PY3INCLUDE= PY3LIB= PY3LINK= PY3PACKAGE= AC_ARG_WITH(python3, AS_HELP_STRING([--without-python3], [Disable Python 3.x support]) AS_HELP_STRING([--with-python3=path], [Set location of Python 3.x executable]),[ PY3BIN="$withval"], [PY3BIN="$alllang_default"]) # First, check for "--without-python3" or "--with-python3=no". if test x"${PY3BIN}" = xno; then AC_MSG_NOTICE([Disabling Python 3.x support]) else if test -z "$PYVER"; then PYVER=0 fi if test "x$PY3BIN" = xyes; then if test x"$PYOSNAME" = x"nt" -a $PYVER -ge 3; then PYTHON3="$PYTHON" else for py_ver in 3 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 ""; do AC_CHECK_PROGS(PYTHON3, [python$py_ver]) if test -n "$PYTHON3"; then AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config]) if test -n "$PY3CONFIG"; then break fi fi done fi else PYTHON3="$PY3BIN" AC_CHECK_PROGS(PY3CONFIG, [$PYTHON3-config]) fi if test -n "$PYTHON3"; then AC_MSG_CHECKING([for $PYTHON3 major version number]) PYVER=`($PYTHON3 -c "import sys; sys.stdout.write(sys.version[[0]])") 2>/dev/null` AC_MSG_RESULT($PYVER) if test -z "$PYVER"; then PYVER=0 fi fi if test $PYVER -ge 3; then AC_MSG_CHECKING(for Python 3.x os.name) PY3OSNAME=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.name)")` AC_MSG_RESULT($PY3OSNAME) if test x"$PY3OSNAME" = x"nt"; then # Windows installations are quite different to posix installations # There is no python-config to use AC_MSG_CHECKING(for Python 3.x prefix) PY3PREFIX=`($PYTHON3 -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` AC_MSG_RESULT($PY3PREFIX) PY3PREFIX=`echo "$PY3PREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd AC_MSG_CHECKING(for Python 3.x header files) if test -r $PY3PREFIX/include/Python.h; then PY3INCLUDE="-I$PY3PREFIX/include" fi AC_MSG_RESULT($PY3INCLUDE) AC_MSG_CHECKING(for Python 3.x library directory) if test -d $PY3PREFIX/libs; then PY3LIB=$PY3PREFIX/libs PY3LINKFILE=`ls $PY3LIB/python*.lib | grep "python[[0-9]][[0-9]]\.lib"` if test -r "$PY3LINKFILE"; then PY3LINK=-l`basename $PY3LINKFILE | sed -e 's/\.lib$//'` else PY3LIB= fi fi if test -z "$PY3LIB"; then AC_MSG_RESULT([Not found]) else AC_MSG_RESULT($PY3LIB) fi AC_MSG_CHECKING([for Python 3.x library]) if test -z "$PY3LINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PY3LINK) fi elif test -n "$PY3CONFIG"; then AC_MSG_CHECKING([for Python 3.x prefix]) PY3PREFIX=`($PY3CONFIG --prefix) 2>/dev/null` AC_MSG_RESULT($PY3PREFIX) AC_MSG_CHECKING(for Python 3.x exec-prefix) PY3EPREFIX=`($PY3CONFIG --exec-prefix) 2>/dev/null` AC_MSG_RESULT($PY3EPREFIX) # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. AC_MSG_CHECKING([for Python 3.x version]) # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PY3VERSION=`($PYTHON3 -c "import string,operator,os.path; print(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))")` AC_MSG_RESULT($PY3VERSION) # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 AC_MSG_CHECKING([for Python 3.x lib dir]) PY3LIBDIR=`($PYTHON3 -c "import sys; print(sys.lib)") 2>/dev/null` if test -z "$PY3LIBDIR"; then # some dists don't have sys.lib so the best we can do is assume lib PY3LIBDIR="lib" fi AC_MSG_RESULT($PY3LIBDIR) # Set the include directory AC_MSG_CHECKING([for Python 3.x header files]) PY3INCLUDE=`($PY3CONFIG --includes) 2>/dev/null` AC_MSG_RESULT($PY3INCLUDE) # Set the library directory blindly. This probably won't work with older versions AC_MSG_CHECKING([for Python 3.x library directory]) dirs="$PY3VERSION/config $PY3VERSION/$PY3LIBDIR python/$PY3LIBDIR" for i in $dirs; do if test -d $PY3EPREFIX/$PY3LIBDIR/$i; then PY3LIB="$PY3EPREFIX/$PY3LIBDIR/$i" break fi done if test -z "$PY3LIB"; then AC_MSG_RESULT([Not found]) else AC_MSG_RESULT($PY3LIB) fi PY3LINK="-l$PY3VERSION" AC_MSG_CHECKING([for Python 3.x library]) if test -z "$PY3LINK"; then AC_MSG_RESULT(Not found) else AC_MSG_RESULT($PY3LINK) fi fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHON3DYNAMICLINKING="-L$PY3LIB $PY3LINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHON3DYNAMICLINKING="";; esac AC_SUBST(PY3INCLUDE) AC_SUBST(PY3LIB) AC_SUBST(PY3LINK) AC_SUBST(PYTHON3DYNAMICLINKING) fi if test -n "$PYINCLUDE" || test -n "$PY3INCLUDE" ; then AC_CHECK_PROGS(PEP8, pep8) if test -n "$PEP8"; then AC_MSG_CHECKING(pep8 version) pep8_version=`$PEP8 --version 2>/dev/null` AC_MSG_RESULT($pep8_version) fi fi #---------------------------------------------------------------- # Look for Perl5 #---------------------------------------------------------------- PERLBIN= AC_ARG_WITH(perl5, AS_HELP_STRING([--without-perl5], [Disable Perl5]) AS_HELP_STRING([--with-perl5=path], [Set location of Perl5 executable]),[ PERLBIN="$withval"], [PERLBIN="$alllang_default"]) # First, check for "--without-perl5" or "--with-perl5=no". if test x"${PERLBIN}" = xno; then AC_MSG_NOTICE([Disabling Perl5]) PERL= else # First figure out what the name of Perl5 is if test "x$PERLBIN" = xyes; then AC_CHECK_PROGS(PERL, perl perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl) else PERL="$PERLBIN" fi # This could probably be simplified as for all platforms and all versions of Perl the following apparently should be run to get the compilation options: # perl -MExtUtils::Embed -e ccopts AC_MSG_CHECKING(for Perl5 header files) if test -n "$PERL"; then PERL5DIR=`($PERL -MConfig -le 'print $Config{archlibexp}') 2>/dev/null` if test -n "$PERL5DIR" ; then dirs="$PERL5DIR $PERL5DIR/CORE" PERL5EXT=none for i in $dirs; do if test -r $i/perl.h; then AC_MSG_RESULT($i) PERL5EXT="$i" break fi done if test "$PERL5EXT" = none; then PERL5EXT="$PERL5DIR/CORE" AC_MSG_RESULT(could not locate perl.h...using $PERL5EXT) fi AC_MSG_CHECKING(for Perl5 library) PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; s/\.$Config{so}.*//; print $_, "\n"') 2>/dev/null` if test -z "$PERL5LIB" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5LIB) fi AC_MSG_CHECKING(for Perl5 ccflags) PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//" | sed "s/-I/$ISYSTEM/") 2>/dev/null` if test -z "$PERL5CCFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCFLAGS) fi AC_MSG_CHECKING(for Perl5 ccdlflags) PERL5CCDLFLAGS=`($PERL -e 'use Config; print $Config{ccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCDLFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCDLFLAGS) fi AC_MSG_CHECKING(for Perl5 cccdlflags) PERL5CCCDLFLAGS=`($PERL -e 'use Config; print $Config{cccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCCDLFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5CCCDLFLAGS) fi AC_MSG_CHECKING(for Perl5 ldflags) PERL5LDFLAGS=`($PERL -e 'use Config; print $Config{ldflags}, "\n"') 2>/dev/null` if test -z "$PERL5LDFLAGS" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PERL5LDFLAGS) fi AC_MSG_CHECKING(for Perl5 Test::More module) # For test-suite PERL5TESTMORE=`($PERL -e 'use Test::More; print "good";') 2>/dev/null` if test -z "$PERL5TESTMORE" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT(found) fi else AC_MSG_RESULT(unable to determine perl5 configuration) PERL5EXT=$PERL5DIR fi else AC_MSG_RESULT(could not figure out how to run perl5) fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";; *)PERL5DYNAMICLINKING="";; esac fi AC_SUBST(PERL) AC_SUBST(PERL5EXT) AC_SUBST(PERL5DYNAMICLINKING) AC_SUBST(PERL5LIB) AC_SUBST(PERL5CCFLAGS) AC_SUBST(PERL5CCDLFLAGS) AC_SUBST(PERL5CCCDLFLAGS) AC_SUBST(PERL5LDFLAGS) #---------------------------------------------------------------- # Look for Octave #---------------------------------------------------------------- OCTAVEBIN= OCTAVE_SO=.oct AC_ARG_WITH(octave, AS_HELP_STRING([--without-octave], [Disable Octave]) AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[OCTAVEBIN="$withval"], [OCTAVEBIN="$alllang_default"]) # Check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno; then AC_MSG_NOTICE([Disabling Octave]) OCTAVE= # Check for Octave; prefer command-line program "octave-cli" to (in newer versions) GUI program "octave" elif test "x$OCTAVEBIN" = xyes; then AC_PATH_PROG(OCTAVE, [octave-cli octave]) else OCTAVE="$OCTAVEBIN" fi # Check if Octave works if test -n "$OCTAVE"; then AC_MSG_CHECKING([if ${OCTAVE} works]) AS_IF([test "x`${OCTAVE} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/Octave, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_NOTICE([no, disabling Octave]) OCTAVE= ]) fi # Check for required Octave helper program "mkoctfile" if test -n "$OCTAVE"; then AC_MSG_CHECKING([for mkoctfile]) mkoctfile=["`echo $OCTAVE | sed -e 's|[a-z][a-z-]*$|mkoctfile|;t;s|[a-z][a-z-]*\(-[0-9][0-9.+]*\)$|mkoctfile\1|;t'`"] AC_MSG_RESULT([${mkoctfile}]) AC_MSG_CHECKING([if ${mkoctfile} works]) AS_IF([test "x`${mkoctfile} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/mkoctfile, version/p'`" != x],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_NOTICE([no, disabling Octave]) OCTAVE= ]) fi # Check for Octave preprocessor/compiler/linker flags if test -n "$OCTAVE"; then AC_MSG_CHECKING([for Octave preprocessor flags]) OCTAVE_CPPFLAGS= for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";; *) ;; esac done done AC_MSG_RESULT([$OCTAVE_CPPFLAGS]) AC_MSG_CHECKING([for Octave compiler flags]) OCTAVE_CXXFLAGS= for var in CXX ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -std=*|-g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";; *) ;; esac done done save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Werror -O0" AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([],[]) ],[ OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} -O0" ]) CXXFLAGS="${save_CXXFLAGS}" AC_MSG_RESULT([$OCTAVE_CXXFLAGS]) AC_MSG_CHECKING([for Octave linker flags]) OCTAVE_LDFLAGS= for var in RDYNAMIC_FLAG LFLAGS RLD_FLAG OCTAVE_LIBS LIBS; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`env - ${mkoctfile} -p ${var}` done AC_MSG_RESULT([$OCTAVE_LDFLAGS]) fi # Check for Octave options if test -n "$OCTAVE"; then for octave_opt in --no-window-system --silent --norc --no-history; do AC_MSG_CHECKING([if Octave option '${octave_opt}' is supported]) octave_out=`${OCTAVE} ${octave_opt} /dev/null 2>&1 | sed -n '1p' | sed -n '/unrecognized/p'` AS_IF([test "x${octave_out}" = x],[ AC_MSG_RESULT([yes]) OCTAVE="${OCTAVE} ${octave_opt}" ],[ AC_MSG_RESULT([no]) ]) done fi AC_SUBST(OCTAVE) AC_SUBST(OCTAVE_SO) AC_SUBST(OCTAVE_CPPFLAGS) AC_SUBST(OCTAVE_CXXFLAGS) AC_SUBST(OCTAVE_LDFLAGS) #---------------------------------------------------------------- # Look for Scilab #---------------------------------------------------------------- AC_ARG_WITH(scilab, AS_HELP_STRING([--without-scilab], [Disable Scilab]) AS_HELP_STRING([--with-scilab=path], [Set location of Scilab executable]),[SCILABBIN="$withval"], [SCILABBIN="$alllang_default"]) AC_ARG_WITH(scilab-inc, [ --with-scilab-inc=path Set location of Scilab include directory], [SCILABINCDIR="$withval"], [SCILABINCDIR=""]) # First, check for "--without-scilab" or "--with-scilab=no". if test x"${SCILABBIN}" = xno; then AC_MSG_NOTICE([Disabling Scilab]) SCILAB= else # Check for Scilab executable if test "x$SCILABBIN" = xyes; then AC_CHECK_PROGS(SCILAB, scilab) else AC_MSG_CHECKING(for scilab) if test -f "$SCILABBIN"; then AC_MSG_RESULT($SCILABBIN) SCILAB="$SCILABBIN" else AC_MSG_RESULT(not found) fi fi if test -n "$SCILAB"; then # Check for Scilab version (needs api_scilab so needs version 5.3.3 or higher) SCILAB_FULL_VERSION=`$SCILAB -version | head -1 | sed -e 's|Scilab version \"\(.*\)\"|\1|g'` AC_MSG_CHECKING(Scilab version is 5.3.3 or higher) SCILAB_MAJOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f1` SCILAB_MINOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f2` SCILAB_MAINTENANCE_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f3` SCILAB_VERSION="$SCILAB_MAJOR_VERSION$SCILAB_MINOR_VERSION$SCILAB_MAINTENANCE_VERSION" if test $SCILAB_VERSION -ge 533; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) SCILAB= fi if test -n "$SCILAB"; then # Set Scilab startup options depending on version AC_MSG_CHECKING(for Scilab startup options) SCILABOPT="-nwni -nb" if test $SCILAB_VERSION -ge 540; then SCILABOPT+=" -noatomsautoload" fi AC_MSG_RESULT($SCILABOPT) # Check for Scilab header files AC_MSG_CHECKING(for Scilab header files) if test "$SCILABINCDIR" != ""; then dirs="$SCILABINCDIR" elif test -n "$PKGCONFIG"; then dirs=`$PKGCONFIG scilab --cflags-only-I | sed -e 's/-I//g'` else dirs="" fi for i in $dirs; do if test -r $i/api_scilab.h; then AC_MSG_RESULT($i) SCILABINCLUDE="-I$i" break fi if test -r $i/scilab/api_scilab.h; then AC_MSG_RESULT($i/scilab) SCILABINCLUDE="-I$i/scilab" break fi done if test "$SCILABINCLUDE" = "" ; then AC_MSG_RESULT(not found) SCILAB= fi fi fi fi AC_SUBST(SCILAB) AC_SUBST(SCILABINCLUDE) AC_SUBST(SCILABOPT) #---------------------------------------------------------------- # Look for java #---------------------------------------------------------------- AC_ARG_WITH(java, AS_HELP_STRING([--without-java], [Disable Java]) AS_HELP_STRING([--with-java=path], [Set location of java executable]),[JAVABIN="$withval"], [JAVABIN="$alllang_default"]) AC_ARG_WITH(javac, [ --with-javac=path Set location of javac executable],[JAVACBIN="$withval"], [JAVACBIN=]) # First, check for "--without-java" or "--with-java=no". if test x"${JAVABIN}" = xno; then AC_MSG_NOTICE([Disabling Java]) JAVA= else dnl Detect everything we need for Java: java for running Java tests, javac for dnl compiling them and C headers for compiling C code. dnl dnl If JAVA_HOME is defined and contains everything needed, as it's supposed to, dnl just use it. Otherwise try to locate the necessary files in the path. case $host in *-*-cygwin*) dnl Ensure that JAVA_HOME is in the form we can use, it's typically set to Windows path by the installer. if test -n "$JAVA_HOME"; then JAVA_HOME=`cygpath --mixed "$JAVA_HOME"` fi ;; *-*-mingw*) if test -n "$JAVA_HOME"; then JAVA_HOME=`${srcdir}/Tools/convertpath -u "$JAVA_HOME"` fi ;; *-*-darwin*) dnl Under OS X JAVA_HOME is not set by default, try to use the system default JRE. if test -z "$JAVA_HOME" -a -x /usr/libexec/java_home; then JAVA_HOME=`/usr/libexec/java_home` fi dnl The JAVA_HOME doesn't contain the JDK headers though, but they seem to dnl always be in the same location, according to Apple JNI documentation. JAVA_OSX_STD_INCDIR="/System/Library/Frameworks/JavaVM.framework/Headers" if test -r "$JAVA_OSX_STD_INCDIR/jni.h"; then JAVA_HOME_INCDIR=$JAVA_OSX_STD_INCDIR fi ;; esac AC_MSG_CHECKING(for java JDK) if test -n "$JAVA_HOME"; then dnl Don't complain about missing executables/headers if they had been dnl explicitly overridden from the command line, but otherwise verify that we dnl have everything we need. java_home_ok=1 if test -z "$JAVABIN" -a ! -x "$JAVA_HOME/bin/java"; then AC_MSG_WARN([No java executable under JAVA_HOME.]) java_home_ok=0 fi if test -z "$JAVACBIN" -a ! -x "$JAVA_HOME/bin/javac"; then AC_MSG_WARN([No javac executable under JAVA_HOME.]) java_home_ok=0 fi dnl By default the headers are under JAVA_HOME/include, but OS X is special dnl and defines JAVA_HOME_INCDIR differently above. if test -z "$JAVA_HOME_INCDIR"; then JAVA_HOME_INCDIR="$JAVA_HOME/include" fi if test -z "$JAVAINCDIR" -a ! -r "$JAVA_HOME_INCDIR/jni.h"; then AC_MSG_WARN([No java headers under JAVA_HOME (does it point to a JDK and not just JRE?).]) java_home_ok=0 fi if test "$java_home_ok" = 1; then AC_MSG_RESULT([found (in $JAVA_HOME)]) else AC_MSG_RESULT(no) AC_MSG_WARN([JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it.]) JAVA_HOME= fi else AC_MSG_RESULT([no (JAVA_HOME is not defined)]) fi if test "x$JAVABIN" = xyes; then if test -n "$JAVA_HOME"; then JAVA="$JAVA_HOME/bin/java" else AC_CHECK_PROGS(JAVA, java kaffe guavac) fi else JAVA="$JAVABIN" fi if test -z "$JAVACBIN"; then if test -n "$JAVA_HOME"; then JAVAC="$JAVA_HOME/bin/javac" else AC_CHECK_PROGS(JAVAC, javac) fi else JAVAC="$JAVACBIN" fi AC_MSG_CHECKING(for java include file jni.h) AC_ARG_WITH(javaincl, [ --with-javaincl=path Set location of Java include directory], [JAVAINCDIR="$withval"], [JAVAINCDIR=]) JAVAINC="" if test -z "$JAVAINCDIR" ; then if test -n "$JAVA_HOME"; then JAVAINCDIR="$JAVA_HOME_INCDIR" JAVAINC=-I\"$JAVAINCDIR\" else JAVAINCDIR="/usr/j2sdk*/include /usr/local/j2sdk*/include /usr/jdk*/include /usr/local/jdk*/include /opt/j2sdk*/include /opt/jdk*/include /usr/java/include /usr/java/j2sdk*/include /usr/java/jdk*/include /usr/local/java/include /opt/java/include /usr/include/java /usr/local/include/java /usr/lib/java/include /usr/lib/jvm/java*/include /usr/lib64/jvm/java*/include /usr/include/kaffe /usr/local/include/kaffe /usr/include" # Add in default installation directory on Windows for Cygwin case $host in *-*-cygwin* | *-*-mingw*) JAVAINCDIR="c:/Program*Files*/Java/jdk*/include d:/Program*Files*/Java/jdk*/include c:/j2sdk*/include d:/j2sdk*/include c:/jdk*/include d:/jdk*/include $JAVAINCDIR";; *-*-darwin*) JAVAINCDIR="$JAVA_OSX_STD_INCDIR $JAVAINCDIR";; *);; esac for d in $JAVAINCDIR ; do if test -r "$d/jni.h" ; then JAVAINCDIR=$d JAVAINC=-I\"$d\" break fi done fi else if test -r "$JAVAINCDIR/jni.h" ; then JAVAINC=-I\"$JAVAINCDIR\" fi fi if test "$JAVAINC" = "" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($JAVAINC) # now look for /jni_md.h AC_MSG_CHECKING(for java include file jni_md.h) JAVAMDDIR=`find "$JAVAINCDIR" -follow -name jni_md.h -print` if test "$JAVAMDDIR" = "" ; then AC_MSG_RESULT(not found) else JAVAMDDIR=-I\"`dirname "$JAVAMDDIR" | tail -1`\" AC_MSG_RESULT($JAVAMDDIR) JAVAINC="${JAVAINC} ${JAVAMDDIR}" fi fi case $host in *-*-cygwin*) # TODO: Only use this flag if the compiler supports it, later versions of gcc no longer have it GCC_MNO_CYGWIN=" -mno-cygwin" ;; *) GCC_MNO_CYGWIN="" ;; esac # java.exe on Cygwin requires the Windows standard (Pascal) calling convention as it is a normal Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then JAVADYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" JAVACFLAGS="$GCC_MNO_CYGWIN -mthreads" else JAVADYNAMICLINKING="" JAVACFLAGS="" fi ;; *-*-darwin*) JAVADYNAMICLINKING="-dynamiclib -framework JavaVM" JAVACFLAGS="" ;; *) JAVADYNAMICLINKING="" JAVACFLAGS="" ;; esac # Java on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) JAVALIBRARYPREFIX="";; *)JAVALIBRARYPREFIX="lib";; esac # Java on Mac OS X tweaks case $host in *-*-darwin*) JAVASO=".jnilib" JAVALDSHARED='$(CC)' JAVACXXSHARED='$(CXX)' ;; *) JAVASO=$SO JAVALDSHARED='$(LDSHARED)' JAVACXXSHARED='$(CXXSHARED)' ;; esac fi # Quote for spaces in path to executables if test -n "$JAVA"; then JAVA=\"$JAVA\" fi if test -n "$JAVAC"; then JAVAC=\"$JAVAC\" fi # Turned off due to spurious warnings in later versions of openjdk-1.8 # JAVAFLAGS=-Xcheck:jni AC_SUBST(JAVA) AC_SUBST(JAVAC) AC_SUBST(JAVAINC) AC_SUBST(JAVADYNAMICLINKING) AC_SUBST(JAVALIBRARYPREFIX) AC_SUBST(JAVASO) AC_SUBST(JAVALDSHARED) AC_SUBST(JAVACXXSHARED) AC_SUBST(JAVAFLAGS) AC_SUBST(JAVACFLAGS) #---------------------------------------------------------------- # Look for Javascript #---------------------------------------------------------------- AC_ARG_WITH(javascript, AS_HELP_STRING([--without-javascript], [Disable Javascript]), [with_javascript="$withval"], [with_javascript="$alllang_default"]) # First, check for "--without-javascript" or "--with-javascript=no". if test x"${with_javascript}" = xno; then AC_MSG_NOTICE([Disabling Javascript]) JAVASCRIPT= else JAVASCRIPT=1 #---------------------------------------------------------------- # General Javascript settings shared by JSC and V8 #---------------------------------------------------------------- case $host in *-*-darwin*) JSSO=".dylib" # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter JSINTERPRETERCXX='c++' JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names' ;; *) JSSO=$SO JSINTERPRETERCXX='$(CXX)' JSINTERPRETERLINKFLAGS='-ldl' ;; esac #---------------------------------------------------------------- # Look for Node.js which is the default Javascript engine #---------------------------------------------------------------- AC_CHECK_PROGS(NODEJS, [nodejs node]) if test -n "$NODEJS"; then # node-gyp is needed to run the test-suite/examples AC_CHECK_PROGS(NODEGYP, node-gyp) if test -z "$NODEGYP"; then NODEJS= fi fi #---------------------------------------------------------------- # Look for JavascriptCore (Webkit) settings (JSCOREINCDIR, JSCOREDYNAMICLINKING) #---------------------------------------------------------------- # check for include files AC_MSG_CHECKING(for JavaScriptCore/JavaScript.h) AC_ARG_WITH(jscoreinc, [ --with-jscinc=path Set location of Javascript include directory], [JSCOREINCDIR="$withval"], [JSCOREINCDIR=]) JSCOREVERSION= if test -z "$JSCOREINCDIR"; then JSCOREINCDIR="/usr/include/ /usr/local/include/" # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSCOREINCDIR="/usr/include/webkit-1.0/ /usr/include/webkitgtk-1.0/ /usr/local/include/webkit-1.0/JavaScriptCore/ $JSCOREINCDIR" ;; *-*-darwin*) JSCOREINCDIR="/System/Library/Frameworks/JavaScriptCore.framework/Headers/ $JSCOREINCDIR" ;; *) ;; esac fi for d in $JSCOREINCDIR ; do if test -r "$d/JavaScriptCore/JavaScript.h" || test -r "$d/JavaScript.h" ; then AC_MSG_RESULT($d) JSCOREINCDIR=$d JSCOREINC=-I\"$d\" break fi done if test "$JSCOREINC" = "" ; then AC_MSG_RESULT(not found) fi # check for JavaScriptCore/Webkit libraries AC_ARG_WITH(jscorelib,[ --with-jsclib=path Set location of the JavaScriptCore/Webkit library directory],[JSCORELIB="-L$withval"], [JSCORELIB=]) if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then AC_MSG_CHECKING(for JavaScriptCore/Webkit library) if pkg-config javascriptcoregtk-1.0; then JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0` JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0` fi if test -z "$JSCORELIB"; then AC_MSG_RESULT(not found) JSCENABLED= else AC_MSG_RESULT([$JSCORELIB]) JSCOREDYNAMICLINKING="$JSCORELIB" JSCENABLED=1 fi fi #---------------------------------------------------------------- # Look for V8 settings (JSV8INCDIR, JSV8DYNAMICLINKING) #---------------------------------------------------------------- # check for include files AC_MSG_CHECKING(for V8 Javascript v8.h) AC_ARG_WITH(jsv8inc, [ --with-jsv8inc=path Set location of Javascript v8 include directory], [JSV8INCDIR="$withval"]) # if not include dir is specified we try to find if test -z "$JSV8INCDIR"; then # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSV8INCDIR="/usr/include /usr/local/include/ $JSV8INCDIR" ;; *-*-darwin*) JSV8INCDIR="$JSV8INCDIR" ;; *) ;; esac fi for d in $JSV8INCDIR ; do if test -r "$d/v8.h" ; then JSV8INCDIR=$d JSV8INC=-I\"$d\" break fi done if test "$JSV8INC" = "" ; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($JSV8INCDIR) fi # check for V8 library AC_MSG_CHECKING(for V8 Javascript library) AC_ARG_WITH(jsv8lib,[ --with-jsv8lib=path Set location of V8 Javascript library directory],[JSV8LIBDIR="$withval"], [JSV8LIB=]) v8libdirs="$JSV8LIBDIR /usr/lib64/ /usr/local/lib64/ /usr/lib/ /usr/local/lib/" for d in $v8libdirs ; do if test -r $d/libv8$JSSO; then JSV8LIBDIR=$d JSV8LIB="-L$d -lv8" break fi done if test "$JSV8LIB" = "" ; then AC_MSG_RESULT(not found) JSV8ENABLED= else AC_MSG_RESULT($JSV8LIBDIR) JSV8ENABLED=1 fi # linking options case $host in *-*-darwin*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *-*-linux*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *) JSV8DYNAMICLINKING="" ;; esac fi AC_SUBST(JSINTERPRETERCXX) AC_SUBST(JSINTERPRETERLINKFLAGS) AC_SUBST(JSCOREINC) AC_SUBST(JSCOREDYNAMICLINKING) AC_SUBST(JSCOREVERSION) AC_SUBST(JSV8INC) AC_SUBST(JSV8DYNAMICLINKING) AC_SUBST(JSCENABLED) AC_SUBST(JSV8ENABLED) AC_SUBST(NODEJS) AC_SUBST(NODEGYP) #---------------------------------------------------------------- # Look for gcj #---------------------------------------------------------------- AC_ARG_WITH(gcj, AS_HELP_STRING([--without-gcj], [Disable GCJ]) AS_HELP_STRING([--with-gcj=path], [Set location of gcj executable]),[GCJBIN="$withval"], [GCJBIN="$alllang_default"]) AC_ARG_WITH(gcjh, [ --with-gcjh=path Set location of gcjh executable],[GCJHBIN="$withval"], [GCJHBIN=]) # First, check for "--without-gcj" or "--with-gcj=no". if test x"${GCJBIN}" = xno; then AC_MSG_NOTICE([Disabling GCJ]) else if test "x$GCJBIN" = xyes; then AC_CHECK_PROGS(GCJ, gcj) else GCJ="$GCJBIN" fi if test -z "$GCJCBIN"; then AC_CHECK_PROGS(GCJH, gcjh) else GCJH="$GCJHBIN" fi fi AC_SUBST(GCJ) AC_SUBST(GCJH) #---------------------------------------------------------------- # Look for Android #---------------------------------------------------------------- AC_ARG_WITH(android, AS_HELP_STRING([--without-android], [Disable Android]) AS_HELP_STRING([--with-android=path], [Set location of android executable]),[ANDROIDBIN="$withval"], [ANDROIDBIN="$alllang_default"]) AC_ARG_WITH(adb, [ --with-adb=path Set location of adb executable - Android Debug Bridge],[ADBBIN="$withval"], [ADBBIN=]) AC_ARG_WITH(ant, [ --with-ant=path Set location of ant executable for Android],[ANTBIN="$withval"], [ANTBIN=]) AC_ARG_WITH(ndk-build, [ --with-ndk-build=path Set location of Android ndk-build executable],[NDKBUILDBIN="$withval"], [NDKBUILDBIN=]) # First, check for "--without-android" or "--with-android=no". if test x"${ANDROIDBIN}" = xno; then AC_MSG_NOTICE([Disabling Android]) ANDROID= else if test "x$ANDROIDBIN" = xyes; then AC_CHECK_PROGS(ANDROID, android) else ANDROID="$ANDROIDBIN" fi if test -z "$ADBBIN"; then AC_CHECK_PROGS(ADB, adb) else ADB="$ADBBIN" fi if test -z "$ANTBIN"; then AC_CHECK_PROGS(ANT, ant) else ANT="$ANTBIN" fi if test -z "$NDKBUILDBIN"; then AC_CHECK_PROGS(NDKBUILD, ndk-build) else NDKBUILD="$NDKBUILDBIN" fi fi AC_SUBST(ANDROID) AC_SUBST(ADB) AC_SUBST(ANT) AC_SUBST(NDKBUILD) #---------------------------------------------------------------- # Look for Guile #---------------------------------------------------------------- GUILE= GUILE_CFLAGS= GUILE_LIBS= AC_ARG_WITH(guile-config, AS_HELP_STRING([--without-guile], [Disable Guile]) AS_HELP_STRING([--with-guile-config=path], [Set location of guile-config]),[ GUILE_CONFIG="$withval"], [GUILE_CONFIG=]) AC_ARG_WITH(guile,[ --with-guile=path Set location of Guile executable],[ GUILE="$withval"], [GUILE="$alllang_default"]) AC_ARG_WITH(guile-cflags,[ --with-guile-cflags=cflags Set cflags required to compile against Guile],[ GUILE_CFLAGS="$withval"]) AC_ARG_WITH(guile-libs,[ --with-guile-libs=ldflags Set ldflags needed to link with Guile],[ GUILE_LIBS="$withval"]) # First, check for "--without-guile" or "--with-guile=no". if test x"${GUILE}" = xno; then AC_MSG_NOTICE([Disabling Guile]) else if test -z "$GUILE_CONFIG" ; then AC_PATH_PROG(GUILE_CONFIG, guile-config) fi if test -n "$GUILE_CONFIG" ; then if test x"$GUILE" = xyes; then AC_MSG_CHECKING([for guile bindir]) guile_bindir="`$GUILE_CONFIG info bindir`" AC_MSG_RESULT([$guile_bindir]) GUILE=$guile_bindir/guile if ! test -f "$GUILE" ; then GUILE= AC_PATH_PROG(GUILE, guile) fi fi if test -f "$GUILE" ; then AC_MSG_CHECKING([for guile version]) guile_version=`$GUILE -c '(display (effective-version))'` AC_MSG_RESULT([$guile_version]) AC_MSG_CHECKING([for guile version >= 1.8]) guile_good_version=`$GUILE -c '(if (>= (string->number (effective-version)) 1.8) (display "yes") (display "no"))'` AC_MSG_RESULT([$guile_good_version]) if test x"$guile_good_version" != xyes ; then GUILE= fi fi if test -z "$GUILE_CFLAGS" ; then AC_MSG_CHECKING([for guile compile flags]) GUILE_CFLAGS="`$GUILE_CONFIG compile`" # Note that this can sometimes be empty AC_MSG_RESULT([$GUILE_CFLAGS]) fi if test -z "$GUILE_LIBS" ; then AC_MSG_CHECKING([for guile link flags]) GUILE_LIBS="`$GUILE_CONFIG link`" AC_MSG_RESULT([$GUILE_LIBS]) fi fi fi AC_SUBST(GUILE) AC_SUBST(GUILE_CFLAGS) AC_SUBST(GUILE_LIBS) #---------------------------------------------------------------- # Look for MzScheme #---------------------------------------------------------------- AC_ARG_WITH(mzscheme, AS_HELP_STRING([--without-mzscheme], [Disable MzScheme]) AS_HELP_STRING([--with-mzscheme=path], [Set location of MzScheme executable]),[ MZSCHEMEBIN="$withval"], [MZSCHEMEBIN="$alllang_default"]) AC_ARG_WITH(mzc, AS_HELP_STRING([--with-mzc=path], [Set location of MzScheme's mzc]), [ MZCBIN="$withval"], [MZCBIN=]) # First, check for "--without-mzscheme" or "--with-mzscheme=no". if test x"${MZSCHEMEBIN}" = xno; then AC_MSG_NOTICE([Disabling MzScheme]) MZC= else if test "x$MZSCHEMEBIN" = xyes; then AC_PATH_PROG(MZSCHEME, mzscheme) else MZSCHEME="$MZSCHEMEBIN" fi if test -z "$MZCBIN"; then AC_PATH_PROG(MZC, mzc) fi if test -n "$MZSCHEME"; then AC_MSG_CHECKING(for MzScheme dynext object) MZDYNOBJ=`$MZSCHEME --eval '(begin (require dynext/link) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (printf "~a" x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` if test -f "$MZDYNOBJ"; then : else # older versions (3.72 approx and earlier) MZDYNOBJ=`$MZSCHEME --mute-banner --version --eval '(begin (require (lib "link.ss" "dynext")) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x) (display " ")) ((current-make-standard-link-libraries)))) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` fi if test -f "$MZDYNOBJ"; then AC_MSG_RESULT($MZDYNOBJ) else AC_MSG_RESULT(not found) MZDYNOBJ="" fi fi fi AC_SUBST(MZDYNOBJ) #---------------------------------------------------------------- # Look for Ruby #---------------------------------------------------------------- RUBYBIN= AC_ARG_WITH(ruby, AS_HELP_STRING([--without-ruby], [Disable Ruby]) AS_HELP_STRING([--with-ruby=path], [Set location of Ruby executable]),[ RUBYBIN="$withval"], [RUBYBIN="$alllang_default"]) # First, check for "--without-ruby" or "--with-ruby=no". RUBYSO=$SO if test x"${RUBYBIN}" = xno; then AC_MSG_NOTICE([Disabling Ruby]) RUBY= else # First figure out what the name of Ruby is if test "x$RUBYBIN" = xyes; then AC_CHECK_PROGS(RUBY, ruby) else RUBY="$RUBYBIN" fi AC_MSG_CHECKING(for Ruby header files) if test -n "$RUBY"; then # Try Ruby1.9+ first RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["rubyhdrdir"]] || $rubyhdrdir') 2>/dev/null` RUBYARCHHDRDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["rubyarchhdrdir"]] || $rubyarchhdrdir') 2>/dev/null` if test x"$RUBYDIR" = x"" || test x"$RUBYDIR" = x"nil"; then RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["archdir"]] || $archdir') 2>/dev/null` else RUBYARCH=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["arch"]] || $arch') 2>/dev/null` fi if test x"$RUBYDIR" != x""; then dirs="$RUBYDIR" RUBYINCLUDE= for i in $dirs; do if test -r $i/ruby.h; then if test x"$RUBYARCH" = x""; then RUBYINCLUDE="-I$i" elif test -n "$RUBYARCHHDRDIR"; then RUBYINCLUDE="-I$i -I$RUBYARCHHDRDIR" else RUBYINCLUDE="-I$i -I$i/$RUBYARCH" fi AC_MSG_RESULT($RUBYINCLUDE) break fi done if test x"$RUBYINCLUDE" = x""; then AC_MSG_RESULT(could not locate ruby.h) fi # Find library and path for linking. AC_MSG_CHECKING(for Ruby library) RUBYLIB="" rb_archlibdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["archlibdir"]]') 2>/dev/null` rb_libdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["libdir"]]') 2>/dev/null` rb_bindir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["bindir"]]') 2>/dev/null` dirs="$dirs $rb_archlibdir $rb_libdir $rb_bindir" rb_libruby=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBRUBY_A"]]') 2>/dev/null` RUBYLINK=`($RUBY -rrbconfig -e ' c = RbConfig::CONFIG if c.has_key? "LIBRUBYARG_STATIC" # 1.8.x if c[["LIBRUBY"]] == c[["LIBRUBY_A"]] link = c[["LIBRUBYARG_STATIC"]] else link = c[["LIBRUBYARG_SHARED"]] end else # 1.6.x link = "-l" + c[["RUBY_INSTALL_NAME"]] end # Get the target Ruby was built for target = c[["target"]] if target == "i386-pc-mswin32" # Need to change msvcrt-ruby*.lib to -lmsvcrt-ruby* ext = File.extname(link) # Get index that counts backwards from end of string index = -1 - ext.size # Strip off the extension link = link.slice(0..index) puts "-l#{link}" else puts link end') 2>/dev/null` if test "$rb_libruby" != ""; then for i in $dirs; do if (test -r $i/$rb_libruby;) then RUBYLIB="$i" break fi done fi if test "$RUBYLIB" = ""; then RUBYLIB="$RUBYDIR" AC_MSG_RESULT(not found... using $RUBYDIR) else AC_MSG_RESULT($RUBYLINK in $RUBYLIB) fi else AC_MSG_RESULT(unable to determine ruby configuration) fi case $host in *-*-mingw*) ;; # do nothing, the default windows libraries are already included *) RUBYLINK="$RUBYLINK `($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["LIBS"]]') 2>/dev/null`";; esac RUBYCCDLFLAGS=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["CCDLFLAGS"]]') 2>/dev/null` RUBYSO=.`($RUBY -rrbconfig -e 'print RbConfig::CONFIG[["DLEXT"]]') 2>/dev/null` else AC_MSG_RESULT(could not figure out how to run ruby) fi case $host in *-*-cygwin* | *-*-mingw*) RUBYDYNAMICLINKING="-L$RUBYLIB $RUBYLINK";; *) RUBYDYNAMICLINKING="";; esac fi AC_SUBST(RUBYINCLUDE) AC_SUBST(RUBYLIB) AC_SUBST(RUBYLINK) AC_SUBST(RUBYCCDLFLAGS) AC_SUBST(RUBYSO) AC_SUBST(RUBYDYNAMICLINKING) #------------------------------------------------------------------------- # Look for PHP5 #------------------------------------------------------------------------- PHP5BIN= AC_ARG_WITH(php5, AS_HELP_STRING([--without-php5], [Disable PHP5]) AS_HELP_STRING([--with-php5=path], [Set location of PHP5 executable]),[ PHP5BIN="$withval"], [PHP5BIN="$alllang_default"]) # First, check for "--without-php5" or "--with-php5=no". if test x"${PHP5BIN}" = xno; then AC_MSG_NOTICE([Disabling PHP5]) PHP5= else if test "x$PHP5BIN" = xyes; then AC_CHECK_PROGS(PHP5, [php5 php]) else PHP5=$PHP5BIN fi if test -n "$PHP5"; then AC_MSG_CHECKING(for PHP5 header files) dnl /usr/bin/php5 -> /usr/bin/php-config5 case $PHP5 in *5) PHP5CONFIG=`echo "$PHP5"|sed 's/5$/-config5/'` ;; *) PHP5CONFIG=$PHP5-config ;; esac php5_version=`$PHP5CONFIG --version 2>/dev/null` case $php5_version in 5*) PHP5INC=`$PHP5CONFIG --includes 2>/dev/null` if test -n "$PHP5INC"; then AC_MSG_RESULT($PHP5INC) else AC_MSG_RESULT(not found) fi ;; "") AC_MSG_RESULT([could not find $PHP5CONFIG or obtain PHP5 version from it]) ;; *) AC_MSG_RESULT([found PHP $php_version - not PHP 5]) ;; esac fi fi AC_SUBST(PHP5) AC_SUBST(PHP5INC) #------------------------------------------------------------------------- # Look for PHP7 #------------------------------------------------------------------------- PHPBIN= AC_ARG_WITH(php, AS_HELP_STRING([--without-php], [Disable PHP]) AS_HELP_STRING([--with-php=path], [Set location of PHP executable]),[ PHPBIN="$withval"], [PHPBIN="$alllang_default"]) # First, check for "--without-php" or "--with-php=no". if test x"${PHPBIN}" = xno; then AC_MSG_NOTICE([Disabling PHP]) PHP= else if test "x$PHPBIN" = xyes; then AC_CHECK_PROGS(PHP, [php7.1 php7.0 php]) else PHP=$PHPBIN fi if test -n "$PHP"; then AC_MSG_CHECKING(for PHP header files) dnl /usr/bin/php7.0 -> /usr/bin/php-config7.0 case $PHP in *7.*) PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;; *) PHPCONFIG=$PHP-config ;; esac php_version=`$PHPCONFIG --version 2>/dev/null` case $php_version in 7.*) PHPINC=`$PHPCONFIG --includes 2>/dev/null` if test -n "$PHPINC"; then AC_MSG_RESULT($PHPINC) else AC_MSG_RESULT(not found) fi ;; "") AC_MSG_RESULT([could not find $PHPCONFIG or obtain PHP version from it]) ;; *) AC_MSG_RESULT([found PHP $php_version - not PHP 7]) ;; esac fi fi AC_SUBST(PHP) AC_SUBST(PHPINC) #---------------------------------------------------------------- # Look for ocaml #---------------------------------------------------------------- AC_ARG_WITH(ocaml, AS_HELP_STRING([--without-ocaml], [Disable OCaml]), [with_ocaml="$withval"], [with_ocaml="$alllang_default"]) AC_ARG_WITH(ocamlc,[ --with-ocamlc=path Set location of ocamlc executable],[ OCAMLC="$withval"], [OCAMLC=]) AC_ARG_WITH(ocamldlgen,[ --with-ocamldlgen=path Set location of ocamldlgen],[ OCAMLDLGEN="$withval" ], [OCAMLDLGEN=]) AC_ARG_WITH(ocamlfind,[ --with-ocamlfind=path Set location of ocamlfind],[OCAMLFIND="$withval"],[OCAMLFIND=]) AC_ARG_WITH(ocamlmktop,[ --with-ocamlmktop=path Set location of ocamlmktop executable],[ OCAMLMKTOP="$withval"], [OCAMLMKTOP=]) AC_ARG_WITH(camlp4,[ --with-camlp4=path Set location of camlp4 executable],[ CAMLP4="$withval"], [CAMLP4=]) # First, check for "--without-ocaml" or "--with-ocaml=no". if test x"${with_ocaml}" = xno; then AC_MSG_NOTICE([Disabling OCaml]) OCAMLC= else AC_MSG_CHECKING(for Ocaml DL load generator) if test -z "$OCAMLDLGEN"; then AC_CHECK_PROGS(OCAMLDLGEN, ocamldlgen) fi AC_MSG_CHECKING(for Ocaml package tool) if test -z "$OCAMLFIND"; then AC_CHECK_PROGS(OCAMLFIND, ocamlfind) fi AC_MSG_CHECKING(for Ocaml compiler) if test -z "$OCAMLC"; then AC_CHECK_PROGS(OCAMLC, ocamlc) fi AC_MSG_CHECKING(for Ocaml toplevel creator) if test -z "$OCAMLMKTOP"; then AC_CHECK_PROGS(OCAMLMKTOP, ocamlmktop) fi AC_MSG_CHECKING(for Ocaml Pre-Processor-Pretty-Printer) if test -z "$CAMLP4"; then AC_CHECK_PROGS(CAMLP4, camlp4) fi fi # Disabling ocaml AC_SUBST(OCAMLC) AC_SUBST(OCAMLDLGEN) AC_SUBST(OCAMLFIND) AC_SUBST(OCAMLMKTOP) AC_SUBST(CAMLP4) #---------------------------------------------------------------- # Look for Pike #---------------------------------------------------------------- # Identify the name of the Pike executable # Priority: configure option, automatic search PIKEBIN= AC_ARG_WITH(pike, AS_HELP_STRING([--without-pike], [Disable Pike]) AS_HELP_STRING([--with-pike=path], [Set location of Pike executable]),[PIKEBIN="$withval"], [PIKEBIN="$alllang_default"]) # First, check for "--without-pike" or "--with-pike=no". if test x"${PIKEBIN}" = xno; then AC_MSG_NOTICE([Disabling Pike]) PIKEBIN= else if test "x$PIKEBIN" = xyes; then AC_CHECK_PROGS(PIKE, pike pike7.8 pike7.6 pike7.4 pike7.2) else PIKE="$PIKEBIN" fi # Check for pike-config # Priority: configure option, guessed from $PIKE, search from list AC_ARG_WITH(pike-config, AS_HELP_STRING([--with-pike-config=path], [Set location of pike-config script]), [PIKECONFIG="$withval"], [PIKECONFIG=""]) if test -z "$PIKECONFIG" -a -n "$PIKE"; then AC_CHECK_PROGS(PIKECONFIG, $PIKE-config pike-config \ pike7.6-config pike7.4-config pike7.2-config) fi # Check for a --with-pikeincl option to configure # Priority: configure option, info from $PIKECONFIG, guessed by pike script AC_ARG_WITH(pikeincl, AS_HELP_STRING([--with-pikeincl=path], [Set location of Pike include directory]), [PIKEINCLUDE="-I$withval"], [PIKEINCLUDE=]) if test -n "$PIKE"; then AC_MSG_CHECKING([for Pike header files]) if test -z "$PIKEINCLUDE" -a -n "$PIKECONFIG"; then PIKEINCLUDE=`$PIKECONFIG --cflags` fi if test -z "$PIKEINCLUDE" -a -n "$PIKE"; then PIKEINCLUDE=`$PIKE -x cflags` if test -z "$PIKEINCLUDE"; then PIKEPATH=`which $PIKE` PIKEINCLUDE=`$PIKE Tools/check-include-path.pike $PIKEPATH` PIKEINCLUDE="-I$PIKEINCLUDE" fi fi if test -z "$PIKEINCLUDE"; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($PIKEINCLUDE) fi fi fi AC_SUBST(PIKEINCLUDE) AC_SUBST(PIKECCDLFLAGS) dnl XXX: where is this used/defined? AC_SUBST(PIKEDYNAMICLINKING) dnl XXX: where is this used/defined? #---------------------------------------------------------------- # Look for CHICKEN #---------------------------------------------------------------- CHICKEN= CHICKEN_CONFIG= CHICKENHOME= CHICKENOPTS= CHICKENLIB= AC_ARG_WITH(chicken, AS_HELP_STRING([--without-chicken], [Disable CHICKEN]) AS_HELP_STRING([--with-chicken=path], [Set location of CHICKEN executable]),[ CHICKENBIN="$withval"], [CHICKENBIN="$alllang_default"]) # First, check for "--without-chicken" or "--with-chicken=no". if test x"${CHICKENBIN}" = xno; then AC_MSG_NOTICE([Disabling CHICKEN]) else if test "x$CHICKENBIN" = xyes; then AC_CHECK_PROGS(CHICKEN, chicken) else CHICKEN="$CHICKENBIN" fi AC_ARG_WITH(chickencsc,[ --with-chickencsc=path Set location of csc executable],[ CHICKEN_CSC="$withval"], [CHICKEN_CSC=]) if test -z "$CHICKEN_CSC"; then AC_CHECK_PROGS(CHICKEN_CSC, csc) # Both the Microsoft C# compiler and chicken have an executable called csc, so check that this csc is really the chicken one if test -n "$CHICKEN_CSC" ; then AC_MSG_CHECKING(whether csc is the chicken compiler) $CHICKEN_CSC -version 2>/dev/null | grep "chicken" > /dev/null || CHICKEN_CSC="" if test -z "$CHICKEN_CSC"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi fi fi AC_ARG_WITH(chickencsi,[ --with-chickencsi=path Set location of csi executable],[ CHICKEN_CSI="$withval"], [CHICKEN_CSI=]) if test -z "$CHICKEN_CSI"; then AC_CHECK_PROGS(CHICKEN_CSI, csi) fi if test -n "$CHICKEN_CSC" ; then AC_ARG_WITH(chickenopts,[ --with-chickenopts=args Set compiler options for static CHICKEN generated code],[ CHICKENOPTS="$withval"], [CHICKENOPTS=]) AC_ARG_WITH(chickensharedlib,[ --with-chickensharedlib=args Set linker options for shared CHICKEN generated code],[ CHICKENSHAREDLIB="$withval"], [CHICKENSHAREDLIB=]) AC_ARG_WITH(chickenlib,[ --with-chickenlib=args Set linker options for static CHICKEN generated code],[ CHICKENLIB="$withval"], [CHICKENLIB=]) AC_MSG_CHECKING(for compiler options for static CHICKEN generated code) if test -z "$CHICKENOPTS"; then CHICKENOPTS="`$CHICKEN_CSC -cflags`" else CHICKENOPTS="`$CHICKEN_CSC -cflags` $CHICKENOPTS" fi if test -z "$CHICKENOPTS"; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($CHICKENOPTS) fi AC_MSG_CHECKING(for linker options for shared CHICKEN generated code) if test -z "$CHICKENSHAREDLIB"; then CHICKENSHAREDLIB="`$CHICKEN_CSC -shared -libs`" else CHICKENSHAREDLIB="`$CHICKEN_CSC -shared -libs` $CHICKENSHAREDLIB" fi if test -z "$CHICKENSHAREDLIB"; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($CHICKENSHAREDLIB) fi AC_MSG_CHECKING(for linker options for static CHICKEN generated code) if test -z "$CHICKENLIB"; then CHICKENLIB="`$CHICKEN_CSC -libs`" else CHICKENLIB="`$CHICKEN_CSC -libs` $CHICKENLIB" fi if test -z "$CHICKENLIB"; then AC_MSG_RESULT(not found) else AC_MSG_RESULT($CHICKENLIB) fi fi # have CHICKEN_CONFIG fi # Check for --without-chicken AC_SUBST(CHICKEN) AC_SUBST(CHICKEN_CSC) AC_SUBST(CHICKEN_CSI) AC_SUBST(CHICKENOPTS) AC_SUBST(CHICKENLIB) AC_SUBST(CHICKENSHAREDLIB) #---------------------------------------------------------------- # Look for C# #---------------------------------------------------------------- AC_ARG_WITH(csharp, AS_HELP_STRING([--without-csharp], [Disable CSharp]), [with_csharp="$withval"], [with_csharp="$alllang_default"]) AC_ARG_WITH(cil-interpreter, [ --with-cil-interpreter=path Set location of CIL interpreter for CSharp],[CSHARPBIN="$withval"], [CSHARPBIN=]) AC_ARG_WITH(csharp-compiler, [ --with-csharp-compiler=path Set location of CSharp compiler],[CSHARPCOMPILERBIN="$withval"], [CSHARPCOMPILERBIN=]) # First, check for "--without-csharp" or "--with-csharp=no". if test x"${with_csharp}" = xno; then AC_MSG_NOTICE([Disabling CSharp]) CSHARPCOMPILER= else if test -z "$CSHARPCOMPILERBIN" ; then case $host in *-*-cygwin* | *-*-mingw*) # prefer Mono gmcs (.NET 2.0) over mcs (.NET 1.1) - note mcs-1.2.3 has major pinvoke bug AC_CHECK_PROGS(CSHARPCOMPILER, csc mono-csc gmcs mcs cscc) if test -n "$CSHARPCOMPILER" && test "$CSHARPCOMPILER" = "csc" ; then AC_MSG_CHECKING(whether csc is the Microsoft CSharp compiler) csc 2>/dev/null | grep "C#" > /dev/null || CSHARPCOMPILER="" if test -z "$CSHARPCOMPILER" ; then AC_MSG_RESULT(no) AC_CHECK_PROGS(CSHARPCOMPILER, mono-csc gmcs mcs cscc) else AC_MSG_RESULT(yes) fi fi ;; *)AC_CHECK_PROGS(CSHARPCOMPILER, mono-csc gmcs mcs cscc);; esac else CSHARPCOMPILER="$CSHARPCOMPILERBIN" fi CSHARPCONVERTPATH="Tools/convertpath -u" if test -z "$CSHARPBIN" ; then CSHARPCILINTERPRETER="" CSHARPCILINTERPRETER_FLAGS="" if test "cscc" = "$CSHARPCOMPILER" ; then AC_CHECK_PROGS(CSHARPCILINTERPRETER, ilrun) else if test "mcs" = "$CSHARPCOMPILER"; then # Check that mcs is the C# compiler and not the Unix mcs utility by examining the output of 'mcs --version' # The Mono compiler should emit: Mono C# compiler version a.b.c.d csharp_version_raw=`(mcs --version) 2>/dev/null` csharp_version_searched=`(mcs --version | sed -e "/C#/b" -e "/Mono/b" -e d) 2>/dev/null` # return string if contains 'Mono' or 'C#' CSHARPCOMPILER="" if test -n "$csharp_version_raw" ; then if test "$csharp_version_raw" = "$csharp_version_searched" ; then CSHARPCOMPILER="mcs" fi fi if test "mcs" != "$CSHARPCOMPILER" ; then echo "mcs is not a working Mono C# compiler" fi fi if test "mcs" = "$CSHARPCOMPILER" || test "gmcs" = "$CSHARPCOMPILER" || test "mono-csc" = "$CSHARPCOMPILER"; then AC_CHECK_PROGS(CSHARPCILINTERPRETER, mono) # Mono JIT CSHARPCILINTERPRETER_FLAGS="--debug" else if test "csc" = "$CSHARPCOMPILER"; then CSHARPCONVERTPATH="Tools/convertpath -w" fi fi fi else CSHARPCILINTERPRETER="$CSHARPBIN" fi # Cygwin requires the Windows standard (Pascal) calling convention as it is a Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then CSHARPDYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" CSHARPCFLAGS="$GCC_MNO_CYGWIN -mthreads" else CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" fi ;; *) CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" ;; esac # CSharp on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) CSHARPLIBRARYPREFIX="";; *)CSHARPLIBRARYPREFIX="lib";; esac # C#/Mono on Mac OS X tweaks case $host in *-*-darwin*) CSHARPSO=".so" ;; *) CSHARPSO=$SO ;; esac fi AC_SUBST(CSHARPCILINTERPRETER_FLAGS) AC_SUBST(CSHARPCILINTERPRETER) AC_SUBST(CSHARPCONVERTPATH) AC_SUBST(CSHARPCOMPILER) AC_SUBST(CSHARPDYNAMICLINKING) AC_SUBST(CSHARPLIBRARYPREFIX) AC_SUBST(CSHARPCFLAGS) AC_SUBST(CSHARPSO) #---------------------------------------------------------------- # Look for Lua #---------------------------------------------------------------- LUABIN= LUAINCLUDE= LUALIB= LUADYNAMICLOADLIB= LUAFLAGS= LUALINK= # note: if LUABIN is empty then lua tests will not be done # LUABIN will be cleared if certain dependencies cannot be found AC_ARG_WITH(lua, AS_HELP_STRING([--without-lua], [Disable Lua]) AS_HELP_STRING([--with-lua=path], [Set location of Lua executable]),[ LUABIN="$withval"], [LUABIN="$alllang_default"]) AC_ARG_WITH(luaincl,[ --with-luaincl=path Set location of Lua include directory],[ LUAINCLUDE="$withval"], [LUAINCLUDE=]) AC_ARG_WITH(lualib,[ --with-lualib=path Set location of Lua library directory],[ LUALIB="$withval"], [LUALIB=]) # First, check for "--without-lua" or "--with-lua=no". if test x"${LUABIN}" = xno; then AC_MSG_NOTICE([Disabling Lua]) else # can we find lua? if test "x$LUABIN" = xyes; then # We look for a versioned Lua binary first, as there can be # multiple versions of Lua installed on some systems (like Debian). # The search order should match the include-file and library search # orders below (a Lua shared library built for one version may not # work with a Lua binary of a different version). AC_PATH_PROGS(LUABIN, [lua5.4 lua5.3 lua5.2 lua5.1 lua]) fi # check version: we need Lua 5.x if test "$LUABIN"; then AC_MSG_CHECKING(Lua version) # if version 5.x LUAV5=`$LUABIN -e 'if string.sub(_VERSION,5,5)=="5" then print "1" end'` # if not version 5.0 LUAV51=`$LUABIN -e 'if string.sub(_VERSION,5,7)~="5.0" then print "1" end'` if test -z "$LUAV5"; then AC_MSG_WARN(Not Lua 5.x, SWIG does not support this version of Lua) LUABIN="" elif test -z "$LUAV51"; then AC_MSG_RESULT(Lua 5.0.x) else AC_MSG_RESULT(Lua 5.1 or later) fi fi if test "$LUABIN"; then AC_MSG_CHECKING(whether Lua dynamic loading is enabled) # using Lua to check Lua # lua 5.0 & 5.1 have different fn names if test -z "$LUAV51"; then LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=loadlib("no_such_lib","") if c~="absent" then print "1" end'` else LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=package.loadlib("no_such_lib","") if c~="absent" then print "1" end'` fi if test -z "$LUADYNAMICLOADLIB"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi # look for the header files & set LUAFLAGS accordingly # will clear LUABIN if not present if test -n "$LUAINCLUDE"; then AC_CHECK_FILE($LUAINCLUDE/lua.h,[LUAFLAGS="$ISYSTEM$LUAINCLUDE"],[LUABIN=]) else LUA_OK="1" CFLAGS_SAVED=$CFLAGS CFLAGS= # Use empty CFLAGS to avoid failure: "present but cannot be compiled" AC_CHECK_HEADER([lua.h],[LUAFLAGS=""],[LUA_OK=""]) CFLAGS=$CFLAGS_SAVED # if we didn't get it, going to have to look elsewhere (the hard way) if test -z "$LUA_OK"; then AC_MSG_CHECKING(for lua.h in other locations) # note: Debian/Ubuntu seem to like /usr/include/lua5.1/lua.h # The ordering of the include directories to search should match # the ordering of libraries to search in the library test below. inc=/usr/include dirs="$inc/lua5.4 $inc/lua5.3 $inc/lua5.2 $inc/lua5.1 $inc/lua51 $inc/lua5.0 $inc/lua50 /usr/local/include" for i in $dirs; do #echo "$i" if test -r $i/lua.h; then AC_MSG_RESULT($i/lua.h) LUAFLAGS="$ISYSTEM$i" break fi done if test -z "$LUAFLAGS"; then AC_MSG_RESULT(not found) LUABIN="" # clear the bin fi fi fi # look for the library files & set LUALINK accordingly # will clear LUABIN if not present lua_save_LIBS=$LIBS # the code seems to disrupt LIBS, so saving if test -n "$LUALIB"; then AC_CHECK_FILE($LUALIB/liblua.a,[LUALINK="-L$LUALIB -llua"],[LUABIN=]) else AC_SEARCH_LIBS(lua_close, [lua lua5.4 lua5.3 lua5.2 lua5.1 lua51 lua5.0 lua50], [LUALINK="-l$ac_lib"],[LUABIN=]) fi # adding lualib for lua 5.0 if test -z "$LUAV51"; then # extra for lua 5.0 LUALINK="$LUALINK -llualib" fi LIBS=$lua_save_LIBS # restore LIBS fi fi # if not disabled AC_SUBST(LUADYNAMICLINKING) AC_SUBST(LUAFLAGS) AC_SUBST(LUALINK) AC_SUBST(LUABIN) #---------------------------------------------------------------- # Look for Allegro Common Lisp #---------------------------------------------------------------- ALLEGROCLBIN= AC_ARG_WITH(allegrocl, AS_HELP_STRING([--without-allegrocl], [Disable Allegro CL]) AS_HELP_STRING([--with-allegrocl=path], [Set location of Allegro CL executable (alisp)]),[ ALLEGROCLBIN="$withval"], [ALLEGROCLBIN="$alllang_default"]) # First, check for "--without-allegrocl" or "--with-allegrocl=no". if test x"${ALLEGROCLBIN}" = xno; then AC_MSG_NOTICE([Disabling Allegro CL]) ALLEGROCLBIN= else # can we find allegrocl? if test "x$ALLEGROCLBIN" = xyes; then AC_PATH_PROG(ALLEGROCLBIN, alisp) fi fi AC_SUBST(ALLEGROCLBIN) #---------------------------------------------------------------- # Look for GNU CLISP #---------------------------------------------------------------- CLISPBIN= AC_ARG_WITH(clisp, AS_HELP_STRING([--without-clisp], [Disable CLISP]) AS_HELP_STRING([--with-clisp=path], [Set location of CLISP executable (clisp)]),[ CLISPBIN="$withval"], [CLISPBIN="$alllang_default"]) # First, check for "--without-clisp" or "--with-clisp=no". if test x"${CLISPBIN}" = xno; then AC_MSG_NOTICE([Disabling CLISP]) CLISPBIN= else # can we find clisp? if test "x$CLISPBIN" = xyes; then AC_PATH_PROG(CLISPBIN, clisp) fi fi AC_SUBST(CLISPBIN) #---------------------------------------------------------------- # Look for GNU R #---------------------------------------------------------------- RBIN= AC_ARG_WITH(r, AS_HELP_STRING([--without-r], [Disable R]) AS_HELP_STRING([--with-r=path], [Set location of R executable (r)]),[ RBIN="$withval"], [RBIN="$alllang_default"]) # First, check for "--without-r" or "--with-r=no". if test x"${RBIN}" = xno; then AC_MSG_NOTICE([Disabling R]) RBIN= else # can we find R? if test "x$RBIN" = xyes; then AC_PATH_PROG(RBIN, R) fi fi AC_SUBST(RBIN) #---------------------------------------------------------------- # Look for Go compilers #---------------------------------------------------------------- AC_ARG_WITH(go, AS_HELP_STRING([--without-go], [Disable Go]) AS_HELP_STRING([--with-go=path], [Set location of Go compiler]),[GOBIN="$withval"], [GOBIN="$alllang_default"]) if test x"${GOBIN}" = xno; then AC_MSG_NOTICE([Disabling Go]) GO= GOC= GO1=false GO12=false GO13=false GO15=false GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= else if test "x$GOBIN" = xyes; then AC_CHECK_PROGS(GO, go) else GO="$GOBIN" fi GOGCC=false GCCGO= GO1=false GO12=false GO13=false GO15=false GOOPT= GCCGOOPT= GOVERSIONOPTION= if test -n "$GO" ; then GO1=true GOVERSIONOPTION=version go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') case "$go_version" in go1 | go1.[[01234]]*) GOC=$(sh -c "$(go env) && echo \$GOCHAR")c ;; *) GOC=compile ;; esac AC_MSG_CHECKING([whether go version is too old]) case $go_version in go1.1* | go1.0* | go1 ) AC_MSG_RESULT([yes - minimum version is 1.2]) GO= GOOPT="-intgosize 32" ;; *) AC_MSG_RESULT([no]) case "$(go env GOARCH)" in amd64 | arm64 | ppc64*) GOOPT="-intgosize 64" ;; *) GOOPT="-intgosize 32" ;; esac ;; esac case $go_version in go1.0* | go1 | go1.1*) GOOPT="$GOOPT -use-shlib" ;; go1.2*) GO12=true ;; go1.3* | go1.4*) GO13=true ;; *) GO15=true ;; esac fi AC_CHECK_PROGS(GCCGO, gccgo) if test -n "$GCCGO" ; then if $GCCGO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then AC_MSG_CHECKING([whether gccgo version is too old]) go_version=[`$GO $GOVERSIONOPTION | sed -n '1p' | sed -e 's/^.* \([0-9.]*\) *$/\1/' -e 's/[.]//g'`] if test "x$go_version" = x; then AC_MSG_RESULT([could not determine gccgo version]) GCCGO= elif test "$go_version" -lt 470; then AC_MSG_RESULT([yes - minimum version is 4.7.0]) GCCGO= else AC_MSG_RESULT([no]) if test "$go_version" -lt 480; then GCCGOOPT="-intgosize 32" else AC_CHECK_SIZEOF([void *], [4]) if test "$ac_cv_sizeof_void_p" = "8"; then GCCGOOPT="-intgosize 64" else GCCGOOPT="-intgosize 32" fi fi fi fi fi fi AC_SUBST(GOGCC) AC_SUBST(GCCGO) AC_SUBST(GO) AC_SUBST(GOC) AC_SUBST(GO1) AC_SUBST(GO12) AC_SUBST(GO13) AC_SUBST(GO15) AC_SUBST(GOOPT) AC_SUBST(GCCGOOPT) AC_SUBST(GOVERSIONOPTION) #---------------------------------------------------------------- # Look for D #---------------------------------------------------------------- AC_ARG_WITH(d, AS_HELP_STRING([--without-d], [Disable D]), [with_d="$withval"], [with_d="$alllang_default"]) AC_ARG_WITH(d1-compiler, [ --with-d1-compiler=path Set location of D1/Tango compiler (DMD compatible)],[D1COMPILERBIN="$withval"], [D1COMPILERBIN=]) AC_ARG_WITH(d2-compiler, [ --with-d2-compiler=path Set location of D2 compiler (DMD compatible)],[D2COMPILERBIN="$withval"], [D2COMPILERBIN=]) # First, check for "--without-d" or "--with-d=no". if test x"${with_d}" = xno; then AC_MSG_NOTICE([Disabling D]) D1COMPILER= D2COMPILER= else old_ac_ext=$ac_ext ac_ext=d if test -z "$D1COMPILERBIN" ; then AC_CHECK_PROGS(D1COMPILER, dmd ldmd gdmd) if test -n "$D1COMPILER" ; then AC_MSG_CHECKING(whether the D1/Tango compiler works) cat > conftest.$ac_ext <<_ACEOF import tango.io.Stdout; void main() { } _ACEOF rm -f conftest.$ac_objext AS_IF( [_AC_DO_STDERR($D1COMPILER conftest.$ac_ext) && test ! -s conftest.err && test -s conftest.$ac_objext], [AC_MSG_RESULT([yes])], [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no]) D1COMPILER=] ) rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D1COMPILER="$D1COMPILERBIN" fi if test -z "$D2COMPILERBIN" ; then AC_CHECK_PROGS(D2COMPILER, dmd gdmd) if test -n "$D2COMPILER" ; then AC_MSG_CHECKING(whether the D2 compiler works) cat > conftest.$ac_ext <<_ACEOF import std.algorithm; void main() { } _ACEOF rm -f conftest.$ac_objext AS_IF( [_AC_DO_STDERR($D2COMPILER conftest.$ac_ext) && test ! -s conftest.err && test -s conftest.$ac_objext], [AC_MSG_RESULT([yes])], [_AC_MSG_LOG_CONFTEST AC_MSG_RESULT([no]) D2COMPILER=] ) rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D2COMPILER="$D2COMPILERBIN" fi ac_ext=$old_ac_ext fi if test -n "$D1COMPILER"; then DDEFAULTVERSION=1 elif test -n "$D2COMPILER"; then DDEFAULTVERSION=2 fi # Do not prefix library file names with "lib" on Windows. case $host in *-*-cygwin* | *-*-mingw*) DLIBPREFIX="";; *)DLIBPREFIX="lib";; esac AC_SUBST(D1COMPILER) AC_SUBST(D2COMPILER) AC_SUBST(DDEFAULTVERSION) AC_SUBST(DLIBPREFIX) #---------------------------------------------------------------- # Determine which languages to use for examples/test-suite #---------------------------------------------------------------- SKIP_TCL= if test -z "$TCLINCLUDE" || test -z "$TCLLIB" ; then SKIP_TCL="1" fi AC_SUBST(SKIP_TCL) SKIP_PERL5= if test -z "$PERL" || test -z "$PERL5EXT" || test -z "$PERL5TESTMORE"; then SKIP_PERL5="1" fi AC_SUBST(SKIP_PERL5) SKIP_OCTAVE= if test -z "$OCTAVE" ; then SKIP_OCTAVE="1" fi AC_SUBST(SKIP_OCTAVE) SKIP_PYTHON= if (test -z "$PYINCLUDE" || test -z "$PYLINK") && (test -z "$PY3INCLUDE" || test -z "$PY3LINK") ; then SKIP_PYTHON="1" fi AC_SUBST(SKIP_PYTHON) SKIP_PYTHON3= if test -z "$PY3INCLUDE" || test -z "$PY3LINK" ; then SKIP_PYTHON3="1" fi AC_SUBST(SKIP_PYTHON3) SKIP_JAVA= if test -z "$JAVA" || test -z "$JAVAC" || test -z "$JAVAINC" ; then SKIP_JAVA="1" fi AC_SUBST(SKIP_JAVA) SKIP_JAVASCRIPT= if test -z "$JAVASCRIPT" || ( test -z "$NODEJS" && test -z "$JSCENABLED" && test -z "$JSV8ENABLED" ) ; then SKIP_JAVASCRIPT="1" fi AC_SUBST(SKIP_JAVASCRIPT) SKIP_GUILE= if test -z "$GUILE" || test -z "$GUILE_LIBS" ; then SKIP_GUILE="1" fi AC_SUBST(SKIP_GUILE) SKIP_MZSCHEME= if test -z "$MZC" || test -z "$MZDYNOBJ" ; then SKIP_MZSCHEME="1" fi AC_SUBST(SKIP_MZSCHEME) SKIP_RUBY= if test -z "$RUBY" || test -z "$RUBYINCLUDE" || test -z "$RUBYLIB" ; then SKIP_RUBY="1" fi AC_SUBST(SKIP_RUBY) SKIP_PHP= if test -z "$PHP" || test -z "$PHPINC" ; then SKIP_PHP="1" fi AC_SUBST(SKIP_PHP) SKIP_PHP5= if test -z "$PHP5" || test -z "$PHP5INC" ; then SKIP_PHP5="1" fi AC_SUBST(SKIP_PHP5) SKIP_OCAML= if test -z "$OCAMLC" ; then SKIP_OCAML="1" fi AC_SUBST(SKIP_OCAML) SKIP_PIKE= if test -z "$PIKE" || test -z "$PIKEINCLUDE" ; then SKIP_PIKE="1" fi AC_SUBST(SKIP_PIKE) SKIP_CHICKEN= if test -z "$CHICKEN_CSC" || test -z "$CHICKEN"; then SKIP_CHICKEN="1" fi AC_SUBST(SKIP_CHICKEN) SKIP_CSHARP= if test -z "$CSHARPCOMPILER" ; then SKIP_CSHARP="1" else if test "cscc" = "$CSHARPCOMPILER" && test -z "$CSHARPCILINTERPRETER" ; then SKIP_CSHARP="1" fi fi AC_SUBST(SKIP_CSHARP) SKIP_MODULA3="1" # Always skipped! AC_SUBST(SKIP_MODULA3) SKIP_LUA= # we need LUABIN & dynamic loading if test -z "$LUABIN" || test -z "$LUADYNAMICLOADLIB"; then SKIP_LUA="1" fi AC_SUBST(SKIP_LUA) SKIP_ALLEGROCL= if test -z "$ALLEGROCLBIN" ; then SKIP_ALLEGROCL="1" fi AC_SUBST(SKIP_ALLEGROCL) SKIP_CLISP= if test -z "$CLISPBIN" ; then SKIP_CLISP="1" fi AC_SUBST(SKIP_CLISP) SKIP_R= if test -z "$RBIN" ; then SKIP_R="1" fi AC_SUBST(SKIP_R) SKIP_CFFI= #if test -z "$CFFIBIN" ; then SKIP_CFFI="1" #fi AC_SUBST(SKIP_CFFI) SKIP_UFFI= #if test -z "$UFFIBIN" ; then SKIP_UFFI="1" #fi AC_SUBST(SKIP_UFFI) SKIP_SCILAB= if test -z "$SCILAB"; then SKIP_SCILAB="1" fi AC_SUBST(SKIP_SCILAB) SKIP_GO= if test -z "$GO" ; then SKIP_GO="1" fi AC_SUBST(SKIP_GO) SKIP_D= if test -z "$DDEFAULTVERSION" ; then SKIP_D="1" fi AC_SUBST(SKIP_D) #---------------------------------------------------------------- # Additional language dependencies #---------------------------------------------------------------- SKIP_GCJ= if test -z "$GCJ" || test -z "$GCJH" ; then SKIP_GCJ="1" else if test "$GCC" != yes; then SKIP_GCJ="1" fi fi AC_SUBST(SKIP_GCJ) SKIP_ANDROID= if test -z "$ANDROID" || test -z "$ADB" || test -z "$ANT" || test -z "$NDKBUILD" ; then SKIP_ANDROID="1" fi AC_SUBST(SKIP_ANDROID) #---------------------------------------------------------------- # Miscellaneous #---------------------------------------------------------------- ABS_SRCDIR=`(cd ${srcdir} && pwd)` dnl Under Cygwin, we may need native absolute path as it is used by SWIG, which dnl may be a native, and not a Cygwin, program (this is the case when it's dnl built using MinGW or cccl compiler in Cygwin environment). However it may, dnl although this is probably more rare, also be built as a Cygwin program. dnl Using "mixed" path like we do here allows the path to work in both cases. case $host in *-*-mingw* ) ABS_SRCDIR=`${srcdir}/Tools/convertpath -m $ABS_SRCDIR` ;; *-*-cygwin* ) ABS_SRCDIR=`cygpath --mixed $ABS_SRCDIR` ;; esac # Root directory ROOT_DIR=`pwd` case $host in *-*-cygwin*) # Translate path for native Windows compilers for use with 'make check' if (cygpath --mixed $ROOT_DIR) >/dev/null 2>/dev/null; then ROOT_DIR=`cygpath --mixed $ROOT_DIR` fi ;; esac case $host in *-*-cygwin* | *-*-mingw*) # Extra files generated by some Windows compilers EXTRA_CLEAN="*.stackdump *.exp *.lib *.pdb *.ilk" ;; esac AC_SUBST(ROOT_DIR) AC_SUBST(EXTRA_CLEAN) AC_SUBST(ac_aux_dir) # Configure SWIG_LIB path AC_ARG_WITH(swiglibdir,[ --with-swiglibdir=DIR Put SWIG system-independent libraries into DIR.], [swig_lib="$withval"], [swig_lib="${datadir}/swig/${PACKAGE_VERSION}"]) SWIG_LIB_INSTALL=${swig_lib} AC_SUBST(SWIG_LIB_INSTALL) AC_DEFINE_DIR(SWIG_LIB, swig_lib, [Directory for SWIG system-independent libraries]) case $build in # Windows does not understand unix directories. Convert into a windows directory with drive letter. *-*-mingw*) SWIG_LIB_WIN_UNIX=`${srcdir}/Tools/convertpath -m $SWIG_LIB`;; *-*-cygwin*) SWIG_LIB_WIN_UNIX=`cygpath --mixed "$SWIG_LIB"`;; *) SWIG_LIB_WIN_UNIX="";; esac AC_DEFINE_UNQUOTED(SWIG_LIB_WIN_UNIX, ["$SWIG_LIB_WIN_UNIX"], [Directory for SWIG system-independent libraries (Unix install on native Windows)]) SWIG_LIB_PREINST=$ABS_SRCDIR/Lib AC_SUBST(SWIG_LIB_PREINST) dnl For testing purposes, clear SWIG_LIB when building SWIG in the source dnl directory under Windows because it is supposed to work without SWIG_LIB dnl being set. Otherwise it always needs to be set. SWIG_LIB_SET="env SWIG_LIB=\$(SWIG_LIB_DIR)" if test "${srcdir}" = "."; then AC_EGREP_CPP([yes], [#ifdef _WIN32 yes #endif ], [SWIG_LIB_SET="env SWIG_LIB="], []) fi AC_SUBST(SWIG_LIB_SET) AC_CONFIG_FILES([ Makefile swig.spec Examples/Makefile Examples/d/example.mk Examples/xml/Makefile Examples/test-suite/errors/Makefile Examples/test-suite/chicken/Makefile Examples/test-suite/csharp/Makefile Examples/test-suite/d/Makefile Examples/test-suite/guile/Makefile Examples/test-suite/java/Makefile Examples/test-suite/javascript/Makefile Examples/test-suite/mzscheme/Makefile Examples/test-suite/ocaml/Makefile Examples/test-suite/octave/Makefile Examples/test-suite/perl5/Makefile Examples/test-suite/php/Makefile Examples/test-suite/php5/Makefile Examples/test-suite/pike/Makefile Examples/test-suite/python/Makefile Examples/test-suite/ruby/Makefile Examples/test-suite/scilab/Makefile Examples/test-suite/tcl/Makefile Examples/test-suite/lua/Makefile Examples/test-suite/allegrocl/Makefile Examples/test-suite/clisp/Makefile Examples/test-suite/cffi/Makefile Examples/test-suite/uffi/Makefile Examples/test-suite/r/Makefile Examples/test-suite/go/Makefile Source/Makefile Tools/javascript/Makefile ]) AC_CONFIG_FILES([preinst-swig], [chmod +x preinst-swig]) AC_CONFIG_FILES([CCache/ccache_swig_config.h]) #-------------------------------------------------------------------- # Building Examples/ out of source directory #-------------------------------------------------------------------- # If building out of source tree, replicate Examples/ source tree in # build directory, and copy over Makefiles from source directory. # Prefix each Makefile with a header which sets SRCDIR to the relative # source directory, and provides a rule for updating the Makefile from # its original source. AC_CONFIG_COMMANDS([Examples],[ if test "x${srcdir}" != "x." ; then AC_MSG_NOTICE([generating Examples build tree]) for mkfile in `cd ${srcdir} && find Examples/ -type f -name Makefile`; do dir=`dirname ${mkfile}` d=${dir} reldir="" while test "x$d" != "x." ; do d=`dirname $d` reldir="${reldir}../" done relsrcdir=${reldir}${srcdir}/ AS_MKDIR_P([${dir}]) cat <${mkfile} # DO NOT EDIT: instead edit ${relsrcdir}${mkfile} # and run (cd ${reldir} && ./config.status) to regenerate TOP_BUILDDIR_TO_TOP_SRCDIR = ${srcdir}/ SRCDIR = ${relsrcdir}${dir}/ EOF cat ${srcdir}/${mkfile} >>${mkfile} done fi ]) #-------------------------------------------------------------------- AC_OUTPUT langs="" test -n "$SKIP_ALLEGROCL" || langs="${langs}allegrocl " test -n "$SKIP_CFFI" || langs="${langs}cffi " test -n "$SKIP_CHICKEN" || langs="${langs}chicken " test -n "$SKIP_CLISP" || langs="${langs}clisp " test -n "$SKIP_CSHARP" || langs="${langs}csharp " test -n "$SKIP_D" || langs="${langs}d " test -n "$SKIP_GO" || langs="${langs}go " test -n "$SKIP_GUILE" || langs="${langs}guile " test -n "$SKIP_JAVA" || langs="${langs}java " test -n "$SKIP_JAVASCRIPT" || langs="${langs}javascript " test -n "$SKIP_LUA" || langs="${langs}lua " test -n "$SKIP_MODULA3" || langs="${langs}modula3 " test -n "$SKIP_MZSCHEME" || langs="${langs}mzscheme " test -n "$SKIP_OCAML" || langs="${langs}ocaml " test -n "$SKIP_OCTAVE" || langs="${langs}octave " test -n "$SKIP_PERL5" || langs="${langs}perl5 " test -n "$SKIP_PHP" || langs="${langs}php " test -n "$SKIP_PHP5" || langs="${langs}php5 " test -n "$SKIP_PIKE" || langs="${langs}pike " test -n "$SKIP_PYTHON" || langs="${langs}python " test -n "$SKIP_R" || langs="${langs}r " test -n "$SKIP_RUBY" || langs="${langs}ruby " test -n "$SKIP_SCILAB" || langs="${langs}scilab " test -n "$SKIP_TCL" || langs="${langs}tcl " test -n "$SKIP_UFFI" || langs="${langs}uffi " echo " The SWIG test-suite and examples are configured for the following languages: $langs " dnl configure.ac ends here swig-3.0.12/Win/0000775000175000017500000000000013042756442013172 5ustar williamwilliamswig-3.0.12/Win/README.txt0000664000175000017500000000023113042756442014664 0ustar williamwilliamPlease see the Doc/Manual/Windows.html file in the main manual for instructions for using and installing SWIG on Windows including running the examples. swig-3.0.12/TODO0000664000175000017500000003144213042756442013131 0ustar williamwilliamSWIG TO-DO ----------------------------------------------------------------------------- **** = High Priority *** = Implement if possible. ** = Will implement if time. * = Implement if bored (or deemed necessary). defer = Implement in next version CORE: **** Add support for nested classes. The type system should be defer ready to go. The primary obstacle lies in the target language modules (which were never programmed with nested classes in mind). There are also issues with nested C structures. For example: struct Foo { struct { int x,y; } z; }; This is one of the last remaining "hard" problems in the SWIG core, but it is important that we solve it. *** "Nested" typemaps. The basic idea is similar to allowing one to use $descriptor(T) for any T, rather than just $descriptor for the type currently being typemapped. In short (ha!), given a previously defined typemap: %typemap(in) Foo { // whatever it takes to initialize $1 from $input } it would be possible to inline its code inside another typemap. While the syntax is still to be defined, the use would be along the lines of: template class vector { %typemap(in) vector { ... for (int i=0; i $typemap(in, input=x) ( int FIRST = foo, double SECOND = bar ); The advantage of this syntax would be that the formal arguments (int FIRST, double SECOND) are close to the actual arguments (foo, bar). Comment by beazley $typemap(in, input=x) int = foo; is a little bit hard to parse in terms of variable substitution. I'm considering something like this: $typemap(in,1=int foo, input=x) Note: This is partially implemented in the new Unified Typemap Library(python,tcl,ruby and perl) via %fragments and the SWIG_From/SWIG_AsVal methdos. *** Implement $fail special variable substitution in wrappers. Used to properly transfer control out of a wrapper function while reclaiming resources. Note: Implemented in languages that uses the UTL via the 'SWIG_fail' macro. *** Rewrite declaration annotation to better unify %rename and related directives. Add a selector mechanism that allows specific parse tree nodes to be identified. For example: %feature("foo", nodetype="class") Foo { ... some code ... }; Consider use of wildcards. Namespace/nested scope support in %feature is currently weak. It works, but is fragile. Consider an implementation that is better integrated with symbol table management. Continue to consolidate SWIG directives to %feature. Note: Initial implementation in the %rename directive. *** Add more intelligent information related to object ownership. SWIG should be able to automatically strip ownership from objects when they are assigned to pointer variables and structure members as well as stored in a container (i.e., an array of pointers). [ Partially finished for Ruby/Perl/Tcl/Python. ] ** Restoration of the documentation system. [ Partially done for Python. ] ** Restoration of Objective-C support. ** Unification of symbol tables and type system scopes. In a sense they capture the same information so it is not necessary to have both. The existence of two symbol management systems is mostly historical. Build ----- Library ------- **** Add more support for the C++ standard library. std::complex and other core datatypes. Refine support for STL vector. Add more STL objects. [ Partially finished for Python. ] **** Continue to expand the set of recognized typemaps. Windows ------- All language modules -------------------- Python ------ *** Ability to wrap certain classes as Python built-in types. Perl ---- **** Rewrite runtime pointer type checking to better integrate shadow classes. Creation of shadow classes should be done in C instead of Perl. This will fix a number of problems related to typemaps and reduce the amount of Perl wrapper code. **** Create tests for existing support for operator overloading Tcl --- Ruby ---- **** The "Resource Management in Proxies" section of the "SWIG and C++" chapter discusses how proxies' ownership of their associated C++ object can change, and the use of the special disown() and acquire() methods to change this ownership status. Need to address this for Ruby as well. *** Add support for keyword arguments (by collecting them in a hash?). Java ---- C# -- PHP --- **** Look at moving to using the UTL. ** When returning wrapped objects via alternate constructors if that pointer value already exists "out there" as a resource we should use the same resource, we can't have multiple ref-counted resources mapping to the same object in case it gets twice destroyed. And check if ref count destroying is even working, see smart_pointer_rename * Work out how classes without even inherited constructors should interact with the php "new " notation. See: abstract_inherit_wrap.cpptest ** Look at pass by point and passby ref, Make sometype** to be auto allocated Make sometype& and sometype* to be autoallocated IF THEY ARE NOT ALREADY swigtype wrapped. * Review to see what else is missing! Guile ----- ** Maybe rename slot setters from CLASS-SLOT-set to CLASS-SLOT-set! to match Scheme convention for naming of mutators. ** Support keyword args. ** Director Support! ** Cleaner handling of multiple values. Use a typemap keyword argument "numoutputs" of "out" and "argout" to indicate how many values are returned. ** Make SWIG's types first-class by using a separate smob type for SWIG type descriptors; enable reflection on types. (Maybe GOOPS metaclasses?) ** Provide a clean way to construct type predicates. ** In GOOPS mode, maybe make overloaded functions methods. ** Increase the safety of destructor functions. John Lenz suggests: I think the best way of doing this would be to use %feature to mark which classes allow for "normal" smobs to be deleted explicitly. We separate pointers into two classes, those that can be deleted from scheme and those that can't. The pointers that can be deleted use the smob and those that can not be deleted use the smob. A user can specify which type of each object they want with %newobject and the CONSUMED typemap. By default, the exported destructor will only accept smobs, because by definition, collectable-swig smobs are those that can be deleted from scheme. This allows for the user to implement protection. In the interface file, the user has complete control over which objects can and can not be deleted, and can guarantee that objects that should not be deleted can not be deleted, and that objects that should eventually be deleted will be garbage collected. This protection can then be overridden with a %feature directive, something like %feature("guile_allow_destroy_all","1") Foo::~Foo; I don't know what word we want to use, guile_allow_destroy_all is kinda bad. This feature would then allow for a smob to be deleted by passing it to the destructor. This would allow users to maintain the protection on other classes, only manually overriding the protection on the classes that need it. Mzscheme -------- ** Port list-vector.i and pointer-in-out.i from Guile. ** Add shadow class support for the Swindle system. Pike ---- * Decide how to handle global variables (probably using something like the Python module's cvar). Affects Examples/pike/simple. * Decide how to handle static class member functions and member variables. * Should investigate the possibility of generating .cmod files in addition to straight C/C++ code for extensions. Common Lisp ----------- * Random thoughts by mkoeppe on supporting Common Lisp implementations: There are many different Foreign Function Interfaces (FFI) for the various CL implementations. Probably SWIG should interface to UFFI, a least-common-denominator FFI that supports many implementations. Via the s-expression SWIG module we can export SWIG's parse tree and import it into CL. It remains to check if all relevant information is dumped (for instance, the type information). Experimental code is available to generate low-level UFFI declarations from this parse tree. However, for wrapping C++, we also need to create C wrappers because most FFIs cannot directly import C++. A CL SWIG module could be exporting both these wrappers and UFFI declarations. I have experimental code (not checked in yet) that does this. This is fine for generating low-level wrappers. But how do we support user typemaps (like converting lists and vectors to C arrays on input)? We have to generate Lisp code that does the conversion and then calls the low-level wrapper. If we generate Lisp code, it should be beautiful and readable. Therefore, we need at least a Lisp pretty printer. A Lisp pretty printer works best when the Lisp program is represented not as text but as Lisp data. Moreover, typemap writers will feel very much constrained by SWIG's capabilities for generating wrapper code, when compared to writing Lisp macros. Thus we would need half a re-implementation of Lisp in SWIG to make users happy. The solution could be the following: ** Build a SWIG library (again) and load it into a Common Lisp implementation. The FFI declarations could be written manually, or this could be bootstrapped via the s-expression module or the primitive UFFI wrappers. This should be easy because SWIG's API is quite simple. The embedded SWIG would be driven by a CL program. High-level typemaps would be written as Lisp programs that generate Lisp code. ALLEGROCL ----- These first three will remove most of the warnings from most of the remaining checkpartial tests that are failing. **** Throws typemap support **** const typemaps **** long long typemaps Ocaml ----- ** I've been working with my camlp4 module and type information from the compiler. When I'm done, the user will have access to type inference when writing code, when the inference is unambiguous. This allows the user to write x = _foo 1.0 instead of x = get_float (_foo (C_float 1.0)). It's not as easy as it sounds, because O'caml doesn't keep type information at run time, and doesn't really have a mechanism for doing what I need. However, it's possible to write a preprocessor that inserts correct type info at compile time. That having been said, the program must compile for type info to be available, so I need to attend to a lot of details; The program must compile both with and without type augmentation. Xml --- Documentation ------------- **** Extending SWIG (and internals). *** Perl, Python, Tcl modules. *** add section for Perl module support for operator overloading swig-3.0.12/configure0000775000175000017500000143327413042756667014373 0ustar williamwilliam#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for swig 3.0.12. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 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 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 # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (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 # 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. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -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_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://www.swig.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$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_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_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'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='swig' PACKAGE_TARNAME='swig' PACKAGE_VERSION='3.0.12' PACKAGE_STRING='swig 3.0.12' PACKAGE_BUGREPORT='http://www.swig.org' PACKAGE_URL='' ac_unique_file="Source/Swig/swig.h" enable_option_checking=no # 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='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS SWIG_LIB_SET SWIG_LIB_PREINST SWIG_LIB SWIG_LIB_INSTALL ac_aux_dir EXTRA_CLEAN ROOT_DIR SKIP_ANDROID SKIP_GCJ SKIP_D SKIP_GO SKIP_SCILAB SKIP_UFFI SKIP_CFFI SKIP_R SKIP_CLISP SKIP_ALLEGROCL SKIP_LUA SKIP_MODULA3 SKIP_CSHARP SKIP_CHICKEN SKIP_PIKE SKIP_OCAML SKIP_PHP5 SKIP_PHP SKIP_RUBY SKIP_MZSCHEME SKIP_GUILE SKIP_JAVASCRIPT SKIP_JAVA SKIP_PYTHON3 SKIP_PYTHON SKIP_OCTAVE SKIP_PERL5 SKIP_TCL DLIBPREFIX DDEFAULTVERSION D2COMPILER D1COMPILER GOVERSIONOPTION GCCGOOPT GOOPT GO15 GO13 GO12 GO1 GOC GOGCC GCCGO GO RBIN CLISPBIN ALLEGROCLBIN LUALINK LUAFLAGS LUADYNAMICLINKING LUABIN CSHARPSO CSHARPCFLAGS CSHARPLIBRARYPREFIX CSHARPDYNAMICLINKING CSHARPCONVERTPATH CSHARPCILINTERPRETER_FLAGS CSHARPCILINTERPRETER CSHARPCOMPILER CHICKENSHAREDLIB CHICKENLIB CHICKENOPTS CHICKEN_CSI CHICKEN_CSC CHICKEN PIKEDYNAMICLINKING PIKECCDLFLAGS PIKEINCLUDE PIKECONFIG PIKE CAMLP4 OCAMLMKTOP OCAMLC OCAMLFIND OCAMLDLGEN PHPINC PHP PHP5INC PHP5 RUBYDYNAMICLINKING RUBYSO RUBYCCDLFLAGS RUBYLINK RUBYLIB RUBYINCLUDE RUBY MZDYNOBJ MZC MZSCHEME GUILE_LIBS GUILE_CFLAGS GUILE GUILE_CONFIG NDKBUILD ANT ADB ANDROID GCJH GCJ JSV8ENABLED JSCENABLED JSV8DYNAMICLINKING JSV8INC JSCOREVERSION JSCOREDYNAMICLINKING JSCOREINC JSINTERPRETERLINKFLAGS JSINTERPRETERCXX NODEGYP NODEJS JAVACFLAGS JAVAFLAGS JAVACXXSHARED JAVALDSHARED JAVASO JAVALIBRARYPREFIX JAVADYNAMICLINKING JAVAINC JAVAC JAVA SCILABOPT SCILABINCLUDE SCILAB OCTAVE_LDFLAGS OCTAVE_CXXFLAGS OCTAVE_CPPFLAGS OCTAVE_SO OCTAVE PERL5LDFLAGS PERL5CCCDLFLAGS PERL5CCDLFLAGS PERL5CCFLAGS PERL5LIB PERL5DYNAMICLINKING PERL5EXT PERL PEP8 PYTHON3DYNAMICLINKING PY3LINK PY3LIB PY3INCLUDE PY3CONFIG PYTHON3 PYTHONDYNAMICLINKING PYLINK PYLIB PYINCLUDE PYTHON TCLCXXSHARED TCLLDSHARED TCLDYNAMICLINKING TCLLIB TCLINCLUDE PKGCONFIG LIBC LIBCRYPT LIBM SWILL SWIGLIBS LUA_SO MZSCHEME_SO PHP5_SO PHP_SO GUILE_SO TCL_SO PYTHON_SO LINKFORSHARED HAVE_CXX11_COMPILER PLATCXXFLAGS PLATCFLAGS RPATH TRYLINKINGWITHCXX CXXSHARED CCSHARED LDSHARED SO BOOST_LDFLAGS BOOST_CPPFLAGS YFLAGS YACC ENABLE_CCACHE subdirs PCRE_LIBS PCRE_CFLAGS PCRE_CONFIG SED EGREP GREP CPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking with_maximum_compile_warnings with_popen with_pcre with_pcre_prefix with_pcre_exec_prefix enable_ccache with_boost with_boost_libdir enable_cpp11_testing with_libm with_libc with_alllang with_tclconfig with_tcl with_tclincl with_tcllib with_python with_python3 with_perl5 with_octave with_scilab with_scilab_inc with_java with_javac with_javaincl with_javascript with_jscoreinc with_jscorelib with_jsv8inc with_jsv8lib with_gcj with_gcjh with_android with_adb with_ant with_ndk_build with_guile_config with_guile with_guile_cflags with_guile_libs with_mzscheme with_mzc with_ruby with_php5 with_php with_ocaml with_ocamlc with_ocamldlgen with_ocamlfind with_ocamlmktop with_camlp4 with_pike with_pike_config with_pikeincl with_chicken with_chickencsc with_chickencsi with_chickenopts with_chickensharedlib with_chickenlib with_csharp with_cil_interpreter with_csharp_compiler with_lua with_luaincl with_lualib with_allegrocl with_clisp with_r with_go with_d with_d1_compiler with_d2_compiler with_swiglibdir ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP PCRE_CONFIG PCRE_CFLAGS PCRE_LIBS YACC YFLAGS' ac_subdirs_all='CCache' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # 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_fn_error $? "invalid feature name: $ac_useropt" 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_fn_error $? "invalid feature name: $ac_useropt" 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$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_fn_error $? "invalid package name: $ac_useropt" 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_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $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_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $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 runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $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_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures swig 3.0.12 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/swig] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of swig 3.0.12:";; 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-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-ccache disable building and installation of ccache-swig executable (default enabled) --enable-cpp11-testing enable C++11 testing if supported by compiler (default disabled) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-maximum-compile-warnings Disable maximum warning verbosity --without-popen Disable popen --without-pcre Disable support for regular expressions using PCRE --with-pcre-prefix=PREFIX Prefix where pcre is installed (optional) --with-pcre-exec-prefix=EPREFIX Exec prefix where pcre is installed (optional) --with-boost[=ARG] use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) [ARG=yes] --with-boost-libdir=LIB_DIR Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located. --with-libm=STRING math library --with-libc=STRING C library --without-alllang Disable all languages --without-tcl Disable Tcl --with-tclconfig=path Set location of tclConfig.sh --with-tcl=path Set location of Tcl package --with-tclincl=path Set location of Tcl include directory --with-tcllib=path Set location of Tcl library directory --without-python Disable Python --with-python=path Set location of Python executable --without-python3 Disable Python 3.x support --with-python3=path Set location of Python 3.x executable --without-perl5 Disable Perl5 --with-perl5=path Set location of Perl5 executable --without-octave Disable Octave --with-octave=path Set location of Octave executable --without-scilab Disable Scilab --with-scilab=path Set location of Scilab executable --with-scilab-inc=path Set location of Scilab include directory --without-java Disable Java --with-java=path Set location of java executable --with-javac=path Set location of javac executable --with-javaincl=path Set location of Java include directory --without-javascript Disable Javascript --with-jscinc=path Set location of Javascript include directory --with-jsclib=path Set location of the JavaScriptCore/Webkit library directory --with-jsv8inc=path Set location of Javascript v8 include directory --with-jsv8lib=path Set location of V8 Javascript library directory --without-gcj Disable GCJ --with-gcj=path Set location of gcj executable --with-gcjh=path Set location of gcjh executable --without-android Disable Android --with-android=path Set location of android executable --with-adb=path Set location of adb executable - Android Debug Bridge --with-ant=path Set location of ant executable for Android --with-ndk-build=path Set location of Android ndk-build executable --without-guile Disable Guile --with-guile-config=path Set location of guile-config --with-guile=path Set location of Guile executable --with-guile-cflags=cflags Set cflags required to compile against Guile --with-guile-libs=ldflags Set ldflags needed to link with Guile --without-mzscheme Disable MzScheme --with-mzscheme=path Set location of MzScheme executable --with-mzc=path Set location of MzScheme's mzc --without-ruby Disable Ruby --with-ruby=path Set location of Ruby executable --without-php5 Disable PHP5 --with-php5=path Set location of PHP5 executable --without-php Disable PHP --with-php=path Set location of PHP executable --without-ocaml Disable OCaml --with-ocamlc=path Set location of ocamlc executable --with-ocamldlgen=path Set location of ocamldlgen --with-ocamlfind=path Set location of ocamlfind --with-ocamlmktop=path Set location of ocamlmktop executable --with-camlp4=path Set location of camlp4 executable --without-pike Disable Pike --with-pike=path Set location of Pike executable --with-pike-config=path Set location of pike-config script --with-pikeincl=path Set location of Pike include directory --without-chicken Disable CHICKEN --with-chicken=path Set location of CHICKEN executable --with-chickencsc=path Set location of csc executable --with-chickencsi=path Set location of csi executable --with-chickenopts=args Set compiler options for static CHICKEN generated code --with-chickensharedlib=args Set linker options for shared CHICKEN generated code --with-chickenlib=args Set linker options for static CHICKEN generated code --without-csharp Disable CSharp --with-cil-interpreter=path Set location of CIL interpreter for CSharp --with-csharp-compiler=path Set location of CSharp compiler --without-lua Disable Lua --with-lua=path Set location of Lua executable --with-luaincl=path Set location of Lua include directory --with-lualib=path Set location of Lua library directory --without-allegrocl Disable Allegro CL --with-allegrocl=path Set location of Allegro CL executable (alisp) --without-clisp Disable CLISP --with-clisp=path Set location of CLISP executable (clisp) --without-r Disable R --with-r=path Set location of R executable (r) --without-go Disable Go --with-go=path Set location of Go compiler --without-d Disable D --with-d1-compiler=path Set location of D1/Tango compiler (DMD compatible) --with-d2-compiler=path Set location of D2 compiler (DMD compatible) --with-swiglibdir=DIR Put SWIG system-independent libraries into DIR. Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor PCRE_CONFIG config script used for pcre PCRE_CFLAGS CFLAGS used for pcre PCRE_LIBS LIBS used for pcre YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. 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 swig configure 3.0.12 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 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 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------- ## ## Report this to http://www.swig.org ## ## ---------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done else ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval () { return $2; } static unsigned long int ulongval () { return $2; } #include #include int main () { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by swig $as_me 3.0.12, which was generated by GNU Autoconf 2.69. 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) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$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= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" 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 $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" 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 $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" 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'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > 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 cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _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 # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac 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 /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$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" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$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. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$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_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in Tools/config "$srcdir"/Tools/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in Tools/config \"$srcdir\"/Tools/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ac_config_headers="$ac_config_headers Source/Include/swigconfig.h" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac am__api_version='1.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$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 STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$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 eval \${ac_cv_prog_make_${ac_make}_set+:} false; 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:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='swig' VERSION='3.0.12' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$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:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; 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:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+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 if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$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 ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else 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:${as_lineno-$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:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$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:${as_lineno-$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:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* 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" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg 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:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$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 CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$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 ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes 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_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi # Needed for subdir-objects in AUTOMAKE_OPTIONS { $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum warning verbosity option" >&5 $as_echo_n "checking maximum warning verbosity option... " >&6; } # Check whether --with-maximum-compile-warnings was given. if test "${with_maximum_compile_warnings+set}" = set; then : withval=$with_maximum_compile_warnings; ac_compile_warnings_on="$withval" else ac_compile_warnings_on="" fi if test x"$ac_compile_warnings_on" = xno then ac_compile_warnings_msg=no else if test -n "$CXX" then if test "$GXX" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" fi if test -n "$CC" then if test "$GCC" = "yes" then ac_compile_warnings_opt='-Wall -W -ansi -pedantic' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_compile_warnings_msg" >&5 $as_echo "$ac_compile_warnings_msg" >&6; } unset ac_compile_warnings_msg unset ac_compile_warnings_opt # Increase warning levels cat >>confdefs.h <<_ACEOF #define SWIG_CXX "$CXX" _ACEOF cat >>confdefs.h <<_ACEOF #define SWIG_PLATFORM "$host" _ACEOF 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:${as_lineno-$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 ${ac_cv_prog_CPP+:} false; 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } 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:${as_lineno-$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 ${ac_cv_path_GREP+:} false; 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" as_fn_executable_p "$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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; 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" as_fn_executable_p "$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 as_fn_arith $ac_count + 1 && ac_count=$as_val 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_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* 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 if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # Check whether --with-popen was given. if test "${with_popen+set}" = set; then : withval=$with_popen; with_popen="$withval" fi if test x"${with_popen}" = xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling popen" >&5 $as_echo "$as_me: Disabling popen" >&6;} else ac_fn_c_check_func "$LINENO" "popen" "ac_cv_func_popen" if test "x$ac_cv_func_popen" = xyes; then : $as_echo "#define HAVE_POPEN 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling popen" >&5 $as_echo "$as_me: Disabling popen" >&6;} fi fi # Check whether --with-pcre was given. if test "${with_pcre+set}" = set; then : withval=$with_pcre; else with_pcre=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable PCRE support" >&5 $as_echo_n "checking whether to enable PCRE support... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_pcre" >&5 $as_echo "$with_pcre" >&6; } if test x"${with_pcre}" = xyes ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use local PCRE" >&5 $as_echo_n "checking whether to use local PCRE... " >&6; } local_pcre_config=no if test -z $PCRE_CONFIG; then if test -f `pwd`/pcre/pcre-swig-install/bin/pcre-config; then PCRE_CONFIG=`pwd`/pcre/pcre-swig-install/bin/pcre-config local_pcre_config=$PCRE_CONFIG fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $local_pcre_config" >&5 $as_echo "$local_pcre_config" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_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 '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed if test "x$with_pcre" != xno; then : # Check whether --with-pcre-prefix was given. if test "${with_pcre_prefix+set}" = set; then : withval=$with_pcre_prefix; pcre_config_prefix="$withval" else pcre_config_prefix="" fi # Check whether --with-pcre-exec-prefix was given. if test "${with_pcre_exec_prefix+set}" = set; then : withval=$with_pcre_exec_prefix; pcre_config_exec_prefix="$withval" else pcre_config_exec_prefix="" fi if test x"$PCRE_CFLAGS" != x -o x"$PCRE_LIBS" != x; then : : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" else if test x$pcre_config_exec_prefix != x; then : pcre_config_args="$pcre_config_args --exec-prefix=$pcre_config_exec_prefix" if test x${PCRE_CONFIG+set} != xset; then : PCRE_CONFIG=$pcre_config_exec_prefix/bin/pcre-config fi fi if test x$pcre_config_prefix != x; then : pcre_config_args="$pcre_config_args --prefix=$pcre_config_prefix" if test x${PCRE_CONFIG+set} != xset; then : PCRE_CONFIG=$pcre_config_prefix/bin/pcre-config fi fi for ac_prog in pcre-config 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PCRE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PCRE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PCRE_CONFIG="$PCRE_CONFIG" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PCRE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PCRE_CONFIG=$ac_cv_path_PCRE_CONFIG if test -n "$PCRE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PCRE_CONFIG" >&5 $as_echo "$PCRE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PCRE_CONFIG" && break done test -n "$PCRE_CONFIG" || PCRE_CONFIG="no" if test "$PCRE_CONFIG" = "no"; then : : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? " Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended). See \`config.log' for more details" "$LINENO" 5; } else if test x"" = x; then : PCRE_CFLAGS="`$PCRE_CONFIG $pcre_config_args --cflags`" else PCRE_CFLAGS="`$PCRE_CONFIG $pcre_config_args `" fi if test x"" = x; then : PCRE_LIBS="`$PCRE_CONFIG $pcre_config_args --libs`" else PCRE_LIBS="`$PCRE_CONFIG $pcre_config_args `" fi if test x"" != x; then : if test x" " != x; then : pcre_version="`$PCRE_CONFIG $pcre_config_args --version | $SED -e `" else pcre_version="`$PCRE_CONFIG $pcre_config_args --version | $SED -e 's/^\ *\(.*\)\ *$/\1/'`" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcre ($pcre_version) >= " >&5 $as_echo_n "checking for pcre ($pcre_version) >= ... " >&6; } # Used to indicate true or false condition ax_compare_version=false # Convert the two version strings to be compared into a format that # allows a simple string comparison. The end result is that a version # string of the form 1.12.5-r617 will be converted to the form # 0001001200050617. In other words, each number is zero padded to four # digits, and non digits are removed. ax_compare_version_A=`echo "$pcre_version" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version_B=`echo "" | sed -e 's/\([0-9]*\)/Z\1Z/g' \ -e 's/Z\([0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/Z\([0-9][0-9][0-9]\)Z/Z0\1Z/g' \ -e 's/[^0-9]//g'` ax_compare_version=`echo "x$ax_compare_version_A x$ax_compare_version_B" | sed 's/^ *//' | sort -r | sed "s/x${ax_compare_version_A}/true/;s/x${ax_compare_version_B}/false/;1q"` if test "$ax_compare_version" = "true" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? " Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions) library package. This dependency is needed for configure to complete, Either: - Install the PCRE developer package on your system (preferred approach). - Download the PCRE source tarball, build and install on your system as you would for any package built from source distribution. - Use the Tools/pcre-build.sh script to build PCRE just for SWIG to statically link against. Run 'Tools/pcre-build.sh --help' for instructions. (quite easy and does not require privileges to install PCRE on your system) - Use configure --without-pcre to disable regular expressions support in SWIG (not recommended). See \`config.log' for more details" "$LINENO" 5; } fi else : $as_echo "#define HAVE_PCRE 1" >>confdefs.h LIBS="$LIBS $PCRE_LIBS" CPPFLAGS="$CPPFLAGS $PCRE_CFLAGS" fi fi fi fi # Check whether --enable-ccache was given. if test "${enable_ccache+set}" = set; then : enableval=$enable_ccache; enable_ccache=$enableval else enable_ccache=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable ccache-swig" >&5 $as_echo_n "checking whether to enable ccache-swig... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_ccache" >&5 $as_echo "$enable_ccache" >&6; } if test "$enable_ccache" = yes; then subdirs="$subdirs CCache" ENABLE_CCACHE=1 fi echo "" echo "Checking packages required for SWIG developers." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" for ac_prog in 'bison -y' byacc 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" echo "" echo "Checking for installed target languages and other information in order to compile and run" echo "the examples and test-suite invoked by 'make check'." echo "Note : None of the following packages are required for users to compile and install SWIG from the distributed tarball" echo "" # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ac_boost_path="" else want_boost="yes" ac_boost_path="$withval" fi else want_boost="yes" fi # Check whether --with-boost-libdir was given. if test "${with_boost_libdir+set}" = set; then : withval=$with_boost_libdir; if test -d "$withval" then ac_boost_lib_path="$withval" else as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5 fi else ac_boost_lib_path="" fi if test "x$want_boost" = "xyes"; then boost_lib_version_req=1.20.0 boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([0-9]*\.[0-9]*\)'` boost_lib_version_req_major=`expr $boost_lib_version_req : '\([0-9]*\)'` boost_lib_version_req_minor=`expr $boost_lib_version_req : '[0-9]*\.\([0-9]*\)'` boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'` if test "x$boost_lib_version_req_sub_minor" = "x" ; then boost_lib_version_req_sub_minor="0" fi WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= $boost_lib_version_req" >&5 $as_echo_n "checking for boostlib >= $boost_lib_version_req... " >&6; } succeeded=no libsubdirs="lib" ax_arch=`uname -m` case $ax_arch in x86_64) libsubdirs="lib64 libx32 lib lib64" ;; ppc64|s390x|sparc64|aarch64|ppc64le) libsubdirs="lib64 lib lib64 ppc64le" ;; esac libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs" case ${host_cpu} in i?86) libsubdirs="lib/i386-${host_os} $libsubdirs" ;; esac if test "$ac_boost_path" != ""; then BOOST_CPPFLAGS="-I$ac_boost_path/include" for ac_boost_path_tmp in $libsubdirs; do if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" break fi done elif test "$cross_compiling" != yes; then for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then for libsubdir in $libsubdirs ; do if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" break; fi done fi if test "$ac_boost_lib_path" != ""; then BOOST_LDFLAGS="-L$ac_boost_lib_path" fi CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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$succeeded" != "xyes"; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= BOOST_LDFLAGS= _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done if test -z "$BOOST_CPPFLAGS"; then if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then BOOST_CPPFLAGS="-I$ac_boost_path" fi fi fi else if test "$cross_compiling" != yes; then for ac_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp best_path=$ac_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test "$ac_boost_lib_path" = ""; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test "x$BOOST_ROOT" != "x"; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5 $as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;} BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } succeeded=yes found_system=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext 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 fi if test "$succeeded" != "yes" ; then if test "$_version" = "0" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5 $as_echo "$as_me: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5 $as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;} fi # execute ACTION-IF-NOT-FOUND (if present): : else $as_echo "#define HAVE_BOOST /**/" >>confdefs.h # execute ACTION-IF-FOUND (if present): : fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi # -I should not be used on system directories (GCC) if test "$GCC" = yes; then ISYSTEM="-isystem " else ISYSTEM="-I" fi { $as_echo "$as_me:${as_lineno-$LINENO}: ISYSTEM: $ISYSTEM" >&5 $as_echo "$as_me: ISYSTEM: $ISYSTEM" >&6;} # SO is the extension of shared libraries (including the dot!) { $as_echo "$as_me:${as_lineno-$LINENO}: checking SO" >&5 $as_echo_n "checking SO... " >&6; } if test -z "$SO" then case $host in *-*-hp*) SO=.sl;; *-*-darwin*) SO=.bundle;; *-*-cygwin* | *-*-mingw*) SO=.dll;; *) SO=.so;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SO" >&5 $as_echo "$SO" >&6; } # LDSHARED is the ld *command* used to create shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) { $as_echo "$as_me:${as_lineno-$LINENO}: checking LDSHARED" >&5 $as_echo_n "checking LDSHARED... " >&6; } if test -z "$LDSHARED" then case $host in *-*-aix*) LDSHARED="\$(srcdir)/ld_so_aix \$(CC)";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then LDSHARED="$CC -shared" else if test "cl" = $CC ; then # Microsoft Visual C++ (MSVC) LDSHARED="$CC -nologo -LD" else # Unknown compiler try gcc approach LDSHARED="$CC -shared" fi fi ;; *-*-irix5*) LDSHARED="ld -shared";; *-*-irix6*) LDSHARED="ld ${SGI_ABI} -shared -all";; *-*-sunos4*) LDSHARED="ld";; *-*-solaris*) LDSHARED="ld -G";; *-*-hp*) LDSHARED="ld -b";; *-*-osf*) LDSHARED="ld -shared -expect_unresolved \"*\"";; *-sequent-sysv4) LDSHARED="ld -G";; *-*-next*) if test "$ns_dyld" then LDSHARED='$(CC) $(LDFLAGS) -bundle -prebind' else LDSHARED='$(CC) $(CFLAGS) -nostdlib -r' fi if test "$with_next_framework" ; then LDSHARED="$LDSHARED \$(LDLIBRARY)" fi ;; *-*-linux*) LDSHARED="gcc -shared";; *-*-dgux*) LDSHARED="ld -G";; *-*-freebsd3*) LDSHARED="gcc -shared";; *-*-freebsd* | *-*-openbsd*) LDSHARED="ld -Bshareable";; *-*-netbsd*) if [ "`$CC -dM -E - &5 $as_echo "$LDSHARED" >&6; } # CXXSHARED is the ld *command* used to create C++ shared library # -- "ld" on SunOS 4.x.x, "ld -G" on SunOS 5.x, "ld -shared" on IRIX 5 # (Shared libraries in this instance are shared modules to be loaded into # Python, as opposed to building Python itself as a shared library.) { $as_echo "$as_me:${as_lineno-$LINENO}: checking CXXSHARED" >&5 $as_echo_n "checking CXXSHARED... " >&6; } if test -z "$CXXSHARED" then CXXSHARED="$LDSHARED" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXSHARED" >&5 $as_echo "$CXXSHARED" >&6; } # { $as_echo "$as_me:${as_lineno-$LINENO}: checking TRYLINKINGWITHCXX" >&5 $as_echo_n "checking TRYLINKINGWITHCXX... " >&6; } if test -z "$TRYLINKINGWITHCXX" then case $host in *-*-solaris*) if test "$GCC" = yes then TRYLINKINGWITHCXX="CXXSHARED= $CXX -Wl,-G" else TRYLINKINGWITHCXX="CXXSHARED= $CXX -G -L/opt/SUNWspro/lib -lCrun -lCstd" fi;; *-*-hp*) TRYLINKINGWITHCXX="CXXSHARED= $CXX +z ";; *-*-darwin*) TRYLINKINGWITHCXX="CXXSHARED= $CXX -bundle -undefined suppress -flat_namespace";; *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared " else if test "cl" = $CXX ; then # Microsoft Visual C++ (MSVC) TRYLINKINGWITHCXX="CXXSHARED= $CXX -nologo -LD" else TRYLINKINGWITHCXX="#unknown Windows compiler" fi fi ;; *) TRYLINKINGWITHCXX="CXXSHARED= $CXX -shared ";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRYLINKINGWITHCXX" >&5 $as_echo "$TRYLINKINGWITHCXX" >&6; } # CCSHARED are the C *flags* used to create objects to go into a shared # library (module) -- this is only needed for a few systems { $as_echo "$as_me:${as_lineno-$LINENO}: checking CCSHARED" >&5 $as_echo_n "checking CCSHARED... " >&6; } if test -z "$CCSHARED" then case $host in *-*-hp*) if test "$GCC" = yes then CCSHARED="-fpic" else CCSHARED="+z" fi;; s390x*-*-*) CCSHARED="-fpic" ;; s390*-*-*) CCSHARED="-fPIC" ;; *-*-linux*) CCSHARED="-fpic";; *-*-freebsd* | *-*-openbsd*) CCSHARED="-fpic";; *-*-netbsd*) CCSHARED="-fPIC";; *-sco-sysv*) CCSHARED="-KPIC -dy -Bdynamic";; *-*-irix6*) case $CC in *gcc*) CCSHARED="-shared";; *) CCSHARED="";; esac;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CCSHARED" >&5 $as_echo "$CCSHARED" >&6; } # RPATH is the path used to look for shared library files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking RPATH" >&5 $as_echo_n "checking RPATH... " >&6; } if test -z "$RPATH" then case $host in *-*-solaris*) RPATH='-R. -R$(exec_prefix)/lib';; *-*-irix*) RPATH='-rpath .:$(exec_prefix)/lib';; *-*-linux*) RPATH='-Xlinker -rpath $(exec_prefix)/lib -Xlinker -rpath .';; *) RPATH='';; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RPATH" >&5 $as_echo "$RPATH" >&6; } # LINKFORSHARED are the flags passed to the $(CC) command that links # the a few executables -- this is only needed for a few systems { $as_echo "$as_me:${as_lineno-$LINENO}: checking LINKFORSHARED" >&5 $as_echo_n "checking LINKFORSHARED... " >&6; } if test -z "$LINKFORSHARED" then case $host in *-*-aix*) LINKFORSHARED='-Wl,-bE:$(srcdir)/python.exp -lld';; *-*-hp*) LINKFORSHARED="-Wl,-E -Wl,+s -Wl,+b\$(BINLIBDEST)/lib-dynload";; *-*-linux*) LINKFORSHARED="-Xlinker -export-dynamic";; *-*-next*) LINKFORSHARED="-u libsys_s";; *-sco-sysv*) LINKFORSHARED="-Bdynamic -dy -Wl,-Bexport";; *-*-irix6*) LINKFORSHARED="-all";; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINKFORSHARED" >&5 $as_echo "$LINKFORSHARED" >&6; } # Optional CFLAGS used to silence/enhance compiler warnings on some platforms. { $as_echo "$as_me:${as_lineno-$LINENO}: checking PLATCFLAGS" >&5 $as_echo_n "checking PLATCFLAGS... " >&6; } case $host in *-*-solaris*) if test "$GCC" = yes then PLATCFLAGS= else PLATCFLAGS= # else PLATCFLAGS="-errtags=yes" # Need more work as C examples use ld for linking fi;; *) PLATCFLAGS= esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PLATCFLAGS" >&5 $as_echo "$PLATCFLAGS" >&6; } # Add switch if necessary to enable C++11 support - just for tests # Check whether --enable-cpp11-testing was given. if test "${enable_cpp11_testing+set}" = set; then : enableval=$enable_cpp11_testing; enable_cpp11_testing=$enableval else enable_cpp11_testing=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable C++11 testing" >&5 $as_echo_n "checking whether to enable C++11 testing... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_cpp11_testing" >&5 $as_echo "$enable_cpp11_testing" >&6; } PLATCXXFLAGS="$PLATCFLAGS" if test x"$enable_cpp11_testing" = xyes; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu CXXFLAGS_SAVED=$CXXFLAGS CXXFLAGS= ac_success=no CXX11FLAGS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5 $as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; } if ${ax_cv_cxx_compile_cxx11+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ax_cv_cxx_compile_cxx11=yes else ax_cv_cxx_compile_cxx11=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5 $as_echo "$ax_cv_cxx_compile_cxx11" >&6; } if test x$ax_cv_cxx_compile_cxx11 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for switch in -std=c++11 -std=c++0x; do cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 $as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval \${$cachevar+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CXXFLAGS="$CXXFLAGS" CXXFLAGS="$CXXFLAGS $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; typedef check> right_angle_brackets; int a; decltype(a) b; typedef check check_type; check_type c; check_type&& cr = static_cast(c); _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval $cachevar=yes else eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="$ac_save_CXXFLAGS" fi eval ac_res=\$$cachevar { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXXFLAGS="$CXXFLAGS $switch" CXX11FLAGS=$switch ac_success=yes break fi done fi if test x$ac_success = xno; then if test xnostop != xnostop; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi else HAVE_CXX11_COMPILER=yes fi CXXFLAGS=$CXXFLAGS_SAVED 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"$CXX11FLAGS" != x; then PLATCXXFLAGS="$CXX11FLAGS $PLATCXXFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++11 enabled compiler" >&5 $as_echo_n "checking for C++11 enabled compiler... " >&6; } if test x"$HAVE_CXX11_COMPILER" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CXX11_COMPILER" >&5 $as_echo "$HAVE_CXX11_COMPILER" >&6; } fi fi # On darwin 10.7,10.8,10.9 using clang++, need to ensure using # libc++ for tests and examples to run under mono. May affect # other language targets as well - problem is a Mac OS X incompatibility # between libraries depending on libstdc++ and libc++. CLANGXX= $CXX -v 2>&1 | grep -i clang >/dev/null && CLANGXX=yes case $host in *-*-darwin11* | *-*-darwin12* |*-*-darwin13* ) if test "$CLANGXX" = "yes"; then PLATCXXFLAGS="$PLATCXXFLAGS -stdlib=libc++" fi;; *) ;; esac # Set info about shared libraries. # This variation is needed on OS-X because there is no (apparent) consistency in shared library naming. # Sometimes .bundle works, but sometimes .so is needed. It depends on the target language case $host in *-*-mingw*) PYTHON_SO=.pyd;; *-*-darwin*) PYTHON_SO=.so;; *) PYTHON_SO=$SO;; esac case $host in *-*-darwin*) TCL_SO=.dylib;; *) TCL_SO=$SO;; esac case $host in *-*-darwin*) GUILE_SO=.so;; *) GUILE_SO=$SO;; esac case $host in *-*-darwin*) PHP_SO=.so;; *) PHP_SO=$SO;; esac PHP5_SO=$PHP_SO case $host in *) MZSCHEME_SO=.so;; esac case $host in *-*-darwin*) LUA_SO=.so;; *) LUA_SO=$SO;; esac # Check for specific libraries. Used for SWIG examples { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi # Dynamic linking for SunOS/Solaris and SYSV { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDLD 1 _ACEOF LIBS="-ldld $LIBS" fi # Dynamic linking for HP-UX { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing t_open" >&5 $as_echo_n "checking for library containing t_open... " >&6; } if ${ac_cv_search_t_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char t_open (); int main () { return t_open (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_t_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_t_open+:} false; then : break fi done if ${ac_cv_search_t_open+:} false; then : else ac_cv_search_t_open=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_t_open" >&5 $as_echo "$ac_cv_search_t_open" >&6; } ac_res=$ac_cv_search_t_open if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # SVR4 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5 $as_echo_n "checking for library containing gethostbyname... " >&6; } if ${ac_cv_search_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF for ac_lib in '' inet; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gethostbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gethostbyname+:} false; then : break fi done if ${ac_cv_search_gethostbyname+:} false; then : else ac_cv_search_gethostbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5 $as_echo "$ac_cv_search_gethostbyname" >&6; } ac_res=$ac_cv_search_gethostbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # Sequent { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 $as_echo_n "checking for library containing socket... " >&6; } if ${ac_cv_search_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char socket (); int main () { return socket (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_socket+:} false; then : break fi done if ${ac_cv_search_socket+:} false; then : else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 $as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi # SVR4 sockets { $as_echo "$as_me:${as_lineno-$LINENO}: checking for swill_init in -lswill" >&5 $as_echo_n "checking for swill_init in -lswill... " >&6; } if ${ac_cv_lib_swill_swill_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lswill $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char swill_init (); int main () { return swill_init (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_swill_swill_init=yes else ac_cv_lib_swill_swill_init=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_swill_swill_init" >&5 $as_echo "$ac_cv_lib_swill_swill_init" >&6; } if test "x$ac_cv_lib_swill_swill_init" = xyes; then : SWIGLIBS="-lswill $LIBS" SWILL="-DSWIG_SWILL" fi # check for --with-libm=... LIBM=-lm # Check whether --with-libm was given. if test "${with_libm+set}" = set; then : withval=$with_libm; if test "$withval" != yes then LIBM=$withval else as_fn_error $? "proper usage is --with-libm=STRING" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 $as_echo_n "checking for main in -lieee... " >&6; } if ${ac_cv_lib_ieee_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lieee $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ieee_main=yes else ac_cv_lib_ieee_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 $as_echo "$ac_cv_lib_ieee_main" >&6; } if test "x$ac_cv_lib_ieee_main" = xyes; then : LIBM="-lieee $LIBM" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt in -lcrypt" >&5 $as_echo_n "checking for crypt in -lcrypt... " >&6; } if ${ac_cv_lib_crypt_crypt+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcrypt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char crypt (); int main () { return crypt (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_crypt_crypt=yes else ac_cv_lib_crypt_crypt=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypt_crypt" >&5 $as_echo "$ac_cv_lib_crypt_crypt" >&6; } if test "x$ac_cv_lib_crypt_crypt" = xyes; then : LIBCRYPT="-lcrypt" fi # check for --with-libc=... # Check whether --with-libc was given. if test "${with_libc+set}" = set; then : withval=$with_libc; if test "$withval" != yes then LIBC=$withval else as_fn_error $? "proper usage is --with-libc=STRING" "$LINENO" 5 fi fi #-------------------------------------------------------------------- # Target languages #-------------------------------------------------------------------- # Check whether --with-alllang was given. if test "${with_alllang+set}" = set; then : withval=$with_alllang; with_alllang="$withval" fi if test "$with_alllang" = "no"; then alllang_default=no else alllang_default=yes fi for ac_prog in pkg-config 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PKGCONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PKGCONFIG"; then ac_cv_prog_PKGCONFIG="$PKGCONFIG" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PKGCONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PKGCONFIG=$ac_cv_prog_PKGCONFIG if test -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 $as_echo "$PKGCONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PKGCONFIG" && break done #-------------------------------------------------------------------- # Look for Tcl #-------------------------------------------------------------------- TCLINCLUDE= TCLLIB= TCLPACKAGE= # Check whether --with-tclconfig was given. if test "${with_tclconfig+set}" = set; then : withval=$with_tclconfig; with_tclconfig="$withval" else with_tclconfig= fi # Check whether --with-tcl was given. if test "${with_tcl+set}" = set; then : withval=$with_tcl; TCLPACKAGE="$withval" else TCLPACKAGE="$alllang_default" fi # Check whether --with-tclincl was given. if test "${with_tclincl+set}" = set; then : withval=$with_tclincl; TCLINCLUDE="$ISYSTEM$withval" else TCLINCLUDE= fi # Check whether --with-tcllib was given. if test "${with_tcllib+set}" = set; then : withval=$with_tcllib; TCLLIB="-L$withval" else TCLLIB= fi # First, check for "--without-tcl" or "--with-tcl=no". if test x"${TCLPACKAGE}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Tcl" >&5 $as_echo "$as_me: Disabling Tcl" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 $as_echo_n "checking for Tcl configuration... " >&6; } # First check to see if --with-tclconfig was specified. if test x"${with_tclconfig}" != x ; then if test -f "${with_tclconfig}/tclConfig.sh" ; then TCLCONFIG=`(cd ${with_tclconfig}; pwd)` else as_fn_error $? "${with_tcl} directory does not contain tclConfig.sh" "$LINENO" 5 fi fi # check in a few common install locations if test x"${TCLCONFIG}" = x ; then for i in `ls -d -r /usr/lib*/ 2>/dev/null` \ `ls -d -r /usr/lib*/tcl*/ 2>/dev/null` \ `ls -d -r /usr/local/lib*/ 2>/dev/null` \ `ls -d -r /usr/local/lib*/tcl*/ 2>/dev/null` ; do if test -f $i"tclConfig.sh" ; then TCLCONFIG=`(cd $i; pwd)` break fi done fi if test x"${TCLCONFIG}" = x ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $TCLCONFIG/tclConfig.sh" >&5 $as_echo "found $TCLCONFIG/tclConfig.sh" >&6; } . $TCLCONFIG/tclConfig.sh if test -z "$TCLINCLUDE"; then TCLINCLUDE=`echo $TCL_INCLUDE_SPEC | sed "s/-I/$ISYSTEM/"` fi if test -z "$TCLLIB"; then TCLLIB=$TCL_LIB_SPEC fi fi if test -z "$TCLINCLUDE"; then if test "x$TCLPACKAGE" != xyes; then TCLINCLUDE="$ISYSTEM$TCLPACKAGE/include" fi fi if test -z "$TCLLIB"; then if test "x$TCLPACKAGE" != xyes; then TCLLIB="-L$TCLPACKAGE/lib -ltcl" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl header files" >&5 $as_echo_n "checking for Tcl header files... " >&6; } if test -z "$TCLINCLUDE"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else TCLINCLUDE="" fi rm -f conftest.err conftest.i conftest.$ac_ext if test -z "$TCLINCLUDE"; then dirs="/usr/local/include /usr/include /opt/local/include" for i in $dirs ; do if test -r $i/tcl.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } TCLINCLUDE="$ISYSTEM$i" break fi done fi if test -z "$TCLINCLUDE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TCLINCLUDE" >&5 $as_echo "$TCLINCLUDE" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl library" >&5 $as_echo_n "checking for Tcl library... " >&6; } if test -z "$TCLLIB"; then dirs="/usr/local/lib /usr/lib /opt/local/lib" for i in $dirs ; do if test -r $i/libtcl.a; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } TCLLIB="-L$i -ltcl" break fi done if test -z "$TCLLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TCLLIB" >&5 $as_echo "$TCLLIB" >&6; } fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; *)TCLDYNAMICLINKING="";; esac case $host in *-*-darwin*) TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' ;; *) TCLLDSHARED='$(LDSHARED)' TCLCXXSHARED='$(CXXSHARED)' ;; esac fi #---------------------------------------------------------------- # Look for Python #---------------------------------------------------------------- PYINCLUDE= PYLIB= PYLINK= PYPACKAGE= # Check whether --with-python was given. if test "${with_python+set}" = set; then : withval=$with_python; PYBIN="$withval" else PYBIN="$alllang_default" fi # First, check for "--without-python" or "--with-python=no". if test x"${PYBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Python" >&5 $as_echo "$as_me: Disabling Python" >&6;} else # First figure out the name of the Python executable if test "x$PYBIN" = xyes; then for ac_prog in python python2.8 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON"; then ac_cv_prog_PYTHON="$PYTHON" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PYTHON="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PYTHON=$ac_cv_prog_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON" && break done else PYTHON="$PYBIN" fi PYVER=0 if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $PYTHON major version number" >&5 $as_echo_n "checking for $PYTHON major version number... " >&6; } PYVER=`($PYTHON -c "import sys; sys.stdout.write(sys.version[0])") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVER" >&5 $as_echo "$PYVER" >&6; } if test -z "$PYVER"; then PYVER=0 else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python os.name" >&5 $as_echo_n "checking for Python os.name... " >&6; } PYOSNAME=`($PYTHON -c "import sys, os; sys.stdout.write(os.name)")` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYOSNAME" >&5 $as_echo "$PYOSNAME" >&6; } fi fi if test $PYVER -eq 1 -o $PYVER -eq 2; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python prefix" >&5 $as_echo_n "checking for Python prefix... " >&6; } PYPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYPREFIX" >&5 $as_echo "$PYPREFIX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python exec-prefix" >&5 $as_echo_n "checking for Python exec-prefix... " >&6; } PYEPREFIX=`($PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYEPREFIX" >&5 $as_echo "$PYEPREFIX" >&6; } if test x"$PYOSNAME" = x"nt"; then # Windows installations are quite different to posix installations PYPREFIX=`echo "$PYPREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python header files" >&5 $as_echo_n "checking for Python header files... " >&6; } if test -r $PYPREFIX/include/Python.h; then PYINCLUDE="-I$PYPREFIX/include" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYINCLUDE" >&5 $as_echo "$PYINCLUDE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library directory" >&5 $as_echo_n "checking for Python library directory... " >&6; } if test -d $PYPREFIX/libs; then PYLIB=$PYPREFIX/libs PYLINKFILE=`ls $PYLIB/python*.lib | grep "python[0-9][0-9]\.lib"` if test -r "$PYLINKFILE"; then PYLINK=-l`basename $PYLINKFILE | sed -e 's/\.lib$//'` else PYLIB= fi fi else # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python version" >&5 $as_echo_n "checking for Python version... " >&6; } # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PYVERSION=`($PYTHON -c "import sys,string,operator,os.path; sys.stdout.write(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))")` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVERSION" >&5 $as_echo "$PYVERSION" >&6; } # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python lib dir" >&5 $as_echo_n "checking for Python lib dir... " >&6; } PYLIBDIR=`($PYTHON -c "import sys; sys.stdout.write(sys.lib)") 2>/dev/null` if test -z "$PYLIBDIR"; then # Fedora patch Python to add sys.lib, for other distros we assume "lib". PYLIBDIR="lib" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLIBDIR" >&5 $as_echo "$PYLIBDIR" >&6; } # Set the include directory { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python header files" >&5 $as_echo_n "checking for Python header files... " >&6; } if test -r $PYPREFIX/include/$PYVERSION/Python.h; then PYINCLUDE="-I$PYPREFIX/include/$PYVERSION -I$PYEPREFIX/$PYLIBDIR/$PYVERSION/config" fi if test -z "$PYINCLUDE"; then if test -r $PYPREFIX/include/Py/Python.h; then PYINCLUDE="-I$PYPREFIX/include/Py -I$PYEPREFIX/$PYLIBDIR/python/lib" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYINCLUDE" >&5 $as_echo "$PYINCLUDE" >&6; } # Set the library directory blindly. This probably won't work with older versions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library directory" >&5 $as_echo_n "checking for Python library directory... " >&6; } dirs="$PYVERSION/config $PYVERSION/$PYLIBDIR python/$PYLIBDIR" for i in $dirs; do if test -d $PYEPREFIX/$PYLIBDIR/$i; then PYLIB="$PYEPREFIX/$PYLIBDIR/$i" break fi done PYLINK="-l$PYVERSION" fi if test -z "$PYLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLIB" >&5 $as_echo "$PYLIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python library" >&5 $as_echo_n "checking for Python library... " >&6; } if test -z "$PYLINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYLINK" >&5 $as_echo "$PYLINK" >&6; } fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHONDYNAMICLINKING="-L$PYLIB $PYLINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHONDYNAMICLINKING="";; esac fi #---------------------------------------------------------------- # Look for Python 3.x #---------------------------------------------------------------- PY3INCLUDE= PY3LIB= PY3LINK= PY3PACKAGE= # Check whether --with-python3 was given. if test "${with_python3+set}" = set; then : withval=$with_python3; PY3BIN="$withval" else PY3BIN="$alllang_default" fi # First, check for "--without-python3" or "--with-python3=no". if test x"${PY3BIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Python 3.x support" >&5 $as_echo "$as_me: Disabling Python 3.x support" >&6;} else if test -z "$PYVER"; then PYVER=0 fi if test "x$PY3BIN" = xyes; then if test x"$PYOSNAME" = x"nt" -a $PYVER -ge 3; then PYTHON3="$PYTHON" else for py_ver in 3 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0 ""; do for ac_prog in python$py_ver 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PYTHON3+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PYTHON3"; then ac_cv_prog_PYTHON3="$PYTHON3" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PYTHON3="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PYTHON3=$ac_cv_prog_PYTHON3 if test -n "$PYTHON3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON3" >&5 $as_echo "$PYTHON3" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON3" && break done if test -n "$PYTHON3"; then for ac_prog in $PYTHON3-config 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PY3CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY3CONFIG"; then ac_cv_prog_PY3CONFIG="$PY3CONFIG" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PY3CONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PY3CONFIG=$ac_cv_prog_PY3CONFIG if test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3CONFIG" >&5 $as_echo "$PY3CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY3CONFIG" && break done if test -n "$PY3CONFIG"; then break fi fi done fi else PYTHON3="$PY3BIN" for ac_prog in $PYTHON3-config 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PY3CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PY3CONFIG"; then ac_cv_prog_PY3CONFIG="$PY3CONFIG" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PY3CONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PY3CONFIG=$ac_cv_prog_PY3CONFIG if test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3CONFIG" >&5 $as_echo "$PY3CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PY3CONFIG" && break done fi if test -n "$PYTHON3"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $PYTHON3 major version number" >&5 $as_echo_n "checking for $PYTHON3 major version number... " >&6; } PYVER=`($PYTHON3 -c "import sys; sys.stdout.write(sys.version[0])") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYVER" >&5 $as_echo "$PYVER" >&6; } if test -z "$PYVER"; then PYVER=0 fi fi if test $PYVER -ge 3; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x os.name" >&5 $as_echo_n "checking for Python 3.x os.name... " >&6; } PY3OSNAME=`($PYTHON3 -c "import sys, os; sys.stdout.write(os.name)")` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3OSNAME" >&5 $as_echo "$PY3OSNAME" >&6; } if test x"$PY3OSNAME" = x"nt"; then # Windows installations are quite different to posix installations # There is no python-config to use { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x prefix" >&5 $as_echo_n "checking for Python 3.x prefix... " >&6; } PY3PREFIX=`($PYTHON3 -c "import sys; sys.stdout.write(sys.prefix)") 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3PREFIX" >&5 $as_echo "$PY3PREFIX" >&6; } PY3PREFIX=`echo "$PY3PREFIX" | sed -e 's,\\\\,/,g'` # Forward slashes are easier to use and even work on Windows most of the time PYTHON_SO=.pyd { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x header files" >&5 $as_echo_n "checking for Python 3.x header files... " >&6; } if test -r $PY3PREFIX/include/Python.h; then PY3INCLUDE="-I$PY3PREFIX/include" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3INCLUDE" >&5 $as_echo "$PY3INCLUDE" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library directory" >&5 $as_echo_n "checking for Python 3.x library directory... " >&6; } if test -d $PY3PREFIX/libs; then PY3LIB=$PY3PREFIX/libs PY3LINKFILE=`ls $PY3LIB/python*.lib | grep "python[0-9][0-9]\.lib"` if test -r "$PY3LINKFILE"; then PY3LINK=-l`basename $PY3LINKFILE | sed -e 's/\.lib$//'` else PY3LIB= fi fi if test -z "$PY3LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIB" >&5 $as_echo "$PY3LIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library" >&5 $as_echo_n "checking for Python 3.x library... " >&6; } if test -z "$PY3LINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LINK" >&5 $as_echo "$PY3LINK" >&6; } fi elif test -n "$PY3CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x prefix" >&5 $as_echo_n "checking for Python 3.x prefix... " >&6; } PY3PREFIX=`($PY3CONFIG --prefix) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3PREFIX" >&5 $as_echo "$PY3PREFIX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x exec-prefix" >&5 $as_echo_n "checking for Python 3.x exec-prefix... " >&6; } PY3EPREFIX=`($PY3CONFIG --exec-prefix) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3EPREFIX" >&5 $as_echo "$PY3EPREFIX" >&6; } # Note: I could not think of a standard way to get the version string from different versions. # This trick pulls it out of the file location for a standard library file. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x version" >&5 $as_echo_n "checking for Python 3.x version... " >&6; } # Need to do this hack since autoconf replaces __file__ with the name of the configure file filehack="file__" PY3VERSION=`($PYTHON3 -c "import string,operator,os.path; print(operator.getitem(os.path.split(operator.getitem(os.path.split(string.__$filehack),0)),1))")` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3VERSION" >&5 $as_echo "$PY3VERSION" >&6; } # Find the directory for libraries this is necessary to deal with # platforms that can have apps built for multiple archs: e.g. x86_64 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x lib dir" >&5 $as_echo_n "checking for Python 3.x lib dir... " >&6; } PY3LIBDIR=`($PYTHON3 -c "import sys; print(sys.lib)") 2>/dev/null` if test -z "$PY3LIBDIR"; then # some dists don't have sys.lib so the best we can do is assume lib PY3LIBDIR="lib" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIBDIR" >&5 $as_echo "$PY3LIBDIR" >&6; } # Set the include directory { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x header files" >&5 $as_echo_n "checking for Python 3.x header files... " >&6; } PY3INCLUDE=`($PY3CONFIG --includes) 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3INCLUDE" >&5 $as_echo "$PY3INCLUDE" >&6; } # Set the library directory blindly. This probably won't work with older versions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library directory" >&5 $as_echo_n "checking for Python 3.x library directory... " >&6; } dirs="$PY3VERSION/config $PY3VERSION/$PY3LIBDIR python/$PY3LIBDIR" for i in $dirs; do if test -d $PY3EPREFIX/$PY3LIBDIR/$i; then PY3LIB="$PY3EPREFIX/$PY3LIBDIR/$i" break fi done if test -z "$PY3LIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LIB" >&5 $as_echo "$PY3LIB" >&6; } fi PY3LINK="-l$PY3VERSION" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Python 3.x library" >&5 $as_echo_n "checking for Python 3.x library... " >&6; } if test -z "$PY3LINK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found" >&5 $as_echo "Not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PY3LINK" >&5 $as_echo "$PY3LINK" >&6; } fi fi fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PYTHON3DYNAMICLINKING="-L$PY3LIB $PY3LINK" DEFS="-DUSE_DL_IMPORT $DEFS" ;; *)PYTHON3DYNAMICLINKING="";; esac fi if test -n "$PYINCLUDE" || test -n "$PY3INCLUDE" ; then for ac_prog in pep8 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PEP8+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PEP8"; then ac_cv_prog_PEP8="$PEP8" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PEP8="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PEP8=$ac_cv_prog_PEP8 if test -n "$PEP8"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PEP8" >&5 $as_echo "$PEP8" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PEP8" && break done if test -n "$PEP8"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking pep8 version" >&5 $as_echo_n "checking pep8 version... " >&6; } pep8_version=`$PEP8 --version 2>/dev/null` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pep8_version" >&5 $as_echo "$pep8_version" >&6; } fi fi #---------------------------------------------------------------- # Look for Perl5 #---------------------------------------------------------------- PERLBIN= # Check whether --with-perl5 was given. if test "${with_perl5+set}" = set; then : withval=$with_perl5; PERLBIN="$withval" else PERLBIN="$alllang_default" fi # First, check for "--without-perl5" or "--with-perl5=no". if test x"${PERLBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Perl5" >&5 $as_echo "$as_me: Disabling Perl5" >&6;} PERL= else # First figure out what the name of Perl5 is if test "x$PERLBIN" = xyes; then for ac_prog in perl perl5.6.1 perl5.6.0 perl5.004 perl5.003 perl5.002 perl5.001 perl5 perl 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PERL="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PERL=$ac_cv_prog_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PERL" && break done else PERL="$PERLBIN" fi # This could probably be simplified as for all platforms and all versions of Perl the following apparently should be run to get the compilation options: # perl -MExtUtils::Embed -e ccopts { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 header files" >&5 $as_echo_n "checking for Perl5 header files... " >&6; } if test -n "$PERL"; then PERL5DIR=`($PERL -MConfig -le 'print $Config{archlibexp}') 2>/dev/null` if test -n "$PERL5DIR" ; then dirs="$PERL5DIR $PERL5DIR/CORE" PERL5EXT=none for i in $dirs; do if test -r $i/perl.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } PERL5EXT="$i" break fi done if test "$PERL5EXT" = none; then PERL5EXT="$PERL5DIR/CORE" { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not locate perl.h...using $PERL5EXT" >&5 $as_echo "could not locate perl.h...using $PERL5EXT" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 library" >&5 $as_echo_n "checking for Perl5 library... " >&6; } PERL5LIB=`($PERL -e 'use Config; $_=$Config{libperl}; s/^lib//; s/$Config{_a}$//; s/\.$Config{so}.*//; print $_, "\n"') 2>/dev/null` if test -z "$PERL5LIB" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5LIB" >&5 $as_echo "$PERL5LIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ccflags" >&5 $as_echo_n "checking for Perl5 ccflags... " >&6; } PERL5CCFLAGS=`($PERL -e 'use Config; print $Config{ccflags}, "\n"' | sed "s/-Wdeclaration-after-statement//" | sed "s/-I/$ISYSTEM/") 2>/dev/null` if test -z "$PERL5CCFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCFLAGS" >&5 $as_echo "$PERL5CCFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ccdlflags" >&5 $as_echo_n "checking for Perl5 ccdlflags... " >&6; } PERL5CCDLFLAGS=`($PERL -e 'use Config; print $Config{ccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCDLFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCDLFLAGS" >&5 $as_echo "$PERL5CCDLFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 cccdlflags" >&5 $as_echo_n "checking for Perl5 cccdlflags... " >&6; } PERL5CCCDLFLAGS=`($PERL -e 'use Config; print $Config{cccdlflags}, "\n"') 2>/dev/null` if test -z "$PERL5CCCDLFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5CCCDLFLAGS" >&5 $as_echo "$PERL5CCCDLFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 ldflags" >&5 $as_echo_n "checking for Perl5 ldflags... " >&6; } PERL5LDFLAGS=`($PERL -e 'use Config; print $Config{ldflags}, "\n"') 2>/dev/null` if test -z "$PERL5LDFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5LDFLAGS" >&5 $as_echo "$PERL5LDFLAGS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Perl5 Test::More module" >&5 $as_echo_n "checking for Perl5 Test::More module... " >&6; } # For test-suite PERL5TESTMORE=`($PERL -e 'use Test::More; print "good";') 2>/dev/null` if test -z "$PERL5TESTMORE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 $as_echo "found" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to determine perl5 configuration" >&5 $as_echo "unable to determine perl5 configuration" >&6; } PERL5EXT=$PERL5DIR fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not figure out how to run perl5" >&5 $as_echo "could not figure out how to run perl5" >&6; } fi # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) PERL5DYNAMICLINKING="-L$PERL5EXT -l$PERL5LIB";; *)PERL5DYNAMICLINKING="";; esac fi #---------------------------------------------------------------- # Look for Octave #---------------------------------------------------------------- OCTAVEBIN= OCTAVE_SO=.oct # Check whether --with-octave was given. if test "${with_octave+set}" = set; then : withval=$with_octave; OCTAVEBIN="$withval" else OCTAVEBIN="$alllang_default" fi # Check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Octave" >&5 $as_echo "$as_me: Disabling Octave" >&6;} OCTAVE= # Check for Octave; prefer command-line program "octave-cli" to (in newer versions) GUI program "octave" elif test "x$OCTAVEBIN" = xyes; then # Extract the first word of "octave-cli octave", so it can be a program name with args. set dummy octave-cli octave; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_OCTAVE+:} false; then : $as_echo_n "(cached) " >&6 else case $OCTAVE in [\\/]* | ?:[\\/]*) ac_cv_path_OCTAVE="$OCTAVE" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_OCTAVE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi OCTAVE=$ac_cv_path_OCTAVE if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE" >&5 $as_echo "$OCTAVE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else OCTAVE="$OCTAVEBIN" fi # Check if Octave works if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${OCTAVE} works" >&5 $as_echo_n "checking if ${OCTAVE} works... " >&6; } if test "x`${OCTAVE} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/Octave, version/p'`" != x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: no, disabling Octave" >&5 $as_echo "$as_me: no, disabling Octave" >&6;} OCTAVE= fi fi # Check for required Octave helper program "mkoctfile" if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mkoctfile" >&5 $as_echo_n "checking for mkoctfile... " >&6; } mkoctfile="`echo $OCTAVE | sed -e 's|[a-z][a-z-]*$|mkoctfile|;t;s|[a-z][a-z-]*\(-[0-9][0-9.+]*\)$|mkoctfile\1|;t'`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${mkoctfile}" >&5 $as_echo "${mkoctfile}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ${mkoctfile} works" >&5 $as_echo_n "checking if ${mkoctfile} works... " >&6; } if test "x`${mkoctfile} --version 2>/dev/null | sed -n -e '1p' | sed -n -e '/mkoctfile, version/p'`" != x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: no, disabling Octave" >&5 $as_echo "$as_me: no, disabling Octave" >&6;} OCTAVE= fi fi # Check for Octave preprocessor/compiler/linker flags if test -n "$OCTAVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave preprocessor flags" >&5 $as_echo_n "checking for Octave preprocessor flags... " >&6; } OCTAVE_CPPFLAGS= for var in CPPFLAGS INCFLAGS ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -D*|-I*) OCTAVE_CPPFLAGS="${OCTAVE_CPPFLAGS} ${flag}";; *) ;; esac done done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_CPPFLAGS" >&5 $as_echo "$OCTAVE_CPPFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave compiler flags" >&5 $as_echo_n "checking for Octave compiler flags... " >&6; } OCTAVE_CXXFLAGS= for var in CXX ALL_CXXFLAGS; do for flag in `env - ${mkoctfile} -p ${var}`; do case ${flag} in -std=*|-g*|-W*) OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} ${flag}";; *) ;; esac done done save_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="-Werror -O0" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : OCTAVE_CXXFLAGS="${OCTAVE_CXXFLAGS} -O0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CXXFLAGS="${save_CXXFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_CXXFLAGS" >&5 $as_echo "$OCTAVE_CXXFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Octave linker flags" >&5 $as_echo_n "checking for Octave linker flags... " >&6; } OCTAVE_LDFLAGS= for var in RDYNAMIC_FLAG LFLAGS RLD_FLAG OCTAVE_LIBS LIBS; do OCTAVE_LDFLAGS="${OCTAVE_LDFLAGS} "`env - ${mkoctfile} -p ${var}` done { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCTAVE_LDFLAGS" >&5 $as_echo "$OCTAVE_LDFLAGS" >&6; } fi # Check for Octave options if test -n "$OCTAVE"; then for octave_opt in --no-window-system --silent --norc --no-history; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Octave option '${octave_opt}' is supported" >&5 $as_echo_n "checking if Octave option '${octave_opt}' is supported... " >&6; } octave_out=`${OCTAVE} ${octave_opt} /dev/null 2>&1 | sed -n '1p' | sed -n '/unrecognized/p'` if test "x${octave_out}" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } OCTAVE="${OCTAVE} ${octave_opt}" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi done fi #---------------------------------------------------------------- # Look for Scilab #---------------------------------------------------------------- # Check whether --with-scilab was given. if test "${with_scilab+set}" = set; then : withval=$with_scilab; SCILABBIN="$withval" else SCILABBIN="$alllang_default" fi # Check whether --with-scilab-inc was given. if test "${with_scilab_inc+set}" = set; then : withval=$with_scilab_inc; SCILABINCDIR="$withval" else SCILABINCDIR="" fi # First, check for "--without-scilab" or "--with-scilab=no". if test x"${SCILABBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Scilab" >&5 $as_echo "$as_me: Disabling Scilab" >&6;} SCILAB= else # Check for Scilab executable if test "x$SCILABBIN" = xyes; then for ac_prog in scilab 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_SCILAB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$SCILAB"; then ac_cv_prog_SCILAB="$SCILAB" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_SCILAB="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi SCILAB=$ac_cv_prog_SCILAB if test -n "$SCILAB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILAB" >&5 $as_echo "$SCILAB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$SCILAB" && break done else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for scilab" >&5 $as_echo_n "checking for scilab... " >&6; } if test -f "$SCILABBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILABBIN" >&5 $as_echo "$SCILABBIN" >&6; } SCILAB="$SCILABBIN" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi fi if test -n "$SCILAB"; then # Check for Scilab version (needs api_scilab so needs version 5.3.3 or higher) SCILAB_FULL_VERSION=`$SCILAB -version | head -1 | sed -e 's|Scilab version \"\(.*\)\"|\1|g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking Scilab version is 5.3.3 or higher" >&5 $as_echo_n "checking Scilab version is 5.3.3 or higher... " >&6; } SCILAB_MAJOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f1` SCILAB_MINOR_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f2` SCILAB_MAINTENANCE_VERSION=`echo $SCILAB_FULL_VERSION | cut -d. -f3` SCILAB_VERSION="$SCILAB_MAJOR_VERSION$SCILAB_MINOR_VERSION$SCILAB_MAINTENANCE_VERSION" if test $SCILAB_VERSION -ge 533; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SCILAB= fi if test -n "$SCILAB"; then # Set Scilab startup options depending on version { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Scilab startup options" >&5 $as_echo_n "checking for Scilab startup options... " >&6; } SCILABOPT="-nwni -nb" if test $SCILAB_VERSION -ge 540; then SCILABOPT+=" -noatomsautoload" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SCILABOPT" >&5 $as_echo "$SCILABOPT" >&6; } # Check for Scilab header files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Scilab header files" >&5 $as_echo_n "checking for Scilab header files... " >&6; } if test "$SCILABINCDIR" != ""; then dirs="$SCILABINCDIR" elif test -n "$PKGCONFIG"; then dirs=`$PKGCONFIG scilab --cflags-only-I | sed -e 's/-I//g'` else dirs="" fi for i in $dirs; do if test -r $i/api_scilab.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i" >&5 $as_echo "$i" >&6; } SCILABINCLUDE="-I$i" break fi if test -r $i/scilab/api_scilab.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i/scilab" >&5 $as_echo "$i/scilab" >&6; } SCILABINCLUDE="-I$i/scilab" break fi done if test "$SCILABINCLUDE" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } SCILAB= fi fi fi fi #---------------------------------------------------------------- # Look for java #---------------------------------------------------------------- # Check whether --with-java was given. if test "${with_java+set}" = set; then : withval=$with_java; JAVABIN="$withval" else JAVABIN="$alllang_default" fi # Check whether --with-javac was given. if test "${with_javac+set}" = set; then : withval=$with_javac; JAVACBIN="$withval" else JAVACBIN= fi # First, check for "--without-java" or "--with-java=no". if test x"${JAVABIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Java" >&5 $as_echo "$as_me: Disabling Java" >&6;} JAVA= else case $host in *-*-cygwin*) if test -n "$JAVA_HOME"; then JAVA_HOME=`cygpath --mixed "$JAVA_HOME"` fi ;; *-*-mingw*) if test -n "$JAVA_HOME"; then JAVA_HOME=`${srcdir}/Tools/convertpath -u "$JAVA_HOME"` fi ;; *-*-darwin*) if test -z "$JAVA_HOME" -a -x /usr/libexec/java_home; then JAVA_HOME=`/usr/libexec/java_home` fi JAVA_OSX_STD_INCDIR="/System/Library/Frameworks/JavaVM.framework/Headers" if test -r "$JAVA_OSX_STD_INCDIR/jni.h"; then JAVA_HOME_INCDIR=$JAVA_OSX_STD_INCDIR fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java JDK" >&5 $as_echo_n "checking for java JDK... " >&6; } if test -n "$JAVA_HOME"; then java_home_ok=1 if test -z "$JAVABIN" -a ! -x "$JAVA_HOME/bin/java"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No java executable under JAVA_HOME." >&5 $as_echo "$as_me: WARNING: No java executable under JAVA_HOME." >&2;} java_home_ok=0 fi if test -z "$JAVACBIN" -a ! -x "$JAVA_HOME/bin/javac"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No javac executable under JAVA_HOME." >&5 $as_echo "$as_me: WARNING: No javac executable under JAVA_HOME." >&2;} java_home_ok=0 fi if test -z "$JAVA_HOME_INCDIR"; then JAVA_HOME_INCDIR="$JAVA_HOME/include" fi if test -z "$JAVAINCDIR" -a ! -r "$JAVA_HOME_INCDIR/jni.h"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No java headers under JAVA_HOME (does it point to a JDK and not just JRE?)." >&5 $as_echo "$as_me: WARNING: No java headers under JAVA_HOME (does it point to a JDK and not just JRE?)." >&2;} java_home_ok=0 fi if test "$java_home_ok" = 1; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: found (in $JAVA_HOME)" >&5 $as_echo "found (in $JAVA_HOME)" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it." >&5 $as_echo "$as_me: WARNING: JAVA_HOME ($JAVA_HOME) is defined but does not point to a complete JDK installation, ignoring it." >&2;} JAVA_HOME= fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (JAVA_HOME is not defined)" >&5 $as_echo "no (JAVA_HOME is not defined)" >&6; } fi if test "x$JAVABIN" = xyes; then if test -n "$JAVA_HOME"; then JAVA="$JAVA_HOME/bin/java" else for ac_prog in java kaffe guavac 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_JAVA+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$JAVA"; then ac_cv_prog_JAVA="$JAVA" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVA="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi JAVA=$ac_cv_prog_JAVA if test -n "$JAVA"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 $as_echo "$JAVA" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$JAVA" && break done fi else JAVA="$JAVABIN" fi if test -z "$JAVACBIN"; then if test -n "$JAVA_HOME"; then JAVAC="$JAVA_HOME/bin/javac" else for ac_prog in javac 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_JAVAC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 $as_echo "$JAVAC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$JAVAC" && break done fi else JAVAC="$JAVACBIN" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java include file jni.h" >&5 $as_echo_n "checking for java include file jni.h... " >&6; } # Check whether --with-javaincl was given. if test "${with_javaincl+set}" = set; then : withval=$with_javaincl; JAVAINCDIR="$withval" else JAVAINCDIR= fi JAVAINC="" if test -z "$JAVAINCDIR" ; then if test -n "$JAVA_HOME"; then JAVAINCDIR="$JAVA_HOME_INCDIR" JAVAINC=-I\"$JAVAINCDIR\" else JAVAINCDIR="/usr/j2sdk*/include /usr/local/j2sdk*/include /usr/jdk*/include /usr/local/jdk*/include /opt/j2sdk*/include /opt/jdk*/include /usr/java/include /usr/java/j2sdk*/include /usr/java/jdk*/include /usr/local/java/include /opt/java/include /usr/include/java /usr/local/include/java /usr/lib/java/include /usr/lib/jvm/java*/include /usr/lib64/jvm/java*/include /usr/include/kaffe /usr/local/include/kaffe /usr/include" # Add in default installation directory on Windows for Cygwin case $host in *-*-cygwin* | *-*-mingw*) JAVAINCDIR="c:/Program*Files*/Java/jdk*/include d:/Program*Files*/Java/jdk*/include c:/j2sdk*/include d:/j2sdk*/include c:/jdk*/include d:/jdk*/include $JAVAINCDIR";; *-*-darwin*) JAVAINCDIR="$JAVA_OSX_STD_INCDIR $JAVAINCDIR";; *);; esac for d in $JAVAINCDIR ; do if test -r "$d/jni.h" ; then JAVAINCDIR=$d JAVAINC=-I\"$d\" break fi done fi else if test -r "$JAVAINCDIR/jni.h" ; then JAVAINC=-I\"$JAVAINCDIR\" fi fi if test "$JAVAINC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAINC" >&5 $as_echo "$JAVAINC" >&6; } # now look for /jni_md.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for java include file jni_md.h" >&5 $as_echo_n "checking for java include file jni_md.h... " >&6; } JAVAMDDIR=`find "$JAVAINCDIR" -follow -name jni_md.h -print` if test "$JAVAMDDIR" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else JAVAMDDIR=-I\"`dirname "$JAVAMDDIR" | tail -1`\" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAMDDIR" >&5 $as_echo "$JAVAMDDIR" >&6; } JAVAINC="${JAVAINC} ${JAVAMDDIR}" fi fi case $host in *-*-cygwin*) # TODO: Only use this flag if the compiler supports it, later versions of gcc no longer have it GCC_MNO_CYGWIN=" -mno-cygwin" ;; *) GCC_MNO_CYGWIN="" ;; esac # java.exe on Cygwin requires the Windows standard (Pascal) calling convention as it is a normal Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then JAVADYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" JAVACFLAGS="$GCC_MNO_CYGWIN -mthreads" else JAVADYNAMICLINKING="" JAVACFLAGS="" fi ;; *-*-darwin*) JAVADYNAMICLINKING="-dynamiclib -framework JavaVM" JAVACFLAGS="" ;; *) JAVADYNAMICLINKING="" JAVACFLAGS="" ;; esac # Java on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) JAVALIBRARYPREFIX="";; *)JAVALIBRARYPREFIX="lib";; esac # Java on Mac OS X tweaks case $host in *-*-darwin*) JAVASO=".jnilib" JAVALDSHARED='$(CC)' JAVACXXSHARED='$(CXX)' ;; *) JAVASO=$SO JAVALDSHARED='$(LDSHARED)' JAVACXXSHARED='$(CXXSHARED)' ;; esac fi # Quote for spaces in path to executables if test -n "$JAVA"; then JAVA=\"$JAVA\" fi if test -n "$JAVAC"; then JAVAC=\"$JAVAC\" fi # Turned off due to spurious warnings in later versions of openjdk-1.8 # JAVAFLAGS=-Xcheck:jni #---------------------------------------------------------------- # Look for Javascript #---------------------------------------------------------------- # Check whether --with-javascript was given. if test "${with_javascript+set}" = set; then : withval=$with_javascript; with_javascript="$withval" else with_javascript="$alllang_default" fi # First, check for "--without-javascript" or "--with-javascript=no". if test x"${with_javascript}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Javascript" >&5 $as_echo "$as_me: Disabling Javascript" >&6;} JAVASCRIPT= else JAVASCRIPT=1 #---------------------------------------------------------------- # General Javascript settings shared by JSC and V8 #---------------------------------------------------------------- case $host in *-*-darwin*) JSSO=".dylib" # HACK: didn't manage to get dynamic module loading working with a g++ compiled interpreter JSINTERPRETERCXX='c++' JSINTERPRETERLINKFLAGS='-g -Wl,-search_paths_first -Wl,-headerpad_max_install_names' ;; *) JSSO=$SO JSINTERPRETERCXX='$(CXX)' JSINTERPRETERLINKFLAGS='-ldl' ;; esac #---------------------------------------------------------------- # Look for Node.js which is the default Javascript engine #---------------------------------------------------------------- for ac_prog in nodejs node 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NODEJS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NODEJS"; then ac_cv_prog_NODEJS="$NODEJS" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NODEJS="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NODEJS=$ac_cv_prog_NODEJS if test -n "$NODEJS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NODEJS" >&5 $as_echo "$NODEJS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NODEJS" && break done if test -n "$NODEJS"; then # node-gyp is needed to run the test-suite/examples for ac_prog in node-gyp 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NODEGYP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NODEGYP"; then ac_cv_prog_NODEGYP="$NODEGYP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NODEGYP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NODEGYP=$ac_cv_prog_NODEGYP if test -n "$NODEGYP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NODEGYP" >&5 $as_echo "$NODEGYP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NODEGYP" && break done if test -z "$NODEGYP"; then NODEJS= fi fi #---------------------------------------------------------------- # Look for JavascriptCore (Webkit) settings (JSCOREINCDIR, JSCOREDYNAMICLINKING) #---------------------------------------------------------------- # check for include files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JavaScriptCore/JavaScript.h" >&5 $as_echo_n "checking for JavaScriptCore/JavaScript.h... " >&6; } # Check whether --with-jscoreinc was given. if test "${with_jscoreinc+set}" = set; then : withval=$with_jscoreinc; JSCOREINCDIR="$withval" else JSCOREINCDIR= fi JSCOREVERSION= if test -z "$JSCOREINCDIR"; then JSCOREINCDIR="/usr/include/ /usr/local/include/" # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSCOREINCDIR="/usr/include/webkit-1.0/ /usr/include/webkitgtk-1.0/ /usr/local/include/webkit-1.0/JavaScriptCore/ $JSCOREINCDIR" ;; *-*-darwin*) JSCOREINCDIR="/System/Library/Frameworks/JavaScriptCore.framework/Headers/ $JSCOREINCDIR" ;; *) ;; esac fi for d in $JSCOREINCDIR ; do if test -r "$d/JavaScriptCore/JavaScript.h" || test -r "$d/JavaScript.h" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $d" >&5 $as_echo "$d" >&6; } JSCOREINCDIR=$d JSCOREINC=-I\"$d\" break fi done if test "$JSCOREINC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi # check for JavaScriptCore/Webkit libraries # Check whether --with-jscorelib was given. if test "${with_jscorelib+set}" = set; then : withval=$with_jscorelib; JSCORELIB="-L$withval" else JSCORELIB= fi if test -z "$JSCORELIB" -a -n "$PKGCONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JavaScriptCore/Webkit library" >&5 $as_echo_n "checking for JavaScriptCore/Webkit library... " >&6; } if pkg-config javascriptcoregtk-1.0; then JSCORELIB=`$PKGCONFIG --libs javascriptcoregtk-1.0` JSCOREVERSION=`$PKGCONFIG --modversion javascriptcoregtk-1.0` fi if test -z "$JSCORELIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } JSCENABLED= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSCORELIB" >&5 $as_echo "$JSCORELIB" >&6; } JSCOREDYNAMICLINKING="$JSCORELIB" JSCENABLED=1 fi fi #---------------------------------------------------------------- # Look for V8 settings (JSV8INCDIR, JSV8DYNAMICLINKING) #---------------------------------------------------------------- # check for include files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for V8 Javascript v8.h" >&5 $as_echo_n "checking for V8 Javascript v8.h... " >&6; } # Check whether --with-jsv8inc was given. if test "${with_jsv8inc+set}" = set; then : withval=$with_jsv8inc; JSV8INCDIR="$withval" fi # if not include dir is specified we try to find if test -z "$JSV8INCDIR"; then # Add in default directory for JavaScriptCore headers for Linux and Mac OS X case $host in *-*-linux*) JSV8INCDIR="/usr/include /usr/local/include/ $JSV8INCDIR" ;; *-*-darwin*) JSV8INCDIR="$JSV8INCDIR" ;; *) ;; esac fi for d in $JSV8INCDIR ; do if test -r "$d/v8.h" ; then JSV8INCDIR=$d JSV8INC=-I\"$d\" break fi done if test "$JSV8INC" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSV8INCDIR" >&5 $as_echo "$JSV8INCDIR" >&6; } fi # check for V8 library { $as_echo "$as_me:${as_lineno-$LINENO}: checking for V8 Javascript library" >&5 $as_echo_n "checking for V8 Javascript library... " >&6; } # Check whether --with-jsv8lib was given. if test "${with_jsv8lib+set}" = set; then : withval=$with_jsv8lib; JSV8LIBDIR="$withval" else JSV8LIB= fi v8libdirs="$JSV8LIBDIR /usr/lib64/ /usr/local/lib64/ /usr/lib/ /usr/local/lib/" for d in $v8libdirs ; do if test -r $d/libv8$JSSO; then JSV8LIBDIR=$d JSV8LIB="-L$d -lv8" break fi done if test "$JSV8LIB" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } JSV8ENABLED= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JSV8LIBDIR" >&5 $as_echo "$JSV8LIBDIR" >&6; } JSV8ENABLED=1 fi # linking options case $host in *-*-darwin*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *-*-linux*) JSV8DYNAMICLINKING="$JSV8LIB" ;; *) JSV8DYNAMICLINKING="" ;; esac fi #---------------------------------------------------------------- # Look for gcj #---------------------------------------------------------------- # Check whether --with-gcj was given. if test "${with_gcj+set}" = set; then : withval=$with_gcj; GCJBIN="$withval" else GCJBIN="$alllang_default" fi # Check whether --with-gcjh was given. if test "${with_gcjh+set}" = set; then : withval=$with_gcjh; GCJHBIN="$withval" else GCJHBIN= fi # First, check for "--without-gcj" or "--with-gcj=no". if test x"${GCJBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling GCJ" >&5 $as_echo "$as_me: Disabling GCJ" >&6;} else if test "x$GCJBIN" = xyes; then for ac_prog in gcj 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GCJ+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GCJ"; then ac_cv_prog_GCJ="$GCJ" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GCJ="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GCJ=$ac_cv_prog_GCJ if test -n "$GCJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCJ" >&5 $as_echo "$GCJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GCJ" && break done else GCJ="$GCJBIN" fi if test -z "$GCJCBIN"; then for ac_prog in gcjh 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GCJH+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GCJH"; then ac_cv_prog_GCJH="$GCJH" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GCJH="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GCJH=$ac_cv_prog_GCJH if test -n "$GCJH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCJH" >&5 $as_echo "$GCJH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GCJH" && break done else GCJH="$GCJHBIN" fi fi #---------------------------------------------------------------- # Look for Android #---------------------------------------------------------------- # Check whether --with-android was given. if test "${with_android+set}" = set; then : withval=$with_android; ANDROIDBIN="$withval" else ANDROIDBIN="$alllang_default" fi # Check whether --with-adb was given. if test "${with_adb+set}" = set; then : withval=$with_adb; ADBBIN="$withval" else ADBBIN= fi # Check whether --with-ant was given. if test "${with_ant+set}" = set; then : withval=$with_ant; ANTBIN="$withval" else ANTBIN= fi # Check whether --with-ndk-build was given. if test "${with_ndk_build+set}" = set; then : withval=$with_ndk_build; NDKBUILDBIN="$withval" else NDKBUILDBIN= fi # First, check for "--without-android" or "--with-android=no". if test x"${ANDROIDBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Android" >&5 $as_echo "$as_me: Disabling Android" >&6;} ANDROID= else if test "x$ANDROIDBIN" = xyes; then for ac_prog in android 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ANDROID+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ANDROID"; then ac_cv_prog_ANDROID="$ANDROID" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ANDROID="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ANDROID=$ac_cv_prog_ANDROID if test -n "$ANDROID"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ANDROID" >&5 $as_echo "$ANDROID" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ANDROID" && break done else ANDROID="$ANDROIDBIN" fi if test -z "$ADBBIN"; then for ac_prog in adb 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ADB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ADB"; then ac_cv_prog_ADB="$ADB" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ADB="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ADB=$ac_cv_prog_ADB if test -n "$ADB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ADB" >&5 $as_echo "$ADB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ADB" && break done else ADB="$ADBBIN" fi if test -z "$ANTBIN"; then for ac_prog in ant 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ANT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ANT"; then ac_cv_prog_ANT="$ANT" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ANT="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ANT=$ac_cv_prog_ANT if test -n "$ANT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ANT" >&5 $as_echo "$ANT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ANT" && break done else ANT="$ANTBIN" fi if test -z "$NDKBUILDBIN"; then for ac_prog in ndk-build 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NDKBUILD+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NDKBUILD"; then ac_cv_prog_NDKBUILD="$NDKBUILD" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NDKBUILD="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NDKBUILD=$ac_cv_prog_NDKBUILD if test -n "$NDKBUILD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NDKBUILD" >&5 $as_echo "$NDKBUILD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$NDKBUILD" && break done else NDKBUILD="$NDKBUILDBIN" fi fi #---------------------------------------------------------------- # Look for Guile #---------------------------------------------------------------- GUILE= GUILE_CFLAGS= GUILE_LIBS= # Check whether --with-guile-config was given. if test "${with_guile_config+set}" = set; then : withval=$with_guile_config; GUILE_CONFIG="$withval" else GUILE_CONFIG= fi # Check whether --with-guile was given. if test "${with_guile+set}" = set; then : withval=$with_guile; GUILE="$withval" else GUILE="$alllang_default" fi # Check whether --with-guile-cflags was given. if test "${with_guile_cflags+set}" = set; then : withval=$with_guile_cflags; GUILE_CFLAGS="$withval" fi # Check whether --with-guile-libs was given. if test "${with_guile_libs+set}" = set; then : withval=$with_guile_libs; GUILE_LIBS="$withval" fi # First, check for "--without-guile" or "--with-guile=no". if test x"${GUILE}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Guile" >&5 $as_echo "$as_me: Disabling Guile" >&6;} else if test -z "$GUILE_CONFIG" ; then # Extract the first word of "guile-config", so it can be a program name with args. set dummy guile-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GUILE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE_CONFIG="$GUILE_CONFIG" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GUILE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GUILE_CONFIG=$ac_cv_path_GUILE_CONFIG if test -n "$GUILE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_CONFIG" >&5 $as_echo "$GUILE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -n "$GUILE_CONFIG" ; then if test x"$GUILE" = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile bindir" >&5 $as_echo_n "checking for guile bindir... " >&6; } guile_bindir="`$GUILE_CONFIG info bindir`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_bindir" >&5 $as_echo "$guile_bindir" >&6; } GUILE=$guile_bindir/guile if ! test -f "$GUILE" ; then GUILE= # Extract the first word of "guile", so it can be a program name with args. set dummy guile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GUILE+:} false; then : $as_echo_n "(cached) " >&6 else case $GUILE in [\\/]* | ?:[\\/]*) ac_cv_path_GUILE="$GUILE" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GUILE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GUILE=$ac_cv_path_GUILE if test -n "$GUILE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE" >&5 $as_echo "$GUILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -f "$GUILE" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile version" >&5 $as_echo_n "checking for guile version... " >&6; } guile_version=`$GUILE -c '(display (effective-version))'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_version" >&5 $as_echo "$guile_version" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile version >= 1.8" >&5 $as_echo_n "checking for guile version >= 1.8... " >&6; } guile_good_version=`$GUILE -c '(if (>= (string->number (effective-version)) 1.8) (display "yes") (display "no"))'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $guile_good_version" >&5 $as_echo "$guile_good_version" >&6; } if test x"$guile_good_version" != xyes ; then GUILE= fi fi if test -z "$GUILE_CFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile compile flags" >&5 $as_echo_n "checking for guile compile flags... " >&6; } GUILE_CFLAGS="`$GUILE_CONFIG compile`" # Note that this can sometimes be empty { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_CFLAGS" >&5 $as_echo "$GUILE_CFLAGS" >&6; } fi if test -z "$GUILE_LIBS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for guile link flags" >&5 $as_echo_n "checking for guile link flags... " >&6; } GUILE_LIBS="`$GUILE_CONFIG link`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GUILE_LIBS" >&5 $as_echo "$GUILE_LIBS" >&6; } fi fi fi #---------------------------------------------------------------- # Look for MzScheme #---------------------------------------------------------------- # Check whether --with-mzscheme was given. if test "${with_mzscheme+set}" = set; then : withval=$with_mzscheme; MZSCHEMEBIN="$withval" else MZSCHEMEBIN="$alllang_default" fi # Check whether --with-mzc was given. if test "${with_mzc+set}" = set; then : withval=$with_mzc; MZCBIN="$withval" else MZCBIN= fi # First, check for "--without-mzscheme" or "--with-mzscheme=no". if test x"${MZSCHEMEBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling MzScheme" >&5 $as_echo "$as_me: Disabling MzScheme" >&6;} MZC= else if test "x$MZSCHEMEBIN" = xyes; then # Extract the first word of "mzscheme", so it can be a program name with args. set dummy mzscheme; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MZSCHEME+:} false; then : $as_echo_n "(cached) " >&6 else case $MZSCHEME in [\\/]* | ?:[\\/]*) ac_cv_path_MZSCHEME="$MZSCHEME" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MZSCHEME="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MZSCHEME=$ac_cv_path_MZSCHEME if test -n "$MZSCHEME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZSCHEME" >&5 $as_echo "$MZSCHEME" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MZSCHEME="$MZSCHEMEBIN" fi if test -z "$MZCBIN"; then # Extract the first word of "mzc", so it can be a program name with args. set dummy mzc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MZC+:} false; then : $as_echo_n "(cached) " >&6 else case $MZC in [\\/]* | ?:[\\/]*) ac_cv_path_MZC="$MZC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MZC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MZC=$ac_cv_path_MZC if test -n "$MZC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZC" >&5 $as_echo "$MZC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -n "$MZSCHEME"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MzScheme dynext object" >&5 $as_echo_n "checking for MzScheme dynext object... " >&6; } MZDYNOBJ=`$MZSCHEME --eval '(begin (require dynext/link) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (printf "~a" x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` if test -f "$MZDYNOBJ"; then : else # older versions (3.72 approx and earlier) MZDYNOBJ=`$MZSCHEME --mute-banner --version --eval '(begin (require (lib "link.ss" "dynext")) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x) (display " ")) ((current-make-standard-link-libraries)))) (with-handlers (((lambda args #t) (lambda args #f))) (for-each (lambda (x) (display x)) (expand-for-link-variant (current-standard-link-libraries)))))' 2>/dev/null` fi if test -f "$MZDYNOBJ"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MZDYNOBJ" >&5 $as_echo "$MZDYNOBJ" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } MZDYNOBJ="" fi fi fi #---------------------------------------------------------------- # Look for Ruby #---------------------------------------------------------------- RUBYBIN= # Check whether --with-ruby was given. if test "${with_ruby+set}" = set; then : withval=$with_ruby; RUBYBIN="$withval" else RUBYBIN="$alllang_default" fi # First, check for "--without-ruby" or "--with-ruby=no". RUBYSO=$SO if test x"${RUBYBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Ruby" >&5 $as_echo "$as_me: Disabling Ruby" >&6;} RUBY= else # First figure out what the name of Ruby is if test "x$RUBYBIN" = xyes; then for ac_prog in ruby 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RUBY+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RUBY"; then ac_cv_prog_RUBY="$RUBY" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RUBY="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RUBY=$ac_cv_prog_RUBY if test -n "$RUBY"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5 $as_echo "$RUBY" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$RUBY" && break done else RUBY="$RUBYBIN" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby header files" >&5 $as_echo_n "checking for Ruby header files... " >&6; } if test -n "$RUBY"; then # Try Ruby1.9+ first RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyhdrdir"] || $rubyhdrdir') 2>/dev/null` RUBYARCHHDRDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyarchhdrdir"] || $rubyarchhdrdir') 2>/dev/null` if test x"$RUBYDIR" = x"" || test x"$RUBYDIR" = x"nil"; then RUBYDIR=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["archdir"] || $archdir') 2>/dev/null` else RUBYARCH=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["arch"] || $arch') 2>/dev/null` fi if test x"$RUBYDIR" != x""; then dirs="$RUBYDIR" RUBYINCLUDE= for i in $dirs; do if test -r $i/ruby.h; then if test x"$RUBYARCH" = x""; then RUBYINCLUDE="-I$i" elif test -n "$RUBYARCHHDRDIR"; then RUBYINCLUDE="-I$i -I$RUBYARCHHDRDIR" else RUBYINCLUDE="-I$i -I$i/$RUBYARCH" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBYINCLUDE" >&5 $as_echo "$RUBYINCLUDE" >&6; } break fi done if test x"$RUBYINCLUDE" = x""; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not locate ruby.h" >&5 $as_echo "could not locate ruby.h" >&6; } fi # Find library and path for linking. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ruby library" >&5 $as_echo_n "checking for Ruby library... " >&6; } RUBYLIB="" rb_archlibdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["archlibdir"]') 2>/dev/null` rb_libdir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["libdir"]') 2>/dev/null` rb_bindir=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["bindir"]') 2>/dev/null` dirs="$dirs $rb_archlibdir $rb_libdir $rb_bindir" rb_libruby=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBRUBY_A"]') 2>/dev/null` RUBYLINK=`($RUBY -rrbconfig -e ' c = RbConfig::CONFIG if c.has_key? "LIBRUBYARG_STATIC" # 1.8.x if c["LIBRUBY"] == c["LIBRUBY_A"] link = c["LIBRUBYARG_STATIC"] else link = c["LIBRUBYARG_SHARED"] end else # 1.6.x link = "-l" + c["RUBY_INSTALL_NAME"] end # Get the target Ruby was built for target = c["target"] if target == "i386-pc-mswin32" # Need to change msvcrt-ruby*.lib to -lmsvcrt-ruby* ext = File.extname(link) # Get index that counts backwards from end of string index = -1 - ext.size # Strip off the extension link = link.slice(0..index) puts "-l#{link}" else puts link end') 2>/dev/null` if test "$rb_libruby" != ""; then for i in $dirs; do if (test -r $i/$rb_libruby;) then RUBYLIB="$i" break fi done fi if test "$RUBYLIB" = ""; then RUBYLIB="$RUBYDIR" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found... using $RUBYDIR" >&5 $as_echo "not found... using $RUBYDIR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RUBYLINK in $RUBYLIB" >&5 $as_echo "$RUBYLINK in $RUBYLIB" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: result: unable to determine ruby configuration" >&5 $as_echo "unable to determine ruby configuration" >&6; } fi case $host in *-*-mingw*) ;; # do nothing, the default windows libraries are already included *) RUBYLINK="$RUBYLINK `($RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBS"]') 2>/dev/null`";; esac RUBYCCDLFLAGS=`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["CCDLFLAGS"]') 2>/dev/null` RUBYSO=.`($RUBY -rrbconfig -e 'print RbConfig::CONFIG["DLEXT"]') 2>/dev/null` else { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not figure out how to run ruby" >&5 $as_echo "could not figure out how to run ruby" >&6; } fi case $host in *-*-cygwin* | *-*-mingw*) RUBYDYNAMICLINKING="-L$RUBYLIB $RUBYLINK";; *) RUBYDYNAMICLINKING="";; esac fi #------------------------------------------------------------------------- # Look for PHP5 #------------------------------------------------------------------------- PHP5BIN= # Check whether --with-php5 was given. if test "${with_php5+set}" = set; then : withval=$with_php5; PHP5BIN="$withval" else PHP5BIN="$alllang_default" fi # First, check for "--without-php5" or "--with-php5=no". if test x"${PHP5BIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling PHP5" >&5 $as_echo "$as_me: Disabling PHP5" >&6;} PHP5= else if test "x$PHP5BIN" = xyes; then for ac_prog in php5 php 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PHP5+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PHP5"; then ac_cv_prog_PHP5="$PHP5" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PHP5="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PHP5=$ac_cv_prog_PHP5 if test -n "$PHP5"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHP5" >&5 $as_echo "$PHP5" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PHP5" && break done else PHP5=$PHP5BIN fi if test -n "$PHP5"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PHP5 header files" >&5 $as_echo_n "checking for PHP5 header files... " >&6; } case $PHP5 in *5) PHP5CONFIG=`echo "$PHP5"|sed 's/5$/-config5/'` ;; *) PHP5CONFIG=$PHP5-config ;; esac php5_version=`$PHP5CONFIG --version 2>/dev/null` case $php5_version in 5*) PHP5INC=`$PHP5CONFIG --includes 2>/dev/null` if test -n "$PHP5INC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHP5INC" >&5 $as_echo "$PHP5INC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi ;; "") { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find $PHP5CONFIG or obtain PHP5 version from it" >&5 $as_echo "could not find $PHP5CONFIG or obtain PHP5 version from it" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: found PHP $php_version - not PHP 5" >&5 $as_echo "found PHP $php_version - not PHP 5" >&6; } ;; esac fi fi #------------------------------------------------------------------------- # Look for PHP7 #------------------------------------------------------------------------- PHPBIN= # Check whether --with-php was given. if test "${with_php+set}" = set; then : withval=$with_php; PHPBIN="$withval" else PHPBIN="$alllang_default" fi # First, check for "--without-php" or "--with-php=no". if test x"${PHPBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling PHP" >&5 $as_echo "$as_me: Disabling PHP" >&6;} PHP= else if test "x$PHPBIN" = xyes; then for ac_prog in php7.1 php7.0 php 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PHP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PHP"; then ac_cv_prog_PHP="$PHP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PHP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PHP=$ac_cv_prog_PHP if test -n "$PHP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHP" >&5 $as_echo "$PHP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PHP" && break done else PHP=$PHPBIN fi if test -n "$PHP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PHP header files" >&5 $as_echo_n "checking for PHP header files... " >&6; } case $PHP in *7.*) PHPCONFIG=`echo "$PHP"|sed 's/7\...*$/-config&/'` ;; *) PHPCONFIG=$PHP-config ;; esac php_version=`$PHPCONFIG --version 2>/dev/null` case $php_version in 7.*) PHPINC=`$PHPCONFIG --includes 2>/dev/null` if test -n "$PHPINC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHPINC" >&5 $as_echo "$PHPINC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi ;; "") { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not find $PHPCONFIG or obtain PHP version from it" >&5 $as_echo "could not find $PHPCONFIG or obtain PHP version from it" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: found PHP $php_version - not PHP 7" >&5 $as_echo "found PHP $php_version - not PHP 7" >&6; } ;; esac fi fi #---------------------------------------------------------------- # Look for ocaml #---------------------------------------------------------------- # Check whether --with-ocaml was given. if test "${with_ocaml+set}" = set; then : withval=$with_ocaml; with_ocaml="$withval" else with_ocaml="$alllang_default" fi # Check whether --with-ocamlc was given. if test "${with_ocamlc+set}" = set; then : withval=$with_ocamlc; OCAMLC="$withval" else OCAMLC= fi # Check whether --with-ocamldlgen was given. if test "${with_ocamldlgen+set}" = set; then : withval=$with_ocamldlgen; OCAMLDLGEN="$withval" else OCAMLDLGEN= fi # Check whether --with-ocamlfind was given. if test "${with_ocamlfind+set}" = set; then : withval=$with_ocamlfind; OCAMLFIND="$withval" else OCAMLFIND= fi # Check whether --with-ocamlmktop was given. if test "${with_ocamlmktop+set}" = set; then : withval=$with_ocamlmktop; OCAMLMKTOP="$withval" else OCAMLMKTOP= fi # Check whether --with-camlp4 was given. if test "${with_camlp4+set}" = set; then : withval=$with_camlp4; CAMLP4="$withval" else CAMLP4= fi # First, check for "--without-ocaml" or "--with-ocaml=no". if test x"${with_ocaml}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling OCaml" >&5 $as_echo "$as_me: Disabling OCaml" >&6;} OCAMLC= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ocaml DL load generator" >&5 $as_echo_n "checking for Ocaml DL load generator... " >&6; } if test -z "$OCAMLDLGEN"; then for ac_prog in ocamldlgen 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLDLGEN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLDLGEN"; then ac_cv_prog_OCAMLDLGEN="$OCAMLDLGEN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLDLGEN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLDLGEN=$ac_cv_prog_OCAMLDLGEN if test -n "$OCAMLDLGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDLGEN" >&5 $as_echo "$OCAMLDLGEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLDLGEN" && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ocaml package tool" >&5 $as_echo_n "checking for Ocaml package tool... " >&6; } if test -z "$OCAMLFIND"; then for ac_prog in ocamlfind 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLFIND+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLFIND"; then ac_cv_prog_OCAMLFIND="$OCAMLFIND" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLFIND="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLFIND=$ac_cv_prog_OCAMLFIND if test -n "$OCAMLFIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLFIND" >&5 $as_echo "$OCAMLFIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLFIND" && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ocaml compiler" >&5 $as_echo_n "checking for Ocaml compiler... " >&6; } if test -z "$OCAMLC"; then for ac_prog in ocamlc 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLC"; then ac_cv_prog_OCAMLC="$OCAMLC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLC=$ac_cv_prog_OCAMLC if test -n "$OCAMLC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLC" >&5 $as_echo "$OCAMLC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLC" && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ocaml toplevel creator" >&5 $as_echo_n "checking for Ocaml toplevel creator... " >&6; } if test -z "$OCAMLMKTOP"; then for ac_prog in ocamlmktop 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OCAMLMKTOP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OCAMLMKTOP"; then ac_cv_prog_OCAMLMKTOP="$OCAMLMKTOP" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OCAMLMKTOP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OCAMLMKTOP=$ac_cv_prog_OCAMLMKTOP if test -n "$OCAMLMKTOP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKTOP" >&5 $as_echo "$OCAMLMKTOP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$OCAMLMKTOP" && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ocaml Pre-Processor-Pretty-Printer" >&5 $as_echo_n "checking for Ocaml Pre-Processor-Pretty-Printer... " >&6; } if test -z "$CAMLP4"; then for ac_prog in camlp4 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CAMLP4+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CAMLP4"; then ac_cv_prog_CAMLP4="$CAMLP4" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CAMLP4="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CAMLP4=$ac_cv_prog_CAMLP4 if test -n "$CAMLP4"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4" >&5 $as_echo "$CAMLP4" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CAMLP4" && break done fi fi # Disabling ocaml #---------------------------------------------------------------- # Look for Pike #---------------------------------------------------------------- # Identify the name of the Pike executable # Priority: configure option, automatic search PIKEBIN= # Check whether --with-pike was given. if test "${with_pike+set}" = set; then : withval=$with_pike; PIKEBIN="$withval" else PIKEBIN="$alllang_default" fi # First, check for "--without-pike" or "--with-pike=no". if test x"${PIKEBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Pike" >&5 $as_echo "$as_me: Disabling Pike" >&6;} PIKEBIN= else if test "x$PIKEBIN" = xyes; then for ac_prog in pike pike7.8 pike7.6 pike7.4 pike7.2 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PIKE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PIKE"; then ac_cv_prog_PIKE="$PIKE" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PIKE="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PIKE=$ac_cv_prog_PIKE if test -n "$PIKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PIKE" >&5 $as_echo "$PIKE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PIKE" && break done else PIKE="$PIKEBIN" fi # Check for pike-config # Priority: configure option, guessed from $PIKE, search from list # Check whether --with-pike-config was given. if test "${with_pike_config+set}" = set; then : withval=$with_pike_config; PIKECONFIG="$withval" else PIKECONFIG="" fi if test -z "$PIKECONFIG" -a -n "$PIKE"; then for ac_prog in $PIKE-config pike-config \ pike7.6-config pike7.4-config pike7.2-config 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_PIKECONFIG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PIKECONFIG"; then ac_cv_prog_PIKECONFIG="$PIKECONFIG" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PIKECONFIG="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi PIKECONFIG=$ac_cv_prog_PIKECONFIG if test -n "$PIKECONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PIKECONFIG" >&5 $as_echo "$PIKECONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PIKECONFIG" && break done fi # Check for a --with-pikeincl option to configure # Priority: configure option, info from $PIKECONFIG, guessed by pike script # Check whether --with-pikeincl was given. if test "${with_pikeincl+set}" = set; then : withval=$with_pikeincl; PIKEINCLUDE="-I$withval" else PIKEINCLUDE= fi if test -n "$PIKE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Pike header files" >&5 $as_echo_n "checking for Pike header files... " >&6; } if test -z "$PIKEINCLUDE" -a -n "$PIKECONFIG"; then PIKEINCLUDE=`$PIKECONFIG --cflags` fi if test -z "$PIKEINCLUDE" -a -n "$PIKE"; then PIKEINCLUDE=`$PIKE -x cflags` if test -z "$PIKEINCLUDE"; then PIKEPATH=`which $PIKE` PIKEINCLUDE=`$PIKE Tools/check-include-path.pike $PIKEPATH` PIKEINCLUDE="-I$PIKEINCLUDE" fi fi if test -z "$PIKEINCLUDE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PIKEINCLUDE" >&5 $as_echo "$PIKEINCLUDE" >&6; } fi fi fi #---------------------------------------------------------------- # Look for CHICKEN #---------------------------------------------------------------- CHICKEN= CHICKEN_CONFIG= CHICKENHOME= CHICKENOPTS= CHICKENLIB= # Check whether --with-chicken was given. if test "${with_chicken+set}" = set; then : withval=$with_chicken; CHICKENBIN="$withval" else CHICKENBIN="$alllang_default" fi # First, check for "--without-chicken" or "--with-chicken=no". if test x"${CHICKENBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling CHICKEN" >&5 $as_echo "$as_me: Disabling CHICKEN" >&6;} else if test "x$CHICKENBIN" = xyes; then for ac_prog in chicken 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CHICKEN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CHICKEN"; then ac_cv_prog_CHICKEN="$CHICKEN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CHICKEN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CHICKEN=$ac_cv_prog_CHICKEN if test -n "$CHICKEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHICKEN" >&5 $as_echo "$CHICKEN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CHICKEN" && break done else CHICKEN="$CHICKENBIN" fi # Check whether --with-chickencsc was given. if test "${with_chickencsc+set}" = set; then : withval=$with_chickencsc; CHICKEN_CSC="$withval" else CHICKEN_CSC= fi if test -z "$CHICKEN_CSC"; then for ac_prog in csc 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CHICKEN_CSC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CHICKEN_CSC"; then ac_cv_prog_CHICKEN_CSC="$CHICKEN_CSC" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CHICKEN_CSC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CHICKEN_CSC=$ac_cv_prog_CHICKEN_CSC if test -n "$CHICKEN_CSC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHICKEN_CSC" >&5 $as_echo "$CHICKEN_CSC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CHICKEN_CSC" && break done # Both the Microsoft C# compiler and chicken have an executable called csc, so check that this csc is really the chicken one if test -n "$CHICKEN_CSC" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether csc is the chicken compiler" >&5 $as_echo_n "checking whether csc is the chicken compiler... " >&6; } $CHICKEN_CSC -version 2>/dev/null | grep "chicken" > /dev/null || CHICKEN_CSC="" if test -z "$CHICKEN_CSC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi fi # Check whether --with-chickencsi was given. if test "${with_chickencsi+set}" = set; then : withval=$with_chickencsi; CHICKEN_CSI="$withval" else CHICKEN_CSI= fi if test -z "$CHICKEN_CSI"; then for ac_prog in csi 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CHICKEN_CSI+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CHICKEN_CSI"; then ac_cv_prog_CHICKEN_CSI="$CHICKEN_CSI" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CHICKEN_CSI="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CHICKEN_CSI=$ac_cv_prog_CHICKEN_CSI if test -n "$CHICKEN_CSI"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHICKEN_CSI" >&5 $as_echo "$CHICKEN_CSI" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CHICKEN_CSI" && break done fi if test -n "$CHICKEN_CSC" ; then # Check whether --with-chickenopts was given. if test "${with_chickenopts+set}" = set; then : withval=$with_chickenopts; CHICKENOPTS="$withval" else CHICKENOPTS= fi # Check whether --with-chickensharedlib was given. if test "${with_chickensharedlib+set}" = set; then : withval=$with_chickensharedlib; CHICKENSHAREDLIB="$withval" else CHICKENSHAREDLIB= fi # Check whether --with-chickenlib was given. if test "${with_chickenlib+set}" = set; then : withval=$with_chickenlib; CHICKENLIB="$withval" else CHICKENLIB= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler options for static CHICKEN generated code" >&5 $as_echo_n "checking for compiler options for static CHICKEN generated code... " >&6; } if test -z "$CHICKENOPTS"; then CHICKENOPTS="`$CHICKEN_CSC -cflags`" else CHICKENOPTS="`$CHICKEN_CSC -cflags` $CHICKENOPTS" fi if test -z "$CHICKENOPTS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHICKENOPTS" >&5 $as_echo "$CHICKENOPTS" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker options for shared CHICKEN generated code" >&5 $as_echo_n "checking for linker options for shared CHICKEN generated code... " >&6; } if test -z "$CHICKENSHAREDLIB"; then CHICKENSHAREDLIB="`$CHICKEN_CSC -shared -libs`" else CHICKENSHAREDLIB="`$CHICKEN_CSC -shared -libs` $CHICKENSHAREDLIB" fi if test -z "$CHICKENSHAREDLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHICKENSHAREDLIB" >&5 $as_echo "$CHICKENSHAREDLIB" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker options for static CHICKEN generated code" >&5 $as_echo_n "checking for linker options for static CHICKEN generated code... " >&6; } if test -z "$CHICKENLIB"; then CHICKENLIB="`$CHICKEN_CSC -libs`" else CHICKENLIB="`$CHICKEN_CSC -libs` $CHICKENLIB" fi if test -z "$CHICKENLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHICKENLIB" >&5 $as_echo "$CHICKENLIB" >&6; } fi fi # have CHICKEN_CONFIG fi # Check for --without-chicken #---------------------------------------------------------------- # Look for C# #---------------------------------------------------------------- # Check whether --with-csharp was given. if test "${with_csharp+set}" = set; then : withval=$with_csharp; with_csharp="$withval" else with_csharp="$alllang_default" fi # Check whether --with-cil-interpreter was given. if test "${with_cil_interpreter+set}" = set; then : withval=$with_cil_interpreter; CSHARPBIN="$withval" else CSHARPBIN= fi # Check whether --with-csharp-compiler was given. if test "${with_csharp_compiler+set}" = set; then : withval=$with_csharp_compiler; CSHARPCOMPILERBIN="$withval" else CSHARPCOMPILERBIN= fi # First, check for "--without-csharp" or "--with-csharp=no". if test x"${with_csharp}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling CSharp" >&5 $as_echo "$as_me: Disabling CSharp" >&6;} CSHARPCOMPILER= else if test -z "$CSHARPCOMPILERBIN" ; then case $host in *-*-cygwin* | *-*-mingw*) # prefer Mono gmcs (.NET 2.0) over mcs (.NET 1.1) - note mcs-1.2.3 has major pinvoke bug for ac_prog in csc mono-csc gmcs mcs cscc 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCOMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done if test -n "$CSHARPCOMPILER" && test "$CSHARPCOMPILER" = "csc" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether csc is the Microsoft CSharp compiler" >&5 $as_echo_n "checking whether csc is the Microsoft CSharp compiler... " >&6; } csc 2>/dev/null | grep "C#" > /dev/null || CSHARPCOMPILER="" if test -z "$CSHARPCOMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } for ac_prog in mono-csc gmcs mcs cscc 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCOMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi ;; *)for ac_prog in mono-csc gmcs mcs cscc 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCOMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCOMPILER"; then ac_cv_prog_CSHARPCOMPILER="$CSHARPCOMPILER" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCOMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCOMPILER=$ac_cv_prog_CSHARPCOMPILER if test -n "$CSHARPCOMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCOMPILER" >&5 $as_echo "$CSHARPCOMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCOMPILER" && break done ;; esac else CSHARPCOMPILER="$CSHARPCOMPILERBIN" fi CSHARPCONVERTPATH="Tools/convertpath -u" if test -z "$CSHARPBIN" ; then CSHARPCILINTERPRETER="" CSHARPCILINTERPRETER_FLAGS="" if test "cscc" = "$CSHARPCOMPILER" ; then for ac_prog in ilrun 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCILINTERPRETER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCILINTERPRETER"; then ac_cv_prog_CSHARPCILINTERPRETER="$CSHARPCILINTERPRETER" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCILINTERPRETER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCILINTERPRETER=$ac_cv_prog_CSHARPCILINTERPRETER if test -n "$CSHARPCILINTERPRETER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCILINTERPRETER" >&5 $as_echo "$CSHARPCILINTERPRETER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCILINTERPRETER" && break done else if test "mcs" = "$CSHARPCOMPILER"; then # Check that mcs is the C# compiler and not the Unix mcs utility by examining the output of 'mcs --version' # The Mono compiler should emit: Mono C# compiler version a.b.c.d csharp_version_raw=`(mcs --version) 2>/dev/null` csharp_version_searched=`(mcs --version | sed -e "/C#/b" -e "/Mono/b" -e d) 2>/dev/null` # return string if contains 'Mono' or 'C#' CSHARPCOMPILER="" if test -n "$csharp_version_raw" ; then if test "$csharp_version_raw" = "$csharp_version_searched" ; then CSHARPCOMPILER="mcs" fi fi if test "mcs" != "$CSHARPCOMPILER" ; then echo "mcs is not a working Mono C# compiler" fi fi if test "mcs" = "$CSHARPCOMPILER" || test "gmcs" = "$CSHARPCOMPILER" || test "mono-csc" = "$CSHARPCOMPILER"; then for ac_prog in mono 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CSHARPCILINTERPRETER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CSHARPCILINTERPRETER"; then ac_cv_prog_CSHARPCILINTERPRETER="$CSHARPCILINTERPRETER" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CSHARPCILINTERPRETER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CSHARPCILINTERPRETER=$ac_cv_prog_CSHARPCILINTERPRETER if test -n "$CSHARPCILINTERPRETER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CSHARPCILINTERPRETER" >&5 $as_echo "$CSHARPCILINTERPRETER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CSHARPCILINTERPRETER" && break done # Mono JIT CSHARPCILINTERPRETER_FLAGS="--debug" else if test "csc" = "$CSHARPCOMPILER"; then CSHARPCONVERTPATH="Tools/convertpath -w" fi fi fi else CSHARPCILINTERPRETER="$CSHARPBIN" fi # Cygwin requires the Windows standard (Pascal) calling convention as it is a Windows executable and not a Cygwin built executable case $host in *-*-cygwin* | *-*-mingw*) if test "$GCC" = yes; then CSHARPDYNAMICLINKING="$GCC_MNO_CYGWIN -mthreads -Wl,--add-stdcall-alias" CSHARPCFLAGS="$GCC_MNO_CYGWIN -mthreads" else CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" fi ;; *) CSHARPDYNAMICLINKING="" CSHARPCFLAGS="" ;; esac # CSharp on Windows platforms including Cygwin doesn't use libname.dll, rather name.dll when loading dlls case $host in *-*-cygwin* | *-*-mingw*) CSHARPLIBRARYPREFIX="";; *)CSHARPLIBRARYPREFIX="lib";; esac # C#/Mono on Mac OS X tweaks case $host in *-*-darwin*) CSHARPSO=".so" ;; *) CSHARPSO=$SO ;; esac fi #---------------------------------------------------------------- # Look for Lua #---------------------------------------------------------------- LUABIN= LUAINCLUDE= LUALIB= LUADYNAMICLOADLIB= LUAFLAGS= LUALINK= # note: if LUABIN is empty then lua tests will not be done # LUABIN will be cleared if certain dependencies cannot be found # Check whether --with-lua was given. if test "${with_lua+set}" = set; then : withval=$with_lua; LUABIN="$withval" else LUABIN="$alllang_default" fi # Check whether --with-luaincl was given. if test "${with_luaincl+set}" = set; then : withval=$with_luaincl; LUAINCLUDE="$withval" else LUAINCLUDE= fi # Check whether --with-lualib was given. if test "${with_lualib+set}" = set; then : withval=$with_lualib; LUALIB="$withval" else LUALIB= fi # First, check for "--without-lua" or "--with-lua=no". if test x"${LUABIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Lua" >&5 $as_echo "$as_me: Disabling Lua" >&6;} else # can we find lua? if test "x$LUABIN" = xyes; then # We look for a versioned Lua binary first, as there can be # multiple versions of Lua installed on some systems (like Debian). # The search order should match the include-file and library search # orders below (a Lua shared library built for one version may not # work with a Lua binary of a different version). for ac_prog in lua5.4 lua5.3 lua5.2 lua5.1 lua 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LUABIN+:} false; then : $as_echo_n "(cached) " >&6 else case $LUABIN in [\\/]* | ?:[\\/]*) ac_cv_path_LUABIN="$LUABIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LUABIN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LUABIN=$ac_cv_path_LUABIN if test -n "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LUABIN" >&5 $as_echo "$LUABIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$LUABIN" && break done fi # check version: we need Lua 5.x if test "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking Lua version" >&5 $as_echo_n "checking Lua version... " >&6; } # if version 5.x LUAV5=`$LUABIN -e 'if string.sub(_VERSION,5,5)=="5" then print "1" end'` # if not version 5.0 LUAV51=`$LUABIN -e 'if string.sub(_VERSION,5,7)~="5.0" then print "1" end'` if test -z "$LUAV5"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not Lua 5.x" >&5 $as_echo "$as_me: WARNING: Not Lua 5.x" >&2;} LUABIN="" elif test -z "$LUAV51"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Lua 5.0.x" >&5 $as_echo "Lua 5.0.x" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Lua 5.1 or later" >&5 $as_echo "Lua 5.1 or later" >&6; } fi fi if test "$LUABIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Lua dynamic loading is enabled" >&5 $as_echo_n "checking whether Lua dynamic loading is enabled... " >&6; } # using Lua to check Lua # lua 5.0 & 5.1 have different fn names if test -z "$LUAV51"; then LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=loadlib("no_such_lib","") if c~="absent" then print "1" end'` else LUADYNAMICLOADLIB=`$LUABIN -e '_,_,c=package.loadlib("no_such_lib","") if c~="absent" then print "1" end'` fi if test -z "$LUADYNAMICLOADLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # look for the header files & set LUAFLAGS accordingly # will clear LUABIN if not present if test -n "$LUAINCLUDE"; then as_ac_File=`$as_echo "ac_cv_file_$LUAINCLUDE/lua.h" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LUAINCLUDE/lua.h" >&5 $as_echo_n "checking for $LUAINCLUDE/lua.h... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$LUAINCLUDE/lua.h"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : LUAFLAGS="$ISYSTEM$LUAINCLUDE" else LUABIN= fi else LUA_OK="1" CFLAGS_SAVED=$CFLAGS CFLAGS= # Use empty CFLAGS to avoid failure: "present but cannot be compiled" # 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` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "lua.h" "ac_cv_header_lua_h" "$ac_includes_default" if test "x$ac_cv_header_lua_h" = xyes; then : LUAFLAGS="" else LUA_OK="" fi CFLAGS=$CFLAGS_SAVED # if we didn't get it, going to have to look elsewhere (the hard way) if test -z "$LUA_OK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lua.h in other locations" >&5 $as_echo_n "checking for lua.h in other locations... " >&6; } # note: Debian/Ubuntu seem to like /usr/include/lua5.1/lua.h # The ordering of the include directories to search should match # the ordering of libraries to search in the library test below. inc=/usr/include dirs="$inc/lua5.4 $inc/lua5.3 $inc/lua5.2 $inc/lua5.1 $inc/lua51 $inc/lua5.0 $inc/lua50 /usr/local/include" for i in $dirs; do #echo "$i" if test -r $i/lua.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $i/lua.h" >&5 $as_echo "$i/lua.h" >&6; } LUAFLAGS="$ISYSTEM$i" break fi done if test -z "$LUAFLAGS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } LUABIN="" # clear the bin fi fi fi # look for the library files & set LUALINK accordingly # will clear LUABIN if not present lua_save_LIBS=$LIBS # the code seems to disrupt LIBS, so saving if test -n "$LUALIB"; then as_ac_File=`$as_echo "ac_cv_file_$LUALIB/liblua.a" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LUALIB/liblua.a" >&5 $as_echo_n "checking for $LUALIB/liblua.a... " >&6; } if eval \${$as_ac_File+:} false; then : $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && as_fn_error $? "cannot check for file existence when cross compiling" "$LINENO" 5 if test -r "$LUALIB/liblua.a"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi eval ac_res=\$$as_ac_File { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_File"\" = x"yes"; then : LUALINK="-L$LUALIB -llua" else LUABIN= fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing lua_close" >&5 $as_echo_n "checking for library containing lua_close... " >&6; } if ${ac_cv_search_lua_close+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lua_close (); int main () { return lua_close (); ; return 0; } _ACEOF for ac_lib in '' lua lua5.4 lua5.3 lua5.2 lua5.1 lua51 lua5.0 lua50; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_lua_close=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_lua_close+:} false; then : break fi done if ${ac_cv_search_lua_close+:} false; then : else ac_cv_search_lua_close=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_lua_close" >&5 $as_echo "$ac_cv_search_lua_close" >&6; } ac_res=$ac_cv_search_lua_close if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" LUALINK="-l$ac_lib" else LUABIN= fi fi # adding lualib for lua 5.0 if test -z "$LUAV51"; then # extra for lua 5.0 LUALINK="$LUALINK -llualib" fi LIBS=$lua_save_LIBS # restore LIBS fi fi # if not disabled #---------------------------------------------------------------- # Look for Allegro Common Lisp #---------------------------------------------------------------- ALLEGROCLBIN= # Check whether --with-allegrocl was given. if test "${with_allegrocl+set}" = set; then : withval=$with_allegrocl; ALLEGROCLBIN="$withval" else ALLEGROCLBIN="$alllang_default" fi # First, check for "--without-allegrocl" or "--with-allegrocl=no". if test x"${ALLEGROCLBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Allegro CL" >&5 $as_echo "$as_me: Disabling Allegro CL" >&6;} ALLEGROCLBIN= else # can we find allegrocl? if test "x$ALLEGROCLBIN" = xyes; then # Extract the first word of "alisp", so it can be a program name with args. set dummy alisp; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ALLEGROCLBIN+:} false; then : $as_echo_n "(cached) " >&6 else case $ALLEGROCLBIN in [\\/]* | ?:[\\/]*) ac_cv_path_ALLEGROCLBIN="$ALLEGROCLBIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ALLEGROCLBIN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ALLEGROCLBIN=$ac_cv_path_ALLEGROCLBIN if test -n "$ALLEGROCLBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ALLEGROCLBIN" >&5 $as_echo "$ALLEGROCLBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi #---------------------------------------------------------------- # Look for GNU CLISP #---------------------------------------------------------------- CLISPBIN= # Check whether --with-clisp was given. if test "${with_clisp+set}" = set; then : withval=$with_clisp; CLISPBIN="$withval" else CLISPBIN="$alllang_default" fi # First, check for "--without-clisp" or "--with-clisp=no". if test x"${CLISPBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling CLISP" >&5 $as_echo "$as_me: Disabling CLISP" >&6;} CLISPBIN= else # can we find clisp? if test "x$CLISPBIN" = xyes; then # Extract the first word of "clisp", so it can be a program name with args. set dummy clisp; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CLISPBIN+:} false; then : $as_echo_n "(cached) " >&6 else case $CLISPBIN in [\\/]* | ?:[\\/]*) ac_cv_path_CLISPBIN="$CLISPBIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_CLISPBIN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi CLISPBIN=$ac_cv_path_CLISPBIN if test -n "$CLISPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CLISPBIN" >&5 $as_echo "$CLISPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi #---------------------------------------------------------------- # Look for GNU R #---------------------------------------------------------------- RBIN= # Check whether --with-r was given. if test "${with_r+set}" = set; then : withval=$with_r; RBIN="$withval" else RBIN="$alllang_default" fi # First, check for "--without-r" or "--with-r=no". if test x"${RBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling R" >&5 $as_echo "$as_me: Disabling R" >&6;} RBIN= else # can we find R? if test "x$RBIN" = xyes; then # Extract the first word of "R", so it can be a program name with args. set dummy R; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RBIN+:} false; then : $as_echo_n "(cached) " >&6 else case $RBIN in [\\/]* | ?:[\\/]*) ac_cv_path_RBIN="$RBIN" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_RBIN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi RBIN=$ac_cv_path_RBIN if test -n "$RBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RBIN" >&5 $as_echo "$RBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi #---------------------------------------------------------------- # Look for Go compilers #---------------------------------------------------------------- # Check whether --with-go was given. if test "${with_go+set}" = set; then : withval=$with_go; GOBIN="$withval" else GOBIN="$alllang_default" fi if test x"${GOBIN}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling Go" >&5 $as_echo "$as_me: Disabling Go" >&6;} GO= GOC= GO1=false GO12=false GO13=false GO15=false GOGCC=false GCCGO= GOOPT= GCCGOOPT= GOVERSIONOPTION= else if test "x$GOBIN" = xyes; then for ac_prog in go 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GO"; then ac_cv_prog_GO="$GO" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GO="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GO=$ac_cv_prog_GO if test -n "$GO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GO" >&5 $as_echo "$GO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GO" && break done else GO="$GOBIN" fi GOGCC=false GCCGO= GO1=false GO12=false GO13=false GO15=false GOOPT= GCCGOOPT= GOVERSIONOPTION= if test -n "$GO" ; then GO1=true GOVERSIONOPTION=version go_version=$($GO $GOVERSIONOPTION | sed -e 's/go version //') case "$go_version" in go1 | go1.[01234]*) GOC=$(sh -c "$(go env) && echo \$GOCHAR")c ;; *) GOC=compile ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether go version is too old" >&5 $as_echo_n "checking whether go version is too old... " >&6; } case $go_version in go1.1* | go1.0* | go1 ) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - minimum version is 1.2" >&5 $as_echo "yes - minimum version is 1.2" >&6; } GO= GOOPT="-intgosize 32" ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } case "$(go env GOARCH)" in amd64 | arm64 | ppc64*) GOOPT="-intgosize 64" ;; *) GOOPT="-intgosize 32" ;; esac ;; esac case $go_version in go1.0* | go1 | go1.1*) GOOPT="$GOOPT -use-shlib" ;; go1.2*) GO12=true ;; go1.3* | go1.4*) GO13=true ;; *) GO15=true ;; esac fi for ac_prog in gccgo 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GCCGO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GCCGO"; then ac_cv_prog_GCCGO="$GCCGO" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GCCGO="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GCCGO=$ac_cv_prog_GCCGO if test -n "$GCCGO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCCGO" >&5 $as_echo "$GCCGO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GCCGO" && break done if test -n "$GCCGO" ; then if $GCCGO --help 2>/dev/null | grep gccgo >/dev/null 2>&1 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gccgo version is too old" >&5 $as_echo_n "checking whether gccgo version is too old... " >&6; } go_version=`$GO $GOVERSIONOPTION | sed -n '1p' | sed -e 's/^.* \([0-9.]*\) *$/\1/' -e 's/[.]//g'` if test "x$go_version" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not determine gccgo version" >&5 $as_echo "could not determine gccgo version" >&6; } GCCGO= elif test "$go_version" -lt 470; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes - minimum version is 4.7.0" >&5 $as_echo "yes - minimum version is 4.7.0" >&6; } GCCGO= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if test "$go_version" -lt 480; then GCCGOOPT="-intgosize 32" else # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } if ${ac_cv_sizeof_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : else if test "$ac_cv_type_void_p" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 $as_echo "$ac_cv_sizeof_void_p" >&6; } cat >>confdefs.h <<_ACEOF #define SIZEOF_VOID_P $ac_cv_sizeof_void_p _ACEOF if test "$ac_cv_sizeof_void_p" = "8"; then GCCGOOPT="-intgosize 64" else GCCGOOPT="-intgosize 32" fi fi fi fi fi fi #---------------------------------------------------------------- # Look for D #---------------------------------------------------------------- # Check whether --with-d was given. if test "${with_d+set}" = set; then : withval=$with_d; with_d="$withval" else with_d="$alllang_default" fi # Check whether --with-d1-compiler was given. if test "${with_d1_compiler+set}" = set; then : withval=$with_d1_compiler; D1COMPILERBIN="$withval" else D1COMPILERBIN= fi # Check whether --with-d2-compiler was given. if test "${with_d2_compiler+set}" = set; then : withval=$with_d2_compiler; D2COMPILERBIN="$withval" else D2COMPILERBIN= fi # First, check for "--without-d" or "--with-d=no". if test x"${with_d}" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling D" >&5 $as_echo "$as_me: Disabling D" >&6;} D1COMPILER= D2COMPILER= else old_ac_ext=$ac_ext ac_ext=d if test -z "$D1COMPILERBIN" ; then for ac_prog in dmd ldmd gdmd 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_D1COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$D1COMPILER"; then ac_cv_prog_D1COMPILER="$D1COMPILER" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_D1COMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi D1COMPILER=$ac_cv_prog_D1COMPILER if test -n "$D1COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $D1COMPILER" >&5 $as_echo "$D1COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$D1COMPILER" && break done if test -n "$D1COMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the D1/Tango compiler works" >&5 $as_echo_n "checking whether the D1/Tango compiler works... " >&6; } cat > conftest.$ac_ext <<_ACEOF import tango.io.Stdout; void main() { } _ACEOF rm -f conftest.$ac_objext if { { ac_try="$D1COMPILER conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$D1COMPILER conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test ! -s conftest.err && test -s conftest.$ac_objext; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } D1COMPILER= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D1COMPILER="$D1COMPILERBIN" fi if test -z "$D2COMPILERBIN" ; then for ac_prog in dmd gdmd 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:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_D2COMPILER+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$D2COMPILER"; then ac_cv_prog_D2COMPILER="$D2COMPILER" # 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_D2COMPILER="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi D2COMPILER=$ac_cv_prog_D2COMPILER if test -n "$D2COMPILER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $D2COMPILER" >&5 $as_echo "$D2COMPILER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$D2COMPILER" && break done if test -n "$D2COMPILER" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the D2 compiler works" >&5 $as_echo_n "checking whether the D2 compiler works... " >&6; } cat > conftest.$ac_ext <<_ACEOF import std.algorithm; void main() { } _ACEOF rm -f conftest.$ac_objext if { { ac_try="$D2COMPILER conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$D2COMPILER conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test ! -s conftest.err && test -s conftest.$ac_objext; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } D2COMPILER= fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi else D2COMPILER="$D2COMPILERBIN" fi ac_ext=$old_ac_ext fi if test -n "$D1COMPILER"; then DDEFAULTVERSION=1 elif test -n "$D2COMPILER"; then DDEFAULTVERSION=2 fi # Do not prefix library file names with "lib" on Windows. case $host in *-*-cygwin* | *-*-mingw*) DLIBPREFIX="";; *)DLIBPREFIX="lib";; esac #---------------------------------------------------------------- # Determine which languages to use for examples/test-suite #---------------------------------------------------------------- SKIP_TCL= if test -z "$TCLINCLUDE" || test -z "$TCLLIB" ; then SKIP_TCL="1" fi SKIP_PERL5= if test -z "$PERL" || test -z "$PERL5EXT" || test -z "$PERL5TESTMORE"; then SKIP_PERL5="1" fi SKIP_OCTAVE= if test -z "$OCTAVE" ; then SKIP_OCTAVE="1" fi SKIP_PYTHON= if (test -z "$PYINCLUDE" || test -z "$PYLINK") && (test -z "$PY3INCLUDE" || test -z "$PY3LINK") ; then SKIP_PYTHON="1" fi SKIP_PYTHON3= if test -z "$PY3INCLUDE" || test -z "$PY3LINK" ; then SKIP_PYTHON3="1" fi SKIP_JAVA= if test -z "$JAVA" || test -z "$JAVAC" || test -z "$JAVAINC" ; then SKIP_JAVA="1" fi SKIP_JAVASCRIPT= if test -z "$JAVASCRIPT" || ( test -z "$NODEJS" && test -z "$JSCENABLED" && test -z "$JSV8ENABLED" ) ; then SKIP_JAVASCRIPT="1" fi SKIP_GUILE= if test -z "$GUILE" || test -z "$GUILE_LIBS" ; then SKIP_GUILE="1" fi SKIP_MZSCHEME= if test -z "$MZC" || test -z "$MZDYNOBJ" ; then SKIP_MZSCHEME="1" fi SKIP_RUBY= if test -z "$RUBY" || test -z "$RUBYINCLUDE" || test -z "$RUBYLIB" ; then SKIP_RUBY="1" fi SKIP_PHP= if test -z "$PHP" || test -z "$PHPINC" ; then SKIP_PHP="1" fi SKIP_PHP5= if test -z "$PHP5" || test -z "$PHP5INC" ; then SKIP_PHP5="1" fi SKIP_OCAML= if test -z "$OCAMLC" ; then SKIP_OCAML="1" fi SKIP_PIKE= if test -z "$PIKE" || test -z "$PIKEINCLUDE" ; then SKIP_PIKE="1" fi SKIP_CHICKEN= if test -z "$CHICKEN_CSC" || test -z "$CHICKEN"; then SKIP_CHICKEN="1" fi SKIP_CSHARP= if test -z "$CSHARPCOMPILER" ; then SKIP_CSHARP="1" else if test "cscc" = "$CSHARPCOMPILER" && test -z "$CSHARPCILINTERPRETER" ; then SKIP_CSHARP="1" fi fi SKIP_MODULA3="1" # Always skipped! SKIP_LUA= # we need LUABIN & dynamic loading if test -z "$LUABIN" || test -z "$LUADYNAMICLOADLIB"; then SKIP_LUA="1" fi SKIP_ALLEGROCL= if test -z "$ALLEGROCLBIN" ; then SKIP_ALLEGROCL="1" fi SKIP_CLISP= if test -z "$CLISPBIN" ; then SKIP_CLISP="1" fi SKIP_R= if test -z "$RBIN" ; then SKIP_R="1" fi SKIP_CFFI= #if test -z "$CFFIBIN" ; then SKIP_CFFI="1" #fi SKIP_UFFI= #if test -z "$UFFIBIN" ; then SKIP_UFFI="1" #fi SKIP_SCILAB= if test -z "$SCILAB"; then SKIP_SCILAB="1" fi SKIP_GO= if test -z "$GO" ; then SKIP_GO="1" fi SKIP_D= if test -z "$DDEFAULTVERSION" ; then SKIP_D="1" fi #---------------------------------------------------------------- # Additional language dependencies #---------------------------------------------------------------- SKIP_GCJ= if test -z "$GCJ" || test -z "$GCJH" ; then SKIP_GCJ="1" else if test "$GCC" != yes; then SKIP_GCJ="1" fi fi SKIP_ANDROID= if test -z "$ANDROID" || test -z "$ADB" || test -z "$ANT" || test -z "$NDKBUILD" ; then SKIP_ANDROID="1" fi #---------------------------------------------------------------- # Miscellaneous #---------------------------------------------------------------- ABS_SRCDIR=`(cd ${srcdir} && pwd)` case $host in *-*-mingw* ) ABS_SRCDIR=`${srcdir}/Tools/convertpath -m $ABS_SRCDIR` ;; *-*-cygwin* ) ABS_SRCDIR=`cygpath --mixed $ABS_SRCDIR` ;; esac # Root directory ROOT_DIR=`pwd` case $host in *-*-cygwin*) # Translate path for native Windows compilers for use with 'make check' if (cygpath --mixed $ROOT_DIR) >/dev/null 2>/dev/null; then ROOT_DIR=`cygpath --mixed $ROOT_DIR` fi ;; esac case $host in *-*-cygwin* | *-*-mingw*) # Extra files generated by some Windows compilers EXTRA_CLEAN="*.stackdump *.exp *.lib *.pdb *.ilk" ;; esac # Configure SWIG_LIB path # Check whether --with-swiglibdir was given. if test "${with_swiglibdir+set}" = set; then : withval=$with_swiglibdir; swig_lib="$withval" else swig_lib="${datadir}/swig/${PACKAGE_VERSION}" fi SWIG_LIB_INSTALL=${swig_lib} prefix_NONE= exec_prefix_NONE= test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix eval ac_define_dir="\"$swig_lib\"" eval ac_define_dir="\"$ac_define_dir\"" SWIG_LIB="$ac_define_dir" cat >>confdefs.h <<_ACEOF #define SWIG_LIB "$ac_define_dir" _ACEOF test "$prefix_NONE" && prefix=NONE test "$exec_prefix_NONE" && exec_prefix=NONE case $build in # Windows does not understand unix directories. Convert into a windows directory with drive letter. *-*-mingw*) SWIG_LIB_WIN_UNIX=`${srcdir}/Tools/convertpath -m $SWIG_LIB`;; *-*-cygwin*) SWIG_LIB_WIN_UNIX=`cygpath --mixed "$SWIG_LIB"`;; *) SWIG_LIB_WIN_UNIX="";; esac cat >>confdefs.h <<_ACEOF #define SWIG_LIB_WIN_UNIX "$SWIG_LIB_WIN_UNIX" _ACEOF SWIG_LIB_PREINST=$ABS_SRCDIR/Lib SWIG_LIB_SET="env SWIG_LIB=\$(SWIG_LIB_DIR)" if test "${srcdir}" = "."; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _WIN32 yes #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : SWIG_LIB_SET="env SWIG_LIB=" fi rm -f conftest* fi ac_config_files="$ac_config_files Makefile swig.spec Examples/Makefile Examples/d/example.mk Examples/xml/Makefile Examples/test-suite/errors/Makefile Examples/test-suite/chicken/Makefile Examples/test-suite/csharp/Makefile Examples/test-suite/d/Makefile Examples/test-suite/guile/Makefile Examples/test-suite/java/Makefile Examples/test-suite/javascript/Makefile Examples/test-suite/mzscheme/Makefile Examples/test-suite/ocaml/Makefile Examples/test-suite/octave/Makefile Examples/test-suite/perl5/Makefile Examples/test-suite/php/Makefile Examples/test-suite/php5/Makefile Examples/test-suite/pike/Makefile Examples/test-suite/python/Makefile Examples/test-suite/ruby/Makefile Examples/test-suite/scilab/Makefile Examples/test-suite/tcl/Makefile Examples/test-suite/lua/Makefile Examples/test-suite/allegrocl/Makefile Examples/test-suite/clisp/Makefile Examples/test-suite/cffi/Makefile Examples/test-suite/uffi/Makefile Examples/test-suite/r/Makefile Examples/test-suite/go/Makefile Source/Makefile Tools/javascript/Makefile" ac_config_files="$ac_config_files preinst-swig" ac_config_files="$ac_config_files CCache/ccache_swig_config.h" #-------------------------------------------------------------------- # Building Examples/ out of source directory #-------------------------------------------------------------------- # If building out of source tree, replicate Examples/ source tree in # build directory, and copy over Makefiles from source directory. # Prefix each Makefile with a header which sets SRCDIR to the relative # source directory, and provides a rule for updating the Makefile from # its original source. ac_config_commands="$ac_config_commands Examples" #-------------------------------------------------------------------- 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:${as_lineno-$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= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+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 if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$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= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$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. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${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:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -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_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 # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (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 # 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. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$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_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_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 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by swig $as_me 3.0.12, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ swig config.status 3.0.12 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; 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"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $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_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$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 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _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 "Source/Include/swigconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS Source/Include/swigconfig.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "swig.spec") CONFIG_FILES="$CONFIG_FILES swig.spec" ;; "Examples/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/Makefile" ;; "Examples/d/example.mk") CONFIG_FILES="$CONFIG_FILES Examples/d/example.mk" ;; "Examples/xml/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/xml/Makefile" ;; "Examples/test-suite/errors/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/errors/Makefile" ;; "Examples/test-suite/chicken/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/chicken/Makefile" ;; "Examples/test-suite/csharp/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/csharp/Makefile" ;; "Examples/test-suite/d/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/d/Makefile" ;; "Examples/test-suite/guile/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/guile/Makefile" ;; "Examples/test-suite/java/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/java/Makefile" ;; "Examples/test-suite/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/javascript/Makefile" ;; "Examples/test-suite/mzscheme/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/mzscheme/Makefile" ;; "Examples/test-suite/ocaml/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/ocaml/Makefile" ;; "Examples/test-suite/octave/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/octave/Makefile" ;; "Examples/test-suite/perl5/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/perl5/Makefile" ;; "Examples/test-suite/php/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/php/Makefile" ;; "Examples/test-suite/php5/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/php5/Makefile" ;; "Examples/test-suite/pike/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/pike/Makefile" ;; "Examples/test-suite/python/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/python/Makefile" ;; "Examples/test-suite/ruby/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/ruby/Makefile" ;; "Examples/test-suite/scilab/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/scilab/Makefile" ;; "Examples/test-suite/tcl/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/tcl/Makefile" ;; "Examples/test-suite/lua/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/lua/Makefile" ;; "Examples/test-suite/allegrocl/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/allegrocl/Makefile" ;; "Examples/test-suite/clisp/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/clisp/Makefile" ;; "Examples/test-suite/cffi/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/cffi/Makefile" ;; "Examples/test-suite/uffi/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/uffi/Makefile" ;; "Examples/test-suite/r/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/r/Makefile" ;; "Examples/test-suite/go/Makefile") CONFIG_FILES="$CONFIG_FILES Examples/test-suite/go/Makefile" ;; "Source/Makefile") CONFIG_FILES="$CONFIG_FILES Source/Makefile" ;; "Tools/javascript/Makefile") CONFIG_FILES="$CONFIG_FILES Tools/javascript/Makefile" ;; "preinst-swig") CONFIG_FILES="$CONFIG_FILES preinst-swig" ;; "CCache/ccache_swig_config.h") CONFIG_FILES="$CONFIG_FILES CCache/ccache_swig_config.h" ;; "Examples") CONFIG_COMMANDS="$CONFIG_COMMANDS Examples" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $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:${as_lineno-$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 >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $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"; as_fn_mkdir_p 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 # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$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 s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $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 "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "preinst-swig":F) chmod +x preinst-swig ;; "Examples":C) if test "x${srcdir}" != "x." ; then { $as_echo "$as_me:${as_lineno-$LINENO}: generating Examples build tree" >&5 $as_echo "$as_me: generating Examples build tree" >&6;} for mkfile in `cd ${srcdir} && find Examples/ -type f -name Makefile`; do dir=`dirname ${mkfile}` d=${dir} reldir="" while test "x$d" != "x." ; do d=`dirname $d` reldir="${reldir}../" done relsrcdir=${reldir}${srcdir}/ as_dir=${dir}; as_fn_mkdir_p cat <${mkfile} # DO NOT EDIT: instead edit ${relsrcdir}${mkfile} # and run (cd ${reldir} && ./config.status) to regenerate TOP_BUILDDIR_TO_TOP_SRCDIR = ${srcdir}/ SRCDIR = ${relsrcdir}${dir}/ EOF cat ${srcdir}/${mkfile} >>${mkfile} done fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -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=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$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" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi langs="" test -n "$SKIP_ALLEGROCL" || langs="${langs}allegrocl " test -n "$SKIP_CFFI" || langs="${langs}cffi " test -n "$SKIP_CHICKEN" || langs="${langs}chicken " test -n "$SKIP_CLISP" || langs="${langs}clisp " test -n "$SKIP_CSHARP" || langs="${langs}csharp " test -n "$SKIP_D" || langs="${langs}d " test -n "$SKIP_GO" || langs="${langs}go " test -n "$SKIP_GUILE" || langs="${langs}guile " test -n "$SKIP_JAVA" || langs="${langs}java " test -n "$SKIP_JAVASCRIPT" || langs="${langs}javascript " test -n "$SKIP_LUA" || langs="${langs}lua " test -n "$SKIP_MODULA3" || langs="${langs}modula3 " test -n "$SKIP_MZSCHEME" || langs="${langs}mzscheme " test -n "$SKIP_OCAML" || langs="${langs}ocaml " test -n "$SKIP_OCTAVE" || langs="${langs}octave " test -n "$SKIP_PERL5" || langs="${langs}perl5 " test -n "$SKIP_PHP" || langs="${langs}php " test -n "$SKIP_PHP5" || langs="${langs}php5 " test -n "$SKIP_PIKE" || langs="${langs}pike " test -n "$SKIP_PYTHON" || langs="${langs}python " test -n "$SKIP_R" || langs="${langs}r " test -n "$SKIP_RUBY" || langs="${langs}ruby " test -n "$SKIP_SCILAB" || langs="${langs}scilab " test -n "$SKIP_TCL" || langs="${langs}tcl " test -n "$SKIP_UFFI" || langs="${langs}uffi " echo " The SWIG test-suite and examples are configured for the following languages: $langs " swig-3.0.12/RELEASENOTES0000664000175000017500000004303513042756442014256 0ustar williamwilliamThis file contains a brief overview of the changes made in each release. A detailed description of changes are available in the CHANGES.current and CHANGES files. Release Notes ============= Detailed release notes are available with the release and are also published on the SWIG web site at http://swig.org/release.html. SWIG-3.0.12 summary: - Add support for Octave-4.2. - Enhance %extend to support template functions. - Language specific enhancements and fixes for C#, D, Guile, Java, PHP7. SWIG-3.0.11 summary: - PHP 7 support added. - C++11 alias templates and type aliasing support added. - Minor fixes and enhancements for C# Go Guile Java Javascript Octave PHP Python R Ruby Scilab XML. SWIG-3.0.10 summary: - Regression fixes for smart pointers and importing Python modules. SWIG-3.0.9 summary: - Add support for Python's implicit namespace packages. - Fixes to support Go 1.6. - C++11 std::array support added for Java. - Improved C++ multiple inheritance support for Java/C# wrappers. - Various other minor fixes and improvements for C#, D, Go, Java, Javascript, Lua, Python, R, Ruby, Scilab. SWIG-3.0.8 summary: - pdf documentation enhancements. - Various Python 3.5 issues fixed. - std::array support added for Ruby and Python. - shared_ptr support added for Ruby. - Minor improvements for CFFI, Go, Java, Perl, Python, Ruby. SWIG-3.0.7 summary: - Add support for Octave-4.0.0. - Remove potential Android security exploit in generated Java classes. - Minor new features and bug fixes. SWIG-3.0.6 summary: - Stability and regression fixes. - Fixed parsing of C++ corner cases. - Language improvements and bug fixes for C#, Go, Java, Lua, Python, R. SWIG-3.0.5 summary: - Added support for Scilab. - Important Python regression fix when wrapping C++ default arguments. - Minor improvements for C#, Go, Octave, PHP and Python. SWIG-3.0.4 summary: - Python regression fix when wrapping C++ default arguments. - Improved error messages. SWIG-3.0.3 summary: - Add support for C++11 strongly typed enumerations. - Numerous bug fixes and minor enhancements for C#, D, Go, Java, Javascript, PHP, Perl and Python wrappers. SWIG-3.0.2 summary: - Bug fix during install and a couple of other minor changes. SWIG-3.0.1 summary: - Javascript module added. This supports JavascriptCore (Safari/Webkit), v8 (Chromium) and node.js currently. - A few notable regressions introduced in 3.0.0 have been fixed - in Lua, nested classes and parsing of operator <<. - The usual round of bug fixes and minor improvements for: C#, GCJ, Go, Java, Lua, PHP and Python. SWIG-3.0.0 summary: - This is a major new release focusing primarily on C++ improvements. - C++11 support added. Please see documentation for details of supported features: http://www.swig.org/Doc3.0/CPlusPlus11.html - Nested class support added. This has been taken full advantage of in Java and C#. Other languages can use the nested classes, but require further work for a more natural integration into the target language. We urge folk knowledgeable in the other target languages to step forward and help with this effort. - Lua: improved metatables and support for %nspace. - Go 1.3 support added. - Python import improvements including relative imports. - Python 3.3 support completed. - Perl director support added. - C# .NET 2 support is now the minimum. Generated using statements are replaced by fully qualified names. - Bug fixes and improvements to the following languages: C#, Go, Guile, Java, Lua, Perl, PHP, Python, Octave, R, Ruby, Tcl - Various other bug fixes and improvements affecting all languages. - Note that this release contains some backwards incompatible changes in some languages. - Full detailed release notes are in the changes file. SWIG-2.0.12 summary: - This is a maintenance release backporting some fixes from the pending 3.0.0 release. - Octave 3.8 support added. - C++11 support for new versions of erase/insert in the STL containers. - Compilation fixes on some systems for the generated Lua, PHP, Python and R wrappers. SWIG-2.0.11 summary: - Minor bug fixes and enhancements mostly in Python, but also C#, Lua, Ocaml, Octave, Perl, PHP, Python, R, Ruby, Tcl. SWIG-2.0.10 summary: - Ruby 1.9 support is now complete. - Add support for Guile 2.0 and Guile 1.6 support (GH interface) has been dropped. - Various small language neutral improvements and fixes. - Various bug fixes and minor improvements specific to C#, CFFI, D, Java, Octave, PHP, Python, - Minor bug fix in ccache-swig. - Development has moved to Github with Travis continuous integration testing - patches using https://github.com/swig/swig are welcome. SWIG-2.0.9 summary: - Improved typemap matching. - Ruby 1.9 support is much improved. - Various bug fixes and minor improvements in C#, CFFI, Go, Java, Modula3, Octave, Perl, Python, R, Ruby, Tcl and in ccache-swig. SWIG-2.0.8 summary: - Fix a couple of regressions introduced in 2.0.5 and 2.0.7. - Improved using declarations and using directives support. - Minor fixes/enhancements for C#, Java, Octave, Perl and Python. SWIG-2.0.7 summary: - Important regression fixes since 2.0.5 for typemaps in general and in Python. - Fixes and enhancements for Go, Java, Octave and PHP. SWIG-2.0.6 summary: - Regression fix for Python STL wrappers on some systems. SWIG-2.0.5 summary: - Official Android support added including documentation and examples. - Improvements involving templates: 1) Various fixes with templates and typedef types. 2) Some template lookup problems fixed. 3) Templated type fixes to use correct typemaps. - Autodoc documentation generation improvements. - Python STL container wrappers improvements including addition of stepped slicing. - Approximately 70 fixes and minor enhancements for the following target languages: AllegroCL, C#, D, Go, Java, Lua, Ocaml, Octave, Perl, PHP, Python, R, Ruby, Tcl, Xml. SWIG-2.0.4 summary: - This is mainly a Python oriented release including support for Python built-in types for superior performance with the new -builtin option. The -builtin option is especially suitable for performance-critical libraries and applications that call wrapped methods repeatedly. See the python-specific chapter of the SWIG manual for more info. - Python 3.2 support has also been added and various Python bugs have been fixed. - Octave 3.4 support has also been added. - There are also the usual minor generic improvements, as well as bug fixes and enhancements for D, Guile, Lua, Octave, Perl and Tcl. SWIG-2.0.3 summary: - A bug fix release including a couple of fixes for regressions in the 2.0 series. SWIG-2.0.2 summary: - Support for the D language has been added. - Various bug fixes and minor enhancements. - Bug fixes particular to the Clisp, C#, Go, MzScheme, Ocaml, PHP, R, Ruby target languages. SWIG-2.0.1 summary: - Support for the Go language has been added. - New regular expression (regex) encoder for renaming symbols based on the Perl Compatible Regular Expressions (PCRE) library. - Numerous fixes in reporting file and line numbers in error and warning messages. - Various bug fixes and improvements in the C#, Lua, Perl, PHP, Ruby and Python language modules. SWIG-2.0.0 summary: - License changes, see LICENSE file and http://www.swig.org/legal.html. - Much better nested class/struct support. - Much improved template partial specialization and explicit specialization handling. - Namespace support improved with the 'nspace' feature where namespaces can be automatically translated into Java packages or C# namespaces. - Improved typemap and symbol table debugging. - Numerous subtle typemap matching rule changes when using the default (SWIGTYPE) type. These now work much like C++ class template partial specialization matching. - Other small enhancements for typemaps. Typemap fragments are also now official and documented. - Warning and error display refinements. - Wrapping of shared_ptr is improved and documented now. - Numerous C++ unary scope operator (::) fixes. - Better support for boolean expressions. - Various bug fixes and improvements in the Allegrocl, C#, Java, Lua, Octave, PHP, Python, R, Ruby and XML modules. SWIG-1.3.40 summary: - SWIG now supports directors for PHP. - PHP support improved in general. - Octave 3.2 support added. - Various bug fixes/enhancements for Allegrocl, C#, Java, Octave, Perl, Python, Ruby and Tcl. - Other generic fixes and minor new features. SWIG-1.3.39 summary: - Some new small feature enhancements. - Improved C# std::vector wrappers. - Bug fixes: mainly Python, but also Perl, MzScheme, CFFI, Allegrocl and Ruby SWIG-1.3.38 summary: - Output directory regression fix and other minor bug fixes SWIG-1.3.37 summary: - Python 3 support added - SWIG now ships with a version of ccache that can be used with SWIG. This enables the files generated by SWIG to be cached so that repeated use of SWIG on unchanged input files speeds up builds quite considerably. - PHP 4 support removed and PHP support improved in general - Improved C# array support - Numerous Allegro CL improvements - Bug fixes/enhancements for Python, PHP, Java, C#, Chicken, Allegro CL, CFFI, Ruby, Tcl, Perl, R, Lua. - Other minor generic bug fixes and enhancements SWIG-1.3.36 summary: - Enhancement to directors to wrap all protected members - Optimisation feature for objects returned by value - A few bugs fixes in the PHP, Java, Ruby, R, C#, Python, Lua and Perl modules - Other minor generic bug fixes SWIG-1.3.35 summary: - Octave language module added - Bug fixes in Python, Lua, Java, C#, Perl modules - A few other generic bugs and runtime assertions fixed SWIG-1.3.34 summary: - shared_ptr support for Python - Support for latest R - version 2.6 - Various minor improvements/bug fixes for R, Lua, Python, Java, C# - A few other generic bug fixes, mainly for templates and using statements SWIG-1.3.33 summary: - Fix regression for Perl where C++ wrappers would not compile - Fix regression parsing macros SWIG-1.3.32 summary: - shared_ptr support for Java and C# - Enhanced STL support for Ruby - Windows support for R - Fixed long-standing memory leak in PHP Module - Numerous fixes and minor enhancements for Allegrocl, C#, cffi, Chicken, Guile, Java, Lua, Ocaml, Perl, PHP, Python, Ruby, Tcl. - Improved warning support SWIG-1.3.31 summary: - Python modern classes regression fix SWIG-1.3.30 summary: - Python-2.5 support - New language module: R - Director support added for C# - Numerous director fixes and improvements - Improved mingw/msys support - Better constants support in Guile and chicken modules - Support for generating PHP5 class wrappers - Important Java premature garbage collection fix - Minor improvements/fixes in cffi, php, allegrocl, perl, chicken, lua, ruby, ocaml, python, java, c# and guile language modules - Many many other bug fixes SWIG-1.3.29 summary: - Numerous important bug fixes - Few minor new features - Some performance improvements in generated code for Python SWIG-1.3.28 summary: - More powerful renaming (%rename) capability. - More user friendly warning handling. - Add finer control for default constructors and destructors. We discourage the use of the 'nodefault' option, which disables both constructors and destructors, leading to possible memory leaks. Use instead 'nodefaultctor' and/or 'nodefaultdtor'. - Automatic copy constructor wrapper generation via the 'copyctor' option/feature. - Better handling of Windows extensions and types. - Better runtime error reporting. - Add the %catches directive to catch and dispatch exceptions. - Add the %naturalvar directive for more 'natural' variable wrapping. - Better default handling of std::string variables using the %naturalvar directive. - Add the %allowexcept and %exceptionvar directives to handle exceptions when accessing a variable. - Add the %delobject directive to mark methods that act like destructors. - Add the -fastdispatch option to enable smaller and faster overload dispatch mechanism. - Template support for %rename, %feature and %typemap improved. - Add/doc more debug options, such as -dump_module, -debug_typemaps, etc. - Unified typemap library (UTL) potentially providing core typemaps for all scripting languages based on the recently evolving Python typemaps. - New language module: Common Lisp with CFFI. - Python, Ruby, Perl and Tcl use the new UTL, many old reported and hidden errors with typemaps are now fixed. - Initial Java support for languages using the UTL via GCJ, you can now use Java libraries in your favorite script language using gcj + swig. - Tcl support for std::wstring. - PHP4 module update, many error fixes and actively maintained again. - Allegrocl support for C++, also enhanced C support. - Ruby support for bang methods. - Ruby support for user classes as native exceptions. - Perl improved dispatching in overloaded functions via the new cast and rank mechanism. - Perl improved backward compatibility, 5.004 and later tested and working. - Python improved backward compatibility, 1.5.2 and later tested and working. - Python can use the same cast/rank mechanism via the -castmode option. - Python implicit conversion mechanism similar to C++, via the %implicitconv directive (replaces and improves the implicit.i library). - Python threading support added. - Python STL support improved, iterators are supported and STL containers can use now the native PyObject type. - Python many performance options and improvements, try the -O option to test all of them. Python runtime benchmarks show up to 20 times better performance compared to 1.3.27 and older versions. - Python support for 'multi-inheritance' on the python side. - Python simplified proxy classes, now swig doesn't need to generate the additional 'ClassPtr' classes. - Python extended support for smart pointers. - Python better support for static member variables. - Python backward compatibility improved, many projects that used to work only with swig-1.3.21 to swig-1.3.24 are working again with swig-1.3.28 - Python test-suite is now 'valgrinded' before release, and swig also reports memory leaks due to missing destructors. - Minor bug fixes and improvements to the Lua, Ruby, Java, C#, Python, Guile, Chicken, Tcl and Perl modules. SWIG-1.3.27 summary: - Fix bug in anonymous typedef structures which was leading to strange behaviour SWIG-1.3.26 summary: - New language modules: Lua, CLISP and Common Lisp with UFFI. - Big overhaul to the PHP module. - Change to the way 'extern' is handled. - Minor bug fixes specific to C#, Java, Modula3, Ocaml, Allegro CL, XML, Lisp s-expressions, Tcl, Ruby and Python modules. - Other minor improvements and bug fixes. SWIG-1.3.25 summary: - Improved runtime type system. Speed of module loading improved in modules with lots of types. SWIG_RUNTIME_VERSION has been increased from 1 to 2, but the API is exactly the same; only internal changes were made. - The languages that use the runtime type system now support external access to the runtime type system. - Various improvements with typemaps and template handling. - Fewer warnings in generated code. - Improved colour documentation. - Many C# module improvements (exception handling, prevention of early garbage collection, C# attributes support added, more flexible type marshalling/asymmetric types.) - Minor improvements and bug fixes specific to the C#, Java, TCL, Guile, Chicken, MzScheme, Perl, Php, Python, Ruby and Ocaml modules). - Various other bug fixes and memory leak fixes. SWIG-1.3.24 summary: - Improved enum handling - More runtime library options - More bugs fixes for templates and template default arguments, directors and other areas. - Better smart pointer support, including data members, static members and %extend. SWIG-1.3.23 summary: - Improved support for callbacks - Python docstring support and better error handling - C++ default argument support for Java and C# added. - Improved c++ default argument support for the scripting languages plus option to use original (compact) default arguments. - %feature and %ignore/%rename bug fixes and mods - they might need default arguments specified to maintain compatible behaviour when using the new default arguments wrapping. - Runtime library changes: Runtime code can now exist in more than one module and so need not be compiled into just one module - Further improved support for templates and namespaces - Overloaded templated function support added - More powerful default typemaps (mixed default typemaps) - Some important %extend and director code bug fixes - Guile now defaults to using SCM API. The old interface can be obtained by the -gh option. - Various minor improvements and bug fixes for C#, Chicken, Guile, Java, MzScheme, Perl, Python and Ruby - Improved dependencies generation for constructing Makefiles. SWIG-1.3.22 summary: - Improved exception handling and translation of C errors or C++ exceptions into target language exceptions. - Improved enum support, mapping to built-in Java 1.5 enums and C# enums or the typesafe enum pattern for these two languages. - Python - much better STL support and support for std::wstring, wchar_t and FILE *. - Initial support for Modula3 and Allegro CL. - 64 bit TCL support. - Java and C#'s proxy classes are now nearly 100% generated from typemaps and/or features for finer control on the generated code. - SWIG runtime library support deprecation. - Improved documentation. SWIG now additionally provides documentation in the form of a single HTML page as well as a pdf document. - Enhanced C++ friend declaration support. - Better support for reference counted classes. - Various %fragment improvements. - RPM fixes. - Various minor improvements and bug fixes for C#, Chicken, Guile, Java, MzScheme, Perl, Php, Python, Ruby and XML. swig-3.0.12/Lib/0000775000175000017500000000000013042756671013147 5ustar williamwilliamswig-3.0.12/Lib/windows.i0000664000175000017500000001005713042756442015012 0ustar williamwilliam/* ----------------------------------------------------------------------------- * windows.i * * SWIG library file to support types found in windows.h as well as Microsoft * integral type extensions. The types are set for 32 bit Windows. * ----------------------------------------------------------------------------- */ // Support for non ISO (Windows) integral types %apply unsigned char { unsigned __int8 }; %apply const unsigned char& { const unsigned __int8& }; %apply signed char { __int8 }; %apply const signed char& { const __int8& }; %apply unsigned short { unsigned __int16 }; %apply const unsigned short& { const unsigned __int16& }; %apply short { __int16 }; %apply const short& { const __int16& }; %apply unsigned int { unsigned __int32 }; %apply const unsigned int& { const unsigned __int32& }; %apply int { __int32 }; %apply const int& { const __int32& }; %apply unsigned long long { unsigned __int64 }; %apply const unsigned long long& { const unsigned __int64& }; %apply long long { __int64 }; %apply const long long& { const __int64& }; // Workaround Microsoft calling conventions #define __cdecl #define __fastcall #define __far #define __forceinline #define __fortran #define __inline #define __pascal #define __stdcall #define __syscall #define _cdecl #define _fastcall #define _inline #define _pascal #define _stdcall #define WINAPI #define __declspec(WINDOWS_EXTENDED_ATTRIBUTE) #define __w64 // Types from windef.h typedef unsigned long ULONG; typedef ULONG *PULONG; typedef unsigned short USHORT; typedef USHORT *PUSHORT; typedef unsigned char UCHAR; typedef UCHAR *PUCHAR; typedef char *PSZ; typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef FLOAT *PFLOAT; typedef BOOL *PBOOL; typedef BOOL *LPBOOL; typedef BYTE *PBYTE; typedef BYTE *LPBYTE; typedef int *PINT; typedef int *LPINT; typedef WORD *PWORD; typedef WORD *LPWORD; typedef long *LPLONG; typedef DWORD *PDWORD; typedef DWORD *LPDWORD; typedef void *LPVOID; typedef const void *LPCVOID; typedef int INT; typedef unsigned int UINT; typedef unsigned int *PUINT; // Types from basetsd.h typedef signed char INT8, *PINT8; typedef signed short INT16, *PINT16; typedef signed int INT32, *PINT32; typedef signed __int64 INT64, *PINT64; typedef unsigned char UINT8, *PUINT8; typedef unsigned short UINT16, *PUINT16; typedef unsigned int UINT32, *PUINT32; typedef unsigned __int64 UINT64, *PUINT64; typedef signed int LONG32, *PLONG32; typedef unsigned int ULONG32, *PULONG32; typedef unsigned int DWORD32, *PDWORD32; typedef __w64 int INT_PTR, *PINT_PTR; typedef __w64 unsigned int UINT_PTR, *PUINT_PTR; typedef __w64 long LONG_PTR, *PLONG_PTR; typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; typedef unsigned short UHALF_PTR, *PUHALF_PTR; typedef short HALF_PTR, *PHALF_PTR; typedef __w64 long SHANDLE_PTR; typedef __w64 unsigned long HANDLE_PTR; typedef ULONG_PTR SIZE_T, *PSIZE_T; typedef LONG_PTR SSIZE_T, *PSSIZE_T; typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; typedef __int64 LONG64, *PLONG64; typedef unsigned __int64 ULONG64, *PULONG64; typedef unsigned __int64 DWORD64, *PDWORD64; // Types from winnt.h typedef void *PVOID; typedef void *PVOID64; typedef char CHAR; typedef short SHORT; typedef long LONG; typedef CHAR *PCHAR; typedef CHAR *LPCH, *PCH; typedef const CHAR *LPCCH, *PCCH; typedef CHAR *NPSTR; typedef CHAR *LPSTR, *PSTR; typedef const CHAR *LPCSTR, *PCSTR; typedef char TCHAR, *PTCHAR; typedef unsigned char TBYTE , *PTBYTE ; typedef LPSTR LPTCH, PTCH; typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR; typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR; typedef SHORT *PSHORT; typedef LONG *PLONG; typedef void *HANDLE; typedef HANDLE *PHANDLE; typedef BYTE FCHAR; typedef WORD FSHORT; typedef DWORD FLONG; typedef LONG HRESULT; typedef char CCHAR; typedef DWORD LCID; typedef PDWORD PLCID; typedef WORD LANGID; typedef __int64 LONGLONG; typedef unsigned __int64 ULONGLONG; typedef LONGLONG *PLONGLONG; typedef ULONGLONG *PULONGLONG; typedef ULONGLONG DWORDLONG; typedef DWORDLONG *PDWORDLONG; typedef BYTE BOOLEAN; typedef BOOLEAN *PBOOLEAN; swig-3.0.12/Lib/pike/0000775000175000017500000000000013042756442014073 5ustar williamwilliamswig-3.0.12/Lib/pike/pikekw.swg0000664000175000017500000000152113042756442016106 0ustar williamwilliam#ifndef PIKE_PIKEKW_SWG_ #define PIKE_PIKEKW_SWG_ /* Warnings for Pike keywords */ #define PIKEKW(x) %namewarn("314: '" #x "' is a pike keyword") #x /* from http://www.http://docs.linux.cz/pike/tutorial_C.html */ PIKEKW(array); PIKEKW(break); PIKEKW(case); PIKEKW(catch); PIKEKW(continue); PIKEKW(default); PIKEKW(do); PIKEKW(else); PIKEKW(float); PIKEKW(for); PIKEKW(foreach); PIKEKW(function); PIKEKW(gauge); PIKEKW(if); PIKEKW(inherit); PIKEKW(inline); PIKEKW(int); PIKEKW(lambda); PIKEKW(mapping); PIKEKW(mixed); PIKEKW(multiset); PIKEKW(nomask); PIKEKW(object); PIKEKW(predef); PIKEKW(private); PIKEKW(program); PIKEKW(protected); PIKEKW(public); PIKEKW(return); PIKEKW(sscanf); PIKEKW(static); PIKEKW(string); PIKEKW(switch); PIKEKW(typeof); PIKEKW(varargs); PIKEKW(void); PIKEKW(while); #undef PIKEKW #endif //PIKE_PIKEKW_SWG_ swig-3.0.12/Lib/pike/pike.swg0000664000175000017500000002254713042756442015557 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pike.swg * * Pike configuration module. * ----------------------------------------------------------------------------- */ %insert(runtime) "swigrun.swg"; // Common C API type-checking code %insert(runtime) "pikerun.swg"; // Pike run-time code %insert(runtime) %{ #ifdef __cplusplus extern "C" { #endif #include #include #include #ifdef __cplusplus } #endif %} /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* --- Input arguments --- */ /* Primitive datatypes. */ %typemap(in, pikedesc="tInt") int, unsigned int, short, unsigned short, long, unsigned long, char, signed char, unsigned char, bool, enum SWIGTYPE, long long, unsigned long long { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); $1 = ($1_ltype) $input.u.integer; } %typemap(in, pikedesc="tFloat") float, double { if ($input.type != T_FLOAT) Pike_error("Bad argument: Expected a float.\n"); $1 = ($1_ltype) $input.u.float_number; } %typemap(in, pikedesc="tStr") char *, char [ANY] { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1 = ($1_ltype) STR0($input.u.string); } /* Pointers, references and arrays */ %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "SWIG_ConvertPtr($input.u.object, (void **) &$1, $1_descriptor, 1);" /* Void pointer. Accepts any kind of pointer */ %typemap(in) void * "/* FIXME */"; /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype argp) "/* FIXME */"; /* Pointer to a class member */ %typemap(in) SWIGTYPE (CLASS::*) "/* FIXME */"; /* Const primitive references. Passed by value */ %typemap(in, pikedesc="tInt") const int & (int temp), const short & (short temp), const long & (long temp), const unsigned int & (unsigned int temp), const unsigned short & (unsigned short temp), const unsigned long & (unsigned long temp), const char & (char temp), const signed char & (signed char temp), const unsigned char & (unsigned char temp), const bool & (bool temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const enum SWIGTYPE & ($*1_ltype temp), const enum SWIGTYPE && ($*1_ltype temp) { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); temp = ($*1_ltype) $input.u.integer; $1 = &temp; } %typemap(in, pikedesc="tFloat") const float & (float temp), const double & (double temp) { if ($input.type != T_FLOAT) Pike_error("Bad argument: Expected a float.\n"); temp = ($*1_ltype) $input.u.float_number; $1 = &temp; } /* ----------------------------------------------------------------------------- * Output Typemaps * ----------------------------------------------------------------------------- */ %typemap(out, pikedesc="tInt") int, unsigned int, short, unsigned short, long, unsigned long, char, signed char, unsigned char, bool, enum SWIGTYPE "push_int($1);"; %typemap(out, pikedesc="tInt") long long "push_int64($1);"; %typemap(out, pikedesc="tInt") unsigned long long "push_int64($1);"; %typemap(out, pikedesc="tFloat") float, double "push_float($1);"; %typemap(out, pikedesc="tStr") char * "push_text($1);"; /* Pointers, references, and arrays */ %typemap(out, pikedesc="tObj") SWIGTYPE*, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "push_object(SWIG_NewPointerObj((void *) $1, $1_descriptor, $owner));"; /* Void return value; don't push anything */ %typemap(out, pikedesc="tVoid") void ""; /* Dynamic casts */ %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC "/* FIXME */"; /* Member pointer */ %typemap(out) SWIGTYPE (CLASS::*) "/* FIXME */"; /* Special typemap for character array return values */ %typemap(out, pikedesc="tStr") char [ANY], const char [ANY] "push_text($1);"; /* Primitive types--return by value */ %typemap(out, pikedesc="tObj") SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype &) $1); push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); push_object(SWIG_NewPointerObj((void *) resultptr, $&1_descriptor, 1)); } #endif /* References to primitive types. Return by value */ %typemap(out, pikedesc="tInt") const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const char &, const signed char &, const unsigned char &, const bool &, const long long &, const unsigned long long &, const enum SWIGTYPE & ($*1_ltype temp), const enum SWIGTYPE && ($*1_ltype temp) "push_int(*($1));"; %typemap(out, pikedesc="tFloat") const float &, const double & "push_float(*($1));"; /************************ Constant Typemaps *****************************/ %typemap(constant) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, enum SWIGTYPE, long long, unsigned long long "add_integer_constant(\"$symname\", $1, 0);"; %typemap(constant) char "add_integer_constant(\"$symname\", '$1', 0);"; %typemap(constant) long long, unsigned long long "add_integer_constant(\"$symname\", $1, 0);"; %typemap(constant) float, double "add_float_constant(\"$symname\", $1, 0);"; %typemap(constant) char * "add_string_constant(\"$symname\", \"$1\", 0);"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1 = ($1_ltype) STR0($input.u.string); $2 = ($2_ltype) $input.u.string->length; } /* ------------------------------------------------------------ * ANSI C typemaps * ------------------------------------------------------------ */ %typemap(in, pikedesc="tInt") size_t { if ($input.type != T_INT) Pike_error("Bad argument: Expected an integer.\n"); $1 = ($1_ltype) $input.u.integer; } %typemap(out) size_t = long; /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE, enum SWIGTYPE &, SWIGTYPE &&, bool, const bool & { $1 = ($input.type == T_INT) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = (($input.type == T_FLOAT) || ($input.type == T_INT)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = ($input.type == T_INT) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = ($input.type == T_STRING) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $1_descriptor, 0) == -1) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, $&1_descriptor, 0) == -1) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_ConvertPtr($input.u.object, (void **) &ptr, 0, 0) == -1) { $1 = 0; } else { $1 = 1; } } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename("`+") *::operator+; %rename("`-") *::operator-; %rename("`*") *::operator*; %rename("`/") *::operator/; %rename("`%") *::operator%; %rename("`<<") *::operator<<; %rename("`>>") *::operator>>; %rename("`&") *::operator&; %rename("`|") *::operator|; %rename("`^") *::operator^; %rename("`~") *::operator~; %rename("`<") *::operator<; %rename("`>") *::operator>; %rename("`==") *::operator==; /* Special cases */ %rename("`()") *::operator(); #endif /* ------------------------------------------------------------ * The start of the Pike initialization function * ------------------------------------------------------------ */ %init "swiginit.swg" %init %{ #ifdef __cplusplus extern "C" #endif PIKE_MODULE_EXIT {} #ifdef __cplusplus extern "C" #endif PIKE_MODULE_INIT { struct program *pr; SWIG_InitializeModule(0); %} /* pike keywords */ %include swig-3.0.12/Lib/pike/pikerun.swg0000664000175000017500000000403713042756442016276 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pikerun.swg * * This file contains the runtime support for Pike modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "pike/object.h" #include "pike/program.h" #ifdef __cplusplus } #endif #include /* Stores information about a wrapped object */ typedef struct swig_object_wrapper { void *self; swig_type_info *type; } swig_object_wrapper; #ifdef THIS #undef THIS #endif #define THIS (((swig_object_wrapper *) Pike_fp->current_storage)->self) #define SWIG_ConvertPtr SWIG_Pike_ConvertPtr #define SWIG_NewPointerObj SWIG_Pike_NewPointerObj #define SWIG_GetModule(clientdata) SWIG_Pike_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Pike_SetModule(pointer) /* These need to be filled in before type sharing between modules will work */ static swig_module_info *SWIG_Pike_GetModule(void *SWIGUNUSEDPARM(clientdata)) { return 0; } static void SWIG_Pike_SetModule(swig_module_info *pointer) { } /* Convert a pointer value */ static int SWIG_Pike_ConvertPtr(struct object *obj, void **ptr, swig_type_info *ty, int flags) { struct program *pr; swig_cast_info *tc; swig_object_wrapper *obj_wrapper; if (ty) { pr = (struct program *) ty->clientdata; obj_wrapper = (swig_object_wrapper *) get_storage(obj, pr); if (obj_wrapper && obj_wrapper->type) { tc = SWIG_TypeCheckStruct(obj_wrapper->type, ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc, obj_wrapper->self, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } } } return -1; } /* Create a new pointer object */ static struct object * SWIG_Pike_NewPointerObj(void *ptr, swig_type_info *type, int own) { return 0; } swig-3.0.12/Lib/pike/std_string.i0000664000175000017500000000310713042756442016426 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; /* Overloading check */ %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in, pikedesc="tStr") string { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); $1.assign(STR0($input.u.string)); } %typemap(in, pikedesc="tStr") const string & ($*1_ltype temp) { if ($input.type != T_STRING) Pike_error("Bad argument: Expected a string.\n"); temp.assign(STR0($input.u.string)); $1 = &temp; } %typemap(out, pikedesc="tStr") string "push_text($1.c_str());"; %typemap(out, pikedesc="tStr") const string & "push_text($1->c_str());"; %typemap(directorin) string, const string &, string & "$1.c_str()"; %typemap(directorin) string *, const string * "$1->c_str()"; %typemap(directorout) string { if ($input.type == T_STRING) $result.assign(STR0($input.u.string)); else throw Swig::DirectorTypeMismatchException("string expected"); } %typemap(directorout) const string & ($*1_ltype temp) { if ($input.type == T_STRING) { temp.assign(STR0($input.u.string)); $result = &temp; } else { throw Swig::DirectorTypeMismatchException("string expected"); } } } swig-3.0.12/Lib/swiglabels.swg0000664000175000017500000000733013042756442016024 0ustar williamwilliam/* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if defined(__GNUC__) # if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif swig-3.0.12/Lib/php/0000775000175000017500000000000013042756442013732 5ustar williamwilliamswig-3.0.12/Lib/php/std_deque.i0000664000175000017500000000003413042756442016056 0ustar williamwilliam%include swig-3.0.12/Lib/php/phpkw.swg0000664000175000017500000005507313042756442015617 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phpkw.swg * ----------------------------------------------------------------------------- */ /* Keyword (case insensitive) */ #define PHPKW(x) %keywordwarn("'" `x` "' is a PHP keyword, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",rename="c_%s") `x` /* Class (case insensitive) */ #define PHPCN(x) %keywordwarn("'" `x` "' is a PHP reserved class name, renaming to 'c_" `x` "'",%$isclass,sourcefmt="%(lower)s",rename="c_%s") `x` /* Constant (case insensitive) */ #define PHPBN1a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem,sourcefmt="%(lower)s") `x` #define PHPBN1b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant,sourcefmt="%(lower)s") `x` %define PHPBN1(X) PHPBN1a(X); PHPBN1b(X) %enddef /* Constant (case sensitive) */ #define PHPBN2a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem) `x` #define PHPBN2b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant) `x` %define PHPBN2(X) PHPBN2a(X); PHPBN2b(X) %enddef #define PHPFN(x) %keywordwarn("'" `x` "' is a PHP built-in function, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",%$isfunction,%$not %$ismember,rename="c_%s") `x` /* From: http://php.net/manual/en/reserved.keywords.php * "You cannot use any of the following words as constants, class names, * function or method names. Using them as variable names is generally OK, but * could lead to confusion." */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPKW(__halt_compiler); PHPKW(abstract); PHPKW(and); PHPKW(array); PHPKW(as); PHPKW(break); PHPKW(callable); // As of PHP 5.4 PHPKW(case); PHPKW(catch); PHPKW(class); PHPKW(clone); PHPKW(const); PHPKW(continue); PHPKW(declare); PHPKW(default); PHPKW(die); // "Language construct" PHPKW(do); PHPKW(echo); // "Language construct" PHPKW(else); PHPKW(elseif); PHPKW(empty); // "Language construct" PHPKW(enddeclare); PHPKW(endfor); PHPKW(endforeach); PHPKW(endif); PHPKW(endswitch); PHPKW(endwhile); PHPKW(eval); // "Language construct" PHPKW(exit); // "Language construct" PHPKW(extends); PHPKW(final); PHPKW(finally); // As of PHP 5.5 PHPKW(for); PHPKW(foreach); PHPKW(function); PHPKW(global); PHPKW(goto); // As of PHP 5.3 PHPKW(if); PHPKW(implements); PHPKW(include); // "Language construct" PHPKW(include_once); // "Language construct" PHPKW(instanceof); PHPKW(insteadof); // As of PHP 5.4 PHPKW(interface); PHPKW(isset); // "Language construct" PHPKW(list); // "Language construct" PHPKW(namespace); // As of PHP 5.3 PHPKW(new); PHPKW(or); PHPKW(print); // "Language construct" PHPKW(private); PHPKW(protected); PHPKW(public); PHPKW(require); // "Language construct" PHPKW(require_once); // "Language construct" PHPKW(return); // "Language construct" PHPKW(static); PHPKW(switch); PHPKW(throw); PHPKW(trait); // As of PHP 5.4 PHPKW(try); PHPKW(unset); // "Language construct" PHPKW(use); PHPKW(var); PHPKW(while); PHPKW(xor); PHPKW(yield); // As of PHP 5.5 // Compile-time "magic" constants // From: http://php.net/manual/en/reserved.keywords.php // also at: http://php.net/manual/en/language.constants.predefined.php /* These *MUST* be listed in lower case here */ PHPKW(__class__); PHPKW(__dir__); // As of PHP 5.3 PHPKW(__file__); PHPKW(__function__); PHPKW(__line__); PHPKW(__method__); PHPKW(__namespace__); // As of PHP 5.3 PHPKW(__trait__); // As of PHP 5.4 /* We classify these as built-in names since they conflict, but PHP still runs */ /* Predefined case-insensitive constants */ /* These *MUST* be listed in lower case here */ PHPBN1(null); PHPBN1(true); PHPBN1(false); /* "Core Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ /* These are case sensitive */ PHPBN2(PHP_VERSION); PHPBN2(PHP_MAJOR_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_MINOR_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_RELEASE_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_VERSION_ID); // As of PHP 5.2.7 PHPBN2(PHP_EXTRA_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_ZTS); // As of PHP 5.2.7 PHPBN2(PHP_DEBUG); // As of PHP 5.2.7 PHPBN2(PHP_MAXPATHLEN); // As of PHP 5.3.0 PHPBN2(PHP_OS); PHPBN2(PHP_SAPI); PHPBN2(PHP_EOL); // As of PHP 5.0.2 PHPBN2(PHP_INT_MAX); // As of PHP 5.0.5 PHPBN2(PHP_INT_SIZE); // As of PHP 5.0.5 PHPBN2(DEFAULT_INCLUDE_PATH); PHPBN2(PEAR_INSTALL_DIR); PHPBN2(PEAR_EXTENSION_DIR); PHPBN2(PHP_EXTENSION_DIR); PHPBN2(PHP_PREFIX); PHPBN2(PHP_BINDIR); PHPBN2(PHP_BINARY); // As of PHP 5.4 PHPBN2(PHP_MANDIR); // As of PHP 5.3.7 PHPBN2(PHP_LIBDIR); PHPBN2(PHP_DATADIR); PHPBN2(PHP_SYSCONFDIR); PHPBN2(PHP_LOCALSTATEDIR); PHPBN2(PHP_CONFIG_FILE_PATH); PHPBN2(PHP_CONFIG_FILE_SCAN_DIR); PHPBN2(PHP_SHLIB_SUFFIX); PHPBN2(E_ERROR); PHPBN2(E_WARNING); PHPBN2(E_PARSE); PHPBN2(E_NOTICE); PHPBN2(E_CORE_ERROR); PHPBN2(E_CORE_WARNING); PHPBN2(E_COMPILE_ERROR); PHPBN2(E_COMPILE_WARNING); PHPBN2(E_USER_ERROR); PHPBN2(E_USER_WARNING); PHPBN2(E_USER_NOTICE); PHPBN2(E_DEPRECATED); // As of PHP 5.3.0 PHPBN2(E_USER_DEPRECATED); // As of PHP 5.3.0 PHPBN2(E_ALL); PHPBN2(E_STRICT); PHPBN2(__COMPILER_HALT_OFFSET__); // As of PHP 5.1.0 // TRUE, FALSE, NULL are listed on the same page, but are actually // case-insensitive, whereas all the other constants listed there seem to be // case-sensitive, so we handle TRUE, FALSE, NULL in PHPBN1. PHPBN2(PHP_OUTPUT_HANDLER_START); PHPBN2(PHP_OUTPUT_HANDLER_CONT); PHPBN2(PHP_OUTPUT_HANDLER_END); /* These don't actually seem to be set (tested on Linux, I guess they're * Windows only?) */ PHPBN2(PHP_WINDOWS_NT_DOMAIN_CONTROLLER); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_NT_SERVER); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_NT_WORKSTATION); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_BUILD); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_MAJOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_MINOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_PLATFORM); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_PRODUCTTYPE); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_SP_MAJOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_SP_MINOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_SUITEMASK); // As of PHP 5.3 /* "Standard Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ PHPBN2(EXTR_OVERWRITE); PHPBN2(EXTR_SKIP); PHPBN2(EXTR_PREFIX_SAME); PHPBN2(EXTR_PREFIX_ALL); PHPBN2(EXTR_PREFIX_INVALID); PHPBN2(EXTR_PREFIX_IF_EXISTS); PHPBN2(EXTR_IF_EXISTS); PHPBN2(SORT_ASC); PHPBN2(SORT_DESC); PHPBN2(SORT_REGULAR); PHPBN2(SORT_NUMERIC); PHPBN2(SORT_STRING); PHPBN2(CASE_LOWER); PHPBN2(CASE_UPPER); PHPBN2(COUNT_NORMAL); PHPBN2(COUNT_RECURSIVE); PHPBN2(ASSERT_ACTIVE); PHPBN2(ASSERT_CALLBACK); PHPBN2(ASSERT_BAIL); PHPBN2(ASSERT_WARNING); PHPBN2(ASSERT_QUIET_EVAL); PHPBN2(CONNECTION_ABORTED); PHPBN2(CONNECTION_NORMAL); PHPBN2(CONNECTION_TIMEOUT); PHPBN2(INI_USER); PHPBN2(INI_PERDIR); PHPBN2(INI_SYSTEM); PHPBN2(INI_ALL); PHPBN2(INI_SCANNER_NORMAL); // As of PHP 5.3 PHPBN2(INI_SCANNER_RAW); // As of PHP 5.3 PHPBN2(M_E); PHPBN2(M_LOG2E); PHPBN2(M_LOG10E); PHPBN2(M_LN2); PHPBN2(M_LN10); PHPBN2(M_PI); PHPBN2(M_PI_2); PHPBN2(M_PI_4); PHPBN2(M_1_PI); PHPBN2(M_2_PI); PHPBN2(M_2_SQRTPI); PHPBN2(M_SQRT2); PHPBN2(M_SQRT1_2); PHPBN2(M_EULER); // As of PHP 5.2 PHPBN2(M_LNPI); // As of PHP 5.2 PHPBN2(M_SQRT3); // As of PHP 5.2 PHPBN2(M_SQRTPI); // As of PHP 5.2 PHPBN2(CRYPT_SALT_LENGTH); PHPBN2(CRYPT_STD_DES); PHPBN2(CRYPT_EXT_DES); PHPBN2(CRYPT_MD5); PHPBN2(CRYPT_BLOWFISH); PHPBN2(DIRECTORY_SEPARATOR); PHPBN2(SEEK_SET); PHPBN2(SEEK_CUR); PHPBN2(SEEK_END); PHPBN2(LOCK_SH); PHPBN2(LOCK_EX); PHPBN2(LOCK_UN); PHPBN2(LOCK_NB); PHPBN2(HTML_SPECIALCHARS); PHPBN2(HTML_ENTITIES); PHPBN2(ENT_COMPAT); PHPBN2(ENT_QUOTES); PHPBN2(ENT_NOQUOTES); PHPBN2(INFO_GENERAL); PHPBN2(INFO_CREDITS); PHPBN2(INFO_CONFIGURATION); PHPBN2(INFO_MODULES); PHPBN2(INFO_ENVIRONMENT); PHPBN2(INFO_VARIABLES); PHPBN2(INFO_LICENSE); PHPBN2(INFO_ALL); PHPBN2(CREDITS_GROUP); PHPBN2(CREDITS_GENERAL); PHPBN2(CREDITS_SAPI); PHPBN2(CREDITS_MODULES); PHPBN2(CREDITS_DOCS); PHPBN2(CREDITS_FULLPAGE); PHPBN2(CREDITS_QA); PHPBN2(CREDITS_ALL); PHPBN2(STR_PAD_LEFT); PHPBN2(STR_PAD_RIGHT); PHPBN2(STR_PAD_BOTH); PHPBN2(PATHINFO_DIRNAME); PHPBN2(PATHINFO_BASENAME); PHPBN2(PATHINFO_EXTENSION); PHPBN2(PATHINFO_FILENAME); // As of PHP 5.2 PHPBN2(PATH_SEPARATOR); PHPBN2(CHAR_MAX); PHPBN2(LC_CTYPE); PHPBN2(LC_NUMERIC); PHPBN2(LC_TIME); PHPBN2(LC_COLLATE); PHPBN2(LC_MONETARY); PHPBN2(LC_ALL); PHPBN2(LC_MESSAGES); PHPBN2(ABDAY_1); PHPBN2(ABDAY_2); PHPBN2(ABDAY_3); PHPBN2(ABDAY_4); PHPBN2(ABDAY_5); PHPBN2(ABDAY_6); PHPBN2(ABDAY_7); PHPBN2(DAY_1); PHPBN2(DAY_2); PHPBN2(DAY_3); PHPBN2(DAY_4); PHPBN2(DAY_5); PHPBN2(DAY_6); PHPBN2(DAY_7); PHPBN2(ABMON_1); PHPBN2(ABMON_2); PHPBN2(ABMON_3); PHPBN2(ABMON_4); PHPBN2(ABMON_5); PHPBN2(ABMON_6); PHPBN2(ABMON_7); PHPBN2(ABMON_8); PHPBN2(ABMON_9); PHPBN2(ABMON_10); PHPBN2(ABMON_11); PHPBN2(ABMON_12); PHPBN2(MON_1); PHPBN2(MON_2); PHPBN2(MON_3); PHPBN2(MON_4); PHPBN2(MON_5); PHPBN2(MON_6); PHPBN2(MON_7); PHPBN2(MON_8); PHPBN2(MON_9); PHPBN2(MON_10); PHPBN2(MON_11); PHPBN2(MON_12); PHPBN2(AM_STR); PHPBN2(PM_STR); PHPBN2(D_T_FMT); PHPBN2(D_FMT); PHPBN2(T_FMT); PHPBN2(T_FMT_AMPM); PHPBN2(ERA); PHPBN2(ERA_YEAR); PHPBN2(ERA_D_T_FMT); PHPBN2(ERA_D_FMT); PHPBN2(ERA_T_FMT); PHPBN2(ALT_DIGITS); PHPBN2(INT_CURR_SYMBOL); PHPBN2(CURRENCY_SYMBOL); PHPBN2(CRNCYSTR); PHPBN2(MON_DECIMAL_POINT); PHPBN2(MON_THOUSANDS_SEP); PHPBN2(MON_GROUPING); PHPBN2(POSITIVE_SIGN); PHPBN2(NEGATIVE_SIGN); PHPBN2(INT_FRAC_DIGITS); PHPBN2(FRAC_DIGITS); PHPBN2(P_CS_PRECEDES); PHPBN2(P_SEP_BY_SPACE); PHPBN2(N_CS_PRECEDES); PHPBN2(N_SEP_BY_SPACE); PHPBN2(P_SIGN_POSN); PHPBN2(N_SIGN_POSN); PHPBN2(DECIMAL_POINT); PHPBN2(RADIXCHAR); PHPBN2(THOUSANDS_SEP); PHPBN2(THOUSEP); PHPBN2(GROUPING); PHPBN2(YESEXPR); PHPBN2(NOEXPR); PHPBN2(YESSTR); PHPBN2(NOSTR); PHPBN2(CODESET); PHPBN2(LOG_EMERG); PHPBN2(LOG_ALERT); PHPBN2(LOG_CRIT); PHPBN2(LOG_ERR); PHPBN2(LOG_WARNING); PHPBN2(LOG_NOTICE); PHPBN2(LOG_INFO); PHPBN2(LOG_DEBUG); PHPBN2(LOG_KERN); PHPBN2(LOG_USER); PHPBN2(LOG_MAIL); PHPBN2(LOG_DAEMON); PHPBN2(LOG_AUTH); PHPBN2(LOG_SYSLOG); PHPBN2(LOG_LPR); PHPBN2(LOG_NEWS); PHPBN2(LOG_UUCP); PHPBN2(LOG_CRON); PHPBN2(LOG_AUTHPRIV); PHPBN2(LOG_LOCAL0); PHPBN2(LOG_LOCAL1); PHPBN2(LOG_LOCAL2); PHPBN2(LOG_LOCAL3); PHPBN2(LOG_LOCAL4); PHPBN2(LOG_LOCAL5); PHPBN2(LOG_LOCAL6); PHPBN2(LOG_LOCAL7); PHPBN2(LOG_PID); PHPBN2(LOG_CONS); PHPBN2(LOG_ODELAY); PHPBN2(LOG_NDELAY); PHPBN2(LOG_NOWAIT); PHPBN2(LOG_PERROR); /* Added in PHP 5.2 */ PHPBN2(PREG_BACKTRACK_LIMIT_ERROR); PHPBN2(PREG_BAD_UTF8_ERROR); PHPBN2(PREG_INTERNAL_ERROR); PHPBN2(PREG_NO_ERROR); PHPBN2(PREG_RECURSION_LIMIT_ERROR); PHPBN2(UPLOAD_ERR_EXTENSION); PHPBN2(STREAM_SHUT_RD); PHPBN2(STREAM_SHUT_WR); PHPBN2(STREAM_SHUT_RDWR); PHPBN2(CURLE_FILESIZE_EXCEEDED); PHPBN2(CURLE_FTP_SSL_FAILED); PHPBN2(CURLE_LDAP_INVALID_URL); PHPBN2(CURLFTPAUTH_DEFAULT); PHPBN2(CURLFTPAUTH_SSL); PHPBN2(CURLFTPAUTH_TLS); PHPBN2(CURLFTPSSL_ALL); PHPBN2(CURLFTPSSL_CONTROL); PHPBN2(CURLFTPSSL_NONE); PHPBN2(CURLFTPSSL_TRY); PHPBN2(CURLOPT_FTP_SSL); PHPBN2(CURLOPT_FTPSSLAUTH); PHPBN2(CURLOPT_TCP_NODELAY); // Added in PHP 5.2.1 PHPBN2(CURLOPT_TIMEOUT_MS); // Added in PHP 5.2.3 PHPBN2(CURLOPT_CONNECTTIMEOUT_MS); // Added in PHP 5.2.3 PHPBN2(GMP_VERSION); // Added in PHP 5.2.2 PHPBN2(SWFTEXTFIELD_USEFONT); PHPBN2(SWFTEXTFIELD_AUTOSIZE); PHPBN2(SWF_SOUND_NOT_COMPRESSED); PHPBN2(SWF_SOUND_ADPCM_COMPRESSED); PHPBN2(SWF_SOUND_MP3_COMPRESSED); PHPBN2(SWF_SOUND_NOT_COMPRESSED_LE); PHPBN2(SWF_SOUND_NELLY_COMPRESSED); PHPBN2(SWF_SOUND_5KHZ); PHPBN2(SWF_SOUND_11KHZ); PHPBN2(SWF_SOUND_22KHZ); PHPBN2(SWF_SOUND_44KHZ); PHPBN2(SWF_SOUND_8BITS); PHPBN2(SWF_SOUND_16BITS); PHPBN2(SWF_SOUND_MONO); PHPBN2(SWF_SOUND_STEREO); PHPBN2(OPENSSL_VERSION_NUMBER); PHPBN2(SNMP_OID_OUTPUT_FULL); PHPBN2(SNMP_OID_OUTPUT_NUMERIC); PHPBN2(MSG_EAGAIN); PHPBN2(MSG_ENOMSG); /* Added in PHP 5.3 */ PHPBN2(CURLOPT_PROGRESSFUNCTION); PHPBN2(IMG_FILTER_PIXELATE); PHPBN2(JSON_ERROR_CTRL_CHAR); PHPBN2(JSON_ERROR_DEPTH); PHPBN2(JSON_ERROR_NONE); PHPBN2(JSON_ERROR_STATE_MISMATCH); PHPBN2(JSON_ERROR_SYNTAX); PHPBN2(JSON_FORCE_OBJECT); PHPBN2(JSON_HEX_TAG); PHPBN2(JSON_HEX_AMP); PHPBN2(JSON_HEX_APOS); PHPBN2(JSON_HEX_QUOT); PHPBN2(LDAP_OPT_NETWORK_TIMEOUT); PHPBN2(LIBXML_LOADED_VERSION); PHPBN2(PREG_BAD_UTF8_OFFSET_ERROR); PHPBN2(BUS_ADRALN); PHPBN2(BUS_ADRERR); PHPBN2(BUS_OBJERR); PHPBN2(CLD_CONTIUNED); PHPBN2(CLD_DUMPED); PHPBN2(CLD_EXITED); PHPBN2(CLD_KILLED); PHPBN2(CLD_STOPPED); PHPBN2(CLD_TRAPPED); PHPBN2(FPE_FLTDIV); PHPBN2(FPE_FLTINV); PHPBN2(FPE_FLTOVF); PHPBN2(FPE_FLTRES); PHPBN2(FPE_FLTSUB); PHPBN2(FPE_FLTUND); PHPBN2(FPE_INTDIV); PHPBN2(FPE_INTOVF); PHPBN2(ILL_BADSTK); PHPBN2(ILL_COPROC); PHPBN2(ILL_ILLADR); PHPBN2(ILL_ILLOPC); PHPBN2(ILL_ILLOPN); PHPBN2(ILL_ILLTRP); PHPBN2(ILL_PRVOPC); PHPBN2(ILL_PRVREG); PHPBN2(POLL_ERR); PHPBN2(POLL_HUP); PHPBN2(POLL_IN); PHPBN2(POLL_MSG); PHPBN2(POLL_OUT); PHPBN2(POLL_PRI); PHPBN2(SEGV_ACCERR); PHPBN2(SEGV_MAPERR); PHPBN2(SI_ASYNCIO); PHPBN2(SI_KERNEL); PHPBN2(SI_MESGQ); PHPBN2(SI_NOINFO); PHPBN2(SI_QUEUE); PHPBN2(SI_SIGIO); PHPBN2(SI_TIMER); PHPBN2(SI_TKILL); PHPBN2(SI_USER); PHPBN2(SIG_BLOCK); PHPBN2(SIG_SETMASK); PHPBN2(SIG_UNBLOCK); PHPBN2(TRAP_BRKPT); PHPBN2(TRAP_TRACE); /* Added in PHP 5.4 */ PHPBN2(ENT_DISALLOWED); PHPBN2(ENT_HTML401); PHPBN2(ENT_HTML5); PHPBN2(ENT_SUBSTITUTE); PHPBN2(ENT_XML1); PHPBN2(ENT_XHTML); PHPBN2(IPPROTO_IP); PHPBN2(IPPROTO_IPV6); PHPBN2(IPV6_MULTICAST_HOPS); PHPBN2(IPV6_MULTICAST_IF); PHPBN2(IPV6_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_IF); PHPBN2(IP_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_TTL); PHPBN2(MCAST_JOIN_GROUP); PHPBN2(MCAST_LEAVE_GROUP); PHPBN2(MCAST_BLOCK_SOURCE); PHPBN2(MCAST_UNBLOCK_SOURCE); PHPBN2(MCAST_JOIN_SOURCE_GROUP); PHPBN2(MCAST_LEAVE_SOURCE_GROUP); PHPBN2(CURLOPT_MAX_RECV_SPEED_LARGE); PHPBN2(CURLOPT_MAX_SEND_SPEED_LARGE); PHPBN2(LIBXML_HTML_NODEFDTD); PHPBN2(LIBXML_HTML_NOIMPLIED); PHPBN2(LIBXML_PEDANTIC); PHPBN2(OPENSSL_CIPHER_AES_128_CBC); PHPBN2(OPENSSL_CIPHER_AES_192_CBC); PHPBN2(OPENSSL_CIPHER_AES_256_CBC); PHPBN2(OPENSSL_RAW_DATA); PHPBN2(OPENSSL_ZERO_PADDING); PHPBN2(PHP_OUTPUT_HANDLER_CLEAN); PHPBN2(PHP_OUTPUT_HANDLER_CLEANABLE); PHPBN2(PHP_OUTPUT_HANDLER_DISABLED); PHPBN2(PHP_OUTPUT_HANDLER_FINAL); PHPBN2(PHP_OUTPUT_HANDLER_FLUSH); PHPBN2(PHP_OUTPUT_HANDLER_FLUSHABLE); PHPBN2(PHP_OUTPUT_HANDLER_REMOVABLE); PHPBN2(PHP_OUTPUT_HANDLER_STARTED); PHPBN2(PHP_OUTPUT_HANDLER_STDFLAGS); PHPBN2(PHP_OUTPUT_HANDLER_WRITE); PHPBN2(PHP_SESSION_ACTIVE); PHPBN2(PHP_SESSION_DISABLED); PHPBN2(PHP_SESSION_NONE); PHPBN2(STREAM_META_ACCESS); PHPBN2(STREAM_META_GROUP); PHPBN2(STREAM_META_GROUP_NAME); PHPBN2(STREAM_META_OWNER); PHPBN2(STREAM_META_OWNER_NAME); PHPBN2(STREAM_META_TOUCH); PHPBN2(ZLIB_ENCODING_DEFLATE); PHPBN2(ZLIB_ENCODING_GZIP); PHPBN2(ZLIB_ENCODING_RAW); PHPBN2(U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR); PHPBN2(IDNA_CHECK_BIDI); PHPBN2(IDNA_CHECK_CONTEXTJ); PHPBN2(IDNA_NONTRANSITIONAL_TO_ASCII); PHPBN2(IDNA_NONTRANSITIONAL_TO_UNICODE); PHPBN2(INTL_IDNA_VARIANT_2003); PHPBN2(INTL_IDNA_VARIANT_UTS46); PHPBN2(IDNA_ERROR_EMPTY_LABEL); PHPBN2(IDNA_ERROR_LABEL_TOO_LONG); PHPBN2(IDNA_ERROR_DOMAIN_NAME_TOO_LONG); PHPBN2(IDNA_ERROR_LEADING_HYPHEN); PHPBN2(IDNA_ERROR_TRAILING_HYPHEN); PHPBN2(IDNA_ERROR_HYPHEN_3_4); PHPBN2(IDNA_ERROR_LEADING_COMBINING_MARK); PHPBN2(IDNA_ERROR_DISALLOWED); PHPBN2(IDNA_ERROR_PUNYCODE); PHPBN2(IDNA_ERROR_LABEL_HAS_DOT); PHPBN2(IDNA_ERROR_INVALID_ACE_LABEL); PHPBN2(IDNA_ERROR_BIDI); PHPBN2(IDNA_ERROR_CONTEXTJ); PHPBN2(JSON_PRETTY_PRINT); PHPBN2(JSON_UNESCAPED_SLASHES); PHPBN2(JSON_NUMERIC_CHECK); PHPBN2(JSON_UNESCAPED_UNICODE); PHPBN2(JSON_BIGINT_AS_STRING); /* Added in PHP 5.5 */ PHPBN2(IMG_AFFINE_TRANSLATE); PHPBN2(IMG_AFFINE_SCALE); PHPBN2(IMG_AFFINE_ROTATE); PHPBN2(IMG_AFFINE_SHEAR_HORIZONTAL); PHPBN2(IMG_AFFINE_SHEAR_VERTICAL); PHPBN2(IMG_CROP_DEFAULT); PHPBN2(IMG_CROP_TRANSPARENT); PHPBN2(IMG_CROP_BLACK); PHPBN2(IMG_CROP_WHITE); PHPBN2(IMG_CROP_SIDES); PHPBN2(IMG_FLIP_BOTH); PHPBN2(IMG_FLIP_HORIZONTAL); PHPBN2(IMG_FLIP_VERTICAL); PHPBN2(IMG_BELL); PHPBN2(IMG_BESSEL); PHPBN2(IMG_BICUBIC); PHPBN2(IMG_BICUBIC_FIXED); PHPBN2(IMG_BLACKMAN); PHPBN2(IMG_BOX); PHPBN2(IMG_BSPLINE); PHPBN2(IMG_CATMULLROM); PHPBN2(IMG_GAUSSIAN); PHPBN2(IMG_GENERALIZED_CUBIC); PHPBN2(IMG_HERMITE); PHPBN2(IMG_HAMMING); PHPBN2(IMG_HANNING); PHPBN2(IMG_MITCHELL); PHPBN2(IMG_POWER); PHPBN2(IMG_QUADRATIC); PHPBN2(IMG_SINC); PHPBN2(IMG_NEAREST_NEIGHBOUR); PHPBN2(IMG_WEIGHTED4); PHPBN2(IMG_TRIANGLE); PHPBN2(JSON_ERROR_RECURSION); PHPBN2(JSON_ERROR_INF_OR_NAN); PHPBN2(JSON_ERROR_UNSUPPORTED_TYPE); PHPBN2(MYSQLI_SERVER_PUBLIC_KEY); /* Added in PHP 5.6 */ PHPBN2(LDAP_ESCAPE_DN); PHPBN2(LDAP_ESCAPE_FILTER); PHPBN2(OPENSSL_DEFAULT_STREAM_CIPHERS); PHPBN2(STREAM_CRYPTO_METHOD_ANY_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_ANY_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_SERVER); PHPBN2(PGSQL_CONNECT_ASYNC); PHPBN2(PGSQL_CONNECTION_AUTH_OK); PHPBN2(PGSQL_CONNECTION_AWAITING_RESPONSE); PHPBN2(PGSQL_CONNECTION_MADE); PHPBN2(PGSQL_CONNECTION_SETENV); PHPBN2(PGSQL_CONNECTION_SSL_STARTUP); PHPBN2(PGSQL_CONNECTION_STARTED); PHPBN2(PGSQL_DML_ESCAPE); PHPBN2(PGSQL_POLLING_ACTIVE); PHPBN2(PGSQL_POLLING_FAILED); PHPBN2(PGSQL_POLLING_OK); PHPBN2(PGSQL_POLLING_READING); PHPBN2(PGSQL_POLLING_WRITING); /* Class names reserved by PHP (case insensitive) */ PHPCN(directory); PHPCN(stdclass); PHPCN(__php_incomplete_class); /* Added in PHP5. */ PHPCN(exception); PHPCN(errorexception); // As of PHP 5.1 PHPCN(php_user_filter); PHPCN(closure); // As of PHP 5.3 PHPCN(generator); // As of PHP 5.5 PHPCN(self); PHPCN(static); PHPCN(parent); /* http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.other.classes */ PHPCN(bool); // As of PHP 7.0 PHPCN(int); // As of PHP 7.0 PHPCN(float); // As of PHP 7.0 PHPCN(string); // As of PHP 7.0 PHPCN(NULL); // As of PHP 7.0 PHPCN(TRUE); // As of PHP 7.0 PHPCN(FALSE); // As of PHP 7.0 PHPCN(resource); // As of PHP 7.0 (currently works but reserved) PHPCN(object); // As of PHP 7.0 (currently works but reserved) PHPCN(mixed); // As of PHP 7.0 (currently works but reserved) PHPCN(numeric); // As of PHP 7.0 (currently works but reserved) /* http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.invalid-class-names */ PHPCN(iterable); // As of PHP 7.1 PHPCN(void); // As of PHP 7.1 /* From extensions (which of these are actually predefined depends which * extensions are loaded by default). */ PHPCN(xmlwriter); PHPCN(libxmlerror); PHPCN(simplexmlelement); PHPCN(soapclient); PHPCN(soapvar); PHPCN(soapserver); PHPCN(soapfault); PHPCN(soapparam); PHPCN(soapheader); PHPCN(recursiveiteratoriterator); PHPCN(filteriterator); PHPCN(recursivefilteriterator); PHPCN(parentiterator); PHPCN(limititerator); PHPCN(cachingiterator); PHPCN(recursivecachingiterator); PHPCN(iteratoriterator); PHPCN(norewinditerator); PHPCN(appenditerator); PHPCN(infiniteiterator); PHPCN(emptyiterator); PHPCN(arrayobject); PHPCN(arrayiterator); PHPCN(recursivearrayiterator); PHPCN(splfileinfo); PHPCN(directoryiterator); PHPCN(recursivedirectoryiterator); PHPCN(splfileobject); PHPCN(spltempfileobject); PHPCN(simplexmliterator); PHPCN(logicexception); PHPCN(badfunctioncallexception); PHPCN(badmethodcallexception); PHPCN(domainexception); PHPCN(invalidargumentexception); PHPCN(lengthexception); PHPCN(outofrangeexception); PHPCN(runtimeexception); PHPCN(outofboundsexception); PHPCN(overflowexception); PHPCN(rangeexception); PHPCN(underflowexception); PHPCN(unexpectedvalueexception); PHPCN(splobjectstorage); PHPCN(reflectionexception); PHPCN(reflection); PHPCN(reflectionfunction); PHPCN(reflectionparameter); PHPCN(reflectionmethod); PHPCN(reflectionclass); PHPCN(reflectionobject); PHPCN(reflectionproperty); PHPCN(reflectionextension); PHPCN(domexception); PHPCN(domstringlist); PHPCN(domnamelist); PHPCN(domimplementationlist); PHPCN(domimplementationsource); PHPCN(domimplementation); PHPCN(domnode); PHPCN(domnamespacenode); PHPCN(domdocumentfragment); PHPCN(domdocument); PHPCN(domnodelist); PHPCN(domnamednodemap); PHPCN(domcharacterdata); PHPCN(domattr); PHPCN(domelement); PHPCN(domtext); PHPCN(domcomment); PHPCN(domtypeinfo); PHPCN(domuserdatahandler); PHPCN(domdomerror); PHPCN(domerrorhandler); PHPCN(domlocator); PHPCN(domconfiguration); PHPCN(domcdatasection); PHPCN(domdocumenttype); PHPCN(domnotation); PHPCN(domentity); PHPCN(domentityreference); PHPCN(domprocessinginstruction); PHPCN(domstringextend); PHPCN(domxpath); PHPCN(xmlreader); PHPCN(sqlitedatabase); PHPCN(sqliteresult); PHPCN(sqliteunbuffered); PHPCN(sqliteexception); PHPCN(datetime); /* Built-in PHP functions (incomplete). */ /* Includes Array Functions - http://php.net/manual/en/ref.array.php */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPFN(acos); PHPFN(array_change_key_case); PHPFN(array_chunk); PHPFN(array_column); PHPFN(array_combine); PHPFN(array_count_values); PHPFN(array_diff); PHPFN(array_diff_assoc); PHPFN(array_diff_key); PHPFN(array_diff_uassoc); PHPFN(array_diff_ukey); PHPFN(array_fill); PHPFN(array_fill_keys); PHPFN(array_filter); PHPFN(array_flip); PHPFN(array_intersect); PHPFN(array_intersect_assoc); PHPFN(array_intersect_key); PHPFN(array_intersect_uassoc); PHPFN(array_intersect_ukey); PHPFN(array_key_exists); PHPFN(array_keys); PHPFN(array_map); PHPFN(array_merge); PHPFN(array_merge_recursive); PHPFN(array_multisort); PHPFN(array_pad); PHPFN(array_pop); PHPFN(array_product); PHPFN(array_push); PHPFN(array_rand); PHPFN(array_reduce); PHPFN(array_replace); PHPFN(array_replace_recursive); PHPFN(array_reverse); PHPFN(array_search); PHPFN(array_shift); PHPFN(array_slice); PHPFN(array_splice); PHPFN(array_sum); PHPFN(array_udiff); PHPFN(array_udiff_assoc); PHPFN(array_udiff_uassoc); PHPFN(array_uintersect); PHPFN(array_uintersect_assoc); PHPFN(array_uintersect_uassoc); PHPFN(array_unique); PHPFN(array_unshift); PHPFN(array_values); PHPFN(array_walk); PHPFN(array_walk_recursive); PHPFN(arsort); PHPFN(asin); PHPFN(asort); PHPFN(atan); PHPFN(atan2); PHPFN(ceil); PHPFN(compact); PHPFN(cos); PHPFN(cosh); PHPFN(count); PHPFN(current); PHPFN(each); PHPFN(end); PHPFN(exp); PHPFN(extract); PHPFN(floor); PHPFN(fmod); PHPFN(in_array); PHPFN(key); PHPFN(key_exists); PHPFN(krsort); PHPFN(ksort); PHPFN(log); PHPFN(log10); PHPFN(max); PHPFN(min); PHPFN(natcasesort); PHPFN(natsort); PHPFN(next); PHPFN(pos); PHPFN(pow); PHPFN(prev); PHPFN(range); PHPFN(reset); PHPFN(rsort); PHPFN(shuffle); PHPFN(sin); PHPFN(sinh); PHPFN(sizeof); PHPFN(sort); PHPFN(sqrt); PHPFN(tan); PHPFN(tanh); PHPFN(uasort); PHPFN(uksort); PHPFN(usort); #undef PHPKW #undef PHPBN1a #undef PHPBN1b #undef PHPBN1 #undef PHPBN2a #undef PHPBN2b #undef PHPBN2 #undef PHPCN #undef PHPFN swig-3.0.12/Lib/php/director.swg0000664000175000017500000000776713042756442016310 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that PHP proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PHP_HEADER_ #define SWIG_DIRECTOR_PHP_HEADER_ #include #include #include namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() { } virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem * operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; class Director { protected: // "mutable" so we can get a non-const pointer to it in const methods. mutable zval swig_self; typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; public: Director(zval *self) { ZVAL_COPY_VALUE(&swig_self, self); } static bool swig_is_overridden_method(const char *cname, const char *lc_fname) { bool result = false; zend_string * cname_str = zend_string_init(cname, strlen(cname), 0); zend_class_entry *ce = zend_lookup_class(cname_str); if (ce) { zval * mptr = zend_hash_str_find(&ce->function_table, lc_fname, strlen(lc_fname)); if (mptr) { // common.scope points to zend_class_entry for the declaring class, // and there's only one of those per class, so we can just use a // pointer compare here. result = Z_FUNC_P(mptr)->common.scope != ce; } } zend_string_release(cname_str); return result; } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } }; /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(int code, const char *hdr, const char *msg) : swig_msg(hdr) { if (msg && msg[0]) { swig_msg += " "; swig_msg += msg; } SWIG_ErrorCode() = code; SWIG_ErrorMsg() = swig_msg.c_str(); } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } static void raise(int code, const char *hdr, const char *msg) { throw DirectorException(code, hdr, msg); } }; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(E_ERROR, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* any php exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException() : DirectorException(E_ERROR, "SWIG director method error", NULL) { } DirectorMethodException(const char *msg) : DirectorException(E_ERROR, "SWIG director method error", msg) { } static void raise(const char *msg) { throw DirectorMethodException(msg); } }; } #endif swig-3.0.12/Lib/php/php.swg0000664000175000017500000003246713042756442015257 0ustar williamwilliam/* ----------------------------------------------------------------------------- * php.swg * * PHP configuration file * ----------------------------------------------------------------------------- */ %runtime "swigrun.swg" // Common C API type-checking code %runtime "phprun.swg" // PHP runtime functions %include // PHP initialization routine. %include // Global variables. %include // use %init %{ "/*code goes here*/ " %} // or %minit %{ "/* code goes here*/ " %} to // insert code in the PHP_MINIT_FUNCTION #define %minit %insert("init") // use %rinit %{ "/* code goes here*/ " %} to // insert code in the PHP_RINIT_FUNCTION #define %rinit %insert("rinit") // use %shutdown %{ " /*code goes here*/ " %} to // insert code in the PHP_MSHUTDOWN_FUNCTION #define %shutdown %insert("shutdown") #define %mshutdown %insert("shutdown") // use %rshutdown %{ " /*code goes here*/" %} to // insert code in the PHP_RSHUTDOWN_FUNCTION #define %rshutdown %insert("rshutdown") /* Typemaps for input parameters by value */ %include %pass_by_val(bool,CONVERT_BOOL_IN); %pass_by_val(size_t, CONVERT_INT_IN); %pass_by_val(enum SWIGTYPE, CONVERT_INT_IN); %pass_by_val(signed int, CONVERT_INT_IN); %pass_by_val(int,CONVERT_INT_IN); %pass_by_val(unsigned int,CONVERT_INT_IN); %pass_by_val(signed short, CONVERT_INT_IN); %pass_by_val(short,CONVERT_INT_IN); %pass_by_val(unsigned short, CONVERT_INT_IN); %pass_by_val(signed long, CONVERT_INT_IN); %pass_by_val(long, CONVERT_INT_IN); %pass_by_val(unsigned long, CONVERT_INT_IN); %pass_by_val(signed long long, CONVERT_LONG_LONG_IN); %pass_by_val(long long, CONVERT_LONG_LONG_IN); %pass_by_val(unsigned long long, CONVERT_UNSIGNED_LONG_LONG_IN); %pass_by_val(signed char, CONVERT_INT_IN); %pass_by_val(char, CONVERT_CHAR_IN); %pass_by_val(unsigned char, CONVERT_INT_IN); %pass_by_val(float, CONVERT_FLOAT_IN); %pass_by_val(double, CONVERT_FLOAT_IN); %pass_by_val(char *, CONVERT_STRING_IN); %typemap(in) char *& = const char *&; %typemap(directorout) char *& = const char *&; // char array can be in/out, though the passed string may not be big enough... // so we have to size it %typemap(in) char[ANY] %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); %} %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) %{ convert_to_string(&$input); $1 = ($1_ltype) Z_STRVAL($input); $2 = ($2_ltype) Z_STRLEN($input); %} /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype tmp) %{ if (SWIG_ConvertPtr(&$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } $1 = *tmp; %} %typemap(directorout) SWIGTYPE ($&1_ltype tmp) %{ /* If exit was via exception, PHP NULL is returned so skip the conversion. */ if (!EG(exception)) { if (SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); $result = *tmp; } %} %typemap(in) SWIGTYPE *, SWIGTYPE [] %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE & %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE && %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } %} %typemap(in) SWIGTYPE *const& ($*ltype temp) %{ if (SWIG_ConvertPtr(&$input, (void **) &temp, $*1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $*1_descriptor"); } $1 = ($1_ltype)&temp; %} %typemap(in) SWIGTYPE *DISOWN %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } %} %typemap(argout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE &&; %typemap(in) void * %{ if (SWIG_ConvertPtr(&$input, (void **) &$1, 0, 0) < 0) { /* Allow NULL from php for void* */ if (Z_ISNULL($input)) $1=0; else SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } %} /* Special case when void* is passed by reference so it can be made to point to opaque api structs */ %typemap(in) void ** ($*1_ltype ptr, int force), void *& ($*1_ltype ptr, int force) { /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } } %typemap(argout) void **, void *& %{ if (force$argnum) { SWIG_SetPointerZval(&$input, (void*) ptr$argnum, $*1_descriptor, 1); } %} /* Typemap for output values */ %typemap(out) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, size_t %{ RETVAL_LONG($1); %} %typemap(out) enum SWIGTYPE %{ RETVAL_LONG((long)$1); %} %typemap(out) long long %{ if ((long long)LONG_MIN <= $1 && $1 <= (long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { char temp[256]; sprintf(temp, "%lld", (long long)$1); RETVAL_STRING(temp); } %} %typemap(out) unsigned long long %{ if ($1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)($1)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)$1); RETVAL_STRING(temp); } %} %typemap(out) const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const signed char &, const unsigned char &, const bool &, const size_t & %{ RETVAL_LONG(*$1); %} %typemap(out) const enum SWIGTYPE & %{ RETVAL_LONG((long)*$1); %} %typemap(out) const enum SWIGTYPE && %{ RETVAL_LONG((long)*$1); %} %typemap(out) const long long & %{ if ((long long)LONG_MIN <= *$1 && *$1 <= (long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { char temp[256]; sprintf(temp, "%lld", (long long)(*$1)); RETVAL_STRING(temp); } %} %typemap(out) const unsigned long long & %{ if (*$1 <= (unsigned long long)LONG_MAX) { RETVAL_LONG((long)(*$1)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*$1)); RETVAL_STRING(temp); } %} %typemap(directorin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, size_t, enum SWIGTYPE %{ ZVAL_LONG($input,$1); %} %typemap(directorin) enum SWIGTYPE %{ ZVAL_LONG($input, (long)$1_name); %} %typemap(directorin) char *, char [] %{ if(!$1) { ZVAL_NULL($input); } else { ZVAL_STRING($input, (const char*)$1); } %} %typemap(out) bool %{ RETVAL_BOOL(($1) ? 1 : 0); %} %typemap(out) const bool & %{ RETVAL_BOOL((*$1) ? 1 : 0); %} %typemap(directorin) bool %{ ZVAL_BOOL($input, ($1) ? 1 : 0); %} %typemap(out) float, double %{ RETVAL_DOUBLE($1); %} %typemap(out) const float &, const double & %{ RETVAL_DOUBLE(*$1); %} %typemap(directorin) float, double %{ ZVAL_DOUBLE($input, $1); %} %typemap(out) char %{ RETVAL_STRINGL(&$1, 1); %} %typemap(out) const char & %{ RETVAL_STRINGL(&*$1, 1); %} %typemap(out) char *, char [] %{ if (!$1) { RETVAL_NULL(); } else { RETVAL_STRING((const char *)$1); } %} %typemap(out) char *& %{ if (!*$1) { RETVAL_NULL(); } else { RETVAL_STRING((const char *)*$1); } %} %typemap(out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner); %} %typemap(out) SWIGTYPE *const& %{ SWIG_SetPointerZval(return_value, (void *)*$1, $*1_descriptor, $owner); %} %typemap(directorin) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, ($owner)|2); %} %typemap(out, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); RETVAL_RES(zend_register_resource(p, swig_member_ptr)); } %typemap(in, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = (void*)zend_fetch_resource_ex(&$input, SWIG_MEMBER_PTR, swig_member_ptr); memcpy(&$1, p, sizeof($1)); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); SWIG_SetPointerZval(return_value, (void *)$1, ty, $owner); } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultobj = new $1_ltype((const $1_ltype &) $1); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #else { $&1_ltype resultobj = ($&1_ltype) emalloc(sizeof($1_type)); memcpy(resultobj, &$1, sizeof($1_type)); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #endif %typemap(directorin) SWIGTYPE %{ SWIG_SetPointerZval($input, SWIG_as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&1_descriptor, 1|2); %} %typemap(out) void ""; %typemap(out) char [ANY] { int len = 0; while (len < $1_dim0 && $1[len]) ++len; RETVAL_STRINGL($1, len); } // This typecheck does hard checking for proper argument type. If you want // an argument to be converted from a different PHP type, you must convert // it yourself before passing it (e.g. (string)4.7 or (int)"6"). %define %php_typecheck(_type,_prec,is) %typemap(typecheck,precedence=_prec) _type, const _type & " $1 = (Z_TYPE($input) == is);" %enddef // Like %php_typecheck but allows either of two values. %define %php_typecheck2(_type,_prec,is1,is2) %typemap(typecheck,precedence=_prec) _type, const _type & " $1 = (Z_TYPE($input) == is1 || Z_TYPE($input) == is2);" %enddef %php_typecheck(int,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck(unsigned int,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(short,SWIG_TYPECHECK_INT16,IS_LONG) %php_typecheck(unsigned short,SWIG_TYPECHECK_UINT16,IS_LONG) %php_typecheck(long,SWIG_TYPECHECK_INT32,IS_LONG) %php_typecheck(unsigned long,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(long long,SWIG_TYPECHECK_INT64,IS_LONG) %php_typecheck(unsigned long long,SWIG_TYPECHECK_UINT64,IS_LONG) %php_typecheck(signed char,SWIG_TYPECHECK_INT8,IS_LONG) %php_typecheck(unsigned char,SWIG_TYPECHECK_UINT8,IS_LONG) %php_typecheck(size_t,SWIG_TYPECHECK_SIZE,IS_LONG) %php_typecheck(enum SWIGTYPE,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck2(bool,SWIG_TYPECHECK_BOOL,IS_TRUE,IS_FALSE) %php_typecheck(float,SWIG_TYPECHECK_FLOAT,IS_DOUBLE) %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE) %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING) %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char [] " $1 = (Z_TYPE($input) == IS_STRING); " %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *tmp; _v = (SWIG_ConvertPtr(&$input, (void **)&tmp, $&1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const& { void *tmp; _v = (SWIG_ConvertPtr(&$input, (void**)&tmp, $1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *const& { void *tmp; _v = (SWIG_ConvertPtr(&$input, (void**)&tmp, $*1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *tmp; _v = (SWIG_ConvertPtr(&$input, (void**)&tmp, 0, 0) >= 0); } /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short %{ zend_throw_exception(NULL, "C++ $1_type exception thrown", $1); return; %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; zend_throw_exception(NULL, "C++ $1_type exception thrown", 0); return; %} %typemap(throws) char * %{ zend_throw_exception(NULL, $1, 0); return; %} /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* php keywords */ %include swig-3.0.12/Lib/php/phppointers.i0000664000175000017500000000275713042756442016472 0ustar williamwilliam%define %pass_by_ref( TYPE, CONVERT_IN, CONVERT_OUT ) %typemap(in, byref=1) TYPE *REF ($*1_ltype tmp), TYPE &REF ($*1_ltype tmp) %{ /* First Check for SWIG wrapped type */ if (Z_ISNULL($input)) { $1 = 0; } else if (Z_ISREF($input)) { /* Not swig wrapped type, so we check if it's a PHP reference type */ CONVERT_IN(tmp, $*1_ltype, $input); $1 = &tmp; } else { SWIG_PHP_Error(E_ERROR, SWIG_PHP_Arg_Error_Msg($argnum, Expected a reference)); } %} %typemap(argout) TYPE *REF, TYPE &REF %{ if (Z_ISREF($input)) { CONVERT_OUT(Z_REFVAL($input), tmp$argnum); } %} %enddef %pass_by_ref( size_t, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( char, CONVERT_CHAR_IN, ZVAL_STRING ); %pass_by_ref( unsigned char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( float, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( double, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( char *, CONVERT_CHAR_IN, ZVAL_STRING ); swig-3.0.12/Lib/php/std_vector.i0000664000175000017500000000526013042756442016263 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef bool value_type; typedef bool const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } bool pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); bool x = self->back(); self->pop_back(); return x; } bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && ivalue.lval = (long)$1; } } //SAMFIX need to cast zval->type, what if zend-hash_find fails? etc? %typemap(varout) bool { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); if ($1 != ($1_ltype)Z_LVAL_P(z_var)) { z_var->value.lval = (long)$1; } } %typemap(varout) double, float { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); if ($1 != ($1_ltype)Z_DVAL_P(z_var)) { z_var->value.dval = (double)$1; } } %typemap(varout) char { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); char c = $1; if ($1 != Z_STRVAL_P(z_val)[0]) { ZVAL_STRING(z_var, &c); } } %typemap(varout) char * { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); const char *s1 = Z_STRVAL_P(z_var); if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { if (s1) efree(s1); if ($1) { (z_var)->value.str.val = estrdup($1); (z_var)->value.str.len = strlen($1) + 1; } else { (z_var)->value.str.val = 0; (z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)&$1, $&1_descriptor, 0); } %typemap(varout) SWIGTYPE [] { if($1) { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); } } %typemap(varout) char [ANY] { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); const char *s1 = Z_STRVAL_P(z_var); deliberate error cos this code looks bogus to me if ((s1 == NULL) || strcmp(s1, $1)) { if ($1) { (z_var)->value.str.val = estrdup($1); (z_var)->value.str.len = strlen($1) + 1; } else { (z_var)->value.str.val = 0; (z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE && { zval *z_var = zend_hash_str_find(&EG(symbol_table), "$1", sizeof("$1") - 1); SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); } %typemap(varout, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { zval resource; void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); ZVAL_RES(&resource, zend_register_resource(p, swig_member_ptr)); zend_hash_str_add(&EG(symbol_table), "$1", sizeof("$1") - 1, &resource); } swig-3.0.12/Lib/php/utils.i0000664000175000017500000000502713042756442015250 0ustar williamwilliam %define CONVERT_BOOL_IN(lvar,t,invar) lvar = (t) zval_is_true(&invar); %enddef %define CONVERT_INT_IN(lvar,t,invar) lvar = (t) zval_get_long(&invar); %enddef %define CONVERT_LONG_LONG_IN(lvar,t,invar) switch (Z_TYPE(invar)) { case IS_DOUBLE: lvar = (t) Z_DVAL(invar); break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoll(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: lvar = (t) zval_get_long(&invar); } %enddef %define CONVERT_UNSIGNED_LONG_LONG_IN(lvar,t,invar) switch (Z_TYPE(invar)) { case IS_DOUBLE: lvar = (t) Z_DVAL(invar); break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoull(Z_STRVAL(invar), &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: lvar = (t) zval_get_long(&invar); } %enddef %define CONVERT_INT_OUT(lvar,invar) lvar = (t) zval_get_long(&invar); %enddef %define CONVERT_FLOAT_IN(lvar,t,invar) lvar = (t) zval_get_double(&invar); %enddef %define CONVERT_CHAR_IN(lvar,t,invar) convert_to_string(&invar); lvar = (t) Z_STRVAL(invar)[0]; %enddef %define CONVERT_STRING_IN(lvar,t,invar) if (Z_ISNULL(invar)) { lvar = (t) 0; } else { convert_to_string(&invar); lvar = (t) Z_STRVAL(invar); } %enddef %define %pass_by_val( TYPE, CONVERT_IN ) %typemap(in) TYPE %{ CONVERT_IN($1,$1_ltype,$input); %} %typemap(in) const TYPE & ($*1_ltype temp) %{ CONVERT_IN(temp,$*1_ltype,$input); $1 = &temp; %} %typemap(directorout) TYPE %{ if (!EG(exception)) { CONVERT_IN($result, $1_ltype, *$input); } else { typedef $1_ltype swig_result_typedef; $result = swig_result_typedef(); } %} %typemap(directorout) const TYPE & ($*1_ltype temp) %{ if (!EG(exception)) { CONVERT_IN(temp, $*1_ltype, *$input); } else { typedef $*1_ltype swig_result_typedef; temp = swig_result_typedef(); } $result = &temp; %} %enddef %fragment("t_output_helper","header") %{ static void t_output_helper(zval *target, zval *o) { zval tmp; if (Z_TYPE_P(target) == IS_ARRAY) { /* it's already an array, just append */ add_next_index_zval(target, o); return; } if (Z_TYPE_P(target) == IS_NULL) { /* NULL isn't refcounted */ ZVAL_COPY_VALUE(target, o); return; } ZVAL_DUP(&tmp, target); array_init(target); add_next_index_zval(target, &tmp); add_next_index_zval(target, o); } %} swig-3.0.12/Lib/php/phprun.swg0000664000175000017500000001733613042756442016002 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phprun.swg * * PHP runtime library * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "zend.h" #include "zend_API.h" #include "zend_exceptions.h" #include "php.h" #if PHP_MAJOR_VERSION != 7 # error These bindings need PHP7 - to generate PHP5 bindings use: swig -php5 #endif #include "ext/standard/php_string.h" #include /* for abort(), used in generated code. */ /* This indirection is to work around const correctness issues in older PHP. * FIXME: Remove for PHP7? Or might user code be using it? */ #define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_NAMED_FE(ZN, N, A) #define SWIG_BOOL_CONSTANT(N, V) REGISTER_BOOL_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_LONG_CONSTANT(N, V) REGISTER_LONG_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_DOUBLE_CONSTANT(N, V) REGISTER_DOUBLE_CONSTANT(#N, V, CONST_CS | CONST_PERSISTENT) #define SWIG_STRING_CONSTANT(N, V) REGISTER_STRING_CONSTANT(#N, (char*)V, CONST_CS | CONST_PERSISTENT) #define SWIG_CHAR_CONSTANT(N, V) do {\ char swig_char = (V);\ REGISTER_STRINGL_CONSTANT(#N, &swig_char, 1, CONST_CS | CONST_PERSISTENT);\ } while (0) #ifdef __cplusplus } #endif #define SWIG_fail goto fail static const char *default_error_msg = "Unknown error occurred"; static int default_error_code = E_ERROR; #define SWIG_PHP_Arg_Error_Msg(argnum,extramsg) "Error in argument " #argnum " "#extramsg #define SWIG_PHP_Error(code,msg) do { SWIG_ErrorCode() = code; SWIG_ErrorMsg() = msg; SWIG_fail; } while (0) #define SWIG_contract_assert(expr,msg) \ if (!(expr) ) { zend_printf("Contract Assert Failed %s\n",msg ); } else /* Standard SWIG API */ #define SWIG_GetModule(clientdata) SWIG_Php_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Php_SetModule(pointer) /* used to wrap returned objects in so we know whether they are newobject and need freeing, or not */ typedef struct { void * ptr; int newobject; } swig_object_wrapper; #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) static void SWIG_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject) { /* * First test for Null pointers. Return those as PHP native NULL */ if (!ptr ) { ZVAL_NULL(z); return; } if (type->clientdata) { swig_object_wrapper *value; if (! (*(int *)(type->clientdata))) zend_error(E_ERROR, "Type: %s failed to register with zend",type->name); value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); value->ptr=ptr; value->newobject=(newobject & 1); if ((newobject & 2) == 0) { /* Just register the pointer as a resource. */ ZVAL_RES(z, zend_register_resource(value, *(int *)(type->clientdata))); } else { /* * Wrap the resource in an object, the resource will be accessible * via the "_cPtr" member. This is currently only used by * directorin typemaps. */ zval resource; zend_class_entry *ce = NULL; const char *type_name = type->name+3; /* +3 so: _p_Foo -> Foo */ size_t type_name_len; const char * p; HashTable * ht; /* Namespace__Foo -> Foo */ /* FIXME: ugly and goes wrong for classes with __ in their names. */ while ((p = strstr(type_name, "__")) != NULL) { type_name = p + 2; } type_name_len = strlen(type_name); ZVAL_RES(&resource, zend_register_resource(value, *(int *)(type->clientdata))); if (SWIG_PREFIX_LEN > 0) { zend_string * classname = zend_string_alloc(SWIG_PREFIX_LEN + type_name_len, 0); memcpy(classname->val, SWIG_PREFIX, SWIG_PREFIX_LEN); memcpy(classname->val + SWIG_PREFIX_LEN, type_name, type_name_len); ce = zend_lookup_class(classname); zend_string_release(classname); } else { zend_string * classname = zend_string_init(type_name, type_name_len, 0); ce = zend_lookup_class(classname); zend_string_release(classname); } if (ce == NULL) { /* class does not exist */ ce = zend_standard_class_def; } ALLOC_HASHTABLE(ht); zend_hash_init(ht, 1, NULL, NULL, 0); zend_hash_str_update(ht, "_cPtr", sizeof("_cPtr") - 1, &resource); object_and_properties_init(z, ce, ht); } return; } zend_error(E_ERROR, "Type: %s not registered with zend",type->name); } /* This pointer conversion routine takes the native pointer p (along with its type name) and converts it by calling appropriate casting functions according to ty. The resultant pointer is returned, or NULL is returned if the pointer can't be cast. Sadly PHP has no API to find a type name from a type id, only from an instance of a resource of the type id, so we have to pass type_name as well. The two functions which might call this are: SWIG_ConvertResourcePtr which gets the type name from the resource and the registered zend destructors for which we have one per type each with the type name hard wired in. */ static void * SWIG_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty) { swig_cast_info *tc; void *result = 0; if (!ty) { /* They don't care about the target type, so just pass on the pointer! */ return p; } if (! type_name) { /* can't convert p to ptr type ty if we don't know what type p is */ return NULL; } /* convert and cast p from type_name to ptr as ty. */ tc = SWIG_TypeCheck(type_name, ty); if (tc) { int newmemory = 0; result = SWIG_TypeCast(tc, p, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } return result; } /* This function returns a pointer of type ty by extracting the pointer and type info from the resource in z. z must be a resource. If it fails, NULL is returned. It uses SWIG_ConvertResourceData to do the real work. */ static void * SWIG_ConvertResourcePtr(zval *z, swig_type_info *ty, int flags) { swig_object_wrapper *value; void *p; const char *type_name; if (Z_RES_TYPE_P(z) == -1) return NULL; value = (swig_object_wrapper *) Z_RES_VAL_P(z); if (flags & SWIG_POINTER_DISOWN) { value->newobject = 0; } p = value->ptr; type_name=zend_rsrc_list_get_rsrc_type(Z_RES_P(z)); return SWIG_ConvertResourceData(p, type_name, ty); } /* We allow passing of a RESOURCE pointing to the object or an OBJECT whose _cPtr is a resource pointing to the object */ static int SWIG_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags) { if (z == NULL) { *ptr = 0; return 0; } switch (Z_TYPE_P(z)) { case IS_OBJECT: { HashTable * ht = Z_OBJ_HT_P(z)->get_properties(z); if (ht) { zval * _cPtr = zend_hash_str_find(ht, "_cPtr", sizeof("_cPtr") - 1); if (_cPtr) { if (Z_TYPE_P(_cPtr) == IS_INDIRECT) { _cPtr = Z_INDIRECT_P(_cPtr); } if (Z_TYPE_P(_cPtr) == IS_RESOURCE) { *ptr = SWIG_ConvertResourcePtr(_cPtr, ty, flags); return (*ptr == NULL ? -1 : 0); } } } break; } case IS_RESOURCE: *ptr = SWIG_ConvertResourcePtr(z, ty, flags); return (*ptr == NULL ? -1 : 0); case IS_NULL: *ptr = 0; return 0; } return -1; } static char const_name[] = "swig_runtime_data_type_pointer"; static swig_module_info *SWIG_Php_GetModule() { zval *pointer = zend_get_constant_str(const_name, sizeof(const_name) - 1); if (pointer) { if (Z_TYPE_P(pointer) == IS_LONG) { return (swig_module_info *) pointer->value.lval; } } return NULL; } static void SWIG_Php_SetModule(swig_module_info *pointer) { REGISTER_MAIN_LONG_CONSTANT(const_name, (long) pointer, CONST_PERSISTENT | CONST_CS); } swig-3.0.12/Lib/php/std_common.i0000664000175000017500000000044213042756442016246 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; swig-3.0.12/Lib/php/typemaps.i0000664000175000017500000002321713042756442015753 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i. * * SWIG Typemap library for PHP. * * This library provides standard typemaps for modifying SWIG's behavior. * With enough entries in this file, I hope that very few people actually * ever need to write a typemap. * * Define macros to define the following typemaps: * * TYPE *INPUT. Argument is passed in as native variable by value. * TYPE *OUTPUT. Argument is returned as an array from the function call. * TYPE *INOUT. Argument is passed in by value, and out as part of returned list * TYPE *REFERENCE. Argument is passed in as native variable with value * semantics. Variable value is changed with result. * Use like this: * int foo(int *REFERENCE); * * $a = 0; * $rc = foo($a); * * Even though $a looks like it's passed by value, * its value can be changed by foo(). * ----------------------------------------------------------------------------- */ %define BOOL_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ convert_to_boolean(&$input); temp = (Z_TYPE($input) == IS_TRUE); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_BOOL(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ convert_to_boolean($input); lvalue = (Z_TYPE_P($input) == IS_TRUE); $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_BOOL(&$arg, lvalue$argnum ? true : false); %} %enddef %define DOUBLE_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ temp = (TYPE) zval_get_double(&$input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_DOUBLE(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE dvalue), TYPE &REFERENCE (TYPE dvalue) %{ dvalue = (TYPE) zval_get_double(&$input); $1 = &dvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_DOUBLE(&$arg, (double)(lvalue$argnum)); %} %enddef %define INT_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ temp = (TYPE) zval_get_long(&$input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval o; ZVAL_LONG(&o, temp$argnum); t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ lvalue = (TYPE) zval_get_long(&$input); $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ ZVAL_LONG(&$arg, (long)(lvalue$argnum)); %} %enddef BOOL_TYPEMAP(bool); DOUBLE_TYPEMAP(float); DOUBLE_TYPEMAP(double); INT_TYPEMAP(int); INT_TYPEMAP(short); INT_TYPEMAP(long); INT_TYPEMAP(unsigned int); INT_TYPEMAP(unsigned short); INT_TYPEMAP(unsigned long); INT_TYPEMAP(unsigned char); INT_TYPEMAP(signed char); INT_TYPEMAP(long long); %typemap(argout,fragment="t_output_helper") long long *OUTPUT { zval o; if ((long long)LONG_MIN <= temp$argnum && temp$argnum <= (long long)LONG_MAX) { ZVAL_LONG(&o, (long)temp$argnum); } else { char temp[256]; sprintf(temp, "%lld", (long long)temp$argnum); ZVAL_STRING(&o, temp); } t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (long long lvalue) %{ CONVERT_LONG_LONG_IN(lvalue, long long, $input) $1 = &lvalue; %} %typemap(argout) long long *REFERENCE %{ if ((long long)LONG_MIN <= lvalue$argnum && lvalue$argnum <= (long long)LONG_MAX) { ZVAL_LONG(&$arg, (long)temp$argnum); } else { char temp[256]; sprintf(temp, "%lld", (long long)lvalue$argnum); ZVAL_STRING(&$arg, temp); } %} %typemap(argout) long long &OUTPUT %{ if ((long long)LONG_MIN <= *arg$argnum && *arg$argnum <= (long long)LONG_MAX) { ZVAL_LONG($result, (long)(*arg$argnum)); } else { char temp[256]; sprintf(temp, "%lld", (long long)(*arg$argnum)); ZVAL_STRING($result, temp); } %} INT_TYPEMAP(unsigned long long); %typemap(argout,fragment="t_output_helper") unsigned long long *OUTPUT { zval o; if (temp$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG(&o, temp$argnum); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)temp$argnum); ZVAL_STRING(&o, temp); } t_output_helper($result, &o); } %typemap(in) TYPE *REFERENCE (unsigned long long lvalue) %{ CONVERT_UNSIGNED_LONG_LONG_IN(lvalue, unsigned long long, $input) $1 = &lvalue; %} %typemap(argout) unsigned long long *REFERENCE %{ if (lvalue$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG($arg, (long)(lvalue$argnum)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)lvalue$argnum); ZVAL_STRING((*$arg), temp); } %} %typemap(argout) unsigned long long &OUTPUT %{ if (*arg$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG($result, (long)(*arg$argnum)); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*arg$argnum)); ZVAL_STRING($result, temp); } %} %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool &INOUT = bool *INPUT; %typemap(in) float &INOUT = float *INPUT; %typemap(in) double &INOUT = double *INPUT; %typemap(in) int &INOUT = int *INPUT; %typemap(in) short &INOUT = short *INPUT; %typemap(in) long &INOUT = long *INPUT; %typemap(in) long long &INOUT = long long *INPUT; %typemap(in) long long &INPUT = long long *INPUT; %typemap(in) unsigned &INOUT = unsigned *INPUT; %typemap(in) unsigned short &INOUT = unsigned short *INPUT; %typemap(in) unsigned long &INOUT = unsigned long *INPUT; %typemap(in) unsigned char &INOUT = unsigned char *INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long *INPUT; %typemap(in) unsigned long long &INPUT = unsigned long long *INPUT; %typemap(in) signed char &INOUT = signed char *INPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT= double *OUTPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT= long *OUTPUT; %typemap(argout) long long *INOUT= long long *OUTPUT; %typemap(argout) unsigned short *INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool &INOUT = bool *OUTPUT; %typemap(argout) float &INOUT = float *OUTPUT; %typemap(argout) double &INOUT= double *OUTPUT; %typemap(argout) int &INOUT = int *OUTPUT; %typemap(argout) short &INOUT = short *OUTPUT; %typemap(argout) long &INOUT= long *OUTPUT; %typemap(argout) long long &INOUT= long long *OUTPUT; %typemap(argout) unsigned short &INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char &INOUT = signed char *OUTPUT; %typemap(in) char INPUT[ANY] ( char temp[$1_dim0] ) %{ convert_to_string(&$input); strncpy(temp, Z_STRVAL($input), $1_dim0); $1 = temp; %} %typemap(in,numinputs=0) char OUTPUT[ANY] ( char temp[$1_dim0] ) "$1 = temp;"; %typemap(argout,fragment="t_output_helper") char OUTPUT[ANY] { zval o; ZVAL_STRINGL(&o, temp$argnum, $1_dim0); t_output_helper($result, &o); } %typemap(in,numinputs=0) void **OUTPUT (int force), void *&OUTPUT (int force) %{ /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if (SWIG_ConvertPtr(&$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!(Z_ISREF($input) && Z_ISNULL_P(Z_REFVAL($input)))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } %} %typemap(argout) void **OUTPUT, void *&OUTPUT %{ if (force$argnum) { /* pass back arg$argnum through params ($arg) if we can */ if (!Z_ISREF($arg)) { SWIG_PHP_Error(E_WARNING, "Parameter $argnum of $symname wasn't passed by reference"); } else { SWIG_SetPointerZval(*$arg, (void *) ptr$argnum, $*1_descriptor, 1); } } %} swig-3.0.12/Lib/php/std_pair.i0000664000175000017500000000131013042756442015704 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/php/stl.i0000664000175000017500000000054513042756442014712 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/php/const.i0000664000175000017500000000261613042756442015237 0ustar williamwilliam/* ----------------------------------------------------------------------------- * const.i * * Typemaps for constants * ----------------------------------------------------------------------------- */ %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, enum SWIGTYPE "SWIG_LONG_CONSTANT($symname, ($1_type)$value);"; %typemap(consttab) bool "SWIG_BOOL_CONSTANT($symname, ($1_type)$value);"; %typemap(consttab) float, double "SWIG_DOUBLE_CONSTANT($symname, $value);"; %typemap(consttab) char "SWIG_CHAR_CONSTANT($symname, $value);"; %typemap(consttab) char *, const char *, char [], const char [] "SWIG_STRING_CONSTANT($symname, $value);"; %typemap(consttab) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { zend_constant c; SWIG_SetPointerZval(&c.value, (void*)$value, $1_descriptor, 0); zval_copy_ctor(&c.value); c.name = zend_string_init("$symname", sizeof("$symname") - 1, 0); c.flags = CONST_CS; c.module_number = module_number; zend_register_constant(&c); } /* Handled as a global variable. */ %typemap(consttab) SWIGTYPE (CLASS::*) ""; swig-3.0.12/Lib/php/std_string.i0000664000175000017500000000515513042756442016272 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string types * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) string, const string& %{ $1 = (Z_TYPE($input) == IS_STRING) ? 1 : 0; %} %typemap(in) string %{ convert_to_string(&$input); $1.assign(Z_STRVAL($input), Z_STRLEN($input)); %} %typemap(directorout) string %{ if (!EG(exception)) { convert_to_string($input); $result.assign(Z_STRVAL_P($input), Z_STRLEN_P($input)); } %} %typemap(out) string %{ ZVAL_STRINGL($result, $1.data(), $1.size()); %} %typemap(directorin) string, const string& %{ ZVAL_STRINGL($input, $1.data(), $1.size()); %} %typemap(out) const string & %{ ZVAL_STRINGL($result, $1->data(), $1->size()); %} %typemap(throws) string, const string& %{ zend_throw_exception(NULL, $1.c_str(), 0); return; %} %typemap(in) const string & ($*1_ltype temp) %{ convert_to_string(&$input); temp.assign(Z_STRVAL($input), Z_STRLEN($input)); $1 = &temp; %} /* These next two handle a function which takes a non-const reference to * a std::string and modifies the string. */ %typemap(in,byref=1) string & ($*1_ltype temp) %{ { zval * p = Z_ISREF($input) ? Z_REFVAL($input) : &$input; convert_to_string(p); temp.assign(Z_STRVAL_P(p), Z_STRLEN_P(p)); $1 = &temp; } %} %typemap(directorout) string & ($*1_ltype *temp) %{ if (!EG(exception)) { convert_to_string($input); temp = new $*1_ltype(Z_STRVAL_P($input), Z_STRLEN_P($input)); swig_acquire_ownership(temp); $result = temp; } %} %typemap(argout) string & %{ if (Z_ISREF($input)) { ZVAL_STRINGL(Z_REFVAL($input), $1->data(), $1->size()); } %} /* SWIG will apply the non-const typemap above to const string& without * this more specific typemap. */ %typemap(argout) const string & ""; } swig-3.0.12/Lib/php/std_map.i0000664000175000017500000000453513042756442015542 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } bool is_empty() const { return self->empty(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/php/phpinit.swg0000664000175000017500000000125013042756442016125 0ustar williamwilliam /* ------------------------------------------------------------ * The start of the PHP initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" %init %{ SWIG_php_minit { SWIG_InitializeModule(0); %} %fragment("swig_php_init_member_ptr2", "header") %{ #define SWIG_MEMBER_PTR "CLASS::*" static void swig_member_ptr_dtor(zend_resource *res) { efree(res->ptr); } static int swig_member_ptr = 0; %} %fragment("swig_php_init_member_ptr", "init", fragment="swig_php_init_member_ptr2") %{ swig_member_ptr = zend_register_list_destructors_ex(swig_member_ptr_dtor, NULL, SWIG_MEMBER_PTR, module_number); %} swig-3.0.12/Lib/php/factory.i0000664000175000017500000000604513042756442015560 0ustar williamwilliam/* Implement a more natural wrap for factory methods, for example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where circle is a Circle proxy instance. NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); */ /* for loop for macro with one argument */ %define %_formacro_1(macro, arg1,...)macro(arg1) #if #__VA_ARGS__ != "__fordone__" %_formacro_1(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with one argument */ %define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef %define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef /* for loop for macro with two arguments */ %define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) #if #__VA_ARGS__ != "__fordone__" %_formacro_2(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; SWIG_SetPointerZval(return_value, SWIG_as_voidptr(dobj),$descriptor(Type *), $owner); } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { SWIG_SetPointerZval(return_value, SWIG_as_voidptr($1),$descriptor, $owner); } }%enddef swig-3.0.12/Lib/cpointer.i0000664000175000017500000000673713042756442015155 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.i * * SWIG library file containing macros that can be used to manipulate simple * pointer objects. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { #ifdef __cplusplus NAME() { return new TYPE(); } ~NAME() { if ($self) delete $self; } #else NAME() { return (TYPE *) calloc(1,sizeof(TYPE)); } ~NAME() { if ($self) free($self); } #endif } %extend NAME { void assign(TYPE value) { *$self = value; } TYPE value() { return *$self; } TYPE * cast() { return $self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { %} #ifdef __cplusplus %{ return new TYPE(); %} #else %{ return (TYPE *) calloc(1,sizeof(TYPE)); %} #endif %{} static TYPE *copy_##NAME(TYPE value) { %} #ifdef __cplusplus %{ return new TYPE(value); %} #else %{ TYPE *obj = (TYPE *) calloc(1,sizeof(TYPE)); *obj = value; return obj; %} #endif %{} static void delete_##NAME(TYPE *obj) { %} #ifdef __cplusplus %{ if (obj) delete obj; %} #else %{ if (obj) free(obj); %} #endif %{} static void NAME ##_assign(TYPE *obj, TYPE value) { *obj = value; } static TYPE NAME ##_value(TYPE *obj) { return *obj; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *obj); void NAME##_assign(TYPE *obj, TYPE value); TYPE NAME##_value(TYPE *obj); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return (TYPE2) x; } %} %enddef swig-3.0.12/Lib/wchar.i0000664000175000017500000000046513042756442014426 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * ----------------------------------------------------------------------------- */ /* wchar_t not supported, unless otherwise specified in the target language. */ #if defined(SWIG_WCHAR) #undef SWIG_WCHAR #endif swig-3.0.12/Lib/clisp/0000775000175000017500000000000013042756442014255 5ustar williamwilliamswig-3.0.12/Lib/clisp/clisp.swg0000664000175000017500000000163713042756442016120 0ustar williamwilliam/* ----------------------------------------------------------------------------- * clisp.swg * ----------------------------------------------------------------------------- */ /* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_CLISP /* Typespecs for basic types. */ %typemap(in) void "NIL"; %typemap(in) char "character"; %typemap(in) char * "ffi:c-string"; %typemap(in) unsigned char "ffi:uchar"; %typemap(in) signed char "ffi:char"; %typemap(in) short "ffi:short"; %typemap(in) signed short "ffi:short"; %typemap(in) unsigned short "ffi:ushort"; %typemap(in) int "ffi:int"; %typemap(in) signed int "ffi:int"; %typemap(in) unsigned int "ffi:uint"; %typemap(in) long "ffi:long"; %typemap(in) signed long "ffi:long"; %typemap(in) unsigned long "ffi:ulong"; %typemap(in) float "SINGLE-FLOAT"; %typemap(in) double "DOUBLE-FLOAT"; swig-3.0.12/Lib/tcl/0000775000175000017500000000000013042756442013725 5ustar williamwilliamswig-3.0.12/Lib/tcl/std_deque.i0000664000175000017500000000003413042756442016051 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/tclresult.i0000664000175000017500000000125413042756442016122 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclresult.i * ----------------------------------------------------------------------------- */ /* int Tcl_Result Makes the integer return code of a function the return value of a SWIG generated wrapper function. For example : int foo() { ... do stuff ... return TCL_OK; } could be wrapped as follows : %include typemaps.i %apply int Tcl_Result { int foo }; int foo(); */ // If return code is a Tcl_Result, simply pass it on %typemap(out) int Tcl_Result { return $1; } swig-3.0.12/Lib/tcl/cpointer.i0000664000175000017500000000004113042756442015715 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/tcl8.swg0000664000175000017500000000273413042756442015327 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tcl8.swg * * Tcl configuration module. * ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Tcl keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Tcl initialization function * ------------------------------------------------------------ */ %include swig-3.0.12/Lib/tcl/tclmacros.swg0000664000175000017500000000004613042756442016436 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/tclprimtypes.swg0000664000175000017500000001327213042756442017213 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { %define_as(SWIG_From_dec(bool), Tcl_NewBooleanObj) } %fragment(SWIG_AsVal_frag(bool),"header") { SWIGINTERN int SWIG_AsVal_dec(bool)(Tcl_Obj *obj, bool *val) { int v; if (Tcl_GetBooleanFromObj(0, obj, &v) == TCL_OK) { if (val) *val = v ? true : false; return SWIG_OK; } return SWIG_TypeError; } } /* long */ %fragment(SWIG_From_frag(long),"header", fragment="") { SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(long)(long value) { if (((long) INT_MIN <= value) && (value <= (long) INT_MAX)) { return Tcl_NewIntObj(%numeric_cast(value,int)); } else { return Tcl_NewLongObj(value); } } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERN int SWIG_AsVal_dec(long)(Tcl_Obj *obj, long* val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = (long) v; return SWIG_OK; } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long), fragment="") { SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(unsigned long)(unsigned long value) { if (value < (unsigned long) LONG_MAX) { return SWIG_From(long)(%numeric_cast(value, long)); } else { char temp[256]; sprintf(temp, "%lu", value); return Tcl_NewStringObj(temp,-1); } } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(Tcl_Obj *obj, unsigned long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (v >= 0) { if (val) *val = (unsigned long) v; return SWIG_OK; } /* If v is negative, then this could be a negative number, or an unsigned value which doesn't fit in a signed long, so try to get it as a string so we can distinguish these cases. */ } { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; unsigned long v; if (*nptr == '-') return SWIG_OverflowError; errno = 0; v = strtoul(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if (v == ULONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(long long)(long long value) { if (((long long) LONG_MIN <= value) && (value <= (long long) LONG_MAX)) { return SWIG_From(long)(%numeric_cast(value,long)); } else { char temp[256]; sprintf(temp, "%lld", value); return Tcl_NewStringObj(temp,-1); } } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(Tcl_Obj *obj, long long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = v; return SWIG_OK; } else { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; long long v; errno = 0; v = strtoll(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if ((v == LLONG_MAX || v == LLONG_MIN) && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE Tcl_Obj* SWIG_From_dec(unsigned long long)(unsigned long long value) { if (value < (unsigned long long) LONG_MAX) { return SWIG_From(long long)(%numeric_cast(value, long long)); } else { char temp[256]; sprintf(temp, "%llu", value); return Tcl_NewStringObj(temp,-1); } } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(Tcl_Obj *obj, unsigned long long *val) { long v; if (Tcl_GetLongFromObj(0,obj, &v) == TCL_OK) { if (val) *val = (unsigned long) v; return SWIG_OK; } else { int len = 0; const char *nptr = Tcl_GetStringFromObj(obj, &len); if (nptr && len > 0) { char *endptr; unsigned long long v; if (*nptr == '-') return SWIG_OverflowError; errno = 0; v = strtoull(nptr, &endptr,0); if (nptr[0] == '\0' || *endptr != '\0') return SWIG_TypeError; if (v == ULLONG_MAX && errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_OK; } } } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From(double), Tcl_NewDoubleObj) } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(Tcl_Obj *obj, double *val) { double v; if (Tcl_GetDoubleFromObj(0, obj, &v) == TCL_OK) { if (val) *val = v; return SWIG_OK; } return SWIG_TypeError; } } swig-3.0.12/Lib/tcl/std_vector.i0000664000175000017500000003641413042756442016263 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Tcl as much as possible, namely, to allow the user to pass and // be returned Tcl lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector< T >), f(const std::vector< T >&), f(const std::vector< T >*): // the parameter being read-only, either a Tcl list or a // previously wrapped std::vector< T > can be passed. // -- f(std::vector< T >&), f(std::vector< T >*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector< T > f(): // the vector is returned by copy; therefore, a Tcl list of T:s // is returned which is most easily used in other Tcl functions procs // -- std::vector< T >& f(), std::vector< T >* f(), const std::vector< T >& f(), // const std::vector< T >* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %fragment(""); %fragment(""); %fragment(""); %{ #include Tcl_Obj* SwigString_FromString(const std::string &s) { return Tcl_NewStringObj(s.data(), (int)s.length()); } int Tcl_GetBoolFromObj(Tcl_Interp *interp, Tcl_Obj *o, bool *val) { int v; int res = Tcl_GetBooleanFromObj(interp, o, &v); if (res == TCL_OK) { *val = v ? true : false; } return res; } int SwigString_AsString(Tcl_Interp *interp, Tcl_Obj *o, std::string *val) { int len; const char* temp = Tcl_GetStringFromObj(o, &len); if (temp == NULL) return TCL_ERROR; val->assign(temp, len); return TCL_OK; } // behaviour of this is such as the real Tcl_GetIntFromObj template int SwigInt_As(Tcl_Interp *interp, Tcl_Obj *o, Type *val) { int temp_val, return_val; return_val = Tcl_GetIntFromObj(interp, o, &temp_val); *val = (Type) temp_val; return return_val; } // behaviour of this is such as the real Tcl_GetDoubleFromObj template int SwigDouble_As(Tcl_Interp *interp, Tcl_Obj *o, Type *val) { int return_val; double temp_val; return_val = Tcl_GetDoubleFromObj(interp, o, &temp_val); *val = (Type) temp_val; return return_val; } %} // exported class namespace std { template class vector { %typemap(in) vector< T > (std::vector< T > *v) { Tcl_Obj **listobjv; int nitems; int i; T* temp; if (SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0){ $1 = *v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, \ &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; $1 = std::vector< T >(); for (i = 0; i < nitems; i++) { if ((SWIG_ConvertPtr(listobjv[i],(void **) &temp, $descriptor(T *),0)) != 0) { char message[] = "list of " #T " expected"; Tcl_SetResult(interp, message, TCL_VOLATILE); return TCL_ERROR; } $1.push_back(*temp); } } } %typemap(in) const vector< T >* (std::vector< T > *v, std::vector< T > w), const vector< T >& (std::vector< T > *v, std::vector< T > w) { Tcl_Obj **listobjv; int nitems; int i; T* temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { $1 = v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; w = std::vector< T >(); for (i = 0; i < nitems; i++) { if ((SWIG_ConvertPtr(listobjv[i],(void **) &temp, $descriptor(T *),0)) != 0) { char message[] = "list of " #T " expected"; Tcl_SetResult(interp, message, TCL_VOLATILE); return TCL_ERROR; } w.push_back(*temp); } $1 = &w; } } %typemap(out) vector< T > { for (unsigned int i=0; i<$1.size(); i++) { T* ptr = new T((($1_type &)$1)[i]); Tcl_ListObjAppendElement(interp, $result, \ SWIG_NewInstanceObj(ptr, $descriptor(T *), 0)); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector< T > { Tcl_Obj **listobjv; int nitems; T* temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type else if ((SWIG_ConvertPtr(listobjv[0], (void **) &temp, $descriptor(T *),0)) != 0) $1 = 0; else $1 = 1; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector< T >&, const vector< T >* { Tcl_Obj **listobjv; int nitems; T* temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type else if ((SWIG_ConvertPtr(listobjv[0], (void **) &temp, $descriptor(T *),0)) != 0) $1 = 0; else $1 = 1; } } public: vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector< T > &); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && i class vector< T > { %typemap(in) vector< T > (std::vector< T > *v){ Tcl_Obj **listobjv; int nitems; int i; T temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0) { $1 = *v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; $1 = std::vector< T >(); for (i = 0; i < nitems; i++) { if (CONVERT_FROM(interp, listobjv[i], &temp) == TCL_ERROR) return TCL_ERROR; $1.push_back(temp); } } } %typemap(in) const vector< T >& (std::vector< T > *v,std::vector< T > w), const vector< T >* (std::vector< T > *v,std::vector< T > w) { Tcl_Obj **listobjv; int nitems; int i; T temp; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0) { $1 = v; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) return TCL_ERROR; w = std::vector< T >(); for (i = 0; i < nitems; i++) { if (CONVERT_FROM(interp, listobjv[i], &temp) == TCL_ERROR) return TCL_ERROR; w.push_back(temp); } $1 = &w; } } %typemap(out) vector< T > { for (unsigned int i=0; i<$1.size(); i++) { Tcl_ListObjAppendElement(interp, $result, \ CONVERT_TO((($1_type &)$1)[i])); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector< T > { Tcl_Obj **listobjv; int nitems; T temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $&1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type if (CONVERT_FROM(interp, listobjv[0], &temp) == TCL_ERROR) $1 = 0; else $1 = 1; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector< T >&, const vector< T >*{ Tcl_Obj **listobjv; int nitems; T temp; std::vector< T > *v; if(SWIG_ConvertPtr($input, (void **) &v, \ $1_descriptor, 0) == 0){ /* wrapped vector */ $1 = 1; } else { // It isn't a vector< T > so it should be a list of T's if(Tcl_ListObjGetElements(interp, $input, &nitems, &listobjv) == TCL_ERROR) $1 = 0; else if (nitems == 0) $1 = 1; //check the first value to see if it is of correct type if (CONVERT_FROM(interp, listobjv[0], &temp) == TCL_ERROR) $1 = 0; else $1 = 1; } } public: vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector< T > &); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && i,Tcl_NewIntObj); specialize_std_vector(int, Tcl_GetIntFromObj,Tcl_NewIntObj); specialize_std_vector(short, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(long, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned char, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned int, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned short, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(unsigned long, SwigInt_As, Tcl_NewIntObj); specialize_std_vector(double, Tcl_GetDoubleFromObj, Tcl_NewDoubleObj); specialize_std_vector(float, SwigDouble_As, Tcl_NewDoubleObj); specialize_std_vector(std::string, SwigString_AsString, SwigString_FromString); } swig-3.0.12/Lib/tcl/Makefile.in0000664000175000017500000000704713042756442016002 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Tcl Makefile # # This file can be used to build various Tcl extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. However, you # may need to modify the Makefile to reflect your specific # application. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = my_tclsh # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -tcl # use -tcl8 for Tcl 8.0 SWIGCC = $(CC) # SWIG Library files. Uncomment if rebuilding tclsh #SWIGLIBS = -ltclsh.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Tcl installation (where is Tcl located) TCL_INCLUDE = @TCLINCLUDE@ TCL_LIB = @TCLLIB@ # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options (uncomment only one of these) BUILD_LIBS = $(LIBS) # Dynamic loading #BUILD_LIBS = $(TCL_LIB) -ltcl $(LIBS) $(SYSLIBS) # tclsh # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(WRAPFILE) $(INCLUDES) $(TCL_INCLUDE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-3.0.12/Lib/tcl/cwstring.i0000664000175000017500000000007413042756442015740 0ustar williamwilliam%include %include swig-3.0.12/Lib/tcl/cni.i0000664000175000017500000000005213042756442014645 0ustar williamwilliam%include %include swig-3.0.12/Lib/tcl/std_wstring.i0000664000175000017500000000007713042756442016452 0ustar williamwilliam%include %include swig-3.0.12/Lib/tcl/tclruntime.swg0000664000175000017500000000074413042756442016642 0ustar williamwilliam/* tcl.h has to appear first */ %insert(runtime) %{ #include #include #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* Common C API type-checking code */ %insert(runtime) "swigerrors.swg" /* SWIG errors */ %insert(runtime) "tclerrors.swg"; /* Tcl Errors */ %insert(runtime) "tclapi.swg"; /* Tcl API */ %insert(runtime) "tclrun.swg"; /* Tcl run-time code */ swig-3.0.12/Lib/tcl/attribute.i0000664000175000017500000000004213042756442016076 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/cmalloc.i0000664000175000017500000000004013042756442015503 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/tclstrings.swg0000664000175000017500000000143113042756442016642 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header") { SWIGINTERN int SWIG_AsCharPtrAndSize(Tcl_Obj *obj, char** cptr, size_t* psize, int *alloc) { int len = 0; char *cstr = Tcl_GetStringFromObj(obj, &len); if (cstr) { if (cptr) *cptr = cstr; if (psize) *psize = len + 1; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header", fragment="") { SWIGINTERNINLINE Tcl_Obj * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { return (size < INT_MAX) ? Tcl_NewStringObj(carray, %numeric_cast(size,int)) : NULL; } } swig-3.0.12/Lib/tcl/tclkw.swg0000664000175000017500000000036713042756442015601 0ustar williamwilliam#ifndef TCL_TCLKW_SWG_ #define TCL_TCLKW_SWG_ // Some special reserved words in classes %keywordwarn("cget is a tcl reserved method name") *::cget; %keywordwarn("configure is a tcl reserved method name") *::configure; #endif //_TCL_TCLKW_SWG_ swig-3.0.12/Lib/tcl/tclsh.i0000664000175000017500000000351713042756442015222 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclsh.i * * SWIG File for building new tclsh program * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "tclsh.i" %text %{ This module provides the Tcl_AppInit() function needed to build a new version of the tclsh executable. This file should not be used when using dynamic loading. To make an interface file work with both static and dynamic loading, put something like this in your interface file : #ifdef STATIC %include #endif %} #endif %{ /* A TCL_AppInit() function that lets you build a new copy * of tclsh. * * The macro SWIG_init contains the name of the initialization * function in the wrapper file. */ #ifndef SWIG_RcFileName char *SWIG_RcFileName = "~/.myapprc"; #endif #ifdef MAC_TCL extern int MacintoshInit _ANSI_ARGS_((void)); #endif int Tcl_AppInit(Tcl_Interp *interp){ if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR; /* Now initialize our functions */ if (SWIG_init(interp) == TCL_ERROR) return TCL_ERROR; #if TCL_MAJOR_VERSION > 7 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 5 Tcl_SetVar(interp, (char *) "tcl_rcFileName",SWIG_RcFileName,TCL_GLOBAL_ONLY); #else tcl_RcFileName = SWIG_RcFileName; #endif #ifdef SWIG_RcRsrcName Tcl_SetVar(interp, (char *) "tcl_rcRsrcName",SWIG_RcRsrcName,TCL_GLOBAL); #endif return TCL_OK; } #if TCL_MAJOR_VERSION > 7 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 4 int main(int argc, char **argv) { #ifdef MAC_TCL char *newArgv[2]; if (MacintoshInit() != TCL_OK) { Tcl_Exit(1); } argc = 1; newArgv[0] = "tclsh"; newArgv[1] = NULL; argv = newArgv; #endif Tcl_Main(argc, argv, Tcl_AppInit); return(0); } #else extern int main(); #endif %} swig-3.0.12/Lib/tcl/tclfragments.swg0000664000175000017500000000105313042756442017137 0ustar williamwilliam/* Create a file with this name, 'tclfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(int)(TclObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-3.0.12/Lib/tcl/std_common.i0000664000175000017500000000072313042756442016243 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %types(std::size_t); %apply size_t { std::size_t }; %apply const unsigned long& { const std::size_t& }; %types(std::ptrdiff_t); %apply long { std::ptrdiff_t }; %apply const long& { const std::ptrdiff_t& }; swig-3.0.12/Lib/tcl/std_except.i0000664000175000017500000000004313042756442016236 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/tclrun.swg0000664000175000017500000005327413042756442015771 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclrun.swg * * This file contains the runtime support for Tcl modules and includes * code for managing global variables and pointer type checking. * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_Tcl_ConvertPtr(interp, oc, ptr, ty, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Tcl_NewPointerObj(ptr, type, flags) /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp, obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_Tcl_NewInstanceObj(interp, thisvalue, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Tcl_ConvertPtr(interp, obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Tcl_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Tcl_ConvertPacked(interp,obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Tcl_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Tcl_GetModule((Tcl_Interp *) (clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_Tcl_SetModule((Tcl_Interp *) (clientdata), pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Tcl_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Tcl_SetErrorMsg(interp, SWIG_Tcl_ErrorType(code), msg) #define SWIG_fail goto fail /* Tcl-specific SWIG API */ #define SWIG_Acquire(ptr) SWIG_Tcl_Acquire(ptr) #define SWIG_MethodCommand SWIG_Tcl_MethodCommand #define SWIG_Disown(ptr) SWIG_Tcl_Disown(ptr) #define SWIG_ConvertPtrFromString(c, ptr, ty, flags) SWIG_Tcl_ConvertPtrFromString(interp, c, ptr, ty, flags) #define SWIG_MakePtr(c, ptr, ty, flags) SWIG_Tcl_MakePtr(c, ptr, ty, flags) #define SWIG_PointerTypeFromString(c) SWIG_Tcl_PointerTypeFromString(c) #define SWIG_GetArgs SWIG_Tcl_GetArgs #define SWIG_GetConstantObj(key) SWIG_Tcl_GetConstantObj(key) #define SWIG_ObjectConstructor SWIG_Tcl_ObjectConstructor #define SWIG_Thisown(ptr) SWIG_Tcl_Thisown(ptr) #define SWIG_ObjectDelete SWIG_Tcl_ObjectDelete #define SWIG_TCL_DECL_ARGS_2(arg1, arg2) (Tcl_Interp *interp SWIGUNUSED, arg1, arg2) #define SWIG_TCL_CALL_ARGS_2(arg1, arg2) (interp, arg1, arg2) /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_GetConstant SWIG_GetConstantObj #define SWIG_Tcl_GetConstant SWIG_Tcl_GetConstantObj #if TCL_MAJOR_VERSION >= 8 && TCL_MINOR_VERSION >= 5 #define SWIG_TCL_HASHTABLE_INIT {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} #else #define SWIG_TCL_HASHTABLE_INIT {0} #endif #include "assert.h" #ifdef __cplusplus extern "C" { #endif /* Object support */ SWIGRUNTIME Tcl_HashTable* SWIG_Tcl_ObjectTable(void) { static Tcl_HashTable swigobjectTable; static int swigobjectTableinit = 0; if (!swigobjectTableinit) { Tcl_InitHashTable(&swigobjectTable, TCL_ONE_WORD_KEYS); swigobjectTableinit = 1; } return &swigobjectTable; } /* Acquire ownership of a pointer */ SWIGRUNTIME void SWIG_Tcl_Acquire(void *ptr) { int newobj; Tcl_CreateHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr, &newobj); } SWIGRUNTIME int SWIG_Tcl_Thisown(void *ptr) { if (Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr)) { return 1; } return 0; } /* Disown a pointer. Returns 1 if we owned it to begin with */ SWIGRUNTIME int SWIG_Tcl_Disown(void *ptr) { Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(SWIG_Tcl_ObjectTable(), (char *) ptr); if (entryPtr) { Tcl_DeleteHashEntry(entryPtr); return 1; } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Tcl_ConvertPtrFromString(Tcl_Interp *interp, const char *c, void **ptr, swig_type_info *ty, int flags) { swig_cast_info *tc; /* Pointer values must start with leading underscore */ while (*c != '_') { *ptr = (void *) 0; if (strcmp(c,"NULL") == 0) return SWIG_OK; /* Empty string: not a pointer */ if (*c == 0) return SWIG_ERROR; /* Hmmm. It could be an object name. */ /* Check if this is a command at all. Prevents cget -this */ /* from being called when c is not a command, firing the unknown proc */ if (Tcl_VarEval(interp,"info commands ", c, (char *) NULL) == TCL_OK) { Tcl_Obj *result = Tcl_GetObjResult(interp); if (*(Tcl_GetStringFromObj(result, NULL)) == 0) { /* It's not a command, so it can't be a pointer */ Tcl_ResetResult(interp); return SWIG_ERROR; } } else { /* This will only fail if the argument is multiple words. */ /* Multiple words are also not commands. */ Tcl_ResetResult(interp); return SWIG_ERROR; } /* Check if this is really a SWIG pointer */ if (Tcl_VarEval(interp,c," cget -this", (char *) NULL) != TCL_OK) { Tcl_ResetResult(interp); return SWIG_ERROR; } c = Tcl_GetStringFromObj(Tcl_GetObjResult(interp), NULL); } c++; c = SWIG_UnpackData(c,ptr,sizeof(void *)); if (ty) { tc = c ? SWIG_TypeCheck(c,ty) : 0; if (!tc) { return SWIG_ERROR; } if (flags & SWIG_POINTER_DISOWN) { SWIG_Disown((void *) *ptr); } { int newmemory = 0; *ptr = SWIG_TypeCast(tc,(void *) *ptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } } return SWIG_OK; } /* Convert a pointer value */ SWIGRUNTIMEINLINE int SWIG_Tcl_ConvertPtr(Tcl_Interp *interp, Tcl_Obj *oc, void **ptr, swig_type_info *ty, int flags) { return SWIG_Tcl_ConvertPtrFromString(interp, Tcl_GetStringFromObj(oc,NULL), ptr, ty, flags); } /* Convert a pointer value */ SWIGRUNTIME char * SWIG_Tcl_PointerTypeFromString(char *c) { char d; /* Pointer values must start with leading underscore. NULL has no type */ if (*c != '_') { return 0; } c++; /* Extract hex value from pointer */ while ((d = *c)) { if (!(((d >= '0') && (d <= '9')) || ((d >= 'a') && (d <= 'f')))) break; c++; } return c; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Tcl_ConvertPacked(Tcl_Interp *SWIGUNUSEDPARM(interp) , Tcl_Obj *obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c; if (!obj) goto type_error; c = Tcl_GetStringFromObj(obj,NULL); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) goto type_error; } return SWIG_OK; type_error: return SWIG_ERROR; } /* Take a pointer and convert it to a string */ SWIGRUNTIME void SWIG_Tcl_MakePtr(char *c, void *ptr, swig_type_info *ty, int SWIGUNUSEDPARM(flags)) { if (ptr) { *(c++) = '_'; c = SWIG_PackData(c,&ptr,sizeof(void *)); strcpy(c,ty->name); } else { strcpy(c,"NULL"); } } /* Create a new pointer object */ SWIGRUNTIMEINLINE Tcl_Obj * SWIG_Tcl_NewPointerObj(void *ptr, swig_type_info *type, int flags) { Tcl_Obj *robj; char result[SWIG_BUFFER_SIZE]; SWIG_MakePtr(result,ptr,type,flags); robj = Tcl_NewStringObj(result,-1); return robj; } SWIGRUNTIME Tcl_Obj * SWIG_Tcl_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,type->name); return Tcl_NewStringObj(result,-1); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ SWIGRUNTIME swig_module_info * SWIG_Tcl_GetModule(Tcl_Interp *interp) { const char *data; swig_module_info *ret = 0; /* first check if pointer already created */ data = Tcl_GetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TCL_GLOBAL_ONLY); if (data) { SWIG_UnpackData(data, &ret, sizeof(swig_type_info **)); } return ret; } SWIGRUNTIME void SWIG_Tcl_SetModule(Tcl_Interp *interp, swig_module_info *module) { char buf[SWIG_BUFFER_SIZE]; char *data; /* create a new pointer */ data = SWIG_PackData(buf, &module, sizeof(swig_type_info **)); *data = 0; Tcl_SetVar(interp, (char *)"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, buf, TCL_GLOBAL_ONLY); } /* -----------------------------------------------------------------------------* * Object auxiliaries * -----------------------------------------------------------------------------*/ SWIGRUNTIME void SWIG_Tcl_ObjectDelete(ClientData clientData) { swig_instance *si = (swig_instance *) clientData; if (!si) return; if (si->destroy && SWIG_Disown(si->thisvalue)) { if (si->classptr->destructor) { (si->classptr->destructor)(si->thisvalue); } } Tcl_DecrRefCount(si->thisptr); free(si); } /* Function to invoke object methods given an instance */ SWIGRUNTIME int SWIG_Tcl_MethodCommand(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST _objv[]) { char *method, *attrname; swig_instance *inst = (swig_instance *) clientData; swig_method *meth; swig_attribute *attr; Tcl_Obj *oldarg; Tcl_Obj **objv; int rcode; swig_class *cls; swig_class *cls_stack[64]; int cls_stack_bi[64]; int cls_stack_top = 0; int numconf = 2; int bi; objv = (Tcl_Obj **) _objv; if (objc < 2) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } method = Tcl_GetStringFromObj(objv[1],NULL); if (strcmp(method,"-acquire") == 0) { inst->destroy = 1; SWIG_Acquire(inst->thisvalue); return TCL_OK; } if (strcmp(method,"-disown") == 0) { if (inst->destroy) { SWIG_Disown(inst->thisvalue); } inst->destroy = 0; return TCL_OK; } if (strcmp(method,"-delete") == 0) { Tcl_DeleteCommandFromToken(interp,inst->cmdtok); return TCL_OK; } cls_stack[cls_stack_top] = inst->classptr; cls_stack_bi[cls_stack_top] = -1; while (1) { Tcl_HashEntry* hashentry; bi = cls_stack_bi[cls_stack_top]; cls = cls_stack[cls_stack_top]; if (bi != -1) { if (!cls->bases[bi] && cls->base_names[bi]) { /* lookup and cache the base class */ swig_type_info *info = SWIG_TypeQueryModule(cls->module, cls->module, cls->base_names[bi]); if (info) cls->bases[bi] = (swig_class *) info->clientdata; } cls = cls->bases[bi]; if (cls) { cls_stack_bi[cls_stack_top]++; cls_stack_top++; cls_stack[cls_stack_top] = cls; cls_stack_bi[cls_stack_top] = -1; continue; } } if (!cls) { cls_stack_top--; if (cls_stack_top < 0) break; else continue; } cls_stack_bi[cls_stack_top]++; hashentry = Tcl_FindHashEntry(&(cls->hashtable), method); if (hashentry) { ClientData cd = Tcl_GetHashValue(hashentry); swig_wrapper method_wrapper = (swig_wrapper)cd; oldarg = objv[1]; objv[1] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (method_wrapper)(clientData,interp,objc,objv); objv[1] = oldarg; Tcl_DecrRefCount(inst->thisptr); return rcode; } /* Check class methods for a match */ if (strcmp(method,"cget") == 0) { if (objc < 3) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } attrname = Tcl_GetStringFromObj(objv[2],NULL); attr = cls->attributes; while (attr && attr->name) { if ((strcmp(attr->name, attrname) == 0) && (attr->getmethod)) { oldarg = objv[1]; objv[1] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (*attr->getmethod)(clientData,interp,2, objv); objv[1] = oldarg; Tcl_DecrRefCount(inst->thisptr); return rcode; } attr++; } if (strcmp(attrname, "-this") == 0) { Tcl_SetObjResult(interp, Tcl_DuplicateObj(inst->thisptr)); return TCL_OK; } if (strcmp(attrname, "-thisown") == 0) { if (SWIG_Thisown(inst->thisvalue)) { Tcl_SetResult(interp,(char*)"1",TCL_STATIC); } else { Tcl_SetResult(interp,(char*)"0",TCL_STATIC); } return TCL_OK; } } else if (strcmp(method, "configure") == 0) { int i; if (objc < 4) { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } i = 2; while (i < objc) { attrname = Tcl_GetStringFromObj(objv[i],NULL); attr = cls->attributes; while (attr && attr->name) { if ((strcmp(attr->name, attrname) == 0) && (attr->setmethod)) { oldarg = objv[i]; objv[i] = inst->thisptr; Tcl_IncrRefCount(inst->thisptr); rcode = (*attr->setmethod)(clientData,interp,3, &objv[i-1]); objv[i] = oldarg; Tcl_DecrRefCount(inst->thisptr); if (rcode != TCL_OK) return rcode; numconf += 2; } attr++; } i+=2; } } } if (strcmp(method,"configure") == 0) { if (numconf >= objc) { return TCL_OK; } else { Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); return TCL_ERROR; } } if (strcmp(method,"cget") == 0) { Tcl_SetResult(interp,(char *) "Invalid attribute name.", TCL_STATIC); return TCL_ERROR; } Tcl_SetResult(interp, (char *) "Invalid method. Must be one of: configure cget -acquire -disown -delete", TCL_STATIC); cls = inst->classptr; bi = 0; while (cls) { meth = cls->methods; while (meth && meth->name) { char *cr = (char *) Tcl_GetStringResult(interp); size_t meth_len = strlen(meth->name); char* where = strchr(cr,':'); while(where) { where = strstr(where, meth->name); if(where) { if(where[-1] == ' ' && (where[meth_len] == ' ' || where[meth_len]==0)) { break; } else { where++; } } } if (!where) Tcl_AppendElement(interp, (char *) meth->name); meth++; } cls = inst->classptr->bases[bi++]; } return TCL_ERROR; } /* This function takes the current result and turns it into an object command */ SWIGRUNTIME Tcl_Obj * SWIG_Tcl_NewInstanceObj(Tcl_Interp *interp, void *thisvalue, swig_type_info *type, int flags) { Tcl_Obj *robj = SWIG_NewPointerObj(thisvalue, type,0); /* Check to see if this pointer belongs to a class or not */ if (thisvalue && (type->clientdata) && (interp)) { Tcl_CmdInfo ci; char *name; name = Tcl_GetStringFromObj(robj,NULL); if (!Tcl_GetCommandInfo(interp,name, &ci) || (flags)) { swig_instance *newinst = (swig_instance *) malloc(sizeof(swig_instance)); newinst->thisptr = Tcl_DuplicateObj(robj); Tcl_IncrRefCount(newinst->thisptr); newinst->thisvalue = thisvalue; newinst->classptr = (swig_class *) type->clientdata; newinst->destroy = flags; newinst->cmdtok = Tcl_CreateObjCommand(interp, Tcl_GetStringFromObj(robj,NULL), (swig_wrapper_func) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); if (flags) { SWIG_Acquire(thisvalue); } } } return robj; } /* Function to create objects */ SWIGRUNTIME int SWIG_Tcl_ObjectConstructor(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Obj *newObj = 0; void *thisvalue = 0; swig_instance *newinst = 0; swig_class *classptr = (swig_class *) clientData; swig_wrapper cons = 0; char *name = 0; int firstarg = 0; int thisarg = 0; int destroy = 1; if (!classptr) { Tcl_SetResult(interp, (char *) "swig: internal runtime error. No class object defined.", TCL_STATIC); return TCL_ERROR; } cons = classptr->constructor; if (objc > 1) { char *s = Tcl_GetStringFromObj(objv[1],NULL); if (strcmp(s,"-this") == 0) { thisarg = 2; cons = 0; } else if (strcmp(s,"-args") == 0) { firstarg = 1; } else if (objc == 2) { firstarg = 1; name = s; } else if (objc >= 3) { char *s1; name = s; s1 = Tcl_GetStringFromObj(objv[2],NULL); if (strcmp(s1,"-this") == 0) { thisarg = 3; cons = 0; } else { firstarg = 1; } } } if (cons) { int result; result = (*cons)(0, interp, objc-firstarg, &objv[firstarg]); if (result != TCL_OK) { return result; } newObj = Tcl_DuplicateObj(Tcl_GetObjResult(interp)); if (!name) name = Tcl_GetStringFromObj(newObj,NULL); } else if (thisarg > 0) { if (thisarg < objc) { destroy = 0; newObj = Tcl_DuplicateObj(objv[thisarg]); if (!name) name = Tcl_GetStringFromObj(newObj,NULL); } else { Tcl_SetResult(interp, (char *) "wrong # args.", TCL_STATIC); return TCL_ERROR; } } else { Tcl_SetResult(interp, (char *) "No constructor available.", TCL_STATIC); return TCL_ERROR; } if (SWIG_Tcl_ConvertPtr(interp,newObj, (void **) &thisvalue, *(classptr->type), 0) != SWIG_OK) { Tcl_DecrRefCount(newObj); return TCL_ERROR; } newinst = (swig_instance *) malloc(sizeof(swig_instance)); newinst->thisptr = newObj; Tcl_IncrRefCount(newObj); newinst->thisvalue = thisvalue; newinst->classptr = classptr; newinst->destroy = destroy; if (destroy) { SWIG_Acquire(thisvalue); } newinst->cmdtok = Tcl_CreateObjCommand(interp,name, (swig_wrapper) SWIG_MethodCommand, (ClientData) newinst, (swig_delete_func) SWIG_ObjectDelete); return TCL_OK; } /* -----------------------------------------------------------------------------* * Get arguments * -----------------------------------------------------------------------------*/ SWIGRUNTIME int SWIG_Tcl_GetArgs(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[], const char *fmt, ...) { int argno = 0, opt = 0; long tempi; double tempd; const char *c; va_list ap; void *vptr; Tcl_Obj *obj = 0; swig_type_info *ty; va_start(ap,fmt); for (c = fmt; (*c && (*c != ':') && (*c != ';')); c++,argno++) { if (*c == '|') { opt = 1; c++; } if (argno >= (objc-1)) { if (!opt) { Tcl_SetResult(interp, (char *) "Wrong number of arguments ", TCL_STATIC); goto argerror; } else { va_end(ap); return TCL_OK; } } vptr = va_arg(ap,void *); if (vptr) { if (isupper(*c)) { obj = SWIG_Tcl_GetConstantObj(Tcl_GetStringFromObj(objv[argno+1],0)); if (!obj) obj = objv[argno+1]; } else { obj = objv[argno+1]; } switch(*c) { case 'i': case 'I': case 'l': case 'L': case 'h': case 'H': case 'b': case 'B': if (Tcl_GetLongFromObj(interp,obj,&tempi) != TCL_OK) goto argerror; if ((*c == 'i') || (*c == 'I')) *((int *)vptr) = (int)tempi; else if ((*c == 'l') || (*c == 'L')) *((long *)vptr) = (long)tempi; else if ((*c == 'h') || (*c == 'H')) *((short*)vptr) = (short)tempi; else if ((*c == 'b') || (*c == 'B')) *((unsigned char *)vptr) = (unsigned char)tempi; break; case 'f': case 'F': case 'd': case 'D': if (Tcl_GetDoubleFromObj(interp,obj,&tempd) != TCL_OK) goto argerror; if ((*c == 'f') || (*c == 'F')) *((float *) vptr) = (float)tempd; else if ((*c == 'd') || (*c == 'D')) *((double*) vptr) = tempd; break; case 's': case 'S': if (*(c+1) == '#') { int *vlptr = (int *) va_arg(ap, void *); *((char **) vptr) = Tcl_GetStringFromObj(obj, vlptr); c++; } else { *((char **)vptr) = Tcl_GetStringFromObj(obj,NULL); } break; case 'c': case 'C': *((char *)vptr) = *(Tcl_GetStringFromObj(obj,NULL)); break; case 'p': case 'P': ty = (swig_type_info *) va_arg(ap, void *); if (SWIG_Tcl_ConvertPtr(interp, obj, (void **) vptr, ty, 0) != SWIG_OK) goto argerror; break; case 'o': case 'O': *((Tcl_Obj **)vptr) = objv[argno+1]; break; default: break; } } } if ((*c != ';') && ((objc-1) > argno)) { Tcl_SetResult(interp, (char *) "Wrong # args.", TCL_STATIC); goto argerror; } va_end(ap); return TCL_OK; argerror: { char temp[32]; sprintf(temp,"%d", argno+1); c = strchr(fmt,':'); if (!c) c = strchr(fmt,';'); if (!c) c = (char *)""; Tcl_AppendResult(interp,c," argument ", temp, NULL); va_end(ap); return TCL_ERROR; } } #ifdef __cplusplus } #endif swig-3.0.12/Lib/tcl/tclopers.swg0000664000175000017500000000275013042756442016306 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclopers.swg * * C++ overloaded operators. * * These declarations define how SWIG is going to rename C++ * overloaded operators in Tcl. Since Tcl allows identifiers * to be essentially any valid string, we'll just use the * normal operator names. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus %rename("+") *::operator+; //%rename("u+") *::operator+(); // Unary + //%rename("u+") *::operator+() const; // Unary + %rename("-") *::operator-; //%rename("u-") *::operator-(); // Unary - //%rename("u-") *::operator-() const; // Unary - %rename("*") *::operator*; %rename("/") *::operator/; %rename("<<") *::operator<<; %rename(">>") *::operator>>; %rename("&") *::operator&; %rename("|") *::operator|; %rename("^") *::operator^; %rename("%") *::operator%; %rename("=") *::operator=; /* Ignored operators */ %ignoreoperator(NOTEQUAL) operator!=; %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; #endif swig-3.0.12/Lib/tcl/tclinterp.i0000664000175000017500000000115113042756442016101 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclinterp.i * * Tcl_Interp *interp * * Passes the current Tcl_Interp value directly to a C function. * This can be used to work with existing wrapper functions or * if you just need the interp value for some reason. When used, * the 'interp' parameter becomes hidden in the Tcl interface--that * is, you don't specify it explicitly. SWIG fills in its value * automatically. * ----------------------------------------------------------------------------- */ %typemap(in,numinputs=0) Tcl_Interp *interp { $1 = interp; } swig-3.0.12/Lib/tcl/jstring.i0000664000175000017500000000175013042756442015562 0ustar williamwilliam%include %fragment(SWIG_AsVal_frag(jstring),"header") { SWIGINTERN int SWIG_AsVal_dec(jstring)(Tcl_Obj * obj, jstring *val) { int len = 0; const char *cstr = Tcl_GetStringFromObj(obj, &len); if (!cstr || (strcmp(cstr,"NULL") == 0)) { if (val) *val = 0; return SWIG_OK; } else { int len = 0; const Tcl_UniChar *ucstr = Tcl_GetUnicodeFromObj(obj,&len); if (val) { *val = JvNewString((const jchar*)ucstr, len); } } return SWIG_NEWOBJ; } } %fragment(SWIG_From_frag(jstring),"header") { SWIGINTERNINLINE Tcl_Obj * SWIG_From_dec(jstring)(jstring val) { if (!val) { return Tcl_NewStringObj("NULL",-1); } else { return Tcl_NewUnicodeObj((Tcl_UniChar *)JvGetStringChars(val),JvGetStringUTFLength(val)); } } } %typemaps_asvalfrom(%checkcode(STRING), %arg(SWIG_AsVal(jstring)), %arg(SWIG_From(jstring)), %arg(SWIG_AsVal_frag(jstring)), %arg(SWIG_From_frag(jstring)), java::lang::String *); swig-3.0.12/Lib/tcl/mactkinit.c0000664000175000017500000001236613042756442016064 0ustar williamwilliam/* ----------------------------------------------------------------------------- * mactkinit.c * * This is a support file needed to build a new version of Wish. * Normally, this capability is found in TkAppInit.c, but this creates * tons of namespace problems for many applications. * ----------------------------------------------------------------------------- */ #include #include #include #include #include #include #include "tk.h" #include "tkInt.h" #include "tkMacInt.h" typedef int (*TclMacConvertEventPtr) _ANSI_ARGS_((EventRecord *eventPtr)); Tcl_Interp *gStdoutInterp = NULL; void TclMacSetEventProc _ANSI_ARGS_((TclMacConvertEventPtr procPtr)); int TkMacConvertEvent _ANSI_ARGS_((EventRecord *eventPtr)); /* * Prototypes for functions the ANSI library needs to link against. */ short InstallConsole _ANSI_ARGS_((short fd)); void RemoveConsole _ANSI_ARGS_((void)); long WriteCharsToConsole _ANSI_ARGS_((char *buff, long n)); long ReadCharsFromConsole _ANSI_ARGS_((char *buff, long n)); char * __ttyname _ANSI_ARGS_((long fildes)); short SIOUXHandleOneEvent _ANSI_ARGS_((EventRecord *event)); /* * Forward declarations for procedures defined later in this file: */ /* *---------------------------------------------------------------------- * * MacintoshInit -- * * This procedure calls Mac specific initilization calls. Most of * these calls must be made as soon as possible in the startup * process. * * Results: * Returns TCL_OK if everything went fine. If it didn't the * application should probably fail. * * Side effects: * Inits the application. * *---------------------------------------------------------------------- */ int MacintoshInit() { int i; long result, mask = 0x0700; /* mask = system 7.x */ /* * Tk needs us to set the qd pointer it uses. This is needed * so Tk doesn't have to assume the availablity of the qd global * variable. Which in turn allows Tk to be used in code resources. */ tcl_macQdPtr = &qd; InitGraf(&tcl_macQdPtr->thePort); InitFonts(); InitWindows(); InitMenus(); InitDialogs((long) NULL); InitCursor(); /* * Make sure we are running on system 7 or higher */ if ((NGetTrapAddress(_Gestalt, ToolTrap) == NGetTrapAddress(_Unimplemented, ToolTrap)) || (((Gestalt(gestaltSystemVersion, &result) != noErr) || (mask != (result & mask))))) { panic("Tcl/Tk requires System 7 or higher."); } /* * Make sure we have color quick draw * (this means we can't run on 68000 macs) */ if (((Gestalt(gestaltQuickdrawVersion, &result) != noErr) || (result < gestalt32BitQD13))) { panic("Tk requires Color QuickDraw."); } FlushEvents(everyEvent, 0); SetEventMask(everyEvent); /* * Set up stack & heap sizes */ /* TODO: stack size size = StackSpace(); SetAppLimit(GetAppLimit() - 8192); */ MaxApplZone(); for (i = 0; i < 4; i++) { (void) MoreMasters(); } TclMacSetEventProc(TkMacConvertEvent); TkConsoleCreate(); return TCL_OK; } /* *---------------------------------------------------------------------- * * SetupMainInterp -- * * This procedure calls initalization routines require a Tcl * interp as an argument. This call effectively makes the passed * iterpreter the "main" interpreter for the application. * * Results: * Returns TCL_OK if everything went fine. If it didn't the * application should probably fail. * * Side effects: * More initilization. * *---------------------------------------------------------------------- */ int SetupMainInterp( Tcl_Interp *interp) { /* * Initialize the console only if we are running as an interactive * application. */ TkMacInitAppleEvents(interp); TkMacInitMenus(interp); if (strcmp(Tcl_GetVar(interp, "tcl_interactive", TCL_GLOBAL_ONLY), "1") == 0) { if (TkConsoleInit(interp) == TCL_ERROR) { goto error; } } /* * Attach the global interpreter to tk's expected global console */ gStdoutInterp = interp; return TCL_OK; error: panic(interp->result); return TCL_ERROR; } /* *---------------------------------------------------------------------- * * InstallConsole, RemoveConsole, etc. -- * * The following functions provide the UI for the console package. * Users wishing to replace SIOUX with their own console package * need only provide the four functions below in a library. * * Results: * See SIOUX documentation for details. * * Side effects: * See SIOUX documentation for details. * *---------------------------------------------------------------------- */ short InstallConsole(short fd) { #pragma unused (fd) return 0; } void RemoveConsole(void) { } long WriteCharsToConsole(char *buffer, long n) { TkConsolePrint(gStdoutInterp, TCL_STDOUT, buffer, n); return n; } long ReadCharsFromConsole(char *buffer, long n) { return 0; } extern char * __ttyname(long fildes) { static char *devicename = "null device"; if (fildes >= 0 && fildes <= 2) { return (devicename); } return (0L); } short SIOUXHandleOneEvent(EventRecord *event) { return 0; } swig-3.0.12/Lib/tcl/typemaps.i0000664000175000017500000003727213042756442015754 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * SWIG typemap library for Tcl8. This file contains various sorts * of typemaps for modifying SWIG's code generation. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else /* The SWIG typemap library provides a language independent mechanism for supporting output arguments, input values, and other C function calling mechanisms. The primary use of the library is to provide a better interface to certain C function--especially those involving pointers. */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %typemap(in) double *INPUT(double temp), double &INPUT(double temp) { if (Tcl_GetDoubleFromObj(interp,$input,&temp) == TCL_ERROR) { SWIG_fail; } $1 = &temp; } %typemap(in) float *INPUT(double dvalue, float temp), float &INPUT(double dvalue, float temp) { if (Tcl_GetDoubleFromObj(interp,$input,&dvalue) == TCL_ERROR) { SWIG_fail; } temp = (float) dvalue; $1 = &temp; } %typemap(in) int *INPUT(int temp), int &INPUT(int temp) { if (Tcl_GetIntFromObj(interp,$input,&temp) == TCL_ERROR) { SWIG_fail; } $1 = &temp; } %typemap(in) short *INPUT(int ivalue, short temp), short &INPUT(int ivalue, short temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (short) ivalue; $1 = &temp; } %typemap(in) long *INPUT(int ivalue, long temp), long &INPUT(int ivalue, long temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (long) ivalue; $1 = &temp; } %typemap(in) unsigned int *INPUT(int ivalue, unsigned int temp), unsigned int &INPUT(int ivalue, unsigned int temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned int) ivalue; $1 = &temp; } %typemap(in) unsigned short *INPUT(int ivalue, unsigned short temp), unsigned short &INPUT(int ivalue, unsigned short temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned short) ivalue; $1 = &temp; } %typemap(in) unsigned long *INPUT(int ivalue, unsigned long temp), unsigned long &INPUT(int ivalue, unsigned long temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned long) ivalue; $1 = &temp; } %typemap(in) unsigned char *INPUT(int ivalue, unsigned char temp), unsigned char &INPUT(int ivalue, unsigned char temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (unsigned char) ivalue; $1 = &temp; } %typemap(in) signed char *INPUT(int ivalue, signed char temp), signed char &INPUT(int ivalue, signed char temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = (signed char) ivalue; $1 = &temp; } %typemap(in) bool *INPUT(int ivalue, bool temp), bool &INPUT(int ivalue, bool temp) { if (Tcl_GetIntFromObj(interp,$input,&ivalue) == TCL_ERROR) { SWIG_fail; } temp = ivalue ? true : false; $1 = &temp; } %typemap(in) long long *INPUT($*1_ltype temp), long long &INPUT($*1_ltype temp) { temp = ($*1_ltype) strtoll(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp; } %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { temp = ($*1_ltype) strtoull(Tcl_GetStringFromObj($input,NULL),0,0); $1 = &temp; } // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Tcl list. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Tcl output of the function would be a list containing both output values. */ %typemap(in,numinputs=0) int *OUTPUT(int temp), short *OUTPUT(short temp), long *OUTPUT(long temp), unsigned int *OUTPUT(unsigned int temp), unsigned short *OUTPUT(unsigned short temp), unsigned long *OUTPUT(unsigned long temp), unsigned char *OUTPUT(unsigned char temp), signed char *OUTPUT(signed char temp), bool *OUTPUT(bool temp), float *OUTPUT(float temp), double *OUTPUT(double temp), long long *OUTPUT($*1_ltype temp), unsigned long long *OUTPUT($*1_ltype temp), int &OUTPUT(int temp), short &OUTPUT(short temp), long &OUTPUT(long temp), unsigned int &OUTPUT(unsigned int temp), unsigned short &OUTPUT(unsigned short temp), unsigned long &OUTPUT(unsigned long temp), signed char &OUTPUT(signed char temp), bool &OUTPUT(bool temp), unsigned char &OUTPUT(unsigned char temp), float &OUTPUT(float temp), double &OUTPUT(double temp), long long &OUTPUT($*1_ltype temp), unsigned long long &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout) int *OUTPUT, int &OUTPUT, short *OUTPUT, short &OUTPUT, long *OUTPUT, long &OUTPUT, unsigned int *OUTPUT, unsigned int &OUTPUT, unsigned short *OUTPUT, unsigned short &OUTPUT, unsigned long *OUTPUT, unsigned long &OUTPUT, unsigned char *OUTPUT, unsigned char &OUTPUT, signed char *OUTPUT, signed char &OUTPUT, bool *OUTPUT, bool &OUTPUT { Tcl_Obj *o; o = Tcl_NewIntObj((int) *($1)); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) float *OUTPUT, float &OUTPUT, double *OUTPUT, double &OUTPUT { Tcl_Obj *o; o = Tcl_NewDoubleObj((double) *($1)); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) long long *OUTPUT, long long &OUTPUT { char temp[256]; Tcl_Obj *o; sprintf(temp,"%lld",(long long)*($1)); o = Tcl_NewStringObj(temp,-1); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { char temp[256]; Tcl_Obj *o; sprintf(temp,"%llu",(unsigned long long)*($1)); o = Tcl_NewStringObj(temp,-1); Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),o); } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Tcl list. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Tcl). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Tcl variable you might do this : set x [neg $x] */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) unsigned int *INOUT = unsigned int *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) unsigned int &INOUT = unsigned int &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) unsigned int *INOUT = unsigned int *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) unsigned int &INOUT = unsigned int &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INPUT = double; %typemap(typecheck) bool *INPUT = bool; %typemap(typecheck) signed char *INPUT = signed char; %typemap(typecheck) unsigned char *INPUT = unsigned char; %typemap(typecheck) unsigned long *INPUT = unsigned long; %typemap(typecheck) unsigned short *INPUT = unsigned short; %typemap(typecheck) unsigned int *INPUT = unsigned int; %typemap(typecheck) long *INPUT = long; %typemap(typecheck) short *INPUT = short; %typemap(typecheck) int *INPUT = int; %typemap(typecheck) float *INPUT = float; %typemap(typecheck) long long *INPUT = long long; %typemap(typecheck) unsigned long long *INPUT = unsigned long long; %typemap(typecheck) double &INPUT = double; %typemap(typecheck) bool &INPUT = bool; %typemap(typecheck) signed char &INPUT = signed char; %typemap(typecheck) unsigned char &INPUT = unsigned char; %typemap(typecheck) unsigned long &INPUT = unsigned long; %typemap(typecheck) unsigned short &INPUT = unsigned short; %typemap(typecheck) unsigned int &INPUT = unsigned int; %typemap(typecheck) long &INPUT = long; %typemap(typecheck) short &INPUT = short; %typemap(typecheck) int &INPUT = int; %typemap(typecheck) float &INPUT = float; %typemap(typecheck) long long &INPUT = long long; %typemap(typecheck) unsigned long long &INPUT = unsigned long long; %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include %include swig-3.0.12/Lib/tcl/tclinit.swg0000664000175000017500000000774313042756442016130 0ustar williamwilliam/* ------------------------------------------------------------ * The start of the Tcl initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" /* This initialization code exports the module initialization function */ %header %{ #ifdef __cplusplus extern "C" { #endif #ifdef MAC_TCL #pragma export on #endif SWIGEXPORT int SWIG_init(Tcl_Interp *); #ifdef MAC_TCL #pragma export off #endif #ifdef __cplusplus } #endif /* Compatibility version for TCL stubs */ #ifndef SWIG_TCL_STUBS_VERSION #define SWIG_TCL_STUBS_VERSION "8.1" #endif %} %init %{ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Tcl_InstallConstants(Tcl_Interp *interp, swig_const_info constants[]) { size_t i; Tcl_Obj *obj; if (!swigconstTableinit) { Tcl_InitHashTable(&swigconstTable, TCL_STRING_KEYS); swigconstTableinit = 1; } for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_TCL_POINTER: obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_TCL_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { SWIG_Tcl_SetConstantObj(interp, constants[i].name, obj); } } } /* Create fast method lookup tables */ SWIGINTERN void SWIG_Tcl_InstallMethodLookupTables(void) { size_t i; for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = swig_module.type_initial[i]; if (type->clientdata) { swig_class* klass = (swig_class*) type->clientdata; swig_method* meth; Tcl_InitHashTable(&(klass->hashtable), TCL_STRING_KEYS); for (meth = klass->methods; meth && meth->name; ++meth) { int newEntry; Tcl_HashEntry* hashentry = Tcl_CreateHashEntry(&(klass->hashtable), meth->name, &newEntry); Tcl_SetHashValue(hashentry, (ClientData)meth->method); } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ SWIGEXPORT int SWIG_init(Tcl_Interp *interp) { size_t i; if (interp == 0) return TCL_ERROR; #ifdef USE_TCL_STUBS /* (char*) cast is required to avoid compiler warning/error for Tcl < 8.4. */ if (Tcl_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { return TCL_ERROR; } #endif #ifdef USE_TK_STUBS /* (char*) cast is required to avoid compiler warning/error. */ if (Tk_InitStubs(interp, (char*)SWIG_TCL_STUBS_VERSION, 0) == NULL) { return TCL_ERROR; } #endif Tcl_PkgProvide(interp, (char*)SWIG_name, (char*)SWIG_version); #ifdef SWIG_namespace Tcl_Eval(interp, "namespace eval " SWIG_namespace " { }"); #endif SWIG_InitializeModule((void *) interp); SWIG_PropagateClientData(); for (i = 0; swig_commands[i].name; i++) { Tcl_CreateObjCommand(interp, (char *) swig_commands[i].name, (swig_wrapper_func) swig_commands[i].wrapper, swig_commands[i].clientdata, NULL); } for (i = 0; swig_variables[i].name; i++) { Tcl_SetVar(interp, (char *) swig_variables[i].name, (char *) "", TCL_GLOBAL_ONLY); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_READS | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].get, (ClientData) swig_variables[i].addr); Tcl_TraceVar(interp, (char *) swig_variables[i].name, TCL_TRACE_WRITES | TCL_GLOBAL_ONLY, (Tcl_VarTraceProc *) swig_variables[i].set, (ClientData) swig_variables[i].addr); } SWIG_Tcl_InstallConstants(interp, swig_constants); SWIG_Tcl_InstallMethodLookupTables(); %} /* Note: the initialization function is closed after all code is generated */ swig-3.0.12/Lib/tcl/tclapi.swg0000664000175000017500000000603413042756442015726 0ustar williamwilliam/* ----------------------------------------------------------------------------- * SWIG API. Portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_TCL_POINTER 4 #define SWIG_TCL_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; typedef int (*swig_wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); typedef int (*swig_wrapper_func)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); typedef char *(*swig_variable_func)(ClientData, Tcl_Interp *, char *, char *, int); typedef void (*swig_delete_func)(ClientData); typedef struct swig_method { const char *name; swig_wrapper method; } swig_method; typedef struct swig_attribute { const char *name; swig_wrapper getmethod; swig_wrapper setmethod; } swig_attribute; typedef struct swig_class { const char *name; swig_type_info **type; swig_wrapper constructor; void (*destructor)(void *); swig_method *methods; swig_attribute *attributes; struct swig_class **bases; const char **base_names; swig_module_info *module; Tcl_HashTable hashtable; } swig_class; typedef struct swig_instance { Tcl_Obj *thisptr; void *thisvalue; swig_class *classptr; int destroy; Tcl_Command cmdtok; } swig_instance; /* Structure for command table */ typedef struct { const char *name; int (*wrapper)(ClientData, Tcl_Interp *, int, Tcl_Obj *CONST []); ClientData clientdata; } swig_command_info; /* Structure for variable linking table */ typedef struct { const char *name; void *addr; char * (*get)(ClientData, Tcl_Interp *, char *, char *, int); char * (*set)(ClientData, Tcl_Interp *, char *, char *, int); } swig_var_info; /* -----------------------------------------------------------------------------* * Install a constant object * -----------------------------------------------------------------------------*/ static Tcl_HashTable swigconstTable; static int swigconstTableinit = 0; SWIGINTERN void SWIG_Tcl_SetConstantObj(Tcl_Interp *interp, const char* name, Tcl_Obj *obj) { int newobj; Tcl_ObjSetVar2(interp,Tcl_NewStringObj(name,-1), NULL, obj, TCL_GLOBAL_ONLY); Tcl_SetHashValue(Tcl_CreateHashEntry(&swigconstTable, name, &newobj), (ClientData) obj); } SWIGINTERN Tcl_Obj * SWIG_Tcl_GetConstantObj(const char *key) { Tcl_HashEntry *entryPtr; if (!swigconstTableinit) return 0; entryPtr = Tcl_FindHashEntry(&swigconstTable, key); if (entryPtr) { return (Tcl_Obj *) Tcl_GetHashValue(entryPtr); } return 0; } #ifdef __cplusplus } #endif swig-3.0.12/Lib/tcl/carrays.i0000664000175000017500000000004313042756442015540 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/std_pair.i0000664000175000017500000000130313042756442015701 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * Typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/tcl/tcltypemaps.swg0000664000175000017500000000543713042756442017025 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Tcl * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* In Tcl we need to pass the interp value, so we define the decl/call macros as needed. */ #define SWIG_AS_DECL_ARGS SWIG_TCL_DECL_ARGS_2 #define SWIG_AS_CALL_ARGS SWIG_TCL_CALL_ARGS_2 /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Tcl fragments for primitive types */ %include /* Tcl fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* No director support in Tcl */ #ifdef SWIG_DIRECTOR_TYPEMAPS #undef SWIG_DIRECTOR_TYPEMAPS #endif /* Tcl types */ #define SWIG_Object Tcl_Obj * /* Overload of the output/constant/exception handling */ /* output */ #define %set_output(obj) Tcl_SetObjResult(interp,obj) /* append output */ #define %append_output(obj) Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),obj) /* set constant */ #define SWIG_SetConstant(name, obj) SWIG_Tcl_SetConstantObj(interp, name, obj) /* raise */ #define SWIG_Raise(obj,type,desc) SWIG_Tcl_SetErrorObj(interp,type,obj) /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Tcl extra typemaps / typemap overrides * ------------------------------------------------------------ */ #if 1 // Old 1.3.25 typemaps needed to avoid premature object deletion %typemap(out,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE &INSTANCE, SWIGTYPE &&INSTANCE, SWIGTYPE INSTANCE[] { Tcl_SetObjResult(interp, SWIG_NewInstanceObj( %as_voidptr($1), $1_descriptor,0)); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,%as_voidptrptr(&$1)); Tcl_SetObjResult(interp,SWIG_NewInstanceObj(%as_voidptr($1), ty,0)); } #endif %typemap(throws,noblock=1) SWIGTYPE CLASS { SWIG_set_result(SWIG_NewInstanceObj(%as_voidptr(SWIG_new_copy($1, $1_ltype)), $&1_descriptor, 1)); SWIG_fail; } %typemap(out) SWIGTYPE = SWIGTYPE INSTANCE; %typemap(out) SWIGTYPE * = SWIGTYPE *INSTANCE; %typemap(out) SWIGTYPE *const = SWIGTYPE *; %typemap(out) SWIGTYPE & = SWIGTYPE &INSTANCE; %typemap(out) SWIGTYPE && = SWIGTYPE &&INSTANCE; %typemap(out) SWIGTYPE [] = SWIGTYPE INSTANCE[]; %typemap(varout) SWIGTYPE = SWIGTYPE INSTANCE; swig-3.0.12/Lib/tcl/tclerrors.swg0000664000175000017500000000323713042756442016473 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGINTERN const char* SWIG_Tcl_ErrorType(int code) { const char* type = 0; switch(code) { case SWIG_MemoryError: type = "MemoryError"; break; case SWIG_IOError: type = "IOError"; break; case SWIG_RuntimeError: type = "RuntimeError"; break; case SWIG_IndexError: type = "IndexError"; break; case SWIG_TypeError: type = "TypeError"; break; case SWIG_DivisionByZero: type = "ZeroDivisionError"; break; case SWIG_OverflowError: type = "OverflowError"; break; case SWIG_SyntaxError: type = "SyntaxError"; break; case SWIG_ValueError: type = "ValueError"; break; case SWIG_SystemError: type = "SystemError"; break; case SWIG_AttributeError: type = "AttributeError"; break; default: type = "RuntimeError"; } return type; } SWIGINTERN void SWIG_Tcl_SetErrorObj(Tcl_Interp *interp, const char *ctype, Tcl_Obj *obj) { Tcl_ResetResult(interp); Tcl_SetObjResult(interp, obj); Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); } SWIGINTERN void SWIG_Tcl_SetErrorMsg(Tcl_Interp *interp, const char *ctype, const char *mesg) { Tcl_ResetResult(interp); Tcl_SetErrorCode(interp, "SWIG", ctype, NULL); Tcl_AppendResult(interp, ctype, " ", mesg, NULL); /* Tcl_AddErrorInfo(interp, ctype); Tcl_AddErrorInfo(interp, " "); Tcl_AddErrorInfo(interp, mesg); */ } SWIGINTERNINLINE void SWIG_Tcl_AddErrorMsg(Tcl_Interp *interp, const char* mesg) { Tcl_AddErrorInfo(interp, mesg); } swig-3.0.12/Lib/tcl/wish.i0000664000175000017500000000655413042756442015063 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wish.i * * SWIG File for making wish * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "wish.i" %text %{ This module provides the Tk_AppInit() function needed to build a new version of the wish executable. Like tclsh.i, this file should not be used with dynamic loading. To make an interface file work with both static and dynamic loading, put something like this in your interface file : #ifdef STATIC %include #endif A startup file may be specified by defining the symbol SWIG_RcFileName as follows (this should be included in a code-block) : #define SWIG_RcFileName "~/.mywishrc" %} #endif %{ /* Initialization code for wish */ #include #ifndef SWIG_RcFileName char *SWIG_RcFileName = "~/.wishrc"; #endif #ifdef MAC_TCL extern int MacintoshInit _ANSI_ARGS_((void)); extern int SetupMainInterp _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* *---------------------------------------------------------------------- * * Tcl_AppInit -- * * This procedure performs application-specific initialization. * Most applications, especially those that incorporate additional * packages, will have their own version of this procedure. * * Results: * Returns a standard Tcl completion code, and leaves an error * message in interp->result if an error occurs. * * Side effects: * Depends on the startup script. * *---------------------------------------------------------------------- */ int Tcl_AppInit(Tcl_Interp *interp) { #ifndef MAC_TCL Tk_Window main; main = Tk_MainWindow(interp); #endif /* * Call the init procedures for included packages. Each call should * look like this: * * if (Mod_Init(interp) == TCL_ERROR) { * return TCL_ERROR; * } * * where "Mod" is the name of the module. */ if (Tcl_Init(interp) == TCL_ERROR) { return TCL_ERROR; } if (Tk_Init(interp) == TCL_ERROR) { return TCL_ERROR; } /* * Call Tcl_CreateCommand for application-specific commands, if * they weren't already created by the init procedures called above. */ if (SWIG_init(interp) == TCL_ERROR) { return TCL_ERROR; } #ifdef MAC_TCL SetupMainInterp(interp); #endif /* * Specify a user-specific startup file to invoke if the application * is run interactively. Typically the startup file is "~/.apprc" * where "app" is the name of the application. If this line is deleted * then no user-specific startup file will be run under any conditions. */ #if TCL_MAJOR_VERSION >= 8 || TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 5 Tcl_SetVar(interp, (char *) "tcl_rcFileName",SWIG_RcFileName,TCL_GLOBAL_ONLY); #else tcl_RcFileName = SWIG_RcFileName; #endif /* For Macintosh might also want this */ #ifdef MAC_TCL #ifdef SWIG_RcRsrcName Tcl_SetVar(interp, (char *) "tcl_rcRsrcName",SWIG_RcRsrcName,TCL_GLOBAL_ONLY); #endif #endif return TCL_OK; } #if TK_MAJOR_VERSION >= 4 int main(int argc, char **argv) { #ifdef MAC_TCL char *newArgv[2]; if (MacintoshInit() != TCL_OK) { Tcl_Exit(1); } argc = 1; newArgv[0] = "Wish"; newArgv[1] = NULL; argv = newArgv; #endif Tk_Main(argc, argv, Tcl_AppInit); return(0); } #else extern int main(); #endif %} swig-3.0.12/Lib/tcl/stl.i0000664000175000017500000000054513042756442014705 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ /* initial STL definition. extended as needed in each language */ %include %include %include %include %include swig-3.0.12/Lib/tcl/tcluserdir.swg0000664000175000017500000000030313042756442016623 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Special user directives * ----------------------------------------------------------------------------- */ swig-3.0.12/Lib/tcl/exception.i0000664000175000017500000000022113042756442016070 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); return TCL_ERROR;)) } swig-3.0.12/Lib/tcl/tclwstrings.swg0000664000175000017500000000345413042756442017040 0ustar williamwilliam/* ----------------------------------------------------------------------------- * tclwstrings.wg * * Utility methods for wchar strings * ----------------------------------------------------------------------------- */ %{ #include %} %fragment("SWIG_AsWCharPtrAndSize","header") { SWIGINTERN int SWIG_AsWCharPtrAndSize(Tcl_Obj *obj, wchar_t** cptr, size_t* psize, int *alloc) { int len = 0; Tcl_UniChar *ustr = Tcl_GetUnicodeFromObj(obj, &len); if (ustr) { if (cptr) { Tcl_Encoding encoding = NULL; char *src = (char *) ustr; int srcLen = (len)*sizeof(Tcl_UniChar); int dstLen = sizeof(wchar_t)*(len + 1); char *dst = %new_array(dstLen, char); int flags = 0; Tcl_EncodingState *statePtr = 0; int srcRead = 0; int dstWrote = 0; int dstChars = 0; Tcl_UtfToExternal(0, encoding, src, srcLen, flags, statePtr, dst, dstLen, &srcRead, &dstWrote, &dstChars); if (alloc) *alloc = SWIG_NEWOBJ; } if (psize) *psize = len + 1; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_FromWCharPtrAndSize","header") { SWIGINTERNINLINE Tcl_Obj * SWIG_FromWCharPtrAndSize(const wchar_t* carray, size_t size) { Tcl_Obj *res = NULL; if (size < INT_MAX) { Tcl_Encoding encoding = NULL; char *src = (char *) carray; int srcLen = (int)(size*sizeof(wchar_t)); int dstLen = (int)(size*sizeof(Tcl_UniChar)); char *dst = %new_array(dstLen, char); int flags = 0; Tcl_EncodingState *statePtr = 0; int srcRead = 0; int dstWrote = 0; int dstChars = 0; Tcl_ExternalToUtf(0, encoding, src, srcLen, flags, statePtr, dst, dstLen, &srcRead, &dstWrote, &dstChars); res = Tcl_NewUnicodeObj((Tcl_UniChar*)dst, (int)size); %delete_array(dst); } return res; } } swig-3.0.12/Lib/tcl/cdata.i0000664000175000017500000000003613042756442015152 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/std_string.i0000664000175000017500000000004413042756442016255 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/std_map.i0000664000175000017500000000422513042756442015531 0ustar williamwilliam// // SWIG typemaps for std::map // // Common implementation %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/tcl/cstring.i0000664000175000017500000000004013042756442015542 0ustar williamwilliam%include swig-3.0.12/Lib/tcl/factory.i0000664000175000017500000000004013042756442015540 0ustar williamwilliam%include swig-3.0.12/Lib/pointer.i0000664000175000017500000000044613042756442015001 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pointer.i * ----------------------------------------------------------------------------- */ %echo "pointer.i is deprecated. Use cpointer.i instead." %echo "See http://www.swig.org/Doc3.0/Library.html" swig-3.0.12/Lib/go/0000775000175000017500000000000013042756442013550 5ustar williamwilliamswig-3.0.12/Lib/go/std_deque.i0000664000175000017500000000003413042756442015674 0ustar williamwilliam%include swig-3.0.12/Lib/go/gostring.swg0000664000175000017500000000152313042756442016127 0ustar williamwilliam/* ------------------------------------------------------------ * gostring.swg * * Support for returning strings from C to Go. * ------------------------------------------------------------ */ // C/C++ code to convert a memory buffer into a Go string allocated in // C/C++ memory. %fragment("AllocateString", "runtime") %{ static _gostring_ Swig_AllocateString(const char *p, size_t l) { _gostring_ ret; ret.p = (char*)malloc(l); memcpy(ret.p, p, l); ret.n = l; return ret; } %} // Go code to convert a string allocated in C++ memory to one // allocated in Go memory. %fragment("CopyString", "go_runtime") %{ type swig_gostring struct { p uintptr; n int } func swigCopyString(s string) string { p := *(*swig_gostring)(unsafe.Pointer(&s)) r := string((*[0x7fffffff]byte)(unsafe.Pointer(p.p))[:p.n]) Swig_free(p.p) return r } %} swig-3.0.12/Lib/go/std_vector.i0000664000175000017500000000466713042756442016113 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef bool value_type; typedef bool const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i /* Code insertion directives */ #define %go_import(...) %insert(go_imports) %{__VA_ARGS__%} /* Basic types */ %typemap(gotype) bool, const bool & "bool" %typemap(gotype) char, const char & "byte" %typemap(gotype) signed char, const signed char & "int8" %typemap(gotype) unsigned char, const unsigned char & "byte" %typemap(gotype) short, const short & "int16" %typemap(gotype) unsigned short, const unsigned short & "uint16" %typemap(gotype) int, const int & "int" %typemap(gotype) unsigned int, const unsigned int & "uint" %typemap(gotype) long, const long & "int64" %typemap(gotype) unsigned long, const unsigned long & "uint64" %typemap(gotype) long long, const long long & "int64" %typemap(gotype) unsigned long long, const unsigned long long & "uint64" %typemap(gotype) float, const float & "float32" %typemap(gotype) double, const double & "float64" %typemap(in) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(in) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long long &, const unsigned long long &, const float &, const double & %{ $1 = ($1_ltype)&$input; %} %typemap(in) const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = $1; %} %typemap(goout) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "" %typemap(out) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $result = ($*1_ltype)*$1; %} %typemap(goout) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & "" %typemap(out) void "" %typemap(goout) void "" %typemap(directorin) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $input = ($1_ltype)$1; %} %typemap(godirectorin) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "" %typemap(directorin) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $input = ($*1_ltype)$1; %} %typemap(godirectorin) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & "" %typemap(directorout) bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const bool &, const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ $result = new $*1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* The size_t type. */ %typemap(gotype) size_t, const size_t & %{int64%} %typemap(in) size_t %{ $1 = (size_t)$input; %} %typemap(in) const size_t & %{ $1 = ($1_ltype)&$input; %} %typemap(out) size_t %{ $result = $1; %} %typemap(goout) size_t "" %typemap(out) const size_t & %{ $result = ($*1_ltype)*$1; %} %typemap(goout) const size_t & "" %typemap(directorin) size_t %{ $input = (size_t)$1; %} %typemap(godirectorin) size_t "" %typemap(directorin) const size_t & %{ $input = ($*1_ltype)$1; %} %typemap(godirectorin) const size_t & "" %typemap(directorout) size_t %{ $result = ($1_ltype)$input; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const size_t & %{ $result = new $*1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* Member pointers. */ %typemap(gotype) SWIGTYPE (CLASS::*) %{$gotypename%} %typemap(in) SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)$input; %} %typemap(out) SWIGTYPE (CLASS::*) %{ struct swig_out_type { intgo size; void* val; } *swig_out; swig_out = (struct swig_out_type*)malloc(sizeof(*swig_out)); if (swig_out) { swig_out->size = sizeof($1_ltype); swig_out->val = malloc(swig_out->size); if (swig_out->val) { *($&1_ltype)(swig_out->val) = $1; } } $result = swig_out; %} %typemap(goout) SWIGTYPE (CLASS::*) %{ { type swig_out_type struct { size int; val uintptr } p := (*swig_out_type)(unsafe.Pointer($1)) if p == nil || p.val == 0 { $result = nil } else { m := make([]byte, p.size) a := (*[1024]byte)(unsafe.Pointer(p.val))[:p.size] copy(m, a) Swig_free(p.val) Swig_free(uintptr(unsafe.Pointer(p))) $result = &m[0] } } %} %typemap(directorin) SWIGTYPE (CLASS::*) %{ $input = *($&1_ltype)$1; %} %typemap(godirectorin) SWIGTYPE (CLASS::*) "" %typemap(directorout) SWIGTYPE (CLASS::*) %{ $result = new $1_ltype($input); swig_acquire_pointer(&swig_mem, $result); %} /* Pointers. */ /* We can't translate pointers using a typemap, so that is handled in the C++ code. */ %typemap(gotype) SWIGTYPE * %{$gotypename%} %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = ($1_ltype)$1; %} %typemap(goout) SWIGTYPE * "" %typemap(directorin) SWIGTYPE * %{ *($&1_ltype)&$input = ($1_ltype)$1; %} %typemap(godirectorin) SWIGTYPE * "" %typemap(directorout) SWIGTYPE * %{ $result = *($&1_ltype)&$input; %} %apply SWIGTYPE * { SWIGTYPE *const } /* Pointer references. */ %typemap(gotype) SWIGTYPE *const& %{$gotypename%} %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = *($1_ltype)&$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ *($1_ltype)&$result = *$1; %} %typemap(goout) SWIGTYPE *const& "" /* References. */ /* Converting a C++ reference to Go has to be handled in the C++ code. */ %typemap(gotype) SWIGTYPE & %{$gotypename%} %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE & %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE & "" %typemap(directorin) SWIGTYPE & %{ $input = ($1_ltype)&$1; %} %typemap(godirectorin) SWIGTYPE & "" %typemap(directorout) SWIGTYPE & %{ *($&1_ltype)&$result = $input; %} %typemap(gotype) SWIGTYPE && %{$gotypename%} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE && %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE && "" %typemap(directorin) SWIGTYPE && %{ $input = ($1_ltype)&$1_name; %} %typemap(godirectorin) SWIGTYPE && "" %typemap(directorout) SWIGTYPE && %{ *($&1_ltype)&$result = $input; %} /* C arrays turn into Go pointers. If we know the length we can use a slice. */ %typemap(gotype) SWIGTYPE [] %{$gotypename%} %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} %typemap(goout) SWIGTYPE [] "" %typemap(directorin) SWIGTYPE [] %{ $input = *($1_ltype)&$1; %} %typemap(godirectorin) SWIGTYPE [] "" %typemap(directorout) SWIGTYPE [] %{ *($&1_ltype)&$result = $input; %} /* Strings. */ %typemap(gotype) char *, char *&, char[ANY], char[] "string" /* Needed to avoid confusion with the way the go module handles references. */ %typemap(gotype) char&, unsigned char& "*byte" %typemap(gotype) signed char& "*int8" %typemap(in) char *, char[ANY], char[] %{ $1 = ($1_ltype)malloc($input.n + 1); memcpy($1, $input.p, $input.n); $1[$input.n] = '\0'; %} %typemap(in) char *& (char *temp) %{ temp = (char *)malloc($input.n + 1); memcpy(temp, $input.p, $input.n); temp[$input.n] = '\0'; $1 = ($1_ltype)&temp; %} %typemap(freearg) char *, char *&, char[ANY], char[] %{ free($1); %} %typemap(out,fragment="AllocateString") char *, char *&, char[ANY], char[] %{ $result = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0); %} %typemap(goout,fragment="CopyString") char *, char *&, char[ANY], char[] %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") char *, char *&, char[ANY], char[] %{ $input = Swig_AllocateString((char*)$1, $1 ? strlen((char*)$1) : 0); %} %typemap(godirectorin,fragment="CopyString") char *, char *&, char[ANY], char[] %{ $result = swigCopyString($input) %} %typemap(godirectorout) char *, char *&, char[ANY], char[] %{ { p := Swig_malloc(len($input) + 1) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input) + 1] copy(s, $input) s[len($input)] = 0 $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char *, char *&, char[ANY], char[] %{ $result = ($1_ltype)$input.p; %} /* String & length */ %typemap(gotype) (char *STRING, size_t LENGTH) "string" %typemap(in) (char *STRING, size_t LENGTH) %{ $1 = ($1_ltype)$input.p; $2 = ($2_ltype)$input.n; %} %typemap(out,fragment="AllocateString") (char *STRING, size_t LENGTH) %{ $result = Swig_AllocateString((char*)$1, (size_t)$2); %} %typemap(goout,fragment="CopyString") (char *STRING, size_t LENGTH) %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") (char *STRING, size_t LENGTH) %{ $input = Swig_AllocateString((char*)$1, $2); %} %typemap(godirectorin,fragment="CopyString") (char *STRING, size_t LENGTH) %{ $result = swigCopyString($input) %} %typemap(directorout) (char *STRING, size_t LENGTH) %{ $1 = ($1_ltype)$input.p; $2 = ($2_ltype)$input.n; %} /* Enums. We can't do the right thing for enums in typemap(gotype) so we deliberately don't define them. The right thing would be to capitalize the name. This is instead done in go.cxx. */ %typemap(gotype) enum SWIGTYPE %{$gotypename%} %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (intgo)$1; %} %typemap(goout) enum SWIGTYPE "" %typemap(directorin) enum SWIGTYPE %{ $input = (intgo)$1; %} %typemap(godirectorin) enum SWIGTYPE "" %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE & (intgo e) %{ e = (intgo)$1; $input = ($1_ltype)&e; %} %typemap(godirectorin) enum SWIGTYPE & "" %typemap(directorout) enum SWIGTYPE & %{ $*1_ltype f = ($*1_ltype)*$input; $result = ($1_ltype)&f; %} /* Arbitrary type. This is a type passed by value in the C/C++ code. We convert it to a pointer for the Go code. Note that all basic types are explicitly handled above. */ %typemap(gotype) SWIGTYPE %{$gotypename%} %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (argp == NULL) { _swig_gopanic("Attempt to dereference null $1_type"); } $1 = ($1_ltype)*argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ *($&1_ltype*)&$result = new $1_ltype($1); %} #else { $&1_ltype $1ptr = ($&1_ltype)malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif %typemap(goout) SWIGTYPE "" %typemap(directorin) SWIGTYPE %{ $input = new $1_ltype((const $1_ltype &)$1); %} %typemap(godirectorin) SWIGTYPE "" %typemap(directorout) SWIGTYPE %{ $result = *($&1_ltype)$input; %} /* Exception handling */ %typemap(throws) char * %{ _swig_gopanic($1); %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; _swig_gopanic("C++ $1_type exception thrown"); %} /* Typecheck typemaps. The purpose of these is merely to issue a warning for overloaded C++ functions that cannot be overloaded in Go as more than one C++ type maps to a single Go type. */ %typecheck(SWIG_TYPECHECK_BOOL) /* Go bool */ bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Go byte */ char, const char &, unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Go int8 */ signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Go int16 */ short, const short & "" %typecheck(SWIG_TYPECHECK_INT16) /* Go uint16 */ unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Go int */ int, const int & "" %typecheck(SWIG_TYPECHECK_INT32) /* Go uint */ unsigned int, const unsigned int & "" %typecheck(SWIG_TYPECHECK_INT64) /* Go int64 */ long, const long &, long long, const long long & "" %typecheck(SWIG_TYPECHECK_INT64) /* Go uint64 */ unsigned long, const unsigned long &, unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Go float32 */ float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Go float64 */ double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Go string */ char *, char *&, char[ANY], char [], signed char *, signed char *&, signed char[ANY], signed char [], unsigned char *, unsigned char *&, unsigned char[ANY], unsigned char [] "" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Go keywords. */ %include %include swig-3.0.12/Lib/go/std_common.i0000664000175000017500000000014513042756442016064 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-3.0.12/Lib/go/std_except.i0000664000175000017500000000241113042756442016062 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast %{_swig_gopanic($1.what());%} %typemap(throws) std::bad_exception %{_swig_gopanic($1.what());%} %typemap(throws) std::domain_error %{_swig_gopanic($1.what());%} %typemap(throws) std::exception %{_swig_gopanic($1.what());%} %typemap(throws) std::invalid_argument %{_swig_gopanic($1.what());%} %typemap(throws) std::length_error %{_swig_gopanic($1.what());%} %typemap(throws) std::logic_error %{_swig_gopanic($1.what());%} %typemap(throws) std::out_of_range %{_swig_gopanic($1.what());%} %typemap(throws) std::overflow_error %{_swig_gopanic($1.what());%} %typemap(throws) std::range_error %{_swig_gopanic($1.what());%} %typemap(throws) std::runtime_error %{_swig_gopanic($1.what());%} %typemap(throws) std::underflow_error %{_swig_gopanic($1.what());%} swig-3.0.12/Lib/go/typemaps.i0000664000175000017500000002333513042756442015572 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps remap a C pointer or C++ reference to be an "INPUT" value which is passed by value instead of reference. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In Go you could then use it like this: answer := modulename.Fadd(10.0, 20.0) There are no char *INPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INPUT {char *input}; void f(char *input); */ %define INPUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *INPUT, TYPE &INPUT "GOTYPE" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(out) TYPE *INPUT, TYPE &INPUT "" %typemap(goout) TYPE *INPUT, TYPE &INPUT "" %typemap(freearg) TYPE *INPUT, TYPE &INPUT "" %typemap(argout) TYPE *INPUT, TYPE &INPUT "" // %typemap(typecheck) TYPE *INPUT = TYPE; // %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, bool); INPUT_TYPEMAP(signed char, int8); INPUT_TYPEMAP(char, byte); INPUT_TYPEMAP(unsigned char, byte); INPUT_TYPEMAP(short, int16); INPUT_TYPEMAP(unsigned short, uint16); INPUT_TYPEMAP(int, int); INPUT_TYPEMAP(unsigned int, uint); INPUT_TYPEMAP(long, int64); INPUT_TYPEMAP(unsigned long, uint64); INPUT_TYPEMAP(long long, int64); INPUT_TYPEMAP(unsigned long long, uint64); INPUT_TYPEMAP(float, float32); INPUT_TYPEMAP(double, float64); #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. An array replaces the c pointer or reference parameter. // The output value is returned in this array passed in. /* OUTPUT typemaps --------------- The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. This works by a Go slice being passed as a parameter where a c pointer or reference is required. As with any Go function, the array is passed by reference so that any modifications to the array will be picked up in the calling function. Note that the array passed in MUST have at least one element, but as the c function does not require any input, the value can be set to anything. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Go output of the function would be the function return value and the value in the single element array. In Go you would use it like this: ptr := []float64{0.0} fraction := modulename.Modf(5.0,ptr) There are no char *OUTPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *OUTPUT {char *output}; void f(char *output); */ %define OUTPUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *OUTPUT, TYPE &OUTPUT %{[]GOTYPE%} %typemap(in) TYPE *OUTPUT($*1_ltype temp), TYPE &OUTPUT($*1_ltype temp) { if ($input.len == 0) { _swig_gopanic("array must contain at least 1 element"); } $1 = &temp; } %typemap(out) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(goout) TYPE *INPUT, TYPE &INPUT "" %typemap(freearg) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(argout) TYPE *OUTPUT, TYPE &OUTPUT { TYPE* a = (TYPE *) $input.array; a[0] = temp$argnum; } %enddef OUTPUT_TYPEMAP(bool, bool); OUTPUT_TYPEMAP(signed char, int8); OUTPUT_TYPEMAP(char, byte); OUTPUT_TYPEMAP(unsigned char, byte); OUTPUT_TYPEMAP(short, int16); OUTPUT_TYPEMAP(unsigned short, uint16); OUTPUT_TYPEMAP(int, int); OUTPUT_TYPEMAP(unsigned int, uint); OUTPUT_TYPEMAP(long, int64); OUTPUT_TYPEMAP(unsigned long, uint64); OUTPUT_TYPEMAP(long long, int64); OUTPUT_TYPEMAP(unsigned long long, uint64); OUTPUT_TYPEMAP(float, float32); OUTPUT_TYPEMAP(double, float64); #undef OUTPUT_TYPEMAP /* INOUT typemaps -------------- Mappings for a parameter that is both an input and an output parameter The following typemaps can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" typemaps described earlier. Output values are returned as an element in a Go slice. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); This works similarly to C in that the mapping directly modifies the input value - the input must be an array with a minimum of one element. The element in the array is the input and the output is the element in the array. x := []float64{5.0} Neg(x); The implementation of the OUTPUT and INOUT typemaps is different to other languages in that other languages will return the output value as part of the function return value. This difference is due to Go being a typed language. There are no char *INOUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INOUT {char *inout}; void f(char *inout); */ %define INOUT_TYPEMAP(TYPE, GOTYPE) %typemap(gotype) TYPE *INOUT, TYPE &INOUT %{[]GOTYPE%} %typemap(in) TYPE *INOUT, TYPE &INOUT { if ($input.len == 0) { _swig_gopanic("array must contain at least 1 element"); } $1 = ($1_ltype) $input.array; } %typemap(out) TYPE *INOUT, TYPE &INOUT "" %typemap(goout) TYPE *INOUT, TYPE &INOUT "" %typemap(freearg) TYPE *INOUT, TYPE &INOUT "" %typemap(argout) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, bool); INOUT_TYPEMAP(signed char, int8); INOUT_TYPEMAP(char, byte); INOUT_TYPEMAP(unsigned char, byte); INOUT_TYPEMAP(short, int16); INOUT_TYPEMAP(unsigned short, uint16); INOUT_TYPEMAP(int, int); INOUT_TYPEMAP(unsigned int, uint); INOUT_TYPEMAP(long, int64); INOUT_TYPEMAP(unsigned long, uint64); INOUT_TYPEMAP(long long, int64); INOUT_TYPEMAP(unsigned long long, uint64); INOUT_TYPEMAP(float, float32); INOUT_TYPEMAP(double, float64); #undef INOUT_TYPEMAP swig-3.0.12/Lib/go/std_pair.i0000664000175000017500000000131013042756442015522 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/go/stl.i0000664000175000017500000000044213042756442014524 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/go/goruntime.swg0000664000175000017500000002334113042756442016306 0ustar williamwilliam/* ------------------------------------------------------------ * goruntime.swg * * Go runtime code for the various generated files. * ------------------------------------------------------------ */ %inline %{ static void Swig_free(void* p) { free(p); } static void* Swig_malloc(int c) { return malloc(c); } %} %insert(runtime) %{ #include #include #include #include #include %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ #include %} #endif #if SWIGGO_INTGO_SIZE == 32 %insert(runtime) %{ typedef int intgo; typedef unsigned int uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef int intgo; typedef unsigned int uintgo; %} #endif #elif SWIGGO_INTGO_SIZE == 64 %insert(runtime) %{ typedef long long intgo; typedef unsigned long long uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef long long intgo; typedef unsigned long long uintgo; %} #endif #else %insert(runtime) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} #if SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef ptrdiff_t intgo; typedef size_t uintgo; %} #endif #endif #ifndef SWIGGO_GCCGO // Set the host compiler struct attribute that will be // used to match gc's struct layout. For example, on 386 Windows, // gcc wants to 8-align int64s, but gc does not. // Use __gcc_struct__ to work around http://gcc.gnu.org/PR52991 on x86, // and https://golang.org/issue/5603. // See: https://github.com/golang/go/blob/fcbf04f9b93b4cd8addd05c2ed784118eb50a46c/src/cmd/cgo/out.go#L663 %insert(runtime) %{ # if !defined(__clang__) && (defined(__i386__) || defined(__x86_64__)) # define SWIGSTRUCTPACKED __attribute__((__packed__, __gcc_struct__)) # else # define SWIGSTRUCTPACKED __attribute__((__packed__)) # endif %} #else # define SWIGSTRUCTPACKED #endif %insert(runtime) %{ typedef struct { char *p; intgo n; } _gostring_; typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} #ifdef SWIGGO_CGO %insert(cgo_comment_typedefs) %{ typedef struct { char *p; intgo n; } _gostring_; typedef struct { void* array; intgo len; intgo cap; } _goslice_; %} #endif #ifndef SWIGGO_GCCGO /* Boilerplate for C/C++ code when using 6g/8g. This code is compiled with gcc. */ %insert(runtime) %{ #define swiggo_size_assert_eq(x, y, name) typedef char name[(x-y)*(x-y)*-2+1]; #define swiggo_size_assert(t, n) swiggo_size_assert_eq(sizeof(t), n, swiggo_sizeof_##t##_is_not_##n) swiggo_size_assert(char, 1) swiggo_size_assert(short, 2) swiggo_size_assert(int, 4) typedef long long swiggo_long_long; swiggo_size_assert(swiggo_long_long, 8) swiggo_size_assert(float, 4) swiggo_size_assert(double, 8) #ifdef __cplusplus extern "C" { #endif extern void crosscall2(void (*fn)(void *, int), void *, int); extern char* _cgo_topofstack(void) __attribute__ ((weak)); extern void _cgo_allocate(void *, int); extern void _cgo_panic(void *, int); #ifdef __cplusplus } #endif static char *_swig_topofstack() { if (_cgo_topofstack) { return _cgo_topofstack(); } else { return 0; } } static void _swig_gopanic(const char *p) { struct { const char *p; } SWIGSTRUCTPACKED a; a.p = p; crosscall2(_cgo_panic, &a, (int) sizeof a); } %} #if !SWIGGO_CGO /* This is here for backward compatibility, but it will not work with Go 1.5 or later. Do not use it in new code. */ %insert(runtime) %{ static void *_swig_goallocate(size_t len) { struct { size_t len; void *ret; } SWIGSTRUCTPACKED a; a.len = len; crosscall2(_cgo_allocate, &a, (int) sizeof a); return a.ret; } %} #endif #if !SWIGGO_CGO /* Boilerplate for C code when using 6g/8g. This code is compiled with 6c/8c. */ %insert(gc_header) %{ #include "runtime.h" #include "cgocall.h" #pragma dataflag 16 static void *cgocall = runtime·cgocall; #pragma dataflag 16 void *·_cgo_runtime_cgocall = &cgocall; %} #endif #else /* Boilerplate for C/C++ code when using gccgo. */ %insert(runtime) %{ #define SWIGGO_GCCGO #ifdef __cplusplus extern "C" { #endif extern void *_cgo_allocate(size_t); extern void _cgo_panic(const char *); #ifdef __cplusplus } #endif #define _swig_goallocate _cgo_allocate #define _swig_gopanic _cgo_panic %} #if !SWIGGO_CGO %insert(runtime) %{ /* Implementations of SwigCgocall and friends for different versions of gccgo. The Go code will call these functions using C names with a prefix of the module name. The implementations here call the routine in libgo. The routines to call vary depending on the gccgo version. We assume that the version of gcc used to compile this file is the same as the version of gccgo. */ #ifdef __cplusplus extern "C" { #endif #define SWIG_GCC_VERSION \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #if SWIG_GCC_VERSION < 40700 #define SwigDoCgocall() #define SwigDoCgocallDone() #define SwigDoCgocallBack() #define SwigDoCgocallBackDone() #elif SWIG_GCC_VERSION == 40700 void SwigDoCgocall(void) __asm__("libgo_syscall.syscall.Entersyscall"); void SwigDoCgocallDone(void) __asm__("libgo_syscall.syscall.Exitsyscall"); void SwigDoCgocallBack(void) __asm__("libgo_syscall.syscall.Exitsyscall"); void SwigDoCgocallBackDone(void) __asm__("libgo_syscall.syscall.Entersyscall"); #else void SwigDoCgocall(void) __asm__("syscall.Cgocall"); void SwigDoCgocallDone(void) __asm__("syscall.CgocallDone"); void SwigDoCgocallBack(void) __asm__("syscall.CgocallBack"); void SwigDoCgocallBackDone(void) __asm__("syscall.CgocallBackDone"); #endif #define SWIGSTRINGIFY2(s) #s #define SWIGSTRINGIFY(s) SWIGSTRINGIFY2(s) void SwigCgocall() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocall"); void SwigCgocall() { SwigDoCgocall(); } void SwigCgocallDone() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallDone"); void SwigCgocallDone() { SwigDoCgocallDone(); } void SwigCgocallBack() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBack"); void SwigCgocallBack() { SwigDoCgocallBack(); } void SwigCgocallBackDone() __asm__(SWIGSTRINGIFY(SWIGGO_PREFIX) ".SwigCgocallBackDone"); void SwigCgocallBackDone() { SwigDoCgocallBackDone(); } #undef SWIGSTRINGIFY #undef SWIGSTRINGIFY2 #ifdef __cplusplus } #endif %} #endif #endif #if !SWIGGO_CGO %insert(runtime) %{ /* This is here for backward compatibility, but it will not work with Go 1.5 or later. Do not use it in new code. */ static _gostring_ _swig_makegostring(const char *p, size_t l) { _gostring_ ret; ret.p = (char*)_swig_goallocate(l + 1); memcpy(ret.p, p, l); ret.n = l; return ret; } %} #endif %insert(runtime) %{ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { _swig_gopanic(msg); } else %} #ifndef SWIGGO_GCCGO %go_import("unsafe", _ "runtime/cgo") #if !SWIGGO_CGO %insert(go_header) %{ var _cgo_runtime_cgocall func(unsafe.Pointer, uintptr) %} #endif #else %go_import("syscall", "unsafe") %insert(go_header) %{ type _ syscall.Sockaddr %} #endif %insert(go_header) %{ type _ unsafe.Pointer %} /* Swig_always_false is used to conditionally assign parameters to Swig_escape_val so that the compiler thinks that they escape. We only assign them if Swig_always_false is true, which it never is. We export the variable so that the compiler doesn't realize that it is never set. */ %insert(go_header) %{ var Swig_escape_always_false bool var Swig_escape_val interface{} %} /* Function pointers are translated by the code in go.cxx into _swig_fnptr. Member pointers are translated to _swig_memberptr. */ %insert(go_header) %{ type _swig_fnptr *byte type _swig_memberptr *byte %} /* Handle memory management for directors. */ %insert(director) %{ #include namespace { struct GCItem { virtual ~GCItem() {} }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem* operator->() { return _item; } private: GCItem *_item; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; } class Swig_memory { public: template void swig_acquire_pointer(Type* vptr) { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } private: typedef std::map swig_ownership_map; swig_ownership_map swig_owner; }; template static void swig_acquire_pointer(Swig_memory** pmem, Type* ptr) { if (!pmem) { *pmem = new Swig_memory; } (*pmem)->swig_acquire_pointer(ptr); } %} /* For directors we need C++ to track a Go pointer. Since we can't pass a Go pointer into C++, we use a map to track the pointers on the Go side. */ %go_import("sync") %insert(go_header) %{ type _ sync.Mutex %} %insert(go_director) %{ var swigDirectorTrack struct { sync.Mutex m map[int]interface{} c int } func swigDirectorAdd(v interface{}) int { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() if swigDirectorTrack.m == nil { swigDirectorTrack.m = make(map[int]interface{}) } swigDirectorTrack.c++ ret := swigDirectorTrack.c swigDirectorTrack.m[ret] = v return ret } func swigDirectorLookup(c int) interface{} { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() ret := swigDirectorTrack.m[c] if ret == nil { panic("C++ director pointer not found (possible use-after-free)") } return ret } func swigDirectorDelete(c int) { swigDirectorTrack.Lock() defer swigDirectorTrack.Unlock() if swigDirectorTrack.m[c] == nil { if c > swigDirectorTrack.c { panic("C++ director pointer invalid (possible memory corruption") } else { panic("C++ director pointer not found (possible use-after-free)") } } delete(swigDirectorTrack.m, c) } %} swig-3.0.12/Lib/go/exception.i0000664000175000017500000000025513042756442015722 0ustar williamwilliam%typemap(throws,noblock=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } %insert("runtime") %{ #define SWIG_exception(code, msg) _swig_gopanic(msg) %} swig-3.0.12/Lib/go/std_list.i0000664000175000017500000000170313042756442015550 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { template > class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef Alloc allocator_type; list(); size_type size() const; bool empty() const; %rename(isEmpty) empty; void clear(); void push_front(const value_type& x); void pop_front(); void push_back(const value_type& x); void pop_back(); void remove(value_type x); void reverse(); void unique(); void sort(); void merge(list& x); }; } swig-3.0.12/Lib/go/cdata.i0000664000175000017500000000444013042756442015000 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.i * * SWIG library file containing macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; intgo len; } SWIGCDATA; %} %fragment("cdata", "header") %{ struct swigcdata { intgo size; void *data; }; %} %typemap(gotype) SWIGCDATA "[]byte" %typemap(imtype) SWIGCDATA "uint64" %typemap(out, fragment="cdata") SWIGCDATA(struct swigcdata *swig_out) %{ swig_out = (struct swigcdata *)malloc(sizeof(*swig_out)); if (swig_out) { swig_out->size = $1.len; swig_out->data = malloc(swig_out->size); if (swig_out->data) { memcpy(swig_out->data, $1.data, swig_out->size); } } $result = *(long long *)(void **)&swig_out; %} %typemap(goout) SWIGCDATA %{ { type swigcdata struct { size int; data uintptr } p := (*swigcdata)(unsafe.Pointer(uintptr($1))) if p == nil || p.data == 0 { $result = nil } else { b := make([]byte, p.size) a := (*[0x7fffffff]byte)(unsafe.Pointer(p.data))[:p.size] copy(b, a) Swig_free(p.data) Swig_free(uintptr(unsafe.Pointer(p))) $result = b } } %} /* ----------------------------------------------------------------------------- * %cdata(TYPE [, NAME]) * * Convert raw C data to a binary string. * ----------------------------------------------------------------------------- */ %define %cdata(TYPE,NAME...) %insert("header") { #if #NAME == "" static SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements) { #else static SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements) { #endif SWIGCDATA d; d.data = (char *) ptr; #if #TYPE != "void" d.len = nelements*sizeof(TYPE); #else d.len = nelements; #endif return d; } } %typemap(default) int nelements "$1 = 1;" #if #NAME == "" SWIGCDATA cdata_##TYPE(TYPE *ptr, int nelements); #else SWIGCDATA cdata_##NAME(TYPE *ptr, int nelements); #endif %enddef %typemap(default) int nelements; %rename(cdata) ::cdata_void(void *ptr, int nelements); %cdata(void); /* Memory move function. Due to multi-argument typemaps this appears to be wrapped as void memmove(void *data, const char *s); */ void memmove(void *data, char *indata, int inlen); swig-3.0.12/Lib/go/std_string.i0000664000175000017500000000433413042756442016106 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a Go string and are passed around by value. * * To use non-const std::string references use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; %typemap(gotype) string, const string & "string" %typemap(in) string %{ $1.assign($input.p, $input.n); %} %typemap(godirectorout) string %{ { p := Swig_malloc(len($input)) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)] copy(s, $input) $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout) string %{ $result.assign($input.p, $input.n); free($input.p); %} %typemap(out,fragment="AllocateString") string %{ $result = Swig_AllocateString($1.data(), $1.length()); %} %typemap(goout,fragment="CopyString") string %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") string %{ $input = Swig_AllocateString($1.data(), $1.length()); %} %typemap(godirectorin,fragment="CopyString") string %{ $result = swigCopyString($input) %} %typemap(in) const string & %{ $*1_ltype $1_str($input.p, $input.n); $1 = &$1_str; %} %typemap(godirectorout) const string & %{ { p := Swig_malloc(len($input)) s := (*[1<<30]byte)(unsafe.Pointer(p))[:len($input)] copy(s, $input) $result = *(*string)(unsafe.Pointer(&s)) } %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ static $*1_ltype $1_str; $1_str.assign($input.p, $input.n); free($input.p); $result = &$1_str; %} %typemap(out,fragment="AllocateString") const string & %{ $result = Swig_AllocateString((*$1).data(), (*$1).length()); %} %typemap(goout,fragment="CopyString") const string & %{ $result = swigCopyString($1) %} %typemap(directorin,fragment="AllocateString") const string & %{ $input = Swig_AllocateString($1.data(), $1.length()); %} %typemap(godirectorin,fragment="CopyString") const string & %{ $result = swigCopyString($input) %} } swig-3.0.12/Lib/go/std_map.i0000664000175000017500000000333213042756442015352 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; } swig-3.0.12/Lib/typemaps/0000775000175000017500000000000013042756442015005 5ustar williamwilliamswig-3.0.12/Lib/typemaps/swigtypemaps.swg0000664000175000017500000001157413042756442020273 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigtypemaps.swg * * Unified Typemap Library frontend * ----------------------------------------------------------------------------- */ /* This file provides the frontend to the Unified Typemap Library. When using this library in a SWIG target language, you need to define a minimum set of fragments, specialize a couple of macros, and then include this file. Typically you will create a 'mytypemaps.swg' file in each target language, where you will have the following sections: === mytypemaps.swg === // Fragment section %include // Unified typemap section %include // Local typemap section === mytypemaps.swg === While we add more docs, please take a look at the following cases to see how you specialized the unified typemap library for a new target language: Lib/python/pytypemaps.swg Lib/tcl/tcltypemaps.swg Lib/ruby/rubytypemaps.swg Lib/perl5/perltypemaps.swg */ #define SWIGUTL SWIGUTL /* ----------------------------------------------------------------------------- * Language specialization section. * * Tune these macros for each language as needed. * ----------------------------------------------------------------------------- */ /* The SWIG target language object must be provided. For example in python you define: #define SWIG_Object PyObject * */ #if !defined(SWIG_Object) #error "SWIG_Object must be defined as the SWIG target language object" #endif /*==== flags for new/convert methods ====*/ #ifndef %convertptr_flags %define %convertptr_flags 0 %enddef #endif #ifndef %newpointer_flags %define %newpointer_flags 0 %enddef #endif #ifndef %newinstance_flags %define %newinstance_flags 0 %enddef #endif /*==== set output ====*/ #ifndef %set_output /* simple set output operation */ #define %set_output(obj) $result = obj #endif /*==== set variable output ====*/ #ifndef %set_varoutput /* simple set varoutput operation */ #define %set_varoutput(obj) $result = obj #endif /*==== append output ====*/ #ifndef %append_output #if defined(SWIG_AppendOutput) /* simple append operation */ #define %append_output(obj) $result = SWIG_AppendOutput($result,obj) #else #error "Language must define SWIG_AppendOutput or %append_output" #endif #endif /*==== set constant ====*/ #ifndef %set_constant #if defined(SWIG_SetConstant) /* simple set constant operation */ #define %set_constant(name,value) SWIG_SetConstant(name,value) #else #error "Language must define SWIG_SetConstant or %set_constant" #endif #endif /*==== raise an exception ====*/ #ifndef %raise #if defined(SWIG_Raise) /* simple raise operation */ #define %raise(obj, type, desc) SWIG_Raise(obj, type, desc); SWIG_fail #else #error "Language must define SWIG_Raise or %raise" #endif #endif /*==== director output exception ====*/ #if defined(SWIG_DIRECTOR_TYPEMAPS) #ifndef SWIG_DirOutFail #define SWIG_DirOutFail(code, msg) Swig::DirectorTypeMismatchException::raise(SWIG_ErrorType(code), msg) #endif #endif /* ----------------------------------------------------------------------------- * Language independent definitions * ----------------------------------------------------------------------------- */ #define %error_block(Block...) %block(Block) #define %default_code(code) SWIG_ArgError(code) #define %argument_fail(code, type, name, argn) SWIG_exception_fail(%default_code(code), %argfail_fmt(type, name, argn)) #define %argument_nullref(type, name, argn) SWIG_exception_fail(SWIG_ValueError, %argnullref_fmt(type, name, argn)) #define %variable_fail(code, type, name) SWIG_exception_fail(%default_code(code), %varfail_fmt(type, name)) #define %variable_nullref(type, name) SWIG_exception_fail(SWIG_ValueError, %varnullref_fmt(type, name)) #if defined(SWIG_DIRECTOR_TYPEMAPS) #define %dirout_fail(code, type) SWIG_DirOutFail(%default_code(code), %outfail_fmt(type)) #define %dirout_nullref(type) SWIG_DirOutFail(SWIG_ValueError, %outnullref_fmt(type)) #endif /* ----------------------------------------------------------------------------- * All the typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include %include %include %include %include %include swig-3.0.12/Lib/typemaps/cstring.swg0000664000175000017500000000024713042756442017203 0ustar williamwilliam%include %typemaps_cstring(%cstring, char, SWIG_AsCharPtr, SWIG_AsCharPtrAndSize, SWIG_FromCharPtr, SWIG_FromCharPtrAndSize); swig-3.0.12/Lib/typemaps/primtypes.swg0000664000175000017500000002377013042756442017574 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive type fragments and macros * ------------------------------------------------------------ */ /* This file provide fragments and macros for the C/C++ primitive types. The file defines default fragments for the following types: bool signed char unsigned char signed wchar_t // in C++ unsigned wchar_t // in C++ short unsigned short int unsigned int float size_t ptrdiff_t which can always be redefined in the swig target language if needed. The fragments for the following types, however, always need to be defined in the target language: long unsigned long long long unsigned long long double If they are not provided, an #error directive will appear in the wrapped code. -------------------------------------------------------------------- This file provides the macro %typemaps_primitive(CheckCode, Type) which generates the typemaps for a primitive type with a given checkcode. It is assumed that the primitive type is 'normalized' and the corresponding SWIG_AsVal(Type) and SWIG_From(Type) methods are provided via fragments. The following auxiliary macros (explained with bash pseudo code) are also defined: %apply_ctypes(Macro) for i in C Type do Macro($i) done %apply_cpptypes(Macro) for i in C++ Type do Macro($i) done %apply_ctypes_2(Macro2) for i in C Type do for j in C Type do Macro_2($i, $j) done done %apply_cpptypes_2(Macro2) for i in C++ Type do for j in C++ Type do Macro_2($i, $j) done done %apply_checkctypes(Macro2) for i in Check Type do Macro2(%checkcode($i), $i) done */ /* ------------------------------------------------------------ * Primitive type fragments * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header",fragment=SWIG_From_frag(long)) { SWIGINTERN SWIG_Object SWIG_From_dec(bool)(bool value) { return SWIG_From(long)(value ? 1 : 0); } } %fragment(SWIG_AsVal_frag(bool),"header",fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(SWIG_Object obj, bool *val) { long v; int res = SWIG_AsVal(long)(obj, val ? &v : 0); if (SWIG_IsOK(res)) { if (val) *val = v ? true : false; return res; } return SWIG_TypeError; } } /* signed/unsigned char */ %numeric_slong(signed char, "", SCHAR_MIN, SCHAR_MAX) %numeric_ulong(unsigned char, "", UCHAR_MAX) /* short/unsigned short */ %numeric_slong(short, "", SHRT_MIN, SHRT_MAX) %numeric_ulong(unsigned short, "", USHRT_MAX) /* int/unsigned int */ %numeric_slong(int, "", INT_MIN, INT_MAX) %numeric_ulong(unsigned int, "", UINT_MAX) /* signed/unsigned wchar_t */ #ifdef __cplusplus %numeric_slong(signed wchar_t, "", WCHAR_MIN, WCHAR_MAX) %numeric_ulong(unsigned wchar_t, "", UWCHAR_MAX) #endif /* float */ %numeric_float(float, "SWIG_Float_Overflow_Check", SWIG_Float_Overflow_Check(v)) /* long/unsigned long */ %ensure_type_fragments(long) %ensure_type_fragments(unsigned long) /* long long/unsigned long long */ %fragment("SWIG_LongLongAvailable","header", fragment="") %{ #if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE) # define SWIG_LONG_LONG_AVAILABLE #endif %} %ensure_type_fragments(long long) %ensure_type_fragments(unsigned long long) /* double */ %ensure_type_fragments(double) /* size_t */ %fragment(SWIG_From_frag(size_t),"header",fragment=SWIG_From_frag(unsigned long),fragment=SWIG_From_frag(unsigned long long)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(size_t)(size_t value) { %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { %#endif return SWIG_From(unsigned long)(%numeric_cast(value, unsigned long)); %#ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(size_t) <= sizeof(unsigned long long) */ return SWIG_From(unsigned long long)(%numeric_cast(value, unsigned long long)); } %#endif } } %fragment(SWIG_AsVal_frag(size_t),"header",fragment=SWIG_AsVal_frag(unsigned long),fragment=SWIG_AsVal_frag(unsigned long long)) { SWIGINTERNINLINE int SWIG_AsVal_dec(size_t)(SWIG_Object obj, size_t *val) { int res = SWIG_TypeError; %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { %#endif unsigned long v; res = SWIG_AsVal(unsigned long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, size_t); %#ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(size_t) <= sizeof(unsigned long long)) { unsigned long long v; res = SWIG_AsVal(unsigned long long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, size_t); } %#endif return res; } } /* ptrdiff_t */ %fragment(SWIG_From_frag(ptrdiff_t),"header",fragment=SWIG_From_frag(long),fragment=SWIG_From_frag(long long)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(ptrdiff_t)(ptrdiff_t value) { %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { %#endif return SWIG_From(long)(%numeric_cast(value, long)); %#ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(ptrdiff_t) <= sizeof(long long) */ return SWIG_From(long long)(%numeric_cast(value, long long)); } %#endif } } %fragment(SWIG_AsVal_frag(ptrdiff_t),"header",fragment=SWIG_AsVal_frag(long),fragment=SWIG_AsVal_frag(long long)) { SWIGINTERNINLINE int SWIG_AsVal_dec(ptrdiff_t)(SWIG_Object obj, ptrdiff_t *val) { int res = SWIG_TypeError; %#ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { %#endif long v; res = SWIG_AsVal(long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, ptrdiff_t); %#ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(ptrdiff_t) <= sizeof(long long)) { long long v; res = SWIG_AsVal(long long)(obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = %numeric_cast(v, ptrdiff_t); } %#endif return res; } } %fragment("SWIG_CanCastAsInteger","header", fragment=SWIG_AsVal_frag(double), fragment="", fragment="") { SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } } /* ------------------------------------------------------------ * Generate the typemaps for primitive type * ------------------------------------------------------------ */ #define %typemaps_primitive(Code, Type) %typemaps_asvalfromn(%arg(Code), Type) /* ------------------------------------------------------------ * Primitive Type Macros * ------------------------------------------------------------ */ /* useful macros to derive typemap declarations from primitive types */ %define _apply_macro(macro, arg2, arg1...) #if #arg1 != "" macro(%arg(arg1),arg2); #else macro(arg2); #endif %enddef /* Apply macro to the C-types */ %define %apply_ctypes(Macro, Arg2...) _apply_macro(Macro, bool , Arg2); _apply_macro(Macro, signed char , Arg2); _apply_macro(Macro, unsigned char , Arg2); _apply_macro(Macro, short , Arg2); _apply_macro(Macro, unsigned short , Arg2); _apply_macro(Macro, int , Arg2); _apply_macro(Macro, unsigned int , Arg2); _apply_macro(Macro, long , Arg2); _apply_macro(Macro, unsigned long , Arg2); _apply_macro(Macro, long long , Arg2); _apply_macro(Macro, unsigned long long , Arg2); _apply_macro(Macro, float , Arg2); _apply_macro(Macro, double , Arg2); _apply_macro(Macro, char , Arg2); _apply_macro(Macro, wchar_t , Arg2); _apply_macro(Macro, size_t , Arg2); _apply_macro(Macro, ptrdiff_t , Arg2); %enddef /* apply the Macro2(Type1, Type2) to all C types */ #define %apply_ctypes_2(Macro2) %apply_ctypes(%apply_ctypes, Macro2) /* apply the Macro(Type) to all C++ types */ %define %apply_cpptypes(Macro, Arg2...) %apply_ctypes(Macro, Arg2) _apply_macro(Macro, std::size_t, Arg2); _apply_macro(Macro, std::ptrdiff_t, Arg2); _apply_macro(Macro, std::string, Arg2); _apply_macro(Macro, std::wstring, Arg2); _apply_macro(Macro, std::complex, Arg2); _apply_macro(Macro, std::complex, Arg2); %enddef /* apply the Macro2(Type1, Type2) to all C++ types */ #define %apply_cpptypes_2(Macro2) %apply_cpptypes(%apply_cpptypes, Macro2) /* apply the Macro2(CheckCode,Type) to all Checked Types */ %define %apply_checkctypes(Macro2) Macro2(%checkcode(BOOL), bool); Macro2(%checkcode(INT8), signed char); Macro2(%checkcode(UINT8), unsigned char); Macro2(%checkcode(INT16), short); Macro2(%checkcode(UINT16), unsigned short); Macro2(%checkcode(INT32), int); Macro2(%checkcode(UINT32), unsigned int); Macro2(%checkcode(INT64), long); Macro2(%checkcode(UINT64), unsigned long); Macro2(%checkcode(INT128), long long); Macro2(%checkcode(UINT128), unsigned long long); Macro2(%checkcode(FLOAT), float); Macro2(%checkcode(DOUBLE), double); Macro2(%checkcode(CHAR), char); Macro2(%checkcode(UNICHAR), wchar_t); Macro2(%checkcode(SIZE), size_t); Macro2(%checkcode(PTRDIFF), ptrdiff_t); %enddef /* ------------------------------------------------------------ * Generate the typemaps for all the primitive types with checkcode * ------------------------------------------------------------ */ %apply_checkctypes(%typemaps_primitive); swig-3.0.12/Lib/typemaps/carrays.swg0000664000175000017500000000517613042756442017204 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.swg * * This library file contains macros that can be used to manipulate simple * pointers as arrays. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(size_t nelements) { return %new_array(nelements, TYPE); } static void delete_##NAME(TYPE *ary) { %delete_array(ary); } static TYPE NAME##_getitem(TYPE *ary, size_t index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, size_t index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(size_t nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, size_t index); void NAME##_setitem(TYPE *ary, size_t index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * cast(); * static NAME *frompointer(TYPE *t); * } * * Use * * %array_class_wrap(TYPE,NAME,GET,SET) * * if you want different names for the get/set methods. * ----------------------------------------------------------------------------- */ %define %array_class_wrap(TYPE,NAME,getitem,setitem) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { NAME(size_t nelements) { return %new_array(nelements, TYPE); } ~NAME() { %delete_array(self); } TYPE getitem(size_t index) { return self[index]; } void setitem(size_t index, TYPE value) { self[index] = value; } TYPE * cast() { return self; } static NAME *frompointer(TYPE *t) { return %static_cast(t, NAME *); } }; %types(NAME = TYPE); %enddef #ifndef %array_class %define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,getitem,setitem) %enddef #endif swig-3.0.12/Lib/typemaps/std_strings.swg0000664000175000017500000000366513042756442020104 0ustar williamwilliam /* defining the String asptr/from methods */ %define %std_string_asptr(String, Char, SWIG_AsCharPtrAndSize, Frag) %fragment(SWIG_AsPtr_frag(String),"header",fragment=Frag) { SWIGINTERN int SWIG_AsPtr_dec(String)(SWIG_Object obj, String **val) { Char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { if (buf) { if (val) *val = new String(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } else { static int init = 0; static swig_type_info* descriptor = 0; if (!init) { descriptor = SWIG_TypeQuery(#String " *"); init = 1; } if (descriptor) { String *vptr; int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); if (SWIG_IsOK(res) && val) *val = vptr; return res; } } return SWIG_ERROR; } } %enddef %define %std_string_from(String, SWIG_FromCharPtrAndSize, Frag) %fragment(SWIG_From_frag(String),"header",fragment=Frag) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(String)(const String& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %enddef %define %std_string_asval(String) %fragment(SWIG_AsVal_frag(String),"header", fragment=SWIG_AsPtr_frag(String)) { SWIGINTERN int SWIG_AsVal_dec(String)(SWIG_Object obj, String *val) { String* v = (String *) 0; int res = SWIG_AsPtr(String)(obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { %delete(v); res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } } %enddef %define %typemaps_std_string(String, Char, AsPtrMethod, FromMethod, CheckCode) %std_string_asptr(String, Char, AsPtrMethod, #AsPtrMethod) %std_string_asval(String) %std_string_from(String, FromMethod, #FromMethod) %typemaps_asptrfromn(%arg(CheckCode), String); %enddef swig-3.0.12/Lib/typemaps/cwstring.swg0000664000175000017500000000031713042756442017370 0ustar williamwilliam%include %include %typemaps_cstring(%cwstring, wchar_t, SWIG_AsWCharPtr, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtr, SWIG_FromWCharPtrAndSize); swig-3.0.12/Lib/typemaps/factory.swg0000664000175000017500000000461113042756442017200 0ustar williamwilliam/* Implement a more natural wrap for factory methods, for example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where circle is a Circle proxy instance. NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); */ %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; %set_output(SWIG_NewPointerObj(%as_voidptr(dobj),$descriptor(Type *), $owner | %newpointer_flags)); } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { %set_output(SWIG_NewPointerObj(%as_voidptr($1),$descriptor, $owner | %newpointer_flags)); } }%enddef swig-3.0.12/Lib/typemaps/ptrtypes.swg0000664000175000017500000001470013042756442017423 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ptrtypes.swg * * Value typemaps (Type, const Type&) for "Ptr" types, such as swig * wrapped classes, that define the AsPtr/From methods * * To apply them, just use one of the following macros: * * %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type) * %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type) * * or the simpler and normalize form: * * %typemaps_asptrfromn(CheckCode, Type) * * Also, you can use the individual typemap definitions: * * %ptr_in_typemap(asptr_meth,frag,Type) * %ptr_varin_typemap(asptr_meth,frag,Type) * %ptr_typecheck_typemap(check,asptr_meth,frag,Type) * %ptr_directorout_typemap(asptr_meth,frag,Type) * ----------------------------------------------------------------------------- */ %include /* in */ %define %ptr_in_typemap(asptr_meth,frag,Type...) %typemap(in,fragment=frag) Type { Type *ptr = (Type *)0; int res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res) || !ptr) { %argument_fail((ptr ? res : SWIG_TypeError), "$type", $symname, $argnum); } $1 = *ptr; if (SWIG_IsNewObj(res)) %delete(ptr); } %typemap(freearg) Type ""; %typemap(in,fragment=frag) const Type & (int res = SWIG_OLDOBJ) { Type *ptr = (Type *)0; res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } if (!ptr) { %argument_nullref("$type",$symname, $argnum); } $1 = ptr; } %typemap(freearg,noblock=1) const Type & { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %enddef /* varin */ %define %ptr_varin_typemap(asptr_meth,frag,Type...) %typemap(varin,fragment=frag) Type { Type *ptr = (Type *)0; int res = asptr_meth($input, &ptr); if (!SWIG_IsOK(res) || !ptr) { %variable_fail((ptr ? res : SWIG_TypeError), "$type", "$name"); } $1 = *ptr; if (SWIG_IsNewObj(res)) %delete(ptr); } %enddef #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorout */ %define %ptr_directorout_typemap(asptr_meth,frag,Type...) %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT ($*ltype temp, int swig_ores) { Type *swig_optr = 0; swig_ores = $result ? asptr_meth($result, &swig_optr) : 0; if (!SWIG_IsOK(swig_ores) || !swig_optr) { %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type"); } temp = *swig_optr; $1 = &temp; if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr); } %typemap(directorout,noblock=1,fragment=frag) Type { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores) || !swig_optr) { %dirout_fail((swig_optr ? swig_ores : SWIG_TypeError),"$type"); } $result = *swig_optr; if (SWIG_IsNewObj(swig_ores)) %delete(swig_optr); } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type* { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores)) { %dirout_fail(swig_ores,"$type"); } $result = swig_optr; if (SWIG_IsNewObj(swig_ores)) { swig_acquire_ownership(swig_optr); } } %typemap(directorfree,noblock=1) Type* { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Type& { Type *swig_optr = 0; int swig_ores = asptr_meth($input, &swig_optr); if (!SWIG_IsOK(swig_ores)) { %dirout_fail(swig_ores,"$type"); } else { if (!swig_optr) { %dirout_nullref("$type"); } } $result = swig_optr; if (SWIG_IsNewObj(swig_ores)) { swig_acquire_ownership(swig_optr); } } %typemap(directorfree,noblock=1) Type& { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type %enddef #else #define %ptr_directorout_typemap(asptr_meth,frag,Type...) #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %define %ptr_typecheck_typemap(check,asptr_meth,frag,Type...) %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type * { int res = asptr_meth($input, (Type**)(0)); $1 = SWIG_CheckState(res); } %typemap(typecheck,noblock=1,precedence=check,fragment=frag) Type, const Type& { int res = asptr_meth($input, (Type**)(0)); $1 = SWIG_CheckState(res); } %enddef /*--------------------------------------------------------------------- * typemap definition for types with asptr method *---------------------------------------------------------------------*/ %define %typemaps_asptr(CheckCode, AsPtrMeth, AsPtrFrag, Type...) %fragment(SWIG_AsVal_frag(Type),"header",fragment=SWIG_AsPtr_frag(Type)) { SWIGINTERNINLINE int SWIG_AsVal(Type)(SWIG_Object obj, Type *val) { Type *v = (Type *)0; int res = SWIG_AsPtr(Type)(obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { %delete(v); res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } } %ptr_in_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_varin_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_directorout_typemap(%arg(AsPtrMeth), %arg(AsPtrFrag), Type); %ptr_typecheck_typemap(%arg(CheckCode), %arg(AsPtrMeth),%arg(AsPtrFrag), Type); %ptr_input_typemap(%arg(CheckCode),%arg(AsPtrMeth),%arg(AsPtrFrag),Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with asptr/from methods *---------------------------------------------------------------------*/ %define %typemaps_asptrfrom(CheckCode, AsPtrMeth, FromMeth, AsPtrFrag, FromFrag, Type...) %typemaps_asptr(%arg(CheckCode), %arg(AsPtrMeth), %arg(AsPtrFrag), Type) %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type); %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type); %ptr_inout_typemap(Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with for 'normalized' asptr/from methods *---------------------------------------------------------------------*/ %define %typemaps_asptrfromn(CheckCode, Type...) %typemaps_asptrfrom(%arg(CheckCode), %arg(SWIG_AsPtr(Type)), %arg(SWIG_From(Type)), %arg(SWIG_AsPtr_frag(Type)), %arg(SWIG_From_frag(Type)), Type); %enddef swig-3.0.12/Lib/typemaps/cpointer.swg0000664000175000017500000000627513042756442017364 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.swg * * This library file contains macros that can be used to manipulate simple * pointer objects. * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { NAME() { return %new_instance(TYPE); } ~NAME() { if ($self) %delete($self); } } %extend NAME { void assign(TYPE value) { *$self = value; } TYPE value() { return *$self; } TYPE * cast() { return $self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { return %new_instance(TYPE); } static TYPE *copy_##NAME(TYPE value) { return %new_copy(value, TYPE); } static void delete_##NAME(TYPE *obj) { if (obj) %delete(obj); } static void NAME ##_assign(TYPE *obj, TYPE value) { *obj = value; } static TYPE NAME ##_value(TYPE *obj) { return *obj; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *obj); void NAME##_assign(TYPE *obj, TYPE value); TYPE NAME##_value(TYPE *obj); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return %static_cast(x, TYPE2); } %} %enddef swig-3.0.12/Lib/typemaps/void.swg0000664000175000017500000000403013042756442016465 0ustar williamwilliam/* ------------------------------------------------------------ * Void * - Accepts any kind of pointer * ------------------------------------------------------------ */ /* in */ %typemap(in,noblock=1) void * (int res) { res = SWIG_ConvertPtr($input,%as_voidptrptr(&$1), 0, $disown); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } } %typemap(freearg) void * ""; %typemap(in,noblock=1) void * const& ($*ltype temp = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&temp), 0, $disown); if (!SWIG_IsOK(res)) { %argument_fail(res, "Stype", $symname, $argnum); } $1 = &temp; } %typemap(freearg) void * const& ""; /* out */ #if defined(VOID_Object) %typemap(out,noblock=1) void { $result = VOID_Object; } #else %typemap(out,noblock=1) void {} #endif /* varin */ %typemap(varin) void * { void *temp = 0; int res = SWIG_ConvertPtr($input, &temp, 0, SWIG_POINTER_DISOWN); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = ($1_ltype) temp; } /* typecheck */ %typecheck(SWIG_TYPECHECK_VOIDPTR, noblock=1) void * { void *ptr = 0; int res = SWIG_ConvertPtr($input, &ptr, 0, 0); $1 = SWIG_CheckState(res); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) void *, void const*, void *const, void const *const, void const *&, void *const &, void const *const & { $input = SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags); } /* directorout */ %typemap(directorout,noblock=1) void * (void *argp, int res) { res = SWIG_ConvertPtr($input, &argp, 0, 0); if (!SWIG_IsOK(res)) { %dirout_fail(res,"$type"); } $result = %reinterpret_cast(argp, $ltype); } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) void * const& (void *argp, int res) { res = SWIG_ConvertPtr($input, &argp, 0, $disown); if (!SWIG_IsOK(res)) { %dirout_fail(res,"$type"); } static $*ltype temp = %reinterpret_cast(argp, $*ltype); $result = &temp; } #endif /* SWIG_DIRECTOR_TYPEMAPS */ swig-3.0.12/Lib/typemaps/cmalloc.swg0000664000175000017500000000460613042756442017147 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cmalloc.swg * * This library file contains macros that can be used to create objects using * the C malloc function. * ----------------------------------------------------------------------------- */ %{ #include %} /* %malloc(TYPE [, NAME = TYPE]) %calloc(TYPE [, NAME = TYPE]) %realloc(TYPE [, NAME = TYPE]) %free(TYPE [, NAME = TYPE]) %allocators(TYPE [,NAME = TYPE]) Creates functions for allocating/reallocating memory. TYPE *malloc_NAME(size_t nbytes = sizeof(TYPE); TYPE *calloc_NAME(size_t nobj=1, size_t size=sizeof(TYPE)); TYPE *realloc_NAME(TYPE *ptr, size_t nbytes); void free_NAME(TYPE *ptr); */ %define %malloc(TYPE,NAME...) #if #NAME != "" %rename(malloc_##NAME) ::malloc(size_t nbytes); #else %rename(malloc_##TYPE) ::malloc(size_t nbytes); #endif #if #TYPE != "void" %typemap(default) size_t nbytes "$1 = (size_t) sizeof(TYPE);" #endif TYPE *malloc(size_t nbytes); %typemap(default) size_t nbytes; %enddef %define %calloc(TYPE,NAME...) #if #NAME != "" %rename(calloc_##NAME) ::calloc(size_t nobj, size_t sz); #else %rename(calloc_##TYPE) ::calloc(size_t nobj, size_t sz); #endif #if #TYPE != "void" %typemap(default) size_t sz "$1 = (size_t) sizeof(TYPE);" #else %typemap(default) size_t sz "$1 = 1;" #endif %typemap(default) size_t nobj "$1 = 1;" TYPE *calloc(size_t nobj, size_t sz); %typemap(default) size_t sz; %typemap(default) size_t nobj; %enddef %define %realloc(TYPE,NAME...) %insert("header") { #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, size_t nitems) #else TYPE *realloc_##TYPE(TYPE *ptr, size_t nitems) #endif { #if #TYPE != "void" return (TYPE *) realloc(ptr, nitems*sizeof(TYPE)); #else return (TYPE *) realloc(ptr, nitems); #endif } } #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, size_t nitems); #else TYPE *realloc_##TYPE(TYPE *ptr, size_t nitems); #endif %enddef %define %free(TYPE,NAME...) #if #NAME != "" %rename(free_##NAME) ::free(TYPE *ptr); #else %rename(free_##TYPE) ::free(TYPE *ptr); #endif void free(TYPE *ptr); %enddef %define %sizeof(TYPE,NAME...) #if #NAME != "" %constant size_t sizeof_##NAME = sizeof(TYPE); #else %constant size_t sizeof_##TYPE = sizeof(TYPE); #endif %enddef %define %allocators(TYPE,NAME...) %malloc(TYPE,NAME) %calloc(TYPE,NAME) %realloc(TYPE,NAME) %free(TYPE,NAME) #if #TYPE != "void" %sizeof(TYPE,NAME) #endif %enddef swig-3.0.12/Lib/typemaps/swigmacros.swg0000664000175000017500000001760313042756442017714 0ustar williamwilliam/* ----------------------------------------------------------------------------- * SWIG API. Portion only visible from SWIG * ----------------------------------------------------------------------------- */ /* This file implements the internal macros of the 'SWIG API', which are useful to implement all the SWIG target languages. Basic preprocessor macros: -------------------------- %arg(Arg) Safe argument wrap %str(Arg) Stringify the argument %begin_block Begin an execution block %end_block End an execution block %block(Block) Execute Block as an execution block %define_as(Def, Val) Define 'Def' as 'Val', expanding Def and Val first %ifcplusplus(V1, V2) if C++ Mode; then V1; else V2; fi Casting Operations: ------------------- SWIG provides the following casting macros, which implement the corresponding C++ casting operations: %const_cast(a, Type) const_cast(a) %static_cast(a, Type) static_cast(a) %reinterpret_cast(a, Type) reinterpret_cast(a) %numeric_cast(a, Type) static_cast(a) %as_voidptr(a) const_cast(static_cast(a)) %as_voidptrptr(a) reinterpret_cast(a) or their C unsafe versions. In C++ we use the safe version unless SWIG_NO_CPLUSPLUS_CAST is defined (usually via the -nocppcast swig flag). Memory allocation: ------------------ These allocation/freeing macros are safe to use in C or C++ and dispatch the proper new/delete/delete[] or free/malloc calls as needed. %new_instance(Type) Allocate a new instance of given Type %new_copy(value,Type) Allocate and initialize a new instance with 'value' %new_array(size,Type) Allocate a new array with given size and Type and zero initialize %new_copy_array(cptr,size,Type) Allocate and initialize a new array from 'cptr' %delete(cptr) Delete an instance %delete_array(cptr) Delete an array Auxiliary loop macros: ---------------------- %formacro(Macro, Args...) or %formacro_1(Macro, Args...) for i in Args do Macro($i) done %formacro_2(Macro2, Args...) for i,j in Args do Macro2($i, $j) done Flags and conditional macros: ----------------------------- %mark_flag(flag) flag := True %evalif(flag,expr) if flag; then expr fi %evalif_2(flag1 flag2,expr) if flag1 and flag2; then expr fi */ /* ----------------------------------------------------------------------------- * Basic preprocessor macros * ----------------------------------------------------------------------------- */ #define %arg(Arg...) Arg #define %str(Arg) `Arg` #ifndef %begin_block # define %begin_block do { #endif #ifndef %end_block # define %end_block } while(0) #endif #define %block(Block...) %begin_block Block; %end_block /* define a new macro */ %define %define_as(Def, Val...)%#define Def Val %enddef /* include C++ or else value */ %define %ifcplusplus(cppval, nocppval) #ifdef __cplusplus cppval #else nocppval #endif %enddef /* insert the SWIGVERSION in the interface and the wrapper code */ #if SWIG_VERSION %insert("header") { %define_as(SWIGVERSION, SWIG_VERSION) %#define SWIG_VERSION SWIGVERSION } #endif /* ----------------------------------------------------------------------------- * Casting operators * ----------------------------------------------------------------------------- */ #if defined(SWIG_NO_CPLUSPLUS_CAST) /* Disable 'modern' cplusplus casting operators */ # if defined(SWIG_CPLUSPLUS_CAST) # undef SWIG_CPLUSPLUS_CAST # endif #endif #if defined(__cplusplus) && defined(SWIG_CPLUSPLUS_CAST) # define %const_cast(a,Type...) const_cast< Type >(a) # define %static_cast(a,Type...) static_cast< Type >(a) # define %reinterpret_cast(a,Type...) reinterpret_cast< Type >(a) # define %numeric_cast(a,Type...) static_cast< Type >(a) #else /* C case */ # define %const_cast(a,Type...) (Type)(a) # define %static_cast(a,Type...) (Type)(a) # define %reinterpret_cast(a,Type...) (Type)(a) # define %numeric_cast(a,Type...) (Type)(a) #endif /* __cplusplus */ #define %as_voidptr(a) SWIG_as_voidptr(a) #define %as_voidptrptr(a) SWIG_as_voidptrptr(a) %insert("header") { %define_as(SWIG_as_voidptr(a), %const_cast(%static_cast(a,const void *), void *)) %define_as(SWIG_as_voidptrptr(a), ((void)%as_voidptr(*a),%reinterpret_cast(a, void**))) } /* ----------------------------------------------------------------------------- * Allocating/freeing elements * ----------------------------------------------------------------------------- */ #if defined(__cplusplus) # define %new_instance(Type...) (new Type()) # define %new_copy(val,Type...) (new Type(%static_cast(val, const Type&))) # define %new_array(size,Type...) (new Type[size]()) # define %new_copy_array(ptr,size,Type...) %reinterpret_cast(memcpy(new Type[size], ptr, sizeof(Type)*(size)), Type*) # define %delete(cptr) delete cptr # define %delete_array(cptr) delete[] cptr #else /* C case */ # define %new_instance(Type...) (Type *)calloc(1,sizeof(Type)) # define %new_copy(val,Type...) (Type *)memcpy(%new_instance(Type),&val,sizeof(Type)) # define %new_array(size,Type...) (Type *)calloc(size, sizeof(Type)) # define %new_copy_array(ptr,size,Type...) (Type *)memcpy(malloc((size)*sizeof(Type)), ptr, sizeof(Type)*(size)) # define %delete(cptr) free((char*)cptr) # define %delete_array(cptr) free((char*)cptr) #endif /* __cplusplus */ /* ----------------------------------------------------------------------------- * SWIG names and mangling * ----------------------------------------------------------------------------- */ #define %mangle(Type...) #@Type #define %descriptor(Type...) SWIGTYPE_ ## #@Type #define %string_name(Name) "SWIG_" %str(Name) #define %symbol_name(Name, Type...) SWIG_ ## Name ## _ #@Type #define %checkcode(Code) SWIG_TYPECHECK_ ## Code /* ----------------------------------------------------------------------------- * Auxiliary loop macros * ----------------------------------------------------------------------------- */ /* for loop for macro with one argument */ %define %_formacro_1(macro, arg1,...)macro(arg1) #if #__VA_ARGS__ != "__fordone__" %_formacro_1(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with one argument */ %define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef %define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef /* for loop for macro with two arguments */ %define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) #if #__VA_ARGS__ != "__fordone__" %_formacro_2(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef /* ----------------------------------------------------------------------------- * SWIG flags * ----------------------------------------------------------------------------- */ /* mark a flag, ie, define a macro name but ignore it in the interface. the flag can be later used with %evalif */ %define %mark_flag(x) %define x 1 %enddef %enddef /* %evalif and %evalif_2 are use to evaluate or process an expression if the given predicate is 'true' (1). */ %define %_evalif(_x,_expr) #if _x == 1 _expr #endif %enddef %define %_evalif_2(_x,_y,_expr) #if _x == 1 && _y == 1 _expr #endif %enddef %define %evalif(_x,_expr...) %_evalif(%arg(_x),%arg(_expr)) %enddef %define %evalif_2(_x,_y,_expr...) %_evalif_2(%arg(_x),%arg(_y),%arg(_expr)) %enddef swig-3.0.12/Lib/typemaps/std_wstring.swg0000664000175000017500000000062013042756442020074 0ustar williamwilliam%include #ifndef SWIG_STD_BASIC_STRING #define SWIG_STD_WSTRING %include %{ #include %} %fragment(""); namespace std { %naturalvar wstring; class wstring; } %typemaps_std_string(std::wstring, wchar_t, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtrAndSize, %checkcode(STDUNISTRING)); #else %include #endif swig-3.0.12/Lib/typemaps/enumint.swg0000664000175000017500000000236413042756442017213 0ustar williamwilliam/* ------------------------------------------------------------ * Enums mapped as integer values * ------------------------------------------------------------ */ %apply int { enum SWIGTYPE }; %apply const int& { const enum SWIGTYPE & }; %apply const int& { const enum SWIGTYPE && }; %typemap(in,fragment=SWIG_AsVal_frag(int),noblock=1) const enum SWIGTYPE & (int val, int ecode, $basetype temp) { ecode = SWIG_AsVal(int)($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } else { temp = %static_cast(val,$basetype); $1 = &temp; } } %typemap(in,fragment=SWIG_AsVal_frag(int),noblock=1) const enum SWIGTYPE && (int val, int ecode, $basetype temp) { ecode = SWIG_AsVal(int)($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } else { temp = %static_cast(val,$basetype); $1 = &temp; } } %typemap(varin,fragment=SWIG_AsVal_frag(int),noblock=1) enum SWIGTYPE { if (sizeof(int) != sizeof($1)) { %variable_fail(SWIG_AttributeError,"$type", "arch, read-only $name"); } else { int ecode = SWIG_AsVal(int)($input, %reinterpret_cast(&$1,int*)); if (!SWIG_IsOK(ecode)) { %variable_fail(ecode, "$type", "$name"); } } } swig-3.0.12/Lib/typemaps/strings.swg0000664000175000017500000004456613042756442017237 0ustar williamwilliam// // Use the macro SWIG_PRESERVE_CARRAY_SIZE if you prefer to preserve // the size of char arrays, ie // ------------------------------------------ // C Side => Language Side // ------------------------------------------ // char name[5] = "hola" => 'hola\0' // // the default behaviour is // // char name[5] = "hola" => 'hola' // // //#define SWIG_PRESERVE_CARRAY_SIZE /* ------------------------------------------------------------ * String typemaps for type Char (char or wchar_t) * ------------------------------------------------------------ */ %define %_typemap_string(StringCode, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_AsCharPtr, SWIG_FromCharPtr, SWIG_AsCharArray, SWIG_NewCopyCharArray, SWIG_DeleteCharArray) /* in */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtr) Char * (int res, Char *buf = 0, int alloc = 0), const Char * (int res, Char *buf = 0, int alloc = 0) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); } %typemap(freearg,noblock=1,match="in") Char *, const Char * { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } %typemap(in,noblock=1,fragment=#SWIG_AsCharPtr) Char const*& (int res, Char *buf = 0, int alloc = 0) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = &buf; } %typemap(freearg, noblock=1,match="in") Char const*& { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* out */ %typemap(out,noblock=1,fragment=#SWIG_FromCharPtr) Char *, const Char * { %set_output(SWIG_FromCharPtr((const Char *)$1)); } %typemap(out,noblock=1,fragment=#SWIG_FromCharPtr) Char const*& { %set_output(SWIG_FromCharPtr(*$1)); } %typemap(newfree,noblock=1) Char * { SWIG_DeleteCharArray($1); } /* varin */ %typemap(varin,fragment=#SWIG_AsCharPtrAndSize) Char * { Char *cptr = 0; size_t csize = 0; int alloc = SWIG_NEWOBJ; int res = SWIG_AsCharPtrAndSize($input, &cptr, &csize, &alloc); if (!SWIG_IsOK(res)) { %variable_fail(res,"$type","$name"); } if ($1) SWIG_DeleteCharArray($1); if (alloc == SWIG_NEWOBJ) { $1 = cptr; } else { $1 = csize ? ($1_type)SWIG_NewCopyCharArray(cptr, csize, Char) : 0; } } %typemap(varin,fragment=#SWIG_AsCharPtrAndSize,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { Char *cptr = 0; size_t csize = 0; int alloc = SWIG_NEWOBJ; int res = SWIG_AsCharPtrAndSize($input, &cptr, &csize, &alloc); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (alloc == SWIG_NEWOBJ) { $1 = cptr; } else { $1 = csize ? ($1_type)SWIG_NewCopyCharArray(cptr, csize, Char) : 0; } } /* varout */ %typemap(varout,noblock=1,fragment=#SWIG_FromCharPtr) Char *, const Char * { %set_varoutput(SWIG_FromCharPtr($1)); } /* memberin */ %typemap(memberin,noblock=1) Char * { if ($1) SWIG_DeleteCharArray($1); if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast($input, const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray(%reinterpret_cast($input, const Char *), size, Char); } else { $1 = 0; } } %typemap(memberin,noblock=1,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast(%reinterpret_cast($input, const Char *), const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } /* globalin */ %typemap(globalin,noblock=1) Char * { if ($1) SWIG_DeleteCharArray($1); if ($input) { size_t size = SWIG_CharPtrLen(%reinterpret_cast(%reinterpret_cast($input, const Char *), const Char *)) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } %typemap(globalin,noblock=1,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const Char * { if ($input) { size_t size = SWIG_CharPtrLen($input) + 1; $1 = ($1_type)SWIG_NewCopyCharArray($input, size, Char); } else { $1 = 0; } } /* constant */ %typemap(constcode,noblock=1,fragment=#SWIG_FromCharPtr) Char *, Char const*, Char * const, Char const* const { %set_constant("$symname", SWIG_FromCharPtr($value)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1,fragment=#SWIG_FromCharPtr) Char *, Char const*, Char *const, Char const *const, Char const *&, Char *const &, Char const *const & { $input = SWIG_FromCharPtr((const Char *)$1); } /* directorout */ %typemap(directorout,noblock=1,fragment=#SWIG_AsCharPtr,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Char * (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } if (alloc == SWIG_NEWOBJ) { swig_acquire_ownership_array(buf); } $result = %reinterpret_cast(buf, $1_ltype); } %typemap(directorfree,noblock=1) Char * { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,noblock=1,fragment=#SWIG_AsCharPtr,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) Char *const& (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ), Char const*const& (int res, Char *buf = 0, int alloc = SWIG_NEWOBJ) { res = SWIG_AsCharPtr($input, &buf, &alloc); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } static $*1_ltype tmp = buf; $result = &tmp; if (alloc == SWIG_NEWOBJ) { swig_acquire_ownership_array(buf); } } %typemap(directorfree,noblock=1) Char * const&, Char const* const& { if (director) { director->swig_release_ownership(%as_voidptr(*$input)); } } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %typemap(typecheck,noblock=1,precedence=StringCode, fragment=#SWIG_AsCharPtr) Char *, const Char *, Char const*& { int res = SWIG_AsCharPtr($input, 0, 0); $1 = SWIG_CheckState(res); } /* throws */ %typemap(throws,noblock=1,fragment=#SWIG_FromCharPtr) Char * { %raise(SWIG_FromCharPtr($1), "$type", 0); } /* ------------------------------------------------------------ * Unknown size const Character array Char[ANY] handling * ------------------------------------------------------------ */ %apply Char * { Char [] }; %apply const Char * { const Char [] }; %typemap(varin,noblock=1,warning="462:Unable to set variable of type Char []") Char [] { %variable_fail(SWIG_AttributeError, "$type", "read-only $name"); } /* ------------------------------------------------------------ * Fixed size Character array Char[ANY] handling * ------------------------------------------------------------ */ /* memberin and globalin typemaps */ %typemap(memberin,noblock=1) Char [ANY] { if ($input) memcpy($1,$input,$1_dim0*sizeof(Char)); else memset($1,0,$1_dim0*sizeof(Char)); } %typemap(globalin,noblock=1) Char [ANY] { if ($input) memcpy($1,$input,$1_dim0*sizeof(Char)); else memset($1,0,$1_dim0*sizeof(Char)); } /* in */ %typemap(in,noblock=1,fragment=#SWIG_AsCharArray) Char [ANY] (Char temp[$1_dim0], int res), const Char [ANY](Char temp[$1_dim0], int res) { res = SWIG_AsCharArray($input, temp, $1_dim0); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(temp, $1_ltype); } %typemap(freearg) Char [ANY], const Char [ANY] ""; %typemap(in,noblock=1,fragment=#SWIG_AsCharArray) const Char (&)[ANY] (Char temp[$1_dim0], int res) { res = SWIG_AsCharArray($input, temp, $1_dim0); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = &temp; } %typemap(freearg) const Char (&)[ANY] ""; %typemap(out,fragment=#SWIG_FromCharPtrAndSize,fragment=#SWIG_CharBufLen) Char [ANY], const Char[ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %set_output(SWIG_FromCharPtrAndSize($1, size)); } /* varin */ %typemap(varin,fragment=#SWIG_AsCharArray) Char [ANY] { int res = SWIG_AsCharArray($input, $1, $1_dim0); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } /* varout */ %typemap(varout,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %set_varoutput(SWIG_FromCharPtrAndSize($1, size)); } /* constant */ %typemap(constcode,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $value_dim0; %#endif %set_constant("$symname", SWIG_FromCharPtrAndSize($value,size)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,fragment=#SWIG_CharBufLen) Char [ANY], const Char [ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif $input = SWIG_FromCharPtrAndSize($1, size); } /* directorout */ %typemap(directorout,noblock=1,fragment=#SWIG_AsCharArray) Char [ANY] (Char temp[$result_dim0]), const Char [ANY] (Char temp[$result_dim0], int res) { res = SWIG_AsCharArray($input, temp, $result_dim0); if (!SWIG_IsOK(res)) { %dirout_fail(res, "$type"); } $result = temp; } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* typecheck */ %typemap(typecheck,noblock=1,precedence=StringCode, fragment=#SWIG_AsCharArray) Char [ANY], const Char[ANY] { int res = SWIG_AsCharArray($input, (Char *)0, $1_dim0); $1 = SWIG_CheckState(res); } /* throws */ %typemap(throws,fragment=#SWIG_CharBufLen) Char [ANY], const Char[ANY] { %#ifndef SWIG_PRESERVE_CARRAY_SIZE size_t size = SWIG_CharBufLen($1, $1_dim0); %#else size_t size = $1_dim0; %#endif %raise(SWIG_FromCharPtrAndSize($1, size), "$type", 0); } /* ------------------------------------------------------------------- * --- Really fix size Char arrays, including '\0'chars at the end --- * ------------------------------------------------------------------- */ %typemap(varout,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %set_varoutput(SWIG_FromCharPtrAndSize($1, $1_dim0)); } %typemap(out,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %set_output(SWIG_FromCharPtrAndSize($1, $1_dim0)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) %typemap(directorin,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { $input = SWIG_FromCharPtrAndSize($1, $1_dim0); } #endif /* SWIG_DIRECTOR_TYPEMAPS */ %typemap(throws,noblock=1,fragment=#SWIG_FromCharPtrAndSize) Char FIXSIZE[ANY], const Char FIXSIZE[ANY] { %raise(SWIG_FromCharPtrAndSize($1, $1_dim0), "$type", 0); } /* ------------------------------------------------------------ * --- String & length --- * ------------------------------------------------------------ */ /* Here len doesn't include the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (Char *STRING, size_t LENGTH) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (const Char *STRING, size_t LENGTH) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); $2 = %numeric_cast(size - 1, $2_ltype); } %typemap(freearg,noblock=1,match="in") (Char *STRING, size_t LENGTH) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (Char *STRING, int LENGTH) = (Char *STRING, size_t LENGTH); %typemap(freearg) (Char *STRING, int LENGTH) = (Char *STRING, size_t LENGTH); /* Here size includes the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (Char *STRING, size_t SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (const Char *STRING, size_t SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $1 = %reinterpret_cast(buf, $1_ltype); $2 = %numeric_cast(size, $2_ltype); } %typemap(freearg,noblock=1,match="in") (Char *STRING, size_t SIZE) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (Char *STRING, int SIZE) = (Char *STRING, size_t SIZE); %typemap(freearg) (Char *STRING, int SIZE) = (Char *STRING, size_t SIZE); /* reverse order versions */ /* Here len doesn't include the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (size_t LENGTH, Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (size_t LENGTH, const Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } $2 = %reinterpret_cast(buf, $2_ltype) ; $1 = %numeric_cast(size - 1, $1_ltype) ; } %typemap(freearg, noblock=1, match="in") (size_t LENGTH, Char *STRING) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (int LENGTH, Char *STRING) = (size_t LENGTH, Char *STRING); %typemap(freearg) (int LENGTH, Char *STRING) = (size_t LENGTH, Char *STRING); /* Here size includes the '0' terminator */ %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (size_t SIZE, Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0), (size_t SIZE, const Char *STRING) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type",$symname, $argnum); } $2 = %reinterpret_cast(buf, $2_ltype) ; $1 = %numeric_cast(size, $1_ltype) ; } %typemap(freearg, noblock=1, match="in") (size_t SIZE, Char *STRING) { if (alloc$argnum == SWIG_NEWOBJ) SWIG_DeleteCharArray(buf$argnum); } /* old 'int' form */ %typemap(in) (int SIZE, Char *STRING) = (size_t SIZE, Char *STRING); %typemap(freearg) (int SIZE, Char *STRING) = (size_t SIZE, Char *STRING); %enddef /* ------------------------------------------------------------ * --- String fragment methods --- * ------------------------------------------------------------ */ #ifndef %_typemap2_string %define %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %fragment("SWIG_From"#CharName"Ptr","header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From##CharName##Ptr(const Char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? SWIG_CharPtrLen(cptr) : 0)); } } %fragment("SWIG_From"#CharName"Array","header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From##CharName##Array(const Char *cptr, size_t size) { return SWIG_FromCharPtrAndSize(cptr, size); } } %fragment("SWIG_As" #CharName "Ptr","header",fragment=#SWIG_AsCharPtrAndSize) { %define_as(SWIG_As##CharName##Ptr(obj, val, alloc), SWIG_AsCharPtrAndSize(obj, val, NULL, alloc)) } %fragment("SWIG_As" #CharName "Array","header",fragment=#SWIG_AsCharPtrAndSize) { SWIGINTERN int SWIG_As##CharName##Array(SWIG_Object obj, Char *val, size_t size) { Char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); if (SWIG_IsOK(res)) { /* special case of single char conversion when we don't need space for NUL */ if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; if (csize <= size) { if (val) { if (csize) memcpy(val, cptr, csize*sizeof(Char)); if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(Char)); } if (alloc == SWIG_NEWOBJ) { SWIG_DeleteCharArray(cptr); res = SWIG_DelNewMask(res); } return res; } if (alloc == SWIG_NEWOBJ) SWIG_DeleteCharArray(cptr); } return SWIG_TypeError; } } /* Char */ %fragment(SWIG_From_frag(Char),"header",fragment=#SWIG_FromCharPtrAndSize) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(Char)(Char c) { return SWIG_FromCharPtrAndSize(&c,1); } } %fragment(SWIG_AsVal_frag(Char),"header", fragment="SWIG_As"#CharName"Array", fragment=FragLimits, fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(Char)(SWIG_Object obj, Char *val) { int res = SWIG_As##CharName##Array(obj, val, 1); if (!SWIG_IsOK(res)) { long v; res = SWIG_AddCast(SWIG_AsVal(long)(obj, &v)); if (SWIG_IsOK(res)) { if ((CHAR_MIN <= v) && (v <= CHAR_MAX)) { if (val) *val = %numeric_cast(v, Char); } else { res = SWIG_OverflowError; } } } return res; } } %_typemap_string(StringCode, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_As##CharName##Ptr, SWIG_From##CharName##Ptr, SWIG_As##CharName##Array, SWIG_NewCopyCharArray, SWIG_DeleteCharArray) %enddef #endif /* ------------------------------------------------------------ * String typemaps and fragments, with default allocators * ------------------------------------------------------------ */ %define %typemaps_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, FragLimits, CHAR_MIN, CHAR_MAX) %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, %new_copy_array, %delete_array, FragLimits, CHAR_MIN, CHAR_MAX) %enddef /* ------------------------------------------------------------ * String typemaps and fragments, with custom allocators * ------------------------------------------------------------ */ %define %typemaps_string_alloc(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %_typemap2_string(StringCode, CharCode, Char, CharName, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, SWIG_CharPtrLen, SWIG_CharBufLen, SWIG_NewCopyCharArray, SWIG_DeleteCharArray, FragLimits, CHAR_MIN, CHAR_MAX) %enddef swig-3.0.12/Lib/typemaps/valtypes.swg0000664000175000017500000001574313042756442017410 0ustar williamwilliam/*--------------------------------------------------------------------- * Value typemaps (Type, const Type&) for value types, such as * fundamental types (int, double), that define the AsVal/From * methods. * * To apply them, just use one of the following macros: * * %typemaps_from(FromMeth, FromFrag, Type) * %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type) * %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth, AsValFrag, FromFrag, Type) * * or the simpler and normalize form: * * %typemaps_asvalfromn(CheckCode, Type) * * Also, you can use the individual typemap definitions: * * %value_in_typemap(asval_meth,frag,Type) * %value_varin_typemap(asval_meth,frag,Type) * %value_typecheck_typemap(checkcode,asval_meth,frag,Type) * %value_directorout_typemap(asval_meth,frag,Type) * * %value_out_typemap(from_meth,frag,Type) * %value_varout_typemap(from_meth,frag,Type) * %value_constcode_typemap(from_meth,frag,Type) * %value_directorin_typemap(from_meth,frag,Type) * %value_throws_typemap(from_meth,frag,Type) * *---------------------------------------------------------------------*/ /* in */ %define %value_in_typemap(asval_meth,frag,Type...) %typemap(in,noblock=1,fragment=frag) Type (Type val, int ecode = 0) { ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$ltype", $symname, $argnum); } $1 = %static_cast(val,$ltype); } %typemap(freearg) Type ""; %typemap(in,noblock=1,fragment=frag) const Type & ($*ltype temp, Type val, int ecode = 0) { ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype", $symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; } %typemap(freearg) const Type& ""; %enddef /* out */ %define %value_out_typemap(from_meth,frag,Type...) %typemap(out,noblock=1,fragment=frag) Type, const Type { %set_output(from_meth(%static_cast($1,Type))); } %typemap(out,noblock=1,fragment=frag) const Type& { %set_output(from_meth(%static_cast(*$1,Type))); } %enddef /* varin */ %define %value_varin_typemap(asval_meth,frag,Type...) %typemap(varin,fragment=frag) Type { Type val; int res = asval_meth($input, &val); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = %static_cast(val,$ltype); } %enddef /* varout */ %define %value_varout_typemap(from_meth,frag,Type...) %typemap(varout,noblock=1,fragment=frag) Type, const Type& { %set_varoutput(from_meth(%static_cast($1,Type))); } %enddef /* constant installation code */ %define %value_constcode_typemap(from_meth,frag,Type...) %typemap(constcode,noblock=1,fragment=frag) Type { %set_constant("$symname", from_meth(%static_cast($value,Type))); } %enddef #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %define %value_directorin_typemap(from_meth,frag,Type...) %typemap(directorin,noblock=1,fragment=frag) Type *DIRECTORIN { $input = from_meth(%static_cast(*$1,Type)); } %typemap(directorin,noblock=1,fragment=frag) Type, const Type& { $input = from_meth(%static_cast($1,Type)); } %enddef /* directorout */ %define %value_directorout_typemap(asval_meth,frag,Type...) %typemap(directorargout,noblock=1,fragment=frag) Type *DIRECTOROUT(Type swig_val, int swig_res) { swig_res = asval_meth($result, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } *$1 = swig_val; } %typemap(directorout,noblock=1,fragment=frag) Type { Type swig_val; int swig_res = asval_meth($input, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } $result = %static_cast(swig_val,$type); } %typemap(directorout,noblock=1,fragment=frag,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) const Type& { Type swig_val; int swig_res = asval_meth($input, &swig_val); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res, "$type"); } $basetype *temp = new $basetype(($basetype)swig_val); swig_acquire_ownership(temp); $result = temp; } %typemap(directorfree,noblock=1) const Type & { if (director) { director->swig_release_ownership(%as_voidptr($input)); } } %typemap(directorout,fragment=frag) Type &DIRECTOROUT = Type %enddef #else #define %value_directorin_typemap(from_meth,frag,Type...) #define %value_directorout_typemap(asval_meth,frag,Type...) #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* throws */ %define %value_throws_typemap(from_meth,frag,Type...) %typemap(throws,noblock=1,fragment=frag) Type { %raise(from_meth(%static_cast($1,Type)), "$type", 0); } %enddef /* typecheck */ %define %value_typecheck_typemap(check,asval_meth,frag,Type...) %typemap(typecheck,precedence=check,fragment=frag) Type, const Type& { int res = asval_meth($input, NULL); $1 = SWIG_CheckState(res); } %enddef /*--------------------------------------------------------------------- * typemap definition for types with AsVal methods *---------------------------------------------------------------------*/ %define %typemaps_asval(CheckCode, AsValMeth, AsValFrag, Type...) %value_in_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_varin_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_directorout_typemap(%arg(AsValMeth), %arg(AsValFrag), Type); %value_typecheck_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %value_input_typemap(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with from method *---------------------------------------------------------------------*/ %define %typemaps_from(FromMeth, FromFrag, Type...) %value_out_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_varout_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_constcode_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_directorin_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_throws_typemap(%arg(FromMeth), %arg(FromFrag), Type); %value_output_typemap(%arg(FromMeth), %arg(FromFrag), Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with alval/from method *---------------------------------------------------------------------*/ %define %typemaps_asvalfrom(CheckCode, AsValMeth, FromMeth, AsValFrag, FromFrag, Type...) %typemaps_asval(%arg(CheckCode), %arg(AsValMeth), %arg(AsValFrag), Type); %typemaps_from(%arg(FromMeth), %arg(FromFrag), Type); %value_inout_typemap(Type); %enddef /*--------------------------------------------------------------------- * typemap definition for types with for 'normalized' asval/from methods *---------------------------------------------------------------------*/ %define %typemaps_asvalfromn(CheckCode, Type...) %typemaps_asvalfrom(%arg(CheckCode), SWIG_AsVal(Type), SWIG_From(Type), %arg(SWIG_AsVal_frag(Type)), %arg(SWIG_From_frag(Type)), Type); %enddef swig-3.0.12/Lib/typemaps/misctypes.swg0000664000175000017500000000072313042756442017551 0ustar williamwilliam /* ------------------------------------------------------------ * --- ANSI/Posix C/C++ types --- * ------------------------------------------------------------ */ #ifdef __cplusplus %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; %apply ptrdiff_t { std::ptrdiff_t }; %apply const ptrdiff_t& { const std::ptrdiff_t& }; #ifndef SWIG_INOUT_NODEF %apply size_t& { std::size_t& }; %apply ptrdiff_t& { std::ptrdiff_t& }; #endif #endif swig-3.0.12/Lib/typemaps/string.swg0000664000175000017500000000141113042756442017032 0ustar williamwilliam%ensure_fragment(SWIG_AsCharPtrAndSize) %ensure_fragment(SWIG_FromCharPtrAndSize) %types(char *); %fragment("SWIG_pchar_descriptor","header") { SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } } %fragment("SWIG_strnlen","header",fragment="SWIG_FromCharPtrAndSize") { SWIGINTERN size_t SWIG_strnlen(const char* s, size_t maxlen) { const char *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } } %include %typemaps_string(%checkcode(STRING), %checkcode(CHAR), char, Char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, strlen, SWIG_strnlen, "", CHAR_MIN, CHAR_MAX) swig-3.0.12/Lib/typemaps/std_except.swg0000664000175000017500000000233413042756442017673 0ustar williamwilliam%include /* Mark all of std exception classes as "exception classes" via the "exceptionclass" feature. If needed, you can disable it by using %noexceptionclass. */ %define %std_exception_map(Exception, Code) %exceptionclass Exception; #if !defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) %typemap(throws,noblock=1) Exception { SWIG_exception_fail(Code, $1.what()); } %ignore Exception; struct Exception { }; #endif %enddef namespace std { %std_exception_map(bad_cast, SWIG_TypeError); %std_exception_map(bad_exception, SWIG_SystemError); %std_exception_map(domain_error, SWIG_ValueError); %std_exception_map(exception, SWIG_SystemError); %std_exception_map(invalid_argument, SWIG_ValueError); %std_exception_map(length_error, SWIG_IndexError); %std_exception_map(logic_error, SWIG_RuntimeError); %std_exception_map(out_of_range, SWIG_IndexError); %std_exception_map(overflow_error, SWIG_OverflowError); %std_exception_map(range_error, SWIG_OverflowError); %std_exception_map(runtime_error, SWIG_RuntimeError); %std_exception_map(underflow_error, SWIG_OverflowError); } %include swig-3.0.12/Lib/typemaps/implicit.swg0000664000175000017500000001156213042756442017346 0ustar williamwilliam/* The %implicit macro allows a SwigType (Class) to be accepted as an input parameter and use its implicit constructors when needed. For example: %implicit(A, int, double, B); %inline { struct B { }; struct A { int ii; A(int i) { ii = 1; } A(double d) { ii = 2; } A(const B& b) { ii = 3; } }; int get(A a) { return a.ii; } } Here, you can call 'get' as get(1) ==> get(A(1)) get(2.0) ==> get(A(2.0)) get(B()) ==> get(A(B())) and swig will construct an 'A' temporal variable using the corresponding implicit constructor. The plain implicit macro takes care of simple type list. If it doesn't work because you are passing template types with commas, then use the %implicit_{1,2,3} versions and/or the %arg macro. */ %define %implicit_type(Type...) %traits_swigtype(Type); %enddef %define %implicit_frag(Type...) ,fragment=SWIG_Traits_frag(Type) %enddef %define %implicit_code(Type...) { Type _v; int res = swig::asval(obj, &_v); if (SWIG_IsOK(res)) { if (val) *val = new value_type(static_cast(_v)); return SWIG_AddNewMask(res); } } %enddef /* implicit */ %define %implicit(Type, ...) %formacro_1(%implicit_type,__VA_ARGS__); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits" %formacro_1(%implicit_frag,__VA_ARGS__)) %{ namespace swig { template <> struct traits { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %formacro_1(%implicit_code,__VA_ARGS__) } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_1 */ %define %implicit_1(Type, Imp1) %traits_swigtype(Imp1); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %implicit_code(Imp1); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_2 */ %define %implicit_2(Type, Imp1, Imp2) %traits_swigtype(Imp1); %traits_swigtype(Imp2); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1), fragment=SWIG_Traits_frag(Imp2)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { %implicit_code(Imp1); %implicit_code(Imp2); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef /* implicit_3 */ %define %implicit_3(Type, Imp1, Imp2, Imp3) %traits_swigtype(Imp1); %traits_swigtype(Imp2); %traits_swigtype(Imp3); %fragment(SWIG_Traits_frag(Type),"header", fragment="StdTraits", fragment=SWIG_Traits_frag(Imp1), fragment=SWIG_Traits_frag(Imp2), fragment=SWIG_Traits_frag(Imp3)) %{ namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return "Type"; } }; template <> struct traits_asptr< Type > { typedef Type value_type; static int asptr(SWIG_Object obj, value_type **val) { Type *vptr; static swig_type_info* descriptor = SWIG_TypeQuery("Type *"); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&vptr, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = vptr; return res; } else { %implicit_code(Imp1); %implicit_code(Imp2); %implicit_code(Imp3); } return SWIG_TypeError; } }; } %} %typemap_traits_ptr(%checkcode(POINTER),Type); %enddef swig-3.0.12/Lib/typemaps/swigobject.swg0000664000175000017500000000157613042756442017700 0ustar williamwilliam/* ------------------------------------------------------------ * Language Object * - Just pass straight through unmodified * ------------------------------------------------------------ */ %typemap(in) SWIG_Object "$1 = $input;"; %typemap(in,noblock=1) SWIG_Object const & ($*ltype temp) { temp = %static_cast($input, $*ltype); $1 = &temp; } %typemap(out,noblock=1) SWIG_Object { %set_output($1); } %typemap(out,noblock=1) SWIG_Object const & { %set_output(*$1); } %typecheck(SWIG_TYPECHECK_SWIGOBJECT) SWIG_Object "$1 = ($input != 0);"; %typemap(throws,noblock=1) SWIG_Object { %raise($1, "$type", 0); } %typemap(constcode,noblock=1) SWIG_Object { %set_constant("$symname", $value); } #if defined(SWIG_DIRECTOR_TYPEMAPS) %typemap(directorin) SWIG_Object "$input = $1;"; %typemap(directorout) SWIG_Object "$result = $input;"; #endif /* SWIG_DIRECTOR_TYPEMAPS */ swig-3.0.12/Lib/typemaps/cdata.swg0000664000175000017500000000352013042756442016603 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.swg * * This library file contains macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; size_t len; } SWIGCDATA; %} /* ----------------------------------------------------------------------------- * Typemaps for returning binary data * ----------------------------------------------------------------------------- */ %typemap(out,noblock=1,fragment="SWIG_FromCharPtrAndSize") SWIGCDATA { %set_output(SWIG_FromCharPtrAndSize($1.data,$1.len)); } %typemap(in) (const void *indata, size_t inlen) = (char *STRING, size_t SIZE); /* ----------------------------------------------------------------------------- * %cdata(TYPE [, NAME]) * * Convert raw C data to a binary string. * ----------------------------------------------------------------------------- */ %define %cdata(TYPE,NAME...) %insert("header") { #ifdef __cplusplus extern "C" { #endif #if #NAME == "" static SWIGCDATA cdata_##TYPE(TYPE *ptr, size_t nelements) #else static SWIGCDATA cdata_##NAME(TYPE *ptr, size_t nelements) #endif { SWIGCDATA d; d.data = (char *) ptr; #if #TYPE != "void" d.len = nelements*sizeof(TYPE); #else d.len = nelements; #endif return d; } #ifdef __cplusplus } #endif } #ifdef __cplusplus extern "C" #endif #if #NAME == "" SWIGCDATA cdata_##TYPE(TYPE *ptr, size_t nelements = 1); #else SWIGCDATA cdata_##NAME(TYPE *ptr, size_t nelements = 1); #endif %enddef %rename(cdata) ::cdata_void(void *ptr, size_t nelements = 1); %cdata(void); /* Memory move function. Due to multi-argument typemaps this appears to be wrapped as void memmove(void *data, const char *s); */ void memmove(void *data, const void *indata, size_t inlen); swig-3.0.12/Lib/typemaps/inoutlist.swg0000664000175000017500000002241113042756442017561 0ustar williamwilliam/* ------------------------------------------------------------ * * Define the IN/OUTPUT typemaps assuming the output parameters are * returned in a list, i.e., they are not directly modified. * * The user should provide the %append_output(result, obj) method, * via a macro, which append a particular object to the result. * * * In Tcl, for example, the file is used as: * * #define %append_output(obj) Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),obj); * %include * * while in Python it is used as: * * #define %append_output(obj) $result = SWIG_Python_AppendResult($result, obj) * %include * * where the method SWIG_Python_AppendResult is defined inside the * %append_output fragment. * * If you forget to define %append_output, this file will generate * an error. * * ------------------------------------------------------------ */ // // Uncomment the following definition if you don't want the in/out // typemaps by default, ie, you prefer to use typemaps.i. // //#define SWIG_INOUT_NODEF // // Use the following definition to enable the INPUT parameters to // accept both 'by value' and 'pointer' objects. // #define SWIG_INPUT_ACCEPT_PTRS // ------------------------------------------------------------------------ // Pointer handling // // These mappings provide support for input/output arguments and common // uses for C/C++ pointers. // ------------------------------------------------------------------------ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ #if defined(SWIG_INPUT_ACCEPT_PTRS) #define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ConvertPtr(input,%as_voidptrptr(arg),desc,disown)))) #else #define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ERROR))) #endif %define %_value_input_typemap(code, asval_meth, asval_frag, Type) %typemap(in,noblock=1,fragment=asval_frag) Type *INPUT ($*ltype temp, int res = 0) { if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { Type val; int ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype",$symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; res = SWIG_AddTmpMask(ecode); } } %typemap(in,noblock=1,fragment=asval_frag) Type &INPUT($*ltype temp, int res = 0) { if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { Type val; int ecode = asval_meth($input, &val); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$*ltype",$symname, $argnum); } temp = %static_cast(val, $*ltype); $1 = &temp; res = SWIG_AddTmpMask(ecode); } } %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %typemap(typecheck,noblock=1,precedence=code,fragment=asval_frag) Type *INPUT, Type &INPUT { void *ptr = 0; int res = asval_meth($input, 0); $1 = SWIG_CheckState(res); if (!$1) { $1 = %check_input_ptr($input,&ptr,$1_descriptor,0); } } %enddef %define %_ptr_input_typemap(code,asptr_meth,asptr_frag,Type) %typemap(in,noblock=1,fragment=asptr_frag) Type *INPUT(int res = 0) { res = asptr_meth($input, &$1); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } res = SWIG_AddTmpMask(res); } %typemap(in,noblock=1,fragment=asptr_frag) Type &INPUT(int res = 0) { res = asptr_meth($input, &$1); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } if (!$1) { %argument_nullref("$type",$symname, $argnum); } res = SWIG_AddTmpMask(res); } %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { if (SWIG_IsNewObj(res$argnum)) %delete($1); } %typemap(typecheck,noblock=1,precedence=code,fragment=asptr_frag) Type *INPUT, Type &INPUT { int res = asptr_meth($input, (Type**)0); $1 = SWIG_CheckState(res); } %enddef // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a list. For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : double modf(double x, double *OUTPUT); or you can use the %apply directive : %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The output of the function would be a list containing both output values. */ %define %_value_output_typemap(from_meth, from_frag, Type) %typemap(in,numinputs=0,noblock=1) Type *OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ), Type &OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ) { $1 = &temp; } %typemap(argout,noblock=1,fragment=from_frag) Type *OUTPUT, Type &OUTPUT { if (SWIG_IsTmpObj(res$argnum)) { %append_output(from_meth((*$1))); } else { int new_flags = SWIG_IsNewObj(res$argnum) ? (SWIG_POINTER_OWN | %newpointer_flags) : %newpointer_flags; %append_output(SWIG_NewPointerObj((void*)($1), $1_descriptor, new_flags)); } } %enddef // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a list. For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : void neg(double *INOUT); or you can use the %apply directive : %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value. Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %define %_value_inout_typemap(Type) %typemap(in) Type *INOUT = Type *INPUT; %typemap(in) Type &INOUT = Type &INPUT; %typemap(typecheck) Type *INOUT = Type *INPUT; %typemap(typecheck) Type &INOUT = Type &INPUT; %typemap(argout) Type *INOUT = Type *OUTPUT; %typemap(argout) Type &INOUT = Type &OUTPUT; %enddef %define %_ptr_inout_typemap(Type) %_value_inout_typemap(%arg(Type)) %typemap(typecheck) Type *INOUT = Type *INPUT; %typemap(typecheck) Type &INOUT = Type &INPUT; %typemap(freearg) Type *INOUT = Type *INPUT; %typemap(freearg) Type &INOUT = Type &INPUT; %enddef #ifndef SWIG_INOUT_NODEF %define %value_input_typemap(code,asval_meth, asval_frag, Type...) %_value_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) %enddef %define %ptr_input_typemap(code,asval_meth,asval_frag,Type...) %_ptr_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) %enddef %define %value_output_typemap(from_meth,from_frag,Type...) %_value_output_typemap(%arg(from_meth),%arg(from_frag),%arg(Type)) %enddef #define %value_inout_typemap(Type...) %_value_inout_typemap(%arg(Type)) #define %ptr_inout_typemap(Type...) %_ptr_inout_typemap(%arg(Type)) #else /* You need to include typemaps.i */ #define %value_output_typemap(Type...) #define %value_input_typemap(Type...) #define %value_inout_typemap(Type...) #define %ptr_input_typemap(Type...) #define %ptr_inout_typemap(Type...) #endif /* SWIG_INOUT_DEFAULT */ /*---------------------------------------------------------------------- Front ends. use the following macros to define your own IN/OUTPUT/INOUT typemaps ------------------------------------------------------------------------*/ %define %typemaps_inout(Code, AsValMeth, FromMeth, AsValFrag, FromFrag, Type...) %_value_input_typemap(%arg(Code), %arg(AsValMeth), %arg(AsValFrag), %arg(Type)); %_value_output_typemap(%arg(FromMeth), %arg(FromFrag), %arg(Type)); %_value_inout_typemap(%arg(Type)); %enddef %define %typemaps_inoutn(Code,Type...) %typemaps_inout(%arg(Code), %arg(SWIG_AsVal(Type)), %arg(SWIG_From(Type)), %arg(SWIG_AsVal_frag(Type)), %arg(SWIG_From_frag(Type)), %arg(Type)); %enddef swig-3.0.12/Lib/typemaps/swigtype.swg0000664000175000017500000005437013042756442017413 0ustar williamwilliam/* ----------------------------------------------------------------------------- * --- Input arguments --- * ----------------------------------------------------------------------------- */ /* Pointers and arrays */ %typemap(in, noblock=1) SWIGTYPE *(void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp,$descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE * ""; %typemap(in, noblock=1) SWIGTYPE [] (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp,$descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE [] ""; %typemap(in, noblock=1) SWIGTYPE *const& (void *argp = 0, int res = 0, $*1_ltype temp) { res = SWIG_ConvertPtr($input, &argp, $*descriptor, $disown | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$*ltype", $symname, $argnum); } temp = %reinterpret_cast(argp, $*ltype); $1 = %reinterpret_cast(&temp, $1_ltype); } %typemap(freearg) SWIGTYPE *const& ""; /* Reference */ %typemap(in, noblock=1) SWIGTYPE & (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE & ""; #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,noblock=1,implicitconv=1) const SWIGTYPE & (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg,noblock=1,match="in",implicitconv=1) const SWIGTYPE & { if (SWIG_IsNewObj(res$argnum)) %delete($1); } #else %typemap(in,noblock=1) const SWIGTYPE & (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } #endif /* Rvalue reference */ %typemap(in, noblock=1) SWIGTYPE && (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg) SWIGTYPE && ""; #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,noblock=1,implicitconv=1) const SWIGTYPE && (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(freearg,noblock=1,match="in",implicitconv=1) const SWIGTYPE && { if (SWIG_IsNewObj(res$argnum)) %delete($1); } #else %typemap(in,noblock=1) const SWIGTYPE && (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } $1 = %reinterpret_cast(argp, $ltype); } #endif /* By value */ #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(in,implicitconv=1) SWIGTYPE (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $<ype temp = %reinterpret_cast(argp, $<ype); $1 = *temp; if (SWIG_IsNewObj(res)) %delete(temp); } } #else %typemap(in) SWIGTYPE (void *argp, int res = 0) { res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, $<ype)); } } #endif /* ----------------------------------------------------------------------------- * --- Output arguments --- * ----------------------------------------------------------------------------- */ /* Pointers, references */ %typemap(out,noblock=1) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[] { %set_output(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, $owner | %newpointer_flags)); } %typemap(out, noblock=1) SWIGTYPE *const& { %set_output(SWIG_NewPointerObj(%as_voidptr(*$1), $*descriptor, $owner | %newpointer_flags)); } /* Return by value */ %typemap(out, noblock=1) SWIGTYPE { %set_output(SWIG_NewPointerObj(%new_copy($1, $ltype), $&descriptor, SWIG_POINTER_OWN | %newpointer_flags)); } /* ----------------------------------------------------------------------------- * --- Variable input --- * ----------------------------------------------------------------------------- */ /* memberin/globalin/varin, for fix arrays. */ %typemap(memberin) SWIGTYPE [ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)$input + ii); } else { %variable_nullref("$type","$name"); } } %typemap(globalin) SWIGTYPE [ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)$input + ii); } else { %variable_nullref("$type","$name"); } } %typemap(varin) SWIGTYPE [ANY] { $basetype *inp = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&inp), $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } else if (inp) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) *($1_basetype *)&$1[ii] = *(($1_basetype *)inp + ii); } else { %variable_nullref("$type", "$name"); } } /* memberin/globalin/varin, for fix double arrays. */ %typemap(memberin) SWIGTYPE [ANY][ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if ($input[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = $input[ii][jj]; } else { %variable_nullref("$type","$name"); } } } else { %variable_nullref("$type","$name"); } } %typemap(globalin) SWIGTYPE [ANY][ANY] { if ($input) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if ($input[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = $input[ii][jj]; } else { %variable_nullref("$type","$name"); } } } else { %variable_nullref("$type","$name"); } } %typemap(varin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&inp), $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } else if (inp) { size_t ii = 0; for (; ii < (size_t)$1_dim0; ++ii) { if (inp[ii]) { size_t jj = 0; for (; jj < (size_t)$1_dim1; ++jj) $1[ii][jj] = inp[ii][jj]; } else { %variable_nullref("$type", "$name"); } } } else { %variable_nullref("$type", "$name"); } } /* Pointers, references, and variable size arrays */ %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE * { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = %reinterpret_cast(argp, $ltype); } %typemap(varin,noblock=1,warning="462:Unable to set dimensionless array variable") SWIGTYPE [] { %variable_fail(SWIG_AttributeError, "$type", "read-only $name"); } %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE & { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } $1 = *(%reinterpret_cast(argp, $ltype)); } %typemap(varin,warning=SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) SWIGTYPE && { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } $1 = *(%reinterpret_cast(argp, $ltype)); } #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(varin,implicitconv=1) SWIGTYPE { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $&type temp; temp = %reinterpret_cast(argp, $&type); $1 = *temp; if (SWIG_IsNewObj(res)) %delete(temp); } } #else %typemap(varin) SWIGTYPE { void *argp = 0; int res = SWIG_ConvertPtr($input, &argp, $&descriptor, %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, $&type)); } } #endif /* ----------------------------------------------------------------------------- * --- Variable output --- * ----------------------------------------------------------------------------- */ /* Pointers and arrays */ %typemap(varout, noblock=1) SWIGTYPE * { %set_varoutput(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags)); } %typemap(varout, noblock=1) SWIGTYPE [] { %set_varoutput(SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags)); } /* References */ %typemap(varout, noblock=1) SWIGTYPE & { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags)); } %typemap(varout, noblock=1) SWIGTYPE && { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags)); } /* Value */ %typemap(varout, noblock=1) SWIGTYPE { %set_varoutput(SWIG_NewPointerObj(%as_voidptr(&$1), $&descriptor, %newpointer_flags)); } /* ------------------------------------------------------------ * --- Typechecking rules --- * ------------------------------------------------------------ */ %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE * { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE *const& { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $*descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE & { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE && { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, 0); $1 = SWIG_CheckState(res); } #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) const SWIGTYPE & { int res = SWIG_ConvertPtr($input, 0, $descriptor, %implicitconv_flag); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) const SWIGTYPE && { int res = SWIG_ConvertPtr($input, 0, $descriptor, %implicitconv_flag); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1,implicitconv=1) SWIGTYPE { int res = SWIG_ConvertPtr($input, 0, $&descriptor, %implicitconv_flag); $1 = SWIG_CheckState(res); } #else %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) const SWIGTYPE & { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) const SWIGTYPE && { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $descriptor, 0); $1 = SWIG_CheckState(res); } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE { void *vptr = 0; int res = SWIG_ConvertPtr($input, &vptr, $&descriptor, 0); $1 = SWIG_CheckState(res); } #endif /* ----------------------------------------------------------------------------- * --- Director typemaps --- * * ----------------------------------------------------------------------------- */ #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE *, SWIGTYPE *const& { $input = SWIG_NewPointerObj(%as_voidptr($1), $descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE { $input = SWIG_NewPointerObj(%as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE & { $input = SWIG_NewPointerObj(%as_voidptr(&$1), $descriptor, %newpointer_flags); } %typemap(directorin,noblock=1) SWIGTYPE && { $input = SWIG_NewPointerObj(%as_voidptr(&$1_name), $descriptor, %newpointer_flags); } /* directorout */ #if defined(__cplusplus) && defined(%implicitconv_flag) %typemap(directorout,noblock=1,implicitconv=1) SWIGTYPE (void * swig_argp, int swig_res = 0) { swig_res = SWIG_ConvertPtr($input,&swig_argp,$&descriptor, %convertptr_flags | %implicitconv_flag); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = *(%reinterpret_cast(swig_argp, $<ype)); if (SWIG_IsNewObj(swig_res)) %delete(%reinterpret_cast(swig_argp, $<ype)); } #else %typemap(directorout,noblock=1) SWIGTYPE (void * swig_argp, int swig_res = 0) { swig_res = SWIG_ConvertPtr($input,&swig_argp,$&descriptor, %convertptr_flags); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = *(%reinterpret_cast(swig_argp, $<ype)); } #endif %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE *(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE * { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE &(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } if (!swig_argp) { %dirout_nullref("$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE & { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } %typemap(directorout,noblock=1,warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE &&(void *swig_argp, int swig_res, swig_owntype own) { swig_res = SWIG_ConvertPtrAndOwn($input, &swig_argp, $descriptor, %convertptr_flags | SWIG_POINTER_DISOWN, &own); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } if (!swig_argp) { %dirout_nullref("$type"); } $result = %reinterpret_cast(swig_argp, $ltype); swig_acquire_ownership_obj(%as_voidptr($result), own /* & TODO: SWIG_POINTER_OWN */); } %typemap(directorfree,noblock=1,match="directorout") SWIGTYPE && { if (director) { SWIG_AcquirePtr($result, director->swig_release_ownership(%as_voidptr($input))); } } #endif /* SWIG_DIRECTOR_TYPEMAPS */ /* ------------------------------------------------------------ * --- Constants --- * ------------------------------------------------------------ */ %typemap(constcode,noblock=1) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { %set_constant("$symname", SWIG_NewPointerObj(%as_voidptr($value),$descriptor,%newpointer_flags)); } %typemap(constcode,noblock=1) SWIGTYPE { %set_constant("$symname", SWIG_NewPointerObj(%as_voidptr(&$value),$&descriptor,%newpointer_flags)); } /* ------------------------------------------------------------ * --- Exception handling --- * ------------------------------------------------------------ */ %typemap(throws,noblock=1) SWIGTYPE { %raise(SWIG_NewPointerObj(%new_copy($1, $ltype),$&descriptor,SWIG_POINTER_OWN), "$type", $&descriptor); } %typemap(throws,noblock=1) SWIGTYPE * { %raise(SWIG_NewPointerObj(%as_voidptr($1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE [ANY] { %raise(SWIG_NewPointerObj(%as_voidptr($1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE & { %raise(SWIG_NewPointerObj(%as_voidptr(&$1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) SWIGTYPE && { %raise(SWIG_NewPointerObj(%as_voidptr(&$1),$descriptor,0), "$type", $descriptor); } %typemap(throws,noblock=1) (...) { SWIG_exception_fail(SWIG_RuntimeError,"unknown exception"); } /* ------------------------------------------------------------ * --- CLASS::* typemaps --- * ------------------------------------------------------------ */ %typemap(in) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(constcode,noblock=1) SWIGTYPE (CLASS::*) { %set_constant("$symname", SWIG_NewMemberObj(%as_voidptr(&$value), sizeof($type), $descriptor)); } #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE (CLASS::*) { $input = SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor); } /* directorout */ %typemap(directorout) SWIGTYPE (CLASS::*) { int swig_res = SWIG_ConvertMember($input,%as_voidptr(&$result), sizeof($type), $descriptor); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } } #endif /* ------------------------------------------------------------ * --- function ptr typemaps --- * ------------------------------------------------------------ */ /* ISO C++ doesn't allow direct casting of a function ptr to a object ptr. So, maybe the ptr sizes are not the same, and we need to take some providences. */ %typemap(in) SWIGTYPE ((*)(ANY)) { int res = SWIG_ConvertFunctionPtr($input, (void**)(&$1), $descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) SWIGTYPE ((*)(ANY)) { void *ptr = 0; int res = SWIG_ConvertFunctionPtr($input, &ptr, $descriptor); $1 = SWIG_CheckState(res); } %typemap(out, noblock=1) SWIGTYPE ((*)(ANY)) { %set_output(SWIG_NewFunctionPtrObj((void *)($1), $descriptor)); } %typemap(varin) SWIGTYPE ((*)(ANY)) { int res = SWIG_ConvertFunctionPtr($input, (void**)(&$1), $descriptor); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } } %typemap(varout,noblock=1) SWIGTYPE ((*)(ANY)) { %set_varoutput(SWIG_NewFunctionPtrObj((void *)($1), $descriptor)); } %typemap(constcode, noblock=1) SWIGTYPE ((*)(ANY)){ %set_constant("$symname", SWIG_NewFunctionPtrObj((void *)$value, $descriptor)); } %typemap(constcode) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); #if defined(SWIG_DIRECTOR_TYPEMAPS) /* directorin */ %typemap(directorin,noblock=1) SWIGTYPE ((*)(ANY)) { $input = SWIG_NewFunctionPtrObj((void*)($1), $descriptor); } /* directorout */ %typemap(directorout) SWIGTYPE ((*)(ANY)) { int swig_res = SWIG_ConvertFunctionPtr($input,(void**)(&$result),$descriptor); if (!SWIG_IsOK(swig_res)) { %dirout_fail(swig_res,"$type"); } } #endif %apply SWIGTYPE * { SWIGTYPE *const } /* ------------------------------------------------------------ * --- Special typemaps --- * ------------------------------------------------------------ */ /* DISOWN typemap */ %typemap(in, noblock=1) SWIGTYPE *DISOWN (int res = 0) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&$1), $descriptor, SWIG_POINTER_DISOWN | %convertptr_flags); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type", $symname, $argnum); } } %typemap(varin) SWIGTYPE *DISOWN { void *temp = 0; int res = SWIG_ConvertPtr($input, &temp, $descriptor, SWIG_POINTER_DISOWN | %convertptr_flags); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = ($ltype) temp; } /* DYNAMIC typemap */ %typemap(out,noblock=1) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { %set_output(SWIG_NewPointerObj(%as_voidptr($1), SWIG_TypeDynamicCast($descriptor, %as_voidptrptr(&$1)), $owner | %newpointer_flags)); } /* INSTANCE typemap */ %typemap(out,noblock=1) SWIGTYPE INSTANCE { %set_output(SWIG_NewInstanceObj(%new_copy($1, $1_ltype), $&1_descriptor, SWIG_POINTER_OWN | %newinstance_flags)); } %typemap(out,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE &INSTANCE, SWIGTYPE INSTANCE[] { %set_output(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, $owner | %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE *INSTANCE, SWIGTYPE INSTANCE[] { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE &INSTANCE { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr($1), $1_descriptor, %newinstance_flags)); } %typemap(varout,noblock=1) SWIGTYPE INSTANCE { %set_varoutput(SWIG_NewInstanceObj(%as_voidptr(&$1), $&1_descriptor, %newinstance_flags)); } swig-3.0.12/Lib/typemaps/attribute.swg0000664000175000017500000002301613042756442017534 0ustar williamwilliam/* ----------------------------------------------------------------------------- * attribute.swg * * Attribute implementation * ----------------------------------------------------------------------------- */ /* The following macros convert a pair of set/get methods into a "native" attribute. Use %attribute when you have a pair of get/set methods to a primitive type like in: %attribute(A, int, a, get_a, set_a); struct A { int get_a() const; void set_a(int aa); }; If you don't provide a 'set' method, a 'read-only' attribute is generated, ie, like in: %attribute(A, int, c, get_c); Use %attributeref when you have const/non-const reference access methods for primitive types or class/structs, like in: %attributeref(A, int, b); struct A { const int& b() const; int& b(); }; %attributeref(B, int, c); struct B { int& c(); }; You can also use %attributeref(Class, AttributeType, AttributeName, AccessorMethod) if the internal C++ reference methods have a different name from the attribute you want, so %attributeref(B, int, d, c); is the same as the last example, but instead of the attribute 'c' being called 'c', it is called 'd'. Now you can use the attributes like so: x = A() x.a = 3 # calls A::set_a print x.a # calls A::get_a x.b = 3 # calls A::b() print x.b # calls A::b() const Use %attribute2 instead of %attribute to indicate that reference-pointer translation is required. You use %attribute2 instead of %attribute in cases like this: %attribute2(MyClass, MyFoo, Foo, GetFoo, SetFoo); %inline %{ struct MyFoo { int x; }; class MyClass { MyFoo foo; public: MyFoo& GetFoo() { return foo; } void SetFoo(const MyFoo& other) { foo = other; } }; %} Here, the data type of the property is a wrapped type (MyFoo) and on the C++ side it is passed by reference. The problem is that the SWIG wrapper will pass around a pointer (MyFoo *) which is not compatible with the reference type of the accessors (MyFoo &). Therefore, if you use %attribute, you'll get an error from your C/C++ compiler. %attribute2 translates between a pointer and a reference to eliminate the error. In case you're confused, let's make it simple: just use %attribute at first, but if the C/C++ compiler gives an error while compiling the wrapper, try %attribute2 instead. NOTE: remember that if the type contains commas, such as 'std::pair', you need to use the macro like: %attributeref(A, %arg(std::pair), pval); where %arg() 'normalizes' the type to be understood as a single argument, otherwise the macro will get confused by the comma. The %attributeval is the same as %attribute, but should be used when the type is a class/struct (ie a non-primitive type) and when the get and set methods return/pass by value. The following is very similar to the above example, but note that the access is by value rather than reference. %attributeval(MyClassVal, MyFoo, ReadWriteFoo, GetFoo, SetFoo); %attributeval(MyClassVal, MyFoo, ReadOnlyFoo, GetFoo); %inline %{ class MyClassVal { MyFoo foo; public: MyFoo GetFoo() { return foo; } void SetFoo(MyFoo other) { foo = other; } }; %} The %attributestring is the same as %attributeval, but should be used for string class types, which are unusual as they are a class on the C++ side, but normally an immutable/primitive type in the target language. Example usage for std::string: %include %attributestring(MyStringyClass, std::string, ReadWriteString, GetString, SetString); %attributestring(MyStringyClass, std::string, ReadOnlyString, GetString); %inline %{ class MyStringyClass { std::string str; public: MyStringyClass(const std::string &val) : str(val) {} std::string GetString() { return str; } void SetString(std::string other) { str = other; } }; %} The %attributestring also works for class types that have %naturalvar turned on and so is also useful for shared_ptr which has %naturalvar turned on in %shared_ptr. */ // // Define SWIG_ATTRIBUTE_TEMPLATE if you want to use templates instead of macros for the C++ get and set wrapper methods // Does not always generate compilable code, use at your peril! // //#define SWIG_ATTRIBUTE_TEMPLATE %define %attribute_custom(Class, AttributeType, AttributeName, GetMethod, SetMethod, GetMethodCall, SetMethodCall) %ignore Class::GetMethod(); %ignore Class::GetMethod() const; #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif %extend Class { AttributeType AttributeName; } #if defined(__cplusplus) && defined(SWIG_ATTRIBUTE_TEMPLATE) %{ template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(const C* self_) { return GetMethodCall; } template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(C* self_) { return GetMethodCall; } template < class C > inline void %mangle(Class) ##_## AttributeName ## _set(C* self_, AttributeType val_) { SetMethodCall; } %} #else %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) GetMethodCall #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) SetMethodCall %} #endif %enddef %define %attribute_readonly(Class, AttributeType, AttributeName, GetMethod, GetMethodCall) %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %immutable Class::AttributeName; %extend Class { AttributeType AttributeName; } #if defined(__cplusplus) && defined(SWIG_ATTRIBUTE_TEMPLATE) %{ template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(const C* self_) { return GetMethodCall; } template < class C > inline AttributeType %mangle(Class) ##_## AttributeName ## _get(C* self_) { return GetMethodCall; } %} #else %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) GetMethodCall %} #endif %enddef // User macros %define %attribute(Class, AttributeType, AttributeName, GetMethod, SetMethod...) #if #SetMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, SetMethod, self_->GetMethod(), self_->SetMethod(val_)) #else %attribute_readonly(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, self_->GetMethod()) #endif %enddef %define %attribute2(Class, AttributeType, AttributeName, GetMethod, SetMethod...) #if #SetMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, SetMethod, &self_->GetMethod(), self_->SetMethod(*val_)) #else %attribute_readonly(%arg(Class), %arg(AttributeType), AttributeName, GetMethod, &self_->GetMethod()) #endif %enddef %define %attributeref(Class, AttributeType, AttributeName, AccessorMethod...) #if #AccessorMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AttributeName, AttributeName, self_->AttributeName(), self_->AttributeName() = val_) #endif %enddef %define %attribute2ref(Class, AttributeType, AttributeName, AccessorMethod...) #if #AccessorMethod != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, &self_->AccessorMethod(), self_->AccessorMethod() = *val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AccessorName, AccessorName, AccessorName, &self_->AccessorName(), self_->AccessorName() = *val_) #endif %enddef // deprecated (same as %attributeref, but there is an argument order inconsistency) %define %attribute_ref(Class, AttributeType, AccessorMethod, AttributeName...) #if #AttributeName != "" %attribute_custom(%arg(Class), %arg(AttributeType), AttributeName, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #else %attribute_custom(%arg(Class), %arg(AttributeType), AccessorMethod, AccessorMethod, AccessorMethod, self_->AccessorMethod(), self_->AccessorMethod() = val_) #endif %enddef %define %attributeval(Class, AttributeType, AttributeName, GetMethod, SetMethod...) %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) new AttributeType(self_->GetMethod()) %} #if #SetMethod != "" %{ #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) self_->SetMethod(*val_) %} #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif #else %immutable Class::AttributeName; #endif %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %newobject Class::AttributeName; %extend Class { AttributeType AttributeName; } %enddef %define %attributestring(Class, AttributeType, AttributeName, GetMethod, SetMethod...) %{ #define %mangle(Class) ##_## AttributeName ## _get(self_) *new AttributeType(self_->GetMethod()) %} #if #SetMethod != "" %{ #define %mangle(Class) ##_## AttributeName ## _set(self_, val_) self_->SetMethod(val_) %} #if #SetMethod != #AttributeName %ignore Class::SetMethod; #endif #else %immutable Class::AttributeName; #endif %ignore Class::GetMethod(); %ignore Class::GetMethod() const; %newobject Class::AttributeName; %typemap(newfree) const AttributeType &AttributeName "delete $1;" %extend Class { AttributeType AttributeName; } %enddef swig-3.0.12/Lib/typemaps/std_string.swg0000664000175000017500000000053313042756442017710 0ustar williamwilliam// // String // #ifndef SWIG_STD_BASIC_STRING #define SWIG_STD_STRING %include %fragment(""); namespace std { %naturalvar string; class string; } %typemaps_std_string(std::string, char, SWIG_AsCharPtrAndSize, SWIG_FromCharPtrAndSize, %checkcode(STDSTRING)); #else %include #endif swig-3.0.12/Lib/typemaps/typemaps.swg0000664000175000017500000001072413042756442017375 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.swg * * Tcl Pointer handling * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Tcl tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Tcl output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Tcl tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Tcl). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Tcl variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ #if defined(SWIG_INOUT_NODEF) %apply_checkctypes(%typemaps_inoutn) %apply size_t& { std::size_t& }; %apply ptrdiff_t& { std::ptrdiff_t& }; #endif swig-3.0.12/Lib/typemaps/exception.swg0000664000175000017500000000522713042756442017533 0ustar williamwilliam/* ----------------------------------------------------------------------------- * exceptions.swg * * This SWIG library file provides language independent exception handling * ----------------------------------------------------------------------------- */ %include /* macros for error manipulation */ #define %nullref_fmt() "invalid null reference " #define %varfail_fmt(_type,_name) "in variable '"`_name`"' of type '"`_type`"'" #ifndef %argfail_fmt #define %argfail_fmt(_type,_name,_argn) "in method '" `_name` "', argument " `_argn`" of type '" `_type`"'" #endif #define %outfail_fmt(_type) "in output value of type '"_type"'" #ifndef %argnullref_fmt #define %argnullref_fmt(_type,_name,_argn) %nullref_fmt() %argfail_fmt(_type, _name, _argn) #endif #define %varnullref_fmt(_type,_name) %nullref_fmt() %varfail_fmt(_type, _name) #define %outnullref_fmt(_type) %nullref_fmt() %outfail_fmt(_type) /* setting an error */ #define %error(code,msg...) SWIG_Error(code, msg) #define %type_error(msg...) SWIG_Error(SWIG_TypeError, msg) %insert("runtime") { %define_as(SWIG_exception_fail(code, msg), %block(%error(code, msg); SWIG_fail)) %define_as(SWIG_contract_assert(expr, msg), if (!(expr)) { %error(SWIG_RuntimeError, msg); SWIG_fail; } else) } #ifdef __cplusplus /* You can use the SWIG_CATCH_STDEXCEPT macro with the %exception directive as follows: %exception { try { $action } catch (my_except& e) { ... } SWIG_CATCH_STDEXCEPT // catch std::exception catch (...) { SWIG_exception_fail(SWIG_UnknownError, "Unknown exception"); } } */ %fragment(""); %define SWIG_CATCH_STDEXCEPT /* catching std::exception */ catch (std::invalid_argument& e) { SWIG_exception_fail(SWIG_ValueError, e.what() ); } catch (std::domain_error& e) { SWIG_exception_fail(SWIG_ValueError, e.what() ); } catch (std::overflow_error& e) { SWIG_exception_fail(SWIG_OverflowError, e.what() ); } catch (std::out_of_range& e) { SWIG_exception_fail(SWIG_IndexError, e.what() ); } catch (std::length_error& e) { SWIG_exception_fail(SWIG_IndexError, e.what() ); } catch (std::runtime_error& e) { SWIG_exception_fail(SWIG_RuntimeError, e.what() ); } catch (std::exception& e) { SWIG_exception_fail(SWIG_SystemError, e.what() ); } %enddef %define SWIG_CATCH_UNKNOWN catch (std::exception& e) { SWIG_exception_fail(SWIG_SystemError, e.what() ); } catch (...) { SWIG_exception_fail(SWIG_UnknownError, "unknown exception"); } %enddef #endif /* __cplusplus */ swig-3.0.12/Lib/typemaps/README0000664000175000017500000000372513042756442015674 0ustar williamwilliamStill in development, but if you are interested into looking around, start with swigtypemaps.swg which is the head file. Also read the docs for %fragments in fragments.swg and follow the definitions in one of the supported languages: python, perl, ruby, tcl /* ----------------------------------------------------------------------------- * Internal typemap specializations * ----------------------------------------------------------------------------- */ carrays.swg Implement the carrays.i library cdata.swg Implement the cdata.i library cmalloc.swg Implement the cmalloc.i library cpointer.swg Implement the cpointer.i library cstring.swg Implement the cstring.i library typemaps for char * cwstring.swg Implement the cstring.i library typemaps for wchar_t * exception.swg Implement the exception.i library implicit.swg Allow the use of implicit C++ constructors string.swg Typemaps for char * string wstring.swg Typemaps for wchar_t * string std_string.swg Typemaps for std::string std_wstring.swg Typemaps for std::wstring swigtype.swg Typemaps for the SWIGTYPE type void.swg Typemaps for the 'void' type enumint.swg Typemaps for enums treated as 'int' swigobject.swg Typemaps for the SWIG_Object as in PyObject, Tcl_Obj, etc. misctypes.swg Typemaps for miscellaneos types (size_t, ptrdiff_t, etc) ptrtypes.swg Typemaps for types with a 'ptr' behavior valtypes.swg Typemaps for 'by value' types inoutlist.swg IN/OUTPUT/INOUT typemaps, where the OUTPUT values are returned in a list primtypes.swg Common macros to manage primitive types (short,int,double,etc) cstrings.swg Common macros to implemented the cstring/cwstring libraries std_strings.swg Common macros to implemented the std::string/std::wstring typemaps strings.swg Common macros and typemaps for string and wstring (char *, wchar_t *) swigmacros.swg Basic macros fragments.swg Macros for fragment manipulations typemaps.swg The old typemaps.i library, not needed anymore swig-3.0.12/Lib/typemaps/wstring.swg0000664000175000017500000000144513042756442017230 0ustar williamwilliam%ensure_fragment(SWIG_AsWCharPtrAndSize) %ensure_fragment(SWIG_FromWCharPtrAndSize) %types(wchar_t *); %fragment("SWIG_pwchar_descriptor","header") { SWIGINTERN swig_type_info* SWIG_pwchar_descriptor() { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_wchar_t"); init = 1; } return info; } } %fragment("SWIG_wcsnlen","header",fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERN size_t SWIG_wcsnlen(const wchar_t* s, size_t maxlen) { const wchar_t *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } } %include %typemaps_string(%checkcode(UNISTRING), %checkcode(UNICHAR), wchar_t, WChar, SWIG_AsWCharPtrAndSize, SWIG_FromWCharPtrAndSize, wcslen, SWIG_wcsnlen, "", WCHAR_MIN, WCHAR_MAX) swig-3.0.12/Lib/typemaps/fragments.swg0000664000175000017500000002071613042756442017523 0ustar williamwilliam/* Fragments ========= See the "Typemap fragments" section in the documentation for understanding fragments. Below is some info on how fragments and automatic type specialization is used. Macros that make the automatic generation of typemaps easier are provided. Consider the following code: %fragment(SWIG_From_frag(bool), "header") { static PyObject* SWIG_From_dec(bool)(bool value) { PyObject *obj = value ? Py_True : Py_False; Py_INCREF(obj); return obj; } } %typemap(out, fragment=SWIG_From_frag(bool)) bool { $result = SWIG_From(bool)($1)); } Here the macros SWIG_From_frag => fragment SWIG_From_dec => declaration SWIG_From => call allow you to define/include a fragment, and declare and call the 'from-bool' method as needed. In the simpler case, these macros just return something like SWIG_From_frag(bool) => "SWIG_From_bool" SWIG_From_dec(bool) => SWIG_From_bool SWIG_From(bool) => SWIG_From_bool But they are specialized for the different languages requirements, such as perl or tcl that requires passing the interpreter pointer, and also they can manage C++ ugly types, for example: SWIG_From_frag(std::complex) => "SWIG_From_std_complex_Sl_double_Sg_" SWIG_From_dec(std::complex) => SWIG_From_std_complex_Sl_double_Sg_ SWIG_From(std::complex) => SWIG_From_std_complex_Sl_double_Sg_ Hence, to declare methods to use with typemaps, always use the SWIG_From* macros. In the same way, the SWIG_AsVal* and SWIG_AsPtr* set of macros are provided. */ /* ----------------------------------------------------------------------------- * Define the basic macros to 'normalize' the type fragments * ----------------------------------------------------------------------------- */ #ifndef SWIG_AS_DECL_ARGS #define SWIG_AS_DECL_ARGS #endif #ifndef SWIG_FROM_DECL_ARGS #define SWIG_FROM_DECL_ARGS #endif #ifndef SWIG_AS_CALL_ARGS #define SWIG_AS_CALL_ARGS #endif #ifndef SWIG_FROM_CALL_ARGS #define SWIG_FROM_CALL_ARGS #endif #define %fragment_name(Name, Type...) %string_name(Name) "_" {Type} #define SWIG_Traits_frag(Type...) %fragment_name(Traits, Type) #define SWIG_AsPtr_frag(Type...) %fragment_name(AsPtr, Type) #define SWIG_AsVal_frag(Type...) %fragment_name(AsVal, Type) #define SWIG_From_frag(Type...) %fragment_name(From, Type) #define SWIG_AsVal_name(Type...) %symbol_name(AsVal, Type) #define SWIG_AsPtr_name(Type...) %symbol_name(AsPtr, Type) #define SWIG_From_name(Type...) %symbol_name(From, Type) #define SWIG_AsVal_dec(Type...) SWIG_AsVal_name(Type) SWIG_AS_DECL_ARGS #define SWIG_AsPtr_dec(Type...) SWIG_AsPtr_name(Type) SWIG_AS_DECL_ARGS #define SWIG_From_dec(Type...) SWIG_From_name(Type) SWIG_FROM_DECL_ARGS #define SWIG_AsVal(Type...) SWIG_AsVal_name(Type) SWIG_AS_CALL_ARGS #define SWIG_AsPtr(Type...) SWIG_AsPtr_name(Type) SWIG_AS_CALL_ARGS #define SWIG_From(Type...) SWIG_From_name(Type) SWIG_FROM_CALL_ARGS /* ------------------------------------------------------------ * common fragments * ------------------------------------------------------------ */ /* Default compiler options for gcc allow long_long but not LLONG_MAX. * Define SWIG_NO_LLONG_MAX if this added limits support is not wanted. */ %fragment("","header") %{ #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif %} %fragment("","header") %{ #include %} %fragment("","header") %{ #include #include #ifndef WCHAR_MIN # define WCHAR_MIN 0 #endif #ifndef WCHAR_MAX # define WCHAR_MAX 65535 #endif %} %fragment("","header") %{ #include %} %fragment("","header") %{ #include #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # ifndef snprintf # define snprintf _snprintf # endif #endif %} %fragment("","header") %{ #include #ifdef _MSC_VER # ifndef strtoull # define strtoull _strtoui64 # endif # ifndef strtoll # define strtoll _strtoi64 # endif #endif %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("", "header") %{ #include %} %fragment("SWIG_isfinite","header",fragment=",") %{ /* Getting isfinite working pre C99 across multiple platforms is non-trivial. Users can provide SWIG_isfinite on older platforms. */ #ifndef SWIG_isfinite /* isfinite() is a macro for C99 */ # if defined(isfinite) # define SWIG_isfinite(X) (isfinite(X)) # elif defined __cplusplus && __cplusplus >= 201103L /* Use a template so that this works whether isfinite() is std::isfinite() or * in the global namespace. The reality seems to vary between compiler * versions. * * Make sure namespace std exists to avoid compiler warnings. * * extern "C++" is required as this fragment can end up inside an extern "C" { } block */ namespace std { } extern "C++" template inline int SWIG_isfinite_func(T x) { using namespace std; return isfinite(x); } # define SWIG_isfinite(X) (SWIG_isfinite_func(X)) # elif defined(_MSC_VER) # define SWIG_isfinite(X) (_finite(X)) # elif defined(__sun) && defined(__SVR4) # include # define SWIG_isfinite(X) (finite(X)) # endif #endif %} %fragment("SWIG_Float_Overflow_Check","header",fragment=",SWIG_isfinite") %{ /* Accept infinite as a valid float value unless we are unable to check if a value is finite */ #ifdef SWIG_isfinite # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX) && SWIG_isfinite(X)) #else # define SWIG_Float_Overflow_Check(X) ((X < -FLT_MAX || X > FLT_MAX)) #endif %} /* ----------------------------------------------------------------------------- * special macros for fragments * ----------------------------------------------------------------------------- */ /* Macros to derive numeric types */ %define %numeric_type_from(Type, Base) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(Base)) { SWIGINTERNINLINE SWIG_Object SWIG_From_dec(Type)(Type value) { return SWIG_From(Base)(value); } } %enddef %define %numeric_type_asval(Type, Base, Frag, OverflowCond) %fragment(SWIG_AsVal_frag(Type),"header", fragment=Frag, fragment=SWIG_AsVal_frag(Base)) { SWIGINTERN int SWIG_AsVal_dec(Type)(SWIG_Object obj, Type *val) { Base v; int res = SWIG_AsVal(Base)(obj, &v); if (SWIG_IsOK(res)) { if (OverflowCond) { return SWIG_OverflowError; } else { if (val) *val = %numeric_cast(v, Type); } } return res; } } %enddef #define %numeric_signed_type_asval(Type, Base, Frag, Min, Max) \ %numeric_type_asval(Type, Base, Frag, (v < Min || v > Max)) #define %numeric_unsigned_type_asval(Type, Base, Frag, Max) \ %numeric_type_asval(Type, Base, Frag, (v > Max)) /* Macro for 'signed long' derived types */ %define %numeric_slong(Type, Frag, Min, Max) %numeric_type_from(Type, long) %numeric_signed_type_asval(Type, long, Frag , Min, Max) %enddef /* Macro for 'unsigned long' derived types */ %define %numeric_ulong(Type, Frag, Max) %numeric_type_from(Type, unsigned long) %numeric_unsigned_type_asval(Type, unsigned long, Frag, Max) %enddef /* Macro for floating point derived types (original macro) */ %define %numeric_double(Type, Frag, Min, Max) %numeric_type_from(Type, double) %numeric_signed_type_asval(Type, double, Frag , Min, Max) %enddef /* Macro for floating point derived types */ %define %numeric_float(Type, Frag, OverflowCond) %numeric_type_from(Type, double) %numeric_type_asval(Type, double, Frag, OverflowCond) %enddef /* Macros for missing fragments */ %define %ensure_fragment(Fragment) %fragment(`Fragment`,"header") { %#error "SWIG language implementation must provide the Fragment fragment" } %enddef %define %ensure_type_fragments(Type) %fragment(SWIG_From_frag(Type),"header") { %#error "SWIG language implementation must provide a SWIG_From_frag(Type) fragment" } %fragment(SWIG_AsVal_frag(Type),"header") { %#error "SWIG language implementation must provide a SWIG_AsVal_frag(Type) fragment" } %enddef swig-3.0.12/Lib/typemaps/cstrings.swg0000664000175000017500000002004213042756442017361 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cstrings.swg * * This file provides typemaps and macros for dealing with various forms * of C character string handling. The primary use of this module * is in returning character data that has been allocated or changed in * some way. * ----------------------------------------------------------------------------- */ %define %typemaps_cstring(Name, Char, SWIG_AsCharPtr, SWIG_AsCharPtrAndSize, SWIG_FromCharPtr, SWIG_FromCharPtrAndSize) /* %cstring_input_binary(TYPEMAP, SIZE) * * Macro makes a function accept binary string data along with * a size. For example: * * %cstring_input_binary(Char *buff, int size); * void foo(Char *buff, int size) { * } * */ %define Name ## _input_binary(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) (TYPEMAP, SIZE) (int res, Char *buf = 0, size_t size = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &buf, &size, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } $1 = ($1_ltype) buf; $2 = ($2_ltype) size - 1; } %typemap(freearg,noblock=1,match="in") (TYPEMAP, SIZE) { if (alloc$argnum == SWIG_NEWOBJ) %delete_array(buf$argnum); } %enddef /* * %cstring_bounded_output(TYPEMAP, MAX) * * This macro is used to return a NULL-terminated output string of * some maximum length. For example: * * %cstring_bounded_output(Char *outx, 512); * void foo(Char *outx) { * sprintf(outx,"blah blah\n"); * } * */ %define Name ## _bounded_output(TYPEMAP,MAX) %typemap(in,noblock=1,numinputs=0) TYPEMAP (Char temp[MAX+1]) { $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment= #SWIG_FromCharPtr ) TYPEMAP { $1[MAX] = 0; %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_chunk_output(TYPEMAP, SIZE) * * This macro is used to return a chunk of binary string data. * Embedded NULLs are okay. For example: * * %cstring_chunk_output(Char *outx, 512); * void foo(Char *outx) { * memmove(outx, somedata, 512); * } * */ %define Name ## _chunk_output(TYPEMAP,SIZE) %typemap(in,noblock=1,numinputs=0) TYPEMAP(Char temp[SIZE]) { $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment= #SWIG_FromCharPtrAndSize) TYPEMAP { %append_output(SWIG_FromCharPtrAndSize($1,SIZE)); } %enddef /* * %cstring_bounded_mutable(TYPEMAP, SIZE) * * This macro is used to wrap a string that's going to mutate. * * %cstring_bounded_mutable(Char *in, 512); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define Name ## _bounded_mutable(TYPEMAP,MAX) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) TYPEMAP (int res,Char temp[MAX+1], Char *t = 0, size_t n = 0, int alloc = 0) { res = SWIG_AsCharPtrAndSize($input, &t, &n, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "TYPEMAP", $symname, $argnum); } if ( n > (size_t) MAX ) n = (size_t) MAX; memcpy(temp, t, sizeof(Char)*n); if (alloc == SWIG_NEWOBJ) %delete_array(t); temp[n - 1] = 0; $1 = ($1_ltype) temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { $1[MAX] = 0; %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_mutable(TYPEMAP [, expansion]) * * This macro is used to wrap a string that will mutate in place. * It may change size up to a user-defined expansion. * * %cstring_mutable(Char *in); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define Name ## _mutable(TYPEMAP,EXP...) %typemap(in,noblock=1,fragment=#SWIG_AsCharPtrAndSize) TYPEMAP (int res, Char *t = 0, size_t n = 0, int alloc = 0, size_t expansion = 0) { #if #EXP != "" expansion += EXP; #endif res = SWIG_AsCharPtrAndSize($input, &t, &n, &alloc); if (!SWIG_IsOK(res)) { %argument_fail(res, "TYPEMAP", $symname, $argnum); } $1 = %new_array(n+expansion, $*1_ltype); memcpy($1,t,sizeof(Char)*n); if (alloc == SWIG_NEWOBJ) %delete_array(t); $1[n-1] = 0; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { %append_output(SWIG_FromCharPtr($1)); %delete_array($1); } %enddef /* * %cstring_output_maxsize(TYPEMAP, SIZE) * * This macro returns data in a string of some user-defined size. * * %cstring_output_maxsize(Char *outx, int max) { * void foo(Char *outx, int max) { * sprintf(outx,"blah blah\n"); * } */ %define Name ## _output_maxsize(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=SWIG_AsVal_frag(size_t)) (TYPEMAP, SIZE) (int res, size_t size, Char *buff = 0) { res = SWIG_AsVal(size_t)($input, &size); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } buff= %new_array(size+1, Char); $2 = %numeric_cast(size, $2_ltype); $1 = %static_cast(buff, $1_ltype); } %typemap(freearg,noblock=1,match="in") (TYPEMAP,SIZE) { if (buff$argnum) %delete_array(buff$argnum); } %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) (TYPEMAP,SIZE) { %append_output(SWIG_FromCharPtr($1)); } %enddef /* * %cstring_output_withsize(TYPEMAP, SIZE) * * This macro is used to return Character data along with a size * parameter. * * %cstring_output_withsize(Char *outx, int *max) { * void foo(Char *outx, int *max) { * sprintf(outx,"blah blah\n"); * *max = strlen(outx); * } */ %define Name ## _output_withsize(TYPEMAP, SIZE) %typemap(in,noblock=1,fragment=SWIG_AsVal_frag(size_t)) (TYPEMAP, SIZE) (int res, size_t n, Char *buff = 0, $*2_ltype size) { res = SWIG_AsVal(size_t)($input, &n); if (!SWIG_IsOK(res)) { %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum); } buff= %new_array(n+1, Char); $1 = %static_cast(buff, $1_ltype); size = %numeric_cast(n,$*2_ltype); $2 = &size; } %typemap(freearg,noblock=1,match="in")(TYPEMAP,SIZE) { if (buff$argnum) %delete_array(buff$argnum); } %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtrAndSize) (TYPEMAP,SIZE) { %append_output(SWIG_FromCharPtrAndSize($1,*$2)); } %enddef /* * %cstring_output_allocate(TYPEMAP, RELEASE) * * This macro is used to return Character data that was * allocated with new or malloc. * * %cstring_output_allocate(Char **outx, free($1)); * void foo(Char **outx) { * *outx = (Char *) malloc(512); * sprintf(outx,"blah blah\n"); * } */ %define Name ## _output_allocate(TYPEMAP, RELEASE) %typemap(in,noblock=1,numinputs=0) TYPEMAP($*1_ltype temp = 0) { $1 = &temp; } %typemap(freearg,match="in") TYPEMAP ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtr) TYPEMAP { if (*$1) { %append_output(SWIG_FromCharPtr(*$1)); RELEASE; } } %enddef /* * %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) * * This macro is used to return Character data that was * allocated with new or malloc. * * %cstring_output_allocate_size(Char **outx, int *sz, free($1)); * void foo(Char **outx, int *sz) { * *outx = (Char *) malloc(512); * sprintf(outx,"blah blah\n"); * *sz = strlen(outx); * } */ %define Name ## _output_allocate_size(TYPEMAP, SIZE, RELEASE) %typemap(in,noblock=1,numinputs=0) (TYPEMAP, SIZE) ($*1_ltype temp = 0, $*2_ltype tempn) { $1 = &temp; $2 = &tempn; } %typemap(freearg,match="in") (TYPEMAP,SIZE) ""; %typemap(argout,noblock=1,fragment=#SWIG_FromCharPtrAndSize)(TYPEMAP,SIZE) { if (*$1) { %append_output(SWIG_FromCharPtrAndSize(*$1,*$2)); RELEASE; } } %enddef %enddef swig-3.0.12/Lib/cwstring.i0000664000175000017500000000041113042756442015151 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cwstring.i * ----------------------------------------------------------------------------- */ %echo "cwstring.i not implemented for this target" #define SWIG_CWSTRING_UNIMPL swig-3.0.12/Lib/constraints.i0000664000175000017500000001560713042756442015675 0ustar williamwilliam/* ----------------------------------------------------------------------------- * constraints.i * * SWIG constraints library. * * SWIG library file containing typemaps for implementing various kinds of * constraints. Depends upon the SWIG exception library for generating * errors in a language-independent manner. * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %text %{ %include This library provides support for applying constraints to function arguments. Using a constraint, you can restrict arguments to be positive numbers, non-NULL pointers, and so on. The following constraints are available : Number POSITIVE - Positive number (not zero) Number NEGATIVE - Negative number (not zero) Number NONZERO - Nonzero number Number NONNEGATIVE - Positive number (including zero) Number NONPOSITIVE - Negative number (including zero) Pointer NONNULL - Non-NULL pointer Pointer ALIGN8 - 8-byte aligned pointer Pointer ALIGN4 - 4-byte aligned pointer Pointer ALIGN2 - 2-byte aligned pointer To use the constraints, you need to "apply" them to specific function arguments in your code. This is done using the %apply directive. For example : %apply Number NONNEGATIVE { double nonneg }; double sqrt(double nonneg); // Name of argument must match %apply Pointer NONNULL { void *ptr }; void *malloc(int POSITIVE); // May return a NULL pointer void free(void *ptr); // May not accept a NULL pointer Any function argument of the type you specify with the %apply directive will be checked with the appropriate constraint. Multiple types may be specified as follows : %apply Pointer NONNULL { void *, Vector *, List *, double *}; In this case, all of the types listed would be checked for non-NULL pointers. The common datatypes of int, short, long, unsigned int, unsigned long, unsigned short, unsigned char, signed char, float, and double can be checked without using the %apply directive by simply using the constraint name as the parameter name. For example : double sqrt(double NONNEGATIVE); double log(double POSITIVE); If you have used typedef to change type-names, you can also do this : %apply double { Real }; // Make everything defined for doubles // work for Reals. Real sqrt(Real NONNEGATIVE); Real log(Real POSITIVE); %} #endif %include #ifdef SWIGCSHARP // Required attribute for C# exception handling #define SWIGCSHARPCANTHROW , canthrow=1 #else #define SWIGCSHARPCANTHROW #endif // Positive numbers %typemap(check SWIGCSHARPCANTHROW) int POSITIVE, short POSITIVE, long POSITIVE, unsigned int POSITIVE, unsigned short POSITIVE, unsigned long POSITIVE, signed char POSITIVE, unsigned char POSITIVE, float POSITIVE, double POSITIVE, Number POSITIVE { if ($1 <= 0) { SWIG_exception(SWIG_ValueError,"Expected a positive value."); } } // Negative numbers %typemap(check SWIGCSHARPCANTHROW) int NEGATIVE, short NEGATIVE, long NEGATIVE, unsigned int NEGATIVE, unsigned short NEGATIVE, unsigned long NEGATIVE, signed char NEGATIVE, unsigned char NEGATIVE, float NEGATIVE, double NEGATIVE, Number NEGATIVE { if ($1 >= 0) { SWIG_exception(SWIG_ValueError,"Expected a negative value."); } } // Nonzero numbers %typemap(check SWIGCSHARPCANTHROW) int NONZERO, short NONZERO, long NONZERO, unsigned int NONZERO, unsigned short NONZERO, unsigned long NONZERO, signed char NONZERO, unsigned char NONZERO, float NONZERO, double NONZERO, Number NONZERO { if ($1 == 0) { SWIG_exception(SWIG_ValueError,"Expected a nonzero value."); } } // Nonnegative numbers %typemap(check SWIGCSHARPCANTHROW) int NONNEGATIVE, short NONNEGATIVE, long NONNEGATIVE, unsigned int NONNEGATIVE, unsigned short NONNEGATIVE, unsigned long NONNEGATIVE, signed char NONNEGATIVE, unsigned char NONNEGATIVE, float NONNEGATIVE, double NONNEGATIVE, Number NONNEGATIVE { if ($1 < 0) { SWIG_exception(SWIG_ValueError,"Expected a non-negative value."); } } // Nonpositive numbers %typemap(check SWIGCSHARPCANTHROW) int NONPOSITIVE, short NONPOSITIVE, long NONPOSITIVE, unsigned int NONPOSITIVE, unsigned short NONPOSITIVE, unsigned long NONPOSITIVE, signed char NONPOSITIVE, unsigned char NONPOSITIVE, float NONPOSITIVE, double NONPOSITIVE, Number NONPOSITIVE { if ($1 > 0) { SWIG_exception(SWIG_ValueError,"Expected a non-positive value."); } } // Non-NULL pointer %typemap(check SWIGCSHARPCANTHROW) void * NONNULL, Pointer NONNULL { if (!$1) { SWIG_exception(SWIG_ValueError,"Received a NULL pointer."); } } // Aligned pointers %typemap(check SWIGCSHARPCANTHROW) void * ALIGN8, Pointer ALIGN8 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 7) { SWIG_exception(SWIG_ValueError,"Pointer must be 8-byte aligned."); } } %typemap(check SWIGCSHARPCANTHROW) void * ALIGN4, Pointer ALIGN4 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 3) { SWIG_exception(SWIG_ValueError,"Pointer must be 4-byte aligned."); } } %typemap(check SWIGCSHARPCANTHROW) void * ALIGN2, Pointer ALIGN2 { unsigned long long tmp; tmp = (unsigned long long) $1; if (tmp & 1) { SWIG_exception(SWIG_ValueError,"Pointer must be 2-byte aligned."); } } swig-3.0.12/Lib/swigwarnings.swg0000664000175000017500000001566613042756442016425 0ustar williamwilliam/* Include the internal swig macro codes. These macros correspond to the one found in Source/Include/swigwarn.h plus the 'SWIG' prefix. For example, in the include file 'swigwarn.h' you will find #define WARN_TYPEMAP_CHARLEAK ... and in the 'swigwarn.swg' interface, you will see %define SWIGWARN_TYPEMAP_CHARLEAK ... This code can be used in warning filters as follows: %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK); Warnings messages used in typemaps. Message names will be the same as those in Lib/swigwarn.swg but with the suffix _MSG. For example, for the code SWIGWARN_TYPEMAP_CHARLEAK, once you use %typemapmsg(CHARLEAK,); you use the message in your typemap as %typemap(varin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) char * while you suppress the warning using %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK); as described above. */ /* ----------------------------------------------------------------------------- * SWIG warning codes * ----------------------------------------------------------------------------- */ %include /* ----------------------------------------------------------------------------- * Auxiliary macros * ----------------------------------------------------------------------------- */ /* Macro to define warning messages */ #define %_warningmsg(Val, Msg...) `Val`":"Msg #define %warningmsg(Val, Msg...) %_warningmsg(Val, Msg) /* ----------------------------------------------------------------------------- * Typemap related warning messages * ----------------------------------------------------------------------------- */ %define SWIGWARN_TYPEMAP_CHARLEAK_MSG "451:Setting a const char * variable may leak memory." %enddef %define SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG "454:Setting a pointer/reference variable may leak memory." %enddef %define SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG "470:Thread/reentrant unsafe wrapping, consider returning by value instead." %enddef %define SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG "473:Returning a pointer or reference in a director method is not recommended." %enddef %define SWIGWARN_TYPEMAP_INITIALIZER_LIST_MSG "476:Initialization using std::initializer_list." %enddef /* ----------------------------------------------------------------------------- * Operator related warning messages * ----------------------------------------------------------------------------- */ %define SWIGWARN_IGNORE_OPERATOR_NEW_MSG "350:operator new ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DELETE_MSG "351:operator delete ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUS_MSG "352:operator+ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUS_MSG "353:operator- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MUL_MSG "354:operator* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DIV_MSG "355:operator/ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MOD_MSG "356:operator% ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_XOR_MSG "357:operator^ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_AND_MSG "358:operator& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_OR_MSG "359:operator| ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NOT_MSG "360:operator~ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LNOT_MSG "361:operator! ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_EQ_MSG "362:operator= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LT_MSG "363:operator< ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_GT_MSG "364:operator> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUSEQ_MSG "365:operator+= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUSEQ_MSG "366:operator-= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MULEQ_MSG "367:operator*= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DIVEQ_MSG "368:operator/= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MODEQ_MSG "369:operator%= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_XOREQ_MSG "370:operator^= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ANDEQ_MSG "371:operator&= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_OREQ_MSG "372:operator|= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LSHIFT_MSG "373:operator<< ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_RSHIFT_MSG "374:operator>> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LSHIFTEQ_MSG "375:operator<<= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_RSHIFTEQ_MSG "376:operator>>= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_EQUALTO_MSG "377:operator== ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NOTEQUAL_MSG "378:operator!= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LTEQUAL_MSG "379:operator<= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_GTEQUAL_MSG "380:operator>= ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LAND_MSG "381:operator&& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_LOR_MSG "382:operator|| ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_PLUSPLUS_MSG "383:operator++ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_MINUSMINUS_MSG "384:operator-- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_COMMA_MSG "385:operator-- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ARROWSTAR_MSG "386:operator->* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_ARROW_MSG "387:operator-> ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_CALL_MSG "388:operator() ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_INDEX_MSG "389:operator[] ignored (consider using %%extend)" %enddef %define SWIGWARN_IGNORE_OPERATOR_UPLUS_MSG "390:operator+ ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UMINUS_MSG "391:operator- ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UMUL_MSG "392:operator* ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_UAND_MSG "393:operator& ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_NEWARR_MSG "394:operator new[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DELARR_MSG "395:operator delete[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_REF_MSG "396:operator*() ignored" %enddef #define %ignoreoperator(Oper) %ignorewarn(SWIGWARN_IGNORE_OPERATOR_##Oper##_MSG) /* ----------------------------------------------------------------------------- * Macros for keyword and built-in names * ----------------------------------------------------------------------------- */ #define %keywordwarn(msg...) %namewarn(%warningmsg(SWIGWARN_PARSE_KEYWORD, msg)) #define %builtinwarn(msg...) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, msg), %$isfunction) /* ----------------------------------------------------------------------------- * Warning filter feature * ----------------------------------------------------------------------------- */ #define %_warnfilter(filter...) %feature("warnfilter",`filter`) #define %warnfilter(filter...) %_warnfilter(filter) swig-3.0.12/Lib/allkw.swg0000664000175000017500000000144313042756442015001 0ustar williamwilliam#ifndef __Lib_allkw_swg__ #define __Lib_allkw_swg__ /* Include all the known keyword warnings. Very useful for adding test files to the test-suite, or checking if your own library is ok for all the swig supported languages. Use as swig -Wallkw ... If you add a new language, remember to create a separate languagekw.swg file, and add it here. */ %include %include %include %include %include %include %include %include %include %include %include %include %include %include %include #endif //__Lib_allkw_swg__ swig-3.0.12/Lib/runtime.swg0000664000175000017500000000232413042756442015351 0ustar williamwilliam/* -----------------------------------------------------------------------------* Standard SWIG API for use inside user code. Don't include this file directly, run the command swig -python -external-runtime Also, read the Modules chapter of the SWIG Manual. * -----------------------------------------------------------------------------*/ #ifdef SWIG_MODULE_CLIENTDATA_TYPE SWIGRUNTIMEINLINE swig_type_info * SWIG_TypeQuery(SWIG_MODULE_CLIENTDATA_TYPE clientdata, const char *name) { swig_module_info *module = SWIG_GetModule(clientdata); return SWIG_TypeQueryModule(module, module, name); } SWIGRUNTIMEINLINE swig_type_info * SWIG_MangledTypeQuery(SWIG_MODULE_CLIENTDATA_TYPE clientdata, const char *name) { swig_module_info *module = SWIG_GetModule(clientdata); return SWIG_MangledTypeQueryModule(module, module, name); } #else SWIGRUNTIMEINLINE swig_type_info * SWIG_TypeQuery(const char *name) { swig_module_info *module = SWIG_GetModule(NULL); return SWIG_TypeQueryModule(module, module, name); } SWIGRUNTIMEINLINE swig_type_info * SWIG_MangledTypeQuery(const char *name) { swig_module_info *module = SWIG_GetModule(NULL); return SWIG_MangledTypeQueryModule(module, module, name); } #endif swig-3.0.12/Lib/attribute.i0000664000175000017500000000076013042756442015323 0ustar williamwilliam/* ----------------------------------------------------------------------------- * attribute.i * * SWIG library file for implementing attributes. * ----------------------------------------------------------------------------- */ /* we use a simple exception warning here */ %{ #include %} #define %attribute_exception(code,msg) printf("%s\n",msg) #ifndef %arg #define %arg(x...) x #endif #ifndef %mangle #define %mangle(Type...) #@Type #endif %include swig-3.0.12/Lib/perl5/0000775000175000017500000000000013042756442014172 5ustar williamwilliamswig-3.0.12/Lib/perl5/std_deque.i0000664000175000017500000000003413042756442016316 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/perl5.swg0000664000175000017500000000270413042756442015746 0ustar williamwilliam/* ------------------------------------------------------------ * perl.swg * * Perl configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Perl keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Perl initialization function * ------------------------------------------------------------ */ %include swig-3.0.12/Lib/perl5/director.swg0000664000175000017500000001613313042756442016533 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Perl proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PERL_HEADER_ #define SWIG_DIRECTOR_PERL_HEADER_ #include #include #include #include #include /* Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the native C++ RTTI and dynamic_cast<>. But be aware that directors could stop working when using this option. */ #ifdef SWIG_DIRECTOR_NORTTI /* When we don't use the native C++ RTTI, we implement a minimal one only for Directors. */ # ifndef SWIG_DIRECTOR_RTDIR # define SWIG_DIRECTOR_RTDIR namespace Swig { class Director; SWIGINTERN std::map& get_rtdir_map() { static std::map rtdir_map; return rtdir_map; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { get_rtdir_map()[vptr] = rtdir; } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { std::map::const_iterator pos = get_rtdir_map().find(vptr); Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; return rtdir; } } # endif /* SWIG_DIRECTOR_RTDIR */ # define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) #else # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) #endif /* SWIG_DIRECTOR_NORTTI */ extern "C" { struct swig_type_info; } namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() {} virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem *operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* base class for director exceptions */ class DirectorException : public std::exception { public: virtual SV *getNative() const = 0; }; /* exceptions emitted by Perl */ class DirectorMethodException : public DirectorException { protected: SV *err; public: DirectorMethodException(SV *sv = sv_mortalcopy(ERRSV)) : err(sv) { SvREFCNT_inc(err); } const char *what() const throw() { return SvPV_nolen(err); } SV *getNative() const { return sv_2mortal(newSVsv(err)); } static void raise(SV *sv) { throw DirectorMethodException(sv); } }; /* exceptions emitted by wrap code */ class DirectorWrapException : public DirectorException { protected: std::string msg; DirectorWrapException(const char *str) : msg(str) { } public: virtual ~DirectorWrapException() throw() { } const char *what() const throw() { return msg.c_str(); } virtual SV *getNative() const { return sv_2mortal(newSVpvn(msg.data(), msg.size())); } }; class DirectorTypeMismatchException : public DirectorWrapException { public: DirectorTypeMismatchException(const char *str) : DirectorWrapException(str) { } static void raise(const char *type, const char *msg) { std::string err = std::string(type); err += ": "; err += msg; throw DirectorTypeMismatchException(err.c_str()); } }; class DirectorPureVirtualException : public DirectorWrapException { public: DirectorPureVirtualException(const char *name) : DirectorWrapException("SWIG director pure virtual method called: ") { msg += name; } static void raise(const char *name) { throw DirectorPureVirtualException(name); } }; /* director base class */ class Director { private: /* pointer to the wrapped perl object */ SV *swig_self; /* class of wrapped perl object */ std::string swig_class; /* flag indicating whether the object is owned by perl or c++ */ mutable bool swig_disown_flag; /* decrement the reference count of the wrapped perl object */ void swig_decref() const { if (swig_disown_flag) { SvREFCNT_dec(swig_self); } } public: /* wrap a Perl object. */ Director(SV *pkg) : swig_disown_flag(false) { STRLEN len; char *str = SvPV(pkg, len); swig_class = std::string(str, len); swig_self = newRV_inc((SV *)newHV()); } /* discard our reference at destruction */ virtual ~Director() { swig_decref(); } /* return a pointer to the wrapped Perl object */ SV *swig_get_self() const { return swig_self; } const char *swig_get_class() const { return swig_class.c_str(); } /* acquire ownership of the wrapped Perl object (the sense of "disown" is from perl) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; swig_incref(); } } /* increase the reference count of the wrapped Perl object */ void swig_incref() const { if (swig_disown_flag) { SvREFCNT_inc(swig_self); } } /* methods to implement pseudo protected director members */ virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const { return true; } virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const { } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, int own) const { if (vptr && own) { swig_owner[vptr] = new GCItem_Object(own); } } int swig_release_ownership(void *vptr) const { int own = 0; if (vptr) { swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own = iter->second->get_own(); swig_owner.erase(iter); } } return own; } }; } #endif swig-3.0.12/Lib/perl5/cpointer.i0000664000175000017500000000004113042756442016162 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/perlruntime.swg0000664000175000017500000000050613042756442017263 0ustar williamwilliam %runtime "swigrun.swg" // Common C API type-checking code %runtime "swigerrors.swg" // SWIG errors %runtime "perlhead.swg" // Perl includes and fixes %runtime "perlerrors.swg" // Perl errors %runtime "perlrun.swg" // Perl runtime functions %runtime "noembed.h" // undefine Perl5 macros swig-3.0.12/Lib/perl5/perlprimtypes.swg0000664000175000017500000002023413042756442017634 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* bool */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(bool)(bool value) { return boolSV(value); } } %fragment(SWIG_AsVal_frag(bool),"header") { SWIGINTERN int SWIG_AsVal_dec(bool)(SV *obj, bool* val) { if (obj == &PL_sv_yes) { if (val) *val = true; return SWIG_OK; } else if (obj == &PL_sv_no) { if (val) *val = false; return SWIG_OK; } else { if (val) *val = SvTRUE(obj) ? true : false; return SWIG_AddCast(SWIG_OK); } } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(long)(long value) { SV *sv; if (IVSIZE >= sizeof(value) || (value >= IV_MIN && value <= IV_MAX)) sv = newSViv(value); else sv = newSVpvf("%ld", value); return sv_2mortal(sv); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="", fragment="", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(SV *obj, long* val) { if (SvUOK(obj)) { UV v = SvUV(obj); if (UVSIZE < sizeof(*val) || v <= LONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (IVSIZE <= sizeof(*val) || (v >= LONG_MIN && v <= LONG_MAX)) { if(val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; long v; errno = 0; v = strtol(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(unsigned long)(unsigned long value) { SV *sv; if (UVSIZE >= sizeof(value) || value <= UV_MAX) sv = newSVuv(value); else sv = newSVpvf("%lu", value); return sv_2mortal(sv); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="", fragment="", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(SV *obj, unsigned long *val) { if (SvUOK(obj)) { UV v = SvUV(obj); if (UVSIZE <= sizeof(*val) || v <= ULONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (v >= 0 && (IVSIZE <= sizeof(*val) || v <= ULONG_MAX)) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; unsigned long v; errno = 0; v = strtoul(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SV * SWIG_From_dec(long long)(long long value) { SV *sv; if (IVSIZE >= sizeof(value) || (value >= IV_MIN && value <= IV_MAX)) sv = newSViv((IV)(value)); else { //sv = newSVpvf("%lld", value); doesn't work in non 64bit Perl char temp[256]; sprintf(temp, "%lld", value); sv = newSVpv(temp, 0); } return sv_2mortal(sv); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable", fragment="", fragment="SWIG_CanCastAsInteger") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(SV *obj, long long *val) { if (SvUOK(obj)) { UV v = SvUV(obj); /* pretty sure this could allow v == LLONG MAX */ if (UVSIZE < sizeof(*val) || v < LLONG_MAX) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (IVSIZE <= sizeof(*val) || (v >= LLONG_MIN && v <= LLONG_MAX)) { if (val) *val = v; return SWIG_OK; } return SWIG_OverflowError; } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; long long v; errno = 0; v = strtoll(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return res; } } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable", fragment="") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SV * SWIG_From_dec(unsigned long long)(unsigned long long value) { SV *sv; if (UVSIZE >= sizeof(value) || value <= UV_MAX) sv = newSVuv((UV)(value)); else { //sv = newSVpvf("%llu", value); doesn't work in non 64bit Perl char temp[256]; sprintf(temp, "%llu", value); sv = newSVpv(temp, 0); } return sv_2mortal(sv); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable", fragment="", fragment="SWIG_CanCastAsInteger") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(SV *obj, unsigned long long *val) { if (SvUOK(obj)) { /* pretty sure this should be conditional on * (UVSIZE <= sizeof(*val) || v <= ULLONG_MAX) */ if (val) *val = SvUV(obj); return SWIG_OK; } else if (SvIOK(obj)) { IV v = SvIV(obj); if (v >= 0 && (IVSIZE <= sizeof(*val) || v <= ULLONG_MAX)) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else { int dispatch = 0; const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; unsigned long long v; errno = 0; v = strtoull(nptr, &endptr,0); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } if (!dispatch) { const double mant_max = 1LL << DBL_MANT_DIG; double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return res; } } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(double)(double value) { return sv_2mortal(newSVnv(value)); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(SV *obj, double *val) { if (SvNIOK(obj)) { if (val) *val = SvNV(obj); return SWIG_OK; } else if (SvIOK(obj)) { if (val) *val = (double) SvIV(obj); return SWIG_AddCast(SWIG_OK); } else { const char *nptr = SvPV_nolen(obj); if (nptr) { char *endptr; double v; errno = 0; v = strtod(nptr, &endptr); if (errno == ERANGE) { errno = 0; return SWIG_OverflowError; } else { if (*endptr == '\0') { if (val) *val = v; return SWIG_Str2NumCast(SWIG_OK); } } } } return SWIG_TypeError; } } swig-3.0.12/Lib/perl5/std_vector.i0000664000175000017500000005450213042756442016526 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector types * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Perl as much as possible, namely, to allow the user to pass and // be returned Perl arrays. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Perl sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Perl sequence of T:s // is returned which is most easily used in other Perl functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class vector { %typemap(in) vector (std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1) { $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i& (std::vector temp, std::vector* v), const vector* (std::vector temp, std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; SV **tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; SV **tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector &); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector (std::vector* v) { int res = SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0); if (SWIG_IsOK(res)){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); I32 len = av_len(av) + 1; for (int i=0; i& (std::vector temp,std::vector* v), const vector* (std::vector temp,std::vector* v) { int res = SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0); if (SWIG_IsOK(res)) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); I32 len = av_len(av) + 1; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T *>* v; int res = SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0); if (SWIG_IsOK(res)) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ void *v; SV **tv = av_fetch(av, 0, 0); int res = SWIG_ConvertPtr(*tv, &v, $descriptor(T *),0); if (SWIG_IsOK(res)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&,const vector* { { /* wrapped vector? */ std::vector< T *> *v; int res = SWIG_ConvertPtr($input,%as_voidptrptr(&v), $1_descriptor,0); if (SWIG_IsOK(res)) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ void *v; SV **tv = av_fetch(av, 0, 0); int res = SWIG_ConvertPtr(*tv, &v, $descriptor(T *),0); if (SWIG_IsOK(res)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T *value); vector(const vector &); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T *x); %extend { T *pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T *x = self->back(); self->pop_back(); return x; } T *get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector (std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i& (std::vector temp, std::vector* v), const vector* (std::vector temp, std::vector* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i { size_t len = $1.size(); SV **svs = new SV*[len]; for (size_t i=0; i { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SV **tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SV **tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(unsigned int size = 0); vector(unsigned int size, T value); vector(const vector &); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i SWIGRUNTIME const char * SWIG_Perl_TypeProxyName(const swig_type_info *type) { if (!type) return NULL; if (type->clientdata != NULL) { return (const char*) type->clientdata; } else { return type->name; } } /* Identical to SWIG_TypeCheck, except for strcmp comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeProxyCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(SWIG_Perl_TypeProxyName(iter->type), c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Function for getting a pointer value */ SWIGRUNTIME int SWIG_Perl_ConvertPtrAndOwn(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags, int *own) { swig_cast_info *tc; void *voidptr = (void *)0; SV *tsv = 0; if (own) *own = 0; /* If magical, apply more magic */ if (SvGMAGICAL(sv)) mg_get(sv); /* Check to see if this is an object */ if (sv_isobject(sv)) { IV tmp = 0; tsv = (SV*) SvRV(sv); if ((SvTYPE(tsv) == SVt_PVHV)) { MAGIC *mg; if (SvMAGICAL(tsv)) { mg = mg_find(tsv,'P'); if (mg) { sv = mg->mg_obj; if (sv_isobject(sv)) { tsv = (SV*)SvRV(sv); tmp = SvIV(tsv); } } } else { return SWIG_ERROR; } } else { tmp = SvIV(tsv); } voidptr = INT2PTR(void *,tmp); } else if (! SvOK(sv)) { /* Check for undef */ *(ptr) = (void *) 0; return SWIG_OK; } else if (SvTYPE(sv) == SVt_RV) { /* Check for NULL pointer */ if (!SvROK(sv)) { /* In Perl 5.12 and later, SVt_RV == SVt_IV, so sv could be a valid integer value. */ if (SvIOK(sv)) { return SWIG_ERROR; } else { /* NULL pointer (reference to undef). */ *(ptr) = (void *) 0; return SWIG_OK; } } else { return SWIG_ERROR; } } else { /* Don't know what it is */ return SWIG_ERROR; } if (_t) { /* Now see if the types match */ char *_c = HvNAME(SvSTASH(SvRV(sv))); tc = SWIG_TypeProxyCheck(_c,_t); #ifdef SWIG_DIRECTORS if (!tc && !sv_derived_from(sv,SWIG_Perl_TypeProxyName(_t))) { #else if (!tc) { #endif return SWIG_ERROR; } { int newmemory = 0; *ptr = SWIG_TypeCast(tc,voidptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } } else { *ptr = voidptr; } /* * DISOWN implementation: we need a perl guru to check this one. */ if (tsv && (flags & SWIG_POINTER_DISOWN)) { /* * almost copy paste code from below SWIG_POINTER_OWN setting */ SV *obj = sv; HV *stash = SvSTASH(SvRV(obj)); GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); if (isGV(gv)) { HV *hv = GvHVn(gv); /* * To set ownership (see below), a newSViv(1) entry is added. * Hence, to remove ownership, we delete the entry. */ if (hv_exists_ent(hv, obj, 0)) { hv_delete_ent(hv, obj, 0, 0); } } } return SWIG_OK; } SWIGRUNTIME int SWIG_Perl_ConvertPtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void **ptr, swig_type_info *_t, int flags) { return SWIG_Perl_ConvertPtrAndOwn(sv, ptr, _t, flags, 0); } SWIGRUNTIME void SWIG_Perl_MakePtr(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, swig_type_info *t, int flags) { if (ptr && (flags & (SWIG_SHADOW | SWIG_POINTER_OWN))) { SV *self; SV *obj=newSV(0); HV *hash=newHV(); HV *stash; sv_setref_pv(obj, SWIG_Perl_TypeProxyName(t), ptr); stash=SvSTASH(SvRV(obj)); if (flags & SWIG_POINTER_OWN) { HV *hv; GV *gv = *(GV**)hv_fetch(stash, "OWNER", 5, TRUE); if (!isGV(gv)) gv_init(gv, stash, "OWNER", 5, FALSE); hv=GvHVn(gv); hv_store_ent(hv, obj, newSViv(1), 0); } sv_magic((SV *)hash, (SV *)obj, 'P', Nullch, 0); SvREFCNT_dec(obj); self=newRV_noinc((SV *)hash); sv_setsv(sv, self); SvREFCNT_dec((SV *)self); sv_bless(sv, stash); } else { sv_setref_pv(sv, SWIG_Perl_TypeProxyName(t), ptr); } } SWIGRUNTIMEINLINE SV * SWIG_Perl_NewPointerObj(SWIG_MAYBE_PERL_OBJECT void *ptr, swig_type_info *t, int flags) { SV *result = sv_newmortal(); SWIG_MakePtr(result, ptr, t, flags); return result; } SWIGRUNTIME void SWIG_Perl_MakePackedObj(SWIG_MAYBE_PERL_OBJECT SV *sv, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(SWIG_Perl_TypeProxyName(type))) > 1000) return; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); strcpy(r,SWIG_Perl_TypeProxyName(type)); sv_setpv(sv, result); } SWIGRUNTIME SV * SWIG_Perl_NewPackedObj(SWIG_MAYBE_PERL_OBJECT void *ptr, int sz, swig_type_info *type) { SV *result = sv_newmortal(); SWIG_Perl_MakePackedObj(result, ptr, sz, type); return result; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Perl_ConvertPacked(SWIG_MAYBE_PERL_OBJECT SV *obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c = 0; if ((!obj) || (!SvOK(obj))) return SWIG_ERROR; c = SvPV_nolen(obj); /* Pointer values must start with leading underscore */ if (*c != '_') return SWIG_ERROR; c++; c = SWIG_UnpackData(c,ptr,sz); if (ty) { tc = SWIG_TypeCheck(c,ty); if (!tc) return SWIG_ERROR; } return SWIG_OK; } /* Macros for low-level exception handling */ #define SWIG_croak(x) { SWIG_Error(SWIG_RuntimeError, x); SWIG_fail; } typedef XSPROTO(SwigPerlWrapper); typedef SwigPerlWrapper *SwigPerlWrapperPtr; /* Structure for command table */ typedef struct { const char *name; SwigPerlWrapperPtr wrapper; } swig_command_info; /* Information for constant table */ #define SWIG_INT 1 #define SWIG_FLOAT 2 #define SWIG_STRING 3 #define SWIG_POINTER 4 #define SWIG_BINARY 5 /* Constant information structure */ typedef struct swig_constant_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_constant_info; /* Structure for variable table */ typedef struct { const char *name; SwigMagicFunc set; SwigMagicFunc get; swig_type_info **type; } swig_variable_info; /* Magic variable code */ #ifndef PERL_OBJECT # ifdef __cplusplus # define swig_create_magic(s,a,b,c) _swig_create_magic(s,const_cast(a),b,c) # else # define swig_create_magic(s,a,b,c) _swig_create_magic(s,(char*)(a),b,c) # endif # ifndef MULTIPLICITY SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(SV *, MAGIC *), int (*get)(SV *,MAGIC *)) # else SWIGRUNTIME void _swig_create_magic(SV *sv, char *name, int (*set)(struct interpreter*, SV *, MAGIC *), int (*get)(struct interpreter*, SV *,MAGIC *)) # endif #else # define swig_create_magic(s,a,b,c) _swig_create_magic(pPerl,s,a,b,c) SWIGRUNTIME void _swig_create_magic(CPerlObj *pPerl, SV *sv, const char *name, int (CPerlObj::*set)(SV *, MAGIC *), int (CPerlObj::*get)(SV *, MAGIC *)) #endif { MAGIC *mg; sv_magic(sv,sv,'U',name,strlen(name)); mg = mg_find(sv,'U'); mg->mg_virtual = (MGVTBL *) malloc(sizeof(MGVTBL)); mg->mg_virtual->svt_get = (SwigMagicFunc) get; mg->mg_virtual->svt_set = (SwigMagicFunc) set; mg->mg_virtual->svt_len = 0; mg->mg_virtual->svt_clear = 0; mg->mg_virtual->svt_free = 0; } SWIGRUNTIME swig_module_info * SWIG_Perl_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; SV *pointer; /* first check if pointer already created */ if (!type_pointer) { pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, FALSE | GV_ADDMULTI); if (pointer && SvOK(pointer)) { type_pointer = INT2PTR(swig_type_info **, SvIV(pointer)); } } return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_Perl_SetModule(swig_module_info *module) { SV *pointer; /* create a new pointer */ pointer = get_sv("swig_runtime_data::type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, TRUE | GV_ADDMULTI); sv_setiv(pointer, PTR2IV(module)); } #ifdef __cplusplus } #endif swig-3.0.12/Lib/perl5/Makefile.in0000664000175000017500000000664413042756442016251 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Perl5 Makefile # # This file can be used to build various Perl5 extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = myperl # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -perl5 SWIGCC = $(CC) # SWIG Library files. Uncomment this to statically rebuild Perl #SWIGLIBS = -static -lperlmain.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Perl installation PERL_INCLUDE = -I@PERL5EXT@ PERL_LIB = -L@PERL5EXT@ -lperl PERL_FLAGS = -Dbool=char -Dexplicit= # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options BUILD_LIBS = $(LIBS) # Dynamic loading # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(INCLUDES) $(PERL_INCLUDE) $(PERL_FLAGS) $(WRAPFILE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-3.0.12/Lib/perl5/Makefile.pl0000664000175000017500000000126013042756442016243 0ustar williamwilliam# File : Makefile.pl # MakeMaker file for a SWIG module. Use this file if you are # producing a module for general use or distribution. # # 1. Modify the file as appropriate. Replace $module with the # real name of your module and wrapper file. # 2. Run perl as 'perl Makefile.pl' # 3. Type 'make' to build your module # 4. Type 'make install' to install your module. # # See "Programming Perl", 2nd. Ed, for more gory details than # you ever wanted to know. use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => '$module', # Name of your module 'LIBS' => [''], # Custom libraries (if any) 'OBJECT' => '$module_wrap.o' # Object files ); swig-3.0.12/Lib/perl5/perlmain.i0000664000175000017500000000370213042756442016155 0ustar williamwilliam/* ----------------------------------------------------------------------------- * perlmain.i * * Code to statically rebuild perl5. * ----------------------------------------------------------------------------- */ #ifdef AUTODOC %subsection "perlmain.i" %text %{ This module provides support for building a new version of the Perl executable. This will be necessary on systems that do not support shared libraries and may be necessary with C++ extensions. This module may only build a stripped down version of the Perl executable. Thus, it may be necessary (or desirable) to hand-edit this file for your particular application. To do this, simply copy this file from swig_lib/perl5/perlmain.i to your working directory and make the appropriate modifications. This library file works with Perl 5.003. It may work with earlier versions, but it hasn't been tested. As far as I know, this library is C++ safe. %} #endif %{ static void xs_init _((pTHX)); static PerlInterpreter *my_perl; int perl_eval(char *string) { char *argv[2]; argv[0] = string; argv[1] = (char *) 0; return perl_call_argv("eval",0,argv); } int main(int argc, char **argv, char **env) { int exitstatus; my_perl = perl_alloc(); if (!my_perl) exit(1); perl_construct( my_perl ); exitstatus = perl_parse( my_perl, xs_init, argc, argv, (char **) NULL ); if (exitstatus) exit( exitstatus ); /* Initialize all of the module variables */ exitstatus = perl_run( my_perl ); perl_destruct( my_perl ); perl_free( my_perl ); exit( exitstatus ); } /* Register any extra external extensions */ /* Do not delete this line--writemain depends on it */ /* EXTERN_C void boot_DynaLoader _((CV* cv)); */ static void xs_init(pTHX) { /* dXSUB_SYS; */ char *file = __FILE__; { /* newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); */ newXS(SWIG_name, SWIG_init, file); #ifdef SWIGMODINIT SWIGMODINIT #endif } } %} swig-3.0.12/Lib/perl5/cni.i0000664000175000017500000000022613042756442015115 0ustar williamwilliam%warnfilter(SWIGWARN_PARSE_KEYWORD) java::lang::ref; %{ #undef STATIC %} %include %{ #undef TRUE #define TRUE 1 %} %include swig-3.0.12/Lib/perl5/perlhead.swg0000664000175000017500000000506613042756442016507 0ustar williamwilliam#ifdef __cplusplus /* Needed on some windows machines---since MS plays funny games with the header files under C++ */ #include #include extern "C" { #endif #include "EXTERN.h" #include "perl.h" #include "XSUB.h" /* Add in functionality missing in older versions of Perl. Much of this is based on Devel-PPPort on cpan. */ /* Add PERL_REVISION, PERL_VERSION, PERL_SUBVERSION if missing */ #ifndef PERL_REVISION # if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) # define PERL_PATCHLEVEL_H_IMPLICIT # include # endif # if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) # include # endif # ifndef PERL_REVISION # define PERL_REVISION (5) # define PERL_VERSION PATCHLEVEL # define PERL_SUBVERSION SUBVERSION # endif #endif #if defined(WIN32) && defined(PERL_OBJECT) && !defined(PerlIO_exportFILE) #define PerlIO_exportFILE(fh,fl) (FILE*)(fh) #endif #ifndef SvIOK_UV # define SvIOK_UV(sv) (SvIOK(sv) && (SvUVX(sv) == SvIVX(sv))) #endif #ifndef SvUOK # define SvUOK(sv) SvIOK_UV(sv) #endif #if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5))) # define PL_sv_undef sv_undef # define PL_na na # define PL_errgv errgv # define PL_sv_no sv_no # define PL_sv_yes sv_yes # define PL_markstack_ptr markstack_ptr #endif #ifndef IVSIZE # ifdef LONGSIZE # define IVSIZE LONGSIZE # else # define IVSIZE 4 /* A bold guess, but the best we can make. */ # endif #endif #ifndef INT2PTR # if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) # define PTRV UV # define INT2PTR(any,d) (any)(d) # else # if PTRSIZE == LONGSIZE # define PTRV unsigned long # else # define PTRV unsigned # endif # define INT2PTR(any,d) (any)(PTRV)(d) # endif # define NUM2PTR(any,d) (any)(PTRV)(d) # define PTR2IV(p) INT2PTR(IV,p) # define PTR2UV(p) INT2PTR(UV,p) # define PTR2NV(p) NUM2PTR(NV,p) # if PTRSIZE == LONGSIZE # define PTR2ul(p) (unsigned long)(p) # else # define PTR2ul(p) INT2PTR(unsigned long,p) # endif #endif /* !INT2PTR */ #ifndef SvPV_nolen # define SvPV_nolen(x) SvPV(x,PL_na) #endif #ifndef get_sv # define get_sv perl_get_sv #endif #ifndef ERRSV # define ERRSV get_sv("@",FALSE) #endif #ifndef pTHX_ #define pTHX_ #endif #include #ifdef __cplusplus } #endif swig-3.0.12/Lib/perl5/perlfragments.swg0000664000175000017500000000105413042756442017565 0ustar williamwilliam/* Create a file with this name, 'perlfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-3.0.12/Lib/perl5/perlstrings.swg0000664000175000017500000000262113042756442017271 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(SV *obj, char** cptr, size_t* psize, int *alloc) { if (SvMAGICAL(obj)) { SV *tmp = sv_newmortal(); SvSetSV(tmp, obj); obj = tmp; } if (SvPOK(obj)) { STRLEN len = 0; char *cstr = SvPV(obj, len); size_t size = len + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, size, char); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { char* vptr = 0; if (SWIG_ConvertPtr(obj, (void**)&vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = vptr; if (psize) *psize = vptr ? (strlen(vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header") { SWIGINTERNINLINE SV * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { SV *obj = sv_newmortal(); if (carray) { sv_setpvn(obj, carray, size); } else { sv_setsv(obj, &PL_sv_undef); } return obj; } } swig-3.0.12/Lib/perl5/attribute.i0000664000175000017500000000004213042756442016343 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/noembed.h0000664000175000017500000000311413042756442015753 0ustar williamwilliam/* Workaround perl5 global namespace pollution. Note that undefining library * functions like fopen will not solve the problem on all platforms as fopen * might be a macro on Windows but not necessarily on other operating systems. */ #ifdef do_open #undef do_open #endif #ifdef do_close #undef do_close #endif #ifdef do_exec #undef do_exec #endif #ifdef scalar #undef scalar #endif #ifdef list #undef list #endif #ifdef apply #undef apply #endif #ifdef convert #undef convert #endif #ifdef Error #undef Error #endif #ifdef form #undef form #endif #ifdef vform #undef vform #endif #ifdef LABEL #undef LABEL #endif #ifdef METHOD #undef METHOD #endif #ifdef Move #undef Move #endif #ifdef yylex #undef yylex #endif #ifdef yyparse #undef yyparse #endif #ifdef yyerror #undef yyerror #endif #ifdef invert #undef invert #endif #ifdef ref #undef ref #endif #ifdef read #undef read #endif #ifdef write #undef write #endif #ifdef eof #undef eof #endif #ifdef close #undef close #endif #ifdef rewind #undef rewind #endif #ifdef free #undef free #endif #ifdef malloc #undef malloc #endif #ifdef calloc #undef calloc #endif #ifdef Stat #undef Stat #endif #ifdef check #undef check #endif #ifdef seekdir #undef seekdir #endif #ifdef open #undef open #endif #ifdef readdir #undef readdir #endif #ifdef bind #undef bind #endif #ifdef access #undef access #endif #ifdef stat #undef stat #endif #ifdef seed #undef seed #endif #ifdef bool /* Leave if macro is from C99 stdbool.h */ #ifndef __bool_true_false_are_defined #undef bool #endif #endif swig-3.0.12/Lib/perl5/perlmacros.swg0000664000175000017500000000004413042756442017061 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/cmalloc.i0000664000175000017500000000004013042756442015750 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/extra-install.list0000664000175000017500000000006213042756442017654 0ustar williamwilliam# see top-level Makefile.in Makefile.pl noembed.h swig-3.0.12/Lib/perl5/std_common.i0000664000175000017500000000121613042756442016506 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %fragment(""); %{ SWIGINTERN double SwigSvToNumber(SV* sv) { return SvIOK(sv) ? double(SvIVX(sv)) : SvNVX(sv); } SWIGINTERN std::string SwigSvToString(SV* sv) { STRLEN len; char *ptr = SvPV(sv, len); return std::string(ptr, len); } SWIGINTERN void SwigSvFromString(SV* sv, const std::string& s) { sv_setpvn(sv,s.data(),s.size()); } %} swig-3.0.12/Lib/perl5/perlinit.swg0000664000175000017500000000376113042756442016551 0ustar williamwilliam /* Export the SWIG initialization function */ %header %{ #ifdef __cplusplus extern "C" #endif #ifndef PERL_OBJECT #ifndef MULTIPLICITY SWIGEXPORT void SWIG_init (CV* cv); #else SWIGEXPORT void SWIG_init (pTHXo_ CV* cv); #endif #else SWIGEXPORT void SWIG_init (CV *cv, CPerlObj *); #endif %} /* Module initialization function */ %insert(init) "swiginit.swg" %init %{ #if defined(__cplusplus) && ! defined(XSPROTO) extern "C" #endif XS(SWIG_init) { dXSARGS; int i; (void)items; SWIG_InitializeModule(0); /* Install commands */ for (i = 0; swig_commands[i].name; i++) { /* Casts only needed for Perl < 5.10. */ #ifdef __cplusplus newXS(const_cast(swig_commands[i].name), swig_commands[i].wrapper, const_cast(__FILE__)); #else newXS((char*)swig_commands[i].name, swig_commands[i].wrapper, (char*)__FILE__); #endif } /* Install variables */ for (i = 0; swig_variables[i].name; i++) { SV *sv; sv = get_sv(swig_variables[i].name, TRUE | 0x2 | GV_ADDMULTI); if (swig_variables[i].type) { SWIG_MakePtr(sv,(void *)1, *swig_variables[i].type,0); } else { sv_setiv(sv,(IV) 0); } swig_create_magic(sv, swig_variables[i].name, swig_variables[i].set, swig_variables[i].get); } /* Install constant */ for (i = 0; swig_constants[i].type; i++) { SV *sv; sv = get_sv(swig_constants[i].name, TRUE | 0x2 | GV_ADDMULTI); switch(swig_constants[i].type) { case SWIG_INT: sv_setiv(sv, (IV) swig_constants[i].lvalue); break; case SWIG_FLOAT: sv_setnv(sv, (double) swig_constants[i].dvalue); break; case SWIG_STRING: sv_setpv(sv, (const char *) swig_constants[i].pvalue); break; case SWIG_POINTER: SWIG_MakePtr(sv, swig_constants[i].pvalue, *(swig_constants[i].ptype),0); break; case SWIG_BINARY: SWIG_MakePackedObj(sv, swig_constants[i].pvalue, swig_constants[i].lvalue, *(swig_constants[i].ptype)); break; default: break; } SvREADONLY_on(sv); } %} swig-3.0.12/Lib/perl5/std_except.i0000664000175000017500000000004313042756442016503 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/jstring.i0000664000175000017500000000202613042756442016024 0ustar williamwilliam%include %fragment(SWIG_AsVal_frag(jstring),"header") { SWIGINTERN int SWIG_AsVal_dec(jstring)(SV *obj, jstring *val) { if (SvPOK(obj)) { if (val) { STRLEN len = 0; char *cstr = SvPV(obj, len); *val = JvNewStringLatin1(cstr, len); } return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_From_frag(jstring),"header") { SWIGINTERNINLINE SV * SWIG_From_dec(jstring)(jstring val) { SV *obj = sv_newmortal(); if (!val) { sv_setsv(obj, &PL_sv_undef); } else { jsize len = JvGetStringUTFLength(val); if (!len) { sv_setsv(obj, &PL_sv_undef); } else { char *tmp = %new_array(len, char); JvGetStringUTFRegion(val, 0, len, tmp); sv_setpvn(obj, tmp, len); SvUTF8_on(obj); %delete_array(tmp); } } return obj; } } %typemaps_asvalfrom(%checkcode(STRING), %arg(SWIG_AsVal(jstring)), %arg(SWIG_From(jstring)), %arg(SWIG_AsVal_frag(jstring)), %arg(SWIG_From_frag(jstring)), java::lang::String *); swig-3.0.12/Lib/perl5/reference.i0000664000175000017500000001611713042756442016310 0ustar williamwilliam/* ----------------------------------------------------------------------------- * reference.i * * Accept Perl references as pointers * ----------------------------------------------------------------------------- */ /* The following methods make Perl references work like simple C pointers. References can only be used for simple input/output values, not C arrays however. It should also be noted that REFERENCES are specific to Perl and not supported in other scripting languages at this time. int *REFERENCE short *REFERENCE long *REFERENCE unsigned int *REFERENCE unsigned short *REFERENCE unsigned long *REFERENCE unsigned char *REFERENCE float *REFERENCE double *REFERENCE For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include reference.i void neg(double *REFERENCE); or you can use the %apply directive : %include reference.i %apply double *REFERENCE { double *x }; void neg(double *x); Unlike the INOUT mapping described in typemaps.i, this approach directly modifies the value of a Perl reference. Thus, you could use it as follows : $x = 3; neg(\$x); print "$x\n"; # Should print out -3. */ %typemap(in) double *REFERENCE (double dvalue), double &REFERENCE(double dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) { printf("Received %d\n", SvTYPE(tempsv)); SWIG_croak("Expected a double reference."); } dvalue = SvNV(tempsv); $1 = &dvalue; } %typemap(in) float *REFERENCE (float dvalue), float &REFERENCE(float dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if ((!SvNOK(tempsv)) && (!SvIOK(tempsv))) { SWIG_croak("expected a double reference"); } dvalue = (float) SvNV(tempsv); $1 = &dvalue; } %typemap(in) int *REFERENCE (int dvalue), int &REFERENCE (int dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv); $1 = &dvalue; } %typemap(in) short *REFERENCE (short dvalue), short &REFERENCE(short dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (short) SvIV(tempsv); $1 = &dvalue; } %typemap(in) long *REFERENCE (long dvalue), long &REFERENCE(long dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (long) SvIV(tempsv); $1 = &dvalue; } %typemap(in) unsigned int *REFERENCE (unsigned int dvalue), unsigned int &REFERENCE(unsigned int dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned int) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned short *REFERENCE (unsigned short dvalue), unsigned short &REFERENCE(unsigned short dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned short) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned long *REFERENCE (unsigned long dvalue), unsigned long &REFERENCE(unsigned long dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned long) SvUV(tempsv); $1 = &dvalue; } %typemap(in) unsigned char *REFERENCE (unsigned char dvalue), unsigned char &REFERENCE(unsigned char dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (unsigned char) SvUV(tempsv); $1 = &dvalue; } %typemap(in) signed char *REFERENCE (signed char dvalue), signed char &REFERENCE(signed char dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = (signed char) SvIV(tempsv); $1 = &dvalue; } %typemap(in) bool *REFERENCE (bool dvalue), bool &REFERENCE(bool dvalue) { SV *tempsv; if (!SvROK($input)) { SWIG_croak("expected a reference"); } tempsv = SvRV($input); if (!SvIOK(tempsv)) { SWIG_croak("expected an integer reference"); } dvalue = SvIV(tempsv) ? true : false; $1 = &dvalue; } %typemap(typecheck) int *REFERENCE, int &REFERENCE, short *REFERENCE, short &REFERENCE, long *REFERENCE, long &REFERENCE, signed char *REFERENCE, signed char &REFERENCE, bool *REFERENCE, bool &REFERENCE { $1 = SvROK($input) && SvIOK(SvRV($input)); } %typemap(typecheck) double *REFERENCE, double &REFERENCE, float *REFERENCE, float &REFERENCE { $1 = SvROK($input); if($1) { SV *tmpsv = SvRV($input); $1 = SvNOK(tmpsv) || SvIOK(tmpsv); } } %typemap(typecheck) unsigned int *REFERENCE, unsigned int &REFERENCE, unsigned short *REFERENCE, unsigned short &REFERENCE, unsigned long *REFERENCE, unsigned long &REFERENCE, unsigned char *REFERENCE, unsigned char &REFERENCE { $1 = SvROK($input); if($1) { SV *tmpsv = SvRV($input); $1 = SvUOK(tmpsv) || SvIOK(tmpsv); } } %typemap(argout) double *REFERENCE, double &REFERENCE, float *REFERENCE, float &REFERENCE { SV *tempsv; tempsv = SvRV($arg); if (!$1) SWIG_croak("expected a reference"); sv_setnv(tempsv, (double) *$1); } %typemap(argout) int *REFERENCE, int &REFERENCE, short *REFERENCE, short &REFERENCE, long *REFERENCE, long &REFERENCE, signed char *REFERENCE, signed char &REFERENCE, bool *REFERENCE, bool &REFERENCE { SV *tempsv; tempsv = SvRV($input); if (!$1) SWIG_croak("expected a reference"); sv_setiv(tempsv, (IV) *$1); } %typemap(argout) unsigned int *REFERENCE, unsigned int &REFERENCE, unsigned short *REFERENCE, unsigned short &REFERENCE, unsigned long *REFERENCE, unsigned long &REFERENCE, unsigned char *REFERENCE, unsigned char &REFERENCE { SV *tempsv; tempsv = SvRV($input); if (!$1) SWIG_croak("expected a reference"); sv_setuv(tempsv, (UV) *$1); } swig-3.0.12/Lib/perl5/typemaps.i0000664000175000017500000003075713042756442016222 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * The SWIG typemap library provides a language independent mechanism for * supporting output arguments, input values, and other C function * calling mechanisms. The primary use of the library is to provide a * better interface to certain C function--especially those involving * pointers. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %define INPUT_TYPEMAP(type, converter) %typemap(in) type *INPUT(type temp), type &INPUT(type temp) { temp = (type) converter($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %enddef INPUT_TYPEMAP(float, SvNV); INPUT_TYPEMAP(double, SvNV); INPUT_TYPEMAP(int, SvIV); INPUT_TYPEMAP(long, SvIV); INPUT_TYPEMAP(short, SvIV); INPUT_TYPEMAP(signed char, SvIV); INPUT_TYPEMAP(unsigned int, SvUV); INPUT_TYPEMAP(unsigned long, SvUV); INPUT_TYPEMAP(unsigned short, SvUV); INPUT_TYPEMAP(unsigned char, SvUV); %typemap(in) bool *INPUT(bool temp), bool &INPUT(bool temp) { temp = SvIV($input) ? true : false; $1 = &temp; } %typemap(typecheck) bool *INPUT = bool; %typemap(typecheck) bool &INPUT = bool; %typemap(in) long long *INPUT($*1_ltype temp), long long &INPUT($*1_ltype temp) { temp = strtoll(SvPV_nolen($input), 0, 0); $1 = &temp; } %typemap(typecheck) long long *INPUT = long long; %typemap(typecheck) long long &INPUT = long long; %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { temp = strtoull(SvPV_nolen($input), 0, 0); $1 = &temp; } %typemap(typecheck) unsigned long long *INPUT = unsigned long long; %typemap(typecheck) unsigned long long &INPUT = unsigned long long; #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, functions will return a Perl array. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Perl output of the function would be an array containing both output values. */ // Force the argument to be ignored. %typemap(in,numinputs=0) int *OUTPUT(int temp), int &OUTPUT(int temp), short *OUTPUT(short temp), short &OUTPUT(short temp), long *OUTPUT(long temp), long &OUTPUT(long temp), unsigned int *OUTPUT(unsigned int temp), unsigned int &OUTPUT(unsigned int temp), unsigned short *OUTPUT(unsigned short temp), unsigned short &OUTPUT(unsigned short temp), unsigned long *OUTPUT(unsigned long temp), unsigned long &OUTPUT(unsigned long temp), unsigned char *OUTPUT(unsigned char temp), unsigned char &OUTPUT(unsigned char temp), signed char *OUTPUT(signed char temp), signed char &OUTPUT(signed char temp), bool *OUTPUT(bool temp), bool &OUTPUT(bool temp), float *OUTPUT(float temp), float &OUTPUT(float temp), double *OUTPUT(double temp), double &OUTPUT(double temp), long long *OUTPUT($*1_ltype temp), long long &OUTPUT($*1_ltype temp), unsigned long long *OUTPUT($*1_ltype temp), unsigned long long &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout) int *OUTPUT, int &OUTPUT, short *OUTPUT, short &OUTPUT, long *OUTPUT, long &OUTPUT, signed char *OUTPUT, signed char &OUTPUT, bool *OUTPUT, bool &OUTPUT { if (argvi >= items) { EXTEND(sp,1); } $result = sv_newmortal(); sv_setiv($result,(IV) *($1)); argvi++; } %typemap(argout) unsigned int *OUTPUT, unsigned int &OUTPUT, unsigned short *OUTPUT, unsigned short &OUTPUT, unsigned long *OUTPUT, unsigned long &OUTPUT, unsigned char *OUTPUT, unsigned char &OUTPUT { if (argvi >= items) { EXTEND(sp,1); } $result = sv_newmortal(); sv_setuv($result,(UV) *($1)); argvi++; } %typemap(argout) float *OUTPUT, float &OUTPUT, double *OUTPUT, double &OUTPUT { if (argvi >= items) { EXTEND(sp,1); } $result = sv_newmortal(); sv_setnv($result,(double) *($1)); argvi++; } %typemap(argout) long long *OUTPUT, long long &OUTPUT { char temp[256]; if (argvi >= items) { EXTEND(sp,1); } sprintf(temp,"%lld", (long long)*($1)); $result = sv_newmortal(); sv_setpv($result,temp); argvi++; } %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { char temp[256]; if (argvi >= items) { EXTEND(sp,1); } sprintf(temp,"%llu", (unsigned long long)*($1)); $result = sv_newmortal(); sv_setpv($result,temp); argvi++; } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Perl array. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value. Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Perl variable you might do this : $x = neg($x); */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include swig-3.0.12/Lib/perl5/perluserdir.swg0000664000175000017500000000004413042756442017252 0ustar williamwilliam#define %perlcode %insert("perl") swig-3.0.12/Lib/perl5/carrays.i0000664000175000017500000000004113042756442016003 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/std_pair.i0000664000175000017500000000127713042756442016160 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T t, U u); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/perl5/stl.i0000664000175000017500000000054413042756442015151 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/perl5/exception.i0000664000175000017500000000021213042756442016335 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } swig-3.0.12/Lib/perl5/std_list.i0000664000175000017500000003407713042756442016204 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * ----------------------------------------------------------------------------- */ %include %include // containers // ------------------------------------------------------------------------ // std::list // // The aim of all that follows would be to integrate std::list with // Perl as much as possible, namely, to allow the user to pass and // be returned Perl arrays. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::list), f(const std::list&), f(const std::list*): // the parameter being read-only, either a Perl sequence or a // previously wrapped std::list can be passed. // -- f(std::list&), f(std::list*): // the parameter must be modified; therefore, only a wrapped std::list // can be passed. // -- std::list f(): // the list is returned by copy; therefore, a Perl sequence of T:s // is returned which is most easily used in other Perl functions // -- std::list& f(), std::list* f(), const std::list& f(), // const std::list* f(): // the list is returned by reference; therefore, a wrapped std::list // is returned // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class list { %typemap(in) list (std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1) { $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i& (std::list temp, std::list* v), const list* (std::list temp, std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { std::list< T >::const_iterator i; unsigned int j; int len = $1.size(); SV **svs = new SV*[len]; for (i=$1.begin(), j=0; i!=$1.end(); i++, j++) { T* ptr = new T(*i); svs[j] = sv_newmortal(); SWIG_MakePtr(svs[j], (void*) ptr, $descriptor(T *), $shadow|$owner); } AV *myav = av_make(len, svs); delete[] svs; $result = newRV_noinc((SV*) myav); sv_2mortal($result); argvi++; } %typecheck(SWIG_TYPECHECK_LIST) list { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_&descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_LIST) const list&, const list* { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* obj; tv = av_fetch(av, 0, 0); if (SWIG_ConvertPtr(*tv, (void **)&obj, $descriptor(T *),0) != -1) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; list(); list(const list &); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(const T& x); }; // specializations for built-ins %define specialize_std_list(T,CHECK_T,TO_T,FROM_T) template<> class list { %typemap(in) list (std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor,1) != -1){ $1 = *v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; for (int i=0; i& (std::list temp, std::list* v), const list* (std::list temp, std::list* v) { if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,1) != -1) { $1 = v; } else if (SvROK($input)) { AV *av = (AV *)SvRV($input); if (SvTYPE(av) != SVt_PVAV) SWIG_croak("Type error in argument $argnum of $symname. " "Expected an array of " #T); SV **tv; I32 len = av_len(av) + 1; T* obj; for (int i=0; i { std::list< T >::const_iterator i; unsigned int j; int len = $1.size(); SV **svs = new SV*[len]; for (i=$1.begin(), j=0; i!=$1.end(); i++, j++) { svs[j] = sv_newmortal(); FROM_T(svs[j], *i); } AV *myav = av_make(len, svs); delete[] svs; $result = newRV_noinc((SV*) myav); sv_2mortal($result); argvi++; } %typecheck(SWIG_TYPECHECK_LIST) list { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_&descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } %typecheck(SWIG_TYPECHECK_LIST) const list&, const list* { { /* wrapped list? */ std::list< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor,0) != -1) { $1 = 1; } else if (SvROK($input)) { /* native sequence? */ AV *av = (AV *)SvRV($input); if (SvTYPE(av) == SVt_PVAV) { SV **tv; I32 len = av_len(av) + 1; if (len == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ tv = av_fetch(av, 0, 0); if (CHECK_T(*tv)) $1 = 1; else $1 = 0; } } } else { $1 = 0; } } } public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; list(); list(const list &); unsigned int size() const; bool empty() const; void clear(); %rename(push) push_back; void push_back(T x); }; %enddef specialize_std_list(bool,SvIOK,SvIVX,sv_setiv); specialize_std_list(char,SvIOK,SvIVX,sv_setiv); specialize_std_list(int,SvIOK,SvIVX,sv_setiv); specialize_std_list(short,SvIOK,SvIVX,sv_setiv); specialize_std_list(long,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned char,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned int,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned short,SvIOK,SvIVX,sv_setiv); specialize_std_list(unsigned long,SvIOK,SvIVX,sv_setiv); specialize_std_list(float,SvNIOK,SwigSvToNumber,sv_setnv); specialize_std_list(double,SvNIOK,SwigSvToNumber,sv_setnv); specialize_std_list(std::string,SvPOK,SvPVX,SwigSvFromString); } swig-3.0.12/Lib/perl5/perltypemaps.swg0000664000175000017500000000553713042756442017453 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Perl * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* in Perl we need to pass the CPerlObj value, sometimes, so, we define the decl/call macros as needed. */ #define SWIG_AS_DECL_ARGS SWIG_PERL_DECL_ARGS_2 #define SWIG_AS_CALL_ARGS SWIG_PERL_CALL_ARGS_2 #define SWIG_FROM_DECL_ARGS SWIG_PERL_DECL_ARGS_1 #define SWIG_FROM_CALL_ARGS SWIG_PERL_CALL_ARGS_1 /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Perl fragments for primitive types */ %include /* Perl fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* director support in Perl is experimental */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Perl types */ #define SWIG_Object SV * #define VOID_Object sv_newmortal() /* Perl $shadow flag */ #define %newpointer_flags $shadow #define %newinstance_flags $shadow /* Complete overload of the output/constant/exception macros */ /* output */ %define %set_output(obj) $result = obj; argvi++ %enddef /* append output */ %define %append_output(obj) if (argvi >= items) EXTEND(sp,1); %set_output(obj) %enddef /* variable output */ %define %set_varoutput(obj) sv_setsv($result,obj) %enddef /* constant */ %define %set_constant(name, obj) %begin_block SV *sv = get_sv((char*) SWIG_prefix name, TRUE | 0x2 | GV_ADDMULTI); sv_setsv(sv, obj); SvREADONLY_on(sv); %end_block %enddef /* raise exception */ %define %raise(obj, type, desc) sv_setsv(get_sv("@", GV_ADD), obj); SWIG_fail %enddef /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Perl extra typemaps / typemap overrides * ------------------------------------------------------------ */ %typemap(varout,type="$1_descriptor") SWIGTYPE *, SWIGTYPE [] "sv_setiv(SvRV($result),PTR2IV($1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE & "sv_setiv(SvRV($result),PTR2IV(&$1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE && "sv_setiv(SvRV($result),PTR2IV(&$1));"; %typemap(varout,type="$&1_descriptor") SWIGTYPE "sv_setiv(SvRV($result), PTR2IV(&$1));"; %typemap(varout,type="$1_descriptor") SWIGTYPE (CLASS::*) { SWIG_MakePackedObj($result, (void *) &$1, sizeof($1_type), $1_descriptor); } %typemap(varout) SWIGTYPE *const = SWIGTYPE *; swig-3.0.12/Lib/perl5/perlerrors.swg0000664000175000017500000000154713042756442017122 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGINTERN const char* SWIG_Perl_ErrorType(int code) { switch(code) { case SWIG_MemoryError: return "MemoryError"; case SWIG_IOError: return "IOError"; case SWIG_RuntimeError: return "RuntimeError"; case SWIG_IndexError: return "IndexError"; case SWIG_TypeError: return "TypeError"; case SWIG_DivisionByZero: return "ZeroDivisionError"; case SWIG_OverflowError: return "OverflowError"; case SWIG_SyntaxError: return "SyntaxError"; case SWIG_ValueError: return "ValueError"; case SWIG_SystemError: return "SystemError"; case SWIG_AttributeError: return "AttributeError"; default: return "RuntimeError"; } } swig-3.0.12/Lib/perl5/perlkw.swg0000664000175000017500000000743613042756442016232 0ustar williamwilliam/* Warnings for Perl keywords */ #define PERLKW(x) %keywordwarn("'" `x` "' is a perl keyword") `x` #define PERLBN(x) %builtinwarn("'" `x` "' conflicts with a built-in name in perl") "::" `x` /* From http://www.rocketaware.com/perl/perlfunc/ */ /* Functions for SCALARs or strings*/ PERLBN(chomp); PERLBN(chop); PERLBN(chr); PERLBN(crypt); PERLBN(hex); PERLBN(index); PERLBN(lc); PERLBN(lcfirst); PERLBN(length); PERLBN(oct); PERLBN(ord); PERLBN(pack); PERLBN(reverse); PERLBN(rindex); PERLBN(sprintf); PERLBN(substr); PERLBN(uc); PERLBN(ucfirst); /* Regular expressions and pattern matching */ PERLBN(m); PERLBN(pos); PERLBN(quotemeta); PERLBN(split); PERLBN(study); /* Numeric functions */ PERLBN(abs); PERLBN(atan2); PERLBN(cos); PERLBN(exp); PERLBN(hex); PERLBN(int); PERLBN(log); PERLBN(oct); PERLBN(rand); PERLBN(sin); PERLBN(sqrt); PERLBN(srand); /* Functions for real @ARRAYs*/ PERLBN(pop); PERLBN(push); PERLBN(shift); PERLBN(splice); PERLBN(unshift); /* Functions for list data*/ PERLBN(grep); PERLBN(join); PERLBN(map); PERLBN(qw); PERLBN(reverse); PERLBN(sort); PERLBN(unpack); /* Functions for real %HASHes*/ PERLBN(delete); PERLBN(each); PERLBN(exists); PERLBN(keys); PERLBN(values); /* Input and output functions*/ PERLBN(binmode); PERLBN(close); PERLBN(closedir); PERLBN(dbmclose); PERLBN(dbmopen); PERLBN(die); PERLBN(eof); PERLBN(fileno); PERLBN(flock); PERLBN(format); PERLBN(getc); PERLBN(print); PERLBN(printf); PERLBN(read); PERLBN(readdir); PERLBN(rewinddir); PERLBN(seek); PERLBN(seekdir); PERLBN(select); PERLBN(syscall); PERLBN(sysread); PERLBN(sysseek); PERLBN(syswrite); PERLBN(tell); PERLBN(telldir); PERLBN(truncate); PERLBN(warn); PERLBN(write); /* Functions for fixed length data or records*/ PERLBN(pack); PERLBN(read); PERLBN(syscall); PERLBN(sysread); PERLBN(syswrite); PERLBN(unpack); PERLBN(vec); /* Functions for filehandles, files, or directories */ PERLBN(chdir); PERLBN(chmod); PERLBN(chown); PERLBN(chroot); PERLBN(fcntl); PERLBN(glob); PERLBN(ioctl); PERLBN(link); PERLBN(lstat); PERLBN(mkdir); PERLBN(open); PERLBN(opendir); PERLBN(readlink); PERLBN(rename); PERLBN(rmdir); PERLBN(stat); PERLBN(symlink); PERLBN(umask); PERLBN(unlink); PERLBN(utime); /* Keywords related to the control flow of your perl program */ PERLKW(caller); PERLKW(continue); PERLKW(die); PERLKW(do); PERLKW(dump); PERLKW(eval); PERLKW(exit); PERLKW(goto); PERLKW(last); PERLKW(next); PERLKW(redo); PERLKW(return); PERLKW(sub); PERLKW(wantarray); /* Keywords related to scoping */ PERLKW(caller); PERLKW(import); PERLKW(local); PERLKW(my); PERLKW(package); PERLKW(use); /* Miscellaneous functions */ PERLBN("defined"); PERLBN(dump); PERLBN(eval); PERLBN(formline); PERLBN(local); PERLBN(my); PERLBN(reset); PERLBN(scalar); PERLBN(undef); PERLBN(wantarray); /* Functions for processes and process groups */ PERLBN(alarm); PERLBN(exec); PERLBN(fork); PERLBN(getpgrp); PERLBN(getppid); PERLBN(getpriority); PERLBN(kill); PERLBN(pipe); PERLBN(setpgrp); PERLBN(setpriority); PERLBN(sleep); PERLBN(system); PERLBN(times); PERLBN(wait); PERLBN(waitpid); /* Keywords related to perl modules */ PERLKW(do); PERLKW(import); PERLKW(no); PERLKW(package); PERLKW(require); PERLKW(use); /* Keywords related to classes and object-orientedness */ PERLKW(bless); PERLKW(dbmclose); PERLKW(dbmopen); PERLKW(package); PERLKW(ref); PERLKW(tie); PERLKW(tied); PERLKW(untie); PERLKW(use); /* Functions new in perl5 */ PERLBN(abs); PERLBN(bless); PERLBN(chomp); PERLBN(chr); PERLBN(exists); PERLBN(formline); PERLBN(glob); PERLBN(import); PERLBN(lc); PERLBN(lcfirst); PERLBN(map); PERLBN(my); PERLBN(no); PERLBN(prototype); PERLBN(qx); PERLBN(qw); PERLBN(readline); PERLBN(readpipe); PERLBN(ref); PERLBN(sub); PERLBN(sysopen); PERLBN(tie); PERLBN(tied); PERLBN(uc); PERLBN(ucfirst); PERLBN(untie); PERLBN(use); #undef PERLKW #undef PERLBN swig-3.0.12/Lib/perl5/cdata.i0000664000175000017500000000003613042756442015417 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/std_string.i0000664000175000017500000000007613042756442016527 0ustar williamwilliam%include %include swig-3.0.12/Lib/perl5/std_map.i0000664000175000017500000000446113042756442016000 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T >::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/perl5/cstring.i0000664000175000017500000000004013042756442016007 0ustar williamwilliam%include swig-3.0.12/Lib/perl5/perlopers.swg0000664000175000017500000000352013042756442016727 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus // These are auto-supported by the Perl-module %rename(__plusplus__) *::operator++; %rename(__minmin__) *::operator--; %rename(__add__) *::operator+; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__mod__) *::operator%; %rename(__gt__) *::operator>; %rename(__lt__) *::operator<; %rename(__not__) *::operator!; %rename(__le__) *::operator<=; %rename(__ge__) *::operator>=; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__iadd__) *::operator+=; %rename(__isub__) *::operator-=; // These are renamed, but no test exists in operator_overload_runme.pl %ignoreoperator(EQ) operator=; // These are renamed, but no 'use overload...' is added %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__call__) *::operator(); /* Ignored operators */ %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(INDEX) operator[]; #endif /* __cplusplus */ swig-3.0.12/Lib/perl5/factory.i0000664000175000017500000000004013042756442016005 0ustar williamwilliam%include swig-3.0.12/Lib/math.i0000664000175000017500000000404613042756442014252 0ustar williamwilliam/* ----------------------------------------------------------------------------- * math.i * * SWIG library file for floating point operations. * ----------------------------------------------------------------------------- */ %module math %{ #include %} extern double cos(double x); /* Cosine of x */ extern double sin(double x); /* Sine of x */ extern double tan(double x); /* Tangent of x */ extern double acos(double x); /* Inverse cosine in range [-PI/2,PI/2], x in [-1,1]. */ extern double asin(double x); /* Inverse sine in range [0,PI], x in [-1,1]. */ extern double atan(double x); /* Inverse tangent in range [-PI/2,PI/2]. */ extern double atan2(double y, double x); /* Inverse tangent of y/x in range [-PI,PI]. */ extern double cosh(double x); /* Hyperbolic cosine of x */ extern double sinh(double x); /* Hyperbolic sine of x */ extern double tanh(double x); /* Hyperbolic tangent of x */ extern double exp(double x); /* Natural exponential function e^x */ extern double log(double x); /* Natural logarithm ln(x), x > 0 */ extern double log10(double x); /* Base 10 logarithm, x > 0 */ extern double pow(double x, double y); /* Power function x^y. */ extern double sqrt(double x); /* Square root. x >= 0 */ extern double fabs(double x); /* Absolute value of x */ extern double ceil(double x); /* Smallest integer not less than x, as a double */ extern double floor(double x); /* Largest integer not greater than x, as a double */ extern double fmod(double x, double y); /* Floating-point remainder of x/y, with the same sign as x. */ #define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 #define M_LN2 0.69314718055994530942 #define M_LN10 2.30258509299404568402 #define M_PI 3.14159265358979323846 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.78539816339744830962 #define M_1_PI 0.31830988618379067154 #define M_2_PI 0.63661977236758134308 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.70710678118654752440 swig-3.0.12/Lib/cmalloc.i0000664000175000017500000000446213042756442014735 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cmalloc.i * * SWIG library file containing macros that can be used to create objects using * the C malloc function. * ----------------------------------------------------------------------------- */ %{ #include %} /* %malloc(TYPE [, NAME = TYPE]) %calloc(TYPE [, NAME = TYPE]) %realloc(TYPE [, NAME = TYPE]) %free(TYPE [, NAME = TYPE]) %allocators(TYPE [,NAME = TYPE]) Creates functions for allocating/reallocating memory. TYPE *malloc_NAME(int nbytes = sizeof(TYPE); TYPE *calloc_NAME(int nobj=1, int size=sizeof(TYPE)); TYPE *realloc_NAME(TYPE *ptr, int nbytes); void free_NAME(TYPE *ptr); */ %define %malloc(TYPE,NAME...) #if #NAME != "" %rename(malloc_##NAME) ::malloc(int nbytes); #else %rename(malloc_##TYPE) ::malloc(int nbytes); #endif #if #TYPE != "void" %typemap(default) int nbytes "$1 = (int) sizeof(TYPE);" #endif TYPE *malloc(int nbytes); %typemap(default) int nbytes; %enddef %define %calloc(TYPE,NAME...) #if #NAME != "" %rename(calloc_##NAME) ::calloc(int nobj, int sz); #else %rename(calloc_##TYPE) ::calloc(int nobj, int sz); #endif #if #TYPE != "void" %typemap(default) int sz "$1 = (int) sizeof(TYPE);" #else %typemap(default) int sz "$1 = 1;" #endif %typemap(default) int nobj "$1 = 1;" TYPE *calloc(int nobj, int sz); %typemap(default) int sz; %typemap(default) int nobj; %enddef %define %realloc(TYPE,NAME...) %insert("header") { #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, int nitems) #else TYPE *realloc_##TYPE(TYPE *ptr, int nitems) #endif { #if #TYPE != "void" return (TYPE *) realloc(ptr, nitems*sizeof(TYPE)); #else return (TYPE *) realloc(ptr, nitems); #endif } } #if #NAME != "" TYPE *realloc_##NAME(TYPE *ptr, int nitems); #else TYPE *realloc_##TYPE(TYPE *ptr, int nitems); #endif %enddef %define %free(TYPE,NAME...) #if #NAME != "" %rename(free_##NAME) ::free(TYPE *ptr); #else %rename(free_##TYPE) ::free(TYPE *ptr); #endif void free(TYPE *ptr); %enddef %define %sizeof(TYPE,NAME...) #if #NAME != "" %constant int sizeof_##NAME = sizeof(TYPE); #else %constant int sizeof_##TYPE = sizeof(TYPE); #endif %enddef %define %allocators(TYPE,NAME...) %malloc(TYPE,NAME) %calloc(TYPE,NAME) %realloc(TYPE,NAME) %free(TYPE,NAME) #if #TYPE != "void" %sizeof(TYPE,NAME) #endif %enddef swig-3.0.12/Lib/lua/0000775000175000017500000000000013042756442013724 5ustar williamwilliamswig-3.0.12/Lib/lua/std_deque.i0000664000175000017500000000003413042756442016050 0ustar williamwilliam%include swig-3.0.12/Lib/lua/luaruntime.swg0000664000175000017500000000572213042756442016641 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luaruntime.swg * * all the runtime code for . * ----------------------------------------------------------------------------- */ %runtime "swigrun.swg"; /* Common C API type-checking code */ %runtime "luarun.swg"; /* Lua runtime stuff */ %insert(initbeforefunc) "swiginit.swg" %insert(initbeforefunc) %{ /* Forward declaration of where the user's %init{} gets inserted */ void SWIG_init_user(lua_State* L ); #ifdef __cplusplus extern "C" { #endif /* this is the initialization function added at the very end of the code the function is always called SWIG_init, but an earlier #define will rename it */ #if ((SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC)) LUALIB_API int SWIG_init(lua_State* L) #else SWIGEXPORT int SWIG_init(lua_State* L) /* default Lua action */ #endif { #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* valid for both Lua and eLua */ int i; int globalRegister = 0; /* start with global table */ lua_pushglobaltable (L); /* SWIG's internal initialisation */ SWIG_InitializeModule((void*)L); SWIG_PropagateClientData(); #endif #if ((SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUA) && (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC)) || defined(SWIG_LUA_ELUA_EMULATE) /* add a global fn */ SWIG_Lua_add_function(L,"swig_type",SWIG_Lua_type); SWIG_Lua_add_function(L,"swig_equals",SWIG_Lua_class_equal); #endif #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* set up base class pointers (the hierarchy) */ for (i = 0; swig_types[i]; i++){ if (swig_types[i]->clientdata){ SWIG_Lua_init_base_class(L,(swig_lua_class*)(swig_types[i]->clientdata)); } } #ifdef SWIG_LUA_MODULE_GLOBAL globalRegister = 1; #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) SWIG_Lua_namespace_register(L,&swig_SwigModule, globalRegister); #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) for (i = 0; swig_types[i]; i++){ if (swig_types[i]->clientdata){ SWIG_Lua_elua_class_register_instance(L,(swig_lua_class*)(swig_types[i]->clientdata)); } } #endif #if defined(SWIG_LUA_ELUA_EMULATE) lua_newtable(L); SWIG_Lua_elua_emulate_register(L,swig_SwigModule.ns_methods); SWIG_Lua_elua_emulate_register_clear(L); if(globalRegister) { lua_pushstring(L,swig_SwigModule.name); lua_pushvalue(L,-2); lua_rawset(L,-4); } #endif #endif #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) /* invoke user-specific initialization */ SWIG_init_user(L); /* end module */ /* Note: We do not clean up the stack here (Lua will do this for us). At this point, we have the globals table and out module table on the stack. Returning one value makes the module table the result of the require command. */ return 1; #else return 0; #endif } #ifdef __cplusplus } #endif %} /* Note: the initialization function is closed after all code is generated */ swig-3.0.12/Lib/lua/wchar.i0000664000175000017500000000210613042756442015201 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * * Typemaps for the wchar_t type * These are mapped to a Lua string and are passed around by value. * ----------------------------------------------------------------------------- */ // note: only support for pointer right now, not fixed length strings // TODO: determine how long a const wchar_t* is so we can write wstr2str() // & do the output typemap %{ #include wchar_t* str2wstr(const char *str, int len) { wchar_t* p; if (str==0 || len<1) return 0; p=(wchar_t *)malloc((len+1)*sizeof(wchar_t)); if (p==0) return 0; if (mbstowcs(p, str, len)==(size_t)-1) { free(p); return 0; } p[len]=0; return p; } %} %typemap(in, checkfn="SWIG_lua_isnilstring", fragment="SWIG_lua_isnilstring") wchar_t * %{ $1 = str2wstr(lua_tostring( L, $input ),lua_rawlen( L, $input )); if ($1==0) {SWIG_Lua_pushferrstring(L,"Error in converting to wchar (arg %d)",$input);goto fail;} %} %typemap(freearg) wchar_t * %{ free($1); %} %typemap(typecheck) wchar_t * = char *; swig-3.0.12/Lib/lua/lua_fnptr.i0000664000175000017500000001020413042756442016065 0ustar williamwilliam/* ----------------------------------------------------------------------------- * lua_fnptr.i * * SWIG Library file containing the main typemap code to support Lua modules. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic function pointer support * ----------------------------------------------------------------------------- */ /* The structure: SWIGLUA_FN provides a simple (local only) wrapping for a function. For example if you wanted to have a C/C++ function take a lua function as a parameter. You could declare it as: int my_func(int a, int b, SWIGLUA_FN fn); note: it should be passed by value, not byref or as a pointer. The SWIGLUA_FN holds a pointer to the lua_State, and the stack index where the function is held. The macro SWIGLUA_FN_GET() will put a copy of the lua function at the top of the stack. After that its fairly simple to write the rest of the code (assuming know how to use lua), just push the parameters, call the function and return the result. int my_func(int a, int b, SWIGLUA_FN fn) { SWIGLUA_FN_GET(fn); lua_pushnumber(fn.L,a); lua_pushnumber(fn.L,b); lua_call(fn.L,2,1); // 2 in, 1 out return luaL_checknumber(fn.L,-1); } SWIG will automatically performs the wrapping of the arguments in and out. However: if you wish to store the function between calls, look to the SWIGLUA_REF below. */ // this is for the C code only, we don't want SWIG to wrapper it for us. %{ typedef struct{ lua_State* L; /* the state */ int idx; /* the index on the stack */ }SWIGLUA_FN; #define SWIGLUA_FN_GET(fn) {lua_pushvalue(fn.L,fn.idx);} %} // the actual typemap %typemap(in,checkfn="lua_isfunction") SWIGLUA_FN %{ $1.L=L; $1.idx=$input; %} /* ----------------------------------------------------------------------------- * Storing lua object support * ----------------------------------------------------------------------------- */ /* The structure: SWIGLUA_REF provides a mechanism to store object (usually functions) between calls to the interpreter. For example if you wanted to have a C/C++ function take a lua function as a parameter. Then call it later, You could declare it as: SWIGLUA_REF myref; void set_func(SWIGLUA_REF ref); SWIGLUA_REF get_func(); void call_func(int val); note: it should be passed by value, not byref or as a pointer. The SWIGLUA_REF holds a pointer to the lua_State, and an integer reference to the object. Because it holds a permanent ref to an object, the SWIGLUA_REF must be handled with a bit more care. It should be initialised to {0,0}. The function swiglua_ref_set() should be used to set it. swiglua_ref_clear() should be used to clear it when not in use, and swiglua_ref_get() to get the data back. Note: the typemap does not check that the object is in fact a function, if you need that you must add it yourself. int my_func(int a, int b, SWIGLUA_FN fn) { SWIGLUA_FN_GET(fn); lua_pushnumber(fn.L,a); lua_pushnumber(fn.L,b); lua_call(fn.L,2,1); // 2 in, 1 out return luaL_checknumber(fn.L,-1); } SWIG will automatically performs the wrapping of the arguments in and out. However: if you wish to store the function between calls, look to the SWIGLUA_REF below. */ %{ typedef struct{ lua_State* L; /* the state */ int ref; /* a ref in the lua global index */ }SWIGLUA_REF; void swiglua_ref_clear(SWIGLUA_REF* pref){ if (pref->L!=0 && pref->ref!=LUA_NOREF && pref->ref!=LUA_REFNIL){ luaL_unref(pref->L,LUA_REGISTRYINDEX,pref->ref); } pref->L=0; pref->ref=0; } void swiglua_ref_set(SWIGLUA_REF* pref,lua_State* L,int idx){ pref->L=L; lua_pushvalue(L,idx); /* copy obj to top */ pref->ref=luaL_ref(L,LUA_REGISTRYINDEX); /* remove obj from top & put into registry */ } void swiglua_ref_get(SWIGLUA_REF* pref){ if (pref->L!=0) lua_rawgeti(pref->L,LUA_REGISTRYINDEX,pref->ref); } %} %typemap(in) SWIGLUA_REF %{ swiglua_ref_set(&$1,L,$input); %} %typemap(out) SWIGLUA_REF %{ if ($1.L!=0) {swiglua_ref_get(&$1);} else {lua_pushnil(L);} SWIG_arg++; %} swig-3.0.12/Lib/lua/std_vector.i0000664000175000017500000000601213042756442016251 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * std::vector typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} %include // the general exceptions /* A really cut down version of the vector class. Note: this does not match the true std::vector class but instead is an approximate, so that SWIG knows how to wrapper it. (Eg, all access is by value, not ref, as SWIG turns refs to pointers) And no support for iterators & insert/erase It would be useful to have a vector<->Lua table conversion routine */ namespace std { template class vector { public: vector(); vector(unsigned int); vector(const vector&); vector(unsigned int,T); unsigned int size() const; unsigned int max_size() const; bool empty() const; void clear(); void push_back(T val); void pop_back(); T front()const; // only read front & back T back()const; // not write to them // operator [] given later: %extend // this is a extra bit of SWIG code { // [] is replaced by __getitem__ & __setitem__ // simply throws a string, which causes a lua error T __getitem__(unsigned int idx) throw (std::out_of_range) { if (idx>=self->size()) throw std::out_of_range("in vector::__getitem__()"); return (*self)[idx]; } void __setitem__(unsigned int idx,T val) throw (std::out_of_range) { if (idx>=self->size()) throw std::out_of_range("in vector::__setitem__()"); (*self)[idx]=val; } }; }; } /* Vector<->LuaTable fns These look a bit like the array<->LuaTable fns but are templated, not %defined (you must have template support for STL) */ /* %{ // reads a table into a vector of numbers // lua numbers will be cast into the type required (rounding may occur) // return 0 if non numbers found in the table // returns new'ed ptr if ok template std::vector* SWIG_read_number_vector(lua_State* L,int index) { int i=0; std::vector* vec=new std::vector(); while(1) { lua_rawgeti(L,index,i+1); if (!lua_isnil(L,-1)) { lua_pop(L,1); break; // finished } if (!lua_isnumber(L,-1)) { lua_pop(L,1); delete vec; return 0; // error } vec->push_back((T)lua_tonumber(L,-1)); lua_pop(L,1); ++i; } return vec; // ok } // writes a vector of numbers out as a lua table template int SWIG_write_number_vector(lua_State* L,std::vector *vec) { lua_newtable(L); for(int i=0;isize();++i) { lua_pushnumber(L,(double)((*vec)[i])); lua_rawseti(L,-2,i+1);// -1 is the number, -2 is the table } } %} // then the typemaps %define SWIG_TYPEMAP_NUM_VECTOR(T) // in %typemap(in) std::vector *INPUT %{ $1 = SWIG_read_number_vector(L,$input); if (!$1) SWIG_fail;%} %typemap(freearg) std::vector *INPUT %{ delete $1;%} // out %typemap(argout) std::vector *OUTPUT %{ SWIG_write_number_vector(L,$1); SWIG_arg++; %} %enddef */ swig-3.0.12/Lib/lua/luarun.swg0000664000175000017500000020231213042756442015754 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luarun.swg * * This file contains the runtime support for Lua modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "lua.h" #include "lauxlib.h" #include /* for malloc */ #include /* for a few sanity tests */ /* ----------------------------------------------------------------------------- * Lua flavors * ----------------------------------------------------------------------------- */ #define SWIG_LUA_FLAVOR_LUA 1 #define SWIG_LUA_FLAVOR_ELUA 2 #define SWIG_LUA_FLAVOR_ELUAC 3 #if !defined(SWIG_LUA_TARGET) # error SWIG_LUA_TARGET not defined #endif #if defined(SWIG_LUA_ELUA_EMULATE) struct swig_elua_entry; typedef struct swig_elua_key { int type; union { const char* strkey; lua_Number numkey; } key; } swig_elua_key; typedef struct swig_elua_val { int type; union { lua_Number number; const struct swig_elua_entry *table; const char *string; lua_CFunction function; struct { char member; long lvalue; void *pvalue; swig_type_info **ptype; } userdata; } value; } swig_elua_val; typedef struct swig_elua_entry { swig_elua_key key; swig_elua_val value; } swig_elua_entry; #define LSTRKEY(x) {LUA_TSTRING, {.strkey = x} } #define LNUMKEY(x) {LUA_TNUMBER, {.numkey = x} } #define LNILKEY {LUA_TNIL, {.strkey = 0} } #define LNUMVAL(x) {LUA_TNUMBER, {.number = x} } #define LFUNCVAL(x) {LUA_TFUNCTION, {.function = x} } #define LROVAL(x) {LUA_TTABLE, {.table = x} } #define LNILVAL {LUA_TNIL, {.string = 0} } #define LSTRVAL(x) {LUA_TSTRING, {.string = x} } #define LUA_REG_TYPE swig_elua_entry #define SWIG_LUA_ELUA_EMUL_METATABLE_KEY "__metatable" #define lua_pushrotable(L,p)\ lua_newtable(L);\ assert(p);\ SWIG_Lua_elua_emulate_register(L,(swig_elua_entry*)(p)); #define SWIG_LUA_CONSTTAB_POINTER(B,C,D)\ LSTRKEY(B), {LUA_TUSERDATA, { .userdata={0,0,(void*)(C),&D} } } #define SWIG_LUA_CONSTTAB_BINARY(B,S,C,D)\ LSTRKEY(B), {LUA_TUSERDATA, { .userdata={1,S,(void*)(C),&D} } } #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) # define SWIG_LUA_CONSTTAB_INT(B, C) LSTRKEY(B), LNUMVAL(C) # define SWIG_LUA_CONSTTAB_FLOAT(B, C) LSTRKEY(B), LNUMVAL(C) # define SWIG_LUA_CONSTTAB_STRING(B, C) LSTRKEY(B), LSTRVAL(C) # define SWIG_LUA_CONSTTAB_CHAR(B, C) LSTRKEY(B), LNUMVAL(C) /* Those two types of constants are not supported in elua */ #ifndef SWIG_LUA_CONSTTAB_POINTER #warning eLua does not support pointers as constants. By default, nil will be used as value #define SWIG_LUA_CONSTTAB_POINTER(B,C,D) LSTRKEY(B), LNILVAL #endif #ifndef SWIG_LUA_CONSTTAB_BINARY #warning eLua does not support pointers to member as constants. By default, nil will be used as value #define SWIG_LUA_CONSTTAB_BINARY(B, S, C, D) LSTRKEY(B), LNILVAL #endif #else /* SWIG_LUA_FLAVOR_LUA */ # define SWIG_LUA_CONSTTAB_INT(B, C) SWIG_LUA_INT, (char *)B, (long)C, 0, 0, 0 # define SWIG_LUA_CONSTTAB_FLOAT(B, C) SWIG_LUA_FLOAT, (char *)B, 0, (double)C, 0, 0 # define SWIG_LUA_CONSTTAB_STRING(B, C) SWIG_LUA_STRING, (char *)B, 0, 0, (void *)C, 0 # define SWIG_LUA_CONSTTAB_CHAR(B, C) SWIG_LUA_CHAR, (char *)B, (long)C, 0, 0, 0 # define SWIG_LUA_CONSTTAB_POINTER(B,C,D)\ SWIG_LUA_POINTER, (char *)B, 0, 0, (void *)C, &D # define SWIG_LUA_CONSTTAB_BINARY(B, S, C, D)\ SWIG_LUA_BINARY, (char *)B, S, 0, (void *)C, &D #endif #ifndef SWIG_LUA_ELUA_EMULATE #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) # define LRO_STRVAL(v) {{.p = (char *) v}, LUA_TSTRING} # define LSTRVAL LRO_STRVAL #endif #endif /* SWIG_LUA_ELUA_EMULATE*/ #ifndef SWIG_LUA_ELUA_EMULATE #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) #ifndef MIN_OPT_LEVEL #define MIN_OPT_LEVEL 2 #endif #include "lrodefs.h" #include "lrotable.h" #endif #endif /* SWIG_LUA_ELUA_EMULATE*/ /* ----------------------------------------------------------------------------- * compatibility defines * ----------------------------------------------------------------------------- */ /* History of Lua C API length functions: In Lua 5.0 (and before?) there was "lua_strlen". In Lua 5.1, this was renamed "lua_objlen", but a compatibility define of "lua_strlen" was added. In Lua 5.2, this function was again renamed, to "lua_rawlen" (to emphasize that it doesn't call the "__len" metamethod), and the compatibility define of lua_strlen was removed. All SWIG uses have been updated to "lua_rawlen", and we add our own defines of that here for older versions of Lua. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 501 # define lua_rawlen lua_strlen #elif LUA_VERSION_NUM == 501 # define lua_rawlen lua_objlen #endif /* lua_pushglobaltable is the recommended "future-proof" way to get the global table for Lua 5.2 and later. Here we define lua_pushglobaltable ourselves for Lua versions before 5.2. */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 # define lua_pushglobaltable(L) lua_pushvalue(L, LUA_GLOBALSINDEX) #endif /* lua_absindex was introduced in Lua 5.2 */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 # define lua_absindex(L,i) ((i)>0 || (i) <= LUA_REGISTRYINDEX ? (i) : lua_gettop(L) + (i) + 1) #endif /* lua_rawsetp was introduced in Lua 5.2 */ #if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM < 502 #define lua_rawsetp(L,index,ptr)\ lua_pushlightuserdata(L,(void*)(ptr));\ lua_insert(L,-2);\ lua_rawset(L,index); #define lua_rawgetp(L,index,ptr)\ lua_pushlightuserdata(L,(void*)(ptr));\ lua_rawget(L,index); #endif /* -------------------------------------------------------------------------- * Helper functions for error handling * -------------------------------------------------------------------------- */ /* Push the string STR on the Lua stack, like lua_pushstring, but prefixed with the the location of the innermost Lua call-point (as formated by luaL_where). */ SWIGRUNTIME void SWIG_Lua_pusherrstring (lua_State *L, const char *str) { luaL_where (L, 1); lua_pushstring (L, str); lua_concat (L, 2); } /* Push a formatted string generated from FMT and following args on the Lua stack, like lua_pushfstring, but prefixed with the the location of the innermost Lua call-point (as formated by luaL_where). */ SWIGRUNTIME void SWIG_Lua_pushferrstring (lua_State *L, const char *fmt, ...) { va_list argp; va_start(argp, fmt); luaL_where(L, 1); lua_pushvfstring(L, fmt, argp); va_end(argp); lua_concat(L, 2); } /* ----------------------------------------------------------------------------- * global swig types * ----------------------------------------------------------------------------- */ /* Constant table */ #define SWIG_LUA_INT 1 #define SWIG_LUA_FLOAT 2 #define SWIG_LUA_STRING 3 #define SWIG_LUA_POINTER 4 #define SWIG_LUA_BINARY 5 #define SWIG_LUA_CHAR 6 /* Structure for variable linking table */ typedef struct { const char *name; lua_CFunction get; lua_CFunction set; } swig_lua_var_info; #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) typedef const LUA_REG_TYPE swig_lua_method; typedef const LUA_REG_TYPE swig_lua_const_info; #else /* Normal lua */ typedef luaL_Reg swig_lua_method; /* Constant information structure */ typedef struct { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_lua_const_info; #endif typedef struct { const char *name; lua_CFunction getmethod; lua_CFunction setmethod; } swig_lua_attribute; struct swig_lua_class; /* Can be used to create namespaces. Currently used to wrap class static methods/variables/constants */ typedef struct swig_lua_namespace { const char *name; swig_lua_method *ns_methods; swig_lua_attribute *ns_attributes; swig_lua_const_info *ns_constants; struct swig_lua_class **ns_classes; struct swig_lua_namespace **ns_namespaces; } swig_lua_namespace; typedef struct swig_lua_class { const char *name; /* Name that this class has in Lua */ const char *fqname; /* Fully qualified name - Scope + class name */ swig_type_info **type; lua_CFunction constructor; void (*destructor)(void *); swig_lua_method *methods; swig_lua_attribute *attributes; swig_lua_namespace *cls_static; swig_lua_method *metatable; /* 0 for -eluac */ struct swig_lua_class **bases; const char **base_names; } swig_lua_class; /* this is the struct for wrapping all pointers in SwigLua */ typedef struct { swig_type_info *type; int own; /* 1 if owned & must be destroyed */ void *ptr; } swig_lua_userdata; /* this is the struct for wrapping arbitrary packed binary data (currently it is only used for member function pointers) the data ordering is similar to swig_lua_userdata, but it is currently not possible to tell the two structures apart within SWIG, other than by looking at the type */ typedef struct { swig_type_info *type; int own; /* 1 if owned & must be destroyed */ char data[1]; /* arbitary amount of data */ } swig_lua_rawdata; /* Common SWIG API */ #define SWIG_NewPointerObj(L, ptr, type, owner) SWIG_Lua_NewPointerObj(L, (void *)ptr, type, owner) #define SWIG_ConvertPtr(L,idx, ptr, type, flags) SWIG_Lua_ConvertPtr(L,idx,ptr,type,flags) #define SWIG_MustGetPtr(L,idx, type,flags, argnum,fnname) SWIG_Lua_MustGetPtr(L,idx, type,flags, argnum,fnname) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(L, idx, ptr, sz, ty) SWIG_Lua_ConvertPacked(L, idx, ptr, sz, ty) #define SWIG_NewMemberObj(L, ptr, sz, type) SWIG_Lua_NewPackedObj(L, ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Lua_GetModule((lua_State*)(clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_Lua_SetModule((lua_State*) (clientdata), pointer) #define SWIG_MODULE_CLIENTDATA_TYPE lua_State* /* Contract support */ #define SWIG_contract_assert(expr, msg) \ if (!(expr)) { SWIG_Lua_pusherrstring(L, (char *) msg); goto fail; } else /* helper #defines */ #define SWIG_fail {goto fail;} #define SWIG_fail_arg(func_name,argnum,type) \ {SWIG_Lua_pushferrstring(L,"Error in %s (arg %d), expected '%s' got '%s'",\ func_name,argnum,type,SWIG_Lua_typename(L,argnum));\ goto fail;} #define SWIG_fail_ptr(func_name,argnum,type) \ SWIG_fail_arg(func_name,argnum,(type && type->str)?type->str:"void*") #define SWIG_check_num_args(func_name,a,b) \ if (lua_gettop(L)b) \ {SWIG_Lua_pushferrstring(L,"Error in %s expected %d..%d args, got %d",func_name,a,b,lua_gettop(L));\ goto fail;} #define SWIG_Lua_get_table(L,n) \ (lua_pushstring(L, n), lua_rawget(L,-2)) #define SWIG_Lua_add_function(L,n,f) \ (lua_pushstring(L, n), \ lua_pushcfunction(L, f), \ lua_rawset(L,-3)) #define SWIG_Lua_add_boolean(L,n,b) \ (lua_pushstring(L, n), \ lua_pushboolean(L, b), \ lua_rawset(L,-3)) /* special helper for allowing 'nil' for usertypes */ #define SWIG_isptrtype(L,I) (lua_isuserdata(L,I) || lua_isnil(L,I)) #ifdef __cplusplus /* Special helper for member function pointers it gets the address, casts it, then dereferences it */ /*#define SWIG_mem_fn_as_voidptr(a) (*((char**)&(a))) */ #endif /* storing/access of swig_module_info */ SWIGRUNTIME swig_module_info * SWIG_Lua_GetModule(lua_State *L) { swig_module_info *ret = 0; lua_pushstring(L,"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); lua_rawget(L,LUA_REGISTRYINDEX); if (lua_islightuserdata(L,-1)) ret=(swig_module_info*)lua_touserdata(L,-1); lua_pop(L,1); /* tidy */ return ret; } SWIGRUNTIME void SWIG_Lua_SetModule(lua_State *L, swig_module_info *module) { /* add this all into the Lua registry: */ lua_pushstring(L,"swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); lua_pushlightuserdata(L,(void*)module); lua_rawset(L,LUA_REGISTRYINDEX); } /* ----------------------------------------------------------------------------- * global variable support code: modules * ----------------------------------------------------------------------------- */ /* this function is called when trying to set an immutable. default action is to print an error. This can removed with a compile flag SWIGLUA_IGNORE_SET_IMMUTABLE */ SWIGINTERN int SWIG_Lua_set_immutable(lua_State *L) { /* there should be 1 param passed in: the new value */ #ifndef SWIGLUA_IGNORE_SET_IMMUTABLE lua_pop(L,1); /* remove it */ luaL_error(L,"This variable is immutable"); #endif return 0; /* should not return anything */ } #ifdef SWIG_LUA_ELUA_EMULATE SWIGRUNTIME void SWIG_Lua_NewPointerObj(lua_State *L,void *ptr,swig_type_info *type, int own); SWIGRUNTIME void SWIG_Lua_NewPackedObj(lua_State *L,void *ptr,size_t size,swig_type_info *type); static int swig_lua_elua_emulate_unique_key; /* This function emulates eLua rotables behaviour. It loads a rotable definition into the usual lua table. */ SWIGINTERN void SWIG_Lua_elua_emulate_register(lua_State *L, const swig_elua_entry *table) { int i, table_parsed, parsed_tables_array, target_table; assert(lua_istable(L,-1)); target_table = lua_gettop(L); /* Get the registry where we put all parsed tables to avoid loops */ lua_rawgetp(L, LUA_REGISTRYINDEX, &swig_lua_elua_emulate_unique_key); if(lua_isnil(L,-1)) { lua_pop(L,1); lua_newtable(L); lua_pushvalue(L,-1); lua_rawsetp(L,LUA_REGISTRYINDEX,(void*)(&swig_lua_elua_emulate_unique_key)); } parsed_tables_array = lua_gettop(L); lua_pushvalue(L,target_table); lua_rawsetp(L, parsed_tables_array, table); table_parsed = 0; const int SWIGUNUSED pairs_start = lua_gettop(L); for(i = 0;table[i].key.type != LUA_TNIL || table[i].value.type != LUA_TNIL;i++) { const swig_elua_entry *entry = table + i; int is_metatable = 0; switch(entry->key.type) { case LUA_TSTRING: lua_pushstring(L,entry->key.key.strkey); if(strcmp(entry->key.key.strkey, SWIG_LUA_ELUA_EMUL_METATABLE_KEY) == 0) is_metatable = 1; break; case LUA_TNUMBER: lua_pushnumber(L,entry->key.key.numkey); break; case LUA_TNIL: lua_pushnil(L); break; default: assert(0); } switch(entry->value.type) { case LUA_TSTRING: lua_pushstring(L,entry->value.value.string); break; case LUA_TNUMBER: lua_pushnumber(L,entry->value.value.number); break; case LUA_TFUNCTION: lua_pushcfunction(L,entry->value.value.function); break; case LUA_TTABLE: lua_rawgetp(L,parsed_tables_array, entry->value.value.table); table_parsed = !lua_isnil(L,-1); if(!table_parsed) { lua_pop(L,1); /*remove nil */ lua_newtable(L); SWIG_Lua_elua_emulate_register(L,entry->value.value.table); } if(is_metatable) { assert(lua_istable(L,-1)); lua_pushvalue(L,-1); lua_setmetatable(L,target_table); } break; case LUA_TUSERDATA: if(entry->value.value.userdata.member) SWIG_NewMemberObj(L,entry->value.value.userdata.pvalue, entry->value.value.userdata.lvalue, *(entry->value.value.userdata.ptype)); else SWIG_NewPointerObj(L,entry->value.value.userdata.pvalue, *(entry->value.value.userdata.ptype),0); break; case LUA_TNIL: lua_pushnil(L); break; default: assert(0); } assert(lua_gettop(L) == pairs_start + 2); lua_rawset(L,target_table); } lua_pop(L,1); /* Removing parsed tables storage */ assert(lua_gettop(L) == target_table); } SWIGINTERN void SWIG_Lua_elua_emulate_register_clear(lua_State *L) { lua_pushnil(L); lua_rawsetp(L, LUA_REGISTRYINDEX, &swig_lua_elua_emulate_unique_key); } SWIGINTERN void SWIG_Lua_get_class_registry(lua_State *L); SWIGINTERN int SWIG_Lua_emulate_elua_getmetatable(lua_State *L) { SWIG_check_num_args("getmetatable(SWIG eLua emulation)", 1, 1); SWIG_Lua_get_class_registry(L); lua_getfield(L,-1,"lua_getmetatable"); lua_remove(L,-2); /* remove the registry*/ assert(!lua_isnil(L,-1)); lua_pushvalue(L,1); assert(lua_gettop(L) == 3); /* object | function | object again */ lua_call(L,1,1); if(!lua_isnil(L,-1)) /*There is an ordinary metatable */ return 1; /*if it is a table, then emulate elua behaviour - check for __metatable attribute of a table*/ assert(lua_gettop(L) == 2); if(lua_istable(L,-2)) { lua_pop(L,1); /*remove the nil*/ lua_getfield(L,-1, SWIG_LUA_ELUA_EMUL_METATABLE_KEY); } assert(lua_gettop(L) == 2); return 1; fail: lua_error(L); return 0; } SWIGINTERN void SWIG_Lua_emulate_elua_swap_getmetatable(lua_State *L) { SWIG_Lua_get_class_registry(L); lua_pushglobaltable(L); lua_pushstring(L,"lua_getmetatable"); lua_getfield(L,-2,"getmetatable"); assert(!lua_isnil(L,-1)); lua_rawset(L,-4); lua_pushstring(L, "getmetatable"); lua_pushcfunction(L, SWIG_Lua_emulate_elua_getmetatable); lua_rawset(L,-3); lua_pop(L,2); } /* END OF REMOVE */ #endif /* ----------------------------------------------------------------------------- * global variable support code: namespaces and modules (which are the same thing) * ----------------------------------------------------------------------------- */ SWIGINTERN int SWIG_Lua_namespace_get(lua_State *L) { /* there should be 2 params passed in (1) table (not the meta table) (2) string name of the attribute */ assert(lua_istable(L,-2)); /* just in case */ lua_getmetatable(L,-2); assert(lua_istable(L,-1)); SWIG_Lua_get_table(L,".get"); /* find the .get table */ assert(lua_istable(L,-1)); /* look for the key in the .get table */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); lua_remove(L,-2); /* stack tidy, remove .get table */ if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_call(L,0,1); /* 1 value in (userdata),1 out (result) */ lua_remove(L,-2); /* stack tidy, remove metatable */ return 1; } lua_pop(L,1); /* remove whatever was there */ /* ok, so try the .fn table */ SWIG_Lua_get_table(L,".fn"); /* find the .get table */ assert(lua_istable(L,-1)); /* just in case */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); /* look for the fn */ lua_remove(L,-2); /* stack tidy, remove .fn table */ if (lua_isfunction(L,-1)) /* note: whether it's a C function or lua function */ { /* found it so return the fn & let lua call it */ lua_remove(L,-2); /* stack tidy, remove metatable */ return 1; } lua_pop(L,1); /* remove whatever was there */ return 0; } SWIGINTERN int SWIG_Lua_namespace_set(lua_State *L) { /* there should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ assert(lua_istable(L,1)); lua_getmetatable(L,1); /* get the meta table */ assert(lua_istable(L,-1)); SWIG_Lua_get_table(L,".set"); /* find the .set table */ if (lua_istable(L,-1)) { /* look for the key in the .set table */ lua_pushvalue(L,2); /* key */ lua_rawget(L,-2); if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_pushvalue(L,3); /* value */ lua_call(L,1,0); return 0; } lua_pop(L,1); /* remove the value */ } lua_pop(L,1); /* remove the value .set table */ lua_pop(L,1); /* remote metatable */ lua_rawset(L,-3); return 0; } #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* In elua this is useless */ SWIGINTERN void SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]); /* forward declaration */ SWIGINTERN void SWIG_Lua_add_variable(lua_State *L,const char *name,lua_CFunction getFn,lua_CFunction setFn); /* forward declaration */ SWIGINTERN void SWIG_Lua_class_register(lua_State *L,swig_lua_class *clss); /* helper function - register namespace methods and attributes into namespace */ SWIGINTERN int SWIG_Lua_add_namespace_details(lua_State *L, swig_lua_namespace *ns) { int i; /* There must be namespace table (not metatable) at the top of the stack */ assert(lua_istable(L,-1)); SWIG_Lua_InstallConstants(L, ns->ns_constants); /* add methods to the namespace/module table */ for(i=0;ns->ns_methods[i].name;i++){ SWIG_Lua_add_function(L,ns->ns_methods[i].name,ns->ns_methods[i].func); } lua_getmetatable(L,-1); /* add fns */ for(i=0;ns->ns_attributes[i].name;i++){ SWIG_Lua_add_variable(L,ns->ns_attributes[i].name,ns->ns_attributes[i].getmethod,ns->ns_attributes[i].setmethod); } /* clear stack - remove metatble */ lua_pop(L,1); return 0; } /* Register all classes in the namespace */ SWIGINTERN void SWIG_Lua_add_namespace_classes(lua_State *L, swig_lua_namespace *ns) { swig_lua_class **classes; /* There must be a module/namespace table at the top of the stack */ assert(lua_istable(L,-1)); classes = ns->ns_classes; if( classes != 0 ) { while(*classes != 0) { SWIG_Lua_class_register(L, *classes); classes++; } } } /* Helper function. Creates namespace table and adds it to module table if 'reg' is true, then will register namespace table to parent one (must be on top of the stack when function is called). Function always returns newly registered table on top of the stack. */ SWIGINTERN void SWIG_Lua_namespace_register(lua_State *L, swig_lua_namespace *ns, int reg) { swig_lua_namespace **sub_namespace; /* 1 argument - table on the top of the stack */ const int SWIGUNUSED begin = lua_gettop(L); assert(lua_istable(L,-1)); /* just in case. This is supposed to be module table or parent namespace table */ lua_checkstack(L,5); lua_newtable(L); /* namespace itself */ lua_newtable(L); /* metatable for namespace */ /* add a table called ".get" */ lua_pushstring(L,".get"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".set" */ lua_pushstring(L,".set"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".fn" */ lua_pushstring(L,".fn"); lua_newtable(L); lua_rawset(L,-3); /* add accessor fns for using the .get,.set&.fn */ SWIG_Lua_add_function(L,"__index",SWIG_Lua_namespace_get); SWIG_Lua_add_function(L,"__newindex",SWIG_Lua_namespace_set); lua_setmetatable(L,-2); /* set metatable */ /* Register all functions, variables etc */ SWIG_Lua_add_namespace_details(L,ns); /* Register classes */ SWIG_Lua_add_namespace_classes(L,ns); sub_namespace = ns->ns_namespaces; if( sub_namespace != 0) { while(*sub_namespace != 0) { SWIG_Lua_namespace_register(L, *sub_namespace, 1); lua_pop(L,1); /* removing sub-namespace table */ sub_namespace++; } } if (reg) { lua_pushstring(L,ns->name); lua_pushvalue(L,-2); lua_rawset(L,-4); /* add namespace to module table */ } assert(lua_gettop(L) == begin+1); } #endif /* SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA */ /* ----------------------------------------------------------------------------- * global variable support code: classes * ----------------------------------------------------------------------------- */ SWIGINTERN void SWIG_Lua_get_class_metatable(lua_State *L,const char *cname); typedef int (*swig_lua_base_iterator_func)(lua_State*,swig_type_info*, int, int *ret); SWIGINTERN int SWIG_Lua_iterate_bases(lua_State *L, swig_type_info * SWIGUNUSED swig_type, int first_arg, swig_lua_base_iterator_func func, int *const ret) { /* first_arg - position of the object in stack. Everything that is above are arguments * and is passed to every evocation of the func */ int last_arg = lua_gettop(L);/* position of last argument */ int original_metatable = last_arg + 1; size_t bases_count; int result = SWIG_ERROR; int bases_table; (void)swig_type; lua_getmetatable(L,first_arg); /* initialise base search */ #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) SWIG_Lua_get_table(L,".bases"); assert(lua_istable(L,-1)); bases_count = lua_rawlen(L,-1); bases_table = lua_gettop(L); #else /* In elua .bases table doesn't exist. Use table from swig_lua_class */ (void)bases_table; assert(swig_type!=0); swig_module_info *module=SWIG_GetModule(L); swig_lua_class **bases= ((swig_lua_class*)(swig_type->clientdata))->bases; const char **base_names= ((swig_lua_class*)(swig_type->clientdata))->base_names; bases_count = 0; for(;base_names[bases_count]; bases_count++);/* get length of bases */ #endif if(ret) *ret = 0; if(bases_count>0) { int to_remove; size_t i; int j; int subcall_last_arg; int subcall_first_arg = lua_gettop(L) + 1;/* Here a copy of first_arg and arguments begin */ int valid = 1; swig_type_info *base_swig_type = 0; for(j=first_arg;j<=last_arg;j++) lua_pushvalue(L,j); subcall_last_arg = lua_gettop(L); /* Trick: temporarily replacing original metatable with metatable for base class and call getter */ for(i=0;ifqname); base_swig_type = SWIG_TypeQueryModule(module,module,base_names[i]); assert(base_swig_type != 0); } #endif if(!valid) continue; assert(lua_isuserdata(L, subcall_first_arg)); assert(lua_istable(L,-1)); lua_setmetatable(L,subcall_first_arg); /* Set new metatable */ assert(lua_gettop(L) == subcall_last_arg); result = func(L, base_swig_type,subcall_first_arg, ret); /* Forward call */ if(result != SWIG_ERROR) { break; } } /* Restore original metatable */ lua_pushvalue(L,original_metatable); lua_setmetatable(L,first_arg); /* Clear - remove everything between last_arg and subcall_last_arg including */ to_remove = subcall_last_arg - last_arg; for(j=0;jtype; result = SWIG_Lua_class_do_get(L,type,1,&ret); if(result == SWIG_OK) return ret; result = SWIG_Lua_class_do_get_item(L,type,1,&ret); if(result == SWIG_OK) return ret; return 0; } /* helper for the class.set method, performs the lookup of class attributes * It returns error code. Number of function return values is passed inside 'ret' */ SWIGINTERN int SWIG_Lua_class_do_set(lua_State *L, swig_type_info *type, int first_arg, int *ret) { /* there should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ int bases_search_result; int substack_start = lua_gettop(L) - 3; lua_checkstack(L,5); assert(lua_isuserdata(L,substack_start+1)); /* just in case */ lua_getmetatable(L,substack_start+1); /* get the meta table */ assert(lua_istable(L,-1)); /* just in case */ if(ret) *ret = 0; /* it is setter - number of return values is always 0 */ SWIG_Lua_get_table(L,".set"); /* find the .set table */ if (lua_istable(L,-1)) { /* look for the key in the .set table */ lua_pushvalue(L,substack_start+2); /* key */ lua_rawget(L,-2); lua_remove(L,-2); /* tidy stack, remove .set table */ if (lua_iscfunction(L,-1)) { /* found it so call the fn & return its value */ lua_pushvalue(L,substack_start+1); /* userdata */ lua_pushvalue(L,substack_start+3); /* value */ lua_call(L,2,0); lua_remove(L,substack_start+4); /*remove metatable*/ return SWIG_OK; } lua_pop(L,1); /* remove the value */ } else { lua_pop(L,1); /* remove the answer for .set table request*/ } /* NEW: looks for the __setitem() fn this is a user provided set fn */ SWIG_Lua_get_table(L,"__setitem"); /* find the fn */ if (lua_iscfunction(L,-1)) /* if its there */ { /* found it so call the fn & return its value */ lua_pushvalue(L,substack_start+1); /* the userdata */ lua_pushvalue(L,substack_start+2); /* the parameter */ lua_pushvalue(L,substack_start+3); /* the value */ lua_call(L,3,0); /* 3 values in ,0 out */ lua_remove(L,-2); /* stack tidy, remove metatable */ return SWIG_OK; } lua_pop(L,1); /* remove value */ lua_pop(L,1); /* remove metatable */ /* Search among bases */ bases_search_result = SWIG_Lua_iterate_bases(L,type,first_arg,SWIG_Lua_class_do_set,ret); if(ret) assert(*ret == 0); assert(lua_gettop(L) == substack_start + 3); return bases_search_result; } /* This is the actual method exported to Lua. It calls SWIG_Lua_class_do_set and correctly * handles return values. */ SWIGINTERN int SWIG_Lua_class_set(lua_State *L) { /* There should be 3 params passed in (1) table (not the meta table) (2) string name of the attribute (3) any for the new value */ int ret = 0; int result; swig_lua_userdata *usr; swig_type_info *type; assert(lua_isuserdata(L,1)); usr=(swig_lua_userdata*)lua_touserdata(L,1); /* get data */ type = usr->type; result = SWIG_Lua_class_do_set(L,type,1,&ret); if(result != SWIG_OK) { SWIG_Lua_pushferrstring(L,"Assignment not possible. No setter/member with this name. For custom assignments implement __setitem method."); lua_error(L); } else { assert(ret==0); } return 0; } /* the class.destruct method called by the interpreter */ SWIGINTERN int SWIG_Lua_class_destruct(lua_State *L) { /* there should be 1 params passed in (1) userdata (not the meta table) */ swig_lua_userdata *usr; swig_lua_class *clss; assert(lua_isuserdata(L,-1)); /* just in case */ usr=(swig_lua_userdata*)lua_touserdata(L,-1); /* get it */ /* if must be destroyed & has a destructor */ if (usr->own) /* if must be destroyed */ { clss=(swig_lua_class*)usr->type->clientdata; /* get the class */ if (clss && clss->destructor) /* there is a destroy fn */ { clss->destructor(usr->ptr); /* bye bye */ } } return 0; } /* the class.__tostring method called by the interpreter and print */ SWIGINTERN int SWIG_Lua_class_tostring(lua_State *L) { /* there should be 1 param passed in (1) userdata (not the metatable) */ const char *className; void* userData; assert(lua_isuserdata(L,1)); /* just in case */ userData = lua_touserdata(L,1); /* get the userdata address for later */ lua_getmetatable(L,1); /* get the meta table */ assert(lua_istable(L,-1)); /* just in case */ lua_getfield(L, -1, ".type"); className = lua_tostring(L, -1); lua_pushfstring(L, "<%s userdata: %p>", className, userData); return 1; } /* to manually disown some userdata */ SWIGINTERN int SWIG_Lua_class_disown(lua_State *L) { /* there should be 1 params passed in (1) userdata (not the meta table) */ swig_lua_userdata *usr; assert(lua_isuserdata(L,-1)); /* just in case */ usr=(swig_lua_userdata*)lua_touserdata(L,-1); /* get it */ usr->own = 0; /* clear our ownership */ return 0; } /* lua callable function to compare userdata's value the issue is that two userdata may point to the same thing but to lua, they are different objects */ SWIGRUNTIME int SWIG_Lua_class_equal(lua_State *L) { int result; swig_lua_userdata *usr1,*usr2; if (!lua_isuserdata(L,1) || !lua_isuserdata(L,2)) /* just in case */ return 0; /* nil reply */ usr1=(swig_lua_userdata*)lua_touserdata(L,1); /* get data */ usr2=(swig_lua_userdata*)lua_touserdata(L,2); /* get data */ /*result=(usr1->ptr==usr2->ptr && usr1->type==usr2->type); only works if type is the same*/ result=(usr1->ptr==usr2->ptr); lua_pushboolean(L,result); return 1; } /* populate table at the top of the stack with metamethods that ought to be inherited */ SWIGINTERN void SWIG_Lua_populate_inheritable_metamethods(lua_State *L) { SWIG_Lua_add_boolean(L, "__add", 1); SWIG_Lua_add_boolean(L, "__sub", 1); SWIG_Lua_add_boolean(L, "__mul", 1); SWIG_Lua_add_boolean(L, "__div", 1); SWIG_Lua_add_boolean(L, "__mod", 1); SWIG_Lua_add_boolean(L, "__pow", 1); SWIG_Lua_add_boolean(L, "__unm", 1); SWIG_Lua_add_boolean(L, "__len", 1 ); SWIG_Lua_add_boolean(L, "__concat", 1 ); SWIG_Lua_add_boolean(L, "__eq", 1); SWIG_Lua_add_boolean(L, "__lt", 1); SWIG_Lua_add_boolean(L, "__le", 1); SWIG_Lua_add_boolean(L, "__call", 1); SWIG_Lua_add_boolean(L, "__tostring", 1); SWIG_Lua_add_boolean(L, "__gc", 0); } /* creates the swig registry */ SWIGINTERN void SWIG_Lua_create_class_registry(lua_State *L) { /* create main SWIG registry table */ lua_pushstring(L,"SWIG"); lua_newtable(L); /* populate it with some predefined data */ /* .library table. Placeholder */ lua_pushstring(L,".library"); lua_newtable(L); { /* list of metamethods that class inherits from its bases */ lua_pushstring(L,"inheritable_metamethods"); lua_newtable(L); /* populate with list of metamethods */ SWIG_Lua_populate_inheritable_metamethods(L); lua_rawset(L,-3); } lua_rawset(L,-3); lua_rawset(L,LUA_REGISTRYINDEX); } /* gets the swig registry (or creates it) */ SWIGINTERN void SWIG_Lua_get_class_registry(lua_State *L) { /* add this all into the swig registry: */ lua_pushstring(L,"SWIG"); lua_rawget(L,LUA_REGISTRYINDEX); /* get the registry */ if (!lua_istable(L,-1)) /* not there */ { /* must be first time, so add it */ lua_pop(L,1); /* remove the result */ SWIG_Lua_create_class_registry(L); /* then get it */ lua_pushstring(L,"SWIG"); lua_rawget(L,LUA_REGISTRYINDEX); } } SWIGINTERN void SWIG_Lua_get_inheritable_metamethods(lua_State *L) { SWIG_Lua_get_class_registry(L); lua_pushstring(L, ".library"); lua_rawget(L,-2); assert( !lua_isnil(L,-1) ); lua_pushstring(L, "inheritable_metamethods"); lua_rawget(L,-2); /* Remove class registry and library table */ lua_remove(L,-2); lua_remove(L,-2); } /* Helper function to get the classes metatable from the register */ SWIGINTERN void SWIG_Lua_get_class_metatable(lua_State *L,const char *cname) { SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,cname); /* get the name */ lua_rawget(L,-2); /* get it */ lua_remove(L,-2); /* tidy up (remove registry) */ } /* Set up the base classes pointers. Each class structure has a list of pointers to the base class structures. This function fills them. It cannot be done at compile time, as this will not work with hireachies spread over more than one swig file. Therefore it must be done at runtime, querying the SWIG type system. */ SWIGINTERN void SWIG_Lua_init_base_class(lua_State *L,swig_lua_class *clss) { int i=0; swig_module_info *module=SWIG_GetModule(L); for(i=0;clss->base_names[i];i++) { if (clss->bases[i]==0) /* not found yet */ { /* lookup and cache the base class */ swig_type_info *info = SWIG_TypeQueryModule(module,module,clss->base_names[i]); if (info) clss->bases[i] = (swig_lua_class *) info->clientdata; } } } #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* Merges two tables */ SWIGINTERN void SWIG_Lua_merge_tables_by_index(lua_State *L, int target, int source) { /* iterating */ lua_pushnil(L); while (lua_next(L,source) != 0) { /* -1 - value, -2 - index */ /* have to copy to assign */ lua_pushvalue(L,-2); /* copy of index */ lua_pushvalue(L,-2); /* copy of value */ lua_rawset(L, target); lua_pop(L,1); /* only key is left */ } } /* Merges two tables with given name. original - index of target metatable, base - index of source metatable */ SWIGINTERN void SWIG_Lua_merge_tables(lua_State *L, const char* name, int original, int base) { /* push original[name], then base[name] */ lua_pushstring(L,name); lua_rawget(L,original); int original_table = lua_gettop(L); lua_pushstring(L,name); lua_rawget(L,base); int base_table = lua_gettop(L); SWIG_Lua_merge_tables_by_index(L, original_table, base_table); /* clearing stack */ lua_pop(L,2); } /* Function takes all symbols from base and adds it to derived class. It's just a helper. */ SWIGINTERN void SWIG_Lua_class_squash_base(lua_State *L, swig_lua_class *base_cls) { /* There is one parameter - original, i.e. 'derived' class metatable */ assert(lua_istable(L,-1)); int original = lua_gettop(L); SWIG_Lua_get_class_metatable(L,base_cls->fqname); int base = lua_gettop(L); SWIG_Lua_merge_tables(L, ".fn", original, base ); SWIG_Lua_merge_tables(L, ".set", original, base ); SWIG_Lua_merge_tables(L, ".get", original, base ); lua_pop(L,1); } /* Function squashes all symbols from 'clss' bases into itself */ SWIGINTERN void SWIG_Lua_class_squash_bases(lua_State *L, swig_lua_class *clss) { int i; SWIG_Lua_get_class_metatable(L,clss->fqname); for(i=0;clss->base_names[i];i++) { if (clss->bases[i]==0) /* Somehow it's not found. Skip it */ continue; /* Thing is: all bases are already registered. Thus they have already executed * this function. So we just need to squash them into us, because their bases * are already squashed into them. No need for recursion here! */ SWIG_Lua_class_squash_base(L, clss->bases[i]); } lua_pop(L,1); /*tidy stack*/ } #endif #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* In elua this is useless */ /* helper add a variable to a registered class */ SWIGINTERN void SWIG_Lua_add_variable(lua_State *L,const char *name,lua_CFunction getFn,lua_CFunction setFn) { assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_get_table(L,".get"); /* find the .get table */ assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,name,getFn); lua_pop(L,1); /* tidy stack (remove table) */ if (setFn) { SWIG_Lua_get_table(L,".set"); /* find the .set table */ assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,name,setFn); lua_pop(L,1); /* tidy stack (remove table) */ } } /* helper to recursively add class static details (static attributes, operations and constants) */ SWIGINTERN void SWIG_Lua_add_class_static_details(lua_State *L, swig_lua_class *clss) { int i = 0; /* The class namespace table must be on the top of the stack */ assert(lua_istable(L,-1)); /* call all the base classes first: we can then override these later: */ for(i=0;clss->bases[i];i++) { SWIG_Lua_add_class_static_details(L,clss->bases[i]); } SWIG_Lua_add_namespace_details(L, clss->cls_static); } SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class *clss); /* forward declaration */ /* helper to recursively add class details (attributes & operations) */ SWIGINTERN void SWIG_Lua_add_class_instance_details(lua_State *L, swig_lua_class *clss) { int i; size_t bases_count = 0; /* Add bases to .bases table */ SWIG_Lua_get_table(L,".bases"); assert(lua_istable(L,-1)); /* just in case */ for(i=0;clss->bases[i];i++) { SWIG_Lua_get_class_metatable(L,clss->bases[i]->fqname); /* Base class must be already registered */ assert(lua_istable(L,-1)); lua_rawseti(L,-2,i+1); /* In lua indexing starts from 1 */ bases_count++; } assert(lua_rawlen(L,-1) == bases_count); lua_pop(L,1); /* remove .bases table */ /* add attributes */ for(i=0;clss->attributes[i].name;i++){ SWIG_Lua_add_variable(L,clss->attributes[i].name,clss->attributes[i].getmethod,clss->attributes[i].setmethod); } /* add methods to the metatable */ SWIG_Lua_get_table(L,".fn"); /* find the .fn table */ assert(lua_istable(L,-1)); /* just in case */ for(i=0;clss->methods[i].name;i++){ SWIG_Lua_add_function(L,clss->methods[i].name,clss->methods[i].func); } lua_pop(L,1); /* tidy stack (remove table) */ /* add operator overloads This adds methods from metatable array to metatable. Can mess up garbage collectind if someone defines __gc method */ if(clss->metatable) { for(i=0;clss->metatable[i].name;i++) { SWIG_Lua_add_function(L,clss->metatable[i].name,clss->metatable[i].func); } } #if !defined(SWIG_LUA_SQUASH_BASES) /* Adding metamethods that are defined in base classes. If bases were squashed * then it is obviously unnecessary */ SWIG_Lua_add_class_user_metamethods(L, clss); #endif } /* Helpers to add user defined class metamedhods - __add, __sub etc. The helpers are needed for the following issue: Lua runtime checks for metamethod existence with rawget function ignoring our SWIG-provided __index and __newindex functions. Thus our inheritance-aware method search algorithm doesn't work in such case. (Not to say that Lua runtime queries metamethod directly in metatable and not in object). Current solution is this: if somewhere in hierarchy metamethod __x is defined, then all descendants are automatically given a special proxy __x that calls the real __x method. Obvious idea - to copy __x instead of creating __x-proxy is wrong because if someone changes __x in runtime, those changes must be reflected in all descendants. */ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L); /*forward declaration*/ /* The real function that resolves a metamethod. * Function searches given class and all it's bases(recursively) for first instance of something that is * not equal to SWIG_Lua_resolve_metatmethod. (Almost always this 'something' is actual metamethod implementation * and it is a SWIG-generated C function.). It returns value on the top of the L and there is no garbage below the * answer. * Returns 1 if found, 0 otherwise. * clss is class which metatable we will search for method * metamethod_name_idx is index in L where metamethod name (as string) lies * skip_check allows to skip searching metamethod in givel clss and immideatelly go to searching in bases. skip_check * is not caried to subsequent recursive calls - false is always passed. It is set to true only at first call from * SWIG_Lua_resolve_metamethod * */ SWIGINTERN int SWIG_Lua_do_resolve_metamethod(lua_State *L, const swig_lua_class *clss, int metamethod_name_idx, int skip_check) { /* This function is called recursively */ int result = 0; int i = 0; if (!skip_check) { SWIG_Lua_get_class_metatable(L, clss->fqname); lua_pushvalue(L, metamethod_name_idx); lua_rawget(L,-2); /* If this is cfunction and it is equal to SWIG_Lua_resolve_metamethod then * this isn't the function we are looking for :) * lua_tocfunction will return NULL if not cfunction */ if (!lua_isnil(L,-1) && lua_tocfunction(L,-1) != SWIG_Lua_resolve_metamethod ) { lua_remove(L,-2); /* removing class metatable */ return 1; } lua_pop(L,2); /* remove class metatable and query result */ } /* Forwarding calls to bases */ for(i=0;clss->bases[i];i++) { result = SWIG_Lua_do_resolve_metamethod(L, clss->bases[i], metamethod_name_idx, 0); if (result) break; } return result; } /* The proxy function for metamethod. All parameters are passed as cclosure. Searches for actual method * and calls it */ SWIGRUNTIME int SWIG_Lua_resolve_metamethod(lua_State *L) { int numargs; int metamethod_name_idx; const swig_lua_class* clss; int result; lua_checkstack(L,5); numargs = lua_gettop(L); /* number of arguments to pass to actual metamethod */ /* Get upvalues from closure */ lua_pushvalue(L, lua_upvalueindex(1)); /*Get function name*/ metamethod_name_idx = lua_gettop(L); lua_pushvalue(L, lua_upvalueindex(2)); clss = (const swig_lua_class*)(lua_touserdata(L,-1)); lua_pop(L,1); /* remove lightuserdata with clss from stack */ /* Actual work */ result = SWIG_Lua_do_resolve_metamethod(L, clss, metamethod_name_idx, 1); if (!result) { SWIG_Lua_pushferrstring(L,"The metamethod proxy is set, but it failed to find actual metamethod. Memory corruption is most likely explanation."); lua_error(L); return 0; } lua_remove(L,-2); /* remove metamethod key */ lua_insert(L,1); /* move function to correct position */ lua_call(L, numargs, LUA_MULTRET); return lua_gettop(L); /* return all results */ } /* If given metamethod must be present in given class, then creates appropriate proxy * Returns 1 if successfully added, 0 if not added because no base class has it, -1 * if method is defined in the class metatable itself */ SWIGINTERN int SWIG_Lua_add_class_user_metamethod(lua_State *L, swig_lua_class *clss, const int metatable_index) { int key_index; int success = 0; int i = 0; /* metamethod name - on the top of the stack */ assert(lua_isstring(L,-1)); key_index = lua_gettop(L); /* Check whether method is already defined in metatable */ lua_pushvalue(L,key_index); /* copy of the key */ lua_gettable(L,metatable_index); if( !lua_isnil(L,-1) ) { lua_pop(L,1); return -1; } lua_pop(L,1); /* Iterating over immediate bases */ for(i=0;clss->bases[i];i++) { const swig_lua_class *base = clss->bases[i]; SWIG_Lua_get_class_metatable(L, base->fqname); lua_pushvalue(L, key_index); lua_rawget(L, -2); if( !lua_isnil(L,-1) ) { lua_pushvalue(L, key_index); /* Add proxy function */ lua_pushvalue(L, key_index); /* first closure value is function name */ lua_pushlightuserdata(L, clss); /* second closure value is swig_lua_class structure */ lua_pushcclosure(L, SWIG_Lua_resolve_metamethod, 2); lua_rawset(L, metatable_index); success = 1; } lua_pop(L,1); /* remove function or nil */ lua_pop(L,1); /* remove base class metatable */ if( success ) break; } return success; } SWIGINTERN void SWIG_Lua_add_class_user_metamethods(lua_State *L, swig_lua_class *clss) { int metatable_index; int metamethods_info_index; int tostring_undefined; int eq_undefined = 0; SWIG_Lua_get_class_metatable(L, clss->fqname); metatable_index = lua_gettop(L); SWIG_Lua_get_inheritable_metamethods(L); assert(lua_istable(L,-1)); metamethods_info_index = lua_gettop(L); lua_pushnil(L); /* first key */ while(lua_next(L, metamethods_info_index) != 0 ) { /* key at index -2, value at index -1 */ const int is_inheritable = lua_toboolean(L,-2); lua_pop(L,1); /* remove value - we don't need it anymore */ if(is_inheritable) { /* if metamethod is inheritable */ SWIG_Lua_add_class_user_metamethod(L,clss,metatable_index); } } lua_pop(L,1); /* remove inheritable metatmethods table */ /* Special handling for __tostring method */ lua_pushstring(L, "__tostring"); lua_pushvalue(L,-1); lua_rawget(L,metatable_index); tostring_undefined = lua_isnil(L,-1); lua_pop(L,1); if( tostring_undefined ) { lua_pushcfunction(L, SWIG_Lua_class_tostring); lua_rawset(L, metatable_index); } else { lua_pop(L,1); /* remove copy of the key */ } /* Special handling for __eq method */ lua_pushstring(L, "__eq"); lua_pushvalue(L,-1); lua_rawget(L,metatable_index); eq_undefined = lua_isnil(L,-1); lua_pop(L,1); if( eq_undefined ) { lua_pushcfunction(L, SWIG_Lua_class_equal); lua_rawset(L, metatable_index); } else { lua_pop(L,1); /* remove copy of the key */ } /* Warning: __index and __newindex are SWIG-defined. For user-defined operator[] * a __getitem/__setitem method should be defined */ lua_pop(L,1); /* pop class metatable */ } /* Register class static methods,attributes etc as well as constructor proxy */ SWIGINTERN void SWIG_Lua_class_register_static(lua_State *L, swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); lua_checkstack(L,5); /* just in case */ assert(lua_istable(L,-1)); /* just in case */ assert(strcmp(clss->name, clss->cls_static->name) == 0); /* in class those 2 must be equal */ SWIG_Lua_namespace_register(L,clss->cls_static, 1); assert(lua_istable(L,-1)); /* just in case */ /* add its constructor to module with the name of the class so you can do MyClass(...) as well as new_MyClass(...) BUT only if a constructor is defined (this overcomes the problem of pure virtual classes without constructors)*/ if (clss->constructor) { lua_getmetatable(L,-1); assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_function(L,"__call", clss->constructor); lua_pop(L,1); } assert(lua_istable(L,-1)); /* just in case */ SWIG_Lua_add_class_static_details(L, clss); /* clear stack */ lua_pop(L,1); assert( lua_gettop(L) == begin ); } /* Performs the instance (non-static) class registration process. Metatable for class is created * and added to the class registry. */ SWIGINTERN void SWIG_Lua_class_register_instance(lua_State *L,swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); int i; /* if name already there (class is already registered) then do nothing */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_rawget(L,-2); if(!lua_isnil(L,-1)) { lua_pop(L,2); assert(lua_gettop(L)==begin); return; } lua_pop(L,2); /* tidy stack */ /* Recursively initialize all bases */ for(i=0;clss->bases[i];i++) { SWIG_Lua_class_register_instance(L,clss->bases[i]); } /* Again, get registry and push name */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_newtable(L); /* create the metatable */ #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* If squashing is requested, then merges all bases metatable into this one. * It would get us all special methods: __getitem, __add etc. * This would set .fn, .type, and other .xxx incorrectly, but we will overwrite it right away */ { int new_metatable_index = lua_absindex(L,-1); for(i=0;clss->bases[i];i++) { int base_metatable; SWIG_Lua_get_class_metatable(L,clss->bases[i]->fqname); base_metatable = lua_absindex(L,-1); SWIG_Lua_merge_tables_by_index(L,new_metatable_index, base_metatable); lua_pop(L,1); } } /* And now we will overwrite all incorrectly set data */ #endif /* add string of class name called ".type" */ lua_pushstring(L,".type"); lua_pushstring(L,clss->fqname); lua_rawset(L,-3); /* add a table called bases */ lua_pushstring(L,".bases"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".get" */ lua_pushstring(L,".get"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".set" */ lua_pushstring(L,".set"); lua_newtable(L); lua_rawset(L,-3); /* add a table called ".fn" */ lua_pushstring(L,".fn"); lua_newtable(L); /* add manual disown method */ SWIG_Lua_add_function(L,"__disown",SWIG_Lua_class_disown); lua_rawset(L,-3); /* add accessor fns for using the .get,.set&.fn */ SWIG_Lua_add_function(L,"__index",SWIG_Lua_class_get); SWIG_Lua_add_function(L,"__newindex",SWIG_Lua_class_set); SWIG_Lua_add_function(L,"__gc",SWIG_Lua_class_destruct); /* add it */ lua_rawset(L,-3); /* metatable into registry */ lua_pop(L,1); /* tidy stack (remove registry) */ assert(lua_gettop(L) == begin); #if defined(SWIG_LUA_SQUASH_BASES) && (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA) /* Now merge all symbols from .fn, .set, .get etc from bases to our tables */ SWIG_Lua_class_squash_bases(L,clss); #endif SWIG_Lua_get_class_metatable(L,clss->fqname); SWIG_Lua_add_class_instance_details(L,clss); /* recursive adding of details (atts & ops) */ lua_pop(L,1); /* tidy stack (remove class metatable) */ assert( lua_gettop(L) == begin ); } SWIGINTERN void SWIG_Lua_class_register(lua_State *L,swig_lua_class *clss) { int SWIGUNUSED begin; assert(lua_istable(L,-1)); /* This is a table (module or namespace) where classes will be added */ SWIG_Lua_class_register_instance(L,clss); SWIG_Lua_class_register_static(L,clss); /* Add links from static part to instance part and vice versa */ /* [SWIG registry] [Module] * "MyClass" ----> [MyClass metatable] <===== "MyClass" -+> [static part] * ".get" ----> ... | | getmetatable()----| * ".set" ----> ... | | | * ".static" --------------)----------------/ [static part metatable] * | ".get" --> ... * | ".set" --> .... * |=============================== ".instance" */ begin = lua_gettop(L); lua_pushstring(L,clss->cls_static->name); lua_rawget(L,-2); /* get class static table */ assert(lua_istable(L,-1)); lua_getmetatable(L,-1); assert(lua_istable(L,-1)); /* get class static metatable */ lua_pushstring(L,".instance"); /* prepare key */ SWIG_Lua_get_class_metatable(L,clss->fqname); /* get class metatable */ assert(lua_istable(L,-1)); lua_pushstring(L,".static"); /* prepare key */ lua_pushvalue(L, -4); /* push static class TABLE */ assert(lua_istable(L,-1)); lua_rawset(L,-3); /* assign static class table(!NOT metatable) as ".static" member of class metatable */ lua_rawset(L,-3); /* assign class metatable as ".instance" member of class static METATABLE */ lua_pop(L,2); assert(lua_gettop(L) == begin); } #endif /* SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_LUA */ #if (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUA) || (SWIG_LUA_TARGET == SWIG_LUA_FLAVOR_ELUAC) SWIGINTERN void SWIG_Lua_elua_class_register_instance(lua_State *L, swig_lua_class *clss) { const int SWIGUNUSED begin = lua_gettop(L); int i; /* if name already there (class is already registered) then do nothing */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ lua_rawget(L,-2); if(!lua_isnil(L,-1)) { lua_pop(L,2); assert(lua_gettop(L)==begin); return; } lua_pop(L,2); /* tidy stack */ /* Recursively initialize all bases */ for(i=0;clss->bases[i];i++) { SWIG_Lua_elua_class_register_instance(L,clss->bases[i]); } /* Again, get registry and push name */ SWIG_Lua_get_class_registry(L); /* get the registry */ lua_pushstring(L,clss->fqname); /* get the name */ assert(clss->metatable); lua_pushrotable(L, (void*)(clss->metatable)); /* create the metatable */ lua_rawset(L,-3); lua_pop(L,1); assert(lua_gettop(L) == begin); } #endif /* elua && eluac */ /* ----------------------------------------------------------------------------- * Class/structure conversion fns * ----------------------------------------------------------------------------- */ /* helper to add metatable to new lua object */ SWIGINTERN void SWIG_Lua_AddMetatable(lua_State *L,swig_type_info *type) { if (type->clientdata) /* there is clientdata: so add the metatable */ { SWIG_Lua_get_class_metatable(L,((swig_lua_class*)(type->clientdata))->fqname); if (lua_istable(L,-1)) { lua_setmetatable(L,-2); } else { lua_pop(L,1); } } } /* pushes a new object into the lua stack */ SWIGRUNTIME void SWIG_Lua_NewPointerObj(lua_State *L,void *ptr,swig_type_info *type, int own) { swig_lua_userdata *usr; if (!ptr){ lua_pushnil(L); return; } usr=(swig_lua_userdata*)lua_newuserdata(L,sizeof(swig_lua_userdata)); /* get data */ usr->ptr=ptr; /* set the ptr */ usr->type=type; usr->own=own; #if (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC) SWIG_Lua_AddMetatable(L,type); /* add metatable */ #endif } /* takes a object from the lua stack & converts it into an object of the correct type (if possible) */ SWIGRUNTIME int SWIG_Lua_ConvertPtr(lua_State *L,int index,void **ptr,swig_type_info *type,int flags) { swig_lua_userdata *usr; swig_cast_info *cast; if (lua_isnil(L,index)){*ptr=0; return SWIG_OK;} /* special case: lua nil => NULL pointer */ usr=(swig_lua_userdata*)lua_touserdata(L,index); /* get data */ if (usr) { if (flags & SWIG_POINTER_DISOWN) /* must disown the object */ { usr->own=0; } if (!type) /* special cast void*, no casting fn */ { *ptr=usr->ptr; return SWIG_OK; /* ok */ } cast=SWIG_TypeCheckStruct(usr->type,type); /* performs normal type checking */ if (cast) { int newmemory = 0; *ptr=SWIG_TypeCast(cast,usr->ptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return SWIG_OK; /* ok */ } } return SWIG_ERROR; /* error */ } SWIGRUNTIME void* SWIG_Lua_MustGetPtr(lua_State *L,int index,swig_type_info *type,int flags, int argnum,const char *func_name){ void *result; if (!SWIG_IsOK(SWIG_ConvertPtr(L,index,&result,type,flags))){ luaL_error (L,"Error in %s, expected a %s at argument number %d\n", func_name,(type && type->str)?type->str:"void*",argnum); } return result; } /* pushes a packed userdata. user for member fn pointers only */ SWIGRUNTIME void SWIG_Lua_NewPackedObj(lua_State *L,void *ptr,size_t size,swig_type_info *type) { swig_lua_rawdata *raw; assert(ptr); /* not acceptable to pass in a NULL value */ raw=(swig_lua_rawdata*)lua_newuserdata(L,sizeof(swig_lua_rawdata)-1+size); /* alloc data */ raw->type=type; raw->own=0; memcpy(raw->data,ptr,size); /* copy the data */ SWIG_Lua_AddMetatable(L,type); /* add metatable */ } /* converts a packed userdata. user for member fn pointers only */ SWIGRUNTIME int SWIG_Lua_ConvertPacked(lua_State *L,int index,void *ptr,size_t size,swig_type_info *type) { swig_lua_rawdata *raw; raw=(swig_lua_rawdata*)lua_touserdata(L,index); /* get data */ if (!raw) return SWIG_ERROR; /* error */ if (type==0 || type==raw->type) /* void* or identical type */ { memcpy(ptr,raw->data,size); /* copy it */ return SWIG_OK; /* ok */ } return SWIG_ERROR; /* error */ } /* a function to get the typestring of a piece of data */ SWIGRUNTIME const char *SWIG_Lua_typename(lua_State *L, int tp) { swig_lua_userdata *usr; if (lua_isuserdata(L,tp)) { usr=(swig_lua_userdata*)lua_touserdata(L,tp); /* get data */ if (usr && usr->type && usr->type->str) return usr->type->str; return "userdata (unknown type)"; } return lua_typename(L,lua_type(L,tp)); } /* lua callable function to get the userdata's type */ SWIGRUNTIME int SWIG_Lua_type(lua_State *L) { lua_pushstring(L,SWIG_Lua_typename(L,1)); return 1; } /* ----------------------------------------------------------------------------- * global variable support code: class/struct typemap functions * ----------------------------------------------------------------------------- */ #if ((SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUA) && (SWIG_LUA_TARGET != SWIG_LUA_FLAVOR_ELUAC)) /* Install Constants */ SWIGINTERN void SWIG_Lua_InstallConstants(lua_State *L, swig_lua_const_info constants[]) { int i; for (i = 0; constants[i].type; i++) { switch(constants[i].type) { case SWIG_LUA_INT: lua_pushstring(L,constants[i].name); lua_pushinteger(L,(lua_Number)constants[i].lvalue); lua_rawset(L,-3); break; case SWIG_LUA_FLOAT: lua_pushstring(L,constants[i].name); lua_pushnumber(L,(lua_Number)constants[i].dvalue); lua_rawset(L,-3); break; case SWIG_LUA_CHAR: lua_pushstring(L,constants[i].name); { char c = constants[i].lvalue; lua_pushlstring(L,&c,1); } lua_rawset(L,-3); break; case SWIG_LUA_STRING: lua_pushstring(L,constants[i].name); lua_pushstring(L,(char *) constants[i].pvalue); lua_rawset(L,-3); break; case SWIG_LUA_POINTER: lua_pushstring(L,constants[i].name); SWIG_NewPointerObj(L,constants[i].pvalue, *(constants[i]).ptype,0); lua_rawset(L,-3); break; case SWIG_LUA_BINARY: lua_pushstring(L,constants[i].name); SWIG_NewMemberObj(L,constants[i].pvalue,constants[i].lvalue,*(constants[i]).ptype); lua_rawset(L,-3); break; default: break; } } } #endif /* ----------------------------------------------------------------------------- * executing lua code from within the wrapper * ----------------------------------------------------------------------------- */ #ifndef SWIG_DOSTRING_FAIL /* Allows redefining of error function */ #define SWIG_DOSTRING_FAIL(S) fprintf(stderr,"%s\n",S) #endif /* Executes a C string in Lua which is a really simple way of calling lua from C Unfortunately lua keeps changing its APIs, so we need a conditional compile In lua 5.0.X it's lua_dostring() In lua 5.1.X it's luaL_dostring() */ SWIGINTERN int SWIG_Lua_dostring(lua_State *L, const char *str) { int ok,top; if (str==0 || str[0]==0) return 0; /* nothing to do */ top=lua_gettop(L); /* save stack */ #if (defined(LUA_VERSION_NUM) && (LUA_VERSION_NUM>=501)) ok=luaL_dostring(L,str); /* looks like this is lua 5.1.X or later, good */ #else ok=lua_dostring(L,str); /* might be lua 5.0.x, using lua_dostring */ #endif if (ok!=0) { SWIG_DOSTRING_FAIL(lua_tostring(L,-1)); } lua_settop(L,top); /* restore the stack */ return ok; } #ifdef __cplusplus } #endif /* ------------------------------ end luarun.swg ------------------------------ */ swig-3.0.12/Lib/lua/luakw.swg0000664000175000017500000000230413042756442015570 0ustar williamwilliam/* Warnings for Lua keywords, built-in names and bad names. */ #define LUAKW(x) %keywordwarn("'" `x` "' is a Lua keyword, renaming to 'c_" `x` "'", rename="c_%s") `x` #define LUABN(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "'" `x` "' conflicts with a basic function in Lua"), %$not %$ismember) `x` /* Warnings for Lua keywords http://www.lua.org/manual/5.2/manual.html#3.1 */ LUAKW(and); LUAKW(break); LUAKW(do); LUAKW(else); LUAKW(elseif); LUAKW(end); LUAKW(false); LUAKW(for); LUAKW(function); LUAKW(goto); LUAKW(if); LUAKW(in); LUAKW(local); LUAKW(nil); LUAKW(not); LUAKW(or); LUAKW(repeat); LUAKW(return); LUAKW(then); LUAKW(true); LUAKW(until); LUAKW(while); /* Basic functions http://www.lua.org/manual/5.2/manual.html#6.1 */ LUABN(assert); LUABN(collectgarbage); LUABN(dofile); LUABN(error); LUABN(_G); // Not actually a function LUABN(getmetatable); LUABN(ipairs); LUABN(load); LUABN(loadfile); LUABN(next); LUABN(pairs); LUABN(pcall); LUABN(print); LUABN(rawequal); LUABN(rawget); LUABN(rawlen); LUABN(rawset); LUABN(select); LUABN(setmetatable); LUABN(tonumber); LUABN(tostring); LUABN(type); LUABN(_VERSION); // Not actually a function LUABN(xpcall); #undef LUABN #undef LUAKW swig-3.0.12/Lib/lua/std_common.i0000664000175000017500000000014613042756442016241 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-3.0.12/Lib/lua/std_except.i0000664000175000017500000000370013042756442016240 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception * specification, such as: * size_t at() const throw (std::out_of_range); * * std_except.i * ----------------------------------------------------------------------------- */ %{ #include #include %} %include namespace std { %ignore exception; // not sure if I should ignore this... class exception { public: exception() throw() { } virtual ~exception() throw(); virtual const char* what() const throw(); }; } // normally objects which are thrown are returned to the interpreter as errors // (which potentially may have problems if they are not copied) // therefore all classes based upon std::exception are converted to their strings & returned as errors %typemap(throws) std::bad_cast "SWIG_exception(SWIG_TypeError, $1.what());" %typemap(throws) std::bad_exception "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::domain_error "SWIG_exception(SWIG_ValueError, $1.what());" %typemap(throws) std::exception "SWIG_exception(SWIG_SystemError, $1.what());" %typemap(throws) std::invalid_argument "SWIG_exception(SWIG_ValueError, $1.what());" %typemap(throws) std::length_error "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::logic_error "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::out_of_range "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::overflow_error "SWIG_exception(SWIG_OverflowError, $1.what());" %typemap(throws) std::range_error "SWIG_exception(SWIG_IndexError, $1.what());" %typemap(throws) std::runtime_error "SWIG_exception(SWIG_RuntimeError, $1.what());" %typemap(throws) std::underflow_error "SWIG_exception(SWIG_RuntimeError, $1.what());" swig-3.0.12/Lib/lua/typemaps.i0000664000175000017500000004575313042756442015756 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.swg * * SWIG Library file containing the main typemap code to support Lua modules. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic inout typemaps * ----------------------------------------------------------------------------- */ /* These provide the basic ability for passing in & out of standard numeric data types (int,long,float,double, etc) The basic code looks like this: %typemap(in,checkfn="lua_isnumber") int *INPUT(int temp), int &INPUT(int temp) %{ temp = (int)lua_tonumber(L,$input); $1 = &temp; %} %typemap(in, numinputs=0) int *OUTPUT (int temp) %{ $1 = &temp; %} %typemap(argout) int *OUTPUT %{ lua_pushnumber(L, (double) *$1); SWIG_arg++;%} %typemap(in) int *INOUT = int *INPUT; %typemap(argout) int *INOUT = int *OUTPUT; However the code below is a mixture of #defines & such, so nowhere as easy to read To make you code work correctly its not just a matter of %including this file You also have to give SWIG the hints on which to use where eg extern int add_pointer(int* a1,int* a2); // a1 & a2 are pointer values to be added extern void swap(int* s1, int* s2); // does the swap You will need to either change the argument names extern int add_pointer(int* INPUT,int* INPUT); or provide a %apply statement %apply int* INOUT{ int *s1, int *s2 }; // if SWIG sees int* s1, int* s2, assume they are inout params */ %define SWIG_NUMBER_TYPEMAP(TYPE) %typemap(in,checkfn="lua_isnumber") TYPE *INPUT($*ltype temp), TYPE &INPUT($*ltype temp) %{ temp = ($*ltype)lua_tonumber(L,$input); $1 = &temp; %} %typemap(in, numinputs=0) TYPE *OUTPUT ($*ltype temp) %{ $1 = &temp; %} %typemap(argout) TYPE *OUTPUT %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} %typemap(in) TYPE *INOUT = TYPE *INPUT; %typemap(argout) TYPE *INOUT = TYPE *OUTPUT; %typemap(in) TYPE &OUTPUT = TYPE *OUTPUT; %typemap(argout) TYPE &OUTPUT = TYPE *OUTPUT; %typemap(in) TYPE &INOUT = TYPE *INPUT; %typemap(argout) TYPE &INOUT = TYPE *OUTPUT; // const version (the $*ltype is the basic number without ptr or const's) %typemap(in,checkfn="lua_isnumber") const TYPE *INPUT($*ltype temp) %{ temp = ($*ltype)lua_tonumber(L,$input); $1 = &temp; %} %enddef // now the code SWIG_NUMBER_TYPEMAP(unsigned char); SWIG_NUMBER_TYPEMAP(signed char); SWIG_NUMBER_TYPEMAP(short); SWIG_NUMBER_TYPEMAP(unsigned short); SWIG_NUMBER_TYPEMAP(signed short); SWIG_NUMBER_TYPEMAP(int); SWIG_NUMBER_TYPEMAP(unsigned int); SWIG_NUMBER_TYPEMAP(signed int); SWIG_NUMBER_TYPEMAP(long); SWIG_NUMBER_TYPEMAP(unsigned long); SWIG_NUMBER_TYPEMAP(signed long); SWIG_NUMBER_TYPEMAP(float); SWIG_NUMBER_TYPEMAP(double); SWIG_NUMBER_TYPEMAP(enum SWIGTYPE); // also for long longs's SWIG_NUMBER_TYPEMAP(long long); SWIG_NUMBER_TYPEMAP(unsigned long long); SWIG_NUMBER_TYPEMAP(signed long long); // note we dont do char, as a char* is probably a string not a ptr to a single char // similar for booleans %typemap(in,checkfn="lua_isboolean") bool *INPUT(bool temp), bool &INPUT(bool temp) %{ temp = (lua_toboolean(L,$input)!=0); $1 = &temp; %} %typemap(in, numinputs=0) bool *OUTPUT (bool temp),bool &OUTPUT (bool temp) %{ $1 = &temp; %} %typemap(argout) bool *OUTPUT,bool &OUTPUT %{ lua_pushboolean(L, (int)((*$1)!=0)); SWIG_arg++;%} %typemap(in) bool *INOUT = bool *INPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; /* ----------------------------------------------------------------------------- * Basic Array typemaps * ----------------------------------------------------------------------------- */ /* I have no idea why this kind of code does not exist in SWIG as standard, but here is it. This code will convert to/from 1D numeric arrays. In order to reduce code bloat, there are a few macros and quite a few functions defined (unfortunately this makes it a lot less clear) assuming we have functions void process_array(int arr[3]); // nice fixed size array void process_var_array(float arr[],int len); // variable sized array void process_var_array_inout(double* arr,int len); // variable sized array // data passed in & out void process_enum_inout_array_var(enum Days *arrinout, int len); // using enums void return_array_5(int arrout[5]); // out array only in order to wrap them correctly requires a typemap // inform SWIG of the correct typemap // For fixed length, you must specify it as INPUT[ANY] %apply (int INPUT[ANY]) {(int arr[3])}; // variable length arrays are just the same %apply (float INPUT[],int) {(float arr[],int len)}; // it is also ok, to map the TYPE* instead of a TYPE[] %apply (double *INOUT,int) {(double arr*,int len)}; // for the enum's you must use enum SWIGTYPE %apply (enum SWIGTYPE *INOUT,int) {(enum Days *arrinout, int len)}; // fixed length out if also fine %apply (int OUTPUT[ANY]) {(int arrout[5])}; Generally, you could use %typemap(...)=... but the %apply is neater & easier a few things of note: * all Lua tables are indexed from 1, all C/C++ arrays are indexed from 0 therefore t={6,5,3} -- t[1]==6, t[2]==5, t[3]==3 when passed to process_array(int arr[3]) becomes arr[0]==6, arr[1]==5, arr[2]==3 * for OUTPUT arrays, no array need be passed in, the fn will return a Lua table so for the above mentioned return_array_5() would look like arr=return_array_5() -- no parameters passed in * for INOUT arrays, a table must be passed in, and a new table will be returned (this is consistent with the way that numbers are processed) if you want just use arr={...} arr=process_var_array_inout(arr) -- arr is replaced by the new version The following are not yet supported: * variable length output only array (inout works ok) * multidimensional arrays * arrays of objects/structs * arrays of pointers */ /* The internals of the array management stuff helper fns/macros SWIG_ALLOC_ARRAY(TYPE,LEN) // returns a typed array TYPE[LEN] SWIG_FREE_ARRAY(PTR) // delete the ptr (if not zero) // counts the specified table & gets the size // integer version int SWIG_itable_size(lua_State* L, int index); // other version int SWIG_table_size(lua_State* L, int index); SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE) // this fn declares up 4 functions for helping to read/write tables // these can then be called by the macros ... // all assume the table is an integer indexes from 1 // but the C array is a indexed from 0 // created a fixed size array, reads the specified table // and then fills the array with numbers // returns ptr to the array if ok, or 0 for error // (also pushes a error message to the stack) TYPE* SWIG_get_NAME_num_array_fixed(lua_State* L, int index, int size); // as per SWIG_get_NAME_num_array_fixed() // but reads the entire table & creates an array of the correct size // (if the table is empty, it returns an error rather than a zero length array) TYPE* SWIG_get_NAME_num_array_var(lua_State* L, int index, int* size); // writes a table to Lua with all the specified numbers void SWIG_write_NAME_num_array(lua_State* L,TYPE *array,int size); // read the specified table, and fills the array with numbers // returns 1 of ok (only fails if it doesnt find numbers) // helper fn (called by SWIG_get_NAME_num_array_*() fns) int SWIG_read_NAME_num_array(lua_State* L,int index,TYPE *array,int size); */ /* Reported that you don't need to check for NULL for delete & free There probably is some compiler that its not true for, so the code is left here just in case. #ifdef __cplusplus #define SWIG_ALLOC_ARRAY(TYPE,LEN) new TYPE[LEN] #define SWIG_FREE_ARRAY(PTR) if(PTR){delete[] PTR;} #else #define SWIG_ALLOC_ARRAY(TYPE,LEN) (TYPE *)malloc(LEN*sizeof(TYPE)) #define SWIG_FREE_ARRAY(PTR) if(PTR){free(PTR);} #endif */ %{ #ifdef __cplusplus /* generic alloc/dealloc fns*/ #define SWIG_ALLOC_ARRAY(TYPE,LEN) new TYPE[LEN] #define SWIG_FREE_ARRAY(PTR) delete[] PTR #else #define SWIG_ALLOC_ARRAY(TYPE,LEN) (TYPE *)malloc(LEN*sizeof(TYPE)) #define SWIG_FREE_ARRAY(PTR) free(PTR) #endif /* counting the size of arrays:*/ SWIGINTERN int SWIG_itable_size(lua_State* L, int index) { int n=0; while(1){ lua_rawgeti(L,index,n+1); if (lua_isnil(L,-1))break; ++n; lua_pop(L,1); } lua_pop(L,1); return n; } SWIGINTERN int SWIG_table_size(lua_State* L, int index) { int n=0; lua_pushnil(L); /* first key*/ while (lua_next(L, index) != 0) { ++n; lua_pop(L, 1); /* removes `value'; keeps `key' for next iteration*/ } return n; } /* super macro to declare array typemap helper fns */ #define SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE)\ SWIGINTERN int SWIG_read_##NAME##_num_array(lua_State* L,int index,TYPE *array,int size){\ int i;\ for (i = 0; i < size; i++) {\ lua_rawgeti(L,index,i+1);\ if (lua_isnumber(L,-1)){\ array[i] = (TYPE)lua_tonumber(L,-1);\ } else {\ lua_pop(L,1);\ return 0;\ }\ lua_pop(L,1);\ }\ return 1;\ }\ SWIGINTERN TYPE* SWIG_get_##NAME##_num_array_fixed(lua_State* L, int index, int size){\ TYPE *array;\ if (!lua_istable(L,index) || SWIG_itable_size(L,index) != size) {\ SWIG_Lua_pushferrstring(L,"expected a table of size %d",size);\ return 0;\ }\ array=SWIG_ALLOC_ARRAY(TYPE,size);\ if (!SWIG_read_##NAME##_num_array(L,index,array,size)){\ SWIG_Lua_pusherrstring(L,"table must contain numbers");\ SWIG_FREE_ARRAY(array);\ return 0;\ }\ return array;\ }\ SWIGINTERN TYPE* SWIG_get_##NAME##_num_array_var(lua_State* L, int index, int* size)\ {\ TYPE *array;\ if (!lua_istable(L,index)) {\ SWIG_Lua_pusherrstring(L,"expected a table");\ return 0;\ }\ *size=SWIG_itable_size(L,index);\ if (*size<1){\ SWIG_Lua_pusherrstring(L,"table appears to be empty");\ return 0;\ }\ array=SWIG_ALLOC_ARRAY(TYPE,*size);\ if (!SWIG_read_##NAME##_num_array(L,index,array,*size)){\ SWIG_Lua_pusherrstring(L,"table must contain numbers");\ SWIG_FREE_ARRAY(array);\ return 0;\ }\ return array;\ }\ SWIGINTERN void SWIG_write_##NAME##_num_array(lua_State* L,TYPE *array,int size){\ int i;\ lua_newtable(L);\ for (i = 0; i < size; i++){\ lua_pushnumber(L,(lua_Number)array[i]);\ lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/ \ }\ } %} /* This is one giant macro to define the typemaps & the helpers for array handling */ %define SWIG_TYPEMAP_NUM_ARR(NAME,TYPE) %{SWIG_DECLARE_TYPEMAP_ARR_FN(NAME,TYPE)%} // fixed size array's %typemap(in) TYPE INPUT[ANY] %{ $1 = SWIG_get_##NAME##_num_array_fixed(L,$input,$1_dim0); if (!$1) SWIG_fail;%} %typemap(freearg) TYPE INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size array's %typemap(in) (TYPE *INPUT,int) %{ $1 = SWIG_get_##NAME##_num_array_var(L,$input,&$2); if (!$1) SWIG_fail;%} %typemap(freearg) (TYPE *INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) TYPE OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY(TYPE,$1_dim0); %} %typemap(argout) TYPE OUTPUT[ANY] %{ SWIG_write_##NAME##_num_array(L,$1,$1_dim0); SWIG_arg++; %} %typemap(freearg) TYPE OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) TYPE INOUT[ANY]=TYPE INPUT[ANY]; %typemap(argout) TYPE INOUT[ANY]=TYPE OUTPUT[ANY]; %typemap(freearg) TYPE INOUT[ANY]=TYPE INPUT[ANY]; // inout variable arrays %typemap(in) (TYPE *INOUT,int)=(TYPE *INPUT,int); %typemap(argout) (TYPE *INOUT,int) %{ SWIG_write_##NAME##_num_array(L,$1,$2); SWIG_arg++; %} %typemap(freearg) (TYPE *INOUT,int)=(TYPE *INPUT,int); // TODO out variable arrays (is there a standard form for such things?) // referencing so that (int *INPUT,int) and (int INPUT[],int) are the same %typemap(in) (TYPE INPUT[],int)=(TYPE *INPUT,int); %typemap(freearg) (TYPE INPUT[],int)=(TYPE *INPUT,int); %enddef // the following line of code // declares the C helper fns for the array typemaps // as well as defining typemaps for // fixed len arrays in & out, & variable length arrays in SWIG_TYPEMAP_NUM_ARR(schar,signed char); SWIG_TYPEMAP_NUM_ARR(uchar,unsigned char); SWIG_TYPEMAP_NUM_ARR(int,int); SWIG_TYPEMAP_NUM_ARR(uint,unsigned int); SWIG_TYPEMAP_NUM_ARR(short,short); SWIG_TYPEMAP_NUM_ARR(ushort,unsigned short); SWIG_TYPEMAP_NUM_ARR(long,long); SWIG_TYPEMAP_NUM_ARR(ulong,unsigned long); SWIG_TYPEMAP_NUM_ARR(float,float); SWIG_TYPEMAP_NUM_ARR(double,double); // again enums are a problem so they need their own type // we use the int conversion routine & recast it %typemap(in) enum SWIGTYPE INPUT[ANY] %{ $1 = ($ltype)SWIG_get_int_num_array_fixed(L,$input,$1_dim0); if (!$1) SWIG_fail;%} %typemap(freearg) enum SWIGTYPE INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size arrays %typemap(in) (enum SWIGTYPE *INPUT,int) %{ $1 = ($ltype)SWIG_get_int_num_array_var(L,$input,&$2); if (!$1) SWIG_fail;%} %typemap(freearg) (enum SWIGTYPE *INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) enum SWIGTYPE OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY(enum SWIGTYPE,$1_dim0); %} %typemap(argout) enum SWIGTYPE OUTPUT[ANY] %{ SWIG_write_int_num_array(L,(int*)$1,$1_dim0); SWIG_arg++; %} %typemap(freearg) enum SWIGTYPE OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE INPUT[ANY]; %typemap(argout) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE OUTPUT[ANY]; %typemap(freearg) enum SWIGTYPE INOUT[ANY]=enum SWIGTYPE INPUT[ANY]; // inout variable arrays %typemap(in) (enum SWIGTYPE *INOUT,int)=(enum SWIGTYPE *INPUT,int); %typemap(argout) (enum SWIGTYPE *INOUT,int) %{ SWIG_write_int_num_array(L,(int*)$1,$2); SWIG_arg++; %} %typemap(freearg) (enum SWIGTYPE *INOUT,int)=(enum SWIGTYPE *INPUT,int); /* Surprisingly pointer arrays are easier: this is because all ptr arrays become void** so only a few fns are needed & a few casts The function defined are // created a fixed size array, reads the specified table // and then fills the array with pointers (checking the type) // returns ptr to the array if ok, or 0 for error // (also pushes a error message to the stack) void** SWIG_get_ptr_array_fixed(lua_State* L, int index, int size,swig_type_info *type); // as per SWIG_get_ptr_array_fixed() // but reads the entire table & creates an array of the correct size // (if the table is empty, it returns an error rather than a zero length array) void** SWIG_get_ptr_array_var(lua_State* L, int index, int* size,swig_type_info *type); // writes a table to Lua with all the specified pointers // all pointers have the ownership value 'own' (normally 0) void SWIG_write_ptr_array(lua_State* L,void **array,int size,int own); // read the specified table, and fills the array with ptrs // returns 1 of ok (only fails if it doesn't find correct type of ptrs) // helper fn (called by SWIG_get_ptr_array_*() fns) int SWIG_read_ptr_array(lua_State* L,int index,void **array,int size,swig_type_info *type); The key thing to remember is that it is assumed that there is no modification of pointers ownership in the arrays eg A fn: void pointers_in(TYPE* arr[],int len); will make copies of the pointer into a temp array and then pass it into the fn Lua does not remember that this fn held the pointers, so it is not safe to keep these pointers until later eg A fn: void pointers_out(TYPE* arr[3]); will return a table containing three pointers however these pointers are NOT owned by Lua, merely borrowed so if the C/C++ frees then Lua is not aware */ %{ SWIGINTERN int SWIG_read_ptr_array(lua_State* L,int index,void **array,int size,swig_type_info *type){ int i; for (i = 0; i < size; i++) { lua_rawgeti(L,index,i+1); if (!lua_isuserdata(L,-1) || SWIG_ConvertPtr(L,-1,&array[i],type,0)==-1){ lua_pop(L,1); return 0; } lua_pop(L,1); } return 1; } SWIGINTERN void** SWIG_get_ptr_array_fixed(lua_State* L, int index, int size,swig_type_info *type){ void **array; if (!lua_istable(L,index) || SWIG_itable_size(L,index) != size) { SWIG_Lua_pushferrstring(L,"expected a table of size %d",size); return 0; } array=SWIG_ALLOC_ARRAY(void*,size); if (!SWIG_read_ptr_array(L,index,array,size,type)){ SWIG_Lua_pushferrstring(L,"table must contain pointers of type %s",type->name); SWIG_FREE_ARRAY(array); return 0; } return array; } SWIGINTERN void** SWIG_get_ptr_array_var(lua_State* L, int index, int* size,swig_type_info *type){ void **array; if (!lua_istable(L,index)) { SWIG_Lua_pusherrstring(L,"expected a table"); return 0; } *size=SWIG_itable_size(L,index); if (*size<1){ SWIG_Lua_pusherrstring(L,"table appears to be empty"); return 0; } array=SWIG_ALLOC_ARRAY(void*,*size); if (!SWIG_read_ptr_array(L,index,array,*size,type)){ SWIG_Lua_pushferrstring(L,"table must contain pointers of type %s",type->name); SWIG_FREE_ARRAY(array); return 0; } return array; } SWIGINTERN void SWIG_write_ptr_array(lua_State* L,void **array,int size,swig_type_info *type,int own){ int i; lua_newtable(L); for (i = 0; i < size; i++){ SWIG_NewPointerObj(L,array[i],type,own); lua_rawseti(L,-2,i+1);/* -1 is the number, -2 is the table*/ } } %} // fixed size array's %typemap(in) SWIGTYPE* INPUT[ANY] %{ $1 = ($ltype)SWIG_get_ptr_array_fixed(L,$input,$1_dim0,$*1_descriptor); if (!$1) SWIG_fail;%} %typemap(freearg) SWIGTYPE* INPUT[ANY] %{ SWIG_FREE_ARRAY($1);%} // variable size array's %typemap(in) (SWIGTYPE **INPUT,int) %{ $1 = ($ltype)SWIG_get_ptr_array_var(L,$input,&$2,$*1_descriptor); if (!$1) SWIG_fail;%} %typemap(freearg) (SWIGTYPE **INPUT,int) %{ SWIG_FREE_ARRAY($1);%} // out fixed arrays %typemap(in,numinputs=0) SWIGTYPE* OUTPUT[ANY] %{ $1 = SWIG_ALLOC_ARRAY($*1_type,$1_dim0); %} %typemap(argout) SWIGTYPE* OUTPUT[ANY] %{ SWIG_write_ptr_array(L,(void**)$1,$1_dim0,$*1_descriptor,0); SWIG_arg++; %} %typemap(freearg) SWIGTYPE* OUTPUT[ANY] %{ SWIG_FREE_ARRAY($1); %} // inout fixed arrays %typemap(in) SWIGTYPE* INOUT[ANY]=SWIGTYPE* INPUT[ANY]; %typemap(argout) SWIGTYPE* INOUT[ANY]=SWIGTYPE* OUTPUT[ANY]; %typemap(freearg) SWIGTYPE* INOUT[ANY]=SWIGTYPE* INPUT[ANY]; // inout variable arrays %typemap(in) (SWIGTYPE** INOUT,int)=(SWIGTYPE** INPUT,int); %typemap(argout) (SWIGTYPE** INOUT,int) %{ SWIG_write_ptr_array(L,(void**)$1,$2,$*1_descriptor,0); SWIG_arg++; %} %typemap(freearg) (SWIGTYPE**INOUT,int)=(SWIGTYPE**INPUT,int); /* ----------------------------------------------------------------------------- * Pointer-Pointer typemaps * ----------------------------------------------------------------------------- */ /* This code is to deal with the issue for pointer-pointer's In particular for factory methods. for example take the following code segment: struct iMath; // some structure int Create_Math(iMath** pptr); // its factory (assume it mallocs) to use it you might have the following C code: iMath* ptr; int ok; ok=Create_Math(&ptr); // do things with ptr //... free(ptr); With the following SWIG code %apply SWIGTYPE** OUTPUT{iMath **pptr }; You can get natural wrapping in Lua as follows: ok,ptr=Create_Math() -- ptr is a iMath* which is returned with the int ptr=nil -- the iMath* will be GC'ed as normal */ %typemap(in,numinputs=0) SWIGTYPE** OUTPUT ($*ltype temp) %{ temp = ($*ltype)0; $1 = &temp; %} %typemap(argout) SWIGTYPE** OUTPUT %{SWIG_NewPointerObj(L,*$1,$*descriptor,1); SWIG_arg++; %} swig-3.0.12/Lib/lua/carrays.i0000664000175000017500000000040013042756442015534 0ustar williamwilliam/* Small change to the standard carrays.i renaming the field to __getitem & __setitem for operator[] access */ %rename(__getitem) *::getitem; // the v=X[i] (get operator) %rename(__setitem) *::setitem; // the X[i]=v (set operator) %include <../carrays.i> swig-3.0.12/Lib/lua/_std_common.i0000664000175000017500000000477213042756442016411 0ustar williamwilliam/* ----------------------------------------------------------------------------- * _std_common.i * * std::helpers for LUA * ----------------------------------------------------------------------------- */ %include // the general exceptions /* The basic idea here, is instead of trying to feed SWIG all the horribly templated STL code, to give it a neatened version. These %defines cover some of the more common methods so the class declarations become just a set of %defines */ /* #define for basic container features note: I allow front(), back() & pop_back() to throw exceptions upon empty containers, rather than coredump (as we haven't defined the methods, we can use %extend to add with new features) */ %define %STD_CONTAINER_METHODS(CLASS,T) public: CLASS(); CLASS(const CLASS&); unsigned int size() const; unsigned int max_size() const; bool empty() const; void clear(); %extend { // the extra stuff which must be checked T front()const throw (std::out_of_range){ // only read front & back if (self->empty()) throw std::out_of_range("in "#CLASS"::front()"); return self->front(); } T back()const throw (std::out_of_range){ // not write to them if (self->empty()) throw std::out_of_range("in "#CLASS"::back()"); return self->back(); } } %enddef /* push/pop for front/back also note: front & back are read only methods, not used for writing */ %define %STD_FRONT_ACCESS_METHODS(CLASS,T) public: void push_front(const T& val); %extend { // must check this void pop_front() throw (std::out_of_range){ if (self->empty()) throw std::out_of_range("in "#CLASS"::pop_front()"); self->pop_back(); } } %enddef %define %STD_BACK_ACCESS_METHODS(CLASS,T) public: void push_back(const T& val); %extend { // must check this void pop_back() throw (std::out_of_range){ if (self->empty()) throw std::out_of_range("in "#CLASS"::pop_back()"); self->pop_back(); } } %enddef /* Random access methods */ %define %STD_RANDOM_ACCESS_METHODS(CLASS,T) %extend // this is a extra bit of SWIG code { // [] is replaced by __getitem__ & __setitem__ // simply throws a string, which causes a lua error T __getitem__(unsigned int idx) throw (std::out_of_range){ if (idx>=self->size()) throw std::out_of_range("in "#CLASS"::__getitem__()"); return (*self)[idx]; } void __setitem__(unsigned int idx,const T& val) throw (std::out_of_range){ if (idx>=self->size()) throw std::out_of_range("in "#CLASS"::__setitem__()"); (*self)[idx]=val; } }; %enddef swig-3.0.12/Lib/lua/std_pair.i0000664000175000017500000000140113042756442015677 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * std::pair typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} /* A really cut down version of the pair class. this is not useful on its own - it needs a %template definition with it eg. namespace std { %template(IntPair) pair; %template(make_IntPair) make_pair; } */ namespace std { template struct pair { typedef T first_type; typedef U second_type; pair(); pair(T first, U second); pair(const pair& p); T first; U second; }; template pair make_pair(const T&,const U&); } swig-3.0.12/Lib/lua/stl.i0000664000175000017500000000044313042756442014701 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/lua/lua.swg0000664000175000017500000002133213042756442015230 0ustar williamwilliam/* ----------------------------------------------------------------------------- * lua.swg * * SWIG Configuration File for Lua. * This file is parsed by SWIG before reading any other interface file. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * includes * ----------------------------------------------------------------------------- */ %include /* The typemaps */ %include /* The runtime stuff */ %include /* Warnings for Lua keywords */ //%include /* ----------------------------------------------------------------------------- * constants typemaps * ----------------------------------------------------------------------------- */ // this basically adds to a table of constants %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, bool, enum SWIGTYPE {SWIG_LUA_CONSTTAB_INT("$symname", $value)} %typemap(consttab) float, double {SWIG_LUA_CONSTTAB_FLOAT("$symname", $value)} %typemap(consttab) long long, unsigned long long, signed long long {SWIG_LUA_CONSTTAB_FLOAT("$symname", $value)} %typemap(consttab) const long long&, const unsigned long long&, const signed long long& {SWIG_LUA_CONSTTAB_FLOAT("$symname", *$value)} %typemap(consttab) char *, const char *, char [], const char [] {SWIG_LUA_CONSTTAB_STRING("$symname", $value)} // note: char is treated as a seperate special type // signed char & unsigned char are numbers %typemap(consttab) char {SWIG_LUA_CONSTTAB_CHAR("$symname", $value)} %typemap(consttab) long long, unsigned long long {SWIG_LUA_CONSTTAB_STRING("$symname", "$value")} %typemap(consttab) SWIGTYPE *, SWIGTYPE *const, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { SWIG_LUA_CONSTTAB_POINTER("$symname",$value, $1_descriptor) } %typemap(consttab) SWIGTYPE { SWIG_LUA_CONSTTAB_POINTER("$symname",&$value, $&1_descriptor) } // member function pointers %typemap(consttab) SWIGTYPE (CLASS::*) { SWIG_LUA_CONSTTAB_BINARY("$symname", sizeof($type),&$value, $1_descriptor) } /* ----------------------------------------------------------------------------- * Overloaded operator support * ----------------------------------------------------------------------------- */ // lua calls the + operator '__add' // python likes to call it '__add__' // Assuming most SWIGers will probably use the __add__ if they extend their classes // we have two sets of renames // one to rename the operator+() to __add() // (this lets SWIG rename the operator overloads) // another is to rename __add__() to __add() // (this means that people who wrote SWIG code to do that add will also work) #ifdef __cplusplus // this is extra renaming for lua // not all operators are supported, so only those that are, are listed %rename(__add) *::operator+; %rename(__sub) *::operator-; %rename(__mul) *::operator*; %rename(__div) *::operator/; %rename(__unm) *::operator-(); %rename(__unm) *::operator-() const; %rename(__eq) *::operator==; %ignore *::operator!=; // note: Lua does not have a notequal operator // it just uses 'not (a==b)' %rename(__lt) *::operator<; %ignore *::operator>; // ditto less than vs greater than %rename(__le) *::operator<=; %ignore *::operator>=; // ditto less than vs greater than %ignore *::operator!; // does not support not %rename(__call) *::operator(); // the fn call operator // lua does not support overloading of: // logical/bitwise operators // assign operator // +=,-=,*=, etc // therefore ignoring them for now // it also doesn't support non class operators // eg friends or XX operator+(XX,XX) // also ignoring // note: some of these might be better to rename, but not doing that for now %ignore *::operator&&; %ignore operator&&; %ignore *::operator||; %ignore operator||; %ignore *::operator+=; %ignore *::operator-=; %ignore *::operator*=; %ignore *::operator/=; %ignore *::operator%=; %ignore *::operator++; %ignore *::operator--; %ignore *::operator=; // note: this might be better to rename to assign() or similar %ignore operator+; %ignore operator-; %ignore operator*; %ignore operator/; %ignore operator%; %ignore operator[]; %ignore operator>; %ignore operator>=; %ignore operator<; %ignore operator<=; %ignore operator==; %ignore operator!=; // renaming the python operators to be compatible with lua // this means that if a developer has written a fn __add__() // it will be used for the lua + %rename(__add) *::__add__; %rename(__sub) *::__sub__; %rename(__mul) *::__mul__; %rename(__div) *::__div__; %rename(__unm) *::__neg__; // lua calls unary minus,'unm' not 'neg' %rename(__tostring) *::__str__; // both map to __tostring %rename(__tostring) *::__repr__; // both map to __tostring %rename(__pow) *::__pow__; // lua power '^' operator %rename(__concat) *::__concat__; // lua concat '..' operator %rename(__eq) *::__eq__; %rename(__lt) *::__lt__; %rename(__le) *::__le__; %rename(__call) *::__call__; // the fn call operator() // the [] operator has two parts, the get & the set %rename(__getitem) *::__getitem__; // the v=X[i] (get operator) %rename(__setitem) *::__setitem__; // the X[i]=v (set operator) #endif /* ------------------------------------------------------------ * Exceptions * ------------------------------------------------------------ */ /* Confession: I don't really like C++ exceptions The python/lua ones are great, but C++ ones I don't like (mainly because I cannot get the stack trace out of it) Therefore I have not bothered to try doing much in this Therefore currently its just enough to get a few test cases running ok note: if you wish to throw anything related to std::exception use %include instead */ // number as number+error %typemap(throws) int,unsigned int,signed int, long,unsigned long,signed long, short,unsigned short,signed short, float,double, long long,unsigned long long, unsigned char, signed char, int&,unsigned int&,signed int&, long&,unsigned long&,signed long&, short&,unsigned short&,signed short&, float&,double&, long long&,unsigned long long&, unsigned char&, signed char& %{lua_pushnumber(L,(lua_Number)$1);SWIG_fail; %} %typemap(throws) bool,bool& %{lua_pushboolean(L,(int)($1==true));SWIG_fail; %} // enum as number+error %typemap(throws) enum SWIGTYPE %{lua_pushnumber(L,(lua_Number)(int)$1);SWIG_fail; %} // strings are just sent as errors %typemap(throws) char *, const char * %{lua_pushstring(L,$1);SWIG_fail;%} // char is changed to a string %typemap(throws) char %{lua_pushlstring(L,&$1,1);SWIG_fail;%} /* Throwing object is a serious problem: Assuming some code throws a 'FooBar' There are a few options: - return a pointer to it: but its unclear how long this will last for. - return a copy of it: but not all objects are copyable (see exception_partial_info in the test suite for a case where you cannot do this) - convert to a string & throw that it's not so useful, but it works (this is more lua like). The third option (though not nice) is used For a more useful solution: see std_except for more details */ // basic typemap for structs, classes, pointers & references // convert to string and error %typemap(throws) SWIGTYPE %{(void)$1; /* ignore it */ lua_pushfstring(L,"object exception:%s",SWIG_TypePrettyName($1_descriptor)); SWIG_fail;%} // code to make a copy of the object and return this // if you have a function which throws a FooBar & you want SWIG to return a copy of the object as its error // then use one of the below // %apply SWIGTYPE EXCEPTION_BY_VAL {FooBar}; // %apply SWIGTYPE& EXCEPTION_BY_VAL {FooBar&}; // note: need & twice %typemap(throws) SWIGTYPE EXCEPTION_BY_VAL %{SWIG_NewPointerObj(L,(void *)new $1_ltype(($1_ltype &) $1),$&1_descriptor,1); SWIG_fail;%} // similar for object reference // note: swig typemaps seem a little confused around here, therefore we use $basetype %typemap(throws) SWIGTYPE& EXCEPTION_BY_VAL %{SWIG_NewPointerObj(L,(void *)new $basetype($1),$1_descriptor,1); SWIG_fail;%} // note: no support for object pointers // its not clear how long the pointer is valid for, therefore not supporting it /* ----------------------------------------------------------------------------- * extras * ----------------------------------------------------------------------------- */ // this %define is to allow insertion of lua source code into the wrapper file #define %luacode %insert("luacode") /* ------------------------------ end lua.swg ------------------------------ */ swig-3.0.12/Lib/lua/std_string.i0000664000175000017500000000632713042756442016266 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * std::string typemaps for LUA * ----------------------------------------------------------------------------- */ %{ #include %} /* Only std::string and const std::string& are typemapped they are converted to the Lua strings automatically std::string& and std::string* are not they must be explicitly managed (see below) eg. std::string test_value(std::string x) { return x; } can be used as s="hello world" s2=test_value(s) assert(s==s2) */ namespace std { %naturalvar string; /* Bug report #1526022: Lua strings and std::string can contain embedded zero bytes Therefore a standard out typemap should not be: lua_pushstring(L,$1.c_str()); but lua_pushlstring(L,$1.data(),$1.size()); Similarly for getting the string $1 = (char*)lua_tostring(L, $input); becomes $1.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); Not using: lua_tolstring() as this is only found in Lua 5.1 & not 5.0.2 */ %typemap(in,checkfn="lua_isstring") string %{$1.assign(lua_tostring(L,$input),lua_rawlen(L,$input));%} %typemap(out) string %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_arg++;%} %typemap(in,checkfn="lua_isstring") const string& ($*1_ltype temp) %{temp.assign(lua_tostring(L,$input),lua_rawlen(L,$input)); $1=&temp;%} %typemap(out) const string& %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} // for throwing of any kind of string, string ref's and string pointers // we convert all to lua strings %typemap(throws) string, string&, const string& %{ lua_pushlstring(L,$1.data(),$1.size()); SWIG_fail;%} %typemap(throws) string*, const string* %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_fail;%} %typecheck(SWIG_TYPECHECK_STRING) string, const string& { $1 = lua_isstring(L,$input); } /* std::string& can be wrapped, but you must inform SWIG if it is in or out eg: void fn(std::string& str); Is this an in/out/inout value? Therefore you need the usual %apply (std::string& INOUT) {std::string& str}; or %apply std::string& INOUT {std::string& str}; typemaps to tell SWIG what to do. */ %typemap(in) string &INPUT=const string &; %typemap(in, numinputs=0) string &OUTPUT ($*1_ltype temp) %{ $1 = &temp; %} %typemap(argout) string &OUTPUT %{ lua_pushlstring(L,$1->data(),$1->size()); SWIG_arg++;%} %typemap(in) string &INOUT =const string &; %typemap(argout) string &INOUT = string &OUTPUT; /* A really cut down version of the string class This provides basic mapping of lua strings <-> std::string and little else (the std::string has a lot of unneeded functions anyway) note: no fn's taking the const string& as this is overloaded by the const char* version */ class string { public: string(); string(const char*); //string(const string&); unsigned int size() const; unsigned int length() const; bool empty() const; // no support for operator[] const char* c_str()const; const char* data()const; // assign does not return a copy of this object // (no point in a scripting language) void assign(const char*); //void assign(const string&); // no support for all the other features // it's probably better to do it in lua }; } swig-3.0.12/Lib/lua/luatypemaps.swg0000664000175000017500000003365113042756442017022 0ustar williamwilliam/* ----------------------------------------------------------------------------- * luatypemaps.swg * * basic typemaps for Lua. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* NEW LANGUAGE NOTE: the 'checkfn' param is something that I added for typemap(in) it is an optional fn call to check the type of the lua object the fn call must be of the form int checkfn(lua_State *L, int index); and return 1/0 depending upon if this is the correct type For the typemap(out), an additional SWIG_arg parameter must be incremented to reflect the number of values returned (normally SWIG_arg++; will do) */ // numbers %typemap(in,checkfn="lua_isnumber") int, short, long, signed char, float, double %{$1 = ($type)lua_tonumber(L, $input);%} // additional check for unsigned numbers, to not permit negative input %typemap(in,checkfn="lua_isnumber") unsigned int, unsigned short, unsigned long, unsigned char %{SWIG_contract_assert((lua_tonumber(L,$input)>=0),"number must not be negative") $1 = ($type)lua_tonumber(L, $input);%} %typemap(out) int,short,long, unsigned int,unsigned short,unsigned long, signed char,unsigned char, float,double %{ lua_pushnumber(L, (lua_Number) $1); SWIG_arg++;%} // we must also provide typemaps for primitives by const reference: // given a function: // int intbyref(const int& i); // SWIG assumes that this code will need a pointer to int to be passed in // (this might be ok for objects by const ref, but not for numeric primitives) // therefore we add a set of typemaps to fix this (for both in & out) %typemap(in,checkfn="lua_isnumber") const int&($basetype temp) %{ temp=($basetype)lua_tonumber(L,$input); $1=&temp;%} %typemap(in,checkfn="lua_isnumber") const unsigned int&($basetype temp) %{SWIG_contract_assert((lua_tonumber(L,$input)>=0),"number must not be negative") temp=($basetype)lua_tonumber(L,$input); $1=&temp;%} %typemap(out) const int&, const unsigned int& %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} // for the other numbers we can just use an apply statement to cover them %apply const int & {const short&,const long&,const signed char&, const float&,const double&}; %apply const unsigned int & {const unsigned short&,const unsigned long&, const unsigned char&}; /* enums have to be handled slightly differently VC++ .net will not allow a cast from lua_Number(double) to enum directly. */ %typemap(in,checkfn="lua_isnumber") enum SWIGTYPE %{$1 = ($type)(int)lua_tonumber(L, $input);%} %typemap(out) enum SWIGTYPE %{ lua_pushnumber(L, (lua_Number)(int)($1)); SWIG_arg++;%} // and const refs %typemap(in,checkfn="lua_isnumber") const enum SWIGTYPE &($basetype temp) %{ temp=($basetype)(int)lua_tonumber(L,$input); $1=&temp;%} %typemap(in,checkfn="lua_isnumber") const enum SWIGTYPE &&($basetype temp) %{ temp=($basetype)(int)lua_tonumber(L,$input); $1=&temp;%} %typemap(out) const enum SWIGTYPE & %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} %typemap(out) const enum SWIGTYPE && %{ lua_pushnumber(L, (lua_Number) *$1); SWIG_arg++;%} // boolean (which is a special type in lua) // note: lua_toboolean() returns 1 or 0 // note: 1 & 0 are not booleans in lua, only true & false %typemap(in,checkfn="lua_isboolean") bool %{$1 = (lua_toboolean(L, $input)!=0);%} %typemap(out) bool %{ lua_pushboolean(L,(int)($1!=0)); SWIG_arg++;%} // for const bool&, SWIG treats this as a const bool* so we must dereference it %typemap(in,checkfn="lua_isboolean") const bool& (bool temp) %{temp=(lua_toboolean(L, $input)!=0); $1=&temp;%} %typemap(out) const bool& %{ lua_pushboolean(L,(int)((*$1)!=0)); SWIG_arg++;%} // strings (char * and char[]) %fragment("SWIG_lua_isnilstring", "header") { SWIGINTERN int SWIG_lua_isnilstring(lua_State *L, int idx) { int ret = lua_isstring(L, idx); if (!ret) ret = lua_isnil(L, idx); return ret; } } %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char *, char * %{$1 = ($ltype)lua_tostring(L, $input);%} %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char[ANY], char[ANY] %{$1 = ($ltype)lua_tostring(L, $input);%} %typemap(out) const char *, char * %{ lua_pushstring(L,(const char *)$1); SWIG_arg++;%} %typemap(out) const char[ANY], char[ANY] %{ lua_pushstring(L,(const char *)$1); SWIG_arg++;%} // char's // currently treating chars as small strings, not as numbers // (however signed & unsigned char's are numbers...) %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") char %{$1 = (lua_tostring(L, $input))[0];%} %typemap(out) char %{ lua_pushlstring(L, &$1, 1); SWIG_arg++;%} // by const ref %typemap(in,checkfn="SWIG_lua_isnilstring",fragment="SWIG_lua_isnilstring") const char& (char temp) %{temp = (lua_tostring(L, $input))[0]; $1=&temp;%} %typemap(out) const char& %{ lua_pushlstring(L, $1, 1); SWIG_arg++;%} // pointers and references // under SWIG rules, it is ok, to have a pass in a lua nil, // it should be converted to a SWIG NULL. // This will only be allowed for pointers & arrays, not refs or by value // the checkfn lua_isuserdata will only work for userdata // the checkfn SWIG_isptrtype will work for both userdata and nil %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE*,SWIGTYPE[] %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} %typemap(in,checkfn="lua_isuserdata") SWIGTYPE& %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} %typemap(in,checkfn="lua_isuserdata") SWIGTYPE&& %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,$disown))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} // out is simple %typemap(out) SWIGTYPE*,SWIGTYPE& %{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %} %typemap(out) SWIGTYPE*,SWIGTYPE&& %{SWIG_NewPointerObj(L,$1,$descriptor,$owner); SWIG_arg++; %} // dynamic casts // this uses the SWIG_TypeDynamicCast() which relies on RTTI to find out what the pointer really is // the we return it as the correct type %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); SWIG_NewPointerObj(L,(void*)$1,ty,$owner); SWIG_arg++; } // passing objects by value // SWIG_ConvertPtr wants an object pointer (the $<ype argp) // then dereferences it to get the object %typemap(in,checkfn="lua_isuserdata") SWIGTYPE ($<ype argp) %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&argp,$&descriptor,0))){ SWIG_fail_ptr("$symname",$argnum,$&descriptor); } $1 = *argp; %} // Also needed for object ptrs by const ref // eg A* const& ref_pointer(A* const& a); // found in mixed_types.i %typemap(in,checkfn="lua_isuserdata") SWIGTYPE *const&($*ltype temp) %{temp=($*ltype)SWIG_MustGetPtr(L,$input,$*descriptor,0,$argnum,"$symname"); $1=($1_ltype)&temp;%} %typemap(out) SWIGTYPE *const& %{SWIG_NewPointerObj(L,*$1,$*descriptor,$owner); SWIG_arg++; %} // DISOWN-ing typemaps // if you have an object pointer which must be disowned, use this typemap // eg. for void destroy_foo(Foo* toDie); // use %apply SWIGTYPE* DISOWN {Foo* toDie}; // you could just use %delobject, but this is more flexible %typemap(in,checkfn="SWIG_isptrtype") SWIGTYPE* DISOWN,SWIGTYPE DISOWN[] %{ if (!SWIG_IsOK(SWIG_ConvertPtr(L,$input,(void**)&$1,$descriptor,SWIG_POINTER_DISOWN))){ SWIG_fail_ptr("$symname",$argnum,$descriptor); } %} // Primitive types--return by value // must make a new object, copy the data & return the new object // Note: the brackets are {...} and not %{..%}, because we want them to be included in the wrapper // this is because typemap(out) does not support local variables, like in typemap(in) does // and we need the $&1_ltype resultptr; to be declared #ifdef __cplusplus %typemap(out) SWIGTYPE { $&1_ltype resultptr = new $1_ltype((const $1_ltype &) $1); SWIG_NewPointerObj(L,(void *) resultptr,$&1_descriptor,1); SWIG_arg++; } #else %typemap(out) SWIGTYPE { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); SWIG_NewPointerObj(L,(void *) resultptr,$&1_descriptor,1); SWIG_arg++; } #endif // member function pointer // a member fn ptr is not 4 bytes like a normal pointer, but 8 bytes (at least on mingw) // so the standard wrapping cannot be done // nor can you cast a member function pointer to a void* (obviously) // therefore a special wrapping functions SWIG_ConvertMember() & SWIG_NewMemberObj() were written #ifdef __cplusplus %typemap(in,checkfn="lua_isuserdata") SWIGTYPE (CLASS::*) %{ if (!SWIG_IsOK(SWIG_ConvertMember(L,$input,(void*)(&$1),sizeof($type),$descriptor))) SWIG_fail_ptr("$symname",$argnum,$descriptor); %} %typemap(out) SWIGTYPE (CLASS::*) %{ SWIG_NewMemberObj(L,(void*)(&$1),sizeof($type),$descriptor); SWIG_arg++; %} #endif // void (must be empty without the SWIG_arg++) %typemap(out) void ""; /* void* is a special case A function void fn(void*) should take any kind of pointer as a parameter (just like C/C++ does) but if its an output, then it should be wrapped like any other SWIG object (using default typemap) */ %typemap(in,checkfn="SWIG_isptrtype") void* %{$1=($1_ltype)SWIG_MustGetPtr(L,$input,0,0,$argnum,"$symname");%} /* long long is another special case: as lua only supports one numeric type (lua_Number), we will just cast it to that & accept the loss of precision. An alternative solution would be a long long struct or class with the relevant operators. */ %apply long {long long, signed long long, unsigned long long}; %apply const long& {const long long&, const signed long long&, const unsigned long long&}; /* It is possible to also pass a lua_State* into a function, so void fn(int a, float b, lua_State* s) is wrappable as > fn(1,4.3) -- note: the state is implicitly passed in */ %typemap(in, numinputs=0) lua_State* %{$1 = L;%} /* ----------------------------------------------------------------------------- * typecheck rules * ----------------------------------------------------------------------------- */ /* These are needed for the overloaded functions These define the detection routines which will spot what parameters match which function */ // unfortunately lua only considers one type of number // so all numbers (int,float,double) match // you could add an advanced fn to get type & check if its integral %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, signed long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const signed char&, const unsigned char&, const long long &, const unsigned long long &, enum SWIGTYPE, const enum SWIGTYPE&, const enum SWIGTYPE &&, float, double, const float &, const double& { $1 = lua_isnumber(L,$input); } %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & { $1 = lua_isboolean(L,$input); } // special check for a char (string of length 1) %typecheck(SWIG_TYPECHECK_CHAR,fragment="SWIG_lua_isnilstring") char, const char& { $1 = SWIG_lua_isnilstring(L,$input) && (lua_rawlen(L,$input)==1); } %typecheck(SWIG_TYPECHECK_STRING,fragment="SWIG_lua_isnilstring") char *, char[] { $1 = SWIG_lua_isnilstring(L,$input); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [] { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE && { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $&1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_isptrtype(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, 0, 0)) { $1 = 0; } else { $1 = 1; } } // Also needed for object pointers by const ref // eg const A* ref_pointer(A* const& a); // found in mixed_types.i %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *const& { void *ptr; if (lua_isuserdata(L,$input)==0 || SWIG_ConvertPtr(L,$input, (void **) &ptr, $*descriptor, 0)) { $1 = 0; } else { $1 = 1; } } /* ----------------------------------------------------------------------------- * Others * ----------------------------------------------------------------------------- */ // Array reference typemaps %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } // size_t (which is just a unsigned long) %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* ----------------------------------------------------------------------------- * Specials * ----------------------------------------------------------------------------- */ // swig::LANGUAGE_OBJ was added to allow containers of native objects // however its rather difficult to do this in lua, as you cannot hold pointers // to native objects (they are held in the interpreter) // therefore for now: just ignoring this feature #ifdef __cplusplus %ignore swig::LANGUAGE_OBJ; //%inline %{ %{ namespace swig { typedef struct{} LANGUAGE_OBJ; } %} #endif // __cplusplus swig-3.0.12/Lib/lua/std_map.i0000664000175000017500000000333213042756442015526 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; } swig-3.0.12/Lib/lua/factory.i0000664000175000017500000000100713042756442015543 0ustar williamwilliam/* A modification of factory.swg from the generic UTL library. */ %include %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; SWIG_NewPointerObj(L, dobj, $descriptor(Type *), $owner); SWIG_arg++; } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { SWIG_NewPointerObj(L, $1, $descriptor, $owner); SWIG_arg++; } }%enddef swig-3.0.12/Lib/csharp/0000775000175000017500000000000013042756442014423 5ustar williamwilliamswig-3.0.12/Lib/csharp/std_deque.i0000664000175000017500000000003413042756442016547 0ustar williamwilliam%include swig-3.0.12/Lib/csharp/director.swg0000664000175000017500000000222113042756442016755 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that C# proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) #include #endif #include #include namespace Swig { /* Director base class - not currently used in C# directors */ class Director { }; /* Base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const char *msg) : swig_msg(msg) { } DirectorException(const std::string &msg) : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; /* Pure virtual method exception */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(std::string("Attempt to invoke pure virtual method ") + msg) { } }; } swig-3.0.12/Lib/csharp/wchar.i0000664000175000017500000000651113042756442015704 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wchar.i * * Typemaps for the wchar_t type * These are mapped to a C# String and are passed around by value. * * Support code for wide strings can be turned off by defining SWIG_CSHARP_NO_WSTRING_HELPER * * ----------------------------------------------------------------------------- */ #if !defined(SWIG_CSHARP_NO_WSTRING_HELPER) #if !defined(SWIG_CSHARP_WSTRING_HELPER_) #define SWIG_CSHARP_WSTRING_HELPER_ %insert(runtime) %{ /* Callback for returning strings to C# without leaking memory */ typedef void * (SWIGSTDCALL* SWIG_CSharpWStringHelperCallback)(const wchar_t *); static SWIG_CSharpWStringHelperCallback SWIG_csharp_wstring_callback = NULL; %} %pragma(csharp) imclasscode=%{ protected class SWIGWStringHelper { public delegate string SWIGWStringDelegate(global::System.IntPtr message); static SWIGWStringDelegate wstringDelegate = new SWIGWStringDelegate(CreateWString); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterWStringCallback_$module")] public static extern void SWIGRegisterWStringCallback_$module(SWIGWStringDelegate wstringDelegate); static string CreateWString([global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]global::System.IntPtr cString) { return global::System.Runtime.InteropServices.Marshal.PtrToStringUni(cString); } static SWIGWStringHelper() { SWIGRegisterWStringCallback_$module(wstringDelegate); } } static protected SWIGWStringHelper swigWStringHelper = new SWIGWStringHelper(); %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterWStringCallback_$module(SWIG_CSharpWStringHelperCallback callback) { SWIG_csharp_wstring_callback = callback; } %} #endif // SWIG_CSHARP_WSTRING_HELPER_ #endif // SWIG_CSHARP_NO_WSTRING_HELPER // wchar_t %typemap(ctype) wchar_t "wchar_t" %typemap(imtype) wchar_t "char" %typemap(cstype) wchar_t "char" %typemap(csin) wchar_t "$csinput" %typemap(csout, excode=SWIGEXCODE) wchar_t { char ret = $imcall;$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) wchar_t %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) wchar_t %{ get { char ret = $imcall;$excode return ret; } %} %typemap(in) wchar_t %{ $1 = ($1_ltype)$input; %} %typemap(out) wchar_t %{ $result = (wchar_t)$1; %} %typemap(typecheck) wchar_t = char; // wchar_t * %typemap(ctype) wchar_t * "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]", out="global::System.IntPtr" ) wchar_t * "string" %typemap(cstype) wchar_t * "string" %typemap(csin) wchar_t * "$csinput" %typemap(csout, excode=SWIGEXCODE) wchar_t * { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringUni($imcall);$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) wchar_t * %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) wchar_t * %{ get { string ret = $imcall;$excode return ret; } %} %typemap(in) wchar_t * %{ $1 = ($1_ltype)$input; %} %typemap(out) wchar_t * %{ $result = (wchar_t *)$1; %} %typemap(typecheck) wchar_t * = char *; swig-3.0.12/Lib/csharp/std_shared_ptr.i0000664000175000017500000000010413042756442017575 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-3.0.12/Lib/csharp/std_vector.i0000664000175000017500000003417213042756442016760 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.List<> collection. * * Note that IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::vector wrappers. The IList<> interface is also implemented to provide enhanced functionality * whenever we are confident that the required C++ operator== is available. This is the case for when * T is a primitive type or a pointer. If T does define an operator==, then use the SWIG_STD_VECTOR_ENHANCED * macro to obtain this enhanced functionality, for example: * * SWIG_STD_VECTOR_ENHANCED(SomeNamespace::Klass) * %template(VectKlass) std::vector; * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on the real file contents! * ----------------------------------------------------------------------------- */ // Warning: Use the typemaps here in the expectation that the macros they are in will change name. %include // MACRO for use within the std::vector class body %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CSINTERFACE, CONST_REFERENCE, CTYPE...) %typemap(csinterfaces) std::vector< CTYPE > "global::System.IDisposable, global::System.Collections.IEnumerable\n , global::System.Collections.Generic.CSINTERFACE<$typemap(cstype, CTYPE)>\n"; %proxycode %{ public $csclassname(global::System.Collections.ICollection c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); foreach ($typemap(cstype, CTYPE) element in c) { this.Add(element); } } public bool IsFixedSize { get { return false; } } public bool IsReadOnly { get { return false; } } public $typemap(cstype, CTYPE) this[int index] { get { return getitem(index); } set { setitem(index, value); } } public int Capacity { get { return (int)capacity(); } set { if (value < size()) throw new global::System.ArgumentOutOfRangeException("Capacity"); reserve((uint)value); } } public int Count { get { return (int)size(); } } public bool IsSynchronized { get { return false; } } public void CopyTo($typemap(cstype, CTYPE)[] array) { CopyTo(0, array, 0, this.Count); } public void CopyTo($typemap(cstype, CTYPE)[] array, int arrayIndex) { CopyTo(0, array, arrayIndex, this.Count); } public void CopyTo(int index, $typemap(cstype, CTYPE)[] array, int arrayIndex, int count) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (count < 0) throw new global::System.ArgumentOutOfRangeException("count", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (index+count > this.Count || arrayIndex+count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); for (int i=0; i global::System.Collections.Generic.IEnumerable<$typemap(cstype, CTYPE)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator , global::System.Collections.Generic.IEnumerator<$typemap(cstype, CTYPE)> { private $csclassname collectionRef; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, CTYPE) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, CTYPE))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = collectionRef[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef CTYPE value_type; typedef CONST_REFERENCE const_reference; %rename(Clear) clear; void clear(); %rename(Add) push_back; void push_back(CTYPE const& x); size_type size() const; size_type capacity() const; void reserve(size_type n); %newobject GetRange(int index, int count); %newobject Repeat(CTYPE const& value, int count); vector(); vector(const vector &other); %extend { vector(int capacity) throw (std::out_of_range) { std::vector< CTYPE >* pv = 0; if (capacity >= 0) { pv = new std::vector< CTYPE >(); pv->reserve(capacity); } else { throw std::out_of_range("capacity"); } return pv; } CTYPE getitemcopy(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } CONST_REFERENCE getitem(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } void setitem(int index, CTYPE const& val) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) (*$self)[index] = val; else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.AddRange void AddRange(const std::vector< CTYPE >& values) { $self->insert($self->end(), values.begin(), values.end()); } // Takes a deep copy of the elements unlike ArrayList.GetRange std::vector< CTYPE > *GetRange(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); return new std::vector< CTYPE >($self->begin()+index, $self->begin()+index+count); } void Insert(int index, CTYPE const& x) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()+1) $self->insert($self->begin()+index, x); else throw std::out_of_range("index"); } // Takes a deep copy of the elements unlike ArrayList.InsertRange void InsertRange(int index, const std::vector< CTYPE >& values) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()+1) $self->insert($self->begin()+index, values.begin(), values.end()); else throw std::out_of_range("index"); } void RemoveAt(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) $self->erase($self->begin() + index); else throw std::out_of_range("index"); } void RemoveRange(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); $self->erase($self->begin()+index, $self->begin()+index+count); } static std::vector< CTYPE > *Repeat(CTYPE const& value, int count) throw (std::out_of_range) { if (count < 0) throw std::out_of_range("count"); return new std::vector< CTYPE >(count, value); } void Reverse() { std::reverse($self->begin(), $self->end()); } void Reverse(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); std::reverse($self->begin()+index, $self->begin()+index+count); } // Takes a deep copy of the elements unlike ArrayList.SetRange void SetRange(int index, const std::vector< CTYPE >& values) throw (std::out_of_range) { if (index < 0) throw std::out_of_range("index"); if (index+values.size() > $self->size()) throw std::out_of_range("index"); std::copy(values.begin(), values.end(), $self->begin()+index); } } %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement IList<>, which adds extra functionality %define SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { bool Contains(CTYPE const& value) { return std::find($self->begin(), $self->end(), value) != $self->end(); } int IndexOf(CTYPE const& value) { int index = -1; std::vector< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) index = (int)(it - $self->begin()); return index; } int LastIndexOf(CTYPE const& value) { int index = -1; std::vector< CTYPE >::reverse_iterator rit = std::find($self->rbegin(), $self->rend(), value); if (rit != $self->rend()) index = (int)($self->rend() - 1 - rit); return index; } bool Remove(CTYPE const& value) { std::vector< CTYPE >::iterator it = std::find($self->begin(), $self->end(), value); if (it != $self->end()) { $self->erase(it); return true; } return false; } } %enddef // Macros for std::vector class specializations/enhancements %define SWIG_STD_VECTOR_ENHANCED(CTYPE...) namespace std { template<> class vector< CTYPE > { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, %arg(CTYPE const&), %arg(CTYPE)) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef // Legacy macros %define SWIG_STD_VECTOR_SPECIALIZE(CSTYPE, CTYPE...) #warning SWIG_STD_VECTOR_SPECIALIZE macro deprecated, please see csharp/std_vector.i and switch to SWIG_STD_VECTOR_ENHANCED SWIG_STD_VECTOR_ENHANCED(CTYPE) %enddef %define SWIG_STD_VECTOR_SPECIALIZE_MINIMUM(CSTYPE, CTYPE...) #warning SWIG_STD_VECTOR_SPECIALIZE_MINIMUM macro deprecated, it is no longer required %enddef %{ #include #include #include %} %csmethodmodifiers std::vector::getitemcopy "private" %csmethodmodifiers std::vector::getitem "private" %csmethodmodifiers std::vector::setitem "private" %csmethodmodifiers std::vector::size "private" %csmethodmodifiers std::vector::capacity "private" %csmethodmodifiers std::vector::reserve "private" namespace std { // primary (unspecialized) class template for std::vector // does not require operator== to be defined template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IEnumerable, T const&, T) }; // specialization for pointers template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, T *const&, T *) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(T *) }; // bool is specialized in the C++ standard - const_reference in particular template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(IList, bool, bool) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(bool) }; } // template specializations for std::vector // these provide extra collections methods as operator== is defined SWIG_STD_VECTOR_ENHANCED(char) SWIG_STD_VECTOR_ENHANCED(signed char) SWIG_STD_VECTOR_ENHANCED(unsigned char) SWIG_STD_VECTOR_ENHANCED(short) SWIG_STD_VECTOR_ENHANCED(unsigned short) SWIG_STD_VECTOR_ENHANCED(int) SWIG_STD_VECTOR_ENHANCED(unsigned int) SWIG_STD_VECTOR_ENHANCED(long) SWIG_STD_VECTOR_ENHANCED(unsigned long) SWIG_STD_VECTOR_ENHANCED(long long) SWIG_STD_VECTOR_ENHANCED(unsigned long long) SWIG_STD_VECTOR_ENHANCED(float) SWIG_STD_VECTOR_ENHANCED(double) SWIG_STD_VECTOR_ENHANCED(std::string) // also requires a %include SWIG_STD_VECTOR_ENHANCED(std::wstring) // also requires a %include swig-3.0.12/Lib/csharp/csharpkw.swg0000664000175000017500000000350213042756442016767 0ustar williamwilliam#ifndef CSHARP_CSHARPKW_SWG_ #define CSHARP_CSHARPKW_SWG_ /* Warnings for C# keywords */ #define CSHARPKW(x) %keywordwarn("'" `x` "' is a C# keyword, renaming to '" `x` "_'",rename="%s_") `x` #define CSHARPCLASSKW(x) %keywordwarn("'" `x` "' is a special method name used in the C# wrapper classes, class renamed to '" `x` "_'",%$isclass,rename="%s_") `x` /* from http://www.jaggersoft.com/csharp_grammar.html#1.7%20Keywords */ CSHARPKW(abstract); CSHARPKW(as); CSHARPKW(base); CSHARPKW(bool); CSHARPKW(break); CSHARPKW(byte); CSHARPKW(case); CSHARPKW(catch); CSHARPKW(char); CSHARPKW(checked); CSHARPKW(class); CSHARPKW(const); CSHARPKW(continue); CSHARPKW(decimal); CSHARPKW(default); CSHARPKW(delegate); CSHARPKW(do); CSHARPKW(double); CSHARPKW(else); CSHARPKW(enum); CSHARPKW(event); CSHARPKW(explicit); CSHARPKW(extern); CSHARPKW(false); CSHARPKW(finally); CSHARPKW(fixed); CSHARPKW(float); CSHARPKW(for); CSHARPKW(foreach); CSHARPKW(goto); CSHARPKW(if); CSHARPKW(implicit); CSHARPKW(in); CSHARPKW(int); CSHARPKW(interface); CSHARPKW(internal); CSHARPKW(is); CSHARPKW(lock); CSHARPKW(long); CSHARPKW(namespace); CSHARPKW(new); CSHARPKW(null); CSHARPKW(object); CSHARPKW(operator); CSHARPKW(out); CSHARPKW(override); CSHARPKW(params); CSHARPKW(private); CSHARPKW(protected); CSHARPKW(public); CSHARPKW(readonly); CSHARPKW(ref); CSHARPKW(return); CSHARPKW(sbyte); CSHARPKW(sealed); CSHARPKW(short); CSHARPKW(sizeof); CSHARPKW(stackalloc); CSHARPKW(static); CSHARPKW(struct); CSHARPKW(string); CSHARPKW(switch); CSHARPKW(this); CSHARPKW(throw); CSHARPKW(true); CSHARPKW(try); CSHARPKW(typeof); CSHARPKW(uint); CSHARPKW(ulong); CSHARPKW(unchecked); CSHARPKW(unsafe); CSHARPKW(ushort); CSHARPKW(using); CSHARPKW(virtual); CSHARPKW(void); CSHARPKW(volatile); CSHARPKW(while); CSHARPCLASSKW(delete); #undef CSHARPKW #endif //CSHARP_CSHARPKW_SWG_ swig-3.0.12/Lib/csharp/std_wstring.i0000664000175000017500000000707613042756442017156 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_wstring.i * * Typemaps for std::wstring and const std::wstring& * These are mapped to a C# String and are passed around by value. * * To use non-const std::wstring references use the following %apply. Note * that they are passed by value. * %apply const std::wstring & {std::wstring &}; * ----------------------------------------------------------------------------- */ %include %{ #include %} namespace std { %naturalvar wstring; class wstring; // wstring %typemap(ctype, out="void *") wstring "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]") wstring "string" %typemap(cstype) wstring "string" %typemap(csdirectorin) wstring "$iminput" %typemap(csdirectorout) wstring "$cscall" %typemap(in, canthrow=1) wstring %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } $1.assign($input); %} %typemap(out) wstring %{ $result = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(directorout, canthrow=1) wstring %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } $result.assign($input); %} %typemap(directorin) wstring %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(csin) wstring "$csinput" %typemap(csout, excode=SWIGEXCODE) wstring { string ret = $imcall;$excode return ret; } %typemap(typecheck) wstring = wchar_t *; %typemap(throws, canthrow=1) wstring %{ std::string message($1.begin(), $1.end()); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, message.c_str()); return $null; %} // const wstring & %typemap(ctype, out="void *") const wstring & "wchar_t *" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPWStr)]") const wstring & "string" %typemap(cstype) const wstring & "string" %typemap(csdirectorin) const wstring & "$iminput" %typemap(csdirectorout) const wstring & "$cscall" %typemap(in, canthrow=1) const wstring & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } std::wstring $1_str($input); $1 = &$1_str; %} %typemap(out) const wstring & %{ $result = SWIG_csharp_wstring_callback($1->c_str()); %} %typemap(csin) const wstring & "$csinput" %typemap(csout, excode=SWIGEXCODE) const wstring & { string ret = $imcall;$excode return ret; } %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const wstring & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null wstring", 0); return $null; } /* possible thread/reentrant code problem */ static std::wstring $1_str; $1_str = $input; $result = &$1_str; %} %typemap(directorin) const wstring & %{ $input = SWIG_csharp_wstring_callback($1.c_str()); %} %typemap(csvarin, excode=SWIGEXCODE2) const wstring & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const wstring & %{ get { string ret = $imcall;$excode return ret; } %} %typemap(typecheck) const wstring & = wchar_t *; %typemap(throws, canthrow=1) const wstring & %{ std::string message($1.begin(), $1.end()); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, message.c_str()); return $null; %} } swig-3.0.12/Lib/csharp/boost_intrusive_ptr.i0000664000175000017500000005626413042756442020735 0ustar williamwilliam// Users can provide their own SWIG_INTRUSIVE_PTR_TYPEMAPS or SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP macros before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS #define SWIG_INTRUSIVE_PTR_TYPEMAPS(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP #define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE "(void)arg1; delete smartarg1;" // Typemap customisations... %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ // plain value argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out, fragment="SWIG_intrusive_deleter") CONST TYPE %{ //plain value(out) $1_ltype* resultp = new $1_ltype(($1_ltype &)$1); intrusive_ptr_add_ref(resultp); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(resultp, SWIG_intrusive_deleter< CONST TYPE >()); %} %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE * %{ //plain pointer(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in, canthrow=1) CONST TYPE & %{ // plain reference $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if(!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE & %{ //plain reference(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ // plain pointer by reference temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") TYPE *CONST& %{ // plain pointer by reference(out) #if ($owner) if (*$1) { intrusive_ptr_add_ref(*$1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_0); #endif %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by value smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if (smartarg) { $1 = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ if ($1) { intrusive_ptr_add_ref($1.get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1.get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by reference if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ delete &($1); if ($self) { SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * temp = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); $1 = *temp; } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ if (*$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ delete $1; if ($self) $1 = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ if ($1 && *$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } if ($owner) delete $1; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& (SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > temp, $*1_ltype tempp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer reference smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if ($input) { temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } tempp = &temp; $1 = &tempp; %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if ($self) $1 = *$input; %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if (*$1 && **$1) { intrusive_ptr_add_ref((*$1)->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >((*$1)->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "void *" %typemap (imtype, out="global::System.IntPtr") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "global::System.Runtime.InteropServices.HandleRef" %typemap (cstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(cstype, TYPE)" %typemap(csin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >& %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >* %{ get { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %} %typemap(csout, excode=SWIGEXCODE) CONST TYPE { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } // Base proxy classes %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdestruct, methodname="Dispose", methodmodifiers="public") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); } } %typemap(csdestruct_derived, methodname="Dispose", methodmodifiers="public") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); base.Dispose(); } } // CONST version needed ???? also for C# %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %template() SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; %enddef ///////////////////////////////////////////////////////////////////// %include %define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE "(void)arg1; delete smartarg1;" // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "void *" %typemap (imtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "void *" %typemap (cstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE)" %typemap (csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE { return new $typemap(cstype, TYPE)($imcall, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { return new $typemap(cstype, TYPE)($imcall, true); } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; return (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdestruct, methodname="Dispose", methodmodifiers="public") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); } } %typemap(csdestruct_derived, methodname="Dispose", methodmodifiers="public") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); base.Dispose(); } } // CONST version needed ???? also for C# %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %typemap(imtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "global::System.Runtime.InteropServices.HandleRef" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/csharp/std_common.i0000664000175000017500000000014613042756442016740 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-3.0.12/Lib/csharp/std_except.i0000664000175000017500000000436113042756442016743 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. These typemaps are * used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws, canthrow=1) std::bad_cast "SWIG_CSharpSetPendingException(SWIG_CSharpInvalidCastException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::bad_exception "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::domain_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::exception "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::invalid_argument "SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentException, $1.what(), \"\");\n return $null;" %typemap(throws, canthrow=1) std::length_error "SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::logic_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::out_of_range "SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, 0, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::overflow_error "SWIG_CSharpSetPendingException(SWIG_CSharpOverflowException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::range_error "SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::runtime_error "SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::underflow_error "SWIG_CSharpSetPendingException(SWIG_CSharpOverflowException, $1.what());\n return $null;" swig-3.0.12/Lib/csharp/enumtypesafe.swg0000664000175000017500000001127613042756442017661 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypesafe.swg * * Include this file in order for C/C++ enums to be wrapped by the so called * typesafe enum pattern. Each enum has an equivalent C# class named after the * enum and each enum item is a static instance of this class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "$*csclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "$*csclassname.swigToEnum($iminput)" %typemap(csdirectorout) const enum SWIGTYPE & "$cscall.swigValue" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "$csinput.swigValue" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*csclassname ret = $*csclassname.swigToEnum($imcall);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { $*csclassname ret = $*csclassname.swigToEnum($imcall);$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "$csclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "$csclassname.swigToEnum($iminput)" %typemap(csdirectorout) enum SWIGTYPE "$cscall.swigValue" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "$csinput.swigValue" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { $csclassname ret = $csclassname.swigToEnum($imcall);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { $csclassname ret = $csclassname.swigToEnum($imcall);$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "public sealed class" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" /* * The swigToEnum method is used to find the C# enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. * The special variable, $enumvalues, is replaced with a comma separated list of all the enum values. */ %typemap(csbody) enum SWIGTYPE %{ public readonly int swigValue; public static $csclassname swigToEnum(int swigValue) { if (swigValue < swigValues.Length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for (int i = 0; i < swigValues.Length; i++) if (swigValues[i].swigValue == swigValue) return swigValues[i]; throw new global::System.ArgumentOutOfRangeException("No enum $csclassname with value " + swigValue); } public override string ToString() { return swigName; } private $csclassname(string swigName) { this.swigName = swigName; this.swigValue = swigNext++; } private $csclassname(string swigName, int swigValue) { this.swigName = swigName; this.swigValue = swigValue; swigNext = swigValue+1; } private $csclassname(string swigName, $csclassname swigEnum) { this.swigName = swigName; this.swigValue = swigEnum.swigValue; swigNext = this.swigValue+1; } private static $csclassname[] swigValues = { $enumvalues }; private static int swigNext = 0; private readonly string swigName; %} %csenum(typesafe); swig-3.0.12/Lib/csharp/typemaps.i0000664000175000017500000002472313042756442016447 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps are used for pointer/reference parameters that are input only and are mapped to a C# input parameter. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In C# you could then use it like this: double answer = modulename.fadd(10.0, 20.0); */ %define INPUT_TYPEMAP(TYPE, CTYPE, CSTYPE) %typemap(ctype, out="void *") TYPE *INPUT, TYPE &INPUT "CTYPE" %typemap(imtype, out="global::System.IntPtr") TYPE *INPUT, TYPE &INPUT "CSTYPE" %typemap(cstype, out="$csclassname") TYPE *INPUT, TYPE &INPUT "CSTYPE" %typemap(csin) TYPE *INPUT, TYPE &INPUT "$csinput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, unsigned int, bool) //INPUT_TYPEMAP(char, char, char) INPUT_TYPEMAP(signed char, signed char, sbyte) INPUT_TYPEMAP(unsigned char, unsigned char, byte) INPUT_TYPEMAP(short, short, short) INPUT_TYPEMAP(unsigned short, unsigned short, ushort) INPUT_TYPEMAP(int, int, int) INPUT_TYPEMAP(unsigned int, unsigned int, uint) INPUT_TYPEMAP(long, long, int) INPUT_TYPEMAP(unsigned long, unsigned long, uint) INPUT_TYPEMAP(long long, long long, long) INPUT_TYPEMAP(unsigned long long, unsigned long long, ulong) INPUT_TYPEMAP(float, float, float) INPUT_TYPEMAP(double, double, double) #undef INPUT_TYPEMAP /* OUTPUT typemaps --------------- These typemaps are used for pointer/reference parameters that are output only and are mapped to a C# output parameter. The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In C#, the 'out' keyword is used when passing the parameter to a function that takes an output parameter. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The C# output of the function would be the function return value and the value returned in the second output parameter. In C# you would use it like this: double dptr; double fraction = modulename.modf(5, out dptr); */ %define OUTPUT_TYPEMAP(TYPE, CTYPE, CSTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *OUTPUT, TYPE &OUTPUT "CTYPE *" %typemap(imtype, out="global::System.IntPtr") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" %typemap(cstype, out="$csclassname") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" %typemap(csin) TYPE *OUTPUT, TYPE &OUTPUT "out $csinput" %typemap(in) TYPE *OUTPUT, TYPE &OUTPUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *OUTPUT, TYPE &OUTPUT "" %enddef OUTPUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //OUTPUT_TYPEMAP(char, char, char, CHAR_PTR) OUTPUT_TYPEMAP(signed char, signed char, sbyte, INT8_PTR) OUTPUT_TYPEMAP(unsigned char, unsigned char, byte, UINT8_PTR) OUTPUT_TYPEMAP(short, short, short, INT16_PTR) OUTPUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) OUTPUT_TYPEMAP(int, int, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) OUTPUT_TYPEMAP(long, long, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned long, unsigned long, uint, UINT32_PTR) OUTPUT_TYPEMAP(long long, long long, long, INT64_PTR) OUTPUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) OUTPUT_TYPEMAP(float, float, float, FLOAT_PTR) OUTPUT_TYPEMAP(double, double, double, DOUBLE_PTR) #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT, bool &OUTPUT %{ *$input = 0; $1 = ($1_ltype)$input; %} /* INOUT typemaps -------------- These typemaps are for pointer/reference parameters that are both input and output and are mapped to a C# reference parameter. The following typemaps can be applied to turn a pointer or reference into a reference parameters, that is the parameter is both an input and an output. In C#, the 'ref' keyword is used for reference parameters. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); The C# output of the function would be the new value returned by the reference parameter. In C# you would use it like this: double x = 5.0; neg(ref x); The implementation of the OUTPUT and INOUT typemaps is different to the scripting languages in that the scripting languages will return the output value as part of the function return value. */ %define INOUT_TYPEMAP(TYPE, CTYPE, CSTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *INOUT, TYPE &INOUT "CTYPE *" %typemap(imtype, out="global::System.IntPtr") TYPE *INOUT, TYPE &INOUT "ref CSTYPE" %typemap(cstype, out="$csclassname") TYPE *INOUT, TYPE &INOUT "ref CSTYPE" %typemap(csin) TYPE *INOUT, TYPE &INOUT "ref $csinput" %typemap(in) TYPE *INOUT, TYPE &INOUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //INOUT_TYPEMAP(char, char, char, CHAR_PTR) INOUT_TYPEMAP(signed char, signed char, sbyte, INT8_PTR) INOUT_TYPEMAP(unsigned char, unsigned char, byte, UINT8_PTR) INOUT_TYPEMAP(short, short, short, INT16_PTR) INOUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) INOUT_TYPEMAP(int, int, int, INT32_PTR) INOUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) INOUT_TYPEMAP(long, long, int, INT32_PTR) INOUT_TYPEMAP(unsigned long, unsigned long, uint, UINT32_PTR) INOUT_TYPEMAP(long long, long long, long, INT64_PTR) INOUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) INOUT_TYPEMAP(float, float, float, FLOAT_PTR) INOUT_TYPEMAP(double, double, double, DOUBLE_PTR) #undef INOUT_TYPEMAP swig-3.0.12/Lib/csharp/std_array.i0000664000175000017500000001572413042756442016576 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_array.i * * SWIG typemaps for std::array * C# implementation * The C# wrapper is made to look and feel like a C# System.Collections.Generic.IReadOnlyList<> collection. * ----------------------------------------------------------------------------- */ %{ #include #include #include %} %include %define SWIG_STD_ARRAY_INTERNAL(T, N) %typemap(csinterfaces) std::array< T, N > "global::System.IDisposable, global::System.Collections.IEnumerable\n , global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>\n"; %proxycode %{ public $csclassname(global::System.Collections.ICollection c) : this() { if (c == null) throw new global::System.ArgumentNullException("c"); int end = global::System.Math.Min(this.Count, c.Count); int i = 0; foreach ($typemap(cstype, T) elem in c) { if (i >= end) break; this[i++] = elem; } } public int Count { get { return (int)size(); } } public $typemap(cstype, T) this[int index] { get { return getitem(index); } set { setitem(index, value); } } public bool IsEmpty { get { return empty(); } } public void CopyTo($typemap(cstype, T)[] array) { CopyTo(0, array, 0, this.Count); } public void CopyTo($typemap(cstype, T)[] array, int arrayIndex) { CopyTo(0, array, arrayIndex, this.Count); } public void CopyTo(int index, $typemap(cstype, T)[] array, int arrayIndex, int count) { if (array == null) throw new global::System.ArgumentNullException("array"); if (index < 0) throw new global::System.ArgumentOutOfRangeException("index", "Value is less than zero"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (count < 0) throw new global::System.ArgumentOutOfRangeException("count", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (index+count > this.Count || arrayIndex+count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); for (int i=0; i global::System.Collections.Generic.IEnumerable<$typemap(cstype, T)>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator , global::System.Collections.Generic.IEnumerator<$typemap(cstype, T)> { private $csclassname collectionRef; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public $typemap(cstype, T) Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return ($typemap(cstype, T))currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; currentObject = collectionRef[currentIndex]; } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; array(); array(const array &other); size_type size() const; bool empty() const; %rename(Fill) fill; void fill(const value_type& val); %rename(Swap) swap; void swap(array& other); %extend { T getitemcopy(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } const_reference getitem(int index) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) return (*$self)[index]; else throw std::out_of_range("index"); } void setitem(int index, const_reference val) throw (std::out_of_range) { if (index>=0 && index<(int)$self->size()) (*$self)[index] = val; else throw std::out_of_range("index"); } void Reverse() { std::reverse($self->begin(), $self->end()); } void Reverse(int index, int count) throw (std::out_of_range, std::invalid_argument) { if (index < 0) throw std::out_of_range("index"); if (count < 0) throw std::out_of_range("count"); if (index >= (int)$self->size()+1 || index+count > (int)$self->size()) throw std::invalid_argument("invalid range"); std::reverse($self->begin()+index, $self->begin()+index+count); } } %enddef %csmethodmodifiers std::array::empty "private" %csmethodmodifiers std::array::getitemcopy "private" %csmethodmodifiers std::array::getitem "private" %csmethodmodifiers std::array::setitem "private" %csmethodmodifiers std::array::size "private" namespace std { template class array { SWIG_STD_ARRAY_INTERNAL(T, N) }; } swig-3.0.12/Lib/csharp/arrays_csharp.i0000664000175000017500000001252013042756442017436 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_csharp.i * * This file contains a two approaches to marshaling arrays. The first uses * default p/invoke marshaling and the second uses pinning of the arrays. * * Default marshaling approach * ---------------------------- * Array typemaps using default p/invoke marshaling. The data is copied to a separately * allocated buffer when passing over the managed-native boundary. * * There are separate typemaps for in, out and inout arrays to enable avoiding * unnecessary copying. * * Example usage: * * %include "arrays_csharp.i" * %apply int INPUT[] { int* sourceArray } * %apply int OUTPUT[] { int* targetArray } * void myArrayCopy( int* sourceArray, int* targetArray, int nitems ); * * %apply int INOUT[] { int* array1, int *array2 } * void myArraySwap( int* array1, int* array2, int nitems ); * * If handling large arrays you should consider using the pinning array typemaps * described next. * * Pinning approach * ---------------- * Array typemaps using pinning. These typemaps pin the managed array given * as parameter and pass a pointer to it to the c/c++ side. This is very * efficient as no copying is done (unlike in the default array marshaling), * but it makes garbage collection more difficult. When considering using * these typemaps, think carefully whether you have callbacks that may cause * the control to re-enter the managed side from within the call (and produce * garbage for the gc) or whether other threads may produce enough garbage to * trigger gc while the call is being executed. In those cases it may be * wiser to use the default marshaling typemaps. * * Please note that when using fixed arrays, you have to mark your corresponding * module class method unsafe using * %csmethodmodifiers "public unsafe" * (the visibility of the method is up to you). * * Example usage: * * %include "arrays_csharp.i" * %apply int FIXED[] { int* sourceArray, int *targetArray } * %csmethodmodifiers myArrayCopy "public unsafe"; * void myArrayCopy( int *sourceArray, int* targetArray, int nitems ); * * ----------------------------------------------------------------------------- */ %define CSHARP_ARRAYS( CTYPE, CSTYPE ) // input only arrays %typemap(ctype) CTYPE INPUT[] "CTYPE*" %typemap(cstype) CTYPE INPUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE INPUT[] "CSTYPE[]" %typemap(csin) CTYPE INPUT[] "$csinput" %typemap(in) CTYPE INPUT[] "$1 = $input;" %typemap(freearg) CTYPE INPUT[] "" %typemap(argout) CTYPE INPUT[] "" // output only arrays %typemap(ctype) CTYPE OUTPUT[] "CTYPE*" %typemap(cstype) CTYPE OUTPUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE OUTPUT[] "CSTYPE[]" %typemap(csin) CTYPE OUTPUT[] "$csinput" %typemap(in) CTYPE OUTPUT[] "$1 = $input;" %typemap(freearg) CTYPE OUTPUT[] "" %typemap(argout) CTYPE OUTPUT[] "" // inout arrays %typemap(ctype) CTYPE INOUT[] "CTYPE*" %typemap(cstype) CTYPE INOUT[] "CSTYPE[]" %typemap(imtype, inattributes="[global::System.Runtime.InteropServices.In, global::System.Runtime.InteropServices.Out, global::System.Runtime.InteropServices.MarshalAs(global::System.Runtime.InteropServices.UnmanagedType.LPArray)]") CTYPE INOUT[] "CSTYPE[]" %typemap(csin) CTYPE INOUT[] "$csinput" %typemap(in) CTYPE INOUT[] "$1 = $input;" %typemap(freearg) CTYPE INOUT[] "" %typemap(argout) CTYPE INOUT[] "" %enddef // CSHARP_ARRAYS CSHARP_ARRAYS(signed char, sbyte) CSHARP_ARRAYS(unsigned char, byte) CSHARP_ARRAYS(short, short) CSHARP_ARRAYS(unsigned short, ushort) CSHARP_ARRAYS(int, int) CSHARP_ARRAYS(unsigned int, uint) // FIXME - on Unix 64 bit, long is 8 bytes but is 4 bytes on Windows 64 bit. // How can this be handled sensibly? // See e.g. http://www.xml.com/ldd/chapter/book/ch10.html CSHARP_ARRAYS(long, int) CSHARP_ARRAYS(unsigned long, uint) CSHARP_ARRAYS(long long, long) CSHARP_ARRAYS(unsigned long long, ulong) CSHARP_ARRAYS(float, float) CSHARP_ARRAYS(double, double) CSHARP_ARRAYS(bool, bool) %define CSHARP_ARRAYS_FIXED( CTYPE, CSTYPE ) %typemap(ctype) CTYPE FIXED[] "CTYPE*" %typemap(imtype) CTYPE FIXED[] "global::System.IntPtr" %typemap(cstype) CTYPE FIXED[] "CSTYPE[]" %typemap(csin, pre= " fixed ( CSTYPE* swig_ptrTo_$csinput = $csinput ) {", terminator=" }") CTYPE FIXED[] "(global::System.IntPtr)swig_ptrTo_$csinput" %typemap(in) CTYPE FIXED[] "$1 = $input;" %typemap(freearg) CTYPE FIXED[] "" %typemap(argout) CTYPE FIXED[] "" %enddef // CSHARP_ARRAYS_FIXED CSHARP_ARRAYS_FIXED(signed char, sbyte) CSHARP_ARRAYS_FIXED(unsigned char, byte) CSHARP_ARRAYS_FIXED(short, short) CSHARP_ARRAYS_FIXED(unsigned short, ushort) CSHARP_ARRAYS_FIXED(int, int) CSHARP_ARRAYS_FIXED(unsigned int, uint) CSHARP_ARRAYS_FIXED(long, int) CSHARP_ARRAYS_FIXED(unsigned long, uint) CSHARP_ARRAYS_FIXED(long long, long) CSHARP_ARRAYS_FIXED(unsigned long long, ulong) CSHARP_ARRAYS_FIXED(float, float) CSHARP_ARRAYS_FIXED(double, double) CSHARP_ARRAYS_FIXED(bool, bool) swig-3.0.12/Lib/csharp/swigtype_inout.i0000664000175000017500000000267613042756442017701 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigtype_inout.i * * Pointer pointer and pointer reference handling typemap library for non-primitive types * * These mappings provide support for input/output arguments and common * uses for C/C++ pointer references and pointer to pointers. * * These are named typemaps (OUTPUT) and can be used like any named typemap. * Alternatively they can be made the default by using %apply: * %apply SWIGTYPE *& OUTPUT { SWIGTYPE *& } * ----------------------------------------------------------------------------- */ /* * OUTPUT typemaps. Example usage wrapping: * * void f(XXX *& x) { x = new XXX(111); } * * would be: * * XXX x = null; * f(out x); * // use x * x.Dispose(); // manually clear memory or otherwise leave out and leave it to the garbage collector */ %typemap(ctype) SWIGTYPE *& OUTPUT "void **" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE *& OUTPUT "out global::System.IntPtr" %typemap(cstype) SWIGTYPE *& OUTPUT "out $*csclassname" %typemap(csin, pre=" global::System.IntPtr cPtr_$csinput = global::System.IntPtr.Zero;", post=" $csinput = (cPtr_$csinput == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr_$csinput, true);", cshin="out $csinput") SWIGTYPE *& OUTPUT "out cPtr_$csinput" %typemap(in) SWIGTYPE *& OUTPUT %{ $1 = ($1_ltype)$input; %} %typemap(freearg) SWIGTYPE *& OUTPUT "" swig-3.0.12/Lib/csharp/csharp.swg0000664000175000017500000011566713042756442016445 0ustar williamwilliam/* ----------------------------------------------------------------------------- * csharp.swg * * C# typemaps * ----------------------------------------------------------------------------- */ %include /* The ctype, imtype and cstype typemaps work together and so there should be one of each. * The ctype typemap contains the PInvoke type used in the PInvoke (C/C++) code. * The imtype typemap contains the C# type used in the intermediary class. * The cstype typemap contains the C# type used in the C# proxy classes, type wrapper classes and module class. */ /* SWIG 3 no longer inserts using directives into generated C# code. For backwards compatibility, the SWIG2_CSHARP macro can be defined to have SWIG 3 generate using directives similar to those generated by SWIG 2. */ #ifdef SWIG2_CSHARP %typemap(csimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "\nusing global::System;\nusing global::System.Runtime.InteropServices;\n" %pragma(csharp) moduleimports=%{ using global::System; using global::System.Runtime.InteropServices; %} %pragma(csharp) imclassimports=%{ using global::System; using global::System.Runtime.InteropServices; %} #endif /* Fragments */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } /* Primitive types */ %typemap(ctype) bool, const bool & "unsigned int" %typemap(ctype) char, const char & "char" %typemap(ctype) signed char, const signed char & "signed char" %typemap(ctype) unsigned char, const unsigned char & "unsigned char" %typemap(ctype) short, const short & "short" %typemap(ctype) unsigned short, const unsigned short & "unsigned short" %typemap(ctype) int, const int & "int" %typemap(ctype) unsigned int, const unsigned int & "unsigned int" %typemap(ctype) long, const long & "long" %typemap(ctype) unsigned long, const unsigned long & "unsigned long" %typemap(ctype) long long, const long long & "long long" %typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" %typemap(ctype) float, const float & "float" %typemap(ctype) double, const double & "double" %typemap(ctype) void "void" %typemap(imtype) bool, const bool & "bool" %typemap(imtype) char, const char & "char" %typemap(imtype) signed char, const signed char & "sbyte" %typemap(imtype) unsigned char, const unsigned char & "byte" %typemap(imtype) short, const short & "short" %typemap(imtype) unsigned short, const unsigned short & "ushort" %typemap(imtype) int, const int & "int" %typemap(imtype) unsigned int, const unsigned int & "uint" %typemap(imtype) long, const long & "int" %typemap(imtype) unsigned long, const unsigned long & "uint" %typemap(imtype) long long, const long long & "long" %typemap(imtype) unsigned long long, const unsigned long long & "ulong" %typemap(imtype) float, const float & "float" %typemap(imtype) double, const double & "double" %typemap(imtype) void "void" %typemap(cstype) bool, const bool & "bool" %typemap(cstype) char, const char & "char" %typemap(cstype) signed char, const signed char & "sbyte" %typemap(cstype) unsigned char, const unsigned char & "byte" %typemap(cstype) short, const short & "short" %typemap(cstype) unsigned short, const unsigned short & "ushort" %typemap(cstype) int, const int & "int" %typemap(cstype) unsigned int, const unsigned int & "uint" %typemap(cstype) long, const long & "int" %typemap(cstype) unsigned long, const unsigned long & "uint" %typemap(cstype) long long, const long long & "long" %typemap(cstype) unsigned long long, const unsigned long long & "ulong" %typemap(cstype) float, const float & "float" %typemap(cstype) double, const double & "double" %typemap(cstype) void "void" %typemap(ctype) char *, char *&, char[ANY], char[] "char *" %typemap(imtype) char *, char *&, char[ANY], char[] "string" %typemap(cstype) char *, char *&, char[ANY], char[] "string" /* Non primitive types */ %typemap(ctype) SWIGTYPE "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE "$&csclassname" %typemap(ctype) SWIGTYPE [] "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE [] "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE [] "$csclassname" %typemap(ctype) SWIGTYPE * "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE * "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE * "$csclassname" %typemap(ctype) SWIGTYPE & "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE & "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE & "$csclassname" %typemap(ctype) SWIGTYPE && "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE && "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE && "$csclassname" /* pointer to a class member */ %typemap(ctype) SWIGTYPE (CLASS::*) "char *" %typemap(imtype) SWIGTYPE (CLASS::*) "string" %typemap(cstype) SWIGTYPE (CLASS::*) "$csclassname" /* The following are the in and out typemaps. These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(directorout) bool %{ $result = $input ? true : false; %} %typemap(csdirectorin) bool "$iminput" %typemap(csdirectorout) bool "$cscall" %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(directorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorin) bool "$input = $1;" %typemap(directorin) char "$input = $1;" %typemap(directorin) signed char "$input = $1;" %typemap(directorin) unsigned char "$input = $1;" %typemap(directorin) short "$input = $1;" %typemap(directorin) unsigned short "$input = $1;" %typemap(directorin) int "$input = $1;" %typemap(directorin) unsigned int "$input = $1;" %typemap(directorin) long "$input = $1;" %typemap(directorin) unsigned long "$input = (unsigned long)$1;" %typemap(directorin) long long "$input = $1;" %typemap(directorin) unsigned long long "$input = $1;" %typemap(directorin) float "$input = $1;" %typemap(directorin) double "$input = $1;" %typemap(csdirectorin) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "$iminput" %typemap(csdirectorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double "$cscall" %typemap(out) bool %{ $result = $1; %} %typemap(out) char %{ $result = $1; %} %typemap(out) signed char %{ $result = $1; %} %typemap(out) unsigned char %{ $result = $1; %} %typemap(out) short %{ $result = $1; %} %typemap(out) unsigned short %{ $result = $1; %} %typemap(out) int %{ $result = $1; %} %typemap(out) unsigned int %{ $result = $1; %} %typemap(out) long %{ $result = $1; %} %typemap(out) unsigned long %{ $result = (unsigned long)$1; %} %typemap(out) long long %{ $result = $1; %} %typemap(out) unsigned long long %{ $result = $1; %} %typemap(out) float %{ $result = $1; %} %typemap(out) double %{ $result = $1; %} /* char * - treat as String */ %typemap(in) char * %{ $1 = ($1_ltype)$input; %} %typemap(out) char * %{ $result = SWIG_csharp_string_callback((const char *)$1); %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * %{ $result = ($1_ltype)$input; %} %typemap(directorin) char * %{ $input = SWIG_csharp_string_callback((const char *)$1); %} %typemap(csdirectorin) char * "$iminput" %typemap(csdirectorout) char * "$cscall" /* char *& - treat as String */ %typemap(in) char *& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) char *& %{ if ($1) $result = SWIG_csharp_string_callback((const char *)*$1); %} %typemap(out, null="") void "" %typemap(csdirectorin) void "$iminput" %typemap(csdirectorout) void "$cscall" %typemap(directorin) void "" /* primitive types by const reference */ %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(csdirectorin) const bool & "$iminput" %typemap(csdirectorout) const bool & "$cscall" %typemap(in) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const unsigned long long &, const float &, const double & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const bool & "$input = $1;" %typemap(directorin) const char & "$input = $1;" %typemap(directorin) const signed char & "$input = $1;" %typemap(directorin) const unsigned char & "$input = $1;" %typemap(directorin) const short & "$input = $1;" %typemap(directorin) const unsigned short & "$input = $1;" %typemap(directorin) const int & "$input = $1;" %typemap(directorin) const unsigned int & "$input = $1;" %typemap(directorin) const long & "$input = $1;" %typemap(directorin) const unsigned long & "$input = $1;" %typemap(directorin) const long long & "$input = $1;" %typemap(directorin) const unsigned long long & "$input = $1;" %typemap(directorin) const float & "$input = $1;" %typemap(directorin) const double & "$input = $1;" %typemap(csdirectorin) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$iminput" %typemap(csdirectorout) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$cscall" %typemap(out) const bool & %{ $result = *$1; %} %typemap(out) const char & %{ $result = *$1; %} %typemap(out) const signed char & %{ $result = *$1; %} %typemap(out) const unsigned char & %{ $result = *$1; %} %typemap(out) const short & %{ $result = *$1; %} %typemap(out) const unsigned short & %{ $result = *$1; %} %typemap(out) const int & %{ $result = *$1; %} %typemap(out) const unsigned int & %{ $result = *$1; %} %typemap(out) const long & %{ $result = *$1; %} %typemap(out) const unsigned long & %{ $result = (unsigned long)*$1; %} %typemap(out) const long long & %{ $result = *$1; %} %typemap(out) const unsigned long long & %{ $result = *$1; %} %typemap(out) const float & %{ $result = *$1; %} %typemap(out) const double & %{ $result = *$1; %} /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in, canthrow=1) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(directorout) SWIGTYPE %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = *($&1_ltype)$input; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ $result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); $result = $1ptr; } #endif %typemap(directorin) SWIGTYPE %{ $input = (void *)new $1_ltype((const $1_ltype &)$1); %} %typemap(csdirectorin) SWIGTYPE "new $&csclassname($iminput, true)" %typemap(csdirectorout) SWIGTYPE "$&csclassname.getCPtr($cscall).Handle" /* Generic pointers and references */ %typemap(in) SWIGTYPE * %{ $1 = ($1_ltype)$input; %} %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) %{ SWIG_UnpackData($input, (void *)&$1, sizeof($1)); %} %typemap(in, canthrow=1) SWIGTYPE & %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type type is null", 0); return $null; } %} %typemap(in, canthrow=1) SWIGTYPE && %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type type is null", 0); return $null; } %} %typemap(out) SWIGTYPE * %{ $result = (void *)$1; %} %typemap(out, fragment="SWIG_PackData") SWIGTYPE (CLASS::*) %{ char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = SWIG_csharp_string_callback(buf); %} %typemap(out) SWIGTYPE & %{ $result = (void *)$1; %} %typemap(out) SWIGTYPE && %{ $result = (void *)$1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * %{ $result = ($1_ltype)$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) %{ $result = ($1_ltype)$input; %} %typemap(directorin) SWIGTYPE * %{ $input = (void *) $1; %} %typemap(directorin) SWIGTYPE (CLASS::*) %{ $input = (void *) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = ($1_ltype)$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE && %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Unexpected null return for type $1_type", 0); return $null; } $result = ($1_ltype)$input; %} %typemap(directorin) SWIGTYPE & %{ $input = ($1_ltype) &$1; %} %typemap(directorin) SWIGTYPE && %{ $input = ($1_ltype) &$1; %} %typemap(csdirectorin) SWIGTYPE *, SWIGTYPE (CLASS::*) "($iminput == global::System.IntPtr.Zero) ? null : new $csclassname($iminput, false)" %typemap(csdirectorin) SWIGTYPE & "new $csclassname($iminput, false)" %typemap(csdirectorin) SWIGTYPE && "new $csclassname($iminput, false)" %typemap(csdirectorout) SWIGTYPE *, SWIGTYPE (CLASS::*), SWIGTYPE &, SWIGTYPE && "$csclassname.getCPtr($cscall).Handle" /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = ($1_ltype)$input; %} %typemap(out) SWIGTYPE [] %{ $result = $1; %} /* char arrays - treat as String */ %typemap(in) char[ANY], char[] %{ $1 = ($1_ltype)$input; %} %typemap(out) char[ANY], char[] %{ $result = SWIG_csharp_string_callback((const char *)$1); %} %typemap(directorout) char[ANY], char[] %{ $result = ($1_ltype)$input; %} %typemap(directorin) char[ANY], char[] %{ $input = SWIG_csharp_string_callback((const char *)$1); %} %typemap(csdirectorin) char[ANY], char[] "$iminput" %typemap(csdirectorout) char[ANY], char[] "$cscall" /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in C# as more than one C++ type maps to a single C# type */ %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT16) short, const short & "" %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) int, long, const int &, const long & "" %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, unsigned long, const unsigned int &, const unsigned long & "" %typecheck(SWIG_TYPECHECK_INT64) long long, const long long & "" %typecheck(SWIG_TYPECHECK_UINT64) unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) char *, char *&, char[ANY], char[] "" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws, canthrow=1) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, error_msg); return $null; %} %typemap(throws, canthrow=1) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [ANY] %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws, canthrow=1) char * %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1); return $null; %} /* Typemaps for code generation in proxy classes and C# type wrapper classes */ /* The csin typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the PInvoke class. */ %typemap(csin) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & "$csinput" %typemap(csin) char *, char *&, char[ANY], char[] "$csinput" %typemap(csin) SWIGTYPE "$&csclassname.getCPtr($csinput)" %typemap(csin) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "$csclassname.getCPtr($csinput)" %typemap(csin) SWIGTYPE (CLASS::*) "$csclassname.getCMemberPtr($csinput)" /* The csout typemap is used for converting function return types from the return type * used in the PInvoke class to the type returned by the proxy, module or type wrapper class. * The $excode special variable is replaced by the excode typemap attribute code if the * method can throw any exceptions from unmanaged code, otherwise replaced by nothing. */ // Macro used by the $excode special variable %define SWIGEXCODE "\n if ($imclassname.SWIGPendingException.Pending) throw $imclassname.SWIGPendingException.Retrieve();" %enddef %define SWIGEXCODE2 "\n if ($imclassname.SWIGPendingException.Pending) throw $imclassname.SWIGPendingException.Retrieve();" %enddef %typemap(csout, excode=SWIGEXCODE) bool, const bool & { bool ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) char, const char & { char ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) signed char, const signed char & { sbyte ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned char, const unsigned char & { byte ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) short, const short & { short ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned short, const unsigned short & { ushort ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) int, const int & { int ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned int, const unsigned int & { uint ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) long, const long & { int ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned long, const unsigned long & { uint ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) long long, const long long & { long ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) unsigned long long, const unsigned long long & { ulong ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) float, const float & { float ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) double, const double & { double ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) char *, char *&, char[ANY], char[] { string ret = $imcall;$excode return ret; } %typemap(csout, excode=SWIGEXCODE) void { $imcall;$excode } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE { $&csclassname ret = new $&csclassname($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE & { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE && { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE *, SWIGTYPE [] { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIGTYPE (CLASS::*) { string cMemberPtr = $imcall; $csclassname ret = (cMemberPtr == null) ? null : new $csclassname(cMemberPtr, $owner);$excode return ret; } /* Properties */ %typemap(csvarin, excode=SWIGEXCODE2) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ set { $imcall;$excode } %} %typemap(csvarin, excode=SWIGEXCODE2) char *, char *&, char[ANY], char[] %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) bool, const bool & %{ get { bool ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) char, const char & %{ get { char ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) signed char, const signed char & %{ get { sbyte ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned char, const unsigned char & %{ get { byte ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) short, const short & %{ get { short ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned short, const unsigned short & %{ get { ushort ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) int, const int & %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned int, const unsigned int & %{ get { uint ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) long, const long & %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned long, const unsigned long & %{ get { uint ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) long long, const long long & %{ get { long ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) unsigned long long, const unsigned long long & %{ get { ulong ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) float, const float & %{ get { float ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) double, const double & %{ get { double ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) char *, char *&, char[ANY], char[] %{ get { string ret = $imcall;$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) void %{ get { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE %{ get { $&csclassname ret = new $&csclassname($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE & %{ get { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE && %{ get { $csclassname ret = new $csclassname($imcall, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE *, SWIGTYPE [] %{ get { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIGTYPE (CLASS::*) %{ get { string cMemberPtr = $imcall; $csclassname ret = (cMemberPtr == null) ? null : new $csclassname(cMemberPtr, $owner);$excode return ret; } %} /* Pointer reference typemaps */ %typemap(ctype) SWIGTYPE *const& "void *" %typemap(imtype, out="global::System.IntPtr") SWIGTYPE *const& "global::System.Runtime.InteropServices.HandleRef" %typemap(cstype) SWIGTYPE *const& "$*csclassname" %typemap(csin) SWIGTYPE *const& "$*csclassname.getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIGTYPE *const& { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ret; } %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ $result = (void *)*$1; %} /* Marshal C/C++ pointer to global::System.IntPtr */ %typemap(ctype) void *VOID_INT_PTR "void *" %typemap(imtype) void *VOID_INT_PTR "global::System.IntPtr" %typemap(cstype) void *VOID_INT_PTR "global::System.IntPtr" %typemap(in) void *VOID_INT_PTR %{ $1 = ($1_ltype)$input; %} %typemap(out) void *VOID_INT_PTR %{ $result = (void *)$1; %} %typemap(csin) void *VOID_INT_PTR "$csinput" %typemap(csout, excode=SWIGEXCODE) void *VOID_INT_PTR { global::System.IntPtr ret = $imcall;$excode return ret; } %typemap(csdirectorin) void *VOID_INT_PTR "$iminput" %typemap(csdirectorout) void *VOID_INT_PTR "$cscall" /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(csbase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class" %typemap(cscode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csinterfaces) SWIGTYPE "global::System.IDisposable" %typemap(csinterfaces) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(csinterfaces_derived) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" // csbody typemaps... these are in macros so that the visibility of the methods can be easily changed by users. %define SWIG_CSBODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Proxy classes (base classes, ie, not derived classes) %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; protected bool swigCMemOwn; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGUpcast(cPtr), cMemoryOwn) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %enddef %define SWIG_CSBODY_TYPEWRAPPER(PTRCTOR_VISIBILITY, DEFAULTCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Typewrapper classes %typemap(csbody) TYPE *, TYPE &, TYPE &&, TYPE [] %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool futureUse) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } DEFAULTCTOR_VISIBILITY $csclassname() { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csbody) TYPE (CLASS::*) %{ private string swigCMemberPtr; PTRCTOR_VISIBILITY $csclassname(string cMemberPtr, bool futureUse) { swigCMemberPtr = cMemberPtr; } DEFAULTCTOR_VISIBILITY $csclassname() { swigCMemberPtr = null; } CPTR_VISIBILITY static string getCMemberPtr($csclassname obj) { return obj.swigCMemberPtr; } %} %enddef /* Set the default csbody typemaps to use internal visibility. Use the macros to change to public if using multiple modules. */ SWIG_CSBODY_PROXY(internal, internal, SWIGTYPE) SWIG_CSBODY_TYPEWRAPPER(internal, protected, internal, SWIGTYPE) %typemap(csfinalize) SWIGTYPE %{ ~$csclassname() { Dispose(); } %} %typemap(csconstruct, excode=SWIGEXCODE,directorconnect="\n SwigDirectorConnect();") SWIGTYPE %{: this($imcall, true) {$excode$directorconnect } %} %typemap(csdestruct, methodname="Dispose", methodmodifiers="public") SWIGTYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); } } %typemap(csdestruct_derived, methodname="Dispose", methodmodifiers="public") SWIGTYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); base.Dispose(); } } %typemap(directordisconnect, methodname="swigDirectorDisconnect") SWIGTYPE %{ protected void $methodname() { swigCMemOwn = false; $imcall; } %} /* C# specific directives */ #define %csconst(flag) %feature("cs:const","flag") #define %csconstvalue(value) %feature("cs:constvalue",value) #define %csenum(wrapapproach) %feature("cs:enum","wrapapproach") #define %csmethodmodifiers %feature("cs:methodmodifiers") #define %csnothrowexception %feature("except") #define %csattributes %feature("cs:attributes") #define %proxycode %insert("proxycode") %pragma(csharp) imclassclassmodifiers="class" %pragma(csharp) moduleclassmodifiers="public class" /* Some ANSI C typemaps */ %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* csharp keywords */ %include // Default enum handling %include // For vararg handling in macros, from swigmacros.swg #define %arg(X...) X /* // Alternative char * typemaps. %pragma(csharp) imclasscode=%{ public class SWIGStringMarshal : global::System.IDisposable { public readonly global::System.Runtime.InteropServices.HandleRef swigCPtr; public SWIGStringMarshal(string str) { swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, global::System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(str)); } public virtual void Dispose() { global::System.Runtime.InteropServices.Marshal.FreeHGlobal(swigCPtr.Handle); global::System.GC.SuppressFinalize(this); } } %} %typemap(imtype, out="global::System.IntPtr") char *, char[ANY], char[] "global::System.Runtime.InteropServices.HandleRef" %typemap(out) char *, char[ANY], char[] %{ $result = $1; %} %typemap(csin) char *, char[ANY], char[] "new $imclassname.SWIGStringMarshal($csinput).swigCPtr" %typemap(csout, excode=SWIGEXCODE) char *, char[ANY], char[] { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi($imcall);$excode return ret; } %typemap(csvarin, excode=SWIGEXCODE2) char *, char[ANY], char[] %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) char *, char[ANY], char[] %{ get { string ret = global::System.Runtime.InteropServices.Marshal.PtrToStringAnsi($imcall);$excode return ret; } %} */ swig-3.0.12/Lib/csharp/std_pair.i0000664000175000017500000000127713042756442016411 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T t, U u); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/csharp/enumsimple.swg0000664000175000017500000000550513042756442017330 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumsimple.swg * * This file provides backwards compatible enum wrapping. SWIG versions 1.3.21 * and earlier wrapped global enums with constant integers in the module * class. Enums declared within a C++ class were wrapped by constant integers * in the C# proxy class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "$iminput" %typemap(csdirectorout) const enum SWIGTYPE & "$cscall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "$csinput" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { int ret = $imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { int ret = $imcall;$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "$iminput" %typemap(csdirectorout) enum SWIGTYPE "$cscall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "$csinput" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { int ret = $imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { int ret = $imcall;$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" %typemap(csbody) enum SWIGTYPE "" %csenum(simple); swig-3.0.12/Lib/csharp/enums.swg0000664000175000017500000000557613042756442016311 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enums.swg * * Include this file in order for C/C++ enums to be wrapped by proper C# enums. * Note that the PINVOKE layer handles the enum as an int. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(cstype) const enum SWIGTYPE & "$*csclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(csdirectorin) const enum SWIGTYPE & "($*csclassname)$iminput" %typemap(csdirectorout) const enum SWIGTYPE & "(int)$cscall" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws, canthrow=1) const enum SWIGTYPE & %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) const enum SWIGTYPE & "(int)$csinput" %typemap(csout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*csclassname ret = ($*csclassname)$imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) const enum SWIGTYPE & %{ get { $*csclassname ret = ($*csclassname)$imcall;$excode return ret; } %} // enum SWIGTYPE typemaps %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(cstype) enum SWIGTYPE "$csclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(csdirectorin) enum SWIGTYPE "($csclassname)$iminput" %typemap(csdirectorout) enum SWIGTYPE "(int)$cscall" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws, canthrow=1) enum SWIGTYPE %{ (void)$1; SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, "C++ $1_type exception thrown"); return $null; %} %typemap(csin) enum SWIGTYPE "(int)$csinput" %typemap(csout, excode=SWIGEXCODE) enum SWIGTYPE { $csclassname ret = ($csclassname)$imcall;$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) enum SWIGTYPE %{ get { $csclassname ret = ($csclassname)$imcall;$excode return ret; } %} %typemap(csbase) enum SWIGTYPE "" %typemap(csclassmodifiers) enum SWIGTYPE "public enum" %typemap(cscode) enum SWIGTYPE "" %typemap(csimports) enum SWIGTYPE "" %typemap(csinterfaces) enum SWIGTYPE "" %typemap(csbody) enum SWIGTYPE "" %csenum(proper); swig-3.0.12/Lib/csharp/std_auto_ptr.i0000664000175000017500000000164013042756442017305 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (ctype) std::auto_ptr "void *" %typemap (imtype, out="System.IntPtr") std::auto_ptr "HandleRef" %typemap (cstype) std::auto_ptr "$typemap(cstype, TYPE)" %typemap (out) std::auto_ptr %{ $result = (void *)$1.release(); %} %typemap(csout, excode=SWIGEXCODE) std::auto_ptr { System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-3.0.12/Lib/csharp/stl.i0000664000175000017500000000054513042756442015403 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/csharp/csharphead.swg0000664000175000017500000003754113042756442017261 0ustar williamwilliam/* ----------------------------------------------------------------------------- * csharphead.swg * * Support code for exceptions if the SWIG_CSHARP_NO_EXCEPTION_HELPER is not defined * Support code for strings if the SWIG_CSHARP_NO_STRING_HELPER is not defined * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include %} #if !defined(SWIG_CSHARP_NO_EXCEPTION_HELPER) %insert(runtime) %{ /* Support for throwing C# exceptions from C/C++. There are two types: * Exceptions that take a message and ArgumentExceptions that take a message and a parameter name. */ typedef enum { SWIG_CSharpApplicationException, SWIG_CSharpArithmeticException, SWIG_CSharpDivideByZeroException, SWIG_CSharpIndexOutOfRangeException, SWIG_CSharpInvalidCastException, SWIG_CSharpInvalidOperationException, SWIG_CSharpIOException, SWIG_CSharpNullReferenceException, SWIG_CSharpOutOfMemoryException, SWIG_CSharpOverflowException, SWIG_CSharpSystemException } SWIG_CSharpExceptionCodes; typedef enum { SWIG_CSharpArgumentException, SWIG_CSharpArgumentNullException, SWIG_CSharpArgumentOutOfRangeException } SWIG_CSharpExceptionArgumentCodes; typedef void (SWIGSTDCALL* SWIG_CSharpExceptionCallback_t)(const char *); typedef void (SWIGSTDCALL* SWIG_CSharpExceptionArgumentCallback_t)(const char *, const char *); typedef struct { SWIG_CSharpExceptionCodes code; SWIG_CSharpExceptionCallback_t callback; } SWIG_CSharpException_t; typedef struct { SWIG_CSharpExceptionArgumentCodes code; SWIG_CSharpExceptionArgumentCallback_t callback; } SWIG_CSharpExceptionArgument_t; static SWIG_CSharpException_t SWIG_csharp_exceptions[] = { { SWIG_CSharpApplicationException, NULL }, { SWIG_CSharpArithmeticException, NULL }, { SWIG_CSharpDivideByZeroException, NULL }, { SWIG_CSharpIndexOutOfRangeException, NULL }, { SWIG_CSharpInvalidCastException, NULL }, { SWIG_CSharpInvalidOperationException, NULL }, { SWIG_CSharpIOException, NULL }, { SWIG_CSharpNullReferenceException, NULL }, { SWIG_CSharpOutOfMemoryException, NULL }, { SWIG_CSharpOverflowException, NULL }, { SWIG_CSharpSystemException, NULL } }; static SWIG_CSharpExceptionArgument_t SWIG_csharp_exceptions_argument[] = { { SWIG_CSharpArgumentException, NULL }, { SWIG_CSharpArgumentNullException, NULL }, { SWIG_CSharpArgumentOutOfRangeException, NULL } }; static void SWIGUNUSED SWIG_CSharpSetPendingException(SWIG_CSharpExceptionCodes code, const char *msg) { SWIG_CSharpExceptionCallback_t callback = SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback; if ((size_t)code < sizeof(SWIG_csharp_exceptions)/sizeof(SWIG_CSharpException_t)) { callback = SWIG_csharp_exceptions[code].callback; } callback(msg); } static void SWIGUNUSED SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpExceptionArgumentCodes code, const char *msg, const char *param_name) { SWIG_CSharpExceptionArgumentCallback_t callback = SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback; if ((size_t)code < sizeof(SWIG_csharp_exceptions_argument)/sizeof(SWIG_CSharpExceptionArgument_t)) { callback = SWIG_csharp_exceptions_argument[code].callback; } callback(msg, param_name); } %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionCallbacks_$module( SWIG_CSharpExceptionCallback_t applicationCallback, SWIG_CSharpExceptionCallback_t arithmeticCallback, SWIG_CSharpExceptionCallback_t divideByZeroCallback, SWIG_CSharpExceptionCallback_t indexOutOfRangeCallback, SWIG_CSharpExceptionCallback_t invalidCastCallback, SWIG_CSharpExceptionCallback_t invalidOperationCallback, SWIG_CSharpExceptionCallback_t ioCallback, SWIG_CSharpExceptionCallback_t nullReferenceCallback, SWIG_CSharpExceptionCallback_t outOfMemoryCallback, SWIG_CSharpExceptionCallback_t overflowCallback, SWIG_CSharpExceptionCallback_t systemCallback) { SWIG_csharp_exceptions[SWIG_CSharpApplicationException].callback = applicationCallback; SWIG_csharp_exceptions[SWIG_CSharpArithmeticException].callback = arithmeticCallback; SWIG_csharp_exceptions[SWIG_CSharpDivideByZeroException].callback = divideByZeroCallback; SWIG_csharp_exceptions[SWIG_CSharpIndexOutOfRangeException].callback = indexOutOfRangeCallback; SWIG_csharp_exceptions[SWIG_CSharpInvalidCastException].callback = invalidCastCallback; SWIG_csharp_exceptions[SWIG_CSharpInvalidOperationException].callback = invalidOperationCallback; SWIG_csharp_exceptions[SWIG_CSharpIOException].callback = ioCallback; SWIG_csharp_exceptions[SWIG_CSharpNullReferenceException].callback = nullReferenceCallback; SWIG_csharp_exceptions[SWIG_CSharpOutOfMemoryException].callback = outOfMemoryCallback; SWIG_csharp_exceptions[SWIG_CSharpOverflowException].callback = overflowCallback; SWIG_csharp_exceptions[SWIG_CSharpSystemException].callback = systemCallback; } #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterExceptionArgumentCallbacks_$module( SWIG_CSharpExceptionArgumentCallback_t argumentCallback, SWIG_CSharpExceptionArgumentCallback_t argumentNullCallback, SWIG_CSharpExceptionArgumentCallback_t argumentOutOfRangeCallback) { SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentException].callback = argumentCallback; SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentNullException].callback = argumentNullCallback; SWIG_csharp_exceptions_argument[SWIG_CSharpArgumentOutOfRangeException].callback = argumentOutOfRangeCallback; } %} %pragma(csharp) imclasscode=%{ protected class SWIGExceptionHelper { public delegate void ExceptionDelegate(string message); public delegate void ExceptionArgumentDelegate(string message, string paramName); static ExceptionDelegate applicationDelegate = new ExceptionDelegate(SetPendingApplicationException); static ExceptionDelegate arithmeticDelegate = new ExceptionDelegate(SetPendingArithmeticException); static ExceptionDelegate divideByZeroDelegate = new ExceptionDelegate(SetPendingDivideByZeroException); static ExceptionDelegate indexOutOfRangeDelegate = new ExceptionDelegate(SetPendingIndexOutOfRangeException); static ExceptionDelegate invalidCastDelegate = new ExceptionDelegate(SetPendingInvalidCastException); static ExceptionDelegate invalidOperationDelegate = new ExceptionDelegate(SetPendingInvalidOperationException); static ExceptionDelegate ioDelegate = new ExceptionDelegate(SetPendingIOException); static ExceptionDelegate nullReferenceDelegate = new ExceptionDelegate(SetPendingNullReferenceException); static ExceptionDelegate outOfMemoryDelegate = new ExceptionDelegate(SetPendingOutOfMemoryException); static ExceptionDelegate overflowDelegate = new ExceptionDelegate(SetPendingOverflowException); static ExceptionDelegate systemDelegate = new ExceptionDelegate(SetPendingSystemException); static ExceptionArgumentDelegate argumentDelegate = new ExceptionArgumentDelegate(SetPendingArgumentException); static ExceptionArgumentDelegate argumentNullDelegate = new ExceptionArgumentDelegate(SetPendingArgumentNullException); static ExceptionArgumentDelegate argumentOutOfRangeDelegate = new ExceptionArgumentDelegate(SetPendingArgumentOutOfRangeException); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterExceptionCallbacks_$module")] public static extern void SWIGRegisterExceptionCallbacks_$module( ExceptionDelegate applicationDelegate, ExceptionDelegate arithmeticDelegate, ExceptionDelegate divideByZeroDelegate, ExceptionDelegate indexOutOfRangeDelegate, ExceptionDelegate invalidCastDelegate, ExceptionDelegate invalidOperationDelegate, ExceptionDelegate ioDelegate, ExceptionDelegate nullReferenceDelegate, ExceptionDelegate outOfMemoryDelegate, ExceptionDelegate overflowDelegate, ExceptionDelegate systemExceptionDelegate); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_$module")] public static extern void SWIGRegisterExceptionCallbacksArgument_$module( ExceptionArgumentDelegate argumentDelegate, ExceptionArgumentDelegate argumentNullDelegate, ExceptionArgumentDelegate argumentOutOfRangeDelegate); static void SetPendingApplicationException(string message) { SWIGPendingException.Set(new global::System.ApplicationException(message, SWIGPendingException.Retrieve())); } static void SetPendingArithmeticException(string message) { SWIGPendingException.Set(new global::System.ArithmeticException(message, SWIGPendingException.Retrieve())); } static void SetPendingDivideByZeroException(string message) { SWIGPendingException.Set(new global::System.DivideByZeroException(message, SWIGPendingException.Retrieve())); } static void SetPendingIndexOutOfRangeException(string message) { SWIGPendingException.Set(new global::System.IndexOutOfRangeException(message, SWIGPendingException.Retrieve())); } static void SetPendingInvalidCastException(string message) { SWIGPendingException.Set(new global::System.InvalidCastException(message, SWIGPendingException.Retrieve())); } static void SetPendingInvalidOperationException(string message) { SWIGPendingException.Set(new global::System.InvalidOperationException(message, SWIGPendingException.Retrieve())); } static void SetPendingIOException(string message) { SWIGPendingException.Set(new global::System.IO.IOException(message, SWIGPendingException.Retrieve())); } static void SetPendingNullReferenceException(string message) { SWIGPendingException.Set(new global::System.NullReferenceException(message, SWIGPendingException.Retrieve())); } static void SetPendingOutOfMemoryException(string message) { SWIGPendingException.Set(new global::System.OutOfMemoryException(message, SWIGPendingException.Retrieve())); } static void SetPendingOverflowException(string message) { SWIGPendingException.Set(new global::System.OverflowException(message, SWIGPendingException.Retrieve())); } static void SetPendingSystemException(string message) { SWIGPendingException.Set(new global::System.SystemException(message, SWIGPendingException.Retrieve())); } static void SetPendingArgumentException(string message, string paramName) { SWIGPendingException.Set(new global::System.ArgumentException(message, paramName, SWIGPendingException.Retrieve())); } static void SetPendingArgumentNullException(string message, string paramName) { global::System.Exception e = SWIGPendingException.Retrieve(); if (e != null) message = message + " Inner Exception: " + e.Message; SWIGPendingException.Set(new global::System.ArgumentNullException(paramName, message)); } static void SetPendingArgumentOutOfRangeException(string message, string paramName) { global::System.Exception e = SWIGPendingException.Retrieve(); if (e != null) message = message + " Inner Exception: " + e.Message; SWIGPendingException.Set(new global::System.ArgumentOutOfRangeException(paramName, message)); } static SWIGExceptionHelper() { SWIGRegisterExceptionCallbacks_$module( applicationDelegate, arithmeticDelegate, divideByZeroDelegate, indexOutOfRangeDelegate, invalidCastDelegate, invalidOperationDelegate, ioDelegate, nullReferenceDelegate, outOfMemoryDelegate, overflowDelegate, systemDelegate); SWIGRegisterExceptionCallbacksArgument_$module( argumentDelegate, argumentNullDelegate, argumentOutOfRangeDelegate); } } protected static SWIGExceptionHelper swigExceptionHelper = new SWIGExceptionHelper(); public class SWIGPendingException { [global::System.ThreadStatic] private static global::System.Exception pendingException = null; private static int numExceptionsPending = 0; public static bool Pending { get { bool pending = false; if (numExceptionsPending > 0) if (pendingException != null) pending = true; return pending; } } public static void Set(global::System.Exception e) { if (pendingException != null) throw new global::System.ApplicationException("FATAL: An earlier pending exception from unmanaged code was missed and thus not thrown (" + pendingException.ToString() + ")", e); pendingException = e; lock(typeof($imclassname)) { numExceptionsPending++; } } public static global::System.Exception Retrieve() { global::System.Exception e = null; if (numExceptionsPending > 0) { if (pendingException != null) { e = pendingException; pendingException = null; lock(typeof($imclassname)) { numExceptionsPending--; } } } return e; } } %} #endif // SWIG_CSHARP_NO_EXCEPTION_HELPER #if !defined(SWIG_CSHARP_NO_STRING_HELPER) %insert(runtime) %{ /* Callback for returning strings to C# without leaking memory */ typedef char * (SWIGSTDCALL* SWIG_CSharpStringHelperCallback)(const char *); static SWIG_CSharpStringHelperCallback SWIG_csharp_string_callback = NULL; %} %pragma(csharp) imclasscode=%{ protected class SWIGStringHelper { public delegate string SWIGStringDelegate(string message); static SWIGStringDelegate stringDelegate = new SWIGStringDelegate(CreateString); [global::System.Runtime.InteropServices.DllImport("$dllimport", EntryPoint="SWIGRegisterStringCallback_$module")] public static extern void SWIGRegisterStringCallback_$module(SWIGStringDelegate stringDelegate); static string CreateString(string cString) { return cString; } static SWIGStringHelper() { SWIGRegisterStringCallback_$module(stringDelegate); } } static protected SWIGStringHelper swigStringHelper = new SWIGStringHelper(); %} %insert(runtime) %{ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGSTDCALL SWIGRegisterStringCallback_$module(SWIG_CSharpStringHelperCallback callback) { SWIG_csharp_string_callback = callback; } %} #endif // SWIG_CSHARP_NO_STRING_HELPER #if !defined(SWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR) // Ensure the class is not marked beforefieldinit %pragma(csharp) imclasscode=%{ static $imclassname() { } %} #endif %insert(runtime) %{ /* Contract support */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentOutOfRangeException, msg, ""); return nullreturn; } else %} swig-3.0.12/Lib/csharp/std_string.i0000664000175000017500000000614713042756442016765 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a C# String and are passed around by value. * * To use non-const std::string references use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; // string %typemap(ctype) string "char *" %typemap(imtype) string "string" %typemap(cstype) string "string" %typemap(csdirectorin) string "$iminput" %typemap(csdirectorout) string "$cscall" %typemap(in, canthrow=1) string %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $1.assign($input); %} %typemap(out) string %{ $result = SWIG_csharp_string_callback($1.c_str()); %} %typemap(directorout, canthrow=1) string %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $result.assign($input); %} %typemap(directorin) string %{ $input = SWIG_csharp_string_callback($1.c_str()); %} %typemap(csin) string "$csinput" %typemap(csout, excode=SWIGEXCODE) string { string ret = $imcall;$excode return ret; } %typemap(typecheck) string = char *; %typemap(throws, canthrow=1) string %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str()); return $null; %} // const string & %typemap(ctype) const string & "char *" %typemap(imtype) const string & "string" %typemap(cstype) const string & "string" %typemap(csdirectorin) const string & "$iminput" %typemap(csdirectorout) const string & "$cscall" %typemap(in, canthrow=1) const string & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } $*1_ltype $1_str($input); $1 = &$1_str; %} %typemap(out) const string & %{ $result = SWIG_csharp_string_callback($1->c_str()); %} %typemap(csin) const string & "$csinput" %typemap(csout, excode=SWIGEXCODE) const string & { string ret = $imcall;$excode return ret; } %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if (!$input) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "null string", 0); return $null; } /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $input; $result = &$1_str; %} %typemap(directorin) const string & %{ $input = SWIG_csharp_string_callback($1.c_str()); %} %typemap(csvarin, excode=SWIGEXCODE2) const string & %{ set { $imcall;$excode } %} %typemap(csvarout, excode=SWIGEXCODE2) const string & %{ get { string ret = $imcall;$excode return ret; } %} %typemap(typecheck) const string & = char *; %typemap(throws, canthrow=1) const string & %{ SWIG_CSharpSetPendingException(SWIG_CSharpApplicationException, $1.c_str()); return $null; %} } swig-3.0.12/Lib/csharp/std_map.i0000664000175000017500000002523613042756442016234 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map< K, T, C > * * The C# wrapper is made to look and feel like a C# System.Collections.Generic.IDictionary<>. * * Using this wrapper is fairly simple. For example, to create a map from integers to doubles use: * * %include * %template(MapIntDouble) std::map * * Notes: * 1) IEnumerable<> is implemented in the proxy class which is useful for using LINQ with * C++ std::map wrappers. * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on the real file contents! * ----------------------------------------------------------------------------- */ %{ #include #include #include %} /* K is the C++ key type, T is the C++ value type */ %define SWIG_STD_MAP_INTERNAL(K, T, C) %typemap(csinterfaces) std::map< K, T, C > "global::System.IDisposable \n , global::System.Collections.Generic.IDictionary<$typemap(cstype, K), $typemap(cstype, T)>\n"; %proxycode %{ public $typemap(cstype, T) this[$typemap(cstype, K) key] { get { return getitem(key); } set { setitem(key, value); } } public bool TryGetValue($typemap(cstype, K) key, out $typemap(cstype, T) value) { if (this.ContainsKey(key)) { value = this[key]; return true; } value = default($typemap(cstype, T)); return false; } public int Count { get { return (int)size(); } } public bool IsReadOnly { get { return false; } } public global::System.Collections.Generic.ICollection<$typemap(cstype, K)> Keys { get { global::System.Collections.Generic.ICollection<$typemap(cstype, K)> keys = new global::System.Collections.Generic.List<$typemap(cstype, K)>(); int size = this.Count; if (size > 0) { global::System.IntPtr iter = create_iterator_begin(); for (int i = 0; i < size; i++) { keys.Add(get_next_key(iter)); } destroy_iterator(iter); } return keys; } } public global::System.Collections.Generic.ICollection<$typemap(cstype, T)> Values { get { global::System.Collections.Generic.ICollection<$typemap(cstype, T)> vals = new global::System.Collections.Generic.List<$typemap(cstype, T)>(); foreach (global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> pair in this) { vals.Add(pair.Value); } return vals; } } public void Add(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { Add(item.Key, item.Value); } public bool Remove(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { if (Contains(item)) { return Remove(item.Key); } else { return false; } } public bool Contains(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> item) { if (this[item.Key] == item.Value) { return true; } else { return false; } } public void CopyTo(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>[] array) { CopyTo(array, 0); } public void CopyTo(global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>[] array, int arrayIndex) { if (array == null) throw new global::System.ArgumentNullException("array"); if (arrayIndex < 0) throw new global::System.ArgumentOutOfRangeException("arrayIndex", "Value is less than zero"); if (array.Rank > 1) throw new global::System.ArgumentException("Multi dimensional array.", "array"); if (arrayIndex+this.Count > array.Length) throw new global::System.ArgumentException("Number of elements to copy is too large."); global::System.Collections.Generic.IList<$typemap(cstype, K)> keyList = new global::System.Collections.Generic.List<$typemap(cstype, K)>(this.Keys); for (int i = 0; i < keyList.Count; i++) { $typemap(cstype, K) currentKey = keyList[i]; array.SetValue(new global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>(currentKey, this[currentKey]), arrayIndex+i); } } global::System.Collections.Generic.IEnumerator> global::System.Collections.Generic.IEnumerable>.GetEnumerator() { return new $csclassnameEnumerator(this); } global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() { return new $csclassnameEnumerator(this); } public $csclassnameEnumerator GetEnumerator() { return new $csclassnameEnumerator(this); } // Type-safe enumerator /// Note that the IEnumerator documentation requires an InvalidOperationException to be thrown /// whenever the collection is modified. This has been done for changes in the size of the /// collection but not when one of the elements of the collection is modified as it is a bit /// tricky to detect unmanaged code that modifies the collection under our feet. public sealed class $csclassnameEnumerator : global::System.Collections.IEnumerator, global::System.Collections.Generic.IEnumerator> { private $csclassname collectionRef; private global::System.Collections.Generic.IList<$typemap(cstype, K)> keyCollection; private int currentIndex; private object currentObject; private int currentSize; public $csclassnameEnumerator($csclassname collection) { collectionRef = collection; keyCollection = new global::System.Collections.Generic.List<$typemap(cstype, K)>(collection.Keys); currentIndex = -1; currentObject = null; currentSize = collectionRef.Count; } // Type-safe iterator Current public global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)> Current { get { if (currentIndex == -1) throw new global::System.InvalidOperationException("Enumeration not started."); if (currentIndex > currentSize - 1) throw new global::System.InvalidOperationException("Enumeration finished."); if (currentObject == null) throw new global::System.InvalidOperationException("Collection modified."); return (global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>)currentObject; } } // Type-unsafe IEnumerator.Current object global::System.Collections.IEnumerator.Current { get { return Current; } } public bool MoveNext() { int size = collectionRef.Count; bool moveOkay = (currentIndex+1 < size) && (size == currentSize); if (moveOkay) { currentIndex++; $typemap(cstype, K) currentKey = keyCollection[currentIndex]; currentObject = new global::System.Collections.Generic.KeyValuePair<$typemap(cstype, K), $typemap(cstype, T)>(currentKey, collectionRef[currentKey]); } else { currentObject = null; } return moveOkay; } public void Reset() { currentIndex = -1; currentObject = null; if (collectionRef.Count != currentSize) { throw new global::System.InvalidOperationException("Collection modified."); } } public void Dispose() { currentIndex = -1; currentObject = null; } } %} public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map< K, T, C > &other); size_type size() const; bool empty() const; %rename(Clear) clear; void clear(); %extend { const mapped_type& getitem(const key_type& key) throw (std::out_of_range) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) return iter->second; else throw std::out_of_range("key not found"); } void setitem(const key_type& key, const mapped_type& x) { (*$self)[key] = x; } bool ContainsKey(const key_type& key) { std::map< K, T, C >::iterator iter = $self->find(key); return iter != $self->end(); } void Add(const key_type& key, const mapped_type& val) throw (std::out_of_range) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) throw std::out_of_range("key already exists"); $self->insert(std::pair< K, T >(key, val)); } bool Remove(const key_type& key) { std::map< K, T, C >::iterator iter = $self->find(key); if (iter != $self->end()) { $self->erase(iter); return true; } return false; } // create_iterator_begin(), get_next_key() and destroy_iterator work together to provide a collection of keys to C# %apply void *VOID_INT_PTR { std::map< K, T, C >::iterator *create_iterator_begin } %apply void *VOID_INT_PTR { std::map< K, T, C >::iterator *swigiterator } std::map< K, T, C >::iterator *create_iterator_begin() { return new std::map< K, T, C >::iterator($self->begin()); } const key_type& get_next_key(std::map< K, T, C >::iterator *swigiterator) { std::map< K, T, C >::iterator iter = *swigiterator; (*swigiterator)++; return (*iter).first; } void destroy_iterator(std::map< K, T, C >::iterator *swigiterator) { delete swigiterator; } } %enddef %csmethodmodifiers std::map::size "private" %csmethodmodifiers std::map::getitem "private" %csmethodmodifiers std::map::setitem "private" %csmethodmodifiers std::map::create_iterator_begin "private" %csmethodmodifiers std::map::get_next_key "private" %csmethodmodifiers std::map::destroy_iterator "private" // Default implementation namespace std { template > class map { SWIG_STD_MAP_INTERNAL(K, T, C) }; } // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef swig-3.0.12/Lib/csharp/swiginterface.i0000664000175000017500000000606513042756442017436 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swiginterface.i * * SWIG interface feature and typemaps implementation providing: * %interface * %interface_impl * %interface_custom * ----------------------------------------------------------------------------- */ %define INTERFACE_TYPEMAPS(CTYPE...) %typemap(cstype) CTYPE "$&csinterfacename" %typemap(cstype) CTYPE *, CTYPE [], CTYPE & "$csinterfacename" %typemap(cstype) CTYPE *const& "$*csinterfacename" %typemap(csin) CTYPE, CTYPE & "$csinput.GetInterfaceCPtr()" %typemap(csin) CTYPE *, CTYPE *const&, CTYPE [] "$csinput == null ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : $csinput.GetInterfaceCPtr()" %typemap(csout, excode=SWIGEXCODE) CTYPE { $&csclassname ret = new $&csclassname($imcall, true);$excode return ($&csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE & { $csclassname ret = new $csclassname($imcall, $owner);$excode return ($csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE *, CTYPE [] { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, $owner);$excode return ($csinterfacename)ret; } %typemap(csout, excode=SWIGEXCODE) CTYPE *const& { global::System.IntPtr cPtr = $imcall; $*csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $*csclassname(cPtr, $owner);$excode return ($*csinterfacename)ret; } %typemap(csdirectorin) CTYPE "($&csinterfacename)new $&csclassname($iminput, true)" %typemap(csdirectorin) CTYPE & "($csinterfacename)new $csclassname($iminput, false)" %typemap(csdirectorin) CTYPE *, CTYPE [] "($iminput == global::System.IntPtr.Zero) ? null : ($csinterfacename)new $csclassname($iminput, false)" %typemap(csdirectorin) CTYPE *const& "($iminput == global::System.IntPtr.Zero) ? null : ($*csinterfacename)new $*csclassname($iminput, false)" %typemap(csdirectorout) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "$cscall.GetInterfaceCPtr()" %typemap(csinterfacecode, declaration=" [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]\n global::System.Runtime.InteropServices.HandleRef GetInterfaceCPtr();\n", cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{ [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] global::System.Runtime.InteropServices.HandleRef $interfacename.GetInterfaceCPtr() { return new global::System.Runtime.InteropServices.HandleRef(this, $imclassname.$csclazzname$interfacename_GetInterfaceCPtr(swigCPtr.Handle)); } %} %enddef %define %interface(CTYPE...) %feature("interface", name="%sSwigInterface") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_impl(CTYPE...) %rename("%sSwigImpl") CTYPE; %feature("interface", name="%(rstrip:[SwigImpl])s") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_custom(PROXY, INTERFACE, CTYPE...) %rename(PROXY) CTYPE; %feature("interface", name=INTERFACE) CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef swig-3.0.12/Lib/csharp/boost_shared_ptr.i0000664000175000017500000002604313042756442020143 0ustar williamwilliam// Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_SHARED_PTR_TYPEMAPS #define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(internal, internal, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0; if (!argp) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "Attempt to dereference null $1_type", 0); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ $result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); if (!$1) { SWIG_CSharpSetPendingExceptionArgument(SWIG_CSharpArgumentNullException, "$1_type reference is null", 0); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) $1 = *($&1_ltype)$input; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $result = $1 ? new $1_ltype($1) : 0; %} // shared_ptr by reference %typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $result = *$1 ? new $*1_ltype(*$1) : 0; %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out, fragment="SWIG_null_deleter") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0; if ($owner) delete $1; %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void *" %typemap (imtype, out="global::System.IntPtr") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "global::System.Runtime.InteropServices.HandleRef" %typemap (cstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(cstype, TYPE)" %typemap(csin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(cstype, TYPE).getCPtr($csinput)" %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE & { $typemap(cstype, TYPE) ret = new $typemap(cstype, TYPE)($imcall, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) CONST TYPE * { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csout, excode=SWIGEXCODE) TYPE *CONST& { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %typemap(csvarout, excode=SWIGEXCODE2) CONST TYPE & %{ get { $csclassname ret = new $csclassname($imcall, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) CONST TYPE * %{ get { global::System.IntPtr cPtr = $imcall; $csclassname ret = (cPtr == global::System.IntPtr.Zero) ? null : new $csclassname(cPtr, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ get { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %} %typemap(csvarout, excode=SWIGEXCODE2) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ get { global::System.IntPtr cPtr = $imcall; $typemap(cstype, TYPE) ret = (cPtr == global::System.IntPtr.Zero) ? null : new $typemap(cstype, TYPE)(cPtr, true);$excode return ret; } %} // Proxy classes (base classes, ie, not derived classes) %typemap(csbody) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnBase; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} // Derived proxy classes %typemap(csbody_derived) TYPE %{ private global::System.Runtime.InteropServices.HandleRef swigCPtr; private bool swigCMemOwnDerived; PTRCTOR_VISIBILITY $csclassname(global::System.IntPtr cPtr, bool cMemoryOwn) : base($imclassname.$csclazznameSWIGSmartPtrUpcast(cPtr), true) { swigCMemOwnDerived = cMemoryOwn; swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr); } CPTR_VISIBILITY static global::System.Runtime.InteropServices.HandleRef getCPtr($csclassname obj) { return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr; } %} %typemap(csdestruct, methodname="Dispose", methodmodifiers="public") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); } } %typemap(csdestruct_derived, methodname="Dispose", methodmodifiers="public") TYPE { lock(this) { if (swigCPtr.Handle != global::System.IntPtr.Zero) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $imcall; } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } global::System.GC.SuppressFinalize(this); base.Dispose(); } } %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/linkruntime.c0000664000175000017500000000100013042756442015637 0ustar williamwilliam#ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif static void *ptr = 0; SWIGEXPORT void * SWIG_ReturnGlobalTypeList(void *t) { if (!ptr && !t) ptr = t; return ptr; } swig-3.0.12/Lib/guile/0000775000175000017500000000000013042756442014250 5ustar williamwilliamswig-3.0.12/Lib/guile/std_deque.i0000664000175000017500000000003413042756442016374 0ustar williamwilliam%include swig-3.0.12/Lib/guile/common.scm0000664000175000017500000000452013042756442016245 0ustar williamwilliam;;;************************************************************************ ;;;*common.scm ;;;* ;;;* This file contains generic SWIG GOOPS classes for generated ;;;* GOOPS file support ;;;************************************************************************ (define-module (Swig swigrun)) (define-module (Swig common) #:use-module (oop goops) #:use-module (Swig swigrun)) (define-class () (new-function #:init-value #f)) (define-method (initialize (class ) initargs) (slot-set! class 'new-function (get-keyword #:new-function initargs #f)) (next-method)) (define-class () (swig-smob #:init-value #f) #:metaclass ) (define-method (initialize (obj ) initargs) (next-method) (slot-set! obj 'swig-smob (let ((arg (get-keyword #:init-smob initargs #f))) (if arg arg (let ((ret (apply (slot-ref (class-of obj) 'new-function) (get-keyword #:args initargs '())))) ;; if the class is registered with runtime environment, ;; new-Function will return a goops class. In that case, extract the smob ;; from that goops class and set it as the current smob. (if (slot-exists? ret 'swig-smob) (slot-ref ret 'swig-smob) ret)))))) (define (display-address o file) (display (number->string (object-address o) 16) file)) (define (display-pointer-address o file) ;; Don't fail if the function SWIG-PointerAddress is not present. (let ((address (false-if-exception (SWIG-PointerAddress o)))) (if address (begin (display " @ " file) (display (number->string address 16) file))))) (define-method (write (o ) file) ;; We display _two_ addresses to show the object's identity: ;; * first the address of the GOOPS proxy object, ;; * second the pointer address. ;; The reason is that proxy objects are created and discarded on the ;; fly, so different proxy objects for the same C object will appear. (let ((class (class-of o))) (if (slot-bound? class 'name) (begin (display "#<" file) (display (class-name class) file) (display #\space file) (display-address o file) (display-pointer-address o file) (display ">" file)) (next-method)))) (export ) ;;; common.scm ends here swig-3.0.12/Lib/guile/std_vector.i0000664000175000017500000004066413042756442016610 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Guile as much as possible, namely, to allow the user to pass and // be returned Guile vectors or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Guile sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Guile vector of T:s // is returned which is most easily used in other Guile functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { %typemap(in) vector { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); $1 = std::vector< T >(size); for (unsigned long i=0; i(); } else if (scm_is_pair($input)) { SCM head, tail; $1 = std::vector< T >(); tail = $input; while (!scm_is_null(tail)) { head = SCM_CAR(tail); tail = SCM_CDR(tail); $1.push_back(*((T*)SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::vector< T >(); $1 = &temp; SCM head, tail; tail = $input; while (!scm_is_null(tail)) { head = SCM_CAR(tail); tail = SCM_CDR(tail); temp.push_back(*((T*) SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) vector { $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED); for (unsigned int i=0; i<$1.size(); i++) { T* x = new T((($1_type &)$1)[i]); scm_vector_set_x($result,scm_from_long(i), SWIG_NewPointerObj(x, $descriptor(T *), 1)); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); T* x; if (SWIG_ConvertPtr(o,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ T* x; SCM head = SCM_CAR($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; SCM o = scm_vector_ref($input,scm_from_ulong(0)); if (SWIG_ConvertPtr(o,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ T* x; SCM head = SCM_CAR($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector< T >* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } public: vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector&); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } const T& ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); $1 = std::vector< T >(size); for (unsigned long i=0; i(); } else if (scm_is_pair($input)) { SCM v = scm_vector($input); unsigned long size = scm_c_vector_length(v); $1 = std::vector< T >(size); for (unsigned long i=0; i& (std::vector temp), const vector* (std::vector temp) { if (scm_is_vector($input)) { unsigned long size = scm_c_vector_length($input); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i(); $1 = &temp; } else if (scm_is_pair($input)) { SCM v = scm_vector($input); unsigned long size = scm_c_vector_length(v); temp = std::vector< T >(size); $1 = &temp; for (unsigned long i=0; i { $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED); for (unsigned int i=0; i<$1.size(); i++) { SCM x = CONVERT_TO((($1_type &)$1)[i]); scm_vector_set_x($result,scm_from_long(i),x); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); $1 = CHECK(o) ? 1 : 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ SCM head = SCM_CAR($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector< T >* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) ? 1 : 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (scm_is_vector($input)) { unsigned int size = scm_c_vector_length($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ SCM o = scm_vector_ref($input,scm_from_ulong(0)); $1 = CHECK(o) ? 1 : 0; } } else if (scm_is_null($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ SCM head = SCM_CAR($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector< T >* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) ? 1 : 0; } } public: vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector&); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* In the code below, use guile 2.0 compatible functions where possible. Functions that don't exist in older versions will be mapped to a deprecated equivalent for those versions only */ #if defined (SCM_MAJOR_VERSION) && (SCM_MAJOR_VERSION < 2) static SCM scm_module_variable (SCM module, SCM sym) { return scm_sym2var (sym, scm_module_lookup_closure (module), SCM_BOOL_F); } #endif #if SCM_MAJOR_VERSION >= 2 /* scm_c_define_gsubr takes a different parameter type depending on the guile version */ typedef scm_t_subr swig_guile_proc; #else typedef SCM (*swig_guile_proc)(); #endif typedef SCM (*guile_destructor)(SCM); typedef struct swig_guile_clientdata { guile_destructor destroy; SCM goops_class; } swig_guile_clientdata; #if SCM_MAJOR_VERSION <= 2 #define scm_to_utf8_string scm_to_locale_string #define scm_from_utf8_string scm_from_locale_string #endif #define SWIG_scm2str(s) \ SWIG_Guile_scm2newstr(s, NULL) #define SWIG_str02scm(str) \ str ? scm_from_utf8_string(str) : SCM_BOOL_F # define SWIG_malloc(size) \ scm_malloc(size) # define SWIG_free(mem) \ free(mem) #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_Guile_ConvertPtr(s, result, type, flags) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_Guile_MustGetPtr(s, type, argnum, flags, FUNC_NAME) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_Guile_NewPointerObj((void*)ptr, type, owner) #define SWIG_PointerAddress(object) \ SWIG_Guile_PointerAddress(object) #define SWIG_PointerType(object) \ SWIG_Guile_PointerType(object) #define SWIG_IsPointerOfType(object, type) \ SWIG_Guile_IsPointerOfType(object, type) #define SWIG_IsPointer(object) \ SWIG_Guile_IsPointer(object) #define SWIG_contract_assert(expr, msg) \ if (!(expr)) \ scm_error(scm_from_locale_symbol("swig-contract-assertion-failed"), \ (char *) FUNC_NAME, (char *) msg, \ SCM_EOL, SCM_BOOL_F); else /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) \ SWIG_Guile_ConvertMember(obj, ptr, sz, ty, FUNC_NAME) #define SWIG_NewMemberObj(ptr, sz, type) \ SWIG_Guile_NewMemberObj(ptr, sz, type, FUNC_NAME) /* Runtime API */ static swig_module_info *SWIG_Guile_GetModule(void *SWIGUNUSEDPARM(clientdata)); #define SWIG_GetModule(clientdata) SWIG_Guile_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Guile_SetModule(pointer) SWIGINTERN char * SWIG_Guile_scm2newstr(SCM str, size_t *len) { #define FUNC_NAME "SWIG_Guile_scm2newstr" char *ret; SCM_ASSERT (scm_is_string(str), str, 1, FUNC_NAME); ret = scm_to_utf8_string(str); if (!ret) return NULL; if (len) *len = strlen(ret) - 1; return ret; #undef FUNC_NAME } static int swig_initialized = 0; static scm_t_bits swig_tag = 0; static scm_t_bits swig_collectable_tag = 0; static scm_t_bits swig_destroyed_tag = 0; static scm_t_bits swig_member_function_tag = 0; static SCM swig_make_func = SCM_EOL; static SCM swig_keyword = SCM_EOL; static SCM swig_symbol = SCM_EOL; #define SWIG_Guile_GetSmob(x) \ ( !scm_is_null(x) && SCM_INSTANCEP(x) && scm_is_true(scm_slot_exists_p(x, swig_symbol)) \ ? scm_slot_ref(x, swig_symbol) : (x) ) SWIGINTERN SCM SWIG_Guile_NewPointerObj(void *ptr, swig_type_info *type, int owner) { if (ptr == NULL) return SCM_EOL; else { SCM smob; swig_guile_clientdata *cdata = (swig_guile_clientdata *) type->clientdata; if (owner) SCM_NEWSMOB2(smob, swig_collectable_tag, ptr, (void *) type); else SCM_NEWSMOB2(smob, swig_tag, ptr, (void *) type); if (!cdata || SCM_NULLP(cdata->goops_class) || swig_make_func == SCM_EOL ) { return smob; } else { /* the scm_make() C function only handles the creation of gf, methods and classes (no instances) the (make ...) function is later redefined in goops.scm. So we need to call that Scheme function. */ return scm_apply(swig_make_func, scm_list_3(cdata->goops_class, swig_keyword, smob), SCM_EOL); } } } SWIGINTERN unsigned long SWIG_Guile_PointerAddress(SCM object) { SCM smob = SWIG_Guile_GetSmob(object); if (SCM_NULLP(smob)) return 0; else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_destroyed_tag, smob)) { return (unsigned long) (void *) SCM_CELL_WORD_1(smob); } else scm_wrong_type_arg("SWIG-Guile-PointerAddress", 1, object); } SWIGINTERN swig_type_info * SWIG_Guile_PointerType(SCM object) { SCM smob = SWIG_Guile_GetSmob(object); if (SCM_NULLP(smob)) return NULL; else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob) || SCM_SMOB_PREDICATE(swig_destroyed_tag, smob)) { return (swig_type_info *) SCM_CELL_WORD_2(smob); } else scm_wrong_type_arg("SWIG-Guile-PointerType", 1, object); } SWIGINTERN int SWIG_Guile_ConvertPtr(SCM s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; swig_type_info *from; SCM smob = SWIG_Guile_GetSmob(s); if (SCM_NULLP(smob)) { *result = NULL; return SWIG_OK; #if SCM_MAJOR_VERSION >= 2 } else if (SCM_POINTER_P(s)) { *result = SCM_POINTER_VALUE(s); return SWIG_OK; #endif /* if SCM_MAJOR_VERSION >= 2 */ } else if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob)) { /* we do not accept smobs representing destroyed pointers */ from = (swig_type_info *) SCM_CELL_WORD_2(smob); if (!from) return SWIG_ERROR; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, (void *) SCM_CELL_WORD_1(smob), &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return SWIG_OK; } else { return SWIG_ERROR; } } else { *result = (void *) SCM_CELL_WORD_1(smob); return SWIG_OK; } } return SWIG_ERROR; } SWIGINTERNINLINE void * SWIG_Guile_MustGetPtr (SCM s, swig_type_info *type, int argnum, int flags, const char *func_name) { void *result; int res = SWIG_Guile_ConvertPtr(s, &result, type, flags); if (!SWIG_IsOK(res)) { /* type mismatch */ scm_wrong_type_arg((char *) func_name, argnum, s); } return result; } SWIGINTERNINLINE int SWIG_Guile_IsPointerOfType (SCM s, swig_type_info *type) { void *result; if (SWIG_Guile_ConvertPtr(s, &result, type, 0)) { /* type mismatch */ return 0; } else return 1; } SWIGINTERNINLINE int SWIG_Guile_IsPointer (SCM s) { /* module might not be initialized yet, so initialize it */ SWIG_GetModule(0); return SWIG_Guile_IsPointerOfType (s, NULL); } /* Mark a pointer object non-collectable */ SWIGINTERN void SWIG_Guile_MarkPointerNoncollectable(SCM s) { SCM smob = SWIG_Guile_GetSmob(s); if (!SCM_NULLP(smob)) { if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob)) { SCM_SET_CELL_TYPE(smob, swig_tag); } else scm_wrong_type_arg(NULL, 0, s); } } /* Mark a pointer object destroyed */ SWIGINTERN void SWIG_Guile_MarkPointerDestroyed(SCM s) { SCM smob = SWIG_Guile_GetSmob(s); if (!SCM_NULLP(smob)) { if (SCM_SMOB_PREDICATE(swig_tag, smob) || SCM_SMOB_PREDICATE(swig_collectable_tag, smob)) { SCM_SET_CELL_TYPE(smob, swig_destroyed_tag); } else scm_wrong_type_arg(NULL, 0, s); } } /* Member functions */ SWIGINTERN SCM SWIG_Guile_NewMemberObj(void *ptr, size_t sz, swig_type_info *type, const char *func_name) { SCM smob; void *copy = malloc(sz); memcpy(copy, ptr, sz); SCM_NEWSMOB2(smob, swig_member_function_tag, copy, (void *) type); return smob; } SWIGINTERN int SWIG_Guile_ConvertMember(SCM smob, void *ptr, size_t sz, swig_type_info *type, const char *func_name) { swig_cast_info *cast; swig_type_info *from; if (SCM_SMOB_PREDICATE(swig_member_function_tag, smob)) { from = (swig_type_info *) SCM_CELL_WORD_2(smob); if (!from) return SWIG_ERROR; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (!cast) return SWIG_ERROR; } memcpy(ptr, (void *) SCM_CELL_WORD_1(smob), sz); return SWIG_OK; } return SWIG_ERROR; } /* Init */ SWIGINTERN int print_swig_aux (SCM swig_smob, SCM port, scm_print_state *pstate, const char *attribute) { swig_type_info *type; type = (swig_type_info *) SCM_CELL_WORD_2(swig_smob); if (type) { scm_puts((char *) "#<", port); scm_puts((char *) attribute, port); scm_puts((char *) "swig-pointer ", port); scm_puts((char *) SWIG_TypePrettyName(type), port); scm_puts((char *) " ", port); scm_intprint((long) SCM_CELL_WORD_1(swig_smob), 16, port); scm_puts((char *) ">", port); /* non-zero means success */ return 1; } else { return 0; } } SWIGINTERN int print_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, ""); } SWIGINTERN int print_collectable_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, "collectable-"); } SWIGINTERN int print_destroyed_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { return print_swig_aux(swig_smob, port, pstate, "destroyed-"); } SWIGINTERN int print_member_function_swig (SCM swig_smob, SCM port, scm_print_state *pstate) { swig_type_info *type; type = (swig_type_info *) SCM_CELL_WORD_2(swig_smob); if (type) { scm_puts((char *) "#<", port); scm_puts((char *) "swig-member-function-pointer ", port); scm_puts((char *) SWIG_TypePrettyName(type), port); scm_puts((char *) " >", port); /* non-zero means success */ return 1; } else { return 0; } } SWIGINTERN SCM equalp_swig (SCM A, SCM B) { if (SCM_CELL_WORD_0(A) == SCM_CELL_WORD_0(B) && SCM_CELL_WORD_1(A) == SCM_CELL_WORD_1(B) && SCM_CELL_WORD_2(A) == SCM_CELL_WORD_2(B)) return SCM_BOOL_T; else return SCM_BOOL_F; } SWIGINTERN size_t free_swig(SCM A) { swig_type_info *type = (swig_type_info *) SCM_CELL_WORD_2(A); if (type) { if (type->clientdata && ((swig_guile_clientdata *)type->clientdata)->destroy) ((swig_guile_clientdata *)type->clientdata)->destroy(A); } return 0; } SWIGINTERN size_t free_swig_member_function(SCM A) { free((swig_type_info *) SCM_CELL_WORD_1(A)); return 0; } SWIGINTERN int ensure_smob_tag(SCM swig_module, scm_t_bits *tag_variable, const char *smob_name, const char *scheme_variable_name) { SCM variable = scm_module_variable(swig_module, scm_from_locale_symbol(scheme_variable_name)); if (scm_is_false(variable)) { *tag_variable = scm_make_smob_type((char*)scheme_variable_name, 0); scm_c_module_define(swig_module, scheme_variable_name, scm_from_ulong(*tag_variable)); return 1; } else { *tag_variable = scm_to_ulong(SCM_VARIABLE_REF(variable)); return 0; } } SWIGINTERN SCM SWIG_Guile_Init () { static SCM swig_module; if (swig_initialized) return swig_module; swig_initialized = 1; swig_module = scm_c_resolve_module("Swig swigrun"); if (ensure_smob_tag(swig_module, &swig_tag, "swig-pointer", "swig-pointer-tag")) { scm_set_smob_print(swig_tag, print_swig); scm_set_smob_equalp(swig_tag, equalp_swig); } if (ensure_smob_tag(swig_module, &swig_collectable_tag, "collectable-swig-pointer", "collectable-swig-pointer-tag")) { scm_set_smob_print(swig_collectable_tag, print_collectable_swig); scm_set_smob_equalp(swig_collectable_tag, equalp_swig); scm_set_smob_free(swig_collectable_tag, free_swig); } if (ensure_smob_tag(swig_module, &swig_destroyed_tag, "destroyed-swig-pointer", "destroyed-swig-pointer-tag")) { scm_set_smob_print(swig_destroyed_tag, print_destroyed_swig); scm_set_smob_equalp(swig_destroyed_tag, equalp_swig); } if (ensure_smob_tag(swig_module, &swig_member_function_tag, "swig-member-function-pointer", "swig-member-function-pointer-tag")) { scm_set_smob_print(swig_member_function_tag, print_member_function_swig); scm_set_smob_free(swig_member_function_tag, free_swig_member_function); } swig_make_func = scm_permanent_object( scm_variable_ref(scm_c_module_lookup(scm_c_resolve_module("oop goops"), "make"))); swig_keyword = scm_permanent_object(scm_from_locale_keyword((char*) "init-smob")); swig_symbol = scm_permanent_object(scm_from_locale_symbol("swig-smob")); #ifdef SWIG_INIT_RUNTIME_MODULE SWIG_INIT_RUNTIME_MODULE #endif return swig_module; } SWIGINTERN swig_module_info * SWIG_Guile_GetModule(void *SWIGUNUSEDPARM(clientdata)) { SCM module = SWIG_Guile_Init(); SCM variable = scm_module_variable(module, scm_from_locale_symbol("swig-type-list-address" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME)); if (scm_is_false(variable)) { return NULL; } else { return (swig_module_info *) scm_to_ulong(SCM_VARIABLE_REF(variable)); } } SWIGINTERN void SWIG_Guile_SetModule(swig_module_info *swig_module) { SCM module = SWIG_Guile_Init(); scm_module_define(module, scm_from_locale_symbol("swig-type-list-address" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME), scm_from_ulong((unsigned long) swig_module)); } SWIGINTERN int SWIG_Guile_GetArgs (SCM *dest, SCM rest, int reqargs, int optargs, const char *procname) { int i; int num_args_passed = 0; for (i = 0; i 0) { $1_ltype i; $2 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * $1); for (i = 0; i<$1; i++) { SCM swig_scm_value = scm_vector_ref($input, scm_from_long(i)); $2[i] = SCM_TO_C_EXPR; } } else $2 = NULL; } %typemap(in, doc="$NAME is a list of " #SCM_TYPE " values") (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) { SCM_VALIDATE_LIST($argnum, $input); $1 = scm_to_ulong(scm_length($input)); if ($1 > 0) { $1_ltype i; SCM rest; $2 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * $1); for (i = 0, rest = $input; i<$1; i++, rest = SCM_CDR(rest)) { SCM swig_scm_value = SCM_CAR(rest); $2[i] = SCM_TO_C_EXPR; } } else $2 = NULL; } /* Do not check for NULL pointers (override checks). */ %typemap(check) (int VECTORLENINPUT, C_TYPE *VECTORINPUT), (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT), (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) "/* no check for NULL pointer */"; /* Discard the temporary array after the call. */ %typemap(freearg) (int VECTORLENINPUT, C_TYPE *VECTORINPUT), (size_t VECTORLENINPUT, C_TYPE *VECTORINPUT), (int LISTLENINPUT, C_TYPE *LISTINPUT), (size_t LISTLENINPUT, C_TYPE *LISTINPUT) {if ($2!=NULL) SWIG_free($2);} %enddef /* output */ %define TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) /* First we make temporary variables ARRAYLENTEMP and ARRAYTEMP, whose addresses we pass to the C function. We ignore both arguments for Scheme. */ %typemap(in,numinputs=0) (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) (int arraylentemp, C_TYPE *arraytemp), (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) (int arraylentemp, C_TYPE *arraytemp), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) (size_t arraylentemp, C_TYPE *arraytemp), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) (size_t arraylentemp, C_TYPE *arraytemp) %{ $1 = &arraylentemp; $2 = &arraytemp; %} /* In the ARGOUT typemaps, we convert the array into a vector or a list and append it to the results. */ %typemap(argout, doc="$NAME (a vector of " #SCM_TYPE " values)") (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT) { $*1_ltype i; SCM res = scm_make_vector(scm_from_long(*$1), SCM_BOOL_F); for (i = 0; i<*$1; i++) { C_TYPE swig_c_value = (*$2)[i]; SCM elt = C_TO_SCM_EXPR; scm_vector_set_x(res, scm_from_long(i), elt); } SWIG_APPEND_VALUE(res); } %typemap(argout, doc="$NAME (a list of " #SCM_TYPE " values)") (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) { int i; SCM res = SCM_EOL; for (i = ((int)(*$1)) - 1; i>=0; i--) { C_TYPE swig_c_value = (*$2)[i]; SCM elt = C_TO_SCM_EXPR; res = scm_cons(elt, res); } SWIG_APPEND_VALUE(res); } /* In the FREEARG typemaps, get rid of the C vector. (This can be overridden if you want to keep the C vector.) */ %typemap(freearg) (int *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (size_t *VECTORLENOUTPUT, C_TYPE **VECTOROUTPUT), (int *LISTLENOUTPUT, C_TYPE **LISTOUTPUT), (size_t *LISTLENOUTPUT, C_TYPE **LISTOUTPUT) { if ((*$2)!=NULL) free(*$2); } %enddef %define TYPEMAP_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_INPUT(C_TYPE, SCM_TO_C, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_OUTPUT(C_TYPE, C_TO_SCM, SCM_TYPE) TYPEMAP_LIST_VECTOR_OUTPUT_WITH_EXPR (C_TYPE, C_TO_SCM(swig_c_value), SCM_TYPE) %enddef %define TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) TYPEMAP_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), C_TO_SCM(swig_c_value), SCM_TYPE) %enddef /* We use the macro to define typemaps for some standard types. */ TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(bool, scm_is_true, scm_from_bool, boolean); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(int, scm_to_int, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(short, scm_to_int, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(long, scm_to_long, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(ptrdiff_t, scm_to_long, scm_from_long, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned int, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned short, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(unsigned long, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(size_t, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(float, scm_to_double, scm_from_double, real); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(double, scm_to_double, scm_from_double, real); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, SWIG_str02scm, string); TYPEMAP_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, SWIG_str02scm, string); /* For the char *, free all strings after converting */ %typemap(freearg) (int *VECTORLENOUTPUT, char ***VECTOROUTPUT), (size_t *VECTORLENOUTPUT, char ***VECTOROUTPUT), (int *LISTLENOUTPUT, char ***LISTOUTPUT), (size_t *LISTLENOUTPUT, char ***LISTOUTPUT), (int *VECTORLENOUTPUT, const char ***VECTOROUTPUT), (size_t *VECTORLENOUTPUT, const char ***VECTOROUTPUT), (int *LISTLENOUTPUT, const char ***LISTOUTPUT), (size_t *LISTLENOUTPUT, const char ***LISTOUTPUT) { if ((*$2)!=NULL) { int i; for (i = 0; i < *$1; i++) { if ((*$2)[i] != NULL) free((*$2)[i]); } free(*$2); } } %typemap(freearg) (int VECTORLENINPUT, char **VECTORINPUT), (size_t VECTORLENINPUT, char **VECTORINPUT), (int LISTLENINPUT, char **LISTINPUT), (size_t LISTLENINPUT, char **LISTINPUT), (int VECTORLENINPUT, const char **VECTORINPUT), (size_t VECTORLENINPUT, const char **VECTORINPUT), (int LISTLENINPUT, const char **LISTINPUT), (size_t LISTLENINPUT, const char **LISTINPUT) { if (($2)!=NULL) { int i; for (i = 0; i< $1; i++) if (($2)[i] != NULL) free(($2)[i]); free($2); } } /* Following is a macro that emits typemaps that are much more flexible. (They are also messier.) It supports multiple parallel lists and vectors (sharing one length argument each). TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) Supported calling conventions: func(int PARALLEL_VECTORLENINPUT, [const] C_TYPE *PARALLEL_VECTORINPUT, ...) or func([const] C_TYPE *PARALLEL_VECTORINPUT, ..., int PARALLEL_VECTORLENINPUT) func(int PARALLEL_LISTLENINPUT, [const] C_TYPE *PARALLEL_LISTINPUT, ...) or func([const] C_TYPE *PARALLEL_LISTINPUT, ..., int PARALLEL_LISTLENINPUT) func(int *PARALLEL_VECTORLENOUTPUT, C_TYPE **PARALLEL_VECTOROUTPUT, ...) or func(C_TYPE **PARALLEL_VECTOROUTPUT, int *PARALLEL_VECTORLENOUTPUT, ...) func(int *PARALLEL_LISTLENOUTPUT, C_TYPE **PARALLEL_LISTOUTPUT) or func(C_TYPE **PARALLEL_LISTOUTPUT, int *PARALLEL_LISTLENOUTPUT) It is also allowed to use "size_t PARALLEL_LISTLENINPUT" rather than "int PARALLEL_LISTLENINPUT". */ %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) /* input */ /* Passing data is a little complicated here; just remember: IGNORE typemaps come first, then IN, then CHECK. But if IGNORE is given, IN won't be used for this type. We need to "ignore" one of the parameters because there shall be only one argument on the Scheme side. Here we only initialize the array length to 0 but save its address for a later change. */ %typemap(in,numinputs=0) int PARALLEL_VECTORLENINPUT (int *_global_vector_length), size_t PARALLEL_VECTORLENINPUT (size_t *_global_vector_length) { $1 = 0; _global_vector_length = &$1; } %typemap(in,numinputs=0) int PARALLEL_LISTLENINPUT (int *_global_list_length), size_t PARALLEL_LISTLENINPUT (size_t *_global_list_length) { $1 = 0; _global_list_length = &$1; } /* All the work is done in IN. */ %typemap(in, doc="$NAME is a vector of " #SCM_TYPE " values") C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT { SCM_VALIDATE_VECTOR($argnum, $input); *_global_vector_length = scm_c_vector_length($input); if (*_global_vector_length > 0) { int i; $1 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * (*_global_vector_length)); for (i = 0; i<*_global_vector_length; i++) { SCM swig_scm_value = scm_vector_ref($input, scm_from_long(i)); $1[i] = SCM_TO_C_EXPR; } } else $1 = NULL; } %typemap(in, doc="$NAME is a list of " #SCM_TYPE " values") C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT { SCM_VALIDATE_LIST($argnum, $input); *_global_list_length = scm_to_ulong(scm_length($input)); if (*_global_list_length > 0) { int i; SCM rest; $1 = (C_TYPE *) SWIG_malloc(sizeof(C_TYPE) * (*_global_list_length)); for (i = 0, rest = $input; i<*_global_list_length; i++, rest = SCM_CDR(rest)) { SCM swig_scm_value = SCM_CAR(rest); $1[i] = SCM_TO_C_EXPR; } } else $1 = NULL; } /* Don't check for NULL pointers (override checks). */ %typemap(check) C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT, C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT "/* no check for NULL pointer */"; /* Discard the temporary array after the call. */ %typemap(freearg) C_TYPE *PARALLEL_VECTORINPUT, const C_TYPE *PARALLEL_VECTORINPUT, C_TYPE *PARALLEL_LISTINPUT, const C_TYPE *PARALLEL_LISTINPUT {if ($1!=NULL) SWIG_free($1);} %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) /* output */ /* First we make a temporary variable ARRAYLENTEMP, use its address as the ...LENOUTPUT argument for the C function and "ignore" the ...LENOUTPUT argument for Scheme. */ %typemap(in,numinputs=0) int *PARALLEL_VECTORLENOUTPUT (int _global_arraylentemp), size_t *PARALLEL_VECTORLENOUTPUT (size_t _global_arraylentemp), int *PARALLEL_LISTLENOUTPUT (int _global_arraylentemp), size_t *PARALLEL_LISTLENOUTPUT (size_t _global_arraylentemp) "$1 = &_global_arraylentemp;"; /* We also need to ignore the ...OUTPUT argument. */ %typemap(in,numinputs=0) C_TYPE **PARALLEL_VECTOROUTPUT (C_TYPE *arraytemp), C_TYPE **PARALLEL_LISTOUTPUT (C_TYPE *arraytemp) "$1 = &arraytemp;"; /* In the ARGOUT typemaps, we convert the array into a vector or a list and append it to the results. */ %typemap(argout, doc="$NAME (a vector of " #SCM_TYPE " values)") C_TYPE **PARALLEL_VECTOROUTPUT { int i; SCM res = scm_make_vector(scm_from_long(_global_arraylentemp), SCM_BOOL_F); for (i = 0; i<_global_arraylentemp; i++) { C_TYPE swig_c_value = (*$1)[i]; SCM elt = C_TO_SCM_EXPR; scm_vector_set_x(res, scm_from_long(i), elt); } SWIG_APPEND_VALUE(res); } %typemap(argout, doc="$NAME (a list of " #SCM_TYPE " values)") C_TYPE **PARALLEL_LISTOUTPUT { int i; SCM res = SCM_EOL; if (_global_arraylentemp > 0) { for (i = _global_arraylentemp - 1; i>=0; i--) { C_TYPE swig_c_value = (*$1)[i]; SCM elt = C_TO_SCM_EXPR; res = scm_cons(elt, res); } } SWIG_APPEND_VALUE(res); } /* In the FREEARG typemaps, get rid of the C vector. (This can be overridden if you want to keep the C vector.) */ %typemap(freearg) C_TYPE **PARALLEL_VECTOROUTPUT, C_TYPE **PARALLEL_LISTOUTPUT { if ((*$1)!=NULL) free(*$1); } %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR(C_TYPE, SCM_TO_C_EXPR, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR(C_TYPE, C_TO_SCM_EXPR, SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT(C_TYPE, SCM_TO_C, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT(C_TYPE, C_TO_SCM, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_OUTPUT_WITH_EXPR (C_TYPE, C_TO_SCM(swig_c_value), SCM_TYPE) %enddef %define TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(C_TYPE, SCM_TO_C, C_TO_SCM, SCM_TYPE) TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT_WITH_EXPR (C_TYPE, SCM_TO_C(swig_scm_value), C_TO_SCM(swig_c_value), SCM_TYPE) %enddef /* We use the macro to define typemaps for some standard types. */ TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(bool, scm_is_true, scm_from_bool, boolean); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(int, scm_to_int, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(short, scm_to_int, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(long, scm_to_long, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(ptrdiff_t, scm_to_long, scm_from_long, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned int, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned short, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(unsigned long, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(size_t, scm_to_ulong, scm_from_ulong, integer); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(float, scm_to_double, scm_from_double, real); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(double, scm_to_double, scm_from_double, real); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(char *, SWIG_scm2str, SWIG_str02scm, string); TYPEMAP_PARALLEL_LIST_VECTOR_INPUT_OUTPUT(const char *, SWIG_scm2str, SWIG_str02scm, string); %typemap(freearg) char **PARALLEL_LISTINPUT, char **PARALLEL_VECTORINPUT, const char **PARALLEL_LISTINPUT, const char **PARALLEL_VECTORINPUT { if (($1)!=NULL) { int i; for (i = 0; i<*_global_list_length; i++) if (($1)[i] != NULL) SWIG_free(($1)[i]); SWIG_free($1); } } %typemap(freearg) char ***PARALLEL_LISTOUTPUT, char ***PARALLEL_VECTOROUTPUT, const char ***PARALLEL_LISTOUTPUT, const char ***PARALLEL_VECTOROUTPUT { if ((*$1)!=NULL) { int i; for (i = 0; i<_global_arraylentemp; i++) if ((*$1)[i] != NULL) free((*$1)[i]); free(*$1); } } swig-3.0.12/Lib/guile/guile.i0000664000175000017500000000206413042756442015531 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guile.i * * SWIG Configuration File for Guile. * ----------------------------------------------------------------------------- */ /* Macro for inserting Scheme code into the stub */ #define %scheme %insert("scheme") #define %goops %insert("goops") /* Return-styles */ %pragma(guile) return_nothing_doc = "Returns unspecified." %pragma(guile) return_one_doc = "Returns $values." %define %values_as_list %pragma(guile) beforereturn = "" %pragma(guile) return_multi_doc = "Returns a list of $num_values values: $values." %enddef %values_as_list /* the default style */ %define %values_as_vector %pragma(guile) beforereturn = "GUILE_MAYBE_VECTOR" %pragma(guile) return_multi_doc = "Returns a vector of $num_values values: $values." %enddef %define %multiple_values %pragma(guile) beforereturn = "GUILE_MAYBE_VALUES" %pragma(guile) return_multi_doc = "Returns $num_values values: $values." %enddef #define GUILE_APPEND_RESULT SWIG_APPEND_VALUE %include swig-3.0.12/Lib/guile/Makefile0000664000175000017500000000003513042756442015706 0ustar williamwilliam co: co RCS/*.i* RCS/*.swg* swig-3.0.12/Lib/guile/extra-install.list0000664000175000017500000000004713042756442017735 0ustar williamwilliam# see top-level Makefile.in common.scm swig-3.0.12/Lib/guile/std_common.i0000664000175000017500000000111413042756442016561 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; #define SWIG_bool2scm(b) scm_from_bool(b ? 1 : 0) #define SWIG_string2scm(s) SWIG_str02scm(s.c_str()) %{ #include SWIGINTERNINLINE std::string SWIG_scm2string(SCM x) { char* temp; temp = SWIG_scm2str(x); std::string s(temp); if (temp) SWIG_free(temp); return s; } %} swig-3.0.12/Lib/guile/guile_scm.swg0000664000175000017500000000230613042756442016742 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guile_scm.swg * * This SWIG interface file is processed if the Guile module is run * with SCM_ flavor. * ----------------------------------------------------------------------------- */ #define SWIGGUILE_SCM %runtime "swigrun.swg" // Common C API type-checking code %runtime "guile_scm_run.swg" %include %runtime %{ #define GUILE_MAYBE_VALUES \ if (gswig_list_p) gswig_result = scm_values(gswig_result); #define GUILE_MAYBE_VECTOR \ if (gswig_list_p) gswig_result = scm_vector(gswig_result); #define SWIG_APPEND_VALUE(object) \ if (gswig_result == SCM_UNSPECIFIED) \ gswig_result = object; \ else { \ if (!gswig_list_p) { \ gswig_list_p = 1; \ gswig_result = scm_listify(gswig_result, object, SCM_UNDEFINED); \ } \ else \ gswig_result = scm_append(scm_listify(gswig_result, scm_listify(object, SCM_UNDEFINED), SCM_UNDEFINED)); \ } %} %insert(init) "swiginit.swg" %init %{ SWIG_GUILE_INIT_STATIC void SWIG_init(void) { SWIG_InitializeModule(0); SWIG_PropagateClientData(); %} swig-3.0.12/Lib/guile/swigrun.i0000664000175000017500000000170513042756442016123 0ustar williamwilliam/* -*- mode: c -*- */ %module swigrun #ifdef SWIGGUILE_SCM /* Hook the runtime module initialization into the shared initialization function SWIG_Guile_Init. */ %runtime %{ /* Hook the runtime module initialization into the shared initialization function SWIG_Guile_Init. */ #include #ifdef __cplusplus extern "C" #endif SCM scm_init_Swig_swigrun_module (void); #define SWIG_INIT_RUNTIME_MODULE scm_init_Swig_swigrun_module(); %} /* The runtime type system from common.swg */ typedef struct swig_type_info swig_type_info; const char * SWIG_TypeName(const swig_type_info *type); const char * SWIG_TypePrettyName(const swig_type_info *type); swig_type_info * SWIG_TypeQuery(const char *); /* Language-specific stuff */ %apply bool { int }; int SWIG_IsPointer(SCM object); int SWIG_IsPointerOfType(SCM object, swig_type_info *type); unsigned long SWIG_PointerAddress(SCM object); swig_type_info * SWIG_PointerType(SCM object); #endif swig-3.0.12/Lib/guile/std_except.i0000664000175000017500000000031213042756442016560 0ustar williamwilliam// TODO: STL exception handling // Note that the generic std_except.i file did not work %{ #include #include %} namespace std { %ignore exception; struct exception { }; } swig-3.0.12/Lib/guile/guilemain.i0000664000175000017500000000203413042756442016373 0ustar williamwilliam/* ----------------------------------------------------------------------------- * guilemain.i * * The main functions for a user augmented guile * version that can handle wrapped calls as generated by SWIG * ----------------------------------------------------------------------------- */ %{ #include #ifdef __cplusplus extern "C" { #endif /* Debugger interface (don't change the order of the following lines) */ #define GDB_TYPE SCM #include GDB_INTERFACE; static void inner_main(void *closure, int argc, char **argv) { #ifdef SWIGINIT SWIGINIT #else SWIG_init(); /* SWIG init function */ #endif scm_shell(argc, argv); /* scheme interpreter */ /* never reached: scm_shell will perform an exit */ } #ifdef __cplusplus } #endif int main(int argc, char **argv) { /* put any default initialisation code here: e.g. exit handlers */ scm_boot_guile(argc, argv, inner_main, 0); /* make a stack entry for the garbage collector */ return 0; /* never reached, but avoids a warning */ } %} swig-3.0.12/Lib/guile/typemaps.i0000664000175000017500000003665113042756442016277 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Guile-specific typemaps * ----------------------------------------------------------------------------- */ /* Pointers */ %typemap(in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(freearg) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] ""; %typemap(in) void * { $1 = ($1_ltype)SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(freearg) void * ""; %typemap(varin) SWIGTYPE * { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0); } %typemap(varin) SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [] { scm_wrong_type_arg((char *) FUNC_NAME, 1, $input); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, 0); } %typemap(varout) SWIGTYPE & { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(throws) SWIGTYPE { $<ype temp = new $ltype($1); scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(SWIG_NewPointerObj(temp, $&descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE & { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(SWIG_NewPointerObj(&$1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE && { scm_throw(gh_symbol2scm((char *) "swig-exception"), gh_list(SWIG_NewPointerObj(&$1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE * { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(SWIG_NewPointerObj($1, $descriptor, 1), SCM_UNDEFINED)); } %typemap(throws) SWIGTYPE [] { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(SWIG_NewPointerObj($1, $descriptor, 1), SCM_UNDEFINED)); } /* Change of object ownership, and interaction of destructor-like functions and the garbage-collector */ %typemap(in, doc="$NAME is of type <$type> and gets destroyed by the function") SWIGTYPE *DESTROYED { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(freearg) SWIGTYPE *DESTROYED { SWIG_Guile_MarkPointerDestroyed($input); } %typemap(in, doc="$NAME is of type <$type> and is consumed by the function") SWIGTYPE *CONSUMED { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, 0); SWIG_Guile_MarkPointerNoncollectable($input); } /* Pass-by-value */ %typemap(in) SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin) SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype((const $1_ltype&) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* Enums */ %typemap(in) enum SWIGTYPE { $1 = ($1_type) scm_to_int($input); } /* The complicated construction below needed to deal with anonymous enums, which cannot be cast to. */ %typemap(varin) enum SWIGTYPE { if (sizeof(int) != sizeof($1)) { scm_error(scm_from_locale_symbol("swig-error"), (char *) FUNC_NAME, (char *) "enum variable '$name' cannot be set", SCM_EOL, SCM_BOOL_F); } * (int *) &($1) = scm_to_int($input); } %typemap(out) enum SWIGTYPE { $result = scm_from_long((int)$1); } %typemap(varout) enum SWIGTYPE { $result = scm_from_long((int)$1); } %typemap(throws) enum SWIGTYPE { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(scm_from_long((int)$1), SCM_UNDEFINED)); } /* The SIMPLE_MAP_WITH_EXPR macro below defines the whole set of typemaps needed for simple types. -- SCM_TO_C_EXPR is a C expression that translates the Scheme value "swig_scm_value" to a C value. -- C_TO_SCM_EXPR is a C expression that translates the C value "swig_c_value" to a Scheme value. */ %define SIMPLE_MAP_WITH_EXPR(C_NAME, SCM_TO_C_EXPR, C_TO_SCM_EXPR, SCM_NAME) %typemap (in, doc="$NAME is of type <" #SCM_NAME ">") C_NAME { SCM swig_scm_value = $input; $1 = SCM_TO_C_EXPR; } %typemap (varin, doc="NEW-VALUE is of type <" #SCM_NAME ">") C_NAME { SCM swig_scm_value = $input; $1 = SCM_TO_C_EXPR; } %typemap (out, doc="<" #SCM_NAME ">") C_NAME { C_NAME swig_c_value = $1; $result = C_TO_SCM_EXPR; } %typemap (varout, doc="<" #SCM_NAME ">") C_NAME { C_NAME swig_c_value = $1; $result = C_TO_SCM_EXPR; } /* INPUT and OUTPUT */ %typemap (in, doc="$NAME is of type <" #SCM_NAME ">)") C_NAME *INPUT(C_NAME temp) { SCM swig_scm_value = $input; temp = (C_NAME) SCM_TO_C_EXPR; $1 = &temp; } %typemap (in,numinputs=0) C_NAME *OUTPUT (C_NAME temp) {$1 = &temp;} %typemap (argout,doc="$name (of type <" #SCM_NAME ">)") C_NAME *OUTPUT { C_NAME swig_c_value = *$1; SWIG_APPEND_VALUE(C_TO_SCM_EXPR); } %typemap (in) C_NAME *BOTH = C_NAME *INPUT; %typemap (argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap (in) C_NAME *INOUT = C_NAME *INPUT; %typemap (argout) C_NAME *INOUT = C_NAME *OUTPUT; /* Const primitive references. Passed by value */ %typemap(in, doc="$NAME is of type <" #SCM_NAME ">") const C_NAME & (C_NAME temp) { SCM swig_scm_value = $input; temp = SCM_TO_C_EXPR; $1 = &temp; } %typemap(out, doc="<" #SCM_NAME ">") const C_NAME & { C_NAME swig_c_value = *$1; $result = C_TO_SCM_EXPR; } /* Throw typemap */ %typemap(throws) C_NAME { C_NAME swig_c_value = $1; scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(C_TO_SCM_EXPR, SCM_UNDEFINED)); } %enddef /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. It generates slightly simpler code than the macro above, but it is only suitable for very simple conversion expressions. */ %define SIMPLE_MAP(C_NAME, SCM_TO_C, C_TO_SCM, SCM_NAME) %typemap (in, doc="$NAME is of type <" #SCM_NAME ">") C_NAME {$1 = ($1_ltype) SCM_TO_C($input);} %typemap (varin, doc="NEW-VALUE is of type <" #SCM_NAME ">") C_NAME {$1 = ($1_ltype) SCM_TO_C($input);} %typemap (out, doc="<" #SCM_NAME ">") C_NAME {$result = C_TO_SCM($1);} %typemap (varout, doc="<" #SCM_NAME ">") C_NAME {$result = C_TO_SCM($1);} /* INPUT and OUTPUT */ %typemap (in, doc="$NAME is of type <" #SCM_NAME ">)") C_NAME *INPUT(C_NAME temp), C_NAME &INPUT(C_NAME temp) { temp = (C_NAME) SCM_TO_C($input); $1 = &temp; } %typemap (in,numinputs=0) C_NAME *OUTPUT (C_NAME temp), C_NAME &OUTPUT(C_NAME temp) {$1 = &temp;} %typemap (argout,doc="$name (of type <" #SCM_NAME ">)") C_NAME *OUTPUT, C_NAME &OUTPUT {SWIG_APPEND_VALUE(C_TO_SCM(*$1));} %typemap (in) C_NAME *BOTH = C_NAME *INPUT; %typemap (argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap (in) C_NAME *INOUT = C_NAME *INPUT; %typemap (argout) C_NAME *INOUT = C_NAME *OUTPUT; %typemap (in) C_NAME &INOUT = C_NAME &INPUT; %typemap (argout) C_NAME &INOUT = C_NAME &OUTPUT; /* Const primitive references. Passed by value */ %typemap(in, doc="$NAME is of type <" #SCM_NAME ">") const C_NAME & (C_NAME temp) { temp = SCM_TO_C($input); $1 = ($1_ltype) &temp; } %typemap(out, doc="<" #SCM_NAME ">") const C_NAME & { $result = C_TO_SCM(*$1); } /* Throw typemap */ %typemap(throws) C_NAME { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(C_TO_SCM($1), SCM_UNDEFINED)); } %enddef SIMPLE_MAP(bool, scm_is_true, scm_from_bool, boolean); SIMPLE_MAP(char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(unsigned char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(signed char, SCM_CHAR, SCM_MAKE_CHAR, char); SIMPLE_MAP(int, scm_to_int, scm_from_long, integer); SIMPLE_MAP(short, scm_to_short, scm_from_long, integer); SIMPLE_MAP(long, scm_to_long, scm_from_long, integer); SIMPLE_MAP(ptrdiff_t, scm_to_long, scm_from_long, integer); SIMPLE_MAP(unsigned int, scm_to_uint, scm_from_ulong, integer); SIMPLE_MAP(unsigned short, scm_to_ushort, scm_from_ulong, integer); SIMPLE_MAP(unsigned long, scm_to_ulong, scm_from_ulong, integer); SIMPLE_MAP(size_t, scm_to_ulong, scm_from_ulong, integer); SIMPLE_MAP(float, scm_to_double, scm_from_double, real); SIMPLE_MAP(double, scm_to_double, scm_from_double, real); // SIMPLE_MAP(char *, SWIG_scm2str, SWIG_str02scm, string); // SIMPLE_MAP(const char *, SWIG_scm2str, SWIG_str02scm, string); /* Define long long typemaps -- uses functions that are only defined in recent versions of Guile, availability also depends on Guile's configuration. */ SIMPLE_MAP(long long, scm_to_long_long, scm_from_long_long, integer); SIMPLE_MAP(unsigned long long, scm_to_ulong_long, scm_from_ulong_long, integer); /* Strings */ %typemap (in, doc="$NAME is a string") char *(int must_free = 0) { $1 = ($1_ltype)SWIG_scm2str($input); must_free = 1; } %typemap (varin, doc="NEW-VALUE is a string") char * {$1 = ($1_ltype)SWIG_scm2str($input);} %typemap (out, doc="") char * {$result = SWIG_str02scm((const char *)$1);} %typemap (varout, doc="") char * {$result = SWIG_str02scm($1);} %typemap (in, doc="$NAME is a string") char **INPUT(char * temp, int must_free = 0) { temp = (char *) SWIG_scm2str($input); $1 = &temp; must_free = 1; } %typemap (in,numinputs=0) char **OUTPUT (char * temp) {$1 = &temp;} %typemap (argout,doc="$NAME (a string)") char **OUTPUT {SWIG_APPEND_VALUE(SWIG_str02scm(*$1));} %typemap (in) char **BOTH = char **INPUT; %typemap (argout) char **BOTH = char **OUTPUT; %typemap (in) char **INOUT = char **INPUT; %typemap (argout) char **INOUT = char **OUTPUT; /* SWIG_scm2str makes a malloc'ed copy of the string, so get rid of it after the function call. */ %typemap (freearg) char * "if (must_free$argnum && $1) SWIG_free($1);"; %typemap (freearg) char **INPUT, char **BOTH "if (must_free$argnum && (*$1)) SWIG_free(*$1);" %typemap (freearg) char **OUTPUT "SWIG_free(*$1);" /* But this shall not apply if we try to pass a single char by reference. */ %typemap (freearg) char *OUTPUT, char *BOTH ""; /* If we set a string variable, delete the old result first, unless const. */ %typemap (varin) char * { if ($1) free($1); $1 = ($1_ltype) SWIG_scm2str($input); } %typemap (varin) const char * { $1 = ($1_ltype) SWIG_scm2str($input); } %typemap(throws) char * { scm_throw(scm_from_locale_symbol((char *) "swig-exception"), scm_listify(SWIG_str02scm($1), SCM_UNDEFINED)); } /* Void */ %typemap (out,doc="") void "gswig_result = SCM_UNSPECIFIED;"; /* SCM is passed through */ typedef unsigned long SCM; %typemap (in) SCM "$1=$input;"; %typemap (out) SCM "$result=$1;"; %typecheck(SWIG_TYPECHECK_POINTER) SCM "$1=1;"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { size_t temp; $1 = ($1_ltype) SWIG_Guile_scm2newstr($input, &temp); $2 = ($2_ltype) temp; } /* ------------------------------------------------------------ * CLASS::* (member function pointer) typemaps * taken from typemaps/swigtype.swg * ------------------------------------------------------------ */ #define %set_output(obj) $result = obj #define %set_varoutput(obj) $result = obj #define %argument_fail(code, type, name, argn) scm_wrong_type_arg((char *) FUNC_NAME, argn, $input); #define %as_voidptr(ptr) (void*)(ptr) %typemap(in) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input, %as_voidptr(&$1), sizeof($type),$descriptor); if (!SWIG_IsOK(res)) { %argument_fail(res,"$type",$symname, $argnum); } } %typemap(out,noblock=1) SWIGTYPE (CLASS::*) { %set_output(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } %typemap(varin) SWIGTYPE (CLASS::*) { int res = SWIG_ConvertMember($input,%as_voidptr(&$1), sizeof($type), $descriptor); if (!SWIG_IsOK(res)) { scm_wrong_type_arg((char *) FUNC_NAME, 1, $input); } } %typemap(varout,noblock=1) SWIGTYPE (CLASS::*) { %set_varoutput(SWIG_NewMemberObj(%as_voidptr(&$1), sizeof($type), $descriptor)); } /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ /* adapted from python.swg */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, size_t, ptrdiff_t, std::size_t, std::ptrdiff_t, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, const size_t &, const ptrdiff_t &, const std::size_t &, const std::ptrdiff_t &, enum SWIGTYPE { $1 = scm_is_true(scm_integer_p($input)) && scm_is_true(scm_exact_p($input))? 1 : 0; } %typecheck(SWIG_TYPECHECK_BOOL) bool, bool&, const bool& { $1 = SCM_BOOLP($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = scm_is_true(scm_real_p($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = SCM_CHARP($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = scm_is_string($input) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $1_descriptor, 0); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, $&descriptor, 0); $1 = SWIG_CheckState(res); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; int res = SWIG_ConvertPtr($input, &ptr, 0, 0); $1 = SWIG_CheckState(res); } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* typemaps.i ends here */ swig-3.0.12/Lib/guile/ports.i0000664000175000017500000000247013042756442015574 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ports.i * * Guile typemaps for handling ports * ----------------------------------------------------------------------------- */ %{ #ifndef _POSIX_SOURCE /* This is needed on Solaris for fdopen(). */ # define _POSIX_SOURCE 199506L #endif #include #include #include %} /* This typemap for FILE * accepts (1) FILE * pointer objects, (2) Scheme file ports. In this case, it creates a temporary C stream which reads or writes from a dup'ed file descriptor. */ %typemap(in, doc="$NAME is a file port or a FILE * pointer") FILE * { if (SWIG_ConvertPtr($input, (void**) &($1), $1_descriptor, 0) != 0) { if (!(SCM_FPORTP($input))) { scm_wrong_type_arg("$symname", $argnum, $input); } else { int fd; if (SCM_OUTPUT_PORT_P($input)) { scm_force_output($input); } fd=dup(SCM_FPORT_FDES($input)); if (fd==-1) { scm_misc_error("$symname", strerror(errno), SCM_EOL); } $1=fdopen(fd, SCM_OUTPUT_PORT_P($input) ? (SCM_INPUT_PORT_P($input) ? "r+" : "w") : "r"); if ($1==NULL) { scm_misc_error("$symname", strerror(errno), SCM_EOL); } } } } %typemap(freearg) FILE* { if ($1) { fclose($1); } } swig-3.0.12/Lib/guile/std_pair.i0000664000175000017500000011753113042756442016237 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // // See std_vector.i for the rationale of typemap application // ------------------------------------------------------------------------ %{ #include %} // exported class namespace std { template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { T* x; U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(*x,*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { T* x; U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = new std::pair< T, U >(*x,*y); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { T* x = new T($1.first); U* y = new U($1.second); SCM first = SWIG_NewPointerObj(x,$descriptor(T *), 1); SCM second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scm_cons(first,second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { T* x; U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { T* x; U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // specializations for built-ins %define specialize_std_pair_on_first(T,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(CONVERT_FROM(first),*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { U* y; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = new std::pair< T, U >(CONVERT_FROM(first),*y); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { U* y = new U($1.second); SCM second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scm_cons(CONVERT_TO($1.first),second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { U* y; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) == 0) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; %enddef %define specialize_std_pair_on_second(U,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { T* x; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(*x,CONVERT_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { T* x; SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = new std::pair< T, U >(*x,CONVERT_FROM(second)); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { T* x = new T($1.first); SCM first = SWIG_NewPointerObj(x,$descriptor(T *), 1); $result = scm_cons(first,CONVERT_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { T* x; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { T* x; SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) == 0 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; %enddef %define specialize_std_pair_on_both(T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO, U,CHECK_U,CONVERT_U_FROM,CONVERT_U_TO) template<> struct pair { %typemap(in) pair %{ if (scm_is_pair($input)) { SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } %} %typemap(in) const pair& (std::pair *temp = 0), const pair* (std::pair *temp = 0) %{ if (scm_is_pair($input)) { SCM first, second; first = SCM_CAR($input); second = SCM_CDR($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = new std::pair< T, U >(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); $1 = temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } %} %typemap(freearg) const pair&, const pair* %{ delete temp$argnum; %} %typemap(out) pair { $result = scm_cons(CONVERT_T_TO($1.first), CONVERT_U_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (scm_is_pair($input)) { SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (scm_is_pair($input)) { SCM first = SCM_CAR($input); SCM second = SCM_CDR($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair< T, U >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; %enddef specialize_std_pair_on_first(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_first(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_first(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_first(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_first(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_first(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_second(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_second(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_second(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_second(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_second(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_second(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(int,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(short,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(long,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(double,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(float,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_pair_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); } swig-3.0.12/Lib/guile/stl.i0000664000175000017500000000054513042756442015230 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/guile/cplusplus.i0000664000175000017500000000136313042756442016457 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cplusplus.i * * SWIG typemaps for C++ * ----------------------------------------------------------------------------- */ %typemap(guile,out) string, std::string { $result = SWIG_str02scm(const_cast($1.c_str())); } %typemap(guile,in) string, std::string { $1 = SWIG_scm2str($input); } %typemap(guile,out) complex, complex, std::complex { $result = scm_make_rectangular( scm_from_double ($1.real ()), scm_from_double ($1.imag ()) ); } %typemap(guile,in) complex, complex, std::complex { $1 = std::complex( scm_to_double (scm_real_part ($input)), scm_to_double (scm_imag_part ($input)) ); } swig-3.0.12/Lib/guile/pointer-in-out.i0000664000175000017500000000637513042756442017326 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pointer-in-out.i * * Guile typemaps for passing pointers indirectly * ----------------------------------------------------------------------------- */ /* Here is a macro that will define typemaps for passing C pointers indirectly. TYPEMAP_POINTER_INPUT_OUTPUT(PTRTYPE, SCM_TYPE) Supported calling conventions (in this example, PTRTYPE is int *): func(int **INPUT) Scheme wrapper will take one argument, a wrapped C pointer. The address of a variable containing this pointer will be passed to the function. func(int **INPUT_CONSUMED) Likewise, but mark the pointer object as not garbage collectable. func(int **INPUT_DESTROYED) Likewise, but mark the pointer object as destroyed. func(int **OUTPUT) Scheme wrapper will take no arguments. The address of an int * variable will be passed to the function. The function is expected to modify the variable; its value is wrapped and becomes an extra return value. (See the documentation on how to deal with multiple values.) func(int **OUTPUT_NONCOLLECTABLE) Likewise, but make the pointer object not garbage collectable. func(int **BOTH) func(int **INOUT) This annotation combines INPUT and OUTPUT. */ %define TYPEMAP_POINTER_INPUT_OUTPUT(PTRTYPE, SCM_TYPE) %typemap(in, doc="$NAME is of type <" #SCM_TYPE ">") PTRTYPE *INPUT(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } $1 = &temp; } %typemap(in, doc="$NAME is of type <" #SCM_TYPE "> and is consumed by the function") PTRTYPE *INPUT_CONSUMED(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } SWIG_Guile_MarkPointerNoncollectable($input); $1 = &temp; } %typemap(in, doc="$NAME is of type <" #SCM_TYPE "> and is consumed by the function") PTRTYPE *INPUT_DESTROYED(PTRTYPE temp) { if (SWIG_ConvertPtr($input, (void **) &temp, $*descriptor, 0)) { scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } SWIG_Guile_MarkPointerDestroyed($input); $1 = &temp; } %typemap(in, numinputs=0) PTRTYPE *OUTPUT(PTRTYPE temp), PTRTYPE *OUTPUT_NONCOLLECTABLE(PTRTYPE temp) "$1 = &temp;"; %typemap(argout, doc="<" #SCM_TYPE ">") PTRTYPE *OUTPUT "SWIG_APPEND_VALUE(SWIG_NewPointerObj(*$1, $*descriptor, 1));"; %typemap(argout, doc="<" #SCM_TYPE ">") PTRTYPE *OUTPUT_NONCOLLECTABLE "SWIG_APPEND_VALUE(SWIG_NewPointerObj(*$1, $*descriptor, 0));"; %typemap(in) PTRTYPE *BOTH = PTRTYPE *INPUT; %typemap(argout) PTRTYPE *BOTH = PTRTYPE *OUTPUT; %typemap(in) PTRTYPE *INOUT = PTRTYPE *INPUT; %typemap(argout) PTRTYPE *INOUT = PTRTYPE *OUTPUT; /* As a special convenience measure, also attach docs involving SCM_TYPE to the standard pointer typemaps */ %typemap(in, doc="$NAME is of type <" #SCM_TYPE ">") PTRTYPE { if (SWIG_ConvertPtr($input, (void **) &$1, $descriptor, 0)) scm_wrong_type_arg(FUNC_NAME, $argnum, $input); } %typemap(out, doc="<" #SCM_TYPE ">") PTRTYPE { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %enddef swig-3.0.12/Lib/guile/std_string.i0000664000175000017500000000444113042756442016605 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string (char * tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) const string & ($*1_ltype temp, char *tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); temp.assign(tempptr); if (tempptr) SWIG_free(tempptr); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string * (char *tempptr) { if (scm_is_string($input)) { tempptr = SWIG_scm2str($input); $1 = new $*1_ltype(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(out) string { $result = SWIG_str02scm($1.c_str()); } %typemap(out) const string & { $result = SWIG_str02scm($1->c_str()); } %typemap(out) string * { $result = SWIG_str02scm($1->c_str()); } %typemap(varin) string { if (scm_is_string($input)) { char *tempptr = SWIG_scm2str($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(varout) string { $result = SWIG_str02scm($1.c_str()); } } swig-3.0.12/Lib/guile/std_map.i0000664000175000017500000016550513042756442016065 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // // The aim of all that follows would be to integrate std::map with // Guile as much as possible, namely, to allow the user to pass and // be returned Scheme association lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&), f(const std::map*): // the parameter being read-only, either a Scheme alist or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter must be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(): // the map is returned by copy; therefore, a Scheme alist // is returned which is most easily used in other Scheme functions // -- std::map& f(), std::map* f(), const std::map& f(), // const std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { %typemap(in) map { if (scm_is_null($input)) { $1 = std::map< K, T >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T >(); SCM alist = $input; while (!scm_is_null(alist)) { K* k; T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[*k] = *x; alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp), const map* (std::map temp) { if (scm_is_null($input)) { temp = std::map< K, T >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { K* k; T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[*k] = *x; alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { SCM alist = SCM_EOL; for (std::map< K, T >::reverse_iterator i=$i.rbegin(); i!=$i.rend(); ++i) { K* key = new K(i->first); T* val = new T(i->second); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); SCM x = SWIG_NewPointerObj(val,$descriptor(T *), 1); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { /* native sequence? */ if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ K* k; T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { /* native sequence? */ if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { /* check the first element only */ K* k; T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map< K, T> &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, const T& x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scm_cons(k,result); } return result; } } }; // specializations for built-ins %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) template class map { %typemap(in) map { if (scm_is_null($input)) { $1 = std::map< K, T >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T >(); SCM alist = $input; while (!scm_is_null(alist)) { T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[CONVERT_FROM(key)] = *x; alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp), const map* (std::map temp) { if (scm_is_null($input)) { temp = std::map< K, T >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { T* x; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != 0) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[CONVERT_FROM(key)] = *x; alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { SCM alist = SCM_EOL; for (std::map< K, T >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { T* val = new T(i->second); SCM k = CONVERT_TO(i->first); SCM x = SWIG_NewPointerObj(val,$descriptor(T *), 1); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only T* x; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == 0) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: map(); map(const map< K, T > &); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(K key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, const T& x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { SCM k = CONVERT_TO(i->first); result = scm_cons(k,result); } return result; } } }; %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) template class map { %typemap(in) map { if (scm_is_null($input)) { $1 = std::map< K, T >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T >(); SCM alist = $input; while (!scm_is_null(alist)) { K* k; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } (($1_type &)$1)[*k] = CONVERT_FROM(val); alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp), const map* (std::map temp) { if (scm_is_null($input)) { temp = std::map< K, T >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { K* k; SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } temp[*k] = CONVERT_FROM(val); alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { SCM alist = SCM_EOL; for (std::map< K, T >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); SCM x = CONVERT_TO(i->second); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only K* k; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only K* k; SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM val = SCM_CDR(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) != 0) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: map(); map(const map< K, T > &); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(const K& key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, T x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map< K, T >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); SCM k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scm_cons(k,result); } return result; } } }; %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) template<> class map { %typemap(in) map { if (scm_is_null($input)) { $1 = std::map< K, T >(); } else if (scm_is_pair($input)) { $1 = std::map< K, T >(); SCM alist = $input; while (!scm_is_null(alist)) { SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (!CHECK_T(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } (($1_type &)$1)[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = SCM_CDR(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp), const map* (std::map temp) { if (scm_is_null($input)) { temp = std::map< K, T >(); $1 = &temp; } else if (scm_is_pair($input)) { temp = std::map< K, T >(); $1 = &temp; SCM alist = $input; while (!scm_is_null(alist)) { SCM entry, key, val; entry = SCM_CAR(alist); if (!scm_is_pair(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = SCM_CAR(entry); val = SCM_CDR(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (!CHECK_T(val)) { if (!scm_is_pair(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = SCM_CAR(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = SCM_CDR(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { SCM alist = SCM_EOL; for (std::map< K, T >::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { SCM k = CONVERT_K_TO(i->first); SCM x = CONVERT_T_TO(i->second); SCM entry = scm_cons(k,x); alist = scm_cons(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { // native sequence? if (scm_is_null($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (scm_is_pair($input)) { // check the first element only SCM head = SCM_CAR($input); if (scm_is_pair(head)) { SCM key = SCM_CAR(head); SCM val = SCM_CDR(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (scm_is_pair(val)) { val = SCM_CAR(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map< K, T >* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) == 0) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: map(); map(const map< K, T> &); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(K key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, T x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map< K, T >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map< K, T >::iterator i = self->find(key); return i != self->end(); } SCM keys() { SCM result = SCM_EOL; for (std::map< K, T >::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { SCM k = CONVERT_K_TO(i->first); result = scm_cons(k,result); } return result; } } }; %enddef specialize_std_map_on_key(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_key(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_key(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_key(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_key(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_key(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_value(bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_value(int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_value(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_value(double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_value(float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_value(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(bool,scm_is_bool, scm_is_true,SWIG_bool2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(int,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(short,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(long,scm_is_number, scm_to_long,scm_from_long, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(double,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(float,scm_is_number, scm_to_double,scm_from_double, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, bool,scm_is_bool, scm_is_true,SWIG_bool2scm); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, int,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, short,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, long,scm_is_number, scm_to_long,scm_from_long); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned int,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned short,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, unsigned long,scm_is_number, scm_to_ulong,scm_from_ulong); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, double,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, float,scm_is_number, scm_to_double,scm_from_double); specialize_std_map_on_both(std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm, std::string,scm_is_string, SWIG_scm2string,SWIG_string2scm); } swig-3.0.12/Lib/guile/interpreter.i0000664000175000017500000000261513042756442016771 0ustar williamwilliam/* ----------------------------------------------------------------------------- * interpreter.i * * SWIG file for a simple Guile interpreter * ----------------------------------------------------------------------------- */ %{ #include GSCM_status guile_init(); int main(int argc, char **argv) { GSCM_status status; GSCM_top_level toplev; char *eval_answer; char input_str[16384]; int done; /* start a scheme interpreter */ status = gscm_run_scm(argc, argv, 0, stdout, stderr, guile_init, 0, "#t"); if (status != GSCM_OK) { fputs(gscm_error_msg(status), stderr); fputc('\n', stderr); printf("Error in startup.\n"); exit(1); } /* create the top level environment */ status = gscm_create_top_level(&toplev); if (status != GSCM_OK) { fputs(gscm_error_msg(status), stderr); fputc('\n', stderr); exit(1); } /* now sit in a scheme eval loop: I input the expressions, have guile * evaluate them, and then get another expression. */ done = 0; fprintf(stdout,"Guile > "); while (!done) { if (fgets(input_str,16384,stdin) == NULL) { exit(1); } else { if (strncmp(input_str,"quit",4) == 0) exit(1); status = gscm_eval_str(&eval_answer, toplev, input_str); fprintf(stdout,"%s\n", eval_answer); fprintf(stdout,"Guile > "); } } /* now clean up and quit */ gscm_destroy_top_level(toplev); } %} swig-3.0.12/Lib/director_common.swg0000664000175000017500000000100013042756442017037 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director_common.swg * * This file contains support for director classes which is common between * languages. * ----------------------------------------------------------------------------- */ /* Use -DSWIG_DIRECTOR_STATIC if you prefer to avoid the use of the 'Swig' namespace. This could be useful for multi-modules projects. */ #ifdef SWIG_DIRECTOR_STATIC /* Force anonymous (static) namespace */ #define Swig #endif swig-3.0.12/Lib/swigrun.i0000664000175000017500000000040013042756442015005 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigrun.i * * Empty module (for now). Placeholder for runtime libs * ----------------------------------------------------------------------------- */ %module swigrun swig-3.0.12/Lib/shared_ptr.i0000664000175000017500000000517613042756442015461 0ustar williamwilliam// This is a helper file for shared_ptr and should not be included directly. // The main implementation detail in using this smart pointer of a type is to customise the code generated // to use a pointer to the smart pointer of the type, rather than the usual pointer to the underlying type. // So for some type T, shared_ptr * is used rather than T *. // Another key part of the implementation is the smartptr feature: // %feature("smartptr") T { shared_ptr } // This feature marks the class T as having a smartptr to it (the shared_ptr type). This is then used to // support smart pointers and inheritance. Say class D derives from base B, then shared_ptr is marked // with a fake inheritance from shared_ptr in the type system if the "smartptr" feature is used on both // B and D. This is to emulate the conversion of shared_ptr to shared_ptr in the target language. // shared_ptr namespaces could be boost or std or std::tr1 // For example for std::tr1, use: // #define SWIG_SHARED_PTR_NAMESPACE std // #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 #if !defined(SWIG_SHARED_PTR_NAMESPACE) # define SWIG_SHARED_PTR_NAMESPACE boost #endif #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) # define SWIG_SHARED_PTR_QNAMESPACE SWIG_SHARED_PTR_NAMESPACE::SWIG_SHARED_PTR_SUBNAMESPACE #else # define SWIG_SHARED_PTR_QNAMESPACE SWIG_SHARED_PTR_NAMESPACE #endif namespace SWIG_SHARED_PTR_NAMESPACE { #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) namespace SWIG_SHARED_PTR_SUBNAMESPACE { #endif template class shared_ptr { }; #if defined(SWIG_SHARED_PTR_SUBNAMESPACE) } #endif } %fragment("SWIG_null_deleter", "header") { struct SWIG_null_deleter { void operator() (void const *) const { } }; %#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter() %#define SWIG_NO_NULL_DELETER_1 %#define SWIG_NO_NULL_DELETER_SWIG_POINTER_NEW %#define SWIG_NO_NULL_DELETER_SWIG_POINTER_OWN } // Workaround empty first macro argument bug #define SWIGEMPTYHACK // Main user macro for defining shared_ptr typemaps for both const and non-const pointer types %define %shared_ptr(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_SHARED_PTR_TYPEMAPS(SWIGEMPTYHACK, TYPE) SWIG_SHARED_PTR_TYPEMAPS(const, TYPE) %enddef // Legacy macros %define SWIG_SHARED_PTR(PROXYCLASS, TYPE...) #warning "SWIG_SHARED_PTR(PROXYCLASS, TYPE) is deprecated. Please use %shared_ptr(TYPE) instead." %shared_ptr(TYPE) %enddef %define SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %shared_ptr(TYPE) instead." %shared_ptr(TYPE) %enddef swig-3.0.12/Lib/swig.swg0000664000175000017500000006041013042756442014637 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swig.swg * * Common macro definitions for various SWIG directives. This file is always * included at the top of each input file. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * User Directives * ----------------------------------------------------------------------------- */ /* Deprecated SWIG-1.1 directives */ #define %disabledoc %warn "104:%disabledoc is deprecated" #define %enabledoc %warn "105:%enabledoc is deprecated" #define %doconly %warn "106:%doconly is deprecated" #define %style %warn "107:%style is deprecated" /##/ #define %localstyle %warn "108:%localstyle is deprecated" /##/ #define %title %warn "109:%title is deprecated" /##/ #define %section %warn "110:%section is deprecated" /##/ #define %subsection %warn "111:%subsection is deprecated" /##/ #define %subsubsection %warn "112:%subsubsection is deprecated" /##/ #define %new %warn "117:%new is deprecated. Use %newobject" #define %text %insert("null") /* Code insertion directives such as %wrapper %{ ... %} */ #define %begin %insert("begin") #define %runtime %insert("runtime") #define %header %insert("header") #define %wrapper %insert("wrapper") #define %init %insert("init") /* Class extension */ #define %addmethods %warn "113:%addmethods is now %extend" %extend /* %ignore directive */ #define %ignore %rename($ignore) #define %ignorewarn(x) %rename("$ignore:" x) /* Access control directives */ #define %readonly %warn "114:%readonly is deprecated. Use %immutable; " %feature("immutable"); #define %readwrite %warn "115:%readwrite is deprecated. Use %mutable; " %feature("immutable",""); #define %immutable %feature("immutable") #define %noimmutable %feature("immutable","0") #define %clearimmutable %feature("immutable","") #define %mutable %clearimmutable /* Generation of default constructors/destructors (old form, don't use) */ #define %nodefault %feature("nodefault","1") #define %default %feature("nodefault","0") #define %clearnodefault %feature("nodefault","") #define %makedefault %clearnodefault /* Disable the generation of implicit default constructor */ #define %nodefaultctor %feature("nodefaultctor","1") #define %defaultctor %feature("nodefaultctor","0") #define %clearnodefaultctor %feature("nodefaultctor","") /* Disable the generation of implicit default destructor (dangerous) */ #define %nodefaultdtor %feature("nodefaultdtor","1") #define %defaultdtor %feature("nodefaultdtor","0") #define %clearnodefaultdtor %feature("nodefaultdtor","") /* Enable the generation of copy constructor */ #define %copyctor %feature("copyctor","1") #define %nocopyctor %feature("copyctor","0") #define %clearcopyctor %feature("copyctor","") /* Force the old nodefault behavior, ie disable both constructor and destructor */ #define %oldnodefault %feature("oldnodefault","1") #define %nooldnodefault %feature("oldnodefault","0") #define %clearoldnodefault %feature("oldnodefault","") /* the %exception directive */ #if defined(SWIGCSHARP) || defined(SWIGD) #define %exception %feature("except", canthrow=1) #else #define %exception %feature("except") #endif #define %noexception %feature("except","0") #define %clearexception %feature("except","") /* the %allowexception directive allows the %exception feature to be applied to set/get variable methods */ #define %allowexception %feature("allowexcept") #define %noallowexception %feature("allowexcept","0") #define %clearallowexception %feature("allowexcept","") /* the %exceptionvar directive, as %exception but it is only applied to set/get variable methods. You don't need to use the %allowexception directive when using %exceptionvar. */ #if defined(SWIGCSHARP) || defined(SWIGD) #define %exceptionvar %feature("exceptvar", canthrow=1) #else #define %exceptionvar %feature("exceptvar") #endif #define %noexceptionvar %feature("exceptvar","0") #define %clearexceptionvar %feature("exceptvar","") /* the %catches directive */ #define %catches(tlist...) %feature("catches","("`tlist`")") #define %clearcatches %feature("catches","") /* the %exceptionclass directive */ #define %exceptionclass %feature("exceptionclass") #define %noexceptionclass %feature("exceptionclass","0") #define %clearexceptionclass %feature("exceptionclass","") /* the %newobject directive */ #define %newobject %feature("new") #define %nonewobject %feature("new","0") #define %clearnewobject %feature("new","") /* the %delobject directive */ #define %delobject %feature("del") #define %nodelobject %feature("del","0") #define %cleardelobject %feature("del","") /* the %refobject/%unrefobject directives */ #define %refobject %feature("ref") #define %norefobject %feature("ref","0") #define %clearrefobject %feature("ref","") #define %unrefobject %feature("unref") #define %nounrefobject %feature("unref","0") #define %clearunrefobject %feature("unref","") /* Directives for callback functions (experimental) */ #define %callback(x) %feature("callback",`x`) #define %nocallback %feature("callback","0") #define %clearcallback %feature("callback","") /* the %nestedworkaround directive (deprecated) */ #define %nestedworkaround %feature("nestedworkaround") #define %nonestedworkaround %feature("nestedworkaround","0") #define %clearnestedworkaround %feature("nestedworkaround","") /* the %flatnested directive */ #define %flatnested %feature("flatnested") #define %noflatnested %feature("flatnested","0") #define %clearflatnested %feature("flatnested","") /* the %fastdispatch directive */ #define %fastdispatch %feature("fastdispatch") #define %nofastdispatch %feature("fastdispatch","0") #define %clearfastdispatch %feature("fastdispatch","") /* directors directives */ #define %director %feature("director") #define %nodirector %feature("director","0") #define %cleardirector %feature("director","") /* naturalvar directives */ #define %naturalvar %feature("naturalvar") #define %nonaturalvar %feature("naturalvar","0") #define %clearnaturalvar %feature("naturalvar","") /* nspace directives */ #define %nspace %feature("nspace") #define %nonspace %feature("nspace","0") #define %clearnspace %feature("nspace","") /* valuewrapper directives */ #define %valuewrapper %feature("valuewrapper") #define %clearvaluewrapper %feature("valuewrapper","") #define %novaluewrapper %feature("novaluewrapper") #define %clearnovaluewrapper %feature("novaluewrapper","") /* Contract support - Experimental and undocumented */ #define %contract %feature("contract") #define %nocontract %feature("contract","0") #define %clearcontract %feature("contract","") /* Macro for setting a dynamic cast function */ %define DYNAMIC_CAST(mangle,func) %init %{ mangle->dcast = (swig_dycast_func) func; %} %enddef /* aggregation support */ /* This macro performs constant aggregation. Basically the idea of constant aggregation is that you can group a collection of constants together. For example, suppose you have some code like this: #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 Now, suppose you had a function like this: int move(int direction) In this case, you might want to restrict the direction argument to one of the supplied constant names. To do this, you could write some typemap code by hand. Alternatively, you can use the %aggregate_check macro defined here to create a simple check function for you. Here is an example: %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT); Now, using a typemap %typemap(check) int direction { if (!check_direction($1)) SWIG_exception(SWIG_ValueError,"Bad direction."); } or a contract (better) %contract move(int x) { require: check_direction(x); } */ %define %aggregate_check(TYPE, NAME, FIRST, ...) %wrapper %{ static int NAME(TYPE x) { static TYPE values[] = { FIRST, ##__VA_ARGS__ }; static int size = sizeof(values); int i,j; for (i = 0, j = 0; i < size; i+=sizeof(TYPE),j++) { if (x == values[j]) return 1; } return 0; } %} %enddef /* ----------------------------------------------------------------------------- * %rename predicates * ----------------------------------------------------------------------------- */ /* Predicates to be used with %rename, for example: - to rename all the functions: %rename("%(utitle)s", %$isfunction) ""; - to rename only the member methods: %rename("m_%(utitle)s", %$isfunction, %$ismember) ""; - to rename only the global functions: %rename("m_%(utitle)s", %$isfunction, %$not %$ismember) ""; or %rename("g_%(utitle)s", %$isfunction, %$isglobal) ""; - to ignore the enumitems in a given class: %rename("$ignore", %$isenumitem, %$classname="MyClass") ""; we use the prefix '%$' to avoid clashes with other swig macros/directives. */ %define %$not "not" %enddef %define %$isenum "match"="enum" %enddef %define %$isenumitem "match"="enumitem" %enddef %define %$isaccess "match"="access" %enddef %define %$isclass "match"="class","notmatch$template$templatetype"="class" %enddef %define %$isextend "match"="extend" %enddef %define %$isconstructor "match"="constructor" %enddef %define %$isdestructor "match"="destructor" %enddef %define %$isnamespace "match"="namespace" %enddef %define %$istemplate "match"="template" %enddef %define %$isconstant "match"="constant" %enddef /* %constant definition */ %define %$isunion "match$kind"="union" %enddef %define %$isfunction "match$kind"="function" %enddef %define %$isvariable "match$kind"="variable" %enddef %define %$isimmutable "match$feature:immutable"="1" %enddef %define %$hasconsttype "match$hasconsttype"="1" %enddef %define %$hasvalue "match$hasvalue"="1" %enddef %define %$isextension "match$isextension"="1" %enddef %define %$isstatic "match$storage"="static" %enddef %define %$isfriend "match$storage"="friend" %enddef %define %$istypedef "match$storage"="typedef" %enddef %define %$isvirtual "match$storage"="virtual" %enddef %define %$isexplicit "match$storage"="explicit" %enddef %define %$isextern "match$storage"="extern" %enddef %define %$ismember "match$ismember"="1" %enddef %define %$isglobal %$not %$ismember %enddef %define %$isextendmember "match$isextendmember"="1" %enddef %define %$innamespace "match$parentNode$nodeType"="namespace" %enddef %define %$ispublic "match$access"="public" %enddef %define %$isprotected "match$access"="protected" %enddef %define %$isprivate "match$access"="private" %enddef %define %$ismemberget "match$memberget"="1" %enddef %define %$ismemberset "match$memberset"="1" %enddef %define %$classname %$ismember,"match$parentNode$name" %enddef %define %$isnested "match$nested"="1" %enddef /* ----------------------------------------------------------------------------- * Include all the warnings labels and macros * ----------------------------------------------------------------------------- */ %include /* ----------------------------------------------------------------------------- * Overloading support * ----------------------------------------------------------------------------- */ /* * Function/method overloading support. This is done through typemaps, * but also involves a precedence level. */ /* Macro for overload resolution */ %define %typecheck(_x...) %typemap(typecheck, precedence=_x) %enddef /* Macros for precedence levels */ %define SWIG_TYPECHECK_POINTER 0 %enddef %define SWIG_TYPECHECK_ITERATOR 5 %enddef %define SWIG_TYPECHECK_VOIDPTR 10 %enddef %define SWIG_TYPECHECK_BOOL 15 %enddef %define SWIG_TYPECHECK_UINT8 20 %enddef %define SWIG_TYPECHECK_INT8 25 %enddef %define SWIG_TYPECHECK_UINT16 30 %enddef %define SWIG_TYPECHECK_INT16 35 %enddef %define SWIG_TYPECHECK_UINT32 40 %enddef %define SWIG_TYPECHECK_INT32 45 %enddef %define SWIG_TYPECHECK_SIZE 47 %enddef %define SWIG_TYPECHECK_PTRDIFF 48 %enddef %define SWIG_TYPECHECK_UINT64 50 %enddef %define SWIG_TYPECHECK_INT64 55 %enddef %define SWIG_TYPECHECK_UINT128 60 %enddef %define SWIG_TYPECHECK_INT128 65 %enddef %define SWIG_TYPECHECK_INTEGER 70 %enddef %define SWIG_TYPECHECK_FLOAT 80 %enddef %define SWIG_TYPECHECK_DOUBLE 90 %enddef %define SWIG_TYPECHECK_CPLXFLT 95 %enddef %define SWIG_TYPECHECK_CPLXDBL 100 %enddef %define SWIG_TYPECHECK_COMPLEX 105 %enddef %define SWIG_TYPECHECK_UNICHAR 110 %enddef %define SWIG_TYPECHECK_STDUNISTRING 115 %enddef %define SWIG_TYPECHECK_UNISTRING 120 %enddef %define SWIG_TYPECHECK_CHAR 130 %enddef %define SWIG_TYPECHECK_STDSTRING 135 %enddef %define SWIG_TYPECHECK_STRING 140 %enddef %define SWIG_TYPECHECK_PAIR 150 %enddef %define SWIG_TYPECHECK_STDARRAY 155 %enddef %define SWIG_TYPECHECK_VECTOR 160 %enddef %define SWIG_TYPECHECK_DEQUE 170 %enddef %define SWIG_TYPECHECK_LIST 180 %enddef %define SWIG_TYPECHECK_SET 190 %enddef %define SWIG_TYPECHECK_MULTISET 200 %enddef %define SWIG_TYPECHECK_MAP 210 %enddef %define SWIG_TYPECHECK_MULTIMAP 220 %enddef %define SWIG_TYPECHECK_STACK 230 %enddef %define SWIG_TYPECHECK_QUEUE 240 %enddef %define SWIG_TYPECHECK_BOOL_ARRAY 1015 %enddef %define SWIG_TYPECHECK_INT8_ARRAY 1025 %enddef %define SWIG_TYPECHECK_INT16_ARRAY 1035 %enddef %define SWIG_TYPECHECK_INT32_ARRAY 1045 %enddef %define SWIG_TYPECHECK_INT64_ARRAY 1055 %enddef %define SWIG_TYPECHECK_INT128_ARRAY 1065 %enddef %define SWIG_TYPECHECK_FLOAT_ARRAY 1080 %enddef %define SWIG_TYPECHECK_DOUBLE_ARRAY 1090 %enddef %define SWIG_TYPECHECK_CHAR_ARRAY 1130 %enddef %define SWIG_TYPECHECK_STRING_ARRAY 1140 %enddef %define SWIG_TYPECHECK_OBJECT_ARRAY 1150 %enddef %define SWIG_TYPECHECK_BOOL_PTR 2015 %enddef %define SWIG_TYPECHECK_UINT8_PTR 2020 %enddef %define SWIG_TYPECHECK_INT8_PTR 2025 %enddef %define SWIG_TYPECHECK_UINT16_PTR 2030 %enddef %define SWIG_TYPECHECK_INT16_PTR 2035 %enddef %define SWIG_TYPECHECK_UINT32_PTR 2040 %enddef %define SWIG_TYPECHECK_INT32_PTR 2045 %enddef %define SWIG_TYPECHECK_UINT64_PTR 2050 %enddef %define SWIG_TYPECHECK_INT64_PTR 2055 %enddef %define SWIG_TYPECHECK_FLOAT_PTR 2080 %enddef %define SWIG_TYPECHECK_DOUBLE_PTR 2090 %enddef %define SWIG_TYPECHECK_CHAR_PTR 2130 %enddef %define SWIG_TYPECHECK_SWIGOBJECT 5000 %enddef /* ----------------------------------------------------------------------------- * Default handling of certain overloaded operators * ----------------------------------------------------------------------------- */ #ifdef __cplusplus %ignoreoperator(NEW) operator new; %ignoreoperator(DELETE) operator delete; %ignoreoperator(NEWARR) operator new[]; %ignoreoperator(DELARR) operator delete[]; /* add C++ operator aliases */ %rename("operator &&") operator and; // `and' `&&' %rename("operator ||") operator or; // `or' `||' %rename("operator !") operator not; // `not' `!' %rename("operator &=") operator and_eq; // `and_eq' `&=' %rename("operator &") operator bitand; // `bitand' `&' %rename("operator |") operator bitor; // `bitor' `|' %rename("operator ~") operator compl; // `compl' `~' %rename("operator !=") operator not_eq; // `not_eq' `!=' %rename("operator |=") operator or_eq; // `or_eq' `|=' %rename("operator ^") operator xor; // `xor' `^' %rename("operator ^=") operator xor_eq; // `xor_eq' `^=' /* Smart pointer handling */ %rename(__deref__) *::operator->; %rename(__ref__) *::operator*(); %rename(__ref__) *::operator*() const; /* Define std namespace */ namespace std { /* Warn about std::initializer_list usage. The constructor/method where used should probably be ignored. See docs. */ template class initializer_list {}; %typemap(in, warning=SWIGWARN_TYPEMAP_INITIALIZER_LIST_MSG) initializer_list "" %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) initializer_list "" } #endif /* ----------------------------------------------------------------------------- * Default char * and C array typemaps * ----------------------------------------------------------------------------- */ /* Set up the typemap for handling new return strings */ #ifdef __cplusplus %typemap(newfree) char * "delete [] $1;"; #else %typemap(newfree) char * "free($1);"; #endif /* Default typemap for handling char * members */ #ifdef __cplusplus %typemap(memberin) char * { delete [] $1; if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin) char * { delete [] $1; if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) (new char[strlen((const char *)$input)+1]); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } #else %typemap(memberin) char * { free($1); if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin) char * { free($1); if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { if ($input) { $1 = ($1_type) malloc(strlen((const char *)$input)+1); strcpy((char *)$1, (const char *)$input); } else { $1 = 0; } } #endif /* Character array handling */ %typemap(memberin) char [ANY] { if($input) { strncpy((char*)$1, (const char *)$input, $1_dim0-1); $1[$1_dim0-1] = 0; } else { $1[0] = 0; } } %typemap(globalin) char [ANY] { if($input) { strncpy((char*)$1, (const char *)$input, $1_dim0-1); $1[$1_dim0-1] = 0; } else { $1[0] = 0; } } %typemap(memberin) char [] { if ($input) strcpy((char *)$1, (const char *)$input); else $1[0] = 0; } %typemap(globalin) char [] { if ($input) strcpy((char *)$1, (const char *)$input); else $1[0] = 0; } /* memberin/globalin typemap for arrays. */ %typemap(memberin) SWIGTYPE [ANY] { size_t ii; $1_basetype *b = ($1_basetype *) $1; for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); } %typemap(globalin) SWIGTYPE [ANY] { size_t ii; $1_basetype *b = ($1_basetype *) $1; for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); } /* memberin/globalin typemap for double arrays. */ %typemap(memberin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); size_t ii = 0; for (; ii < $1_dim0; ++ii) { $basetype *ip = inp[ii]; $basetype *dp = dest[ii]; size_t jj = 0; for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; } } %typemap(globalin) SWIGTYPE [ANY][ANY] { $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); size_t ii = 0; for (; ii < $1_dim0; ++ii) { $basetype *ip = inp[ii]; $basetype *dp = dest[ii]; size_t jj = 0; for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; } } /* ----------------------------------------------------------------------------- * Runtime code * ----------------------------------------------------------------------------- */ /* The SwigValueWrapper class */ /* * This template wrapper is used to handle C++ objects that are passed or * returned by value. This is necessary to handle objects that define * no default-constructor (making it difficult for SWIG to properly declare * local variables). * * The wrapper is used as follows. First consider a function like this: * * Vector cross_product(Vector a, Vector b) * * Now, if Vector is defined as a C++ class with no default constructor, * code is generated as follows: * * Vector *wrap_cross_product(Vector *inarg1, Vector *inarg2) { * SwigValueWrapper arg1; * SwigValueWrapper arg2; * SwigValueWrapper result; * * arg1 = *inarg1; * arg2 = *inarg2; * ... * result = cross_product(arg1,arg2); * ... * return new Vector(result); * } * * In the wrappers, the template SwigValueWrapper simply provides a thin * layer around a Vector *. However, it does this in a way that allows * the object to be bound after the variable declaration (which is not possible * with the bare object when it lacks a default constructor). * * An observant reader will notice that the code after the variable declarations * is *identical* to the code used for classes that do define default constructors. * Thus, this neat trick allows us to fix this special case without having to * make massive changes to typemaps and other parts of the SWIG code generator. * * Note: this code is not included when SWIG runs in C-mode, when classes * define default constructors, or when pointers and references are used. * SWIG tries to avoid doing this except in very special circumstances. * * Note: This solution suffers from making a large number of copies * of the underlying object. However, this is needed in the interest of * safety and in order to cover all of the possible ways in which a value * might be assigned. For example: * * arg1 = *inarg1; // Assignment from a pointer * arg1 = Vector(1,2,3); // Assignment from a value * * The class offers a strong guarantee of exception safety. * With regards to the implementation, the private SwigMovePointer nested class is * a simple smart pointer with move semantics, much like std::auto_ptr. * * This wrapping technique was suggested by William Fulton and is henceforth * known as the "Fulton Transform" :-). */ #ifdef __cplusplus %insert("runtime") %{ #ifdef __cplusplus /* SwigValueWrapper is described in swig.swg */ template class SwigValueWrapper { struct SwigMovePointer { T *ptr; SwigMovePointer(T *p) : ptr(p) { } ~SwigMovePointer() { delete ptr; } SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } } pointer; SwigValueWrapper& operator=(const SwigValueWrapper& rhs); SwigValueWrapper(const SwigValueWrapper& rhs); public: SwigValueWrapper() : pointer(0) { } SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } operator T&() const { return *pointer.ptr; } T *operator&() { return pointer.ptr; } };%} /* * SwigValueInit() is a generic initialisation solution as the following approach: * * T c_result = T(); * * doesn't compile for all types for example: * * unsigned int c_result = unsigned int(); */ %insert("runtime") %{ template T SwigValueInit() { return T(); } #endif %} #endif /* The swiglabels */ %insert("runtime") "swiglabels.swg" swig-3.0.12/Lib/std_except.i0000664000175000017500000000403513042756442015461 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * SWIG library file with typemaps to handle and throw STD exceptions in a * language and STL independent way, i.e., the target language doesn't * require to support STL but only the 'exception.i' mechanism. * * These typemaps are used when methods are declared with an STD * exception specification, such as * * size_t at() const throw (std::out_of_range); * * The typemaps here are based on the language independent * 'exception.i' library. If that is working in your target language, * this file will work. * * If the target language doesn't implement a robust 'exception.i' * mechanism, or you prefer other ways to map the STD exceptions, write * a new std_except.i file in the target library directory. * ----------------------------------------------------------------------------- */ #if defined(SWIGJAVA) || defined(SWIGCSHARP) || defined(SWIGGUILE) || defined(SWIGUTL) || defined(SWIGD) #error "This version of std_except.i should not be used" #endif %{ #include #include %} %include %define %std_exception_map(Exception, Code) %typemap(throws,noblock=1) Exception { SWIG_exception(Code, $1.what()); } %ignore Exception; struct Exception { }; %enddef namespace std { %std_exception_map(bad_cast, SWIG_TypeError); %std_exception_map(bad_exception, SWIG_SystemError); %std_exception_map(domain_error, SWIG_ValueError); %std_exception_map(exception, SWIG_SystemError); %std_exception_map(invalid_argument, SWIG_ValueError); %std_exception_map(length_error, SWIG_IndexError); %std_exception_map(logic_error, SWIG_RuntimeError); %std_exception_map(out_of_range, SWIG_IndexError); %std_exception_map(overflow_error, SWIG_OverflowError); %std_exception_map(range_error, SWIG_OverflowError); %std_exception_map(runtime_error, SWIG_RuntimeError); %std_exception_map(underflow_error, SWIG_OverflowError); } swig-3.0.12/Lib/swigwarn.swg0000664000175000017500000003372313042756671015542 0ustar williamwilliam/* SWIG warning codes */ %define SWIGWARN_NONE 0 %enddef /* -- Deprecated features -- */ %define SWIGWARN_DEPRECATED_EXTERN 101 %enddef %define SWIGWARN_DEPRECATED_VAL 102 %enddef %define SWIGWARN_DEPRECATED_OUT 103 %enddef %define SWIGWARN_DEPRECATED_DISABLEDOC 104 %enddef %define SWIGWARN_DEPRECATED_ENABLEDOC 105 %enddef %define SWIGWARN_DEPRECATED_DOCONLY 106 %enddef %define SWIGWARN_DEPRECATED_STYLE 107 %enddef %define SWIGWARN_DEPRECATED_LOCALSTYLE 108 %enddef %define SWIGWARN_DEPRECATED_TITLE 109 %enddef %define SWIGWARN_DEPRECATED_SECTION 110 %enddef %define SWIGWARN_DEPRECATED_SUBSECTION 111 %enddef %define SWIGWARN_DEPRECATED_SUBSUBSECTION 112 %enddef %define SWIGWARN_DEPRECATED_ADDMETHODS 113 %enddef %define SWIGWARN_DEPRECATED_READONLY 114 %enddef %define SWIGWARN_DEPRECATED_READWRITE 115 %enddef %define SWIGWARN_DEPRECATED_EXCEPT 116 %enddef %define SWIGWARN_DEPRECATED_NEW 117 %enddef %define SWIGWARN_DEPRECATED_EXCEPT_TM 118 %enddef %define SWIGWARN_DEPRECATED_IGNORE_TM 119 %enddef %define SWIGWARN_DEPRECATED_OPTC 120 %enddef %define SWIGWARN_DEPRECATED_NAME 121 %enddef %define SWIGWARN_DEPRECATED_NOEXTERN 122 %enddef %define SWIGWARN_DEPRECATED_NODEFAULT 123 %enddef %define SWIGWARN_DEPRECATED_TYPEMAP_LANG 124 %enddef %define SWIGWARN_DEPRECATED_INPUT_FILE 125 %enddef %define SWIGWARN_DEPRECATED_NESTED_WORKAROUND 126 %enddef /* -- Preprocessor -- */ %define SWIGWARN_PP_MISSING_FILE 201 %enddef %define SWIGWARN_PP_EVALUATION 202 %enddef %define SWIGWARN_PP_INCLUDEALL_IMPORTALL 203 %enddef %define SWIGWARN_PP_CPP_WARNING 204 %enddef %define SWIGWARN_PP_CPP_ERROR 205 %enddef %define SWIGWARN_PP_UNEXPECTED_TOKENS 206 %enddef /* -- C/C++ Parser -- */ %define SWIGWARN_PARSE_CLASS_KEYWORD 301 %enddef %define SWIGWARN_PARSE_REDEFINED 302 %enddef %define SWIGWARN_PARSE_EXTEND_UNDEF 303 %enddef %define SWIGWARN_PARSE_UNSUPPORTED_VALUE 304 %enddef %define SWIGWARN_PARSE_BAD_VALUE 305 %enddef %define SWIGWARN_PARSE_PRIVATE 306 %enddef %define SWIGWARN_PARSE_BAD_DEFAULT 307 %enddef %define SWIGWARN_PARSE_NAMESPACE_ALIAS 308 %enddef %define SWIGWARN_PARSE_PRIVATE_INHERIT 309 %enddef %define SWIGWARN_PARSE_TEMPLATE_REPEAT 310 %enddef %define SWIGWARN_PARSE_TEMPLATE_PARTIAL 311 %enddef %define SWIGWARN_PARSE_UNNAMED_NESTED_CLASS 312 %enddef %define SWIGWARN_PARSE_UNDEFINED_EXTERN 313 %enddef %define SWIGWARN_PARSE_KEYWORD 314 %enddef %define SWIGWARN_PARSE_USING_UNDEF 315 %enddef %define SWIGWARN_PARSE_MODULE_REPEAT 316 %enddef %define SWIGWARN_PARSE_TEMPLATE_SP_UNDEF 317 %enddef %define SWIGWARN_PARSE_TEMPLATE_AMBIG 318 %enddef %define SWIGWARN_PARSE_NO_ACCESS 319 %enddef %define SWIGWARN_PARSE_EXPLICIT_TEMPLATE 320 %enddef %define SWIGWARN_PARSE_BUILTIN_NAME 321 %enddef %define SWIGWARN_PARSE_REDUNDANT 322 %enddef %define SWIGWARN_PARSE_REC_INHERITANCE 323 %enddef %define SWIGWARN_PARSE_NESTED_TEMPLATE 324 %enddef %define SWIGWARN_PARSE_NAMED_NESTED_CLASS 325 %enddef %define SWIGWARN_PARSE_EXTEND_NAME 326 %enddef %define SWIGWARN_CPP11_LAMBDA 340 %enddef %define SWIGWARN_CPP11_ALIAS_DECLARATION 341 %enddef /* redundant now */ %define SWIGWARN_CPP11_ALIAS_TEMPLATE 342 %enddef /* redundant now */ %define SWIGWARN_CPP11_VARIADIC_TEMPLATE 343 %enddef %define SWIGWARN_IGNORE_OPERATOR_NEW 350 %enddef /* new */ %define SWIGWARN_IGNORE_OPERATOR_DELETE 351 %enddef /* delete */ %define SWIGWARN_IGNORE_OPERATOR_PLUS 352 %enddef /* + */ %define SWIGWARN_IGNORE_OPERATOR_MINUS 353 %enddef /* - */ %define SWIGWARN_IGNORE_OPERATOR_MUL 354 %enddef /* * */ %define SWIGWARN_IGNORE_OPERATOR_DIV 355 %enddef /* / */ %define SWIGWARN_IGNORE_OPERATOR_MOD 356 %enddef /* % */ %define SWIGWARN_IGNORE_OPERATOR_XOR 357 %enddef /* ^ */ %define SWIGWARN_IGNORE_OPERATOR_AND 358 %enddef /* & */ %define SWIGWARN_IGNORE_OPERATOR_OR 359 %enddef /* | */ %define SWIGWARN_IGNORE_OPERATOR_NOT 360 %enddef /* ~ */ %define SWIGWARN_IGNORE_OPERATOR_LNOT 361 %enddef /* ! */ %define SWIGWARN_IGNORE_OPERATOR_EQ 362 %enddef /* = */ %define SWIGWARN_IGNORE_OPERATOR_LT 363 %enddef /* < */ %define SWIGWARN_IGNORE_OPERATOR_GT 364 %enddef /* > */ %define SWIGWARN_IGNORE_OPERATOR_PLUSEQ 365 %enddef /* += */ %define SWIGWARN_IGNORE_OPERATOR_MINUSEQ 366 %enddef /* -= */ %define SWIGWARN_IGNORE_OPERATOR_MULEQ 367 %enddef /* *= */ %define SWIGWARN_IGNORE_OPERATOR_DIVEQ 368 %enddef /* /= */ %define SWIGWARN_IGNORE_OPERATOR_MODEQ 369 %enddef /* %= */ %define SWIGWARN_IGNORE_OPERATOR_XOREQ 370 %enddef /* ^= */ %define SWIGWARN_IGNORE_OPERATOR_ANDEQ 371 %enddef /* &= */ %define SWIGWARN_IGNORE_OPERATOR_OREQ 372 %enddef /* |= */ %define SWIGWARN_IGNORE_OPERATOR_LSHIFT 373 %enddef /* << */ %define SWIGWARN_IGNORE_OPERATOR_RSHIFT 374 %enddef /* >> */ %define SWIGWARN_IGNORE_OPERATOR_LSHIFTEQ 375 %enddef /* <<= */ %define SWIGWARN_IGNORE_OPERATOR_RSHIFTEQ 376 %enddef /* >>= */ %define SWIGWARN_IGNORE_OPERATOR_EQUALTO 377 %enddef /* == */ %define SWIGWARN_IGNORE_OPERATOR_NOTEQUAL 378 %enddef /* != */ %define SWIGWARN_IGNORE_OPERATOR_LTEQUAL 379 %enddef /* <= */ %define SWIGWARN_IGNORE_OPERATOR_GTEQUAL 380 %enddef /* >= */ %define SWIGWARN_IGNORE_OPERATOR_LAND 381 %enddef /* && */ %define SWIGWARN_IGNORE_OPERATOR_LOR 382 %enddef /* || */ %define SWIGWARN_IGNORE_OPERATOR_PLUSPLUS 383 %enddef /* ++ */ %define SWIGWARN_IGNORE_OPERATOR_MINUSMINUS 384 %enddef /* -- */ %define SWIGWARN_IGNORE_OPERATOR_COMMA 385 %enddef /* , */ %define SWIGWARN_IGNORE_OPERATOR_ARROWSTAR 386 %enddef /* ->* */ %define SWIGWARN_IGNORE_OPERATOR_ARROW 387 %enddef /* -> */ %define SWIGWARN_IGNORE_OPERATOR_CALL 388 %enddef /* () */ %define SWIGWARN_IGNORE_OPERATOR_INDEX 389 %enddef /* [] */ %define SWIGWARN_IGNORE_OPERATOR_UPLUS 390 %enddef /* + */ %define SWIGWARN_IGNORE_OPERATOR_UMINUS 391 %enddef /* - */ %define SWIGWARN_IGNORE_OPERATOR_UMUL 392 %enddef /* * */ %define SWIGWARN_IGNORE_OPERATOR_UAND 393 %enddef /* & */ %define SWIGWARN_IGNORE_OPERATOR_NEWARR 394 %enddef /* new [] */ %define SWIGWARN_IGNORE_OPERATOR_DELARR 395 %enddef /* delete [] */ %define SWIGWARN_IGNORE_OPERATOR_REF 396 %enddef /* operator *() */ /* 394-399 are reserved */ /* -- Type system and typemaps -- */ %define SWIGWARN_TYPE_UNDEFINED_CLASS 401 %enddef %define SWIGWARN_TYPE_INCOMPLETE 402 %enddef %define SWIGWARN_TYPE_ABSTRACT 403 %enddef %define SWIGWARN_TYPE_REDEFINED 404 %enddef %define SWIGWARN_TYPEMAP_SOURCETARGET 450 %enddef %define SWIGWARN_TYPEMAP_CHARLEAK 451 %enddef %define SWIGWARN_TYPEMAP_SWIGTYPE 452 %enddef %define SWIGWARN_TYPEMAP_APPLY_UNDEF 453 %enddef %define SWIGWARN_TYPEMAP_SWIGTYPELEAK 454 %enddef %define SWIGWARN_TYPEMAP_IN_UNDEF 460 %enddef %define SWIGWARN_TYPEMAP_OUT_UNDEF 461 %enddef %define SWIGWARN_TYPEMAP_VARIN_UNDEF 462 %enddef %define SWIGWARN_TYPEMAP_VAROUT_UNDEF 463 %enddef %define SWIGWARN_TYPEMAP_CONST_UNDEF 464 %enddef %define SWIGWARN_TYPEMAP_UNDEF 465 %enddef %define SWIGWARN_TYPEMAP_VAR_UNDEF 466 %enddef %define SWIGWARN_TYPEMAP_TYPECHECK 467 %enddef %define SWIGWARN_TYPEMAP_THROW 468 %enddef %define SWIGWARN_TYPEMAP_DIRECTORIN_UNDEF 469 %enddef %define SWIGWARN_TYPEMAP_THREAD_UNSAFE 470 %enddef /* mostly used in directorout typemaps */ %define SWIGWARN_TYPEMAP_DIRECTOROUT_UNDEF 471 %enddef %define SWIGWARN_TYPEMAP_TYPECHECK_UNDEF 472 %enddef %define SWIGWARN_TYPEMAP_DIRECTOROUT_PTR 473 %enddef %define SWIGWARN_TYPEMAP_OUT_OPTIMAL_IGNORED 474 %enddef %define SWIGWARN_TYPEMAP_OUT_OPTIMAL_MULTIPLE 475 %enddef %define SWIGWARN_TYPEMAP_INITIALIZER_LIST 476 %enddef %define SWIGWARN_TYPEMAP_DIRECTORTHROWS_UNDEF 477 %enddef /* -- Fragments -- */ %define SWIGWARN_FRAGMENT_NOT_FOUND 490 %enddef /* -- General code generation -- */ %define SWIGWARN_LANG_OVERLOAD_DECL 501 %enddef %define SWIGWARN_LANG_OVERLOAD_CONSTRUCT 502 %enddef %define SWIGWARN_LANG_IDENTIFIER 503 %enddef %define SWIGWARN_LANG_RETURN_TYPE 504 %enddef %define SWIGWARN_LANG_VARARGS 505 %enddef %define SWIGWARN_LANG_VARARGS_KEYWORD 506 %enddef %define SWIGWARN_LANG_NATIVE_UNIMPL 507 %enddef %define SWIGWARN_LANG_DEREF_SHADOW 508 %enddef %define SWIGWARN_LANG_OVERLOAD_SHADOW 509 %enddef %define SWIGWARN_LANG_FRIEND_IGNORE 510 %enddef %define SWIGWARN_LANG_OVERLOAD_KEYWORD 511 %enddef %define SWIGWARN_LANG_OVERLOAD_CONST 512 %enddef %define SWIGWARN_LANG_CLASS_UNNAMED 513 %enddef %define SWIGWARN_LANG_DIRECTOR_VDESTRUCT 514 %enddef %define SWIGWARN_LANG_DISCARD_CONST 515 %enddef %define SWIGWARN_LANG_OVERLOAD_IGNORED 516 %enddef %define SWIGWARN_LANG_DIRECTOR_ABSTRACT 517 %enddef %define SWIGWARN_LANG_PORTABILITY_FILENAME 518 %enddef %define SWIGWARN_LANG_TEMPLATE_METHOD_IGNORE 519 %enddef %define SWIGWARN_LANG_SMARTPTR_MISSING 520 %enddef %define SWIGWARN_LANG_ILLEGAL_DESTRUCTOR 521 %enddef %define SWIGWARN_LANG_EXTEND_CONSTRUCTOR 522 %enddef %define SWIGWARN_LANG_EXTEND_DESTRUCTOR 523 %enddef /* -- Reserved (600-799) -- */ /* -- Language module specific warnings (700 - 899) -- */ %define SWIGWARN_D_TYPEMAP_CTYPE_UNDEF 700 %enddef %define SWIGWARN_D_TYPEMAP_IMTYPE_UNDEF 701 %enddef %define SWIGWARN_D_TYPEMAP_DTYPE_UNDEF 702 %enddef %define SWIGWARN_D_MULTIPLE_INHERITANCE 703 %enddef %define SWIGWARN_D_TYPEMAP_CLASSMOD_UNDEF 704 %enddef %define SWIGWARN_D_TYPEMAP_DBODY_UNDEF 705 %enddef %define SWIGWARN_D_TYPEMAP_DOUT_UNDEF 706 %enddef %define SWIGWARN_D_TYPEMAP_DIN_UNDEF 707 %enddef %define SWIGWARN_D_TYPEMAP_DDIRECTORIN_UNDEF 708 %enddef %define SWIGWARN_D_TYPEMAP_DCONSTRUCTOR_UNDEF 709 %enddef %define SWIGWARN_D_EXCODE_MISSING 710 %enddef %define SWIGWARN_D_CANTHROW_MISSING 711 %enddef %define SWIGWARN_D_NO_DIRECTORCONNECT_ATTR 712 %enddef %define SWIGWARN_D_NAME_COLLISION 713 %enddef /* please leave 700-719 free for D */ %define SWIGWARN_SCILAB_TRUNCATED_NAME 720 %enddef /* please leave 720-739 free for Scilab */ %define SWIGWARN_PYTHON_INDENT_MISMATCH 740 %enddef /* please leave 740-759 free for Python */ %define SWIGWARN_RUBY_WRONG_NAME 801 %enddef %define SWIGWARN_RUBY_MULTIPLE_INHERITANCE 802 %enddef /* please leave 800-809 free for Ruby */ %define SWIGWARN_JAVA_TYPEMAP_JNI_UNDEF 810 %enddef %define SWIGWARN_JAVA_TYPEMAP_JTYPE_UNDEF 811 %enddef %define SWIGWARN_JAVA_TYPEMAP_JSTYPE_UNDEF 812 %enddef %define SWIGWARN_JAVA_MULTIPLE_INHERITANCE 813 %enddef %define SWIGWARN_JAVA_TYPEMAP_GETCPTR_UNDEF 814 %enddef %define SWIGWARN_JAVA_TYPEMAP_CLASSMOD_UNDEF 815 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVABODY_UNDEF 816 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVAOUT_UNDEF 817 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVAIN_UNDEF 818 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVADIRECTORIN_UNDEF 819 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVADIRECTOROUT_UNDEF 820 %enddef %define SWIGWARN_JAVA_TYPEMAP_INTERFACECODE_UNDEF 821 %enddef %define SWIGWARN_JAVA_COVARIANT_RET 822 %enddef %define SWIGWARN_JAVA_TYPEMAP_JAVACONSTRUCT_UNDEF 823 %enddef %define SWIGWARN_JAVA_TYPEMAP_DIRECTORIN_NODESC 824 %enddef %define SWIGWARN_JAVA_NO_DIRECTORCONNECT_ATTR 825 %enddef %define SWIGWARN_JAVA_NSPACE_WITHOUT_PACKAGE 826 %enddef /* please leave 810-829 free for Java */ %define SWIGWARN_CSHARP_TYPEMAP_CTYPE_UNDEF 830 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSTYPE_UNDEF 831 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF 832 %enddef %define SWIGWARN_CSHARP_MULTIPLE_INHERITANCE 833 %enddef %define SWIGWARN_CSHARP_TYPEMAP_GETCPTR_UNDEF 834 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CLASSMOD_UNDEF 835 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSBODY_UNDEF 836 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSOUT_UNDEF 837 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSIN_UNDEF 838 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSDIRECTORIN_UNDEF 839 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSDIRECTOROUT_UNDEF 840 %enddef %define SWIGWARN_CSHARP_TYPEMAP_INTERFACECODE_UNDEF 841 %enddef %define SWIGWARN_CSHARP_COVARIANT_RET 842 %enddef %define SWIGWARN_CSHARP_TYPEMAP_CSCONSTRUCT_UNDEF 843 %enddef %define SWIGWARN_CSHARP_EXCODE 844 %enddef %define SWIGWARN_CSHARP_CANTHROW 845 %enddef %define SWIGWARN_CSHARP_NO_DIRECTORCONNECT_ATTR 846 %enddef /* please leave 830-849 free for C# */ %define SWIGWARN_MODULA3_TYPEMAP_TYPE_UNDEF 850 %enddef %define SWIGWARN_MODULA3_TYPEMAP_GETCPTR_UNDEF 851 %enddef %define SWIGWARN_MODULA3_TYPEMAP_CLASSMOD_UNDEF 852 %enddef %define SWIGWARN_MODULA3_TYPEMAP_PTRCONSTMOD_UNDEF 853 %enddef %define SWIGWARN_MODULA3_TYPEMAP_MULTIPLE_RETURN 854 %enddef %define SWIGWARN_MODULA3_MULTIPLE_INHERITANCE 855 %enddef %define SWIGWARN_MODULA3_TYPECONSTRUCTOR_UNKNOWN 856 %enddef %define SWIGWARN_MODULA3_UNKNOWN_PRAGMA 857 %enddef %define SWIGWARN_MODULA3_BAD_ENUMERATION 858 %enddef %define SWIGWARN_MODULA3_DOUBLE_ID 859 %enddef %define SWIGWARN_MODULA3_BAD_IMPORT 860 %enddef /* please leave 850-869 free for Modula 3 */ %define SWIGWARN_PHP_MULTIPLE_INHERITANCE 870 %enddef %define SWIGWARN_PHP_UNKNOWN_PRAGMA 871 %enddef %define SWIGWARN_PHP_PUBLIC_BASE 872 %enddef /* please leave 870-889 free for PHP */ %define SWIGWARN_GO_NAME_CONFLICT 890 %enddef /* please leave 890-899 free for Go */ /* -- User defined warnings (900 - 999) -- */ swig-3.0.12/Lib/modula3/0000775000175000017500000000000013042756442014507 5ustar williamwilliamswig-3.0.12/Lib/modula3/modula3.swg0000664000175000017500000010564513042756442016610 0ustar williamwilliam/* ----------------------------------------------------------------------------- * modula3.swg * * Modula3 typemaps * ----------------------------------------------------------------------------- */ %include /* The ctype, m3rawtype and m3wraptype typemaps work together and so there should be one of each. * The ctype typemap contains the C type used in the signature of C wrappers for C++ functions. * The m3rawtype typemap contains the M3 type used in the raw interface. * The m3rawintype typemap contains the M3 type used as function argument. * The m3rawrettype typemap contains the M3 type used as return value. * The m3wraptype typemap contains the M3 type used in the M3 type wrapper classes and module class. */ /* Primitive types */ %typemap(ctype) bool, const bool & "bool" %typemap(ctype) char, const char & "char" %typemap(ctype) signed char, const signed char & "signed char" %typemap(ctype) unsigned char, const unsigned char & "unsigned short" %typemap(ctype) short, const short & "short" %typemap(ctype) unsigned short, const unsigned short & "unsigned short" %typemap(ctype) int, const int & "int" %typemap(ctype) unsigned int, const unsigned int & "unsigned int" %typemap(ctype) long, const long & "long" %typemap(ctype) unsigned long, const unsigned long & "unsigned long" %typemap(ctype) long long, const long long & "long long" %typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" %typemap(ctype) float, const float & "float" %typemap(ctype) double, const double & "double" %typemap(ctype) char * "char *" %typemap(ctype) void "void" %typemap(m3rawtype) bool, const bool & "BOOLEAN" %typemap(m3rawtype) char, const char & "C.char" %typemap(m3rawtype) signed char, const signed char & "C.signed_char" %typemap(m3rawtype) unsigned char, const unsigned char & "C.unsigned_char" %typemap(m3rawtype) short, const short & "C.short" %typemap(m3rawtype) unsigned short, const unsigned short & "C.unsigned_short" %typemap(m3rawtype) int, const int & "C.int" %typemap(m3rawtype) unsigned int, const unsigned int & "C.unsigned_int" %typemap(m3rawtype) long, const long & "C.long" %typemap(m3rawtype) unsigned long, const unsigned long & "C.unsigned_long" %typemap(m3rawtype) long long, const long long & "C.long_long" %typemap(m3rawtype) unsigned long long, const unsigned long long & "C.unsigned_long_long" %typemap(m3rawtype) float, const float & "C.float" %typemap(m3rawtype) double, const double & "C.double" %typemap(m3rawtype) long double, const long double & "C.long_double" %typemap(m3rawtype) char * "C.char_star" %typemap(m3rawtype) void "" %typemap(m3rawtype) FILE "Cstdio.FILE"; %typemap(m3rawtype) FILE * "Cstdio.FILE_star"; %typemap(m3rawintype) bool *, bool &, bool "BOOLEAN" %typemap(m3rawintype) char *, char &, char "C.char" %typemap(m3rawintype) signed char *, signed char &, signed char "C.signed_char" %typemap(m3rawintype) unsigned char *, unsigned char &, unsigned char "C.unsigned_char" %typemap(m3rawintype) short *, short &, short "C.short" %typemap(m3rawintype) unsigned short *, unsigned short &, unsigned short "C.unsigned_short" %typemap(m3rawintype) int *, int &, int "C.int" %typemap(m3rawintype) unsigned int *, unsigned int &, unsigned int "C.unsigned_int" %typemap(m3rawintype) long *, long &, long "C.long" %typemap(m3rawintype) unsigned long *, unsigned long &, unsigned long "C.unsigned_long" %typemap(m3rawintype) long long *, long long &, long long "C.long_long" %typemap(m3rawintype) unsigned long long *, unsigned long long &, unsigned long long "C.unsigned_long_long" %typemap(m3rawintype) float *, float &, float "C.float" %typemap(m3rawintype) double *, double &, double "C.double" %typemap(m3rawintype) long double *, long double &, long double "C.long_double" %typemap(m3rawintype) char * "C.char_star" %typemap(m3rawintype) void "" %typemap(m3rawintype) void * "ADDRESS" %typemap(m3rawintype) FILE "Cstdio.FILE"; %typemap(m3rawintype) FILE * "Cstdio.FILE_star"; %typemap(m3rawinmode) char *, void *, FILE * "" %typemap(m3rawrettype) bool, const bool & "BOOLEAN" %typemap(m3rawrettype) char, const char & "C.char" %typemap(m3rawrettype) signed char, const signed char & "C.signed_char" %typemap(m3rawrettype) unsigned char, const unsigned char & "C.unsigned_char" %typemap(m3rawrettype) short, const short & "C.short" %typemap(m3rawrettype) unsigned short, const unsigned short & "C.unsigned_short" %typemap(m3rawrettype) int, const int & "C.int" %typemap(m3rawrettype) unsigned int, const unsigned int & "C.unsigned_int" %typemap(m3rawrettype) long, const long & "C.long" %typemap(m3rawrettype) unsigned long, const unsigned long & "C.unsigned_long" %typemap(m3rawrettype) long long, const long long & "C.long_long" %typemap(m3rawrettype) unsigned long long, const unsigned long long & "C.unsigned_long_long" %typemap(m3rawrettype) float, const float & "C.float" %typemap(m3rawrettype) double, const double & "C.double" %typemap(m3rawrettype) long double, const long double & "C.long_double" %typemap(m3rawrettype) char * "C.char_star" %typemap(m3rawrettype) void "" %typemap(m3rawrettype) void * "ADDRESS" %typemap(m3rawrettype) FILE "Cstdio.FILE"; %typemap(m3rawrettype) FILE * "Cstdio.FILE_star"; %typemap("m3rawtype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawintype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawrettype:import") char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, long double, const long double &, char * "Ctypes AS C" %typemap("m3rawtype:import") FILE, FILE * "Cstdio"; %typemap("m3rawintype:import") FILE, FILE * "Cstdio"; %typemap("m3rawrettype:import") FILE, FILE * "Cstdio"; %typemap(m3wraptype) bool, const bool & "BOOLEAN" %typemap(m3wraptype) char, const char & "CHAR" %typemap(m3wraptype) signed char, const signed char & "CHAR" %typemap(m3wraptype) unsigned char, const unsigned char & "CHAR" %typemap(m3wraptype) short, const short & "Integer16.T" %typemap(m3wraptype) unsigned short, const unsigned short & "Cardinal16.T" %typemap(m3wraptype) int, const int & "INTEGER" %typemap(m3wraptype) unsigned int, const unsigned int & "CARDINAL" %typemap(m3wraptype) long, const long & "Integer32.T" %typemap(m3wraptype) unsigned long, const unsigned long & "Cardinal32.T" %typemap(m3wraptype) long long, const long long & "Integer64.T" %typemap(m3wraptype) unsigned long long, const unsigned long long & "Cardinal64.T" %typemap(m3wraptype) float, const float & "REAL" %typemap(m3wraptype) double, const double & "LONGREAL" %typemap(m3wraptype) long double, const long double & "EXTENDED" %typemap(m3wraptype) char * "TEXT" %typemap(m3wraptype) void "" %typemap(m3wraptype) FILE "Cstdio.FILE"; %typemap(m3wraptype) FILE * "Cstdio.FILE_star"; %typemap(m3wrapintype) bool, const bool *, const bool & "BOOLEAN" %typemap(m3wrapintype) char, const char *, const char & "CHAR" %typemap(m3wrapintype) signed char, const signed char *, const signed char & "CHAR" %typemap(m3wrapintype) unsigned char, const unsigned char *, const unsigned char & "CHAR" %typemap(m3wrapintype) short, const short *, const short & "INTEGER" %typemap(m3wrapintype) unsigned short, const unsigned short *, const unsigned short & "CARDINAL" %typemap(m3wrapintype) int, const int *, const int & "INTEGER" %typemap(m3wrapintype) unsigned int, const unsigned int *, const unsigned int & "CARDINAL" %typemap(m3wrapintype) long, const long *, const long & "INTEGER" %typemap(m3wrapintype) unsigned long, const unsigned long *, const unsigned long & "CARDINAL" %typemap(m3wrapintype) long long, const long long *, const long long & "INTEGER" %typemap(m3wrapintype) unsigned long long, const unsigned long long *, const unsigned long long & "CARDINAL" %typemap(m3wrapintype) float, const float *, const float & "REAL" %typemap(m3wrapintype) double, const double *, const double & "LONGREAL" %typemap(m3wrapintype) long double, const long double *, const long double & "EXTENDED" %typemap(m3wrapintype) const char *, const char [] "TEXT" %typemap(m3wrapintype,numinputs=0) void "" %typemap(m3wrapintype) FILE "Cstdio.FILE"; %typemap(m3wrapintype) FILE * "Cstdio.FILE_star"; %typemap(m3wrapouttype) bool, bool *, bool & "BOOLEAN" %typemap(m3wrapouttype) char, char *, char & "CHAR" %typemap(m3wrapouttype) signed char, signed char *, signed char & "CHAR" %typemap(m3wrapouttype) unsigned char, unsigned char *, unsigned char & "CHAR" %typemap(m3wrapouttype) short, short *, short & "INTEGER" %typemap(m3wrapouttype) unsigned short, unsigned short *, unsigned short & "CARDINAL" %typemap(m3wrapouttype) int, int *, int & "INTEGER" %typemap(m3wrapouttype) unsigned int, unsigned int *, unsigned int & "CARDINAL" %typemap(m3wrapouttype) long, long *, long & "INTEGER" %typemap(m3wrapouttype) unsigned long, unsigned long *, unsigned long & "CARDINAL" %typemap(m3wrapouttype) long long, long long *, long long & "INTEGER" %typemap(m3wrapouttype) unsigned long long, unsigned long long *, unsigned long long & "CARDINAL" %typemap(m3wrapouttype) float, float *, float & "REAL" %typemap(m3wrapouttype) double, double *, double & "LONGREAL" %typemap(m3wrapouttype) long double, long double *, long double & "EXTENDED" %typemap(m3wrapouttype) char *, char [] "TEXT" %typemap(m3wrapouttype,numinputs=0) void "" %typemap(m3wraprettype) bool, const bool & "BOOLEAN" %typemap(m3wraprettype) char, const char & "CHAR" %typemap(m3wraprettype) signed char, const signed char & "CHAR" %typemap(m3wraprettype) unsigned char, const unsigned char & "CHAR" %typemap(m3wraprettype) short, const short & "INTEGER" %typemap(m3wraprettype) unsigned short, const unsigned short & "CARDINAL" %typemap(m3wraprettype) int, const int & "INTEGER" %typemap(m3wraprettype) unsigned int, const unsigned int & "CARDINAL" %typemap(m3wraprettype) long, const long & "INTEGER" %typemap(m3wraprettype) unsigned long, const unsigned long & "CARDINAL" %typemap(m3wraprettype) long long, const long long & "INTEGER" %typemap(m3wraprettype) unsigned long long, const unsigned long long & "CARDINAL" %typemap(m3wraprettype) float, const float & "REAL" %typemap(m3wraprettype) double, const double & "LONGREAL" %typemap(m3wraprettype) long double, const long double & "EXTENDED" %typemap(m3wraprettype) char * "TEXT" %typemap(m3wraprettype) void "" %typemap(m3wraprettype) FILE "Cstdio.FILE"; %typemap(m3wraprettype) FILE * "Cstdio.FILE_star"; %typemap(ctype) char[ANY] "char *" %typemap(m3rawtype) char[ANY] "C.char_star" %typemap(m3rawintype) char[ANY] "C.char_star" %typemap(m3rawrettype) char[ANY] "C.char_star" %typemap(m3wraptype) char[ANY] "TEXT" %typemap(m3wrapintype) char[ANY] "TEXT" %typemap(m3wrapouttype) char[ANY] "TEXT" %typemap(m3wraprettype) char[ANY] "TEXT" %typemap(m3wrapinmode) const char * %{%} %typemap(m3wrapargvar) const char * %{$1 : C.char_star;%} %typemap(m3wrapinconv) const char * %{$1 := M3toC.SharedTtoS($1_name);%} %typemap(m3wrapfreearg) const char * %{M3toC.FreeSharedS($1_name,$1);%} %typemap(m3wrapargraw) const char * %{$1%} %typemap("m3wrapargvar:import") const char * "Ctypes AS C" %typemap("m3wrapinconv:import") const char * "M3toC" %typemap("m3wrapfreearg:import") const char * "M3toC" %typemap(m3wrapretvar) char * %{result : C.char_star;%} %typemap(m3wrapretraw) char * %{result%} %typemap(m3wrapretconv) char * %{M3toC.CopyStoT(result)%} %typemap("m3wrapretvar:import") char * "Ctypes AS C" %typemap("m3wrapretconv:import") char * "M3toC" %typemap(m3wrapinmode) FILE * %{%} %typemap("m3wraptype:import") FILE, FILE * "Cstdio"; %typemap("m3wrapintype:import") FILE, FILE * "Cstdio"; %typemap("m3wraprettype:import") FILE, FILE * "Cstdio"; /* Composed types */ %typemap(ctype) SWIGTYPE "$1_type" %typemap(m3rawtype) SWIGTYPE "$1_basetype" %typemap(m3rawrettype) SWIGTYPE "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE "$1_basetype" %typemap(m3wrapintype) SWIGTYPE "$1_basetype" %typemap(m3wrapouttype) SWIGTYPE "$1_basetype" %typemap(m3wraprettype) SWIGTYPE "$1_basetype" %typemap(ctype) SWIGTYPE [] "$1_type" %typemap(m3rawtype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawtype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawintype) const SWIGTYPE [] "(*ARRAY OF*) $1_basetype" %typemap(m3rawinmode) const SWIGTYPE [] "READONLY" %typemap(m3rawintype) SWIGTYPE [] "(*ARRAY OF*) $1_basetype" %typemap(m3rawinmode) SWIGTYPE [] "VAR" %typemap(m3rawrettype) const SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3rawrettype) SWIGTYPE [] "UNTRACED REF ARRAY INTEGER OF $1_basetype" %typemap(m3wraptype) SWIGTYPE [] "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wrapinmode) const SWIGTYPE [] "READONLY" %typemap(m3wrapintype) SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wrapinmode) SWIGTYPE [] "VAR" %typemap(m3wrapouttype) SWIGTYPE [] "ARRAY OF $1_basetype" %typemap(m3wraprettype) SWIGTYPE [] "REF ARRAY OF $1_basetype" %typemap(ctype) SWIGTYPE * "$1_type" %typemap(m3rawtype) const SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE * "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE * "READONLY" %typemap(m3rawintype) SWIGTYPE * "$1_basetype" %typemap(m3rawinmode) SWIGTYPE * "VAR" %typemap(m3rawrettype) const SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE * "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE * "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE * "READONLY" %typemap(m3wrapintype) SWIGTYPE * "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE * "VAR" %typemap(m3wrapouttype) SWIGTYPE * "$1_basetype" %typemap(m3wraprettype) SWIGTYPE * "UNTRACED REF $1_basetype" %typemap(ctype) SWIGTYPE & "$1_type" %typemap(m3rawtype) const SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE & "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE & "READONLY" %typemap(m3rawintype) SWIGTYPE & "$1_basetype" %typemap(m3rawinmode) SWIGTYPE & "VAR" %typemap(m3rawrettype) const SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE & "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE & "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE & "READONLY" %typemap(m3wrapintype) SWIGTYPE & "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE & "VAR" %typemap(m3wrapouttype) SWIGTYPE & "$1_basetype" %typemap(m3wraprettype) SWIGTYPE & "UNTRACED REF $1_basetype" %typemap(ctype) SWIGTYPE && "$1_type" %typemap(m3rawtype) const SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawtype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawintype) const SWIGTYPE && "$1_basetype" %typemap(m3rawinmode) const SWIGTYPE && "READONLY" %typemap(m3rawintype) SWIGTYPE && "$1_basetype" %typemap(m3rawinmode) SWIGTYPE && "VAR" %typemap(m3rawrettype) const SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3rawrettype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(m3wraptype) SWIGTYPE && "$1_basetype" %typemap(m3wrapintype) const SWIGTYPE && "$1_basetype" %typemap(m3wrapinmode) const SWIGTYPE && "READONLY" %typemap(m3wrapintype) SWIGTYPE && "$1_basetype" %typemap(m3wrapinmode) SWIGTYPE && "VAR" %typemap(m3wrapouttype) SWIGTYPE && "$1_basetype" %typemap(m3wraprettype) SWIGTYPE && "UNTRACED REF $1_basetype" %typemap(ctype) enum SWIGTYPE "$1_type" %typemap(m3rawtype) enum SWIGTYPE "C.int" %typemap(m3rawintype) enum SWIGTYPE "C.int (* $1_type *)" %typemap(m3rawrettype) enum SWIGTYPE "C.int" %typemap(m3wraptype) enum SWIGTYPE "$*1_type" %typemap(m3wrapintype) enum SWIGTYPE "$1_type" %typemap(m3wrapouttype) enum SWIGTYPE "$1_type" %typemap(m3wraprettype) enum SWIGTYPE "$*1_type" /* pointer to a class member */ %typemap(ctype) SWIGTYPE (CLASS::*) "$1_type" %typemap(m3rawtype) SWIGTYPE (CLASS::*) "REFANY" %typemap(m3wraptype) SWIGTYPE (CLASS::*) "$1_basetype" /* The following are the in, out, freearg, argout typemaps. These are the PInvoke code generating typemaps for converting from C# to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double, enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) bool %{ $result = $1; %} %typemap(out) char %{ $result = $1; %} %typemap(out) signed char %{ $result = $1; %} %typemap(out) unsigned char %{ $result = $1; %} %typemap(out) short %{ $result = $1; %} %typemap(out) unsigned short %{ $result = $1; %} %typemap(out) int %{ $result = $1; %} %typemap(out) unsigned int %{ $result = $1; %} %typemap(out) long %{ $result = $1; %} %typemap(out) unsigned long %{ $result = $1; %} %typemap(out) long long %{ $result = $1; %} %typemap(out) unsigned long long %{ $result = $1; %} %typemap(out) float %{ $result = $1; %} %typemap(out) double %{ $result = $1; %} %typemap(out) enum SWIGTYPE %{ $result = $1; %} /* char * - treat as String */ %typemap(in) char * { $1 = $input; } //%typemap(freearg) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } //%typemap(out) char * { if($1) $result = JCALL1(NewStringUTF, jenv, $1); } %typemap(out) void "" /* primitive types by const reference */ %typemap(in) const bool & (bool temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(in) const char & (char temp), const signed char & (signed char temp), const unsigned char & (unsigned char temp), const short & (short temp), const unsigned short & (unsigned short temp), const int & (int temp), const unsigned int & (unsigned int temp), const long & (long temp), const unsigned long & (unsigned long temp), const long long & ($*1_ltype temp), const unsigned long long & ($*1_ltype temp), const float & (float temp), const double & (double temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const bool & %{ $result = *$1; %} %typemap(out) const char & %{ $result = *$1; %} %typemap(out) const signed char & %{ $result = *$1; %} %typemap(out) const unsigned char & %{ $result = *$1; %} %typemap(out) const short & %{ $result = *$1; %} %typemap(out) const unsigned short & %{ $result = *$1; %} %typemap(out) const int & %{ $result = *$1; %} %typemap(out) const unsigned int & %{ $result = *$1; %} %typemap(out) const long & %{ $result = *$1; %} %typemap(out) const unsigned long & %{ $result = *$1; %} %typemap(out) const long long & %{ $result = *$1; %} %typemap(out) const unsigned long long & %{ $result = *$1; %} %typemap(out) const float & %{ $result = *$1; %} %typemap(out) const double & %{ $result = *$1; %} /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { // SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); RETURN $null; } $1 = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{*($&1_ltype*)&$result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif /* Generic pointers and references */ %typemap(in) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ $1 = *($&1_ltype)&$input; %} %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; if(!$1) { //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); RETURN $null; } %} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; if(!$1) { //SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); RETURN $null; } %} %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE (CLASS::*) %{ *($&1_ltype)&$result = $1; %} /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} /* char[ANY] - treat as String */ %typemap(in) char[ANY] { $1 = $input; } %typemap(argout) char[ANY] "" %typemap(freearg) char[ANY] ""//{ if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, $1); } %typemap(out) char[ANY] { if($1) $result = $1; } /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in C# as more than one C++ type maps to a single C# type */ %typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */ bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Java char */ char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Java byte */ signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Java short */ unsigned char, short, const unsigned char &, const short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Java int */ unsigned short, int, long, const unsigned short &, const int &, const long &, enum SWIGTYPE "" %typecheck(SWIG_TYPECHECK_INT64) /* Java long */ unsigned int, unsigned long, long long, const unsigned int &, const unsigned long &, const long long & "" %typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */ unsigned long long "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */ float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */ double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Java String */ char *, char[ANY] "" %typecheck(SWIG_TYPECHECK_POINTER) /* Default */ SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg); RETURN $null; } %typemap(throws) SWIGTYPE { (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); RETURN $null; } %typemap(throws) char * { SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1); RETURN $null; } /* Typemaps for code generation in proxy classes and C# type wrapper classes */ /* The in typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the PInvoke class. */ %typemap(m3in) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE "$input" %typemap(m3in) SWIGTYPE "$&*1_type.getCPtr($input)" %typemap(m3in) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "$1_basetype.getCPtr($input)" /* The m3out typemap is used for converting function return types from the return type * used in the PInvoke class to the type returned by the proxy, module or type wrapper class. */ %typemap(m3out) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE %{$imcall%} %typemap(m3out) void %{$imcall%} %typemap(m3out) SWIGTYPE %{ RETURN NEW(REF $1_basetype, $imcall); %} %typemap(m3out) SWIGTYPE & %{ RETURN NEW($1_basetype, $imcall, $owner); %} %typemap(m3out) SWIGTYPE && %{ RETURN NEW($1_basetype, $imcall, $owner); %} %typemap(m3out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ cPtr := $imcall; RETURN (cPtr = IntPtr.Zero) ? null : NEW($1_basetype, cPtr, $owner); %} /* Properties */ %typemap(m3varin) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ PROCEDURE Set$var (value: $vartype) = BEGIN $imcall; END Set$var; %} %typemap(m3varout) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double &, char *, char[ANY], enum SWIGTYPE %{ PROCEDURE Get$var (): $vartype = BEGIN RETURN $imcall; END Get$var; %} %typemap(m3varout) void %{ get { $imcall; } %} %typemap(m3varout) SWIGTYPE %{ get { RETURN new $&*1_mangle($imcall, true); } %} %typemap(m3varout) SWIGTYPE & %{ get { RETURN new $1_basetype($imcall, $owner); } %} %typemap(m3varout) SWIGTYPE && %{ get { RETURN new $1_basetype($imcall, $owner); } %} %typemap(m3varout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ get { IntPtr cPtr = $imcall; RETURN (cPtr == IntPtr.Zero) ? null : new $1_basetype(cPtr, $owner); } %} /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(m3base) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3classmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public" %typemap(m3code) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3imports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "using System;" %typemap(m3interfaces) SWIGTYPE "IDisposable" %typemap(m3interfaces_derived) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(m3ptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "internal" %typemap(m3finalize) SWIGTYPE %{ ~$1_basetype() { Dispose(); } %} %typemap(m3destruct, methodname="Dispose") SWIGTYPE { if(swigCPtr != IntPtr.Zero && swigCMemOwn) { $imcall; swigCMemOwn = false; } swigCPtr = IntPtr.Zero; GC.SuppressFinalize(this); } %typemap(m3destruct_derived, methodname="Dispose") SWIGTYPE { if(swigCPtr != IntPtr.Zero && swigCMemOwn) { $imcall; swigCMemOwn = false; } swigCPtr = IntPtr.Zero; GC.SuppressFinalize(this); base.Dispose(); } %typemap(m3getcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) %{ internal static IntPtr getCPtr($1_basetype obj) { RETURN (obj == null) ? IntPtr.Zero : obj.swigCPtr; } %} /* M3 specific directives */ #define %m3multiretval %feature("modula3:multiretval") #define %constnumeric(num) %feature("constnumeric","num") %pragma(modula3) moduleimports=%{ IMPORT BlaBla; %} %pragma(modula3) imclassimports=%{ FROM BlaBla IMPORT Bla; %} /* Some ANSI C typemaps */ %apply unsigned long { size_t }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } swig-3.0.12/Lib/modula3/modula3head.swg0000664000175000017500000000374613042756442017431 0ustar williamwilliam/* ----------------------------------------------------------------------------- * modula3head.swg * * Modula3 support code * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include %} #if 0 %insert(runtime) %{ /* Support for throwing Modula3 exceptions */ typedef enum { SWIG_JavaOutOfMemoryError = 1, SWIG_JavaIOException, SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaUnknownError } SWIG_JavaExceptionCodes; typedef struct { SWIG_JavaExceptionCodes code; const char *java_exception; } SWIG_JavaExceptions_t; #if defined(SWIG_NOINCLUDE) void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg); #else %} %insert(runtime) { void SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { jclass excep; static const SWIG_JavaExceptions_t java_exceptions[] = { { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, { SWIG_JavaIOException, "java/io/IOException" }, { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) except_ptr++; JCALL0(ExceptionClear, jenv); excep = JCALL1(FindClass, jenv, except_ptr->java_exception); if (excep) JCALL2(ThrowNew, jenv, excep, msg); } } %insert(runtime) %{ #endif %} #endif swig-3.0.12/Lib/modula3/typemaps.i0000664000175000017500000001032113042756442016520 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* These typemaps will eventually probably maybe make their way into named typemaps * OUTPUT * and OUTPUT & as they currently break functions that return a pointer or * reference. */ %typemap(ctype) bool *, bool & "bool *" %typemap(ctype) char & "char *" %typemap(ctype) signed char *, signed char & "signed char *" %typemap(ctype) unsigned char *, unsigned char & "unsigned short *" %typemap(ctype) short *, short & "short *" %typemap(ctype) unsigned short *, unsigned short & "unsigned short *" %typemap(ctype) int *, int & "int *" %typemap(ctype) unsigned int *, unsigned int & "unsigned int *" %typemap(ctype) long *, long & "long *" %typemap(ctype) unsigned long *, unsigned long & "unsigned long *" %typemap(ctype) long long *, long long & "long long *" %typemap(ctype) unsigned long long *, unsigned long long & "unsigned long long *" %typemap(ctype) float *, float & "float *" %typemap(ctype) double *, double & "double *" %typemap(imtype) bool *, bool & "ref bool" %typemap(imtype) char & "ref char" %typemap(imtype) signed char *, signed char & "ref sbyte" %typemap(imtype) unsigned char *, unsigned char & "ref byte" %typemap(imtype) short *, short & "ref short" %typemap(imtype) unsigned short *, unsigned short & "ref ushort" %typemap(imtype) int *, int & "ref int" %typemap(imtype) unsigned int *, unsigned int & "ref uint" %typemap(imtype) long *, long & "ref int" %typemap(imtype) unsigned long *, unsigned long & "ref uint" %typemap(imtype) long long *, long long & "ref long" %typemap(imtype) unsigned long long *, unsigned long long & "ref ulong" %typemap(imtype) float *, float & "ref float" %typemap(imtype) double *, double & "ref double" %typemap(cstype) bool *, bool & "ref bool" %typemap(cstype) char & "ref char" %typemap(cstype) signed char *, signed char & "ref sbyte" %typemap(cstype) unsigned char *, unsigned char & "ref byte" %typemap(cstype) short *, short & "ref short" %typemap(cstype) unsigned short *, unsigned short & "ref ushort" %typemap(cstype) int *, int & "ref int" %typemap(cstype) unsigned int *, unsigned int & "ref uint" %typemap(cstype) long *, long & "ref int" %typemap(cstype) unsigned long *, unsigned long & "ref uint" %typemap(cstype) long long *, long long & "ref long" %typemap(cstype) unsigned long long *, unsigned long long & "ref ulong" %typemap(cstype) float *, float & "ref float" %typemap(cstype) double *, double & "ref double" %typemap(csin) bool *, bool &, char &, signed char *, signed char &, unsigned char *, unsigned char &, short *, short &, unsigned short *, unsigned short &, int *, int &, unsigned int *, unsigned int &, long *, long &, unsigned long *, unsigned long &, long long *, long long &, unsigned long long *, unsigned long long &, float *, float &, double *, double & "ref $csinput" swig-3.0.12/Lib/std/0000775000175000017500000000000013042756442013735 5ustar williamwilliamswig-3.0.12/Lib/std/std_wiostream.i0000664000175000017500000000014413042756442016772 0ustar williamwilliam/* Provide 'std_iostream.i' with wchar support. */ %include %include swig-3.0.12/Lib/std/std_deque.i0000664000175000017500000000664613042756442016100 0ustar williamwilliam// // std::deque %include // Deque %define %std_deque_methods(deque...) %std_sequence_methods(deque) void pop_front(); void push_front(const value_type& x); %enddef %define %std_deque_methods_val(deque...) %std_sequence_methods_val(deque) void pop_front(); void push_front(value_type x); %enddef // ------------------------------------------------------------------------ // std::deque // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::deque), f(const std::deque&): // the parameter being read-only, either a sequence or a // previously wrapped std::deque can be passed. // -- f(std::deque&), f(std::deque*): // the parameter may be modified; therefore, only a wrapped std::deque // can be passed. // -- std::deque f(), const std::deque& f(): // the deque is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::deque& f(), std::deque* f(): // the deque is returned by reference; therefore, a wrapped std::deque // is returned // -- const std::deque* f(), f(const std::deque*): // for consistency, they expect and return a plain deque pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class deque { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::deque< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdDequeTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::deque<" #_Tp " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_DEQUE, std::deque< _Tp, _Alloc >); #ifdef %swig_deque_methods // Add swig/language extra methods %swig_deque_methods(std::deque< _Tp, _Alloc >); #endif %std_deque_methods(deque); }; template class deque< _Tp*, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::deque< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdDequeTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::deque<" #_Tp " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_DEQUE, std::deque< _Tp*, _Alloc >); #ifdef %swig_deque_methods_val // Add swig/language extra methods %swig_deque_methods_val(std::deque< _Tp*, _Alloc >); #endif %std_deque_methods_val(deque); }; } swig-3.0.12/Lib/std/std_multiset.i0000664000175000017500000000475413042756442016641 0ustar williamwilliam// // std::multiset // %include // Multiset %define %std_multiset_methods(multiset...) %std_set_methods_common(multiset); %enddef // ------------------------------------------------------------------------ // std::multiset // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::multiset), f(const std::multiset&): // the parameter being read-only, either a sequence or a // previously wrapped std::multiset can be passed. // -- f(std::multiset&), f(std::multiset*): // the parameter may be modified; therefore, only a wrapped std::multiset // can be passed. // -- std::multiset f(), const std::multiset& f(): // the set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::multiset& f(), std::multiset* f(): // the set is returned by reference; therefore, a wrapped std::multiset // is returned // -- const std::multiset* f(), f(const std::multiset*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ // exported classes namespace std { //multiset template , class _Alloc = allocator< _Key > > class multiset { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::multiset< _Key, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdMultisetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::multiset<" #_Key "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTISET, std::multiset< _Key, _Compare, _Alloc >); multiset( const _Compare& ); #ifdef %swig_multiset_methods // Add swig/language extra methods %swig_multiset_methods(std::multiset< _Key, _Compare, _Alloc >); #endif %std_multiset_methods(multiset); }; } swig-3.0.12/Lib/std/std_multimap.i0000664000175000017500000000627213042756442016620 0ustar williamwilliam// // std::multimap // %include %define %std_multimap_methods(mmap...) %std_map_methods_common(mmap); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair equal_range(const key_type& x); std::pair equal_range(const key_type& x) const; #endif %enddef // ------------------------------------------------------------------------ // std::multimap // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::multimap), f(const std::multimap&): // the parameter being read-only, either a sequence or a // previously wrapped std::multimap can be passed. // -- f(std::multimap&), f(std::multimap*): // the parameter may be modified; therefore, only a wrapped std::multimap // can be passed. // -- std::multimap f(), const std::multimap& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::multimap& f(), std::multimap* f(): // the map is returned by reference; therefore, a wrapped std::multimap // is returned // -- const std::multimap* f(), f(const std::multimap*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ // exported class namespace std { template, class _Alloc = allocator > > class multimap { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::multimap< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMultimapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::multimap<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTIMAP, std::multimap< _Key, _Tp, _Compare, _Alloc >); multimap( const _Compare& ); #ifdef %swig_multimap_methods // Add swig/language extra methods %swig_multimap_methods(std::multimap< _Key, _Tp, _Compare, _Alloc >); #endif %std_multimap_methods(multimap); }; } swig-3.0.12/Lib/std/std_unordered_multiset.i0000664000175000017500000000570413042756442020704 0ustar williamwilliam// // std::unordered_multiset // Work in progress - the code is not compilable yet: // operator--() and constructor(compare function) not available for unordered_ // types // %include // Unordered Multiset %define %std_unordered_multiset_methods(unordered_multiset...) %std_unordered_set_methods_common(unordered_multiset); %enddef // ------------------------------------------------------------------------ // std::unordered_multiset // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_multiset), f(const std::unordered_multiset&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_multiset can be passed. // -- f(std::unordered_multiset&), f(std::unordered_multiset*): // the parameter may be modified; therefore, only a wrapped std::unordered_multiset // can be passed. // -- std::unordered_multiset f(), const std::unordered_multiset& f(): // the set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_multiset& f(), std::unordered_multiset* f(): // the set is returned by reference; therefore, a wrapped std::unordered_multiset // is returned // -- const std::unordered_multiset* f(), f(const std::unordered_multiset*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ // exported classes namespace std { //unordered_multiset template , class _Alloc = allocator< _Key > > class unordered_multiset { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::unordered_multiset< _Key, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdMultisetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_multiset<" #_Key "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTISET, std::unordered_multiset< _Key, _Compare, _Alloc >); unordered_multiset( const _Compare& ); #ifdef %swig_unordered_multiset_methods // Add swig/language extra methods %swig_unordered_multiset_methods(std::unordered_multiset< _Key, _Compare, _Alloc >); #endif %std_unordered_multiset_methods(unordered_multiset); }; } swig-3.0.12/Lib/std/std_vector.i0000664000175000017500000001402713042756442016267 0ustar williamwilliam// // std::vector // %include // Vector %define %std_vector_methods(vector...) %std_sequence_methods(vector) void reserve(size_type n); size_type capacity() const; %enddef %define %std_vector_methods_val(vector...) %std_sequence_methods_val(vector) void reserve(size_type n); size_type capacity() const; %enddef // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // as much as possible, namely, to allow the user to pass and // be returned tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&): // the parameter being read-only, either a sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter may be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(), const std::vector& f(): // the vector is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::vector& f(), std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // -- const std::vector* f(), f(const std::vector*): // for consistency, they expect and return a plain vector pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef _Tp& reference; typedef const _Tp& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %traits_enum(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::vector<" #_Tp "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp, _Alloc >); #ifdef %swig_vector_methods // Add swig/language extra methods %swig_vector_methods(std::vector< _Tp, _Alloc >); #endif %std_vector_methods(vector); }; // *** // This specialization should disappear or get simplified when // a 'const SWIGTYPE*&' can be defined // *** template class vector< _Tp*, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector<" #_Tp " *," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp*, _Alloc >); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector< _Tp*, _Alloc >); #endif %std_vector_methods_val(vector); }; // *** // const pointer specialization // *** template class vector< _Tp const *, _Alloc > { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp const * value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::vector< _Tp const*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector<" #_Tp " const*," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector< _Tp const*, _Alloc >); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector< _Tp const*, _Alloc >); #endif %std_vector_methods_val(vector); }; // *** // bool specialization // *** template class vector { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef bool value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(bool); %fragment(SWIG_Traits_frag(std::vector), "header", fragment=SWIG_Traits_frag(bool), fragment="StdVectorTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::vector"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); #ifdef %swig_vector_methods_val // Add swig/language extra methods %swig_vector_methods_val(std::vector); #endif %std_vector_methods_val(vector); #if defined(SWIG_STD_MODERN_STL) && !defined(SWIG_STD_NOMODERN_STL) void flip(); #endif }; } swig-3.0.12/Lib/std/std_carray.swg0000664000175000017500000000261013042756442016611 0ustar williamwilliam%{ #include %} // // std::carray - is really an extension to the 'std' namespace. // // A simple fix C array wrapper, more or less as presented in // // "The C++ Standarf Library", by Nicolai M. Josuttis // // which is also derived from the example in // // "The C++ Programming Language", by Bjarne Stroustup. // %inline %{ namespace std { template class carray { public: typedef _Type value_type; typedef size_t size_type; typedef _Type * iterator; typedef const _Type * const_iterator; carray() { } carray(const carray& c) { std::copy(c.v, c.v + size(), v); } template carray(_Iterator first, _Iterator last) { assign(first, last); } iterator begin() { return v; } iterator end() { return v + _Size; } const_iterator begin() const { return v; } const_iterator end() const { return v + _Size; } _Type& operator[](size_t i) { return v[i]; } const _Type& operator[](size_t i) const { return v[i]; } static size_t size() { return _Size; } template void assign(_Iterator first, _Iterator last) { if (std::distance(first,last) == size()) { std::copy(first, last, v); } else { throw std::length_error("bad range length"); } } private: _Type v[_Size]; }; } %} swig-3.0.12/Lib/std/std_alloc.i0000664000175000017500000000373713042756442016065 0ustar williamwilliamnamespace std { /** * @brief The "standard" allocator, as per [20.4]. * * The private _Alloc is "SGI" style. (See comments at the top * of stl_alloc.h.) * * The underlying allocator behaves as follows. * - __default_alloc_template is used via two typedefs * - "__single_client_alloc" typedef does no locking for threads * - "__alloc" typedef is threadsafe via the locks * - __new_alloc is used for memory requests * * (See @link Allocators allocators info @endlink for more.) */ template class allocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* pointer; typedef const _Tp* const_pointer; typedef _Tp& reference; typedef const _Tp& const_reference; typedef _Tp value_type; template struct rebind; allocator() throw(); allocator(const allocator&) throw(); template allocator(const allocator<_Tp1>&) throw(); ~allocator() throw(); pointer address(reference __x) const; const_pointer address(const_reference __x) const; // NB: __n is permitted to be 0. The C++ standard says nothing // about what the return value is when __n == 0. _Tp* allocate(size_type __n, const void* = 0); // __p is not permitted to be a null pointer. void deallocate(pointer __p, size_type __n); size_type max_size() const throw(); void construct(pointer __p, const _Tp& __val); void destroy(pointer __p); }; template<> class allocator { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef void* pointer; typedef const void* const_pointer; typedef void value_type; template struct rebind; }; } // namespace std swig-3.0.12/Lib/std/std_set.i0000664000175000017500000000644213042756442015562 0ustar williamwilliam// // std::set // %include %include // Set %define %std_set_methods_common(set...) set(); set( const set& ); bool empty() const; size_type size() const; void clear(); void swap(set& v); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; iterator begin(); iterator end(); reverse_iterator rbegin(); reverse_iterator rend(); %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator pos) { $self->erase(pos); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); iterator lower_bound(const key_type& x); iterator upper_bound(const key_type& x); std::pair equal_range(const key_type& x); #endif %enddef %define %std_set_methods(set...) %std_set_methods_common(set); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair insert(const value_type& __x); #endif %enddef // ------------------------------------------------------------------------ // std::set // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::set), f(const std::set&): // the parameter being read-only, either a sequence or a // previously wrapped std::set can be passed. // -- f(std::set&), f(std::set*): // the parameter may be modified; therefore, only a wrapped std::set // can be passed. // -- std::set f(), const std::set& f(): // the set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::set& f(), std::set* f(): // the set is returned by reference; therefore, a wrapped std::set // is returned // -- const std::set* f(), f(const std::set*): // for consistency, they expect and return a plain set pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template , class _Alloc = allocator< _Key > > class set { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::set< _Key, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdSetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::set<" #_Key "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_SET, std::set< _Key, _Compare, _Alloc >); set( const _Compare& ); #ifdef %swig_set_methods // Add swig/language extra methods %swig_set_methods(std::set< _Key, _Compare, _Alloc >); #endif %std_set_methods(set); }; } swig-3.0.12/Lib/std/std_container.i0000664000175000017500000001031113042756442016737 0ustar williamwilliam%include %include %include %{ #include %} // Common non-resizable container methods %define %std_container_methods_non_resizable(container...) container(); container(const container&); bool empty() const; size_type size() const; void swap(container& v); %enddef %define %std_container_methods_forward_iterators(container...) #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class const_iterator; iterator begin(); iterator end(); #endif %enddef %define %std_container_methods_reverse_iterators(container...) #ifdef SWIG_EXPORT_ITERATOR_METHODS class reverse_iterator; class const_reverse_iterator; reverse_iterator rbegin(); reverse_iterator rend(); #endif %enddef // Common container methods %define %std_container_methods(container...) %std_container_methods_non_resizable(%arg(container)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) void clear(); allocator_type get_allocator() const; %enddef %define %std_container_methods_without_reverse_iterators(container...) %std_container_methods_non_resizable(%arg(container)) %std_container_methods_forward_iterators(%arg(container)) void clear(); allocator_type get_allocator() const; %enddef // Common sequence %define %std_sequence_methods_common(sequence) %std_container_methods(%arg(sequence)); sequence(size_type size); void pop_back(); void resize(size_type new_size); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator erase(iterator pos) { return $self->erase(pos); } iterator erase(iterator first, iterator last) { return $self->erase(first, last); } } #endif %enddef %define %std_sequence_methods_non_resizable(sequence) %std_container_methods_non_resizable(%arg(sequence)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) const value_type& front() const; const value_type& back() const; %enddef %define %std_sequence_methods(sequence) %std_sequence_methods_common(%arg(sequence)); sequence(size_type size, const value_type& value); void push_back(const value_type& x); const value_type& front() const; const value_type& back() const; void assign(size_type n, const value_type& x); void resize(size_type new_size, const value_type& x); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator insert(iterator pos, const value_type& x) { return $self->insert(pos, x); } void insert(iterator pos, size_type n, const value_type& x) { $self->insert(pos, n, x); } } #endif %enddef %define %std_sequence_methods_non_resizable_val(sequence...) %std_container_methods_non_resizable(%arg(sequence)) %std_container_methods_forward_iterators(%arg(container)) %std_container_methods_reverse_iterators(%arg(container)) value_type front() const; value_type back() const; #endif %enddef %define %std_sequence_methods_val(sequence...) %std_sequence_methods_common(%arg(sequence)); sequence(size_type size, value_type value); void push_back(value_type x); value_type front() const; value_type back() const; void assign(size_type n, value_type x); void resize(size_type new_size, value_type x); #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 iterator insert(iterator pos, value_type x) { return $self->insert(pos, x); } void insert(iterator pos, size_type n, value_type x) { $self->insert(pos, n, x); } } #endif %enddef // // Ignore member methods for Type with no default constructor // %define %std_nodefconst_type(Type...) %feature("ignore") std::vector< Type >::vector(size_type size); %feature("ignore") std::vector< Type >::resize(size_type size); %feature("ignore") std::deque< Type >::deque(size_type size); %feature("ignore") std::deque< Type >::resize(size_type size); %feature("ignore") std::list< Type >::list(size_type size); %feature("ignore") std::list< Type >::resize(size_type size); %enddef swig-3.0.12/Lib/std/std_wstring.i0000664000175000017500000000037113042756442016457 0ustar williamwilliam%include %include /* wide strings */ namespace std { %std_comp_methods(basic_string); %naturalvar wstring; typedef basic_string wstring; } %template(wstring) std::basic_string; swig-3.0.12/Lib/std/std_unordered_map.i0000664000175000017500000001014113042756442017602 0ustar williamwilliam// // std::unordered_map // Work in progress - the code is not compilable yet: // operator--() and constructor(compare function) not available for unordered_ // types // %include %include %define %std_unordered_map_methods_common(unordered_map...) %std_container_methods(unordered_map); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator position) { $self->erase(position); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); iterator lower_bound(const key_type& x); iterator upper_bound(const key_type& x); #endif %enddef %define %std_unordered_map_methods(unordered_map...) %std_unordered_map_methods_common(unordered_map); #ifdef SWIG_EXPORT_ITERATOR_METHODS // iterator insert(const value_type& x); #endif %enddef // ------------------------------------------------------------------------ // std::unordered_map // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_map), f(const std::unordered_map&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_map can be passed. // -- f(std::unordered_map&), f(std::unordered_map*): // the parameter may be modified; therefore, only a wrapped std::unordered_map // can be passed. // -- std::unordered_map f(), const std::unordered_map& f(): // the unordered_map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_map& f(), std::unordered_map* f(): // the unordered_map is returned by reference; therefore, a wrapped std::unordered_map // is returned // -- const std::unordered_map* f(), f(const std::unordered_map*): // for consistency, they expect and return a plain unordered_map pointer. // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template, class _Alloc = allocator > > class unordered_map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::unordered_map< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_map<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MAP, std::unordered_map< _Key, _Tp, _Compare, _Alloc >); unordered_map( const _Compare& ); #ifdef %swig_unordered_map_methods // Add swig/language extra methods %swig_unordered_map_methods(std::unordered_map< _Key, _Tp, _Compare, _Alloc >); #endif %std_unordered_map_methods(unordered_map); }; } swig-3.0.12/Lib/std/std_sstream.i0000664000175000017500000001231313042756442016437 0ustar williamwilliam/* For wchar support, you need to include the wchar.i file before this file, ie: %include %include or equivalently, just include %include */ %include %include %include %include #if defined(SWIG_WCHAR) %include #endif %include %include %{ #include %} namespace std { template, typename _Alloc = allocator<_CharT> > class basic_stringbuf : public basic_streambuf<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors: explicit basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out); explicit basic_stringbuf(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::in | ios_base::out); // Get and set: basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; // 27.7.2 Template class basic_istringstream template, typename _Alloc = allocator<_CharT> > class basic_istringstream : public basic_istream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors: explicit basic_istringstream(ios_base::openmode __mode = ios_base::in); explicit basic_istringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::in); ~basic_istringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; // 27.7.3 Template class basic_ostringstream template, typename _Alloc = allocator<_CharT> > class basic_ostringstream : public basic_ostream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors/destructor: explicit basic_ostringstream(ios_base::openmode __mode = ios_base::out); explicit basic_ostringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __mode = ios_base::out); ~basic_ostringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; #if 0 void str(const basic_string<_CharT, _Traits, _Alloc>& __s); #endif }; // 27.7.4 Template class basic_stringstream template, typename _Alloc = allocator<_CharT> > class basic_stringstream : public basic_iostream<_CharT, _Traits> { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; // 251. basic_stringbuf missing allocator_type typedef _Alloc allocator_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: // Constructors/destructors explicit basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in); explicit basic_stringstream(const basic_string<_CharT, _Traits, _Alloc>& __str, ios_base::openmode __m = ios_base::out | ios_base::in); ~basic_stringstream(); // Members: basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const; basic_string<_CharT, _Traits, _Alloc> str() const; void str(const basic_string<_CharT, _Traits, _Alloc>& __s); }; } // namespace std namespace std { %template(istringstream) basic_istringstream; %template(ostringstream) basic_ostringstream; %template(stringstream) basic_stringstream; #if defined(SWIG_WCHAR) %template(wistringstream) basic_istringstream; %template(wostringstream) basic_ostringstream; %template(wstringstream) basic_stringstream; #endif } swig-3.0.12/Lib/std/std_unordered_multimap.i0000664000175000017500000000631613042756442020666 0ustar williamwilliam// // std::unordered_multimap // Work in progress - the code is not compilable yet: // operator--() and constructor(compare function) not available for unordered_ // types // %include %define %std_unordered_multimap_methods(mmap...) %std_map_methods_common(mmap); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair equal_range(const key_type& x); std::pair equal_range(const key_type& x) const; #endif %enddef // ------------------------------------------------------------------------ // std::unordered_multimap // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_multimap), f(const std::unordered_multimap&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_multimap can be passed. // -- f(std::unordered_multimap&), f(std::unordered_multimap*): // the parameter may be modified; therefore, only a wrapped std::unordered_multimap // can be passed. // -- std::unordered_multimap f(), const std::unordered_multimap& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_multimap& f(), std::unordered_multimap* f(): // the map is returned by reference; therefore, a wrapped std::unordered_multimap // is returned // -- const std::unordered_multimap* f(), f(const std::unordered_multimap*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ // exported class namespace std { template, class _Alloc = allocator > > class unordered_multimap { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::unordered_multimap< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMultimapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_multimap<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MULTIMAP, std::unordered_multimap< _Key, _Tp, _Compare, _Alloc >); unordered_multimap( const _Compare& ); #ifdef %swig_unordered_multimap_methods // Add swig/language extra methods %swig_unordered_multimap_methods(std::unordered_multimap< _Key, _Tp, _Compare, _Alloc >); #endif %std_unordered_multimap_methods(unordered_multimap); }; } swig-3.0.12/Lib/std/std_unordered_set.i0000664000175000017500000000743513042756442017634 0ustar williamwilliam// // std::unordered_set // Work in progress - the code is not compilable yet: // operator--() and constructor(compare function) not available for unordered_ // types // %include %include // Unordered Set %define %std_unordered_set_methods_common(unordered_set...) unordered_set(); unordered_set( const unordered_set& ); bool empty() const; size_type size() const; void clear(); void swap(unordered_set& v); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; iterator begin(); iterator end(); %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator pos) { $self->erase(pos); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); std::pair equal_range(const key_type& x); #endif %enddef %define %std_unordered_set_methods(unordered_set...) %std_unordered_set_methods_common(unordered_set); #ifdef SWIG_EXPORT_ITERATOR_METHODS std::pair insert(const value_type& __x); #endif %enddef // ------------------------------------------------------------------------ // std::unordered_set // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::unordered_set), f(const std::unordered_set&): // the parameter being read-only, either a sequence or a // previously wrapped std::unordered_set can be passed. // -- f(std::unordered_set&), f(std::unordered_set*): // the parameter may be modified; therefore, only a wrapped std::unordered_set // can be passed. // -- std::unordered_set f(), const std::unordered_set& f(): // the unordered_set is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::unordered_set& f(), std::unordered_set* f(): // the unordered_set is returned by reference; therefore, a wrapped std::unordered_set // is returned // -- const std::unordered_set* f(), f(const std::unordered_set*): // for consistency, they expect and return a plain unordered_set pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template , class _Compare = std::equal_to< _Key >, class _Alloc = allocator< _Key > > class unordered_set { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Hash hasher; typedef _Key value_type; typedef _Key key_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %fragment(SWIG_Traits_frag(std::unordered_set< _Key, _Hash, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(_Key), fragment="StdUnorderedSetTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::unordered_set<" #_Key "," #_Hash "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_SET, std::unordered_set< _Key, _Hash, _Compare, _Alloc >); unordered_set( const _Compare& ); #ifdef %swig_unordered_set_methods // Add swig/language extra methods %swig_unordered_set_methods(std::unordered_set< _Key, _Hash, _Compare, _Alloc >); #endif %std_unordered_set_methods(unordered_set); }; } swig-3.0.12/Lib/std/std_basic_string.i0000664000175000017500000001454413042756442017440 0ustar williamwilliam%include %include %include %include %fragment(""); namespace std { %naturalvar basic_string; } namespace std { template , typename _Alloc = allocator<_CharT> > class basic_string { #if !defined(SWIG_STD_MODERN_STL) || defined(SWIG_STD_NOMODERN_STL) %ignore push_back; %ignore clear; %ignore compare; %ignore append; #endif public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _CharT value_type; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; static const size_type npos; #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; #endif %traits_swigtype(_CharT); %fragment(SWIG_Traits_frag(_CharT)); basic_string(const _CharT* __s, size_type __n); // Capacity: size_type length() const; size_type max_size() const; size_type capacity() const; void reserve(size_type __res_arg = 0); // Modifiers: basic_string& append(const basic_string& __str); basic_string& append(const basic_string& __str, size_type __pos, size_type __n); basic_string& append(const _CharT* __s, size_type __n); basic_string& append(size_type __n, _CharT __c); basic_string& assign(const basic_string& __str); basic_string& assign(const basic_string& __str, size_type __pos, size_type __n); basic_string& assign(const _CharT* __s, size_type __n); basic_string& insert(size_type __pos1, const basic_string& __str); basic_string& insert(size_type __pos1, const basic_string& __str, size_type __pos2, size_type __n); basic_string& insert(size_type __pos, const _CharT* __s, size_type __n); basic_string& insert(size_type __pos, size_type __n, _CharT __c); basic_string& erase(size_type __pos = 0, size_type __n = npos); basic_string& replace(size_type __pos, size_type __n, const basic_string& __str); basic_string& replace(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2); basic_string& replace(size_type __pos, size_type __n1, const _CharT* __s, size_type __n2); basic_string& replace(size_type __pos, size_type __n1, size_type __n2, _CharT __c); size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const; // String operations: const _CharT* c_str() const; size_type find(const _CharT* __s, size_type __pos, size_type __n) const; size_type find(const basic_string& __str, size_type __pos = 0) const; size_type find(_CharT __c, size_type __pos = 0) const; size_type rfind(const basic_string& __str, size_type __pos = npos) const; size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const; size_type rfind(_CharT __c, size_type __pos = npos) const; size_type find_first_of(const basic_string& __str, size_type __pos = 0) const; size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_first_of(_CharT __c, size_type __pos = 0) const; size_type find_last_of(const basic_string& __str, size_type __pos = npos) const; size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_last_of(_CharT __c, size_type __pos = npos) const; size_type find_first_not_of(const basic_string& __str, size_type __pos = 0) const; size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_first_not_of(_CharT __c, size_type __pos = 0) const; size_type find_last_not_of(const basic_string& __str, size_type __pos = npos) const; size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const; size_type find_last_not_of(_CharT __c, size_type __pos = npos) const; basic_string substr(size_type __pos = 0, size_type __n = npos) const; int compare(const basic_string& __str) const; int compare(size_type __pos, size_type __n, const basic_string& __str) const; int compare(size_type __pos1, size_type __n1, const basic_string& __str, size_type __pos2, size_type __n2) const; %ignore pop_back(); %ignore front() const; %ignore back() const; %ignore basic_string(size_type n); %std_sequence_methods_val(basic_string); %ignore pop(); #ifdef %swig_basic_string // Add swig/language extra methods %swig_basic_string(std::basic_string< _CharT, _Traits, _Alloc >); #endif #ifdef SWIG_EXPORT_ITERATOR_METHODS class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; void insert(iterator __p, size_type __n, _CharT __c); basic_string& replace(iterator __i1, iterator __i2, const basic_string& __str); basic_string& replace(iterator __i1, iterator __i2, const _CharT* __s, size_type __n); basic_string& replace(iterator __i1, iterator __i2, size_type __n, _CharT __c); basic_string& replace(iterator __i1, iterator __i2, const _CharT* __k1, const _CharT* __k2); basic_string& replace(iterator __i1, iterator __i2, const_iterator __k1, const_iterator __k2); #endif basic_string& operator +=(const basic_string& v); %newobject __add__; %newobject __radd__; %extend { std::basic_string< _CharT,_Traits,_Alloc >* __add__(const basic_string& v) { std::basic_string< _CharT,_Traits,_Alloc >* res = new std::basic_string< _CharT,_Traits,_Alloc >(*self); *res += v; return res; } std::basic_string< _CharT,_Traits,_Alloc >* __radd__(const basic_string& v) { std::basic_string< _CharT,_Traits,_Alloc >* res = new std::basic_string< _CharT,_Traits,_Alloc >(v); *res += *self; return res; } std::basic_string< _CharT,_Traits,_Alloc > __str__() { return *self; } std::basic_ostream<_CharT, std::char_traits<_CharT> >& __rlshift__(std::basic_ostream<_CharT, std::char_traits<_CharT> >& out) { out << *self; return out; } } }; } swig-3.0.12/Lib/std/std_stack.i0000664000175000017500000000661713042756442016100 0ustar williamwilliam/** * @file std_stack.i * @date Sun May 6 01:48:07 2007 * * @brief A wrapping of std::stack for Ruby. * * */ %include // Stack %define %std_stack_methods(stack...) stack(); stack( const _Sequence& ); bool empty() const; size_type size() const; const value_type& top() const; void pop(); void push( const value_type& ); %enddef %define %std_stack_methods_val(stack...) %std_stack_methods(stack) %enddef // ------------------------------------------------------------------------ // std::stack // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::stack), f(const std::stack&): // the parameter being read-only, either a sequence or a // previously wrapped std::stack can be passed. // -- f(std::stack&), f(std::stack*): // the parameter may be modified; therefore, only a wrapped std::stack // can be passed. // -- std::stack f(), const std::stack& f(): // the stack is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::stack& f(), std::stack* f(): // the stack is returned by reference; therefore, a wrapped std::stack // is returned // -- const std::stack* f(), f(const std::stack*): // for consistency, they expect and return a plain stack pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class stack { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::stack< _Tp, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdStackTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::stack<" #_Tp "," #_Sequence " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STACK, std::stack< _Tp, _Sequence >); #ifdef %swig_stack_methods // Add swig/language extra methods %swig_stack_methods(std::stack< _Tp, _Sequence >); #endif %std_stack_methods(stack); }; template class stack< _Tp*, _Sequence > { public: typedef size_t size_type; typedef _Sequence::value_type value_type; typedef value_type reference; typedef value_type const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::stack< _Tp*, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdStackTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::stack<" #_Tp "," #_Sequence " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STACK, std::stack< _Tp*, _Sequence >); #ifdef %swig_stack_methods_val // Add swig/language extra methods %swig_stack_methods_val(std::stack< _Tp*, _Sequence >); #endif %std_stack_methods_val(stack); }; } swig-3.0.12/Lib/std/std_streambuf.i0000664000175000017500000000331513042756442016753 0ustar williamwilliam%include %{ #ifndef SWIG_STD_NOMODERN_STL #include #else #include #endif %} namespace std { template > class basic_streambuf { public: // Types: typedef _CharT char_type; typedef _Traits traits_type; typedef typename traits_type::int_type int_type; typedef typename traits_type::pos_type pos_type; typedef typename traits_type::off_type off_type; public: virtual ~basic_streambuf(); // Locales: locale pubimbue(const locale &__loc); locale getloc() const; // Buffer and positioning: basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n); pos_type pubseekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode = std::ios_base::in | std::ios_base::out); pos_type pubseekpos(pos_type __sp, ios_base::openmode __mode = std::ios_base::in | std::ios_base::out); int pubsync() ; // Get and put areas: // Get area: streamsize in_avail(); int_type snextc(); int_type sbumpc(); int_type sgetc(); streamsize sgetn(char_type* __s, streamsize __n); // Putback: int_type sputbackc(char_type __c); int_type sungetc(); // Put area: int_type sputc(char_type __c); streamsize sputn(const char_type* __s, streamsize __n); protected: basic_streambuf(); private: basic_streambuf(const basic_streambuf&); }; } namespace std { %template(streambuf) basic_streambuf; #if defined(SWIG_WCHAR) %template(wstreambuf) basic_streambuf; #endif } swig-3.0.12/Lib/std/std_common.i0000664000175000017500000001241713042756442016256 0ustar williamwilliam%include // // Use the following macro with modern STL implementations // //#define SWIG_STD_MODERN_STL // // Use this to deactive the previous definition, when using gcc-2.95 // or similar old compilers. // //#define SWIG_STD_NOMODERN_STL // Here, we identify compilers we know have problems with STL. %{ #if defined(__GNUC__) # if __GNUC__ == 2 && __GNUC_MINOR <= 96 # define SWIG_STD_NOMODERN_STL # endif #endif %} // // Common code for supporting the C++ std namespace // %fragment(""); %fragment(""); %fragment(""); %fragment("StdIteratorTraits","header",fragment="") %{ #if defined(__SUNPRO_CC) && defined(_RWSTD_VER) # if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL) # define SWIG_STD_NOITERATOR_TRAITS_STL # endif #endif #if !defined(SWIG_STD_NOITERATOR_TRAITS_STL) #include #else namespace std { template struct iterator_traits { typedef ptrdiff_t difference_type; typedef typename Iterator::value_type value_type; }; template struct iterator_traits<__reverse_bi_iterator > { typedef Distance difference_type; typedef T value_type; }; template struct iterator_traits { typedef T value_type; typedef ptrdiff_t difference_type; }; template inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { typename iterator_traits<_InputIterator>::difference_type __n = 0; while (__first != __last) { ++__first; ++__n; } return __n; } } #endif %} %fragment("StdTraitsCommon","header",fragment="") %{ namespace swig { template struct noconst_traits { typedef Type noconst_type; }; template struct noconst_traits { typedef Type noconst_type; }; /* type categories */ struct pointer_category { }; struct value_category { }; /* General traits that provides type_name and type_info */ template struct traits { }; template inline const char* type_name() { return traits::noconst_type >::type_name(); } template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; /* Partial specialization for pointers (traits_info) */ template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; template inline swig_type_info *type_info() { return traits_info::type_info(); } /* Partial specialization for pointers (traits) */ template struct traits { typedef pointer_category category; static std::string make_ptr_name(const char* name) { std::string ptrname = name; ptrname += " *"; return ptrname; } static const char* type_name() { static std::string name = make_ptr_name(swig::type_name()); return name.c_str(); } }; template struct traits_as { }; template struct traits_check { }; } %} /* Generate the traits for a swigtype */ %define %traits_swigtype(Type...) %fragment(SWIG_Traits_frag(Type),"header",fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return #Type; } }; } } %enddef /* Generate the typemaps for a class that has 'value' traits */ %define %typemap_traits(Code,Type...) %typemaps_asvalfrom(%arg(Code), %arg(swig::asval< Type >), %arg(swig::from), %arg(SWIG_Traits_frag(Type)), %arg(SWIG_Traits_frag(Type)), Type); %enddef /* Generate the typemaps for a class that behaves more like a 'pointer' or plain wrapped Swigtype. */ %define %typemap_traits_ptr(Code,Type...) %typemaps_asptrfrom(%arg(Code), %arg(swig::asptr), %arg(swig::from), %arg(SWIG_Traits_frag(Type)), %arg(SWIG_Traits_frag(Type)), Type); %enddef /* Equality methods */ %define %std_equal_methods(Type...) %extend Type { bool operator == (const Type& v) { return *self == v; } bool operator != (const Type& v) { return *self != v; } } %enddef /* Order methods */ %define %std_order_methods(Type...) %extend Type { bool operator > (const Type& v) { return *self > v; } bool operator < (const Type& v) { return *self < v; } bool operator >= (const Type& v) { return *self >= v; } bool operator <= (const Type& v) { return *self <= v; } } %enddef /* Comparison methods */ %define %std_comp_methods(Type...) %std_equal_methods(Type ) %std_order_methods(Type ) %enddef swig-3.0.12/Lib/std/std_wstreambuf.i0000664000175000017500000000014613042756442017141 0ustar williamwilliam/* Provide 'std_streambuf.i' with wchar support. */ %include %include swig-3.0.12/Lib/std/std_wsstream.i0000664000175000017500000000014213042756442016623 0ustar williamwilliam/* Provide 'std_sstream.i' with wchar support. */ %include %include swig-3.0.12/Lib/std/std_except.i0000664000175000017500000000224713042756442016256 0ustar williamwilliam#if defined(SWIGJAVA) || defined(SWIGCSHARP) #error "do not use this version of std_except.i" #endif %{ #include #include %} #if defined(SWIG_STD_EXCEPTIONS_AS_CLASSES) namespace std { struct exception { virtual ~exception() throw(); virtual const char* what() const throw(); }; struct bad_cast : exception { }; struct bad_exception : exception { }; struct logic_error : exception { logic_error(const string& msg); }; struct domain_error : logic_error { domain_error(const string& msg); }; struct invalid_argument : logic_error { invalid_argument(const string& msg); }; struct length_error : logic_error { length_error(const string& msg); }; struct out_of_range : logic_error { out_of_range(const string& msg); }; struct runtime_error : exception { runtime_error(const string& msg); }; struct range_error : runtime_error { range_error(const string& msg); }; struct overflow_error : runtime_error { overflow_error(const string& msg); }; struct underflow_error : runtime_error { underflow_error(const string& msg); }; } #endif swig-3.0.12/Lib/std/std_queue.i0000664000175000017500000000665113042756442016115 0ustar williamwilliam/** * @file std_queue.i * @date Sun May 6 01:48:07 2007 * * @brief A wrapping of std::queue for Ruby. * * */ %include // Queue %define %std_queue_methods(queue...) queue(); queue( const _Sequence& ); bool empty() const; size_type size() const; const value_type& front() const; const value_type& back() const; void pop(); void push( const value_type& ); %enddef %define %std_queue_methods_val(queue...) %std_queue_methods(queue) %enddef // ------------------------------------------------------------------------ // std::queue // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::queue), f(const std::queue&): // the parameter being read-only, either a sequence or a // previously wrapped std::queue can be passed. // -- f(std::queue&), f(std::queue*): // the parameter may be modified; therefore, only a wrapped std::queue // can be passed. // -- std::queue f(), const std::queue& f(): // the queue is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::queue& f(), std::queue* f(): // the queue is returned by reference; therefore, a wrapped std::queue // is returned // -- const std::queue* f(), f(const std::queue*): // for consistency, they expect and return a plain queue pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class queue { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::queue< _Tp, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdQueueTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::queue<" #_Tp "," #_Sequence " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_QUEUE, std::queue< _Tp, _Sequence >); #ifdef %swig_queue_methods // Add swig/language extra methods %swig_queue_methods(std::queue< _Tp, _Sequence >); #endif %std_queue_methods(queue); }; template class queue< _Tp*, _Sequence > { public: typedef size_t size_type; typedef _Tp value_type; typedef value_type& reference; typedef const value_type& const_reference; typedef _Sequence container_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::queue< _Tp*, _Sequence >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdQueueTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::queue<" #_Tp "," #_Sequence " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_QUEUE, std::queue< _Tp*, _Sequence >); #ifdef %swig_queue_methods_val // Add swig/language extra methods %swig_queue_methods_val(std::queue< _Tp*, _Sequence >); #endif %std_queue_methods_val(queue); }; } swig-3.0.12/Lib/std/std_array.i0000664000175000017500000000503013042756442016075 0ustar williamwilliam// // std::array // %include %define %std_array_methods(array...) %std_sequence_methods_non_resizable(array) void fill(const value_type& u); %enddef %define %std_array_methods_val(array...) %std_sequence_methods_non_resizable_val(array) void fill(const value_type& u); %enddef // ------------------------------------------------------------------------ // std::array // // The aim of all that follows would be to integrate std::array with // as much as possible, namely, to allow the user to pass and // be returned tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::array), f(const std::array&): // the parameter being read-only, either a sequence or a // previously wrapped std::array can be passed. // -- f(std::array&), f(std::array*): // the parameter may be modified; therefore, only a wrapped std::array // can be passed. // -- std::array f(), const std::array& f(): // the array is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::array& f(), std::array* f(): // the array is returned by reference; therefore, a wrapped std::array // is returned // -- const std::array* f(), f(const std::array*): // for consistency, they expect and return a plain array pointer. // ------------------------------------------------------------------------ // exported classes namespace std { template class array { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef _Tp& reference; typedef const _Tp& const_reference; %traits_swigtype(_Tp); %traits_enum(_Tp); %fragment(SWIG_Traits_frag(std::array< _Tp, _Nm >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdArrayTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::array<" #_Tp "," #_Nm " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_STDARRAY, std::array< _Tp, _Nm >); #ifdef %swig_array_methods // Add swig/language extra methods %swig_array_methods(std::array< _Tp, _Nm >); #endif %std_array_methods(array); }; } swig-3.0.12/Lib/std/std_pair.i0000664000175000017500000000720013042756442015713 0ustar williamwilliam%include %{ #include %} namespace std { template struct pair { typedef T first_type; typedef U second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T, U >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T "," #U " >"; } }; } } #ifndef SWIG_STD_PAIR_ASVAL %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T, U >); #else %typemap_traits(SWIG_TYPECHECK_PAIR, std::pair< T, U >); #endif pair(); pair(T first, U second); pair(const pair& p); template pair(const pair< U1, U2 > &p); T first; U second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T, U >) #endif }; // *** // The following specializations should disappear or get // simplified when a 'const SWIGTYPE*&' can be defined // *** template struct pair< T, U* > { typedef T first_type; typedef U* second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T, U* >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T "," #U " * >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T, U* >); pair(); pair(T __a, U* __b); pair(const pair& __p); T first; U* second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T, U* >) #endif }; template struct pair< T*, U > { typedef T* first_type; typedef U second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T*, U >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T " *," #U " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_PAIR, std::pair< T*, U >); pair(); pair(T* __a, U __b); pair(const pair& __p); T* first; U second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T*, U >) #endif }; template struct pair< T*, U* > { typedef T* first_type; typedef U* second_type; %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair< T*, U* >), "header", fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #T " *," #U " * >"; } }; } } %typemap_traits(SWIG_TYPECHECK_PAIR, std::pair< T*, U* >); pair(); pair(T* __a, U* __b); pair(const pair& __p); T* first; U* second; #ifdef %swig_pair_methods // Add swig/language extra methods %swig_pair_methods(std::pair< T*, U* >) #endif }; } swig-3.0.12/Lib/std/_std_deque.i0000664000175000017500000001052513042756442016226 0ustar williamwilliam/* ----------------------------------------------------------------------------- * _std_deque.i * * This file contains a generic definition of std::deque along with * some helper functions. Specific language modules should include * this file to generate wrappers. * ----------------------------------------------------------------------------- */ %include %{ #include #include %} /* This macro defines all of the standard methods for a deque. This is defined as a macro to simplify the task of specialization. For example, template<> class deque { public: %std_deque_methods(int); }; */ %define %std_deque_methods_noempty(T...) typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; deque(); deque(unsigned int size, const T& value=T()); deque(const deque< T > &); ~deque(); void assign(unsigned int n, const T& value); void swap(deque< T > &x); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, T c = T()); const_reference front(); const_reference back(); void push_front(const T& x); void push_back(const T& x); void pop_front(); void pop_back(); void clear(); /* Some useful extensions */ %extend { const_reference getitem(int i) throw (std::out_of_range) { int size = int(self->size()); if (i<0) i += size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && isize()); if (i<0) i+= size; if (i>=0 && ierase(self->begin()+i); } else { throw std::out_of_range("deque index out of range"); } } std::deque< T > getslice(int i, int j) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; std::deque< T > tmp(j-i); std::copy(self->begin()+i,self->begin()+j,tmp.begin()); return tmp; } void setslice(int i, int j, const std::deque< T >& v) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; if (int(v.size()) == j-i) { std::copy(v.begin(),v.end(),self->begin()+i); } else { self->erase(self->begin()+i,self->begin()+j); if (i+1 <= size) self->insert(self->begin()+i+1,v.begin(),v.end()); else self->insert(self->end(),v.begin(),v.end()); } } void delslice(int i, int j) { int size = int(self->size()); if (i<0) i = size+i; if (j<0) j = size+j; if (i<0) i = 0; if (j>size) j = size; self->erase(self->begin()+i,self->begin()+j); } }; %enddef #ifdef SWIGPHP %define %std_deque_methods(T...) %extend { bool is_empty() const { return self->empty(); } }; %std_deque_methods_noempty(T) %enddef #else %define %std_deque_methods(T...) bool empty() const; %std_deque_methods_noempty(T) %enddef #endif namespace std { template class deque { public: %std_deque_methods(T); }; } swig-3.0.12/Lib/std/std_wios.i0000664000175000017500000000013213042756442015736 0ustar williamwilliam/* Provide 'std_ios.i' with wchar support. */ %include %include swig-3.0.12/Lib/std/std_char_traits.i0000664000175000017500000000616613042756442017275 0ustar williamwilliam%include #if defined(SWIG_WCHAR) %include #endif namespace std { /// 21.1.2 Basis for explicit _Traits specialization /// NB: That for any given actual character type this definition is /// probably wrong. template struct char_traits { }; /// 21.1.4 char_traits specializations template<> struct char_traits { typedef char char_type; typedef int int_type; typedef streampos pos_type; typedef streamoff off_type; typedef mbstate_t state_type; static void assign(char_type& __c1, const char_type& __c2); static bool eq(const char_type& __c1, const char_type& __c2); static bool lt(const char_type& __c1, const char_type& __c2); static int compare(const char_type* __s1, const char_type* __s2, size_t __n); static size_t length(const char_type* __s); static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); static char_type* move(char_type* __s1, const char_type* __s2, size_t __n); static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); static char_type* assign(char_type* __s, size_t __n, char_type __a); static char_type to_char_type(const int_type& __c); // To keep both the byte 0xff and the eof symbol 0xffffffff // from ending up as 0xffffffff. static int_type to_int_type(const char_type& __c); static bool eq_int_type(const int_type& __c1, const int_type& __c2); static int_type eof() ; static int_type not_eof(const int_type& __c); }; #if defined(SWIG_WCHAR) template<> struct char_traits { typedef wchar_t char_type; typedef wint_t int_type; typedef streamoff off_type; typedef wstreampos pos_type; typedef mbstate_t state_type; static void assign(char_type& __c1, const char_type& __c2); static bool eq(const char_type& __c1, const char_type& __c2); static bool lt(const char_type& __c1, const char_type& __c2); static int compare(const char_type* __s1, const char_type* __s2, size_t __n); static size_t length(const char_type* __s); static const char_type* find(const char_type* __s, size_t __n, const char_type& __a); static char_type* move(char_type* __s1, const char_type* __s2, int_type __n); static char_type* copy(char_type* __s1, const char_type* __s2, size_t __n); static char_type* assign(char_type* __s, size_t __n, char_type __a); static char_type to_char_type(const int_type& __c) ; static int_type to_int_type(const char_type& __c) ; static bool eq_int_type(const int_type& __c1, const int_type& __c2); static int_type eof() ; static int_type not_eof(const int_type& __c); }; #endif } namespace std { #ifndef SWIG_STL_WRAP_TRAITS %template() char_traits; #if defined(SWIG_WCHAR) %template() char_traits; #endif #else %template(char_traits_c) char_traits; #if defined(SWIG_WCHAR) %template(char_traits_w) char_traits; #endif #endif } swig-3.0.12/Lib/std/README0000664000175000017500000000117213042756442014616 0ustar williamwilliam/* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ std_common.i general common code std_container.i general container code std_basic_string.i basic string std_char_traits.i char traits std_complex.i complex std_deque.i deque std_except.i exceptions std_ios.i ios std_iostream.i istream/ostream std_list.i list std_map.i map std_multimap.i multimap std_multiset.i multiset std_pair.i pair std_set.i set std_streambuf.i streambuf std_vector.i vector std_vectora.i vector + allocator swig-3.0.12/Lib/std/std_list.i0000664000175000017500000000744613042756442015747 0ustar williamwilliam// // std::list // %include // List %define %std_list_methods(list...) %std_sequence_methods(list) void pop_front(); void push_front(const value_type& x); void reverse(); %enddef %define %std_list_methods_val(list...) %std_sequence_methods_val(list) void pop_front(); void push_front(value_type x); void remove(value_type x); void unique(); void reverse(); void sort(); void merge(list& x); %enddef // ------------------------------------------------------------------------ // std::list // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::list), f(const std::list&): // the parameter being read-only, either a sequence or a // previously wrapped std::list can be passed. // -- f(std::list&), f(std::list*): // the parameter may be modified; therefore, only a wrapped std::list // can be passed. // -- std::list f(), const std::list& f(): // the list is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::list& f(), std::list* f(): // the list is returned by reference; therefore, a wrapped std::list // is returned // -- const std::list* f(), f(const std::list*): // for consistency, they expect and return a plain list pointer. // ------------------------------------------------------------------------ %{ #include %} // exported classes namespace std { template > class list { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::list< _Tp, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdListTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::list<" #_Tp ", " #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_LIST, std::list< _Tp, _Alloc >); #ifdef %swig_list_methods // Add swig/language extra methods %swig_list_methods(std::list< _Tp, _Alloc >); #endif %std_list_methods(list); }; template class list< _Tp*, _Alloc> { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type reference; typedef value_type const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::list< _Tp*, _Alloc >), "header", fragment=SWIG_Traits_frag(_Tp), fragment="StdListTraits") { namespace swig { template <> struct traits > { typedef value_category category; static const char* type_name() { return "std::list<" #_Tp " *," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_LIST, std::list< _Tp*, _Alloc >); #ifdef %swig_list_methods_val // Add swig/language extra methods %swig_list_methods_val(std::list< _Tp*, _Alloc >); #endif %std_list_methods_val(list); }; } %define %std_extequal_list(...) %extend std::list< __VA_ARGS__ > { void remove(const value_type& x) { self->remove(x); } void merge(std::list< __VA_ARGS__ >& x){ self->merge(x); } void unique() { self->unique(); } void sort() { self->sort(); } } %enddef swig-3.0.12/Lib/std/std_iostream.i0000664000175000017500000002122513042756442016606 0ustar williamwilliam/* For wchar support, you need to include the wchar.i file before this file, ie: %include %include or equivalently, just include %include */ %include %include %include #if defined(SWIG_WCHAR) %include #endif %{ #include %} namespace std { // 27.6.2.1 Template class basic_ostream template > class basic_ostream : virtual public basic_ios<_CharT, _Traits> { public: // Types (inherited from basic_ios (27.4.4)): typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; // 27.6.2.2 Constructor/destructor: explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_ostream(); // 27.6.2.5 Formatted output: // 27.6.2.5.3 basic_ostream::operator<< basic_ostream<_CharT, _Traits>& operator<<(basic_ostream<_CharT, _Traits>& (*__pf)(basic_ostream<_CharT, _Traits>&)); basic_ostream<_CharT, _Traits>& operator<<(basic_ios<_CharT, _Traits>& (*__pf)(basic_ios<_CharT, _Traits>&)); basic_ostream<_CharT, _Traits>& operator<<(ios_base& (*__pf) (ios_base&)); // 27.6.2.5.2 Arithmetic Inserters basic_ostream<_CharT, _Traits>& operator<<(long __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned long __n); basic_ostream<_CharT, _Traits>& operator<<(bool __n); basic_ostream<_CharT, _Traits>& operator<<(short __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned short __n); basic_ostream<_CharT, _Traits>& operator<<(int __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned int __n); basic_ostream<_CharT, _Traits>& operator<<(long long __n); basic_ostream<_CharT, _Traits>& operator<<(unsigned long long __n); basic_ostream<_CharT, _Traits>& operator<<(double __f); basic_ostream<_CharT, _Traits>& operator<<(float __f); basic_ostream<_CharT, _Traits>& operator<<(long double __f); basic_ostream<_CharT, _Traits>& operator<<(const void* __p); basic_ostream<_CharT, _Traits>& operator<<(basic_streambuf<_CharT, _Traits>* __sb); %extend { std::basic_ostream<_CharT, _Traits >& operator<<(const std::basic_string<_CharT,_Traits, std::allocator<_CharT> >& s) { *self << s; return *self; } } // Unformatted output: basic_ostream<_CharT, _Traits>& put(char_type __c); basic_ostream<_CharT, _Traits>& write(const char_type* __s, streamsize __n); basic_ostream<_CharT, _Traits>& flush(); // Seeks: pos_type tellp(); basic_ostream<_CharT, _Traits>& seekp(pos_type); basic_ostream<_CharT, _Traits>& seekp(off_type, ios_base::seekdir); }; // 27.6.1.1 Template class basic_istream template > class basic_istream : virtual public basic_ios<_CharT, _Traits> { public: // Types (inherited from basic_ios (27.4.4)): typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; public: // 27.6.1.1.1 Constructor/destructor: explicit basic_istream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_istream(); // 27.6.1.2.3 basic_istream::operator>> basic_istream<_CharT, _Traits>& operator>>(basic_istream<_CharT, _Traits>& (*__pf)(basic_istream<_CharT, _Traits>&)); basic_istream<_CharT, _Traits>& operator>>(basic_ios<_CharT, _Traits>& (*__pf)(basic_ios<_CharT, _Traits>&)); basic_istream<_CharT, _Traits>& operator>>(ios_base& (*__pf)(ios_base&)); // 27.6.1.2.2 Arithmetic Extractors basic_istream<_CharT, _Traits>& operator>>(bool& __n); basic_istream<_CharT, _Traits>& operator>>(short& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned short& __n); basic_istream<_CharT, _Traits>& operator>>(int& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned int& __n); basic_istream<_CharT, _Traits>& operator>>(long& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned long& __n); basic_istream<_CharT, _Traits>& operator>>(long long& __n); basic_istream<_CharT, _Traits>& operator>>(unsigned long long& __n); basic_istream<_CharT, _Traits>& operator>>(float& __f); basic_istream<_CharT, _Traits>& operator>>(double& __f); basic_istream<_CharT, _Traits>& operator>>(long double& __f); basic_istream<_CharT, _Traits>& operator>>(void*& __p); basic_istream<_CharT, _Traits>& operator>>(basic_streambuf<_CharT, _Traits>* __sb); // 27.6.1.3 Unformatted input: inline streamsize gcount(void) const; int_type get(void); basic_istream<_CharT, _Traits>& get(char_type& __c); basic_istream<_CharT, _Traits>& get(char_type* __s, streamsize __n, char_type __delim); inline basic_istream<_CharT, _Traits>& get(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& get(basic_streambuf<_CharT, _Traits>& __sb, char_type __delim); inline basic_istream<_CharT, _Traits>& get(basic_streambuf<_CharT, _Traits>& __sb); basic_istream<_CharT, _Traits>& getline(char_type* __s, streamsize __n, char_type __delim); inline basic_istream<_CharT, _Traits>& getline(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& ignore(streamsize __n = 1, int_type __delim = _Traits::eof()); int_type peek(void); basic_istream<_CharT, _Traits>& read(char_type* __s, streamsize __n); streamsize readsome(char_type* __s, streamsize __n); basic_istream<_CharT, _Traits>& putback(char_type __c); basic_istream<_CharT, _Traits>& unget(void); int sync(void); pos_type tellg(void); basic_istream<_CharT, _Traits>& seekg(pos_type); basic_istream<_CharT, _Traits>& seekg(off_type, ios_base::seekdir); }; // 27.6.1.5 Template class basic_iostream template > class basic_iostream : public basic_istream<_CharT, _Traits>, public basic_ostream<_CharT, _Traits> { public: typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __sb); virtual ~basic_iostream(); }; typedef basic_ostream ostream ; typedef basic_istream istream; typedef basic_iostream iostream; extern istream cin; extern ostream cout; extern ostream cerr; extern ostream clog; #if defined(SWIG_WCHAR) typedef basic_ostream wostream; typedef basic_istream wistream; typedef basic_iostream wiostream; extern wistream wcin; extern wostream wcout; extern wostream wcerr; extern wostream wclog; #endif template > std::basic_ostream<_CharT, _Traits>& endl(std::basic_ostream<_CharT, _Traits>&); template > std::basic_ostream<_CharT, _Traits>& ends(std::basic_ostream<_CharT, _Traits>&); template > std::basic_ostream<_CharT, _Traits>& flush(std::basic_ostream<_CharT, _Traits>&); } namespace std { %template(ostream) basic_ostream; %template(istream) basic_istream; %template(iostream) basic_iostream; %template(endl) endl >; %template(ends) ends >; %template(flush) flush >; #if defined(SWIG_WCHAR) %template(wostream) basic_ostream; %template(wistream) basic_istream; %template(wiostream) basic_iostream; %template(wendl) endl >; %template(wends) ends >; %template(wflush) flush >; #endif } swig-3.0.12/Lib/std/std_vectora.i0000664000175000017500000000022313042756442016421 0ustar williamwilliam// // We keep this file only for backward compatibility, since std_vector.i // now uses the std::allocator parameter. // %include swig-3.0.12/Lib/std/std_string.i0000664000175000017500000000033313042756442016266 0ustar williamwilliam%include /* plain strings */ namespace std { %std_comp_methods(basic_string); %naturalvar string; typedef basic_string string; } %template(string) std::basic_string; swig-3.0.12/Lib/std/std_ios.i0000664000175000017500000001213613042756442015556 0ustar williamwilliam%include %include %include %{ #ifndef SWIG_STD_NOMODERN_STL # include #else # include #endif %} namespace std { template > class basic_streambuf; template > class basic_istream; template > class basic_ostream; // 27.4.2 Class ios_base typedef size_t streamsize; class locale; class ios_base { public: #ifdef SWIG_NESTED_CLASSES // 27.4.2.1.1 Class ios_base::failure class failure : public exception { public: explicit failure(const string& __str) throw(); }; #endif // 27.4.2.1.2 Type ios_base::fmtflags typedef int fmtflags; // 27.4.2.1.2 Type fmtflags static const fmtflags boolalpha ; static const fmtflags dec ; static const fmtflags fixed ; static const fmtflags hex ; static const fmtflags internal ; static const fmtflags left ; static const fmtflags oct ; static const fmtflags right ; static const fmtflags scientific ; static const fmtflags showbase ; static const fmtflags showpoint ; static const fmtflags showpos ; static const fmtflags skipws ; static const fmtflags unitbuf ; static const fmtflags uppercase ; static const fmtflags adjustfield ; static const fmtflags basefield ; static const fmtflags floatfield ; // 27.4.2.1.3 Type ios_base::iostate typedef int iostate; static const iostate badbit ; static const iostate eofbit ; static const iostate failbit ; static const iostate goodbit ; // 27.4.2.1.4 Type openmode typedef int openmode; static const openmode app ; static const openmode ate ; static const openmode binary ; static const openmode in ; static const openmode out ; static const openmode trunc ; // 27.4.2.1.5 Type seekdir typedef int seekdir; static const seekdir beg ; static const seekdir cur ; static const seekdir end ; // Callbacks; enum event { erase_event, imbue_event, copyfmt_event }; typedef void (*event_callback) (event, ios_base&, int); void register_callback(event_callback __fn, int __index); // Fmtflags state: inline fmtflags flags() const ; inline fmtflags flags(fmtflags __fmtfl); inline fmtflags setf(fmtflags __fmtfl); inline fmtflags setf(fmtflags __fmtfl, fmtflags __mask); inline void unsetf(fmtflags __mask) ; inline streamsize precision() const ; inline streamsize precision(streamsize __prec); inline streamsize width() const ; inline streamsize width(streamsize __wide); static bool sync_with_stdio(bool __sync = true); // Locales: locale imbue(const locale& __loc); inline locale getloc() const { return _M_ios_locale; } // Storage: static int xalloc() throw(); inline long& iword(int __ix); inline void*& pword(int __ix); // Destructor ~ios_base(); protected: ios_base(); //50. Copy constructor and assignment operator of ios_base private: ios_base(const ios_base&); ios_base& operator=(const ios_base&); }; template > class basic_ios : public ios_base { public: // Types: typedef _CharT char_type; typedef typename _Traits::int_type int_type; typedef typename _Traits::pos_type pos_type; typedef typename _Traits::off_type off_type; typedef _Traits traits_type; public: iostate rdstate() const; void clear(iostate __state = goodbit); void setstate(iostate __state); bool good() const; bool eof() const; bool fail() const; bool bad() const; iostate exceptions() const; void exceptions(iostate __except); // Constructor/destructor: explicit basic_ios(basic_streambuf<_CharT, _Traits>* __sb) : ios_base(); virtual ~basic_ios() ; // Members: basic_ostream<_CharT, _Traits>* tie() const; basic_ostream<_CharT, _Traits>* tie(basic_ostream<_CharT, _Traits>* __tiestr); basic_streambuf<_CharT, _Traits>* rdbuf() const; basic_streambuf<_CharT, _Traits>* rdbuf(basic_streambuf<_CharT, _Traits>* __sb); basic_ios& copyfmt(const basic_ios& __rhs); char_type fill() const; char_type fill(char_type __ch); // Locales: locale imbue(const locale& __loc); char narrow(char_type __c, char __dfault) const; char_type widen(char __c) const; protected: // 27.4.5.1 basic_ios constructors basic_ios(); private: basic_ios(const basic_ios&); basic_ios& operator=(const basic_ios&); }; } namespace std { typedef basic_ios ios; %template(ios) basic_ios; #if defined(SWIG_WCHAR) typedef basic_ios wios; %template(wios) basic_ios; #endif } swig-3.0.12/Lib/std/std_map.i0000664000175000017500000000714013042756442015540 0ustar williamwilliam// // std::map // %include %include %define %std_map_methods_common(map...) %std_container_methods(map); size_type erase(const key_type& x); size_type count(const key_type& x) const; #ifdef SWIG_EXPORT_ITERATOR_METHODS %extend { // %extend wrapper used for differing definitions of these methods introduced in C++11 void erase(iterator position) { $self->erase(position); } void erase(iterator first, iterator last) { $self->erase(first, last); } } iterator find(const key_type& x); iterator lower_bound(const key_type& x); iterator upper_bound(const key_type& x); #endif %enddef %define %std_map_methods(map...) %std_map_methods_common(map); #ifdef SWIG_EXPORT_ITERATOR_METHODS // iterator insert(const value_type& x); #endif %enddef // ------------------------------------------------------------------------ // std::map // // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&): // the parameter being read-only, either a sequence or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter may be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(), const std::map& f(): // the map is returned by copy; therefore, a sequence of T:s // is returned which is most easily used in other functions // -- std::map& f(), std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // -- const std::map* f(), f(const std::map*): // for consistency, they expect and return a plain map pointer. // ------------------------------------------------------------------------ %{ #include %} %fragment(""); %fragment(""); // exported class namespace std { template, class _Alloc = allocator > > class map { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Key key_type; typedef _Tp mapped_type; typedef std::pair< const _Key, _Tp > value_type; typedef value_type* pointer; typedef const value_type* const_pointer; typedef value_type& reference; typedef const value_type& const_reference; typedef _Alloc allocator_type; %traits_swigtype(_Key); %traits_swigtype(_Tp); %fragment(SWIG_Traits_frag(std::pair< _Key, _Tp >), "header", fragment=SWIG_Traits_frag(_Key), fragment=SWIG_Traits_frag(_Tp), fragment="StdPairTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" #_Key "," #_Tp " >"; } }; } } %fragment(SWIG_Traits_frag(std::map< _Key, _Tp, _Compare, _Alloc >), "header", fragment=SWIG_Traits_frag(std::pair< _Key, _Tp >), fragment="StdMapTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::map<" #_Key "," #_Tp "," #_Compare "," #_Alloc " >"; } }; } } %typemap_traits_ptr(SWIG_TYPECHECK_MAP, std::map< _Key, _Tp, _Compare, _Alloc >); map( const _Compare& ); #ifdef %swig_map_methods // Add swig/language extra methods %swig_map_methods(std::map< _Key, _Tp, _Compare, _Alloc >); #endif %std_map_methods(map); }; } swig-3.0.12/Lib/uffi/0000775000175000017500000000000013042756442014074 5ustar williamwilliamswig-3.0.12/Lib/uffi/uffi.swg0000664000175000017500000000621613042756442015554 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_UFFI /* Typespecs for basic types. */ %typemap(ffitype) char ":char"; %typemap(ffitype) unsigned char ":unsigned-char"; %typemap(ffitype) signed char ":char"; %typemap(ffitype) short ":short"; %typemap(ffitype) signed short ":short"; %typemap(ffitype) unsigned short ":unsigned-short"; %typemap(ffitype) int ":int"; %typemap(ffitype) signed int ":int"; %typemap(ffitype) unsigned int ":unsigned-int"; %typemap(ffitype) long ":long"; %typemap(ffitype) signed long ":long"; %typemap(ffitype) unsigned long ":unsigned-long"; %typemap(ffitype) float ":float"; %typemap(ffitype) double ":double"; %typemap(ffitype) char * ":cstring"; %typemap(ffitype) void * ":pointer-void"; %typemap(ffitype) void ":void"; // FIXME: This is guesswork typedef long size_t; %wrapper %{ (eval-when (compile eval) ;;; You can define your own identifier converter if you want. ;;; Use the -identifier-converter command line argument to ;;; specify its name. (defun identifier-convert-null (id &key type) (declare (ignore type)) (read-from-string id)) (defun identifier-convert-lispify (cname &key type) (assert (stringp cname)) (if (eq type :constant) (setf cname (format nil "*~A*" cname))) (setf cname (replace-regexp cname "_" "-")) (let ((lastcase :other) newcase char res) (dotimes (n (length cname)) (setf char (schar cname n)) (if* (alpha-char-p char) then (setf newcase (if (upper-case-p char) :upper :lower)) (when (or (and (eq lastcase :upper) (eq newcase :lower)) (and (eq lastcase :lower) (eq newcase :upper))) ;; case change... add a dash (push #\- res) (setf newcase :other)) (push (char-downcase char) res) (setf lastcase newcase) else (push char res) (setf lastcase :other))) (read-from-string (coerce (nreverse res) 'string)))) (defun identifier-convert-low-level (cname &key type) (assert (stringp cname)) (if (eq type :constant) (setf cname (format nil "+~A+" cname))) (setf cname (substitute #\- #\_ cname)) (if (eq type :operator) (setf cname (format nil "%~A" cname))) (if (eq type :constant-function) nil) (read-from-string cname)) (defmacro swig-defconstant (string value &key (export T)) (let ((symbol (funcall *swig-identifier-converter* string :type :constant))) `(eval-when (compile load eval) (uffi:def-constant ,symbol ,value ,export)))) (defmacro swig-defun (name &rest rest) (let ((symbol (funcall *swig-identifier-converter* name :type :operator))) `(eval-when (compile load eval) (uffi:def-function (,name ,symbol) ,@rest) (export (quote ,symbol))))) (defmacro swig-def-struct (name &rest fields) "Declare a struct object" (let ((symbol (funcall *swig-identifier-converter* name :type :type))) `(eval-when (compile load eval) (uffi:def-struct ,symbol ,@fields) (export (quote ,symbol))))) ) ;; eval-when %} swig-3.0.12/Lib/cffi/0000775000175000017500000000000013042756442014052 5ustar williamwilliamswig-3.0.12/Lib/cffi/cffi.swg0000664000175000017500000002306413042756442015510 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_CFFI /* Typespecs for basic types. */ %typemap(cin) void ":void"; %typemap(cin) char ":char"; %typemap(cin) char * ":string"; %typemap(cin) unsigned char ":unsigned-char"; %typemap(cin) signed char ":char"; %typemap(cin) short ":short"; %typemap(cin) signed short ":short"; %typemap(cin) unsigned short ":unsigned-short"; %typemap(cin) int ":int"; %typemap(cin) signed int ":int"; %typemap(cin) unsigned int ":unsigned-int"; %typemap(cin) long ":long"; %typemap(cin) signed long ":long"; %typemap(cin) unsigned long ":unsigned-long"; %typemap(cin) long long ":long-long"; %typemap(cin) signed long long ":long-long"; %typemap(cin) unsigned long long ":unsigned-long-long"; %typemap(cin) float ":float"; %typemap(cin) double ":double"; %typemap(cin) SWIGTYPE ":pointer"; %typemap(cout) void ":void"; %typemap(cout) char ":char"; %typemap(cout) char * ":string"; %typemap(cout) unsigned char ":unsigned-char"; %typemap(cout) signed char ":char"; %typemap(cout) short ":short"; %typemap(cout) signed short ":short"; %typemap(cout) unsigned short ":unsigned-short"; %typemap(cout) int ":int"; %typemap(cout) signed int ":int"; %typemap(cout) unsigned int ":unsigned-int"; %typemap(cout) long ":long"; %typemap(cout) signed long ":long"; %typemap(cout) unsigned long ":unsigned-long"; %typemap(cout) long long ":long-long"; %typemap(cout) signed long long ":long-long"; %typemap(cout) unsigned long long ":unsigned-long-long"; %typemap(cout) float ":float"; %typemap(cout) double ":double"; %typemap(cout) SWIGTYPE ":pointer"; %typemap(ctype) bool "int"; %typemap(ctype) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; %typemap(in) bool "$1 = (bool)$input;"; %typemap(in) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;"; %typemap(in) SWIGTYPE "$1 = *$input;"; %typemap(out) void ""; %typemap(out) bool "$result = (int)$1;"; %typemap(out) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;"; #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_type($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif %typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; }; %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; }; %typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; }; %typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; }; %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; }; %typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE { $1 = 1; }; %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[ANY], SWIGTYPE { $1 = 1; }; /* This maps C/C++ types to Lisp classes for overload dispatch */ %typemap(lisptype) bool "cl:boolean"; %typemap(lisptype) char "cl:character"; %typemap(lisptype) unsigned char "cl:integer"; %typemap(lisptype) signed char "cl:integer"; %typemap(lispclass) bool "t"; %typemap(lispclass) char "cl:character"; %typemap(lispclass) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE "cl:integer"; /* CLOS methods can't be specialized on single-float or double-float */ %typemap(lispclass) float "cl:number"; %typemap(lispclass) double "cl:number"; %typemap(lispclass) char * "cl:string"; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT #include %} %insert("swiglisp") %{ ;;;SWIG wrapper code starts here (cl:defmacro defanonenum (cl:&body enums) "Converts anonymous enums to defconstants." `(cl:progn ,@(cl:loop for value in enums for index = 0 then (cl:1+ index) when (cl:listp value) do (cl:setf index (cl:second value) value (cl:first value)) collect `(cl:defconstant ,value ,index)))) (cl:eval-when (:compile-toplevel :load-toplevel) (cl:unless (cl:fboundp 'swig-lispify) (cl:defun swig-lispify (name flag cl:&optional (package cl:*package*)) (cl:labels ((helper (lst last rest cl:&aux (c (cl:car lst))) (cl:cond ((cl:null lst) rest) ((cl:upper-case-p c) (helper (cl:cdr lst) 'upper (cl:case last ((lower digit) (cl:list* c #\- rest)) (cl:t (cl:cons c rest))))) ((cl:lower-case-p c) (helper (cl:cdr lst) 'lower (cl:cons (cl:char-upcase c) rest))) ((cl:digit-char-p c) (helper (cl:cdr lst) 'digit (cl:case last ((upper lower) (cl:list* c #\- rest)) (cl:t (cl:cons c rest))))) ((cl:char-equal c #\_) (helper (cl:cdr lst) '_ (cl:cons #\- rest))) (cl:t (cl:error "Invalid character: ~A" c))))) (cl:let ((fix (cl:case flag ((constant enumvalue) "+") (variable "*") (cl:t "")))) (cl:intern (cl:concatenate 'cl:string fix (cl:nreverse (helper (cl:concatenate 'cl:list name) cl:nil cl:nil)) fix) package)))))) ;;;SWIG wrapper code ends here %} #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_type($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif ////////////////////////////////////////////////////////////// /* name conversion for overloaded operators. */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-() const; %rename(__neg__) *::operator-(); %rename(__mul__) *::operator*; %rename(__deref__) *::operator*(); %rename(__deref__) *::operator*() const; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__logxor__) *::operator^; %rename(__logand__) *::operator&; %rename(__logior__) *::operator|; %rename(__lognot__) *::operator~(); %rename(__lognot__) *::operator~() const; %rename(__not__) *::operator!(); %rename(__not__) *::operator!() const; %rename(__assign__) *::operator=; %rename(__add_assign__) *::operator+=; %rename(__sub_assign__) *::operator-=; %rename(__mul_assign__) *::operator*=; %rename(__div_assign__) *::operator/=; %rename(__mod_assign__) *::operator%=; %rename(__logxor_assign__) *::operator^=; %rename(__logand_assign__) *::operator&=; %rename(__logior_assign__) *::operator|=; %rename(__lshift__) *::operator<<; %rename(__lshift_assign__) *::operator<<=; %rename(__rshift__) *::operator>>; %rename(__rshift_assign__) *::operator>>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__lt__) *::operator<; %rename(__gt__) *::operator>; %rename(__lte__) *::operator<=; %rename(__gte__) *::operator>=; %rename(__and__) *::operator&&; %rename(__or__) *::operator||; %rename(__preincr__) *::operator++(); %rename(__postincr__) *::operator++(int); %rename(__predecr__) *::operator--(); %rename(__postdecr__) *::operator--(int); %rename(__comma__) *::operator,(); %rename(__comma__) *::operator,() const; %rename(__member_ref__) *::operator->; %rename(__member_func_ref__) *::operator->*; %rename(__funcall__) *::operator(); %rename(__aref__) *::operator[]; #endif %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT #include #include %} swig-3.0.12/Lib/r/0000775000175000017500000000000013042756442013404 5ustar williamwilliamswig-3.0.12/Lib/r/std_deque.i0000664000175000017500000000003113042756442015525 0ustar williamwilliam%includeswig-3.0.12/Lib/r/rtype.swg0000664000175000017500000002003613042756442015272 0ustar williamwilliam /* These map the primitive C types to the appropriate R type for use in class representations. */ %typemap("rtype") int, int *, int & "integer"; %typemap("rtype") long, long *, long & "integer"; %typemap("rtype") float, float*, float & "numeric"; %typemap("rtype") double, double*, double & "numeric"; %typemap("rtype") char *, char ** "character"; %typemap("rtype") char "character"; %typemap("rtype") string, string *, string & "character"; %typemap("rtype") std::string, std::string *, std::string & "character"; %typemap("rtype") bool, bool * "logical"; %typemap("rtype") enum SWIGTYPE "character"; %typemap("rtype") enum SWIGTYPE * "character"; %typemap("rtype") enum SWIGTYPE *const "character"; %typemap("rtype") enum SWIGTYPE & "character"; %typemap("rtype") enum SWIGTYPE && "character"; %typemap("rtype") SWIGTYPE * "$R_class"; %typemap("rtype") SWIGTYPE *const "$R_class"; %typemap("rtype") SWIGTYPE & "$R_class"; %typemap("rtype") SWIGTYPE && "$R_class"; %typemap("rtype") SWIGTYPE "$&R_class"; %typemap("rtypecheck") int, int &, long, long & %{ (is.integer($arg) || is.numeric($arg)) && length($arg) == 1 %} %typemap("rtypecheck") int *, long * %{ is.integer($arg) || is.numeric($arg) %} %typemap("rtypecheck") float, double %{ is.numeric($arg) && length($arg) == 1 %} %typemap("rtypecheck") float *, double * %{ is.numeric($arg) %} %typemap("rtypecheck") bool, bool & %{ is.logical($arg) && length($arg) == 1 %} %typemap("rtypecheck") bool * %{ is.logical($arg) %} /* Set up type checks to insure overloading precedence. We would like non pointer items to shadow pointer items, so that they get called if length = 1 */ %typecheck(SWIG_TYPECHECK_BOOL) bool {} %typecheck(SWIG_TYPECHECK_UINT32) unsigned int {} %typecheck(SWIG_TYPECHECK_INTEGER) int {} %typecheck(SWIG_TYPECHECK_FLOAT) float {} %typecheck(SWIG_TYPECHECK_DOUBLE) double {} %typecheck(SWIG_TYPECHECK_BOOL_PTR) bool * {} %typecheck(SWIG_TYPECHECK_INT32_PTR) int * {} %typecheck(SWIG_TYPECHECK_FLOAT_PTR) float * {} %typecheck(SWIG_TYPECHECK_DOUBLE_PTR) double * {} %typecheck(SWIG_TYPECHECK_CHAR_PTR) char * {} %typecheck(SWIG_TYPECHECK_INT32_ARRAY) int[ANY] {} %typecheck(SWIG_TYPECHECK_FLOAT_ARRAY) float[ANY] {} %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY) double [ANY] {} /* Have to be careful that as(x, "numeric") is different from as.numeric(x). The latter makes a REALSXP, whereas the former leaves an INTSXP as an INTSXP. */ /* Force coercion of integer, since by default R sets all constants to numeric, which means that you can't directly call a function with an integer using an R numercal literal */ %typemap(scoercein) int, int *, int & %{ $input = as.integer($input); %} %typemap(scoercein) long, long *, long & %{ $input = as.integer($input); %} %typemap(scoercein) float, float*, float &, double, double *, double & %{ %} %typemap(scoercein) char, char *, char & %{ $input = as($input, "character"); %} %typemap(scoercein) string, string *, string & %{ $input = as($input, "character"); %} %typemap(scoercein) std::string, std::string *, std::string & %{ $input = as($input, "character"); %} %typemap(scoercein) enum SWIGTYPE %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE & %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE && %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE * %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) enum SWIGTYPE *const %{ $input = enumToInteger($input, "$R_class"); %} %typemap(scoercein) SWIGTYPE, SWIGTYPE *, SWIGTYPE *const, SWIGTYPE &, SWIGTYPE && %{ if (inherits($input, "ExternalReference")) $input = slot($input,"ref") %} /* %typemap(scoercein) SWIGTYPE *, SWIGTYPE *const %{ $input = coerceIfNotSubclass($input, "$R_class") %} %typemap(scoercein) SWIGTYPE & %{ $input = coerceIfNotSubclass($input, "$R_class") %} %typemap(scoercein) SWIGTYPE && %{ $input = coerceIfNotSubclass($input, "$R_class") %} %typemap(scoercein) SWIGTYPE %{ $input = coerceIfNotSubclass($input, "$&R_class") %} */ %typemap(scoercein) SWIGTYPE[ANY] %{ if(is.list($input)) assert(all(sapply($input, class) == "$R_class")); %} /* **************************************************************** */ %typemap(scoercein) bool, bool *, bool & "$input = as.logical($input);"; %typemap(scoercein) int, int *, int &, long, long *, long & "$input = as.integer($input);"; %typemap(scoercein) char *, string, std::string, string &, std::string & %{ $input = as($input, "character"); %} %typemap(scoerceout) enum SWIGTYPE %{ $result = enumFromInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE & %{ $result = enumFromInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE && %{ $result = enumFromInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE * %{ $result = enumToInteger($result, "$R_class"); %} %typemap(scoerceout) enum SWIGTYPE *const %{ $result = enumToInteger($result, "$R_class"); %} %typemap(scoerceout) SEXP %{ %} %typemap(scoerceout) SWIGTYPE %{ $result <- new("$&R_class", ref=$result); %} %typemap(scoerceout) SWIGTYPE & %{ $result <- new("$R_class", ref=$result) ; %} %typemap(scoerceout) SWIGTYPE && %{ $result <- new("$R_class", ref=$result) ; %} %typemap(scoerceout) SWIGTYPE * %{ $result <- new("$R_class", ref=$result) ; %} %typemap(scoerceout) SWIGTYPE *const %{ $result <- new("$R_class", ref=$result) ; %} /* Override the SWIGTYPE * above. */ %typemap(scoerceout) char, char *, char &, float, double, float*, double*, float &, double &, int, int &, long, long &, bool, bool &, string, std::string, string &, std::string &, void, signed int, signed int &, unsigned int, unsigned int &, short, short &, unsigned short, unsigned short &, long long, signed long long, signed long long &, unsigned long long, unsigned long long &, signed long, signed long &, unsigned long, unsigned long &, signed char, signed char &, unsigned char, unsigned char & %{ %} %apply int {size_t, std::size_t, ptrdiff_t, std::ptrdiff_t, signed int, unsigned int, short, unsigned short, signed char, unsigned char} %apply int* {size_t[], std::size_t[], ptrdiff_t[], std::ptrdiff_t[], signed int[], unsigned int[], short[], unsigned short[], signed char[], unsigned char[]} %apply int* {size_t[ANY], std::size_t[ANY], ptrdiff_t[ANY], std::ptrdiff_t[ANY], signed int[ANY], unsigned int[ANY], short[ANY], unsigned short[ANY], signed char[ANY], unsigned char[ANY]} %apply int* {size_t*, std::size_t*, ptrdiff_t*, std::ptrdiff_t*, signed int*, unsigned int*, short*, unsigned short*, signed char*, unsigned char*} %apply long { long long, signed long long, unsigned long long, signed long, unsigned long} %apply long* { long long*, signed long long*, unsigned long long*, signed long*, unsigned long*, long long[], signed long long[], unsigned long long[], signed long[], unsigned long[], long long[ANY], signed long long[ANY], unsigned long long[ANY], signed long[ANY], unsigned long[ANY]} %apply float* { float[], float[ANY] } %apply double * { double[], double[ANY] } %apply bool* { bool[], bool[ANY] } #if 0 Just examining the values for a SWIGTYPE. %typemap(scoerceout) SWIGTYPE %{ name = $1_name type = $1_type ltype = $1_ltype mangle = $1_mangle descriptor = $1_descriptor pointer type = $*1_type pointer ltype = $*1_ltype pointer descriptor = $*1_descriptor basetype = $*_basetype %} #endif swig-3.0.12/Lib/r/srun.swg0000664000175000017500000000747513042756442015132 0ustar williamwilliam# srun.swg # # # This is the basic code that is needed at run time within R to # provide and define the relevant classes. It is included # automatically in the generated code by copying the contents of # srun.swg into the newly created binding code. # This could be provided as a separate run-time library but this # approach allows the code to to be included directly into the # generated bindings and so removes the need to have and install an # additional library. We may however end up with multiple copies of # this and some confusion at run-time as to which class to use. This # is an issue when we use NAMESPACES as we may need to export certain # classes. ###################################################################### if(length(getClassDef("RSWIGStruct")) == 0) setClass("RSWIGStruct", representation("VIRTUAL")) if(length(getClassDef("ExternalReference")) == 0) # Should be virtual but this means it loses its slots currently #representation("VIRTUAL") setClass("ExternalReference", representation( ref = "externalptr")) if(length(getClassDef("NativeRoutinePointer")) == 0) setClass("NativeRoutinePointer", representation(parameterTypes = "character", returnType = "character", "VIRTUAL"), contains = "ExternalReference") if(length(getClassDef("CRoutinePointer")) == 0) setClass("CRoutinePointer", contains = "NativeRoutinePointer") if(length(getClassDef("EnumerationValue")) == 0) setClass("EnumerationValue", contains = "integer") if(!isGeneric("copyToR")) setGeneric("copyToR", function(value, obj = new(gsub("Ref$", "", class(value)))) standardGeneric("copyToR" )) setGeneric("delete", function(obj) standardGeneric("delete")) SWIG_createNewRef = function(className, ..., append = TRUE) { f = get(paste("new", className, sep = "_"), mode = "function") f(...) } if(!isGeneric("copyToC")) setGeneric("copyToC", function(value, obj = SWIG_createNewRef(class(value))) standardGeneric("copyToC" )) # defineEnumeration = function(name, .values, where = topenv(parent.frame()), suffix = "Value") { # Mirror the class definitions via the E analogous to .__C__ defName = paste(".__E__", name, sep = "") assign(defName, .values, envir = where) if(nchar(suffix)) name = paste(name, suffix, sep = "") setClass(name, contains = "EnumerationValue", where = where) } enumToInteger <- function(name,type) { if (is.character(name)) { ans <- as.integer(get(paste(".__E__", type, sep = ""))[name]) if (is.na(ans)) {warning("enum not found ", name, " ", type)} ans } } enumFromInteger = function(i,type) { itemlist <- get(paste(".__E__", type, sep="")) names(itemlist)[match(i, itemlist)] } coerceIfNotSubclass = function(obj, type) { if(!is(obj, type)) {as(obj, type)} else obj } setClass("SWIGArray", representation(dims = "integer"), contains = "ExternalReference") setMethod("length", "SWIGArray", function(x) x@dims[1]) defineEnumeration("SCopyReferences", .values = c( "FALSE" = 0, "TRUE" = 1, "DEEP" = 2)) assert = function(condition, message = "") { if(!condition) stop(message) TRUE } if(FALSE) { print.SWIGFunction = function(x, ...) { } } ####################################################################### R_SWIG_getCallbackFunctionStack = function() { # No PACKAGE argument as we don't know what the DLL is. .Call("R_SWIG_debug_getCallbackFunctionData") } R_SWIG_addCallbackFunctionStack = function(fun, userData = NULL) { # No PACKAGE argument as we don't know what the DLL is. .Call("R_SWIG_R_pushCallbackFunctionData", fun, userData) } ####################################################################### swig-3.0.12/Lib/r/std_vector.i0000664000175000017500000011365013042756442015740 0ustar williamwilliam// R specific swig components /* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { // vectors of doubles template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of floats template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(REALSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { NUMERIC_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of unsigned 8bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 8bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of unsigned 16bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 16bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 32 bit unsigned int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 32bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit unsigned int #if defined(SWIGWORDSIZE64) template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; #else template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of 64 bit int template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(INTSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { INTEGER_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; #endif // vectors of bool template <> struct traits_from_ptr > { static SEXP from (std::vector *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(LGLSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { LOGICAL_POINTER(result)[pos] = ((*val)[pos]); } UNPROTECT(1); return(result); } }; // vectors of strings template <> struct traits_from_ptr > > { static SEXP from (std::vector > *val, int owner = 0) { SEXP result; PROTECT(result = Rf_allocVector(STRSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { CHARACTER_POINTER(result)[pos] = Rf_mkChar(((*val)[pos]).c_str()); } UNPROTECT(1); return(result); } }; // catch all that does everything with vectors template struct traits_from_ptr< std::vector< T > > { static SEXP from (std::vector< T > *val, int owner = 0) { return SWIG_R_NewPointerObj(val, type_info< std::vector< T > >(), owner); } }; ///////////////////////////////////////////////// template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); double *S = NUMERIC_POINTER(obj); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // 8 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // 16 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // 32 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #if defined(SWIGWORDSIZE64) // 64 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #else // 64 bit integer types template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; unsigned int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, INTSXP)); int *S = INTEGER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; #endif template <> struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; // not sure how to check the size of the SEXP obj is correct int sexpsz = Rf_length(obj); p = new std::vector(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, LGLSXP)); int *S = LOGICAL_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { (*p)[pos] = static_cast(S[pos]); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; template <> struct traits_asptr < std::vector > > { static int asptr(SEXP obj, std::vector > **val) { std::vector > *p; // R character vectors are STRSXP containing CHARSXP // access a CHARSXP using STRING_ELT int sexpsz = Rf_length(obj); p = new std::vector >(sexpsz); SEXP coerced; PROTECT(coerced = Rf_coerceVector(obj, STRSXP)); //SEXP *S = CHARACTER_POINTER(coerced); for (unsigned pos = 0; pos < p->size(); pos++) { const char * thecstring = CHAR(STRING_ELT(coerced, pos)); (*p)[pos] = std::basic_string(thecstring); } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } UNPROTECT(1); return res; } }; // catchall for R to vector conversion template struct traits_asptr < std::vector > { static int asptr(SEXP obj, std::vector **val) { std::vector *p; int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector >(), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // now for vectors of vectors. These will be represented as lists of vectors on the // catch all that does everything with vectors template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(INTSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { INTEGER_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(REALSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { NUMERIC_POINTER(VECTOR_ELT(result, pos))[vpos] = static_cast(val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template <> struct traits_from_ptr > > { static SEXP from (std::vector< std::vector > *val, int owner = 0) { SEXP result; // allocate the R list PROTECT(result = Rf_allocVector(VECSXP, val->size())); for (unsigned pos = 0; pos < val->size(); pos++) { // allocate the R vector SET_VECTOR_ELT(result, pos, Rf_allocVector(LGLSXP, val->at(pos).size())); // Fill the R vector for (unsigned vpos = 0; vpos < val->at(pos).size(); ++vpos) { LOGICAL_POINTER(VECTOR_ELT(result, pos))[vpos] = (val->at(pos).at(vpos)); } } UNPROTECT(1); return(result); } }; template struct traits_from_ptr< std::vector < std::vector< T > > > { static SEXP from (std::vector < std::vector< T > > *val, int owner = 0) { return SWIG_R_NewPointerObj(val, type_info< std::vector < std::vector< T > > >(), owner); } }; ///////////////////////////////////////////////////////////////// // R side template <> struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< int> > > { static int asptr(SEXP obj, std::vector< std::vector< int> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< int> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(INTEGER_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< float> > > { static int asptr(SEXP obj, std::vector< std::vector< float> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< float> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< double> > > { static int asptr(SEXP obj, std::vector< std::vector< double> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< double> > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(NUMERIC_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template <> struct traits_asptr < std::vector< std::vector< bool > > > { static int asptr(SEXP obj, std::vector< std::vector< bool> > **val) { std::vector > *p; // this is the length of the list unsigned int sexpsz = Rf_length(obj); p = new std::vector< std::vector< bool > > (sexpsz); for (unsigned listpos = 0; listpos < sexpsz; ++listpos) { unsigned vecsize = Rf_length(VECTOR_ELT(obj, listpos)); for (unsigned vpos = 0; vpos < vecsize; ++vpos) { (*p)[listpos].push_back(static_cast(LOGICAL_POINTER(VECTOR_ELT(obj, listpos))[vpos])); } } int res = SWIG_OK; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; // catchall template struct traits_asptr < std::vector< std::vector > > { static int asptr(SEXP obj, std::vector< std::vector > **val) { std::vector< std::vector > *p; Rprintf("vector of vectors - unsupported content\n"); int res = SWIG_R_ConvertPtr(obj, (void**)&p, type_info< std::vector< std::vector > > (), 0); if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %define %traits_type_name(Type...) %fragment(SWIG_Traits_frag(Type), "header", fragment="StdTraits",fragment="StdVectorTraits") { namespace swig { template <> struct traits< Type > { typedef pointer_category category; static const char* type_name() { return #Type; } }; } } %enddef %include %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.numeric($arg) %} %typemap("rtype") std::vector "numeric" %typemap("scoercein") std::vector, std::vector *, std::vector & "$input = as.numeric($input);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector) %traits_type_name(std::vector) // reuse these for float %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.logical($arg) %} %typemap("rtype") std::vector "logical" %typemap("scoercein") std::vector , std::vector & "$input = as.logical($input);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap("rtypecheck") std::vector, std::vector *, std::vector & %{ is.integer($arg) || is.numeric($arg) %} %typemap("rtype") std::vector "integer" %typemap("scoercein") std::vector , std::vector *, std::vector & "$input = as.integer($input);"; // strings %typemap("rtype") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "character" %typemap("rtypecheck") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ is.character($arg) %} %typemap("scoercein") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & "$input = as.character($input);"; %typemap("scoerceout") std::vector< std::basic_string >, std::vector< std::basic_string > *, std::vector< std::basic_string > & %{ %} %apply std::vector< std::basic_string > { std::vector< std::string> }; // all the related integer vectors // signed %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #if defined(SWIGWORDSIZE64) %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #else %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #endif // unsigned %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #if defined(SWIGWORDSIZE64) %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #else %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector); %traits_type_name(std::vector); #endif // These R side typemaps are common for integer types // but we can't use %apply as it will copy the C side ones too // Also note that we don't seem to be able to use types like // int_least8_t here. %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtype") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; %typemap("scoercein") std::vector, std::vector *, std::vector & = std::vector; #endif %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #if defined(SWIGWORDSIZE64) %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #else %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; %typemap("rtypecheck") std::vector, std::vector *, std::vector & = std::vector; #endif /////////////////////////////////////////////////////////////// %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.integer);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.numeric);"; %typemap_traits_ptr(SWIG_TYPECHECK_VECTOR, std::vector >); %traits_type_name(std::vector< std::vector >); %typemap("rtypecheck") std::vector >, std::vector > *, std::vector > & %{ is.list($arg) && all(sapply($arg , is.integer) || sapply($arg, is.numeric)) %} %typemap("rtype") std::vector >, std::vector > *, std::vector > & "list" %typemap("scoercein") std::vector< std::vector >, std::vector > *, std::vector > & "$input = lapply($input, as.logical);"; // we don't want these to be given R classes as they // have already been turned into R vectors. %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector , std::vector*, std::vector , std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector&, // vectors of vectors std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >&, std::vector< std::vector >, std::vector< std::vector >*, std::vector< std::vector >& %{ %} #if defined(SWIGWORDSIZE64) %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector& %{ %} #else %typemap(scoerceout) std::vector, std::vector*, std::vector&, std::vector, std::vector*, std::vector& %{ %} #endif swig-3.0.12/Lib/r/std_alloc.i0000664000175000017500000000003213042756442015515 0ustar williamwilliam%include swig-3.0.12/Lib/r/std_container.i0000664000175000017500000000007113042756442016410 0ustar williamwilliam%include %include swig-3.0.12/Lib/r/ropers.swg0000664000175000017500000000165313042756442015445 0ustar williamwilliam#ifdef __cplusplus %rename(Equal) operator =; %rename(PlusEqual) operator +=; %rename(MinusEqual) operator -=; %rename(MultiplyEqual) operator *=; %rename(DivideEqual) operator /=; %rename(PercentEqual) operator %=; %rename(Plus) operator +; %rename(Minus) operator -; %rename(Multiply) operator *; %rename(Divide) operator /; %rename(Percent) operator %; %rename(Not) operator !; %rename(IndexIntoConst) operator[](unsigned idx) const; %rename(IndexInto) operator[](unsigned idx); %rename(Functor) operator (); %rename(EqualEqual) operator ==; %rename(NotEqual) operator !=; %rename(LessThan) operator <; %rename(LessThanEqual) operator <=; %rename(GreaterThan) operator >; %rename(GreaterThanEqual) operator >=; %rename(And) operator &&; %rename(Or) operator ||; %rename(PlusPlusPrefix) operator++(); %rename(PlusPlusPostfix) operator++(int); %rename(MinusMinusPrefix) operator--(); %rename(MinusMinusPostfix) operator--(int); #endif swig-3.0.12/Lib/r/std_common.i0000664000175000017500000000433613042756442015726 0ustar williamwilliam%include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SEXP obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SEXP from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SEXP obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SEXP from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-3.0.12/Lib/r/std_except.i0000664000175000017500000000004313042756442015715 0ustar williamwilliam%include swig-3.0.12/Lib/r/typemaps.i0000664000175000017500000000004113042756442015413 0ustar williamwilliam%include swig-3.0.12/Lib/r/rkw.swg0000664000175000017500000000125213042756442014731 0ustar williamwilliam/* Warnings for R keywords, built-in names and bad names. */ #define RKW(x) %keywordwarn("'" `x` "' is a R keyword, renaming to '_" `x`"'", rename="_%s") `x` #define RSWIGKW(x) %keywordwarn("'" `x` "' is a SWIG R reserved parameter name, renaming to '_" `x`"'", rename="_%s") `x` /* Warnings for R reserved words taken from http://cran.r-project.org/doc/manuals/R-lang.html#Reserved-words */ RKW(if); RKW(else); RKW(repeat); RKW(while); RKW(function); RKW(for); RKW(in); RKW(next); RKW(break); RKW(TRUE); RKW(FALSE); RKW(NULL); RKW(Inf); RKW(NaN); RKW(NA); RKW(NA_integer_); RKW(NA_real_); RKW(NA_complex_); RKW(NA_character_); RSWIGKW(self); #undef RKW #undef RSWIGKW swig-3.0.12/Lib/r/rfragments.swg0000664000175000017500000001160313042756442016277 0ustar williamwilliam#define SWIG_Error(code, msg) Rf_warning(msg); return Rf_ScalarLogical(NA_LOGICAL) #define SWIG_fail return Rf_ScalarLogical(NA_LOGICAL) /* for raw pointers */ #define SWIG_ConvertPtr(oc, ptr, ty, flags) SWIG_R_ConvertPtr(oc, ptr, ty, flags) #define SWIG_ConvertFunctionPtr(oc, ptr, ty) SWIG_R_ConvertPtr(oc, ptr, ty, 0) #define SWIG_NewPointerObj(ptr, ty, flags) SWIG_R_NewPointerObj(ptr, ty, flags) #define SWIG_NewFunctionPtrObj(ptr, ty) SWIG_R_NewPointerObj(ptr, ty, 0) /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_R_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, ty) SWIG_R_NewPackedObj(ptr, sz, ty) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, ty, flags) SWIG_ConvertPtr(obj, pptr, ty, flags) #define SWIG_NewInstanceObj(ptr, ty, flags) SWIG_NewPointerObj(ptr, ty, flags) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_R_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, ty) SWIG_R_NewPackedObj(ptr, sz, ty) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_R_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_R_SetModule(pointer) %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(long)(long value) { return Rf_ScalarInteger((int)value); } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(long)(SEXP obj, long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } } %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SEXP SWIG_From_dec(long long)(long long value) { return Rf_ScalarInteger((int)value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE int SWIG_AsVal_dec(long long)(SEXP obj, long long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(unsigned long)(unsigned long value) { return Rf_ScalarInteger((int)value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(unsigned long)(SEXP obj, unsigned long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE SEXP SWIG_From_dec(unsigned long long)(unsigned long long value) { return Rf_ScalarInteger((int)value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE int SWIG_AsVal_dec(unsigned long long)(SEXP obj, unsigned long long *val) { if (val) *val = Rf_asInteger(obj); return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE SEXP SWIG_From_dec(double)(double value) { return Rf_ScalarReal(value); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERNINLINE int SWIG_AsVal_dec(double)(SEXP obj, double *val) { if (val) *val = Rf_asReal(obj); return SWIG_OK; } } %fragment("SWIG_AsCharPtrAndSize", "header") { SWIGINTERN int SWIG_AsCharPtrAndSize(SEXP obj, char** cptr, size_t* psize, int *alloc) { if (cptr && Rf_isString(obj)) { char *cstr = %const_cast(CHAR(STRING_ELT(obj, 0)), char *); int len = strlen(cstr); if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; } } else { *cptr = %reinterpret_cast(malloc(len + 1), char *); *cptr = strcpy(*cptr, cstr); } if (psize) *psize = len + 1; return SWIG_OK; } return SWIG_TypeError; } } %fragment("SWIG_strdup","header") { SWIGINTERN char * SWIG_strdup(const char *str) { char *newstr = %reinterpret_cast(malloc(strlen(str) + 1), char *); return strcpy(newstr, str); } } //# This is modified from the R header files %fragment("SWIG_FromCharPtrAndSize","header") { SWIGINTERN SEXP SWIG_FromCharPtrAndSize(const char* carray, size_t size) { SEXP t, c; if (!carray) return R_NilValue; /* See R internals document 1.10. MkCharLen was introduced in 2.7.0. Use that instead of hand creating vector. Starting in 2.8.0 creating strings via vectors was deprecated in order to allow for use of CHARSXP caches. */ Rf_protect(t = Rf_allocVector(STRSXP, 1)); %#if R_VERSION >= R_Version(2,7,0) c = Rf_mkCharLen(carray, size); %#else c = Rf_allocVector(CHARSXP, size); strncpy((char *)CHAR(c), carray, size); %#endif SET_STRING_ELT(t, 0, c); Rf_unprotect(1); return t; } } swig-3.0.12/Lib/r/std_pair.i0000664000175000017500000000010413042756442015356 0ustar williamwilliam%fragment("StdPairTraits","header") %{ %} %include swig-3.0.12/Lib/r/rrun.swg0000664000175000017500000002155513042756442015124 0ustar williamwilliam /* Remove global namespace pollution */ #if !defined(SWIG_NO_R_NO_REMAP) # define R_NO_REMAP #endif #if !defined(SWIG_NO_STRICT_R_HEADERS) # define STRICT_R_HEADERS #endif #include #include #ifdef __cplusplus #include extern "C" { #endif /* for raw pointer */ #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_R_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_R_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_R_NewPointerObj(ptr, type, flags) #include #include #include #if R_VERSION >= R_Version(2,6,0) #define VMAXTYPE void * #else #define VMAXTYPE char * #endif /* This is mainly a way to avoid having lots of local variables that may conflict with those in the routine. Change name to R_SWIG_Callb.... */ typedef struct RCallbackFunctionData { SEXP fun; SEXP userData; SEXP expr; SEXP retValue; int errorOccurred; SEXP el; /* Temporary pointer used in the construction of the expression to call the R function. */ struct RCallbackFunctionData *previous; /* Stack */ } RCallbackFunctionData; static RCallbackFunctionData *callbackFunctionDataStack; SWIGRUNTIME SEXP R_SWIG_debug_getCallbackFunctionData() { int n, i; SEXP ans; RCallbackFunctionData *p = callbackFunctionDataStack; n = 0; while(p) { n++; p = p->previous; } Rf_protect(ans = Rf_allocVector(VECSXP, n)); for(p = callbackFunctionDataStack, i = 0; i < n; p = p->previous, i++) SET_VECTOR_ELT(ans, i, p->fun); Rf_unprotect(1); return(ans); } SWIGRUNTIME RCallbackFunctionData * R_SWIG_pushCallbackFunctionData(SEXP fun, SEXP userData) { RCallbackFunctionData *el; el = (RCallbackFunctionData *) calloc(1, sizeof(RCallbackFunctionData)); el->fun = fun; el->userData = userData; el->previous = callbackFunctionDataStack; callbackFunctionDataStack = el; return(el); } SWIGRUNTIME SEXP R_SWIG_R_pushCallbackFunctionData(SEXP fun, SEXP userData) { R_SWIG_pushCallbackFunctionData(fun, userData); return R_NilValue; } SWIGRUNTIME RCallbackFunctionData * R_SWIG_getCallbackFunctionData() { if(!callbackFunctionDataStack) { Rf_error("Supposedly impossible error occurred in the SWIG callback mechanism." " No callback function data set."); } return callbackFunctionDataStack; } SWIGRUNTIME void R_SWIG_popCallbackFunctionData(int doFree) { RCallbackFunctionData *el = NULL; if(!callbackFunctionDataStack) return ; /* Error !!! */ el = callbackFunctionDataStack ; callbackFunctionDataStack = callbackFunctionDataStack->previous; if(doFree) free(el); } /* Interface to S function is(obj, type) which is to be used to determine if an external pointer inherits from the right class. Ideally, we would like to be able to do this without an explicit call to the is() function. When the S4 class system uses its own SEXP types, then we will hopefully be able to do this in the C code. Should we make the expression static and preserve it to avoid the overhead of allocating each time. */ SWIGRUNTIME int R_SWIG_checkInherits(SEXP obj, SEXP tag, const char *type) { SEXP e, val; int check_err = 0; Rf_protect(e = Rf_allocVector(LANGSXP, 3)); SETCAR(e, Rf_install("extends")); SETCAR(CDR(e), Rf_mkString(CHAR(PRINTNAME(tag)))); SETCAR(CDR(CDR(e)), Rf_mkString(type)); val = R_tryEval(e, R_GlobalEnv, &check_err); Rf_unprotect(1); if(check_err) return(0); return(LOGICAL(val)[0]); } SWIGRUNTIME void * R_SWIG_resolveExternalRef(SEXP arg, const char * const type, const char * const argName, Rboolean nullOk) { void *ptr; SEXP orig = arg; if(TYPEOF(arg) != EXTPTRSXP) arg = GET_SLOT(arg, Rf_mkString("ref")); if(TYPEOF(arg) != EXTPTRSXP) { Rf_error("argument %s must be an external pointer (from an ExternalReference)", argName); } ptr = R_ExternalPtrAddr(arg); if(ptr == NULL && nullOk == (Rboolean) FALSE) { Rf_error("the external pointer (of type %s) for argument %s has value NULL", argName, type); } if(type[0] && R_ExternalPtrTag(arg) != Rf_install(type) && strcmp(type, "voidRef") && !R_SWIG_checkInherits(orig, R_ExternalPtrTag(arg), type)) { Rf_error("the external pointer for argument %s has tag %s, not the expected value %s", argName, CHAR(PRINTNAME(R_ExternalPtrTag(arg))), type); } return(ptr); } SWIGRUNTIME void R_SWIG_ReferenceFinalizer(SEXP el) { void *ptr = R_SWIG_resolveExternalRef(el, "", "", (Rboolean) 1); fprintf(stderr, "In R_SWIG_ReferenceFinalizer for %p\n", ptr); Rf_PrintValue(el); if(ptr) { if(TYPEOF(el) != EXTPTRSXP) el = GET_SLOT(el, Rf_mkString("ref")); if(TYPEOF(el) == EXTPTRSXP) R_ClearExternalPtr(el); free(ptr); } return; } typedef enum {R_SWIG_EXTERNAL, R_SWIG_OWNER } R_SWIG_Owner; SWIGRUNTIME SEXP SWIG_MakePtr(void *ptr, const char *typeName, R_SWIG_Owner owner) { SEXP external, r_obj; Rf_protect(external = R_MakeExternalPtr(ptr, Rf_install(typeName), R_NilValue)); Rf_protect(r_obj = NEW_OBJECT(MAKE_CLASS((char *) typeName))); if(owner) R_RegisterCFinalizer(external, R_SWIG_ReferenceFinalizer); r_obj = SET_SLOT(r_obj, Rf_mkString((char *) "ref"), external); SET_S4_OBJECT(r_obj); Rf_unprotect(2); return(r_obj); } SWIGRUNTIME SEXP R_SWIG_create_SWIG_R_Array(const char *typeName, SEXP ref, int len) { SEXP arr; /*XXX remove the char * cast when we can. MAKE_CLASS should be declared appropriately. */ Rf_protect(arr = NEW_OBJECT(MAKE_CLASS((char *) typeName))); Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("ref"), ref)); Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("dims"), Rf_ScalarInteger(len))); Rf_unprotect(3); SET_S4_OBJECT(arr); return arr; } #define ADD_OUTPUT_ARG(result, pos, value, name) r_ans = AddOutputArgToReturn(pos, value, name, OutputValues); SWIGRUNTIME SEXP AddOutputArgToReturn(int pos, SEXP value, const char *name, SEXP output) { SET_VECTOR_ELT(output, pos, value); return(output); } /* Create a new pointer object */ SWIGRUNTIMEINLINE SEXP SWIG_R_NewPointerObj(void *ptr, swig_type_info *type, int flags) { SEXP rptr = R_MakeExternalPtr(ptr, R_MakeExternalPtr(type, R_NilValue, R_NilValue), R_NilValue); SET_S4_OBJECT(rptr); return rptr; } /* Convert a pointer value */ SWIGRUNTIMEINLINE int SWIG_R_ConvertPtr(SEXP obj, void **ptr, swig_type_info *ty, int flags) { void *vptr; if (!obj) return SWIG_ERROR; if (obj == R_NilValue) { if (ptr) *ptr = NULL; return SWIG_OK; } vptr = R_ExternalPtrAddr(obj); if (ty) { swig_type_info *to = (swig_type_info*) R_ExternalPtrAddr(R_ExternalPtrTag(obj)); if (to == ty) { if (ptr) *ptr = vptr; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); int newmemory = 0; if (ptr) *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } } else { if (ptr) *ptr = vptr; } return SWIG_OK; } SWIGRUNTIME swig_module_info * SWIG_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; return (swig_module_info *) type_pointer; } SWIGRUNTIME void SWIG_SetModule(void *v, swig_module_info *swig_module) { } typedef struct { void *pack; swig_type_info *ty; size_t size; } RSwigPacked; /* Create a new packed object */ SWIGRUNTIMEINLINE SEXP RSwigPacked_New(void *ptr, size_t sz, swig_type_info *ty) { SEXP rptr; RSwigPacked *sobj = (RSwigPacked*) malloc(sizeof(RSwigPacked)); if (sobj) { void *pack = malloc(sz); if (pack) { memcpy(pack, ptr, sz); sobj->pack = pack; sobj->ty = ty; sobj->size = sz; } else { sobj = 0; } } rptr = R_MakeExternalPtr(sobj, R_NilValue, R_NilValue); return rptr; } SWIGRUNTIME swig_type_info * RSwigPacked_UnpackData(SEXP obj, void *ptr, size_t size) { RSwigPacked *sobj = (RSwigPacked *)R_ExternalPtrAddr(obj); if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } SWIGRUNTIMEINLINE SEXP SWIG_R_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? RSwigPacked_New((void *) ptr, sz, type) : R_NilValue; } /* Convert a packed value value */ SWIGRUNTIME int SWIG_R_ConvertPacked(SEXP obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = RSwigPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } #ifdef __cplusplus #define SWIG_exception_noreturn(code, msg) do { throw std::runtime_error(msg); } while(0) #else #define SWIG_exception_noreturn(code, msg) do { return result; } while(0) #endif #ifdef __cplusplus } #endif swig-3.0.12/Lib/r/stl.i0000664000175000017500000000023513042756442014360 0ustar williamwilliam/* initial STL definition. extended as needed in each language */ %include std_common.i %include std_vector.i %include std_pair.i %include std_string.i swig-3.0.12/Lib/r/exception.i0000664000175000017500000000034113042756442015552 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(switch (code) {case SWIG_IndexError: return Rf_ScalarLogical(NA_LOGICAL); default: %error(code, msg); SWIG_fail;} )) } swig-3.0.12/Lib/r/std_list.i0000664000175000017500000000024713042756442015406 0ustar williamwilliam#define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/r/rstdcommon.swg0000664000175000017500000001232113042756442016312 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static SWIG_Object from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static SWIG_Object from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static SWIG_Object from(Type* val) { return traits_from_ptr::from(val, 0); } }; template inline SWIG_Object from(const Type& val) { return traits_from::from(val); } template inline SWIG_Object from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(SWIG_Object obj, Type **val) { Type *p; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(SWIG_Object obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(SWIG_Object obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(SWIG_Object obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(SWIG_Object obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(SWIG_Object obj, bool throw_error) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { if (throw_error) throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(SWIG_Object obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { // Uninitialized return value, no Type() constructor required. static Type *v_def = (Type*) malloc(sizeof(Type)); if (throw_error) throw std::invalid_argument("bad type"); memset(v_def,0,sizeof(Type)); return *v_def; } } }; template struct traits_as { static Type* as(SWIG_Object obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (throw_error) throw std::invalid_argument("bad type"); return 0; } } }; template inline Type as(SWIG_Object obj, bool te = false) { return traits_as::category>::as(obj, te); } template struct traits_check { static bool check(SWIG_Object obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(SWIG_Object obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(SWIG_Object obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(SWIG_Object obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static SWIG_Object from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(SWIG_Object obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef swig-3.0.12/Lib/r/r.swg0000664000175000017500000001412113042756442014366 0ustar williamwilliam/* */ %insert("header") "swiglabels.swg" %insert("header") "swigerrors.swg" %insert("init") "swiginit.swg" %insert("runtime") "swigrun.swg" %insert("runtime") "rrun.swg" %init %{ SWIGEXPORT void SWIG_init(void) { %} %include #define %Rruntime %insert("s") #define SWIG_Object SEXP #define VOID_Object R_NilValue #define %append_output(obj) SET_VECTOR_ELT($result, $n, obj) %define %set_constant(name, obj) %begin_block SEXP _obj = obj; assign(name, _obj); %end_block %enddef %define %raise(obj,type,desc) return R_NilValue; %enddef %insert("sinit") "srun.swg" %insert("sinitroutine") %{ SWIG_init(); SWIG_InitializeModule(0); %} %include %typemap(in) (double *x, int len) %{ $1 = REAL(x); $2 = Rf_length(x); %} /* XXX Need to worry about inheritance, e.g. if B extends A and we are looking for an A[], then B elements are okay. */ %typemap(scheck) SWIGTYPE[ANY] %{ # assert(length($input) > $1_dim0) assert(all(sapply($input, class) == "$R_class")); %} %typemap(out) void ""; %typemap(in) int *, int[ANY], signed int *, signed int[ANY], unsigned int *, unsigned int[ANY], short *, short[ANY], signed short *, signed short[ANY], unsigned short *, unsigned short[ANY], long *, long[ANY], signed long *, signed long[ANY], unsigned long *, unsigned long[ANY], long long *, long long[ANY], signed long long *, signed long long[ANY], unsigned long long *, unsigned long long[ANY] { { int _rswigi; int _rswiglen = LENGTH($input); $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); for (_rswigi=0; _rswigi< _rswiglen; _rswigi++) { $1[_rswigi] = INTEGER($input)[_rswigi]; } } } %typemap(in) float *, float[ANY], double *, double[ANY] { { int _rswigi; int _rswiglen = LENGTH($input); $1 = %static_cast(calloc(sizeof($1_basetype), _rswiglen), $1_ltype); for (_rswigi=0; _rswigi<_rswiglen; _rswigi++) { $1[_rswigi] = REAL($input)[_rswigi]; } } } %typemap(freearg,noblock=1) int *, int[ANY], signed int *, signed int[ANY], unsigned int *, unsigned int[ANY], short *, short[ANY], signed short *, signed short[ANY], unsigned short *, unsigned short[ANY], long *, long[ANY], signed long *, signed long[ANY], unsigned long *, unsigned long[ANY], long long *, long long[ANY], signed long long *, signed long long[ANY], unsigned long long *, unsigned long long[ANY], float *, float[ANY], double *, double[ANY] %{ free($1); %} %typemap(freearg, noblock=1) int *OUTPUT, signed int *OUTPUT, unsigned int *OUTPUT, short *OUTPUT, signed short *OUTPUT, unsigned short *OUTPUT, long *OUTPUT, signed long *OUTPUT, unsigned long *OUTPUT, long long *OUTPUT, signed long long *OUTPUT, unsigned long long *OUTPUT, float *OUTPUT, double *OUTPUT, char *OUTPUT, signed char *OUTPUT, unsigned char *OUTPUT {} /* Should we recycle to make the length correct. And warn if length() > the dimension. */ %typemap(scheck) SWIGTYPE [ANY] %{ # assert(length($input) >= $1_dim0) %} /* Handling vector case to avoid warnings, although we just use the first one. */ %typemap(scheck) unsigned int %{ assert(length($input) == 1 && $input >= 0, "All values must be non-negative"); %} %typemap(scheck) int, long %{ if(length($input) > 1) { warning("using only the first element of $input"); }; %} %include %include %include %include %include %typemap(in,noblock=1) enum SWIGTYPE[ANY] { $1 = %reinterpret_cast(INTEGER($input), $1_ltype); } %typemap(in,noblock=1,fragment="SWIG_strdup") char * { $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype); } %typemap(freearg,noblock=1) char * { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char *[ANY] { $1 = %reinterpret_cast(SWIG_strdup(CHAR(STRING_ELT($input, 0))), $1_ltype); } %typemap(freearg,noblock=1) char *[ANY] { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char[ANY] { $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0))); } %typemap(freearg,noblock=1) char[ANY] { free($1); } %typemap(in,noblock=1,fragment="SWIG_strdup") char[] { $1 = SWIG_strdup(CHAR(STRING_ELT($input, 0))); } %typemap(freearg,noblock=1) char[] { free($1); } %typemap(memberin) char[] %{ if ($input) strcpy($1, $input); else strcpy($1, ""); %} %typemap(globalin) char[] %{ if ($input) strcpy($1, $input); else strcpy($1, ""); %} %typemap(out,noblock=1) char * { $result = $1 ? Rf_mkString(%reinterpret_cast($1,char *)) : R_NilValue; } %typemap(in,noblock=1) char { $1 = %static_cast(CHAR(STRING_ELT($input, 0))[0],$1_ltype); } %typemap(out) char { char tmp[2] = "x"; tmp[0] = $1; $result = Rf_mkString(tmp); } %typemap(in,noblock=1) int, long { $1 = %static_cast(INTEGER($input)[0], $1_ltype); } %typemap(out,noblock=1) int, long "$result = Rf_ScalarInteger($1);"; %typemap(in,noblock=1) bool "$1 = LOGICAL($input)[0] ? true : false;"; %typemap(out,noblock=1) bool "$result = Rf_ScalarLogical($1);"; %typemap(in,noblock=1) float, double { $1 = %static_cast(REAL($input)[0], $1_ltype); } /* Why is this here ? */ /* %typemap(out,noblock=1) unsigned int * "$result = ScalarReal(*($1));"; */ %Rruntime %{ setMethod('[', "ExternalReference", function(x,i,j, ..., drop=TRUE) if (!is.null(x$"__getitem__")) sapply(i, function(n) x$"__getitem__"(i=as.integer(n-1)))) setMethod('[<-' , "ExternalReference", function(x,i,j, ..., value) if (!is.null(x$"__setitem__")) { sapply(1:length(i), function(n) x$"__setitem__"(i=as.integer(i[n]-1), x=value[n])) x }) setAs('ExternalReference', 'character', function(from) {if (!is.null(from$"__str__")) from$"__str__"()}) suppressMessages(suppressWarnings(setMethod('print', 'ExternalReference', function(x) {print(as(x, "character"))}))) %} swig-3.0.12/Lib/r/cdata.i0000664000175000017500000000003613042756442014631 0ustar williamwilliam%include swig-3.0.12/Lib/r/std_string.i0000664000175000017500000000004313042756442015733 0ustar williamwilliam%include swig-3.0.12/Lib/r/rcontainer.swg0000664000175000017500000001260013042756442016271 0ustar williamwilliam // // Common fragments // /**** The python container methods ****/ %fragment("StdSequenceTraits","header",fragment="") { %#include namespace swig { inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %define %swig_container_methods(Container...) %newobject __getslice__; %extend { bool __nonzero__() const { return !(self->empty()); } size_type __len__() const { return self->size(); } } %enddef %define %swig_sequence_methods_common(Sequence...) // %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("StdSequenceTraits"); %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range) { return swig::getslice(self, i, j); } void __setslice__(difference_type i, difference_type j, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, v); } void __delslice__(difference_type i, difference_type j) throw (std::out_of_range) { swig::delslice(self, i, j); } void __delitem__(difference_type i) throw (std::out_of_range) { self->erase(swig::getpos(self,i)); } } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { const value_type& __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, const value_type& x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(const value_type& x) { self->push_back(x); } } %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { value_type __getitem__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(value_type x) { self->push_back(x); } } %enddef swig-3.0.12/Lib/r/std_map.i0000664000175000017500000000010313042756442015177 0ustar williamwilliam%fragment("StdMapTraits","header") %{ %} %include swig-3.0.12/Lib/r/boost_shared_ptr.i0000664000175000017500000003647613042756442017137 0ustar williamwilliam%include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { %set_output(SWIG_NewPointerObj(new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { %set_varoutput(SWIG_NewPointerObj(new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer // Note: $disown not implemented as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer by reference // Note: $disown not implemented as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 && *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 && **$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/chicken/0000775000175000017500000000000013042756442014547 5ustar williamwilliamswig-3.0.12/Lib/chicken/extra-install.list0000664000175000017500000000010213042756442020224 0ustar williamwilliamswigclosprefix.scm multi-generic.scm tinyclos-multi-generic.patch swig-3.0.12/Lib/chicken/multi-generic.scm0000664000175000017500000001361413042756442020024 0ustar williamwilliam;; This file is no longer necessary with Chicken versions above 1.92 ;; ;; This file overrides two functions inside TinyCLOS to provide support ;; for multi-argument generics. There are many ways of linking this file ;; into your code... all that needs to happen is this file must be ;; executed after loading TinyCLOS but before any SWIG modules are loaded ;; ;; something like the following ;; (require 'tinyclos) ;; (load "multi-generic") ;; (declare (uses swigmod)) ;; ;; An alternative to loading this scheme code directly is to add a ;; (declare (unit multi-generic)) to the top of this file, and then ;; compile this into the final executable or something. Or compile ;; this into an extension. ;; Lastly, to override TinyCLOS method creation, two functions are ;; overridden: see the end of this file for which two are overridden. ;; You might want to remove those two lines and then exert more control over ;; which functions are used when. ;; Comments, bugs, suggestions: send either to chicken-users@nongnu.org or to ;; Most code copied from TinyCLOS (define (make 'name "multi-generic" 'direct-supers (list ) 'direct-slots '())) (letrec ([applicable? (lambda (c arg) (memq c (class-cpl (class-of arg))))] [more-specific? (lambda (c1 c2 arg) (memq c2 (memq c1 (class-cpl (class-of arg)))))] [filter-in (lambda (f l) (if (null? l) '() (let ([h (##sys#slot l 0)] [r (##sys#slot l 1)] ) (if (f h) (cons h (filter-in f r)) (filter-in f r) ) ) ) )]) (add-method compute-apply-generic (make-method (list ) (lambda (call-next-method generic) (lambda args (let ([cam (let ([x (compute-apply-methods generic)] [y ((compute-methods generic) args)] ) (lambda (args) (x y args)) ) ] ) (cam args) ) ) ) ) ) (add-method compute-methods (make-method (list ) (lambda (call-next-method generic) (lambda (args) (let ([applicable (filter-in (lambda (method) (let check-applicable ([list1 (method-specializers method)] [list2 args]) (cond ((null? list1) #t) ((null? list2) #f) (else (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) (generic-methods generic) ) ] ) (if (or (null? applicable) (null? (##sys#slot applicable 1))) applicable (let ([cmms (compute-method-more-specific? generic)]) (sort applicable (lambda (m1 m2) (cmms m1 m2 args))) ) ) ) ) ) ) ) (add-method compute-method-more-specific? (make-method (list ) (lambda (call-next-method generic) (lambda (m1 m2 args) (let loop ((specls1 (method-specializers m1)) (specls2 (method-specializers m2)) (args args)) (cond-expand [unsafe (let ((c1 (##sys#slot specls1 0)) (c2 (##sys#slot specls2 0)) (arg (##sys#slot args 0))) (if (eq? c1 c2) (loop (##sys#slot specls1 1) (##sys#slot specls2 1) (##sys#slot args 1)) (more-specific? c1 c2 arg))) ] [else (cond ((and (null? specls1) (null? specls2)) (##sys#error "two methods are equally specific" generic)) ;((or (null? specls1) (null? specls2)) ; (##sys#error "two methods have different number of specializers" generic)) ((null? specls1) #f) ((null? specls2) #t) ((null? args) (##sys#error "fewer arguments than specializers" generic)) (else (let ((c1 (##sys#slot specls1 0)) (c2 (##sys#slot specls2 0)) (arg (##sys#slot args 0))) (if (eq? c1 c2) (loop (##sys#slot specls1 1) (##sys#slot specls2 1) (##sys#slot args 1)) (more-specific? c1 c2 arg)))) ) ] ) ) ) ) ) ) ) ;; end of letrec (define multi-add-method (lambda (generic method) (slot-set! generic 'methods (let filter-in-method ([methods (slot-ref generic 'methods)]) (if (null? methods) (list method) (let ([l1 (length (method-specializers method))] [l2 (length (method-specializers (##sys#slot methods 0)))]) (cond ((> l1 l2) (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))) ((< l1 l2) (cons method methods)) (else (let check-method ([ms1 (method-specializers method)] [ms2 (method-specializers (##sys#slot methods 0))]) (cond ((and (null? ms1) (null? ms2)) (cons method (##sys#slot methods 1))) ;; skip the method already in the generic ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) (else (cons (##sys#slot methods 0) (filter-in-method (##sys#slot methods 1)))))))))))) (##sys#setslot (##sys#slot generic (- (##sys#size generic) 2)) 1 (compute-apply-generic generic)) )) (define (multi-add-global-method val sym specializers proc) (let ((generic (if (procedure? val) val (make 'name (##sys#symbol->string sym))))) (multi-add-method generic (make-method specializers proc)) generic)) ;; Might want to remove these, or perhaps do something like ;; (define old-add-method ##tinyclos#add-method) ;; and then you can switch between creating multi-generics and TinyCLOS generics. (set! ##tinyclos#add-method multi-add-method) (set! ##tinyclos#add-global-method multi-add-global-method) swig-3.0.12/Lib/chicken/typemaps.i0000664000175000017500000002700313042756442016565 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * * These mappings provide support for input/output arguments and * common uses for C/C++ pointers. INOUT mappings allow for C/C++ * pointer variables in addition to input/output arguments. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Scheme list. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); */ //---------------------------------------------------------------------- // // T_OUTPUT typemap (and helper function) to return multiple argouts as // a tuple instead of a list. // //---------------------------------------------------------------------- // Simple types %define INOUT_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) %typemap(in) type_ *INPUT($*1_ltype temp), type_ &INPUT($*1_ltype temp) %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } temp = ($*1_ltype) from_scheme ($input); $1 = &temp; %} %typemap(typecheck) type_ *INPUT = type_; %typemap(typecheck) type_ &INPUT = type_; %typemap(in, numinputs=0) type_ *OUTPUT($*1_ltype temp), type_ &OUTPUT($*1_ltype temp) " $1 = &temp;" #if "storage_" == "0" %typemap(argout) type_ *OUTPUT, type_ &OUTPUT %{ if ($1 == NULL) { swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Argument #$argnum must be non-null"); } SWIG_APPEND_VALUE(to_scheme (convtype (*$1))); %} #else %typemap(argout) type_ *OUTPUT, type_ &OUTPUT %{ { C_word *known_space = C_alloc(storage_); if ($1 == NULL) { swig_barf (SWIG_BARF1_ARGUMENT_NULL, "Variable '$1' must be non-null"); } SWIG_APPEND_VALUE(to_scheme (&known_space, convtype (*$1))); } %} #endif %enddef INOUT_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(enum SWIGTYPE, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); INOUT_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (int), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); INOUT_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); INOUT_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); INOUT_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); INOUT_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); INOUT_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); INOUT_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); INOUT_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a CHICKEN tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); As well, you can wrap variables with : %include %apply double *INOUT { double *y }; extern double *y; Unlike C, this mapping does not directly modify the input value (since this makes no sense in CHICKEN). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a CHICKEN variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) enum SWIGTYPE *INOUT = enum SWIGTYPE *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) char *INOUT = char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) enum SWIGTYPE &INOUT = enum SWIGTYPE &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) char &INOUT = char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) enum SWIGTYPE *INOUT = enum SWIGTYPE *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) enum SWIGTYPE &INOUT = enum SWIGTYPE &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) char &INOUT = char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) bool *INOUT = bool; %typemap(typecheck) char *INOUT = char; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) enum SWIGTYPE *INOUT = enum SWIGTYPE; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) bool &INOUT = bool; %typemap(typecheck) char &INOUT = char; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) enum SWIGTYPE &INOUT = enum SWIGTYPE; %typemap(typecheck) float &INOUT = float; swig-3.0.12/Lib/chicken/chickenrun.swg0000664000175000017500000002547013042756442017432 0ustar williamwilliam/* ----------------------------------------------------------------------------- * chickenrun.swg * ----------------------------------------------------------------------------- */ #include #include #include #include #include #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # ifndef snprintf # define snprintf _snprintf # endif #endif #ifdef __cplusplus extern "C" { #endif #define SWIG_malloc(size) \ malloc(size) #define SWIG_free(mem) \ free(mem) #define SWIG_MakeString(c) \ SWIG_Chicken_MakeString(c) #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_Chicken_ConvertPtr(s, result, type, flags) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_Chicken_MustGetPtr(s, type, argnum, flags) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_Chicken_NewPointerObj((void*)ptr, type, owner, &known_space) #define swig_barf SWIG_Chicken_Barf #define SWIG_ThrowException(val) SWIG_Chicken_ThrowException(val) #define SWIG_contract_assert(expr, message) if (!(expr)) { \ SWIG_Chicken_Barf(SWIG_BARF1_CONTRACT_ASSERT, C_text(message)); } else /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Chicken_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Chicken_SetModule(pointer) #define C_swig_is_bool(x) C_truep (C_booleanp (x)) #define C_swig_is_char(x) C_truep (C_charp (x)) #define C_swig_is_fixnum(x) C_truep (C_fixnump (x)) #define C_swig_is_flonum(x) (C_truep (C_blockp (x)) && C_truep (C_flonump (x))) #define C_swig_is_string(x) (C_truep (C_blockp (x)) && C_truep (C_stringp (x))) #define C_swig_is_vector(x) (C_truep (C_blockp (x)) && C_truep (C_vectorp (x))) #define C_swig_is_list(x) (C_truep (C_i_listp (x))) #define C_swig_is_pair(x) (C_truep (C_blockp(x)) && C_truep (C_pairp(x))) #define C_swig_is_ptr(x) (C_truep (C_blockp (x)) && C_truep (C_pointerp (x))) #define C_swig_is_swigpointer(x) (C_truep (C_blockp(x)) && C_truep (C_swigpointerp(x))) #define C_swig_is_closurep(x) (C_truep (C_blockp(x)) && C_truep(C_closurep(x))) #define C_swig_is_number(x) (C_swig_is_fixnum(x) || C_swig_is_flonum(x)) #define C_swig_is_long(x) C_swig_is_number(x) #define C_swig_sizeof_closure(num) (num+1) #define SWIG_Chicken_SetupArgout { \ C_word *a = C_alloc(C_swig_sizeof_closure(2)); \ C_word *closure = a; \ *(a++)=C_CLOSURE_TYPE|2; \ *(a++)=(C_word)SWIG_Chicken_ApplyResults; \ *(a++)=continuation; \ continuation=(C_word)closure; \ } #define SWIG_APPEND_VALUE(obj) { \ C_word val = (C_word)(obj); \ if (val != C_SCHEME_UNDEFINED) { \ C_word *a = C_alloc(C_swig_sizeof_closure(3)); \ C_word *closure = a; \ *(a++)=C_CLOSURE_TYPE|3; \ *(a++)=(C_word)SWIG_Chicken_MultiResultBuild; \ *(a++)=(C_word)continuation; \ *(a++)=val; \ continuation=(C_word)closure; \ } } #define SWIG_Chicken_FindCreateProxy(func,obj) \ if (C_swig_is_swigpointer(obj)) { \ swig_type_info *t = (swig_type_info *) C_block_item(obj, 1); \ if (t && t->clientdata && ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create) { \ func = CHICKEN_gc_root_ref( ((swig_chicken_clientdata *)t->clientdata)->gc_proxy_create); \ } else { \ func = C_SCHEME_FALSE; \ } \ } else { \ func = C_SCHEME_FALSE; \ } enum { SWIG_BARF1_BAD_ARGUMENT_TYPE /* 1 arg */, SWIG_BARF1_ARGUMENT_NULL /* 1 arg */, SWIG_BARF1_CONTRACT_ASSERT /* 1 arg */, }; typedef C_word (*swig_chicken_destructor)(C_word,C_word,C_word,C_word); typedef struct swig_chicken_clientdata { void *gc_proxy_create; swig_chicken_destructor destroy; } swig_chicken_clientdata; static char * SWIG_Chicken_MakeString(C_word str) { char *ret; size_t l; l = C_header_size(str); ret = (char *) SWIG_malloc( (l + 1) * sizeof(char)); if (!ret) return NULL; memcpy(ret, C_c_string(str), l); ret[l] = '\0'; return ret; } static C_word SWIG_Chicken_LookupSymbol(char *name, C_SYMBOL_TABLE *stable) { C_word *a = C_alloc(C_SIZEOF_STRING (strlen (name))); C_word n = C_string2(&a, name); C_word sym = C_find_symbol(n, stable); if (C_truep(sym)) { return C_symbol_value(sym); } else { return C_SCHEME_FALSE; } } /* Just a helper function. Do not export it */ static void SWIG_Chicken_Panic (C_char *) C_noret; static void SWIG_Chicken_Panic (C_char *msg) { C_word *a = C_alloc (C_SIZEOF_STRING (strlen (msg))); C_word scmmsg = C_string2 (&a, msg); C_halt (scmmsg); exit (5); /* should never get here */ } static void SWIG_Chicken_Barf(int code, C_char *msg, ...) C_noret; static void SWIG_Chicken_Barf(int code, C_char *msg, ...) { char *errorhook = C_text("\003syserror-hook"); C_word *a = C_alloc (C_SIZEOF_STRING (strlen (errorhook))); C_word err = C_intern2 (&a, errorhook); int c = -1; int i, barfval; va_list v; C_temporary_stack = C_temporary_stack_bottom; err = C_block_item(err, 0); if(C_immediatep (err)) SWIG_Chicken_Panic (C_text ("`##sys#error-hook' is not defined")); switch (code) { case SWIG_BARF1_BAD_ARGUMENT_TYPE: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; case SWIG_BARF1_ARGUMENT_NULL: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; case SWIG_BARF1_CONTRACT_ASSERT: barfval = C_BAD_ARGUMENT_TYPE_ERROR; c = 1; break; default: SWIG_Chicken_Panic (C_text (msg)); }; if(c > 0 && !C_immediatep (err)) { C_save (C_fix (barfval)); i = c; if (i) { C_word *b = C_alloc (C_SIZEOF_STRING (strlen (msg))); C_word scmmsg = C_string2 (&b, msg); C_save (scmmsg); i--; } va_start (v, msg); while(i--) C_save (va_arg (v, C_word)); va_end (v); C_do_apply (c + 1, err, C_SCHEME_UNDEFINED); /* <- no continuation is passed: '##sys#error-hook' may not return! */ } else if (msg) { SWIG_Chicken_Panic (msg); } else { SWIG_Chicken_Panic (C_text ("unspecified panic")); } } static void SWIG_Chicken_ThrowException(C_word value) C_noret; static void SWIG_Chicken_ThrowException(C_word value) { char *aborthook = C_text("\003sysabort"); C_word *a = C_alloc(C_SIZEOF_STRING(strlen(aborthook))); C_word abort = C_intern2(&a, aborthook); abort = C_block_item(abort, 0); if (C_immediatep(abort)) SWIG_Chicken_Panic(C_text("`##sys#abort' is not defined")); C_save(value); C_do_apply(1, abort, C_SCHEME_UNDEFINED); } static void SWIG_Chicken_Finalizer(C_word argc, C_word closure, C_word continuation, C_word s) { swig_type_info *type; swig_chicken_clientdata *cdata; if (argc == 3 && s != C_SCHEME_FALSE && C_swig_is_swigpointer(s)) { type = (swig_type_info *) C_block_item(s, 1); if (type) { cdata = (swig_chicken_clientdata *) type->clientdata; if (cdata && cdata->destroy) { /* this will not return, but will continue correctly */ cdata->destroy(3,closure,continuation,s); } } } C_kontinue(continuation, C_SCHEME_UNDEFINED); } static C_word finalizer_obj[2] = {(C_word) (C_CLOSURE_TYPE|1), (C_word) SWIG_Chicken_Finalizer}; static C_word SWIG_Chicken_NewPointerObj(void *ptr, swig_type_info *type, int owner, C_word **data) { swig_chicken_clientdata *cdata = (swig_chicken_clientdata *) type->clientdata; if (ptr == NULL) return C_SCHEME_FALSE; else { C_word cptr = C_swigmpointer(data, ptr, type); /* add finalizer to object */ #ifndef SWIG_CHICKEN_NO_COLLECTION if (owner) C_do_register_finalizer(cptr, (C_word) finalizer_obj); #endif return cptr; } } /* Return 0 if successful. */ static int SWIG_Chicken_ConvertPtr(C_word s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; swig_type_info *from; if (s == C_SCHEME_FALSE) { *result = NULL; } else if (C_swig_is_swigpointer(s)) { /* try and convert type */ from = (swig_type_info *) C_block_item(s, 1); if (!from) return 1; if (type) { cast = SWIG_TypeCheckStruct(from, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, (void *) C_block_item(s, 0), &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return 1; } } else { *result = (void *) C_block_item(s, 0); } /* check if we are disowning this object */ if (flags & SWIG_POINTER_DISOWN) { C_do_unregister_finalizer(s); } } else { return 1; } return 0; } static SWIGINLINE void * SWIG_Chicken_MustGetPtr (C_word s, swig_type_info *type, int argnum, int flags) { void *result; char err_msg[256]; if (SWIG_Chicken_ConvertPtr(s, &result, type, flags)) { /* type mismatch */ snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", argnum, (type->str ? type->str : type->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } return result; } static char *chicken_runtimevar_name = "type_pointer" SWIG_TYPE_TABLE_NAME; static swig_module_info * SWIG_Chicken_GetModule(void *SWIGUNUSEDPARM(clientdata)) { swig_module_info *ret = 0; C_word sym; /* lookup the type pointer... it is stored in its own symbol table */ C_SYMBOL_TABLE *stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); if (stable != NULL) { sym = SWIG_Chicken_LookupSymbol(chicken_runtimevar_name, stable); if (C_truep(sym) && C_swig_is_ptr(sym)) { ret = (swig_module_info *) C_block_item(sym, 0); } } return ret; } static void SWIG_Chicken_SetModule(swig_module_info *module) { C_word *a; C_SYMBOL_TABLE *stable; C_word sym; C_word pointer; static C_word *space = 0; /* type pointer is stored in its own symbol table */ stable = C_find_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION); if (stable == NULL) { stable = C_new_symbol_table("swig_runtime_data" SWIG_RUNTIME_VERSION, 16); } if (!space) { space = (C_word *) C_malloc((C_SIZEOF_POINTER + C_SIZEOF_INTERNED_SYMBOL(C_strlen(chicken_runtimevar_name))) * sizeof(C_word)); } a = space; pointer = C_mpointer(&a, (void *) module); sym = C_intern_in(&a, C_strlen(chicken_runtimevar_name), chicken_runtimevar_name, stable); C_set_block_item(sym, 0, pointer); } static C_word SWIG_Chicken_MultiResultBuild(C_word num, C_word closure, C_word lst) { C_word cont = C_block_item(closure,1); C_word obj = C_block_item(closure,2); C_word func; SWIG_Chicken_FindCreateProxy(func,obj); if (C_swig_is_closurep(func)) { ((C_proc4)(void *)C_block_item(func, 0))(4,func,cont,obj,lst); } else { C_word *a = C_alloc(C_SIZEOF_PAIR); C_kontinue(cont,C_pair(&a,obj,lst)); } return C_SCHEME_UNDEFINED; /* never reached */ } static C_word SWIG_Chicken_ApplyResults(C_word num, C_word closure, C_word result) { C_apply_values(3,C_SCHEME_UNDEFINED,C_block_item(closure,1),result); return C_SCHEME_UNDEFINED; /* never reached */ } #ifdef __cplusplus } #endif swig-3.0.12/Lib/chicken/chickenkw.swg0000664000175000017500000000124613042756442017242 0ustar williamwilliam#ifndef CHICKEN_CHICKENKW_SWG_ #define CHICKEN_CHICKENKW_SWG_ /* Warnings for certain CHICKEN keywords. From Section 7.1.1 of Revised^5 Report on the Algorithmic Language Scheme */ #define CHICKENKW(x) %namewarn("314: '" #x "' is a R^5RS syntatic keyword") #x CHICKENKW(else); CHICKENKW(=>); CHICKENKW(define); CHICKENKW(unquote); CHICKENKW(unquote-splicing); CHICKENKW(quote); CHICKENKW(lambda); CHICKENKW(if); CHICKENKW(set!); CHICKENKW(begin); CHICKENKW(cond); CHICKENKW(and); CHICKENKW(or); CHICKENKW(case); CHICKENKW(let); CHICKENKW(let*); CHICKENKW(letrec); CHICKENKW(do); CHICKENKW(delay); CHICKENKW(quasiquote); #undef CHICKENKW #endif //CHICKEN_CHICKENKW_SWG_ swig-3.0.12/Lib/chicken/chicken.swg0000664000175000017500000005476513042756442016716 0ustar williamwilliam/* ----------------------------------------------------------------------------- * chicken.swg * * CHICKEN configuration module. * ----------------------------------------------------------------------------- */ /* chicken.h has to appear first. */ %insert(runtime) %{ #include #include %} %insert(runtime) "swigrun.swg"; // Common C API type-checking code %insert(runtime) "chickenrun.swg"; // CHICKEN run-time code /* ----------------------------------------------------------------------------- * standard typemaps * ----------------------------------------------------------------------------- */ /* CHICKEN: C ---------- fixnum: int, short, unsigned int, unsigned short, unsigned char, signed char char: char bool: bool flonum: float, double, long, long long, unsigned long, unsigned long long */ /* --- Primitive types --- */ %define SIMPLE_TYPEMAP(type_, from_scheme, to_scheme, checker, convtype, storage_) %typemap(in) type_ %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } $1 = ($1_ltype) from_scheme ($input); %} /* Const primitive references. Passed by value */ %typemap(in) const type_ & ($*1_ltype temp) %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'type_'"); } temp = ($*1_ltype) from_scheme ($input); $1 = &temp; %} /* --- Variable input --- */ %typemap(varin) type_ %{ if (!checker ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use '$1_ltype' for variable '$name' of type 'type_'"); } $1 = ($1_ltype) from_scheme ($input); %} #if "storage_" == "0" %typemap(out) type_ %{ $result = to_scheme (convtype ($1)); %} /* References to primitive types. Return by value */ %typemap(out) const type_ & %{ $result = to_scheme (convtype (*$1)); %} /* --- Variable output --- */ %typemap(varout) type_ %{ $result = to_scheme (convtype ($varname)); %} %typemap(throws) type_ %{ SWIG_Chicken_ThrowException(to_scheme ( convtype ($1))); %} #else %typemap(out) type_ %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype ($1)); } %} /* References to primitive types. Return by value */ %typemap(out) const type_ & %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype (*$1)); } %} /* --- Variable output --- */ %typemap(varout) type_ %{ { C_word *space = C_alloc(storage_); $result = to_scheme (&space, convtype ($varname)); } %} %typemap(throws) type_ %{ { C_word *space = C_alloc(storage_); SWIG_Chicken_ThrowException(to_scheme (&space, convtype ($1))); } %} #endif /* --- Constants --- */ %typemap(constcode) type_ "static const $1_type $result = $value;" %enddef SIMPLE_TYPEMAP(int, C_num_to_int, C_fix, C_swig_is_number, (int), 0); //SIMPLE_TYPEMAP(enum SWIGTYPE, C_unfix, C_fix, C_swig_is_fixnum, (int), 0); SIMPLE_TYPEMAP(short, C_num_to_int, C_fix, C_swig_is_number, (int), 0); SIMPLE_TYPEMAP(long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(long long, C_num_to_long, C_long_to_num, C_swig_is_long, (long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned int, C_num_to_unsigned_int, C_unsigned_int_to_num, C_swig_is_number, (unsigned int), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned short, C_num_to_unsigned_int, C_fix, C_swig_is_number, (unsigned int), 0); SIMPLE_TYPEMAP(unsigned long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned long long, C_num_to_unsigned_long, C_unsigned_long_to_num, C_swig_is_long, (unsigned long), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(unsigned char, C_character_code, C_make_character, C_swig_is_char, (unsigned int), 0); SIMPLE_TYPEMAP(signed char, C_character_code, C_make_character, C_swig_is_char, (int), 0); SIMPLE_TYPEMAP(char, C_character_code, C_make_character, C_swig_is_char, (char), 0); SIMPLE_TYPEMAP(bool, C_truep, C_mk_bool, C_swig_is_bool, (bool), 0); SIMPLE_TYPEMAP(float, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); SIMPLE_TYPEMAP(double, C_c_double, C_flonum, C_swig_is_number, (double), C_SIZEOF_FLONUM); /* enum SWIGTYPE */ %apply int { enum SWIGTYPE }; %apply const int& { const enum SWIGTYPE& }; %apply const int& { const enum SWIGTYPE&& }; %typemap(varin) enum SWIGTYPE { if (!C_swig_is_fixnum($input) && sizeof(int) != sizeof($1)) { swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "enum variable '$name' can not be set"); } *((int *)(void *)&$1) = C_unfix($input); } /* --- Input arguments --- */ /* Strings */ %typemap(in) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'char *'"); } $1 = ($ltype) SWIG_MakeString ($input); } } %typemap(freearg) char * "if ($1 != NULL) { free ($1); }" /* Pointers, references, and arrays */ %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, $disown); } %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE *DISOWN { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, $argnum, SWIG_POINTER_DISOWN); } /* Void pointer. Accepts any kind of pointer */ %typemap(in) void * { $1 = ($1_ltype)SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE * { $1 = ($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, SWIG_POINTER_DISOWN); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [] { SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "Type error"); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj($varname, $descriptor, 0); } %typemap(varout) SWIGTYPE & { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); $result = SWIG_NewPointerObj((void *) &$varname, $1_descriptor, 0); } /* special typemaps for class pointers */ %typemap(in) SWIGTYPE (CLASS::*) { char err_msg[256]; if (C_swig_is_pair($input)) { /* try and convert pointer object */ void *result; if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { C_word ptr = C_block_item($input,0); if (C_swig_is_string(ptr)) { SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", $argnum, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } %typemap(out) SWIGTYPE (CLASS::*) { size_t ptr_size = sizeof($type); C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); char *temp = (char *)malloc(2*ptr_size); C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); SWIG_PackData(temp, (void *) &$1, ptr_size); $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); free(temp); } %typemap(varin) SWIGTYPE (CLASS::*) { char err_msg[256]; if (C_swig_is_pair($input)) { /* try and convert pointer object */ void *result; if (!SWIG_ConvertPtr(C_block_item($input,1), &result, $descriptor, 0)) { C_word ptr = C_block_item($input,0); if (C_swig_is_string(ptr)) { SWIG_UnpackData(C_c_string(ptr), (void *) &$1, sizeof($type)); } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } else { snprintf(err_msg, sizeof(err_msg), "Type error in argument #%i: expected %s", 1, ($descriptor->str ? $descriptor->str : $descriptor->name)); SWIG_Chicken_Barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, err_msg); } } %typemap(varout) SWIGTYPE (CLASS::*) { size_t ptr_size = sizeof($type); C_word *known_space = C_alloc(C_SIZEOF_PAIR + C_SIZEOF_STRING(2*ptr_size) + C_SIZEOF_SWIG_POINTER); char *temp = (char *)malloc(2*ptr_size); C_word ptr = SWIG_NewPointerObj((void *) known_space, $descriptor, 0); SWIG_PackData(temp, (void *) &$varname, ptr_size); $result = C_pair(&known_space, C_string(&known_space, 2*ptr_size, temp), ptr); free(temp); } /* Pass-by-value */ %typemap(in,closcode="(slot-ref $input 'swig-this)") SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin,closcode="(slot-ref $input 'swig-this)") SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype)SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = new $1_ltype((const $1_ltype &) $1); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = new $1_ltype((const $1_ltype&) $1); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* --- Output values --- */ /* Strings */ %typemap(out) char * { char *s = (char*) $1; if ($1 == NULL) { $result = C_SCHEME_FALSE; } else { int string_len = strlen ((char *) ($1)); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, s); } } %typemap(varout) char * { char *s = (char*) $varname; if ($varname == NULL) { $result = C_SCHEME_FALSE; } else { int string_len = strlen ($varname); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, s); } } %typemap(throws) char * { if ($1 == NULL) { SWIG_Chicken_ThrowException(C_SCHEME_FALSE); } else { int string_len = strlen($1); C_word *string_space = C_alloc(C_SIZEOF_STRING(string_len)); SWIG_Chicken_ThrowException(C_string(&string_space, string_len, (char *) $1)); } } /* Void */ %typemap(out) void %{ $result = C_SCHEME_UNDEFINED; %} /* Special typemap for character array return values */ %typemap(out) char [ANY], const char [ANY] %{ if ($1 == NULL) { $result = C_SCHEME_FALSE; } else { const int string_len = strlen ($1); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, $1); } %} /* Primitive types--return by value */ /* --- Variable input --- */ /* A string */ #ifdef __cplusplus %typemap(varin) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); if ($1) delete [] $1; $1 = ($type) new char[len+1]; strncpy((char*)$1, temp, len); ((char*)$1) [len] = 0; } } %typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); $1 = ($type) new char[len+1]; strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } #else %typemap(varin) char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); if ($1) free((char*) $1); $1 = ($type) malloc(len+1); strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } %typemap(varin,warning="451:Setting const char * variable may leak memory") const char * { if ($input == C_SCHEME_FALSE) { $1 = NULL; } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); int len = C_header_size ($input); $1 = ($type) malloc(len+1); strncpy((char*)$1,temp,len); ((char*)$1) [len] = 0; } } #endif %typemap(varin) char [] { swig_barf(SWIG_BARF1_BAD_ARGUMENT_TYPE, "C/C++ variable '$name' is read-only"); } /* Special case for string array variables */ %typemap(varin) char [ANY] { if ($input == C_SCHEME_FALSE) { memset($1,0,$1_dim0*sizeof(char)); } else if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "C variable '$name ($1_ltype)'"); } else { char *temp = C_c_string ($input); strncpy($1,temp,$1_dim0*sizeof(char)); } } /* --- Variable output --- */ /* Void */ %typemap(varout) void "$result = C_SCHEME_UNDEFINED;"; /* Special typemap for character array return values */ %typemap(varout) char [ANY], const char [ANY] %{ if ($varname == NULL) { $result = C_SCHEME_FALSE; } else { const int string_len = strlen ($varname); C_word *string_space = C_alloc (C_SIZEOF_STRING (string_len)); $result = C_string (&string_space, string_len, (char *) $varname); } %} /* --- Constants --- */ %typemap(constcode) char * "static const char *$result = $value;" %typemap(constcode) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "static const void *$result = (void*) $value;" /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { if ($input == C_SCHEME_FALSE) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Cannot use a null/#f string for a char*, int arguments"); } else if (C_swig_is_string ($input)) { $1 = ($1_ltype) C_c_string ($input); $2 = ($2_ltype) C_header_size ($input); } else { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not of type 'string'"); } } /* ------------------------------------------------------------ * CHICKEN types * ------------------------------------------------------------ */ %typemap(in) C_word "$1 = $input;"; %typemap(out) C_word "$result = $1;"; /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) bool, const bool & { $1 = C_swig_is_bool ($input); } %typecheck(SWIG_TYPECHECK_INTEGER) int, short, unsigned int, unsigned short, signed char, unsigned char, const int &, const short &, const unsigned int &, const unsigned short &, enum SWIGTYPE { $1 = C_swig_is_fixnum ($input); } %typecheck(SWIG_TYPECHECK_INTEGER) long, unsigned long, long long, unsigned long long, const long &, const unsigned long &, const long long &, const unsigned long long & { $1 = (C_swig_is_bool ($input) || C_swig_is_fixnum ($input) || C_swig_is_flonum ($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = C_swig_is_flonum ($input); } %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = C_swig_is_string ($input); } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = C_swig_is_string ($input); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { void *ptr; $1 = !SWIG_ConvertPtr($input, &ptr, $1_descriptor, 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; $1 = !SWIG_ConvertPtr($input, &ptr, 0, 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE & { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $descriptor, 0)) { /* error */ $1 = 0; } else { $1 = (ptr != 0); } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE && { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $descriptor, 0)) { /* error */ $1 = 0; } else { $1 = (ptr != 0); } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr = 0; if (SWIG_ConvertPtr($input, &ptr, $&descriptor, 0)) { /* error */ $1 = 0; } else { $1 = (ptr != 0); } } /* ------------------------------------------------------------ * Exception handling * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * --- Exception handling --- * ------------------------------------------------------------ */ %typemap(throws) SWIGTYPE { $<ype temp = new $ltype($1); C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj(temp, $&descriptor,1); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE * { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE [ANY] { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *) $1, $descriptor, 0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE & { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); SWIG_Chicken_ThrowException(ptr); } %typemap(throws) SWIGTYPE && { C_word *known_space = C_alloc(C_SIZEOF_SWIG_POINTER); C_word ptr = SWIG_NewPointerObj((void *)&($1),$descriptor,0); SWIG_Chicken_ThrowException(ptr); } /* ------------------------------------------------------------ * ANSI C typemaps * ------------------------------------------------------------ */ %apply unsigned long { size_t }; /* ------------------------------------------------------------ * Various * ------------------------------------------------------------ */ /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__iadd__) *::operator+=; %rename(__isub__) *::operator-=; %rename(__imul__) *::operator*=; %rename(__idiv__) *::operator/=; %rename(__imod__) *::operator%=; %rename(__ilshift__) *::operator<<=; %rename(__irshift__) *::operator>>=; %rename(__iand__) *::operator&=; %rename(__ior__) *::operator|=; %rename(__ixor__) *::operator^=; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; /* Special cases */ %rename(__call__) *::operator(); #endif /* Warnings for certain CHICKEN keywords */ %include /* TinyCLOS <--> Low-level CHICKEN */ %typemap("clos_in") SIMPLE_CLOS_OBJECT * "(slot-ref $input (quote this))" %typemap("clos_out") SIMPLE_CLOS_OBJECT * "(make $class (quote this) $1)" %insert(header) %{ #ifdef __cplusplus extern "C" { #endif /* Chicken initialization function */ SWIGEXPORT void SWIG_init(C_word, C_word, C_word) C_noret; #ifdef __cplusplus } #endif %} %insert(closprefix) "swigclosprefix.scm" %insert(init) "swiginit.swg" %insert(init) %{ /* CHICKEN initialization function */ #ifdef __cplusplus extern "C" { #endif SWIGEXPORT void SWIG_init(C_word argc, C_word closure, C_word continuation) { int i; C_word sym; C_word tmp; C_word *a; C_word ret; C_word *return_vec; SWIG_InitializeModule(0); SWIG_PropagateClientData(); ret = C_SCHEME_TRUE; #if $veclength return_vec = C_alloc(C_SIZEOF_VECTOR($veclength)); ret = (C_word) return_vec; *(return_vec++) = C_VECTOR_TYPE | $veclength; #endif a = C_alloc(2*$nummethods$symsize); %} swig-3.0.12/Lib/chicken/tinyclos-multi-generic.patch0000664000175000017500000001311313042756442022175 0ustar williamwilliam# This patch is against chicken 1.92, but it should work just fine # with older versions of chicken. It adds support for mulit-argument # generics, that is, generics now correctly handle adding methods # with different lengths of specializer lists # This patch has been committed into the CHICKEN darcs repository, # so chicken versions above 1.92 work fine. # Comments, bugs, suggestions send to chicken-users@nongnu.org # Patch written by John Lenz --- tinyclos.scm.old 2005-04-05 01:13:56.000000000 -0500 +++ tinyclos.scm 2005-04-11 16:37:23.746181489 -0500 @@ -37,8 +37,10 @@ (include "parameters") +(cond-expand [(not chicken-compile-shared) (declare (unit tinyclos))] + [else] ) + (declare - (unit tinyclos) (uses extras) (usual-integrations) (fixnum) @@ -234,7 +236,10 @@ y = C_block_item(y, 1); } } - return(C_block_item(v, i + 1)); + if (x == C_SCHEME_END_OF_LIST && y == C_SCHEME_END_OF_LIST) + return(C_block_item(v, i + 1)); + else + goto mismatch; } else if(free_index == -1) free_index = i; mismatch: @@ -438,7 +443,7 @@ (define hash-arg-list (foreign-lambda* unsigned-int ((scheme-object args) (scheme-object svector)) " C_word tag, h, x; - int n, i, j; + int n, i, j, len = 0; for(i = 0; args != C_SCHEME_END_OF_LIST; args = C_block_item(args, 1)) { x = C_block_item(args, 0); if(C_immediatep(x)) { @@ -481,8 +486,9 @@ default: i += 255; } } + ++len; } - return(i & (C_METHOD_CACHE_SIZE - 1));") ) + return((i + len) & (C_METHOD_CACHE_SIZE - 1));") ) ; @@ -868,13 +874,27 @@ (##tinyclos#slot-set! generic 'methods - (cons method - (filter-in - (lambda (m) - (let ([ms1 (method-specializers m)] - [ms2 (method-specializers method)] ) - (not (every2 (lambda (x y) (eq? x y)) ms1 ms2) ) ) ) - (##tinyclos#slot-ref generic 'methods)))) + (let* ([ms1 (method-specializers method)] + [l1 (length ms1)] ) + (let filter-in-method ([methods (##tinyclos#slot-ref generic 'methods)]) + (if (null? methods) + (list method) + (let* ([mm (##sys#slot methods 0)] + [ms2 (method-specializers mm)] + [l2 (length ms2)]) + (cond ((> l1 l2) + (cons mm (filter-in-method (##sys#slot methods 1)))) + ((< l1 l2) + (cons method methods)) + (else + (let check-method ([ms1 ms1] + [ms2 ms2]) + (cond ((and (null? ms1) (null? ms2)) + (cons method (##sys#slot methods 1))) ;; skip the method already in the generic + ((eq? (##sys#slot ms1 0) (##sys#slot ms2 0)) + (check-method (##sys#slot ms1 1) (##sys#slot ms2 1))) + (else + (cons mm (filter-in-method (##sys#slot methods 1))))))))))))) (if (memq generic generic-invocation-generics) (set! method-cache-tag (vector)) (%entity-cache-set! generic #f) ) @@ -925,11 +945,13 @@ (memq (car args) generic-invocation-generics)) (let ([proc (method-procedure + ; select the first method of one argument (let lp ([lis (generic-methods generic)]) - (let ([tail (##sys#slot lis 1)]) - (if (null? tail) - (##sys#slot lis 0) - (lp tail)) ) ) ) ] ) + (if (null? lis) + (##sys#error "Unable to find original compute-apply-generic") + (if (= (length (method-specializers (##sys#slot lis 0))) 1) + (##sys#slot lis 0) + (lp (##sys#slot lis 1)))))) ] ) (lambda (args) (apply proc #f args)) ) (let ([x (compute-apply-methods generic)] [y ((compute-methods generic) args)] ) @@ -946,9 +968,13 @@ (lambda (args) (let ([applicable (filter-in (lambda (method) - (every2 applicable? - (method-specializers method) - args)) + (let check-applicable ([list1 (method-specializers method)] + [list2 args]) + (cond ((null? list1) #t) + ((null? list2) #f) + (else + (and (applicable? (##sys#slot list1 0) (##sys#slot list2 0)) + (check-applicable (##sys#slot list1 1) (##sys#slot list2 1))))))) (generic-methods generic) ) ] ) (if (or (null? applicable) (null? (##sys#slot applicable 1))) applicable @@ -975,8 +1001,10 @@ [else (cond ((and (null? specls1) (null? specls2)) (##sys#error "two methods are equally specific" generic)) - ((or (null? specls1) (null? specls2)) - (##sys#error "two methods have different number of specializers" generic)) + ;((or (null? specls1) (null? specls2)) + ; (##sys#error "two methods have different number of specializers" generic)) + ((null? specls1) #f) + ((null? specls2) #t) ((null? args) (##sys#error "fewer arguments than specializers" generic)) (else @@ -1210,7 +1238,7 @@ (define (make-primitive-class "structure")) (define (make-primitive-class "procedure" )) (define (make-primitive-class "end-of-file")) -(define (make-primitive-class "environment" )) ; (Benedikt insisted on this) +(define (make-primitive-class "environment" )) (define (make-primitive-class "hash-table" )) (define (make-primitive-class "promise" )) (define (make-primitive-class "queue" )) swig-3.0.12/Lib/chicken/std_string.i0000664000175000017500000000452713042756442017111 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; %insert(closprefix) %{ (declare (hide )) %} %nodefault string; %rename("std-string") string; class string { public: ~string() {} }; %extend string { char *str; } %{ #define std_string_str_get(s) ((char *)((s)->c_str())) #define std_string_str_set(s,v) (s->assign((char *)(v))) %} %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string (char * tempptr) { if ($input == C_SCHEME_FALSE) { $1.resize(0); } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } } %typemap(in) const string& ($*1_ltype temp, char *tempptr) { if ($input == C_SCHEME_FALSE) { temp.resize(0); $1 = &temp; } else { if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); temp.assign(tempptr); if (tempptr) SWIG_free(tempptr); $1 = &temp; } } %typemap(out) string { int size = $1.size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1.c_str()); } %typemap(out) const string& { int size = $1->size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1->c_str()); } %typemap(varin) string { if ($input == C_SCHEME_FALSE) { $1.resize(0); } else { char *tempptr; if (!C_swig_is_string ($input)) { swig_barf (SWIG_BARF1_BAD_ARGUMENT_TYPE, "Argument #$argnum is not a string"); } tempptr = SWIG_MakeString($input); $1.assign(tempptr); if (tempptr) SWIG_free(tempptr); } } %typemap(varout) string { int size = $1.size(); C_word *space = C_alloc (C_SIZEOF_STRING (size)); $result = C_string (&space, size, (char *) $1.c_str()); } } swig-3.0.12/Lib/chicken/swigclosprefix.scm0000664000175000017500000000221613042756442020324 0ustar williamwilliam(declare (hide swig-initialize)) (define (swig-initialize obj initargs create) (slot-set! obj 'swig-this (if (memq 'swig-this initargs) (cadr initargs) (let ((ret (apply create initargs))) (if (instance? ret) (slot-ref ret 'swig-this) ret))))) (define-class () (void)) (define-method (compute-getter-and-setter (class ) slot allocator) (if (not (memq ':swig-virtual slot)) (call-next-method) (let ((getter (let search-get ((lst slot)) (if (null? lst) #f (if (eq? (car lst) ':swig-get) (cadr lst) (search-get (cdr lst)))))) (setter (let search-set ((lst slot)) (if (null? lst) #f (if (eq? (car lst) ':swig-set) (cadr lst) (search-set (cdr lst))))))) (values (lambda (o) (getter (slot-ref o 'swig-this))) (lambda (o new) (setter (slot-ref o 'swig-this) new) new))))) swig-3.0.12/Lib/carrays.i0000664000175000017500000000512613042756442014765 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.i * * SWIG library file containing macros that can be used to manipulate simple * pointers as arrays. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(int nelements) { %} #ifdef __cplusplus %{ return new TYPE[nelements](); %} #else %{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} #endif %{} static void delete_##NAME(TYPE *ary) { %} #ifdef __cplusplus %{ delete [] ary; %} #else %{ free(ary); %} #endif %{} static TYPE NAME##_getitem(TYPE *ary, int index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, int index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(int nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, int index); void NAME##_setitem(TYPE *ary, int index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * cast(); * static NAME *frompointer(TYPE *t); * } * * ----------------------------------------------------------------------------- */ %define %array_class(TYPE,NAME) %{ typedef TYPE NAME; %} typedef struct { /* Put language specific enhancements here */ } NAME; %extend NAME { #ifdef __cplusplus NAME(int nelements) { return new TYPE[nelements](); } ~NAME() { delete [] self; } #else NAME(int nelements) { return (TYPE *) calloc(nelements,sizeof(TYPE)); } ~NAME() { free(self); } #endif TYPE getitem(int index) { return self[index]; } void setitem(int index, TYPE value) { self[index] = value; } TYPE * cast() { return self; } static NAME *frompointer(TYPE *t) { return (NAME *) t; } }; %types(NAME = TYPE); %enddef swig-3.0.12/Lib/swigarch.i0000664000175000017500000000305413042756442015126 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigarch.i * * SWIG library file for 32bit/64bit code specialization and checking. * * Use only in extreme cases, when no arch. independent code can be * generated * * To activate architecture specific code, use * * swig -DSWIGWORDSIZE32 * * or * * swig -DSWIGWORDSIZE64 * * Note that extra checking code will be added to the wrapped code, * which will prevent the compilation in a different architecture. * * If you don't specify the SWIGWORDSIZE (the default case), swig will * generate architecture independent and/or 32bits code, with no extra * checking code added. * ----------------------------------------------------------------------------- */ #if !defined(SWIGWORDSIZE32) && !defined(SWIGWORDSIZE64) # if (__WORDSIZE == 32) # define SWIGWORDSIZE32 # endif #endif #if !defined(SWIGWORDSIZE64) && !defined(SWIGWORDSIZE32) # if defined(__x86_64) || defined(__x86_64__) || (__WORDSIZE == 64) # define SWIGWORDSIZE64 # endif #endif #ifdef SWIGWORDSIZE32 %{ #define SWIGWORDSIZE32 #ifndef LONG_MAX #include #endif #if (__WORDSIZE == 64) || (LONG_MAX != INT_MAX) # error "SWIG wrapped code invalid in 64 bit architecture, regenerate code using -DSWIGWORDSIZE64" #endif %} #endif #ifdef SWIGWORDSIZE64 %{ #define SWIGWORDSIZE64 #ifndef LONG_MAX #include #endif #if (__WORDSIZE == 32) || (LONG_MAX == INT_MAX) # error "SWIG wrapped code invalid in 32 bit architecture, regenerate code using -DSWIGWORDSIZE32" #endif %} #endif swig-3.0.12/Lib/allegrocl/0000775000175000017500000000000013042756442015107 5ustar williamwilliamswig-3.0.12/Lib/allegrocl/allegrocl.swg0000664000175000017500000005750113042756442017605 0ustar williamwilliam/* Define a C preprocessor symbol that can be used in interface files to distinguish between the SWIG language modules. */ #define SWIG_ALLEGRO_CL #define %ffargs(...) %feature("ffargs", "1", ##__VA_ARGS__) %ffargs(strings_convert="t"); /* typemaps for argument and result type conversions. */ %typemap(lin,numinputs=1) SWIGTYPE "(cl::let (($out $in))\n $body)"; %typemap(lout) bool, char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE "(cl::setq ACL_ffresult $body)"; %typemap(lout) void "$body"; #ifdef __cplusplus %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE && %{ (cl:let* ((address $body) (new-inst (cl:make-instance '$lclass :foreign-address address))) (cl:when (cl:and $owner (cl:not (cl:zerop address))) (excl:schedule-finalization new-inst #'$ldestructor)) (cl:setq ACL_ffresult new-inst)) %} %typemap(lout) SWIGTYPE "(cl::let* ((address $body)\n (new-inst (cl::make-instance '$lclass :foreign-address address)))\n (cl::unless (cl::zerop address)\n (excl:schedule-finalization new-inst #'$ldestructor))\n (cl::setq ACL_ffresult new-inst))"; #else %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE %{ (cl:let* ((address $body) (new-inst (cl:make-instance '$lclass :foreign-address address))) (cl:setq ACL_ffresult new-inst)) %} #endif %typemap(lisptype) bool, const bool "cl:boolean"; %typemap(lisptype) char, const char "cl:character"; %typemap(lisptype) unsigned char, const unsigned char "cl:integer"; %typemap(lisptype) signed char, const signed char "cl:integer"; %typemap(ffitype) bool, const bool ":int"; %typemap(ffitype) char, const char, signed char, const signed char ":char"; %typemap(ffitype) unsigned char, const unsigned char ":unsigned-char"; %typemap(ffitype) short, const short, signed short, const signed short ":short"; %typemap(ffitype) unsigned short, const unsigned short ":unsigned-short"; %typemap(ffitype) int, const int, signed int, const signed int ":int"; %typemap(ffitype) unsigned int, const unsigned int ":unsigned-int"; %typemap(ffitype) long, const long, signed long, const signed long ":long"; %typemap(ffitype) unsigned long, const unsigned long ":unsigned-long"; %typemap(ffitype) float, const float ":float"; %typemap(ffitype) double, const double ":double"; %typemap(ffitype) char *, const char *, signed char *, const signed char *, signed char &, const signed char & "(* :char)"; %typemap(ffitype) unsigned char *, const unsigned char *, unsigned char &, const unsigned char & "(* :unsigned-char)"; %typemap(ffitype) short *, const short *, short &, const short & "(* :short)"; %typemap(ffitype) unsigned short *, const unsigned short *, unsigned short &, const unsigned short & "(* :unsigned-short)"; %typemap(ffitype) int *, const int *, int &, const int & "(* :int)"; %typemap(ffitype) unsigned int *, const unsigned int *, unsigned int &, const unsigned int & "(* :unsigned-int)"; %typemap(ffitype) void * "(* :void)"; %typemap(ffitype) void ":void"; %typemap(ffitype) enum SWIGTYPE ":int"; %typemap(ffitype) SWIGTYPE & "(* :void)"; %typemap(ffitype) SWIGTYPE && "(* :void)"; /* const typemaps idea: marshall all primitive c types to their respective lisp types to maintain const corretness. For pointers/references, all bets are off if you try to modify them. idea: add a constant-p slot to the base foreign-pointer class. For constant pointer/references check this value when setting (around method?) and error if a setf operation is performed on the address of this object. */ /* %exception %{ try { $action } catch (...) { return $null; } %} */ // %typemap(throws) SWIGTYPE { // (void)$1; // SWIG_fail; // } %typemap(ctype) bool, const bool "int"; %typemap(ctype) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE &&, const SWIGTYPE "$1_ltype"; %typemap(ctype) SWIGTYPE "$&1_type"; %typemap(in) bool "$1 = (bool)$input;"; %typemap(in) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, void, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$1 = $input;"; %typemap(in) SWIGTYPE "$1 = *$input;"; /* We don't need to do any actual C-side typechecking, but need to use the precedence values to choose which overloaded function interfaces to generate when conflicts arise. */ /* predefined precedence values Symbolic Name Precedence Value ------------------------------ ------------------ SWIG_TYPECHECK_POINTER 0 SWIG_TYPECHECK_VOIDPTR 10 SWIG_TYPECHECK_BOOL 15 SWIG_TYPECHECK_UINT8 20 SWIG_TYPECHECK_INT8 25 SWIG_TYPECHECK_UINT16 30 SWIG_TYPECHECK_INT16 35 SWIG_TYPECHECK_UINT32 40 SWIG_TYPECHECK_INT32 45 SWIG_TYPECHECK_UINT64 50 SWIG_TYPECHECK_INT64 55 SWIG_TYPECHECK_UINT128 60 SWIG_TYPECHECK_INT128 65 SWIG_TYPECHECK_INTEGER 70 SWIG_TYPECHECK_FLOAT 80 SWIG_TYPECHECK_DOUBLE 90 SWIG_TYPECHECK_COMPLEX 100 SWIG_TYPECHECK_UNICHAR 110 SWIG_TYPECHECK_UNISTRING 120 SWIG_TYPECHECK_CHAR 130 SWIG_TYPECHECK_STRING 140 SWIG_TYPECHECK_BOOL_ARRAY 1015 SWIG_TYPECHECK_INT8_ARRAY 1025 SWIG_TYPECHECK_INT16_ARRAY 1035 SWIG_TYPECHECK_INT32_ARRAY 1045 SWIG_TYPECHECK_INT64_ARRAY 1055 SWIG_TYPECHECK_INT128_ARRAY 1065 SWIG_TYPECHECK_FLOAT_ARRAY 1080 SWIG_TYPECHECK_DOUBLE_ARRAY 1090 SWIG_TYPECHECK_CHAR_ARRAY 1130 SWIG_TYPECHECK_STRING_ARRAY 1140 */ %typecheck(SWIG_TYPECHECK_BOOL) bool { $1 = 1; }; %typecheck(SWIG_TYPECHECK_CHAR) char { $1 = 1; }; %typecheck(SWIG_TYPECHECK_FLOAT) float { $1 = 1; }; %typecheck(SWIG_TYPECHECK_DOUBLE) double { $1 = 1; }; %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = 1; }; %typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE { $1 = 1; }; %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE[], SWIGTYPE[ANY], SWIGTYPE { $1 = 1; }; /* This maps C/C++ types to Lisp classes for overload dispatch */ %typemap(lispclass) bool "t"; %typemap(lispclass) char "cl:character"; %typemap(lispclass) unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, enum SWIGTYPE "cl:integer"; %typemap(lispclass) float "cl:single-float"; %typemap(lispclass) double "cl:double-float"; %typemap(lispclass) char * "cl:string"; %typemap(out) void ""; %typemap(out) bool "$result = (int)$1;"; %typemap(out) char, unsigned char, signed char, short, signed short, unsigned short, int, signed int, unsigned int, long, signed long, unsigned long, float, double, long double, char *, void *, enum SWIGTYPE, SWIGTYPE *, SWIGTYPE[ANY], SWIGTYPE &, SWIGTYPE && "$result = $1;"; #ifdef __cplusplus %typemap(out) SWIGTYPE "$result = new $1_ltype($1);"; #else %typemap(out) SWIGTYPE { $result = ($&1_ltype) malloc(sizeof($1_type)); memmove($result, &$1, sizeof($1_type)); } #endif ////////////////////////////////////////////////////////////// // UCS-2 string conversion // should this be SWIG_TYPECHECK_CHAR? %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; }; %typemap(in) wchar_t "$1 = $input;"; %typemap(lin,numinputs=1) wchar_t "(cl::let (($out (cl:char-code $in)))\n $body)"; %typemap(lin,numinputs=1) wchar_t * "(excl:with-native-string ($out $in :external-format #+little-endian :fat-le #-little-endian :fat)\n $body)" %typemap(out) wchar_t "$result = $1;"; %typemap(lout) wchar_t "(cl::setq ACL_ffresult (cl::code-char $body))"; %typemap(lout) wchar_t * "(cl::setq ACL_ffresult (excl:native-to-string $body :external-format #+little-endian :fat-le #-little-endian :fat))"; %typemap(ffitype) wchar_t ":unsigned-short"; %typemap(lisptype) wchar_t ""; %typemap(ctype) wchar_t "wchar_t"; %typemap(lispclass) wchar_t "cl:character"; %typemap(lispclass) wchar_t * "cl:string"; ////////////////////////////////////////////////////////////// /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* name conversion for overloaded operators. */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-() const; %rename(__neg__) *::operator-(); %rename(__mul__) *::operator*; %rename(__deref__) *::operator*(); %rename(__deref__) *::operator*() const; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__logxor__) *::operator^; %rename(__logand__) *::operator&; %rename(__logior__) *::operator|; %rename(__lognot__) *::operator~(); %rename(__lognot__) *::operator~() const; %rename(__not__) *::operator!(); %rename(__not__) *::operator!() const; %rename(__assign__) *::operator=; %rename(__add_assign__) *::operator+=; %rename(__sub_assign__) *::operator-=; %rename(__mul_assign__) *::operator*=; %rename(__div_assign__) *::operator/=; %rename(__mod_assign__) *::operator%=; %rename(__logxor_assign__) *::operator^=; %rename(__logand_assign__) *::operator&=; %rename(__logior_assign__) *::operator|=; %rename(__lshift__) *::operator<<; %rename(__lshift_assign__) *::operator<<=; %rename(__rshift__) *::operator>>; %rename(__rshift_assign__) *::operator>>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__lt__) *::operator<; %rename(__gt__) *::operator>; %rename(__lte__) *::operator<=; %rename(__gte__) *::operator>=; %rename(__and__) *::operator&&; %rename(__or__) *::operator||; %rename(__preincr__) *::operator++(); %rename(__postincr__) *::operator++(int); %rename(__predecr__) *::operator--(); %rename(__postdecr__) *::operator--(int); %rename(__comma__) *::operator,(); %rename(__comma__) *::operator,() const; %rename(__member_ref__) *::operator->; %rename(__member_func_ref__) *::operator->*; %rename(__funcall__) *::operator(); %rename(__aref__) *::operator[]; %rename(__bool__) *::operator bool(); %rename(__bool__) *::operator bool() const; #endif %insert("lisphead") %{ (eval-when (:compile-toplevel :load-toplevel :execute) ;; avoid compiling ef-templates at runtime (excl:find-external-format :fat) (excl:find-external-format :fat-le) ;;; You can define your own identifier converter if you want. ;;; Use the -identifier-converter command line argument to ;;; specify its name. (eval-when (:compile-toplevel :load-toplevel :execute) (cl::defparameter *swig-export-list* nil)) (cl::defconstant *void* :..void..) ;; parsers to aid in finding SWIG definitions in files. (cl::defun scm-p1 (form) (let* ((info (cl::second form)) (id (car info)) (id-args (if (eq (cl::car form) 'swig-dispatcher) (cl::cdr info) (cl::cddr info)))) (cl::apply *swig-identifier-converter* id (cl::progn (cl::when (cl::eq (cl::car form) 'swig-dispatcher) (cl::remf id-args :arities)) id-args)))) (cl::defmacro defswig1 (name (&rest args) &body body) `(cl::progn (cl::defmacro ,name ,args ,@body) (excl::define-simple-parser ,name scm-p1)) ) (cl::defmacro defswig2 (name (&rest args) &body body) `(cl::progn (cl::defmacro ,name ,args ,@body) (excl::define-simple-parser ,name second))) (defun read-symbol-from-string (string) (cl::multiple-value-bind (result position) (cl::read-from-string string nil "eof" :preserve-whitespace t) (cl::if (cl::and (cl::symbolp result) (cl::eql position (cl::length string))) result (cl::multiple-value-bind (sym) (cl::intern string) sym)))) (cl::defun full-name (id type arity class) ; We need some kind of a hack here to handle template classes ; and other synonym types right. We need the original name. (let*( (sym (read-symbol-from-string (if (eq *swig-identifier-converter* 'identifier-convert-lispify) (string-lispify id) id))) (sym-class (find-class sym nil)) (id (cond ( (not sym-class) id ) ( (and sym-class (not (eq (class-name sym-class) sym))) (class-name sym-class) ) ( t id ))) ) (cl::case type (:getter (cl::format nil "~@[~A_~]~A" class id)) (:constructor (cl::format nil "new_~A~@[~A~]" id arity)) (:destructor (cl::format nil "delete_~A" id)) (:type (cl::format nil "ff_~A" id)) (:slot id) (:ff-operator (cl::format nil "ffi_~A" id)) (otherwise (cl::format nil "~@[~A_~]~A~@[~A~]" class id arity))))) (cl::defun identifier-convert-null (id &key type class arity) (cl::if (cl::eq type :setter) `(cl::setf ,(identifier-convert-null id :type :getter :class class :arity arity)) (read-symbol-from-string (full-name id type arity class)))) (cl::defun string-lispify (str) (cl::let ( (cname (excl::replace-regexp str "_" "-")) (lastcase :other) newcase char res ) (cl::dotimes (n (cl::length cname)) (cl::setf char (cl::schar cname n)) (excl::if* (cl::alpha-char-p char) then (cl::setf newcase (cl::if (cl::upper-case-p char) :upper :lower)) (cl::when (cl::and (cl::eq lastcase :lower) (cl::eq newcase :upper)) ;; case change... add a dash (cl::push #\- res) (cl::setf newcase :other)) (cl::push (cl::char-downcase char) res) (cl::setf lastcase newcase) else (cl::push char res) (cl::setf lastcase :other))) (cl::coerce (cl::nreverse res) 'string))) (cl::defun identifier-convert-lispify (cname &key type class arity) (cl::assert (cl::stringp cname)) (cl::when (cl::eq type :setter) (cl::return-from identifier-convert-lispify `(cl::setf ,(identifier-convert-lispify cname :type :getter :class class :arity arity)))) (cl::setq cname (full-name cname type arity class)) (cl::if (cl::eq type :constant) (cl::setf cname (cl::format nil "*~A*" cname))) (read-symbol-from-string (string-lispify cname))) (cl::defun id-convert-and-export (name &rest kwargs) (cl::multiple-value-bind (symbol package) (cl::apply *swig-identifier-converter* name kwargs) (cl::let ((args (cl::list (cl::if (cl::consp symbol) (cl::cadr symbol) symbol) (cl::or package cl::*package*)))) (cl::apply #'cl::export args) (cl::pushnew args *swig-export-list*)) symbol)) (cl::defmacro swig-insert-id (name namespace &key (type :type) class) `(cl::let ((cl::*package* (cl::find-package ,(package-name-for-namespace namespace)))) (id-convert-and-export ,name :type ,type :class ,class))) (defswig2 swig-defconstant (string value) (cl::let ((symbol (id-convert-and-export string :type :constant))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defconstant ,symbol ,value)))) (cl::defun maybe-reorder-args (funcname arglist) ;; in the foreign setter function the new value will be the last argument ;; in Lisp it needs to be the first (cl::if (cl::consp funcname) (cl::append (cl::last arglist) (cl::butlast arglist)) arglist)) (cl::defun maybe-return-value (funcname arglist) ;; setf functions should return the new value (cl::when (cl::consp funcname) `(,(cl::if (cl::consp (cl::car arglist)) (cl::caar arglist) (cl::car arglist))))) (cl::defun swig-anyvarargs-p (arglist) (cl::member :SWIG__varargs_ arglist)) (defswig1 swig-defun ((name &optional (mangled-name name) &key (type :operator) class arity) arglist kwargs &body body) (cl::let* ((symbol (id-convert-and-export name :type type :arity arity :class class)) (mangle (excl::if* (cl::string-equal name mangled-name) then (id-convert-and-export (cl::cond ((cl::eq type :setter) (cl::format nil "~A-set" name)) ((cl::eq type :getter) (cl::format nil "~A-get" name)) (t name)) :type :ff-operator :arity arity :class class) else (cl::intern mangled-name))) (defun-args (maybe-reorder-args symbol (cl::mapcar #'cl::car (cl::and (cl::not (cl::equal arglist '(:void))) (cl::loop as i in arglist when (cl::eq (cl::car i) :p+) collect (cl::cdr i)))))) (ffargs (cl::if (cl::equal arglist '(:void)) arglist (cl::mapcar #'cl::cdr arglist))) ) (cl::when (swig-anyvarargs-p ffargs) (cl::setq ffargs '())) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) (cl::cons ',mangle args))) (cl::defun ,symbol ,defun-args ,@body ,@(maybe-return-value symbol defun-args)))))) (defswig1 swig-defmethod ((name &optional (mangled-name name) &key (type :operator) class arity) ffargs kwargs &body body) (cl::let* ((symbol (id-convert-and-export name :type type :arity arity :class class)) (mangle (cl::intern mangled-name)) (defmethod-args (maybe-reorder-args symbol (cl::unless (cl::equal ffargs '(:void)) (cl::loop for (lisparg name dispatch) in ffargs when (eq lisparg :p+) collect `(,name ,dispatch))))) (ffargs (cl::if (cl::equal ffargs '(:void)) ffargs (cl::loop for (nil name nil . ffi) in ffargs collect `(,name ,@ffi))))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (excl::compiler-let ((*record-xref-info* nil)) (ff:def-foreign-call (,mangle ,mangled-name) ,ffargs ,@kwargs)) (cl::macrolet ((swig-ff-call (&rest args) (cl::cons ',mangle args))) (cl::defmethod ,symbol ,defmethod-args ,@body ,@(maybe-return-value symbol defmethod-args)))))) (defswig1 swig-dispatcher ((name &key (type :operator) class arities)) (cl::let ((symbol (id-convert-and-export name :type type :class class))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defun ,symbol (&rest args) (cl::case (cl::length args) ,@(cl::loop for arity in arities for symbol-n = (id-convert-and-export name :type type :class class :arity arity) collect `(,arity (cl::apply #',symbol-n args))) (t (cl::error "No applicable wrapper-methods for foreign call ~a with args ~a of classes ~a" ',symbol args (cl::mapcar #'(cl::lambda (x) (cl::class-name (cl::class-of x))) args))) ))))) (defswig2 swig-def-foreign-stub (name) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol (:class )) (cl::defclass ,lsymbol (ff:foreign-pointer) ())))) (defswig2 swig-def-foreign-class (name supers &rest rest) (cl::let ((lsymbol (id-convert-and-export name :type :class)) (symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest) (cl::defclass ,lsymbol ,supers ((foreign-type :initform ',symbol :initarg :foreign-type :accessor foreign-pointer-type)))))) (defswig2 swig-def-foreign-type (name &rest rest) (cl::let ((symbol (id-convert-and-export name :type :type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-type ,symbol ,@rest)))) (defswig2 swig-def-synonym-type (synonym of ff-synonym) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::setf (cl::find-class ',synonym) (cl::find-class ',of)) (ff:def-foreign-type ,ff-synonym (:struct )))) (cl::defun package-name-for-namespace (namespace) (excl::list-to-delimited-string (cl::cons *swig-module-name* (cl::mapcar #'(cl::lambda (name) (cl::string (cl::funcall *swig-identifier-converter* name :type :namespace))) namespace)) ".")) (cl::defmacro swig-defpackage (namespace) (cl::let* ((parent-namespaces (cl::maplist #'cl::reverse (cl::cdr (cl::reverse namespace)))) (parent-strings (cl::mapcar #'package-name-for-namespace parent-namespaces)) (string (package-name-for-namespace namespace))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::defpackage ,string (:use :swig :ff #+ignore '(:common-lisp :ff :excl) ,@parent-strings ,*swig-module-name*) (:import-from :cl :* :nil :t))))) (cl::defmacro swig-in-package (namespace) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (cl::in-package ,(package-name-for-namespace namespace)))) (defswig2 swig-defvar (name mangled-name &key type (ftype :unsigned-natural)) (cl::let ((symbol (id-convert-and-export name :type type))) `(cl::eval-when (:compile-toplevel :load-toplevel :execute) (ff:def-foreign-variable (,symbol ,mangled-name) :type ,ftype)))) ) ;; eval-when (cl::eval-when (:compile-toplevel :execute) (cl::flet ((starts-with-p (str prefix) (cl::and (cl::>= (cl::length str) (cl::length prefix)) (cl::string= str prefix :end1 (cl::length prefix))))) (cl::export (cl::loop for sym being each present-symbol of cl::*package* when (cl::or (starts-with-p (cl::symbol-name sym) (cl::symbol-name :swig-)) (starts-with-p (cl::symbol-name sym) (cl::symbol-name :identifier-convert-))) collect sym)))) %} typedef void *__SWIGACL_FwdReference; %{ #ifdef __cplusplus # define EXTERN extern "C" #else # define EXTERN extern #endif #define EXPORT EXTERN SWIGEXPORT typedef void *__SWIGACL_FwdReference; #include #include %} swig-3.0.12/Lib/allegrocl/typemaps.i0000664000175000017500000000012713042756442017123 0ustar williamwilliam/* Unused for Allegro CL module */ %include "inout_typemaps.i" %include "longlongs.i" swig-3.0.12/Lib/allegrocl/inout_typemaps.i0000664000175000017500000001053313042756442020343 0ustar williamwilliam/* inout_typemaps.i Support for INPUT, OUTPUT, and INOUT typemaps. OUTPUT variables are returned as multiple values. */ /* Note that this macro automatically adds a pointer to the type passed in. As a result, INOUT typemaps for char are for 'char *'. The definition of typemaps for 'char' takes advantage of this, believing that it's more likely to see an INOUT argument for strings, than a single char. */ %define INOUT_TYPEMAP(type_, OUTresult_, INbind_) // OUTPUT map. %typemap(lin,numinputs=0) type_ *OUTPUT, type_ &OUTPUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) $body OUTresult_ (ff:free-fobject $out)) %} // INPUT map. %typemap(in) type_ *INPUT, type_ &INPUT %{ $1 = &$input; %} %typemap(ctype) type_ *INPUT, type_ &INPUT "$*1_ltype"; // INOUT map. // careful here. the input string is converted to a C string // with length equal to the input string. This should be large // enough to contain whatever OUTPUT value will be stored in it. %typemap(lin,numinputs=1) type_ *INOUT, type_ &INOUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) INbind_ $body OUTresult_ (ff:free-fobject $out)) %} %enddef // $in, $out, $lclass, // $in_fftype, $*in_fftype INOUT_TYPEMAP(int, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(short, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(long, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned int, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned short, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(unsigned long, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); // char * mapping for passing strings. didn't quite work // INOUT_TYPEMAP(char, // (cl::push (excl:native-to-string $out) ACL_result), // (cl::setf (ff:fslot-value-typed (cl::quote $in_fftype) :c $out) // (excl:string-to-native $in))) INOUT_TYPEMAP(float, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(double, (cl::push (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); INOUT_TYPEMAP(bool, (cl::push (not (zerop (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out))) ACL_result), (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) (if $in 1 0))); %typemap(lisptype) bool *INPUT, bool &INPUT "boolean"; // long long support not yet complete // INOUT_TYPEMAP(long long); // INOUT_TYPEMAP(unsigned long long); // char *OUTPUT map. // for this to work, swig needs to know how large an array to allocate. // you can fake this by // %typemap(ffitype) char *myarg "(:array :char 30)"; // %apply char *OUTPUT { char *myarg }; %typemap(lin,numinputs=0) char *OUTPUT, char &OUTPUT %{(cl::let (($out (ff:allocate-fobject '$*in_fftype :c))) $body (cl::push (excl:native-to-string $out) ACL_result) (ff:free-fobject $out)) %} // char *INPUT map. %typemap(in) char *INPUT, char &INPUT %{ $1 = &$input; %} %typemap(ctype) char *INPUT, char &INPUT "$*1_ltype"; // char *INOUT map. %typemap(lin,numinputs=1) char *INOUT, char &INOUT %{(cl::let (($out (excl:string-to-native $in))) $body (cl::push (excl:native-to-string $out) ACL_result) (ff:free-fobject $out)) %} // uncomment this if you want INOUT mappings for chars instead of strings. // INOUT_TYPEMAP(char, // (cl::push (code-char (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out)) // ACL_result), // (cl::setf (ff:fslot-value-typed (cl::quote $*in_fftype) :c $out) $in)); swig-3.0.12/Lib/allegrocl/longlongs.i0000664000175000017500000000312513042756442017264 0ustar williamwilliam/* ----------------------------------------------------------------------------- * longlongs.i * * Typemap addition for support of 'long long' type and 'unsigned long long * Makes use of swig-def-foreign-class, so this header should be loaded * after allegrocl.swg and after any custom user identifier-conversion * functions have been defined. * ----------------------------------------------------------------------------- */ #ifdef Acl64Bit %typemap(ctype) long long, unsigned long long "$1_ltype"; %typemap(out) long long, unsigned long long "$result = $1;"; %typemap(ffitype) long long ":nat"; %typemap(ffitype) unsigned long long ":unsigned-nat"; %typemap(lout) long long, unsigned long long " #+64bit (cl::setq ACL_ffresult $body)"; #else %typemap(out) long long, unsigned long long "$result = &$1;"; %typemap(ffitype) long long "(:struct (l1 :long) (l2 :long))"; %typemap(ffitype) unsigned long long "(:struct (l1 :unsigned-long) (l2 :unsigned-long))"; %typemap(lout) long long " (cl::setq ACL_ffresult (make-instance '#.(swig-insert-id \"longlong\" () :type :class) :foreign-address $body))"; %typemap(lout) unsigned long long " (cl:setq ACL_ffresult (make-instance '#.(swig-insert-id \"ulonglong\" () :type :class) :foreign-address $body))"; #endif %typemap(in) long long, unsigned long long "$1 = $input;"; %insert("lisphead") %{ #-64bit (swig-def-foreign-class "longlong" (ff:foreign-pointer) (:struct (l1 :long) (l2 :long))) #-64bit (swig-def-foreign-class "ulonglong" (ff:foreign-pointer) (:struct (l1 :unsigned-long) (l2 :unsigned-long))) %} swig-3.0.12/Lib/allegrocl/std_list.i0000664000175000017500000001136113042756442017110 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * * To use, add: * * %include "std_list.i" * * to your interface file. You will also need to include a template directive * for each instance of the list container you want to use in your application. * e.g. * * %template (intlist) std::list; * %template (floatlist) std::list; * ----------------------------------------------------------------------------- */ %module std_list %warnfilter(468) std::list; %{ #include #include %} namespace std{ template class list { public: typedef T &reference; typedef const T& const_reference; typedef T &iterator; typedef const T& const_iterator; list(); list(unsigned int size, const T& value = T()); list(const list &); ~list(); void assign(unsigned int n, const T& value); void swap(list &x); const_reference front(); const_reference back(); const_iterator begin(); const_iterator end(); void resize(unsigned int n, T c = T()); bool empty() const; void push_front(const T& INPUT); void push_back(const T& INPUT); void pop_front(); void pop_back(); void clear(); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, const T& INPUT); void remove(const T& INPUT); void unique(); void reverse(); void sort(); %extend { %typemap(lout) T &__getitem__ "(cl::setq ACL_ffresult (ff:fslot-value-typed '$*out_fftype :c $body))"; %typemap(lout) T *__getitem__ "(cl::setq ACL_ffresult (make-instance '$lclass :foreign-address $body))"; const_reference __getitem__(int i) throw (std::out_of_range) { std::list::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && ierase(first); } else throw std::out_of_range("list index out of range"); } std::list __getslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; if (i>=j) i=j; if (i>=0 && i=0) { for (int k=0;k tmp(j-i); if (j>i) std::copy(first,end,tmp.begin()); return tmp; } else throw std::out_of_range("list index out of range"); } void __delslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); } void __setslice__(int i,int j, const std::list& v) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); if (i+1 <= int(self->size())) { first = self->begin(); for (int k=0;kinsert(first,v.begin(),v.end()); } else self->insert(self->end(),v.begin(),v.end()); } } unsigned int __len__() { return self->size(); } bool __nonzero__() { return !(self->empty()); } void append(const T& INPUT) { self->push_back(INPUT); } void pop() { self->pop_back(); } }; }; } swig-3.0.12/Lib/allegrocl/std_string.i0000664000175000017500000001502213042756442017441 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ // %include %warnfilter(404) std::string; %warnfilter(404) std::wstring; %{ #include %} // %include // %naturalvar std::string; // %naturalvar std::wstring; namespace std { typedef unsigned long size_t; typedef signed long ptrdiff_t; template class basic_string { public: typedef charT *pointer; typedef charT &reference; typedef const charT &const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; basic_string(); basic_string( charT *str ); size_type size(); charT operator []( int pos ) const; charT *c_str() const; basic_string &operator = ( const basic_string &ws ); basic_string &operator = ( const charT *str ); basic_string &append( const basic_string &other ); basic_string &append( const charT *str ); void push_back( charT c ); void clear(); void reserve( size_type t ); void resize( size_type n, charT c = charT() ); int compare( const basic_string &other ) const; int compare( const charT *str ) const; basic_string &insert( size_type pos, const basic_string &str ); size_type find( const basic_string &other, int pos = 0 ) const; size_type find( charT c, int pos = 0 ) const; %extend { bool operator == ( const basic_string &other ) const { return self->compare( other ) == 0; } bool operator != ( const basic_string &other ) const { return self->compare( other ) != 0; } bool operator < ( const basic_string &other ) const { return self->compare( other ) == -1; } bool operator > ( const basic_string &other ) const { return self->compare( other ) == 1; } bool operator <= ( const basic_string &other ) const { return self->compare( other ) != 1; } bool operator >= ( const basic_string &other ) const { return self->compare( other ) != -1; } } }; %template(string) basic_string; %template(wstring) basic_string; %apply char * { string }; %apply wchar_t * { wstring }; typedef basic_string string; typedef basic_string wstring; // automatically convert constant std::strings to cl:strings %typemap(ctype) string "char *"; %typemap(in) string "$1.assign($input);"; %typemap(out) string "$result = (char *)(&$1)->c_str();"; %typemap(lisptype) string "cl:string"; %typemap(lout) string "(cl::setq ACL_ffresult $body)"; %typemap(ctype) const string *"char *"; %typemap(in) const string * "$1.assign($input);"; %typemap(out) const string * "$result = (char *)($1)->c_str();"; %typemap(lisptype) const string * "cl:string"; %typemap(lout) const string * "(cl::setq ACL_ffresult $body)"; %typemap(ctype) wstring "wchar_t *"; %typemap(in) wstring "$1.assign($input);"; %typemap(out) wstring "$result = (wchar_t *)(&$1)->c_str();"; %typemap(lisptype) wstring "cl:string"; %typemap(lout) wstring "(cl::setq ACL_ffresult (excl:native-to-string $body :external-format #+little-endian :fat-le #-little-endian :fat))"; %typemap(ctype) const wstring *"char *"; %typemap(in) const wstring * "$1.assign($input);"; %typemap(out) const wstring * "$result = (char *)($1)->c_str();"; %typemap(lisptype) const wstring * "cl:string"; %typemap(lout) const wstring * "(cl::setq ACL_ffresult $body)"; /* Overloading check */ // %typemap(in) string { // if (caml_ptr_check($input)) // $1.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // else // SWIG_exception(SWIG_TypeError, "string expected"); // } // %typemap(in) const string & ($*1_ltype temp) { // if (caml_ptr_check($input)) { // temp.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = &temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(in) string & ($*1_ltype temp) { // if (caml_ptr_check($input)) { // temp.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = &temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(in) string * ($*1_ltype *temp) { // if (caml_ptr_check($input)) { // temp = new $*1_ltype((char *)caml_ptr_val($input,0), // caml_string_len($input)); // $1 = temp; // } else { // SWIG_exception(SWIG_TypeError, "string expected"); // } // } // %typemap(free) string * ($*1_ltype *temp) { // delete temp; // } // %typemap(argout) string & { // caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), // (*$1).size())); // } // %typemap(directorout) string { // $result.assign((char *)caml_ptr_val($input,0), // caml_string_len($input)); // } // %typemap(out) string { // $result = caml_val_string_len($1.c_str(),$1.size()); // } // %typemap(out) string * { // $result = caml_val_string_len((*$1).c_str(),(*$1).size()); // } } // #ifdef ENABLE_CHARPTR_ARRAY // char **c_charptr_array( const std::vector &str_v ); // %{ // SWIGEXT char **c_charptr_array( const std::vector &str_v ) { // char **out = new char *[str_v.size() + 1]; // out[str_v.size()] = 0; // for( int i = 0; i < str_v.size(); i++ ) { // out[i] = (char *)str_v[i].c_str(); // } // return out; // } // %} // #endif // #ifdef ENABLE_STRING_VECTOR // %template (StringVector) std::vector; // %insert(ml) %{ // (* Some STL convenience items *) // let string_array_to_vector sa = // let nv = _new_StringVector C_void in // array_to_vector nv (fun x -> C_string x) sa ; nv // let c_string_array ar = // _c_charptr_array (string_array_to_vector ar) // %} // %insert(mli) %{ // val c_string_array: string array -> c_obj // %} // #endif swig-3.0.12/Lib/d/0000775000175000017500000000000013042756442013366 5ustar williamwilliamswig-3.0.12/Lib/d/std_deque.i0000664000175000017500000000003413042756442015512 0ustar williamwilliam%include swig-3.0.12/Lib/d/director.swg0000664000175000017500000000223213042756442015722 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that D proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) #include #endif #include #include namespace Swig { // Director base class – not used in D directors. class Director { }; // Base class for director exceptions. class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const std::string &msg) : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; // Exception which is thrown when attempting to call a pure virtual method // from D code through the director layer. class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg) : DirectorException(std::string("Attempted to invoke pure virtual method ") + msg) { } }; } swig-3.0.12/Lib/d/dstrings.swg0000664000175000017500000000501113042756442015742 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dstrings.swg * * Typemaps for wrapping pointers to/arrays of C chars as D strings. * ----------------------------------------------------------------------------- */ %define SWIGD_STRING_TYPEMAPS(DW_STRING_TYPE, DP_STRING_TYPE, FROM_STRINGZ, TO_STRINGZ) %typemap(ctype) char *, char *&, char[ANY], char[] "char *" %typemap(imtype) char *, char *&, char[ANY], char[] #DW_STRING_TYPE %typemap(dtype) char *, char *&, char[ANY], char[] #DP_STRING_TYPE /* * char* typemaps. */ %typemap(in) char * %{ $1 = ($1_ltype)$input; %} %typemap(out) char * %{ $result = SWIG_d_string_callback((const char *)$1); %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * %{ $result = ($1_ltype)$input; %} %typemap(directorin) char * %{ $input = SWIG_d_string_callback((const char *)$1); %} %typemap(ddirectorin) char * "FROM_STRINGZ($winput)" %typemap(ddirectorout) char * "TO_STRINGZ($dcall)" /* * char*& typemaps. */ %typemap(in) char *& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) char *& %{ if ($1) $result = SWIG_d_string_callback((const char *)*$1); %} /* * char array typemaps. */ %typemap(in) char[ANY], char[] %{ $1 = ($1_ltype)$input; %} %typemap(out) char[ANY], char[] %{ $result = SWIG_d_string_callback((const char *)$1); %} %typemap(directorout) char[ANY], char[] %{ $result = ($1_ltype)$input; %} %typemap(directorin) char[ANY], char[] %{ $input = SWIG_d_string_callback((const char *)$1); %} %typemap(ddirectorin) char[ANY], char[] "$winput" %typemap(ddirectorout) char[ANY], char[] "$dcall" %typemap(din) char *, char *&, char[ANY], char[] "($dinput ? TO_STRINGZ($dinput) : null)" %typemap(dout, excode=SWIGEXCODE) char *, char *&, char[ANY], char[] { DP_STRING_TYPE ret = FROM_STRINGZ ## ($imcall);$excode return ret; } %typecheck(SWIG_TYPECHECK_STRING) char *, char *&, char[ANY], char[] "" %enddef // We need to have the \0-terminated string conversion functions available in // the D proxy modules. #if (SWIG_D_VERSION == 1) // Could be easily extended to support Phobos as well. SWIGD_STRING_TYPEMAPS(char*, char[], tango.stdc.stringz.fromStringz, tango.stdc.stringz.toStringz) %pragma(d) globalproxyimports = "static import tango.stdc.stringz;"; #else SWIGD_STRING_TYPEMAPS(const(char)*, string, std.conv.to!string, std.string.toStringz) %pragma(d) globalproxyimports = %{ static import std.conv; static import std.string; %} #endif #undef SWIGD_STRING_TYPEMAPS swig-3.0.12/Lib/d/cpointer.i0000664000175000017500000000663213042756442015372 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cpointer.i * * D-specific version of ../cpointer.i. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %pointer_class(type,name) * * Places a simple proxy around a simple type like 'int', 'float', or whatever. * The proxy provides this interface: * * class type { * public: * type(); * ~type(); * type value(); * void assign(type value); * }; * * Example: * * %pointer_class(int, intp); * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = intp() * >>> a.assign(10) * >>> a.value() * 10 * >>> b = intp() * >>> b.assign(20) * >>> print add(a,b) * 30 * * As a general rule, this macro should not be used on class/structures that * are already defined in the interface. * ----------------------------------------------------------------------------- */ %define %pointer_class(TYPE, NAME) %{ typedef TYPE NAME; %} typedef struct { } NAME; %extend NAME { #ifdef __cplusplus NAME() { return new TYPE(); } ~NAME() { if (self) delete self; } #else NAME() { return (TYPE *) calloc(1,sizeof(TYPE)); } ~NAME() { if (self) free(self); } #endif } %extend NAME { void assign(TYPE value) { *self = value; } TYPE value() { return *self; } TYPE * ptr() { return self; } static NAME * frompointer(TYPE *t) { return (NAME *) t; } } %types(NAME = TYPE); %enddef /* ----------------------------------------------------------------------------- * %pointer_functions(type,name) * * Create functions for allocating/deallocating pointers. This can be used * if you don't want to create a proxy class or if the pointer is complex. * * %pointer_functions(int, intp) * * int add(int *x, int *y) { return *x + *y; } * * In python (with proxies) * * >>> a = copy_intp(10) * >>> intp_value(a) * 10 * >>> b = new_intp() * >>> intp_assign(b,20) * >>> print add(a,b) * 30 * >>> delete_intp(a) * >>> delete_intp(b) * * ----------------------------------------------------------------------------- */ %define %pointer_functions(TYPE,NAME) %{ static TYPE *new_##NAME() { %} #ifdef __cplusplus %{ return new TYPE(); %} #else %{ return (TYPE *) calloc(1,sizeof(TYPE)); %} #endif %{} static TYPE *copy_##NAME(TYPE value) { %} #ifdef __cplusplus %{ return new TYPE(value); %} #else %{ TYPE *self = (TYPE *) calloc(1,sizeof(TYPE)); *self = value; return self; %} #endif %{} static void delete_##NAME(TYPE *self) { %} #ifdef __cplusplus %{ if (self) delete self; %} #else %{ if (self) free(self); %} #endif %{} static void NAME ##_assign(TYPE *self, TYPE value) { *self = value; } static TYPE NAME ##_value(TYPE *self) { return *self; } %} TYPE *new_##NAME(); TYPE *copy_##NAME(TYPE value); void delete_##NAME(TYPE *self); void NAME##_assign(TYPE *self, TYPE value); TYPE NAME##_value(TYPE *self); %enddef /* ----------------------------------------------------------------------------- * %pointer_cast(type1,type2,name) * * Generates a pointer casting function. * ----------------------------------------------------------------------------- */ %define %pointer_cast(TYPE1,TYPE2,NAME) %inline %{ TYPE2 NAME(TYPE1 x) { return (TYPE2) x; } %} %enddef swig-3.0.12/Lib/d/std_shared_ptr.i0000664000175000017500000000010413042756442016540 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-3.0.12/Lib/d/dmemberfunctionpointers.swg0000664000175000017500000000516313042756442021062 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dmemberfunctionpointers.swg * * Typemaps for member function pointers. * ----------------------------------------------------------------------------- */ %typemap(ctype) SWIGTYPE (CLASS::*) "char *" %typemap(imtype) SWIGTYPE (CLASS::*) "char*" %typemap(dtype) SWIGTYPE (CLASS::*) "$dclassname" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE (CLASS::*) "" /* * Conversion generation typemaps. */ %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) %{ SWIG_UnpackData($input, (void *)&$1, sizeof($1)); %} %typemap(out, fragment="SWIG_PackData") SWIGTYPE (CLASS::*) %{ char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = SWIG_d_string_callback(buf); %} %typemap(directorin) SWIGTYPE (CLASS::*) "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) "$result = ($1_ltype)$input;" %typemap(ddirectorin) SWIGTYPE (CLASS::*) "($winput is null) ? null : new $dclassname($winput, false)" %typemap(ddirectorout) SWIGTYPE (CLASS::*) "$dclassname.swigGetCPtr($dcall)" %typemap(din) SWIGTYPE (CLASS::*) "$dclassname.swigGetCMemberPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE (CLASS::*) { char* cMemberPtr = $imcall; $dclassname ret = (cMemberPtr is null) ? null : new $dclassname(cMemberPtr, $owner);$excode return ret; } /* * Helper functions to pack/unpack arbitrary binary data (member function * pointers in this case) into a string. */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } swig-3.0.12/Lib/d/std_vector.i0000664000175000017500000004001713042756442015716 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector, D implementation. * * The D wrapper is made to loosely resemble a tango.util.container.more.Vector * and to provide built-in array-like access. * * If T does define an operator==, then use the SWIG_STD_VECTOR_ENHANCED * macro to obtain enhanced functionality (none yet), for example: * * SWIG_STD_VECTOR_ENHANCED(SomeNamespace::Klass) * %template(VectKlass) std::vector; * * Warning: heavy macro usage in this file. Use swig -E to get a sane view on * the real file contents! * ----------------------------------------------------------------------------- */ // Warning: Use the typemaps here in the expectation that the macros they are in will change name. %include // MACRO for use within the std::vector class body %define SWIG_STD_VECTOR_MINIMUM_INTERNAL(CONST_REFERENCE, CTYPE...) #if (SWIG_D_VERSION == 1) %typemap(dimports) std::vector< CTYPE > "static import tango.core.Exception;" %proxycode %{ public this($typemap(dtype, CTYPE)[] values) { this(); append(values); } alias push_back add; alias push_back push; alias push_back opCatAssign; alias size length; alias opSlice slice; public $typemap(dtype, CTYPE) opIndexAssign($typemap(dtype, CTYPE) value, size_t index) { if (index >= size()) { throw new tango.core.Exception.NoSuchElementException("Tried to assign to element out of vector bounds."); } setElement(index, value); return value; } public $typemap(dtype, CTYPE) opIndex(size_t index) { if (index >= size()) { throw new tango.core.Exception.NoSuchElementException("Tried to read from element out of vector bounds."); } return getElement(index); } public void append($typemap(dtype, CTYPE)[] value...) { foreach (v; value) { add(v); } } public $typemap(dtype, CTYPE)[] opSlice() { $typemap(dtype, CTYPE)[] array = new $typemap(dtype, CTYPE)[size()]; foreach (i, ref value; array) { value = getElement(i); } return array; } public int opApply(int delegate(ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); result = dg(value); setElement(i, value); } return result; } public int opApply(int delegate(ref size_t index, ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); // Workaround for http://d.puremagic.com/issues/show_bug.cgi?id=2443. auto index = i; result = dg(index, value); setElement(i, value); } return result; } public void capacity(size_t value) { if (value < size()) { throw new tango.core.Exception.IllegalArgumentException("Tried to make the capacity of a vector smaller than its size."); } reserve(value); } %} public: typedef size_t size_type; typedef CTYPE value_type; typedef CONST_REFERENCE const_reference; void clear(); void push_back(CTYPE const& x); size_type size() const; size_type capacity() const; void reserve(size_type n) throw (std::length_error); vector(); vector(const vector &other); %extend { vector(size_type capacity) throw (std::length_error) { std::vector< CTYPE >* pv = 0; pv = new std::vector< CTYPE >(); // Might throw std::length_error. pv->reserve(capacity); return pv; } size_type unused() const { return $self->capacity() - $self->size(); } CONST_REFERENCE remove() throw (std::out_of_range) { if ($self->empty()) { throw std::out_of_range("Tried to remove last element from empty vector."); } std::vector< CTYPE >::const_reference value = $self->back(); $self->pop_back(); return value; } CONST_REFERENCE remove(size_type index) throw (std::out_of_range) { if (index >= $self->size()) { throw std::out_of_range("Tried to remove element with invalid index."); } std::vector< CTYPE >::iterator it = $self->begin() + index; std::vector< CTYPE >::const_reference value = *it; $self->erase(it); return value; } } // Wrappers for setting/getting items with the possibly thrown exception // specified (important for SWIG wrapper generation). %extend { CONST_REFERENCE getElement(size_type index) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to get value of element with invalid index."); } return (*$self)[index]; } } // Use CTYPE const& instead of const_reference to work around SWIG code // generation issue when using const pointers as vector elements (like // std::vector< const int* >). %extend { void setElement(size_type index, CTYPE const& val) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to set value of element with invalid index."); } (*$self)[index] = val; } } %dmethodmodifiers std::vector::getElement "private" %dmethodmodifiers std::vector::setElement "private" %dmethodmodifiers std::vector::reserve "private" #else %typemap(dimports) std::vector< CTYPE > %{ static import std.algorithm; static import std.exception; static import std.range; static import std.traits; %} %proxycode %{ alias size_t KeyType; alias $typemap(dtype, CTYPE) ValueType; this(ValueType[] values...) { this(); reserve(values.length); foreach (e; values) { this ~= e; } } struct Range { private $typemap(dtype, std::vector< CTYPE >) _outer; private size_t _a, _b; this($typemap(dtype, std::vector< CTYPE >) data, size_t a, size_t b) { _outer = data; _a = a; _b = b; } @property bool empty() const { assert((cast($typemap(dtype, std::vector< CTYPE >))_outer).length >= _b); return _a >= _b; } @property Range save() { return this; } @property ValueType front() { std.exception.enforce(!empty); return _outer[_a]; } @property void front(ValueType value) { std.exception.enforce(!empty); _outer[_a] = std.algorithm.move(value); } void popFront() { std.exception.enforce(!empty); ++_a; } void opIndexAssign(ValueType value, size_t i) { i += _a; std.exception.enforce(i < _b && _b <= _outer.length); _outer[i] = value; } void opIndexOpAssign(string op)(ValueType value, size_t i) { std.exception.enforce(_outer && _a + i < _b && _b <= _outer.length); auto element = _outer[i]; mixin("element "~op~"= value;"); _outer[i] = element; } } // TODO: dup? Range opSlice() { return Range(this, 0, length); } Range opSlice(size_t a, size_t b) { std.exception.enforce(a <= b && b <= length); return Range(this, a, b); } size_t opDollar() const { return length; } @property ValueType front() { std.exception.enforce(!empty); return getElement(0); } @property void front(ValueType value) { std.exception.enforce(!empty); setElement(0, value); } @property ValueType back() { std.exception.enforce(!empty); return getElement(length - 1); } @property void back(ValueType value) { std.exception.enforce(!empty); setElement(length - 1, value); } ValueType opIndex(size_t i) { return getElement(i); } void opIndexAssign(ValueType value, size_t i) { setElement(i, value); } void opIndexOpAssign(string op)(ValueType value, size_t i) { auto element = this[i]; mixin("element "~op~"= value;"); this[i] = element; } ValueType[] opBinary(string op, Stuff)(Stuff stuff) if (op == "~") { ValueType[] result; result ~= this[]; assert(result.length == length); result ~= stuff[]; return result; } void opOpAssign(string op, Stuff)(Stuff stuff) if (op == "~") { static if (is(typeof(insertBack(stuff)))) { insertBack(stuff); } else if (is(typeof(insertBack(stuff[])))) { insertBack(stuff[]); } else { static assert(false, "Cannot append " ~ Stuff.stringof ~ " to " ~ typeof(this).stringof); } } alias size length; alias remove removeAny; alias removeAny stableRemoveAny; size_t insertBack(Stuff)(Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)){ push_back(stuff); return 1; } size_t insertBack(Stuff)(Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(std.range.ElementType!Stuff, ValueType)) { size_t itemCount; foreach(item; stuff) { insertBack(item); ++itemCount; } return itemCount; } alias insertBack insert; alias pop_back removeBack; alias pop_back stableRemoveBack; size_t insertBefore(Stuff)(Range r, Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)) { std.exception.enforce(r._outer.swigCPtr == swigCPtr && r._a < length); insertAt(r._a, stuff); return 1; } size_t insertBefore(Stuff)(Range r, Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(ElementType!Stuff, ValueType)) { std.exception.enforce(r._outer.swigCPtr == swigCPtr && r._a <= length); size_t insertCount; foreach(i, item; stuff) { insertAt(r._a + i, item); ++insertCount; } return insertCount; } size_t insertAfter(Stuff)(Range r, Stuff stuff) { // TODO: optimize immutable offset = r._a + r.length; std.exception.enforce(offset <= length); auto result = insertBack(stuff); std.algorithm.bringToFront(this[offset .. length - result], this[length - result .. length]); return result; } size_t replace(Stuff)(Range r, Stuff stuff) if (std.range.isInputRange!Stuff && std.traits.isImplicitlyConvertible!(ElementType!Stuff, ValueType)) { immutable offset = r._a; std.exception.enforce(offset <= length); size_t result; for (; !stuff.empty; stuff.popFront()) { if (r.empty) { // append the rest return result + insertBack(stuff); } r.front = stuff.front; r.popFront(); ++result; } // Remove remaining stuff in r remove(r); return result; } size_t replace(Stuff)(Range r, Stuff stuff) if (std.traits.isImplicitlyConvertible!(Stuff, ValueType)) { if (r.empty) { insertBefore(r, stuff); } else { r.front = stuff; r.popFront(); remove(r); } return 1; } Range linearRemove(Range r) { std.exception.enforce(r._a <= r._b && r._b <= length); immutable tailLength = length - r._b; linearRemove(r._a, r._b); return this[length - tailLength .. length]; } alias remove stableLinearRemove; int opApply(int delegate(ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); result = dg(value); setElement(i, value); } return result; } int opApply(int delegate(ref size_t index, ref $typemap(dtype, CTYPE) value) dg) { int result; size_t currentSize = size(); for (size_t i = 0; i < currentSize; ++i) { auto value = getElement(i); // Workaround for http://d.puremagic.com/issues/show_bug.cgi?id=2443. auto index = i; result = dg(index, value); setElement(i, value); } return result; } %} public: typedef size_t size_type; typedef CTYPE value_type; typedef CONST_REFERENCE const_reference; bool empty() const; void clear(); void push_back(CTYPE const& x); void pop_back(); size_type size() const; size_type capacity() const; void reserve(size_type n) throw (std::length_error); vector(); vector(const vector &other); %extend { vector(size_type capacity) throw (std::length_error) { std::vector< CTYPE >* pv = 0; pv = new std::vector< CTYPE >(); // Might throw std::length_error. pv->reserve(capacity); return pv; } CONST_REFERENCE remove() throw (std::out_of_range) { if ($self->empty()) { throw std::out_of_range("Tried to remove last element from empty vector."); } std::vector< CTYPE >::const_reference value = $self->back(); $self->pop_back(); return value; } CONST_REFERENCE remove(size_type index) throw (std::out_of_range) { if (index >= $self->size()) { throw std::out_of_range("Tried to remove element with invalid index."); } std::vector< CTYPE >::iterator it = $self->begin() + index; std::vector< CTYPE >::const_reference value = *it; $self->erase(it); return value; } void removeBack(size_type how_many) throw (std::out_of_range) { std::vector< CTYPE >::iterator end = $self->end(); std::vector< CTYPE >::iterator start = end - how_many; $self->erase(start, end); } void linearRemove(size_type start_index, size_type end_index) throw (std::out_of_range) { std::vector< CTYPE >::iterator start = $self->begin() + start_index; std::vector< CTYPE >::iterator end = $self->begin() + end_index; $self->erase(start, end); } void insertAt(size_type index, CTYPE const& x) throw (std::out_of_range) { std::vector< CTYPE >::iterator it = $self->begin() + index; $self->insert(it, x); } } // Wrappers for setting/getting items with the possibly thrown exception // specified (important for SWIG wrapper generation). %extend { CONST_REFERENCE getElement(size_type index) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to get value of element with invalid index."); } return (*$self)[index]; } } // Use CTYPE const& instead of const_reference to work around SWIG code // generation issue when using const pointers as vector elements (like // std::vector< const int* >). %extend { void setElement(size_type index, CTYPE const& val) throw (std::out_of_range) { if ((index < 0) || ($self->size() <= index)) { throw std::out_of_range("Tried to set value of element with invalid index."); } (*$self)[index] = val; } } %dmethodmodifiers std::vector::getElement "private" %dmethodmodifiers std::vector::setElement "private" #endif %enddef // Extra methods added to the collection class if operator== is defined for the class being wrapped // The class will then implement IList<>, which adds extra functionality %define SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE...) %extend { } %enddef // For vararg handling in macros, from swigmacros.swg #define %arg(X...) X // Macros for std::vector class specializations/enhancements %define SWIG_STD_VECTOR_ENHANCED(CTYPE...) namespace std { template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(%arg(CTYPE const&), %arg(CTYPE)) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(CTYPE) }; } %enddef %{ #include #include %} namespace std { // primary (unspecialized) class template for std::vector // does not require operator== to be defined template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(T const&, T) }; // specializations for pointers template class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(T *const&, T *) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(T *) }; // bool is a bit different in the C++ standard - const_reference in particular template<> class vector { SWIG_STD_VECTOR_MINIMUM_INTERNAL(bool, bool) SWIG_STD_VECTOR_EXTRA_OP_EQUALS_EQUALS(bool) }; } // template specializations for std::vector // these provide extra collections methods as operator== is defined SWIG_STD_VECTOR_ENHANCED(char) SWIG_STD_VECTOR_ENHANCED(signed char) SWIG_STD_VECTOR_ENHANCED(unsigned char) SWIG_STD_VECTOR_ENHANCED(short) SWIG_STD_VECTOR_ENHANCED(unsigned short) SWIG_STD_VECTOR_ENHANCED(int) SWIG_STD_VECTOR_ENHANCED(unsigned int) SWIG_STD_VECTOR_ENHANCED(long) SWIG_STD_VECTOR_ENHANCED(unsigned long) SWIG_STD_VECTOR_ENHANCED(long long) SWIG_STD_VECTOR_ENHANCED(unsigned long long) SWIG_STD_VECTOR_ENHANCED(float) SWIG_STD_VECTOR_ENHANCED(double) SWIG_STD_VECTOR_ENHANCED(std::string) // also requires a %include swig-3.0.12/Lib/d/ddirectives.swg0000664000175000017500000000101313042756442016410 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ddirectives.swg * * D-specifiv directives. * ----------------------------------------------------------------------------- */ #define %dmanifestconst %feature("d:manifestconst") #define %dconstvalue(value) %feature("d:constvalue",value) #define %dmethodmodifiers %feature("d:methodmodifiers") #define %dnothrowexception %feature("except") #define %proxycode %insert("proxycode") swig-3.0.12/Lib/d/doperators.swg0000664000175000017500000001767013042756442016305 0ustar williamwilliam/* ----------------------------------------------------------------------------- * doperators.swg * * Mapping of C++ operator overloading methods to D. * ----------------------------------------------------------------------------- */ #if (SWIG_D_VERSION == 1) %pragma(d) imdmodulecode=%{ template SwigOperatorDefinitions() { public override int opEquals(Object o) { if (auto rhs = cast(typeof(this))o) { if (swigCPtr == rhs.swigCPtr) return 1; static if (is(typeof(swigOpEquals(rhs)))) { return swigOpEquals(rhs) ? 1 : 0; } else { return 0; } } return super.opEquals(o); } %} // opEquals is emitted in pure C mode as well to define two proxy classes // pointing to the same struct as equal. #ifdef __cplusplus %rename(opPos) *::operator+(); %rename(opPos) *::operator+() const; %rename(opNeg) *::operator-(); %rename(opNeg) *::operator-() const; %rename(opCom) *::operator~(); %rename(opCom) *::operator~() const; %rename(opAdd) *::operator+; %rename(opAddAssign) *::operator+=; %rename(opSub) *::operator-; %rename(opSubAssign) *::operator-=; %rename(opMul) *::operator*; %rename(opMulAssign) *::operator*=; %rename(opDiv) *::operator/; %rename(opDivAssign) *::operator/=; %rename(opMod) *::operator%; %rename(opModAssign) *::operator%=; %rename(opAnd) *::operator&; %rename(opAndAssign) *::operator&=; %rename(opOr) *::operator|; %rename(opOrAssign) *::operator|=; %rename(opXor) *::operator^; %rename(opXorAssign) *::operator^=; %rename(opShl) *::operator<<; %rename(opShlAssign) *::operator<<=; %rename(opShr) *::operator>>; %rename(opShrAssign) *::operator>>=; %rename(opIndex) *::operator[](unsigned) const; // opIndexAssign is not currently generated, it needs more extensive support // mechanisms. %rename(opCall) *::operator(); // !a is not overrideable in D1. %ignoreoperator(LNOT) operator!; // opCmp is used in D. %rename(swigOpEquals) *::operator==; %rename(swigOpLt) *::operator<; %rename(swigOpLtEquals) *::operator<=; %rename(swigOpGt) *::operator>; %rename(swigOpGtEquals) *::operator>=; // a != b is rewritten as !a.opEquals(b) in D. %ignoreoperator(NOTEQUAL) operator!=; // The logic operators are not overrideable in D. %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; // ++/--a is rewritten as a +/-= 1 in D1,so ignore the prefix operators. %ignoreoperator(PLUSPLUS) *::operator++(); %ignoreoperator(MINUSMINUS) *::operator--(); %rename(swigOpInc) *::operator++(int); %rename(swigOpDec) *::operator--(int); // The C++ assignment operator does not translate well to D where the proxy // classes have reference semantics. %ignoreoperator(EQ) operator=; %pragma(d) imdmodulecode=%{ public override int opCmp(Object o) { static if (is(typeof(swigOpLt(typeof(this).init) && swigOpEquals(typeof(this).init)))) { if (auto rhs = cast(typeof(this))o) { if (swigOpLt(rhs)) { return -1; } else if (swigOpEquals(rhs)) { return 0; } else { return 1; } } } return super.opCmp(o); } public typeof(this) opPostInc(T = int)(T unused = 0) { static assert( is(typeof(swigOpInc(int.init))), "opPostInc called on " ~ typeof(this).stringof ~ ", but no postfix " ~ "increment operator exists in the corresponding C++ class." ); return swigOpInc(int.init); } public typeof(this) opPostDec(T = int)(T unused = 0) { static assert( is(typeof(swigOpDec(int.init))), "opPostInc called on " ~ typeof(this).stringof ~ ", but no postfix " ~ "decrement operator exists in the corresponding C++ class." ); return swigOpDec(int.init); } %} #endif %pragma(d) imdmodulecode=%{ } %} #else %pragma(d) imdmodulecode=%{ mixin template SwigOperatorDefinitions() { public override bool opEquals(Object o) { if (auto rhs = cast(typeof(this))o) { if (swigCPtr == rhs.swigCPtr) return true; static if (is(typeof(swigOpEquals(rhs)))) { return swigOpEquals(rhs); } else { return false; } } return super.opEquals(o); } %} // opEquals is emitted in pure C mode as well to define two proxy classes // pointing to the same struct as equal. #ifdef __cplusplus %rename(swigOpPos) *::operator+(); %rename(swigOpPos) *::operator+() const; %rename(swigOpNeg) *::operator-(); %rename(swigOpNeg) *::operator-() const; %rename(swigOpCom) *::operator~(); %rename(swigOpCom) *::operator~() const; %rename(swigOpInc) *::operator++(); %rename(swigOpDec) *::operator--(); %ignoreoperator(PLUSPLUS) *::operator++(int); %ignoreoperator(MINUSMINUS) *::operator--(int); // The postfix increment/decrement operators are ignored because they are // rewritten to (auto t = e, ++e, t) in D2. The unary * operator (used for // pointer dereferencing in C/C++) isn't mapped to opUnary("*") by default, // despite this would be possible in D2 – the difference in member access // semantics would only lead to confusion in most cases. %rename(swigOpAdd) *::operator+; %rename(swigOpSub) *::operator-; %rename(swigOpMul) *::operator*; %rename(swigOpDiv) *::operator/; %rename(swigOpMod) *::operator%; %rename(swigOpAnd) *::operator&; %rename(swigOpOr) *::operator|; %rename(swigOpXor) *::operator^; %rename(swigOpShl) *::operator<<; %rename(swigOpShr) *::operator>>; %rename(swigOpAddAssign) *::operator+=; %rename(swigOpSubAssign) *::operator-=; %rename(swigOpMulAssign) *::operator*=; %rename(swigOpDivAssign) *::operator/=; %rename(swigOpModAssign) *::operator%=; %rename(swigOpAndAssign) *::operator&=; %rename(swigOpOrAssign) *::operator|=; %rename(swigOpXorAssign) *::operator^=; %rename(swigOpShlAssign) *::operator<<=; %rename(swigOpShrAssign) *::operator>>=; %rename(opIndex) *::operator[]; // opIndexAssign is not currently generated, it needs more extensive support // mechanisms. %rename(opCall) *::operator(); %rename(swigOpEquals) *::operator==; %rename(swigOpLt) *::operator<; %rename(swigOpLtEquals) *::operator<=; %rename(swigOpGt) *::operator>; %rename(swigOpGtEquals) *::operator>=; // a != b is rewritten as !a.opEquals(b) in D. %ignoreoperator(NOTEQUAL) operator!=; // The logic operators are not overrideable in D. %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; // The C++ assignment operator does not translate well to D where the proxy // classes have reference semantics. %ignoreoperator(EQ) operator=; %pragma(d) imdmodulecode=%{ public override int opCmp(Object o) { static if (__traits(compiles, swigOpLt(typeof(this).init) && swigOpEquals(typeof(this).init))) { if (auto rhs = cast(typeof(this))o) { if (swigOpLt(rhs)) { return -1; } else if (swigOpEquals(rhs)) { return 0; } else { return 1; } } } return super.opCmp(o); } private template swigOpBinary(string operator, string name) { enum swigOpBinary = `public void opOpAssign(string op, T)(T rhs) if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `Assign(rhs))) { swigOp` ~ name ~ `Assign(rhs);}` ~ `public auto opBinary(string op, T)(T rhs) if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `(rhs))) { return swigOp` ~ name ~ `(rhs);}`; } mixin(swigOpBinary!("+", "Add")); mixin(swigOpBinary!("-", "Sub")); mixin(swigOpBinary!("*", "Mul")); mixin(swigOpBinary!("/", "Div")); mixin(swigOpBinary!("%", "Mod")); mixin(swigOpBinary!("&", "And")); mixin(swigOpBinary!("|", "Or")); mixin(swigOpBinary!("^", "Xor")); mixin(swigOpBinary!("<<", "Shl")); mixin(swigOpBinary!(">>", "Shr")); private template swigOpUnary(string operator, string name) { enum swigOpUnary = `public auto opUnary(string op)() if (op == "` ~ operator ~ `" && __traits(compiles, swigOp` ~ name ~ `())) { return swigOp` ~ name ~ `();}`; } mixin(swigOpUnary!("+", "Pos")); mixin(swigOpUnary!("-", "Neg")); mixin(swigOpUnary!("~", "Com")); mixin(swigOpUnary!("++", "Inc")); mixin(swigOpUnary!("--", "Dec")); %} #endif %pragma(d) imdmodulecode=%{ } %} #endif swig-3.0.12/Lib/d/dkw.swg0000664000175000017500000000456513042756442014707 0ustar williamwilliam#ifndef D_DKW_SWG_ #define D_DKW_SWG_ /* Warnings for D keywords */ #define DKEYWORD(x) %keywordwarn("'" `x` "' is a D keyword, renaming to '_" `x` "'",rename="_%s") `x` // Source: http://www.digitalmars.com/d/{1.0,2.0}/lex.html and DKEYWORD(Error); DKEYWORD(Exception); DKEYWORD(Object); DKEYWORD(__FILE__); DKEYWORD(__LINE__); DKEYWORD(__gshared); DKEYWORD(__thread); DKEYWORD(__traits); DKEYWORD(abstract); DKEYWORD(alias); DKEYWORD(align); DKEYWORD(asm); DKEYWORD(assert); DKEYWORD(auto); DKEYWORD(body); DKEYWORD(bool); DKEYWORD(break); DKEYWORD(byte); DKEYWORD(case); DKEYWORD(cast); DKEYWORD(catch); DKEYWORD(cdouble); DKEYWORD(cent); DKEYWORD(cfloat); DKEYWORD(char); DKEYWORD(class); DKEYWORD(const); DKEYWORD(continue); DKEYWORD(creal); DKEYWORD(dchar); DKEYWORD(debug); DKEYWORD(default); DKEYWORD(delegate); DKEYWORD(delete); DKEYWORD(deprecated); DKEYWORD(do); DKEYWORD(double); DKEYWORD(dstring); DKEYWORD(else); DKEYWORD(enum); DKEYWORD(export); DKEYWORD(extern); DKEYWORD(false); DKEYWORD(final); DKEYWORD(finally); DKEYWORD(float); DKEYWORD(for); DKEYWORD(foreach); DKEYWORD(foreach_reverse); DKEYWORD(function); DKEYWORD(goto); DKEYWORD(idouble); DKEYWORD(if); DKEYWORD(ifloat); DKEYWORD(immutable); DKEYWORD(import); DKEYWORD(in); DKEYWORD(inout); DKEYWORD(int); DKEYWORD(interface); DKEYWORD(invariant); DKEYWORD(ireal); DKEYWORD(is); DKEYWORD(lazy); DKEYWORD(long); DKEYWORD(macro); DKEYWORD(mixin); DKEYWORD(module); DKEYWORD(new); DKEYWORD(nothrow); DKEYWORD(null); DKEYWORD(out); DKEYWORD(override); DKEYWORD(package); DKEYWORD(pragma); DKEYWORD(private); DKEYWORD(protected); DKEYWORD(public); DKEYWORD(pure); DKEYWORD(real); DKEYWORD(ref); DKEYWORD(return); DKEYWORD(scope); DKEYWORD(shared); DKEYWORD(short); DKEYWORD(static); DKEYWORD(string); DKEYWORD(struct); DKEYWORD(super); DKEYWORD(switch); DKEYWORD(synchronized); DKEYWORD(template); DKEYWORD(this); DKEYWORD(throw); DKEYWORD(true); DKEYWORD(try); DKEYWORD(typedef); DKEYWORD(typeid); DKEYWORD(typeof); DKEYWORD(ubyte); DKEYWORD(ucent); DKEYWORD(uint); DKEYWORD(ulong); DKEYWORD(union); DKEYWORD(unittest); DKEYWORD(ushort); DKEYWORD(version); DKEYWORD(void); DKEYWORD(volatile); DKEYWORD(wchar); DKEYWORD(while); DKEYWORD(with); DKEYWORD(wstring); // Not really a keyword, but dispose() methods are generated in proxy classes // and it's a special method name for D1/Tango. DKEYWORD(dispose); #undef DKEYWORD #endif //D_DKW_SWG_ swig-3.0.12/Lib/d/std_common.i0000664000175000017500000000014613042756442015703 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-3.0.12/Lib/d/dclassgen.swg0000664000175000017500000000704313042756442016057 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dclassgen.swg * * Typemaps containing D code used when generating D proxy classes. * ----------------------------------------------------------------------------- */ %typemap(dbase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "class" %typemap(dcode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dinterfaces) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(dinterfaces_derived) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE (CLASS::*) "" // See . %typemap(dclassmodifiers) enum SWIGTYPE "enum" %typemap(dcode) enum SWIGTYPE "" /* * Proxy classes. */ %typemap(dconstructor, excode=SWIGEXCODE,directorconnect="\n swigDirectorConnect();") SWIGTYPE { this($imcall, true);$excode$directorconnect } %typemap(ddestructor) SWIGTYPE %{ ~this() { dispose(); } %} // We do not use »override« attribute for generated dispose() methods to stay // somewhat compatible to Phobos and older Tango versions where Object.dispose() // does not exist. %typemap(ddispose, methodname="dispose", methodmodifiers="public") SWIGTYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; } } } %typemap(ddispose_derived, methodname="dispose", methodmodifiers="public") SWIGTYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; super.dispose(); } } } // Unfortunately, the »package« visibility attribute does not work in D when the // module in question is in the root package (happens if no -package is specified // at the SWIG command line), so we are stuck with public visibility for // swigGetCPtr(). %typemap(dbody) SWIGTYPE %{ private void* swigCPtr; protected bool swigCMemOwn; public this(void* cObject, bool ownCObject) { swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} %typemap(dbody_derived) SWIGTYPE %{ private void* swigCPtr; public this(void* cObject, bool ownCObject) { super($imdmodule.$dclazznameUpcast(cObject), ownCObject); swigCPtr = cObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} /* * Type wrapper classes. */ %typemap(dbody) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ private void* swigCPtr; public this(void* cObject, bool futureUse) { swigCPtr = cObject; } protected this() { swigCPtr = null; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} /* * Member function pointer wrapper classes (see ). */ %typemap(dbody) SWIGTYPE (CLASS::*) %{ private char* swigCPtr; public this(char* cMemberPtr, bool futureUse) { swigCPtr = cMemberPtr; } protected this() { swigCPtr = null; } package static char* swigGetCMemberPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } mixin $imdmodule.SwigOperatorDefinitions; %} swig-3.0.12/Lib/d/std_except.i0000664000175000017500000000377613042756442015717 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. These typemaps are * used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws, canthrow=1) std::bad_cast "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::bad_exception "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::domain_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::exception "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::invalid_argument "SWIG_DSetPendingException(SWIG_DIllegalArgumentException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::length_error "SWIG_DSetPendingException(SWIG_DNoSuchElementException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::logic_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::out_of_range "SWIG_DSetPendingException(SWIG_DNoSuchElementException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::overflow_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::range_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::runtime_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" %typemap(throws, canthrow=1) std::underflow_error "SWIG_DSetPendingException(SWIG_DException, $1.what());\n return $null;" swig-3.0.12/Lib/d/dswigtype.swg0000664000175000017500000001217213042756442016132 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dswigtype.swg * * Typemaps for non-primitive types (C/C++ classes and structs). * ----------------------------------------------------------------------------- */ %typemap(ctype) SWIGTYPE "void *" %typemap(imtype) SWIGTYPE "void*" %typemap(dtype) SWIGTYPE "$&dclassname" %typemap(ctype) SWIGTYPE [] "void *" %typemap(imtype) SWIGTYPE [] "void*" %typemap(dtype) SWIGTYPE [] "$dclassname" %typemap(ctype) SWIGTYPE * "void *" %typemap(imtype) SWIGTYPE * "void*" %typemap(dtype, nativepointer="$dtype") SWIGTYPE * "$dclassname" %typemap(ctype) SWIGTYPE & "void *" %typemap(imtype) SWIGTYPE & "void*" %typemap(dtype, nativepointer="$dtype") SWIGTYPE & "$dclassname" %typemap(ctype) SWIGTYPE *const& "void *" %typemap(imtype) SWIGTYPE *const& "void*" %typemap(dtype) SWIGTYPE *const& "$*dclassname" %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [], SWIGTYPE *const& "" /* * By-value conversion typemaps (parameter is converted to a pointer). */ %typemap(in, canthrow=1) SWIGTYPE ($&1_type argp) %{ argp = ($&1_ltype)$input; if (!argp) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ $result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); $result = $1ptr; } #endif %typemap(directorin) SWIGTYPE "$input = (void *)new $1_ltype((const $1_ltype &)$1);" %typemap(directorout) SWIGTYPE %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)$input; %} %typemap(ddirectorin) SWIGTYPE "new $&dclassname($winput, true)" %typemap(ddirectorout) SWIGTYPE "$&dclassname.swigGetCPtr($dcall)" %typemap(din) SWIGTYPE "$&dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE { $&dclassname ret = new $&dclassname($imcall, true);$excode return ret; } /* * Pointer conversion typemaps. */ %typemap(in) SWIGTYPE * "$1 = ($1_ltype)$input;" %typemap(out) SWIGTYPE * "$result = (void *)$1;" %typemap(directorin) SWIGTYPE * "$input = (void *) $1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * "$result = ($1_ltype)$input;" %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE * "($winput is null) ? null : new $dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE * "$dclassname.swigGetCPtr($dcall)" %typemap(din, nativepointer="cast(void*)$dinput" ) SWIGTYPE * "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE, nativepointer="{\n auto ret = cast($dtype)$imcall;$excode\n return ret;\n}" ) SWIGTYPE * { void* cPtr = $imcall; $dclassname ret = (cPtr is null) ? null : new $dclassname(cPtr, $owner);$excode return ret; } // Use the same typemaps for const pointers. %apply SWIGTYPE * { SWIGTYPE *const } /* * Reference conversion typemaps. */ %typemap(in, canthrow=1) SWIGTYPE & %{ $1 = ($1_ltype)$input; if (!$1) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "$1_type type is null"); return $null; } %} %typemap(out) SWIGTYPE & "$result = (void *)$1;" %typemap(directorin) SWIGTYPE & "$input = ($1_ltype) &$1;" %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Unexpected null return for type $1_type"); return $null; } $result = ($1_ltype)$input; %} %typemap(ddirectorin, nativepointer="cast($dtype)$winput" ) SWIGTYPE & "new $dclassname($winput, false)" %typemap(ddirectorout, nativepointer="cast(void*)$dcall" ) SWIGTYPE & "$dclassname.swigGetCPtr($dcall)" %typemap(din, nativepointer="cast(void*)$dinput" ) SWIGTYPE & "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE, nativepointer="{\n auto ret = cast($dtype)$imcall;$excode\n return ret;\n}") SWIGTYPE & { $dclassname ret = new $dclassname($imcall, $owner);$excode return ret; } /* * Array conversion typemaps. */ %typemap(in) SWIGTYPE [] %{ $1 = ($1_ltype)$input; %} %typemap(out) SWIGTYPE [] %{ $result = $1; %} %typemap(din) SWIGTYPE [] "$dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE [] { void* cPtr = $imcall; $dclassname ret = (cPtr is null) ? null : new $dclassname(cPtr, $owner);$excode return ret; } // Treat references to arrays like like references to a single element. %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } /* * Pointer reference conversion typemaps. */ %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ $result = (void *)*$1; %} %typemap(din) SWIGTYPE *const& "$*dclassname.swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIGTYPE *const& { void* cPtr = $imcall; $*dclassname ret = (cPtr is null) ? null : new $*dclassname(cPtr, $owner);$excode return ret; } swig-3.0.12/Lib/d/typemaps.i0000664000175000017500000002547713042756442015421 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps are used for pointer/reference parameters that are input only and are mapped to a D input parameter. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In D you could then use it like this: double answer = fadd(10.0, 20.0); */ %define INPUT_TYPEMAP(TYPE, CTYPE, DTYPE) %typemap(ctype, out="void *") TYPE *INPUT, TYPE &INPUT "CTYPE" %typemap(imtype, out="void*") TYPE *INPUT, TYPE &INPUT "DTYPE" %typemap(dtype, out="DTYPE*") TYPE *INPUT, TYPE &INPUT "DTYPE" %typemap(din) TYPE *INPUT, TYPE &INPUT "$dinput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, unsigned int, bool) //INPUT_TYPEMAP(char, char, char) // Why was this commented out? INPUT_TYPEMAP(signed char, signed char, byte) INPUT_TYPEMAP(unsigned char, unsigned char, ubyte) INPUT_TYPEMAP(short, short, short) INPUT_TYPEMAP(unsigned short, unsigned short, ushort) INPUT_TYPEMAP(int, int, int) INPUT_TYPEMAP(unsigned int, unsigned int, uint) INPUT_TYPEMAP(long, long, SWIG_LONG_DTYPE) INPUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE) INPUT_TYPEMAP(long long, long long, long) INPUT_TYPEMAP(unsigned long long, unsigned long long, ulong) INPUT_TYPEMAP(float, float, float) INPUT_TYPEMAP(double, double, double) INPUT_TYPEMAP(enum SWIGTYPE, unsigned int, int) %typemap(dtype) enum SWIGTYPE *INPUT, enum SWIGTYPE &INPUT "$*dclassname" #undef INPUT_TYPEMAP /* OUTPUT typemaps --------------- These typemaps are used for pointer/reference parameters that are output only and are mapped to a D output parameter. The following typemaps can be applied to turn a pointer or reference into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In D, the 'out' keyword is used when passing the parameter to a function that takes an output parameter. bool *OUTPUT, bool &OUTPUT signed char *OUTPUT, signed char &OUTPUT unsigned char *OUTPUT, unsigned char &OUTPUT short *OUTPUT, short &OUTPUT unsigned short *OUTPUT, unsigned short &OUTPUT int *OUTPUT, int &OUTPUT unsigned int *OUTPUT, unsigned int &OUTPUT long *OUTPUT, long &OUTPUT unsigned long *OUTPUT, unsigned long &OUTPUT long long *OUTPUT, long long &OUTPUT unsigned long long *OUTPUT, unsigned long long &OUTPUT float *OUTPUT, float &OUTPUT double *OUTPUT, double &OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters): double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The D output of the function would be the function return value and the value returned in the second output parameter. In D you would use it like this: double dptr; double fraction = modf(5, dptr); */ %define OUTPUT_TYPEMAP(TYPE, CTYPE, DTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *OUTPUT, TYPE &OUTPUT "CTYPE *" %typemap(imtype, out="void*") TYPE *OUTPUT, TYPE &OUTPUT "out DTYPE" %typemap(dtype, out="DTYPE*") TYPE *OUTPUT, TYPE &OUTPUT "out DTYPE" %typemap(din) TYPE *OUTPUT, TYPE &OUTPUT "$dinput" %typemap(in) TYPE *OUTPUT, TYPE &OUTPUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *OUTPUT, TYPE &OUTPUT "" %enddef OUTPUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //OUTPUT_TYPEMAP(char, char, char, CHAR_PTR) // Why was this commented out? OUTPUT_TYPEMAP(signed char, signed char, byte, INT8_PTR) OUTPUT_TYPEMAP(unsigned char, unsigned char, ubyte, UINT8_PTR) OUTPUT_TYPEMAP(short, short, short, INT16_PTR) OUTPUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) OUTPUT_TYPEMAP(int, int, int, INT32_PTR) OUTPUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) OUTPUT_TYPEMAP(long, long, SWIG_LONG_DTYPE,INT32_PTR) OUTPUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE,UINT32_PTR) OUTPUT_TYPEMAP(long long, long long, long, INT64_PTR) OUTPUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) OUTPUT_TYPEMAP(float, float, float, FLOAT_PTR) OUTPUT_TYPEMAP(double, double, double, DOUBLE_PTR) OUTPUT_TYPEMAP(enum SWIGTYPE, unsigned int, int, INT32_PTR) %typemap(dtype) enum SWIGTYPE *OUTPUT, enum SWIGTYPE &OUTPUT "out $*dclassname" #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT, bool &OUTPUT %{ *$input = 0; $1 = ($1_ltype)$input; %} /* INOUT typemaps -------------- These typemaps are for pointer/reference parameters that are both input and output and are mapped to a D reference parameter. The following typemaps can be applied to turn a pointer or reference into a reference parameters, that is the parameter is both an input and an output. In D, the 'ref' keyword is used for reference parameters. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); The D output of the function would be the new value returned by the reference parameter. In D you would use it like this: double x = 5.0; neg(x); The implementation of the OUTPUT and INOUT typemaps is different to the scripting languages in that the scripting languages will return the output value as part of the function return value. */ %define INOUT_TYPEMAP(TYPE, CTYPE, DTYPE, TYPECHECKPRECEDENCE) %typemap(ctype, out="void *") TYPE *INOUT, TYPE &INOUT "CTYPE *" %typemap(imtype, out="void*") TYPE *INOUT, TYPE &INOUT "ref DTYPE" %typemap(dtype, out="DTYPE*") TYPE *INOUT, TYPE &INOUT "ref DTYPE" %typemap(din) TYPE *INOUT, TYPE &INOUT "$dinput" %typemap(in) TYPE *INOUT, TYPE &INOUT %{ $1 = ($1_ltype)$input; %} %typecheck(SWIG_TYPECHECK_##TYPECHECKPRECEDENCE) TYPE *INOUT, TYPE &INOUT "" %enddef INOUT_TYPEMAP(bool, unsigned int, bool, BOOL_PTR) //INOUT_TYPEMAP(char, char, char, CHAR_PTR) INOUT_TYPEMAP(signed char, signed char, byte, INT8_PTR) INOUT_TYPEMAP(unsigned char, unsigned char, ubyte, UINT8_PTR) INOUT_TYPEMAP(short, short, short, INT16_PTR) INOUT_TYPEMAP(unsigned short, unsigned short, ushort, UINT16_PTR) INOUT_TYPEMAP(int, int, int, INT32_PTR) INOUT_TYPEMAP(unsigned int, unsigned int, uint, UINT32_PTR) INOUT_TYPEMAP(long, long, SWIG_LONG_DTYPE,INT32_PTR) INOUT_TYPEMAP(unsigned long, unsigned long, SWIG_ULONG_DTYPE,UINT32_PTR) INOUT_TYPEMAP(long long, long long, long, INT64_PTR) INOUT_TYPEMAP(unsigned long long, unsigned long long, ulong, UINT64_PTR) INOUT_TYPEMAP(float, float, float, FLOAT_PTR) INOUT_TYPEMAP(double, double, double, DOUBLE_PTR) INOUT_TYPEMAP(enum SWIGTYPE, unsigned int, int, INT32_PTR) %typemap(dtype) enum SWIGTYPE *INOUT, enum SWIGTYPE &INOUT "ref $*dclassname" #undef INOUT_TYPEMAP swig-3.0.12/Lib/d/wrapperloader.swg0000664000175000017500000001732713042756442016771 0ustar williamwilliam/* ----------------------------------------------------------------------------- * wrapperloader.swg * * Support code for dynamically linking the C wrapper library from the D * wrapper module. * * The loading code was adapted from the Derelict project and is used with * permission from Michael Parker, the original author. * ----------------------------------------------------------------------------- */ %pragma(d) wrapperloadercode = %{ private { version(linux) { version = Nix; } else version(darwin) { version = Nix; } else version(OSX) { version = Nix; } else version(FreeBSD) { version = Nix; version = freebsd; } else version(freebsd) { version = Nix; } else version(Unix) { version = Nix; } else version(Posix) { version = Nix; } version(Tango) { static import tango.stdc.string; static import tango.stdc.stringz; version (PhobosCompatibility) { } else { alias char[] string; alias wchar[] wstring; alias dchar[] dstring; } } else { version(D_Version2) { static import std.conv; } static import std.string; static import std.c.string; } version(D_Version2) { mixin("alias const(char)* CCPTR;"); } else { alias char* CCPTR; } CCPTR swigToCString(string str) { version(Tango) { return tango.stdc.stringz.toStringz(str); } else { return std.string.toStringz(str); } } string swigToDString(CCPTR cstr) { version(Tango) { return tango.stdc.stringz.fromStringz(cstr); } else { version(D_Version2) { mixin("return std.conv.to!string(cstr);"); } else { return std.c.string.toString(cstr); } } } } class SwigSwigSharedLibLoadException : Exception { this(in string[] libNames, in string[] reasons) { string msg = "Failed to load one or more shared libraries:"; foreach(i, n; libNames) { msg ~= "\n\t" ~ n ~ " - "; if(i < reasons.length) msg ~= reasons[i]; else msg ~= "Unknown"; } super(msg); } } class SwigSymbolLoadException : Exception { this(string SwigSharedLibName, string symbolName) { super("Failed to load symbol " ~ symbolName ~ " from shared library " ~ SwigSharedLibName); _symbolName = symbolName; } string symbolName() { return _symbolName; } private: string _symbolName; } private { version(Nix) { version(freebsd) { // the dl* functions are in libc on FreeBSD } else { pragma(lib, "dl"); } version(Tango) { import tango.sys.Common; } else version(linux) { import std.c.linux.linux; } else { extern(C) { const RTLD_NOW = 2; void *dlopen(CCPTR file, int mode); int dlclose(void* handle); void *dlsym(void* handle, CCPTR name); CCPTR dlerror(); } } alias void* SwigSharedLibHandle; SwigSharedLibHandle swigLoadSharedLib(string libName) { return dlopen(swigToCString(libName), RTLD_NOW); } void swigUnloadSharedLib(SwigSharedLibHandle hlib) { dlclose(hlib); } void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { return dlsym(hlib, swigToCString(symbolName)); } string swigGetErrorStr() { CCPTR err = dlerror(); if (err is null) { return "Unknown Error"; } return swigToDString(err); } } else version(Windows) { alias ushort WORD; alias uint DWORD; alias CCPTR LPCSTR; alias void* HMODULE; alias void* HLOCAL; alias int function() FARPROC; struct VA_LIST {} extern (Windows) { HMODULE LoadLibraryA(LPCSTR); FARPROC GetProcAddress(HMODULE, LPCSTR); void FreeLibrary(HMODULE); DWORD GetLastError(); DWORD FormatMessageA(DWORD, in void*, DWORD, DWORD, LPCSTR, DWORD, VA_LIST*); HLOCAL LocalFree(HLOCAL); } DWORD MAKELANGID(WORD p, WORD s) { return (((cast(WORD)s) << 10) | cast(WORD)p); } enum { LANG_NEUTRAL = 0, SUBLANG_DEFAULT = 1, FORMAT_MESSAGE_ALLOCATE_BUFFER = 256, FORMAT_MESSAGE_IGNORE_INSERTS = 512, FORMAT_MESSAGE_FROM_SYSTEM = 4096 } alias HMODULE SwigSharedLibHandle; SwigSharedLibHandle swigLoadSharedLib(string libName) { return LoadLibraryA(swigToCString(libName)); } void swigUnloadSharedLib(SwigSharedLibHandle hlib) { FreeLibrary(hlib); } void* swigGetSymbol(SwigSharedLibHandle hlib, string symbolName) { return GetProcAddress(hlib, swigToCString(symbolName)); } string swigGetErrorStr() { DWORD errcode = GetLastError(); LPCSTR msgBuf; DWORD i = FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), cast(LPCSTR)&msgBuf, 0, null); string text = swigToDString(msgBuf); LocalFree(cast(HLOCAL)msgBuf); if (i >= 2) { i -= 2; } return text[0 .. i]; } } else { static assert(0, "Operating system not supported by the wrapper loading code."); } final class SwigSharedLib { void load(string[] names) { if (_hlib !is null) return; string[] failedLibs; string[] reasons; foreach(n; names) { _hlib = swigLoadSharedLib(n); if (_hlib is null) { failedLibs ~= n; reasons ~= swigGetErrorStr(); continue; } _name = n; break; } if (_hlib is null) { throw new SwigSwigSharedLibLoadException(failedLibs, reasons); } } void* loadSymbol(string symbolName, bool doThrow = true) { void* sym = swigGetSymbol(_hlib, symbolName); if(doThrow && (sym is null)) { throw new SwigSymbolLoadException(_name, symbolName); } return sym; } void unload() { if(_hlib !is null) { swigUnloadSharedLib(_hlib); _hlib = null; } } private: string _name; SwigSharedLibHandle _hlib; } } static this() { string[] possibleFileNames; version (Posix) { version (OSX) { possibleFileNames ~= ["lib$wraplibrary.dylib", "lib$wraplibrary.bundle"]; } possibleFileNames ~= ["lib$wraplibrary.so"]; } else version (Windows) { possibleFileNames ~= ["$wraplibrary.dll", "lib$wraplibrary.so"]; } else { static assert(false, "Operating system not supported by the wrapper loading code."); } auto library = new SwigSharedLib; library.load(possibleFileNames); string bindCode(string functionPointer, string symbol) { return functionPointer ~ " = cast(typeof(" ~ functionPointer ~ "))library.loadSymbol(`" ~ symbol ~ "`);"; } //#if !defined(SWIG_D_NO_EXCEPTION_HELPER) mixin(bindCode("swigRegisterExceptionCallbacks$module", "SWIGRegisterExceptionCallbacks_$module")); //#endif // SWIG_D_NO_EXCEPTION_HELPER //#if !defined(SWIG_D_NO_STRING_HELPER) mixin(bindCode("swigRegisterStringCallback$module", "SWIGRegisterStringCallback_$module")); //#endif // SWIG_D_NO_STRING_HELPER $wrapperloaderbindcode } //#if !defined(SWIG_D_NO_EXCEPTION_HELPER) extern(C) void function( SwigExceptionCallback exceptionCallback, SwigExceptionCallback illegalArgumentCallback, SwigExceptionCallback illegalElementCallback, SwigExceptionCallback ioCallback, SwigExceptionCallback noSuchElementCallback) swigRegisterExceptionCallbacks$module; //#endif // SWIG_D_NO_EXCEPTION_HELPER //#if !defined(SWIG_D_NO_STRING_HELPER) extern(C) void function(SwigStringCallback callback) swigRegisterStringCallback$module; //#endif // SWIG_D_NO_STRING_HELPER %} %pragma(d) wrapperloaderbindcommand = %{ mixin(bindCode("$function", "$symbol"));%} swig-3.0.12/Lib/d/carrays.i0000664000175000017500000000502313042756442015204 0ustar williamwilliam/* ----------------------------------------------------------------------------- * carrays.i * * D-specific version of ../carrays.i. * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * %array_functions(TYPE,NAME) * * Generates functions for creating and accessing elements of a C array * (as pointers). Creates the following functions: * * TYPE *new_NAME(int nelements) * void delete_NAME(TYPE *); * TYPE NAME_getitem(TYPE *, int index); * void NAME_setitem(TYPE *, int index, TYPE value); * * ----------------------------------------------------------------------------- */ %define %array_functions(TYPE,NAME) %{ static TYPE *new_##NAME(int nelements) { %} #ifdef __cplusplus %{ return new TYPE[nelements](); %} #else %{ return (TYPE *) calloc(nelements,sizeof(TYPE)); %} #endif %{} static void delete_##NAME(TYPE *ary) { %} #ifdef __cplusplus %{ delete [] ary; %} #else %{ free(ary); %} #endif %{} static TYPE NAME##_getitem(TYPE *ary, int index) { return ary[index]; } static void NAME##_setitem(TYPE *ary, int index, TYPE value) { ary[index] = value; } %} TYPE *new_##NAME(int nelements); void delete_##NAME(TYPE *ary); TYPE NAME##_getitem(TYPE *ary, int index); void NAME##_setitem(TYPE *ary, int index, TYPE value); %enddef /* ----------------------------------------------------------------------------- * %array_class(TYPE,NAME) * * Generates a class wrapper around a C array. The class has the following * interface: * * struct NAME { * NAME(int nelements); * ~NAME(); * TYPE getitem(int index); * void setitem(int index, TYPE value); * TYPE * ptr(); * static NAME *frompointer(TYPE *t); * } * * ----------------------------------------------------------------------------- */ %define %array_class(TYPE,NAME) %{ typedef TYPE NAME; %} typedef struct {} NAME; %extend NAME { #ifdef __cplusplus NAME(int nelements) { return new TYPE[nelements](); } ~NAME() { delete [] self; } #else NAME(int nelements) { return (TYPE *) calloc(nelements,sizeof(TYPE)); } ~NAME() { free(self); } #endif TYPE getitem(int index) { return self[index]; } void setitem(int index, TYPE value) { self[index] = value; } TYPE * ptr() { return self; } static NAME *frompointer(TYPE *t) { return (NAME *) t; } }; %types(NAME = TYPE); %enddef swig-3.0.12/Lib/d/std_pair.i0000664000175000017500000000127713042756442015354 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T t, U u); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/d/dhead.swg0000664000175000017500000002064013042756442015157 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dhead.swg * * Support code for exceptions if the SWIG_D_NO_EXCEPTION_HELPER is not defined * Support code for strings if the SWIG_D_NO_STRING_HELPER is not defined * * Support code for function pointers. ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include /* Contract support. */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_DSetPendingException(SWIG_DException, msg); return nullreturn; } else %} /* * Exception support code. */ #if !defined(SWIG_D_NO_EXCEPTION_HELPER) %insert(runtime) %{ // Support for throwing D exceptions from C/C++. typedef enum { SWIG_DException = 0, SWIG_DIllegalArgumentException, SWIG_DIllegalElementException, SWIG_DIOException, SWIG_DNoSuchElementException } SWIG_DExceptionCodes; typedef void (* SWIG_DExceptionCallback_t)(const char *); typedef struct { SWIG_DExceptionCodes code; SWIG_DExceptionCallback_t callback; } SWIG_DException_t; static SWIG_DException_t SWIG_d_exceptions[] = { { SWIG_DException, NULL }, { SWIG_DIllegalArgumentException, NULL }, { SWIG_DIllegalElementException, NULL }, { SWIG_DIOException, NULL }, { SWIG_DNoSuchElementException, NULL } }; static void SWIGUNUSED SWIG_DSetPendingException(SWIG_DExceptionCodes code, const char *msg) { if ((size_t)code < sizeof(SWIG_d_exceptions)/sizeof(SWIG_DException_t)) { SWIG_d_exceptions[code].callback(msg); } else { SWIG_d_exceptions[SWIG_DException].callback(msg); } } #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGRegisterExceptionCallbacks_$module( SWIG_DExceptionCallback_t exceptionCallback, SWIG_DExceptionCallback_t illegalArgumentCallback, SWIG_DExceptionCallback_t illegalElementCallback, SWIG_DExceptionCallback_t ioCallback, SWIG_DExceptionCallback_t noSuchElementCallback) { SWIG_d_exceptions[SWIG_DException].callback = exceptionCallback; SWIG_d_exceptions[SWIG_DIllegalArgumentException].callback = illegalArgumentCallback; SWIG_d_exceptions[SWIG_DIllegalElementException].callback = illegalElementCallback; SWIG_d_exceptions[SWIG_DIOException].callback = ioCallback; SWIG_d_exceptions[SWIG_DNoSuchElementException].callback = noSuchElementCallback; } %} #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports=%{ // Exception throwing support currently requires Tango, but there is no reason // why it could not support Phobos. static import tango.core.Exception; static import tango.core.Thread; static import tango.stdc.stringz; %} %pragma(d) imdmodulecode=%{ private class SwigExceptionHelper { static this() { swigRegisterExceptionCallbacks$module( &setException, &setIllegalArgumentException, &setIllegalElementException, &setIOException, &setNoSuchElementException); } static void setException(char* message) { auto exception = new object.Exception(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIllegalArgumentException(char* message) { auto exception = new tango.core.Exception.IllegalArgumentException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIllegalElementException(char* message) { auto exception = new tango.core.Exception.IllegalElementException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setIOException(char* message) { auto exception = new tango.core.Exception.IOException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } static void setNoSuchElementException(char* message) { auto exception = new tango.core.Exception.NoSuchElementException(tango.stdc.stringz.fromStringz(message).dup); SwigPendingException.set(exception); } } package class SwigPendingException { public: static this() { m_sPendingException = new ThreadLocalData(null); } static bool isPending() { return m_sPendingException.val !is null; } static void set(object.Exception e) { auto pending = m_sPendingException.val; if (pending !is null) { e.next = pending; throw new object.Exception("FATAL: An earlier pending exception from C/C++ " ~ "code was missed and thus not thrown (" ~ pending.classinfo.name ~ ": " ~ pending.msg ~ ")!", e); } m_sPendingException.val = e; } static object.Exception retrieve() { auto e = m_sPendingException.val; m_sPendingException.val = null; return e; } private: // The reference to the pending exception (if any) is stored thread-local. alias tango.core.Thread.ThreadLocal!(object.Exception) ThreadLocalData; static ThreadLocalData m_sPendingException; } alias void function(char* message) SwigExceptionCallback; %} #else %pragma(d) imdmoduleimports=%{ static import std.conv; %} %pragma(d) imdmodulecode=%{ private class SwigExceptionHelper { static this() { // The D1/Tango version maps C++ exceptions to multiple exception types. swigRegisterExceptionCallbacks$module( &setException, &setException, &setException, &setException, &setException ); } static void setException(const char* message) { auto exception = new object.Exception(std.conv.to!string(message)); SwigPendingException.set(exception); } } package struct SwigPendingException { public: static this() { m_sPendingException = null; } static bool isPending() { return m_sPendingException !is null; } static void set(object.Exception e) { if (m_sPendingException !is null) { e.next = m_sPendingException; throw new object.Exception("FATAL: An earlier pending exception from C/C++ code " ~ "was missed and thus not thrown (" ~ m_sPendingException.classinfo.name ~ ": " ~ m_sPendingException.msg ~ ")!", e); } m_sPendingException = e; } static object.Exception retrieve() { auto e = m_sPendingException; m_sPendingException = null; return e; } private: // The reference to the pending exception (if any) is stored thread-local. static object.Exception m_sPendingException; } alias void function(const char* message) SwigExceptionCallback; %} #endif // Callback registering function in wrapperloader.swg. #endif // SWIG_D_NO_EXCEPTION_HELPER /* * String support code. */ #if !defined(SWIG_D_NO_STRING_HELPER) %insert(runtime) %{ // Callback for returning strings to D without leaking memory. typedef char * (* SWIG_DStringHelperCallback)(const char *); static SWIG_DStringHelperCallback SWIG_d_string_callback = NULL; #ifdef __cplusplus extern "C" #endif SWIGEXPORT void SWIGRegisterStringCallback_$module(SWIG_DStringHelperCallback callback) { SWIG_d_string_callback = callback; } %} #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports = "static import tango.stdc.stringz;"; %pragma(d) imdmodulecode = %{ private class SwigStringHelper { static this() { swigRegisterStringCallback$module(&createString); } static char* createString(char* cString) { // We are effectively dup'ing the string here. return tango.stdc.stringz.toStringz(tango.stdc.stringz.fromStringz(cString)); } } alias char* function(char* cString) SwigStringCallback; %} #else %pragma(d) imdmoduleimports = %{ static import std.conv; static import std.string; %} %pragma(d) imdmodulecode = %{ private class SwigStringHelper { static this() { swigRegisterStringCallback$module(&createString); } static const(char)* createString(const(char*) cString) { // We are effectively dup'ing the string here. // TODO: Is this also correct for D2/Phobos? return std.string.toStringz(std.conv.to!string(cString)); } } alias const(char)* function(const(char*) cString) SwigStringCallback; %} #endif // Callback registering function in wrapperloader.swg. #endif // SWIG_D_NO_STRING_HELPER /* * Function pointer support code. */ #if (SWIG_D_VERSION == 1) %pragma(d) imdmodulecode = %{ template SwigExternC(T) { static if (is(typeof(*(T.init)) R == return)) { static if (is(typeof(*(T.init)) P == function)) { alias extern(C) R function(P) SwigExternC; } } } %} #else %pragma(d) imdmodulecode = %{ template SwigExternC(T) if (is(typeof(*(T.init)) P == function)) { static if (is(typeof(*(T.init)) R == return)) { static if (is(typeof(*(T.init)) P == function)) { alias extern(C) R function(P) SwigExternC; } } } %} #endif swig-3.0.12/Lib/d/stl.i0000664000175000017500000000054513042756442014346 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/d/dvoid.swg0000664000175000017500000000105713042756442015220 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dvoid.swg * * Typemaps for handling void function return types and empty parameter lists. * ----------------------------------------------------------------------------- */ %typemap(ctype) void "void" %typemap(imtype) void "void" %typemap(dtype, cprimitive="1") void "void" %typemap(out, null="") void "" %typemap(ddirectorin) void "$winput" %typemap(ddirectorout) void "$dcall" %typemap(directorin) void "" %typemap(dout, excode=SWIGEXCODE) void { $imcall;$excode } swig-3.0.12/Lib/d/dexception.swg0000664000175000017500000000222613042756442016254 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dexception.swg * * Typemaps used for propagating C++ exceptions to D. * ----------------------------------------------------------------------------- */ // Code which is inserted into the dout typemaps and class constructors via // excode if exceptions can be thrown. %define SWIGEXCODE "\n if ($imdmodule.SwigPendingException.isPending) throw $imdmodule.SwigPendingException.retrieve();" %enddef %typemap(throws, canthrow=1) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_DSetPendingException(SWIG_DException, error_msg); return $null; %} %typemap(throws, canthrow=1) SWIGTYPE, SWIGTYPE &, SWIGTYPE *, SWIGTYPE [ANY], enum SWIGTYPE, const enum SWIGTYPE & %{ (void)$1; SWIG_DSetPendingException(SWIG_DException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws, canthrow=1) char * %{ SWIG_DSetPendingException(SWIG_DException, $1); return $null; %} swig-3.0.12/Lib/d/d.swg0000664000175000017500000000250513042756442014335 0ustar williamwilliam/* ----------------------------------------------------------------------------- * d.swg * * Main library file for the D language module. See the D chapter in the SWIG * manual for explanation on the typemaps, pragmas, etc. used. * ----------------------------------------------------------------------------- */ // Typemaps for exception handling. %include // Typemaps for primitive types. %include // Typemaps for non-primitive types (C/C++ classes and structs). %include // Typemaps for enumeration types. %include // Typemaps for member function pointers. %include // Typemaps for wrapping pointers to/arrays of C chars as D strings. %include // Typemaps for handling void function return types and empty parameter lists. %include // Typemaps containing D code used when generating D proxy classes. %include // Mapping of C++ operator overloading methods to D. %include // Helper code string and exception handling. %include // Wrapper loader code for dynamically linking the C wrapper library from the D // wrapper module. %include // List of all reserved D keywords. %include // D-specific directives. %include swig-3.0.12/Lib/d/std_string.i0000664000175000017500000000604513042756442015725 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * Typemaps for std::string and const std::string& * These are mapped to a D char[] and are passed around by value. * * To use non-const std::string references, use the following %apply. Note * that they are passed by value. * %apply const std::string & {std::string &}; * ----------------------------------------------------------------------------- */ %{ #include %} namespace std { %naturalvar string; class string; %define SWIGD_STD_STRING_TYPEMAPS(DW_STRING_TYPE, DP_STRING_TYPE, FROM_STRINGZ, TO_STRINGZ) // string %typemap(ctype) string, const string & "char *" %typemap(imtype) string, const string & #DW_STRING_TYPE %typemap(dtype) string, const string & #DP_STRING_TYPE %typemap(in, canthrow=1) string, const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $1.assign($input); %} %typemap(in, canthrow=1) const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $*1_ltype $1_str($input); $1 = &$1_str; %} %typemap(out) string %{ $result = SWIG_d_string_callback($1.c_str()); %} %typemap(out) const string & %{ $result = SWIG_d_string_callback($1->c_str()); %} %typemap(din) string, const string & "($dinput ? TO_STRINGZ($dinput) : null)" %typemap(dout, excode=SWIGEXCODE) string, const string & { DP_STRING_TYPE ret = FROM_STRINGZ($imcall);$excode return ret; } %typemap(directorin) string, const string & %{ $input = SWIG_d_string_callback($1.c_str()); %} %typemap(directorout, canthrow=1) string %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } $result.assign($input); %} %typemap(directorout, canthrow=1, warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if (!$input) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "null string"); return $null; } /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $input; $result = &$1_str; %} %typemap(ddirectorin) string, const string & "FROM_STRINGZ($winput)" %typemap(ddirectorout) string, const string & "TO_STRINGZ($dcall)" %typemap(throws, canthrow=1) string, const string & %{ SWIG_DSetPendingException(SWIG_DException, $1.c_str()); return $null; %} %typemap(typecheck) string, const string & = char *; %enddef // We need to have the \0-terminated string conversion functions available in // the D proxy modules. #if (SWIG_D_VERSION == 1) // Could be easily extended to support Phobos as well. SWIGD_STD_STRING_TYPEMAPS(char*, char[], tango.stdc.stringz.fromStringz, tango.stdc.stringz.toStringz) %pragma(d) globalproxyimports = "static import tango.stdc.stringz;"; #else SWIGD_STD_STRING_TYPEMAPS(const(char)*, string, std.conv.to!string, std.string.toStringz) %pragma(d) globalproxyimports = %{ static import std.conv; static import std.string; %} #endif #undef SWIGD_STD_STRING_TYPEMAPS } // namespace std swig-3.0.12/Lib/d/dprimitives.swg0000664000175000017500000001077613042756442016462 0ustar williamwilliam/* ----------------------------------------------------------------------------- * dprimitves.swg * * Typemaps for primitive types. * ----------------------------------------------------------------------------- */ // C long/ulong width depends on the target arch, use stdlib aliases for them. #if (SWIG_D_VERSION == 1) %pragma(d) imdmoduleimports = "static import tango.stdc.config;" %pragma(d) globalproxyimports = "static import tango.stdc.config;" #define SWIG_LONG_DTYPE tango.stdc.config.c_long #define SWIG_ULONG_DTYPE tango.stdc.config.c_ulong #else %pragma(d) imdmoduleimports = "static import core.stdc.config;" %pragma(d) globalproxyimports = "static import core.stdc.config;" #define SWIG_LONG_DTYPE core.stdc.config.c_long #define SWIG_ULONG_DTYPE core.stdc.config.c_ulong #endif /* * The SWIG_D_PRIMITIVE macro is used to define the typemaps for the primitive * types, because are more or less the same for all of them. The few special * cases are handeled below. */ %define SWIG_D_PRIMITIVE(TYPE, DTYPE) %typemap(ctype) TYPE, const TYPE & "TYPE" %typemap(imtype) TYPE, const TYPE & "DTYPE" %typemap(dtype, cprimitive="1") TYPE, const TYPE & "DTYPE" %typemap(in) TYPE "$1 = ($1_ltype)$input;" %typemap(out) TYPE "$result = $1;" %typemap(directorin) TYPE "$input = $1;" %typemap(directorout) TYPE "$result = ($1_ltype)$input;" %typemap(ddirectorin) TYPE "$winput" %typemap(ddirectorout) TYPE "$dcall" %typemap(in) const TYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const TYPE & "$result = *$1;" %typemap(directorin) const TYPE & "$input = $1;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const TYPE & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(ddirectorin) const TYPE & "$winput" %typemap(ddirectorout) const TYPE & "$dcall" %typemap(din) TYPE, const TYPE & "$dinput" %typemap(dout, excode=SWIGEXCODE) TYPE, const TYPE & { auto ret = $imcall;$excode return ret; } %enddef SWIG_D_PRIMITIVE(bool, bool) SWIG_D_PRIMITIVE(char, char) SWIG_D_PRIMITIVE(signed char, byte) SWIG_D_PRIMITIVE(unsigned char, ubyte) SWIG_D_PRIMITIVE(short, short) SWIG_D_PRIMITIVE(unsigned short, ushort) SWIG_D_PRIMITIVE(int, int) SWIG_D_PRIMITIVE(unsigned int, uint) SWIG_D_PRIMITIVE(long, SWIG_LONG_DTYPE) SWIG_D_PRIMITIVE(unsigned long, SWIG_ULONG_DTYPE) SWIG_D_PRIMITIVE(size_t, size_t) SWIG_D_PRIMITIVE(long long, long) SWIG_D_PRIMITIVE(unsigned long long, ulong) SWIG_D_PRIMITIVE(float, float) SWIG_D_PRIMITIVE(double, double) // The C++ boolean type needs some special casing since it is not part of the // C standard and is thus represented as unsigned int in the C wrapper layer. %typemap(ctype) bool, const bool & "unsigned int" %typemap(imtype) bool, const bool & "uint" %typemap(in) bool "$1 = $input ? true : false;" %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout) bool "$result = $input ? true : false;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(ddirectorin) bool "($winput ? true : false)" %typemap(dout, excode=SWIGEXCODE) bool, const bool & { bool ret = $imcall ? true : false;$excode return ret; } // Judging from the history of the C# module, the explicit casts are needed for // certain versions of VC++. %typemap(out) unsigned long "$result = (unsigned long)$1;" %typemap(out) const unsigned long & "$result = (unsigned long)*$1;" /* * Typecheck typemaps. */ %typecheck(SWIG_TYPECHECK_BOOL) bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_UINT8) unsigned char, const unsigned char & "" %typecheck(SWIG_TYPECHECK_INT16) short, const short & "" %typecheck(SWIG_TYPECHECK_UINT16) unsigned short, const unsigned short & "" %typecheck(SWIG_TYPECHECK_INT32) int, long, const int &, const long & "" %typecheck(SWIG_TYPECHECK_UINT32) unsigned int, unsigned long, const unsigned int &, const unsigned long & "" %typecheck(SWIG_TYPECHECK_INT64) long long, const long long & "" %typecheck(SWIG_TYPECHECK_UINT64) unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & "" swig-3.0.12/Lib/d/denums.swg0000664000175000017500000000362113042756442015405 0ustar williamwilliam/* ----------------------------------------------------------------------------- * denums.swg * * Typemaps for enumerations. * ----------------------------------------------------------------------------- */ /* * Typemaps for enumeration types. */ %typemap(ctype) enum SWIGTYPE "int" %typemap(imtype) enum SWIGTYPE "int" %typemap(dtype, cprimitive="1") enum SWIGTYPE "$dclassname" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (int)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin) enum SWIGTYPE "$input = (int)$1;" %typemap(ddirectorin) enum SWIGTYPE "cast($dclassname)$winput" %typemap(ddirectorout) enum SWIGTYPE "cast(int)$dcall" %typemap(din) enum SWIGTYPE "cast(int)$dinput" %typemap(dout, excode=SWIGEXCODE) enum SWIGTYPE { $dclassname ret = cast($dclassname)$imcall;$excode return ret; } /* * Typemaps for (const) references to enumeration types. */ %typemap(ctype) const enum SWIGTYPE & "int" %typemap(imtype) const enum SWIGTYPE & "int" %typemap(dtype) const enum SWIGTYPE & "$*dclassname" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (int)*$1; %} %typemap(directorin) const enum SWIGTYPE & "$input = (int)$1;" %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(ddirectorin) const enum SWIGTYPE & "cast($*dclassname)$winput" %typemap(ddirectorout) const enum SWIGTYPE & "cast(int)$dcall" %typemap(din) const enum SWIGTYPE & "cast(int)$dinput" %typemap(dout, excode=SWIGEXCODE) const enum SWIGTYPE & { $*dclassname ret = cast($*dclassname)$imcall;$excode return ret; } swig-3.0.12/Lib/d/std_map.i0000664000175000017500000000332113042756442015166 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; } swig-3.0.12/Lib/d/boost_shared_ptr.i0000664000175000017500000002004013042756442017075 0ustar williamwilliam%include %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ((*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\"))) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // plain value %typemap(in, canthrow=1) CONST TYPE ($&1_type argp = 0) %{ argp = ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0; if (!argp) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in, canthrow=1) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ $result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in, canthrow=1) CONST TYPE & %{ $1 = ($1_ltype)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); if (!$1) { SWIG_DSetPendingException(SWIG_DIllegalArgumentException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)(((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input) ? ((SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ $result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ if ($input) $1 = *($&1_ltype)$input; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ $result = $1 ? new $1_ltype($1) : 0; %} // shared_ptr by reference %typemap(in, canthrow=1) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ $result = *$1 ? new $*1_ltype(*$1) : 0; %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? ($1_ltype)$input : &tempnull; %} %typemap(out, fragment="SWIG_null_deleter") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ $result = ($1 && *$1) ? new $*1_ltype(*($1_ltype)$1) : 0; if ($owner) delete $1; %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (ctype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void *" %typemap (imtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "void*" %typemap (dtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(dtype, TYPE)" %typemap(din) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(dtype, TYPE).swigGetCPtr($dinput)" %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE { auto ret = new $typemap(dtype, TYPE)($imcall, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE & { auto ret = new $typemap(dtype, TYPE)($imcall, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) CONST TYPE * { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } %typemap(dout, excode=SWIGEXCODE) TYPE *CONST& { void* cPtr = $imcall; auto ret = (cPtr is null) ? null : new $typemap(dtype, TYPE)(cPtr, true);$excode return ret; } // For shared pointers, both the derived and the base class have to »own« their // pointer; otherwise the reference count is not decreased properly on destruction. %typemap(dbody) SWIGTYPE %{ private void* swigCPtr; private bool swigCMemOwn; public this(void* cObject, bool ownCObject) { swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } %} %typemap(dbody_derived) SWIGTYPE %{ private void* swigCPtr; private bool swigCMemOwn; public this(void* cObject, bool ownCObject) { super($imdmodule.$dclazznameSmartPtrUpcast(cObject), ownCObject); swigCPtr = cObject; swigCMemOwn = ownCObject; } public static void* swigGetCPtr(typeof(this) obj) { return (obj is null) ? null : obj.swigCPtr; } %} %typemap(ddispose, methodname="dispose", methodmodifiers="public") TYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; } } } %typemap(ddispose_derived, methodname="dispose", methodmodifiers="public") TYPE { synchronized(this) { if (swigCPtr !is null) { if (swigCMemOwn) { swigCMemOwn = false; $imcall; } swigCPtr = null; super.dispose(); } } } %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/swigerrors.swg0000664000175000017500000000076313042756442016101 0ustar williamwilliam/* Errors in SWIG */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 swig-3.0.12/Lib/octave/0000775000175000017500000000000013042756442014424 5ustar williamwilliamswig-3.0.12/Lib/octave/octcontainer.swg0000664000175000017500000003766713042756442017661 0ustar williamwilliam/* ----------------------------------------------------------------------------- * octcontainer.swg * * Octave cell <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Octave, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include // The Octave C++ Wrap %fragment(""); %include %fragment(SWIG_Traits_frag(octave_value),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "octave_value"; } }; template <> struct traits_from { typedef octave_value value_type; static octave_value from(const value_type& val) { return val; } }; template <> struct traits_check { static bool check(const octave_value&) { return true; } }; template <> struct traits_asval { typedef octave_value value_type; static int asval(const octave_value& obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment("OctSequence_Base","header",fragment="") { %#include namespace std { template <> struct less { bool operator()(const octave_value& v, const octave_value& w) const { octave_value res = do_binary_op(octave_value::op_le,v,w); return res.is_true(); } }; } namespace swig { inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %fragment("OctSequence_Cont","header", fragment="StdTraits", fragment="OctSequence_Base", fragment="OctSwigIterator_T") { namespace swig { template struct OctSequence_Ref // * octave can't support these, because of how assignment works { OctSequence_Ref(const octave_value& seq, int index) : _seq(seq), _index(index) { } operator T () const { // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, _index); octave_value item; // * todo try { return swig::as(item, true); } catch (std::exception& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", _index); if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } SWIG_Octave_AddErrorMsg(msg); SWIG_Octave_AddErrorMsg(e.what()); throw; } } OctSequence_Ref& operator=(const T& v) { // OctSequence_SetItem(_seq, _index, swig::from(v)); // * todo return *this; } private: octave_value _seq; int _index; }; template struct OctSequence_ArrowProxy { OctSequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct OctSequence_InputIterator { typedef OctSequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef int difference_type; OctSequence_InputIterator() { } OctSequence_InputIterator(const octave_value& seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } OctSequence_ArrowProxy operator->() const { return OctSequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: octave_value _seq; difference_type _index; }; template struct OctSequence_Cont { typedef OctSequence_Ref reference; typedef const OctSequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef OctSequence_InputIterator iterator; typedef OctSequence_InputIterator const_iterator; OctSequence_Cont(const octave_value& seq) : _seq(seq) { // * assert that we have map type etc. /* if (!OctSequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); } _seq = seq; Py_INCREF(_seq); */ } ~OctSequence_Cont() { } size_type size() const { // return static_cast(OctSequence_Size(_seq)); return 0; // * todo } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check(bool set_err = true) const { int s = size(); for (int i = 0; i < s; ++i) { // swig::SwigVar_PyObject item = OctSequence_GetItem(_seq, i); octave_value item; // * todo if (!swig::check(item)) { if (set_err) { char msg[1024]; sprintf(msg, "in sequence element %d", i); SWIG_Error(SWIG_RuntimeError, msg); } return false; } } return true; } private: octave_value _seq; }; } } %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="OctSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,fragment="OctSequence_Cont") std::pair, std::pair { octave_value_list tmpc; tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).second), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); $result = Cell(tmpc); } %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="OctSequence_Cont") {} %typemap(out,fragment="OctPairBoolOutputIterator") std::pair, std::pair { octave_value_list tmpc; tmpc.append(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::OctSwigIterator::descriptor(),SWIG_POINTER_OWN)); tmpc.append(SWIG_From(bool)(%static_cast($1,const $type &).second)); $result = Cell(tmpc); } %typemap(in,noblock=1,fragment="OctSequence_Cont") iterator(swig::OctSwigIterator *iter = 0, int res), reverse_iterator(swig::OctSwigIterator *iter = 0, int res), const_iterator(swig::OctSwigIterator *iter = 0, int res), const_reverse_iterator(swig::OctSwigIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::OctSwigIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::OctSwigIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="OctSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::OctSwigIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::OctSwigIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("OctSequence_Cont"); #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef // The octave container methods %define %swig_container_methods(Container...) %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("OctSequence_Base"); %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } value_type __paren__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __paren_asgn__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } void append(value_type x) { self->push_back(x); } } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="OctSequence_Cont") { namespace swig { template inline void assign(const OctSeq& octseq, Seq* seq) { %#ifdef SWIG_STD_NOASSIGN_STL typedef typename OctSeq::value_type value_type; typename OctSeq::const_iterator it = octseq.begin(); for (;it != octseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } %#else seq->assign(octseq.begin(), octseq.end()); %#endif } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(const octave_value& obj, sequence **seq) { if (!obj.is_defined() || Swig::swig_value_deref(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } else if (obj.is_cell()) { try { OctSequence_Cont octseq(obj); if (seq) { sequence *pseq = new sequence(); assign(octseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return octseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq&&!error_state) error("swig type error: %s",e.what()); return SWIG_ERROR; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static octave_value from(const sequence& seq) { #ifdef SWIG_OCTAVE_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } #endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { Cell c(size,1); int i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { c(i) = swig::from(*it); } return c; } else { error("swig overflow error: sequence size not valid in octave"); return octave_value(); } return octave_value(); } }; } } swig-3.0.12/Lib/octave/std_complex.i0000664000175000017500000000072613042756442017124 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-3.0.12/Lib/octave/std_deque.i0000664000175000017500000000124713042756442016557 0ustar williamwilliam// Deques %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(octave_value obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static octave_value from(const std::deque & vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/octave/octstdcommon.swg0000664000175000017500000001416413042756442017665 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { // Traits that provides the from method template struct traits_from_ptr { static octave_value from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static octave_value from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static octave_value from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static octave_value from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline octave_value from(const Type& val) { return traits_from::from(val); } template inline octave_value from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } // Traits that provides the asval/as/check method template struct traits_asptr { static int asptr(const octave_value& obj, Type **val) { Type *p; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(const octave_value& obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(const octave_value& obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(const octave_value& obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(const octave_value& obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(const octave_value& obj, bool throw_error) { Type v; int res = asval(obj, &v); if (!obj.is_defined() || !SWIG_IsOK(res)) { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } if (throw_error) throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(const octave_value& obj, bool throw_error) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { // Uninitialized return value, no Type() constructor required. static Type *v_def = (Type*) malloc(sizeof(Type)); if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } if (throw_error) throw std::invalid_argument("bad type"); memset(v_def,0,sizeof(Type)); return *v_def; } } }; template struct traits_as { static Type* as(const octave_value& obj, bool throw_error) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { if (!Octave_Error_Occurred()) { %type_error(swig::type_name()); } if (throw_error) throw std::invalid_argument("bad type"); return 0; } } }; template inline Type as(const octave_value& obj, bool te = false) { return traits_as::category>::as(obj, te); } template struct traits_check { static bool check(const octave_value& obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(const octave_value& obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(const octave_value& obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(const octave_value& obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static octave_value from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(const octave_value& obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-3.0.12/Lib/octave/director.swg0000664000175000017500000000573413042756442016772 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Octave proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) #include namespace Swig { class Director { octave_swig_type *self; bool swig_disowned; Director(const Director &x); Director &operator=(const Director &rhs); public: Director(void *vptr):self(0), swig_disowned(false) { set_rtdir(vptr, this); } ~Director() { swig_director_destroyed(self, this); if (swig_disowned) self->decref(); } void swig_set_self(octave_swig_type *new_self) { assert(!swig_disowned); self = new_self; } octave_swig_type *swig_get_self() const { return self; } void swig_disown() { if (swig_disowned) return; swig_disowned = true; self->incref(); } }; struct DirectorTypeMismatchException { static void raise(const char *msg) { // ... todo throw(DirectorTypeMismatchException()); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; struct DirectorPureVirtualException { static void raise(const char *msg) { // ... todo throw(DirectorPureVirtualException()); } static void raise(const octave_value &ov, const char *msg) { // ... todo raise(msg); } }; SWIGINTERN rtdir_map *get_rtdir_map() { static swig_module_info *module = 0; if (!module) module = SWIG_GetModule(0); if (!module) return 0; if (!module->clientdata) module->clientdata = new rtdir_map; return (rtdir_map *) module->clientdata; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d) { rtdir_map *rm = get_rtdir_map(); if (rm) (*rm)[vptr] = d; } SWIGINTERNINLINE void erase_rtdir(void *vptr) { rtdir_map *rm = get_rtdir_map(); if (rm) (*rm).erase(vptr); } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { rtdir_map *rm = get_rtdir_map(); if (!rm) return 0; rtdir_map::const_iterator pos = rm->find(vptr); Director *rtdir = (pos != rm->end())? pos->second : 0; return rtdir; } SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d) { self->director_destroyed(d); } SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d) { return d->swig_get_self(); } SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self) { d->swig_set_self(self); } } SWIGRUNTIME void swig_acquire_ownership(void *vptr) { // assert(0); // ... todo } SWIGRUNTIME void swig_acquire_ownership_array(void *vptr) { // assert(0); // ... todo } SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own) { // assert(0); // ... todo } swig-3.0.12/Lib/octave/std_shared_ptr.i0000664000175000017500000000010413042756442017576 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-3.0.12/Lib/octave/octopers.swg0000664000175000017500000000510113042756442017001 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus // operators supported in Octave, and the methods they are routed to // __brace__ a{args} // __brace_asgn__ a{args} = rhs // __paren__ a(args) // __paren_asgn__ a(args) = rhs // __str__ generates string rep // __not__ !a // __uplus__ +a // __uminus__ -a // __transpose__ a.' // __hermitian__ a' // __incr__ a++ // __decr__ a-- // __add__ a + b // __sub__ a - b // __mul__ a * b // __div__ a / b // __pow__ a ^ b // __ldiv__ a \ b // __lt__ a < b // __le__ a <= b // __eq__ a == b // __ge__ a >= b // __gt__ a > b // __ne__ a != b // __el_mul__ a .* b // __el_div__ a ./ b // __el_pow__ a .^ b // __el_ldiv__ a .\ b // __el_and__ a & b // __el_or__ a | b // operators supported in C++, and the methods that route to them %rename(__add__) *::operator+; %rename(__add__) *::operator+(); %rename(__add__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__uminus__) *::operator-(); %rename(__uminus__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__el_and__) *::operator&&; %rename(__el_or__) *::operator||; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; %rename(__ne__) *::operator!=; %rename(__not__) *::operator!; %rename(__incr__) *::operator++; %rename(__decr__) *::operator--; %rename(__paren__) *::operator(); %rename(__brace__) *::operator[]; // Ignored inplace operators %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; // Ignored operators %ignoreoperator(EQ) operator=; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(LSHIFT) operator<<; %ignoreoperator(RSHIFT) operator>>; #endif /* __cplusplus */ swig-3.0.12/Lib/octave/std_vector.i0000664000175000017500000000127413042756442016756 0ustar williamwilliam// Vectors %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const octave_value& obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static octave_value from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/octave/octave.swg0000664000175000017500000000033613042756442016431 0ustar williamwilliam%include %include %include %include %include %include %define %docstring %feature("docstring") %enddef swig-3.0.12/Lib/octave/std_alloc.i0000664000175000017500000000003313042756442016536 0ustar williamwilliam%include swig-3.0.12/Lib/octave/octfragments.swg0000664000175000017500000000000113042756442017631 0ustar williamwilliam swig-3.0.12/Lib/octave/std_container.i0000664000175000017500000000007313042756442017432 0ustar williamwilliam%include %include swig-3.0.12/Lib/octave/std_carray.i0000664000175000017500000000000013042756442016717 0ustar williamwilliamswig-3.0.12/Lib/octave/std_wstring.i0000664000175000017500000000004313042756442017142 0ustar williamwilliam%include swig-3.0.12/Lib/octave/attribute.i0000664000175000017500000000004213042756442016575 0ustar williamwilliam%include swig-3.0.12/Lib/octave/cmalloc.i0000664000175000017500000000004013042756442016202 0ustar williamwilliam%include swig-3.0.12/Lib/octave/std_basic_string.i0000664000175000017500000000441513042756442020123 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING #define SWIG_STD_MODERN_STL %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(octave_value obj, std::string **val) { if (obj.is_string()) { if (val) *val = new std::string(obj.string_value()); return SWIG_NEWOBJ; } if (val) error("a string is expected"); return 0; } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE octave_value SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %ignore std::basic_string::operator +=; %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(PyObject* obj, std::wstring **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::wstring *vptr; if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { PyErr_Clear(); wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) { if (buf) { if (val) *val = new std::wstring(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } else { PyErr_Clear(); } if (val) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_TypeError,"a wstring is expected"); SWIG_PYTHON_THREAD_END_BLOCK; } return 0; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-3.0.12/Lib/octave/octiterators.swg0000664000175000017500000002164013042756442017673 0ustar williamwilliam/* ----------------------------------------------------------------------------- * octiterators.swg * * Users can derive form the OctSwigIterator to implemet their * own iterators. As an example (real one since we use it for STL/STD * containers), the template OctSwigIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("OctSwigIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct OctSwigIterator { private: octave_value _seq; protected: OctSwigIterator(octave_value seq) : _seq(seq) { } public: virtual ~OctSwigIterator() {} virtual octave_value value() const = 0; virtual OctSwigIterator *incr(size_t n = 1) = 0; virtual OctSwigIterator *decr(size_t n = 1) { throw stop_iteration(); } virtual ptrdiff_t distance(const OctSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const OctSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual OctSwigIterator *copy() const = 0; octave_value next() { octave_value obj = value(); incr(); return obj; } octave_value previous() { decr(); return value(); } OctSwigIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const OctSwigIterator& x) const { return equal(x); } bool operator != (const OctSwigIterator& x) const { return ! operator==(x); } OctSwigIterator* operator ++ () { incr(); return this; } OctSwigIterator* operator -- () { decr(); return this; } OctSwigIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } OctSwigIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const OctSwigIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::OctSwigIterator *"); init = 1; } return desc; } }; } } %fragment("OctSwigIterator_T","header",fragment="",fragment="OctSwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class OctSwigIterator_T : public OctSwigIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef OctSwigIterator_T self_type; OctSwigIterator_T(out_iterator curr, octave_value seq) : OctSwigIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const OctSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const OctSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class OctSwigIteratorOpen_T : public OctSwigIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef OctSwigIterator_T base; typedef OctSwigIteratorOpen_T self_type; OctSwigIteratorOpen_T(out_iterator curr, octave_value seq) : OctSwigIterator_T(curr, seq) { } octave_value value() const { return from(static_cast(*(base::current))); } OctSwigIterator *copy() const { return new self_type(*this); } OctSwigIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } OctSwigIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class OctSwigIteratorClosed_T : public OctSwigIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef OctSwigIterator_T base; typedef OctSwigIteratorClosed_T self_type; OctSwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, octave_value seq) : OctSwigIterator_T(curr, seq), begin(first), end(last) { } octave_value value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } OctSwigIterator *copy() const { return new self_type(*this); } OctSwigIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } OctSwigIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { throw stop_iteration(); } else { --base::current; } } return this; } private: out_iterator begin; out_iterator end; }; template inline OctSwigIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, octave_value seq = octave_value()) { return new OctSwigIteratorClosed_T(current, begin, end, seq); } template inline OctSwigIterator* make_output_iterator(const OutIter& current, octave_value seq = octave_value()) { return new OctSwigIteratorOpen_T(current, seq); } } } %fragment("OctSwigIterator"); namespace swig { // Throw a StopIteration exception %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { error("stop_iteration exception"); SWIG_fail; } // Mark methods that return new objects %newobject OctSwigIterator::copy; %newobject OctSwigIterator::operator + (ptrdiff_t n) const; %newobject OctSwigIterator::operator - (ptrdiff_t n) const; %nodirector OctSwigIterator; %catches(swig::stop_iteration) OctSwigIterator::value() const; %catches(swig::stop_iteration) OctSwigIterator::incr(size_t n = 1); %catches(swig::stop_iteration) OctSwigIterator::decr(size_t n = 1); %catches(std::invalid_argument) OctSwigIterator::distance(const OctSwigIterator &x) const; %catches(std::invalid_argument) OctSwigIterator::equal (const OctSwigIterator &x) const; %catches(swig::stop_iteration) OctSwigIterator::next(); %catches(swig::stop_iteration) OctSwigIterator::previous(); %catches(swig::stop_iteration) OctSwigIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) OctSwigIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) OctSwigIterator::operator - (ptrdiff_t n) const; struct OctSwigIterator { protected: OctSwigIterator(octave_value seq); public: virtual ~OctSwigIterator(); virtual octave_value value() const = 0; virtual OctSwigIterator *incr(size_t n = 1) = 0; virtual OctSwigIterator *decr(size_t n = 1); virtual ptrdiff_t distance(const OctSwigIterator &x) const; virtual bool equal (const OctSwigIterator &x) const; virtual OctSwigIterator *copy() const = 0; octave_value next(); octave_value previous(); OctSwigIterator *advance(ptrdiff_t n); bool operator == (const OctSwigIterator& x) const; bool operator != (const OctSwigIterator& x) const; OctSwigIterator* operator ++ (); OctSwigIterator* operator -- (); OctSwigIterator* operator + (ptrdiff_t n) const; OctSwigIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const OctSwigIterator& x) const; }; } swig-3.0.12/Lib/octave/implicit.i0000664000175000017500000000043713042756442016414 0ustar williamwilliam%include %include #warning "This file provides the %implicit directive, which is an old and fragile" #warning "way to implement the C++ implicit conversion mechanism." #warning "Try using the more robust '%implicitconv Type;' directive instead." swig-3.0.12/Lib/octave/std_common.i0000664000175000017500000000443013042756442016741 0ustar williamwilliam%include %include // Generate the traits for a 'primitive' type, such as 'double', // for which the SWIG_AsVal and SWIG_From methods are already defined. %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(octave_value obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static octave_value from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(octave_value obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static octave_value from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-3.0.12/Lib/octave/std_except.i0000664000175000017500000000004313042756442016735 0ustar williamwilliam%include swig-3.0.12/Lib/octave/octprimtypes.swg0000664000175000017500000001323313042756442017712 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ // boolean %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(bool)(bool value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(const octave_value& ov, bool *val) { if (!ov.is_bool_type()) return SWIG_ERROR; if (val) *val = ov.bool_value(); return SWIG_OK; } } // long %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(long) (long value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(long),"header") { SWIGINTERN int SWIG_AsVal_dec(long)(const octave_value& ov, long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v!=floor(v)) return SWIG_TypeError; } if (val) *val = ov.long_value(); return SWIG_OK; } } // unsigned long %fragment(SWIG_From_frag(unsigned long),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(unsigned long) (unsigned long value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(const octave_value& ov, unsigned long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v<0) return SWIG_OverflowError; if (v!=floor(v)) return SWIG_TypeError; } if (ov.is_int8_type()||ov.is_int16_type()|| ov.is_int32_type()) { long v=ov.long_value(); if (v<0) return SWIG_OverflowError; } if (ov.is_int64_type()) { long long v=ov.int64_scalar_value().value(); if (v<0) return SWIG_OverflowError; } if (val) *val = ov.ulong_value(); return SWIG_OK; } } // long long %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE octave_value SWIG_From_dec(long long) (long long value) { return octave_int64(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(const octave_value& ov, long long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v!=floor(v)) return SWIG_TypeError; } if (val) { if (ov.is_int64_type()) *val = ov.int64_scalar_value().value(); else if (ov.is_uint64_type()) *val = ov.uint64_scalar_value().value(); else *val = ov.long_value(); } return SWIG_OK; } %#endif } %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE octave_value SWIG_From_dec(unsigned long long) (unsigned long long value) { return octave_uint64(value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(const octave_value& ov, unsigned long long* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (ov.is_double_type()||ov.is_single_type()) { double v=ov.double_value(); if (v<0) return SWIG_OverflowError; if (v!=floor(v)) return SWIG_TypeError; } if (ov.is_int8_type()||ov.is_int16_type()|| ov.is_int32_type()) { long v=ov.long_value(); if (v<0) return SWIG_OverflowError; } if (ov.is_int64_type()) { long long v=ov.int64_scalar_value().value(); if (v<0) return SWIG_OverflowError; } if (val) { if (ov.is_int64_type()) *val = ov.int64_scalar_value().value(); else if (ov.is_uint64_type()) *val = ov.uint64_scalar_value().value(); else *val = ov.long_value(); } return SWIG_OK; } %#endif } // double %fragment(SWIG_From_frag(double),"header") { SWIGINTERNINLINE octave_value SWIG_From_dec(double) (double value) { return octave_value(value); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(const octave_value& ov, double* val) { if (!ov.is_scalar_type()) return SWIG_TypeError; if (ov.is_complex_scalar()) return SWIG_TypeError; if (val) *val = ov.double_value(); return SWIG_OK; } } // const char* (strings) %fragment("SWIG_AsCharPtrAndSize","header") { SWIGINTERN int SWIG_AsCharPtrAndSize(octave_value ov, char** cptr, size_t* psize, int *alloc) { if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_string()) return SWIG_TypeError; std::string str=ov.string_value(); size_t len=str.size(); char* cstr=(char*)str.c_str(); if (alloc) { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else if (cptr) *cptr = cstr; if (psize) *psize = len + 1; return SWIG_OK; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE octave_value SWIG_FromCharPtrAndSize(const char* carray, size_t size) { return std::string(carray,carray+size); } } swig-3.0.12/Lib/octave/typemaps.i0000664000175000017500000000004113042756442016433 0ustar williamwilliam%include swig-3.0.12/Lib/octave/octcomplex.swg0000664000175000017500000000450013042756442017322 0ustar williamwilliam/* Defines the As/From conversors for double/float complex, you need to provide complex Type, the Name you want to use in the conversors, the complex Constructor method, and the Real and Imag complex accesor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from conversor */ %define %swig_fromcplx_conv(Type, OctConstructor, Real, Imag) %fragment(SWIG_From_frag(Type),"header") { SWIGINTERNINLINE octave_value SWIG_From(Type)(const Type& c) { return octave_value(OctConstructor(Real(c), Imag(c))); } } %enddef // the double case %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal(Type) (const octave_value& ov, Type* val) { if (ov.is_complex_scalar()) { if (val) { Complex c(ov.complex_value()); *val=Constructor(c.real(),c.imag()); } return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(ov, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Complex, Real, Imag); %enddef // the float case %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal(Type) (const octave_value& ov, Type* val) { if (ov.is_complex_scalar()) { if (val) { Complex c(ov.complex_value()); double re = c.real(); double im = c.imag(); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else return SWIG_OverflowError; } } else { float d; int res = SWIG_AddCast(SWIG_AsVal(float)(ov, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, FloatComplex, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-3.0.12/Lib/octave/carrays.i0000664000175000017500000000020113042756442016233 0ustar williamwilliam%define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,__paren__,__paren_asgn__) %enddef %include swig-3.0.12/Lib/octave/std_pair.i0000664000175000017500000000640213042756442016405 0ustar williamwilliam// Pairs %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { #ifdef SWIG_STD_PAIR_ASVAL template struct traits_asval > { typedef std::pair value_type; static int get_pair(const octave_value& first, octave_value second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(const octave_value& obj, std::pair *val) { if (obj.is_cell()) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); return SWIG_ERROR; } return get_pair(c(0),c(1),val); } else { value_type *p; swig_type_info *descriptor = swig::type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; return res; } return SWIG_ERROR; } }; #else template struct traits_asptr > { typedef std::pair value_type; static int get_pair(const octave_value& first, octave_value second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval(first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval(second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } return SWIG_ERROR; } static int asptr(const octave_value& obj, std::pair **val) { if (obj.is_cell()) { Cell c=obj.cell_value(); if (c.numel()<2) { error("pair from Cell array requires at least two elements"); return SWIG_ERROR; } return get_pair(c(0),c(1),val); } else { value_type *p; swig_type_info *descriptor = swig::type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; return res; } return SWIG_ERROR; } }; #endif template struct traits_from > { static octave_value from(const std::pair& val) { Cell c(1,2); c(0)=swig::from(val.first); c(1)=swig::from(val.second); return c; } }; } } %define %swig_pair_methods(pair...) %enddef %include swig-3.0.12/Lib/octave/std_char_traits.i0000664000175000017500000000004113042756442017746 0ustar williamwilliam%include swig-3.0.12/Lib/octave/octuserdir.swg0000664000175000017500000000342613042756442017336 0ustar williamwilliam/* ------------------------------------------------------------------------- * Special user directives * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* Implicit Conversion using the C++ constructor mechanism */ #define %implicitconv %feature("implicitconv") #define %noimplicitconv %feature("implicitconv", "0") #define %clearimplicitconv %feature("implicitconv", "") /* ------------------------------------------------------------------------- */ /* %extend_smart_pointer extend the smart pointer support. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. */ %define %extend_smart_pointer(Type...) %implicitconv Type; %apply const SWIGTYPE& SMARTPOINTER { const Type& }; %apply SWIGTYPE SMARTPOINTER { Type }; %enddef swig-3.0.12/Lib/octave/stl.i0000664000175000017500000000026513042756442015403 0ustar williamwilliam/* initial STL definition. extended as needed in each language */ %include %include %include %include %include swig-3.0.12/Lib/octave/octrun.swg0000664000175000017500000013015013042756442016460 0ustar williamwilliam#if !SWIG_OCTAVE_PREREQ(3,2,0) #define SWIG_DEFUN(cname, wname, doc) DEFUNX_DLD(#cname, wname, FS ## cname, args, nargout, doc) #else #define SWIG_DEFUN(cname, wname, doc) DEFUNX_DLD(#cname, wname, G ## cname, args, nargout, doc) #endif SWIGRUNTIME bool SWIG_check_num_args(const char *func_name, int num_args, int max_args, int min_args, int varargs) { if (num_args > max_args && !varargs) error("function %s takes at most %i arguments", func_name, max_args); else if (num_args < min_args) error("function %s requires at least %i arguments", func_name, min_args); else return true; return false; } SWIGRUNTIME octave_value_list *SWIG_Octave_AppendOutput(octave_value_list *ovl, const octave_value &ov) { ovl->append(ov); return ovl; } SWIGRUNTIME octave_value SWIG_ErrorType(int code) { switch (code) { case SWIG_MemoryError: return "SWIG_MemoryError"; case SWIG_IOError: return "SWIG_IOError"; case SWIG_RuntimeError: return "SWIG_RuntimeError"; case SWIG_IndexError: return "SWIG_IndexError"; case SWIG_TypeError: return "SWIG_TypeError"; case SWIG_DivisionByZero: return "SWIG_DivisionByZero"; case SWIG_OverflowError: return "SWIG_OverflowError"; case SWIG_SyntaxError: return "SWIG_SyntaxError"; case SWIG_ValueError: return "SWIG_ValueError"; case SWIG_SystemError: return "SWIG_SystemError"; case SWIG_AttributeError: return "SWIG_AttributeError"; } return "SWIG unknown error"; } SWIGRUNTIME octave_value SWIG_Error(int code, const char *msg) { octave_value type(SWIG_ErrorType(code)); std::string r = msg; r += " (" + type.string_value() + ")"; error(r.c_str()); return octave_value(r); } #define SWIG_fail goto fail #define SWIG_Octave_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Octave_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Octave_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Octave_NewPointerObj(ptr, type, flags) #define swig_owntype int #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Octave_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Octave_NewPackedObj(ptr, sz, type) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Octave_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Octave_NewPackedObj(ptr, sz, type) #define SWIG_GetModule(clientdata) SWIG_Octave_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Octave_SetModule(clientdata,pointer); #define SWIG_MODULE_CLIENTDATA_TYPE void* #define Octave_Error_Occurred() 0 #define SWIG_Octave_AddErrorMsg(msg) {;} SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata); SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *pointer); // For backward compatibility only #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) 0 // Runtime API implementation #include #include #include typedef octave_value_list(*octave_func) (const octave_value_list &, int); class octave_swig_type; namespace Swig { #ifdef SWIG_DIRECTORS class Director; typedef std::map < void *, Director * > rtdir_map; SWIGINTERN rtdir_map* get_rtdir_map(); SWIGINTERNINLINE void set_rtdir(void *vptr, Director *d); SWIGINTERNINLINE void erase_rtdir(void *vptr); SWIGINTERNINLINE Director *get_rtdir(void *vptr); SWIGRUNTIME void swig_director_destroyed(octave_swig_type *self, Director *d); SWIGRUNTIME octave_swig_type *swig_director_get_self(Director *d); SWIGRUNTIME void swig_director_set_self(Director *d, octave_swig_type *self); #endif SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost); SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov); SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov); } #ifdef SWIG_DIRECTORS SWIGRUNTIME void swig_acquire_ownership(void *vptr); SWIGRUNTIME void swig_acquire_ownership_array(void *vptr); SWIGRUNTIME void swig_acquire_ownership_obj(void *vptr, int own); #endif struct swig_octave_member { const char *name; octave_func method; octave_func get_method; octave_func set_method; int flags; // 1 static, 2 global const char *doc; bool is_static() const { return flags &1; } bool is_global() const { return flags &2; } }; struct swig_octave_class { const char *name; swig_type_info **type; int director; octave_func constructor; const char *constructor_doc; octave_func destructor; const swig_octave_member *members; const char **base_names; const swig_type_info **base; }; // octave_swig_type plays the role of both the shadow class and the class // representation within Octave, since there is no support for classes. // // These should really be decoupled, with the class support added to Octave // and the shadow class given by an m-file script. That would dramatically // reduce the runtime complexity, and be more in line w/ other modules. class octave_swig_type:public octave_base_value { struct cpp_ptr { void *ptr; bool destroyed; cpp_ptr(void *_ptr):ptr(_ptr), destroyed(false) { }}; typedef std::pair < const swig_type_info *, cpp_ptr > type_ptr_pair; mutable swig_module_info *module; const swig_type_info *construct_type; // type of special type object std::vector < type_ptr_pair > types; // our c++ base classes int own; // whether we call c++ destructors when we die typedef std::pair < const swig_octave_member *, octave_value > member_value_pair; typedef std::map < std::string, member_value_pair > member_map; member_map members; bool always_static; const swig_octave_member *find_member(const swig_type_info *type, const std::string &name) { if (!type->clientdata) return 0; swig_octave_class *c = (swig_octave_class *) type->clientdata; const swig_octave_member *m; for (m = c->members; m->name; ++m) if (m->name == name) return m; for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) return 0; if ((m = find_member(c->base[j], name))) return m; } return 0; } member_value_pair *find_member(const std::string &name, bool insert_if_not_found) { member_map::iterator it = members.find(name); if (it != members.end()) return &it->second; const swig_octave_member *m; for (unsigned int j = 0; j < types.size(); ++j) if ((m = find_member(types[j].first, name))) return &members.insert(std::make_pair(name, std::make_pair(m, octave_value()))).first->second; if (!insert_if_not_found) return 0; return &members[name]; } const swig_type_info *find_base(const std::string &name, const swig_type_info *base) { if (!base) { for (unsigned int j = 0; j < types.size(); ++j) { assert(types[j].first->clientdata); swig_octave_class *cj = (swig_octave_class *) types[j].first->clientdata; if (cj->name == name) return types[j].first; } return 0; } assert(base->clientdata); swig_octave_class *c = (swig_octave_class *) base->clientdata; for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) return 0; assert(c->base[j]->clientdata); swig_octave_class *cj = (swig_octave_class *) c->base[j]->clientdata; if (cj->name == name) return c->base[j]; } return 0; } void load_members(const swig_octave_class* c,member_map& out) const { for (const swig_octave_member *m = c->members; m->name; ++m) { if (out.find(m->name) == out.end()) out.insert(std::make_pair(m->name, std::make_pair(m, octave_value()))); } for (int j = 0; c->base_names[j]; ++j) { if (!c->base[j]) { if (!module) module = SWIG_GetModule(0); assert(module); c->base[j] = SWIG_MangledTypeQueryModule(module, module, c->base_names[j]); } if (!c->base[j]) continue; assert(c->base[j]->clientdata); const swig_octave_class *cj = (const swig_octave_class *) c->base[j]->clientdata; load_members(cj,out); } } void load_members(member_map& out) const { out=members; for (unsigned int j = 0; j < types.size(); ++j) if (types[j].first->clientdata) load_members((const swig_octave_class *) types[j].first->clientdata, out); } octave_value_list member_invoke(member_value_pair *m, const octave_value_list &args, int nargout) { if (m->second.is_defined()) return m->second.subsref("(", std::list < octave_value_list > (1, args), nargout); else if (m->first && m->first->method) return m->first->method(args, nargout); error("member not defined or not invocable"); return octave_value_list(); } bool dispatch_unary_op(const std::string &symbol, octave_value &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() < 1) return false; ret = argout(0); return true; } bool dispatch_binary_op(const std::string &symbol, const octave_base_value &rhs, octave_value &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); args.append(make_value_hack(rhs)); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() < 1) return false; ret = argout(0); return true; } bool dispatch_index_op(const std::string &symbol, const octave_value_list &rhs, octave_value_list &ret) const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); member_value_pair *m = nc_this->find_member(symbol, false); if (!m || m->first->is_static() || m->first->is_global()) return false; octave_value_list args; args.append(nc_this->as_value()); args.append(rhs); octave_value_list argout(nc_this->member_invoke(m, args, 1)); if (argout.length() >= 1) ret = argout(0); return true; } octave_value_list member_deref(member_value_pair *m, const octave_value_list &args) { if (m->second.is_defined()) return m->second; else if (m->first) { if (m->first->get_method) return m->first->get_method(args, 1); else if (m->first->method) return octave_value(new octave_builtin(m->first->method)); } error("undefined member"); return octave_value_list(); } static octave_value make_value_hack(const octave_base_value &x) { ((octave_swig_type &) x).count++; return octave_value((octave_base_value *) &x); } octave_swig_type(const octave_swig_type &x); octave_swig_type &operator=(const octave_swig_type &rhs); public: octave_swig_type(void *_ptr = 0, const swig_type_info *_type = 0, int _own = 0, bool _always_static = false) : module(0), construct_type(_ptr ? 0 : _type), own(_own), always_static(_always_static) { if (_type || _ptr) types.push_back(std::make_pair(_type, _ptr)); #ifdef SWIG_DIRECTORS if (_ptr) { Swig::Director *d = Swig::get_rtdir(_ptr); if (d) Swig::swig_director_set_self(d, this); } #endif } ~octave_swig_type() { if (own) { ++count; for (unsigned int j = 0; j < types.size(); ++j) { if (!types[j].first || !types[j].first->clientdata) continue; swig_octave_class *c = (swig_octave_class *) types[j].first->clientdata; if (c->destructor && !types[j].second.destroyed && types[j].second.ptr) { c->destructor(as_value(), 0); } } } #ifdef SWIG_DIRECTORS for (unsigned int j = 0; j < types.size(); ++j) Swig::erase_rtdir(types[j].second.ptr); #endif } dim_vector dims(void) const { octave_value out; if (!dispatch_unary_op("__dims__", out)) return dim_vector(1,1); // Return value should be cell or matrix of integers if (out.is_cell()) { const Cell & c=out.cell_value(); int ndim = c.rows(); if (ndim==1 && c.columns()!=1) ndim = c.columns(); dim_vector d; d.resize(ndim < 2 ? 2 : ndim); d(0) = d(1) = 1; // Fill in dim_vector for (int k=0;k a = out.int_vector_value(); if (error_state) return dim_vector(1,1); dim_vector d; d.resize(a.numel() < 2 ? 2 : a.numel()); d(0) = d(1) = 1; for (int k=0;kclientdata) return 0; swig_octave_class *c = (swig_octave_class *) types[0].first->clientdata; return c->constructor_doc; } std::string swig_type_name() const { // * need some way to manually name subclasses. // * eg optional first arg to subclass(), or named_subclass() std::string ret; for (unsigned int j = 0; j < types.size(); ++j) { if (j) ret += "_"; if (types[j].first->clientdata) { swig_octave_class *c = (swig_octave_class *) types[j].first->clientdata; ret += c->name; } else ret += types[j].first->name; } return ret; } void merge(octave_swig_type &rhs) { rhs.own = 0; for (unsigned int j = 0; j < rhs.types.size(); ++j) { assert(!rhs.types[j].second.destroyed); #ifdef SWIG_DIRECTORS Swig::Director *d = Swig::get_rtdir(rhs.types[j].second.ptr); if (d) Swig::swig_director_set_self(d, this); #endif } types.insert(types.end(), rhs.types.begin(), rhs.types.end()); members.insert(rhs.members.begin(), rhs.members.end()); rhs.types.clear(); rhs.members.clear(); } typedef member_map::const_iterator swig_member_const_iterator; swig_member_const_iterator swig_members_begin() { return members.begin(); } swig_member_const_iterator swig_members_end() { return members.end(); } int cast(void **vptr, swig_type_info *type, int *_own, int flags) { int res = SWIG_ERROR; if (_own) *_own = own; if (flags &SWIG_POINTER_DISOWN) own = 0; if (!type && types.size()) { if(vptr) *vptr = types[0].second.ptr; return SWIG_OK; } for (unsigned int j = 0; j < types.size(); ++j) if (type == types[j].first) { if(vptr) *vptr = types[j].second.ptr; return SWIG_OK; } for (unsigned int j = 0; j < types.size(); ++j) { swig_cast_info *tc = SWIG_TypeCheck(types[j].first->name, type); if (!tc) continue; if(vptr) { int newmemory = 0; *vptr = SWIG_TypeCast(tc, types[j].second.ptr, &newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(_own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (_own) *_own = *_own | SWIG_CAST_NEW_MEMORY; } } res = SWIG_OK; break; } return res; } bool is_owned() const { return own; } #ifdef SWIG_DIRECTORS void director_destroyed(Swig::Director *d) { bool found = false; for (unsigned int j = 0; j < types.size(); ++j) { Swig::Director *dj = Swig::get_rtdir(types[j].second.ptr); if (dj == d) { types[j].second.destroyed = true; found = true; } } assert(found); } #endif void assign(const std::string &name, const octave_value &ov) { members[name] = std::make_pair((const swig_octave_member *) 0, ov); } void assign(const std::string &name, const swig_octave_member *m) { members[name] = std::make_pair(m, octave_value()); } octave_base_value *clone() const { // pass-by-value is probably not desired, and is harder; // requires calling copy constructors of contained types etc. assert(0); *(int *) 0 = 0; return 0; } octave_base_value *empty_clone() const { return new octave_swig_type(); } bool is_defined() const { return true; } virtual bool is_map() const { return true; } virtual octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { octave_value_list ovl = subsref(ops, idx, 1); return ovl.length()? ovl(0) : octave_value(); } virtual octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { assert(ops.size() > 0); assert(ops.size() == idx.size()); std::list < octave_value_list >::const_iterator idx_it = idx.begin(); int skip = 0; octave_value_list sub_ovl; // constructor invocation if (ops[skip] == '(' && construct_type) { assert(construct_type->clientdata); swig_octave_class *c = (swig_octave_class *) construct_type->clientdata; if (!c->constructor) { error("cannot create instance"); return octave_value_list(); } octave_value_list args; if (c->director) args.append(Swig::swig_value_ref(new octave_swig_type(this, 0, 0))); args.append(*idx_it++); ++skip; sub_ovl = c->constructor(args, nargout); } // member dereference or invocation else if (ops[skip] == '.') { std::string subname; const swig_type_info *base = 0; // eg, a.base.base_cpp_mem for (;;) { octave_value_list subname_ovl(*idx_it++); ++skip; assert(subname_ovl.length() == 1 && subname_ovl(0).is_string()); subname = subname_ovl(0).string_value(); const swig_type_info *next_base = find_base(subname, base); if (!next_base || skip >= (int) ops.size() || ops[skip] != '.') break; base = next_base; } member_value_pair tmp, *m = &tmp; if (!base || !(m->first = find_member(base, subname))) m = find_member(subname, false); if (!m) { error("member not found"); return octave_value_list(); } octave_value_list args; if (!always_static && (!m->first || (!m->first->is_static() && !m->first->is_global()))) args.append(as_value()); if (skip < (int) ops.size() && ops[skip] == '(' && ((m->first && m->first->method) || m->second.is_function() || m->second.is_function_handle())) { args.append(*idx_it++); ++skip; sub_ovl = member_invoke(m, args, nargout); } else { sub_ovl = member_deref(m, args); } } // index operator else { if (ops[skip] == '(' || ops[skip] == '{') { const char *op_name = ops[skip] == '(' ? "__paren__" : "__brace__"; octave_value_list args; args.append(*idx_it++); ++skip; if (!dispatch_index_op(op_name, args, sub_ovl)) { error("error evaluating index operator"); return octave_value_list(); } } else { error("unsupported subsref"); return octave_value_list(); } } if (skip >= (int) ops.size()) return sub_ovl; if (sub_ovl.length() < 1) { error("bad subs ref"); return octave_value_list(); } return sub_ovl(0).next_subsref(nargout, ops, idx, skip); } octave_value subsasgn(const std::string &ops, const std::list < octave_value_list > &idx, const octave_value &rhs) { assert(ops.size() > 0); assert(ops.size() == idx.size()); std::list < octave_value_list >::const_iterator idx_it = idx.begin(); int skip = 0; if (ops.size() > 1) { std::list < octave_value_list >::const_iterator last = idx.end(); --last; std::list < octave_value_list > next_idx(idx.begin(), last); octave_value next_ov = subsref(ops.substr(0, ops.size() - 1), next_idx); next_ov.subsasgn(ops.substr(ops.size() - 1), std::list < octave_value_list > (1, *last), rhs); } else if (ops[skip] == '(' || ops[skip] == '{') { const char *op_name = ops[skip] == '(' ? "__paren_asgn__" : "__brace_asgn__"; member_value_pair *m = find_member(op_name, false); if (m) { octave_value_list args; args.append(as_value()); args.append(*idx_it); args.append(rhs); member_invoke(m, args, 1); } else error("%s member not found", op_name); } else if (ops[skip] == '.') { octave_value_list subname_ovl(*idx_it++); ++skip; assert(subname_ovl.length() == 1 &&subname_ovl(0).is_string()); std::string subname = subname_ovl(0).string_value(); member_value_pair *m = find_member(subname, true); if (!m->first || !m->first->set_method) { m->first = 0; m->second = rhs; } else if (m->first->set_method) { octave_value_list args; if (!m->first->is_static() && !m->first->is_global()) args.append(as_value()); args.append(rhs); m->first->set_method(args, 1); } else error("member not assignable"); } else error("unsupported subsasgn"); return as_value(); } virtual bool is_object() const { return true; } virtual bool is_string() const { octave_swig_type *nc_this = const_cast < octave_swig_type *>(this); return !!nc_this->find_member("__str__", false); } virtual std::string string_value(bool force = false) const { octave_value ret; if (!dispatch_unary_op("__str__", ret)) { error("__str__ method not defined"); return std::string(); } if (!ret.is_string()) { error("__str__ method did not return a string"); return std::string(); } return ret.string_value(); } virtual double scalar_value(bool frc_str_conv = false) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.scalar_value(); } #if SWIG_OCTAVE_PREREQ(4,2,0) virtual octave_value as_double(void) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.as_double(); } virtual octave_value as_single(void) const { octave_value ret; if (!dispatch_unary_op("__float__", ret)) { error("__float__ method not defined"); } return ret.as_single(); } #endif #if SWIG_OCTAVE_PREREQ(3,8,0) virtual octave_value map(octave_base_value::unary_mapper_t umap) const { const std::string opname = std::string("__") + octave_base_value::get_umap_name(umap) + std::string("__"); octave_value ret; if (!dispatch_unary_op(opname, ret)) { error((opname + std::string(" method not found")).c_str()); return octave_value(); } return ret; } #endif #if SWIG_OCTAVE_PREREQ(3,3,52) virtual octave_map map_value() const { return octave_map(); } #else virtual Octave_map map_value() const { return Octave_map(); } #endif virtual string_vector map_keys() const { member_map tmp; load_members(tmp); string_vector keys(tmp.size()); int k = 0; for (member_map::iterator it = tmp.begin(); it != tmp.end(); ++it) keys(k++) = it->first; return keys; } virtual bool save_ascii (std::ostream& os) { return true; } virtual bool load_ascii (std::istream& is) { return true; } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return true; } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return true; } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return true; } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return true; } # endif #endif virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const { return string_value(); } virtual octave_value convert_to_str_internal(bool pad, bool force, char type) const { return string_value(); } static bool dispatch_global_op(const std::string &symbol, const octave_value_list &args, octave_value &ret) { // we assume that SWIG_op_prefix-prefixed functions are installed in global namespace // (rather than any module namespace). octave_function *fcn = is_valid_function(symbol, std::string(), false); if (!fcn) return false; ret = fcn->do_multi_index_op(1, args)(0); return true; } static octave_value dispatch_unary_op(const octave_base_value &x, const char *op_name) { octave_swig_type *ost = Swig::swig_value_deref(x); assert(ost); octave_value ret; if (ost->dispatch_unary_op(std::string("__") + op_name + std::string("__"), ret)) return ret; std::string symbol = SWIG_op_prefix + ost->swig_type_name() + "_" + op_name; octave_value_list args; args.append(make_value_hack(x)); if (dispatch_global_op(symbol, args, ret)) return ret; error("could not dispatch unary operator"); return octave_value(); } static octave_value dispatch_binary_op(const octave_base_value &lhs, const octave_base_value &rhs, const char *op_name) { octave_swig_type *lhs_ost = Swig::swig_value_deref(lhs); octave_swig_type *rhs_ost = Swig::swig_value_deref(rhs); octave_value ret; if (lhs_ost && lhs_ost->dispatch_binary_op(std::string("__") + op_name + std::string("__"), rhs, ret)) return ret; if (rhs_ost) { if (strlen(op_name) == 2 && (op_name[1] == 't' || op_name[1] == 'e')) { if (op_name[0] == 'l' && rhs_ost->dispatch_binary_op(std::string("__g") + op_name[1] + std::string("__"), lhs, ret)) return ret; if (op_name[0] == 'g' && rhs_ost->dispatch_binary_op(std::string("__l") + op_name[1] + std::string("__"), lhs, ret)) return ret; } if (rhs_ost->dispatch_binary_op(std::string("__r") + op_name + std::string("__"), lhs, ret)) return ret; } std::string symbol; octave_value_list args; args.append(make_value_hack(lhs)); args.append(make_value_hack(rhs)); symbol = SWIG_op_prefix; symbol += lhs_ost ? lhs_ost->swig_type_name() : lhs.type_name(); symbol += "_"; symbol += op_name; symbol += "_"; symbol += rhs_ost ? rhs_ost->swig_type_name() : rhs.type_name(); if (dispatch_global_op(symbol, args, ret)) return ret; symbol = SWIG_op_prefix; symbol += lhs_ost ? lhs_ost->swig_type_name() : lhs.type_name(); symbol += "_"; symbol += op_name; symbol += "_"; symbol += "any"; if (dispatch_global_op(symbol, args, ret)) return ret; symbol = SWIG_op_prefix; symbol += "any"; symbol += "_"; symbol += op_name; symbol += "_"; symbol += rhs_ost ? rhs_ost->swig_type_name() : rhs.type_name(); if (dispatch_global_op(symbol, args, ret)) return ret; error("could not dispatch binary operator"); return octave_value(); } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { if (is_string()) { os << string_value(); return; } member_map tmp; load_members(tmp); indent(os); os << "{"; newline(os); increment_indent_level(); for (unsigned int j = 0; j < types.size(); ++j) { indent(os); if (types[j].first->clientdata) { const swig_octave_class *c = (const swig_octave_class *) types[j].first->clientdata; os << c->name << ", ptr = " << types[j].second.ptr; newline(os); } else { os << types[j].first->name << ", ptr = " << types[j].second.ptr; newline(os); } } for (member_map::const_iterator it = tmp.begin(); it != tmp.end(); ++it) { indent(os); if (it->second.first) { const char *objtype = it->second.first->method ? "method" : "variable"; const char *modifier = (it->second.first->flags &1) ? "static " : (it->second.first->flags &2) ? "global " : ""; os << it->second.first->name << " (" << modifier << objtype << ")"; newline(os); assert(it->second.first->name == it->first); } else { os << it->first; newline(os); } } decrement_indent_level(); indent(os); os << "}"; newline(os); } }; // Octave tries hard to preserve pass-by-value semantics. Eg, assignments // will call clone() via make_unique() if there is more than one outstanding // reference to the lhs, and forces the clone's reference count to 1 // (so you can't just increment your own count and return this). // // One way to fix this (without modifying Octave) is to add a level of // indirection such that clone copies ref-counted pointer and we keep // pass-by-ref semantics (which are more natural/expected for C++ bindings). // // Supporting both pass-by-{ref,value} and toggling via %feature/option // might be nice. class octave_swig_ref:public octave_base_value { octave_swig_type *ptr; public: octave_swig_ref(octave_swig_type *_ptr = 0) :ptr(_ptr) { } ~octave_swig_ref() { if (ptr) ptr->decref(); } octave_swig_type *get_ptr() const { return ptr; } octave_base_value *clone() const { if (ptr) ptr->incref(); return new octave_swig_ref(ptr); } octave_base_value *empty_clone() const { return new octave_swig_ref(0); } dim_vector dims(void) const { return ptr->dims(); } bool is_defined() const { return ptr->is_defined(); } virtual bool is_map() const { return ptr->is_map(); } virtual octave_value subsref(const std::string &ops, const std::list < octave_value_list > &idx) { return ptr->subsref(ops, idx); } virtual octave_value_list subsref(const std::string &ops, const std::list < octave_value_list > &idx, int nargout) { return ptr->subsref(ops, idx, nargout); } octave_value subsasgn(const std::string &ops, const std::list < octave_value_list > &idx, const octave_value &rhs) { return ptr->subsasgn(ops, idx, rhs); } virtual bool is_object() const { return ptr->is_object(); } virtual bool is_string() const { return ptr->is_string(); } virtual std::string string_value(bool force = false) const { return ptr->string_value(force); } virtual double scalar_value(bool frc_str_conv = false) const { return ptr->scalar_value(frc_str_conv); } #if SWIG_OCTAVE_PREREQ(4,2,0) virtual octave_value as_double(void) const { return ptr->as_double(); } virtual octave_value as_single(void) const { return ptr->as_single(); } #endif #if SWIG_OCTAVE_PREREQ(3,8,0) virtual octave_value map(octave_base_value::unary_mapper_t umap) const { return ptr->map(umap); } #endif #if SWIG_OCTAVE_PREREQ(3,3,52) virtual octave_map map_value() const { return ptr->map_value(); } #else virtual Octave_map map_value() const { return ptr->map_value(); } #endif virtual string_vector map_keys() const { return ptr->map_keys(); } virtual bool save_ascii (std::ostream& os) { return ptr->save_ascii(os); } virtual bool load_ascii (std::istream& is) { return ptr->load_ascii(is); } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return ptr->save_binary(os, save_as_floats); } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return ptr->load_binary(is, swap, fmt); } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return ptr->save_hdf5(loc_id, name, save_as_floats); } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return ptr->load_hdf5(loc_id, name, have_h5giterate_bug); } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return ptr->save_hdf5(loc_id, name, save_as_floats); } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return ptr->load_hdf5(loc_id, name, have_h5giterate_bug); } # endif #endif virtual octave_value convert_to_str(bool pad = false, bool force = false, char type = '"') const { return ptr->convert_to_str(pad, force, type); } virtual octave_value convert_to_str_internal(bool pad, bool force, char type) const { return ptr->convert_to_str_internal(pad, force, type); } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { return ptr->print(os, pr_as_read_syntax); } virtual type_conv_info numeric_conversion_function(void) const { return octave_base_value::type_conv_info (default_numeric_conversion_function, octave_scalar::static_type_id ()); } private: static octave_base_value *default_numeric_conversion_function (const octave_base_value& a) { const octave_swig_ref& v = dynamic_cast(a); return new octave_scalar(v.scalar_value()); } #if !SWIG_OCTAVE_PREREQ(4,0,0) DECLARE_OCTAVE_ALLOCATOR; #endif DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA; }; #if !SWIG_OCTAVE_PREREQ(4,0,0) DEFINE_OCTAVE_ALLOCATOR(octave_swig_ref); #endif DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_ref, "swig_ref", "swig_ref"); class octave_swig_packed:public octave_base_value { swig_type_info *type; std::vector < char > buf; public: octave_swig_packed(swig_type_info *_type = 0, const void *_buf = 0, size_t _buf_len = 0) : type(_type), buf((const char*)_buf, (const char*)_buf + _buf_len) { } bool copy(swig_type_info *outtype, void *ptr, size_t sz) const { if (outtype && outtype != type) return false; assert(sz <= buf.size()); std::copy(buf.begin(), buf.begin()+sz, (char*)ptr); return true; } octave_base_value *clone() const { return new octave_swig_packed(*this); } octave_base_value *empty_clone() const { return new octave_swig_packed(); } bool is_defined() const { return true; } #if SWIG_OCTAVE_PREREQ(4,0,0) void print(std::ostream &os, bool pr_as_read_syntax = false) #else void print(std::ostream &os, bool pr_as_read_syntax = false) const #endif { indent(os); os << "swig packed type: name = " << (type ? type->name : std::string()) << ", len = " << buf.size(); newline(os); } virtual bool save_ascii (std::ostream& os) { return true; } virtual bool load_ascii (std::istream& is) { return true; } virtual bool save_binary (std::ostream& os, bool& save_as_floats) { return true; } virtual bool load_binary (std::istream& is, bool swap, oct_mach_info::float_format fmt) { return true; } #if defined (HAVE_HDF5) # if SWIG_OCTAVE_PREREQ(4,0,0) virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (octave_hdf5_id loc_id, const char *name, bool have_h5giterate_bug) { return true; } # else virtual bool save_hdf5 (hid_t loc_id, const char *name, bool save_as_floats) { return true; } virtual bool load_hdf5 (hid_t loc_id, const char *name, bool have_h5giterate_bug) { return true; } # endif #endif private: #if !SWIG_OCTAVE_PREREQ(4,0,0) DECLARE_OCTAVE_ALLOCATOR; #endif DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA; }; #if !SWIG_OCTAVE_PREREQ(4,0,0) DEFINE_OCTAVE_ALLOCATOR(octave_swig_packed); #endif DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(octave_swig_packed, "swig_packed", "swig_packed"); SWIGRUNTIME octave_value_list octave_set_immutable(const octave_value_list &args, int nargout) { error("attempt to set immutable member variable"); return octave_value_list(); } struct octave_value_ref { const octave_value_list &ovl; int j; octave_value_ref(const octave_value_list &_ovl, int _j) :ovl(_ovl), j(_j) { } operator octave_value() const { return ovl(j); } octave_value operator*() const { return ovl(j); } }; namespace Swig { SWIGRUNTIME octave_base_value *swig_value_ref(octave_swig_type *ost) { return new octave_swig_ref(ost); } SWIGRUNTIME octave_swig_type *swig_value_deref(octave_value ov) { if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); return swig_value_deref(*ov.internal_rep()); } SWIGRUNTIME octave_swig_type *swig_value_deref(const octave_base_value &ov) { if (ov.type_id() != octave_swig_ref::static_type_id()) return 0; const octave_swig_ref *osr = static_cast < const octave_swig_ref *>(&ov); return osr->get_ptr(); } } #define swig_unary_op(name) \ SWIGRUNTIME octave_value swig_unary_op_##name(const octave_base_value &x) { \ return octave_swig_type::dispatch_unary_op(x,#name); \ } #define swig_binary_op(name) \ SWIGRUNTIME octave_value swig_binary_op_##name(const octave_base_value&lhs,const octave_base_value &rhs) { \ return octave_swig_type::dispatch_binary_op(lhs,rhs,#name); \ } #define swigreg_unary_op(name) \ if (!octave_value_typeinfo::lookup_unary_op(octave_value::op_##name,tid)) \ octave_value_typeinfo::register_unary_op(octave_value::op_##name,tid,swig_unary_op_##name); #define swigreg_binary_op(name) \ if (!octave_value_typeinfo::lookup_binary_op(octave_value::op_##name,tid1,tid2)) \ octave_value_typeinfo::register_binary_op(octave_value::op_##name,tid1,tid2,swig_binary_op_##name); swig_unary_op(not); swig_unary_op(uplus); swig_unary_op(uminus); swig_unary_op(transpose); swig_unary_op(hermitian); swig_unary_op(incr); swig_unary_op(decr); swig_binary_op(add); swig_binary_op(sub); swig_binary_op(mul); swig_binary_op(div); swig_binary_op(pow); swig_binary_op(ldiv); #if !SWIG_OCTAVE_PREREQ(4,2,0) swig_binary_op(lshift); swig_binary_op(rshift); #endif swig_binary_op(lt); swig_binary_op(le); swig_binary_op(eq); swig_binary_op(ge); swig_binary_op(gt); swig_binary_op(ne); swig_binary_op(el_mul); swig_binary_op(el_div); swig_binary_op(el_pow); swig_binary_op(el_ldiv); swig_binary_op(el_and); swig_binary_op(el_or); SWIGRUNTIME void SWIG_InstallUnaryOps(int tid) { swigreg_unary_op(not); swigreg_unary_op(uplus); swigreg_unary_op(uminus); swigreg_unary_op(transpose); swigreg_unary_op(hermitian); swigreg_unary_op(incr); swigreg_unary_op(decr); } SWIGRUNTIME void SWIG_InstallBinaryOps(int tid1, int tid2) { swigreg_binary_op(add); swigreg_binary_op(sub); swigreg_binary_op(mul); swigreg_binary_op(div); swigreg_binary_op(pow); swigreg_binary_op(ldiv); #if !SWIG_OCTAVE_PREREQ(4,2,0) swigreg_binary_op(lshift); swigreg_binary_op(rshift); #endif swigreg_binary_op(lt); swigreg_binary_op(le); swigreg_binary_op(eq); swigreg_binary_op(ge); swigreg_binary_op(gt); swigreg_binary_op(ne); swigreg_binary_op(el_mul); swigreg_binary_op(el_div); swigreg_binary_op(el_pow); swigreg_binary_op(el_ldiv); swigreg_binary_op(el_and); swigreg_binary_op(el_or); } SWIGRUNTIME void SWIG_InstallOps(int tid) { // here we assume that tid are conseq integers increasing from zero, and // that our tid is the last one. might be better to have explicit string // list of types we should bind to, and use lookup_type to resolve their tid. SWIG_InstallUnaryOps(tid); SWIG_InstallBinaryOps(tid, tid); for (int j = 0; j < tid; ++j) { SWIG_InstallBinaryOps(j, tid); SWIG_InstallBinaryOps(tid, j); } } SWIGRUNTIME octave_value SWIG_Octave_NewPointerObj(void *ptr, swig_type_info *type, int flags) { int own = (flags &SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; #ifdef SWIG_DIRECTORS Swig::Director *d = Swig::get_rtdir(ptr); if (d && Swig::swig_director_get_self(d)) return Swig::swig_director_get_self(d)->as_value(); #endif return Swig::swig_value_ref(new octave_swig_type(ptr, type, own)); } SWIGRUNTIME int SWIG_Octave_ConvertPtrAndOwn(octave_value ov, void **ptr, swig_type_info *type, int flags, int *own) { if (ov.is_cell() && ov.rows() == 1 && ov.columns() == 1) ov = ov.cell_value()(0); if (!ov.is_defined() || (ov.is_matrix_type() && ov.rows() == 0 && ov.columns() == 0) ) { if (ptr) *ptr = 0; return SWIG_OK; } if (ov.type_id() != octave_swig_ref::static_type_id()) return SWIG_ERROR; octave_swig_ref *osr = static_cast < octave_swig_ref *>(ov.internal_rep()); octave_swig_type *ost = osr->get_ptr(); return ost->cast(ptr, type, own, flags); } SWIGRUNTIME octave_value SWIG_Octave_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return new octave_swig_packed(type, (char *) ptr, sz); } SWIGRUNTIME int SWIG_Octave_ConvertPacked(const octave_value &ov, void *ptr, size_t sz, swig_type_info *type) { if (!ov.is_defined()) return SWIG_ERROR; if (ov.type_id() != octave_swig_packed::static_type_id()) return SWIG_ERROR; octave_swig_packed *ost = static_cast < octave_swig_packed *>(ov.internal_rep()); return ost->copy(type, (char *) ptr, sz) ? SWIG_OK : SWIG_ERROR; } SWIGRUNTIMEINLINE void SWIG_Octave_SetConstant(octave_swig_type *module_ns, const std::string &name, const octave_value &ov) { module_ns->assign(name, ov); } SWIGRUNTIMEINLINE octave_value SWIG_Octave_GetGlobalValue(std::string name) { return get_global_value(name, true); } SWIGRUNTIME void SWIG_Octave_SetGlobalValue(std::string name, const octave_value& value) { set_global_value(name, value); } SWIGRUNTIME void SWIG_Octave_LinkGlobalValue(std::string name) { #if !SWIG_OCTAVE_PREREQ(3,2,0) link_to_global_variable(curr_sym_tab->lookup(name, true)); #else #if !SWIG_OCTAVE_PREREQ(3,8,0) symbol_table::varref(name); #endif symbol_table::mark_global(name); #endif } SWIGRUNTIME swig_module_info *SWIG_Octave_GetModule(void *clientdata) { octave_value ov = SWIG_Octave_GetGlobalValue("__SWIG_MODULE__" SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION); if (!ov.is_defined() || ov.type_id() != octave_swig_packed::static_type_id()) return 0; const octave_swig_packed* osp = static_cast < const octave_swig_packed *> (ov.internal_rep()); swig_module_info *pointer = 0; osp->copy(0, &pointer, sizeof(swig_module_info *)); return pointer; } SWIGRUNTIME void SWIG_Octave_SetModule(void *clientdata, swig_module_info *pointer) { octave_value ov = new octave_swig_packed(0, &pointer, sizeof(swig_module_info *)); SWIG_Octave_SetGlobalValue("__SWIG_MODULE__" SWIG_TYPE_TABLE_NAME SWIG_RUNTIME_VERSION, ov); } swig-3.0.12/Lib/octave/exception.i0000664000175000017500000000065313042756442016600 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } %define SWIG_RETHROW_OCTAVE_EXCEPTIONS /* rethrow any exceptions thrown by Octave */ %#if SWIG_OCTAVE_PREREQ(4,2,0) catch (octave::execution_exception& _e) { throw; } catch (octave::exit_exception& _e) { throw; } catch (octave::interrupt_exception& _e) { throw; } %#endif %enddef swig-3.0.12/Lib/octave/std_list.i0000664000175000017500000000124513042756442016425 0ustar williamwilliam// Lists %fragment("StdListTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const octave_value& obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static octave_value *from(const std::list & vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/octave/cdata.i0000664000175000017500000000003613042756442015651 0ustar williamwilliam%include swig-3.0.12/Lib/octave/octruntime.swg0000664000175000017500000003645613042756442017355 0ustar williamwilliam%insert(runtime) %{ #include #include #include #include // Macro for enabling features which require Octave version >= major.minor.patch // - Use (OCTAVE_PATCH_VERSION + 0) to handle both '' (released) and '+' (in development) patch numbers #define SWIG_OCTAVE_PREREQ(major, minor, patch) \ ( (OCTAVE_MAJOR_VERSION<<16) + (OCTAVE_MINOR_VERSION<<8) + (OCTAVE_PATCH_VERSION + 0) >= ((major)<<16) + ((minor)<<8) + (patch) ) // Reconstruct Octave major, minor, and patch versions for releases prior to 3.8.1 #if !defined(OCTAVE_MAJOR_VERSION) # if !defined(OCTAVE_API_VERSION_NUMBER) // Hack to distinguish between Octave 3.8.0, which removed OCTAVE_API_VERSION_NUMBER but did not yet // introduce OCTAVE_MAJOR_VERSION, and Octave <= 3.2, which did not define OCTAVE_API_VERSION_NUMBER # include # if defined(octave_ov_h) # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 8 # define OCTAVE_PATCH_VERSION 0 # else // Hack to distinguish between Octave 3.2 and earlier versions, before OCTAVE_API_VERSION_NUMBER existed # define ComplexLU __ignore # include # undef ComplexLU # if defined(octave_Complex_LU_h) // We know only that this version is prior to Octave 3.2, i.e. OCTAVE_API_VERSION_NUMBER < 37 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 1 # define OCTAVE_PATCH_VERSION 99 # else // OCTAVE_API_VERSION_NUMBER == 37 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 2 # define OCTAVE_PATCH_VERSION 0 # endif // defined(octave_Complex_LU_h) # endif // defined(octave_ov_h) // Correlation between Octave API and version numbers extracted from Octave's // ChangeLogs; version is the *earliest* released Octave with that API number # elif OCTAVE_API_VERSION_NUMBER >= 48 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 6 # define OCTAVE_PATCH_VERSION 0 # elif OCTAVE_API_VERSION_NUMBER >= 45 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 4 # define OCTAVE_PATCH_VERSION 1 # elif OCTAVE_API_VERSION_NUMBER >= 42 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 54 # elif OCTAVE_API_VERSION_NUMBER >= 41 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 53 # elif OCTAVE_API_VERSION_NUMBER >= 40 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 52 # elif OCTAVE_API_VERSION_NUMBER >= 39 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 51 # else // OCTAVE_API_VERSION_NUMBER == 38 # define OCTAVE_MAJOR_VERSION 3 # define OCTAVE_MINOR_VERSION 3 # define OCTAVE_PATCH_VERSION 50 # endif // !defined(OCTAVE_API_VERSION_NUMBER) #endif // !defined(OCTAVE_MAJOR_VERSION) #include #include #include #include #include #include #include #if SWIG_OCTAVE_PREREQ(4,2,0) #include #else #include #endif #include #if SWIG_OCTAVE_PREREQ(4,2,0) #include #endif %} %insert(runtime) "swigrun.swg"; %insert(runtime) "swigerrors.swg"; %insert(runtime) "octrun.swg"; %insert(initbeforefunc) "swiginit.swg" %insert(initbeforefunc) %{ static bool SWIG_init_user(octave_swig_type* module_ns); SWIGINTERN bool SWIG_Octave_LoadModule(std::string name) { bool retn = false; { #if SWIG_OCTAVE_PREREQ(4,2,0) octave::unwind_protect frame; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #elif SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect frame; frame.protect_var(error_state); error_state = 0; frame.protect_var(warning_state); warning_state = 0; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #else unwind_protect::begin_frame("SWIG_Octave_LoadModule"); unwind_protect_int(error_state); error_state = 0; unwind_protect_int(warning_state); warning_state = 0; unwind_protect_bool(discard_error_messages); discard_error_messages = true; unwind_protect_bool(discard_warning_messages); discard_warning_messages = true; #endif #if SWIG_OCTAVE_PREREQ(4,2,0) try { feval(name, octave_value_list(), 0); retn = true; } catch (octave::execution_exception&) { } #else feval(name, octave_value_list(), 0); retn = (error_state == 0); #endif #if !SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect::run_frame("SWIG_Octave_LoadModule"); #endif } if (!retn) { error(SWIG_name_d ": could not load module `%s'", name.c_str()); } return retn; } SWIGINTERN bool SWIG_Octave_InstallFunction(octave_function *octloadfcn, std::string name) { bool retn = false; { #if SWIG_OCTAVE_PREREQ(4,2,0) octave::unwind_protect frame; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #elif SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect frame; frame.protect_var(error_state); error_state = 0; frame.protect_var(warning_state); warning_state = 0; frame.protect_var(discard_error_messages); discard_error_messages = true; frame.protect_var(discard_warning_messages); discard_warning_messages = true; #else unwind_protect::begin_frame("SWIG_Octave_LoadModule"); unwind_protect_int(error_state); error_state = 0; unwind_protect_int(warning_state); warning_state = 0; unwind_protect_bool(discard_error_messages); discard_error_messages = true; unwind_protect_bool(discard_warning_messages); discard_warning_messages = true; #endif octave_value_list args; args.append(name); args.append(octloadfcn->fcn_file_name()); #if SWIG_OCTAVE_PREREQ(4,2,0) try { feval("autoload", args, 0); retn = true; } catch (octave::execution_exception&) { } #else feval("autoload", args, 0); retn = (error_state == 0); #endif #if !SWIG_OCTAVE_PREREQ(3,3,50) unwind_protect::run_frame("SWIG_Octave_InstallFunction"); #endif } if (!retn) { error(SWIG_name_d ": could not load function `%s'", name.c_str()); } return retn; } static const char *const subclass_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} subclass()\n\ @deftypefnx{Loadable Function} {} subclass(@var{swigclass}, @var{name}, @var{fcn}, @dots{})\n\ Subclass a C++ class from within Octave, and provide implementations of its virtual methods.\n\ \n\ See the SWIG manual for usage examples.\n\ @end deftypefn"; DEFUN_DLD( subclass, args, nargout, subclass_usage ) { octave_swig_type *top = new octave_swig_type; for (int j = 0; j < args.length(); ++j) { if (args(j).type_id() == octave_swig_ref::static_type_id()) { octave_swig_ref *osr = static_cast < octave_swig_ref *>(args(j).internal_rep()); octave_swig_type *ost = osr->get_ptr(); if (!ost->is_owned()) { error("subclass: cannot subclass object not constructed on octave side"); return octave_value_list(); } top->merge(*ost); } else if (args(j).is_function_handle()) { top->assign(args(j).fcn_handle_value()->fcn_name(), args(j)); } else if (args(j).is_string()) { if (j + 1 >= args.length()) { error("subclass: member assignments must be of string,value form"); return octave_value_list(); } top->assign(args(j).string_value(), args(j + 1)); ++j; } else { error("subclass: invalid arguments to subclass()"); return octave_value_list(); } } return octave_value(Swig::swig_value_ref(top)); } static const char *const swig_type_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_type(@var{swigref})\n\ Return the underlying C/C++ type name of a SWIG-wrapped object.\n\ @end deftypefn"; DEFUN_DLD( swig_type, args, nargout, swig_type_usage ) { if (args.length() != 1) { error("swig_type: must be called with only a single object"); return octave_value_list(); } octave_swig_type *ost = Swig::swig_value_deref(args(0)); if (!ost) { error("swig_type: object is not a swig_ref"); return octave_value_list(); } return octave_value(ost->swig_type_name()); } static const char *const swig_typequery_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_typequery(@var{string})\n\ Return @var{string} if it is a recognised SWIG-wrapped C/C++ type name;\n\ otherwise return `'.\n\ @end deftypefn"; DEFUN_DLD( swig_typequery, args, nargout, swig_typequery_usage ) { if (args.length() != 1 || !args(0).is_string()) { error("swig_typequery: must be called with single string argument"); return octave_value_list(); } swig_module_info *module = SWIG_GetModule(0); swig_type_info *type = SWIG_TypeQueryModule(module, module, args(0).string_value().c_str()); if (!type) return octave_value(""); return octave_value(type->name); } static const char *const swig_this_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_this(@var{swigref})\n\ Return the underlying C/C++ pointer of a SWIG-wrapped object.\n\ @end deftypefn"; DEFUN_DLD( swig_this, args, nargout, swig_this_usage ) { if (args.length() != 1) { error("swig_this: must be called with only a single object"); return octave_value_list(); } if (args(0).is_matrix_type() && args(0).rows() == 0 && args(0).columns() == 0) return octave_value(octave_uint64(0)); octave_swig_type *ost = Swig::swig_value_deref(args(0)); if (!ost) { error("swig_this: object is not a swig_ref"); return octave_value_list(); } return octave_value(octave_uint64((unsigned long long) ost->swig_this())); } static const char *const swig_octave_prereq_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Function} {} swig_octave_prereq(@var{major}, @var{minor}, @var{patch})\n\ Return true if the version of Octave is at least @var{major}.@var{minor}.@var{patch}.\n\ @end deftypefn"; DEFUN_DLD( swig_octave_prereq, args, nargout, swig_octave_prereq_usage ) { if (args.length() != 3) { error("swig_octave_prereq: must be called with 3 arguments"); return octave_value_list(); } const int major = args(0).int_value(); const int minor = args(1).int_value(); const int patch = args(2).int_value(); const bool prereq = SWIG_OCTAVE_PREREQ(major, minor, patch); return octave_value(prereq); } static const char *const SWIG_name_usage = "-*- texinfo -*- \n\ @deftypefn {Loadable Module} {} " SWIG_name_d "\n\ Loads the SWIG-generated module `" SWIG_name_d "'.\n\ @end deftypefn"; DEFUN_DLD( SWIG_name, args, nargout, SWIG_name_usage ) { static octave_swig_type* module_ns = 0; // workaround to prevent octave seg-faulting on exit: set Octave exit function // octave_exit to _Exit, which exits immediately without trying to cleanup memory. // definitely affected version 3.2.*, not sure about 3.3.*, seems to be fixed in // version 3.4.*, but reappeared in 4.2.*, so turn on for all versions after 3.2.*. // can be turned off with macro definition. #ifndef SWIG_OCTAVE_NO_SEGFAULT_HACK #if SWIG_OCTAVE_PREREQ(3,2,0) octave_exit = ::_Exit; #endif #endif // check for no input and output args if (args.length() != 0 || nargout != 0) { print_usage(); return octave_value_list(); } // create module on first function call if (!module_ns) { // workaround bug in octave where installing global variable of custom type and then // exiting without explicitly clearing the variable causes octave to segfault. #if SWIG_OCTAVE_PREREQ(3,2,0) octave_value_list eval_args; eval_args.append("base"); eval_args.append("function __swig_atexit__; " " if mislocked() " " clear -all; " " else " " mlock(); " " endif; " "endfunction; " "__swig_atexit__; " "atexit(\"__swig_atexit__\", false); " "atexit(\"__swig_atexit__\")"); feval("evalin", eval_args, 0); #endif octave_swig_ref::register_type(); octave_swig_packed::register_type(); SWIG_InitializeModule(0); SWIG_PropagateClientData(); octave_function *me = octave_call_stack::current(); if (!SWIG_Octave_InstallFunction(me, "subclass")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_type")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_typequery")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_this")) { return octave_value_list(); } if (!SWIG_Octave_InstallFunction(me, "swig_octave_prereq")) { return octave_value_list(); } octave_swig_type* cvar_ns=0; if (std::string(SWIG_global_name) != ".") { cvar_ns=new octave_swig_type; for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].get_method) cvar_ns->assign(swig_globals[j].name,&swig_globals[j]); } module_ns=new octave_swig_type(0, 0, 0, true); if (std::string(SWIG_global_name) != ".") { module_ns->assign(SWIG_global_name,Swig::swig_value_ref(cvar_ns)); } else { for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].get_method) module_ns->assign(swig_globals[j].name,&swig_globals[j]); } for (int j=0;swig_globals[j].name;++j) if (swig_globals[j].method) module_ns->assign(swig_globals[j].name,&swig_globals[j]); // * need better solution here; swig_type -> octave_class mapping is // * really n-to-1, in some cases such as template partial spec, etc. // * see failing tests. for (int j=0;swig_types[j];++j) if (swig_types[j]->clientdata) { swig_octave_class* c=(swig_octave_class*)swig_types[j]->clientdata; module_ns->assign(c->name, Swig::swig_value_ref (new octave_swig_type(0,swig_types[j]))); } if (!SWIG_init_user(module_ns)) { delete module_ns; module_ns=0; return octave_value_list(); } SWIG_InstallOps(octave_swig_ref::static_type_id()); octave_swig_type::swig_member_const_iterator mb; for (mb = module_ns->swig_members_begin(); mb != module_ns->swig_members_end(); ++mb) { if (mb->second.first && mb->second.first->method) { if (!SWIG_Octave_InstallFunction(me, mb->first)) { return octave_value_list(); } } } #if !SWIG_OCTAVE_PREREQ(3,2,0) mlock(me->name()); #else mlock(); #endif } octave_swig_type::swig_member_const_iterator mb; for (mb = module_ns->swig_members_begin(); mb != module_ns->swig_members_end(); ++mb) { if (mb->second.second.is_defined()) { SWIG_Octave_SetGlobalValue(mb->first, mb->second.second); SWIG_Octave_LinkGlobalValue(mb->first); } } SWIG_Octave_SetGlobalValue(SWIG_name_d, module_ns->as_value()); SWIG_Octave_LinkGlobalValue(SWIG_name_d); return octave_value_list(); } %} swig-3.0.12/Lib/octave/std_string.i0000664000175000017500000000004313042756442016753 0ustar williamwilliam%include swig-3.0.12/Lib/octave/std_map.i0000664000175000017500000001116013042756442016224 0ustar williamwilliam// Maps %include %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef octave_value result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct OctMapIterator_T : OctSwigIteratorClosed_T { OctMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctSwigIteratorClosed_T(curr, first, last, seq) { } }; template > struct OctMapKeyIterator_T : OctMapIterator_T { OctMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctMapIterator_T(curr, first, last, seq) { } }; template inline OctSwigIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = octave_value()) { return new OctMapKeyIterator_T(current, begin, end, seq); } template > struct OctMapValueIterator_T : OctMapIterator_T { OctMapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, octave_value seq) : OctMapIterator_T(curr, first, last, seq) { } }; template inline OctSwigIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, octave_value seq = 0) { return new OctMapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const OctSeq& octseq, std::map *map) { typedef typename std::map::value_type value_type; typename OctSeq::const_iterator it = octseq.begin(); for (;it != octseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(octave_value obj, map_type **val) { /* int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; */ return SWIG_ERROR; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static octave_value from(const map_type& map) { /* swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int pysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } */ return octave_value(); } }; } } %define %swig_map_common(Map...) %swig_sequence_iterator(Map); %swig_container_methods(Map); %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) %enddef %include swig-3.0.12/Lib/octave/octtypemaps.swg0000664000175000017500000000463213042756442017523 0ustar williamwilliam // Include fundamental fragment definitions %include // Look for user fragments file. %include // Octave fragments for primitive types %include // Octave fragments for char* strings //%include #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif // Octave types #define SWIG_Object octave_value #define VOID_Object octave_value() /* // Octave allows implicit conversion #define %implicitconv_flag $implicitconv */ // append output #define SWIG_AppendOutput(result, obj) SWIG_Octave_AppendOutput(result, obj) // set constant #define SWIG_SetConstant(name, obj) SWIG_Octave_SetConstant(module_ns,name,obj) // raise #define SWIG_Octave_Raise(OBJ, TYPE, DESC) error("C++ side threw an exception of type " TYPE) #define SWIG_Raise(obj, type, desc) SWIG_Octave_Raise(obj, type, desc) // Include the unified typemap library %include %typecheck(SWIG_TYPECHECK_SWIGOBJECT) SWIG_Object "$1 = (*$input).is_defined();"; %typecheck(SWIG_TYPECHECK_SWIGOBJECT) octave_value_list "$1 = true;"; %typemap(in) (octave_value_list varargs,...) { for (int j=$argnum-1;jappend($1); } %typemap(out,noblock=1) octave_map, Octave_map { $result=$1; } %typemap(out,noblock=1) NDArray { $result=$1; } %typemap(out,noblock=1) Cell { $result=$1; } /* // Smart Pointers %typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER { $result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(ret) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER { octave_swig_type* lobj=Swig::swig_value_deref($result); if (lobj) { std::list idx; idx.push_back(octave_value("__deref__")); idx.push_back(octave_value_list()); octave_value_list ovl(lobj->subsref(".(",idx)); octave_swig_type* robj=ovl.length()>=1?Swig::swig_value_deref(ovl(0)):0; if (robj && !error_state) lobj->append(robj); } } */ swig-3.0.12/Lib/octave/factory.i0000664000175000017500000000004013042756442016237 0ustar williamwilliam%include swig-3.0.12/Lib/octave/boost_shared_ptr.i0000664000175000017500000003703213042756442020144 0ustar williamwilliam%include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer // Note: $disown not implemented as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer by reference // Note: $disown not implemented as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 && *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 && **$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/intrusive_ptr.i0000664000175000017500000000537613042756442016245 0ustar williamwilliam// Allow for different namespaces for shared_ptr / intrusive_ptr - they could be boost or std or std::tr1 // For example for std::tr1, use: // #define SWIG_SHARED_PTR_NAMESPACE std // #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 // #define SWIG_INTRUSIVE_PTR_NAMESPACE boost // #define SWIG_INTRUSIVE_PTR_SUBNAMESPACE #if !defined(SWIG_INTRUSIVE_PTR_NAMESPACE) # define SWIG_INTRUSIVE_PTR_NAMESPACE boost #endif #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) # define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE::SWIG_INTRUSIVE_PTR_SUBNAMESPACE #else # define SWIG_INTRUSIVE_PTR_QNAMESPACE SWIG_INTRUSIVE_PTR_NAMESPACE #endif namespace SWIG_INTRUSIVE_PTR_NAMESPACE { #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) namespace SWIG_INTRUSIVE_PTR_SUBNAMESPACE { #endif template class intrusive_ptr { }; #if defined(SWIG_INTRUSIVE_PTR_SUBNAMESPACE) } #endif } %fragment("SWIG_intrusive_deleter", "header") { template struct SWIG_intrusive_deleter { void operator()(T *p) { if (p) intrusive_ptr_release(p); } }; } %fragment("SWIG_null_deleter", "header") { struct SWIG_null_deleter { void operator() (void const *) const { } }; %#define SWIG_NO_NULL_DELETER_0 , SWIG_null_deleter() %#define SWIG_NO_NULL_DELETER_1 } // Workaround empty first macro argument bug #define SWIGEMPTYHACK // Main user macro for defining intrusive_ptr typemaps for both const and non-const pointer types %define %intrusive_ptr(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_INTRUSIVE_PTR_TYPEMAPS(SWIGEMPTYHACK, TYPE) SWIG_INTRUSIVE_PTR_TYPEMAPS(const, TYPE) %enddef %define %intrusive_ptr_no_wrap(TYPE...) %feature("smartptr", noblock=1) TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > } SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(SWIGEMPTYHACK, TYPE) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(const, TYPE) %enddef // Legacy macros %define SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE...) #warning "SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE) is deprecated. Please use %intrusive_ptr(TYPE) instead." %intrusive_ptr(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %intrusive_ptr(TYPE) instead." %intrusive_ptr(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_NO_WRAP(PROXYCLASS, TYPE...) #warning "SWIG_INTRUSIVE_PTR_NO_WRAP(PROXYCLASS, TYPE) is deprecated. Please use %intrusive_ptr_no_wrap(TYPE) instead." %intrusive_ptr_no_wrap(TYPE) %enddef %define SWIG_INTRUSIVE_PTR_DERIVED_NO_WRAP(PROXYCLASS, BASECLASSTYPE, TYPE...) #warning "SWIG_INTRUSIVE_PTR_DERIVED_NO_WRAP(PROXYCLASS, BASECLASSTYPE, TYPE) is deprecated. Please use %intrusive_ptr_no_wrap(TYPE) instead." %intrusive_ptr_no_wrap(TYPE) %enddef swig-3.0.12/Lib/ruby/0000775000175000017500000000000013042756442014124 5ustar williamwilliamswig-3.0.12/Lib/ruby/std_complex.i0000664000175000017500000000072713042756442016625 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-3.0.12/Lib/ruby/std_deque.i0000664000175000017500000000133413042756442016254 0ustar williamwilliam/* Deques */ %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::deque & vec) { return traits_from_stdseq >::from(vec); } }; } %} %ignore std::deque::push_back; %ignore std::deque::pop_back; #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/ruby/rubyautodoc.swg0000664000175000017500000001041713042756442017211 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyautodoc.swg * * This file implements autodoc typemaps for some common ruby methods. * ----------------------------------------------------------------------------- */ %define AUTODOC(func, str) %feature("autodoc", str) func; %enddef AUTODOC(to_i, "Convert $class to an Integer"); AUTODOC(to_f, "Convert $class to a Float"); AUTODOC(coerce, "Coerce class to a number"); AUTODOC(to_a, "Convert $class to an Array"); AUTODOC(to_s, "Convert class to a String representation"); AUTODOC(inspect, "Inspect class and its contents"); AUTODOC(at, "Return element at a certain index"); AUTODOC(__getitem__, "Element accessor/slicing"); AUTODOC(__setitem__, "Element setter/slicing"); AUTODOC(slice, "Return a slice (portion of) the $class"); AUTODOC(push, "Add an element at the end of the $class"); AUTODOC(pop, "Remove and return element at the end of the $class"); AUTODOC(shift, "Remove and return element at the beginning of the $class"); AUTODOC(unshift, "Add one or more elements at the beginning of the $class"); AUTODOC(first, "Return the first element in $class"); AUTODOC(last, "Return the last element in $class"); // // Common Object methods // AUTODOC(hash, "Hashing function for class"); AUTODOC(dup, "Create a duplicate of the class and unfreeze it if needed"); AUTODOC(clone, "Create a duplicate of the class"); // // Container methods // AUTODOC(empty, "Check if $class is empty"); AUTODOC(size, "Size or Length of the $class"); AUTODOC(insert, "Insert one or more new elements in the $class"); // // Iterator methods (block) // AUTODOC(each, "Iterate thru each element in the $class. A block must be provided"); AUTODOC(find, "Find an element in the class"); AUTODOC(each_key, "Iterate thru each key element in the $class. A block must be provided"); AUTODOC(each_value, "Iterate thru each key element in the $class. A block must be provided"); AUTODOC(reject, "Iterate thru each element in the $class and reject those that fail a condition returning a new $class. A block must be provided"); AUTODOC(reject_bang, "Iterate thru each element in the $class and reject those that fail a condition. A block must be provided. $class is modified in place"); AUTODOC(select, "Iterate thru each element in the $class and select those that match a condition. A block must be provided"); AUTODOC(delete_at, "Delete an element at a certain index"); AUTODOC(__delete__, "Delete a matching element"); // // Hash methods // AUTODOC(keys, "Return an Array of key elements"); AUTODOC(values, "Return an Array of value elements"); AUTODOC(values_at, "Return an Array of value elements matching the conditions"); // // Operators // #ifdef __cplusplus AUTODOC(operator==, "Equality comparison operator"); AUTODOC(operator<=, "Lower or equal comparison operator"); AUTODOC(operator>=, "Higher or equal comparison operator"); AUTODOC(operator<, "Lower than comparison operator"); AUTODOC(operator>, "Higher than comparison operator"); AUTODOC(operator<<, "Left shifting or appending operator"); AUTODOC(operator>>, "Right shifting operator or extracting operator"); AUTODOC(operator+, "Add operator"); AUTODOC(operator-, "Substraction operator"); AUTODOC(operator+(), "Positive operator"); AUTODOC(operator-(), "Negation operator"); AUTODOC(operator&, "AND operator"); AUTODOC(operator|, "OR operator"); AUTODOC(operator^, "XOR operator"); AUTODOC(operator~, "Invert operator"); #endif AUTODOC(__eq__, "Equality comparison operator"); AUTODOC(__le__, "Lower or equal comparison operator"); AUTODOC(__ge__, "Higher or equal comparison operator"); AUTODOC(__lt__, "Lower than comparison operator"); AUTODOC(__gt__, "Higher than comparison operator"); AUTODOC(__lshift__, "Left shifting or appending operator"); AUTODOC(__rshift__, "Right shifting operator or extracting operator"); AUTODOC(__add___, "Add operator"); AUTODOC(__sub__, "Substraction operator"); AUTODOC(__pos__, "Positive operator"); AUTODOC(__neg__, "Negation operator"); AUTODOC(__and__, "AND operator"); AUTODOC(__or__, "OR operator"); AUTODOC(__xor__, "XOR operator"); AUTODOC(__negate__, "Invert operator"); AUTODOC(__pow__, "Exponential operator"); AUTODOC(__divmod__, "Modulo of division"); AUTODOC(__cmp__, "Comparison operator. Returns < 0 for less than, 0 for equal or > 1 for higher than."); swig-3.0.12/Lib/ruby/rubyhead.swg0000664000175000017500000001027113042756442016452 0ustar williamwilliam#include /* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which * breaks using rb_intern as an lvalue, as SWIG does. We work around this * issue for now by disabling this. * https://sourceforge.net/tracker/?func=detail&aid=2859614&group_id=1645&atid=101645 */ #ifdef rb_intern # undef rb_intern #endif /* Remove global macros defined in Ruby's win32.h */ #ifdef write # undef write #endif #ifdef read # undef read #endif #ifdef bind # undef bind #endif #ifdef close # undef close #endif #ifdef connect # undef connect #endif /* Ruby 1.7 defines NUM2LL(), LL2NUM() and ULL2NUM() macros */ #ifndef NUM2LL #define NUM2LL(x) NUM2LONG((x)) #endif #ifndef LL2NUM #define LL2NUM(x) INT2NUM((long) (x)) #endif #ifndef ULL2NUM #define ULL2NUM(x) UINT2NUM((unsigned long) (x)) #endif /* Ruby 1.7 doesn't (yet) define NUM2ULL() */ #ifndef NUM2ULL #ifdef HAVE_LONG_LONG #define NUM2ULL(x) rb_num2ull((x)) #else #define NUM2ULL(x) NUM2ULONG(x) #endif #endif /* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */ /* Define these for older versions so we can just write code the new way */ #ifndef RSTRING_LEN # define RSTRING_LEN(x) RSTRING(x)->len #endif #ifndef RSTRING_PTR # define RSTRING_PTR(x) RSTRING(x)->ptr #endif #ifndef RSTRING_END # define RSTRING_END(x) (RSTRING_PTR(x) + RSTRING_LEN(x)) #endif #ifndef RARRAY_LEN # define RARRAY_LEN(x) RARRAY(x)->len #endif #ifndef RARRAY_PTR # define RARRAY_PTR(x) RARRAY(x)->ptr #endif #ifndef RFLOAT_VALUE # define RFLOAT_VALUE(x) RFLOAT(x)->value #endif #ifndef DOUBLE2NUM # define DOUBLE2NUM(x) rb_float_new(x) #endif #ifndef RHASH_TBL # define RHASH_TBL(x) (RHASH(x)->tbl) #endif #ifndef RHASH_ITER_LEV # define RHASH_ITER_LEV(x) (RHASH(x)->iter_lev) #endif #ifndef RHASH_IFNONE # define RHASH_IFNONE(x) (RHASH(x)->ifnone) #endif #ifndef RHASH_SIZE # define RHASH_SIZE(x) (RHASH(x)->tbl->num_entries) #endif #ifndef RHASH_EMPTY_P # define RHASH_EMPTY_P(x) (RHASH_SIZE(x) == 0) #endif #ifndef RSTRUCT_LEN # define RSTRUCT_LEN(x) RSTRUCT(x)->len #endif #ifndef RSTRUCT_PTR # define RSTRUCT_PTR(x) RSTRUCT(x)->ptr #endif /* * Need to be very careful about how these macros are defined, especially * when compiling C++ code or C code with an ANSI C compiler. * * VALUEFUNC(f) is a macro used to typecast a C function that implements * a Ruby method so that it can be passed as an argument to API functions * like rb_define_method() and rb_define_singleton_method(). * * VOIDFUNC(f) is a macro used to typecast a C function that implements * either the "mark" or "free" stuff for a Ruby Data object, so that it * can be passed as an argument to API functions like Data_Wrap_Struct() * and Data_Make_Struct(). */ #ifdef __cplusplus # ifndef RUBY_METHOD_FUNC /* These definitions should work for Ruby 1.4.6 */ # define PROTECTFUNC(f) ((VALUE (*)()) f) # define VALUEFUNC(f) ((VALUE (*)()) f) # define VOIDFUNC(f) ((void (*)()) f) # else # ifndef ANYARGS /* These definitions should work for Ruby 1.6 */ # define PROTECTFUNC(f) ((VALUE (*)()) f) # define VALUEFUNC(f) ((VALUE (*)()) f) # define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) # else /* These definitions should work for Ruby 1.7+ */ # define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) # define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) # define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) # endif # endif #else # define VALUEFUNC(f) (f) # define VOIDFUNC(f) (f) #endif /* Don't use for expressions have side effect */ #ifndef RB_STRING_VALUE #define RB_STRING_VALUE(s) (TYPE(s) == T_STRING ? (s) : (*(volatile VALUE *)&(s) = rb_str_to_str(s))) #endif #ifndef StringValue #define StringValue(s) RB_STRING_VALUE(s) #endif #ifndef StringValuePtr #define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s)) #endif #ifndef StringValueLen #define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s)) #endif #ifndef SafeStringValue #define SafeStringValue(v) do {\ StringValue(v);\ rb_check_safe_str(v);\ } while (0) #endif #ifndef HAVE_RB_DEFINE_ALLOC_FUNC #define rb_define_alloc_func(klass, func) rb_define_singleton_method((klass), "new", VALUEFUNC((func)), -1) #define rb_undef_alloc_func(klass) rb_undef_method(CLASS_OF((klass)), "new") #endif static VALUE _mSWIG = Qnil; swig-3.0.12/Lib/ruby/std_multiset.i0000664000175000017500000000257313042756442017025 0ustar williamwilliam/* Multisets */ %include %fragment("StdMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::multiset* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static VALUE from(const std::multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_multiset_methods(Set...) %swig_set_methods(Set) %rename("delete") std::multiset::__delete__; %rename("reject!") std::multiset::reject_bang; %rename("map!") std::multiset::map_bang; %rename("empty?") std::multiset::empty; %rename("include?" ) std::multiset::__contains__ const; %rename("has_key?" ) std::multiset::has_key const; %alias std::multiset::push "<<"; %include swig-3.0.12/Lib/ruby/rubyruntime.swg0000664000175000017500000000064713042756442017242 0ustar williamwilliam %runtime "swiglabels.swg" /* Common C API type-checking code */ %runtime "swigrun.swg" /* Common C API type-checking code */ %runtime "swigerrors.swg" /* SWIG errors */ %runtime "rubyhead.swg" /* Ruby includes and fixes */ %runtime "rubyerrors.swg" /* Ruby errors */ %runtime "rubytracking.swg" /* API for tracking C++ classes to Ruby objects */ %runtime "rubyapi.swg" %runtime "rubyrun.swg" swig-3.0.12/Lib/ruby/rubytracking.swg0000664000175000017500000001054013042756442017352 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubytracking.swg * * This file contains support for tracking mappings from * Ruby objects to C++ objects. This functionality is needed * to implement mark functions for Ruby's mark and sweep * garbage collector. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #if !defined(ST_DATA_T_DEFINED) /* Needs to be explicitly included for Ruby 1.8 and earlier */ #include #endif /* Ruby 1.8 actually assumes the first case. */ #if SIZEOF_VOIDP == SIZEOF_LONG # define SWIG2NUM(v) LONG2NUM((unsigned long)v) # define NUM2SWIG(x) (unsigned long)NUM2LONG(x) #elif SIZEOF_VOIDP == SIZEOF_LONG_LONG # define SWIG2NUM(v) LL2NUM((unsigned long long)v) # define NUM2SWIG(x) (unsigned long long)NUM2LL(x) #else # error sizeof(void*) is not the same as long or long long #endif /* Global hash table to store Trackings from C/C++ structs to Ruby Objects. */ static st_table* swig_ruby_trackings = NULL; static VALUE swig_ruby_trackings_count(ANYARGS) { return SWIG2NUM(swig_ruby_trackings->num_entries); } /* Setup a hash table to store Trackings */ SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) { /* Create a hash table to store Trackings from C++ objects to Ruby objects. */ /* Try to see if some other .so has already created a tracking hash table, which we keep hidden in an instance var in the SWIG module. This is done to allow multiple DSOs to share the same tracking table. */ VALUE trackings_value = Qnil; /* change the variable name so that we can mix modules compiled with older SWIG's - this used to be called "@__trackings__" */ ID trackings_id = rb_intern( "@__safetrackings__" ); VALUE verbose = rb_gv_get("VERBOSE"); rb_gv_set("VERBOSE", Qfalse); trackings_value = rb_ivar_get( _mSWIG, trackings_id ); rb_gv_set("VERBOSE", verbose); /* The trick here is that we have to store the hash table pointer in a Ruby variable. We do not want Ruby's GC to treat this pointer as a Ruby object, so we convert it to a Ruby numeric value. */ if (trackings_value == Qnil) { /* No, it hasn't. Create one ourselves */ swig_ruby_trackings = st_init_numtable(); rb_ivar_set( _mSWIG, trackings_id, SWIG2NUM(swig_ruby_trackings) ); } else { swig_ruby_trackings = (st_table*)NUM2SWIG(trackings_value); } rb_define_virtual_variable("SWIG_TRACKINGS_COUNT", swig_ruby_trackings_count, NULL); } /* Add a Tracking from a C/C++ struct to a Ruby object */ SWIGRUNTIME void SWIG_RubyAddTracking(void* ptr, VALUE object) { /* Store the mapping to the global hash table. */ st_insert(swig_ruby_trackings, (st_data_t)ptr, object); } /* Get the Ruby object that owns the specified C/C++ struct */ SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) { /* Now lookup the value stored in the global hash table */ VALUE value; if (st_lookup(swig_ruby_trackings, (st_data_t)ptr, &value)) { return value; } else { return Qnil; } } /* Remove a Tracking from a C/C++ struct to a Ruby object. It is very important to remove objects once they are destroyed since the same memory address may be reused later to create a new object. */ SWIGRUNTIME void SWIG_RubyRemoveTracking(void* ptr) { /* Delete the object from the hash table */ st_delete(swig_ruby_trackings, (st_data_t *)&ptr, NULL); } /* This is a helper method that unlinks a Ruby object from its underlying C++ object. This is needed if the lifetime of the Ruby object is longer than the C++ object */ SWIGRUNTIME void SWIG_RubyUnlinkObjects(void* ptr) { VALUE object = SWIG_RubyInstanceFor(ptr); if (object != Qnil) { if (TYPE(object) != T_DATA) abort(); DATA_PTR(object) = 0; } } /* This is a helper method that iterates over all the trackings passing the C++ object pointer and its related Ruby object to the passed callback function. */ /* Proxy method to abstract the internal trackings datatype */ static int swig_ruby_internal_iterate_callback(void* ptr, VALUE obj, void(*meth)(void* ptr, VALUE obj)) { (*meth)(ptr, obj); return ST_CONTINUE; } SWIGRUNTIME void SWIG_RubyIterateTrackings( void(*meth)(void* ptr, VALUE obj) ) { st_foreach(swig_ruby_trackings, (int (*)(ANYARGS))&swig_ruby_internal_iterate_callback, (st_data_t)meth); } #ifdef __cplusplus } #endif swig-3.0.12/Lib/ruby/director.swg0000664000175000017500000002000613042756442016457 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Ruby proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ /* Use -DSWIG_DIRECTOR_NOUEH if you prefer to avoid the use of the Undefined Exception Handler provided by swig. */ #ifndef SWIG_DIRECTOR_NOUEH #ifndef SWIG_DIRECTOR_UEH #define SWIG_DIRECTOR_UEH #endif #endif #include #include #include #include # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() { } virtual swig_ruby_owntype get_own() const { swig_ruby_owntype own = {0, 0}; return own; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem *operator->() const { return _item; } private: GCItem *_item; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; struct GCItem_Object : GCItem { GCItem_Object(swig_ruby_owntype own) : _own(own) { } virtual ~GCItem_Object() { } swig_ruby_owntype get_own() const { return _own; } private: swig_ruby_owntype _own; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* body args */ struct body_args { VALUE recv; ID id; int argc; VALUE *argv; }; /* Base class for director exceptions */ class DirectorException : public std::exception { protected: VALUE swig_error; std::string swig_msg; protected: DirectorException(VALUE error) : swig_error(error) { } DirectorException(VALUE error, const char *hdr, const char *msg ="") : swig_error(error), swig_msg(hdr) { if (msg[0]) { swig_msg += " "; swig_msg += msg; } if (swig_msg.size()) { VALUE str = rb_str_new(swig_msg.data(), swig_msg.size()); swig_error = rb_exc_new3(error, str); } else { swig_error = error; } } public: virtual ~DirectorException() throw() { } VALUE getType() const { return CLASS_OF(swig_error); } VALUE getError() const { return swig_error; } /* Deprecated, use what() instead */ const std::string& getMessage() const { return swig_msg; } const char *what() const throw() { return swig_msg.c_str(); } }; /* unknown exception handler */ class UnknownExceptionHandler { #ifdef SWIG_DIRECTOR_UEH static void handler() { try { throw; } catch (DirectorException& e) { std::cerr << "SWIG Director exception caught:" << std::endl << e.what() << std::endl; } catch (std::exception& e) { std::cerr << "std::exception caught: "<< e.what() << std::endl; } catch (...) { std::cerr << "Unknown exception caught." << std::endl; } std::cerr << std::endl << "Ruby interpreter traceback:" << std::endl; std::cerr << std::endl; std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl << std::endl << "Exception is being re-thrown, program will like abort/terminate." << std::endl; throw; } public: std::unexpected_handler old; UnknownExceptionHandler(std::unexpected_handler nh = handler) { old = std::set_unexpected(nh); } ~UnknownExceptionHandler() { std::set_unexpected(old); } #endif }; /* Type mismatch in the return value from a Ruby method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(VALUE error, const char *msg="") : DirectorException(error, "SWIG director type mismatch", msg) { } DirectorTypeMismatchException(const char *msg="") : DirectorException(rb_eTypeError, "SWIG director type mismatch", msg) { } static void raise(VALUE error, const char *msg) { throw DirectorTypeMismatchException(error, msg); } static void raise(const char *msg) { throw DirectorTypeMismatchException(msg); } }; /* Any Ruby exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException(VALUE error) : DirectorException(error) { } DirectorMethodException(const char *msg = "") : DirectorException(rb_eRuntimeError, "SWIG director method error.", msg) { } static void raise(VALUE error) { throw DirectorMethodException(error); } }; /* Attempted to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg = "") : DirectorException(rb_eRuntimeError, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* Simple thread abstraction for pthreads on win32 */ #ifdef __THREAD__ # define __PTHREAD__ # if defined(_WIN32) || defined(__WIN32__) # define pthread_mutex_lock EnterCriticalSection # define pthread_mutex_unlock LeaveCriticalSection # define pthread_mutex_t CRITICAL_SECTION # define SWIG_MUTEX_INIT(var) var # else # include # define SWIG_MUTEX_INIT(var) var = PTHREAD_MUTEX_INITIALIZER # endif #endif #ifdef __PTHREAD__ struct Guard { pthread_mutex_t *_mutex; Guard(pthread_mutex_t &mutex) : _mutex(&mutex) { pthread_mutex_lock(_mutex); } ~Guard() { pthread_mutex_unlock(_mutex); } }; # define SWIG_GUARD(mutex) Guard _guard(mutex) #else # define SWIG_GUARD(mutex) #endif /* director base class */ class Director { private: /* pointer to the wrapped Ruby object */ VALUE swig_self; /* flag indicating whether the object is owned by Ruby or c++ */ mutable bool swig_disown_flag; public: /* wrap a Ruby object. */ Director(VALUE self) : swig_self(self), swig_disown_flag(false) { } /* discard our reference at destruction */ virtual ~Director() { } /* return a pointer to the wrapped Ruby object */ VALUE swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped Ruby object (the sense of "disown" is from Ruby) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag = true; } } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; #ifdef __PTHREAD__ static pthread_mutex_t swig_mutex_own; #endif public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const { if (vptr && own.datafree) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_Object(own); } } swig_ruby_owntype swig_release_ownership(void *vptr) const { swig_ruby_owntype own = {0, 0}; if (vptr) { SWIG_GUARD(swig_mutex_own); swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own.datafree = iter->second->get_own().datafree; swig_owner.erase(iter); } } return own; } }; } swig-3.0.12/Lib/ruby/rubyiterators.swg0000664000175000017500000005444713042756442017602 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyiterators.swg * * Implement a C++ 'output' iterator for Ruby. * * Users can derive form the Iterator to implemet their * own iterators. As an example (real one since we use it for STL/STD * containers), the template Iterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("ConstIterator","header",fragment="",fragment="GC_VALUE_definition") { namespace swig { struct stop_iteration { }; /** * Abstract base class used to represent all iterators of STL containers. */ struct ConstIterator { public: typedef ConstIterator self_type; protected: GC_VALUE _seq; protected: ConstIterator(VALUE seq) : _seq(seq) { } // Random access iterator methods, but not required in Ruby virtual ptrdiff_t distance(const ConstIterator &x) const { throw std::invalid_argument("distance not supported"); } virtual bool equal (const ConstIterator &x) const { throw std::invalid_argument("equal not supported"); } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("advance not supported"); } public: virtual ~ConstIterator() {} // Access iterator method, required by Ruby virtual VALUE value() const { throw std::invalid_argument("value not supported"); return Qnil; }; virtual VALUE setValue( const VALUE& v ) { throw std::invalid_argument("value= not supported"); return Qnil; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } virtual VALUE to_s() const { throw std::invalid_argument("to_s not supported"); return Qnil; } virtual VALUE inspect() const { throw std::invalid_argument("inspect not supported"); return Qnil; } virtual ConstIterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } // // C++ common/needed methods. We emulate a bidirectional // operator, to be compatible with all the STL. // The iterator traits will then tell the STL what type of // iterator we really are. // ConstIterator() : _seq( Qnil ) { } ConstIterator( const self_type& b ) : _seq( b._seq ) { } self_type& operator=( const self_type& b ) { _seq = b._seq; return *this; } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const ConstIterator& x) const { return ! operator==(x); } // Pre-decrement operator self_type& operator--() { return *previous(); } // Pre-increment operator self_type& operator++() { return *next(); } // Post-decrement operator self_type operator--(int) { self_type r = *this; previous(); return r; } // Post-increment operator self_type operator++(int) { self_type r = *this; next(); return r; } ConstIterator& operator += (ptrdiff_t n) { return *advance(n); } ConstIterator& operator -= (ptrdiff_t n) { return *advance(-n); } ConstIterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } ConstIterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const ConstIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::ConstIterator *"); init = 1; } return desc; } }; /** * Abstract base class used to represent all non-const iterators of STL containers. * */ struct Iterator : public ConstIterator { public: typedef Iterator self_type; protected: Iterator(VALUE seq) : ConstIterator(seq) { } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("operation not supported"); } public: static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::Iterator *"); init = 1; } return desc; } virtual Iterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const Iterator& x) const { return ! operator==(x); } Iterator& operator += (ptrdiff_t n) { return *advance(n); } Iterator& operator -= (ptrdiff_t n) { return *advance(-n); } Iterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } Iterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const Iterator& x) const { return x.distance(*this); } }; } } %fragment("ConstIterator_T","header",fragment="",fragment="ConstIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { /** * Templated base classes for all custom const_iterators. * */ template class ConstIterator_T : public ConstIterator { public: typedef OutConstIterator const_iter; typedef typename std::iterator_traits::value_type value_type; typedef ConstIterator_T self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ConstIterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: ConstIterator_T() : ConstIterator(Qnil) { } ConstIterator_T(const_iter curr, VALUE seq = Qnil) : ConstIterator(seq), current(curr) { } const const_iter& get_current() const { return current; } const value_type& operator*() const { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: const_iter current; }; /** * Templated base classes for all custom non-const iterators. * */ template class Iterator_T : public Iterator { public: typedef InOutIterator nonconst_iter; // Make this class iterator STL compatible, by using iterator_traits typedef typename std::iterator_traits::iterator_category iterator_category; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::pointer pointer; typedef typename std::iterator_traits::reference reference; typedef Iterator base; typedef Iterator_T< nonconst_iter > self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual Iterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: Iterator_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator(seq), current(curr) { } const nonconst_iter& get_current() const { return current; } self_type& operator=( const self_type& b ) { base::operator=( b ); return *this; } self_type& operator=( const value_type& b ) { *current = b; return *this; } const value_type& operator*() const { return *current; } value_type& operator*() { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: nonconst_iter current; }; /** * Auxiliary functor to store the value of a ruby object inside * a reference of a compatible C++ type. ie: Ruby -> C++ * */ template struct asval_oper { typedef ValueType value_type; typedef bool result_type; bool operator()(VALUE obj, value_type& v) const { return ( swig::asval< value_type >(obj, &v) == SWIG_OK ); } }; /** * Auxiliary functor to return a ruby object from a C++ type. * ie: C++ -> Ruby * */ template struct from_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; /** * ConstIterator class for a const_iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorOpen_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorOpen_T self_type; ConstIteratorOpen_T(const_iter curr, VALUE seq = Qnil) : ConstIterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } ConstIterator *dup() const { return new self_type(*this); } }; /** * Iterator class for an iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorOpen_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; public: IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { value_type& dst = *base::current; if ( asval(v, dst) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /** * ConstIterator class for a const_iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorClosed_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorClosed_T self_type; protected: virtual ConstIterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: ConstIteratorClosed_T(const_iter curr, const_iter first, const_iter last, VALUE seq = Qnil) : ConstIterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } ConstIterator *dup() const { return new self_type(*this); } private: const_iter begin; const_iter end; }; /** * Iterator class for a iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorClosed_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } // Iterator setter method, required by Ruby virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); value_type& dst = *base::current; if ( asval( v, dst ) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorOpen_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorClosed_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, const InOutIter& begin, const InOutIter& end, VALUE seq = Qnil) { return new IteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil) { return new IteratorOpen_T(current, seq); } /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = Qnil) { return new ConstIteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, VALUE seq = Qnil) { return new ConstIteratorOpen_T(current, seq); } } } %fragment("ConstIterator"); // // This part is just so SWIG is aware of the base abstract iterator class. // namespace swig { /* Throw a StopIteration exception */ %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { (void)$1; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } /* Mark methods that return new objects */ %newobject ConstIterator::dup; %newobject ConstIterator::operator + (ptrdiff_t n) const; %newobject ConstIterator::operator - (ptrdiff_t n) const; %nodirector ConstIterator; %catches(swig::stop_iteration) ConstIterator::value() const; %catches(swig::stop_iteration) ConstIterator::incr(size_t n = 1); %catches(swig::stop_iteration) ConstIterator::decr(size_t n = 1); %catches(std::invalid_argument) ConstIterator::distance(const ConstIterator &x) const; %catches(std::invalid_argument) ConstIterator::equal (const ConstIterator &x) const; %catches(swig::stop_iteration) ConstIterator::next(); %catches(swig::stop_iteration) ConstIterator::previous(); %catches(swig::stop_iteration) ConstIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) ConstIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) ConstIterator::operator - (ptrdiff_t n) const; struct ConstIterator { protected: ConstIterator(VALUE seq); public: virtual ~ConstIterator(); // Access iterator method, required by Ruby virtual VALUE value() const; // C++ common/needed methods virtual ConstIterator *dup() const; virtual VALUE inspect() const; virtual VALUE to_s() const; virtual ConstIterator* next(size_t n = 1); virtual ConstIterator* previous(size_t n = 1); bool operator == (const ConstIterator& x) const; ConstIterator* operator + (ptrdiff_t n) const; ConstIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const ConstIterator& x) const; }; struct Iterator : public ConstIterator { %rename("value=") setValue( const VALUE& v ); virtual VALUE setValue( const VALUE& v ); virtual Iterator *dup() const; virtual Iterator* next(size_t n = 1); virtual Iterator* previous(size_t n = 1); virtual VALUE inspect() const; virtual VALUE to_s() const; bool operator == (const Iterator& x) const; Iterator* operator + (ptrdiff_t n) const; Iterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const Iterator& x) const; }; } swig-3.0.12/Lib/ruby/rubyerrors.swg0000664000175000017500000000720213042756442017065 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ /* Define some additional error types */ #define SWIG_ObjectPreviouslyDeletedError -100 /* Define custom exceptions for errors that do not map to existing Ruby exceptions. Note this only works for C++ since a global cannot be initialized by a function in C. For C, fallback to rb_eRuntimeError.*/ SWIGINTERN VALUE getNullReferenceError(void) { static int init = 0; static VALUE rb_eNullReferenceError ; if (!init) { init = 1; rb_eNullReferenceError = rb_define_class("NullReferenceError", rb_eRuntimeError); } return rb_eNullReferenceError; } SWIGINTERN VALUE getObjectPreviouslyDeletedError(void) { static int init = 0; static VALUE rb_eObjectPreviouslyDeleted ; if (!init) { init = 1; rb_eObjectPreviouslyDeleted = rb_define_class("ObjectPreviouslyDeleted", rb_eRuntimeError); } return rb_eObjectPreviouslyDeleted; } SWIGINTERN VALUE SWIG_Ruby_ErrorType(int SWIG_code) { VALUE type; switch (SWIG_code) { case SWIG_MemoryError: type = rb_eNoMemError; break; case SWIG_IOError: type = rb_eIOError; break; case SWIG_RuntimeError: type = rb_eRuntimeError; break; case SWIG_IndexError: type = rb_eIndexError; break; case SWIG_TypeError: type = rb_eTypeError; break; case SWIG_DivisionByZero: type = rb_eZeroDivError; break; case SWIG_OverflowError: type = rb_eRangeError; break; case SWIG_SyntaxError: type = rb_eSyntaxError; break; case SWIG_ValueError: type = rb_eArgError; break; case SWIG_SystemError: type = rb_eFatal; break; case SWIG_AttributeError: type = rb_eRuntimeError; break; case SWIG_NullReferenceError: type = getNullReferenceError(); break; case SWIG_ObjectPreviouslyDeletedError: type = getObjectPreviouslyDeletedError(); break; case SWIG_UnknownError: type = rb_eRuntimeError; break; default: type = rb_eRuntimeError; } return type; } /* This function is called when a user inputs a wrong argument to a method. */ SWIGINTERN const char* Ruby_Format_TypeError( const char* msg, const char* type, const char* name, const int argn, VALUE input ) { char buf[128]; VALUE str; VALUE asStr; if ( msg && *msg ) { str = rb_str_new2(msg); } else { str = rb_str_new(NULL, 0); } str = rb_str_cat2( str, "Expected argument " ); sprintf( buf, "%d of type ", argn-1 ); str = rb_str_cat2( str, buf ); str = rb_str_cat2( str, type ); str = rb_str_cat2( str, ", but got " ); str = rb_str_cat2( str, rb_obj_classname(input) ); str = rb_str_cat2( str, " " ); asStr = rb_inspect(input); if ( RSTRING_LEN(asStr) > 30 ) { str = rb_str_cat( str, StringValuePtr(asStr), 30 ); str = rb_str_cat2( str, "..." ); } else { str = rb_str_append( str, asStr ); } if ( name ) { str = rb_str_cat2( str, "\n\tin SWIG method '" ); str = rb_str_cat2( str, name ); str = rb_str_cat2( str, "'" ); } return StringValuePtr( str ); } /* This function is called when an overloaded method fails */ SWIGINTERN void Ruby_Format_OverloadedError( const int argc, const int maxargs, const char* method, const char* prototypes ) { const char* msg = "Wrong # of arguments"; if ( argc <= maxargs ) msg = "Wrong arguments"; rb_raise(rb_eArgError,"%s for overloaded method '%s'.\n" "Possible C/C++ prototypes are:\n%s", msg, method, prototypes); } swig-3.0.12/Lib/ruby/cpointer.i0000664000175000017500000000004113042756442016114 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/std_shared_ptr.i0000664000175000017500000000010413042756442017276 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-3.0.12/Lib/ruby/timeval.i0000664000175000017500000000223413042756442015740 0ustar williamwilliam/* struct timeval * time_t Ruby has builtin class Time. INPUT/OUTPUT typemap for timeval and time_t is provided. */ %{ #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_SYS_TIME_H # include struct timeval rb_time_timeval(VALUE); #endif #ifdef __cplusplus } #endif %} %typemap(in) struct timeval *INPUT (struct timeval temp) { if (NIL_P($input)) $1 = NULL; else { temp = rb_time_timeval($input); $1 = &temp; } } %typemap(in,numinputs=0) struct timeval *OUTPUT(struct timeval temp) { $1 = &temp; } %typemap(argout) struct timeval *OUTPUT { $result = rb_time_new($1->tv_sec, $1->tv_usec); } %typemap(out) struct timeval * { $result = rb_time_new($1->tv_sec, $1->tv_usec); } %typemap(out) struct timespec * { $result = rb_time_new($1->tv_sec, $1->tv_nsec / 1000); } // time_t %typemap(in) time_t { if (NIL_P($input)) $1 = (time_t)-1; else $1 = NUM2LONG(rb_funcall($input, rb_intern("tv_sec"), 0)); } %typemap(typecheck) time_t { $1 = (NIL_P($input) || TYPE(rb_funcall($input, rb_intern("respond_to?"), 1, ID2SYM(rb_intern("tv_sec")))) == T_TRUE); } %typemap(out) time_t { $result = rb_time_new($1, 0); } swig-3.0.12/Lib/ruby/std_multimap.i0000664000175000017500000001370513042756442017006 0ustar williamwilliam/* Multimaps */ %include %fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::multimap *multimap) { typedef typename std::multimap::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::multimap multimap_type; static int asptr(VALUE obj, std::multimap **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); return traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p; res = SWIG_ConvertPtr(obj,(void**)&p,swig::type_info(),0); if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static VALUE from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "multimap size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); VALUE oldval = rb_hash_aref( obj, key ); if ( oldval == Qnil ) rb_hash_aset(obj, key, val); else { // Multiple values for this key, create array if needed // and add a new element to it. VALUE ary; if ( TYPE(oldval) == T_ARRAY ) ary = oldval; else { ary = rb_ary_new2(2); rb_ary_push( ary, oldval ); rb_hash_aset( obj, key, ary ); } rb_ary_push( ary, val ); } } return obj; } } }; } } %define %swig_multimap_methods(MultiMap...) %swig_map_common(%arg(MultiMap)); %extend { VALUE __getitem__(const key_type& key) const { MultiMap::const_iterator i = self->find(key); if ( i != self->end() ) { MultiMap::const_iterator e = $self->upper_bound(key); VALUE ary = rb_ary_new(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from( i->second ) ); } if ( RARRAY_LEN(ary) == 1 ) return RARRAY_PTR(ary)[0]; return ary; } else return Qnil; } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(MultiMap::value_type(key,x)); } VALUE inspect() { MultiMap::iterator i = $self->begin(); MultiMap::iterator e = $self->end(); const char *type_name = swig::type_name< MultiMap >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); str = rb_str_buf_append( str, rb_inspect(tmp) ); str = rb_str_cat2( str, "=>" ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } if ( RARRAY_LEN(vals) == 1 ) { str = rb_str_buf_append( str, rb_inspect(tmp) ); } else { str = rb_str_buf_append( str, rb_inspect(vals) ); } } str = rb_str_cat2( str, "}" ); return str; } VALUE to_a() { MultiMap::const_iterator i = $self->begin(); MultiMap::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); rb_ary_push( ary, tmp ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } if ( RARRAY_LEN(vals) == 1 ) { rb_ary_push( ary, tmp ); } else { rb_ary_push( ary, vals ); } } return ary; } VALUE to_s() { MultiMap::iterator i = $self->begin(); MultiMap::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; while ( i != e ) { const MultiMap::key_type& key = i->first; const MultiMap::key_type& oldkey = key; tmp = swig::from( key ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); VALUE vals = rb_ary_new(); for ( ; i != e && key == oldkey; ++i ) { const MultiMap::mapped_type& val = i->second; tmp = swig::from( val ); rb_ary_push( vals, tmp ); } tmp = rb_obj_as_string( vals ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef %mixin std::multimap "Enumerable"; %rename("delete") std::multimap::__delete__; %rename("reject!") std::multimap::reject_bang; %rename("map!") std::multimap::map_bang; %rename("empty?") std::multimap::empty; %rename("include?" ) std::multimap::__contains__ const; %rename("has_key?" ) std::multimap::has_key const; %alias std::multimap::push "<<"; %include swig-3.0.12/Lib/ruby/rubytypemaps.swg0000664000175000017500000000342013042756442017411 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Ruby * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* bool is dangerous in Ruby, change precedence */ #undef SWIG_TYPECHECK_BOOL %define SWIG_TYPECHECK_BOOL 10000 %enddef /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Ruby fragments for primitive types */ %include /* Ruby fragments for char* strings */ %include /* Backward compatibility output helper */ %fragment("output_helper","header") %{ #define output_helper SWIG_Ruby_AppendOutput %} /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* Directors are supported in Ruby */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Ruby types */ #define SWIG_Object VALUE #define VOID_Object Qnil /* Overload of the output/constant/exception handling */ /* append output */ #define SWIG_AppendOutput(result,obj) SWIG_Ruby_AppendOutput(result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) rb_define_const($module, name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) rb_exc_raise(SWIG_Ruby_ExceptionType(desc, obj)) /* Get the address of the 'Ruby self' object */ %typemap(in,numinputs=0,noblock=1) VALUE* RUBY_SELF { $1 = &self; } /* Include the unified typemap library */ %include swig-3.0.12/Lib/ruby/std_vector.i0000664000175000017500000000230213042756442016447 0ustar williamwilliam/* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_vector_methods(Type...) %swig_sequence_methods(Type) %swig_sequence_front_inserters(Type); %enddef %define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %swig_sequence_front_inserters(Type); %enddef %mixin std::vector "Enumerable"; %ignore std::vector::push_back; %ignore std::vector::pop_back; %rename("delete") std::vector::__delete__; %rename("reject!") std::vector::reject_bang; %rename("map!") std::vector::map_bang; %rename("empty?") std::vector::empty; %rename("include?" ) std::vector::__contains__ const; %rename("has_key?" ) std::vector::has_key const; %alias std::vector::push "<<"; %include swig-3.0.12/Lib/ruby/Makefile.swig0000664000175000017500000000165613042756442016544 0ustar williamwilliam# File : Makefile.swig # Makefile for a SWIG module. Use this file if you are # producing a Ruby extension for general use or distribution. # # 1. Prepare extconf.rb. # 2. Modify this file as appropriate. # 3. Type 'make -f Makefile.swig' to generate wrapper code and Makefile. # 4. Type 'make' to build your extension. # 5. Type 'make install' to install your extension. # MODULE = yourmodule FEATURE = $(MODULE) INTERFACE = $(MODULE).i RUBY = ruby SWIG = swig # for C extension SWIGOPT = -ruby WRAPPER = $(MODULE)_wrap.c ## for C++ extension #SWIGOPT = -ruby -c++ #WRAPPER = $(MODULE)_wrap.cc swigall: $(WRAPPER) Makefile $(WRAPPER): $(INTERFACE) $(SWIG) $(SWIGOPT) -o $@ $(INTERFACE) Makefile: extconf.rb $(RUBY) extconf.rb @if [ -f Makefile ] ; then\ echo "include Makefile.swig" >> Makefile;\ fi swigclean: @if [ -f Makefile ] ; then\ make -f Makefile clean;\ fi rm -f Makefile $(WRAPPER) swig-3.0.12/Lib/ruby/std_alloc.i0000664000175000017500000000003313042756442016236 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/rubystrings.swg0000664000175000017500000000304113042756442017237 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc) { if (TYPE(obj) == T_STRING) { char *cstr = StringValuePtr(obj); size_t size = RSTRING_LEN(obj) + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = %new_copy_array(cstr, size, char); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *)vptr; if (psize) *psize = vptr ? (strlen((char*)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE VALUE SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > LONG_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_NewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : Qnil; } else { return rb_str_new(carray, %numeric_cast(size,long)); } } else { return Qnil; } } } swig-3.0.12/Lib/ruby/rubystdautodoc.swg0000664000175000017500000000343313042756442017724 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubystdautodoc.swg * * This file contains autodocs for standard STL functions. * ----------------------------------------------------------------------------- */ // // For STL autodocumentation // AUTODOC(c_str, "Convert class to a String representation"); AUTODOC(begin, "Return an iterator to the beginning of the $class"); AUTODOC(end, "Return an iterator to past the end of the $class"); AUTODOC(rbegin, "Return a reverse iterator to the beginning (the end) of the $class"); AUTODOC(rend, "Return a reverse iterator to past the end (past the beginning) of the $class"); AUTODOC(length, "Size or Length of the $class"); AUTODOC(replace, "Replace all or a portion of the $class"); AUTODOC(resize, "Resize the size of the $class"); AUTODOC(capacity, "Reserved capacity of the $class"); AUTODOC(reserve, "Reserve memory in the $class for a number of elements"); AUTODOC(erase, "Delete a portion of the $class"); AUTODOC(max_size, "Maximum size of elements allowed in the $class"); AUTODOC(iterator, "Return an iterator to the $class"); AUTODOC(empty, "Check if the $class is empty or not"); AUTODOC(rfind, "Find an element in reverse usually starting from the end of the $class"); AUTODOC(assign, "Assign a new $class or portion of it"); AUTODOC(front, "Return the first element in $class"); AUTODOC(back, "Return the last element in $class"); AUTODOC(second, "Return the second element in $class"); AUTODOC(push_front, "Add an element at the beginning of the $class"); AUTODOC(push_back, "Add an element at the end of the $class"); AUTODOC(pop_front, "Remove and return element at the beginning of the $class"); AUTODOC(pop_back, "Remove and return an element at the end of the $class"); AUTODOC(clear, "Clear $class contents"); swig-3.0.12/Lib/ruby/std_set.i0000664000175000017500000001460313042756442015747 0ustar williamwilliam/* Sets */ %fragment("StdSetTraits","header",fragment="",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const RubySeq& rubyseq, std::set* seq) { // seq->insert(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(VALUE obj, std::set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static VALUE from(const std::set& vec) { return traits_from_stdseq >::from(vec); } }; /** * Set Iterator class for an iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class SetIteratorOpen_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef SetIteratorOpen_T self_type; public: SetIteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } // no setValue allowed Iterator *dup() const { return new self_type(*this); } }; /** * Set Iterator class for a iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class SetIteratorClosed_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef SetIteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: SetIteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } // no setValue allowed Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; // Template specialization to construct a closed iterator for sets // this turns a nonconst iterator into a const one for ruby to avoid // allowing the user to change the value template< typename InOutIter > inline Iterator* make_set_nonconst_iterator(const InOutIter& current, const InOutIter& begin, const InOutIter& end, VALUE seq = Qnil) { return new SetIteratorClosed_T< InOutIter >(current, begin, end, seq); } // Template specialization to construct an open iterator for sets // this turns a nonconst iterator into a const one for ruby to avoid // allowing the user to change the value template< typename InOutIter > inline Iterator* make_set_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil) { return new SetIteratorOpen_T< InOutIter >(current, seq); } } %} %define %swig_sequence_methods_extra_set(Sequence...) %extend { %alias reject_bang "delete_if"; Sequence* reject_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); for ( Sequence::iterator i = $self->begin(); i != $self->end(); ) { VALUE r = swig::from< Sequence::value_type >(*i); Sequence::iterator current = i++; if ( RTEST( rb_yield(r) ) ) $self->erase(current); } return self; } } %enddef %define %swig_set_methods(set...) %swig_sequence_methods_common(%arg(set)); %swig_sequence_methods_extra_set(%arg(set)); %fragment("RubyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="RubySequence_Cont") {} // Redefine std::set iterator/reverse_iterator typemap %typemap(out,noblock=1) iterator, reverse_iterator { $result = SWIG_NewPointerObj(swig::make_set_nonconst_iterator(%static_cast($1,const $type &), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); } // Redefine std::set std::pair typemap %typemap(out,noblock=1,fragment="RubyPairBoolOutputIterator") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_set_nonconst_iterator(%static_cast($1,$type &).first), swig::Iterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_From(bool)(%static_cast($1,const $type &).second)); } %extend { %alias push "<<"; value_type push(const value_type& x) { self->insert(x); return x; } bool __contains__(const value_type& x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } }; %enddef %mixin std::set "Enumerable"; %rename("delete") std::set::__delete__; %rename("reject!") std::set::reject_bang; %rename("map!") std::set::map_bang; %rename("empty?") std::set::empty; %rename("include?" ) std::set::__contains__ const; %rename("has_key?" ) std::set::has_key const; %alias std::set::push "<<"; %include swig-3.0.12/Lib/ruby/rubydef.swg0000664000175000017500000000005213042756442016303 0ustar williamwilliam/* empty file added for backward comp. */ swig-3.0.12/Lib/ruby/std_container.i0000664000175000017500000000007413042756442017133 0ustar williamwilliam%include %include swig-3.0.12/Lib/ruby/cni.i0000664000175000017500000000005213042756442015044 0ustar williamwilliam%include %include swig-3.0.12/Lib/ruby/rubystdcommon.swg0000664000175000017500000001212713042756442017556 0ustar williamwilliam /* ------------------------------------------------------------ * The Ruby classes, for C++ * ------------------------------------------------------------ */ %include %fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static VALUE from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static VALUE from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static VALUE from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static VALUE from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline VALUE from(const Type& val) { return traits_from::from(val); } template inline VALUE from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(VALUE obj, Type **val) { Type *p; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(VALUE obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(VALUE obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(VALUE obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(VALUE obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(VALUE obj, bool throw_error) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { if (throw_error) throw std::invalid_argument("bad type"); VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } } return v; } }; template struct traits_as { static Type as(VALUE obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { // Uninitialized return value, no Type() constructor required. if (throw_error) throw std::invalid_argument("bad type"); VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } static Type *v_def = (Type*) malloc(sizeof(Type)); memset(v_def,0,sizeof(Type)); return *v_def; } } }; template struct traits_as { static Type* as(VALUE obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (throw_error) throw std::invalid_argument("bad type"); VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { %type_error(swig::type_name()); } return 0; } } }; template inline Type as(VALUE obj, bool te = false) { return traits_as< Type, typename traits< Type >::category >::as(obj, te); } template struct traits_check { static bool check(VALUE obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(VALUE obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(VALUE obj) { return traits_check::category>::check(obj); } } } swig-3.0.12/Lib/ruby/std_wstring.i0000664000175000017500000000010113042756442016635 0ustar williamwilliam%include %include swig-3.0.12/Lib/ruby/file.i0000664000175000017500000000120213042756442015210 0ustar williamwilliam// FILE * %{ #ifdef __cplusplus extern "C" { #endif /* Ruby 1.9 changed the file name of this header */ #ifdef HAVE_RUBY_IO_H #include "ruby/io.h" #else #include "rubyio.h" #endif #ifdef __cplusplus } #endif %} %typemap(in) FILE *READ { OpenFile *of; GetOpenFile($input, of); rb_io_check_readable(of); $1 = GetReadFile(of); rb_read_check($1); } %typemap(in) FILE *READ_NOCHECK { OpenFile *of; GetOpenFile($input, of); rb_io_check_readable(of); $1 = GetReadFile(of); } %typemap(in) FILE *WRITE { OpenFile *of; GetOpenFile($input, of); rb_io_check_writable(of); $1 = GetWriteFile(of); } swig-3.0.12/Lib/ruby/extconf.rb0000664000175000017500000000035213042756442016117 0ustar williamwilliamrequire 'mkmf' dir_config('yourlib') if have_header('yourlib.h') and have_library('yourlib', 'yourlib_init') # If you use swig -c option, you may have to link libswigrb. # have_library('swigrb') create_makefile('yourlib') end swig-3.0.12/Lib/ruby/ruby.swg0000664000175000017500000000513513042756442015633 0ustar williamwilliam/* ------------------------------------------------------------ * ruby.swg * * Ruby configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * The Ruby auto rename rules * ------------------------------------------------------------ */ #if defined(SWIG_RUBY_AUTORENAME) /* Class names are CamelCase */ %rename("%(camelcase)s", %$isclass) ""; /* Constants created by %constant or #define are UPPER_CASE */ %rename("%(uppercase)s", %$isconstant) ""; /* SWIG only considers static class members with inline intializers to be constants. For examples of what is and isn't considered a constant by SWIG see naming.i in the Ruby test suite. */ %rename("%(uppercase)s", %$ismember, %$isvariable,%$isimmutable,%$isstatic,%$hasvalue,%$hasconsttype) ""; /* Enums are mapped to constants but all we do is make sure the first letter is uppercase */ %rename("%(firstuppercase)s", %$isenumitem) ""; /* Method names should be lower_case_with_underscores */ %rename("%(undercase)s", %$isfunction, %$not %$ismemberget, %$not %$ismemberset) ""; #endif /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Ruby keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Documentation for common Ruby methods * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Ruby initialization function * ------------------------------------------------------------ */ %include swig-3.0.12/Lib/ruby/std_sstream.i0000664000175000017500000000003613042756442016625 0ustar williamwilliam %include swig-3.0.12/Lib/ruby/attribute.i0000664000175000017500000000004213042756442016275 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/rubyrun.swg0000664000175000017500000003316213042756442016361 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyrun.swg * * This file contains the runtime support for Ruby modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 /* for raw pointers */ #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Ruby_NewPointerObj(ptr, type, flags) #define SWIG_AcquirePtr(ptr, own) SWIG_Ruby_AcquirePtr(ptr, own) #define swig_owntype swig_ruby_owntype /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Ruby_SetModule(pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Ruby_ErrorType(code) #define SWIG_Error(code, msg) rb_raise(SWIG_Ruby_ErrorType(code), "%s", msg) #define SWIG_fail goto fail /* Ruby-specific SWIG API */ #define SWIG_InitRuntime() SWIG_Ruby_InitRuntime() #define SWIG_define_class(ty) SWIG_Ruby_define_class(ty) #define SWIG_NewClassInstance(value, ty) SWIG_Ruby_NewClassInstance(value, ty) #define SWIG_MangleStr(value) SWIG_Ruby_MangleStr(value) #define SWIG_CheckConvert(value, ty) SWIG_Ruby_CheckConvert(value, ty) #include "assert.h" /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif typedef struct { VALUE klass; VALUE mImpl; void (*mark)(void *); void (*destroy)(void *); int trackObjects; } swig_class; /* Global pointer used to keep some internal SWIG stuff */ static VALUE _cSWIG_Pointer = Qnil; static VALUE swig_runtime_data_type_pointer = Qnil; /* Global IDs used to keep some internal SWIG stuff */ static ID swig_arity_id = 0; static ID swig_call_id = 0; /* If your swig extension is to be run within an embedded ruby and has director callbacks, you should set -DRUBY_EMBEDDED during compilation. This will reset ruby's stack frame on each entry point from the main program the first time a virtual director function is invoked (in a non-recursive way). If this is not done, you run the risk of Ruby trashing the stack. */ #ifdef RUBY_EMBEDDED # define SWIG_INIT_STACK \ if ( !swig_virtual_calls ) { RUBY_INIT_STACK } \ ++swig_virtual_calls; # define SWIG_RELEASE_STACK --swig_virtual_calls; # define Ruby_DirectorTypeMismatchException(x) \ rb_raise( rb_eTypeError, "%s", x ); return c_result; static unsigned int swig_virtual_calls = 0; #else /* normal non-embedded extension */ # define SWIG_INIT_STACK # define SWIG_RELEASE_STACK # define Ruby_DirectorTypeMismatchException(x) \ throw Swig::DirectorTypeMismatchException( x ); #endif /* RUBY_EMBEDDED */ SWIGRUNTIME VALUE getExceptionClass(void) { static int init = 0; static VALUE rubyExceptionClass ; if (!init) { init = 1; rubyExceptionClass = rb_const_get(_mSWIG, rb_intern("Exception")); } return rubyExceptionClass; } /* This code checks to see if the Ruby object being raised as part of an exception inherits from the Ruby class Exception. If so, the object is simply returned. If not, then a new Ruby exception object is created and that will be returned to Ruby.*/ SWIGRUNTIME VALUE SWIG_Ruby_ExceptionType(swig_type_info *desc, VALUE obj) { VALUE exceptionClass = getExceptionClass(); if (rb_obj_is_kind_of(obj, exceptionClass)) { return obj; } else { return rb_exc_new3(rb_eRuntimeError, rb_obj_as_string(obj)); } } /* Initialize Ruby runtime support */ SWIGRUNTIME void SWIG_Ruby_InitRuntime(void) { if (_mSWIG == Qnil) { _mSWIG = rb_define_module("SWIG"); swig_call_id = rb_intern("call"); swig_arity_id = rb_intern("arity"); } } /* Define Ruby class for C type */ SWIGRUNTIME void SWIG_Ruby_define_class(swig_type_info *type) { char *klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); if (NIL_P(_cSWIG_Pointer)) { _cSWIG_Pointer = rb_define_class_under(_mSWIG, "Pointer", rb_cObject); rb_undef_method(CLASS_OF(_cSWIG_Pointer), "new"); } rb_define_class_under(_mSWIG, klass_name, _cSWIG_Pointer); free((void *) klass_name); } /* Create a new pointer object */ SWIGRUNTIME VALUE SWIG_Ruby_NewPointerObj(void *ptr, swig_type_info *type, int flags) { int own = flags & SWIG_POINTER_OWN; int track; char *klass_name; swig_class *sklass; VALUE klass; VALUE obj; if (!ptr) return Qnil; if (type->clientdata) { sklass = (swig_class *) type->clientdata; /* Are we tracking this class and have we already returned this Ruby object? */ track = sklass->trackObjects; if (track) { obj = SWIG_RubyInstanceFor(ptr); /* Check the object's type and make sure it has the correct type. It might not in cases where methods do things like downcast methods. */ if (obj != Qnil) { VALUE value = rb_iv_get(obj, "@__swigtype__"); const char* type_name = RSTRING_PTR(value); if (strcmp(type->name, type_name) == 0) { return obj; } } } /* Create a new Ruby object */ obj = Data_Wrap_Struct(sklass->klass, VOIDFUNC(sklass->mark), ( own ? VOIDFUNC(sklass->destroy) : (track ? VOIDFUNC(SWIG_RubyRemoveTracking) : 0 ) ), ptr); /* If tracking is on for this class then track this object. */ if (track) { SWIG_RubyAddTracking(ptr, obj); } } else { klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); klass = rb_const_get(_mSWIG, rb_intern(klass_name)); free((void *) klass_name); obj = Data_Wrap_Struct(klass, 0, 0, ptr); } rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Create a new class instance (always owned) */ SWIGRUNTIME VALUE SWIG_Ruby_NewClassInstance(VALUE klass, swig_type_info *type) { VALUE obj; swig_class *sklass = (swig_class *) type->clientdata; obj = Data_Wrap_Struct(klass, VOIDFUNC(sklass->mark), VOIDFUNC(sklass->destroy), 0); rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Get type mangle from class name */ SWIGRUNTIMEINLINE char * SWIG_Ruby_MangleStr(VALUE obj) { VALUE stype = rb_iv_get(obj, "@__swigtype__"); return StringValuePtr(stype); } /* Acquire a pointer value */ typedef struct { void (*datafree)(void *); int own; } swig_ruby_owntype; SWIGRUNTIME swig_ruby_owntype SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) { swig_ruby_owntype oldown = {0, 0}; if (obj) { oldown.datafree = RDATA(obj)->dfree; RDATA(obj)->dfree = own.datafree; } return oldown; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, swig_ruby_owntype *own) { char *c; swig_cast_info *tc; void *vptr = 0; /* Grab the pointer */ if (NIL_P(obj)) { if (ptr) *ptr = 0; return SWIG_OK; } else { if (TYPE(obj) != T_DATA) { return SWIG_ERROR; } Data_Get_Struct(obj, void, vptr); } if (own) { own->datafree = RDATA(obj)->dfree; own->own = 0; } /* Check to see if the input object is giving up ownership of the underlying C struct or C++ object. If so then we need to reset the destructor since the Ruby object no longer owns the underlying C++ object.*/ if (flags & SWIG_POINTER_DISOWN) { /* Is tracking on for this class? */ int track = 0; if (ty && ty->clientdata) { swig_class *sklass = (swig_class *) ty->clientdata; track = sklass->trackObjects; } if (track) { /* We are tracking objects for this class. Thus we change the destructor * to SWIG_RubyRemoveTracking. This allows us to * remove the mapping from the C++ to Ruby object * when the Ruby object is garbage collected. If we don't * do this, then it is possible we will return a reference * to a Ruby object that no longer exists thereby crashing Ruby. */ RDATA(obj)->dfree = SWIG_RubyRemoveTracking; } else { RDATA(obj)->dfree = 0; } } /* Do type-checking if type info was provided */ if (ty) { if (ty->clientdata) { if (rb_obj_is_kind_of(obj, ((swig_class *) (ty->clientdata))->klass)) { if (vptr == 0) { /* The object has already been deleted */ return SWIG_ObjectPreviouslyDeletedError; } } } if ((c = SWIG_MangleStr(obj)) == NULL) { return SWIG_ERROR; } tc = SWIG_TypeCheck(c, ty); if (!tc) { return SWIG_ERROR; } else { if (ptr) { if (tc->type == ty) { *ptr = vptr; } else { int newmemory = 0; *ptr = SWIG_TypeCast(tc, vptr, &newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) own->own = own->own | SWIG_CAST_NEW_MEMORY; } } } } } else { if (ptr) *ptr = vptr; } return SWIG_OK; } /* Check convert */ SWIGRUNTIMEINLINE int SWIG_Ruby_CheckConvert(VALUE obj, swig_type_info *ty) { char *c = SWIG_MangleStr(obj); if (!c) return 0; return SWIG_TypeCheck(c,ty) != 0; } SWIGRUNTIME VALUE SWIG_Ruby_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r, ptr, sz); strcpy(r, type->name); return rb_str_new2(result); } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c; if (TYPE(obj) != T_STRING) goto type_error; c = StringValuePtr(obj); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c, ptr, sz); if (ty) { tc = SWIG_TypeCheck(c, ty); if (!tc) goto type_error; } return SWIG_OK; type_error: return SWIG_ERROR; } SWIGRUNTIME swig_module_info * SWIG_Ruby_GetModule(void *SWIGUNUSEDPARM(clientdata)) { VALUE pointer; swig_module_info *ret = 0; VALUE verbose = rb_gv_get("VERBOSE"); /* temporarily disable warnings, since the pointer check causes warnings with 'ruby -w' */ rb_gv_set("VERBOSE", Qfalse); /* first check if pointer already created */ pointer = rb_gv_get("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); if (pointer != Qnil) { Data_Get_Struct(pointer, swig_module_info, ret); } /* reinstate warnings */ rb_gv_set("VERBOSE", verbose); return ret; } SWIGRUNTIME void SWIG_Ruby_SetModule(swig_module_info *pointer) { /* register a new class */ VALUE cl = rb_define_class("swig_runtime_data", rb_cObject); /* create and store the structure pointer to a global variable */ swig_runtime_data_type_pointer = Data_Wrap_Struct(cl, 0, 0, pointer); rb_define_readonly_variable("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, &swig_runtime_data_type_pointer); } /* This function can be used to check whether a proc or method or similarly callable function has been passed. Usually used in a %typecheck, like: %typecheck(c_callback_t, precedence=SWIG_TYPECHECK_POINTER) { $result = SWIG_Ruby_isCallable( $input ); } */ SWIGINTERN int SWIG_Ruby_isCallable( VALUE proc ) { if ( rb_respond_to( proc, swig_call_id ) ) return 1; return 0; } /* This function can be used to check the arity (number of arguments) a proc or method can take. Usually used in a %typecheck. Valid arities will be that equal to minimal or those < 0 which indicate a variable number of parameters at the end. */ SWIGINTERN int SWIG_Ruby_arity( VALUE proc, int minimal ) { if ( rb_respond_to( proc, swig_arity_id ) ) { VALUE num = rb_funcall( proc, swig_arity_id, 0 ); int arity = NUM2INT(num); if ( arity < 0 && (arity+1) < -minimal ) return 1; if ( arity == minimal ) return 1; return 1; } return 0; } #ifdef __cplusplus } #endif swig-3.0.12/Lib/ruby/cmalloc.i0000664000175000017500000000004013042756442015702 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/progargcargv.i0000664000175000017500000000140213042756442016757 0ustar williamwilliam/* int PROG_ARGC char **PROG_ARGV Some C function receive argc and argv from C main function. This typemap provides ignore typemap which pass Ruby ARGV contents as argc and argv to C function. */ // argc and argv %typemap(in,numinputs=0) int PROG_ARGC { $1 = RARRAY_LEN(rb_argv) + 1; } %typemap(in,numinputs=0) char **PROG_ARGV { int i, n; VALUE ary = rb_eval_string("[$0] + ARGV"); n = RARRAY_LEN(ary); $1 = (char **)malloc(n + 1); for (i = 0; i < n; i++) { VALUE v = rb_obj_as_string(RARRAY_PTR(ary)[i]); $1[i] = (char *)malloc(RSTRING_LEN(v) + 1); strcpy($1[i], RSTRING_PTR(v)); } } %typemap(freearg) char **PROG_ARGV { int i, n = RARRAY_LEN(rb_argv) + 1; for (i = 0; i < n; i++) free($1[i]); free($1); } swig-3.0.12/Lib/ruby/std_basic_string.i0000664000175000017500000000512013042756442017615 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %traits_swigtype(std::basic_string); %fragment(SWIG_Traits_frag(std::basic_string)); %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(VALUE obj, std::string **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::string *vptr; if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { char* buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } if (val) { rb_raise( rb_eTypeError, "a string is expected"); } return 0; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE VALUE SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(VALUE obj, std::wstring **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::wstring *vptr; if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) { if (buf) { if (val) *val = new std::wstring(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } if (val) { rb_raise( rb_eTypeError, "a string is expected"); } return 0; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE VALUE SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-3.0.12/Lib/ruby/extra-install.list0000664000175000017500000000006513042756442017611 0ustar williamwilliam# see top-level Makefile.in Makefile.swig extconf.rb swig-3.0.12/Lib/ruby/std_stack.i0000664000175000017500000000152513042756442016260 0ustar williamwilliam/* Stacks */ %fragment("StdStackTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::stack **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::stack & vec) { return traits_from_stdseq >::from(vec); } }; } %} %rename("delete") std::stack::__delete__; %rename("reject!") std::stack::reject_bang; %rename("map!") std::stack::map_bang; %rename("empty?") std::stack::empty; %rename("include?" ) std::stack::__contains__ const; %rename("has_key?" ) std::stack::has_key const; %alias std::stack::push "<<"; %include swig-3.0.12/Lib/ruby/argcargv.i0000664000175000017500000000231313042756442016071 0ustar williamwilliam/* ------------------------------------------------------------ * --- Argc & Argv --- * ------------------------------------------------------------ */ /* ------------------------------------------------------------ Use it as follow: %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } %inline %{ int mainApp(size_t argc, const char **argv) { return argc; } then in the ruby side: args = ["asdf", "asdf2"] mainApp(args); * ------------------------------------------------------------ */ %typemap(in) (int ARGC, char **ARGV) { if (rb_obj_is_kind_of($input,rb_cArray)) { int i; int size = RARRAY_LEN($input); $1 = ($1_ltype) size; $2 = (char **) malloc((size+1)*sizeof(char *)); VALUE *ptr = RARRAY_PTR($input); for (i=0; i < size; i++, ptr++) { $2[i]= StringValuePtr(*ptr); } $2[i]=NULL; } else { $1 = 0; $2 = 0; %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); } } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { $1 = rb_obj_is_kind_of($input,rb_cArray); } %typemap(freearg) (int ARGC, char **ARGV) { free((char *) $2); } swig-3.0.12/Lib/ruby/std_streambuf.i0000664000175000017500000000003713042756442017140 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/std_common.i0000664000175000017500000000443613042756442016447 0ustar williamwilliam%include %include %include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static VALUE from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static VALUE from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-3.0.12/Lib/ruby/std_except.i0000664000175000017500000000004313042756442016435 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/rubywstrings.swg0000664000175000017500000000473713042756442017443 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubywstrings.swg * * Currently, Ruby does not support Unicode or WChar properly, so these * are still treated as char arrays for now. * There are other libraries available that add support to this in * ruby including WString, FXString, etc. * ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * utility methods for wchar_t strings * ------------------------------------------------------------ */ %fragment("SWIG_AsWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor",fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsWCharPtrAndSize(VALUE obj, wchar_t **cptr, size_t *psize, int *alloc) { return SWIG_AsCharPtrAndSize( obj, (char**)cptr, psize, alloc); // VALUE tmp = 0; // bool ok = false; // if ( TYPE(obj) == T_STRING ) { // if (cptr) { // obj = tmp = SWIG_Unicode_FromObject(obj); // ok = true; // } // } // if (ok) { // Py_ssize_t len = PyUnicode_GetSize(obj); // rb_notimplement(); // if (cptr) { // *cptr = %new_array(len + 1, wchar_t); // SWIG_Unicode_AsWideChar((PyUnicodeObject *)obj, *cptr, len); // (*cptr)[len] = 0; // } // if (psize) *psize = (size_t) len + 1; // if (alloc) *alloc = cptr ? SWIG_NEWOBJ : 0; // return SWIG_OK; // } else { // swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); // if (pwchar_descriptor) { // void * vptr = 0; // if (SWIG_ConvertPtr(obj, &vptr, pwchar_descriptor, 0) == SWIG_OK) { // if (cptr) *cptr = (wchar_t *)vptr; // if (psize) *psize = vptr ? (wcslen((wchar_t *)vptr) + 1) : 0; // return SWIG_OK; // } // } // } // return SWIG_TypeError; } } %fragment("SWIG_FromWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor",fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE VALUE SWIG_FromWCharPtrAndSize(const wchar_t * carray, size_t size) { return SWIG_FromCharPtrAndSize( (const char*)carray, size); // if (carray) { // if (size > INT_MAX) { // swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); // return pwchar_descriptor ? // SWIG_NewPointerObj(%const_cast(carray,wchar_t *), pwchar_descriptor, 0) : Qnil; // } else { // return SWIG_Unicode_FromWideChar(carray, %numeric_cast(size,int)); // } // } else { // return Qnil; // } } } swig-3.0.12/Lib/ruby/jstring.i0000664000175000017500000000167013042756442015762 0ustar williamwilliam%include %fragment(SWIG_AsVal_frag(jstring),"header") { SWIGINTERN int SWIG_AsVal(jstring)(VALUE obj, jstring *val) { if (NIL_P(obj)){ if (val) *val = 0; return SWIG_OK; } if (TYPE(obj) == T_STRING) { if (val) { char *cstr = rb_string_value_ptr(&(obj)); jsize len = RSTRING_LEN(obj); *val = JvNewStringLatin1(cstr, len); } return SWIG_NEWOBJ; } return SWIG_TypeError; } } %fragment(SWIG_From_frag(jstring),"header") { SWIGINTERNINLINE VALUE SWIG_From(jstring)(jstring val) { if (!val) { return Qnil; } else { jint len = JvGetStringUTFLength(val); char buf[len]; JvGetStringUTFRegion(val, 0, len, buf); return rb_str_new(buf,len); } } } %typemaps_asvalfrom(%checkcode(STRING), %arg(SWIG_AsVal(jstring)), %arg(SWIG_From(jstring)), %arg(SWIG_AsVal_frag(jstring)), %arg(SWIG_From_frag(jstring)), java::lang::String *); swig-3.0.12/Lib/ruby/rubycomplex.swg0000664000175000017500000000742413042756442017226 0ustar williamwilliam/* Defines the As/From conversors for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ %fragment("rb_complex_new","header") { %#if !defined(T_COMPLEX) /* Ruby versions prior to 1.9 did not have native complex numbers. They were an extension in the STD library. */ SWIGINTERN VALUE rb_complex_new(VALUE x, VALUE y) { static ID new_id = rb_intern("new"); static VALUE cComplex = rb_const_get(rb_cObject, rb_intern("Complex")); return rb_funcall(cComplex, new_id, 2, x, y); } %#endif } %fragment("SWIG_Complex_Numbers","header") { %#if !defined(T_COMPLEX) SWIGINTERN int SWIG_Is_Complex( VALUE obj ) { static ID real_id = rb_intern("real"); static ID imag_id = rb_intern("imag"); return ( (rb_respond_to( obj, real_id ) ) && (rb_respond_to( obj, imag_id ) ) ); } %#else SWIGINTERN int SWIG_Is_Complex( VALUE obj ) { return TYPE(obj) == T_COMPLEX; } %#endif SWIGINTERN VALUE SWIG_Complex_Real(VALUE obj) { static ID real_id = rb_intern("real"); return rb_funcall(obj, real_id, 0); } SWIGINTERN VALUE SWIG_Complex_Imaginary(VALUE obj) { static ID imag_id = rb_intern("imag"); return rb_funcall(obj, imag_id, 0); } } %init { %#if !defined(T_COMPLEX) rb_require("complex"); %#endif } /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header",fragment="rb_complex_new") { SWIGINTERNINLINE VALUE SWIG_From(Type)(%ifcplusplus(const Type&, Type) c) { VALUE re = rb_float_new(Real(c)); VALUE im = rb_float_new(Imag(c)); return rb_complex_new(re, im); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double), fragment="SWIG_Complex_Numbers") { SWIGINTERN int SWIG_AsVal(Type) (VALUE o, Type* val) { if ( SWIG_Is_Complex( o ) ) { if (val) { VALUE real = SWIG_Complex_Real(o); VALUE imag = SWIG_Complex_Imaginary(o); double re = 0; SWIG_AsVal_double( real, &re ); double im = 0; SWIG_AsVal_double( imag, &im ); *val = Constructor(re, im); } return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float), fragment=SWIG_AsVal_frag(double), fragment="SWIG_Complex_Numbers") { SWIGINTERN int SWIG_AsVal(Type)(VALUE o, Type *val) { if ( SWIG_Is_Complex( o ) ) { VALUE real = SWIG_Complex_Real(o); VALUE imag = SWIG_Complex_Imaginary(o); double re = 0; SWIG_AsVal_double( real, &re ); double im = 0; SWIG_AsVal_double( imag, &im ); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-3.0.12/Lib/ruby/typemaps.i0000664000175000017500000002606213042756442016146 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * * These mappings provide support for input/output arguments and * common uses for C/C++ pointers. INOUT mappings allow for C/C++ * pointer variables in addition to input/output arguments. * ----------------------------------------------------------------------------- */ #if !defined(SWIG_USE_OLD_TYPEMAPS) %include #else /* The SWIG typemap library provides a language independent mechanism for supporting output arguments, input values, and other C function calling mechanisms. The primary use of the library is to provide a better interface to certain C function--especially those involving pointers. */ // ------------------------------------------------------------------------ // Pointer handling // // These mappings provide support for input/output arguments and common // uses for C/C++ pointers. // ------------------------------------------------------------------------ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include typemaps.i double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include typemaps.i %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ %define INPUT_TYPEMAP(type, converter) %typemap(in) type *INPUT($*1_ltype temp), type &INPUT($*1_ltype temp) { temp = ($*1_ltype) converter($input); $1 = &temp; } %typemap(typecheck) type *INPUT = type; %typemap(typecheck) type &INPUT = type; %enddef INPUT_TYPEMAP(float, NUM2DBL); INPUT_TYPEMAP(double, NUM2DBL); INPUT_TYPEMAP(int, NUM2INT); INPUT_TYPEMAP(short, NUM2SHRT); INPUT_TYPEMAP(long, NUM2LONG); INPUT_TYPEMAP(long long, NUM2LL); INPUT_TYPEMAP(unsigned int, NUM2UINT); INPUT_TYPEMAP(unsigned short, NUM2USHRT); INPUT_TYPEMAP(unsigned long, NUM2ULONG); INPUT_TYPEMAP(unsigned long long, NUM2ULL); INPUT_TYPEMAP(unsigned char, NUM2UINT); INPUT_TYPEMAP(signed char, NUM2INT); INPUT_TYPEMAP(bool, RTEST); #undef INPUT_TYPEMAP // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a array element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Ruby Array. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include typemaps.i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include typemaps.i %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Ruby output of the function would be a Array containing both output values. */ %define OUTPUT_TYPEMAP(type, converter, convtype) %typemap(in,numinputs=0) type *OUTPUT($*1_ltype temp), type &OUTPUT($*1_ltype temp) "$1 = &temp;"; %typemap(argout, fragment="output_helper") type *OUTPUT, type &OUTPUT { VALUE o = converter(convtype (*$1)); $result = output_helper($result, o); } %enddef OUTPUT_TYPEMAP(int, INT2NUM, (int)); OUTPUT_TYPEMAP(short, INT2NUM, (int)); OUTPUT_TYPEMAP(long, INT2NUM, (long)); OUTPUT_TYPEMAP(long long, LL2NUM, (long long)); OUTPUT_TYPEMAP(unsigned int, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(unsigned short, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(unsigned long, UINT2NUM, (unsigned long)); OUTPUT_TYPEMAP(unsigned long long, ULL2NUM, (unsigned long long)); OUTPUT_TYPEMAP(unsigned char, UINT2NUM, (unsigned int)); OUTPUT_TYPEMAP(signed char, INT2NUM, (int)); OUTPUT_TYPEMAP(float, rb_float_new, (double)); OUTPUT_TYPEMAP(double, rb_float_new, (double)); #undef OUTPUT_TYPEMAP %typemap(in,numinputs=0) bool *OUTPUT(bool temp), bool &OUTPUT(bool temp) "$1 = &temp;"; %typemap(argout, fragment="output_helper") bool *OUTPUT, bool &OUTPUT { VALUE o = (*$1) ? Qtrue : Qfalse; $result = output_helper($result, o); } // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Ruby array. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include typemaps.i void neg(double *INOUT); or you can use the %apply directive : %include typemaps.i %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Ruby). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Ruby variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int &INOUT = int &INPUT; %typemap(in) short &INOUT = short &INPUT; %typemap(in) long &INOUT = long &INPUT; %typemap(in) long long &INOUT = long long &INPUT; %typemap(in) unsigned &INOUT = unsigned &INPUT; %typemap(in) unsigned short &INOUT = unsigned short &INPUT; %typemap(in) unsigned long &INOUT = unsigned long &INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; %typemap(in) unsigned char &INOUT = unsigned char &INPUT; %typemap(in) signed char &INOUT = signed char &INPUT; %typemap(in) bool &INOUT = bool &INPUT; %typemap(in) float &INOUT = float &INPUT; %typemap(in) double &INOUT = double &INPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT = long *OUTPUT; %typemap(argout) long long *INOUT = long long *OUTPUT; %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT = double *OUTPUT; %typemap(argout) int &INOUT = int &OUTPUT; %typemap(argout) short &INOUT = short &OUTPUT; %typemap(argout) long &INOUT = long &OUTPUT; %typemap(argout) long long &INOUT = long long &OUTPUT; %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; %typemap(argout) signed char &INOUT = signed char &OUTPUT; %typemap(argout) bool &INOUT = bool &OUTPUT; %typemap(argout) float &INOUT = float &OUTPUT; %typemap(argout) double &INOUT = double &OUTPUT; /* Overloading information */ %typemap(typecheck) double *INOUT = double; %typemap(typecheck) signed char *INOUT = signed char; %typemap(typecheck) unsigned char *INOUT = unsigned char; %typemap(typecheck) unsigned long *INOUT = unsigned long; %typemap(typecheck) unsigned long long *INOUT = unsigned long long; %typemap(typecheck) unsigned short *INOUT = unsigned short; %typemap(typecheck) unsigned int *INOUT = unsigned int; %typemap(typecheck) long *INOUT = long; %typemap(typecheck) long long *INOUT = long long; %typemap(typecheck) short *INOUT = short; %typemap(typecheck) int *INOUT = int; %typemap(typecheck) float *INOUT = float; %typemap(typecheck) double &INOUT = double; %typemap(typecheck) signed char &INOUT = signed char; %typemap(typecheck) unsigned char &INOUT = unsigned char; %typemap(typecheck) unsigned long &INOUT = unsigned long; %typemap(typecheck) unsigned long long &INOUT = unsigned long long; %typemap(typecheck) unsigned short &INOUT = unsigned short; %typemap(typecheck) unsigned int &INOUT = unsigned int; %typemap(typecheck) long &INOUT = long; %typemap(typecheck) long long &INOUT = long long; %typemap(typecheck) short &INOUT = short; %typemap(typecheck) int &INOUT = int; %typemap(typecheck) float &INOUT = float; #endif // -------------------------------------------------------------------- // Special types // -------------------------------------------------------------------- %include %include %include swig-3.0.12/Lib/ruby/std_queue.i0000664000175000017500000000152313042756442016275 0ustar williamwilliam/* Queues */ %fragment("StdQueueTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::queue **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::queue & vec) { return traits_from_stdseq >::from(vec); } }; } %} %rename("delete") std::queue::__delete__; %rename("reject!") std::queue::reject_bang; %rename("map!") std::queue::map_bang; %rename("empty?") std::queue::empty; %rename("include?" ) std::queue::__contains__ const; %rename("has_key?" ) std::queue::has_key const; %alias std::queue::push "<<"; %include swig-3.0.12/Lib/ruby/rubystdfunctors.swg0000664000175000017500000000773113042756442020136 0ustar williamwilliam/** * @file rubystdfunctors.swg * @date Sun May 6 00:44:33 2007 * * @brief This file provides unary and binary functors for STL * containers, that will invoke a Ruby proc or method to do * their operation. * * You can use them in a swig file like: * * %include * %include * * %template< IntSet > std::set< int, swig::BinaryPredicate<> >; * * * which will then allow calling them from Ruby either like: * * # order of set is defined by C++ default * a = IntSet.new * * # sort order defined by Ruby proc * b = IntSet.new( proc { |a,b| a > b } ) * */ %include rubyclasses.swg namespace swig { %apply GC_VALUE { UnaryPredicate, BinaryPredicate, UnaryFunction, BinaryFunction }; %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) UnaryPredicate, UnaryPredicate&, UnaryFunction, UnaryFunction& { $1 = SWIG_Ruby_isCallable($input) && SWIG_Ruby_arity($input, 1); } %typecheck(SWIG_TYPECHECK_POINTER,noblock=1) BinaryPredicate, BinaryPredicate&, BinaryFunction, BinaryFunction& { $1 = SWIG_Ruby_isCallable($input) && SWIG_Ruby_arity($input, 2); } %typemap(in,noblock=1) BinaryFunction&, BinaryFunction { $1 = new swig::BinaryFunction< >($input); } %typemap(in,noblock=1) UnaryFunction&, UnaryFunction { $1 = new swig::UnaryFunction< >($input); } %typemap(in,noblock=1) BinaryPredicate&, BinaryPredicate { $1 = new swig::BinaryPredicate<>($input); } %typemap(in,noblock=1) UnaryPredicate&, UnaryPredicate { $1 = new swig::UnaryPredicate< >($input); } %ignore BinaryFunction; template< class _T = GC_VALUE > struct BinaryFunction { }; %ignore UnaryFunction; template< class _T = GC_VALUE > struct UnaryFunction { }; %ignore BinaryPredicate; template< class _T = GC_VALUE > struct BinaryPredicate { }; %ignore UnaryPredicate; template< class _T = GC_VALUE > struct UnaryPredicate { }; } %fragment("StdFunctors","header",fragment="StdTraits",fragment="GC_VALUE_definition") { namespace swig { static ID call_id = rb_intern("call"); template > struct BinaryPredicate : GC_VALUE { BinaryPredicate(VALUE obj = Qnil) : GC_VALUE(obj) { } bool operator()(_T a, _T b) const { if (_obj != Qnil) { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE arg2 = swig::from(b); VALUE res = rb_funcall( _obj, swig::call_id, 2, arg1, arg2); SWIG_RUBY_THREAD_END_BLOCK; return RTEST(res); } else { return _DefaultFunc()(a, b); } } }; template > struct BinaryFunction : GC_VALUE { BinaryFunction(VALUE obj = Qnil) : GC_VALUE(obj) { } _T operator()(_T a, _T b) const { if (_obj != Qnil) { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE arg2 = swig::from(b); VALUE res = rb_funcall( _obj, swig::call_id, 2, arg1, arg2); SWIG_RUBY_THREAD_END_BLOCK; return swig::as<_T >(res); } else { return _DefaultFunc()(a, b); } } }; template< class _T = GC_VALUE > struct UnaryPredicate : GC_VALUE { UnaryPredicate(VALUE obj = Qnil) : GC_VALUE(obj) { } bool operator()(_T a) const { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from<_T >(a); VALUE res = rb_funcall( _obj, swig::call_id, 1, arg1); SWIG_RUBY_THREAD_END_BLOCK; return RTEST(res); } }; template< class _T = GC_VALUE > struct UnaryFunction : GC_VALUE { UnaryFunction(VALUE obj = Qnil) : GC_VALUE(obj) { } _T operator()(_T a) const { SWIG_RUBY_THREAD_BEGIN_BLOCK; VALUE arg1 = swig::from(a); VALUE res = rb_funcall( _obj, swig::call_id, 1, VALUE(arg1)); SWIG_RUBY_THREAD_END_BLOCK; return swig::as< _T >(res); } }; } // namespace swig } swig-3.0.12/Lib/ruby/rubyapi.swg0000664000175000017500000000144113042756442016321 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Ruby API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif SWIGINTERN VALUE SWIG_Ruby_AppendOutput(VALUE target, VALUE o) { if (NIL_P(target)) { target = o; } else { if (TYPE(target) != T_ARRAY) { VALUE o2 = target; target = rb_ary_new(); rb_ary_push(target, o2); } rb_ary_push(target, o); } return target; } /* For ruby1.8.4 and earlier. */ #ifndef RUBY_INIT_STACK RUBY_EXTERN void Init_stack(VALUE* addr); # define RUBY_INIT_STACK \ VALUE variable_in_this_stack_frame; \ Init_stack(&variable_in_this_stack_frame); #endif #ifdef __cplusplus } #endif swig-3.0.12/Lib/ruby/rubymacros.swg0000664000175000017500000000071013042756442017032 0ustar williamwilliam // Redefine these macros so argument index for ruby is done properly, // ignoring self and we get some more info about the input. #define %argfail_fmt(_type,_name,_argn) Ruby_Format_TypeError( "", _type, #_name, _argn, $input ) #define %argnullref_fmt(_type,_name,_argn) Ruby_Format_TypeError(%nullref_fmt(), _type, #_name, _argn, $input) %{ #define SWIG_RUBY_THREAD_BEGIN_BLOCK #define SWIG_RUBY_THREAD_END_BLOCK %} %include swig-3.0.12/Lib/ruby/std_array.i0000664000175000017500000000671513042756442016277 0ustar williamwilliam/* std::array */ %fragment("StdArrayTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::array **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::array& vec) { return traits_from_stdseq >::from(vec); } }; template inline void assign(const RubySeq& rubyseq, std::array* seq) { if (rubyseq.size() < seq->size()) throw std::invalid_argument("std::array cannot be expanded in size"); else if (rubyseq.size() > seq->size()) throw std::invalid_argument("std::array cannot be reduced in size"); std::copy(rubyseq.begin(), rubyseq.end(), seq->begin()); } template inline void resize(std::array *seq, typename std::array::size_type n, typename std::array::value_type x) { throw std::invalid_argument("std::array is a fixed size container and does not support resizing"); } // Only limited slicing is supported as std::array is fixed in size template inline std::array* getslice(const std::array* self, Difference i, Difference j) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (ii == 0 && jj == size) { Sequence *sequence = new Sequence(); std::copy(self->begin(), self->end(), sequence->begin()); return sequence; } else { throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array"); } } template inline void setslice(std::array* self, Difference i, Difference j, const InputSeq& v) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (ii == 0 && jj == size) { std::copy(v.begin(), v.end(), self->begin()); } else { throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array"); } } template inline void delslice(std::array* self, Difference i, Difference j) { throw std::invalid_argument("std::array object does not support item deletion"); } } %} %define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type) %enddef %define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type); %enddef %mixin std::array "Enumerable"; %ignore std::array::push_back; %ignore std::array::pop_back; %rename("delete") std::array::__delete__; %rename("reject!") std::array::reject_bang; %rename("map!") std::array::map_bang; %rename("empty?") std::array::empty; %rename("include?" ) std::array::__contains__ const; %rename("has_key?" ) std::array::has_key const; %include swig-3.0.12/Lib/ruby/rubyprimtypes.swg0000664000175000017500000001252513042756442017611 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubyprimtypes.swg * ----------------------------------------------------------------------------- */ /* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* auxiliary ruby fail method */ %fragment("SWIG_ruby_failed","header") { SWIGINTERN VALUE SWIG_ruby_failed(void) { return Qnil; } } %define %ruby_aux_method(Type, Method, Action) SWIGINTERN VALUE SWIG_AUX_##Method##(VALUE *args) { VALUE obj = args[0]; VALUE type = TYPE(obj); Type *res = (Type *)(args[1]); *res = Action; return obj; } %enddef /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE VALUE SWIG_From_dec(bool)(bool value) { return value ? Qtrue : Qfalse; } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_AsVal_dec(bool)(VALUE obj, bool *val) { if (obj == Qtrue) { if (val) *val = true; return SWIG_OK; } else if (obj == Qfalse) { if (val) *val = false; return SWIG_OK; } else { int res = 0; if (SWIG_AsVal(int)(obj, &res) == SWIG_OK) { if (val) *val = res ? true : false; return SWIG_OK; } } return SWIG_TypeError; } } /* long */ %fragment(SWIG_From_frag(long),"header", fragment="") { %define_as(SWIG_From_dec(long), LONG2NUM) } %fragment(SWIG_AsVal_frag(long),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(long, NUM2LONG, type == T_FIXNUM ? NUM2LONG(obj) : rb_big2long(obj)) SWIGINTERN int SWIG_AsVal_dec(long)(VALUE obj, long* val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2LONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE VALUE SWIG_From_dec(unsigned long)(unsigned long value) { return ULONG2NUM(value); } } %fragment(SWIG_AsVal_frag(unsigned long),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(unsigned long, NUM2ULONG, type == T_FIXNUM ? NUM2ULONG(obj) : rb_big2ulong(obj)) SWIGINTERN int SWIG_AsVal_dec(unsigned long)(VALUE obj, unsigned long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_dec(long long)(long long value) { return LL2NUM(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment="SWIG_ruby_failed", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE %ruby_aux_method(long long, NUM2LL, type == T_FIXNUM ? NUM2LL(obj) : rb_big2ll(obj)) SWIGINTERN int SWIG_AsVal_dec(long long)(VALUE obj, long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2LL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_dec(unsigned long long)(unsigned long long value) { return ULL2NUM(value); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment="SWIG_ruby_failed", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE %ruby_aux_method(long long, NUM2ULL, type == T_FIXNUM ? NUM2ULL(obj) : rb_big2ull(obj)) SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(VALUE obj, unsigned long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2ULL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From_dec(double), rb_float_new) } %fragment(SWIG_AsVal_frag(double),"header",fragment="SWIG_ruby_failed") { %ruby_aux_method(double, NUM2DBL, NUM2DBL(obj); (void)type) SWIGINTERN int SWIG_AsVal_dec(double)(VALUE obj, double *val) { VALUE type = TYPE(obj); if ((type == T_FLOAT) || (type == T_FIXNUM) || (type == T_BIGNUM)) { double v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(RUBY_METHOD_FUNC(SWIG_AUX_NUM2DBL), (VALUE)a, RUBY_METHOD_FUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } } swig-3.0.12/Lib/ruby/embed.i0000664000175000017500000000025113042756442015350 0ustar williamwilliam%wrapper %{ #include int main(argc, argv) int argc; char **argv; { ruby_init(); ruby_options(argc, argv); ruby_run(); return 0; } %} swig-3.0.12/Lib/ruby/carrays.i0000664000175000017500000000020113042756442015733 0ustar williamwilliam%define %array_class(TYPE,NAME) %array_class_wrap(TYPE,NAME,__getitem__,__setitem__) %enddef %include swig-3.0.12/Lib/ruby/std_functors.i0000664000175000017500000000140013042756442017006 0ustar williamwilliam/** * @file std_functors.i * @date Sun May 6 00:44:33 2007 * * @brief This file provides unary and binary functors for STL * containers, that will invoke a Ruby proc or method to do * their operation. * * You can use them in a swig file like: * * %include * %include * * %template< IntSet > std::set< int, swig::BinaryPredicate >; * * * which will then allow calling them from Ruby either like: * * # order of set is defined by C++ default * a = IntSet.new * * # sort order defined by Ruby proc * b = IntSet.new( proc { |a,b| a > b } ) * */ %include %fragment("StdFunctors"); swig-3.0.12/Lib/ruby/std_pair.i0000664000175000017500000001263713042756442016114 0ustar williamwilliam/* Pairs */ %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { template struct traits_asval > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(VALUE obj, std::pair *val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if (RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; } return res; } }; template struct traits_asptr > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(VALUE obj, std::pair **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if ( RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { static VALUE _wrap_pair_second( VALUE self ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE _wrap_pair_second_eq( VALUE self, VALUE arg ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE from(const std::pair& val) { VALUE obj = rb_ary_new2(2); rb_ary_push(obj, swig::from::noconst_type>(val.first)); rb_ary_push(obj, swig::from(val.second)); rb_define_singleton_method(obj, "second", VALUEFUNC(_wrap_pair_second), 0 ); rb_define_singleton_method(obj, "second=", VALUEFUNC(_wrap_pair_second_eq), 1 ); rb_obj_freeze(obj); // treat as immutable tuple return obj; } }; } } // Missing typemap %typemap(in) std::pair* (int res) { res = swig::asptr( $input, &$1 ); if (!SWIG_IsOK(res)) %argument_fail(res, "$1_type", $symname, $argnum); } %define %swig_pair_methods(pair...) %extend { VALUE inspect() const { VALUE tmp; const char *type_name = swig::type_name< pair >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " (" ); tmp = swig::from( $self->first ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "," ); tmp = swig::from( $self->second ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, ")" ); return str; } VALUE to_s() const { VALUE tmp; VALUE str = rb_str_new2( "(" ); tmp = swig::from( $self->first ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "," ); tmp = swig::from( $self->second ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, ")" ); return str; } VALUE __getitem__( int index ) { if (( index % 2 ) == 0 ) return swig::from( $self->first ); else return swig::from( $self->second ); } VALUE __setitem__( int index, VALUE obj ) { int res; if (( index % 2 ) == 0 ) { res = swig::asval( obj, &($self->first) ); } else { res = swig::asval(obj, &($self->second) ); } if (!SWIG_IsOK(res)) rb_raise( rb_eArgError, "invalid item for " #pair ); return obj; } } // extend %enddef %include swig-3.0.12/Lib/ruby/rubykw.swg0000664000175000017500000000223113042756442016167 0ustar williamwilliam#ifndef RUBY_RUBYKW_SWG_ #define RUBY_RUBYKW_SWG_ /* Warnings for Ruby keywords */ #define RUBYKW(x) %keywordwarn("'" `x` "' is a ruby keyword, renaming to 'C_" `x` "'",rename="C_%s",fullname=1) `x` /* from http://www.rubycentral.com/book/language.html */ RUBYKW(BEGIN); RUBYKW(END); RUBYKW(alias); RUBYKW(and); RUBYKW(begin); RUBYKW(break); RUBYKW(case); RUBYKW(class); RUBYKW(def); RUBYKW("defined"); RUBYKW(do); RUBYKW(else); RUBYKW(elsif); RUBYKW(end); RUBYKW(ensure); RUBYKW(false); RUBYKW(fatal); RUBYKW(for); RUBYKW(if); RUBYKW(in); RUBYKW(module); RUBYKW(next); RUBYKW(nil); RUBYKW(not); RUBYKW(or); RUBYKW(redo); RUBYKW(rescue); RUBYKW(retry); RUBYKW(return); RUBYKW(self); RUBYKW(super); RUBYKW(then); RUBYKW(true); RUBYKW(undef); RUBYKW(unless); RUBYKW(until); RUBYKW(when); RUBYKW(while); RUBYKW(yield); // RUBYKW(FalseClass); // RUBYKW(TrueClass); // RUBYKW(Numeric); // RUBYKW(Integer); // RUBYKW(Fixnum); // RUBYKW(Float); // RUBYKW(Range); // RUBYKW(Array); // RUBYKW(String); // RUBYKW(IO); // RUBYKW(File); // RUBYKW(FileUtils); // RUBYKW(Find); // RUBYKW(Struct); // RUBYKW(OpenStruct); // RUBYKW(Regexp); #undef RUBYKW #endif //RUBY_RUBYKW_SWG_ swig-3.0.12/Lib/ruby/rubyclasses.swg0000664000175000017500000002617013042756442017213 0ustar williamwilliam#ifdef __cplusplus /* GC_VALUE is used as a replacement of Ruby's VALUE. GC_VALUE automatically handles registering and unregistering of the underlying Ruby object with the GC. It can be used if you want to create STL containers of VALUEs, such as: std::vector< GC_VALUE >; or as a member variable: struct A { GC_VALUE _obj; A(VALUE o) : _obj(o) { } }; or as a input/output value (not much use for this, as VALUE works just as well here, thou): GC_VALUE func(GC_VALUE obj) { GC_VALUE out = rb_obj_classname(obj); return out; } GC_VALUE is 'visible' at the wrapped side, so you can do: %template(RubyVector) std::vector; and all the proper typemaps will be used. */ %fragment("GC_VALUE_definition","header") { namespace swig { class SwigGCReferences { VALUE _hash; SwigGCReferences() : _hash(Qnil) { } ~SwigGCReferences() { if (_hash != Qnil) rb_gc_unregister_address(&_hash); } static void EndProcHandler(VALUE) { // Ruby interpreter ending - _hash can no longer be accessed. SwigGCReferences &s_references = instance(); s_references._hash = Qnil; } public: static SwigGCReferences& instance() { // Hash of all GC_VALUE's currently in use static SwigGCReferences s_references; return s_references; } static void initialize() { SwigGCReferences &s_references = instance(); if (s_references._hash == Qnil) { rb_set_end_proc(&EndProcHandler, Qnil); s_references._hash = rb_hash_new(); rb_gc_register_address(&s_references._hash); } } void GC_register(VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 0; ++n; rb_hash_aset(_hash, obj, INT2NUM(n)); } } void GC_unregister(const VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; // this test should not be needed but I've noticed some very erratic // behavior of none being unregistered in some very rare situations. if (BUILTIN_TYPE(obj) == T_NONE) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 1; --n; if (n) rb_hash_aset(_hash, obj, INT2NUM(n)); else rb_hash_delete(_hash, obj); } } }; class GC_VALUE { protected: VALUE _obj; static ID hash_id; static ID lt_id; static ID gt_id; static ID eq_id; static ID le_id; static ID ge_id; static ID pos_id; static ID neg_id; static ID inv_id; static ID add_id; static ID sub_id; static ID mul_id; static ID div_id; static ID mod_id; static ID and_id; static ID or_id; static ID xor_id; static ID lshift_id; static ID rshift_id; struct OpArgs { VALUE src; ID id; int nargs; VALUE target; }; public: GC_VALUE() : _obj(Qnil) { } GC_VALUE(const GC_VALUE& item) : _obj(item._obj) { SwigGCReferences::instance().GC_register(_obj); } GC_VALUE(VALUE obj) :_obj(obj) { SwigGCReferences::instance().GC_register(_obj); } ~GC_VALUE() { SwigGCReferences::instance().GC_unregister(_obj); } GC_VALUE & operator=(const GC_VALUE& item) { SwigGCReferences::instance().GC_unregister(_obj); _obj = item._obj; SwigGCReferences::instance().GC_register(_obj); return *this; } operator VALUE() const { return _obj; } VALUE inspect() const { return rb_inspect(_obj); } VALUE to_s() const { return rb_inspect(_obj); } static VALUE swig_rescue_swallow(VALUE) { /* VALUE errstr = rb_obj_as_string(rb_errinfo()); printf("Swallowing error: '%s'\n", RSTRING_PTR(StringValue(errstr))); */ return Qnil; /* Swallow Ruby exception */ } static VALUE swig_rescue_funcall(VALUE p) { OpArgs* args = (OpArgs*) p; return rb_funcall(args->src, args->id, args->nargs, args->target); } bool relational_equal_op(const GC_VALUE& other, const ID& op_id, bool (*op_func)(const VALUE& a, const VALUE& b)) const { if (FIXNUM_P(_obj) && FIXNUM_P(other._obj)) { return op_func(_obj, other._obj); } bool res = false; VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; if (rb_respond_to(_obj, op_id)) { OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); } if (ret == Qnil) { VALUE a = rb_funcall( _obj, hash_id, 0 ); VALUE b = rb_funcall( VALUE(other), hash_id, 0 ); res = op_func(a, b); } else { res = RTEST(ret); } SWIG_RUBY_THREAD_END_BLOCK; return res; } static bool operator_eq(const VALUE& a, const VALUE& b) { return a == b; } static bool operator_lt(const VALUE& a, const VALUE& b) { return a < b; } static bool operator_le(const VALUE& a, const VALUE& b) { return a <= b; } static bool operator_gt(const VALUE& a, const VALUE& b) { return a > b; } static bool operator_ge(const VALUE& a, const VALUE& b) { return a >= b; } bool operator==(const GC_VALUE& other) const { return relational_equal_op(other, eq_id, operator_eq); } bool operator<(const GC_VALUE& other) const { return relational_equal_op(other, lt_id, operator_lt); } bool operator<=(const GC_VALUE& other) const { return relational_equal_op(other, le_id, operator_le); } bool operator>(const GC_VALUE& other) const { return relational_equal_op(other, gt_id, operator_gt); } bool operator>=(const GC_VALUE& other) const { return relational_equal_op(other, ge_id, operator_ge); } bool operator!=(const GC_VALUE& other) const { return !(this->operator==(other)); } GC_VALUE unary_op(const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 0; args.target = Qnil; ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return ret; } GC_VALUE operator+() const { return unary_op(pos_id); } GC_VALUE operator-() const { return unary_op(neg_id); } GC_VALUE operator~() const { return unary_op(inv_id); } GC_VALUE binary_op(const GC_VALUE& other, const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(RUBY_METHOD_FUNC(swig_rescue_funcall), VALUE(&args), (RUBY_METHOD_FUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return GC_VALUE(ret); } GC_VALUE operator+(const GC_VALUE& other) const { return binary_op(other, add_id); } GC_VALUE operator-(const GC_VALUE& other) const { return binary_op(other, sub_id); } GC_VALUE operator*(const GC_VALUE& other) const { return binary_op(other, mul_id); } GC_VALUE operator/(const GC_VALUE& other) const { return binary_op(other, div_id); } GC_VALUE operator%(const GC_VALUE& other) const { return binary_op(other, mod_id); } GC_VALUE operator&(const GC_VALUE& other) const { return binary_op(other, and_id); } GC_VALUE operator^(const GC_VALUE& other) const { return binary_op(other, xor_id); } GC_VALUE operator|(const GC_VALUE& other) const { return binary_op(other, or_id); } GC_VALUE operator<<(const GC_VALUE& other) const { return binary_op(other, lshift_id); } GC_VALUE operator>>(const GC_VALUE& other) const { return binary_op(other, rshift_id); } }; ID GC_VALUE::hash_id = rb_intern("hash"); ID GC_VALUE::lt_id = rb_intern("<"); ID GC_VALUE::gt_id = rb_intern(">"); ID GC_VALUE::eq_id = rb_intern("=="); ID GC_VALUE::le_id = rb_intern("<="); ID GC_VALUE::ge_id = rb_intern(">="); ID GC_VALUE::pos_id = rb_intern("+@"); ID GC_VALUE::neg_id = rb_intern("-@"); ID GC_VALUE::inv_id = rb_intern("~"); ID GC_VALUE::add_id = rb_intern("+"); ID GC_VALUE::sub_id = rb_intern("-"); ID GC_VALUE::mul_id = rb_intern("*"); ID GC_VALUE::div_id = rb_intern("/"); ID GC_VALUE::mod_id = rb_intern("%"); ID GC_VALUE::and_id = rb_intern("&"); ID GC_VALUE::or_id = rb_intern("|"); ID GC_VALUE::xor_id = rb_intern("^"); ID GC_VALUE::lshift_id = rb_intern("<<"); ID GC_VALUE::rshift_id = rb_intern(">>"); typedef GC_VALUE LANGUAGE_OBJ; } // namespace swig } // %fragment(GC_VALUE_definition) namespace swig { %apply VALUE {GC_VALUE}; // Make sure this is the last typecheck done %typecheck(999999,fragment="GC_VALUE_definition",noblock=1) GC_VALUE, GC_VALUE&, const GC_VALUE& { $1 = 1; }; /* For input */ %typemap(in,fragment="GC_VALUE_definition",noblock=1) GC_VALUE* (GC_VALUE r), GC_VALUE& (GC_VALUE r) { r = $input; $1 = &r; } /* For output */ %typemap(out,fragment="GC_VALUE_definition",noblock=1) GC_VALUE { $result = (VALUE)$1; } %typemap(out,fragment="GC_VALUE_definition",noblock=1) GC_VALUE*, GC_VALUE const & { $result = (VALUE)*$1; } %nodirector GC_VALUE; // We ignore the constructor so that user can never create a GC_VALUE // manually %ignore GC_VALUE::GC_VALUE; struct GC_VALUE { VALUE inspect() const; VALUE to_s() const; GC_VALUE(); protected: GC_VALUE(const GC_VALUE&); ~GC_VALUE(); }; %exception GC_VALUE {}; %ignore LANGUAGE_OBJ; typedef GC_VALUE LANGUAGE_OBJ; } %init { swig::SwigGCReferences::initialize(); } // // Fragment that contains traits to properly deal with GC_VALUE. // These functions may be invoked as a need of the from(), asval(), // asptr() and as() template functors, usually used in %typemaps. // %fragment(SWIG_Traits_frag(swig::GC_VALUE),"header",fragment="StdTraits",fragment="GC_VALUE_definition") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "GC_VALUE"; } }; template <> struct traits_from { typedef GC_VALUE value_type; static VALUE from(const value_type& val) { return static_cast(val); } }; template <> struct traits_check { static bool check(GC_VALUE) { return true; } }; template <> struct traits_asval { typedef GC_VALUE value_type; static int asval(VALUE obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } // swig } // %fragment(traits for swig::GC_VALUE) #endif // __cplusplus swig-3.0.12/Lib/ruby/rubycontainer.swg0000664000175000017500000007043113042756442017537 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubycontainer.swg * * Ruby sequence <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Ruby, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include /**** The RubySequence C++ Wrap ***/ %fragment(""); %include %fragment("RubySequence_Base","header") { %#include namespace swig { template < class T > struct yield { bool operator()( const T& v ) const { return RTEST( rb_yield( swig::from< T >(v) ) ); } }; inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void resize(Sequence *seq, typename Sequence::size_type n, typename Sequence::value_type x) { seq->resize(n, x); } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } } %fragment("RubySequence_Cont","header", fragment="", fragment="StdTraits", fragment="RubySequence_Base", fragment="ConstIterator_T") { namespace swig { /** * This class is a proxy class for references, used to return and set values * of an element of a Ruby Array of stuff. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_Ref { RubySequence_Ref(VALUE seq, int index) : _seq(seq), _index(index) { } operator T () const { VALUE item = rb_ary_entry(_seq, _index ); try { return swig::as(item, true); } catch (std::exception& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", _index); VALUE lastErr = rb_gv_get("$!"); if ( lastErr == Qnil ) { %type_error(swig::type_name()); } VALUE str = rb_str_new2(msg); str = rb_str_cat2( str, e.what() ); SWIG_Ruby_ExceptionType( NULL, str ); throw; } } RubySequence_Ref& operator=(const T& v) { rb_ary_set(_seq, _index, swig::from< T >(v)); return *this; } private: VALUE _seq; int _index; }; /** * This class is a proxy to return a pointer to a class, usually * RubySequence_Ref. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_ArrowProxy { RubySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; /** * Input Iterator. This adapator class is a random access iterator that * allows you to use STL algorithms with a Ruby class (a Ruby Array by default). */ template > struct RubySequence_InputIterator { typedef RubySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef ptrdiff_t difference_type; RubySequence_InputIterator() { } RubySequence_InputIterator(VALUE seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } RubySequence_ArrowProxy operator->() const { return RubySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: VALUE _seq; difference_type _index; }; /** * This adaptor class allows you to use a Ruby Array as if it was an STL * container, giving it begin(), end(), and iterators. */ template struct RubySequence_Cont { typedef RubySequence_Ref reference; typedef const RubySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef RubySequence_InputIterator iterator; typedef RubySequence_InputIterator const_iterator; RubySequence_Cont(VALUE seq) : _seq(0) { if (!rb_obj_is_kind_of(seq, rb_cArray)) { throw std::invalid_argument("an Array is expected"); } _seq = seq; } ~RubySequence_Cont() { } size_type size() const { return RARRAY_LEN(_seq); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check(bool set_err = false) const { int s = (int) size(); for (int i = 0; i < s; ++i) { VALUE item = rb_ary_entry(_seq, i ); if (!swig::check(item)) { if (set_err) { char msg[1024]; sprintf(msg, "in sequence element %d", i); SWIG_Error(SWIG_RuntimeError, msg); } return false; } } return true; } private: VALUE _seq; }; } } /** * Macros used to typemap an STL iterator -> SWIGIterator conversion. */ %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) %typemap(out,noblock=1,fragment="RubySequence_Cont") const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &), self), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="RubySequence_Cont") iterator, reverse_iterator { $result = SWIG_NewPointerObj(swig::make_nonconst_iterator(%static_cast($1,const $type &), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="RubySequence_Cont") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).first), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).second), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); } // std::map/multimap/set allow returning std::pair< iterator, iterator > from // equal_range, but we cannot still modify the key, so the iterator is // const. %typemap(out,noblock=1,fragment="RubySequence_Cont") std::pair { $result = rb_ary_new2(2); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).first), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); rb_ary_push($result, SWIG_NewPointerObj(swig::make_const_iterator(%static_cast($1,const $type &).second), swig::ConstIterator::descriptor(),SWIG_POINTER_OWN)); } %typemap(in,noblock=1,fragment="RubySequence_Cont") const_iterator(swig::ConstIterator *iter = 0, int res), const_reverse_iterator(swig::ConstIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::ConstIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::ConstIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typemap(in,noblock=1,fragment="RubySequence_Cont") iterator(swig::Iterator *iter = 0, int res), reverse_iterator(swig::Iterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::Iterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="RubySequence_Cont") const_iterator, const_reverse_iterator { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::ConstIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="RubySequence_Cont") iterator, reverse_iterator { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("RubySequence_Cont"); // %newobject iterator; // %newobject const_iterator; // %extend { // swig::Iterator* iterator(VALUE* RUBY_SELF) { // return swig::make_nonconst_iterator($self->begin(), $self->begin(), // $self->end(), *RUBY_SELF); // } // swig::ConstIterator* const_iterator(VALUE* RUBY_SELF) { // return swig::make_const_iterator($self->begin(), $self->begin(), // $self->end(), *RUBY_SELF); // } // } #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef /**** The Ruby container methods ****/ %define %swig_container_methods(Container...) %extend { %newobject dup; Container* dup() { return new Container(*$self); } } %enddef /** * Macro used to define common Ruby printing methods for STL container */ %define %swig_sequence_printing_methods(Sequence...) %extend { VALUE inspect() { Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); const char *type_name = swig::type_name< Sequence >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< Sequence::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } VALUE to_a() { Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< Sequence::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } VALUE to_s() { Sequence::iterator i = $self->begin(); Sequence::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< Sequence::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef /** * Macro used to add common methods to all STL sequence-type containers */ %define %swig_sequence_methods_non_resizable_common(Sequence...) %swig_container_methods(%arg(Sequence)) %swig_sequence_iterator(%arg(Sequence)) %swig_sequence_printing_methods(%arg(Sequence)) %fragment("RubySequence_Base"); %extend { VALUE slice( difference_type i, difference_type length ) throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( std::out_of_range ) { } return r; } Sequence* each() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Sequence::const_iterator i = self->begin(); Sequence::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< Sequence::value_type >(*i); rb_yield(r); } return self; } VALUE __delete2__(const value_type& i) { VALUE r = Qnil; return r; } } %enddef %define %swig_sequence_methods_resizable_common(Sequence...) %extend { %newobject select; Sequence* select() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Sequence* r = new Sequence(); Sequence::const_iterator i = $self->begin(); Sequence::const_iterator e = $self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< Sequence::value_type >(*i); if ( RTEST( rb_yield(v) ) ) $self->insert( r->end(), *i); } return r; } VALUE delete_at(difference_type i) { VALUE r = Qnil; try { Sequence::iterator at = swig::getpos(self, i); r = swig::from< Sequence::value_type >( *(at) ); $self->erase(at); } catch (std::out_of_range) { } return r; } } %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_resizable_common(%arg(Sequence)) %enddef /** * Macro used to add functions for back insertion of values in * STL sequence containers */ %define %swig_sequence_back_inserters( Sequence... ) %extend { VALUE pop() { if ($self->empty()) return Qnil; Sequence::value_type x = self->back(); $self->pop_back(); return swig::from< Sequence::value_type >( x ); } %alias push "<<"; const value_type push( const value_type& e ) { $self->push_back( e ); return e; } %newobject reject; Sequence* reject() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Sequence* r = new Sequence(); std::remove_copy_if( $self->begin(), $self->end(), std::back_inserter(*r), swig::yield< Sequence::value_type >() ); return r; } } %enddef %define %swig_sequence_methods_extra(Sequence...) %extend { %alias reject_bang "delete_if"; Sequence* reject_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); $self->erase( std::remove_if( $self->begin(), $self->end(), swig::yield< Sequence::value_type >() ), $self->end() ); return $self; } } %enddef %define %swig_sequence_methods_non_resizable_accessors(Sequence...) %extend { VALUE at(difference_type i) const { VALUE r = Qnil; try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } catch( std::out_of_range ) { } return r; } VALUE __getitem__(difference_type i, difference_type length) const throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const Sequence* >( swig::getslice(self, i, j) ); } catch( std::out_of_range ) { } return r; } VALUE __getitem__(difference_type i) const { VALUE r = Qnil; try { r = swig::from< Sequence::value_type >( *(swig::cgetpos(self, i)) ); } catch( std::out_of_range ) { } return r; } VALUE __getitem__(VALUE i) const throw (std::invalid_argument) { if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall( i, id_start, 0 ); VALUE end = rb_funcall( i, id_end, 0 ); bool noend = ( rb_funcall( i, id_noend, 0 ) == Qtrue ); int len = $self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< Sequence* >( swig::getslice(self, s, e+1) ); } VALUE __setitem__(difference_type i, const value_type& x) throw (std::invalid_argument, std::out_of_range) { if ( i >= static_cast( $self->size()) ) swig::resize( $self, i+1, x ); else *(swig::getpos($self, i)) = x; return swig::from< Sequence::value_type >( x ); } VALUE __setitem__(difference_type i, difference_type length, const Sequence& v) throw (std::invalid_argument) { if ( length < 0 ) return Qnil; std::size_t len = $self->size(); if ( i < 0 ) { if ( i + static_cast(len) < 0 ) return Qnil; else i = len + i; } Sequence::difference_type j = length + i; if ( j > static_cast(len) ) { swig::resize( $self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice($self, i, j, v); r = swig::from< const Sequence* >( &v ); return r; } } %enddef /** * Macro used to add functions for non resizable sequences */ %define %swig_sequence_methods_non_resizable(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_non_resizable_accessors(%arg(Sequence)) %enddef /** * Macro used to add functions for sequences */ %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_non_resizable_common(%arg(Sequence)) %swig_sequence_methods_resizable_common(%arg(Sequence)) %swig_sequence_methods_non_resizable_accessors(%arg(Sequence)) %swig_sequence_methods_extra(%arg(Sequence)); %swig_sequence_back_inserters(%arg(Sequence)); %enddef %define %swig_sequence_methods_non_resizable_val(Sequence...) %swig_sequence_methods_non_resizable(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods(%arg(Sequence)) %enddef /** * Macro used to add functions for front insertion of * elements in STL sequence containers that support it. */ %define %swig_sequence_front_inserters( Sequence... ) %extend { VALUE shift() { if ($self->empty()) return Qnil; Sequence::value_type x = self->front(); $self->erase( $self->begin() ); return swig::from< Sequence::value_type >( x ); } %typemap(in) (int argc, VALUE* argv) { $1 = argc - 1; $2 = argv + 1; } Sequence* insert( difference_type pos, int argc, VALUE* argv, ... ) { std::size_t len = $self->size(); std::size_t i = swig::check_index( pos, len, true ); Sequence::iterator start; VALUE elem = argv[0]; int idx = 0; try { Sequence::value_type val = swig::as( elem, true ); if ( i >= len ) { $self->resize(i-1, val); return $self; } start = $self->begin(); std::advance( start, i ); $self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as( elem ); $self->insert( start++, val ); } } catch( std::invalid_argument ) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name(), __FUNCTION__, idx+2, elem )); } return $self; } %typemap(in) (int argc, VALUE* argv) { $1 = argc; $2 = argv; } Sequence* unshift( int argc, VALUE* argv, ... ) { for ( int idx = argc-1; idx >= 0; --idx ) { Sequence::iterator start = $self->begin(); VALUE elem = argv[idx]; try { Sequence::value_type val = swig::as( elem, true ); $self->insert( start, val ); } catch( std::invalid_argument ) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name(), __FUNCTION__, idx+2, elem )); } } return $self; } } %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="RubySequence_Cont", fragment="GC_VALUE_definition") { namespace swig { template inline void assign(const RubySeq& rubyseq, Seq* seq) { // seq->assign(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { RubySequence_Cont rubyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return rubyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; // Partial specialization for GC_VALUE's. No need to typecheck each // element. template< class Seq > struct traits_asptr_stdseq< Seq, swig::GC_VALUE > { typedef Seq sequence; typedef swig::GC_VALUE value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { if (seq) { RubySequence_Cont rubyseq(obj); sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return true; } } catch (std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static VALUE from(const sequence& seq) { #ifdef SWIG_RUBY_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } #endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { VALUE obj = rb_ary_new2((int)size); int i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { rb_ary_push(obj, swig::from< value_type >(*it)); } rb_obj_freeze(obj); // treat as immutable result return obj; } else { rb_raise(rb_eRangeError,"sequence size not valid in ruby"); return Qnil; } } }; } } %include swig-3.0.12/Lib/ruby/std_char_traits.i0000664000175000017500000000004113042756442017446 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/stl.i0000664000175000017500000000054513042756442015104 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/ruby/rubyinit.swg0000664000175000017500000000004713042756442016514 0ustar williamwilliam%insert(initbeforefunc) "swiginit.swg" swig-3.0.12/Lib/ruby/rubyopers.swg0000664000175000017500000000347413042756442016710 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ #ifdef __cplusplus %rename(__add__) *::operator+; %rename(__pos__) *::operator+(); %rename(__pos__) *::operator+() const; %rename(__sub__) *::operator-; %rename(__neg__) *::operator-(); %rename(__neg__) *::operator-() const; %rename(__mul__) *::operator*; %rename(__div__) *::operator/; %rename(__mod__) *::operator%; %rename(__lshift__) *::operator<<; %rename(__rshift__) *::operator>>; %rename(__and__) *::operator&; %rename(__or__) *::operator|; %rename(__xor__) *::operator^; %rename(__invert__) *::operator~; %rename(__lt__) *::operator<; %rename(__le__) *::operator<=; %rename(__gt__) *::operator>; %rename(__ge__) *::operator>=; %rename(__eq__) *::operator==; /* Special cases */ %rename(__call__) *::operator(); /* Ignored inplace operators */ %ignoreoperator(NOTEQUAL) operator!=; %ignoreoperator(PLUSEQ) operator+=; %ignoreoperator(MINUSEQ) operator-=; %ignoreoperator(MULEQ) operator*=; %ignoreoperator(DIVEQ) operator/=; %ignoreoperator(MODEQ) operator%=; %ignoreoperator(LSHIFTEQ) operator<<=; %ignoreoperator(RSHIFTEQ) operator>>=; %ignoreoperator(ANDEQ) operator&=; %ignoreoperator(OREQ) operator|=; %ignoreoperator(XOREQ) operator^=; /* Ignored operators */ %ignoreoperator(LNOT) operator!; %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(EQ) operator=; %ignoreoperator(PLUSPLUS) operator++; %ignoreoperator(MINUSMINUS) operator--; %ignoreoperator(ARROWSTAR) operator->*; %ignoreoperator(INDEX) operator[]; #endif /* __cplusplus */ swig-3.0.12/Lib/ruby/rubycontainer_extended.swg0000664000175000017500000000672413042756442021423 0ustar williamwilliam/* ----------------------------------------------------------------------------- * rubycontainer_extended.swg * * This file contains additional functions that make containers * behave closer to ruby primitive types. * However, some of these functions place some restrictions on * the underlying object inside of the container and the iterator * (that it has to have an == comparison function, that it has to have * an = assignment operator, etc). * ----------------------------------------------------------------------------- */ /** * Macro used to add extend functions that require operator== in object. * * @param Container STL container * @param Type class inside container * */ %define %swig_container_with_equal_operator( Container, Type ) VALUE __delete__( const Type& val ) { VALUE r = Qnil; Container::iterator e = $self->end(); Container::iterator i = std::remove( $self->begin(), e, val ); // remove dangling elements now $self->erase( i, e ); if ( i != e ) r = swig::from< Type >( val ); else if ( rb_block_given_p() ) r = rb_yield(Qnil); return r; } %enddef // end of %swig_container_with_equal_operator /** * Macro used to add extend functions that require the assignment * operator (ie. = ) of contained class * * @param Container STL container * @param Type class inside container * */ %define %swig_container_with_assignment( Container, Type ) // // map! -- the equivalent of std::transform // Container< Type >* map_bang() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "No block given" ); VALUE r = Qnil; Container< Type >::iterator i = $self->begin(); Container< Type >::iterator e = $self->end(); try { for ( ; i != e; ++i ) { r = swig::from< Type >( *i ); r = rb_yield( r ); *i = swig::as< Type >( r ); } } catch ( const std::invalid_argument& ) { rb_raise(rb_eTypeError, "Yield block did not return a valid element for " "Container"); } return $self; } %enddef // end of %swig_container_with_assignment /** * Macro used to add all extended functions to a container * * @param Container STL container * @param Type class inside container * */ %define %swig_container_extend( Container, Type ) %extend Container< Type > { %swig_container_with_assignment( %arg(Container), Type ); %swig_container_with_equal_operator( %arg(Container), Type ); } %enddef /** * Private macro used to add all extended functions to C/C++ * primitive types * * @param Container an STL container, like std::vector (with no class template) * */ %define %__swig_container_extend_primtypes( Container ) %swig_container_extend( %arg( Container ), bool ); %swig_container_extend( %arg( Container ), char ); %swig_container_extend( %arg( Container ), short ); %swig_container_extend( %arg( Container ), int ); %swig_container_extend( %arg( Container ), unsigned short ); %swig_container_extend( %arg( Container ), unsigned int ); %swig_container_extend( %arg( Container ), float ); %swig_container_extend( %arg( Container ), double ); %swig_container_extend( %arg( Container ), std::complex ); %swig_container_extend( %arg( Container ), std::string ); %swig_container_extend( %arg( Container ), swig::GC_VALUE ); %enddef %__swig_container_extend_primtypes( std::vector ); %__swig_container_extend_primtypes( std::deque ); %__swig_container_extend_primtypes( std::list ); swig-3.0.12/Lib/ruby/exception.i0000664000175000017500000000017613042756442016300 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg);)) } swig-3.0.12/Lib/ruby/std_list.i0000664000175000017500000000201513042756442016121 0ustar williamwilliam/* Lists */ %fragment("StdListTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static VALUE from(const std::list & vec) { return traits_from_stdseq >::from(vec); } }; } %} %ignore std::list::push_back; %ignore std::list::pop_back; #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %rename("delete") std::list::__delete__; %rename("reject!") std::list::reject_bang; %rename("map!") std::list::map_bang; %rename("empty?") std::list::empty; %rename("include?" ) std::list::__contains__ const; %rename("has_key?" ) std::list::has_key const; %alias std::list::push "<<"; %include swig-3.0.12/Lib/ruby/rubyuserdir.swg0000664000175000017500000000122113042756442017221 0ustar williamwilliam#define %alias %feature("alias") #define %freefunc %feature("freefunc") #define %markfunc %feature("markfunc") #define %mixin %feature("mixin") #define %predicate %feature("predicate", "1") #define %bang %feature("bang", "1") #define %trackobjects %feature("trackobjects") #define %nooutput %feature("outputs","0") #define %initstack %feature("initstack", "1") #define %ignorestack %feature("initstack", "0") /* ------------------------------------------------------------------------- */ /* Enable keywords paramaters */ #define %kwargs %feature("kwargs") #define %nokwargs %feature("kwargs", "0") #define %clearkwargs %feature("kwargs", "") swig-3.0.12/Lib/ruby/std_iostream.i0000664000175000017500000000034313042756442016773 0ustar williamwilliamnamespace std { %callback("%s") endl; %callback("%s") ends; %callback("%s") flush; } %warnfilter(365) operator+=; %warnfilter(802) std::basic_iostream; // turn off multiple inheritance warning %include swig-3.0.12/Lib/ruby/cdata.i0000664000175000017500000000003613042756442015351 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/std_vectora.i0000664000175000017500000000166613042756442016624 0ustar williamwilliam/* Vectors + allocators */ %fragment("StdVectorATraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { typedef std::vector vector_type; typedef T value_type; static int asptr(VALUE obj, vector_type **vec) { return traits_asptr_stdseq::asptr(obj, vec); } }; template struct traits_from > { typedef std::vector vector_type; static VALUE from(const vector_type& vec) { return traits_from_stdseq::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %mixin std::vector "Enumerable"; %ignore std::vector::push_back; %ignore std::vector::pop_back; %alias std::vector::push "<<"; %include swig-3.0.12/Lib/ruby/std_string.i0000664000175000017500000000027613042756442016463 0ustar williamwilliam %warnfilter(801) std::string; // wrong class name %warnfilter(378) std::basic_string::operator!=; AUTODOC(substr, "Return a portion of the String"); %include swig-3.0.12/Lib/ruby/std_ios.i0000664000175000017500000000057413042756442015750 0ustar williamwilliam #pragma SWIG nowarn=801 %rename(ios_base_in) std::ios_base::in; AUTODOC(cerr, "Standard C++ error stream"); AUTODOC(cout, "Standard C++ output stream"); AUTODOC(cin, "Standard C++ input stream"); AUTODOC(clog, "Standard C++ logging stream"); AUTODOC(endl, "Add an end line to stream"); AUTODOC(ends, "Ends stream"); AUTODOC(flush, "Flush stream"); %include swig-3.0.12/Lib/ruby/std_map.i0000664000175000017500000002607213042756442015734 0ustar williamwilliam// // Maps // %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct MapIterator_T : ConstIteratorClosed_T { MapIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : ConstIteratorClosed_T(curr, first, last, seq) { } }; template > struct MapKeyIterator_T : MapIterator_T { MapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapKeyIterator_T(current, begin, end, seq); } template > struct MapValueIterator_T : MapIterator_T { MapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapValueIterator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const RubySeq& rubyseq, std::map *map) { typedef typename std::map::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(VALUE obj, map_type **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall(obj, id_to_a, 0); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static VALUE from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise( rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); rb_hash_aset(obj, key, val); } return obj; } } }; } } %define %swig_map_common(Map...) %swig_container_methods(%arg(Map)); // %swig_sequence_iterator(%arg(Map)); %extend { VALUE __delete__(const key_type& key) { Map::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } VALUE keys() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } Map* each() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { const Map::key_type& key = i->first; const Map::mapped_type& val = i->second; k = swig::from(key); v = swig::from(val); rb_yield_values(2, k, v); } return self; } %newobject select; Map* select() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); Map* r = new Map; Map::iterator i = $self->begin(); Map::iterator e = $self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from(i->first); VALUE v = swig::from(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) $self->insert(r->end(), *i); } return r; } %typemap(in) (int argc, VALUE* argv) { $1 = argc; $2 = argv; } VALUE values_at(int argc, VALUE* argv, ...) { VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< Map >(); VALUE me = SWIG_NewPointerObj( $self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } Map* each_key() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } VALUE values() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } Map* each_value() { if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; Map::iterator i = self->begin(); Map::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } VALUE entries() { Map::size_type size = self->size(); int rubysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); Map::const_iterator i = self->begin(); Map::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from >(*i) ); } return ary; } bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(VALUE *RUBY_SELF); swig::ConstIterator* key_iterator(VALUE *RUBY_SELF) { return swig::make_output_key_iterator($self->begin(), $self->begin(), $self->end(), *RUBY_SELF); } %newobject value_iterator(VALUE *RUBY_SELF); swig::ConstIterator* value_iterator(VALUE *RUBY_SELF) { return swig::make_output_value_iterator($self->begin(), $self->begin(), $self->end(), *RUBY_SELF); } } %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) %extend { VALUE __getitem__(const key_type& key) const { Map::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from( i->second ); else return Qnil; } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } VALUE inspect() { Map::const_iterator i = $self->begin(); Map::const_iterator e = $self->end(); const char *type_name = swig::type_name< Map >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< Map::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< Map::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } VALUE to_a() { Map::const_iterator i = $self->begin(); Map::const_iterator e = $self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair >( *i ); rb_ary_push( ary, tmp ); } return ary; } VALUE to_s() { Map::iterator i = $self->begin(); Map::iterator e = $self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } } %enddef %mixin std::map "Enumerable"; %rename("delete") std::map::__delete__; %rename("reject!") std::map::reject_bang; %rename("map!") std::map::map_bang; %rename("empty?") std::map::empty; %rename("include?" ) std::map::__contains__ const; %rename("has_key?" ) std::map::has_key const; %alias std::map::push "<<"; %include swig-3.0.12/Lib/ruby/cstring.i0000664000175000017500000000004013042756442015741 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/rubyfragments.swg0000664000175000017500000000105013042756442017532 0ustar williamwilliam/* Create a file with this name, 'rubyfragments.swg', in your working directory and add all the %fragments you want to take precedence over the ones defined by default by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(VALUE obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-3.0.12/Lib/ruby/factory.i0000664000175000017500000000004013042756442015737 0ustar williamwilliam%include swig-3.0.12/Lib/ruby/boost_shared_ptr.i0000664000175000017500000003764513042756442017656 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif %fragment("SWIG_null_deleter_python", "header", fragment="SWIG_null_deleter") { %#define SWIG_NO_NULL_DELETER_SWIG_BUILTIN_INIT } // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE %{(void)arg1; delete reinterpret_cast< SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > * >(self);%} // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; swig_ruby_owntype newmem = {0, 0}; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter_python") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { swig_ruby_owntype newmem = {0, 0}; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem.own & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 && *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { swig_ruby_owntype newmem = {0, 0}; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem.own & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 && **$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/python/0000775000175000017500000000000013042756442014464 5ustar williamwilliamswig-3.0.12/Lib/python/std_wiostream.i0000664000175000017500000000024613042756442017524 0ustar williamwilliamnamespace std { %callback(1) wendl; %callback(1) wends; %callback(1) wflush; } %include %include %include swig-3.0.12/Lib/python/std_complex.i0000664000175000017500000000072513042756442017163 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-3.0.12/Lib/python/std_deque.i0000664000175000017500000000124613042756442016616 0ustar williamwilliam/* Deques */ %fragment("StdDequeTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::deque **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::deque & vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/python/pythreads.swg0000664000175000017500000000546013042756442017216 0ustar williamwilliam#if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */ # define SWIG_PYTHON_USE_GIL # endif # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # ifndef SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif swig-3.0.12/Lib/python/std_multiset.i0000664000175000017500000000207513042756442017362 0ustar williamwilliam/* Multisets */ %include %fragment("StdMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::multiset* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(PyObject *obj, std::multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static PyObject *from(const std::multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_multiset_methods(Set...) %swig_set_methods(Set) %include swig-3.0.12/Lib/python/pyinit.swg0000664000175000017500000003225713042756442016533 0ustar williamwilliam/* ------------------------------------------------------------ * The start of the Python initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" #if defined(SWIGPYTHON_BUILTIN) %fragment(""); // For offsetof #endif %init %{ #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString(""); #else return PyString_FromString(""); #endif } SWIGINTERN PyObject * swig_varlink_str(swig_varlinkobject *v) { #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN int swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char *tmp; PyObject *str = swig_varlink_str(v); fprintf(fp,"Swig global variables "); fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str)); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(str); return 0; } SWIGINTERN void swig_varlink_dealloc(swig_varlinkobject *v) { swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(swig_varlinkobject *v, char *n) { PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) { int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ (printfunc) swig_varlink_print, /* tp_print */ (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; varlink_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 varlink_type.ob_type = &PyType_Type; #else if (PyType_Ready(&varlink_type) < 0) return NULL; #endif } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { strncpy(gv->name,name,size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } SWIGINTERN PyObject * SWIG_globals(void) { static PyObject *_SWIG_globals = 0; if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink(); return _SWIG_globals; } /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* -----------------------------------------------------------------------------*/ /* Fix SwigMethods to carry the callback ptrs when needed */ /* -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; strncpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; strncpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { # if PY_VERSION_HEX >= 0x03020000 PyModuleDef_HEAD_INIT, # else { PyObject_HEAD_INIT(NULL) NULL, /* m_init */ 0, /* m_index */ NULL, /* m_copy */ }, # endif (char *) SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = {0, 0, 0, 0, 0, 0, 0}; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { (PyCFunction) SwigPyObject_own, (PyCFunction) SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; PyTypeObject *swigpyobject; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* Metaclass is used to implement static member variables */ metatype = SwigPyObjectType(); assert(metatype); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule((char *) SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN swigpyobject = SwigPyObject_TypeOnce(); SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = swigpyobject; } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); %} swig-3.0.12/Lib/python/director.swg0000664000175000017500000002461613042756442017032 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Python proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PYTHON_HEADER_ #define SWIG_DIRECTOR_PYTHON_HEADER_ #include #include #include #include #include /* Use -DSWIG_PYTHON_DIRECTOR_NO_VTABLE if you don't want to generate a 'virtual table', and avoid multiple GetAttr calls to retrieve the python methods. */ #ifndef SWIG_PYTHON_DIRECTOR_NO_VTABLE #ifndef SWIG_PYTHON_DIRECTOR_VTABLE #define SWIG_PYTHON_DIRECTOR_VTABLE #endif #endif /* Use -DSWIG_DIRECTOR_NO_UEH if you prefer to avoid the use of the Undefined Exception Handler provided by swig. */ #ifndef SWIG_DIRECTOR_NO_UEH #ifndef SWIG_DIRECTOR_UEH #define SWIG_DIRECTOR_UEH #endif #endif /* Use -DSWIG_DIRECTOR_NORTTI if you prefer to avoid the use of the native C++ RTTI and dynamic_cast<>. But be aware that directors could stop working when using this option. */ #ifdef SWIG_DIRECTOR_NORTTI /* When we don't use the native C++ RTTI, we implement a minimal one only for Directors. */ # ifndef SWIG_DIRECTOR_RTDIR # define SWIG_DIRECTOR_RTDIR namespace Swig { class Director; SWIGINTERN std::map& get_rtdir_map() { static std::map rtdir_map; return rtdir_map; } SWIGINTERNINLINE void set_rtdir(void *vptr, Director *rtdir) { get_rtdir_map()[vptr] = rtdir; } SWIGINTERNINLINE Director *get_rtdir(void *vptr) { std::map::const_iterator pos = get_rtdir_map().find(vptr); Director *rtdir = (pos != get_rtdir_map().end()) ? pos->second : 0; return rtdir; } } # endif /* SWIG_DIRECTOR_RTDIR */ # define SWIG_DIRECTOR_CAST(ARG) Swig::get_rtdir(static_cast(ARG)) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) Swig::set_rtdir(static_cast(ARG1), ARG2) #else # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) # define SWIG_DIRECTOR_RGTR(ARG1, ARG2) #endif /* SWIG_DIRECTOR_NORTTI */ extern "C" { struct swig_type_info; } namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() {} virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem * operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; template struct GCArray_T : GCItem { GCArray_T(Type *ptr) : _ptr(ptr) { } virtual ~GCArray_T() { delete[] _ptr; } private: Type *_ptr; }; /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(PyObject *error, const char *hdr ="", const char *msg ="") : swig_msg(hdr) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (msg[0]) { swig_msg += " "; swig_msg += msg; } if (!PyErr_Occurred()) { PyErr_SetString(error, what()); } SWIG_PYTHON_THREAD_END_BLOCK; } virtual ~DirectorException() throw() { } /* Deprecated, use what() instead */ const char *getMessage() const { return what(); } const char *what() const throw() { return swig_msg.c_str(); } static void raise(PyObject *error, const char *msg) { throw DirectorException(error, msg); } static void raise(const char *msg) { raise(PyExc_RuntimeError, msg); } }; /* unknown exception handler */ class UnknownExceptionHandler { #ifdef SWIG_DIRECTOR_UEH static void handler() { try { throw; } catch (DirectorException& e) { std::cerr << "SWIG Director exception caught:" << std::endl << e.what() << std::endl; } catch (std::exception& e) { std::cerr << "std::exception caught: "<< e.what() << std::endl; } catch (...) { std::cerr << "Unknown exception caught." << std::endl; } std::cerr << std::endl << "Python interpreter traceback:" << std::endl; PyErr_Print(); std::cerr << std::endl; std::cerr << "This exception was caught by the SWIG unexpected exception handler." << std::endl << "Try using %feature(\"director:except\") to avoid reaching this point." << std::endl << std::endl << "Exception is being re-thrown, program will likely abort/terminate." << std::endl; throw; } public: std::unexpected_handler old; UnknownExceptionHandler(std::unexpected_handler nh = handler) { old = std::set_unexpected(nh); } ~UnknownExceptionHandler() { std::set_unexpected(old); } #endif }; /* type mismatch in the return value from a python method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(PyObject *error, const char *msg="") : DirectorException(error, "SWIG director type mismatch", msg) { } DirectorTypeMismatchException(const char *msg="") : DirectorException(PyExc_TypeError, "SWIG director type mismatch", msg) { } static void raise(PyObject *error, const char *msg) { throw DirectorTypeMismatchException(error, msg); } static void raise(const char *msg) { throw DirectorTypeMismatchException(msg); } }; /* any python exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException(const char *msg = "") : DirectorException(PyExc_RuntimeError, "SWIG director method error.", msg) { } static void raise(const char *msg) { throw DirectorMethodException(msg); } }; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg = "") : DirectorException(PyExc_RuntimeError, "SWIG director pure virtual method called", msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; #if defined(SWIG_PYTHON_THREADS) /* __THREAD__ is the old macro to activate some thread support */ # if !defined(__THREAD__) # define __THREAD__ 1 # endif #endif #ifdef __THREAD__ # include "pythread.h" class Guard { PyThread_type_lock &mutex_; public: Guard(PyThread_type_lock & mutex) : mutex_(mutex) { PyThread_acquire_lock(mutex_, WAIT_LOCK); } ~Guard() { PyThread_release_lock(mutex_); } }; # define SWIG_GUARD(mutex) Guard _guard(mutex) #else # define SWIG_GUARD(mutex) #endif /* director base class */ class Director { private: /* pointer to the wrapped python object */ PyObject *swig_self; /* flag indicating whether the object is owned by python or c++ */ mutable bool swig_disown_flag; /* decrement the reference count of the wrapped python object */ void swig_decref() const { if (swig_disown_flag) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_DECREF(swig_self); SWIG_PYTHON_THREAD_END_BLOCK; } } public: /* wrap a python object. */ Director(PyObject *self) : swig_self(self), swig_disown_flag(false) { } /* discard our reference at destruction */ virtual ~Director() { swig_decref(); } /* return a pointer to the wrapped python object */ PyObject *swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped python object (the sense of "disown" is from python) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; swig_incref(); } } /* increase the reference count of the wrapped python object */ void swig_incref() const { if (swig_disown_flag) { Py_INCREF(swig_self); } } /* methods to implement pseudo protected director members */ virtual bool swig_get_inner(const char * /* swig_protected_method_name */) const { return true; } virtual void swig_set_inner(const char * /* swig_protected_method_name */, bool /* swig_val */) const { } /* ownership management */ private: typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; #ifdef __THREAD__ static PyThread_type_lock swig_mutex_own; #endif public: template void swig_acquire_ownership_array(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCArray_T(vptr); } } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_T(vptr); } } void swig_acquire_ownership_obj(void *vptr, int own) const { if (vptr && own) { SWIG_GUARD(swig_mutex_own); swig_owner[vptr] = new GCItem_Object(own); } } int swig_release_ownership(void *vptr) const { int own = 0; if (vptr) { SWIG_GUARD(swig_mutex_own); swig_ownership_map::iterator iter = swig_owner.find(vptr); if (iter != swig_owner.end()) { own = iter->second->get_own(); swig_owner.erase(iter); } } return own; } template static PyObject *swig_pyobj_disown(PyObject *pyobj, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)pyobj; sobj->own = 0; Director *d = SWIG_DIRECTOR_CAST(reinterpret_cast(sobj->ptr)); if (d) d->swig_disown(); return PyWeakref_NewProxy(pyobj, NULL); } }; #ifdef __THREAD__ PyThread_type_lock Director::swig_mutex_own = PyThread_allocate_lock(); #endif } #endif swig-3.0.12/Lib/python/cpointer.i0000664000175000017500000000004113042756442016454 0ustar williamwilliam%include swig-3.0.12/Lib/python/wchar.i0000664000175000017500000000027213042756442015743 0ustar williamwilliam#ifdef __cplusplus %{ #include %} #else %{ #include %} #endif %types(wchar_t *); %include /* Enable swig wchar support. */ #define SWIG_WCHAR swig-3.0.12/Lib/python/std_shared_ptr.i0000664000175000017500000000010413042756442017636 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-3.0.12/Lib/python/std_multimap.i0000664000175000017500000000502213042756442017337 0ustar williamwilliam/* Multimaps */ %include %fragment("StdMultimapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::multimap *multimap) { typedef typename std::multimap::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::multimap multimap_type; static int asptr(PyObject *obj, std::multimap **val) { int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); return traits_asptr_stdseq, std::pair >::asptr(items, val); } else { multimap_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static PyObject *from(const multimap_type& multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new multimap_type(multimap), desc, SWIG_POINTER_OWN); } else { size_type size = multimap.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "multimap size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } } }; } } %define %swig_multimap_methods(Type...) %swig_map_common(Type); %extend { void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(Type::value_type(key,x)); } } %enddef %include swig-3.0.12/Lib/python/std_unordered_multiset.i0000664000175000017500000000263413042756442021432 0ustar williamwilliam/* Unordered Multisets */ %include %fragment("StdUnorderedMultisetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_multiset* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_reserve > { static void reserve(std::unordered_multiset &seq, typename std::unordered_multiset::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_multiset **m) { return traits_asptr_stdseq >::asptr(obj, m); } }; template struct traits_from > { static PyObject *from(const std::unordered_multiset& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_unordered_multiset_methods(Set...) %swig_set_methods(Set) %include swig-3.0.12/Lib/python/std_vector.i0000664000175000017500000000156613042756442017022 0ustar williamwilliam/* Vectors */ %fragment("StdVectorTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_reserve > { static void reserve(std::vector &seq, typename std::vector::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/python/Makefile.in0000664000175000017500000000656013042756442016540 0ustar williamwilliam# --------------------------------------------------------------- # SWIG Python Makefile # # This file can be used to build various Python extensions with SWIG. # By default this file is set up for dynamic loading, but it can # be easily customized for static extensions by modifying various # portions of the file. # # SRCS = C source files # CXXSRCS = C++ source files # OBJCSRCS = Objective-C source files # OBJS = Additional .o files (compiled previously) # INTERFACE = SWIG interface file # TARGET = Name of target module or executable # # Many portions of this file were created by the SWIG configure # script and should already reflect your machine. #---------------------------------------------------------------- SRCS = CXXSRCS = OBJCSRCS = OBJS = INTERFACE = WRAPFILE = $(INTERFACE:.i=_wrap.c) WRAPOBJ = $(INTERFACE:.i=_wrap.o) TARGET = module@SO@ # Use this kind of target for dynamic loading #TARGET = mypython # Use this target for static linking prefix = @prefix@ exec_prefix = @exec_prefix@ CC = @CC@ CXX = @CXX@ OBJC = @CC@ -Wno-import # -Wno-import needed for gcc CFLAGS = INCLUDES = LIBS = # SWIG Options # SWIG = location of the SWIG executable # SWIGOPT = SWIG compiler options # SWIGCC = Compiler used to compile the wrapper file SWIG = $(exec_prefix)/bin/swig SWIGOPT = -python SWIGCC = $(CC) # SWIG Library files. Uncomment if rebuilding the Python interpreter #SWIGLIBS = -lembed.i # Rules for creating .o files from source. COBJS = $(SRCS:.c=.o) CXXOBJS = $(CXXSRCS:.cxx=.o) OBJCOBJS = $(OBJCSRCS:.m=.o) ALLOBJS = $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(OBJS) # Command that will be used to build the final extension. BUILD = $(SWIGCC) # Uncomment the following if you are using dynamic loading CCSHARED = @CCSHARED@ BUILD = @LDSHARED@ # Uncomment the following if you are using dynamic loading with C++ and # need to provide additional link libraries (this is not always required). #DLL_LIBS = -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.5.1/2.7.2 \ -L/usr/local/lib -lg++ -lstdc++ -lgcc # Python installation PY_INCLUDE = -DHAVE_CONFIG_H @PYINCLUDE@ PY_LIB = @PYLIB@ # Build libraries (needed for static builds) LIBM = @LIBM@ LIBC = @LIBC@ SYSLIBS = $(LIBM) $(LIBC) @LIBS@ # Build options BUILD_LIBS = $(LIBS) # Dynamic loading # Compilation rules for non-SWIG components .SUFFIXES: .c .cxx .m .c.o: $(CC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< .cxx.o: $(CXX) $(CCSHARED) $(CXXFLAGS) $(INCLUDES) -c $< .m.o: $(OBJC) $(CCSHARED) $(CFLAGS) $(INCLUDES) -c $< # ---------------------------------------------------------------------- # Rules for building the extension # ---------------------------------------------------------------------- all: $(TARGET) # Convert the wrapper file into an object file $(WRAPOBJ) : $(WRAPFILE) $(SWIGCC) -c $(CCSHARED) $(CFLAGS) $(WRAPFILE) $(INCLUDES) $(PY_INCLUDE) $(WRAPFILE) : $(INTERFACE) $(SWIG) $(SWIGOPT) -o $(WRAPFILE) $(SWIGLIBS) $(INTERFACE) $(TARGET): $(WRAPOBJ) $(ALLOBJS) $(BUILD) $(WRAPOBJ) $(ALLOBJS) $(BUILD_LIBS) -o $(TARGET) clean: rm -f $(COBJS) $(CXXOBJS) $(OBJCOBJS) $(WRAPOBJ) $(WRAPFILE) $(TARGET) swig-3.0.12/Lib/python/pyruntime.swg0000664000175000017500000000143313042756442017243 0ustar williamwilliam%insert(runtime) %{ #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ # undef _DEBUG # include # define _DEBUG #else # include #endif %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "pyhead.swg"; /* Python includes and fixes */ %insert(runtime) "pyerrors.swg"; /* Python errors */ %insert(runtime) "pythreads.swg"; /* Python thread code */ %insert(runtime) "pyapi.swg"; /* Python API */ %insert(runtime) "pyrun.swg"; /* Python run-time code */ #if defined(SWIGPYTHON_BUILTIN) %insert(runtime) "builtin.swg"; /* Specialization for classes with single inheritance */ #endif swig-3.0.12/Lib/python/std_alloc.i0000664000175000017500000000003313042756442016576 0ustar williamwilliam%include swig-3.0.12/Lib/python/pyiterators.swg0000664000175000017500000002463213042756442017602 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pyiterators.swg * * Implement a python 'output' iterator for Python 2.2 or higher. * * Users can derive form the SwigPyIterator to implement their * own iterators. As an example (real one since we use it for STL/STD * containers), the template SwigPyIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("SwigPyIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct SwigPyIterator { private: SwigPtr_PyObject _seq; protected: SwigPyIterator(PyObject *seq) : _seq(seq) { } public: virtual ~SwigPyIterator() {} // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python virtual SwigPyIterator *decr(size_t /*n*/ = 1) { throw stop_iteration(); } // Random access iterator methods, but not required in Python virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } // C++ common/needed methods virtual SwigPyIterator *copy() const = 0; PyObject *next() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads PyObject *obj = value(); incr(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } /* Make an alias for Python 3.x */ PyObject *__next__() { return next(); } PyObject *previous() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads decr(); PyObject *obj = value(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } SwigPyIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const SwigPyIterator& x) const { return equal(x); } bool operator != (const SwigPyIterator& x) const { return ! operator==(x); } SwigPyIterator& operator += (ptrdiff_t n) { return *advance(n); } SwigPyIterator& operator -= (ptrdiff_t n) { return *advance(-n); } SwigPyIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } SwigPyIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const SwigPyIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::SwigPyIterator *"); init = 1; } return desc; } }; %#if defined(SWIGPYTHON_BUILTIN) inline PyObject* make_output_iterator_builtin (PyObject *pyself) { Py_INCREF(pyself); return pyself; } %#endif } } %fragment("SwigPyIterator_T","header",fragment="",fragment="SwigPyIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class SwigPyIterator_T : public SwigPyIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef SwigPyIterator_T self_type; SwigPyIterator_T(out_iterator curr, PyObject *seq) : SwigPyIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorOpen_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyIteratorOpen_T self_type; SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq) : SwigPyIterator_T(curr, seq) { } PyObject *value() const { return from(static_cast(*(base::current))); } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } SwigPyIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorClosed_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyIteratorClosed_T self_type; SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) : SwigPyIterator_T(curr, seq), begin(first), end(last) { } PyObject *value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } SwigPyIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { throw stop_iteration(); } else { --base::current; } } return this; } private: out_iterator begin; out_iterator end; }; template inline SwigPyIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { return new SwigPyIteratorClosed_T(current, begin, end, seq); } template inline SwigPyIterator* make_output_iterator(const OutIter& current, PyObject *seq = 0) { return new SwigPyIteratorOpen_T(current, seq); } } } %fragment("SwigPyIterator"); namespace swig { /* Throw a StopIteration exception */ %ignore stop_iteration; struct stop_iteration {}; %typemap(throws) stop_iteration { (void)$1; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } /* Mark methods that return new objects */ %newobject SwigPyIterator::copy; %newobject SwigPyIterator::operator + (ptrdiff_t n) const; %newobject SwigPyIterator::operator - (ptrdiff_t n) const; %nodirector SwigPyIterator; #if defined(SWIGPYTHON_BUILTIN) %feature("python:tp_iter") SwigPyIterator "&swig::make_output_iterator_builtin"; %feature("python:slot", "tp_iternext", functype="iternextfunc") SwigPyIterator::__next__; #else %extend SwigPyIterator { %pythoncode %{def __iter__(self): return self%} } #endif %catches(swig::stop_iteration) SwigPyIterator::value() const; %catches(swig::stop_iteration) SwigPyIterator::incr(size_t n = 1); %catches(swig::stop_iteration) SwigPyIterator::decr(size_t n = 1); %catches(std::invalid_argument) SwigPyIterator::distance(const SwigPyIterator &x) const; %catches(std::invalid_argument) SwigPyIterator::equal (const SwigPyIterator &x) const; %catches(swig::stop_iteration) SwigPyIterator::__next__(); %catches(swig::stop_iteration) SwigPyIterator::next(); %catches(swig::stop_iteration) SwigPyIterator::previous(); %catches(swig::stop_iteration) SwigPyIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) SwigPyIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) SwigPyIterator::operator - (ptrdiff_t n) const; struct SwigPyIterator { protected: SwigPyIterator(PyObject *seq); public: virtual ~SwigPyIterator(); // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python virtual SwigPyIterator *decr(size_t n = 1); // Random access iterator methods, but not required in Python virtual ptrdiff_t distance(const SwigPyIterator &x) const; virtual bool equal (const SwigPyIterator &x) const; // C++ common/needed methods virtual SwigPyIterator *copy() const = 0; PyObject *next(); PyObject *__next__(); PyObject *previous(); SwigPyIterator *advance(ptrdiff_t n); bool operator == (const SwigPyIterator& x) const; bool operator != (const SwigPyIterator& x) const; SwigPyIterator& operator += (ptrdiff_t n); SwigPyIterator& operator -= (ptrdiff_t n); SwigPyIterator* operator + (ptrdiff_t n) const; SwigPyIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const SwigPyIterator& x) const; }; } swig-3.0.12/Lib/python/cwstring.i0000664000175000017500000000007413042756442016477 0ustar williamwilliam%include %include swig-3.0.12/Lib/python/std_set.i0000664000175000017500000000272213042756442016306 0ustar williamwilliam/* Sets */ %fragment("StdSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::set* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr > { static int asptr(PyObject *obj, std::set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static PyObject *from(const std::set& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_set_methods(set...) %swig_sequence_iterator(set); %swig_container_methods(set); %extend { void append(value_type x) { self->insert(x); } bool __contains__(value_type x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void add(value_type x) { self->insert(x); } void discard(value_type x) { self->erase(x); } }; %enddef %include swig-3.0.12/Lib/python/defarg.swg0000664000175000017500000000220213042756442016432 0ustar williamwilliam/* This file defines an internal function for processing default arguments with proxy classes. There seems to be no straightforward way to write proxy functions involving default arguments. For example : def foo(arg1,arg2,*args): proxyc.foo(arg1,arg2,args) This fails because args is now a tuple and SWIG doesn't know what to do with it. This file allows a different approach : def foo(arg1,arg2,*args): proxyc.__call_defarg(proxyc.foo,(arg1,arg2,)+args) Basically, we form a new tuple from the object, call this special __call_defarg method and it passes control to the real wrapper function. An ugly hack, but it works. */ SWIGINTERN PyObject *swig_call_defargs(PyObject *self, PyObject *args) { PyObject *func; PyObject *parms; if (!PyArg_ParseTuple(args,"OO",&func,&parms)) return NULL; if (!PyCallable_Check(func)) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_TypeError, "__call_defarg : Need a callable object!"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } return PyEval_CallObject(func,parms); } swig-3.0.12/Lib/python/pytuplehlp.swg0000664000175000017500000000046413042756442017420 0ustar williamwilliam/* Helper function to return output types, now we need to use a list instead of a tuple since all the other types (std::pair,std::vector,std::list,etc) return tuples. */ #warning "Deprecated file: Don't use t_output_helper anymore," #warning "use SWIG_Python_AppendOutput or %append_output instead." swig-3.0.12/Lib/python/std_container.i0000664000175000017500000000007213042756442017471 0ustar williamwilliam%include %include swig-3.0.12/Lib/python/pyrun.swg0000664000175000017500000014760313042756442016376 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { #if PY_VERSION_HEX < 0x02030000 PyDict_SetItemString(d, (char *)name, obj); #else PyDict_SetItemString(d, name, obj); #endif Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { #if !defined(SWIG_PYTHON_OUTPUT_TUPLE) if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); PyList_SetItem(result, 0, o2); } PyList_Append(result,obj); Py_DECREF(obj); } return result; #else PyObject* o2; PyObject* o3; if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyTuple_Check(result)) { o2 = result; result = PyTuple_New(1); PyTuple_SET_ITEM(result, 0, o2); } o3 = PyTuple_New(1); PyTuple_SET_ITEM(o3, 0, obj); o2 = result; result = PySequence_Concat(o2, o3); Py_DECREF(o2); Py_DECREF(o3); } return result; #endif } /* Unpack the argument tuple */ SWIGINTERN Py_ssize_t SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { Py_ssize_t i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { Py_ssize_t i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } /* A functor is a function object with one single object argument */ #if PY_VERSION_HEX >= 0x02020000 #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); #else #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunction(functor, "O", obj); #endif /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* How to access Py_None */ #if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef SWIG_PYTHON_NO_BUILD_NONE # ifndef SWIG_PYTHON_BUILD_NONE # define SWIG_PYTHON_BUILD_NONE # endif # endif #endif #ifdef SWIG_PYTHON_BUILD_NONE # ifdef Py_None # undef Py_None # define Py_None SWIG_Py_None() # endif SWIGRUNTIMEINLINE PyObject * _SWIG_Py_None(void) { PyObject *none = Py_BuildValue((char*)""); Py_DECREF(none); return none; } SWIGRUNTIME PyObject * SWIG_Py_None(void) { static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None(); return none; } #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; return data ? data->implicitconv : 0; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; data->newargs = obj; Py_INCREF(obj); } else { #if (PY_VERSION_HEX < 0x02020000) data->newraw = 0; #else data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__"); #endif if (data->newraw) { Py_INCREF(data->newraw); data->newargs = PyTuple_New(1); PyTuple_SetItem(data->newargs, 0, obj); } else { data->newargs = obj; } Py_INCREF(data->newargs); } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { int flags; Py_INCREF(data->destroy); flags = PyCFunction_GET_FLAGS(data->destroy); #ifdef METH_O data->delargs = !(flags & (METH_O)); #else data->delargs = 0; #endif } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_INCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) { PyObject *ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } Py_DECREF(args); } } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * #ifdef METH_NOARGS SwigPyObject_repr(SwigPyObject *v) #else SwigPyObject_repr(SwigPyObject *v, PyObject *args) #endif { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); if (v->next) { # ifdef METH_NOARGS PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); # else PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args); # endif # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } return repr; } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; /* PyObject_CallFunction() has the potential to silently drop the active active exception. In cases of unnamed temporary variable or where we just finished iterating over a generator StopIteration will be active right now, and this needs to remain true upon return from SwigPyObject_dealloc. So save and restore. */ PyObject *val = NULL, *type = NULL, *tb = NULL; PyErr_Fetch(&val, &type, &tb); if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); res = SWIG_Python_CallFunctor(destroy, tmp); Py_DECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } if (!res) PyErr_WriteUnraisable(destroy); PyErr_Restore(val, type, tb); Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif } Py_XDECREF(next); PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; #ifndef METH_O PyObject *tmp = 0; if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL; next = tmp; #endif if (!SwigPyObject_Check(next)) { PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* #ifdef METH_NOARGS SwigPyObject_next(PyObject* v) #else SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_disown(PyObject *v) #else SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* #ifdef METH_NOARGS SwigPyObject_acquire(PyObject *v) #else SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) #endif { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; #if (PY_VERSION_HEX < 0x02020000) if (!PyArg_ParseTuple(args,(char *)"|O:own",&val)) #elif (PY_VERSION_HEX < 0x02050000) if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) #else if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) #endif { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { #ifdef METH_NOARGS if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v); } else { SwigPyObject_disown(v); } #else if (PyObject_IsTrue(val)) { SwigPyObject_acquire(v,args); } else { SwigPyObject_disown(v,args); } #endif } return obj; } } #ifdef METH_O static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_NOARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_O, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_NOARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_NOARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #else static PyMethodDef swigobject_methods[] = { {(char *)"disown", (PyCFunction)SwigPyObject_disown, METH_VARARGS, (char *)"releases ownership of the pointer"}, {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS, (char *)"acquires ownership of the pointer"}, {(char *)"own", (PyCFunction)SwigPyObject_own, METH_VARARGS, (char *)"returns/sets ownership of the pointer"}, {(char *)"append", (PyCFunction)SwigPyObject_append, METH_VARARGS, (char *)"appends another 'this' object"}, {(char *)"next", (PyCFunction)SwigPyObject_next, METH_VARARGS, (char *)"returns the next 'this' object"}, {(char *)"__repr__",(PyCFunction)SwigPyObject_repr, METH_VARARGS, (char *)"returns object representation"}, {0, 0, 0, 0} }; #endif #if PY_VERSION_HEX < 0x02020000 SWIGINTERN PyObject * SwigPyObject_getattr(SwigPyObject *sobj,char *name) { return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name); } #endif SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03050000 /* 3.5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */ #elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */ #elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */ 0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ 0, /* tp_print */ #if PY_VERSION_HEX < 0x02020000 (getattrfunc)SwigPyObject_getattr, /* tp_getattr */ #else (getattrfunc)0, /* tp_getattr */ #endif (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpyobject_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpyobject_type) < 0) return NULL; #endif } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME int SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags)) { char result[SWIG_BUFFER_SIZE]; fputs("pack, v->size, 0, sizeof(result))) { fputs("at ", fp); fputs(result, fp); } fputs(v->ty->name,fp); fputs(">", fp); return 0; } SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif (char *)"SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ (printfunc)SwigPyPacked_print, /* tp_print */ (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ #if PY_VERSION_HEX >= 0x02020000 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #endif #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 swigpypacked_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpypacked_type) < 0) return NULL; #endif } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIMEINLINE PyObject * _SWIG_This(void) { return SWIG_Python_str_FromChar("this"); } static PyObject *swig_this = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (swig_this == NULL) swig_this = _SWIG_This(); return swig_this; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000)) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } res = SWIG_OK; } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; if (ty) { swig_cast_info *tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } } else { *ptr = vptr; } return SWIG_OK; } } /* Convert a packed value value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { #if (PY_VERSION_HEX >= 0x02020000) PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; PyDict_SetItem(dict, SWIG_This(), swig_this); } } #else PyObject *key = SWIG_This(); PyObject_SetAttr(inst, key, swig_this); #endif } } else { #if PY_VERSION_HEX >= 0x03000000 inst = ((PyTypeObject*) data->newargs)->tp_new((PyTypeObject*) data->newargs, Py_None, Py_None); if (inst) { PyObject_SetAttr(inst, SWIG_This(), swig_this); Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG; } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; #else #if (PY_VERSION_HEX >= 0x02010000) PyObject *inst = 0; PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } return (PyObject *) inst; #else PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type); if (inst == NULL) { return NULL; } inst->in_class = (PyClassObject *)data->newargs; Py_INCREF(inst->in_class); inst->in_dict = PyDict_New(); if (inst->in_dict == NULL) { Py_DECREF(inst); return NULL; } #ifdef Py_TPFLAGS_HAVE_WEAKREFS inst->in_weakreflist = NULL; #endif #ifdef Py_TPFLAGS_GC PyObject_GC_Init(inst); #endif PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this); return (PyObject *) inst; #endif #endif } SWIGRUNTIME void SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { PyObject *dict; #if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } PyDict_SetItem(dict, SWIG_This(), swig_this); return; } #endif dict = PyObject_GetAttrString(inst, (char*)"__dict__"); PyDict_SetItem(dict, SWIG_This(), swig_this); Py_DECREF(dict); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { SwigPyObject_append((PyObject*) sthis, obj[1]); } else { SWIG_Python_SetSwigThis(obj[0], obj[1]); } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { #ifdef SWIG_LINK_RUNTIME type_pointer = SWIG_ReturnGlobalTypeList((void *)0); #else # ifdef SWIGPY_USE_CAPSULE type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); # else type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME); # endif if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif } return (swig_module_info *) type_pointer; } #if PY_MAJOR_VERSION < 2 /* PyModule_AddObject function was introduced in Python 2.0. The following function is copied out of Python/modsupport.c in python version 2.3.4 */ SWIGINTERN int PyModule_AddObject(PyObject *m, char *name, PyObject *o) { PyObject *dict; if (!PyModule_Check(m)) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs module as first arg"); return SWIG_ERROR; } if (!o) { PyErr_SetString(PyExc_TypeError, "PyModule_AddObject() needs non-NULL value"); return SWIG_ERROR; } dict = PyModule_GetDict(m); if (dict == NULL) { /* Internal error -- modules must have a dict! */ PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__", PyModule_GetName(m)); return SWIG_ERROR; } if (PyDict_SetItemString(dict, name, o)) return SWIG_ERROR; Py_DECREF(o); return SWIG_OK; } #endif SWIGRUNTIME void #ifdef SWIGPY_USE_CAPSULE SWIG_Python_DestroyModule(PyObject *obj) #else SWIG_Python_DestroyModule(void *vptr) #endif { #ifdef SWIGPY_USE_CAPSULE swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); #else swig_module_info *swig_module = (swig_module_info *) vptr; #endif swig_type_info **types = swig_module->types; size_t i; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); swig_this = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a dummy module object into sys.modules */ PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif #ifdef SWIGPY_USE_CAPSULE PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #else PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule); if (pointer && module) { PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer); } else { Py_XDECREF(pointer); } #endif } /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New(); return cache; } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { #ifdef SWIGPY_USE_CAPSULE descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); #else descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj); #endif } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { #ifdef SWIGPY_USE_CAPSULE obj = PyCapsule_New((void*) descriptor, NULL, NULL); #else obj = PyCObject_FromVoidPtr(descriptor, NULL); #endif PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str)); } else { PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); } SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); SWIG_Python_str_DelForPy3(cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); #if SWIG_POINTER_EXCEPTION if (flags) { SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj); SWIG_Python_ArgFail(argnum); } #endif } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) < 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif swig-3.0.12/Lib/python/std_carray.i0000664000175000017500000000305713042756442016776 0ustar williamwilliam%include %fragment("StdCarrayTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::carray **array) { return traits_asptr_stdseq >::asptr(obj, array); } }; } } %warnfilter(SWIGWARN_IGNORE_OPERATOR_INDEX) std::carray::operator[]; %extend std::carray { %fragment(SWIG_Traits_frag(std::carray<_Type, _Size >), "header", fragment="SwigPyIterator_T", fragment=SWIG_Traits_frag(_Type), fragment="StdCarrayTraits") { namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::carray<" #_Type "," #_Size " >"; } }; } } %typemaps_asptr(SWIG_TYPECHECK_VECTOR, swig::asptr, SWIG_Traits_frag(std::carray<_Type, _Size >), std::carray<_Type, _Size >); %typemap(out,noblock=1) iterator, const_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator((const $type &)$1), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } inline size_t __len__() const { return self->size(); } inline const _Type& __getitem__(size_t i) const { return (*self)[i]; } inline void __setitem__(size_t i, const _Type& v) { (*self)[i] = v; } swig::SwigPyIterator* __iter__(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %include swig-3.0.12/Lib/python/cni.i0000664000175000017500000000005213042756442015404 0ustar williamwilliam%include %include swig-3.0.12/Lib/python/ccomplex.i0000664000175000017500000000137313042756442016454 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-3.0.12/Lib/python/python.swg0000664000175000017500000000376313042756442016540 0ustar williamwilliam/* ------------------------------------------------------------ * python.swg * * Python configuration module. * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Inner macros * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The runtime part * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Special user directives * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Typemap specializations * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Overloaded operator support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * Warnings for Python keywords * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python autodoc support * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python classes, for C++ * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * The Python initialization function * ------------------------------------------------------------ */ %include /* ------------------------------------------------------------ * For backward compatibility * ------------------------------------------------------------ */ %include swig-3.0.12/Lib/python/std_wstring.i0000664000175000017500000000007713042756442017211 0ustar williamwilliam%include %include swig-3.0.12/Lib/python/file.i0000664000175000017500000000201313042756442015551 0ustar williamwilliam/* ----------------------------------------------------------------------------- * file.i * * Typemaps for FILE* * ----------------------------------------------------------------------------- */ %types(FILE *); /* defining basic methods */ %fragment("SWIG_AsValFilePtr","header") { SWIGINTERN int SWIG_AsValFilePtr(PyObject *obj, FILE **val) { static swig_type_info* desc = 0; void *vptr = 0; if (!desc) desc = SWIG_TypeQuery("FILE *"); if ((SWIG_ConvertPtr(obj, &vptr, desc, 0)) == SWIG_OK) { if (val) *val = (FILE *)vptr; return SWIG_OK; } %#if PY_VERSION_HEX < 0x03000000 if (PyFile_Check(obj)) { if (val) *val = PyFile_AsFile(obj); return SWIG_OK; } %#endif return SWIG_TypeError; } } %fragment("SWIG_AsFilePtr","header",fragment="SWIG_AsValFilePtr") { SWIGINTERNINLINE FILE* SWIG_AsFilePtr(PyObject *obj) { FILE *val = 0; SWIG_AsValFilePtr(obj, &val); return val; } } /* defining the typemaps */ %typemaps_asval(%checkcode(POINTER), SWIG_AsValFilePtr, "SWIG_AsValFilePtr", FILE*); swig-3.0.12/Lib/python/std_unordered_map.i0000664000175000017500000002071513042756442020341 0ustar williamwilliam/* Unordered Maps */ %fragment("StdMapTraits","header",fragment="StdSequenceTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_map *unordered_map) { typedef typename std::unordered_map::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { unordered_map->insert(value_type(it->first, it->second)); } } template struct traits_reserve > { static void reserve(std::unordered_map &seq, typename std::unordered_map::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { typedef std::unordered_map unordered_map_type; static int asptr(PyObject *obj, unordered_map_type **val) { int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method return a dict_items object */ items = PySequence_Fast(items, ".items() havn't returned a sequence!"); %#endif res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { unordered_map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_map unordered_map_type; typedef typename unordered_map_type::const_iterator const_iterator; typedef typename unordered_map_type::size_type size_type; static PyObject *from(const unordered_map_type& unordered_map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new unordered_map_type(unordered_map), desc, SWIG_POINTER_OWN); } else { size_type size = unordered_map.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= unordered_map.begin(); i!= unordered_map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } } }; template struct from_key_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct SwigPyMapIterator_T : SwigPyIteratorClosed_T { SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyIteratorClosed_T(curr, first, last, seq) { } }; template > struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T { SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapKeyIterator_T(current, begin, end, seq); } template > struct SwigPyMapValueITerator_T : SwigPyMapIterator_T { SwigPyMapValueITerator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapValueITerator_T(current, begin, end, seq); } } } %define %swig_unordered_map_common(Map...) %swig_sequence_iterator(Map); %swig_container_methods(Map) %extend { mapped_type __getitem__(const key_type& key) const throw (std::out_of_range) { Map::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __delitem__(const key_type& key) throw (std::out_of_range) { Map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } PyObject* keys() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } return keyList; } PyObject* values() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } return valList; } PyObject* items() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } return itemList; } // Python 2.2 methods bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) { return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject value_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) { return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %pythoncode %{def __iter__(self): return self.key_iterator()%} %pythoncode %{def iterkeys(self): return self.key_iterator()%} %pythoncode %{def itervalues(self): return self.value_iterator()%} %pythoncode %{def iteritems(self): return self.iterator()%} } %enddef %define %swig_unordered_map_methods(Map...) %swig_unordered_map_common(Map) %extend { void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } } %enddef %include swig-3.0.12/Lib/python/pywstrings.swg0000664000175000017500000000406113042756442017440 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for wchar_t strings * ------------------------------------------------------------ */ %{ #if PY_VERSION_HEX >= 0x03020000 # define SWIGPY_UNICODE_ARG(obj) ((PyObject*) (obj)) #else # define SWIGPY_UNICODE_ARG(obj) ((PyUnicodeObject*) (obj)) #endif %} %fragment("SWIG_AsWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor") { SWIGINTERN int SWIG_AsWCharPtrAndSize(PyObject *obj, wchar_t **cptr, size_t *psize, int *alloc) { PyObject *tmp = 0; int isunicode = PyUnicode_Check(obj); %#if PY_VERSION_HEX < 0x03000000 && !defined(SWIG_PYTHON_STRICT_UNICODE_WCHAR) if (!isunicode && PyString_Check(obj)) { obj = tmp = PyUnicode_FromObject(obj); isunicode = 1; } %#endif if (isunicode) { Py_ssize_t len = PyUnicode_GetSize(obj); if (cptr) { *cptr = %new_array(len + 1, wchar_t); PyUnicode_AsWideChar(SWIGPY_UNICODE_ARG(obj), *cptr, len); (*cptr)[len] = 0; } if (psize) *psize = (size_t) len + 1; if (alloc) *alloc = cptr ? SWIG_NEWOBJ : 0; Py_XDECREF(tmp); return SWIG_OK; } else { swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); if (pwchar_descriptor) { void * vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pwchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (wchar_t *)vptr; if (psize) *psize = vptr ? (wcslen((wchar_t *)vptr) + 1) : 0; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromWCharPtrAndSize","header",fragment="",fragment="SWIG_pwchar_descriptor") { SWIGINTERNINLINE PyObject * SWIG_FromWCharPtrAndSize(const wchar_t * carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pwchar_descriptor = SWIG_pwchar_descriptor(); return pwchar_descriptor ? SWIG_InternalNewPointerObj(%const_cast(carray,wchar_t *), pwchar_descriptor, 0) : SWIG_Py_Void(); } else { return PyUnicode_FromWideChar(carray, %numeric_cast(size, Py_ssize_t)); } } else { return SWIG_Py_Void(); } } } swig-3.0.12/Lib/python/std_sstream.i0000664000175000017500000000003513042756442017164 0ustar williamwilliam%include swig-3.0.12/Lib/python/std_unordered_multimap.i0000664000175000017500000000605313042756442021413 0ustar williamwilliam/* Unordered Multimaps */ %include %fragment("StdUnorderedMultimapTraits","header",fragment="StdSequenceTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_multimap *unordered_multimap) { typedef typename std::unordered_multimap::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { unordered_multimap->insert(value_type(it->first, it->second)); } } template struct traits_reserve > { static void reserve(std::unordered_multimap &seq, typename std::unordered_multimap::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { typedef std::unordered_multimap unordered_multimap_type; static int asptr(PyObject *obj, std::unordered_multimap **val) { int res = SWIG_ERROR; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); return traits_asptr_stdseq, std::pair >::asptr(items, val); } else { unordered_multimap_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::unordered_multimap unordered_multimap_type; typedef typename unordered_multimap_type::const_iterator const_iterator; typedef typename unordered_multimap_type::size_type size_type; static PyObject *from(const unordered_multimap_type& unordered_multimap) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new unordered_multimap_type(unordered_multimap), desc, SWIG_POINTER_OWN); } else { size_type size = unordered_multimap.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_OverflowError, "unordered_multimap size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= unordered_multimap.begin(); i!= unordered_multimap.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } return obj; } } }; } } %define %swig_unordered_multimap_methods(Type...) %swig_map_common(Type); %extend { void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { self->insert(Type::value_type(key,x)); } } %enddef %include swig-3.0.12/Lib/python/attribute.i0000664000175000017500000000004213042756442016635 0ustar williamwilliam%include swig-3.0.12/Lib/python/pyclasses.swg0000664000175000017500000000662213042756442017222 0ustar williamwilliam#ifdef __cplusplus /* SwigPtr_PyObject is used as a replacement of PyObject *, where the INCREF/DECREF are applied as needed. You can use SwigPtr_PyObject in a container, such as std::vector; or as a member variable: struct A { SwigPtr_PyObject obj; A(PyObject *o) : _obj(o) { } }; or as a input/output value SwigPtr_PyObject func(SwigPtr_PyObject obj) { SwigPtr_PyObject out = PyString_FromFormat("hello %s", PyObject_AsString(obj)); Py_DECREF(out); return out; } just remember to pair the object creation with the proper DECREF, the same as with plain PyObject *ptr, since SwigPtr_PyObject always add one reference at construction. SwigPtr_PyObject is 'visible' at the wrapped side, so you can do: %template(pyvector) std::vector; and all the proper typemaps will be used. */ namespace swig { %ignore SwigPtr_PyObject; struct SwigPtr_PyObject {}; %apply PyObject * {SwigPtr_PyObject}; %apply PyObject * const& {SwigPtr_PyObject const&}; %typemap(typecheck,precedence=SWIG_TYPECHECK_SWIGOBJECT,noblock=1) SwigPtr_PyObject const& "$1 = ($input != 0);"; /* For output */ %typemap(out,noblock=1) SwigPtr_PyObject { $result = (PyObject *)$1; Py_INCREF($result); } %typemap(out,noblock=1) SwigPtr_PyObject const & { $result = (PyObject *)*$1; Py_INCREF($result); } } %{ namespace swig { class SwigPtr_PyObject { protected: PyObject *_obj; public: SwigPtr_PyObject() :_obj(0) { } SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) { if (initial_ref) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } } SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(item._obj); Py_XDECREF(_obj); _obj = item._obj; SWIG_PYTHON_THREAD_END_BLOCK; return *this; } ~SwigPtr_PyObject() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XDECREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } operator PyObject *() const { return _obj; } PyObject *operator->() const { return _obj; } }; } %} /* SwigVar_PyObject is used to manage 'in the scope' PyObject * variables, as in int func () { SwigVar_PyObject obj = PyString_FromString("hello"); } ie, 'obj' is created and destructed in the same scope from a python object that carries at least one reference value. SwigVar_PyObject just take care of applying the proper Py_DECREF. Hence, this class is purely internal and not visible at the wrapped side. */ namespace swig { %ignore SwigVar_PyObject; struct SwigVar_PyObject {}; %apply PyObject * {SwigVar_PyObject}; %apply PyObject * const& {SwigVar_PyObject const&}; } %{ namespace swig { struct SwigVar_PyObject : SwigPtr_PyObject { SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } SwigVar_PyObject & operator = (PyObject* obj) { Py_XDECREF(_obj); _obj = obj; return *this; } }; } %} #endif swig-3.0.12/Lib/python/std_unordered_set.i0000664000175000017500000000326713042756442020362 0ustar williamwilliam/* Unordered Sets */ %fragment("StdUnorderedSetTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::unordered_set* seq) { // seq->insert(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_reserve > { static void reserve(std::unordered_set &seq, typename std::unordered_set::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::unordered_set **s) { return traits_asptr_stdseq >::asptr(obj, s); } }; template struct traits_from > { static PyObject *from(const std::unordered_set& vec) { return traits_from_stdseq >::from(vec); } }; } %} %define %swig_unordered_set_methods(unordered_set...) %swig_sequence_iterator(unordered_set); %swig_container_methods(unordered_set); %extend { void append(value_type x) { self->insert(x); } bool __contains__(value_type x) { return self->find(x) != self->end(); } value_type __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } }; %enddef %include swig-3.0.12/Lib/python/cmalloc.i0000664000175000017500000000004013042756442016242 0ustar williamwilliam%include swig-3.0.12/Lib/python/pyerrors.swg0000664000175000017500000000312213042756442017071 0ustar williamwilliam/* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { char *tmp; PyObject *old_str = PyObject_Str(value); PyErr_Clear(); Py_XINCREF(type); PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg); SWIG_Python_str_DelForPy3(tmp); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } swig-3.0.12/Lib/python/std_basic_string.i0000664000175000017500000000540113042756442020157 0ustar williamwilliam#if !defined(SWIG_STD_STRING) #define SWIG_STD_BASIC_STRING %include #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(PyObject* obj, std::string **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::string *vptr; if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { PyErr_Clear(); char* buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } else { PyErr_Clear(); } if (val) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_TypeError,"a string is expected"); SWIG_PYTHON_THREAD_END_BLOCK; } return 0; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } } %include %typemaps_asptrfromn(%checkcode(STRING), std::basic_string); #endif #if !defined(SWIG_STD_WSTRING) %fragment(SWIG_AsPtr_frag(std::basic_string),"header", fragment="SWIG_AsWCharPtrAndSize") { SWIGINTERN int SWIG_AsPtr(std::basic_string)(PyObject* obj, std::wstring **val) { static swig_type_info* string_info = SWIG_TypeQuery("std::basic_string *"); std::wstring *vptr; if (SWIG_ConvertPtr(obj, (void**)&vptr, string_info, 0) == SWIG_OK) { if (val) *val = vptr; return SWIG_OLDOBJ; } else { PyErr_Clear(); wchar_t *buf = 0 ; size_t size = 0; int alloc = 0; if (SWIG_AsWCharPtrAndSize(obj, &buf, &size, &alloc) == SWIG_OK) { if (buf) { if (val) *val = new std::wstring(buf, size - 1); if (alloc == SWIG_NEWOBJ) %delete_array(buf); return SWIG_NEWOBJ; } } else { PyErr_Clear(); } if (val) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(PyExc_TypeError,"a wstring is expected"); SWIG_PYTHON_THREAD_END_BLOCK; } return 0; } } } %fragment(SWIG_From_frag(std::basic_string),"header", fragment="SWIG_FromWCharPtrAndSize") { SWIGINTERNINLINE PyObject* SWIG_From(std::basic_string)(const std::wstring& s) { return SWIG_FromWCharPtrAndSize(s.data(), s.size()); } } %typemaps_asptrfromn(%checkcode(UNISTRING), std::basic_string); #endif swig-3.0.12/Lib/python/pycontainer.swg0000664000175000017500000007206213042756442017550 0ustar williamwilliam/* ----------------------------------------------------------------------------- * pycontainer.swg * * Python sequence <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Python, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include #if PY_VERSION_HEX >= 0x03020000 # define SWIGPY_SLICE_ARG(obj) ((PyObject*) (obj)) #else # define SWIGPY_SLICE_ARG(obj) ((PySliceObject*) (obj)) #endif %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif %include /**** The PySequence C++ Wrap ***/ %fragment(""); %include %fragment(SWIG_Traits_frag(swig::SwigPtr_PyObject),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "SwigPtr_PyObject"; } }; template <> struct traits_from { typedef SwigPtr_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast(val); Py_XINCREF(obj); return obj; } }; template <> struct traits_check { static bool check(SwigPtr_PyObject) { return true; } }; template <> struct traits_asval { typedef SwigPtr_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment(SWIG_Traits_frag(swig::SwigVar_PyObject),"header",fragment="StdTraits") { namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "SwigVar_PyObject"; } }; template <> struct traits_from { typedef SwigVar_PyObject value_type; static PyObject *from(const value_type& val) { PyObject *obj = static_cast(val); Py_XINCREF(obj); return obj; } }; template <> struct traits_check { static bool check(SwigVar_PyObject) { return true; } }; template <> struct traits_asval { typedef SwigVar_PyObject value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; } } %fragment("SwigPySequence_Base","header",fragment="") { %#include namespace std { template <> struct less { bool operator()(PyObject * v, PyObject *w) const { bool res; SWIG_PYTHON_THREAD_BEGIN_BLOCK; res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false; /* This may fall into a case of inconsistent eg. ObjA > ObjX > ObjB but ObjA < ObjB */ if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) ) { /* Objects can't be compared, this mostly occurred in Python 3.0 */ /* Compare their ptr directly for a workaround */ res = (v < w); PyErr_Clear(); } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template <> struct less { bool operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const { return std::less()(v, w); } }; template <> struct less { bool operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const { return std::less()(v, w); } }; } namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "PyObject *"; } }; template <> struct traits_asval { typedef PyObject * value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; template <> struct traits_check { static bool check(PyObject *) { return true; } }; template <> struct traits_from { typedef PyObject * value_type; static PyObject *from(const value_type& val) { Py_XINCREF(val); return val; } }; } namespace swig { template inline size_t check_index(Difference i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } template void slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) { if (step == 0) { throw std::invalid_argument("slice step cannot be zero"); } else if (step > 0) { // Required range: 0 <= i < size, 0 <= j < size, i <= j if (i < 0) { ii = 0; } else if (i < (Difference)size) { ii = i; } else if (insert && (i >= (Difference)size)) { ii = (Difference)size; } if (j < 0) { jj = 0; } else { jj = (j < (Difference)size) ? j : (Difference)size; } if (jj < ii) jj = ii; } else { // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j if (i < -1) { ii = -1; } else if (i < (Difference) size) { ii = i; } else if (i >= (Difference)(size-1)) { ii = (Difference)(size-1); } if (j < -1) { jj = -1; } else { jj = (j < (Difference)size ) ? j : (Difference)(size-1); } if (ii < jj) ii = jj; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void erase(Sequence* seq, const typename Sequence::iterator& position) { seq->erase(position); } template struct traits_reserve { static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) { // This should be specialized for types that support reserve } }; template inline Sequence* getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj); if (step > 0) { typename Sequence::const_iterator sb = self->begin(); typename Sequence::const_iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); if (step == 1) { return new Sequence(sb, se); } else { Sequence *sequence = new Sequence(); swig::traits_reserve::reserve(*sequence, (jj - ii + step - 1) / step); typename Sequence::const_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c::reserve(*sequence, (ii - jj - step - 1) / -step); typename Sequence::const_reverse_iterator sb = self->rbegin(); typename Sequence::const_reverse_iterator se = self->rbegin(); std::advance(sb,size-ii-1); std::advance(se,size-jj-1); typename Sequence::const_reverse_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c<-step && it!=se; ++c) it++; } return sequence; } } template inline void setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { if (step == 1) { size_t ssize = jj - ii; if (ssize <= is.size()) { // expanding/staying the same size swig::traits_reserve::reserve(*self, self->size() - ssize + is.size()); typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator isit = is.begin(); std::advance(sb,ii); std::advance(isit, jj - ii); self->insert(std::copy(is.begin(), isit, sb), isit, is.end()); } else { // shrinking typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); sb = self->begin(); std::advance(sb,ii); self->insert(sb, is.begin(), is.end()); } } else { size_t replacecount = (jj - ii + step - 1) / step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::iterator it = self->begin(); std::advance(it,ii); for (size_t rc=0; rcend(); ++c) it++; } } } else { size_t replacecount = (ii - jj - step - 1) / -step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::reverse_iterator it = self->rbegin(); std::advance(it,size-ii-1); for (size_t rc=0; rcrend(); ++c) it++; } } } template inline void delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { typename Sequence::iterator sb = self->begin(); std::advance(sb,ii); if (step == 1) { typename Sequence::iterator se = self->begin(); std::advance(se,jj); self->erase(sb,se); } else { typename Sequence::iterator it = sb; size_t delcount = (jj - ii + step - 1) / step; while (delcount) { it = self->erase(it); for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) it++; delcount--; } } } else { typename Sequence::reverse_iterator sb = self->rbegin(); std::advance(sb,size-ii-1); typename Sequence::reverse_iterator it = sb; size_t delcount = (ii - jj - step - 1) / -step; while (delcount) { it = typename Sequence::reverse_iterator(self->erase((++it).base())); for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) it++; delcount--; } } } } } %fragment("SwigPySequence_Cont","header", fragment="StdTraits", fragment="SwigPySequence_Base", fragment="SwigPyIterator_T") { namespace swig { template struct SwigPySequence_Ref { SwigPySequence_Ref(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } operator T () const { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index); try { return swig::as(item, true); } catch (std::exception& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", (int)_index); if (!PyErr_Occurred()) { ::%type_error(swig::type_name()); } SWIG_Python_AddErrorMsg(msg); SWIG_Python_AddErrorMsg(e.what()); throw; } } SwigPySequence_Ref& operator=(const T& v) { PySequence_SetItem(_seq, _index, swig::from(v)); return *this; } private: PyObject* _seq; Py_ssize_t _index; }; template struct SwigPySequence_ArrowProxy { SwigPySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct SwigPySequence_InputIterator { typedef SwigPySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; SwigPySequence_InputIterator() { } SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } SwigPySequence_ArrowProxy operator->() const { return SwigPySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: PyObject* _seq; difference_type _index; }; // STL container wrapper around a Python sequence template struct SwigPySequence_Cont { typedef SwigPySequence_Ref reference; typedef const SwigPySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; typedef size_t size_type; typedef const pointer const_pointer; typedef SwigPySequence_InputIterator iterator; typedef SwigPySequence_InputIterator const_iterator; SwigPySequence_Cont(PyObject* seq) : _seq(0) { if (!PySequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); } _seq = seq; Py_INCREF(_seq); } ~SwigPySequence_Cont() { Py_XDECREF(_seq); } size_type size() const { return static_cast(PySequence_Size(_seq)); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check(bool set_err = true) const { Py_ssize_t s = size(); for (Py_ssize_t i = 0; i < s; ++i) { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); if (!swig::check(item)) { if (set_err) { char msg[1024]; sprintf(msg, "in sequence element %d", (int)i); SWIG_Error(SWIG_RuntimeError, msg); } return false; } } return true; } private: PyObject* _seq; }; } } %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { $result = SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); } %typemap(out,noblock=1,fragment="SwigPySequence_Cont") std::pair, std::pair { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).second), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); } %fragment("SwigPyPairBoolOutputIterator","header",fragment=SWIG_From_frag(bool),fragment="SwigPySequence_Cont") {} %typemap(out,noblock=1,fragment="SwigPyPairBoolOutputIterator") std::pair, std::pair { $result = PyTuple_New(2); PyTuple_SetItem($result,0,SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &).first), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN)); PyTuple_SetItem($result,1,SWIG_From(bool)(%static_cast($1,const $type &).second)); } %typemap(in,noblock=1,fragment="SwigPySequence_Cont") iterator(swig::SwigPyIterator *iter = 0, int res), reverse_iterator(swig::SwigPyIterator *iter = 0, int res), const_iterator(swig::SwigPyIterator *iter = 0, int res), const_reverse_iterator(swig::SwigPyIterator *iter = 0, int res) { res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::SwigPyIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SwigPySequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr($input, %as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("SwigPySequence_Cont"); %newobject iterator(PyObject **PYTHON_SELF); %extend { swig::SwigPyIterator* iterator(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "tp_iter", functype="getiterfunc") iterator; #else %pythoncode %{def __iter__(self): return self.iterator()%} #endif } #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef /**** The python container methods ****/ %define %swig_container_methods(Container...) /* deprecated in Python 2 */ #if 1 %newobject __getslice__; #endif %newobject __getitem__(PySliceObject *slice); #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "nb_nonzero", functype="inquiry") __nonzero__; %feature("python:slot", "sq_length", functype="lenfunc") __len__; #endif // SWIGPYTHON_BUILTIN %extend { bool __nonzero__() const { return !(self->empty()); } /* Alias for Python 3 compatibility */ bool __bool__() const { return !(self->empty()); } size_type __len__() const { return self->size(); } } %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %fragment("SwigPySequence_Base"); #if defined(SWIGPYTHON_BUILTIN) //%feature("python:slot", "sq_item", functype="ssizeargfunc") __getitem__; //%feature("python:slot", "sq_slice", functype="ssizessizeargfunc") __getslice__; //%feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") __setitem__; //%feature("python:slot", "sq_ass_slice", functype="ssizessizeobjargproc") __setslice__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif // SWIGPYTHON_BUILTIN %extend { /* typemap for slice object support */ %typemap(in) PySliceObject* { if (!PySlice_Check($input)) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } $1 = (PySliceObject *) $input; } %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER) PySliceObject* { $1 = PySlice_Check($input); } /* deprecated in Python 2 */ #if 1 Sequence* __getslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { return swig::getslice(self, i, j, 1); } void __setslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, 1, Sequence()); } void __setslice__(difference_type i, difference_type j, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { swig::setslice(self, i, j, 1, v); } void __delslice__(difference_type i, difference_type j) throw (std::out_of_range, std::invalid_argument) { swig::delslice(self, i, j, 1); } #endif void __delitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } /* Overloaded methods for Python 3 compatibility * (Also useful in Python 2.x) */ Sequence* __getitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; return swig::getslice(self, id, jd, step); } void __setitem__(PySliceObject *slice, const Sequence& v) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::setslice(self, id, jd, step, v); } void __setitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::delslice(self, id, jd, step); } void __delitem__(PySliceObject *slice) throw (std::out_of_range, std::invalid_argument) { Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(SWIGPY_SLICE_ARG(slice), (Py_ssize_t)self->size(), &i, &j, &step); Sequence::difference_type id = i; Sequence::difference_type jd = j; swig::delslice(self, id, jd, step); } } %enddef %define %swig_sequence_methods_non_resizable(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { const value_type& __getitem__(difference_type i) const throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, const value_type& x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } #if defined(SWIGPYTHON_BUILTIN) // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } #endif } %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_non_resizable(%arg(Sequence)) %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } void append(const value_type& x) { self->push_back(x); } } %enddef %define %swig_sequence_methods_non_resizable_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %extend { value_type __getitem__(difference_type i) throw (std::out_of_range) { return *(swig::cgetpos(self, i)); } void __setitem__(difference_type i, value_type x) throw (std::out_of_range) { *(swig::getpos(self,i)) = x; } #if defined(SWIGPYTHON_BUILTIN) // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(difference_type i) throw (std::out_of_range, std::invalid_argument) { swig::erase(self, swig::getpos(self, i)); } #endif } %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_non_resizable_val(%arg(Sequence)) %extend { value_type pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty container"); Sequence::value_type x = self->back(); self->pop_back(); return x; } void append(value_type x) { self->push_back(x); } } %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="SwigPySequence_Cont") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, Seq* seq) { // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(PyObject *obj, sequence **seq) { if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(::SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } else if (PySequence_Check(obj)) { try { SwigPySequence_Cont swigpyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(swigpyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return swigpyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq) { if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, e.what()); } } return SWIG_ERROR; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static PyObject *from(const sequence& seq) { %#ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } %#endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { PyObject *obj = PyTuple_New((Py_ssize_t)size); Py_ssize_t i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { PyTuple_SetItem(obj,i,swig::from(*it)); } return obj; } else { PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python"); return NULL; } } }; } } swig-3.0.12/Lib/python/pyuserdir.swg0000664000175000017500000001426613042756442017245 0ustar williamwilliam/* ------------------------------------------------------------------------- * Special user directives * ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */ /* shadow code */ #define %shadow %insert("shadow") #define %pythoncode %insert("python") #define %pythonbegin %insert("pythonbegin") /* ------------------------------------------------------------------------- */ /* Use the "nondynamic" feature to make a wrapped class behave as a "nondynamic" one, ie, a python class that doesn't dynamically add new attributes. For example, for the class %pythonnondynamic A; struct A { int a; int b; }; you will get: aa = A() aa.a = 1 # Ok aa.b = 1 # Ok aa.c = 3 # error Since nondynamic is a feature, if you use it like %pythonnondynamic; it will make all the wrapped classes nondynamic ones. The implementation is based on this recipe: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252158 and works for modern (-modern) and plain python. We do not use __slots__, so, it works with old python versions. */ #define %pythonnondynamic %feature("python:nondynamic", "1") #define %nopythonnondynamic %feature("python:nondynamic", "0") #define %clearpythonnondynamic %feature("python:nondynamic", "") #define %pythondynamic %nopythonnondynamic /* ------------------------------------------------------------------------- */ /* Use %pythonmaybecall to flag a method like __add__ or __radd__. These don't produce an error when called, they just return NotImplemented. These methods "may be called" if needed. */ #define %pythonmaybecall %feature("python:maybecall", "1") #define %nopythonmaybecall %feature("python:maybecall", "0") #define %clearpythonmaybecall %feature("python:maybecall", "") /* ------------------------------------------------------------------------- */ /* The %pythoncallback feature produce a more natural callback wrapper than the %callback mechanism, ie, it uses the original name for the callback and callable objects. Just use it as %pythoncallback(1) foo; int foo(int a); %pythoncallback(1) A::foo; struct A { static int foo(int a); }; int bar(int, int (*pf)(int)); then, you can use it as: a = foo(1) b = bar(2, foo) c = A.foo(3) d = bar(4, A.foo) If you use it with a member method %pythoncallback(1) A::foom; struct A { int foom(int a); }; then you can use it as r = a.foom(3) # eval the method mptr = A.foom_cb_ptr # returns the callback pointer where the '_cb_ptr' suffix is added for the callback pointer. */ #define %pythoncallback %feature("python:callback") #define %nopythoncallback %feature("python:callback","0") #define %clearpythoncallback %feature("python:callback","") /* ------------------------------------------------------------------------- */ /* Support for the old %callback directive name */ #ifdef %callback #undef %callback #endif #ifdef %nocallback #undef %nocallback #endif #ifdef %clearcallback #undef %clearcallback #endif #define %callback(x) %feature("python:callback",`x`) #define %nocallback %nopythoncallback #define %clearcallback %clearpythoncallback /* ------------------------------------------------------------------------- */ /* Thread support - Advance control */ #define %nothread %feature("nothread") #define %thread %feature("nothread","0") #define %clearnothread %feature("nothread","") #define %nothreadblock %feature("nothreadblock") #define %threadblock %feature("nothreadblock","0") #define %clearnothreadblock %feature("nothreadblock","") #define %nothreadallow %feature("nothreadallow") #define %threadallow %feature("nothreadallow","0") #define %clearnothreadallow %feature("nothreadallow","") /* ------------------------------------------------------------------------- */ /* Implicit Conversion using the C++ constructor mechanism */ #define %implicitconv %feature("implicitconv") #define %noimplicitconv %feature("implicitconv", "0") #define %clearimplicitconv %feature("implicitconv", "") /* ------------------------------------------------------------------------- */ /* Enable keywords paramaters */ #define %kwargs %feature("kwargs") #define %nokwargs %feature("kwargs", "0") #define %clearkwargs %feature("kwargs", "") /* ------------------------------------------------------------------------- */ /* Add python code to the proxy/shadow code %pythonprepend - Add code before the C++ function is called %pythonappend - Add code after the C++ function is called */ #define %pythonprepend %feature("pythonprepend") #define %clearpythonprepend %feature("pythonprepend","") #define %pythonappend %feature("pythonappend") #define %clearpythonappend %feature("pythonappend","") /* ------------------------------------------------------------------------- */ /* %extend_smart_pointer extend the smart pointer support. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. */ %define %extend_smart_pointer(Type...) %implicitconv Type; %apply const SWIGTYPE& SMARTPOINTER { const Type& }; %apply SWIGTYPE SMARTPOINTER { Type }; %enddef swig-3.0.12/Lib/python/argcargv.i0000664000175000017500000000512213042756442016432 0ustar williamwilliam/* ------------------------------------------------------------ * --- Argc & Argv --- * ------------------------------------------------------------ */ %fragment("SWIG_AsArgcArgv","header",fragment="SWIG_AsCharPtrAndSize") { SWIGINTERN int SWIG_AsArgcArgv(PyObject *input, swig_type_info *ppchar_info, size_t *argc, char ***argv, int *owner) { void *vptr; int res = SWIG_ConvertPtr(input, &vptr, ppchar_info, 0); if (!SWIG_IsOK(res)) { int list = 0; PyErr_Clear(); list = PyList_Check(input); if (list || PyTuple_Check(input)) { size_t i = 0; size_t size = list ? PyList_Size(input) : PyTuple_Size(input); if (argc) *argc = size; if (argv) { *argv = %new_array(size + 1, char*); for (; i < size; ++i) { PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); char *cptr = 0; size_t sz = 0; int alloc = 0; res = SWIG_AsCharPtrAndSize(obj, &cptr, &sz, &alloc); if (SWIG_IsOK(res)) { if (cptr && sz) { (*argv)[i] = (alloc == SWIG_NEWOBJ) ? cptr : %new_copy_array(cptr, sz, char); } else { (*argv)[i] = 0; } } else { return SWIG_TypeError; } } (*argv)[i] = 0; if (owner) *owner = 1; } else { for (; i < size; ++i) { PyObject *obj = list ? PyList_GetItem(input,i) : PyTuple_GetItem(input,i); res = SWIG_AsCharPtrAndSize(obj, 0, 0, 0); if (!SWIG_IsOK(res)) return SWIG_TypeError; } if (owner) *owner = 0; } return SWIG_OK; } else { return SWIG_TypeError; } } else { /* seems dangerous, but the user asked for it... */ size_t i = 0; if (argv) { while (*argv[i] != 0) ++i;} if (argc) *argc = i; if (owner) *owner = 0; return SWIG_OK; } } } /* This typemap works with either a char **, a python list or a python tuple */ %typemap(in,noblock=0,fragment="SWIG_AsArgcArgv") (int ARGC, char **ARGV) (int res,char **argv = 0, size_t argc = 0, int owner= 0) { res = SWIG_AsArgcArgv($input, $descriptor(char**), &argc, &argv, &owner); if (!SWIG_IsOK(res)) { $1 = 0; $2 = 0; %argument_fail(SWIG_TypeError, "int ARGC, char **ARGV", $symname, $argnum); } else { $1 = %static_cast(argc,$1_ltype); $2 = %static_cast(argv, $2_ltype); } } %typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { int res = SWIG_AsArgcArgv($input, $descriptor(char**), 0, 0, 0); $1 = SWIG_IsOK(res); } %typemap(freearg,noblock=1) (int ARGC, char **ARGV) { if (owner$argnum) { size_t i = argc$argnum; while (i) { %delete_array(argv$argnum[--i]); } %delete_array(argv$argnum); } } swig-3.0.12/Lib/python/implicit.i0000664000175000017500000000043713042756442016454 0ustar williamwilliam%include %include #warning "This file provides the %implicit directive, which is an old and fragile" #warning "way to implement the C++ implicit conversion mechanism." #warning "Try using the more robust '%implicitconv Type;' directive instead." swig-3.0.12/Lib/python/std_streambuf.i0000664000175000017500000000003713042756442017500 0ustar williamwilliam%include swig-3.0.12/Lib/python/std_common.i0000664000175000017500000000441713042756442017006 0ustar williamwilliam%include %include /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. */ %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static PyObject *from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static PyObject *from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-3.0.12/Lib/python/std_wstreambuf.i0000664000175000017500000000004013042756442017661 0ustar williamwilliam%include swig-3.0.12/Lib/python/pytypemaps.swg0000664000175000017500000000621013042756442017420 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Python * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ #ifdef SWIG_PYTHON_LEGACY_BOOL // Default prior to SWIG 3.0.0 #undef SWIG_TYPECHECK_BOOL %define SWIG_TYPECHECK_BOOL 10000 %enddef #endif /* Include fundamental fragment definitions */ %include /* Look for user fragments file. */ %include /* Python fragments for fundamental types */ %include /* Python fragments for char* strings */ %include /* Backward compatibility output helper */ %fragment("t_output_helper","header") %{ #define t_output_helper SWIG_Python_AppendOutput %} /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* directors are supported in Python */ #ifndef SWIG_DIRECTOR_TYPEMAPS #define SWIG_DIRECTOR_TYPEMAPS #endif /* Python types */ #define SWIG_Object PyObject * #define VOID_Object SWIG_Py_Void() /* Python allows implicit conversion */ #define %implicitconv_flag $implicitconv /* Overload of the output/constant/exception/dirout handling */ /* append output */ #define SWIG_AppendOutput(result, obj) SWIG_Python_AppendOutput(result, obj) /* set constant */ #if defined(SWIGPYTHON_BUILTIN) #define SWIG_SetConstant(name, obj) SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, name,obj) #else #define SWIG_SetConstant(name, obj) SWIG_Python_SetConstant(d, name,obj) #endif /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_Python_Raise(obj, type, desc) /* Include the unified typemap library */ %include /* ------------------------------------------------------------ * Python extra typemaps / typemap overrides * ------------------------------------------------------------ */ /* Get the address of the 'python self' object */ %typemap(in,numinputs=0,noblock=1) PyObject **PYTHON_SELF { $1 = &$self; } /* Consttab, needed for callbacks, it should be removed later */ %typemap(consttab) SWIGTYPE ((*)(ANY)) { SWIG_PY_POINTER, (char*)"$symname", 0, 0, (void *)($value), &$descriptor } %typemap(consttab) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); %typemap(constcode) SWIGTYPE ((*)(ANY)) ""; %typemap(constcode) SWIGTYPE ((* const)(ANY)) = SWIGTYPE ((*)(ANY)); /* Smart Pointers */ %typemap(out,noblock=1) const SWIGTYPE & SMARTPOINTER { $result = SWIG_NewPointerObj(%new_copy(*$1, $*ltype), $descriptor, SWIG_POINTER_OWN | %newpointer_flags); } %typemap(ret,noblock=1) const SWIGTYPE & SMARTPOINTER, SWIGTYPE SMARTPOINTER { if ($result) { PyObject *robj = PyObject_CallMethod($result, (char *)"__deref__", NULL); if (robj && !PyErr_Occurred()) { SwigPyObject_append((PyObject *) SWIG_Python_GetSwigThis($result), (PyObject *) SWIG_Python_GetSwigThis(robj)); Py_DECREF(robj); } } } swig-3.0.12/Lib/python/std_wsstream.i0000664000175000017500000000003613042756442017354 0ustar williamwilliam%include swig-3.0.12/Lib/python/std_except.i0000664000175000017500000000004313042756442016775 0ustar williamwilliam%include swig-3.0.12/Lib/python/complex.i0000664000175000017500000000012013042756442016276 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-3.0.12/Lib/python/jstring.i0000664000175000017500000000333713042756442016324 0ustar williamwilliam%include %fragment(SWIG_AsVal_frag(jstring),"header") { SWIGINTERN int SWIG_AsVal(jstring)(PyObject *obj, jstring *val) { if (obj == Py_None) { if (val) *val = 0; return SWIG_OK; } PyObject *tmp = 0; int isunicode = PyUnicode_Check(obj); if (!isunicode && PyString_Check(obj)) { if (val) { obj = tmp = PyUnicode_FromObject(obj); } isunicode = 1; } if (isunicode) { if (val) { if (sizeof(Py_UNICODE) == sizeof(jchar)) { *val = JvNewString((const jchar *) PyUnicode_AS_UNICODE(obj),PyUnicode_GET_SIZE(obj)); return SWIG_NEWOBJ; } else { int len = PyUnicode_GET_SIZE(obj); Py_UNICODE *pchars = PyUnicode_AS_UNICODE(obj); *val = JvAllocString (len); jchar *jchars = JvGetStringChars (*val); for (int i = 0; i < len; ++i) { jchars[i] = pchars[i]; } return SWIG_NEWOBJ; } } Py_XDECREF(tmp); return SWIG_OK; } return SWIG_TypeError; } } %fragment(SWIG_From_frag(jstring),"header") { SWIGINTERNINLINE PyObject * SWIG_From(jstring)(jstring val) { if (!val) { return SWIG_Py_Void(); } if (sizeof(Py_UNICODE) == sizeof(jchar)) { return PyUnicode_FromUnicode((const Py_UNICODE *) JvGetStringChars(val), JvGetStringUTFLength(val)); } else { int len = JvGetStringUTFLength(val); Py_UNICODE pchars[len]; jchar *jchars = JvGetStringChars(val); for (int i = 0; i < len; i++) { pchars[i] = jchars[i]; } return PyUnicode_FromUnicode((const Py_UNICODE *) pchars, len); } } } %typemaps_asvalfrom(%checkcode(STRING), %arg(SWIG_AsVal(jstring)), %arg(SWIG_From(jstring)), %arg(SWIG_AsVal_frag(jstring)), %arg(SWIG_From_frag(jstring)), java::lang::String *); swig-3.0.12/Lib/python/pybackward.swg0000664000175000017500000000221213042756442017332 0ustar williamwilliam/* adding backward compatibility macros */ #define SWIG_arg(x...) %arg(x) #define SWIG_Mangle(x...) %mangle(x) #define SWIG_As_frag(Type...) %fragment_name(As, Type) #define SWIG_As_name(Type...) %symbol_name(As, Type) #define SWIG_As(Type...) SWIG_As_name(Type) SWIG_AS_CALL_ARGS #define SWIG_Check_frag(Type...) %fragment_name(Check, Type) #define SWIG_Check_name(Type...) %symbol_name(Check, Type) #define SWIG_Check(Type...) SWIG_Check_name(Type) SWIG_AS_CALL_ARGS %define %ascheck_methods(Code, Type...) %fragment(SWIG_As_frag(Type),"header", fragment=SWIG_AsVal_frag(Type)) { SWIGINTERNINLINE Type SWIG_As(Type)(PyObject* obj) { Type v; int res = SWIG_AsVal(Type)(obj, &v); if (!SWIG_IsOK(res)) { /* this is needed to make valgrind/purify happier. */ memset((void*)&v, 0, sizeof(Type)); SWIG_Error(res, ""); } return v; } } %fragment(SWIG_Check_frag(Type),"header",fragment=SWIG_AsVal_frag(Type)) { SWIGINTERNINLINE int SWIG_Check(Type)(PyObject* obj) { int res = SWIG_AsVal(Type)(obj, (Type*)0); return SWIG_IsOK(res); } } %enddef %apply_checkctypes(%ascheck_methods) swig-3.0.12/Lib/python/typemaps.i0000664000175000017500000001054513042756442016505 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-3.0.12/Lib/python/pyprimtypes.swg0000664000175000017500000001760613042756442017625 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(bool)(bool value) { return PyBool_FromLong(value ? 1 : 0); } } #ifdef SWIG_PYTHON_LEGACY_BOOL // Default prior to SWIG 3.0.0 %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(PyObject *obj, bool *val) { int r = PyObject_IsTrue(obj); if (r == -1) return SWIG_ERROR; if (val) *val = r ? true : false; return SWIG_OK; } } #else %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(PyObject *obj, bool *val) { int r; if (!PyBool_Check(obj)) return SWIG_ERROR; r = PyObject_IsTrue(obj); if (r == -1) return SWIG_ERROR; if (val) *val = r ? true : false; return SWIG_OK; } } #endif /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(int)(int value) { return PyInt_FromLong((long) value); } } /* unsigned int */ %fragment(SWIG_From_frag(unsigned int),"header") { SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned int)(unsigned int value) { return PyInt_FromSize_t((size_t) value); } } /* long */ %fragment(SWIG_From_frag(long),"header") { %define_as(SWIG_From_dec(long), PyInt_FromLong) } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(PyObject *obj, long* val) { %#if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else %#endif if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } %#endif return SWIG_TypeError; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val) { %#if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else %#endif if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } %#endif return SWIG_TypeError; } } /* long long */ %fragment(SWIG_From_frag(long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_dec(long long)(long long value) { return ((value < LONG_MIN) || (value > LONG_MAX)) ? PyLong_FromLongLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(PyObject *obj, long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { long long v = PyLong_AsLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { long v; res = SWIG_AsVal(long)(obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } %#ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; res = SWIG_AsVal(double)(obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, mant_min, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } %#endif return res; } %#endif } /* unsigned long long */ %fragment(SWIG_From_frag(unsigned long long),"header", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(PyObject *obj, unsigned long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { unsigned long long v = PyLong_AsUnsignedLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { unsigned long v; res = SWIG_AsVal(unsigned long)(obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } %#ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; double d; res = SWIG_AsVal(double)(obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } %#endif return res; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { %define_as(SWIG_From_dec(double), PyFloat_FromDouble) } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; %#if PY_VERSION_HEX < 0x03000000 } else if (PyInt_Check(obj)) { if (val) *val = (double) PyInt_AsLong(obj); return SWIG_OK; %#endif } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } %#ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } %#endif return res; } } swig-3.0.12/Lib/python/pyopers.swg0000664000175000017500000002375713042756442016725 0ustar williamwilliam/* ------------------------------------------------------------ * Overloaded operator support The directives in this file apply whether or not you use the -builtin option to SWIG, but operator overloads are particularly attractive when using -builtin, because they are much faster than named methods. If you're using the -builtin option to SWIG, and you want to define python operator overloads beyond the defaults defined in this file, here's what you need to know: There are two ways to define a python slot function: dispatch to a statically defined function; or dispatch to a method defined on the operand. To dispatch to a statically defined function, use %feature("python:"), where is the name of a field in a PyTypeObject, PyNumberMethods, PyMappingMethods, PySequenceMethods, or PyBufferProcs. For example: %feature("python:tp_hash") MyClass "myHashFunc"; class MyClass { public: ... }; %{ // Note: Py_hash_t was introduced in Python 3.2 static Py_hash_t myHashFunc(PyObject *pyobj) { MyClass *cobj; // Convert pyobj to cobj return (cobj->field1 * (cobj->field2 << 7)); } %} NOTE: It is the responsibility of the programmer (that's you) to ensure that a statically defined slot function has the correct signature. If, instead, you want to dispatch to an instance method, you can use %feature("python:slot"). For example: %feature("python:slot", "tp_hash", functype="hashfunc") MyClass::myHashFunc; class MyClass { public: Py_hash_t myHashFunc () const; ... }; NOTE: Some python slots use a method signature which does not match the signature of SWIG-wrapped methods. For those slots, SWIG will automatically generate a "closure" function to re-marshall the arguments before dispatching to the wrapped method. Setting the "functype" attribute of the feature enables SWIG to generate a correct closure function. -------------------------------------------------------------- The tp_richcompare slot is a special case: SWIG automatically generates a rich compare function for all wrapped types. If a type defines C++ operator overloads for comparison (operator==, operator<, etc.), they will be called from the generated rich compare function. If you want to explicitly choose a method to handle a certain comparison operation, you may use a different feature, %feature("python:compare") like this: %feature("python:compare", "Py_LT") MyClass::lessThan; class MyClass { public: bool lessThan(const MyClass& other) const; ... }; ... where "Py_LT" is one of the rich comparison opcodes defined in the python header file object.h. If there's no method defined to handle a particular comparison operation, the default behavior is to compare pointer values of the wrapped C++ objects. -------------------------------------------------------------- For more information about python slots, including their names and signatures, you may refer to the python documentation : http://docs.python.org/c-api/typeobj.html * ------------------------------------------------------------ */ #ifdef __cplusplus #if defined(SWIGPYTHON_BUILTIN) #define %pybinoperator(pyname,oper,functp,slt) %rename(pyname) oper; %pythonmaybecall oper; %feature("python:slot", #slt, functype=#functp) oper; %feature("python:slot", #slt, functype=#functp) pyname; #define %pycompare(pyname,oper,comptype) %rename(pyname) oper; %pythonmaybecall oper; %feature("python:compare", #comptype) oper; %feature("python:compare", #comptype) pyname; #else #define %pybinoperator(pyname,oper,functp,slt) %rename(pyname) oper; %pythonmaybecall oper #define %pycompare(pyname,oper,comptype) %pybinoperator(pyname,oper,,comptype) #endif %pybinoperator(__add__, *::operator+, binaryfunc, nb_add); %pybinoperator(__pos__, *::operator+(), unaryfunc, nb_positive); %pybinoperator(__pos__, *::operator+() const, unaryfunc, nb_positive); %pybinoperator(__sub__, *::operator-, binaryfunc, nb_subtract); %pybinoperator(__neg__, *::operator-(), unaryfunc, nb_negative); %pybinoperator(__neg__, *::operator-() const, unaryfunc, nb_negative); %pybinoperator(__mul__, *::operator*, binaryfunc, nb_multiply); %pybinoperator(__mod__, *::operator%, binaryfunc, nb_remainder); %pybinoperator(__lshift__, *::operator<<, binaryfunc, nb_lshift); %pybinoperator(__rshift__, *::operator>>, binaryfunc, nb_rshift); %pybinoperator(__and__, *::operator&, binaryfunc, nb_and); %pybinoperator(__or__, *::operator|, binaryfunc, nb_or); %pybinoperator(__xor__, *::operator^, binaryfunc, nb_xor); %pycompare(__lt__, *::operator<, Py_LT); %pycompare(__le__, *::operator<=, Py_LE); %pycompare(__gt__, *::operator>, Py_GT); %pycompare(__ge__, *::operator>=, Py_GE); %pycompare(__eq__, *::operator==, Py_EQ); %pycompare(__ne__, *::operator!=, Py_NE); /* Special cases */ %rename(__invert__) *::operator~; %feature("python:slot", "nb_invert", functype="unaryfunc") *::operator~; %rename(__call__) *::operator(); %feature("python:slot", "tp_call", functype="ternarycallfunc") *::operator(); #if defined(SWIGPYTHON_BUILTIN) %pybinoperator(__nonzero__, *::operator bool, inquiry, nb_nonzero); %pybinoperator(__truediv__, *::operator/ , binaryfunc, nb_divide); #else %feature("shadow") *::operator bool %{ def __nonzero__(self): return $action(self) __bool__ = __nonzero__ %}; %rename(__nonzero__) *::operator bool; %feature("shadow") *::operator/ %{ def __truediv__(self, *args): return $action(self, *args) __div__ = __truediv__ %}; %rename(__truediv__) *::operator/; %pythonmaybecall *::operator/; #endif /* Ignored operators */ %ignoreoperator(LNOT) operator!; %ignoreoperator(LAND) operator&&; %ignoreoperator(LOR) operator||; %ignoreoperator(EQ) *::operator=; %ignoreoperator(PLUSPLUS) *::operator++; %ignoreoperator(MINUSMINUS) *::operator--; %ignoreoperator(ARROWSTAR) *::operator->*; %ignoreoperator(INDEX) *::operator[]; /* Inplace operator declarations. They translate the inplace C++ operators (+=, -=, ...) into the corresponding python equivalents(__iadd__,__isub__), etc, disabling the ownership of the input 'this' pointer, and assigning it to the returning object: %feature("del") *::Operator; // disables ownership by generating SWIG_POINTER_DISOWN %feature("new") *::Operator; // claims ownership by generating SWIG_POINTER_OWN This makes the most common case safe, ie: A& A::operator+=(int i) { ...; return *this; } ^^^^ ^^^^^^ will work fine, even when the resulting python object shares the 'this' pointer with the input one. The input object is usually deleted after the operation, including the shared 'this' pointer, producing 'strange' seg faults, as reported by Lucriz (lucriz@sitilandia.it). If you have an interface that already takes care of that, ie, you already are using inplace operators and you are not getting seg. faults, with the new scheme you could end with 'free' elements that never get deleted (maybe, not sure, it depends). But if that is the case, you could recover the old behaviour using %feature("del","0") A::operator+=; %feature("new","0") A::operator+=; which recovers the old behaviour for the class 'A', or if you are 100% sure your entire system works fine in the old way, use: %feature("del","") *::operator+=; %feature("new","") *::operator+=; The default behaviour assumes that the 'this' pointer's memory is already owned by the SWIG object; it relinquishes ownership then takes it back. This may not be the case though as the SWIG object might be owned by memory managed elsewhere, eg after calling a function that returns a C++ reference. In such case you will need to use the features above to recover the old behaviour too. */ #if defined(SWIGPYTHON_BUILTIN) #define %pyinplaceoper(SwigPyOper, Oper, functp, slt) %delobject Oper; %newobject Oper; %feature("python:slot", #slt, functype=#functp) Oper; %rename(SwigPyOper) Oper #else #define %pyinplaceoper(SwigPyOper, Oper, functp, slt) %delobject Oper; %newobject Oper; %rename(SwigPyOper) Oper #endif %pyinplaceoper(__iadd__ , *::operator +=, binaryfunc, nb_inplace_add); %pyinplaceoper(__isub__ , *::operator -=, binaryfunc, nb_inplace_subtract); %pyinplaceoper(__imul__ , *::operator *=, binaryfunc, nb_inplace_multiply); %pyinplaceoper(__imod__ , *::operator %=, binaryfunc, nb_inplace_remainder); %pyinplaceoper(__iand__ , *::operator &=, binaryfunc, nb_inplace_and); %pyinplaceoper(__ior__ , *::operator |=, binaryfunc, nb_inplace_or); %pyinplaceoper(__ixor__ , *::operator ^=, binaryfunc, nb_inplace_xor); %pyinplaceoper(__ilshift__, *::operator <<=, binaryfunc, nb_inplace_lshift); %pyinplaceoper(__irshift__, *::operator >>=, binaryfunc, nb_inplace_rshift); /* Special cases */ #if defined(SWIGPYTHON_BUILTIN) %pyinplaceoper(__itruediv__ , *::operator /=, binaryfunc, nb_inplace_divide); #else %delobject *::operator /=; %newobject *::operator /=; %feature("shadow") *::operator /= %{ def __itruediv__(self, *args): return $action(self, *args) __idiv__ = __itruediv__ %}; %rename(__itruediv__) *::operator /=; #endif /* Finally, in python we need to mark the binary operations to fail as 'maybecall' methods */ #define %pybinopermaybecall(oper) %pythonmaybecall __ ## oper ## __; %pythonmaybecall __r ## oper ## __ %pybinopermaybecall(add); %pybinopermaybecall(pos); %pybinopermaybecall(pos); %pybinopermaybecall(sub); %pybinopermaybecall(neg); %pybinopermaybecall(neg); %pybinopermaybecall(mul); %pybinopermaybecall(div); %pybinopermaybecall(truediv); %pybinopermaybecall(mod); %pybinopermaybecall(lshift); %pybinopermaybecall(rshift); %pybinopermaybecall(and); %pybinopermaybecall(or); %pybinopermaybecall(xor); %pybinopermaybecall(lt); %pybinopermaybecall(le); %pybinopermaybecall(gt); %pybinopermaybecall(ge); %pybinopermaybecall(eq); %pybinopermaybecall(ne); #endif swig-3.0.12/Lib/python/std_array.i0000664000175000017500000000715513042756442016636 0ustar williamwilliam/* std::array */ %fragment("StdArrayTraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(PyObject *obj, std::array **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::array& vec) { return traits_from_stdseq >::from(vec); } }; template inline void assign(const SwigPySeq& swigpyseq, std::array* seq) { if (swigpyseq.size() < seq->size()) throw std::invalid_argument("std::array cannot be expanded in size"); else if (swigpyseq.size() > seq->size()) throw std::invalid_argument("std::array cannot be reduced in size"); std::copy(swigpyseq.begin(), swigpyseq.end(), seq->begin()); } template inline void erase(std::array* SWIGUNUSEDPARM(seq), const typename std::array::iterator& SWIGUNUSEDPARM(position)) { throw std::invalid_argument("std::array object does not support item deletion"); } // Only limited slicing is supported as std::array is fixed in size template inline std::array* getslice(const std::array* self, Difference i, Difference j, Py_ssize_t step) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj); if (step == 1 && ii == 0 && static_cast(jj) == size) { Sequence *sequence = new Sequence(); std::copy(self->begin(), self->end(), sequence->begin()); return sequence; } else if (step == -1 && static_cast(ii) == (size - 1) && jj == -1) { Sequence *sequence = new Sequence(); std::copy(self->rbegin(), self->rend(), sequence->begin()); return sequence; } else { throw std::invalid_argument("std::array object only supports getting a slice that is the size of the array"); } } template inline void setslice(std::array* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { typedef std::array Sequence; typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step == 1 && ii == 0 && static_cast(jj) == size) { std::copy(is.begin(), is.end(), self->begin()); } else if (step == -1 && static_cast(ii) == (size - 1) && jj == -1) { std::copy(is.rbegin(), is.rend(), self->begin()); } else { throw std::invalid_argument("std::array object only supports setting a slice that is the size of the array"); } } template inline void delslice(std::array* SWIGUNUSEDPARM(self), Difference SWIGUNUSEDPARM(i), Difference SWIGUNUSEDPARM(j), Py_ssize_t SWIGUNUSEDPARM(step)) { throw std::invalid_argument("std::array object does not support item deletion"); } } %} #define %swig_array_methods(Type...) %swig_sequence_methods_non_resizable(Type) #define %swig_array_methods_val(Type...) %swig_sequence_methods_non_resizable_val(Type); %include swig-3.0.12/Lib/python/embed.i0000664000175000017500000000474213042756442015721 0ustar williamwilliam// // embed.i // SWIG file embedding the Python interpreter in something else. // This file is deprecated and no longer actively maintained, but it still // seems to work with Python 2.7. Status with Python 3 is unknown. // // This file makes it possible to extend Python and all of its // built-in functions without having to hack its setup script. // #ifdef AUTODOC %subsection "embed.i" %text %{ This module provides support for building a new version of the Python executable. This will be necessary on systems that do not support shared libraries and may be necessary with C++ extensions. This file contains everything you need to build a new version of Python from include files and libraries normally installed with the Python language. This module will automatically grab all of the Python modules present in your current Python executable (including any special purpose modules you have enabled such as Tkinter). Thus, you may need to provide additional link libraries when compiling. As far as I know, this module is C++ safe. %} #endif %wrapper %{ #include #ifdef __cplusplus extern "C" #endif void SWIG_init(); /* Forward reference */ #define _PyImport_Inittab swig_inittab /* Grab Python's inittab[] structure */ #ifdef __cplusplus extern "C" { #endif #include #undef _PyImport_Inittab /* Now define our own version of it. Hopefully someone does not have more than 1000 built-in modules */ struct _inittab SWIG_Import_Inittab[1000]; static int swig_num_modules = 0; /* Function for adding modules to Python */ static void swig_add_module(char *name, void (*initfunc)()) { SWIG_Import_Inittab[swig_num_modules].name = name; SWIG_Import_Inittab[swig_num_modules].initfunc = initfunc; swig_num_modules++; SWIG_Import_Inittab[swig_num_modules].name = (char *) 0; SWIG_Import_Inittab[swig_num_modules].initfunc = 0; } /* Function to add all of Python's built-in modules to our interpreter */ static void swig_add_builtin() { int i = 0; while (swig_inittab[i].name) { swig_add_module(swig_inittab[i].name, swig_inittab[i].initfunc); i++; } #ifdef SWIGMODINIT SWIGMODINIT #endif /* Add SWIG builtin function */ swig_add_module(SWIG_name, SWIG_init); } #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif extern int Py_Main(int, char **); #ifdef __cplusplus } #endif extern struct _inittab *PyImport_Inittab; int main(int argc, char **argv) { swig_add_builtin(); PyImport_Inittab = SWIG_Import_Inittab; return Py_Main(argc,argv); } %} swig-3.0.12/Lib/python/carrays.i0000664000175000017500000000052213042756442016301 0ustar williamwilliam%define %array_class(TYPE,NAME) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "sq_item", functype="ssizeargfunc") NAME::__getitem__; %feature("python:slot", "sq_ass_item", functype="ssizeobjargproc") NAME::__setitem__; #endif %array_class_wrap(TYPE,NAME,__getitem__,__setitem__) %enddef %include swig-3.0.12/Lib/python/pystdcommon.swg0000664000175000017500000001567613042756442017601 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static PyObject *from(Type *val, int owner = 0) { return SWIG_InternalNewPointerObj(val, type_info(), owner); } }; template struct traits_from { static PyObject *from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static PyObject *from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static PyObject *from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline PyObject *from(const Type& val) { return traits_from::from(val); } template inline PyObject *from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(PyObject *obj, Type **val) { Type *p; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(PyObject *obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(PyObject *obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(PyObject *obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(PyObject *obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(PyObject *obj, bool throw_error) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { if (!PyErr_Occurred()) { ::%type_error(swig::type_name()); } if (throw_error) throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(PyObject *obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { // Uninitialized return value, no Type() constructor required. static Type *v_def = (Type*) malloc(sizeof(Type)); if (!PyErr_Occurred()) { %type_error(swig::type_name()); } if (throw_error) throw std::invalid_argument("bad type"); memset(v_def,0,sizeof(Type)); return *v_def; } } }; template struct traits_as { static Type* as(PyObject *obj, bool throw_error) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (!PyErr_Occurred()) { %type_error(swig::type_name()); } if (throw_error) throw std::invalid_argument("bad type"); return 0; } } }; template inline Type as(PyObject *obj, bool te = false) { return traits_as::category>::as(obj, te); } template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(PyObject *obj) { return traits_check::category>::check(obj); } } } // // Backward compatibility // #ifdef SWIG_PYTHON_BACKWARD_COMP %fragment(""); %{ PyObject* SwigInt_FromBool(bool b) { return PyInt_FromLong(b ? 1L : 0L); } double SwigNumber_Check(PyObject* o) { return PyFloat_Check(o) || PyInt_Check(o) || PyLong_Check(o); } double SwigNumber_AsDouble(PyObject* o) { return PyFloat_Check(o) ? PyFloat_AsDouble(o) : (PyInt_Check(o) ? double(PyInt_AsLong(o)) : double(PyLong_AsLong(o))); } PyObject* SwigString_FromString(const std::string& s) { return PyString_FromStringAndSize(s.data(),s.size()); } std::string SwigString_AsString(PyObject* o) { return std::string(PyString_AsString(o)); } %} #endif %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(PyObject *obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static PyObject *from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(PyObject *obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_unordered_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_unordered_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-3.0.12/Lib/python/pymacros.swg0000664000175000017500000000004613042756442017043 0ustar williamwilliam%include swig-3.0.12/Lib/python/std_pair.i0000664000175000017500000001402713042756442016447 0ustar williamwilliam/* Pairs */ %include //#define SWIG_STD_PAIR_ASVAL %fragment("StdPairTraits","header",fragment="StdTraits") { namespace swig { #ifdef SWIG_STD_PAIR_ASVAL template struct traits_asval > { typedef std::pair value_type; static int get_pair(PyObject* first, PyObject* second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval((PyObject*)first, 0); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(PyObject *obj, std::pair *val) { int res = SWIG_ERROR; if (PyTuple_Check(obj)) { if (PyTuple_GET_SIZE(obj) == 2) { res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val); } } else if (PySequence_Check(obj)) { if (PySequence_Size(obj) == 2) { swig::SwigVar_PyObject first = PySequence_GetItem(obj,0); swig::SwigVar_PyObject second = PySequence_GetItem(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; } return res; } }; #else template struct traits_asptr > { typedef std::pair value_type; static int get_pair(PyObject* first, PyObject* second, std::pair **val) { if (val) { value_type *vp = %new_instance(std::pair); T *pfirst = &(vp->first); int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) { %delete(vp); return res1; } U *psecond = &(vp->second); int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) { %delete(vp); return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(PyObject *obj, std::pair **val) { int res = SWIG_ERROR; if (PyTuple_Check(obj)) { if (PyTuple_GET_SIZE(obj) == 2) { res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val); } } else if (PySequence_Check(obj)) { if (PySequence_Size(obj) == 2) { swig::SwigVar_PyObject first = PySequence_GetItem(obj,0); swig::SwigVar_PyObject second = PySequence_GetItem(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; #endif template struct traits_from > { static PyObject *from(const std::pair& val) { PyObject* obj = PyTuple_New(2); PyTuple_SetItem(obj,0,swig::from(val.first)); PyTuple_SetItem(obj,1,swig::from(val.second)); return obj; } }; } #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN Py_ssize_t SwigPython_std_pair_len (PyObject *a) { return 2; } SWIGINTERN PyObject* SwigPython_std_pair_repr (PyObject *o) { PyObject *tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, PyObject_GetAttrString(o, (char*) "first")); PyTuple_SET_ITEM(tuple, 1, PyObject_GetAttrString(o, (char*) "second")); PyObject *result = PyObject_Repr(tuple); Py_DECREF(tuple); return result; } SWIGINTERN PyObject* SwigPython_std_pair_getitem (PyObject *a, Py_ssize_t b) { PyObject *result = PyObject_GetAttrString(a, b % 2 ? (char*) "second" : (char*) "first"); return result; } SWIGINTERN int SwigPython_std_pair_setitem (PyObject *a, Py_ssize_t b, PyObject *c) { int result = PyObject_SetAttrString(a, b % 2 ? (char*) "second" : (char*) "first", c); return result; } #endif } %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:sq_length") std::pair "SwigPython_std_pair_len"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:tp_repr") std::pair "SwigPython_std_pair_repr"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_item") std::pair "SwigPython_std_pair_getitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %feature("python:sq_ass_item") std::pair "SwigPython_std_pair_setitem"; %define %swig_pair_methods(pair...) #if !defined(SWIGPYTHON_BUILTIN) %extend { %pythoncode %{def __len__(self): return 2 def __repr__(self): return str((self.first, self.second)) def __getitem__(self, index): if not (index % 2): return self.first else: return self.second def __setitem__(self, index, val): if not (index % 2): self.first = val else: self.second = val%} } #endif %enddef %include swig-3.0.12/Lib/python/std_wios.i0000664000175000017500000000003213042756442016464 0ustar williamwilliam%include swig-3.0.12/Lib/python/std_auto_ptr.i0000664000175000017500000000111113042756442017337 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (out) std::auto_ptr %{ %set_output(SWIG_NewPointerObj($1.release(), $descriptor(TYPE *), SWIG_POINTER_OWN | %newpointer_flags)); %} %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-3.0.12/Lib/python/pydocs.swg0000664000175000017500000000212013042756442016502 0ustar williamwilliam // Documentation for use with the autodoc feature. #ifdef SWIG_DOC_DOXYGEN_STYLE %typemap(doc) SWIGTYPE "@param $1_name $1_type"; %typemap(doc) SWIGTYPE * "@param $1_name $1_type"; %typemap(doc) const SWIGTYPE & "@param $1_name $1_type"; %typemap(doc) const SWIGTYPE && "@param $1_name $1_type"; %typemap(doc) enum SWIGTYPE "@param $1_name enum $1_type"; %typemap(doc) SWIGTYPE *INOUT, SWIGTYPE &INOUT "@param $1_name $1_type (input/output)"; %typemap(doc) SWIGTYPE *INPUT, SWIGTYPE &INPUT "@param $1_name $1_type (input)"; %typemap(doc) SWIGTYPE *OUTPUT, SWIGTYPE &OUTPUT "@param $1_name $1_type (output)"; #else %typemap(doc) SWIGTYPE "$1_name: $1_type"; %typemap(doc) SWIGTYPE * "$1_name: $1_type"; %typemap(doc) const SWIGTYPE & "$1_name: $1_type"; %typemap(doc) const SWIGTYPE && "$1_name: $1_type"; %typemap(doc) enum SWIGTYPE "$1_name: enum $1_type"; %typemap(doc) SWIGTYPE *INOUT, SWIGTYPE &INOUT "$1_name: $1_type (input/output)"; %typemap(doc) SWIGTYPE *INPUT, SWIGTYPE &INPUT "$1_name: $1_type (input)"; %typemap(doc) SWIGTYPE *OUTPUT, SWIGTYPE &OUTPUT "$1_name: $1_type (output)"; #endif swig-3.0.12/Lib/python/std_char_traits.i0000664000175000017500000000004113042756442020006 0ustar williamwilliam%include swig-3.0.12/Lib/python/pystrings.swg0000664000175000017500000001023613042756442017252 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { %#if PY_VERSION_HEX>=0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (PyBytes_Check(obj)) %#else if (PyUnicode_Check(obj)) %#endif %#else if (PyString_Check(obj)) %#endif { char *cstr; Py_ssize_t len; %#if PY_VERSION_HEX>=0x03000000 %#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (!alloc && cptr) { /* We can't allow converting without allocation, since the internal representation of string in Python 3 is UCS-2/UCS-4 but we require a UTF-8 representation. TODO(bhy) More detailed explanation */ return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if(alloc) *alloc = SWIG_NEWOBJ; %#endif PyBytes_AsStringAndSize(obj, &cstr, &len); %#else PyString_AsStringAndSize(obj, &cstr, &len); %#endif if (cptr) { if (alloc) { /* In python the user should not be able to modify the inner string representation. To warranty that, if you define SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string buffer is always returned. The default behavior is just to return the pointer value, so, be careful. */ %#if defined(SWIG_PYTHON_SAFE_CSTRINGS) if (*alloc != SWIG_OLDOBJ) %#else if (*alloc == SWIG_NEWOBJ) %#endif { *cptr = %new_copy_array(cstr, len + 1, char); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { %#if PY_VERSION_HEX>=0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) *cptr = PyBytes_AsString(obj); %#else assert(0); /* Should never reach here with Unicode strings in Python 3 */ %#endif %#else *cptr = SWIG_Python_str_AsChar(obj); %#endif } } if (psize) *psize = len + 1; %#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) Py_XDECREF(obj); %#endif return SWIG_OK; } else { %#if defined(SWIG_PYTHON_2_UNICODE) %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) %#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once" %#endif %#if PY_VERSION_HEX<0x03000000 if (PyUnicode_Check(obj)) { char *cstr; Py_ssize_t len; if (!alloc && cptr) { return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) { if (cptr) { if (alloc) *alloc = SWIG_NEWOBJ; *cptr = %new_copy_array(cstr, len + 1, char); } if (psize) *psize = len + 1; Py_XDECREF(obj); return SWIG_OK; } else { Py_XDECREF(obj); } } %#endif %#endif swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_InternalNewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : SWIG_Py_Void(); } else { %#if PY_VERSION_HEX >= 0x03000000 %#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) return PyBytes_FromStringAndSize(carray, %numeric_cast(size, Py_ssize_t)); %#else %#if PY_VERSION_HEX >= 0x03010000 return PyUnicode_DecodeUTF8(carray, %numeric_cast(size, Py_ssize_t), "surrogateescape"); %#else return PyUnicode_FromStringAndSize(carray, %numeric_cast(size, Py_ssize_t)); %#endif %#endif %#else return PyString_FromStringAndSize(carray, %numeric_cast(size, Py_ssize_t)); %#endif } } else { return SWIG_Py_Void(); } } } swig-3.0.12/Lib/python/pyfragments.swg0000664000175000017500000000104713042756442017547 0ustar williamwilliam/* Create a file with this name, 'pyfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-3.0.12/Lib/python/pyhead.swg0000664000175000017500000001311413042756442016460 0ustar williamwilliam/* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define PyString_AS_STRING(x) PyUnicode_AS_STRING(x) #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif /* Warning: This function will allocate a new string in Python 3, * so please call SWIG_Python_str_DelForPy3(x) to free the space. */ SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03000000 char *cstr; char *newstr; Py_ssize_t len; str = PyUnicode_AsUTF8String(str); PyBytes_AsStringAndSize(str, &cstr, &len); newstr = (char *) malloc(len+1); memcpy(newstr, cstr, len+1); Py_XDECREF(str); return newstr; #else return PyString_AsString(str); #endif } #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_DelForPy3(x) free( (void*) (x) ) #else # define SWIG_Python_str_DelForPy3(x) #endif SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } /* Add PyOS_snprintf for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM) # define PyOS_snprintf _snprintf # else # define PyOS_snprintf snprintf # endif #endif /* A crude PyString_FromFormat implementation for old Pythons */ #if PY_VERSION_HEX < 0x02020000 #ifndef SWIG_PYBUFFER_SIZE # define SWIG_PYBUFFER_SIZE 1024 #endif static PyObject * PyString_FromFormat(const char *fmt, ...) { va_list ap; char buf[SWIG_PYBUFFER_SIZE * 2]; int res; va_start(ap, fmt); res = vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf); } #endif #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* A crude PyExc_StopIteration exception for old Pythons */ #if PY_VERSION_HEX < 0x02020000 # ifndef PyExc_StopIteration # define PyExc_StopIteration PyExc_RuntimeError # endif # ifndef PyObject_GenericGetAttr # define PyObject_GenericGetAttr 0 # endif #endif /* Py_NotImplemented is defined in 2.1 and up. */ #if PY_VERSION_HEX < 0x02010000 # ifndef Py_NotImplemented # define Py_NotImplemented PyExc_RuntimeError # endif #endif /* A crude PyString_AsStringAndSize implementation for old Pythons */ #if PY_VERSION_HEX < 0x02010000 # ifndef PyString_AsStringAndSize # define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;} # endif #endif /* PySequence_Size for old Pythons */ #if PY_VERSION_HEX < 0x02000000 # ifndef PySequence_Size # define PySequence_Size PySequence_Length # endif #endif /* PyBool_FromLong for old Pythons */ #if PY_VERSION_HEX < 0x02030000 static PyObject *PyBool_FromLong(long ok) { PyObject *result = ok ? Py_True : Py_False; Py_INCREF(result); return result; } #endif /* Py_ssize_t for old Pythons */ /* This code is as recommended by: */ /* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */ #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; # define PY_SSIZE_T_MAX INT_MAX # define PY_SSIZE_T_MIN INT_MIN typedef inquiry lenfunc; typedef intargfunc ssizeargfunc; typedef intintargfunc ssizessizeargfunc; typedef intobjargproc ssizeobjargproc; typedef intintobjargproc ssizessizeobjargproc; typedef getreadbufferproc readbufferproc; typedef getwritebufferproc writebufferproc; typedef getsegcountproc segcountproc; typedef getcharbufferproc charbufferproc; static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc)) { long result = 0; PyObject *i = PyNumber_Int(x); if (i) { result = PyInt_AsLong(i); Py_DECREF(i); } return result; } #endif #if PY_VERSION_HEX < 0x02050000 #define PyInt_FromSize_t(x) PyInt_FromLong((long)x) #endif #if PY_VERSION_HEX < 0x02040000 #define Py_VISIT(op) \ do { \ if (op) { \ int vret = visit((op), arg); \ if (vret) \ return vret; \ } \ } while (0) #endif #if PY_VERSION_HEX < 0x02030000 typedef struct { PyTypeObject type; PyNumberMethods as_number; PyMappingMethods as_mapping; PySequenceMethods as_sequence; PyBufferProcs as_buffer; PyObject *name, *slots; } PyHeapTypeObject; #endif #if PY_VERSION_HEX < 0x02030000 typedef destructor freefunc; #endif #if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \ (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \ (PY_MAJOR_VERSION > 3)) # define SWIGPY_USE_CAPSULE # define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME) #endif #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #define Py_hash_t long #endif swig-3.0.12/Lib/python/stl.i0000664000175000017500000000026613042756442015444 0ustar williamwilliam/* initial STL definition. extended as needed in each language */ %include %include %include %include %include swig-3.0.12/Lib/python/pythonkw.swg0000664000175000017500000000446313042756442017100 0ustar williamwilliam/* Warnings for Python keywords, built-in names and bad names. */ #define PYTHONKW(x) %keywordwarn("'" `x` "' is a python keyword, renaming to '_" `x` "'", rename="_%s") `x` #define PYTHONBN(x) %builtinwarn("'" `x` "' conflicts with a built-in name in python") `x` /* Warnings for Python keywords https://docs.python.org/2/reference/lexical_analysis.html#keywords */ PYTHONKW(and); PYTHONKW(as); PYTHONKW(assert); PYTHONKW(break); PYTHONKW(class); PYTHONKW(continue); PYTHONKW(def); PYTHONKW(del); PYTHONKW(elif); PYTHONKW(else); PYTHONKW(except); PYTHONKW(exec); PYTHONKW(finally); PYTHONKW(for); PYTHONKW(from); PYTHONKW(global); PYTHONKW(if); PYTHONKW(import); PYTHONKW(in); PYTHONKW(is); PYTHONKW(lambda); PYTHONKW(not); PYTHONKW(or); PYTHONKW(pass); PYTHONKW(print); PYTHONKW(raise); PYTHONKW(return); PYTHONKW(try); PYTHONKW(while); PYTHONKW(with); PYTHONKW(yield); /* built-in functions https://docs.python.org/2/library/functions.html */ PYTHONBN(abs); PYTHONBN(apply); PYTHONBN(bool); PYTHONBN(buffer); PYTHONBN(callable); PYTHONBN(chr); PYTHONBN(classmethod); PYTHONBN(cmp); PYTHONBN(coerce); PYTHONBN(compile); PYTHONBN(complex); PYTHONBN(delattr); PYTHONBN(dict); PYTHONBN(dir); PYTHONBN(divmod); PYTHONBN(enumerate); PYTHONBN(eval); PYTHONBN(execfile); PYTHONBN(file); PYTHONBN(filter); PYTHONBN(float); PYTHONBN(frozenset); PYTHONBN(getattr); PYTHONBN(globals); PYTHONBN(hasattr); PYTHONBN(hash); PYTHONBN(hex); PYTHONBN(id); PYTHONBN(input); PYTHONBN(int); PYTHONBN(intern); PYTHONBN(isinstance); PYTHONBN(issubclass); PYTHONBN(iter); PYTHONBN(len); PYTHONBN(list); PYTHONBN(locals); PYTHONBN(long); PYTHONBN(map); PYTHONBN(max); PYTHONBN(min); PYTHONBN(object); PYTHONBN(oct); PYTHONBN(open); PYTHONBN(ord); PYTHONBN(pow); PYTHONBN(property); PYTHONBN(range); PYTHONBN(raw_input); PYTHONBN(reduce); PYTHONBN(reload); PYTHONBN(repr); PYTHONBN(reversed); PYTHONBN(round); PYTHONBN(set); PYTHONBN(setattr); PYTHONBN(slice); PYTHONBN(sorted); PYTHONBN(staticmethod); PYTHONBN(str); PYTHONBN(sum); PYTHONBN(super); PYTHONBN(tuple); PYTHONBN(type); PYTHONBN(unichr); PYTHONBN(unicode); PYTHONBN(vars); PYTHONBN(xrange); PYTHONBN(zip); /* built-in names boolean type and None */ PYTHONBN(True); PYTHONBN(False); PYTHONKW(None); /* 'self' is also a bad Name */ PYTHONKW(self); #undef PYTHONBN #undef PYTHONKW swig-3.0.12/Lib/python/pyabc.i0000664000175000017500000000064213042756442015736 0ustar williamwilliam%define %pythonabc(Type, Abc) %feature("python:abc", #Abc) Type; %enddef %pythoncode %{import collections%} %pythonabc(std::vector, collections.MutableSequence); %pythonabc(std::list, collections.MutableSequence); %pythonabc(std::map, collections.MutableMapping); %pythonabc(std::multimap, collections.MutableMapping); %pythonabc(std::set, collections.MutableSet); %pythonabc(std::multiset, collections.MutableSet); swig-3.0.12/Lib/python/README0000664000175000017500000000756013042756442015354 0ustar williamwilliam/* ----------------------------------------------------------------------------- * * User interfaces: include these ones as needed * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Special types and user helpers * ----------------------------------------------------------------------------- */ argcargv.i Handler for (int argc, char **argv) attribute.i Convert a pair of set/get methods into a "native" python attribute ccomplex.i C99 complex type complex.i C99 or C++ complex type cstring.i Various forms of C character string handling cwstring.i Various forms of C wchar_t string handling embed.i embedding the Python interpreter in something else file.i FILE C type implicit.i Allow the use of implicit C++ constructors wchar.i wchar_t C type /* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ std_alloc.i allocator std_basic_string.i basic string std_char_traits.i char traits std_complex.i complex std_deque.i deque std_except.i exceptions std_ios.i ios std_iostream.i istream/ostream std_list.i list std_map.i map std_multimap.i multimap std_multiset.i multiset std_pair.i pair std_set.i set std_sstream.i string stream std_streambuf.i streambuf std_string.i string std_vector.i vector std_wios.i wios std_wiostream.i wistream/wostream std_wsstream.i wstring stream std_wstreambuf.i wstreambuf std_wstring.i wstring /* ----------------------------------------------------------------------------- /* * Implementation files: don't look at them unless you are really drunk * * ----------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------- * Basic files * ----------------------------------------------------------------------------- */ python.swg Main language file, it just includes what is needed. pyuserdir.swg User visible directives (%pythonnondynamic, etc) pymacros.swg Internal macros used for typemaps pyfragments.swg Allow the user to overload the default fragments pyopers.swg Python operations (+=, *=, etc) pythonkw.swg Python keywords and special names pyinit.swg Python Init method /* ----------------------------------------------------------------------------- * The runtime part * ----------------------------------------------------------------------------- */ pyruntime.swg Main runtime file definition pyapi.swg SWIG/Python API declarations pyrun.swg Python run-time code /* ----------------------------------------------------------------------------- * Internal typemap specializations * ----------------------------------------------------------------------------- */ pyswigtype.swg SWIGTYPE pystrings.swg Char strings (char *) pywstrings.swg Wchar Strings (wchar_t *) pyprimtypes.swg Primitive types (shot,int,double,etc) pycomplex.swg PyComplex and helper for C/C++ complex types pydocs.swg Typemaps documentation /* ----------------------------------------------------------------------------- * C++ STD + STL * ----------------------------------------------------------------------------- */ pycontainer.swg python container iterators std_common.i general common code for the STD/STL implementation std_container.i general common code for the STD/STL containers /*----------------------------------------------------------------------------- * Backward compatibility and deprecated * ----------------------------------------------------------------------------- */ std_vectora.i vector + allocator (allocators are now supported in STD/STL) typemaps.i old in/out typemaps (doesn't need to be included) defarg.swg for processing default arguments with shadow classes swig-3.0.12/Lib/python/exception.i0000664000175000017500000000021313042756442016630 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), %block(%error(code, msg); SWIG_fail; )) } swig-3.0.12/Lib/python/pybuffer.i0000664000175000017500000000533613042756442016467 0ustar williamwilliam/* Implementing buffer protocol typemaps */ /* %pybuffer_mutable_binary(TYPEMAP, SIZE) * * Macro for functions accept mutable buffer pointer with a size. * This can be used for both input and output. For example: * * %pybuffer_mutable_binary(char *buff, int size); * void foo(char *buff, int size) { * for(int i=0; i struct traits_asptr > { static int asptr(PyObject *obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static PyObject *from(const std::list & vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/python/pycomplex.swg0000664000175000017500000000430313042756442017226 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header") { SWIGINTERNINLINE PyObject* SWIG_From(Type)(%ifcplusplus(const Type&, Type) c) { return PyComplex_FromDoubles(Real(c), Imag(c)); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal(Type) (PyObject *o, Type* val) { if (PyComplex_Check(o)) { if (val) *val = Constructor(PyComplex_RealAsDouble(o), PyComplex_ImagAsDouble(o)); return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal(Type)(PyObject *o, Type *val) { if (PyComplex_Check(o)) { double re = PyComplex_RealAsDouble(o); double im = PyComplex_ImagAsDouble(o); if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-3.0.12/Lib/python/builtin.swg0000664000175000017500000006067013042756442016665 0ustar williamwilliam#ifdef __cplusplus extern "C" { #endif SWIGINTERN Py_hash_t SwigPyObject_hash(PyObject *obj) { SwigPyObject *sobj = (SwigPyObject *)obj; void *ptr = sobj->ptr; return (Py_hash_t)ptr; } SWIGINTERN Py_hash_t SWIG_PyNumber_AsPyHash(PyObject *obj) { Py_hash_t result = -1; #if PY_VERSION_HEX < 0x03020000 #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) result = PyInt_AsLong(obj); else #endif if (PyLong_Check(obj)) result = PyLong_AsLong(obj); #else if (PyNumber_Check(obj)) result = PyNumber_AsSsize_t(obj, NULL); #endif else PyErr_Format(PyExc_TypeError, "Wrong type for hash function"); return PyErr_Occurred() ? -1 : result; } SWIGINTERN int SwigPyBuiltin_BadInit(PyObject *self, PyObject *SWIGUNUSEDPARM(args), PyObject *SWIGUNUSEDPARM(kwds)) { PyErr_Format(PyExc_TypeError, "Cannot create new instances of type '%.300s'", self->ob_type->tp_name); return -1; } SWIGINTERN void SwigPyBuiltin_BadDealloc(PyObject *obj) { SwigPyObject *sobj = (SwigPyObject *)obj; if (sobj->own) { PyErr_Format(PyExc_TypeError, "Swig detected a memory leak in type '%.300s': no callable destructor found.", obj->ob_type->tp_name); } } typedef struct { PyCFunction get; PyCFunction set; } SwigPyGetSet; SWIGINTERN PyObject * SwigPyBuiltin_GetterClosure (PyObject *obj, void *closure) { SwigPyGetSet *getset; PyObject *tuple, *result; if (!closure) return SWIG_Py_Void(); getset = (SwigPyGetSet *)closure; if (!getset->get) return SWIG_Py_Void(); tuple = PyTuple_New(0); assert(tuple); result = (*getset->get)(obj, tuple); Py_DECREF(tuple); return result; } SWIGINTERN PyObject * SwigPyBuiltin_FunpackGetterClosure (PyObject *obj, void *closure) { SwigPyGetSet *getset; PyObject *result; if (!closure) return SWIG_Py_Void(); getset = (SwigPyGetSet *)closure; if (!getset->get) return SWIG_Py_Void(); result = (*getset->get)(obj, NULL); return result; } SWIGINTERN int SwigPyBuiltin_SetterClosure (PyObject *obj, PyObject *val, void *closure) { SwigPyGetSet *getset; PyObject *tuple, *result; if (!closure) { PyErr_Format(PyExc_TypeError, "Missing getset closure"); return -1; } getset = (SwigPyGetSet *)closure; if (!getset->set) { PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name); return -1; } tuple = PyTuple_New(1); assert(tuple); PyTuple_SET_ITEM(tuple, 0, val); Py_XINCREF(val); result = (*getset->set)(obj, tuple); Py_DECREF(tuple); Py_XDECREF(result); return result ? 0 : -1; } SWIGINTERN int SwigPyBuiltin_FunpackSetterClosure (PyObject *obj, PyObject *val, void *closure) { SwigPyGetSet *getset; PyObject *result; if (!closure) { PyErr_Format(PyExc_TypeError, "Missing getset closure"); return -1; } getset = (SwigPyGetSet *)closure; if (!getset->set) { PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name); return -1; } result = (*getset->set)(obj, val); Py_XDECREF(result); return result ? 0 : -1; } SWIGINTERN void SwigPyStaticVar_dealloc(PyDescrObject *descr) { _PyObject_GC_UNTRACK(descr); Py_XDECREF(PyDescr_TYPE(descr)); Py_XDECREF(PyDescr_NAME(descr)); PyObject_GC_Del(descr); } SWIGINTERN PyObject * SwigPyStaticVar_repr(PyGetSetDescrObject *descr) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromFormat("", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else return PyString_FromFormat("", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif } SWIGINTERN int SwigPyStaticVar_traverse(PyObject *self, visitproc visit, void *arg) { PyDescrObject *descr; descr = (PyDescrObject *)self; Py_VISIT((PyObject*) PyDescr_TYPE(descr)); return 0; } SWIGINTERN PyObject * SwigPyStaticVar_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *SWIGUNUSEDPARM(type)) { if (descr->d_getset->get != NULL) return descr->d_getset->get(obj, descr->d_getset->closure); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not readable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not readable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif return NULL; } SWIGINTERN int SwigPyStaticVar_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) { if (descr->d_getset->set != NULL) return descr->d_getset->set(obj, value, descr->d_getset->closure); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not writable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name); #else PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not writable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name); #endif return -1; } SWIGINTERN int SwigPyObjectType_setattro(PyObject *typeobject, PyObject *name, PyObject *value) { PyObject *attribute; PyTypeObject *type; descrsetfunc local_set; assert(PyType_Check(typeobject)); type = (PyTypeObject *)typeobject; attribute = _PyType_Lookup(type, name); if (attribute != NULL) { /* Implement descriptor functionality, if any */ local_set = attribute->ob_type->tp_descr_set; if (local_set != NULL) return local_set(attribute, (PyObject *)type, value); #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400S'", type->tp_name, name); #else PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400s'", type->tp_name, PyString_AS_STRING(name)); #endif } else { #if PY_VERSION_HEX >= 0x03000000 PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400S'", type->tp_name, name); #else PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400s'", type->tp_name, PyString_AS_STRING(name)); #endif } return -1; } SWIGINTERN PyTypeObject* SwigPyStaticVar_Type(void) { static PyTypeObject staticvar_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(&PyType_Type, 0) #else PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ #endif "swig_static_var_getset_descriptor", /* tp_name */ sizeof(PyGetSetDescrObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyStaticVar_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ (reprfunc)SwigPyStaticVar_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */ 0, /* tp_doc */ SwigPyStaticVar_traverse, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ (descrgetfunc)SwigPyStaticVar_get, /* tp_descr_get */ (descrsetfunc)SwigPyStaticVar_set, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; staticvar_type = tmp; type_init = 1; #if PY_VERSION_HEX < 0x02020000 staticvar_type.ob_type = &PyType_Type; #else if (PyType_Ready(&staticvar_type) < 0) return NULL; #endif } return &staticvar_type; } SWIGINTERN PyTypeObject* SwigPyObjectType(void) { static char swigpyobjecttype_doc[] = "Metaclass for SWIG wrapped types"; static PyTypeObject swigpyobjecttype_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(&PyType_Type, 0) #else PyObject_HEAD_INIT(&PyType_Type) 0, /* ob_size */ #endif "SwigPyObjectType", /* tp_name */ PyType_Type.tp_basicsize, /* tp_basicsize */ 0, /* tp_itemsize */ 0, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_compare */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ SwigPyObjectType_setattro, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */ swigpyobjecttype_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ #if PY_VERSION_HEX >= 0x02030000 0, /* tp_del */ #endif #if PY_VERSION_HEX >= 0x02060000 0, /* tp_version_tag */ #endif #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ #if PY_VERSION_HEX >= 0x02050000 0, /* tp_prev */ #endif 0 /* tp_next */ #endif }; swigpyobjecttype_type = tmp; type_init = 1; swigpyobjecttype_type.tp_base = &PyType_Type; #if PY_VERSION_HEX < 0x02020000 swigpyobjecttype_type.ob_type = &PyType_Type; #else if (PyType_Ready(&swigpyobjecttype_type) < 0) return NULL; #endif } return &swigpyobjecttype_type; } SWIGINTERN PyGetSetDescrObject * SwigPyStaticVar_new_getset(PyTypeObject *type, PyGetSetDef *getset) { PyGetSetDescrObject *descr; descr = (PyGetSetDescrObject *)PyType_GenericAlloc(SwigPyStaticVar_Type(), 0); assert(descr); Py_XINCREF(type); PyDescr_TYPE(descr) = type; PyDescr_NAME(descr) = PyString_InternFromString(getset->name); descr->d_getset = getset; if (PyDescr_NAME(descr) == NULL) { Py_DECREF(descr); descr = NULL; } return descr; } SWIGINTERN void SwigPyBuiltin_InitBases (PyTypeObject *type, PyTypeObject **bases) { int base_count = 0; PyTypeObject **b; PyObject *tuple; int i; if (!bases[0]) { bases[0] = SwigPyObject_type(); bases[1] = NULL; } type->tp_base = bases[0]; Py_INCREF((PyObject *)bases[0]); for (b = bases; *b != NULL; ++b) ++base_count; tuple = PyTuple_New(base_count); for (i = 0; i < base_count; ++i) { PyTuple_SET_ITEM(tuple, i, (PyObject *)bases[i]); Py_INCREF((PyObject *)bases[i]); } type->tp_bases = tuple; } SWIGINTERN PyObject * SwigPyBuiltin_ThisClosure (PyObject *self, void *SWIGUNUSEDPARM(closure)) { PyObject *result; result = (PyObject *)SWIG_Python_GetSwigThis(self); Py_XINCREF(result); return result; } SWIGINTERN void SwigPyBuiltin_SetMetaType (PyTypeObject *type, PyTypeObject *metatype) { #if PY_VERSION_HEX >= 0x03000000 type->ob_base.ob_base.ob_type = metatype; #else type->ob_type = metatype; #endif } /* Start of callback function macros for use in PyTypeObject */ typedef PyObject *(*SwigPyWrapperFunction)(PyObject *, PyObject *); #define SWIGPY_UNARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_unaryfunc_closure(PyObject *a) { \ return SwigPyBuiltin_unaryfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_unaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_DESTRUCTOR_CLOSURE(wrapper) \ SWIGINTERN void \ wrapper##_destructor_closure(PyObject *a) { \ SwigPyBuiltin_destructor_closure(wrapper, #wrapper, a); \ } SWIGINTERN void SwigPyBuiltin_destructor_closure(SwigPyWrapperFunction wrapper, const char *wrappername, PyObject *a) { SwigPyObject *sobj; sobj = (SwigPyObject *)a; Py_XDECREF(sobj->dict); if (sobj->own) { PyObject *o; PyObject *val = 0, *type = 0, *tb = 0; PyErr_Fetch(&val, &type, &tb); o = wrapper(a, NULL); if (!o) { PyObject *deallocname = PyString_FromString(wrappername); PyErr_WriteUnraisable(deallocname); Py_DECREF(deallocname); } PyErr_Restore(val, type, tb); Py_XDECREF(o); } if (PyType_IS_GC(a->ob_type)) { PyObject_GC_Del(a); } else { PyObject_Del(a); } } #define SWIGPY_INQUIRY_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_inquiry_closure(PyObject *a) { \ return SwigPyBuiltin_inquiry_closure(wrapper, a); \ } SWIGINTERN int SwigPyBuiltin_inquiry_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *pyresult; int result; pyresult = wrapper(a, NULL); result = pyresult && PyObject_IsTrue(pyresult) ? 1 : 0; Py_XDECREF(pyresult); return result; } #define SWIGPY_GETITERFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_getiterfunc_closure(PyObject *a) { \ return SwigPyBuiltin_getiterfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_getiterfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_BINARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_binaryfunc_closure(PyObject *a, PyObject *b) { \ return SwigPyBuiltin_binaryfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_binaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b) { PyObject *tuple, *result; tuple = PyTuple_New(1); assert(tuple); PyTuple_SET_ITEM(tuple, 0, b); Py_XINCREF(b); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } typedef ternaryfunc ternarycallfunc; #define SWIGPY_TERNARYFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ternaryfunc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_ternaryfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ternaryfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { PyObject *tuple, *result; tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, b); PyTuple_SET_ITEM(tuple, 1, c); Py_XINCREF(b); Py_XINCREF(c); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_TERNARYCALLFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ternarycallfunc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_ternarycallfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ternarycallfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { (void) c; return wrapper(a, b); } #define SWIGPY_LENFUNC_CLOSURE(wrapper) \ SWIGINTERN Py_ssize_t \ wrapper##_lenfunc_closure(PyObject *a) { \ return SwigPyBuiltin_lenfunc_closure(wrapper, a); \ } SWIGINTERN Py_ssize_t SwigPyBuiltin_lenfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *resultobj; Py_ssize_t result; resultobj = wrapper(a, NULL); result = PyNumber_AsSsize_t(resultobj, NULL); Py_DECREF(resultobj); return result; } #define SWIGPY_SSIZESSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizessizeargfunc_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c) { \ return SwigPyBuiltin_ssizessizeargfunc_closure(wrapper, a, b, c); \ } SWIGINTERN PyObject * SwigPyBuiltin_ssizessizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, Py_ssize_t c) { PyObject *tuple, *result; tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c)); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_ssizessizeobjargproc_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { \ return SwigPyBuiltin_ssizessizeobjargproc_closure(wrapper, a, b, c, d); \ } SWIGINTERN int SwigPyBuiltin_ssizessizeobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(d ? 3 : 2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c)); if (d) { PyTuple_SET_ITEM(tuple, 2, d); Py_INCREF(d); } resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_DECREF(tuple); Py_XDECREF(resultobj); return result; } #define SWIGPY_SSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizeargfunc_closure(PyObject *a, Py_ssize_t b) { \ return SwigPyBuiltin_funpack_ssizeargfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_funpack_ssizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b) { PyObject *tuple, *result; tuple = PyTuple_New(1); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); result = wrapper(a, tuple); Py_DECREF(tuple); return result; } #define SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_ssizeargfunc_closure(PyObject *a, Py_ssize_t b) { \ return SwigPyBuiltin_ssizeargfunc_closure(wrapper, a, b); \ } SWIGINTERN PyObject * SwigPyBuiltin_ssizeargfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b) { PyObject *arg, *result; arg = _PyLong_FromSsize_t(b); result = wrapper(a, arg); Py_DECREF(arg); return result; } #define SWIGPY_SSIZEOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_ssizeobjargproc_closure(PyObject *a, Py_ssize_t b, PyObject *c) { \ return SwigPyBuiltin_ssizeobjargproc_closure(wrapper, a, b, c); \ } SWIGINTERN int SwigPyBuiltin_ssizeobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, Py_ssize_t b, PyObject *c) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(2); assert(tuple); PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b)); PyTuple_SET_ITEM(tuple, 1, c); Py_XINCREF(c); resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_XDECREF(resultobj); Py_DECREF(tuple); return result; } #define SWIGPY_OBJOBJARGPROC_CLOSURE(wrapper) \ SWIGINTERN int \ wrapper##_objobjargproc_closure(PyObject *a, PyObject *b, PyObject *c) { \ return SwigPyBuiltin_objobjargproc_closure(wrapper, a, b, c); \ } SWIGINTERN int SwigPyBuiltin_objobjargproc_closure(SwigPyWrapperFunction wrapper, PyObject *a, PyObject *b, PyObject *c) { PyObject *tuple, *resultobj; int result; tuple = PyTuple_New(c ? 2 : 1); assert(tuple); PyTuple_SET_ITEM(tuple, 0, b); Py_XINCREF(b); if (c) { PyTuple_SET_ITEM(tuple, 1, c); Py_XINCREF(c); } resultobj = wrapper(a, tuple); result = resultobj ? 0 : -1; Py_XDECREF(resultobj); Py_DECREF(tuple); return result; } #define SWIGPY_REPRFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_reprfunc_closure(PyObject *a) { \ return SwigPyBuiltin_reprfunc_closure(wrapper, a); \ } SWIGINTERN PyObject * SwigPyBuiltin_reprfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } #define SWIGPY_HASHFUNC_CLOSURE(wrapper) \ SWIGINTERN Py_hash_t \ wrapper##_hashfunc_closure(PyObject *a) { \ return SwigPyBuiltin_hashfunc_closure(wrapper, a); \ } SWIGINTERN Py_hash_t SwigPyBuiltin_hashfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { PyObject *pyresult; Py_hash_t result; pyresult = wrapper(a, NULL); if (!pyresult) return -1; result = SWIG_PyNumber_AsPyHash(pyresult); Py_DECREF(pyresult); return result; } #define SWIGPY_ITERNEXTFUNC_CLOSURE(wrapper) \ SWIGINTERN PyObject * \ wrapper##_iternextfunc_closure(PyObject *a) { \ return SwigPyBuiltin_iternextfunc_closure(wrapper, a);\ } SWIGINTERN PyObject * SwigPyBuiltin_iternextfunc_closure(SwigPyWrapperFunction wrapper, PyObject *a) { return wrapper(a, NULL); } /* End of callback function macros for use in PyTypeObject */ #ifdef __cplusplus } #endif swig-3.0.12/Lib/python/std_iostream.i0000664000175000017500000000015313042756442017332 0ustar williamwilliamnamespace std { %callback(1) endl; %callback(1) ends; %callback(1) flush; } %include swig-3.0.12/Lib/python/pyname_compat.i0000664000175000017500000001003413042756442017470 0ustar williamwilliam/* * From SWIG 1.3.37 we deprecated all SWIG symbols that start with Py, * since they are inappropriate and discouraged in Python documentation * (from http://www.python.org/doc/2.5.2/api/includes.html): * * "All user visible names defined by Python.h (except those defined by the included * standard headers) have one of the prefixes "Py" or "_Py". Names beginning with * "_Py" are for internal use by the Python implementation and should not be used * by extension writers. Structure member names do not have a reserved prefix. * * Important: user code should never define names that begin with "Py" or "_Py". * This confuses the reader, and jeopardizes the portability of the user code to * future Python versions, which may define additional names beginning with one * of these prefixes." * * This file defined macros to provide backward compatibility for these deprecated * symbols. In the case you have these symbols in your interface file, you can simply * include this file at beginning of it. * * However, this file may be removed in future release of SWIG, so using this file to * keep these inappropriate names in your SWIG interface file is also not recommended. * Instead, we provide a simple tool for converting your interface files to * the new naming convention. You can get the tool from the SWIG distribution: * Tools/pyname_patch.py */ %fragment("PySequence_Base", "header", fragment="SwigPySequence_Base") {} %fragment("PySequence_Cont", "header", fragment="SwigPySequence_Cont") {} %fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} %fragment("PyPairBoolOutputIterator", "header", fragment="SwigPyPairBoolOutputIterator") {} %fragment("PySwigIterator", "header", fragment="SwigPyIterator") {} %fragment("PySwigIterator_T", "header", fragment="SwigPyIterator_T") {} %inline %{ #define PyMapIterator_T SwigPyMapIterator_T #define PyMapKeyIterator_T SwigPyMapKeyIterator_T #define PyMapValueIterator_T SwigPyMapValueITerator_T #define PyObject_ptr SwigPtr_PyObject #define PyObject_var SwigVar_PyObject #define PyOper SwigPyOper #define PySeq SwigPySeq #define PySequence_ArrowProxy SwigPySequence_ArrowProxy #define PySequence_Cont SwigPySequence_Cont #define PySequence_InputIterator SwigPySequence_InputIterator #define PySequence_Ref SwigPySequence_Ref #define PySwigClientData SwigPyClientData #define PySwigClientData_Del SwigPyClientData_Del #define PySwigClientData_New SwigPyClientData_New #define PySwigIterator SwigPyIterator #define PySwigIteratorClosed_T SwigPyIteratorClosed_T #define PySwigIteratorOpen_T SwigPyIteratorOpen_T #define PySwigIterator_T SwigPyIterator_T #define PySwigObject SwigPyObject #define PySwigObject_Check SwigPyObject_Check #define PySwigObject_GetDesc SwigPyObject_GetDesc #define PySwigObject_New SwigPyObject_New #define PySwigObject_acquire SwigPyObject_acquire #define PySwigObject_append SwigPyObject_append #define PySwigObject_as_number SwigPyObject_as_number #define PySwigObject_compare SwigPyObject_compare #define PySwigObject_dealloc SwigPyObject_dealloc #define PySwigObject_disown SwigPyObject_disown #define PySwigObject_format SwigPyObject_format #define PySwigObject_getattr SwigPyObject_getattr #define PySwigObject_hex SwigPyObject_hex #define PySwigObject_long SwigPyObject_long #define PySwigObject_next SwigPyObject_next #define PySwigObject_oct SwigPyObject_oct #define PySwigObject_own SwigPyObject_own #define PySwigObject_repr SwigPyObject_repr #define PySwigObject_richcompare SwigPyObject_richcompare #define PySwigObject_type SwigPyObject_type #define PySwigPacked SwigPyPacked #define PySwigPacked_Check SwigPyPacked_Check #define PySwigPacked_New SwigPyPacked_New #define PySwigPacked_UnpackData SwigPyPacked_UnpackData #define PySwigPacked_compare SwigPyPacked_compare #define PySwigPacked_dealloc SwigPyPacked_dealloc #define PySwigPacked_print SwigPyPacked_print #define PySwigPacked_repr SwigPyPacked_repr #define PySwigPacked_str SwigPyPacked_str #define PySwigPacked_type SwigPyPacked_type #define pyseq swigpyseq #define pyswigobject_type swigpyobject_type #define pyswigpacked_type swigpypacked_type %} swig-3.0.12/Lib/python/cdata.i0000664000175000017500000000003613042756442015711 0ustar williamwilliam%include swig-3.0.12/Lib/python/pyapi.swg0000664000175000017500000000247313042756442016336 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; /* ----------------------------------------------------------------------------- * Wrapper of PyInstanceMethod_New() used in Python 3 * It is exported to the generated module, used for -fastproxy * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX >= 0x03000000 SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func) { return PyInstanceMethod_New(func); } #else SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func)) { return NULL; } #endif #ifdef __cplusplus } #endif swig-3.0.12/Lib/python/std_vectora.i0000664000175000017500000000147513042756442017162 0ustar williamwilliam/* Vectors + allocators */ %fragment("StdVectorATraits","header",fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { typedef std::vector vector_type; typedef T value_type; static int asptr(PyObject *obj, vector_type **vec) { return traits_asptr_stdseq::asptr(obj, vec); } }; template struct traits_from > { typedef std::vector vector_type; static PyObject *from(const vector_type& vec) { return traits_from_stdseq::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/python/std_string.i0000664000175000017500000000004313042756442017013 0ustar williamwilliam%include swig-3.0.12/Lib/python/std_ios.i0000664000175000017500000000010213042756442016273 0ustar williamwilliam%rename(ios_base_in) std::ios_base::in; %include swig-3.0.12/Lib/python/std_map.i0000664000175000017500000002336713042756442016300 0ustar williamwilliam/* Maps */ %fragment("StdMapCommonTraits","header",fragment="StdSequenceTraits") { namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct SwigPyMapIterator_T : SwigPyIteratorClosed_T { SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyIteratorClosed_T(curr, first, last, seq) { } }; template > struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T { SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapKeyIterator_T(current, begin, end, seq); } template > struct SwigPyMapValueITerator_T : SwigPyMapIterator_T { SwigPyMapValueITerator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapValueITerator_T(current, begin, end, seq); } } } %fragment("StdMapTraits","header",fragment="StdMapCommonTraits") { namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::map *map) { typedef typename std::map::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(PyObject *obj, map_type **val) { int res = SWIG_ERROR; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); %#if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); %#endif res = traits_asptr_stdseq >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static PyObject *asdict(const map_type& map) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; size_type size = map.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } SWIG_PYTHON_THREAD_END_BLOCK; return obj; } static PyObject *from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { return asdict(map); } } }; } } %define %swig_map_common(Map...) %swig_sequence_iterator(Map); %swig_container_methods(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_length", functype="lenfunc") __len__; %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__; %feature("python:slot", "tp_iter", functype="getiterfunc") key_iterator; %extend { %newobject iterkeys(PyObject **PYTHON_SELF); swig::SwigPyIterator* iterkeys(PyObject **PYTHON_SELF) { return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject itervalues(PyObject **PYTHON_SELF); swig::SwigPyIterator* itervalues(PyObject **PYTHON_SELF) { return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject iteritems(PyObject **PYTHON_SELF); swig::SwigPyIterator* iteritems(PyObject **PYTHON_SELF) { return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } #else %extend { %pythoncode %{def __iter__(self): return self.key_iterator()%} %pythoncode %{def iterkeys(self): return self.key_iterator()%} %pythoncode %{def itervalues(self): return self.value_iterator()%} %pythoncode %{def iteritems(self): return self.iterator()%} } #endif %extend { mapped_type const & __getitem__(const key_type& key) throw (std::out_of_range) { Map::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __delitem__(const key_type& key) throw (std::out_of_range) { Map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const key_type& key) const { Map::const_iterator i = self->find(key); return i != self->end(); } PyObject* keys() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } PyObject* values() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } PyObject* items() { Map::size_type size = self->size(); Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); Map::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } // Python 2.2 methods bool __contains__(const key_type& key) { return self->find(key) != self->end(); } %newobject key_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* key_iterator(PyObject **PYTHON_SELF) { return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } %newobject value_iterator(PyObject **PYTHON_SELF); swig::SwigPyIterator* value_iterator(PyObject **PYTHON_SELF) { return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } } %enddef %define %swig_map_methods(Map...) %swig_map_common(Map) #if defined(SWIGPYTHON_BUILTIN) %feature("python:slot", "mp_ass_subscript", functype="objobjargproc") __setitem__; #endif %extend { // This will be called through the mp_ass_subscript slot to delete an entry. void __setitem__(const key_type& key) { self->erase(key); } void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) { (*self)[key] = x; } PyObject* asdict() { return swig::traits_from< Map >::asdict(*self); } } %enddef %include swig-3.0.12/Lib/python/cstring.i0000664000175000017500000000004013042756442016301 0ustar williamwilliam%include swig-3.0.12/Lib/python/factory.i0000664000175000017500000000004013042756442016277 0ustar williamwilliam%include swig-3.0.12/Lib/python/boost_shared_ptr.i0000664000175000017500000003764713042756442020220 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif %fragment("SWIG_null_deleter_python", "header", fragment="SWIG_null_deleter") { %#define SWIG_NO_NULL_DELETER_SWIG_BUILTIN_INIT } // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter_python") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 && *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 && **$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/stl.i0000664000175000017500000000037113042756442014120 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ #warning "stl.i not implemented for this target" #define SWIG_STL_UNIMPL swig-3.0.12/Lib/mzscheme/0000775000175000017500000000000013042756442014756 5ustar williamwilliamswig-3.0.12/Lib/mzscheme/std_deque.i0000664000175000017500000000003413042756442017102 0ustar williamwilliam%include swig-3.0.12/Lib/mzscheme/std_vector.i0000664000175000017500000004262313042756442017313 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // MzScheme as much as possible, namely, to allow the user to pass and // be returned MzScheme vectors or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a MzScheme sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a MzScheme vector of T:s // is returned which is most easily used in other MzScheme functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { %typemap(in) vector { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); $1 = std::vector(size); Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i(); } else if (SCHEME_PAIRP($input)) { Scheme_Object *head, *tail; $1 = std::vector(); tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); $1.push_back(*((T*)SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); temp = std::vector(size); $1 = &temp; Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::vector(); $1 = &temp; Scheme_Object *head, *tail; tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); temp.push_back(*((T*) SWIG_MustGetPtr(head, $descriptor(T *), $argnum, 0))); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) vector { $result = scheme_make_vector($1.size(),scheme_undefined); Scheme_Object** els = SCHEME_VEC_ELS($result); for (unsigned int i=0; i<$1.size(); i++) { T* x = new T((($1_type &)$1)[i]); els[i] = SWIG_NewPointerObj(x,$descriptor(T *), 1); } } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); if (SWIG_ConvertPtr(items[0],(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector* v; if (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); if (SWIG_ConvertPtr(items[0],(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); if (SWIG_ConvertPtr(head,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { /* wrapped vector? */ std::vector* v; if (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } public: vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector&); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(const T& x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T& ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { %typemap(in) vector { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); $1 = std::vector(size); Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i", $argnum - 1, argc, argv); } } else if (SCHEME_NULLP($input)) { $1 = std::vector(); } else if (SCHEME_PAIRP($input)) { Scheme_Object *head, *tail; $1 = std::vector(); tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); if (CHECK(head)) $1.push_back((T)(CONVERT_FROM(head))); else scheme_wrong_type(FUNC_NAME, "vector<" #T ">", $argnum - 1, argc, argv); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const vector& (std::vector temp), const vector* (std::vector temp) { if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); temp = std::vector(size); $1 = &temp; Scheme_Object** items = SCHEME_VEC_ELS($input); for (unsigned int i=0; i", $argnum - 1, argc, argv); } } else if (SCHEME_NULLP($input)) { temp = std::vector(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::vector(); $1 = &temp; Scheme_Object *head, *tail; tail = $input; while (!SCHEME_NULLP(tail)) { head = scheme_car(tail); tail = scheme_cdr(tail); if (CHECK(head)) temp.push_back((T)(CONVERT_FROM(head))); else scheme_wrong_type(FUNC_NAME, "vector<" #T ">", $argnum - 1, argc, argv); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum - 1, 0); } } %typemap(out) vector { $result = scheme_make_vector($1.size(),scheme_undefined); Scheme_Object** els = SCHEME_VEC_ELS($result); for (unsigned int i=0; i<$1.size(); i++) els[i] = CONVERT_TO((($1_type &)$1)[i]); } %typecheck(SWIG_TYPECHECK_VECTOR) vector { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); $1 = CHECK(items[0]) ? 1 : 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $&1_descriptor, 0) != -1) ? 1 : 0; } } %typecheck(SWIG_TYPECHECK_VECTOR) const vector&, const vector* { /* native sequence? */ if (SCHEME_VECTORP($input)) { unsigned int size = SCHEME_VEC_SIZE($input); if (size == 0) { /* an empty sequence can be of any type */ $1 = 1; } else { /* check the first element only */ T* x; Scheme_Object** items = SCHEME_VEC_ELS($input); $1 = CHECK(items[0]) ? 1 : 0; } } else if (SCHEME_NULLP($input)) { /* again, an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ T* x; Scheme_Object *head = scheme_car($input); $1 = CHECK(head) ? 1 : 0; } else { /* wrapped vector? */ std::vector* v; $1 = (SWIG_ConvertPtr($input,(void **) &v, $1_descriptor, 0) != -1) ? 1 : 0; } } public: vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector&); %rename(length) size; unsigned int size() const; %rename("empty?") empty; bool empty() const; %rename("clear!") clear; void clear(); %rename("set!") set; %rename("pop!") pop; %rename("push!") push_back; void push_back(T x); %extend { T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } T ref(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* Common SWIG API */ #define SWIG_ConvertPtr(s, result, type, flags) \ SWIG_MzScheme_ConvertPtr(s, result, type, flags) #define SWIG_NewPointerObj(ptr, type, owner) \ SWIG_MzScheme_NewPointerObj((void *)ptr, type, owner) #define SWIG_MustGetPtr(s, type, argnum, flags) \ SWIG_MzScheme_MustGetPtr(s, type, argnum, flags, FUNC_NAME, argc, argv) #define SWIG_contract_assert(expr,msg) \ if (!(expr)) { \ char *m=(char *) scheme_malloc(strlen(msg)+1000); \ sprintf(m,"SWIG contract, assertion failed: function=%s, message=%s", \ (char *) FUNC_NAME,(char *) msg); \ scheme_signal_error(m); \ } /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_MzScheme_GetModule((Scheme_Env *)(clientdata)) #define SWIG_SetModule(clientdata, pointer) SWIG_MzScheme_SetModule((Scheme_Env *) (clientdata), pointer) #define SWIG_MODULE_CLIENTDATA_TYPE Scheme_Env * /* MzScheme-specific SWIG API */ #define SWIG_malloc(size) SWIG_MzScheme_Malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) #define SWIG_NewStructFromPtr(ptr,type) \ _swig_convert_struct_##type##(ptr) #define MAXVALUES 6 #define swig_make_boolean(b) (b ? scheme_true : scheme_false) static long SWIG_convert_integer(Scheme_Object *o, long lower_bound, long upper_bound, const char *func_name, int argnum, int argc, Scheme_Object **argv) { long value; int status = scheme_get_int_val(o, &value); if (!status) scheme_wrong_type(func_name, "integer", argnum, argc, argv); if (value < lower_bound || value > upper_bound) scheme_wrong_type(func_name, "integer", argnum, argc, argv); return value; } static int SWIG_is_integer(Scheme_Object *o) { long value; return scheme_get_int_val(o, &value); } static unsigned long SWIG_convert_unsigned_integer(Scheme_Object *o, unsigned long lower_bound, unsigned long upper_bound, const char *func_name, int argnum, int argc, Scheme_Object **argv) { unsigned long value; int status = scheme_get_unsigned_int_val(o, &value); if (!status) scheme_wrong_type(func_name, "integer", argnum, argc, argv); if (value < lower_bound || value > upper_bound) scheme_wrong_type(func_name, "integer", argnum, argc, argv); return value; } static int SWIG_is_unsigned_integer(Scheme_Object *o) { unsigned long value; return scheme_get_unsigned_int_val(o, &value); } /* ----------------------------------------------------------------------- * mzscheme 30X support code * ----------------------------------------------------------------------- */ #ifndef SCHEME_STR_VAL #define MZSCHEME30X 1 #endif #ifdef MZSCHEME30X /* * This is MZSCHEME 299.100 or higher (30x). From version 299.100 of * mzscheme upwards, strings are in unicode. These functions convert * to and from utf8 encodings of these strings. NB! strlen(s) will be * the size in bytes of the string, not the actual length. */ #define SCHEME_STR_VAL(obj) SCHEME_BYTE_STR_VAL(scheme_char_string_to_byte_string(obj)) #define SCHEME_STRLEN_VAL(obj) SCHEME_BYTE_STRLEN_VAL(scheme_char_string_to_byte_string(obj)) #define SCHEME_STRINGP(obj) SCHEME_CHAR_STRINGP(obj) #define scheme_make_string(s) scheme_make_utf8_string(s) #define scheme_make_sized_string(s,l) scheme_make_sized_utf8_string(s,l) #define scheme_make_sized_offset_string(s,d,l) \ scheme_make_sized_offset_utf8_string(s,d,l) #define SCHEME_MAKE_STRING(s) scheme_make_utf8_string(s) #else #define SCHEME_MAKE_STRING(s) scheme_make_string_without_copying(s) #endif /* ----------------------------------------------------------------------- * End of mzscheme 30X support code * ----------------------------------------------------------------------- */ struct swig_mz_proxy { Scheme_Type mztype; swig_type_info *type; void *object; }; static Scheme_Type swig_type; static void mz_free_swig(void *p, void *data) { struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) p; if (SCHEME_NULLP((Scheme_Object*)p) || SCHEME_TYPE((Scheme_Object*)p) != swig_type) return; if (proxy->type) { if (proxy->type->clientdata) { ((Scheme_Prim *)proxy->type->clientdata)(1, (Scheme_Object **)&proxy); } } } static Scheme_Object * SWIG_MzScheme_NewPointerObj(void *ptr, swig_type_info *type, int owner) { struct swig_mz_proxy *new_proxy; new_proxy = (struct swig_mz_proxy *) scheme_malloc(sizeof(struct swig_mz_proxy)); new_proxy->mztype = swig_type; new_proxy->type = type; new_proxy->object = ptr; if (owner) { scheme_add_finalizer(new_proxy, mz_free_swig, NULL); } return (Scheme_Object *) new_proxy; } static int SWIG_MzScheme_ConvertPtr(Scheme_Object *s, void **result, swig_type_info *type, int flags) { swig_cast_info *cast; if (SCHEME_NULLP(s)) { *result = NULL; return 0; } else if (SCHEME_TYPE(s) == swig_type) { struct swig_mz_proxy *proxy = (struct swig_mz_proxy *) s; if (type) { cast = SWIG_TypeCheckStruct(proxy->type, type); if (cast) { int newmemory = 0; *result = SWIG_TypeCast(cast, proxy->object, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } else { return 1; } } else { *result = proxy->object; return 0; } } return 1; } static SWIGINLINE void * SWIG_MzScheme_MustGetPtr(Scheme_Object *s, swig_type_info *type, int argnum, int flags, const char *func_name, int argc, Scheme_Object **argv) { void *result; if (SWIG_MzScheme_ConvertPtr(s, &result, type, flags)) { scheme_wrong_type(func_name, type->str ? type->str : "void *", argnum - 1, argc, argv); } return result; } static SWIGINLINE void * SWIG_MzScheme_Malloc(size_t size, const char *func_name) { void *p = malloc(size); if (p == NULL) { scheme_signal_error("swig-memory-error"); } else return p; } static Scheme_Object * SWIG_MzScheme_PackageValues(int num, Scheme_Object **values) { /* ignore first value if void */ if (num > 0 && SCHEME_VOIDP(values[0])) num--, values++; if (num == 0) return scheme_void; else if (num == 1) return values[0]; else return scheme_values(num, values); } #ifndef scheme_make_inspector #define scheme_make_inspector(x,y) \ _scheme_apply(scheme_builtin_value("make-inspector"), x, y) #endif /* Function to create a new struct. */ static Scheme_Object * SWIG_MzScheme_new_scheme_struct (Scheme_Env* env, const char* basename, int num_fields, char** field_names) { Scheme_Object *new_type; int count_out, i; Scheme_Object **struct_names; Scheme_Object **vals; Scheme_Object **a = (Scheme_Object**) \ scheme_malloc(num_fields*sizeof(Scheme_Object*)); for (i=0; i #else #include #endif static char **mz_dlopen_libraries=NULL; static void **mz_libraries=NULL; static char **mz_dynload_libpaths=NULL; static void mz_set_dlopen_libraries(const char *_libs) { int i,k,n; int mz_dynload_debug=(1==0); char *extra_paths[1000]; char *EP; { char *dbg=getenv("MZ_DYNLOAD_DEBUG"); if (dbg!=NULL) { mz_dynload_debug=atoi(dbg); } } { char *ep=getenv("MZ_DYNLOAD_LIBPATH"); int i,k,j; k=0; if (ep!=NULL) { EP=strdup(ep); for(i=0,j=0;EP[i]!='\0';i++) { if (EP[i]==':') { EP[i]='\0'; extra_paths[k++]=&EP[j]; j=i+1; } } if (j!=i) { extra_paths[k++]=&EP[j]; } } else { EP=strdup(""); } extra_paths[k]=NULL; k+=1; if (mz_dynload_debug) { fprintf(stderr,"SWIG:mzscheme:MZ_DYNLOAD_LIBPATH=%s\n",(ep==NULL) ? "(null)" : ep); fprintf(stderr,"SWIG:mzscheme:extra_paths[%d]\n",k-1); for(i=0;i %p\n",libp,mz_libraries[i]); } free(libp); } } } } { int i; void *func=NULL; for(i=0;mz_dlopen_libraries[i]!=NULL && func==NULL;i++) { if (mz_libraries[i]!=NULL) { #ifdef __OS_WIN32 func=GetProcAddress(mz_libraries[i],function); #else func=dlsym(mz_libraries[i],function); #endif } if (mz_dynload_debug) { fprintf(stderr, "SWIG:mzscheme:library:%s;dlopen=%p,function=%s,func=%p\n", mz_dlopen_libraries[i],mz_libraries[i],function,func ); } } return func; } } } /* The interpreter will store a pointer to this structure in a global variable called swig-runtime-data-type-pointer. The instance of this struct is only used if no other module has yet been loaded */ struct swig_mzscheme_runtime_data { swig_module_info *module_head; Scheme_Type type; }; static struct swig_mzscheme_runtime_data swig_mzscheme_runtime_data; static swig_module_info * SWIG_MzScheme_GetModule(Scheme_Env *env) { Scheme_Object *pointer, *symbol; struct swig_mzscheme_runtime_data *data; /* first check if pointer already created */ symbol = scheme_intern_symbol("swig-runtime-data-type-pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); pointer = scheme_lookup_global(symbol, env); if (pointer && SCHEME_CPTRP(pointer)) { data = (struct swig_mzscheme_runtime_data *) SCHEME_CPTR_VAL(pointer); swig_type = data->type; return data->module_head; } else { return NULL; } } static void SWIG_MzScheme_SetModule(Scheme_Env *env, swig_module_info *module) { Scheme_Object *pointer, *symbol; struct swig_mzscheme_runtime_data *data; /* first check if pointer already created */ symbol = scheme_intern_symbol("swig-runtime-data-type-pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); pointer = scheme_lookup_global(symbol, env); if (pointer && SCHEME_CPTRP(pointer)) { data = (struct swig_mzscheme_runtime_data *) SCHEME_CPTR_VAL(pointer); swig_type = data->type; data->module_head = module; } else { /* create a new type for wrapped pointer values */ swig_type = scheme_make_type((char *)"swig"); swig_mzscheme_runtime_data.module_head = module; swig_mzscheme_runtime_data.type = swig_type; /* create a new pointer */ #ifndef MZSCHEME30X pointer = scheme_make_cptr((void *) &swig_mzscheme_runtime_data, "swig_mzscheme_runtime_data"); #else pointer = scheme_make_cptr((void *) &swig_mzscheme_runtime_data, scheme_make_byte_string("swig_mzscheme_runtime_data")); #endif scheme_add_global_symbol(symbol, pointer, env); } } #ifdef __cplusplus } #endif swig-3.0.12/Lib/mzscheme/Makefile0000664000175000017500000000003513042756442016414 0ustar williamwilliam co: co RCS/*.i* RCS/*.swg* swig-3.0.12/Lib/mzscheme/std_common.i0000664000175000017500000000104213042756442017267 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %{ #include SWIGINTERNINLINE std::string swig_scm_to_string(Scheme_Object *x) { return std::string(SCHEME_STR_VAL(x)); } SWIGINTERNINLINE Scheme_Object *swig_make_string(const std::string &s) { return scheme_make_string(s.c_str()); } %} swig-3.0.12/Lib/mzscheme/typemaps.i0000664000175000017500000002432513042756442017000 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * ----------------------------------------------------------------------------- */ /* The MzScheme module handles all types uniformly via typemaps. Here are the definitions. */ /* Pointers */ %typemap(in) SWIGTYPE * { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(in) void * { $1 = SWIG_MustGetPtr($input, NULL, $argnum, 0); } %typemap(varin) SWIGTYPE * { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, 1, 0); } %typemap(varin) SWIGTYPE & { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE && { $1 = *(($1_ltype)SWIG_MustGetPtr($input, $descriptor, 1, 0)); } %typemap(varin) SWIGTYPE [ANY] { void *temp; int ii; $1_basetype *b = 0; temp = SWIG_MustGetPtr($input, $1_descriptor, 1, 0); b = ($1_basetype *) $1; for (ii = 0; ii < $1_size; ii++) b[ii] = *(($1_basetype *) temp + ii); } %typemap(varin) void * { $1 = SWIG_MustGetPtr($input, NULL, 1, 0); } %typemap(out) SWIGTYPE * { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE *DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } %typemap(varout) SWIGTYPE *, SWIGTYPE [] { $result = SWIG_NewPointerObj ($1, $descriptor, 0); } %typemap(varout) SWIGTYPE & { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } %typemap(varout) SWIGTYPE && { $result = SWIG_NewPointerObj((void *) &$1, $1_descriptor, 0); } /* C++ References */ #ifdef __cplusplus %typemap(in) SWIGTYPE &, SWIGTYPE && { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); if ($1 == NULL) scheme_signal_error("swig-type-error (null reference)"); } %typemap(out) SWIGTYPE &, SWIGTYPE && { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } %typemap(out) SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor,(void **) &$1); $result = SWIG_NewPointerObj ($1, ty, $owner); } #endif /* Arrays */ %typemap(in) SWIGTYPE[] { $1 = ($ltype) SWIG_MustGetPtr($input, $descriptor, $argnum, 0); } %typemap(out) SWIGTYPE[] { $result = SWIG_NewPointerObj ($1, $descriptor, $owner); } /* Enums */ %typemap(in) enum SWIGTYPE { if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", $argnum - 1, argc, argv); $1 = ($1_type) SWIG_convert_int($input); } %typemap(varin) enum SWIGTYPE { if (!SWIG_is_integer($input)) scheme_wrong_type(FUNC_NAME, "integer", 0, argc, argv); $1 = ($1_type) SWIG_convert_int($input); } %typemap(out) enum SWIGTYPE "$result = scheme_make_integer_value($1);"; %typemap(varout) enum SWIGTYPE "$result = scheme_make_integer_value($1);"; /* Pass-by-value */ %typemap(in) SWIGTYPE($&1_ltype argp) { argp = ($&1_ltype) SWIG_MustGetPtr($input, $&1_descriptor, $argnum, 0); $1 = *argp; } %typemap(varin) SWIGTYPE { $&1_ltype argp; argp = ($&1_ltype) SWIG_MustGetPtr($input, $&1_descriptor, 1, 0); $1 = *argp; } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 1); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 1); } #endif %typemap(varout) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultptr; resultptr = new $1_ltype(($1_ltype &) $1); $result = SWIG_NewPointerObj (resultptr, $&1_descriptor, 0); } #else { $&1_ltype resultptr; resultptr = ($&1_ltype) malloc(sizeof($1_type)); memmove(resultptr, &$1, sizeof($1_type)); $result = SWIG_NewPointerObj(resultptr, $&1_descriptor, 0); } #endif /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. */ %define SIMPLE_MAP(C_NAME, MZ_PREDICATE, MZ_TO_C, C_TO_MZ, MZ_NAME) %typemap(in) C_NAME { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, $argnum - 1, argc, argv); $1 = MZ_TO_C($input); } %typemap(varin) C_NAME { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, 0, argc, argv); $1 = MZ_TO_C($input); } %typemap(out) C_NAME { $result = C_TO_MZ($1); } %typemap(varout) C_NAME { $result = C_TO_MZ($1); } %typemap(in) C_NAME *INPUT (C_NAME temp) { temp = (C_NAME) MZ_TO_C($input); $1 = &temp; } %typemap(in,numinputs=0) C_NAME *OUTPUT (C_NAME temp) { $1 = &temp; } %typemap(argout) C_NAME *OUTPUT { Scheme_Object *s; s = C_TO_MZ(*$1); SWIG_APPEND_VALUE(s); } %typemap(in) C_NAME *BOTH = C_NAME *INPUT; %typemap(argout) C_NAME *BOTH = C_NAME *OUTPUT; %typemap(in) C_NAME *INOUT = C_NAME *INPUT; %typemap(argout) C_NAME *INOUT = C_NAME *OUTPUT; %enddef SIMPLE_MAP(bool, SCHEME_BOOLP, SCHEME_TRUEP, swig_make_boolean, boolean); SIMPLE_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); SIMPLE_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); SIMPLE_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); SIMPLE_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); SIMPLE_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); SIMPLE_MAP(ptrdiff_t, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); SIMPLE_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(size_t, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); SIMPLE_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); SIMPLE_MAP(double, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); SIMPLE_MAP(char *, SCHEME_STRINGP, SCHEME_STR_VAL, SCHEME_MAKE_STRING, string); SIMPLE_MAP(const char *, SCHEME_STRINGP, SCHEME_STR_VAL, SCHEME_MAKE_STRING, string); /* For MzScheme 30x: Use these typemaps if you are not going to use UTF8 encodings in your C code. SIMPLE_MAP(char *,SCHEME_BYTE_STRINGP, SCHEME_BYTE_STR_VAL, scheme_make_byte_string_without_copying,bytestring); SIMPLE_MAP(const char *,SCHEME_BYTE_STRINGP, SCHEME_BYTE_STR_VAL, scheme_make_byte_string_without_copying,bytestring); */ /* Const primitive references. Passed by value */ %define REF_MAP(C_NAME, MZ_PREDICATE, MZ_TO_C, C_TO_MZ, MZ_NAME) %typemap(in) const C_NAME & (C_NAME temp) { if (!MZ_PREDICATE($input)) scheme_wrong_type(FUNC_NAME, #MZ_NAME, $argnum - 1, argc, argv); temp = MZ_TO_C($input); $1 = &temp; } %typemap(out) const C_NAME & { $result = C_TO_MZ(*$1); } %enddef REF_MAP(bool, SCHEME_BOOLP, SCHEME_TRUEP, swig_make_boolean, boolean); REF_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); REF_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL, scheme_make_character, character); REF_MAP(int, SWIG_is_integer, SWIG_convert_int, scheme_make_integer_value, integer); REF_MAP(short, SWIG_is_integer, SWIG_convert_short, scheme_make_integer_value, integer); REF_MAP(long, SWIG_is_integer, SWIG_convert_long, scheme_make_integer_value, integer); REF_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int, scheme_make_integer_value_from_unsigned, integer); REF_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short, scheme_make_integer_value_from_unsigned, integer); REF_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long, scheme_make_integer_value_from_unsigned, integer); REF_MAP(float, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); REF_MAP(double, SCHEME_REALP, scheme_real_to_double, scheme_make_double, real); /* Void */ %typemap(out) void "$result = scheme_void;"; /* Pass through Scheme_Object * */ %typemap (in) Scheme_Object * "$1=$input;"; %typemap (out) Scheme_Object * "$result=$1;"; %typecheck(SWIG_TYPECHECK_POINTER) Scheme_Object * "$1=1;"; /* ------------------------------------------------------------ * String & length * ------------------------------------------------------------ */ //%typemap(in) (char *STRING, int LENGTH) { // int temp; // $1 = ($1_ltype) SWIG_Guile_scm2newstr($input, &temp); // $2 = ($2_ltype) temp; //} /* ------------------------------------------------------------ * Typechecking rules * ------------------------------------------------------------ */ %typecheck(SWIG_TYPECHECK_INTEGER) int, short, long, unsigned int, unsigned short, unsigned long, signed char, unsigned char, long long, unsigned long long, const int &, const short &, const long &, const unsigned int &, const unsigned short &, const unsigned long &, const long long &, const unsigned long long &, enum SWIGTYPE { $1 = (SWIG_is_integer($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_BOOL) bool, bool &, const bool & { $1 = (SCHEME_BOOLP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_DOUBLE) float, double, const float &, const double & { $1 = (SCHEME_REALP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char { $1 = (SCHEME_STRINGP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_STRING) char * { $1 = (SCHEME_STRINGP($input)) ? 1 : 0; } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, $&1_descriptor, 0)) { $1 = 0; } else { $1 = 1; } } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; if (SWIG_ConvertPtr($input, (void **) &ptr, 0, 0)) { $1 = 0; } else { $1 = 1; } } /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } swig-3.0.12/Lib/mzscheme/std_pair.i0000664000175000017500000012541313042756442016743 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // // See std_vector.i for the rationale of typemap application // ------------------------------------------------------------------------ %{ #include %} // exported class namespace std { template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(*x,*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = std::make_pair(*x,*y); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { T* x = new T($1.first); U* y = new U($1.second); Scheme_Object* first = SWIG_NewPointerObj(x,$descriptor(T *), 1); Scheme_Object* second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scheme_make_pair(first,second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // specializations for built-ins %define specialize_std_pair_on_first(T,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); $1 = std::make_pair(CONVERT_FROM(first),*y); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { U* y; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK(first)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); y = (U*) SWIG_MustGetPtr(second,$descriptor(U *),$argnum, 0); temp = std::make_pair(CONVERT_FROM(first),*y); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { U* y = new U($1.second); Scheme_Object* second = SWIG_NewPointerObj(y,$descriptor(U *), 1); $result = scheme_make_pair(CONVERT_TO($1.first),second); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { U* y; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK(first) && SWIG_ConvertPtr(second,(void**) &y, $descriptor(U *), 0) != -1) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; %enddef %define specialize_std_pair_on_second(U,CHECK,CONVERT_FROM,CONVERT_TO) template struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = std::make_pair(*x,CONVERT_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { T* x; Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = std::make_pair(*x,CONVERT_FROM(second)); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { T* x = new T($1.first); Scheme_Object* first = SWIG_NewPointerObj(x,$descriptor(T *), 1); $result = scheme_make_pair(first,CONVERT_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { T* x; Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (SWIG_ConvertPtr(first,(void**) &x, $descriptor(T *), 0) != -1 && CHECK(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; %enddef %define specialize_std_pair_on_both(T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO, U,CHECK_U,CONVERT_U_FROM,CONVERT_U_TO) template<> struct pair { %typemap(in) pair (std::pair* m) { if (SCHEME_PAIRP($input)) { Scheme_Object *first, *second; first = scheme_car($input); second = scheme_cdr($input); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); $1 = make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const pair& (std::pair temp, std::pair* m), const pair* (std::pair temp, std::pair* m) { if (SCHEME_PAIRP($input)) { Scheme_Object *first, *second; T *x; first = scheme_car($input); second = scheme_cdr($input); x = (T*) SWIG_MustGetPtr(first,$descriptor(T *),$argnum, 0); if (!CHECK_T(first) || !CHECK_U(second)) SWIG_exception(SWIG_TypeError, "pair<" #T "," #U "> expected"); temp = make_pair(CONVERT_T_FROM(first), CONVERT_U_FROM(second)); $1 = &temp; } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) pair { $result = scheme_make_pair(CONVERT_T_TO($1.first), CONVERT_U_TO($1.second)); } %typecheck(SWIG_TYPECHECK_PAIR) pair { /* native pair? */ if (SCHEME_PAIRP($input)) { Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_PAIR) const pair&, const pair* { /* native pair? */ if (SCHEME_PAIRP($input)) { Scheme_Object* first = scheme_car($input); Scheme_Object* second = scheme_cdr($input); if (CHECK_T(first) && CHECK_U(second)) { $1 = 1; } else { $1 = 0; } } else { /* wrapped pair? */ std::pair* p; if (SWIG_ConvertPtr($input,(void **) &p, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; %enddef specialize_std_pair_on_first(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_first(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_first(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_first(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_first(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_second(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_second(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_second(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_second(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_second(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_pair_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); } swig-3.0.12/Lib/mzscheme/mzscheme.swg0000664000175000017500000000346413042756442017322 0ustar williamwilliam/* ----------------------------------------------------------------------------- * mzscheme.swg * * SWIG Configuration File for MzScheme. * This file is parsed by SWIG before reading any other interface file. * ----------------------------------------------------------------------------- */ /* Include headers */ %runtime "swigrun.swg" // Common C API type-checking code %runtime "mzrun.swg" %define SWIG_APPEND_VALUE(value) values[lenv++] = value %enddef /* Definitions */ #define SWIG_malloc(size) swig_malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) #define SWIG_convert_short(o) \ SWIG_convert_integer(o, - (1 << (8 * sizeof(short) - 1)), \ (1 << (8 * sizeof(short) - 1)) - 1, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_int(o) \ SWIG_convert_integer(o, INT_MIN, INT_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_long(o) \ SWIG_convert_integer(o, LONG_MIN, LONG_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_short(o) \ SWIG_convert_unsigned_integer(o, 0, \ (1 << (8 * sizeof(short))) - 1, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_int(o) \ SWIG_convert_unsigned_integer(o, 0, UINT_MAX, \ FUNC_NAME, $argnum-1, argc, argv) #define SWIG_convert_unsigned_long(o) \ SWIG_convert_unsigned_integer(o, 0, ULONG_MAX, \ FUNC_NAME, $argnum-1, argc, argv) /* Guile compatibility kludges */ #define SCM_VALIDATE_VECTOR(argnum, value) (void)0 #define SCM_VALIDATE_LIST(argnum, value) (void)0 /* Read in standard typemaps. */ %include %insert(init) "swiginit.swg" %init %{ Scheme_Object *scheme_reload(Scheme_Env *env) { Scheme_Env *menv = SWIG_MZSCHEME_CREATE_MENV(env); SWIG_InitializeModule((void *) env); %} swig-3.0.12/Lib/mzscheme/stl.i0000664000175000017500000000054413042756442015735 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/mzscheme/std_string.i0000664000175000017500000000263313042756442017314 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string types * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; /* Overloading check */ %typemap(typecheck) string = char *; %typemap(typecheck) const string & = char *; %typemap(in) string { if (SCHEME_STRINGP($input)) $1.assign(SCHEME_STR_VAL($input)); else SWIG_exception(SWIG_TypeError, "string expected"); } %typemap(in) const string & ($*1_ltype temp) { if (SCHEME_STRINGP($input)) { temp.assign(SCHEME_STR_VAL($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(out) string { $result = scheme_make_string($1.c_str()); } %typemap(out) const string & { $result = scheme_make_string($1->c_str()); } } swig-3.0.12/Lib/mzscheme/std_map.i0000664000175000017500000017617413042756442016577 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // // The aim of all that follows would be to integrate std::map with // MzScheme as much as possible, namely, to allow the user to pass and // be returned Scheme association lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::map), f(const std::map&), f(const std::map*): // the parameter being read-only, either a Scheme alist or a // previously wrapped std::map can be passed. // -- f(std::map&), f(std::map*): // the parameter must be modified; therefore, only a wrapped std::map // can be passed. // -- std::map f(): // the map is returned by copy; therefore, a Scheme alist // is returned which is most easily used in other Scheme functions // -- std::map& f(), std::map* f(), const std::map& f(), // const std::map* f(): // the map is returned by reference; therefore, a wrapped std::map // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { %typemap(in) map (std::map* m) { if (SCHEME_NULLP($input)) { $1 = std::map(); } else if (SCHEME_PAIRP($input)) { $1 = std::map(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[*k] = *x; alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp, std::map* m), const map* (std::map temp, std::map* m) { if (SCHEME_NULLP($input)) { temp = std::map(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[*k] = *x; alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { Scheme_Object* alist = scheme_null; for (std::map::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); T* val = new T(i->second); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); Scheme_Object* x = SWIG_NewPointerObj(val,$descriptor(T *), 1); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { /* native sequence? */ if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ K* k; T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { /* native sequence? */ if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { /* check the first element only */ K* k; T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(key,(void**) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { /* wrapped map? */ std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, const T& x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scheme_make_pair(k,result); } return result; } } }; // specializations for built-ins %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) template class map { %typemap(in) map (std::map* m) { if (SCHEME_NULLP($input)) { $1 = std::map(); } else if (SCHEME_PAIRP($input)) { $1 = std::map(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } (($1_type &)$1)[CONVERT_FROM(key)] = *x; alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp, std::map* m), const map* (std::map temp, std::map* m) { if (SCHEME_NULLP($input)) { temp = std::map(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { T* x; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) == -1) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); x = (T*) SWIG_MustGetPtr(val,$descriptor(T *),$argnum, 0); } temp[CONVERT_FROM(key)] = *x; alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { Scheme_Object* alist = scheme_null; for (std::map::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { T* val = new T(i->second); Scheme_Object* k = CONVERT_TO(i->first); Scheme_Object* x = SWIG_NewPointerObj(val,$descriptor(T *), 1); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only T* x; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK(key)) { $1 = 0; } else { if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (SWIG_ConvertPtr(val,(void**) &x, $descriptor(T *), 0) != -1) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { T& __getitem__(K key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, const T& x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { Scheme_Object* k = CONVERT_TO(i->first); result = scheme_make_pair(k,result); } return result; } } }; %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) template class map { %typemap(in) map (std::map* m) { if (SCHEME_NULLP($input)) { $1 = std::map(); } else if (SCHEME_PAIRP($input)) { $1 = std::map(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } (($1_type &)$1)[*k] = CONVERT_FROM(val); alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp, std::map* m), const map* (std::map temp, std::map* m) { if (SCHEME_NULLP($input)) { temp = std::map(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { K* k; Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); k = (K*) SWIG_MustGetPtr(key,$descriptor(K *),$argnum, 0); if (!CHECK(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } temp[*k] = CONVERT_FROM(val); alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { Scheme_Object* alist = scheme_null; for (std::map::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); Scheme_Object* x = CONVERT_TO(i->second); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only K* k; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only K* k; Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (SWIG_ConvertPtr(val,(void **) &k, $descriptor(K *), 0) == -1) { $1 = 0; } else { if (CHECK(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(const K& key, T x) { (*self)[key] = x; } void __delitem__(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { K* key = new K(i->first); Scheme_Object* k = SWIG_NewPointerObj(key,$descriptor(K *), 1); result = scheme_make_pair(k,result); } return result; } } }; %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) template<> class map { %typemap(in) map (std::map* m) { if (SCHEME_NULLP($input)) { $1 = std::map(); } else if (SCHEME_PAIRP($input)) { $1 = std::map(); Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (!CHECK_T(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } (($1_type &)$1)[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = scheme_cdr(alist); } } else { $1 = *(($&1_type) SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0)); } } %typemap(in) const map& (std::map temp, std::map* m), const map* (std::map temp, std::map* m) { if (SCHEME_NULLP($input)) { temp = std::map(); $1 = &temp; } else if (SCHEME_PAIRP($input)) { temp = std::map(); $1 = &temp; Scheme_Object* alist = $input; while (!SCHEME_NULLP(alist)) { Scheme_Object *entry, *key, *val; entry = scheme_car(alist); if (!SCHEME_PAIRP(entry)) SWIG_exception(SWIG_TypeError,"alist expected"); key = scheme_car(entry); val = scheme_cdr(entry); if (!CHECK_K(key)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); if (!CHECK_T(val)) { if (!SCHEME_PAIRP(val)) SWIG_exception(SWIG_TypeError,"alist expected"); val = scheme_car(val); if (!CHECK_T(val)) SWIG_exception(SWIG_TypeError, "map<" #K "," #T "> expected"); } temp[CONVERT_K_FROM(key)] = CONVERT_T_FROM(val); alist = scheme_cdr(alist); } } else { $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0); } } %typemap(out) map { Scheme_Object* alist = scheme_null; for (std::map::reverse_iterator i=$1.rbegin(); i!=$1.rend(); ++i) { Scheme_Object* k = CONVERT_K_TO(i->first); Scheme_Object* x = CONVERT_T_TO(i->second); Scheme_Object* entry = scheme_make_pair(k,x); alist = scheme_make_pair(entry,alist); } $result = alist; } %typecheck(SWIG_TYPECHECK_MAP) map { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $&1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %typecheck(SWIG_TYPECHECK_MAP) const map&, const map* { // native sequence? if (SCHEME_NULLP($input)) { /* an empty sequence can be of any type */ $1 = 1; } else if (SCHEME_PAIRP($input)) { // check the first element only Scheme_Object* head = scheme_car($input); if (SCHEME_PAIRP(head)) { Scheme_Object* key = scheme_car(head); Scheme_Object* val = scheme_cdr(head); if (!CHECK_K(key)) { $1 = 0; } else { if (CHECK_T(val)) { $1 = 1; } else if (SCHEME_PAIRP(val)) { val = scheme_car(val); if (CHECK_T(val)) $1 = 1; else $1 = 0; } else { $1 = 0; } } } else { $1 = 0; } } else { // wrapped map? std::map* m; if (SWIG_ConvertPtr($input,(void **) &m, $1_descriptor, 0) != -1) $1 = 1; else $1 = 0; } } %rename("length") size; %rename("null?") empty; %rename("clear!") clear; %rename("ref") __getitem__; %rename("set!") __setitem__; %rename("delete!") __delitem__; %rename("has-key?") has_key; public: map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { T __getitem__(K key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void __setitem__(K key, T x) { (*self)[key] = x; } void __delitem__(K key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(K key) { std::map::iterator i = self->find(key); return i != self->end(); } Scheme_Object* keys() { Scheme_Object* result = scheme_null; for (std::map::reverse_iterator i=self->rbegin(); i!=self->rend(); ++i) { Scheme_Object* k = CONVERT_K_TO(i->first); result = scheme_make_pair(k,result); } return result; } } }; %enddef specialize_std_map_on_key(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_key(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_key(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_key(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_key(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_value(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_value(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_value(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_value(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_value(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(double,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(float,SCHEME_REALP, scheme_real_to_double,scheme_make_double, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, bool,SCHEME_BOOLP, SCHEME_TRUEP,swig_make_boolean); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned int,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned short,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, unsigned long,SCHEME_INTP, SCHEME_INT_VAL,scheme_make_integer_value); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, double,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, float,SCHEME_REALP, scheme_real_to_double,scheme_make_double); specialize_std_map_on_both(std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string, std::string,SCHEME_STRINGP, swig_scm_to_string,swig_make_string); } swig-3.0.12/Lib/scilab/0000775000175000017500000000000013042756442014400 5ustar williamwilliamswig-3.0.12/Lib/scilab/std_deque.i0000664000175000017500000000144213042756442016530 0ustar williamwilliam/* * * C++ type : STL deque * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdDequeTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::deque **deq) { return traits_asptr_stdseq >::asptr(obj, deq); } }; template struct traits_from > { static SwigSciObject from(const std::deque& deq) { return traits_from_stdseq >::from(deq); } }; } %} #define %swig_deque_methods(Type...) %swig_sequence_methods(Type) #define %swig_deque_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/scilab/scistdcommon.swg0000664000175000017500000001407213042756442017630 0ustar williamwilliam%fragment("StdTraits","header",fragment="StdTraitsCommon") { namespace swig { // Traits that provides the from method template struct traits_from_ptr { static SwigSciObject from(Type *val, int owner = 0) { return SWIG_OK; //SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static SwigSciObject from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static SwigSciObject from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static SwigSciObject from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline SwigSciObject from(const Type& val) { return traits_from::from(val); } template inline SwigSciObject from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } // Traits that provides the asval/as/check method template struct traits_asptr { static int asptr(const SwigSciObject& obj, Type **val) { Type *p; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(const SwigSciObject& obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(const SwigSciObject& obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ %delete(p); res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(const SwigSciObject& obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(const SwigSciObject& obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(const SwigSciObject& obj, bool throw_error) { Type v; int res = asval(obj, &v); if (SWIG_IsOK(res)) { return v; } else { %type_error(swig::type_name()); if (throw_error) throw std::invalid_argument("bad type"); return res; } } }; template struct traits_as { static Type as(const SwigSciObject& obj, bool throw_error) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); %delete(v); return r; } else { return *v; } } else { // Uninitialized return value, no Type() constructor required. static Type *v_def = (Type*) malloc(sizeof(Type)); %type_error(swig::type_name()); if (throw_error) throw std::invalid_argument("bad type"); memset(v_def,0,sizeof(Type)); return *v_def; } } }; template struct traits_as { static Type* as(const SwigSciObject& obj, bool throw_error) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { %type_error(swig::type_name()); if (throw_error) throw std::invalid_argument("bad type"); return SWIG_OK; } } }; template inline Type as(const SwigSciObject& obj, bool te = false) { return traits_as::category>::as(obj, te); } template struct traits_check { static bool check(const SwigSciObject& obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(const SwigSciObject& obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(const SwigSciObject& obj) { return traits_check::category>::check(obj); } } } %define %specialize_std_container(Type,Check,As,From) %{ namespace swig { template <> struct traits_asval { typedef Type value_type; static int asval(const SwigSciObject& obj, value_type *val) { if (Check(obj)) { if (val) *val = As(obj); return SWIG_OK; } return SWIG_ERROR; } }; template <> struct traits_from { typedef Type value_type; static SwigSciObject from(const value_type& val) { return From(val); } }; template <> struct traits_check { static int check(const SwigSciObject& obj) { int res = Check(obj); return obj && res ? res : 0; } }; } %} %enddef #define specialize_std_vector(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_list(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_deque(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_set(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) #define specialize_std_multiset(Type,Check,As,From) %specialize_std_container(%arg(Type),Check,As,From) swig-3.0.12/Lib/scilab/scifloat.swg0000664000175000017500000000425213042756442016731 0ustar williamwilliam/* * FLOAT SCALAR */ %fragment(SWIG_AsVal_frag(float), "header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(float)(SwigSciObject iVar, float *pfValue) { double dblValue = 0.0; if(SWIG_AsVal_dec(double)(iVar, &dblValue) != SWIG_OK) { return SWIG_ERROR; } if (pfValue) *pfValue = (float) dblValue; return SWIG_OK; } } %fragment(SWIG_From_frag(float), "header") { SWIGINTERN int SWIG_From_dec(float)(float flValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(), (double)flValue)) return SWIG_ERROR; return SWIG_OK; } } %fragment("SWIG_SciDouble_AsFloatArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_AsFloatArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, float **pfValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; double *pdValue = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar) && !isVarComplex(pvApiCtx, piAddrVar)) { int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *pfValue = (float *) malloc((*iRows) * (*iCols) * sizeof(float)); for (i=0; i < (*iRows) * (*iCols); i++) (*pfValue)[i] = (float) pdValue[i]; return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, iVar); return SWIG_ERROR; } } } %fragment("SWIG_SciDouble_FromFloatArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromFloatArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, float *pfValue) { SciErr sciErr; double *pdValue; int i; pdValue = (double *) malloc(iRows * iCols * sizeof(double)); for (i = 0; i < iRows * iCols; i++) pdValue[i] = pfValue[i]; sciErr = createMatrixOfDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } free(pdValue); return SWIG_OK; } } swig-3.0.12/Lib/scilab/scipointer.swg0000664000175000017500000000262613042756442017307 0ustar williamwilliam/* * POINTER */ %fragment("SWIG_ConvertPtr", "header") { #define SWIG_ConvertPtr(scilabValue, voidPointer, pointerDescriptor, flags) SwigScilabPtrToObject(pvApiCtx, scilabValue, voidPointer, pointerDescriptor, flags, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_NewPointerObj", "header") { #define SWIG_NewPointerObj(pointer, pointerDescriptor, flags) SwigScilabPtrFromObject(pvApiCtx, SWIG_Scilab_GetOutputPosition(), pointer, pointerDescriptor, flags, NULL) } /* * FUNCTION POINTER */ %fragment("SWIG_ConvertFunctionPtr", "header") { #define SWIG_ConvertFunctionPtr(scilabValue, voidPointer, pointerDescriptor) SwigScilabPtrToObject(pvApiCtx, scilabValue, voidPointer, pointerDescriptor, 0, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_NewFunctionPtrObj", "header") { #define SWIG_NewFunctionPtrObj(pointer, pointerDescriptor) SwigScilabPtrFromObject(pvApiCtx, SWIG_Scilab_GetOutputPosition(), pointer, pointerDescriptor, 0, NULL) } // No fragment used here, the functions "SwigScilabPtrToObject" and "SwigScilabPtrFromObject" are defined in sciruntime.swg /* * C++ member pointers, ie, member methods */ %fragment("SWIG_NewMemberObj", "header") { #define SWIG_NewMemberObj(ptr, sz, tp) SWIG_Scilab_NewMemberObj(pvApiCtx, $result, ptr, sz, tp) } %fragment("SWIG_ConvertMember", "header") { #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Scilab_ConvertPacked(pvApiCtx, obj, ptr, sz, ty, SWIG_Scilab_GetFuncName()) } swig-3.0.12/Lib/scilab/scidouble.swg0000664000175000017500000000636013042756442017100 0ustar williamwilliam/* * DOUBLE SCALAR */ %fragment(SWIG_AsVal_frag(double), "header", fragment="SWIG_SciDouble_AsDouble") { %#define SWIG_AsVal_double(scilabValue, valuePointer) SWIG_SciDouble_AsDouble(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_AsDouble", "header") { SWIGINTERN int SWIG_SciDouble_AsDouble(void *pvApiCtx, SwigSciObject iVar, double *pdblValue, char *fname) { SciErr sciErr; int iRet = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (!isDoubleType(pvApiCtx, piAddrVar) || isVarComplex(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real expected.\n"), fname, iVar); return SWIG_ERROR; } if (!isScalar(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A real expected.\n"), fname, iVar); return SWIG_ERROR; } iRet = getScalarDouble(pvApiCtx, piAddrVar, pdblValue); if (iRet) { return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(double), "header", fragment="SWIG_SciDouble_FromDouble") { %#define SWIG_From_double(scilabValue) SWIG_SciDouble_FromDouble(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromDouble", "header") { SWIGINTERN int SWIG_SciDouble_FromDouble(void *pvApiCtx, int iVarOut, double dblValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, dblValue)) return SWIG_ERROR; return SWIG_OK; } } /* * DOUBLE ARRAY */ %fragment("SWIG_SciDouble_AsDoubleArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_AsDoubleArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, double **pdValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar) && !isVarComplex(pvApiCtx, piAddrVar)) { sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, pdValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A real matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromDoubleArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromDoubleArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, double *pdblValue) { SciErr sciErr; sciErr = createMatrixOfDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, pdblValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_CreateScilabVariable_frag(double), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(double)(void *pvApiCtx, const char* psVariableName, const double dVariableValue) { SciErr sciErr; sciErr = createNamedMatrixOfDouble(pvApiCtx, psVariableName, 1, 1, &dVariableValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-3.0.12/Lib/scilab/std_multiset.i0000664000175000017500000000152613042756442017276 0ustar williamwilliam/* * * C++ type : STL multiset * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdMultisetTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::multiset **multiset) { return traits_asptr_stdseq >::asptr(obj, multiset); } }; template struct traits_from > { static SwigSciObject from(const std::multiset& multiset) { return traits_from_stdseq >::from(multiset); } }; } %} #define %swig_multiset_methods(Set...) %swig_sequence_methods(Type) #define %swig_multiset_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/scilab/sciexception.swg0000664000175000017500000000354413042756442017625 0ustar williamwilliam/* * Exception typemaps (throws) */ %include %typemap(throws, noblock=1) int, unsigned int, signed int, int&,unsigned int&, signed int&, long, unsigned long, signed long, short, unsigned short,signed short, long long, unsigned long long, unsigned char, signed char, long&, unsigned long&, signed long&, short&, unsigned short&, signed short&, long long&, unsigned long long&, unsigned char&, signed char&, size_t, size_t&, ptrdiff_t, ptrdiff_t& { char obj[20]; sprintf(obj, "%d", (int)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) enum SWIGTYPE { char obj[20]; sprintf(obj, "%d", (int)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) float, double, float&, double& { char obj[20]; sprintf(obj, "%5.3f", (double)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) bool, bool& { SWIG_Scilab_Raise_Ex($1 ? "true" : "false", "$type", $descriptor); } %typemap(throws, noblock=1) char*, char[ANY] { SWIG_Scilab_Raise_Ex($1, "$type", $descriptor); } %typemap(throws, noblock=1) char, char& { char obj[1]; sprintf(obj, "%c", (char)$1); SWIG_Scilab_Raise_Ex(obj, "$type", $descriptor); } %typemap(throws, noblock=1) SWIGTYPE, SWIGTYPE*, SWIGTYPE [ANY], SWIGTYPE & { SWIG_Scilab_Raise_Ex((char*)NULL, "$type", $descriptor); } %typemap(throws, noblock=1) (...) { SWIG_exception(SWIG_RuntimeError, "unknown exception"); } swig-3.0.12/Lib/scilab/scirun.swg0000664000175000017500000003136113042756442016431 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Scilab support runtime * -----------------------------------------------------------------------------*/ /* Scilab version macro */ #include "version.h" #define SWIG_SCILAB_VERSION (SCI_VERSION_MAJOR * 100) + (SCI_VERSION_MINOR * 10) + SCI_VERSION_MAINTENANCE /* Scilab standard headers */ #ifdef __cplusplus extern "C" { #endif #include "api_scilab.h" #if SWIG_SCILAB_VERSION < 540 #define __USE_DEPRECATED_STACK_FUNCTIONS__ #include "stack-c.h" #endif #if SWIG_SCILAB_VERSION < 600 #include "MALLOC.h" #endif #include "Scierror.h" #include "localization.h" #include "freeArrayOfString.h" #include #include #ifdef __cplusplus } #endif /* Gateway signature */ #if SWIG_SCILAB_VERSION >= 600 #define SWIG_GatewayParameters char* fname, void *pvApiCtx #define SWIG_GatewayArguments fname, pvApiCtx #else #define SWIG_GatewayParameters char* fname, unsigned long fname_len #define SWIG_GatewayArguments fname, fname_len #endif /* Function name management functions */ #include static char *SwigFuncName = NULL; static char *SWIG_Scilab_GetFuncName(void) { return SwigFuncName; } static void SWIG_Scilab_SetFuncName(char *funcName) { if (SwigFuncName != NULL) { free(SwigFuncName); } SwigFuncName = strdup(funcName); } /* Api context management functions */ #if SWIG_SCILAB_VERSION >= 600 static void *pvApiCtx = NULL; static void SWIG_Scilab_SetApiContext(void *apiCtx) { pvApiCtx = apiCtx; } #else #define SWIG_Scilab_SetApiContext(apiCtx) #endif /* Argument management functions */ #if SWIG_SCILAB_VERSION >= 540 #define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) #define SWIG_CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) #define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) #define SWIG_NbInputArgument(pvApiCtx) nbInputArgument(pvApiCtx) #define SWIG_AssignOutputArgument(pvApiCtx, outputArgumentPos, argumentPos) AssignOutputVariable(pvApiCtx, outputArgumentPos) = argumentPos #else #define SWIG_CheckInputArgument(pvApiCtx, minInputArgument, maxInputArgument) CheckRhs(minInputArgument, maxInputArgument) #define SWIG_CheckInputArgumentAtLeast(pvApiCtx, minInputArgument) CheckRhs(minInputArgument, 256) #define SWIG_CheckOutputArgument(pvApiCtx, minOutputArgument, maxOutputArgument) CheckLhs(minOutputArgument, maxOutputArgument) #define SWIG_NbInputArgument(pvApiCtx) Rhs #define SWIG_AssignOutputArgument(pvApiCtx, outputArgumentPos, argumentPos) LhsVar(outputArgumentPos) = argumentPos #endif typedef int SwigSciObject; static int SwigOutputPosition = -1; static int SWIG_Scilab_GetOutputPosition(void) { return SwigOutputPosition; } static void SWIG_Scilab_SetOutputPosition(int outputPosition) { SwigOutputPosition = outputPosition; } SWIGRUNTIME int SWIG_Scilab_SetOutput(void *pvApiCtx, SwigSciObject output) { int outputPosition = SWIG_Scilab_GetOutputPosition(); if (outputPosition < 0) return SWIG_ERROR; SWIG_AssignOutputArgument(pvApiCtx, outputPosition, SWIG_NbInputArgument(pvApiCtx) + outputPosition); return SWIG_OK; } /* Error functions */ #define SCILAB_API_ARGUMENT_ERROR 999 SWIGINTERN const char* SWIG_Scilab_ErrorType(int code) { switch(code) { case SWIG_MemoryError: return "MemoryError"; case SWIG_IOError: return "IOError"; case SWIG_RuntimeError: return "RuntimeError"; case SWIG_IndexError: return "IndexError"; case SWIG_TypeError: return "TypeError"; case SWIG_DivisionByZero: return "ZeroDivisionError"; case SWIG_OverflowError: return "OverflowError"; case SWIG_SyntaxError: return "SyntaxError"; case SWIG_ValueError: return "ValueError"; case SWIG_SystemError: return "SystemError"; case SWIG_AttributeError: return "AttributeError"; default: return "RuntimeError"; } } #define SWIG_ErrorType(code) SWIG_Scilab_ErrorType(code) #ifndef SWIG_SCILAB_ERROR #define SWIG_SCILAB_ERROR 20000 #endif SWIGINTERN void SWIG_Scilab_Error(int code, const char *msg) { Scierror(SWIG_SCILAB_ERROR - code, _("SWIG/Scilab: %s: %s\n"), SWIG_Scilab_ErrorType(code), msg); } #define SWIG_Error(code, msg) SWIG_Scilab_Error(code, msg) #define SWIG_fail return SWIG_ERROR; SWIGRUNTIME void SWIG_Scilab_Raise_Ex(const char *obj, const char *type, swig_type_info *descriptor) { if (type) { if (obj) Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occured: %s\n", type, obj); else Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occured.\n", type); } } SWIGRUNTIME void SWIG_Scilab_Raise(const int obj, const char *type, swig_type_info *descriptor) { Scierror(SWIG_SCILAB_ERROR, "SWIG/Scilab: Exception (%s) occured.\n", type); } /* Module initialization */ static int swig_module_initialized = 0; SWIGRUNTIME int SWIG_Module_Initialized() { return swig_module_initialized; } /* Pointer conversion functions */ SWIGRUNTIME swig_type_info * SWIG_Scilab_TypeQuery(const char *name); SWIGINTERN int SwigScilabCheckPtr(void *pvApiCtx, int iVar, swig_type_info *descriptor, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int iType = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_mlist) { int iItemCount = 0; void *pvTypeinfo = NULL; sciErr = getListItemNumber(pvApiCtx, piAddrVar, &iItemCount); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iItemCount < 3) { return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 2, &pvTypeinfo); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (descriptor) { swig_cast_info *cast = SWIG_TypeCheck(SWIG_TypeName((swig_type_info*)pvTypeinfo), descriptor); return (cast != NULL); } else { return SWIG_ERROR; } } else { return (iType == sci_pointer); } } SWIGINTERN int SwigScilabPtrToObject(void *pvApiCtx, int iVar, void **pvObj, swig_type_info *descriptor, int flags, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int iType = 0; void *pvPtr = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_mlist) { int iItemCount = 0; void *pvTypeinfo = NULL; sciErr = getListItemNumber(pvApiCtx, piAddrVar, &iItemCount); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iItemCount < 3) { return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 2, &pvTypeinfo); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getPointerInList(pvApiCtx, piAddrVar, 3, &pvPtr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (pvPtr) { if (descriptor) { swig_cast_info *cast = SWIG_TypeCheck(SWIG_TypeName((swig_type_info *)pvTypeinfo), descriptor); if (cast) { int newmemory = 0; pvPtr = SWIG_TypeCast(cast, pvPtr, &newmemory); // TODO newmemory } else { return SWIG_ERROR; } } } } else if (iType == sci_pointer) { sciErr = getPointer(pvApiCtx, piAddrVar, &pvPtr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { return SWIG_ERROR; } if (pvObj) { *pvObj = pvPtr; return SWIG_OK; } else { return SWIG_ERROR; } } SWIGRUNTIMEINLINE int SwigScilabPtrFromObject(void *pvApiCtx, int iVarOut, void *pvObj, swig_type_info *descriptor, int flags, const char *pstTypeName) { SciErr sciErr; if (descriptor) { int *piMListAddr = NULL; sciErr = createMList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, 3, &piMListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (pstTypeName == NULL) { pstTypeName = SWIG_TypeName(descriptor); } sciErr = createMatrixOfStringInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 1, 1, 1, &pstTypeName); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = createPointerInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 2, descriptor); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = createPointerInList(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, piMListAddr, 3, pvObj); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { sciErr = createPointer(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, pvObj); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } return SWIG_OK; } /* Pointer argument conversions */ SWIGRUNTIME int SWIG_Scilab_ConvertPacked(void *pvApiCtx, int iVar, void *ptr, int sz, swig_type_info *ty, char *fname) { swig_cast_info *tc; int *piAddrVar = NULL; char *pstString = NULL; char *pstStringPtr = NULL; SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getAllocatedSingleString(pvApiCtx, piAddrVar, &pstString)) { return SWIG_ERROR; } /* Pointer values must start with leading underscore */ if (*pstString != '_') { freeAllocatedSingleString(pstString); return SWIG_ERROR; } pstStringPtr = pstString; pstStringPtr++; pstStringPtr = (char*)SWIG_UnpackData(pstStringPtr, ptr, sz); if (ty) { if (!pstStringPtr) { freeAllocatedSingleString(pstString); return SWIG_ERROR; } tc = SWIG_TypeCheck(pstStringPtr, ty); if (!tc) { freeAllocatedSingleString(pstString); return SWIG_ERROR; } } freeAllocatedSingleString(pstString); return SWIG_OK; } SWIGRUNTIME int SWIG_Scilab_NewMemberObj(void *pvApiCtx, int iVarOut, void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) { return SWIG_ERROR; } *(r++) = '_'; r = SWIG_PackData(r, ptr, sz); strcpy(r, type->name); if (createSingleString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, &result[0])) return SWIG_ERROR; return SWIG_OK; } /* * Pointer utility functions */ #include #ifdef __cplusplus extern "C" #endif int SWIG_this(SWIG_GatewayParameters) { void *ptrValue = NULL; if (SwigScilabPtrToObject(pvApiCtx, 1, &ptrValue, NULL, 0, fname) == SWIG_OK) { SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + 1, (double)(uintptr_t)ptrValue)); } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The value is not a pointer.\n"), fname, 1); return SWIG_ERROR; } } #ifdef __cplusplus extern "C" #endif int SWIG_ptr(SWIG_GatewayParameters) { void *ptrValue = NULL; double dValue = 0; if (SwigScilabPtrToObject(pvApiCtx, 1, &ptrValue, NULL, 0, fname) == SWIG_OK) { SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, SwigScilabPtrFromObject(pvApiCtx, 1, ptrValue, NULL, 0, NULL)); } else { int *piAddr; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr); if(sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (getScalarDouble(pvApiCtx, piAddr, &dValue) == 0) { if (dValue != (uintptr_t)dValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1); return SWIG_ValueError; } if ((dValue < 0) || (dValue > ULONG_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1); return SWIG_OverflowError; } SWIG_Scilab_SetOutputPosition(1); return SWIG_Scilab_SetOutput(pvApiCtx, SwigScilabPtrFromObject(pvApiCtx, 1, (void *) (uintptr_t)dValue, NULL, 0, NULL)); } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A pointer or a double expected.\n"), "SWIG_ptr", 1); return SWIG_TypeError; } } } swig-3.0.12/Lib/scilab/scimatrixdouble.swg0000664000175000017500000001075513042756442020330 0ustar williamwilliam/* * C-type: double array * Scilab type: double matrix */ %include // in (double *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (double *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, double *IN) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, double *IN) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (double *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (double *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, double *IN) %typemap(in, noblock=1, fragment="SWIG_SciDouble_AsDoubleArrayAndSize") (int IN_SIZE, double *IN) (int rowCount, int colCount) { if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (double**) malloc(sizeof(double*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (double **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (double**) malloc(sizeof(double*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (int *IN_ROWCOUNT, int *IN_COLCOUNT, double **OUT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, double **OUT) { free($1); free($2); free(*$3); free($3); } // out (double **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (double **OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (double **OUT, int *OUT_SIZE) { $1 = (double**) malloc(sizeof(double*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (double **OUT, int *OUT_SIZE) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (double **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, double **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, double **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, double **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (double**) malloc(sizeof(double*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromDoubleArrayAndSize") (int *OUT_SIZE, double **OUT) { if (SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, double **OUT) { free($1); free(*$2); free($2); } swig-3.0.12/Lib/scilab/cpointer.i0000664000175000017500000000004113042756442016370 0ustar williamwilliam%include swig-3.0.12/Lib/scilab/scisignedchar.swg0000664000175000017500000001354213042756442017735 0ustar williamwilliam/* * C-type: signed char * Scilab type: double or int8 */ %fragment(SWIG_AsVal_frag(signed char), "header", fragment="SWIG_SciDoubleOrInt8_AsSignedChar", fragment="") { #define SWIG_AsVal_signed_SS_char(scilabValue, valuePointer) SWIG_SciDoubleOrInt8_AsSignedChar(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrInt8_AsSignedChar", "header") { SWIGINTERN int SWIG_SciDoubleOrInt8_AsSignedChar(void *pvApiCtx, int iVar, signed char *pscValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { char *pcData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger8(pvApiCtx, piAddrVar, &iRows, &iCols, &pcData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *pscValue = *pcData; } else if (iType == sci_matrix) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 8-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < SCHAR_MIN) || (dValue > SCHAR_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 8-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *pscValue = (signed char) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(signed char), "header", fragment="SWIG_SciDouble_FromSignedChar") { #define SWIG_From_signed_SS_char(scilabValue) SWIG_SciDouble_FromSignedChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue) } %fragment("SWIG_SciDouble_FromSignedChar", "header") { SWIGINTERN int SWIG_SciDouble_FromSignedChar(void *pvApiCtx, int iVarOut, signed char scValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) scValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: signed char[] * Scilab type: double or int8 matrix */ %fragment("SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, signed char **pscValue, char *fname) { SciErr sciErr; int iType = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pscValue = (signed char*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pscValue)[i] = (signed char) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger8(pvApiCtx, piAddrVar, iRows, iCols, (char **)pscValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromSignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromSignedCharArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const signed char *pscValue) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static SwigSciObject from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } %} #define %swig_vector_methods(Type...) %swig_sequence_methods(Type) #define %swig_vector_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/scilab/sciarray.swg0000664000175000017500000000730613042756442016745 0ustar williamwilliam/* -------------------------------------------------------------------------- * * Arrays typemaps * * --------------------------------------------------------------------------*/ %{ #include %} %define %scilab_asarray_withallocatecopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { size_t i = 0; int iRows = 0; int iCols = 0; TEMPDATATYPE *pTempData = NULL; if (FRAGMENTNAME(pvApiCtx, $input, &iRows, &iCols, &pTempData, fname)) { return SWIG_ERROR; } $1 = ($1_ltype)MALLOC(sizeof($*1_ltype) * iRows * iCols); for (i = 0; i < iRows * iCols; i++) { $1[i] = ($*1_ltype) pTempData[i]; } } %enddef %define %scilab_asarrayandsize_withcopy(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPDATATYPE) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { int iRows = 0; int iCols = 0; TEMPDATATYPE *pTempData = NULL; if (FRAGMENTNAME(pvApiCtx, $input, &iRows, &iCols, &pTempData, fname)) { return SWIG_ERROR; } if (iRows*iCols <= $1_dim0) { size_t i; for (i = 0; i < $1_dim0; i++) { $1[i] = ($*1_ltype) pTempData[i]; } } else { char errmsg[100]; sprintf(errmsg, "Size of input data (%d) is too big (maximum is %d)", iRows*iCols, $1_dim0); SWIG_exception_fail(SWIG_OverflowError, errmsg); } } %enddef %define %scilab_fromarrayandsize(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { %set_output(FRAGMENTNAME(pvApiCtx, $result, 1, $1_dim0, $1)); } %enddef %define %scilab_array_typemaps(CTYPE, ASARRAY_FRAGMENT, FROMARRAY_FRAGMENT, TEMPDATATYPE) %scilab_asarrayandsize_withcopy(varin, ASARRAY_FRAGMENT, CTYPE[ANY], TEMPDATATYPE); %scilab_asarray_withallocatecopy(in, ASARRAY_FRAGMENT, CTYPE[ANY], TEMPDATATYPE); %scilab_fromarrayandsize(varout, FROMARRAY_FRAGMENT, CTYPE[ANY]); %scilab_fromarrayandsize(out, FROMARRAY_FRAGMENT, CTYPE[ANY]); %apply SWIGTYPE[] { CTYPE[] }; %scilab_asarray_withallocatecopy(in, ASARRAY_FRAGMENT, CTYPE[], TEMPDATATYPE); %enddef // Double %scilab_array_typemaps(double, SWIG_SciDouble_AsDoubleArrayAndSize, SWIG_SciDouble_FromDoubleArrayAndSize, double); // Signed char %scilab_array_typemaps(signed char, SWIG_SciDoubleOrInt8_AsSignedCharArrayAndSize, SWIG_SciDouble_FromSignedCharArrayAndSize, signed char); // Unsigned char %scilab_array_typemaps(unsigned char, SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize, SWIG_SciDouble_FromUnsignedCharArrayAndSize, unsigned char); // Short %scilab_array_typemaps(short, SWIG_SciDoubleOrInt16_AsShortArrayAndSize, SWIG_SciDouble_FromShortArrayAndSize, short); // Unsigned short %scilab_array_typemaps(unsigned short, SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize, SWIG_SciDouble_FromUnsignedShortArrayAndSize, unsigned short); // Int %scilab_array_typemaps(int, SWIG_SciDoubleOrInt32_AsIntArrayAndSize, SWIG_SciDouble_FromIntArrayAndSize, int); // Unsigned int %scilab_array_typemaps(unsigned int, SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize, SWIG_SciDouble_FromUnsignedIntArrayAndSize, unsigned int); // Long %scilab_array_typemaps(long, SWIG_SciDoubleOrInt32_AsIntArrayAndSize, SWIG_SciDouble_FromLongArrayAndSize, int); // Unsigned long %scilab_array_typemaps(unsigned long, SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize, SWIG_SciDouble_FromUnsignedLongArrayAndSize, unsigned int); // Float %scilab_array_typemaps(float, SWIG_SciDouble_AsFloatArrayAndSize, SWIG_SciDouble_FromFloatArrayAndSize, float); // Bool %scilab_array_typemaps(bool, SWIG_SciBoolean_AsIntArrayAndSize, SWIG_SciBoolean_FromBoolArrayAndSize, int); // Char * %scilab_array_typemaps(char *, SWIG_SciString_AsCharPtrArrayAndSize, SWIG_SciString_FromCharPtrArrayAndSize, char *); swig-3.0.12/Lib/scilab/std_alloc.i0000664000175000017500000000003413042756442016513 0ustar williamwilliam%include swig-3.0.12/Lib/scilab/scisequenceint.swg0000664000175000017500000000552713042756442020155 0ustar williamwilliam/* * * Scilab matrix of int <-> C++ int container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(int), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(int)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; int iType = 0; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iType == sci_matrix) || (iType == sci_ints)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: An integer is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(int)(SwigSciObject obj, int **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(int)(SwigSciObject obj, int *piSize) { int *piMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &piMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: An integer vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(int), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(int)(int size, int **pSequence) { *pSequence = new int[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(int), "header", fragment="SWIG_SciDouble_FromIntArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(int)(int size, int *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (int *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(int), "header") { SWIGINTERN int SWIG_AsVal_SequenceItem_dec(int)(SwigSciObject obj, int *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(int), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(int)(int *pSequence, int iItemIndex, int itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-3.0.12/Lib/scilab/scilong.swg0000664000175000017500000000775013042756442016571 0ustar williamwilliam/* * C-type: long * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(long), "header", fragment="SWIG_SciDoubleOrInt32_AsLong", fragment="") { %#define SWIG_AsVal_long(scilabValue, valuePointer) SWIG_SciDoubleOrInt32_AsLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()); } %fragment("SWIG_SciDoubleOrInt32_AsLong", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsLong(void *pvApiCtx, SwigSciObject iVar, long *plValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { int iPrec = 0; int *piData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &piData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *plValue = (long) *piData; } else if (iType == sci_matrix) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < LONG_MIN) || (dValue > LONG_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *plValue = (long) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(long), "header", fragment="SWIG_SciDouble_FromLong") { %#define SWIG_From_long(scilabValue) SWIG_SciDouble_FromLong(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromLong", "header") { SWIGINTERN int SWIG_SciDouble_FromLong(void *pvApiCtx, int iVarOut, long lValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) lValue)) return SWIG_ERROR; return SWIG_OK; } } %fragment("SWIG_SciDouble_FromLongArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromLongArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const long *plData) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i // in (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, int *IN) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, int *IN) %typemap(in, noblock=1, fragment="SWIG_SciDoubleOrInt32_AsIntArrayAndSize") (int IN_SIZE, int *IN) (int rowCount, int colCount) { if (SWIG_SciDoubleOrInt32_AsIntArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (int**) malloc(sizeof(int*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, int **OUT) { free($1); free($2); free(*$3); free($3); } // out (int **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (int **OUT, int *OUT_SIZE) { } %typemap(arginit) (int **OUT, int *OUT_SIZE) { $1 = (int**) malloc(sizeof(int*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int **OUT, int *OUT_SIZE) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, int **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, int **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, int **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciDouble_FromIntArrayAndSize") (int *OUT_SIZE, int **OUT) { if (SWIG_SciDouble_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *IN_SIZE, int **OUT) { free($1); free(*$2); free($2); } swig-3.0.12/Lib/scilab/std_set.i0000664000175000017500000000141613042756442016221 0ustar williamwilliam/* * * C++ type : STL set * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdSetTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(const SwigSciObject &obj, std::set **set) { return traits_asptr_stdseq >::asptr(obj, set); } }; template struct traits_from > { static SwigSciObject from(const std::set& set) { return traits_from_stdseq >::from(set); } }; } %} #define %swig_set_methods(Type...) %swig_sequence_methods(Type) #define %swig_set_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/scilab/scimacros.swg0000664000175000017500000000041213042756442017102 0ustar williamwilliam #define %scilabconst(flag) %feature("scilab:const","flag") // Create Scilab variable #define SWIG_CreateScilabVariable_frag(Type...) %fragment_name(CreateScilabVariable, Type) #define SWIG_CreateScilabVariable_dec(Type...) %symbol_name(CreateScilabVariable, Type) swig-3.0.12/Lib/scilab/std_container.i0000664000175000017500000000007413042756442017407 0ustar williamwilliam%include %include swig-3.0.12/Lib/scilab/sciiterators.swg0000664000175000017500000002211413042756442017635 0ustar williamwilliam/* ----------------------------------------------------------------------------- * sciiterators.swg * * Users can derive form the SciSwigIterator to implemet their * own iterators. As an example (real one since we use it for STL/STD * containers), the template SwigSciIterator_T does the * implementation for generic C++ iterators. * ----------------------------------------------------------------------------- */ %include %fragment("SciSwigIterator","header",fragment="") { namespace swig { struct stop_iteration { }; struct SciSwigIterator { private: SwigSciObject _seq; protected: SciSwigIterator(SwigSciObject seq) : _seq(seq) { } public: virtual ~SciSwigIterator() {} virtual SwigSciObject value() const = 0; virtual SciSwigIterator *incr(size_t n = 1) = 0; virtual SciSwigIterator *decr(size_t n = 1) { throw stop_iteration(); } virtual ptrdiff_t distance(const SciSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const SciSwigIterator &x) const { throw std::invalid_argument("operation not supported"); } virtual SciSwigIterator *copy() const = 0; SwigSciObject next() { SwigSciObject obj = value(); incr(); return obj; } SwigSciObject previous() { decr(); return value(); } SciSwigIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const SciSwigIterator& x) const { return equal(x); } bool operator != (const SciSwigIterator& x) const { return ! operator==(x); } SciSwigIterator* operator ++ () { incr(); return this; } SciSwigIterator* operator -- () { decr(); return this; } SciSwigIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } SciSwigIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const SciSwigIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::SciSwigIterator *"); init = 1; } return desc; } }; } } %fragment("SwigSciIterator_T","header",fragment="",fragment="SciSwigIterator",fragment="StdTraits",fragment="StdIteratorTraits") { namespace swig { template class SwigSciIterator_T : public SciSwigIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef SwigSciIterator_T self_type; SwigSciIterator_T(out_iterator curr, SwigSciObject seq) : SciSwigIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const SciSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const SciSwigIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef SwigSciObject result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class SciSwigIteratorOpen_T : public SwigSciIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigSciIterator_T base; typedef SciSwigIteratorOpen_T self_type; SciSwigIteratorOpen_T(out_iterator curr, SwigSciObject seq) : SwigSciIterator_T(curr, seq) { } SwigSciObject value() const { return from(static_cast(*(base::current))); } SciSwigIterator *copy() const { return new self_type(*this); } SciSwigIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } SciSwigIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SciSwigIteratorClosed_T : public SwigSciIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigSciIterator_T base; typedef SciSwigIteratorClosed_T self_type; SciSwigIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, SwigSciObject seq) : SwigSciIterator_T(curr, seq), begin(first), end(last) { } SwigSciObject value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } SciSwigIterator *copy() const { return new self_type(*this); } SciSwigIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } SciSwigIterator *decr(size_t n = 1) { while (n--) { if (base::current == begin) { throw stop_iteration(); } else { --base::current; } } return this; } private: out_iterator begin; out_iterator end; }; template inline SciSwigIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, SwigSciObject seq = SwigSciObject()) { return new SciSwigIteratorClosed_T(current, begin, end, seq); } template inline SciSwigIterator* make_output_iterator(const OutIter& current, SwigSciObject seq = SwigSciObject()) { return new SciSwigIteratorOpen_T(current, seq); } } } %fragment("SciSwigIterator"); namespace swig { // Throw a StopIteration exception %ignore stop_iteration; struct stop_iteration {}; %typemap(throws, noblock=1) stop_iteration { SWIG_Scilab_Raise(0, "stop_iteration", NULL); return SWIG_ERROR; } // Mark methods that return new objects %newobject SciSwigIterator::copy; %newobject SciSwigIterator::operator + (ptrdiff_t n) const; %newobject SciSwigIterator::operator - (ptrdiff_t n) const; %nodirector SciSwigIterator; %catches(swig::stop_iteration) SciSwigIterator::value() const; %catches(swig::stop_iteration) SciSwigIterator::incr(size_t n = 1); %catches(swig::stop_iteration) SciSwigIterator::decr(size_t n = 1); %catches(std::invalid_argument) SciSwigIterator::distance(const SciSwigIterator &x) const; %catches(std::invalid_argument) SciSwigIterator::equal (const SciSwigIterator &x) const; %catches(swig::stop_iteration) SciSwigIterator::next(); %catches(swig::stop_iteration) SciSwigIterator::previous(); %catches(swig::stop_iteration) SciSwigIterator::advance(ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator += (ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator -= (ptrdiff_t n); %catches(swig::stop_iteration) SciSwigIterator::operator + (ptrdiff_t n) const; %catches(swig::stop_iteration) SciSwigIterator::operator - (ptrdiff_t n) const; %ignore SciSwigIterator::operator==; %ignore SciSwigIterator::operator!=; %ignore SciSwigIterator::operator++; %ignore SciSwigIterator::operator--; %ignore SciSwigIterator::operator+; %ignore SciSwigIterator::operator-; struct SciSwigIterator { protected: SciSwigIterator(SwigSciObject seq); public: virtual ~SciSwigIterator(); virtual SwigSciObject value() const = 0; virtual SciSwigIterator *incr(size_t n = 1) = 0; virtual SciSwigIterator *decr(size_t n = 1); virtual ptrdiff_t distance(const SciSwigIterator &x) const; virtual bool equal (const SciSwigIterator &x) const; virtual SciSwigIterator *copy() const = 0; SwigSciObject next(); SwigSciObject previous(); SciSwigIterator *advance(ptrdiff_t n); bool operator == (const SciSwigIterator& x) const; bool operator != (const SciSwigIterator& x) const; SciSwigIterator* operator ++ (); SciSwigIterator* operator -- (); SciSwigIterator* operator + (ptrdiff_t n) const; SciSwigIterator* operator - (ptrdiff_t n) const; ptrdiff_t operator - (const SciSwigIterator& x) const; }; } swig-3.0.12/Lib/scilab/scisequencefloat.swg0000664000175000017500000000534013042756442020461 0ustar williamwilliam/* * * Scilab matrix of float <-> C++ float container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(float), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(float)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A double is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(float), "header", fragment="SWIG_SciDouble_AsFloatArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(float)(SwigSciObject obj, float **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDouble_AsFloatArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(float), "header", fragment="SWIG_SciDouble_AsFloatArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(float)(SwigSciObject obj, int *piSize) { float *pdblMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDouble_AsFloatArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &pdblMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A float vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(float), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(float)(int size, float **pSequence) { *pSequence = new float[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(float), "header", fragment="SWIG_SciDouble_FromFloatArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(float)(int size, float *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromFloatArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (float *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(float), "header") { SWIGINTERN float SWIG_AsVal_SequenceItem_dec(float)(SwigSciObject obj, float *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(float), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(float)(float *pSequence, int iItemIndex, float itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-3.0.12/Lib/scilab/sciprimtypes.swg0000664000175000017500000000062613042756442017661 0ustar williamwilliam%include %include %include %include %include %include %include %include %include %include %include %include %include %include %include swig-3.0.12/Lib/scilab/cmalloc.i0000664000175000017500000000004013042756442016156 0ustar williamwilliam%include swig-3.0.12/Lib/scilab/std_basic_string.i0000664000175000017500000000225113042756442020073 0ustar williamwilliam/* * C++: basic_string * Scilab: string */ #define %swig_basic_string(Type...) %swig_sequence_methods_val(Type) %fragment(SWIG_AsPtr_frag(std::basic_string), "header", fragment="SWIG_SciString_AsCharPtrAndLength") { SWIGINTERN int SWIG_AsPtr_dec(std::basic_string)(int _iVar, std::basic_string **_pstValue) { char* buf = 0; size_t len = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_SciString_AsCharPtrAndSize(pvApiCtx, _iVar, &buf, &len, &alloc, SWIG_Scilab_GetFuncName())))) { if (buf) { if (_pstValue) { *_pstValue = new std::string(buf, len - 1); } if (alloc == SWIG_NEWOBJ) { delete[] buf; } return SWIG_NEWOBJ; } else { if (_pstValue) { *_pstValue = NULL; } return SWIG_OLDOBJ; } } else { return SWIG_ERROR; } } } %fragment(SWIG_From_frag(std::basic_string), "header", fragment="SWIG_SciString_FromCharPtr") { SWIGINTERN int SWIG_From_dec(std::basic_string)(std::basic_string _pstValue) { return SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), _pstValue.c_str()); } } %include swig-3.0.12/Lib/scilab/scisequencebool.swg0000664000175000017500000000527713042756442020320 0ustar williamwilliam/* * * Scilab matrix of bool <-> C++ bool container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(bool), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(bool)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(bool)(SwigSciObject obj, int **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciBoolean_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_AsIntArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(bool)(SwigSciObject obj, int *piSize) { int *piMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciBoolean_AsIntArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &piMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: An integer vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(bool), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(bool)(int size, int **pSequence) { *pSequence = new int[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(bool), "header", fragment="SWIG_SciBoolean_FromIntArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(bool)(int size, int *pSequence) { SwigSciObject obj = SWIG_SciBoolean_FromIntArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (int *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(bool), "header") { SWIGINTERN bool SWIG_AsVal_SequenceItem_dec(bool)(SwigSciObject obj, int *pSequence, int iItemIndex) { return (bool) pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(bool), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(bool)(int *pSequence, int iItemIndex, bool itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-3.0.12/Lib/scilab/std_common.i0000664000175000017500000000443413042756442016721 0ustar williamwilliam%include %include // Generate the traits for a 'primitive' type, such as 'double', // for which the SWIG_AsVal and SWIG_From methods are already defined. %define %traits_ptypen(Type...) %fragment(SWIG_Traits_frag(Type),"header", fragment=SWIG_AsVal_frag(Type), fragment=SWIG_From_frag(Type), fragment="StdTraits") { namespace swig { template <> struct traits< Type > { typedef value_category category; static const char* type_name() { return #Type; } }; template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SwigSciObject obj, value_type *val) { return SWIG_AsVal(Type)(obj, val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SwigSciObject from(const value_type& val) { return SWIG_From(Type)(val); } }; } } %enddef /* Traits for enums. This is bit of a sneaky trick needed because a generic template specialization of enums is not possible (unless using template meta-programming which SWIG doesn't support because of the explicit instantiations required using %template). The STL containers define the 'front' method and the typemap below is used whenever the front method is wrapped returning an enum. This typemap simply picks up the standard enum typemap, but additionally drags in a fragment containing the traits_asval and traits_from required in the generated code for enums. */ %define %traits_enum(Type...) %fragment("SWIG_Traits_enum_"{Type},"header", fragment=SWIG_AsVal_frag(int), fragment=SWIG_From_frag(int), fragment="StdTraits") { namespace swig { template <> struct traits_asval< Type > { typedef Type value_type; static int asval(SwigSciObject obj, value_type *val) { return SWIG_AsVal(int)(obj, (int *)val); } }; template <> struct traits_from< Type > { typedef Type value_type; static SwigSciObject from(const value_type& val) { return SWIG_From(int)((int)val); } }; } } %typemap(out, fragment="SWIG_Traits_enum_"{Type}) const enum SWIGTYPE& front %{$typemap(out, const enum SWIGTYPE&)%} %enddef %include // // Generates the traits for all the known primitive // C++ types (int, double, ...) // %apply_cpptypes(%traits_ptypen); swig-3.0.12/Lib/scilab/std_except.i0000664000175000017500000000004313042756442016711 0ustar williamwilliam%include swig-3.0.12/Lib/scilab/sciunsignedlong.swg0000664000175000017500000000357513042756442020327 0ustar williamwilliam/* * C-type: unsigned long * Scilab type: see unsigned int */ %fragment(SWIG_AsVal_frag(unsigned long), "header", fragment="SWIG_UnsignedInt_AsUnsignedLong") { #define SWIG_AsVal_unsigned_SS_long(scilabValue, valuePointer) SWIG_UnsignedInt_AsUnsignedLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_UnsignedInt_AsUnsignedLong", "header", fragment=SWIG_AsVal_frag(unsigned int)) { SWIGINTERN int SWIG_UnsignedInt_AsUnsignedLong(void *pvApiCtx, SwigSciObject iVar, unsigned long *pulValue, char *fname) { unsigned int uiValue = 0; if(SWIG_AsVal_unsigned_SS_int(iVar, &uiValue) != SWIG_OK) { return SWIG_ERROR; } *pulValue = (unsigned long) uiValue; return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned long), "header", fragment="SWIG_UnsignedInt_FromUnsignedLong") { #define SWIG_From_unsigned_SS_long(scilabValue) SWIG_UnsignedInt_FromUnsignedLong(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_UnsignedInt_FromUnsignedLong", "header", fragment=SWIG_From_frag(unsigned int)) { SWIGINTERN int SWIG_UnsignedInt_FromUnsignedLong(void *pvApiCtx, int iVarOut, unsigned long ulValue, char *fname) { return SWIG_From_unsigned_SS_int((unsigned int)ulValue); } } %fragment("SWIG_SciDouble_FromUnsignedLongArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedLongArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const unsigned long *pulValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i %include %include %include %include swig-3.0.12/Lib/scilab/typemaps.i0000664000175000017500000000315313042756442016416 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * ----------------------------------------------------------------------------- */ // INPUT typemaps %define %scilab_input_typemap(Type) %typemap(in, noblock=1, fragment=SWIG_AsVal_frag(Type)) Type *INPUT(Type temp)(int ecode), Type &INPUT(Type temp)(int ecode) { ecode = SWIG_AsVal_dec(Type)($input, &temp); if (!SWIG_IsOK(ecode)) { %argument_fail(ecode, "$type", $symname, $argnum); } $1 = &temp; } %typemap(freearg, noblock=1) Type *INPUT, Type &INPUT { } %typemap(typecheck) Type *INPUT, Type &INPUT { } %enddef // OUTPUT typemaps %define %scilab_output_typemap(Type) %typemap(argout, noblock=1, fragment=SWIG_From_frag(Type)) Type *OUTPUT, Type &OUTPUT { %set_output(SWIG_From_dec(Type)(*$1)); } %enddef // INOUT typemaps %define %scilab_inout_typemap(Type) %typemap(in) Type *INOUT = Type *INPUT; %typemap(in) Type &INOUT = Type &INPUT; %typemap(argout) Type *INOUT = Type *OUTPUT; %typemap(argout) Type &INOUT = Type &OUTPUT; %enddef %define %scilab_inout_typemaps(Type) %scilab_input_typemap(%arg(Type)) %scilab_output_typemap(%arg(Type)) %scilab_inout_typemap(%arg(Type)) %enddef %scilab_inout_typemaps(double); %scilab_inout_typemaps(signed char); %scilab_inout_typemaps(unsigned char); %scilab_inout_typemaps(short); %scilab_inout_typemaps(unsigned short); %scilab_inout_typemaps(int); %scilab_inout_typemaps(unsigned int); %scilab_inout_typemaps(long); %scilab_inout_typemaps(unsigned long); %scilab_inout_typemaps(bool); %scilab_inout_typemaps(float); //%apply_ctypes(%scilab_inout_typemaps); swig-3.0.12/Lib/scilab/scisequencestring.swg0000664000175000017500000000516113042756442020663 0ustar williamwilliam/* * * Scilab matrix of string <-> C++ std::string container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(std::string), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(std::string)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isStringType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A string is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(std::string), "header", fragment="SWIG_SciString_AsCharPtrArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(std::string)(SwigSciObject obj, char ***pSequence) { int iRows = 0; int iCols = 0; return (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, obj, &iRows, &iCols, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(std::string), "header", fragment="SWIG_SciString_AsCharPtrArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(std::string)(SwigSciObject obj, int *piSize) { char **pstMatrix; int iCols = 0; int iRows = 0; if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, obj, &iRows, &iCols, &pstMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { *piSize = iRows * iCols; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(std::string), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(std::string)(int size, char ***pSequence) { *pSequence = new char*[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(std::string), "header", fragment="SWIG_SciString_FromCharPtrArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(std::string)(int size, char **pSequence) { SwigSciObject obj = SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (char **)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(std::string), "header") { SWIGINTERN std::string SWIG_AsVal_SequenceItem_dec(std::string)(SwigSciObject obj, char **pSequence, int iItemIndex) { return std::string(pSequence[iItemIndex]); } } %fragment(SWIG_From_SequenceItem_frag(std::string), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(std::string)(char **pSequence, int iItemIndex, std::string itemValue) { char *pChar = new char((int) itemValue.size() + 1); strcpy(pChar, itemValue.c_str()); pSequence[iItemIndex] = pChar; return SWIG_OK; } } swig-3.0.12/Lib/scilab/scilist.swg0000664000175000017500000000344213042756442016577 0ustar williamwilliam/* * Scilab list related functions * */ %fragment("SWIG_ScilabList", "header") { SWIGINTERN int SWIG_GetScilabList(SwigSciObject obj, int **piListAddr) { SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_GetScilabListSize(SwigSciObject obj, int *piListSize) { SciErr sciErr; int *piListAddr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getListItemNumber(pvApiCtx, piListAddr, piListSize); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_GetScilabListAndSize(SwigSciObject obj, int **piListAddr, int *piListSize) { SciErr sciErr; sciErr = getVarAddressFromPosition(pvApiCtx, obj, piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getListItemNumber(pvApiCtx, *piListAddr, piListSize); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } SWIGINTERN int SWIG_CheckScilabList(SwigSciObject obj) { SciErr sciErr; int *piListAddr; int iType; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piListAddr, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if ((iType != sci_list) && (iType != sci_tlist) && (iType != sci_mlist)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A list is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } return SWIG_OK; } } swig-3.0.12/Lib/scilab/sciunsignedint.swg0000664000175000017500000001473413042756442020161 0ustar williamwilliam/* * C-type: unsigned int * Scilab type: double or uint32 */ %fragment(SWIG_AsVal_frag(unsigned int), "header", fragment="SWIG_SciDoubleOrUint32_AsUnsignedInt", fragment="") { %#define SWIG_AsVal_unsigned_SS_int(scilabValue, valuePointer) SWIG_SciDoubleOrUint32_AsUnsignedInt(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrUint32_AsUnsignedInt", "header") { SWIGINTERN int SWIG_SciDoubleOrUint32_AsUnsignedInt(void *pvApiCtx, int iVar, unsigned int *puiValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; unsigned int *puiData = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (puiValue) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &puiData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } *puiValue = *puiData; } } else if (iType == sci_matrix) { if (puiValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit unsigned integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < 0) || (dValue > UINT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *puiValue = (unsigned int) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned int), "header", fragment="SWIG_SciDouble_FromUnsignedInt") { %#define SWIG_From_unsigned_SS_int(scilabValue) SWIG_SciDouble_FromUnsignedInt(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromUnsignedInt", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedInt(void *pvApiCtx, int iVarOut, unsigned int uiValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) uiValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned int[] * Scilab type: uint32 vector */ %fragment("SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint32_AsUnsignedIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned int **puiValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *puiValue = (unsigned int*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*puiValue)[i] = (unsigned int) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger32(pvApiCtx, piAddrVar, iRows, iCols, puiValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, unsigned int *puiValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i UCHAR_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 8-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *pucValue = (unsigned char) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned char), "header", fragment="SWIG_SciDouble_FromUnsignedChar") { #define SWIG_From_unsigned_SS_char(value) SWIG_SciDouble_FromUnsignedChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), value) } %fragment("SWIG_SciDouble_FromUnsignedChar", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedChar(void *pvApiCtx, int iVarOut, unsigned char ucValue) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) ucValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned char[] * Scilab type: double or uint8 matrix */ %fragment("SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint8_AsUnsignedCharArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned char **pucValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pucValue = (unsigned char*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pucValue)[i] = (unsigned char) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT8) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger8(pvApiCtx, piAddrVar, iRows, iCols, pucValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 8-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedCharArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedCharArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const unsigned char *pucValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-3.0.12/Lib/scilab/scilonglong.swg0000664000175000017500000000446213042756442017446 0ustar williamwilliam/* * C-type: long long * Scilab 5 type: NONE * Scilab 6 type: int64 */ %fragment(SWIG_AsVal_frag(long long), "header", fragment="SWIG_SciInt64_ToLongLong") { %#define SWIG_AsVal_long_SS_long(scilabValue, valuePointer) SWIG_SciInt64_ToLongLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciInt64_ToLongLong", "header") { SWIGINTERN int SWIG_SciInt64_ToLongLong(void *pvApiCtx, int iVar, long long *pllValue, char *fname) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciInt64_ToLongLong", "int64"); return SWIG_ERROR; } } %fragment(SWIG_From_frag(long long), "header", fragment="SWIG_SciInt64_FromLongLong") { #define SWIG_From_long_SS_long(value) SWIG_SciInt64_FromLongLong(pvApiCtx, $result, value) } %fragment("SWIG_SciInt64_FromLongLong", "header") { SWIGINTERN int SWIG_SciInt64_FromLongLong(void *pvApiCtx, int iVarOut, long long llValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciInt64_ToLongLong", "int64"); return SWIG_ERROR; } } /* * C-type: unsigned long long * Scilab 5 type: NONE * Scilab 6 type: uint64 */ %fragment(SWIG_AsVal_frag(unsigned long long), "header", fragment="SWIG_SciUint64_ToUnsignedLongLong") { #define SWIG_AsVal_unsigned_SS_long_SS_long(scilabValue, valuePointer) SWIG_SciUint64_ToUnsignedLongLong(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciUint64_ToUnsignedLongLong", "header") { SWIGINTERN int SWIG_SciUint64_ToUnsignedLongLong(void *pvApiCtx, int iVar, unsigned long long *pullValue, char *fname) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciUint64_ToLongLong", "uint64"); return SWIG_ERROR; } } %fragment(SWIG_From_frag(unsigned long long), "header", fragment="SWIG_SciUint64_FromUnsignedLongLong") { #define SWIG_From_unsigned_SS_long_SS_long(value) SWIG_SciUint64_FromUnsignedLongLong(pvApiCtx, $result, value) } %fragment("SWIG_SciUint64_FromUnsignedLongLong", "header") { SWIGINTERN int SWIG_SciUint64_FromUnsignedLongLong(void *pvApiCtx, int iVarOut, unsigned long long llValue) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Scilab 5.X does not manage '%s' data type.\n"), "SWIG_SciUint64_ToLongLong", "uint64"); return SWIG_ERROR; } } swig-3.0.12/Lib/scilab/std_pair.i0000664000175000017500000000130313042756442016354 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * Typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/scilab/scimatrixbool.swg0000664000175000017500000001055013042756442020002 0ustar williamwilliam/* * C-type: bool array * Scilab type: bool matrix */ %include // in (bool *IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (bool *IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, bool *IN) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, bool *IN) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (bool *IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciBoolean_AsBoolArrayAndSize") (bool *IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, bool *IN) %typemap(in, noblock=1) (int IN_SIZE, bool *IN) (int rowCount, int colCount) { if (SWIG_SciBoolean_AsBoolArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (bool**) malloc(sizeof(bool*)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { free(*$1); free($1); free($2); free($3); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (bool **OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (int*) malloc(sizeof(int)); $3 = (bool**) malloc(sizeof(bool*)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, bool **OUT) { free($1); free($2); free(*$3); free($3); } // out (bool **OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (bool **OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (bool **OUT, int *OUT_SIZE) { $1 = (bool**) malloc(sizeof(bool*)); $2 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (bool **OUT, int *OUT_SIZE) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (bool **OUT, int *OUT_SIZE) { free(*$1); free($1); free($2); } // out (int *OUT_SIZE, bool **OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, bool **OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, bool **OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (bool**) malloc(sizeof(bool*)); } %typemap(argout, noblock=1, fragment="SWIG_SciBoolean_FromBoolArrayAndSize") (int *OUT_SIZE, bool **OUT) { if (SWIG_SciBoolean_FromBoolArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, bool **OUT) { free($1); free(*$2); free($2); } swig-3.0.12/Lib/scilab/scibool.swg0000664000175000017500000000775413042756442016571 0ustar williamwilliam/* * C-type: bool * Scilab type: boolean scalar */ %fragment(SWIG_AsVal_frag(bool), "header") { SWIGINTERN int SWIG_AsVal_dec(bool)(SwigSciObject iVar, bool *pbValue) { SciErr sciErr; int iRet = 0; int *piAddrVar = NULL; int iTempValue = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (!isBooleanType(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean expected.\n"), SWIG_Scilab_GetFuncName(), iVar); return SWIG_ERROR; } if (!isScalar(pvApiCtx, piAddrVar)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A boolean expected.\n"), SWIG_Scilab_GetFuncName(), iVar); return SWIG_ERROR; } iRet = getScalarBoolean(pvApiCtx, piAddrVar, &iTempValue); if (iRet) { return SWIG_ERROR; } *pbValue = iTempValue; return SWIG_OK; } } %fragment(SWIG_From_frag(bool), "header") { SWIGINTERN int SWIG_From_dec(bool)(bool bValue) { if (createScalarBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(), bValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: bool[] * Scilab type: boolean matrix */ %fragment("SWIG_SciBoolean_AsBoolArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_AsBoolArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, bool **pbValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; int *piValue = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { int i; sciErr = getMatrixOfBoolean(pvApiCtx, piAddrVar, iRows, iCols, &piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *pbValue = (bool*) malloc((*iRows) * (*iCols) * sizeof(bool)); for (i = 0; i < (*iRows) * (*iCols); i++) (*pbValue)[i] = piValue[i] != 0; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciBoolean_FromBoolArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_FromBoolArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, bool *pbValue) { SciErr sciErr; int *piValue = NULL; int i; piValue = (int*) malloc(iRows * iCols * sizeof(int)); for (i = 0; i < iRows * iCols; i++) piValue[i] = pbValue[i]; sciErr = createMatrixOfBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, piValue); if(sciErr.iErr) { printError(&sciErr, 0); free(piValue); return SWIG_ERROR; } free(piValue); return SWIG_OK; } } /* * C-type: int[] * Scilab type: boolean matrix */ %fragment("SWIG_SciBoolean_AsIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_AsIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, int **piValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isBooleanType(pvApiCtx, piAddrVar)) { sciErr = getMatrixOfBoolean(pvApiCtx, piAddrVar, iRows, iCols, piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A boolean matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciBoolean_FromIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciBoolean_FromIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, int *piValue) { SciErr sciErr; sciErr = createMatrixOfBoolean(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, piValue); if(sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-3.0.12/Lib/scilab/scisequence.swg0000664000175000017500000001622213042756442017434 0ustar williamwilliam/* * * Scilab sequence conversions * */ #define SWIG_Traits_Sequence_frag(Type) %fragment_name(AsVal_Traits_Sequence, Type) #define SWIG_AsCheck_Sequence_frag(Type...) %fragment_name(AsCheck_Sequence, Type) #define SWIG_AsCheck_Sequence_dec(Type...) %symbol_name(AsCheck_Sequence, Type) #define SWIG_AsGet_Sequence_frag(Type...) %fragment_name(AsGet_Sequence, Type) #define SWIG_AsGet_Sequence_dec(Type...) %symbol_name(AsGet_Sequence, Type) #define SWIG_AsSize_Sequence_frag(Type...) %fragment_name(AsSize_Sequence, Type) #define SWIG_AsSize_Sequence_dec(Type...) %symbol_name(AsSize_Sequence, Type) #define SWIG_FromCreate_Sequence_frag(Type...) %fragment_name(FromCreate_Sequence, Type) #define SWIG_FromCreate_Sequence_dec(Type...) %symbol_name(FromCreate_Sequence, Type) #define SWIG_FromSet_Sequence_frag(Type...) %fragment_name(FromSet_Sequence, Type) #define SWIG_FromSet_Sequence_dec(Type...) %symbol_name(FromSet_Sequence, Type) #define SWIG_Traits_SequenceItem_frag(Type) %fragment_name(AsVal_Traits_SequenceItem, Type) #define SWIG_AsVal_SequenceItem_frag(Type...) %fragment_name(AsVal_SequenceItem, Type) #define SWIG_AsVal_SequenceItem_dec(Type...) %symbol_name(AsVal_SequenceItem, Type) #define SWIG_From_SequenceItem_frag(Type...) %fragment_name(From_SequenceItem, Type) #define SWIG_From_SequenceItem_dec(Type...) %symbol_name(From_SequenceItem, Type) %include %include %include %include %include %include // // Sequence conversion // %fragment(SWIG_Traits_Sequence_frag(ptr), "header", fragment=SWIG_AsCheck_Sequence_frag(ptr), fragment=SWIG_AsGet_Sequence_frag(ptr), fragment=SWIG_AsSize_Sequence_frag(ptr), fragment=SWIG_FromCreate_Sequence_frag(ptr), fragment=SWIG_FromSet_Sequence_frag(ptr), fragment="StdTraits", fragment="") { namespace swig { // Error returned for sequence containers of default item type template struct traits_as_sequence { static int check(SwigSciObject obj) { throw std::invalid_argument("The container data type is not supported."); } static int get(SwigSciObject obj, void **sequence) { throw std::invalid_argument("The container data type is not supported."); } static int size(SwigSciObject obj, int *size) { throw std::invalid_argument("The container data type is not supported."); } }; template struct traits_from_sequence { static int create(int size, void **sequence) { throw std::invalid_argument("The container data type is not supported."); } static SwigSciObject set(int size, void *sequence) { throw std::invalid_argument("The container data type is not supported."); } }; // Support sequence containers of pointers template struct traits_as_sequence { static int check(SwigSciObject obj) { return SWIG_AsCheck_Sequence_dec(ptr)(obj); } static int get(SwigSciObject obj, void **sequence) { return SWIG_AsGet_Sequence_dec(ptr)(obj, (int **)sequence); } static int size(SwigSciObject obj, int *size) { return SWIG_AsSize_Sequence_dec(ptr)(obj, size); } }; template struct traits_from_sequence { static int create(int size, void **sequence) { return SWIG_FromCreate_Sequence_dec(ptr)(size, (uintptr_t **)sequence); } static SwigSciObject set(int size, void *sequence) { return SWIG_FromSet_Sequence_dec(ptr)(size, (uintptr_t *)sequence); } }; } } %define %traits_sequence(CppType, ScilabType) %fragment(SWIG_Traits_Sequence_frag(CppType), "header", fragment=SWIG_Traits_Sequence_frag(ptr), fragment=SWIG_AsCheck_Sequence_frag(CppType), fragment=SWIG_AsGet_Sequence_frag(CppType), fragment=SWIG_AsSize_Sequence_frag(CppType), fragment=SWIG_FromCreate_Sequence_frag(CppType), fragment=SWIG_FromSet_Sequence_frag(CppType)) { namespace swig { template <> struct traits_as_sequence { static int check(SwigSciObject obj) { return SWIG_AsCheck_Sequence_dec(CppType)(obj); } static int get(SwigSciObject obj, void **sequence) { return SWIG_AsGet_Sequence_dec(CppType)(obj, (ScilabType **)sequence); } static int size(SwigSciObject obj, int *size) { return SWIG_AsSize_Sequence_dec(CppType)(obj, size); } }; template <> struct traits_from_sequence { static int create(int size, void **sequence) { return SWIG_FromCreate_Sequence_dec(CppType)(size, (ScilabType **)sequence); } static SwigSciObject set(int size, void *sequence) { return SWIG_FromSet_Sequence_dec(CppType)(size, (ScilabType *)sequence); } }; } } %enddef // // Sequence item conversion // %fragment(SWIG_Traits_SequenceItem_frag(ptr), "header", fragment=SWIG_AsVal_SequenceItem_frag(ptr), fragment=SWIG_From_SequenceItem_frag(ptr), fragment="StdTraits", fragment="") { namespace swig { // Error returned for sequence containers of default item type template struct traits_asval_sequenceitem { static T asval(SwigSciObject obj, void *pSequence, int iItemIndex) { throw std::invalid_argument("The container data type is not supported."); } }; template struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, T itemValue) { throw std::invalid_argument("The container data type is not supported."); } }; // Support sequence containers of pointers template struct traits_asval_sequenceitem { static T* asval(SwigSciObject obj, void *pSequence, int iItemIndex) { return static_cast(SWIG_AsVal_SequenceItem_dec(ptr)(obj, (int *)pSequence, iItemIndex)); } }; template struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, T *itemValue) { return SWIG_From_SequenceItem_dec(ptr)((uintptr_t *)pSequence, iItemIndex, (uintptr_t) itemValue); } }; } } %define %traits_sequenceitem(CppType, ScilabType) %fragment(SWIG_Traits_SequenceItem_frag(CppType), "header", fragment=SWIG_Traits_SequenceItem_frag(ptr), fragment=SWIG_AsVal_SequenceItem_frag(CppType), fragment=SWIG_From_SequenceItem_frag(CppType)) { namespace swig { template <> struct traits_asval_sequenceitem { static CppType asval(SwigSciObject obj, void *pSequence, int iItemIndex) { return SWIG_AsVal_SequenceItem_dec(CppType)(obj, (ScilabType *)pSequence, iItemIndex); } }; template <> struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, CppType itemValue) { return SWIG_From_SequenceItem_dec(CppType)((ScilabType *)pSequence, iItemIndex, itemValue); } }; } } %enddef %define %add_traits_sequence(CppType, ScilabType) %traits_sequence(CppType, ScilabType); %fragment(SWIG_Traits_Sequence_frag(CppType)); %traits_sequenceitem(CppType, ScilabType); %fragment(SWIG_Traits_SequenceItem_frag(CppType)); %enddef %add_traits_sequence(int, int); %add_traits_sequence(double, double); %add_traits_sequence(float, float); %add_traits_sequence(std::string, char*); %add_traits_sequence(bool, int); swig-3.0.12/Lib/scilab/sciint.swg0000664000175000017500000001432613042756442016421 0ustar williamwilliam/* * C-type: int * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(int), "header", fragment="SWIG_SciDoubleOrInt32_AsInt", fragment="") { %#define SWIG_AsVal_int(scilabValue, valuePointer) SWIG_SciDoubleOrInt32_AsInt(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrInt32_AsInt", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsInt(void *pvApiCtx, SwigSciObject iVar, int *piValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (piValue) { int iPrec = 0; int *piData = NULL; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, &iRows, &iCols, &piData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } *piValue = *piData; } } else if (iType == sci_matrix) { if (piValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < INT_MIN) || (dValue > INT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 32-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *piValue = (int) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(int), "header", fragment="SWIG_SciDouble_FromInt") { %#define SWIG_From_int(scilabValue) SWIG_SciDouble_FromInt(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromInt", "header") { SWIGINTERN int SWIG_SciDouble_FromInt(void *pvApiCtx, int iVarOut, int iValue, char *fname){ if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) iValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: int[] * Scilab type: double or int32 matrix */ %fragment("SWIG_SciDoubleOrInt32_AsIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt32_AsIntArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, int **piValue, char *fname) { SciErr sciErr; int iType = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *piValue = (int*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*piValue)[i] = (int) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT32) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger32(pvApiCtx, piAddrVar, iRows, iCols, piValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 32-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromIntArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromIntArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, const int *piData) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i SHRT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 16-bit signed integer.\n"), fname, iVar); return SWIG_OverflowError; } *psValue = (short) dValue; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } return SWIG_OK; } } %fragment(SWIG_From_frag(short), "header", fragment="SWIG_SciDouble_FromShort") { #define SWIG_From_short(scilabValue) SWIG_SciDouble_FromShort(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromShort", "header") { SWIGINTERN int SWIG_SciDouble_FromShort(void *pvApiCtx, int iVarOut, short sValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) sValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: short[] * Scilab type: double or int16 matrix */ %fragment("SWIG_SciDoubleOrInt16_AsShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrInt16_AsShortArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, short **psValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *psValue = (short*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*psValue)[i] = (short) pdData[i]; } else if (iType == sci_ints) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_INT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfInteger16(pvApiCtx, piAddrVar, iRows, iCols, psValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit signed integer or a double matrix expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromShortArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, short *psValue) { SciErr sciErr; int i; double *pdValues = NULL; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-3.0.12/Lib/scilab/matrix.i0000664000175000017500000000022513042756442016055 0ustar williamwilliam/* * Matrix typemaps * */ %include %include %include %include swig-3.0.12/Lib/scilab/scichar.swg0000664000175000017500000001741213042756442016543 0ustar williamwilliam/* * C-type: char or char* * Scilab type: string */ /* * CHAR */ %fragment(SWIG_AsVal_frag(char), "header", fragment="SWIG_SciString_AsChar") { #define SWIG_AsVal_char(scilabValue, valuePointer) SWIG_SciString_AsChar(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsChar", "header") { SWIGINTERN int SWIG_SciString_AsChar(void *pvApiCtx, int iVar, char *pcValue, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char *pstValue = NULL; int iRet; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isStringType(pvApiCtx, piAddrVar) == 0) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar); return SWIG_TypeError; } iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pstValue); if (iRet) { return SWIG_ERROR; } if (pcValue != NULL) { *pcValue = pstValue[0]; } freeAllocatedSingleString(pstValue); return SWIG_OK; } } %fragment(SWIG_From_frag(char), "header", fragment="SWIG_SciString_FromChar") { #define SWIG_From_char(value) SWIG_SciString_FromChar(pvApiCtx, SWIG_Scilab_GetOutputPosition(), value) } %fragment("SWIG_SciString_FromChar", "header") { SWIGINTERN int SWIG_SciString_FromChar(void *pvApiCtx, int iVarOut, char chValue) { char *pchValue = (char*)malloc(sizeof(char) * 2); pchValue[0] = chValue; pchValue[1] = '\0'; if (createSingleString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, pchValue)) return SWIG_ERROR; free(pchValue); return SWIG_OK; } } /* * CHAR * */ %fragment("SWIG_AsCharArray", "header", fragment = "SWIG_SciString_AsCharPtr") { #define SWIG_AsCharArray(scilabValue, charPtrPointer, charPtrLength) SWIG_SciString_AsCharPtr(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsCharPtr", "header") { SWIGINTERN int SWIG_SciString_AsCharPtr(void *pvApiCtx, int iVar, char *pcValue, int iLength, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char* pcTmpValue = NULL; int iRet; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } iRet = getAllocatedSingleString(pvApiCtx, piAddrVar, &pcTmpValue); if (iRet) { return SWIG_ERROR; } if (pcValue != NULL) { strncpy(pcValue, pcTmpValue, iLength); } freeAllocatedSingleString(pcTmpValue); return SWIG_OK; } } %fragment("SWIG_AsCharPtrAndSize", "header", fragment = "SWIG_SciString_AsCharPtrAndSize") { #define SWIG_AsCharPtrAndSize(scilabValue, charPtrPointer, charPtrLength, allocMemory) SWIG_SciString_AsCharPtrAndSize(pvApiCtx, scilabValue, charPtrPointer, charPtrLength, allocMemory, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciString_AsCharPtrAndSize", "header") { SWIGINTERN int SWIG_SciString_AsCharPtrAndSize(void *pvApiCtx, int iVar, char **pcValue, size_t *piLength, int *alloc, char *fname) { SciErr sciErr; int *piAddrVar = NULL; char *pstString = NULL; int iRows = 0; int iCols = 0; int iLen = 0; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isScalar(pvApiCtx, piAddrVar) == 0 || isStringType(pvApiCtx, piAddrVar) == 0) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A single string expected.\n"), fname, iVar); return SWIG_TypeError; } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } pstString = %new_array(iLen + 1, char); sciErr = getMatrixOfString(pvApiCtx, piAddrVar, &iRows, &iCols, &iLen, &pstString); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } // TODO: return SWIG_ERROR if pcValue NULL (now returning SWIG_ERROR fails some typechecks) if (pcValue) { *pcValue = pstString; } if (alloc != NULL) { *alloc = SWIG_NEWOBJ; } if (piLength != NULL) { *piLength = strlen(pstString); } return SWIG_OK; } } %fragment("SWIG_FromCharPtr", "header", fragment = "SWIG_SciString_FromCharPtr") { #define SWIG_FromCharPtr(charPtr) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr) } %fragment("SWIG_SciString_FromCharPtr", "header") { SWIGINTERN int SWIG_SciString_FromCharPtr(void *pvApiCtx, int iVarOut, const char *pchValue) { if (pchValue) { SciErr sciErr; const char* pstStrings[1]; pstStrings[0] = pchValue; sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, 1, 1, pstStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { int iRet = createEmptyMatrix(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut); if (iRet) { return SWIG_ERROR; } } return SWIG_OK; } } /* * CHAR * ARRAY */ %fragment("SWIG_SciString_AsCharPtrArrayAndSize", "header") { SWIGINTERN int SWIG_SciString_AsCharPtrArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, char ***charPtrArray, char *fname) { SciErr sciErr; int i = 0; int *piAddrVar = NULL; int* piLength = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, NULL, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } piLength = (int*) malloc((*iRows) * (*iCols) * sizeof(int)); sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, NULL); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } *charPtrArray = (char**) malloc((*iRows) * (*iCols) * sizeof(char*)); for(i = 0 ; i < (*iRows) * (*iCols); i++) { (*charPtrArray)[i] = (char*) malloc(sizeof(char) * (piLength[i] + 1)); } sciErr = getMatrixOfString(pvApiCtx, piAddrVar, iRows, iCols, piLength, *charPtrArray); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } free(piLength); return SWIG_OK; } } %fragment("SWIG_SciString_FromCharPtrArrayAndSize", "header") { SWIGINTERN int SWIG_SciString_FromCharPtrArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, char **charPtrArray) { SciErr sciErr; sciErr = createMatrixOfString(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, iRows, iCols, (const char* const*) charPtrArray); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_FromCharPtrAndSize", "header", fragment = "SWIG_SciString_FromCharPtr") { #define SWIG_FromCharPtrAndSize(charPtr, charPtrLength) SWIG_SciString_FromCharPtr(pvApiCtx, SWIG_Scilab_GetOutputPosition(), charPtr) } /* * Char* Scilab variable */ %fragment(SWIG_CreateScilabVariable_frag(char), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(char)(void *pvApiCtx, const char* psVariableName, const char cVariableValue) { SciErr sciErr; char sValue[2]; const char* psStrings[1]; sValue[0] = cVariableValue; sValue[1] = '\0'; psStrings[0] = sValue; sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_CreateScilabVariable_frag(charptr), "wrapper") { SWIGINTERN int SWIG_CreateScilabVariable_dec(charptr)(void *pvApiCtx, const char* psVariableName, const char* psVariableValue) { SciErr sciErr; const char* psStrings[1]; psStrings[0] = psVariableValue; sciErr = createNamedMatrixOfString(pvApiCtx, psVariableName, 1, 1, psStrings); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } return SWIG_OK; } } swig-3.0.12/Lib/scilab/stl.i0000664000175000017500000000026513042756442015357 0ustar williamwilliam/* initial STL definition. extended as needed in each language */ %include %include %include %include %include swig-3.0.12/Lib/scilab/scicontainer.swg0000664000175000017500000002502113042756442017603 0ustar williamwilliam/* ----------------------------------------------------------------------------- * scicontainer.swg * * Scilab list <-> C++ container wrapper * * This wrapper, and its iterator, allows a general use (and reuse) of * the mapping between C++ and Scilab, thanks to the C++ templates. * * Of course, it needs the C++ compiler to support templates, but * since we will use this wrapper with the STL containers, that should * be the case. * ----------------------------------------------------------------------------- */ %{ #include %} #if !defined(SWIG_NO_EXPORT_ITERATOR_METHODS) # if !defined(SWIG_EXPORT_ITERATOR_METHODS) # define SWIG_EXPORT_ITERATOR_METHODS SWIG_EXPORT_ITERATOR_METHODS # endif #endif // #define (SWIG_SCILAB_EXTRA_NATIVE_CONTAINERS) // if defined: sequences in return are converted from/to Scilab lists or matrices // if not defined: sequences are passed from/to Scilab as pointers %{ #define SWIG_STD_NOASSIGN_STL %} %include %include %{ #include %} %include %include %fragment("SciSequence_Cont", "header", fragment="StdTraits", fragment="SwigSciIterator_T") { namespace swig { template struct SciSequence_Ref { SciSequence_Ref(const SwigSciObject& seq, int index) : _seq(seq), _index(index) { if (traits_as_sequence::get(_seq, &piSeqAddr) != SWIG_OK) { throw std::invalid_argument("Cannot get sequence data."); } } operator T () const { return traits_asval_sequenceitem::asval(_seq, piSeqAddr, _index); } SciSequence_Ref& operator=(const T& v) { // TODO return *this; } private: SwigSciObject _seq; int _index; void *piSeqAddr; }; template struct SciSequence_ArrowProxy { SciSequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct SwigSciSequence_InputIterator { typedef SwigSciSequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef int difference_type; SwigSciSequence_InputIterator() { } SwigSciSequence_InputIterator(const SwigSciObject& seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } SciSequence_ArrowProxy operator->() const { return SciSequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: SwigSciObject _seq; difference_type _index; }; template struct SciSequence_Cont { typedef SciSequence_Ref reference; typedef const SciSequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef SwigSciSequence_InputIterator iterator; typedef SwigSciSequence_InputIterator const_iterator; SciSequence_Cont(const SwigSciObject& seq) : _seq(seq) { } ~SciSequence_Cont() { } size_type size() const { int iSeqSize; if (traits_as_sequence::size(_seq, &iSeqSize) == SWIG_OK) { return iSeqSize; } else { return SWIG_ERROR; } } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } private: SwigSciObject _seq; }; } } %define %swig_sequence_iterator(Sequence...) #if defined(SWIG_EXPORT_ITERATOR_METHODS) class iterator; class reverse_iterator; class const_iterator; class const_reverse_iterator; %typemap(out,noblock=1,fragment="SciSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { %set_output(SWIG_NewPointerObj(swig::make_output_iterator(%static_cast($1,const $type &)), swig::SciSwigIterator::descriptor(),SWIG_POINTER_OWN)); } %typemap(out,fragment="SciSequence_Cont") std::pair, std::pair { // TODO: return a Scilab list from the pair (see code for Octave) } %fragment("SciSwigPairBoolOutputIterator", "header", fragment=SWIG_From_frag(bool), fragment="SciSequence_Cont") {} %typemap(out,fragment="SciSwigPairBoolOutputIterator") std::pair, std::pair { // TODO: return a Scilab list from the pair (see code for Octave) } %typemap(in,noblock=1,fragment="SciSequence_Cont") iterator(swig::SciSwigIterator *iter = 0, int res), reverse_iterator(swig::SciSwigIterator *iter = 0, int res), const_iterator(swig::SciSwigIterator *iter = 0, int res), const_reverse_iterator(swig::SciSwigIterator *iter = 0, int res) { res = SWIG_ConvertPtr((SwigSciObject)$input, %as_voidptrptr(&iter), swig::SciSwigIterator::descriptor(), 0); if (!SWIG_IsOK(res) || !iter) { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } else { swig::SwigSciIterator_T<$type > *iter_t = dynamic_cast *>(iter); if (iter_t) { $1 = iter_t->get_current(); } else { %argument_fail(SWIG_TypeError, "$type", $symname, $argnum); } } } %typecheck(%checkcode(ITERATOR),noblock=1,fragment="SciSequence_Cont") iterator, reverse_iterator, const_iterator, const_reverse_iterator { swig::SciSwigIterator *iter = 0; int res = SWIG_ConvertPtr((SwigSciObject)$input, %as_voidptrptr(&iter), swig::SciSwigIterator::descriptor(), 0); $1 = (SWIG_IsOK(res) && iter && (dynamic_cast *>(iter) != 0)); } %fragment("SciSequence_Cont"); #endif //SWIG_EXPORT_ITERATOR_METHODS %enddef // The Scilab container methods %define %swig_container_methods(Container...) %enddef %define %swig_sequence_methods_common(Sequence...) %swig_sequence_iterator(%arg(Sequence)) %swig_container_methods(%arg(Sequence)) %enddef %define %swig_sequence_methods(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef %define %swig_sequence_methods_val(Sequence...) %swig_sequence_methods_common(%arg(Sequence)) %enddef // // Common fragments // %fragment("StdSequenceTraits","header", fragment="StdTraits", fragment="SciSequence_Cont", fragment=SWIG_Traits_SequenceItem_frag(ptr)) { namespace swig { template inline void assign(const SciSeq& sciSeq, Seq* seq) { %#ifdef SWIG_STD_NOASSIGN_STL typedef typename SciSeq::value_type value_type; typename SciSeq::const_iterator it = sciSeq.begin(); for (;it != sciSeq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } %#else seq->assign(sciSeq.begin(), sciSeq.end()); %#endif } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(const SwigSciObject& obj, sequence **seq) { swig_type_info *typeInfo = swig::type_info(); if (typeInfo) { sequence *p; if (SWIG_ConvertPtr(obj, (void**)&p, typeInfo, 0) == SWIG_OK) { if (seq) *seq = p; return SWIG_OLDOBJ; } } if (traits_as_sequence::check(obj) == SWIG_OK) { try { SciSequence_Cont sciSeq(obj); if (seq) { *seq = new sequence(); assign(sciSeq, *seq); return SWIG_NEWOBJ; } else { return SWIG_ERROR; } } catch (std::exception& e) { SWIG_exception(SWIG_RuntimeError, e.what()); return SWIG_ERROR; } } else { return SWIG_ERROR; } } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static SwigSciObject from(const sequence& seq) { %#ifdef SWIG_SCILAB_EXTRA_NATIVE_CONTAINERS swig_type_info *typeInfo = swig::type_info(); if (typeInfo) { return SWIG_NewPointerObj(new sequence(seq), typeInfo, SWIG_POINTER_OWN); } %#endif try { void *data; size_type size = seq.size(); if (traits_from_sequence::create(size, &data) == SWIG_OK) { const_iterator it; int index = 0; for (it = seq.begin(); it != seq.end(); ++it) { traits_from_sequenceitem::from(data, index, *it); index++; } return traits_from_sequence::set(size, data); } return SWIG_OK; } catch (std::exception& e) { SWIG_exception(SWIG_RuntimeError, e.what()); return SWIG_ERROR; } } }; } } swig-3.0.12/Lib/scilab/scisequencepointer.swg0000664000175000017500000000551713042756442021042 0ustar williamwilliam/* * * Scilab list of pointer <-> C++ pointer container * */ %include %fragment("", "header") { %#include } %fragment(SWIG_AsCheck_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(ptr)(SwigSciObject obj) { return SWIG_CheckScilabList(obj); } } %fragment(SWIG_AsGet_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsGet_Sequence_dec(ptr)(SwigSciObject obj, int **piSequence) { return SWIG_GetScilabList(obj, piSequence); } } %fragment(SWIG_AsSize_Sequence_frag(ptr), "header", fragment="SWIG_ScilabList") { SWIGINTERN int SWIG_AsSize_Sequence_dec(ptr)(SwigSciObject obj, int *piSize) { return SWIG_GetScilabListSize(obj, piSize); } } %fragment(SWIG_FromCreate_Sequence_frag(ptr), "header", fragment="") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(ptr)(int size, uintptr_t **pSequence) { *pSequence = new uintptr_t[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(ptr), "header", fragment="") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(ptr)(int size, uintptr_t *pSequence) { SciErr sciErr; int *piListAddr; int iVarOut = SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition(); sciErr = createList(pvApiCtx, iVarOut, size, &piListAddr); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } for (int i=0; i C++ double container * */ %include %fragment(SWIG_AsCheck_Sequence_frag(double), "header") { SWIGINTERN int SWIG_AsCheck_Sequence_dec(double)(SwigSciObject obj) { SciErr sciErr; int *piAddrVar; sciErr = getVarAddressFromPosition(pvApiCtx, obj, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (isDoubleType(pvApiCtx, piAddrVar)) { return SWIG_OK; } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A double is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } } } %fragment(SWIG_AsGet_Sequence_frag(double), "header", fragment="SWIG_SciDouble_AsDoubleArrayAndSize") { SWIGINTERN int SWIG_AsGet_Sequence_dec(double)(SwigSciObject obj, double **pSequence) { int iMatrixRowCount; int iMatrixColCount; return (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, pSequence, SWIG_Scilab_GetFuncName())); } } %fragment(SWIG_AsSize_Sequence_frag(double), "header", fragment="SWIG_SciDouble_AsDoubleArrayAndSize") { SWIGINTERN int SWIG_AsSize_Sequence_dec(double)(SwigSciObject obj, int *piSize) { double *pdblMatrix; int iMatrixRowCount; int iMatrixColCount; if (SWIG_SciDouble_AsDoubleArrayAndSize(pvApiCtx, obj, &iMatrixRowCount, &iMatrixColCount, &pdblMatrix, SWIG_Scilab_GetFuncName()) == SWIG_OK) { if ((iMatrixRowCount > 1) && (iMatrixColCount > 1)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A double vector is expected.\n"), SWIG_Scilab_GetFuncName(), obj); return SWIG_ERROR; } *piSize = iMatrixRowCount * iMatrixColCount; return SWIG_OK; } return SWIG_ERROR; } } %fragment(SWIG_FromCreate_Sequence_frag(double), "header") { SWIGINTERN int SWIG_FromCreate_Sequence_dec(double)(int size, double **pSequence) { *pSequence = new double[size]; return *pSequence != NULL ? SWIG_OK : SWIG_ERROR; } } %fragment(SWIG_FromSet_Sequence_frag(double), "header", fragment="SWIG_SciDouble_FromDoubleArrayAndSize") { SWIGINTERN SwigSciObject SWIG_FromSet_Sequence_dec(double)(int size, double *pSequence) { SwigSciObject obj = SWIG_SciDouble_FromDoubleArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, size, pSequence); delete (double *)pSequence; return obj; } } %fragment(SWIG_AsVal_SequenceItem_frag(double), "header") { SWIGINTERN double SWIG_AsVal_SequenceItem_dec(double)(SwigSciObject obj, double *pSequence, int iItemIndex) { return pSequence[iItemIndex]; } } %fragment(SWIG_From_SequenceItem_frag(double), "header") { SWIGINTERN int SWIG_From_SequenceItem_dec(double)(double *pSequence, int iItemIndex, double itemValue) { pSequence[iItemIndex] = itemValue; return SWIG_OK; } } swig-3.0.12/Lib/scilab/exception.i0000664000175000017500000000020213042756442016542 0ustar williamwilliam%include %insert("runtime") { %define_as(SWIG_exception(code, msg), SWIG_Scilab_Error(code, msg);) } swig-3.0.12/Lib/scilab/std_list.i0000664000175000017500000000141713042756442016402 0ustar williamwilliam/* * * C++ type : STL list * Scilab type : matrix (for primitive types) or list (for pointer types) * */ %fragment("StdListTraits", "header", fragment="StdSequenceTraits") %{ namespace swig { template struct traits_asptr > { static int asptr(SwigSciObject obj, std::list **lis) { return traits_asptr_stdseq >::asptr(obj, lis); } }; template struct traits_from > { static SwigSciObject from(const std::list &lis) { return traits_from_stdseq >::from(lis); } }; } %} #define %swig_list_methods(Type...) %swig_sequence_methods(Type) #define %swig_list_methods_val(Type...) %swig_sequence_methods_val(Type); %include swig-3.0.12/Lib/scilab/scimisctypes.swg0000664000175000017500000000417113042756442017644 0ustar williamwilliam// Other primitive such as size_t and ptrdiff_t /* * C-type: size_t * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(size_t), "header", fragment="SWIG_Int_AsSize") { %#define SWIG_AsVal_size_t(scilabValue, valuePointer) SWIG_Int_AsSize(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_AsSize", "header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_Int_AsSize(void *pvApiCtx, SwigSciObject iVar, size_t *piValue, char *fname) { int iValue = 0; if (SWIG_AsVal_dec(int)(iVar, &iValue) != SWIG_OK) return SWIG_ERROR; if (piValue) *piValue = (size_t) iValue; return SWIG_OK; } } %fragment(SWIG_From_frag(size_t), "header", fragment="SWIG_Int_FromSize") { %#define SWIG_From_size_t(scilabValue) SWIG_Int_FromSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_FromSize", "header", fragment=SWIG_From_frag(int)) { SWIGINTERN int SWIG_Int_FromSize(void *pvApiCtx, int iVarOut, size_t iValue, char *fname) { return SWIG_From_dec(int)((int)iValue); } } /* * C-type: ptrdiff_t * Scilab type: double or int32 */ %fragment(SWIG_AsVal_frag(ptrdiff_t), "header", fragment="SWIG_Int_AsPtrDiff") { %#define SWIG_AsVal_ptrdiff_t(scilabValue, valuePointer) SWIG_Int_AsPtrDiff(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_AsPtrDiff", "header", fragment=SWIG_AsVal_frag(int)) { SWIGINTERN int SWIG_Int_AsPtrDiff(void *pvApiCtx, SwigSciObject iVar, ptrdiff_t *piValue, char *fname) { int iValue = 0; if (SWIG_AsVal_dec(int)(iVar, &iValue) != SWIG_OK) return SWIG_ERROR; if (piValue) *piValue = (ptrdiff_t) iValue; return SWIG_OK; } } %fragment(SWIG_From_frag(ptrdiff_t), "header", fragment="SWIG_Int_FromPtrDiff") { %#define SWIG_From_ptrdiff_t(scilabValue) SWIG_Int_FromPtrDiff(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_Int_FromPtrDiff", "header", fragment=SWIG_From_frag(int)) { SWIGINTERN int SWIG_Int_FromPtrDiff(void *pvApiCtx, int iVarOut, ptrdiff_t iValue, char *fname) { return SWIG_From_dec(int)((int)iValue); } } swig-3.0.12/Lib/scilab/scimatrixchar.swg0000664000175000017500000001201313042756442017760 0ustar williamwilliam/* * C-type: char* * Scilab type: string matrix */ %include // in (char **IN, int IN_ROWCOUNT, int IN_COLCOUNT) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char **IN, int IN_ROWCOUNT, int IN_COLCOUNT) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$2, &$3, &$1, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (int IN_ROWCOUNT, int IN_COLCOUNT, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_ROWCOUNT, int IN_COLCOUNT, char **IN) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &$1, &$2, &$3, fname) != SWIG_OK) { return SWIG_ERROR; } } // in (char **IN, int IN_SIZE) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (char **IN, int IN_SIZE) (int rowCount, int colCount) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$1, fname) == SWIG_OK) { $2 = rowCount * colCount; } else { return SWIG_ERROR; } } // in (int IN_SIZE, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_SIZE, char **IN) (int rowCount, int colCount) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, &rowCount, &colCount, &$2, fname) == SWIG_OK) { $1 = rowCount * colCount; } else { return SWIG_ERROR; } } // out (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) %typemap(in, noblock=1, numinputs=0) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { } %typemap(arginit, noblock=1) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); $3 = (int*) malloc(sizeof(int)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$2, *$3, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (char ***OUT, int *OUT_ROWCOUNT, int *OUT_COLCOUNT) { { int i; for (i = 0; i < (*$2) * (*$3); i++) free((*$1)[i]); } free(*$1); free($1); free($2); free($3); } // out (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { } %typemap(arginit, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); $3 = (int**) malloc(sizeof(int*)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), *$1, *$2, *$3) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_ROWCOUNT, int *OUT_COLCOUNT, char ***OUT) { free($1); free($2); { int i; for (i = 0; i < (*$1) * (*$2); i++) free((*$3)[i]); } free(*$3); free($3); } // out (char ***OUT, int *OUT_SIZE) %typemap(in, noblock=1, numinputs=0) (char ***OUT, int *OUT_SIZE) { } %typemap(arginit, noblock=1) (char ***OUT, int *OUT_SIZE) { $1 = (char***) malloc(sizeof(char**)); $2 = (int*) malloc(sizeof(int)); } %typemap(freearg, noblock=1) (char ***OUT, int *OUT_SIZE) { { int i; for (i = 0; i < *$2; i++) free((*$1)[i]); } free(*$1); free($1); free($2); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (char ***OUT, int *OUT_SIZE) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$2, *$1) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } // in (int IN_SIZE, char **IN) %typemap(in, noblock=1, fragment="SWIG_SciString_AsCharPtrArrayAndSize") (int IN_SIZE, char **IN) { if (SWIG_SciString_AsCharPtrArrayAndSize(pvApiCtx, $input, 1, &$1, &$2, fname) != SWIG_OK) { return SWIG_ERROR; } } // out (int *OUT_SIZE, char ***OUT) %typemap(in, noblock=1, numinputs=0) (int *OUT_SIZE, char ***OUT) { } %typemap(arginit, noblock=1) (int *OUT_SIZE, char ***OUT) { $1 = (int*) malloc(sizeof(int)); $2 = (char***) malloc(sizeof(char**)); } %typemap(argout, noblock=1, fragment="SWIG_SciString_FromCharPtrArrayAndSize") (int *OUT_SIZE, char ***OUT) { if (SWIG_SciString_FromCharPtrArrayAndSize(pvApiCtx, SWIG_Scilab_GetOutputPosition(), 1, *$1, *$2) == SWIG_OK) { SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition()); } else { return SWIG_ERROR; } } %typemap(freearg, noblock=1) (int *OUT_SIZE, char ***OUT) { free($1); { int i; for (i = 0; i < *$1; i++) free((*$2)[i]); } free(*$2); free($2); } swig-3.0.12/Lib/scilab/sciunsignedshort.swg0000664000175000017500000001416313042756442020522 0ustar williamwilliam/* * C-type: unsigned short * Scilab type: double or uint16 */ %fragment(SWIG_AsVal_frag(unsigned short), "header", fragment="SWIG_SciDoubleOrUint16_AsUnsignedShort", fragment="") { %#define SWIG_AsVal_unsigned_SS_short(scilabValue, valuePointer) SWIG_SciDoubleOrUint16_AsUnsignedShort(pvApiCtx, scilabValue, valuePointer, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDoubleOrUint16_AsUnsignedShort", "header") { SWIGINTERN int SWIG_SciDoubleOrUint16_AsUnsignedShort(void *pvApiCtx, int iVar, unsigned short *pusValue, char *fname) { SciErr sciErr; int iType = 0; int iRows = 0; int iCols = 0; int iPrec = 0; int *piAddrVar = NULL; unsigned short *pusData = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_ints) { if (pusValue) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, piAddrVar, &iRows, &iCols, &pusData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } *pusValue = *pusData; } } else if (iType == sci_matrix) { if (pusValue) { double *pdData = NULL; double dValue = 0.0f; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, &iRows, &iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iRows * iCols != 1) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong size for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_TypeError; } dValue = *pdData; if (dValue != floor(dValue)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a 16-bit unsigned integer.\n"), fname, iVar); return SWIG_ValueError; } if ((dValue < 0) || (dValue > USHRT_MAX)) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a 16-bit unsigned integer.\n"), fname, iVar); return SWIG_OverflowError; } *pusValue = (unsigned short) dValue; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment(SWIG_From_frag(unsigned short), "header", fragment="SWIG_SciDouble_FromUnsignedShort") { %#define SWIG_From_unsigned_SS_short(scilabValue) SWIG_SciDouble_FromUnsignedShort(pvApiCtx, SWIG_Scilab_GetOutputPosition(), scilabValue, SWIG_Scilab_GetFuncName()) } %fragment("SWIG_SciDouble_FromUnsignedShort", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedShort(void *pvApiCtx, int iVarOut, unsigned short usValue, char *fname) { if (createScalarDouble(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + iVarOut, (double) usValue)) return SWIG_ERROR; return SWIG_OK; } } /* * C-type: unsigned short[] * Scilab type: uint16 vector */ %fragment("SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDoubleOrUint16_AsUnsignedShortArrayAndSize(void *pvApiCtx, int iVar, int *iRows, int *iCols, unsigned short **pusValue, char *fname) { SciErr sciErr; int iType = 0; int iPrec = 0; int *piAddrVar = NULL; sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } sciErr = getVarType(pvApiCtx, piAddrVar, &iType); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iType == sci_matrix) { double *pdData = NULL; int size = 0; int i; sciErr = getMatrixOfDouble(pvApiCtx, piAddrVar, iRows, iCols, &pdData); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } size = (*iRows) * (*iCols); *pusValue = (unsigned short*) malloc(size * sizeof(int*)); for (i = 0; i < size; i++) (*pusValue)[i] = (unsigned short) pdData[i]; } else if (iType == sci_ints) { sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } if (iPrec != SCI_UINT16) { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } sciErr = getMatrixOfUnsignedInteger16(pvApiCtx, piAddrVar, iRows, iCols, pusValue); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } } else { Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A 16-bit unsigned integer or a double vector expected.\n"), fname, iVar); return SWIG_ERROR; } return SWIG_OK; } } %fragment("SWIG_SciDouble_FromUnsignedShortArrayAndSize", "header") { SWIGINTERN int SWIG_SciDouble_FromUnsignedShortArrayAndSize(void *pvApiCtx, int iVarOut, int iRows, int iCols, unsigned short *pusValues) { SciErr sciErr; double *pdValues = NULL; int i; pdValues = (double*) malloc(iRows * iCols * sizeof(double)); for (i=0; i swig-3.0.12/Lib/scilab/sciruntime.swg0000664000175000017500000000165413042756442017312 0ustar williamwilliam%insert(runtime) "swigrun.swg"; %insert(runtime) "swigerrors.swg"; %insert(runtime) "scirun.swg"; %insert(init) %{ /* Module management functions */ #define SWIG_GetModule(clientdata) SWIG_Scilab_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Scilab_SetModule(pointer) SWIGRUNTIME swig_module_info* SWIG_Scilab_GetModule(void) { return NULL; } SWIGRUNTIME void SWIG_Scilab_SetModule(swig_module_info *swig_module) { } %} %insert(init) "swiginit.swg" %insert(init) %{ SWIGRUNTIME swig_type_info * SWIG_Scilab_TypeQuery(const char *name) { if (SWIG_Module_Initialized()) { return SWIG_TypeQuery(name); } else { SWIG_Error(SWIG_RuntimeError, "the module is not initialized"); return NULL; } } %} %insert(init) %{ #ifdef __cplusplus extern "C" #endif int _Init(SWIG_GatewayParameters) { SWIG_InitializeModule(NULL); SWIG_CreateScilabVariables(pvApiCtx); swig_module_initialized = 1; %} swig-3.0.12/Lib/scilab/std_map.i0000664000175000017500000000400313042756442016176 0ustar williamwilliam// // SWIG typemaps for std::map // // Common implementation %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/scilab/scitypemaps.swg0000664000175000017500000002373113042756442017471 0ustar williamwilliam// Scilab fragments for primitive types %include %include // Scilab object type #define SWIG_Object int #define %append_output(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_constant(name, obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR // Name is managed by the the function name #define %raise(obj, type, desc) SWIG_Scilab_Raise(obj, type, desc) #define %set_output(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_varoutput(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR #define %set_argoutput(obj) if (!SWIG_IsOK(SWIG_Scilab_SetOutput(pvApiCtx, obj))) return SWIG_ERROR // Include the unified typemap library %include /* ---------------------------------------------------------------------------*/ /* Generic typmemaps */ /* */ /* This typemap is used when Scilab does not store this type directly */ /* For example, a 'float' is stored in Scilab as a 'double' */ /* So we read a 'double' in Scilab and cast it to a 'float' */ /* ---------------------------------------------------------------------------*/ %define %scilab_in_typemap_withcast(TYPEMAPTYPE, FRAGMENTNAME, CTYPE, TEMPTYPE, TEMPINIT) %typemap(TYPEMAPTYPE, fragment="FRAGMENTNAME") CTYPE { TEMPTYPE tempValue = TEMPINIT; if(FRAGMENTNAME(pvApiCtx, $input, &tempValue, SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } $1 = (CTYPE) tempValue; } %enddef %define %scilab_inptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $input, %as_voidptrptr(&$1), SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_out_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, $1) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_outptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, %as_voidptr($1)) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_varout_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, $value) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_varoutptr_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $result, %as_voidptr($value)) != SWIG_OK) { return SWIG_ERROR; } } %enddef %define %scilab_in_typemap(TYPEMAPTYPE, FRAGMENTNAME, CTYPE) %typemap(TYPEMAPTYPE, noblock=1, fragment="FRAGMENTNAME") CTYPE { if (FRAGMENTNAME(pvApiCtx, $input, &$1, SWIG_Scilab_GetFuncName()) != SWIG_OK) { return SWIG_ERROR; } } %enddef /* ---------------------------------------------------------------------------*/ /* Array typmemaps */ /* ---------------------------------------------------------------------------*/ %include /* ---------------------------------------------------------------------------*/ /* Enum typemaps */ /* ---------------------------------------------------------------------------*/ %typemap(in, noblock=1, fragment=SWIG_AsVal_frag(Enum)) enum SWIGTYPE (int val) { if (SWIG_AsVal_dec(Enum)($input, &val) != SWIG_OK) { return SWIG_ERROR; } $1 = %reinterpret_cast(val, $ltype); } %typemap(out, fragment=SWIG_From_frag(Enum)) enum SWIGTYPE { if (SWIG_From_dec(Enum)($1) != SWIG_OK) { return SWIG_ERROR; } } /* ---------------------------------------------------------------------------*/ /* Typecheck typemaps */ /* ---------------------------------------------------------------------------*/ %define %scilab_typecheck_generic(PRECEDENCE, TYPE_CHECK_FUNCTION, TYPE) %typecheck(PRECEDENCE) TYPE { int *piAddrVar = NULL; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, $input, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return SWIG_ERROR; } $1 = TYPE_CHECK_FUNCTION(pvApiCtx, piAddrVar); } %enddef %fragment("SWIG_Check_SciDoubleOrInt", "header") { SWIGINTERN int SWIG_Check_SciDoubleOrInt(void *pvApiCtx, SwigSciObject iVar, int iIntegerType) { int *piAddrVar = NULL; int ret = 0; SciErr sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &piAddrVar); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } ret = isIntegerType(pvApiCtx, piAddrVar); if (ret == 1) { int iPrec = 0; sciErr = getMatrixOfIntegerPrecision(pvApiCtx, piAddrVar, &iPrec); if (sciErr.iErr) { printError(&sciErr, 0); return 0; } ret = (iPrec == iIntegerType) ? 1 : 0; } else { ret = isDoubleType(pvApiCtx, piAddrVar); } return ret; } } /* Scilab equivalent for C integers can be sci_intXX or sci_matrix */ %define %scilab_typecheck_integer(PRECEDENCE, INTTYPE, TYPE) %typecheck(PRECEDENCE, fragment="SWIG_Check_SciDoubleOrInt") TYPE { $1 = SWIG_Check_SciDoubleOrInt(pvApiCtx, $input, INTTYPE); } %enddef %define %scilab_typecheck_pointer(PRECEDENCE, TYPE) %typecheck(PRECEDENCE) TYPE { $1 = SwigScilabCheckPtr(pvApiCtx, $input, $descriptor, SWIG_Scilab_GetFuncName()); } %enddef // Double (and Float) have priority over before Integer type. // Primitive types %scilab_typecheck_pointer(SWIG_TYPECHECK_VOIDPTR, SWIGTYPE *) %scilab_typecheck_pointer(SWIG_TYPECHECK_POINTER, SWIGTYPE *) %scilab_typecheck_generic(SWIG_TYPECHECK_BOOL, isBooleanType, bool) %scilab_typecheck_generic(16, isDoubleType, double) %scilab_typecheck_generic(17, isDoubleType, float) %scilab_typecheck_integer(SWIG_TYPECHECK_INT8, SCI_INT8, signed char) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT8, SCI_UINT8, unsigned char) %scilab_typecheck_integer(SWIG_TYPECHECK_INT16, SCI_INT16, short) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT16, SCI_UINT16, unsigned short) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, int) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, long) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT32, SCI_UINT32, unsigned int) %scilab_typecheck_integer(SWIG_TYPECHECK_UINT32, SCI_UINT32, unsigned long) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32, SCI_INT32, enum SWIGTYPE) %scilab_typecheck_generic(SWIG_TYPECHECK_CHAR, isStringType, char) // Arrays %scilab_typecheck_generic(SWIG_TYPECHECK_BOOL_ARRAY, isBooleanType, bool) %scilab_typecheck_generic(1016, isDoubleType, double [ANY]) %scilab_typecheck_generic(1017, isDoubleType, float [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT8_ARRAY, SCI_INT8, signed char [ANY]) %scilab_typecheck_integer(1026, SCI_UINT8, unsigned char [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT16_ARRAY, SCI_INT16, short [ANY]) %scilab_typecheck_integer(1036, SCI_UINT16, unsigned short [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32_ARRAY, SCI_INT32, int [ANY]) %scilab_typecheck_integer(SWIG_TYPECHECK_INT32_ARRAY, SCI_INT32, long [ANY]) %scilab_typecheck_integer(1046, SCI_UINT32, unsigned int [ANY]) %scilab_typecheck_integer(1046, SCI_UINT32, unsigned long [ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_CHAR_ARRAY, isStringType, char [ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_STRING_ARRAY, isStringType, char *[ANY]) %scilab_typecheck_generic(SWIG_TYPECHECK_STRING_ARRAY, isStringType, char **) /* ---------------------------------------------------------------------------*/ /* %scilabconstcode() feature typemaps */ /* ---------------------------------------------------------------------------*/ %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(double)) double %{ if (SWIG_CreateScilabVariable_double(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(int)) int %{ if (SWIG_CreateScilabVariable_int(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(uint)) unsigned int %{ if (SWIG_CreateScilabVariable_uint(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(int)) long %{ if (SWIG_CreateScilabVariable_int(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(uint)) unsigned long %{ if (SWIG_CreateScilabVariable_uint(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(char)) char %{ if (SWIG_CreateScilabVariable_char(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(charptr)) char * %{ if (SWIG_CreateScilabVariable_charptr(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} %typemap(scilabconstcode, fragment=SWIG_CreateScilabVariable_frag(double)) enum SWIGTYPE %{ if (SWIG_CreateScilabVariable_double(pvApiCtx, "$result", $value) != SWIG_OK) return SWIG_ERROR; %} /* ---------------------------------------------------------------------------*/ /* Exception typmemaps */ /* ---------------------------------------------------------------------------*/ %include swig-3.0.12/Lib/scilab/boost_shared_ptr.i0000664000175000017500000003744413042756442020127 0ustar williamwilliam%include // Set SHARED_PTR_DISOWN to $disown if required, for example // #define SHARED_PTR_DISOWN $disown #if !defined(SHARED_PTR_DISOWN) #define SHARED_PTR_DISOWN 0 #endif // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(out) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } if (!argp) { %variable_nullref("$type", "$name"); } else { $1 = *(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get()); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); } } %typemap(varout) CONST TYPE { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) CONST TYPE * (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), $owner | SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE * { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0; if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { smartarg = %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast((smartarg ? smartarg->get() : 0), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain reference %typemap(in) CONST TYPE & (void *argp = 0, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (!argp) { %argument_nullref("$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = %const_cast(tempshared.get(), $1_ltype); } else { $1 = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(out, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) CONST TYPE & { void *argp = 0; int newmem = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared; if (!argp) { %variable_nullref("$type", "$name"); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); $1 = *%const_cast(tempshared.get(), $1_ltype); } else { $1 = *%const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $1_ltype); } } %typemap(varout, fragment="SWIG_null_deleter_python") CONST TYPE & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(&$1 SWIG_NO_NULL_DELETER_0); %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // plain pointer by reference // Note: $disown not implemented by default as it will lead to a memory leak of the shared_ptr instance %typemap(in) TYPE *CONST& (void *argp = 0, int res = 0, $*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SHARED_PTR_DISOWN | %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { tempshared = *%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); delete %reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *); temp = %const_cast(tempshared.get(), $*1_ltype); } else { temp = %const_cast(%reinterpret_cast(argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *)->get(), $*1_ltype); } $1 = &temp; } %typemap(out, fragment="SWIG_null_deleter_python") TYPE *CONST& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) TYPE *CONST& %{ #error "varin typemap not implemented" %} %typemap(varout) TYPE *CONST& %{ #error "varout typemap not implemented" %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > (void *argp, int res = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) $1 = *(%reinterpret_cast(argp, $<ype)); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { int newmem = 0; void *argp = 0; int res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %variable_fail(res, "$type", "$name"); } $1 = argp ? *(%reinterpret_cast(argp, $<ype)) : SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE >(); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $<ype); } %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1) : 0; %set_varoutput(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ #error "varout typemap not implemented" %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * (void *argp, int res = 0, $*1_ltype tempshared) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (newmem & SWIG_CAST_NEW_MEMORY) { if (argp) tempshared = *%reinterpret_cast(argp, $ltype); delete %reinterpret_cast(argp, $ltype); $1 = &tempshared; } else { $1 = (argp) ? %reinterpret_cast(argp, $ltype) : &tempshared; } } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = $1 && *$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); if ($owner) delete $1; } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ #error "varout typemap not implemented" %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (void *argp, int res = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempshared, $*1_ltype temp = 0) { int newmem = 0; res = SWIG_ConvertPtrAndOwn($input, &argp, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), %convertptr_flags, &newmem); if (!SWIG_IsOK(res)) { %argument_fail(res, "$type", $symname, $argnum); } if (argp) tempshared = *%reinterpret_cast(argp, $*ltype); if (newmem & SWIG_CAST_NEW_MEMORY) delete %reinterpret_cast(argp, $*ltype); temp = &tempshared; $1 = &temp; } %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartresult = *$1 && **$1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %set_output(SWIG_NewPointerObj(%as_voidptr(smartresult), $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), SWIG_POINTER_OWN)); } %typemap(varin) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varin typemap not implemented" %} %typemap(varout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ #error "varout typemap not implemented" %} // Typecheck typemaps // Note: SWIG_ConvertPtr with void ** parameter set to 0 instead of using SWIG_ConvertPtrAndOwn, so that the casting // function is not called thereby avoiding a possible smart pointer copy constructor call when casting up the inheritance chain. %typemap(typecheck,precedence=SWIG_TYPECHECK_POINTER,noblock=1) TYPE CONST, TYPE CONST &, TYPE CONST *, TYPE *CONST&, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { int res = SWIG_ConvertPtr($input, 0, $descriptor(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > *), 0); $1 = SWIG_CheckState(res); } // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/inttypes.i0000664000175000017500000000451413042756442015200 0ustar williamwilliam/* ----------------------------------------------------------------------------- * inttypes.i * * SWIG library file for ISO C99 types: 7.8 Format conversion of integer types * ----------------------------------------------------------------------------- */ %{ #include %} %include %include #ifdef __cplusplus extern "C" { #endif #ifdef SWIGWORDSIZE64 /* We have to define the `uintmax_t' type using `ldiv_t'. */ typedef struct { long int quot; /* Quotient. */ long int rem; /* Remainder. */ } imaxdiv_t; #else /* We have to define the `uintmax_t' type using `lldiv_t'. */ typedef struct { long long int quot; /* Quotient. */ long long int rem; /* Remainder. */ } imaxdiv_t; #endif /* Compute absolute value of N. */ extern intmax_t imaxabs (intmax_t n); /* Return the `imaxdiv_t' representation of the value of NUMER over DENOM. */ extern imaxdiv_t imaxdiv (intmax_t numer, intmax_t denom); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern intmax_t wcstoimax (const wchar_t *nptr, wchar_t **endptr, int base); /* Like `wcstoul' but convert to `uintmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t ** endptr, int base); #endif #ifdef SWIGWORDSIZE64 /* Like `strtol' but convert to `intmax_t'. */ extern intmax_t strtoimax (const char *nptr, char **endptr, int base); /* Like `strtoul' but convert to `uintmax_t'. */ extern uintmax_t strtoumax (const char *nptr, char **endptr,int base); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern intmax_t wcstoimax (const wchar_t *nptr, wchar_t **endptr, int base); /* Like `wcstoul' but convert to `uintmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t **endptr, int base); #endif #else /* SWIGWORDSIZE32 */ /* Like `strtol' but convert to `intmax_t'. */ extern intmax_t strtoimax (const char *nptr, char **endptr, int base); /* Like `strtoul' but convert to `uintmax_t'. */ extern uintmax_t strtoumax (const char *nptr, char **endptr, int base); #ifdef SWIG_WCHAR /* Like `wcstol' but convert to `intmax_t'. */ extern uintmax_t wcstoumax (const wchar_t *nptr, wchar_t **endptr, int base); #endif #endif /* SWIGWORDSIZE64 */ #ifdef __cplusplus } #endif swig-3.0.12/Lib/exception.i0000664000175000017500000002007613042756442015320 0ustar williamwilliam/* ----------------------------------------------------------------------------- * exception.i * * SWIG library file providing language independent exception handling * ----------------------------------------------------------------------------- */ #if defined(SWIGUTL) #error "This version of exception.i should not be used" #endif %insert("runtime") "swigerrors.swg" #ifdef SWIGPHP5 %{ #include "zend_exceptions.h" #define SWIG_exception(code, msg) do { zend_throw_exception(NULL, (char*)msg, code TSRMLS_CC); goto thrown; } while (0) %} #endif #ifdef SWIGPHP7 %{ #include "zend_exceptions.h" #define SWIG_exception(code, msg) do { zend_throw_exception(NULL, (char*)msg, code); goto thrown; } while (0) %} #endif #ifdef SWIGGUILE %{ SWIGINTERN void SWIG_exception_ (int code, const char *msg, const char *subr) { #define ERROR(scmerr) \ scm_error(scm_from_locale_string((char *) (scmerr)), \ (char *) subr, (char *) msg, \ SCM_EOL, SCM_BOOL_F) #define MAP(swigerr, scmerr) \ case swigerr: \ ERROR(scmerr); \ break switch (code) { MAP(SWIG_MemoryError, "swig-memory-error"); MAP(SWIG_IOError, "swig-io-error"); MAP(SWIG_RuntimeError, "swig-runtime-error"); MAP(SWIG_IndexError, "swig-index-error"); MAP(SWIG_TypeError, "swig-type-error"); MAP(SWIG_DivisionByZero, "swig-division-by-zero"); MAP(SWIG_OverflowError, "swig-overflow-error"); MAP(SWIG_SyntaxError, "swig-syntax-error"); MAP(SWIG_ValueError, "swig-value-error"); MAP(SWIG_SystemError, "swig-system-error"); default: ERROR("swig-error"); } #undef ERROR #undef MAP } #define SWIG_exception(a,b) SWIG_exception_(a, b, FUNC_NAME) %} #endif #ifdef SWIGMZSCHEME %{ SWIGINTERN void SWIG_exception_ (int code, const char *msg) { #define ERROR(errname) \ scheme_signal_error(errname " (%s)", msg); #define MAP(swigerr, errname) \ case swigerr: \ ERROR(errname); \ break switch (code) { MAP(SWIG_MemoryError, "swig-memory-error"); MAP(SWIG_IOError, "swig-io-error"); MAP(SWIG_RuntimeError, "swig-runtime-error"); MAP(SWIG_IndexError, "swig-index-error"); MAP(SWIG_TypeError, "swig-type-error"); MAP(SWIG_DivisionByZero, "swig-division-by-zero"); MAP(SWIG_OverflowError, "swig-overflow-error"); MAP(SWIG_SyntaxError, "swig-syntax-error"); MAP(SWIG_ValueError, "swig-value-error"); MAP(SWIG_SystemError, "swig-system-error"); default: ERROR("swig-error"); } #undef ERROR #undef MAP } #define SWIG_exception(a,b) SWIG_exception_(a, b) %} #endif #ifdef SWIGJAVA %{ SWIGINTERN void SWIG_JavaException(JNIEnv *jenv, int code, const char *msg) { SWIG_JavaExceptionCodes exception_code = SWIG_JavaUnknownError; switch(code) { case SWIG_MemoryError: exception_code = SWIG_JavaOutOfMemoryError; break; case SWIG_IOError: exception_code = SWIG_JavaIOException; break; case SWIG_SystemError: case SWIG_RuntimeError: exception_code = SWIG_JavaRuntimeException; break; case SWIG_OverflowError: case SWIG_IndexError: exception_code = SWIG_JavaIndexOutOfBoundsException; break; case SWIG_DivisionByZero: exception_code = SWIG_JavaArithmeticException; break; case SWIG_SyntaxError: case SWIG_ValueError: case SWIG_TypeError: exception_code = SWIG_JavaIllegalArgumentException; break; case SWIG_UnknownError: default: exception_code = SWIG_JavaUnknownError; break; } SWIG_JavaThrowException(jenv, exception_code, msg); } %} #define SWIG_exception(code, msg)\ { SWIG_JavaException(jenv, code, msg); return $null; } #endif // SWIGJAVA #ifdef SWIGOCAML %{ #define OCAML_MSG_BUF_LEN 1024 SWIGINTERN void SWIG_exception_(int code, const char *msg) { char msg_buf[OCAML_MSG_BUF_LEN]; sprintf( msg_buf, "Exception(%d): %s\n", code, msg ); failwith( msg_buf ); } #define SWIG_exception(a,b) SWIG_exception_((a),(b)) %} #endif #ifdef SWIGCHICKEN %{ SWIGINTERN void SWIG_exception_(int code, const char *msg) { C_word *a; C_word scmmsg; C_word list; a = C_alloc (C_SIZEOF_STRING (strlen (msg)) + C_SIZEOF_LIST(2)); scmmsg = C_string2 (&a, (char *) msg); list = C_list(&a, 2, C_fix(code), scmmsg); SWIG_ThrowException(list); } #define SWIG_exception(a,b) SWIG_exception_((a),(b)) %} #endif #ifdef SWIGCSHARP %{ SWIGINTERN void SWIG_CSharpException(int code, const char *msg) { if (code == SWIG_ValueError) { SWIG_CSharpExceptionArgumentCodes exception_code = SWIG_CSharpArgumentOutOfRangeException; SWIG_CSharpSetPendingExceptionArgument(exception_code, msg, 0); } else { SWIG_CSharpExceptionCodes exception_code = SWIG_CSharpApplicationException; switch(code) { case SWIG_MemoryError: exception_code = SWIG_CSharpOutOfMemoryException; break; case SWIG_IndexError: exception_code = SWIG_CSharpIndexOutOfRangeException; break; case SWIG_DivisionByZero: exception_code = SWIG_CSharpDivideByZeroException; break; case SWIG_IOError: exception_code = SWIG_CSharpIOException; break; case SWIG_OverflowError: exception_code = SWIG_CSharpOverflowException; break; case SWIG_RuntimeError: case SWIG_TypeError: case SWIG_SyntaxError: case SWIG_SystemError: case SWIG_UnknownError: default: exception_code = SWIG_CSharpApplicationException; break; } SWIG_CSharpSetPendingException(exception_code, msg); } } %} #define SWIG_exception(code, msg)\ { SWIG_CSharpException(code, msg); return $null; } #endif // SWIGCSHARP #ifdef SWIGLUA %{ #define SWIG_exception(a,b)\ { lua_pushfstring(L,"%s:%s",#a,b);SWIG_fail; } %} #endif // SWIGLUA #ifdef SWIGD %{ SWIGINTERN void SWIG_DThrowException(int code, const char *msg) { SWIG_DExceptionCodes exception_code; switch(code) { case SWIG_IndexError: exception_code = SWIG_DNoSuchElementException; break; case SWIG_IOError: exception_code = SWIG_DIOException; break; case SWIG_ValueError: exception_code = SWIG_DIllegalArgumentException; break; case SWIG_DivisionByZero: case SWIG_MemoryError: case SWIG_OverflowError: case SWIG_RuntimeError: case SWIG_TypeError: case SWIG_SyntaxError: case SWIG_SystemError: case SWIG_UnknownError: default: exception_code = SWIG_DException; break; } SWIG_DSetPendingException(exception_code, msg); } %} #define SWIG_exception(code, msg)\ { SWIG_DThrowException(code, msg); return $null; } #endif // SWIGD #ifdef __cplusplus /* You can use the SWIG_CATCH_STDEXCEPT macro with the %exception directive as follows: %exception { try { $action } catch (my_except& e) { ... } SWIG_CATCH_STDEXCEPT // catch std::exception catch (...) { SWIG_exception(SWIG_UnknownError, "Unknown exception"); } } */ %{ #include #include %} %define SWIG_CATCH_STDEXCEPT /* catching std::exception */ catch (std::invalid_argument& e) { SWIG_exception(SWIG_ValueError, e.what() ); } catch (std::domain_error& e) { SWIG_exception(SWIG_ValueError, e.what() ); } catch (std::overflow_error& e) { SWIG_exception(SWIG_OverflowError, e.what() ); } catch (std::out_of_range& e) { SWIG_exception(SWIG_IndexError, e.what() ); } catch (std::length_error& e) { SWIG_exception(SWIG_IndexError, e.what() ); } catch (std::runtime_error& e) { SWIG_exception(SWIG_RuntimeError, e.what() ); } catch (std::bad_cast& e) { SWIG_exception(SWIG_TypeError, e.what() ); } catch (std::exception& e) { SWIG_exception(SWIG_SystemError, e.what() ); } %enddef %define SWIG_CATCH_UNKNOWN catch (std::exception& e) { SWIG_exception(SWIG_SystemError, e.what() ); } catch (...) { SWIG_exception(SWIG_UnknownError, "unknown exception"); } %enddef /* rethrow the unknown exception */ #if defined(SWIGCSHARP) || defined(SWIGD) %typemap(throws,noblock=1, canthrow=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } #else %typemap(throws,noblock=1) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } #endif #endif /* __cplusplus */ /* exception.i ends here */ swig-3.0.12/Lib/ocaml/0000775000175000017500000000000013042756442014236 5ustar williamwilliamswig-3.0.12/Lib/ocaml/std_complex.i0000664000175000017500000000301413042756442016727 0ustar williamwilliam// -*- C++ -*- #ifndef SWIG_STD_COMPLEX_I_ #define SWIG_STD_COMPLEX_I_ #ifdef SWIG %{ #include %} namespace std { template class complex; %define specialize_std_complex(T) %typemap(in) complex { if (PyComplex_Check($input)) { $1 = std::complex(PyComplex_RealAsDouble($input), PyComplex_ImagAsDouble($input)); } else if (PyFloat_Check($input)) { $1 = std::complex(PyFloat_AsDouble($input), 0); } else if (PyInt_Check($input)) { $1 = std::complex(PyInt_AsLong($input), 0); } else { PyErr_SetString(PyExc_TypeError,"Expected a complex"); SWIG_fail; } } %typemap(in) const complex& (std::complex temp) { if (PyComplex_Check($input)) { temp = std::complex(PyComplex_RealAsDouble($input), PyComplex_ImagAsDouble($input)); $1 = &temp; } else if (PyFloat_Check($input)) { temp = std::complex(PyFloat_AsDouble($input), 0); $1 = &temp; } else if (PyInt_Check($input)) { temp = std::complex(PyInt_AsLong($input), 0); $1 = &temp; } else { PyErr_SetString(PyExc_TypeError,"Expected a complex"); SWIG_fail; } } %typemap(out) complex { $result = PyComplex_FromDoubles($1.real(), $1.imag()); } %typemap(out) const complex & { $result = PyComplex_FromDoubles($1->real(), $1->imag()); } %enddef specialize_std_complex(double); specialize_std_complex(float); } #endif // SWIG #endif //SWIG_STD_COMPLEX_I_ swig-3.0.12/Lib/ocaml/std_deque.i0000664000175000017500000000132213042756442016363 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_deque.i * * Default std_deque wrapper * ----------------------------------------------------------------------------- */ %module std_deque %rename(__getitem__) std::deque::getitem; %rename(__setitem__) std::deque::setitem; %rename(__delitem__) std::deque::delitem; %rename(__getslice__) std::deque::getslice; %rename(__setslice__) std::deque::setslice; %rename(__delslice__) std::deque::delslice; %extend std::deque { int __len__() { return (int) self->size(); } int __nonzero__() { return ! self->empty(); } void append(const T &x) { self->push_back(x); } }; %include swig-3.0.12/Lib/ocaml/director.swg0000664000175000017500000000570413042756442016601 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Ocaml proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #include #include # define SWIG_DIRECTOR_CAST(ARG) dynamic_cast(ARG) namespace Swig { /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(const char *msg="") : swig_msg(msg) { } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } }; /* type mismatch in the return value from a Ocaml method call */ class DirectorTypeMismatchException : public DirectorException { public: DirectorTypeMismatchException(const char *msg="") : DirectorException(msg) { } }; /* any Ocaml exception that occurs during a director method call */ class DirectorMethodException : public DirectorException {}; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg="") : DirectorException(msg) { } static void raise(const char *msg) { throw DirectorPureVirtualException(msg); } }; /* simple thread abstraction for pthreads on win32 */ #ifdef __THREAD__ #define __PTHREAD__ #if defined(_WIN32) || defined(__WIN32__) #define pthread_mutex_lock EnterCriticalSection #define pthread_mutex_unlock LeaveCriticalSection #define pthread_mutex_t CRITICAL_SECTION #define MUTEX_INIT(var) CRITICAL_SECTION var #else #include #define MUTEX_INIT(var) pthread_mutex_t var = PTHREAD_MUTEX_INITIALIZER #endif #endif /* director base class */ class Director { private: /* pointer to the wrapped ocaml object */ CAML_VALUE swig_self; /* flag indicating whether the object is owned by ocaml or c++ */ mutable bool swig_disown_flag; public: /* wrap a ocaml object. */ Director(CAML_VALUE self) : swig_self(self), swig_disown_flag(false) { register_global_root(&swig_self); } /* discard our reference at destruction */ virtual ~Director() { remove_global_root(&swig_self); swig_disown(); // Disown is safe here because we're just divorcing a reference that points to us. } /* return a pointer to the wrapped ocaml object */ CAML_VALUE swig_get_self() const { return swig_self; } /* acquire ownership of the wrapped ocaml object (the sense of "disown" is from ocaml) */ void swig_disown() const { if (!swig_disown_flag) { swig_disown_flag=true; callback(*caml_named_value("caml_obj_disown"),swig_self); } } }; } swig-3.0.12/Lib/ocaml/std_vector.i0000664000175000017500000000530213042756442016564 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * * SWIG typemaps for std::vector types * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::vector // // The aim of all that follows would be to integrate std::vector with // Python as much as possible, namely, to allow the user to pass and // be returned Python tuples or lists. // const declarations are used to guess the intent of the function being // exported; therefore, the following rationale is applied: // // -- f(std::vector), f(const std::vector&), f(const std::vector*): // the parameter being read-only, either a Python sequence or a // previously wrapped std::vector can be passed. // -- f(std::vector&), f(std::vector*): // the parameter must be modified; therefore, only a wrapped std::vector // can be passed. // -- std::vector f(): // the vector is returned by copy; therefore, a Python sequence of T:s // is returned which is most easily used in other Python functions // -- std::vector& f(), std::vector* f(), const std::vector& f(), // const std::vector* f(): // the vector is returned by reference; therefore, a wrapped std::vector // is returned // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class vector { public: vector(unsigned int size = 0); vector(unsigned int size, const T& value); vector(const vector&); unsigned int size() const; bool empty() const; void clear(); void push_back(const T& x); T operator [] ( int f ); vector &operator = ( vector &other ); %extend { void set( int i, const T &x ) { self->resize(i+1); (*self)[i] = x; } }; %extend { T *to_array() { T *array = new T[self->size() + 1]; for( int i = 0; i < self->size(); i++ ) array[i] = (*self)[i]; return array; } }; }; }; %insert(ml) %{ let array_to_vector v argcons array = for i = 0 to (Array.length array) - 1 do (invoke v) "set" (C_list [ C_int i ; (argcons array.(i)) ]) done ; v let vector_to_array v argcons array = for i = 0; to (get_int ((invoke v) "size" C_void)) - 1 do array.(i) <- argcons ((invoke v) "[]" (C_int i)) done ; v %} %insert(mli) %{ val array_to_vector : c_obj -> ('a -> c_obj) -> 'a array -> c_obj val vector_to_array : c_obj -> (c_obj -> 'a) -> 'a array -> c_obj %} swig-3.0.12/Lib/ocaml/ocaml.swg0000664000175000017500000003406613042756442016064 0ustar williamwilliam/* -*-c-*- */ /* SWIG pointer structure */ #include #include #ifdef __cplusplus extern "C" { #endif #define C_bool 0 #define C_char 1 #define C_uchar 2 #define C_short 3 #define C_ushort 4 #define C_int 5 #define C_uint 6 #define C_int32 7 #define C_int64 8 #define C_float 9 #define C_double 10 #define C_ptr 11 #define C_array 12 #define C_list 13 #define C_obj 14 #define C_string 15 #define C_enum 16 #define C_director_core 17 /* Cast a pointer if possible; returns 1 if successful */ SWIGSTATIC int SWIG_Cast (void *source, swig_type_info *source_type, void **ptr, swig_type_info *dest_type) { if( !source ) { // Special case for NULL. This is a popular question // for other modules on the list, so I want an easy way out... *ptr = 0; return 0; } #ifdef TYPE_CAST_VERBOSE fprintf( stderr, "Trying to cast %s to %s\n", source_type ? source_type->str : "", dest_type ? dest_type->str : "" ); #endif if (dest_type != source_type) { /* We have a type mismatch. Will have to look through our type mapping table to figure out whether or not we can accept this datatype. -- Ignore typechecks for void *. Allow any conversion. */ if( !dest_type || !source_type || !strcmp(dest_type->name,"_p_void") || !strcmp(source_type->name,"_p_void") ) { *ptr = source; return 0; } else { swig_cast_info *tc = SWIG_TypeCheckStruct(source_type, dest_type ); #ifdef TYPE_CAST_VERBOSE fprintf( stderr, "Typecheck -> %s\n", tc ? tc->str : "" ); #endif if( tc ) { int newmemory = 0; *ptr = SWIG_TypeCast(tc, source, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ return 0; } else return -1; } } else { *ptr = source; return 0; } } /* Return 0 if successful. */ SWIGSTATIC int SWIG_GetPtr(void *inptr, void **outptr, swig_type_info *intype, swig_type_info *outtype) { if (intype) { return SWIG_Cast(inptr, intype, outptr, outtype) == -1; } else { *outptr = inptr; return 0; } } SWIGSTATIC void caml_print_list( CAML_VALUE v ); SWIGSTATIC void caml_print_val( CAML_VALUE v ) { switch( SWIG_Tag_val(v) ) { case C_bool: if( Bool_val(SWIG_Field(v,0)) ) fprintf( stderr, "true " ); else fprintf( stderr, "false " ); break; case C_char: case C_uchar: fprintf( stderr, "'%c' (\\%03d) ", (Int_val(SWIG_Field(v,0)) >= ' ' && Int_val(SWIG_Field(v,0)) < 127) ? Int_val(SWIG_Field(v,0)) : '.', Int_val(SWIG_Field(v,0)) ); break; case C_short: case C_ushort: case C_int: fprintf( stderr, "%d ", (int)caml_long_val(v) ); break; case C_uint: case C_int32: fprintf( stderr, "%ud ", (unsigned int)caml_long_val(v) ); break; case C_int64: fprintf( stderr, "%ld ", caml_long_val(v) ); break; case C_float: case C_double: fprintf( stderr, "%f ", caml_double_val(v) ); break; case C_ptr: { void *vout = 0; swig_type_info *ty = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1)); caml_ptr_val_internal(v,&vout,0); fprintf( stderr, "PTR(%p,%s) ", vout, ty ? ty->name : "(null)" ); } break; case C_array: { unsigned int i; for( i = 0; i < Wosize_val( SWIG_Field(v,0) ); i++ ) caml_print_val( SWIG_Field(SWIG_Field(v,0),i) ); } break; case C_list: caml_print_list( SWIG_Field(v,0) ); break; case C_obj: fprintf( stderr, "OBJ(%p) ", (void *)SWIG_Field(v,0) ); break; case C_string: { void *cout; caml_ptr_val_internal(v,&cout,0); fprintf( stderr, "'%s' ", (char *)cout ); } break; } } SWIGSTATIC void caml_print_list( CAML_VALUE v ) { CAMLparam1(v); while( v && Is_block(v) ) { fprintf( stderr, "[ " ); caml_print_val( SWIG_Field(v,0) ); fprintf( stderr, "]\n" ); v = SWIG_Field(v,1); } CAMLreturn0; } SWIGSTATIC CAML_VALUE caml_list_nth( CAML_VALUE lst, int n ) { CAMLparam1(lst); int i = 0; while( i < n && lst && Is_block(lst) ) { i++; lst = SWIG_Field(lst,1); } if( lst == Val_unit ) CAMLreturn(Val_unit); else CAMLreturn(SWIG_Field(lst,0)); } SWIGSTATIC CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt ) { CAMLparam2(lst,elt); SWIG_CAMLlocal3(v,vt,lh); lh = Val_unit; v = Val_unit; /* Appending C_void should have no effect */ if( !Is_block(elt) ) return lst; while( lst && Is_block(lst) ) { if( v && v != Val_unit ) { vt = alloc_tuple(2); SWIG_Store_field(v,1,vt); v = vt; } else { v = lh = alloc_tuple(2); } SWIG_Store_field(v,0,SWIG_Field(lst,0)); lst = SWIG_Field(lst,1); } if( v && Is_block(v) ) { vt = alloc_tuple(2); SWIG_Store_field(v,1,vt); v = vt; } else { v = lh = alloc_tuple(2); } SWIG_Store_field(v,0,elt); SWIG_Store_field(v,1,Val_unit); CAMLreturn(lh); } SWIGSTATIC int caml_list_length( CAML_VALUE lst ) { CAMLparam1(lst); int i = 0; while( lst && Is_block(lst) ) { i++; lst = SWIG_Field(lst,1); } CAMLreturn(i); } SWIGSTATIC void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item ) { CAMLparam2(arr,item); SWIG_Store_field(SWIG_Field(arr,0),n,item); CAMLreturn0; } SWIGSTATIC value caml_array_nth( CAML_VALUE arr, int n ) { CAMLparam1(arr); if( SWIG_Tag_val(arr) == C_array ) CAMLreturn(SWIG_Field(SWIG_Field(arr,0),n)); else if( SWIG_Tag_val(arr) == C_list ) CAMLreturn(caml_list_nth(arr,0)); else failwith("Need array or list"); } SWIGSTATIC int caml_array_len( CAML_VALUE arr ) { CAMLparam1(arr); if( SWIG_Tag_val(arr) == C_array ) CAMLreturn(Wosize_val(SWIG_Field(arr,0))); else if( SWIG_Tag_val(arr) == C_list ) CAMLreturn(caml_list_length(arr)); else failwith("Need array or list"); } SWIGSTATIC CAML_VALUE caml_swig_alloc(int x,int y) { return caml_alloc(x,y); } SWIGSTATIC value caml_array_new( int n ) { CAMLparam0(); SWIG_CAMLlocal1(vv); vv = caml_swig_alloc(1,C_array); SWIG_Store_field(vv,0,alloc_tuple(n)); CAMLreturn(vv); } SWIGSTATIC CAML_VALUE caml_val_bool( int b ) { CAMLparam0(); SWIG_CAMLlocal1(bv); bv = caml_swig_alloc(1,C_bool); SWIG_Store_field(bv,0,Val_bool(b)); CAMLreturn(bv); } SWIGSTATIC CAML_VALUE caml_val_char( char c ) { CAMLparam0(); SWIG_CAMLlocal1(cv); cv = caml_swig_alloc(1,C_char); SWIG_Store_field(cv,0,Val_int(c)); CAMLreturn(cv); } SWIGSTATIC CAML_VALUE caml_val_uchar( unsigned char uc ) { CAMLparam0(); SWIG_CAMLlocal1(ucv); ucv = caml_swig_alloc(1,C_uchar); SWIG_Store_field(ucv,0,Val_int(uc)); CAMLreturn(ucv); } SWIGSTATIC CAML_VALUE caml_val_short( short s ) { CAMLparam0(); SWIG_CAMLlocal1(sv); sv = caml_swig_alloc(1,C_short); SWIG_Store_field(sv,0,Val_int(s)); CAMLreturn(sv); } SWIGSTATIC CAML_VALUE caml_val_ushort( unsigned short us ) { CAMLparam0(); SWIG_CAMLlocal1(usv); usv = caml_swig_alloc(1,C_ushort); SWIG_Store_field(usv,0,Val_int(us)); CAMLreturn(usv); } SWIGSTATIC CAML_VALUE caml_val_int( int i ) { CAMLparam0(); SWIG_CAMLlocal1(iv); iv = caml_swig_alloc(1,C_int); SWIG_Store_field(iv,0,Val_int(i)); CAMLreturn(iv); } SWIGSTATIC CAML_VALUE caml_val_uint( unsigned int ui ) { CAMLparam0(); SWIG_CAMLlocal1(uiv); uiv = caml_swig_alloc(1,C_int); SWIG_Store_field(uiv,0,Val_int(ui)); CAMLreturn(uiv); } SWIGSTATIC CAML_VALUE caml_val_long( long l ) { CAMLparam0(); SWIG_CAMLlocal1(lv); lv = caml_swig_alloc(1,C_int64); SWIG_Store_field(lv,0,copy_int64(l)); CAMLreturn(lv); } SWIGSTATIC CAML_VALUE caml_val_ulong( unsigned long ul ) { CAMLparam0(); SWIG_CAMLlocal1(ulv); ulv = caml_swig_alloc(1,C_int64); SWIG_Store_field(ulv,0,copy_int64(ul)); CAMLreturn(ulv); } SWIGSTATIC CAML_VALUE caml_val_float( float f ) { CAMLparam0(); SWIG_CAMLlocal1(fv); fv = caml_swig_alloc(1,C_float); SWIG_Store_field(fv,0,copy_double((double)f)); CAMLreturn(fv); } SWIGSTATIC CAML_VALUE caml_val_double( double d ) { CAMLparam0(); SWIG_CAMLlocal1(fv); fv = caml_swig_alloc(1,C_double); SWIG_Store_field(fv,0,copy_double(d)); CAMLreturn(fv); } SWIGSTATIC CAML_VALUE caml_val_ptr( void *p, swig_type_info *info ) { CAMLparam0(); SWIG_CAMLlocal1(vv); vv = caml_swig_alloc(2,C_ptr); SWIG_Store_field(vv,0,copy_int64((long)p)); SWIG_Store_field(vv,1,copy_int64((long)info)); CAMLreturn(vv); } SWIGSTATIC CAML_VALUE caml_val_string( const char *p ) { CAMLparam0(); SWIG_CAMLlocal1(vv); if( !p ) CAMLreturn(caml_val_ptr( (void *)p, 0 )); vv = caml_swig_alloc(1,C_string); SWIG_Store_field(vv,0,copy_string(p)); CAMLreturn(vv); } SWIGSTATIC CAML_VALUE caml_val_string_len( const char *p, int len ) { CAMLparam0(); SWIG_CAMLlocal1(vv); if( !p || len < 0 ) CAMLreturn(caml_val_ptr( (void *)p, 0 )); vv = caml_swig_alloc(1,C_string); SWIG_Store_field(vv,0,alloc_string(len)); memcpy(String_val(SWIG_Field(vv,0)),p,len); CAMLreturn(vv); } #define caml_val_obj(v, name) caml_val_obj_helper(v, SWIG_TypeQuery((name)), name) SWIGSTATIC CAML_VALUE caml_val_obj_helper( void *v, swig_type_info *type, char *name) { CAMLparam0(); CAMLreturn(callback2(*caml_named_value("caml_create_object_fn"), caml_val_ptr(v,type), copy_string(name))); } SWIGSTATIC long caml_long_val_full( CAML_VALUE v, char *name ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_char: case C_uchar: case C_short: case C_ushort: case C_int: CAMLreturn(Int_val(SWIG_Field(v,0))); case C_uint: case C_int32: CAMLreturn(Int32_val(SWIG_Field(v,0))); case C_int64: CAMLreturn((long)SWIG_Int64_val(SWIG_Field(v,0))); case C_float: case C_double: CAMLreturn((long)Double_val(SWIG_Field(v,0))); case C_string: CAMLreturn((long)String_val(SWIG_Field(v,0))); case C_ptr: CAMLreturn((long)SWIG_Int64_val(SWIG_Field(SWIG_Field(v,0),0))); case C_enum: { SWIG_CAMLlocal1(ret); CAML_VALUE *enum_to_int = caml_named_value(SWIG_MODULE "_enum_to_int"); if( !name ) failwith( "Not an enum conversion" ); ret = callback2(*enum_to_int,*caml_named_value(name),v); CAMLreturn(caml_long_val(ret)); } default: failwith("No conversion to int"); } } SWIGSTATIC long caml_long_val( CAML_VALUE v ) { return caml_long_val_full(v,0); } SWIGSTATIC double caml_double_val( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0.0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_char: case C_uchar: case C_short: case C_ushort: case C_int: CAMLreturn_type(Int_val(SWIG_Field(v,0))); case C_uint: case C_int32: CAMLreturn_type(Int32_val(SWIG_Field(v,0))); case C_int64: CAMLreturn_type(SWIG_Int64_val(SWIG_Field(v,0))); case C_float: case C_double: CAMLreturn_type(Double_val(SWIG_Field(v,0))); default: fprintf( stderr, "Unknown block tag %d\n", SWIG_Tag_val(v) ); failwith("No conversion to double"); } } SWIGSTATIC int caml_ptr_val_internal( CAML_VALUE v, void **out, swig_type_info *descriptor ) { CAMLparam1(v); void *outptr = NULL; swig_type_info *outdescr = NULL; if( v == Val_unit ) { *out = 0; CAMLreturn(0); } if( !Is_block(v) ) return -1; switch( SWIG_Tag_val(v) ) { case C_int: if( !caml_long_val( v ) ) { *out = 0; CAMLreturn(0); } else { *out = 0; CAMLreturn(1); } break; case C_obj: CAMLreturn (caml_ptr_val_internal (callback(*caml_named_value("caml_obj_ptr"),v), out,descriptor)); case C_string: outptr = (void *)String_val(SWIG_Field(v,0)); break; case C_ptr: outptr = (void *)(long)SWIG_Int64_val(SWIG_Field(v,0)); outdescr = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field(v,1)); break; default: *out = 0; CAMLreturn(1); break; } CAMLreturn(SWIG_GetPtr(outptr,out,outdescr,descriptor)); } SWIGSTATIC void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor ) { CAMLparam0(); #ifdef TYPE_CAST_VERBOSE caml_print_val( v ); #endif void *out = NULL; if( !caml_ptr_val_internal( v, &out, descriptor ) ) CAMLreturn_type(out); else failwith( "No appropriate conversion found." ); } SWIGSTATIC char *caml_string_val( CAML_VALUE v ) { return (char *)caml_ptr_val( v, 0 ); } SWIGSTATIC int caml_string_len( CAML_VALUE v ) { switch( SWIG_Tag_val(v) ) { case C_string: return string_length(SWIG_Field(v,0)); default: return strlen((char *)caml_ptr_val(v,0)); } } SWIGSTATIC int caml_bool_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_bool: case C_ptr: case C_string: CAMLreturn(1); default: CAMLreturn(0); } } SWIGSTATIC int caml_int_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_char: case C_uchar: case C_short: case C_ushort: case C_int: case C_uint: case C_int32: case C_int64: CAMLreturn(1); default: CAMLreturn(0); } } SWIGSTATIC int caml_float_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_float: case C_double: CAMLreturn(1); default: CAMLreturn(0); } } SWIGSTATIC int caml_ptr_check( CAML_VALUE v ) { CAMLparam1(v); if( !Is_block(v) ) return 0; switch( SWIG_Tag_val(v) ) { case C_string: case C_ptr: case C_int64: CAMLreturn(1); default: CAMLreturn(0); } } static swig_module_info *SWIG_Ocaml_GetModule(void *SWIGUNUSEDPARM(clientdata)) { CAML_VALUE pointer; pointer = callback(*caml_named_value("swig_find_type_info"), caml_val_int(0)); if (Is_block(pointer) && SWIG_Tag_val(pointer) == C_ptr) { return (swig_module_info *)(void *)(long)SWIG_Int64_val(SWIG_Field(pointer,0)); } return 0; } static void SWIG_Ocaml_SetModule(swig_module_info *pointer) { CAML_VALUE mod_pointer; mod_pointer = caml_val_ptr(pointer, NULL); callback(*caml_named_value("swig_set_type_info"), mod_pointer); } #ifdef __cplusplus } #endif #undef value swig-3.0.12/Lib/ocaml/libswigocaml.h0000664000175000017500000000070613042756442017066 0ustar williamwilliam/* Ocaml runtime support */ #ifdef __cplusplus extern "C" { #endif typedef int oc_bool; extern void *nullptr; extern oc_bool isnull( void *v ); extern void *get_char_ptr( char *str ); extern void *make_ptr_array( int size ); extern void *get_ptr( void *arrayptr, int elt ); extern void set_ptr( void *arrayptr, int elt, void *elt_v ); extern void *offset_ptr( void *ptr, int n ); #ifdef __cplusplus }; #endif swig-3.0.12/Lib/ocaml/preamble.swg0000664000175000017500000000073113042756442016550 0ustar williamwilliam%insert(mli) %{ exception BadArgs of string exception BadMethodName of c_obj * string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj %} %insert(ml) %{ exception BadArgs of string exception BadMethodName of c_obj * string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj %}swig-3.0.12/Lib/ocaml/ocamldec.swg0000664000175000017500000001226613042756442016536 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocamldec.swg * * Ocaml runtime code -- declarations * ----------------------------------------------------------------------------- */ #include #include #include #ifdef __cplusplus #define SWIGEXT extern "C" SWIGEXT { #else #define SWIGEXT #endif #define value caml_value_t #define CAML_VALUE caml_value_t #include #include #include #include #include #include #include #define caml_array_set swig_caml_array_set // Adapted from memory.h and mlvalues.h #define SWIG_CAMLlocal1(x) \ caml_value_t x = 0; \ CAMLxparam1 (x) #define SWIG_CAMLlocal2(x, y) \ caml_value_t x = 0, y = 0; \ CAMLxparam2 (x, y) #define SWIG_CAMLlocal3(x, y, z) \ caml_value_t x = 0, y = 0, z = 0; \ CAMLxparam3 (x, y, z) #define SWIG_CAMLlocal4(x, y, z, t) \ caml_value_t x = 0, y = 0, z = 0, t = 0; \ CAMLxparam4 (x, y, z, t) #define SWIG_CAMLlocal5(x, y, z, t, u) \ caml_value_t x = 0, y = 0, z = 0, t = 0, u = 0; \ CAMLxparam5 (x, y, z, t, u) #define SWIG_CAMLlocalN(x, size) \ caml_value_t x [(size)] = { 0, /* 0, 0, ... */ }; \ CAMLxparamN (x, (size)) #define SWIG_Field(x, i) (((caml_value_t *)(x)) [i]) /* Also an l-value. */ #define SWIG_Store_field(block, offset, val) do{ \ mlsize_t caml__temp_offset = (offset); \ caml_value_t caml__temp_val = (val); \ modify (&SWIG_Field ((block), caml__temp_offset), caml__temp_val); \ }while(0) #define SWIG_Data_custom_val(v) ((void *) &SWIG_Field((v), 1)) #ifdef ARCH_BIG_ENDIAN #define SWIG_Tag_val(val) (((unsigned char *) (val)) [-1]) /* Also an l-value. */ #define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [sizeof(caml_value_t)-1]) /* Also an l-value. */ #else #define SWIG_Tag_val(val) (((unsigned char *) (val)) [-sizeof(caml_value_t)]) /* Also an l-value. */ #define SWIG_Tag_hp(hp) (((unsigned char *) (hp)) [0]) /* Also an l-value. */ #endif #ifdef CAMLreturn0 #undef CAMLreturn0 #endif #define CAMLreturn0 do{ \ caml_local_roots = caml__frame; \ return; \ }while (0) #ifdef CAMLreturn #undef CAMLreturn #endif #define CAMLreturn(result) do{ \ caml_value_t caml__temp_result = (result); \ caml_local_roots = caml__frame; \ return (caml__temp_result); \ }while(0) #define CAMLreturn_type(result) do{ \ caml_local_roots = caml__frame; \ return result; \ }while(0) #ifdef CAMLnoreturn #undef CAMLnoreturn #endif #define CAMLnoreturn ((void) caml__frame) #ifndef ARCH_ALIGN_INT64 #define SWIG_Int64_val(v) (*((int64 *) SWIG_Data_custom_val(v))) #else CAMLextern int64 Int64_val(caml_value_t v); #define SWIG_Int64_val(v) Int64_val(v) #endif #define SWIG_NewPointerObj(p,type,flags) caml_val_ptr(p,type) #define SWIG_GetModule(clientdata) SWIG_Ocaml_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Ocaml_SetModule(pointer) #define SWIG_contract_assert(expr, msg) if(!(expr)) {failwith(msg);} else SWIGSTATIC int SWIG_GetPtr(void *source, void **result, swig_type_info *type, swig_type_info *result_type); SWIGSTATIC void * SWIG_MustGetPtr (CAML_VALUE v, swig_type_info *type); SWIGSTATIC CAML_VALUE _wrap_delete_void( CAML_VALUE ); SWIGSTATIC int enum_to_int( char *name, CAML_VALUE v ); SWIGSTATIC CAML_VALUE int_to_enum( char *name, int v ); SWIGSTATIC CAML_VALUE caml_list_nth( CAML_VALUE lst, int n ); SWIGSTATIC CAML_VALUE caml_list_append( CAML_VALUE lst, CAML_VALUE elt ); SWIGSTATIC int caml_list_length( CAML_VALUE lst ); SWIGSTATIC CAML_VALUE caml_array_new( int n ); SWIGSTATIC void caml_array_set( CAML_VALUE arr, int n, CAML_VALUE item ); SWIGSTATIC CAML_VALUE caml_array_nth( CAML_VALUE arr, int n ); SWIGSTATIC int caml_array_len( CAML_VALUE arr ); SWIGSTATIC CAML_VALUE caml_val_char( char c ); SWIGSTATIC CAML_VALUE caml_val_uchar( unsigned char c ); SWIGSTATIC CAML_VALUE caml_val_short( short s ); SWIGSTATIC CAML_VALUE caml_val_ushort( unsigned short s ); SWIGSTATIC CAML_VALUE caml_val_int( int x ); SWIGSTATIC CAML_VALUE caml_val_uint( unsigned int x ); SWIGSTATIC CAML_VALUE caml_val_long( long x ); SWIGSTATIC CAML_VALUE caml_val_ulong( unsigned long x ); SWIGSTATIC CAML_VALUE caml_val_float( float f ); SWIGSTATIC CAML_VALUE caml_val_double( double d ); SWIGSTATIC CAML_VALUE caml_val_ptr( void *p, swig_type_info *descriptor ); SWIGSTATIC CAML_VALUE caml_val_string( const char *str ); SWIGSTATIC CAML_VALUE caml_val_string_len( const char *str, int len ); SWIGSTATIC long caml_long_val( CAML_VALUE v ); SWIGSTATIC double caml_double_val( CAML_VALUE v ); SWIGSTATIC int caml_ptr_val_internal( CAML_VALUE v, void **out, swig_type_info *descriptor ); SWIGSTATIC void *caml_ptr_val( CAML_VALUE v, swig_type_info *descriptor ); SWIGSTATIC char *caml_string_val( CAML_VALUE v ); SWIGSTATIC int caml_string_len( CAML_VALUE v ); #ifdef __cplusplus } #endif swig-3.0.12/Lib/ocaml/swig.ml0000664000175000017500000001111413042756442015537 0ustar williamwilliam(* -*- tuareg -*- *) open Int32 open Int64 type enum = [ `Int of int ] type 'a c_obj_t = C_void | C_bool of bool | C_char of char | C_uchar of char | C_short of int | C_ushort of int | C_int of int | C_uint of int32 | C_int32 of int32 | C_int64 of int64 | C_float of float | C_double of float | C_ptr of int64 * int64 | C_array of 'a c_obj_t array | C_list of 'a c_obj_t list | C_obj of (string -> 'a c_obj_t -> 'a c_obj_t) | C_string of string | C_enum of 'a | C_director_core of 'a c_obj_t * 'a c_obj_t option ref type c_obj = enum c_obj_t exception BadArgs of string exception BadMethodName of string * string exception NotObject of c_obj exception NotEnumType of c_obj exception LabelNotFromThisEnum of c_obj exception InvalidDirectorCall of c_obj exception NoSuchClass of string let rec invoke obj = match obj with C_obj o -> o | C_director_core (o,r) -> invoke o | _ -> raise (NotObject (Obj.magic obj)) let _ = Callback.register "swig_runmethod" invoke let fnhelper arg = match arg with C_list l -> l | C_void -> [] | _ -> [ arg ] let rec get_int x = match x with C_bool b -> if b then 1 else 0 | C_char c | C_uchar c -> (int_of_char c) | C_short s | C_ushort s | C_int s -> s | C_uint u | C_int32 u -> (Int32.to_int u) | C_int64 u -> (Int64.to_int u) | C_float f -> (int_of_float f) | C_double d -> (int_of_float d) | C_ptr (p,q) -> (Int64.to_int p) | C_obj o -> (try (get_int (o "int" C_void)) with _ -> (get_int (o "&" C_void))) | _ -> raise (Failure "Can't convert to int") let rec get_float x = match x with C_char c | C_uchar c -> (float_of_int (int_of_char c)) | C_short s -> (float_of_int s) | C_ushort s -> (float_of_int s) | C_int s -> (float_of_int s) | C_uint u | C_int32 u -> (float_of_int (Int32.to_int u)) | C_int64 u -> (float_of_int (Int64.to_int u)) | C_float f -> f | C_double d -> d | C_obj o -> (try (get_float (o "float" C_void)) with _ -> (get_float (o "double" C_void))) | _ -> raise (Failure "Can't convert to float") let rec get_char x = (char_of_int (get_int x)) let rec get_string x = match x with C_string str -> str | _ -> raise (Failure "Can't convert to string") let rec get_bool x = match x with C_bool b -> b | _ -> (try if get_int x != 0 then true else false with _ -> raise (Failure "Can't convert to bool")) let disown_object obj = match obj with C_director_core (o,r) -> r := None | _ -> raise (Failure "Not a director core object") let _ = Callback.register "caml_obj_disown" disown_object let addr_of obj = match obj with C_obj _ -> (invoke obj) "&" C_void | C_director_core (self,r) -> (invoke self) "&" C_void | C_ptr _ -> obj | _ -> raise (Failure "Not a pointer.") let _ = Callback.register "caml_obj_ptr" addr_of let make_float f = C_float f let make_double f = C_double f let make_string s = C_string s let make_bool b = C_bool b let make_char c = C_char c let make_char_i c = C_char (char_of_int c) let make_uchar c = C_uchar c let make_uchar_i c = C_uchar (char_of_int c) let make_short i = C_short i let make_ushort i = C_ushort i let make_int i = C_int i let make_uint i = C_uint (Int32.of_int i) let make_int32 i = C_int32 (Int32.of_int i) let make_int64 i = C_int64 (Int64.of_int i) let new_derived_object cfun x_class args = begin let get_object ob = match !ob with None -> raise (NotObject C_void) | Some o -> o in let ob_ref = ref None in let class_fun class_f ob_r = (fun meth args -> class_f (get_object ob_r) meth args) in let new_class = class_fun x_class ob_ref in let dircore = C_director_core (C_obj new_class,ob_ref) in let obj = cfun (match args with C_list argl -> (C_list ((dircore :: argl))) | C_void -> (C_list [ dircore ]) | a -> (C_list [ dircore ; a ])) in ob_ref := Some obj ; obj end let swig_current_type_info = ref C_void let find_type_info obj = !swig_current_type_info let _ = Callback.register "swig_find_type_info" find_type_info let set_type_info obj = match obj with C_ptr _ -> swig_current_type_info := obj ; obj | _ -> raise (Failure "Internal error: passed non pointer to set_type_info") let _ = Callback.register "swig_set_type_info" set_type_info let class_master_list = Hashtbl.create 20 let register_class_byname nm co = Hashtbl.replace class_master_list nm (Obj.magic co) let create_class nm arg = try (Obj.magic (Hashtbl.find class_master_list nm)) arg with _ -> raise (NoSuchClass nm) swig-3.0.12/Lib/ocaml/extra-install.list0000664000175000017500000000013513042756442017721 0ustar williamwilliam# see top-level Makefile.in # libswigocaml is not needed anymore. swigp4.ml swig.mli swig.ml swig-3.0.12/Lib/ocaml/std_common.i0000664000175000017500000000105013042756442016546 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; %{ #include SWIGINTERNINLINE CAML_VALUE SwigString_FromString(const std::string &s) { return caml_val_string((char *)s.c_str()); } SWIGINTERNINLINE std::string SwigString_AsString(CAML_VALUE o) { return std::string((char *)caml_ptr_val(o,0)); } %} swig-3.0.12/Lib/ocaml/typemaps.i0000664000175000017500000002354513042756442016263 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * The Ocaml module handles all types uniformly via typemaps. Here * are the definitions. * ----------------------------------------------------------------------------- */ /* Pointers */ %typemap(in) void "" %typemap(out) void "$result = Val_int(0);" %typemap(in) void * { $1 = caml_ptr_val($input,$descriptor); } %typemap(varin) void * { $1 = ($ltype)caml_ptr_val($input,$descriptor); } %typemap(out) void * { $result = caml_val_ptr($1,$descriptor); } %typemap(varout) void * { $result = caml_val_ptr($1,$descriptor); } #ifdef __cplusplus %typemap(in) SWIGTYPE & { /* %typemap(in) SWIGTYPE & */ $1 = ($ltype) caml_ptr_val($input,$1_descriptor); } %typemap(in) SWIGTYPE && { /* %typemap(in) SWIGTYPE && */ $1 = ($ltype) caml_ptr_val($input,$1_descriptor); } %typemap(varin) SWIGTYPE & { /* %typemap(varin) SWIGTYPE & */ $1 = *(($ltype) caml_ptr_val($input,$1_descriptor)); } %typemap(varin) SWIGTYPE && { /* %typemap(varin) SWIGTYPE && */ $1 = *(($ltype) caml_ptr_val($input,$1_descriptor)); } %typemap(out) SWIGTYPE & { /* %typemap(out) SWIGTYPE & */ CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { $result = callback(*fromval,caml_val_ptr((void *) &$1,$1_descriptor)); } else { $result = caml_val_ptr ((void *) &$1,$1_descriptor); } } %typemap(out) SWIGTYPE && { /* %typemap(out) SWIGTYPE && */ CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { $result = callback(*fromval,caml_val_ptr((void *) &$1,$1_descriptor)); } else { $result = caml_val_ptr ((void *) &$1,$1_descriptor); } } #if 0 %typemap(argout) SWIGTYPE & { CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, callback(*fromval,caml_val_ptr((void *) $1, $1_descriptor))); } else { swig_result = caml_list_append(swig_result, caml_val_ptr ((void *) $1,$1_descriptor)); } } %typemap(argout) SWIGTYPE && { CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { swig_result = caml_list_append(swig_result, callback(*fromval,caml_val_ptr((void *) $1, $1_descriptor))); } else { swig_result = caml_list_append(swig_result, caml_val_ptr ((void *) $1,$1_descriptor)); } } #endif %typemap(argout) const SWIGTYPE & { } %typemap(argout) const SWIGTYPE && { } %typemap(in) SWIGTYPE { $1 = *(($&1_ltype) caml_ptr_val($input,$&1_descriptor)) ; } %typemap(out) SWIGTYPE { /* %typemap(out) SWIGTYPE */ $&1_ltype temp = new $ltype((const $1_ltype &) $1); CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { $result = callback(*fromval,caml_val_ptr((void *)temp,$&1_descriptor)); } else { $result = caml_val_ptr ((void *)temp,$&1_descriptor); } } %typemap(in) char *& (char *temp) { /* %typemap(in) char *& */ temp = (char*)caml_val_ptr($1,$descriptor); $1 = &temp; } %typemap(argout) char *& { /* %typemap(argout) char *& */ swig_result = caml_list_append(swig_result,caml_val_string_len(*$1, strlen(*$1))); } #else %typemap(in) SWIGTYPE { $1 = *(($&1_ltype) caml_ptr_val($input,$&1_descriptor)) ; } %typemap(out) SWIGTYPE { /* %typemap(out) SWIGTYPE */ void *temp = calloc(1,sizeof($ltype)); CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); memmove( temp, &$1, sizeof( $1_type ) ); if( fromval ) { $result = callback(*fromval,caml_val_ptr((void *)temp,$&1_descriptor)); } else { $result = caml_val_ptr ((void *)temp,$&1_descriptor); } } %apply SWIGTYPE { const SWIGTYPE & }; %apply SWIGTYPE { const SWIGTYPE && }; #endif /* The SIMPLE_MAP macro below defines the whole set of typemaps needed for simple types. */ %define SIMPLE_MAP(C_NAME, C_TO_MZ, MZ_TO_C) /* In */ %typemap(in) C_NAME { $1 = MZ_TO_C($input); } %typemap(varin) C_NAME { $1 = MZ_TO_C($input); } %typemap(in) C_NAME & ($*1_ltype temp) { temp = ($*1_ltype) MZ_TO_C($input); $1 = &temp; } %typemap(varin) C_NAME & { $1 = MZ_TO_C($input); } %typemap(directorout) C_NAME { $1 = MZ_TO_C($input); } %typemap(in) C_NAME *INPUT ($*1_ltype temp) { temp = ($*1_ltype) MZ_TO_C($input); $1 = &temp; } %typemap(in,numinputs=0) C_NAME *OUTPUT ($*1_ltype temp) { $1 = &temp; } /* Out */ %typemap(out) C_NAME { $result = C_TO_MZ($1); } %typemap(varout) C_NAME { $result = C_TO_MZ($1); } %typemap(varout) C_NAME & { /* %typemap(varout) C_NAME & (generic) */ $result = C_TO_MZ($1); } %typemap(argout) C_NAME *OUTPUT { swig_result = caml_list_append(swig_result,C_TO_MZ((long)*$1)); } %typemap(out) C_NAME & { /* %typemap(out) C_NAME & (generic) */ $result = C_TO_MZ(*$1); } %typemap(argout) C_NAME & { swig_result = caml_list_append(swig_result,C_TO_MZ((long)*$1)); } %typemap(directorin) C_NAME { args = caml_list_append(args,C_TO_MZ($1)); } %enddef SIMPLE_MAP(bool, caml_val_bool, caml_long_val); SIMPLE_MAP(oc_bool, caml_val_bool, caml_long_val); SIMPLE_MAP(char, caml_val_char, caml_long_val); SIMPLE_MAP(signed char, caml_val_char, caml_long_val); SIMPLE_MAP(unsigned char, caml_val_uchar, caml_long_val); SIMPLE_MAP(int, caml_val_int, caml_long_val); SIMPLE_MAP(short, caml_val_short, caml_long_val); SIMPLE_MAP(wchar_t, caml_val_short, caml_long_val); SIMPLE_MAP(long, caml_val_long, caml_long_val); SIMPLE_MAP(ptrdiff_t, caml_val_int, caml_long_val); SIMPLE_MAP(unsigned int, caml_val_uint, caml_long_val); SIMPLE_MAP(unsigned short, caml_val_ushort, caml_long_val); SIMPLE_MAP(unsigned long, caml_val_ulong, caml_long_val); SIMPLE_MAP(size_t, caml_val_int, caml_long_val); SIMPLE_MAP(float, caml_val_float, caml_double_val); SIMPLE_MAP(double, caml_val_double, caml_double_val); SIMPLE_MAP(long long,caml_val_ulong,caml_long_val); SIMPLE_MAP(unsigned long long,caml_val_ulong,caml_long_val); /* Void */ %typemap(out) void "$result = Val_unit;"; /* Pass through value */ %typemap (in) value,caml::value,CAML_VALUE "$1=$input;"; %typemap (out) value,caml::value,CAML_VALUE "$result=$1;"; /* Arrays */ %typemap(in) ArrayCarrier * { $1 = ($ltype)caml_ptr_val($input,$1_descriptor); } %typemap(out) ArrayCarrier * { CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { $result = callback(*fromval,caml_val_ptr((void *)$1,$1_descriptor)); } else { $result = caml_val_ptr ((void *)$1,$1_descriptor); } } #if 0 %include #endif /* Handle char arrays as strings */ %define %char_ptr_in(how) %typemap(how) char *, signed char *, unsigned char * { /* %typemap(how) char * ... */ $1 = ($ltype)caml_string_val($input); } /* Again work around the empty array bound bug */ %typemap(how) char [ANY], signed char [ANY], unsigned char [ANY] { /* %typemap(how) char [ANY] ... */ char *temp = caml_string_val($input); strcpy((char *)$1,temp); /* strncpy would be better but we might not have an array size */ } %enddef %char_ptr_in(in); %char_ptr_in(varin); %char_ptr_in(directorout); %define %char_ptr_out(how) %typemap(how) char *, signed char *, unsigned char *, const char *, const signed char *, const unsigned char * { $result = caml_val_string((char *)$1); } /* I'd like to use the length here but can't because it might be empty */ %typemap(how) char [ANY], signed char [ANY], unsigned char [ANY], const char [ANY], const signed char [ANY], const unsigned char [ANY] { $result = caml_val_string((char *)$1); } %enddef %char_ptr_out(out); %char_ptr_out(varout); %char_ptr_out(directorin); %define %swigtype_ptr_in(how) %typemap(how) SWIGTYPE * { /* %typemap(how) SWIGTYPE * */ $1 = ($ltype)caml_ptr_val($input,$1_descriptor); } %typemap(how) SWIGTYPE (CLASS::*) { /* %typemap(how) SWIGTYPE (CLASS::*) */ void *v = caml_ptr_val($input,$1_descriptor); memcpy(& $1, &v, sizeof(v)); } %enddef %define %swigtype_ptr_out(how) %typemap(out) SWIGTYPE * { /* %typemap(how) SWIGTYPE *, SWIGTYPE (CLASS::*) */ CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); if( fromval ) { $result = callback(*fromval,caml_val_ptr((void *)$1,$1_descriptor)); } else { $result = caml_val_ptr ((void *)$1,$1_descriptor); } } %typemap(how) SWIGTYPE (CLASS::*) { /* %typemap(how) SWIGTYPE *, SWIGTYPE (CLASS::*) */ void *v; memcpy(&v,& $1, sizeof(void *)); $result = caml_val_ptr (v,$1_descriptor); } %enddef %swigtype_ptr_in(in); %swigtype_ptr_in(varin); %swigtype_ptr_in(directorout); %swigtype_ptr_out(out); %swigtype_ptr_out(varout); %swigtype_ptr_out(directorin); %define %swigtype_array_fail(how,msg) %typemap(how) SWIGTYPE [] { failwith(msg); } %enddef %swigtype_array_fail(in,"Array arguments for arbitrary types need a typemap"); %swigtype_array_fail(varin,"Assignment to global arrays for arbitrary types need a typemap"); %swigtype_array_fail(out,"Array arguments for arbitrary types need a typemap"); %swigtype_array_fail(varout,"Array variables need a typemap"); %swigtype_array_fail(directorin,"Array results with arbitrary types need a typemap"); %swigtype_array_fail(directorout,"Array arguments with arbitrary types need a typemap"); /* C++ References */ /* Enums */ %define %swig_enum_in(how) %typemap(how) enum SWIGTYPE { $1 = ($type)caml_long_val_full($input,"$type_marker"); } %enddef %define %swig_enum_out(how) %typemap(how) enum SWIGTYPE { $result = callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"),*caml_named_value("$type_marker"),Val_int((int)$1)); } %enddef %swig_enum_in(in) %swig_enum_in(varin) %swig_enum_in(directorout) %swig_enum_out(out) %swig_enum_out(varout) %swig_enum_out(directorin) /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } swig-3.0.12/Lib/ocaml/typeregister.swg0000664000175000017500000000006713042756442017511 0ustar williamwilliamSWIGEXT void SWIG_init() { SWIG_InitializeModule(0); swig-3.0.12/Lib/ocaml/std_pair.i0000664000175000017500000000131013042756442016210 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/ocaml/ocamlkw.swg0000664000175000017500000000205213042756442016414 0ustar williamwilliam#ifndef OCAML_OCAMLKW_SWG_ #define OCAML_OCAMLKW_SWG_ /* Warnings for Ocaml keywords */ #define OCAMLKW(x) %namewarn("314: '" #x "' is an ocaml keyword and it will be appropriately renamed") #x /* from http://caml.inria.fr/ocaml/htmlman/manual044.html */ OCAMLKW(and); OCAMLKW(as); OCAMLKW(assert); OCAMLKW(begin); OCAMLKW(class); OCAMLKW(constraint); OCAMLKW(do); OCAMLKW(done); OCAMLKW(downto); OCAMLKW(else); OCAMLKW(end); OCAMLKW(exception); OCAMLKW(external); OCAMLKW(false); OCAMLKW(for); OCAMLKW(fun); OCAMLKW(function); OCAMLKW(functor); OCAMLKW(if); OCAMLKW(in); OCAMLKW(include); OCAMLKW(inherit); OCAMLKW(initializer); OCAMLKW(lazy); OCAMLKW(let); OCAMLKW(match); OCAMLKW(method); OCAMLKW(module); OCAMLKW(mutable); OCAMLKW(new); OCAMLKW(object); OCAMLKW(of); OCAMLKW(open); OCAMLKW(or); OCAMLKW(private); OCAMLKW(rec); OCAMLKW(sig); OCAMLKW(struct); OCAMLKW(then); OCAMLKW(to); OCAMLKW(true); OCAMLKW(try); OCAMLKW(type); OCAMLKW(val); OCAMLKW(virtual); OCAMLKW(when); OCAMLKW(while); OCAMLKW(with); #undef OCAMLKW #endif //OCAML_OCAMLKW_SWG_ swig-3.0.12/Lib/ocaml/class.swg0000664000175000017500000000326613042756442016074 0ustar williamwilliam(*Stream:class_ctors*) let create_$classname_from_ptr raw_ptr = C_obj begin let h = Hashtbl.create 20 in List.iter (fun (nm,fn) -> Hashtbl.replace h nm fn) [ "nop", (fun args -> C_void) ; $classbody "&", (fun args -> raw_ptr) ; ":parents", (fun args -> C_list (let out = ref [] in Hashtbl.iter (fun x y -> out := (x,y) :: !out) h ; (List.map (fun (x,y) -> C_string (String.sub x 2 ((String.length x) - 2))) (List.filter (fun (x,y) -> ((String.length x) > 2) && x.[0] == ':' && x.[1] == ':') !out)))) ; ":classof", (fun args -> C_string "$realname") ; ":methods", (fun args -> C_list (let out = ref [] in Hashtbl.iter (fun x y -> out := (C_string x) :: !out) h ; !out)) ] ; let rec invoke_inner raw_ptr mth arg = begin try let application = Hashtbl.find h mth in application (match arg with C_list l -> (C_list (raw_ptr :: l)) | C_void -> (C_list [ raw_ptr ]) | v -> (C_list [ raw_ptr ; v ])) with Not_found -> (* Try parent classes *) begin let parent_classes = [ $baselist ] in let rec try_parent plist raw_ptr = match plist with p :: tl -> begin try (invoke (p raw_ptr)) mth arg with (BadMethodName (p,m,s)) -> try_parent tl raw_ptr end | [] -> raise (BadMethodName (raw_ptr,mth,"$realname")) in try_parent parent_classes raw_ptr end end in (fun mth arg -> invoke_inner raw_ptr mth arg) end let _ = Callback.register "create_$normalized_from_ptr" create_$classname_from_ptr (*Stream:mli*) val create_$classname_from_ptr : c_obj -> c_obj swig-3.0.12/Lib/ocaml/stl.i0000664000175000017500000000054513042756442015216 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/ocaml/carray.i0000664000175000017500000000626413042756442015701 0ustar williamwilliam%insert(mli) %{ type _value = c_obj %} %insert(ml) %{ type _value = c_obj %} %define %array_tmap_out(type,what,out_f) %typemap(type) what [ANY] { int i; /* $*1_type */ $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { caml_array_set($result,i,out_f($1[i])); } } %enddef %define %array_tmap_in(type,what,in_f) %typemap(type) what [ANY] { int i; /* $*1_type */ $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = in_f(caml_array_nth($input,i)); } } %typemap(free) what [ANY] { free( (void *)$1 ); } %enddef %define %make_simple_array_typemap(type,out_f,in_f) %array_tmap_out(out,type,out_f); %array_tmap_out(varout,type,out_f); %array_tmap_out(directorin,type,out_f); %array_tmap_in(in,type,in_f); %array_tmap_in(varin,type,in_f); %array_tmap_in(directorout,type,in_f); %enddef %make_simple_array_typemap(bool,caml_val_bool,caml_long_val); %make_simple_array_typemap(short,caml_val_short,caml_long_val); %make_simple_array_typemap(unsigned short,caml_val_ushort,caml_long_val); %make_simple_array_typemap(int,caml_val_int,caml_long_val); %make_simple_array_typemap(unsigned int,caml_val_uint,caml_long_val); %make_simple_array_typemap(long,caml_val_long,caml_long_val); %make_simple_array_typemap(unsigned long,caml_val_ulong,caml_long_val); %make_simple_array_typemap(size_t,caml_val_int,caml_long_val); %make_simple_array_typemap(float,caml_val_float,caml_double_val); %make_simple_array_typemap(double,caml_val_double,caml_double_val); #ifdef __cplusplus %typemap(in) SWIGTYPE [] { int i; /* $*1_type */ $1 = new $*1_type [$1_dim0]; for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = *(($*1_ltype *) caml_ptr_val(caml_array_nth($input,i), $*1_descriptor)) ; } } #else %typemap(in) SWIGTYPE [] { int i; /* $*1_type */ $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = *(($*1_ltype) caml_ptr_val(caml_array_nth($input), $*1_descriptor)); } } #endif %typemap(out) SWIGTYPE [] { int i; CAML_VALUE *fromval = caml_named_value("create_$ntype_from_ptr"); $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { if( fromval ) { caml_array_set ($result, i, callback(*fromval,caml_val_ptr((void *)&$1[i],$*1_descriptor))); } else { caml_array_set ($result, i, caml_val_ptr ((void *)&$1[i],$&1_descriptor)); } } } %typemap(in) enum SWIGTYPE [] { int i; /* $*1_type */ $1 = ($*1_type *)malloc( $1_size ); for( i = 0; i < $1_dim0 && i < caml_array_len($input); i++ ) { $1[i] = ($type) caml_long_val_full(caml_array_nth($input), "$type_marker"); } } %typemap(out) enum SWIGTYPE [] { int i; $result = caml_array_new($1_dim0); for( i = 0; i < $1_dim0; i++ ) { caml_array_set ($result, i, callback2(*caml_named_value(SWIG_MODULE "_int_to_enum"), *caml_named_value("$type_marker"), Val_int($1[i]))); } } #ifdef __cplusplus %typemap(freearg) SWIGTYPE [ANY] { delete [] $1; } #else %typemap(freearg) SWIGTYPE [ANY] { free( (void *)$1 ); } #endif swig-3.0.12/Lib/ocaml/std_list.i0000664000175000017500000001034413042756442016237 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_list.i * * SWIG typemaps for std::list types * ----------------------------------------------------------------------------- */ %include %module std_list %{ #include #include %} namespace std{ template class list { public: typedef T &reference; typedef const T& const_reference; typedef T &iterator; typedef const T& const_iterator; list(); list(unsigned int size, const T& value = T()); list(const list &); ~list(); void assign(unsigned int n, const T& value); void swap(list &x); const_reference front(); const_reference back(); const_iterator begin(); const_iterator end(); void resize(unsigned int n, T c = T()); bool empty() const; void push_front(const T& x); void push_back(const T& x); void pop_front(); void pop_back(); void clear(); unsigned int size() const; unsigned int max_size() const; void resize(unsigned int n, const T& value); void remove(const T& value); void unique(); void reverse(); void sort(); %extend { const_reference __getitem__(int i) throw (std::out_of_range) { std::list::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && i::iterator first = self->begin(); int size = int(self->size()); if (i<0) i += size; if (i>=0 && ierase(first); } else throw std::out_of_range("list index out of range"); } std::list __getslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; if (i>=j) i=j; if (i>=0 && i=0) { for (int k=0;k tmp(j-i); if (j>i) std::copy(first,end,tmp.begin()); return tmp; } else throw std::out_of_range("list index out of range"); } void __delslice__(int i,int j) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); } void __setslice__(int i,int j, const std::list& v) { std::list::iterator first = self->begin(); std::list::iterator end = self->end(); int size = int(self->size()); if (i<0) i += size; if (j<0) j += size; if (i<0) i = 0; if (j>size) j = size; for (int k=0;kerase(first,end); if (i+1 <= int(self->size())) { first = self->begin(); for (int k=0;kinsert(first,v.begin(),v.end()); } else self->insert(self->end(),v.begin(),v.end()); } } unsigned int __len__() { return self->size(); } bool __nonzero__() { return !(self->empty()); } void append(const T& x) { self->push_back(x); } void pop() { self->pop_back(); } }; }; } swig-3.0.12/Lib/ocaml/swigp4.ml0000664000175000017500000001477413042756442016022 0ustar williamwilliamopen Camlp4 module Id : Sig.Id = struct let name = "swigp4" let version = "0.1" end module Make (Syntax : Sig.Camlp4Syntax) = struct open Sig include Syntax let _loc = Loc.ghost let lap x y = x :: y let c_ify e loc = match e with <:expr< $int:_$ >> -> <:expr< (C_int $e$) >> | <:expr< $str:_$ >> -> <:expr< (C_string $e$) >> | <:expr< $chr:_$ >> -> <:expr< (C_char $e$) >> | <:expr< $flo:_$ >> -> <:expr< (C_double $e$) >> | <:expr< True >> -> <:expr< (C_bool $e$) >> | <:expr< False >> -> <:expr< (C_bool $e$) >> | _ -> <:expr< $e$ >> let mk_list args loc f = let rec mk_list_inner args loc f = match args with [] -> <:expr< [] >> | x :: xs -> (let loc = Ast.loc_of_expr x in <:expr< [ ($f x _loc$) ] @ ($mk_list_inner xs loc f$) >>) in match args with [] -> <:expr< (Obj.magic C_void) >> | [ a ] -> <:expr< (Obj.magic $f a _loc$) >> | _ -> <:expr< (Obj.magic (C_list ($mk_list_inner args loc f$))) >> ;; EXTEND Gram GLOBAL: expr; expr: LEVEL "top" [ [ e1 = expr ; "'" ; "[" ; e2 = expr ; "]" -> <:expr< (invoke $e1$) "[]" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:l$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $str:u$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) $s$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "." ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke $e1$) "()" ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; l = LIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:l$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; u = UIDENT ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $str:u$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "->" ; s = expr LEVEL "simple" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< (invoke ((invoke $e1$) "->" C_void)) $s$ ($mk_list args _loc c_ify$) >> | e1 = expr ; "'" ; "++" -> <:expr< (invoke $e1$) "++" C_void >> | e1 = expr ; "'" ; "--" -> <:expr< (invoke $e1$) "--" C_void >> | e1 = expr ; "'" ; "-" ; e2 = expr -> <:expr< (invoke $e1$) "-" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "+" ; e2 = expr -> <:expr< (invoke $e1$) "+" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "*" ; e2 = expr -> <:expr< (invoke $e1$) "*" (C_list [ $c_ify e2 _loc$ ]) >> | "'" ; "&" ; e1 = expr -> <:expr< (invoke $e1$) "&" C_void >> | "'" ; "!" ; e1 = expr -> <:expr< (invoke $e1$) "!" C_void >> | "'" ; "~" ; e1 = expr -> <:expr< (invoke $e1$) "~" C_void >> | e1 = expr ; "'" ; "/" ; e2 = expr -> <:expr< (invoke $e1$) "/" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "%" ; e2 = expr -> <:expr< (invoke $e1$) "%" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsl" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsr" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "<" ; e2 = expr -> <:expr< (invoke $e1$) "<" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "<=" ; e2 = expr -> <:expr< (invoke $e1$) "<=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; ">" ; e2 = expr -> <:expr< (invoke $e1$) ">" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; ">=" ; e2 = expr -> <:expr< (invoke $e1$) ">=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "==" ; e2 = expr -> <:expr< (invoke $e1$) "==" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "!=" ; e2 = expr -> <:expr< (invoke $e1$) "!=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&" ; e2 = expr -> <:expr< (invoke $e1$) "&" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "^" ; e2 = expr -> <:expr< (invoke $e1$) "^" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "|" ; e2 = expr -> <:expr< (invoke $e1$) "|" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&&" ; e2 = expr -> <:expr< (invoke $e1$) "&&" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "||" ; e2 = expr -> <:expr< (invoke $e1$) "||" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) "=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "+=" ; e2 = expr -> <:expr< (invoke $e1$) "+=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "-=" ; e2 = expr -> <:expr< (invoke $e1$) "-=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "*=" ; e2 = expr -> <:expr< (invoke $e1$) "*=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "/=" ; e2 = expr -> <:expr< (invoke $e1$) "/=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "%=" ; e2 = expr -> <:expr< (invoke $e1$) "%=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsl" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) ("<" ^ "<=") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "lsr" ; "=" ; e2 = expr -> <:expr< (invoke $e1$) (">" ^ ">=") (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "&=" ; e2 = expr -> <:expr< (invoke $e1$) "&=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "^=" ; e2 = expr -> <:expr< (invoke $e1$) "^=" (C_list [ $c_ify e2 _loc$ ]) >> | e1 = expr ; "'" ; "|=" ; e2 = expr -> <:expr< (invoke $e1$) "|=" (C_list [ $c_ify e2 _loc$ ]) >> | "'" ; e = expr -> c_ify e _loc | c = expr ; "as" ; id = LIDENT -> <:expr< $lid:"get_" ^ id$ $c$ >> | c = expr ; "to" ; id = LIDENT -> <:expr< $uid:"C_" ^ id$ $c$ >> | "`" ; "`" ; l = LIDENT -> <:expr< C_enum `$lid:l$ >> | "`" ; "`" ; u = UIDENT -> <:expr< C_enum `$uid:u$ >> | f = expr ; "'" ; "(" ; args = LIST0 (expr LEVEL "simple") SEP "," ; ")" -> <:expr< $f$ ($mk_list args _loc c_ify$) >> ] ] ; END ;; end module M = Register.OCamlSyntaxExtension(Id)(Make) swig-3.0.12/Lib/ocaml/std_string.i0000664000175000017500000000620213042756442016570 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %{ #include #include %} %include %include namespace std { %naturalvar string; %naturalvar wstring; class string; class wstring; /* Overloading check */ %typemap(in) string { /* %typemap(in) string */ if (caml_ptr_check($input)) $1.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); else SWIG_exception(SWIG_TypeError, "string expected"); } %typemap(in) const string & ($*1_ltype temp) { /* %typemap(in) const string & */ if (caml_ptr_check($input)) { temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string & ($*1_ltype temp) { /* %typemap(in) string & */ if (caml_ptr_check($input)) { temp.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = &temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(in) string * ($*1_ltype *temp) { /* %typemap(in) string * */ if (caml_ptr_check($input)) { temp = new $*1_ltype((char *)caml_ptr_val($input,0), caml_string_len($input)); $1 = temp; } else { SWIG_exception(SWIG_TypeError, "string expected"); } } %typemap(free) string * ($*1_ltype *temp) { delete temp; } %typemap(argout) string & { /* %typemap(argout) string & */ swig_result = caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), (*$1).size())); } %typemap(directorout) string { /* %typemap(directorout) string */ $result.assign((char *)caml_ptr_val($input,0), caml_string_len($input)); } %typemap(out) string { /* %typemap(out) string */ $result = caml_val_string_len($1.c_str(),$1.size()); } %typemap(out) string * { /* %typemap(out) string * */ $result = caml_val_string_len((*$1).c_str(),(*$1).size()); } } #ifdef ENABLE_CHARPTR_ARRAY char **c_charptr_array( const std::vector &str_v ); %{ SWIGEXT char **c_charptr_array( const std::vector &str_v ) { char **out = new char *[str_v.size() + 1]; out[str_v.size()] = 0; for( int i = 0; i < str_v.size(); i++ ) { out[i] = (char *)str_v[i].c_str(); } return out; } %} #endif #ifdef ENABLE_STRING_VECTOR %template (StringVector) std::vector; %insert(ml) %{ (* Some STL convenience items *) let string_array_to_vector sa = let nv = _new_StringVector C_void in array_to_vector nv (fun x -> C_string x) sa ; nv let c_string_array ar = _c_charptr_array (string_array_to_vector ar) %} %insert(mli) %{ val c_string_array: string array -> c_obj %} #endif swig-3.0.12/Lib/ocaml/std_map.i0000664000175000017500000000444013042756442016041 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/ocaml/cstring.i0000664000175000017500000001366713042756442016076 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cstring.i * * This file provides typemaps and macros for dealing with various forms * of C character string handling. The primary use of this module * is in returning character data that has been allocated or changed in * some way. * ----------------------------------------------------------------------------- */ /* %cstring_input_binary(TYPEMAP, SIZE) * * Macro makes a function accept binary string data along with * a size. */ %define %cstring_input_binary(TYPEMAP, SIZE) %apply (char *STRING, int LENGTH) { (TYPEMAP, SIZE) }; %enddef /* * %cstring_bounded_output(TYPEMAP, MAX) * * This macro is used to return a NULL-terminated output string of * some maximum length. For example: * * %cstring_bounded_output(char *outx, 512); * void foo(char *outx) { * sprintf(outx,"blah blah\n"); * } * */ %define %cstring_bounded_output(TYPEMAP,MAX) %typemap(ignore) TYPEMAP(char temp[MAX+1]) { $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $1[MAX] = 0; $result = caml_list_append($result,caml_val_string(str)); } %enddef /* * %cstring_chunk_output(TYPEMAP, SIZE) * * This macro is used to return a chunk of binary string data. * Embedded NULLs are okay. For example: * * %cstring_chunk_output(char *outx, 512); * void foo(char *outx) { * memmove(outx, somedata, 512); * } * */ %define %cstring_chunk_output(TYPEMAP,SIZE) %typemap(ignore) TYPEMAP(char temp[SIZE]) { $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string_len($1,SIZE)); } %enddef /* * %cstring_bounded_mutable(TYPEMAP, SIZE) * * This macro is used to wrap a string that's going to mutate. * * %cstring_bounded_mutable(char *in, 512); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define %cstring_bounded_mutable(TYPEMAP,MAX) %typemap(in) TYPEMAP(char temp[MAX+1]) { char *t = (char *)caml_ptr_val($input); strncpy(temp,t,MAX); $1 = ($1_ltype) temp; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string_len($1,MAX)); } %enddef /* * %cstring_mutable(TYPEMAP [, expansion]) * * This macro is used to wrap a string that will mutate in place. * It may change size up to a user-defined expansion. * * %cstring_mutable(char *in); * void foo(in *x) { * while (*x) { * *x = toupper(*x); * x++; * } * } * */ %define %cstring_mutable(TYPEMAP,...) %typemap(in) TYPEMAP { char *t = String_val($input); int n = string_length($input); $1 = ($1_ltype) t; #if #__VA_ARGS__ == "" #ifdef __cplusplus $1 = ($1_ltype) new char[n+1]; #else $1 = ($1_ltype) malloc(n+1); #endif #else #ifdef __cplusplus $1 = ($1_ltype) new char[n+1+__VA_ARGS__]; #else $1 = ($1_ltype) malloc(n+1+__VA_ARGS__); #endif #endif memmove($1,t,n); $1[n] = 0; } %typemap(argout) TYPEMAP { $result = caml_list_append($result,caml_val_string($1)); #ifdef __cplusplus delete[] $1; #else free($1); #endif } %enddef /* * %cstring_output_maxsize(TYPEMAP, SIZE) * * This macro returns data in a string of some user-defined size. * * %cstring_output_maxsize(char *outx, int max) { * void foo(char *outx, int max) { * sprintf(outx,"blah blah\n"); * } */ %define %cstring_output_maxsize(TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) { $2 = caml_val_long($input); #ifdef __cplusplus $1 = ($1_ltype) new char[$2+1]; #else $1 = ($1_ltype) malloc($2+1); #endif } %typemap(argout) (TYPEMAP,SIZE) { $result = caml_list_append($result,caml_val_string($1)); #ifdef __cplusplus delete [] $1; #else free($1); #endif } %enddef /* * %cstring_output_withsize(TYPEMAP, SIZE) * * This macro is used to return character data along with a size * parameter. * * %cstring_output_maxsize(char *outx, int *max) { * void foo(char *outx, int *max) { * sprintf(outx,"blah blah\n"); * *max = strlen(outx); * } */ %define %cstring_output_withsize(TYPEMAP, SIZE) %typemap(in) (TYPEMAP, SIZE) { int n = caml_val_long($input); #ifdef __cplusplus $1 = ($1_ltype) new char[n+1]; $2 = ($2_ltype) new $*1_ltype; #else $1 = ($1_ltype) malloc(n+1); $2 = ($2_ltype) malloc(sizeof($*1_ltype)); #endif *$2 = n; } %typemap(argout) (TYPEMAP,SIZE) { $result = caml_list_append($result,caml_val_string_len($1,$2)); #ifdef __cplusplus delete [] $1; delete $2; #else free($1); free($2); #endif } %enddef /* * %cstring_output_allocate(TYPEMAP, RELEASE) * * This macro is used to return character data that was * allocated with new or malloc. * * %cstring_output_allocated(char **outx, free($1)); * void foo(char **outx) { * *outx = (char *) malloc(512); * sprintf(outx,"blah blah\n"); * } */ %define %cstring_output_allocate(TYPEMAP, RELEASE) %typemap(ignore) TYPEMAP($*1_ltype temp = 0) { $1 = &temp; } %typemap(argout) TYPEMAP { if (*$1) { $result = caml_list_append($result,caml_val_string($1)); RELEASE; } else { $result = caml_list_append($result,caml_val_ptr($1)); } } %enddef /* * %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) * * This macro is used to return character data that was * allocated with new or malloc. * * %cstring_output_allocated(char **outx, int *sz, free($1)); * void foo(char **outx, int *sz) { * *outx = (char *) malloc(512); * sprintf(outx,"blah blah\n"); * *sz = strlen(outx); * } */ %define %cstring_output_allocate_size(TYPEMAP, SIZE, RELEASE) %typemap(ignore) (TYPEMAP, SIZE) ($*1_ltype temp = 0, $*2_ltype tempn) { $1 = &temp; $2 = &tempn; } %typemap(argout)(TYPEMAP,SIZE) { if (*$1) { $result = caml_list_append($result,caml_val_string_len($1,$2)); RELEASE; } else $result = caml_list_append($result,caml_val_ptr($1)); } %enddef swig-3.0.12/Lib/ocaml/typecheck.i0000664000175000017500000001115413042756442016371 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typecheck.i * * Typechecking rules * ----------------------------------------------------------------------------- */ %typecheck(SWIG_TYPECHECK_INTEGER) char, signed char, const char &, const signed char & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_char: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INTEGER) unsigned char, const unsigned char & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_uchar: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INTEGER) short, signed short, const short &, const signed short &, wchar_t { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_short: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INTEGER) unsigned short, const unsigned short & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_ushort: $1 = 1; break; default: $1 = 0; break; } } } // XXX arty // Will move enum SWIGTYPE later when I figure out what to do with it... %typecheck(SWIG_TYPECHECK_INTEGER) int, signed int, const int &, const signed int &, enum SWIGTYPE { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_int: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INTEGER) unsigned int, const unsigned int & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_uint: $1 = 1; break; case C_int32: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INTEGER) long, signed long, unsigned long, long long, signed long long, unsigned long long, const long &, const signed long &, const unsigned long &, const long long &, const signed long long &, const unsigned long long & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_int64: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_INTEGER) bool, oc_bool, BOOL, const bool &, const oc_bool &, const BOOL & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_bool: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_DOUBLE) float, const float & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_float: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_DOUBLE) double, const double & { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_double: $1 = 1; break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_STRING) char * { if( !Is_block($input) ) $1 = 0; else { switch( SWIG_Tag_val($input) ) { case C_string: $1 = 1; break; case C_ptr: { swig_type_info *typeinfo = (swig_type_info *)(long)SWIG_Int64_val(SWIG_Field($input,1)); $1 = SWIG_TypeCheck("char *",typeinfo) || SWIG_TypeCheck("signed char *",typeinfo) || SWIG_TypeCheck("unsigned char *",typeinfo) || SWIG_TypeCheck("const char *",typeinfo) || SWIG_TypeCheck("const signed char *",typeinfo) || SWIG_TypeCheck("const unsigned char *",typeinfo) || SWIG_TypeCheck("std::string",typeinfo); } break; default: $1 = 0; break; } } } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr,$descriptor); } #if 0 %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, $&1_descriptor); } #endif %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *ptr; $1 = !caml_ptr_val_internal($input, &ptr, 0); } /* ------------------------------------------------------------ * Exception handling * ------------------------------------------------------------ */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { SWIG_exception($1,"Thrown exception from C++ (int)"); } %typemap(throws) SWIGTYPE CLASS { $&1_ltype temp = new $1_ltype($1); SWIG_exception((int)temp,"Thrown exception from C++ (object)"); } %typemap(throws) SWIGTYPE { (void)$1; SWIG_exception(0,"Thrown exception from C++ (unknown)"); } %typemap(throws) char * { SWIG_exception(0,$1); } swig-3.0.12/Lib/ocaml/ocaml.i0000664000175000017500000000265213042756442015510 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ocaml.i * * SWIG Configuration File for Ocaml * ----------------------------------------------------------------------------- */ %runtime %{ #define SWIGSTATIC static %} /* Insert common stuff */ %insert(runtime) "swigrun.swg" /* Include headers */ %insert(runtime) "ocamldec.swg" /* Type registration */ %insert(init) "swiginit.swg" %insert(init) "typeregister.swg" %insert(mlitail) %{ val swig_val : c_enum_type -> c_obj -> Swig.c_obj %} %insert(mltail) %{ let rec swig_val t v = match v with C_enum e -> enum_to_int t v | C_list l -> Swig.C_list (List.map (swig_val t) l) | C_array a -> Swig.C_array (Array.map (swig_val t) a) | _ -> Obj.magic v %} /*#ifndef SWIG_NOINCLUDE*/ %insert(runtime) "ocaml.swg" /*#endif*/ %insert(classtemplate) "class.swg" /* Definitions */ #define SWIG_malloc(size) swig_malloc(size, FUNC_NAME) #define SWIG_free(mem) free(mem) /* Read in standard typemaps. */ %include %include %include %include %include /* ocaml keywords */ /* There's no need to use this, because of my rewriting machinery. C++ * words never collide with ocaml keywords */ /* still we include the file, but the warning says that the offending name will be properly renamed. Just to let the user to know about it. */ %include swig-3.0.12/Lib/ocaml/swig.mli0000664000175000017500000000324013042756442015711 0ustar williamwilliam(* -*- tuareg -*- *) type enum = [ `Int of int ] type 'a c_obj_t = C_void | C_bool of bool | C_char of char | C_uchar of char | C_short of int | C_ushort of int | C_int of int | C_uint of int32 | C_int32 of int32 | C_int64 of int64 | C_float of float | C_double of float | C_ptr of int64 * int64 | C_array of 'a c_obj_t array | C_list of 'a c_obj_t list | C_obj of (string -> 'a c_obj_t -> 'a c_obj_t) | C_string of string | C_enum of 'a | C_director_core of 'a c_obj_t * 'a c_obj_t option ref type c_obj = enum c_obj_t exception InvalidDirectorCall of c_obj exception NoSuchClass of string val invoke : ('a c_obj_t) -> (string -> 'a c_obj_t -> 'a c_obj_t) val fnhelper : 'a c_obj_t -> 'a c_obj_t list val get_int : 'a c_obj_t -> int val get_float : 'a c_obj_t -> float val get_string : 'a c_obj_t -> string val get_char : 'a c_obj_t -> char val get_bool : 'a c_obj_t -> bool val make_float : float -> 'a c_obj_t val make_double : float -> 'a c_obj_t val make_string : string -> 'a c_obj_t val make_bool : bool -> 'a c_obj_t val make_char : char -> 'a c_obj_t val make_char_i : int -> 'a c_obj_t val make_uchar : char -> 'a c_obj_t val make_uchar_i : int -> 'a c_obj_t val make_short : int -> 'a c_obj_t val make_ushort : int -> 'a c_obj_t val make_int : int -> 'a c_obj_t val make_uint : int -> 'a c_obj_t val make_int32 : int -> 'a c_obj_t val make_int64 : int -> 'a c_obj_t val new_derived_object: ('a c_obj_t -> 'a c_obj_t) -> ('a c_obj_t -> string -> 'a c_obj_t -> 'a c_obj_t) -> 'a c_obj_t -> 'a c_obj_t val register_class_byname : string -> ('a c_obj_t -> 'a c_obj_t) -> unit val create_class : string -> 'a c_obj_t -> 'a c_obj_t swig-3.0.12/Lib/xml/0000775000175000017500000000000013042756442013743 5ustar williamwilliamswig-3.0.12/Lib/xml/xml.swg0000664000175000017500000000002513042756442015262 0ustar williamwilliam/* nothing special */swig-3.0.12/Lib/xml/typemaps.i0000664000175000017500000000026313042756442015760 0ustar williamwilliam// -------------------------------------------------------------------- // Empty file for %include to work // -------------------------------------------------------------------- swig-3.0.12/Lib/swiginit.swg0000664000175000017500000001744513042756442015535 0ustar williamwilliam/* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif SWIGRUNTIME void SWIG_InitializeModule(void *clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %d\n", swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif swig-3.0.12/Lib/javascript/0000775000175000017500000000000013042756442015311 5ustar williamwilliamswig-3.0.12/Lib/javascript/v8/0000775000175000017500000000000013042756442015646 5ustar williamwilliamswig-3.0.12/Lib/javascript/v8/javascriptprimtypes.swg0000664000175000017500000001051213042756442022512 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(bool)(bool value) { return SWIGV8_BOOLEAN_NEW(value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(v8::Handle obj, bool *val) { if(!obj->IsBoolean()) { return SWIG_ERROR; } if (val) *val = obj->BooleanValue(); return SWIG_OK; } } /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(int)(int value) { return SWIGV8_INT32_NEW(value); } } %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERN int SWIG_AsVal_dec(int)(v8::Handle valRef, int* val) { if (!valRef->IsNumber()) { return SWIG_TypeError; } if(val) *val = valRef->IntegerValue(); return SWIG_OK; } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE v8::Handle SWIG_From_dec(long)(long value) { return SWIGV8_NUMBER_NEW(value); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(v8::Handle obj, long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = (long) obj->IntegerValue(); return SWIG_OK; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE v8::Handle SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(v8::Handle obj, unsigned long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } long longVal = (long) obj->NumberValue(); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } } /* long long */ // Note: these are copied from 'long' and probably need fixing %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE v8::Handle SWIG_From_dec(long long)(long long value) { return SWIGV8_NUMBER_NEW(value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(v8::Handle obj, long long* val) { if (!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = (long long) obj->IntegerValue(); return SWIG_OK; } %#endif } /* unsigned long long */ // Note: these are copied from 'unsigned long' and probably need fixing %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE v8::Handle SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? SWIGV8_INTEGER_NEW_UNS(value) : SWIGV8_INTEGER_NEW(%numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(v8::Handle obj, unsigned long long *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } long long longVal = (long long) obj->NumberValue(); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERN v8::Handle SWIG_From_dec(double) (double val) { return SWIGV8_NUMBER_NEW(val); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(v8::Handle obj, double *val) { if(!obj->IsNumber()) { return SWIG_TypeError; } if(val) *val = obj->NumberValue(); return SWIG_OK; } } swig-3.0.12/Lib/javascript/v8/std_complex.i0000664000175000017500000000073213042756442020343 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-3.0.12/Lib/javascript/v8/std_deque.i0000664000175000017500000000003413042756442017772 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/v8/javascripthelpers.swg0000664000175000017500000000664313042756442022132 0ustar williamwilliam%insert(runtime) %{ // Note: since 3.19 there are new CallBack types, since 03.21.9 the old ones have been removed #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) typedef v8::InvocationCallback SwigV8FunctionCallback; typedef v8::AccessorGetter SwigV8AccessorGetterCallback; typedef v8::AccessorSetter SwigV8AccessorSetterCallback; typedef v8::AccessorInfo SwigV8PropertyCallbackInfoVoid; #else typedef v8::FunctionCallback SwigV8FunctionCallback; typedef v8::AccessorGetterCallback SwigV8AccessorGetterCallback; typedef v8::AccessorSetterCallback SwigV8AccessorSetterCallback; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfoVoid; #endif /** * Creates a class template for a class with specified initialization function. */ SWIGRUNTIME v8::Handle SWIGV8_CreateClassTemplate(const char* symbol) { SWIGV8_HANDLESCOPE_ESC(); v8::Local class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID(); class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol)); v8::Handle inst_templ = class_templ->InstanceTemplate(); inst_templ->SetInternalFieldCount(1); v8::Handle equals_templ = class_templ->PrototypeTemplate(); equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals)); v8::Handle cptr_templ = class_templ->PrototypeTemplate(); cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr)); SWIGV8_ESCAPE(class_templ); } /** * Registers a class method with given name for a given class template. */ SWIGRUNTIME void SWIGV8_AddMemberFunction(v8::Handle class_templ, const char* symbol, SwigV8FunctionCallback _func) { v8::Handle proto_templ = class_templ->PrototypeTemplate(); proto_templ->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)); } /** * Registers a class property with given name for a given class template. */ SWIGRUNTIME void SWIGV8_AddMemberVariable(v8::Handle class_templ, const char* symbol, SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { v8::Handle proto_templ = class_templ->InstanceTemplate(); proto_templ->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); } /** * Registers a class method with given name for a given object. */ SWIGRUNTIME void SWIGV8_AddStaticFunction(v8::Handle obj, const char* symbol, const SwigV8FunctionCallback& _func) { obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction()); } /** * Registers a class method with given name for a given object. */ SWIGRUNTIME void SWIGV8_AddStaticVariable(v8::Handle obj, const char* symbol, SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) { obj->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter); } SWIGRUNTIME void JS_veto_set_variable(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid& info) { char buffer[256]; char msg[512]; int res; property->WriteUtf8(buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); if(res<0) { SWIG_exception(SWIG_ERROR, "Tried to write read-only variable."); } else { SWIG_exception(SWIG_ERROR, msg); } fail: ; } %} // v8_helper_functions swig-3.0.12/Lib/javascript/v8/javascript.swg0000664000175000017500000000066713042756442020547 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascript.swg * * Javascript typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include swig-3.0.12/Lib/javascript/v8/javascriptruntime.swg0000664000175000017500000000320613042756442022143 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascriptruntime.swg * * ----------------------------------------------------------------------------- */ // V8 Version Macro // ---------------- // // v8 added version macros V8_MAJOR_VERSION, V8_MINOR_VERSION, V8_BUILD_NUMBER // and V8_PATCH_LEVEL in version 4.3.0. SWIG generated code uses these if // they are defined - to support earlier versions you can specify the V8 version // in use via the command line when you run SWIG: // // swig -c++ -javascript -v8 -DV8_VERSION=0x032530 example.i // // Or code in the interface file using SWIG_V8_VERSION: // // %begin %{#define SWIG_V8_VERSION 0x031110%} // // This is specified as a hex constant, but the constant is read as pairs of // decimal digits, so for V8 3.25.30 use constant 0x032530. This scheme can't // represent components > 99, but this constant is only useful for V8 < 4.3.0, // and no V8 versions from that era had a component > 99. %define %swig_v8_define_version(version) %insert("runtime") %{ #ifndef SWIG_V8_VERSION #define SWIG_V8_VERSION version #endif %} %enddef #ifdef V8_VERSION %swig_v8_define_version(V8_VERSION) #else // HACK: defining a default version %swig_v8_define_version(0x031110) #endif // Node support // ------------ #ifdef BUILDING_NODE_EXTENSION %insert("runtime") %{ #include %} #endif // V8 runtime // ---------- %insert(runtime) %{ #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "javascriptrun.swg" swig-3.0.12/Lib/javascript/v8/javascriptrun.swg0000664000175000017500000005521613042756442021274 0ustar williamwilliam/* --------------------------------------------------------------------------- * These typedefs and defines are used to deal with v8 API changes * * ---------------------------------------------------------------------------*/ // First v8 version that uses "SetWeak" and not "MakeWeak" #define SWIGV8_SETWEAK_VERSION 0x032224 #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031803) #define SWIGV8_STRING_NEW2(cstr, len) v8::String::New(cstr, len) #else #define SWIGV8_STRING_NEW2(cstr, len) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), cstr, v8::String::kNormalString, len) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) typedef v8::Handle SwigV8ReturnValue; typedef v8::Arguments SwigV8Arguments; typedef v8::AccessorInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) return scope.Close(val) #define SWIGV8_RETURN_INFO(val, info) return scope.Close(val) #else typedef void SwigV8ReturnValue; typedef v8::FunctionCallbackInfo SwigV8Arguments; typedef v8::PropertyCallbackInfo SwigV8PropertyCallbackInfo; #define SWIGV8_RETURN(val) args.GetReturnValue().Set(val); return #define SWIGV8_RETURN_INFO(val, info) info.GetReturnValue().Set(val); return #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032117) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope #define SWIGV8_ESCAPE(val) return scope.Close(val) #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032224) #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Close(val) #else #define SWIGV8_HANDLESCOPE() v8::HandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_HANDLESCOPE_ESC() v8::EscapableHandleScope scope(v8::Isolate::GetCurrent()); #define SWIGV8_ESCAPE(val) return scope.Escape(val) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032224) #define SWIGV8_ADJUST_MEMORY(size) v8::V8::AdjustAmountOfExternalAllocatedMemory(size) #define SWIGV8_CURRENT_CONTEXT() v8::Context::GetCurrent() #define SWIGV8_THROW_EXCEPTION(err) v8::ThrowException(err) #define SWIGV8_STRING_NEW(str) v8::String::New(str) #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewSymbol(sym) #else #define SWIGV8_ADJUST_MEMORY(size) v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(size) #define SWIGV8_CURRENT_CONTEXT() v8::Isolate::GetCurrent()->GetCurrentContext() #define SWIGV8_THROW_EXCEPTION(err) v8::Isolate::GetCurrent()->ThrowException(err) #define SWIGV8_STRING_NEW(str) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), str) #define SWIGV8_SYMBOL_NEW(sym) v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sym) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032318) #define SWIGV8_ARRAY_NEW() v8::Array::New() #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(func) #define SWIGV8_FUNCTEMPLATE_NEW_VOID() v8::FunctionTemplate::New() #define SWIGV8_INT32_NEW(num) v8::Int32::New(num) #define SWIGV8_INTEGER_NEW(num) v8::Integer::New(num) #define SWIGV8_INTEGER_NEW_UNS(num) v8::Integer::NewFromUnsigned(num) #define SWIGV8_NUMBER_NEW(num) v8::Number::New(num) #define SWIGV8_OBJECT_NEW() v8::Object::New() #define SWIGV8_UNDEFINED() v8::Undefined() #define SWIGV8_NULL() v8::Null() #else #define SWIGV8_ARRAY_NEW() v8::Array::New(v8::Isolate::GetCurrent()) #define SWIGV8_BOOLEAN_NEW(bool) v8::Boolean::New(v8::Isolate::GetCurrent(), bool) #define SWIGV8_EXTERNAL_NEW(val) v8::External::New(v8::Isolate::GetCurrent(), val) #define SWIGV8_FUNCTEMPLATE_NEW(func) v8::FunctionTemplate::New(v8::Isolate::GetCurrent(), func) #define SWIGV8_FUNCTEMPLATE_NEW_VOID() v8::FunctionTemplate::New(v8::Isolate::GetCurrent()) #define SWIGV8_INT32_NEW(num) v8::Int32::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_INTEGER_NEW(num) v8::Integer::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_INTEGER_NEW_UNS(num) v8::Integer::NewFromUnsigned(v8::Isolate::GetCurrent(), num) #define SWIGV8_NUMBER_NEW(num) v8::Number::New(v8::Isolate::GetCurrent(), num) #define SWIGV8_OBJECT_NEW() v8::Object::New(v8::Isolate::GetCurrent()) #define SWIGV8_UNDEFINED() v8::Undefined(v8::Isolate::GetCurrent()) #define SWIGV8_NULL() v8::Null(v8::Isolate::GetCurrent()) #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ = v8::Persistent::New(class); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ = v8::Persistent::New(v8::Isolate::GetCurrent(), class); #else #define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ.Reset(v8::Isolate::GetCurrent(), class); #endif /* --------------------------------------------------------------------------- * Error handling * * ---------------------------------------------------------------------------*/ #define SWIG_Error(code, msg) SWIGV8_ErrorHandler.error(code, msg) #define SWIG_exception(code, msg) do { SWIGV8_ErrorHandler.error(code, msg); SWIG_fail; } while (0) #define SWIG_fail goto fail #define SWIGV8_OVERLOAD false SWIGINTERN void SWIG_V8_Raise(const char *msg) { SWIGV8_THROW_EXCEPTION(v8::Exception::Error(SWIGV8_STRING_NEW(msg))); } /* Note: There are two contexts for handling errors. A static V8ErrorHandler is used in not overloaded methods. For overloaded methods the throwing type checking mechanism is used during dispatching. As V8 exceptions can not be resetted properly the trick is to use a dynamic ErrorHandler with same local name as the global one. - See defintion of SWIG_Error above. - See code templates 'JS_function_dispatcher', 'JS_functionwrapper_overload', and 'JS_function_dispatch_case' in javascriptcode.swg */ class V8ErrorHandler { public: virtual ~V8ErrorHandler() {} virtual void error(int code, const char *msg) { SWIG_V8_Raise(msg); } }; // this is used in usually SWIGRUNTIME V8ErrorHandler SWIGV8_ErrorHandler; // instances of this are used in overloaded functions class OverloadErrorHandler: public V8ErrorHandler { public: virtual void error(int code, const char *msg) { err = v8::Exception::Error(SWIGV8_STRING_NEW(msg)); if(code != SWIG_TypeError) { SWIGV8_THROW_EXCEPTION(err); } } v8::Handle err; }; /* --------------------------------------------------------------------------- * Basic Proxy object * * ---------------------------------------------------------------------------*/ // Note: to trigger the v8 gc more often one can tell v8 about the memory consumption // TODO: we could add a v8 specific parameter to control this value #define SWIGV8_AVG_OBJ_SIZE 1000 class SWIGV8_Proxy { public: SWIGV8_Proxy(): swigCMemOwn(false), swigCObject(0), info(0) { SWIGV8_ADJUST_MEMORY(SWIGV8_AVG_OBJ_SIZE); }; ~SWIGV8_Proxy() { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) handle.ClearWeak(); handle.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) handle.ClearWeak(v8::Isolate::GetCurrent()); handle.Dispose(v8::Isolate::GetCurrent()); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) handle.ClearWeak(); handle.Dispose(); #else handle.ClearWeak(); handle.Reset(); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) handle.Clear(); #endif SWIGV8_ADJUST_MEMORY(-SWIGV8_AVG_OBJ_SIZE); } bool swigCMemOwn; void *swigCObject; swig_type_info *info; v8::Persistent handle; }; class SWIGV8_ClientData { public: v8::Persistent class_templ; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) void (*dtor) (v8::Persistent< v8::Value> object, void *parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) void (*dtor) (v8::Isolate *isolate, v8::Persistent< v8::Value> object, void *parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) void (*dtor) (v8::Isolate *isolate, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy); #else void (*dtor) (const v8::WeakCallbackData &data); #endif }; SWIGRUNTIME v8::Persistent SWIGV8_SWIGTYPE_Proxy_class_templ; SWIGRUNTIME int SWIG_V8_ConvertInstancePtr(v8::Handle objRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef)); #else SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if(cdata == NULL) { return SWIG_ERROR; } if(cdata->info != info) { swig_cast_info *tc = SWIG_TypeCheckStruct(cdata->info, info); if (!tc && cdata->info->name) { tc = SWIG_TypeCheck(cdata->info->name, info); } bool type_valid = tc != 0; if(!type_valid) { return SWIG_TypeError; } } *ptr = cdata->swigCObject; if(flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } return SWIG_OK; } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Isolate *, v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(v8::Isolate *, v8::Persistent< v8::Object > *object, SWIGV8_Proxy *proxy) { #else SWIGRUNTIME void SWIGV8_Proxy_DefaultDtor(const v8::WeakCallbackData &data) { SWIGV8_Proxy *proxy = data.GetParameter(); #endif delete proxy; } SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle valRef, void **ptr) { if(!valRef->IsObject()) { return SWIG_TypeError; } v8::Handle objRef = valRef->ToObject(); if(objRef->InternalFieldCount() < 1) return SWIG_ERROR; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); SWIGV8_Proxy *cdata = static_cast(v8::External::Unwrap(cdataRef)); #else SWIGV8_Proxy *cdata = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if(cdata == NULL) { return SWIG_ERROR; } *ptr = cdata->swigCObject; return SWIG_OK; } SWIGRUNTIME void SWIGV8_SetPrivateData(v8::Handle obj, void *ptr, swig_type_info *info, int flags) { SWIGV8_Proxy *cdata = new SWIGV8_Proxy(); cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; cdata->info = info; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) obj->SetPointerInInternalField(0, cdata); #else obj->SetAlignedPointerInInternalField(0, cdata); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle = v8::Persistent::New(obj); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) cdata->handle = v8::Persistent::New(v8::Isolate::GetCurrent(), obj); #else cdata->handle.Reset(v8::Isolate::GetCurrent(), obj); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) // clientdata must be set for owned data as we need to register the dtor if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031918) if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, SWIGV8_Proxy_DefaultDtor); } #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.MakeWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.MakeWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #else if(cdata->swigCMemOwn && (SWIGV8_ClientData*)info->clientdata) { cdata->handle.SetWeak(cdata, ((SWIGV8_ClientData*)info->clientdata)->dtor); } else { cdata->handle.SetWeak(cdata, SWIGV8_Proxy_DefaultDtor); } #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); #else cdata->handle.MarkIndependent(); #endif } SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle valRef, void **ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE(); /* special case: JavaScript null => C NULL pointer */ if(valRef->IsNull()) { *ptr=0; return SWIG_OK; } if(!valRef->IsObject()) { return SWIG_TypeError; } v8::Handle objRef = valRef->ToObject(); return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags); } SWIGRUNTIME v8::Handle SWIG_V8_NewPointerObj(void *ptr, swig_type_info *info, int flags) { SWIGV8_HANDLESCOPE_ESC(); v8::Handle class_templ; if (ptr == NULL) { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) SWIGV8_ESCAPE(SWIGV8_NULL()); #else v8::Local result = SWIGV8_NULL(); SWIGV8_ESCAPE(result); #endif } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) if(info->clientdata != 0) { class_templ = ((SWIGV8_ClientData*) info->clientdata)->class_templ; } else { class_templ = SWIGV8_SWIGTYPE_Proxy_class_templ; } #else v8::Isolate *isolate = v8::Isolate::GetCurrent(); if(info->clientdata != 0) { class_templ = v8::Local::New(isolate, ((SWIGV8_ClientData*) info->clientdata)->class_templ); } else { class_templ = v8::Local::New(isolate, SWIGV8_SWIGTYPE_Proxy_class_templ); } #endif // v8::Handle result = class_templ->InstanceTemplate()->NewInstance(); v8::Local result = class_templ->InstanceTemplate()->NewInstance(); SWIGV8_SetPrivateData(result, ptr, info, flags); SWIGV8_ESCAPE(result); } #define SWIG_ConvertPtr(obj, ptr, info, flags) SWIG_V8_ConvertPtr(obj, ptr, info, flags) #define SWIG_NewPointerObj(ptr, info, flags) SWIG_V8_NewPointerObj(ptr, info, flags) #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_V8_ConvertInstancePtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_V8_NewPointerObj(thisvalue, type, flags) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_V8_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_V8_NewPointerObj(ptr, type, 0) #define SWIG_GetInstancePtr(obj, ptr) SWIG_V8_GetInstancePtr(obj, ptr) SWIGRUNTIME SwigV8ReturnValue _SWIGV8_wrap_equals(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; void *arg1 = (void *) 0 ; void *arg2 = (void *) 0 ; bool result; int res1; int res2; if(args.Length() != 1) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for equals."); res1 = SWIG_GetInstancePtr(args.Holder(), &arg1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ERROR, "Could not get pointer from 'this' object for equals."); } res2 = SWIG_GetInstancePtr(args[0], &arg2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "equals" "', argument " "1"" of type '" "void *""'"); } result = (bool)(arg1 == arg2); jsresult = SWIGV8_BOOLEAN_NEW(result); SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } SWIGRUNTIME SwigV8ReturnValue _wrap_getCPtr(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; void *arg1 = (void *) 0 ; long result; int res1; res1 = SWIG_GetInstancePtr(args.Holder(), &arg1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "getCPtr" "', argument " "1"" of type '" "void *""'"); } result = (long)arg1; jsresult = SWIGV8_NUMBER_NEW(result); SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } /* --------------------------------------------------------------------------- * PackedData object * * ---------------------------------------------------------------------------*/ class SwigV8PackedData { public: SwigV8PackedData(void *data, size_t size, swig_type_info *type): data(data), size(size), type(type) {}; ~SwigV8PackedData() { }; void *data; size_t size; swig_type_info *type; v8::Persistent handle; }; SWIGRUNTIMEINLINE int SwigV8Packed_Check(v8::Handle valRef) { SWIGV8_HANDLESCOPE(); v8::Handle objRef = valRef->ToObject(); if(objRef->InternalFieldCount() < 1) return false; v8::Handle flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__")); return (flag->IsBoolean() && flag->BooleanValue()); } SWIGRUNTIME swig_type_info *SwigV8Packed_UnpackData(v8::Handle valRef, void *ptr, size_t size) { if (SwigV8Packed_Check(valRef)) { SWIGV8_HANDLESCOPE(); SwigV8PackedData *sobj; v8::Handle objRef = valRef->ToObject(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) v8::Handle cdataRef = objRef->GetInternalField(0); sobj = static_cast(v8::External::Unwrap(cdataRef)); #else sobj = static_cast(objRef->GetAlignedPointerFromInternalField(0)); #endif if (sobj == NULL || sobj->size != size) return 0; memcpy(ptr, sobj->data, size); return sobj->type; } else { return 0; } } SWIGRUNTIME int SWIGV8_ConvertPacked(v8::Handle valRef, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigV8Packed_UnpackData(valRef, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Persistent< v8::Value > object, void *parameter) { SwigV8PackedData *cdata = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SwigV8PackedData *cdata = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) SWIGRUNTIME void _wrap_SwigV8PackedData_delete(v8::Isolate *isolate, v8::Persistent *object, SwigV8PackedData *cdata) { #else SWIGRUNTIME void _wrap_SwigV8PackedData_delete(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SwigV8PackedData *cdata = data.GetParameter(); #endif delete cdata; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Clear(); object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Clear(); object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) object->Dispose(); #else object.Clear(); #endif } SWIGRUNTIME v8::Handle SWIGV8_NewPackedObj(void *data, size_t size, swig_type_info *type) { SWIGV8_HANDLESCOPE_ESC(); SwigV8PackedData *cdata = new SwigV8PackedData(data, size, type); // v8::Handle obj = SWIGV8_OBJECT_NEW(); v8::Local obj = SWIGV8_OBJECT_NEW(); obj->SetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"), SWIGV8_BOOLEAN_NEW(true)); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511) obj->SetPointerInInternalField(0, cdata); #else obj->SetAlignedPointerInInternalField(0, cdata); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle = v8::Persistent::New(obj); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) cdata->handle = v8::Persistent::New(v8::Isolate::GetCurrent(), obj); #else cdata->handle.Reset(v8::Isolate::GetCurrent(), obj); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MakeWeak(cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031918) cdata->handle.MakeWeak(v8::Isolate::GetCurrent(), cdata, _wrap_SwigV8PackedData_delete); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) cdata->handle.MakeWeak(cdata, _wrap_SwigV8PackedData_delete); #else cdata->handle.SetWeak(cdata, _wrap_SwigV8PackedData_delete); // v8::V8::SetWeak(&cdata->handle, cdata, _wrap_SwigV8PackedData_delete); #endif #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) cdata->handle.MarkIndependent(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) cdata->handle.MarkIndependent(v8::Isolate::GetCurrent()); #else cdata->handle.MarkIndependent(); #endif SWIGV8_ESCAPE(obj); } #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIGV8_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIGV8_NewPackedObj(ptr, sz, type) /* --------------------------------------------------------------------------- * Support for IN/OUTPUT typemaps (see Lib/typemaps/inoutlist.swg) * * ---------------------------------------------------------------------------*/ SWIGRUNTIME #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Handle SWIGV8_AppendOutput(v8::Handle result, v8::Handle obj) { #else v8::Handle SWIGV8_AppendOutput(v8::Local result, v8::Handle obj) { #endif SWIGV8_HANDLESCOPE_ESC(); if (result->IsUndefined()) { result = SWIGV8_ARRAY_NEW(); } #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) v8::Handle arr = v8::Handle::Cast(result); #else v8::Local arr = v8::Local::Cast(result); #endif arr->Set(arr->Length(), obj); SWIGV8_ESCAPE(arr); } swig-3.0.12/Lib/javascript/v8/std_vector.i0000664000175000017500000000511113042756442020172 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef bool value_type; typedef bool const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i self = args.Holder(); $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_SetPrivateData(self, result, SWIGTYPE_$jsmangledtype, SWIG_POINTER_OWN); SWIGV8_RETURN(self); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_veto_ctor: a vetoing ctor for abstract classes * - $jswrapper: name of wrapper * - $jsname: class name * ----------------------------------------------------------------------------- */ %fragment ("js_veto_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); SWIG_exception(SWIG_ERROR, "Class $jsname can not be instantiated"); fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_ctor_dispatcher: dispatcher for overloaded constructors * - $jswrapper: name of wrapper * - $jsname: class name * - $jsdispatchcases: part containing code for dispatching * ----------------------------------------------------------------------------- */ %fragment ("js_ctor_dispatcher", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); OverloadErrorHandler errorHandler; v8::Handle self; // switch all cases by means of series of if-returns. $jsdispatchcases // default: SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for construction of $jsmangledname"); fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_overloaded_ctor: template for wrapping a ctor. * - $jswrapper: wrapper of called ctor * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * - $jsargcount: number of arguments * - $jsmangledtype: mangled type of class * ----------------------------------------------------------------------------- */ %fragment("js_overloaded_ctor", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) { SWIGV8_HANDLESCOPE(); v8::Handle self = args.Holder(); $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_SetPrivateData(self, result, SWIGTYPE_$jsmangledtype, SWIG_POINTER_OWN); SWIGV8_RETURN(self); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_ctor_dispatch_case: template for a dispatch case for calling an overloaded ctor. * - $jsargcount: number of arguments of called ctor * - $jswrapper: wrapper of called ctor * * Note: a try-catch-like mechanism is used to switch cases * ----------------------------------------------------------------------------- */ %fragment ("js_ctor_dispatch_case", "templates") %{ if(args.Length() == $jsargcount) { errorHandler.err.Clear(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) self = $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { SWIGV8_ESCAPE(self); } #else $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { return; } #endif } %} /* ----------------------------------------------------------------------------- * js_dtor: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * ----------------------------------------------------------------------------- */ %fragment ("js_dtor", "templates") %{ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) static void $jswrapper(v8::Persistent< v8::Value > object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) static void $jswrapper(v8::Isolate *isolate, v8::Persistent *object, SWIGV8_Proxy *proxy) { #else static void $jswrapper(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SWIGV8_Proxy *proxy = data.GetParameter(); #endif if(proxy->swigCMemOwn && proxy->swigCObject) { #ifdef SWIGRUNTIME_DEBUG printf("Deleting wrapped instance: %s\n", proxy->info->name); #endif $jsfree proxy->swigCObject; } delete proxy; object.Clear(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #else object->Dispose(); #endif } %} /* ----------------------------------------------------------------------------- * js_dtoroverride: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * - ${destructor_action}: The custom destructor action to invoke. * ----------------------------------------------------------------------------- */ %fragment ("js_dtoroverride", "templates") %{ #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) static void $jswrapper(v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) static void $jswrapper(v8::Isolate *isolate, v8::Persistent object, void *parameter) { SWIGV8_Proxy *proxy = static_cast(parameter); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) static void $jswrapper(v8::Isolate *isolate, v8::Persistent< v8::Object> *object, SWIGV8_Proxy *proxy) { #else static void $jswrapper(const v8::WeakCallbackData &data) { v8::Local object = data.GetValue(); SWIGV8_Proxy *proxy = data.GetParameter(); #endif if(proxy->swigCMemOwn && proxy->swigCObject) { $jstype arg1 = ($jstype)proxy->swigCObject; ${destructor_action} } delete proxy; #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031710) object.Dispose(); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031900) object.Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x032100) object->Dispose(isolate); #elif (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < SWIGV8_SETWEAK_VERSION) object->Dispose(); #else object.Clear(); #endif } %} /* ----------------------------------------------------------------------------- * js_getter: template for getter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_getter", "templates") %{ static SwigV8ReturnValue $jswrapper(v8::Local property, const SwigV8PropertyCallbackInfo &info) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals $jscode SWIGV8_RETURN_INFO(jsresult, info); goto fail; fail: SWIGV8_RETURN_INFO(SWIGV8_UNDEFINED(), info); } %} /* ----------------------------------------------------------------------------- * js_setter: template for setter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_setter", "templates") %{ static void $jswrapper(v8::Local property, v8::Local value, const SwigV8PropertyCallbackInfoVoid &info) { SWIGV8_HANDLESCOPE(); $jslocals $jscode goto fail; fail: return; } %} /* ----------------------------------------------------------------------------- * js_function: template for function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_function", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals if(args.Length() != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_function_dispatcher: template for a function dispatcher for overloaded functions * - $jswrapper: wrapper function name * - $jsname: name of the wrapped function * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment("js_function_dispatcher", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; OverloadErrorHandler errorHandler; $jscode SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for function $jsname."); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_overloaded_function: template for a overloaded function * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_overloaded_function", "templates") %{ static SwigV8ReturnValue $jswrapper(const SwigV8Arguments &args, V8ErrorHandler &SWIGV8_ErrorHandler) { SWIGV8_HANDLESCOPE(); v8::Handle jsresult; $jslocals $jscode SWIGV8_RETURN(jsresult); goto fail; fail: SWIGV8_RETURN(SWIGV8_UNDEFINED()); } %} /* ----------------------------------------------------------------------------- * js_function_dispatch_case: template for a case used in the function dispatcher * - $jswrapper: wrapper function name * - $jsargcount: number of arguments of overloaded function * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatch_case", "templates") %{ if(args.Length() == $jsargcount) { errorHandler.err.Clear(); #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) jsresult = $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { SWIGV8_ESCAPE(jsresult); } #else $jswrapper(args, errorHandler); if(errorHandler.err.IsEmpty()) { return; } #endif } %} /* ----------------------------------------------------------------------------- * jsv8_declare_class_template: template for a class template declaration. * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment("jsv8_declare_class_template", "templates") %{ SWIGV8_ClientData $jsmangledname_clientData; %} /* ----------------------------------------------------------------------------- * jsv8_define_class_template: template for a class template definition. * - $jsmangledname: mangled class name * - $jsmangledtype: mangled class type * - $jsdtor: the dtor wrapper * ----------------------------------------------------------------------------- */ %fragment("jsv8_define_class_template", "templates") %{ /* Name: $jsmangledname, Type: $jsmangledtype, Dtor: $jsdtor */ v8::Handle $jsmangledname_class = SWIGV8_CreateClassTemplate("$jsmangledname"); SWIGV8_SET_CLASS_TEMPL($jsmangledname_clientData.class_templ, $jsmangledname_class); $jsmangledname_clientData.dtor = $jsdtor; if (SWIGTYPE_$jsmangledtype->clientdata == 0) { SWIGTYPE_$jsmangledtype->clientdata = &$jsmangledname_clientData; } %} /* ----------------------------------------------------------------------------- * jsv8_inherit: template for an class inherit statement. * - $jsmangledname: mangled class name * - $jsbaseclass: mangled name of the base class * ----------------------------------------------------------------------------- */ %fragment("jsv8_inherit", "templates") %{ if (SWIGTYPE_p$jsbaseclass->clientdata && !(static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ.IsEmpty())) { #if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903) $jsmangledname_class->Inherit(static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ); #else $jsmangledname_class->Inherit( v8::Local::New( v8::Isolate::GetCurrent(), static_cast(SWIGTYPE_p$jsbaseclass->clientdata)->class_templ) ); #endif #ifdef SWIGRUNTIME_DEBUG printf("Inheritance successful $jsmangledname $jsbaseclass\n"); #endif } else { #ifdef SWIGRUNTIME_DEBUG printf("Unable to inherit baseclass, it didn't exist $jsmangledname $jsbaseclass\n"); #endif } %} /* ----------------------------------------------------------------------------- * jsv8_create_class_instance: template for creating an class object. * - $jsname: class name * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment("jsv8_create_class_instance", "templates") %{ /* Class: $jsname ($jsmangledname) */ v8::Handle $jsmangledname_class_0 = SWIGV8_CreateClassTemplate("$jsname"); $jsmangledname_class_0->SetCallHandler($jsctor); $jsmangledname_class_0->Inherit($jsmangledname_class); $jsmangledname_class_0->SetHiddenPrototype(true); v8::Handle $jsmangledname_obj = $jsmangledname_class_0->GetFunction(); %} /* ----------------------------------------------------------------------------- * jsv8_register_class: template for a statement that registers a class in a parent namespace. * - $jsname: class name * - $jsmangledname: mangled class name * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_class", "templates") %{ $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); %} /* ----------------------------------------------------------------------------- * jsv8_create_namespace: template for a statement that creates a namespace object. * - $jsmangledname: mangled namespace name * ----------------------------------------------------------------------------- */ %fragment("jsv8_create_namespace", "templates") %{ v8::Handle $jsmangledname_obj = SWIGV8_OBJECT_NEW(); %} /* ----------------------------------------------------------------------------- * jsv8_register_namespace: template for a statement that registers a namespace in a parent namespace. * - $jsname: name of namespace * - $jsmangledname: mangled name of namespace * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_namespace", "templates") %{ $jsparent_obj->Set(SWIGV8_SYMBOL_NEW("$jsname"), $jsmangledname_obj); %} /* ----------------------------------------------------------------------------- * jsv8_register_member_function: template for a statement that registers a member function. * - $jsmangledname: mangled class name * - $jsname: name of the function * - $jswrapper: wrapper of the member function * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_member_function", "templates") %{ SWIGV8_AddMemberFunction($jsmangledname_class, "$jsname", $jswrapper); %} /* ----------------------------------------------------------------------------- * jsv8_register_member_variable: template for a statement that registers a member variable. * - $jsmangledname: mangled class name * - $jsname: name of the function * - $jsgetter: wrapper of the getter function * - $jssetter: wrapper of the setter function * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_member_variable", "templates") %{ SWIGV8_AddMemberVariable($jsmangledname_class, "$jsname", $jsgetter, $jssetter); %} /* ----------------------------------------------------------------------------- * jsv8_register_static_function: template for a statement that registers a static class function. * - $jsname: function name * - $jswrapper: wrapper of the function * - $jsparent: mangled name of parent namespace * * Note: this template is also used for global functions. * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_function", "templates") %{ SWIGV8_AddStaticFunction($jsparent_obj, "$jsname", $jswrapper); %} /* ----------------------------------------------------------------------------- * jsv8_register_static_variable: template for a statement that registers a static variable. * - $jsname: variable name * - $jsparent: mangled name of parent namespace * - $jsgetter: wrapper of the getter function * - $jssetter: wrapper of the setter function * * Note: this template is also used for global variables. * ----------------------------------------------------------------------------- */ %fragment("jsv8_register_static_variable", "templates") %{ SWIGV8_AddStaticVariable($jsparent_obj, "$jsname", $jsgetter, $jssetter); %} swig-3.0.12/Lib/javascript/v8/javascriptkw.swg0000664000175000017500000000176713042756442021113 0ustar williamwilliam#ifndef JAVASCRIPT_JAVASCRIPTKW_SWG_ #define JAVASCRIPT_JAVASCRIPTKW_SWG_ /* Warnings for Java keywords */ #define JAVASCRIPTKW(x) %keywordwarn("'" `x` "' is a javascript keyword, renaming to '_"`x`"'",rename="_%s") `x` /* Taken from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Reserved_Words */ JAVASCRIPTKW(break); JAVASCRIPTKW(case); JAVASCRIPTKW(catch); JAVASCRIPTKW(continue); JAVASCRIPTKW(default); JAVASCRIPTKW(delete); JAVASCRIPTKW(do); JAVASCRIPTKW(else); JAVASCRIPTKW(finally); JAVASCRIPTKW(for); JAVASCRIPTKW(function); JAVASCRIPTKW(if); JAVASCRIPTKW(in); JAVASCRIPTKW(instanceof); JAVASCRIPTKW(new); JAVASCRIPTKW(return); JAVASCRIPTKW(switch); JAVASCRIPTKW(this); JAVASCRIPTKW(throw); JAVASCRIPTKW(try); JAVASCRIPTKW(typeof); JAVASCRIPTKW(var); JAVASCRIPTKW(void); JAVASCRIPTKW(while); JAVASCRIPTKW(with); /* others bad names if any*/ // for example %namewarn("321:clone() is a javascript bad method name") *::clone(); #undef JAVASCRIPTKW #endif //JAVASCRIPT_JAVASCRIPTKW_SWG_ swig-3.0.12/Lib/javascript/v8/ccomplex.i0000664000175000017500000000140213042756442017627 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-3.0.12/Lib/javascript/v8/javascripttypemaps.swg0000664000175000017500000000244313042756442022324 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Javascript * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* Include fundamental fragemt definitions */ %include /* Look for user fragments file. */ %include /* Javascript fragments for fundamental types */ %include /* Javascript fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ /* Javascript types */ #define SWIG_Object v8::Handle #define VOID_Object SWIGV8_UNDEFINED() /* Overload of the output/constant/exception/dirout handling */ /* append output */ #define SWIG_AppendOutput(result, obj) SWIGV8_AppendOutput(result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_V8_Raise(type) /* Include the unified typemap library */ %include swig-3.0.12/Lib/javascript/v8/std_common.i0000664000175000017500000000014613042756442020163 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-3.0.12/Lib/javascript/v8/std_except.i0000664000175000017500000000004313042756442020157 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/v8/complex.i0000664000175000017500000000012013042756442017460 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-3.0.12/Lib/javascript/v8/typemaps.i0000664000175000017500000001047613042756442017672 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-3.0.12/Lib/javascript/v8/javascriptstrings.swg0000664000175000017500000000333113042756442022150 0ustar williamwilliam /* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize", "header", fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_AsCharPtrAndSize(v8::Handle valRef, char** cptr, size_t* psize, int *alloc) { if(valRef->IsString()) { v8::Handle js_str = valRef->ToString(); size_t len = js_str->Utf8Length() + 1; char* cstr = new char[len]; js_str->WriteUtf8(cstr, len); if(alloc) *alloc = SWIG_NEWOBJ; if(psize) *psize = len; if(cptr) *cptr = cstr; return SWIG_OK; } else { if(valRef->IsObject()) { v8::Handle obj = valRef->ToObject(); // try if the object is a wrapped char[] swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } return SWIG_TypeError; } else { return SWIG_TypeError; } } } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE v8::Handle SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { // TODO: handle extra long strings return SWIGV8_UNDEFINED(); } else { v8::Handle js_str = SWIGV8_STRING_NEW2(carray, size); return js_str; } } else { return SWIGV8_UNDEFINED(); } } } swig-3.0.12/Lib/javascript/v8/javascriptinit.swg0000664000175000017500000000666613042756442021440 0ustar williamwilliam%insert(init) %{ #include SWIGRUNTIME void SWIG_V8_SetModule(void *, swig_module_info *swig_module) { v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); v8::Local mod = SWIGV8_EXTERNAL_NEW(swig_module); assert(!mod.IsEmpty()); global_obj->SetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data"), mod); } SWIGRUNTIME swig_module_info * SWIG_V8_GetModule(void *) { v8::Local global_obj = SWIGV8_CURRENT_CONTEXT()->Global(); v8::Local moduleinfo = global_obj->GetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data")); if (moduleinfo.IsEmpty()) { // It's not yet loaded return 0; } v8::Local moduleinfo_extern = v8::Local::Cast(moduleinfo); if (moduleinfo_extern.IsEmpty()) { // Something's not right return 0; } void *ptr = moduleinfo_extern->Value(); assert(ptr); swig_module_info *retptr = static_cast(ptr); assert(retptr); return retptr; } #define SWIG_GetModule(clientdata) SWIG_V8_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_V8_SetModule(clientdata, pointer) %} %insert(init) "swiginit.swg" // Open the initializer function definition here %fragment ("js_initializer_define", "templates") %{ #define SWIGV8_INIT $jsname_initialize %} %insert(init) %{ // Note: 'extern "C"'' disables name mangling which makes it easier to load the symbol manually // TODO: is it ok to do that? extern "C" #if (NODE_MODULE_VERSION < 0x000C) void SWIGV8_INIT (v8::Handle exports) #else void SWIGV8_INIT (v8::Handle exports, v8::Handle /*module*/) #endif { SWIG_InitializeModule(static_cast(&exports)); SWIGV8_HANDLESCOPE(); v8::Handle exports_obj = exports; %} /* ----------------------------------------------------------------------------- * js_initializer: template for the module initializer function * - $jsname: module name * - $jsv8nspaces: part with code creating namespace objects * - $jsv8classtemplates: part with code creating class templates * - $jsv8wrappers: part with code that registers wrapper functions * - $jsv8inheritance: part with inherit statements * - $jsv8classinstances: part with code creating class objects * - $jsv8staticwrappers: part with code adding static functions to class objects * - $jsv8registerclasses: part with code that registers class objects in namespaces * - $jsv8registernspaces: part with code that registers namespaces in parent namespaces * ----------------------------------------------------------------------------- */ %fragment("js_initializer", "templates") %{ // a class template for creating proxies of undefined types SWIGV8_SET_CLASS_TEMPL(SWIGV8_SWIGTYPE_Proxy_class_templ, SWIGV8_CreateClassTemplate("SwigProxy")); /* create objects for namespaces */ $jsv8nspaces /* create class templates */ $jsv8classtemplates /* register wrapper functions */ $jsv8wrappers /* setup inheritances */ $jsv8inheritance /* class instances */ $jsv8classinstances /* add static class functions and variables */ $jsv8staticwrappers /* register classes */ $jsv8registerclasses /* create and register namespace objects */ $jsv8registernspaces } #if defined(BUILDING_NODE_EXTENSION) NODE_MODULE($jsname, $jsname_initialize) #endif %} swig-3.0.12/Lib/javascript/v8/std_pair.i0000664000175000017500000000126113042756442017625 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/javascript/v8/stl.i0000664000175000017500000000044313042756442016623 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/javascript/v8/exception.i0000664000175000017500000000004213042756442020012 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/v8/javascriptfragments.swg0000664000175000017500000000105713042756442022450 0ustar williamwilliam/* Create a file with this name, 'javascriptfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-3.0.12/Lib/javascript/v8/cdata.i0000664000175000017500000000003613042756442017073 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/v8/javascriptcomplex.swg0000664000175000017500000000640013042756442022126 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(double)) { SWIGINTERNINLINE v8::Handle SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) { SWIGV8_HANDLESCOPE_ESC(); v8::Local vals = SWIGV8_ARRAY_NEW(2); vals->Set(0, SWIG_From(double)(Real(c))); vals->Set(1, SWIG_From(double)(Imag(c))); SWIGV8_ESCAPE(vals); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { v8::Handle array = v8::Handle::Cast(o); if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; res = SWIG_AsVal(double)(array->Get(0), &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(array->Get(1), &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if (val) *val = Constructor(re, im); return SWIG_OK; } else if(o->IsNumber()){ double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal_dec(Type) (v8::Handle o, Type* val) { SWIGV8_HANDLESCOPE(); if (o->IsArray()) { v8::Handle array = v8::Handle::Cast(o); if(array->Length() != 2) SWIG_Error(SWIG_TypeError, "Illegal argument for complex: must be array[2]."); double re, im; int res; res = SWIG_AsVal(double)(array->Get(0), &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(array->Get(1), &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else if(o->IsNumber()){ float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-3.0.12/Lib/javascript/v8/std_string.i0000664000175000017500000000004313042756442020175 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/v8/std_map.i0000664000175000017500000000444113042756442017452 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/javascript/v8/arrays_javascript.i0000664000175000017500000000626313042756442021556 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_javascript.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from JavaScript and vice versa. The JavaScript array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * extern int FiddleSticks[3]; * %} * * Use from JavaScript like this: * * var fs = [10, 11, 12]; * example.FiddleSticks = fs; * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ %fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} %typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if ($input->IsArray()) { // Convert into Array array = v8::Local::Cast($input); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = array->Get(i); // Get primitive value from JSObject res = SWIG_AsVal(int)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) int[], int[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) { length = $1_dim0; v8::Local array = v8::Array::New(length); for (i = 0; i < length; i++) { array->Set(i, SWIG_From(int)($1[i])); } $result = array; } %typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] (int length = 0, v8::Local array, v8::Local jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if ($input->IsArray()) { // Convert into Array array = v8::Local::Cast($input); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = array->Get(i); // Get primitive value from JSObject res = SWIG_AsVal(double)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) double[], double[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) { length = $1_dim0; v8::Local array = v8::Array::New(length); for (i = 0; i < length; i++) { array->Set(i, SWIG_From(double)($1[i])); } $result = array; } swig-3.0.12/Lib/javascript/jsc/0000775000175000017500000000000013042756442016070 5ustar williamwilliamswig-3.0.12/Lib/javascript/jsc/javascriptprimtypes.swg0000664000175000017500000001032413042756442022735 0ustar williamwilliam/* ------------------------------------------------------------ * Primitive Types * ------------------------------------------------------------ */ /* boolean */ %fragment(SWIG_From_frag(bool),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(bool)(bool value) { return JSValueMakeBoolean(context, value); } } %fragment(SWIG_AsVal_frag(bool),"header", fragment=SWIG_AsVal_frag(long)) { SWIGINTERN int SWIG_AsVal_dec(bool)(JSValueRef obj, bool *val) { if(!JSValueIsBoolean(context, obj)) { return SWIG_ERROR; } if (val) *val = JSValueToBoolean(context, obj); return SWIG_OK; } } /* int */ %fragment(SWIG_From_frag(int),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(int)(int value) { return JSValueMakeNumber(context, value); } } /* long */ %fragment(SWIG_From_frag(long),"header") { SWIGINTERNINLINE JSValueRef SWIG_From_dec(long)(long value) { return JSValueMakeNumber(context, value); } } %fragment(SWIG_AsVal_frag(long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(long)(JSValueRef obj, long* val) { if (!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = (long) JSValueToNumber(context, obj, NULL); return SWIG_OK; } } /* unsigned long */ %fragment(SWIG_From_frag(unsigned long),"header", fragment=SWIG_From_frag(long)) { SWIGINTERNINLINE JSValueRef SWIG_From_dec(unsigned long)(unsigned long value) { return (value > LONG_MAX) ? JSValueMakeNumber(context, value) : JSValueMakeNumber(context, %numeric_cast(value,long)); } } %fragment(SWIG_AsVal_frag(unsigned long),"header", fragment="SWIG_CanCastAsInteger") { SWIGINTERN int SWIG_AsVal_dec(unsigned long)(JSValueRef obj, unsigned long *val) { long longVal; if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } longVal = (long) JSValueToNumber(context, obj, NULL); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } } /* long long */ // Note: these are copied from 'long' and probably need fixing %fragment(SWIG_From_frag(long long),"header", fragment=SWIG_From_frag(long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE JSValueRef SWIG_From_dec(long long)(long long value) { return JSValueMakeNumber(context, value); } %#endif } %fragment(SWIG_AsVal_frag(long long),"header", fragment=SWIG_AsVal_frag(long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(long long)(JSValueRef obj, long long* val) { if (!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = (long long) JSValueToNumber(context, obj, NULL); return SWIG_OK; } %#endif } /* unsigned long long */ // Note: these are copied from 'unsigned long' and probably need fixing %fragment(SWIG_From_frag(unsigned long long),"header", fragment=SWIG_From_frag(long long), fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN JSValueRef SWIG_From_dec(unsigned long long)(unsigned long long value) { return (value > LONG_MAX) ? JSValueMakeNumber(context, value) : JSValueMakeNumber(context, %numeric_cast(value,long)); } %#endif } %fragment(SWIG_AsVal_frag(unsigned long long),"header", fragment=SWIG_AsVal_frag(unsigned long), fragment="SWIG_CanCastAsInteger", fragment="SWIG_LongLongAvailable") { %#ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_dec(unsigned long long)(JSValueRef obj, unsigned long long *val) { long long longVal; if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } longVal = (unsigned long long) JSValueToNumber(context, obj, NULL); if(longVal < 0) { return SWIG_OverflowError; } if(val) *val = longVal; return SWIG_OK; } %#endif } /* double */ %fragment(SWIG_From_frag(double),"header") { SWIGINTERN JSValueRef SWIG_From_dec(double) (double val) { return JSValueMakeNumber(context, val); } } %fragment(SWIG_AsVal_frag(double),"header") { SWIGINTERN int SWIG_AsVal_dec(double)(JSValueRef obj, double *val) { if(!JSValueIsNumber(context, obj)) { return SWIG_TypeError; } if(val) *val = JSValueToNumber(context, obj, NULL); return SWIG_OK; } } swig-3.0.12/Lib/javascript/jsc/std_complex.i0000664000175000017500000000073213042756442020565 0ustar williamwilliam/* * STD C++ complex typemaps */ %include %{ #include %} /* defining the complex as/from converters */ %swig_cplxdbl_convn(std::complex, std::complex, std::real, std::imag) %swig_cplxflt_convn(std::complex, std::complex, std::real, std::imag) /* defining the typemaps */ %typemaps_primitive(%checkcode(CPLXDBL), std::complex); %typemaps_primitive(%checkcode(CPLXFLT), std::complex); swig-3.0.12/Lib/javascript/jsc/std_deque.i0000664000175000017500000000003413042756442020214 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/jsc/javascripthelpers.swg0000664000175000017500000000451113042756442022344 0ustar williamwilliam%insert(wrapper) %{ SWIGINTERN bool JS_registerClass(JSGlobalContextRef context, JSObjectRef parentObject, const char* className, JSClassDefinition* definition) { JSStringRef js_className = JSStringCreateWithUTF8CString(className); JSObjectRef classObject = JSObjectMake(context, JSClassCreate(definition), NULL); JSObjectSetProperty(context, parentObject, js_className, classObject, kJSPropertyAttributeNone, NULL); JSStringRelease(js_className); return true; } SWIGINTERN bool JS_registerNamespace(JSGlobalContextRef context, JSObjectRef namespaceObj, JSObjectRef parentNamespace, const char* name) { JSStringRef js_name = JSStringCreateWithUTF8CString(name); JSObjectSetProperty(context, parentNamespace, js_name, namespaceObj, kJSPropertyAttributeNone, NULL); JSStringRelease(js_name); return true; } SWIGINTERN bool JS_registerFunction(JSGlobalContextRef context, JSObjectRef object, const char* functionName, JSObjectCallAsFunctionCallback callback) { JSStringRef js_functionName = JSStringCreateWithUTF8CString(functionName); JSObjectSetProperty(context, object, js_functionName, JSObjectMakeFunctionWithCallback(context, js_functionName, callback), kJSPropertyAttributeNone, NULL); JSStringRelease(js_functionName); return true; } SWIGINTERN bool JS_veto_set_variable(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { char buffer[256]; char msg[512]; int res; JSStringGetUTF8CString(propertyName, buffer, 256); res = sprintf(msg, "Tried to write read-only variable: %s.", buffer); if(res<0) { SWIG_exception(SWIG_ERROR, "Tried to write read-only variable."); } else { SWIG_exception(SWIG_ERROR, msg); } fail: return false; } SWIGINTERN JSValueRef JS_CharPtrToJSValue(JSContextRef context, char* cstr) { JSValueRef val; JSStringRef jsstring = JSStringCreateWithUTF8CString((char*) cstr); val = JSValueMakeString(context, jsstring); JSStringRelease(jsstring); return val; } %} swig-3.0.12/Lib/javascript/jsc/javascript.swg0000664000175000017500000000066713042756442020771 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascript.swg * * Javascript typemaps * ----------------------------------------------------------------------------- */ %include %include %include %include %include %include %include swig-3.0.12/Lib/javascript/jsc/javascriptruntime.swg0000664000175000017500000000105513042756442022365 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javascriptruntime.swg * * Javascript support code * ----------------------------------------------------------------------------- */ %insert(runtime) %{ #include #include #include #include #include #include %} %insert(runtime) "swigrun.swg"; /* SWIG API */ %insert(runtime) "swigerrors.swg"; /* SWIG errors */ %insert(runtime) "javascriptrun.swg"; /* SWIG errors */ swig-3.0.12/Lib/javascript/jsc/javascriptrun.swg0000664000175000017500000002377213042756442021520 0ustar williamwilliam/* ---------------------------------------------------------------------------- * Errors and exceptions * * ---------------------------------------------------------------------------*/ #define SWIG_Error(code, msg) SWIG_JSC_exception(context, exception, code, msg) #define SWIG_exception(code, msg) do { SWIG_JSC_exception(context, exception, code, msg); SWIG_fail; } while (0) #define SWIG_fail goto fail SWIGRUNTIME void SWIG_Javascript_Raise(JSContextRef context, JSValueRef *exception, const char* type) { JSStringRef message = JSStringCreateWithUTF8CString(type); JSValueRef error_arguments[1]; JSObjectRef exception_object; JSValueRef exception_value; exception_value = JSValueMakeString(context, message); /* Converting the result to an object will let JavascriptCore add "sourceURL" (file) and "line" (number) and "message" to the exception, instead of just returning a raw string. This is extremely important for debugging your errors. Using JSObjectMakeError is better than JSValueToObject because the latter only populates "sourceURL" and "line", but not "message" or any others I don't know about. */ error_arguments[0] = exception_value; exception_object = JSObjectMakeError(context, 1, error_arguments, NULL); /* Return the exception_object */ *exception = exception_object; JSStringRelease(message); } SWIGRUNTIME void SWIG_JSC_exception(JSContextRef context, JSValueRef *exception, int code, const char* msg) { SWIG_Javascript_Raise(context, exception, msg); } /* ---------------------------------------------------------------------------- * The parent class of all Proxies * * ---------------------------------------------------------------------------*/ typedef struct { bool swigCMemOwn; void *swigCObject; swig_type_info *info; } SwigPrivData; SWIGRUNTIME JSValueRef _wrap_SwigObject_disown(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData *) JSObjectGetPrivate(obj); cdata->swigCMemOwn = false; jsresult = JSValueMakeUndefined(context); return jsresult; } SWIGRUNTIME JSValueRef _wrap_SwigObject_getCPtr(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; long result; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData*) JSObjectGetPrivate(obj); result = (long) cdata->swigCObject; jsresult = JSValueMakeNumber(context, result); return jsresult; } SWIGRUNTIME JSValueRef _wrap_SwigObject_equals(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { JSValueRef jsresult; bool result; JSObjectRef obj = JSValueToObject(context, thisObject, NULL); SwigPrivData *cdata = (SwigPrivData*) JSObjectGetPrivate(obj); JSObjectRef obj2 = JSValueToObject(context, argv[0], NULL); SwigPrivData *cdata2 = (SwigPrivData*) JSObjectGetPrivate(obj2); result = (cdata->swigCObject == cdata2->swigCObject); jsresult = JSValueMakeBoolean(context, result); return jsresult; } SWIGRUNTIME JSStaticValue _SwigObject_values[] = { { 0, 0, 0, 0 } }; SWIGRUNTIME JSStaticFunction _SwigObject_functions[] = { { "disown",_wrap_SwigObject_disown, kJSPropertyAttributeNone }, { "equals",_wrap_SwigObject_equals, kJSPropertyAttributeNone }, { "getCPtr",_wrap_SwigObject_getCPtr, kJSPropertyAttributeNone }, { 0, 0, 0 } }; SWIGRUNTIME JSClassDefinition _SwigObject_objectDefinition; SWIGRUNTIME JSClassRef _SwigObject_classRef; SWIGRUNTIME int SWIG_JSC_ConvertInstancePtr(JSContextRef context, JSObjectRef objRef, void** ptr, swig_type_info *info, int flags) { SwigPrivData *cdata; cdata = (SwigPrivData *) JSObjectGetPrivate(objRef); if(cdata == NULL) { return SWIG_ERROR; } if(cdata->info != info) { bool type_valid = false; swig_cast_info *t = info->cast; while(t != NULL) { if(t->type == cdata->info) { type_valid = true; break; } t = t->next; } if(!type_valid) { return SWIG_TypeError; } } *ptr = cdata->swigCObject; if(flags & SWIG_POINTER_DISOWN) { cdata->swigCMemOwn = false; } return SWIG_OK; } SWIGRUNTIME int SWIG_JSC_ConvertPtr(JSContextRef context, JSValueRef valRef, void** ptr, swig_type_info *info, int flags) { JSObjectRef objRef; /* special case: JavaScript null => C NULL pointer */ if(JSValueIsNull(context, valRef)) { *ptr=0; return SWIG_OK; } if(!JSValueIsObject(context, valRef)) { return SWIG_TypeError; } objRef = JSValueToObject(context, valRef, NULL); if(objRef == NULL) { return SWIG_ERROR; } return SWIG_JSC_ConvertInstancePtr(context, objRef, ptr, info, flags); } SWIGRUNTIME JSObjectRef SWIG_JSC_NewPointerObj(JSContextRef context, void *ptr, swig_type_info *info, int flags) { JSClassRef classRef; JSObjectRef result; SwigPrivData *cdata; if (ptr == NULL) { // HACK: it is not possible to use JSValueToObject (causing seg-fault) // This static cast turned out to be a workaround // In future, we should change the interface of this method // to return JSValueRef instead of JSObjectRef. return (JSObjectRef) JSValueMakeNull(context); } if(info->clientdata == NULL) { classRef = _SwigObject_classRef; } else { classRef = (JSClassRef) info->clientdata; } result = JSObjectMake(context, classRef, NULL); cdata = (SwigPrivData*) malloc(sizeof(SwigPrivData)); cdata->swigCObject = ptr; cdata->swigCMemOwn = (flags & SWIG_POINTER_OWN) ? 1 : 0; cdata->info = info; JSObjectSetPrivate(result, cdata); return result; } #define SWIG_ConvertPtr(obj, ptr, info, flags) SWIG_JSC_ConvertPtr(context, obj, ptr, info, flags) #define SWIG_NewPointerObj(ptr, info, flags) SWIG_JSC_NewPointerObj(context, ptr, info, flags) #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_JSC_ConvertInstancePtr(context, obj, pptr, type, flags) #define SWIG_NewInstanceObj(thisvalue, type, flags) SWIG_JSC_NewPointerObj(context, thisvalue, type, flags) #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_JSC_ConvertPtr(context, obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_JSC_NewPointerObj(context, ptr, type, 0) /* ---------------------------------------------------------------------------- * A class for packed data * * ---------------------------------------------------------------------------*/ typedef struct { void *data; size_t size; swig_type_info *type; } SwigPackedData; SWIGRUNTIME JSStaticValue _SwigPackedData_values[] = { { 0, 0, 0, 0 } }; SWIGRUNTIME JSStaticFunction _SwigPackedData_functions[] = { { 0, 0, 0 } }; SWIGRUNTIME JSClassDefinition _SwigPackedData_objectDefinition; SWIGRUNTIME JSClassRef _SwigPackedData_classRef; SWIGRUNTIMEINLINE int SwigJSCPacked_Check(JSContextRef context, JSValueRef valRef) { return JSValueIsObjectOfClass(context, valRef, _SwigPackedData_classRef); } SWIGRUNTIME swig_type_info* SwigJSCPacked_UnpackData(JSContextRef context, JSValueRef valRef, void *ptr, size_t size) { if (SwigJSCPacked_Check(context, valRef)) { JSObjectRef objRef = JSValueToObject(context, valRef, NULL); SwigPackedData *sobj = (SwigPackedData *) JSObjectGetPrivate(objRef); if (sobj->size != size) return 0; memcpy(ptr, sobj->data, size); return sobj->type; } else { return 0; } } SWIGRUNTIME int SWIG_JSC_ConvertPacked(JSContextRef context, JSValueRef valRef, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigJSCPacked_UnpackData(context, valRef, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } SWIGRUNTIME JSValueRef SWIG_JSC_NewPackedObj(JSContextRef context, void *data, size_t size, swig_type_info *type) { JSClassRef classRef = _SwigObject_classRef; JSObjectRef result = JSObjectMake(context, classRef, NULL); SwigPackedData* cdata = (SwigPackedData*) malloc(sizeof(SwigPackedData)); cdata->data = data; cdata->size = size; cdata->type = type; JSObjectSetPrivate(result, cdata); return result; } /* SwigPackedData wrappers */ SWIGRUNTIME void _wrap_SwigPackedData_delete(JSObjectRef obj) { SwigPackedData* cdata = (SwigPackedData*) JSObjectGetPrivate(obj); if (cdata) { free(cdata->data); } } /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_JSC_ConvertPacked(context, obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_JSC_NewPackedObj(context, ptr, sz, type) /* --------------------------------------------------------------------------- * Support for IN/OUTPUT typemaps (see Lib/typemaps/inoutlist.swg) * * ---------------------------------------------------------------------------*/ SWIGRUNTIME unsigned int SWIGJSC_ArrayLength(JSContextRef context, JSObjectRef arr) { static JSStringRef LENGTH = 0; JSValueRef exception = NULL; JSValueRef js_length; double length; if (LENGTH == 0) { LENGTH = JSStringCreateWithUTF8CString("length"); } js_length = JSObjectGetProperty(context, arr, LENGTH, &exception); if (exception == 0 && JSValueIsNumber(context, js_length)) { length = JSValueToNumber(context, js_length, 0); return (unsigned int) length; } else { return 0; } } SWIGRUNTIME JSValueRef SWIGJSC_AppendOutput(JSContextRef context, JSValueRef value, JSValueRef obj) { JSObjectRef arr; unsigned int length; if (JSValueIsUndefined(context, value)) { arr = JSObjectMakeArray(context, 0, 0, 0); } else { arr = JSValueToObject(context, value, 0); } length = SWIGJSC_ArrayLength(context, arr); JSObjectSetPropertyAtIndex(context, arr, length, obj, 0); return arr; } swig-3.0.12/Lib/javascript/jsc/std_vector.i0000664000175000017500000000511113042756442020414 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef bool value_type; typedef bool const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && iswigCMemOwn) { free (($jstype)t->swigCObject); } JSObjectSetPrivate(thisObject, NULL); free(t); } } %} /* ----------------------------------------------------------------------------- * js_dtor: template for a destructor wrapper * - $jsmangledname: mangled class name * - $jstype: class type * - ${destructor_action}: The custom destructor action to invoke. * ----------------------------------------------------------------------------- */ %fragment ("js_dtoroverride", "templates") %{ static void $jswrapper(JSObjectRef thisObject) { SwigPrivData* t = (SwigPrivData*) JSObjectGetPrivate(thisObject); if(t) { if (t->swigCMemOwn) { $jstype arg1 = ($jstype)t->swigCObject; ${destructor_action} } /* remove the private data to make sure that it isn't accessed elsewhere */ JSObjectSetPrivate(thisObject, NULL); free(t); } } %} /* ----------------------------------------------------------------------------- * js_getter: template for getter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_getter", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception) { $jslocals JSValueRef jsresult; $jscode return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_setter: template for setter function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_setter", "templates") %{ static bool $jswrapper(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef value, JSValueRef* exception) { $jslocals $jscode return true; goto fail; fail: return false; } %} /* ----------------------------------------------------------------------------- * js_function: template for function wrappers * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { $jslocals JSValueRef jsresult; if(argc != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_function_dispatcher: template for a function dispatcher for overloaded functions * - $jswrapper: wrapper function name * - $jsname: name of the wrapped function * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatcher", "templates") %{ static JSValueRef $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception) { $jslocals JSValueRef jsresult; int res; $jscode SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for function $jsname."); return jsresult; goto fail; fail: return JSValueMakeUndefined(context); } %} /* ----------------------------------------------------------------------------- * js_overloaded_function: template for a overloaded function * - $jswrapper: wrapper function name * - $jslocals: locals part of wrapper * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_overloaded_function", "templates") %{ static int $jswrapper(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, const JSValueRef argv[], JSValueRef* exception, JSValueRef* p_result) { $jslocals JSValueRef jsresult; if(argc != $jsargcount) SWIG_exception_fail(SWIG_ERROR, "Illegal number of arguments for $jswrapper."); $jscode *p_result = jsresult; return SWIG_OK; goto fail; fail: return SWIG_TypeError; } %} /* ----------------------------------------------------------------------------- * js_function_dispatch_case: template for a case used in the function dispatcher * - $jswrapper: wrapper function name * - $jsargcount: number of arguments of overloaded function * - $jscode: code part of wrapper * ----------------------------------------------------------------------------- */ %fragment ("js_function_dispatch_case", "templates") %{ if(argc == $jsargcount) { res = $jswrapper(context, function, thisObject, argc, argv, exception, &jsresult); if(res == SWIG_OK) { *exception = 0; return jsresult; } } %} /* ----------------------------------------------------------------------------- * jsc_variable_declaration: template for a variable table entry * - $jsname: name of the variable * - $jsgetter: wrapper of getter function * - $jssetter: wrapper of setter function * ----------------------------------------------------------------------------- */ %fragment ("jsc_variable_declaration", "templates") %{ {"$jsname", $jsgetter, $jssetter, kJSPropertyAttributeNone}, %} /* ----------------------------------------------------------------------------- * jsc_function_declaration: template for a function table entry * - $jsname: name of the variable * - $jswrapper: wrapper function * ----------------------------------------------------------------------------- */ %fragment ("jsc_function_declaration", "templates") %{ {"$jsname", $jswrapper, kJSPropertyAttributeNone}, %} /* ----------------------------------------------------------------------------- * jsc_classtemplate_declaration: template for a namespace declaration * - $jsmangledname: mangled class name * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_declaration", "templates") %{ static JSClassDefinition $jsmangledname_classDefinition; static JSClassDefinition $jsmangledname_objectDefinition; static JSClassRef $jsmangledname_classRef; %} /* ----------------------------------------------------------------------------- * jsc_class_tables: template for a namespace declaration * - $jsmangledname: mangled class name * - $jsstaticclassvariables: list of static variable entries * - $jsstaticclassfunctions: list of static function entries * - $jsclassvariables: list of member variable entries * - $jsclassfunctions: list of member function entries * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_tables", "templates") %{ static JSStaticValue $jsmangledname_staticValues[] = { $jsstaticclassvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsmangledname_staticFunctions[] = { $jsstaticclassfunctions { 0, 0, 0 } }; static JSStaticValue $jsmangledname_values[] = { $jsclassvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsmangledname_functions[] = { $jsclassfunctions { 0, 0, 0 } }; %} /* ----------------------------------------------------------------------------- * jsc_define_class_template: template for defining a class template * - $jsmangledname: mangled class name * - $jsmangledtype: mangled class type * - $jsctor: wrapper of ctor * - $jsbaseclass: mangled name of base class * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_definition", "templates") %{ $jsmangledname_classDefinition.staticFunctions = $jsmangledname_staticFunctions; $jsmangledname_classDefinition.staticValues = $jsmangledname_staticValues; $jsmangledname_classDefinition.callAsConstructor = $jsctor; $jsmangledname_objectDefinition.finalize = $jsdtor; $jsmangledname_objectDefinition.staticValues = $jsmangledname_values; $jsmangledname_objectDefinition.staticFunctions = $jsmangledname_functions; $jsclass_inheritance $jsmangledname_classRef = JSClassCreate(&$jsmangledname_objectDefinition); SWIGTYPE_$jsmangledtype->clientdata = $jsmangledname_classRef; %} %fragment ("jsc_class_inherit", templates) %{ if (SWIGTYPE_p$jsbaseclassmangled != NULL) { $jsmangledname_objectDefinition.parentClass = (JSClassRef) SWIGTYPE_p$jsbaseclassmangled->clientdata; } %} %fragment ("jsc_class_noinherit", templates) %{ $jsmangledname_objectDefinition.parentClass = _SwigObject_classRef; %} /* ----------------------------------------------------------------------------- * jsc_register_class: template for registration of a class * - $jsname: class name * - $jsmangledname: mangled class name * - $jsnspace: mangled name of namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_class_registration", "templates") %{ JS_registerClass(context, $jsnspace_object, "$jsname", &$jsmangledname_classDefinition); %} /* ----------------------------------------------------------------------------- * jsc_nspace_declaration: template for a namespace declaration * - $jsnspace: mangled name of the namespace * - $jsglobalvariables: list of variable entries * - $jsglobalfunctions: list if fuction entries * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_declaration", "templates") %{ static JSStaticValue $jsnspace_values[] = { $jsglobalvariables { 0, 0, 0, 0 } }; static JSStaticFunction $jsnspace_functions[] = { $jsglobalfunctions { 0, 0, 0 } }; static JSClassDefinition $jsnspace_classDefinition; static JSObjectRef $jsmangledname_object; %} /* ----------------------------------------------------------------------------- * jsc_nspace_definition: template for definition of a namespace object * - $jsmangledname: mangled name of namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_definition", "templates") %{ $jsmangledname_classDefinition.staticFunctions = $jsmangledname_functions; $jsmangledname_classDefinition.staticValues = $jsmangledname_values; $jsmangledname_object = JSObjectMake(context, JSClassCreate(&$jsmangledname_classDefinition), NULL); %} /* ----------------------------------------------------------------------------- * jsc_nspace_registration: template for registration of a namespace object * - $jsname: name of namespace * - $jsmangledname: mangled name of namespace * - $jsparent: mangled name of parent namespace * ----------------------------------------------------------------------------- */ %fragment ("jsc_nspace_registration", "templates") %{ JS_registerNamespace(context, $jsmangledname_object, $jsparent_object, "$jsname"); %} swig-3.0.12/Lib/javascript/jsc/javascriptkw.swg0000664000175000017500000000176713042756442021335 0ustar williamwilliam#ifndef JAVASCRIPT_JAVASCRIPTKW_SWG_ #define JAVASCRIPT_JAVASCRIPTKW_SWG_ /* Warnings for Java keywords */ #define JAVASCRIPTKW(x) %keywordwarn("'" `x` "' is a javascript keyword, renaming to '_"`x`"'",rename="_%s") `x` /* Taken from https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Reserved_Words */ JAVASCRIPTKW(break); JAVASCRIPTKW(case); JAVASCRIPTKW(catch); JAVASCRIPTKW(continue); JAVASCRIPTKW(default); JAVASCRIPTKW(delete); JAVASCRIPTKW(do); JAVASCRIPTKW(else); JAVASCRIPTKW(finally); JAVASCRIPTKW(for); JAVASCRIPTKW(function); JAVASCRIPTKW(if); JAVASCRIPTKW(in); JAVASCRIPTKW(instanceof); JAVASCRIPTKW(new); JAVASCRIPTKW(return); JAVASCRIPTKW(switch); JAVASCRIPTKW(this); JAVASCRIPTKW(throw); JAVASCRIPTKW(try); JAVASCRIPTKW(typeof); JAVASCRIPTKW(var); JAVASCRIPTKW(void); JAVASCRIPTKW(while); JAVASCRIPTKW(with); /* others bad names if any*/ // for example %namewarn("321:clone() is a javascript bad method name") *::clone(); #undef JAVASCRIPTKW #endif //JAVASCRIPT_JAVASCRIPTKW_SWG_ swig-3.0.12/Lib/javascript/jsc/ccomplex.i0000664000175000017500000000140313042756442020052 0ustar williamwilliam/* ----------------------------------------------------------------------------- * ccomplex.i * * C complex typemaps * ISO C99: 7.3 Complex arithmetic * ----------------------------------------------------------------------------- */ %include %{ #include %} /* C complex constructor */ #define CCplxConst(r, i) ((r) + I*(i)) %swig_cplxflt_convn(float complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(double complex, CCplxConst, creal, cimag); %swig_cplxdbl_convn(complex, CCplxConst, creal, cimag); /* declaring the typemaps */ %typemaps_primitive(SWIG_TYPECHECK_CPLXFLT, float complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, double complex); %typemaps_primitive(SWIG_TYPECHECK_CPLXDBL, complex); swig-3.0.12/Lib/javascript/jsc/javascripttypemaps.swg0000664000175000017500000000367413042756442022555 0ustar williamwilliam/* ------------------------------------------------------------ * Typemap specializations for Javascript * ------------------------------------------------------------ */ /* ------------------------------------------------------------ * Fragment section * ------------------------------------------------------------ */ /* These macros are necessary to provide an extra parameter to SWIG_AsVal_dec functions (JSContextRef context). They must be defined before including `typemaps/fragments.swg` */ #define SWIG_FROM_DECL_ARGS SWIG_JSC_FROM_DECL_ARGS #define SWIG_FROM_CALL_ARGS SWIG_JSC_FROM_CALL_ARGS #define SWIG_AS_DECL_ARGS SWIG_JSC_AS_DECL_ARGS #define SWIG_AS_CALL_ARGS SWIG_JSC_AS_CALL_ARGS /* Include fundamental fragemt definitions */ %include /* Look for user fragments file. */ %include /* Javascript fragments for fundamental types */ %include /* Javascript fragments for char* strings */ %include /* ------------------------------------------------------------ * Unified typemap section * ------------------------------------------------------------ */ #define SWIG_Object JSValueRef #define VOID_Object JSValueMakeUndefined(context) /* append output */ #define SWIG_AppendOutput(result, obj) SWIGJSC_AppendOutput(context, result, obj) /* set constant */ #define SWIG_SetConstant(name, obj) /* raise */ #define SWIG_Raise(obj, type, desc) SWIG_Javascript_Raise(context, exception, type) %insert("runtime") %{ #define SWIG_JSC_FROM_DECL_ARGS(arg1) (JSContextRef context, arg1) #define SWIG_JSC_FROM_CALL_ARGS(arg1) (context, arg1) #define SWIG_JSC_AS_DECL_ARGS(arg1, arg2) (JSContextRef context, arg1, arg2) #define SWIG_JSC_AS_CALL_ARGS(arg1, arg2) (context, arg1, arg2) %} /* Include the unified typemap library */ %include swig-3.0.12/Lib/javascript/jsc/std_common.i0000664000175000017500000000014613042756442020405 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-3.0.12/Lib/javascript/jsc/std_except.i0000664000175000017500000000004313042756442020401 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/jsc/complex.i0000664000175000017500000000012013042756442017702 0ustar williamwilliam#ifdef __cplusplus %include #else %include #endif swig-3.0.12/Lib/javascript/jsc/typemaps.i0000664000175000017500000001047613042756442020114 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer handling * These mappings provide support for input/output arguments and common * uses for C/C++ pointers. * ----------------------------------------------------------------------------- */ // INPUT typemaps. // These remap a C pointer to be an "INPUT" value which is passed by value // instead of reference. /* The following methods can be applied to turn a pointer into a simple "input" value. That is, instead of passing a pointer to an object, you would use a real value instead. int *INPUT short *INPUT long *INPUT long long *INPUT unsigned int *INPUT unsigned short *INPUT unsigned long *INPUT unsigned long long *INPUT unsigned char *INPUT bool *INPUT float *INPUT double *INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); */ // OUTPUT typemaps. These typemaps are used for parameters that // are output only. The output value is appended to the result as // a list element. /* The following methods can be applied to turn a pointer into an "output" value. When calling a function, no input value would be given for a parameter, but an output value would be returned. In the case of multiple output values, they are returned in the form of a Python tuple. int *OUTPUT short *OUTPUT long *OUTPUT long long *OUTPUT unsigned int *OUTPUT unsigned short *OUTPUT unsigned long *OUTPUT unsigned long long *OUTPUT unsigned char *OUTPUT bool *OUTPUT float *OUTPUT double *OUTPUT For example, suppose you were trying to wrap the modf() function in the C math library which splits x into integral and fractional parts (and returns the integer part in one of its parameters).K: double modf(double x, double *ip); You could wrap it with SWIG as follows : %include double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Python output of the function would be a tuple containing both output values. */ // INOUT // Mappings for an argument that is both an input and output // parameter /* The following methods can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" methods described earlier. Output values are returned in the form of a Python tuple. int *INOUT short *INOUT long *INOUT long long *INOUT unsigned int *INOUT unsigned short *INOUT unsigned long *INOUT unsigned long long *INOUT unsigned char *INOUT bool *INOUT float *INOUT double *INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); Unlike C, this mapping does not directly modify the input value (since this makes no sense in Python). Rather, the modified input value shows up as the return value of the function. Thus, to apply this function to a Python variable you might do this : x = neg(x) Note : previous versions of SWIG used the symbol 'BOTH' to mark input/output arguments. This is still supported, but will be slowly phased out in future releases. */ %include swig-3.0.12/Lib/javascript/jsc/javascriptstrings.swg0000664000175000017500000001350013042756442022371 0ustar williamwilliam/* ------------------------------------------------------------ * utility methods for char strings * ------------------------------------------------------------ */ %fragment("SWIG_AsCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERN int SWIG_JSC_AsCharPtrAndSize(JSContextRef context, JSValueRef valRef, char** cptr, size_t* psize, int *alloc) { if(JSValueIsString(context, valRef)) { JSStringRef js_str = JSValueToStringCopy(context, valRef, NULL); size_t len = JSStringGetMaximumUTF8CStringSize(js_str); char* cstr = (char*) %new_array(len, char); /* JSStringGetUTF8CString returns the length including 0-terminator */ len = JSStringGetUTF8CString(js_str, cstr, len); if(alloc) *alloc = SWIG_NEWOBJ; if(psize) *psize = len; if(cptr) *cptr = cstr; return SWIG_OK; } else { if(JSValueIsObject(context, valRef)) { JSObjectRef obj = JSValueToObject(context, valRef, NULL); // try if the object is a wrapped char[] swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } return SWIG_TypeError; } else { return SWIG_TypeError; } } } } %fragment("SWIG_FromCharPtrAndSize","header",fragment="SWIG_pchar_descriptor") { SWIGINTERNINLINE JSValueRef SWIG_JSC_FromCharPtrAndSize(JSContextRef context, const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { // TODO: handle extra long strings //swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); //return pchar_descriptor ? // SWIG_InternalNewPointerObj(%const_cast(carray,char *), pchar_descriptor, 0) : SWIG_Py_Void(); return JSValueMakeUndefined(context); } else { JSStringRef jsstring; JSValueRef result; if(size < 2) { char c[2]; int i; for(i=0;i %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/javascript/jsc/stl.i0000664000175000017500000000044313042756442017045 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/javascript/jsc/exception.i0000664000175000017500000000004213042756442020234 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/jsc/javascriptfragments.swg0000664000175000017500000000105713042756442022672 0ustar williamwilliam/* Create a file with this name, 'javascriptfragments.swg', in your working directory and add all the %fragments you want to take precedence over the default ones defined by swig. For example, if you add: %fragment(SWIG_AsVal_frag(int),"header") { SWIGINTERNINLINE int SWIG_AsVal(int)(PyObject *obj, int *val) { ; } } this will replace the code used to retrieve an integer value for all the typemaps that need it, including: int, std::vector, std::list >, etc. */ swig-3.0.12/Lib/javascript/jsc/cdata.i0000664000175000017500000000003613042756442017315 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/jsc/javascriptcomplex.swg0000664000175000017500000000721613042756442022356 0ustar williamwilliam/* Defines the As/From converters for double/float complex, you need to provide complex Type, the Name you want to use in the converters, the complex Constructor method, and the Real and Imag complex accessor methods. See the std_complex.i and ccomplex.i for concrete examples. */ /* the common from converter */ %define %swig_fromcplx_conv(Type, Real, Imag) %fragment(SWIG_From_frag(Type),"header", fragment=SWIG_From_frag(double)) { SWIGINTERNINLINE JSObjectRef SWIG_From_dec(Type)(%ifcplusplus(const Type&, Type) c) { JSValueRef vals[2]; vals[0] = SWIG_From(double)(Real(c)); vals[1] = SWIG_From(double)(Imag(c)); return JSObjectMakeArray(context, 2, vals, NULL); } } %enddef /* the double case */ %define %swig_cplxdbl_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(double)) { SWIGINTERN int SWIG_AsVal_dec(Type) (JSValueRef o, Type* val) { if (JSValueIsObject(context, o)) { JSObjectRef array; JSValueRef exception, js_re, js_im; double re, im; int res; exception = 0; res = 0; array = JSValueToObject(context, o, &exception); if(exception != 0) return SWIG_TypeError; js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception); if(exception != 0) return SWIG_TypeError; js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception); if(exception != 0) return SWIG_TypeError; res = SWIG_AsVal(double)(js_re, &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(js_im, &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if (val) *val = Constructor(re, im); return SWIG_OK; } else { double d; int res = SWIG_AddCast(SWIG_AsVal(double)(o, &d)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(d, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef /* the float case */ %define %swig_cplxflt_conv(Type, Constructor, Real, Imag) %fragment(SWIG_AsVal_frag(Type),"header", fragment=SWIG_AsVal_frag(float)) { SWIGINTERN int SWIG_AsVal_dec(Type)(JSValueRef o, Type *val) { if (JSValueIsObject(context, o)) { JSObjectRef array; JSValueRef exception, js_re, js_im; double re, im; int res; exception = 0; res = 0; array = JSValueToObject(context, o, &exception); if(exception != 0) return SWIG_TypeError; js_re = JSObjectGetPropertyAtIndex(context, array, 0, &exception); if(exception != 0) return SWIG_TypeError; js_im = JSObjectGetPropertyAtIndex(context, array, 1, &exception); if(exception != 0) return SWIG_TypeError; res = SWIG_AsVal(double)(js_re, &re); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } res = SWIG_AsVal(double)(js_im, &im); if(!SWIG_IsOK(res)) { return SWIG_TypeError; } if ((-FLT_MAX <= re && re <= FLT_MAX) && (-FLT_MAX <= im && im <= FLT_MAX)) { if (val) *val = Constructor(%numeric_cast(re, float), %numeric_cast(im, float)); return SWIG_OK; } else { return SWIG_OverflowError; } } else { float re; int res = SWIG_AddCast(SWIG_AsVal(float)(o, &re)); if (SWIG_IsOK(res)) { if (val) *val = Constructor(re, 0.0); return res; } } return SWIG_TypeError; } } %swig_fromcplx_conv(Type, Real, Imag); %enddef #define %swig_cplxflt_convn(Type, Constructor, Real, Imag) \ %swig_cplxflt_conv(Type, Constructor, Real, Imag) #define %swig_cplxdbl_convn(Type, Constructor, Real, Imag) \ %swig_cplxdbl_conv(Type, Constructor, Real, Imag) swig-3.0.12/Lib/javascript/jsc/std_string.i0000664000175000017500000000004313042756442020417 0ustar williamwilliam%include swig-3.0.12/Lib/javascript/jsc/std_map.i0000664000175000017500000000444113042756442017674 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/javascript/jsc/arrays_javascript.i0000664000175000017500000000643113042756442021775 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_javascript.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from JavaScript and vice versa. The JavaScript array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * extern int FiddleSticks[3]; * %} * * Use from JavaScript like this: * * var fs = [10, 11, 12]; * example.FiddleSticks = fs; * fs = example.FiddleSticks; * ----------------------------------------------------------------------------- */ %fragment("SWIG_JSCGetIntProperty", "header", fragment=SWIG_AsVal_frag(int)) {} %fragment("SWIG_JSCGetNumberProperty", "header", fragment=SWIG_AsVal_frag(double)) {} %typemap(in, fragment="SWIG_JSCGetIntProperty") int[], int[ANY] (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if (JSValueIsObject(context, $input)) { // Convert into Array array = JSValueToObject(context, $input, NULL); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); // Get primitive value from JSObject res = SWIG_AsVal(int)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) int[], int[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(int)) int[], int[ANY] (int length = 0, int i = 0) { length = $1_dim0; JSValueRef values[length]; for (i = 0; i < length; i++) { values[i] = SWIG_From(int)($1[i]); } $result = JSObjectMakeArray(context, length, values, NULL); } %typemap(in, fragment="SWIG_JSCGetNumberProperty") double[], double[ANY] (int length = 0, JSObjectRef array, JSValueRef jsvalue, int i = 0, int res = 0, $*1_ltype temp) { if (JSValueIsObject(context, $input)) { // Convert into Array array = JSValueToObject(context, $input, NULL); length = $1_dim0; $1 = ($*1_ltype *)malloc(sizeof($*1_ltype) * length); // Get each element from array for (i = 0; i < length; i++) { jsvalue = JSObjectGetPropertyAtIndex(context, array, i, NULL); // Get primitive value from JSObject res = SWIG_AsVal(double)(jsvalue, &temp); if (!SWIG_IsOK(res)) { SWIG_exception_fail(SWIG_ERROR, "Failed to convert $input to double"); } arg$argnum[i] = temp; } } else { SWIG_exception_fail(SWIG_ERROR, "$input is not JSObjectRef"); } } %typemap(freearg) double[], double[ANY] { free($1); } %typemap(out, fragment=SWIG_From_frag(double)) double[], double[ANY] (int length = 0, int i = 0) { length = $1_dim0; JSValueRef values[length]; for (i = 0; i < length; i++) { values[i] = SWIG_From(double)($1[i]); } $result = JSObjectMakeArray(context, length, values, NULL); } swig-3.0.12/Lib/php5/0000775000175000017500000000000013042756442014017 5ustar williamwilliamswig-3.0.12/Lib/php5/std_deque.i0000664000175000017500000000003413042756442016143 0ustar williamwilliam%include swig-3.0.12/Lib/php5/phpkw.swg0000664000175000017500000005353413042756442015704 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phpkw.swg * ----------------------------------------------------------------------------- */ /* Keyword (case insensitive) */ #define PHPKW(x) %keywordwarn("'" `x` "' is a PHP keyword, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",rename="c_%s") `x` /* Class (case insensitive) */ #define PHPCN(x) %keywordwarn("'" `x` "' is a PHP reserved class name, renaming to 'c_" `x` "'",%$isclass,sourcefmt="%(lower)s",rename="c_%s") `x` /* Constant (case insensitive) */ #define PHPBN1a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem,sourcefmt="%(lower)s") `x` #define PHPBN1b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant,sourcefmt="%(lower)s") `x` %define PHPBN1(X) PHPBN1a(X); PHPBN1b(X) %enddef /* Constant (case sensitive) */ #define PHPBN2a(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "enum conflicts with a built-in constant '"`x`"' in PHP"),%$isenumitem) `x` #define PHPBN2b(x) %namewarn(%warningmsg(SWIGWARN_PARSE_BUILTIN_NAME, "constant conflicts with a built-in constant '"`x`"' in PHP"),%$isconstant) `x` %define PHPBN2(X) PHPBN2a(X); PHPBN2b(X) %enddef #define PHPFN(x) %keywordwarn("'" `x` "' is a PHP built-in function, renaming to 'c_" `x` "'",sourcefmt="%(lower)s",%$isfunction,%$not %$ismember,rename="c_%s") `x` /* From: http://php.net/manual/en/reserved.keywords.php * "You cannot use any of the following words as constants, class names, * function or method names. Using them as variable names is generally OK, but * could lead to confusion." */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPKW(__halt_compiler); PHPKW(abstract); PHPKW(and); PHPKW(array); PHPKW(as); PHPKW(break); PHPKW(callable); // As of PHP 5.4 PHPKW(case); PHPKW(catch); PHPKW(class); PHPKW(clone); PHPKW(const); PHPKW(continue); PHPKW(declare); PHPKW(default); PHPKW(die); // "Language construct" PHPKW(do); PHPKW(echo); // "Language construct" PHPKW(else); PHPKW(elseif); PHPKW(empty); // "Language construct" PHPKW(enddeclare); PHPKW(endfor); PHPKW(endforeach); PHPKW(endif); PHPKW(endswitch); PHPKW(endwhile); PHPKW(eval); // "Language construct" PHPKW(exit); // "Language construct" PHPKW(extends); PHPKW(final); PHPKW(finally); // As of PHP 5.5 PHPKW(for); PHPKW(foreach); PHPKW(function); PHPKW(global); PHPKW(goto); // As of PHP 5.3 PHPKW(if); PHPKW(implements); PHPKW(include); // "Language construct" PHPKW(include_once); // "Language construct" PHPKW(instanceof); PHPKW(insteadof); // As of PHP 5.4 PHPKW(interface); PHPKW(isset); // "Language construct" PHPKW(list); // "Language construct" PHPKW(namespace); // As of PHP 5.3 PHPKW(new); PHPKW(or); PHPKW(print); // "Language construct" PHPKW(private); PHPKW(protected); PHPKW(public); PHPKW(require); // "Language construct" PHPKW(require_once); // "Language construct" PHPKW(return); // "Language construct" PHPKW(static); PHPKW(switch); PHPKW(throw); PHPKW(trait); // As of PHP 5.4 PHPKW(try); PHPKW(unset); // "Language construct" PHPKW(use); PHPKW(var); PHPKW(while); PHPKW(xor); PHPKW(yield); // As of PHP 5.5 // Compile-time "magic" constants // From: http://php.net/manual/en/reserved.keywords.php // also at: http://php.net/manual/en/language.constants.predefined.php /* These *MUST* be listed in lower case here */ PHPKW(__class__); PHPKW(__dir__); // As of PHP 5.3 PHPKW(__file__); PHPKW(__function__); PHPKW(__line__); PHPKW(__method__); PHPKW(__namespace__); // As of PHP 5.3 PHPKW(__trait__); // As of PHP 5.4 /* We classify these as built-in names since they conflict, but PHP still runs */ /* Predefined case-insensitive constants */ /* These *MUST* be listed in lower case here */ PHPBN1(null); PHPBN1(true); PHPBN1(false); /* "Core Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ /* These are case sensitive */ PHPBN2(PHP_VERSION); PHPBN2(PHP_MAJOR_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_MINOR_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_RELEASE_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_VERSION_ID); // As of PHP 5.2.7 PHPBN2(PHP_EXTRA_VERSION); // As of PHP 5.2.7 PHPBN2(PHP_ZTS); // As of PHP 5.2.7 PHPBN2(PHP_DEBUG); // As of PHP 5.2.7 PHPBN2(PHP_MAXPATHLEN); // As of PHP 5.3.0 PHPBN2(PHP_OS); PHPBN2(PHP_SAPI); PHPBN2(PHP_EOL); // As of PHP 5.0.2 PHPBN2(PHP_INT_MAX); // As of PHP 5.0.5 PHPBN2(PHP_INT_SIZE); // As of PHP 5.0.5 PHPBN2(DEFAULT_INCLUDE_PATH); PHPBN2(PEAR_INSTALL_DIR); PHPBN2(PEAR_EXTENSION_DIR); PHPBN2(PHP_EXTENSION_DIR); PHPBN2(PHP_PREFIX); PHPBN2(PHP_BINDIR); PHPBN2(PHP_BINARY); // As of PHP 5.4 PHPBN2(PHP_MANDIR); // As of PHP 5.3.7 PHPBN2(PHP_LIBDIR); PHPBN2(PHP_DATADIR); PHPBN2(PHP_SYSCONFDIR); PHPBN2(PHP_LOCALSTATEDIR); PHPBN2(PHP_CONFIG_FILE_PATH); PHPBN2(PHP_CONFIG_FILE_SCAN_DIR); PHPBN2(PHP_SHLIB_SUFFIX); PHPBN2(E_ERROR); PHPBN2(E_WARNING); PHPBN2(E_PARSE); PHPBN2(E_NOTICE); PHPBN2(E_CORE_ERROR); PHPBN2(E_CORE_WARNING); PHPBN2(E_COMPILE_ERROR); PHPBN2(E_COMPILE_WARNING); PHPBN2(E_USER_ERROR); PHPBN2(E_USER_WARNING); PHPBN2(E_USER_NOTICE); PHPBN2(E_DEPRECATED); // As of PHP 5.3.0 PHPBN2(E_USER_DEPRECATED); // As of PHP 5.3.0 PHPBN2(E_ALL); PHPBN2(E_STRICT); PHPBN2(__COMPILER_HALT_OFFSET__); // As of PHP 5.1.0 // TRUE, FALSE, NULL are listed on the same page, but are actually // case-insensitive, whereas all the other constants listed there seem to be // case-sensitive, so we handle TRUE, FALSE, NULL in PHPBN1. PHPBN2(PHP_OUTPUT_HANDLER_START); PHPBN2(PHP_OUTPUT_HANDLER_CONT); PHPBN2(PHP_OUTPUT_HANDLER_END); /* These don't actually seem to be set (tested on Linux, I guess they're * Windows only?) */ PHPBN2(PHP_WINDOWS_NT_DOMAIN_CONTROLLER); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_NT_SERVER); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_NT_WORKSTATION); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_BUILD); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_MAJOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_MINOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_PLATFORM); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_PRODUCTTYPE); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_SP_MAJOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_SP_MINOR); // As of PHP 5.3 PHPBN2(PHP_WINDOWS_VERSION_SUITEMASK); // As of PHP 5.3 /* "Standard Predefined Constants" from http://php.net/manual/en/reserved.constants.php */ PHPBN2(EXTR_OVERWRITE); PHPBN2(EXTR_SKIP); PHPBN2(EXTR_PREFIX_SAME); PHPBN2(EXTR_PREFIX_ALL); PHPBN2(EXTR_PREFIX_INVALID); PHPBN2(EXTR_PREFIX_IF_EXISTS); PHPBN2(EXTR_IF_EXISTS); PHPBN2(SORT_ASC); PHPBN2(SORT_DESC); PHPBN2(SORT_REGULAR); PHPBN2(SORT_NUMERIC); PHPBN2(SORT_STRING); PHPBN2(CASE_LOWER); PHPBN2(CASE_UPPER); PHPBN2(COUNT_NORMAL); PHPBN2(COUNT_RECURSIVE); PHPBN2(ASSERT_ACTIVE); PHPBN2(ASSERT_CALLBACK); PHPBN2(ASSERT_BAIL); PHPBN2(ASSERT_WARNING); PHPBN2(ASSERT_QUIET_EVAL); PHPBN2(CONNECTION_ABORTED); PHPBN2(CONNECTION_NORMAL); PHPBN2(CONNECTION_TIMEOUT); PHPBN2(INI_USER); PHPBN2(INI_PERDIR); PHPBN2(INI_SYSTEM); PHPBN2(INI_ALL); PHPBN2(INI_SCANNER_NORMAL); // As of PHP 5.3 PHPBN2(INI_SCANNER_RAW); // As of PHP 5.3 PHPBN2(M_E); PHPBN2(M_LOG2E); PHPBN2(M_LOG10E); PHPBN2(M_LN2); PHPBN2(M_LN10); PHPBN2(M_PI); PHPBN2(M_PI_2); PHPBN2(M_PI_4); PHPBN2(M_1_PI); PHPBN2(M_2_PI); PHPBN2(M_2_SQRTPI); PHPBN2(M_SQRT2); PHPBN2(M_SQRT1_2); PHPBN2(M_EULER); // As of PHP 5.2 PHPBN2(M_LNPI); // As of PHP 5.2 PHPBN2(M_SQRT3); // As of PHP 5.2 PHPBN2(M_SQRTPI); // As of PHP 5.2 PHPBN2(CRYPT_SALT_LENGTH); PHPBN2(CRYPT_STD_DES); PHPBN2(CRYPT_EXT_DES); PHPBN2(CRYPT_MD5); PHPBN2(CRYPT_BLOWFISH); PHPBN2(DIRECTORY_SEPARATOR); PHPBN2(SEEK_SET); PHPBN2(SEEK_CUR); PHPBN2(SEEK_END); PHPBN2(LOCK_SH); PHPBN2(LOCK_EX); PHPBN2(LOCK_UN); PHPBN2(LOCK_NB); PHPBN2(HTML_SPECIALCHARS); PHPBN2(HTML_ENTITIES); PHPBN2(ENT_COMPAT); PHPBN2(ENT_QUOTES); PHPBN2(ENT_NOQUOTES); PHPBN2(INFO_GENERAL); PHPBN2(INFO_CREDITS); PHPBN2(INFO_CONFIGURATION); PHPBN2(INFO_MODULES); PHPBN2(INFO_ENVIRONMENT); PHPBN2(INFO_VARIABLES); PHPBN2(INFO_LICENSE); PHPBN2(INFO_ALL); PHPBN2(CREDITS_GROUP); PHPBN2(CREDITS_GENERAL); PHPBN2(CREDITS_SAPI); PHPBN2(CREDITS_MODULES); PHPBN2(CREDITS_DOCS); PHPBN2(CREDITS_FULLPAGE); PHPBN2(CREDITS_QA); PHPBN2(CREDITS_ALL); PHPBN2(STR_PAD_LEFT); PHPBN2(STR_PAD_RIGHT); PHPBN2(STR_PAD_BOTH); PHPBN2(PATHINFO_DIRNAME); PHPBN2(PATHINFO_BASENAME); PHPBN2(PATHINFO_EXTENSION); PHPBN2(PATHINFO_FILENAME); // As of PHP 5.2 PHPBN2(PATH_SEPARATOR); PHPBN2(CHAR_MAX); PHPBN2(LC_CTYPE); PHPBN2(LC_NUMERIC); PHPBN2(LC_TIME); PHPBN2(LC_COLLATE); PHPBN2(LC_MONETARY); PHPBN2(LC_ALL); PHPBN2(LC_MESSAGES); PHPBN2(ABDAY_1); PHPBN2(ABDAY_2); PHPBN2(ABDAY_3); PHPBN2(ABDAY_4); PHPBN2(ABDAY_5); PHPBN2(ABDAY_6); PHPBN2(ABDAY_7); PHPBN2(DAY_1); PHPBN2(DAY_2); PHPBN2(DAY_3); PHPBN2(DAY_4); PHPBN2(DAY_5); PHPBN2(DAY_6); PHPBN2(DAY_7); PHPBN2(ABMON_1); PHPBN2(ABMON_2); PHPBN2(ABMON_3); PHPBN2(ABMON_4); PHPBN2(ABMON_5); PHPBN2(ABMON_6); PHPBN2(ABMON_7); PHPBN2(ABMON_8); PHPBN2(ABMON_9); PHPBN2(ABMON_10); PHPBN2(ABMON_11); PHPBN2(ABMON_12); PHPBN2(MON_1); PHPBN2(MON_2); PHPBN2(MON_3); PHPBN2(MON_4); PHPBN2(MON_5); PHPBN2(MON_6); PHPBN2(MON_7); PHPBN2(MON_8); PHPBN2(MON_9); PHPBN2(MON_10); PHPBN2(MON_11); PHPBN2(MON_12); PHPBN2(AM_STR); PHPBN2(PM_STR); PHPBN2(D_T_FMT); PHPBN2(D_FMT); PHPBN2(T_FMT); PHPBN2(T_FMT_AMPM); PHPBN2(ERA); PHPBN2(ERA_YEAR); PHPBN2(ERA_D_T_FMT); PHPBN2(ERA_D_FMT); PHPBN2(ERA_T_FMT); PHPBN2(ALT_DIGITS); PHPBN2(INT_CURR_SYMBOL); PHPBN2(CURRENCY_SYMBOL); PHPBN2(CRNCYSTR); PHPBN2(MON_DECIMAL_POINT); PHPBN2(MON_THOUSANDS_SEP); PHPBN2(MON_GROUPING); PHPBN2(POSITIVE_SIGN); PHPBN2(NEGATIVE_SIGN); PHPBN2(INT_FRAC_DIGITS); PHPBN2(FRAC_DIGITS); PHPBN2(P_CS_PRECEDES); PHPBN2(P_SEP_BY_SPACE); PHPBN2(N_CS_PRECEDES); PHPBN2(N_SEP_BY_SPACE); PHPBN2(P_SIGN_POSN); PHPBN2(N_SIGN_POSN); PHPBN2(DECIMAL_POINT); PHPBN2(RADIXCHAR); PHPBN2(THOUSANDS_SEP); PHPBN2(THOUSEP); PHPBN2(GROUPING); PHPBN2(YESEXPR); PHPBN2(NOEXPR); PHPBN2(YESSTR); PHPBN2(NOSTR); PHPBN2(CODESET); PHPBN2(LOG_EMERG); PHPBN2(LOG_ALERT); PHPBN2(LOG_CRIT); PHPBN2(LOG_ERR); PHPBN2(LOG_WARNING); PHPBN2(LOG_NOTICE); PHPBN2(LOG_INFO); PHPBN2(LOG_DEBUG); PHPBN2(LOG_KERN); PHPBN2(LOG_USER); PHPBN2(LOG_MAIL); PHPBN2(LOG_DAEMON); PHPBN2(LOG_AUTH); PHPBN2(LOG_SYSLOG); PHPBN2(LOG_LPR); PHPBN2(LOG_NEWS); PHPBN2(LOG_UUCP); PHPBN2(LOG_CRON); PHPBN2(LOG_AUTHPRIV); PHPBN2(LOG_LOCAL0); PHPBN2(LOG_LOCAL1); PHPBN2(LOG_LOCAL2); PHPBN2(LOG_LOCAL3); PHPBN2(LOG_LOCAL4); PHPBN2(LOG_LOCAL5); PHPBN2(LOG_LOCAL6); PHPBN2(LOG_LOCAL7); PHPBN2(LOG_PID); PHPBN2(LOG_CONS); PHPBN2(LOG_ODELAY); PHPBN2(LOG_NDELAY); PHPBN2(LOG_NOWAIT); PHPBN2(LOG_PERROR); /* Added in PHP 5.2 */ PHPBN2(PREG_BACKTRACK_LIMIT_ERROR); PHPBN2(PREG_BAD_UTF8_ERROR); PHPBN2(PREG_INTERNAL_ERROR); PHPBN2(PREG_NO_ERROR); PHPBN2(PREG_RECURSION_LIMIT_ERROR); PHPBN2(UPLOAD_ERR_EXTENSION); PHPBN2(STREAM_SHUT_RD); PHPBN2(STREAM_SHUT_WR); PHPBN2(STREAM_SHUT_RDWR); PHPBN2(CURLE_FILESIZE_EXCEEDED); PHPBN2(CURLE_FTP_SSL_FAILED); PHPBN2(CURLE_LDAP_INVALID_URL); PHPBN2(CURLFTPAUTH_DEFAULT); PHPBN2(CURLFTPAUTH_SSL); PHPBN2(CURLFTPAUTH_TLS); PHPBN2(CURLFTPSSL_ALL); PHPBN2(CURLFTPSSL_CONTROL); PHPBN2(CURLFTPSSL_NONE); PHPBN2(CURLFTPSSL_TRY); PHPBN2(CURLOPT_FTP_SSL); PHPBN2(CURLOPT_FTPSSLAUTH); PHPBN2(CURLOPT_TCP_NODELAY); // Added in PHP 5.2.1 PHPBN2(CURLOPT_TIMEOUT_MS); // Added in PHP 5.2.3 PHPBN2(CURLOPT_CONNECTTIMEOUT_MS); // Added in PHP 5.2.3 PHPBN2(GMP_VERSION); // Added in PHP 5.2.2 PHPBN2(SWFTEXTFIELD_USEFONT); PHPBN2(SWFTEXTFIELD_AUTOSIZE); PHPBN2(SWF_SOUND_NOT_COMPRESSED); PHPBN2(SWF_SOUND_ADPCM_COMPRESSED); PHPBN2(SWF_SOUND_MP3_COMPRESSED); PHPBN2(SWF_SOUND_NOT_COMPRESSED_LE); PHPBN2(SWF_SOUND_NELLY_COMPRESSED); PHPBN2(SWF_SOUND_5KHZ); PHPBN2(SWF_SOUND_11KHZ); PHPBN2(SWF_SOUND_22KHZ); PHPBN2(SWF_SOUND_44KHZ); PHPBN2(SWF_SOUND_8BITS); PHPBN2(SWF_SOUND_16BITS); PHPBN2(SWF_SOUND_MONO); PHPBN2(SWF_SOUND_STEREO); PHPBN2(OPENSSL_VERSION_NUMBER); PHPBN2(SNMP_OID_OUTPUT_FULL); PHPBN2(SNMP_OID_OUTPUT_NUMERIC); PHPBN2(MSG_EAGAIN); PHPBN2(MSG_ENOMSG); /* Added in PHP 5.3 */ PHPBN2(CURLOPT_PROGRESSFUNCTION); PHPBN2(IMG_FILTER_PIXELATE); PHPBN2(JSON_ERROR_CTRL_CHAR); PHPBN2(JSON_ERROR_DEPTH); PHPBN2(JSON_ERROR_NONE); PHPBN2(JSON_ERROR_STATE_MISMATCH); PHPBN2(JSON_ERROR_SYNTAX); PHPBN2(JSON_FORCE_OBJECT); PHPBN2(JSON_HEX_TAG); PHPBN2(JSON_HEX_AMP); PHPBN2(JSON_HEX_APOS); PHPBN2(JSON_HEX_QUOT); PHPBN2(LDAP_OPT_NETWORK_TIMEOUT); PHPBN2(LIBXML_LOADED_VERSION); PHPBN2(PREG_BAD_UTF8_OFFSET_ERROR); PHPBN2(BUS_ADRALN); PHPBN2(BUS_ADRERR); PHPBN2(BUS_OBJERR); PHPBN2(CLD_CONTIUNED); PHPBN2(CLD_DUMPED); PHPBN2(CLD_EXITED); PHPBN2(CLD_KILLED); PHPBN2(CLD_STOPPED); PHPBN2(CLD_TRAPPED); PHPBN2(FPE_FLTDIV); PHPBN2(FPE_FLTINV); PHPBN2(FPE_FLTOVF); PHPBN2(FPE_FLTRES); PHPBN2(FPE_FLTSUB); PHPBN2(FPE_FLTUND); PHPBN2(FPE_INTDIV); PHPBN2(FPE_INTOVF); PHPBN2(ILL_BADSTK); PHPBN2(ILL_COPROC); PHPBN2(ILL_ILLADR); PHPBN2(ILL_ILLOPC); PHPBN2(ILL_ILLOPN); PHPBN2(ILL_ILLTRP); PHPBN2(ILL_PRVOPC); PHPBN2(ILL_PRVREG); PHPBN2(POLL_ERR); PHPBN2(POLL_HUP); PHPBN2(POLL_IN); PHPBN2(POLL_MSG); PHPBN2(POLL_OUT); PHPBN2(POLL_PRI); PHPBN2(SEGV_ACCERR); PHPBN2(SEGV_MAPERR); PHPBN2(SI_ASYNCIO); PHPBN2(SI_KERNEL); PHPBN2(SI_MESGQ); PHPBN2(SI_NOINFO); PHPBN2(SI_QUEUE); PHPBN2(SI_SIGIO); PHPBN2(SI_TIMER); PHPBN2(SI_TKILL); PHPBN2(SI_USER); PHPBN2(SIG_BLOCK); PHPBN2(SIG_SETMASK); PHPBN2(SIG_UNBLOCK); PHPBN2(TRAP_BRKPT); PHPBN2(TRAP_TRACE); /* Added in PHP 5.4 */ PHPBN2(ENT_DISALLOWED); PHPBN2(ENT_HTML401); PHPBN2(ENT_HTML5); PHPBN2(ENT_SUBSTITUTE); PHPBN2(ENT_XML1); PHPBN2(ENT_XHTML); PHPBN2(IPPROTO_IP); PHPBN2(IPPROTO_IPV6); PHPBN2(IPV6_MULTICAST_HOPS); PHPBN2(IPV6_MULTICAST_IF); PHPBN2(IPV6_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_IF); PHPBN2(IP_MULTICAST_LOOP); PHPBN2(IP_MULTICAST_TTL); PHPBN2(MCAST_JOIN_GROUP); PHPBN2(MCAST_LEAVE_GROUP); PHPBN2(MCAST_BLOCK_SOURCE); PHPBN2(MCAST_UNBLOCK_SOURCE); PHPBN2(MCAST_JOIN_SOURCE_GROUP); PHPBN2(MCAST_LEAVE_SOURCE_GROUP); PHPBN2(CURLOPT_MAX_RECV_SPEED_LARGE); PHPBN2(CURLOPT_MAX_SEND_SPEED_LARGE); PHPBN2(LIBXML_HTML_NODEFDTD); PHPBN2(LIBXML_HTML_NOIMPLIED); PHPBN2(LIBXML_PEDANTIC); PHPBN2(OPENSSL_CIPHER_AES_128_CBC); PHPBN2(OPENSSL_CIPHER_AES_192_CBC); PHPBN2(OPENSSL_CIPHER_AES_256_CBC); PHPBN2(OPENSSL_RAW_DATA); PHPBN2(OPENSSL_ZERO_PADDING); PHPBN2(PHP_OUTPUT_HANDLER_CLEAN); PHPBN2(PHP_OUTPUT_HANDLER_CLEANABLE); PHPBN2(PHP_OUTPUT_HANDLER_DISABLED); PHPBN2(PHP_OUTPUT_HANDLER_FINAL); PHPBN2(PHP_OUTPUT_HANDLER_FLUSH); PHPBN2(PHP_OUTPUT_HANDLER_FLUSHABLE); PHPBN2(PHP_OUTPUT_HANDLER_REMOVABLE); PHPBN2(PHP_OUTPUT_HANDLER_STARTED); PHPBN2(PHP_OUTPUT_HANDLER_STDFLAGS); PHPBN2(PHP_OUTPUT_HANDLER_WRITE); PHPBN2(PHP_SESSION_ACTIVE); PHPBN2(PHP_SESSION_DISABLED); PHPBN2(PHP_SESSION_NONE); PHPBN2(STREAM_META_ACCESS); PHPBN2(STREAM_META_GROUP); PHPBN2(STREAM_META_GROUP_NAME); PHPBN2(STREAM_META_OWNER); PHPBN2(STREAM_META_OWNER_NAME); PHPBN2(STREAM_META_TOUCH); PHPBN2(ZLIB_ENCODING_DEFLATE); PHPBN2(ZLIB_ENCODING_GZIP); PHPBN2(ZLIB_ENCODING_RAW); PHPBN2(U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR); PHPBN2(IDNA_CHECK_BIDI); PHPBN2(IDNA_CHECK_CONTEXTJ); PHPBN2(IDNA_NONTRANSITIONAL_TO_ASCII); PHPBN2(IDNA_NONTRANSITIONAL_TO_UNICODE); PHPBN2(INTL_IDNA_VARIANT_2003); PHPBN2(INTL_IDNA_VARIANT_UTS46); PHPBN2(IDNA_ERROR_EMPTY_LABEL); PHPBN2(IDNA_ERROR_LABEL_TOO_LONG); PHPBN2(IDNA_ERROR_DOMAIN_NAME_TOO_LONG); PHPBN2(IDNA_ERROR_LEADING_HYPHEN); PHPBN2(IDNA_ERROR_TRAILING_HYPHEN); PHPBN2(IDNA_ERROR_HYPHEN_3_4); PHPBN2(IDNA_ERROR_LEADING_COMBINING_MARK); PHPBN2(IDNA_ERROR_DISALLOWED); PHPBN2(IDNA_ERROR_PUNYCODE); PHPBN2(IDNA_ERROR_LABEL_HAS_DOT); PHPBN2(IDNA_ERROR_INVALID_ACE_LABEL); PHPBN2(IDNA_ERROR_BIDI); PHPBN2(IDNA_ERROR_CONTEXTJ); PHPBN2(JSON_PRETTY_PRINT); PHPBN2(JSON_UNESCAPED_SLASHES); PHPBN2(JSON_NUMERIC_CHECK); PHPBN2(JSON_UNESCAPED_UNICODE); PHPBN2(JSON_BIGINT_AS_STRING); /* Added in PHP 5.5 */ PHPBN2(IMG_AFFINE_TRANSLATE); PHPBN2(IMG_AFFINE_SCALE); PHPBN2(IMG_AFFINE_ROTATE); PHPBN2(IMG_AFFINE_SHEAR_HORIZONTAL); PHPBN2(IMG_AFFINE_SHEAR_VERTICAL); PHPBN2(IMG_CROP_DEFAULT); PHPBN2(IMG_CROP_TRANSPARENT); PHPBN2(IMG_CROP_BLACK); PHPBN2(IMG_CROP_WHITE); PHPBN2(IMG_CROP_SIDES); PHPBN2(IMG_FLIP_BOTH); PHPBN2(IMG_FLIP_HORIZONTAL); PHPBN2(IMG_FLIP_VERTICAL); PHPBN2(IMG_BELL); PHPBN2(IMG_BESSEL); PHPBN2(IMG_BICUBIC); PHPBN2(IMG_BICUBIC_FIXED); PHPBN2(IMG_BLACKMAN); PHPBN2(IMG_BOX); PHPBN2(IMG_BSPLINE); PHPBN2(IMG_CATMULLROM); PHPBN2(IMG_GAUSSIAN); PHPBN2(IMG_GENERALIZED_CUBIC); PHPBN2(IMG_HERMITE); PHPBN2(IMG_HAMMING); PHPBN2(IMG_HANNING); PHPBN2(IMG_MITCHELL); PHPBN2(IMG_POWER); PHPBN2(IMG_QUADRATIC); PHPBN2(IMG_SINC); PHPBN2(IMG_NEAREST_NEIGHBOUR); PHPBN2(IMG_WEIGHTED4); PHPBN2(IMG_TRIANGLE); PHPBN2(JSON_ERROR_RECURSION); PHPBN2(JSON_ERROR_INF_OR_NAN); PHPBN2(JSON_ERROR_UNSUPPORTED_TYPE); PHPBN2(MYSQLI_SERVER_PUBLIC_KEY); /* Added in PHP 5.6 */ PHPBN2(LDAP_ESCAPE_DN); PHPBN2(LDAP_ESCAPE_FILTER); PHPBN2(OPENSSL_DEFAULT_STREAM_CIPHERS); PHPBN2(STREAM_CRYPTO_METHOD_ANY_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_ANY_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_0_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_1_SERVER); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT); PHPBN2(STREAM_CRYPTO_METHOD_TLSv1_2_SERVER); PHPBN2(PGSQL_CONNECT_ASYNC); PHPBN2(PGSQL_CONNECTION_AUTH_OK); PHPBN2(PGSQL_CONNECTION_AWAITING_RESPONSE); PHPBN2(PGSQL_CONNECTION_MADE); PHPBN2(PGSQL_CONNECTION_SETENV); PHPBN2(PGSQL_CONNECTION_SSL_STARTUP); PHPBN2(PGSQL_CONNECTION_STARTED); PHPBN2(PGSQL_DML_ESCAPE); PHPBN2(PGSQL_POLLING_ACTIVE); PHPBN2(PGSQL_POLLING_FAILED); PHPBN2(PGSQL_POLLING_OK); PHPBN2(PGSQL_POLLING_READING); PHPBN2(PGSQL_POLLING_WRITING); /* Class names reserved by PHP (case insensitive) */ PHPCN(directory); PHPCN(stdclass); PHPCN(__php_incomplete_class); /* Added in PHP5. */ PHPCN(exception); PHPCN(errorexception); // As of PHP 5.1 PHPCN(php_user_filter); PHPCN(closure); // As of PHP 5.3 PHPCN(generator); // As of PHP 5.5 PHPCN(self); PHPCN(static); PHPCN(parent); /* From extensions (which of these are actually predefined depends which * extensions are loaded by default). */ PHPCN(xmlwriter); PHPCN(libxmlerror); PHPCN(simplexmlelement); PHPCN(soapclient); PHPCN(soapvar); PHPCN(soapserver); PHPCN(soapfault); PHPCN(soapparam); PHPCN(soapheader); PHPCN(recursiveiteratoriterator); PHPCN(filteriterator); PHPCN(recursivefilteriterator); PHPCN(parentiterator); PHPCN(limititerator); PHPCN(cachingiterator); PHPCN(recursivecachingiterator); PHPCN(iteratoriterator); PHPCN(norewinditerator); PHPCN(appenditerator); PHPCN(infiniteiterator); PHPCN(emptyiterator); PHPCN(arrayobject); PHPCN(arrayiterator); PHPCN(recursivearrayiterator); PHPCN(splfileinfo); PHPCN(directoryiterator); PHPCN(recursivedirectoryiterator); PHPCN(splfileobject); PHPCN(spltempfileobject); PHPCN(simplexmliterator); PHPCN(logicexception); PHPCN(badfunctioncallexception); PHPCN(badmethodcallexception); PHPCN(domainexception); PHPCN(invalidargumentexception); PHPCN(lengthexception); PHPCN(outofrangeexception); PHPCN(runtimeexception); PHPCN(outofboundsexception); PHPCN(overflowexception); PHPCN(rangeexception); PHPCN(underflowexception); PHPCN(unexpectedvalueexception); PHPCN(splobjectstorage); PHPCN(reflectionexception); PHPCN(reflection); PHPCN(reflectionfunction); PHPCN(reflectionparameter); PHPCN(reflectionmethod); PHPCN(reflectionclass); PHPCN(reflectionobject); PHPCN(reflectionproperty); PHPCN(reflectionextension); PHPCN(domexception); PHPCN(domstringlist); PHPCN(domnamelist); PHPCN(domimplementationlist); PHPCN(domimplementationsource); PHPCN(domimplementation); PHPCN(domnode); PHPCN(domnamespacenode); PHPCN(domdocumentfragment); PHPCN(domdocument); PHPCN(domnodelist); PHPCN(domnamednodemap); PHPCN(domcharacterdata); PHPCN(domattr); PHPCN(domelement); PHPCN(domtext); PHPCN(domcomment); PHPCN(domtypeinfo); PHPCN(domuserdatahandler); PHPCN(domdomerror); PHPCN(domerrorhandler); PHPCN(domlocator); PHPCN(domconfiguration); PHPCN(domcdatasection); PHPCN(domdocumenttype); PHPCN(domnotation); PHPCN(domentity); PHPCN(domentityreference); PHPCN(domprocessinginstruction); PHPCN(domstringextend); PHPCN(domxpath); PHPCN(xmlreader); PHPCN(sqlitedatabase); PHPCN(sqliteresult); PHPCN(sqliteunbuffered); PHPCN(sqliteexception); PHPCN(datetime); /* Built-in PHP functions (incomplete). */ /* Includes Array Functions - http://php.net/manual/en/ref.array.php */ /* Check is case insensitive - these *MUST* be listed in lower case here */ PHPFN(acos); PHPFN(array_change_key_case); PHPFN(array_chunk); PHPFN(array_column); PHPFN(array_combine); PHPFN(array_count_values); PHPFN(array_diff); PHPFN(array_diff_assoc); PHPFN(array_diff_key); PHPFN(array_diff_uassoc); PHPFN(array_diff_ukey); PHPFN(array_fill); PHPFN(array_fill_keys); PHPFN(array_filter); PHPFN(array_flip); PHPFN(array_intersect); PHPFN(array_intersect_assoc); PHPFN(array_intersect_key); PHPFN(array_intersect_uassoc); PHPFN(array_intersect_ukey); PHPFN(array_key_exists); PHPFN(array_keys); PHPFN(array_map); PHPFN(array_merge); PHPFN(array_merge_recursive); PHPFN(array_multisort); PHPFN(array_pad); PHPFN(array_pop); PHPFN(array_product); PHPFN(array_push); PHPFN(array_rand); PHPFN(array_reduce); PHPFN(array_replace); PHPFN(array_replace_recursive); PHPFN(array_reverse); PHPFN(array_search); PHPFN(array_shift); PHPFN(array_slice); PHPFN(array_splice); PHPFN(array_sum); PHPFN(array_udiff); PHPFN(array_udiff_assoc); PHPFN(array_udiff_uassoc); PHPFN(array_uintersect); PHPFN(array_uintersect_assoc); PHPFN(array_uintersect_uassoc); PHPFN(array_unique); PHPFN(array_unshift); PHPFN(array_values); PHPFN(array_walk); PHPFN(array_walk_recursive); PHPFN(arsort); PHPFN(asin); PHPFN(asort); PHPFN(atan); PHPFN(atan2); PHPFN(ceil); PHPFN(compact); PHPFN(cos); PHPFN(cosh); PHPFN(count); PHPFN(current); PHPFN(each); PHPFN(end); PHPFN(exp); PHPFN(extract); PHPFN(floor); PHPFN(fmod); PHPFN(in_array); PHPFN(key); PHPFN(key_exists); PHPFN(krsort); PHPFN(ksort); PHPFN(log); PHPFN(log10); PHPFN(max); PHPFN(min); PHPFN(natcasesort); PHPFN(natsort); PHPFN(next); PHPFN(pos); PHPFN(pow); PHPFN(prev); PHPFN(range); PHPFN(reset); PHPFN(rsort); PHPFN(shuffle); PHPFN(sin); PHPFN(sinh); PHPFN(sizeof); PHPFN(sort); PHPFN(sqrt); PHPFN(tan); PHPFN(tanh); PHPFN(uasort); PHPFN(uksort); PHPFN(usort); #undef PHPKW #undef PHPBN1a #undef PHPBN1b #undef PHPBN1 #undef PHPBN2a #undef PHPBN2b #undef PHPBN2 #undef PHPCN #undef PHPFN swig-3.0.12/Lib/php5/director.swg0000664000175000017500000001007713042756442016361 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that PHP proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #ifndef SWIG_DIRECTOR_PHP_HEADER_ #define SWIG_DIRECTOR_PHP_HEADER_ #include #include #include namespace Swig { /* memory handler */ struct GCItem { virtual ~GCItem() { } virtual int get_own() const { return 0; } }; struct GCItem_var { GCItem_var(GCItem *item = 0) : _item(item) { } GCItem_var& operator=(GCItem *item) { GCItem *tmp = _item; _item = item; delete tmp; return *this; } ~GCItem_var() { delete _item; } GCItem * operator->() const { return _item; } private: GCItem *_item; }; struct GCItem_Object : GCItem { GCItem_Object(int own) : _own(own) { } virtual ~GCItem_Object() { } int get_own() const { return _own; } private: int _own; }; template struct GCItem_T : GCItem { GCItem_T(Type *ptr) : _ptr(ptr) { } virtual ~GCItem_T() { delete _ptr; } private: Type *_ptr; }; class Director { protected: zval *swig_self; typedef std::map swig_ownership_map; mutable swig_ownership_map swig_owner; #ifdef ZTS // Store the ZTS context so it's available when C++ calls back to PHP. void *** swig_zts_ctx; #endif public: Director(zval *self TSRMLS_DC) : swig_self(self) { TSRMLS_SET_CTX(swig_zts_ctx); } static bool swig_is_overridden_method(char *cname, char *lc_fname TSRMLS_DC) { zend_class_entry **ce; zend_function *mptr; if (zend_lookup_class(cname, strlen(cname), &ce TSRMLS_CC) != SUCCESS) { return false; } if (zend_hash_find(&(*ce)->function_table, lc_fname, strlen(lc_fname) + 1, (void **) &mptr) != SUCCESS) { return false; } // common.scope points to the declaring class return strcmp(mptr->common.scope->name, cname); } template void swig_acquire_ownership(Type *vptr) const { if (vptr) { swig_owner[vptr] = new GCItem_T(vptr); } } }; /* base class for director exceptions */ class DirectorException : public std::exception { protected: std::string swig_msg; public: DirectorException(int code, const char *hdr, const char *msg TSRMLS_DC) : swig_msg(hdr) { if (msg[0]) { swig_msg += " "; swig_msg += msg; } SWIG_ErrorCode() = code; SWIG_ErrorMsg() = swig_msg.c_str(); } virtual ~DirectorException() throw() { } const char *what() const throw() { return swig_msg.c_str(); } static void raise(int code, const char *hdr, const char *msg TSRMLS_DC) { throw DirectorException(code, hdr, msg TSRMLS_CC); } }; /* attempt to call a pure virtual method via a director method */ class DirectorPureVirtualException : public DirectorException { public: DirectorPureVirtualException(const char *msg TSRMLS_DC) : DirectorException(E_ERROR, "SWIG director pure virtual method called", msg TSRMLS_CC) { } static void raise(const char *msg TSRMLS_DC) { throw DirectorPureVirtualException(msg TSRMLS_CC); } }; /* any php exception that occurs during a director method call */ class DirectorMethodException : public DirectorException { public: DirectorMethodException(const char *msg TSRMLS_DC) : DirectorException(E_ERROR, "SWIG director method error", msg TSRMLS_CC) { } static void raise(const char *msg TSRMLS_DC) { throw DirectorMethodException(msg TSRMLS_CC); } }; } // DirectorMethodException() is documented to be callable with no parameters // so use a macro to insert TSRMLS_CC so any ZTS context gets passed. #define DirectorMethodException() DirectorMethodException("" TSRMLS_CC) #endif swig-3.0.12/Lib/php5/php.swg0000664000175000017500000003301413042756442015331 0ustar williamwilliam/* ----------------------------------------------------------------------------- * php.swg * * PHP configuration file * ----------------------------------------------------------------------------- */ %runtime "swigrun.swg" // Common C API type-checking code %runtime "phprun.swg" // PHP runtime functions %include // PHP initialization routine. %include // Global variables. %include // use %init %{ "/*code goes here*/ " %} // or %minit %{ "/* code goes here*/ " %} to // insert code in the PHP_MINIT_FUNCTION #define %minit %insert("init") // use %rinit %{ "/* code goes here*/ " %} to // insert code in the PHP_RINIT_FUNCTION #define %rinit %insert("rinit") // use %shutdown %{ " /*code goes here*/ " %} to // insert code in the PHP_MSHUTDOWN_FUNCTION #define %shutdown %insert("shutdown") #define %mshutdown %insert("shutdown") // use %rshutdown %{ " /*code goes here*/" %} to // insert code in the PHP_RSHUTDOWN_FUNCTION #define %rshutdown %insert("rshutdown") /* Typemaps for input parameters by value */ %include %pass_by_val(bool,CONVERT_BOOL_IN); %pass_by_val(size_t, CONVERT_INT_IN); %pass_by_val(enum SWIGTYPE, CONVERT_INT_IN); %pass_by_val(signed int, CONVERT_INT_IN); %pass_by_val(int,CONVERT_INT_IN); %pass_by_val(unsigned int,CONVERT_INT_IN); %pass_by_val(signed short, CONVERT_INT_IN); %pass_by_val(short,CONVERT_INT_IN); %pass_by_val(unsigned short, CONVERT_INT_IN); %pass_by_val(signed long, CONVERT_INT_IN); %pass_by_val(long, CONVERT_INT_IN); %pass_by_val(unsigned long, CONVERT_INT_IN); %pass_by_val(signed long long, CONVERT_LONG_LONG_IN); %pass_by_val(long long, CONVERT_LONG_LONG_IN); %pass_by_val(unsigned long long, CONVERT_UNSIGNED_LONG_LONG_IN); %pass_by_val(signed char, CONVERT_INT_IN); %pass_by_val(char, CONVERT_CHAR_IN); %pass_by_val(unsigned char, CONVERT_INT_IN); %pass_by_val(float, CONVERT_FLOAT_IN); %pass_by_val(double, CONVERT_FLOAT_IN); %pass_by_val(char *, CONVERT_STRING_IN); %typemap(in) char *& = const char *&; %typemap(directorout) char *& = const char *&; // char array can be in/out, though the passed string may not be big enough... // so we have to size it %typemap(in) char[ANY] { convert_to_string_ex($input); $1 = ($1_ltype) Z_STRVAL_PP($input); } %typemap(in) (char *STRING, int LENGTH), (char *STRING, size_t LENGTH) { convert_to_string_ex($input); $1 = ($1_ltype) Z_STRVAL_PP($input); $2 = ($2_ltype) Z_STRLEN_PP($input); } /* Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_ltype tmp) { if(SWIG_ConvertPtr(*$input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } $1 = *tmp; } %typemap(directorout) SWIGTYPE ($&1_ltype tmp) { /* If exit was via exception, PHP NULL is returned so skip the conversion. */ if (!EG(exception)) { if(SWIG_ConvertPtr($input, (void **) &tmp, $&1_descriptor, 0) < 0 || tmp == NULL) SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); $result = *tmp; } } %typemap(in) SWIGTYPE *, SWIGTYPE [] { if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } } %typemap(in) SWIGTYPE & { if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } } %typemap(in) SWIGTYPE && { if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, 0) < 0 || $1 == NULL) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $1_descriptor"); } } %typemap(in) SWIGTYPE *const& ($*ltype temp) { if(SWIG_ConvertPtr(*$input, (void **) &temp, $*1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $*1_descriptor"); } $1 = ($1_ltype)&temp; } %typemap(in) SWIGTYPE *DISOWN { if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, SWIG_POINTER_DISOWN ) < 0) { SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } } %typemap(argout) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE &&; %typemap(in) void * { if(SWIG_ConvertPtr(*$input, (void **) &$1, 0, 0) < 0) { /* Allow NULL from php for void* */ if ((*$input)->type==IS_NULL) $1=0; else SWIG_PHP_Error(E_ERROR, "Type error in argument $argnum of $symname. Expected $&1_descriptor"); } } /* Special case when void* is passed by reference so it can be made to point to opaque api structs */ %typemap(in) void ** ($*1_ltype ptr, int force), void *& ($*1_ltype ptr, int force) { /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!((*$input)->type==IS_NULL && PZVAL_IS_REF(*$input))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } } %typemap(argout) void **, void *& { if (force$argnum) { SWIG_SetPointerZval( *$input, (void*) ptr$argnum, $*1_descriptor, 1); } } /* Typemap for output values */ %typemap(out) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, bool, size_t { ZVAL_LONG(return_value,$1); } %typemap(out) enum SWIGTYPE { ZVAL_LONG(return_value, (long)$1); } %typemap(out) long long %{ if ((long long)LONG_MIN <= $1 && $1 <= (long long)LONG_MAX) { return_value->value.lval = (long)($1); return_value->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%lld", (long long)$1); ZVAL_STRING(return_value, temp, 1); } %} %typemap(out) unsigned long long %{ if ($1 <= (unsigned long long)LONG_MAX) { return_value->value.lval = (long)($1); return_value->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)$1); ZVAL_STRING(return_value, temp, 1); } %} %typemap(out) const int &, const unsigned int &, const short &, const unsigned short &, const long &, const unsigned long &, const signed char &, const unsigned char &, const bool &, const size_t & { ZVAL_LONG(return_value,*$1); } %typemap(out) const enum SWIGTYPE & { ZVAL_LONG(return_value, (long)*$1); } %typemap(out) const enum SWIGTYPE && { ZVAL_LONG(return_value, (long)*$1); } %typemap(out) const long long & %{ if ((long long)LONG_MIN <= *$1 && *$1 <= (long long)LONG_MAX) { return_value->value.lval = (long)(*$1); return_value->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%lld", (long long)(*$1)); ZVAL_STRING(return_value, temp, 1); } %} %typemap(out) const unsigned long long & %{ if (*$1 <= (unsigned long long)LONG_MAX) { return_value->value.lval = (long)(*$1); return_value->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*$1)); ZVAL_STRING(return_value, temp, 1); } %} %typemap(directorin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, size_t, enum SWIGTYPE { ZVAL_LONG($input,$1); } %typemap(directorin) enum SWIGTYPE { ZVAL_LONG($input, (long)$1_name); } %typemap(directorin) char *, char [] { if(!$1) { ZVAL_NULL($input); } else { ZVAL_STRING($input, (char *)$1, 1); } } %typemap(out) bool { ZVAL_BOOL(return_value,($1)?1:0); } %typemap(out) const bool & { ZVAL_BOOL(return_value,(*$1)?1:0); } %typemap(directorin) bool { ZVAL_BOOL($input,($1)?1:0); } %typemap(out) float, double { ZVAL_DOUBLE(return_value,$1); } %typemap(out) const float &, const double & { ZVAL_DOUBLE(return_value,*$1); } %typemap(directorin) float, double { ZVAL_DOUBLE($input,$1); } %typemap(out) char { ZVAL_STRINGL(return_value,&$1, 1, 1); } %typemap(out) const char & { ZVAL_STRINGL(return_value,&*$1, 1, 1); } %typemap(out) char *, char [] { if(!$1) { ZVAL_NULL(return_value); } else { ZVAL_STRING(return_value, (char *)$1, 1); } } %typemap(out) char *& { if(!*$1) { ZVAL_NULL(return_value); } else { ZVAL_STRING(return_value, (char *)*$1, 1); } } %typemap(out) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval(return_value, (void *)$1, $1_descriptor, $owner); %} %typemap(out) SWIGTYPE *const& %{ SWIG_SetPointerZval(return_value, (void *)*$1, $*1_descriptor, $owner); %} %typemap(directorin) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE && %{ SWIG_SetPointerZval($input, (void *)&$1, $1_descriptor, ($owner)|2); %} %typemap(out, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); ZEND_REGISTER_RESOURCE(return_value, p, swig_member_ptr); } %typemap(in, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = (void*)zend_fetch_resource($input TSRMLS_CC, -1, SWIG_MEMBER_PTR, NULL, 1, swig_member_ptr); memcpy(&$1, p, sizeof($1)); } %typemap(out) SWIGTYPE *DYNAMIC, SWIGTYPE &DYNAMIC { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); SWIG_SetPointerZval(return_value, (void *)$1, ty, $owner); } %typemap(out) SWIGTYPE #ifdef __cplusplus { $&1_ltype resultobj = new $1_ltype((const $1_ltype &) $1); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #else { $&1_ltype resultobj = ($&1_ltype) emalloc(sizeof($1_type)); memcpy(resultobj, &$1, sizeof($1_type)); SWIG_SetPointerZval(return_value, (void *)resultobj, $&1_descriptor, 1); } #endif %typemap(directorin) SWIGTYPE { SWIG_SetPointerZval($input, SWIG_as_voidptr(new $1_ltype((const $1_ltype &)$1)), $&1_descriptor, 1|2); } %typemap(out) void ""; %typemap(out) char [ANY] { int len = 0; while (len < $1_dim0 && $1[len]) ++len; RETVAL_STRINGL($1, len, 1); } // This typecheck does hard checking for proper argument type. If you want // an argument to be converted from a different PHP type, you must convert // it yourself before passing it (e.g. (string)4.7 or (int)"6"). %define %php_typecheck(_type,_prec,is) %typemap(typecheck,precedence=_prec) _type, const _type & " $1 = (Z_TYPE_PP($input) == is); " %enddef %php_typecheck(int,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck(unsigned int,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(short,SWIG_TYPECHECK_INT16,IS_LONG) %php_typecheck(unsigned short,SWIG_TYPECHECK_UINT16,IS_LONG) %php_typecheck(long,SWIG_TYPECHECK_INT32,IS_LONG) %php_typecheck(unsigned long,SWIG_TYPECHECK_UINT32,IS_LONG) %php_typecheck(long long,SWIG_TYPECHECK_INT64,IS_LONG) %php_typecheck(unsigned long long,SWIG_TYPECHECK_UINT64,IS_LONG) %php_typecheck(signed char,SWIG_TYPECHECK_INT8,IS_LONG) %php_typecheck(unsigned char,SWIG_TYPECHECK_UINT8,IS_LONG) %php_typecheck(size_t,SWIG_TYPECHECK_SIZE,IS_LONG) %php_typecheck(enum SWIGTYPE,SWIG_TYPECHECK_INTEGER,IS_LONG) %php_typecheck(bool,SWIG_TYPECHECK_BOOL,IS_BOOL) %php_typecheck(float,SWIG_TYPECHECK_FLOAT,IS_DOUBLE) %php_typecheck(double,SWIG_TYPECHECK_DOUBLE,IS_DOUBLE) %php_typecheck(char,SWIG_TYPECHECK_CHAR,IS_STRING) %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) char *, char *&, char [] " $1 = (Z_TYPE_PP($input) == IS_STRING); " %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE { void *tmp; _v = (SWIG_ConvertPtr(*$input, (void **)&tmp, $&1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE [], SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const& { void *tmp; _v = (SWIG_ConvertPtr(*$input, (void**)&tmp, $1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *const& { void *tmp; _v = (SWIG_ConvertPtr(*$input, (void**)&tmp, $*1_descriptor, 0) >= 0); } %typecheck(SWIG_TYPECHECK_VOIDPTR) void * { void *tmp; _v = (SWIG_ConvertPtr(*$input, (void**)&tmp, 0, 0) >= 0); } /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short { zend_throw_exception(NULL, const_cast("C++ $1_type exception thrown"), $1 TSRMLS_CC); return; } %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; zend_throw_exception(NULL, const_cast("C++ $1_type exception thrown"), 0 TSRMLS_CC); return; %} %typemap(throws) char * %{ zend_throw_exception(NULL, const_cast($1), 0 TSRMLS_CC); return; %} /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* php keywords */ %include swig-3.0.12/Lib/php5/phppointers.i0000664000175000017500000000273413042756442016552 0ustar williamwilliam%define %pass_by_ref( TYPE, CONVERT_IN, CONVERT_OUT ) %typemap(in, byref=1) TYPE *REF ($*1_ltype tmp), TYPE &REF ($*1_ltype tmp) %{ /* First Check for SWIG wrapped type */ if ( ZVAL_IS_NULL( *$input ) ) { $1 = 0; } else if ( PZVAL_IS_REF( *$input ) ) { /* Not swig wrapped type, so we check if it's a PHP reference type */ CONVERT_IN( tmp, $*1_ltype, $input ); $1 = &tmp; } else { SWIG_PHP_Error( E_ERROR, SWIG_PHP_Arg_Error_Msg($argnum, Expected a reference) ); } %} %typemap(argout) TYPE *REF, TYPE &REF "CONVERT_OUT(*$input, tmp$argnum );"; %enddef %pass_by_ref( size_t, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned int, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned short, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( unsigned long, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( signed char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( char, CONVERT_CHAR_IN, ZVAL_STRING ); %pass_by_ref( unsigned char, CONVERT_INT_IN, ZVAL_LONG ); %pass_by_ref( float, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( double, CONVERT_FLOAT_IN, ZVAL_DOUBLE ); %pass_by_ref( char *, CONVERT_CHAR_IN, ZVAL_STRING ); swig-3.0.12/Lib/php5/std_vector.i0000664000175000017500000000526013042756442016350 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_vector.i * ----------------------------------------------------------------------------- */ %include %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } T pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); T x = self->back(); self->pop_back(); return x; } const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef bool value_type; typedef bool const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); void clear(); %rename(push) push_back; void push_back(const value_type& x); %extend { bool is_empty() const { return $self->empty(); } bool pop() throw (std::out_of_range) { if (self->size() == 0) throw std::out_of_range("pop from empty vector"); bool x = self->back(); self->pop_back(); return x; } bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && itype = IS_STRING; if($1) { z_var->value.str.val = estrdup($1); z_var->value.str.len = strlen($1); } else { z_var->value.str.val = 0; z_var->value.str.len = 0; } zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL); } %typemap(varinit) char [] { zval *z_var; MAKE_STD_ZVAL(z_var); z_var->type = IS_STRING; z_var->value.str.val = estrdup($1); z_var->value.str.len = strlen($1); zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL); } %typemap(varinit) int, unsigned int, unsigned short, short, unsigned short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE { zval *z_var; MAKE_STD_ZVAL(z_var); z_var->type = IS_LONG; z_var->value.lval = (long)$1; zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL); } %typemap(varinit) bool { zval *z_var; MAKE_STD_ZVAL(z_var); z_var->type = IS_BOOL; z_var->value.lval = ($1)?1:0; zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL); } %typemap(varinit) float, double { zval *z_var; MAKE_STD_ZVAL(z_var); z_var->type = IS_DOUBLE; z_var->value.dval = $1; zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL); } %typemap(varinit) char { zval *z_var; char c[2]; MAKE_STD_ZVAL(z_var); c[0] = $1; c[1] = 0; z_var->type = IS_STRING; z_var->value.str.val = estrndup(c, 1); z_var->value.str.len = 1; zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL); } %typemap(varinit) SWIGTYPE *, SWIGTYPE [] { zval *z_var; MAKE_STD_ZVAL(z_var); SWIG_SetPointerZval(z_var, (void*)$1, $1_descriptor, 0); zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void *)&z_var, sizeof(zval *), NULL); } %typemap(varinit) SWIGTYPE, SWIGTYPE &, SWIGTYPE && { zval *z_var; MAKE_STD_ZVAL(z_var); SWIG_SetPointerZval(z_var, (void*)&$1, $&1_descriptor, 0); zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&z_var, sizeof(zval *), NULL); } %typemap(varinit) char [ANY] { zval *z_var; MAKE_STD_ZVAL(z_var); z_var->type = IS_STRING; ZVAL_STRINGL(z_var,(char*)$1, $1_dim0, 1); zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&z_var, sizeof(zval *), NULL); } %typemap(varinit, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); zval * resource; MAKE_STD_ZVAL(resource); ZEND_REGISTER_RESOURCE(resource, p, swig_member_ptr); zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&resource, sizeof(zval *), NULL); } %typemap(varin) int, unsigned int, short, unsigned short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); convert_to_long_ex(z_var); if ($1 != ($1_ltype)((*z_var)->value.lval)) { $1 = Z_LVAL_PP(z_var); } } %typemap(varin) bool { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); convert_to_boolean_ex(z_var); if ($1 != ($1_ltype)((*z_var)->value.lval)) { $1 = Z_LVAL_PP(z_var); } } %typemap(varin) double,float { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); convert_to_double_ex(z_var); if ($1 != ($1_ltype)((*z_var)->value.dval)) { $1 = Z_DVAL_PP(z_var); } } %typemap(varin) char { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); convert_to_string_ex(z_var); if ($1 != *((*z_var)->value.str.val)) { $1 = *((*z_var)->value.str.val); } } %typemap(varin) char * { zval **z_var; char *s1; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); convert_to_string_ex(z_var); s1 = Z_STRVAL_PP(z_var); if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { if (s1) $1 = estrdup(s1); else $1 = NULL; } } %typemap(varin) SWIGTYPE [] { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if($1) { SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, $owner); } } %typemap(varin) char [ANY] { zval **z_var; char *s1; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); s1 = Z_STRVAL_PP(z_var); if ((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { if (s1) strncpy($1, s1, $1_dim0); } } %typemap(varin) SWIGTYPE { zval **z_var; $&1_ltype _temp; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if (SWIG_ConvertPtr(*z_var, (void**)&_temp, $&1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR,"Type error in value of $symname. Expected $&1_descriptor"); } $1 = *($&1_ltype)_temp; } %typemap(varin) SWIGTYPE *, SWIGTYPE &, SWIGTYPE && { zval **z_var; $1_ltype _temp; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if (SWIG_ConvertPtr(*z_var, (void **)&_temp, $1_descriptor, 0) < 0) { SWIG_PHP_Error(E_ERROR,"Type error in value of $symname. Expected $&1_descriptor"); } $1 = ($1_ltype)_temp; } %typemap(varin, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); void * p = (void*)zend_fetch_resource(*z_var TSRMLS_CC, -1, SWIG_MEMBER_PTR, NULL, 1, swig_member_ptr); memcpy(&$1, p, sizeof($1)); } %typemap(varout) int, unsigned int, unsigned short, short, long, unsigned long, signed char, unsigned char, enum SWIGTYPE { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if($1 != ($1_ltype)((*z_var)->value.lval)) { (*z_var)->value.lval = (long)$1; } } //SAMFIX need to cast zval->type, what if zend-hash_find fails? etc? %typemap(varout) bool { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if($1 != ($1_ltype)((*z_var)->value.lval)) { (*z_var)->value.lval = (long)$1; } } %typemap(varout) double, float { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if($1 != ($1_ltype)((*z_var)->value.dval)) { (*z_var)->value.dval = (double)$1; } } %typemap(varout) char { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if($1 != *((*z_var)->value.str.val)) { char c[2]; efree((*z_var)->value.str.val); c[0] = $1; c[1] = 0; (*z_var)->value.str.val = estrdup(c); } } %typemap(varout) char * { zval **z_var; char *s1; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); s1 = Z_STRVAL_PP(z_var); if((s1 == NULL) || ($1 == NULL) || strcmp(s1, $1)) { if(s1) efree(s1); if($1) { (*z_var)->value.str.val = estrdup($1); (*z_var)->value.str.len = strlen($1) + 1; } else { (*z_var)->value.str.val = 0; (*z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); SWIG_SetPointerZval(*z_var, (void*)&$1, $&1_descriptor, 0); } %typemap(varout) SWIGTYPE [] { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); if($1) SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, 0); } %typemap(varout) char [ANY] { zval **z_var; char *s1; deliberate error cos this code looks bogus to me zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); s1 = Z_STRVAL_PP(z_var); if((s1 == NULL) || strcmp(s1, $1)) { if($1) { (*z_var)->value.str.val = estrdup($1); (*z_var)->value.str.len = strlen($1) + 1; } else { (*z_var)->value.str.val = 0; (*z_var)->value.str.len = 0; } } } %typemap(varout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE && { zval **z_var; zend_hash_find(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void**)&z_var); SWIG_SetPointerZval(*z_var, (void*)$1, $1_descriptor, 0); } %typemap(varout, fragment="swig_php_init_member_ptr") SWIGTYPE (CLASS::*) { void * p = emalloc(sizeof($1)); memcpy(p, &$1, sizeof($1)); zval * resource; MAKE_STD_ZVAL(resource); ZEND_REGISTER_RESOURCE(resource, p, swig_member_ptr); zend_hash_add(&EG(symbol_table), (char*)"$1", sizeof("$1"), (void*)&resource, sizeof(zval *), NULL); } swig-3.0.12/Lib/php5/utils.i0000664000175000017500000000505013042756442015331 0ustar williamwilliam %define CONVERT_BOOL_IN(lvar,t,invar) convert_to_boolean_ex(invar); lvar = (t) Z_LVAL_PP(invar); %enddef %define CONVERT_INT_IN(lvar,t,invar) convert_to_long_ex(invar); lvar = (t) Z_LVAL_PP(invar); %enddef %define CONVERT_LONG_LONG_IN(lvar,t,invar) switch ((*(invar))->type) { case IS_DOUBLE: lvar = (t) (*(invar))->value.dval; break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoll((*(invar))->value.str.val, &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: convert_to_long_ex(invar); lvar = (t) (*(invar))->value.lval; } %enddef %define CONVERT_UNSIGNED_LONG_LONG_IN(lvar,t,invar) switch ((*(invar))->type) { case IS_DOUBLE: lvar = (t) (*(invar))->value.dval; break; case IS_STRING: { char * endptr; errno = 0; lvar = (t) strtoull((*(invar))->value.str.val, &endptr, 10); if (*endptr && !errno) break; /* FALL THRU */ } default: convert_to_long_ex(invar); lvar = (t) (*(invar))->value.lval; } %enddef %define CONVERT_INT_OUT(lvar,invar) lvar = (t) Z_LVAL_PP(invar); %enddef %define CONVERT_FLOAT_IN(lvar,t,invar) convert_to_double_ex(invar); lvar = (t) Z_DVAL_PP(invar); %enddef %define CONVERT_CHAR_IN(lvar,t,invar) convert_to_string_ex(invar); lvar = (t) *Z_STRVAL_PP(invar); %enddef %define CONVERT_STRING_IN(lvar,t,invar) if ((*invar)->type==IS_NULL) { lvar = (t) 0; } else { convert_to_string_ex(invar); lvar = (t) Z_STRVAL_PP(invar); } %enddef %define %pass_by_val( TYPE, CONVERT_IN ) %typemap(in) TYPE %{ CONVERT_IN($1,$1_ltype,$input); %} %typemap(in) const TYPE & ($*1_ltype temp) %{ CONVERT_IN(temp,$*1_ltype,$input); $1 = &temp; %} %typemap(directorout) TYPE %{ CONVERT_IN($result,$1_ltype,&$input); %} %typemap(directorout) const TYPE & ($*1_ltype temp) %{ CONVERT_IN(temp,$*1_ltype,&$input); $result = &temp; %} %enddef %fragment("t_output_helper","header") %{ static void t_output_helper(zval **target, zval *o TSRMLS_DC) { zval *tmp; if ( (*target)->type == IS_ARRAY ) { /* it's already an array, just append */ add_next_index_zval( *target, o ); return; } if ( (*target)->type == IS_NULL ) { REPLACE_ZVAL_VALUE(target,o,1); FREE_ZVAL(o); return; } ALLOC_INIT_ZVAL(tmp); *tmp = **target; zval_copy_ctor(tmp); array_init(*target); add_next_index_zval( *target, tmp); add_next_index_zval( *target, o); } %} swig-3.0.12/Lib/php5/phprun.swg0000664000175000017500000002172213042756442016061 0ustar williamwilliam/* ----------------------------------------------------------------------------- * phprun.swg * * PHP runtime library * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #include "zend.h" #include "zend_API.h" #include "zend_exceptions.h" #include "php.h" #if PHP_MAJOR_VERSION != 5 # error These bindings need PHP5 - to generate PHP7 bindings use: swig -php7 #endif #include "ext/standard/php_string.h" #include /* for abort(), used in generated code. */ #ifdef ZEND_RAW_FENTRY /* ZEND_RAW_FENTRY was added somewhere between 5.2.0 and 5.2.3 */ # define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_RAW_FENTRY((char*)#ZN, N, A, 0) #else /* This causes warnings from GCC >= 4.2 (assigning a string literal to char*). * But this seems to be unavoidable without directly assuming knowledge of * the structure, which changed between PHP4 and PHP5. */ # define SWIG_ZEND_NAMED_FE(ZN, N, A) ZEND_NAMED_FE(ZN, N, A) #endif #ifndef ZEND_FE_END # define ZEND_FE_END { NULL, NULL, NULL } #endif #ifndef Z_SET_ISREF_P /* For PHP < 5.3 */ # define Z_SET_ISREF_P(z) (z)->is_ref = 1 #endif #ifndef Z_SET_REFCOUNT_P /* For PHP < 5.3 */ # define Z_SET_REFCOUNT_P(z, rc) (z)->refcount = (rc) #endif #define SWIG_LONG_CONSTANT(N, V) zend_register_long_constant((char*)#N, sizeof(#N), V, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) #define SWIG_DOUBLE_CONSTANT(N, V) zend_register_double_constant((char*)#N, sizeof(#N), V, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) #define SWIG_STRING_CONSTANT(N, V) zend_register_stringl_constant((char*)#N, sizeof(#N), (char*)(V), strlen(V), CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC) #define SWIG_CHAR_CONSTANT(N, V) do {\ static char swig_char = (V);\ zend_register_stringl_constant((char*)#N, sizeof(#N), &swig_char, 1, CONST_CS | CONST_PERSISTENT, module_number TSRMLS_CC);\ } while (0) /* These TSRMLS_ stuff should already be defined now, but with older php under redhat are not... */ #ifndef TSRMLS_D #define TSRMLS_D #endif #ifndef TSRMLS_DC #define TSRMLS_DC #endif #ifndef TSRMLS_C #define TSRMLS_C #endif #ifndef TSRMLS_CC #define TSRMLS_CC #endif #ifdef __cplusplus } #endif /* But in fact SWIG_ConvertPtr is the native interface for getting typed pointer values out of zvals. We need the TSRMLS_ macros for when we make PHP type calls later as we handle php resources */ #define SWIG_ConvertPtr(obj,pp,type,flags) SWIG_ZTS_ConvertPtr(obj,pp,type,flags TSRMLS_CC) #define SWIG_fail goto fail static const char *default_error_msg = "Unknown error occurred"; static int default_error_code = E_ERROR; #define SWIG_PHP_Arg_Error_Msg(argnum,extramsg) "Error in argument " #argnum " "#extramsg #define SWIG_PHP_Error(code,msg) do { SWIG_ErrorCode() = code; SWIG_ErrorMsg() = msg; SWIG_fail; } while (0) #define SWIG_contract_assert(expr,msg) \ if (!(expr) ) { zend_printf("Contract Assert Failed %s\n",msg ); } else /* Standard SWIG API */ #define SWIG_GetModule(clientdata) SWIG_Php_GetModule() #define SWIG_SetModule(clientdata, pointer) SWIG_Php_SetModule(pointer) /* used to wrap returned objects in so we know whether they are newobject and need freeing, or not */ typedef struct { void * ptr; int newobject; } swig_object_wrapper; #define SWIG_SetPointerZval(a,b,c,d) SWIG_ZTS_SetPointerZval(a,b,c,d TSRMLS_CC) #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) static void SWIG_ZTS_SetPointerZval(zval *z, void *ptr, swig_type_info *type, int newobject TSRMLS_DC) { /* * First test for Null pointers. Return those as PHP native NULL */ if (!ptr ) { ZVAL_NULL(z); return; } if (type->clientdata) { swig_object_wrapper *value; if (! (*(int *)(type->clientdata))) zend_error(E_ERROR, "Type: %s failed to register with zend",type->name); value=(swig_object_wrapper *)emalloc(sizeof(swig_object_wrapper)); value->ptr=ptr; value->newobject=(newobject & 1); if ((newobject & 2) == 0) { /* Just register the pointer as a resource. */ ZEND_REGISTER_RESOURCE(z, value, *(int *)(type->clientdata)); } else { /* * Wrap the resource in an object, the resource will be accessible * via the "_cPtr" member. This is currently only used by * directorin typemaps. */ zval *resource; zend_class_entry **ce = NULL; const char *type_name = type->name+3; /* +3 so: _p_Foo -> Foo */ size_t type_name_len; int result; const char * p; /* Namespace__Foo -> Foo */ /* FIXME: ugly and goes wrong for classes with __ in their names. */ while ((p = strstr(type_name, "__")) != NULL) { type_name = p + 2; } type_name_len = strlen(type_name); MAKE_STD_ZVAL(resource); ZEND_REGISTER_RESOURCE(resource, value, *(int *)(type->clientdata)); if (SWIG_PREFIX_LEN > 0) { char * classname = (char*)emalloc(SWIG_PREFIX_LEN + type_name_len + 1); strcpy(classname, SWIG_PREFIX); strcpy(classname + SWIG_PREFIX_LEN, type_name); result = zend_lookup_class(classname, SWIG_PREFIX_LEN + type_name_len, &ce TSRMLS_CC); efree(classname); } else { result = zend_lookup_class((char *)type_name, type_name_len, &ce TSRMLS_CC); } if (result != SUCCESS) { /* class does not exist */ object_init(z); } else { object_init_ex(z, *ce); } Z_SET_REFCOUNT_P(z, 1); Z_SET_ISREF_P(z); zend_hash_update(HASH_OF(z), (char*)"_cPtr", sizeof("_cPtr"), (void*)&resource, sizeof(zval*), NULL); } return; } zend_error(E_ERROR, "Type: %s not registered with zend",type->name); } /* This pointer conversion routine takes the native pointer p (along with its type name) and converts it by calling appropriate casting functions according to ty. The resultant pointer is returned, or NULL is returned if the pointer can't be cast. Sadly PHP has no API to find a type name from a type id, only from an instance of a resource of the type id, so we have to pass type_name as well. The two functions which might call this are: SWIG_ZTS_ConvertResourcePtr which gets the type name from the resource and the registered zend destructors for which we have one per type each with the type name hard wired in. */ static void * SWIG_ZTS_ConvertResourceData(void * p, const char *type_name, swig_type_info *ty TSRMLS_DC) { swig_cast_info *tc; void *result = 0; if (!ty) { /* They don't care about the target type, so just pass on the pointer! */ return p; } if (! type_name) { /* can't convert p to ptr type ty if we don't know what type p is */ return NULL; } /* convert and cast p from type_name to ptr as ty. */ tc = SWIG_TypeCheck(type_name, ty); if (tc) { int newmemory = 0; result = SWIG_TypeCast(tc, p, &newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } return result; } /* This function returns a pointer of type ty by extracting the pointer and type info from the resource in z. z must be a resource. If it fails, NULL is returned. It uses SWIG_ZTS_ConvertResourceData to do the real work. */ static void * SWIG_ZTS_ConvertResourcePtr(zval *z, swig_type_info *ty, int flags TSRMLS_DC) { swig_object_wrapper *value; void *p; int type; const char *type_name; value = (swig_object_wrapper *) zend_list_find(z->value.lval, &type); if (type==-1) return NULL; if (flags & SWIG_POINTER_DISOWN) { value->newobject = 0; } p = value->ptr; type_name=zend_rsrc_list_get_rsrc_type(z->value.lval TSRMLS_CC); return SWIG_ZTS_ConvertResourceData(p, type_name, ty TSRMLS_CC); } /* We allow passing of a RESOURCE pointing to the object or an OBJECT whose _cPtr is a resource pointing to the object */ static int SWIG_ZTS_ConvertPtr(zval *z, void **ptr, swig_type_info *ty, int flags TSRMLS_DC) { if (z == NULL) { *ptr = 0; return 0; } switch (z->type) { case IS_OBJECT: { zval ** _cPtr; if (zend_hash_find(HASH_OF(z),(char*)"_cPtr",sizeof("_cPtr"),(void**)&_cPtr)==SUCCESS) { if ((*_cPtr)->type==IS_RESOURCE) { *ptr = SWIG_ZTS_ConvertResourcePtr(*_cPtr, ty, flags TSRMLS_CC); return (*ptr == NULL ? -1 : 0); } } break; } case IS_RESOURCE: *ptr = SWIG_ZTS_ConvertResourcePtr(z, ty, flags TSRMLS_CC); return (*ptr == NULL ? -1 : 0); case IS_NULL: *ptr = 0; return 0; } return -1; } static char const_name[] = "swig_runtime_data_type_pointer"; static swig_module_info *SWIG_Php_GetModule() { zval *pointer; swig_module_info *ret = 0; TSRMLS_FETCH(); MAKE_STD_ZVAL(pointer); if (zend_get_constant(const_name, sizeof(const_name) - 1, pointer TSRMLS_CC)) { if (pointer->type == IS_LONG) { ret = (swig_module_info *) pointer->value.lval; } } FREE_ZVAL(pointer); return ret; } static void SWIG_Php_SetModule(swig_module_info *pointer) { TSRMLS_FETCH(); REGISTER_MAIN_LONG_CONSTANT(const_name, (long) pointer, CONST_PERSISTENT | CONST_CS); } swig-3.0.12/Lib/php5/std_common.i0000664000175000017500000000044213042756442016333 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_common.i * * SWIG typemaps for STL - common utilities * ----------------------------------------------------------------------------- */ %include %apply size_t { std::size_t }; swig-3.0.12/Lib/php5/typemaps.i0000664000175000017500000002427513042756442016045 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i. * * SWIG Typemap library for PHP. * * This library provides standard typemaps for modifying SWIG's behavior. * With enough entries in this file, I hope that very few people actually * ever need to write a typemap. * * Define macros to define the following typemaps: * * TYPE *INPUT. Argument is passed in as native variable by value. * TYPE *OUTPUT. Argument is returned as an array from the function call. * TYPE *INOUT. Argument is passed in by value, and out as part of returned list * TYPE *REFERENCE. Argument is passed in as native variable with value * semantics. Variable value is changed with result. * Use like this: * int foo(int *REFERENCE); * * $a = 0; * $rc = foo($a); * * Even though $a looks like it's passed by value, * its value can be changed by foo(). * ----------------------------------------------------------------------------- */ %define BOOL_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ convert_to_boolean_ex($input); temp = Z_LVAL_PP($input) ? true : false; $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval *o; MAKE_STD_ZVAL(o); ZVAL_BOOL(o,temp$argnum); t_output_helper( &$result, o TSRMLS_CC ); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ convert_to_boolean_ex($input); lvalue = (*$input)->value.lval ? true : false; $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ (*$arg)->value.lval = lvalue$argnum ? true : false; (*$arg)->type = IS_BOOL; %} %enddef %define DOUBLE_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ convert_to_double_ex($input); temp = (TYPE) Z_DVAL_PP($input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval *o; MAKE_STD_ZVAL(o); ZVAL_DOUBLE(o,temp$argnum); t_output_helper( &$result, o TSRMLS_CC ); } %typemap(in) TYPE *REFERENCE (TYPE dvalue), TYPE &REFERENCE (TYPE dvalue) %{ convert_to_double_ex($input); dvalue = (TYPE) (*$input)->value.dval; $1 = &dvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ $1->value.dval = (double)(lvalue$argnum); $1->type = IS_DOUBLE; %} %enddef %define INT_TYPEMAP(TYPE) %typemap(in) TYPE *INPUT(TYPE temp), TYPE &INPUT(TYPE temp) %{ convert_to_long_ex($input); temp = (TYPE) Z_LVAL_PP($input); $1 = &temp; %} %typemap(argout) TYPE *INPUT, TYPE &INPUT ""; %typemap(in,numinputs=0) TYPE *OUTPUT(TYPE temp), TYPE &OUTPUT(TYPE temp) "$1 = &temp;"; %typemap(argout,fragment="t_output_helper") TYPE *OUTPUT, TYPE &OUTPUT { zval *o; MAKE_STD_ZVAL(o); ZVAL_LONG(o,temp$argnum); t_output_helper( &$result, o TSRMLS_CC ); } %typemap(in) TYPE *REFERENCE (TYPE lvalue), TYPE &REFERENCE (TYPE lvalue) %{ convert_to_long_ex($input); lvalue = (TYPE) (*$input)->value.lval; $1 = &lvalue; %} %typemap(argout) TYPE *REFERENCE, TYPE &REFERENCE %{ (*$arg)->value.lval = (long)(lvalue$argnum); (*$arg)->type = IS_LONG; %} %enddef BOOL_TYPEMAP(bool); DOUBLE_TYPEMAP(float); DOUBLE_TYPEMAP(double); INT_TYPEMAP(int); INT_TYPEMAP(short); INT_TYPEMAP(long); INT_TYPEMAP(unsigned int); INT_TYPEMAP(unsigned short); INT_TYPEMAP(unsigned long); INT_TYPEMAP(unsigned char); INT_TYPEMAP(signed char); INT_TYPEMAP(long long); %typemap(argout,fragment="t_output_helper") long long *OUTPUT { zval *o; MAKE_STD_ZVAL(o); if ((long long)LONG_MIN <= temp$argnum && temp$argnum <= (long long)LONG_MAX) { ZVAL_LONG(o, temp$argnum); } else { char temp[256]; sprintf(temp, "%lld", (long long)temp$argnum); ZVAL_STRING(o, temp, 1); } t_output_helper( &$result, o TSRMLS_CC ); } %typemap(in) TYPE *REFERENCE (long long lvalue) %{ CONVERT_LONG_LONG_IN(lvalue, long long, $input) $1 = &lvalue; %} %typemap(argout) long long *REFERENCE %{ if ((long long)LONG_MIN <= lvalue$argnum && lvalue$argnum <= (long long)LONG_MAX) { (*$arg)->value.lval = (long)(lvalue$argnum); (*$arg)->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%lld", (long long)lvalue$argnum); ZVAL_STRING((*$arg), temp, 1); } %} %typemap(argout) long long &OUTPUT %{ if ((long long)LONG_MIN <= *arg$argnum && *arg$argnum <= (long long)LONG_MAX) { ($result)->value.lval = (long)(*arg$argnum); ($result)->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%lld", (long long)(*arg$argnum)); ZVAL_STRING($result, temp, 1); } %} INT_TYPEMAP(unsigned long long); %typemap(argout,fragment="t_output_helper") unsigned long long *OUTPUT { zval *o; MAKE_STD_ZVAL(o); if (temp$argnum <= (unsigned long long)LONG_MAX) { ZVAL_LONG(o, temp$argnum); } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)temp$argnum); ZVAL_STRING(o, temp, 1); } t_output_helper( &$result, o TSRMLS_CC ); } %typemap(in) TYPE *REFERENCE (unsigned long long lvalue) %{ CONVERT_UNSIGNED_LONG_LONG_IN(lvalue, unsigned long long, $input) $1 = &lvalue; %} %typemap(argout) unsigned long long *REFERENCE %{ if (lvalue$argnum <= (unsigned long long)LONG_MAX) { (*$arg)->value.lval = (long)(lvalue$argnum); (*$arg)->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)lvalue$argnum); ZVAL_STRING((*$arg), temp, 1); } %} %typemap(argout) unsigned long long &OUTPUT %{ if (*arg$argnum <= (unsigned long long)LONG_MAX) { ($result)->value.lval = (long)(*arg$argnum); ($result)->type = IS_LONG; } else { char temp[256]; sprintf(temp, "%llu", (unsigned long long)(*arg$argnum)); ZVAL_STRING($result, temp, 1); } %} %typemap(in) bool *INOUT = bool *INPUT; %typemap(in) float *INOUT = float *INPUT; %typemap(in) double *INOUT = double *INPUT; %typemap(in) int *INOUT = int *INPUT; %typemap(in) short *INOUT = short *INPUT; %typemap(in) long *INOUT = long *INPUT; %typemap(in) long long *INOUT = long long *INPUT; %typemap(in) unsigned *INOUT = unsigned *INPUT; %typemap(in) unsigned short *INOUT = unsigned short *INPUT; %typemap(in) unsigned long *INOUT = unsigned long *INPUT; %typemap(in) unsigned char *INOUT = unsigned char *INPUT; %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; %typemap(in) signed char *INOUT = signed char *INPUT; %typemap(in) bool &INOUT = bool *INPUT; %typemap(in) float &INOUT = float *INPUT; %typemap(in) double &INOUT = double *INPUT; %typemap(in) int &INOUT = int *INPUT; %typemap(in) short &INOUT = short *INPUT; %typemap(in) long &INOUT = long *INPUT; %typemap(in) long long &INOUT = long long *INPUT; %typemap(in) long long &INPUT = long long *INPUT; %typemap(in) unsigned &INOUT = unsigned *INPUT; %typemap(in) unsigned short &INOUT = unsigned short *INPUT; %typemap(in) unsigned long &INOUT = unsigned long *INPUT; %typemap(in) unsigned char &INOUT = unsigned char *INPUT; %typemap(in) unsigned long long &INOUT = unsigned long long *INPUT; %typemap(in) unsigned long long &INPUT = unsigned long long *INPUT; %typemap(in) signed char &INOUT = signed char *INPUT; %typemap(argout) bool *INOUT = bool *OUTPUT; %typemap(argout) float *INOUT = float *OUTPUT; %typemap(argout) double *INOUT= double *OUTPUT; %typemap(argout) int *INOUT = int *OUTPUT; %typemap(argout) short *INOUT = short *OUTPUT; %typemap(argout) long *INOUT= long *OUTPUT; %typemap(argout) long long *INOUT= long long *OUTPUT; %typemap(argout) unsigned short *INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char *INOUT = signed char *OUTPUT; %typemap(argout) bool &INOUT = bool *OUTPUT; %typemap(argout) float &INOUT = float *OUTPUT; %typemap(argout) double &INOUT= double *OUTPUT; %typemap(argout) int &INOUT = int *OUTPUT; %typemap(argout) short &INOUT = short *OUTPUT; %typemap(argout) long &INOUT= long *OUTPUT; %typemap(argout) long long &INOUT= long long *OUTPUT; %typemap(argout) unsigned short &INOUT= unsigned short *OUTPUT; %typemap(argout) unsigned long &INOUT = unsigned long *OUTPUT; %typemap(argout) unsigned char &INOUT = unsigned char *OUTPUT; %typemap(argout) unsigned long long &INOUT = unsigned long long *OUTPUT; %typemap(argout) signed char &INOUT = signed char *OUTPUT; %typemap(in) char INPUT[ANY] ( char temp[$1_dim0] ) %{ convert_to_string_ex($input); strncpy(temp,Z_STRVAL_PP($input),$1_dim0); $1 = temp; %} %typemap(in,numinputs=0) char OUTPUT[ANY] ( char temp[$1_dim0] ) "$1 = temp;"; %typemap(argout,fragment="t_output_helper") char OUTPUT[ANY] { zval *o; MAKE_STD_ZVAL(o); ZVAL_STRINGL(o,temp$argnum,$1_dim0); t_output_helper( &$result, o TSRMLS_CC ); } %typemap(in,numinputs=0) void **OUTPUT (int force), void *&OUTPUT (int force) %{ /* If they pass NULL by reference, make it into a void* This bit should go in arginit if arginit support init-ing scripting args */ if(SWIG_ConvertPtr(*$input, (void **) &$1, $1_descriptor, 0) < 0) { /* So... we didn't get a ref or ptr, but we'll accept NULL by reference */ if (!((*$input)->type==IS_NULL && PZVAL_IS_REF(*$input))) { /* wasn't a pre/ref/thing, OR anything like an int thing */ SWIG_PHP_Error(E_ERROR, "Type error in argument $arg of $symname."); } } force=0; if (arg1==NULL) { #ifdef __cplusplus ptr=new $*1_ltype(); #else ptr=($*1_ltype) calloc(1,sizeof($*1_ltype)); #endif $1=&ptr; /* have to passback arg$arg too */ force=1; } %} %typemap(argout) void **OUTPUT, void *&OUTPUT %{ if (force$argnum) { /* pass back arg$argnum through params ($arg) if we can */ if (!PZVAL_IS_REF(*$arg)) { SWIG_PHP_Error(E_WARNING, "Parameter $argnum of $symname wasn't passed by reference"); } else { SWIG_SetPointerZval(*$arg, (void *) ptr$argnum, $*1_descriptor, 1); } } %} swig-3.0.12/Lib/php5/std_pair.i0000664000175000017500000000131013042756442015771 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_pair.i * * SWIG typemaps for std::pair * ----------------------------------------------------------------------------- */ %include %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/php5/stl.i0000664000175000017500000000054513042756442014777 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * * Initial STL definition. extended as needed in each language * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/php5/const.i0000664000175000017500000000272413042756442015324 0ustar williamwilliam/* ----------------------------------------------------------------------------- * const.i * * Typemaps for constants * ----------------------------------------------------------------------------- */ %typemap(consttab) int, unsigned int, short, unsigned short, long, unsigned long, unsigned char, signed char, bool, enum SWIGTYPE "SWIG_LONG_CONSTANT($symname, ($1_type)$value);"; %typemap(consttab) float, double "SWIG_DOUBLE_CONSTANT($symname, $value);"; %typemap(consttab) char "SWIG_CHAR_CONSTANT($symname, $value);"; %typemap(consttab) char *, const char *, char [], const char [] "SWIG_STRING_CONSTANT($symname, $value);"; %typemap(consttab) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] { zval *z_var; zend_constant c; size_t len = sizeof("$symname") - 1; MAKE_STD_ZVAL(z_var); SWIG_SetPointerZval(z_var, (void*)$value, $1_descriptor, 0); c.value = *z_var; zval_copy_ctor(&c.value); c.name = zend_strndup("$symname", len); c.name_len = len+1; c.flags = CONST_CS | CONST_PERSISTENT; c.module_number = module_number; zend_register_constant( &c TSRMLS_CC ); } /* Handled as a global variable. */ %typemap(consttab) SWIGTYPE (CLASS::*) ""; swig-3.0.12/Lib/php5/std_string.i0000664000175000017500000000457613042756442016365 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_string.i * * SWIG typemaps for std::string types * ----------------------------------------------------------------------------- */ // ------------------------------------------------------------------------ // std::string is typemapped by value // This can prevent exporting methods which return a string // in order for the user to modify it. // However, I think I'll wait until someone asks for it... // ------------------------------------------------------------------------ %include %{ #include %} namespace std { %naturalvar string; class string; %typemap(typecheck,precedence=SWIG_TYPECHECK_STRING) string, const string& %{ $1 = ( Z_TYPE_PP($input) == IS_STRING ) ? 1 : 0; %} %typemap(in) string %{ convert_to_string_ex($input); $1.assign(Z_STRVAL_PP($input), Z_STRLEN_PP($input)); %} %typemap(directorout) string %{ convert_to_string_ex(&$input); $result.assign(Z_STRVAL_P($input), Z_STRLEN_P($input)); %} %typemap(out) string %{ ZVAL_STRINGL($result, const_cast($1.data()), $1.size(), 1); %} %typemap(directorin) string, const string& %{ ZVAL_STRINGL($input, const_cast($1.data()), $1.size(), 1); %} %typemap(out) const string & %{ ZVAL_STRINGL($result, const_cast($1->data()), $1->size(), 1); %} %typemap(throws) string, const string& %{ zend_throw_exception(NULL, const_cast($1.c_str()), 0 TSRMLS_CC); return; %} /* These next two handle a function which takes a non-const reference to * a std::string and modifies the string. */ %typemap(in) string & ($*1_ltype temp) %{ convert_to_string_ex($input); temp.assign(Z_STRVAL_PP($input), Z_STRLEN_PP($input)); $1 = &temp; %} %typemap(directorout) string & ($*1_ltype *temp) %{ convert_to_string_ex(&$input); temp = new $*1_ltype(Z_STRVAL_P($input), Z_STRLEN_P($input)); swig_acquire_ownership(temp); $result = temp; %} %typemap(argout) string & %{ ZVAL_STRINGL(*($input), const_cast($1->data()), $1->size(), 1); %} /* SWIG will apply the non-const typemap above to const string& without * this more specific typemap. */ %typemap(argout) const string & ""; } swig-3.0.12/Lib/php5/std_map.i0000664000175000017500000000453513042756442015627 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } bool is_empty() const { return self->empty(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/php5/phpinit.swg0000664000175000017500000000130013042756442016206 0ustar williamwilliam /* ------------------------------------------------------------ * The start of the PHP initialization function * ------------------------------------------------------------ */ %insert(init) "swiginit.swg" %init %{ SWIG_php_minit { SWIG_InitializeModule(0); %} %fragment("swig_php_init_member_ptr2", "header") { #define SWIG_MEMBER_PTR ((char*)"CLASS::*") static void swig_member_ptr_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC) { efree(rsrc->ptr); } static int swig_member_ptr = 0; } %fragment("swig_php_init_member_ptr", "init", fragment="swig_php_init_member_ptr2") { swig_member_ptr = zend_register_list_destructors_ex(swig_member_ptr_dtor, NULL, SWIG_MEMBER_PTR, module_number); } swig-3.0.12/Lib/php5/factory.i0000664000175000017500000000604513042756442015645 0ustar williamwilliam/* Implement a more natural wrap for factory methods, for example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where circle is a Circle proxy instance. NOTES: remember to fully qualify all the type names and don't use %factory inside a namespace declaration, ie, instead of namespace Foo { %factory(Geometry *Geometry::create, Point, Circle); } use %factory(Foo::Geometry *Foo::Geometry::create, Foo::Point, Foo::Circle); */ /* for loop for macro with one argument */ %define %_formacro_1(macro, arg1,...)macro(arg1) #if #__VA_ARGS__ != "__fordone__" %_formacro_1(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with one argument */ %define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef %define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef /* for loop for macro with two arguments */ %define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) #if #__VA_ARGS__ != "__fordone__" %_formacro_2(macro, __VA_ARGS__) #endif %enddef /* for loop for macro with two arguments */ %define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef %define %_factory_dispatch(Type) if (!dcast) { Type *dobj = dynamic_cast($1); if (dobj) { dcast = 1; SWIG_SetPointerZval(return_value, SWIG_as_voidptr(dobj),$descriptor(Type *), $owner); } }%enddef %define %factory(Method,Types...) %typemap(out) Method { int dcast = 0; %formacro(%_factory_dispatch, Types) if (!dcast) { SWIG_SetPointerZval(return_value, SWIG_as_voidptr($1),$descriptor, $owner); } }%enddef swig-3.0.12/Lib/java/0000775000175000017500000000000013042756442014064 5ustar williamwilliamswig-3.0.12/Lib/java/std_deque.i0000664000175000017500000000003413042756442016210 0ustar williamwilliam%include swig-3.0.12/Lib/java/javakw.swg0000664000175000017500000000236613042756442016100 0ustar williamwilliam#ifndef JAVA_JAVAKW_SWG_ #define JAVA_JAVAKW_SWG_ /* Warnings for Java keywords */ #define JAVAKW(x) %keywordwarn("'" `x` "' is a java keyword, renaming to '_"`x`"'",rename="_%s") `x` /* from http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html */ JAVAKW(abstract); JAVAKW(double); JAVAKW(int); JAVAKW(strictfp); JAVAKW(boolean); JAVAKW(else); JAVAKW(interface); JAVAKW(super); JAVAKW(break); JAVAKW(extends); JAVAKW(long); JAVAKW(switch); JAVAKW(byte); JAVAKW(final); JAVAKW(native); JAVAKW(synchronized); JAVAKW(case); JAVAKW(finally); JAVAKW(new); JAVAKW(this); JAVAKW(catch); JAVAKW(float); JAVAKW(package); JAVAKW(throw); JAVAKW(char); JAVAKW(for); JAVAKW(private); JAVAKW(throws); JAVAKW(class); JAVAKW(goto); JAVAKW(protected); JAVAKW(transient); JAVAKW(const); JAVAKW(if); JAVAKW(public); JAVAKW(try); JAVAKW(continue); JAVAKW(implements); JAVAKW(return); JAVAKW(void); JAVAKW(default); JAVAKW(import); JAVAKW(short); JAVAKW(volatile); JAVAKW(do); JAVAKW(instanceof); JAVAKW(static); JAVAKW(while); /* others bad names */ /* Note here that only *::clone() is bad, and *::clone(int) is ok */ %namewarn("321:clone() is a java bad method name") *::clone(); #undef JAVAKW #endif //JAVA_JAVAKW_SWG_ swig-3.0.12/Lib/java/director.swg0000664000175000017500000003202513042756442016423 0ustar williamwilliam/* ----------------------------------------------------------------------------- * director.swg * * This file contains support for director classes so that Java proxy * methods can be called from C++. * ----------------------------------------------------------------------------- */ #if defined(DEBUG_DIRECTOR_OWNED) || defined(DEBUG_DIRECTOR_EXCEPTION) #include #endif #include namespace Swig { /* Java object wrapper */ class JObjectWrapper { public: JObjectWrapper() : jthis_(NULL), weak_global_(true) { } ~JObjectWrapper() { jthis_ = NULL; weak_global_ = true; } bool set(JNIEnv *jenv, jobject jobj, bool mem_own, bool weak_global) { if (!jthis_) { weak_global_ = weak_global || !mem_own; // hold as weak global if explicitly requested or not owned if (jobj) jthis_ = weak_global_ ? jenv->NewWeakGlobalRef(jobj) : jenv->NewGlobalRef(jobj); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> " << jthis_ << std::endl; #endif return true; } else { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::set(" << jobj << ", " << (weak_global ? "weak_global" : "global_ref") << ") -> already set" << std::endl; #endif return false; } } jobject get(JNIEnv *jenv) const { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::get("; if (jthis_) std::cout << jthis_; else std::cout << "null"; std::cout << ") -> return new local ref" << std::endl; #endif return (jthis_ ? jenv->NewLocalRef(jthis_) : jthis_); } void release(JNIEnv *jenv) { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "JObjectWrapper::release(" << jthis_ << "): " << (weak_global_ ? "weak global ref" : "global ref") << std::endl; #endif if (jthis_) { if (weak_global_) { if (jenv->IsSameObject(jthis_, NULL) == JNI_FALSE) jenv->DeleteWeakGlobalRef((jweak)jthis_); } else jenv->DeleteGlobalRef(jthis_); } jthis_ = NULL; weak_global_ = true; } /* Only call peek if you know what you are doing wrt to weak/global references */ jobject peek() { return jthis_; } /* Java proxy releases ownership of C++ object, C++ object is now responsible for destruction (creates NewGlobalRef to pin Java proxy) */ void java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { if (take_or_release) { /* Java takes ownership of C++ object's lifetime. */ if (!weak_global_) { jenv->DeleteGlobalRef(jthis_); jthis_ = jenv->NewWeakGlobalRef(jself); weak_global_ = true; } } else { /* Java releases ownership of C++ object's lifetime */ if (weak_global_) { jenv->DeleteWeakGlobalRef((jweak)jthis_); jthis_ = jenv->NewGlobalRef(jself); weak_global_ = false; } } } private: /* pointer to Java object */ jobject jthis_; /* Local or global reference flag */ bool weak_global_; }; /* Local JNI reference deleter */ class LocalRefGuard { JNIEnv *jenv_; jobject jobj_; // non-copyable LocalRefGuard(const LocalRefGuard &); LocalRefGuard &operator=(const LocalRefGuard &); public: LocalRefGuard(JNIEnv *jenv, jobject jobj): jenv_(jenv), jobj_(jobj) {} ~LocalRefGuard() { if (jobj_) jenv_->DeleteLocalRef(jobj_); } }; /* director base class */ class Director { /* pointer to Java virtual machine */ JavaVM *swig_jvm_; protected: #if defined (_MSC_VER) && (_MSC_VER<1300) class JNIEnvWrapper; friend class JNIEnvWrapper; #endif /* Utility class for managing the JNI environment */ class JNIEnvWrapper { const Director *director_; JNIEnv *jenv_; int env_status; public: JNIEnvWrapper(const Director *director) : director_(director), jenv_(0), env_status(0) { #if defined(__ANDROID__) JNIEnv **jenv = &jenv_; #else void **jenv = (void **)&jenv_; #endif env_status = director_->swig_jvm_->GetEnv((void **)&jenv_, JNI_VERSION_1_2); #if defined(SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON) // Attach a daemon thread to the JVM. Useful when the JVM should not wait for // the thread to exit upon shutdown. Only for jdk-1.4 and later. director_->swig_jvm_->AttachCurrentThreadAsDaemon(jenv, NULL); #else director_->swig_jvm_->AttachCurrentThread(jenv, NULL); #endif } ~JNIEnvWrapper() { #if !defined(SWIG_JAVA_NO_DETACH_CURRENT_THREAD) // Some JVMs, eg jdk-1.4.2 and lower on Solaris have a bug and crash with the DetachCurrentThread call. // However, without this call, the JVM hangs on exit when the thread was not created by the JVM and creates a memory leak. if (env_status == JNI_EDETACHED) director_->swig_jvm_->DetachCurrentThread(); #endif } JNIEnv *getJNIEnv() const { return jenv_; } }; /* Java object wrapper */ JObjectWrapper swig_self_; /* Disconnect director from Java object */ void swig_disconnect_director_self(const char *disconn_method) { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; jobject jobj = swig_self_.get(jenv); LocalRefGuard ref_deleter(jenv, jobj); #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self(" << jobj << ")" << std::endl; #endif if (jobj && jenv->IsSameObject(jobj, NULL) == JNI_FALSE) { jmethodID disconn_meth = jenv->GetMethodID(jenv->GetObjectClass(jobj), disconn_method, "()V"); if (disconn_meth) { #if defined(DEBUG_DIRECTOR_OWNED) std::cout << "Swig::Director::disconnect_director_self upcall to " << disconn_method << std::endl; #endif jenv->CallVoidMethod(jobj, disconn_meth); } } } public: Director(JNIEnv *jenv) : swig_jvm_((JavaVM *) NULL), swig_self_() { /* Acquire the Java VM pointer */ jenv->GetJavaVM(&swig_jvm_); } virtual ~Director() { JNIEnvWrapper jnienv(this) ; JNIEnv *jenv = jnienv.getJNIEnv() ; swig_self_.release(jenv); } bool swig_set_self(JNIEnv *jenv, jobject jself, bool mem_own, bool weak_global) { return swig_self_.set(jenv, jself, mem_own, weak_global); } jobject swig_get_self(JNIEnv *jenv) const { return swig_self_.get(jenv); } // Change C++ object's ownership, relative to Java void swig_java_change_ownership(JNIEnv *jenv, jobject jself, bool take_or_release) { swig_self_.java_change_ownership(jenv, jself, take_or_release); } }; // Zero initialized bool array template class BoolArray { bool array_[N]; public: BoolArray() { memset(array_, 0, sizeof(array_)); } bool& operator[](size_t n) { return array_[n]; } bool operator[](size_t n) const { return array_[n]; } }; // Utility classes and functions for exception handling. // Simple holder for a Java string during exception handling, providing access to a c-style string class JavaString { public: JavaString(JNIEnv *jenv, jstring jstr) : jenv_(jenv), jstr_(jstr), cstr_(0) { if (jenv_ && jstr_) cstr_ = (const char *) jenv_->GetStringUTFChars(jstr_, NULL); } ~JavaString() { if (jenv_ && jstr_ && cstr_) jenv_->ReleaseStringUTFChars(jstr_, cstr_); } const char *c_str(const char *null_string = "null JavaString") const { return cstr_ ? cstr_ : null_string; } private: // non-copyable JavaString(const JavaString &); JavaString &operator=(const JavaString &); JNIEnv *jenv_; jstring jstr_; const char *cstr_; }; // Helper class to extract the exception message from a Java throwable class JavaExceptionMessage { public: JavaExceptionMessage(JNIEnv *jenv, jthrowable throwable) : message_(jenv, exceptionMessageFromThrowable(jenv, throwable)) { } const char *message() const { return message_.c_str("Could not get exception message in JavaExceptionMessage"); } private: // non-copyable JavaExceptionMessage(const JavaExceptionMessage &); JavaExceptionMessage &operator=(const JavaExceptionMessage &); // Get exception message by calling Java method Throwable.getMessage() static jstring exceptionMessageFromThrowable(JNIEnv *jenv, jthrowable throwable) { jstring jmsg = NULL; if (jenv && throwable) { jenv->ExceptionClear(); // Cannot invoke methods with any pending exceptions jclass throwclz = jenv->GetObjectClass(throwable); if (throwclz) { // All Throwable classes have a getMessage() method, so call it to extract the exception message jmethodID getMessageMethodID = jenv->GetMethodID(throwclz, "getMessage", "()Ljava/lang/String;"); if (getMessageMethodID) jmsg = (jstring)jenv->CallObjectMethod(throwable, getMessageMethodID); } if (jmsg == NULL && jenv->ExceptionCheck()) jenv->ExceptionClear(); } return jmsg; } JavaString message_; }; // C++ Exception class for handling Java exceptions thrown during a director method Java upcall class DirectorException : public std::exception { public: // Construct exception from a Java throwable DirectorException(JNIEnv *jenv, jthrowable throwable) : classname_(0), msg_(0) { // Call Java method Object.getClass().getName() to obtain the throwable's class name (delimited by '/') if (throwable) { jclass throwclz = jenv->GetObjectClass(throwable); if (throwclz) { jclass clzclz = jenv->GetObjectClass(throwclz); if (clzclz) { jmethodID getNameMethodID = jenv->GetMethodID(clzclz, "getName", "()Ljava/lang/String;"); if (getNameMethodID) { jstring jstr_classname = (jstring)(jenv->CallObjectMethod(throwclz, getNameMethodID)); // Copy strings, since there is no guarantee that jenv will be active when handled if (jstr_classname) { JavaString jsclassname(jenv, jstr_classname); const char *classname = jsclassname.c_str(0); if (classname) classname_ = copypath(classname); } } } } } JavaExceptionMessage exceptionmsg(jenv, throwable); msg_ = copystr(exceptionmsg.message()); } // More general constructor for handling as a java.lang.RuntimeException DirectorException(const char *msg) : classname_(0), msg_(copystr(msg ? msg : "Unspecified DirectorException message")) { } ~DirectorException() throw() { delete[] classname_; delete[] msg_; } const char *what() const throw() { return msg_; } // Reconstruct and raise/throw the Java Exception that caused the DirectorException // Note that any error in the JNI exception handling results in a Java RuntimeException void raiseJavaException(JNIEnv *jenv) const { if (jenv) { jenv->ExceptionClear(); jmethodID ctorMethodID = 0; jclass throwableclass = 0; if (classname_) { throwableclass = jenv->FindClass(classname_); if (throwableclass) ctorMethodID = jenv->GetMethodID(throwableclass, "", "(Ljava/lang/String;)V"); } if (ctorMethodID) { jenv->ThrowNew(throwableclass, what()); } else { SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, what()); } } } private: static char *copypath(const char *srcmsg) { char *target = copystr(srcmsg); for (char *c=target; *c; ++c) { if ('.' == *c) *c = '/'; } return target; } static char *copystr(const char *srcmsg) { char *target = 0; if (srcmsg) { size_t msglen = strlen(srcmsg) + 1; target = new char[msglen]; strncpy(target, srcmsg, msglen); } return target; } const char *classname_; const char *msg_; }; // Helper method to determine if a Java throwable matches a particular Java class type SWIGINTERN bool ExceptionMatches(JNIEnv *jenv, jthrowable throwable, const char *classname) { bool matches = false; if (throwable && jenv && classname) { // Exceptions need to be cleared for correct behavior. // The caller of ExceptionMatches should restore pending exceptions if desired - // the caller already has the throwable. jenv->ExceptionClear(); jclass clz = jenv->FindClass(classname); if (clz) { jclass classclz = jenv->GetObjectClass(clz); jmethodID isInstanceMethodID = jenv->GetMethodID(classclz, "isInstance", "(Ljava/lang/Object;)Z"); if (isInstanceMethodID) { matches = jenv->CallBooleanMethod(clz, isInstanceMethodID, throwable) != 0; } } #if defined(DEBUG_DIRECTOR_EXCEPTION) if (jenv->ExceptionCheck()) { // Typically occurs when an invalid classname argument is passed resulting in a ClassNotFoundException JavaExceptionMessage exc(jenv, jenv->ExceptionOccurred()); std::cout << "Error: ExceptionMatches: class '" << classname << "' : " << exc.message() << std::endl; } #endif } return matches; } } swig-3.0.12/Lib/java/std_shared_ptr.i0000664000175000017500000000010413042756442017236 0ustar williamwilliam#define SWIG_SHARED_PTR_NAMESPACE std %include swig-3.0.12/Lib/java/arrays_java.i0000664000175000017500000003260513042756442016546 0ustar williamwilliam/* ----------------------------------------------------------------------------- * arrays_java.i * * These typemaps give more natural support for arrays. The typemaps are not efficient * as there is a lot of copying of the array values whenever the array is passed to C/C++ * from Java and vice versa. The Java array is expected to be the same size as the C array. * An exception is thrown if they are not. * * Example usage: * Wrapping: * * %include * %inline %{ * short FiddleSticks[3]; * %} * * Use from Java like this: * * short[] fs = new short[] {10, 11, 12}; * example.setFiddleSticks(fs); * fs = example.getFiddleSticks(); * ----------------------------------------------------------------------------- */ /* Primitive array support is a combination of SWIG macros and functions in order to reduce * code bloat and aid maintainability. The SWIG preprocessor expands the macros into functions * for inclusion in the generated code. */ /* Array support functions declarations macro */ %define JAVA_ARRAYS_DECL(CTYPE, JNITYPE, JAVATYPE, JFUNCNAME) %{ static int SWIG_JavaArrayIn##JFUNCNAME (JNIEnv *jenv, JNITYPE **jarr, CTYPE **carr, JNITYPE##Array input); static void SWIG_JavaArrayArgout##JFUNCNAME (JNIEnv *jenv, JNITYPE *jarr, CTYPE *carr, JNITYPE##Array input); static JNITYPE##Array SWIG_JavaArrayOut##JFUNCNAME (JNIEnv *jenv, CTYPE *result, jsize sz); %} %enddef /* Array support functions macro */ %define JAVA_ARRAYS_IMPL(CTYPE, JNITYPE, JAVATYPE, JFUNCNAME) %{ /* CTYPE[] support */ static int SWIG_JavaArrayIn##JFUNCNAME (JNIEnv *jenv, JNITYPE **jarr, CTYPE **carr, JNITYPE##Array input) { int i; jsize sz; if (!input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null array"); return 0; } sz = JCALL1(GetArrayLength, jenv, input); *jarr = JCALL2(Get##JAVATYPE##ArrayElements, jenv, input, 0); if (!*jarr) return 0; %} #ifdef __cplusplus %{ *carr = new CTYPE[sz]; %} #else %{ *carr = (CTYPE*) malloc(sz * sizeof(CTYPE)); %} #endif %{ if (!*carr) { SWIG_JavaThrowException(jenv, SWIG_JavaOutOfMemoryError, "array memory allocation failed"); return 0; } for (i=0; i %{ #include #include %} namespace std { template class vector { public: typedef size_t size_type; typedef T value_type; typedef const value_type& const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i class vector { public: typedef size_t size_type; typedef bool value_type; typedef bool const_reference; vector(); vector(size_type n); size_type size() const; size_type capacity() const; void reserve(size_type n); %rename(isEmpty) empty; bool empty() const; void clear(); %rename(add) push_back; void push_back(const value_type& x); %extend { bool get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && iGetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); if ($1_len) { $1.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1.push_back((wchar_t)$1_pstr[i]); } } jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorout) wstring %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); if ($1_len) { $result.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $result.push_back((wchar_t)$1_pstr[i]); } } jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") wstring %{ jsize $1_len = $1.length(); jchar *$1_conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { $1_conv_buf[i] = (jchar)$1[i]; } $input = jenv->NewString($1_conv_buf, $1_len); Swig::LocalRefGuard $1_refguard(jenv, $input); delete [] $1_conv_buf; %} %typemap(out) wstring %{jsize $1_len = $1.length(); jchar *conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { conv_buf[i] = (jchar)$1[i]; } $result = jenv->NewString(conv_buf, $1_len); delete [] conv_buf; %} %typemap(javain) wstring "$javainput" %typemap(javaout) wstring { return $jnicall; } //%typemap(typecheck) wstring = wchar_t *; %typemap(throws) wstring %{ std::string message($1.begin(), $1.end()); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, message.c_str()); return $null; %} // const wstring & %typemap(jni) const wstring & "jstring" %typemap(jtype) const wstring & "String" %typemap(jstype) const wstring & "String" %typemap(javadirectorin) const wstring & "$jniinput" %typemap(javadirectorout) const wstring & "$javacall" %typemap(in) const wstring & %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); std::wstring $1_str; if ($1_len) { $1_str.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1_str.push_back((wchar_t)$1_pstr[i]); } } $1 = &$1_str; jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const wstring & %{if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null std::wstring"); return $null; } const jchar *$1_pstr = jenv->GetStringChars($input, 0); if (!$1_pstr) return $null; jsize $1_len = jenv->GetStringLength($input); /* possible thread/reentrant code problem */ static std::wstring $1_str; if ($1_len) { $1_str.reserve($1_len); for (jsize i = 0; i < $1_len; ++i) { $1_str.push_back((wchar_t)$1_pstr[i]); } } $result = &$1_str; jenv->ReleaseStringChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") const wstring & %{ jsize $1_len = $1.length(); jchar *$1_conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { $1_conv_buf[i] = (jchar)($1)[i]; } $input = jenv->NewString($1_conv_buf, $1_len); Swig::LocalRefGuard $1_refguard(jenv, $input); delete [] $1_conv_buf; %} %typemap(out) const wstring & %{jsize $1_len = $1->length(); jchar *conv_buf = new jchar[$1_len]; for (jsize i = 0; i < $1_len; ++i) { conv_buf[i] = (jchar)(*$1)[i]; } $result = jenv->NewString(conv_buf, $1_len); delete [] conv_buf; %} %typemap(javain) const wstring & "$javainput" %typemap(javaout) const wstring & { return $jnicall; } //%typemap(typecheck) const wstring & = wchar_t *; %typemap(throws) const wstring & %{ std::string message($1.begin(), $1.end()); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, message.c_str()); return $null; %} } swig-3.0.12/Lib/java/enumtypeunsafe.swg0000664000175000017500000000524313042756442017662 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypeunsafe.swg * * Include this file in order for C/C++ enums to be wrapped by integers values. * Each enum has an equivalent class named after the enum and the enum items are * wrapped by constant integers within this class. The enum items are not * typesafe as they are all integers. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="I") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$jniinput" %typemap(javadirectorout) const enum SWIGTYPE & "$javacall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput" %typemap(javaout) const enum SWIGTYPE & { return $jnicall; } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="I") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$jniinput" %typemap(javadirectorout) enum SWIGTYPE "$javacall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput" %typemap(javaout) enum SWIGTYPE { return $jnicall; } // '$static' will be replaced with either 'static' or nothing depending on whether the enum is an inner Java class or not %typemap(javaclassmodifiers) enum SWIGTYPE "public final $static class" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" %typemap(javabody) enum SWIGTYPE "" %javaenum(typeunsafe); swig-3.0.12/Lib/java/boost_intrusive_ptr.i0000664000175000017500000004741413042756442020373 0ustar williamwilliam// Users can provide their own SWIG_INTRUSIVE_PTR_TYPEMAPS or SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP macros before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP #define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif #ifndef SWIG_INTRUSIVE_PTR_TYPEMAPS #define SWIG_INTRUSIVE_PTR_TYPEMAPS(CONST, TYPE...) SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_INTRUSIVE_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE "(void)arg1; delete smartarg1;" // Typemap customisations... %typemap(in) CONST TYPE ($&1_type argp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain value argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out, fragment="SWIG_intrusive_deleter") CONST TYPE %{ //plain value(out) $1_ltype* resultp = new $1_ltype(($1_ltype &)$1); intrusive_ptr_add_ref(resultp); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(resultp, SWIG_intrusive_deleter< CONST TYPE >()); %} %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE * %{ //plain pointer(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) CONST TYPE & (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain reference $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if(!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") CONST TYPE & %{ //plain reference(out) #if ($owner) if ($1) { intrusive_ptr_add_ref($1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_0) : 0; #endif %} %typemap(in) TYPE *CONST& ($*1_ltype temp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ // plain pointer by reference temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_intrusive_deleter,SWIG_null_deleter") TYPE *CONST& %{ // plain pointer by reference(out) #if ($owner) if (*$1) { intrusive_ptr_add_ref(*$1); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1, SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } #else *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_0); #endif %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > ($&1_type argp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by value smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if (smartarg) { $1 = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > %{ if ($1) { intrusive_ptr_add_ref(result.get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(result.get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by reference if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ delete &($1); if ($self) { SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * temp = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); $1 = *temp; } %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & %{ if (*$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * ($*1_ltype tempnull, $*1_ltype temp, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer if ( $input ) { smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); $1 = &temp; } else { $1 = &tempnull; } %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ delete $1; if ($self) $1 = new SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(*$input); %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * %{ if ($1 && *$1) { intrusive_ptr_add_ref($1->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } if ($owner) delete $1; %} %typemap(in) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& (SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > temp, $*1_ltype tempp = 0, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * smartarg) %{ // intrusive_ptr by pointer reference smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >**)&$input; if ($input) { temp = SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >(smartarg->get(), true); } tempp = &temp; $1 = &tempp; %} %typemap(memberin) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if ($self) $1 = *$input; %} %typemap(out, fragment="SWIG_intrusive_deleter") SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& %{ if (*$1 && **$1) { intrusive_ptr_add_ref((*$1)->get()); *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >((*$1)->get(), SWIG_intrusive_deleter< CONST TYPE >()); } else { *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = 0; } %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "jlong" %typemap (jtype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "long" %typemap (jstype) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(jstype, TYPE)" %typemap(javain) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > &, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *, SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > & { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE > *& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnBase; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if(swigCPtr != 0 && swigCMemOwnBase) { swigCMemOwnBase = false; $jnicall; } swigCPtr = 0; } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if(swigCPtr != 0 && swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; super.delete(); } // CONST version needed ???? also for C# %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "long" %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "long" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %template() SWIG_INTRUSIVE_PTR_QNAMESPACE::intrusive_ptr< CONST TYPE >; %enddef ///////////////////////////////////////////////////////////////////// %include %define SWIG_INTRUSIVE_PTR_TYPEMAPS_NO_WRAP_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor mods %feature("unref") TYPE "(void)arg1; delete smartarg1;" // plain value %typemap(in) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = ($*1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast ($&1_type smartarg) %{ // shared_ptr by value smartarg = *($&1_ltype*)&$input; if (smartarg) $1 = *smartarg; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ANY_TYPE_SWIGSharedPtrUpcast %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "jlong" %typemap (jtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "long" %typemap (jstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE)" %typemap (javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnBase; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwnBase = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnBase) { swigCMemOwnBase = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; } super.delete(); } // CONST version needed ???? also for C# %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< TYPE > swigSharedPtrUpcast "long" %typemap(jtype, nopgcpp="1") SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > swigSharedPtrUpcast "long" %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/java/std_common.i0000664000175000017500000000014613042756442016401 0ustar williamwilliam%include %apply size_t { std::size_t }; %apply const size_t& { const std::size_t& }; swig-3.0.12/Lib/java/std_except.i0000664000175000017500000000402713042756442016403 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_except.i * * Typemaps used by the STL wrappers that throw exceptions. * These typemaps are used when methods are declared with an STL exception specification, such as * size_t at() const throw (std::out_of_range); * ----------------------------------------------------------------------------- */ %{ #include #include %} namespace std { %ignore exception; struct exception {}; } %typemap(throws) std::bad_cast "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::bad_exception "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::domain_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::exception "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::invalid_argument "SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, $1.what());\n return $null;" %typemap(throws) std::length_error "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::logic_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::out_of_range "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::overflow_error "SWIG_JavaThrowException(jenv, SWIG_JavaArithmeticException, $1.what());\n return $null;" %typemap(throws) std::range_error "SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, $1.what());\n return $null;" %typemap(throws) std::runtime_error "SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.what());\n return $null;" %typemap(throws) std::underflow_error "SWIG_JavaThrowException(jenv, SWIG_JavaArithmeticException, $1.what());\n return $null;" swig-3.0.12/Lib/java/enumtypesafe.swg0000664000175000017500000001103113042756442017307 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumtypesafe.swg * * Include this file in order for C/C++ enums to be wrapped by the so called * typesafe enum pattern. Each enum has an equivalent Java class named after the * enum and each enum item is a static instance of this class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "$*javaclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="L$packagepath/$*javaclassname;") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$*javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) const enum SWIGTYPE & "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput.swigValue()" %typemap(javaout) const enum SWIGTYPE & { return $*javaclassname.swigToEnum($jnicall); } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "$javaclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="L$packagepath/$javaclassname;") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) enum SWIGTYPE "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput.swigValue()" %typemap(javaout) enum SWIGTYPE { return $javaclassname.swigToEnum($jnicall); } // '$static' will be replaced with either 'static' or nothing depending on whether the enum is an inner Java class or not %typemap(javaclassmodifiers) enum SWIGTYPE "public final $static class" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" /* * The swigToEnum method is used to find the Java enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. * The special variable, $enumvalues, is replaced with a comma separated list of all the enum values. */ %typemap(javabody) enum SWIGTYPE %{ public final int swigValue() { return swigValue; } public String toString() { return swigName; } public static $javaclassname swigToEnum(int swigValue) { if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for (int i = 0; i < swigValues.length; i++) if (swigValues[i].swigValue == swigValue) return swigValues[i]; throw new IllegalArgumentException("No enum " + $javaclassname.class + " with value " + swigValue); } private $javaclassname(String swigName) { this.swigName = swigName; this.swigValue = swigNext++; } private $javaclassname(String swigName, int swigValue) { this.swigName = swigName; this.swigValue = swigValue; swigNext = swigValue+1; } private $javaclassname(String swigName, $javaclassname swigEnum) { this.swigName = swigName; this.swigValue = swigEnum.swigValue; swigNext = this.swigValue+1; } private static $javaclassname[] swigValues = { $enumvalues }; private static int swigNext = 0; private final int swigValue; private final String swigName; %} %javaenum(typesafe); swig-3.0.12/Lib/java/java.swg0000664000175000017500000013713213042756442015536 0ustar williamwilliam/* ----------------------------------------------------------------------------- * java.swg * * Java typemaps * ----------------------------------------------------------------------------- */ %include /* The jni, jtype and jstype typemaps work together and so there should be one of each. * The jni typemap contains the JNI type used in the JNI (C/C++) code. * The jtype typemap contains the Java type used in the JNI intermediary class. * The jstype typemap contains the Java type used in the Java proxy classes, type wrapper classes and module class. */ /* Fragments */ %fragment("SWIG_PackData", "header") { /* Pack binary data into a string */ SWIGINTERN char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } } %fragment("SWIG_UnPackData", "header") { /* Unpack binary data from a string */ SWIGINTERN const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = ((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = ((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } } /* Primitive types */ %typemap(jni) bool, const bool & "jboolean" %typemap(jni) char, const char & "jchar" %typemap(jni) signed char, const signed char & "jbyte" %typemap(jni) unsigned char, const unsigned char & "jshort" %typemap(jni) short, const short & "jshort" %typemap(jni) unsigned short, const unsigned short & "jint" %typemap(jni) int, const int & "jint" %typemap(jni) unsigned int, const unsigned int & "jlong" %typemap(jni) long, const long & "jint" %typemap(jni) unsigned long, const unsigned long & "jlong" %typemap(jni) long long, const long long & "jlong" %typemap(jni) unsigned long long, const unsigned long long & "jobject" %typemap(jni) float, const float & "jfloat" %typemap(jni) double, const double & "jdouble" %typemap(jni) void "void" %typemap(jtype) bool, const bool & "boolean" %typemap(jtype) char, const char & "char" %typemap(jtype) signed char, const signed char & "byte" %typemap(jtype) unsigned char, const unsigned char & "short" %typemap(jtype) short, const short & "short" %typemap(jtype) unsigned short, const unsigned short & "int" %typemap(jtype) int, const int & "int" %typemap(jtype) unsigned int, const unsigned int & "long" %typemap(jtype) long, const long & "int" %typemap(jtype) unsigned long, const unsigned long & "long" %typemap(jtype) long long, const long long & "long" %typemap(jtype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jtype) float, const float & "float" %typemap(jtype) double, const double & "double" %typemap(jtype) void "void" %typemap(jstype) bool, const bool & "boolean" %typemap(jstype) char, const char & "char" %typemap(jstype) signed char, const signed char & "byte" %typemap(jstype) unsigned char, const unsigned char & "short" %typemap(jstype) short, const short & "short" %typemap(jstype) unsigned short, const unsigned short & "int" %typemap(jstype) int, const int & "int" %typemap(jstype) unsigned int, const unsigned int & "long" %typemap(jstype) long, const long & "int" %typemap(jstype) unsigned long, const unsigned long & "long" %typemap(jstype) long long, const long long & "long" %typemap(jstype) unsigned long long, const unsigned long long & "java.math.BigInteger" %typemap(jstype) float, const float & "float" %typemap(jstype) double, const double & "double" %typemap(jstype) void "void" %typemap(jni) char *, char *&, char[ANY], char[] "jstring" %typemap(jtype) char *, char *&, char[ANY], char[] "String" %typemap(jstype) char *, char *&, char[ANY], char[] "String" /* JNI types */ %typemap(jni) jboolean "jboolean" %typemap(jni) jchar "jchar" %typemap(jni) jbyte "jbyte" %typemap(jni) jshort "jshort" %typemap(jni) jint "jint" %typemap(jni) jlong "jlong" %typemap(jni) jfloat "jfloat" %typemap(jni) jdouble "jdouble" %typemap(jni) jstring "jstring" %typemap(jni) jobject "jobject" %typemap(jni) jbooleanArray "jbooleanArray" %typemap(jni) jcharArray "jcharArray" %typemap(jni) jbyteArray "jbyteArray" %typemap(jni) jshortArray "jshortArray" %typemap(jni) jintArray "jintArray" %typemap(jni) jlongArray "jlongArray" %typemap(jni) jfloatArray "jfloatArray" %typemap(jni) jdoubleArray "jdoubleArray" %typemap(jni) jobjectArray "jobjectArray" %typemap(jtype) jboolean "boolean" %typemap(jtype) jchar "char" %typemap(jtype) jbyte "byte" %typemap(jtype) jshort "short" %typemap(jtype) jint "int" %typemap(jtype) jlong "long" %typemap(jtype) jfloat "float" %typemap(jtype) jdouble "double" %typemap(jtype) jstring "String" %typemap(jtype) jobject "Object" %typemap(jtype) jbooleanArray "boolean[]" %typemap(jtype) jcharArray "char[]" %typemap(jtype) jbyteArray "byte[]" %typemap(jtype) jshortArray "short[]" %typemap(jtype) jintArray "int[]" %typemap(jtype) jlongArray "long[]" %typemap(jtype) jfloatArray "float[]" %typemap(jtype) jdoubleArray "double[]" %typemap(jtype) jobjectArray "Object[]" %typemap(jstype) jboolean "boolean" %typemap(jstype) jchar "char" %typemap(jstype) jbyte "byte" %typemap(jstype) jshort "short" %typemap(jstype) jint "int" %typemap(jstype) jlong "long" %typemap(jstype) jfloat "float" %typemap(jstype) jdouble "double" %typemap(jstype) jstring "String" %typemap(jstype) jobject "Object" %typemap(jstype) jbooleanArray "boolean[]" %typemap(jstype) jcharArray "char[]" %typemap(jstype) jbyteArray "byte[]" %typemap(jstype) jshortArray "short[]" %typemap(jstype) jintArray "int[]" %typemap(jstype) jlongArray "long[]" %typemap(jstype) jfloatArray "float[]" %typemap(jstype) jdoubleArray "double[]" %typemap(jstype) jobjectArray "Object[]" /* Non primitive types */ %typemap(jni) SWIGTYPE "jlong" %typemap(jtype) SWIGTYPE "long" %typemap(jstype) SWIGTYPE "$&javaclassname" %typemap(jni) SWIGTYPE [] "jlong" %typemap(jtype) SWIGTYPE [] "long" %typemap(jstype) SWIGTYPE [] "$javaclassname" %typemap(jni) SWIGTYPE * "jlong" %typemap(jtype) SWIGTYPE * "long" %typemap(jstype) SWIGTYPE * "$javaclassname" %typemap(jni) SWIGTYPE & "jlong" %typemap(jtype) SWIGTYPE & "long" %typemap(jstype) SWIGTYPE & "$javaclassname" %typemap(jni) SWIGTYPE && "jlong" %typemap(jtype) SWIGTYPE && "long" %typemap(jstype) SWIGTYPE && "$javaclassname" /* pointer to a class member */ %typemap(jni) SWIGTYPE (CLASS::*) "jstring" %typemap(jtype) SWIGTYPE (CLASS::*) "String" %typemap(jstype) SWIGTYPE (CLASS::*) "$javaclassname" /* The following are the in, out, freearg, argout typemaps. These are the JNI code generating typemaps for converting from Java to C and visa versa. */ /* primitive types */ %typemap(in) bool %{ $1 = $input ? true : false; %} %typemap(directorout) bool %{ $result = $input ? true : false; %} %typemap(javadirectorin) bool "$jniinput" %typemap(javadirectorout) bool "$javacall" %typemap(in) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double %{ $1 = ($1_ltype)$input; %} %typemap(directorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="Z") bool "$input = (jboolean) $1;" %typemap(directorin, descriptor="C") char "$input = (jint) $1;" %typemap(directorin, descriptor="B") signed char "$input = (jbyte) $1;" %typemap(directorin, descriptor="S") unsigned char "$input = (jshort) $1;" %typemap(directorin, descriptor="S") short "$input = (jshort) $1;" %typemap(directorin, descriptor="I") unsigned short "$input = (jint) $1;" %typemap(directorin, descriptor="I") int "$input = (jint) $1;" %typemap(directorin, descriptor="J") unsigned int "$input = (jlong) $1;" %typemap(directorin, descriptor="I") long "$input = (jint) $1;" %typemap(directorin, descriptor="J") unsigned long "$input = (jlong) $1;" %typemap(directorin, descriptor="J") long long "$input = (jlong) $1;" %typemap(directorin, descriptor="F") float "$input = (jfloat) $1;" %typemap(directorin, descriptor="D") double "$input = (jdouble) $1;" %typemap(javadirectorin) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double "$jniinput" %typemap(javadirectorout) char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, float, double "$javacall" %typemap(out) bool %{ $result = (jboolean)$1; %} %typemap(out) char %{ $result = (jchar)$1; %} %typemap(out) signed char %{ $result = (jbyte)$1; %} %typemap(out) unsigned char %{ $result = (jshort)$1; %} %typemap(out) short %{ $result = (jshort)$1; %} %typemap(out) unsigned short %{ $result = (jint)$1; %} %typemap(out) int %{ $result = (jint)$1; %} %typemap(out) unsigned int %{ $result = (jlong)$1; %} %typemap(out) long %{ $result = (jint)$1; %} %typemap(out) unsigned long %{ $result = (jlong)$1; %} %typemap(out) long long %{ $result = (jlong)$1; %} %typemap(out) float %{ $result = (jfloat)$1; %} %typemap(out) double %{ $result = (jdouble)$1; %} /* unsigned long long */ /* Convert from BigInteger using the toByteArray member function */ %typemap(in) unsigned long long { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $1 = 0; if (sz > 0) { $1 = ($1_type)(signed char)bae[0]; for(i=1; i 0) { $result = ($1_type)(signed char)bae[0]; for(i=1; i", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)($1>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $result = bigint; } /* Convert to BigInteger (see out typemap) */ %typemap(directorin, descriptor="Ljava/math/BigInteger;", noblock=1) unsigned long long, const unsigned long long & { { jbyteArray ba = JCALL1(NewByteArray, jenv, 9); jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0); jclass clazz = JCALL1(FindClass, jenv, "java/math/BigInteger"); jmethodID mid = JCALL3(GetMethodID, jenv, clazz, "", "([B)V"); jobject bigint; int swig_i; bae[0] = 0; for(swig_i=1; swig_i<9; swig_i++ ) { bae[swig_i] = (jbyte)($1>>8*(8-swig_i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $input = bigint; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(javadirectorin) unsigned long long "$jniinput" %typemap(javadirectorout) unsigned long long "$javacall" /* char * - treat as String */ %typemap(in, noblock=1) char * { $1 = 0; if ($input) { $1 = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$1) return $null; } } %typemap(directorout, noblock=1, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) char * { $1 = 0; if ($input) { $result = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$result) return $null; } } %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * { $input = 0; if ($1) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } %typemap(out, noblock=1) char * { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); } %typemap(javadirectorin) char * "$jniinput" %typemap(javadirectorout) char * "$javacall" /* char *& - treat as String */ %typemap(in, noblock=1) char *& ($*1_ltype temp = 0) { $1 = 0; if ($input) { temp = ($*1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!temp) return $null; } $1 = &temp; } %typemap(freearg, noblock=1) char *& { if ($1 && *$1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)*$1); } %typemap(out, noblock=1) char *& { if (*$1) $result = JCALL1(NewStringUTF, jenv, (const char *)*$1); } %typemap(out) void "" %typemap(javadirectorin) void "$jniinput" %typemap(javadirectorout) void "$javacall" %typemap(directorin, descriptor="V") void "" /* primitive types by reference */ %typemap(in) const bool & ($*1_ltype temp) %{ temp = $input ? true : false; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const bool & %{ static $*1_ltype temp; temp = $input ? true : false; $result = &temp; %} %typemap(javadirectorin) const bool & "$jniinput" %typemap(javadirectorout) const bool & "$javacall" %typemap(in) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const char &, const signed char &, const unsigned char &, const short &, const unsigned short &, const int &, const unsigned int &, const long &, const unsigned long &, const long long &, const float &, const double & %{ static $*1_ltype temp; temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="Z") const bool & "$input = (jboolean)$1;" %typemap(directorin, descriptor="C") const char & "$input = (jchar)$1;" %typemap(directorin, descriptor="B") const signed char & "$input = (jbyte)$1;" %typemap(directorin, descriptor="S") const unsigned char & "$input = (jshort)$1;" %typemap(directorin, descriptor="S") const short & "$input = (jshort)$1;" %typemap(directorin, descriptor="I") const unsigned short & "$input = (jint)$1;" %typemap(directorin, descriptor="I") const int & "$input = (jint)$1;" %typemap(directorin, descriptor="J") const unsigned int & "$input = (jlong)$1;" %typemap(directorin, descriptor="I") const long & "$input = (jint)$1;" %typemap(directorin, descriptor="J") const unsigned long & "$input = (jlong)$1;" %typemap(directorin, descriptor="J") const long long & "$input = (jlong)$1;" %typemap(directorin, descriptor="F") const float & "$input = (jfloat)$1;" %typemap(directorin, descriptor="D") const double & "$input = (jdouble)$1;" %typemap(javadirectorin) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$jniinput" %typemap(javadirectorout) const char & ($*1_ltype temp), const signed char & ($*1_ltype temp), const unsigned char & ($*1_ltype temp), const short & ($*1_ltype temp), const unsigned short & ($*1_ltype temp), const int & ($*1_ltype temp), const unsigned int & ($*1_ltype temp), const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) "$javacall" %typemap(out) const bool & %{ $result = (jboolean)*$1; %} %typemap(out) const char & %{ $result = (jchar)*$1; %} %typemap(out) const signed char & %{ $result = (jbyte)*$1; %} %typemap(out) const unsigned char & %{ $result = (jshort)*$1; %} %typemap(out) const short & %{ $result = (jshort)*$1; %} %typemap(out) const unsigned short & %{ $result = (jint)*$1; %} %typemap(out) const int & %{ $result = (jint)*$1; %} %typemap(out) const unsigned int & %{ $result = (jlong)*$1; %} %typemap(out) const long & %{ $result = (jint)*$1; %} %typemap(out) const unsigned long & %{ $result = (jlong)*$1; %} %typemap(out) const long long & %{ $result = (jlong)*$1; %} %typemap(out) const float & %{ $result = (jfloat)*$1; %} %typemap(out) const double & %{ $result = (jdouble)*$1; %} /* const unsigned long long & */ /* Similar to unsigned long long */ %typemap(in) const unsigned long long & ($*1_ltype temp) { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); $1 = &temp; temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)(*$1>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); $result = bigint; } %typemap(javadirectorin) const unsigned long long & "$jniinput" %typemap(javadirectorout) const unsigned long long & "$javacall" /* Default handling. Object passed by value. Convert to a pointer */ %typemap(in) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(directorout) SWIGTYPE ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *argp; %} %typemap(out) SWIGTYPE #ifdef __cplusplus %{ *($&1_ltype*)&$result = new $1_ltype((const $1_ltype &)$1); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); *($&1_ltype*)&$result = $1ptr; } #endif %typemap(directorin,descriptor="L$packagepath/$&javaclassname;") SWIGTYPE %{ $input = 0; *(($&1_ltype*)&$input) = new $1_ltype((const $1_ltype &)$1); %} %typemap(javadirectorin) SWIGTYPE "new $&javaclassname($jniinput, true)" %typemap(javadirectorout) SWIGTYPE "$&javaclassname.getCPtr($javacall)" /* Generic pointers and references */ %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} %typemap(in, fragment="SWIG_UnPackData") SWIGTYPE (CLASS::*) { const char *temp = 0; if ($input) { temp = JCALL2(GetStringUTFChars, jenv, $input, 0); if (!temp) return $null; } SWIG_UnpackData(temp, (void *)&$1, sizeof($1)); } %typemap(in) SWIGTYPE & %{ $1 = *($&1_ltype)&$input; if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(in) SWIGTYPE && %{ $1 = *($&1_ltype)&$input; if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = $1; %} %typemap(out, fragment="SWIG_PackData", noblock=1) SWIGTYPE (CLASS::*) { char buf[128]; char *data = SWIG_PackData(buf, (void *)&$1, sizeof($1)); *data = '\0'; $result = JCALL1(NewStringUTF, jenv, buf); } %typemap(out) SWIGTYPE & %{ *($&1_ltype)&$result = $1; %} %typemap(out) SWIGTYPE && %{ *($&1_ltype)&$result = $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE * %{ $result = *($&1_ltype)&$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE (CLASS::*) %{ $result = *($&1_ltype)&$input; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE * %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE (CLASS::*) %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE & %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)&$input; %} %typemap(directorout, warning=SWIGWARN_TYPEMAP_DIRECTOROUT_PTR_MSG) SWIGTYPE && %{ if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Unexpected null return for type $1_type"); return $null; } $result = *($&1_ltype)&$input; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE & %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(directorin,descriptor="L$packagepath/$javaclassname;") SWIGTYPE && %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(javadirectorin) SWIGTYPE *, SWIGTYPE (CLASS::*) "($jniinput == 0) ? null : new $javaclassname($jniinput, false)" %typemap(javadirectorin) SWIGTYPE & "new $javaclassname($jniinput, false)" %typemap(javadirectorin) SWIGTYPE && "new $javaclassname($jniinput, false)" %typemap(javadirectorout) SWIGTYPE *, SWIGTYPE (CLASS::*), SWIGTYPE &, SWIGTYPE && "$javaclassname.getCPtr($javacall)" /* Default array handling */ %typemap(in) SWIGTYPE [] %{ $1 = *($&1_ltype)&$input; %} %typemap(out) SWIGTYPE [] %{ *($&1_ltype)&$result = $1; %} %typemap(freearg) SWIGTYPE [ANY], SWIGTYPE [] "" /* char arrays - treat as String */ %typemap(in, noblock=1) char[ANY], char[] { $1 = 0; if ($input) { $1 = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$1) return $null; } } %typemap(directorout, noblock=1) char[ANY], char[] { $1 = 0; if ($input) { $result = ($1_ltype)JCALL2(GetStringUTFChars, jenv, $input, 0); if (!$result) return $null; } } %typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char[ANY], char[] { $input = 0; if ($1) { $input = JCALL1(NewStringUTF, jenv, (const char *)$1); if (!$input) return $null; } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(argout) char[ANY], char[] "" %typemap(freearg, noblock=1) char[ANY], char[] { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); } %typemap(out, noblock=1) char[ANY], char[] { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); } %typemap(javadirectorin) char[ANY], char[] "$jniinput" %typemap(javadirectorout) char[ANY], char[] "$javacall" /* JNI types */ %typemap(in) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $1 = $input; %} %typemap(directorout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $result = $input; %} %typemap(out) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray %{ $result = $1; %} %typemap(directorin,descriptor="Z") jboolean "$input = $1;" %typemap(directorin,descriptor="C") jchar "$input = $1;" %typemap(directorin,descriptor="B") jbyte "$input = $1;" %typemap(directorin,descriptor="S") jshort "$input = $1;" %typemap(directorin,descriptor="I") jint "$input = $1;" %typemap(directorin,descriptor="J") jlong "$input = $1;" %typemap(directorin,descriptor="F") jfloat "$input = $1;" %typemap(directorin,descriptor="D") jdouble "$input = $1;" %typemap(directorin,descriptor="Ljava/lang/String;") jstring "$input = $1;" %typemap(directorin,descriptor="Ljava/lang/Object;",nouse="1") jobject "$input = $1;" %typemap(directorin,descriptor="[Z") jbooleanArray "$input = $1;" %typemap(directorin,descriptor="[C") jcharArray "$input = $1;" %typemap(directorin,descriptor="[B") jbyteArray "$input = $1;" %typemap(directorin,descriptor="[S") jshortArray "$input = $1;" %typemap(directorin,descriptor="[I") jintArray "$input = $1;" %typemap(directorin,descriptor="[J") jlongArray "$input = $1;" %typemap(directorin,descriptor="[F") jfloatArray "$input = $1;" %typemap(directorin,descriptor="[D") jdoubleArray "$input = $1;" %typemap(directorin,descriptor="[Ljava/lang/Object;",nouse="1") jobjectArray "$input = $1;" %typemap(javadirectorin) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$jniinput" %typemap(javadirectorout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$javacall" /* Typecheck typemaps - The purpose of these is merely to issue a warning for overloaded C++ functions * that cannot be overloaded in Java as more than one C++ type maps to a single Java type */ %typecheck(SWIG_TYPECHECK_BOOL) /* Java boolean */ jboolean, bool, const bool & "" %typecheck(SWIG_TYPECHECK_CHAR) /* Java char */ jchar, char, const char & "" %typecheck(SWIG_TYPECHECK_INT8) /* Java byte */ jbyte, signed char, const signed char & "" %typecheck(SWIG_TYPECHECK_INT16) /* Java short */ jshort, unsigned char, short, const unsigned char &, const short & "" %typecheck(SWIG_TYPECHECK_INT32) /* Java int */ jint, unsigned short, int, long, const unsigned short &, const int &, const long & "" %typecheck(SWIG_TYPECHECK_INT64) /* Java long */ jlong, unsigned int, unsigned long, long long, const unsigned int &, const unsigned long &, const long long & "" %typecheck(SWIG_TYPECHECK_INT128) /* Java BigInteger */ unsigned long long, const unsigned long long & "" %typecheck(SWIG_TYPECHECK_FLOAT) /* Java float */ jfloat, float, const float & "" %typecheck(SWIG_TYPECHECK_DOUBLE) /* Java double */ jdouble, double, const double & "" %typecheck(SWIG_TYPECHECK_STRING) /* Java String */ jstring, char *, char *&, char[ANY], char [] "" %typecheck(SWIG_TYPECHECK_BOOL_ARRAY) /* Java boolean[] */ jbooleanArray "" %typecheck(SWIG_TYPECHECK_CHAR_ARRAY) /* Java char[] */ jcharArray "" %typecheck(SWIG_TYPECHECK_INT8_ARRAY) /* Java byte[] */ jbyteArray "" %typecheck(SWIG_TYPECHECK_INT16_ARRAY) /* Java short[] */ jshortArray "" %typecheck(SWIG_TYPECHECK_INT32_ARRAY) /* Java int[] */ jintArray "" %typecheck(SWIG_TYPECHECK_INT64_ARRAY) /* Java long[] */ jlongArray "" %typecheck(SWIG_TYPECHECK_FLOAT_ARRAY) /* Java float[] */ jfloatArray "" %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY) /* Java double[] */ jdoubleArray "" %typecheck(SWIG_TYPECHECK_OBJECT_ARRAY) /* Java jobject[] */ jobjectArray "" %typecheck(SWIG_TYPECHECK_POINTER) /* Default */ SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *const&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* Exception handling */ %typemap(throws) int, long, short, unsigned int, unsigned long, unsigned short %{ char error_msg[256]; sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1); SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, error_msg); return $null; %} %typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); return $null; %} %typemap(throws) char * %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1); return $null; %} /* Typemaps for code generation in proxy classes and Java type wrapper classes */ /* The javain typemap is used for converting function parameter types from the type * used in the proxy, module or type wrapper class to the type used in the JNI class. */ %typemap(javain) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & "$javainput" %typemap(javain) char *, char *&, char[ANY], char[] "$javainput" %typemap(javain) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray "$javainput" %typemap(javain) SWIGTYPE "$&javaclassname.getCPtr($javainput)" %typemap(javain) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] "$javaclassname.getCPtr($javainput)" %typemap(javain) SWIGTYPE (CLASS::*) "$javaclassname.getCMemberPtr($javainput)" /* The javaout typemap is used for converting function return types from the return type * used in the JNI class to the type returned by the proxy, module or type wrapper class. */ %typemap(javaout) bool, const bool &, char, const char &, signed char, const signed char &, unsigned char, const unsigned char &, short, const short &, unsigned short, const unsigned short &, int, const int &, unsigned int, const unsigned int &, long, const long &, unsigned long, const unsigned long &, long long, const long long &, unsigned long long, const unsigned long long &, float, const float &, double, const double & { return $jnicall; } %typemap(javaout) char *, char *&, char[ANY], char[] { return $jnicall; } %typemap(javaout) jboolean, jchar, jbyte, jshort, jint, jlong, jfloat, jdouble, jstring, jobject, jbooleanArray, jcharArray, jbyteArray, jshortArray, jintArray, jlongArray, jfloatArray, jdoubleArray, jobjectArray { return $jnicall; } %typemap(javaout) void { $jnicall; } %typemap(javaout) SWIGTYPE { return new $&javaclassname($jnicall, true); } %typemap(javaout) SWIGTYPE & { return new $javaclassname($jnicall, $owner); } %typemap(javaout) SWIGTYPE && { return new $javaclassname($jnicall, $owner); } %typemap(javaout) SWIGTYPE *, SWIGTYPE [] { long cPtr = $jnicall; return (cPtr == 0) ? null : new $javaclassname(cPtr, $owner); } %typemap(javaout) SWIGTYPE (CLASS::*) { String cMemberPtr = $jnicall; return (cMemberPtr == null) ? null : new $javaclassname(cMemberPtr, $owner); } /* Pointer reference typemaps */ %typemap(jni) SWIGTYPE *const& "jlong" %typemap(jtype) SWIGTYPE *const& "long" %typemap(jstype) SWIGTYPE *const& "$*javaclassname" %typemap(javain) SWIGTYPE *const& "$*javaclassname.getCPtr($javainput)" %typemap(javaout) SWIGTYPE *const& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $*javaclassname(cPtr, $owner); } %typemap(in) SWIGTYPE *const& ($*1_ltype temp = 0) %{ temp = *($1_ltype)&$input; $1 = ($1_ltype)&temp; %} %typemap(out) SWIGTYPE *const& %{ *($1_ltype)&$result = *$1; %} /* Typemaps used for the generation of proxy and type wrapper class code */ %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javaclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class" %typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javaimports) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" %typemap(javainterfaces) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "" /* javabody typemaps */ %define SWIG_JAVABODY_METHODS(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) SWIG_JAVABODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE) %enddef // legacy name %define SWIG_JAVABODY_PROXY(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; protected transient boolean swigCMemOwn; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %enddef %define SWIG_JAVABODY_TYPEWRAPPER(PTRCTOR_VISIBILITY, DEFAULTCTOR_VISIBILITY, CPTR_VISIBILITY, TYPE...) // Typewrapper classes %typemap(javabody) TYPE *, TYPE &, TYPE &&, TYPE [] %{ private transient long swigCPtr; PTRCTOR_VISIBILITY $javaclassname(long cPtr, @SuppressWarnings("unused") boolean futureUse) { swigCPtr = cPtr; } DEFAULTCTOR_VISIBILITY $javaclassname() { swigCPtr = 0; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javabody) TYPE (CLASS::*) %{ private transient String swigCMemberPtr; PTRCTOR_VISIBILITY $javaclassname(String cMemberPtr, @SuppressWarnings("unused") boolean futureUse) { swigCMemberPtr = cMemberPtr; } DEFAULTCTOR_VISIBILITY $javaclassname() { swigCMemberPtr = null; } CPTR_VISIBILITY static String getCMemberPtr($javaclassname obj) { return obj.swigCMemberPtr; } %} %enddef /* Set the default javabody typemaps to use protected visibility. Use the macros to change to public if using multiple modules. */ SWIG_JAVABODY_PROXY(protected, protected, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(protected, protected, protected, SWIGTYPE) %typemap(javafinalize) SWIGTYPE %{ protected void finalize() { delete(); } %} /* * Java constructor typemaps: * * The javaconstruct typemap is inserted when a proxy class's constructor is generated. * This typemap allows control over what code is executed in the constructor as * well as specifying who owns the underlying C/C++ object. Normally, Java has * ownership and the underlying C/C++ object is deallocated when the Java object * is finalized (swigCMemOwn is true.) If swigCMemOwn is false, C/C++ is * ultimately responsible for deallocating the underlying object's memory. * * The SWIG_PROXY_CONSTRUCTOR macro defines the javaconstruct typemap for a proxy * class for a particular TYPENAME. OWNERSHIP is passed as the value of * swigCMemOwn to the pointer constructor method. WEAKREF determines which kind * of Java object reference will be used by the C++ director class (WeakGlobalRef * vs. GlobalRef.) * * The SWIG_DIRECTOR_OWNED macro sets the ownership of director-based proxy * classes and the weak reference flag to false, meaning that the underlying C++ * object will be reclaimed by C++. */ %define SWIG_PROXY_CONSTRUCTOR(OWNERSHIP, WEAKREF, TYPENAME...) %typemap(javaconstruct,directorconnect="\n $imclassname.$javaclazznamedirector_connect(this, swigCPtr, swigCMemOwn, WEAKREF);") TYPENAME { this($imcall, OWNERSHIP);$directorconnect } %enddef %define SWIG_DIRECTOR_OWNED(TYPENAME...) SWIG_PROXY_CONSTRUCTOR(true, false, TYPENAME) %enddef // Set the default for SWIGTYPE: Java owns the C/C++ object. SWIG_PROXY_CONSTRUCTOR(true, true, SWIGTYPE) %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") SWIGTYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") SWIGTYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } super.delete(); } %typemap(directordisconnect, methodname="swigDirectorDisconnect") SWIGTYPE %{ protected void $methodname() { swigCMemOwn = false; $jnicall; } %} %typemap(directorowner_release, methodname="swigReleaseOwnership") SWIGTYPE %{ public void $methodname() { swigCMemOwn = false; $jnicall; } %} %typemap(directorowner_take, methodname="swigTakeOwnership") SWIGTYPE %{ public void $methodname() { swigCMemOwn = true; $jnicall; } %} /* Java specific directives */ #define %javaconst(flag) %feature("java:const","flag") #define %javaconstvalue(value) %feature("java:constvalue",value) #define %javaenum(wrapapproach) %feature("java:enum","wrapapproach") #define %javamethodmodifiers %feature("java:methodmodifiers") #define %javaexception(exceptionclasses) %feature("except",throws=exceptionclasses) #define %nojavaexception %feature("except","0",throws="") #define %clearjavaexception %feature("except","",throws="") #define %proxycode %insert("proxycode") %pragma(java) jniclassclassmodifiers="public class" %pragma(java) moduleclassmodifiers="public class" /* Some ANSI C typemaps */ %apply unsigned long { size_t }; %apply const unsigned long & { const size_t & }; /* Array reference typemaps */ %apply SWIGTYPE & { SWIGTYPE ((&)[ANY]) } %apply SWIGTYPE && { SWIGTYPE ((&&)[ANY]) } /* const pointers */ %apply SWIGTYPE * { SWIGTYPE *const } /* String & length */ %typemap(jni) (char *STRING, size_t LENGTH) "jbyteArray" %typemap(jtype) (char *STRING, size_t LENGTH) "byte[]" %typemap(jstype) (char *STRING, size_t LENGTH) "byte[]" %typemap(javain) (char *STRING, size_t LENGTH) "$javainput" %typemap(freearg) (char *STRING, size_t LENGTH) "" %typemap(in) (char *STRING, size_t LENGTH) { if ($input) { $1 = ($1_ltype) JCALL2(GetByteArrayElements, jenv, $input, 0); $2 = ($2_type) JCALL1(GetArrayLength, jenv, $input); } else { $1 = 0; $2 = 0; } } %typemap(argout) (char *STRING, size_t LENGTH) { if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0); } %typemap(directorin, descriptor="[B", noblock=1) (char *STRING, size_t LENGTH) { $input = 0; if ($1) { $input = JCALL1(NewByteArray, jenv, (jsize)$2); if (!$input) return $null; JCALL4(SetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1); } Swig::LocalRefGuard $1_refguard(jenv, $input); } %typemap(directorargout, noblock=1) (char *STRING, size_t LENGTH) { if ($input && $1) JCALL4(GetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1); } %typemap(javadirectorin, descriptor="[B") (char *STRING, size_t LENGTH) "$jniinput" %apply (char *STRING, size_t LENGTH) { (char *STRING, int LENGTH) } /* java keywords */ %include // Default enum handling %include swig-3.0.12/Lib/java/typemaps.i0000664000175000017500000004344313042756442016110 0ustar williamwilliam/* ----------------------------------------------------------------------------- * typemaps.i * * Pointer and reference handling typemap library * * These mappings provide support for input/output arguments and common * uses for C/C++ pointers and C++ references. * ----------------------------------------------------------------------------- */ /* INPUT typemaps -------------- These typemaps remap a C pointer or C++ reference to be an "INPUT" value which is passed by value instead of reference. The following typemaps can be applied to turn a pointer or reference into a simple input value. That is, instead of passing a pointer or reference to an object, you would use a real value instead. bool *INPUT, bool &INPUT signed char *INPUT, signed char &INPUT unsigned char *INPUT, unsigned char &INPUT short *INPUT, short &INPUT unsigned short *INPUT, unsigned short &INPUT int *INPUT, int &INPUT unsigned int *INPUT, unsigned int &INPUT long *INPUT, long &INPUT unsigned long *INPUT, unsigned long &INPUT long long *INPUT, long long &INPUT unsigned long long *INPUT, unsigned long long &INPUT float *INPUT, float &INPUT double *INPUT, double &INPUT To use these, suppose you had a C function like this : double fadd(double *a, double *b) { return *a+*b; } You could wrap it with SWIG as follows : %include double fadd(double *INPUT, double *INPUT); or you can use the %apply directive : %include %apply double *INPUT { double *a, double *b }; double fadd(double *a, double *b); In Java you could then use it like this: double answer = modulename.fadd(10.0, 20.0); There are no char *INPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INPUT {char *input}; void f(char *input); */ %define INPUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JNIDESC) %typemap(jni) TYPE *INPUT, TYPE &INPUT "JNITYPE" %typemap(jtype) TYPE *INPUT, TYPE &INPUT "JTYPE" %typemap(jstype) TYPE *INPUT, TYPE &INPUT "JTYPE" %typemap(javain) TYPE *INPUT, TYPE &INPUT "$javainput" %typemap(in) TYPE *INPUT, TYPE &INPUT %{ $1 = ($1_ltype)&$input; %} %typemap(freearg) TYPE *INPUT, TYPE &INPUT "" %typemap(typecheck) TYPE *INPUT = TYPE; %typemap(typecheck) TYPE &INPUT = TYPE; %enddef INPUT_TYPEMAP(bool, jboolean, boolean, "Z"); INPUT_TYPEMAP(signed char, jbyte, byte, "B"); INPUT_TYPEMAP(unsigned char, jshort, short, "S"); INPUT_TYPEMAP(short, jshort, short, "S"); INPUT_TYPEMAP(unsigned short, jint, int, "I"); INPUT_TYPEMAP(int, jint, int, "I"); INPUT_TYPEMAP(unsigned int, jlong, long, "J"); INPUT_TYPEMAP(long, jint, int, "I"); INPUT_TYPEMAP(unsigned long, jlong, long, "J"); INPUT_TYPEMAP(long long, jlong, long, "J"); INPUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, "Ljava/math/BigInteger;"); INPUT_TYPEMAP(float, jfloat, float, "F"); INPUT_TYPEMAP(double, jdouble, double, "D"); #undef INPUT_TYPEMAP /* Convert from BigInteger using the toByteArray member function */ /* Overrides the typemap in the INPUT_TYPEMAP macro */ %typemap(in) unsigned long long *INPUT($*1_ltype temp), unsigned long long &INPUT($*1_ltype temp) { jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "BigInteger null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, $input); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, $input, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i double modf(double x, double *OUTPUT); or you can use the %apply directive : %include %apply double *OUTPUT { double *ip }; double modf(double x, double *ip); The Java output of the function would be the function return value and the value in the single element array. In Java you would use it like this: double[] ptr = {0.0}; double fraction = modulename.modf(5.0,ptr); There are no char *OUTPUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *OUTPUT {char *output}; void f(char *output); */ /* Java BigInteger[] */ %typecheck(SWIG_TYPECHECK_INT128_ARRAY) SWIGBIGINTEGERARRAY "" %define OUTPUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JAVATYPE, JNIDESC, TYPECHECKTYPE) %typemap(jni) TYPE *OUTPUT, TYPE &OUTPUT %{JNITYPE##Array%} %typemap(jtype) TYPE *OUTPUT, TYPE &OUTPUT "JTYPE[]" %typemap(jstype) TYPE *OUTPUT, TYPE &OUTPUT "JTYPE[]" %typemap(javain) TYPE *OUTPUT, TYPE &OUTPUT "$javainput" %typemap(javadirectorin) TYPE *OUTPUT, TYPE &OUTPUT "$jniinput" %typemap(javadirectorout) TYPE *OUTPUT, TYPE &OUTPUT "$javacall" %typemap(in) TYPE *OUTPUT($*1_ltype temp), TYPE &OUTPUT($*1_ltype temp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } temp = ($*1_ltype)0; $1 = &temp; } %typemap(freearg) TYPE *OUTPUT, TYPE &OUTPUT "" %typemap(argout) TYPE *OUTPUT, TYPE &OUTPUT { JNITYPE jvalue = (JNITYPE)temp$argnum; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue); } %typemap(directorin,descriptor=JNIDESC) TYPE &OUTPUT, TYPE *OUTPUT %{ $input = JCALL1(New##JAVATYPE##Array, jenv, 1); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorargout, noblock=1) TYPE &OUTPUT { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = $1_jvalue; } %typemap(directorargout, noblock=1) TYPE *OUTPUT { JNITYPE $1_jvalue; JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = $1_jvalue; } %typemap(typecheck) TYPE *OUTPUT = TYPECHECKTYPE; %typemap(typecheck) TYPE &OUTPUT = TYPECHECKTYPE; %enddef OUTPUT_TYPEMAP(bool, jboolean, boolean, Boolean, "[Z", jbooleanArray); OUTPUT_TYPEMAP(signed char, jbyte, byte, Byte, "[B", jbyteArray); OUTPUT_TYPEMAP(unsigned char, jshort, short, Short, "[S", jshortArray); OUTPUT_TYPEMAP(short, jshort, short, Short, "[S", jshortArray); OUTPUT_TYPEMAP(unsigned short, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(int, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(unsigned int, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(long, jint, int, Int, "[I", jintArray); OUTPUT_TYPEMAP(unsigned long, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(long long, jlong, long, Long, "[J", jlongArray); OUTPUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, Object, "[Ljava/math/BigInteger;", jobjectArray); OUTPUT_TYPEMAP(float, jfloat, float, Float, "[F", jfloatArray); OUTPUT_TYPEMAP(double, jdouble, double, Double, "[D", jdoubleArray); #undef OUTPUT_TYPEMAP %typemap(in) bool *OUTPUT($*1_ltype temp), bool &OUTPUT($*1_ltype temp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } temp = false; $1 = &temp; } /* Convert to BigInteger - byte array holds number in 2's complement big endian format */ /* Use first element in BigInteger array for output */ /* Overrides the typemap in the OUTPUT_TYPEMAP macro */ %typemap(argout) unsigned long long *OUTPUT, unsigned long long &OUTPUT { jbyteArray ba = JCALL1(NewByteArray, jenv, 9); jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0); jclass clazz = JCALL1(FindClass, jenv, "java/math/BigInteger"); jmethodID mid = JCALL3(GetMethodID, jenv, clazz, "", "([B)V"); jobject bigint; int i; bae[0] = 0; for(i=1; i<9; i++ ) { bae[i] = (jbyte)(temp$argnum>>8*(8-i)); } JCALL3(ReleaseByteArrayElements, jenv, ba, bae, 0); bigint = JCALL3(NewObject, jenv, clazz, mid, ba); JCALL1(DeleteLocalRef, jenv, ba); JCALL3(SetObjectArrayElement, jenv, $input, 0, bigint); } /* INOUT typemaps -------------- Mappings for a parameter that is both an input and an output parameter The following typemaps can be applied to make a function parameter both an input and output value. This combines the behavior of both the "INPUT" and "OUTPUT" typemaps described earlier. Output values are returned as an element in a Java array. bool *INOUT, bool &INOUT signed char *INOUT, signed char &INOUT unsigned char *INOUT, unsigned char &INOUT short *INOUT, short &INOUT unsigned short *INOUT, unsigned short &INOUT int *INOUT, int &INOUT unsigned int *INOUT, unsigned int &INOUT long *INOUT, long &INOUT unsigned long *INOUT, unsigned long &INOUT long long *INOUT, long long &INOUT unsigned long long *INOUT, unsigned long long &INOUT float *INOUT, float &INOUT double *INOUT, double &INOUT For example, suppose you were trying to wrap the following function : void neg(double *x) { *x = -(*x); } You could wrap it with SWIG as follows : %include void neg(double *INOUT); or you can use the %apply directive : %include %apply double *INOUT { double *x }; void neg(double *x); This works similarly to C in that the mapping directly modifies the input value - the input must be an array with a minimum of one element. The element in the array is the input and the output is the element in the array. double x[] = {5.0}; neg(x); The implementation of the OUTPUT and INOUT typemaps is different to other languages in that other languages will return the output value as part of the function return value. This difference is due to Java being a typed language. There are no char *INOUT typemaps, however you can apply the signed char * typemaps instead: %include %apply signed char *INOUT {char *inout}; void f(char *inout); */ %define INOUT_TYPEMAP(TYPE, JNITYPE, JTYPE, JAVATYPE, JNIDESC, TYPECHECKTYPE) %typemap(jni) TYPE *INOUT, TYPE &INOUT %{JNITYPE##Array%} %typemap(jtype) TYPE *INOUT, TYPE &INOUT "JTYPE[]" %typemap(jstype) TYPE *INOUT, TYPE &INOUT "JTYPE[]" %typemap(javain) TYPE *INOUT, TYPE &INOUT "$javainput" %typemap(javadirectorin) TYPE *INOUT, TYPE &INOUT "$jniinput" %typemap(javadirectorout) TYPE *INOUT, TYPE &INOUT "$javacall" %typemap(in) TYPE *INOUT, TYPE &INOUT { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } $1 = ($1_ltype) JCALL2(Get##JAVATYPE##ArrayElements, jenv, $input, 0); } %typemap(freearg) TYPE *INOUT, TYPE &INOUT "" %typemap(argout) TYPE *INOUT, TYPE &INOUT { JCALL3(Release##JAVATYPE##ArrayElements, jenv, $input, (JNITYPE *)$1, 0); } %typemap(directorin,descriptor=JNIDESC) TYPE &INOUT %{ $input = JCALL1(New##JAVATYPE##Array, jenv, 1); JNITYPE $1_jvalue = (JNITYPE)$1; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorin,descriptor=JNIDESC) TYPE *INOUT %{ $input = JCALL1(New##JAVATYPE##Array, jenv, 1); JNITYPE $1_jvalue = (JNITYPE)*$1; JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(directorargout, noblock=1) TYPE &INOUT { JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); $result = $1_jvalue; } %typemap(directorargout, noblock=1) TYPE *INOUT { JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue); *$result = $1_jvalue; } %typemap(typecheck) TYPE *INOUT = TYPECHECKTYPE; %typemap(typecheck) TYPE &INOUT = TYPECHECKTYPE; %enddef INOUT_TYPEMAP(bool, jboolean, boolean, Boolean, "[Z", jbooleanArray); INOUT_TYPEMAP(signed char, jbyte, byte, Byte, "[B", jbyteArray); INOUT_TYPEMAP(unsigned char, jshort, short, Short, "[S", jshortArray); INOUT_TYPEMAP(short, jshort, short, Short, "[S", jshortArray); INOUT_TYPEMAP(unsigned short, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(int, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(unsigned int, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(long, jint, int, Int, "[I", jintArray); INOUT_TYPEMAP(unsigned long, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(long long, jlong, long, Long, "[J", jlongArray); INOUT_TYPEMAP(unsigned long long, jobject, java.math.BigInteger, Object, "[java/math/BigInteger;", jobjectArray); INOUT_TYPEMAP(float, jfloat, float, Float, "[F", jfloatArray); INOUT_TYPEMAP(double, jdouble, double, Double, "[D", jdoubleArray); #undef INOUT_TYPEMAP /* Override typemaps in the INOUT_TYPEMAP macro for booleans to fix casts as a jboolean isn't always the same size as a bool */ %typemap(in) bool *INOUT (bool btemp, jboolean *jbtemp), bool &INOUT (bool btemp, jboolean *jbtemp) { if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } jbtemp = JCALL2(GetBooleanArrayElements, jenv, $input, 0); btemp = (*jbtemp) ? true : false; $1 = &btemp; } %typemap(argout) bool *INOUT, bool &INOUT { *jbtemp$argnum = btemp$argnum ? (jboolean)1 : (jboolean)0; JCALL3(ReleaseBooleanArrayElements, jenv, $input , (jboolean *)jbtemp$argnum, 0); } /* Override the typemap in the INOUT_TYPEMAP macro for unsigned long long */ %typemap(in) unsigned long long *INOUT ($*1_ltype temp), unsigned long long &INOUT ($*1_ltype temp) { jobject bigint; jclass clazz; jmethodID mid; jbyteArray ba; jbyte* bae; jsize sz; int i; if (!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array null"); return $null; } if (JCALL1(GetArrayLength, jenv, $input) == 0) { SWIG_JavaThrowException(jenv, SWIG_JavaIndexOutOfBoundsException, "Array must contain at least 1 element"); return $null; } bigint = JCALL2(GetObjectArrayElement, jenv, $input, 0); if (!bigint) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "array element null"); return $null; } clazz = JCALL1(GetObjectClass, jenv, bigint); mid = JCALL3(GetMethodID, jenv, clazz, "toByteArray", "()[B"); ba = (jbyteArray)JCALL2(CallObjectMethod, jenv, bigint, mid); bae = JCALL2(GetByteArrayElements, jenv, ba, 0); sz = JCALL1(GetArrayLength, jenv, ba); temp = 0; if (sz > 0) { temp = ($*1_ltype)(signed char)bae[0]; for(i=1; i namespace std { template class array { public: typedef T& reference; typedef const T& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef const T* const_pointer; array(); array(const array& other); size_type size() const; %rename(isEmpty) empty; bool empty() const; void fill(const T& u); %extend { const_reference get(int i) throw (std::out_of_range) { int size = int(self->size()); if (i>=0 && isize()); if (i>=0 && i %include // ------------------------------------------------------------------------ // std::pair // ------------------------------------------------------------------------ %{ #include %} namespace std { template struct pair { pair(); pair(T first, U second); pair(const pair& p); template pair(const pair &p); T first; U second; }; // add specializations here } swig-3.0.12/Lib/java/enumsimple.swg0000664000175000017500000000501713042756442016767 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enumsimple.swg * * This file provides backwards compatible enum wrapping. SWIG versions 1.3.21 * and earlier wrapped global enums with constant integers in the module class * or Constants interface. Enums declared within a C++ class were wrapped by * constant integers in the Java proxy class. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "int" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="I") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$jniinput" %typemap(javadirectorout) const enum SWIGTYPE & "$javacall" %typecheck(SWIG_TYPECHECK_INT32) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput" %typemap(javaout) const enum SWIGTYPE & { return $jnicall; } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "int" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="I") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$jniinput" %typemap(javadirectorout) enum SWIGTYPE "$javacall" %typecheck(SWIG_TYPECHECK_INT32) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput" %typemap(javaout) enum SWIGTYPE { return $jnicall; } %typemap(javaclassmodifiers) enum SWIGTYPE "" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" %typemap(javabody) enum SWIGTYPE "" %javaenum(simple); swig-3.0.12/Lib/java/enums.swg0000664000175000017500000001065313042756442015742 0ustar williamwilliam/* ----------------------------------------------------------------------------- * enums.swg * * Include this file in order for C/C++ enums to be wrapped by proper Java enums. * Note that the JNI layer handles the enum as an int. The Java enum has extra * code generated to store the C++ int value. This is required for C++ enums that * specify a value for the enum item, as native Java enums do not support this. * ----------------------------------------------------------------------------- */ // const enum SWIGTYPE & typemaps %typemap(jni) const enum SWIGTYPE & "jint" %typemap(jtype) const enum SWIGTYPE & "int" %typemap(jstype) const enum SWIGTYPE & "$*javaclassname" %typemap(in) const enum SWIGTYPE & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; $1 = &temp; %} %typemap(out) const enum SWIGTYPE & %{ $result = (jint)*$1; %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const enum SWIGTYPE & %{ static $*1_ltype temp = ($*1_ltype)$input; $result = &temp; %} %typemap(directorin, descriptor="L$packagepath/$*javaclassname;") const enum SWIGTYPE & "$input = (jint)$1;" %typemap(javadirectorin) const enum SWIGTYPE & "$*javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) const enum SWIGTYPE & "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) const enum SWIGTYPE & "" %typemap(throws) const enum SWIGTYPE & %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) const enum SWIGTYPE & "$javainput.swigValue()" %typemap(javaout) const enum SWIGTYPE & { return $*javaclassname.swigToEnum($jnicall); } // enum SWIGTYPE typemaps %typemap(jni) enum SWIGTYPE "jint" %typemap(jtype) enum SWIGTYPE "int" %typemap(jstype) enum SWIGTYPE "$javaclassname" %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} %typemap(out) enum SWIGTYPE %{ $result = (jint)$1; %} %typemap(directorout) enum SWIGTYPE %{ $result = ($1_ltype)$input; %} %typemap(directorin, descriptor="L$packagepath/$javaclassname;") enum SWIGTYPE "$input = (jint) $1;" %typemap(javadirectorin) enum SWIGTYPE "$javaclassname.swigToEnum($jniinput)" %typemap(javadirectorout) enum SWIGTYPE "($javacall).swigValue()" %typecheck(SWIG_TYPECHECK_POINTER) enum SWIGTYPE "" %typemap(throws) enum SWIGTYPE %{ (void)$1; SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, "C++ $1_type exception thrown"); %} %typemap(javain) enum SWIGTYPE "$javainput.swigValue()" %typemap(javaout) enum SWIGTYPE { return $javaclassname.swigToEnum($jnicall); } %typemap(javaclassmodifiers) enum SWIGTYPE "public enum" %typemap(javabase) enum SWIGTYPE "" %typemap(javacode) enum SWIGTYPE "" %typemap(javaimports) enum SWIGTYPE "" %typemap(javainterfaces) enum SWIGTYPE "" /* * SwigNext static inner class used instead of a static int as static fields cannot be accessed from enum initialisers. * The swigToEnum method is used to find the Java enum from a C++ enum integer value. The default one here takes * advantage of the fact that most enums do not have initial values specified, so the lookup is fast. If initial * values are specified then a lengthy linear search through all possible enums might occur. Specific typemaps could be * written to possibly optimise this lookup by taking advantage of characteristics peculiar to the targeted enum. */ %typemap(javabody) enum SWIGTYPE %{ public final int swigValue() { return swigValue; } public static $javaclassname swigToEnum(int swigValue) { $javaclassname[] swigValues = $javaclassname.class.getEnumConstants(); if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue) return swigValues[swigValue]; for ($javaclassname swigEnum : swigValues) if (swigEnum.swigValue == swigValue) return swigEnum; throw new IllegalArgumentException("No enum " + $javaclassname.class + " with value " + swigValue); } @SuppressWarnings("unused") private $javaclassname() { this.swigValue = SwigNext.next++; } @SuppressWarnings("unused") private $javaclassname(int swigValue) { this.swigValue = swigValue; SwigNext.next = swigValue+1; } @SuppressWarnings("unused") private $javaclassname($javaclassname swigEnum) { this.swigValue = swigEnum.swigValue; SwigNext.next = this.swigValue+1; } private final int swigValue; private static class SwigNext { private static int next = 0; } %} %javaenum(proper); swig-3.0.12/Lib/java/std_auto_ptr.i0000664000175000017500000000151613042756442016750 0ustar williamwilliam/* The typemaps here allow to handle functions returning std::auto_ptr<>, which is the most common use of this type. If you have functions taking it as parameter, these typemaps can't be used for them and you need to do something else (e.g. use shared_ptr<> which SWIG supports fully). */ %define %auto_ptr(TYPE) %typemap (jni) std::auto_ptr "jlong" %typemap (jtype) std::auto_ptr "long" %typemap (jstype) std::auto_ptr "$typemap(jstype, TYPE)" %typemap (out) std::auto_ptr %{ jlong lpp = 0; *(TYPE**) &lpp = $1.release(); $result = lpp; %} %typemap(javaout) std::auto_ptr { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %template() std::auto_ptr; %enddef namespace std { template class auto_ptr {}; } swig-3.0.12/Lib/java/javahead.swg0000664000175000017500000001012513042756442016350 0ustar williamwilliam/* ----------------------------------------------------------------------------- * javahead.swg * * Java support code * ----------------------------------------------------------------------------- */ /* JNI function calls require different calling conventions for C and C++. These JCALL macros are used so * that the same typemaps can be used for generating code for both C and C++. The SWIG preprocessor can expand * the macros thereby generating the correct calling convention. It is thus essential that all typemaps that * use the macros are not within %{ %} brackets as they won't be run through the SWIG preprocessor. */ #ifdef __cplusplus # define JCALL0(func, jenv) jenv->func() # define JCALL1(func, jenv, ar1) jenv->func(ar1) # define JCALL2(func, jenv, ar1, ar2) jenv->func(ar1, ar2) # define JCALL3(func, jenv, ar1, ar2, ar3) jenv->func(ar1, ar2, ar3) # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) jenv->func(ar1, ar2, ar3, ar4) # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) jenv->func(ar1, ar2, ar3, ar4, ar5) # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6) # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6, ar7) #else # define JCALL0(func, jenv) (*jenv)->func(jenv) # define JCALL1(func, jenv, ar1) (*jenv)->func(jenv, ar1) # define JCALL2(func, jenv, ar1, ar2) (*jenv)->func(jenv, ar1, ar2) # define JCALL3(func, jenv, ar1, ar2, ar3) (*jenv)->func(jenv, ar1, ar2, ar3) # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) (*jenv)->func(jenv, ar1, ar2, ar3, ar4) # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5) # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6) # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) #endif %insert(runtime) %{ /* Fix for jlong on some versions of gcc on Windows */ #if defined(__GNUC__) && !defined(__INTEL_COMPILER) typedef long long __int64; #endif /* Fix for jlong on 64-bit x86 Solaris */ #if defined(__x86_64) # ifdef _LP64 # undef _LP64 # endif #endif #include #include #include %} %insert(runtime) %{ /* Support for throwing Java exceptions */ typedef enum { SWIG_JavaOutOfMemoryError = 1, SWIG_JavaIOException, SWIG_JavaRuntimeException, SWIG_JavaIndexOutOfBoundsException, SWIG_JavaArithmeticException, SWIG_JavaIllegalArgumentException, SWIG_JavaNullPointerException, SWIG_JavaDirectorPureVirtual, SWIG_JavaUnknownError } SWIG_JavaExceptionCodes; typedef struct { SWIG_JavaExceptionCodes code; const char *java_exception; } SWIG_JavaExceptions_t; %} %insert(runtime) { static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { jclass excep; static const SWIG_JavaExceptions_t java_exceptions[] = { { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, { SWIG_JavaIOException, "java/io/IOException" }, { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, { SWIG_JavaUnknownError, "java/lang/UnknownError" }, { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } }; const SWIG_JavaExceptions_t *except_ptr = java_exceptions; while (except_ptr->code != code && except_ptr->code) except_ptr++; JCALL0(ExceptionClear, jenv); excep = JCALL1(FindClass, jenv, except_ptr->java_exception); if (excep) JCALL2(ThrowNew, jenv, excep, msg); } } %insert(runtime) %{ /* Contract support */ #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else %} swig-3.0.12/Lib/java/stl.i0000664000175000017500000000044313042756442015041 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stl.i * ----------------------------------------------------------------------------- */ %include %include %include %include %include swig-3.0.12/Lib/java/various.i0000664000175000017500000001336013042756442015731 0ustar williamwilliam/* ----------------------------------------------------------------------------- * various.i * * SWIG Typemap library for Java. * Various useful typemaps. * ----------------------------------------------------------------------------- */ /* * char **STRING_ARRAY typemaps. * These typemaps are for C String arrays which are NULL terminated. * char *values[] = { "one", "two", "three", NULL }; // note NULL * char ** is mapped to a Java String[]. * * Example usage wrapping: * %apply char **STRING_ARRAY { char **input }; * char ** foo(char **input); * * Java usage: * String numbers[] = { "one", "two", "three" }; * String[] ret = modulename.foo( numbers }; */ %typemap(jni) char **STRING_ARRAY "jobjectArray" %typemap(jtype) char **STRING_ARRAY "String[]" %typemap(jstype) char **STRING_ARRAY "String[]" %typemap(in) char **STRING_ARRAY (jint size) { int i = 0; if ($input) { size = JCALL1(GetArrayLength, jenv, $input); #ifdef __cplusplus $1 = new char*[size+1]; #else $1 = (char **)malloc((size+1) * sizeof(char *)); #endif for (i = 0; i %} namespace std { %naturalvar string; class string; // string %typemap(jni) string "jstring" %typemap(jtype) string "String" %typemap(jstype) string "String" %typemap(javadirectorin) string "$jniinput" %typemap(javadirectorout) string "$javacall" %typemap(in) string %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $1.assign($1_pstr); jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorout) string %{ if(!$input) { if (!jenv->ExceptionCheck()) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); } return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $result.assign($1_pstr); jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") string %{ $input = jenv->NewStringUTF($1.c_str()); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(out) string %{ $result = jenv->NewStringUTF($1.c_str()); %} %typemap(javain) string "$javainput" %typemap(javaout) string { return $jnicall; } %typemap(typecheck) string = char *; %typemap(throws) string %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.c_str()); return $null; %} // const string & %typemap(jni) const string & "jstring" %typemap(jtype) const string & "String" %typemap(jstype) const string & "String" %typemap(javadirectorin) const string & "$jniinput" %typemap(javadirectorout) const string & "$javacall" %typemap(in) const string & %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; $*1_ltype $1_str($1_pstr); $1 = &$1_str; jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string & %{ if(!$input) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string"); return $null; } const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0); if (!$1_pstr) return $null; /* possible thread/reentrant code problem */ static $*1_ltype $1_str; $1_str = $1_pstr; $result = &$1_str; jenv->ReleaseStringUTFChars($input, $1_pstr); %} %typemap(directorin,descriptor="Ljava/lang/String;") const string & %{ $input = jenv->NewStringUTF($1.c_str()); Swig::LocalRefGuard $1_refguard(jenv, $input); %} %typemap(out) const string & %{ $result = jenv->NewStringUTF($1->c_str()); %} %typemap(javain) const string & "$javainput" %typemap(javaout) const string & { return $jnicall; } %typemap(typecheck) const string & = char *; %typemap(throws) const string & %{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1.c_str()); return $null; %} } swig-3.0.12/Lib/java/std_map.i0000664000175000017500000000444113042756442015670 0ustar williamwilliam/* ----------------------------------------------------------------------------- * std_map.i * * SWIG typemaps for std::map * ----------------------------------------------------------------------------- */ %include // ------------------------------------------------------------------------ // std::map // ------------------------------------------------------------------------ %{ #include #include #include %} // exported class namespace std { template class map { // add typemaps here public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef K key_type; typedef T mapped_type; map(); map(const map &); unsigned int size() const; bool empty() const; void clear(); %extend { const T& get(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } void set(const K& key, const T& x) { (*self)[key] = x; } void del(const K& key) throw (std::out_of_range) { std::map::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } bool has_key(const K& key) { std::map::iterator i = self->find(key); return i != self->end(); } } }; // Legacy macros (deprecated) %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_key ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) #warning "specialize_std_map_on_value ignored - macro is deprecated and no longer necessary" %enddef %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) #warning "specialize_std_map_on_both ignored - macro is deprecated and no longer necessary" %enddef } swig-3.0.12/Lib/java/swiginterface.i0000664000175000017500000000651513042756442017077 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swiginterface.i * * SWIG interface feature and typemaps implementation providing: * %interface * %interface_impl * %interface_custom * ----------------------------------------------------------------------------- */ %define INTERFACE_TYPEMAPS(CTYPE...) %typemap(jtype) CTYPE, CTYPE *, CTYPE *const&, CTYPE [], CTYPE & "long" %typemap(jstype) CTYPE "$&javainterfacename" %typemap(jstype) CTYPE *, CTYPE [], CTYPE & "$javainterfacename" %typemap(jstype) CTYPE *const& "$*javainterfacename" %typemap(javain) CTYPE "$javainput.$&interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE & "$javainput.$interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE *, CTYPE [] "($javainput == null) ? 0 : $javainput.$interfacename_GetInterfaceCPtr()" %typemap(javain) CTYPE *const& "($javainput == null) ? 0 : $javainput.$*interfacename_GetInterfaceCPtr()" %typemap(javaout) CTYPE { return ($&javainterfacename)new $&javaclassname($jnicall, true); } %typemap(javaout) CTYPE & { return ($javainterfacename)new $javaclassname($jnicall, $owner); } %typemap(javaout) CTYPE *, CTYPE [] { long cPtr = $jnicall; return (cPtr == 0) ? null : ($javainterfacename)new $javaclassname(cPtr, $owner); } %typemap(javaout) CTYPE *const& { long cPtr = $jnicall; return (cPtr == 0) ? null : ($javainterfacename)new $javaclassname(cPtr, $owner); } %typemap(javadirectorin) CTYPE "($&javainterfacename)new $&javaclassname($jniinput, true)" %typemap(javadirectorin) CTYPE & "($javainterfacename)new $javaclassname($jniinput, false)" %typemap(javadirectorin) CTYPE *, CTYPE [] "($jniinput == 0) ? null : ($javainterfacename)new $javaclassname($jniinput, false)" %typemap(javadirectorin) CTYPE *const& "($jniinput == 0) ? null : ($*javainterfacename)new $*javaclassname($jniinput, false)" %typemap(javadirectorout) CTYPE "$javacall.$&interfacename_GetInterfaceCPtr()" %typemap(javadirectorout) CTYPE *, CTYPE [], CTYPE & "$javacall.$interfacename_GetInterfaceCPtr()" %typemap(javadirectorout) CTYPE *const& "$javacall.$*interfacename_GetInterfaceCPtr()" %typemap(directorin,descriptor="L$packagepath/$&javainterfacename;") CTYPE %{ $input = 0; *(($&1_ltype*)&$input) = new $1_ltype((const $1_ltype &)$1); %} %typemap(directorin,descriptor="L$packagepath/$javainterfacename;") CTYPE *, CTYPE [] %{ *(($&1_ltype)&$input) = ($1_ltype) $1; %} %typemap(directorin,descriptor="L$packagepath/$javainterfacename;") CTYPE & %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(directorin,descriptor="L$packagepath/$*javainterfacename;") CTYPE *const& %{ *($&1_ltype)&$input = ($1_ltype) &$1; %} %typemap(javainterfacecode, declaration=" long $interfacename_GetInterfaceCPtr();\n", cptrmethod="$interfacename_GetInterfaceCPtr") CTYPE %{ public long $interfacename_GetInterfaceCPtr() { return $imclassname.$javaclazzname$interfacename_GetInterfaceCPtr(swigCPtr); } %} %enddef %define %interface(CTYPE...) %feature("interface", name="%sSwigInterface") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_impl(CTYPE...) %rename("%sSwigImpl") CTYPE; %feature("interface", name="%(rstrip:[SwigImpl])s") CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef %define %interface_custom(PROXY, INTERFACE, CTYPE...) %rename(PROXY) CTYPE; %feature("interface", name=INTERFACE) CTYPE; INTERFACE_TYPEMAPS(CTYPE) %enddef swig-3.0.12/Lib/java/boost_shared_ptr.i0000664000175000017500000002116313042756442017602 0ustar williamwilliam// Users can provide their own SWIG_SHARED_PTR_TYPEMAPS macro before including this file to change the // visibility of the constructor and getCPtr method if desired to public if using multiple modules. #ifndef SWIG_SHARED_PTR_TYPEMAPS #define SWIG_SHARED_PTR_TYPEMAPS(CONST, TYPE...) SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(protected, protected, CONST, TYPE) #endif %include // Language specific macro implementing all the customisations for handling the smart pointer %define SWIG_SHARED_PTR_TYPEMAPS_IMPLEMENTATION(PTRCTOR_VISIBILITY, CPTR_VISIBILITY, CONST, TYPE...) // %naturalvar is as documented for member variables %naturalvar TYPE; %naturalvar SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; // destructor wrapper customisation %feature("unref") TYPE //"if (debug_shared) { cout << \"deleting use_count: \" << (*smartarg1).use_count() << \" [\" << (boost::get_deleter(*smartarg1) ? std::string(\"CANNOT BE DETERMINED SAFELY\") : ( (*smartarg1).get() ? (*smartarg1)->getValue() : std::string(\"NULL PTR\") )) << \"]\" << endl << flush; }\n" "(void)arg1; delete smartarg1;" // Typemap customisations... // plain value %typemap(in) CONST TYPE ($&1_type argp = 0) %{ argp = (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0; if (!argp) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "Attempt to dereference null $1_type"); return $null; } $1 = *argp; %} %typemap(out) CONST TYPE %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(new $1_ltype(($1_ltype &)$1)); %} // plain pointer %typemap(in) CONST TYPE * (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *smartarg = 0) %{ smartarg = *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input; $1 = (TYPE *)(smartarg ? smartarg->get() : 0); %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE * %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = $1 ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner) : 0; %} // plain reference %typemap(in) CONST TYPE & %{ $1 = ($1_ltype)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); if (!$1) { SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "$1_type reference is null"); return $null; } %} %typemap(out, fragment="SWIG_null_deleter") CONST TYPE & %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >($1 SWIG_NO_NULL_DELETER_$owner); %} // plain pointer by reference %typemap(in) TYPE *CONST& ($*1_ltype temp = 0) %{ temp = (TYPE *)((*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input) ? (*(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$input)->get() : 0); $1 = &temp; %} %typemap(out, fragment="SWIG_null_deleter") TYPE *CONST& %{ *(SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > **)&$result = new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(*$1 SWIG_NO_NULL_DELETER_$owner); %} // shared_ptr by value %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > ($&1_type argp) %{ argp = *($&1_ltype*)&$input; if (argp) $1 = *argp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > %{ *($&1_ltype*)&$result = $1 ? new $1_ltype($1) : 0; %} // shared_ptr by reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & %{ *($&1_ltype)&$result = *$1 ? new $*1_ltype(*$1) : 0; %} // shared_ptr by pointer %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * ($*1_ltype tempnull) %{ $1 = $input ? *($&1_ltype)&$input : &tempnull; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * %{ *($&1_ltype)&$result = ($1 && *$1) ? new $*1_ltype(*$1) : 0; if ($owner) delete $1; %} // shared_ptr by pointer reference %typemap(in) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& (SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > tempnull, $*1_ltype temp = 0) %{ temp = $input ? *($1_ltype)&$input : &tempnull; $1 = &temp; %} %typemap(out) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& %{ *($1_ltype)&$result = (*$1 && **$1) ? new SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >(**$1) : 0; %} // various missing typemaps - If ever used (unlikely) ensure compilation error rather than runtime bug %typemap(in) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap(out) CONST TYPE[], CONST TYPE[ANY], CONST TYPE (CLASS::*) %{ #error "typemaps for $1_type not available" %} %typemap (jni) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "jlong" %typemap (jtype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "long" %typemap (jstype) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE)" %typemap(javain) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > &, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *, SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& "$typemap(jstype, TYPE).getCPtr($javainput)" %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > & { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE > *& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) CONST TYPE { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE & { return new $typemap(jstype, TYPE)($jnicall, true); } %typemap(javaout) CONST TYPE * { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } %typemap(javaout) TYPE *CONST& { long cPtr = $jnicall; return (cPtr == 0) ? null : new $typemap(jstype, TYPE)(cPtr, true); } // Base proxy classes %typemap(javabody) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwn; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} // Derived proxy classes %typemap(javabody_derived) TYPE %{ private transient long swigCPtr; private transient boolean swigCMemOwnDerived; PTRCTOR_VISIBILITY $javaclassname(long cPtr, boolean cMemoryOwn) { super($imclassname.$javaclazznameSWIGSmartPtrUpcast(cPtr), true); swigCMemOwnDerived = cMemoryOwn; swigCPtr = cPtr; } CPTR_VISIBILITY static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javadestruct, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwn) { swigCMemOwn = false; $jnicall; } swigCPtr = 0; } } %typemap(javadestruct_derived, methodname="delete", methodmodifiers="public synchronized") TYPE { if (swigCPtr != 0) { if (swigCMemOwnDerived) { swigCMemOwnDerived = false; $jnicall; } swigCPtr = 0; } super.delete(); } %template() SWIG_SHARED_PTR_QNAMESPACE::shared_ptr< CONST TYPE >; %enddef swig-3.0.12/Lib/stdint.i0000664000175000017500000000450013042756442014621 0ustar williamwilliam/* ----------------------------------------------------------------------------- * stdint.i * * SWIG library file for ISO C99 types: 7.18 Integer types * ----------------------------------------------------------------------------- */ %{ #include // Use the C99 official header %} %include /* Exact integral types. */ /* Signed. */ typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; #if defined(SWIGWORDSIZE64) typedef long int int64_t; #else typedef long long int int64_t; #endif /* Unsigned. */ typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint64_t; #else typedef unsigned long long int uint64_t; #endif /* Small types. */ /* Signed. */ typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; #if defined(SWIGWORDSIZE64) typedef long int int_least64_t; #else typedef long long int int_least64_t; #endif /* Unsigned. */ typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint_least64_t; #else typedef unsigned long long int uint_least64_t; #endif /* Fast types. */ /* Signed. */ typedef signed char int_fast8_t; #if defined(SWIGWORDSIZE64) typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; #else typedef int int_fast16_t; typedef int int_fast32_t; typedef long long int int_fast64_t; #endif /* Unsigned. */ typedef unsigned char uint_fast8_t; #if defined(SWIGWORDSIZE64) typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; #else typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t; typedef unsigned long long int uint_fast64_t; #endif /* Types for `void *' pointers. */ #if defined(SWIGWORDSIZE64) typedef long int intptr_t; typedef unsigned long int uintptr_t; #else typedef int intptr_t; typedef unsigned int uintptr_t; #endif /* Largest integral types. */ #if defined(SWIGWORDSIZE64) typedef long int intmax_t; typedef unsigned long int uintmax_t; #else typedef long long int intmax_t; typedef unsigned long long int uintmax_t; #endif swig-3.0.12/Lib/swigrun.swg0000664000175000017500000004042613042756442015371 0ustar williamwilliam/* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows to return the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) #define SWIG_ERROR (-1) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. We choose to print the last name, as it is often (?) the most specific. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = (unsigned char)((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = (unsigned char)((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (unsigned char)(d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (unsigned char)(d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif swig-3.0.12/Lib/cdata.i0000664000175000017500000000615513042756442014400 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cdata.i * * SWIG library file containing macros for manipulating raw C data as strings. * ----------------------------------------------------------------------------- */ %{ typedef struct SWIGCDATA { char *data; int len; } SWIGCDATA; %} /* ----------------------------------------------------------------------------- * Typemaps for returning binary data * ----------------------------------------------------------------------------- */ #if SWIGGUILE %typemap(out) SWIGCDATA { $result = scm_from_locale_stringn($1.data,$1.len); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGCHICKEN %typemap(out) SWIGCDATA { C_word *string_space = C_alloc(C_SIZEOF_STRING($1.len)); $result = C_string(&string_space, $1.len, $1.data); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGPHP5 %typemap(out) SWIGCDATA { ZVAL_STRINGL($result, $1.data, $1.len, 1); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGPHP7 %typemap(out) SWIGCDATA { ZVAL_STRINGL($result, $1.data, $1.len); } %typemap(in) (const void *indata, int inlen) = (char *STRING, int LENGTH); #elif SWIGJAVA %apply (char *STRING, int LENGTH) { (const void *indata, int inlen) } %typemap(jni) SWIGCDATA "jbyteArray" %typemap(jtype) SWIGCDATA "byte[]" %typemap(jstype) SWIGCDATA "byte[]" %fragment("SWIG_JavaArrayOutCDATA", "header") { static jbyteArray SWIG_JavaArrayOutCDATA(JNIEnv *jenv, char *result, jsize sz) { jbyte *arr; int i; jbyteArray jresult = JCALL1(NewByteArray, jenv, sz); if (!jresult) return NULL; arr = JCALL2(GetByteArrayElements, jenv, jresult, 0); if (!arr) return NULL; for (i=0; i %} %include extern void JvInitClass (jclass cls); extern jstring JvAllocString (jsize sz); extern jstring JvNewString (const jchar *chars, jsize len); extern jstring JvNewStringLatin1 (const char *bytes, jsize len); extern jstring JvNewStringLatin1 (const char *bytes); extern jchar* JvGetStringChars (jstring str); extern jsize JvGetStringUTFLength (jstring string); extern jsize JvGetStringUTFRegion (jstring str, jsize start, jsize len, char *buf); extern jstring JvNewStringUTF (const char *bytes); extern void *JvMalloc (jsize size); extern void JvFree (void *ptr); extern jint JvCreateJavaVM (JvVMInitArgs* vm_args); extern java::lang::Thread* JvAttachCurrentThread (jstring name, java::lang::ThreadGroup* group); extern java::lang::Thread* JvAttachCurrentThreadAsDaemon (jstring name, java::lang::ThreadGroup* group); extern jint JvDetachCurrentThread (void); %include swig-3.0.12/Lib/gcj/javaprims.i0000664000175000017500000002670413042756442016065 0ustar williamwilliam%include typedef int8_t jbyte; typedef int16_t jshort; typedef int32_t jint; typedef int64_t jlong; typedef float jfloat; typedef double jdouble; typedef jint jsize; typedef int8_t jboolean; extern "Java" { namespace java { namespace io { class BufferedInputStream; class BufferedOutputStream; class BufferedReader; class BufferedWriter; class ByteArrayInputStream; class ByteArrayOutputStream; class CharArrayReader; class CharArrayWriter; class CharConversionException; class DataInput; class DataInputStream; class DataOutput; class DataOutputStream; class EOFException; class Externalizable; class File; class FileDescriptor; class FileFilter; class FileInputStream; class FileNotFoundException; class FileOutputStream; class FilePermission; class FileReader; class FileWriter; class FilenameFilter; class FilterInputStream; class FilterOutputStream; class FilterReader; class FilterWriter; class IOException; class InputStream; class InputStreamReader; class InterfaceComparator; class InterruptedIOException; class InvalidClassException; class InvalidObjectException; class LineNumberInputStream; class LineNumberReader; class MemberComparator; class NotActiveException; class NotSerializableException; class ObjectInput; class ObjectInputStream; class ObjectInputStream$GetField; class ObjectInputValidation; class ObjectOutput; class ObjectOutputStream; class ObjectOutputStream$PutField; class ObjectStreamClass; class ObjectStreamConstants; class ObjectStreamException; class ObjectStreamField; class OptionalDataException; class OutputStream; class OutputStreamWriter; class PipedInputStream; class PipedOutputStream; class PipedReader; class PipedWriter; class PrintStream; class PrintWriter; class PushbackInputStream; class PushbackReader; class RandomAccessFile; class Reader; class SequenceInputStream; class Serializable; class SerializablePermission; class StreamCorruptedException; class StreamTokenizer; class StringBufferInputStream; class StringReader; class StringWriter; class SyncFailedException; class UTFDataFormatException; class UnsupportedEncodingException; class VMObjectStreamClass; class ValidatorAndPriority; class WriteAbortedException; class Writer; } namespace lang { class AbstractMethodError; class ArithmeticException; class ArrayIndexOutOfBoundsException; class ArrayStoreException; class AssertionError; class Boolean; class Byte; class CharSequence; class Character; class Character$Subset; class Character$UnicodeBlock; class Class; class ClassCastException; class ClassCircularityError; class ClassFormatError; class ClassLoader; class ClassNotFoundException; class CloneNotSupportedException; class Cloneable; class Comparable; class Compiler; class ConcreteProcess; class Double; class Error; class Exception; class ExceptionInInitializerError; class Float; class IllegalAccessError; class IllegalAccessException; class IllegalArgumentException; class IllegalMonitorStateException; class IllegalStateException; class IllegalThreadStateException; class IncompatibleClassChangeError; class IndexOutOfBoundsException; class InheritableThreadLocal; class InstantiationError; class InstantiationException; class Integer; class InternalError; class InterruptedException; class LinkageError; class Long; class Math; class NegativeArraySizeException; class NoClassDefFoundError; class NoSuchFieldError; class NoSuchFieldException; class NoSuchMethodError; class NoSuchMethodException; class NullPointerException; class Number; class NumberFormatException; class Object; class OutOfMemoryError; class Package; class Process; class Runnable; class Runtime; class RuntimeException; class RuntimePermission; class SecurityContext; class SecurityException; class SecurityManager; class Short; class StackOverflowError; class StackTraceElement; class StrictMath; class String; class String$CaseInsensitiveComparator; class StringBuffer; class StringIndexOutOfBoundsException; class System; class Thread; class ThreadDeath; class ThreadGroup; class ThreadLocal; class Throwable; class UnknownError; class UnsatisfiedLinkError; class UnsupportedClassVersionError; class UnsupportedOperationException; class VMClassLoader; class VMSecurityManager; class VMThrowable; class VerifyError; class VirtualMachineError; class Void; namespace ref { class PhantomReference; class Reference; class ReferenceQueue; class SoftReference; class WeakReference; } namespace reflect { class AccessibleObject; class Array; class Constructor; class Field; class InvocationHandler; class InvocationTargetException; class Member; class Method; class Modifier; class Proxy; class Proxy$ClassFactory; class Proxy$ProxyData; class Proxy$ProxySignature; class Proxy$ProxyType; class ReflectPermission; class UndeclaredThrowableException; } } namespace util { class AbstractCollection; class AbstractList; class AbstractMap; class AbstractMap$BasicMapEntry; class AbstractSequentialList; class AbstractSet; class ArrayList; class Arrays; class Arrays$ArrayList; class BitSet; class Calendar; class Collection; class Collections; class Collections$CopiesList; class Collections$EmptyList; class Collections$EmptyMap; class Collections$EmptySet; class Collections$ReverseComparator; class Collections$SingletonList; class Collections$SingletonMap; class Collections$SingletonSet; class Collections$SynchronizedCollection; class Collections$SynchronizedIterator; class Collections$SynchronizedList; class Collections$SynchronizedListIterator; class Collections$SynchronizedMap; class Collections$SynchronizedMapEntry; class Collections$SynchronizedRandomAccessList; class Collections$SynchronizedSet; class Collections$SynchronizedSortedMap; class Collections$SynchronizedSortedSet; class Collections$UnmodifiableCollection; class Collections$UnmodifiableEntrySet; class Collections$UnmodifiableIterator; class Collections$UnmodifiableList; class Collections$UnmodifiableListIterator; class Collections$UnmodifiableMap; class Collections$UnmodifiableRandomAccessList; class Collections$UnmodifiableSet; class Collections$UnmodifiableSortedMap; class Collections$UnmodifiableSortedSet; class Comparator; class ConcurrentModificationException; class Currency; class Date; class Dictionary; class EmptyStackException; class Enumeration; class EventListener; class EventListenerProxy; class EventObject; class GregorianCalendar; class HashMap; class HashMap$HashEntry; class HashMap$HashIterator; class HashSet; class Hashtable; class Hashtable$Enumerator; class Hashtable$HashEntry; class Hashtable$HashIterator; class IdentityHashMap; class IdentityHashMap$IdentityEntry; class IdentityHashMap$IdentityIterator; class Iterator; class LinkedHashMap; class LinkedHashMap$LinkedHashEntry; class LinkedHashSet; class LinkedList; class LinkedList$Entry; class LinkedList$LinkedListItr; class List; class ListIterator; class ListResourceBundle; class Locale; class Map; class Map$Entry; class Map$Map; class MissingResourceException; class MyResources; class NoSuchElementException; class Observable; class Observer; class Properties; class PropertyPermission; class PropertyPermissionCollection; class PropertyResourceBundle; class Random; class RandomAccess; class RandomAccessSubList; class ResourceBundle; class Set; class SimpleTimeZone; class SortedMap; class SortedSet; class Stack; class StringTokenizer; class SubList; class TimeZone; class Timer; class Timer$Scheduler; class Timer$TaskQueue; class TimerTask; class TooManyListenersException; class TreeMap; class TreeMap$Node; class TreeMap$SubMap; class TreeMap$TreeIterator; class TreeSet; class Vector; class WeakHashMap; class WeakHashMap$WeakBucket; class WeakHashMap$WeakEntry; class WeakHashMap$WeakEntrySet; namespace jar { class Attributes; class Attributes$Name; class JarEntry; class JarException; class JarFile; class JarFile$JarEnumeration; class JarInputStream; class JarOutputStream; class Manifest; } namespace logging { class ConsoleHandler; class ErrorManager; class FileHandler; class Filter; class Formatter; class Handler; class Level; class LogManager; class LogRecord; class Logger; class LoggingPermission; class MemoryHandler; class SimpleFormatter; class SocketHandler; class StreamHandler; class XMLFormatter; } namespace prefs { class AbstractPreferences; class BackingStoreException; class InvalidPreferencesFormatException; class NodeChangeEvent; class NodeChangeListener; class PreferenceChangeEvent; class PreferenceChangeListener; class Preferences; class PreferencesFactory; } namespace regex { class Matcher; class Pattern; class PatternSyntaxException; } namespace zip { class Adler32; class CRC32; class CheckedInputStream; class CheckedOutputStream; class Checksum; class DataFormatException; class Deflater; class DeflaterOutputStream; class GZIPInputStream; class GZIPOutputStream; class Inflater; class InflaterInputStream; class ZipConstants; class ZipEntry; class ZipException; class ZipFile; class ZipFile$PartialInputStream; class ZipFile$ZipEntryEnumeration; class ZipInputStream; class ZipOutputStream; } } } } typedef class java::lang::Object* jobject; typedef class java::lang::Class* jclass; typedef class java::lang::Throwable* jthrowable; typedef class java::lang::String* jstring; %include swig-3.0.12/Lib/cstring.i0000664000175000017500000000050413042756442014765 0ustar williamwilliam/* ----------------------------------------------------------------------------- * cstring.i * ----------------------------------------------------------------------------- */ %echo "cstring.i not implemented for this target" #define SWIG_CSTRING_UNIMPL /* old name keep for compatibility */ #define _CSTRING_UNIMPL swig-3.0.12/LICENSE-GPL0000664000175000017500000010451313042756442014066 0ustar williamwilliam 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 . swig-3.0.12/CHANGES.current0000664000175000017500000001212113042756442015106 0ustar williamwilliamBelow are the changes for the current release. See the CHANGES file for changes in older releases. See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 3.0.12 (27 Jan 2017) ============================ 2017-01-27: wsfulton [C#] #882 Fix missing filename in error messages when there is a problem writing out C# files. 2017-01-27: briancaine [Guile] #744 Fix compilation errors in Guile wrappers - regression introduced in swig-3.0.11. 2017-01-24: andrey-starodubtsev [Java] Apply #704 - director typemap improvements. Memory leak fixes, add support for "directorargout" typemap and add director support to typemaps.i. 2017-01-24: wsfulton Enhance %extend to extend a class with template constructors, eg: struct Foo { %extend { template Foo(int a, T b) { ... } } }; %template(Foo) Foo::Foo; 2017-01-22: wsfulton Issue #876 Enhance %extend to extend a class with template methods, eg: struct Foo { %extend { template void do_stuff(int a, T b) { ... } } }; %template(do_stuff_inst) Foo::do_stuff; Similarly for static template methods. 2017-01-22: kwwette [Octave] add support for version 4.2 - The Octave API now uses some C++11 features. It is recommended to use the mkoctfile program supplied by Octave to compile the SWIG-generated wrapper code, as mkoctfile will ensure the correct C++ compiler/options are used. Otherwise, the value of `mkoctfile -p CXX` should be parsed for any -std=* flags which might be present. - Octave has dropped support for << and >> operators, so SWIG now ignores them. - The Octave error() function now raises C++ exceptions to propagate Octave errors, so %exception directives may need to be modified. For convenience the SWIG_RETHROW_OCTAVE_EXCEPTIONS macro can be used to rethrow any Octave exceptions for Octave itself to handle, e.g.: try { $action // may call error() } SWIG_RETHROW_OCTAVE_EXCEPTIONS // error() exceptions are rethrown catch(...) { ... // all other exceptions } *** POTENTIAL INCOMPATIBILITY *** 2017-01-16: wkalinin [C#] Fix #733 regression introduced in swig-3.0.9. Missing virtual function override in C# layer when using %import. 2017-01-16: fschlimb Fix #813 template symbol name lookup bug when typedef names are the same but in different namespaces. 2017-01-15: wsfulton [C# D Java] The SWIG library no longer uses the javatype, dtype or cstype typemaps, thereby completely freeing them up for users to use without having to replicate the library code that they previously added. The code previously generated by these typemaps has been replaced by the new %proxycode directive. Their use in the library code was fairly minimal: C# cstype: std_array.i std_map.i std_vector.i D dtype: std_vector.i Java javatype: arrays_java.i 2017-01-14: wsfulton The %extend directive can now optionally support one of the 'class', 'struct' or 'union' keywords before the identifier name, for example: struct X { ... }; %extend struct X { ... } Previously this had to specified as: struct X { ... }; %extend X { ... } 2017-01-13: wsfulton [C# D Java] Add new %proxycode directive which is a macro for %insert("proxycode"). This is a way of adding pure C#/D/Java code into the appropriate proxy class, eg: %extend Proxy2 { %proxycode %{ public int proxycode2(int i) { return i+2; } %} } %inline %{ struct Proxy2 {}; %} There will then be a pure Java/C#/D method called proxycode2 in the Proxy2 class. 2016-12-31: ajrheading1 Issue #860 - Remove use of std::unary_function and std::binary_function which is deprecated in C++11. 2016-12-30: olly [PHP7] Register internal 'swig_runtime_data_type_pointer' constant as "CONST_PERSISTENT" to avoid segmentation fault on module unload. Fixes #859 reported by Timotheus Pokorra. Thanks also to Javier Torres for a minimal reproducer. swig-3.0.12/.travis.yml0000664000175000017500000002257213042756442014556 0ustar williamwilliamlanguage: cpp matrix: include: - compiler: clang os: linux env: SWIGLANG= sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG= - compiler: gcc os: linux env: SWIGLANG= sudo: required dist: trusty - os: linux env: SWIGLANG= SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 sudo: required dist: trusty - os: linux env: SWIGLANG= SWIG_CC=gcc-6 SWIG_CXX=g++-6 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=csharp sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=d sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=go sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=go VER=1.5 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=guile sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=java sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=node - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=jsc sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=javascript ENGINE=v8 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=lua sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=lua VER=5.3 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 # 3.8 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.0 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=octave SWIGJOBS=-j2 VER=4.2 CPP11=1 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=perl5 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=php5 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=php VER=7.0 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=php VER=7.1 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python VER=2.4 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python VER=2.5 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python VER=2.6 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python # 2.7 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.2 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.3 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.4 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python PY3=3 VER=3.5 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin VER=2.6 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.4 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-builtin PY3=3 VER=3.5 SWIGOPTPY3= sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-O sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-classic sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=r sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=ruby VER=1.9.3 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.0.0 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=ruby VER=2.3.0 sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=scilab sudo: required dist: trusty - compiler: gcc os: linux env: SWIGLANG=tcl sudo: required dist: trusty - os: linux env: SWIGLANG=csharp SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 sudo: required dist: trusty - os: linux env: SWIGLANG=java SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 sudo: required dist: trusty - os: linux env: SWIGLANG=python SWIG_CC=gcc-5 SWIG_CXX=g++-5 CPP11=1 sudo: required dist: trusty - os: linux env: SWIGLANG=csharp SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1 sudo: required dist: trusty - os: linux env: SWIGLANG=java SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1 sudo: required dist: trusty - os: linux env: SWIGLANG=python SWIG_CC=gcc-6 SWIG_CXX=g++-6 CPP14=1 sudo: required dist: trusty - compiler: gcc os: osx env: SWIGLANG= - compiler: clang os: osx env: SWIGLANG= - compiler: clang os: osx env: SWIGLANG=csharp - compiler: clang os: osx env: SWIGLANG=go - compiler: clang os: osx env: SWIGLANG=guile - compiler: clang os: osx env: SWIGLANG=java - compiler: clang os: osx env: SWIGLANG=lua - compiler: clang os: osx env: SWIGLANG=perl5 - compiler: clang os: osx env: SWIGLANG=php5 - compiler: clang os: osx env: SWIGLANG=python - compiler: clang os: osx env: SWIGLANG=python PY3=3 - compiler: clang os: osx env: SWIGLANG=ruby - compiler: clang os: osx env: SWIGLANG=tcl allow_failures: # Lots of failing tests currently - compiler: gcc os: linux env: SWIGLANG=ocaml sudo: required dist: trusty # Not quite working yet - compiler: gcc os: linux env: SWIGLANG=python SWIG_FEATURES=-O sudo: required dist: trusty before_install: - date -u - uname -a - if test "$TRAVIS_OS_NAME" = "linux"; then lscpu && cat /proc/cpuinfo | grep "model name" && cat /proc/meminfo | grep MemTotal; fi - if test "$TRAVIS_OS_NAME" = "osx"; then sysctl -a | grep brand_string; fi # Travis overrides CC environment with compiler predefined values - if test -n "$SWIG_CC"; then export CC="$SWIG_CC"; fi - if test -n "$SWIG_CXX"; then export CXX="$SWIG_CXX"; fi install: - if test "$TRAVIS_OS_NAME" = "linux"; then source Tools/travis-linux-install.sh; fi - if test "$TRAVIS_OS_NAME" = "osx"; then source Tools/travis-osx-install.sh; fi - if test -n "$CPP11"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++11 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++11; fi - if test -n "$CPP14"; then CONFIGOPTS+=(--enable-cpp11-testing --without-maximum-compile-warnings "CXXFLAGS=-std=c++14 -Wall -Wextra" "CFLAGS=-std=c11 -Wall -Wextra") && export CSTD=c11 && export CPPSTD=c++14; fi - ls -la $(which $CC) - ls -la $(which $CXX) - $CC --version - $CXX --version script: - echo 'Configuring...' && echo -en 'travis_fold:start:script.1\\r' - if test -n "$SWIGLANG"; then CONFIGOPTS+=(--without-alllang --with-$WITHLANG); fi - echo "${CONFIGOPTS[@]}" - ./autogen.sh && mkdir -p build/build && cd build/build && ../../configure "${CONFIGOPTS[@]}" - echo -en 'travis_fold:end:script.1\\r' - make -s $SWIGJOBS - ./swig -version && ./swig -pcreversion - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-ccache; fi - if test -z "$SWIGLANG"; then make -s $SWIGJOBS check-errors-test-suite; fi - echo 'Installing...' && echo -en 'travis_fold:start:script.2\\r' - if test -z "$SWIGLANG"; then sudo make -s install && swig -version && ccache-swig -V; fi - echo -en 'travis_fold:end:script.2\\r' # Stricter compile flags for examples. Various headers and SWIG generated code prevents full use of -pedantic. - if test -n "$SWIGLANG"; then cflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cflags --std=$CSTD --compiler=$CC) && echo $cflags; fi - if test -n "$SWIGLANG"; then cxxflags=$($TRAVIS_BUILD_DIR/Tools/testflags.py --language $SWIGLANG --cxxflags --std=$CPPSTD --compiler=$CC) && echo $cxxflags; fi - if test -n "$SWIGLANG"; then make -s check-$SWIGLANG-version; fi - if test -n "$SWIGLANG"; then make check-$SWIGLANG-enabled; fi - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-examples CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - if test -n "$SWIGLANG"; then make $SWIGJOBS check-$SWIGLANG-test-suite CFLAGS="$cflags" CXXFLAGS="$cxxflags"; fi - echo 'Cleaning...' && echo -en 'travis_fold:start:script.3\\r' - make check-maintainer-clean && ../../configure $CONFIGOPTS - echo -en 'travis_fold:end:script.3\\r' swig-3.0.12/preinst-swig.in0000664000175000017500000000035613042756442015424 0ustar williamwilliam#!/bin/sh # Convenience script for running SWIG before it is installed. # Intended for ad-hoc usage and not by the test-suite or examples. builddir=`dirname "$0"` SWIG_LIB='@SWIG_LIB_PREINST@' export SWIG_LIB exec "$builddir/swig" "$@" swig-3.0.12/CHANGES0000664000175000017500000360331213042756442013440 0ustar williamwilliamSWIG (Simplified Wrapper and Interface Generator) See the CHANGES.current file for changes in the current version. See the RELEASENOTES file for a summary of changes in each release. Issue # numbers mentioned below can be found on Github. For more details, add the issue number to the end of the URL: https://github.com/swig/swig/issues/ Version 3.0.11 (29 Dec 2016) ============================ 2016-12-24: wsfulton [C#] Add %feature("csdirectordelegatemodifiers") to enable customization of the delegate access modifiers generated in director classes. Fixes issue #748. 2016-12-23: wsfulton [Python] Fix builtin "python:slot" feature failing for tp_hash when using hashfunc closure with a "Wrong type for hash function" for Python 2. Issue #843. 2016-12-21: joequamt Changed generation of functions so that only functions that end in _set generate accessor functions rather than looking for "set". Change generation of operators to not have underscores to start in R. Users need to provide custom names for these operator overloads. 2016-12-21: olly Fix isfinite() checks to work with all C++11 compilers. Fixes issues #615, #788 and #849. 2016-12-20: wsfulton %namewarn unnecessarily caused keyword warnings for non-instantiated template classes and duplicate warnings for instantiated template classes when keywords were used. Issue #845. 2016-12-18: ezralanglois [Python, Ruby, Octave] Memory leak fix on error in std::pair wrappers. Issue #851. 2016-12-18: wsfulton Zero initialize arrays when using %array_class and %array_functions. 2016-12-18: t-ikegami [Python] Fix #446 Python %array_class of carrays.i failed with -builtin option. 2016-12-16: briancaine [Guile] Patch #744 Added support for Guile's native pointer functionality 2016-12-01: wsfulton [Python] Issue #769. Add optional moduleimport attribute to %module so that the default module import code can be overridden. See the "Searching for the wrapper module" documentation in Python.html. Example: %module(moduleimport="import _foo") foo $module also expands to the low-level C/C++ module name, so the following is the same as above %module(moduleimport="import $module") foo 2016-11-30: olly [PHP] Add support for PHP7. PHP5's C extension API has changed substantially so you need to use -php7 to specify you want PHP7 compatible wrappers. The default extension for generated wrappers is now .cxx (to match SWIG's default for every other language - to generate foo_wrap.cpp you can run SWIG with -cppext cpp). Fixes issue #571. As part of this change, the language subdirectory for PHP5 has changed from "php" to "php5" - if you are making use of the search path feature where the language subdirectory of each directory is also searched, you'll need to update your bindings. A simple fix which works for older and newer SWIG is to add a symlink: ln -s php php5 *** POTENTIAL INCOMPATIBILITY *** 2016-11-30: olly [PHP] Only emit one copy of each distinct arginfo. Previously we emitted a separate one for every wrapped function, but typically many functions have the same number of parameters and combinations of parameters passed by reference or not. This change significantly reduces both the size of the generated wrapper, and of the compiled PHP extension module (e.g. by ~6% for the stripped extension module for Xapian's PHP7 bindings). 2016-11-28: wsfulton Fix %rename override of wildcard %rename for templates. For example: %rename(GlobalIntOperator) *::operator bool; // wildcard %rename %rename(XIntOperator) X::operator bool; // fix now overrides first %rename above OR %rename(XIntOperator) X::operator bool; // fix now overrides first %rename above template struct X { operator bool(); ... }; %template(Xint) X; This also fixes %rename override of global %rename for templates. For example: // Global rename to make all functions start with a lower case letter %rename("%(firstlowercase)s", %$isfunction ) ""; %rename(woohoo) W::Woo; // fix now overrides above %rename template struct W { W Woo(); ... }; %template(Wint) W; The above also introduces a possibly unexpected change. Many of the STL containers provided by SWIG use %rename to rename some methods, eg in std::vector, push_back is renamed to add in Java. Previously this intended rename did not happen when using using global %rename rules and the method would remain as push_back, but is now renamed to add. Some more info in issue #856. *** POTENTIAL INCOMPATIBILITY *** 2016-11-26: m7thon [Python] Issue #709 - improved wrapping of division operators 'from __future__ import division' now works in Python 2 whether or not the -py3 flag is used. 2016-11-12: joequant [R] Issue #697 - fix comma issue with overload methods 2016-11-12: joequant [R] Issue #555 - R runtime needs stdio.h 2016-11-02: wsfulton [Python] Issue #816 - fix compilation error when using -extranative and -builtin. 2016-11-02: liorgold Patch #741 - Add support for C++11 alias templates, see updated CPlusPlus11.html documentation. 2016-10-30: myd7349 [C#] Patch #740 Add std_array.i for C# for wrapping std::array. Patch also enhances std::vector C# wrappers with additional functions (Contains, IndexOf, LastIndexOf and Remove). 2016-10-30: tobilau [Java] Fix wrappers for wstring parameters in director methods to cleanup local ref after director callback has finished. 2016-10-23: wsfulton [C#] Add missing csdirectorin VOID_INT_PTR and csdirectorout VOID_INT_PTR typemaps. 2016-10-23: jiulongw Patch #781 - Fix wrapping of C compound expressions containing char constants in quotes such as: #define H_SUPPRESS_SCALING_MAGIC (('s'<<24) | ('u'<<16) | ('p'<<8) | 'p') enum DifferentTypes { typecharcompound='A'+1, typecharcompound2='B' << 2 }; 2016-10-13: wsfulton [Python] Issue #808 - fix Python pickling and metaclass for builtin wrappers. The metaclass (SwigPyObjectType) for SWIG objects was not defined in a way that let importlib successfully import the Python wrappers. The pickle module previously failed to pickle objects because it couldn't determine what module the SWIG wrapped objects were in. 2016-09-29: wsfulton [Allegrocl, CFFI, GO, Javascript, Ocaml, R, Scilab] Add missing support for the "ret" typemap in a few target languages. The documentation also now has info on the "ret" typemap. 2016-09-27: ahmed-usman [xml] Handle template parameters correctly. 2016-09-27: dontpanic92 [Go] Fix argument names in inherited functions taking more than 8 parameters. Fixes #795. 2016-09-26: smarchetto [Scilab] mlists that map pointers can be given a custom type name. 2016-09-25: wsfulton Patch #793 from q-p to expand exception handling to include std::bad_cast in std_except.i. 2016-09-24: olly [PHP] Fix code generated for feature("director:except") - previously the return value of call_user_function() was ignored and we checked an uninitialised value instead. Fixes #627. Based on patch from Sergey Seroshtan. 2016-09-22: wsfulton [Python] More flexible python builtin slots for overloaded C++ function. The closure names used for builtin slots are mangled with their functype so that overloaded C++ method names can be used for multiple slots. For example: %feature("python:slot", "mp_subscript", functype="binaryfunc") SimpleArray::__getitem__; %feature("python:slot", "sq_item", functype="ssizeargfunc") SimpleArray::__getitem__(Py_ssize_t n); will generate closures: SWIGPY_SSIZEARGFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___ssizeargfunc_closure */ SWIGPY_BINARYFUNC_CLOSURE(_wrap_SimpleArray___getitem__) /* defines _wrap_SimpleArray___getitem___binaryfunc_closure */ Previously only one name was defined: _wrap_SimpleArray___getitem___closure. Hence the overloaded __getitem__ method can be used to support both mp_subscript and sq_item slots. 2016-09-17: wsfulton [Python] Fix iterators for containers of NULL pointers (or Python None) when using -builtin. Previously iteration would stop at the first element that was NULL. 2016-09-16: olly [Javascript] Fix SWIG_exception() macro to return from the current function. Fixes #789, reported by Julien Dutriaux. 2016-09-16: olly [PHP] Fix SWIG_exception() macro to return from the current function. Fixes #240, reported by Sergey Seroshtan. 2016-09-12: xypron [C#] Patch #786 Keyword rename to be CLS compliant by adding an underscore suffix instead of an underscore prefix to the C symbol name. Please use an explicit %rename to rename the symbol with a _ prefix if you want the old symbol name. *** POTENTIAL INCOMPATIBILITY *** 2016-09-09: olly [Python] Fix import handling for Python 2.6 to work in a frozen application. Fixes #145, reported by Thomas Kluyver. 2016-09-02: smarchetto [Scilab] Pointers are mapped to mlist instead of tlist (mlist better for scilab overloading) 2016-09-02: olly [PHP] Fix "out" typemap for member function pointers and "in" typemap for char INPUT[ANY]. 2016-09-01: wsfulton [Python] More efficient Python slicing. Call reserve for container types that support it to avoid repeated memory reallocations for new slices or slices that grow in size. 2016-09-01: wsfulton [Python] #771 - Make builtin types hashable by default. Default hash is the underlying C/C++ pointer. This matches up with testing for equivalence (Py_EQ in SwigPyObject_richcompare) which compares the pointers. 2016-08-22: wsfulton [Python] The following builtin slots can be customized like other slots via the "python:" and "python:slot" features where is the appropriate slot name: tp_allocs tp_bases tp_basicsize tp_cache tp_del tp_dealloc tp_flags tp_frees tp_getset tp_is_gc tp_maxalloc tp_methods tp_mro tp_new tp_next tp_prev tp_richcompare tp_subclasses tp_weaklist was_sq_ass_slice was_sq_slice A few documentation improvements for slot customization. 2016-08-09: joequant [R] Patch #765 Fix extern "C" header includes for C++ code. 2016-08-05: olly [xml] Fix how the output filename is built to avoid problems when it contains the embedded strings ".c", ".cpp" or ".cxx". Fixes #540 reported by djack42. 2016-07-01: wsfulton Fix corner case of wrapping std::vector of T pointers where a pointer to a pointer of T also exists in the wrapped code. SF Bug 2359417 (967). 2016-06-26: wkalinin [Java, C#] Patch #681 Fix seg fault when ignoring nested classes. 2016-06-25: mromberg [Python] #711 Fix -castmode and conversion of signed and unsigned integer types. See 2015-12-23 CHANGES entry for details of these improvements when they were implemented for the default options (ie not using -castmode). 2016-06-25: ahnolds Patch #730 - Fix %implicitconv for overloaded functions when using -castmode or -fastdispatch options. The result is that in all overload cases where there are multiple possibilities with the same number of arguments, the dispatch function will first check for exact (aka non implicit) matches, and then subsequently check for implicit casting matches. This was already happening in the normal dispatch situation, and in the -fastdispatch case two passes through the candidates were happening, just with SWIG_POINTER_IMPLICIT_CONV always set. After this patch, it is not set on the first pass, and then set on the second pass. 2016-06-25: liorgold Patch #727 - Add support for C++11 type aliasing. Version 3.0.10 (12 Jun 2016) ============================ 2016-06-06: mromberg [Python] Patch #698. Add support for -relativeimport for python 2.7, so -py3 is no longer also required for relative import support. 2016-06-05: mromberg [Python] Patch #694 - Fix package import regressions introduced in swig-3.0.9. 1) The code in 3.0.9 did not fall back to 'import _foo' if 'import bar._foo' failed (assuming bar.foo was the main module). Every place _foo is imported now first tries it from the package where foo was found and if that fails tries _foo as a global module. 2) The separate block of Python code that injected code to pull in the attributes from _foo when -builtin is used made use of the -py3 switch to either do 'from ._foo import *' or "from _foo import *". This block of code no longer does this and instead checks the Python version at runtime to switch between the two syntaxes. In summary, swig-3.0.10 has been modified to ease the creation of wrapper modules that can be fully made part of a Python package. SWIG no longer assumes the dynamically linked C module is a global module. The dynamic module can now be placed into either the same package as the pure Python module or as a global module. Both locations are used by the Python wrapper to locate the C module. However, this could cause a backwards incompatibility with some code that was relying on the ability of "from package import _module" to pull attributes out of the package directly. If your code populates a module (which is also a package) with attributes that are SWIG generated modules which were not loaded in a conventional way, swig-3.0.8 and earlier may have worked due to 'from package import _module' bypassing a real import and pulling your module in as an attribute. This will no longer work. Since this is not a common (or even recommended) practice, most folk should not be affected. *** POTENTIAL INCOMPATIBILITY *** 2016-05-31: wsfulton Fix #690 - Smart pointer to %ignored class doesn't expose inherited methods. Regression introduced in swig-3.0.9. Version 3.0.9 (29 May 2016) =========================== 2016-05-24: mromberg [Python] Patch #612 - Add support for Python's implicit namespace packages. 2016-05-23: wsfulton [Ruby] Fix #602 - Error handling regression of opaque pointers introduced in swig-3.0.8 when C functions explicitly reset a pointer using 'DATA_PTR(self) = 0'. An ObjectPreviouslyDeleted error was incorrectly thrown when the pointer was used as a parameter. 2016-05-17: tamuratak [Ruby] Patch #651 - Correct overloaded function error message when function is using %newobject. 2016-05-17: aurelj [Ruby] Patch #582 - add support for docstring option in %module() 2016-05-14: wsfulton Fix #434 - Passing classes by value as parameters in director methods did not create a copy of the argument leading to invalid memory accesses if the object was used after the upcall into the target language. Passing arguments by value shouldn't give rise to these sorts of memory problems and so the objects are now copied and ownership of their lifetime is controlled by the target language. 2016-05-07: wsfulton Fix #611. Fix assertion handling defaultargs when using %extend for a template class and the extended methods contain default arguments. 2016-05-05: ejulian [Python] Patch #617. Fix operator/ wrappers. 2016-05-02: wsfulton Fix #669. Don't issue warning about ignoring base classes when the derived class is itself ignored. 2016-04-18: ianlancetaylor [Go] Fix use of goout typemap when calling base method by forcing the "type" attribute to the value we need. 2016-04-17: ianlancetaylor [Go] Fixes for Go 1.6: avoid returning Go pointers from directors that return string values; add a trailing 0 byte when treating Go string as C char*. 2016-04-06: smarchetto [Scilab] #552 Make Scilab runtime keep track of pointer types Instead of a Scilab pointer which has no type, SWIG Scilab maps a pointer to a structure tlist containing the pointer adress and its type. 2016-04-02: ahnolds [Python] Apply #598. Fix misleading error message when attempting to read a non-existent attribute. The previous cryptic error message: AttributeError: type object 'object' has no attribute '__getattr__' is now replaced with one mentioning the attribute name, eg: AttributeError: 'Foo' object has no attribute 'bar' 2016-04-02: derkuci [Python] Patch #610 to fix #607. Fix single arguments when using python -builtin -O with %feature("compactdefaultargs") 2016-03-31: wsfulton Fixes #594. Fix assertion for some languages when wrapping a C++11 enum class that is private in a class. Also don't wrap private enums for a few languages that attempted to do so. 2016-03-31: wsfulton [Java] unsigned long long marshalling improvements when a negative number is passed from Java to C. A cast to signed long long in the C layer will now result in the expected value. No change for positive numbers passed to C. Fixes #623. 2016-03-22: alexwarg [Lua] #398 Fix lua __getitem + inheritance The new handling of classes in Lua (not merging methods into the derived classes) breaks for classes that provide a __getitem function. The __getitem function prevents method calls to any method defined in a base class. This fix calls __getitem only if the member is not found using recursive lookup. 2016-03-18: ptomulik [Python] #563 Stop generating unnecessary _swigconstant helpers. 2016-03-16: richardbeare [R] #636 Add extra std::vector numeric types 2016-03-14: wsfulton [Java] Add std_array.i for C++11 std::array support. 2016-03-12: wsfulton [Java, C#, D] Fix static const char member variables wrappers with %javaconst(1) %csconst(1) or %dmanifestconst. This fixes the case when an integer is used as the initializer, such as: struct W { static const char w = 100; }; Fix generated code parsing enum values using char escape sequences when these values appear in the Java code (usually when using %javaconst(1)) such as: enum X { x1 = '\n', x2 = '\1' }; Similarly for static const member char variables such as: struct Y { static const char y = '\n'; } Likewise for D and %dmanifestconstant. For C# and %csconst(1), char values in C# are now hex escaped as C# doesn't support C octal escaping. 2016-03-11: wsfulton [Java C#] Add support for treating C++ base classes as Java interfaces instead of Java proxy classes. This enable some sort of support for multiple inheritance. The implementation is in swiginterface.i and provides additional macros (see Java.html for full documentation): %interface(CTYPE) %interface_impl(CTYPE) %interface_custom("PROXY", "INTERFACE", CTYPE) 2016-03-01: wsfulton Add rstrip encoder for use in %rename. This is like the strip encoder but strips the symbol's suffix instead of the prefix. The example below will rename SomeThingCls to SomeThing and AnotherThingCls to AnotherThing: %rename("%(rstrip:[Cls])s") ""; class SomeThingCls {}; struct AnotherThingCls {}; 2016-03-01: olly Fix isfinite() check to work with GCC6. Fixes issue #615 reported by jplesnik. 2016-02-17: olly [Python] Add missing keywords 'as' and 'with' to pythonkw.swg. 2016-02-07: kwwette [Octave] recognise various unary functions * Use __float__() for numeric conversions, e.g. when calling double() * Map various unary functions, e.g. abs() to __abs__(), see full list in section 32.3.10 of manual; only available in Octave 3.8.0 or later 2016-02-07: kwwette [Octave] export function swig_octave_prereq() for testing Octave version 2016-02-06: pjohangustavsson [C#] Fix duplicate symbol problems when linking the source generated from multiple SWIG modules into one shared library for the -namespace option. The namespace is now mangled into the global PInvoke function names. *** POTENTIAL INCOMPATIBILITY *** 2016-01-27: ahnolds [Python] Added support for differentiating between Python Bytes and Unicode objects using by defining SWIG_PYTHON_STRICT_BYTE_CHAR and SWIG_PYTHON_STRICT_UNICODE_WCHAR. 2016-01-27: steeve [Go] Ensure structs are properly packed between gc and GCC/clang. 2016-01-25: ahnolds [Python] Support the full Python test suite in -classic mode * Convert long/unsigned long/long long/unsigned long long to PyInt rather than PyLong when possible. Certain python functions like len() require a PyInt when operating on old-style classes. * Add support for static methods in classic mode, including support for pythonappend, pythonprepend, and docstrings. * Removing the use of __swig_getmethods__ for static member methods since they will always be found by the standard argument lookup * Fix a bug where the wrong type of exception was caught when checking for new-style class support 2016-01-23: ahnolds [Go] Enable support for the Go test-suite on OSX: * The linker on OSX requires that all symbols (even weak symbols) are defined at link time. Because the function _cgo_topofstack is only defined starting in Go version 1.4, we explicitly mark it as undefined for older versions of Go on OSX. * Avoid writing empty swigargs structs, since empty structs are not allowed in extern "C" blocks. 2016-01-12: olly [Javascript] Look for "nodejs" as well as "node", as it's packaged as the former on Debian. 2016-01-12: olly [Javascript] For v8 >= 4.3.0, use V8_MAJOR_VERSION. Fixes issue 561. 2016-01-10: ahnolds Improved size_t and ptrdiff_t typemaps to support large values on platforms where sizeof(size_t) > sizeof(unsigned long) and sizeof(ptrdiff_t) > sizeof(long). Version 3.0.8 (31 Dec 2015) =========================== 2015-12-30: wsfulton The pdf documentation is now generated by wkhtmltopdf and has colour for the code snippets just like the html documentation! 2015-12-23: ahnolds [Python] Fixes for conversion of signed and unsigned integer types: No longer check for PyInt objects in Python3. Because PyInt_Check and friends are #defined to the corresponding PyLong methods, this had caused errors in Python3 where values greater than what could be stored in a long were incorrectly interpreted as the value -1 with the Python error indicator set to OverflowError. This applies to both the conversions PyLong->long and PyLong->double. Conversion from PyLong to long, unsigned long, long long, and unsigned long long now raise OverflowError instead of TypeError in both Python2 and Python3 for PyLong values outside the range expressible by the corresponding C type. This matches the existing behavior for other integral types (signed and unsigned ints, shorts, and chars), as well as the conversion for PyInt to all numeric types. This also indirectly applies to the size_t and ptrdiff_t types, which depend on the conversions for unsigned long and long. 2015-12-19: wsfulton [Python] Python 2 Unicode UTF-8 strings can be used as inputs to char * or std::string types if the generated C/C++ code has SWIG_PYTHON_2_UNICODE defined. 2015-12-17: wsfulton Issues #286, #128 Remove ccache-swig.1 man page - please use the CCache.html docs instead. The yodl2man and yodl2html tools are no longer used and so SWIG no longer has a dependency on these packages which were required when building from git. 2015-12-16: zturner/coleb [Python] Fix Python3.5 interpreter assertions when objects are being deleted due to an existing exception. Most notably in generators which terminate using a StopIteration exception. Fixes #559 #560 #573. If a further exception is raised during an object destruction, PyErr_WriteUnraisable is used on this second exception and the original exception bubbles through. 2015-12-14: ahnolds/wsfulton [Python] Add in missing initializers for tp_finalize, nb_matrix_multiply, nb_inplace_matrix_multiply, ht_qualname ht_cached_keys and tp_prev. 2015-12-12: wsfulton Fix STL wrappers to not generate <: digraphs. For example std::vector<::X::Y> was sometimes generated, now corrected to std::vector< ::X::Y >. 2015-11-25: wsfulton [Ruby] STL ranges and slices fixes. Ruby STL container setting slices fixes: Setting an STL container wrapper slice better matches the way Ruby arrays work. The behaviour is now the same as Ruby arrays. The only exception is the default value used when expanding a container cannot be nil as this is not a valid type/value for C++ container elements. Obtaining a Ruby STL container ranges and slices fixes: Access via ranges and slices now behave identically to Ruby arrays. The fixes are mostly for out of range indices and lengths. - Zero length slice requests return an empty container instead of nil. - Slices which request a length greater than the size of the container no longer chop off the last element. - Ranges which used to return nil now return an empty array when the the start element is a valid index. Ruby STL container negative indexing support improved. Using negative indexes to set values works the same as Ruby arrays, eg %template(IntVector) std::vector; iv = IntVector.new([1,2,3,4]) iv[-4] = 9 # => [1,2,3,9] iv[-5] = 9 # => IndexError 2015-11-21: wsfulton [Ruby, Python] Add std::array container wrappers. These work much like any of the other STL containers except Python/Ruby slicing is somewhat limited because the array is a fixed size. Only slices of the full size are supported. 2015-10-10: wsfulton [Python] #539 - Support Python 3.5 and -builtin. PyAsyncMethods is a new member in PyHeapTypeObject. 2015-10-06: ianlancetaylor [Go] Don't emit a constructor function for a director class with an abstract method, since the function will always panic. 2015-10-01: wsfulton Fix %shared_ptr support for private and protected inheritance. - Remove unnecessary Warning 520: Derived class 'Derived' of 'Base' is not similarly marked as a smart pointer - Do not generate code that attempts to cast up the inheritance chain in the type system runtime in such cases as it doesn't compile and can't be used. Remove unnecessary warning 520 for %shared_ptr when the base class is ignored. 2015-10-01: vkalinin Fix #508: Fix segfault parsing anonymous typedef nested classes. 2015-09-26: wsfulton [Ruby] Add shared_ptr support 2015-09-13: kkaempf [Ruby] Resolve tracking bug - issue #225. The bug is that the tracking code uses a ruby hash and thus may allocate objects (Bignum) while running the GC. This was tolerated in 1.8 but is invalid (raises an exception) in 1.9. The patch uses a C hash (also used by ruby) instead. 2015-09-09: lyze [CFFI] Extend the "export" feature in the CFFI module to support exporting to a specified package. 2015-09-04: olly [Python] Fix docstrings for %callback functions. 2015-09-03: demi-rluddy [Go] Removed golang stringing for signed/unsigned char Changed default handling of signed char* and unsigned char* to be opaque pointers rather than strings, similarly to how other languages work. Any existing code relying on treating signed char* or unsigned char* as a string can restore the old behavior with typemaps.i by using %apply to copy the [unchanged] char* behavior. *** POTENTIAL INCOMPATIBILITY *** 2015-08-07: talby [Perl] tidy -Wtautological-constant-out-of-range-compare warnings when building generated code under clang 2015-08-07: xantares [Python] pep257 & numpydoc conforming docstrings: - Mono-line module docsstring - Rewrite autodoc parameters section in numpydoc style: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt - One line summary should end with "." - Adds a blank line after class docstring 2015-08-05: vadz [Java] Make (char* STRING, size_t LENGTH) typemaps usable for strings of other types, e.g. "unsigned char*". Version 3.0.7 (3 Aug 2015) ========================== 2015-08-02: wsfulton [Java] Fix potential security exploit in generated Java classes. The swigCPtr and swigCMemOwn member variables in the generated Java classes are now declared 'transient' by default. Further details of the exploit in Android is being published in an academic paper as part of USENIX WOOT '15: https://www.usenix.org/conference/woot15/workshop-program/presentation/peles. In the unlikely event that you are relying on these members being serializable, then you will need to override the default javabody and javabody_derived typemaps to generate the old generated code. The relevant typemaps are in the Lib directory in the java.swg, boost_shared_ptr.i and boost_intrusive_ptr.i files. Copy the relevant default typemaps into your interface file and remove the 'transient' keyword. *** POTENTIAL INCOMPATIBILITY *** 2015-08-01: vadz Make configure --without-alllang option more useful: it can now be overridden by the following --with-xxx options, allowing to easily enable just one or two languages. 2015-07-30: wsfulton Fix #440 - Initialise all newly created arrays when using %array_functions and %array_class in the carrays.i library - bug is only relevant when using C++. 2015-07-29: wsfulton [Python] Improve indentation warning and error messages for code in the following directives: %pythonprepend %pythonappend %pythoncode %pythonbegin %feature("shadow") Old error example: Error: Line indented less than expected (line 3 of pythoncode) New error example: Error: Line indented less than expected (line 3 of %pythoncode or %insert("python") block) as no line should be indented less than the indentation in line 1 Old warning example: Warning 740: Whitespace prefix doesn't match (line 2 of %pythoncode or %insert("python") block) New warning example: Warning 740: Whitespace indentation is inconsistent compared to earlier lines (line 3 of %pythoncode or %insert("python") block) 2015-07-28: wsfulton [Python] Fix #475. Improve docstring indentation handling. SWIG-3.0.5 and earlier sometimes truncated text provided in the docstring feature. This occurred when the indentation (whitespace) in the docstring was less in the second or later lines when compared to the first line. SWIG-3.0.6 gave a 'Line indented less than expected' error instead of truncating the docstring text. Now the indentation for the 'docstring' feature is smarter and is appropriately adjusted so that no truncation occurs. 2015-07-22: wsfulton Support for special variable expansion in typemap attributes. Example usage expansion in the 'out' attribute (C# specific): %typemap(ctype, out="$*1_ltype") unsigned int& "$*1_ltype" is equivalent to the following as $*1_ltype expands to 'unsigned int': %typemap(ctype, out="unsigned int") unsigned int& "unsigned int" Special variables can be used within special variable macros too. Example usage expansion: %typemap(cstype) unsigned int "uint" %typemap(cstype, out="$typemap(cstype, $*1_ltype)") unsigned int& "$typemap(cstype, $*1_ltype)" Special variables are expanded first and hence the above is equivalent to: %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)" which then expands to: %typemap(cstype, out="uint") unsigned int& "uint" 2015-07-22: lindleyf Apply patch #439 - support for $typemap() (aka embedded typemaps or special variable macros) in typemap attributes. A simple example where $typemap() is expanded in the 'out' attribute (C# specific): %typemap(cstype) unsigned int "uint" %typemap(cstype, out="$typemap(cstype, unsigned int)") unsigned int& "$typemap(cstype, unsigned int)" is equivalent to: %typemap(cstype, out="uint") unsigned int& "uint" 2015-07-18: m7thon [Python] Docstrings provided via %feature("docstring") are now quoted and added to the tp_doc slot when using python builtin classes (-builtin). When no docstring is provided, the tp_doc slot is set to the fully qualified C/C++ class name. Github issues #445 and #461. 2015-07-17: kwwette [octave] Support Octave version 4.0.0 (thanks to patches from Orion Poplawski). 2015-07-07: wsfulton SWIG no longer generates a wrapper for a class' constructor if that class has any base class with a private destructor. This is because your compiler should not allow a class to be instantiated if a base has a private destructor. Some compilers do, so if you need the old behaviour, use the "notabstract" feature, eg: %feature("notabstract") Derived; class Base { ~Base() {} }; struct Derived : Base {}; Version 3.0.6 (5 Jul 2015) ========================== 2015-07-02: wsfulton Fix syntax error when the template keyword is used in types, eg: std::template vector v; 2015-07-02: ngladitz [Lua] Push characters as unformatted 1-character strings to avoid unprintable characters such as (char)127 being converted to "<\127>" with Lua 5.3 and later. (github PR #452) 2015-06-29: olly [Python] Improve handling of whitespace in %pythoncode. Previously SWIG looked at the indentation of the first line and removed that many characters from each subsequent line, regardless of what those characters were. This was made worse because SWIG's preprocessor removes any whitespace before a '#'. Fixes github issue #379, reported by Joe Orton. 2015-06-12: wsfulton [R] Fix #430 - call to SWIG_createNewRef in copyToC was incorrectly named. 2015-06-11: sghirate [C#] Patch #427 adds in new command line option -outfile to combine all the generated C# code into a single file. 2015-06-09: wsfulton Fix seg fault processing C++11 type aliasing. Issue #424. 2015-05-28: wsfulton [Python] Add new feature "python:cdefaultargs" to control default argument code generation. By default, SWIG attempts to convert C/C++ default argument values into Python values and generates code into the Python layer with these values. Recent versions of SWIG are able to convert more of these values, however, the new behaviour can be circumvented if desired via this new feature, such that the default argument values are obtained from the C layer and not the Python layer. For example: struct CDA { int fff(int a = 1, bool b = false); }; The default code generation in the Python layer is: class CDA(_object): ... def fff(self, a=1, b=False): return _default_args.CDA_fff(self, a, b) Adding the feature: %feature("python:cdefaultargs") CDA::fff; Results in: class CDA(_object): ... def fff(self, *args): return _default_args.CDA_fff(self, *args) Some code generation modes, eg -builtin and -fastproxy, are unaffected by this as the default values are always obtained from the C layer. 2015-05-27: wsfulton [Python] Deal with an integer as the default value of a typedef to bool parameter in the C++ prototype. See #327. Regression from 3.0.0 onwards. 2015-05-19: olly [Python] Fix warning when compiling generated code with MSVC. (Fixes https://sourceforge.net/p/swig/patches/351/ reported by Mateusz Szyma¿ski). 2015-05-14: wsfulton Fix seg fault wrapping shared_ptr of classes with private constructors and destructors. This also fixes the "unref" feature when used on classes with private destructors. 2015-05-10: wsfulton [Java] Fix multi-argument typemaps (char *STRING, size_t LENGTH) so that they can be applied to a wider range of types. Fixes #385. 2015-05-07: olly [Python] Deal with an integer as the default value of a bool parameter in the C++ prototype. Fixes github #327, reported by Greg Allen. 2015-05-07: LindleyF [Java] Allow feature("director") and feature("ref") to be used together. Github PR#403. 2015-05-05: olly Suppress warning 325 "Nested class not currently supported (Foo ignored)" when Foo has already been explicitly ignored with "%ignore". 2015-05-04: wsfulton Add support for friend templates, including operator overloading - fixes #196. Considering the example below, previously the operator gave a syntax error and friendfunc incorrectly warned with: "Warning 503: Can't wrap 'friendfunc<(Type)>' unless renamed to a valid identifier." template class MyClass { friend int friendfunc (double is, MyClass & x); friend int operator<< (double un, const MyClass &x); }; The following also previously incorrectly warned with: "Warning 302: Identifier 'template_friend' redefined (ignored)," template T template_friend(T); struct MyTemplate { template friend T template_friend(T); }; 2015-05-01: wsfulton Fix handling of conversion operators where the operator is split over multiple lines or has comments within the operator type. Fixes #401. Also fix similar problem with normal operators which gave a syntax error if split over multiple lines or had a comment within the operator declaration. 2015-04-30: olly Ignore unknown preprocessor directives which are inside an inactive conditional (github issue #394, reported by Dan Wilcox). Regression introduced in 3.0.3. 2015-04-27: vadz [Python] Fix "default" typemap used after an argument with "numinputs=0" (#377). 2015-04-24: wsfulton [Python] Fix #256. Code generated with '-builtin -modernargs' segfaults for any method taking zero arguments. Also fixes: "SystemError: error return without exception set" during error checking when using just -builtin and the incorrect number of arguments is passed to a class method expecting zero arguments. 2015-04-23: wsfulton [Java] Bug #386 - Memory leak fix in (char *STRING, size_t LENGTH) typemaps. 2015-04-23: vadz [Python] Make "default" typemap work again (#330, #377). 2015-04-23: vadz [Python] Fix the use of default values for the pointer types (#365, #376). 2015-04-23: wsfulton Fix 'make check-ccache' which is part of 'make check' when one of the CCACHE_ environment variables, for example CCACHE_DISABLE, is set. 2015-04-14: wsfulton Clearer warning message for badly constructed typecheck typemaps. For example, was: example.i:3: Warning 467: Overloaded foo(int) not supported (no type checking rule for 'int'). Now: example.i:3: Warning 467: Overloaded foo(int) not supported (incomplete type checking rule - no precedence level in typecheck typemap for 'int'). 2015-04-11: wsfulton [Java] Fix #353 - Linker multiple definition of 'ExceptionMatches' when using directors and multiple modules. 2015-04-11: wsfulton Merge #320 - Make __dict__ accessible for Python builtin classes. 2015-04-07: wsfulton Fix #375 - parsing of extern "C" and typedef for example: extern "C" typedef void (*Hook2_t)(int, const char *); extern "C" typedef int Integer; 2015-03-12: olly -DSWIG_DIRECTOR_STATIC is now supported for all languages with director support, not only Python and PHP. 2015-03-02: ianlancetaylor [Go] Add -cgo option, required for Go versions 1.5 and later. 2015-02-26: olly Fix segmentation fault when top==NULL, introduced by nested class handling (reported in issue#346 by Pawe¿ Tomulik). 2015-02-09: wsfulton [Guile] Fix generated code for static const char member variables when defined and declared inline. 2015-02-09: mishas [Go] Fix %import of files in sub directories. 2015-02-05: ianlancetaylor [Go] Ignore Go specific type maps (goin, goout, etc.) if they are empty. 2015-02-05: ianlancetaylor [Go] Generated Go code no longer calls _swig_goallocate or _swig_makegostring, as they will no longer work as of Go 1.5. Version 3.0.5 (31 Jan 2015) =========================== 2015-01-30: wsfulton [Python] Fix Python -classic and property setting. Setting properties on classic classes was broken in swig-3.0.3 by attempting to use __setattr__. This regression is fixed now by using __dict__ again when using -classic. Fixes patch #232. 2015-01-27: smarchetto [Scilab] Support for the Scilab language has been added 2015-01-23: olly [PHP] When wrapping a returned resource as an object, check if all cases wrap it in the same class, and if so eliminate the pointless switch statement wrapper we previously generated. 2015-01-22: wsfulton [Octave] Merge patch #297 for SF bug #1277 - Octave shared_ptr support 2015-01-15: wsfulton [Python] Merge patch #250 - Fixes for using %constant and objects (non-primitive types) 2015-01-15: wsfulton [C# Go] Merge patch #308 and fix #307 - C++11 strongly typed enum support in directors 2015-01-15: wsfulton [Python] Second fix for #294 #296 - Regression introduced in SWIG-3.0.3 when wrapping functions with default arguments, this time when using kwargs. Version 3.0.4 (14 Jan 2015) =========================== 2015-01-12: olly [PHP] Fix segfault in director upcall check when using PHP built with ZTS enabled. Fixes #155, reported by Pierre Labastie. 2015-01-12: vadz [Python] Fix #294 #296 - Regression introduced in SWIG-3.0.3 when wrapping functions with default arguments. Invalid or missing default arguments were sometimes being generated into the python layer. 2015-01-08: olly Allow C++11 "explicit constexpr". Fixes github issue #284 reported by Pawel Tomulik. Also handle "constexpr explicit" and "constexpr static". 2015-01-08: olly When reporting an error for a construct which hasn't been terminated when the end of the file is reached, report it at the start line rather than "EOF" as then tools like editors and IDEs will take you to a generally more useful place for fixing the problem. 2015-01-08: olly Improve error messages for a few cases which previously gave the one of the cryptic catch-all errors "Syntax error in input". 2015-01-08: olly Provide -cppext as a general command line option for setting the extension used for generated C++ files (previously it was specific to the PHP backend). Deprecate the equivalent -suffix option provided by the Ocaml backend, but continue to support that for now. Version 3.0.3 (30 Dec 2014) =========================== 2014-12-27: wsfulton Fix #280 - abort using all default template parameters within other template parameters. 2014-12-27: talby [Perl] Issue #282 perl5 archlib vs archlibexp [Perl] tidy "warning: duplicate 'extern' declaration specifier" when building generated code under clang 2014-12-18: wsfulton Add support for %constant and structs/classes - issue #272 2014-12-09: wsfulton Fix #245 - regression (since swig-3.0.0) in templated constructors. Templated constructors could not be instantiated - they were incorrectly ignored with a warning 504: "Function: xyz must have a return type. Ignored." 2014-12-07: wsfulton Add support for C++11 strongly typed enumerations. 2014-11-21: wsfulton [Java C#] Fix multiply defined error when using %rename of enum items when using the "simple enum" wrappers. 2014-10-28: vadz [Python] Patch #201 The generated .py file no longer uses *args for all Python parameters. Instead, the parameters are named using the C++ parameter names. "compactdefaultargs" feature can be enabled to restore the old behaviour. *** POTENTIAL INCOMPATIBILITY *** 2014-10-24: timotheecour [D] Patch #204 Use core.atomic.atomicOp to mutate shared variables 2014-10-21: wsfulton Fix issue #242 - Use of the "kwargs" feature no longer automatically turns on the "compactdefaultargs" feature if the target language does not support kwargs. This change affects all languages except Python and Ruby. *** POTENTIAL INCOMPATIBILITY *** 2014-10-10: diorcety [Python] Patch #232 Fix property access using directors 2014-10-06: wsfulton [Python] Fixes when using -builtin and std::vector/std::list wrappers to allow deletion of single elements, such as 'del vec[0]'. 2014-09-30: oliverb [Javascript] Merge patch #216 by Richie765 - Added support for many versions of v8 javascript. 2014-09-30: oliverb [Javascript] Merge patch #195 by zittix - Fixed JSClassRef declaration not using the static one. 2014-09-30: ianlancetaylor [Go] In configure script, require Go 1.1 or later. 2014-09-30: wsfulton [Python] Patch #207 - Fix No module error with -relativeimport when using single header file import. 2014-09-27: wsfulton Patch #208 - Initialise newly created array when using array_functions in the carrays.i library (C++ usage). 2014-09-27: wsfulton [Ruby] Patch #187 - Fix crash on shutdown of the Ruby interpreter if more than one module was loaded at a time when data is being shared between modules. 2014-09-27: wsfulton [Java] Patch #168 - Fix leak in Java director string handling after the Java upcall when called from a native thread. 2014-09-25: ianlancetaylor [Go] Adjust generated code to work with upcoming Go 1.4 release. 2014-09-23: wsfulton [Python] Add patch from Thomas Maslach to fix crash in wrappers when using -threads in the STL iterators (SwigPyIterator destructor). 2014-09-17: wsfulton [C#] Merge patch #229 from contre - Add bool array types to arrays_csharp.i 2014-09-12: olly [PHP] Add support for specifying any PHP interfaces a wrapped class implements, e.g.: %typemap("phpinterfaces") MyIterator "Iterator"; 2014-09-11: olly [PHP] Fix throwing a PHP exception through C++ from a subclassed director method - PHP NULL gets returned by the subclassed method in this case, so the directorout typemap needs to allow that (at least if an exception is active). 2014-09-09: ianlancetaylor [Go] Add goargout typemap. 2014-09-09: olly [PHP] Fix segmentation faults with directors in PHP >= 5.4, and reenable runme tests for director_basic testcase. Fix from pavel-charvat in issue#164. 2014-09-05: ianlancetaylor [Go] Add imtype, goin, goout, godirectorin, and godirectorout typemaps, to support writing Go code to convert between types. 2014-09-02: olly [Python] Fix regression in indentation of python code produced with -modern, introduced by changes in #188. Reported by fabiencastan in #218. 2014-09-01: olly Issue an error for unknown SWIG preprocessor directives, rather than quietly ignoring them. Reported by jrhelsey in issue#217. *** POTENTIAL INCOMPATIBILITY *** 2014-08-15: talby [Perl] Include guard fix for nested modules from Anthony Heading (SF Patch #350). 2014-08-04: wsfulton [C#] Merge patch #200 from gpetrou - Changed CSharp license header to include auto-generated tag so that StyleCop ignores the files. 2014-08-04: wsfulton [Java] Merge patch #198 from Yuval Kashtan - Support for java.nio.ByteBuffer mapping to unsigned char * in various.i in NIOBUFFER typemaps. 2014-07-14: ianlancetaylor [Go] Change struct definition to use void *, not uint8, so that the type is recorded as possibly containing pointers. This ensures that the 1.3 garbage collector does not collect pointers passed to C++ code. 2014-07-01: wsfulton Fix SF Bug #1375 - Expansion of the $parentclassname special variable incorrectly contains brackets in the expanded name. Version 3.0.2 (4 Jun 2014) ========================== 2014-06-02: v-for-vandal [Lua] Pull request #176: If class has no __eq implemented, then default __eq is generated. Default __eq compares actual pointers stored inside Lua userdata. 2014-06-02: vkalinin Fix #183 - %extend and unnamed nested structs 2014-05-28: kwwette Fix install failure when using an 'out of source' build using the shipped tarball - regression introduced in swig-3.0.1. 2014-05-24: kwwette [Octave] Remove deprecated -global/-noglobal command-line arguments *** POTENTIAL INCOMPATIBILITY *** Version 3.0.1 (27 May 2014) =========================== 2014-05-25: hfalcic [Python] Python 3 byte string output: use errors="surrogateescape" if available on the version of Python that's in use. This allows obtaining the original byte string (and potentially trying a fallback encoding) if the bytes can't be decoded as UTF-8. Previously, a UnicodeDecodeError would be raised with no way to treat the data as bytes or try another codec. 2014-05-18: vkalinin Bug #175 - Restore %extend to work for unnamed nested structures by using a C symbol comprising the outer structure name and unnamed variable instance name. 2014-05-15: kwwette Add #166 - 'make check' now works out of source. This required the examples to build out of source. The main languages have been tested - C#, Go, Guile, Java, Javascript, Lua, Octave, Perl, PHP, Python, Ruby and Tcl. 2014-05-01: Oliver Buchtala Javascript support added, see Javascript chapter in the documentation. 2014-05-01: olly [PHP] The generated __isset() method now returns true for read-only properties. 2014-04-24: kwwette [Go] Fix go ./configure parsing of gccgo --version, and goruntime.swg typo in __GNUC_PATCHLEVEL__ (SF Bug #1298) 2014-04-24: kwwette Fix {python|perl5|ruby|tcl}/java examples In Lib/gcj/cni.i, for compatibility with newer gcj versions: - remove JvAllocObject() which gcj no longer defines, from gcj Changelog: 2004-04-16 Bryce McKinlay * gcj/cni.h (JvAllocObject): Remove these obsolete, undocumented CNI calls. - change JvCreateJavaVM() argument from void* to JvVMInitArgs*, from gcj Changelog: 2005-02-23 Thomas Fitzsimmons PR libgcj/16923 ... (JvCreateJavaVM): Declare vm_args as JvVMInitArgs* rather than void*. *** POTENTIAL INCOMPATIBILITY *** 2014-04-08: wsfulton SF Bug #1366 - Remove duplicate declarations of strtoimax and strtoumax in inttypes.i 2014-04-08: wsfulton [Java C#] Enums which have been ignored via %ignore and are subsequently used are handled slightly differently. Type wrapper classes are now generated which are effectively a wrapper of an empty enum. Previously in Java uncompilable code was generated and in C# an int was used. 2014-04-04: wsfulton Fix regression in 3.0.0 where legal code following an operator<< definition might give a syntax error. SF Bug #1365. 2014-04-03: olly [PHP] Fix wrapping director constructors with default parameters with a ZTS-enabled build of PHP. 2014-04-02: olly [PHP] Pass the ZTS context we already have to avoid needing to call TSRMLS_FETCH, which is relatively expensive. 2014-04-02: olly [PHP] Pass ZTS context through to t_output_helper() so it works with a ZTS-enabled build of PHP. Reported by Pierre Labastie in github PR#155. 2014-03-28: wsfulton [Java C# D Go] Fixes for C enums used in an API and the definition of the enum has not been parsed. For D, this fixes a segfault in SWIG. The other languages now produce code that compiles, although the definition of the enum is needed in order to use the enum properly from the target language. 2014-03-23: v-for-vandal [Lua] Fix for usage of snprintf in Lua runtime which Visual Studio does not have. Version 3.0.0 (16 Mar 2014) =========================== 2014-03-16: wsfulton C++11 support initially developed as C++0x support by Matevz Jekovec as a Google Summer of Code project has been further extended. The C++11 support is comprehensive, but by no means complete or without limitations. Full details for each new feature in C++11 is covered in the CPlusPlus11.html chapter in the documentation which is included in SWIG and also available online at http://www.swig.org/Doc3.0/CPlusPlus11.html. 2014-03-14: v-for-vandal [Lua] Numerous Lua improvements: 1. %nspace support has been added. Namespaces are mapped to tables in the module, with the same name as the C++ namespace. 2. Inheritance is now handled differently. Each class metatable keeps a list of class bases instead of merging all members of all bases into the derived class. 3. The new metatables result in differences in accessing class members. For example: %module example struct Test { enum { TEST1 = 10, TEST2 = 20 }; static const int ICONST = 12; }; Now this can be used as follows: print(example.Test.TEST1) print(example.Test.ICONST) The old way was: print(example.Test_TEST1) print(example.Test_ICONST) 4. The special class metatable member ".constructor" was removed. Now SWIG generates the proxy function by itself and assigns it directly to the class table "__call" method. 5. eLua should also now support inheritance. 6. 'const' subtable in eLua is considered deprecated. Changes in behaviour: a. You can no longer assign to non-existing class members in classes without a __setitem__ method. It will cause a Lua error. b. You can no longer iterate over a module table and copy everything into the global namespace. Actually, this was never the case, but it is now explicitly prohibited. c. Now changing a base class will immediately affect all derived classes. d. There might be some issues with inheritance. Although the bases iteration scheme is the same as was used for merging base classes into derived one, some unknown issues may arise. The old metatable behaviour can be restored by using the -no-old-metatable-bindings option. *** POTENTIAL INCOMPATIBILITY *** 2014-03-06: wsfulton [Python] Change in default behaviour wrapping C++ bool. Only a Python True or False will now work for C++ bool parameters. This fixes overloading bool with other types. Python 2.3 minimum is now required for wrapping bool. When wrapping: const char* overloaded(bool value) { return "bool"; } const char* overloaded(int value) { return "int"; } Previous behaviour: >>> overloaded(False) 'int' >>> overloaded(True) 'int' >>> overloaded(0) 'int' Now we get the expected behaviour: >>> overloaded(False) 'bool' >>> overloaded(0) 'int' The consequence is when wrapping bool in non-overloaded functions: const char* boolfunction(bool value) { return value ? "true" : "false"; } The previous behaviour was very Pythonic: >>> boolfunction("") 'false' >>> boolfunction("hi") 'true' >>> boolfunction(12.34) 'true' >>> boolfunction(0) 'false' >>> boolfunction(1) 'true' Now the new behaviour more along the lines of C++ due to stricter type checking. The above calls result in an exception and need to be explicitly converted into a bool as follows: >>> boolfunction(0) Traceback (most recent call last): File "", line 1, in TypeError: in method 'boolfunction', argument 1 of type 'bool' >>> boolfunction(bool(0)) 'false' The old behaviour can be resurrected by passing the -DSWIG_PYTHON_LEGACY_BOOL command line parameter when executing SWIG. Typemaps can of course be written to customise the behaviour for specific parameters. *** POTENTIAL INCOMPATIBILITY *** 2014-03-06: wsfulton Fix SF Bug #1363 - Problem with method overloading when some methods are added by %extend and others are real methods and using template default parameters with smart pointers. This is noticeable as a regression since 2.0.12 when using the default smart pointer handling for some languages when the smart pointer wraps std::map and other STL containers. 2014-03-02: wsfulton [Python] SF Patch #346 from Jens Krueger. Correct exception thrown attempting to access a non-existent C/C++ global variable on the 'cvar' object. The exception thrown used to be a NameError. However, as this access is via a primary, an AttributeError is more correct and so the exception thrown now is an AttributeError. Reference: http://docs.python.org/2/reference/expressions.html#attribute-references *** POTENTIAL INCOMPATIBILITY *** 2014-03-01: wsfulton [Python] Patch #143 Fix type shown when using type() to include the module and package name when using -builtin. 2014-03-01: wsfulton [Python] SF patch #347 Fix missing argument count checking with -modern. Fixes regression introduced when builtin changes were introduced in SWIG-2.0.3. 2014-02-21: wsfulton [PHP] Fix warning suppression using %warnfilter for PHP reserved class names. 2014-02-19: olly [Lua] Add keyword warnings for Lua keywords and Basic Functions. 2014-02-19: olly -Wallkw now includes keywords for all languages with keyword warnings (previously Go and R were missing). 2014-02-19: olly [PHP] Update the lists of PHP keywords with new ones from PHP 5.4 and newer (and some missing ones from 5.3). Reserved PHP constants names are now checked against enum values and constants, instead of against function and method names. Built-in PHP function names no longer match methods added by %extend. Functions and methods named '__sleep', '__wakeup', 'not', 'parent', or 'virtual' are no longer needlessly renamed. 2014-02-15: wsfulton Fix the %$ismember %rename predicates to also apply to members added via %extend. Add %$isextendmember for %rename of members added via %extend. This can be used to distinguish between normal class/struct members and %extend members. For example '%$ismember, %$not %$isextendmember' will now identify just class/struct members. *** POTENTIAL INCOMPATIBILITY *** 2014-02-16: hfalcic [Python] Patch #137 - fix crashes/exceptions in exception handling in Python 3.3 2014-02-15: wsfulton [Java] Add support for the cdata library. 2014-02-08: vkalinin Nested class support added. This primarily allows SWIG to properly parse nested classes and keep the nested class information in the parse tree. Java and C# have utilised this information wrapping the C++ nested classes as Java/C# nested classes. The remaining target languages ignore nested classes as in previous versions. Help is needed by users of these remaining languages to design how C++ nested classes can be best wrapped. Please talk to us on the swig-devel mailing list if you think you can help. Previously, there was limited nested class support. Nested classes were treated as opaque pointers. However, the "nestedworkaround" feature provided a way to wrap a nested class as if it was a global class. This feature no longer exists and is replaced by the new "flatnested" feature. This effectively does the same thing with less manual code to be written. Please see the 'Nested classes' section in the documentation in SWIGPlus.html if you were previously using this feature. SWIG now parses the contents of nested classes where previously it did not. You may find that you will need to make adjustments to your interface file as effectively extra code is being wrapped. *** POTENTIAL INCOMPATIBILITY *** 2014-02-06: gjanssens [Guile] Patch #133. Make scm to string conversion work with non-ascii strings. Guile 2 has a completely rewritten string implementation. SWIG made some assumptions that are no longer valid as to the internals of guile's string representation. 2014-01-30: wsfulton [C#] Add new swigtype_inout.i library containing SWIGTYPE *& OUTPUT typemaps. Example usage wrapping: void f(XXX *& x) { x = new XXX(111); } would be: XXX x = null; f(out x); // use x x.Dispose(); // manually clear memory or otherwise leave out and leave it to the garbage collector 2014-01-21: ianlancetaylor [Go] Add %go_import directive. 2014-01-21: ianlancetaylor [Go] Add support for Go 1.3, not yet released. 2014-01-20: wsfulton Director exceptions (Swig::DirectorException) now derive from std::exception and hence provide the what() method. In Python and Ruby, this replaces the now deprecated DirectorException::getMessage() method. 2014-01-14: diorcety Patch #112 - Fix symbol resolution involving scopes that have multiple levels of typedefs - fixes some template resolutions as well as some typemap searches. 2014-01-11: wsfulton Fix and document the naturalvar feature override behaviour - the naturalvar feature attached to a variable name has precedence over the naturalvar feature attached to the variable's type. The overriding was not working when turning the feature off on the variable's name. Fix so that any use of the naturalvar feature will override the global setting. Previously when set globally by -naturalvar or %module(naturalvar=1), use of the naturalvar feature was not always honoured. 2014-01-06: ianlancetaylor [Go] Fix bug that broke using directors from a thread not created by Go. 2013-12-24: ptomulik [Python] SF Bug #1297 Resolve several issues related to python imports. For example, it's now possible to import modules having the same module names, but belonging in different packages. From the user's viewpoint, this patch gives a little bit more control on import statements generated by SWIG. The user may choose to use relative or absolute imports. Some details: - we (still) generate import statements in the form 'import a.b.c' which corresponds to absolute imports in python3 and (the only available) ambiguous one in python2. - added -relativeimport option to use explicit relative import syntax (python3), The "Python Packages" section in the documentation discusses how to work with importing packages including the new -relativeimport command line option. 2013-12-23: vadz [Octave, Perl, Python, R, Ruby, Tcl] Change the length of strings created from fixed-size char buffers in C code. This is a potential backwards compatibility break: a "char buf[5]" containing "ho\0la" was returned as a string of length 5 before, but is returned as a string of length 2 now. Also, it was possible to assign a (non-NUL-terminated) string "hello" to such a buffer before but now this fails and only "helo" can fit. Apply "char FIXSIZE[ANY]" typemaps to explicitly choose the old behaviour. *** POTENTIAL INCOMPATIBILITY *** 2013-12-23: talby [Perl] Add support for directors. 2013-12-18: ianlancetaylor [Go] Don't require that Go environment variables be set when running examples or testsuite when using Go 1 or later. 2013-12-17: ianlancetaylor [Go] Remove -longsize option (for backward compatibility, ignore it if seen). 2013-12-17: ianlancetaylor [Go] Add -go-pkgpath option. 2013-12-16: ianlancetaylor [Go] Update for Go 1.2 release. Add support for linking SWIG code directly into executable, rather than using a shared library. 2013-12-13: ianlancetaylor [Go] Add SWIG source file name as comments in generated files. This can be used by Go documentation tools. 2013-12-12: jleveque [Lua] Fix typo (wchar instead of wchar_t) which made wchar.i for Lua useless. 2013-12-12: vmiklos [PHP] PHP's peculiar call-time pass-by-reference feature was deprecated in PHP 5.3 and removed in PHP 5.4, so update the REF typemaps in phppointers.i to specify pass-by-reference in the function definition. Examples/php/pointer has been updated accordingly. 2013-12-12: olly [PHP] The usage of $input in PHP directorout typemaps has been changed to be consistent with other languages. The typemaps provided by SWIG have been updated accordingly, but if you have written your own directorout typemaps, you'll need to update $input to &$input (or make equivalent changes). *** POTENTIAL INCOMPATIBILITY *** 2013-11-27: vadz [C#, Java, Python] Add std_auto_ptr.i defining typemaps for returning std::auto_ptr<>. 2013-11-09: wsfulton [C#] Apply patch #79 from Brant Kyser - Remove using directives from the generated C# code and fully qualify the use of all .NET framework types in order to minimize potential name collisions from input files defining types, namespace, etc with the same name as .NET framework members. - Globally qualify the use of .NET framework types in the System namespace - Remove .NET 1.1 support, .NET 2 is the minimum for the C# module This is a potential backwards compatibility break if code has been added relying on these using statements that used to be generated: using System; using System.Runtime.InteropServices; The quick fix to add these back in is to add the -DSWIG2_CSHARP command line option when executing SWIG. See CSharp.html documentation for more info. *** POTENTIAL INCOMPATIBILITY *** 2013-11-05: wsfulton [Java] Fix some corner cases for the $packagepath/$javaclassname special variable substitution. 2013-11-05: wsfulton [Java] Apply patch #91 from Marvin Greenberg - Add director:except feature for improved exception handling in director methods for Java. 2013-10-15: vadz Allow using \l, \L, \u, \U and \E in the substitution part of %(regex:/pattern/subst/) inside %rename to change the case of the text being replaced. 2013-10-12: wsfulton [CFFI] Apply #96 - superclass not lispify 2013-10-12: wsfulton Merge in C++11 support from the gsoc2009-matevz branch where Matevz Jekovec first started the C++0x additions. Documentation of the C++11 features supported is in a new Chapter of the documentation, "SWIG and C++11" in Doc/Manual/CPlusPlus11.html. 2013-10-04: wsfulton Fix %naturalvar not having any affect on templated classes instantiated with an enum as the template parameter type. Problem reported by Vadim Zeitlin. 2013-09-20: wsfulton [Java] Fix a memory leak for the java char **STRING_ARRAY typemaps. Version 2.0.12 (9 Feb 2014) =========================== 2014-01-16: wsfulton [PHP] Fix compilation error in ZTS mode (64 bit windows) due to incorrect placement of TSRMLS_FETCH() in SWIG_Php_GetModule() as reported by Mark Dawson-Butterworth. 2014-01-13: kwwette [Octave] update support to Octave version 3.8.0 - Octave 3.8.0 no longer defines OCTAVE_API_VERSION_NUMBER, but 3.8.1 will define OCTAVE_{MAJOR,MINOR,PATCH}_VERSION instead: see http://hg.savannah.gnu.org/hgweb/octave/rev/b6b6e0dc700e So we now use a new macro SWIG_OCTAVE_PREREQ(major,minor,patch) to enable features requiring Octave version major.minor.patch or later. For Octave versions prior to 3.8.1, we reconstruct values for OCTAVE_{MAJOR,MINOR,PATCH}_VERSION based on OCTAVE_API_VERSION_NUMBER, extracted from Octave's ChangeLogs. An additional hack is needed to distinguish between Octave <= 3.2.x and 3.8.0, neither of which define OCTAVE_API_VERSION_NUMBER. - Octave 3.8.0 deprecates symbol_table::varref(), so remove its use for this and future versions of Octave. - Octave 3.8.0 removes octave_value::is_real_nd_array(), used in octave_swig_type::dims(). Its use is not required here, so remove it. - Retested against Octave versions 3.0.5, 3.2.4, 3.4.3, 3.6.4, and 3.8.0. - Updated Octave documentation with tested Octave versions, and added a warning against using versions <= 3.x.x, which are no longer tested. 2013-12-22: wsfulton C++11 support for new versions of erase and insert in the STL containers. The erase and insert methods in the containers use const_iterator instead of iterator in C++11. There are times when the methods wrapped must match the parameters exactly. Specifically when full type information for template types is missing or SWIG fails to look up the type correctly, for example: %include typedef float Real; %template(RealVector) std::vector; SWIG does not find std::vector::iterator because %template using typedefs does not always work and so SWIG doesn't know if the type is copyable and so uses SwigValueWrapper which does not support conversion to another type (const_iterator). This resulted in compilation errors when using the C++11 version of the containers. Closes #73 2013-10-17: wsfulton [R] Fix SF #1340 - Visual Studio compile error in C++ wrappers due to #include within extern "C" block. 2013-10-17: wsfulton [Python] Fix SF #1345 - Missing #include for offsetof when using -builtin. 2013-10-12: wsfulton [Lua] Apply #92 - missing return statements for SWIG_Lua_add_namespace_details() and SWIG_Lua_namespace_register(). Version 2.0.11 (15 Sep 2013) ============================ 2013-09-15: wsfulton [R] Fix attempt to free a non-heap object in OUTPUT typemaps for: unsigned short *OUTPUT unsigned long *OUTPUT signed long long *OUTPUT char *OUTPUT signed char*OUTPUT unsigned char*OUTPUT 2013-09-12: wsfulton [Lua] Pull Git patch #62. 1) Static members and static functions inside class can be accessed as ModuleName.ClassName.FunctionName (MemberName respectively). Old way such as ModuleName.ClassName_FunctionName still works. 2) Same goes for enums inside classes: ModuleName.ClassName.EnumValue1 etc. 2013-09-12: wsfulton [UTL] Infinity is now by default an acceptable value for type 'float'. This fix makes the handling of type 'float' and 'double' the same. The implementation requires the C99 isfinite() macro, or otherwise some platform dependent equivalents, to be available. Users requiring the old behaviour of not accepting infinity, can define a 'check' typemap wherever a float is used, such as: %typemap(check,fragment="") float, const float & %{ if ($1 < -FLT_MAX || $1 > FLT_MAX) { SWIG_exception_fail(SWIG_TypeError, "Overflow in type float"); } %} *** POTENTIAL INCOMPATIBILITY *** 2013-08-30: wsfulton [Lua] Pull Git patch #81: Include Lua error locus in SWIG error messages. This is standard information in Lua error messages, and makes it much easier to find bugs. 2013-08-29: wsfulton Pull Git patch #75: Handle UTF-8 files with BOM at beginning of file. Was giving an 'Illegal token' syntax error. 2013-08-29: wsfulton [C#] Pull Git patch #77: Allow exporting std::map using non-default comparison function. 2013-08-28: wsfulton [Python] %implicitconv is improved for overloaded functions. Like in C++, the methods with the actual types are considered before trying implicit conversions. Example: %implicitconv A; struct A { A(int i); }; class CCC { public: int xx(int i) { return 11; } int xx(const A& i) { return 22; } }; The following python code: CCC().xx(-1) will now return 11 instead of 22 - the implicit conversion is not done. 2013-08-23: olly [Python] Fix clang++ warning in generated wrapper code. 2013-08-16: wsfulton [Python] %implicitconv will now accept None where the implicit conversion takes a C/C++ pointer. Problem highlighted by Bo Peng. Closes SF patch #230. 2013-08-07: wsfulton [Python] SF Patch #326 from Kris Thielemans - Remove SwigPyObject_print and SwigPyObject_str and make the generated wrapper use the default python implementations, which will fall back to repr (for -builtin option). Advantages: - it avoids the swig user having to jump through hoops to get print to work as expected when redefining repr/str slots. - typing the name of a variable on the python prompt now prints the result of a (possibly redefined) repr, without the swig user having to do any extra work. - when redefining repr, the swig user doesn't necessarily have to redefine str as it will call the redefined repr - the behaviour is exactly the same as without the -builtin option while requiring no extra work by the user (aside from adding the %feature("python:slot...) statements of course) Disadvantage: - default str() will give different (but clearer?) output on swigged classes 2013-07-30: wsfulton [Python, Ruby] Fix #64 #65: Missing code in std::multimap wrappers. Previously an instantiation of a std::map was erroneously required in addition to an instantiation of std::multimap with the same template parameters to prevent compilation errors for the wrappers of a std::multimap. 2013-07-14: joequant [R] Change types file to allow for SEXP return values 2013-07-05: wsfulton [Python] Add %pythonbegin directive which works like %pythoncode, except the specified code is added at the beginning of the generated .py file. This is primarily needed for importing from __future__ statements required to be at the very beginning of the file. Example: %pythonbegin %{ from __future__ import print_function print("Loading", "Whizz", "Bang", sep=' ... ') %} 2013-07-01: wsfulton [Python] Apply SF patch #340 - Uninitialized variable fix in SWIG_Python_NonDynamicSetAttr when using -builtin. 2013-07-01: wsfulton [Python, Ruby, Ocaml] Apply SF patch #341 - fix a const_cast in generated code that was generating a <:: digraph when using the unary scope operator (::) (global scope) in a template type. 2013-07-01: wsfulton [Python] Add SF patch #342 from Christian Delbaere to fix some director classes crashing on object deletion when using -builtin. Fixes SF bug #1301. 2013-06-11: wsfulton [Python] Add SWIG_PYTHON_INTERPRETER_NO_DEBUG macro which can be defined to use the Release version of the Python interpreter in Debug builds of the wrappers. The Visual Studio .dsp example files have been modified to use this so that Debug builds will now work without having to install or build a Debug build of the interpreter. 2013-06-07: wsfulton [Ruby] Git issue #52. Fix regression with missing rb_complex_new function for Ruby versions prior to 1.9 using std::complex wrappers if just using std::complex as an output type. Also fix the Complex helper functions external visibility (to static by default). 2013-06-04: olly [PHP] Fix SWIG_ZTS_ConvertResourcePtr() not to dereference NULL if the type lookup fails. Version 2.0.10 (27 May 2013) ============================ 2013-05-25: wsfulton [Python] Fix Python 3 inconsistency when negative numbers are passed where a parameter expects an unsigned C type. An OverFlow error is now consistently thrown instead of a TypeError. 2013-05-25: Artem Serebriyskiy SVN Patch ticket #338 - fixes to %attribute macros for template usage with %arg. 2013-05-19: wsfulton Fix ccache-swig internal error bug due to premature file cleanup. Fixes SF bug 1319 which shows up as a failure in the ccache tests on Debian 64 bit Wheezy, possibly because ENABLE_ZLIB is defined. This is a corner case which will be hit when the maximum number of files in the cache is set to be quite low (-F option), resulting in a cache miss. 2013-05-09: kwwette [Octave] Fix bugs in Octave module loading: - fix a memory leak in setting of global variables - install functions only once, to speed up module loads 2013-04-28: gjanssens [Guile] Updates in guile module: - Add support for guile 2.0 - Drop support for guile 1.6 - Drop support for generating wrappers using guile's gh interface. All generated wrappers will use the scm interface from now on. - Deprecate -gh and -scm options. They are no longer needed. A warning will be issued when these options are still used. - Fix all tests and examples to have a successful travis test 2013-04-18: wsfulton Apply Patch #36 from Jesus Lopez to add support for $descriptor() special variable macro expansion in fragments. For example: %fragment("nameDescriptor", "header") %{ static const char *nameDescriptor = "$descriptor(Name)"; %} which will generate into the wrapper if the fragment is used: static const char *nameDescriptor = "SWIGTYPE_Name"; 2013-04-18: wsfulton Fix SF Bug #428 - Syntax error when preprocessor macros are defined inside of enum lists, such as: typedef enum { eZero = 0 #define ONE 1 } EFoo; The macros are silently ignored. 2013-04-17: wsfulton [C#] Pull patch #34 from BrantKyser to fix smart pointers in conjunction with directors. 2013-04-15: kwwette [Octave] Fix bugs in output of cleanup code. - Cleanup code is now written also after the "fail:" label, so it will be called if a SWIG_exception is raised by the wrapping function, consistent with other modules. - Octave module now also recognises the "$cleanup" special variable, if needed. 2013-04-08: kwwette Add -MP option to SWIG for generating phony targets for all dependencies. - Prevents make from complaining if header files have been deleted before the dependency file has been updated. - Modelled on similar option in GCC. 2013-04-09: olly [PHP] Add missing directorin typemap for char* and char[] which fixes director_string testcase failure. 2013-04-05: wsfulton [Ruby] SF Bug #1292 - Runtime fixes for Proc changes in ruby-1.9 when using STL wrappers that override the default predicate, such as: %template(Map) std::map >; 2013-04-05: wsfulton [Ruby] SF Bug #1159 - Correctly check rb_respond_to call return values to fix some further 1.9 problems with functors and use of Complex wrappers. 2013-04-02: wsfulton [Ruby] Runtime fixes for std::complex wrappers for ruby-1.9 - new native Ruby complex numbers are used. 2013-03-30: wsfulton [Ruby] Fix seg fault when using STL containers of generic Ruby types, GC_VALUE or LANGUAGE_OBJECT, on exit of the Ruby interpreter. More frequently observed in ruby-1.9. 2013-03-29: wsfulton [Ruby] Fix delete_if (reject!) for the STL container wrappers which previously would sometimes seg fault or not work. 2013-03-25: wsfulton [Python] Fix some undefined behaviour deleting slices in the STL containers. 2013-03-19: wsfulton [C#, Java, D] Fix seg fault in SWIG using directors when class and virtual method names are the same except being in different namespaces when the %nspace feature is not being used. 2013-02-19: kwwette Fix bug in SWIG's handling of qualified (e.g. const) variables of array type. Given the typedef a(7).q(volatile).double myarray // typedef volatile double[7] myarray; the type q(const).myarray // const myarray becomes a(7).q(const volatile).double // const volatile double[7] Previously, SwigType_typedef_resolve() produces the type q(const).a(7).q(volatile).double // non-sensical type which would never match %typemap declarations, whose types were parsed correctly. Add typemap_array_qualifiers.i to the test suite which checks for the correct behaviour. 2013-02-18: wsfulton Deprecate typedef names used as constructor and destructor names in %extend. The real class/struct name should be used. typedef struct tagEStruct { int ivar; } EStruct; %extend tagEStruct { EStruct() // illegal name, should be tagEStruct() { EStruct *s = new EStruct(); s->ivar = ivar0; return s; } ~EStruct() // illegal name, should be ~tagEStruct() { delete $self; } } For now these trigger a warning: extend_constructor_destructor.i:107: Warning 522: Use of an illegal constructor name 'EStruct' in %extend is deprecated, the constructor name should be 'tagEStruct'. extend_constructor_destructor.i:111: Warning 523: Use of an illegal destructor name 'EStruct' in %extend is deprecated, the destructor name should be 'tagEStruct'. These %extend destructor and constructor names were valid up to swig-2.0.4, however swig-2.0.5 ignored them altogether for C code as reported in SF bug #1306. The old behaviour of using them has been restored for now, but is officially deprecated. This does not apply to anonymously defined typedef classes/structs such as: typedef struct {...} X; 2013-02-17: kwwette When generating functions provided by %extend, use "(void)" for no-argument functions instead of "()". This prevents warnings when compiling with "gcc -Wstrict-prototypes". 2013-02-17: kwwette [Octave] Minor fix to autodoc generation: get the right type for functions returning structs. 2013-02-15: wsfulton Deprecate typedef names used in %extend that are not the real class/struct name. For example: typedef struct StructBName { int myint; } StructB; %extend StructB { void method() {} } will now trigger a warning: swig_extend.i:19: Warning 326: Deprecated %extend name used - the struct name StructBName should be used instead of the typedef name StructB. This is only partially working anyway (the %extend only worked if placed after the class definition). 2013-02-09: wsfulton [CFFI] Apply patch #22 - Fix missing package before &body 2013-01-29: wsfulton [Java] Ensure 'javapackage' typemap is used as it stopped working from version 2.0.5. 2013-01-28: wsfulton [Python] Apply patch SF #334 - Fix default value conversions "TRUE"->True, "FALSE"->False. 2013-01-28: wsfulton [Java] Apply patch SF #335 - Truly ignore constructors in directors with %ignore. 2013-01-18: Brant Kyser [Java] Patch #15 - Allow the use of the nspace feature without the -package commandline option. This works as long and the new jniclasspackage pragma is used to place the JNI intermediate class into a package and the nspace feature is used to place all exposed types into a package. 2013-01-15: wsfulton Fix Visual Studio examples to work when SWIG is unzipped into a directory containing spaces. 2013-01-15: wsfulton [C#] Fix cstype typemap lookup for member variables so that a fully qualified variable name matches. For example: %typemap(cstype) bool MVar::mvar "MyBool" struct MVar { bool mvar; }; 2013-01-11: Brant Kyser [Java, C#, D] SF Bug #1299 - Fix generated names for when %nspace is used on classes with the same name in two different namespaces. 2013-01-11: Vladimir Kalinin [C#] Add support for csdirectorin 'pre', 'post' and 'terminator' attributes. 2013-01-08: olly [PHP] Fix to work with a ZTS build of PHP (broken in 2.0.7). 2013-01-07: olly Fix bashism in configure, introduced in 2.0.9. 2013-01-06: wsfulton Pull patch #4 from ptomulik to fix SF Bug #1296 - Fix incorrect warning for virtual destructors in templates, such as: Warning 521: Illegal destructor name B< A >::~B(). Ignored. 2013-01-05: wsfulton [Python] Pull patch #3 from ptomulik to fix SF Bug #1295 - standard exceptions as classes using the SWIG_STD_EXCEPTIONS_AS_CLASSES macro. 2013-01-04: wsfulton [Java] Pull patch #2 from BrantKyser to fix SF Bug #1283 - fix smart pointers in conjuction with directors. 2013-01-03: wsfulton [Java] Pull patch #1 from BrantKyser to fix SF Bug #1278 - fix directors and nspace feature when multilevel namespaces are used. Version 2.0.9 (16 December 2012) ================================ 2012-12-16: wsfulton Fix garbage line number / empty file name reporting for some missing '}' or ')' error messages. 2012-12-15: kkaempf [Ruby] Apply patch 3530444, Class#methods and Class#constants returns array of symbols in Ruby 1.9+ 2012-12-14: kkaempf [Ruby] Apply patch 3530439 and finally replace all occurrences of the STR2CSTR() macro with StringValuePtr(). STR2CSTR was deprecated since years and got removed in Ruby 1.9 2012-12-14: kkaempf [Ruby] Applied patches #3530442 and 3530443 to adapt compile and runtime include paths to match Ruby 1.9+ 2012-12-14: wsfulton [CFFI] Fix #3161614 - Some string constants are incorrect 2012-12-13: wsfulton [CFFI] Fix #3529690 - Fix incorrect constant names. 2012-12-12: drjoe [R] add fix to finalizer that was missed earlier 2012-12-11: wsfulton [Python] Apply patch #3590522 - fully qualified package paths for Python 3 even if a module is in the same package. 2012-12-08: wsfulton [Python] Bug #3563647 - PyInt_FromSize_t unavailable prior to Python 2.5 for unsigned int types. 2012-12-08: wsfulton [Perl] Fix bug #3571361 - C++ comment in C wrappers. 2012-12-07: wsfulton [C#] Apply patch #3571029 which adds missing director support for const unsigned long long &. 2012-11-28: kwwette [Octave] Simplified module loading: now just the syntax $ example; is accepted, which loads functions globally but constants and variables relative to the current scope. This make module loading behaviour reliably consistent, and reduces problems when loading modules which depend on other modules which may not have been previously loaded. 2012-11-27: wsfulton [cffi] Fix junk output when wrapping single character literal constants. 2012-11-17: wsfulton [Tcl, Modula3] Add missing support for -outdir. 2012-11-17: wsfulton Fix segfaults when using filename paths greater than 1024 characters in length. 2012-11-14: wsfulton [ccache-swig] Apply patch #3586392 from Frederik Deweerdt to fix some error cases - incorrectly using memory after it has been deleted. 2012-11-09: vzeitlin [Python] Fix overflow when passing values greater than LONG_MAX from Python 3 for parameters with unsigned long C type. 2012-11-09: wsfulton Fix some feature matching issues for implicit destructors and implicit constructors and implicit copy constructors added with %copyctor. Previously a feature for these had to be fully qualified in order to match. Now the following will also match: %feature("xyz") ~XXX(); struct XXX {}; 2012-11-09: wsfulton Further consistency in named output typemap lookups for implicit constructors and destructors and implicit copy constructors added with %copyctor. Previously only the fully qualified name was being used, now the unqualified name will also be used. For example, previously: example.i:38: Searching for a suitable 'out' typemap for: void Space::More::~More Looking for: void Space::More::~More Looking for: void Now the unqualified name is also used: example.i:38: Searching for a suitable 'out' typemap for: void Space::More::~More Looking for: void Space::More::~More Looking for: void ~More Looking for: void 2012-11-02: wsfulton Fix some subtle named output typemap lookup misses, the fully qualified name was not always being used for variables, for example: struct Glob { int MyVar; }; Previously the search rules (as shown by -debug-tmsearch) for the getter wrapper were: example.i:44: Searching for a suitable 'out' typemap for: int MyVar Looking for: int MyVar Looking for: int Now the scope is named correctly: example.i:44: Searching for a suitable 'out' typemap for: int Glob::MyVar Looking for: int Glob::MyVar Looking for: int MyVar Looking for: int 2012-10-26: wsfulton Fix director typemap searching so that a typemap specified with a name will be correctly matched. Previously the name was ignored during the typemap search. Applies to the following list of typemaps: directorout, csdirectorout, cstype, imtype, ctype, ddirectorout, dtype, gotype, jtype, jni, javadirectorout. 2012-10-11: wsfulton Most of the special variables available for use in %exception are now also available for expansion in %extend blocks. These are: $name $symname $overname $decl $fulldecl $parentclassname $parentclasssymname, see docs on "Class extension" in SWIGPlus.html. Patch based on submission from Kris Thielemans. 2012-10-10: wsfulton Additional new special variables in %exception are expanded as follows: $parentclassname - The parent class name (if any) for a method. $parentclasssymname - The target language parent class name (if any) for a method. 2012-10-08: iant [Go] Generating Go code now requires using the -intgosize option to indicate the size of the 'int' type in Go. This is because the size of the type is changing from Go 1.0 to Go 1.1 for x86_64. 2012-09-14: wsfulton Add new warning if the empty template instantiation is used as a base class, for example: template class Base {}; %template() Base; class Derived : public Base {}; gives the following warning instead of silently ignoring the base: cpp_inherit.i:52: Warning 401: Base class 'Base< int >' has no name as it is an empty template instantiated with '%template()'. Ignored. cpp_inherit.i:51: Warning 401: The %template directive must be written before 'Base< int >' is used as a base class and be declared with a name. 2012-09-11: wsfulton [Java] Fix #3535304 - Direct use of a weak global reference in directors sometimes causing seg faults especially on Android. 2012-09-06: wsfulton [Java] Fix (char *STRING, size_t LENGTH) typemaps to accept NULL string. 2012-08-26: drjoe [R] make ExternalReference slot ref to contain reference 2012-08-26: drjoe [R] fix Examples/Makefile to use C in $(CC) rather than $(CXX) Version 2.0.8 (20 August 2012) ============================== 2012-08-15: wsfulton [Perl] Add size_type, value_type, const_reference to the STL containers. 2012-08-15: wsfulton [Python] Add discard and add methods to std::set wrappers so that pyabc.i can be used ensuring MutableSet is a valid abstract base class for std::set. As reported by Alexey Sokolov. Similarly for std::multiset. 2012-08-15: wsfulton [Python] Fix #3541744 - Missing PyInt_FromSize_t calls for Python 3. 2012-08-13: wsfulton [Java] Patch from David Baum to add the assumeoverride feature for Java directors to improve performance when all overridden methods can be assumed to be overridden. 2012-08-05: wsfulton [Python] #3530021 Fix unused variable warning. 2012-08-05: wsfulton [C#] Fix #3536360 - Invalid code sometimes being generated for director methods with many arguments. 2012-08-05: wsfulton [Perl] #3545877 - Don't undefine bool if defined by C99 stdbool.h - problem using Perl 5.16 and later. 2012-08-04: wsfulton Remove incorrect warning (314) about target language keywords which were triggered by using declarations and using directives. For example 'string' is a keyword in C#: namespace std { class string; } using std::string; 2012-07-21: wsfulton Fix display of pointers in various places on 64 bit systems - only 32 bits were being shown. 2012-07-21: wsfulton Fix gdb debugger functions 'swigprint' and 'locswigprint' to display to the gdb output window rather than stdout. This fixes display problems in gdbtui and the ensures the output appears where expected in other gdb based debuggers such as Eclipse CDT. 2012-07-20: kwwette [Octave] segfault-on-exit prevention hack now preserves exit status, and uses C99 _Exit(). 2012-07-02: wsfulton Fix Debian bug http://bugs.debian.org/672035, typemap copy failure - regression introduced in swig-2.0.5: %include using std::pair; %template(StrPair) pair; 2012-07-02: wsfulton Fix using declarations combined with using directives with forward class declarations so that types are correctly found in scope for templates. Example: namespace Outer2 { namespace Space2 { template class Thing2; } } using namespace Outer2; using Space2::Thing2; template class Thing2 {}; // STILL BROKEN void useit2(Thing2 t) {} void useit2a(Outer2::Space2::Thing2 t) {} void useit2b(::Outer2::Space2::Thing2 t) {} void useit2c(Space2::Thing2 t) {} namespace Outer2 { void useit2d(Space2::Thing2 t) {} } %template(Thing2Int) Thing2; 2012-06-30: wsfulton Fix template namespace problems for symbols declared with a forward class declarations, such as: namespace Space1 { namespace Space2 { template struct YYY; } template struct Space2::YYY { T yyy(T h) { return h; } }; void testYYY1(Space1::Space2::YYY yy) {} void testYYY2(Space2::YYY yy) {} void testYYY3(::Space1::Space2::YYY yy) {} } %template(YYYInt) Space1::Space2::YYY; 2012-06-30: wsfulton Fix namespace problems for symbols declared with a forward class declarations, such as: namespace Space1 { namespace Space2 { struct XXX; struct YYY; } struct Space2::YYY {}; struct Space1::Space2::XXX {}; void testXXX2(Space2::XXX xx) {} void testYYY2(Space2::YYY yy) {} } where xx and yy were not recognised as the proxy classes XXX and YYY. 2012-06-30: wsfulton Fix using declarations combined with using directives with forward class declarations so that types are correctly found in scope. namespace Outer2 { namespace Space2 { class Thing2; } } using namespace Outer2; using Space2::Thing2; class Thing2 {}; // None of the methods below correctly used the Thing2 proxy class void useit2(Thing2 t) {} void useit2a(Outer2::Space2::Thing2 t) {} void useit2b(::Outer2::Space2::Thing2 t) {} void useit2c(Space2::Thing2 t) {} namespace Outer2 { void useit2d(Space2::Thing2 t) {} } 2012-06-25: wsfulton Fix using declarations combined with using directives so that types are correctly found in scope. Example: namespace Outer2 { namespace Space2 { class Thing2 {}; } } using namespace Outer2; // using directive using Space2::Thing2; // using declaration void useit2(Thing2 t) {} Similarly for templated classes. 2012-05-29: wsfulton Fix #3529601 - seg fault when a protected method has the "director" feature but the parent class does not. Also fix similar problems with the allprotected feature. 2012-05-28: wsfulton Fix seg fault when attempting to warn about an illegal destructor - #3530055, 3530078 and #3530118. Version 2.0.7 (26 May 2012) =========================== 2012-05-26: wsfulton std::string typemap modifications so they can be used with %apply for other string classes. 2012-05-25: wsfulton [Lua] Fixes for -external-runtime to work again. 2012-05-22: szager [python] Disambiguate SWIG_From_unsigned_SS_int and SWIG_From_unsigned_SS_long. 2012-05-18: olly [PHP] Fix getters for template members. (SF#3428833, SF#3528035) 2012-05-14: wsfulton Fix some language's std::map wrappers to recognise difference_type, size_type, key_type and mapped_type. 2012-05-14: kwwette (signed off by xavier98) [Octave] Prevent Octave from seg-faulting at exit when SWIG modules are loaded, due to bugs in Octave's cleanup code: * Wrapping functions now declared with Octave DEFUN_DLD macro, and loaded through Octave's dynamic module loader * Global variables of swigref type are now assigned a new() copy of the swigref class, to prevent double-free errors * SWIG module at-exit cleanup function now created in Octave through eval(), so not dependent on loaded .oct library * For Octave versions 3.1.* to 3.3.*, register C-level at-exit function which terminates Octave immediately (with correct status code) without performing memory cleanup. This function can be controlled with macros in Lib/octave/octruntime.swg [Octave] New syntax for determing whether SWIG module should be loaded globally or non-globally. To load module "example" globally, type the module name $ example; as before; to load module non-globally, assign it to a variable: $ example = example; or $ ex = example; for a shorter (local) module name. -global/-noglobal command-line options and module command line are deprecated. Added usage info to module, so typing $ help example or incorrect usage should display proper usage, with examples. *** POTENTIAL INCOMPATIBILITY *** 2012-05-12: olly [PHP] Fix memory leak in code generated for a callback. Patch from SF bug #3510806. 2012-05-12: olly [PHP] Avoid using zend_error_noreturn() as it doesn't work with all builds of PHP (SF bug #3166423). Instead we now wrap it in a SWIG_FAIL() function which we annotate as "noreturn" for GCC to avoids warnings. This also reduces the size of the compiled wrapper (e.g. the stripped size is reduced by 6% for Xapian's PHP bindings). 2012-05-11: wsfulton [Java] SF patch #3522855 Fix unintended uninitialised memory access in OUTPUT typemaps. 2012-05-11: wsfulton [Java] SF patch #3522674 Fix possible uninitialised memory access in char **STRING_OUT typemap. 2012-05-11: wsfulton [Java] SF patch #3522611 Fix uninitialised size regression in char **STRING_ARRAY introduced in swig-2.0.6. 2012-05-11: wsfulton SF bug #3525050 - Fix regression introduced in swig-2.0.5 whereby defining one typemap method such as an 'out' typemap may hide another typemap method such as an 'in' typemap - only occurs when the type is a template type where the template parameters are the same via a typedef. 2012-05-10: olly [PHP] Fix the constant typemaps for SWIGTYPE, etc - previously these used the wrong name for renamed constants. Add autodoc_runme.php to the testsuite as a regression test for this. 2012-05-02: ianlancetaylor [Go] Remove compatibility support for gccgo 4.6. Using SWIG with gccgo will now require gccgo 4.7. Using SWIG with the more commonly used gc compiler is unaffected. 2012-05-01: wsfulton Fix generated code for C forward enum declarations in some languages. Version 2.0.6 (30 April 2012) ============================= 2012-04-25: wsfulton [Lua] Fix uninitialised variable in SWIGTYPE **OUTPUT typemaps as reported by Jim Anderson. 2012-04-28: wsfulton [Python] Fix compilation errors when wrapping STL containers on Mac OS X and possibly other systems. 2012-04-28: wsfulton [Java] Patch 3521811 from Leo Davis - char **STRING_ARRAY typemaps fixed to handle null pointers. Version 2.0.5 (19 April 2012) ============================= 2012-04-14: wsfulton [Lua] Apply patch #3517435 from Miles Bader - prefer to use Lua_pushglobaltable 2012-04-14: wsfulton [Ruby] Apply patch #3517769 from Robin Stocker to fix compile error on MacRuby using RSTRING_PTR. 2012-04-13: wsfulton Apply patch #3511009 from Leif Middelschulte for slightly optimised char * variable wrappers. 2012-04-13: wsfulton [Lua] Apply #3219676 from Shane Liesegang which adds: - support for %factory - a __tostring method - a __disown method 2012-04-13: wsfulton [Xml] Apply #3513569 which adds a catchlist to the xml output. 2012-04-05: olly [Lua] Add support for Lua 5.2 (patch SF#3514593 from Miles Bader) 2012-03-26: xavier98 [octave] Apply patch #3425993 from jgillis: add extra logic to the octave_swig_type::dims(void) method: it checks if the user has defined a __dims__ method and uses this in stead of returning (1,1) [octave] Apply patch #3424833 from jgillis: make is_object return true for swig types 2012-03-24: wsfulton [D] Apply #3502431 to fix duplicate symbols in multiple modules. 2012-03-21: wsfulton Fix #3494791 - %$isglobal for %rename matching. 2012-03-20: wsfulton Fix #3487706 and #3391906 - missing stddef.h include for ptrdiff_t when using %import for STL containers and compiling with g++-4.6. An include of stddef.h is now only generated when SWIG generates STL helper templates which require ptrdiff_t. If you were previously relying on "#include " always being generated when using a %include of an STL header, you may now need to add this in manually. 2012-03-16: wsfulton Apply patch #3392264 from Sebastien Bine to parse (unsigned) long long types in enum value assignment. 2012-03-16: wsfulton Apply patch #3505530 from Karl Wette to allow custom allocators in STL string classes for the UTL languages. 2012-03-13: wsfulton Apply patch #3468362 from Karl Wette to fix %include inside %define. 2012-03-13: wsfulton [Python, Ruby, Octave, R] Fix #3475492 - iterating through std::vector wrappers of enumerations. 2012-02-27: xavier98 (patches from Karl Wette) [Octave] Use -globals . to load global variables in module namespace [Octave] Comment declaration of unimplemented function swig_register_director [Octave] Fix OCTAVE_PATH in octave Makefiles [Octave] Add support for std::list - fix li_std_containers_int test [Octave] Fix imports test 2012-02-16: wsfulton [Java] Make generated support functions in arrays_java.i static so that generated code from multiple instances of SWIG can be compiled and linked together - problem reported by Evan Krause. 2012-01-24: wsfulton Fix crash with bad regex - bug #3474250. 2012-01-24: wsfulton [Python] Add Python stepped slicing support to the STL wrappers (std::vector, std::list). Assigning to a slice, reading a slice and deleting a slice with steps now work. For example: %template(vector_i) std::vector vi = vector_i(range(10)) print list(vi) vi[1:4:2] = [111, 333] print list(vi) del vi[3:10:3] print list(vi) print list(vi[::-1]) gives (same behaviour as native Python sequences such as list): [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 111, 2, 333, 4, 5, 6, 7, 8, 9] [0, 111, 2, 4, 5, 7, 8] [8, 7, 5, 4, 2, 111, 0] 2012-01-23: klickverbot [D] Correctly annotate function pointers with C linkage. [D] Exception and Error have become blessed names; removed d_exception_name test case. 2012-01-20: wsfulton [Python] Fix some indexing bugs in Python STL wrappers when the index is negative, eg: %template(vector_i) std::vector iv=vector_i([0,1,2,3,4,5]) iv[-7:] now returns [0, 1, 2, 3, 4, 5] instead of [5]. vv[7:9] = [22,33] now returns [0, 1, 2, 3, 4, 5, 22, 33] instead of "index out range" error. Also fix some segfaults when replacing ranges, eg when il is a std::list wrapper: il[0:2] = [11] 2012-01-17: wsfulton [Go] Fix forward class declaration within a class when used as a base. 2012-01-07: wsfulton [C#] Add support for %nspace when using directors. 2012-01-06: wsfulton [Java] Patch #3452560 from Brant Kyser - add support for %nspace when using directors. 2011-12-21: wsfulton The 'directorin' typemap now accepts $1, $2 etc expansions instead of having to use workarounds - $1_name, $2_name etc. 2011-12-20: wsfulton [Java] Add (char *STRING, size_t LENGTH) director typemaps. 2011-12-20: wsfulton [C#, Go, Java, D] Add support for the 'directorargout' typemap. 2011-12-20: wsfulton [Ocaml, Octave, PHP, Python, Ruby] Correct special variables in 'directorargout' typemap. This change will break any 'directorargout' typemaps you may have written. Please change: $result to $1 $input to $result Also fix the named 'directorargout' DIRECTOROUT typemaps for these languages which didn't previously compile and add in $1, $2 etc expansion. *** POTENTIAL INCOMPATIBILITY *** 2011-12-10: talby [perl5] SWIG_error() now gets decorated with perl source file/line number. [perl5] error handling now conforms to public XS api (fixes perl v5.14 issue). 2011-12-10: wsfulton [Android/Java] Fix directors to compile on Android. Added documentation and examples for Android. 2011-12-08: vadz Bug fix: Handle methods renamed or ignored in the base class correctly in the derived classes (they could be sometimes mysteriously not renamed or ignored there before). 2011-12-03: klickverbot [D] Fix exception glue code for newer DMD 2 versions. [D] Do not default to 32 bit glue code for DMD anymore. [D] Use stdc.config.c_long/c_ulong to represent C long types. 2011-12-01: szager [python] Fixed bug 3447426: memory leak in vector.__getitem__. 2011-11-30: wsfulton [R] Remove C++ comments from generated C code. 2011-11-27: olly [Python] Fix some warnings when compiling generated wrappers with certain GCC warning options (Debian bug #650246). 2011-11-28: wsfulton Fix #3433541 %typemap(in, numinputs=0) with 10+ arguments. 2011-11-28: olly [Perl] Fix warnings when compiling generated wrappers with certain GCC warning options (Debian bug #436711). 2011-11-28: olly [PHP] Update keyword list to include keywords added in PHP releases up to 5.3. 2011-11-25: wsfulton [C#] Provide an easy way to override the default visibility for the proxy class pointer constructors and getCPtr() method. The visibility is 'internal' by default and if multiple SWIG modules are being used and compiled into different assemblies, then they need to be 'public' in order to use the constructor or getCPtr() method from a different assembly. Use the following macros to change the visibilities in the proxy and type wrapper class: SWIG_CSBODY_PROXY(public, public, SWIGTYPE) SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE) [Java] Provide an easy way to override the default visibility for the proxy class pointer constructors and getCPtr() method. The visibility is 'protected' by default and if multiple SWIG modules are being used and compiled into different packages, then they need to be 'public' in order to use the constructor or getCPtr() method from a different package. Use the following macros to change the visibilities in the proxy and type wrapper class: SWIG_JAVABODY_PROXY(public, public, SWIGTYPE) SWIG_JAVABODY_TYPEWRAPPER(public, public, public, SWIGTYPE) The default for Java has changed from public to protected for the proxy classes. Use the SWIG_JAVABODY_PROXY macro above to restore to the previous visibilities. *** POTENTIAL INCOMPATIBILITY *** 2011-11-22: szager [python] Bug 3440044: #ifdef out SWIG_Python_NonDynamicSetAttr if -builtin isn't being used, to avoid unnecessary binary incompatibilities between python installations. 2011-11-17: wsfulton Bug fix: Remove root directory from directory search list in Windows. 2011-11-13: wsfulton [Ruby] Apply patch #3421876 from Robin Stocker to fix #3416818 - same class name in different namespaces confusion when using multiple modules. 2011-11-11: wsfulton Fix pcre-build.sh to work with non-compressed tarballs - problem reported by Adrian Blakely. 2011-11-03: wsfulton Expand special variables in typemap warnings, eg: %typemap(in, warning="1000:Test warning for 'in' typemap for $1_type $1_name") int "..." 2011-11-01: wsfulton Fix named output typemaps not being used when the symbol uses a qualifier and contains a number, eg: %typemap(out) double ABC::m1 "..." 2011-10-24: talby [perl5] SF bug #3423119 - overload dispatch stack corruption fix. Better, but more research is needed on a stable path for tail calls in XS. Also, fix for large long longs in 32 bit perl. 2011-10-13: xavier98 [octave] Allow Octave modules to be re-loaded after a "clear all". 2011-09-19: wsfulton Fix regression introduced in swig-2.0.1 reported by Teemu Ikonone leading to uncompilable code when using typedef and function pointer references, for example: typedef int FN(const int &a, int b); void *typedef_call1(FN *& precallback, FN * postcallback); 2011-09-14: wsfulton [Lua] Patch #3408012 from Raman Gopalan - add support for embedded Lua (eLua) including options for targeting Lua Tiny RAM (LTR). 2011-09-14: wsfulton [C#] Add boost_intrusive_ptr.i library contribution from patch #3401571. 2011-09-13: wsfulton Add warnings for badly named destructors, eg: struct KStruct { ~NOT_KStruct() {} }; cpp_extend_destructors.i:92: Warning 521: Illegal destructor name ~NOT_KStruct. Ignored. 2011-09-13: wsfulton Fix %extend and destructors for templates. The destructor in %extend was not always wrapped, for example: %extend FooT { ~FooT() { delete $self; } // was not wrapped as expected }; template class FooT {}; %template(FooTi) FooT; 2011-09-13: wsfulton Fix special variables such as "$decl" and "$fulldecl" in destructors to include the ~ character. 2011-09-10: talby [perl5] SF bug #1481958 - Improve range checking for integer types. Enhance li_typemaps_runme.pl 2011-09-08: wsfulton Fix %extend on typedef classes in a namespace using the typedef name, for example: namespace Space { %extend CStruct { ... } typedef struct tagCStruct { ... } CStruct; } 2011-08-31: xavier98 [octave] patches from Karl Wette: improvements to module loading behavior; added example of friend operator to operator example; fixed octave panic/crash in 3.0.5; documentation improvements 2011-08-30: szager [python] Bug 3400486, fix error signalling for built-in constructors. 2011-08-26: wsfulton [Go] Fix file/line number display for "gotype" when using typemap debugging options -tmsearch and -tmused. 2011-08-26: wsfulton [C#, D] Fix %callback which was generating uncompilable code. 2011-08-25: wsfulton Fix constructors in named typedef class declarations as reported by Gregory Bronner: typedef struct A { A(){} // Constructor which was not accepted by SWIG B(){} // NOT a constructor --illegal, but was accepted by SWIG } B; For C code, the fix now results in the use of 'struct A *' instead of just 'B *' in the generated code when wrapping members in A, but ultimately this does not matter, as they are the same thing. 2011-08-23: wsfulton Fix %newobject when used in conjunction with %feature("ref") as reported by Jan Becker. The code from the "ref" feature was not always being generated for the function specified by %newobject. Documentation for "ref" and "unref" moved from Python to the C++ chapter. 2011-08-22: szager [python] Fixed memory leak with --builtin option (bug 3385089). 2011-08-22: wsfulton [Lua] SF patch #3394339 from Torsten Landschoff - new option -nomoduleglobal to disable installing the module table into the global namespace. Require call also returns the module table instead of a string. 2011-08-09: xavier98 Fix bug 3387394; Octave patches for 3.4.0 compatibility, etc. (from Karl Wette) 2011-08-04: wsfulton Add in $symname expansion for director methods. 2011-07-29: olly [PHP] Don't generate "return $r;" in cases where $r hasn't been set. This was basically harmless, except it generated a PHP E_NOTICE if the calling code had enabled them. 2011-07-26: wsfulton Fix scoping of forward class declarations nested within a class (for C++). Previously the symbol was incorrectly put into the outer namespace, eg namespace std { template struct map { class iterator; }; } iterator was scoped as std::iterator, but now it is correctly std::map::iterator; Also fixed is %template and template parameters that are a typedef when the template contains default template parameters, eg: namespace Std { template struct Map { typedef Key key_type; typedef T mapped_type; }; } typedef double DOUBLE; %template(MM) Std::Map; All symbols within Map will be resolved correctly, eg key_type and mapped_type no matter if the wrapped code uses Std::Map or std::Map or Std::Map Also fixes bug #3378145 - regression introduced in 2.0.4 - %template using traits. 2011-07-20 szager [python] Fix closure for tp_call slot. 2011-07-16: wsfulton [python] Fix director typemap using PyObject *. 2011-07-13: szager [python] SF patch #3365908 - Add all template parameters to map support code in std_map.i 2011-07-13: szager [python] Fix for bug 3324753: %rename member variables with -builtin. 2011-07-01: wsfulton Fix some scope and symbol lookup problems when template default parameters are being used with typedef. For example: template struct Foo { typedef XX X; typedef TT T; }; template struct UsesFoo { void x(typename Foo::T, typename Foo::X); }; Also fixes use of std::vector::size_type for Python as reported by Aubrey Barnard. 2011-06-23: olly [PHP] Fix director code to work when PHP is built with ZTS enabled, which is the standard configuration on Microsoft Windows. 2011-06-21: mutandiz [allegrocl] - various small tweaks and bug fixes. - Avoid name conflicts between smart pointer wrappers and the wrappers for the actual class. - Fix default typemaps for C bindings, which were incorrectly attempting to call non-existent destructors on user-defined types. - New feature, feature:aclmixins, for adding superclass to the foreign class wrappers. - Improve longlong typemaps. 2011-06-19: wsfulton Fix incorrect typemaps being used for a symbol within a templated type, eg: A::value_type would incorrectly use a typemap for type A. 2011-06-18: olly [Tcl] Fix variable declarations in middle of blocks which isn't permitted in C90 (issue probably introduced in 2.0.3 by patch #3224663). Reported by Paul Obermeier in SF#3288586. 2011-06-17: wsfulton [Java] SF #3312505 - slightly easier to wrap char[] or char[ANY] with a Java byte[] using arrays_java.i. 2011-06-13: wsfulton [Ruby, Octave] SF #3310528 Autodoc fixes similar to those described below for Python. 2011-06-10: wsfulton [Python] Few subtle bugfixes in autodoc documentation generation, - Unnamed argument names fix for autodoc levels > 0. - Display of template types fixed for autodoc levels > 1. - Fix SF #3310528 - display of typedef structs for autodoc levels > 1. - Add missing type for self for autodoc levels 1 and 3. - autodoc levels 2 and 3 documented. - Minor tweaks to autodoc style to conform with PEP8. 2011-05-30: olly [PHP] Fix handling of directors when -prefix is used. 2011-05-24: olly [PHP] Fix handling of methods of classes with a virtual base class (SF#3124665). Version 2.0.4 (21 May 2011) =========================== 2011-05-19: wsfulton [Guile] Patch #3191625 fixing overloading of integer types. 2011-05-19: wsfulton [Perl] Patch #3260265 fixing overloading of non-primitive types and integers in Perl 5.12 and later. 2011-05-19: wsfulton [Ruby] Fix %import where one of the imported files %include one of the STL include files such as std_vector.i. 2011-05-17: wsfulton [Java] Apply #3289851 from Alan Harder to fix memory leak in directors when checking for pending exceptions. 2011-05-17: wsfulton [Tcl] Apply #3300072 from Christian Delbaere to fix multiple module loading not always sharing variables across modules. 2011-05-16: xavier98 [octave] Fix an incompatibility with never versions of Octave. Case on Octave API >= 40 to handle rename of Octave_map to octave_map. [octave] Add support for y.__rop__(x) operators when x.__op__(y) doesn't exist. [octave] Allow global operators to be defined by SWIG-wrapped functions. [octave] Fix several bugs around module namespaces; add -global, -noglobal, -globals command line options to the module. 2011-05-14: wsfulton %varargs when used with a numeric argument used to create an additional argument which was intended to provide a guaranteed sentinel value. This never worked and now the additional argument is not generated. 2011-05-13: wsfulton [python] Additional fixes for python3.2 support. 2011-05-07: szager [python] Fixed PyGetSetDescr for python3.2. 2011-05-05: wsfulton [Lua, Python, Tcl] C/C++ prototypes shown in error message when calling an overloaded method with incorrect arguments improved to show always show fully qualified name and if a const method. Also fixed other Lua error messages in generated code which weren't consistently using the fully qualified C++ name - requested by Gedalia Pasternak. 2011-04-29: szager Bug 2635919: Convenience method to convert std::map to a python dict. 2011-04-29: szager [Python] Fixed bug 2811549: return non-const iterators from STL methods begin(), end(), rbegin(), rend(). 2011-04-25: szager [Python] Fixed bug 1498929: Access to member fields in map elements 2011-04-23: klickverbot [D] nspace: Correctly generate identifiers for base classes when not in split proxy mode. 2011-04-13: szager Fixed bug 3286333: infinite recursion with mutual 'using namespace' clauses. 2011-04-12: szager Fixed bug 1163440: vararg typemaps. 2011-04-12: szager Fixed bug #3285386: parse error from 'operator T*&()'. Added operator_pointer_ref test case to demonstrate. 2011-04-11: szager [Python] Fixed PyVarObject_HEAD_INIT to eliminate VC++ compiler errors about static initialization of struct members with pointers. 2011-04-11: wsfulton [Tcl] Apply patch #3284326 from Colin McDonald to fix some compiler warnings. 2011-04-11: szager [Python] Fixed PyVarObject_HEAD_INIT to eliminate VC++ compiler errors about static initialization of struct members with pointers. 2011-04-10: klickverbot [D] Fixed wrapping of enums that are type char, for example: enum { X = 'X'; } (this was already in 2.0.3 for C# and Java) 2011-04-10: klickverbot [D] nspace: Fixed referencing types in the root namespace when not in split proxy mode. 2011-04-09: szager [Python] Applied patch #1932484: migrate PyCObject to PyCapsule. 2011-04-09: szager [Python] Added preprocessor guards for python functions PyUnicode_AsWideChar and PySlice_GetIndices, which changed signatures in python3.2. 2011-04-07: wsfulton Fix wrapping of const array typedefs which were generating uncompilable code as reported by Karl Wette. 2011-04-03: szager [Python] Fixed the behavior of %pythonnondynamic to conform to the spec in Lib/pyuserdir.swg. 2011-04-03: szager [Python] Merged in the szager-python-builtin branch, adding the -builtin feature for python. The -builtin option may provide a significant performance gain in python wrappers. For full details and limitations, refer to Doc/Manual/Python.html. A small test suite designed to demonstrate the performance gain is in Examples/python/performance. 2011-04-01: wsfulton Add in missing wrappers for friend functions for some target languages, mostly the non-scripting languages like Java and C#. Version 2.0.3 (29 March 2011) ============================= 2011-03-29: wsfulton [R] Apply patch #3239076 from Marie White fixing strings for R >= 2.7.0 2011-03-29: wsfulton [Tcl] Apply patch #3248280 from Christian Delbaere which adds better error messages when the incorrect number or type of arguments are passed to overloaded methods. 2011-03-29: wsfulton [Tcl] Apply patch #3224663 from Christian Delbaere. 1. Fix when function returns a NULL value, a "NULL" command will be created in the Tcl interpreter and calling this command will cause a segmentation fault. 2. Previous implementation searches for class methods using a linear search causing performance issues in wrappers for classes with many member functions. The patch adds a method hash table to classes and changes method name lookup to use the hash table instead of doing a linear search. 2011-03-26: wsfulton [C#, Java] SF bug #3195112 - fix wrapping of enums that are type char, for example: enum { X = 'X'; } 2011-03-21: vadz Allow setting PCRE_CFLAGS and PCRE_LIBS during configuration to override the values returned by pcre-config, e.g. to allow using a static version of PCRE library. 2011-03-17: wsfulton [UTL] Add missing headers in generated STL wrappers to fix compilation with gcc-4.6. 2011-03-17: wsfulton Fix regression introduced in swig-2.0.2 where filenames with spaces were not found when used with %include and %import. Reported by Shane Liesegang. 2011-03-15: wsfulton [UTL] Fix overloading when using const char[], problem reported by David Maxwell. Similarly for char[ANY] and const char[ANY]. 2011-03-15: wsfulton [C#] Apply patch #3212624 fixing std::map Keys property. 2011-03-14: olly [PHP] Fix handling of overloaded methods/functions where some return void and others don't - whether this worked or not depended on the order they were encountered in (SF#3208299). 2011-03-13: klickverbot [D] Extended support for C++ namespaces (nspace feature). 2011-03-12: olly [PHP] Fix sharing of type information between multiple SWIG-wrapped modules (SF#3202463). 2011-03-09: wsfulton [Python] Fix SF #3194294 - corner case bug when 'NULL' is used as the default value for a primitive type parameter in a method declaration. 2011-03-07: olly [PHP] Don't use zend_error_noreturn() for cases where the function returns void - now this issue can only matter if you have a function or method which is directed and returns non-void. 2011-03-06: olly [PHP] Add casts to the typemaps for long long and unsigned long long to avoid issues when they are used with shorter types via %apply. 2011-03-02: wsfulton Templated smart pointers overloaded with both const and non const operator-> generated uncompilable code when the pointee was a class with either public member variables or static methods. Regression in 2.0.x reported as working in 1.3.40 by xantares on swig-user mailing list. Version 2.0.2 (20 February 2011) ================================ 2011-02-19: wsfulton [PHP] Add missing INPUT, OUTPUT and INOUT typemaps in the typemaps.i library for primitive reference types as well as signed char * and bool *. 2011-02-19: olly [PHP] Address bug in PHP on some platforms/architectures which results in zend_error_noreturn() not being available using SWIG_ZEND_ERROR_NORETURN which defaults to zend_error_noreturn but can be overridden when building the module by passing -DSWIG_ZEND_ERROR_NORETURN=zend_error to the compiler. This may result in compiler warnings, but should at least allow a module to be built on those platforms/architectures (SF#3166423). 2011-02-18: wsfulton Fix #3184549 - vararg functions and function overloading when using the -fastdispatch option. 2011-02-18: olly [PHP] An overloaded method which can return an object or a primitive type no longer causes SWIG to segfault. Reported by Paul Colby in SF#3168531. 2011-02-18: olly [PHP] Fix invalid erase during iteration of std::map in generated director code. Reported by Cory Bennett in SF#3175820. 2011-02-17: wsfulton Preprocessing now warns if extra tokens appear after #else and #end. 2011-02-16: wsfulton Fix #1653092 Preprocessor does not error out when #elif is missing an expression. This and other cases of missing preprocessor expressions now result in an error. 2011-02-14: wsfulton [Ocaml] Apply patch #3151788 from Joel Reymont. Brings Ocaml support up to date (ver 3.11 and 3.12), including std::string. 2011-02-13: wsfulton [Ruby] Apply patch #3176274 from James Masters - typecheck typemap for time_t. 2011-02-13: wsfulton Apply patch #3171793 from szager - protected director methods failing when -fvirtual is used. 2011-02-13: wsfulton Fix #1927852 - #include directives don't preprocess the file passed to it. The fix is for #include with -importall or -includeall, %include and %import, for example: #define FILENAME "abc.h" %include FILENAME 2011-02-12: wsfulton Fix #1940536, overactive preprocessor which was expanding defined(...) outside of #if and #elif preprocessor directives. 2011-02-05: wsfulton [MzScheme] SF #2942899 Add user supplied documentation to help getting started with MzScheme. Update chapter name to MzScheme/Racket accounting for the rename of MzScheme to Racket. 2011-02-05: wsfulton [C#] SF #3085906 - Possible fix running test-suite on Mac OS X. 2011-02-05: wsfulton SF #3173367 Better information during configure about Boost prerequisite for running the test-suite. 2011-02-05: wsfulton SF #3127633 Fix infinite loop in recursive typedef resolution. 2011-02-04: wsfulton [R] SF #3168676 Fix %rename not working for member variables and methods. 2011-02-04: wsfulton [clisp] SF #3148200 Fix segfault parsing nested unions. 2011-02-01: wsfulton [C#] Directors - a call to a method being defined in the base class, not overridden in a subclass, but again overridden in a class derived from the first subclass was not being dispatched correctly to the most derived class. See director_alternating.i for an example. 2011-02-01: wsfulton [C#, Java] Any 'using' statements in the protected section of a class were previously ignored with director protected (dirprot) mode. 2011-01-30: wsfulton Fix overloading with const pointer reference (SWIGTYPE *const&) parameters for a number of scripting languages. 2011-01-17: wsfulton New warning for smart pointers if only some of the classes in the inheritance chain are marked as smart pointer, eg, %shared_ptr should be used for all classes in an inheritance hierarchy, so this new warning highlights code where this is not the case. example.i:12: Warning 520: Base class 'A' of 'B' is not similarly marked as a smart pointer. example.i:16: Warning 520: Derived class 'C' of 'B' is not similarly marked as a smart pointer. 2011-01-14: wsfulton Added some missing multi-argument typemaps: (char *STRING, size_t LENGTH) and (char *STRING, int LENGTH). Documentation for this updated. Java patch from Volker Grabsch. 2011-01-11: iant Require Go version 7077 or later. 2010-12-30: klickverbot [C#, D, Java] Check for collision of parameter names with target language keywords when generating the director glue code. The situation in which the generated could would previously be invalid is illustrated in the new 'director_keywords' test case. 2010-12-23: wsfulton [C#] Fix $csinput special variable not being expanded for csvarin typemaps when used for global variables. Reported by Vadim Zeitlin. 2010-12-14: wsfulton Fix $basemangle expansion in array typemaps. For example if type is int *[3], $basemangle expands to _p_int. 2010-12-07: iant Check that we are using a sufficiently new version of the 6g or 8g Go compiler during configure time. If not, disable Go. Minimum version is now 6707. *** POTENTIAL INCOMPATIBILITY *** 2010-12-06: wsfulton Fix #3127394 - use of network paths on Windows/MSys. 2010-11-18: klickverbot [D] Added the D language module. 2010-11-12: vadz Fix handling of multiple regex-using %renames attached to the same declaration. For example, now %rename("%(regex:/^Set(.*)/put\\1/)s") ""; %rename("%(regex:/^Get(.*)/get\\1/)s") ""; works as expected whereas before only the last anonymous rename was taken into account. 2010-10-17: drjoe [R] Fix failure in overloaded functions which was breaking QuantLib-SWIG 2010-10-14: olly [PHP] Allow compilation on non-conforming Microsoft C++ compilers which don't accept: return function_returning_void(); Reported by Frank Vanden Berghen on the SWIG mailing list. 2010-10-12: wsfulton Fix unary scope operator (::) (global scope) regression introduced in 2.0.0, reported by Ben Walker. The mangled symbol names were incorrect, sometimes resulting in types being incorrectly treated as opaque types. Also fixes #2958781 and some other type problems due to better typedef resolution, eg std::vector::value_type didn't resolve to T * when it should have. The mangled type was incorrectly SWIGTYPE_std__vectorT_Test_p_std__allocatorT_Test_p_t_t__value_type and now it is correctly SWIGTYPE_p_Test. Version 2.0.1 (4 October 2010) ============================== 2010-10-03: wsfulton Apply patch #3066958 from Mikael Johansson to fix default smart pointer handling when the smart pointer contains both a const and non-const operator->. 2010-10-01: wsfulton Add -pcreversion option to display PCRE version information. 2010-10-01: olly [Ruby] Avoid segfault when a method node has no parentNode (SF#3034054). 2010-10-01: olly [Python] Allow reinitialisation to work with an embedded Python interpreter (patch from Jim Carroll in SF#3075178). 2010-09-28: wsfulton [C#] Apply patch from Tomas Dirvanauskas for std::map wrappers to avoid throwing exceptions with normal usage of iterators. 2010-09-27: olly [Python] Improve error message given when a parameter of the wrong type is passed to an overloaded method (SF#3027355). 2010-09-25: wsfulton Apply SF patch #3075150 - Java directors using static variables in named namespace. 2010-09-24: wsfulton More file and line error/warning reporting fixes where SWIG macros are used within {} braces (where the preprocessor expands macros), for example macros within %inline {...} and %fragment(...) {...} and nested structs. 2010-09-18: wsfulton More file and line error/warning reporting fixes for various inherited class problems. 2010-09-15: wsfulton A much improved debugging of SWIG source experience is now available and documented in the "Debugging SWIG" section in the Doc/Devel/internals.html file, including a swig.dbg support file for the gdb debugger. 2010-09-11: wsfulton Fix incorrect line number reporting in errors/warnings when a macro definition ends with '/' and it is not the end of a C comment. 2010-09-11: wsfulton Fix incorrect line number reporting in errors/warnings after parsing macro invocations with parameters given over more than one line. 2010-09-10: wsfulton Remove extraneous extra line in preprocessed output after including files which would sometimes lead to error/warning messages two lines after the end of the file. 2010-09-10: wsfulton Fix #2149523 - Incorrect line number reporting in errors after parsing macros containing C++ comments. 2010-09-08: olly [PHP] Fix handling of OUTPUT typemaps (Patch from Ryan in SF#3058394). 2010-09-03: wsfulton Fix erroneous line numbers in error messages for macro expansions, for example, the error message now points to instantiation of the macro, ie the last line here: #define MACRO2(a, b) #define MACRO1(NAME) MACRO2(NAME,2,3) MACRO1(abc) 2010-09-02: wsfulton Fix line numbers in error and warning messages for preprocessor messages within %inline, for example: %inline %{ #define FOOBAR 1 #define FOOBAR "hi" %} 2010-09-02: wsfulton Fix line numbers in error and warning messages which were cumulatively one less than they should have been after parsing each %include/%import - bug introduced in swig-1.3.32. Also fix line numbers in error and warning messages when new line characters appear between the %include / %import statement and the filename. 2010-08-30: wsfulton Fix line number and file name reporting for some macro preprocessor warnings. The line number of the macro argument has been corrected and the line number of the start of the macro instead of one past the end of the macro is used. Some examples: file.h:11: Error: Illegal macro argument name '..' file.h:19: Error: Macro 'DUPLICATE' redefined, file.h:15: Error: previous definition of 'DUPLICATE'. file.h:25: Error: Variable-length macro argument must be last parameter file.h:32: Error: Illegal character in macro argument name file.i:37: Error: Macro 'SIT' expects 2 arguments 2010-08-26: wsfulton Fix __LINE__ and __FILE__ expansion reported by Camille Gillot. Mostly this did not work at all. Also fixes SF #2822822. 2010-08-17: wsfulton [Perl] Fix corner case marshalling of doubles - errno was not being correctly set before calling strtod - patch from Justin Vallon - SF Bug #3038936. 2010-08-17: wsfulton Fix make distclean when some of the more obscure languages are detected by configure - fixes from Torsten Landschoff. 2010-07-28: wsfulton Restore configuring out of source for the test-suite since it broke in 1.3.37. As previously, if running 'make check-test-suite' out of source, it needs to be done by invoking configure with a relative path. Invoking configure with an absolute path will not work. Running the full 'make check' still needs to be done in the source tree. 2010-07-16: wsfulton Fix wrapping of function pointers and member function pointers when the function returns by reference. 2010-07-13: vadz Removed support for the old experimental "rxspencer" encoder and "[not]rxsmatch" in %rename (see the 01/16/2006 entry). The new and officially supported "regex" encoder and "[not]regexmatch" checks should be used instead (see the two previous entries). Please replace "%(rxspencer:[pat][subst])s" with "%(regex:/pat/subst/)s" when upgrading. Notice that you will also need to replace the back- references of form "@1" with the more standard "\\1" and may need to adjust your regular expressions syntax as the new regex encoder uses Perl-compatible syntax and not (extended) POSIX syntax as the old one. *** POTENTIAL INCOMPATIBILITY *** 2010-07-13: vadz Add "regexmatch", "regextarget" and "notregexmatch" which can be used to apply %rename directives to the declarations matching the specified regular expression only. The first two can be used interchangeably, both of the %renames below do the same thing: %rename("$ignore", regexmatch$name="Old$") ""; %rename("$ignore", regextarget=1) "Old$"; (namely ignore the declarations having "Old" suffix). "notregexmatch" restricts the match to only the declarations which do not match the regular expression, e.g. here is how to rename to lower case versions all declarations except those consisting from capital letters only: %rename("$(lowercase)s", notregexmatch$name="^[A-Z]+$") ""; 2010-07-13: vadz Add the new "regex" encoder that can be used in %rename, e.g. %rename("regex:/(\\w+)_(.*)/\\2/") ""; to remove any alphabetical prefix from all identifiers. The syntax of the regular expressions is Perl-like and PCRE library (http://www.pcre.org/) is used to implement this feature but notice that backslashes need to be escaped as usual inside C strings. Original patch from Torsten Landschoff. 2010-07-08: wsfulton Fix #3024875 - shared_ptr of classes with non-public destructors. This also fixes the "unref" feature when used on classes with non-public destructors. 2010-06-17: ianlancetaylor [Go] Add the Go language module. 2010-06-10: wsfulton [Lua] Fix SWIG_lua_isnilstring multiply defined when using multiple modules and wrapping strings. Patch from 'Number Cruncher'. 2010-06-10: olly [PHP] Fix directors to correctly call a method with has a different name in PHP to C++ (we were always using the C++ name in this case). 2010-06-03: wsfulton Fix uncompilable code when %rename results in two enum items with the same name. Reported by Vadim Zeitlin. Version 2.0.0 (2 June 2010) =========================== 2010-06-02: wsfulton [C#] Fix SWIG_STD_VECTOR_ENHANCED macro used in std::vector to work with types containing commas, for example: SWIG_STD_VECTOR_ENHANCED(std::pair< double, std::string >) 2010-06-01: wsfulton Add in std_shared_ptr.i for wrapping std::shared_ptr. Requires the %shared_ptr macro like in the boost_shared_ptr.i library. std::tr1::shared_ptr can also be wrapped if the following macro is defined: #define SWIG_SHARED_PTR_SUBNAMESPACE tr1 %include shared_ptr is also documented in Library.html now. 2010-05-27: wsfulton Add the ability for $typemap special variable macros to call other $typemap special variable macros, for example: %typemap(cstype) CC "CC" %typemap(cstype) BB "$typemap(cstype, CC)" %typemap(cstype) AA "$typemap(cstype, BB)" void hah(AA aa); This also fixes C# std::vector containers of shared_ptr and %shared_ptr. Also added diagnostics for $typemap with -debug-tmsearch, for example, the above displays additional diagnostic lines starting "Containing: ": example.i:34: Searching for a suitable 'cstype' typemap for: AA aa Looking for: AA aa Looking for: AA Using: %typemap(cstype) AA Containing: $typemap(cstype, BB) example.i:31: Searching for a suitable 'cstype' typemap for: BB Looking for: BB Using: %typemap(cstype) BB Containing: $typemap(cstype, CC) example.i:29: Searching for a suitable 'cstype' typemap for: CC Looking for: CC Using: %typemap(cstype) CC 2010-05-26: olly Fix %attribute2ref not to produce a syntax error if the last argument (AccessorMethod) is omitted. Patch from David Piepgras in SF#2235756. 2010-05-26: olly [PHP] When using %throws or %catches, SWIG-generated PHP5 wrappers now throw PHP Exception objects instead of giving a PHP error of type E_ERROR. This change shouldn't cause incompatibility issues, since you can't set an error handler for E_ERROR, so previously PHP would just exit which also happens for unhandled exceptions. The benefit is you can now catch them if you want to. Fixes SF#2545578 and SF#2955522. 2010-05-25: olly [PHP] Add missing directorin typemap for const std::string &. Fixes SF#3006404 reported by t-Legiaw. 2010-05-23: wsfulton [C#] Fix #2957375 - SWIGStringHelper and SWIGExceptionHelper not always being initialized before use in .NET 4 as the classes were not marked beforefieldinit. A static constructor has been added to the intermediary class like this: %pragma(csharp) imclasscode=%{ static $imclassname() { } %} If you had added your own custom static constructor to the intermediary class in the same way as above, you will have to modify your approach to use static variable initialization or define SWIG_CSHARP_NO_IMCLASS_STATIC_CONSTRUCTOR - See csharphead.swg. *** POTENTIAL INCOMPATIBILITY *** 2010-05-23: wsfulton Fix #2408232. Improve shared_ptr and intrusive_ptr wrappers for classes in an inheritance hierarchy. No special treatment is needed for derived classes. The proxy class also no longer needs to be specified, it is automatically deduced. The following macros are deprecated: SWIG_SHARED_PTR(PROXYCLASS, TYPE) SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) and have been replaced by %shared_ptr(TYPE) Similarly for intrusive_ptr wrappers, the following macro is deprecated: SWIG_INTRUSIVE_PTR(PROXYCLASS, TYPE) SWIG_INTRUSIVE_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) and have been replaced by %intrusive_ptr(TYPE) 2010-05-21: olly [PHP] Stop generating a bogus line of code in certain constructors. This was mostly harmless, but caused a PHP notice to be issued, if enabled (SF#2985684). 2010-05-18: wsfulton [Java] Fix member pointers on 64 bit platforms. 2010-05-14: wsfulton Fix wrapping of C++ enum boolean values reported by Torsten Landschoff: typedef enum { PLAY = true, STOP = false } play_state; 2010-05-14: olly [PHP] Fix wrapping of global variables which was producing uncompilable code in some cases. 2010-05-12: drjoe [R] Add two more changes from Wil Nolan. Get garbage collection to work. Implement newfree 2010-05-09: drjoe Fix bug reported by Wil Nolan change creation of string so that R 2.7.0+ can use char hashes 2010-05-07: wsfulton Apply patch #2955146 from Sergey Satskiy to fix expressions containing divide by operator in constructor initialization lists. 2010-05-05: wsfulton [R] Memory leak fix handling const std::string & inputs, reported by Will Nolan. 2010-05-01: wsfulton Typemap matching enhancement for non-default typemaps. Previously all qualifiers were stripped in one step, now they are stripped one at a time starting with the left most qualifier. For example, int const*const is first stripped to int *const then int *. *** POTENTIAL INCOMPATIBILITY *** 2010-04-25: bhy [Python] Fix #2985655 - broken constructor renaming. 2010-04-14: wsfulton Typemap fragments are now official and documented in Typemaps.html. 2010-04-09: wsfulton [Ruby] Fix #2048064 and #2408020. Apply Ubuntu patch to fix Ruby and std::vector wrappers with -minherit. https://bugs.launchpad.net/ubuntu/+source/swig1.3/+bug/522874 2010-04-09: wsfulton [Mzscheme] Apply Ubuntu patch to fix std::map wrappers: https://bugs.launchpad.net/ubuntu/+source/swig1.3/+bug/203876 2010-04-09: wsfulton [Python] Apply patch #2952374 - fix directors and the -nortti option. 2010-04-09: wsfulton [Lua] Fix #2887254 and #2946032 - SWIG_Lua_typename using wrong stack index. 2010-04-03: wsfulton [Python] Fix exceptions being thrown with the -threads option based on patch from Arto Vuori. Fixes bug #2818499. 2010-04-03: wsfulton Fix Makefile targets: distclean and maintainer-clean 2010-04-02: wsfulton [Lua] Fix char pointers, wchar_t pointers and char arrays so that nil can be passed as a valid value. Bug reported by Gedalia Pasternak. 2010-04-01: wsfulton Numerous subtle typemap matching rule fixes when using the default type. The typemap matching rules are to take a type and find the best default typemap (SWIGTYPE, SWIGTYPE* etc), then look for the next best match by reducing the chosen default type. The type deduction now follows C++ class template partial specialization matching rules. Below are the set of changes made showing the default type deduction along with the old reduced type and the new version of the reduced type: SWIGTYPE const &[ANY] new: SWIGTYPE const &[] old: SWIGTYPE (&)[ANY] SWIGTYPE *const [ANY] new: SWIGTYPE const [ANY] old: SWIGTYPE *[ANY] SWIGTYPE const *const [ANY] new: SWIGTYPE *const [ANY] old: SWIGTYPE const *[ANY] SWIGTYPE const *const & new: SWIGTYPE *const & old: SWIGTYPE const *& SWIGTYPE *const * new: SWIGTYPE const * old: SWIGTYPE ** SWIGTYPE *const & new: SWIGTYPE const & old: SWIGTYPE *& Additionally, a const SWIGTYPE lookup is used now for any constant type. Some examples, where T is some reduced type, eg int, struct Foo: T const new: SWIGTYPE const old: SWIGTYPE T *const new: SWIGTYPE *const old: SWIGTYPE * T const[] new: SWIGTYPE const[] old: SWIGTYPE[] enum T const new: enum SWIGTYPE const old: enum SWIGTYPE T (*const )[] new: SWIGTYPE (*const )[] old: SWIGTYPE (*)[] Reminder: the typemap matching rules can now be seen for any types being wrapped by using either the -debug-tmsearch or -debug-tmused options. In practice this leads to some subtle matching rule changes and the majority of users won't notice any changes, except in the prime area of motivation for this change: Improve STL containers of const pointers and passing const pointers by reference. This is fixed because many of the STL containers use a type 'T const&' as parameters and when T is a const pointer, for example, 'K const*', then the full type is 'K const*const&'. This means that the 'SWIGTYPE *const&' typemaps now match when T is either a non-const or const pointer. Furthermore, some target languages incorrectly had 'SWIGTYPE *&' typemaps when these should have been 'SWIGTYPE *const&'. These have been corrected (Java, C#, Lua, PHP). *** POTENTIAL INCOMPATIBILITY *** 2010-03-13: wsfulton [Java] Some very old deprecated pragma warnings are now errors. 2010-03-13: wsfulton Improve handling of file names and directories containing double/multiple path separators. 2010-03-10: mutandiz (Mikel Bancroft) [allegrocl] Use fully qualified symbol name of cl::identity in emit_defun(). 2010-03-06: wsfulton [Java] The intermediary JNI class modifiers are now public by default meaning these intermediary low level functions are now accessible by default from outside any package used. The proxy class pointer constructor and getCPtr() methods are also now public. These are needed in order for the nspace option to work without any other mods. The previous default of protected access can be restored using: SWIG_JAVABODY_METHODS(protected, protected, SWIGTYPE) %pragma(java) jniclassclassmodifiers = "class" 2010-03-06: wsfulton [C#] Added the nspace feature for C#. Documentation for the nspace feature is now available. 2010-03-04: wsfulton Added the nspace feature. This adds some improved namespace support. Currently only Java is supported for target languages, where C++ namespaces are automatically translated into Java packages. The feature only applies to classes,struct,unions and enums declared within a namespace. Methods and variables declared in namespaces still effectively have their namespaces flattened. Example usage: %feature(nspace) Outer::Inner1::Color; %feature(nspace) Outer::Inner2::Color; namespace Outer { namespace Inner1 { struct Color { ... }; } namespace Inner2 { struct Color { ... }; } } For Java, the -package option is also required when using the nspace feature. Say we use -package com.myco, the two classes can then be accessed as follows from Java: com.myco.Outer.Inner1.Color and com.myco.Outer.Inner2.Color. 2010-02-27: wsfulton [Python] Remove -dirvtable from the optimizations included by -O as it this option currently leads to memory leaks as reported by Johan Blake. 2010-02-27: wsfulton License code changes: SWIG Source is GPL-v3 and library code license is now clearer and is provided under a very permissive license. See http://www.swig.org/legal.html. 2010-02-13: wsfulton [Ruby] A few fixes for compiling under ruby-1.9.x including patch from 'Nibble'. 2010-02-13: wsfulton [Ruby] Apply patch from Patrick Bennett to fix RARRAY_LEN and RARRAY_PTR usage for Ruby 1.9.x used in various STL wrappers. 2010-02-13: wsfulton [C#, Java] Fix incorrect multiply defined symbol name error when an enum item and class name have the same name, as reported by Nathan Krieger. Example: class Vector {}; namespace Text { enum Preference { Vector }; } This also fixes other incorrect corner case target language symbol name clashes. 2010-02-11: wsfulton Add the -debug-lsymbols option for displaying the target language layer symbols. 2010-02-09: wsfulton Fix -MM and -MMD options on Windows. They were not omitting files in the SWIG library as they should be. 2010-02-08: wsfulton Fix #1807329 - When Makefile dependencies are being generated using the -M family of options on Windows, the file paths have been corrected to use single backslashes rather than double backslashes as path separators. 2010-02-06: wsfulton Fix #2918902 - language specific files not being generated in correct directory on Windows when using forward slashes for -o, for example: swig -python -c++ -o subdirectory/theinterface_wrap.cpp subdirectory/theinterface.i 2010-02-05: wsfulton Fix #2894405 - assertion when using -xmlout. 2010-01-28: wsfulton Fix typemap matching bug when a templated type has a typemap both specialized and not specialized. For example: template struct XX { ... }; %typemap(in) const XX & "..." %typemap(in) const XX< int > & "..." resulted in the 2nd typemap being applied for all T in XX< T >. 2010-01-22: wsfulton Fix #2933129 - typemaps not being found when the unary scope operator (::) is used to denote global scope, the typemap is now used in situations like this: struct X {}; %typemap(in) const X & "..." void m(const ::X &); and this: struct X {}; %typemap(in) const ::X & "..." void m(const X &); 2010-01-20: wsfulton Fix some unary scope operator (::) denoting global scope problems in the types generated into the C++ layer. Previously the unary scope operator was dropped in the generated code if the type had any sort of qualifier, for example when using pointers, references, like ::foo*, ::foo&, bar< ::foo* >. 2010-01-13: olly [PHP] Add datetime to the list of PHP predefined classes (patch from David Fletcher in SF#2931042). 2010-01-11: wsfulton Slight change to warning, error and diagnostic reporting. The warning number is no longer shown within brackets. This is to help default parsing of warning messages by other tools, vim on Unix in particular. Example original display using -Fstandard: example.i:20: Warning(401): Nothing known about base class 'B'. Ignored. New display: example.i:20: Warning 401: Nothing known about base class 'B'. Ignored. Also subtle fix to -Fmicrosoft format adding in missing space. Example original display: example.i(20): Warning(401): Nothing known about base class 'Base'. Ignored. New display: example.i(20) : Warning 401: Nothing known about base class 'Base'. Ignored. 2010-01-10: wsfulton Fix a few inconsistencies in reporting of file/line numberings including modifying the overload warnings 509, 512, 516, 474, 475 to now be two line warnings. 2010-01-10: wsfulton Modify -debug-tags output to use standard file name/line reporting so that editors can easily navigate to the appropriate lines. Was typically: . top . include . include (/usr/share/swig/temp/trunk/Lib/swig.swg:312) . top . include . include . include (/usr/share/swig/temp/trunk/Lib/swigwarnings.swg:39) now: /usr/share/swig/temp/trunk/Lib/swig.swg:312: . top . include . include /usr/share/swig/temp/trunk/Lib/swigwarnings.swg:39: . top . include . include . include 2010-01-03: wsfulton Fix missing file/line numbers for typemap warnings and in output from the -debug-tmsearch/-debug-tmused options. 2010-01-03: wsfulton Add typemaps used debugging option (-debug-tmused). When used each line displays the typemap used for each type for which code is being generated including the file and line number related to the type. This is effectively a condensed form of the -debug-tmsearch option. Documented in Typemaps.html. 2009-12-23: wsfulton Fix for %javaexception and directors so that all the appropriate throws clauses are generated. Problem reported by Peter Greenwood. 2009-12-20: wsfulton Add -debug-tmsearch option for debugging the typemap pattern matching rules. Documented in Typemaps.html. 2009-12-12: wsfulton [Octave] Remove the -api option and use the new OCTAVE_API_VERSION_NUMBER macro provided in the octave headers for determining the api version instead. 2009-12-04: olly [Ruby] Improve support for Ruby 1.9 under GCC. Addresses part of SF#2859614. 2009-12-04: olly Fix handling of modulo operator (%) in constant expressions (SF#2818562). 2009-12-04: olly [PHP] "empty" is a reserved word in PHP, so rename empty() method on STL classes to "is_empty()" (previously this was automatically renamed to "c_empty()"). *** POTENTIAL INCOMPATIBILITY *** 2009-12-03: olly [PHP] Add typemaps for long long and unsigned long long, and for pointer to method. 2009-12-02: olly [PHP] Fix warning and rename of reserved class name to be case insensitive. 2009-12-01: wsfulton Revert support for %extend and memberin typemaps added in swig-1.3.39. The memberin typemaps are ignored again for member variables within a %extend block. Documentation inconsistency reported by Torsten Landschoff. 2009-11-29: wsfulton [Java, C#] Fix generated quoting when using %javaconst(1)/%csconst(1) for static const char member variables. %javaconst(1) A; %csconst(1) A; struct X { static const char A = 'A'; }; 2009-11-26: wsfulton [Java, C#] Fix %javaconst(1)/%csconst(1) for static const member variables to use the actual constant value if it is specified, rather than the C++ code to access the member. %javaconst(1) EN; %csconst(1) EN; struct X { static const int EN = 2; }; 2009-11-23: wsfulton C++ nested typedef classes can now be handled too, for example: struct Outer { typedef Foo { } FooTypedef1, FooTypedef2; }; 2009-11-18: wsfulton The wrappers for C nested structs are now generated in the same order as declared in the parsed code. 2009-11-18: wsfulton Fix #491476 - multiple declarations of nested structs, for example: struct Outer { struct { int val; } inner1, inner2, *inner3, inner4[1]; } outer; 2009-11-17: wsfulton Fix parsing of enum declaration and initialization, for example: enum ABC { a, b, c } A = a, *pC = &C, array[3] = {a, b, c}; 2009-11-17: wsfulton Fix parsing of struct declaration and initialization, for example: struct S { int x; } instance = { 10 }; 2009-11-15: wsfulton Fix #1960977 - Syntax error parsing derived nested class declaration and member variable instance. 2009-11-14: wsfulton Fix #2310483 - function pointer typedef within extern "C" block. 2009-11-13: wsfulton Fix usage of nested template classes within templated classes so that compilable code is generated. 2009-11-13: olly [php] Fix place where class prefix (as specified with -prefix) wasn't being used. Patch from gverbruggen in SF#2892647. 2009-11-12: wsfulton Fix usage of nested template classes so that compilable code is generated - the nested template class is now treated like a normal nested classes, that is, as an opaque type unless the nestedworkaround feature is used. 2009-11-12: wsfulton Replace SWIGWARN_PARSE_NESTED_CLASS with SWIGWARN_PARSE_NAMED_NESTED_CLASS and SWIGWARN_PARSE_UNNAMED_NESTED_CLASS for named and unnamed nested classes respectively. Named nested class ignored warnings can now be suppressed by name using %warnfilter, eg: %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) Outer::Inner; but clearly unnamed nested classes cannot and the global suppression is still required, eg: #pragma SWIG nowarn=SWIGWARN_PARSE_UNNAMED_NESTED_CLASS 2009-11-11: wsfulton Added the nestedworkaround feature as a way to use the full functionality of a nested class (C++ mode only). It removes the nested class from SWIG's type information so it is as if SWIG had never parsed the nested class. The documented nested class workarounds using a global fake class stopped working when SWIG treated the nested class as an opaque pointer, and this feature reverts this behaviour. The documentation has been updated with details of how to use and implement it, see the "Nested classes" section in SWIGPlus.html. 2009-11-11: wsfulton There were a number of C++ cases where nested classes/structs/unions were being handled as if C code was being parsed which would oftentimes lead to uncompilable code as an attempt was made to wrap the nested structs like it is documented for C code. Now all nested structs/classes/unions are ignored in C++ mode, as was always documented. However, there is an improvement as usage of nested structs/classes/unions is now always treated as an opaque type by default, resulting in generated code that should always compile. *** POTENTIAL INCOMPATIBILITY *** 2009-11-09: drjoe Fix R for -fcompact and add std_map.i 2009-11-08: wsfulton Fix inconsistency for nested structs/unions/classes. Uncompilable code was being generated when inner struct and union declarations were used as types within the inner struct. The inner struct/union is now treated as a forward declaration making the behaviour the same as an inner class. (C++ code), eg: struct Outer { struct InnerStruct { int x; }; InnerStruct* getInnerStruct(); }; 2009-11-08: wsfulton Ignored nested class/struct warnings now display the name of the ignored class/struct. 2009-11-07: wsfulton Bug #1514681 - Fix nested template classes within a namespace generated uncompilable code and introduced strange side effects to other wrapper code especially code after the nested template class. Note that nested template classes are still ignored. 2009-11-07: wsfulton Add new debug options: -debug-symtabs - Display symbol tables information -debug-symbols - Display target language symbols in the symbol tables -debug-csymbols - Display C symbols in the symbol tables 2009-11-03: wsfulton Fix some usage of unary scope operator (::) denoting global scope, for example: namespace AA { /* ... */ } using namespace ::AA; and bug #1816802 - SwigValueWrapper should be used: struct CC { CC(int); // no default constructor }; ::CC x(); and in template parameter specializations: struct S {}; template struct X { void a() {} }; template <> struct X { void b() {} }; %template(MyTConcrete) X< ::S >; plus probably some other corner case usage of ::. 2009-11-02: olly [Python] Fix potential memory leak in initialisation code for the generated module. 2009-10-23: wsfulton Fix seg fault when using a named nested template instantiation using %template(name) within a class. A warning that these are not supported is now issued plus processing continues as if no name was given. 2009-10-20: wsfulton [Python] Fix std::vector. This would previously compile, but not run correctly. 2009-10-20: wsfulton Fixed previously fairly poor template partial specialization and explicit specialization support. Numerous bugs in this area have been fixed including: - Template argument deduction implemented for template type arguments, eg this now works: template class X {}; template class X {}; %template(X1) X; // Chooses T * specialization and more complex cases with multiple parameters and a mix of template argument deduction and explicitly specialised parameters, eg: template struct TwoParm { void a() {} }; template struct TwoParm { void e() {} }; %template(E) TwoParm; Note that the primary template must now be in scope, like in C++, when an explicit or partial specialization is instantiated with %template. *** POTENTIAL INCOMPATIBILITY *** 2009-09-14: wsfulton [C#] Add %csattributes for adding C# attributes to enum values, see docs for example. 2009-09-11: wsfulton Fix memmove regression in cdata.i as reported by Adriaan Renting. 2009-09-07: wsfulton Fix constant expressions containing <= or >=. 2009-09-02: wsfulton The following operators in constant expressions now result in type bool for C++ wrappers and remain as type int for C wrappers, as per each standard: && || == != < > <= >= (Actually the last 4 are still broken). For example: #define A 10 #define B 10 #define A_EQ_B A == B // now wrapped as type bool for C++ #define A_AND_B A && B // now wrapped as type bool for C++ 2009-09-02: wsfulton Fix #2845746. true and false are now recognised keywords (only when wrapping C++). Constants such as the following are now wrapped (as type bool): #define FOO true #define BAR FOO && false Version 1.3.40 (18 August 2009) =============================== 2009-08-17: olly [Perl] Add "#undef do_exec" to our clean up of Perl global namespace pollution. 2009-08-17: olly [PHP] Fix to wrap a resource returned by __get() in a PHP object (SF#2549217). 2009-08-17: wsfulton Fix #2797485 After doing a 'make clean', install fails if yodl2man or yodl2html is not available. 2009-08-16: wsfulton [Octave] Caught exceptions display the type of the C++ exception instead of the generic "c++-side threw an exception" message. 2009-08-16: wsfulton [Java] When %catches is used, fix so that any classes specified in the "throws" attribute of the "throws" typemap are generated into the Java method's throws clause. 2009-08-16: wsfulton [C#] Fix exception handling when %catches is used, reported by Juan Manuel Alvarez. 2009-08-15: wsfulton Fix %template seg fault on some cases of overloading the templated method. Bug reported by Jan Kupec. 2009-08-15: wsfulton [Ruby] Add numerous missing wrapped methods for std::vector specialization as reported by Youssef Jones. 2009-08-14: wsfulton [Perl] Add SWIG_ConvertPtrAndOwn() method into the runtime for smart pointer memory ownership control. shared_ptr support still to be added. Patch from David Fletcher. 2009-08-14: olly [PHP] PHP5 now wraps static member variables as documented. 2009-08-14: olly [PHP] Update the PHP "class" example to work with PHP5 and use modern wrapping features. 2009-08-13: wsfulton [PHP] std::vector wrappers overhaul. They no longer require the specialize_std_vector() macro. Added wrappers for capacity() and reserve(). 2009-08-13: wsfulton [PHP] Add const reference typemaps. const reference primitive types are now passed by value rather than pointer like the other target languages. Fixes SF#2524029. 2009-08-08: wsfulton [Python] More user friendly AttributeError is raised when there are no constructors generated for the proxy class in the event that the class is abstract - the error message is now "No constructor defined - class is abstract" whereas if there are no public constructors for any other reason and the class is not abstract, the message remains "No constructor defined". [tcl] Similarly for tcl when using -itcl. 2009-08-04: olly [PHP] Fix generated code to work with PHP 5.3. 2009-08-04: vmiklos [PHP] Various mathematical functions (which would conflict with the built-in PHP ones) are now automatically handled by adding a 'c_' prefix. 2009-08-03: wsfulton [C#] The std::vector implementation is improved and now uses $typemap such that the proxy class for T no longer has to be specified in some macros for correct C# compilation; the following macros are deprecated, where CSTYPE was the C# type for the C++ class CTYPE: SWIG_STD_VECTOR_SPECIALIZE_MINIMUM(CSTYPE, CTYPE) usage should be removed altogether SWIG_STD_VECTOR_SPECIALIZE(CSTYPE, CTYPE) should be replaced with: SWIG_STD_VECTOR_ENHANCED(CTYPE) Some more details in csharp/std_vector.i *** POTENTIAL INCOMPATIBILITY *** 2009-07-31: olly [Python] Fix indentation so that we give a useful error if the module can't be loaded. Patch from Gaetan Lehmann in SF#2829853. 2009-07-29: wsfulton Add $typemap(method, typelist) special variable macro. This allows the contents of a typemap to be inserted within another typemap. Fully documented in Typemaps.html. 2009-07-29: vmiklos [PHP] Static member variables are now prefixed with the class name. This allows static member variables with the same name in different classes. 2009-07-29: olly [Python] Add missing locks to std::map wrappers. Patch from Paul Hampson in SF#2813836. 2009-07-29: olly [PHP] Fix memory leak in PHP OUTPUT typemaps. Reported by Hitoshi Amano in SF#2826322. 2009-07-29: olly [PHP] Fix memory leak in PHP resource destructor for classes without a destructor and non-class types. Patch from Hitoshi Amano in SF#2825303. 2009-07-28: olly [PHP] Update warnings about clashes between identifiers and PHP keywords and automatic renaming to work with the PHP5 class wrappers. Fixes SF#1613679. 2009-07-28: vmiklos [PHP] If a member function is not public but it has a base which is public, then now a warning is issued and the member function will be public, as PHP requires this. 2009-07-21: vmiklos [PHP] Director support added. 2009-07-15: olly [Perl] Don't specify Perl prototype "()" for a constructor with a different name to the class, as such constructors can still take parameters. 2009-07-12: xavier98 [Octave] Add support for Octave 3.2 API 2009-07-05: olly [PHP] Update the list of PHP keywords - "cfunction" is no longer a keyword in PHP5 and PHP 5.3 added "goto", "namespace", "__DIR__", and "__NAMESPACE__". 2009-07-03: olly [Tcl] To complement USE_TCL_STUBS, add support for USE_TK_STUBS and SWIG_TCL_STUBS_VERSION. Document all three in the Tcl chapter of the manual. Based on patch from SF#2810380 by Christian Gollwitzer. 2009-07-02: vmiklos [PHP] Added factory.i for PHP, see the li_factory testcase for more info on how to use it. 2009-07-02: wsfulton Fix -Wallkw option as reported by Solomon Gibbs. 2009-07-02: wsfulton Fix syntax error when a nested struct contains a comment containing a * followed eventually by a /. Regression from 1.3.37, reported by Solomon Gibbs. 2009-07-01: vmiklos [PHP] Unknown properties are no longer ignored in proxy classes. 2009-07-01: vmiklos [PHP] Fixed %newobject behaviour, previously any method marked with %newobject was handled as a constructor. 2009-06-30: olly [Ruby] Undefine close and connect macros defined by Ruby API headers as we don't need them and they can clash with C++ methods being wrapped. Patch from Vit Ondruch in SF#2814430. 2009-06-26: olly [Ruby] Fix to handle FIXNUM values greater than MAXINT passed for a double parameter. 2009-06-24: wsfulton Fix wrapping methods with default arguments and the compactdefaultargs feature where a class is passed by value and is assigned a default value. The SwigValueWrapper template workaround for a missing default constructor is no longer used as the code generated does not call the default constructor. 2009-06-16: wsfulton [Java,C#] Fix enum marshalling when %ignore is used on one of the enum items. Incorrect enum values were being passed to the C++ layer or compilation errors resulted. 2009-06-02: talby [Perl] Resolved reference.i overload support problem identified by John Potowsky. 2009-05-26: wsfulton [C#] Improved std::map wrappers based on patch from Yuval Baror. The C# proxy now implements System.Collections.Generic.IDictionary<>. These std:map wrappers have a non-backwards compatible overhaul to make them like a .NET IDictionary. Some method names have changed as following: set -> setitem (use this[] property now) get -> getitem (use this[] property now) has_key -> ContainsKey del -> Remove clear -> Clear The following macros used for std::map wrappers are deprecated and will no longer work: specialize_std_map_on_key specialize_std_map_on_value specialize_std_map_on_both *** POTENTIAL INCOMPATIBILITY *** 2009-05-20: vmiklos [PHP] Add the 'thisown' member to classes. The usage of it is the same as the Python thisown one: it's 1 by default and you can set it to 0 if you want to prevent freeing it. (For example to prevent a double free.) 2009-05-14: bhy [Python] Fix the wrong pointer value returned by SwigPyObject_repr(). 2009-05-13: mutandiz (Mikel Bancroft) [allegrocl] Minor tweak when wrapping in -nocwrap mode. 2009-05-11: wsfulton [C#] Improved std::vector wrappers on the C# proxy side from Yuval Baror. These implement IList<> instead of IEnumerable<> where possible. 2009-04-29: wsfulton [Java, C#] Add the 'notderived' attribute to the javabase and csbase typemaps. When this attribute is set, the typemap will not apply to classes that are derived from a C++ base class, eg %typemap(csbase, notderived="1") SWIGTYPE "CommonBase" 2009-04-29: olly [Python] Don't attempt to acquire the GIL in situations where we know that it will already be locked. This avoids some dead-locks with mod_python (due to mod_python bugs which are apparently unlikely to ever be fixed), and results in smaller wrappers which run a little faster (in tests with Xapian on x86-64 Ubuntu 9.04, the stripped wrapper library was 11% smaller and ran 2.7% faster). 2009-04-21: wsfulton [C#] Fix #2753469 - bool &OUTPUT and bool *OUTPUT typemaps initialisation. 2009-04-09: wsfulton Fix #2746858 - C macro expression using floating point numbers 2009-03-30: olly [PHP] The default out typemap for char[ANY] now returns the string up to a zero byte, or the end of the array if there is no zero byte. This is the same as Python does, and seems more generally useful than the previous behaviour of returning the whole contents of the array including any zero bytes. If you want the old behaviour, you can provide your own typemap to do this: %typemap(out) char [ANY] %{ RETVAL_STRINGL($1, $1_dim0, 1); %} Version 1.3.39 (21 March 2009) ============================== 2009-03-19: bhy [Python] Fix the memory leak related to Python 3 unicode and C char* conversion, which can be shown in the following example before this fix: from li_cstring import * i=0 while True: i += 1 n = str(i)*10 test3(n) This fix affected SWIG_AsCharPtrAndSize() so you cannot call this function with a null alloc and non-null cptr argument in Python 3, otherwise a runtime error will be raised. 2009-03-18: wsfulton [C#] std::vector wrapper improvements for .NET 2 and also providing the necessary machinery to use the std::vector wrappers with more advanced features such as LINQ - the C# proxy class now derives from IEnumerable<>. The default is now to generate code requiring .NET 2 as a minimum, although the C# code can be compiled for .NET 1 by defining the SWIG_DOTNET_1 C# preprocessor constant. See the std_vector.i file for more details. *** POTENTIAL INCOMPATIBILITY *** 2009-03-12: wsfulton [Ruby] Fix #2676738 SWIG generated symbol name clashes. 2009-03-01: bhy [Python] Some fixes for Python 3.0.1 and higher support. In 3.0.1, the C API function PyObject_Compare is removed, so PyObject_RichCompareBool is used for replacement. Struct initilization of SwigPyObject and SwigPyObject_as_number changed to reflect the drop of tp_compare and nb_long. 2009-03-01: bhy [Python] Fix SF#2583160. Now the importer in Python shadow wrapper take care of the case that module already imported at other place. 2009-02-28: bhy [Python] Fix SF#2637352. Move struct declaration of SWIG_module in pyinit.swg before the method calls, since some C compiler don't allow declaration in middle of function body. 2009-02-21: wsfulton [Allegrocl] Fix seg fault wrapping some constant variable (%constant) types. 2009-02-20: wsfulton [CFFI] Fix seg faults when for %extend and using statements. 2009-02-20: wsfulton Fix SF #2605955: -co option which broke in 1.3.37. 2009-02-20: wsfulton New %insert("begin") section added. Also can be used as %begin. This is a new code section reserved entirely for users and the code within the section is generated at the top of the C/C++ wrapper file and so provides a means to put custom code into the wrapper file before anything else that SWIG generates. 2009-02-17: wsfulton 'make clean-test-suite' will now run clean on ALL languages. Previously it only ran the correctly configured languages. This way it is now possible to clean up properly after running 'make partialcheck-test-suite'. 2009-02-14: wsfulton Extend attribute library support for structs/classes and the accessor functions use pass/return by value semantics. Two new macros are available and usage is identical to %attribute. These are %attributeval for structs/classes and %attributestring for string classes, like std::string. See attribute.swg for more details. 2009-02-13: wsfulton Add support for %extend and memberin typemaps. Previously the memberin typemaps were ignored for member variables within a %extend block. 2009-02-12: wsfulton Remove unnecessary temporary variable when wrapping return values that are references. Example of generated code for wrapping: struct XYZ { std::string& refReturn(); }; used to be: std::string *result = 0 ; ... { std::string &_result_ref = (arg1)->refReturn(); result = (std::string *) &_result_ref; } Now it is: std::string *result = 0 ; ... result = (std::string *) &(arg1)->refReturn(); 2009-02-08: bhy Change the SIZE mapped by %pybuffer_mutable_binary and %pybuffer_binary in pybuffer.i from the length of the buffer to the number of items in the buffer. 2009-02-08: wsfulton Fix %feature not working for conversion operators, reported by Matt Sprague, for example: %feature("cs:methodmodifiers") operator bool "protected"; 2009-02-07: wsfulton [MzScheme] Apply #2081967 configure changes for examples to build with recent PLT versions. Also fixes Makefile errors building SWIG executable when mzscheme package is installed (version 3.72 approx and later). 2009-02-04: talby [Perl] Fix SF#2564192 reported by David Kolovratnk. SWIG_AsCharPtrAndSize() now handles "get" magic. Version 1.3.38 (31 January 2009) ================================ 2009-01-31: bhy [Python] Fix SF#2552488 reported by Gaetan Lehmann. Now %pythonprepend and %pythonappend have correct indentation. 2009-01-31: bhy [Python] Fix SF#2552048 reported by Gaetan Lehmann. The parameter list of static member function in generated proxy code should not have the 'self' parameter. 2009-01-29: wsfulton Fix regression introduced in 1.3.37 where the default output directory for target language specific files (in the absence of -outdir) was no longer the same directory as the generated c/c++ file. 2009-01-28: wsfulton [Java, C#] Fix proxy class not being used when the global scope operator was used for parameters passed by value. Reported by David Piepgrass. 2009-01-15: wsfulton [Perl] Fix seg fault when running with -v option, reported by John Ky. Version 1.3.37 (13 January 2009) ================================ 2009-01-13: mgossage [Lua] Added contract support for requiring that unsigned numbers are >=0 Rewrote much of Examples/Lua/embed3. Added a lot to the Lua documentation. 2009-01-13: wsfulton Fix compilation error when using directors on protected virtual overloaded methods reported by Sam Hendley. 2009-01-12: drjoe [R] Fixed handling of integer arrays 2009-01-10: drjoe [R] Fix integer handling in r to deal correctly with signed and unsigned issues 2009-01-10: wsfulton Patch #1992756 from Colin McDonald - %contract not working for classes in namespace 2009-01-05: olly Mark SWIGPERL5, SWIGPHP5, and SWIGTCL8 as deprecated in the source code and remove documentation of them. 2008-12-30: wsfulton Bug #2430756. All the languages now define a macro in the generated C/C++ wrapper file indicating which language is being wrapped. The macro name is the same as those defined when SWIG is run, eg SWIGJAVA, SWIGOCTAVE, SWIGCSHARP etc and are listed in the "Conditional Compilation" section in the documentation. 2008-12-23: wsfulton [Java] Fix #2153773 - %nojavaexception was clearing the exception feature instead of disabling it. Clearing checked Java exceptions also didn't work. The new %clearjavaexception can be used for clearing the exception feature. 2008-12-22: wsfulton Fix #2432801 - Make SwigValueWrapper exception safe for when copy constructors throw exceptions. 2008-12-21: wsfulton Apply patch #2440046 which fixes possible seg faults for member and global variable char arrays when the strings are larger than the string array size. 2008-12-20: wsfulton The ccache compiler cache has been adapted to work with SWIG and named ccache-swig. It now works with C/C++ compilers as well as SWIG and can result in impressive speedups when used to recompile unchanged code with either a C/C++ compiler or SWIG. Documentation is in CCache.html or the installed ccache-swig man page. 2008-12-12: wsfulton Apply patch from Kalyanov Dmitry which fixes parsing of nested structs containing comments. 2008-12-12: wsfulton Fix error message in some nested struct and %inline parsing error situations such as unterminated strings and comments. 2008-12-07: olly [PHP] Fix warnings when compiling generated wrapper with GCC 4.3. 2008-12-06: wsfulton [PHP] Deprecate %pragma(php4). Please use %pragma(php) instead. The following two warnings have been renamed: WARN_PHP4_MULTIPLE_INHERITANCE -> WARN_PHP_MULTIPLE_INHERITANCE WARN_PHP4_UNKNOWN_PRAGMA -> WARN_PHP_UNKNOWN_PRAGMA *** POTENTIAL INCOMPATIBILITY *** 2008-12-04: bhy [Python] Applied patch SF#2158938: all the SWIG symbol names started with Py are changed, since they are inappropriate and discouraged in Python documentation (from http://www.python.org/doc/2.5.2/api/includes.html): "All user visible names defined by Python.h (except those defined by the included standard headers) have one of the prefixes "Py" or "_Py". Names beginning with "_Py" are for internal use by the Python implementation and should not be used by extension writers. Structure member names do not have a reserved prefix. Important: user code should never define names that begin with "Py" or "_Py". This confuses the reader, and jeopardizes the portability of the user code to future Python versions, which may define additional names beginning with one of these prefixes." Here is a brief list of what changed: PySwig* -> SwigPy* PyObject_ptr -> SwigPtr_PyObject PyObject_var -> SwigVar_PyObject PySequence_Base, PySequence_Cont, PySequence_Ref -> SwigPySequence_Base, SwigPySequence_Cont, SwigPySequence_Ref PyMap* -> SwigPyMap* We provided a pyname_compat.i for backward compatibility. Users whose code having these symbols and do not want to change it could simply include this file at front of your code. A better solution is to run the converting tool on your code, which has been put in SWIG's SVN trunk (Tools/pyname_patch.py) and you can download it here: https://swig.svn.sourceforge.net/svnroot/swig/trunk/Tools/pyname_patch.py *** POTENTIAL INCOMPATIBILITY *** 2008-12-02: wsfulton [Python] Apply patch #2143727 from Serge Monkewitz to fix importing base classes when the package option is specified in %module and that module is %import'ed. 2008-11-28: wsfulton [UTL] Fix #2080497. Some incorrect acceptance of types in the STL, eg a double * element passed into a vector constructor would be accepted, but the ensuing behaviour was undefined. Now the type conversion correctly raises an exception. 2008-11-24: wsfulton Add -outcurrentdir option. This sets the default output directory to the current directory instead of the path specified by the input file. This option enables behaviour similar to c/c++ compilers. Note that this controls the output directory, but only in the absence of the -o and/or -outdir options. 2008-11-23: wsfulton [ruby] Apply patch #2263850 to fix ruby/file.i ... rubyio.h filename change in ruby 1.9. 2008-11-23: wsfulton Apply patch #2319790 from Johan Hake to fix shared_ptr usage in std::tr1 namespace. 2008-11-21: wsfulton The use of the include path to find the input file is now deprecated. This makes the behaviour of SWIG the same as C/C++ compilers in preparation for use with ccache. 2008-11-16: wsfulton Fix -nopreprocess option to: - correctly report file names in warning and error messages. - use the original input filename that created the preprocessed output when determining the C++ wrapper file name (in the absence of -o). Previously the name of the input file containing the preprocessed output was used. 2008-11-11: wsfulton [Java] Add patch #2152691 from MATSUURA Takanori which fixes compiles using the Intel compiler 2008-11-01: wsfulton Add patch #2128249 from Anatoly Techtonik which corrects the C/C++ proxy class being reported for Python docstrings when %rename is used. 2008-11-01: wsfulton Add the strip encoder patch from Anatoly Techtonik #2130016. This enables an easy way to rename symbols by stripping a commonly used prefix in all the function/struct names. It works in the same way as the other encoders, such as title, lower, command etc outlined in CHANGES file dated 12/30/2005. Example below will rename wxAnotherWidget to AnotherWidget and wxDoSomething to DoSomething: %rename("%(strip:[wx])s") ""; struct wxAnotherWidget { void wxDoSomething(); }; 2008-09-26: mutandiz [allegrocl] Lots of test-suite work. - Fix ordering of wrapper output and %{ %} header output. - Fix declarations of local vars in C wrappers. - Fix declaration of defined constants in C wrappers. - Fix declaration of EnumValues in C wrappers. - add some const typemaps to allegrocl.swg - add rename for operator bool() overloads. 2008-09-25: olly [PHP5] Fill in typemaps for SWIGTYPE and void * (SF#2095186). 2008-09-22: mutandiz (Mikel Bancroft) [allegrocl] - Support wrapping of types whose definitions are not seen by SWIG. They are treated as forward-referenced classes and if a definition is not seen are treated as (* :void). - Don't wrap the contents of unnamed namespaces. - More code cleanup. Removed some extraneous warnings. - start work on having the allegrocl mod pass the cpp test-suite. 2008-09-19: olly [PHP5] Add typemaps for long long and unsigned long long. 2008-09-18: wsfulton [C#] Added C# array typemaps provided by Antti Karanta. The arrays provide a way to use MarshalAs(UnmanagedType.LPArray) and pinning the array using 'fixed'. See arrays_csharp.i library file for details. 2008-09-18: wsfulton Document the optional module attribute in the %import directive, see Modules.html. Add a warning for Python wrappers when the module name for an imported base class is missing, requiring the module attribute to be added to %import, eg %import(module="FooModule") foo.h 2008-09-18: olly [PHP5] Change the default input typemap for char * to turn PHP Null into C NULL (previously it was converted to an empty string). The new behaviour is consistent with how the corresponding output typemap works (SF#2025719). If you want to keep the old behaviour, add the following typemap to your interface file (PHP's convert_to_string_ex() function does the converting from PHP Null to an empty string): %typemap(in) char * { convert_to_string_ex($input); $1 = Z_STRVAL_PP($input); } 2008-09-18: olly [PHP5] Fix extra code added to proxy class constructors in the case where the only constructor takes no arguments. 2008-09-18: olly [PHP5] Fix wrapping of a renamed enumerated value of an enum class member (SF#2095273). 2008-09-17: mutandiz (Mikel Bancroft) [allegrocl] - Fix how forward reference typedefs are handled, so as not to conflict with other legit typedefs. - Don't (for now) perform an ffitype typemap lookup when trying to when calling compose_foreign_type(). This is actually a useful thing to do in certain cases, the test cases for which I can't currently locate :/. It's breaking some wrapping behavior that is more commonly seen, however. I'll readd in a more appropriate way when I can recreate the needed test case, or a user complains (which means they probably have a test case). - document the -isolate command-line arg in the 'swig -help' output. It was in the html docs, but not there. - small amount of code cleanup, removed some unused code. - some minor aesthetic changes. 2008-09-12: bhy [Python] Python 3.0 support branch merged into SWIG trunk. Thanks to Google Summer of Code 2008 for supporting this project! By default SWIG will generate interface files compatible with both Python 2.x and 3.0. And there's also some Python 3 new features that can be enabled by passing a "-py3" command line option to SWIG. These features are: - Function annotation support Also, the parameter list of proxy function will be generated, even without the "-py3" option. However, the parameter list will fallback to *args if the function (or method) is overloaded. - Buffer interface support - Abstract base class support For details of Python 3 support and these features, please see the "Python 3 Support" section in the "SWIG and Python" chapter of the SWIG documentation. The "-apply" command line option and support of generating codes using apply() is removed. Since this is only required by very old Python. This merge also patched SWIG's parser to solve a bug. By this patch, SWIG features able to be correctly applied on C++ conversion operator, such like this: %feature("shadow") *::operator bool %{ ... %} 2008-09-02: richardb [Python] Commit patch #2089149: Director exception handling mangles returned exception. Exceptions raised by Python code in directors are now passed through to the caller without change. Also, remove the ": " prefix which used to be added to other director exceptions (eg, those due to incorrect return types). 2008-09-02: wsfulton [Python] Commit patch #1988296 GCItem multiple module linking issue when using directors. 2008-09-02: wsfulton [C#] Support for 'using' and 'fixed' blocks in the 'csin' typemap is now possible through the use of the pre attribute and the new terminator attribute, eg %typemap(csin, pre=" using (CDate temp$csinput = new CDate($csinput)) {", terminator=" } // terminate temp$csinput using block", ) const CDate & "$csclassname.getCPtr(temp$csinput)" See CSharp.html for more info. 2008-09-01: wsfulton [CFFI] Commit patch #2079381 submitted by Boris Smilga - constant exprs put into no-eval context in DEFCENUM 2008-08-02: wuzzeb [Chicken,Allegro] Commit Patch 2019314 Fixes a build error in chicken, and several build errors and other errors in Allegro CL 2008-07-19: wsfulton Fix building of Tcl examples/test-suite on Mac OS X reported by Gideon Simpson. 2008-07-17: wsfulton Fix SF #2019156 Configuring with --without-octave or --without-alllang did not disable octave. 2008-07-14: wsfulton [Java, C#] Fix director typemaps for pointers so that NULL pointers are correctly marshalled to C#/Java null in director methods. 2008-07-04: olly [PHP] For std_vector.i and std_map.i, rename empty() to is_empty() since "empty" is a PHP reserved word. Based on patch from Mark Klein in SF#1943417. 2008-07-04: olly [PHP] The deprecated command line option "-make" has been removed. Searches on Google codesearch suggest that nobody is using it now anyway. 2008-07-04: olly [PHP] The SWIG cdata.i library module is now supported. 2008-07-03: olly [PHP] The deprecated command line option "-phpfull" has been removed. We recommend building your extension as a dynamically loadable module. 2008-07-02: olly [PHP4] Support for PHP4 has been removed. The PHP developers are no longer making new PHP4 releases, and won't even be providing patches for critical security issues after 2008-08-08. 2008-07-02: olly [Python] Import the C extension differently for Python 2.6 and later so that an implicit relative import doesn't produce a deprecation warning for 2.6 and a failure for 2.7 and later. Patch from Richard Boulton in SF#2008229, plus follow-up patches from Richard and Haoyu Bai. Version 1.3.36 (24 June 2008) ============================= 06/24/2008: wsfulton Remove deprecated -c commandline option (runtime library generation). 06/24/2008: olly [PHP] Fix assertion failure when handling %typemap(in,numinputs=0) (testcase ignore_parameter). 06/24/2008: olly [PHP] Fix segfault when wrapping a non-class function marked with %newobject (testcase char_strings). 06/22/2008: wsfulton [Java] Add a way to use AttachCurrentThreadAsDaemon instead of AttachCurrentThread in director code. Define the SWIG_JAVA_ATTACH_CURRENT_THREAD_AS_DAEMON macro, see Lib/java/director.swg. 06/21/2008: wsfulton [Ruby] Fix crashing in the STL wrappers (reject! and delete_if methods) 06/19/2008: wsfulton [Java, C#] C# and Java keywords will be renamed instead of just issuing a warning and then generating uncompilable code. Warning 314 gives the new name when a keyword is found. 06/19/2008: wsfulton [R] Keyword handling added. R Keywords will be renamed as necessary. Warning 314 gives the new name when a keyword is found. 06/17/2008: mgossage [Lua] Added missing support for bool& and bool*. Added runtest for li_typemaps testcase. (Bug #1938142) 06/07/2008: bhy Added test case keyword_rename, then made the keyword renaming works properly by fixing Swig_name_make() for a incomplete condition checking. 06/02/2008: wsfulton [Java, C#] Fix enum wrappers when using -noproxy. 05/30/2008: bhy Added std::wstring into Lib/typemaps/primtypes.swg, since it is also a primitive type in SWIG - fixed SF #1976978. 05/29/2008: wsfulton [Java, C#] Fix variable wrappers when using -noproxy. 05/29/2008: bhy [Python] Fixed a typo of %#ifdef in Lib/python/pycontainer.swg, which is related to -extranative SWIG option - SF #1971977. 05/20/2008: wsfulton New partialcheck makefile targets for partial testing of the test-suite. These just invoke SWIG, ie no compilation and no runtime testing. It can be faster when developing by just doing a directory diff of the files SWIG generates against those from a previous run. Example usage from the top level directory: make partialcheck-test-suite make partialcheck-java-test-suite This change also encompasses more flexibility in running the test-suite, eg it is possible to prefix the command line which runs any target language test with a tool. See the RUNTOOL, COMPILETOOL and SWIGTOOL targets in the common.mk file and makefiles in the test-suite directory. For example it is possible to run the runtime tests through valgrind using: make check RUNTOOL="valgrind --leak-check=full" or invoke SWIG under valgrind using: make check SWIGTOOL="valgrind --tool=memcheck" 05/19/2008: drjoe [R] Fixed define that was breaking pre-2.7. Checked in patch from Soren Sonnenburg that creates strings in version independent way 05/15/2008: wsfulton [Java] Fix variable name clash in directors - SF #1963316 reported by Tristan. 05/14/2008: wsfulton Add an optimisation for functions that return objects by value, reducing the number of copies of the object that are made. Implemented using an optional attribute in the "out" typemap called "optimal". Details in Typemaps.html. 05/11/2008: olly [PHP] Check for %feature("notabstract") when generating PHP5 class wrapper. 05/11/2008: wsfulton Fix SF #1943608 - $self substitution in %contract, patch submitted by Toon Verstraelen. 05/09/2008: olly [PHP] Fix char * typemaps to work when applied to signed char * and unsigned char * (uncovered by testcase apply_strings). 05/09/2008: wsfulton Fix wrapping of char * member variables when using allprotected mode. Bug reported by Warren Wang. 05/09/2008: olly [PHP] Fix bad PHP code generated when wrapping an enum in a namespace (uncovered by testcase arrays_scope). 05/09/2008: olly [PHP] SWIG now runs the PHP testsuite using PHP5, not PHP4. PHP4 is essentially obsolete now, so we care much more about solid PHP5 support. 05/07/2008: wsfulton STL fixes when using %import rather than %include and the Solaris Workshop compiler and the Roguewave STL. 05/07/2008: wsfulton Fix wrapping of overloaded protected methods when using allprotected mode. Bug reported by Warren Wang. 05/03/2008: wsfulton Commit patch #1956607 to add -MT support from Richard Boulton. This patch mirrors the gcc -MT option which allows one to change the default Makefile target being generated when generating makefiles with the -M family of options. For example: $ swig -java -MM -MT overriddenname -c++ example.i overriddenname: \ example.i \ example.h 04/30/2008: mgossage [Lua] Removed generation of _wrap_delete_XXXXX (wrappered destructor) which was unused and causing warning with g++ -Wall. Removed other unused warning in typemaps.i and other places. Added Examples/lua/embed3, and run tests a few test cases. 04/24/2008: olly [Python] Fix generated code for IBM's C++ compiler on AIX (patch from Goeran Uddeborg in SF#1928048). 04/24/2008: olly Rename BSIZE in Examples/test-suite/arrays_scope.i to BBSIZE to avoid a clash with BSIZE defined by headers on AIX with Perl (reported in SF#1928048). 04/20/2008: wsfulton Add the ability to wrap all protected members when using directors. Previously only the virtual methods were available to the target language. Now all protected members, (static and non-static variables, non-virtual methods and static methods) are wrapped when using the allprotected mode. The allprotected mode is turned on in the module declaration: %module(directors="1", allprotected="1") modulename Version 1.3.35 (7 April 2008) ============================= 04/07/2008: wsfulton [Lua] Add missing pointer reference typemaps 04/06/2008: wsfulton Fix stack overflow when using typemap warning suppression, eg %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) 04/05/2008: wsfulton [Python] Fix shared_ptr typemaps so that %pythonnondynamic can be used. Also corrects display of the proxy class type. Reported by Robert Lupton. 04/04/2008: olly [Python] Add %newobject reference to python memory management subsection of manual (patch from mdbeachy in SF#1894610). 03/27/2008: wsfulton [Python] Fix shared_ptr typemaps where the pointer type is a templated type with with more than one parameter. Reported by Robert Lupton. 03/27/2008: mgossage [Lua] Added a typemap DISOWN for SWIGTYPE* and SWIGTYPE[], and support for %delobject feature. Added Examples/lua/owner which demonstrates the use of the memory management. 03/26/2008: wsfulton [Java] Apply patch #1844301 from Monty Taylor to suppress enum constructor unused warnings. 03/26/2008: wsfulton [Python] Apply patch #1924524 from Casey Raymondson which ensures the "No constructor defined" message is displayed when attempting to call a constructor on a class that doesn't have a constructor wrapper, eg if the C++ class is abstract. 03/26/2008: wsfulton [Python] Apply patch #1925702 from Casey Raymondson which removes warning 512 for std::vector wrappers. 03/26/2008: olly [Python] Apply GCC 4.3 warnings patch from Philipp Thomas (SF#1925122). 03/21/2008: wsfulton [Python] Thread safety patch for STL iterators from Abhinandan Jain. 03/17/2008: mgossage [Lua] Added %luacode feature to add source code into wrappers. Updated documentation to document this. Added Examples/lua/arrays to show its use (and typemaps) 03/17/2008: olly Fix nonportable sed usage which failed on Mac OS X (and probably other platforms). Fixes SF#1903612. 03/17/2008: olly Fix memory leak in SWIG's parser (based on patch from Russell Bryant in SF#1914023). 03/12/2008: wsfulton Fix bug #1878285 - unnecessary cast for C struct creation wrappers. 03/12/2008: wsfulton [Python] Remove debugging info when using shared_ptr support 03/06/2008: mgossage [Lua] Updated documentation for Lua exceptions. Added Examples/lua/exception and Examples/lua/embed2. Small updates to the typemaps. 03/04/2008: wsfulton [Java, C#] Add char *& typemaps. 03/04/2008: wsfulton Fix occasional seg fault when attempting to report overloaded methods as being ignored. 02/29/2008: wsfulton [Perl] Fix #1904537 Swig causes a Perl warning "x used only once" in Perl 5.10 reported by Ari Jolma 02/29/2008: wsfulton [Python] Add shared_ptr varin/varout typemaps for wrapping global variables. 02/25/2008: wsfulton Fix $wrapname to work in %exception (fixes some wrap:name assertions) Version 1.3.34 (27 February 2008) ================================= 02/13/2008: wsfulton [R] Fix wrapping of global function pointer variables. 02/13/2008: wsfulton Add new special variables for use within %exception: $wrapname - language specific wrapper name $overname - if a method is overloaded this contains the extra mangling used on the overloaded method $decl - the fully qualified C/C++ declaration of the method being wrapped without the return type $fulldecl - the fully qualified C/C++ declaration of the method being wrapped including the return type 02/12/2008: drjoe [R] Now setting S4 flag in SWIG created objects. This fixes R-SWIG for 2.6 and warning for 2.6 failure has been removed. 02/11/2008: mgossage [Lua] Added a patch by Torsten Landschoff to fix the unary minus issue Ran 'astyle --style=kr -2' across lua.cxx to neaten it up 02/10/2008: wsfulton Bump SWIG_RUNTIME_VERSION to 4. This is because of the recently introduced API change in the conversion functions, ie change in definition of swig_converter_func. Anyone calling SWIG_TypeCast must pass in a valid value for the new additional (third) parameter and then handle the newly created memory if the returned value is set to SWIG_CAST_NEW_MEMORY else a memory leak will ensue. 02/09/2008: wsfulton [Python] Experimental shared_ptr typemaps added. Usage is the same as the recently added Java and C# shared_ptr typemaps. Two macros are available, although these may well change in a future version: For base classes or classes not in an inheritance chain: SWIG_SHARED_PTR(PROXYCLASS, TYPE) For derived classes: SWIG_SHARED_PTR_DERIVED(PROXYCLASS, BASECLASSTYPE, TYPE) The PROXYCLASS is the name of the proxy class, but is only required for Java/C#. Example usage: %include "boost_shared_ptr.i" SWIG_SHARED_PTR(Klass, Space::Klass) SWIG_SHARED_PTR_DERIVED(KlassDerived, Space::Klass, Space::KlassDerived) namespace Space { struct Klass { ... }; struct KlassDerived : Klass { ... }; } Further details to follow in future documentation, but the following features should be noted: - Not restricted to boost::shared_ptr, eg std::tr1::shared_ptr can also be used. - Available typemap groups: (a) Typemaps for shared_ptr passed by value, reference, pointer and pointer reference. - (b) Typemaps for passing by raw value, raw pointer, raw reference, raw pointer reference. - The code being wrapped does not even have to use shared_ptr, SWIG can use shared_ptr as the underlying storage mechanism instead of a raw pointer due to the typemaps in group (b) above. - No array support as shared_ptr does not support arrays. - This works quite differently to the usual SWIG smart pointer support when operator-> is parsed by SWIG: - An additional smart pointer class is not generated reducing code bloat in the wrappers. - Using smart pointers and raw pointers can be mixed seamlessly. - Missing constructors for the smart pointers is no longer a problem and so separate factory type functions do not have to be written and wrapped. - The implicit C++ shared_ptr< derived class > to shared_ptr< base class > cast also works in the target language. This negates the necessity to write an explicit helper cast function providing the upcast which would need calling prior to passing a derived class to a method taking a shared_ptr to a base class. 02/09/2008: wsfulton [Python] Add support for overriding the class registration function via a new "smartptr" feature. This is a very low level of customisation most users would never need to know. The feature will typically be used for intrusive smart pointers along with additional typemaps. Example usage of the feature: %feature("smartptr", noblock=1) Foo { boost::shared_ptr< Foo > } class Foo {}; The generated Foo_swigregister function will then register boost::shared < Foo > (SWIGTYPE_p_boost__shared_ptrTFoo_t instead of SWIGTYPE_p_Foo) as the underlying type for instantiations of Foo. 02/09/2008: wsfulton Features now supports the optional 'noblock' attribute for all usage of %feature. When specified, the { } braces are removed from the feature code. This is identical in behaviour to usage of 'noblock' in typemaps and is used when the preprocessor is required to operate on the code in the feature and the enclosing { } braces are not required. Example: #define FOO foo %feature("smartptr", noblock="1") { FOO::bar } The preprocessor then reduces this as if this had been used instead: %feature("smartptr") "foo::bar" 02/01/2008: olly [Python] Fix format string bug (SF#1882220). 01/31/2008: wsfulton Additions to the %types directive. Now the conversion / casting code can be overridden to some custom code in the %types directive, like so: %types(fromtype = totype) %{ ... code to convert fromtype to totype and return ... %} The special variable $from will be replaced by the name of the parameter of the type being converted from. The code must return the totype cast to void *. Example: class Time; class Date; Date &Time::dateFromTime(); %types(Time = Date) %{ Time *t = (Time *)$from; Date &d = t->dateFromTime(); return (void *) &d; %} resulting in the conversion / casting code looking something like: static void *_p_TimeTo_p_Date(void *x) { Time *t = (Time *)x; Date &d = t->dateFromTime(); return (void *) &d; } This is advanced usage, please use only if you understand the runtime type system. 01/30/2008: mgossage Small update to documentation in Typemaps.html, to warn about use of local variables in typemaps for multiple types. 01/25/2008: wsfulton [Java] Fix bug reported by Kevin Mills in ARRAYSOFCLASSES typemaps where any changes made to an array element passed from Java to C are not reflected back into Java. 01/24/2008: mgossage More updates to the configure script for detecting lua. Also looks in /usr/include/lua* Also changed typemaps.i not to check for NULL before freeing a pointer 01/21/2008: wsfulton [Python] For STL containers, SWIG no longer attempts to convert from one STL container to another, eg from std::vector to std::vector or std::list to std::vector or even std::vector to std::vector as it previously did. In fact SWIG no longer attempts to convert any SWIG wrapped C++ proxy class that is also a Python sequence, whereas previously it would. Any non-SWIG Python sequence will still be accepted wherever an STL container is accepted. Overloaded methods using containers should be faster. 01/18/2008: wsfulton [C#] Add 'directorinattributes' and 'directoroutattributes' typemap attributes for the imtype typemap. These should contain C# attributes which will be generated into the C# director delegate methods. 01/18/2008: olly Fix handling of byte value 255 in input files on platforms where char is signed (it was getting mapped to EOF). Fixes SF#1518219. 01/16/2008: wsfulton Fix template member variables wrapped by a smart pointer. Bug reported by Robert Lupton. 01/14/2008: mgossage Substantial changes to configure script for detecting lua. Code can now link to liblua.a, liblua50.a or liblua51.a It's also a lot neater now. 12/16/2007: wsfulton [Perl] Backed out #1798728 - numbers can be passed to functions taking char * 12/16/2007: wsfulton Fix #1832613 - Templates and some typedefs involving pointers or function pointers 12/12/2007: wsfulton [Java] Fix #1632625 - Compilation errors on Visual C++ 6 when using directors. 12/12/2007: wsfulton [Perl] Fix #1798728 - numbers can be passed to functions taking char *. 12/12/2007: wsfulton Fix #1819847 %template with just one default template parameter template class Foo {...}; %template(FooDefault) Foo<>; 12/12/2007: mgossage [Lua] Small correction on Lua.html 12/09/2007: wsfulton Apply patch #1838248 from Monty Taylor for vpath builds of SWIG. 12/08/2007: wsfulton [Lua] Fixes to remove gcc-4.2 warnings 12/06/2007: wsfulton Fix #1734415 - template template parameters with default arguments such as: template class t_alloc = pfc::alloc_fast > class list_t : public list_impl_t > { ... }; 12/04/2007: mgossage [lua] Fix a bug in the class hierachy code, where the methods were not propagated, if the name ordering was in a certain order. Added new example programs (dual, embed) and runtime tests for test-suite. 11/30/2007: wsfulton Fix using statements using a base class method where the methods were overloaded. Depending on the order of the using statements and method declarations, these were previously generating uncompilable wrappers, eg: struct Derived : Base { virtual void funk(); using Base::funk; }; Version 1.3.33 (November 23, 2007) ================================== 11/21/2007: mikel [allegrocl] omit private slot type info in the classes/types defined on the lisp side. Fix bug in mapping of C/++ types to lisp types. Fix typo in modules generated defpackage form. Have std::string *'s automatically marshalled between foreign and lisp strings. 11/20/2007: olly [Python] Fill in Python Dictionary functions list (patch from Jelmer Vernooij posted to swig-devel). 11/20/2007: beazley Fixed a bug in the C scanner related to backslash characters. 11/19/2007: wsfulton [Perl] Fix broken compilation of C++ wrappers on some compilers. 11/16/2007: olly [Python] Don't pass Py_ssize_t for a %d printf-like format as that's undefined behaviour when sizeof(Py_ssize_t) != sizeof(int). Version 1.3.32 (November 15, 2007) ================================== 11/14/2007: wsfulton [R] Package name and dll name is now the same as the SWIG module name. It used to be the module name with _wrap as a suffix. The package and dll names can be modified using the -package and -dll commandline options. *** POTENTIAL INCOMPATIBILITY *** 11/11/2007: wsfulton [R] Add support for Windows (Visual C++ 8 tested) 11/10/2007: olly [php] Fix makefile generated by -make (SF#1633679). Update documentation to mark "-make" as deprecated (none of the other SWIG backends seem to offer such a feature, it can't realistically generate a fully portable makefile, and the commands to build an extension are easy enough to write for the user's preferred build tool). Also recommend against the use of "-phpfull" (it's only really useful when static linking, and a dynamically loadable module is virtually always the better approach). 11/09/2007: olly Fix --help output to note that `export SWIG_FEATURES' is required. 10/29/2007: wsfulton [R] Fix seg fault on Windows [R] Examples R scripts are now platform independent 10/30/2007: mgossage [lua] fixed bug in template classes which cases template_default2 and template_specialization_defarg to fail. Added several warning filters into the overload's test cases. Added runtime tests for several codes. You can now make check-lua-test-suite with no errors and only a few warnings. 10/30/2007: olly [guile] Fix the configure test to put GUILELINK in LIBS not LDFLAGS (SF#1822430). 10/30/2007: olly [guile] Fix the guile examples on 64-bit platforms. 10/29/2007: wsfulton [C#] Fix member pointers on 64 bit platforms. 10/28/2007: olly [lua] Fix swig_lua_class instances to be static to allow multiple SWIG wrappers to be compiled into the same executable statically. Patch from Andreas Fredriksson (posted to the swig mailing list). 10/28/2007: olly [lua] Fix Examples/lua to pass SRCS for C tests rather than CXXSRCS. The code as it was happened to work on x86, but broke on x86_64 (and probably any other platforms which require -fPIC). 10/28/2007: wsfulton [Java, C#] New approach for fixing uninitialised variable usage on error in director methods using the new templated initialisation function SwigValueInit(). 10/28/2007: wsfulton [Perl] Use more efficient SvPV_nolen(x) instead of SvPV(x,PL_na) if SvPV_nolen is supported. 10/26/2007: wuzzeb [Chicken] Fix global variables of class member function pointers. Other minor fixes, so all tests in the chicken test suite now pass 10/25/2007: olly Fix UTL typecheck macro for a function taking char[] or const char[] (SF#1820132). 10/22/2007: mkoeppe [Guile] Filter out -ansi -pedantic from CFLAGS while compiling test programs for Guile in configure. This enables running the test suite for Guile if it is installed and usable. 10/22/2007: mkoeppe [Guile -scm] Fix testcases apply_signed_char and apply_strings by adding explicit casts to the appropriate $ltype. 10/22/2007: wsfulton [Java, C#] Fix uninitialised variable usage on error in director methods. 10/19/2007: wsfulton [Java, C#] Bug #1794247 - fix generated code for derived classes when csbase or javabase typemaps are used with the replace="1" attribute. 10/19/2007: wsfulton [Python] Docs updated to suggest using distutils. Patch #1796681 from Christopher Barker. 10/19/2007: olly [perl5] Clear errno before calls to strtol(), strtoul(), strtoll() and strtoull() which we check errno after to avoid seeing a junk value of errno if there isn't an error in the call. 10/16/2007: wsfulton Deprecate %attribute_ref and replace with %attributeref. There is just an argument order change in order to maintain consistency with %attribute, from: %attribute_ref(Class, AttributeType, AccessorMethod, AttributeName) to %attributeref(Class, AttributeType, AttributeName, AccessorMethod) 10/16/2007: olly [Tcl] Fix several occurrences of "warning: deprecated conversion from string constant to 'char*'" from GCC 4.2 in generated C/C++ code. 10/16/2007: olly [PHP] Fix many occurrences of "warning: deprecated conversion from string constant to 'char*'" from GCC 4.2 in generated C/C++ code when compiling with a new enough version of PHP 5 (tested with PHP 5.2.3, but PHP 5.2.1 is probably the minimum requirement). 10/15/2007: wsfulton Patch #1797133 from David Piepgrass fixes %attribute when the getter has the same name as the attribute name and no longer generate non-functional setter for read-only attributes. 10/15/2007: olly [Tcl] Prevent SWIG_Tcl_ConvertPtr from calling the unknown proc. Add Examples/tcl/std_vector/ which this change fixes. Patch is from "Cliff C" in SF#1809819. 10/12/2007: wsfulton [Java] Add DetachCurrentThread back in for directors. See entry dated 08/11/2006 and search for DetachCurrentThread on the mailing lists for details. The crashes on Solaris seem to be only present in jdk-1.4.2 and lower (jdk-1.5.0 and jdk-1.6.0 are okay), so anyone using directors should use a recent jdk on Solaris, or define (see director.swg) SWIG_JAVA_NO_DETACH_CURRENT_THREAD to the C++ compiler to get old behaviour. 10/12/2007: wsfulton [Java] Ensure the premature garbage collection prevention parameter (pgcpp) is generated when there are C comments in the jtype and jstype typemaps. 10/12/2007: wuzzeb Added a testsuite entry for Bug #1735931 10/09/2007: olly Automatically rerun autogen.sh if configure.in is modified. 10/09/2007: olly Enhance check-%-test-suite rule and friends to give a more helpful error message if you try them for a language which doesn't exist (e.g. "make check-php-test-suite" rather than the correct "make check-php4-test-suite"). 10/09/2007: olly Add make rule to regenerate Makefile from Makefile.in if it has changed. 10/09/2007: olly [php] Fix long-standing memory leak in wrapped constructors and wrapped functions/methods which return an object. 10/08/2007: olly Fix Makefile.in to read check.list files correctly in a VPATH build. 10/07/2007: wsfulton [C#, Java] Experimental shared_ptr typemaps added 09/27/2007: mgossage [lua] added more verbose error messages for incorrect typechecks. Added a routine which checks the exact number of parameters passed to a function (breaks operator_overloading for unary minus operator, currently disabled). Reorganised the luatypemaps.swg to tidy it up. Added a lot of %ignores on the operators not supported by lua. Added support for constant member function pointers & runtest for member_pointer.i Added first version of wchar.i 09/25/2007: wsfulton [C#, Java] throws typemaps for std::wstring using C# patch #1799064 from David Piepgrass 09/24/2007: wsfulton [Tcl] Apply #1771313 to fix bug #1650229 - fixes long long and unsigned long long handling. 09/20/2007: olly [Java] Eliminate some unnecessary uses of a temporary buffer allocated using new[]. SF#1796609. 09/19/2007: wsfulton [C#] The $csinput special variable can be used in the csvarin typemap where it is always expanded to 'value'. 09/19/2007: wsfulton [C#] Fix bug reported by Glenn A Watson and #1795260 where the cstype typemap used the 'ref' keyword in the typemap body, it produced uncompilable C# properties (variable wrappers). The type for the property now correctly comes from the 'out' attribute in the cstype typemap. 09/19/2007: wsfulton [Java] Fix const std::wstring& typemaps 09/19/2007: wsfulton [Java] Ensure the premature garbage collection prevention parameter (pgcpp) is generated where a parameter is passed by pointer reference, eg in the std::vector wrappers. The pgcpp is also generated now when user's custom typemaps use a proxy class in the jstype typemap and a 'long' in the jtype typemap. 09/18/2007: olly [php] Add typemaps for handling parameters of type std::string & which are modified by the wrapped function. 09/17/2007: olly [python] Split potentially long string literals to avoid hitting MSVC's low fixed limit on string literal length - patch from SF#1723770, also reported as SF#1630855. 09/17/2007: olly [ocaml] Fix renaming of overloaded methods in the method_table - my patch from SF#940399. 09/17/2007: olly [python] Simpler code for SWIG_AsVal_bool() which fixes a "strict aliasing" warning from GCC - patch from SF#1724581 by Andrew Baumann. 09/17/2007: olly [perl5] Use sv_setpvn() to set a scalar from a pointer and length - patch from SF#174460 by "matsubaray". 09/17/2007: olly When wrapping C++ code, generate code which uses std::string::assign(PTR, LEN) rather than assigning std::string(PTR, LEN). Using assign generates more efficient code (tested with GCC 4.1.2). 09/07/2007: wsfulton Fix %ignore on constructors which are not explicitly declared [SF #1777712] 09/05/2007: wuzzeb (John Lenz) - Change r_ltype in typesys.c to store a hashtable instead of a single value. several very subtle bugs were being caused by multiple ltypes being mapped to a single mangled type, mostly when using typedefed template parameters. Now, r_ltype stores a hashtable of possible ltypes, and when generating the type table, all the ltypes are added into the swig_type_info structure. 08/31/2007: wsfulton SF #1754967 from James Bigler. - Fix bug in turning on warnings that were turned off by default. Eg 'swig -w+309' will now turn on the normally suppressed warning 309. - New -Wextra commandline option which enables the extra warning numbers: 202,309,403,512,321,322 (this is the list of warnings that have always been suppressed by default). By specifying -Wextra, all warnings will be turned on, but unlike -Wall, warnings can still be selectively turned on/off using %warnfilter, #pragma SWIG nowarn or further -w commandline options, eg: swig -Wextra -w309 will turn on all warnings except 309. 08/28/2007: wsfulton - New debugging options, -debug-module and -debug-top to display the parse tree at various stages, where is a comma separated list of stages 1-4.For example, to display top of parse tree at stages 1 and 3: swig -debug-top 1,3 - Deprecate the following options which have equivalents below: -dump_parse_module => -debug-module 1 -dump_module => -debug-module 4 -dump_parse_top => -debug-top 1 -dump_top => -debug-top 4 - Renamed some commandline options for naming consistency across all options: -debug_template => -debug-template -debug_typemap => -debug-typemap -dump_classes => -debug-classes -dump_tags => -debug-tags -dump_typedef => -debug-typedef -dump_memory => -debug-memory 08/25/2007: olly [PHP5] Fix handling of double or float parameters with an integer default value. 08/25/2007: olly [PHP5] Generate __isset() methods for setters for PHP 5.1 and later. 08/20/2007: wsfulton [Java C#] Fix director bug #1776651 reported by Stephane Routelous which occurred when the director class name is the same as the start of some other symbols used within the director class. 08/17/2007: wsfulton Correct behaviour for templated methods used with %rename or %ignore and the empty template declaration - %template(). A warning is issued if the method has not been renamed. 08/16/2007: mutandiz (Mikel Bancroft) [allegrocl] Name generated cl file based on input file rather than by module name. It was possible to end up with a mypackage.cl and a test_wrap.c when parsing a test.i input file. Confusing. Also, include external-format templates for :fat and :fat-le automatically to avoid these being compiled at runtime. 08/15/2007: efuzzyone [cffi] Apply patch #1766076 from Leigh Smith adding support for newly introduced in cffi :long-long and :unsigned-long-long. 08/10/2007: wsfulton [Java] Add documentation patch #1743573 from Jeffrey Sorensen. It contains a neat idea with respect to better memory management by the JVM of C++ allocated memory. 08/10/2007: wsfulton [Perl] Apply patch #1771410 from Wade Brainerd to fix typedef XS(SwigPerlWrapper) in perlrun.swg for ActiveState Perl build 822 and Perl 5.8.9 and 5.10 branches. 08/10/2007: wsfulton [Lua] const enum reference typemaps fixed. 08/09/2007: wsfulton [C#] Added missing support for C++ class member pointers. 08/09/2007: wsfulton [C#, Java] Add support for $owner in the "out" typemaps like in the scripting language modules. Note that $owner has always been supported in the "javaout" / "csout" typemaps. 08/01/2007: wsfulton Fix smart pointer handling for classes that have templated methods within the smart pointer type. Problem reported by craigdo at ee.washington.edu. 07/31/2007: efuzzyone [cffi] fixed memory access after being freed bug. thanks to Martin Percossi. package name clos changed to cl. thanks to Ralf Mattes 07/24/2007: wsfulton Parallel make support added for the examples and test-suite for developers who have more than one CPU. Now parallel make can be used for checking in addition to building the SWIG executable. Some typical checking examples: make -j8 -k check make -j4 check-java-test-suite make -j2 check-java-examples 07/19/2007: mgossage Fixed bug that stopped configure working on mingw (applied dos2unix to configure.in) 07/10/2007: mgossage [lua] Extra compatibility with Lua 5.1 (updated SWIG_init, docs, examples, test suite) Removed name clash for static link of multiple modules 07/05/2007: mgossage [lua] Fix a bug in SWIG_ALLOC_ARRAY() improved the error messages for incorrect arguments. Changed the output of swig_type() to use the human readable form of the type, rather than the raw swig type. 07/03/2007: wsfulton [C#] Fix directors for some overloaded methods where the imtype resulted in identical methods being generated in the C# director class, eg void foo(int *) and void foo(double *) used to generated two of these: private void SwigDirectorfoo(IntPtr p) { ... } 06/25/2007: wsfulton [Java, C#] Some parameter name changes in std_vector.i allowing better targeting of typemaps for method parameters (for memory management of containers of pointers). 06/07/2007: mutandiz (Mikel Bancroft) [allegrocl] fix foreign-type constructor to properly look for ffitype typemap bindings. fix inout_typemaps.i for strings. 06/06/2007: olly [Ruby] Use whichever of "long" or "long long" is the same size as "void*" to hold pointers as integers, rather than whichever matches off_t. Fixes compilation on OS X and GCC warnings on platforms where sizeof(void*) < sizeof(off_t) (SF patch #1731979). 06/06/2007: olly [PHP5] Fix handling of a particular case involving overloaded functions with default parameters. 06/05/2007: mutandiz (Mikel Bancroft) [allegrocl] Fix case where we'd pass fully qualified identifiers (i.e. NS1::NS2::FOO) to swig-insert-id. All namespaces should be stripped. Fix bug in TypedefHandler introduced by last fix. 06/05/2007: olly Fix reporting of filenames in errors after %include (patch from Leigh Smith in #1731040; also reported as #1699940). 05/31/2007: olly [Python] Fix "missing initialiser" warning when compiling generated C/C++ wrapper code with Python 2.5 with warnings enabled (patch from bug#1727668 from Luke Moore). 05/29/2007: olly [Python] Split docstrings into separate string literals at each newline when generating C/C++ wrapper code (the C/C++ compiler will just combine them back into a single string literal). This avoids MSVC complaining that the strings are too long (problem reported by Bo Peng on the mailing list). 05/28/2007: olly [Python] Escape backslashes in docstrings. 05/26/2007: olly [Python] Fix autodoc generation of enums to be more consistent with how the enums are wrapped - patch #1697226 from Josh Cherry. 05/26/2007: olly [PHP5] Fix wrapping of methods and functions which return a pointer to a class (bug#1700788) and those which have overloaded forms returning both classes and non-classes (bug#1712717, thanks to Simon Berthiaume for the patch). 05/25/2007: wsfulton Fixed %rename inconsistency in conversion operators as reported by Zhong Ren. The matching is now done on the operator name in the same way as it is done for parameters. For example: %rename(opABC) Space::ABC::operator ABC() const; %rename(methodABC) Space::ABC::method(ABC a) const; namespace Space { class ABC { public: void method(ABC a) const {} operator ABC() const { ABC a; return a; } }; } Note that qualifying the conversion operator previously may or may not have matched. Now it definitely won't, so this will not match: %rename(opABC) Space::ABC::operator Space::ABC() const; in the same way that this does not match: %rename(methodABC) Space::ABC::method(Space::ABC a) const; The documentation has been improved with respect to %rename, namespaces and templates. Conversion operators documentation too. *** POTENTIAL INCOMPATIBILITY *** 05/16/2007: mutandiz [allegrocl] Fix bad generation of local var ltype's in functionWrapper(). Try to work better with the backward order in which swig unrolls nested class definitions. cleaned up a little unnecessary code/debug printf's. Remove warning when replacing $ldestructor for ff:foreign-pointer 05/12/2007: olly [Python] swig -python -threads now generates C/C++ code which uses Python's own threading abstraction (from pythread.h) rather than OS specific code. The old code failed to compile on MS Windows. (See SF patch tracker #1710341). 05/04/2007: gga [Ruby] Changed STL renames to be global renames. This fixes STL functions not being renamed when autorename is on. This is a not a totally perfect work-around, but better. Someone really needs to fix the template renaming code. (See bug #1545634) 05/04/2007 gga [All] Changed %rename("%(undercase)s") a little so that single numbers at the end of a function are not undercased. That is: getSomething -> get_something get2D -> get_2d get234 -> get_234 BUT: asFloat2 -> as_float2 (Bug #1699714) 05/03/2007: gga [Ruby] Made __swigtype__ => @__swigtype__ so it can be accessed from the scripting language (and follows Ruby's official documentation, just in case). Made tracking => @__trackings__ for same reason. Currently storing ivars without the @ seems valid, but the PickAxe says this is not correct, so just in case... 05/03/2007: gga [Ruby] Applied patch for -minherit bug and exception classes. This issue should be revisited more closely, as Multiple Inheritance in Ruby is still problematic. (patch/bug #1604878) 05/03/2007: gga [Ruby] Overloaded functions in ruby will now report to the user the possible prototypes when the user mistypes the number or type of a parameter. 05/03/2007: gga [Ruby] Forgot to document the bug fixing of an old bug regarding exceptions. (bug #1458247) 05/03/2007: gga [Ruby] Fixed Ruby documentation to use the proper css styles for each section. Added autodoc section to Ruby's docs to document the features supported by Ruby in documenting its modules. Made rdoc documentation spit out the full name of the class + method name. Albeit this will make the current rdoc not recognize the method, this is still needed to disambiguate between different classes with similar methods (rdoc was created to document the ruby source which only contains one class per c file, unlike swig) I have patched rdoc to make it more friendly to swig. This patch needs to be merged in the ruby std library now. 05/03/2007: gga [Ruby] Changed flag -feature to be -init_name to better reflect its purpose and avoid confusion with -features. 05/03/2007: gga [Ruby] Improved autodoc generation. Added autodoc .swg files to Ruby library for easily adding documentation to common Ruby methods and STL methods. Fixed autodoc documenting of getters and setters and module. Made test suite always generate autodocs. 05/03/2007: gga [Ruby] Removed some warnings from STL and test suite. 05/02/2007: mgossage [Lua] Fixed issues with C++ classes and hierachies across multiple source files. Fixed imports test case & added run test. Added Examples/imports. Added typename for raw lua_State* Added documentation on native functions. 05/02/2007: gga [Ruby] Docstrings are now supported. %feature("autodoc") and %feature("docstring") are now properly supported in Ruby. These features will generate a _wrap.cxx file with rdoc comments in them. 05/02/2007: gga [Ruby] STL files have been upgraded to follow the new swig/python Lib/std conventions. This means std::vector, std::set, std::map, set::multimap, std::multiset, std::deque and std::string are now properly supported, including their iterators, support for containing ruby objects (swig::GC_VALUE) and several other ruby enhancements. std::complex, std::ios, std::iostream, std::iostreambuf and std::sstream are now also supported. std::wstring, std::wios, std::wiostream, std::wiostreambuf and std::wsstream are supported verbatim with no unicode conversion. std_vector.i now mimics the behavior of Ruby Arrays much more closely, supporting slicing, shifting, unshifting, multiple indexing and proper return values on assignment. COMPATABILITY NOTE: this changes the older api a little bit in that improper indexing would previously (incorrectly) raise exceptions. Now, nil is returned instead, following ruby's standard Array behavior. 05/02/2007: gga [Ruby] Changed the value of SWIG_TYPECHECK_BOOL to be 10000 (ie. higher than that of all integers). This is because Ruby allows typecasting integers down to booleans which can make overloaded functions on bools and integers to fail. (bug# 1488142) 05/02/2007: gga [Ruby] Fixed a subtle bug in multiple argouts that could get triggered if the user returned two or more arguments and the first one was an array. 05/01/2007: gga [Ruby] Improved the documentation to document the new features added, add directorin/out/argout typemaps, etc. 05/01/2007: gga [Ruby] Added %initstack and %ignorestack directives for director functions. These allow you to control whether a director function should re-init the Ruby stack. This is sometimes needed for an embedded Ruby where the director method is used as a C++ callback and not called by the user from ruby code. Explanation: Ruby's GC needs to be aware of the running OS stack in order to mark any VALUE (Ruby objects) it finds there to avoid collection of them. This allows the ruby API to be very simple and allows you to write code like "VALUE a = sth" anywhere without needing to do things like refcounting like python. By default, the start of the stack is set when ruby_init() is called. If ruby is inited within main(), as it usually is the case with the main ruby executable, ruby will be able to calculate its stack properly. However, when this is not possible, as when ruby is embedded as a plugin to an application where main is not available, ruby_init() will be called in the wrong place, and ruby will be incorrectly tracking the stack from the function that called ruby_init() forwards only, which can lead to all sorts of weird crashes or to ruby thinking it has run out of stack space incorrectly. To avoid this, director (callback) functions can now be tagged to try to reset the ruby stack, which will solve the issues. NOTE: ruby1.8.6 still contains a bug in it in that its function to reset the stack will not always do so. This bug is triggered very rarely, when ruby is called from two very distinct places in memory, like a branch of main() and another dso. This bug has now been reported to ruby-core and is pending further investigation. (bug #1700535 and patch #1702907) 04/30/2007: wsfulton Fix #1707582 - Restore building from read-only source directories. 04/30/2007: gga [Ruby] Ruby will now report the parameter index properly on type errors as well as the class and value of the incorrect argument passed. (feature request #1699670) 04/30/2007: gga [Ruby] Ruby no longer creates the free_Class function if the class contains its own user defined free function (%freefunc). (bug #1702882) 04/30/2007: gga [Ruby] Made directors raise a ruby exception for incorrect argout returned values if RUBY_EMBEDDED is set, instead of throwing an actual SwigDirector exception. This will prevent crashes when ruby is embedded and unaware of the SwigDirector exception. 04/30/2007: gga [Ruby] Removed the need for -DSWIGEXTERN. Changed swig_ruby_trackings to be a static variable, but also be kept within a hidden instance variable in the SWIG module. This allows properly dealing with trackings across multiple DSOs, which was previously broken. (bug #1700535 and improvement to patch #1702907) 04/29/2007: gga [Ruby] Fixed GC memory issues with trackings that could lead to segfaults when dealing, mainly, with static variables. (bug #1700535 and patch #1702907) 04/29/2007: gga [Ruby] Fixed String conversion using old ruby1.6 macros. Now StringValuePtr() is used if available. This removes warnings when converting strings with \0 in them. (bug #1700535 and patch #1702907) 04/29/2007: gga [Ruby] Fixed the argout count in directors for Ruby. Previously, ignored or "numinputs=0" typemaps would incorrectly not get counted towards the argout count. (bug/patch #1545585) 04/29/2007: gga [Ruby] Upgraded Ruby converter to recognize "numinputs=0". Previously, only the old "ignore" flag was checked (which would currently still work properly, but is deprecated). 04/29/2007: gga [Ruby - but should be made generic] %feature("numoutputs","0") added. This feature allows you to ignore the output of a function so that it is not added to a list of output values ( ie. argouts ). This should also become a feature of %typemap(directorout) as "numoutputs"=0, just like "numinputs"=0 exists. %feature("directors"=1) %include %feature("numoutputs","0") { Class::member_function1 }; %typemap(out) MStatus { // some code, like check mstatus // and raise exception if wrong }; %inline %{ typedef int MStatus; class Class { // one argument returned, but director out code added // MStatus is discarded as a return (out) parameter. virtual MStatus member_function1( int& OUTPUT ); // two arguments returned, director out code added // MStatus is not discarded virtual MStatus member_function2( int& OUTPUT ); }; %} 04/21/2007: olly Fix parsing of float constants with an exponent (e.g. 1e-02f) (bug #1699646). 04/20/2007: olly [Python] Fix lack of generation of docstrings when -O is used. Also, fix generation of docstrings containing a double quote character. Patch from Richard Boulton in bug#1700146. 04/17/2007: wsfulton [Java, C#] Support for adding in Java/C# code before and after the intermediary call, specifically related to the marshalling of the proxy type to the intermediary type. The javain/csin typemap now supports the 'pre' and 'post' attributes to achieve this. The javain typemap also supports an optional 'pgcppname' attribute for premature garbage collection prevention parameter naming and the csin typemap supports an optional 'cshin' attribute for the parameter type used in a constructor helper generated when the type is used in a constructor. Details in the Java.html and CSharp.html documentation. 04/16/2007: olly Don't treat `restrict' as a reserved identifier in C++ mode (bug#1685534). 04/16/2007: olly [PHP5] Fix how zend_throw_exception() is called (bug #1700785). 04/10/2007: olly Define SWIGTEMPLATEDISAMBIGUATOR to template for aCC (reported on swig-user that this is needed). 04/04/2007: olly [PHP5] If ZTS is enabled, release _globals_id in MSHUTDOWN to avoid PHP interpreter crash on shutdown. This solution was suggested here: http://bugs.php.net/bug.php?id=40985 04/03/2007: olly [PHP4] Add missing ZTS annotations to generated C++ wrapper code to fix compilation failures when using ZTS enabled SWIG (Linux distributions tend to disable ZTS, but notably the Windows build uses it by default). 04/01/2007: efuzzyone [CFFI] Patch #1684261: fixes handling of unsigned int literals, thanks Leigh Smith. Also, improved documentation. 03/30/2007: olly Avoid generating '<:' token when using SwigValueWrapper<> on a type which starts with '::' (patch #1690948). 03/25/2007: wuzzeb (John Lenz) [perl5] Add SWIG_fail to the SWIG_exception macro. Fixes a few problems reported on the mailing list. 03/23/2007: wsfulton String copying patch from Josh Cherry reducing memory consumption by about 25%. 03/21/2007: wsfulton [Java] Apply patch #1631987 from Ulrik Peterson - bool INOUT typemaps fail on big endian machines. 03/16/2007: wsfulton Fix seg fault given dodgy C++ code: namespace abc::def { } 03/16/2007: wsfulton [Java] Fixes so that ARRAYSOFCLASSES and ARRAYSOFENUMS in arrays_java.i can be applied to pointer types. 03/03/2007: olly [PHP5] When we know the literal numeric value for a constant, use that to initialise the const member in the PHP wrapper class. 03/02/2007: olly [PHP5] Fix PHP wrapper code generated for certain cases of overloaded forms with default arguments. 02/26/2007: efuzzyone [CFFI] Patch #1656395: fixed hex and octal values bug, thanks to Arthur Smyles. 02/22/2007: mgossage [Lua] Fixed bug in typemaps which caused derived_byvalue and rname test cases to fail. Updated derived_byvalue.i to explain how to find and fix the problem 01/25/2007: wsfulton Fix #1538522 and #1338527, forward templated class declarations without a name for the templated class parameters, such as: template class X; 01/23/2007: mgossage [Lua] Patch #1640862: replaced by Patch #1598063 Typo in typemaps.i 01/22/2007: mgossage [Lua] Added a lua specific carrays.i which adds the operator[] support. modified the main code to make it not emit all the class member functions & accessors Note: C structs are created using new_XXX() while C++ classes use XXX() (should be standardised) Updated test case: li_carrays Updated the documentation. 01/12/2007: wsfulton [Php] Add support for newfree typemaps (sometimes used by %newobject) 01/12/2007: beazley New command line option -macroerrors. When supplied, this will force the C scanner/parser to report proper location information for code contained inside SWIG macros (defined with %define). By default, SWIG merely reports errors on the line at which a macro is used. With this option, you can expand the error back to its source---something which may simplify debugging. 01/12/2007: beazley [Internals] Major overhaul of C/C++ scanning implementation. For quite some time, SWIG contained two completely independent C/C++ tokenizers-- the legacy scanner in CParse/cscanner.c and a general purpose scanner in Swig/scanner.c. SWIG still has two scanning modules, but the C parser scanner (CParse/cscanner.c) now relies upon the general purpose scanner found in Swig/scanner.c. As a result, it is much smaller and less complicated. This change also makes it possible to maintain all of the low-level C tokenizing in one central location instead of two places as before. ***POTENTIAL FLAKINESS*** This change may cause problems with accurate line number reporting as well as error reporting more generally. I have tried to resolve this as much as possible, but there might be some corner cases. 01/12/2007: mgossage [Lua] Added typemap throws for std::string*, typemap for SWIGTYPE DYNAMIC, changed the existing throws typemap to throw a string instead of making a copy of the object (updating a few test cases to deal with the change). fixed test case: dynamic_casts, exception_partial_info, li_std_string, size_t 01/03/2007: beazley [Internals]. Use of swigkeys.c/.h variables is revoked. Please use simple strings for attribute names. 12/30/2006: beazley Internal API functions HashGetAttr() and HashCheckAttr() have been revoked. Please use Getattr() to retrieve attributes. The function Checkattr() can be used to check attributes. Note: These functions have been revoked because they only added a marginal performance improvement at the expense code clarity. 12/26/2006: mgossage [Lua] Added more STL (more exceptions, map, size_t), fixed test case: conversion_ns_template. 12/21/2006: mgossage [Lua] Update to throw errors when setting immutables, and allowing user addition of module variables. 12/20/2006: wsfulton Fix typedef'd variable wrappers that use %naturalvar, eg, std::string. 12/14/2006: wsfulton [C#] Add std::wstring and wchar_t typemaps 12/14/2006: olly [php] Fix bug #1613673 (bad PHP5 code generated for getters and setters). 12/02/2006: wsfulton, John Lenz, Dave Beazley Move from cvs to Subversion for source control 11/30/2006: beazley Cleaned up swigwarnings.swg file not to use nested macro definitions. 11/12/2006: wsfulton [Java, C#] Fix for %extend to work for static member variables. Version 1.3.31 (November 20, 2006) ================================== 11/12/2006: Luigi Ballabio [Python] Alternate fix for Python exceptions bug #1578346 (the previous one broke Python properties in modern classes) 11/12/2006: wsfulton -fakeversion commandline option now generates the fake version into the generated wrappers as well as displaying it when the -version commandline option is used. 14/11/2006: mgossage [lua] update to typemap for object by value, to make it c89 compliant Version 1.3.30 (November 13, 2006) ================================== 11/12/2006: wsfulton [java] Remove DetachCurrentThread patch from 08/11/2006 - it causes segfaults on some systems. 11/12/2006: wsfulton [python] Fix #1578346 - Python exceptions with -modern 11/10/2006: wsfulton Fix #1593291 - Smart pointers and inheriting from templates 11/09/2006: wsfulton Fix director operator pointer/reference casts - #1592173. 11/07/2006: wsfulton Add $self special variable for %extend methods. Please use this instead of just 'self' as the C++ 'this' pointer. 11/07/2006: mutandiz [allegrocl] allegrocl.swg: swig-defvar updated to allow specifying of non-default foreign type (via :ftype keyword arg). allegrocl.cxx: Specify proper access type for enum values. 11/03/2006: wsfulton [Java/C#] Fix const std::string& return types for directors as reported by Mark Donselzmann 10/29/2006: wsfulton [Java] Remove DeleteLocalRef from end of director methods for now as it is causing a seg fault when run on Solaris 8. 10/29/2006: wuzzeb (John Lenz) [Guile] Patch from Chris Shoemaker to clean up some warnings in the generated code. 10/29/2006: wsfulton [Java] Important fix to prevent early garbage collection of the Java proxy class while it is being used in a native method. The finalizer could destroy the underlying C++ object while it was being used. The problem occurs when the proxy class is no longer strongly reachable after a native call. The problem seems to occur in memory stress situations on some JVMs. It does not seem to occur on the Sun client JVM up to jdk 1.5. However the 1.6 client jdk has a more aggressive garbage collector and so the problem does occur. It does occur on the Sun server JVMs (certainly 1.4 onwards). The fix entails passing the proxy class into the native method in addition to the C++ pointer in the long parameter, as Java classes are not collected when they are passed into JNI methods. The extra parameter can be suppressed by setting the nopgcpp attribute in the jtype typemap to "1" or using the new -nopgcpp commandline option. See Java.html#java_pgcpp for further details on this topic. 10/24/2006: wsfulton [C#] Fix smart pointer wrappers. The virtual/override/new keyword is not generated for each method as the smart pointer class does not mirror the underlying pointer class inheritance hierarchy. SF #1496535 10/24/2006: mgossage [lua] added support for native methods & member function pointers. fixed test cases arrays_dimensionless & cpp_basic. Added new example (functor). tidied up a little of the code (around classHandler). 10/17/2006: wsfulton [C#, Java] directorout typemap changes to fall in line with the other director languages. $result is now used where $1 used to be used. Please change your typemaps if you have a custom directorout typemap. 10/18/2006: wsfulton Some fixes for applying the char array typemaps to unsigned char arrays. 10/17/2006: wsfulton [C#, Java] Add in const size_t& and const std::size_t& typemaps. 10/15/2006: efuzzyone [CFFI] Suppress generating defctype for enums, thanks to Arthur Smyles. Patch 1560983. 10/14/2006: wuzzeb (John Lenz) [Chicken] Minor fix to make SWIG work with the (as yet unreleased) chicken 2.5 [Guile,Chicken] Fix SF Bug 1573892. Added an ext_test to the test suite to test this bug, but this test can not really be made generic because the external code must plug into the target language interpreter directly. See Examples/test-suite/chicken/ext_test.i and ext_test_external.cxx Added a %.externaltest to common.mk, and any interested language modules can copy and slightly modify either the chicken or the guile ext_test.i 10/14/2006: mgossage [Lua] added OUTPUT& for all number types, added a long long type fixed several test cases. update: changed typemaps to use SWIG_ConvertPtr rather than SWIG_MustGetPointer started spliting lua.swg into smaller parts to make it neater 10/13/2006: wsfulton [C#, Java] Marginally better support for multiple inheritance only in that you can control what the base class is. This is done using the new 'replace' attribute in the javabase/csbase typemap, eg in the following, 'Me' will be the base class, no matter what Foo is really derived from in the C++ layer. %typemap(javabase, replace="1") Foo "Me"; %typemap(csbase, replace="1") Foo "Me"; Previously it was not possible for the javabase/csbase typemaps to override the C++ base. 10/12/2006: wsfulton [Java] Remove potential race condition on the proxy class' delete() method (it is now a synchronized method, but is now customisable by changing the methodmodifiers attribute in the javadestruct or javadestruct_derived typemap) [C#] Remove potential race condition on the proxy class' Dispose() method, similar to Java's delete() above. *** POTENTIAL INCOMPATIBILITY *** 10/12/2006: wsfulton [Ruby, Python] Remove redundant director code in %extend methods (%extend methods cannot be director methods) 10/12/2006: wsfulton [Ruby, Python] Fix #1505594 - director objects not returned as director objects in %extend methods. 10/11/2006: wsfulton [Java] Fix #1238798 - Directors using unsigned long long or any other type marshalled across the JNI boundary using a Java class (where the jni typemap contains jobject). 10/06/2006: wsfulton Fix #1162194 - #include/%include within a structure 10/06/2006: wsfulton Fix #1450661, string truncation in String_seek truncating Java/C# enums. 10/06/2006: mgossage [Lua] Fix #1569587. The name is now correct. 10/04/2006: wsfulton Director fixes for virtual conversion operators 10/04/2006: olly [php] Fix #1569587 for PHP. Don't use sizeof() except with string literals. Change some "//" comments to "/* */" for portability. 10/04/2006: mgossage [Lua] Partial Fix #1569587. The type is now correct, but the name is still not correct. 10/03/2006: wsfulton [Ruby] Fix #1527885 - Overloaded director virtual methods sometimes produced uncompilable code when used with the director:except feature. 10/03/2006: wsfulton Directors: Directors are output in the order in which they are declared in the C++ class rather than in some pseudo-random order. 10/03/2006: mmatus Fix #1486281 and #1471039. 10/03/2006: olly [Perl] Fix for handling strings with zero bytes from Stephen Hutsal. 09/30/2006: efuzzyone [CFFI] Bitfield support and vararg support due to Arthur Smyles. C expression to Lisp conversion, thanks to Arthur Smyles for the initial idea, it now supports conversion for a whole range of C expressions. 09/28/2006: wsfulton Fix #1508327 - Overloaded methods are hidden when using -fvirtual optimisation. Overloaded methods are no longer candidates for elimination - this mimics C++ behaviour where all overloaded methods must be defined and implemented in a derived class in order for them to be available. 09/25/2006: wsfulton [Ruby, Python, Ocaml] Fix #1505591 Throwing exceptions in extended directors 09/25/2006: wsfulton Fix #1056100 - virtual operators. 09/24/2006: olly Don't accidentally create a "<:" token (which is the same as "[" in C++). Fixes bug # 1521788. 09/23/2006: olly [Ruby] Support building with recent versions of the Ruby 1.9 development branch. Fixes bug #1560092. 09/23/2006: olly Templates can now be instantiated using negative numbers and constant expressions, e.g.: template class x {}; %template(x_minus1) x<-1>; %template(x_1plus2) x<1+2>; Also, constant expressions can now include comparisons (>, <, >=, <=, !=, ==), modulus (%), and ternary conditionals (a ? b : c). Fixes bugs #646275, #925555, #956282, #994301. 09/22/2006: wsfulton Fix %ignore on director methods - Bugs #1546254, #1543533 09/20/2006: wsfulton Fix %ignore on director constructors 09/20/2006: wsfulton Fix seg faults and asserts when director methods are ignored (#1543533) 09/20/2006: wsfulton Fix out of source builds - bug #1544718 09/20/2006: olly Treat a nested class definition as a forward declaration rather than ignoring it completely, so that we generate correct code for passing opaque pointers to the nested class (fixes SF bug #909387). 09/20/2006: olly *** POTENTIAL INCOMPATIBILITY *** [php] Overload resolution now works. However to allow this, SWIG generated wrappers no longer coerce PHP types (which reverts a change made in 1.3.26). So for example, if a method takes a string, you can no longer pass a number without explicitly converting it to a string in PHP using: (string)x 09/18/2006: mgossage [ALL] fix on swiginit.swg, has been reported to crash on several test cases found and fixed problem in imports under python (mingw) 09/16/2006: wsfulton [Python] Patch from Michal Marek for Python 2.5 to fix 64 bit array indexes on 64 bit machines. 09/13/2006: wsfulton The explicitcall feature has been scrapped. This feature was introduced primarily to solve recursive director method calls. Director upcall improvements made instead: [Python, Ruby, Ocaml] The swig_up flag is no longer used. The required mutexes wrapping this flag are also no longer needed. The recursive calls going from C++ to the target language and back again etc are now avoided by a subtlely different approach. Instead of using the swig_up flag in each director method to indicate whether the explicit C++ call to the appropriate base class method or a normal polymorphic C++ call should be made, the new approach makes one of these calls directly from the wrapper method. [Java, C#] The recursive call problem when calling a C++ base class method from Java/C# is now fixed. The implementation is slightly different to the other languages as the detection as to whether the explicit call or a normal polymorphic call is made in the Java/C# layer rather than in the C++ layer. 09/11/2006: mgossage [ALL] updated swiginit.swg to allow multiple interpreters to use multiple swig modules at once. This has been tested in Lua (mingw & linux), perl5 & python (linux) only. 09/11/2006: mgossage [lua] added support for passing function pointers as well as native lua object into wrappered function. Added example funcptr3 to demonstrate this feature 09/05/2006: olly [php] Rename ErrorCode and ErrorMsg #define-s to SWIG_ErrorCode and SWIG_ErrorMsg to avoid clashes with code the user might be wrapping (patch from Darren Warner in SF bug #1466086). Any user typemaps which use ErrorCode and/or ErrorMsg directly will need adjusting - you can easily fix them to work with both old and new SWIG by changing to use SWIG_ErrorMsg and adding: #ifndef SWIG_ErrorMsg #define SWIG_ErrorMsg() ErrorMsg() #endif 08/29/2006: olly [php] Move constant initialisation from RINIT to MINIT to fix a warning when using Apache and mod_php. We only need to create PHP constants once when we're first initialised, not for every HTTP request. 08/21/2006: mgossage [Lua] Bugfix #1542466 added code to allow mapping Lua nil's <-> C/C++ NULL's updated various typemaps to work correctly with the changes added voidtest_runme.lua to show the features working 08/19/2006: wuzzeb (John Lenz) [Guile] Add feature:constasvar to export constants as variables instead of functions that return the constant value. 08/11/2006: wsfulton [Java] DetachCurrentThread calls have been added so that natively created threads no longer prevent the JVM from exiting. Bug reported by Thomas Dudziak and Paul Noll. 08/10/2006: wsfulton [C#] Fix director protected methods so they work 07/25/2006: mutandiz [allegrocl] more additions to std::string, some tweaks and small bug fixes -nocwrap mode. 07/21/2006: mgossage [Lua] Bugfix #1526022 pdated std::string to support strings with '\0' inside them updated typemaps.i to add support for pointer to pointers 07/19/2006: mutandiz [allegrocl] - Add std_string.i support. - Add newobject patch submitted by mkoeppe (thanks!) - Fix type name mismatch issue for nested type definitions. specifically typedefs in templated class defns. 07/18/2006: mgossage Bugfix #1522858 updated lua.cxx to support -external-runtime command 07/14/2006: wuzzeb (John Lenz) Increment the SWIG_RUNTIME_VERSION to 3, because of the addition of the owndata member in swig_type_info. Reported by: Prabhu Ramachandran 07/05/2006: wsfulton Search path fixes: - Fix search path for library files to behave as documented in Library.html. - Fix mingw/msys builds which did not find the SWIG library when installed. - Windows builds also output the mingw/msys install location when running swig -swiglib. - The non-existent and undocumented config directory in the search path has been removed. 07/05/2006: wsfulton Fix $symname special variable expansion. 07/04/2006: wuzzeb (John Lenz) [Chicken] Add %feature("constasvar"), which instead of exporting a constant as a scheme function, exports the constant as a scheme variable. Update the documentation as well. 07/04/2006: wsfulton [See entry of 09/13/2006 - explicitcall feature and documentation to it removed] New explicitcall feature which generates additional wrappers for virtual methods that call the method explicitly, not relying on polymorphism to make the method call. The feature is a feature flag and is enabled like any other feature flag. It also recognises an attribute, "suffix" for mangling the feature name, see SWIGPlus.html#SWIGPlus_explicitcall documentation for more details. [Java, C#] The explicitcall feature is also a workaround for solving the recursive calls problem when a director method makes a call to a base class method. See Java.html#java_directors_explicitcall for updated documentation. 06/28/2006: joe (Joseph Wang) [r] Initial support for R 06/20/2006: wuzzeb (John Lenz) [Chicken] Minor fixes to get apply_strings.i testsuite to pass Remove integers_runme.scm from the testsuite, because SWIG and Chicken does handle overflows. 06/19/2005: olly [php] Add support for generating PHP5 class wrappers for C++ classes (use "swig -php5"). 06/17/2006: olly [php] Added some missing keywords to the PHP4 keyword list, and fixed __LINE__ and __FILE__ which were in the wrong category. Also added all the keywords new in PHP5, and added comments noting the PHP4 keywords which aren't keywords in PHP5. 06/17/2006: olly [php] Don't segfault if PHP Null is passed as this pointer (e.g. Class_method(Null)) - give a PHP Error instead. 06/15/2006: mutandiz [allegrocl] Add initial support for std::list container class. Fix a few bugs in helper functions. 05/13/2006: wsfulton [Java] Replace JNIEXPORT with SWIGEXPORT, thereby enabling the possibility of using gcc -fvisibility=hidden for potentially smaller faster loading wrappers. 05/13/2006: wsfulton Fix for Makefiles for autoconf-2.60 beta 05/13/2006: wsfulton Vladimir Menshakov patch for compiling wrappers with python-2.5 alpha. 05/12/2006: wsfulton Fix buffer overflow error when using large %feature(docstring) reported by Joseph Winston. 05/12/2006: wsfulton [Perl] Operator overload fix from Daniel Moore. 05/25/2006: mutandiz [allegrocl] Fix bug in generation of CLOS type declarations for unions and equivalent types. 05/24/2006: mutandiz [allegrocl] Don't require a full class definition to generate a CLOS wrapper. 05/20/2006: olly [php] GCC Visibility support now works with PHP. 05/19/2006: olly [php] Removed support for -dlname (use -module instead). Fixed naming of PHP extension module to be consistent with PHP conventions (no "php_" prefix on Unix; on PHP >= 4.3.0, handle Unix platforms which use something other than ".so" as the extension.) 05/13/2006: wsfulton [C#] Director support added 05/07/2006: olly [php] Don't segfault if PHP Null is passed where a C++ reference is wanted. 05/05/2006: olly [php] Fix wrappers generated for global 'char' variables to not include a terminating zero byte in the PHP string. 05/03/2006: wsfulton Modify typemaps so that char * can be applied to unsigned char * or signed char * types and visa versa. 05/03/2006: efuzzyone [cffi]Thanks to Luke J Crook for this idea. - a struct/enum/union is replaced with :pointer only if that slot is actually a pointer to that type. So,: struct a_struct { int x; } and struct b_struct { a_struct struct_1; }; will be converted as: (cffi:defcstruct b_struct (struct_1 a_struct)) - Other minor fixes in lispifying names. 05/02/2006: wsfulton Fix possible redefinition of _CRT_SECURE_NO_DEPRECATE for VC++. 04/14/2006: efuzzyone [cffi] Thanks to Thomas Weidner for the patch. - when feature export is set (export 'foo) is generated for every symbol - when feature inline is set (declaim (inline foo)) is generated before every function definition - when feature intern_function is set #.(value-of-intern-function "name" "nodeType" package) is emitted instead of the plain symbol. A sample swig-lispify is provided. - every symbol is prefixed by it's package. 04/13/2006: efuzzyone [cffi] Fixed the generation of wrappers for global variables. Added the option [no]swig-lisp which turns on/off generation of code for swig helper lisp macro, functions, etc. Version 1.3.29 (March 21, 2006) =============================== 04/05/2006: mutandiz [allegrocl] Fix output typemap of char so it produces a character instead of an integer. Also adds input/output typemaps for 'char *'. add command-line argument -isolate to generate an interface file that won't interfere with other SWIG generated files that may be used in the same application. 03/20/2005: mutandiz [allegrocl] More tweaks to INPUT/OUTPUT typemaps for bool. Fix constantWrapper for char and string literals. find-definition keybindings should work in ELI/SLIME. Output (in-package ) to lisp wrapper instead of (in-package #.*swig-module-name*). slight rework of multiple return values. doc updates. 03/17/2005: mutandiz [allegrocl] mangle names of constants generated via constantWrapper. When using OUTPUT typemaps and the function has a non-void return value, it should be first in the values-list, followed by the OUTPUT mapped values. Fix bug with boolean parameters, which needed to be passed in as int values, rather than T or NIL. 03/15/2006: mutandiz [allegrocl] Generate wrappers for constants when in C++ or -cwrap mode. Make -cwrap the default, since it is most correct. Users can use the -nocwrap option to avoid the creation of a .cxx file when interfacing to C code. When in -nocwrap mode, improve the handling of converting infix literals to prefix notation for lisp. This is very basic and not likely to be improved upon since this only applies to the -nocwrap case. Literals we can't figure out will result in a warning and be included in the generated code. validIdentifier now more closely approximates what may be a legal common lisp symbol. Fix typemap error in allegrocl.swg 03/12/2006: mutandiz [allegrocl] fix up INPUT/OUTPUT typemaps for bool. Generate c++ style wrapper functions for struct/union members when -cwrap option specified. 03/10/2006: mutandiz [allegrocl] Fix bug in C wrapper generation introduced by last allegrocl commit. 03/10/2006: wsfulton [Java] Commit #1447337 - Delete LocalRefs at the end of director methods to fix potential leak 03/10/2006: wsfulton Fix #1444949 - configure does not honor --program-prefix. Removed non-standard configure option --with-release-suffix. Fix the autoconf standard options --program-prefix and --program-suffix which were being shown in the help, but were being ignored. Use --program-suffix instead of --with-release-suffix now. 03/10/2006: wsfulton [Java] Fix #1446319 with patch from andreasth - more than one wstring parameter in director methods 03/07/2006: mkoeppe [Guile] Fix for module names containing a "-" in non-"shadow" mode. Patch from Aaron VanDevender (#1441474). 03/04/2006: mmatus - Add -O to the main program, which now enables -fastdispatch [Python] - Add the -fastinit option to enable faster __init__ methods. Setting 'this' as 'self.this.append(this)' in the python code confuses PyLucene. Now the initialization is done in the the C++ side, as reported by Andi and Robin. - Add the -fastquery option to enable faster SWIG_TypeQuery via a python dict cache, as proposed by Andi Vajda - Avoid to call PyObject_GetAttr inside SWIG_Python_GetSwigThis, since this confuses PyLucene, as reported by Andi Vajda. 03/02/2006: wsfulton [Java] Removed extra (void *) cast when casting pointers to and from jlong as this was suppressing gcc's "dereferencing type-punned pointer will break strict-aliasing rules" warning. This warning could be ignored in versions of gcc prior to 4.0, but now the warning is useful as gcc -O2 and higher optimisation levels includes -fstrict-aliasing which generates code that doesn't work with these casts. The assignment is simply never made. Please use -fno-strict-aliasing to both suppress the warning and fix the bad assembly code generated. Note that the warning is only generated by the C compiler, but not the C++ compiler, yet the C++ compiler will also generate broken code. Alternatively use -Wno-strict-aliasing to suppress the warning for gcc-3.x. The typemaps affected are the "in" and "out" typemaps in java.swg and arrays_java.swg. Users ought to fix their own typemaps to do the same. Note that removal of the void * cast simply prevents suppression of the warning for the C compiler and nothing else. Typical change: From: %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)(void *)&$input; %} To: %typemap(in) SWIGTYPE * %{ $1 = *($&1_ltype)&$input; %} From: %typemap(out) SWIGTYPE * %{ *($&1_ltype)(void *)&$result = $1; %} To: %typemap(out) SWIGTYPE * %{ *($&1_ltype)&$result = $1; %} 03/02/2006: mkoeppe [Guile -scm] Add typemaps for "long long"; whether the generated code compiles, however, depends on the version and configuration of Guile. 03/02/2006: wsfulton [C#] Add support for inner exceptions. If any of the delegates are called which construct a pending exception and there is already a pending exception, it will create the new exception with the pending exception as an inner exception. 03/02/2006: wsfulton [Php] Added support for Php5 exceptions if compiling against Php5 (patch from Olly Betts). 03/01/2006: mmatus Use the GCC visibility attribute in SWIGEXPORT. Now you can compile (with gcc 3.4 or later) using CFLAGS="-fvisibility=hidden". Check the difference for the 'std_containers.i' python test case: Sizes: 3305432 _std_containers.so 2383992 _std_containers.so.hidden Exported symbols (nm -D .so | wc -l): 6146 _std_containers.so 174 _std_containers.so.hidden Execution times: real 0m0.050s user 0m0.039s sys 0m0.005s _std_containers.so real 0m0.039s user 0m0.026s sys 0m0.007s _std_containers.so.hidden Read http://gcc.gnu.org/wiki/Visibility for more details. 02/27/2006: mutandiz [allegrocl] Add support for INPUT, OUTPUT, and INOUT typemaps. For OUTPUT variables, the lisp wrapper returns multiple values. 02/26/2006: mmatus [Ruby] add argcargv.i library file. Use it as follow: %include argcargv.i %apply (int ARGC, char **ARGV) { (size_t argc, const char **argv) } %inline { int mainApp(size_t argc, const char **argv) { return argc; } } then in the ruby side: args = ["asdf", "asdf2"] n = mainApp(args); This is the similar to the python version Lib/python/argcargv.i 02/24/2006: mgossage Small update Lua documents on troubleshooting problems 02/22/2006: mmatus Fix all the errors reported for 1.3.28. - fix bug #1158178 - fix bug #1060789 - fix bug #1263457 - fix 'const char*&' typemap in the UTL, reported by Geoff Hutchison - fixes for python 2.1 and the runtime library - fix copyctor + template bug #1432125 - fix [ 1432152 ] %rename friend operators in namespace - fix gcc warning reported by R. Bernstein - avoid assert when finding a recursive scope inheritance, emit a warning in the worst case, reported by Nitro - fix premature object deletion reported by Paul in tcl3d - fix warning reported by Nitro in VC7 - more fixes for old Solaris compiler - fix for python 2.3 and gc_refs issue reported by Luigi - fix fastproxy for methods using kwargs - fix overload + protected member issue reported by Colin McDonald - fix seterrormsg as reported by Colin McDonald - fix directors, now the test-suite runs again using -directors - fix for friend operator and Visual studio and bug 1432152 - fix bug #1435090 - fix using + %extend as reported by William - fix bug #1094964 - fix for Py_NotImplemented as reported by Olly and Amaury - fix nested namespace issue reported by Charlie and also: - allow director protected members by default - delete extra new lines in swigmacros[UTL] - cosmetic for generated python code - add the factory.i library for UTL - add swigregister proxy method and move __repr__ to a single global module [python] 02/22/2006: mmatus When using directors, now swig will emit all the virtual protected methods by default. In previous releases, you needed to use the 'dirprot' option to achieve the same. If you want, you can disable the new default behaviour, use the 'nodirprot' option: swig -nodirprot ... and/or the %nodirector feature for specific methods, i.e.: %nodirector Foo::bar; struct Foo { virtual ~Foo(); protected: virtual void bar(); }; As before, pure abstract protected members are allways emitted, independent of the 'dirprot/nodirprot' options. 02/22/2006: mmatus Add the factory.i library for languages using the UTL (python,tcl,ruby,perl). factory.i implements a more natural wrap for factory methods. For example, if you have: ---- geometry.h -------- struct Geometry { enum GeomType{ POINT, CIRCLE }; virtual ~Geometry() {} virtual int draw() = 0; // // Factory method for all the Geometry objects // static Geometry *create(GeomType i); }; struct Point : Geometry { int draw() { return 1; } double width() { return 1.0; } }; struct Circle : Geometry { int draw() { return 2; } double radius() { return 1.5; } }; // // Factory method for all the Geometry objects // Geometry *Geometry::create(GeomType type) { switch (type) { case POINT: return new Point(); case CIRCLE: return new Circle(); default: return 0; } } ---- geometry.h -------- You can use the %factory with the Geometry::create method as follows: %newobject Geometry::create; %factory(Geometry *Geometry::create, Point, Circle); %include "geometry.h" and Geometry::create will return a 'Point' or 'Circle' instance instead of the plain 'Geometry' type. For example, in python: circle = Geometry.create(Geometry.CIRCLE) r = circle.radius() where 'circle' now is a Circle proxy instance. 02/17/2006: mkoeppe [MzScheme] Typemaps for all integral types now accept the full range of integral values, and they signal an error when a value outside the valid range is passed. [Guile] Typemaps for all integral types now signal an error when a value outside the valid range is passed. 02/13/2006: mgossage [Documents] updated the extending documents to give a skeleton swigging code with a few typemaps. [Lua] added an extra typemap for void* [in], so a function which requires a void* can take any kind of pointer Version 1.3.28 (February 12, 2006) ================================== 02/11/2006: mmatus Fix many issues with line counting and error reports. 02/11/2006: mmatus [Python] Better static data member support, if you have struct Foo { static int bar; }; then now is valid to access the static data member, ie: f = Foo() f.bar = 3 just as in C++. 02/11/2006: wsfulton [Perl] Fixed code generation to work again with old versions of Perl (5.004 and later tested) 02/04/2006: mmatus [Python] Add the %extend_smart_pointer() directive to extend SWIG smart pointer support in python. For example, if you have a smart pointer as: template class RCPtr { public: ... RCPtr(Type *p); Type * operator->() const; ... }; you use the %extend_smart_pointer directive as: %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; then, if you have something like: RCPtr make_ptr(); int foo(A *); you can do the following: a = make_ptr(); b = foo(a); ie, swig will accept a RCPtr object where a 'A *' is expected. Also, when using vectors %extend_smart_pointer(RCPtr); %template(RCPtr_A) RCPtr; %template(vector_A) std::vector >; you can type a = A(); v = vector_A(2) v[0] = a ie, an 'A *' object is accepted, via implicit conversion, where a RCPtr object is expected. Additionally x = v[0] returns (and sets 'x' as) a copy of v[0], making reference counting possible and consistent. %extend_smart_pointer is just a collections of new/old tricks, including %typemaps and the new %implicitconv directive. 02/02/2006: mgossage bugfix #1356577, changed double=>lua_number in a few places. added the std::pair wrapping 01/30/2006: wsfulton std::string and std::wstring member variables and global variables now use %naturalvar by default, meaning they will now be wrapped as expected in all languages. Previously these were wrapped as a pointer rather than a target language string. It is no longer necessary to add the following workaround to wrap these as strings: %apply const std::string & { std::string *} *** POTENTIAL INCOMPATIBILITY *** 01/28/2006: mkoeppe [Guile -scm] Add typemaps for handling of member function pointers. 01/24/2006: mmatus - Better support for the %naturalvar directive, now it works with the scripting languages as well as Java/C#. Now, it can also be applied to class types: %naturalvar std::string; %include that will tell swig to use the 'natural' wrapping mechanism to all std::string global and member variables. - Add support for the %allowexcept feature along the scripting languages, which allows the %exception feature to be applied to the variable access methods. Also, add the %exceptionvar directive to specify a distintic exception mechanism only for variables. - Add more docs for the %delobject directive to mark a method as a destructor, 'disowning' the first argument. For example: %newobject create_foo; %delobject destroy_foo; Foo *create_foo() { return new Foo(); } void destroy_foo(Foo *foo) { delete foo; } or in a member method as: %delobject Foo::destroy; class Foo { public: void destroy() { delete this;} private: ~Foo(); }; 01/24/2006: mgossage [Lua] - Removed the type swig_lua_command_info & replace with luaL_reg (which then broke the code), fixed this - added an additional cast in the typemaps for enum's due to the issue that VC.Net will not allow casting of a double to an enum directly. Therefore cast to int then to enum (thanks to Jason Rego for this observation) 01/16/2006: mmatus (Change disabled... will be back in CVS soon) Add initial support for regexp via the external library RxSpencer. SWIG doesn't require this library to compile and/or run. But if you specify --with-rxspencer, and the library is found during installation, then swig will use it in three places: - In %renames rules, via the new rxsmatch rules, for example: %rename("%(lowercase)",rxsmatch$name="GSL_.*") ""; %rename("%(lowercase)",rxsmatch$nodeType="enum GSL_.*") ""; rxsmatch is similar to the match rule, it just uses the RxSpencer regexp library to decide if there is a match with the provided regexp. As with the match rule, you can also use the negate rule notrxsmatch. - In the %rename target name via the rxstarget option, for example: %rename("%(lowercase)",rxstarget=1) "GSL_.*"; where the target name "GSL.*" is now understood as a regexp to be matched. - In the new encoder "rxspencer", which looks like: %(rxspencer:[regexp][replace])s where "regexp" is the regular expression and "replace" is a string used as a replacement, where the @0,@1,...,@9 pseudo arguments are used to represent the corresponding matching items in the reg expression. For example: %(rxspencer:[GSL.*][@0])s <- Hello -> %(rxspencer:[GSL.*][@0])s <- GSLHello -> GSLHello %(rxspencer:[GSL(.*)][@1])s <- GSLHello -> Hello %(rxspencer:[GSL(.*)][gsl@1])s <- GSLHello -> gslHello Another example could be: %rename("%(lowercase)s",sourcefmt="%(rxspencer:[GSL_(.*)][@1])s",%$isfunction) ""; which take out the prefix "GSL_" and returns all the function names in lower cases, as following: void GSL_Hello(); -> hello(); void GSL_Hi(); -> hi(); const int GSL_MAX; -> GSL_MAX; // no change, is not a function We use the RxSpencer as an initial test bed to implemention while we decide which library will be finally added to swig. You can obtain the RxSpencer library from http://arglist.com/regex (Unix) or http://gnuwin32.sourceforge.net/packages.html (Windows) Once installed, use "man rxspencer" to get more info about the regexp format, or just google rxspencer. Since now you can enable the rxsmatch rules (see above), the simple or '|' support for the match rules (01/12/2006: mmatus) is disabled. Still, if you have problems with the rxspencer library, you can re-enable the simple 'match or' support using -DSWIG_USE_SIMPLE_MATCHOR. 01/16/2006: mmatus Change the %rename predicates to use the prefix '%$', as in: %rename("%(utitle)s",%$isfunction,%$ismember) ""; to avoid clashes with other swig macros/directives. 01/14/2006: cfisavage [Ruby] Added support for Ruby bang! methods via a new %bang feature. Bang methods end in exclamation points and indicate that the object being processed will be modified in-place as opposed to being copied. 01/12/2006: cfisavage [Ruby] Updated the Ruby module to automatically convert method names to lower_case_with_underscores using the new %rename functionality. 01/12/2006: mmatus - Add aliases for 'case' encoders used with %rename/%namewarn %(uppercase)s hello_world -> HELLO_WORLD %(lowercase)s HelloWorld -> helloworld %(camelcase)s hello_world -> HelloWorld %(undercase)s HelloWorld -> hello_world 01/12/2006: mmatus - Add the -dump_parse_module and -dump_parse_top options, which are similar to -dump_module and -dump_top, but they dump the node trees just after parsing, showing only the attributes visible at the parsing stage, and not the added later in typemap.cxx, allocate.cxx, lang.cxx or elsewhere. Besides debugging porpuses, these options are very useful if you plan to use %rename in an "advance way", since it shows only and all the node's attributes you can use inside the match rules. 01/12/2006: mmatus - Add predicates to %rename, so, you don't need to remember, for example, how to match a member function. Now it is easy, for example to use the 'utitle' encoder in all the member methods, you type: %rename("%(utitle)s",%isfunction,%ismember) ""; or to ignore all the enumitems in a given class: %rename("$ignore", %isenumitem, %classname="MyClass") ""; Available predicates are (see swig.swg): %isenum %isenumitem %isaccess %isclass %isextend %isextend %isconstructor %isdestructor %isnamespace %istemplate %isconstant %isunion %isfunction %isvariable %isimmutable %isstatic %isfriend %istypedef %isvirtual %isexplicit %isextern %ismember %isglobal %innamespace %ispublic %isprotected %isprivate %classname These predicates correspond to specific 'match' declarations, which sometimes are not as evident as the predicates names. - Add the or '|' operation in %rename match, for example to capitalize all the constants (%constant or const cdecl): %rename("%(upper)s",match="cdecl|constant",%isimmutable) ""; 01/12/2006: mgossage - Partial fixed of errors under C89, bug #1356574 (converted C++ style comments to C style) - Added patches from neomantra@users.sf.net #1379988 and #1388343 missing a 'return' statement for error conditions also updated the %init block bug #1356586 01/10/2006: mmatus - Add the 'utitle' encoder, as an example of how to add your own encoder. I added the encoder method in misc.c but developers can add others, the same way, inside any target language. Well, 'utitle' is the reverse of 'ctitle', ie: %rename("%(ctitle)s") camel_case; -> CamelCase; %rename("%(utitle)s") CamelCase; -> camel_case; 01/10/2006: cfisavage [Ruby] Updated Ruby Exception handling. Classes that are specified in throws clauses, or are marked as %exceptionclass, are now inherited from rb_eRuntimeError. This allows instances of these classes to be returned to Ruby as exceptions. Thus if a C++ method throws an instance of MyException, the calling Ruby method will get back a MyException object. To see an example, look at ruby/examples/exception_class. 01/10/2006: mmatus - Add the %catches directive, which complements the %exception directive in a more automatic way. For example, if you have int foo() throw(E1); swig generates the proper try/catch code to dispatch E1. But if you have: int barfoo(int i) { if (i == 1) { throw E1(); } else { throw E2(); } return 0; } ie, where there is no explicit exception specification in the decl, you end up doing: %exception barfoo { try { $action } catch(E1) { ... } } catch(E2) { ... } } which is very tedious. Well, the %catches directive defines the list of exceptions to catch, and from swig: %catches(E1,E2) barfoo(int i); int barfoo(int i); is equivalent to int barfoo(int i) throw(E1,E2); Note, however, that the %catches list doesn't have to correspond to the C++ exception specification. For example, if you have: struct E {}; struct E1 : E {}; struct E2 : E {}; int barfoo(int i) throw(E1,E2); you can define %catches(E) barfoo(int i); and swig will generate an action code equivalent to try { $action } catch(E &_e) { ; } Of course, you still have to satisfy the C++ restrictions, and the catches list must be compatible (not the same) as the original list of types in the exception specification. Also, you can now specify that you want to catch the unknown exception '...', for example: %catches(E1,E2,...) barfoo(int); In any case, the %catches directive will emit the code to convert into the target language error/exception using the 'throws' typemap. For the '...' case to work, you need to write the proper typemap in your target language. In the UTL, this looks like: %typemap(throws) (...) { SWIG_exception(SWIG_RuntimeError,"unknown exception"); } 01/09/2006: mutandiz [Allegrocl] Fixes a number of SEGVs primarily in the handling of various anonymous types. Found in a pass through the swig test-suite. Still more to do here, but this is a good checkpoint. Adds -cwrap and -nocwrap as an allegrocl specific command-line argument. Controls generating of a C wrapper file when wrapping C code. By default only a lisp file is created for C code wrapping. Doc updates for the command-line arguments and fixes as pointed out on swig-devel 01/05/2006: wsfulton [Java] Fix unsigned long long and const unsigned long long & typemaps - Bug #1398394 with patch from Dries Decock 01/06/2006: mmatus Add 'named' warning codes, now in addition to: %warnfilter(813); you can use %warnfilter(SWIGWARN_JAVA_MULTIPLE_INHERITANCE); just use the same code name found in Source/Include/swigwarn.h plus the 'SWIG' prefix. If a developer adds a new warning code, the Lib/swigwarn.swg file will be generated when running the top level make. 01/05/2006: cfisavage [Ruby] Reimplemented object tracking for Ruby. The new implementation works by expanding the swig_class structure for Ruby by adding a trackObjects field. This field can be set/unset via %trackobjects as explained in the Ruby documentation. The new implementation is more robust and takes less code to implement. 01/05/2006: wsfulton Fix for %extend and static const integral types, eg: class Foo { public: %extend { static const int bar = 42; } }; 12/30/2005: mmatus - Add info for old and new debug options: -dump_top - Print information of the entire node tree, including system nodes -dump_module - Print information of the module node tree, avoiding system nodes -dump_classes - Print information about the classes found in the interface -dump_typedef - Print information about the types and typedefs found in the interface -dump_tags - Print information about the tags found in the interface -debug_typemap - Print information for debugging typemaps -debug_template - Print information for debugging templates - Add the fakeversion. If you have a project that uses configure/setup.py, or another automatic building system and requires a specific swig version, let say 1.3.22 you can use: SWIG_FEATURES="-fakeversion 1.3.22" or swig -fakeversion 1.3.22 and then swig -version will report 1.3.22 instead of the current version. Typical use would be SWIG_FEATURES="-fakeversion 1.3.22" ./configure 12/30/2005: mmatus - Add option/format support to %rename and %namewarn. Now %namewarn can force renaming, for example: %namewarn("314: import is a keyword",rename="_%s") "import"; and rename can also support format forms: %rename("swig_%s") import; Now, since the format is processed via swig Printf, you can use encoders as follows: %rename("%(title)s") import; -> Import %rename("%(upper)s") import; -> IMPORT %rename("%(lower)s") Import; -> import %rename("%(ctitle)s") camel_case; -> CamelCase This will allow us to add more encoders, as the expected one for regular expressions. - Add the above 'ctitle' encoder, which does the camel case: camel_case -> CamelCase - Also, while we get the regexp support, add the 'command' encoder, you can use it as follows %rename("%(command:sed -e 's/\([a-z]\)/\U\\1/' <<< )s") import; then swig will popen the command "sed -e 's/\([a-z]\)/\U\\1/' <<< import" see below for anonymous renames for better examples. - The rename directive now also allows: - simple match: only apply the rename if a type match happen, for example %rename(%(title)s,match="enumitem") hello; enum Hello { hi, hello -> hi, Hello }; int hello() -> hello; - extended match: only apply the rename if the 'extended attribute' match occurred, for example: // same as simple match %rename(%(title)s,match$nodeType="enumitem") hello; enum Hello { hi, hello -> hi, Hello }; Note that the symbol '$' is used to define the attribute name in a 'recursive' way, for example: // match only hello in 'enum Hello' %rename(%(title)s,match$parentNode$type="enum Hello") hello; enum Hello { hi, hello -> hi, Hello // match }; enum Hi { hi, hello -> hi, hello // no match }; here, for Hello::hi, the "parentNode" is "Hello", and its "type" is "enum Hello". - Anonymous renames: you can use 'anonymous' rename directives, for example: // rename all the enum items in Hello %rename(%(title)s,match$parentNode$type="enum Hello") ""; enum Hello { hi, hello -> Hi, Hello // match both }; enum Hi { hi, hello -> hi, hello // no match }; // rename all the enum items %rename(%(title)s,match$nodeType="enumitem") ""; // rename all the items in given command (sloooow, but...) %rename(%(command:)s) ""; Anonymous renames with commands can be very powerful, since you can 'outsource' all the renaming mechanism (or part of it) to an external program: // Uppercase all (and only) the names that start with 'i' %rename("%(command:awk '/^i/{print toupper($1)}' <<<)s") ""; int imported() -> IMPORTED; int hello() -> hello Note that if the 'command' encoder returns an empty string, swig understands that no rename is necessary. Also note that %rename 'passes' the matched name. For example, in this case namespace ns1 { int foo(); } namespace ns2 { int bar(); } the external program only receives "foo" and "bar". If needed, however, you can request the 'fullname' %rename("%(command:awk 'awk '/ns1::/{l=split($1,a,"::"); print toupper(a[l])}'' <<<)s",fullname=1) ""; ns1::foo -> FOO ns2::bar -> bar - Mixing encoders and matching: of course, you can do mix commands and match fields, for example: %rename("%()",match="cdecl") ""; %rename("%()",match="enumitem") ""; %rename("%()",match="enumitem", match$parentNode$parentNode$nodeType="class") ""; Use "swig -dump_parse_module" to see the attribute names you can use to match a specific case. - 'sourcefmt' and 'targetfmt': sometimes you need to process the 'source' name before comparing, for example %namewarn("314: empty is a keyword",sourcefmt="%(lower)s") "empty"; then if you have int Empty(); // "Empty" is the source you will get the keyword warning since 'Empty' will be lower cased, via the sourcefmt="%(lower)s" option, before been compared to the 'target' "empty". There is an additional 'targetfmt' option to process the 'target' before comparing. - complementing 'match': you can use 'notmatch', for example %namewarn("314: empty is a keyword",sourcefmt="%(lower)s",notmatch="namespace") "empty"; here, the name warning will be applied to all the symbols except namespaces. 12/30/2005: mmatus - Add initial support for gcj and Java -> mechanism. See examples in: Examples/python/java Examples/ruby/java Examples/tcl/java to see how to use gcj+swig to export java classes into python/ruby/tcl. The idea is to put all the common code for gcj inside Lib/gcj and localize specific types such as jstring, as can be found in Lib/python/jstring.i Lib/ruby/jstring.i Lib/tcl/jstring.i Using the UTL, this is very easy, and the perl version for jstring.i will be next. 12/29/2005: mmatus - Add the copyctor feature/directive/option to enable the automatic generation of copy constructors. Use as in: %copyctor A; struct A { }; then this will work a1 = A(); a2 = A(a1); Also, since it is a feature, if you just type %copyctor; that will enable the automatic generation for all the classes. It is also equivalent to swig -copyctor -c++ ... Notes: 1.- The feature only works in C++ mode. 2.- The automatic creation of the copy constructor will usually produce overloading. Hence, if the target language doesn't support overloading, a special name will be used (A_copy). 3.- For the overloading reasons above, it is probably not a good idea to use the flag when, for example, you are using keywords in Python. 4.- The copyctor automatic mechanism follows more or less the same rules as the default constructor mechanism, i.e., a copy constructor will not be added if the class is abstract or if there is a pertinent non-public copy ctor in the class or its hierarchy. Hence, it might be necessary for you to complete the class declaration with the proper non-public copy ctor to avoid a wrong constructor addition. - Fix features/rename for templates ctor/dtor and other things around while adding the copyctor mechanism. 12/27/2005: mmatus - Add the 'match' option to typemaps. Assume you have: %typemap(in) SWIGTYPE * (int res) {..} %typemap(freearg) SWIGTYPE * { if (res$argnum) ...} then if you do %typemap(in) A * {...} swig will 'overload the 'in' typemap, but the 'freearg' typemap will be also applied, even when this is wrong. The old solutions is to write: %typemap(in) A * {...} %typemap(freeag) A * ""; overload 'freearg' with an empty definition. The problem is, however, there is no way to know you need to do that until you start getting broken C++ code, or worse, broken runtime code. The same applies to the infamous 'typecheck' typemap, which always confuses people, since the first thing you do is to just write the 'in' typemap. The 'match' option solves the problem, and if instead you write: %typemap(in) SWIGTYPE * (int res) {..} %typemap(freearg,match="in") SWIGTYPE * { if (res$argnum) ...} %typemap(typecheck,match="in",precedence...) SWIGTYPE * {...} it will tell swig to apply the 'freearg/typecheck' typemaps only if they 'match' the type of the 'in' typemap. The same can be done with other typemaps as: %typemap(directorout) SWIGTYPE * {...} %typemap(directorfree,match="directorout") SWIGTYPE * {...} 12/27/2005: mmatus - Add the 'naturalvar' option/mode/feature to treat member variables in a more natural way, ie, similar to the global variable behavior. You can use it in a global way via the command line swig -naturalvar ... or the module mode option %module(naturalvar=1) both forms make swig treat all the member variables in the same way it treats global variables. Also, you can use it in a case by case approach for specific member variables using the directive form: %naturalvar Bar::s; Then, in the following case for example: std::string s; struct Bar { std::string s; }; you can do: b = Bar() b.s ="hello" cvar.s = "hello" if (b.s != cvar.s): raise RuntimeError This is valid for all the languages, and the implementation is based on forcing the use of the const SWIGTYPE& (C++)/SWIGTYPE (C) typemaps for the get/set methods instead of the SWIGTYPE * typemaps. Hence, for 'naturalvar' to work, each target language must implement 'typemap(in/out) const Type&' properly. The 'naturalvar' option replaces or makes workarounds such as: %apply const std::string & { std::string *} unnecessary. Note1: If your interface has other kinds of workarounds to deal with the old 'unnatural' way to deal with member variables (returning/expecting pointers), the 'naturalvar' option could break them. Note2: the option has no effect on unnamed types, such as unnamed nested unions. 12/27/2005: mmatus - Add more 'expressive' result states for the typemap libraries. In the past, for scripting languages, you would do checking something like: if (ConvertPtr(obj,&vptr,ty,flags) != -1) { // success } else { // error } Now the result state can carry more information, including: - Error state: like the old -1/0, but with error codes from swigerrors.swg. int res = ConvertPtr(obj,&vptr,ty,flags); if (SWIG_IsOK(res)) { // success code } else { SWIG_Error(res); // res carries the error code } - Cast rank: when returning a simple successful conversion, you just return SWIG_OK, but if you need to do a 'cast', you can add the casting rank, ie: if (PyFloat_Check(obj)) { value = PyFloat_AsDouble(obj); return SWIG_OK; } else if (PyInt_Check(obj)) { value = (double) PyInt_AsLong(obj); return SWIG_AddCast(SWIG_OK); } later, the casting rank is used to properly dispatch the overloaded function, for example. This of course requires your language to support and use the new dispatch cast/rank mechanism (Now mainly supported in perl and python, and easily expandable to ruby and tcl). - [UTL] Add support for the new 'expressive' result states. 12/27/2005: mmatus - Add support for the C++ implicit conversion mechanism, which required some modifications in parser.y (to recognize 'explicit') and overload.cxx (to replace $implicitconv as needed). Still, real support in each target language requires each target language to be modified. Python provides an example, see below. - Add support for native C++ implicit conversions, ie, if you have %implicitconv A; struct A { int ii; A() {ii = 1;} A(int) {ii = 2;} A(double) {ii = 3;} explicit A(char *s) {ii = 4;} }; int get(const A& a) {return a.ii;} you can call: a = A() ai = A(1) ad = A(1.0) as = A("hello") # old forms get(a) -> 1 get(ai) -> 2 get(ad) -> 3 get(as) -> 4 #implicit conversions get(1) -> 2 get(1.0) -> 3 get("hello") -> Error, explicit constructor Also, as in C++, now implicit conversions are supported in variable assigments, and if you have: A ga; struct Bar { A a; }; you can do: cvar.ga = A(1) cvar.ga = 1 cvar.ga = 1.0 cvar.ga = A("hello") cvar.ga = "hello" -> error, explicit constructor b = Bar() b.a = A("hello") b.a = 1 b.a = 1.0 b.a = "hello" -> error, explicit constructor Note that the last case, assigning a member var directly, also requires the 'naturalvar' option. This support now makes the old '%implicit' macro, which was found in 'implicit.i' and it was fragile in many ways, obsolete, and you should use the new '%implicitconv' directive instead. Note that we follow the C++ conventions, ie, in the following the implicit conversion is allowed: int get(A a) {return a.ii;} int get(const A& a) {return a.ii;} but not in these cases: int get(A *a) {return a->ii;} int get(A& a) {return a.ii;} Also, it works for director methods that return a by value result, ie, the following will work: virtual A get_a() = 0; def get_a(self): return 1 but not in this case: virtual const A& get_a() = 0; virtual A& get_a() = 0; virtual A* get_a() = 0; Notes: - the implicitconv mechanism is implemented by directly calling/dispatching the python constructor, triggering a call to the __init__method. Hence, if you expanded the __init__ method, like in: class A: def __init__(self,args): then 'my code' will also be executed. - Since the %implicitconv directive is a SWIG feature, if you type: %implicitconv; that will enable implicit conversion for all the classes in your module. But if you are worried about performance, maybe that will be too much, especially if you have overloaded methods, since to resolve the dispatching problem, python will efectively try to call all the implicit constructors as needed. - For the same reason, it is highly recommended that you use the new 'castmode' when mixing implicit conversion and overloading. - [python] The %implicit directive is declared obsolete, and you should use %implicitconv instead. If you include the implicit.i file, a warning will remind you of this. Note: Since %implicit is fragile, just replacing it by %implicitconv could lead to different behavior. Hence, we don't automatically switch from to the other, and the user must migrate to the new %implicitconv directive manually. 12/26/2005: wsfulton [C#] Modify std::vector wrappers to use std::vector::value_type as this is closer to the real STL declarations for some methods, eg for push_back(). Fixes some compilation errors for some compilers eg when the templated type is a pointer. [Java] std::vector improvements - a few more methods are wrapped and specializations are no longer required. The specialize_std_vector macro is no longer needed (a warning is issued if an attempt is made to use it). 12/26/2005: wsfulton [Java, C#] Add in pointer reference typemaps. This also enables one to easily wrap std::vector where T is a pointer. 12/24/2005: efuzzyone [CFFI] The cffi module for SWIG: - Fully supports C, but provides limited supports for C++, in particular C++ support for templates and overloading needs to be worked upon. 12/23/2005: mmatus [python] Add the castmode that allows the python type casting to occur. For example, if you have 'int foo(int)', now class Ai(): def __init__(self,x): self.x = x def __int__(self): return self.x foo(1) // Ok foo(1.0) // Ok foo(1.3) // Error a = Ai(4) foo(ai) // Ok The castmode, which can be enabled either with the '-castmode' option or the %module("castmode") option, uses the new cast/rank dispatch mechanism. Hence, now if you have 'int foo(int); int foo(double);', the following works as expected: foo(1) -> foo(int) foo(1.0) -> foo(double) ai = Ai(4) foo(ai) -> foo(int) Note1: the 'castmode' could disrupt some specialized typemaps. In particular, the "implicit.i" library seems to have problem with the castmode. But besides that one, the entire test-suite compiles fine with and without the castmode. Note2: the cast mode can't be combined with the fast dispatch mode, ie, the -fastdispatch option has no effect when the cast mode is selected. The penalties, however, are minimum since the cast dispatch code is already based on the same fast dispatch mechanism. See the file overload_dispatch_cast_runme.py file for new cases and examples. 12/22/2005: mmatus Add the cast and rank mechanism to dispatch overloading functions. The UTF supports it now, but for each language it must be decided how to implement and/or when to use it. [perl] Now perl uses the new cast and rank dispatch mechanism, which solves all the past problems known in perl, such as the old '+ 1' problem: int foo(int); $n = 1 $n = $n + 1 $r = foo(n) also works: foo(1); foo("1"); foo(1.0); foo("1.0"); but fails foo("l"); and when overloading foo(int) and foo(double); foo(1) -> foo(int) foo(1.0) -> foo(double) foo("1") -> foo(int) foo("1.0") -> foo(double) foo("l") -> error foo($n) -> foo(int) for good perl versions foo($n) -> foo(double) for old bad perl versions when overloading foo(int), foo(char*) and foo(double): foo(1) -> foo(int) foo(1.0) -> foo(double) foo("1") -> foo(char*) foo("1.0") -> foo(char*) foo("l") -> foo(char*) Note: In perl the old dispatch mechanism was broken, so, we don't provide an option to enable the old one since, again, it was really really broken. See 'overload_simple_runme.pl' for more cases and tests. PS: all the old known issues are declared resolved, any new "problem" that could be discovered is declared, a priori, as "features" of the new dispatch mechanism (until we find another solution at least). *** POTENTIAL INCOMPATIBILITY *** As with the introduction of the UTF, some things could now start to work as expected, and people used to deal or workaround previous bugs related to the dispatch mechanism, could see now a difference in perl behavior. 12/21/2005: mmatus - The '-nodefault' flag (pragma and feature) now generates a warning, and recommends to use the explicit -nodefaultctor and -nodefaultdtor options. The reason to split the 'nodefault' behavior is that, in general, ignoring the default destructor generates memory leaks in the target language. Hence, is too risky just to disable both the default constructor and destructor at the same time. If you need to disable the default destructor, it is also recommended you use the directive form: %nodefaultdtor MyVerySpecialClass; for specific classes, and always avoid using the global -nodefault and -nodefaultdtor options. 12/21/2005: wsfulton [Java, C#] Fix incorrect code generation when the intermediary classname is changed in the module directive from its default. For example: %module(jniclassname="myimclassnewname") "mymodule" // Java %module(imclassname="myimclassnewname") "mymodule" // C# Add in new special variable $imclassname. See docs. 12/17/2005: mmatus [Python] - Add the -aliasobj0/-noaliasobj0 options to use with -fastunpack and/or -O and old typemaps that use 'obj0' directly. So, if you compile your code using -O and get errors about the undeclared 'obj0' variable, run again using swig -O -aliasobj0 -python .... For new typemaps, never use 'obj0' directly, if needed, use the '$self' name that will be properly expanded to 'obj0' (nofastunpack) or 'swig_obj[0]' (fastunpack). If you have no idea what I am talking about, better, that means you have no typemap with this problem. 12/14/2005: mmatus [Python] - Add the -fastunpack/-nofastunpack options to enable/disable the use of the internal UnpackTuple method, instead of calling the one from the python C API. The option -O now also implies -fastunpack. 12/11/2005: mmatus [Python] - Add the -proxydel/-noproxydel options to enable/disable the generation of proxy/shadow __del__ methods, even when now they are redundant, since they are empty. However, old interfaces could rely on calling them. The default behavior is to generate the __del__ methods as in 1.3.27 or older swig versions. The option -O now also implies -noproxydel. 12/10/2005: mmatus [UTF] - Fix unnecessary calls to SWIG_TypeQuery for 'char *' and 'wchar_t *', problem found by Clay Culver while profiling the PyOgre project. [Python] - Add the -dirvtable/-nodirvtable to enable/disable a pseudo virtual table used for directors, avoiding the need to resolve the python method at each call. - Add the -safecstrings/-nosafecstrings options to enable/disable the use of safe conversions from PyString to char *. Python requires you to never change the internal buffer directly, and hence 'safectrings' warranties that but returning a copy of the internal python string buffer. The default, as in previous releases, is to return a pointer to the buffer (nosafecstrings), so, it is the user's responsibility to avoid its modification. - Add the -O option to enable all the optimization options at once, initially equivalent to -modern -fastdispatch -dirvtable -nosafecstrings -fvirtual 12/08/2005: mmatus - Add the -fastdispatch option (fastdispatch feature). This enables the "fast dispatch" mechanism for overloaded methods provided by Salvador Fandi~no Garc'ia (#930586). The resulting code is smaller and faster since less type checking is performed. However, the error messages you get when the overloading is not resolved could be different from what the traditional method returns. With the old method you always get an error such as "No matching function for overloaded ..." with the new method you can also get errors such as "Type error in argument 1 of type ..." See bug report #930586 for more details. So, this optimization must be explicitly enabled by users. The new mechanism can be used as: swig -fastdispatch or using the feature form %feature("fastdispatch") method; or %fastdispatch method; 12/06/2005: mmatus - Several memory and speed improvements, specially for templates. Now swig is up to 20 faster than before for large template interfaces, such as the std_containers.i and template_matrix.i files in the python test-suite. Memory footprint is also reduced in consideration of small pcs/architectures. - add commandline options -cpperraswarn and -nocpperraswarn" to force the swig preprocessor to treat the #error directive as a #warning. the pragmas #pragma SWIG cpperraswarn=1 #pragma SWIG cpperraswarn=0 are equivalent to the command line options, respectively. 12/06/2005: mmatus [Python] The generated code is now more portable, especially for Windows. Following http://www.python.org/doc/faq/windows.html Py_None is never accessed as a structure, plus other tricks mentioned there. 12/06/2005: mmatus [Python] Added initial support for threads based in the proposal by Joseph Winston. The user interface is as follows: 1.- the module thread support is enable via the "threads" module option, i.e. %module("threads"=1) 2.- Equivalent to that, is the new '-threads' swig option swig -threads -python ... 3.- You can partially disable thread support for a given method using: %feature("nothread") method; or %nothread method; also, you can disable sections of the thread support, for example %feature("nothreadblock") method; or %nothreadblock method; %feature("nothreadallow") method; or %nothreadallow method; the first disables the C++/python thread protection, and the second disables the python/C++ thread protection. 4.- The current thread support is based in the PyGIL extension present in python version 2.3 or later, but you can provide the thread code for older versions by defining the macros in pythreads.swg. If you get a working implementation for older versions, please send us a patch. For the curious about performance, here are some numbers for the profiletest.i test, which is used to check the speed of the wrapped code: nothread 9.6s (no thread code) nothreadblock 12.2s (only 'allow' code) nothreadallow 13.6s (only 'block' code) full thread 15.5s ('allow' + 'block' code) i.e., full thread code decreases the wrapping performance by around 60%. If that is important to your application, you can tune each method using the different 'nothread', 'nothreadblock' or 'nothreadallow' features as needed. Note that for some methods deactivating the 'thread block' or 'thread allow' code is not an option, so, be careful. 11/26/2005: wsfulton SWIG library files use system angle brackets everywhere for %include, eg %include "std_common.i" becomes %include 11/26/2005: wsfulton [Java, C#] Typesafe enums and proper enums have an extra constructor so that enum item values that are initialised by another enum item value can be wrapped without having to use %javaconstvalue/ %csconstvalue for when using %javaconst(1)/%csconst(1). Suggestion by Bob Marinier/Douglas Pearson. For example: typedef enum { xyz, last = xyz } repeat; 11/21/2005: mmatus [ruby + python] Fixes for directors + pointers. This is an ugly problem without an easy solution. Before we identified this case as problematic: virtual const MyClass& my_method(); but it turns out that all the cases where a pointer, array or reference is returned, are problematic, even for primitive types (as int, double, char*, etc). To try to fix the issue, a new typemap was added, 'directorfree', which is used to 'free' the resources allocated during the 'directorout' phase. At the same time, a primitive garbage collector engine was added to deal with orphaned addresses, when needed. The situation is much better now, but still it is possible to have memory exhaustation if recursion is used. So, still you need to avoid returning pointers, arrays or references when using director methods. - Added stdint.i - typemaps for latest C99 integral types found in stdint.h. 11/14/2005: wsfulton More types added to windows.i, eg UINT8, WORD, BYTE etc. Including windows.i will also enable SWIG to parse the __declspec Microsoft extension, eg __declspec(dllimport). Also other Windows calling conventions such as __stdcall. 11/10/2005: wsfulton New library file for Windows - windows.i. This file will contain useful type information for users who include windows.h. Initial support is for the non ISO integral types: __int8, __int16, __int32, __int64 and unsigned versions. The unsigned versions previously could not be parsed by SWIG. SF #872013. 11/09/2005: wsfulton [Java, C#] Portability warning for files which will overwrite each other on case insensitive file systems such as FAT32/NTFS. This will occur, for example, when two class names are the same barring case. The warning is issued on all platforms and can be suppressed with the usual warning suppression techniques. SF bug #1084507. 11/09/2005: wsfulton ./configure --with-python --with-ruby --with-perl5 etc enable these languages, ie the --with-xxxx options, where no path is specified, work the same as if the option was not specified at all. Based on patches #1335042 #1329048 #1329047. 11/09/2005: dancy [Allegrocl] Add C++ support to the Allegrocl module. Further enhances the C support as well. Some of the features: - MUCH better generation of foreign types based on the C/C++ types for use in defining the FFI on the lisp side. We don't pass everything as a (* :void) any longer. - Uses typemaps for better control of type conversions and code generation in the generated lisp and c++ wrapper code. - CLOS wrapping of pointers returned from foreign space makes it easier to differentiate pointers in user code. The wrapping objects can be passed directly to FF calls. - Defun wrapping of FF calls, allowing for more lispy interface. Conversion, GCing, of lisp objects to foreign objects can be done in the wrapping defun via the use of typemaps. - overload dispatching implemented on the lisp side using generic functions. - Templates and synonymous types supported. 11/07/2005: mmatus [Python] Adding proper support for multi-inheritance in the python side, ie, if you have two C++ wrapped class, Foo and Bar, now: class MyPythonClass(Foo,Bar): .... will properly work, even with directors, and the deallocation of Foo.this and Bar.this will follow correctly. Before, a class could only have one 'this' instance (unlike C++), only the last base class was properly deleted, or detected with directors. Now 'self.this' can be a list, which will contain the C++ instance pointers for all the base classes. Also, swig.this is responsible for deallocating the C++ instance(s), and the __del__ method is not emitted unless the user preppend/append some code to it. - Swig can now detect memory leaks, ie, if you still don't use proxy/shadow classes, and type something like import _example f = _example.new_Foo() and forget to call _example.delete_Foo(f), then swig will tell you that there is a memory leak. Otherwise, if you always use the proxy classes, you probably you will never ever see this warning unless there is something wrong inside the swig wrapping code. *** POTENTIAL INCOMPATIBILITY *** If you overloaded the __del__ method, and call the base one without a try block, as in class MyClass(SwigClass): def __del__(self): SwigClass.__del__(self) python could complain that the method SwigClass.__del__ is undefined. Try to use instead: def __del__(self): try: SwigClass.__del__(self) except: pass or simply def __del__(self): 11/02/2005: mmatus [Python] Adding more fun to STL/STD containers, now you can do %template(pyset) std::set; %template(pyvector) std::vector; %template() std::pair; %template(pyvector) std::map; .... The same applies to std::list, std::deque, std::multiset, etc. Then, at the python side you can do now: # C++ std::vector as native python sequence v = pyvector([1,"hello",(1,2)]) print v[1] >> 'hello' print v[2] >> (1,2) # C++ std::set as native python sequence s = pyset() s.insert((1,2)) s.insert(1) s.insert("hello") sum=() for i in s: sum +=(i,) print sum >>> (1, 'hello', (1, 2)) # C++ std::map as native python sequence m = pymap() m["foo"] = "hello" m[1] = (1,2) pm = {} for k in m: pm[k] = m[k] print pm >>> {1: (1, 2), 'foo': 'hello'} ie, the STD/STL containers work as real native python container, with arbitrary item types and so. But since normal C++ containers do not properly ref/unref their items, you should use the safer versions: %template(pyset) std::set; %template(pyvector) std::vector; %template() std::pair; %template(pyvector) std::map; .... where swig::PyObject_ptr is a PyObject * envelope class provided to safely incref/decref the python object. So, now you can use all the STL/STD containers as native Python containers. Note 1: std::map, std::set and the other 'ordered' containers will properly use PyObject_Compare for sorting, when needed. Note 2: all the STL/STD containers have a limit size of SIZE_MAX, ie, you can have manage containers larger than INT_MAX, the python limit. 11/02/2005: mmatus [Python] - add 'iterator()' method for all sequences and additionally 'key_iterator()' for maps. 'iterator()' will always return the native C++ iterator. Additionally, in maps, 'key_iterator()' will return a python iterator using only the map keys. In general the sequence method __iter__ will call 'iterator()', returning the native C++ iterator, but in maps it will call 'key_iterator()', maintaining backward compatibility. Hence, for std::maps, you can play then with the native C++ iterator, which value is a (key, value) pair, by calling map.iterator(), as with map.begin(), map.end(), etc. The difference is that map.iterator() returns a safe 'closed' iterator, while map.begin() and map.end() are 'open' iterators. A 'closed' iterator knows the begin and the end of the sequence, and it never can seg. fault. An 'open' iterator, as in C++, can seg. fault at the C++ side. # a closed iterator is safe in the following example. # the next() method will throw a StopIteration # exception as needed i = seq.iterator() try: while True: sum += i.next() except: pass # an open iterator always need to be checked, # or it will crash at the C++ side current = seq.begin() end = seq.end() while (current != end): sum += current.next() [Python] - Finally, when we call f = Foo() the construction is 'one-way'. Before construction was done something like Foo() (python) -> _new_Foo() (C++) new_Foo() (C++) -> FooPtr() (python) FooPtr() (python) -> Foo() (python) and returning a pointer was done like NewPointerObj() (C++) -> FooPtr() (python) FooPtr(python) -> Foo() (python) ie, we when going back and forward between the C++ and python side. Now since there is no FooPtr the construction process is Foo() (python) -> _new_Foo() (C++) _new_Foo() (C++) -> NewPointerObj() (C++) (no shadow class) and returning a pointer is done NewPointerObj() (C++) (with shadow class) -> NewInstaceObj() (C++) where NewInstanceObj creates a new instance without calling __init__ and it doesn't go 'back' to python, is 'pure' C API. - With this change, and the other ones in the PySwigObject type, which now carries the thisown and swig_type_info pointer, the generated code should be as fast as boost::Python and/or the other python wrappers based in pure Python/C API calls. As a reference, the profiletest_runme.py example, which does a simple call function many times, such as this code: import profiletest a = profiletest.A() b = profiletest.B() for i in range(0,1000000) a = b.fn(a) where fn is defined as 'A* B::fn(A *a) {return a;}', produces the following times nomodern modern swig-1.3.26 19.70s 5.98s swig-CVS 0.99s 0.98s Clearly, there is a large improvement for the python 'nomodern' mode. Still, the 'modern' mode is around 6 times faster than before. For the same test, but using the non-shadow version of the module, we get _profiletest (non-shadow) swig-1.3.26 0.80s swig-CVS 0.60s Hence, now for practical purposes, the proxy overhead is insignificant. Note that the performance numbers we are showing is for a simple module (two types) and a simple function (one argument). For real situations, for modules with many more types and/or functions with many more parameters, you will see even better results. 10/31/2005: mmatus [Python] - Finally, no more ClassPtr proxy classes. You will see only a clean Class proxy class in the .py file. - No more 'real' thisown attribute either, the PySwigObject now carries the ownership info. You can also do something like print self.this.own() >>> True self.this.disown() self.this.own(0) print self.this.own() >>> False self.this.acquire() self.this.own(1) print self.this.own() >>> True Still the old way, print self.thisown >>> True self.thisown = 0 print self.thisown >>> False self.thisown = 1 print self.thisown >>> True is supported, and python dispatches the proper method calls as needed. - Support for iterators in STL/STD containers, for example, if you have %template std::set; you can use the C++ iterators as: s = set_string() s.append("c") s.append("a") s.append("b") b = s.begin() e = s.end() sum = "" while (b != e): sum += b.next() print sum >>> "abc" advance the iterator as in C++ current = s.begin() current += 1 print current.value() >>> "b" now using the reverse operators b = s.rbegin() e = s.rend() sum = "" while (b != e): sum += b.next() print sum >>> "cba" or the 'previous' method b = s.begin() e = s.end() sum = "" while (b != e): sum += e.previous() print sum >>> "cba" or just as in a python fashion for i in s: sum += i Note 1: Iterators in C++ are very powerful, but dangerous too. And in python you can shoot yourself in the foot just like in C++, so, be careful. Note 2: the iterators are 'light', ie, they do not convert sequence elements until you request to do so, via next(), value() or previous(). If you just increment/decrement one no conversion is performed, for example: b = s.begin() b += 1 b.incr() b.incr(2) b.decr(2) b.decr() b -= 1 only the iterator is modified, and not value wrapper is generated. Other typical C++ operations are also available, such as: print s.end() - s.begin() >>> 3 f = s.begin() + 1 print f.value() >>> "b" l = s.end() - 1 print l.value() >>> "c" etc. Of course, the 'find', 'insert', 'erase', and so on methods also supports iterators now, ie: i = s.begin() i += 1 s.erase(i) for i in s: sum += i print sum >>> "ac" *** POTENTIAL INCOMPATIBILITY *** There is no more 'thisown' attribute. If you use it, python will translate the following code as follows: if (self.thisown): ==> if (self.this.own()): self.thisown = 1 ==> self.this.own(1) self.thisown = 0 ==> self.this.own(0) Still, maybe in some unusual cases the translation will not be 100% correct, so if you have a problem, please report it and/or use the new 'self.this.own()' accessor. *** POTENTIAL INCOMPATIBILITY *** There is no more ClassPtr classes in the python code. Hence, if in the past you needed to resort to some kind of trickery with them, or overcome their presence, it is no longer required, but the extra code you added could now break things. If needed, you can use the option -classptr, i.e., swig -classptr -python ... to generate the old ClassPtr classes. 10/30/2005: mkoeppe [Guile] Make declared and defined linkage of SWIG_init consistent. Reported by Steven G. Johnson (SF patch 1315498). 10/26/2005: mmatus - Added the attribute.i file to the global library director. Now it can be used from other languages that do not use the unified typemap library as well. So, if you have something like: %include attribute.i %attribute(A, int, a, get_a, set_a); struct A { int get_a() const; void set_a(int aa); }; %attribute_ref(B, int, c); struct B { int& c(); }; then in the target language the 'A.a' and 'B.c' attributes will be visible, ie, you can access them as plain variables: f = A() f.a = 3 g = B() g.c = 3 h = f.a + g.c and the proper get/set methods will be dispatched. See attribute.i for more info. - More cleanups around and adding more test-cases. The DISOWN typemap now is tested and working in all the languages that use the unified typemap library, ie, tcl, ruby, perl and python. 10/25/2005: mmatus - Perl, complete the DISOWN typemap. - added the attribute.i file to the unified typemap library (before was only usable from python). - unify the names for the setter and getter methods in perl,tcl,ruby and python, so, the attribute.i library can work across them. - see the li_attribute.i test-case or the library file Lib/typemaps/attribute.swg for more info about how to use it. 10/24/2005: mmatus - Perl now uses the unified typemap library. - Changes in ruby to use the $track option in typemaps. - Changes in the unified typemap library to follow the convention that all macros that are not used in the C/C++ side starts with %, such as %delete %new_array etc. - Documenting fragments, see fragments.swg. - Cleaner way to use the unified typemap library, include just . Check some of the supported languages: perl, tcl, ruby, python. Always start with the head file, such as python/python.swg tcl/tcl8.swg ruby/ruby.swg perl5/perl5.swg and the principal file that invokes the unified library, such as python/pytypemaps.swg tcl/tcltypemaps.swg ruby/rubytypemaps.swg perl/perltypemaps.swg The file that provide the specialization for each language are the one that provides the basic types: python/pyprimtypes.swg ruby/rubyprimtypes.swg tcl/tclprimtypes.swg perl5/perlprimtypes.swg and the string manipulation: python/pystrings.swg ruby/rubystrings.swg tcl/tclstrings.swg perl5/perlstrings.swg The rest of the files, such as carray.i, are mostly one line files that include the proper typemap library version. *** POTENTIAL INCOMPATIBILITY in Perl *** Some missing/wrong typemaps could start working properly, and change the old expected behavior in Perl. 10/23/2005: wuzzeb Chicken: + pointers to member functions finally work properly + add test of member function pointers to cpp_basic.i 10/20/2005: dancy [allegrocl] Added C++ support. Large update, many changes. See newly added Allegro Common Lisp section in lisp.html 10/20/2005: mmatus Ruby, Tcl, Python: - Uniform way to fail (label fail:), now finally SWIG_exception works across the three languages and all the typemaps. - Add proper cleanup code to ruby - More valgrind fixes - Simplify the inline use, it seems a small interface of 20,000 lines (plus many many templates) can break gcc -O3 easily. - Finalize the typemaps library. All the old *.i files (carray.i, cpointer.i, exception.i) had been implemented in the new typemaps library. 10/19/2005: wuzzeb Update the Runtime Typemap documentation in Typemaps.html 10/18/2005: wuzzeb Chicken: - Correctly handle %ignored classes - Correctly convert long, long long, unsigned long, etc to chicken primitives. (Thanks to Felix Winkelmann) - Using argout parameters when the return value was a wrapped pointer caused a memory corruption. The chicken garbage collector moved a pointer out from under us. This is now fixed by running all the proxy creation functions as continuations after the wrapper function returns. As part of this, we no longer need the chickenfastproxy flag on output typemaps. - using -proxy and -nocollection together works now Before, it was not exporting the destructor in the proxy wrapper. 10/18/2005: mmatus Added the Unified Typemap Library (UTL). It unifies the typemaps for python, ruby, tcl and in the process, fixes several problems in each of the three languages to work in a "canonical" way now established in the typemap library SWIG/Lib/typempas The current status of the unification is that everything compiles and runs inside the test-suite and examples directories. And for the first time we have three languages than pass the primitive_types.i case. Also, we have a uniform way to treat the errors, for example if you do something like >>> from primitive_types import * >>> print val_uchar(10) 10 >>> print val_uchar(1000) Traceback (most recent call last): File "", line 1, in ? OverflowError: in argument 1 of type 'unsigned char' you get the same exception in all the three languages. And well, many more good things will come from this unification, for example, proper support of the STL/STD classes for all the languages, and hopefully, we can keep adding other languages. The hardest part, writing a common typemap library that suites the three different languages, is done, and adding another language should now be easy. Still the global unification is not complete, the STL/STD part is next, and probably as well as adding one or two more languages. If you are curious, look at the python, ruby and/or tcl directories to see what is needed to support the new common typemaps library. Still, the final way to integrate a new language could change as we move to integrate the STD/STL. *** POTENTIAL INCOMPATIBILITY in Ruby/Tcl *** Some missing/wrong typemaps could start working properly, and change the old behavior, specially in ruby and tcl. Version 1.3.27 (October 15, 2005) ================================= 10/15/2005: wsfulton [Java] Fix for typesafe enum wrapping so that it is possible to overload a method with 2 different enum types. 10/15/2005: wsfulton Fix for %feature("immutable","0") attempting to generate setters for constants. Restored %immutable and %makedefault to clear the feature as it behaved in SWIG-1.3.25 and earlier. 10/14/2005: mmatus Fix bug in anonymous typedef structures which was leading to strange behaviour. 10/13/2005: mmatus Several minor changes: - Improve the wchar_t type support - Add a warning for when you define the 'in' typemap but you don't define the 'typecheck' one. Very common mistake. - Add proper default rule for function pointers, now you can define a typemap such as: %typemap(in) SWIGTYPE ((*)(ANY)) {...} That will apply to all the pointer to functions. The rule in C++ also apply to the function 'reference', ie, in both cases typedef int (*fptr)(int a); typedef int (func)(int a); This was needed since it seems to be 'illegal' in C++ to do something like: void *ptr = static_cast(fptr); and probably, as for member functions, it is not warrantied that the pointer sizes will match. - Add the #error/#warning directives to swig's cpp. - Add the noblock option for typemaps, which is used as follows: supposed you a typemap, like this %typemap(in,noblock=1) Hello { .... } then the typemap will be inserted without the block imposed by the brackets, similar to %typemap(in) Hello "..."; So, why you don't just use the quote style?, because: 1.- The quote style doesn't get preprocessed, for example %typemap(in) Hello "$1= SWIG_macro($1);"; here, SWIG_macro doesn't get expanded 2.- Inside a quote typemap, you have to use quotes carefully %typemap(in) Hello "$1 = \"hello\" "; 3.- You can't make emacs and/or other editors to indent inside a string!. So, why do you want to remove the block?, because an extra block when not needed (no local variables in it): 1.- makes the code harder to read 2.- makes the code larger 3.- or in short, for the same reason we have the quote style. Version 1.3.26 (October 9, 2005) ================================ 10/08/2005: wsfulton [Php] Added 'throws' typemaps. 10/08/2005: wsfulton Fixes for languages that don't support multiple inheritance. The first non-ignored class in the public base class list is used for inheritance. by the proxy class. Previously, if the first class in the list was ignored, then the proxy class wouldn't have any base classes. 10/07/2005: mmatus Update more features to follow new convention, including: callback ref/unref except All of them use not only the feature as a flag, but also as code value. To deal with those features, we use now GetFlagAttr, which is similar to GetFlag, but instead or returning 1 or 0, it returns the attr value, if happens to be different of "0" of course. Now there are also more uniform directive names for the ones based in features, for example, for the old %newobject directive now we have tree directives defined: #define %newobject %feature("new") #define %nonewobject %feature("new","0") #define %clearnewobject %feature("new","") and so on for all the other feature directives. *** POTENTIAL INCOMPATIBILITY *** 09/30/2005: wsfulton Subtle change to some features. Previously it was not possible to disable many features once they had been enabled. This was for most features that behave as flags. These features now work as follows: %feature("name") // enables the feature %feature("name", "1") // enables the feature %feature("name", "0") // disables the feature %feature("name", "") // clears the feature In fact any non-empty value other than "0" will enable the feature (like C boolean logic). Previously "1", "0" or any other non-empty value would enable the feature and it would only be possible to disable the feature by clearing it (assuming there was no global enable). The following features are affected: allowexcept compactdefaultargs classic (Python) cs:const (C#) director exceptionclass (Python) ignore immutable java:const (Java) java:downcast (Java) kwargs modern (Python) new noautodoc (Python) nodefault nodirector noref notabstract nounref novaluewrapper python:maybecall (Python) python:nondynamic (Python) modula3:multiretval (Modula3) predicate (Ruby) trackobjects (Ruby) valuewrapper It is now possible, for example to ignore all methods/classes in a header file, except for a few targetted methods, for example: %feature("ignore"); // ignore all methods/classes %feature("ignore","0") some_function(int, double); // do not ignore this function %feature("ignore","0") SomeClass; // do not ignore this Class %feature("ignore","0") SomeClass::method; // do not ignore this method %include "bigheader.h" Removed %pythondynamic - it never worked properly. Use %pythonnondynamic instead. Removed %feature("nokwargs") - it wasn't fully implemented - use %feature("kwargs","0") instead. *** POTENTIAL INCOMPATIBILITY *** 09/25/2005: mkoeppe [Guile] Add "throws" typemaps. 09/24/2005: cfisavage [Ruby] Adds new %trackobjects functionality that maps C++ objects to Ruby objects. This functionality makes it much easier to implement mark functions for the garbage collector. For more information refer to the update documentation and examples. 09/20/2005: wsfulton [Perl] Patch 1116431 from Josh Cherry. Fixes non member functions inadvertently being called instead of member functions. 09/20/2005: wsfulton [Lua] Patch from Mark Gossage to add support for Lua-5.1, std::string, std::vector, std::exception and documentation. 09/14/2005: mmatus [Python] Add -nocppcast. Now the default behavior is to always use the cppcast operators. Before that was the case only when you used the -cppcast option. If this seems to break your code... your welcome!, it means it was broken before, and you never notice. If you thing the error is due to one of the SWIG typemaps, send us an example. Use -nocppcast only with very old C++ compilers that do not support the cppcast operations. So, here applies: This change doesn't break compatibility, it was broken before. 09/13/2005: wsfulton [Java] Fix for director methods when a class is passed by value as a parameter. 09/11/2005: mmatus Adding the module option to the %import directive. Now you can use it as %import(module="BigModule") foo.i where subfile could (or not) define the module name via the %module directive. The module option take precedence and it has the same effects than having the directive %module BigModule inside the imported file foo.i. You can use the option in mainly two cases: 1.- You used the -module option when you generated the module to be imported, and hence the module name in the imported %module directive is not really useful. 2.- The module you want to import is very large, and it has several .i/.h files. Then, if you just one to import a class or so from the module, says 'foo', and not the entire module via importing the main BigModule.i file, then you just do: %import(module="BigModule") foo.h or %import(module="BigModule") foo.i where foo.i contains the 'foo' declaration and maybe a couple of extra %include directives, as needed. 09/11/2005: mmatus Fix bug #1282637, about the -module option not having effect in places where it was needed. 09/11/2005: wsfulton When wrapping variables, ensure that none of the typemaps used for the set wrappers are used when generating the get wrappers. I doubt this was a problem for any languages except for the recently introduced null attribute in the out typemap (C# only). 09/08/2005: wsfulton More descriptive error messages when files fail to open. 09/06/2005: mmatus Allow a %define a macro inside another %define macro, for example %define hello(name, Type) %define name ## a(Type) %typemap(in) Type "hello;"; %enddef %enddef To learn how to use this new features in your own typemaps library, see python/cstring.i, python/cwstring.i and python/cwstrbase.i. [Python] Normalize the cstring.i implementation to use fragments, and add cwstring.i, which implements the same typemaps but for wchar_t strings. [Python] Bug fixed: 1247477, 1245591, 1249878 and others. 08/18/2005: wsfulton [Ruby] Implement support for SWIGTYPE* DISOWN typemap (like in Python) for better control of memory management, eg when adding an object created in Ruby to a C++ container. Patch #1261692 from Charlie Savage. 08/18/2005: wsfulton [Tcl] 64 bit platform fixes for the varargs handling in SWIG_GetArgs. This is an improved fix for bug #1011604 as suggested by Jeremy Lin. 08/18/2005: wsfulton [Tcl] Bug #1240469 - %newobject support for Tcl. Patch from Bob Marinier. 08/16/2005: wsfulton [Perl] Bug #1254494 - Fix for global namespace pollution by perl header files (bool define) prevented STL headers from being used on some systems, eg Windows with Visual Studio. 08/16/2005: wsfulton [Java] Bug #1240937 - Redefinition of __int64 typedef for Intel compilers. 08/15/2005: wsfulton [Xml] Bug #1251832 - C++ template may generate invalid XML file 08/15/2005: wsfulton [Lua] Support added for Lua. Patch #1242772 from Mark Gossage. It supports most C/C++ features (functions, struct, classes, arrays, pointers, exceptions), as well as lots of documentation and a few test cases & examples. 08/14/2005: wsfulton [Xml] Fix incorrect xml escaping in base class name when base class is a template. 08/13/2005: efuzzyone [CLISP] Added support for handling enums. Does not adds the return type declaration to the function definition, if a function returns void. 08/09/2005: mkoeppe New language module, Common Lisp with UFFI, from Utz-Uwe Haus. 08/09/2005: mkoeppe Fix the Lisp s-expression output module; it no longer complains about "unknown targets". 07/27/2005: wsfulton Modifications to STL wrappers so that it is possible for a user's %exception directive to be applied to the STL wrapper methods. Previously the following global %exception directive would not be used on the wrapper methods: %exception { try { $action } catch (...) { // handle uncaught exceptions } } This has been implemented by replacing %exception directives for specific STL wrapper methods with an exception specification declared on the wrapper methods. throws typemaps are now supplied for handling the STL exception specification. These can also be easily overridden, for example the std::out_of_range exception, which is used a lot in the STL wrappers, can be customised easily: %include "std_vector.i" %typemap(throws) std::out_of_range { // custom exception handler } %template(VectInt) std::vector; 07/22/2005: efuzzyone [CLISP] The clisp module for SWIG: - It can only handle C, clisp currently does not supports ffi bindings to C++. - It has two options, (a) -extern-all this will generate wrappers for all functions and variablestions, (b) -generate-typedef this will generate wrappers "def-c-type" wrappers for typedefs - Can handle pointers to functions, complex types such as n-dimensional arrays of pointers of depth d - Generates wrappers for constants as well as variables - Correctly distinguishes between the declaration of variables in structures and functions - Creates a defpackage "declaration" with the module name as the package name, the created package exports both functions and variables - tries to guess when should a pointer variable be declared as c-ptr or c-pointer 07/22/2005: wsfulton [C#] Changes to support C# structs returned by value. The changes required are: - Using an optional 'null' attribute in the out typemap. If this attribute is specified, then it is used for the $null special variable substitution. - The ctype used in the C/C++ wrappers is no longer initialised to 0 on declaration. Both of these changes fix the situations where an attempt was made to assign 0 to the returned struct. Marshalling structs as value types still requires user defined typemaps. See documentation for an example. 07/22/2005: wsfulton [C#, Java] Fix SWIG_exception usage to work with compilers that don't support empty macro arguments. Unfortunately this fix will stop usage of SWIG_exception being used within typemaps that use "" or %{ %} delimiters, but continues to work with typemaps using {} delimiters. Please use the SWIG_CSharpSetPendingExceptionArgument or SWIG_JavaThrowException methods instead as SWIG_exception is really intended as a platform independent macro for the SWIG library writers. 07/16/2005: mkoeppe [Allegro CL] Use specific foreign types rather than (* :void). Use *swig-identifier-converter*. 06/27/2005: wsfulton Functions declared as 'extern' no longer have an additional function declaration added to the wrapper files. There are some cases where SWIG does not get this right, eg bug #1205859 (extern functions with default arguments declared in a namespace). Also SWIG cannot get non-standard calling conventions correct, eg Windows calling conventions are usually handled like this: %{ #define DLLIMPORT __declspec(dllimport) #define STDCALL __stdcall %} #define DLLIMPORT #define STDCALL %inline %{ DLLIMPORT extern STDCALL void function(int); %} SWIG incorrectly generates: extern void function(int); To which there is no solution as SWIG doesn't handle non-standard calling conventions. The extra 'extern' function that SWIG generates is superfluous unless a user has forgotten to add the function declaration into the wrappers. The -noextern commandline argument is now redundant and a new commandline argument -addextern can be used to obtain the original behaviour. This shouldn't be necessary unless the header file containing the function declaration was inadvertently not added to the wrappers. To fix this add the function declaration into your wrappers, For example, replace: extern void foo(int); with: %inline %{ extern void foo(int); %} *** POTENTIAL INCOMPATIBILITY *** 06/22/2005: wsfulton [C#, Java, Modula3, Ocaml] The intermediary function names have been changed when wrapping variables to match the other language modules so that %extend for a member variable works uniformly across all language modules, eg: %extend ExtendMe { Var; }; %{ void ExtendMe_Var_set(ExtendMe *, double) {...} double ExtendMe_Var_get(ExtendMe *) {...} %} The methods implementing the get/set used to be: %{ void set_ExtendMe_Var(ExtendMe *, double) {...} double get_ExtendMe_Var(ExtendMe *) {...} %} This also changes the name of variable wrapper functions when using -noproxy. The original names can be generated with the -oldvarnames commandline option. *** POTENTIAL INCOMPATIBILITY *** Version 1.3.25 (June 11, 2005) ============================== 06/11/2006: mkoeppe [Guile] Fix handling of anonymous-enum variables. 06/10/2005: mkoeppe [Guile] Fix for function arguments that are passed by copy-of-value. Fix for global "const char *" variables. Fix testcases arrays_dimensionless, arrays_global. 06/08/2005: wsfulton Fix for when a base class defines a symbol as a member variable and a derived class defines the same symbol as a member method. 06/08/2005: wsfulton [C#] More fixes for virtual/new/override modifiers - when a method has protected access in base and public access in derived class. 06/02/2005: wsfulton Fix #1066363 - Follow convention of release tarball name matching directory name. 06/02/2005: wsfulton [C#, Java] Fix #1211353 - typesafe enums (and Java proper enums) wrappers when enum value is negative. 05/27/2005: wsfulton Modernised and tidied up Windows macros --> SWIGEXPORT, SWIGSTDCALL. They can be overridden by users via -D compiler directives if need be. 05/26/2005: wsfulton %csmethodmodifiers can be applied to variables as well as methods now. In addition to the default 'public' modifier that SWIG generates, %csmethodmodifiers will also replace the virtual/new/override modifiers that SWIG thinks is appropriate. This feature is useful for some obscure cases where SWIG might get the modifiers incorrect, for example with multiple inheritance and overriding a method in the base class. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/25/2005: wsfulton Added missing constructors to std::pair wrappers (std_pair.i) for all languages. 05/25/2005: wsfulton [C#] Added std::pair wrappers in std_pair.i 05/25/2005: wsfulton [C#] The C# 'new' and 'override' modifiers will be generated when a C++ class inherits methods via a C++ 'using' declaration. 05/25/2005: wsfulton Fix for exception specifications previously being ignored in classes that inherited methods from 'using' declarations, eg calls to Derived::bar below will convert C++ exceptions into a target language exception/error, like it always has done for Base::Bar. class Base { virtual bar() throw (std::string); }; class Derived : public Base { using Base::bar; }; 05/23/2005: wsfulton Fixes for detecting virtual methods in %extend for the -fvirtual option and C# override and new method modifiers. 05/23/2005: wsfulton [C#] The 'new' modifier is now generated on the proxy method when a method in a derived class is not polymorphic and the same method exists in the derived class (ie it hides the base class' non-virtual method). 05/23/2005: wsfulton [Java, C#] Fixes to detection of covariant return types - when the class hierarchy is more than 2 classes deep. 05/21/2005: wsfulton [Java] std::wstring typemaps moved from std_string.i to std_wstring.i 05/21/2005: wsfulton Fix for crash in DohStrstr, bug #1190921 05/21/2005: wsfulton [TCL] Fix for methods with similar names when showing list of names on error - bug #1191828. Patch from Jeroen Dobbelaere. 05/21/2005: wsfulton [TCL] long long overloading fix - bug #1191835, patch from Jeroen Dobbelaere. 05/21/2005: wsfulton Fix bug #1196755 to remove debug from swigtcl8.swg. 05/19/2005: wsfulton [C# and -fvirtual option] Fix for the override key not being generated in the derived class when a virtual method's return type was a typedef in either the base or derived class. Also ensures the method is eliminated when using the -fvirtual option. For example, Derived.method now has the C# override keyword generated: typedef int* IntegerPtr; struct Base { virtual IntegerPtr method(); }; struct Derived : Base { int * method() const; }; [C#] Fix for the override key being incorrectly generated for virtual methods when a base class is ignored with %ignore. 05/13/2005: wsfulton [Java] Fixes to remove "dereferencing type-punned pointer will break strict-aliasing rules" warnings in C wrappers when compiling C code with 'gcc -Wall -fstrict-aliasing'. Patch from Michael Cahill. This modifies many of the casts slightly, for example arg1 = *(DB_ENV **)&jarg1; to arg1 = *(DB_ENV **)(void *)&jarg1; 05/12/2005: wsfulton [C#] Support for C# attributes. C# attributes can be generated: 1) On a C/C++ type basis by specifying an inattributes and/or outattributes typemap attribute in the imtype or cstype typemaps (for C# return type or C# parameter type attributes). 2) On a wrapped method or variable by specifying a csattributes feature (%feature). 3) On a wrapped proxy class or enum by specifying a csattributes typemap. Examples are in the C# documentation (CSharp.html). 04/29/2005: wsfulton New configure option to turn off the default maximum compiler warning as they couldn't be removed even when overriding CFLAGS and CXXFLAGS with configure (./configure CFLAGS= CXXFLAGS=). To turn the maximum warnings off, run: ./configure --without-maximum-compile-warnings 04/28/2005: wsfulton Patch from Scott Michel which reworks the Java constructor and finalize/destructor typemaps, for directors to reduce the number of overall Java typemaps. Added the director_take and director_release typemaps to emulate other modules' __disown__ functionality. *** POTENTIAL INCOMPATIBILITY FOR JAVA DIRECTORS *** 04/28/2005: wsfulton [C#] Fixed problems due to the over eager garbage collector. Occasionally the garbage collector would collect a C# proxy class instance while it was being used in unmanaged code if the object was passed as a parameter to a wrapped function. Needless to say this caused havoc as the C# proxy class calls the C++ destructor when it is collected. Proxy classes and type wrapper classes now use a HandleRef, which holds an IntPtr, instead of a plain IntPtr to marshal the C++ pointer to unmanaged code. There doesn't appear to be any performance degradation as a result of this modification. The changes are in the proxy and type wrapper classes. The swigCPtr is now of type HandleRef instead of IntPtr and consequently the getCPtr method return type has also changed. The net effect is that any custom written typemaps might have to be modified to suite. Affected users should note that the implementation uses the new 'out' attribute in the imtype typemap as the input type is now a HandleRef and the output type is still an IntPtr. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 04/28/2005: wsfulton [C#] Support for asymmetric type marshalling added. Sometimes the output type needs to be different to the input type. Support for this comes in the form of a new optional 'out' attribute for the ctype, imtype and cstype typemaps. If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap, as has always previously been the case. If this typemap attribute is specified, then the type specified in the attribute is used for output types and the type specified in the typemap itself is used for the input type. An output type is a return value from a wrapped method or wrapped constant and an input type is a parameter in a wrapped method. An example shows that char * could be marshalled in different ways, %typemap(imtype, out="IntPtr") char * "string" char * function(char *); The output type is thus IntPtr and the input type is string. The resulting intermediary C# code is: public static extern IntPtr function(string jarg1); 04/22/2005: mkoeppe (Matthias Koeppe) [Guile] Fix generation of "define-method" for methods of classes with a constructor. Reported by Luigi Ballabio. 04/15/2005: wuzzeb (John Lenz) [Chicken] For wrapped functions that return multiple values (using argout), SWIG CHICKEN now returns them as multiple values instead of as a list. They can then be accessed using (call-with-values). 04/14/2005: wuzzeb (John Lenz) [Chicken] + Added a whole bunch of new _runme scripts into the chicken test suite. Also fix some bugs these new scripts turned up. + Added optimization when returning a wrapped proxy class. Before, a minor garbage collection was invoked every time a function returned. + All the chicken Examples should now run correctly 04/14/2005: wsfulton [C#] More fixes for typemap matching when wrapping variables, in particular std::string, so that std::string variables can be easily marshalled with a C# string property using: %include "std_string.i" %apply const std::string & { std::string *variable_name }; std::string variable_name; (Recall that all class variables are wrapped using pointers) 04/05/2005: wuzzeb (John Lenz) [Chicken] + Added Examples/chicken/egg, an example on how to build a chicken extension library in the form of an egg. Also updated the documentation on the different linking options. + chicken test-suite now has support to check SWIG with the -proxy argument if there exists a _proxy_runme.ss file. + More fixes for overloaded functions and -proxy 03/31/2005: wsfulton Turned on extra template features for all languages which were previously only available to Python. This enables typemaps defined within a templated class to be used as expected. Requires %template on the templated class, %template() will also pick up the typemaps. Example: template struct Foo { ... %typemap(in) Foo "in typemap for Foo " or %typemap(in) Foo "in typemap for Foo " }; %template(Foo_i) Foo; %template() Foo; will generate the proper 'in' typemaps wherever Foo and Foo are used. 03/30/2005: mkoeppe (Matthias Koeppe) [MzScheme] Patch from Hans Oesterholt for supporting MzScheme 30x. 03/29/2005: wuzzeb (John Lenz) [Chicken] + Reallow older versions of chicken (1.40 to 1.89) by passing -nocollection argument to SWIG + %import now works correctly with tinyclos. (declare (uses ...)) will be exported correctly. + TinyCLOS proxy classes now work correctly with overloaded functions and constructors. 03/29/2005: wsfulton [Java] Patch from Scott Michel for directorout typemaps. Java directors require the directorout typemaps like the other languages now. The new typemaps provide fixes for methods where the return type is returned by reference (this cannot automatically be made thread safe though). 03/22/2005: wsfulton Enum casting fixes. Visual C++ didn't like the C type casting SWIG produced when wrapping C++ enum references, as reported by Admire Kandawasvika. 03/21/2005: wsfulton [Perl] SF #1124490. Fix Perl macro clashes when using Visual Studio's STL string, so now projects can #include . 03/21/2005: wsfulton Fixed %varargs which got broken with the recent default argument changes. Also works for Java and C# for the first time now. 03/17/2005: wuzzeb (John Lenz) [Chicken] + Fix a whole bunch of bugs in the chicken module. The entire test suite now compiles, with the exception of the tests that require std_vector.i, std_deque.i, and so on, which chicken does not have yet. + Add support for %exception and %typemap(exceptions). Exceptions are thrown with a call to (abort) and can be handled by (handle-exceptions) 03/15/2005: wsfulton [Java] Patch from Scott Michel for directors. Modifications to the typemaps giving users fine control over memory ownership and lifetime of director classes. Director classes no longer live forever by default as they are now collectable by the GC. 03/15/2005: wuzzeb (John Lenz) [Chicken] Add support for adding finalizers garbage collected objects. Functions that return new objects should be marked with %newobject and input arguments which consume (or take ownership) of a pointer should be marked with the DISOWN typemap. Also add support for correctly checking the number of arguments passed to a function, and raising an error if the wrong number are passed. 03/14/2005: wuzzeb (John Lenz) Add --without-alllang option to configure.in, which is the same as passing all the --without-python --without-perl5 etc... that Matthias added. 03/09/2005: wsfulton [Php] Memory leak fix for functions returning classes/structs by value. 03/08/2005: wsfulton [Perl] Fix for Perl incorrectly taking memory ownership for return types that are typedefs to a struct/class pointer. Reported by Josh Cherry. 03/07/2005: wsfulton [C#] Various exception changes for the std::vector wrappers. These now more accurately mirror the same exceptions that System.Collections.ArrayList throw. 03/07/2005: wsfulton [C#] Fix undefined behaviour after any of the std::vector methods throw an exception. 03/07/2005: wsfulton [C#] When null is passed for a C++ reference or value parameter, the exception thrown has been corrected to an ArgumentNullException instead of NullReferenceException as recommended in the .NET Framework documentation. The default throws typemaps turn a C++ exception into an ApplicationException, not a SystemException now. 03/07/2005: wsfulton [C#] Numerous changes in C# exception handling have been made over the past few weeks. A summary follows: The way in which C++ exceptions are mapped to C# exceptions is quite different. The change is to fix C# exceptions so that the C++ exception stack is correctly unwound as previously C++ exceptions were being thrown across the C PInvoke layer into the managed world. New typemap attributes (canthrow and excode) have been introduced to control the mapping of C++ to C# exceptions. Essentially a callback into the unmanaged world is made to set a pending exception. The exception to throw is stored in thread local storage (so the approach is thread-safe). The typemaps are expected to return from unmanaged code as soon as the pending exception is set. Any pending exceptions are checked for and thrown once managed code starts executing. There should be minimal impact on execution speed during normal behaviour. Full details will be documented in CSharp.html. The SWIG_CSharpThrowException() function has been removed and replaced with the SWIG_CSharpSetPendingExceptionArgument() and SWIG_CSharpSetPendingException() functions. The original name has been deliberately changed to break old code as the old approach was somewhat flawed. Any user defined exceptions that follow the same pattern as the old approach should also be fixed. Numerous new .NET framework exceptions are now available for easy throwing from unmanaged code. The complete list is: ApplicationException, ArithmeticException, DivideByZeroException, IndexOutOfRangeException, InvalidOperationException, IOException, NullReferenceException, OutOfMemoryException, OverflowException, SystemException, ArgumentException, ArgumentNullException and ArgumentOutOfRangeException. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/05/2005: mmatus Fix several memory leaks around. Even when we survive knowning swig is a memory leak factory, it was a little out of control. To run std_containers.i in the python test-suite, swig was using ~260MB, now it uses 'only' ~40MB, which is the same ammount that g++ uses, so, is not that bad. In the process, I found a couple of extra Deletes, which in some cases could trigger seg. faults and/or DOH/asserts. [python] Better support for directors + exception. More verbose errors and added an unexpected exception handler. [python] Fix memory leak for the std::vector > case,reported by Bo Peng. [python] Fix SwigPyObject compare problem reporte by Cameron Patrick. [python] Fix several warnings in the generated code for gnu-gcc, Intel and VC7.1 compilers. 02/25/2005: wuzzeb (John Lenz) Update documentation to use CSS and
    instead of
    I used a script to convert the docs, and it set all the box classes to be "code". There are actually 4 different classes, "shell", "code", "targetlang", and "diagram". We need to go through and convert the divs depending on what they contain. 02/23/2005: mmatus [Python] Added option -nortti to disable the use of native C++ RTTI with directors (dynamic_cast<> is not used). Add more code for directors to detect and report errors in the python side. Extend the use of SWIGINTERN whenever is possible. Remove template warnings reported by VC7.1. Remove warnings reported by gcc/g++. Finally you can compile using g++ -W -Wall -c mymodule_wrap.cxx and no spurious errors will be generated in the wrapper code. 02/23/2005: wuzzeb (John Lenz) Added -external-runtime argument. This argument is used to dump out all the code needed for external access to the runtime system, and it replaces including the files directly. This change adds two new virtual functions to the Language class, which are used to find the language specific runtime code. I also updated all languages that use the runtime to implement these two functions. 02/22/2005: mmatus Fix %template + private error SF#1099976. 02/21/2005: mmatus Fix swigrun.swg warnings reported when using "gcc -W -Wall" (static/inline not used in front of a function declaration), and add SWIGUNUSED attribute to avoid unused warnings elsewhere. Fix unused variable warnings. [Python] Use new SWIGUNUSED attribute to avoid warnings in SWIGINTERN methods. [Python] Fix PyOS_snprintf for python versions < 2.2 (SF #1104919). [Python] Fix map/multimap to allow empty maps (reported by Philippe Hetroy). [Docs] Add some documentation to Python.html and SWIGPlus.html, including for example the fact that 'friends' are now supported. 02/21/2005: wsfulton [PHP] Patch from Olly Betts, so that wrappers compile with Zend thread safety enabled. 02/17/2005: wsfulton Memory leak fix in some of the scripting language modules when using default arguments in constructors. The scripting language was not taking ownership of the C++ object memory when any of the constructors that use default arguments was called. 02/16/2005: wsfulton SF #1115055: Failed make install. Patch from Rob Stone. 02/16/2005: wsfulton [Java] SF #1123416 from Paul Moore. Correct memory allocation for STRINGARRAY typemaps in various.i. 02/15/2005: wsfulton Disabled typemap search changes for now (see entry 19/12/2004). It breaks old typemaps, lengthens the execution time by about 25% and introduces inconsistencies. 02/15/2005: wsfulton swig -help follows other software by printing to stdout instead of stderr now. swig -version also displays to stdout instead of stderr now. Behaviour reported by Torsten Landschoff. 02/15/2005: wsfulton [Ruby] Fix for the less commonly used ordering of %include and #include, so that the generated code compiles. Bug reported by reported by Max Bowsher. %include foo.h %{ #include foo.h %} 02/15/2005: wsfulton [C#, Java] SWIG_exception macro will now return from unmanaged code / native code as soon as it is called. Fixes possible JVM crashes and other code unexpectedly being executed. Note SWIG_exception is only occasionally used by SWIG library writers, and is best avoided by SWIG users. 02/15/2005: wsfulton [C#, Java] Typemaps can now be targeted at global variable names and static member variable names. Previously the typemaps for the setters were ignored, for example: %typemap(in) int globalint "..." int globalint; 02/13/2005: mkoeppe (Matthias Koeppe) [Guile] Add %typecheck for SWIGTYPE, add %typecheck for ptrdiff_t, fix typemaps for size_t. [Pike] Merge patch from Torsten Landschoff for improved Pike configuration. 02/12/2005: mkoeppe (Matthias Koeppe) New configure switches --without-tcl, --without-python etc. allow to disable the search for installed languages. 01/31/2005: wuzzeb (John Lenz) - Add DohSortList to DOH - Improve the runtime type system: + Speed. Type loading is now O(n log n) instead of O(N^2), which for large modules is a huge improvement. + A whole bunch of functions in swigrun.swg no longer need the swig_type_list_handle passed to them. The only one left is TypeQuery. This also makes runtime.swg a lot smaller. + Split up swig_type_info structure into two structures (swig_type_info and swig_cast_info) + Store a pointer to a swig_type_info rather than just the type name string in the linked list of casts. First off, this makes the guile module a little faster, and second, the SWIG_TypeClientData() function is faster too. + Add the idea of a module into the type system. Before, all the types were stored in one huge linked list. Now, another level is added, and the type system stores a linked list of modules, each of which stores an array of types associated with it. + For more information of how the runtime type system now works, please see Doc/Manual/typemaps.html and Doc/Devel/runtime.txt - Update all language modules to use the new type system. The changes to each language module are minor. All languages are now able to use runtime.swg for external access to the type system. Before only python and perl did. - [guile, mzscheme, ocaml, and php4] These languages opened up the init function inside the .cxx code, and any code in the .swg files in the init section was inside this function. This was a problem for swiginit.swg, which needs to be inserted before the SWIG_init function is opened. Thus I changed these languages to be like python or perl, where the init function is declared in the .swg file. - [Ruby] Instead of moving the init function to the .swg file, I added a new section initbeforefunc, and then added %insert(initbeforefunc) "swiginit.swg" - [MzScheme] Fix enums and fix Examples/Makefile.in so that if multiple -I arguments are specified in the INCLUDES variable, each gets a ++ccf. - [Guile GH] Update Guile GH to use the new type system. See Doc/Manual/Guile.html for how smobs are now used. 01/11/2005: wsfulton [C#] New typemap called 'csconstruct'. The code in this typemaps was previously hard coded and could not be customised by a user. This typemap contains the code that is generated into a proxy class's constructor. [Java] New typemap called 'javaconstruct'. The code in this typemaps was previously hard coded and could not be customised by a user. This typemap contains the code that is generated into a proxy class's constructor. Another typemap named 'javaconstruct_director' is used instead when the proxy class is a director class. [C#, Java] If a C++ class did not have a default constructor, a protected default constructor was automatically generated by SWIG. This seems is unnecessary and has been removed and thereby giving the user almost complete control over the generated code along with the new typemaps above. 19/12/2004: mmatus [Disabled, see entry 02/15/2004] - Fix typemap search, now the "out" typemap search is done as follows int *Foo::foo(int bar) -> int *Foo::foo(int bar) -> int *Foo::foo -> int *foo(int bar) -> int *foo -> int * then, now you can be more specific, and define /* apply only for 'Foo::foo' method */ %typemap(out) int * Foo::foo(int *bar) ...; /* apply for all 'foo' functions/methods */ %typemap(out) int * foo(int *bar) ...; %inline { struct Foo { int *foo(int *bar); }; } 15/12/2004: mmatus - More fixes for templates and template default args. See template_default.i for scary cases that now are supported, besides the already ugly STL/std cases. - Cosmetics and more use of 'const' where it was implicit. - Other fixes for OSS, which is now working again with 1.3.25. Version 1.3.24 (December 14, 2004) ================================== 12/12/2004: wuzzeb (John Lenz) [Chicken] Fix a bunch of bugs relating to -proxy support + non-class variables now export properly using -proxy + static member functions now export properly using -proxy + member class variables now export properly using -proxy + added a -nounit argument, which does not export the (declare (unit ...)) + correctly install swigclosprefix.scm + constants (enums, defines) now correcly export when using -proxy 12/11/2004: wsfulton configure fix for when more than one version of jni_md.h is found in the Java include directory (was generating lots of sed error messages). 12/08/2004: wsfulton [Java] Fixes to arrays_java.i so that one can apply the array typemaps to functions taking pointers as input, eg %include "arrays_java.i" %apply int[] {int*}; void foo(int *a); 12/05/2004: wsfulton [Java] Director mods contributed by Scott Michel. New typemaps directordisconnect and directordisconnect_derived for the swigDirectorDisconnect() method. Also fix to get the javapackage typemap working again. 12/05/2004: mmatus - Finishing the fixes for templates + default template args + specializations. - [Python] Now we use the new templates + default template args in the std/STL library. That means the internal swig files are getting uglier since we now support the original declarations: template > class vector { .... }; template, class _Alloc = std::allocator > > class map { .... }; and the user can use the %template directive as %template() std::vector; %template() std::vector >; %template() std::vector >; Now we are closer to the cleaning/rewriting of the python std/STL support, such that we recover support for MSVC++ 6.0, and we can add support for other languages too. 12/02/2004: wsfulton [Java] Fix for directors when wrapping methods using a member enum and typesafe/proper enums enabled. 12/01/2004: mmatus - Fix typemaps to work with templates and default template args, ie template struct Foo { }; %typemap(in) Foo *{...} %typemap(out) Foo *{...} Foo * foo( Foo *f1, Foo *f2); now 'f1', 'f2' and the return value resolve the provided typemaps properly. This is highly needed for proper STL support, see new std_basic_string.i, std_sstream.i, etc. - Added std_sstream.i, and fix std_basic_string.i to use the new typemaps + template def. arg mechanism. Also, added the needed std_alloc.i. Now, all the containers can be modified to support std::allocator, like in: template > class vector { public: .... }; This change is only completed by now for basic_string. - Fix for smart pointers + members + extensions: %extend Foo { int extension(int i, int j) { return i; } int extension() { return 1; } } %inline %{ class Foo { public: int y; static const int z; }; class Bar { Foo *f; public: Bar(Foo *f) : f(f) { } Foo *operator->() { return f; } }; now you can f = Foo() f.y = 3 a = f.z f->extension() b = Bar(f) b.y = 3 a = b.z b->extension() - Other small errors fixes, mostly python. 11/25/2004: wsfulton [Java] Numerous director bug fixes so that the correct java types and canonicalized types in the JNI code are emitted. Use of the $javaclassname special variables in the director typemaps now consistent with the non-director typemaps. The types used for typemap lookups are also corrected in a few places. If you previously had your own director typemaps, ensure they are using the correct C++ type. *** POTENTIAL INCOMPATIBILITY FOR JAVA DIRECTORS *** 11/25/2004: wsfulton const enum SWIGTYPE & typemaps added. These wrap const enum references as if they were passed by value. Const enum references thus work the same as const reference primitive types such as const double &, const int & etc. Typemaps added for Java, C#, Ruby, Tcl, Perl and Pike. 11/25/2004: wsfulton [Java, C#] New special variable: $*javaclassname, similar to $javaclassname and $&javaclassname. The new one removes a pointer from the C type before obtaining the Java class name. One or more of $javaclassname, $&javaclassname or $*javaclassname may now appear in a typemap. Likewise for C# using csclassname instead of javaclassname. 11/25/2004: wsfulton The last vestiges of enums being handled as integers removed from the internals. The wrapper methods use the enum type rather than an int now. The net result is added type safety for enums when handled as pointers, references etc. Previously in situations such as a method taking a pointer to an enum, a pointer to an int or a pointer to an enum of some other type could inadvertantly be passed to the method. This is now fixed as the descriptor for an enum is no longer based on an int, but the enum type instead. Anonymous enums are still handled as integers. The consequence for scripting language users in correct usage of enums should not be noticeable. There is no change for any of the languages where enums are passed by value - most of the scripting languages will still accept an integer for an enum value and the strongly typed languages still use either typesafe enums, integers or proper enums depending on what the user configures. For Java and C# users a change in the typewrapper class name has occurred (for enum pointers, references etc). For example: enum Numbers { one=1, two }; enum Numbers* number(); In Java and C# this must now be coded as SWIGTYPE_p_Numbers n = modulename.number(); rather than SWIGTYPE_p_int n = modulename.number(); *** POTENTIAL INCOMPATIBILITY *** 11/21/2004: wsfulton/mmatus Added missing deprecated warning for %name and remove remaining %name usage in the SWIG libraries. 11/21/04: mmatus - [Python] Adding the PySwigObject to be used for carrying the instance C/C++ pointers. This is used instead of string and PyCObjects. The new PySwigObject is even safer than PyCObject, and more friendly than plain strings: now you can do print a.this print str(a.this) _00691608_p_A print long(a.this) 135686400 print "%s 0x%x" % (a.this, a.this) _00691608_p_A 0x8166900 the last one is very useful when debugging the C/C++ side, since is the pointer value you will usually get from the debugger. Also, if you have some old code that uses the string representation "_00691608_p_A", you can use it now again using 'str(ptr)', or by calling 'str = PyObject_Str(obj)' in the C/C++ side. This change is mainly for nostalgic swig users that miss the string representation, but also allows to say again if a.this == b.this: return "a is b" and well, since the change were really simple, maybe in the future we will be able to do next = a.this + 1 or add native python iteration over native C/C++ arrays, ie, no need to create/copy new tuples when returning and array or vector. Also, a PySwigPacked object was adding to carry a member method pointer, but this is probably a temporal solution until a more general object for methods is added. Be aware that to simplify maintaining and compatibility with other tools, the old string and PyCObjects representation could disappear very soon, and the SWIG_COBJECTS_TYPES or SWIG_NO_OBJECT_TYPES macros will have no effect at compilation time. Still, the three mechanisms are present in the code just for testing, debugging and comparison purposes. 11/21/04: mmatus - [Python] Adding back support for using the swig runtime code inside the user code. We just allow the user to include the minimal code needed to implement the runtime mechanism statically, just as in done in the swig modules. To use the swig runtime code, for example with python, the user needs include the following: #include // or using your favorite language #include #include // or using your favorite language #include the files swigrun.swg, pyrun.swg and runtime.swg can be checked out by using swig -co, or they can simply be found by adding the swig lib directory to the compiler include directory list, for example SWIGLIB=`swig -swiglib` c++ -I${SWIGLIB} .. of better, using the CPPFLAGS, but that depends on your environment. This change can be ported to the other languages too, you just need to isolate the needed runtime code in a single file like 'pyrun.swg', and provide the SWIG_Runtime_GetTypeList() method. Look at the Lib/python/pyrun.swg file and the Examples/python/swigrun example. 11/15/04: mmatus - Fix mixed_types.i + gcc-3.4, ie, arrays + references + typedefs - Fix multidim arrays + typedefs,ie typedef char character[1]; typedef character word[64]; - Process protected/private bases in the same way before we process protected/private members, ie, we check for constructors, operator new, virtual members, etc. - Fix Ruby/Java to work (or ignore) multi-inheritance + directors. Allow other languages to define if it is supported or not. - Now you can run SWIG_FEATURES="-directors -dirprot" make check-ruby-test-suite make check-python-test-suite make check-java-test-suite make check-ocaml-test-suite and you will get only 'real' errors. ruby and python compile with no errors, java shows some problems. Version 1.3.23 (November 11, 2004) ================================== 11/05/2004: wsfulton Patch #982753 from Fabrice Salvaire: Adds dependencies generation for constructing makefiles. New command line options -MF -MD -MMD to work with the current options -M and -MM. These options are named the same and work the same as in gcc. 11/05/2004: wsfulton %ignore/%rename changes for methods with default arguments to mirror %feature behaviour. See previous entry. *** POTENTIAL INCOMPATIBILITY *** 11/04/2004: wsfulton %feature improvements for fine tuning when wrapping methods with default arguments. Any %feature targeting a method with default arguments will apply to all the extra overloaded methods that SWIG generates if the default arguments are specified in the feature. If the default arguments are not specified in the feature, then the feature will match that exact wrapper method only and not the extra overloaded methods that SWIG generates. For example: %feature("except") hello(int i=0, double d=0.0); void hello(int i=0, double d=0.0); will apply the feature to all three wrapper methods, that is: void hello(int i, double d); void hello(int i); void hello(); If the default arguments are not specified in the feature: %feature("except") hello(int i, double d); void hello(int i=0, double d=0.0); then the feature will only apply to this wrapper method: void hello(int i, double d); and not these wrapper methods: void hello(int i); void hello(); This has been introduced to make %feature more powerful to ease the migration to new default arguments wrapping approach. *** POTENTIAL INCOMPATIBILITY *** If you previously had a %feature and didn't specify the default arguments, you will have to add them in now or you can obtain the original behaviour by using %feature("compactdefaultargs"). 11/04/2004: wsfulton [C#] Typemaps for std::vector added into std_vector.i. The proxy classes generated are modelled on the .NET ArrayList class. This isn't quite ready for general consumption yet, but will work with vectors of primitive types and some classes. 10/3/2004: wuzzeb (John Lenz) [GUILE] The -scm interface is now the default. The old GH interface can still be enabled by passing -gh to SWIG. 10/2/2004: mmatus - More fixes for namespace + class declarations. As an extra bonus, we get %template support for static/members class methods, ie, now you can say: namespace space { struct A { template static void fooT(Y y) { } }; } struct B { template void barT(Y y) {} }; %template(foo) space::A::fooT; %template(foo) space::A::fooT; %template(foo) space::A::fooT; %template(bar) B::barT; %template(bar) B::barT; %template(bar) B::barT; and call A.foo(1) b = B() b.bar(1) note the methods are emitted inside the classes, and hence, the %template name refers to the 'member' method name, not a global namespace name. 10/31/2004: mmatus - Solve namespace + class declarations, as in namespace foo { struct Bar; struct Foo { }; } struct foo::Bar : Foo { }; see namespace_class.i for more examples. - Fix %template directive to properly use namespaces, including the case: namespace one { template struct Ptr {}; } namespace one { struct Obj1 {}; typedef Ptr Obj1_ptr; %template(Obj1_ptr) Ptr; } namespace two { struct Obj2 {}; typedef one::Ptr Obj2_ptr; %template(Obj2_ptr) one::Ptr; } this is done by using the namespace name 'one' to create a namespace node to emit the template instantiation, just as before, but the template parameters are resolved and qualified in the current namespace ('one' or 'two'). This is same way that typedef works. This resolve the smart_pointer_namespace2.i case, and at the same time, several other ones where before swig was generating the "Can't instantiate template 'xx' inside namespace 'yy'" error message. In fact, that error doesn't exist anymore. You can only get an error if you use a bad namespace name or so. 10/30/2004: mmatus - [ruby] Directors fixes: - enums and std::strings are working now (several reports in bug track system) - added patch 1025861 for director + exceptions *** Attention ***: ruby with directors + protected members work with version 1.7+. Older versions seems to have a broken signature for'rb_protect'. If you need to use an old version, look at http://excruby.sourceforge.net/docs/html/ruby__hacks_8hpp-source.html for workarounds. - [ruby] Fix memory allocation problem in typemap (bug 1037259) - [tcl] Fix (enums|constants) + namespace option (reported by jason.m.surprise@intel.com). - [perl] Add patch 962168 for multiple inheretance - Fix 'defined' as variable name. 10/29/2004: wsfulton Seg fault fix for global scope operator used for friend methods: class B { friend void ::globalscope(); ... }; 10/28/2004:mmatus - Added module and swig option "templatereduce" to force swig to reduce any type needed with templates, ie, in these cases %module("templatereduce") test template struct A { }; typedef int Int; %template(A_Int) A ==> %template(A_Int) A typedef B* Bp; %template(A_Bp) A ==> %template(A_Bp) A swig reduces the types Int and Bp to their primitives int and B*. This is closer to the usual compiler resolution mechanism, and it is really needed sometimes when you mix templates + typedefs + specializations. Don't use it if you don't have any problem already, since the type reduction can interfere with some user typemaps, specially if you defined something like typedef int Int; %typemap(in) Int ...; in this case, when you use the "templatereduce" option, swig will ignore the user typemap, since the "typedef int Int" will take precedence, and the usual "int" typemap will be applied. Note that the previous case is not common, and should be avoided, ie, is not recommended to use a typedef and a typemap at the same time, specially if you are going to use templates + specializations. - Directors: virtual destructor is always emitted now, this doesn't cause any harm, and could solve some nasty and mysterious errors, like the one mentioned by Scott. also the destructor is not in-lined, so, that can solve some other mysterious errors when mixing directors + imports + embedded applications + some specific compilers. 10/27/2004: wsfulton [C#] typemaps.i library file with INPUT, OUTPUT and INOUT typemaps added. 10/27/2004: wsfulton [Java] std::wstring typemap fixes in std_string.i from Russell Keith-Magee. 10/25/2004: mmatus - Using + namespace is working now (using_namespace.i). - Derived + nested classes is working now (deriver_nested.i), but of course, we are still waiting for the nested class support. - Directors: - unnamed parameters support, - protected constructor support (automatic and with dirprot mode), - detection of really needed protected declarations (members and constructors) now is done automatically. Even if you don't use the 'dirprot' mode, swig will wrap what is minimally needed (and protected) for the code to compile. what is public, as usual, is always wrapped, and if you use the 'dirport' - Final fixes for the OSS to compile with SWIG 1.3.23 (my very very ugly C++ + templates + everything mounters wrap). 10/25/2004: wsfulton [C#] New commandline option -dllimport. This enables one to specify the name of the DLL for the DllImport attribute. Normally this name comes from the module name, so now it is possible to override this: swig -csharp -dllimport xyz example.i will generate for all the wrapped PInvoke methods: [DllImport("xyz", EntryPoint="...")] public static extern ... The wrappers from many different SWIG invocations can thus be compiled into one DLL. A new special variable $dllimport can also be used in typemaps, pragmas, features etc. This will get translated into the value specified by -dllimport if specified, otherwise the module name. 10/22/2004: wsfulton [Java] Patch #1049496 from Scott Michel fixes directors methods with enums when wrapped with typesafe or proper Java enums. 10/21/2004: wsfulton Fixes for default arguments in director constructors (Python, Ruby, Ocaml). 10/21/2004: mmatus - [Python] Add the '-cpluscast' option to enable the 'new' C++ casting operators, such as 'static_cast', inside the typemaps. By default swig use the old C cast style, even when parsing C++. - [Python] Add the '-new_vwm' option to enable the new SwigValueWrapper mode. Now this is mainly for testing that the typemaps are really safe for any future solution, but you can use it if you have a very strange error with default cosntructors missing + %apply + %typemap, and if everything else fails (see valuwrapper_opaque.i for alternative and current solutions). If you are a user that don't know what is SwigValueWrapper, don't even try it. - [Python] Add the '-noh' option to be used with directors and when you prefer to disable the generation of the director header file. If not used, swig will work as usual generating both the wrap.cxx and wrap.h files. If you use it, swig will only generate wrap.cxx. 10/21/2004: wuzzeb (John Lenz) - If you define SWIG_TYPE_TABLE when compiling a wrapper file, the runtime types will be stored in the given type table name. Using this, you can seperate different modules to share their own type systems. -DSWIG_TYPE_TABLE=Mytable - [Python] If you define SWIG_STATIC_RUNTIME then the type information will be static to this wrapper. Nothing will be shared with any other modules - [Python] If you define SWIG_LINK_RUNTIME, then instead of using the new way of sharing type information, the wrapper will expect to be linked against the Lib/linkruntime.c file. Any modules compiled with SWIG_LINK_RUNTIME and linked against linkruntime.c will all share type information. 10/20/2004: mmatus - [Python] Initial fix for python/import example. Please update the Makefile (autoconf, configure, etc, expert), since now probably is only working with g++, icc and a few other compilers that have the -shared option. We need to create additional shared libraries for the virtual destructors. Old and usually forgotten C++ requirement. Same fix need to be used in perl, I think. - [Python] Fix generation of header file for directors, now directors.swg is also included, so, it can be really used from C++, and it solves some problem with compiler that require that, even with the simple swig inclusion. - [Python] Reordering the methods and moving some bodies outside the class declaration. This is needed due to some gcc-2.96 internal compiler errors. It seems the PYTHON class is getting too large to been declared and defined at the same time. - Add the -oh option to change the output header file name if needed: swig -c++ -python test.i -o test.CC -oh test.HH this is mainly needed when using directors, and if the current default header file name is not good for you, which is generated as follow: swig -c++ -python test.i => test_wrap.h swig -c++ -python test.i -o test.CC => test.h 10/20/2004: wsfulton 1) Compact default arguments feature added. This feature allows one to use the default argument code generation that was used in SWIG-1.3.22 and earlier versions. It produces more compact wrappers as only one wrapper method is generated for any method with default arguments. So the advantage is it generates less code but has the original limitations, like it it does not work with all default arguments and default arguments cannot be taken advantage of in the strongly typed languages (C# and Java). It is implemented via the usual %feature mechanism: %feature("compactdefaultargs"); 2) Keyword arguments (kwargs) are working again for default arguments in the languages that support it, ie, Python and Ruby. The new default argument wrapping approach using overloaded methods cannot support kwargs so the compact default argument feature is automatically turned on when kwargs are specified, by %feature("kwargs"). 3) Compact default arguments are also automatically turned on when wrapping C (not C++) code. This is to support the bizarre notion of default arguments for C code. 10/20/2004: wsfulton Overloaded templated functions in namespaces also working now. Templated functions with default arguments in namespaces too. 10/19/2004: mmatus - Allow to disable the new SwigValueWrapper mechanism, if you add the following line in your language main. /* Turn on safe value wrapper use mode */ Swig_value_wrapper_mode(1); Now is only active in python. All the other languages are using the old resolution, but they can also use the "valuewrapper"/"novaluewrapper" features to fix some of the old broken cases. Note, however, that not all the broken cases can be solved in that way. The new mechanism seems to be working fine in perl, ruby and tcl, but failing in some typemaps in java. Hence, is upto the language maintainer to test it, and decide to enable it or not. Look at the valuewrapper_opaque.i for examples. - Fix more SwigValueWrapper cases when the new mechanism is active. Now it also check for local typemap variables, see valuewrapper_opaque.i for an example when this is needed. But again, this extra checking will only be activated when using the new value wrapper mode. - [Python] Fix variable wrapping of classes with private assign operators. It should be easy to fix in all the other modules, instead of checking if (!Getattr(n,"immutable")) ... you need to verify if (is_assignable(n)) ... Look at the private_assign.i for an example. 10/18/2004: mmatus - %features "director"/"nodirector" now work as expected. - General fixes in %feature to resolve function decl properly, %feature("hello") foo(); char foo() -> f() // was working char *foo() -> f().p // it wasn't - Template + specialization + default template args now is working, (don't confuse with template + default arg values, that was solved before), now this ugly case is working: template > struct Vector { Vector(T a){} }; template <> struct Vector { Vector(){} int foo() { return 0; } }; %template(V_c) Vector >; %template(V_i) Vector; // picks Vector > %template(V_d) Vector; // picks the specialization this is needed for automatic STL support (later will be). - Fix the template + typedef errors in test-suite, which probably will fix another group of strange template + namespaces + typedefs errors. - %warnfilter is working better now, parser.y tries to use them when needed. - **** New default type resolution method (stype.c) ***** It preserves the original mixed types, then it goes 'backward' first deleting the qualifier, then the inner types, for example: typedef A *Aptr; const Aptr&; r.q(const).Aptr -> r.q(const).p.SWIGTYPE r.q(const).p.SWIGTYPE -> r.p.SWIGTYPE r.p.SWIGTYPE -> r.SWIGTYPE r.SWIGTYPE -> SWIGTYPE enum Hello {}; const Hello& hi; r.q(const).Hello -> r.q(const).enum SWIGTYPE r.q(const).enum SWIGTYPE -> r.enum SWIGTYPE r.enum SWIGTYPE -> r.SWIGTYPE r.SWIGTYPE -> SWIGTYPE int a[2][4]; a(2).a(4).int -> a(ANY).a(ANY).SWIGTYPE a(ANY).a(ANY).SWIGTYPE -> a(ANY).a().SWIGTYPE a(ANY).a().SWIGTYPE -> a(ANY).p.SWIGTYPE a(ANY).p.SWIGTYPE -> a(ANY).SWIGTYPE a(ANY).SWIGTYPE -> a().SWIGTYPE a().SWIGTYPE -> p.SWIGTYPE p.SWIGTYPE -> SWIGTYPE before it always stops after finding ref/pointer/enum/array/etc. Now, then, you can define (use and apply) 'higher' typemaps such as: %typemap(in) SWIGTYPE* const& %typemap(out) char FIXSIZE[ANY] %typemap(in) SWIGTYPE* const& %typemap(in) const enum SWIGTYPE& %typemap(in) SWIGTYPE[ANY][ANY] %typemap(in) const char (&)[ANY] It is possible with this change that previous typemaps that were defined (but ignored), now will start to work. Also, it is necessary check for the '%typemap(varin) SWIGTYPE[]', before it was usually not defined (but char[] was), and that can produce some inconsistencies. *** POTENTIAL INCOMPATIBILITY *** This change was needed for STL, since std::vector std::vector, etc, will always generate methods that mix const references with the vector type. Now that is working, all the std::container specialization will not be needed anymore, well, in theory. In the practice, everythin is working as before until the proper mixed types are defined and the libraries simplified to use them. - Change the behavior of extern "java"/"fortran"/"etc", now swig produces a warning, and use extern "C" instead. The warning can also be disable with the "-w 313" flag. (WARN_PARSE_UNDEFINED_EXTERN). - SwigValueWrapper is now more selective (lang.cxx). [Perl/Tcl] - Fix some typemaps (perl/tcl) to work properly with SwigValueWrapper. This was not a problem with SwigValueWrapper, but with the typemaps that now are safe to use with %apply. [Python] - Fix %callback/%pythoncallback work now as before after the def args changes. Also, %callback now is an alias for %pythoncallback, so, they do the same. [Python/Ruby] - %callback is more usable and uniform: %callback("%s_cb") foo(); // for both, python/ruby %callback("%s_cb"); // for both, python/ruby %callback(1) foo(); // only in python. 10/17/2004: arty [OCAML] - Tweak to enum typing for soundness in the presence of multiple modules. - global functions are now unambiguous in multiple loaded modules. - Fixed test case code to build multimodule test cases correctly. - There is no way to share overload resolution across modules because of soundness issues. If the user wants to call some function foo from an arbitrary module bar, they will have to use Bar._foo to call it correctly. Later I will fix the camlp4 module to do something clever in this case. - Promided performance overhaul of class mechanism. - Removed symbol hack for ocaml-3.07 and below which is not needed for ocaml-3.08 and above. 10/16/2004: wuzzeb (John Lenz) [CHICKEN] - Completly change how chicken.cxx handles CLOS and generic code. chicken no longer exports -clos.scm and -generic.scm. The clos code is exported directly into the module.scm file if -proxy is passed. - The code now always exports a unit. Running the test-suite is now majorly broken, and needs to be fixed. - CLOS now generates virtual slots for member variables similar to how GOOPS support works in the guile module. - chicken no longer prefixes symbols by the module name, and no longer forces all names to lower case. It now has -useclassprefix and -closprefix similar to how guile handles GOOPS names. 10/16/2004: wsfulton Templated functions with default arguments working with new default argument wrapping approach. The new approach no longer fails with the following default argument pattern (previously failed with some primitive types, like unsigned primitive types): template int foo(const T& u = T()); %template(foo) foo; This relies on the templated function overloading support just added, so all the combinations of overloading by template parameters and normal parameters as well as overloading with default parameters works. 10/16/2004: wsfulton Added support for the large range of templated function overloading that C++ supports. - Overloaded templated functions, eg template int overload(T t); template int overload(T t, const T &r); - Fixes where the templated type is not used in the parameter list, eg template void xyz(); template<> void xyz(); - Fixes for overloading of plain functions by a templated function: void abc(double d); template void abc(T t); - Overloading by templated parameters fixed: template void foo(T t) {} template void foo(T t, U u) {} %template(foo) foo; - All combinations of the above also working including specializations, eg: void abc(double d); template void abc(T t); template<> void abc(double t); template<> void abc(int t); 10/16/2004: wuzzeb (John Lenz) - Remove the ability to share type information by using c linking. All type sharing happens through a global variable in the target language. + Remove SWIG_NOIMPORT, SWIG_RUNTIME, and related defines. + Deprecate -runtime, -noruntime command line options + Update test-suite common.mk to correctly build multicpptest + Remove reference to precommon.swg + Update the guile_gh interface to share data by a global var instead of c linkage. - Remove Advanced.html, since everything in it is now obsolete 10/09/2004: mmatus - Split the python std/STL C++ library files, now all the language independent definitions are under the directory Lib/std and hence, can be used from other languages. - Add more documentation to the Python STL, and clean unnecessary code. - Add initial C99 complex support, and some fixes for long double. 10/08/2004: mmatus - Fix the SwigValueWrapper for opaque types, now it is applied for opaque templates and classes, for which we don't know if there is or not a default constructor, ie struct A { A(int); }; Still, if you know that you class has a default constructor, and for some very very particular reason you want to avoid the SwigValueWrapper, and you don't want or can't expose the class to swig, now you can say %feature("novaluewrapper") A; class A; or the other way around, if the class has a default constructor, but you want to use the value wrapper, you can say %feature("valuewrapper") A; struct A { A(); .... }; - Fix for char > 128, ie const char tilde_a = '\341'; - Add patch 1041858 for $lextype, which carries the literal type of a symbol. See lextype.i in the test-suite for more details. 10/07/2004: wsfulton {Ruby, Java] Fix director + 'empty' throws struct A { A() throw(); virtual ~A() throw(); int foo() throw(); }; 10/06/2004: wuzzeb (John Lenz) [TCL] - Fix bug reported by William A. Hoffman propagating clientdata between modules. Added clientdata_prop.multicpptest to check for this bug. The fix involved the following changes: + SwigType_clientdata_collect does not need to check types in r_resolved because we only want to propagate clientdata to typedefed classes, and r_mangled already takes care of typedefs. + SWIG_TypeRegister now copies the clientdata field correctly + Move SWIG_Guile_PropagateClientData function from guile module into common.swg, because we need to call it from both guile and tcl. + Add base_names to swig_class to delay the lookup of bases. SWIG now exports the base names and only when the base swig_class is needed is SWIG_TypeQuery(name)->clientdata looked up. - conversion_ns_template testsuite test was failing because the name of the wrapped constructor function was not calculated correctly for structs. Fixed. 10/06/2004: wsfulton Fixes for default arguments used in directors - in virtual methods and director constructors. 10/06/2004: mmatus Fix the __cplusplus macro, and bug 1041170. Now it is working as supposed, ie, you can safely use #ifdef __cplusplus ... all over swig, including inside %defines and %{ %} bodies. *** POTENTIAL INCOMPATIBILITY *** The old trick of using #if __cplusplus doesn't work any more. So, if you have your own typemaps using that syntax, you will need to migrate them to use "#ifdef __cplusplus". 10/05/2004: wuzzeb (John Lenz) - Reorganize how runtime type information is stored and shared between modules. For chicken and mzscheme, I removed the ability to use runtime libraries, while perl, tcl, python, and ruby default to using the new method but can go back to the old method by declaring SWIG_ALLOW_RUNTIME. - line 582 in mzscheme.cxx was generating a segfault on imports.multicpptest, so I fixed it. 10/05/2004: wsfulton Fixes for %extend and overloaded static methods with default arguments. 10/05/2004: mmatus - [python] Fix director + method with 'empty' throw, ie struct A { virtual int foo() throw(); }; other languages should also easy to fix, look for Getattr(n,"throw") in python.cxx. - Fix director + destructor with 'empty' throw struct A { virtual ~A() throw(); }; - Now SWIG_FEATURES parse all and the same options you can pass to swig in the command line. - New command line flag: -features , as in swig -features autodoc=3,director ie, any global feature can be initialized from the command line. This is mainly for testing, but users can also take advantage of it. 10/04/2004: mmatus - Properly qualify type in syntax as 'long(2)' or 'Foo()', this solve old problem with default args, and probably other problems around. However, the default arg problem was also already solved by William (see bellow). - Fix feature_set and feature_get methods. Before they look from particular to general and keep the first feature found. This didn't work well with templates. Now the methods look from general to particular, and override any found feature. - Previously a feature could not be applied to constructors or destructors that weren't explicitly declared in the class. This is now fixed, for example: %feature("featurename") Foo() "..." %feature("featurename") ~Foo() "..." class Foo { // implicit Foo() and ~Foo() }; - Fix missing features for default const/dest, by really 'creating' the methods and applying the features. - Fix return_const_value.i case by adding SwigValueWrapper specialization. - Fix %extend + overload, including overloading actual class methods. - Adding more cases in related files in the test-suite. 10/04/2004: wsfulton Changes to the way default arguments are wrapped. Previously a single method was generated for each method that had default arguments. If a method had 5 arguments, say, of which 1 had a default argument then the call to the wrapped method would pass 5 arguments. The default value was copied into the wrapper method and used if the scripting language passed just 4 arguments. However, this was flawed as the default argument sometimes does not have global access, for example SWIG would generate code that couldn't compile when wrapping: class Tricky { public: void foo(int val = privatevalue); void bar(int val = Tricky::getDefault()); private: static int getDefault(); enum { privatevalue = 200 }; }; Also bugs in resolving symbols generated code that wouldn't compile, for example (probably fixable though): namespace Space { class Klass { }; Klass constructorcall(const Klass& k = Klass()); } The approach also does not work for statically typed languages (C# and Java) as these languages do not allow methods to have variable number of arguments. Although C# has a mechanism to pass a variable number of arguments they must be of the same type and are more like varargs. The new approach solves the above problems and wraps methods with default arguments as if the method was overloaded. So SWIG will now treat void foo(int val=0); as if it had parsed: void foo(int); void foo(); The code generated is then exactly the same as if SWIG had parsed the two overloaded methods. The scripting languages count the arguments passed and call the appropriate method, just like overloaded methods. C# and Java are now able to properly wrap methods with default arguments by generating extra methods, again as if the method was overloaded, so for: void bar(string s="hello", double d=10.0, int i=0); the following proxy methods are generated: void bar(string s, double d, int i); void bar(string s, double d); void bar(string s); void bar(); The new approach comes with a couple of minor knock on effects. 1) SWIG support for default arguments for C (not C++) code no longer works. Previously you could have this interface: %{ void foo(int val); %} void foo(int val=0); and call the wrapped method from a scripting language and pass no arguments whereupon the default of 0 was used. You can get the same behaviour for C code by using the "default" typemap: %typemap(default) int val "$1 = 0;"; %{ void foo(int val); %} void foo(int val); or you could of course compile your code as C++ if you want C++ features :) : %{ void foo(int val=0); %} void foo(int val=0); A couple of SWIG's libraries used this C extension and these have been modified to use the "default" typemap. The "default" typemap is thus unchanged (and still is not and is not fully supported by C# and Java, and is likely to remain so). 2) All features (%feature, %rename, %ignore etc) no longer work as if the method with default arguments is just one method. For example, previously %ignore foo(int); would have ignored the method completely. Now it will only ignore foo(int) but not the extra foo() method. Instead use: %ignore foo; to ignore them all. or %ignore foo(int); %ignore foo(); This of course allows one to fine tune the wrapping, for example one could use: %rename(fooint) foo(int); %rename(foodefaults) foo(); void foo(int val=0); and call them from any language like so: fooint(200) foodefaults() or for example ignore the extra overloaded method, so the defaults cannot be used: %ignore foo(); void foo(int val=0); *** POTENTIAL INCOMPATIBILITY *** 10/2/2004: mmatus [Python] - More cleaning up and uniformation on the Python Lib - Added Robin's docstring patch, plus some fixes, plus some extensions, see autodoc.i example in the test-suite, and try using %feature("autodoc","extended"). This patch is not a complete solution for the documentation problem, just enough to inform python about the parameter list. The expected swig documentation support is far far away yet. 10/1/2004: mmatus - Fix the %callback feature (only used in ruby and python examples, by now, but it should be generic), now member callbacks are working again - Fix wrapping of functions pointers like std::ostream& std::endl(std::ostream&); ie, the ones that return references or enums. [Python] Add the %pythoncallback directive, which is an improved version of %callback, ie, %pythoncallback(1) foo; %pythoncallback(1) A::bar; %pythoncallback(1) A::barm; int foo(int a) { return a; } struct A { static int bar(int a); int barm(int a); }; int foobar(int a, int (*pf)(int a)); in python you can use foo(2) foobar(2,foo) A.bar(2) foobar(2,A.bar) ie, no additional pointer elements are created, and the original 'foo' and 'A.bar' can be used as parameters. In the case of member fucntion however, still you need to use the special variable Class::_cb_ptr, ie: foobarm(3, a, A.barm_cb_ptr) we will try to fix this situation also, but later. [Python] Add more elements from the STL library, now you can use import std std.cout << "hello " << 123 << std.endl [Python] Fix in/out return mechanism, now swig will behave as 1.3.21 but using a python list when needed. The problem is that the types std::pair,std::vector,etc, use tuples, and they interfer with the previous inout tuple type. By using lists we solve the conflicts, swig acts as before, but returns a list when more than one parameter are using the OUT typemap. See the new inout.i example in the test-suite. *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** [Python] Much better error messages for bad arguments, now you always get the argument number where the error occurred. 09/27/2004: wsfulton Patch from Bill Clarke - 1) Warning emitted when -importall and -includeall is used together, with -includeall taking precedence. 2) Ensure SWIGIMPORTED is always defined when a file is being imported with %import. Note that this is not the same as SWIGIMPORT, which gets defined in all generated wrapper files. 09/26/2004: mmatus - add %feature("exceptionclass") to identify a class used as exception. Before swig identified and marked a class using the "cplus:exceptionclass" attribute. However, the class needed to appear on an throw() statement. Now swig keeps trying to identify the exception classes, as before, but it also allows the user to mark a class by using the %feature explicitly. (mostly relevant for python and chicken) [Python] - fix -modern option + exceptions, which mix old class style with the new one. So, we always need to emit the "nonmodern" python code. - add the "python:nondynamic" feature and its handler now if you have %pythonnondynamic A; struct A { int a; int b; }; then, in the python side aa = A() aa.a = 1 # ok aa.b = 2 # ok aa.c = 3 # error, the class can not be extended dynamically. Since this is a feature, you can use %pythonnondynamic; or %pythondynamic; [ Note: %pythondynamic since deprecated ] to force all the wrapped classes to be "nondynamic" ones. The default, as in regular python, is that all the wrapped classes are dynamics. So, careful with your spelling. 09/14/2004: mmatus - Support the -I- option. - Differentiate between %include and %include "file". This fix several corner cases. [Python] Several patches: - Normalize the Lib file names: *.swg internal files, *.i user files. - Fix Char[ANY] typemaps, so they also delete any extra '\0' chars, now they behave as before (1.3.21). Still, you can use the SWIG_PRESERVE_CARRAY_SIZE macro if you need to preserve the original size (see pystrbase.swg). - Add the Char FIXSIZE[ANY] typemaps, to preserve the original C array sizes (see above). Though, you can't use them yet since %apply and arrays are not working together. - Add pyfragments.swg, now the user can add fragments to override the default ones. 09/10/2004: wsfulton Patch from Bill Clarke which fixes spurious preprocessor bug which shows on Solaris and gcc, eg: Warning(202): Could not evaluate '!defined(SWIGJAVA) && !(defined(SWIGCSHARP)' Also fixes a bug where '#if "a" == "b" == 1' wouldn't have worked 09/10/2004: wsfulton Restored multiple build directories for the test-suite. Patch from Bill Clarke. 09/06/2004: wsfulton Added the missing runtime.dsp Visual Studio project files for the import examples to work. Version 1.3.22 (September 4, 2004) ================================== 09/03/2004: wsfulton The swig.m4 macro for use with the Autoconf/Automake/Libtool has been removed and is no longer installed. Please use the new and better maintained version derived from swig.m4 in the Autoconf macro archive. See http://www.gnu.org/software/ac-archive/htmldoc/ac_pkg_swig.html and http://www.gnu.org/software/ac-archive/htmldoc/ac_python_devel.html. 09/01/2004: wsfulton [Perl] Applied patch #1019669 from Christoph Flamm. Adds support for %feature("shadow") in the same way as it works in Python. This enables one to override the generated shadow/proxy methods, including constructors and destructors. For example: /* Let's make the constructor of the class Square more verbose */ %feature("shadow") Square(double w) %{ sub new { my $pkg = shift; my $self = examplec::new_Square(@_); print STDERR "Constructed an @{[ref($self)]}\n"; bless $self, $pkg if defined($self); } %} class Square { public: Square(double w); ... }; 08/31/2004: mmatus [Python] Incompatibility reported by Bill Clarke (llib@computer.org): If you are using Sun Studio 8 (and possibly earlier versions) to compile the output produced by swig 1.3.22rc1, and you are using C++ and STL templates then you need to use either "-runtime" or "-noruntime". If you use neither of these options then you will probably get compiler errors when trying to compile the wrapper file; the error message will be like this: The name SWIG_Python_ConvertPtr[...] is unusable in static swigpy::traits_asptr[...] If you get this error message, you need to regenerate your wrapper file using 'swig -runtime' or 'swig -noruntime'. You shouldn't get this problem with Sun Studio 9. *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** 08/26/2004: wsfulton [Perl] Applied #932333 from Ikegami Tsutomu. Fixes long long *OUTPUT and unsigned long long *OUTPUT typemaps in typemaps.i. 08/26/2004: wsfulton Applied patch #857344 from Art Yerkes. Workaround for autoconf bug when running 'make install'. 08/26/2004: wsfulton [Perl] Part of patch #982753 applied. This implements a %perlcode directive. It allows one to add Perl code to the generated .pm file. Works the same as %pythoncode. 08/26/2004: wsfulton [Java] Fix for directors when wrapping virtual methods with exception specifications that were not simple types. Previously code was generated that didn't compile, for example when the exception specification was a pointer. 08/25/2004: wsfulton [C#] Typemap fix for methods that return char *. The CLR would incorrectly delete the memory pointed to by char *. Also applied the same correction to the char array typemaps. 08/24/2004: wsfulton Fixes for -fmicrosoft error/warning message display: - End of file (EOF) warning messages not displaying in correct format - Some messages containing a file path were displaying a double backslash instead of a single backslash 08/23/2004: wsfulton Applied patch #1011604 submitted by Charles Schwieters. Fix for 64 bit tcl interpreters. 08/23/2004: wsfulton Fix for bug #875583 - enum forward declarations previously gave a syntax error. 08/23/2004: mkoeppe [Allegro CL] Use typemaps "ffitype" and "lisptype" to determine the FFI type specifiers from the C type. This makes it possible, for instance, to control whether a C "char" argument takes a Lisp character or a Lisp integer value. The default (taking Lisp characters) is done by these built-in typemaps: %typemap(ffitype) char ":char"; %typemap(lisptype) char "character"; If char means an integer instead, use these typemaps: %typemap(ffitype) char ":char"; %typemap(lisptype) char "integer"; 08/22/2004: wsfulton As discussed in bug #772453, the SWIG library directory is now installed into a different default directory. The library used to be installed to /usr/local/lib/swig1.3. It is now in the more usual architecture independent directory and I have additionally used a version specific subdirectory as the library will rarely work with older versions of SWIG. This release will thus use /usr/local/share/swig/1.3.22 by default, which can be tailored as before using './configure --swiglibdir'. 08/17/2004: mkoeppe [MzScheme] Add support to create native MzScheme structures from C structures. To convert a C structure to an MzScheme structure, use the new runtime macro SWIG_NewStructFromPtr in a typemap. Patch from Dmitriy Zavin. 08/12/2004: wsfulton Patch #837715 from Ben Reser to correctly detect Python lib directory on 64 bit systems. 08/12/2004: wsfulton [C# and Java] Prevent memory leaks in the case of early return from wrapper methods using const std::string & parameters. Modified Mark Traudt patch #951565. 08/12/2004: wsfulton Bug #943783 with patch fixes php char * out typemap NULL values. 08/03/2004: Ahmon Dancy [allegrocl] Additional case mode fixes. Also, make sure foreign types are exported. 07/24/2004: mkoeppe [Guile] In -scm mode, SWIG modules now exchange their pointer type information via the Guile interpreter. It is no longer necessary to build a runtime library or to use -noruntime and -runtime etc. The module (Swig swigrun) which was introduced in the change of 05/17/2004 is no longer automatically built. If you need it, run SWIG on the interface file swigrun.i. 07/23/2004: wsfulton [C#] Bug #917601 Mapping C++ bool fix from Mark Traudt 07/23/2004: wsfulton RPM fixes for latest CVS version including removal of runtime library. 07/23/2004: wsfulton Patch #908955 from Robert H De Vries. RPM file generation fix for Fedore Core 1 and Redhat AS2.1. 07/12/2004: wsfulton Patch #864689 from Robin Dunn: This patch corrects two problems in the XML output of SWIG: 1. There were often extra '/>\n' in the output. 2. value attributes were output with '\n' in them but since that is not technically legal most (all?) XML parsers will strip them out. Replacing the '\n' with the ' ' entity reference solves this as that is legal and XML parsers will convert it to a '\n' when reading the values back in. This patch also adds a new global command line option that will allow the parse tree to be written out in XML *after* some other language module has been run, in order to be able to get extra info that the language module puts in the tree. In this way the XML is a post-processed version of the tree rather than a pre-processed version. Command line option is -dump_xml or -xmlout 07/12/2004: wsfulton [Java] Patch from Scott Michel to fix typesafe enums and proper enums with directors. 07/12/2004: wsfulton HTML documentation (makechap.py) file generator missing end of line patch #908951 from Robert de Vries. 07/08/2004: wsfulton The deprecated runtime library build has been removed. This also removes the dependency on Libtool. Libtool is no longer required to build SWIG. The associated -ldflags SWIG commandline option has also been removed. The examples and test-suite testcases that used the runtime library have been updated to use the replacement approach to using SWIG across multiple modules, that is they use the -noruntime and -runtime commandline options, see Modules.html. Effectively they build their own runtime libraries using -runtime. The examples are import and import_template. The test cases are in the imports and template_typedef_import directories. Anyone who wants the original runtime libraries can either run the test-suite or build the examples and use the appropriate shared object/DLL that is generated with the -runtime commandline option. For example libimports_runtime.so (Python calls it lib_imports_runtime.so) is generated after running the 'make imports.multicpptest' testcase in the Examples/test-suite/ directory. Or use libruntime.so / runtime.dll after building the import examples in Examples//import. 07/07/2004: mkoeppe [Allegro CL] Convert character and string literals in constants to CL syntax. Fix FF:DEF-FOREIGN-CALL for mixed-case C functions. 06/27/2004: wsfulton [Java] New feature for Java exceptions with format %javaexception(exceptionclasses). This feature is a slight enhancement to %exception and the only difference is the addition of the exception classes which are generated into a throws clause. The 'exceptionclasses' is a comma separated list of classes which will be added to the associated proxy method's throws clause. The 'exceptionclasses' are specified like the exception classes in the 'throws' attribute in the typemaps. This feature should be used for correctly handling checked exceptions thrown from JNI code. For example: %javaexception("java.lang.Exception") throwException %{ ... convert a std::logic_error into a java.lang.Exception using JNI code ... %} #include void throwException() { throw std::logic_error("Logic error!"); } will generate a method with a throws clause in the module class: public static void throwException() throws java.lang.Exception { ... } 06/27/2004: wsfulton [C#] New %csconstvalue(value) feature directive for use with constants and enums. This works the same way as %javaconstvalue. For C#, this directive is the only way that one can fix wrapping of C/C++ enums with proper C# enums if the enum item's initialiser cannot compile as C# code. This is because Java enums can use a call into C code to initialise the enum item, whereas in C#, the enum value must be a compile time constant. That is, using %csconst(0) cannot be used in C# to initialise the C# enum item via a PINVOKE call. 06/27/2004: wsfulton [Java] New %javaconstvalue(value) feature directive for use with constants and enums. Sometimes the use of %javaconst(1) will produce code that won't compile under Java. If a compile time constant is required, %javaconst(0) is not an option. The %javaconstvalue directive achieves this goal and the value specified is generated as Java code to initialise the constant. For example: %javaconst(1); %javaconstvalue(1000) BIG; %javaconstvalue("new java.math.BigInteger(\"2000\")") LARGE; %javaconstvalue(10) bar; %{ const int bar = 10; %} %inline %{ #define BIG 1000LL #define LARGE 2000ULL enum Foo { BAR = ::bar }; %} Generates: public interface exampleConstants { public final static long BIG = 1000; public final static java.math.BigInteger LARGE = new java.math.BigInteger("2000"); } public final class Foo { public final static Foo BAR = new Foo("BAR", 10); ... } Previously, none of BIG, LARGE or BAR would have produced compilable code when using %javaconst(1). 06/27/2004: wsfulton %feature enhancements. Features can now take an unlimited number of attributes in addition to the feature name and feature value. The attributes are optional and are much the same as the typemap attributes. For example, the following specifies two optional attributes, attrib1 and attrib2: %feature(featurename, attrib1="attribval1", attrib2="attribval2") name "val"; %feature(featurename, val, attrib1="attribval1", attrib2="attribval2") name; 06/27/2004: wsfulton %feature improvements for the syntax that takes the feature value within the %feature() brackets. The value specified is no longer restricted to being just a string. It can be a string or a number. For example, this is now acceptable syntax: %feature("featurename",20.0); whereas previously it would have to have been: %feature("featurename","20.0"); Useful for features that are implemented as a macro, for example: #define %somefeature(value) %feature("somefeature",value) These will now work accepting either a string or a number: %somefeature("Fred"); %somefeature(4); 06/06/2004: wuzzeb (John Lenz) [Chicken, Guile] - Created the Examples/test-suite/schemerunme directory, which holds all the runme scripts for guile and chicken (and possibly mzscheme...). The guile and chicken _runme files then (load "../schemerunme/foo.scm"). - In chicken module, fix a few bugs invlolving dynamic casts. 06/03/2004: wsfulton Patch to fix wrapping of templated methods. ISO compliant compilers, like Comeau and GCC-3.4.0, don't like the template specifier that SWIG was generating when calling the method. This fix may break some non standard compliant compilers, for example, Sun workshop compilers prior to version 6.2.p2. Patch submitted by Bill Clarke. 06/03/2004: wsfulton [Java, C#] Undocumented special variable $imclassname removed. New special variable $module is replaced by the module name, as specified by %module or -module commandline option. $imclassname can be created from $module. 06/03/2004: wsfulton [C#] Same as for Java below. The new typemaps are named differently, namely, csbody and csbody_derived. The deprecated typemaps are csgetcptr and csptrconstructormodifiers. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 06/03/2004: wsfulton [Java] Typemap changes for the Java proxy / typewrapper and enum classes. A new typemap called javabody contains the essential support code for generation into the body of these classes. There is also a new javabody_derived typemap which is used instead for wrapped classes that have a wrapped base class. The code is basically, the getCPtr() method and swigCPtr and swigCMemOwn member variables. These used to be hard coded with no way to modify the code. The introduction of this typemap makes it possible for the user to tailor nearly every aspect of the code generation. The exception now is the code for director classes. The javagetcptr and javaptrconstructormodifiers typemaps are deprecated and are no longer used as the code that these generated can be put in the more flexible javabody and javabody_derived typemaps. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** The following macros contributed by Scott Michel may help you upgrade if you have used the javagetcptr typemap: /* Utility macro for manipulating the Java body code method attributes */ %define SWIGJAVA_ATTRIBS(TYPENAME, CTOR_ATTRIB, GETCPTR_ATTRIB) %typemap(javabody) TYPENAME %{ private long swigCPtr; protected boolean swigCMemOwn; CTOR_ATTRIB $javaclassname(long cPtr, boolean cMemoryOwn) { swigCMemOwn = cMemoryOwn; swigCPtr = cPtr; } GETCPTR_ATTRIB static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %typemap(javabody_derived) TYPENAME %{ private long swigCPtr; CTOR_ATTRIB $javaclassname(long cPtr, boolean cMemoryOwn) { super($moduleJNI.SWIG$javaclassnameUpcast(cPtr), cMemoryOwn); swigCPtr = cPtr; } GETCPTR_ATTRIB static long getCPtr($javaclassname obj) { return (obj == null) ? 0 : obj.swigCPtr; } %} %enddef /* The default is protected getCPtr, protected constructor */ SWIGJAVA_ATTRIBS(SWIGTYPE, protected, protected) /* Public getCPtr method, protected constructor */ %define PUBLIC_GETCPTR(TYPENAME) SWIGJAVA_ATTRIBS(TYPENAME, protected, public) %enddef /* Public getCPtr method, public constructor */ %define PUBLIC_BODYMETHODS(TYPENAME) SWIGJAVA_ATTRIBS(TYPENAME, public, public) %enddef 06/03/2004: wsfulton [Java, C#] The contents of the class modifier typemaps and pragmas have changed. They must now include the class type. Previously 'class' was hard coded. This change enables flexibility into what type of class is generated, for example the proxy class could be an interface instead of a class. For Java this affects the javaclassmodifiers typemap and the jniclassclassmodifiers and moduleclassmodifiers pragmas. For C# this affects the csclassmodifiers typemap and the imclassclassmodifiers and moduleclassmodifiers pragmas. Unless you have overridden the default versions of these typemaps or pragmas, you shouldn't be affected. However, if you have, upgrading is easy, for example class Foo {}; %typemap(javaclassmodifiers) Foo "public final" must now be: class Foo {}; %typemap(javaclassmodifiers) Foo "public final class" *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/31/2004: wsfulton Fix for C++ exception specifications that are references. Problem reported by Oren Miller. Also improves the generated exception declarations in the catch handler for pointers - a pointer is used instead of a reference to a pointer. Added default throws typemaps for SWIGTYPE &, SWIGTYPE * and SWIGTYPE[ANY] (Java and C#). 05/31/2004: wsfulton [Java, C#] Some minor typesafe enum improvements, including storing the name of the enum item. The toSring() / ToString() methods are overridden to return this name. 05/30/2004: wuzzeb (John Lenz) [Chicken] - Update how examples and the test suite are built. - Symbol names are no longer converted to lower case - Added union_runme.ss, which was copied and modified from the guile module 05/26/2004: lballabio (Luigi Ballabio) Committed on behalf of Marcelo (who still has problems with the SourceForge CVS.) Added Python typemaps for FILE* with (Python-only) test. 5/24/2004: dancy * Allegro CL module: Now using some macros (defined in Lib/allegrocl/allegrocl.swg), swig-defconstant and swig-defun, for defining constants and foreign functions. This makes the generated file a bit neater. Now strips a layer of parenthesis from constants. Uses (* :void) instead of :foreign-address now. 05/20/2004: wsfulton Unnamed enum global variables are now supported in addition to the recently added support for unnamed enum member variables. For example: struct Foo { enum { enum1, enum2 } MemberInstance; }; enum { enum3, enum4 } GlobalInstance; The int typemaps are used for wrapping the get/set accessor methods. If the sizeof an enum is not the same size as an int then setting the variable will silently do nothing as the casts cannot be easily and portably generated. If you need to solve this highly obscure situation, write the assignment using the %exception feature. 05/20/2004: wsfulton [C#] C# enum wrapping mods. Similar to the Java module, enums can be wrapped using one of 3 approaches: 1) Proper C# enums - use %include "enums.swg" 2) Typesafe enums - use %include "enumtypesafe.swg" 3) Simple constant integers (original approach) - use %include "enumsimple.swg" See each of these files for further details. Each of these files use typemaps and a new feature to control the generated code. The feature is: %csenum(wrapapproach); where wrapapproach should be one of: "proper", "typesafe", "typeunsafe" or "simple". [No implementation deemed necessary for type unsafe enums]. The default approach is proper C# enums. Anonymous enums are always wrapped by constant integers. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 05/20/2004: wsfulton [Java] Java enum support added. There are now 4 ways in which enums can be wrapped: 1) Proper Java enums - use %include "enums.swg" 2) Typesafe enums - use %include "enumtypesafe.swg" 3) Type unsafe enums (constant integers) - use %include "enumtypeunsafe.swg" 4) Simple constant integers (original approach) - use %include "enumsimple.swg" See each of these files for further details. Each of these files use typemaps and a new feature to control the generated code. The feature is: %javaenum(wrapapproach); where wrapapproach should be one of: "proper", "typesafe", "typeunsafe" or "simple". The default typemaps will handle enums that may or may not have specified initial values, for example ten is specified: enum Numbers { zero, ten(10) }; However, the amount of generated Java code can be cut down, by modifying these typemaps if none of the enums have initial values (proper Java enums and typesafe enums approach). The default approach is typesafe enums. Anonymous enums are always wrapped by constant integers. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/11/2004: wsfulton [Java, C#] Fix bug using %rename on enum items and when using %javaconst(1) / %csconst(1) For example, the following used to generate code that wouldn't compile: %rename(Obj) Object; enum Grammar { Subject, Object }; 04/28/2004: wsfulton [Java, C#] Minor fixes when using combinations of the javainterfaces, javabase, csinterfaces and csbase typemaps. 05/18/2004: wsfulton [Java] JVM link failure on some systems fixed when using std_vector.i. Also adds default vector constructor for use from Java. 05/17/2004: mkoeppe (Matthias Koeppe) [Guile] New runtime functions SWIG_PointerAddress, SWIG_PointerType, SWIG_IsPointerOfType, SWIG_IsPointer. [Guile] In -scm mode, wrap several SWIG runtime functions and export them into the module (Swig swigrun). The runtime module is now built with "module" linkage. [Guile] GOOPS proxy objects now also print the pointer address of the C object. 05/14/2004: lyle Added Kou's patch for the Ruby %import directive so that modules with "nested" names are handled properly. Consider an interface file foo.i that has this %module declaration at its top: %module "misc::text::foo" Now consider another interface file spam.i that imports foo.i: %import foo.i Before this patch, this would result in the following code being generated for spam_wrap.c: rb_require("misc::text::foo"); With this patch, however, you'll get the correct path name for the call to rb_require(), e.g. rb_require("misc/text/foo"); See SourceForge Bug #928299. 05/12/2004: wsfulton Patch for emitting directors when %feature("director") specified for a class with no virtual methods, but does have a virtual destructor. Submitted by Kevin Smith. 05/06/2004: mkoeppe (Matthias Koeppe) New SWIG runtime function SWIG_TypePrettyName, which returns an unmangled type name for a swig_type_info object. [Guile]: Use it for printing pointer objects. 05/03/2004: dancy (Ahmon Dancy) * Lib/allegrocl/allegrocl.swg: Updated comments about identifer conversion. * Sources/Modules/allegrocl.cxx: Register /dev/null for "header" target. Also, disregard "const" qualifiers during type conversion. 05/02/2004: wuzzeb (John Lenz) [Chicken] Fix bug 782468. To fix this bug, the runtime code has been rewritten, and pointers are now represented as a C_SWIG_POINTER_TYPE. Chicken version > 1.40 is now required! * Typemap incompatibility: typemaps no longer use chicken_words. If a typemap needs some space, it should just call C_alloc * argout typemaps no longer use the /* if ONE */ construct to build an output list. A SWIG_APPEND_VALUE macro, exactly like guile and mzscheme is now used. 04/25/2004: mkoeppe (Matthias Koeppe) [Guile] In the generated GOOPS code, don't create methods that would not specialize any arguments; simply re-export the primitive functions. (This is a performance optimization which reduces load time and execution time.) [Guile] In -gh mode, fix the "too many initializers" error which was caused by an incompatible swig_type_info layout. [Guile] The typemap for FILE * in ports.i now also accepts a regular FILE * pointer object. Also a bug with Scheme file ports that are open for input and output has been fixed. 04/25/2004: wsfulton Change entry 03/21/2004 revoked. The change introduced another inconsistency (reference typemaps beings used instead of pointer typemaps for member variables as well as static member variables and global variables for some languages, but only for C++ and not C). This would break user's current typemaps and introduce further inconsistencies. Alternative solution required and being discussed. 04/10/2004: mmatus (Marcelo Matus) Added the -directors flag. This enables the director mode for the interface and all the classes that don't set the "feature:nodirector" explicitly. You can use this in your module if you want to use the director feature in all your classes, but it is most intended for testing purposes, like: make check-python-test-suite SWIG="../../../swig -directors" make check-ruby-test-suite SWIG="../../../swig -directors" make check-java-test-suite SWIG="../../../../swig -directors" These commands will run the entire test-suite using directors, and not only the specific 'directors_*' cases. This should be done from time to time. 04/10/2004: mmatus (Marcelo Matus) [python] Added support for std::wstring and wchar_t, for compiler and python versions that support them. When needed, use %inlcude std_string.i // 'char' strings %inlcude std_wstring.i // 'wchar_t' strings 04/10/2004: mmatus (Marcelo Matus) [python] Fix the default behaviour (seg. fault) when an inplace operator (+=,-=,...) was wrapped, as reported by Lucriz (lucriz@sitilandia.it), when the most common form was used: A& A::operator+=(int i) { ...; return *this; } ^^^^ ^^^^^^ ie, an object is returned and its contains the same 'this' value than the input object, which is deleted after the operation "a += b", leaving the result with no real object, but a seg. fault. To fix it, we needed to introduce a new feature and use an old one: %feature("self:disown") A::operator+=; %feature("new") A::operator+=; here, "self:disown" disable the ownership of the 'self' or input object, and the "new" feature transfers the ownership to the result object. The feature/solution could also be used in other languages that use gc and implement the inplace operators, or other operators, in a similar way. *** POTENTIAL INCOMPATIBILITY FOR Python MODULE *** If you already are using the inplace operators in python, and you implemented some kind of workaround to the problem fixed here, it is possible you could end with 'free' objects that never get deleted. If that is the case, and you want to disable the current fix, use: %feature("self:disown","") A::operator+=; %feature("new","") A::operator+=; 04/07/2004: cheetah (William Fulton) [C#] C++ enums are no longer wrapped by integers, they are now wrapped by C# enums. For Example, given C++: enum AnEnum { foo, bar }; typedef AnEnum AnEnumeration; void something(AnEnum e, AnEnumeration f); The following is generated: public enum AnEnum { foo, bar } public static void something(AnEnum e, AnEnum f) {...} Note that a global enum like AnEnum above is generated into its own file called AnEnum.cs. Enums defined within a C++ class are defined within the C# proxy class. Some of the typemaps for modifying C# proxy classes also work for enums. For example global enums can use %typemap(csimports) to add in extra using statements. Global enums and class enums can use %typemap(csclassmodifiers) to make the enum private, public etc. %typemap(csbase) to change the underlying enum type (enum base) If we add this for the above example: %typemap(csclassmodifiers) AnEnum "protected" %typemap(csbase) AnEnum "long" the following is generated: protected enum AnEnum : long { foo, bar } *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 04/07/2004: cheetah (William Fulton) Seg fault fix for empty enums, like enum Foo {}; 03/21/2004: mmatus [Note: this change revoked on 04/25/2004] [Python] Makes the following 'var' cases more uniform: std::string ga; struct A { static std::string sa; std::string ma; }; now the three variables (ga, sa, ma) can be assigned as: cvar.ga = "hello"; A.sa = "hello"; a.ma = "hello"; ie, now 'ma' will also use a std::string typemap 'in' if defined, before it was only accepting a 'p_std_string' pointer. Note, however, that 'ma' will not use the 'varin/varout' typemaps (that probably could be more natural), but it will pick up the 'in' typemap for const std::string& (which is easier). The changes in cwrap.c and lang.cxx will probably fix the behaviour in other languages that do not overload the membervarHandler method "too much". 03/21/2004: mmatus [Python] Disabling the default instantiations like: %template() std::pair; for all the primitive types and STL containers/classes. They are expensive, specially for pair and map, and the previous behaviour also requires the user to perform manual instantiations. Still, if the speed difference is not important, it can be re-enabled by defining the macro SWIG_STD_DEFAULT_INSTANTIATION (see std_common.i). Also, normalizing the INPUT/OUTPUT/INOUT typemaps. Now they use the same conversors than the rest of the typemaps, and you can use them for std::pair, std::string and all the other STL types, like in: void p_inoutd(std::pair *INOUT); Added the attribute.i and implicit.i files with macros to transform functions pairs like 'set_x'/'get_x' (or 'T& x()'/'const T& x() const') into an attribute, and allowing the use of implicit constructors in typemaps (see the files for more details). 03/21/2004: mkoeppe [Guile] Fix the documentation strings of functions with anonymous arguments. 03/18/2004: mmatus [Python] More general std_string.i interface. Now you can wrap it using %template(string) std::basic_string; and use the std::string as a base class: struct A : std::string { }; But more important, swig will recognize both std::basic_string and std::string as the same type. 03/16/2004: mmatus Previously added, but not mentioned before: - friend declaration support, swig now emits a global function in the same class scope. - ref/unref features: to mix ref counting C++ classes and native script ref counting mechanisms (like in python). Use it like: %feature("ref") RCObj "$this->ref();" %feature("unref") RCObj "$this->unref();" And the class RCObj, and all the derived ones, will perform the right ref/unref calls when a new pointer is returned to the target language, or when the target language attempts to delete the object. See the refcount.i file in the test-suite for more details. 03/16/2004: mmatus [Python] Using the new %fragment support, major rewrote of the python swig library, including: - Almost automatic template/typemap instantiation for the STL components. For example, now you can write: %template(vector_i) std::vector; and a specialized vector_i class is emitted with all the needed typemaps. No need to use the old 'specialize_vector' macros. Note you can also define %template(matrix_i) std::vector >; %template(vector_pii) std::vector >; - The empty template instantiation %template() std::vector; defines the vector typemaps, but no proxy class. For all the fundamental types, the empty template instantiation are defined, so, you can say %include std_vector int func(const std::vector& a); where the proper typemap is applied to 'a', but no std::vector proxy is generated. - All the STL containers present a more uniform behavior and more complete interface declaration. The following are now supported: std::vector std::list std::deque std::set std::multiset std::map std::multimap not a container, but also supported: std::pair also, more typemaps are defined for all of them, including varin, varout, typecheck, etc. - Initial attempt to implement the STL containers considering allocators, ie: std::vector it is partially working, but it is just a workaround while swig improves its template type support. Please test with your particular setup. It seems to be working with g++ 3.2.2, g++ 2.96, Intel icc and SGI CC compilers, plus python 1.5.2, 2.0 and 2.3, but since we are using templates, there is a chance you can find some problems when using with an old C++ compiler. 03/16/2004: mmatus - Allowing the empty %template directive, such as %template() std::vector; to process the class "typedef"s and "typemap"s. Before only the internal "typedef"s were processed. This makes possible to emit the default in/out typemaps without the need of wrapping an specialized vector instance. - Adding the preprocessor extension #@ which mangles the following macro argument, like in: #define macro(X) #@X macro(int) -> int macro(std::string) -> std_s_s_string - Fragments can now be "type specialized", as the typemaps. The syntax is as follows %fragment("name","header") { /* a type independent fragment (old syntax) */ } %fragment("name" {Type}, "header") { /* the fragment is type dependent */} Now fragments can also be used inside templates: template struct A { %fragment("incode"{A},"header") { /* 'incode' specialized fragment */ } %typemap(in,fragment="incode"{A}) { /* here we use the 'type specialized' fragment "incode"{A} */ } }; 03/11/2004: cheetah (William Fulton) [Java] Director bug which meant that some virtual functions overridden in Java were not being called on some operating systems. Bug reported and fixed by Robert de Vries and Scott Michel. 03/02/2004: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, don't forget to check the type of string arguments. 02/24/2004: cheetah (William Fulton) [C#] New commandline option -namespace . This allows one to specify a C# namespace into which all C# classes are generated. 02/23/2004: mkoeppe (Matthias Koeppe) [MzScheme] Use FUNC_NAME rather than a bogus typemap variable for signalling errors. Call scheme_wrong_type with a zero-based argument number. Reported by Ondrej Pacovsky, SF #902621. [Guile] Define FUNC_NAME also in the dispatch wrapper for overloaded functions. Patch by John Lenz, SF #896255. 02/22/2004: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, don't try to invoke a null destructor function. 02/20/2004: cheetah (William Fulton) Fixes so that the SWIG source will compile using the Digital Mars Compiler (formerly Symantic compiler) on Windows. Submitted by Scott Michel. 02/13/2004: mkoeppe (Matthias Koeppe) [MzScheme] New command-line argument -noinit. Use it for building the runtime library, where we don't want to define the functions scheme_initialize etc. Reported by Tim Brown, SF #891754. [MzScheme] Don't produce invalid C code when invoked with the -declaremodule option. Reported by Tim Brown, SF #891108. [Guile] Build the runtime library with passive linkage, to rename the SWIG_init function uniquely. 02/12/2004: cheetah (William Fulton) [Java, C#] Patch submitted by Bill Hoffman which prevents SWIG from crashing when a file for the typewrapper class cannot be opened. 02/11/2004: cheetah (William Fulton) [Java, C#] Overloading changes: - Methods which are overloaded in const only no longer generate Java code that won't compile - the first method parsed is used and a warning is displayed. Note that this behaviour is slightly different to the scripting languages which always uses the non-const method. - Warning messages 509 and 512 replaced by new warning number 516, which is more relevant to these statically typed languages as the overloaded methods aren't 'shadowed', they are ignored. 01/23/2004: mkoeppe (Matthias Koeppe) [Guile] Replace the "known_classes" hash table by a node attribute. Methods of classes in C++ namespaces now get the proper specializer in the GOOPS declaration. Reported by rm@mh-freiburg.de. 01/23/2004: mkoeppe (Matthias Koeppe) [Guile] Uniquify the argument names in GOOPS shadow method declarations. Reported by rm@mh-freiburg.de. 01/21/2004: sunshine (Eric Sunshine) Revived the NextStep port of SWIG. Fixed fatal problem in DohStrstr() caused by difference in strstr() implementation which made %apply become entirely dysfunctional. On NextStep, strstr("foo","") evaluates to NULL; whereas, on modern platforms, it evaluates to "foo". %apply relies extensively upon strstr("foo","") evaluating to non-NULL, therefore it failed catastrophically when faced with NextStep's strstr(). Added `bool' check to configure.in since NextStep's C++ compiler does not supply this type. swig.h now fakes up `bool' if needed. Worked around NextStep C++ compiler bug in which C++ code is disallowed inside extern "C" functions. This problem affected all language modules, since they publish hook functions of the form: extern "C" Language *swig_foo(void) { return new FOO(); } Fixed by creating a C++ wrapper: static Language *new_swig_foo() { return new FOO(); } extern "C" Language *swig_foo(void) { return new_swig_foo(); } Ensured that Swig_copy_string() is used in place of strdup() since NextStep does not supply strdup(). Fixed detection of Ruby library name and location in configure.in. Problem 1: Assumed that library always resided in Ruby's "archdir", which was correct for Ruby 1.6.x, but which is incorrect for Ruby 1.8.x, in which case the library normally resides in Ruby's "libdir". Problem 2: Assumed that the library could always be linked via "-l"+RUBY_INSTALL_NAME (where RUBY_INSTALL_NAME typically is "ruby"), however this failed for platforms, such as NextStep, which do not support shared libraries. In this case, the static library name in 1.8.x is libruby-static.a, thus -lruby-static is required. The new logic works correctly for static and shared libraries for 1.6.x and 1.8.x. Fixed detection of Perl CFLAGS in configure.in for NextStep. Detection code extracted CFLAGS from Perl's %Config hash but neglected to add a newline to the value before passing it through `sed'. NextStep's ancient `sed' discards input which is not terminated with a newline, thus Perl CFLAGS always evaluated to the empty string. 01/16/2004: cheetah (William Fulton) Tidy up in the exception handling code that is generated when C++ exception specifications are wrapped with the throws typemap. This redundant code is no longer generated: catch(...) { throw; } 01/12/2004: wsfulton on behalf of mmatus (marcelo matus) if a method uses %exception and the method requires the use of the throws typemap, the code in a throws typemap will be generated inside the try body. For example: %exception method { try { // method action $action } catch (int i) { // method int catch handler } catch (...) { // method generic catch handler } } %typemap(throws) Except %{ // throws typemap Except catch handler %} %inline %{ class Except {}; void method(int i) throw (Except); Will generate: { try { // method action try { method(arg1); } catch(Except &_e) { // throws typemap Except catch handler } } catch (int i) { // method int catch handler } catch (...) { // method generic catch handler } } As can be seen, the inner try catch block is for the throws typemaps. Previously, this was reversed so that the inner try catch block was the %exception code. In the example above, it would have been impossible to catch Except as the catch all (...) would catch the exception instead. Version 1.3.21 (January 11, 2004) ================================= 01/10/2004: cheetah (William Fulton) The output format for both warnings and errors can be selected for integration with your favourite IDE/editor. Editors and IDEs can usually parse error messages and if in the appropriate format will easily take you directly to the source of the error. The standard format is used by default except on Windows where the Microsoft format is used by default. These can be overridden using command line options, for example: $ swig -python -Fstandard example.i example.i:4: Syntax error in input. $ swig -python -Fmicrosoft example.i example.i(4): Syntax error in input. 01/09/2004: beazley Fixed [ 871909 ] simple namespace problem. This was a problem using anonymous structures in a namespace. For example: namespace ns { typedef struct { int n; } S; }; Reported by Josh Cherry. 01/09/2004: beazley Fixed some broken Perl examples. 12/28/2003: cheetah (William Fulton) [Java and C#] Fixes for wrapping covariant (polymorphic) return types. For example: struct Base { virtual ~Base(); virtual Base* copy() const = 0; }; struct Derived : Base { virtual Derived* copy() const; }; The Derived::copy proxy method returns Base not Derived. A warning is issued about this. Previously the pointer used by the proxy class was incorrectly treated as a Base* instead of a Derived*. 12/18/2003: cheetah (William Fulton) Fix so that Windows paths are displayed correctly when reporting errors. An error previously would have been shown something like: .?xample.i:14: Syntax error in input. instead of: .\example.i:14: Syntax error in input. Version 1.3.20 (December 17, 2003) ================================== 12/17/2003: beazley Last minute modifications. Perl5 module now generates shadow classes by default like all of the other modules. PHP4 wrappers no longer include "config.h". 12/14/2003: beazley Weakened warning message related to constructor names so that an unusual nested-class wrapping technique would work again (apparently it worked in some older SWIG releases). For example: class Scope { class ClassA; class ClassB; }; class Scope::ClassA { ... }; class Scope::ClassB { ... } Note: There is still some odd interaction with the SWIG symbol table/type system that will need to be looked at in a future release. Reported by Gustavo Niemeyer. 12/11/2003: cheetah (William Fulton) [Java] Protected class methods are wrapped as protected Java methods when using the dirprot director feature. This can be changed using %javamethodmodifiers to something else should the need arise, for example, private or package access. 12/11/2003: cheetah (William Fulton) [Java, C#] %javamethodmodifiers (Java) and %csmethodmodifiers (C#) operate slightly differently. Previously this feature had to be present to set the method modifiers. Now it is only used if it exists for the method being wrapped. The default is "public" as previous however, when wrapping protected director methods it is "protected". This change will not affect existing use of the %javamethodmodifiers or %csmethodmodifiers. 12/11/2003: mmatus (Marcelo Matus) This fix some recurring reports about keywords not been properly identified and warned, and it solves the problem of how to add a test file to the test-suite such that it doesn't use any keyword of all the supported languages (and doing it without compiling the test for all the supported languages, thing that is not always possible, and without requiring you to know all the supported language keywords, thing that is always impossible). So these are the changes globally speaking: - Uniform the definition of the keyword warnings through the supported languages: all the languages has now a separate file that defines the keywords or bad names: python/pythonkw.swg chicken/chickenkw.swg .... - Added keyword list for most of the languages that didn't have one (using the new separated file). - Added the "All keywords" warning support: -Wallkw option. This option allows you to include all the known keywords for all the supported languages, and can be used as: swig -Wallkw .... This will help to the process of adding a test-suite file that can be compiled in all the swig supported languages, and it will be also helpful for users who want to create multi-language libraries. And these are the detailed changes (mostly file addition): - For the languages that already have some sort of keyword warning list, move it to an external languagekw.swg file, ie: move keywords from python.swg -> pythonkw.swg move keywords from chicken.swg -> chickenkw.swg move keywords from tcl8.swg -> tclkw.swg and re-include languagekw.swg from language.swg. - For the language that didn't have a keyword list, and for the ones that I could find a list, add the languagekw.swg file, ie: csharp/csharpkw.swg java/javakw.swg php4/phpkw.swg pike/pikekw.swg ruby/rubykw.swg also add a line in language.swg to include languagekw.swg, but now it is commented!!!, like in java.swg: /* java keywords */ /* please test and activate */ //%include "javakw.swg" ie, there will be no change in how swig runs normally until the language maintainer test and uncomment that line. So, please check each languagekw.swg file (I left the link to the keyword list source for checking), and after testing, uncomment the %include line. - Added the file allkw.swg, which includes all the languagekw.swg files. For the languages that has no languagekw.swg file right now, and if they need one, add the file into the language directory, and add the corresponding include line into the allkw.swg file. - Added the -Wallkw that includes the allkw.swg file. Note that the old -lallkw.swg option couldn't be used since it include the file after it would be needed. Hopefully, the -Wallkw option will be added to the default rules in the related test-suite Makefiles, so, when creating a new test, or adding a new swig library file (like _std_deque.i), swig will warn you if you are using a bad name, considering all the language where it needs to run. Right now you can test it by using: make check-python-test-suite SWIG="swig -Wallkw" or using your favorite target language, it doesn't matter. And yes, there are several examples that are using reserved keywords, specially from csharp. *** Remember ****: the new keyword warning lists are not included by default in any of language that before didn't have one. To enable the keyword warnings as the default behavior, the inclusion of the languagekw.swg file has to be uncommented at each language.swg file. So, all the language maintainers, please check the keywords list. Also, you can add buit-in names, and not only keywords, like 'True/False' in python. Remember that you can be more specific and refer only to member names, like *::configure or *::cget (see an example in the tcl8/tcl8kw.swg file), or only global names, like ::range (see an example in the python/pythonkw.swg file. Just to be consistent, use the following codes: - Use code 314 for keyword and/or fatal bad names. - Use code 321 for buit-in and/or not fatal bad names. so, they can't be disabled/enabled independently (see python/pyhtonkw.swg for examples). **** And don't add any new test file without checking it with the -Wallkw option!! (that includes me) *****. 12/11/2003: cheetah (William Fulton) SF bug #854634 Added support for accepting the Unix directory separator '/' on Windows and the Mac in addition to the native one ( '\' on Windows). This can be used in %import, %include and commandline options taking a path, for example -I. On Cygwin, both the Windows and Unix directory separator can now be used (was '/' only). 12/10/2003: mmatus (Marcelo Matus) [python] Implementing the runtime "reprotected" director members, if you have: %feature("director") B; class Bar { public: virtual ~Bar(); virtual int hello() { return do_hello();) protected: virtual int do_hi() {return 0;} virtual int do_hello() {return 0;} }; then, at the python side import my_module class Foo(my_module.Bar): def do_hello(self): return 1 pass b = Bar() # Pure C++ Director class f = Foo() # C++ Director + python methods b.hello() # Ok, and it calls C++ Bar::do_hello() f.hello() # Ok, and it calls Python Foo::do_hello() b.do_hi() # RuntimeError, do_hi() is protected!! f.do_hi() # RuntimeError, do_hi() is protected!! b.do_hello() # RuntimeError, do_hello() is protected!! f.do_hello() # Ok, since it its redefined in python. Here Bar.do_hello is always protected, but Foo.do_hello is "public", because it is redefined in python. Before, all the 'do_hello' methods were public. This seems to be a good compromise between C++ and python philosophies, ie, all the director protected methods keep protected at the user side (C++ way) until they are redefined (python way, were all defined methods are always public). And this is not only a good compromise, it also seems to be the only way to do it :). Now ruby has native director protected members, and python pure runtime support. I guess these are the two possible extreme cases. And hopefully, they could be used as templates to modify the other languages that support directors, so they can "reprotect" the protected director members at the target language side. This finished the director protected support for the python language. Ocalm will need to add the "reprotection" later. 12/10/2003: mmatus (Marcelo Matus) The following case (reported by Lyle Johnson) was fixed: %rename(x) Foo::y(); class Foo { public: void y(); protected: int x; }; swig warned that the symbol 'x' was already defined, and the renaming fails. 'x' was not emitted, since it is protected, but it was kept in the symbol table with too much information. Now swig works for all the cases (plain, director and dirprot) again. This was fixed by allowing the parser.y to decide much closer what to do with 'x'. Before all the discarding or generation was resolved at the lang.cxx stage. Also the changes in parser.y to implement the director protected mode are now much more encapsulated, and they get disabled if the mode is not enabled. Before the deactivation was done at the generation stage (lang.cxx). By the other hand, if the director mode is enabled, and %rename is done, reusing a protected member name, there is a pathological case: %rename(x) Foo::y(); class Foo : public A { public: void y(); protected: int x; /* works */ static int x; /* works */ static void x(); /* works */ typedef void x(); /* works */ virtual void x(); /* always fails, as it should, since Foo::x() will be emitted in the director */ void x(); /* always fails, but sometimes it shouldn't, since the Foo::x() will not be emitted if it is not virtual */ }; The last case is not always right because at the parser.py stage it is not possible to decide if the protected member Foo::x() could or not conflict with the renamed Foo::y(), since Foo::x() could be virtual by inheritance. I guess this just an intrinsic limitation, and no much can be done about it without resorting into larger changes to postpone, under certain conditions, the multiply symbol detection (lang.cxx stage). So, by now, it is just considered a well known "feature" in the director protected mode. The good news is that it seems to be a rare case, and it can be avoided by the user by hiding 'x' before renaming 'y': %rename(_x) Foo::x(); %rename(x) Foo::y(); 12/08/2003: mmatus (Marcelo Matus) The virtual method detections now properly treats the following cases: namespace foo { typedef int Int; } struct A {}; typedef A B; struct Foo { virtual ~Foo() {} virtual Foo* cloner() = 0; virtual int get_value() = 0; virtual A* get_class() = 0; virtual void just_do_it() = 0; }; struct Bar : Foo { Bar* cloner(); foo::Int get_value(); B* get_class(); void just_do_it(); }; All the Foo and Bar methods are virtual. A new attribute "virtual:type" record the base polymorphic type. In the previous cases we have: type : Bar virtual:type : Foo type : foo::Int virtual:type : int type : B virtual:type : A type : void virtual:type : void This attribute is useful in languages (java+directors) that could have problems redefining Bar* Bar::cloner(). If you never had code like the above, you will see no effects. But if you have some code like that, you will see some effects since some methods that before were not properly treated as virtual, will start to act like that. This could enlarge your director classes. 12/08/2003: mmatus (Marcelo Matus) The director protected member support (dirprot) is disabled by default. It can be enable by using '-dirprot' or by adding the option to the module declaration, like: %module(directors="1",dirprot="1") my_module This module option was added to properly compile the director_protected.i and director_nested.i examples. The feature has been tested with python[2.2,2.3] and ruby[1.6.7], both at compilation and runtime, and java[j2sdk1.4.1_01], but only at compilation (my java installation doesn't run any of the director examples, olds nor news). Please test for ocaml and java. The errors reported by William and Scott were fixed, except for a warning about SWIG_JavaThrowExecption() multiply defined. I can't reproduce this error with my examples. We will wait for Scott to send us a minimal case. 12/07/2003: mmatus (Marcelo Matus) The director protected member support has been completly moved out from python.cxx, and now resides in the common lang.cxx, emit.cxx and allocate.cxx files. This means it should work for all the other languages that currently support directors, ie, python, java, ocalm and ruby. The change has been tested with python (compilation+runtime) and java (just compilation). Please add runtime tests for the missing languages and test it. The '-nodirprot' option was moved to the principal main, and can be used from all the languages. 12/07/2003: cheetah (William Fulton) [Java] Fixed and improved error checking of STRING_OUT typemaps in various.i. 12/04/2003: mmatus (Marcelo Matus) - Now the virtual members with no explicit declarator are properly identified: struct A { virtual int f() = 0; }; struct B : A { int f(); }; Here, B::f() is virtual, and the director and the virtual elimination mechanism now recognize that. - [C#] This fix also fixes the problem where 'override' was not being used on any overridden virtual method, so for struct B above, this C# code is generated: public class B : A { ... public override int f() { ... } ... } - Initial support for protected virtual methods. They are now properly emitted when using with director (python only by now). %feature("director") A; struct A { protected: virtual int f1() = 0; }; %feature("director") B; struct B : A{ protected: int f1(); virtual f2(); }; This can be dissabled by using the '-nodirprot' option. - The feature 'nodirector' is working now at the top level, so, it must work for all the languages: %feature("director") A; %feature("nodirector") A::f2; struct A { virtual int f1(); virtual int f2(); }; in this case, only 'f1' is exported to the director class. - Added director support for const TYPE& arguments (python). 12/02/2003: cheetah (William Fulton) [Java] Fix for INOUT and OUTPUT typemaps in typemaps.i for when the JNI type is bigger than the C type. For example, unsigned long (32bits on most systems) is mapped to jlong (64bits). Returned value was incorrect. Bug reported by Brian Hawley. 12/02/2003: cheetah (William Fulton) [C# and Java] Better fix for entry dated 05/11/2003. Fixes the following typemaps: Java: javabase, javainterfaces, javaimports, javaclassmodifiers, javaptrconstructormodifiers, javafinalize, javagetcptr & javacode. C#: csbase, csinterfaces, csimports, csclassmodifiers, csptrconstructormodifiers, csfinalize, csgetcptr & cscode. It also fixes bug in using arrays of C structs with arrays_java.i as reported Scott Michel. 12/02/2003: beazley [Perl] Fixed [ 852119 ] recursive inheritance in output .pm, perl5. Reported by William Dowling. 12/02/2003: beazley [Tcl] Fixed [ 755382 ] calling func(const vector& p) evaluates p[0] in interp. The Tcl type checker was improperly handling the interpreter result when type violations were supposed to be ignored. Reported by Flaviu Popp-Nowak. 11/30/2003: cheetah (William Fulton) Fixed [ 545058 ] configure's --with-tclincl has no effect 11/30/2003: cheetah (William Fulton) [Java] Fixed [ 766409 ] missing symbol SWIG_JavaThrowException during module load SWIG's internal functions are all static as there is no need for different SWIG generated modules to share any code at runtime. 11/30/2003: beazley [Tcl] Added support for C++ pointers to members. 11/28/2003: cheetah (William Fulton) Fixed [ 848335 ] Directors: #include wrapper .h file - was incorrectly adding a directory to the generated #include "foo_wrap.h" statement in some situations. 11/28/2003: cheetah (William Fulton) [Java] Fixed [ 849064 ] JAVA : Access modifier for derived class wrong. The delete() method is always public now. It used to be protected whenever a destructor was non public. An UnsupportedOperationException runtime exception is thrown instead of making delete() protected now. 11/28/2003: beazley [Perl5] Added support for C++ pointers to members. 11/28/2003: beazley Fixed [ 850151 ] PYVERSION with python2.3 in configure of SWIG 1.3.19 (Maybe). 11/28/2003: beazley Fixed [ 850666 ] #include extra line added. This should fix some problems with getting correct line numbers on error messages. 11/26/2003: beazley Fixed another one of Marcelo's evil template bugs (infinite recursion). [ 849504 ] template and typedef -> inf. recursion. 11/26/2003: beazley Fixed parsing problem with declarations like this: int *x = &somearray[0]; 11/25/2003: beazley Fixed [ 756552 ] missing default argument class scope with "|". This is really only a band-aid fix for use of class-enums in expressions. For example: class A { public: enum Flag { flag1 = 0x1, flag2 = 0x2 }; void foo(int x = flag1 | flag2); }; Note: there are still some (more subtle) cases that are broken, but hard to fix due to an issue with template expansion. Will address later. Reported by Dmitry Mironov. 11/25/2003: beazley Incorporated [ 840878 ] support for %inline { ... } (PATCH). This adds support for the following: %inline { ... some code ... } The difference between this and %inline %{ ... %} is that the enclosed text is processed by the SWIG preprocessor. This allows special macros and other processing to be used in conjunction with %inline. Contributed by Salvador Fandino Garcia. 11/25/2003: beazley Fixed [ 836903 ] C++ inconsistency (with void arguments). SWIG was having difficulty with f() vs f(void) in C++ programs. For instance: class A { public: virtual void f(void) = 0; }; class B { public: virtual void f(); // Not matched to f(void) correctly }; The parser now normalizes all declarations of the form f(void) in C++ classes to f(). This should fix a variety of subtle problems with inheritance, optimizations, overloading, etc. Problem reported by Partho Bhowmick. 11/25/2003: beazley [Perl5] Incorporated [ 841074 ] better croaking (PATCH). This fixes some problems with strings and provides some new error functions. Contributed by Salvador Fandino Garcia. 11/25/2003: beazley Fixed [ 791835 ] Default argument with cast: txt = (char *)"txt" syntax Error. The parser should now accept things like this: void foo(char *s = (char *) "Hello"); Problem reported by Claudius Schnorr. 11/24/2003: beazley [Tcl] Fixed problem with cross module linking. Previously modules referred to base classes through a global variable. Now, the module looks up base classes through the type system itself---avoiding the need to link to a global like before. Caveat: modules with base classes must be loaded before modules with derived classes. 11/24/2003: mkoeppe (Matthias Koeppe) [Guile] In -scm mode, use () to represent null pointers, as it is done in -gh mode. 11/23/2003: mkoeppe (Matthias Koeppe) Add a generated script "preinst-swig", which can be used to invoke SWIG before it has been installed. It arranges that the runtime libraries from the source directory are used. 11/23/2003: mkoeppe (Matthias Koeppe) [Guile] In -gh mode, don't forget to call SWIG_Guile_Init. Add a SWIG_contract_assert macro. 11/23/2003: mkoeppe (Matthias Koeppe) [MzScheme] Update the configure check for the dynext object to work with MzScheme 205. 11/20/2003: mmatus Fixed the include/import error reported by Kerim Borchaev, where two files with names like 'dir1/hello.i' 'dir2/hello.i' can not be include at the same time. Swig was including just the first one, assuming the second one was not a different one, since it was checking/keeping just the basename 'hello.i'. 11/19/2003: beazley Changes to the SWIG runtime library support. - The -c command line option has been renamed to -noruntime - New command line option: -runtime. When supplied, this inserts the symbol SWIG_GLOBAL into the wrapper code. This, in turn, makes all of the runtime support functions globally visible. - New library file: swigrun.i. Used to create modules for runtime library (if needed). 11/18/2003: cheetah (William Fulton) 'make srcrpm' rpmbuild fix - patch from Joe Cooper 11/18/2003: mkoeppe (Matthias Koeppe) [Guile] Change meaning of configure option --with-guile to the name of the Guile executable. The new option --with-guile-prefix can be used to specify the tree where Guile is installed. (However, usually it suffices to use the single option --with-guile-config.) When running the run tests test-suite, make sure to use the version of Guile that SWIG was configured for. 11/17/2003: mkoeppe (Matthias Koeppe) [Guile] Improvements to object-ownership management in "-scm" mode. (They do not apply to the default "-gh" mode.) * Renamed the smob type that indicates that the object can be garbage collected from "collected swig" to "collectable swig", which is more precise. * Export the destructor functions again. It is now allowed to explicitly call destructors, even for garbage-collected pointer objects. A pointer object that has been passed to a destructor is marked in a special way using a new smob type, "destroyed swig". (This helps avoid nasty memory bugs, where references to dead C objects are still held in Scheme. Moreover, the garbage collector will not try to free a destroyed object once more.) * Destructor-like functions can also mark their arguments as destroyed by applying the typemap SWIGTYPE *DESTROYED. (It calls the function SWIG_Guile_MarkPointerDestroyed.) * Functions that "consume" their objects (or that "own" them after the call) can mark their arguments as not garbage collectable. This can be done by applying the typemap SWIGTYPE *CONSUMED. (It calls the function SWIG_Guile_MarkPointerNoncollectable.) * The macro TYPEMAP_POINTER_INPUT_OUTPUT from library pointer-in-out.i creates additional typemaps PTRTYPE *INPUT_CONSUMED, PTRTYPE *INPUT_DESTROYED. They mark the passed pointer object likewise. The typemap PTRTYPE *OUTPUT creates a garbage-collectable pointer object, like %newobject does for a returned pointer. Use the new typemap PTRTYPE *OUTPUT_NONCOLLECTABLE to create a pointer object that will not be garbage collected. 11/17/2003: mkoeppe (Matthias Koeppe) [Guile] Handle $input in "freearg" typemaps. Never qualify GOOPS slot names with the class name. Handle optional arguments properly in the GOOPS methods. 11/16/2003: cheetah (William Fulton) Fixes for installation to work with the upcoming Automake-1.8. mkinstalldirs was being used by a non-Automake makefile. mkinstalldirs is being phased out and so was not being created by Automake. install-sh used instead. 11/16/2003: cheetah (William Fulton) [Java] Numerous director improvements, tweaks and bug fixes since the initial implementation have been contributed by Scott Michel. 11/12/2003: beazley [Python] When %feature("shadow") is used to add code to shadow classes, the special variable $action expands to the name of the underlying wrapper function that would have been called normally. 11/12/2003: beazley [Python] When generating proxy class code, SWIG emits a few default methods for __repr__() and other Python special methods. Some of these methods are emitted after all of the contents of a class. However, this makes it hard to override the methods using %pythoncode and some other directives that allow code to be inserted into a class. These special methods are now emitted into the code *before* all of the other methods. Suggested by Eric Jones. 11/11/2003: beazley Preprocessor enhancement. For include statements like this: %include "foo/bar.i" the directory "foo" is now added to the search path while processing the contents of bar.i. Thus, if bar.i includes other files in the same directory, they will be found. Previously, you would have to add additional directories using -I to make this work correctly. Note: the C preprocessor seems to behave in an identical manner on many (most? all?) systems. Suggested by Kerim Borchaev. 11/11/2003: beazley Configuration changes to make SWIG work on Mac OS X 10.3.x (Panther). Tested with Python, Tcl, Perl, and Ruby---all of which seem to work. 11/08/2003: cheetah (William Fulton) [Java] Fixed the typemaps in various.i which were mostly broken. char **STRING_IN and char **STRING_RET typemaps replaced with STRING_ARRAY. float *FLOAT_ARRAY_RETURN typemap removed. 11/08/2003: beazley [Tcl] Tcl module now emits a safe module initialization function by default. It can be removed by running 'swig -nosafe'. 11/04/2003: mkoeppe (Matthias Koeppe) [Guile] Only use the SCM_ API when the function `scm_slot_exists_p' exists (needed for GOOPS support). This function was renamed during the Guile 1.5 series from `scm_slots_exists_p'. Report the right runtime library when invoked with -scm -ldflags. 11/03/2003: mkoeppe (Matthias Koeppe) [Chicken] Fix #782052. The --with-chickencfg configure option (and others) were not accepted. 11/02/2003: mkoeppe (Matthias Koeppe) [Guile] Merge new set of GOOPS changes by John Lenz. GOOPS objects are now manipulated directly by the C code. Some fixes to typemap-GOOPS interaction. 11/02/2003: mkoeppe (Matthias Koeppe) [Guile] Remove the file argument to -scmstub and -goops. The Scheme files are now always called MODULE.scm or MODULE-primitive.scm, where MODULE is the module name and "primitive" can be changed by the -primsuffix option. The Scheme files are now placed in the directory given by the -outdir option, or the current directory. (Patch by John Lenz, slightly modified.) *** INCOMPATIBILITY [Guile] *** 11/02/2003: mkoeppe (Matthias Koeppe) Unify the pointer-conversion runtime API. The standard functions are: * SWIG_NewPointerObj (POINTER, TYPE, FLAGS) -- Create an scripting object that represents a typed pointer. FLAGS are language specific. * SWIG_ConvertPtr (INPUT, RESULT, TYPE, FLAGS) -- Get a pointer from the scripting object INPUT and store it in the place RESULT. When a type mismatch occurs, return nonzero. * SWIG_MustGetPtr (INPUT, TYPE, ARGNUM, FLAGS) -- Get a pointer from the scripting object INPUT and return it. When a type mismatch occurs, throw an exception. If ARGNUM > 0, report it as the argument number that has the type mismatch. [Guile]: No changes. [MzScheme]: No changes. [Perl]: Add the function SWIG_NewPointerObj. The function SWIG_MakePtr is kept. The function SWIG_MustGetPtr is currently not supported. [Python]: Add the function SWIG_MustGetPtr. [Ruby]: Add the function SWIG_MustGetPtr. [Tcl]: Remove the "interp" argument of SWIG_NewInstanceObj, SWIG_ConvertPtr, SWIG_ConvertPacked, and SWIG_ConvertPtrFromString. The function SWIG_MustGetPtr is currently not supported. No changes to Pike because its pointer conversion code did not look complete. No changes to PHP4, because I did not understand its runtime code. No changes to Chicken because major changes are expected soon anyway. No changes to Java, OCaml, C# because they do not seem to have a pointer-conversion runtime API. *** INCOMPATIBILITY [Tcl] *** 11/02/2003: mkoeppe (Matthias Koeppe) [Perl5, PHP4, Pike, Python, Ruby, Tcl]: Use the preprocessor to rename external functions of the SWIG runtime API to follow the naming convention SWIG__. This should allow linking more than one interpreter into a program. 10/31/2003: cheetah (William Fulton) [C#] Fix since introducing the exception and std::string delegates. The fix overcomes linker errors when using more than one SWIG module. Problem reported by Andreas Schörk. 10/31/2003: beazley Incorporated patch: [ 823302 ] Incr Tcl support. Contributed by Alexey Dyachenko. Note: needs documentation. 10/31/2003: beazley Incorporated patch: [ 829325 ] new Python Module options and features. Robin Dunn writes: This patch makes a number of changes to the SWIG python module. 1. Add -apply option, and change the default code output to use the foo(*args, **kw) calling syntax instead of using apply(). If the -apply option is given then code is generated as before. This is very similar to Patch #737281 but the new -modern option makes the second half of that patch unnecessary so it is not included here. 2. Add -new_repr option. This is the same as my Patch #797002 which I will mark as closed since it is no longer needed. When this new option is used then the __repr__ methods that are generated for proxy classes will be more informative and give details about the python class and the C++ class. 3. Add %feature("addtofunc"). It allows you to insert one or more lines of code inside the shadow method or function that is already generated, instead of replacing the whole thing like %feature("shadow") does. For __init__ it goes at the end, for __del__ it goes at the begining and for all others the code generated is expanded out to be like def Bar(*args, **kwargs): val = _module.Foo_Bar(*args, **kwargs) return val and the "addtofunc" code is inserted just before the return statement. If the feature is not used for a particular method or function then the shorter code is generated just like before. 4. A little bit of refactoring to make implementing addtofunc a little easier. 5. Added a -modern command-line flag that will cause SWIG to omit the cruft in the proxy modules that allows it to work with versions of Python prior to 2.2. The result is a simpler, cleaner and faster python proxy module, but one that requires Python 2.2 or greater. 10/31/2003: beazley Incorporated patch: [ 829319 ] XML module tweaks. This adds a new command line option -xmllite that greatly reduces the amount of emitted XML code by eliminating some fields mostly used in SWIG's internal processing. Contributed by Robin Dunn. 10/31/2003: beazley Incorporated patch: [ 829317 ] Adds DohSplitLines function. Contributed by Robin Dunn. 10/29/2003: beazley Fixed [ 827907 ] argout objects not being wrapped properly (PATH). Patch contributed by Salvador Fandiño García. 10/29/2003: beazley Fixed [ 826996 ] perl type checking ignores perl subclasses. This enhancement makes it so wrapped classes and structs can be subclassed in Perl and used normally. Patch contributed by Salvador Fandiño García. 10/16/2003: cheetah (William Fulton) [C#] IntPtr marshalled with a void* instead of int in C function declarations. The casts thus look more conventional, for example: // old DllExport double SWIGSTDCALL CSharp_get_Shape_x(int jarg1) { ... Shape *arg1 = (Shape *) 0 ; arg1 = *(Shape **)&jarg1; ... } // new DllExport double SWIGSTDCALL CSharp_get_Shape_x(void * jarg1) { ... Shape *arg1 = (Shape *) 0 ; arg1 = (Shape *)jarg1; ... } 10/14/2003: beazley Fixed a subtle problem with overloaded methods and smart pointers. If a class has overloaded methods like this: class Foo { public: int bar(int x); static int bar(int x, int y); }; and the class is used as a smart pointer: class FooPtr { public: Foo *operator->(); }; The SWIG would try to expose the static member Foo::bar through FooPtr---resulting bogus wrapper code and a compiler error. Due to the way in which overloading is handled, it is extremely difficult to eliminate the static method in this case. Therefore, it is still exposed. However, the generated code now compiles and works. 10/05/2003: mkoeppe (Matthias Koeppe) [Guile, MzScheme, Chicken]: Remove symbol clashes between the runtime libraries by renaming all extern common.swg functions with the preprocessor. 10/05/2003: mkoeppe (Matthias Koeppe) [Guile] Added basic GOOPS support, contributed by John Lenz. See the documentation for details. *** NEW FEATURE *** 10/04/2003: mkoeppe (Matthias Koeppe) [Guile] New option, -only-setters, which disables traditional getter and setter procedures for structure slots. 10/03/2003: mkoeppe (Matthias Koeppe) [Guile] Added run test for reference_global_vars by John Lenz. 09/30/2003: beazley Partial solution to [ 792180 ] C++ smart-pointer/namespace mixup revisited. The problem is not easy to fix (at least it doesn't seem so), but is related to the instantiation of qualified templates inside of other namespaces. SWIG now generates an error message in this case rather than generating broken wrappers. 09/30/2003: beazley Fixed [ 800012 ] ENTER macro from CORE/scope.h clashes with libc search.h. Reported by Britton Leo Kerin. 09/30/2003: beazley Fixed [ 811518 ] Casting ints to doubles (w/ solution?) Addresses a problem with overloading in the Perl module. Reported by Gerald Dalley. 09/28/2003: mkoeppe [Guile with -scm option] Fix typo in generated code for procedures-with-setters. Reported by John Lenz. 09/26/2003: beazley Fixed [ 812528 ] externs not correct when throw is in signature. Reported by Joseph Winston. 09/23/2003: cheetah (William Fulton) SWIG was generating a number of symbols that didn't comply with the ISO C/C++ standard, in particular ISO/IEC 14882:1998(E) 17.4.3.1.2 where double underscores are forbidden as well as symbols starting with an underscore followed by an upper case letter. Most of these have been rooted out. See new section added to internals.html development manual 'Symbol Naming Guidelines for Generated C/C++ Code'. 09/23/2003: cheetah (William Fulton) Director typemap name changes: inv => directorin outv => directorout argoutv => directorargout *** POTENTIAL INCOMPATIBILITY *** 09/19/2003: mrose (Mark Rose) [Python] Director constructors now default to __disown = 0, which is the intended behavior and fixes the director_finalizer test case under python. 09/12/2003: cheetah (William Fulton) [C#] - Typemaps added for std::string and const std::string &. - New delegate for creating a C# string given a char *. It can be used by calling SWIG_csharp_string_callback as shown in the std::string 'out' typemap. Useful if the return type is mapped to a C# string and the calling function is responsible for cleaning up memory as the C# garbage collector doesn't free the memory created in C/C++ and then returned as a C# string. - The exception delegates have moved into an inner class in the intermediate class, thereby freeing up the static constructor. 09/11/2003: beazley (Internals) Major refactoring of iteration over lists and hashes. The DOH library now uses iterators. They work like this: List *l = (some list); Iterator i; for (i = First(l); i.item; i = Next(i)) { // i.item contains the actual list item. // i.item is NULL at end of list ... } Hash *h = (some hash); Iterator j; for (j = First(h); j.item; j = Next(j)) { // j.item contains hash table item // j.key contains hash table key // Both j.item and j.key are NULL at end ... } The old iteration functions Firstitem(), Nextitem(), Firstkey(), and Nextkey() are gone. The new iterators are simpler, result in better memory use, and may be faster. Also, there are no longer any problems iterating over the same list/hash in multiple places at the same time. For example, this is fine: Iterator i,j; for (i = First(l); i.item; i = Next(i)) { for (j = First(l); j.item; j = Next(j)) { ... } } (This never worked in previous versions). *** POTENTIAL INCOMPATIBILITY ***. This will probably break third party extensions to SWIG (or give them further encouragement to join the SWIG CVS-tree :-). 09/10/2003: mkoeppe (Matthias Koeppe) [Guile] Fix memory leaks in the "list-vector.i" typemaps. 09/09/2003: mkoeppe (Matthias Koeppe) [Chicken] Use C_mk_bool rather than C_mkbool. This fixes the wrapping of boolean values for Chicken 1.10 and newer. Reported by Dave / Felix Winkelmann . 09/05/2003: cheetah (William Fulton) [Java] Directors implemented for Java. In summary this is a big new feature which supports upcalls from C++ to Java. Code is generated to support C++ callbacks to call into Java and true polymorphic behaviour for Java classes derived from C++ classes. See java.html for details. Contributed by Scott Michel. 09/05/2003: Tiger Created contract example directory at /SWIG/Examples/contract Added simple contract examples (simple_c & simple_cxx) Modified contract module's output format *** NEW FEATURE *** 09/01/2003: cheetah (William Fulton) Test-suite build improvements: - Multiple build directories working for the test suite, so it is now possible to run configure in multiple subdirectories and run the test suite in each of these sub directories. - 'make distclean' fixed so it doesn't bomb out on the Examples directory when using multiple subdiretory builds. Required the following directories to be moved: Examples/GIFPlot/Perl -> Examples/GIFPlot/Perl5 Examples/GIFPlot/Php -> Examples/GIFPlot/Php4 These new directories used to be symbolic links to the old directory. Also the Examples/test-suite/Perl symbolic link has been removed. - Running the test-suite, other than from the root directory, say in Examples/test-suite/python will now display all the code being executed. - The following 3 C# compilers are detected during configure and work with the test-suite: Mono, Portable.NET and Microsoft. 09/01/2003: Tiger Added inheritance support for design by contract feature. 09/01/2003: beazley Fixed [ 794914 ] Wrong types in template specialization. SWIG was not handling arguments correctly in template partial specialization. For example, template class Foo { public: T *blah(); }; %template(FooInt) Foo; in this class, the return type of blah was set to 'int **', but it should really be 'int *'. This has been fixed, but it will affect all prior uses of partial specialization. 09/01/2003: beazley Fixed [ 786394 ] Patch for generated perl code does not compile under RedHat9. Reported by Scott Finneran. 09/01/2003: beazley Fixed [ 791579 ] (unsigned) long long handled incorrectly (Tcl). This was an error in the Tcl typemaps.i file. Reported by Kjell Wooding. 09/01/2003: beazley Fixed [ 797573 ] no way to rename classes coming from C structures. This problem relates to renaming of anonymous structures with a typedef. For example: %rename(Bar) Foo; typedef struct { ... } Foo; Reported by Britton Leo Kerin. 09/01/2003: beazley Fixed [ 797576 ] -help seems to imply that only tcl-specific options exist. Added a comment to alert user to other options. Reported by Britton Leo Kerin. 09/01/2003: beazley Fixed [ 798205 ] Segfault in SWIG_ConvertPtr. Reported by Prabhu Ramachandran. 08/30/2003: mrose (Mark Rose) Modified the director typemaps in python/std_complex.i to use the new-style macro and conversion functions, which eliminated some redundant code. Fixed a few bugs in these typemaps as well, although more testing is needed. 08/29/2003: mrose (Mark Rose) Completed initial support for wrapping abstract classes with directors. Constructor wrappers will be generated for abstract classes that have directors, and instances of the director classes will be created regardless of whether the proxy class has been subclassed in the target language. No checks are made during construction to ensure that all pure virtual methods are implemented in the target language. Instead, calls to unimplemented methods will throw SWIG_DIRECTOR_PURE_VIRTUAL_EXCEPTION exceptions in C++. Integrated Prabhu Ramachandran's typemap patches, which provide director typemap support for enums and std::size_t, and fix a couple bugs in the director std::vector<> typemaps. 08/29/2003: cheetah (William Fulton) [C#] Implemented exception handling for throwing C# exceptions from C/C++ code. A few delegate functions are available for calling which then throw the C# exception. Use the SWIG_CSharpThrowException function from C/C++ typemaps. See the generated wrapper code or csharphead.swg for all available exceptions. Example: SWIG_CSharpThrowException(SWIG_CSharpException, "exception description"); The 'throws' typemaps are also now implemented, so code is automatically generated to convert any C++ exception into a C# System.Exception when the C++ method declares an exception specification such as: int foo() throw(Bar); Also any parameters that are references to a C++ class or a class passed by value and are passed as a C# null will now throw a C# NullReferenceException. 08/29/2003: cheetah (William Fulton) [C#] Fix to match the calling convention of all pinvoke methods so that they match the calling convention used by default in the C# 'static extern' declarations (__stdcall is used on Windows). 08/19/2003: cheetah (William Fulton) [Java] Reworked std::string typemaps. Fixes a number of string in std namespace problems. For example %template vector. The templated class' get method wasn't returning a Java String, but a SWIGTYPE_p_string. Reported by Zach Baum. 08/15/2003: beazley Fixed [ 763522 ] 1.3.19 segfault in SwigType_add_pointer/DohInsertitem. Related to problem with unnamed class handling in Perl module. 08/15/2003: beazley Fixed [ 763563 ] Missing indication of optional arguments. Tcl module. Reported by Krzysztof Kozminski. 08/15/2003: beazley Fixed [ 787432 ] long param handled as int. Tcl module now uses Tcl_GetLongFromObj to convert integer values. 08/11/2003: beazley Fixed [ 775989 ] numeric template parameters. There were some errors in template expansion related to the use of arrays where the array dimension was a template parameter. It should work now. Reported by Bryan Green. 08/10/2003: mrose (Mark Rose) Added a director typemap (outv) for return by value and cleaned up up a few of the commented director typemaps. 08/10/2003: mrose (Mark Rose) Fixed constructor generation for director classes to ignore private constructors. Protected constructors are also ignored for now, pending a solution to the problem of wrapping classes that only define protected constructors. 08/07/2003: cheetah (William Fulton) New commandline option -outdir to specify where the language specific files are to be generated. This is useful for target languages like Python, Java etc which generate proxy files in the appropriate language. This option does not apply to the C/C++ wrapper file. 08/07/2003: cheetah (William Fulton) On Windows the generated files (other than the _wrap.c or _wrap.cxx files) were sometimes incorrectly being generated into the current directory unless the input file used the Unix path separator. The Windows path separator should now be used. Bug reported by Robert Davies. 08/07/2003: beazley Added array variable set typemap to Perl module. 08/07/2003: beazley Fixed [ 775677 ] Array init causes codegen bug.. 08/07/2003: beazley Fixed [ 779062 ] Class"\n"::foo not supported. SWIG should now correctly handle whitespace in between namespace qualifiers. For example "A :: Foo :: Bar". 07/31/2003: cheetah (William Fulton) Fixes for parameters which are classes that are passed by value and have a default value. A copy constructor for SwigValueWrapper is required (SF #780056). Also fixed memory leak in these circumstances. These mods also fix SF #780054. 07/28/2003: beazley Improved run-time error message for pointers in Python module. Contributed by Zooko. 07/10/2003: ballabio (Luigi Ballabio) [Almost all languages] Wrappers for std::pair added. Typemaps for Python, Ruby, Guile and MzScheme. 07/01/2003: mkoeppe (Matthias Koeppe) [Chicken] Handle the case of more than one argout typemap per function. 06/29/2003: cheetah (William Fulton) [Java, C#] SF #670949 request. The destructor wrapper function name is now configurable. A new attribute called methodname in the javadestruct/javadestruct_derived (Java) or csdestruct/csdestruct_derived (C#) typemaps specifies the method name. For example in Java the destructor is wrapped by default with the delete method: %typemap(javadestruct, methodname="delete") SWIGTYPE {...} 06/27/2003: cheetah (William Fulton) [Java, C#] The throws attribute for adding exception classes to the throws clause also now works with the following typemaps: newfree javain, javaout (Java) csin, csout (C#) For example, the 'AnException' will be added to the throws clause in the proxy function: %typemap(javaout, throws="AnException") int { int returnValue=$jnicall; if (returnValue==0) throw new AnException("Value must not be zero"); return returnValue; } 06/25/2003: mrose (Mark Rose) [Python] Director typemap marshalling checks for null pointers when walking the parameter list instead of relying soley on the parameter count. Cures a segfault that occurred for multiple argument inv typemaps. Someone with more Swig experience should probably review this code. 06/24/2003: mkoeppe (Matthias Koeppe) [Chicken] Don't emit calls to "C_check_for_interrupt", which may result in an endless loop. Patch by felix@proxima-mt.de. 06/20/2003: cheetah (William Fulton) [C#] Finalizers now use destructor syntax as the override which was used in the Finalize method is not in the ECMA standards, spotted by the MS compiler. 06/10/2003: cheetah (William Fulton) [C#] A number of changes have been made to remove the Java naming that was used in the C# module. Typemap name changes: jni -> ctype jtype -> imtype jstype -> cstype javain -> csin javaout -> csout javainterfaces -> csinterfaces javabase -> csbase javaclassmodifiers -> csclassmodifiers javacode -> cscode javaimports -> csimports javaptrconstructormodifiers -> csptrconstructormodifiers javagetcptr -> csgetcptr javafinalize -> csfinalize Feature name changes: javaconst -> csconst javamethodmodifiers -> csmethodmodifiers Pragma changes: pragma(java) -> pragma(csharp) jniclassbase -> imclassbase jniclassclassmodifiers -> imclassclassmodifiers jniclasscode -> imclasscode jniclassimports -> imclassimports jniclassinterfaces -> imclassinterfaces Special variable name changes: $javaclassname -> $csclassname $javainput -> $csinput $jnicall -> $imcall This will break SWIG interface files that use these typemaps, features and pragmas. Please update your code or use macros for backwards compatibility. *** POTENTIAL INCOMPATIBILITY FOR C# MODULE *** 06/10/2003: mkoeppe (Matthias Koeppe) [MzScheme] Applied MzScheme module updates contributed by John Lenz . - Updated mzscheme to use SWIG's common runtime type system from common.swg. - The Lib/mzscheme directory has been reorganized to standardize names across the language modules: mzscheme.i was moved to mzscheme.swg, mzscheme.swg and mzschemedec.swg have been removed, mzrun.swg (which contains the runtime code) has been added. - The swig_proxy structure was renamed to swig_mz_proxy. swig_mz_proxy now contains a pointer to a swig_type_info structure. - Added varin and varout typemaps for SWIGTYPE [] and SWIGTYPE &. - Garbage collection by calling scheme_add_finalizer() has been added. *** NEW FEATURE [MzScheme] *** 06/10/2003: cheetah (William Fulton) [Java] New typemaps: javadestruct and javadestruct_derived for the C++ destructor wrapper. The javadestruct version gets used by classes at the top of an inheritance chain and the javadestruct_derived version gets used by other classes. [C#] cildispose and cildisposeoverride typemaps replaced by csdestruct and csdestruct_derived typemaps. The delete() method has been removed and its functionality put into these typemaps designed for the Dispose() method. - New typemaps csinterfaces and csinterfaces_derived replace the javainterfaces typemap. Also fixes the peculiarity of all classes in an inheritance chain individually deriving from the IDisposable interface. - New typemap csfinalize for finalizers. C++ destructors are now called by garbage collector during finalization. Problem reported by Andreas Schörk. 06/10/2003: Tiger Modified contract code for error message output. Contract code can now print out simple error message. Modified contract code to prepare for inheritance 06/03/2003: mkoeppe [Guile] Applied Guile module updates contributed by John Lenz . - SWIG currently uses Guile's gh_ API, which is marked as deprecated in Guile 1.6 and will be removed in Guile 1.9. This change introduces a command-line flag "-scm" which causes SWIG to generate wrappers that use Guile's SCM API instead; this requires Guile >= 1.6. - The Lib/guile directory has been reorganized to standardize names across language modules: guiledec.swg and guile.swg have been moved into guile_gh_run.swg, guile.i has been moved to guile_gh.swg, guile_scm.swg and guile_scm_run.swg which contain the SCM API stuff have been added - ghinterface.i, which contains the defines from the gh_ functions to the scm_functions has been added - The API for dealing with pointer objects is now SWIG_ConvertPtr, SWIG_MustGetPtr, SWIG_NewPointerObj. - Added varin and varout typemaps for SWIGTYPE [] and SWIGTYPE & - Garbage collection has been added. *** NEW FEATURE [Guile] *** 06/01/2003: cheetah (William Fulton) Dimensionless arrays such as int foo[] = {1, 2}; extern int bar[]; produce a warning that the variable is read-only. Depending on the target language, this used to cause compile errors or generate a setter that generated a runtime error. A setter cannot be automatically generated because the array size cannot be determined by SWIG. A varin, globalin or memberin typemap (depending on the target language) must be written by the user. 05/29/2003: beazley Refinement to default typemap matching and arrays. When an array is declared like this: int foo[4]; The default typemap now resolves to SWIGTYPE [ANY] If no match is found for that, it then resolves to SWIGTYPE [] If no array dimension is specified in the original declaration, the SWIGTYPE [] is used right away. Note: This change has been made to resolve problems related to arrays with and without dimensions. For example, sometimes SWIG was generating setter functions for array variables with no dimensions (an error). Likewise, SWIG sometimes made arrays with dimensions read-only (also an error). This fixes the arrays_global test problem. 05/28/2003: beazley Fixed subtle type handling bug with references and pointers. If you had functions like this: typedef Foo Bar; Foo *func1(); void func2(Bar &x); Then func2() wouldn't accept objects returned by func1() because of a type error. It should work now. Reported by Brian Yang. 05/21/2003: cheetah (William Fulton) Fixes to some of the Visual C++ example project files which would not work with spaces in the paths held in the environment variables used to point to the target language's library / include directory. SF bug #740769 05/21/2003: songyanf (Tiger) Added -contracts option. First try of the idea of "Wrap by Contract": build up realiable cross-language module by wrapping with SWIG. Implemented basic assertion (preassertion & postassertion & invariant) for simple C/C++ functions. Current format of contracts are: %contract class_name :: func_name (paras...) { require: boolean exprs; exprs; ensure: boolean expr; exprs; invariant: boolean expr; exprs; } *** NEW FEATURE *** 05/19/2003: cheetah (William Fulton) Build tweaks. There were a few preprocessor definitions which were specified in the Makefile for passing on the commandline when compiling. These are now all defined in swigconfig.h. Autoconf doesn't normally allow installation directories to be defined in this config header file, but an autoconf archive macro enables this. This macro along with future autoconf macros are going to be put in the Tools/config directory. 'swig -version' now reports the target build platform. 05/11/2003: cheetah (William Fulton) [C# and Java] Fix to the following typemaps: javabase, javainterfaces, javaimports, javaclassmodifiers, javaptrconstructormodifiers, javafinalize, javagetcptr & javacode. These are the typemaps for modifying/generating proxy classes. Previously the typemaps would use the proxy class name and not the C++ type, which was inconsistent with all other typemaps. In most circumstances the proxy class name and the C++ class name/type is the same except for classes in namespace, templated classes etc. so this shouldn't affect most cases. *** POTENTIAL INCOMPATIBILITY FOR JAVA and C# MODULES *** 05/09/2003: cheetah (William Fulton) Visual C++ Project files have been added so that the runtime libraries can be built on Windows (for Tcl, Perl, Python and Ruby). 05/01/2003: beazley Fixed problem with return by value, const, and private constructors. For example: class B { private: B(); public: B(const B&); }; class A { ... const B returnB() const; ... }; Problem and patch suggestion reported by Bill Hoffman. 04/29/2003: cheetah (William Fulton) Build changes: - Single autoconf invocation - autoconf in the Tools directory has gone. - Libtool bootstrapped when running autogen.sh. This requires anyone using the cvs version of SWIG to have libtool installed on their machine. Suggest version 1.4.2 or higher, preferably the latest - 1.5. - Automake is now used to build the runtime libraries in conjunction with libtool. - Runtime libraries are now successfully built as DLLs on Cygwin. - Skipping languages is no longer just determined in the top level makefile but in configure.in. This info is used for building the runtime libraries and for running the examples and test-suite. - These changes have fixed multiple build directory builds, that is building from directories other than the top level directory. Installation from multiple build directories also working. An initial configure in the top level directory is no longer needed as described in 04/02/2003 entry. A 'make distclean' will be needed before building in a directory other than the top level directory if the autotools have been run from this top level directory at some point, but autoconf will tell you this. Note that 'make check' only works from the top level directory at the moment. 04/28/2003: beazley Fixed [ 723471 ] Wrapper_print() fails with preprocessor directives. 04/28/2003: beazley Minor refinement of const static member variable handling described in CHANGES 08/11/2002. Previously, SWIG merely checked to see if there was an initializer in the declaration. Now, SWIG additionally checks to make sure the static member is const. 04/25/2003: ljohnson (Lyle Johnson) [Ruby] Added a kind of limited support for multiple inheritance, activated using the -minherit command-line option. I've also updated the "C++ Inheritance" section of the Ruby documentation to discuss how this works, and its limitations. Also also modified the minherit.i test case to run against this. 04/25/2003: ljohnson (Lyle Johnson) [Ruby] Added the -globalmodule command-line option for the Ruby module, for wrapping stuff into the global module (Kernel) instead of a nested module. Updated documentation accordingly. 04/23/2003: mrose (Mark Rose) Fixed symname error in director calls to Python methods that extend C++ operators. Stopped director destructor wrappers from calling __set_up, which was leaving the director flag in an inconsistent state. 04/23/2003: beazley Fixed problem with namespace resolution and nested namespaces. Reported by Alfred Lorber (and Marcelo Matus). 04/16/2003: cheetah (William Fulton) Patch for Java examples and test-suite to run on Mac OS X. 04/15/2003: ljohnson (Lyle Johnson) [Ruby] Incorporated Nobu Nakada's patches for supporting the Ruby 1.8 allocation framework. 04/15/2003: ljohnson (Lyle Johnson) [Ruby] Replaced all uses of the deprecated STR2CSTR() macro with the safer StringValuePtr() macro. For more information, see ruby-talk:67059 and follow-ups to that post. 04/11/2003: beazley Fixed problem with preprocessor macro expansion. For example: #define min(x,y) ((x) < (y)) ? (x) : (y) int f(int min); Reported by Sebastien Recio. 04/10/2003: cheetah (William Fulton) [Java] Added a runtime check to typemaps in arrays_java.i library to check that the Java array passed in is the same size as the C array and throw an exception if not. Also fix to use delete instead of free for arrays created using new. 04/07/2003: cheetah (William Fulton) Remove GCC3 warning when compiling the examples and test-suite: cc1plus: warning: changing search order for system directory "/usr/include" cc1plus: warning: as it has already been specified as a non-system directory See SF patch #715531 submitted by Gerald Williams 04/03/2003: cheetah (William Fulton) [C#] Improved wrapping of enums and constants. These were previously wrapped as C# variables rather than constants. Either these are wrapped as readonly (runtime) constants or compile time constants, depending on the %javaconst directive (The directive is likely to change name soon). For example wrapping: %javaconst(0); #define ABC 22 %javaconst(1) XYZ; #define XYZ 33 is now: public static readonly int ABC = examplePINVOKE.get_ABC(); public const int XYZ = 33; 04/03/2003: cheetah (William Fulton) [Java] Global constants and enums are put in their own interface called xxxConstants, where xxx is the module name. This is an improvement as it is possible to derive (implement) a Java class from the xxxConstants interface to improve the syntax; namely when wrapping: enum {ONE=1, TWO, THREE}; accessing these from a Java class implementing xxxConstants is neater: int number = ONE; than the previous: int number = xxx.ONE; Patch submitted by Dave Dribin. 04/02/2003: cheetah (William Fulton) Build improvements for multiple builds. This allows one to build the SWIG executable and runtime libraries for different platforms/compilers etc by running configure in different directories. This isn't 100% just yet and won't be until libtool is better configured... a 'configure' and 'make distclean' needs to be run in the root directory before it all works. For example: $ ./configure $ make distclean $ mkdir config1; cd config1; ../configure CC=gcc CXX=g++; make; cd .. $ mkdir config2; cd config2; ../configure CC=cc CXX=c++; make; cd .. To be improved. A 'make check' does not work yet either. 04/01/2003: beazley Fixed template partial specialization argument expansion bug. This showed up when trying to use std_vector.i with vectors of pointers. 03/31/2003: cheetah (William Fulton) Fix for parallel make builds of SWIG, for example make -j 4 Build failure reported by Bill Clarke. 03/28/2003: beazley Released 1.3.19. Version 1.3.19 (March 28, 2003) =============================== 03/28/2003: beazley Variety of minor bug fixes to the 1.3.18 release including: - Segmentation fault with %extend directive. - Typemap variable substitution bug. - Expression evaluation bug. - Large memory leak with template expansion. Version 1.3.18 (March 23, 2003) =============================== 03/21/2003: beazley Fixed two problems with the %extend directive, overloading, and template expansion. See the 'template_extend_overload' and 'template_extend_overload_2' tests in Examples/test-suite for details. 03/20/2003: cheetah (William Fulton) [C#] Added some typemaps as suggested by Andreas Schoerk for handling parameters that are passed as pointers or by reference. These have been put in typemaps.i. 03/20/2003: beazley Fixed a C++ scoping bug related to code like this: class Foo { public: int Foo::bar(); }; Previously, SWIG just tossed out the Foo::bar() declaration. Now, the declaration is wrapped provided that the prefix is exactly the same as the current scope (including any enclosing namespaces). Reported by Bruce Lowery. 03/20/2003: beazley Incorporated [ 696516 ] Enabling exception processing for data member access. In some compilers, attribute access can generate exceptions. However, SWIG ordinarily assumes that no exceptions will be raised. To disable this, use the %feature("allowexcept"). For example: %feature("allowexcept") Foo::x; ... class Foo { public: int x; /* Exception handling enabled */ ... }; Patch contributed by Yakov Markovitch. 03/20/2003: beazley Incorporated Patch. [ 701860 ] Improve Performance (python proxies). Gives a performance boost to proxy class code and the management of the .this and .thisown attributes. Contributed by Mike Romberg. 03/19/2003: cheetah (William Fulton) [C# and Java] Added missing vararg support. 03/18/2003: mrose (Mark Rose) Removed code related to tagging individual methods for directors. The concept of having directors for some but not all virtual methods of a class is deeply flawed. The %feature("nodirector") tag is also gone. Directors are off by default. To enable them for a class, issue %feature("director") classname; which will create director methods for every virtual method in the hierarchy of the class. 03/17/2003: beazley Fixed a subtle problem with passing arguments of type function. For example: int foo(int x(int, int)); or typedef int binop_t(int, int); int foo(binop_t x); In old versions, this would produce code that wouldn't compile. Now, SWIG merely adds an extra pointer, making these declarations the same as: int foo(int (*x)(int, int)); typedef int binop_t(int, int); int foo(binop_t *x); Reported by Garth Bushell. 03/17/2003: mrose (Mark Rose) Fixed the return statement for director base class calls that have no return value. 03/15/2003: beazley Fixed a problem with const smart-pointer wrapping. For example: class Foo { public: int x; void bar() const; void spam(); }; class Blah { ... const Foo *operator->(); ... }; In this case, only "x" and "bar" are visible from Blah (since application of spam violates constness). Moreover, access to "x" is read-only. 03/15/2003: mrose (Mark Rose) Cleaned up two signed versus unsigned comparisons in python/std_vector.i. 03/15/2003: cheetah (William Fulton) [C#] Global variables are wrapped using properties instead of get and set methods. Member variable wrapping bug fixes, for example wrapping pointers work now. Typemaps are used for all variable wrapping to generate the property code. 03/13/2003: mrose (Mark Rose) Fixed a bug in the virtual method unrolling for directors. The order of unrolling is now from base to derived, to ensure that the most derived implementation of a director method is found. Director methods for pure virtual methods now throw DIRECTOR_PURE_VIRTUAL_EXCEPTION if _up is set. 03/12/2003: cheetah (William Fulton) [C#] Polymorphism fix: virtual functions now use the appropriate keyword in the C# proxy class, virtual or override. Some 'using System;' statement fixes needed by the Mono compiler. 03/11/2003: beazley Fixed subtle bug in the application of SwigValueWrapper<> to template classes with default constructors. Reported by Bruce Lowery. 03/11/2003: beazley The $descriptor(type) variable is now expanded in code supplied to %extend. This is useful for certain kinds of advanced wrapping (especially container classes). 03/11/2003: luigi Support for std::map. (a) Integration with scripting language (a la std::vector) for Python, Ruby, MzScheme, and Guile; (b) Simple wrapper for other languages 03/10/2003: beazley Fixed problem with escape sequences in string and character constants. SWIG wasn't parsing certain octal codes correctly. 03/07/2003: beazley Fixed a variety of subtle preprocessor problems reported by Sebastien Recio. (a) Empty preprocessor values no longer generate "bad constant value" errors. For example: #define FOO #define FOO BAR (b) Macro names can now span multiple lines (technically valid, although questionable practice). For example: #define A_LONG_MACRO_\ NAME 42 (c) Whitespace is no longer required before certain macro values. For example: #define FOO"Hello" #define BAR\ "Hello" 03/07/2003: ljohnson (Lyle Johnson) [Ruby] Added missing long long and unsigned long long typemaps in the Lib/ruby/typemaps.i library file. 03/07/2003: mrose (Mark Rose) Added Examples/python/callback to demostrate how directors can be used to implement callbacks in Python Added Examples/python/extend to demonstrate virtual method calls from C++ to Python (really the same as the callback example, just a different context). Added four tests for very basic director functionality. These have runtime tests under python. The Python module now emits #define SWIG_DIRECTORS near the top of the output file if directors are enabled. This is useful for disabling parts of tests in target languages that don't support directors. 03/06/2003: mrose (Mark Rose) Added a section to Doc/Manual/Python.html on cross language polymorphism (directors). 03/06/2003: mrose (Mark Rose) The short-lived "-fdirectors" command line option has been removed. To enable directors, instead use the extended %module directive as follows: %module(directors="1") modulename 03/06/2003: cheetah (William Fulton) The long long typemaps have been rewritten so that they can be more easily used with non ISO compilers, like Visual C++. For example if you are wrapping the Windows 64 bit type __int64 the long long typemaps can be used with %apply: %apply long long { __int64 }; __int64 value1(__int64 x); __int64 will now appear in the generated code instead of long long. 03/06/2003: beazley *** DEVELOPER CHANGE *** Swig module mutation has been changed slightly. When a language class method wants to save node attributes, it now uses one of the following functions: Swig_require() Swig_save() The first argument to these functions is a namespace in which saved attributes are placed. For example,this code Node *n; Swig_save("cDeclaration",n,"type","parms","name",NIL); saves the attributes as "cDeclaration:type", "cDeclaration:parms", and so forth. If necessary, a language module can refer to old values by using this special namespace qualifier. In addition to this, a special attribute "view" contains the name of the last namespace used to save attributes. In the above example, "view" would have the value "cDeclaration". The value of "cDeclaration:view" would have the previous view and so forth. Swig_restore(n) restores a node to the state before the last Swig_require() or Swig_save() call. Note: This change makes it easier for language modules to refer to old values of attributes. 03/06/2003: mrose (Mark Rose) Merged the cross-language polymorphism patch. When enabled, C++ "proxy" classes (called directors) are generated for each specified C++ class. Directors pass method calls from C++ to Python, similar to the way the usual proxy (shadow) classes pass method calls from Python to C++. Together, these two types of proxies allow C++ classes that are extended in Python to behave just like ordinary C++ classes and be used in C++ like native objects. This feature is still very experimental and is disabled by default. To enable director support, specify '-fdirectors' on the SWIG command line or in the SWIG_FEATURES environment variable. In the interface file, add %feature("director") to generate directors for all classes that have virtual methods. See http://stm.lbl.gov/~tm2/swig/ProxyDoc.html for more details. 03/03/2003: beazley Fixed a small glitch in typemap local variable replacement. If you had a typemap like this: %typemap(in) type ($1_type temp) { ... temp = ...; ... } and no occurrence of "$1_type" appeared in the body, then the local variable type wouldn't be substituted. 03/03/2003: cheetah (William Fulton) [C#] New version of the CSharp module which is typemap based. It also uses ECMA C# and no longer uses Microsoft Visual C++.NET glue. This means that it will work on non-Windows platforms. Contributed by Neil Cawse. 02/27/2003: beazley Fixed [ 653548 ] error parsing casting operator definition. SWIG now ignores casting operators declared outside of a class. For example: inline A::operator char *() { ... } Bug reported by Martin Casado. 02/27/2003: beazley Added support for anonymous bit-fields. For example: struct Foo { int x : 4; int : 4; int y : 8; }; Anonymous bit-fields are ignored by SWIG. Problem reported by Franz Höpfinger. 02/26/2003: cheetah (William Fulton) [Java] Better typemaps in the Examples/java/typemap example and also fixes subtle bug when using the StringBuffer typemaps more than once. 02/26/2003: beazley Fixed [ 642112 ] Constants char bug. 02/26/2003: beazley Fixed [ 675337 ] Partial template specialization not entirely working. There was a subtle problem related to the naming and ordering of template partial specialization arguments. Matching worked okay, the resulting templates weren't expanded correctly. 02/25/2003: beazley Fixed problem with parsing (and generating code) for references to arrays. For example: int foo(int (&x)[10]); 02/25/2003: beazley Fixed [ 635347 ] Compilation warning from libpy.c. Reported by Daniel L. Rall. 02/25/2003: beazley Fixed a subtle problem with virtual method implementation checking and typedef. typedef int *intptr; struct A { virtual int *foo() = 0; }; struct B : public A { virtual intptr foo() { }; }; SWIG was treating these declarations as different even though they are the same (via typedef). 02/25/2003: ljohnson (Lyle Johnson) [Ruby] Added range checking for the NUM2USHRT macro, per [ 675353 ]. 02/24/2003: beazley Fixed a subtle problem with the code that determined if a class is abstract and can be instantiated. If you had classes like this: struct A { virtual int foo(int) = 0; }; struct B : virtual A { virtual int foo(int); }; struct C : virtual A { }; /* Note order of base classes */ struct D : B, C { }; /* Ok */ struct E : C, B { }; /* Broken */ then SWIG determined that it could instantiate D(), but not E(). This inconsistency arose from the depth-first search of the inheritance hierarchy to locate the implementations of virtual methods. This problem should now be fixed---SWIG will attempt to locate any valid implementation of a virtual method by traversing over the entire hierarchy. 02/22/2003: cheetah (William Fulton) [Java] Fix for using enum typemaps. The Java final static variable type can be set using the jstype typemap, enabling enums to be mapped to something other than int. Bug reported by Heiner Petith. 02/21/2003: songyanf (Tiger) Added CSharp (C#) module prototype i.e. csharp.cxx & csharp.h at Source/Modules/. They are for test usage only now and need improvement. The interface also need to be modified. *** NEW FEATURE *** 02/20/2003: songyanf (Tiger) Fixed problem with typedef with -fvirtual. Similar as beazley's modification today. 02/20/2003: beazley Added support for gcc-style variadic preprocessor macros. Patch [ 623258 ] GCC-style vararg macro support. Contributed by Joe Mason. 02/20/2003: beazley Fixed [ 605162 ] Typemap local variables. Reported by Lyle Johnson. 02/20/2003: beazley Fixed problem with abstract classes and typedef. For example: class Foo { public: virtual void foo(int x) = 0; }; typedef int Integer; class Bar : public Foo { public: virtual void foo(Integer x); }; SWIG was getting confused about the latter method---making Bar abstract. Reported by Marcelo Matus. 02/19/2003: cheetah (William Fulton) [Java] %javaconst(flag) can also be used on enums as well as constants. This feature enables true Java compiler constants so that they can be used in Java switch statements. Thanks to Heiner Petith for patches. 02/19/2003: songyanf (Tiger) Modified -fcompact feature to deal with PP lines 02/18/2003: beazley Fixed [ 689040 ] Missing return value in std_vector.i. Reported by Robert H. de Vries. 02/18/2003: beazley Fixed a few evil scoping problems with templates, namespaces, and the %extend directive. Problem reported by Luigi Ballabio. 02/18/2003: cheetah (William Fulton) [Ruby] Improved support for Visual C++ and other native Windows compilers. It is no longer necessary to specify "/EXPORT:Init_", where is the swig module name when linking using these native Windows compilers. 02/15/2003: songyanf (Tiger) Added -fvirtual option. Reduce the lines and size of the wrapper file by omitting redifined virtual function in children classes. Modified -compact option to -fcompact option Added -small option. -small = -fvirtual -fcompact And it can be extended by future feature options, which are used to reduce wrapper file szie. Added SWIG_FEATURES environment variable check. To dynamically set the feature options such as -fcompact & -fvirtual *** NEW FEATURE *** 02/13/2003: lenz Updated Doc/Manual/Perl5.html to talk about C++ compile problems configure.in now checks for PERL5_CCFLAGS Runtime/Makefile.in and Example/Makefile.in now use PERL5_CCFLAGS Added Lib/perl5/noembed.h which contains all the known macro conflicts 02/12/2003: beazley Fixed [ 685410 ] C++ Explicit template instantiation causes SWIG to exit. Fixes a syntax error with declarations similar to this: template class std::vector; SWIG now ignores the instantiation and generates a warning message. We might do more later. Reported by Thomas Williamson. 02/11/2003: cheetah (William Fulton) Rewrote bool typemaps to remove performance warning for compiling generated code under Visual C++. 02/11/2003: cheetah (William Fulton) Fix for wrapping reference variables (const non-primitive and all non-const types) for example: int& i; Class& c; const Class& c; 02/11/2003: beazley Fixed more very subtle preprocessor corner cases related to recursive macro expansion. For example: #define cat(x,y) x ## y cat(cat(1,2),3) // Produces: cat(1,2)3 #define xcat(x,y) cat(x,y) xcat(xcat(1,2),3) // Produces 123 See K&R, 2nd Ed. p. 231. 02/10/2003: cheetah (William Fulton) Fixed [ 683882 ] - patch submitted by F. Postma for SWIG to compile on HP-UX. 02/10/2003: beazley Fixed subtle preprocessor argument expansion bug. Reported by Marcelo Matus. 02/10/2003: songyanf Added -compact option. Reduce the lines and size of the wrapper file by omitting comments and combining short lines. *** NEW FEATURE *** 02/07/2003: beazley Fixed [ 651355 ] Syntax error with cstring.i Reported by Omri Barel. 02/07/2003: beazley Fixed [ 663632 ] incompatibility with standard cpp. This is a refinement that fixes this problem: // Some macro with an argument #define FOO(x) x int FOO; /* Not a macro---no arguments */ 02/05/2003: beazley Fixed [ 675491 ] parse error with global namespace qualification. Submitted by Jeremy Yallop. 02/04/2003: beazley Fixed bug in varargs processing introduced by the numinputs typemap parameter. 01/08/2003: ttn [xml] Fix string-replacement ordering buglet. Thanks to Gary Herron. 12/23/2002: cheetah (William Fulton) Further build changes: - The SWIG executable is now built using a single Makefile. - This makefile is generated by Automake (Source/Makefile.am). - Dependency tracking and tags support are in this makefile. - Automake 1.7.2 and Autoconf 2.54 minimum versions are needed to build SWIG from CVS. - Running ./autogen.sh now installs Autoconf/Automake support files into Tools/config and these files are no longer stored in CVS. - Bug fixes in 'make install' for systems using .exe executable extension and ./configure --with-release-suffix=whatever 12/16/2002: cheetah (William Fulton) More build changes: - Autoconf's AC_CANONICAL_HOST replaces proprietary approach for detecting build host. - Autoconf support files moved to Tools/config. 12/16/2002: cheetah (William Fulton) Modifications to run on MacOS, submitted by Bernard Desgraupes. Mainly ensuring generated files are output in the appropriate directory for some modules. 12/11/2002: cheetah (William Fulton) Various build modifications and bug fixes: - Simplification of version string. Use autoconf's PACKAGE_VERSION instead. - Build time removed from SWIG version. - Using standard autoconf config header generation. - Updated old autoconf macros as reported by autoupdate. - Removed $prefix in autoconf from search paths as autoconf won't expand them. - Subtle bug fix where 'make prefix=/somewhere; make clean; make prefix=/somwhere/else' produced an executable using the incorrect library directories. - Added -ldflags commandline option for MzScheme, Ocaml, Pike and PHP. - Fixed reporting of compiler used when using -version commandline option. - SWIG web address added to -version commandline option. 12/11/2002: beazley Minor fix to Tcl dynamic cast typemaps. Reported by Kristopher Blom. 12/10/2002: beazley Fixed subtle template argument replace bug. Reported by Chris Flatley. 12/10/2002: beazley Reverted CHANGES 09/03/2002, preprocessor argument evaluation. Arguments are not evaluated during collection, K&R, p. 230. 12/06/2002: beazley Fixed [ 649022 ] Compilation problems with KAI/KCC 12/02/2002: beazley SWIG 'rel-1-3' CVS branch merged back into the main branch. Version 1.3.17 (November 22, 2002) ================================== 11/19/2002: beazley Fixed [ 613922 ] preprocessor errors with HAVE_LONG_LONG. 11/19/2002: beazley Fixed [ 615480 ] mzscheme SWIG_MustGetPtr_. 11/19/2002: beazley Fixed [ 635119 ] SWIG_croak causes compiler warning. 11/16/2002: cheetah (William Fulton) [Java] Added typemaps for pointers to class members. 11/15/2002: cheetah (William Fulton) [Java] Bug fix: Overloaded C++ functions which cannot be overloaded in Java once again issue a warning. 11/14/2002: cheetah (William Fulton) [Java] Handling of NULL pointers is improved. A java null object will now be translated to and from a NULL C/C++ pointer by default. Previously when wrapping: class SomeClass {...}; void foo(SomeClass *s); and it was called from Java with null: modulename.foo(null) a Java NullPointerException was thrown. Extra typemaps had to be written in order to obtain a NULL pointer to pass to functions like this one. Now the default wrapping will detect 'null' and translate it into a NULL pointer. Also if a function returns a NULL pointer, eg: SomeClass *bar() { return NULL; } Then this used to be wrapped with a SomeClass proxy class holding a NULL pointer. Now null is returned instead. These changes are subtle but useful. The original behaviour can be obtained by using the original typemaps: %typemap(javaout) SWIGTYPE { return new $&javaclassname($jnicall, true); } %typemap(javaout) SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] { return new $javaclassname($jnicall, $owner); } %typemap(javagetcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ protected static long getCPtr($javaclassname obj) { return obj.swigCPtr; } %} *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 11/12/2002: beazley Fixed problem with abstract methods and signatures. For example: class abstract_foo { public: virtual int meth(int meth_param) = 0; }; class abstract_bar : public abstract_foo { public: int meth(int meth_param_1, int meth_param_2) { return 0; } }; In this case, abstract_bar is still abstract. Fixes [ 628438 ] Derived abstract class not abstract. Reported and patched by Scott Michel. 11/11/2002: beazley Fixed a matching problem with typemaps and array dimensions. For example, if you had this: typedef char blah[20]; and a typemap: %typemap() char [ANY] { ... $1_dim0 ... } then $1_dim* variables weren't be expanded properly. It should work now. Problem reported by Pankaj Kumar Goel. 11/07/2002: mkoeppe Added an experimental new module that dumps SWIG's parse tree as (Common) Lisp s-expressions. The module is invoked with SWIG's -sexp command-line switch. The output can be read into Common Lisp. There is (prototype) example Lisp code that generates Foreign Function Interface definitions for use with Kevin Rosenberg's UFFI. *** EXPERIMENTAL NEW FEATURE *** 11/07/2002: mkoeppe Removed duplicate declaration of "cpp_template_decl" in parser.y; bison 1.75 complained. 11/06/2002: cheetah (William Fulton) [Java] Default primitive array handling has changed like arrays of classes. C primitive arrays are no longer wrapped by a Java array but with a pointer (type wrapper class). Again the changes have been made for efficiency reasons. The original typemaps have been moved into arrays_java.i, so the original behaviour can be obtained merely including this file: %include "arrays_java.i" The array support functions are no longer generated by default. They are only generated when including this file, thus this often unused code is only generated when specifically requiring this type of array support. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 11/05/2002: ljohnson (Lyle Johnson) [Ruby] Added support for nested module declarations (as was previously added for the Perl module). So a %module directive of the form: %module "Outer::Inner::Foo" will nest everything as (in Ruby code): module Outer module Inner module Foo # stuff goes here end end end 11/05/2002: mkoeppe [MzScheme] Add an argument (-declaremodule) that generates code to correctly declare a primitive module extension. Patch submitted by Bruce Butterfield. 11/02/2002: cheetah (William Fulton) [Java] Added patch submitted by Michael Cahill to remove unused parameter warnings for the jenv and cls parameters. This patch also also allows one to use "void" in the jni typemap for any type without code being generated attempting to return a value. 10/29/2002: cheetah (William Fulton) [Java] Array handling is different. Arrays of classes are no longer wrapped with proxy arrays, eg wrapping class X {...}; X foo[10]; used to be wrapped with these Java getters and setters: public static void setFoo(X[] value) {...} public static X[] getFoo() {...} This approach is very inefficient as the entire array is copied numerous times on each invocation of the getter or setter. These arrays are now wrapped with a pointer so it is only possible to access the first array element using a proxy class: public static void setFoo(X value) {...} public static X getFoo() {...} Arrays of enums have also been similarly changed. This behaviour is now like the other SWIG language's implementation and the array library should be used to access the other elements. The original behaviour can be achieved using the macros and typemaps in arrays_java.i, for example: %include "arrays_java.i" JAVA_ARRAYSOFCLASSES(X) class X {...}; X foo[10]; *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 10/29/2002: cheetah (William Fulton) [Java] Two new typemaps javain and javaout for generating the proxy class and type wrapper class method calls to the JNI class. The new typemaps are really used for transforming the jstype (used in proxy class and type wrapper classes) to the jtype (used in the JNI class) and visa versa. A javain typemap is required whenever an in typemap is written and similarly javaout for an out typemap. An example is probably best to show them working: %typemap(javain) Class "Class.getCPtr($javainput)" %typemap(javain) unsigned short "$javainput" %typemap(javaout) Class * { return new Class($jnicall, $owner); } %inline %{ class Class {}; Class * bar(Class cls, unsigned short ush) { return new Class(); }; %} The generated proxy code is then: public static Class bar(Class cls, int ush) { return new Class(exampleJNI.bar(Class.getCPtr(cls), ush), false); } Some new special variables have been introduced in order to use these typemaps. Here $javainput has been replaced by 'cls' and 'ush'. $jnicall has been replaced by the native method call, 'exampleJNI.bar(...)' and $owner has been replaced by 'false'. $javainput is analogous to the $input special variable. It is replaced by the parameter name. $jnicall is analogous to $action in %exception. It is replaced by the call to the native method in the JNI class. $owner is replaced by either true if %newobject has been used otherwise false. The java.swg file contains default javain and javout typemaps which will produce the same code as previously. This change is only of concern to those who have written their own typemaps as you will then most likely have to write your own javain and javaout typemaps. The javaout typemap also makes it possible to use a Java downcast to be used on abstract proxy base classes. See the Java documentation on dynamic_cast. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 10/24/2002: ttn [Methodology] Upgaded to libtool 1.4.3, presumably w/ better support for newish platforms (like MacOS X). 10/21/2002: ttn Fixed Runtime/Makefile.in bug -- thanks to Richard Calmbach. 10/18/2002: ttn Fixed typo in doh.h -- thanks to Max Horn. Version 1.3.16 (October 14, 2002) ================================= 10/13/2002: beazley Fixed bug with %extend directive and %feature reported by William Fulton. 10/13/2002: beazley Added OpenVMS build directory (vms). Contributed by Jean-François Pieronne. 10/09/2002: cheetah (William Fulton) [Java] Added throws clause to the native functions in the JNI class. The throws clause is the same as the one generated for proxy functions and module class functions. 09/27/2002: beazley Fixed some problems with the %import directive and classes that were defined but not wrapped. Problem reported by Leslie Brooks, Gerry Woods, and others. 09/23/2002: cheetah (William Fulton) [Java] Some error checking added: 1) OutOfMemoryException check in the char * typemaps. 2) As SWIG treats pointers, references and passing by value all the same, it is possible to pass a NULL pointer to a function that expects an object passed by value or by reference. A NullPointerException is now thrown under this scenario. 09/20/2002: ttn [Methodology] Reworked "make clean" and "make install" to be more table driven. [Docs] Explain how to extend "make install" w/ extra-install.list. 09/15/2002: beazley Deprecation of the "ignore" typemap. The "ignore" typemap has been deprecated in favor of a generalization of the "in" typemap. To ignore an argument, use something like this instead: %typemap(in,numinputs=0) int *output (int temp) { $1 = &temp; } This change fixes a number of subtle bugs related to the interaction of the "in" and "ignore" typemaps (which were supposed to be mutually exclusive). The use of the numinputs argument is reserved for future expansion. Currently, values >1 will generate an error. However, future releases of SWIG may utilize that to support multi-input typemaps. %typemap(ignore) still works, but generates a warning message and is translated to %typemap(in,numinputs=0). *** POTENTIAL INCOMPATIBILITY *** *** NEW FEATURE *** 09/15/2002: beazley Fixed segmentation fault for unnamed structures. For example: typedef struct { } *blah; Reported by Roger Gibson. Note: we might be able to generate wrappers in special cases. 09/13/2002: beazley Minor modification to generated wrapper functions. Pointer arguments are now always set to an initial value of 0. Simplifies typemap writing and cleanup code (since you can rely on zero-value initialization). This also greatly reduces the need to ever write an "arginit" typemap. 09/12/2002: beazley Minor enhancement to smart-pointer support. If operator->() is part of an ignored base class like this, %ignore Bar; class Foo { public: int blah(); }; class Bar { /* Ignored */ public: ... Foo *operator->(); ... }; class Spam : public Bar { }; then methods from Foo are still available. For example, >>> s = Spam() >>> s.blah() 0 >>> The only catch is that the operator->() itself is not available (since it wasn't wrapped). Therefore, there won't be any __deref__() operation unless it is explicitly added to Spam (either using %extend or just placing operator->() in the definition of Spam). 09/11/2002: ttn [Methodology] Reworked "make check" to be more table driven. [Docs] Docuemented methodology in Manual/Extending.html. 09/11/2002: ttn [Docs] Prefixed Manual/*.html with "" to pander dotingly to (over-)sensitive editors. 09/10/2002: ttn [Guile] Converted Examples/guile/simple "make check" behavior to actually check execution results. Reduced iteration counts so that the test doesn't take too long. 09/10/2002: beazley SWIG-1.3.15 released. Version 1.3.15 (September 9, 2002) ================================== 09/09/2002: beazley Fixed nasty runtime type checking bug with subtypes and inheritance and templates. 09/09/2002: cheetah (William Fulton) [Java] Java exception classes for a method's throws clause can be generated by specifying them in a comma separated list in the throws attribute in any one of the following typemaps: in, out, check, freearg, argout and throws. A classic example would be to convert C++ exceptions into a standard Java exception: %typemap(throws, throws="java.io.IOException") file_exception { jclass excep = jenv->FindClass("java/io/IOException"); if (excep) jenv->ThrowNew(excep, $1.what()); return $null; // or use SWIG_fail } class file_exception {...}; void open(const char *filename) throw(file_exception); The Java method will then be declared with a throws clause: public static void open(String filename) throws java.io.IOException {...} 09/08/2002: mkoeppe * [Guile] Improved the documentation system. The arglist no longer gets cluttered with type specification, making it more readable. (Also the ILISP function C-u M-x `arglist-lisp' RET works better this way.) The types of arguments are explained in an extra sentence after the arglist. There are now two documentation-related typemap arguments: %typemap(in, doc="$NAME is a vector of integers", arglist="$name") int *VECTOR { ... } The "arglist" texts of all arguments of a function make up its arglist in the documentation. The "doc" texts of all arguments are collected to make a sentence that describes the types of the arguments. Reasonable defaults are provided. As usual, $name is substituted by the name of the argument. The new typemap variable $NAME is like $name, but marked-up as a variable. This means that it is upper-cased; in TeXinfo mode ("-procdocformat texinfo") it comes out as @var{name}. The directives %values_as_list, %values_as_vector, %multiple_values now also have an effect on the documentation. (This is achieved via the new pragmas return_nothing_doc, return_one_doc, return_multi_doc.) Documentation has also improved for variables that are wrapped as procedures-with-setters (command-line switch "-emit-setters"). * [Guile] Emit constants as _immutable_ variables. (This was broken recently.) 09/07/2002: mkoeppe [Guile] Updated the typemaps in list-vector.i. 09/07/2002: mkoeppe Short-circuit the typechecks for overloaded functions. (The changes in code generation are visible in the new testcase "overload_complicated".) 09/06/2002: cheetah (William Fulton) [Java] Solution for [ 596413 ] New typemap so that the Java proxy classes and type wrapper classes wrapper constructor modifier can be tailored by users. The default value is protected. Normally SWIG generates a constructor like this which can only be accessed within one package: protected Bar(long cPtr, boolean cMemoryOwn) { ... } If you are using SWIG across multiple packages or want to use this constructor anyway, it can now be accessed outside the package. To modify use for example: %typemap(javaptrconstructormodifiers) SWIGTYPE "public" to change to public for all proxy classes and similarly for all type wrapper classes: %typemap(javaptrconstructormodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] "public" 09/06/2002: cheetah (William Fulton) [Java] Added throws typemaps for the Java module. C++ exceptions get converted into java.lang.RuntimeException Java exceptions. Warning: This may change from java.lang.Runtime exception in the future. 09/05/2002: cheetah (William Fulton) [Java] Fix for variables declared as references. 09/05/2002: beazley Fixed [ 605162 ] Typemap local variables. Reported by Lyle Johnson. 09/05/2002: ljohnson (Lyle Johnson) [Ruby] More updates to the Ruby module documentation, including a new typemap example that demonstrates how to collect key-value pairs from an argument list into a Hash. 09/05/2002: beazley Fixed bug with template expansion and constructors. template class Foo { public: Foo() { } }; The extra in the constructor was carried through in the name--causing runtime problems in generated modules. Reported by Jordi Arnabat Benedicto. 09/05/2002: mkoeppe [Guile] Support overloading. 09/04/2002: ljohnson (Lyle Johnson) [Ruby] Updated typemaps for long long and unsigned long long types to use Ruby 1.7 support for these types when available. 09/04/2002: ljohnson (Lyle Johnson) [Ruby] Added output typemaps for const reference to primitive types. 09/04/2002: mkoeppe [Guile] Fix pass-by-value typemaps. Reported by Arno Peters via Debian bugtracking (#156902), patch by Torsten Landschoff . 09/03/2002: samjam (Sam Liddicott) Better reference support. Functions that want a void** can take a NULL by reference and the void* will be made for you and then passed-by-reference Also all integer-class native types can be passed by reference where an int* or int& etc is needed 09/03/2002: beazley Changed the evaluation order of preprocessor macro arguments. Arguments are now expanded by the preprocessor *before* they are passed to macro expansion. This fixes a subtle expansion bug reported by Anthony Heading. 09/03/2002: beazley Fixed the file include order (again, apparently). See 2/27/99. 09/02/2002: beazley [Perl] Better exception handling support. Since Perl error handling relies on setjmp/longjmp, wrapper functions have been modified slightly to provide an extra block scope: XS(foo) { char _swigmsg[SWIG_MAX_ERRMSG] = ""; const char *_swigerr = _swigmsg; { /* Normal wrapper function here */ ... SWIG_croak("An error occurred\n"); ... XSRETURN(argvi); /* Successful return */ fail: /* cleanup code */ } croak(_swig_err); } The macro SWIG_croak(x) sets the value of _swigerr to x and executes a "goto fail". The whole wrapper function is enclosed block scope to provide proper cleanup of C++ objects. Since croak executes a longjmp(), there is no way to properly reclaim resources if this executes in the same scope as the wrapper function. The _swigmsg[] variable is normally unused, but can be used to store small error messages using sprintf or snprintf. It has a capacity of at least 256 bytes (SWIG_MAX_ERRMSG). 09/02/2002: beazley [Tcl] Added better support for exceptions. Instead of returning TCL_ERROR, use the macro SWIG_fail to return with an error. This ensures that arguments are properly cleaned up. Exception specifiers are now handled by default. 09/02/2002: ljohnson (Lyle Johnson) [Ruby] The type-checking system for the Ruby module has had a flaw in that some types which should be considered equivalent weren't. This bug was best demonstrated by the inherit_missing.i test suite case, which defines a base class "Foo" that is subclassed by "Bar". The "Foo" class isn't actually wrapped (i.e. it's not directly accessible from Ruby) but we'd still like to be able to pass "Bar" instances to functions expecting Foos and have that work; it wasn't. The revised implementation (similar to that used for some other language modules) adds a new instance variable (__swigtype__) to each object that indicates its SWIG type; that is, each "Bar" instance will now have a string instance variable called "__swigtype__" whose value is "_p_Bar". Unless developers were taking advantage of this low-level implementation detail, they shouldn't notice any compatibility problems; nevertheless, I'm marking it as a "potential incompatibility". *** POTENTIAL INCOMPATIBILITY *** 09/01/2002: ljohnson (Lyle Johnson) [Ruby] Fixed SF Bug #603199. 08/08/2002: cheetah (William Fulton) [Java] Added OUTPUT, INPUT and INOUT typemaps in typemaps.i for C++ references. 08/27/2002: mkoeppe [Guile] Fixed error in "lib_std_vector" testcase and compiler warning in "lib_cdata" testcase. 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Added the "%mixin" directive, which allows the user to specify a comma-separated list of module names to mix-in to a class. So, for example, if you'd like to specify that Ruby's Enumerable module should be mixed-in to your class Foo, you'd write: %mixin Foo "Enumerable"; or to specify that the modules Fee, Fie and Fo should be mixed in to Foo: %mixin Foo "Fee,Fie,Fo"; *** NEW FEATURE *** 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Modified the %alias directive so that multiple aliases can be specified for an instance method by using a comma-separated list of aliases. 08/27/2002: ljohnson (Lyle Johnson) [Ruby] Added "throw" typemaps for the Ruby module. 08/26/2002: beazley Two new command line options for printing dependencies. 'swig -M' lists all file dependencies. 'swig -MM' lists dependencies, but excludes files in the SWIG library. Example: % swig -M -python example.i example_wrap.cxx: \ /u0/beazley/Projects/lib/swig1.3/swig.swg \ /u0/beazley/Projects/lib/swig1.3/python/python.swg \ example.i \ example.h % swig -MM -python example.i example_wrap.cxx: \ example.i \ example.h *** NEW FEATURE *** 08/26/2002: beazley Fixed [ 597599 ] union in class: incorrect scope. Reported by Art Yerkes. 08/26/2002: beazley Fixed [ 600132 ] Default argument with namespace. Reported by Shibukawa Yoshiki. 08/24/2002: beazley Automatic C++ exception handling enabled for all language modules. This is pretty simple. If you have a class like this: class Foo { }; class Bar { public: void blah() throw(Foo); } then the generated wrapper code looks like this: wrap_Bar_blah() { ... try { arg1->blah(); } catch (Foo &_e) { /* "throw" typemap code inserted. $1 = _e */ } catch (...) { throw; } } The "throw" typemap can be used to raise an error in the target language. It can do anything. Here is a very simple example: %typemap("throw") Foo { PyErr_SetString(PyExc_RuntimeError, "Foo exception"); return NULL; } To make this work in each language module, simply define a few default "throw" typemaps for SWIGTYPE, SWIGTYPE *, int, const char *, and a few common exception types. That's all there is to it. Automatic exception handling can be disabled using -noexcept or setting the NoExcept global variable to 1. *** NEW FEATURE *** 08/23/2002: beazley [ Python ] Automatic translation of C++ exception specifications into error handling code. For example: class Foo { }; class Bar { public: void blah() throw(Foo); } In this case, Foo is wrapped as a classic-style class (compatible with exception handling). Furthermore, you can write Python code like this: b = Bar() try: b.blah(); except Foo,e: # Note use of exception class here! # Handle Foo error ... The object "e" in the exception handler is just a wrapped Foo object. Access it like a normal object. If an exception is not wrapped as a class, a RuntimeError exception is raised. The argument to this exception is the exception object. For example: class Bar { public: void blah() throw(int); } b = Bar() try: b.blah(); except RuntimeError,e: print e.args[0] # Integer exception value Comments: - If a class is used as an exception, it *must* be wrapped as a Python classic-style class (new classes don't work). - Automatic exception handling is compatible with %exception. - Use -noexcept to turn off this feature. - The newly introduced "throw" typemap is used to raise Python errors (naturally). *** EXPERIMENTAL NEW FEATURE *** 08/23/2002: beazley Information from throw() specifiers is now stored in the parse tree. For example: class Foo { public: int blah() throw(spam,bar); } The stored information is fully corrected for namespaces and works with templates. Uses will follow. 08/22/2002: beazley Exception handling code is no longer applied to member access function. For example, in this code %exception { try { $action } catch(whatever) { ... } } class Foo { public: int x; ... } The exception handling code is not applied to accessor functions for Foo::x. This should reduce the amount of extra code generated. Caveat: Exception handling code *is* used when attributes are accessed through a smart-pointer or a synthesized attributed added with %extend is used. 08/22/2002: beazley Made more patches to hopefully eliminate problems when compiling SWIG as a 64-bit executable. 08/22/2002: beazley Fixed a bug with const reference members, variables, and static members. For example: class Foo { public: static const int &ref; }; SWIG was trying to generate "set" functions which wouldn't compile. 08/21/2002: beazley Made the warning message for "Class X might abstract" off by default. Enable with -Wall. 08/21/2002: beazley Refined handling of const and non-const overloaded methods. If a class defines a method like this: class Foo { public: int bar(int); int bar(int) const; } Then the non-const method is *always* selected in overloading and the const method silently discarded. If running with -Wall, a warning message will be generated. 08/19/2002: beazley Better support for using declarations and inheritance. Consider this: class Foo { public: int blah(int x); }; class Bar { public: double blah(double x); }; class FooBar : public Foo, public Bar { public: char *blah(char *x); using Foo::blah; using Bar::blah; }; Now SWIG wraps FooBar::blah as an overloaded method that uses all accessible versions of blah(). See section 15.2.2 in Stroustrup, 3rd Ed. SWIG also supports access change through using declarations. For example: class Foo { protected: int x; int blah(int x); }; class Bar : public Foo { public: using Foo::x; using Foo::blah; }; Caveat: SWIG does not actually check to see if declarations imported via 'using' are in the inheritance hierarchy. If this occurs, the wrapper code won't compile anyways---not sure it's worth worrying about. 08/18/2002: beazley Modified overloading dispatch to not include nodes with an "error" attribute. A language module can set this if a node couldn't be wrapped and you don't want it included in the dispatch function. 08/18/2002: beazley Enhancement to overloaded function dispatch. The dispatcher is now aware of inheritance relationships. For example: class Foo { }; class Bar : public Foo { }; void spam(Foo *f); void spam(Bar *b); In this case, the dispatcher re-orders the functions so that spam(Bar *b) is checked first---it is more specific than spam(Foo *f). 08/17/2002: beazley Added -Werror command line option. If supplied, warning messages are treated as errors and SWIG will return a non-zero exit code. 08/17/2002: beazley Fixed [ 596135 ] Typedef of reference can't compile. For example: typedef int &IntRef; void foo(IntRef i); SWIG-1.3.14 generated code that wouldn't compile. Version 1.3.14 (August 12, 2002) ================================ 08/11/2002: mmatus Static const members initialized during declaration, and only them, ie: struct A { static const int a = 1 ; // this one static const int b; // not this one }; are emitted like constants (equivalent to enums or explicit %constant). This is because they cannot be added directly to 'cvar' since they lack the needed reference (well, you can force them to have a real reference, but in an ugly way which goes completely again the original purpose of initialize them during declaration, you also have to deal with extra linking matters, and it take a while to figure out what is the problem and how to solve it). Please test it with your preferred target language, and not only the code generation, but really run the example in the test-suite (static-const-member-2.i) because the problem and the solution cannot be "fully" appreciated until you try to load the module and run it. In some target languages (python specially), this can produces a difference in the way that the static constant members 'a' and 'b' are internally wrapped. Hopefully, they still can be accessed in the same way. 08/11/2002: mmatus [python] Now static const members can be accessed in a more natural way, ie, if you have struct A { typedef unsigned int viewflags; static const viewflags forward_field = 0; static const viewflags backward_field; }; now you can do: print A.backward_field and also a = A() print a.forward_field Note that if the static const members don't have an initializer (like backward_field), still you can access them in the same way in the python side, but the implementation is a quite different: backward_field will still appear in the cvar entity, and also, you are responsible to initialize it in some code unit, and link it properly. forward_field, by the other hand, will not appear in the cvar entity but only as a A member, similar to what happen with enum or %constant members. 08/11/2002: mmatus [python] Common code in the __setattr__/__getattr__ now goes to two "free" methods at the beginning of the proxy file, from where each class use it. This change reduces the size of the proxy file, specially if you wrap a lot of small classes in one module (up to 33% in some cases), making it faster to load too. 08/09/2002: beazley [Perl5] If a function that returns char * returns NULL, undef is returned to the Perl interpreter. 08/09/2002: beazley Fix to conversion operators and namespaces. For example: namespace ns { struct Foo { }; struct Bar { operator Foo*(); }; } In the wrapper code, SWIG was using ->operator Foo*() when it should have been using ->operator ns::Foo*(). Note: if using %rename with a conversion operator, you might have to do this: %rename(toFooPtr) ns::operator ns::Foo*(); // ^^^^ note extra qualifier namespace ns { ... 08/09/2002: beazley [Python] Minor enhancement to 'const' variable declarations. Normally const declarations are wrapped as read-only variables accessible only through the cvar attribute (see SWIG.html for a discussion of why). However, in many programs, "const" declarations may just be constants---making the cvar. access awkward. To fix this, "const" declarations are now available both through cvar. and as a simple name. For example: const int FOO = 42; In Python: >>> print example.cvar.FOO 42 >>> print example.FOO 42 Note: There are cases where the value of a "const" variable might change. For example: char *const BAR = "Hello World"; In this case, the pointer itself can not change, but the data being pointed to could be modified. In these situations, cvar.BAR should be accessed to obtained the current value. 08/08/2002: beazley [Python] Fixed generation of the proxy code (.py files) to more closely follow the order of declarations as they appear in the .i file. In the past, all of the class wrappers appeared first, followed by function stubs, inserted Python code, and other details. 08/08/2002: cheetah (William Fulton) [Java] Proxy method _delete() changed to delete(). There shouldn't ever be a wrapped function called delete() as it is a C++ keyword and there is no such thing as a member function in C. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by adding the function back in for all proxy classes: %typemap(javacode) SWIGTYPE %{ public void _delete() { delete(); } %} Java backwards compatibility summary ------------------------------------ There are a number of changes that have been made in improving the Java module for ver 1.3.14. If at all possible change your code to take advantages of the improvements. If you were using proxy classes you may not notice any backwards compatibility issues. Here is an example which will help with most backwards compatibility problems where it is not possible to modify the code that uses the generated output: Replace: %module modulename With: %module (jniclassname="modulename") modulename; %typemap(javacode) SWIGTYPE %{ public long getCPtr$javaclassname() { return swigCPtr; } public void _delete() { delete(); } %} %pragma(java) jniclassclassmodifiers="public"; The proxy constructors that took parameters (long cPtr, boolean cMemoryOwn) were public and are now protected. If you were making use of these then you'll have to modify your code and the best solution would be to use the new type wrapper classes. The other main areas are the pragmas and global variable wrapping. Replace the pragmas with one of the new directives or typemaps mentioned below and use %rename on the variables. If you were not using proxy classes, you will have to define a jstype typemap as well as a jtype typemap. 08/08/2002: cheetah (William Fulton) [Java] Fix for wrapping two dimension array variables. 08/07/2002: beazley [Python,Tcl] Object management now has a much better sense of ownership. Ownership bits is changed whenever an object is stored in a global variable or structure member. For example: struct Foo { int val; Foo *next; }; Now in Python >>> f = Foo() >>> f.thisown 1 >>> g = Foo() >>> g.next = f # Assign a pointer >>> f.thisown # Notice ownership change 0 >>> This scheme is mostly a conservative heuristic designed to provide segmentation faults. It could cause a memory leak if ownership is changed unnecessarily. In this case, you can either write a typemap (that doesn't change ownership), or manually set the thisown attribute back to 1. 08/07/2002: beazley [Tcl] Major usability improvements to the object interface. Suppose you had code like this: struct Foo { int x; int spam(); }; void blah(Foo *f); In past versions of SWIG, you could create objects and use them like this: % Foo f % f configure -x 3 % f spam 37 The only problem is that if you tried to call blah(), it didn't work: % blah f Type Error. Expected _p_Foo % Instead, you had to do this: % blah [f cget -this] SWIG now automatically extracts the -this pointer, avoiding this problem. This means that saying "blah f" is perfectly legal and everything will still work normally. Caveat: Since pointer strings start with a leading underscore (_), don't use this in object names. For example: % Foo _f % blah _f # Potential crash Objects now have a -thisown attribute that shows the ownership. This builds upon the CHANGES 11/24/2001 entry. 08/07/2002: samjam, Sam Liddicott Properly implemented pointer system using php resources. Still need to work out whether or not to let script-users call destructors directly 08/06/2002: beazley Upgraded mzscheme module to support version 201 and added overloading support. 08/05/2002: beazley Added parsing support for extra grouping (in very limited cases). For example: typedef int (FuncPtr)(int, double); *** EXPERIMENTAL *** 08/03/2002: ljohnson (Lyle Johnson) [Ruby] Updates to typemaps.i as those done previously for Perl, Python and Tcl modules. Now supports reference types with INPUT, OUTPUT and INOUT typemaps. 08/02/2002: beazley New library file cstring.i added. Provides macros for manipulating char * data. 08/02/2002: beazley Deprecated the %new directive. Use %newobject instead. For example: %newobject foo; ... char *foo(); %newobject follows the same rules as %rename, %ignore, %feature, etc. *** POTENTIAL INCOMPATIBILITY *** 08/01/2002: cheetah (William Fulton) [Java] New attribute 'jniclassname' for the module directive allows a way of changing the JNI class name from the default which uses the modulename with JNI appended after it. %module (jniclassname="name") modulename If 'name' is the same as 'modulename' then the module class name gets changed from 'modulename' to modulenameModule. 08/01/2002: beazley Fixed problem with file include order. Language specific directories should take precedence over generic directories. For example: "swig_lib/python/foo.i" should be loaded before "swig_lib/foo.i". I thought this was the case already, but apparently it has been broken for quite some time. 08/01/2002: beazley Added std_deque.i library file. Work in progress. 08/01/2002: beazley [Python,Tcl,Perl] Improvements to typemaps.i. INPUT/INOUT typemaps perform better error checking. Typemaps are now supplied for references like int &OUTPUT, double &INOUT, etc. 08/01/2002: beazley [Python] Deprecated the T_* and L_* typemaps in typemaps.i. Multiple return values are always placed in a tuple. Deprecated the BOTH typemaps. This is now INOUT (e.g., int *INOUT). *** POTENTIAL INCOMPATIBILITY FOR PYTHON MODULE *** 08/01/2002: beazley Deprecated the array.i, carray.i, and timer.i library files. 08/01/2002: beazley Deprecated the pointer.i library file. Use cpointer.i instead. *** POTENTIAL INCOMPATIBILITY *** 08/01/2002: cheetah (William Fulton) [Java] For consistency the global variable getters and setters use the JavaBean property design pattern like member variables always have. This means if you are wrapping a variable called foo, the getter is called getFoo() and the setter is called setFoo(). Before the recent changes to the Java module the getters and setters were called get_foo() and set_foo(). If you really want the original function names use the %rename directive like this: %rename(_foo) Foo; 07/31/2002: beazley Fixed casting problem with multiple inheritance. If you had this, class foo {}; class bar : public foo {}; class baz : public foo {}; class spam : public bar, public baz {}; then the wrappers wouldn't compile due to an ambiguous cast. Reported by Art Yerkes. 07/30/2002: cheetah (William Fulton) [Java] Due to new static typechecking all pointers held in a Java long are part of the internal workings and this pointer value in the Java long has become abstracted data. The type wrapper constructor and getCPtr() methods are as such protected. If you need to mess around with pointers from Java or for example create a proxy class or type wrapper class around a null pointer, add a function/constructor to do so with the %javacode typemap. You can also make getCPtr() public again with the %javagetcptr typemap. 07/30/2002: cheetah (William Fulton) [Java] Fixes for %typemap(ignore). In particular when ignoring the last parameter in a function. Also for all parameters in constructors. These mods have also fixed multi-argument typemaps for proxy classes - SF 581791. 07/30/2002: cheetah (William Fulton) [Java] %newobject (replacement for %new) now implemented for Java. 07/29/2002: beazley Fixed problem with typemap copies, %apply, and %clear inside C++ namespaces. 07/28/2002: cheetah (William Fulton) [Java] The JNI class now has package access as the class modifier has been changed from "public" to nothing. This has been done as this class is now more for the internal workings of SWIG since the module class has static type checking for all types. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by using the %jniclassclassmodifier pragma to change it back to "public". 07/28/2002: cheetah (William Fulton) [Java] Proxy/Shadow classes are generated by default. The -proxy and -shadow command line options are deprecated. If you want to use the low-level functional interface then use the new -noproxy commandline option. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/28/2002: cheetah (William Fulton) [Java] Remaining pragmas shakeup. These were the remaining pragmas and their new names where changed: modulebase modulecode moduleclassmodifiers moduleimport => moduleimports moduleinterface => moduleinterfaces The moduleimports works slightly differently to how the moduleimport pragma worked. Now it actually takes code which gets placed before the class definition so the whole import statement has to be given, for example: %pragma(java) moduleimports=%{ import java.io.*; import java.math.*; %} The moduleinterfaces is slightly different to the old moduleinterface in that if more than one interface is required they must be comma separated in one use of the pragma, for example: %pragma(java) moduleinterfaces="Serializable, MyInterface" These last two pragmas are consistent with the javainterfaces and javaimports typemap. A similar set of pragmas has been introduced, namely: jniclassbase jniclasscode jniclassclassmodifiers jniclassimport jniclassinterface These work in the same way as their module counterparts. Note that previously the moduleXXX pragmas worked on the old module class which is now called the JNI class (the class with the native functions). The jniclassXXX pragmas now work on the new module class (the class that has all the global functions and global variable getters and setters when using proxy classes, plus all other remaining functions when using the low-level procedural interface). In summary the contents of the pragmas make up a class like this: class modulename extends implements { ... SWIG generated functions ... } } *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/28/2002: cheetah (William Fulton) [Java] Deprecated modulemethodmodifiers pragma and replaced with a better %feature based directive called %javamethodmodifiers. A useful example would be for synchronisation in multi-threaded apps: %javamethodmodifiers foo(int a) "public synchronized"; Changes this function from the default ("public") to "public synchronized". *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/26/2002: beazley Several directives now allow optional configuration parameters. These include: %module(name="value", name="value", ...) modulename %import(name="value", ...) "filename.i" %extend(name="value", ...) classname { ... } These currently have no effect and are reserved for future expansion. 07/26/2002: beazley Enhancements to smart-pointer handling. SWIG only provides extra support for a smart-pointer if operator->() returns a proper pointer. For example: Foo *operator->(); If operator->() returns an object by value or reference, then SWIG examines the returned object to see if it also implements operator->(). If so, SWIG chases operator->() until it can find one that returns a pointer. This allows cases like this to work: class Foo { public: void blah(); }; class Bar { ... Foo *operator->(); ... }; class Spam { ... Bar operator->(); ... }; For example: >>> s = Spam() >>> s.blah() # Invokes Foo::blah() The s.blah() call actually invokes: ((s.operator->()).operator->())->blah(); 07/26/2002: beazley Fixed a bug with typedef and references. For example: typedef Foo & FooRef; FooRef blah(); Previous versions of SWIG generated code that wouldn't compile. 07/25/2002: beazley Wrapping of static methods has been improved in proxy classes. In older versions of SWIG, if you had this: class Foo { public: static void bar(); }; The static method was only available as a function Foo_bar(). For example: >>> Foo_bar() Now, the static method can also be invoked through an instance like this: >>> f = Foo() >>> f.bar() # Invokes static method This works with all versions of Python. Additionally, for Python-2.2, the static method can be invoked as: >>> Foo.bar() The old-style function is still support for backwards compatibility. If you care about making your code across different versions of Python, either use Foo_bar() or access the method through an instance. 07/25/2002: beazley Changes to the Python module. Proxy classes now utilize new Python-2.2 features including properties and static methods. However, these features are supported in a way that provides backwards compatibility with older Python versions. In other words, proxy classes work with all versions of Python and only use new features when running on Python-2.2. 07/25/2002: beazley Modified %extend so that overloaded methods can be added. For example: %extend Foo { void bar(int x) { }; void bar(char *s) { }; ... } This works with both C++ *and* C. 07/24/2002: cheetah (William Fulton) [Java] More new typemaps so that the Java proxy classes and type wrapper classes can be further tailored by users. These are the default code for generating the finalize() methods (proxy classes only) and the getCPtr() methods for proxy classes and type wrapper classes: %typemap(javafinalize) SWIGTYPE %{ protected void finalize() { _delete(); } %} %typemap(javagetcptr) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [] %{ public static long getCPtr($javaclassname obj) { return obj.swigCPtr; } %} The javagetcptr typemap will enable users to handle Java null by overriding this typemap - a requested feature. The -nofinalize commandline option has been deprecated. The javafinalize typemap is more powerful as it will allow the removal of the finalize methods for all or any one or more particular proxy class. 07/23/2002: cheetah (William Fulton) [Java] The getCPtrXXX() function has been changed to a static function and is now of the form: protected static long getCPtr(XXX obj) {...} This is a requested change which will allow Java null pointers to be used as null can be passed in for obj. However, to achieve this the appropriate code must be written using the new javagetcptr typemap directive. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** Backwards compatibility can be achieved by adding this function back in using the new javacode typemap: %typemap(javacode) SWIGTYPE %{ // SWIG-1.3.12 and SWIG-1.3.13 public long getCPtr$javaclassname() { return swigCPtr; } // SWIG-1.3.11 and earlier public long getCPtr() { return swigCPtr; } %} 07/23/2002: cheetah (William Fulton) [Java] New directive to control constant code generation - %javaconst. The default handling for handling constants is to get the value through a JNI call, eg #define YELLOW 5 #define BIG 1234LL results in: public final static int YELLOW = modulename.get_YELLOW(); public final static long BIG = modulename.get_BIG(); Earlier versions of the Java module initialised the value using the C value: public final static int YELLOW = 5; public final static long BIG = 1234LL; This works in most cases, but the value for BIG won't compile as 1234LL is not valid Java code and this is one of the reasons why the default is now to get the values through a JNI call. The side effect is that these 'constants' cannot be used in switch statements. The %javaconst directive allows one to specify the way the constant value is initialised and works like other %feature directives, eg %javaconst(0); // all constants from this point on are initialised using the C value %javaconst(1) BIG; // just BIG initialised using JNI call (must be parsed before BIG is defined) 07/23/2002: beazley *** IMPORTANT CHANGES TO THE PYTHON MODULE *** (1) The Python module now enables shadow/proxy classes by default. This means that two files are always created by SWIG. For instance, if you have this: // file: foo.i %module foo ... Then swig generates two files "foo_wrap.c" and "foo.py". (2) The name of the low-level C extension module has been changed to start with a leading underscore. This means that you have to compile the module as follows: $ cc -c -I/usr/local/include/python2.2 foo_wrap.c $ cc -shared foo_wrap.o $(OBJS) -o _foo.so ^^^^ note extra underscore This naming scheme is consistent with other Python modules that utilize extension code. For instance, the socket module consists of "_socket.so" and "socket.py". In previous versions of SWIG, the shared object file was named "foocmodule.so". (3) A new directive can be used to insert Python code into the corresponding .py file. For example: %pythoncode %{ def foo(): print "Hello World" %} This directive allows you to create modules as a mix of C and Python. Python code is seamlessly added to the module. (4) The -shadow command line option is deprecated. This is turned on by default. (5) To disable the generation of the extra python file, use the "-noproxy" command line option. *** POTENTIAL INCOMPATIBILITY *** This change will likely break the build environment of projects that utilize shadow classes. To fix this, you probably only need to change the name of the target .so file. For example, if you have Makefile information like this: TARGET = examplecmodule.so Just change it to: TARGET = _example.so *** DOCUMENTATION UPDATE *** The file Doc/Manual/Python.html has been updated to describe these changes. 07/23/2002: beazley Added -noextern option. If supplied, SWIG will not generate extra extern declarations. This is sometimes an issue on non-unix platforms. 07/23/2002: beazley Added a warning for ignored friend functions. 07/23/2002: beazley Fixed [ 574498 ] -proxy and %include "pointer.i" clash. Reported by David Creasy. 07/23/2002: beazley Fixed [ 576103 ] global destruction warning with shadow. Perl extensions should no longer report the warning "Use of uninitialized value during global destruction." when running with "perl -w". Reported by Brett Williams. 07/23/2002: beazley In C++ mode, SWIG now always defines namespace std. By default, it's empty. However, this will silence errors from programs that include statements such as "using namespace std;". This fixes Bug [ 584017 ] using namespace std generates error. Reported by Joseph Winston. 07/22/2002: beazley Added a new warning message for %apply. If you use %apply but no typemaps are defined, you will get a warning message. This should help with problems like this: %apply char *OUTPUT { ... }; In old versions of SWIG, this silently did nothing. Now you get an error like this: file:line. Warning. Can't apply (char *OUTPUT). No typemaps are defined. 07/22/2002: cheetah (William Fulton) [Java] Started Java pragma deprecation. Replacements use %typemap based directives and enable proxy classes and the new type wrapper classes to be tailored in various ways. These are the new typemaps: %typemap(javabase) - base (extends) for Java class %typemap(javaclassmodifiers) - class modifiers for the Java class: default is "public" %typemap(javacode) - java code is copied verbatim to the Java class %typemap(javaimports) - import statements for Java class %typemap(javainterfaces) - interfaces (extends) for Java class And these are the %pragma directives being deprecated: allshadowbase allshadowclassmodifiers allshadowcode allshadowimport allshadowinterface shadowbase shadowclassmodifiers shadowcode shadowimport shadowinterface Note that it is possible to target a particular proxy class: %typemap(javaimports) Foo "import java.util.*"; or a particular type wrapper class: %typemap(javaimports) double* "import java.math.*"; Note that $javaclassname in these typemaps are substituted with either the proxy classname when using proxy classes or the SWIGTYPE class name. 07/18/2002: cheetah (William Fulton) [Java] Java module overhaul to implement static type checking of all types. 1) Changes when using Java Proxy classes ---------------------------------------- Previously when wrapping global functions: class SomeClass{}; void foo(SomeClass* s); SomeClass* bar(); The native method prototypes used a long for pointers and looked like this: public class modulename { ... public final static native void foo(long jarg1); public final static native long bar(); } and unlike member functions of a C++ class there was no wrapper around the native calls to make the use of them more user friendly. They would be used from Java like this: SomeClass s = new SomeClass(modulename.bar(), false); modulename.foo(s.getCPtrSomeClass()); Note that the following will have the same effect, but then it would not have been possible to call any proxy member functions in SomeClass: long s = modulename.bar(); modulename.foo(s); Now wrapper functions are generated: public class modulename { public static void foo(SomeClass s) { // calls the native function } public static SomeClass bar() { // calls the native function } } Which means these functions can now be used more naturally with proxy classes: SomeClass s = modulename.bar(); modulename.foo(s); 2) Changes when not using Java Proxy classes -------------------------------------------- The so called low-level interface was rather low-level indeed. The new static type checking implementation makes it less so but it remains a functional interface to the C/C++ world. Proxy classes are the obvious way to use SWIG generated code, but for those who want a functional interface all non-primitive types now have a simple Java class wrapper around the C/C++ type. Pointers and references to primitive types are also wrapped by type wrapper classes. The type wrapper classnames are based on the SWIG descriptors used by the other language modules. For example: C/C++ type Java type wrapper class name ---------- ---------------------------- int* SWIGTYPE_p_int double** SWIGTYPE_p_p_double SomeClass* SWIGTYPE_p_SomeClass SomeClass& SWIGTYPE_p_SomeClass SomeClass SWIGTYPE_p_SomeClass Note that everything wrapped by SWIG is accessed via a pointer even when wrapping functions that pass by value or reference. So the previous example would now be used like this: SWIGTYPE_p_SomeClass s = example.bar(); example.foo(s); Note that typedefs that SWIG knows about are resolved, so that if one has class Foo{}; typedef Foo Bar; then any use of Bar will require one to use SWIGTYPE_p_Foo; Some considerations: Make sure you make a firm decision to use either proxy classes or the functional interface early on as the classnames are different. 3) Pointers and non-parsed types -------------------------------- Sometimes SWIG cannot generate a proxy class. This occurs when the definition of a type is not parsed by SWIG, but is then used as a variable or a parameter. For example, void foo(Snazzy sds); If SWIG has not parsed Snazzy it handles it simply as a pointer to a Snazzy. The Java module gives it a type wrapper class around the pointer and calls it SWIGTYPE_p_Snazzy. In other words it handles it in the same manner as types are handled in the low-level functional interface. This approach is used for all non-proxy classes, eg all pointer to pointers and pointers to primitive types. 4) Backwards compatibility ----------------------- Backwards compatibility is not an issue if you have been using proxy classes and no global variables/functions. Otherwise some changes will have to be made. The native methods still exist but they are now in a JNI class, which is called modulenameJNI. As this class is really part of the internal workings, it should not be required so the class has become protected. Some pragmas/directives will hopefully be added to help with backwards compatibility. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 07/18/2002: beazley Modified wrapping of uninstantiated templates returned by value. Just to be safe, they are now wrapped by SwigValueWrapper<> just in case they don't define a default constructor. This would be used if you had code like this Foo blah(); void moreblah(Foo x); but you didn't instantiate Foo using %template. We should probably add a warning for this. 07/17/2002: beazley Added an error check to detect shadowed template paramaters. For example: template class Foo { public: int T; }; This results in an error, not a warning. This warning is also needed to fix some rather insidious problems like this: struct T { int blah; }; template class Foo { public: typedef T Traits; // Which T is this???? }; In this case, the template parameter T shadows the outer structure (which is what you want). 07/16/2002: beazley Improved support for templates with integer arguments. SWIG is much more aware of situations such as this: const int Size = 100; %template(Foo100) Foo<100>; void bar(Foo *x); // Knows that Foo is the same as Foo<100>; 07/15/2002: beazley Fixed bug with %feature/%ignore/%rename and namespaces. For example: %ignore Foo::Bar namespace Foo { class Bar { ... }; } Reported by Marcelo Matus. 07/09/2002: beazley Added parsing support for constructors that try to catch exceptions in initializers. For example: class Foo { Bar b; public: Foo(int x) try : b(x) { ... } catch(int) { ... } } This has no effect on the generated wrappers. However, the try and catch parts of the declaration are ignored. See Stroustrup, 3rd Ed, section 14.4.6.1 for details. 07/06/2002: beazley Fixed bug in template symbol table management. This fixes two bugs. First, mixing abstract methods, templates, and inheritance no longer generates a failed assertion. template class A { public: virtual void foo() = 0; }; template class B : public A { }; %template(A_int) A; %template(B_int) B; This fix also fixes a subtle problem with default values and templates. For example: template struct B { typedef unsigned int size_type; static const size_type nindex = static_cast(-1); void foo(size_type index = nindex); }; Bugs reported by Marcelo Matus. 07/05/2002: ljohnson (Lyle Johnson) [Ruby] Changed the definition of the SWIG_ConvertPtr() function for the SWIG/Ruby runtime support so that it looks like the Python version. If the last argument (flags) is non-zero, SWIG_ConvertPtr() will raise an exception for type mismatches as before. If flags is zero, this function will return -1 for type mismatches without raising an exception. *** POTENTIAL INCOMPATIBILITY FOR RUBY MODULE *** 07/04/2002: beazley Overloaded functions/methods/constructors now work in many language modules. The support is completely transparent--just call the function normally and SWIG will dispatch to the correct implementation. There are a variety of issues associated with this. Please refer to the overloading section of Doc/Manual/SWIGPlus.html for details. *** NEW FEATURE *** 07/04/2002: beazley Fixed a bug with namespaces, enums, and templates. For example: namespace hello { enum Hello { Hi, Hola }; template struct traits { typedef double value_type; }; traits::value_type say_hi() { return traits::value_type(1); } } SWIG wasn't generating wrappers that properly qualified traits. Reported by Marcelo Matus. 06/30/2002: beazley Supplied array variable typemaps for Tcl module. If you have a variable like this: int foo[10]; then a set function like this is generated: void foo_set(int *x) { memmove(foo,x,10*sizeof(int)); } 06/30/2002: beazley New %fragment directive. When writing typemaps, it can be easy to get carried away and write a lot of code. However, doing so causes tremendous code bloat. A common way to solve this is to write helper functions. For example: %{ void some_helper_function() { ... } %} %typemap(in) type { some_helper_function(...); } The only problem with this is that the wrapper file gets polluted with helper functions even if they aren't used. To fix this, a new fragment directive is available. For example: (corrected typo in line below - 06/26/2008) %fragment("type_header","header") %{ void some_helper_function() { ... } %} %typemap(in, fragment="type_header") type { some_helper_function(...); } In this case, the code fragment is only emitted if the typemap is actually used. A similar capability is provided for declaration annotation and the %feature directive. For example: %feature("fragment","type_header") SomeDeclaration; The first argument to %fragment is the fragment name. The second argument is the file section where the fragment should be emitted. The primary use of this directive is for writers of language modules and advanced users wanting to streamline typemap code. *** EXPERIMENTAL NEW FEATURE *** 06/30/2002: beazley Supplied memberin typemaps for all arrays in an attempt to eliminate confusion about their use. 06/29/2002: beazley Experimental support for smart-pointers. When a class defines operator->() like this class Foo { ... Bar *operator->(); ... }; SWIG locates class Bar and tries to wrap its member variables and methods as part of Foo. For example, if Bar was defined like this: class Bar { public: int x; int spam(); }; You could do this (in the target language): f = Foo() f.x = 4 # Accesses Bar::x f.spam() # Accesses Bar::spam The primary use of this feature is to emulate the behavior of C++ smart-pointers---which allow attributes to accessed transparently through operator->. This feature is supported automatically in SWIG---no special directives are needed. To disable this behavior. Use %ignore to ignore operator->. *** NEW FEATURE *** 06/26/2002: beazley Deprecated the %except directive. %exception should be used instead. 06/25/2002: beazley Major cleanup of the modules directory. Eliminated most header files, consolidated module code into single files. 06/24/2002: beazley Reworked the instantiation of language modules. All language modules must now define a factory function similar to this: extern "C" Language * swig_python(void) { return new PYTHON(); } This function is then placed in a table and associated with a command line option in swigmain.cxx. This approach has a number of benefits. It decouples the SWIG main program from having to know about the class definitions for each module. Also, by using a factory function, it will be easier to implement dynamic loading of modules (simply load the file and invoke the factory function). 06/24/2002: beazley Fixed syntax error for reference conversions. For example: operator Foo &(); 06/24/2002: beazley Fixed syntax error for operator new[] and operator delete[]. 06/24/2002: beazley Fixed code generation problem for constants and default arguments involving templates. 06/19/2002: ljohnson (Lyle Johnson) [Ruby] Fixed a bug for the '-feature' command line argument; that setting was effectively being ignored and so the feature name was always set equal to the module name. 06/17/2002: beazley Fixed problems with static members and enums in templates. Version 1.3.13 (June 17, 2002) ============================== 06/16/2002: beazley Fixed a bug with __FILE__ expansion in the preprocessor. On Windows, the backslash (\) is now converted to (\\) in the string literal used for __FILE__. Reported by Steve Glaser. 06/14/2002: beazley Fixed warning message about 'name private in this context'. The warning is only generated for public methods. Reported by Scott Michel. 06/14/2002: beazley Fixed some problems related to template instantiation and namespaces. When SWIG expands a template, it does so with fully resolved types. For example, if you have this: template class foo { }; typedef double Double; %template(foo_d) foo; then, it is handled as foo in the typesystem. This fixes a number of subtle problems with inheritance and templates. 06/14/2002: ljohnson (Lyle Johnson) [Ruby] Added missing bool typemaps for INPUT, OUTPUT and INOUT in Lib/ruby/typemaps.i. 05/29/2002: cheetah (William Fulton) [Java] Fix for a couple of broken pragmas. 05/29/2002: cheetah (William Fulton) Fix for unnecessary cast when wrapping global variable where the type is not parsed by SWIG - Java variables example failure as reported by Larry Virden. 06/10/2002: beazley Modified %template to allow for empty instantiations. %template() foo; This registers foo with the type system, but doesn't wrap it (same as %ignore). This may only be a temporary measure. SWIG might be able to automatically instantiate templates in certain cases. 06/10/2002: beazley Fixed function prototype problems with Tcl 8.4 06/09/2002: beazley Fixed problem with templates and location of base classes. This one is a little mind-bending, but here is an example that illustrates: template struct traits { typedef ArgType arg_type; typedef ResType res_type; }; template struct Function { }; template struct Class : Function::arg_type, typename traits::res_type> { }; %template(traits_dd) traits ; %template(Function_dd) Function ; %template(Class_dd) Class ; In this example, the base class of 'Class' is determined from the Function template, but the types are obtained through typedefs. Because of this, SWIG could not locate the wrapped base class (Function). Should be fixed in 1.3.13 even though I can think of a million other things that might also be broken. 06/07/2002: beazley Fixed a problem with conversion operators. If you had an operator like this, operator double() const; SWIG was ommitting the "const" qualifier. This affected %rename and other directives. Reported by Zhong Ren. 06/07/2002: beazley Lessened the strictness of abstract class checking. If you have code like this: class Foo { public: virtual int method() = 0; }; class Bar : public Foo { public: Bar(); ~Bar(); }; SWIG will go ahead and generate constructor/destructors for Bar. However, it will also generate a warning message that "Bar" might be abstract (since method() isn't defined). In SWIG-1.3.12, SWIG refused to generate a constructor at all. 06/07/2002: beazley Change to %template directive. If you specify something like this: %template(vi) std::vector; It is *exactly* the same as this: namespace std { %template(vi) vector; } SWIG-1.3.12 tried to instantiate the template outside of the namespace using some trick. However, this was extremely problematic and full holes. This version is safer. 06/07/2002: beazley Fixed bug with scope qualification and templates. For example: A::DD Before, this was separated as scopes A, and DD. Fixed now. 06/06/2002: beazley Allow the following syntax: class A { }; struct B : A { ... }; A base class without a specifier is assumed to be public for a struct. 06/06/2002: beazley Fixed syntax error with template constructor initializers. Reported by Marcelo Matus. 06/06/2002: beazley Fixed bug with default template arguments. Reported by Marcelo Matus. 06/05/2002: beazley Fixed subtle problems with %rename directive and template expansion. Code like this should now work: %rename(blah) foo::method; ... template class foo { public: void method(); }; %template(whatever) foo; 06/05/2002: beazley Resolved some tricky issues of multi-pass compilation and and inheritance. The following situation now generates an error: class Foo : public Bar { ... }; class Bar { ... }; The following code generates a warning about incomplete classes. class Bar; class Foo : public Bar { }; The following code generates a warning about an undefined class. class Foo : public Bar { }; // Bar undefined This fixes a failed assertion bug reported by Jason Stewart. 06/05/2002: ljohnson [Ruby] Added a warning message for the Ruby module about the lack of support for multiple inheritance. Only the first base class listed is used and the others are ignored. (Reported by Craig Files). 06/03/2002: beazley Fixed a bug with struct declarations and typedef. For example: typedef struct Foo Foo; struct Foo { ... }; A few other subtle struct related typing problems were also resolved. Version 1.3.12 (June 2, 2002) ============================= 05/30/2002: beazley Fixed problem related to forward template class declarations and namespaces. Bug reported by Marcelo Matus. 05/30/2002: beazley Added 'make uninstall' target. Contributed by Joel Reed. 05/29/2002: beazley Fixed rather insidious bug with %rename, %feature and template specialization. For example: %exception vector::__getitem__ { ... some exception ... } template class vector { ... T __getitem__(int index); // Fine ... }; template<> class vector { ... T __getitem__(int index); // Oops. ... }; Now, the %exception directive (and other features) should correctly apply to both vector and specializations. 05/29/2002: beazley Subtle changes to %template() directive. Template arguments are now reduced to primitive types in template matching. For example: template class vector { ... partial specialization ... } typedef int *IntPtr; // Gross typedef // Gets the above partial specialization %template(vectorIntPtr) vector; This change is extremely subtle, but it fixes a number of potential holes in Luigi's STL library modules. For example: typedef int Integer; %template(vectori) vector; 05/29/2002: beazley Fixed rather insidious typemap bug related to const. const was being discarded through typedefs. 05/29/2002: ljohnson (Lyle Johnson) [Ruby] Added input typemaps for const references to primitive types (in Lib/ruby/ruby.swg). 05/29/2002: cheetah (William Fulton) [Java] The java arrray support functions are enclosed by a SWIG_NOARRAYS #define. Useful if not using arrays and it is desirable to minimise the amount of compiled code. 05/29/2002: cheetah (William Fulton) [Java] Enums were not renamed when using %name or %rename fix. 05/28/2002: ljohnson [Ruby] Modified the name of the wrapper functions for the "new" singleton method and "initialize" instance method for consistency with the other language modules. The wrapper name for the function that implements "new" is alloc_classname and the wrapper name for the function that implements "initialize" is new_classname. 05/27/2002: beazley Changes to runtime. Pointer conversion/creation functions now almost always have an extra "flags" argument. For example: SWIG_ConvertPtr(obj, void **, swig_type_info *ty, int flags); ^^^^^^^^^^ This extra parameter is reserved for future expansion and will be used for more control over pointers in future versions. 05/27/2002: beazley Fix for C++ classes with private assignment operators. It is now possible to safely return objects like this by value. Caveat: the class must provide a copy constructor. 05/26/2002: beazley -proxy option added to many language modules. This is the same as -shadow. We are merely changing terminology. 05/26/2002: beazley [perl] Fixed some inconsistencies in the -package option. -package merely sets the package name to be used on the wrappers. It does not change the name of the shared library file or the name of the generated .pm file. This was broken at some point, but works again now. 05/25/2002: beazley [perl] Fixed [ 475452 ] memory leak in return-by-value. Problem related to static member variables returning newly allocated objects. Reported by Roy Lecates. 05/25/2002: beazley [perl] Fixed [ 513134 ] %BLESSEDMEMBERS isn't always right. Reported by Fleur Diana Dragan. 05/25/2002: beazley Fixed [ 540735 ] -importall and the -I option. 05/25/2002: beazley [guile] Fixed [ 532723 ] Default arg for char* can SegV. Error in guile module. Reported by Brett Williams. 05/25/2002: beazley Subtle change to typemap application code. The "freearg" typemap must exactly match up with the "in" or "ignore" typemap. For example: %typemap(in) (char *data, int len) { ... }; %typemap(freearg) char *data { ... }; void foo(char *data, int len); In this case, the "in" typemap is applied, but the freearg typemap is not. This is because the freearg typemap doesn't match up with the input argument sequence. 05/25/2002: beazley Fixed [ 548272 ] Default argument code missing braces. Reported by Brett Williams. 05/25/2002: beazley Fixed [ 547730 ] SwigValueWrapper needed for constructors. Reported by William Fulton. 05/25/2002: beazley Undefined identifiers now evaluate to 0 when evaluating preprocessor expressions. For example: #if !FOO ... #endif where FOO is undefined or set to some non-numeric value. Fixes [ 540868 ] #if defined whatever - not parsed. Reported by Adam Hupp. 05/24/2002: beazley SWIG now ignores the C++ 'export' keyword. 05/23/2002: beazley Some refinement of type-name mangling to account for pointers, arrays, references, and other embedded type constructs. 05/23/2002: beazley Initial attempt at supporting template partial specialization. At the very least, it is parsed and the classes are stored. Matching of instantiations to specialized version is more limited and based on the SWIG default typemap rules: SWIGTYPE * SWIGTYPE [] SWIGTYPE & Now, why in the world would you want to use this feature? Other than allowing for slightly modified class APIs, this capability is primarily used to provide advanced wrapping support for STL-like objects. It can also be mixed with typemaps. Here is an example: /* Generic version */ template class vector { %typemap(in) vector * { // A container of objects } }; /* Partial specialization (pointers) */ template class vector { %typemap(in) vector * { // A container of pointers to objects. } }; /* Specialization (integers). */ template<> class vector { %typemap(in) vector * { // A container of integers. } }; *** EXPERIMENTAL FEATURE *** 05/23/2002: beazley Enhancement to typemaps. Normally, typemap variables are renamed to avoid conflicts. For example: %typemap(in) int * (int temp) { $1 = &temp; } This results in code that creates and uses variables "temp1","temp2", "temp3" and so forth depending on how many times the typemap is used. Sometimes you want a single variable instead. To do that, using the following naming scheme: %typemap(in) int *(int _global_temp) { } Is this case, a single variable _global_temp is emitted in the wrapper functions. It is shared across all typemaps. Repeated typemaps do not replicate the variable---they use the first one emitted. *** NEW FEATURE *** 05/23/2002: beazley Minor enhancement to typemaps. If you have this code, %typemap(in) Foo (int somevar = 3) { ... } the default value for somevar is now emitted into the wrapper code. 05/22/2002: beazley Fixed %extend to be better behaved in namespaces. If you have code like this: namespace foo { struct bar { %extend { void blah(); }; }; } SWIG matches the blah() method to a C function named void foo_bar_blah(foo::bar *self). This is consistent with the non-namespace version. Bug reported by Marcelo Matus. 05/22/2002: beazley New library files: cpointer.i, carrays.i, cmalloc.i. These provide access to C pointers and memory allocation functions. See Doc/Manual/Library.html for details. 05/22/2002: cheetah (William Fulton) [Java] C type char no longer maps to Java type byte, but to Java type char. It is now treated as a character rather than a signed number. This fits in with the other language modules and is a more natural mapping as char* is mapped as a string of characters. Note that the C signed char type is still mapped to a Java byte. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/22/2002: cheetah (William Fulton) [Java] Improved constants wrapping. Constants (#define and %constant) values are now obtained through a JNI call. Previously the value was compiled as Java code, but this didn't work for all cases, eg #define 123ULL. 05/22/2002: beazley Fixed bogus error message with %extend directive and C++ access specifiers. Reported by Marcelo Matus. 05/22/2002: beazley Namespaces and enums now work correctly. For example: namespace Foo { enum Bar { A, B }; } Bug reported by Marcelo Matus. 05/21/2002: beazley The %types directive can now be used to specify inheritance relationships in the runtime type system. For example, %types(Foo = Bar); specifies that Foo isa Bar. Using this is potentially quite dangerous. However, this is useful in certain cases (and in the SWIG library). 05/20/2002: beazley %nodefault and %makedefault directives now require a trailing semicolon. For example: %nodefault; ... %makedefault; In addition both directives can take a class name. For example: %nodefault Foo; class Foo { /* No default constructor/destructor */ }; class Bar { /* Default constructor/destructor generated */ }; *** POTENTIAL INCOMPATIBILITY *** If you don't use the trailing semicolon, things will mysteriously break. 05/20/2002: beazley More improvements to type system handling. SWIG now correctly handles template names and parameters in a namespace. For example: namespace foo { template class bar { }; typedef int Integer; void blah(bar *x); }; In the generated code, all of the typenames are properly qualified. 05/17/2002: cheetah (William Fulton) [Java] deprecated broken -jnic and -jnicpp commandline options. The C or C++ JNI calling convention is now determined from the -c++ commandline option. 05/16/2002: cheetah (William Fulton) [Java] The JCALL macros which exist so that the same typemaps can be used for generating both the C and C++ JNI calling conventions no longer appear in the generated code. This is because the output is now passed through the SWIG preprocessor which does the macro expansion for either C or C++ (depending on whether -c++ is passed on the SWIG commandline). The generation of the functions used in the array typemaps have been adjusted to take account of this. The side effect is that any typemaps which contained JCALL macros within %{ %} brackets will have to be moved within {} brackets so that the SWIG preprocessor can expand the macros. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 05/13/2002: beazley Class templates may now be used as template parameters. For example: template class C> class Foo { ... }; template class Bar { ... }; %template(Fooi) Foo; SWIG doesn't really do anything special with this---it's just another way of specifying a template parameter. 05/13/2002: beazley Minor refinement of template support. Template parameter names are no longer required for types. For example: template class Foo { }; Obviously, names are required for template; 05/12/2002: beazley New macro expansion in typemaps. The sequence: $descriptor(type) Will expand into the SWIG type descriptor structor for the given type. Type may be any abstract datatype. For example: $descriptor(int *) $descriptor(int (*)(int,double)) $descriptor(vector *) Caveat: It is *NOT* currently legal to use other typemap substitution variables in the macro. For example $descriptor($1_type). The primary purpose of this modification is to better support typemaps for container objects or to allow typemaps that might be performing type conversions. *** NEW FEATURE *** 05/11/2002: beazley The wrapping of references to primitive types has been changed as follows: Arguments of type 'const primitive &' are now passed by value as opposed to pointers. Return values of type 'const primitive &' are returned as values instead of pointers. 'primitive' is any one of int, short, long, long long, char, float, double, bool (as well as unsigned variants). This change is being made to better support C++ wrapping--especially code that makes use of templates and the STL. 05/11/2002: beazley The %template directive can now be used to access templates in a namespace. For example: namespace std { template class complex { T re, im; public: complex(T _r = T(), T _i = T()) : re(_r), im(_i) { } T real() { return re; } T imag() { return im; } }; } %template(complex) std::complex; Note: There are some very subtle namespace/symbol table management issues involved in the implementation of this. It may not work in certain cases. 05/10/2002: beazley Member template constructor support added. For example: template struct pair { _T1 first; _T2 second; pair() : first(_T1()), second(_T2()) { } template pair(const pair<_U1,_U2> &x); }; To instantiate the template, use %template and %extend. For example, this expands the constructor into a default copy constructor: %extend pair { %template(pair) pair<_T1,_T2>; } Highly experimental. Other uses may be broken. 05/10/2002: beazley The %extend (%addmethods) directive no longer works unless it appears in the public section of a class. An error message is now generated (as opposed to a segmentation fault). 05/09/2002: beazley New %warnfilter() directive. This directive attaches a warning filter to specific declarations and has the same semantics as %rename, %ignore, %feature, and so forth. For example: %warnfilter(501) foo; // Suppress overloaded warning int foo(int); int foo(double); or %warnfilter(501) Object::foo(double); class Object { public: int foo(int); int foo(double); }; This feature only suppresses warnings in later stages of code generation. It does not suppress warnings related to preprocessing or parsing. *** NEW FEATURE *** 05/09/2002: beazley SWIG now supports C99 variadic preprocessor macros. For example: #define debugf(fmt,...) fprintf(stderr,fmt,__VA_ARGS__) The argument "..." is used to indicate variable arguments which are all placed into the special argument name __VA_ARGS__ in the macro expansion. SWIG also implements the GNU (##) extension for swallowing the preceding comma when __VA_ARGS__ is empty. For example: #define debugf(fmt,...) fprintf(stderr,fmt, ##__VA_ARGS__) Here is how this is expanded: debugf("%d", 3) --> fprintf(stderr,"%d",3) debugf("Hello") --> fprintf(stderr,"Hello" ) (notice the deleted comma). *** NEW FEATURE *** 05/08/2002: samjam (Sam Liddicott) Many changes to php module. Shadow classes are now implemented entirely in native C and no need for php-code shadow wrappers Populated template config.m4 and Makefile.in as needed by phpize are generated. 05/08/2002: ljohnson (Lyle Johnson) [Ruby] A copy constructor is now turned into a "clone" instance method (see Dave's change for copy constructors dated 4/7/2002). This seems like the appropriate thing to do for Ruby code. 05/08/2002: ljohnson (Lyle Johnson) [Ruby] Fixed [ 553864 ] Inline destructor code not written. 05/08/2002: beazley %ignore behaves better with constructors, destructors, and the type system in general. For constructors and destructors, %ignore now suppresses the creation of a default constructor or destructor. For example: %ignore ~Foo; class Foo { public: Foo(); ~Foo(); ... }; In SWIG-1.3.11, ~Foo() simply "disappeared" and the code generator created a wrapper for a default destructor (as if it was never declared in the interface). In SWIG-1.3.12, %ignore suppresses the creation of a destructor if one is actually defined. Similarly, even though a declaration is ignored, information may still be needed to properly handle types. For example, here is a very subtle error that is fixed by this change: %ignore std::string; // Prevent class wrapping namespace std { class string { ... }; %typemap(in) string * { ... } } void foo(std::string *s); // Broken. Before this fix, %ignore would cause the class definition to disappear. This, in turn, would cause the typemap to be misapplied. 05/08/2002: beazley Minor changes to %rename, %ignore, %feature, and related directives for better support of destructors. Destructors can now be precisely tagged. For example: %ignore Foo::~Foo; %feature("action") ~Bar { ... } *Developer warning* Operations such as renaming and feature attachment for classes used to be applied to destructors as well. For instance, if you did this: %rename(Bar) Foo; The operation applied to the class itself, the constructor, and the destructor. This is no longer the case. Now such operations will only apply to the class and the constructor. Note: if you were relying on this for class renaming, be aware that renamed classes should really only be handled at the level of the class itself and not the level of individual declarations in the class (although they can be renamed individually if needed). As far as I know, the Language class is already taking care of this case correctly. 05/07/2002: beazley New set of tests. The Examples/test-suite/errors directory contains tests that try to exercise all of SWIG's error and warning messages. 05/07/2002: beazley Start of a warning framework. Warning messages are now assigned numeric values that are shown in warning messages. These can be suppressed using the -w option. For example: swig -w302 example.i swig -w302,305 example.i Alternatively, the #pragma preprocessor directive can be used to disable this: #pragma SWIG nowarn=302 #pragma SWIG nowarn=302,305 Note: Since SWIG is a multi-pass compiler, this pragma should only be used to change global settings of the warning filter. It should not be used to selectively enable/disable warnings in an interface file. The handling of #pragma occurs in the C++ preprocoessor and affects all subsequent stages of compilation. The -Wall option turns on all warnings and overrides any filters that might have been set. Warnings can be issued from an interface using %warn. For example: %warn "110:%section is deprecated" The first part of a warning message is an optional warning number. A complete set of warning numbers is found in Source/Include/swigwarn.h. *** NEW FEATURE *** 05/07/2002: beazley Internal parsing change. Directives to include files now use brackets [ ... ] instead of { ... }. %includefile "foo.i" [ ... ] The use of { ... } was a bad choice because they were included implicitly by the preprocessor and made it impossible to properly detect legitimate missing '}' errors. 04/16/2002- 05/02/2002: beazley SWIG European Tour: Paris-Amsterdam-Bath. 04/23/2002: beazley The %addmethods directive has been renamed to %extend. For example: class Foo { ... }; %extend Foo { int blah() { ... }; int bar() { ... }; ... }; Motivation: the %addmethods directive can be used for many other tasks including adding synthesized attributes, constructors, and typemaps. Because of this, "addmethods" is somewhat misleading. %extend more precisely describes this operation---extension of a class or structure. *** POTENTIAL INCOMPATIBILITY *** %addmethods still works via a macro definition. However, a warning message may be generated. Errors involving %addmethods will actually refer to the %extend directive. 04/23/2002: beazley Further refinement of the type system. Typedef now propagates through functions, pointers to functions, and pointers to member functions. For example: typedef int Integer; void foo(int (*x)(int), Integer (*y)(Integer)); In this case, arguments 'x' and 'y' have exactly the same type (and would obviously accept objects of either type). Similarly, consider this: class Foo { }; typedef Foo Bar; void bar(int (Foo::*x)(int), int (Bar::*y)(int)); In this case, arguments x and y are the same type (via typedef). 04/22/2002: beazley SWIG now generates a warning message if any part of an expression involves values from a private part of a class. For example: class Foo { private: static int X; public: void blah(int a, int b = X); // Warning }; In this case, the default argument is ignored. There are workarounds, but they are rather clumsy. For instance, you might do this: %feature("action") blah(int,int) { if ($nargs == 1) { result = blah(arg1); } else { result = blah(arg1,arg2); } } void blah(int a, int b = 0); 04/21/2002: beazley Use of the %inline directive inside a namespace is forbidden and now generates an error message. This is not allowed since the inlined code that is emitted is not placed inside a namespace. This confuses other stages of parsing. 04/21/2002: beazley Some bug fixes to casting operations and expression parsing. Due to some parsing issues, it is not currently possible to use casts for all possible datatypes. However, the common cases work. 04/20/2002: beazley (Amsterdam) Member templates now work. Simply use the %template directive inside a class or %addmethods to create instantiations (see Doc/Manual/SWIGPlus.html). Supporting this was easy---earlier changes to templates made it possible using only a two-line modification to the parser and a few minor modifications elsewhere. Hmmm, come to think of it, the smoke was rather thick in that Internet "cafe". *** NEW FEATURE *** 04/19/2002: beazley (TGV) Improved handling of non-type template parameters. For example: vector; Simple numbers and strings can be used with the %template directive as well. For example: %template(vecint100) vector; Note: Arithmetic expressions are not currently allowed. Default template arguments now work and do not have to be given to %template. 04/18/2002: beazley (Paris) Change in internal template handling. Template parameters are now fully integrated into the type system and are aware of typedefs, etc. This builds upon the change below. *** DEVELOPER WARNING *** Word of caution to language module writers. The "name" parameter of certain parse tree nodes (classes, functions, etc.) may be parameterized with types. This parameterization is done using SWIG type-strings and not the underlying C version. For example, int max(int *,int *) has a name of "max<(p.int)>". If you use the name directly, you may get syntax errors in the generated code. To fix this, use SwigType_namestr(name) to convert a parameterized name to a C name with valid syntax. The internal version is used to reduce template types to a common representation and to handle issues of typedef. 04/16/2002: beazley (somewhere over the Atlantic) Enhancement of typedef resolution. The type system is now aware of template arguments and typedef. For example: typedef int Integer; foo(vector *x, vector *y); In this case, vector and vector are the same type. There is some interaction between this mechanism and the implementation of typemaps. For example, a typemap defined for vector * would apply to either type. However, a typemap for vector * would only apply to that type. Typedefs and typemaps and matched by left-most expansion. For example: vector --> vector --> vector 04/24/2002: cheetah (William Fulton) [Java] Changes to Java shadow classes. Overcomes a bug where the module assumed that a pointer to a derived class could be used in place of a pointer to a base class. Thanks to Stephen McCaul for analysing the bug and submitting patches. A consequence is that the getCPtr() method in each shadow class has disappeared and has been replaced with a getCPtrXXX(), where XXX is the shadow class name. If you have code that previously used getCPtr(), and the associated class is wrapping a C struct or a C++ class that is not involved in an inheritance chain, just use the new method. If however, the class is involved in an inheritance chain, you'll have to choose which pointer you really want. Backwards compatibility has been broken as not using the correct pointer can lead to weird bugs through ill-defined behaviour. If you are sure you want the old methods, you could add them back into all shadow classes by adding this at the beginning of your interface file: %pragma(java) allshadowcode=%{ public long getCPtr(){ return swigCPtr; } %} Please see entry dated 07/23/2002 to see how to do this after the deprecation of the allshadowcode pragma. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 04/13/2002: beazley Fixed problem with default arguments and references. Declarations such as this should now work: void foo(const string &x = "Hello"); 04/12/2002: beazley Added typemap $* substitutions for typemaps involving arrays. Requested by William Fulton. 04/11/2002: beazley Template specialization is now supported. For example: template<> class vector { ... }; When the %template directive is used, it will use a specialization if one is defined. There are still some limitations. Partial specialization is not supported. A template of type does not match all pointers. *** NEW FEATURE *** 04/11/2002: beazley Major change to template wrapping internals. Template declarations are no longer processed as macros but now result in real parse-tree nodes. The %template directive expands these nodes into a specific instantiation. This change enables a number of new and interesting capabilities: Directives such as %rename, %feature, and %addmethods can now be applied to uninstantiated templates. For example: %rename(barsize) vector::bar(char *buf, int len); ... template class vector { public: ... void bar(char *buf); void bar(char *buf, int len); // Renamed ... }; %template(intvector) vector; // Renaming carries through By parsing templates into an internal data structure, it will be possible to support specialization (and maybe partial specialization). This is highly experimental and a work in progress. *** POTENTIAL INCOMPATIBILITY *** In SWIG-1.3.11, template declarations were simply processed as weird macros. No other information was retained. This made it impossible to support more advanced features and complicated many other parts of the implementation. 04/09/2002: beazley Change to template class wrapping. There were a variety of "issues" with the old approach related to parsing, the type system, and namespaces. These changes are meant to rectify some of these problems: A specific instantiation of a template can now be specified by including the class inline like this: class vector { public: vector(); ~vector(); ... whatever ... }; This is template specialization, but partial specialization is not yet implemented. The %template directive has been modified to expand roughly as follows: %template(vecint) vector; becomes %rename(vecint> vector; class vector { public: vector(); ... }; Note that this simply builds upon the code above (templates included inline). This modified approach to wrapping fixes some subtle type issues. For instance, you can now define typemaps and typedefs like this: %typemap(in) vector * { ... } typedef vector intvector; ... void blah(intvector *v); // Gets the above typemap This did not work in SWIG-1.3.11 due to a peculiarity of the template implementation. %template(name) no longer installs the template as a class with name "name". This might break %addmethods as described in the manual. For example: %template(vecint) vector; %addmethods vecint { // Fails. vecint not a class ... }; To fix this, just use the template name instead: %addmethods vector { ... } Note: This technique might be a way to implement some bizarre template specialization techniques. For example: %addmethods vector { // Only applied if vector instantiated later %typemap(in) vector * { ... } ... }; *** POTENTIAL INCOMPATIBILITY *** 04/08/2002: beazley Fixed [ 540868 ] #if defined whatever - not parsed. SWIG should now correctly handle preprocessor directives like this: #if defined __cplusplus ... #endif Note: was implemented previously, but there was a minor bug. Reported by Adam Hupp. 04/07/2002: beazley %readonly and %readwrite are deprecated due to a change in the implementation. Instead of being pragmas, mutability is now controlled as a "feature" using the following two directives: %immutable; int x; // read-only variable int y; // read-only variable %mutable; int z; // Modifiable %immutable and %mutable are much more powerful than their older counterparts. They can now pinpoint a specific declaration like this: %immutable x; /* Any x */ %immutable Foo::x; /* x in class Foo */ In fact, the matching algorithm is the same as for %rename, %ignore, and other directives. This means that the declaration %immutable Foo::x; would not only apply to class Foo but to all derived classes as well. *** POTENTIAL INCOMPATIBILITY *** %immutable and %mutable must be terminated by a semi-colon. This differs slightly from the older %readonly and %readwrite directives. Since %immutable and %mutable can be applied to declarations the semicolon is needed to distinguish between a global feature and one targeted to a single declaration. Note: this incompatibility is the primary reason for changing the name of the directive. 04/07/2002: beazley New handling of copy constructors. If a class defines constructors like this: class Foo { public: Foo(); Foo(const Foo &); // Copy constructor ... }; SWIG now generates a function copy_Foo() for the copy constructor. In previous verions, this generated a name-clash and an error message. To preserve backwards compatibility, SWIG does not change the behavior if %rename is used to resolve the name conflict. However, if no name resolution is made, this new approach is used. Copy constructors may be handled as a special case in the target language. However, this is up to the language module itself. 04/07/2002: beazley The %template directive is now namespace aware. This allows code like this: namespace foo { template max(T a, T b) { return a > b ? a : b; } } using namespace foo; %template(maxint) max; // Ok namespace bar { using foo::max; %template(maxdouble) max; // Ok } Caveat: the template name supplied to %template must be defined in the same scope in which the %template directive appears. This code is illegal: %template(maxint) foo::max; 04/07/2002: beazley Minor enhancement to preprocessor. The preprocessor can now perform string comparison. For example: #define A "hello" ... #if A == "hello" ... #endif The primary use of this is in SWIG macros. For example: %define FOO(x) #if #x == "int" /* Special handling for int */ ... #endif %enddef Normal users can probably safely ignore this feature. However, it may be used in parts of the SWIG library. 04/07/2002: beazley Further refinement of default constructor/destructor wrapper generation. SWIG is now much more aware of pure virtual methods. For instance: class A { /* Abstract */ public: virtual void method1() = 0; virtual void method2() = 0; }; class B : public A { /* Abstract */ public: virtual void method1() { }; }; class C : public B { /* Ok */ public: virtual void method2() { }; }; In this case, SWIG will only generate default constructors for C. Even though B looks fine, it's missing a required method and is abstract. 04/04/2002: beazley Subtle change to structure data member access. If you have a structure like this: struct Foo { Bar b; }; The accessor functions for b are generated as follows: (1) If b is *not* defined as a structure or class: Bar Foo_b_get(Foo *self) { return self->b; } void Foo_b_set(Foo *self, Bar value) { self->b = value; } (2) If b *is* defined as a structure or class: Bar *Foo_b_get(Foo *self) { return &self->b; } void Foo_b_set(Foo *self, Bar *value) { self->b = *value; } See the "Structure data members" section of Doc/Manual/SWIG.html for further details. *** POTENTIAL INCOMPATIBILITY *** This may break interfaces that relied on a lot of a undeclared structure and class names. To get the old behavior, simply use a forward declaration such as "struct Bar;" 04/04/2002: beazley C++ namespace support added. SWIG supports all aspects of namespaces including namespace, using, and namespace alias declarations. The default behavior of SWIG is to flatten namespaces in the target language. However, namespaces are fully supported at the C++ level and in the type system. See Doc/Manual/SWIGPlus.html for details on the implementation. 04/02/2002: cheetah (William Fulton) [Java] Sun has modified javac in jdk1.4 to no longer compile an import of an unnamed namespace. To fix this SWIG no longer generates the import for packageless classes. http://developer.java.sun.com/developer/bugParade/bugs/4361575.html As reported SF #538415. 03/27/2002: ljohnson (Lyle Johnson) [Ruby] Added support for pointer-to-member, similar to that for the Python module. Remarkably similar. Also added a new example for this (Examples/ruby/mpointer), which is remarkably similar to the Python example of the same name. 03/26/2002: ljohnson (Lyle Johnson) [Ruby] Made a few minor edits to the "Advanced Topics" chapter of the SWIG manual and added a new major section about how to create multi-module Ruby packages with SWIG. 03/26/2002: ljohnson (Lyle Johnson) [Ruby] Removed all of the old Ruby pragmas. If any of this functionality is truly missed we can resurrect it, preferably with some kind of feature-based directive. 03/25/2002: ljohnson (Lyle Johnson) [Ruby] Fixed SWIG exception library support for Ruby, which has apparently been broken for some time. Luckily, no one seems to have noticed. 03/23/2002: beazley C++-namespace support in SWIG directives. %addmethods: The %addmethods directive now accepts a fully qualified classname and can be used inside C++ namespace declarations. For example: // Attaches to the class Foo::Bar below %addmethods Foo::Bar { int somemethod() { ... } }; namespace Foo { class Bar { public: ... }; // Attaches to the class Bar above %addmethods Bar { int othermethod() { ... }; } } %feature, %rename, %ignore, %exception, and related directives: Namespaces are fully integrated into the renaming and declaration matcher. For example: %rename(display) Foo::print; // Rename in namespace Foo %ignore Foo::Bar::blah; // Ignore a declaration %rename directives can be placed inside namespace blocks as well. For example: namespace Foo { %rename(display) print; // Applies to print below void print(); }; Most other SWIG directives should work properly inside namespaces. No other changes are needed. 03/22/2002: beazley Some changes to internal symbol table handling. SWIG no longer manages structures and unions in a separate namespace than normal declarations like ANSI C. This means you can't have a structure with the same name as a function. For example: struct Foo { ... } int Foo() { ... } This approach is more like C++. It's not clear that SWIG ever really supported the ANSI C anyways---using the same name would almost certainly generate a name-clash in the target language. 03/22/2002: ljohnson (Lyle Johnson) [Ruby] Fixed [ 517302 ] for handling of renamed overloaded constructors. Now, renamed overloaded constructors are converted into class singleton methods (basically acting as "factory" methods). 03/21/2002: beazley Fixed [ 532957 ] %ignore parse error and casting operator. Reported by William Fulton. 03/18/2002: beazley (** ADVANCED USERS ONLY **) Added support for dynamic casting in return values. A somewhat common problem in certain C++ programs is functions that hide the identity of underlying objects when they are returned from methods and functions. For example, a program might include some generic method like this: Node *getNode(); However, Node * may just be base class to a whole hierarchy of different objects. Instead of returning this generic Node *, it might be nice to automatically downcast the object into the appropriate type using some kind dynamic cast. Assuming you understand the peril involved, a downcast can now be performed using the following function in the run-time type checker: swig_type_info *SWIG_TypeDynamicCast(swig_type_info *, void **ptr); This function checks to see if the type can be converted to another type. If so, a different type descriptor (for the converted type) is returned. This type descriptor would then be used to create a pointer in the target language. To use this, you would write a typemap similar to this: %typemap(out) Node * { swig_type_info *ty = SWIG_TypeDynamicCast($1_descriptor, (void **) &$1); $result = SWIG_NewPointerObj($1, ty); } Alternatively, %typemap(out) Node * = SWIGTYPE *DYNAMIC; To make the typemap have any effect, you have to write a supporting function that knows how to perform downcasting. For example: %{ static swig_type_info * Node_dynamic_cast(void **ptr) { Node **nptr = (Node **) ptr; Element *e = dynamic_cast(*nptr); if (e) { *ptr = (void *) e; return SWIGTYPE_p_Element; } Data *d = dynamic_cast(*nptr); if (d) { *ptr = (void *) d; return SWIGTYPE_p_Data; } return 0; } %} There is no restriction on how types are determined. dynamic_cast<> uses C++ RTTI. However, if you had some other mechanism for determining the type, you could use that here. Note: it is important to save the new pointer value back into the argument as shown. When downcasting, the value of the pointer could change. Finally, to make the casting function available, you have to register it with the run-time type checker. Put this macro in your interface file. DYNAMIC_CAST(SWIGTYPE_p_Node, Node_dynamic_cast); Note: this feature does not introduce a performance penalty on normal SWIG operation. The feature is only enabled by writing a new typemap that explicitly calls SWIG_TypeDynamicCast() to make a conversion. Examples/test-suite/dynamic_cast.i contains a simple example. This feature is not supported in the Java module due to differences in the type-checking implementation. *** EXPERIMENTAL FEATURE *** 03/17/2002: beazley Small change to type-name handling of unnamed structures and typedef. If a structure of this form appears: typedef struct { ... } Foo; Then 'Foo' is used as the proper typename for the structure. Furthermore, Foo can now be used as a name in C++ inheritance. SWIG was already kind of doing this, but this modification refines the implementation to more closely follow the C++ ARM, section 7.1.3, p. 106. This fixes a couple of obscure corner cases. 03/16/2002: beazley Modified C++ inheritance with a few enhancements. First, type information needed for casting and type-equivalence is generated even when base-classes aren't defined in the interface. For example: class Foo : public Bar { /* Bar unspecified */ public: ... }; void blah(Bar *b); In this case, the blah() function still accepts Foo * even though nothing is really known about Bar. Previous SWIG versions would just generate a type error. Inheritance has also been modified to work through typedef. For example: class Bar { }; typedef Bar OtherBar; class Foo: public OtherBar { } In this case, the base class of OtherBar is correctly resolved back to Bar. The use of the name OtherBar is lost in this resolution (the wrappers will simply use Bar instead of the typedef name OtherBar). 03/13/2002: beazley %typemap, %apply, and related directives can now appear inside class definitions. 03/13/2002: beazley Fixed a variety of problems related to compiling SWIG on 64-bit platforms. 03/12/2002: beazley Fixed problem with "ignore" and "in" typemaps. Local variables associated with "in" were being added to the wrapper function even though they were never used. Mostly harmless, but it would lead to a variety of compilation warnings. 03/12/2002: beazley Some changes to the internal type system and handling of nested C++ types. In previous versions of SWIG, if you had the following: class Foo { public: typedef int Blah; }; class Bar : public Foo { public: void somemethod(Blah x); }; The argument type in somemethod() would implicitly be set to Bar::Blah. Although this is technically allowed, it breaks typemaps. For example: %typemap(in) Foo::Blah { ... } doesn't match like you expect. This has been changed in SWIG-1.3.12. Now, types are expanded using the class in which they were defined. So, the argument type in somemethod() will be Foo::Blah---since the type Blah was defined in Foo. 03/10/2002: beazley Fixed some subtle type scoping problems with typedef and C++ classes. For example: typedef int Blah; class Bar { public: typedef double Blah; void foo(Blah x, ::Blah y); ... } 03/10/2002: beazley Highly experimental change to handle variable length arguments. First, there is no portable or reliable way to wrap a varargs function in full generality. However, you *can* change the function signature using %varargs. %varargs(char *) fprintf; ... void fprintf(FILE *f, char *fmt, ...); In this case, the variable length parameter "..." is simply replaced by the parameters given in %varargs. This results in a function like this: void fprintf(FILE *f, char *fmt, char *s); More than one argument can be used and default values can be defined. For example, this code specifies a maximum of four arguments. %varargs(char *x1 = 0, char *x2 = 0, char *x3 = 0, char *x4 = 0) fprintf; *** EXPERIMENTAL NEW FEATURE *** 03/10/2002: beazley Change to handling of variable length arguments. varargs is now handled as a proper parameter and is passed to the code generator. However, it still can't be handled correctly (and will generate a typemap warning). This change has been made to better incorporate variable length arguments with other directives such as %ignore, %rename, %feature, and so forth. 03/10/2002: beazley Fixed [ 522555 ] Syntax error parsing "define" construct. SWIG is a little more restrictive in determining #define statements that will be wrapped as constants. Also added a better parser error rule for handling bad constants. 03/08/2002: cheetah (William Fulton) [Java] Bug fix: Classes renamed with %rename that are derived from another class generate more appropriate shadow class code. 03/08/2002: cheetah (William Fulton) [Java] Fixed SF [ #523632 ] and [ #513335 ] both reported by Israel Tanner. Support for types that are used which are in a typedef. The appropriate shadow class name is generated. Also generated correct shadow classname when a templated class is used within another templated class. See the cpp_typedef.i testcase. 03/08/2002: cheetah (William Fulton) [Java] Bug fix: No type was generated in shadow classes for types that weren't wrapped by SWIG. The type is treated as a raw pointer, ie no shadow class. 02/22/2002: beazley Refined the matching algorithm used by %rename, %ignore, and %feature. If a type signature is supplied, it must exactly match that used in the declaration---including any use of const. For example: %rename(foo1) foo(int); %rename(bar1) bar(int) const; class Blah { public: void foo(int); // Matched --> foo1 void foo(int) const; // Not matched void bar(int); // Not matched void bar(int) const; // Matched --> bar1 } In previous versions, a non-const specification would match both the non-const and const declarations. However, the whole point of %rename and related directives is that they be able to precisely pinpoint exact declarations in an interface. This fixes the problem. 02/21/2002: beazley Reworked the handling of default constructor and destructors. SWIG now makes a preliminary pass over the parse tree to discover which classes support default allocation. This fixes a number of very subtle issues in code generation and call/return by value. 02/18/2002: cheetah (William Fulton) Improved support on Cygwin: Perl, Python, Tcl, Ruby and Java should work out of the box, barring the runtime library. Removed dllwrap and replaced with newly working gcc -shared instead for Cygwin. All this will require the new improved binutils 20010802 and later, but the latest Cygwin is usually the best recommendation. 02/15/2002: beazley Fixed some problems related to wrapping of global variables and Perl shadow classes. Reported by Chia-liang Kao. 02/15/2002: ljohnson (Lyle Johnson) [Ruby] Made a fix to the code generation for C++ class constructors so that we get both a "new" singleton method and an "initialize" instance method for each class. This change enables developers to derive new Ruby classes from SWIG-wrapped C++ classes and then override their initialize methods to provide subclass-specific instance initialization. 02/15/2002: ljohnson (Lyle Johnson) [Ruby] Massive documentation update for the Ruby module, contributed by Craig Files. 02/14/2002: ljohnson (Lyle Johnson) [Ruby] Bug fix: An error in the SWIG runtime support for Ruby was causing several of the examples to fail. Reported by William Fulton. 02/14/2002: ljohnson (Lyle Johnson) [Ruby] Bug fix: Enumerations defined within a class (such as those seen in the Examples/ruby/enum example) were not being exported with the correct names. Reported by William Fulton. 02/13/2002: ljohnson (Lyle Johnson) [Ruby] Added a warning message when we run across overloaded class constructors for C++ code, that this is currently not supported (even if the overloads have been %renamed). For an example of where this doesn't work, see Examples/ruby/operator. 02/13/2002: ljohnson (Lyle Johnson) [Ruby] Added an "ignored" warning message when the parser runs across an operator!=() declaration for C++ code. 02/11/2002: ljohnson (Lyle Johnson) [Ruby] Added the "import", "import_template", "operator" and "template" examples. 02/11/2002: ljohnson (Lyle Johnson) [Ruby] Added multi-module support. 02/09/2002: ljohnson (Lyle Johnson) [Ruby] Added the missing "#define SWIG_NOINCLUDE" at the top of the wrapper code when the '-c' option is used. 02/09/2002: ljohnson (Lyle Johnson) Corrected a minor off-by-one error for the size of the swig_types[] array that's generated in the wrapper code. 02/08/2002: beazley Fixed SF [ #515058 ] Wrong code for C++ templates. Reported by Israel Taller. Version 1.3.11 (January 31, 2002) ================================= 01/30/2002: beazley Fix to pass/return by value for C++ objects that define no default constructor. Changes to the typemap system made it impossible to wrap C++ objects with no default constructor. This has been fixed, but the solution involves some clever template magic contributed by William Fulton. Please see the comments in the file Lib/swig.swg for further details. This solution is experimental and may be refined in a future release. 01/30/2002: beazley Global variables and member data of type "const char *" can be set, but the old value is silently discarded without any garbage collection. This may generate a memory leak. This change is needed to more safely handle variables like this: const char *foo = "Hello World\n"; In this case, it's not safe to free the old value. However, SWIG can dynamically allocate a new value and make foo point to it. To fix this memory leak, you can probably do this: %clear const char *foo; %apply char * {const char *foo}; *** POTENTIAL INCOMPATIBILITY *** 01/30/2002: beazley Two minor typemap enhancements have been added. First, typemaps can issue a warning message by including a special warning attribute. For example: %typemap(in,warning="I'm going to do something dangerous") ... The warning message will show up whenever the typemap is applied. Second, a typemap can force a no-match by defining %typemap(in) sometype "pass"; If this is used, the typemap system will *not* record a typemap match for "sometype". This can be used to block selected typemaps. For example, if you wanted to disable a typemap feature for some type, you could do this. // Do not allow global variables of type 'const char *' to be set. %typemap(varin) const char * "pass"; It might also be possible to use this to do subtle and strange things with typemaps. For example, if you wanted to make 'blah *' an output value and 'const blah *' an input parameter, you might do this: %typemap(ignore) blah *(blah temp) { $1 = &temp; } %typemap(argout) blah * { ... return a value ... } /* Block unqualified typemaps defined above */ %typemap(ignore) const blah * "pass"; %typemap(argout) const blah * "pass"; %typemap(in) const blah * { ... get input value ... } (This potential applications of typemaps suggested by Greg Stein). *** NEW FEATURE *** 01/29/2002: cheetah (william fulton) [Java] Bug fix: No enumerations were wrapped when the -shadow commandline option was not specified. Reported by Israel Taller. 01/28/2002: cheetah (william fulton) [Java] Global arrays are successfully wrapped. In fact they started mostly working in SWIG-1.3.10. 01/28/2002:richardp Added first attempt at C++ and -shadow support for PHP4 module, please test and mail me if any problems/ideas on improving it. There is a known problem with uninitialized member variables, please see Examples/php4/sync/README for details. Also more PHP documentation added to Doc/Manual/Php.html 01/27/2002:beazley The ANSI C size_t type is now recognized as an integer by default. 01/26/2002:beazley long long and unsigned long long support added to many language modules. This is not a portable feature and will require compiler support for the long long type. In target languages that do not support long long (e.g., Tcl and Perl), numbers are converted to a string of digits. This prevents their use in arithmetic calculations, but still allows values to be set from a string. long long support requires the use of the strtoll() and strtoull() functions as well as the 'lld' and 'llu' format specifiers of sprintf(). 01/26/2002:beazley Fixed [ #501827 ] Delete method is not called. The Tcl module wasn't correctly calling destructors when they were defined using %addmethods. This has been fixed. Reported by Reinhard Fobbe. 01/26/2002: beazley Better support for long long and unsigned long long. Typemaps have been included in a number of modules for handling these types. In addition, the parser has been modified to accept long long literals such as 1234LL and 1234ULL. 01/27/2002: cheetah (william fulton) [Java] A C char[] is mapped to a Java String which is the default SWIG handling of char[] and char*. It used to be mapped to byte[]. Note that a C signed char[] array is mapped to byte[]. *** POTENTIAL INCOMPATIBILITY *** 01/25/2002: beazley Fixed a problem with return-by-value, C++, and objects that define no default constructor. Reported by Joel Reed. 01/25/2002: cheetah (william fulton) [Java] Overhaul of the Java module. The C code generation is now done from typemaps. 01/24/2002: cheetah (william fulton) [Java] Support for arrays of enum pointers 01/20/2002: cheetah (william fulton) [Java] Error checking for null Java objects being passed to native functions. Exception thrown now whereas before the JVM crashed. 01/18/2002: cheetah (william fulton) [Java] Corrected behaviour for functions that take arrays. For example, when this c function: void arrayfn(int array[]); is wrapped the corresponding native function public final static native void arrayfn(int[] array); is produced. Previously if the C function made any changes to the array elements, these were not reflected back into the Java array. This has now been corrected so that the changes are propogated back to Java and the calling function will see these changes. This is how pure Java functions work, ie arrays are passed by reference. 01/15/2002:mkoeppe [Guile] New file cplusplus.i with C++ typemaps contributed by Marcio Luis Teixeira . 01/11/2002: cheetah (william fulton) [Java] Changed mapping of C long to Java type. Was mapped to Java long, now mapped to Java int. If you want the previous mapping to Java long use this approach in your interface file: %clear long; %typemap(jni) long "jlong" %typemap(jtype) long "long" %typemap(jstype) long "long" %clear long[ANY]; %typemap(jni) long[ANY] "jlongArray" %typemap(jtype) long[ANY] "long[]" %typemap(jstype) long[ANY] "long[]" %typemap(in) long[ANY] {write me for array support} %typemap(out) long[ANY] {write me for array support} %typemap(argout) long[ANY] {write me for array support} %typemap(freearg) long[ANY] {write me for array support} *** POTENTIAL INCOMPATIBILITY *** This new mapping is more appropriate when interfacing to 32 bit applications which are used in the current 32-bit JVMs. For future 64-bit JVMs you may have to change these mappings - eg on Unix LP64 systems, but not on Microsoft 64bit Windows which will be using a P64 IL32 model. This may be automated in a future version of SWIG. 01/10/2002:beazley Fixed [ 501677 ] %init block in wrong place. Reported by Luigi Ballabio. 01/09/2002: cheetah (william fulton) [Java] Default support for the long long type. signed long long is mapped to a Java long. unsigned long long is mapped to BigInteger. 01/09/2002:beazley Experimental change to parser to better support mixing of int, long, short, unsigned, float, and double. The parser should now support types like this: short unsigned int int unsigned short unsigned short int unsigned int short This change also enables a type of 'long double' (previously unsupported) to be used. *** NEW FEATURE *** 01/05/2002: cheetah (william fulton) [Java] Casting fix for when function return type is a pointer as reported by Gary Pennington 2002-01-05. The upper 32bits of the 64 bit jlong will have contained junk for 32bit pointers. 01/05/2002: cheetah (william fulton) [Java] Better pointer handling in Java is possible as the INPUT, OUTPUT and INOUT typemaps have been added into typemaps.i. 01/05/2002: cheetah (william fulton) [Java] $null can be used in input typemaps to return early from JNI functions that have either void or a non-void return type. Example: %typemap(check) int * %{ if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return $null; } %} If the typemap gets put into a function with void as return, $null will expand to nothing: void jni_fn(...) { if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return ; } ... } otherwise $null expands to zero, where javareturntype is either a pointer or a primitive type: javareturntype jni_fn(...) { if (error) { SWIG_exception(SWIG_IndexError, "Array element error"); return 0; } ... } 01/02/2002: cheetah (william fulton) [Java] The Java module incorrectly used argout typemaps for strings. This is now corrected and the code now resides in the freearg typemap. The argout array typemaps have been split into argout and freearg typemaps. This correction may require some user written typemaps to be modified. *** POTENTIAL INCOMPATIBILITY *** 12/28/2001: cheetah (william fulton) [Java] Multi typemaps now working for Java see multimap example. [Java] Fix for recently introduced bug - freearg typemap code was appearing before the function call. 12/28/2001: cheetah (william fulton) [Java] JCALL macro for JNI calls that work in both C and C++ typemaps have been replaced with JCALL0, JCALL1, JCALL2, JCALL3 and JCALL4 macros. *** POTENTIAL INCOMPATIBILITY *** 12/22/2001:beazley Resolved some inconsistent behavior with %rename and class renaming. If you specify the following: %rename(Foo) Bar; class Bar { public: Bar(); ~Bar(); } Then the %rename directive applies to the class itself, the constructor, and the destructor (all will be renamed to Foo). If a class defines more than one constructor, the overloaded variants can still be renamed by specifying parameters to %rename. For example: %rename(Bar_copy) Bar(Bar &); class Bar { public: Bar(); Bar(Bar &); ~Bar(); }; There are still some odd corner cases. If you specify %rename(Foo) ::Bar; then only the name of the class is changed and the constructor/destructor names are left unmodified. If you specify %rename(Foo) *::Bar; then the names of the constructor/destructor functions are modified but the name of the class is not. 12/21/2001: cheetah (william fulton) [Java] jni, jtype and jstype typemaps no longer hardcoded but real typemaps. New variable substitution, $javaclassname, can be used in the jstype typemaps. It is replaced with the Java shadow class name where applicable. [Java] Fix for recently introduced bug to do with inheritance when using %import. [Java] A few more bug fixes, todo with %rename and using the kind with the type, eg void fn(union uni myuni, struct str mystr, class cl mycl); 12/20/2001:beazley Fixed [ #494524 ] Preprocessor bug - apostrophe and #subst. 12/20/2001:beazley Added SWIG_VERSION preprocessor symbol. This is a hexadecimal integer such as 0x010311 (corresponding to SWIG-1.3.11). This can be used in the interface as follows: #if SWIG_VERSION >= 0x010311 /* Use some fancy new feature */ #endif Note: The version symbol is not defined in the generated SWIG wrapper file. *** NEW FEATURE *** 12/20/2001:mkoeppe [MzScheme]: Renamed mzswig_make_boolean to swig_make_boolean, as the latter is used in the typemaps. Reported by Luigi Ballabio. 12/17/2001:mkoeppe [Guile]: Rewrote list-vector.i using multi-dispatch typemaps. Updated pointer-in-out.i. Make the deprecated typemap-substitution of "$source" in "argout" work as before. 12/16/2001:mkoeppe [Guile]: Fixed macros %values_as_list, %values_as_vector, %multiple_values to use the proper %pragma syntax. New Guile example/test "multivalue"; new Guile run-test for test-suite item "list-vector" (currently broken). 12/14/2001:mkoeppe [Guile]: Fixed typemap-substition bug for "varin". Relaxed valid-identifier check to allow all R5RS identifiers. Version 1.3.10 (December 10, 2001) ================================== 12/08/2001:beazley Modified %typemap so that %{ ... %} can also be used as a code block (mostly for completeness). For example: %typemap(in) blah %{ ... %} This form does not introduce a new block scope. Also, the code enclosed in %{ ... %} is not processed by the preprocessor. 12/08/2001:beazley Fixed [ #459614 ] SWIG with multiple TCL interpreters. 12/08/2001:beazley Fixed [ #417141 ] rubydec.swg is wrong Reported by Paul Brannan. 12/08/2001:beazley Fixed [ #410557 ] Problem with %addmethods on NT. Reported by Magnus Ljung. 12/08/2001:beazley Fixed [ #445233 ] Enhancement: handle access change. SWIG now parses (but ignores) C++ access changes for the the following: class A { protected: void something() { } public: A() {} }; class B : private A { public: B() : A() { } protected: A::something; <---- Parsed, but ignored }; Suggested by Krzysztof Kozminski. 12/08/2001: cheetah (william fulton) Fix for Ruby to work using Visual C++. 12/06/2001:beazley Fixed [ #465687 ] unsigned short parameters fail. Reported by Gerald Williams. 12/06/2001:beazley Fixed SF [ #489594 ] PyString_FromString can't take NULL arg. Reported by John Merritt. SWIG now converts string values to Python using code like this: resultobj = result ? PyString_FromString(result) : Py_BuildValue(""); 12/06/2001:beazley Fixed SF [ #463561 ] Type conversions not generated. Reported by Gerald Williams. 12/04/2001:beazley Fixed SF [ #470217 ] Tcl default argument handling. Reported by Shaun Lowry. 12/04/2001:beazley Fixed SF [ #472088 ] defined(MACRO) expanded everywhere. Embedded preprocessor directives such as %#if defined(FOO) are not expanded by the SWIG preprocessor. Reported by Gerald Williams. 12/04/2001:beazley Fixed SF [ #476467 ] Problems with #define & commas. 12/04/2001:beazley Fixed SF [ #477547 ] wrong declaration of pointer functions. Bad prototypes in Lib/tcl/ptrlang.i. 12/04/2001:beazley Fixed SF [ #483182 ] Constants can take args by mistake. When swig -perl5 -const is used, constants are declared with a void prototype. For example: sub ICONST () { $examplec::ICONST } Patch submitted by Rich Wales. 12/03/2001:beazley New %exception directive. This is intended to replace %except. It works in exactly the same manner except it does not accept a language specifier. For example: %exception { try { $action } catch(SomeError) { error } } %exception is also name aware---allowing it to be applied to specific declarations in an interface. For example: %exception foo { ... exception for any function/method foo ... } %exception Foo::bar { ... exception for method bar in class Foo ... } %exception Foo::bar(double) { ... exception for method bar(double) in class Foo ... } The semantics of this name matching is exactly the same as for %rename. *** NEW FEATURE *** 12/03/2001:beazley Substantial cleanup of the Python shadow class code. Shadow classes used to be created in this rather complicated manner involving about a half-dozen strings created in bits and pieces. Shadow classes are now generated in a more straightforward manner--in the same order that appears in the interface file. *** POTENTIAL INCOMPATIBILITY *** The order in which declarations appear in the shadow file may differ. 12/03/2001:beazley The %insert directive (%{ ... %}, %runtime, %header, %wrapper, etc.) can now be used inside of a class definition. This has potential uses when generating shadow class code. For example: class Foo { ... %insert("shadow") %{ # Some python code def blah(self): print "I'm blah!" %} ... }; The support for class code insertion depends on the language module. However, the intent of this feature is to simplify the task of extending shadow class code. In the Python module, this inserts code with the proper level of indendation (regardless of what was used in the SWIG interface). *** NEW FEATURE *** 11/29/2001: cheetah (william fulton) Modifications for Java and Python modules to work on cygwin. Unfortunately a lot of the python module has started to produces code which cannot be auto-imported using cygwin libtools so most of it is still broken. 11/28/2001:beazley The %rename and %feature directive can now be used inside of a class definition. For example: class Foo { %rename(foo_i) foo(int); %rename(foo_d) foo(double); public: ... void foo(int); void foo(double); ... }; When used in this manner, the %rename directive only applies to members of the class in which it appears as well as all derived classes. In fact, this is really just the same as saying: %rename(foo_i) Foo::foo(int); %rename(foo_d) Foo::foo(double); class Foo { ... }; *** NEW FEATURE *** 11/26/2001:beazley Added the experimental %feature directive. %feature can be used to attach arbitrary string attributes to parse tree nodes. For example: %feature("except") blah { try { $function } catch (Error) { whatever; } } or %feature("set") *::x_set "x"; or %feature("blah") Foo::bar(int,double) const "spam"; The syntax is borrowed from the %rename directive. In fact, the exact same semantics apply (inheritance, matching, etc.). %feature is a very powerful low-level primitive that can be used to customize individual language modules and to provide hints to any stage of code generation. Features are attached to parse tree nodes as attributes with names like "feature:*" where * is replaced by the feature name (e.g., "feature:except", "feature:set", etc.). Language modules can then look for the features using a simple attribute lookup. %feature is intended to be a replacement for a number of older SWIG directives including %except and specialized pragmas. It is more powerful (due to its parameterized name matching) and it provides very precise control over how customization features are attached to individual declarations. There are future expansion plans that will build upon this capability as well. It's not certain that %feature will ever be used directly by SWIG users. Instead, it may be a low-level primitive that is used in high-level macro definitions. For instance, to support properties, you might define a macro like this: %define %property(name, setf, getf) %feature("set") setf #name; %feature("get") getf #name; %enddef Which allows a user to specify things like this: %property(p, get_p, set_p); class Blah { public: int get_p(); void set_p(int); }; *** EXPERIMENTAL NEW FEATURE *** 11/24/2001:beazley The Tcl module has been expanded with some new features for managing object ownership. For example: set c [Circle -args 20] $c area # Invoke a method $c -disown # Releases ownership of the object $c -acquire # Acquires ownership of the object If Tcl owns the object, its destructor is invoked when the corresponding object command is deleted in Tcl. To simplify the destruction of objects, the following syntax can be used: $c -delete # Delete an object This is an alternative for the more obscure variant of rename $c {} These features also add functionality at the C API level. The following functions manage ownership from C and can be used in typemaps. SWIG_Acquire(void *ptr); SWIG_Disown(void *ptr); A new function for constructing instances is also available: Tcl_Obj * SWIG_NewInstanceObj(Tcl_Interp *interp, void *ptr, swig_type_info *type, int own); When used in a typemap, this creates a pointer object and an interpreter command that can be used to issue methods and access attributes as shown above. *** NEW FEATURE *** 11/23/2001:beazley All Python-related %pragma operations have been eliminated. Most of these were written for older SWIG versions in order to compensate for limitations in earlier releases. In an effort to reduce the amount of code-clutter and potential for errors, it is easier to simply eliminate the pragmas and to start over (if needed). To be honest, I'm not even sure the pragmas worked in 1.3.9 and recent releases. Note: If you need to insert code into the shadow class file created by SWIG, simply use the %shadow directive like this: %shadow %{ def some_python_code(): print "blah!" %} *** POTENTIAL INCOMPATIBILITY *** 11/22/2001:beazley Sweeping changes to the way in which the Python module handles shadow classes. In early implementations, shadow classes were merely Python wrappers around typed pointer objects. However, some users actually wanted to receive the shadow class object in C. To accommodate this, the dereferencing of the "this" pointer in a shadow class was moved to C as described in CHANGES [8/8/99]. However, the process of returning pointers to Python was still somewhat problematic. Specifically, shadow classes never worked in situations such as these: - Use of any kind of output typemap ('out' or 'argout') - Global variables (broken as far as I can tell). In the past, some users have dealt with this by manually trying to create shadow class objects themselves from C/C++. However, this was difficult because the C wrappers don't really know how to get access to the corresponding Python class. The Python module has now been modified to automatically attach shadow class objects to pointers when they are returned to Python. This process occurs in the function SWIG_NewPointerObj() so the process is completely transparent to users. As a result, shadow classes are now more seamlessly integrated with typemaps and other features of SWIG. This change may introduce a number of incompatibilities. The SWIG_NewPointerObj() now takes an extra parameter "own" to indicate object ownership. This can be used to return a pointer to Python that Python should destroy. In addition, older code that tries to manually construct shadow class objects or which expects bare pointers may break---such pointers may already be encapsulated by a shadow class. *** POTENTIAL INCOMPATIBILITY *** 11/20/2001:beazley Modified the %insert directive to accept single braces { ... }. For example: %insert("header") { ... some code ... } This works exactly like %{ ... %} except that the code in the braces is processed using the preprocessor. This can be useful in certain contexts such as low-level code generation in language modules. *** NEW FEATURE *** 11/20/2001:beazley Command line options are now translated into preprocessor symbols. For example: ./swig -python -shadow -module blah interface.i Creates the symbols: SWIGOPT_PYTHON 1 SWIGOPT_SHADOW 1 SWIGOPT_MODULE blah Modules can look for these symbols to alter their code generation if needed. *** NEW FEATURE *** 11/20/2001:beazley Massive overhaul of the Perl5 module. A lot of code generation is now driven by tables and typemaps. The generated wrapper code also makes use of tables to install constants, variables, and functions instead of inlining a bunch of procedure calls. The separate variable initialization function is gone. Most code generation is controlled via the perl5.swg file in the library. *** POTENTIAL INCOMPATIBILITY *** 11/13/2001:beazley Added parsing support for the C++ typename keyword. Primarily this is added to better support templates. For example: template void blah(C& v) { typename C::iterator i = v.begin(); } Note: typename is supported in the parser in the same way as 'struct' or 'class'. You probably shouldn't use it anywhere except in templates. *** NEW FEATURE *** 11/11/2001:beazley Massive overhaul of the language module API. Most functions now use a common, very simple, API. There are also a number of interesting semantic side-effects of how code is actually generated. Details will be forthcoming in Doc/Manual/Extending.html. *** POTENTIAL INCOMPATIBILITY *** Language modules written for previous versions of SWIG will no longer work, 11/10/2001:beazley Fixed a very subtle bug due to unnamed class wrapping. For example, if you did this typedef struct { int x,y; } gdPoint, *gdPointPtr; void foo(gdPointPtr x); Then the foo function would get a type-error. The problem has to do with internal typedef handling and the fact that the typedef declarations after the struct appear later in the parse tree. It should work now. Problem reported by Vin Jovanovic. 11/09/2001:beazley Subtle change to "out" typemaps (and related variations). The name that is attached to the typemap is now the raw C identifier that appears on a declaration. This changes the behavior of member functions. For example: %typemap(out) int foo { ... } class Blah { public: int foo(); // typemap gets applied } Previous versions never really specified how this was supposed to work. In SWIG1.1, you could probably write a typemap for the wrapper name like this: %typemap(out) int Blah_foo { ... } However, this old behavior is now withdrawn and not supported. Just use the member name without any sort of special prefix. *** POTENTIAL INCOMPATIBILITY *** 11/06/2001:beazley Changes to Tcl module initialization: (1) SWIG now automatically includes the code needed to work with Tcl stubs. Simply compile with -DUSE_TCL_STUBS. (2) SWIG now automatically calls Tcl_PkgProvide to register a package name. The package name is the same as the name specified with the %module directive. The version number is set to "0.0" by default. To change the version number, use swig -pkgversion 1.2 interface.i. *** POTENTIAL INCOMPATIBILITY *** Modules that provided stubs and Tcl_PkgProvide on their own might break. Simply remove that code. 11/05/2001:beazley Changed code generation of constants in the Tcl module. Constants are now stored in a large table that get installed at module startup. There are also no longer any static variables so it should generate somewhat less code. 11/04/2001:beazley The "const" typemap has been renamed to "constant" in many language modules. "const" is a C keyword which made the handling of the typemap directive somewhat awkward in the parser. *** POTENTIAL INCOMPATIBILITY *** 11/04/2001:beazley %typemap directive can now accept nearly arbitrary keyword parameters. For example: %typemap(in,parse="i",doc="integer") int "..."; The purpose of the keyword parameters is to supply code generation hints to the target language module. The intepretation of the parameters is language specific. *** NEW FEATURE *** 11/04/2001:beazley Slight semantic change to internal call/return by value handling. In previous versions of SWIG, call-by-value was translated into pointers. For example: double dot_product(Vector a, Vector b); turned into this: double wrap_dot_product(Vector *a, Vector *b) { return dot_product(*a,*b); } This translation was normally performed by the SWIG core, outside of the control of language modules. However, a side effect of this was a lot of bizarre typemap behavior. For example, if you did something like this: %typemap(in) int32 { ... } You would find that int32 was transformed into a pointer everywhere! (needless to say, such behavior is unexpected and quite awkward to deal with). To make matters worse, if a typedef was also used, the pointer behavior suddenly disappeared. To fix this, the pointer transformation is now pushed to the language modules. This produces wrappers that look roughly like this: double wrap_dot_product(Vector *a, Vector *b) { Vector arg1 = *a; Vector arg2 = *b; return dot_product(arg1,arg2); } This change also makes it easy to define typemaps for arbitrary undefined types. For example, you can do this (and it will work regardless what int32 is): %typemap(in) int32 { $1 = (int32) PyInt_AsLong($input); } *** POTENTIAL IMCOMPATIBILITY *** This change may break call/return by value code generation in some language modules. 11/03/2001:beazley Changed the name of the default typemaps to the following: %typemap() SWIGTYPE { ... an object ... } %typemap() SWIGTYPE * { ... a pointer ... } %typemap() SWIGTYPE & { ... a reference ... } %typemap() SWIGTYPE [] { ... an array ... } %typemap() enum SWIGTYPE { ... an enum value ... } %typemap() SWIGTYPE (CLASS::*) { ... pointer to member ... } These types are used as the default for all types that don't match anything else. See CHANGES log entry for 8/27/2000 for the old behavior. The role of these types is also described in Doc/Manual/Typemaps.html *** POTENTIAL INCOMPATIBILITY *** 10/25/2001:beazley Modified Guile and Mzscheme modules to support multi-argument typemaps. 10/25/2001: cheetah (william fulton) [Java] Fix to handle pointers to arrays. 10/24/2001:beazley Defining a typemap rule for enum SWIGENUM can now be used to define default behavior for enum variables. 10/22/2001:beazley Ruby module modified to support multi-argument typemaps. 10/22/2001:beazley The Ruby module can now handle functions with an arbitrary number of arguments. Previous versions were limited to to functions with only 9 or 16 arguments depending on the use of default arguments. Note: from some inspection of the Ruby interpreter source, the new approach might be a little faster as well. 10/18/2001:beazley Fixed a bug with forward class declarations and templates. class Foo ; Bug reported by Irina Kotlova. 10/16/2001:beazley Support for multivalued typemaps added. The typemaps are specified using the syntax below. Within each typemap, variable substitution is handled as follows: %typemap(in) (int argc, char *argv[]) { $arg; // The input object in the target language $1; // C local variable for first argument $2; // C local variable for second argument // These variables refer to either argument $1_type, $1_ltype, $1_basetype, etc... (argc) $2_type, $2_ltype, $2_basetype, etc... (argv[]) // Array dimension of argv $2_dim0 } Basically any variable that was available in normal typemaps is available for either argument by prefacing the variable name by '$n_' where n is the argument position. Notes: (1) Multi-valued typemaps can only be applied to a single object in the target scripting language. For example, you can split a string into a (char *, int) pair or split a list into a (int, char []) pair. It is not possible to map multiple objects to multiple arguments. (2) To maintain compatibility with older SWIG versions, the variables such as $target and $type are preserved and are mapped onto the first argument only. (3) This should not affect compatibility with older code. Multi-valued typemaps are an extension to typemap handling. Single valued typemaps can be specified in the usual way. The old $source and $target variables are officially deprecated. Input variables are referenced through $arg$ and output values are reference through $result$. *** NEW FEATURE *** 10/16/2001:beazley Added parsing support for multivalued typemaps. The syntax is a little funky, but here goes: // Define a multivalued typemap %typemap(in) (int argc, char *argv[]) { ... typemap code ... } // Multivalued typemap with locals %typemap(in) (int argc, char *argv[])(int temp) { ... typemap code ... } // Copy a multivalued typemap %typemap(in) (int argcount, char **argv) = (int argc, char *argv[]); // Apply a multivalued typemap %apply (int argc, char *argv[]) { (int argcount, char **argv) }; Note: this extra parsing support is added for future extension. No language modules currently support multi-valued typemaps. 10/11/2001:beazley Modified the typemap matching code to discard qualifiers when checking for a match. For example, if you have a declaration like this: void blah(const char *x); The typemap checker checks for a match in the following order: const char *x const char * char *x char * If typedef's are involved, qualifier stripping occurs before typedef resolution. So if you had this, typedef char *string; void blah(const string x); typemap checking would be as follows: const string x const string string x string const char *x const char * char *x char * The primary reason for this change is to simplify the implementation of language modules. Without qualifier stripping, one has to write seperate typemaps for all variations of const and volatile (which is a pain). *** POTENTIAL INCOMPATIBILITY *** Typemaps might be applied in places where they weren't before. 10/9/2001: beazley SWIG now generates wrappers that properly disambiguate overloaded methods that only vary in constness. For example: class Foo { ... void blah(); void blah() const; ... }; To handle this, the %rename directive can be used normally. %rename(blah_const) blah() const; In the resulting wrapper code, method calls like this are now generated: (obj)->blah() // Non-const version ((Foo const *)obj)->blah() // const version This should force the right method to be invoked. Admittedly, this is probably obscure, but we might as well get it right. 10/8/2001: beazley The preprocessor now ignores '\r' in the input. This should fix the following bug: [ #468416 ] SWIG thinks macro defs are declarations? 10/8/2001: beazley Added support for ||, &&, and ! in constants. This fixes SF [ #468988 ] Logical ops break preprocessor. However, at this time, constants using these operators are not supported (the parser will issue a warning). 10/4/2001: beazley Added -show_templates command line option. This makes SWIG display the code it actually parses to generate template wrappers. Mostly useful for debugging. *** NEW FEATURE *** 10/4/2001: beazley Change to semantics of %template directive. When using %template, the template arguments are handled as types by default. For example: %template(vecint) vector; %template(vecdouble) vector; To specify a template argument that is *not* a type, you need to use default-value syntax. For example: %template(vecint) vector; %template(vecdouble) vector; In this case, the type name doesn't really matter--only the default value (e.g., 50, 100) is used during expansion. This differs from normal C++, but I couldn't figure out a better way to do it in the parser. Might implement an alternative later. *** POTENTIAL INCOMPATIBILITY *** 10/4/2001: beazley Major changes to template handling in order to provide better integration with the C++ type-system. The main problem is as follows: Suppose you have a template like this: template void blah(const T x) { stuff }; Now suppose, that you instantiate the template on a type like this in SWIG: %template(blahint) blah; In C++, this is *supposed* to generate code like this: void blah(int *const x) { stuff }; However, in SWIG-1.3.9, the template substitution gets it wrong and produces void blah(const int *x) { stuff }; (notice the bad placement of the 'const' qualifier). To fix this, the SWIG parser now generates implicit typedefs for template type arguments that produces code roughly equivalent to doing this: typedef int *__swigtmpl1; %template(blahint) blah<__swigtmpl1>; which generates code like this: void blah(const __swigtmpl1 x) { stuff }; Since this is correct in both C++ and SWIG, it provides the right semantics and allows everything to compile properly. However, to clean up the generated code a little bit, the parser keeps track of the template types and performs back-substitution to the original type when building the parse tree. Thus, even though the implicit typedef is used in the input and may appear in the generated wrapper file (for proper compilation), the parse tree will hide a lot of these details. For example: void blah(const __swigtmpl1 x) { stuff }; will look like it was declared as follows (which is what you want): void blah(int *const x) { stuff } The only place you are likely to notice the typedef hack is in bodies of template functions. For example, if you did this, template class blah { ... %addmethods { void spam() { T tempvalue; ... } } } you will find that 'T tempvalue' got expanded into some strange typedef type. This *still* compiles correctly so it's not a big deal (other than looking kind of ugly in the wrapper file). 10/4/2001: beazley Fixed some inheritance problems in Tcl Object interface. 10/1/2001: beazley Tcl module has changed to use byte-backed pointer strings. This implementation should be safe on 64-bit platforms. However, the order in which digits appear in pointer values no longer directly corresponds to the actual numerical value of a pointer (on little-endian machines, pairs of digits appear in reverse order). 10/1/2001: beazley Perl5 module is now driven by a configuration file 'perl5.swg' in the SWIG library. 10/1/2001: beazley The perl5 module no longer tries to apply the "out" typemap in code generated for magic variables. I'm surprised that this ever worked at all (since all of the code that was there was wrong anyways). Use the "varout" typemap to handle global variables. 10/1/2001: beazley Fixed a bug related to character array members of structures. For example: struct Foo { char name[32]; }; SWIG is normally supposed to return a string, but this was broken in 1.3.9. The reason it was broken was actually due to a subtle new feature of typemaps. When a data member is set to an array like this, the return type of the related accessor function is actually set to an array. This means that you can now write typemaps like this: %typemap(python,out) char [ANY] { $target = PyString_FromStringAndSize($source,$dim0); } This functionality can be used to replace the defunct memberout typemap in a more elegant manner. 9/29/2001: beazley Some further refinement of qualified C++ member functions. For example: class Foo { ... void foo() const; ... }; (i) The SWIG parser was extended slightly to allow 'volatile' and combinations of 'const' and 'volatile' to be used. This is probably rare, but technically legal. Only added for completeness. (ii) For the purposes of overloading, qualified and non-qualified functions are different. Thus, when a class has methods like this: void foo(); void foo() const; Two distinct methods are declared. To deal with this, %rename and similar directives have been extended to recognize const. Thus, one can disambiguate the two functions like this: %rename(fooconst) Foo::foo() const; or simply ignore the const variant like this: %ignore Foo::foo() const; Note: SWIG currently has no way to actually invoke the const member since the 'const' is discarded when generating wrappers for objects. 9/27/2001: beazley New directive. %namewarn can be used to issue warning messages for certain declaration names. The name matching is the same as for the %rename directive. The intent of this directive is to issue warnings for possible namespace conflicts. For example: %namewarn("print is a python keyword") print; The name matching algorithm is performed after a name has been resolved using %rename. Therefore, a declaration like this will not generate a warning: %rename("Print") print; ... void print(); /* No warning generated */ Since the warning mechanism follows %rename semantics, it is also to issue warnings for specific classes or just for certain member function names. (Dave - I've been thinking about adding something like this for quite some time. Just never got around to it) *** NEW FEATURE *** 9/27/2001: beazley Enhanced the %ignore directive so that warning messages can be issued to users. This is done using %ignorewarn like this: %ignorewarn("operator new ignored") operator new; The names and semantics of %ignorewarn is exactly the same as %ignore. The primary purpose of this directive is for module writers who want to ignore certain types of declarations, but who also want to alert users about it. A user might also use this for debugging (since messages will appear whenever an ignored declaration appears). *** NEW FEATURE *** 9/26/2001: beazley Super-experimental support for overloaded operators. This implementation consists of a few different parts. (i) Operator names such as 'operator+' are now allowed as valid declarator names. Thus the 'operator' syntax can appear *anyplace* a normal declarator name was used before. On the surface, this means that operators can be parsed just like normal functions and methods. However, it also means that operator names can be used in many other SWIG directives like %rename. For example: %rename(__add__) Complex::operator+(const Complex &); (ii) Operators are wrapped *exactly* like normal functions and methods. Internally, the operator name is used directly meaning that the wrapper code might contain statements like this: arg0->operator*((Complex const &)*arg1); This all seems to parse and compile correctly (at least on my machine). (iii) SWIG will no longer wrap a declaration if its symbol table name contains illegal identifier characters. If illegal characters are detected, you will see an error like this: Warning. Can't wrap operator* unless renamed to a valid identifier. The only way to fix this is to use %rename or %name to bind the operator to a nice name like "add" or something. Note: the legal identifier characters are determined by the target language. There are certain issues with friend functions and operators. Sometimes, friends are used to define mixed operators such as adding a Complex and a double together. Currently, SWIG ignores all friend declarations in a class. A global operator declaration can probably be made to work, but you'll have to rename it and it probably won't work very cleanly in the target language since it's not a class member. SWIG doesn't know how to handle operator specifications sometimes used for automatic type conversion. For example: class String { ... operator const char*(); ... }; (this doesn't parse correctly and generates a syntax error). Also: operators no longer show up as separate parse-tree nodes (instead they are normal 'cdecl' nodes). I may separate them as a special case later. See Examples/python/operator for an example. *** SUPER-EXPERIMENTAL NEW FEATURE *** Version 1.3.9 (September 25, 2001) ================================== 9/25/2001: beazley Fixed parsing problem with type declarations like 'char ** const'. SWIG parsed this correctly, but the internal type was represented incorrectly (the pointers and qualifiers were in the wrong order). 9/25/2001: beazley Withdrew experimental feature (noted below) that was causing serious parsing problems. Version 1.3.8 (September 23, 2001) ================================== 9/23/2001: beazley Included improved distutils setup.py file in the Tools directory (look for the setup.py.tmpl file). Contributed by Tony Seward. 9/23/2001: beazley Included two new RPM spec files in the Tools directory. Contributed by Tony Seward and Uwe Steinmann. 9/21/2001: beazley Fixed SF Bug [ #463635 ] Perl5.swg does not compile in Visual C++ 9/21/2001: beazley Two new directives control the creation of default constructors and destructors: %nodefault %makedefault These replace %pragma nodefault and %pragma makedefault. (old code will still work, but documentation will only describe the new directives). 9/21/2001: beazley Fixed SF Bug [ #462354 ] %import broken in 1.3.7. 9/20/2001: beazley Parser modified to ignore out-of-class constructor and destructor declarations. For example: inline Foo::Foo() : Bar("foo") { } inline Foo::~Foo() { } Suggested by Jason Stewart. *** EXPERIMENTAL FEATURE *** 9/20/2001: beazley Modified the parser to ignore forward template class declarations. For example: template class MapIter; Suggested by an email example from Irina Kotlova. 9/20/2001: beazley Fixed problem with undeclared tcl_result variable in the "out" typemap for Tcl. Reported by Shaun Lowry. 9/20/2001: beazley Incorporated changes to make SWIG work with ActivePerl. Contributed by Joel Reed. 9/20/2001: beazley Slight change to the parsing of C++ constructor initializers. For example: class Foo : public Bar { public: Foo() : Bar(...) {...} }; SWIG now discards the contents of the (...) regardless of what might enclosed (even if syntactically wrong). SWIG doesn't need this information and there is no reason to needless add syntax rules to handle all of the possibilities here. 9/20/2001: beazley Change to typemaps for structure members. If you have a structure like this: struct Vector { int *bar; }; The member name 'bar' is now used in any accessor functions. This allows the "in" typemap to be used when setting the value. For example, this typemap %typemap(python,in) int *bar { ... } now matches Vector::bar. It should be noted that this will also match any function with an argument of "int *bar" (so you should be careful). *** NEW FEATURE. POTENTIAL INCOMPATIBILITY *** 9/20/2001: beazley Fixed SF bug #462642 setting string values in structures 9/20/2001: beazley Fixed SF bug #462398 problem with nested templates. 9/20/2001: beazley Fixed SF bug #461626 problem with formatting and C++ comments. 9/20/2001: beazley Fixed SF bug #462845 Wrong ownership of returned objects. 9/19/2001: beazley Fixed SF bug #459367. Default constructors for classes with pure virtual methods. 9/19/2001: beazley Fixed problem with default arguments and class scope. For example: class Foo { public: enum bar { FOO, BAR }; void blah(bar b = FOO); ... } SWIG now correctly generates a default value of "Foo::FOO" for the blah() method above. This used to work in 1.1, but was broken in 1.3.7. Bug reported by Mike Romberg. Version 1.3.7 (September 3, 2001) ================================== 9/02/2001: beazley Added special %ignore directive to ignore declarations. This feature works exactly like %rename. For example: %ignore foo; // Ignore all declarations foo %ignore ::foo; // Only ignore foo in global scope %ignore Spam::foo; // Only ignore in class Spam %ignore *::foo; // Ignore in all classes %ignore can also be parameterized. For example: %ignore foo(int); %ignore ::foo(int); %ignore Spam::foo(int); %ignore *::foo(int); *** NEW FEATURE *** 9/02/2001: cheetah (william fulton) [Java] shadowcode pragma modified so that the code that is output in the shadow file is placed relative to where it is placed in the c/c++ code. This allows support for JavaDoc function comments. 9/01/2001: beazley Fixed SF Patch [ #447791 ] Fix for python -interface option. Submitted by Tarn Weisner Burton. 9/01/2001: beazley SWIG no longer generates default constructors/destructors for a class if it only defines a private/protected constructor or destructor or if any one of its base classes only has private constructors/destructors. This was reported in SF Patch [ #444281 ] nonpublic/default/inhereted ctor/dtor by Marcelo Matus. 9/01/2001: beazley Added patch to Perl5 module that allows constants to be wrapped as constants that don't require the leading $. This feature is enabled using the -const option. Patch contributed by Rich Wales. *** NEW FEATURE *** 8/31/2001: beazley Added parsing support for the 'volatile' type qualifier. volatile doesn't mean anything to SWIG, but it is needed to properly generate prototypes for declarations that use it. It's also been added to make the SWIG type system more complete. *** NEW FEATURE *** 8/30/2001: beazley Added support for parameterized %rename directive. *** This new feature can be used to greatly simplify the task of resolving overloaded methods and functions. *** In prior versions of SWIG, the %rename directive was used to consistently apply an identifier renaming. For example, if you said this: %rename foo bar; Every occurrence of 'foo' would be renamed to 'bar'. Although this works fine for resolving a conflict with a target language reserved word, it is useless for for dealing with overloaded methods. This is because all methods are simply renamed to the same thing (generating the same conflict as before). Therefore, the only way to deal with overloaded methods was to go through and individually rename them all using %name. For example: class Foo { public: virtual void bar(void); %name(bar_i) virtual void bar(int); ... }; To make matters worse, you had to do this for all derived classes too. class Spam : public Foo { public: virtual void bar(void); %name(bar_i) virtual void bar(int); ... }; Needless to say, this makes it extremely hard to resolve overloading without a lot of work and makes it almost impossible to use SWIG on raw C++ .h files. To fix this, %rename now accepts parameter declarators. The syntax has also been changed slightly. For example, the following declaration renames all occurrences of 'bar(int)' to 'bar_i', leaving any other occurrence of 'bar' alone. %rename(bar_i) bar(int); Using this feature, you can now selectively rename certain declarations in advance. For example: %rename(bar_i) bar(int); %rename(bar_d) bar(double); // Include raw C++ header %include "header.h" When %rename is used in this manner, all occurrence of bar(int) are renamed wherever they might occur. More control is obtained through explicit qualification. For example, %rename(bar_i) ::bar(int); only applies the renaming if bar(int) is defined in the global scope. The declaration, %rename(bar_i) Foo::bar(int); applies the renaming if bar(int) is defined in a class Foo. This latter form also supports inheritance. Therefore, if you had a class like this: class Spam : public Foo { public: void bar(int); } The Spam::bar(int) method would also be renamed (since Spam is a subclass of Foo). This latter feature makes it easy for SWIG to apply a consistent renaming across an entire class hierarchy simply by specifying renaming rules for the base class. A class wildcard of * can be used if you want to renaming all matching members of all classes. For example: %rename(bar_i) *::bar(int); will rename all members bar(int) that are defined in classes. It will not renamed definitions of bar(int) in the global scope. The old use of %rename is still supported, but is somewhat enhanced. %rename(foo) bar; // Renames all occurrences of 'bar'. %rename(foo) ::bar; // Rename all 'bar' in global scope only. %rename(foo) *::bar; // Rename all 'bar' in classes only. %rename(foo) Foo::bar; // Rename all 'bar' defined in class Foo. *** NEW FEATURE *** 8/30/2001: beazley Added support for data-member to member-function transformation. For example, suppose you had a structure like this: struct Vector { double x,y; }; Now suppose that you wanted to access x and y through a member function interface instead of the usual SWIG behavior. For example: f.set_x(3.4) # instead of f.x = 3.4 x = f.get_x() # instead of x = f.x To do this, simply use the new %attributefunc directive. For example: %attributefunc(get_%s,set_%s) struct Vector { double x,y; }; %noattributefunc The arguments to %attributefunc are C-style printf format strings that determine the naming convention to use. %s is replaced with the actual name of the data member. SWIG provides a number of printf extensions that might help. For example, if you wanted to title case all of the attributes, you could do this: %attributefunc(get%(title)s,set%(title)s); This will turn an attribute 'bar' to 'getBar()' and 'setBar()'. (someone requested this long ago, but I finally figured how to implement it in a straightforward manner). *** EXPERIMENTAL NEW FEATURE *** 8/30/2001: beazley SWIG now automatically generates default constructors and destructors if none are defined. This used to be enabled with a command line switch -make_default, but most people want these functions anyways. To turn off this behavior use the -no_default option or include the following pragma in the interface file: %pragma no_default; This may break certain interfaces that defined their own constructors/destructors using the same naming convention as SWIG. If so, you will get duplicate symbols when compiling the SWIG wrapper file. *** POTENTIAL INCOMPATIBILITY *** 8/29/2001: beazley Changes to Perl5 shadow class code generation. Iterators are no longer supported (FIRSTKEY, NEXTKEY). Also, attribute access has been changed to rely on inheritance in order to provide better behavior across modules. 8/28/2001: beazley Various obscure improvements to the type system and classes. Strange declarations like this are now wrapped correctly (i.e., the generated wrapper code doesn't cause the C++ compiler to die with a type error). class Foo { public: typedef double Real; Real foo(Real (*op)(Real,Real), Real x, Real y); }; Inheritance of types is also handled correctly. 8/28/2001: beazley Changes to class wrappers. When SWIG sees two classes like this, class X { public: void foo(); ... } class Y : public X { public: void bar(); ... } it now only generates two wrapper functions: X_foo(X *x) { x->foo(); } Y_bar(Y *y) { y->bar(); } Unlike SWIG1.15, the foo() method does *not* propagate to a wrapper function Y_foo(). Instead, the base class method X_foo() must be used. This change should not affect modules that use shadow classes, but it might break modules that directly use the low-level C wrappers. This change is being made for a number of reasons: - It greatly simplifies the implementation of SWIG--especially with anticipated future changes such as overloaded methods. - It results in substantially less wrapper code--especially for big C++ class hierarchies (inherited declarations are no longer copied into every single derived class). - It allows for better code generation across multiple SWIG generated modules (code isn't replicated in every single module). *** POTENTIAL INCOMPATIBILITY *** 8/22/2001: cheetah (william fulton) Provided some Windows documentation in the Win directory and some Visual C++ project files for running examples on Windows. 8/28/2001: mkoeppe [Guile] Handle renamed overloaded functions properly; thanks to Marc Zonzon for the patch. See the new test case name_cxx. 8/27/2001: mkoeppe [Tcl] Removed lots of warnings issued by the Sun Forte compilers, which were caused by mixing function pointers of different linkages (C++/C). 8/23/2001: mkoeppe Improved the MzScheme module by porting Guile's pointer type checking system and making type dispatch typemap-driven. 8/22/2001: beazley Entirely new symbol table processing. SWIG should be able to report much better error messages for multiple declarations. Also, the new symbol table allows for overloaded functions (although overloading isn't quite supported in the language modules yet). 8/22/2001: cheetah (william fulton) * [Java] %new support added. * [Java] Package JNI name refixed! 8/19/2001: beazley Python module modified to support pointers to C++ members. This is an experimental feature. *** NEW FEATURE *** 8/19/2001: beazley Added limited parsing and full type-system support for pointers to members. None of SWIG's language modules really know how to deal with this so this is really only provided for completeness and future expansion. Note: SWIG does not support pointers to members which are themselves pointers to members, references to pointers to members, or other complicated declarations like this. *** NEW FEATURE *** 8/19/2001: beazley SWIG is much better at parsing certain C++ declarations. Operators and friends generally don't cause anymore syntax errors. However, neither are really supported. 8/18/2001: beazley Added *highly* experimental support for wrapping of C++ template declarations. Since C++ templates are essentially glorified macros and SWIG has a fully operational C preprocessor with macro support, the parser now converts template declarations to macros. For example, a function template like this template T max(T a, T b); is internally converted into a macro like this: %define %_template_max(__name,T) %name(__name) T max(T a, T b); %enddef To instantiate a version of the template, a special %template declaration is used like this: %template(maxint) max; %template(maxdouble) max; The parameter to the %template directive must be proper C identifier that's used to uniquely name the resulting instantiation. When used, the the expanded macro looks like this: %name(maxint) int max(int a, int b); %name(maxdouble) double max(double a, double b); A similar technique is used for template classes. For instance: template class vector { T *data; int sz; public: vector(int nitems); T *get(int n); ... }; Gets converted into a macro like this: %define %_template_vector(__name, T) %{ typedef vector __name; %} class __name { T *data; int sz; public: __name(int nitems); T *get(int n); ... }; typedef __name vector; %enddef An a specific instantiation is created in exactly the same way: %template(intvec) vector; The resulting code parsed by SWIG is then: %{ typedef vector intvec; %} class intvec { int *data; int sz; public: intvec(int nitems); int *get(int n); ... }; typedef intvec vector; Note: the last typedef is non-standard C and is used by SWIG to provide an association between the name "intvec" and the template type "vector". CAUTION: This is an experimental feature and the first time SWIG has supported C++ templates. Error reporting is essential non-existent. It will probably break in certain cases. *** EXPERIMENTAL NEW FEATURE **** 8/15/2001: beazley Change to wrapping of multi-dimensional arrays. Arrays are now properly mapped to a pointer to an array of one less dimension. For example: int [10]; --> int * int [10][20]; --> int (*)[20]; int [10][20][30]; --> int (*)[20][30]; This change may break certain SWIG extensions because older versions simply mapped all arrays into a single pointer such as "int *". Although possibly unusual, the new version is correct in terms of the C type system. *** POTENTIAL INCOMPATIBILITY *** 8/06/2001: cheetah (william fulton) * [Java] Array setters generated for struct/class array members. 8/13/2001: beazley Many improvements to Tcl/Perl/Python modules to better work with multiple interface files and the %import directive. 8/13/2001: beazley Fixed up the behavior of %import in the Python module. SWIG no longer pollutes the module namespace by using 'from module import *' to refer to the other module. Instead, it does a proper 'import module'. Also, SWIG may work a lot better when importing modules that include references to other imported modules. 8/13/2001: mkoeppe Added new typemap substitutions, generalizing those of the Guile-specific 5/27/2001 changes: * $descriptor is the same as SWIGTYPE$mangle, but also ensures that the type descriptor of this name gets defined. * $*type, $*ltype, $*mangle, $*descriptor are the same as the variants without star, but they REMOVE one level of pointers from the type. (This is only valid for pointer types.) * $&type, $<ype, $&mangle, $&descriptor are the same as the variants without ampersand, but they ADD one level of pointers to the type. The Guile-specific substitution $basedescriptor was removed because it was useless. 8/12/2001: beazley The %extern directive is now deprecated and withdrawn. The purpose of this directive was to import selected definitions from other interface files and headers. However, the same functionality is better handled through %import. This leaves SWIG with two file inclusion directives: %include filename - Inserts into current interface %import filename - Import types and classes from another module *** POTENTIAL INCOMPATIBILITY *** 8/09/2001: beazley Added new support for wrapping C/C++ callback functions. A common problem with some C libraries is that many functions take a function pointer as an argument. For example: int do_op(..., int (*op)(int,int), ...); Unfortunately, the only way to call such a function is to pass it a function pointer of some compatible type. In previous versions of SWIG, you had to solve this problem with some really gross hacks. For example, if you wanted to use the following function as a callback, int foo(int, int); you had to install a pointer to it as a constant. For example: %constant int (*FOO)(int,int) = foo; or const int (*FOO)(int,int) = foo; or if you had a really old SWIG version: typedef int (*OP_FUNC)(int,int); int do_op(..., OP_FUNC, ...); const OP_FUNC FOO = foo; Now, you can do one of two things: %constant int foo(int,int); This creates a constant 'foo' of type int (*)(int,int). Alternatively, you can do this: %callback("%s"); int foo(int,int); int bar(int,int); %nocallback; In this case, the functions are installed as constants where the name is defined by the format string given to %callback(). If the names generated by the format string differ from the actual function name, both a function wrapper and a callback constant are created. For example: %callback("%(upper)s"); int foo(int,int); int bar(int,int); %nocallback; Creates two wrapper functions 'foo', 'bar' and additionally creates two callback constants 'FOO', 'BAR'. Note: SWIG still does not provide automatic support for writing callback functions in the target language. *** NEW FEATURE *** 8/06/2001: cheetah (william fulton) * struct nesting fixes as per SF bug #447488. 8/03/2001: beazley The %name directive now applies to constants created with #define and %constant. However, most language modules were never written to support this and will have to be modified to make it work. Tcl, Python, and Perl modules are working now. *** NEW FEATURE *** 8/03/2001: beazley Massive changes and simplification of C declaration parsing. Although SWIG is still not a full C parser, its ability to handle complex datatypes including pointers to functions and pointers to arrays has been vastly improved. 8/03/2001: cheetah (william fulton) * Distribution fixes: autoconf no longer needed to install SWIG. 8/02/2001: beazley Removed two undocumented parsing features. SWIG no longer supports out-of-class static function or variable declarations. For example: static int Foo::bar; This feature may return if there is sufficient demand. However, since SWIG is most often used with header files, it is more likely for these definitions to be included in the class definition. *** POTENTIAL INCOMPATIBILITY *** 8/02/2001: cheetah (william fulton) * Cleanup of the GIFPlot examples. Upgraded Java GIFPlot example. 8/01/2001: cheetah (william fulton) * [Java] Efficiency changes: _cPtr used where possible rather than getCPtr(). Bug fixes for inheritance - derived class sometimes didn't delete the c memory when _delete() was called. * [Java] Abstract c++ classes are wrapped with a java abstract shadow class. Also a pure virtual function is mapped with an abstract method. * The default output file has always been _wrap.c. It is now _wrap.cxx if the -c++ commandline option is passed to swig. This has been done as otherwise c++ code would appear in a c file. *** POTENTIAL INCOMPATIBILITY *** 7/31/2001: beazley Modified the %constant directive to be more C-like in syntax. The syntax is now: %constant NAME = VALUE; %constant TYPE NAME = VALUE; For example: %constant Foo *Bar = &Spam; A more subtle case is as follows: %constant int (*FOO)(int,int) = blah; *** POTENTIAL INCOMPATIBILITY *** Modules that were using the %constant directive directly will need to be modified. 7/30/2001: beazley Removed obscure and undocumented form of the %inline directive: %inline int blah(int a, int b) { ... } *** POTENTIAL INCOMPATIBILITY *** (note: this feature was never documented and is withdrawn) 7/30/2001: beazley Removed support for functions with no explicitly declared return type. For example: foo(int); In C, such functions were implicitly assumed to return an 'int'. In C++, this is illegal. Either way, it's considered bad style. Removing support for this in SWIG will simplify certain issues in parsing. *** POTENTIAL INCOMPATIBILITY *** 7/30/2001: mkoeppe * Partial merge from the CVS trunk. The Source/DOH directory and most of the Source/Swig directory is up-to-date now. * [Guile] %scheme is now a macro for %insert("scheme"). New syntax: %scheme "FILENAME"; New syntax: %scheme %{ SCHEME-CODE %} New macros %multiple_values, %values_as_list, %values_as_vector. 7/29/2001: beazley %readonly and %readwrite have been turned into SWIG pragmas. %pragma(swig) readonly and %pragma(swig) readwrite. Macros are used to provide backwards compatibility. 7/29/2001: beazley Minor changes to %pragma directive. %pragma must always be directed to a specific language. For example: %pragma(swig) make_default; %pragma(perl5) include = "blah.i"; Also extended the pragma directive to allow code blocks %pragma(foo) code = %{ ... some code ... %} *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Change to the way 'const' variables are wrapped. In previous versions of SWIG, a 'const' variable was wrapped as a constant. Now, 'const' variables are wrapped as read-only variables. There are several reasons for making this change, mostly pertaining to subtle details of how 'const' actually works. This will probably break old interfaces that used 'const' to create constants. As a replacement, consider using this: const int a = 4; ===> %constant int a = 4; *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Reorganization and simplification of type parsing. Types with 'const' should work correctly now. 7/29/2001: beazley Most swig directives related to the documentation system are now deprecated. 7/29/2001: beazley Removed support for Objective-C in order to simplify parser reconstruction. Will return if there is sufficient demand. *** POTENTIAL INCOMPATIBILITY *** 7/29/2001: beazley Code inclusion has been modified in the parser. A common directive %insert is now used for everything. This inserts a file into the output: %insert(header) "foo.swg" This inserts some inline code into the output %insert(header) %{ ... some code ... %} There are five predefined targets for the insert directive: "header" - Header section of wrapper file "runtime" - Runtime section of wrapper file "wrapper" - Wrapper section "init" - Initialization function "null" - Nothing. Discard. The following directives are still supported, but are now defined in terms of macros: %{ ... %} -> %insert(header) %{ ... %} %init %{ ... %} -> %insert(init) %{ ... %} %wrapper %{ ... %} -> %insert(wrapper) %{ ... %} %runtime %{ ... %} -> %insert(runtime) %{ ... %} Language modules can define new named targets by using the C API function Swig_register_filebyname() (see main.cxx). For example, if you wanted to expose a shadow class file, you could do this: Swig_register_filebyname("shadow", f_shadow); Then in the interface file: %insert(shadow) %{ ... %} Note: this change should not affect any old interfaces, but does open up new possibilities for enhancements. 7/29/2001: beazley SWIG now always includes a standard library file 'swig.swg'. This file defines a large number of macro definitions that define the behavior of various SWIG directives. Previously, all SWIG directives were handled as special cases in the parser. This made the parser a large bloated mess. Now, the parser is stripped down to a few simple directives and macros are used to handle everything else. 7/26/2001: cheetah (william fulton) * Fixes for Sourceforge bug #444748 - new testcase cpp_static: [TCL] Class with just static member variable/function fix [Java] Fixed static variables support [Ruby] Static variables workaround removed 7/27/2001: mkoeppe * stype.c (SwigType_default): Strip qualifiers first. The default type of "int * const" is now "SWIGPOINTER *". * main.cxx: Define "__cplusplus" in SWIG's preprocessor if in C++ mode. * [Guile]: Added some support for arrays and C++ references, fixing the "constant_pointers" test case. * Moved most tests from the old Guile-specific test-suite to the new test-suite. Also moved perl5/pointer-cxx example there. 7/26/2001: cheetah (william fulton) * Test-suite added. * Initial testcases: constant_pointers cpp_enum defines sizeof_pointers unions virtual_destructor * Make clean improvements. 7/24/2001: cheetah (william fulton) * [Java] Underscores in the package name and/or module name no longer give linking problems. 7/17/2001: cheetah (william fulton) * More parser bug fixes for constant pointers 7/19/2001: mkoeppe * [Guile] Aesthetic improvement in variable wrappers. 7/18/2001: beazley * Fixed core-dump problem in pointer library when freeing character arrays. SF Bug [ #415837 ] pointer lib core dump 7/18/2001: beazley * Fixed problem with default destructors and shadow classes. SF bug #221128. 7/18/2001: beazley * To provide better line-number tracking in interfaces with lots of macros, special locator comments are now generated by the SWIG preprocessor. For example: /*@foo.i,42,BLAH@*/expanded macro/*@@*/ The first /*@...@*/ sequence sets the context to point to the macro code. The /*@@*/ comment terminates the context. The SWIG parser should ignore all of the locator comments as should the C compiler (should such comments end up in generated wrapper code). 7/18/2001: mkoeppe * The parser now handles severely constified types in typemaps. This introduced a new shift/reduce conflict, but only with a heuristic function-pointer catch-all rule. * [Guile]: Added typemaps for severely constified types. * Fixed the "template-whitespace" problem by canonicalizing whitespace, especially around angle brackets and commas. 7/17/2001: mkoeppe * [Guile]: A Scheme file is emitted if the -scmstub FILE.SCM command-line option is used. The %scheme directive (implemented as a macro for a pragma) allows to insert arbitrary code here. In "simple" and "passive" linkage, the file gets filled with define-module and export declarations. 7/17/2001: cheetah (william fulton) * Parser bug fix to support constant pointers, eg int* const ptr. Fixed everywhere - variables, parameters, return types etc. Note that when wrapping a constant pointer variable only the getter is generated. 7/17/2001: mkoeppe * Fixed SF bug #441470 (#define X "//" would not be parsed, see test-suite entry "preproc-1"), reported by T. W. Burton . * Changed the type of character constants to "char", rather than "char *". Changed the individual language modules to keep the old behaviour, except for the Guile module, where it is desired to make them Scheme characters. This fixes SF bug #231409, test-suite entry "char-constant". * Applied patch for DOH/Doh/memory.c by Les Schaffer (avoid required side effects in assert). 7/17/2001: cheetah (william fulton) * Bug fix in parser for virtual destructor with void as parameter * Bug fix in parser #defines embedded within classes/structs/unions Consequently %constant can now also be placed within a struct/class/union. * Bug fix in parser to allow sizeof(*I_am_a_pointer) within a #define 7/16/2001: mkoeppe * Added changes for the Macintosh contributed by Luigi Ballabio . * Some "const" fixes in the code. * [Guile]: Made the constant-wrapper functions much shorter. 7/13/2001: mkoeppe * [Guile]: Some "const" fixes for Guile version 1.3.4. * Handle anonymous arguments with default values and static array members of classes. Both bugs reported by Annalisa Terracina ; see the files Examples/guile/test-suite/static-array-member.i and anonymous-arg.i. Version 1.3.6 (July 9, 2001) ============================= 7/09/2001: cheetah (william fulton) * GIFPlot examples: FOREGROUND and BACKGROUND definition missing after TRANSPARENT #define fix in GIFPlot 7/03/2001: beazley Fixed up the version numbers so that the release is known as 1.3.6. All future releases should have a similar version format. 7/02/2001: mkoeppe * [Python]: Prevent the problem of self.thisown not being defined if the C++ class constructor raised an exception. Thanks to Luigi Ballabio . 6/29/2001: mkoeppe * More portability fixes; fixed "gcc -Wall" warnings. 6/29/2001: cheetah (william fulton) * GIFPlot examples: TRANSPARENT #define multiple times on Solaris (clashes with stream.h). * Multiple definition bug fix for shadow classes. The perl and python modules had workarounds which have been replaced with fixes in the core. Many of the Language::cpp_xxxx functions now set a flag which the derived classes can access through is_multiple_definition() to see whether or not code should be generated. The code below would have produced varying degrees of incorrect shadow class code for the various modules: class TestClass { public: TestClass() {} TestClass(int a) {} ~TestClass() {} unsigned long xyz(short k) {} unsigned long xyz(int n) {} static void static_func() {} static void static_func(int a) {} }; void delete_TestClass(int a); 6/27/2001: mkoeppe * [Perl] Another const-related portability fix. 6/26/2001: cheetah (william fulton) * [Java] Added in cpp_pragma() support with a host of new pragmas - see jswig.html. These are designed for better mixing of Java and c++. It enables the user to specify pure Java classes as bases and/or interfaces for the wrapped c/c++. * [Java] Old pragmas renamed. Warning given for the moment if used. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 6/25/2001: mkoeppe * Incorporated more build changes contributed by Wyss Clemens for swig/ruby on cygwin. 6/20/2001: cheetah (william fulton) * Makefile mods so that 'make check' uses the swig options in the makefiles * [Java] Removed Generating wrappers message * [Java] NULL pointer bug fix * [Java] Bug fix for Kaffe JVM 6/20/2001: mkoeppe * SWIG_TypeQuery from common.swg now returns a swig_type_info* rather than a void*. This fixes a problem when using pointer.i and C++, as illustrated by the new test-suite example perl5/pointer-cxx. * Portability fixes (const char *). * Incorporated build changes contributed by Wyss Clemens , which make swig runnable on cygwin. 6/19/2001: cheetah (william fulton) * [Java] Bug fix for SF bug #211144. This fix is a workaround until fixed in the core. 6/19/2001: mkoeppe * [Guile]: Portability fixes for use with the Sun Forte compilers. * [Tcl]: Portability fix (const char *). * [Tcl]: Configure now first tries to find a tclConfig.sh file in order to find the Tcl include directory, library location and library name. * [Python]: Added a few possible library locations. 6/18/2001: mkoeppe * [Guile]: Don't call scm_c_export if nothing is to be exported. Don't warn on %module if module has been set already (this frequently occurs when %import is used). 6/16/2001: mkoeppe * [Guile]: New "passive" linkage, which is appropriate for multi-module extensions without Guile module magic. 6/15/2001: mkoeppe * [Guile]: Fixed printing of smobs (space and angle were missing). * Properly generate type information for base classes imported with the %import directive. Thanks to Marcelo Matus for the report and the patch; this closes SF bug #231619; see also Examples/guile/test-suite/import*. * [Guile]: Fix casting between class and base class; the runtime type system had it the wrong way around; see Examples/guile/test-suite/casts.i * Make typemaps for SWIGPOINTER * with arg name take precedence over those without arg name, to match normal typemap precedence rules. * Fixed the random-line-numbers problem reported as SF bug #217310; thanks to Michael Scharf . * [Guile]: Handle the %name and %rename directives. * New syntax: %name and %rename now optionally take double quotes around the scripting name. This is to allow scripting names that aren't valid C identifiers. 6/14/2001: beazley Made a minor change to the way files are loaded in order to get file/line number reporting correct in the preprocessor. 6/14/2001: mkoeppe * The parser now understands the (non-standard) "long long" types. It is up to the individual language modules to provide typemaps if needed. Reported by Sam Steingold, SF bug #429176. * The parser now understands arguments like "const int * const i". This fixes SF bug #215649. * Fixed the Guile test-suite. 6/13/2001: mkoeppe Partial merge from the CVS trunk at tag "mkoeppe-merge-1". This covers the following changes: | 01/16/01: ttn | Wrote table of contents for Doc/engineering.html. Added section | on CVS tagging conventions. Added copyright to other docs. | 9/25/00 : beazley | Modified the preprocessor so that macro names can start with a '%'. | This may allow new SWIG "directives" to be defined as macros instead | of having to be hard-coded into the parser. | | *** Also a yet-to-be-documented quoting mechanism with backquotes | *** has been implemented? 6/13/2001: mkoeppe * When configure does not find a language, don't use default paths like /usr/local/include; this only causes build problems. * New directory: Examples/Guile/test-suite, where a few bugs in 1.3a5 are demonstrated. * Handle C++ methods that have both a "const" and a "throw" directive (see Examples/Guile/test-suite/cplusplus-throw.i); thanks to Scott B. Drummonds for the report and the fix. * Handle C++ pointer-reference arguments (like "int *& arg") (see Examples/Guile/test-suite/pointer-reference.i, reported as SF bug #432224). * [Ruby] Fixed typo in rubydec.swg; thanks to Lyle Johnson! * Don't stop testing when one test fails. * [Guile, MzScheme] Don't print "Generating wrappers...". 6/12/2001: mkoeppe [Guile] VECTORLENINPUT and LISTLENINPUT now have separate list length variables. TYPEMAP_POINTER_INPUT_OUTPUT attaches argument documentation involving SCM_TYPE to the standard pointer typemaps. INOUT is now an alias for BOTH. 6/12/2001: cheetah (william fulton) Some Java documentation added. [Java] Fixed bugs in import pragma and shadow pragma. 6/12/2001: mkoeppe Fix declarations of SWIG_define_class (Lib/ruby/rubydec.swg) and SWIG_TypeQuery (Lib/common.swg). Thanks to Lyle Johnson for the patches. 6/11/2001: mkoeppe [Guile] Use long instead of scm_bits_t; this makes the generated wrapper code compatible with Guile 1.3.4 again. Thanks to Masaki Fukushima for pointing this out. 6/11/2001: cheetah (william fulton) The generic INSTALL file from autoconf added. Few changes to README file. 6/11/2001: mkoeppe Fixed typo in Makefile.in; thanks to Greg Troxel . 6/08/2001: cheetah (william fulton) make check works again. Examples/GIFPlot configure generated by top level autoconf now. 6/08/2001: mkoeppe Another build change: The new script autogen.sh runs autoconf in the appropriate directories. The top-level configure also configures in Examples/GIFPlot. 6/07/2001: mkoeppe Made the Makefile work with non-GNU make again. 6/07/2001: cheetah (william fulton) [Java] Class/struct members that are arrays of pointers to classes/structs - Shadow class's get/set accessors now use Java classes instead of longs (pointers). [Java] Shadow classes will now clean up memory if function return type is a class/struct. [Java] New example called reference based on the same example from other modules. 6/06/2001: mkoeppe New configure option --with-release-suffix allows for attaching a suffix to the swig binary and the swig runtime libraries. Minor changes to the build system. "swig -swiglib" works again. If invoked with the new option "-ldflags", SWIG prints a line of linker flags needed to link with the runtime library of the selected language module. 6/06/2001: mkoeppe [Guile] gswig_list_p is an int, not a SCM. This typo caused warnings when compiling with a Guile configured with strict C type checking. In INPUT and BOTH typemaps generated by the SIMPLE_MAP macro, use the SCM_TO_C function to convert from Guile to C (rather than C_TO_SCM). Use scm_intprint to print pointers (rather than sprintf). Allow using "-linkage" instead of "-Linkage". 6/05/2001: cheetah (william fulton) [Java] Mods for using inherited c++ classes from Java [Java] New example called class based on the same example from other modules 6/05/2001: cheetah (william fulton) [Java] destructor (_delete()) was not aware of %name renaming [Java] extends baseclass did not know about %name renaming [Java] extends baseclass did extend even when the baseclass was not known to swig [Java] sometimes enum-declarations occurred before the Java class declaration [Java] unrelated enum initialisations no longer appear in Java class [Java] if module ends in '_' correct JNI names are now produced 6/04/2001: cheetah (william fulton) [Java] Shadow class mods - Modified constructor replaces newInstance(). _delete() now thread safe. getCPtr() replaces _self. _selfClass() removed as now redundant. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** [Java] Not all output java files had SWIG banner. New banner. [Java] Shadow class finalizers are output by default: Command line option -finalize deprecated and replaced with -nofinalize. *** POTENTIAL INCOMPATIBILITY FOR JAVA MODULE *** 6/ 1/2001: mkoeppe [Guile] Cast SCM_CAR() to scm_bits_t before shifting it. This is required for compiling with a Guile configured with strict C type checking. 6/ 1/2001: mkoeppe Added configure option "--with-swiglibdir". 5/31/2001: mkoeppe [Guile] Support multiple parallel lists or vectors in the typemaps provided by list-vector.i. New typemaps file, pointer-in-out.i. 5/25/2001: cheetah (william fulton) [Java] HTML update for examples. 5/28/2001: mkoeppe Minor changes to the build system. Added subdirectory for Debian package control files. 5/28/2001: mkoeppe [Guile] Build a runtime library, libswigguile. 5/28/2001: mkoeppe [Guile] New typemap substitution $*descriptor. Use the {} syntax, rather than the "" syntax for the standard typemaps, in order to work around strange macro-expansion behavior of the SWIG preprocessor. This introduces some extra braces. 5/27/2001: mkoeppe [Guile] Handle pointer types with typemaps, rather than hard-coded. New typemap substitutions $descriptor, $basedescriptor; see documentation. Some clean-up in the variable/constants wrapper generator code. New convenience macro SWIG_Guile_MustGetPtr, which allows getting pointers from smobs in a functional style. New typemap file "list-vector.i", providing macros that define typemaps for converting between C arrays and Scheme lists and vectors. 5/25/2001: cheetah (william fulton) [Java] STL string moved into its own typemap as it is c++ code and it break any c code using the typemaps.i file. - Fixes for wrappers around global variables - applies to primitive types and user types (class/struct) and pointers to these. - Structure member variables and class public member variables getters and setters pass a pointer to the member as was in 1.3a3 and 1.1 (1.3a5 was passing by value) - Parameters that were arrays and return types were incorrectly being passed to create_function() as pointers. - Fix for arrays of enums. [Java] Updated java examples and added two more. [Java] Java module updated from SWIG1.3a3 including code cleanup etc. [Java] enum support added. [Java] Array support implemented [Java] Shadow classes improved - Java objects used rather than longs holding the c pointer to the wrapped structure/c++class 5/22/2001: mkoeppe [Guile] Fixed extern "C" declarations in C++ mode. Thanks to Greg Troxel . 5/21/2001: mkoeppe [Guile] New linkage "module" for creating Guile modules for Guile versions >= 1.5.0. 4/18/2001: mkoeppe [MzScheme] Added typemaps for passing through Scheme_Object pointers. 4/9/2001 : mkoeppe [MzScheme] Added typemaps for `bool'. Inclusion of headers and support routines is now data-driven via mzscheme.i. Headers come from the new file mzschemdec.swg. Don't abort immediately when a type-handling error is reported. When searching for typemaps for enums, fall back to using int, like the Guile backend does. Support char constants. Emit correct wrapper code for variables. 3/12/2001: mkoeppe [Guile] Fixed typemaps for char **OUTPUT, char **BOTH. 3/2/2001 : mkoeppe [Guile] Every wrapper function now gets a boolean variable gswig_list_p which indicates whether multiple values are present. The macros GUILE_APPEND_RESULT, GUILE_MAYBE_VALUES and GUILE_MAYBE_VECTOR use this variable, rather than checking whether the current return value is a list. This allows for typemaps returning a list as a single value (a list was erroneously converted into a vector or a multiple-value object in this case). 3/1/2001 : mkoeppe [Guile] Added support for returning multiple values as vectors, or passing them to a muliple-value continuation. By default, multiple values still get returned as a list. 3/1/2001 : mkoeppe [Guile] Added a "beforereturn" pragma. The value of this pragma is inserted just before every return statement. 3/1/2001 : mkoeppe [Guile] Added support for Guile 1.4.1 procedure documentation formats, see internals.html. 2/26/2001: mkoeppe [Guile] Made the wrapper code compile with C++ if the "-c++" command-line switch is given. Thanks to . 2/26/2001: mkoeppe [Guile] Now two type tables, swig_types and swig_types_initial, are used, as all other SWIG language modules do. This removes the need for the tricky construction used before that the broken Redhat 7.0 gcc doesn't parse. Reported by . 2/26/2001: mkoeppe [Guile] Fixed typemaps for char *OUTPUT, char *BOTH; a bad free() would be emitted. Added typemap for SCM. Version 1.3 Alpha 5 =================== 9/19/00 : beazley [Python] Python module generates more efficient code for creating the return value of a wrapper function. Modification suggested by Jon Travis. 9/19/00 : beazley Library files specified with the -l option are now included at the end of the interface file (reverting to the old behavior). 9/19/00 : beazley Fixed some problems with enum handling. enums are now manipulated as 'int', but cast into the enum type when values are passed to the corresponding C function. 9/19/00 : mkoeppe [Guile] Removed "-with-smobs" command-line option, as this is the default now. Added "-emit-setters" command-line option, which turns on generating procedures-with-setters; see internals.html. 9/18/00 : mkoeppe Incorporated patch #101430, fixing bugs in the Guile module: 1. Some arguments were erroneously taken as *optional* arguments when ignored arguments were present. 2. Guile 1.3.4 was not supported since functions introduced in Guile 1.4 were used. 3. Added handling of `const char *'. 9/17/00 : beazley Fixed problem with failed assertion and large files. 9/17/00 : beazley Fixed problem with the '%' character appearing in added methods and function bodies. Preprocessor bug. Version 1.3 Alpha 4 (September 4, 2000) ======================================= 9/3/00 : ttn Added instructions for maintainers in Examples/README on how to make examples also be useful in the testing framework. Also, "make check" now uses ./Lib by via env var `SWIG_LIB'. This is overridable like so: make chk-swiglib=/my/experimental/swig/Lib check 9/3/00 : beazley Added $typemap variable to typemaps. This gets replaced with a string indicating the typemap that is applied. Feature request from rsalz. 9/3/00 : beazley Experimental optimization to code generation for virtual member functions. If you have two classes like this: class A() { virtual void foo(); } class B() : public A { virtual void foo(); } Swig now will generate a single wrapper function for this A_foo(A *a) { a->foo(); } and use it as the implementation of both A_foo() and B_foo(). This optimization only takes place if both methods are declared as virtual and both take identical parameters. *** EXPERIMENTAL FEATURE *** 9/3/00 : beazley Restored the "memberin" typemap for setting structure members. Unlike the old version, the new version is expanded inline in the wrapper function allowing access to scripting language internals (a sometimes requested feature). The "memberout" typemap is gone. Use the "out" typemaps instead. *** POTENTIAL INCOMPATIBILITY *** 9/3/00 : beazley Attribute set methods no longer return the value of a member. For example: struct Foo { int x; ... } now gets set as follows: void Foo_x_set(Foo *f, int x) { f->x = x; } In SWIG1.1 it used to be this: int Foo_x_set(Foo *f, int x) { return (f->x = x); } This has been changed due to the complexity created by trying to do this with more exotic datatypes such as arrays. It also complicates inlining and handling of the "memberin" typemap. *** POTENTIAL INCOMPATIBILITY *** 9/2/00 : beazley Removed the ptrcast() and ptrmap() functions from the pointer.i library file. Old implementation is incompatible with new type system. *** POTENTIAL INCOMPATIBILITY *** 9/2/00 : beazley New runtime function SWIG_TypeQuery(const char *name) added. This function can be used to extract the type info structure that is used for type-checking. It works with either the nice C name or mangled version of a datatype. For example: swig_type_info *ty = Swig_TypeQuery("int *"); swig_type_info *ty = Swig_TypeQuery("_p_int"); This is an advanced feature that has been added to support some exotic extension modules that need to directly manipulate scripting language objects. *** NEW FEATURE *** 9/2/00 : beazley New directive %types() added. This is used to explicitly list datatypes that should be included in the runtime type-checking code. Normally it is never necessary to use this but sometimes advanced extensions (such as the pointer.i library) may need to manually add types to the type-checker. *** NEW FEATURE *** 8/31/00 : beazley Improved handling of string array variables. For example, a global variable of the form "char name[64]" is automatically managed as a 64 character string. Previously this didn't work at all or required the use of a special typemap. *** NEW FEATURE (Tcl, Perl, Python) *** 8/31/00 : ttn Added Makefile target `check-c++-examples', which uses new files under Examples/C++ contributed by Tal Shalif. Now "make check" also does "make check-c++-examples". Also, expanded actions in `check-gifplot-example' and `check-aliveness'. 8/30/00 : mkoeppe Major clean-up in the Guile module. Added typemap-driven documentation system. Changed to handle more than 10 args. Updated and extended examples. *** NEW FEATURE *** 8/29/00 : beazley Added new %insert directive that inserts the contents of a file into a portion of the output wrapper file. This is only intended for use by writers of language modules. Works as follows: %insert(headers) "file.swg"; %insert(runtime) "file.swg"; %insert(wrappers) "file.swg"; %insert(init) "file.swg"; *** NEW FEATURE *** 8/29/00 : beazley Added new %runtime directive which includes code into the runtime portion of the wrapper code. For example: %runtime %{ ... some internal runtime code ... %} There is no practical reason for ordinary users to use this feature (almost everything can be done using %{ ... %} instead). However, writers of language modules may want to use this in language configuration files. *** NEW FEATURE *** 8/28/00 : beazley Typemaps can now be specified using string literals like this: %typemap(in) int "$target = SvIV($source);"; When code is specified like this, it is *NOT* enclosed inside a local scope (as with older typemap declarations). Note: character escape sequences are interpreted in the code string so if you want to include a quote or some other special character, make sure you use a (\). *** NEW FEATURE *** 8/27/00 : beazley Typemaps have been modified to follow typedef declarations. For example, if you have this: typedef int Number; %typemap(in) int { ... get an integer ... } void foo(Number a); The typemap for 'int' will be applied to the argument 'Number a'. Of course, if you specify a typemap for 'Number' it will take precedence (nor will it ever be applied to an 'int'). *** POTENTIAL INCOMPATIBILITY *** 8/27/00 : beazley Default typemap specification has changed. In older versions of swig, you could do this: %typemap(in) int SWIG_DEFAULT_TYPE { ... } To specify the default handling of a datatype. Now that SWIG follows typedef declarations, this is unnecessary. Simply specifying a typemap for 'int' will work for all variations of integers that are typedef'd to 'int'. Caveat, specifying the default behavior for pointers, references, arrays, and user defined types is a little different. This must be done as follows: %typemap() SWIGPOINTER * { ... a pointer ... } %typemap() SWIGREFERENCE & { ... a reference ... } %typemap() SWIGARRAY [] { ... an array ... } %typemap() SWIGTYPE { ... a user-defined type (by value) ... } *** POTENTIAL INCOMPATIBILITY *** 8/15/00 : dustin The file swig-1.3a1-1.spec has been added to the Tools directory. It can be used to build a redhat package for SWIG, although it will need to be updated for the next public release. 8/15/00 : beazley Typemaps have been completely rewritten. Eventually they may be replaced with something better, but for now they stay. However, there are a number of a significant changes that may trip some people up: 1. Typemap scoping is currently broken. Because of this, the following code won't work. %typemap(in) blah * { ... } class Foo { ... int bar(blah *x); } %typemap(in) blah *; /* Clear typemap */ (this breaks because the code for the class Foo is actually generated after the entire interface file has been processed). This is only a temporary bug. 2. In SWIG1.1, the %apply directive worked by performing a very complex type-aliasing procedure. From this point on, %apply is simply a generalized typemap copy operation. For example, %apply double *OUTPUT { double *x, double *y }; Copies *ALL* currently defined typemaps for 'double *OUTPUT' and copies them to 'double *x' and 'double *y'. Most people probably won't even notice this change in %apply. However, where it will break things is in code like this: %apply double *OUTPUT { double *x }; %typemap(in) double *OUTPUT { ... whatever ... } void foo(double *x); In SWIG1.1, you will find that 'foo' uses the 'double *OUTPUT' rule even though it was defined after the %apply directive (this is the weird aliasing scheme at work). In SWIG1.3 and later, the 'double *OUTPUT' rule is ignored because it is defined after the %apply directive. 3. The %clear directive has been modified to erase all currently defined typemaps for a particular type. This differs from SWIG1.1 where %clear only removed rules that were added using the %apply directive. 4. Typemap matching is now performed using *exact* types. This means that things like this %typemap(in) char * { } %typemap(in) const char * { } are different typemaps. A similar rule applies for pointers, arrays, and references. For example: %typemap(in) double * { } used to apply to 'double &', 'double []', Now, it only applies to 'double *'. If you want a 'double &', you'll need to handle that separately. 5. Array matching has been simplfied. In SWIG1.1, array matching was performed by trying various combinations of dimensions. For example, 'double a[10][20]' was matched as follows: double [10][20] double [ANY][20] double [10][ANY] double [ANY][ANY] In SWIG1.3, only the following matches are attempted: double [10][20] double [ANY][ANY] On the positive side, typemap matching is now *significantly* faster than before. *** POTENTIAL INCOMPATIBILITY *** 8/15/00 : beazley Secret developer feature. Since datatypes are now represented as strings internally, you can bypass limitations of the parser and create a wild datatype by simply enclosing the raw string encoding in backticks (``) and sticking it in the interface file anywhere a type is expected. For example, `a(20).a(10).p.f(int,int)`. This feature is only intended for testing (i.e., you want to see what happens to your language module if it gets a reference to a pointer to an array of pointers to functions or something). *** SICK HACK *** 8/14/00 : beazley Completely new type-system added to the implementation. More details later. 8/11/00 : beazley Cleaned up some of the I/O handling. SWIG no longer generates any temporary files such as _wrap.wrap, _wrap.ii, _wrap.init. Instead, these "files" are kept around in memory as strings (although this is transparent to language modules). 8/4/00 : ttn Added Makefile target "check" and variants. This can be used like "make check" or, to explicitly skip a language LANG: "make skip-LANG=true check". LANG is skipped automatically if ./configure determines that LANG support is insufficient. Currently, the check is limited to doing the equivalent of "make all" in some of the Examples directories. This should be expanded both horizontally (different types of tests) and vertically (after "make all" in an Examples subdir succeeds, do some additional tests with the resulting interpreter, etc). 8/4/00 : ttn Added Makefile target "distclean", which deletes all the files ./configure creates, including config.status and friends. 8/3/00 : harcoh java changes??? [todo: document changes] 7/23/00 : beazley Typemaps have been modified to key off of the real datatypes used in the interface file. This means that typemaps for "const char *" and "char *" will be difference as will typemaps for "Vector" and "Vector *." *** POTENTIAL INCOMPATIBILITY *** This is likely to break interfaces that rely on the odd type handling behavior of typemaps in SWIG1.1--especially with respect to interfaces involving pass-by-value. 7/23/00 : beazley New %constant directive. This directive can be used to create true constants in the target scripting language. It's most simple form is something like this: %constant FOO 42; In this case, the type is inferred from the syntax of the value (in reality, all #define macros are translated into directives of this form). An expanded version is as follows: %constant(Foo *) FOO = &FooObj; In this case, an explicit type can be specified. This latter form may be useful for creating constants that used to be specified as const Foo *FOO = &FooObj; (which are now treated as variables). *** EXPERIMENTAL FEATURE *** The syntax may change in the final release. 7/23/00 : beazley Modified the parser so that variable declarations of the form "const type *a" are handled as variables, not constants. Note: SWIG1.1 handled this case erroneously because const char *a is a pointer variable that can be reassigned. *** POTENTIAL INCOMPATIBILITY *** Note: just because this is the "right" way to do things, doesn't mean it's the most appropriate interpretation. I suspect that many C programmers might use 'const char *' with the intent of creating a constant, without realizing that they've created a reassignable global variable. 7/23/00 : beazley The C/C++ wrapping layer has been completely redesigned and reimplemented. This change should iron out a few rough spots with the handling of datatypes. In addition, the wrapper code is somewhat cleaner. *** POTENTIAL INCOMPATIBILITY *** This change may break interfaces that involve subtle corner-cases with typemaps and the %addmethods directive since some of these features had somewhat type handling behavior in SWIG1.1. 7/23/00 : beazley The "memberin" and "memberout" typemaps are gone for the moment, but they might return as soon as I figure out how to integrate them with some of the streamlined C wrapper functions. *** POTENTIAL INCOMPATIBILITY *** 7/22/00 : beazley A variety of old type handling functions such as print_type(), print_full(), print_mangle(), etc... are gone and have been replaced with a smaller set of functions. See the file Doc/internals.html for details. This will break all third party language modules. *** POTENTIAL INCOMPATIBILITY *** 7/20/00 : beazley Deprecated the %val and %out directives. These directives shouldn't really be necessary since typemaps can be used to achieve similar results. This also cleans up the handling of types and parameters quite a bit. *** POTENTIAL INCOMPATIBILITY *** 7/20/00 : ttn Fixed unspecified-module bug in Guile support and removed more non-"with-smobs" functionality using patches submitted by Matthias Koeppe. Re-enable recognition of "-with-smobs" (with no effect since we use smobs by default now) for the time being. After the 1.3a4 release, this option will signal an error. 7/17/00 : ttn Fixed NULL-input bug in parameter list handling. Reported by Matthias Koeppe. 7/12/00 : beazley Fixed memory leak in Python type-checking code. Reported by Keith Davidson. Bug #109379. 7/10/00 : beazley Changed internal data structures related to function parameters. 7/10/00 : beazley Fixed some bugs related to the handling of the %name() directive and classes in the Tcl module. Problem reported by James Bailey. 7/10/00 : beazley Fixed parsing and enum handling problems with character constants. Reported by Greg Kochanski. 7/10/00 : beazley Removed WrapperFunction class from the core and updated the language module. This will break third party modules. *** POTENTIAL INCOMPATIBILITY *** 7/9/00 : beazley Implementation of SWIG no longer makes use of C++ operator overloading. This will almost certainly break *all* third party language modules that are not part of the main SWIG CVS tree. Sorry. *** POTENTIAL INCOMPATIBILITY *** 7/8/00 : beazley Removed the experimental and undocumented "build" typemap that was intended to work with multiple arguments. Simply too weird to keep around. Besides, a better replacement is in the works. 7/6/00 : ttn Removed non-"with-smobs" functionality (Guile support), i.e., "-with-smobs" is now the default and no longer needs to be specified on the command-line. 7/5/00 : ttn Incorporated Ruby support contributed by Masaki Fukushima. 6/28/00 : ttn Applied more-than-10-args bugfix patch contributed by Matthias Koeppe. 6/27/00 : beazley Rewrote some of the string handling and eliminated the C++ implementation (which is now just a wrapper). 6/27/00 : ttn Added Doc/index.html and Doc/internals.html. The target audience for the latter is new SWIG developers. Version 1.3 Alpha 3 (June 18, 2000) =================================== 6/18/00 : beazley Removed the naming.cxx, hash.cxx, and symbol.cxx files from the SWIG1.1 directory. Continued to migrate things away from the C++ base (although there's still a lot of work to do). 6/17/00 : beazley Added a few more examples to the Examples directory. Still need to do a lot of work on this. 6/16/00 : beazley Added -includeall to follow all #include statements in the preprocessor. 6/15/00 : beazley Tried to fix as many C++ warnings as possible when compiling with the Sun Workshop C++ compiler. Unfortunately, this means that there are a lot of statements that contain string literals of the form (char*)"Blah". 6/15/00: beazley A variety of cleanup and performance optimization in the low-level DOH library. This seems to result in a speedup of 50-100% for preprocessing and other related tasks. 5/10/00 : ttn Applied variable-wrapping bugfix patch contributed by Matthias Koeppe. 4/17/00 : ttn Updated MzScheme support contributed by Oleg Tolmatcev. We now use a `Scheme_Type'-based structure to wrap pointers. 4/11/00 : ttn Incorporated further Guile-support patch by Matthias Koeppe. Typemaps previously deleted have been re-added. There is now exception handling (see Doc/engineering.html). `SWIG_init' is now declared extern only for simple linkage. Some bugs were fixed. 4/06/00 : ttn Incorporated MzScheme support contributed by Oleg Tolmatcev. This includes new directories Lib/mzscheme and Examples/mzscheme. 4/03/00 : ttn Added Examples/guile and children. This is an adaptation of the same-named directory from the SWIG-1.1p5 distribution. Added Guile-specific section to Doc/engineering.html. 4/02/00 : ttn Incorporated new guilemain.i by Martin Froehlich. Incorporated Guile-support rewrite patch by Matthias Koeppe. The command line option "-with-smobs" enables implementation of pointer type handling using smobs, the canonical mechanism for defining new types in Guile. Previous implementation (using strings) is at the moment still supported but deprecated. At some point, "-with-smobs" will be the default and no longer required. 3/13/00 : beazley Added purify patches submitted by Ram Bhamidipaty. 3/02/00 : ttn Added support for different Guile "linkage" schemes. Currently, "-Linkage hobbit" works. Version 1.3 Alpha 2 (March 1, 2000) =================================== 2/29/00 : beazley Made SWIG ignore the 'mutable' keyword. 2/29/00 : beazley Incorporated some patches to the Perl5 module related to the -hide option and the destruction of objects. Patch submitted by Karl Forner. 2/27/00 : ttn Incorporated Guile support contributed by Matthias Koeppe. This includes a cpp macro in Lib/guile/guile.swg and the entire file Lib/guile/typemaps.i. 2/25/00 : ttn Modified configure.in and Makefile.in files to support non-local build (useful in multi-arch environments). 2/24/00 : ttn Incorporated Guile support contributed by Clark McGrew. This works with Guile 1.3, but since it depends heavily on the gh_ interface, it should work for all later versions. It has not been tested with versions before 1.3. WARNING: Code is unstable due to experimentation by ttn. 2/16/00 : beazley A variety of performance improvements to the Python shadow class code generation. Many of these result in substantial runtime performance gains. However, these have come at a cost of requiring the use of Python 1.5.2. For older versions, use 'swig -noopt -python' to turn off these optimization features. Version 1.3 Alpha 1 (February 11, 2000) ======================================= 2/11/00 : Added 'void' to prototype of Python module initializer. Reported by Mark Howson (1/20/00). 2/11/00 : beazley Modified the Python shadow class code to discard ownership of an object whenever it is assigned to a member of another object. This problem has been around for awhile, but was most recently reported by Burkhard Kloss (12/30/99). 2/11/00 : beazley Added braces around macros in the exception.i library. Reported by Buck Hodges (12/19/99) 2/11/00 : beazley Fixed bug in the constraints.i library. Reported by Buck Hodges (12/14/99) 2/11/00 : beazley The %native directive now generates Tcl8 object-style command calls. A full solution for Tcl7 and Tcl8 is still needed. Patch suggested by Mike Weiblen (11/29/99) 2/11/00 : beazley Modified the typemap code to include the $ndim variable for arrays. Patch provided by Michel Sanner (11/12/99). 2/11/00 : beazley Modified the Python module to raise a Runtime error if an attempt is made to set a read-only member of a shadow class. Reported by Michel Sanner (11/5/99). 2/10/00 : The documentation system has been removed. However, it is likely to return at some point in the future. 2/1/00 : Added a number of performance enhancements to the Python shadow classing and type-checking code. Contributed by Vadim Chugunov. 1. Remove _kwargs argument from the shadow wrappers when -keyword option is not specified. This saves us a construction of keyword dictionary on each method call. def method1(self, *_args, **_kwargs): val = apply(test2c.PyClass1_method1, (self,) + _args, _kwargs) return val becomes def method1(self, *_args): val = apply(test2c.PyClass1_method1, (self,) + _args) return val 2. Incorporate self into the _args tuple. This saves at least one tuple allocation per method call. def method1(self, *_args): val = apply(test2c.PyClass1_method1, (self,) + _args) return val becomes def method1(*_args): val = apply(test2c.PyClass1_method1, _args) return val 3. Remove *Ptr classes. Assume that we are SWIGging a c++ class CppClass. Currently SWIG will generate both CppClassPtr class that hosts all methods and also CppClass that is derived from the former and contains just the constructor. When CppClass method is called, the interpreter will try to find it in the CppClass's dictionary first, and only then check the base class. CppClassPtr functionality may be emulated with: import new _new_instance = new.instance def CppClassPtr(this): return _new_instance(CppClass, {"this":this,"thisown":0}) This saves us one dictionary lookup per call. The new module was first added in Python-1.5.2 so it won't work with older versions. I've implemented an alternative that achieves the same thing 4. Use CObjects instead of strings for pointers. Dave: This enhancements result in speedups of up to 50% in some of the preliminary tests I ran. 2/1/00 : Upgraded the Python module to use a new type-checking scheme that is more memory efficient, provides better performance, and is less error prone. Unfortunately, it will break all code that depends on the SWIG_GetPtr() function call in typemaps. These functions should be changed as follows: if (SWIG_GetPtr(string,&ptr,"_Foo_p")) { return NULL; } becomes if (SWIG_ConvertPtr(pyobj, &ptr, SWIG_TYPE_Foo_p) == -1) { return NULL; } Note: In the new implementation SWIG_TYPE_Foo_p is no longer a type-signature string, but rather an index into a type encoding table that contains type information. *** POTENTIAL INCOMPATIBILITY *** 1/30/00 : loic Conditionally compile experimental code with --enable-experiment configure flag. Fix .cvsignore to ignore configure & yacc generated files 1/28/00 : loic Apply automake everywhere Keep configure scripts so that people are not *forced* to autoconf Keep sources generated by yacc so that compilation without yacc is possible. Source/LParse/cscanner.c: change lyacc.h into parser.h to please default yacc generation rules. Use AC_CONFIG_SUBDIRS in configure.in instead of hand made script. Update all relevant .cvsignore to include .deps Fixed missing ; line 136 Source/Swig/swig.h 1/13/00 : beazley Fixed a number of minor end-of-file parsing problems in the preprocessor. 1/13/00 : beazley Added -freeze option that forces SWIG to freeze upon exit. This is only used as a debugging tool so that I can more easily examine SWIG's memory footprint. 1/13/00 : beazley Added patch to guile module for supporting optional arguments Patch contributed by Dieter Baron. 1/13/00 : loic Added .cvsignore, Examples/.cvsignore, Source/DOH/Doh/.cvsignore Source/SWIG1.1/main.cxx: Fixed -I handling bug Source/Modules1.1/java.cxx: fixed char* -> const char* warnings that are errors when compiling with gcc-2.95.2 Source/SWIG1.1/main.cxx: cast const char* to char* for String_replace token and rep should really be const. 1/12/00 : beazley Added Harco's Java modules. 1/12/00 : beazley Revoked the %ifdef, %ifndef, %endif, %if, %elif, and %else directives. These are no longer needed as SWIG now has a real preprocessor. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Moved the documentation modules from the SWIG directory to the Modules directory (where they really should have been to begin with). 1/12/00 : beazley Removed the -stat option for printing statistics. The statistics reporting was inadequate and mostly broken anyway. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the -t option for reading a typemap file. More trouble than it's worth. Just include typemaps at the top of the interface file. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the %checkout directive. *** POTENTIAL INCOMPATIBILITY *** 1/12/00 : beazley Removed the -ci option for file checkin. Too problematic to implement. Probably better to just put your SWIG library under CVS instead. *** POTENTIAL INCOMPATIBILITY ***. 1/11/00 : beazley Deleted the LATEX module. Sorry... Didn't know anyone who was using it. Besides, I'm looking to simplify the documentation system. *** POTENTIAL INCOMPATIBILITY *** 1/11/00 : beazley Modified the ASCII documentation module to use a .txt suffix for its output file instead of .doc. 1/11/00 : beazley Added the long-lost SWIG preprocessor back to the system. It should be enabled by default. Raw preprocessed output can be viewed using swig -E file.i. *** NEW FEATURE *** 1/11/00 : beazley and djmitche Completely reorganized the SWIG directory structure. The basic organization is now: Source/ SWIG source code Lib/ SWIG library files (swig_lib) Doc/ Documentation Examples/ Examples More directories will be added as needed. 12/08/99: Loic Dachary (loic@senga.org) Enhanced package handling for perl5 and c++. With new option -hide Foo::Bar, every perl5 object (Frob) is qualified by Foo::Bar::Frob. The package name is solely used to encapsulate C/C++ wrappers output in _wrap.c and the corresponding perl package in .pm. Note that a package name may contain :: (Frob::Nitz) and will be relative to the package name provided by -hide (Foo::Bar::Frob::Nitz). In *_wrap.c, SWIG_init macro is used. Was previously defined but not used and simplifies code. Added typemap(perl5,perl5in) and typemap(perl5,perl5out) that do the equivalent of typemap(perl5,in) and typemap(perl5,out) but contain perl code and applies to wrappers generated by -shadow. Lacking proper regression tests I used Examples/perl5/{c++,constraint,defarg,except, graph/graph[1234],multinherit,nested,shadow,simple,tree, typemaps/{argv,argv2,arraymember,database,file,ignore,integer, output,passref,reference,return}}/. I ran swig with and without the patches, diff the generatedsources, run the .pl files and checked that the results are identical. In all those examples I had no error. 11/21/99: Modified the Tcl module to provide full variable linking capabilities to all datatypes. In previous versions, a pair of accessor functions were created for datatypes incompatible with the Tcl_LinkVar() function. Now, we simply use variable traces to support everything. This may break scripts that rely upon the older behavior. *** POTENTIAL INCOMPATIBILITY *** 11/21/99: Added slight tweak to wrapper generator to collect local variables of similar type. Produces somewhat more compact wrapper code. 11/20/99: Modified the Tcl module to use SWIG_GetArgs() to parse arguments. This is a technique borrowed from Python in which arguments are converted using a format string convention similiar to fprintf(). This results in a *substantial* reduction in the size of the resulting wrapper code with only a modest runtime overhead in going through the extra conversion function. 11/13/99: Completely rewrote the class/structure generation code for the Tcl module. Now, a small set of runtime functions are used to implement the functionality for all classes (instead of a massive amount of runtime code being generated for each class). Class specific information is simply encoded in a series of static tables. This results in a *HUGE* reduction in wrapper code size--especially for C++. 11/13/99: Removed the -tcl (Tcl 7.x) module. Tcl 8.0 is now several years old and the defacto standard--no real reason to keep supporting the old version at this point. 11/13/99: Cleaned up -c option for Python module. The pyexp.swg file is now gone. 11/13/99: Fixed external declarations to work better with static linking on Windows. Static linking should now be possible by defining the -DSTATIC_LINK option on the command line. Patch contributed by Alberto Fonseca. 11/5/99 : Fixed an obscure code generation bug related to the generation of default constructors. Bug reported by Brad Clements. 11/5/99 : Fixed a few memory problems found by purify. 11/5/99 : Officially deprecated the -htcl, -htk, and -plugin options from the Tcl and Tcl8 modules. 10/26/99: Removed unused variable from python/typemaps.i. Patch contributed by Keith Davidson. 8/16/99 : Added _WIN32 symbol to libraries to better support Windows. 8/16/99 : Deprecated the Perl4 module. It is no longer included in the distribution and no longer supported. In the entire 3 years SWIG has been around I never received a single comment about it so I'm assuming no one will miss it... 8/16/99 : Modified the type-checking code to register type mappings using a table instead of repeated calls to SWIG_RegisterMapping(). This reduces the size of the module initialization function somewhat. 8/15/99 : Cleaned up the pointer type-checking code in the Tcl module. 8/15/99 : Many changes to the libraries to support runtime libraries. 8/13/99 : Eliminated C++ compiler warning messages about extern "C" linkage. 8/13/99 : Some cleanup of Python .swg files to better support runtime libraries on Windows. 8/13/99 : Modified the %pragma directive to attach pragmas declared inside a class definition to the class itself. For example: class foo { ... %pragma(python) addtomethod = "insert:print `hello world'" ... } Most people don't need to worry about how this works. For people writing backend modules, class-based pragmas work like this: lang->cpp_open_class() // Open a class lang->cpp_pragma() // Supply pragmas ... // Emit members lang->cpp_close_class() // Close the class All of the pragmas are passed first since they might be used to affect the code generation of other members. Please see the Python module for an example. Patches contributed by Robin Dunn. 8/13/99 : Patch to Python shadow classes to eliminate ignored exception errors in destructors. Patch contributed by Robin Dunn. 8/11/99 : Minor patch to swig_lib/python/swigptr.swg (added SWIGSTATIC declaration). Patch contributed by Lyle Johnson. 8/11/99 : Added FIRSTKEY/NEXTKEY methods to Perl5 shadow classes Patch contributed by Dennis Marsa. 8/11/99 : Modified Python module so that NULL pointers are returned and passed as 'None.' Patch contributed by Tal Shalif. 8/10/99 : Fixed missing 'int' specifiers in various places. 8/10/99 : Added Windows makefile for Runtime libraries. Contributed by Bob Techentin. 8/10/99 : Fixed minor problem in Python runtime makefile introduced by keyword arguments. 8/8/99 : Changed $target of perl5(out) typemap from ST(0) to ST(argvi). Patch contributed by Geoffrey Hort. 8/8/99 : Fixed bug in typemap checking related to the ANY keyword in arrays and ignored arguments. Error reported by Geoffrey Hort. 8/8/99 : %enabledoc and %disabledoc directives can now be used inside class/structure definitions. However, no check is made to see if they are balanced (i.e., a %disabledoc directive inside a class does not have to have a matching %enabledoc in the same class). 8/8/99 : Keyword argument handling is now supported in the Python module. For example: int foo(char *bar, int spam, double x); Can be called from Python as foo(x = 3.4, bar="hello", spam=42) To enable this feature, run SWIG with the '-keyword' command line option. Mixing keyword and default arguments should work as well. Unnamed arguments are assigned names such as "arg1", "arg2", etc... *** POTENTIAL INCOMPATIBILITY *** Functions with duplicate argument names such as bar(int *OUTPUT, int *OUTPUT) will likely cause problematic wrapper code to be generated. To fix this, use different names or use %apply to map typemaps to alternate names. 8/8/99 : Handling of the 'this' pointer has been changed in Python shadow classes. Previously, dereferencing of '.this' occurred in the Python shadow class itself. Now, this step occurs in the C wrappers using the following function: SWIG_GetPtrObj(PyObject *, void **ptr, char *type) This function can accept either a string containing a pointer or a shadow class instance with a '.this' attribute of appropriate type. This change allows the following: 1. The real shadow class instance for an object is passed to the C wrappers where it can be examined/modified by typemaps. 2. Handling of default/keyword arguments is now greatly simplified. 3. The Python wrapper code is much more simple. Plus, it eliminated more than 300 lines of C++ code in the Python module. *** CAVEAT : This requires the abstract object interface. It should work with Python 1.4, but probably nothing older than that. 8/8/99 : Fixed handling of "const" and pointers in classes. In particular, declarations such as class foo { ... const char *msg; const int *iptr; } are handled as assignable variables as opposed to constant values (this is the correct behavior in C/C++). Note: declarations such as "char *const msg" are still unsupported. Constants declared at the global level using const are also broken (because I have a number of interfaces that rely upon this behavior). *** POTENTIAL INCOMPATIBILITY *** This may break interfaces that mistakenly treat 'const char *' types as constant values. 8/8/99 : Modified the parser to support bit-fields. For example: typedef struct { unsigned int is_keyword : 1; unsigned int is_extern : 1; unsigned int is_static : 1; } flags; Bit-fields can only be applied to integer types and their are other restrictions. SWIG performs no such type-checking (although the C compiler will catch problems when it tries to compile the wrapper code). 8/8/99 : Removed trailing space of $basetype substitution in typemaps. This is to allow things like this: %typemap(python, argout) spam** OUTPUT{ ... char* a = "$basetype_p"; ... } (Patch suggested by Nathan Dunfield). 6/22/99 : Made a very slight tweak to the Perl5 shadow class code that allows typemaps to alter the return type of objects (to support polymorphic types). Patch contributed by Drake Diedrich. 4/8/99 : Fixed null pointer handling bug in Perl module. Patch contributed by Junio Hamano. 3/17/99 : Fixed bug in perl5ptr.swg for ActiveState Perl. Patch contributed by Greg Anderson. 2/27/99 : Eliminated segmentation fault when Swig runs on empty files. 2/27/99 : Added patch to Guile module to eliminate unused variables. Contributed by Mike Simons. 2/27/99 : Fixed problem with %addmethods returning references. 2/27/99 : Fixed Runtime/Makefile. Patch contributed by Mike Romberg. 2/27/99 : Incorporated patches to the type-checker. 2/27/99 : Fixed problem with -exportall switch and shadow classes in Perl5 module. Patch contributed by Dennis Marsa. 2/27/99 : Modified Perl5 module to recognize 'undef' as a NULL char *. Patch contributed by Junio Hamano. 2/27/99 : Fixed the Perl5 module to support the newer versions of ActiveState Perl for Win32. 2/27/99 : Fixed the include order of files specified with the -I option. 2/5/98- : Dave finishes his dissertation, goes job hunting, moves to 2/5/99 Chicago and generally thrashes about. Version 1.1 Patch 5 (February 5, 1998) ====================================== 2/4/98 : Fixed a bug in the configure script when different package locations are specified (--with-tclincl, etc...). 2/2/98 : Fixed name-clash bug related to the switch to C macros for accessor functions. The new scheme did not work correctly for objects with members such as 'obj', 'val', etc... Fixed the bug by appending the word 'swig' to macro argument names. Patch contributed by Rudy Albachten. 2/2/98 : Slight fix to the Perl5 module to eliminate warning messages about 'varname used only once : possible typo'. Fix contributed by Rudy Albachten. 1/9/98 : Fixed a bug in the Perl 5 module related to the creation of constants and shadow classes. 1/9/98 : Fixed linking bug with Python 1.5 embed.i library file. Version 1.1 Patch 4 (January 4, 1998) ===================================== 1/4/98 : Changed structured of the Examples directory to be more friendly to Borland C++. 1/4/98 : Added the function Makefile.win.bc for compiling the examples under Borland 5.2. 1/4/98 : Slight change to the perl5 module and C++ compilation. The library is now included before any Perl headers because Perl the extern "C" linkage of math.h screws alot of things up (especially on Windows). 1/2/98 : Change to the Python module that reduces the number of constants created by C++ classes, inheritance, and shadow classes. This modification may introduce a few slight incompatibilities if you attempt to use the non-shadow class interface with shadow classes enabled. Patch contributed by Mike Romberg. 1/2/98 : Support for Tcl 8.0 namespaces has been added. This *replaces* the original SWIG mechanism that assumed [incr Tcl] namespaces. To use namespaces, simply run SWIG with the following options swig -tcl -namespace foo.i This places everything in a namespace that matches the module name swig -tcl -namespace -prefix bar foo.i This places everything in the namespace 'bar' The use of namespaces is new in Tcl 8.0. However, the wrapper code generated by SWIG will still work with all versions of Tcl newer than and including Tcl 7.3/Tk3.6 even if the -namespace option is used. *** POTENTIAL INCOMPATIBILITY *** This change may break existing applications that relied on the -prefix and -namespace options. 1/2/98 : Added the following constants to the Tcl wrapper code SWIG_name - Name of the SWIG module SWIG_prefix - Prefix/namespace appended to command names SWIG_namespace - Name of the namespace SWIG library writers can use these to their advantages. 1/2/98 : Fixed a bug in the Tcl8 module related to the creation of pointer constants (the function SWIG_MakePtr was missing from the wrapper code). 1/2/98 : Added the consthash.i library file to the Tcl and Tcl8 modules. 1/1/98 : Changed and cleaned up the Python typemaps.i file. The following significant changes were made : 1. The OUTPUT typemap now returns Python tuples instead of lists. Lists can be returned as before by using the L_OUTPUT type. If compatibility with older versions is needed, run SWIG with the -DOUTPUT_LIST option. 2. The BOTH typemap has been renamed to INOUT. For backwards compatibility, the "BOTH" method still exists however. 3. Output typemaps now generate less code than before. Changes to typemaps.i may break existing Python scripts that assume output in the form of a list. *** POTENTIAL INCOMPATIBILITY *** 12/31/97: Fixed long overdue problems with the testing scripts and certain makefiles that required the use of the bash shell. Everything should work properly with the standard Bourne shell (sh) now. 12/31/97: Modified typemaps to allow $basetype as a valid local variable. This allows for all sorts of bizarre hackish typemaps that do cool things. Patch contributed by Dominique Dumont. 12/31/97: Switched accessor functions generated for member data to C preprocessor macros (except in cases involving typemaps or char *). 12/31/97: Fixed a bug related to C++ member data involving references. 12/31/97: Changed accessor functions for C++ member functions to preprocessor macros. This cleans up the wrapper code and results in fewer function definitions. 12/31/97: Changed the default C constructor to use calloc() instead of malloc() 12/30/97: Changed the creation of constants in the Perl5 module. For all practical purposes, they should work in exactly the same way as before except that they now require much less wrapper code. Modules containing large numbers of constants may see greater than a 50% reduction in wrapper code size. 12/30/97: Modified the Python module to be more intelligent about the creation of constants. SWIG no longer generates redundant global variables and the size of the module initialization function should be reduced. (Many thanks to Jim Fulton). 12/29/97: Fixed a bug in C++ code generation related to member functions, default arguments, and references. 12/29/97: Fixed configure script and a few makefiles to support Python 1.5 12/29/97: Added 'embed15.i' library file. This file should be used to statically link versions of Python 1.5. To make it the default, simply copy 'swig_lib/python/embed15.i' to 'swig_lib/python/embed.i' Version 1.1 Patch 3 (November 24, 1997) ======================================== 11/23/97: Fixed a bug in the Perl5 module with shadow classes and static class functions that return class instances. Note : The fix for this bug requires a slight restructuring of of the .pm files created by SWIG. 11/23/97: Fixed a bug in the Tcl/Tcl8 modules related to variable linking of character arrays. If you declared a global variable 'char foo[10]', the generated wrapper code would either cause a segmentation fault immediately upon loading or weird memory corruption elsewhere. This should now be fixed although character arrays can only be read-only. 11/23/97: Fixed a bug with the %import directive that caused it to fail if files were imported from directories other than the current working directory. 11/23/97: Fixed incorrect diagnostic message in the ASCII documentation module. 11/23/97: Changed the behavior of the -o option when used with shadow classes. If -o was used to specify both the pathname and filename of SWIG's output such as swig -o /home/swig/wrapper.c -shadow -perl5 foo.i The wrapper code would be placed the file specified with -o, but the .pm file and documentation would be placed in the directory where SWIG was run. Now, these files are placed in the same directory as the file specified with the -o option. This change is also needed for proper operation on the Macintosh. 11/23/97: Added a 'this()' method to Perl5 shadow classes. This can be used to return the normal pointer value from a shadow class that is represented as a tied hash. To use just invoke as a method like this : $l = new List; # Create an object $ptr = $l->this(); # Get the normal pointer value *** NEW FEATURE *** 11/23/97: Fixed the Tcl 8 pointer.i library file (which was completely broken in 1.1p2). 11/23/97: Modified the Perl5 type-checker to fix a few problems with global variables of pointer types and to allow tied hashes to be used interchangably with normal pointer values. 11/23/97: Modified the typemap mechanism to allow output typemaps of type 'void'. These were ignored previously, but now if you specify, %typemap(lang,out) void { ... return a void ... } You can change or assign a return value to the function. 11/23/97: Fixed processing of 'bool' datatypes in the Python module. 11/23/97: Fixed minor parsing error with C++ initializers. For example, class B : public A { public: B() : A() { ... }; ... } 11/23/97: Fixed the Tcl8 module so that C functions that call back into Tcl don't corrupt the return result object (SWIG was gathering the result object too early which leads to problems if subsequent Tcl calls are made). 11/23/97: Fixed a code generation bug in the Python module when two or more output parameters were used as the first arguments of a function. For example : %include typemaps.i void foo(double *OUTPUT, double *OUTPUT, double a); Previously, doing this resulted in the creation of an extraneous comma in the output, resulting in a C syntax error. 11/22/97: Fixed a bug when template handling that was stripping whitespace around nested templates. For example : Foo > was getting munged into Foo> which is a syntax error in in the C++ compiler. 11/22/97: Fixed bugs in the Borland C++ makefiles. 11/22/97: Fixed memory corruption bug when processing integer arguments in Tcl8 module. 11/21/97: Fixed a bug in the Runtime/Makefile related to Tcl 8. 11/21/97: Fixed a bug with the %new directive and Perl5 shadow classes. No longer generates a perl syntax error. 11/9/97 : Changed a strncpy() to strcpy() in the pointer type-checker. This results in a substantial performance improvement in type-checking. 10/29/97: Fixed a bug in the code generation of default arguments and user-defined types. For example : void foo(Vector a, Vector b = d); should now work properly. Version 1.1 Patch 2 (September 4, 1997) ======================================= 9/4/97 : Fixed problem with handling of virtual functions that was introduced by some changes in the C++ module. Version 1.1 Patch 1 (August 27, 1997) ===================================== 8/26/97 : Fixed compilation and run-time bugs with Tcl 8.0 final. 8/21/97 : Fixed code generation bug with arrays appearing as arguments to C++ member functions. For example : class Foo { public: void Bar(int a[20][20]); }; There is still a bug using arrays with added methods however. 8/20/97 : Fixed a bug with generating the code for added methods involving pass-by-value. 8/19/97 : Modified the typemapper to substitute the '$arg' value when declaring local variables. For example : %typemap(in) double * (double temp_$arg) { ... do something ... } When applied to a real function such as the following : void foo(double *a, double *b, double *result); three local variables will be created as follows : double temp_a; double temp_b; double temp_result; This can be used when writing multiple typemaps that need to access the same local variables. 7/27/97 : Fixed a variety of problems with the %apply directive and arrays. The following types of declarations should now work : %apply double [ANY] { Real [ANY] }; %apply double [4] { double [10] }; A generic version of apply like this : %apply double { Real }; should now work--even if arrays involving doubles and Reals are used later. 7/27/97 : Changed warning message about "Array X has been converted to Y" to only appear if running SWIG in verbose mode. 7/27/97 : Added the variables $parmname and $basemangle to the typemap generator. $parmname is the name of the parameter used when the typemap was matched. It may be "" if no parameter was used. $basemangle is a mangled version of the base datatype. Sometimes used for array handling. 7/27/97 : Changed the behavior of output arguments with Python shadow classes. Originally, if a function returned an object 'Foo', the shadow class mechanism would create code like this : def return_foo(): val = FooPtr(shadowc.return_foo()) val.this = 1 return val The problem with this is that typemaps allow a user to redefine the output behavior of a function--as a result, we can no longer make any assumptions about the return type being a pointer or even being a single value for that matter (it could be a list, tuple, etc...). If SWIG detects the use of output typemaps (either "out" or "argout") it returns the result unmodified like this : def return_foo(): val = shadowc.return_foo() return val In this case, it is up to the user to figure out what to do with the return value (including the possibility of converting it into a Python class). 7/26/97 : Fixed a parsing problem with types like 'unsigned long int', 'unsigned short int', etc... 7/24/97 : Minor bug fix to Tcl 8 module to parse enums properly. Also fixed a memory corruption problem in the type-checker. (patch contributed by Henry Rowley. 7/24/97 : Added Python-tuple typemaps contributed by Robin Dunn. 7/24/97 : Incorporated some changes to the Python module in support of Mark Hammond's COM support. I'm not entirely sure they work yet however. Needs documentation and testing. 7/24/97 : Fixed code generation bugs when structures had array members and typemaps were used. For example : %typemap(memberin) double [20][20] { ... get a double [20][20] ... } struct Foo { double a[20][20]; } Originally, this would generate a compiler-type error when the wrapper code was compiled. Now, a helper function like this is generated : double *Foo_a_set(Foo *a, double val[20][20]) { ... memberin typemap here ... return (double *) val; } When writing typemaps, one can assume that the source variable is an array of the *same* type as the structure member. This may break some codes that managed to work around the array bug. *** POTENTIAL INCOMPATIBILITY *** 7/13/97 : Fixed bug in Perl5 module when using C global variables that are pointers. When used in function calls and other operations, the value of the pointer would be invalid---causing core dumps and other problems. SWIG implements global variables using Perl magic variables. As it turns out, the error was caused by the fact that the pointer-extraction code was somehow bypassing the procedure used to resolve magical variables (hence, leaving the value undefined). To fix the problem, SWIG now explicitly resolves magic before extracting pointer values. 7/12/97 : Eliminated the last remnants of free() and malloc() from the SWIG compiler. 7/12/97 : Fixed parsing problems with typemaps involving arrays and temporary variables of arrays. Also made it possible for SWIG to handle typemaps like this : %typemap(in) double [ANY] (double temp[$dim0]) { ... store data in temp[$dim0] ... } Not only does this typemap match any double [] array, it creates a local variable with precisely the right dimensions. (ie. $dim0 gets filled in with the real number of dimensions). Of course, off the record, this will be a way to add more functionality to the typemaps.i libraries. 7/9/97 : Fixed some problems with Perl5, static linking, and shadow classes. When statically linking multiple modules together, write a top-level interface file like this when shadow classes are not used : %module swig, foo, bar, glob; %include perlmain.i When shadow classes are used, the module names have an extra 'c' appended so it should read as : %module swig, fooc, barc, globc; %include perlmain.i When linking multiple modules, consider using the SWIG runtime library. 7/8/97 : Incorporated fixed versions of the Borland C++ Makefiles. 7/8/97 : First cut at trying to eliminate excessive compiler warnings. As it turns out, alot of warnings go away if you just make declarations like this clientData = clientData; in the resulting wrapper code. Most compilers should just ignore this code (at least would can hope). 7/8/97 : Fixed bizarre code generation bug with typemaps and C++ classes. In some cases, typemaps containing printf formatting strings such as %typemap(memberout) int * { printf("%d",42); } Would generate completely bogus code with garbage replacing the '%d'. Caused by one faulty use of printf (wasn't able to find any other occurrences). 7/7/97 : Fixed bug in Python shadow class generation with non-member functions that are returning more than one value. 7/7/97 : Incorporated modifications to make SWIG work with Guile 1.2. Still need to test it out, but it is rumored to work. 7/2/97 : Fixed some bugs related to output arguments and Python shadow classes. If an output argument is detected, SWIG assumes that the result is a list and handles it appropriately. If the normal return type of an function is an object, it will be converted into a shadow class as before, but with the assumption that it is the first element of a list. *** NOTE : This behavior has been subsequently changed *** 6/29/97 : Changed EXPORT to SWIGEXPORT in all of the language modules. Should provide better compatibility with Windows. 6/29/97 : Modified Python shadow classes so that output arguments work correctly (when typemaps are used). Version 1.1 (June 24, 1997) =========================== 6/24/97 : Fixed Objective-C constructor bug when working with Perl5 shadow classes. 6/23/97 : Fixed some parsing problems with Objective-C. Declarations such as the following should work now : - foo : (int) a with: (int) b; 6/22/97 : Added SWIG Runtime library. This library contains the SWIG pointer type-checker and support functions that are normally included in every module. By using the library, it is easier to work with multiple SWIG generated modules. 6/22/97 : Fixed minor bug in Perl5 module related to static linking of multiple modules. 6/22/97 : Fixed some bugs with the %import directive. When used with Perl5 shadow classes, this generates a 'require' statement to load in external modules. 6/22/97 : Added -swiglib option. This prints out the location of the SWIG library and exits. This option is only really useful to configuration tools that are looking for SWIG and its library location (e.g. autoconf, configure, etc...). 6/21/97 : Fixed export bug with Perl5.004 on Windows-NT. 6/20/97 : Minor change to code generation of class/structure members in order to work better with typemaps. Should have no noticable impact on existing SWIG modules. 6/19/97 : Added -t option. This allows SWIG to load a typemap file before processing any declarations. For example : swig -t typemaps.i -python example.i At most, only one typemap file can be specified in this manner. *** NEW FEATURE *** 6/18/97 : Need a Makefile fast? Type swig [-tcl, -perl5, -python] -co Makefile and you will get a Makefile specific to that target language. You just need to modify it for your application and you're ready to run. 6/18/97 : Completed the -ci option. This option checks a file into the SWIG library. It should be used in conjunction with a language option. For example : swig -tcl -ci foobar.i Checks the file foobar.i into the Tcl part of the library. In order to check a file into the general library (accessible to all languages modules), do the following swig -ci -o ../foobar.i foobar.i (Admittedly this looks a little strange but is unavoidable). The check-in option is primarily designed for SWIG maintenance and library development. The command will fail if the user does not have write permission to the SWIG library. Third party library extensions can easily install themselves by simply providing a shell script that uses 'swig -ci' to install the appropriate library files. It is not necessary to know where the SWIG library is located if you use this mechanism. *** NEW FEATURE *** 6/16/97 : Fixed a bug in shadow class generation when %name() was applied to a class definition. Unfortunately, fixing the bug required a change in the Language C API by adding an extra argument to the Language::cpp_class_decl() function. This may break SWIG C++ extensions. *** POTENTIAL INCOMPATIBILITY *** 6/15/97 : Added a warning message if no module name is specified with the %module directive or -module option. 6/15/97 : Fixed line number bug when reporting errors for undefined base classes. 6/15/97 : Added new %rename directive. This allows the forward declaration of a renaming. For example : %rename OldName NewName; .... later ... int OldName(int); Unlike %name, %rename will rename any occurrence of the old name. This applies to functions, variables, class members and so forth. There is no way to disable %rename once set, but you can change the name by redeclaring it to something else. *** NEW FEATURE *** 6/15/97 : Improved the implementation of the %name directive so that it could be used with conditional compilation : #ifdef SWIG %name(NewName) #endif int OldName(int); 6/15/97 : Added support for functions with no return datatype. In this case, SWIG assumes a return type of 'int'. 6/11/97 : Improved error reporting in the parser. It should be a little less sensitive to errors that occur inside class definitions now. Also reports errors for function pointers. 6/11/97 : Made '$' a legal symbol in identifiers. This is to support some Objective-C libraries. Some compilers (such as gcc) may also allow identifiers to contain a $ in C/C++ code as well (this is an obscure feature of C). When '$' appears in identifier, SWIG remaps it to the string '_S_' when creating the scripting language function. Thus a function 'foo$bar' would be called 'foo_S_bar'. 6/11/97 : Fixed bug in Python shadow classes with __repr__ method. If supplied by the user, it was ignored, but now it should work. 6/9/97 : Fixed the Tcl 8.0 module to work with Tcl 8.0b1. SWIG is no longer compatible with *any* alpha release of Tcl 8.0. *** POTENTIAL INCOMPATIBILITY *** 6/7/97 : Put a maximal error count in (currently set to 20). SWIG will bail out if it generates more errors than this (useful for preventing SWIG from printing 4000 syntax errors when it gets confused). 6/7/97 : Fixed segmentation fault when parsing variable length arguments. 6/7/97 : Minor change to Perl5 module. C++ static functions are now put in the same package as their class when using shadow classes. 6/7/97 : Centralized the naming of functions, members, wrappers etc... By centralizing the naming scheme, it should be possible to make some multi-file optimizations. Also, it should be possible to change SWIG's naming scheme (perhaps a new feature to be added later). 6/2/97 : Added 'arginit' typemap. This can be used to assign initial values to function arguments. Doing so makes it somewhat easier to detect improper argument passing when working with other typemaps. 6/2/97 : Fixed code generation bug when read-only variables were inherited into other classes. Under inheritance, the variables would become writable, but this has now been corrected. 5/30/97 : An empty %name() directive is no longer allowed or supported. This directive was originally used to strip the prefix off of a class or structure. Unfortunately, this never really seemed to work right and it complicated the C++ code generator significantly. As far as I can tell no one uses it, so it is now history. *** POTENTIAL INCOMPATIBILITY *** 5/28/97 : Fixed a parsing bug with #define and C++ comments. Declarations such as the following now work properly : #define CONST 4 // A Comment 5/28/97 : Made some performance improvements to the SWIG String class. (only affects the SWIG compiler itself). 5/28/97 : Modified the parser to skip template definitions and issue a warning message. 5/28/97 : Preliminary support for parameterized types added (ie. templates). Types such as the following should pass through the SWIG compiler void foo(vector *a, vector *b); When used, the entire name 'vector' becomes the name of the datatype. Due to space limitations in datatype representations, the name should not exceed 96 characters. Note : This is only part of what is needed for template support. Template class definitions are not yet supported by SWIG. The template notation above may also be used when specifying Objective-C protocol lists. *** NEW FEATURE *** 5/24/97 : First cut at Objective-C support added. As it turns out, almost everything can be handled with only a few minor modifications to the C++ module. *** NEW FEATURE *** 5/23/97 : Fixed repeated definition bug in multiple inheritance handling when multiple base classes share a common base class (ie. the evil diamond). 5/21/97 : Fixed rather embarrassing typo that worked its way into the Tests/Build directory. 5/19/97 : Fixed code generation bug when using native methods and shadow classes with Python and Perl5 modules. 5/19/97 : Modified the %apply directive slightly so that it would work with pointers a little better. For example : %apply unsigned long { DWORD }; Applies *all* typemaps associated with "unsigned long" to "DWORD". This now includes pointers to the two datatypes. For example, a typemap applied to "unsigned long **" would also be applied to any occurrence of "DWORD **" as well. 5/19/97 : Fixed an ownership assignment bug in the Perl5 module when class members were returning new objects belonging to different classes. 5/17/97 : Added a few more typemap variables. $name - Name of function/variable/member $basetype - Base datatype (type without pointers) $argnum - Argument number 5/16/97 : Fixed embarrassing underscore error in local variable allocator. 5/16/97 : Fixed namespace clash bug in parameterized typemaps when creating arrays as new local variables. 5/15/97 : Fixed some bugs with inheritance of added methods across multiple files. SWIG now uses names of base classes when generating such functions. 5/14/97 : Finished support for default typemaps. Primarily used internally, they can be used to match the basic built-in datatypes used inside of SWIG. You can specify them in interface files as well like this : %typemap(tcl,in) int SWIG_DEFAULT_TYPE { $target = atoi($target); } Unlike normal typemaps, this default map will get applied to *all* integer datatypes encountered, including those renamed with typedef, etc... 5/13/97 : Fixed substring bug in type checker. 5/12/97 : Fixed bug in parameterized typemaps when declaring local variables of structures. Version 1.1 Beta6 (May 9, 1997) =============================== 5/9/97 : Fixed bizarre NULL pointer handling bug in Perl5 module. 5/8/97 : Fixed mysterious segmentation fault when running SWIG on an empty file. 5/7/97 : The code generator will now replace the special symbol "$cleanup" with the cleanup code specified with the "freearg" typemap. This change needed to properly manage memory and exceptions. 5/5/97 : Added the 'typemaps.i' library file. This contains a variety of common typemaps for input values, pointers, and so on. 5/5/97 : Changed behavior of "argout" typemap in Python module. Old versions automatically turned the result into a Python list. The new version does nothing, leaving the implementation up to the user. This provides more flexibility but may break older codes that rely on typemaps. *** POTENTIAL INCOMPATIBILITY *** 5/5/97 : Fixed bug in Python module related to the interaction of "argout" and "ignore" typemaps. 5/5/97 : Fixed bug in Python module that would generate incorrect code if all function arguments are "ignored". 5/4/97 : Added %apply and %clear directives. These form a higher level interface to the typemap mechanism. In a nutshell, they can be used to change the processing of various datatypes without ever having to write a typemap. See the SWIG documentation for more details. ** NEW FEATURE ** 5/4/97 : Added a local variable extension to the typemap handler. For example : %typemap(tcl,in) double *(double temp) { temp = atof($source); $target = &temp; } In this case, 'temp' is a local variable that exists in the entire wrapper function (not just the typemap code). This mechanism provides better support for certain types of argument handling and also makes it possible to write thread-safe typemaps. Any number local variables can be declared by supplying a comma separated list. Local variables are guaranteed to be unique, even if the same typemap is applied many times in a given function. ** Not currently supported in Perl4 or Guile modules. 5/2/97 : Fixed processing of %ifdef, %endif, %if, etc... (These are SWIG equivalents of the C preprocessor directives that can pass through the C preprocessor without modification). 5/2/97 : Fixed major (but subtle) bug in the run-time type checker related to searching and type-checking for C++ inheritance. To make a long story short, if you had two classes named "Foo" and "FooObject" the type checker would sometimes get confused and be unable to locate "Foo" in an internal table. 5/2/97 : Fixed some bugs in the -co option. 4/24/97 : Pointer library added to the SWIG library. 4/19/97 : Added the %new directive. This is a "hint" that can be used to tell SWIG that a function is returning a new object. For example : %new Foo *create_foo(); This tells SWIG that create_foo() is creating a new object and returning a pointer to it. Many language modules may choose to ignore the hint, but when working with shadow classes, the %new is used to handle proper ownership of objects. %new can also be used with dynamically allocated strings. For example : %new char *create_string(); When used, all of the language modules will automatically cleanup the returned string--eliminating memory leaks. ** NEW FEATURE ** 4/19/97 : Added a new typemap "newfree". This is used in conjunction with the %new directive and can be used to change the method by which a new object returned by a function is deleted. 4/19/97 : The symbol "__cplusplus" is now defined in the SWIG interpreter when running with the -c++ option. 4/17/97 : Added support for static member functions when used inside the %addmethods directive. 4/15/97 : Added a special typemap symbol PREVIOUS that can be used to restore a previous typemap. For example : %typemap(tcl,in) int * = PREVIOUS; This is primarily used in library files. 4/13/97 : Added %pragma directive for Perl5 module. Two new pragmas are available : %pragma(perl5) code = "string" %pragma(perl5) include = "file.pl" Both insert code into the .pm file created by SWIG. This can be used to automatically customize the .pm file created by SWIG. 4/13/97 : Scanner modified to only recognize C++ keywords when the -c++ option has been specified. This provides support for C programs that make use of these keywords for identifiers. SWIG may need to be explicitly run with the -c++ option when compiling C++ code (this was allowed, but not recommended in previous versions). **POTENTIAL INCOMPATIBILITY** 4/11/97 : Fixed a rather nasty bug in the Perl5 module related to using variable linking with complex datatypes and pointers. On Unix, code would work (somehow), but would cause an access violation under Windows-NT. The fix should correct the problem, but there may still be a problem using global variables of complex datatypes in conjunction with shadow classes. Fortunately, this sort of thing seems to be relatively rare (considering that the bug has been around for more than a year - yikes!). 4/11/97 : Fixed bizarre constant evaluation bug in Perl5 code generation when running under Windows-NT. 4/8/97 : Bug when using default arguments and C++ references fixed. 4/8/97 : Fixed code generation bugs in Python and Perl5 modules related to using class renaming (applying the %name directive to a class definition) and shadow classes. 4/7/97 : Fixed minor bugs in swigptr.swg, tcl8ptr.swg, and perl5ptr.swg to prevent infinite loops when weird datatypes are passed. 3/29/97 : 'Makefile.win' added. This is used to build most of the examples in the Examples directory under Windows NT/95. 3/27/97 : Fixes to SWIG's error return codes. SWIG now returns non-zero exit codes for certain kinds of errors (which makes it more friendly to makefiles). An overhaul of the error handling is on the to-do list and will probably show up in a later release. 3/25/97 : Bug fix. "freearg" and "argout" typemaps have been fixed in the Perl5 module. In previous versions, function input parameters and function output parameters shared the same memory space--causing all sorts of nasty problems when trying to pass perl values by reference. SWIG now internally makes a "copy" (which is really just a pointer) of affected parameters and uses that. This is done transparently so there is no noticable impact on any SWIG generated modules. This change is probably only noticable to expert users. 3/25/97 : Added type-check to verbose and stat mode. SWIG will now generate a list of all datatypes that were used but undefined (useful for tracking down weird bugs). This is enabled with the -v option (which is now officially known as "overly verbose" mode) or the -stat option. 3/25/97 : Slight change to the parser to make include guards work correctly. For example : #ifndef INTERFACE_I #define INTERFACE_I %module foobar.i ... declarations ... #endif 3/24/97 : %checkout directive added. This allows an interface file to extract files from the SWIG library and place them in the current directory. This can be used to extract scripts and other helper code that might be associated with library files. For example : %checkout array.tcl Will look for a file "array.tcl" in the library and copy it to the current directory. If the file already exists in the directory, this directive does nothing (it will not overwrite an existing file). This only an experimental feature for now. 3/24/97 : SWIG will now look in the SWIG Library for a file if it can't find it in the current directory. As a result, it is easy to make modules from SWIG library files. For example, if you want to make a Python module from the SWIG timers library, just type this in any directory : swig -python timers.i You will get the files timers_wrap.c and timers_wrap.doc in the current directory that you can now compile. The file remains in the SWIG library (although you can check it out using the -co option). *** New Feature *** 3/24/97 : -co option added to SWIG to allow easy access to the SWIG library. When used, this instructs SWIG to check out a library file and place it in the current directory. For example : unix > swig -co array.i array.i checked out from the SWIG library unix > Once in your directory you can customize the file to suit your particular purposes. The checkout option makes it easy to grab library files without knowing anything about the SWIG installation, but it also makes it possible to start including scripts, C code, and other miscellaneous files in the library. For example, you could put a cool script in the library and check it out whenever you wanted to use it. *** New Feature *** 3/24/97 : #pragma export directives added to Tcl output for compiling shared libraries on the Mac. 3/24/97 : Minor changes to wish.i and tclsh.i library files to provide support for the Macintosh. 3/19/97 : SWIG's policy towards NULL pointers has been relaxed. The policy of requiring a special compiler directive -DALLOW_NULL to use NULL pointers is no longer supported. While this may seem "unsafe", it turns out that you can use a "check" typemap to achieve some safety. For example : %typemap(perl5,check) Node * { if (!$target) croak("NULL Pointers not allowed."); } This prevents any NULL value of a "Node *" pointer to be passed to a function. (I think this is much cleaner than the old -DALLOW_NULL hack anyways). 3/19/97 : Fixed pointer handling errors in Perl5 module. Modules no longer core dump when a Perl reference is inadvertently passed in as a C pointer. 3/18/97 : Added a "check" typemap. This can be used to check the validity of function input values. For example : %typemap(perl5,check) int posint { if ($target < 0) croak("Argument is not a positive integer"); } 3/18/97 : Added an $arg variable to Tcl typemaps. This makes it easier to return argument values by "reference". 3/18/97 : Fixed a code generation bug when using C++ references and the %addmethods directive. 3/18/97 : Fixed a few glitches in the typemap module with respect to chaining. For example : %typemap(tcl,in) int { $in // Inserts prexisting typemap printf("Received a %d\n", $target); } This has been allowed for quite some time, but didn't work if no existing typemap was defined. Now, it still doesn't work if no existing typemap is defined, but it issues a warning message. There is some support using default typemaps, but none of the language modules take advantage of it. This should be considered experimental at this time. Version 1.1b5 Patch 1 (March 16, 1997) ====================================== 3/16/97 : Fixed references bug with C++ code generation. 3/16/97 : Fixed initialization bug in the documentation system that was causing weird problems. 3/16/97 : Fixed fatal bug with -c option in the Python module. 3/13/97 : Fixed bug in the documentation system involving the %text directive and sorting. In the old system, %text entries would float to the top of a section because they were "nameless". Now they are attached to the previous declaration and will stay in the proper location relative to the previous entry. Version 1.1b5 (March 12, 1997) ============================== 3/11/97 : Fixed compilation problems introduced by Tcl/Tk 8.0a2. *** INCOMPATIBILITY *** SWIG no longer works with Tcl/Tk 8.0a1. 3/10/97 : Fixed bug with ignored arguments and C++ member functions in the Python module. 3/9/97 : Parsing bugs with nested class definitions and privately declared nested class definitions fixed. 3/9/97 : Fixed a few minor code generation bugs with C++ classes and constructors. In some cases, the resulting wrapper code would not compile properly. SWIG now attempts to use the default copy constructor instead. 3/8/97 : Added a -l option to SWIG that allows additional SWIG library files to be grabbed without having them specified in the interface file. This makes it easier to keep the interface file clean and move certain options into a Makefile. For example : swig -tcl example.i # Build a normal Tcl extension swig -tcl -lwish.i example.i # Build it as a wish extension # by including the 'wish.i' file. swig -python example.i # Build a dynamically loaded extension swig -python -lembed.i example.i # Build a static extension These kinds of options could previously be accomplished with conditional compilation such as : %module example ... #ifdef STATIC %include embed.i #endif 3/8/97 : Incorporated changes to Guile module to use the new gh interface in FSF Guile 1.0. The older gscm interface used in Cygnus Guile releases is no longer supported by SWIG. 3/8/97 : Cleaned up the Tcl Netscape plugin example. It should work with version 1.1 of the plugin now. 3/8/97 : Added better array support to the typemap module. The keyword ANY can now be used to match any array dimension. For example : %typemap(tcl,in) double [ANY] { ... get an array ... } This will match any single-dimensional double array. The array dimension is passed in the variables $dim0, $dim1, ... $dim9. For example : %typemap(tcl,in) double [ANY][ANY][ANY] { printf("Received a double[%d][%d][%d]\n",$dim0,$dim1,$dim2); } Any typemap involving a specific array dimension will override any specified with the ANY tag. Thus, a %typemap(tcl,in) double [5][4][ANY] {} would override a double [ANY][ANY][ANY]. However, overuse of the ANY tag in arrays of high-dimensions may not work as you expect due to the pattern matching rule used. For example, which of the following typemaps has precedence? %typemap(in) double [ANY][5] {} // Avoid this! %typemap(in) double [5][ANY] {} 3/7/97 : Fixed a number of bugs related to multi-dimensional array handling. Typedefs involving multi-dimensional arrays now works correctly. For example : typedef double MATRIX[4][4]; ... extern double foo(MATRIX a); Typecasting of pointers into multi-dimensional arrays is now implemented properly when making C/C++ function calls. 3/6/97 : Fixed potentially dangerous bug in the Tcl Object-oriented interface. Well, actually, didn't fix it but issued a Tcl error instead. The bug would manifest itself as follows: % set l [List] # Create an object ... % set m [List -this $l] # Make $m into an object assuming $l # contains a pointer. # Since $m == $l, $l gets destroyed # (since its the same command name) % $m insert Foo Segmentation fault # Note : the list no longer exists! Now, an error will be generated instead of redefining the command. As in : % set l [List] ... % set m [List -this $l] Object name already exists! Use catch{} to ignore the error. 3/3/97 : Better support for enums added. Datatypes of 'enum MyEnum' and typedefs such as 'typedef enum MyEnum Foo;' now work. 3/3/97 : Parser modified to ignore constructor initializers such as : class Foo : public Bar { int a,b; public: Foo(int i) : a(0), b(i), Bar(i,0) { }; }; 3/3/97 : Modified parser to ignore C++ exception specifications such as : int foo(double) throw(X,Y); 3/3/97 : Added %import directive. This works exactly like %extern except it tells the language module that the declarations are coming from a separate module. This is usually only needed when working with shadow classes. 3/2/97 : Changed pointer type-checker to be significantly more efficient when working with derived datatypes. This has been accomplished by storing type-mappings in sorted order, using binary search schemes, and caching recently used datatypes. For SWIG generated C++ modules that make a large number of C function calls with derived types, this could result in speedups of between 100 and 50000 percent. However, due to the required sorting operation, module loading time may increased slightly when there are lots of datatypes. 3/2/97 : Fixed some C++ compilation problems with Python embed.i library files. 2/27/97 : Slight change to C++ code generation to use copy constructors when returning complex data type by value. 2/26/97 : Fixed bug in Python module with -c option. 2/26/97 : Slight tweak of parser to allow trailing comma in enumerations such as enum Value (ALE, STOUT, LAGER, }; 2/25/97 : Fixed code generation bug in Tcl module when using the %name() directive on a classname. 2/25/97 : Finished code-size optimization of C++ code generation with inheritance of attributes. Inherited attributes now only generate one set of wrapper functions that are re-used in any derived classes. This could provide big code size improvements in some scripting language interfaces. 2/25/97 : Perl5 module modified to support both the Unix and Windows versions. The windows version has been tested with the Activeware port of Perl 5.003 running under Windows 95. The C source generated by SWIG should compile without modification under both versions of Perl, but is now even more hideous than before. 2/25/97 : Modified parser to allow scope resolution operation to appear in expressions and default arguments as in : void foo(int a = Bar::defvalue); 2/25/97 : Fixed bug when resolving symbols inside C++ classes. For example : class Foo { public: enum Value {ALE, STOUT, LAGER}; ... void defarg(Value v = STOUT); }; 2/24/97 : Fixed bug with member functions returning void *. 2/23/97 : Modified Python module to be better behaved under Windows - Module initialization function is now properly exported. It should not be necessary to explicitly export this function yourself. - Bizarre compilation problems when compiling the SWIG wrapper code as ANSI C under Visual C++ 4.x fixed. - Tested with both the stock Python-1.4 distribution and Pythonwin running under Win95. 2/19/97 : Fixed typedef handling bug in Perl5 shadow classes. 2/19/97 : Added exception support. To use it, do the following : %except(lang) { ... try part of the exception ... $function ... catch part of exception ... } $function is a SWIG variable that will be replaced by the actual C/C++ function call in a wrapper function. Thus, a real exception specification might look like this : %except(perl5) { try { $function } catch (char *& sz) { ... process an exception ... } catch(...) { croak("Unknown exception. Bailing out..."); } } 2/19/97 : Added support for managing generic code fragments (needed for exceptions). 2/19/97 : Fixed some really obscure typemap scoping bugs in the C++ handler. 2/18/97 : Cleaned up perlmain.i file by removing some problematic, but seemingly unnecessary declarations. 2/18/97 : Optimized handling of member functions under inheritance. SWIG can now use wrapper functions generated for a base class instead of regenerating wrappers for the same functions in a derived class. This could make a drastic reduction in wrapper code size for C++ applications with deep inheritance hierarchies and lots of functions. 2/18/97 : Additional methods specified with %addmethods can now be inherited along with normal C++ member functions. 2/18/97 : Minor internal fixes to make SWIG's string handling a little safer. 2/16/97 : Moved some code generation of Tcl shadow classes to library files. 2/16/97 : Fixed documentation error of '-configure' method in Tcl modules. 2/16/97 : Modified Perl5 module slightly to allow typemaps to use Perl references. 2/12/97 : Fixed argument checking bug that was introduced by default arguments (function calls with too many arguments would still be executed). Functions now must have the same number of arguments as C version (with possibility of default/optional arguments still supported). 2/12/97 : Fixed default argument bug in Perl5 module when generating wrapper functions involving default arguments of complex datatypes. 2/12/97 : Fixed typemap scoping problems. For example : %typemap(tcl,in) double { .. get a double .. } class Foo { public: double bar(double); } %typemap(tcl,in) double { .. new get double .. } Would apply the second typemap to all functions in Foo due to delayed generation of C++ wrapper code (clearly this is not the desired effect). Problem has been fixed by assigning unique numerical identifiers to every datatype in an interface file and recording the "range of effect" of each typemap. 2/11/97 : Added support for "ignore" and "default" typemaps. Only use if you absolutely know what you're doing. 2/9/97 : Added automatic creation of constructors and destructors for C structs and C++ classes that do not specify any sort of constructor or destructor. This feature can be enabled by running SWIG with the '-make_default' option or by inserting the following pragma into an interface file : %pragma make_default The following pragma disables automatic constructor generation %pragma no_default 2/9/97 : Added -make_default option for producing default constructors and destructors for classes without them. 2/9/97 : Changed the syntax of the SWIG %pragma directive to %pragma option=value or %pragma(lang) option=value. This change makes the syntax a little more consistent between general pragmas and language-specific pragmas. The old syntax still works, but will probably be phased out (a warning message is currently printed). 2/9/97 : Improved Tcl support of global variables that are of structures, classes, and unions. 2/9/97 : Fixed C++ compilation problem in Python 'embed.i' library file. 2/9/97 : Fixed missing return value in perlmain.i library file. 2/9/97 : Fixed Python shadow classes to return an AttributeError when undefined attributes are accessed (older versions returned a NameError). 2/9/97 : Fixed bug when %addmethods is used after a class definition whose last section is protected or private. 2/8/97 : Made slight changes in include file processing to support the Macintosh. 2/8/97 : Extended swigmain.cxx to provide a rudimentary Macintosh interface. It's a really bad interface, but works until something better is written. 1/29/97 : Fixed type-casting bug introduced by 1.1b4 when setting/getting the value of global variables involving complex data types. 1/29/97 : Removed erroneous white space before an #endif in the code generated by the Python module (was causing errors on DEC Alpha compilers). 1/26/97 : Fixed errors when using default/optional arguments in Python shadow shadow classes. 1/23/97 : Fixed bug with nested %extern declarations. 1/21/97 : Fixed problem with typedef involving const datatypes. 1/21/97 : Somewhat obscure, but serious bug with having multiple levels of typedefs fixed. For example : typedef char *String; typedef String Name; Version 1.1 Beta4 (January 16, 1997) ==================================== Note : SWIG 1.1b3 crashed and burned shortly after take off due to a few major run-time problems that surfaced after release. This release should fix most, if not all, of those problems. 1/16/97 : Fixed major memory management bug on Linux 1/14/97 : Fixed bug in functions returning constant C++ references. 1/14/97 : Modified C++ module to handle datatypes better. 1/14/97 : Modified parser to allow a *single* scope resolution operator in datatypes. Ie : Foo::bar. SWIG doesn't yet handle nested classes, so this should be sufficient for now. 1/14/97 : Modified parser to allow typedef inside a C++ class. 1/14/97 : Fixed some problems related to datatypes defined inside a C++ class. SWIG was not generating correct code, but a new scoping mechanism and method for handling datatypes inside a C++ class have been added. 1/14/97 : Changed enumerations to use the value name instead of any values that might have appeared in the interface file. This makes the code a little more friendly to C++ compilers. 1/14/97 : Removed typedef bug that made all enumerations equivalent to each other in the type checker (since it generated alot of unnecessary code). Version 1.1 Beta3 (January 9, 1997) =================================== Note : A *huge* number of changes related to ongoing modifications. 1. Support for C++ multiple inheritance added. 2. Typemaps added. 3. Some support for nested structure definitions added. 4. Default argument handling added. 5. -c option added for building bare wrapper code modules. 6. Rewrote Pointer type-checking to support multiple inheritance correctly. 7. Tcl 8.0 module added. 8. Perl4 and Guile modules resurrected from the dead (well, they at least work again). 9. New Object Oriented Tcl interface added. 10. Bug fixes to Perl5 shadow classes. 11. Cleaned up many of the internal modules of the parser. 12. Tons of examples and testing modules added. 13. Fixed bugs related to use of "const" return values. 14. Fixed bug with C++ member functions returning void *. 15. Changed SWIG configuration script. Version 1.1 Beta2 (December 3, 1996) ==================================== 1. Completely rewrote the SWIG documentation system. The changes involved are too numerous to mention. Basically, take everything you knew about the old system, throw them out, and read the file Doc/doc.ps. 2. Limited support for #if defined() added. 3. Type casts are now allowed in constant expressions. ie #define A (int) 3 4. Added support for typedef lists. For example : typedef struct { double x,y,z; } Vector, *VectorPtr; 5. New SWIG directives (related to documentation system) %style %localstyle %subsection %subsubsection 6. Reorganized the C++ handling and made it a little easier to work with internally. 7. Fixed problem with inheriting data members in Python shadow classes. 8. Fixed symbol table problems with shadow classes in both Python and Perl. 9. Fixed annoying segmentation fault bug in wrapper code generated for Perl5. 10. Fixed bug with %addmethods directive. Now it can be placed anywhere in a class. 11. More test cases added to the SWIG self-test. Documentation tests are now performed along with other things. 12. Reorganized the SWIG library a little bit and set it up to self-document itself using SWIG. 13. Lots and lots of minor bug fixes (mostly obscure, but bugs nonetheless). Version 1.1 Beta1 (October 30, 1996) ==================================== 1. Added new %extern directive for handling multiple files 2. Perl5 shadow classes added 3. Rewrote conditional compilation to work better 4. Added 'bool' datatype 5. %{,%} block is now optional. 6. Fixed some bugs in the Python shadow class module 7. Rewrote all of the SWIG tests to be more informative (and less scary). 8. Rewrote parameter list handling to be more memory efficient and flexible. 9. Changed parser to ignore 'static' declarations. 10. Initializers are now ignored. For example : struct FooBar a = {3,4,5}; 11. Somewhat better parsing of arrays (although it's usually just a better error message now). 12. Lot's of minor bug fixes. Version 1.0 Final (August 31, 1996) =================================== 1. Fixed minor bug in C++ module 2. Fixed minor bug in pointer type-checker when using -DALLOW_NULL. 3. Fixed configure script to work with Python 1.4beta3 4. Changed configure script to allow compilation without yacc or bison. Version 1.0 Final (August 28, 1996) =================================== 1. Changed parser to support more C/C++ datatypes (well, more variants). Types like "unsigned", "short int", "long int", etc... now work. 2. "unions" added to parser. 3. Use of "typedef" as in : typedef struct { double x,y,z; } Vector; Now works correctly. The name of the typedef is used as the structure name. 4. Conditional compilation with #ifdef, #else, #endif, etc... added. 5. New %disabledoc, %enabledoc directives allow documentation to selectively be disabled for certain parts of a wrapper file. 6. New Python module supports better variable linking, constants, and shadow classes. 7. Perl5 module improved with better compatibility with XS and xsubpp. SWIG pointers and now created so that they are compatible with xsubpp pointers. 8. Support for [incr Tcl] namespaces added to Tcl module. 9. %pragma directive added. 10. %addmethods directive added. 11. %native directive added to allow pre-existing wrapper functions to be used. 12. Wrote configure script for SWIG installation. 13. Function pointers now allowed with typedef statements. 14. %typedef modified to insert a corresponding C typedef into the output file. 15. Fixed some problems related to C++ references. 16. New String and WrapperFunction classes add to make generating wrapper code easier. 17. Fixed command line option processing to eliminate core dumps and to allow help messages. 18. Lot's of minor bug fixes to almost all code modules Version 1.0 Beta 3 (Patch 1) July 17, 1996 ========================================== 1.0 Final is not quite ready yet, but this release fixes a number of immediate problems : 1. Compiler errors when using -strict 1 type checking have been fixed. 2. Pointer type checker now recognizes pointers of the form _0_Type correctly. 3. A few minor fixes were made in the Makefile Version 1.0 Beta 3 (June 14, 1996) ================================== There are lots of changes in this release : 1. SWIG is now invoked using the "swig" command instead of "wrap". Hey, swig sounds cooler. 2. The SWIG_LIB environment variable can be set to change the location where SWIG looks for library files. 3. C++ support has been added. You should use the -c++ option to enable it. 4. The %init directive has been replaced by the %module directive. %module constructs a valid name for the initialization function for whatever target language you're using (actually this makes SWIG files a little cleaner). The old %init directive still works. 5. The syntax of the %name directive has been changed. Use of the old one should generate a warning message, but may still work. 6. To support Tcl/Tk on non-unix platforms, SWIG imports a file called swigtcl.cfg from the $(SWIG_LIB)/tcl directory. I don't have access to an NT machine, but this file is supposedly allows SWIG to produce wrapper code that compiles on both UNIX and non UNIX machines. If this doesn't work, you'll have to edit the file swigtcl.cfg. Please let me know if this doesn't work so I can update the file as necessary. 7. The SWIG run-time typechecker has been improved. You can also now redefine how it works by supplying a file called "swigptr.cfg" in the same directory as your SWIG interface files. By default, SWIG reads this file from $(SWIG_LIB)/config. 8. The documentation system has been changed to support the following : - Documentation order is printed in interface file order by default. This can be overridden by putting an %alpha directive in the beginning of the interface file. - You can supply additional documentation text using %text %{ put your text here %} - A few minor bugs were fixed. 9. A few improvements have been made to the handling of command line options (but it's still not finished). 10. Lots of minor bug fixes in most of the language modules have been made. 11. Filenames have been changed to 8.3 for compatibility with a SWIG port to non-unix platforms (work in progress). 12. C++ file suffix is now .cxx (for same reason). 13. The documentation has been upgraded significantly and is now around 100 pages. I added new examples and a section on C++. The documentation now includes a Table of Contents. 14. The SWIG Examples directory is still woefully sparse, but is getting better. Special notice about C++ ------------------------ This is the first version of SWIG to support C++ parsing. Currently the C++ is far from complete, but seems to work for simple cases. No work has been done to add special C++ processing to any of the target languages. See the user manual for details about how C++ is handled. If you find problems with the C++ implementation, please let me know. Expect major improvements in this area. Note : I have only successfully used SWIG and C++ with Tcl and Python. Notice about Version 1.0Final ----------------------------- Version 1.0B3 is the last Beta release before version 1.0 Final is released. I have frozen the list of features supported in version 1.0 and will only fix bugs as they show up. Work on SWIG version 2.0 is already in progress, but is going to result in rather significant changes to SWIG's internal structure (hopefully for the better). No anticipated date for version 2.0 is set, but if you've got an idea, let me know. Version 1.0 Beta 2 (April 26, 1996) =================================== This release is identical to Beta1 except a few minor bugs are fixed and the SWIG library has been updated to work with Tcl 7.5/Tk 4.1. A tcl7.5 examples directory is now included. - Fixed a bug in the Makefile that didn't install the libraries correctly. - SWIG Library files are now updated to work with Tcl 7.5 and Tk 4.1. - Minor bug fixes in other modules. Version 1.0 Beta 1 (April 10, 1996). ===================================== This is the first "semi-official" release of SWIG. It has a number of substantial improvements over the Alpha release. These notes are in no particular order--hope I remembered everything.... 1. Tcl/Tk SWIG is known to work with Tcl7.3, Tk3.6 and later versions. I've also tested SWIG with expect-5.19. Normally SWIG expects to use the header files "tcl.h" and "tk.h". Newer versions of Tcl/Tk use version numbers. You can specify these in SWIG as follows : % wrap -htcl tcl7.4.h -htk tk4.0.h example.i Of course, I prefer to simply set up symbolic links between "tcl.h" and the most recent stable version on the machine. 2. Perl4 This implementation has been based on Perl-4.035. SWIG's interface to Perl4 is based on the documentation provided in the "Programming Perl" book by Larry Wall, and files located in the "usub" directory of the Perl4 distribution. In order to compile with Perl4, you'll need to link with the uperl.o file found in the Perl4 source directory. You may want to move this file to a more convenient location. 3. Perl5 This is a somewhat experimental implementation, but is alot less buggy than the alpha release. SWIG operates independently of the XS language and xsubpp supplied with Perl5. Currently SWIG produces the necessary C code and .pm file needed to dynamically load a module into Perl5. To support Perl5's notion of modules and packages (as with xsubpp), you can use the following command line options : % wrap -perl5 -module MyModule -package MyPackage example.i Note : In order for dynamic loading to be effective, you need to be careful about naming. For a module named "MyModule", you'll need to create a shared object file called "MyModule.so" using something like % ld -shared my_obj.o -o MyModule.so The use of the %init directive must match the module name since Perl5 calls a function "boot_ModuleName" in order to initialize things. See the Examples directory for some examples of how to get things to work. 4. Python1.3 This is the first release supporting Python. The Python port is experimental and may be rewritten. Variable linkage is done through functions which is sort of a kludge. I also think it would be nice to import SWIG pointers into Python as a new object (instead of strings). Of course, this needs a little more work. 5. Guile3 If you really want to live on the edge, pick up a copy of Guile-iii and play around with this. This is highly experimental---especially since I'm not sure what the official state of Guile is these days. This implementation may change at any time should I suddenly figure out better ways to do things. 6. Extending SWIG SWIG is written in C++ although I tend to think of the code as mostly being ANSI C with a little inheritance thrown in. Each target language is implemented as a C++ class that can be plugged into the system. If you want to add your own modifications, see Appendix C of the user manual. Then take a look at the "user" directory which contains some code for building your own extenions. 7. The SWIG library The SWIG library is still incomplete. Some of the files mentioned in the user manual are unavailable. These files will be made available when they are ready. Subscribe to the SWIG mailing list for announcements and updates. 8. SWIG Documentation I have sometimes experienced problems viewing the SWIG documentation in some postscript viewers. However, the documentation seems to print normally. I'm working on making much of the documentation online, but this takes time. Version 0.1 Alpha (February 9, 1996) ==================================== 1. Run-time type-checking of SWIG pointers. Pointers are now represented as strings with both numeric and encoded type information. This makes it a little harder to shoot yourself in the foot (and it eliminates some segmentation faults and other oddities). 2. Python 1.3 now supported. 3. #define and enum can be used to install constants. 4. Completely rewrote the %include directive and made it alot more powerful. 5. Restructured the SWIG library to make it work better. 6. Various bug fixes to Tcl, Perl4, Perl5, and Guile implementations. 7. Better implementation of %typedef directive. 8. Made some changes to SWIG's class structure to make it easier to expand. SWIG is now built into a library file that you can use to make your own extenions. 9. Made extensive changes to the documentation. 10. Minor changes to the SWIG parser to make it use less memory. Also took out some extraneous rules that were undocumented and didn't work in the first place. 11. The SWIG library files "tclsh", "wish", "expect", etc... in the first release have been restructured and renamed to "tclsh.i", "wish.i", and so on. swig-3.0.12/Examples/0000775000175000017500000000000013042756442014213 5ustar williamwilliamswig-3.0.12/Examples/pike/0000775000175000017500000000000013042756442015143 5ustar williamwilliamswig-3.0.12/Examples/pike/class/0000775000175000017500000000000013042756442016250 5ustar williamwilliamswig-3.0.12/Examples/pike/class/example.i0000664000175000017500000000021513042756442020053 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" swig-3.0.12/Examples/pike/class/example.cxx0000664000175000017500000000065013042756442020430 0ustar williamwilliam/* File : example.cxx */ #include "example.h" #define M_PI 3.14159265358979323846 /* Move the shape to a new location */ void Shape::move(double dx, double dy) { x += dx; y += dy; } int Shape::nshapes = 0; double Circle::area() { return M_PI*radius*radius; } double Circle::perimeter() { return 2*M_PI*radius; } double Square::area() { return width*width; } double Square::perimeter() { return 4*width; } swig-3.0.12/Examples/pike/class/example.h0000664000175000017500000000107613042756442020060 0ustar williamwilliam/* File : example.h */ class Shape { public: Shape() { nshapes++; } virtual ~Shape() { nshapes--; } double x, y; void move(double dx, double dy); virtual double area() = 0; virtual double perimeter() = 0; static int nshapes; }; class Circle : public Shape { private: double radius; public: Circle(double r) : radius(r) { } virtual double area(); virtual double perimeter(); }; class Square : public Shape { private: double width; public: Square(double w) : width(w) { } virtual double area(); virtual double perimeter(); }; swig-3.0.12/Examples/pike/class/Makefile0000664000175000017500000000130213042756442017704 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-3.0.12/Examples/pike/class/runme.pike0000664000175000017500000000250613042756442020253 0ustar williamwilliamimport .example; int main() { // ----- Object creation ----- write("Creating some objects:\n"); Circle c = Circle(10.0); write(" Created circle.\n"); Square s = Square(10.0); write(" Created square.\n"); // ----- Access a static member ----- write("\nA total of " + Shape_nshapes_get() + " shapes were created\n"); // ----- Member data access ----- // Set the location of the object c->x_set(20.0); c->y_set(30.0); s->x_set(-10.0); s->y_set(5.0); write("\nHere is their current position:\n"); write(" Circle = (%f, %f)\n", c->x_get(), c->y_get()); write(" Square = (%f, %f)\n", s->x_get(), s->y_get()); // ----- Call some methods ----- write("\nHere are some properties of the shapes:\n"); write(" The circle:\n"); write(" area = %f.\n", c->area()); write(" perimeter = %f.\n", c->perimeter()); write(" The square:\n"); write(" area = %f.\n", s->area()); write(" perimeter = %f.\n", s->perimeter()); write("\nGuess I'll clean up now\n"); /* See if we can force 's' to be garbage-collected */ s = 0; /* Now we should be down to only 1 shape */ write("%d shapes remain\n", Shape_nshapes_get()); /* Done */ write("Goodbye\n"); return 0; } swig-3.0.12/Examples/pike/enum/0000775000175000017500000000000013042756442016107 5ustar williamwilliamswig-3.0.12/Examples/pike/enum/example.i0000664000175000017500000000021713042756442017714 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" swig-3.0.12/Examples/pike/enum/example.cxx0000664000175000017500000000150713042756442020271 0ustar williamwilliam/* File : example.c */ #include "example.h" #include void Foo::enum_test(speed s) { if (s == IMPULSE) { printf("IMPULSE speed\n"); } else if (s == WARP) { printf("WARP speed\n"); } else if (s == LUDICROUS) { printf("LUDICROUS speed\n"); } else { printf("Unknown speed\n"); } } void enum_test(color c, Foo::speed s) { if (c == RED) { printf("color = RED, "); } else if (c == BLUE) { printf("color = BLUE, "); } else if (c == GREEN) { printf("color = GREEN, "); } else { printf("color = Unknown color!, "); } if (s == Foo::IMPULSE) { printf("speed = IMPULSE speed\n"); } else if (s == Foo::WARP) { printf("speed = WARP speed\n"); } else if (s == Foo::LUDICROUS) { printf("speed = LUDICROUS speed\n"); } else { printf("speed = Unknown speed!\n"); } } swig-3.0.12/Examples/pike/enum/example.h0000664000175000017500000000031513042756442017712 0ustar williamwilliam/* File : example.h */ enum color { RED, BLUE, GREEN }; class Foo { public: Foo() { } enum speed { IMPULSE, WARP, LUDICROUS }; void enum_test(speed s); }; void enum_test(color c, Foo::speed s); swig-3.0.12/Examples/pike/enum/Makefile0000664000175000017500000000130213042756442017543 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-3.0.12/Examples/pike/enum/runme.pike0000664000175000017500000000165613042756442020117 0ustar williamwilliamint main() { write("*** color ***\n"); write(" RED = " + .example.RED + "\n"); write(" BLUE = " + .example.BLUE + "\n"); write(" GREEN = " + .example.GREEN + "\n"); write("\n*** Foo::speed ***\n"); write(" Foo_IMPULSE = " + .example.Foo.IMPULSE + "\n"); write(" Foo_WARP = " + .example.Foo.WARP + "\n"); write(" Foo_LUDICROUS = " + .example.Foo.LUDICROUS + "\n"); write("\nTesting use of enums with functions\n\n"); .example.enum_test(.example.RED, .example.Foo.IMPULSE); .example.enum_test(.example.BLUE, .example.Foo.WARP); .example.enum_test(.example.GREEN, .example.Foo.LUDICROUS); .example.enum_test(1234, 5678); write("\nTesting use of enum with class method\n"); .example.Foo f = .example.Foo(); f->enum_test(.example.Foo.IMPULSE); f->enum_test(.example.Foo.WARP); f->enum_test(.example.Foo.LUDICROUS); return 0; } swig-3.0.12/Examples/pike/enum/README0000664000175000017500000000056113042756442016771 0ustar williamwilliamThis example will not compile with Pike versions 7.4.20 unless you first patch the Pike sources. The problem is for line 91 of Pike's "stralloc.h" (usually installed as /usr/local/pike/7.4.10/include/pike/stralloc.h). That line reads: tmp.ptr=ptr; but should be patched to read: tmp.ptr=(p_wchar0 *) ptr; This bug has been reported to the Pike developers. swig-3.0.12/Examples/pike/template/0000775000175000017500000000000013042756442016756 5ustar williamwilliamswig-3.0.12/Examples/pike/template/example.i0000664000175000017500000000051413042756442020563 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /* Let's just grab the original header file here */ %include "example.h" /* Now instantiate some specific template declarations */ %template(maxint) max; %template(maxdouble) max; %template(vecint) vector; %template(vecdouble) vector; swig-3.0.12/Examples/pike/template/example.h0000664000175000017500000000077713042756442020575 0ustar williamwilliam/* File : example.h */ // Some template definitions template T max(T a, T b) { return a>b ? a : b; } template class vector { T *v; int sz; public: vector(int _sz) { v = new T[_sz]; sz = _sz; } T &get(int index) { return v[index]; } void set(int index, T &val) { v[index] = val; } #ifdef SWIG %extend { T getitem(int index) { return $self->get(index); } void setitem(int index, T val) { $self->set(index,val); } } #endif }; swig-3.0.12/Examples/pike/template/Makefile0000664000175000017500000000135513042756442020422 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = TARGET = example INTERFACE = example.i LIBS = -lm SWIGOPT = check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-3.0.12/Examples/pike/template/runme.pike0000664000175000017500000000134613042756442020762 0ustar williamwilliamint main() { // Call some templated functions write(sprintf("%d\n", .example.maxint(3, 7))); write(sprintf("%f\n", .example.maxdouble(3.14, 2.18))); // Create some objects .example.vecint iv = .example.vecint(100); .example.vecdouble dv = .example.vecdouble(1000); for (int i = 0; i < 100; i++) { iv->setitem(i, 2*i); } for (int i = 0; i < 1000; i++) { dv->setitem(i, 1.0/(i+1)); } int isum = 0; for (int i = 0; i < 100; i++) { isum += iv->getitem(i); } write(sprintf("%d\n", isum)); float fsum = 0.0; for (int i = 0; i < 1000; i++) { fsum += dv->getitem(i); } write(sprintf("%f\n", fsum)); return 0; } swig-3.0.12/Examples/pike/simple/0000775000175000017500000000000013042756442016434 5ustar williamwilliamswig-3.0.12/Examples/pike/simple/example.i0000664000175000017500000000015213042756442020237 0ustar williamwilliam/* File : example.i */ %module example %inline %{ extern int gcd(int x, int y); extern double Foo; %} swig-3.0.12/Examples/pike/simple/Makefile0000664000175000017500000000123313042756442020073 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib SRCS = example.c TARGET = example INTERFACE = example.i check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-3.0.12/Examples/pike/simple/runme.pike0000664000175000017500000000071513042756442020437 0ustar williamwilliamint main() { /* Call our gcd() function */ int x = 42; int y = 105; int g = .example.gcd(x, y); write("The gcd of %d and %d is %d\n", x, y, g); /* Manipulate the Foo global variable */ /* Output its current value */ write("Foo = %f\n", .example->Foo_get()); /* Change its value */ .example->Foo_set(3.1415926); /* See if the change took effect */ write("Foo = %f\n", .example->Foo_get()); return 0; } swig-3.0.12/Examples/pike/simple/example.c0000664000175000017500000000036713042756442020241 0ustar williamwilliam/* File : example.c */ /* A global variable */ double Foo = 3.0; /* Compute the greatest common divisor of positive integers */ int gcd(int x, int y) { int g; g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; } swig-3.0.12/Examples/pike/check.list0000664000175000017500000000011213042756442017107 0ustar williamwilliam# see top-level Makefile.in class constants enum overload simple template swig-3.0.12/Examples/pike/overload/0000775000175000017500000000000013042756442016756 5ustar williamwilliamswig-3.0.12/Examples/pike/overload/example.i0000664000175000017500000000120613042756442020562 0ustar williamwilliam/* File : example.i */ %module example %{ #include "example.h" %} /** * These overloaded declarations conflict with other overloads (as far as * SWIG's Ruby module's implementation for overloaded methods is concerned). * One option is use the %rename directive to rename the conflicting methods; * here, we're just using %ignore to avoid wrapping some of the overloaded * functions altogether. */ %ignore Bar; %ignore Bar::Bar(Bar *); %ignore Bar::Bar(long); %ignore Bar::foo(const Bar&); %ignore Bar::foo(long); %ignore ::foo(const Bar&); %ignore ::foo(int); /* Let's just grab the original header file here */ %include "example.h" swig-3.0.12/Examples/pike/overload/example.cxx0000664000175000017500000000571713042756442021147 0ustar williamwilliam#include #include "example.h" // Overloaded constructors for class Bar Bar::Bar() { std::cout << "Called Bar::Bar()" << std::endl; } Bar::Bar(const Bar&) { std::cout << "Called Bar::Bar(const Bar&)" << std::endl; } Bar::Bar(double x) { std::cout << "Called Bar::Bar(double) with x = " << x << std::endl; } Bar::Bar(double x, char *y) { std::cout << "Called Bar::Bar(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } Bar::Bar(int x, int y) { std::cout << "Called Bar::Bar(int, int) with x, y = " << x << ", " << y << std::endl; } Bar::Bar(char *x) { std::cout << "Called Bar::Bar(char *) with x = \"" << x << "\"" << std::endl; } Bar::Bar(int x) { std::cout << "Called Bar::Bar(int) with x = " << x << std::endl; } Bar::Bar(long x) { std::cout << "Called Bar::Bar(long) with x = " << x << std::endl; } Bar::Bar(Bar *x) { std::cout << "Called Bar::Bar(Bar *) with x = " << x << std::endl; } // Overloaded member functions void Bar::foo(const Bar& x) { std::cout << "Called Bar::foo(const Bar&) with &x = " << &x << std::endl; } void Bar::foo(double x) { std::cout << "Called Bar::foo(double) with x = " << x << std::endl; } void Bar::foo(double x, char *y) { std::cout << "Called Bar::foo(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } void Bar::foo(int x, int y) { std::cout << "Called Bar::foo(int, int) with x, y = " << x << ", " << y << std::endl; } void Bar::foo(char *x) { std::cout << "Called Bar::foo(char *) with x = \"" << x << "\"" << std::endl; } void Bar::foo(int x) { std::cout << "Called Bar::foo(int) with x = " << x << std::endl; } void Bar::foo(long x) { std::cout << "Called Bar::foo(long) with x = " << x << std::endl; } void Bar::foo(Bar *x) { std::cout << "Called Bar::foo(Bar *) with x = " << x << std::endl; } void Bar::spam(int x, int y, int z) { std::cout << "Called Bar::spam(int, int, int) with x, y, z = " << x << ", " << y << ", " << z << std::endl; } void Bar::spam(double x, int y, int z) { std::cout << "Called Bar::spam(double, int, int) with x, y, z = " << x << ", " << y << ", " << z << std::endl; } // Overloaded global methods void foo(const Bar& x) { std::cout << "Called foo(const Bar& x) with &x = " << &x << std::endl; } void foo(double x) { std::cout << "Called foo(double) with x = " << x << std::endl; } void foo(double x, char *y) { std::cout << "Called foo(double, char *) with x, y = " << x << ", \"" << y << "\"" << std::endl; } void foo(int x, int y) { std::cout << "Called foo(int, int) with x, y = " << x << ", " << y << std::endl; } void foo(char *x) { std::cout << "Called foo(char *) with x = \"" << x << "\"" << std::endl; } void foo(int x) { std::cout << "Called foo(int) with x = " << x << std::endl; } void foo(long x) { std::cout << "Called foo(long) with x = " << x << std::endl; } void foo(Bar *x) { std::cout << "Called foo(Bar *) with x = " << x << std::endl; } swig-3.0.12/Examples/pike/overload/example.h0000664000175000017500000000132513042756442020563 0ustar williamwilliam#ifndef EXAMPLE_H #define EXAMPLE_H class Bar { public: Bar(); Bar(const Bar&); Bar(double); Bar(double, char *); Bar(int, int); Bar(char *); Bar(long); Bar(int); Bar(Bar *); void foo(const Bar&); void foo(double); void foo(double, char *); void foo(int, int); void foo(char *); void foo(long); void foo(int); void foo(Bar *); void spam(int x, int y=2, int z=3); void spam(double x, int y=2, int z=3); }; void foo(const Bar&); void foo(double); void foo(double, char *); void foo(int, int); void foo(char *); void foo(int); void foo(long); void foo(Bar *); void spam(int x, int y=2, int z=3); void spam(double x, int y=2, int z=3); #endif swig-3.0.12/Examples/pike/overload/Makefile0000664000175000017500000000131313042756442020414 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib CXXSRCS = example.cxx TARGET = example INTERFACE = example.i LIBS = -lstdc++ -lm check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike_cpp static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_cpp_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-3.0.12/Examples/pike/overload/runme.pike0000664000175000017500000000314513042756442020761 0ustar williamwilliam// import .example; int main() { // This should invoke foo(double) .example.foo(3.14159); // This should invoke foo(double, char *) .example.foo(3.14159, "Pi"); // This should invoke foo(int, int) .example.foo(3, 4); // This should invoke foo(char *) .example.foo("This is a test"); // This should invoke foo(long) .example.foo(42); /* // This should invoke Bar::Bar() followed by foo(Bar *) foo(Bar.new); // Skip a line write("\n"); // This should invoke Bar::Bar(double) Bar.new(3.14159); // This should invoke Bar::Bar(double, char *) Bar.new(3.14159, "Pi"); // This should invoke Bar::Bar(int, int) Bar.new(3, 4); // This should invoke Bar::Bar(char *) Bar.new("This is a test"); // This should invoke Bar::Bar(int) Bar.new(42); // This should invoke Bar::Bar() for the input argument, // followed by Bar::Bar(const Bar&). Bar.new(Bar.new); // Skip a line write("\n"); */ // Construct a new Bar instance (invokes Bar::Bar()) /* bar = Bar.new; // This should invoke Bar::foo(double) bar.foo(3.14159); // This should invoke Bar::foo(double, char *) bar.foo(3.14159, "Pi"); // This should invoke Bar::foo(int, int) bar.foo(3, 4); // This should invoke Bar::foo(char *) bar.foo("This is a test"); // This should invoke Bar::foo(int) bar.foo(42); // This should invoke Bar::Bar() to construct the input // argument, followed by Bar::foo(Bar *). bar.foo(Example::Bar.new); // This should invoke Bar::spam(int x, int y, int z) bar.spam(1); // This should invoke Bar::spam(double x, int y, int z) bar.spam(3.14159); */ write("Goodbye\n"); return 0; } swig-3.0.12/Examples/pike/constants/0000775000175000017500000000000013042756442017157 5ustar williamwilliamswig-3.0.12/Examples/pike/constants/example.i0000664000175000017500000000113513042756442020764 0ustar williamwilliam/* File : example.i */ %module example /* A few preprocessor macros */ #define ICONST 42 #define FCONST 2.1828 #define CCONST 'x' #define CCONST2 '\n' #define SCONST "Hello World" #define SCONST2 "\"Hello World\"" /* This should work just fine */ #define EXPR ICONST + 3*(FCONST) /* This shouldn't do anything */ #define EXTERN extern /* Neither should this (BAR isn't defined) */ #define FOO (ICONST + BAR) /* The following directives also produce constants */ %constant int iconst = 37; %constant double fconst = 3.14; swig-3.0.12/Examples/pike/constants/Makefile0000664000175000017500000000122113042756442020613 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib SRCS = TARGET = example INTERFACE = example.i check: build $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_run build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' pike static: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' SRCS='$(SRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ TARGET='mypike' INTERFACE='$(INTERFACE)' pike_static clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' pike_clean swig-3.0.12/Examples/pike/constants/runme.pike0000664000175000017500000000156613042756442021167 0ustar williamwilliamint main() { write("ICONST = %d (should be 42)\n", .example.ICONST); write("FCONST = %f (should be 2.1828)\n", .example.FCONST); write("CCONST = %c (should be 'x')\n", .example.CCONST); write("CCONST2 = %c (this should be on a new line)\n", .example.CCONST2); write("SCONST = %s (should be 'Hello World')\n", .example.SCONST); write("SCONST2 = %s (should be '\"Hello World\"')\n", .example.SCONST2); write("EXPR = %f (should be 48.5484)\n", .example.EXPR); write("iconst = %d (should be 37)\n", .example.iconst); write("fconst = %f (should be 3.14)\n", .example.fconst); if (search(indices(.example), "EXTERN") == -1) write("EXTERN isn't defined (good)\n"); else write("EXTERN is defined (bad)\n"); if (search(indices(.example), "FOO") == -1) write("FOO isn't defined (good)\n"); else write("FOO is defined (bad)\n"); return 0; } swig-3.0.12/Examples/index.html0000664000175000017500000000271213042756442016212 0ustar williamwilliam SWIG Examples

    SWIG Examples

    Welcome to the browsable SWIG Examples directory. This directory contains a collection of examples that illustrate various SWIG features for a variety of target languages. First, it is important to cover a few preliminaries:

    • All of the examples depend on the file Examples/Makefile found within the SWIG distribution. This file is created by 'configure' and usually requires no modifications. However, if you have an usual installation of packages or experience compilation problems, you may need to make a few modifications.

    • The examples directory is a work in progress and will probably remain somewhat incomplete. At this time, the Examples directory is somewhat sparse since it is being rewritten and reoganized.

    • The SWIG user manual also contains a large variety of examples.

    Fundamentals

    Follow one of these links to see some simple examples for a specific target language:
    If your target platform is Windows, make sure you also see the Windows page in the main manual. swig-3.0.12/Examples/android/0000775000175000017500000000000013042756442015633 5ustar williamwilliamswig-3.0.12/Examples/android/class/0000775000175000017500000000000013042756442016740 5ustar williamwilliamswig-3.0.12/Examples/android/class/local.properties0000664000175000017500000000066313042756442022155 0ustar williamwilliam# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must *NOT* be checked in Version Control Systems, # as it contains information specific to your local configuration. # location of the SDK. This is only used by Ant # For customization when using a Version Control System, please read the # header note. sdk.dir=/home/william/android/android-sdk-linux_x86 swig-3.0.12/Examples/android/class/proguard.cfg0000664000175000017500000000234013042756442021243 0ustar williamwilliam-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } swig-3.0.12/Examples/android/class/Makefile0000664000175000017500000000206613042756442020404 0ustar williamwilliamTOP = ../.. SWIGEXE = $(TOP)/../swig SWIG_LIB_DIR = $(TOP)/../$(TOP_BUILDDIR_TO_TOP_SRCDIR)Lib TARGET = example INTERFACE = example.i INTERFACEDIR = jni/ PACKAGEDIR = $(SRCDIR)src/org/swig PACKAGENAME= org.swig.classexample SWIGOPT = -package $(PACKAGENAME) -outdir $(PACKAGEDIR)/classexample PROJECTNAME= SwigClass TARGETID = 1 #INSTALLOPTIONS = -s # To install on SD Card check: build build: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' CXXSRCS='$(CXXSRCS)' \ SWIG_LIB_DIR='$(SWIG_LIB_DIR)' SWIGEXE='$(SWIGEXE)' \ SWIGOPT='$(SWIGOPT)' TARGET='$(TARGET)' INTERFACE='$(INTERFACE)' INTERFACEDIR='$(INTERFACEDIR)' \ PROJECTNAME='$(PROJECTNAME)' TARGETID='$(TARGETID)' android_cpp install: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' INSTALLOPTIONS='$(INSTALLOPTIONS)' PROJECTNAME='$(PROJECTNAME)' \ PACKAGEDIR='$(PACKAGEDIR)' PACKAGENAME='$(PACKAGENAME)' android_install clean: $(MAKE) -f $(TOP)/Makefile SRCDIR='$(SRCDIR)' TARGET='$(TARGET)' PROJECTNAME='$(PROJECTNAME)' \ PACKAGEDIR='$(PACKAGEDIR)' INTERFACEDIR='$(INTERFACEDIR)' android_clean swig-3.0.12/Examples/android/class/ant.properties0000664000175000017500000000127013042756442021640 0ustar williamwilliam# This file is used to override default values used by the Ant build system. # # This file must be checked in Version Control Systems, as it is # integral to the build system of your project. # This file is only used by the Ant script. # You can use this to override default values such as # 'source.dir' for the location of your java source folder and # 'out.dir' for the location of your output folder. # You can also use it define how the release builds are signed by declaring # the following properties: # 'key.store' for the location of your keystore and # 'key.alias' for the name of the key to use. # The password will be asked during the build when you use the 'release' target. swig-3.0.12/Examples/android/class/src/0000775000175000017500000000000013042756442017527 5ustar williamwilliamswig-3.0.12/Examples/android/class/src/org/0000775000175000017500000000000013042756442020316 5ustar williamwilliamswig-3.0.12/Examples/android/class/src/org/swig/0000775000175000017500000000000013042756442021267 5ustar williamwilliamswig-3.0.12/Examples/android/class/src/org/swig/classexample/0000775000175000017500000000000013042756442023750 5ustar williamwilliamswig-3.0.12/Examples/android/class/src/org/swig/classexample/SwigClass.java0000664000175000017500000000616713042756442026524 0ustar williamwilliampackage org.swig.classexample; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.ScrollView; import android.text.method.ScrollingMovementMethod; public class SwigClass extends Activity { TextView outputText = null; ScrollView scroller = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); outputText = (TextView)findViewById(R.id.OutputText); outputText.setText("Press 'Run' to start...\n"); outputText.setMovementMethod(new ScrollingMovementMethod()); scroller = (ScrollView)findViewById(R.id.Scroller); } public void onRunButtonClick(View view) { outputText.append("Started...\n"); nativeCall(); outputText.append("Finished!\n"); // Ensure scroll to end of text scroller.post(new Runnable() { public void run() { scroller.fullScroll(ScrollView.FOCUS_DOWN); } }); } /** Calls into C/C++ code */ public void nativeCall() { // ----- Object creation ----- outputText.append( "Creating some objects:\n" ); Circle c = new Circle(10); outputText.append( " Created circle " + c + "\n"); Square s = new Square(10); outputText.append( " Created square " + s + "\n"); // ----- Access a static member ----- outputText.append( "\nA total of " + Shape.getNshapes() + " shapes were created\n" ); // ----- Member data access ----- // Notice how we can do this using functions specific to // the 'Circle' class. c.setX(20); c.setY(30); // Now use the same functions in the base class Shape shape = s; shape.setX(-10); shape.setY(5); outputText.append( "\nHere is their current position:\n" ); outputText.append( " Circle = (" + c.getX() + " " + c.getY() + ")\n" ); outputText.append( " Square = (" + s.getX() + " " + s.getY() + ")\n" ); // ----- Call some methods ----- outputText.append( "\nHere are some properties of the shapes:\n" ); Shape[] shapes = {c,s}; for (int i=0; i swig-3.0.12/Examples/android/class/res/0000775000175000017500000000000013042756442017531 5ustar williamwilliamswig-3.0.12/Examples/android/class/res/values/0000775000175000017500000000000013042756442021030 5ustar williamwilliamswig-3.0.12/Examples/android/class/res/values/strings.xml0000664000175000017500000000015713042756442023246 0ustar williamwilliam SwigClass swig-3.0.12/Examples/android/class/res/layout/0000775000175000017500000000000013042756442021046 5ustar williamwilliamswig-3.0.12/Examples/android/class/res/layout/main.xml0000664000175000017500000000132213042756442022512 0ustar williamwilliam